diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile deleted file mode 100644 index 3e8e7ecbfbcbdd..00000000000000 --- a/.devcontainer/Dockerfile +++ /dev/null @@ -1 +0,0 @@ -FROM nodejs/devcontainer:nightly diff --git a/.devcontainer/.devcontainer.json b/.devcontainer/devcontainer.json similarity index 57% rename from .devcontainer/.devcontainer.json rename to .devcontainer/devcontainer.json index 2e3cde606ce422..a69b66f442b666 100644 --- a/.devcontainer/.devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,12 +1,12 @@ { "name": "Node.js Core Developer Environment", "extensions": [ - "github.vscode-pull-request-github", - "ms-vsliveshare.vsliveshare", - "vscode-icons-team.vscode-icons", - "visualstudioexptteam.vscodeintellicode" + "github.vscode-pull-request-github", + "ms-vsliveshare.vsliveshare", + "vscode-icons-team.vscode-icons", + "visualstudioexptteam.vscodeintellicode" ], - "dockerFile": "Dockerfile", + "image": "nodejs/devcontainer:nightly", "initializeCommand": "docker system prune -f -a", "settings": { "terminal.integrated.profiles.linux": { diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 3e7c3f62aa752f..a00875881ab59c 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -17,6 +17,7 @@ /CONTRIBUTING.md @nodejs/tsc /doc/contributing/*.md @nodejs/tsc /GOVERNANCE.md @nodejs/tsc +/SECURITY.md @nodejs/tsc /LICENSE @nodejs/tsc /onboarding.md @nodejs/tsc @@ -59,6 +60,8 @@ # tls/crypto +/doc/api/crypto.md @nodejs/crypto +/doc/api/webcrypto.md @nodejs/crypto /lib/crypto.js @nodejs/crypto /lib/internal/crypto/* @nodejs/crypto /lib/internal/tls/* @nodejs/crypto @nodejs/net @@ -172,3 +175,9 @@ /.github/workflows/update-openssl.yml @nodejs/security-wg /.github/workflows/update-v8.yml @nodejs/security-wg @nodejs/v8-update /tools/dep_updaters/* @nodejs/security-wg + +# Web Standards +/lib/internal/bootstrap/web/* @nodejs/web-standards +/lib/internal/navigator.js @nodejs/web-standards +/test/fixtures/wpt/ @nodejs/web-standards +/test/wpt/ @nodejs/web-standards diff --git a/.github/ISSUE_TEMPLATE/1-bug-report.yml b/.github/ISSUE_TEMPLATE/1-bug-report.yml index 496d06d3ad70b8..72292b65430d7a 100644 --- a/.github/ISSUE_TEMPLATE/1-bug-report.yml +++ b/.github/ISSUE_TEMPLATE/1-bug-report.yml @@ -27,7 +27,11 @@ body: - type: textarea attributes: label: What steps will reproduce the bug? - description: Enter details about your bug, preferably a simple code snippet that can be run using `node` directly without installing third-party dependencies. + description: > + Enter details about your bug, preferably a simple code snippet that can + be run using `node` directly without installing third-party dependencies + or downloading code from the internet (i.e. no ZIP archive, no GitHub + repository, etc.). - type: textarea attributes: label: How often does it reproduce? Is there a required condition? diff --git a/.github/workflows/auto-start-ci.yml b/.github/workflows/auto-start-ci.yml index 262c39dc4d3525..c1a9ac0ad0573b 100644 --- a/.github/workflows/auto-start-ci.yml +++ b/.github/workflows/auto-start-ci.yml @@ -46,12 +46,12 @@ jobs: if: needs.get-prs-for-ci.outputs.numbers != '' runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Install Node.js - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 + uses: actions/setup-node@8f152de45cc393bb48ce5d89d36b731f54556e65 # v4.0.0 with: node-version: ${{ env.NODE_VERSION }} diff --git a/.github/workflows/build-tarball.yml b/.github/workflows/build-tarball.yml index 56236ced367c19..c1c66477ae666d 100644 --- a/.github/workflows/build-tarball.yml +++ b/.github/workflows/build-tarball.yml @@ -39,11 +39,11 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information @@ -57,7 +57,7 @@ jobs: mkdir tarballs mv *.tar.gz tarballs - name: Upload tarball artifact - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + uses: actions/upload-artifact@c7d193f32edcb7bfad88892161225aeda64e9392 # v4.0.0 with: name: tarballs path: tarballs @@ -65,17 +65,17 @@ jobs: needs: build-tarball runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information run: npx envinfo - name: Download tarball - uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 + uses: actions/download-artifact@f44cd7b40bfd40b6aa1cc1b9b5b7bf03d3c67110 # v4.1.0 with: name: tarballs path: tarballs diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 3c7012017df7d9..32dd31fbaf219a 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -38,11 +38,11 @@ jobs: fail-fast: false runs-on: ${{ matrix.windows }} steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 with: python-version: ${{ env.PYTHON_VERSION }} - name: Install deps diff --git a/.github/workflows/comment-labeled.yml b/.github/workflows/comment-labeled.yml index 228875e0cba30a..7e3a19c6afd13c 100644 --- a/.github/workflows/comment-labeled.yml +++ b/.github/workflows/comment-labeled.yml @@ -13,7 +13,7 @@ env: NOTABLE_CHANGE_MESSAGE: | The https://github.com/nodejs/node/labels/notable-change label has been added by @${{ github.actor }}. - Please suggest a text for the release notes if you'd like to include a more detailed summary, then proceed to update the PR description with the text or a link to the notable change suggested text comment. + Please suggest a text for the release notes if you'd like to include a more detailed summary, then proceed to update the PR description with the text or a link to the notable change suggested text comment. Otherwise, the commit will be placed in the _Other Notable Changes_ section. permissions: contents: read diff --git a/.github/workflows/commit-lint.yml b/.github/workflows/commit-lint.yml index 444725e9fe3d53..f5d59079aabf11 100644 --- a/.github/workflows/commit-lint.yml +++ b/.github/workflows/commit-lint.yml @@ -17,13 +17,13 @@ jobs: run: | echo "plusOne=$((${{ github.event.pull_request.commits }} + 1))" >> $GITHUB_OUTPUT echo "minusOne=$((${{ github.event.pull_request.commits }} - 1))" >> $GITHUB_OUTPUT - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: fetch-depth: ${{ steps.nb-of-commits.outputs.plusOne }} persist-credentials: false - run: git reset HEAD^2 - name: Install Node.js - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 + uses: actions/setup-node@8f152de45cc393bb48ce5d89d36b731f54556e65 # v4.0.0 with: node-version: ${{ env.NODE_VERSION }} - name: Validate commit message diff --git a/.github/workflows/commit-queue.yml b/.github/workflows/commit-queue.yml index e5f73519f16a99..cd5bbb83007aae 100644 --- a/.github/workflows/commit-queue.yml +++ b/.github/workflows/commit-queue.yml @@ -58,7 +58,7 @@ jobs: if: needs.get_mergeable_prs.outputs.numbers != '' runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: # Needs the whole git history for ncu to work # See https://github.com/nodejs/node-core-utils/pull/486 @@ -71,7 +71,7 @@ jobs: # Install dependencies - name: Install Node.js - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 + uses: actions/setup-node@8f152de45cc393bb48ce5d89d36b731f54556e65 # v4.0.0 with: node-version: ${{ env.NODE_VERSION }} - name: Install @node-core/utils diff --git a/.github/workflows/coverage-linux-without-intl.yml b/.github/workflows/coverage-linux-without-intl.yml index 7cb41bbb3f6fbe..f54433408bfd29 100644 --- a/.github/workflows/coverage-linux-without-intl.yml +++ b/.github/workflows/coverage-linux-without-intl.yml @@ -3,23 +3,27 @@ name: Coverage Linux (without intl) on: pull_request: types: [opened, synchronize, reopened, ready_for_review] - paths-ignore: - - '**.md' - - benchmark/** - - deps/** - - doc/** - - .github/** - - '!.github/workflows/coverage-linux-without-intl.yml' + paths: + - lib/**/*.js + - Makefile + - src/**/*.cc + - src/**/*.h + - test/** + - tools/gyp/** + - tools/test.py + - .github/workflows/coverage-linux-without-intl.yml push: branches: - main - paths-ignore: - - '**.md' - - benchmark/** - - deps/** - - doc/** - - .github/** - - '!.github/workflows/coverage-linux-without-intl.yml' + paths: + - lib/**/*.js + - Makefile + - src/**/*.cc + - src/**/*.h + - test/** + - tools/gyp/** + - tools/test.py + - .github/workflows/coverage-linux-without-intl.yml concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} @@ -37,11 +41,11 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information diff --git a/.github/workflows/coverage-linux.yml b/.github/workflows/coverage-linux.yml index 12ce0ccc262ade..9d1c1b25ad6792 100644 --- a/.github/workflows/coverage-linux.yml +++ b/.github/workflows/coverage-linux.yml @@ -3,23 +3,27 @@ name: Coverage Linux on: pull_request: types: [opened, synchronize, reopened, ready_for_review] - paths-ignore: - - '**.md' - - benchmark/** - - deps/* - - doc/** - - .github/** - - '!.github/workflows/coverage-linux.yml' + paths: + - lib/**/*.js + - Makefile + - src/**/*.cc + - src/**/*.h + - test/** + - tools/gyp/** + - tools/test.py + - .github/workflows/coverage-linux.yml push: branches: - main - paths-ignore: - - '**.md' - - benchmark/** - - deps/** - - doc/** - - .github/** - - '!.github/workflows/coverage-linux.yml' + paths: + - lib/**/*.js + - Makefile + - src/**/*.cc + - src/**/*.h + - test/** + - tools/gyp/** + - tools/test.py + - .github/workflows/coverage-linux.yml concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} @@ -37,11 +41,11 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information diff --git a/.github/workflows/coverage-windows.yml b/.github/workflows/coverage-windows.yml index 164e30ab035d7a..e837fa04a30e5f 100644 --- a/.github/workflows/coverage-windows.yml +++ b/.github/workflows/coverage-windows.yml @@ -3,25 +3,27 @@ name: Coverage Windows on: pull_request: types: [opened, synchronize, reopened, ready_for_review] - paths-ignore: - - '**.md' - - benchmark/** - - deps/** - - doc/** - - tools/** - - .github/** - - '!.github/workflows/coverage-windows.yml' + paths: + - lib/**/*.js + - Makefile + - src/**/*.cc + - src/**/*.h + - test/** + - tools/gyp/** + - tools/test.py + - .github/workflows/coverage-windows.yml push: branches: - main - paths-ignore: - - '**.md' - - benchmark/** - - deps/** - - doc/** - - tools/** - - .github/** - - '!.github/workflows/coverage-windows.yml' + paths: + - lib/**/*.js + - Makefile + - src/**/*.cc + - src/**/*.h + - test/** + - tools/gyp/** + - tools/test.py + - .github/workflows/coverage-windows.yml concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} @@ -39,11 +41,11 @@ jobs: if: github.event.pull_request.draft == false runs-on: windows-2022 steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 with: python-version: ${{ env.PYTHON_VERSION }} - name: Install deps diff --git a/.github/workflows/daily-wpt-fyi.yml b/.github/workflows/daily-wpt-fyi.yml index 0fa94da4b015fb..a37015a2fa00dc 100644 --- a/.github/workflows/daily-wpt-fyi.yml +++ b/.github/workflows/daily-wpt-fyi.yml @@ -33,7 +33,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information @@ -45,7 +45,7 @@ jobs: run: echo "NIGHTLY=$(curl -s https://nodejs.org/download/nightly/index.json | jq -r '[.[] | select(.files[] | contains("linux-x64"))][0].version')" >> $GITHUB_ENV - name: Install Node.js id: setup-node - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 + uses: actions/setup-node@8f152de45cc393bb48ce5d89d36b731f54556e65 # v4.0.0 with: node-version: ${{ env.NIGHTLY || matrix.node-version }} check-latest: true @@ -57,7 +57,7 @@ jobs: SHORT_SHA=$(node -p 'process.version.split(/-nightly\d{8}/)[1]') echo "NIGHTLY_REF=$(gh api /repos/nodejs/node/commits/$SHORT_SHA --jq '.sha')" >> $GITHUB_ENV - name: Checkout ${{ steps.setup-node.outputs.node-version }} - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false ref: ${{ env.NIGHTLY_REF || steps.setup-node.outputs.node-version }} @@ -73,7 +73,7 @@ jobs: run: rm -rf wpt working-directory: test/fixtures - name: Checkout epochs/daily WPT - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: repository: web-platform-tests/wpt persist-credentials: false @@ -98,7 +98,7 @@ jobs: run: rm -rf deps/undici - name: Checkout undici if: ${{ env.WPT_REPORT != '' }} - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: repository: nodejs/undici persist-credentials: false @@ -121,10 +121,10 @@ jobs: run: cp wptreport.json wptreport-${{ steps.setup-node.outputs.node-version }}.json - name: Upload GitHub Actions artifact if: ${{ env.WPT_REPORT != '' }} - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + uses: actions/upload-artifact@c7d193f32edcb7bfad88892161225aeda64e9392 # v4.0.0 with: path: out/wpt/wptreport-*.json - name: WPT Reports + name: WPT Report for ${{ steps.setup-node.outputs.node-version }} if-no-files-found: error - name: Upload WPT Report to wpt.fyi API if: ${{ env.WPT_REPORT != '' }} diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml index df11560e737837..aff2f1ccb678e6 100644 --- a/.github/workflows/daily.yml +++ b/.github/workflows/daily.yml @@ -17,11 +17,11 @@ jobs: # not working on gcc-8 and gcc-9 see https://github.com/nodejs/node/issues/38570 container: gcc:11 steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 + uses: actions/setup-node@8f152de45cc393bb48ce5d89d36b731f54556e65 # v4.0.0 with: node-version: ${{ env.NODE_VERSION }} - name: Environment Information diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 36715798829efb..a374ef0b5dd2bd 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -24,18 +24,18 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 + uses: actions/setup-node@8f152de45cc393bb48ce5d89d36b731f54556e65 # v4.0.0 with: node-version: ${{ env.NODE_VERSION }} - name: Environment Information run: npx envinfo - name: Build run: NODE=$(command -v node) make doc-only - - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + - uses: actions/upload-artifact@c7d193f32edcb7bfad88892161225aeda64e9392 # v4.0.0 with: name: docs path: out/doc diff --git a/.github/workflows/find-inactive-collaborators.yml b/.github/workflows/find-inactive-collaborators.yml index badb0866dc23d1..8376927156cbb2 100644 --- a/.github/workflows/find-inactive-collaborators.yml +++ b/.github/workflows/find-inactive-collaborators.yml @@ -19,13 +19,13 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: fetch-depth: 0 persist-credentials: false - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 + uses: actions/setup-node@8f152de45cc393bb48ce5d89d36b731f54556e65 # v4.0.0 with: node-version: ${{ env.NODE_VERSION }} diff --git a/.github/workflows/find-inactive-tsc.yml b/.github/workflows/find-inactive-tsc.yml index 0a14599e776d56..2fe7c15fea940c 100644 --- a/.github/workflows/find-inactive-tsc.yml +++ b/.github/workflows/find-inactive-tsc.yml @@ -20,13 +20,13 @@ jobs: steps: - name: Checkout the repo - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: fetch-depth: 0 persist-credentials: false - name: Clone nodejs/TSC repository - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: fetch-depth: 0 path: .tmp @@ -34,7 +34,7 @@ jobs: repository: nodejs/TSC - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 + uses: actions/setup-node@8f152de45cc393bb48ce5d89d36b731f54556e65 # v4.0.0 with: node-version: ${{ env.NODE_VERSION }} diff --git a/.github/workflows/license-builder.yml b/.github/workflows/license-builder.yml index 724572c044d0c1..c1cbfafc1ac789 100644 --- a/.github/workflows/license-builder.yml +++ b/.github/workflows/license-builder.yml @@ -17,7 +17,7 @@ jobs: if: github.repository == 'nodejs/node' runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - run: ./tools/license-builder.sh # Run the license builder tool diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml index ff01e442990582..c3de444958e396 100644 --- a/.github/workflows/linters.yml +++ b/.github/workflows/linters.yml @@ -25,11 +25,11 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 + uses: actions/setup-node@8f152de45cc393bb48ce5d89d36b731f54556e65 # v4.0.0 with: node-version: ${{ env.NODE_VERSION }} - name: Environment Information @@ -40,11 +40,11 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information @@ -55,16 +55,16 @@ jobs: if: ${{ github.event.pull_request && github.event.pull_request.draft == false && github.base_ref == github.event.repository.default_branch }} runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: fetch-depth: 0 persist-credentials: false - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 + uses: actions/setup-node@8f152de45cc393bb48ce5d89d36b731f54556e65 # v4.0.0 with: node-version: ${{ env.NODE_VERSION }} - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information @@ -93,11 +93,11 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 + uses: actions/setup-node@8f152de45cc393bb48ce5d89d36b731f54556e65 # v4.0.0 with: node-version: ${{ env.NODE_VERSION }} - name: Environment Information @@ -118,11 +118,11 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information @@ -135,11 +135,11 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Use Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information @@ -153,7 +153,7 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - run: shellcheck -V @@ -163,7 +163,7 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - uses: mszostok/codeowners-validator@7f3f5e28c6d7b8dfae5731e54ce2272ca384592f @@ -173,7 +173,7 @@ jobs: if: ${{ github.event.pull_request }} runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: fetch-depth: 2 persist-credentials: false diff --git a/.github/workflows/notify-on-push.yml b/.github/workflows/notify-on-push.yml index 45ed957c0acefa..364e6610d439aa 100644 --- a/.github/workflows/notify-on-push.yml +++ b/.github/workflows/notify-on-push.yml @@ -34,7 +34,7 @@ jobs: permissions: pull-requests: write steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Check commit message diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 804b95cb64683c..200894aa671be7 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -33,17 +33,17 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@8ca2b8b2ece13480cda6dacd3511b49857a23c09 # v2.5.1 + uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 with: egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - name: Checkout code - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Run analysis - uses: ossf/scorecard-action@08b4669551908b1024bb425080c797723083c031 # v2.2.0 + uses: ossf/scorecard-action@0864cf19026789058feabb7e87baa5f140aac736 # v2.3.1 with: results_file: results.sarif results_format: sarif @@ -65,7 +65,7 @@ jobs: # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: Upload artifact - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + uses: actions/upload-artifact@c7d193f32edcb7bfad88892161225aeda64e9392 # v4.0.0 with: name: SARIF file path: results.sarif @@ -73,6 +73,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: Upload to code-scanning - uses: github/codeql-action/upload-sarif@ddccb873888234080b77e9bc2d4764d5ccaaccf9 # v2.21.9 + uses: github/codeql-action/upload-sarif@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8 with: sarif_file: results.sarif diff --git a/.github/workflows/test-asan.yml b/.github/workflows/test-asan.yml index 3b869140e39317..4db69c4c9ab90b 100644 --- a/.github/workflows/test-asan.yml +++ b/.github/workflows/test-asan.yml @@ -47,11 +47,11 @@ jobs: CONFIG_FLAGS: --enable-asan ASAN: true steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information diff --git a/.github/workflows/test-internet.yml b/.github/workflows/test-internet.yml index 20a3beb5367e7e..3d92b245eb19f5 100644 --- a/.github/workflows/test-internet.yml +++ b/.github/workflows/test-internet.yml @@ -40,11 +40,11 @@ jobs: if: github.repository == 'nodejs/node' || github.event_name != 'schedule' runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information diff --git a/.github/workflows/test-linux.yml b/.github/workflows/test-linux.yml index c5838f316c9662..2f9e13caf67cfb 100644 --- a/.github/workflows/test-linux.yml +++ b/.github/workflows/test-linux.yml @@ -34,11 +34,11 @@ jobs: if: github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information diff --git a/.github/workflows/test-macos.yml b/.github/workflows/test-macos.yml index d0d9d846156dee..cef03a2bb6decc 100644 --- a/.github/workflows/test-macos.yml +++ b/.github/workflows/test-macos.yml @@ -40,11 +40,11 @@ jobs: if: github.event.pull_request.draft == false runs-on: macos-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 with: python-version: ${{ env.PYTHON_VERSION }} - name: Environment Information diff --git a/.github/workflows/timezone-update.yml b/.github/workflows/timezone-update.yml index 0b1eecde618c7e..00158082692fc6 100644 --- a/.github/workflows/timezone-update.yml +++ b/.github/workflows/timezone-update.yml @@ -20,12 +20,12 @@ jobs: steps: - name: Checkout nodejs/node - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Checkout unicode-org/icu-data - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: path: icu-data persist-credentials: false @@ -34,12 +34,22 @@ jobs: - name: Record new version run: echo "new_version=$(ls icu-data/tzdata/icunew | tail -1)" >> $GITHUB_ENV + - name: Record current version + run: echo "current_version=$(cat ./test/fixtures/tz-version.txt)" >> $GITHUB_ENV + + - name: Compare versions + run: | + echo "Comparing current version ${{ env.current_version }} to new version ${{ env.new_version }}" + - run: ./tools/update-timezone.mjs + if: ${{ env.new_version != env.current_version }} - name: Update the expected timezone version in test + if: ${{ env.new_version != env.current_version }} run: echo "${{ env.new_version }}" > test/fixtures/tz-version.txt - name: Open Pull Request + if: ${{ env.new_version != env.current_version }} uses: gr2m/create-or-update-pull-request-action@77596e3166f328b24613f7082ab30bf2d93079d5 # Create a PR or update the Action's existing PR env: GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} diff --git a/.github/workflows/tools.yml b/.github/workflows/tools.yml index 852097fa5626cf..d29a0f9be67c97 100644 --- a/.github/workflows/tools.yml +++ b/.github/workflows/tools.yml @@ -36,6 +36,7 @@ on: - ngtcp2 - postject - root-certificates + - simdjson - simdutf - undici - uvwasi @@ -252,6 +253,14 @@ jobs: label: crypto, notable-change run: | node ./tools/dep_updaters/update-root-certs.mjs -v -f "$GITHUB_ENV" + - id: simdjson + subsystem: deps + label: dependencies + run: | + ./tools/dep_updaters/update-simdjson.sh > temp-output + cat temp-output + tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true + rm temp-output - id: simdutf subsystem: deps label: dependencies @@ -285,13 +294,13 @@ jobs: tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true rm temp-output steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 if: github.event_name == 'schedule' || inputs.id == 'all' || inputs.id == matrix.id with: persist-credentials: false - name: Set up Python ${{ env.PYTHON_VERSION }} if: matrix.id == 'icu' && (github.event_name == 'schedule' || inputs.id == 'all' || inputs.id == matrix.id) - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 with: python-version: ${{ env.PYTHON_VERSION }} - run: ${{ matrix.run }} diff --git a/.github/workflows/update-openssl.yml b/.github/workflows/update-openssl.yml index 5fdc7ac22a8778..95802feaee36f3 100644 --- a/.github/workflows/update-openssl.yml +++ b/.github/workflows/update-openssl.yml @@ -14,7 +14,7 @@ jobs: if: github.repository == 'nodejs/node' runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Check and download new OpenSSL version @@ -62,7 +62,7 @@ jobs: if: github.repository == 'nodejs/node' runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false ref: v16.x-staging diff --git a/.github/workflows/update-release-links.yml b/.github/workflows/update-release-links.yml new file mode 100644 index 00000000000000..3eaa61260545e8 --- /dev/null +++ b/.github/workflows/update-release-links.yml @@ -0,0 +1,20 @@ +name: Update release links + +on: + workflow_dispatch: + release: + types: [released] + +permissions: + contents: read + +jobs: + update-release-links: + if: github.repository == 'nodejs/node' + runs-on: ubuntu-latest + steps: + - name: Trigger update-links workflow on nodejs/release-cloudflare-worker + run: | + gh workflow run update-links.yml --repo nodejs/release-cloudflare-worker + env: + GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} diff --git a/.github/workflows/update-v8.yml b/.github/workflows/update-v8.yml index 8fe51b944da264..a22ff2f013864b 100644 --- a/.github/workflows/update-v8.yml +++ b/.github/workflows/update-v8.yml @@ -16,7 +16,7 @@ jobs: if: github.repository == 'nodejs/node' runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: persist-credentials: false - name: Cache node modules and update-v8 @@ -30,7 +30,7 @@ jobs: ~/.npm key: ${{ runner.os }}-build-${{ env.cache-name }} - name: Install Node.js - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 + uses: actions/setup-node@8f152de45cc393bb48ce5d89d36b731f54556e65 # v4.0.0 with: node-version: ${{ env.NODE_VERSION }} - name: Install @node-core/utils diff --git a/.mailmap b/.mailmap index eefb00db9b7afa..9535707681f48a 100644 --- a/.mailmap +++ b/.mailmap @@ -92,8 +92,8 @@ Caralyn Reisle Charles Charles Rudolph Chemi Atlow -Chemi Atlow -Chemi Atlow +Chemi Atlow +Chemi Atlow Chen Gang Chen Gang <13298548+MoonBall@users.noreply.github.com> Chengzhong Wu @@ -161,6 +161,7 @@ Erik Corry Ernesto Salazar Erwin W. Ramadhan Ethan Arrowood +Ethan Arrowood Eugene Obrezkov Eugene Ostroukhov Eugene Ostroukhov @@ -582,6 +583,7 @@ xiaoyu <306766053@qq.com> Xu Meng Xuguang Mei Yael Hermon +Yagiz Nizipli Yang Guo Yash Ladha <18033231+yashLadha@users.noreply.github.com> Yash Ladha diff --git a/BUILD.gn b/BUILD.gn new file mode 100644 index 00000000000000..1ed186b597eece --- /dev/null +++ b/BUILD.gn @@ -0,0 +1,14 @@ +############################################################################## +# # +# DO NOT EDIT THIS FILE! # +# # +############################################################################## + +# This file is used by GN for building, which is NOT the build system used for +# building official binaries. +# Please modify the gyp files if you are making changes to build system. + +import("unofficial.gni") + +node_gn_build("node") { +} diff --git a/BUILDING.md b/BUILDING.md index 983fa9188e5317..53f636a4cf641e 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -110,6 +110,7 @@ platforms. This is true regardless of entries in the table below. | GNU/Linux | armv6 | kernel >= 4.14, glibc >= 2.24 | Experimental | Downgraded as of Node.js 12 | | GNU/Linux | ppc64le >=power8 | kernel >= 4.18[^1], glibc >= 2.28 | Tier 2 | e.g. Ubuntu 20.04, RHEL 8 | | GNU/Linux | s390x | kernel >= 4.18[^1], glibc >= 2.28 | Tier 2 | e.g. RHEL 8 | +| GNU/Linux | loong64 | kernel >= 5.19, glibc >= 2.36 | Experimental | | | Windows | x64, x86 (WoW64) | >= Windows 10/Server 2016 | Tier 1 | [^2],[^3] | | Windows | x86 (native) | >= Windows 10/Server 2016 | Tier 1 (running) / Experimental (compiling)[^4] | | | Windows | x64, x86 | Windows 8.1/Server 2012 | Experimental | | @@ -118,7 +119,7 @@ platforms. This is true regardless of entries in the table below. | macOS | arm64 | >= 11.0 | Tier 1 | | | SmartOS | x64 | >= 18 | Tier 2 | | | AIX | ppc64be >=power8 | >= 7.2 TL04 | Tier 2 | | -| FreeBSD | x64 | >= 12.4 | Experimental | | +| FreeBSD | x64 | >= 13.2 | Experimental | | [^1]: Older kernel versions may work. However official Node.js release binaries are [built on RHEL 8 systems](#official-binary-platforms-and-toolchains) @@ -229,7 +230,7 @@ The Node.js project supports Python >= 3 for building and testing. * `gcc` and `g++` >= 10.1 or newer * GNU Make 3.81 or newer -* Python >=3.6 <=3.11 (see note above) +* [A supported version of Python][Python versions] * For test coverage, your Python installation must include pip. Installation via Linux package manager can be achieved with: @@ -245,7 +246,7 @@ FreeBSD and OpenBSD users may also need to install `libexecinfo`. #### macOS prerequisites * Xcode Command Line Tools >= 13 for macOS -* Python >=3.6 <=3.11 (see note above) +* [A supported version of Python][Python versions] * For test coverage, your Python installation must include pip. macOS users can install the `Xcode Command Line Tools` by running @@ -461,6 +462,12 @@ make docopen This will open a file URL to a one-page version of all the browsable HTML documents using the default browser. +```bash +make docclean +``` + +This will clean previously built doc. + To test if Node.js was built correctly: ```bash @@ -575,7 +582,8 @@ to run it again before invoking `make -j4`. ##### Option 1: Manual install -* [Python 3.11](https://apps.microsoft.com/store/detail/python-311/9NRWMJP3717K) +* The current [version of Python][Python versions] from the + [Microsoft Store](https://apps.microsoft.com/store/search?publisher=Python+Software+Foundation) * The "Desktop development with C++" workload from [Visual Studio 2022](https://visualstudio.microsoft.com/downloads/) or the "C++ build tools" workload from the @@ -886,3 +894,5 @@ incompatible with the official Node.js builds (e.g. using a ABI incompatible version of a dependency), please reserve and use a custom `NODE_MODULE_VERSION` by opening a pull request against the registry available at . + +[Python versions]: https://devguide.python.org/versions/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 644f72fd445f67..bcca7f899d0cdf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,8 @@ Select a Node.js version below to view the changelog history: -* [Node.js 20](doc/changelogs/CHANGELOG_V20.md) **Current** +* [Node.js 21](doc/changelogs/CHANGELOG_V21.md) **Current** +* [Node.js 20](doc/changelogs/CHANGELOG_V20.md) **Long Term Support** * [Node.js 19](doc/changelogs/CHANGELOG_V19.md) End-of-Life * [Node.js 18](doc/changelogs/CHANGELOG_V18.md) **Long Term Support** * [Node.js 17](doc/changelogs/CHANGELOG_V17.md) End-of-Life @@ -29,12 +30,23 @@ release. - + + + using - var >'); - - -bahasabrasilgalegomagyarpolskisrpskiردو中文简体繁體信息中国我们一个公司管理论坛可以服务时间个人产品自己企业查看工作联系没有网站所有评论中心文章用户首页作者技术问题相关下载搜索使用软件在线主题资料视频回复注册网络收藏内容推荐市场消息空间发布什么好友生活图片发展如果手机新闻最新方式北京提供关于更多这个系统知道游戏广告其他发表安全第一会员进行点击版权电子世界设计免费教育加入活动他们商品博客现在上海如何已经留言详细社区登录本站需要价格支持国际链接国家建设朋友阅读法律位置经济选择这样当前分类排行因为交易最后音乐不能通过行业科技可能设备合作大家社会研究专业全部项目这里还是开始情况电脑文件品牌帮助文化资源大学学习地址浏览投资工程要求怎么时候功能主要目前资讯城市方法电影招聘声明任何健康数据美国汽车介绍但是交流生产所以电话显示一些单位人员分析地图旅游工具学生系列网友帖子密码频道控制地区基本全国网上重要第二喜欢进入友情这些考试发现培训以上政府成为环境香港同时娱乐发送一定开发作品标准欢迎解决地方一下以及责任或者客户代表积分女人数码销售出现离线应用列表不同编辑统计查询不要有关机构很多播放组织政策直接能力来源時間看到热门关键专区非常英语百度希望美女比较知识规定建议部门意见精彩日本提高发言方面基金处理权限影片银行还有分享物品经营添加专家这种话题起来业务公告记录简介质量男人影响引用报告部分快速咨询时尚注意申请学校应该历史只是返回购买名称为了成功说明供应孩子专题程序一般會員只有其它保护而且今天窗口动态状态特别认为必须更新小说我們作为媒体包括那么一样国内是否根据电视学院具有过程由于人才出来不过正在明星故事关系标题商务输入一直基础教学了解建筑结果全球通知计划对于艺术相册发生真的建立等级类型经验实现制作来自标签以下原创无法其中個人一切指南关闭集团第三关注因此照片深圳商业广州日期高级最近综合表示专辑行为交通评价觉得精华家庭完成感觉安装得到邮件制度食品虽然转载报价记者方案行政人民用品东西提出酒店然后付款热点以前完全发帖设置领导工业医院看看经典原因平台各种增加材料新增之后职业效果今年论文我国告诉版主修改参与打印快乐机械观点存在精神获得利用继续你们这么模式语言能够雅虎操作风格一起科学体育短信条件治疗运动产业会议导航先生联盟可是問題结构作用调查資料自动负责农业访问实施接受讨论那个反馈加强女性范围服務休闲今日客服觀看参加的话一点保证图书有效测试移动才能决定股票不断需求不得办法之间采用营销投诉目标爱情摄影有些複製文学机会数字装修购物农村全面精品其实事情水平提示上市谢谢普通教师上传类别歌曲拥有创新配件只要时代資訊达到人生订阅老师展示心理贴子網站主題自然级别简单改革那些来说打开代码删除证券节目重点次數多少规划资金找到以后大全主页最佳回答天下保障现代检查投票小时沒有正常甚至代理目录公开复制金融幸福版本形成准备行情回到思想怎样协议认证最好产生按照服装广东动漫采购新手组图面板参考政治容易天地努力人们升级速度人物调整流行造成文字韩国贸易开展相關表现影视如此美容大小报道条款心情许多法规家居书店连接立即举报技巧奥运登入以来理论事件自由中华办公妈妈真正不错全文合同价值别人监督具体世纪团队创业承担增长有人保持商家维修台湾左右股份答案实际电信经理生命宣传任务正式特色下来协会只能当然重新內容指导运行日志賣家超过土地浙江支付推出站长杭州执行制造之一推广现场描述变化传统歌手保险课程医疗经过过去之前收入年度杂志美丽最高登陆未来加工免责教程版块身体重庆出售成本形式土豆出價东方邮箱南京求职取得职位相信页面分钟网页确定图例网址积极错误目的宝贝机关风险授权病毒宠物除了評論疾病及时求购站点儿童每天中央认识每个天津字体台灣维护本页个性官方常见相机战略应当律师方便校园股市房屋栏目员工导致突然道具本网结合档案劳动另外美元引起改变第四会计說明隐私宝宝规范消费共同忘记体系带来名字發表开放加盟受到二手大量成人数量共享区域女孩原则所在结束通信超级配置当时优秀性感房产遊戲出口提交就业保健程度参数事业整个山东情感特殊分類搜尋属于门户财务声音及其财经坚持干部成立利益考虑成都包装用戶比赛文明招商完整真是眼睛伙伴威望领域卫生优惠論壇公共良好充分符合附件特点不可英文资产根本明显密碼公众民族更加享受同学启动适合原来问答本文美食绿色稳定终于生物供求搜狐力量严重永远写真有限竞争对象费用不好绝对十分促进点评影音优势不少欣赏并且有点方向全新信用设施形象资格突破随着重大于是毕业智能化工完美商城统一出版打造產品概况用于保留因素中國存储贴图最愛长期口价理财基地安排武汉里面创建天空首先完善驱动下面不再诚信意义阳光英国漂亮军事玩家群众农民即可名稱家具动画想到注明小学性能考研硬件观看清楚搞笑首頁黄金适用江苏真实主管阶段註冊翻译权利做好似乎通讯施工狀態也许环保培养概念大型机票理解匿名cuandoenviarmadridbuscariniciotiempoporquecuentaestadopuedenjuegoscontraestánnombretienenperfilmaneraamigosciudadcentroaunquepuedesdentroprimerpreciosegúnbuenosvolverpuntossemanahabíaagostonuevosunidoscarlosequiponiñosmuchosalgunacorreoimagenpartirarribamaríahombreempleoverdadcambiomuchasfueronpasadolíneaparecenuevascursosestabaquierolibroscuantoaccesomiguelvarioscuatrotienesgruposseráneuropamediosfrenteacercademásofertacochesmodeloitalialetrasalgúncompracualesexistecuerposiendoprensallegarviajesdineromurciapodrápuestodiariopuebloquieremanuelpropiocrisisciertoseguromuertefuentecerrargrandeefectopartesmedidapropiaofrecetierrae-mailvariasformasfuturoobjetoseguirriesgonormasmismosúnicocaminositiosrazóndebidopruebatoledoteníajesúsesperococinaorigentiendacientocádizhablarseríalatinafuerzaestiloguerraentraréxitolópezagendavídeoevitarpaginametrosjavierpadresfácilcabezaáreassalidaenvíojapónabusosbienestextosllevarpuedanfuertecomúnclaseshumanotenidobilbaounidadestáseditarcreadoдлячтокакилиэтовсеегопритакещеужеКакбезбылониВсеподЭтотомчемнетлетразонагдемнеДляПринаснихтемктогодвоттамСШАмаяЧтовасвамемуТакдванамэтиэтуВамтехпротутнаддняВоттринейВаснимсамтотрубОнимирнееОООлицэтаОнанемдоммойдвеоносудकेहैकीसेकाकोऔरपरनेएककिभीइसकरतोहोआपहीयहयातकथाjagranआजजोअबदोगईजागएहमइनवहयेथेथीघरजबदीकईजीवेनईनएहरउसमेकमवोलेसबमईदेओरआमबसभरबनचलमनआगसीलीعلىإلىهذاآخرعددالىهذهصورغيركانولابينعرضذلكهنايومقالعليانالكنحتىقبلوحةاخرفقطعبدركنإذاكمااحدإلافيهبعضكيفبحثومنوهوأناجدالهاسلمعندليسعبرصلىمنذبهاأنهمثلكنتالاحيثمصرشرححولوفياذالكلمرةانتالفأبوخاصأنتانهاليعضووقدابنخيربنتلكمشاءوهيابوقصصومارقمأحدنحنعدمرأياحةكتبدونيجبمنهتحتجهةسنةيتمكرةغزةنفسبيتللهلناتلكقلبلماعنهأولشيءنورأمافيكبكلذاترتببأنهمسانكبيعفقدحسنلهمشعرأهلشهرقطرطلبprofileservicedefaulthimselfdetailscontentsupportstartedmessagesuccessfashioncountryaccountcreatedstoriesresultsrunningprocesswritingobjectsvisiblewelcomearticleunknownnetworkcompanydynamicbrowserprivacyproblemServicerespectdisplayrequestreservewebsitehistoryfriendsoptionsworkingversionmillionchannelwindow.addressvisitedweathercorrectproductedirectforwardyou canremovedsubjectcontrolarchivecurrentreadinglibrarylimitedmanagerfurthersummarymachineminutesprivatecontextprogramsocietynumberswrittenenabledtriggersourcesloadingelementpartnerfinallyperfectmeaningsystemskeepingculture",journalprojectsurfaces"expiresreviewsbalanceEnglishContentthroughPlease opinioncontactaverageprimaryvillageSpanishgallerydeclinemeetingmissionpopularqualitymeasuregeneralspeciessessionsectionwriterscounterinitialreportsfiguresmembersholdingdisputeearlierexpressdigitalpictureAnothermarriedtrafficleadingchangedcentralvictoryimages/reasonsstudiesfeaturelistingmust beschoolsVersionusuallyepisodeplayinggrowingobviousoverlaypresentactions</ul> -wrapperalreadycertainrealitystorageanotherdesktopofferedpatternunusualDigitalcapitalWebsitefailureconnectreducedAndroiddecadesregular & animalsreleaseAutomatgettingmethodsnothingPopularcaptionletterscapturesciencelicensechangesEngland=1&History = new CentralupdatedSpecialNetworkrequirecommentwarningCollegetoolbarremainsbecauseelectedDeutschfinanceworkersquicklybetweenexactlysettingdiseaseSocietyweaponsexhibit<!--Controlclassescoveredoutlineattacksdevices(windowpurposetitle="Mobile killingshowingItaliandroppedheavilyeffects-1']); -confirmCurrentadvancesharingopeningdrawingbillionorderedGermanyrelated</form>includewhetherdefinedSciencecatalogArticlebuttonslargestuniformjourneysidebarChicagoholidayGeneralpassage,"animatefeelingarrivedpassingnaturalroughly. - -The but notdensityBritainChineselack oftributeIreland" data-factorsreceivethat isLibraryhusbandin factaffairsCharlesradicalbroughtfindinglanding:lang="return leadersplannedpremiumpackageAmericaEdition]"Messageneed tovalue="complexlookingstationbelievesmaller-mobilerecordswant tokind ofFirefoxyou aresimilarstudiedmaximumheadingrapidlyclimatekingdomemergedamountsfoundedpioneerformuladynastyhow to SupportrevenueeconomyResultsbrothersoldierlargelycalling."AccountEdward segmentRobert effortsPacificlearnedup withheight:we haveAngelesnations_searchappliedacquiremassivegranted: falsetreatedbiggestbenefitdrivingStudiesminimumperhapsmorningsellingis usedreversevariant role="missingachievepromotestudentsomeoneextremerestorebottom:evolvedall thesitemapenglishway to AugustsymbolsCompanymattersmusicalagainstserving})(); -paymenttroubleconceptcompareparentsplayersregionsmonitor ''The winningexploreadaptedGalleryproduceabilityenhancecareers). The collectSearch ancientexistedfooter handlerprintedconsoleEasternexportswindowsChannelillegalneutralsuggest_headersigning.html">settledwesterncausing-webkitclaimedJusticechaptervictimsThomas mozillapromisepartieseditionoutside:false,hundredOlympic_buttonauthorsreachedchronicdemandssecondsprotectadoptedprepareneithergreatlygreateroverallimprovecommandspecialsearch.worshipfundingthoughthighestinsteadutilityquarterCulturetestingclearlyexposedBrowserliberal} catchProjectexamplehide();FloridaanswersallowedEmperordefenseseriousfreedomSeveral-buttonFurtherout of != nulltrainedDenmarkvoid(0)/all.jspreventRequestStephen - -When observe</h2> -Modern provide" alt="borders. - -For - -Many artistspoweredperformfictiontype ofmedicalticketsopposedCouncilwitnessjusticeGeorge Belgium...</a>twitternotablywaitingwarfare Other rankingphrasesmentionsurvivescholar</p> - Countryignoredloss ofjust asGeorgiastrange<head><stopped1']); -islandsnotableborder:list ofcarried100,000</h3> - severalbecomesselect wedding00.htmlmonarchoff theteacherhighly biologylife ofor evenrise of»plusonehunting(thoughDouglasjoiningcirclesFor theAncientVietnamvehiclesuch ascrystalvalue =Windowsenjoyeda smallassumed<a id="foreign All rihow theDisplayretiredhoweverhidden;battlesseekingcabinetwas notlook atconductget theJanuaryhappensturninga:hoverOnline French lackingtypicalextractenemieseven ifgeneratdecidedare not/searchbeliefs-image:locatedstatic.login">convertviolententeredfirst">circuitFinlandchemistshe was10px;">as suchdivided</span>will beline ofa greatmystery/index.fallingdue to railwaycollegemonsterdescentit withnuclearJewish protestBritishflowerspredictreformsbutton who waslectureinstantsuicidegenericperiodsmarketsSocial fishingcombinegraphicwinners<br /><by the NaturalPrivacycookiesoutcomeresolveSwedishbrieflyPersianso muchCenturydepictscolumnshousingscriptsnext tobearingmappingrevisedjQuery(-width:title">tooltipSectiondesignsTurkishyounger.match(})(); - -burningoperatedegreessource=Richardcloselyplasticentries</tr> -color:#ul id="possessrollingphysicsfailingexecutecontestlink toDefault<br /> -: true,chartertourismclassicproceedexplain</h1> -online.?xml vehelpingdiamonduse theairlineend -->).attr(readershosting#ffffffrealizeVincentsignals src="/ProductdespitediversetellingPublic held inJoseph theatreaffects<style>a largedoesn'tlater, ElementfaviconcreatorHungaryAirportsee theso thatMichaelSystemsPrograms, and width=e"tradingleft"> -personsGolden Affairsgrammarformingdestroyidea ofcase ofoldest this is.src = cartoonregistrCommonsMuslimsWhat isin manymarkingrevealsIndeed,equally/show_aoutdoorescape(Austriageneticsystem,In the sittingHe alsoIslandsAcademy - <!--Daniel bindingblock">imposedutilizeAbraham(except{width:putting).html(|| []; -DATA[ *kitchenmountedactual dialectmainly _blank'installexpertsif(typeIt also© ">Termsborn inOptionseasterntalkingconcerngained ongoingjustifycriticsfactoryits ownassaultinvitedlastinghis ownhref="/" rel="developconcertdiagramdollarsclusterphp?id=alcohol);})();using a><span>vesselsrevivalAddressamateurandroidallegedillnesswalkingcentersqualifymatchesunifiedextinctDefensedied in - <!-- customslinkingLittle Book ofeveningmin.js?are thekontakttoday's.html" target=wearingAll Rig; -})();raising Also, crucialabout">declare--> -<scfirefoxas muchappliesindex, s, but type = - -<!--towardsRecordsPrivateForeignPremierchoicesVirtualreturnsCommentPoweredinline;povertychamberLiving volumesAnthonylogin" RelatedEconomyreachescuttinggravitylife inChapter-shadowNotable</td> - returnstadiumwidgetsvaryingtravelsheld bywho arework infacultyangularwho hadairporttown of - -Some 'click'chargeskeywordit willcity of(this);Andrew unique checkedor more300px; return;rsion="pluginswithin herselfStationFederalventurepublishsent totensionactresscome tofingersDuke ofpeople,exploitwhat isharmonya major":"httpin his menu"> -monthlyofficercouncilgainingeven inSummarydate ofloyaltyfitnessand wasemperorsupremeSecond hearingRussianlongestAlbertalateralset of small">.appenddo withfederalbank ofbeneathDespiteCapitalgrounds), and percentit fromclosingcontainInsteadfifteenas well.yahoo.respondfighterobscurereflectorganic= Math.editingonline paddinga wholeonerroryear ofend of barrierwhen itheader home ofresumedrenamedstrong>heatingretainscloudfrway of March 1knowingin partBetweenlessonsclosestvirtuallinks">crossedEND -->famous awardedLicenseHealth fairly wealthyminimalAfricancompetelabel">singingfarmersBrasil)discussreplaceGregoryfont copursuedappearsmake uproundedboth ofblockedsaw theofficescoloursif(docuwhen heenforcepush(fuAugust UTF-8">Fantasyin mostinjuredUsuallyfarmingclosureobject defenceuse of Medical<body> -evidentbe usedkeyCodesixteenIslamic#000000entire widely active (typeofone cancolor =speakerextendsPhysicsterrain<tbody>funeralviewingmiddle cricketprophetshifteddoctorsRussell targetcompactalgebrasocial-bulk ofman and</td> - he left).val()false);logicalbankinghome tonaming Arizonacredits); -}); -founderin turnCollinsbefore But thechargedTitle">CaptainspelledgoddessTag -->Adding:but wasRecent patientback in=false&Lincolnwe knowCounterJudaismscript altered']); - has theunclearEvent',both innot all - -<!-- placinghard to centersort ofclientsstreetsBernardassertstend tofantasydown inharbourFreedomjewelry/about..searchlegendsis mademodern only ononly toimage" linear painterand notrarely acronymdelivershorter00&as manywidth="/* <![Ctitle =of the lowest picked escapeduses ofpeoples PublicMatthewtacticsdamagedway forlaws ofeasy to windowstrong simple}catch(seventhinfoboxwent topaintedcitizenI don'tretreat. Some ww."); -bombingmailto:made in. Many carries||{};wiwork ofsynonymdefeatsfavoredopticalpageTraunless sendingleft"><comScorAll thejQuery.touristClassicfalse" Wilhelmsuburbsgenuinebishops.split(global followsbody ofnominalContactsecularleft tochiefly-hidden-banner</li> - -. When in bothdismissExplorealways via thespañolwelfareruling arrangecaptainhis sonrule ofhe tookitself,=0&(calledsamplesto makecom/pagMartin Kennedyacceptsfull ofhandledBesides//--></able totargetsessencehim to its by common.mineralto takeways tos.org/ladvisedpenaltysimple:if theyLettersa shortHerbertstrikes groups.lengthflightsoverlapslowly lesser social </p> - it intoranked rate oful> - attemptpair ofmake itKontaktAntoniohaving ratings activestreamstrapped").css(hostilelead tolittle groups,Picture--> - - rows=" objectinverse<footerCustomV><\/scrsolvingChamberslaverywoundedwhereas!= 'undfor allpartly -right:Arabianbacked centuryunit ofmobile-Europe,is homerisk ofdesiredClintoncost ofage of become none ofp"Middle ead')[0Criticsstudios>©group">assemblmaking pressedwidget.ps:" ? rebuiltby someFormer editorsdelayedCanonichad thepushingclass="but arepartialBabylonbottom carrierCommandits useAs withcoursesa thirddenotesalso inHouston20px;">accuseddouble goal ofFamous ).bind(priests Onlinein Julyst + "gconsultdecimalhelpfulrevivedis veryr'+'iptlosing femalesis alsostringsdays ofarrivalfuture <objectforcingString(" /> - here isencoded. The balloondone by/commonbgcolorlaw of Indianaavoidedbut the2px 3pxjquery.after apolicy.men andfooter-= true;for usescreen.Indian image =family,http://  driverseternalsame asnoticedviewers})(); - is moreseasonsformer the newis justconsent Searchwas thewhy theshippedbr><br>width: height=made ofcuisineis thata very Admiral fixed;normal MissionPress, ontariocharsettry to invaded="true"spacingis mosta more totallyfall of}); - immensetime inset outsatisfyto finddown tolot of Playersin Junequantumnot thetime todistantFinnishsrc = (single help ofGerman law andlabeledforestscookingspace">header-well asStanleybridges/globalCroatia About [0]; - it, andgroupedbeing a){throwhe madelighterethicalFFFFFF"bottom"like a employslive inas seenprintermost ofub-linkrejectsand useimage">succeedfeedingNuclearinformato helpWomen'sNeitherMexicanprotein<table by manyhealthylawsuitdevised.push({sellerssimply Through.cookie Image(older">us.js"> Since universlarger open to!-- endlies in']); - marketwho is ("DOMComanagedone fortypeof Kingdomprofitsproposeto showcenter;made itdressedwere inmixtureprecisearisingsrc = 'make a securedBaptistvoting - var March 2grew upClimate.removeskilledway the</head>face ofacting right">to workreduceshas haderectedshow();action=book ofan area== "htt<header -<html>conformfacing cookie.rely onhosted .customhe wentbut forspread Family a meansout theforums.footage">MobilClements" id="as highintense--><!--female is seenimpliedset thea stateand hisfastestbesidesbutton_bounded"><img Infoboxevents,a youngand areNative cheaperTimeoutand hasengineswon the(mostlyright: find a -bottomPrince area ofmore ofsearch_nature,legallyperiod,land ofor withinducedprovingmissilelocallyAgainstthe wayk"px;"> -pushed abandonnumeralCertainIn thismore inor somename isand, incrownedISBN 0-createsOctobermay notcenter late inDefenceenactedwish tobroadlycoolingonload=it. TherecoverMembersheight assumes<html> -people.in one =windowfooter_a good reklamaothers,to this_cookiepanel">London,definescrushedbaptismcoastalstatus title" move tolost inbetter impliesrivalryservers SystemPerhapses and contendflowinglasted rise inGenesisview ofrising seem tobut in backinghe willgiven agiving cities.flow of Later all butHighwayonly bysign ofhe doesdiffersbattery&lasinglesthreatsintegertake onrefusedcalled =US&See thenativesby thissystem.head of:hover,lesbiansurnameand allcommon/header__paramsHarvard/pixel.removalso longrole ofjointlyskyscraUnicodebr /> -AtlantanucleusCounty,purely count">easily build aonclicka givenpointerh"events else { -ditionsnow the, with man whoorg/Webone andcavalryHe diedseattle00,000 {windowhave toif(windand itssolely m"renewedDetroitamongsteither them inSenatorUs</a><King ofFrancis-produche usedart andhim andused byscoringat hometo haverelatesibilityfactionBuffalolink"><what hefree toCity ofcome insectorscountedone daynervoussquare };if(goin whatimg" alis onlysearch/tuesdaylooselySolomonsexual - <a hrmedium"DO NOT France,with a war andsecond take a > - - -market.highwaydone inctivity"last">obligedrise to"undefimade to Early praisedin its for hisathleteJupiterYahoo! termed so manyreally s. The a woman?value=direct right" bicycleacing="day andstatingRather,higher Office are nowtimes, when a pay foron this-link">;borderaround annual the Newput the.com" takin toa brief(in thegroups.; widthenzymessimple in late{returntherapya pointbanninginks"> -();" rea place\u003Caabout atr> - ccount gives a<SCRIPTRailwaythemes/toolboxById("xhumans,watchesin some if (wicoming formats Under but hashanded made bythan infear ofdenoted/iframeleft involtagein eacha"base ofIn manyundergoregimesaction </p> -<ustomVa;></importsor thatmostly &re size="</a></ha classpassiveHost = WhetherfertileVarious=[];(fucameras/></td>acts asIn some> - -<!organis <br />Beijingcatalàdeutscheuropeueuskaragaeilgesvenskaespañamensajeusuariotrabajoméxicopáginasiempresistemaoctubreduranteañadirempresamomentonuestroprimeratravésgraciasnuestraprocesoestadoscalidadpersonanúmeroacuerdomúsicamiembroofertasalgunospaísesejemploderechoademásprivadoagregarenlacesposiblehotelessevillaprimeroúltimoeventosarchivoculturamujeresentradaanuncioembargomercadograndesestudiomejoresfebrerodiseñoturismocódigoportadaespaciofamiliaantoniopermiteguardaralgunaspreciosalguiensentidovisitastítuloconocersegundoconsejofranciaminutossegundatenemosefectosmálagasesiónrevistagranadacompraringresogarcíaacciónecuadorquienesinclusodeberámateriahombresmuestrapodríamañanaúltimaestamosoficialtambienningúnsaludospodemosmejorarpositionbusinesshomepagesecuritylanguagestandardcampaignfeaturescategoryexternalchildrenreservedresearchexchangefavoritetemplatemilitaryindustryservicesmaterialproductsz-index:commentssoftwarecompletecalendarplatformarticlesrequiredmovementquestionbuildingpoliticspossiblereligionphysicalfeedbackregisterpicturesdisabledprotocolaudiencesettingsactivityelementslearninganythingabstractprogressoverviewmagazineeconomictrainingpressurevarious <strong>propertyshoppingtogetheradvancedbehaviordownloadfeaturedfootballselectedLanguagedistanceremembertrackingpasswordmodifiedstudentsdirectlyfightingnortherndatabasefestivalbreakinglocationinternetdropdownpracticeevidencefunctionmarriageresponseproblemsnegativeprogramsanalysisreleasedbanner">purchasepoliciesregionalcreativeargumentbookmarkreferrerchemicaldivisioncallbackseparateprojectsconflicthardwareinterestdeliverymountainobtained= false;for(var acceptedcapacitycomputeridentityaircraftemployedproposeddomesticincludesprovidedhospitalverticalcollapseapproachpartnerslogo"><adaughterauthor" culturalfamilies/images/assemblypowerfulteachingfinisheddistrictcriticalcgi-bin/purposesrequireselectionbecomingprovidesacademicexerciseactuallymedicineconstantaccidentMagazinedocumentstartingbottom">observed: "extendedpreviousSoftwarecustomerdecisionstrengthdetailedslightlyplanningtextareacurrencyeveryonestraighttransferpositiveproducedheritageshippingabsolutereceivedrelevantbutton" violenceanywherebenefitslaunchedrecentlyalliancefollowedmultiplebulletinincludedoccurredinternal$(this).republic><tr><tdcongressrecordedultimatesolution<ul id="discoverHome</a>websitesnetworksalthoughentirelymemorialmessagescontinueactive">somewhatvictoriaWestern title="LocationcontractvisitorsDownloadwithout right"> -measureswidth = variableinvolvedvirginianormallyhappenedaccountsstandingnationalRegisterpreparedcontrolsaccuratebirthdaystrategyofficialgraphicscriminalpossiblyconsumerPersonalspeakingvalidateachieved.jpg" />machines</h2> - keywordsfriendlybrotherscombinedoriginalcomposedexpectedadequatepakistanfollow" valuable</label>relativebringingincreasegovernorplugins/List of Header">" name=" ("graduate</head> -commercemalaysiadirectormaintain;height:schedulechangingback to catholicpatternscolor: #greatestsuppliesreliable</ul> - <select citizensclothingwatching<li id="specificcarryingsentence<center>contrastthinkingcatch(e)southernMichael merchantcarouselpadding:interior.split("lizationOctober ){returnimproved--> - -coveragechairman.png" />subjectsRichard whateverprobablyrecoverybaseballjudgmentconnect..css" /> websitereporteddefault"/></a> -electricscotlandcreationquantity. ISBN 0did not instance-search-" lang="speakersComputercontainsarchivesministerreactiondiscountItalianocriteriastrongly: 'http:'script'coveringofferingappearedBritish identifyFacebooknumerousvehiclesconcernsAmericanhandlingdiv id="William provider_contentaccuracysection andersonflexibleCategorylawrence<script>layout="approved maximumheader"></table>Serviceshamiltoncurrent canadianchannels/themes//articleoptionalportugalvalue=""intervalwirelessentitledagenciesSearch" measuredthousandspending…new Date" size="pageNamemiddle" " /></a>hidden">sequencepersonaloverflowopinionsillinoislinks"> - <title>versionssaturdayterminalitempropengineersectionsdesignerproposal="false"Españolreleasessubmit" er"additionsymptomsorientedresourceright"><pleasurestationshistory.leaving border=contentscenter">. - -Some directedsuitablebulgaria.show();designedGeneral conceptsExampleswilliamsOriginal"><span>search">operatorrequestsa "allowingDocumentrevision. - -The yourselfContact michiganEnglish columbiapriorityprintingdrinkingfacilityreturnedContent officersRussian generate-8859-1"indicatefamiliar qualitymargin:0 contentviewportcontacts-title">portable.length eligibleinvolvesatlanticonload="default.suppliedpaymentsglossary - -After guidance</td><tdencodingmiddle">came to displaysscottishjonathanmajoritywidgets.clinicalthailandteachers<head> - affectedsupportspointer;toString</small>oklahomawill be investor0" alt="holidaysResourcelicensed (which . After considervisitingexplorerprimary search" android"quickly meetingsestimate;return ;color:# height=approval, " checked.min.js"magnetic></a></hforecast. While thursdaydvertiseéhasClassevaluateorderingexistingpatients Online coloradoOptions"campbell<!-- end</span><<br /> -_popups|sciences," quality Windows assignedheight: <b classle" value=" Companyexamples<iframe believespresentsmarshallpart of properly). - -The taxonomymuch of </span> -" data-srtuguêsscrollTo project<head> -attorneyemphasissponsorsfancyboxworld's wildlifechecked=sessionsprogrammpx;font- Projectjournalsbelievedvacationthompsonlightingand the special border=0checking</tbody><button Completeclearfix -<head> -article <sectionfindingsrole in popular Octoberwebsite exposureused to changesoperatedclickingenteringcommandsinformed numbers </div>creatingonSubmitmarylandcollegesanalyticlistingscontact.loggedInadvisorysiblingscontent"s")s. This packagescheckboxsuggestspregnanttomorrowspacing=icon.pngjapanesecodebasebutton">gamblingsuch as , while </span> missourisportingtop:1px .</span>tensionswidth="2lazyloadnovemberused in height="cript"> - </<tr><td height:2/productcountry include footer" <!-- title"></jquery.</form> -(简体)(繁體)hrvatskiitalianoromânătürkçeاردوtambiénnoticiasmensajespersonasderechosnacionalserviciocontactousuariosprogramagobiernoempresasanunciosvalenciacolombiadespuésdeportesproyectoproductopúbliconosotroshistoriapresentemillonesmediantepreguntaanteriorrecursosproblemasantiagonuestrosopiniónimprimirmientrasaméricavendedorsociedadrespectorealizarregistropalabrasinterésentoncesespecialmiembrosrealidadcórdobazaragozapáginassocialesbloqueargestiónalquilersistemascienciascompletoversióncompletaestudiospúblicaobjetivoalicantebuscadorcantidadentradasaccionesarchivossuperiormayoríaalemaniafunciónúltimoshaciendoaquellosediciónfernandoambientefacebooknuestrasclientesprocesosbastantepresentareportarcongresopublicarcomerciocontratojóvenesdistritotécnicaconjuntoenergíatrabajarasturiasrecienteutilizarboletínsalvadorcorrectatrabajosprimerosnegocioslibertaddetallespantallapróximoalmeríaanimalesquiénescorazónsecciónbuscandoopcionesexteriorconceptotodavíagaleríaescribirmedicinalicenciaconsultaaspectoscríticadólaresjusticiadeberánperíodonecesitamantenerpequeñorecibidatribunaltenerifecancióncanariasdescargadiversosmallorcarequieretécnicodeberíaviviendafinanzasadelantefuncionaconsejosdifícilciudadesantiguasavanzadatérminounidadessánchezcampañasoftonicrevistascontienesectoresmomentosfacultadcréditodiversassupuestofactoressegundospequeñaгодаеслиестьбылобытьэтомЕслитогоменявсехэтойдажебылигодуденьэтотбыласебяодинсебенадосайтфотонегосвоисвойигрытожевсемсвоюлишьэтихпокаднейдомамиралиботемухотядвухсетилюдиделомиретебясвоевидечегоэтимсчеттемыценысталведьтемеводытебевышенамитипатомуправлицаоднагодызнаюмогудругвсейидеткиноодноделаделесрокиюнявесьЕстьразанашиاللهالتيجميعخاصةالذيعليهجديدالآنالردتحكمصفحةكانتاللييكونشبكةفيهابناتحواءأكثرخلالالحبدليلدروساضغطتكونهناكساحةناديالطبعليكشكرايمكنمنهاشركةرئيسنشيطماذاالفنشبابتعبررحمةكافةيقولمركزكلمةأحمدقلبييعنيصورةطريقشاركجوالأخرىمعناابحثعروضبشكلمسجلبنانخالدكتابكليةبدونأيضايوجدفريقكتبتأفضلمطبخاكثرباركافضلاحلىنفسهأيامردودأنهاديناالانمعرضتعلمداخلممكن���������������������� -  - ������������������������������������������������resourcescountriesquestionsequipmentcommunityavailablehighlightDTD/xhtmlmarketingknowledgesomethingcontainerdirectionsubscribeadvertisecharacter" value="</select>Australia" class="situationauthorityfollowingprimarilyoperationchallengedevelopedanonymousfunction functionscompaniesstructureagreement" title="potentialeducationargumentssecondarycopyrightlanguagesexclusivecondition</form> -statementattentionBiography} else { -solutionswhen the Analyticstemplatesdangeroussatellitedocumentspublisherimportantprototypeinfluence»</effectivegenerallytransformbeautifultransportorganizedpublishedprominentuntil thethumbnailNational .focus();over the migrationannouncedfooter"> -exceptionless thanexpensiveformationframeworkterritoryndicationcurrentlyclassNamecriticismtraditionelsewhereAlexanderappointedmaterialsbroadcastmentionedaffiliate</option>treatmentdifferent/default.Presidentonclick="biographyotherwisepermanentFrançaisHollywoodexpansionstandards</style> -reductionDecember preferredCambridgeopponentsBusiness confusion> -<title>presentedexplaineddoes not worldwideinterfacepositionsnewspaper</table> -mountainslike the essentialfinancialselectionaction="/abandonedEducationparseInt(stabilityunable to -relationsNote thatefficientperformedtwo yearsSince thethereforewrapper">alternateincreasedBattle ofperceivedtrying tonecessaryportrayedelectionsElizabethdiscoveryinsurances.length;legendaryGeographycandidatecorporatesometimesservices.inheritedCommunityreligiouslocationsCommitteebuildingsthe worldno longerbeginningreferencecannot befrequencytypicallyinto the relative;recordingpresidentinitiallytechniquethe otherit can beexistenceunderlinethis timetelephoneitemscopepracticesadvantage);return For otherprovidingdemocracyboth the extensivesufferingsupportedcomputers functionpracticalsaid thatit may beEnglish -suspectedmargin: 0spiritual - -microsoftgraduallydiscussedhe becameexecutivejquery.jshouseholdconfirmedpurchasedliterallydestroyedup to thevariationremainingit is notcenturiesJapanese among thecompletedalgorithminterestsrebellionundefinedencourageresizableinvolvingsensitiveuniversalprovision(althoughfeaturingconducted), which continued-header">February numerous overflow:componentfragmentsexcellentcolspan="technicalnear the Advanced source ofexpressedHong Kong Facebookmultiple mechanismelevationoffensive - sponsoreddocument.or "there arethose whomovementsprocessesdifficultsubmittedrecommendconvincedpromoting" width=".replace(classicalcoalitionhis firstdecisionsassistantindicatedevolution-wrapper"enough toalong thedelivered--> - - -
Archbishop class="nobeing usedapproachesprivilegesnoscript> -results inmay be theEaster eggmechanismsreasonablePopulationCollectionselected">noscript> /index.phparrival of-jssdk'));managed toincompletecasualtiescompletionChristiansSeptember arithmeticproceduresmight haveProductionit appearsPhilosophyfriendshipleading togiving thetoward theguaranteeddocumentedcolor:#000video gamecommissionreflectingchange theassociatedsans-serifonkeypress; padding:He was theunderlyingtypically , and the srcElementsuccessivesince the should be networkingaccountinguse of thelower thanshows that - complaintscontinuousquantitiesastronomerhe did notdue to itsapplied toan averageefforts tothe futureattempt toTherefore,capabilityRepublicanwas formedElectronickilometerschallengespublishingthe formerindigenousdirectionssubsidiaryconspiracydetails ofand in theaffordablesubstancesreason forconventionitemtype="absolutelysupposedlyremained aattractivetravellingseparatelyfocuses onelementaryapplicablefound thatstylesheetmanuscriptstands for no-repeat(sometimesCommercialin Americaundertakenquarter ofan examplepersonallyindex.php? -percentagebest-knowncreating a" dir="ltrLieutenant -
is said tostructuralreferendummost oftena separate-> -
implementedcan be seenthere was ademonstratecontainer">connectionsthe Britishwas written!important;px; margin-followed byability to complicatedduring the immigrationalso called

as follows:merged withthrough thecommercial pointed outopportunityview of therequirementdivision ofprogramminghe receivedsetInterval">maintainingChristopherMuch of thewritings of" height="2size of theversion of mixture of between theExamples ofeducationalcompetitive onsubmit="director ofdistinctive/DTD XHTML relating totendency toprovince ofwhich woulddespite thescientific legislature.innerHTML allegationsAgriculturewas used inapproach tointelligentyears later,sans-serifdeterminingPerformanceappearances, which is foundationsabbreviatedhigher thans from the individual composed ofsupposed toclaims thatattributionfont-size:1elements ofHistorical his brotherat the timeanniversarygoverned byrelated to ultimately innovationsit is stillcan only bedefinitionstoGMTStringA number ofimg class="Eventually,was changedoccurred inneighboringdistinguishwhen he wasintroducingterrestrialMany of theargues thatan Americanconquest ofwidespread were killedscreen and In order toexpected todescendantsare locatedlegislativegenerations backgroundmost peopleyears afterthere is nothe highestfrequently they do notargued thatshowed thatpredominanttheologicalby the timeconsideringshort-livedcan be usedvery littleone of the had alreadyinterpretedcommunicatefeatures ofgovernment,entered the" height="3Independentpopulationslarge-scale. Although used in thedestructionpossibilitystarting intwo or moreexpressionssubordinatelarger thanhistory and -Continentaleliminatingwill not bepractice ofin front ofsite of theensure thatto create amississippipotentiallyoutstandingbetter thanwhat is nowsituated inmeta name="TraditionalsuggestionsTranslationthe form ofatmosphericideologicalenterprisescalculatingeast of theremnants ofpluginspage/index.php?remained intransformedHe was alsowas alreadystatisticalin favor ofMinistry ofmovement offormulationis required -question ofwas electedto become abecause of some peopleinspired bysuccessful a time whenmore commonamongst thean officialwidth:100%;technology,was adoptedto keep thesettlementslive birthsindex.html"Connecticutassigned to&times;account foralign=rightthe companyalways beenreturned toinvolvementBecause thethis period" name="q" confined toa result ofvalue="" />is actuallyEnvironment - -Conversely,> -
this is notthe presentif they areand finallya matter of -
- -faster thanmajority ofafter whichcomparativeto maintainimprove theawarded theer" class="frameborderrestorationin the sameanalysis oftheir firstDuring the continentalsequence offunction(){font-size: work on the -adopted theproperty ofdirected byeffectivelywas broughtchildren ofProgramminglonger thanmanuscriptswar againstby means ofand most ofsimilar to proprietaryoriginatingprestigiousgrammaticalexperience.to make theIt was alsois found incompetitorsin the U.S.replace thebrought thecalculationfall of thethe generalpracticallyin honor ofreleased inresidentialand some ofking of thereaction to1st Earl ofculture andprincipally - they can beback to thesome of hisexposure toare similarform of theaddFavoritecitizenshippart in thepeople within practiceto continue&minus;approved by the first allowed theand for thefunctioningplaying thesolution toheight="0" in his bookmore than afollows thecreated thepresence in nationalistthe idea ofa characterwere forced class="btndays of thefeatured inshowing theinterest inin place ofturn of thethe head ofLord of thepoliticallyhas its ownEducationalapproval ofsome of theeach other,behavior ofand becauseand anotherappeared onrecorded inblack"may includethe world'scan lead torefers to aborder="0" government winning theresulted in while the Washington,the subjectcity in the>

- reflect theto completebecame moreradioactiverejected bywithout anyhis father,which couldcopy of theto indicatea politicalaccounts ofconstitutesworked witherof his lifeaccompaniedclientWidthprevent theLegislativedifferentlytogether inhas severalfor anothertext of thefounded thee with the is used forchanged theusually theplace wherewhereas the> The currentthe site ofsubstantialexperience,in the Westthey shouldslovenčinacomentariosuniversidadcondicionesactividadesexperienciatecnologíaproducciónpuntuaciónaplicacióncontraseñacategoríasregistrarseprofesionaltratamientoregístratesecretaríaprincipalesprotecciónimportantesimportanciaposibilidadinteresantecrecimientonecesidadessuscribirseasociacióndisponiblesevaluaciónestudiantesresponsableresoluciónguadalajararegistradosoportunidadcomercialesfotografíaautoridadesingenieríatelevisióncompetenciaoperacionesestablecidosimplementeactualmentenavegaciónconformidadline-height:font-family:" : "http://applicationslink" href="specifically// -/index.html"window.open( !important;application/independence//www.googleorganizationautocompleterequirementsconservative
most notably/>
notification'undefined')Furthermore,believe thatinnerHTML = prior to thedramaticallyreferring tonegotiationsheadquartersSouth AfricaunsuccessfulPennsylvaniaAs a result, -
English (US)appendChild(transmissions. However, intelligence" tabindex="float:right;Commonwealthranging fromin which theat least onereproductionencyclopedia;font-size:1jurisdictionat that time">compensationchampionshipmedia="all" violation ofreference toreturn true;Strict//EN" transactionsinterventionverificationInformation difficultiesChampionshipcapabilities} - -Christianityfor example,Professionalrestrictionssuggest thatwas released(such as theremoveClass(unemploymentthe Americanstructure of/index.html published inspan class=""> - -f (document.border: 1px {font-size:1treatment of0" height="1modificationIndependencedivided intogreater thanachievementsestablishingJavaScript" neverthelesssignificanceBroadcasting> container"> -such as the influence ofa particularsrc='http://navigation" half of the substantial  advantage ofdiscovery offundamental metropolitanthe opposite" xml:lang="deliberatelyalign=centerevolution ofpreservationimprovementsbeginning inJesus ChristPublicationsdisagreementtext-align:r, function()similaritiesbody>is currentlyalphabeticalis sometimestype="image/many of the flow:hidden;available indescribe theexistence ofall over thethe Internet
    - -an effort toincrease theto the southspacing="0">sufficientlythe Europeanconverted toclearTimeoutdid not haveconsequentlyfor the nextextension ofeconomic andalthough theare producedand with theinsufficientgiven by thestating thatexpenditures -thought thaton the basiscellpadding=image of thereturning toinformation,separated byassassinateds" content="authority ofnorthwestern -
    - consultationcommunity ofthe nationalit should beparticipants align="leftthe greatestselection ofsupernaturaldependent onis mentionedallowing thewas inventedaccompanyinghis personalavailable atstudy of theon the otherexecution ofHuman Rightsterms of theassociationsresearch andsucceeded bydefeated theand from thebut they arecommander ofstate of theyears of agethe study of
      Roman Empireequal to theIn contrast,however, andis typicallyand his wife(also called> - -philosophicallocation.hrefwas publishedSan Francisco(function(){ -
      has been usedreturn to thealthough thischange in theseveral otherbut there areunprecedentedis similar toespecially inweight: bold;is called thecomputationalindicate thatrestricted to
      -
      large part ofInstitute forthe so-called against the In this case,was appointedclaimed to beHowever, thisDepartment ofthe remainingeffect on theparticularly deal with the -
      the structure />
      Many of thesecaused by theof the Unitedspan class="mcan be tracedis related tobecame one ofis frequentlyliving in thetheoreticallyFollowing theRevolutionarygovernment inis determinedthe politicalintroduced insufficient todescription">short storiesseparation ofas to whetherknown for itswas initiallydisplay:blockis an examplethe principalconsists of arecognized as/body>a substantialreconstructedhead of stateresistance toundergraduateThere are twogravitationalare describedintentionallyserved as theclass="headeropposition tofundamentallydominated theand the otheralliance withwas forced torespectively,and politicalin support ofpeople in the20th century.and publishedloadChartbeatto understandmember statesenvironmentalfirst half ofcountries andarchitecturalbe consideredcharacterizedclearIntervalauthoritativeFederation ofwas succeededand there area consequencethe Presidentalso includedfree softwaresuccession ofdeveloped thewas destroyedaway from the; - -
      -=http%3A%2F%2F -.setAttribute(Administration= new Array(); -display:block;Unfortunately,"> 
      /favicon.ico">='stylesheet' identification, for example,
    • -type="submit" -(function() {recommendationform action="/transformationreconstruction.style.display According to hidden" name="along with thedocument.body.approximately Communicationspost" action="meaning "--Prime Ministercharacteristic - -depends on theUniversity of in contrast to placeholder="in the case ofinternational constitutionalstyle="border-: function() {Because of the-strict.dtd"> -
20 (Current)21 (Current)20 (LTS) 18 (LTS)
-20.8.1
+21.5.0
+21.4.0
+21.3.0
+21.2.0
+21.1.0
+21.0.0
+
+20.10.0
+20.9.0
+20.8.1
20.8.0
20.7.0
20.6.1
@@ -49,7 +61,8 @@ release. 20.0.0
-18.18.2
+18.19.0
+18.18.2
18.18.1
18.18.0
18.17.1
diff --git a/GOVERNANCE.md b/GOVERNANCE.md index 6ba1ef2daf2c3d..d29012745ea87f 100644 --- a/GOVERNANCE.md +++ b/GOVERNANCE.md @@ -151,8 +151,9 @@ Provide a summary of the nominee's contributions. For example: Mention @nodejs/collaborators in the issue to notify other collaborators about the nomination. -The nomination passes if no collaborators oppose it after one week. Otherwise, -the nomination fails. +The nomination passes if no collaborators oppose it after one week. In the case +of an objection, the TSC is responsible for working with the individuals +involved and finding a resolution. There are steps a nominator can take in advance to make a nomination as frictionless as possible. To request feedback from other collaborators in diff --git a/LICENSE b/LICENSE index 5688952e3ba22f..fb7c9d3abe9215 100644 --- a/LICENSE +++ b/LICENSE @@ -78,19 +78,30 @@ The externally maintained libraries used by Node.js are: - c-ares, located at deps/cares, is licensed as follows: """ - Copyright (c) 2007 - 2018, Daniel Stenberg with many contributors, see AUTHORS + MIT License + + Copyright (c) 1998 Massachusetts Institute of Technology + Copyright (c) 2007 - 2023 Daniel Stenberg with many contributors, see AUTHORS file. - Copyright 1998 by the Massachusetts Institute of Technology. + Permission is hereby granted, free of charge, to any person obtaining a copy of + this software and associated documentation files (the "Software"), to deal in + the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + the Software, and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: - Permission to use, copy, modify, and distribute this software and its - documentation for any purpose and without fee is hereby granted, provided that - the above copyright notice appear in all copies and that both that copyright - notice and this permission notice appear in supporting documentation, and that - the name of M.I.T. not be used in advertising or publicity pertaining to - distribution of the software without specific, written prior permission. - M.I.T. makes no representations about the suitability of this software for any - purpose. It is provided "as is" without express or implied warranty. + The above copyright notice and this permission notice (including the next + paragraph) shall be included in all copies or substantial portions of the + Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. """ - cjs-module-lexer, located at deps/cjs-module-lexer, is licensed as follows: @@ -121,52 +132,45 @@ The externally maintained libraries used by Node.js are: - ICU, located at deps/icu-small, is licensed as follows: """ - UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE - - See Terms of Use - for definitions of Unicode Inc.’s Data Files and Software. - - NOTICE TO USER: Carefully read the following legal agreement. - BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S - DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), - YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE - TERMS AND CONDITIONS OF THIS AGREEMENT. - IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE - THE DATA FILES OR SOFTWARE. + UNICODE LICENSE V3 COPYRIGHT AND PERMISSION NOTICE - Copyright © 1991-2023 Unicode, Inc. All rights reserved. - Distributed under the Terms of Use in https://www.unicode.org/copyright.html. + Copyright © 2016-2023 Unicode, Inc. - Permission is hereby granted, free of charge, to any person obtaining - a copy of the Unicode data files and any associated documentation - (the "Data Files") or Unicode software and any associated documentation - (the "Software") to deal in the Data Files or Software - without restriction, including without limitation the rights to use, - copy, modify, merge, publish, distribute, and/or sell copies of - the Data Files or Software, and to permit persons to whom the Data Files - or Software are furnished to do so, provided that either - (a) this copyright and permission notice appear with all copies - of the Data Files or Software, or - (b) this copyright and permission notice appear in associated - Documentation. - - THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF - ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE - WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT OF THIRD PARTY RIGHTS. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS - NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL - DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THE DATA FILES OR SOFTWARE. + NOTICE TO USER: Carefully read the following legal agreement. BY + DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR + SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE + TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT + DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. - Except as contained in this notice, the name of a copyright holder - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in these Data Files or Software without prior - written authorization of the copyright holder. + Permission is hereby granted, free of charge, to any person obtaining a + copy of data files and any associated documentation (the "Data Files") or + software and any associated documentation (the "Software") to deal in the + Data Files or Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, and/or sell + copies of the Data Files or Software, and to permit persons to whom the + Data Files or Software are furnished to do so, provided that either (a) + this copyright and permission notice appear with all copies of the Data + Files or Software, or (b) this copyright and permission notice appear in + associated Documentation. + + THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY + KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + THIRD PARTY RIGHTS. + + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE + BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, + OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA + FILES OR SOFTWARE. + + Except as contained in this notice, the name of a copyright holder shall + not be used in advertising or otherwise to promote the sale, use or other + dealings in these Data Files or Software without prior written + authorization of the copyright holder. ---------------------------------------------------------------------- @@ -1281,9 +1285,9 @@ The externally maintained libraries used by Node.js are: - zlib, located at deps/zlib, is licensed as follows: """ zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.13.1, October xxth, 2022 + version 1.3.0.1, August xxth, 2023 - Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler + Copyright (C) 1995-2023 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -1305,6 +1309,211 @@ The externally maintained libraries used by Node.js are: jloup@gzip.org madler@alumni.caltech.edu """ +- simdjson, located at deps/simdjson, is licensed as follows: + """ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018-2023 The simdjson authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + """ + - simdutf, located at deps/simdutf, is licensed as follows: """ Copyright 2021 The simdutf authors @@ -1763,6 +1972,35 @@ The externally maintained libraries used by Node.js are: OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ +- gypi_to_gn.py, located at tools/gypi_to_gn.py, is licensed as follows: + """ + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + """ + - ESLint, located at tools/node_modules/eslint, is licensed as follows: """ Copyright OpenJS Foundation and other contributors, @@ -2142,9 +2380,9 @@ The externally maintained libraries used by Node.js are: - base64, located at deps/base64/base64/, is licensed as follows: """ Copyright (c) 2005-2007, Nick Galbreath - Copyright (c) 2013-2019, Alfred Klomp - Copyright (c) 2015-2017, Wojciech Mula + Copyright (c) 2015-2018, Wojciech Muła Copyright (c) 2016-2017, Matthieu Darbois + Copyright (c) 2013-2022, Alfred Klomp All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/README.md b/README.md index 46f118d31c4cfa..8cfddba3b61b56 100644 --- a/README.md +++ b/README.md @@ -165,15 +165,13 @@ For information about the governance of the Node.js project, see * [aduh95](https://github.com/aduh95) - **Antoine du Hamel** <> (he/him) * [anonrig](https://github.com/anonrig) - - **Yagiz Nizipli** <> (he/him) + **Yagiz Nizipli** <> (he/him) * [apapirovski](https://github.com/apapirovski) - **Anatoli Papirovski** <> (he/him) * [benjamingr](https://github.com/benjamingr) - **Benjamin Gruenbaum** <> * [BridgeAR](https://github.com/BridgeAR) - **Ruben Bridgewater** <> (he/him) -* [cjihrig](https://github.com/cjihrig) - - **Colin Ihrig** <> (he/him) * [GeoffreyBooth](https://github.com/geoffreybooth) - **Geoffrey Booth** <> (he/him) * [gireeshpunathil](https://github.com/gireeshpunathil) - @@ -204,8 +202,6 @@ For information about the governance of the Node.js project, see **Michaël Zasso** <> (he/him) * [tniessen](https://github.com/tniessen) - **Tobias Nießen** <> (he/him) -* [Trott](https://github.com/Trott) - - **Rich Trott** <> (he/him) #### TSC regular members @@ -215,6 +211,8 @@ For information about the governance of the Node.js project, see **Ben Noordhuis** <> * [ChALkeR](https://github.com/ChALkeR) - **Сковорода Никита Андреевич** <> (he/him) +* [cjihrig](https://github.com/cjihrig) - + **Colin Ihrig** <> (he/him) * [codebytere](https://github.com/codebytere) - **Shelley Vohr** <> (she/her) * [danbev](https://github.com/danbev) - @@ -233,6 +231,8 @@ For information about the governance of the Node.js project, see **Rod Vagg** <> * [TimothyGu](https://github.com/TimothyGu) - **Tiancheng "Timothy" Gu** <> (he/him) +* [Trott](https://github.com/Trott) - + **Rich Trott** <> (he/him)
@@ -288,7 +288,7 @@ For information about the governance of the Node.js project, see * [aduh95](https://github.com/aduh95) - **Antoine du Hamel** <> (he/him) * [anonrig](https://github.com/anonrig) - - **Yagiz Nizipli** <> (he/him) + **Yagiz Nizipli** <> (he/him) * [antsmartian](https://github.com/antsmartian) - **Anto Aravinth** <> (he/him) * [apapirovski](https://github.com/apapirovski) - @@ -341,12 +341,14 @@ For information about the governance of the Node.js project, see **Adrian Estrada** <> (he/him) * [erickwendel](https://github.com/erickwendel) - **Erick Wendel** <> (he/him) +* [Ethan-Arrowood](https://github.com/Ethan-Arrowood) - + **Ethan Arrowood** <> (he/him) * [fhinkel](https://github.com/fhinkel) - **Franziska Hinkelmann** <> (she/her) * [F3n67u](https://github.com/F3n67u) - **Feng Yu** <> (he/him) * [Flarna](https://github.com/Flarna) - - **Gerhard Stöbich** <> (he/they) + **Gerhard Stöbich** <> (he/they) * [gabrielschulhof](https://github.com/gabrielschulhof) - **Gabriel Schulhof** <> * [gengjiawen](https://github.com/gengjiawen) - @@ -357,14 +359,14 @@ For information about the governance of the Node.js project, see **Gireesh Punathil** <> (he/him) * [guybedford](https://github.com/guybedford) - **Guy Bedford** <> (he/him) +* [H4ad](https://github.com/H4ad) - + **Vinícius Lourenço Claro Cardoso** <> (he/him) * [HarshithaKP](https://github.com/HarshithaKP) - **Harshitha K P** <> (she/her) * [himself65](https://github.com/himself65) - **Zeyu "Alex" Yang** <> (he/him) * [iansu](https://github.com/iansu) - **Ian Sutherland** <> -* [JacksonTian](https://github.com/JacksonTian) - - **Jackson Tian** <> * [JakobJingleheimer](https://github.com/JakobJingleheimer) - **Jacob Smith** <> (he/him) * [jasnell](https://github.com/jasnell) - @@ -415,6 +417,8 @@ For information about the governance of the Node.js project, see **Alba Mendez** <> (she/her) * [MoLow](https://github.com/MoLow) - **Moshe Atlow** <> (he/him) +* [MrJithil](https://github.com/MrJithil) - + **Jithil P Ponnan** <> (he/him) * [mscdex](https://github.com/mscdex) - **Brian White** <> * [MylesBorins](https://github.com/MylesBorins) - @@ -563,6 +567,8 @@ For information about the governance of the Node.js project, see **Isaac Z. Schlueter** <> * [italoacasas](https://github.com/italoacasas) - **Italo A. Casas** <> (he/him) +* [JacksonTian](https://github.com/JacksonTian) - + **Jackson Tian** <> * [jasongin](https://github.com/jasongin) - **Jason Ginchereau** <> * [jbergstroem](https://github.com/jbergstroem) - @@ -709,6 +715,8 @@ maintaining the Node.js project. **Qingyu Deng** <> * [bmuenzenmeyer](https://github.com/bmuenzenmeyer) - **Brian Muenzenmeyer** <> (he/him) +* [CanadaHonk](https://github.com/CanadaHonk) - + **Oliver Medhurst** <> (they/them) * [daeyeon](https://github.com/daeyeon) - **Daeyeon Jeong** <> (he/him) * [F3n67u](https://github.com/F3n67u) - diff --git a/SECURITY.md b/SECURITY.md index 85c185df6006cb..f5b17eb626987d 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -124,6 +124,8 @@ lead to a loss of confidentiality, integrity, or availability. end being on the local machine or remote. 6. The file system when requiring a module. See . +7. The `node:wasi` module does not currently provide the comprehensive file + system security properties provided by some WASI runtimes. Any unexpected behavior from the data manipulation from Node.js Internal functions may be considered a vulnerability if they are exploitable via diff --git a/benchmark/blob/clone.js b/benchmark/blob/clone.js index 7f66255ad9da0c..39890672fc66f8 100644 --- a/benchmark/blob/clone.js +++ b/benchmark/blob/clone.js @@ -7,14 +7,17 @@ const assert = require('assert'); const bench = common.createBenchmark(main, { n: [50e3], + bytes: [128, 1024, 1024 ** 2], }); let _cloneResult; -function main({ n }) { +function main({ n, bytes }) { + const buff = Buffer.allocUnsafe(bytes); + const blob = new Blob(buff); bench.start(); for (let i = 0; i < n; ++i) - _cloneResult = structuredClone(new Blob(['hello'])); + _cloneResult = structuredClone(blob); bench.end(n); // Avoid V8 deadcode (elimination) diff --git a/benchmark/buffers/buffer-base64-decode.js b/benchmark/buffers/buffer-base64-decode.js index 4a8ed4466df413..f98e621c2dd836 100644 --- a/benchmark/buffers/buffer-base64-decode.js +++ b/benchmark/buffers/buffer-base64-decode.js @@ -15,7 +15,15 @@ function main({ n, size }) { assert.strictEqual(s.length % 4, 0); const b = Buffer.allocUnsafe(encodedSize); b.write(s, 0, encodedSize, 'base64'); + + let tmp; + bench.start(); - for (let i = 0; i < n; i += 1) b.base64Write(s, 0, s.length); + + for (let i = 0; i < n; i += 1) + tmp = b.base64Write(s, 0, s.length); + bench.end(n); + + assert.strictEqual(tmp, encodedSize); } diff --git a/benchmark/buffers/buffer-base64-encode.js b/benchmark/buffers/buffer-base64-encode.js index 0571f3181ae4e2..99f633b65fd871 100644 --- a/benchmark/buffers/buffer-base64-encode.js +++ b/benchmark/buffers/buffer-base64-encode.js @@ -21,6 +21,7 @@ 'use strict'; const common = require('../common.js'); +const assert = require('assert'); const bench = common.createBenchmark(main, { len: [64 * 1024 * 1024], @@ -35,7 +36,15 @@ function main({ n, len }) { let i; for (i = 0; i < 256; ++i) s += String.fromCharCode(i); for (i = 0; i < len; i += 256) b.write(s, i, 256, 'ascii'); + + let tmp; + bench.start(); - for (i = 0; i < n; ++i) b.toString('base64'); + + for (i = 0; i < n; ++i) + tmp = b.toString('base64'); + bench.end(n); + + assert.strictEqual(typeof tmp, 'string'); } diff --git a/benchmark/buffers/buffer-base64url-decode.js b/benchmark/buffers/buffer-base64url-decode.js new file mode 100644 index 00000000000000..276dfc8d23b543 --- /dev/null +++ b/benchmark/buffers/buffer-base64url-decode.js @@ -0,0 +1,29 @@ +'use strict'; +const assert = require('assert'); +const common = require('../common.js'); + +const bench = common.createBenchmark(main, { + n: [32], + size: [8 << 20], +}); + +function main({ n, size }) { + const s = 'abcd'.repeat(size); + const encodedSize = s.length * 3 / 4; + // eslint-disable-next-line node-core/no-unescaped-regexp-dot + s.match(/./); // Flatten string. + assert.strictEqual(s.length % 4, 0); + const b = Buffer.allocUnsafe(encodedSize); + b.write(s, 0, encodedSize, 'base64url'); + + let tmp; + + bench.start(); + + for (let i = 0; i < n; i += 1) + tmp = b.base64Write(s, 0, s.length); + + bench.end(n); + + assert.strictEqual(tmp, encodedSize); +} diff --git a/benchmark/buffers/buffer-base64url-encode.js b/benchmark/buffers/buffer-base64url-encode.js new file mode 100644 index 00000000000000..cb4ea28c29d005 --- /dev/null +++ b/benchmark/buffers/buffer-base64url-encode.js @@ -0,0 +1,29 @@ +'use strict'; +const common = require('../common.js'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + len: [64 * 1024 * 1024], + n: [32], +}, { + test: { len: 256 }, +}); + +function main({ n, len }) { + const b = Buffer.allocUnsafe(len); + let s = ''; + let i; + for (i = 0; i < 256; ++i) s += String.fromCharCode(i); + for (i = 0; i < len; i += 256) b.write(s, i, 256, 'ascii'); + + let tmp; + + bench.start(); + + for (i = 0; i < n; ++i) + tmp = b.toString('base64url'); + + bench.end(n); + + assert.strictEqual(typeof tmp, 'string'); +} diff --git a/benchmark/buffers/buffer-bytelength-string.js b/benchmark/buffers/buffer-bytelength-string.js index fc0c005e7f9e6a..143da0215a613b 100644 --- a/benchmark/buffers/buffer-bytelength-string.js +++ b/benchmark/buffers/buffer-bytelength-string.js @@ -2,7 +2,8 @@ const common = require('../common'); const bench = common.createBenchmark(main, { - type: ['one_byte', 'two_bytes', 'three_bytes', 'four_bytes'], + type: ['one_byte', 'two_bytes', 'three_bytes', + 'four_bytes', 'latin1'], encoding: ['utf8', 'base64'], repeat: [1, 2, 16, 256], // x16 n: [4e6], @@ -14,6 +15,8 @@ const chars = { two_bytes: 'ΰαβγδεζηθικλμνξο', three_bytes: '挰挱挲挳挴挵挶挷挸挹挺挻挼挽挾挿', four_bytes: '𠜎𠜱𠝹𠱓𠱸𠲖𠳏𠳕𠴕𠵼𠵿𠸎𠸏𠹷𠺝𠺢', + latin1: 'Un homme sage est supérieur à toutes ' + + 'les insultes qui peuvent lui être adressées, et la meilleure réponse est la patience et la modération.', }; function getInput(type, repeat, encoding) { diff --git a/benchmark/buffers/buffer-hex-decode.js b/benchmark/buffers/buffer-hex-decode.js new file mode 100644 index 00000000000000..4d4db07238c630 --- /dev/null +++ b/benchmark/buffers/buffer-hex-decode.js @@ -0,0 +1,29 @@ +'use strict'; + +const common = require('../common.js'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + len: [64, 1024], + n: [1e6], +}); + +function main({ len, n }) { + const buf = Buffer.alloc(len); + + for (let i = 0; i < buf.length; i++) + buf[i] = i & 0xff; + + const plain = buf; + + bench.start(); + + let tmp; + + for (let i = 0; i < n; i += 1) + tmp = plain.toString('hex'); + + bench.end(n); + + assert.strictEqual(typeof tmp, 'string'); +} diff --git a/benchmark/buffers/buffer-hex.js b/benchmark/buffers/buffer-hex-encode.js similarity index 74% rename from benchmark/buffers/buffer-hex.js rename to benchmark/buffers/buffer-hex-encode.js index 6e61d71c9bacf1..d038ce95f0aec8 100644 --- a/benchmark/buffers/buffer-hex.js +++ b/benchmark/buffers/buffer-hex-encode.js @@ -1,6 +1,7 @@ 'use strict'; const common = require('../common.js'); +const assert = require('assert'); const bench = common.createBenchmark(main, { len: [64, 1024], @@ -14,11 +15,14 @@ function main({ len, n }) { buf[i] = i & 0xff; const hex = buf.toString('hex'); + let tmp; bench.start(); for (let i = 0; i < n; i += 1) - Buffer.from(hex, 'hex'); + tmp = Buffer.from(hex, 'hex'); bench.end(n); + + assert.strictEqual(typeof tmp, 'object'); } diff --git a/benchmark/crypto/aes-gcm-throughput.js b/benchmark/crypto/aes-gcm-throughput.js index 0ac88f6e6ee5ea..cf249c6b6d832a 100644 --- a/benchmark/crypto/aes-gcm-throughput.js +++ b/benchmark/crypto/aes-gcm-throughput.js @@ -3,7 +3,7 @@ const common = require('../common.js'); const crypto = require('crypto'); const keylen = { 'aes-128-gcm': 16, 'aes-192-gcm': 24, 'aes-256-gcm': 32 }; const bench = common.createBenchmark(main, { - n: [500], + n: [2500], cipher: ['aes-128-gcm', 'aes-192-gcm', 'aes-256-gcm'], len: [1024, 4 * 1024, 16 * 1024, 64 * 1024, 256 * 1024, 1024 * 1024], }); diff --git a/benchmark/crypto/cipher-stream.js b/benchmark/crypto/cipher-stream.js deleted file mode 100644 index 4e794f7afdbaac..00000000000000 --- a/benchmark/crypto/cipher-stream.js +++ /dev/null @@ -1,101 +0,0 @@ -'use strict'; -const common = require('../common.js'); - -const bench = common.createBenchmark(main, { - writes: [500], - cipher: ['AES192', 'AES256'], - type: ['asc', 'utf', 'buf'], - len: [2, 1024, 102400, 1024 * 1024], - api: ['legacy', 'stream'], -}, { - flags: ['--no-warnings'], -}); - -function main({ api, cipher, type, len, writes }) { - if (api === 'stream' && /^v0\.[0-8]\./.test(process.version)) { - console.error('Crypto streams not available until v0.10'); - // Use the legacy, just so that we can compare them. - api = 'legacy'; - } - - const crypto = require('crypto'); - const assert = require('assert'); - const alice = crypto.getDiffieHellman('modp5'); - const bob = crypto.getDiffieHellman('modp5'); - - alice.generateKeys(); - bob.generateKeys(); - - const pubEnc = /^v0\.[0-8]/.test(process.version) ? 'binary' : null; - const alice_secret = alice.computeSecret(bob.getPublicKey(), pubEnc, 'hex'); - const bob_secret = bob.computeSecret(alice.getPublicKey(), pubEnc, 'hex'); - - // alice_secret and bob_secret should be the same - assert(alice_secret === bob_secret); - - const alice_cipher = crypto.createCipher(cipher, alice_secret); - const bob_cipher = crypto.createDecipher(cipher, bob_secret); - - let message; - let encoding; - switch (type) { - case 'asc': - message = 'a'.repeat(len); - encoding = 'ascii'; - break; - case 'utf': - message = 'ü'.repeat(len / 2); - encoding = 'utf8'; - break; - case 'buf': - message = Buffer.alloc(len, 'b'); - break; - default: - throw new Error(`unknown message type: ${type}`); - } - - const fn = api === 'stream' ? streamWrite : legacyWrite; - - // Write data as fast as possible to alice, and have bob decrypt. - // use old API for comparison to v0.8 - bench.start(); - fn(alice_cipher, bob_cipher, message, encoding, writes); -} - -function streamWrite(alice, bob, message, encoding, writes) { - let written = 0; - bob.on('data', (c) => { - written += c.length; - }); - - bob.on('end', () => { - // Gbits - const bits = written * 8; - const gbits = bits / (1024 * 1024 * 1024); - bench.end(gbits); - }); - - alice.pipe(bob); - - while (writes-- > 0) - alice.write(message, encoding); - - alice.end(); -} - -function legacyWrite(alice, bob, message, encoding, writes) { - let written = 0; - let enc, dec; - for (let i = 0; i < writes; i++) { - enc = alice.update(message, encoding); - dec = bob.update(enc); - written += dec.length; - } - enc = alice.final(); - dec = bob.update(enc); - written += dec.length; - dec = bob.final(); - written += dec.length; - const gbits = written / (1024 * 1024 * 1024); - bench.end(gbits); -} diff --git a/benchmark/crypto/create-hash.js b/benchmark/crypto/create-hash.js new file mode 100644 index 00000000000000..119534d5c24f83 --- /dev/null +++ b/benchmark/crypto/create-hash.js @@ -0,0 +1,22 @@ +'use strict'; + +const common = require('../common.js'); +const { createHash } = require('crypto'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [1e5], +}); + +function main({ n }) { + const array = []; + for (let i = 0; i < n; ++i) { + array.push(null); + } + bench.start(); + for (let i = 0; i < n; ++i) { + array[i] = createHash('sha1'); + } + bench.end(n); + assert.strictEqual(typeof array[n - 1], 'object'); +} diff --git a/benchmark/crypto/get-ciphers.js b/benchmark/crypto/get-ciphers.js index 0ace9b49820db8..e3cd955a983dd2 100644 --- a/benchmark/crypto/get-ciphers.js +++ b/benchmark/crypto/get-ciphers.js @@ -3,7 +3,7 @@ const common = require('../common.js'); const bench = common.createBenchmark(main, { - n: [1, 5000], + n: [1, 500000], v: ['crypto', 'tls'], }); diff --git a/benchmark/crypto/hkdf.js b/benchmark/crypto/hkdf.js index 61ae33cac0a0f6..98aa83594e2278 100644 --- a/benchmark/crypto/hkdf.js +++ b/benchmark/crypto/hkdf.js @@ -14,7 +14,7 @@ const bench = common.createBenchmark(main, { salt: ['', 'salt'], info: ['', 'info'], hash: ['sha256', 'sha512'], - n: [1e3], + n: [1e4], }); function measureSync(n, size, salt, info, hash, key) { diff --git a/benchmark/crypto/randomBytes.js b/benchmark/crypto/randomBytes.js index 50ad3f08387566..a47080a017d250 100644 --- a/benchmark/crypto/randomBytes.js +++ b/benchmark/crypto/randomBytes.js @@ -3,14 +3,21 @@ const common = require('../common.js'); const { randomBytes } = require('crypto'); +// Add together with imports +const assert = require('assert'); + +let _cryptoResult; + const bench = common.createBenchmark(main, { - size: [64, 1024, 8192, 512 * 1024], - n: [1e3], + size: [64, 1024, 8 * 1024, 16 * 1024], + n: [1e5], }); function main({ n, size }) { bench.start(); for (let i = 0; i < n; ++i) - randomBytes(size); + _cryptoResult = randomBytes(size); bench.end(n); + // Avoid V8 deadcode (elimination) + assert.ok(_cryptoResult); } diff --git a/benchmark/crypto/webcrypto-digest.js b/benchmark/crypto/webcrypto-digest.js index e2e6f55c6fdd1f..f5ef8e6bc49385 100644 --- a/benchmark/crypto/webcrypto-digest.js +++ b/benchmark/crypto/webcrypto-digest.js @@ -8,7 +8,7 @@ const bench = common.createBenchmark(main, { sync: ['createHash', 'subtle'], data: [10, 20, 50, 100], method: ['SHA-1', 'SHA-256', 'SHA-384', 'SHA-512'], - n: [1e3], + n: [1e5], }); const kMethods = { diff --git a/benchmark/error/hidestackframes-noerr.js b/benchmark/error/hidestackframes-noerr.js new file mode 100644 index 00000000000000..9e662f6a620f13 --- /dev/null +++ b/benchmark/error/hidestackframes-noerr.js @@ -0,0 +1,62 @@ +'use strict'; + +const common = require('../common.js'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + type: [ + 'hide-stackframes', + 'direct-call', + ], + n: [1e7], +}, { + flags: ['--expose-internals'], +}); + +function main({ n, type }) { + const { + hideStackFrames, + codes: { + ERR_INVALID_ARG_TYPE, + }, + } = require('internal/errors'); + + const testfn = (value) => { + if (typeof value !== 'number') { + throw new ERR_INVALID_ARG_TYPE('Benchmark', 'number', value); + } + }; + + const hideStackFramesTestfn = hideStackFrames((value) => { + if (typeof value !== 'number') { + throw new ERR_INVALID_ARG_TYPE.HideStackFrameError('Benchmark', 'number', value); + } + }); + + const fn = type === 'hide-stackframe' ? hideStackFramesTestfn : testfn; + + const value = 42; + + const length = 1024; + const array = []; + const errCase = false; + + for (let i = 0; i < length; ++i) { + array.push(fn(value)); + } + + bench.start(); + + for (let i = 0; i < n; i++) { + const index = i % length; + array[index] = fn(value); + } + + bench.end(n); + + // Verify the entries to prevent dead code elimination from making + // the benchmark invalid. + for (let i = 0; i < length; ++i) { + assert.strictEqual(typeof array[i], errCase ? 'object' : 'undefined'); + } +} diff --git a/benchmark/error/hidestackframes-throw.js b/benchmark/error/hidestackframes-throw.js new file mode 100644 index 00000000000000..c7147e39ba57a3 --- /dev/null +++ b/benchmark/error/hidestackframes-throw.js @@ -0,0 +1,87 @@ +'use strict'; + +const common = require('../common.js'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + type: [ + 'hide-stackframes', + 'direct-call', + ], + double: ['true', 'false'], + n: [1e5], +}, { + flags: ['--expose-internals'], +}); + +function main({ n, type, double }) { + const { + hideStackFrames, + codes: { + ERR_INVALID_ARG_TYPE, + }, + } = require('internal/errors'); + + const value = 'err'; + + const testfn = (value) => { + if (typeof value !== 'number') { + throw new ERR_INVALID_ARG_TYPE('Benchmark', 'number', value); + } + }; + + const hideStackFramesTestfn = hideStackFrames((value) => { + if (typeof value !== 'number') { + throw new ERR_INVALID_ARG_TYPE.HideStackFrameError('Benchmark', 'number', value); + } + }); + + function doubleTestfn(value) { + testfn(value); + } + + const doubleHideStackFramesTestfn = hideStackFrames((value) => { + hideStackFramesTestfn.withoutStackTrace(value); + }); + + const fn = type === 'hide-stackframe' ? + double === 'true' ? + doubleHideStackFramesTestfn : + hideStackFramesTestfn : + double === 'true' ? + doubleTestfn : + testfn; + + const length = 1024; + const array = []; + let errCase = false; + + // Warm up. + for (let i = 0; i < length; ++i) { + try { + fn(value); + } catch (e) { + errCase = true; + array.push(e); + } + } + + bench.start(); + + for (let i = 0; i < n; i++) { + const index = i % length; + try { + fn(value); + } catch (e) { + array[index] = e; + } + } + + bench.end(n); + + // Verify the entries to prevent dead code elimination from making + // the benchmark invalid. + for (let i = 0; i < length; ++i) { + assert.strictEqual(typeof array[i], errCase ? 'object' : 'undefined'); + } +} diff --git a/benchmark/error/hidestackframes.js b/benchmark/error/hidestackframes.js deleted file mode 100644 index b28be725a30969..00000000000000 --- a/benchmark/error/hidestackframes.js +++ /dev/null @@ -1,45 +0,0 @@ -'use strict'; - -const common = require('../common.js'); - -const bench = common.createBenchmark(main, { - type: ['hide-stackframes-throw', 'direct-call-throw', - 'hide-stackframes-noerr', 'direct-call-noerr'], - n: [10e4], -}, { - flags: ['--expose-internals'], -}); - -function main({ n, type }) { - const { - hideStackFrames, - codes: { - ERR_INVALID_ARG_TYPE, - }, - } = require('internal/errors'); - - const testfn = (value) => { - if (typeof value !== 'number') { - throw new ERR_INVALID_ARG_TYPE('Benchmark', 'number', value); - } - }; - - let fn = testfn; - if (type.startsWith('hide-stackframe')) - fn = hideStackFrames(testfn); - let value = 42; - if (type.endsWith('-throw')) - value = 'err'; - - bench.start(); - - for (let i = 0; i < n; i++) { - try { - fn(value); - } catch { - // No-op - } - } - - bench.end(n); -} diff --git a/benchmark/error/system-error-instantiation.js b/benchmark/error/system-error-instantiation.js new file mode 100644 index 00000000000000..0ecdc36a357086 --- /dev/null +++ b/benchmark/error/system-error-instantiation.js @@ -0,0 +1,64 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [1e6], + code: [ + 'built-in', + 'ERR_FS_CP_DIR_TO_NON_DIR', + ], + stackTraceLimit: [0, 10], +}, { + flags: ['--expose-internals'], +}); + +function getErrorFactory(code) { + const { + ERR_FS_CP_DIR_TO_NON_DIR, + } = require('internal/errors').codes; + + switch (code) { + case 'built-in': + return (n) => new Error(); + case 'ERR_FS_CP_DIR_TO_NON_DIR': + return (n) => new ERR_FS_CP_DIR_TO_NON_DIR({ + message: 'cannot overwrite directory', + path: 'dest', + syscall: 'cp', + errno: 21, + code: 'EISDIR', + }); + default: + throw new Error(`${code} not supported`); + } +} + +function main({ n, code, stackTraceLimit }) { + const getError = getErrorFactory(code); + + Error.stackTraceLimit = stackTraceLimit; + + // Warm up. + const length = 1024; + const array = []; + for (let i = 0; i < length; ++i) { + array.push(getError(i)); + } + + bench.start(); + + for (let i = 0; i < n; ++i) { + const index = i % length; + array[index] = getError(index); + } + + bench.end(n); + + // Verify the entries to prevent dead code elimination from making + // the benchmark invalid. + for (let i = 0; i < length; ++i) { + assert.strictEqual(typeof array[i], 'object'); + } +} diff --git a/benchmark/es/string-concatenations.js b/benchmark/es/string-concatenations.js index 3c0b27e05019d1..4f9d56cc69df84 100644 --- a/benchmark/es/string-concatenations.js +++ b/benchmark/es/string-concatenations.js @@ -3,7 +3,7 @@ const common = require('../common.js'); const configs = { - n: [1e3], + n: [1e6], mode: [ 'multi-concat', 'multi-join', diff --git a/benchmark/esm/detect-esm-syntax.js b/benchmark/esm/detect-esm-syntax.js new file mode 100644 index 00000000000000..dfc347225f32d6 --- /dev/null +++ b/benchmark/esm/detect-esm-syntax.js @@ -0,0 +1,37 @@ +'use strict'; + +// This benchmarks the cost of running `containsModuleSyntax` on a CommonJS module being imported. +// We use the TypeScript fixture because it's a very large CommonJS file with no ESM syntax: the worst case. +const common = require('../common.js'); +const tmpdir = require('../../test/common/tmpdir.js'); +const fixtures = require('../../test/common/fixtures.js'); +const scriptPath = fixtures.path('snapshot', 'typescript.js'); +const fs = require('node:fs'); + +const bench = common.createBenchmark(main, { + type: ['with-module-syntax-detection', 'without-module-syntax-detection'], + n: [1e4], +}, { + flags: ['--experimental-detect-module'], +}); + +const benchmarkDirectory = tmpdir.fileURL('benchmark-detect-esm-syntax'); +const ambiguousURL = new URL('./typescript.js', benchmarkDirectory); +const explicitURL = new URL('./typescript.cjs', benchmarkDirectory); + +async function main({ n, type }) { + tmpdir.refresh(); + + fs.mkdirSync(benchmarkDirectory, { recursive: true }); + fs.cpSync(scriptPath, ambiguousURL); + fs.cpSync(scriptPath, explicitURL); + + bench.start(); + + for (let i = 0; i < n; i++) { + const url = type === 'with-module-syntax-detection' ? ambiguousURL : explicitURL; + await import(url); + } + + bench.end(n); +} diff --git a/benchmark/esm/import-meta.js b/benchmark/esm/import-meta.js new file mode 100644 index 00000000000000..fd371cf60ed6a3 --- /dev/null +++ b/benchmark/esm/import-meta.js @@ -0,0 +1,32 @@ +'use strict'; + +const path = require('path'); +const { pathToFileURL, fileURLToPath } = require('url'); +const common = require('../common'); +const assert = require('assert'); +const bench = common.createBenchmark(main, { + n: [1000], +}); + +const file = pathToFileURL( + path.resolve(__filename, '../../fixtures/esm-dir-file.mjs'), +); +async function load(array, n) { + for (let i = 0; i < n; i++) { + array[i] = await import(`${file}?i=${i}`); + } + return array; +} + +function main({ n }) { + const array = []; + for (let i = 0; i < n; ++i) { + array.push({ dirname: '', filename: '', i: 0 }); + } + + bench.start(); + load(array, n).then((arr) => { + bench.end(n); + assert.strictEqual(arr[n - 1].filename, fileURLToPath(file)); + }); +} diff --git a/benchmark/fixtures/esm-dir-file.mjs b/benchmark/fixtures/esm-dir-file.mjs new file mode 100644 index 00000000000000..a1028d57afd56b --- /dev/null +++ b/benchmark/fixtures/esm-dir-file.mjs @@ -0,0 +1,2 @@ +export const dirname = import.meta.dirname; +export const filename = import.meta.filename; diff --git a/benchmark/fixtures/require-builtins.js b/benchmark/fixtures/require-builtins.js index 685eef1875b301..872c6aa302c70e 100644 --- a/benchmark/fixtures/require-builtins.js +++ b/benchmark/fixtures/require-builtins.js @@ -23,7 +23,6 @@ const list = [ 'path', 'perf_hooks', 'process', - 'punycode', 'querystring', 'readline', 'repl', diff --git a/benchmark/fs/bench-chownSync.js b/benchmark/fs/bench-chownSync.js new file mode 100644 index 00000000000000..d07f3b65949979 --- /dev/null +++ b/benchmark/fs/bench-chownSync.js @@ -0,0 +1,54 @@ +'use strict'; + +const common = require('../common'); +const fs = require('fs'); +const assert = require('assert'); +const tmpdir = require('../../test/common/tmpdir'); + +if (process.platform === 'win32') { + console.log('Skipping: Windows does not have `getuid` or `getgid`'); + process.exit(0); +} + +const bench = common.createBenchmark(main, { + type: ['existing', 'non-existing'], + method: ['chownSync', 'lchownSync'], + n: [1e4], +}); + +function main({ n, type, method }) { + const uid = process.getuid(); + const gid = process.getgid(); + const fsMethod = fs[method]; + + switch (type) { + case 'existing': { + tmpdir.refresh(); + const tmpfile = tmpdir.resolve(`.existing-file-${process.pid}`); + fs.writeFileSync(tmpfile, 'this-is-for-a-benchmark', 'utf8'); + bench.start(); + for (let i = 0; i < n; i++) { + fsMethod(tmpfile, uid, gid); + } + bench.end(n); + break; + } + case 'non-existing': { + const path = tmpdir.resolve(`.non-existing-file-${Date.now()}`); + let hasError = false; + bench.start(); + for (let i = 0; i < n; i++) { + try { + fs[method](path, uid, gid); + } catch { + hasError = true; + } + } + bench.end(n); + assert(hasError); + break; + } + default: + new Error('Invalid type'); + } +} diff --git a/benchmark/fs/bench-fsyncSync.js b/benchmark/fs/bench-fsyncSync.js new file mode 100644 index 00000000000000..fc7ef29266790b --- /dev/null +++ b/benchmark/fs/bench-fsyncSync.js @@ -0,0 +1,42 @@ +'use strict'; + +const common = require('../common'); +const fs = require('fs'); +const tmpdir = require('../../test/common/tmpdir'); +tmpdir.refresh(); + +const tmpfile = tmpdir.resolve(`.existing-file-${process.pid}`); +fs.writeFileSync(tmpfile, 'this-is-for-a-benchmark', 'utf8'); + +const bench = common.createBenchmark(main, { + type: ['existing', 'non-existing'], + n: [1e4], +}); + +function main({ n, type }) { + let fd; + + switch (type) { + case 'existing': + fd = fs.openSync(tmpfile, 'r', 0o666); + break; + case 'non-existing': + fd = 1 << 30; + break; + default: + new Error('Invalid type'); + } + + bench.start(); + for (let i = 0; i < n; i++) { + try { + fs.fsyncSync(fd); + } catch { + // do nothing + } + } + + bench.end(n); + + if (type === 'existing') fs.closeSync(fd); +} diff --git a/benchmark/fs/bench-linkSync.js b/benchmark/fs/bench-linkSync.js new file mode 100644 index 00000000000000..7c3ef29291913e --- /dev/null +++ b/benchmark/fs/bench-linkSync.js @@ -0,0 +1,50 @@ +'use strict'; + +const common = require('../common'); +const fs = require('fs'); +const assert = require('assert'); +const tmpdir = require('../../test/common/tmpdir'); + +tmpdir.refresh(); +const tmpfile = tmpdir.resolve(`.bench-file-data-${Date.now()}`); +fs.writeFileSync(tmpfile, 'bench-file', 'utf-8'); + +const bench = common.createBenchmark(main, { + type: ['valid', 'invalid'], + n: [1e3], +}); + +function main({ n, type }) { + switch (type) { + case 'valid': { + bench.start(); + for (let i = 0; i < n; i++) { + fs.linkSync(tmpfile, tmpdir.resolve(`.valid-${i}`), 'file'); + } + bench.end(n); + + break; + } + + case 'invalid': { + let hasError = false; + bench.start(); + for (let i = 0; i < n; i++) { + try { + fs.linkSync( + tmpdir.resolve(`.non-existing-file-for-linkSync-${i}`), + __filename, + 'file', + ); + } catch { + hasError = true; + } + } + bench.end(n); + assert(hasError); + break; + } + default: + new Error('Invalid type'); + } +} diff --git a/benchmark/fs/bench-mkdirSync.js b/benchmark/fs/bench-mkdirSync.js new file mode 100644 index 00000000000000..1db1c587877671 --- /dev/null +++ b/benchmark/fs/bench-mkdirSync.js @@ -0,0 +1,44 @@ +'use strict'; + +const common = require('../common'); +const fs = require('fs'); +const tmpdir = require('../../test/common/tmpdir'); +tmpdir.refresh(); + +const bench = common.createBenchmark(main, { + type: ['existing', 'non-existing'], + recursive: ['true', 'false'], + n: [1e3], +}); + +function main({ n, type, recursive }) { + recursive = recursive === 'true'; + let files; + + switch (type) { + case 'non-existing': + files = []; + + // Populate tmpdir with target dirs + for (let i = 0; i < n; i++) { + const path = tmpdir.resolve(recursive ? `rmdirsync-bench-dir-${process.pid}-${i}/a/b/c` : `rmdirsync-bench-dir-${process.pid}-${i}`); + files.push(path); + } + break; + case 'existing': + files = new Array(n).fill(__dirname); + break; + default: + new Error('Invalid type'); + } + + bench.start(); + for (let i = 0; i < n; i++) { + try { + fs.mkdirSync(files[i], { recursive }); + } catch { + // do nothing + } + } + bench.end(n); +} diff --git a/benchmark/fs/bench-mkdtempSync.js b/benchmark/fs/bench-mkdtempSync.js new file mode 100644 index 00000000000000..afb342366bbfdf --- /dev/null +++ b/benchmark/fs/bench-mkdtempSync.js @@ -0,0 +1,43 @@ +'use strict'; + +const common = require('../common'); +const fs = require('fs'); +const assert = require('assert'); +const tmpdir = require('../../test/common/tmpdir'); + +const bench = common.createBenchmark(main, { + type: ['valid-string', 'valid-buffer', 'invalid'], + n: [1e4], +}); + +function main({ n, type }) { + tmpdir.refresh(); + const options = { encoding: 'utf8' }; + let prefix; + let out = true; + + switch (type) { + case 'valid-string': + prefix = tmpdir.resolve(`${Date.now()}`); + break; + case 'valid-buffer': + prefix = Buffer.from(tmpdir.resolve(`${Date.now()}`)); + break; + case 'invalid': + prefix = tmpdir.resolve('non-existent', 'foo', 'bar'); + break; + default: + new Error('Invalid type'); + } + + bench.start(); + for (let i = 0; i < n; i++) { + try { + out = fs.mkdtempSync(prefix, options); + } catch { + // do nothing + } + } + bench.end(n); + assert.ok(out); +} diff --git a/benchmark/fs/bench-readSync.js b/benchmark/fs/bench-readSync.js new file mode 100644 index 00000000000000..a75d1750002f94 --- /dev/null +++ b/benchmark/fs/bench-readSync.js @@ -0,0 +1,57 @@ +'use strict'; + +const common = require('../common'); +const fs = require('fs'); +const tmpdir = require('../../test/common/tmpdir'); +tmpdir.refresh(); + +const bufferSize = 1024; +const sectorSize = 512; + +const bench = common.createBenchmark(main, { + type: ['existing', 'non-existing'], + n: [1e4], +}); + +function main({ n, type }) { + let fd; + + const tmpfile = { name: tmpdir.resolve(`.existing-file-${process.pid}`), + len: bufferSize * n }; + + + tmpfile.contents = Buffer.allocUnsafe(tmpfile.len); + + for (let offset = 0; offset < tmpfile.len; offset += sectorSize) { + const fillByte = 256 * Math.random(); + const nBytesToFill = Math.min(sectorSize, tmpfile.len - offset); + tmpfile.contents.fill(fillByte, offset, offset + nBytesToFill); + } + + fs.writeFileSync(tmpfile.name, tmpfile.contents); + + switch (type) { + case 'existing': + fd = fs.openSync(tmpfile.name, 'r', 0o666); + break; + case 'non-existing': + fd = 1 << 30; + break; + default: + new Error('Invalid type'); + } + + const buffer = Buffer.alloc(bufferSize); + + bench.start(); + for (let i = 0; i < n; i++) { + try { + fs.readSync(fd, buffer); + } catch { + // Continue regardless of error. + } + } + bench.end(n); + + if (type === 'existing') fs.closeSync(fd); +} diff --git a/benchmark/fs/bench-readlinkSync.js b/benchmark/fs/bench-readlinkSync.js new file mode 100644 index 00000000000000..15c22273e557b6 --- /dev/null +++ b/benchmark/fs/bench-readlinkSync.js @@ -0,0 +1,54 @@ +'use strict'; + +const common = require('../common'); +const fs = require('fs'); +const assert = require('assert'); +const tmpdir = require('../../test/common/tmpdir'); + +if (process.platform === 'win32') { + console.log('Skipping: Windows does not play well with `symlinkSync`'); + process.exit(0); +} + +const bench = common.createBenchmark(main, { + type: ['valid', 'invalid'], + n: [1e3], +}); + +function main({ n, type }) { + switch (type) { + case 'valid': { + tmpdir.refresh(); + const tmpfile = tmpdir.resolve(`.readlink-file-${process.pid}`); + fs.writeFileSync(tmpfile, 'data', 'utf8'); + let returnValue; + for (let i = 0; i < n; i++) { + fs.symlinkSync(tmpfile, tmpdir.resolve(`.readlink-sync-${i}`), 'file'); + } + bench.start(); + for (let i = 0; i < n; i++) { + returnValue = fs.readlinkSync(tmpdir.resolve(`.readlink-sync-${i}`), { encoding: 'utf8' }); + } + bench.end(n); + assert(returnValue); + break; + } + + case 'invalid': { + let hasError = false; + bench.start(); + for (let i = 0; i < n; i++) { + try { + fs.readlinkSync(tmpdir.resolve('.non-existing-file-for-readlinkSync')); + } catch { + hasError = true; + } + } + bench.end(n); + assert(hasError); + break; + } + default: + new Error('Invalid type'); + } +} diff --git a/benchmark/fs/bench-readvSync.js b/benchmark/fs/bench-readvSync.js new file mode 100644 index 00000000000000..c163429b5f6212 --- /dev/null +++ b/benchmark/fs/bench-readvSync.js @@ -0,0 +1,58 @@ +'use strict'; + +const common = require('../common'); +const fs = require('fs'); +const assert = require('assert'); +const tmpdir = require('../../test/common/tmpdir'); +tmpdir.refresh(); + +const exptectedBuff = Buffer.from('Benchmark Data'); +const expectedLength = exptectedBuff.length; + +const bufferArr = [Buffer.alloc(expectedLength)]; + +const filename = tmpdir.resolve('readv_sync.txt'); +fs.writeFileSync(filename, exptectedBuff); + +const bench = common.createBenchmark(main, { + type: ['valid', 'invalid'], + n: [1e5], +}); + +function main({ n, type }) { + let fd; + let result; + + switch (type) { + case 'valid': + fd = fs.openSync(filename, 'r'); + + bench.start(); + for (let i = 0; i < n; i++) { + result = fs.readvSync(fd, bufferArr, 0); + } + + bench.end(n); + assert.strictEqual(result, expectedLength); + fs.closeSync(fd); + break; + case 'invalid': { + fd = 1 << 30; + let hasError = false; + bench.start(); + for (let i = 0; i < n; i++) { + try { + result = fs.readvSync(fd, bufferArr, 0); + } catch { + hasError = true; + } + } + + bench.end(n); + assert(hasError); + break; + } + default: + throw new Error('Invalid type'); + } +} diff --git a/benchmark/fs/bench-renameSync.js b/benchmark/fs/bench-renameSync.js new file mode 100644 index 00000000000000..9f9f5e4e84cda0 --- /dev/null +++ b/benchmark/fs/bench-renameSync.js @@ -0,0 +1,49 @@ +'use strict'; + +const common = require('../common'); +const fs = require('fs'); +const assert = require('assert'); +const tmpdir = require('../../test/common/tmpdir'); + +const bench = common.createBenchmark(main, { + type: ['invalid', 'valid'], + n: [2e3], +}); + +function main({ n, type }) { + switch (type) { + case 'invalid': { + let hasError = false; + bench.start(); + for (let i = 0; i < n; i++) { + try { + fs.renameSync(tmpdir.resolve(`.non-existing-file-${i}`), tmpdir.resolve(`.new-file-${i}`)); + } catch { + hasError = true; + } + } + bench.end(n); + assert(hasError); + break; + } + case 'valid': { + tmpdir.refresh(); + for (let i = 0; i < n; i++) { + fs.writeFileSync(tmpdir.resolve(`.existing-file-${i}`), 'bench', 'utf8'); + } + + bench.start(); + for (let i = 0; i < n; i++) { + fs.renameSync( + tmpdir.resolve(`.existing-file-${i}`), + tmpdir.resolve(`.new-existing-file-${i}`), + ); + } + + bench.end(n); + break; + } + default: + throw new Error('Invalid type'); + } +} diff --git a/benchmark/fs/bench-rmdirSync.js b/benchmark/fs/bench-rmdirSync.js new file mode 100644 index 00000000000000..48103439274371 --- /dev/null +++ b/benchmark/fs/bench-rmdirSync.js @@ -0,0 +1,42 @@ +'use strict'; + +const common = require('../common'); +const fs = require('fs'); +const tmpdir = require('../../test/common/tmpdir'); +tmpdir.refresh(); + +const bench = common.createBenchmark(main, { + type: ['existing', 'non-existing'], + n: [1e4], +}); + +function main({ n, type }) { + switch (type) { + case 'existing': { + for (let i = 0; i < n; i++) { + fs.mkdirSync(tmpdir.resolve(`rmdirsync-bench-dir-${i}`)); + } + + bench.start(); + for (let i = 0; i < n; i++) { + fs.rmdirSync(tmpdir.resolve(`rmdirsync-bench-dir-${i}`)); + } + bench.end(n); + break; + } + case 'non-existing': { + bench.start(); + for (let i = 0; i < n; i++) { + try { + fs.rmdirSync(tmpdir.resolve(`.non-existent-folder-${i}`)); + } catch { + // do nothing + } + } + bench.end(n); + break; + } + default: + new Error('Invalid type'); + } +} diff --git a/benchmark/fs/bench-statSync-failure.js b/benchmark/fs/bench-statSync-failure.js index de6128d8fc1845..b1005a78a7f6e0 100644 --- a/benchmark/fs/bench-statSync-failure.js +++ b/benchmark/fs/bench-statSync-failure.js @@ -5,21 +5,29 @@ const fs = require('fs'); const path = require('path'); const bench = common.createBenchmark(main, { - n: [1e6], - statSyncType: ['throw', 'noThrow'], + n: [1e4], + statSyncType: ['fstatSync', 'lstatSync', 'statSync'], + throwType: [ 'throw', 'noThrow' ], +}, { + // fstatSync does not support throwIfNoEntry + combinationFilter: ({ statSyncType, throwType }) => !(statSyncType === 'fstatSync' && throwType === 'noThrow'), }); -function main({ n, statSyncType }) { - const arg = path.join(__dirname, 'non.existent'); +function main({ n, statSyncType, throwType }) { + const arg = (statSyncType === 'fstatSync' ? + (1 << 30) : + path.join(__dirname, 'non.existent')); + + const fn = fs[statSyncType]; bench.start(); for (let i = 0; i < n; i++) { - if (statSyncType === 'noThrow') { - fs.statSync(arg, { throwIfNoEntry: false }); + if (throwType === 'noThrow') { + fn(arg, { throwIfNoEntry: false }); } else { try { - fs.statSync(arg); + fn(arg); } catch { // Continue regardless of error. } diff --git a/benchmark/fs/bench-statSync.js b/benchmark/fs/bench-statSync.js index 4ec2e860fb6ba7..e6680fe7cb85fe 100644 --- a/benchmark/fs/bench-statSync.js +++ b/benchmark/fs/bench-statSync.js @@ -4,7 +4,7 @@ const common = require('../common'); const fs = require('fs'); const bench = common.createBenchmark(main, { - n: [1e6], + n: [1e4], statSyncType: ['fstatSync', 'lstatSync', 'statSync'], }); diff --git a/benchmark/fs/bench-symlinkSync.js b/benchmark/fs/bench-symlinkSync.js new file mode 100644 index 00000000000000..5bf4e0e50779d9 --- /dev/null +++ b/benchmark/fs/bench-symlinkSync.js @@ -0,0 +1,51 @@ +'use strict'; + +const common = require('../common'); +const fs = require('fs'); +const assert = require('assert'); +const tmpdir = require('../../test/common/tmpdir'); + +if (process.platform === 'win32') { + console.log('Skipping: Windows does not play well with `symlink`'); + process.exit(0); +} + +const bench = common.createBenchmark(main, { + type: ['valid', 'invalid'], + n: [1e3], +}); + +function main({ n, type }) { + switch (type) { + case 'valid': { + tmpdir.refresh(); + bench.start(); + for (let i = 0; i < n; i++) { + fs.symlinkSync(tmpdir.resolve('.non-existent-symlink-file'), tmpdir.resolve(`.valid-${i}`), 'file'); + } + bench.end(n); + break; + } + + case 'invalid': { + let hasError = false; + bench.start(); + for (let i = 0; i < n; i++) { + try { + fs.symlinkSync( + tmpdir.resolve('.non-existent-symlink-file'), + __filename, + 'file', + ); + } catch { + hasError = true; + } + } + bench.end(n); + assert(hasError); + break; + } + default: + new Error('Invalid type'); + } +} diff --git a/benchmark/fs/bench-writeFileSync.js b/benchmark/fs/bench-writeFileSync.js new file mode 100644 index 00000000000000..29c16f4aa2a12d --- /dev/null +++ b/benchmark/fs/bench-writeFileSync.js @@ -0,0 +1,43 @@ +'use strict'; + +const common = require('../common.js'); +const fs = require('fs'); +const tmpdir = require('../../test/common/tmpdir'); +tmpdir.refresh(); + +// Some variants are commented out as they do not show a change and just slow +const bench = common.createBenchmark(main, { + encoding: ['utf8'], + useFd: ['true', 'false'], + length: [1024, 102400, 1024 * 1024], + + // useBuffer: ['true', 'false'], + useBuffer: ['false'], + + // func: ['appendFile', 'writeFile'], + func: ['writeFile'], + + n: [1e3], +}); + +function main({ n, func, encoding, length, useFd, useBuffer }) { + tmpdir.refresh(); + const enc = encoding === 'undefined' ? undefined : encoding; + const path = tmpdir.resolve(`.writefilesync-file-${Date.now()}`); + + useFd = useFd === 'true'; + const file = useFd ? fs.openSync(path, 'w') : path; + + let data = 'a'.repeat(length); + if (useBuffer === 'true') data = Buffer.from(data, encoding); + + const fn = fs[func + 'Sync']; + + bench.start(); + for (let i = 0; i < n; ++i) { + fn(file, data, enc); + } + bench.end(n); + + if (useFd) fs.closeSync(file); +} diff --git a/benchmark/misc/startup-cli-version.js b/benchmark/misc/startup-cli-version.js new file mode 100644 index 00000000000000..4dbeb81fc70740 --- /dev/null +++ b/benchmark/misc/startup-cli-version.js @@ -0,0 +1,57 @@ +'use strict'; +const common = require('../common.js'); +const { spawnSync } = require('child_process'); +const { existsSync } = require('fs'); +const path = require('path'); + +// This benchmarks the startup of various CLI tools that are already +// checked into the source code. We use --version because the output +// tends to be minimal and fewer operations are done to generate +// these so that the startup cost is still dominated by a more +// indispensible part of the CLI. +const bench = common.createBenchmark(main, { + cli: [ + 'tools/node_modules/eslint/bin/eslint.js', + 'deps/npm/bin/npx-cli.js', + 'deps/npm/bin/npm-cli.js', + 'deps/corepack/dist/corepack.js', + ], + count: [30], +}); + +function spawnProcess(cli, bench, state) { + const cmd = process.execPath || process.argv[0]; + while (state.finished < state.count) { + const child = spawnSync(cmd, [cli, '--version'], { + env: { npm_config_loglevel: 'silent', ...process.env }, + }); + // Log some information for debugging if it fails, which it shouldn't. + if (child.status !== 0) { + console.log('---- STDOUT ----'); + console.log(child.stdout.toString()); + console.log('---- STDERR ----'); + console.log(child.stderr.toString()); + throw new Error(`Child process stopped with exit code ${child.status}`); + } + state.finished++; + if (state.finished === 0) { + // Finished warmup. + bench.start(); + } + + if (state.finished === state.count) { + bench.end(state.count); + } + } +} + +function main({ count, cli }) { + cli = path.resolve(__dirname, '../../', cli); + if (!existsSync(cli)) { + return; + } + + const warmup = 3; + const state = { count, finished: -warmup }; + spawnProcess(cli, bench, state); +} diff --git a/benchmark/misc/structured-clone.js b/benchmark/misc/structured-clone.js new file mode 100644 index 00000000000000..257671df44b07f --- /dev/null +++ b/benchmark/misc/structured-clone.js @@ -0,0 +1,46 @@ +'use strict'; + +const common = require('../common.js'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + type: ['string', 'object', 'arraybuffer'], + n: [1e4], +}); + +function main({ n, type }) { + const data = []; + + switch (type) { + case 'string': + for (let i = 0; i < n; ++i) { + data.push(new Date().toISOString()); + } + break; + case 'object': + for (let i = 0; i < n; ++i) { + data.push({ ...process.config }); + } + break; + case 'arraybuffer': + for (let i = 0; i < n; ++i) { + data.push(new ArrayBuffer(10)); + } + break; + default: + throw new Error('Unsupported payload type'); + } + + const run = type === 'arraybuffer' ? (i) => { + data[i] = structuredClone(data[i], { transfer: [ data[i] ] }); + } : (i) => { + data[i] = structuredClone(data[i]); + }; + + bench.start(); + for (let i = 0; i < n; ++i) { + run(i); + } + bench.end(n); + assert.strictEqual(data.length, n); +} diff --git a/benchmark/os/uptime.js b/benchmark/os/uptime.js index 2f25dfe670b722..9826107c69d039 100644 --- a/benchmark/os/uptime.js +++ b/benchmark/os/uptime.js @@ -1,14 +1,21 @@ 'use strict'; +const os = require('os'); const common = require('../common.js'); -const uptime = require('os').uptime; const assert = require('assert'); +const uptime = os.uptime; + const bench = common.createBenchmark(main, { n: [1e5], }); function main({ n }) { + if (os.type() === 'OS400') { + console.log('Skipping: os.uptime is not implemented on IBMi'); + process.exit(0); + } + // Warm up. const length = 1024; const array = []; diff --git a/benchmark/perf_hooks/histogram-clone.js b/benchmark/perf_hooks/histogram-clone.js new file mode 100644 index 00000000000000..4b610963fa2a0a --- /dev/null +++ b/benchmark/perf_hooks/histogram-clone.js @@ -0,0 +1,24 @@ +'use strict'; + +const assert = require('assert'); +const common = require('../common.js'); + +const { createHistogram } = require('perf_hooks'); + +const bench = common.createBenchmark(main, { + n: [1e5], +}); + +let _histogram; + +function main({ n }) { + const histogram = createHistogram(); + + bench.start(); + for (let i = 0; i < n; i++) + _histogram = structuredClone(histogram); + bench.end(n); + + // Avoid V8 deadcode (elimination) + assert.ok(_histogram); +} diff --git a/benchmark/perf_hooks/histogram-create.js b/benchmark/perf_hooks/histogram-create.js new file mode 100644 index 00000000000000..89ddad1fa79224 --- /dev/null +++ b/benchmark/perf_hooks/histogram-create.js @@ -0,0 +1,22 @@ +'use strict'; + +const assert = require('assert'); +const common = require('../common.js'); + +const { createHistogram } = require('perf_hooks'); + +const bench = common.createBenchmark(main, { + n: [1e5], +}); + +let _histogram; + +function main({ n }) { + bench.start(); + for (let i = 0; i < n; i++) + _histogram = createHistogram(); + bench.end(n); + + // Avoid V8 deadcode (elimination) + assert.ok(_histogram); +} diff --git a/benchmark/perf_hooks/histogram-record.js b/benchmark/perf_hooks/histogram-record.js new file mode 100644 index 00000000000000..c3f7e89e171b1b --- /dev/null +++ b/benchmark/perf_hooks/histogram-record.js @@ -0,0 +1,26 @@ +'use strict'; + +const assert = require('assert'); +const common = require('../common.js'); + +const { createHistogram } = require('perf_hooks'); + +const bench = common.createBenchmark(main, { + n: [1e5], +}); + +function main({ n }) { + const histogram = createHistogram(); + bench.start(); + for (let i = 0; i < n; i++) { + histogram.record(i + 1); + /* eslint-disable no-unused-expressions */ + histogram.max; + histogram.mean; + /* eslint-enable no-unused-expressions */ + } + bench.end(n); + + // Avoid V8 deadcode (elimination) + assert.ok(histogram); +} diff --git a/benchmark/perf_hooks/now.js b/benchmark/perf_hooks/now.js new file mode 100644 index 00000000000000..7132196c430125 --- /dev/null +++ b/benchmark/perf_hooks/now.js @@ -0,0 +1,23 @@ +'use strict'; + +const assert = require('assert'); +const common = require('../common.js'); + +const bench = common.createBenchmark(main, { + n: [1e6], +}); + +function main({ n }) { + const arr = []; + for (let i = 0; i < n; ++i) { + arr.push(performance.now()); + } + + bench.start(); + for (let i = 0; i < n; i++) { + arr[i] = performance.now(); + } + bench.end(n); + + assert.strictEqual(arr.length, n); +} diff --git a/benchmark/perf_hooks/performance-observer.js b/benchmark/perf_hooks/performance-observer.js index 42a94932860c38..d943c4547e0431 100644 --- a/benchmark/perf_hooks/performance-observer.js +++ b/benchmark/perf_hooks/performance-observer.js @@ -13,7 +13,7 @@ function randomFn() { } const bench = common.createBenchmark(main, { - n: [1e5], + n: [1e6], pending: [1, 10], }, { options: ['--expose-internals'], diff --git a/benchmark/perf_hooks/resourcetiming.js b/benchmark/perf_hooks/resourcetiming.js index 51c4778d20065f..69ee06c92cbd9f 100644 --- a/benchmark/perf_hooks/resourcetiming.js +++ b/benchmark/perf_hooks/resourcetiming.js @@ -50,7 +50,7 @@ function createTimingInfo({ } const bench = common.createBenchmark(main, { - n: [1e5], + n: [1e6], observe: ['resource'], }); diff --git a/benchmark/perf_hooks/timerfied.js b/benchmark/perf_hooks/timerfied.js index 50be0a47fc1b5a..f1cc62637187dd 100644 --- a/benchmark/perf_hooks/timerfied.js +++ b/benchmark/perf_hooks/timerfied.js @@ -13,7 +13,7 @@ function randomFn() { } const bench = common.createBenchmark(main, { - n: [1e5], + n: [1e6], observe: ['function'], }); diff --git a/benchmark/perf_hooks/usertiming.js b/benchmark/perf_hooks/usertiming.js index 24a53a116785df..92017861d58c4a 100644 --- a/benchmark/perf_hooks/usertiming.js +++ b/benchmark/perf_hooks/usertiming.js @@ -8,7 +8,7 @@ const { } = require('perf_hooks'); const bench = common.createBenchmark(main, { - n: [1e5], + n: [1e6], observe: ['all', 'measure'], }); diff --git a/benchmark/permission/permission-fs-read.js b/benchmark/permission/permission-processhas-fs-read.js similarity index 100% rename from benchmark/permission/permission-fs-read.js rename to benchmark/permission/permission-processhas-fs-read.js diff --git a/benchmark/streams/readable-bigread.js b/benchmark/streams/readable-bigread.js index 0d963c6803299e..8b36f49d7ffa53 100644 --- a/benchmark/streams/readable-bigread.js +++ b/benchmark/streams/readable-bigread.js @@ -15,7 +15,7 @@ function main({ n }) { bench.start(); for (let k = 0; k < n; ++k) { - for (let i = 0; i < 1e4; ++i) + for (let i = 0; i < 1e3; ++i) s.push(b); while (s.read(128)); } diff --git a/benchmark/streams/readable-from.js b/benchmark/streams/readable-from.js index 2dcf10ffef2732..c3990d20f988db 100644 --- a/benchmark/streams/readable-from.js +++ b/benchmark/streams/readable-from.js @@ -5,15 +5,58 @@ const Readable = require('stream').Readable; const bench = common.createBenchmark(main, { n: [1e7], + type: ['array', 'sync-generator-with-sync-values', 'sync-generator-with-async-values', 'async-generator'], }); -async function main({ n }) { - const arr = []; - for (let i = 0; i < n; i++) { - arr.push(`${i}`); +async function main({ n, type }) { + let fromArg; + + switch (type) { + case 'array': { + fromArg = []; + for (let i = 0; i < n; i++) { + fromArg.push(`${i}`); + } + + break; + } + + case 'sync-generator-with-sync-values': { + fromArg = (function* () { + for (let i = 0; i < n; i++) { + yield `${i}`; + } + })(); + + break; + } + + case 'sync-generator-with-async-values': { + fromArg = (function* () { + for (let i = 0; i < n; i++) { + yield Promise.resolve(`${i}`); + } + })(); + + break; + } + + case 'async-generator': { + fromArg = (async function* () { + for (let i = 0; i < n; i++) { + yield `${i}`; + } + })(); + + break; + } + + default: { + throw new Error(`Unknown type: ${type}`); + } } - const s = new Readable.from(arr); + const s = new Readable.from(fromArg); bench.start(); s.on('data', (data) => { diff --git a/benchmark/streams/readable-readall.js b/benchmark/streams/readable-readall.js index b62b1d05b13876..c1a015a4d02716 100644 --- a/benchmark/streams/readable-readall.js +++ b/benchmark/streams/readable-readall.js @@ -15,7 +15,7 @@ function main({ n }) { bench.start(); for (let k = 0; k < n; ++k) { - for (let i = 0; i < 1e4; ++i) + for (let i = 0; i < 1e3; ++i) s.push(b); while (s.read()); } diff --git a/benchmark/url/usvstring.js b/benchmark/url/usvstring.js deleted file mode 100644 index 93a50846fb999f..00000000000000 --- a/benchmark/url/usvstring.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict'; -const common = require('../common.js'); - -const inputs = { - valid: 'adsfadsfadsf', - validsurr: '\uda23\ude23\uda1f\udfaa\ud800\udfff\uda23\ude23\uda1f\udfaa' + - '\ud800\udfff', - someinvalid: 'asasfdfasd\uda23', - allinvalid: '\udc45\uda23 \udf00\udc00 \udfaa\uda12 \udc00\udfaa', - nonstring: { toString() { return 'asdf'; } }, -}; -const bench = common.createBenchmark(main, { - input: Object.keys(inputs), - n: [5e7], -}, { - flags: ['--expose-internals'], -}); - -function main({ input, n }) { - const { toUSVString } = require('internal/url'); - const str = inputs[input]; - - bench.start(); - for (let i = 0; i < n; i++) - toUSVString(str); - bench.end(n); -} diff --git a/benchmark/util/format.js b/benchmark/util/format.js index 4078fe5e3da7cd..dfbb6c3372a23b 100644 --- a/benchmark/util/format.js +++ b/benchmark/util/format.js @@ -18,7 +18,7 @@ const inputs = { }; const bench = common.createBenchmark(main, { - n: [1e5], + n: [1e6], type: Object.keys(inputs), }); diff --git a/benchmark/util/inspect-array.js b/benchmark/util/inspect-array.js index 7b2394d80e9cfe..ed40f5c4324ac3 100644 --- a/benchmark/util/inspect-array.js +++ b/benchmark/util/inspect-array.js @@ -4,7 +4,7 @@ const common = require('../common'); const util = require('util'); const bench = common.createBenchmark(main, { - n: [5e2], + n: [5e3], len: [1e2, 1e5], type: [ 'denseArray', diff --git a/benchmark/util/inspect.js b/benchmark/util/inspect.js index ace4e588ae5135..8e453b9e226ee8 100644 --- a/benchmark/util/inspect.js +++ b/benchmark/util/inspect.js @@ -9,7 +9,7 @@ const opts = { none: undefined, }; const bench = common.createBenchmark(main, { - n: [2e4], + n: [8e4], method: [ 'Object', 'Object_empty', diff --git a/benchmark/util/normalize-encoding.js b/benchmark/util/normalize-encoding.js index cd65caca4a4056..204ea67c54ce1a 100644 --- a/benchmark/util/normalize-encoding.js +++ b/benchmark/util/normalize-encoding.js @@ -21,7 +21,7 @@ const inputs = [ const bench = common.createBenchmark(main, { input: inputs.concat(Object.keys(groupedInputs)), - n: [1e5], + n: [1e6], }, { flags: '--expose-internals', }); diff --git a/benchmark/util/splice-one.js b/benchmark/util/splice-one.js index 6a5a634640add4..211e4fad571835 100644 --- a/benchmark/util/splice-one.js +++ b/benchmark/util/splice-one.js @@ -3,7 +3,7 @@ const common = require('../common'); const bench = common.createBenchmark(main, { - n: [1e5], + n: [5e6], pos: ['start', 'middle', 'end'], size: [10, 100, 500], }, { flags: ['--expose-internals'] }); diff --git a/benchmark/util/text-decoder.js b/benchmark/util/text-decoder.js index f85dd4db008ed8..dd4f02016df077 100644 --- a/benchmark/util/text-decoder.js +++ b/benchmark/util/text-decoder.js @@ -6,8 +6,8 @@ const bench = common.createBenchmark(main, { encoding: ['utf-8', 'latin1', 'iso-8859-3'], ignoreBOM: [0, 1], fatal: [0, 1], - len: [256, 1024 * 16, 1024 * 512], - n: [1e2], + len: [256, 1024 * 16, 1024 * 128], + n: [1e3], type: ['SharedArrayBuffer', 'ArrayBuffer', 'Buffer'], }); diff --git a/benchmark/util/to-usv-string.js b/benchmark/util/to-usv-string.js deleted file mode 100644 index 22d23d3198d124..00000000000000 --- a/benchmark/util/to-usv-string.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict'; - -const common = require('../common'); - -const BASE = 'string\ud801'; - -const bench = common.createBenchmark(main, { - n: [1e5], - size: [10, 100, 500], -}); - -function main({ n, size }) { - const { toUSVString } = require('util'); - const str = BASE.repeat(size); - - bench.start(); - for (let i = 0; i < n; i++) { - toUSVString(str); - } - bench.end(n); -} diff --git a/benchmark/util/type-check.js b/benchmark/util/type-check.js index 2bb956f4ed87ee..269c2a4e9c1374 100644 --- a/benchmark/util/type-check.js +++ b/benchmark/util/type-check.js @@ -29,7 +29,7 @@ const bench = common.createBenchmark(main, { type: Object.keys(args), version: ['native', 'js'], argument: ['true', 'false-primitive', 'false-object'], - n: [1e5], + n: [1e6], }, { flags: ['--expose-internals', '--no-warnings'], }); diff --git a/benchmark/mime/to-ascii-lower.js b/benchmark/validators/parse-file-mode.js similarity index 65% rename from benchmark/mime/to-ascii-lower.js rename to benchmark/validators/parse-file-mode.js index 93a4a14dc6d96b..5e3819fc4229a9 100644 --- a/benchmark/mime/to-ascii-lower.js +++ b/benchmark/validators/parse-file-mode.js @@ -6,18 +6,26 @@ const assert = require('assert'); const bench = common.createBenchmark(main, { n: [1e7], value: [ - 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', - 'UPPERCASE', - 'lowercase', - 'mixedCase', + "'777'", + '0o777', ], }, { flags: ['--expose-internals'], }); +function getParseFactory() { + const { + parseFileMode, + } = require('internal/validators'); + + return (n) => parseFileMode(n, 'n'); +} + function main({ n, value }) { + const parse = getParseFactory(); + + value = value === "'777'" ? '777' : 0o777; - const toASCIILower = require('internal/mime').toASCIILower; // Warm up. const length = 1024; const array = []; @@ -25,20 +33,19 @@ function main({ n, value }) { for (let i = 0; i < length; ++i) { try { - array.push(toASCIILower(value)); + array.push(parse(value)); } catch (e) { errCase = true; array.push(e); } } - // console.log(`errCase: ${errCase}`); bench.start(); for (let i = 0; i < n; ++i) { const index = i % length; try { - array[index] = toASCIILower(value); + array[index] = parse(value); } catch (e) { array[index] = e; } @@ -49,6 +56,6 @@ function main({ n, value }) { // Verify the entries to prevent dead code elimination from making // the benchmark invalid. for (let i = 0; i < length; ++i) { - assert.strictEqual(typeof array[i], errCase ? 'object' : 'string'); + assert.strictEqual(typeof array[i], errCase ? 'object' : 'number'); } } diff --git a/benchmark/mime/parse-type-and-subtype.js b/benchmark/validators/validate-array.js similarity index 57% rename from benchmark/mime/parse-type-and-subtype.js rename to benchmark/validators/validate-array.js index 4b91dc1db6ab24..28f7b42102d198 100644 --- a/benchmark/mime/parse-type-and-subtype.js +++ b/benchmark/validators/validate-array.js @@ -6,18 +6,33 @@ const assert = require('assert'); const bench = common.createBenchmark(main, { n: [1e7], value: [ - 'application/ecmascript; ', - 'text/html;charset=gbk', - // eslint-disable-next-line max-len - 'text/html;0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789=x;charset=gbk', + '[]', + '[1,2,3]', ], }, { flags: ['--expose-internals'], }); +function getValidateFactory() { + const { + validateArray, + } = require('internal/validators'); + + return (n) => validateArray(n, 'n'); +} + function main({ n, value }) { + const validate = getValidateFactory(); + + switch (value) { + case '[]': + value = []; + break; + case '[1,2,3]': + value = [1, 2, 3]; + break; + } - const parseTypeAndSubtype = require('internal/mime').parseTypeAndSubtype; // Warm up. const length = 1024; const array = []; @@ -25,19 +40,19 @@ function main({ n, value }) { for (let i = 0; i < length; ++i) { try { - array.push(parseTypeAndSubtype(value)); + array.push(validate(value)); } catch (e) { errCase = true; array.push(e); } } - // console.log(`errCase: ${errCase}`); bench.start(); + for (let i = 0; i < n; ++i) { const index = i % length; try { - array[index] = parseTypeAndSubtype(value); + array[index] = validate(value); } catch (e) { array[index] = e; } @@ -48,6 +63,6 @@ function main({ n, value }) { // Verify the entries to prevent dead code elimination from making // the benchmark invalid. for (let i = 0; i < length; ++i) { - assert.strictEqual(typeof array[i], errCase ? 'object' : 'object'); + assert.strictEqual(typeof array[i], errCase ? 'object' : 'undefined'); } } diff --git a/benchmark/validators/validate-boolean.js b/benchmark/validators/validate-boolean.js new file mode 100644 index 00000000000000..24c2202b4fb743 --- /dev/null +++ b/benchmark/validators/validate-boolean.js @@ -0,0 +1,55 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [1e8], + code: [ + 'validateBoolean', + ], + value: [ + 'true', + 'false', + ], +}, { + flags: ['--expose-internals'], +}); + +function getValidateFactory(code) { + const { + validateBoolean, + } = require('internal/validators'); + + switch (code) { + case 'validateBoolean': + return (n) => validateBoolean(n, 'n'); + } +} + +function main({ n, code, value }) { + const validate = getValidateFactory(code); + const v = value === 'true'; + + // Warm up. + const length = 1024; + const array = []; + for (let i = 0; i < length; ++i) { + array.push(validate(v)); + } + + bench.start(); + + for (let i = 0; i < n; ++i) { + const index = i % length; + array[index] = validate(v); + } + + bench.end(n); + + // Verify the entries to prevent dead code elimination from making + // the benchmark invalid. + for (let i = 0; i < length; ++i) { + assert.strictEqual(typeof array[i], 'undefined'); + } +} diff --git a/benchmark/validators/validate-encoding.js b/benchmark/validators/validate-encoding.js new file mode 100644 index 00000000000000..7bb6d8b0cba969 --- /dev/null +++ b/benchmark/validators/validate-encoding.js @@ -0,0 +1,59 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [1e8], + encoding: [ + 'ascii', + 'utf8', + 'utf-8', + 'utf16le', + 'ucs2', + 'ucs-2', + 'base64', + 'latin1', + 'binary', + 'hex', + ], + value: [ + 'test', + ], +}, { + flags: ['--expose-internals'], +}); + +function getValidateFactory(encoding) { + const { + validateEncoding, + } = require('internal/validators'); + + return (n) => validateEncoding(n, encoding); +} + +function main({ n, encoding, value }) { + const validate = getValidateFactory(encoding); + + // Warm up. + const length = 1024; + const array = []; + for (let i = 0; i < length; ++i) { + array.push(validate(value)); + } + + bench.start(); + + for (let i = 0; i < n; ++i) { + const index = i % length; + array[index] = validate(value); + } + + bench.end(n); + + // Verify the entries to prevent dead code elimination from making + // the benchmark invalid. + for (let i = 0; i < length; ++i) { + assert.strictEqual(typeof array[i], 'undefined'); + } +} diff --git a/benchmark/validators/validate-one-of.js b/benchmark/validators/validate-one-of.js new file mode 100644 index 00000000000000..4812cb233e239b --- /dev/null +++ b/benchmark/validators/validate-one-of.js @@ -0,0 +1,69 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [1e7], + code: [ + 'validateOneOf', + ], + value: [ + 'fifo', + 'lifo', + 'lilo', + ], + validLength: [ + 1, + 2, + 3, + ], +}, { + flags: ['--expose-internals'], +}); + +const validValues = [ + 'fifo', + 'lifo', + 'lilo', + 'filo', +]; + +function getValidateFactory(code, validLength) { + const { + validateOneOf, + } = require('internal/validators'); + + switch (code) { + case 'validateOneOf': + return (n) => validateOneOf(n, 'n', validValues.slice(0, validLength)); + } +} + +function main({ n, code, validLength }) { + const validate = getValidateFactory(code, validLength); + + // Warm up. + const length = 1024; + const array = []; + + const value = validValues[validLength - 1]; + + for (let i = 0; i < length; ++i) { + array.push(validate(value)); + } + + bench.start(); + for (let i = 0; i < n; ++i) { + const index = i % length; + array[index] = validate(value); + } + bench.end(n); + + + // Verify the entries to prevent dead code elimination from making + // the benchmark invalid. + for (let i = 0; i < length; ++i) { + assert.strictEqual(typeof array[i], 'undefined'); + } +} diff --git a/benchmark/validators/validate-x-array.js b/benchmark/validators/validate-x-array.js new file mode 100644 index 00000000000000..aaef9119f35ae1 --- /dev/null +++ b/benchmark/validators/validate-x-array.js @@ -0,0 +1,66 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [1e8], + type: [ + 'validateStringArray', + 'validateBooleanArray', + ], + arrayLength: [ + 0, + 1, + 10, + 100, + ], +}, { + flags: ['--expose-internals'], +}); + +function getValidateFactory(type, arrayLength) { + const { + validateBooleanArray, + validateStringArray, + } = require('internal/validators'); + + switch (type) { + case 'validateBooleanArray': + return [ + (n) => validateBooleanArray(n, 'n'), + Array.from({ length: arrayLength }, (v, i) => ((i & 1) === 0)), + ]; + case 'validateStringArray': + return [ + (n) => validateStringArray(n, 'n'), + Array.from({ length: arrayLength }, (v, i) => `foo${i}`), + ]; + } +} + +function main({ n, type, arrayLength }) { + const [validate, value] = getValidateFactory(type, arrayLength); + + // Warm up. + const length = 1024; + const array = []; + for (let i = 0; i < length; ++i) { + array.push(validate(value)); + } + + bench.start(); + + for (let i = 0; i < n; ++i) { + const index = i % length; + array[index] = validate(value); + } + + bench.end(n); + + // Verify the entries to prevent dead code elimination from making + // the benchmark invalid. + for (let i = 0; i < length; ++i) { + assert.strictEqual(typeof array[i], 'undefined'); + } +} diff --git a/benchmark/websocket/simple.js b/benchmark/websocket/simple.js new file mode 100644 index 00000000000000..1147602a7b1ea7 --- /dev/null +++ b/benchmark/websocket/simple.js @@ -0,0 +1,100 @@ +'use strict'; + +const common = require('../common.js'); +const crypto = require('crypto'); +const http = require('http'); +const { WebSocket } = require('../../deps/undici/undici'); + +const GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'; + +const configs = { + size: [64, 16 * 1024, 128 * 1024, 1024 * 1024], + useBinary: ['true', 'false'], + roundtrips: [5000, 1000, 100], +}; + +const bench = common.createBenchmark(main, configs); + +function createFrame(data, opcode) { + let infoLength = 2; + let payloadLength = data.length; + + if (payloadLength >= 65536) { + infoLength += 8; + payloadLength = 127; + } else if (payloadLength > 125) { + infoLength += 2; + payloadLength = 126; + } + + const info = Buffer.alloc(infoLength); + + info[0] = opcode | 0x80; + info[1] = payloadLength; + + if (payloadLength === 126) { + info.writeUInt16BE(data.length, 2); + } else if (payloadLength === 127) { + info[2] = info[3] = 0; + info.writeUIntBE(data.length, 4, 6); + } + + return Buffer.concat([info, data]); +} + +function main(conf) { + const frame = createFrame(Buffer.alloc(conf.size).fill('.'), conf.useBinary === 'true' ? 2 : 1); + const server = http.createServer(); + server.on('upgrade', (req, socket) => { + const key = crypto + .createHash('sha1') + .update(req.headers['sec-websocket-key'] + GUID) + .digest('base64'); + + let bytesReceived = 0; + let roundtrip = 0; + + socket.on('data', function onData(chunk) { + bytesReceived += chunk.length; + + if (bytesReceived === frame.length + 4) { // +4 for the mask. + // Message completely received. + bytesReceived = 0; + + if (++roundtrip === conf.roundtrips) { + socket.removeListener('data', onData); + socket.resume(); + socket.end(); + server.close(); + + bench.end(conf.roundtrips); + } else { + socket.write(frame); + } + } + }); + + socket.write( + [ + 'HTTP/1.1 101 Switching Protocols', + 'Upgrade: websocket', + 'Connection: Upgrade', + `Sec-WebSocket-Accept: ${key}`, + '\r\n', + ].join('\r\n'), + ); + + socket.write(frame); + }); + + server.listen(0, () => { + const ws = new WebSocket(`ws://localhost:${server.address().port}`); + ws.addEventListener('open', () => { + bench.start(); + }); + + ws.addEventListener('message', (event) => { + ws.send(event.data); + }); + }); +} diff --git a/common.gypi b/common.gypi index 071a27afc2fd59..b8c5cf1da767aa 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.12', + 'v8_embedder_string': '-node.19', ##### V8 defaults for Node.js ##### @@ -75,8 +75,16 @@ 'v8_win64_unwinding_info': 1, - # TODO(refack): make v8-perfetto happen + # Variables controlling external defines exposed in public headers. + 'v8_enable_conservative_stack_scanning%': 0, + 'v8_enable_direct_local%': 0, + 'v8_enable_map_packing%': 0, + 'v8_enable_pointer_compression_shared_cage%': 0, + 'v8_enable_sandbox%': 0, + 'v8_enable_v8_checks%': 0, + 'v8_enable_zone_compression%': 0, 'v8_use_perfetto': 0, + 'tsan%': 0, ##### end V8 defaults ##### @@ -134,7 +142,7 @@ }], ], }, - 'defines': [ 'DEBUG', '_DEBUG', 'V8_ENABLE_CHECKS' ], + 'defines': [ 'DEBUG', '_DEBUG' ], 'cflags': [ '-g', '-O0' ], 'conditions': [ ['OS in "aix os400"', { @@ -257,11 +265,8 @@ } }, - # Defines these mostly for node-gyp to pickup, and warn addon authors of - # imminent V8 deprecations, also to sync how dependencies are configured. + # Defines these mostly for node-gyp to pickup. 'defines': [ - 'V8_DEPRECATION_WARNINGS', - 'V8_IMMINENT_DEPRECATION_WARNINGS', '_GLIBCXX_USE_CXX11_ABI=1', ], @@ -369,15 +374,50 @@ }], ], }], + # The defines bellow must include all things from the external_v8_defines + # list in v8/BUILD.gn. + ['v8_enable_v8_checks == 1', { + 'defines': ['V8_ENABLE_CHECKS'], + }], ['v8_enable_pointer_compression == 1', { - 'defines': [ - 'V8_COMPRESS_POINTERS', - 'V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE', - ], + 'defines': ['V8_COMPRESS_POINTERS'], + }], + ['v8_enable_pointer_compression_shared_cage == 1', { + 'defines': ['V8_COMPRESS_POINTERS_IN_SHARED_CAGE'], + }], + ['v8_enable_pointer_compression == 1 and v8_enable_pointer_compression_shared_cage != 1', { + 'defines': ['V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE'], }], ['v8_enable_pointer_compression == 1 or v8_enable_31bit_smis_on_64bit_arch == 1', { 'defines': ['V8_31BIT_SMIS_ON_64BIT_ARCH'], }], + ['v8_enable_zone_compression == 1', { + 'defines': ['V8_COMPRESS_ZONES',], + }], + ['v8_enable_sandbox == 1', { + 'defines': ['V8_ENABLE_SANDBOX',], + }], + ['v8_deprecation_warnings == 1', { + 'defines': ['V8_DEPRECATION_WARNINGS',], + }], + ['v8_imminent_deprecation_warnings == 1', { + 'defines': ['V8_IMMINENT_DEPRECATION_WARNINGS',], + }], + ['v8_use_perfetto == 1', { + 'defines': ['V8_USE_PERFETTO',], + }], + ['v8_enable_map_packing == 1', { + 'defines': ['V8_MAP_PACKING',], + }], + ['tsan == 1', { + 'defines': ['V8_IS_TSAN',], + }], + ['v8_enable_conservative_stack_scanning == 1', { + 'defines': ['V8_ENABLE_CONSERVATIVE_STACK_SCANNING',], + }], + ['v8_enable_direct_local == 1', { + 'defines': ['V8_ENABLE_DIRECT_LOCAL',], + }], ['OS == "win"', { 'defines': [ 'WIN32', diff --git a/configure b/configure index fefb313c9cd13c..711a3014b9a67f 100755 --- a/configure +++ b/configure @@ -4,6 +4,7 @@ # Note that the mix of single and double quotes is intentional, # as is the fact that the ] goes on a new line. _=[ 'exec' '/bin/sh' '-c' ''' +command -v python3.12 >/dev/null && exec python3.12 "$0" "$@" command -v python3.11 >/dev/null && exec python3.11 "$0" "$@" command -v python3.10 >/dev/null && exec python3.10 "$0" "$@" command -v python3.9 >/dev/null && exec python3.9 "$0" "$@" @@ -23,7 +24,7 @@ except ImportError: from distutils.spawn import find_executable as which print('Node.js configure: Found Python {}.{}.{}...'.format(*sys.version_info)) -acceptable_pythons = ((3, 11), (3, 10), (3, 9), (3, 8), (3, 7), (3, 6)) +acceptable_pythons = ((3, 12), (3, 11), (3, 10), (3, 9), (3, 8), (3, 7), (3, 6)) if sys.version_info[:2] in acceptable_pythons: import configure else: diff --git a/configure.py b/configure.py index 8be9e9ca5c4af8..5e014bf7a75e2a 100755 --- a/configure.py +++ b/configure.py @@ -14,8 +14,6 @@ import io from pathlib import Path -from distutils.version import StrictVersion - # If not run from node/, cd to node/. os.chdir(Path(__file__).parent) @@ -30,6 +28,7 @@ sys.path.insert(0, str(tools_path / 'gyp' / 'pylib')) from gyp.common import GetFlavor +from packaging.version import Version # imports in tools/configure.d sys.path.insert(0, str(tools_path / 'configure.d')) @@ -813,6 +812,12 @@ help='Enable V8 transparent hugepage support. This feature is only '+ 'available on Linux platform.') +parser.add_argument('--v8-enable-maglev', + action='store_true', + dest='v8_enable_maglev', + default=None, + help='Enable V8 Maglev compiler. Not available on all platforms.') + parser.add_argument('--v8-enable-short-builtin-calls', action='store_true', dest='v8_enable_short_builtin_calls', @@ -1268,9 +1273,7 @@ def configure_node(o): o['variables']['want_separate_host_toolset'] = int(cross_compiling) - # Enable branch protection for arm64 if target_arch == 'arm64': - o['cflags']+=['-msign-return-address=all'] o['variables']['arm_fpu'] = options.arm_fpu or 'neon' if options.node_snapshot_main is not None: @@ -1495,10 +1498,12 @@ def configure_v8(o): o['variables']['v8_random_seed'] = 0 # Use a random seed for hash tables. o['variables']['v8_promise_internal_field_count'] = 1 # Add internal field to promises for async hooks. o['variables']['v8_use_siphash'] = 0 if options.without_siphash else 1 + o['variables']['v8_enable_maglev'] = 1 if options.v8_enable_maglev else 0 o['variables']['v8_enable_pointer_compression'] = 1 if options.enable_pointer_compression else 0 o['variables']['v8_enable_31bit_smis_on_64bit_arch'] = 1 if options.enable_pointer_compression else 0 o['variables']['v8_enable_shared_ro_heap'] = 0 if options.enable_pointer_compression or options.disable_shared_ro_heap else 1 o['variables']['v8_enable_extensible_ro_snapshot'] = 0 + o['variables']['v8_enable_v8_checks'] = 1 if options.debug else 0 o['variables']['v8_trace_maps'] = 1 if options.trace_maps else 0 o['variables']['node_use_v8_platform'] = b(not options.without_v8_platform) o['variables']['node_use_bundled_v8'] = b(not options.without_bundled_v8) @@ -1566,10 +1571,10 @@ def without_ssl_error(option): # supported asm compiler for AVX2. See https://github.com/openssl/openssl/ # blob/OpenSSL_1_1_0-stable/crypto/modes/asm/aesni-gcm-x86_64.pl#L52-L69 openssl110_asm_supported = \ - ('gas_version' in variables and StrictVersion(variables['gas_version']) >= StrictVersion('2.23')) or \ - ('xcode_version' in variables and StrictVersion(variables['xcode_version']) >= StrictVersion('5.0')) or \ - ('llvm_version' in variables and StrictVersion(variables['llvm_version']) >= StrictVersion('3.3')) or \ - ('nasm_version' in variables and StrictVersion(variables['nasm_version']) >= StrictVersion('2.10')) + ('gas_version' in variables and Version(variables['gas_version']) >= Version('2.23')) or \ + ('xcode_version' in variables and Version(variables['xcode_version']) >= Version('5.0')) or \ + ('llvm_version' in variables and Version(variables['llvm_version']) >= Version('3.3')) or \ + ('nasm_version' in variables and Version(variables['nasm_version']) >= Version('2.10')) if is_x86 and not openssl110_asm_supported: error('''Did not find a new enough assembler, install one or build with @@ -2121,6 +2126,17 @@ def make_bin_override(): gyp_args = ['--no-parallel', '-Dconfiguring_node=1'] gyp_args += ['-Dbuild_type=' + config['BUILDTYPE']] +# Remove the trailing .exe from the executable name, otherwise the python.exe +# would be rewrote as python_host.exe due to hack in GYP for supporting cross +# compilation on Windows. +# See https://github.com/nodejs/node/pull/32867 for related change. +python = sys.executable +if flavor == 'win' and python.lower().endswith('.exe'): + python = python[:-4] +# Always set 'python' variable, otherwise environments that only have python3 +# will fail to run python scripts. +gyp_args += ['-Dpython=' + python] + if options.use_ninja: gyp_args += ['-f', 'ninja-' + flavor] elif flavor == 'win' and sys.platform != 'msys': @@ -2133,10 +2149,6 @@ def make_bin_override(): os.path.islink('./compile_commands.json') and os.unlink('./compile_commands.json') os.symlink('./out/' + config['BUILDTYPE'] + '/compile_commands.json', './compile_commands.json') -# override the variable `python` defined in common.gypi -if bin_override is not None: - gyp_args += ['-Dpython=' + sys.executable] - # pass the leftover non-whitespace positional arguments to GYP gyp_args += [arg for arg in args if not str.isspace(arg)] diff --git a/deps/acorn/acorn-walk/CHANGELOG.md b/deps/acorn/acorn-walk/CHANGELOG.md index 30ec5a5eec9911..0b4eea8a95d3ed 100644 --- a/deps/acorn/acorn-walk/CHANGELOG.md +++ b/deps/acorn/acorn-walk/CHANGELOG.md @@ -1,3 +1,17 @@ +## 8.3.1 (2023-12-06) + +### Bug fixes + +Add `Function` and `Class` to the `AggregateType` type, so that they can be used in walkers without raising a type error. + +Visitor functions are now called in such a way that their `this` refers to the object they are part of. + +## 8.3.0 (2023-10-26) + +### New features + +Use a set of new, much more precise, TypeScript types. + ## 8.2.0 (2021-09-06) ### New features diff --git a/deps/acorn/acorn-walk/README.md b/deps/acorn/acorn-walk/README.md index e192baced005ac..3c18a2c76a938e 100644 --- a/deps/acorn/acorn-walk/README.md +++ b/deps/acorn/acorn-walk/README.md @@ -10,9 +10,7 @@ Acorn is open source software released under an You are welcome to [report bugs](https://github.com/acornjs/acorn/issues) or create pull -requests on [github](https://github.com/acornjs/acorn). For questions -and discussion, please use the -[Tern discussion forum](https://discuss.ternjs.net). +requests on [github](https://github.com/acornjs/acorn). ## Installation @@ -68,7 +66,7 @@ const acorn = require("acorn") const walk = require("acorn-walk") walk.ancestor(acorn.parse("foo('hi')"), { - Literal(_, ancestors) { + Literal(_node, _state, ancestors) { console.log("This literal's ancestors are:", ancestors.map(n => n.type)) } }) diff --git a/deps/acorn/acorn-walk/dist/walk.d.mts b/deps/acorn/acorn-walk/dist/walk.d.mts new file mode 100644 index 00000000000000..7bc8c9790fd1a7 --- /dev/null +++ b/deps/acorn/acorn-walk/dist/walk.d.mts @@ -0,0 +1,172 @@ +import * as acorn from "acorn" + +export type FullWalkerCallback = ( + node: acorn.Node, + state: TState, + type: string +) => void + +export type FullAncestorWalkerCallback = ( + node: acorn.Node, + state: TState, + ancestors: acorn.Node[], + type: string +) => void + +type AggregateType = { + Expression: acorn.Expression, + Statement: acorn.Statement, + Function: acorn.Function, + Class: acorn.Class, + Pattern: acorn.Pattern, + ForInit: acorn.VariableDeclaration | acorn.Expression +} + +export type SimpleVisitors = { + [type in acorn.AnyNode["type"]]?: (node: Extract, state: TState) => void +} & { + [type in keyof AggregateType]?: (node: AggregateType[type], state: TState) => void +} + +export type AncestorVisitors = { + [type in acorn.AnyNode["type"]]?: ( node: Extract, state: TState, ancestors: acorn.Node[] +) => void +} & { + [type in keyof AggregateType]?: (node: AggregateType[type], state: TState, ancestors: acorn.Node[]) => void +} + +export type WalkerCallback = (node: acorn.Node, state: TState) => void + +export type RecursiveVisitors = { + [type in acorn.AnyNode["type"]]?: ( node: Extract, state: TState, callback: WalkerCallback) => void +} & { + [type in keyof AggregateType]?: (node: AggregateType[type], state: TState, callback: WalkerCallback) => void +} + +export type FindPredicate = (type: string, node: acorn.Node) => boolean + +export interface Found { + node: acorn.Node, + state: TState +} + +/** + * does a 'simple' walk over a tree + * @param node the AST node to walk + * @param visitors an object with properties whose names correspond to node types in the {@link https://github.com/estree/estree | ESTree spec}. The properties should contain functions that will be called with the node object and, if applicable the state at that point. + * @param base a walker algorithm + * @param state a start state. The default walker will simply visit all statements and expressions and not produce a meaningful state. (An example of a use of state is to track scope at each point in the tree.) + */ +export function simple( + node: acorn.Node, + visitors: SimpleVisitors, + base?: RecursiveVisitors, + state?: TState +): void + +/** + * does a 'simple' walk over a tree, building up an array of ancestor nodes (including the current node) and passing the array to the callbacks as a third parameter. + * @param node + * @param visitors + * @param base + * @param state + */ +export function ancestor( + node: acorn.Node, + visitors: AncestorVisitors, + base?: RecursiveVisitors, + state?: TState + ): void + +/** + * does a 'recursive' walk, where the walker functions are responsible for continuing the walk on the child nodes of their target node. + * @param node + * @param state the start state + * @param functions contain an object that maps node types to walker functions + * @param base provides the fallback walker functions for node types that aren't handled in the {@link functions} object. If not given, the default walkers will be used. + */ +export function recursive( + node: acorn.Node, + state: TState, + functions: RecursiveVisitors, + base?: RecursiveVisitors +): void + +/** + * does a 'full' walk over a tree, calling the {@link callback} with the arguments (node, state, type) for each node + * @param node + * @param callback + * @param base + * @param state + */ +export function full( + node: acorn.Node, + callback: FullWalkerCallback, + base?: RecursiveVisitors, + state?: TState +): void + +/** + * does a 'full' walk over a tree, building up an array of ancestor nodes (including the current node) and passing the array to the callbacks as a third parameter. + * @param node + * @param callback + * @param base + * @param state + */ +export function fullAncestor( + node: acorn.Node, + callback: FullAncestorWalkerCallback, + base?: RecursiveVisitors, + state?: TState +): void + +/** + * builds a new walker object by using the walker functions in {@link functions} and filling in the missing ones by taking defaults from {@link base}. + * @param functions + * @param base + */ +export function make( + functions: RecursiveVisitors, + base?: RecursiveVisitors +): RecursiveVisitors + +/** + * tries to locate a node in a tree at the given start and/or end offsets, which satisfies the predicate test. {@link start} and {@link end} can be either `null` (as wildcard) or a `number`. {@link test} may be a string (indicating a node type) or a function that takes (nodeType, node) arguments and returns a boolean indicating whether this node is interesting. {@link base} and {@link state} are optional, and can be used to specify a custom walker. Nodes are tested from inner to outer, so if two nodes match the boundaries, the inner one will be preferred. + * @param node + * @param start + * @param end + * @param type + * @param base + * @param state + */ +export function findNodeAt( + node: acorn.Node, + start: number | undefined, + end?: number | undefined, + type?: FindPredicate | string, + base?: RecursiveVisitors, + state?: TState +): Found | undefined + +/** + * like {@link findNodeAt}, but will match any node that exists 'around' (spanning) the given position. + * @param node + * @param start + * @param type + * @param base + * @param state + */ +export function findNodeAround( + node: acorn.Node, + start: number | undefined, + type?: FindPredicate | string, + base?: RecursiveVisitors, + state?: TState +): Found | undefined + +/** + * similar to {@link findNodeAround}, but will match all nodes after the given position (testing outer nodes before inner nodes). + */ +export const findNodeAfter: typeof findNodeAround + +export const base: RecursiveVisitors diff --git a/deps/acorn/acorn-walk/dist/walk.d.ts b/deps/acorn/acorn-walk/dist/walk.d.ts index 2d81f01c166875..7bc8c9790fd1a7 100644 --- a/deps/acorn/acorn-walk/dist/walk.d.ts +++ b/deps/acorn/acorn-walk/dist/walk.d.ts @@ -1,114 +1,172 @@ -import {Node} from 'acorn'; - -declare module "acorn-walk" { - type FullWalkerCallback = ( - node: Node, - state: TState, - type: string - ) => void; - - type FullAncestorWalkerCallback = ( - node: Node, - state: TState | Node[], - ancestors: Node[], - type: string - ) => void; - type WalkerCallback = (node: Node, state: TState) => void; - - type SimpleWalkerFn = ( - node: Node, - state: TState - ) => void; - - type AncestorWalkerFn = ( - node: Node, - state: TState| Node[], - ancestors: Node[] - ) => void; - - type RecursiveWalkerFn = ( - node: Node, - state: TState, - callback: WalkerCallback - ) => void; - - type SimpleVisitors = { - [type: string]: SimpleWalkerFn - }; - - type AncestorVisitors = { - [type: string]: AncestorWalkerFn - }; - - type RecursiveVisitors = { - [type: string]: RecursiveWalkerFn - }; - - type FindPredicate = (type: string, node: Node) => boolean; - - interface Found { - node: Node, - state: TState - } - - export function simple( - node: Node, - visitors: SimpleVisitors, - base?: RecursiveVisitors, - state?: TState - ): void; +import * as acorn from "acorn" + +export type FullWalkerCallback = ( + node: acorn.Node, + state: TState, + type: string +) => void + +export type FullAncestorWalkerCallback = ( + node: acorn.Node, + state: TState, + ancestors: acorn.Node[], + type: string +) => void + +type AggregateType = { + Expression: acorn.Expression, + Statement: acorn.Statement, + Function: acorn.Function, + Class: acorn.Class, + Pattern: acorn.Pattern, + ForInit: acorn.VariableDeclaration | acorn.Expression +} - export function ancestor( - node: Node, - visitors: AncestorVisitors, - base?: RecursiveVisitors, - state?: TState - ): void; - - export function recursive( - node: Node, - state: TState, - functions: RecursiveVisitors, - base?: RecursiveVisitors - ): void; - - export function full( - node: Node, - callback: FullWalkerCallback, - base?: RecursiveVisitors, - state?: TState - ): void; +export type SimpleVisitors = { + [type in acorn.AnyNode["type"]]?: (node: Extract, state: TState) => void +} & { + [type in keyof AggregateType]?: (node: AggregateType[type], state: TState) => void +} - export function fullAncestor( - node: Node, - callback: FullAncestorWalkerCallback, - base?: RecursiveVisitors, - state?: TState - ): void; - - export function make( - functions: RecursiveVisitors, - base?: RecursiveVisitors - ): RecursiveVisitors; - - export function findNodeAt( - node: Node, - start: number | undefined, - end?: number | undefined, - type?: FindPredicate | string, - base?: RecursiveVisitors, - state?: TState - ): Found | undefined; +export type AncestorVisitors = { + [type in acorn.AnyNode["type"]]?: ( node: Extract, state: TState, ancestors: acorn.Node[] +) => void +} & { + [type in keyof AggregateType]?: (node: AggregateType[type], state: TState, ancestors: acorn.Node[]) => void +} - export function findNodeAround( - node: Node, - start: number | undefined, - type?: FindPredicate | string, - base?: RecursiveVisitors, - state?: TState - ): Found | undefined; +export type WalkerCallback = (node: acorn.Node, state: TState) => void - export const findNodeAfter: typeof findNodeAround; +export type RecursiveVisitors = { + [type in acorn.AnyNode["type"]]?: ( node: Extract, state: TState, callback: WalkerCallback) => void +} & { + [type in keyof AggregateType]?: (node: AggregateType[type], state: TState, callback: WalkerCallback) => void +} - export const base: RecursiveVisitors; +export type FindPredicate = (type: string, node: acorn.Node) => boolean + +export interface Found { + node: acorn.Node, + state: TState } + +/** + * does a 'simple' walk over a tree + * @param node the AST node to walk + * @param visitors an object with properties whose names correspond to node types in the {@link https://github.com/estree/estree | ESTree spec}. The properties should contain functions that will be called with the node object and, if applicable the state at that point. + * @param base a walker algorithm + * @param state a start state. The default walker will simply visit all statements and expressions and not produce a meaningful state. (An example of a use of state is to track scope at each point in the tree.) + */ +export function simple( + node: acorn.Node, + visitors: SimpleVisitors, + base?: RecursiveVisitors, + state?: TState +): void + +/** + * does a 'simple' walk over a tree, building up an array of ancestor nodes (including the current node) and passing the array to the callbacks as a third parameter. + * @param node + * @param visitors + * @param base + * @param state + */ +export function ancestor( + node: acorn.Node, + visitors: AncestorVisitors, + base?: RecursiveVisitors, + state?: TState + ): void + +/** + * does a 'recursive' walk, where the walker functions are responsible for continuing the walk on the child nodes of their target node. + * @param node + * @param state the start state + * @param functions contain an object that maps node types to walker functions + * @param base provides the fallback walker functions for node types that aren't handled in the {@link functions} object. If not given, the default walkers will be used. + */ +export function recursive( + node: acorn.Node, + state: TState, + functions: RecursiveVisitors, + base?: RecursiveVisitors +): void + +/** + * does a 'full' walk over a tree, calling the {@link callback} with the arguments (node, state, type) for each node + * @param node + * @param callback + * @param base + * @param state + */ +export function full( + node: acorn.Node, + callback: FullWalkerCallback, + base?: RecursiveVisitors, + state?: TState +): void + +/** + * does a 'full' walk over a tree, building up an array of ancestor nodes (including the current node) and passing the array to the callbacks as a third parameter. + * @param node + * @param callback + * @param base + * @param state + */ +export function fullAncestor( + node: acorn.Node, + callback: FullAncestorWalkerCallback, + base?: RecursiveVisitors, + state?: TState +): void + +/** + * builds a new walker object by using the walker functions in {@link functions} and filling in the missing ones by taking defaults from {@link base}. + * @param functions + * @param base + */ +export function make( + functions: RecursiveVisitors, + base?: RecursiveVisitors +): RecursiveVisitors + +/** + * tries to locate a node in a tree at the given start and/or end offsets, which satisfies the predicate test. {@link start} and {@link end} can be either `null` (as wildcard) or a `number`. {@link test} may be a string (indicating a node type) or a function that takes (nodeType, node) arguments and returns a boolean indicating whether this node is interesting. {@link base} and {@link state} are optional, and can be used to specify a custom walker. Nodes are tested from inner to outer, so if two nodes match the boundaries, the inner one will be preferred. + * @param node + * @param start + * @param end + * @param type + * @param base + * @param state + */ +export function findNodeAt( + node: acorn.Node, + start: number | undefined, + end?: number | undefined, + type?: FindPredicate | string, + base?: RecursiveVisitors, + state?: TState +): Found | undefined + +/** + * like {@link findNodeAt}, but will match any node that exists 'around' (spanning) the given position. + * @param node + * @param start + * @param type + * @param base + * @param state + */ +export function findNodeAround( + node: acorn.Node, + start: number | undefined, + type?: FindPredicate | string, + base?: RecursiveVisitors, + state?: TState +): Found | undefined + +/** + * similar to {@link findNodeAround}, but will match all nodes after the given position (testing outer nodes before inner nodes). + */ +export const findNodeAfter: typeof findNodeAround + +export const base: RecursiveVisitors diff --git a/deps/acorn/acorn-walk/dist/walk.js b/deps/acorn/acorn-walk/dist/walk.js index a7f81b0061a750..580df6413725f8 100644 --- a/deps/acorn/acorn-walk/dist/walk.js +++ b/deps/acorn/acorn-walk/dist/walk.js @@ -1,10 +1,10 @@ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : - (global = global || self, factory((global.acorn = global.acorn || {}, global.acorn.walk = {}))); -}(this, (function (exports) { 'use strict'; + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.acorn = global.acorn || {}, global.acorn.walk = {}))); +})(this, (function (exports) { 'use strict'; - // AST walker module for Mozilla Parser API compatible trees + // AST walker module for ESTree compatible trees // A simple walk is one where you simply specify callbacks to be // called on specific nodes. The last two arguments are optional. A @@ -14,7 +14,7 @@ // Expression: function(node) { ... } // }); // - // to do something with all expressions. All Parser API node types + // to do something with all expressions. All ESTree node types // can be used to identify node types, as well as Expression and // Statement, which denote categories of nodes. // @@ -25,9 +25,9 @@ function simple(node, visitors, baseVisitor, state, override) { if (!baseVisitor) { baseVisitor = base ; }(function c(node, st, override) { - var type = override || node.type, found = visitors[type]; + var type = override || node.type; baseVisitor[type](node, st, c); - if (found) { found(node, st); } + if (visitors[type]) { visitors[type](node, st); } })(node, state, override); } @@ -38,11 +38,11 @@ var ancestors = []; if (!baseVisitor) { baseVisitor = base ; }(function c(node, st, override) { - var type = override || node.type, found = visitors[type]; + var type = override || node.type; var isNew = node !== ancestors[ancestors.length - 1]; if (isNew) { ancestors.push(node); } baseVisitor[type](node, st, c); - if (found) { found(node, st || ancestors, ancestors); } + if (visitors[type]) { visitors[type](node, st || ancestors, ancestors); } if (isNew) { ancestors.pop(); } })(node, state, override); } @@ -458,6 +458,4 @@ exports.recursive = recursive; exports.simple = simple; - Object.defineProperty(exports, '__esModule', { value: true }); - -}))); +})); diff --git a/deps/acorn/acorn-walk/dist/walk.mjs b/deps/acorn/acorn-walk/dist/walk.mjs index 89dd1f1f4f3557..19eebc0e70f598 100644 --- a/deps/acorn/acorn-walk/dist/walk.mjs +++ b/deps/acorn/acorn-walk/dist/walk.mjs @@ -1,4 +1,4 @@ -// AST walker module for Mozilla Parser API compatible trees +// AST walker module for ESTree compatible trees // A simple walk is one where you simply specify callbacks to be // called on specific nodes. The last two arguments are optional. A @@ -8,7 +8,7 @@ // Expression: function(node) { ... } // }); // -// to do something with all expressions. All Parser API node types +// to do something with all expressions. All ESTree node types // can be used to identify node types, as well as Expression and // Statement, which denote categories of nodes. // @@ -19,9 +19,9 @@ function simple(node, visitors, baseVisitor, state, override) { if (!baseVisitor) { baseVisitor = base ; }(function c(node, st, override) { - var type = override || node.type, found = visitors[type]; + var type = override || node.type; baseVisitor[type](node, st, c); - if (found) { found(node, st); } + if (visitors[type]) { visitors[type](node, st); } })(node, state, override); } @@ -32,11 +32,11 @@ function ancestor(node, visitors, baseVisitor, state, override) { var ancestors = []; if (!baseVisitor) { baseVisitor = base ; }(function c(node, st, override) { - var type = override || node.type, found = visitors[type]; + var type = override || node.type; var isNew = node !== ancestors[ancestors.length - 1]; if (isNew) { ancestors.push(node); } baseVisitor[type](node, st, c); - if (found) { found(node, st || ancestors, ancestors); } + if (visitors[type]) { visitors[type](node, st || ancestors, ancestors); } if (isNew) { ancestors.pop(); } })(node, state, override); } diff --git a/deps/acorn/acorn-walk/package.json b/deps/acorn/acorn-walk/package.json index 8d75b9711c2e35..393c87a39255a0 100644 --- a/deps/acorn/acorn-walk/package.json +++ b/deps/acorn/acorn-walk/package.json @@ -16,8 +16,10 @@ ], "./package.json": "./package.json" }, - "version": "8.2.0", - "engines": {"node": ">=0.4.0"}, + "version": "8.3.1", + "engines": { + "node": ">=0.4.0" + }, "maintainers": [ { "name": "Marijn Haverbeke", diff --git a/deps/acorn/acorn/CHANGELOG.md b/deps/acorn/acorn/CHANGELOG.md index 12464cfdbeefdd..eb848a58b8a091 100644 --- a/deps/acorn/acorn/CHANGELOG.md +++ b/deps/acorn/acorn/CHANGELOG.md @@ -1,3 +1,39 @@ +## 8.11.3 (2023-12-29) + +### Bug fixes + +Add `Function` and `Class` to the `AggregateType` type, so that they can be used in walkers without raising a type error. + +Make sure `onToken` get an `import` keyword token when parsing `import.meta`. + +Fix a bug where `.loc.start` could be undefined for `new.target` `meta` nodes. + +## 8.11.2 (2023-10-27) + +### Bug fixes + +Fix a bug that caused regular expressions after colon tokens to not be properly tokenized in some circumstances. + +## 8.11.1 (2023-10-26) + +### Bug fixes + +Fix a regression where `onToken` would receive 'name' tokens for 'new' keyword tokens. + +## 8.11.0 (2023-10-26) + +### Bug fixes + +Fix an issue where tokenizing (without parsing) an object literal with a property named `class` or `function` could, in some circumstance, put the tokenizer into an invalid state. + +Fix an issue where a slash after a call to a propery named the same as some keywords would be tokenized as a regular expression. + +### New features + +Upgrade to Unicode 15.1. + +Use a set of new, much more precise, TypeScript types. + ## 8.10.0 (2023-07-05) ### New features diff --git a/deps/acorn/acorn/README.md b/deps/acorn/acorn/README.md index b62d02bde1fbb0..cfc51b384a3e2b 100644 --- a/deps/acorn/acorn/README.md +++ b/deps/acorn/acorn/README.md @@ -9,9 +9,7 @@ Acorn is open source software released under an You are welcome to [report bugs](https://github.com/acornjs/acorn/issues) or create pull -requests on [github](https://github.com/acornjs/acorn). For questions -and discussion, please use the -[Tern discussion forum](https://discuss.ternjs.net). +requests on [github](https://github.com/acornjs/acorn). ## Installation @@ -204,6 +202,13 @@ option is enabled). When the token's type is `tokTypes.eof`, you should stop calling the method, since it will keep returning that same token forever. +Note that tokenizing JavaScript without parsing it is, in modern +versions of the language, not really possible due to the way syntax is +overloaded in ways that can only be disambiguated by the parse +context. This package applies a bunch of heuristics to try and do a +reasonable job, but you are advised to use `parse` with the `onToken` +option instead of this. + In ES6 environment, returned result can be used as any other protocol-compliant iterable: diff --git a/deps/acorn/acorn/dist/acorn.d.mts b/deps/acorn/acorn/dist/acorn.d.mts index 49ae59fd95776a..6ad58121195c96 100644 --- a/deps/acorn/acorn/dist/acorn.d.mts +++ b/deps/acorn/acorn/dist/acorn.d.mts @@ -1,26 +1,857 @@ -export { - Node, - Parser, - Position, - SourceLocation, - TokContext, - Token, - TokenType, - defaultOptions, - getLineInfo, - isIdentifierChar, - isIdentifierStart, - isNewLine, - lineBreak, - lineBreakG, - parse, - parseExpressionAt, - tokContexts, - tokTypes, - tokenizer, - version, - AbstractToken, - Comment, - Options, - ecmaVersion, -} from "./acorn.js"; +export interface Node { + start: number + end: number + type: string + range?: [number, number] + loc?: SourceLocation | null +} + +export interface SourceLocation { + source?: string | null + start: Position + end: Position +} + +export interface Position { + /** 1-based */ + line: number + /** 0-based */ + column: number +} + +export interface Identifier extends Node { + type: "Identifier" + name: string +} + +export interface Literal extends Node { + type: "Literal" + value?: string | boolean | null | number | RegExp | bigint + raw?: string + regex?: { + pattern: string + flags: string + } + bigint?: string +} + +export interface Program extends Node { + type: "Program" + body: Array + sourceType: "script" | "module" +} + +export interface Function extends Node { + id?: Identifier | null + params: Array + body: BlockStatement | Expression + generator: boolean + expression: boolean + async: boolean +} + +export interface ExpressionStatement extends Node { + type: "ExpressionStatement" + expression: Expression | Literal + directive?: string +} + +export interface BlockStatement extends Node { + type: "BlockStatement" + body: Array +} + +export interface EmptyStatement extends Node { + type: "EmptyStatement" +} + +export interface DebuggerStatement extends Node { + type: "DebuggerStatement" +} + +export interface WithStatement extends Node { + type: "WithStatement" + object: Expression + body: Statement +} + +export interface ReturnStatement extends Node { + type: "ReturnStatement" + argument?: Expression | null +} + +export interface LabeledStatement extends Node { + type: "LabeledStatement" + label: Identifier + body: Statement +} + +export interface BreakStatement extends Node { + type: "BreakStatement" + label?: Identifier | null +} + +export interface ContinueStatement extends Node { + type: "ContinueStatement" + label?: Identifier | null +} + +export interface IfStatement extends Node { + type: "IfStatement" + test: Expression + consequent: Statement + alternate?: Statement | null +} + +export interface SwitchStatement extends Node { + type: "SwitchStatement" + discriminant: Expression + cases: Array +} + +export interface SwitchCase extends Node { + type: "SwitchCase" + test?: Expression | null + consequent: Array +} + +export interface ThrowStatement extends Node { + type: "ThrowStatement" + argument: Expression +} + +export interface TryStatement extends Node { + type: "TryStatement" + block: BlockStatement + handler?: CatchClause | null + finalizer?: BlockStatement | null +} + +export interface CatchClause extends Node { + type: "CatchClause" + param?: Pattern | null + body: BlockStatement +} + +export interface WhileStatement extends Node { + type: "WhileStatement" + test: Expression + body: Statement +} + +export interface DoWhileStatement extends Node { + type: "DoWhileStatement" + body: Statement + test: Expression +} + +export interface ForStatement extends Node { + type: "ForStatement" + init?: VariableDeclaration | Expression | null + test?: Expression | null + update?: Expression | null + body: Statement +} + +export interface ForInStatement extends Node { + type: "ForInStatement" + left: VariableDeclaration | Pattern + right: Expression + body: Statement +} + +export interface FunctionDeclaration extends Function { + type: "FunctionDeclaration" + id: Identifier + body: BlockStatement +} + +export interface VariableDeclaration extends Node { + type: "VariableDeclaration" + declarations: Array + kind: "var" | "let" | "const" +} + +export interface VariableDeclarator extends Node { + type: "VariableDeclarator" + id: Pattern + init?: Expression | null +} + +export interface ThisExpression extends Node { + type: "ThisExpression" +} + +export interface ArrayExpression extends Node { + type: "ArrayExpression" + elements: Array +} + +export interface ObjectExpression extends Node { + type: "ObjectExpression" + properties: Array +} + +export interface Property extends Node { + type: "Property" + key: Expression + value: Expression + kind: "init" | "get" | "set" + method: boolean + shorthand: boolean + computed: boolean +} + +export interface FunctionExpression extends Function { + type: "FunctionExpression" + body: BlockStatement +} + +export interface UnaryExpression extends Node { + type: "UnaryExpression" + operator: UnaryOperator + prefix: boolean + argument: Expression +} + +export type UnaryOperator = "-" | "+" | "!" | "~" | "typeof" | "void" | "delete" + +export interface UpdateExpression extends Node { + type: "UpdateExpression" + operator: UpdateOperator + argument: Expression + prefix: boolean +} + +export type UpdateOperator = "++" | "--" + +export interface BinaryExpression extends Node { + type: "BinaryExpression" + operator: BinaryOperator + left: Expression | PrivateIdentifier + right: Expression +} + +export type BinaryOperator = "==" | "!=" | "===" | "!==" | "<" | "<=" | ">" | ">=" | "<<" | ">>" | ">>>" | "+" | "-" | "*" | "/" | "%" | "|" | "^" | "&" | "in" | "instanceof" | "**" + +export interface AssignmentExpression extends Node { + type: "AssignmentExpression" + operator: AssignmentOperator + left: Pattern + right: Expression +} + +export type AssignmentOperator = "=" | "+=" | "-=" | "*=" | "/=" | "%=" | "<<=" | ">>=" | ">>>=" | "|=" | "^=" | "&=" | "**=" | "||=" | "&&=" | "??=" + +export interface LogicalExpression extends Node { + type: "LogicalExpression" + operator: LogicalOperator + left: Expression + right: Expression +} + +export type LogicalOperator = "||" | "&&" | "??" + +export interface MemberExpression extends Node { + type: "MemberExpression" + object: Expression | Super + property: Expression | PrivateIdentifier + computed: boolean + optional: boolean +} + +export interface ConditionalExpression extends Node { + type: "ConditionalExpression" + test: Expression + alternate: Expression + consequent: Expression +} + +export interface CallExpression extends Node { + type: "CallExpression" + callee: Expression | Super + arguments: Array + optional: boolean +} + +export interface NewExpression extends Node { + type: "NewExpression" + callee: Expression + arguments: Array +} + +export interface SequenceExpression extends Node { + type: "SequenceExpression" + expressions: Array +} + +export interface ForOfStatement extends Node { + type: "ForOfStatement" + left: VariableDeclaration | Pattern + right: Expression + body: Statement + await: boolean +} + +export interface Super extends Node { + type: "Super" +} + +export interface SpreadElement extends Node { + type: "SpreadElement" + argument: Expression +} + +export interface ArrowFunctionExpression extends Function { + type: "ArrowFunctionExpression" +} + +export interface YieldExpression extends Node { + type: "YieldExpression" + argument?: Expression | null + delegate: boolean +} + +export interface TemplateLiteral extends Node { + type: "TemplateLiteral" + quasis: Array + expressions: Array +} + +export interface TaggedTemplateExpression extends Node { + type: "TaggedTemplateExpression" + tag: Expression + quasi: TemplateLiteral +} + +export interface TemplateElement extends Node { + type: "TemplateElement" + tail: boolean + value: { + cooked?: string | null + raw: string + } +} + +export interface AssignmentProperty extends Node { + type: "Property" + key: Expression + value: Pattern + kind: "init" + method: false + shorthand: boolean + computed: boolean +} + +export interface ObjectPattern extends Node { + type: "ObjectPattern" + properties: Array +} + +export interface ArrayPattern extends Node { + type: "ArrayPattern" + elements: Array +} + +export interface RestElement extends Node { + type: "RestElement" + argument: Pattern +} + +export interface AssignmentPattern extends Node { + type: "AssignmentPattern" + left: Pattern + right: Expression +} + +export interface Class extends Node { + id?: Identifier | null + superClass?: Expression | null + body: ClassBody +} + +export interface ClassBody extends Node { + type: "ClassBody" + body: Array +} + +export interface MethodDefinition extends Node { + type: "MethodDefinition" + key: Expression | PrivateIdentifier + value: FunctionExpression + kind: "constructor" | "method" | "get" | "set" + computed: boolean + static: boolean +} + +export interface ClassDeclaration extends Class { + type: "ClassDeclaration" + id: Identifier +} + +export interface ClassExpression extends Class { + type: "ClassExpression" +} + +export interface MetaProperty extends Node { + type: "MetaProperty" + meta: Identifier + property: Identifier +} + +export interface ImportDeclaration extends Node { + type: "ImportDeclaration" + specifiers: Array + source: Literal +} + +export interface ImportSpecifier extends Node { + type: "ImportSpecifier" + imported: Identifier | Literal + local: Identifier +} + +export interface ImportDefaultSpecifier extends Node { + type: "ImportDefaultSpecifier" + local: Identifier +} + +export interface ImportNamespaceSpecifier extends Node { + type: "ImportNamespaceSpecifier" + local: Identifier +} + +export interface ExportNamedDeclaration extends Node { + type: "ExportNamedDeclaration" + declaration?: Declaration | null + specifiers: Array + source?: Literal | null +} + +export interface ExportSpecifier extends Node { + type: "ExportSpecifier" + exported: Identifier | Literal + local: Identifier | Literal +} + +export interface AnonymousFunctionDeclaration extends Function { + type: "FunctionDeclaration" + id: null + body: BlockStatement +} + +export interface AnonymousClassDeclaration extends Class { + type: "ClassDeclaration" + id: null +} + +export interface ExportDefaultDeclaration extends Node { + type: "ExportDefaultDeclaration" + declaration: AnonymousFunctionDeclaration | FunctionDeclaration | AnonymousClassDeclaration | ClassDeclaration | Expression +} + +export interface ExportAllDeclaration extends Node { + type: "ExportAllDeclaration" + source: Literal + exported?: Identifier | Literal | null +} + +export interface AwaitExpression extends Node { + type: "AwaitExpression" + argument: Expression +} + +export interface ChainExpression extends Node { + type: "ChainExpression" + expression: MemberExpression | CallExpression +} + +export interface ImportExpression extends Node { + type: "ImportExpression" + source: Expression +} + +export interface ParenthesizedExpression extends Node { + type: "ParenthesizedExpression" + expression: Expression +} + +export interface PropertyDefinition extends Node { + type: "PropertyDefinition" + key: Expression | PrivateIdentifier + value?: Expression | null + computed: boolean + static: boolean +} + +export interface PrivateIdentifier extends Node { + type: "PrivateIdentifier" + name: string +} + +export interface StaticBlock extends Node { + type: "StaticBlock" + body: Array +} + +export type Statement = +| ExpressionStatement +| BlockStatement +| EmptyStatement +| DebuggerStatement +| WithStatement +| ReturnStatement +| LabeledStatement +| BreakStatement +| ContinueStatement +| IfStatement +| SwitchStatement +| ThrowStatement +| TryStatement +| WhileStatement +| DoWhileStatement +| ForStatement +| ForInStatement +| ForOfStatement +| Declaration + +export type Declaration = +| FunctionDeclaration +| VariableDeclaration +| ClassDeclaration + +export type Expression = +| Identifier +| Literal +| ThisExpression +| ArrayExpression +| ObjectExpression +| FunctionExpression +| UnaryExpression +| UpdateExpression +| BinaryExpression +| AssignmentExpression +| LogicalExpression +| MemberExpression +| ConditionalExpression +| CallExpression +| NewExpression +| SequenceExpression +| ArrowFunctionExpression +| YieldExpression +| TemplateLiteral +| TaggedTemplateExpression +| ClassExpression +| MetaProperty +| AwaitExpression +| ChainExpression +| ImportExpression +| ParenthesizedExpression + +export type Pattern = +| Identifier +| MemberExpression +| ObjectPattern +| ArrayPattern +| RestElement +| AssignmentPattern + +export type ModuleDeclaration = +| ImportDeclaration +| ExportNamedDeclaration +| ExportDefaultDeclaration +| ExportAllDeclaration + +export type AnyNode = Statement | Expression | Declaration | ModuleDeclaration | Literal | Program | SwitchCase | CatchClause | Property | Super | SpreadElement | TemplateElement | AssignmentProperty | ObjectPattern | ArrayPattern | RestElement | AssignmentPattern | ClassBody | MethodDefinition | MetaProperty | ImportSpecifier | ImportDefaultSpecifier | ImportNamespaceSpecifier | ExportSpecifier | AnonymousFunctionDeclaration | AnonymousClassDeclaration | PropertyDefinition | PrivateIdentifier | StaticBlock + +export function parse(input: string, options: Options): Program + +export function parseExpressionAt(input: string, pos: number, options: Options): Expression + +export function tokenizer(input: string, options: Options): { + getToken(): Token + [Symbol.iterator](): Iterator +} + +export type ecmaVersion = 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | "latest" + +export interface Options { + /** + * `ecmaVersion` indicates the ECMAScript version to parse. Must be + * either 3, 5, 6 (or 2015), 7 (2016), 8 (2017), 9 (2018), 10 + * (2019), 11 (2020), 12 (2021), 13 (2022), 14 (2023), or `"latest"` + * (the latest version the library supports). This influences + * support for strict mode, the set of reserved words, and support + * for new syntax features. + */ + ecmaVersion: ecmaVersion + + /** + * `sourceType` indicates the mode the code should be parsed in. + * Can be either `"script"` or `"module"`. This influences global + * strict mode and parsing of `import` and `export` declarations. + */ + sourceType?: "script" | "module" + + /** + * a callback that will be called when a semicolon is automatically inserted. + * @param lastTokEnd the position of the comma as an offset + * @param lastTokEndLoc location if {@link locations} is enabled + */ + onInsertedSemicolon?: (lastTokEnd: number, lastTokEndLoc?: Position) => void + + /** + * similar to `onInsertedSemicolon`, but for trailing commas + * @param lastTokEnd the position of the comma as an offset + * @param lastTokEndLoc location if `locations` is enabled + */ + onTrailingComma?: (lastTokEnd: number, lastTokEndLoc?: Position) => void + + /** + * By default, reserved words are only enforced if ecmaVersion >= 5. + * Set `allowReserved` to a boolean value to explicitly turn this on + * an off. When this option has the value "never", reserved words + * and keywords can also not be used as property names. + */ + allowReserved?: boolean | "never" + + /** + * When enabled, a return at the top level is not considered an error. + */ + allowReturnOutsideFunction?: boolean + + /** + * When enabled, import/export statements are not constrained to + * appearing at the top of the program, and an import.meta expression + * in a script isn't considered an error. + */ + allowImportExportEverywhere?: boolean + + /** + * By default, `await` identifiers are allowed to appear at the top-level scope only if {@link ecmaVersion} >= 2022. + * When enabled, await identifiers are allowed to appear at the top-level scope, + * but they are still not allowed in non-async functions. + */ + allowAwaitOutsideFunction?: boolean + + /** + * When enabled, super identifiers are not constrained to + * appearing in methods and do not raise an error when they appear elsewhere. + */ + allowSuperOutsideMethod?: boolean + + /** + * When enabled, hashbang directive in the beginning of file is + * allowed and treated as a line comment. Enabled by default when + * {@link ecmaVersion} >= 2023. + */ + allowHashBang?: boolean + + /** + * By default, the parser will verify that private properties are + * only used in places where they are valid and have been declared. + * Set this to false to turn such checks off. + */ + checkPrivateFields?: boolean + + /** + * When `locations` is on, `loc` properties holding objects with + * `start` and `end` properties as {@link Position} objects will be attached to the + * nodes. + */ + locations?: boolean + + /** + * a callback that will cause Acorn to call that export function with object in the same + * format as tokens returned from `tokenizer().getToken()`. Note + * that you are not allowed to call the parser from the + * callback—that will corrupt its internal state. + */ + onToken?: ((token: Token) => void) | Token[] + + + /** + * This takes a export function or an array. + * + * When a export function is passed, Acorn will call that export function with `(block, text, start, + * end)` parameters whenever a comment is skipped. `block` is a + * boolean indicating whether this is a block (`/* *\/`) comment, + * `text` is the content of the comment, and `start` and `end` are + * character offsets that denote the start and end of the comment. + * When the {@link locations} option is on, two more parameters are + * passed, the full locations of {@link Position} export type of the start and + * end of the comments. + * + * When a array is passed, each found comment of {@link Comment} export type is pushed to the array. + * + * Note that you are not allowed to call the + * parser from the callback—that will corrupt its internal state. + */ + onComment?: (( + isBlock: boolean, text: string, start: number, end: number, startLoc?: Position, + endLoc?: Position + ) => void) | Comment[] + + /** + * Nodes have their start and end characters offsets recorded in + * `start` and `end` properties (directly on the node, rather than + * the `loc` object, which holds line/column data. To also add a + * [semi-standardized][range] `range` property holding a `[start, + * end]` array with the same numbers, set the `ranges` option to + * `true`. + */ + ranges?: boolean + + /** + * It is possible to parse multiple files into a single AST by + * passing the tree produced by parsing the first file as + * `program` option in subsequent parses. This will add the + * toplevel forms of the parsed file to the `Program` (top) node + * of an existing parse tree. + */ + program?: Node + + /** + * When {@link locations} is on, you can pass this to record the source + * file in every node's `loc` object. + */ + sourceFile?: string + + /** + * This value, if given, is stored in every node, whether {@link locations} is on or off. + */ + directSourceFile?: string + + /** + * When enabled, parenthesized expressions are represented by + * (non-standard) ParenthesizedExpression nodes + */ + preserveParens?: boolean +} + +export class Parser { + options: Options + input: string + + private constructor(options: Options, input: string, startPos?: number) + parse(): Program + + static parse(input: string, options: Options): Program + static parseExpressionAt(input: string, pos: number, options: Options): Expression + static tokenizer(input: string, options: Options): { + getToken(): Token + [Symbol.iterator](): Iterator + } + static extend(...plugins: ((BaseParser: typeof Parser) => typeof Parser)[]): typeof Parser +} + +export const defaultOptions: Options + +export function getLineInfo(input: string, offset: number): Position + +export class TokenType { + label: string + keyword: string | undefined +} + +export const tokTypes: { + num: TokenType + regexp: TokenType + string: TokenType + name: TokenType + privateId: TokenType + eof: TokenType + + bracketL: TokenType + bracketR: TokenType + braceL: TokenType + braceR: TokenType + parenL: TokenType + parenR: TokenType + comma: TokenType + semi: TokenType + colon: TokenType + dot: TokenType + question: TokenType + questionDot: TokenType + arrow: TokenType + template: TokenType + invalidTemplate: TokenType + ellipsis: TokenType + backQuote: TokenType + dollarBraceL: TokenType + + eq: TokenType + assign: TokenType + incDec: TokenType + prefix: TokenType + logicalOR: TokenType + logicalAND: TokenType + bitwiseOR: TokenType + bitwiseXOR: TokenType + bitwiseAND: TokenType + equality: TokenType + relational: TokenType + bitShift: TokenType + plusMin: TokenType + modulo: TokenType + star: TokenType + slash: TokenType + starstar: TokenType + coalesce: TokenType + + _break: TokenType + _case: TokenType + _catch: TokenType + _continue: TokenType + _debugger: TokenType + _default: TokenType + _do: TokenType + _else: TokenType + _finally: TokenType + _for: TokenType + _function: TokenType + _if: TokenType + _return: TokenType + _switch: TokenType + _throw: TokenType + _try: TokenType + _var: TokenType + _const: TokenType + _while: TokenType + _with: TokenType + _new: TokenType + _this: TokenType + _super: TokenType + _class: TokenType + _extends: TokenType + _export: TokenType + _import: TokenType + _null: TokenType + _true: TokenType + _false: TokenType + _in: TokenType + _instanceof: TokenType + _typeof: TokenType + _void: TokenType + _delete: TokenType +} + +export interface Comment { + type: "Line" | "Block" + value: string + start: number + end: number + loc?: SourceLocation + range?: [number, number] +} + +export class Token { + type: TokenType + start: number + end: number + loc?: SourceLocation + range?: [number, number] +} + +export const version: string diff --git a/deps/acorn/acorn/dist/acorn.d.ts b/deps/acorn/acorn/dist/acorn.d.ts index 5b26741473db1a..6ad58121195c96 100644 --- a/deps/acorn/acorn/dist/acorn.d.ts +++ b/deps/acorn/acorn/dist/acorn.d.ts @@ -1,292 +1,857 @@ -export as namespace acorn -export = acorn +export interface Node { + start: number + end: number + type: string + range?: [number, number] + loc?: SourceLocation | null +} -declare namespace acorn { - function parse(input: string, options: Options): Node +export interface SourceLocation { + source?: string | null + start: Position + end: Position +} - function parseExpressionAt(input: string, pos: number, options: Options): Node +export interface Position { + /** 1-based */ + line: number + /** 0-based */ + column: number +} - function tokenizer(input: string, options: Options): { - getToken(): Token - [Symbol.iterator](): Iterator - } +export interface Identifier extends Node { + type: "Identifier" + name: string +} - type ecmaVersion = 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 'latest' - - interface Options { - ecmaVersion: ecmaVersion - sourceType?: 'script' | 'module' - onInsertedSemicolon?: (lastTokEnd: number, lastTokEndLoc?: Position) => void - onTrailingComma?: (lastTokEnd: number, lastTokEndLoc?: Position) => void - allowReserved?: boolean | 'never' - allowReturnOutsideFunction?: boolean - allowImportExportEverywhere?: boolean - allowAwaitOutsideFunction?: boolean - allowSuperOutsideMethod?: boolean - allowHashBang?: boolean - locations?: boolean - onToken?: ((token: Token) => any) | Token[] - onComment?: (( - isBlock: boolean, text: string, start: number, end: number, startLoc?: Position, - endLoc?: Position - ) => void) | Comment[] - ranges?: boolean - program?: Node - sourceFile?: string - directSourceFile?: string - preserveParens?: boolean +export interface Literal extends Node { + type: "Literal" + value?: string | boolean | null | number | RegExp | bigint + raw?: string + regex?: { + pattern: string + flags: string } + bigint?: string +} - class Parser { - // state.js - lineStart: number; - options: Options; - curLine: number; - start: number; - end: number; - input: string; - type: TokenType; - - // state.js - constructor(options: Options, input: string, startPos?: number) - parse(this: Parser): Node - - // tokenize.js - next(): void; - nextToken(): void; - - // statement.js - parseTopLevel(node: Node): Node; - - // node.js - finishNode(node: Node, type: string): Node; - finishNodeAt(node: Node, type: string, pos: number, loc: Position): Node; - - // location.js - raise(pos: number, message: string) : void; - raiseRecoverable?(pos: number, message: string) : void; - - // parseutils.js - unexpected(pos: number) : void; - - // index.js - static acorn: typeof acorn; - - // state.js - static parse(this: typeof Parser, input: string, options: Options): Node - static parseExpressionAt(this: typeof Parser, input: string, pos: number, options: Options): Node - static tokenizer(this: typeof Parser, input: string, options: Options): { - getToken(): Token - [Symbol.iterator](): Iterator - } - static extend(this: typeof Parser, ...plugins: ((BaseParser: typeof Parser) => typeof Parser)[]): typeof Parser - } +export interface Program extends Node { + type: "Program" + body: Array + sourceType: "script" | "module" +} - interface Position { line: number; column: number; offset: number } +export interface Function extends Node { + id?: Identifier | null + params: Array + body: BlockStatement | Expression + generator: boolean + expression: boolean + async: boolean +} - const defaultOptions: Options +export interface ExpressionStatement extends Node { + type: "ExpressionStatement" + expression: Expression | Literal + directive?: string +} - function getLineInfo(input: string, offset: number): Position +export interface BlockStatement extends Node { + type: "BlockStatement" + body: Array +} - class SourceLocation { - start: Position - end: Position - source?: string | null - constructor(p: Parser, start: Position, end: Position) - } +export interface EmptyStatement extends Node { + type: "EmptyStatement" +} - class Node { - type: string - start: number - end: number - loc?: SourceLocation - sourceFile?: string - range?: [number, number] - constructor(parser: Parser, pos: number, loc?: SourceLocation) - } +export interface DebuggerStatement extends Node { + type: "DebuggerStatement" +} - class TokenType { - label: string - keyword: string - beforeExpr: boolean - startsExpr: boolean - isLoop: boolean - isAssign: boolean - prefix: boolean - postfix: boolean - binop: number - updateContext?: (prevType: TokenType) => void - constructor(label: string, conf?: any) - } +export interface WithStatement extends Node { + type: "WithStatement" + object: Expression + body: Statement +} - const tokTypes: { - num: TokenType - regexp: TokenType - string: TokenType - name: TokenType - privateId: TokenType - eof: TokenType - bracketL: TokenType - bracketR: TokenType - braceL: TokenType - braceR: TokenType - parenL: TokenType - parenR: TokenType - comma: TokenType - semi: TokenType - colon: TokenType - dot: TokenType - question: TokenType - questionDot: TokenType - arrow: TokenType - template: TokenType - invalidTemplate: TokenType - ellipsis: TokenType - backQuote: TokenType - dollarBraceL: TokenType - eq: TokenType - assign: TokenType - incDec: TokenType - prefix: TokenType - logicalOR: TokenType - logicalAND: TokenType - bitwiseOR: TokenType - bitwiseXOR: TokenType - bitwiseAND: TokenType - equality: TokenType - relational: TokenType - bitShift: TokenType - plusMin: TokenType - modulo: TokenType - star: TokenType - slash: TokenType - starstar: TokenType - coalesce: TokenType - _break: TokenType - _case: TokenType - _catch: TokenType - _continue: TokenType - _debugger: TokenType - _default: TokenType - _do: TokenType - _else: TokenType - _finally: TokenType - _for: TokenType - _function: TokenType - _if: TokenType - _return: TokenType - _switch: TokenType - _throw: TokenType - _try: TokenType - _var: TokenType - _const: TokenType - _while: TokenType - _with: TokenType - _new: TokenType - _this: TokenType - _super: TokenType - _class: TokenType - _extends: TokenType - _export: TokenType - _import: TokenType - _null: TokenType - _true: TokenType - _false: TokenType - _in: TokenType - _instanceof: TokenType - _typeof: TokenType - _void: TokenType - _delete: TokenType - } +export interface ReturnStatement extends Node { + type: "ReturnStatement" + argument?: Expression | null +} - class TokContext { - constructor(token: string, isExpr: boolean, preserveSpace: boolean, override?: (p: Parser) => void) - } +export interface LabeledStatement extends Node { + type: "LabeledStatement" + label: Identifier + body: Statement +} - const tokContexts: { - b_stat: TokContext - b_expr: TokContext - b_tmpl: TokContext - p_stat: TokContext - p_expr: TokContext - q_tmpl: TokContext - f_expr: TokContext - f_stat: TokContext - f_expr_gen: TokContext - f_gen: TokContext - } +export interface BreakStatement extends Node { + type: "BreakStatement" + label?: Identifier | null +} - function isIdentifierStart(code: number, astral?: boolean): boolean +export interface ContinueStatement extends Node { + type: "ContinueStatement" + label?: Identifier | null +} - function isIdentifierChar(code: number, astral?: boolean): boolean +export interface IfStatement extends Node { + type: "IfStatement" + test: Expression + consequent: Statement + alternate?: Statement | null +} - interface AbstractToken { - } +export interface SwitchStatement extends Node { + type: "SwitchStatement" + discriminant: Expression + cases: Array +} - interface Comment extends AbstractToken { - type: 'Line' | 'Block' - value: string - start: number - end: number - loc?: SourceLocation - range?: [number, number] - } +export interface SwitchCase extends Node { + type: "SwitchCase" + test?: Expression | null + consequent: Array +} + +export interface ThrowStatement extends Node { + type: "ThrowStatement" + argument: Expression +} - class Token { - type: TokenType - value: any - start: number - end: number - loc?: SourceLocation - range?: [number, number] - constructor(p: Parser) +export interface TryStatement extends Node { + type: "TryStatement" + block: BlockStatement + handler?: CatchClause | null + finalizer?: BlockStatement | null +} + +export interface CatchClause extends Node { + type: "CatchClause" + param?: Pattern | null + body: BlockStatement +} + +export interface WhileStatement extends Node { + type: "WhileStatement" + test: Expression + body: Statement +} + +export interface DoWhileStatement extends Node { + type: "DoWhileStatement" + body: Statement + test: Expression +} + +export interface ForStatement extends Node { + type: "ForStatement" + init?: VariableDeclaration | Expression | null + test?: Expression | null + update?: Expression | null + body: Statement +} + +export interface ForInStatement extends Node { + type: "ForInStatement" + left: VariableDeclaration | Pattern + right: Expression + body: Statement +} + +export interface FunctionDeclaration extends Function { + type: "FunctionDeclaration" + id: Identifier + body: BlockStatement +} + +export interface VariableDeclaration extends Node { + type: "VariableDeclaration" + declarations: Array + kind: "var" | "let" | "const" +} + +export interface VariableDeclarator extends Node { + type: "VariableDeclarator" + id: Pattern + init?: Expression | null +} + +export interface ThisExpression extends Node { + type: "ThisExpression" +} + +export interface ArrayExpression extends Node { + type: "ArrayExpression" + elements: Array +} + +export interface ObjectExpression extends Node { + type: "ObjectExpression" + properties: Array +} + +export interface Property extends Node { + type: "Property" + key: Expression + value: Expression + kind: "init" | "get" | "set" + method: boolean + shorthand: boolean + computed: boolean +} + +export interface FunctionExpression extends Function { + type: "FunctionExpression" + body: BlockStatement +} + +export interface UnaryExpression extends Node { + type: "UnaryExpression" + operator: UnaryOperator + prefix: boolean + argument: Expression +} + +export type UnaryOperator = "-" | "+" | "!" | "~" | "typeof" | "void" | "delete" + +export interface UpdateExpression extends Node { + type: "UpdateExpression" + operator: UpdateOperator + argument: Expression + prefix: boolean +} + +export type UpdateOperator = "++" | "--" + +export interface BinaryExpression extends Node { + type: "BinaryExpression" + operator: BinaryOperator + left: Expression | PrivateIdentifier + right: Expression +} + +export type BinaryOperator = "==" | "!=" | "===" | "!==" | "<" | "<=" | ">" | ">=" | "<<" | ">>" | ">>>" | "+" | "-" | "*" | "/" | "%" | "|" | "^" | "&" | "in" | "instanceof" | "**" + +export interface AssignmentExpression extends Node { + type: "AssignmentExpression" + operator: AssignmentOperator + left: Pattern + right: Expression +} + +export type AssignmentOperator = "=" | "+=" | "-=" | "*=" | "/=" | "%=" | "<<=" | ">>=" | ">>>=" | "|=" | "^=" | "&=" | "**=" | "||=" | "&&=" | "??=" + +export interface LogicalExpression extends Node { + type: "LogicalExpression" + operator: LogicalOperator + left: Expression + right: Expression +} + +export type LogicalOperator = "||" | "&&" | "??" + +export interface MemberExpression extends Node { + type: "MemberExpression" + object: Expression | Super + property: Expression | PrivateIdentifier + computed: boolean + optional: boolean +} + +export interface ConditionalExpression extends Node { + type: "ConditionalExpression" + test: Expression + alternate: Expression + consequent: Expression +} + +export interface CallExpression extends Node { + type: "CallExpression" + callee: Expression | Super + arguments: Array + optional: boolean +} + +export interface NewExpression extends Node { + type: "NewExpression" + callee: Expression + arguments: Array +} + +export interface SequenceExpression extends Node { + type: "SequenceExpression" + expressions: Array +} + +export interface ForOfStatement extends Node { + type: "ForOfStatement" + left: VariableDeclaration | Pattern + right: Expression + body: Statement + await: boolean +} + +export interface Super extends Node { + type: "Super" +} + +export interface SpreadElement extends Node { + type: "SpreadElement" + argument: Expression +} + +export interface ArrowFunctionExpression extends Function { + type: "ArrowFunctionExpression" +} + +export interface YieldExpression extends Node { + type: "YieldExpression" + argument?: Expression | null + delegate: boolean +} + +export interface TemplateLiteral extends Node { + type: "TemplateLiteral" + quasis: Array + expressions: Array +} + +export interface TaggedTemplateExpression extends Node { + type: "TaggedTemplateExpression" + tag: Expression + quasi: TemplateLiteral +} + +export interface TemplateElement extends Node { + type: "TemplateElement" + tail: boolean + value: { + cooked?: string | null + raw: string } +} + +export interface AssignmentProperty extends Node { + type: "Property" + key: Expression + value: Pattern + kind: "init" + method: false + shorthand: boolean + computed: boolean +} + +export interface ObjectPattern extends Node { + type: "ObjectPattern" + properties: Array +} + +export interface ArrayPattern extends Node { + type: "ArrayPattern" + elements: Array +} + +export interface RestElement extends Node { + type: "RestElement" + argument: Pattern +} + +export interface AssignmentPattern extends Node { + type: "AssignmentPattern" + left: Pattern + right: Expression +} + +export interface Class extends Node { + id?: Identifier | null + superClass?: Expression | null + body: ClassBody +} + +export interface ClassBody extends Node { + type: "ClassBody" + body: Array +} + +export interface MethodDefinition extends Node { + type: "MethodDefinition" + key: Expression | PrivateIdentifier + value: FunctionExpression + kind: "constructor" | "method" | "get" | "set" + computed: boolean + static: boolean +} + +export interface ClassDeclaration extends Class { + type: "ClassDeclaration" + id: Identifier +} + +export interface ClassExpression extends Class { + type: "ClassExpression" +} + +export interface MetaProperty extends Node { + type: "MetaProperty" + meta: Identifier + property: Identifier +} + +export interface ImportDeclaration extends Node { + type: "ImportDeclaration" + specifiers: Array + source: Literal +} + +export interface ImportSpecifier extends Node { + type: "ImportSpecifier" + imported: Identifier | Literal + local: Identifier +} + +export interface ImportDefaultSpecifier extends Node { + type: "ImportDefaultSpecifier" + local: Identifier +} + +export interface ImportNamespaceSpecifier extends Node { + type: "ImportNamespaceSpecifier" + local: Identifier +} + +export interface ExportNamedDeclaration extends Node { + type: "ExportNamedDeclaration" + declaration?: Declaration | null + specifiers: Array + source?: Literal | null +} + +export interface ExportSpecifier extends Node { + type: "ExportSpecifier" + exported: Identifier | Literal + local: Identifier | Literal +} + +export interface AnonymousFunctionDeclaration extends Function { + type: "FunctionDeclaration" + id: null + body: BlockStatement +} + +export interface AnonymousClassDeclaration extends Class { + type: "ClassDeclaration" + id: null +} + +export interface ExportDefaultDeclaration extends Node { + type: "ExportDefaultDeclaration" + declaration: AnonymousFunctionDeclaration | FunctionDeclaration | AnonymousClassDeclaration | ClassDeclaration | Expression +} - function isNewLine(code: number): boolean - - const lineBreak: RegExp - - const lineBreakG: RegExp - - const version: string - - const nonASCIIwhitespace: RegExp - - const keywordTypes: { - _break: TokenType - _case: TokenType - _catch: TokenType - _continue: TokenType - _debugger: TokenType - _default: TokenType - _do: TokenType - _else: TokenType - _finally: TokenType - _for: TokenType - _function: TokenType - _if: TokenType - _return: TokenType - _switch: TokenType - _throw: TokenType - _try: TokenType - _var: TokenType - _const: TokenType - _while: TokenType - _with: TokenType - _new: TokenType - _this: TokenType - _super: TokenType - _class: TokenType - _extends: TokenType - _export: TokenType - _import: TokenType - _null: TokenType - _true: TokenType - _false: TokenType - _in: TokenType - _instanceof: TokenType - _typeof: TokenType - _void: TokenType - _delete: TokenType +export interface ExportAllDeclaration extends Node { + type: "ExportAllDeclaration" + source: Literal + exported?: Identifier | Literal | null +} + +export interface AwaitExpression extends Node { + type: "AwaitExpression" + argument: Expression +} + +export interface ChainExpression extends Node { + type: "ChainExpression" + expression: MemberExpression | CallExpression +} + +export interface ImportExpression extends Node { + type: "ImportExpression" + source: Expression +} + +export interface ParenthesizedExpression extends Node { + type: "ParenthesizedExpression" + expression: Expression +} + +export interface PropertyDefinition extends Node { + type: "PropertyDefinition" + key: Expression | PrivateIdentifier + value?: Expression | null + computed: boolean + static: boolean +} + +export interface PrivateIdentifier extends Node { + type: "PrivateIdentifier" + name: string +} + +export interface StaticBlock extends Node { + type: "StaticBlock" + body: Array +} + +export type Statement = +| ExpressionStatement +| BlockStatement +| EmptyStatement +| DebuggerStatement +| WithStatement +| ReturnStatement +| LabeledStatement +| BreakStatement +| ContinueStatement +| IfStatement +| SwitchStatement +| ThrowStatement +| TryStatement +| WhileStatement +| DoWhileStatement +| ForStatement +| ForInStatement +| ForOfStatement +| Declaration + +export type Declaration = +| FunctionDeclaration +| VariableDeclaration +| ClassDeclaration + +export type Expression = +| Identifier +| Literal +| ThisExpression +| ArrayExpression +| ObjectExpression +| FunctionExpression +| UnaryExpression +| UpdateExpression +| BinaryExpression +| AssignmentExpression +| LogicalExpression +| MemberExpression +| ConditionalExpression +| CallExpression +| NewExpression +| SequenceExpression +| ArrowFunctionExpression +| YieldExpression +| TemplateLiteral +| TaggedTemplateExpression +| ClassExpression +| MetaProperty +| AwaitExpression +| ChainExpression +| ImportExpression +| ParenthesizedExpression + +export type Pattern = +| Identifier +| MemberExpression +| ObjectPattern +| ArrayPattern +| RestElement +| AssignmentPattern + +export type ModuleDeclaration = +| ImportDeclaration +| ExportNamedDeclaration +| ExportDefaultDeclaration +| ExportAllDeclaration + +export type AnyNode = Statement | Expression | Declaration | ModuleDeclaration | Literal | Program | SwitchCase | CatchClause | Property | Super | SpreadElement | TemplateElement | AssignmentProperty | ObjectPattern | ArrayPattern | RestElement | AssignmentPattern | ClassBody | MethodDefinition | MetaProperty | ImportSpecifier | ImportDefaultSpecifier | ImportNamespaceSpecifier | ExportSpecifier | AnonymousFunctionDeclaration | AnonymousClassDeclaration | PropertyDefinition | PrivateIdentifier | StaticBlock + +export function parse(input: string, options: Options): Program + +export function parseExpressionAt(input: string, pos: number, options: Options): Expression + +export function tokenizer(input: string, options: Options): { + getToken(): Token + [Symbol.iterator](): Iterator +} + +export type ecmaVersion = 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | "latest" + +export interface Options { + /** + * `ecmaVersion` indicates the ECMAScript version to parse. Must be + * either 3, 5, 6 (or 2015), 7 (2016), 8 (2017), 9 (2018), 10 + * (2019), 11 (2020), 12 (2021), 13 (2022), 14 (2023), or `"latest"` + * (the latest version the library supports). This influences + * support for strict mode, the set of reserved words, and support + * for new syntax features. + */ + ecmaVersion: ecmaVersion + + /** + * `sourceType` indicates the mode the code should be parsed in. + * Can be either `"script"` or `"module"`. This influences global + * strict mode and parsing of `import` and `export` declarations. + */ + sourceType?: "script" | "module" + + /** + * a callback that will be called when a semicolon is automatically inserted. + * @param lastTokEnd the position of the comma as an offset + * @param lastTokEndLoc location if {@link locations} is enabled + */ + onInsertedSemicolon?: (lastTokEnd: number, lastTokEndLoc?: Position) => void + + /** + * similar to `onInsertedSemicolon`, but for trailing commas + * @param lastTokEnd the position of the comma as an offset + * @param lastTokEndLoc location if `locations` is enabled + */ + onTrailingComma?: (lastTokEnd: number, lastTokEndLoc?: Position) => void + + /** + * By default, reserved words are only enforced if ecmaVersion >= 5. + * Set `allowReserved` to a boolean value to explicitly turn this on + * an off. When this option has the value "never", reserved words + * and keywords can also not be used as property names. + */ + allowReserved?: boolean | "never" + + /** + * When enabled, a return at the top level is not considered an error. + */ + allowReturnOutsideFunction?: boolean + + /** + * When enabled, import/export statements are not constrained to + * appearing at the top of the program, and an import.meta expression + * in a script isn't considered an error. + */ + allowImportExportEverywhere?: boolean + + /** + * By default, `await` identifiers are allowed to appear at the top-level scope only if {@link ecmaVersion} >= 2022. + * When enabled, await identifiers are allowed to appear at the top-level scope, + * but they are still not allowed in non-async functions. + */ + allowAwaitOutsideFunction?: boolean + + /** + * When enabled, super identifiers are not constrained to + * appearing in methods and do not raise an error when they appear elsewhere. + */ + allowSuperOutsideMethod?: boolean + + /** + * When enabled, hashbang directive in the beginning of file is + * allowed and treated as a line comment. Enabled by default when + * {@link ecmaVersion} >= 2023. + */ + allowHashBang?: boolean + + /** + * By default, the parser will verify that private properties are + * only used in places where they are valid and have been declared. + * Set this to false to turn such checks off. + */ + checkPrivateFields?: boolean + + /** + * When `locations` is on, `loc` properties holding objects with + * `start` and `end` properties as {@link Position} objects will be attached to the + * nodes. + */ + locations?: boolean + + /** + * a callback that will cause Acorn to call that export function with object in the same + * format as tokens returned from `tokenizer().getToken()`. Note + * that you are not allowed to call the parser from the + * callback—that will corrupt its internal state. + */ + onToken?: ((token: Token) => void) | Token[] + + + /** + * This takes a export function or an array. + * + * When a export function is passed, Acorn will call that export function with `(block, text, start, + * end)` parameters whenever a comment is skipped. `block` is a + * boolean indicating whether this is a block (`/* *\/`) comment, + * `text` is the content of the comment, and `start` and `end` are + * character offsets that denote the start and end of the comment. + * When the {@link locations} option is on, two more parameters are + * passed, the full locations of {@link Position} export type of the start and + * end of the comments. + * + * When a array is passed, each found comment of {@link Comment} export type is pushed to the array. + * + * Note that you are not allowed to call the + * parser from the callback—that will corrupt its internal state. + */ + onComment?: (( + isBlock: boolean, text: string, start: number, end: number, startLoc?: Position, + endLoc?: Position + ) => void) | Comment[] + + /** + * Nodes have their start and end characters offsets recorded in + * `start` and `end` properties (directly on the node, rather than + * the `loc` object, which holds line/column data. To also add a + * [semi-standardized][range] `range` property holding a `[start, + * end]` array with the same numbers, set the `ranges` option to + * `true`. + */ + ranges?: boolean + + /** + * It is possible to parse multiple files into a single AST by + * passing the tree produced by parsing the first file as + * `program` option in subsequent parses. This will add the + * toplevel forms of the parsed file to the `Program` (top) node + * of an existing parse tree. + */ + program?: Node + + /** + * When {@link locations} is on, you can pass this to record the source + * file in every node's `loc` object. + */ + sourceFile?: string + + /** + * This value, if given, is stored in every node, whether {@link locations} is on or off. + */ + directSourceFile?: string + + /** + * When enabled, parenthesized expressions are represented by + * (non-standard) ParenthesizedExpression nodes + */ + preserveParens?: boolean +} + +export class Parser { + options: Options + input: string + + private constructor(options: Options, input: string, startPos?: number) + parse(): Program + + static parse(input: string, options: Options): Program + static parseExpressionAt(input: string, pos: number, options: Options): Expression + static tokenizer(input: string, options: Options): { + getToken(): Token + [Symbol.iterator](): Iterator } + static extend(...plugins: ((BaseParser: typeof Parser) => typeof Parser)[]): typeof Parser } + +export const defaultOptions: Options + +export function getLineInfo(input: string, offset: number): Position + +export class TokenType { + label: string + keyword: string | undefined +} + +export const tokTypes: { + num: TokenType + regexp: TokenType + string: TokenType + name: TokenType + privateId: TokenType + eof: TokenType + + bracketL: TokenType + bracketR: TokenType + braceL: TokenType + braceR: TokenType + parenL: TokenType + parenR: TokenType + comma: TokenType + semi: TokenType + colon: TokenType + dot: TokenType + question: TokenType + questionDot: TokenType + arrow: TokenType + template: TokenType + invalidTemplate: TokenType + ellipsis: TokenType + backQuote: TokenType + dollarBraceL: TokenType + + eq: TokenType + assign: TokenType + incDec: TokenType + prefix: TokenType + logicalOR: TokenType + logicalAND: TokenType + bitwiseOR: TokenType + bitwiseXOR: TokenType + bitwiseAND: TokenType + equality: TokenType + relational: TokenType + bitShift: TokenType + plusMin: TokenType + modulo: TokenType + star: TokenType + slash: TokenType + starstar: TokenType + coalesce: TokenType + + _break: TokenType + _case: TokenType + _catch: TokenType + _continue: TokenType + _debugger: TokenType + _default: TokenType + _do: TokenType + _else: TokenType + _finally: TokenType + _for: TokenType + _function: TokenType + _if: TokenType + _return: TokenType + _switch: TokenType + _throw: TokenType + _try: TokenType + _var: TokenType + _const: TokenType + _while: TokenType + _with: TokenType + _new: TokenType + _this: TokenType + _super: TokenType + _class: TokenType + _extends: TokenType + _export: TokenType + _import: TokenType + _null: TokenType + _true: TokenType + _false: TokenType + _in: TokenType + _instanceof: TokenType + _typeof: TokenType + _void: TokenType + _delete: TokenType +} + +export interface Comment { + type: "Line" | "Block" + value: string + start: number + end: number + loc?: SourceLocation + range?: [number, number] +} + +export class Token { + type: TokenType + start: number + end: number + loc?: SourceLocation + range?: [number, number] +} + +export const version: string diff --git a/deps/acorn/acorn/dist/acorn.js b/deps/acorn/acorn/dist/acorn.js index 62e1aa63d0974f..3a6a3a2aeed54c 100644 --- a/deps/acorn/acorn/dist/acorn.js +++ b/deps/acorn/acorn/dist/acorn.js @@ -8,10 +8,10 @@ var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 370, 1, 81, 2, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 9, 5351, 0, 7, 14, 13835, 9, 87, 9, 39, 4, 60, 6, 26, 9, 1014, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4706, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 983, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; // This file was generated. Do not modify manually! - var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 4026, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 757, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 3104, 541, 1507, 4938, 6, 4191]; + var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 4026, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 757, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 4191]; // This file was generated. Do not modify manually! - var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0898-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f"; + var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0898-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65"; // This file was generated. Do not modify manually! var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088e\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ca\ua7d0\ua7d1\ua7d3\ua7d5-\ua7d9\ua7f2-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; @@ -279,8 +279,10 @@ toString.call(obj) === "[object Array]" ); }); + var regexpCache = Object.create(null); + function wordsRegexp(words) { - return new RegExp("^(?:" + words.replace(/ /g, "|") + ")$") + return regexpCache[words] || (regexpCache[words] = new RegExp("^(?:" + words.replace(/ /g, "|") + ")$")) } function codePointToString(code) { @@ -340,11 +342,11 @@ // Can be either `"script"` or `"module"`. This influences global // strict mode and parsing of `import` and `export` declarations. sourceType: "script", - // `onInsertedSemicolon` can be a callback that will be called - // when a semicolon is automatically inserted. It will be passed - // the position of the comma as an offset, and if `locations` is - // enabled, it is given the location as a `{line, column}` object - // as second argument. + // `onInsertedSemicolon` can be a callback that will be called when + // a semicolon is automatically inserted. It will be passed the + // position of the inserted semicolon as an offset, and if + // `locations` is enabled, it is given the location as a `{line, + // column}` object as second argument. onInsertedSemicolon: null, // `onTrailingComma` is similar to `onInsertedSemicolon`, but for // trailing commas. @@ -397,6 +399,8 @@ // passed, the full `{line, column}` locations of the start and // end of the comments. Note that you are not allowed to call the // parser from the callback—that will corrupt its internal state. + // When this option has an array as value, objects representing the + // comments are pushed to it. onComment: null, // Nodes have their start and end characters offsets recorded in // `start` and `end` properties (directly on the node, rather than @@ -1772,8 +1776,6 @@ { this.checkPatternExport(exports, pat.left); } else if (type === "RestElement") { this.checkPatternExport(exports, pat.argument); } - else if (type === "ParenthesizedExpression") - { this.checkPatternExport(exports, pat.expression); } }; pp$8.checkVariableExport = function(exports, decls) { @@ -2337,7 +2339,7 @@ { this.exprAllowed = type.beforeExpr; } }; - // Used to handle egde cases when token context could not be inferred correctly during tokenization phase + // Used to handle edge cases when token context could not be inferred correctly during tokenization phase pp$6.overrideContext = function(tokenCtx) { if (this.curContext() !== tokenCtx) { @@ -2390,6 +2392,11 @@ this.exprAllowed = false; }; + types$1.colon.updateContext = function() { + if (this.curContext().token === "function") { this.context.pop(); } + this.exprAllowed = true; + }; + types$1.backQuote.updateContext = function() { if (this.curContext() === types.q_tmpl) { this.context.pop(); } @@ -2935,12 +2942,14 @@ // Consume `import` as an identifier for `import.meta`. // Because `this.parseIdent(true)` doesn't check escape sequences, it needs the check of `this.containsEsc`. if (this.containsEsc) { this.raiseRecoverable(this.start, "Escape sequence in keyword import"); } - var meta = this.parseIdent(true); + this.next(); if (this.type === types$1.parenL && !forNew) { return this.parseDynamicImport(node) } else if (this.type === types$1.dot) { - node.meta = meta; + var meta = this.startNodeAt(node.start, node.loc && node.loc.start); + meta.name = "import"; + node.meta = this.finishNode(meta, "Identifier"); return this.parseImportMeta(node) } else { this.unexpected(); @@ -3088,9 +3097,12 @@ pp$5.parseNew = function() { if (this.containsEsc) { this.raiseRecoverable(this.start, "Escape sequence in keyword new"); } var node = this.startNode(); - var meta = this.parseIdent(true); - if (this.options.ecmaVersion >= 6 && this.eat(types$1.dot)) { - node.meta = meta; + this.next(); + if (this.options.ecmaVersion >= 6 && this.type === types$1.dot) { + var meta = this.startNodeAt(node.start, node.loc && node.loc.start); + meta.name = "new"; + node.meta = this.finishNode(meta, "Identifier"); + this.next(); var containsEsc = this.containsEsc; node.property = this.parseIdent(true); if (node.property.name !== "target") @@ -3492,6 +3504,7 @@ (this.lastTokEnd !== this.lastTokStart + 1 || this.input.charCodeAt(this.lastTokStart) !== 46)) { this.context.pop(); } + this.type = types$1.name; } else { this.unexpected(); } @@ -5914,7 +5927,7 @@ // [walk]: util/walk.js - var version = "8.10.0"; + var version = "8.11.3"; Parser.acorn = { Parser: Parser, @@ -5939,11 +5952,10 @@ }; // The main exported interface (under `self.acorn` when in the - // browser) is a `parse` function that takes a code string and - // returns an abstract syntax tree as specified by [Mozilla parser - // API][api]. + // browser) is a `parse` function that takes a code string and returns + // an abstract syntax tree as specified by the [ESTree spec][estree]. // - // [api]: https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API + // [estree]: https://github.com/estree/estree function parse(input, options) { return Parser.parse(input, options) diff --git a/deps/acorn/acorn/dist/acorn.mjs b/deps/acorn/acorn/dist/acorn.mjs index 119eff98d4ded6..d1f81ef48511a4 100644 --- a/deps/acorn/acorn/dist/acorn.mjs +++ b/deps/acorn/acorn/dist/acorn.mjs @@ -2,10 +2,10 @@ var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 370, 1, 81, 2, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 9, 5351, 0, 7, 14, 13835, 9, 87, 9, 39, 4, 60, 6, 26, 9, 1014, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4706, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 983, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; // This file was generated. Do not modify manually! -var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 4026, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 757, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 3104, 541, 1507, 4938, 6, 4191]; +var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 4026, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 757, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 4191]; // This file was generated. Do not modify manually! -var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0898-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f"; +var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0898-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65"; // This file was generated. Do not modify manually! var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088e\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ca\ua7d0\ua7d1\ua7d3\ua7d5-\ua7d9\ua7f2-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; @@ -273,8 +273,10 @@ var isArray = Array.isArray || (function (obj) { return ( toString.call(obj) === "[object Array]" ); }); +var regexpCache = Object.create(null); + function wordsRegexp(words) { - return new RegExp("^(?:" + words.replace(/ /g, "|") + ")$") + return regexpCache[words] || (regexpCache[words] = new RegExp("^(?:" + words.replace(/ /g, "|") + ")$")) } function codePointToString(code) { @@ -334,11 +336,11 @@ var defaultOptions = { // Can be either `"script"` or `"module"`. This influences global // strict mode and parsing of `import` and `export` declarations. sourceType: "script", - // `onInsertedSemicolon` can be a callback that will be called - // when a semicolon is automatically inserted. It will be passed - // the position of the comma as an offset, and if `locations` is - // enabled, it is given the location as a `{line, column}` object - // as second argument. + // `onInsertedSemicolon` can be a callback that will be called when + // a semicolon is automatically inserted. It will be passed the + // position of the inserted semicolon as an offset, and if + // `locations` is enabled, it is given the location as a `{line, + // column}` object as second argument. onInsertedSemicolon: null, // `onTrailingComma` is similar to `onInsertedSemicolon`, but for // trailing commas. @@ -391,6 +393,8 @@ var defaultOptions = { // passed, the full `{line, column}` locations of the start and // end of the comments. Note that you are not allowed to call the // parser from the callback—that will corrupt its internal state. + // When this option has an array as value, objects representing the + // comments are pushed to it. onComment: null, // Nodes have their start and end characters offsets recorded in // `start` and `end` properties (directly on the node, rather than @@ -1766,8 +1770,6 @@ pp$8.checkPatternExport = function(exports, pat) { { this.checkPatternExport(exports, pat.left); } else if (type === "RestElement") { this.checkPatternExport(exports, pat.argument); } - else if (type === "ParenthesizedExpression") - { this.checkPatternExport(exports, pat.expression); } }; pp$8.checkVariableExport = function(exports, decls) { @@ -2331,7 +2333,7 @@ pp$6.updateContext = function(prevType) { { this.exprAllowed = type.beforeExpr; } }; -// Used to handle egde cases when token context could not be inferred correctly during tokenization phase +// Used to handle edge cases when token context could not be inferred correctly during tokenization phase pp$6.overrideContext = function(tokenCtx) { if (this.curContext() !== tokenCtx) { @@ -2384,6 +2386,11 @@ types$1._function.updateContext = types$1._class.updateContext = function(prevTy this.exprAllowed = false; }; +types$1.colon.updateContext = function() { + if (this.curContext().token === "function") { this.context.pop(); } + this.exprAllowed = true; +}; + types$1.backQuote.updateContext = function() { if (this.curContext() === types.q_tmpl) { this.context.pop(); } @@ -2929,12 +2936,14 @@ pp$5.parseExprImport = function(forNew) { // Consume `import` as an identifier for `import.meta`. // Because `this.parseIdent(true)` doesn't check escape sequences, it needs the check of `this.containsEsc`. if (this.containsEsc) { this.raiseRecoverable(this.start, "Escape sequence in keyword import"); } - var meta = this.parseIdent(true); + this.next(); if (this.type === types$1.parenL && !forNew) { return this.parseDynamicImport(node) } else if (this.type === types$1.dot) { - node.meta = meta; + var meta = this.startNodeAt(node.start, node.loc && node.loc.start); + meta.name = "import"; + node.meta = this.finishNode(meta, "Identifier"); return this.parseImportMeta(node) } else { this.unexpected(); @@ -3082,9 +3091,12 @@ var empty = []; pp$5.parseNew = function() { if (this.containsEsc) { this.raiseRecoverable(this.start, "Escape sequence in keyword new"); } var node = this.startNode(); - var meta = this.parseIdent(true); - if (this.options.ecmaVersion >= 6 && this.eat(types$1.dot)) { - node.meta = meta; + this.next(); + if (this.options.ecmaVersion >= 6 && this.type === types$1.dot) { + var meta = this.startNodeAt(node.start, node.loc && node.loc.start); + meta.name = "new"; + node.meta = this.finishNode(meta, "Identifier"); + this.next(); var containsEsc = this.containsEsc; node.property = this.parseIdent(true); if (node.property.name !== "target") @@ -3486,6 +3498,7 @@ pp$5.parseIdentNode = function() { (this.lastTokEnd !== this.lastTokStart + 1 || this.input.charCodeAt(this.lastTokStart) !== 46)) { this.context.pop(); } + this.type = types$1.name; } else { this.unexpected(); } @@ -5908,7 +5921,7 @@ pp.readWord = function() { // [walk]: util/walk.js -var version = "8.10.0"; +var version = "8.11.3"; Parser.acorn = { Parser: Parser, @@ -5933,11 +5946,10 @@ Parser.acorn = { }; // The main exported interface (under `self.acorn` when in the -// browser) is a `parse` function that takes a code string and -// returns an abstract syntax tree as specified by [Mozilla parser -// API][api]. +// browser) is a `parse` function that takes a code string and returns +// an abstract syntax tree as specified by the [ESTree spec][estree]. // -// [api]: https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API +// [estree]: https://github.com/estree/estree function parse(input, options) { return Parser.parse(input, options) diff --git a/deps/acorn/acorn/package.json b/deps/acorn/acorn/package.json index 4243aa3542deb3..1b8dc76afc3cf5 100644 --- a/deps/acorn/acorn/package.json +++ b/deps/acorn/acorn/package.json @@ -16,7 +16,7 @@ ], "./package.json": "./package.json" }, - "version": "8.10.0", + "version": "8.11.3", "engines": { "node": ">=0.4.0" }, diff --git a/deps/ada/BUILD.gn b/deps/ada/BUILD.gn new file mode 100644 index 00000000000000..e92ac3a3beac14 --- /dev/null +++ b/deps/ada/BUILD.gn @@ -0,0 +1,14 @@ +############################################################################## +# # +# DO NOT EDIT THIS FILE! # +# # +############################################################################## + +# This file is used by GN for building, which is NOT the build system used for +# building official binaries. +# Please modify the gyp files if you are making changes to build system. + +import("unofficial.gni") + +ada_gn_build("ada") { +} diff --git a/deps/ada/ada.cpp b/deps/ada/ada.cpp index 1175b114d8addd..449046ff41d3ca 100644 --- a/deps/ada/ada.cpp +++ b/deps/ada/ada.cpp @@ -1,4 +1,4 @@ -/* auto-generated on 2023-09-30 20:34:30 -0400. Do not edit! */ +/* auto-generated on 2023-11-19 13:35:02 -0500. Do not edit! */ /* begin file src/ada.cpp */ #include "ada.h" /* begin file src/checkers.cpp */ @@ -7,62 +7,79 @@ namespace ada::checkers { ada_really_inline ada_constexpr bool is_ipv4(std::string_view view) noexcept { - size_t last_dot = view.rfind('.'); - if (last_dot == view.size() - 1) { + // The string is not empty and does not contain upper case ASCII characters. + // + // Optimization. To be considered as a possible ipv4, the string must end + // with 'x' or a lowercase hex character. + // Most of the time, this will be false so this simple check will save a lot + // of effort. + char last_char = view.back(); + // If the address ends with a dot, we need to prune it (special case). + if (last_char == '.') { view.remove_suffix(1); - last_dot = view.rfind('.'); + if (view.empty()) { + return false; + } + last_char = view.back(); } - std::string_view number = - (last_dot == std::string_view::npos) ? view : view.substr(last_dot + 1); - if (number.empty()) { + bool possible_ipv4 = (last_char >= '0' && last_char <= '9') || + (last_char >= 'a' && last_char <= 'f') || + last_char == 'x'; + if (!possible_ipv4) { return false; } + // From the last character, find the last dot. + size_t last_dot = view.rfind('.'); + if (last_dot != std::string_view::npos) { + // We have at least one dot. + view = view.substr(last_dot + 1); + } /** Optimization opportunity: we have basically identified the last number of the ipv4 if we return true here. We might as well parse it and have at least one number parsed when we get to parse_ipv4. */ - if (std::all_of(number.begin(), number.end(), ada::checkers::is_digit)) { + if (std::all_of(view.begin(), view.end(), ada::checkers::is_digit)) { + return true; + } + // It could be hex (0x), but not if there is a single character. + if (view.size() == 1) { + return false; + } + // It must start with 0x. + if (!std::equal(view.begin(), view.begin() + 2, "0x")) { + return false; + } + // We must allow "0x". + if (view.size() == 2) { return true; } - return (checkers::has_hex_prefix(number) && - std::all_of(number.begin() + 2, number.end(), - ada::unicode::is_lowercase_hex)); + // We have 0x followed by some characters, we need to check that they are + // hexadecimals. + return std::all_of(view.begin() + 2, view.end(), + ada::unicode::is_lowercase_hex); } // for use with path_signature, we include all characters that need percent // encoding. -static constexpr uint8_t path_signature_table[256] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; -static_assert(path_signature_table[uint8_t('?')] == 1); -static_assert(path_signature_table[uint8_t('`')] == 1); -static_assert(path_signature_table[uint8_t('{')] == 1); -static_assert(path_signature_table[uint8_t('}')] == 1); -// -static_assert(path_signature_table[uint8_t(' ')] == 1); -static_assert(path_signature_table[uint8_t('?')] == 1); -static_assert(path_signature_table[uint8_t('"')] == 1); -static_assert(path_signature_table[uint8_t('#')] == 1); -static_assert(path_signature_table[uint8_t('<')] == 1); -static_assert(path_signature_table[uint8_t('>')] == 1); -static_assert(path_signature_table[uint8_t('\\')] == 2); -static_assert(path_signature_table[uint8_t('.')] == 4); -static_assert(path_signature_table[uint8_t('%')] == 8); - -// -static_assert(path_signature_table[0] == 1); -static_assert(path_signature_table[31] == 1); -static_assert(path_signature_table[127] == 1); -static_assert(path_signature_table[128] == 1); -static_assert(path_signature_table[255] == 1); +static constexpr std::array path_signature_table = + []() constexpr { + std::array result{}; + for (size_t i = 0; i < 256; i++) { + if (i <= 0x20 || i == 0x22 || i == 0x23 || i == 0x3c || i == 0x3e || + i == 0x3f || i == 0x60 || i == 0x7b || i == 0x7b || i == 0x7d || + i > 0x7e) { + result[i] = 1; + } else if (i == 0x25) { + result[i] = 8; + } else if (i == 0x2e) { + result[i] = 4; + } else if (i == 0x5c) { + result[i] = 2; + } else { + result[i] = 0; + } + } + return result; + }(); ada_really_inline constexpr uint8_t path_signature( std::string_view input) noexcept { @@ -9912,56 +9929,36 @@ ada_really_inline bool has_tabs_or_newline( // U+0020 SPACE, U+0023 (#), U+002F (/), U+003A (:), U+003C (<), U+003E (>), // U+003F (?), U+0040 (@), U+005B ([), U+005C (\), U+005D (]), U+005E (^), or // U+007C (|). -constexpr static bool is_forbidden_host_code_point_table[] = { - 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static_assert(sizeof(is_forbidden_host_code_point_table) == 256); +constexpr static std::array is_forbidden_host_code_point_table = + []() constexpr { + std::array result{}; + for (uint8_t c : {'\0', '\x09', '\x0a', '\x0d', ' ', '#', '/', ':', '<', + '>', '?', '@', '[', '\\', ']', '^', '|'}) { + result[c] = true; + } + return result; + }(); ada_really_inline constexpr bool is_forbidden_host_code_point( const char c) noexcept { return is_forbidden_host_code_point_table[uint8_t(c)]; } -static_assert(unicode::is_forbidden_host_code_point('\0')); -static_assert(unicode::is_forbidden_host_code_point('\t')); -static_assert(unicode::is_forbidden_host_code_point('\n')); -static_assert(unicode::is_forbidden_host_code_point('\r')); -static_assert(unicode::is_forbidden_host_code_point(' ')); -static_assert(unicode::is_forbidden_host_code_point('#')); -static_assert(unicode::is_forbidden_host_code_point('/')); -static_assert(unicode::is_forbidden_host_code_point(':')); -static_assert(unicode::is_forbidden_host_code_point('?')); -static_assert(unicode::is_forbidden_host_code_point('@')); -static_assert(unicode::is_forbidden_host_code_point('[')); -static_assert(unicode::is_forbidden_host_code_point('?')); -static_assert(unicode::is_forbidden_host_code_point('<')); -static_assert(unicode::is_forbidden_host_code_point('>')); -static_assert(unicode::is_forbidden_host_code_point('\\')); -static_assert(unicode::is_forbidden_host_code_point(']')); -static_assert(unicode::is_forbidden_host_code_point('^')); -static_assert(unicode::is_forbidden_host_code_point('|')); - -constexpr static uint8_t is_forbidden_domain_code_point_table[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; +constexpr static std::array is_forbidden_domain_code_point_table = + []() constexpr { + std::array result{}; + for (uint8_t c : {'\0', '\x09', '\x0a', '\x0d', ' ', '#', '/', ':', '<', + '>', '?', '@', '[', '\\', ']', '^', '|', '%'}) { + result[c] = true; + } + for (uint8_t c = 0; c <= 32; c++) { + result[c] = true; + } + for (size_t c = 127; c < 255; c++) { + result[c] = true; + } + return result; + }(); static_assert(sizeof(is_forbidden_domain_code_point_table) == 256); @@ -9986,22 +9983,24 @@ ada_really_inline constexpr bool contains_forbidden_domain_code_point( return accumulator; } -constexpr static uint8_t is_forbidden_domain_code_point_table_or_upper[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; - -static_assert(sizeof(is_forbidden_domain_code_point_table_or_upper) == 256); -static_assert(is_forbidden_domain_code_point_table_or_upper[uint8_t('A')] == 2); -static_assert(is_forbidden_domain_code_point_table_or_upper[uint8_t('Z')] == 2); +constexpr static std::array + is_forbidden_domain_code_point_table_or_upper = []() constexpr { + std::array result{}; + for (uint8_t c : {'\0', '\x09', '\x0a', '\x0d', ' ', '#', '/', ':', '<', + '>', '?', '@', '[', '\\', ']', '^', '|', '%'}) { + result[c] = 1; + } + for (uint8_t c = 'A'; c <= 'Z'; c++) { + result[c] = 2; + } + for (uint8_t c = 0; c <= 32; c++) { + result[c] = 1; + } + for (size_t c = 127; c < 255; c++) { + result[c] = 1; + } + return result; + }(); ada_really_inline constexpr uint8_t contains_forbidden_domain_code_point_or_upper(const char* input, @@ -10025,41 +10024,22 @@ contains_forbidden_domain_code_point_or_upper(const char* input, return accumulator; } -static_assert(unicode::is_forbidden_domain_code_point('%')); -static_assert(unicode::is_forbidden_domain_code_point('\x7f')); -static_assert(unicode::is_forbidden_domain_code_point('\0')); -static_assert(unicode::is_forbidden_domain_code_point('\t')); -static_assert(unicode::is_forbidden_domain_code_point('\n')); -static_assert(unicode::is_forbidden_domain_code_point('\r')); -static_assert(unicode::is_forbidden_domain_code_point(' ')); -static_assert(unicode::is_forbidden_domain_code_point('#')); -static_assert(unicode::is_forbidden_domain_code_point('/')); -static_assert(unicode::is_forbidden_domain_code_point(':')); -static_assert(unicode::is_forbidden_domain_code_point('?')); -static_assert(unicode::is_forbidden_domain_code_point('@')); -static_assert(unicode::is_forbidden_domain_code_point('[')); -static_assert(unicode::is_forbidden_domain_code_point('?')); -static_assert(unicode::is_forbidden_domain_code_point('<')); -static_assert(unicode::is_forbidden_domain_code_point('>')); -static_assert(unicode::is_forbidden_domain_code_point('\\')); -static_assert(unicode::is_forbidden_domain_code_point(']')); -static_assert(unicode::is_forbidden_domain_code_point('^')); -static_assert(unicode::is_forbidden_domain_code_point('|')); - -constexpr static bool is_alnum_plus_table[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - -static_assert(sizeof(is_alnum_plus_table) == 256); +// std::isalnum(c) || c == '+' || c == '-' || c == '.') is true for +constexpr static std::array is_alnum_plus_table = []() constexpr { + std::array result{}; + for (size_t c = 0; c < 256; c++) { + if (c >= '0' && c <= '9') { + result[c] = true; + } else if (c >= 'a' && c <= 'z') { + result[c] = true; + } else if (c >= 'A' && c <= 'Z') { + result[c] = true; + } else if (c == '+' || c == '-' || c == '.') { + result[c] = true; + } + } + return result; +}(); ada_really_inline constexpr bool is_alnum_plus(const char c) noexcept { return is_alnum_plus_table[uint8_t(c)]; @@ -10067,13 +10047,6 @@ ada_really_inline constexpr bool is_alnum_plus(const char c) noexcept { // following under most compilers: return // return (std::isalnum(c) || c == '+' || c == '-' || c == '.'); } -static_assert(unicode::is_alnum_plus('+')); -static_assert(unicode::is_alnum_plus('-')); -static_assert(unicode::is_alnum_plus('.')); -static_assert(unicode::is_alnum_plus('0')); -static_assert(unicode::is_alnum_plus('1')); -static_assert(unicode::is_alnum_plus('a')); -static_assert(unicode::is_alnum_plus('b')); ada_really_inline constexpr bool is_ascii_hex_digit(const char c) noexcept { return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || @@ -10617,155 +10590,302 @@ ada_really_inline void resize(std::string_view& input, size_t pos) noexcept { input.remove_suffix(input.size() - pos); } -// Reverse the byte order. -ada_really_inline uint64_t swap_bytes(uint64_t val) noexcept { - // performance: this often compiles to a single instruction (e.g., bswap) - return ((((val)&0xff00000000000000ull) >> 56) | - (((val)&0x00ff000000000000ull) >> 40) | - (((val)&0x0000ff0000000000ull) >> 24) | - (((val)&0x000000ff00000000ull) >> 8) | - (((val)&0x00000000ff000000ull) << 8) | - (((val)&0x0000000000ff0000ull) << 24) | - (((val)&0x000000000000ff00ull) << 40) | - (((val)&0x00000000000000ffull) << 56)); -} - -ada_really_inline uint64_t swap_bytes_if_big_endian(uint64_t val) noexcept { - // performance: under little-endian systems (most systems), this function - // is free (just returns the input). -#if ADA_IS_BIG_ENDIAN - return swap_bytes(val); -#else - return val; // unchanged (trivial) -#endif +// computes the number of trailing zeroes +// this is a private inline function only defined in this source file. +ada_really_inline int trailing_zeroes(uint32_t input_num) noexcept { +#ifdef ADA_REGULAR_VISUAL_STUDIO + unsigned long ret; + // Search the mask data from least significant bit (LSB) + // to the most significant bit (MSB) for a set bit (1). + _BitScanForward(&ret, input_num); + return (int)ret; +#else // ADA_REGULAR_VISUAL_STUDIO + return __builtin_ctzl(input_num); +#endif // ADA_REGULAR_VISUAL_STUDIO } // starting at index location, this finds the next location of a character // :, /, \\, ? or [. If none is found, view.size() is returned. // For use within get_host_delimiter_location. +#if ADA_NEON +// The ada_make_uint8x16_t macro is necessary because Visual Studio does not +// support direct initialization of uint8x16_t. See +// https://developercommunity.visualstudio.com/t/error-C2078:-too-many-initializers-whe/402911?q=backend+neon +#ifndef ada_make_uint8x16_t +#define ada_make_uint8x16_t(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, \ + x13, x14, x15, x16) \ + ([=]() { \ + static uint8_t array[16] = {x1, x2, x3, x4, x5, x6, x7, x8, \ + x9, x10, x11, x12, x13, x14, x15, x16}; \ + return vld1q_u8(array); \ + }()) +#endif + ada_really_inline size_t find_next_host_delimiter_special( std::string_view view, size_t location) noexcept { - // performance: if you plan to call find_next_host_delimiter more than once, - // you *really* want find_next_host_delimiter to be inlined, because - // otherwise, the constants may get reloaded each time (bad). - auto has_zero_byte = [](uint64_t v) { - return ((v - 0x0101010101010101) & ~(v)&0x8080808080808080); - }; - auto index_of_first_set_byte = [](uint64_t v) { - return ((((v - 1) & 0x101010101010101) * 0x101010101010101) >> 56) - 1; - }; - auto broadcast = [](uint8_t v) -> uint64_t { - return 0x101010101010101ull * v; + // first check for short strings in which case we do it naively. + if (view.size() - location < 16) { // slow path + for (size_t i = location; i < view.size(); i++) { + if (view[i] == ':' || view[i] == '/' || view[i] == '\\' || + view[i] == '?' || view[i] == '[') { + return i; + } + } + return size_t(view.size()); + } + auto to_bitmask = [](uint8x16_t input) -> uint16_t { + uint8x16_t bit_mask = + ada_make_uint8x16_t(0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x01, + 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80); + uint8x16_t minput = vandq_u8(input, bit_mask); + uint8x16_t tmp = vpaddq_u8(minput, minput); + tmp = vpaddq_u8(tmp, tmp); + tmp = vpaddq_u8(tmp, tmp); + return vgetq_lane_u16(vreinterpretq_u16_u8(tmp), 0); }; + + // fast path for long strings (expected to be common) size_t i = location; - uint64_t mask1 = broadcast(':'); - uint64_t mask2 = broadcast('/'); - uint64_t mask3 = broadcast('\\'); - uint64_t mask4 = broadcast('?'); - uint64_t mask5 = broadcast('['); - // This loop will get autovectorized under many optimizing compilers, - // so you get actually SIMD! - for (; i + 7 < view.size(); i += 8) { - uint64_t word{}; - // performance: the next memcpy translates into a single CPU instruction. - memcpy(&word, view.data() + i, sizeof(word)); - // performance: on little-endian systems (most systems), this next line is - // free. - word = swap_bytes_if_big_endian(word); - uint64_t xor1 = word ^ mask1; - uint64_t xor2 = word ^ mask2; - uint64_t xor3 = word ^ mask3; - uint64_t xor4 = word ^ mask4; - uint64_t xor5 = word ^ mask5; - uint64_t is_match = has_zero_byte(xor1) | has_zero_byte(xor2) | - has_zero_byte(xor3) | has_zero_byte(xor4) | - has_zero_byte(xor5); - if (is_match) { - return size_t(i + index_of_first_set_byte(is_match)); + uint8x16_t low_mask = + ada_make_uint8x16_t(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x04, 0x04, 0x00, 0x00, 0x03); + uint8x16_t high_mask = + ada_make_uint8x16_t(0x00, 0x00, 0x02, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); + uint8x16_t fmask = vmovq_n_u8(0xf); + uint8x16_t zero{0}; + for (; i + 15 < view.size(); i += 16) { + uint8x16_t word = vld1q_u8((const uint8_t*)view.data() + i); + uint8x16_t lowpart = vqtbl1q_u8(low_mask, vandq_u8(word, fmask)); + uint8x16_t highpart = vqtbl1q_u8(high_mask, vshrq_n_u8(word, 4)); + uint8x16_t classify = vandq_u8(lowpart, highpart); + if (vmaxvq_u8(classify) != 0) { + uint8x16_t is_zero = vceqq_u8(classify, zero); + uint16_t is_non_zero = ~to_bitmask(is_zero); + return i + trailing_zeroes(is_non_zero); } } + if (i < view.size()) { - uint64_t word{}; - // performance: the next memcpy translates into a function call, but - // that is difficult to avoid. Might be a bit expensive. - memcpy(&word, view.data() + i, view.size() - i); - word = swap_bytes_if_big_endian(word); - uint64_t xor1 = word ^ mask1; - uint64_t xor2 = word ^ mask2; - uint64_t xor3 = word ^ mask3; - uint64_t xor4 = word ^ mask4; - uint64_t xor5 = word ^ mask5; - uint64_t is_match = has_zero_byte(xor1) | has_zero_byte(xor2) | - has_zero_byte(xor3) | has_zero_byte(xor4) | - has_zero_byte(xor5); - if (is_match) { - return size_t(i + index_of_first_set_byte(is_match)); + uint8x16_t word = + vld1q_u8((const uint8_t*)view.data() + view.length() - 16); + uint8x16_t lowpart = vqtbl1q_u8(low_mask, vandq_u8(word, fmask)); + uint8x16_t highpart = vqtbl1q_u8(high_mask, vshrq_n_u8(word, 4)); + uint8x16_t classify = vandq_u8(lowpart, highpart); + if (vmaxvq_u8(classify) != 0) { + uint8x16_t is_zero = vceqq_u8(classify, zero); + uint16_t is_non_zero = ~to_bitmask(is_zero); + return view.length() - 16 + trailing_zeroes(is_non_zero); + } + } + return size_t(view.size()); +} +#elif ADA_SSE2 +ada_really_inline size_t find_next_host_delimiter_special( + std::string_view view, size_t location) noexcept { + // first check for short strings in which case we do it naively. + if (view.size() - location < 16) { // slow path + for (size_t i = location; i < view.size(); i++) { + if (view[i] == ':' || view[i] == '/' || view[i] == '\\' || + view[i] == '?' || view[i] == '[') { + return i; + } } + return size_t(view.size()); } - return view.size(); + // fast path for long strings (expected to be common) + size_t i = location; + const __m128i mask1 = _mm_set1_epi8(':'); + const __m128i mask2 = _mm_set1_epi8('/'); + const __m128i mask3 = _mm_set1_epi8('\\'); + const __m128i mask4 = _mm_set1_epi8('?'); + const __m128i mask5 = _mm_set1_epi8('['); + + for (; i + 15 < view.size(); i += 16) { + __m128i word = _mm_loadu_si128((const __m128i*)(view.data() + i)); + __m128i m1 = _mm_cmpeq_epi8(word, mask1); + __m128i m2 = _mm_cmpeq_epi8(word, mask2); + __m128i m3 = _mm_cmpeq_epi8(word, mask3); + __m128i m4 = _mm_cmpeq_epi8(word, mask4); + __m128i m5 = _mm_cmpeq_epi8(word, mask5); + __m128i m = _mm_or_si128( + _mm_or_si128(_mm_or_si128(m1, m2), _mm_or_si128(m3, m4)), m5); + int mask = _mm_movemask_epi8(m); + if (mask != 0) { + return i + trailing_zeroes(mask); + } + } + if (i < view.size()) { + __m128i word = + _mm_loadu_si128((const __m128i*)(view.data() + view.length() - 16)); + __m128i m1 = _mm_cmpeq_epi8(word, mask1); + __m128i m2 = _mm_cmpeq_epi8(word, mask2); + __m128i m3 = _mm_cmpeq_epi8(word, mask3); + __m128i m4 = _mm_cmpeq_epi8(word, mask4); + __m128i m5 = _mm_cmpeq_epi8(word, mask5); + __m128i m = _mm_or_si128( + _mm_or_si128(_mm_or_si128(m1, m2), _mm_or_si128(m3, m4)), m5); + int mask = _mm_movemask_epi8(m); + if (mask != 0) { + return view.length() - 16 + trailing_zeroes(mask); + } + } + return size_t(view.length()); } +#else +// : / [ \\ ? +static constexpr std::array special_host_delimiters = + []() constexpr { + std::array result{}; + for (int i : {':', '/', '[', '\\', '?'}) { + result[i] = 1; + } + return result; + }(); +// credit: @the-moisrex recommended a table-based approach +ada_really_inline size_t find_next_host_delimiter_special( + std::string_view view, size_t location) noexcept { + auto const str = view.substr(location); + for (auto pos = str.begin(); pos != str.end(); ++pos) { + if (special_host_delimiters[(uint8_t)*pos]) { + return pos - str.begin() + location; + } + } + return size_t(view.size()); +} +#endif // starting at index location, this finds the next location of a character // :, /, ? or [. If none is found, view.size() is returned. // For use within get_host_delimiter_location. +#if ADA_NEON ada_really_inline size_t find_next_host_delimiter(std::string_view view, size_t location) noexcept { - // performance: if you plan to call find_next_host_delimiter more than once, - // you *really* want find_next_host_delimiter to be inlined, because - // otherwise, the constants may get reloaded each time (bad). - auto has_zero_byte = [](uint64_t v) { - return ((v - 0x0101010101010101) & ~(v)&0x8080808080808080); - }; - auto index_of_first_set_byte = [](uint64_t v) { - return ((((v - 1) & 0x101010101010101) * 0x101010101010101) >> 56) - 1; - }; - auto broadcast = [](uint8_t v) -> uint64_t { - return 0x101010101010101ull * v; + // first check for short strings in which case we do it naively. + if (view.size() - location < 16) { // slow path + for (size_t i = location; i < view.size(); i++) { + if (view[i] == ':' || view[i] == '/' || view[i] == '?' || + view[i] == '[') { + return i; + } + } + return size_t(view.size()); + } + auto to_bitmask = [](uint8x16_t input) -> uint16_t { + uint8x16_t bit_mask = + ada_make_uint8x16_t(0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x01, + 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80); + uint8x16_t minput = vandq_u8(input, bit_mask); + uint8x16_t tmp = vpaddq_u8(minput, minput); + tmp = vpaddq_u8(tmp, tmp); + tmp = vpaddq_u8(tmp, tmp); + return vgetq_lane_u16(vreinterpretq_u16_u8(tmp), 0); }; + + // fast path for long strings (expected to be common) size_t i = location; - uint64_t mask1 = broadcast(':'); - uint64_t mask2 = broadcast('/'); - uint64_t mask4 = broadcast('?'); - uint64_t mask5 = broadcast('['); - // This loop will get autovectorized under many optimizing compilers, - // so you get actually SIMD! - for (; i + 7 < view.size(); i += 8) { - uint64_t word{}; - // performance: the next memcpy translates into a single CPU instruction. - memcpy(&word, view.data() + i, sizeof(word)); - // performance: on little-endian systems (most systems), this next line is - // free. - word = swap_bytes_if_big_endian(word); - uint64_t xor1 = word ^ mask1; - uint64_t xor2 = word ^ mask2; - uint64_t xor4 = word ^ mask4; - uint64_t xor5 = word ^ mask5; - uint64_t is_match = has_zero_byte(xor1) | has_zero_byte(xor2) | - has_zero_byte(xor4) | has_zero_byte(xor5); - if (is_match) { - return size_t(i + index_of_first_set_byte(is_match)); + uint8x16_t low_mask = + ada_make_uint8x16_t(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x03); + uint8x16_t high_mask = + ada_make_uint8x16_t(0x00, 0x00, 0x02, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); + uint8x16_t fmask = vmovq_n_u8(0xf); + uint8x16_t zero{0}; + for (; i + 15 < view.size(); i += 16) { + uint8x16_t word = vld1q_u8((const uint8_t*)view.data() + i); + uint8x16_t lowpart = vqtbl1q_u8(low_mask, vandq_u8(word, fmask)); + uint8x16_t highpart = vqtbl1q_u8(high_mask, vshrq_n_u8(word, 4)); + uint8x16_t classify = vandq_u8(lowpart, highpart); + if (vmaxvq_u8(classify) != 0) { + uint8x16_t is_zero = vceqq_u8(classify, zero); + uint16_t is_non_zero = ~to_bitmask(is_zero); + return i + trailing_zeroes(is_non_zero); } } + if (i < view.size()) { - uint64_t word{}; - // performance: the next memcpy translates into a function call, but - // that is difficult to avoid. Might be a bit expensive. - memcpy(&word, view.data() + i, view.size() - i); - // performance: on little-endian systems (most systems), this next line is - // free. - word = swap_bytes_if_big_endian(word); - uint64_t xor1 = word ^ mask1; - uint64_t xor2 = word ^ mask2; - uint64_t xor4 = word ^ mask4; - uint64_t xor5 = word ^ mask5; - uint64_t is_match = has_zero_byte(xor1) | has_zero_byte(xor2) | - has_zero_byte(xor4) | has_zero_byte(xor5); - if (is_match) { - return size_t(i + index_of_first_set_byte(is_match)); + uint8x16_t word = + vld1q_u8((const uint8_t*)view.data() + view.length() - 16); + uint8x16_t lowpart = vqtbl1q_u8(low_mask, vandq_u8(word, fmask)); + uint8x16_t highpart = vqtbl1q_u8(high_mask, vshrq_n_u8(word, 4)); + uint8x16_t classify = vandq_u8(lowpart, highpart); + if (vmaxvq_u8(classify) != 0) { + uint8x16_t is_zero = vceqq_u8(classify, zero); + uint16_t is_non_zero = ~to_bitmask(is_zero); + return view.length() - 16 + trailing_zeroes(is_non_zero); + } + } + return size_t(view.size()); +} +#elif ADA_SSE2 +ada_really_inline size_t find_next_host_delimiter(std::string_view view, + size_t location) noexcept { + // first check for short strings in which case we do it naively. + if (view.size() - location < 16) { // slow path + for (size_t i = location; i < view.size(); i++) { + if (view[i] == ':' || view[i] == '/' || view[i] == '?' || + view[i] == '[') { + return i; + } + } + return size_t(view.size()); + } + // fast path for long strings (expected to be common) + size_t i = location; + const __m128i mask1 = _mm_set1_epi8(':'); + const __m128i mask2 = _mm_set1_epi8('/'); + const __m128i mask4 = _mm_set1_epi8('?'); + const __m128i mask5 = _mm_set1_epi8('['); + + for (; i + 15 < view.size(); i += 16) { + __m128i word = _mm_loadu_si128((const __m128i*)(view.data() + i)); + __m128i m1 = _mm_cmpeq_epi8(word, mask1); + __m128i m2 = _mm_cmpeq_epi8(word, mask2); + __m128i m4 = _mm_cmpeq_epi8(word, mask4); + __m128i m5 = _mm_cmpeq_epi8(word, mask5); + __m128i m = _mm_or_si128(_mm_or_si128(m1, m2), _mm_or_si128(m4, m5)); + int mask = _mm_movemask_epi8(m); + if (mask != 0) { + return i + trailing_zeroes(mask); } } - return view.size(); + if (i < view.size()) { + __m128i word = + _mm_loadu_si128((const __m128i*)(view.data() + view.length() - 16)); + __m128i m1 = _mm_cmpeq_epi8(word, mask1); + __m128i m2 = _mm_cmpeq_epi8(word, mask2); + __m128i m4 = _mm_cmpeq_epi8(word, mask4); + __m128i m5 = _mm_cmpeq_epi8(word, mask5); + __m128i m = _mm_or_si128(_mm_or_si128(m1, m2), _mm_or_si128(m4, m5)); + int mask = _mm_movemask_epi8(m); + if (mask != 0) { + return view.length() - 16 + trailing_zeroes(mask); + } + } + return size_t(view.length()); +} +#else +// : / [ ? +static constexpr std::array host_delimiters = []() constexpr { + std::array result{}; + for (int i : {':', '/', '?', '['}) { + result[i] = 1; + } + return result; +}(); +// credit: @the-moisrex recommended a table-based approach +ada_really_inline size_t find_next_host_delimiter(std::string_view view, + size_t location) noexcept { + auto const str = view.substr(location); + for (auto pos = str.begin(); pos != str.end(); ++pos) { + if (host_delimiters[(uint8_t)*pos]) { + return pos - str.begin() + location; + } + } + return size_t(view.size()); } +#endif ada_really_inline std::pair get_host_delimiter_location( const bool is_special, std::string_view& view) noexcept { @@ -11040,101 +11160,47 @@ ada_really_inline void strip_trailing_spaces_from_opaque_path( url.update_base_pathname(path); } +// @ / \\ ? +static constexpr std::array authority_delimiter_special = + []() constexpr { + std::array result{}; + for (int i : {'@', '/', '\\', '?'}) { + result[i] = 1; + } + return result; + }(); +// credit: @the-moisrex recommended a table-based approach ada_really_inline size_t find_authority_delimiter_special(std::string_view view) noexcept { - auto has_zero_byte = [](uint64_t v) { - return ((v - 0x0101010101010101) & ~(v)&0x8080808080808080); - }; - auto index_of_first_set_byte = [](uint64_t v) { - return ((((v - 1) & 0x101010101010101) * 0x101010101010101) >> 56) - 1; - }; - auto broadcast = [](uint8_t v) -> uint64_t { - return 0x101010101010101ull * v; - }; - size_t i = 0; - uint64_t mask1 = broadcast('@'); - uint64_t mask2 = broadcast('/'); - uint64_t mask3 = broadcast('?'); - uint64_t mask4 = broadcast('\\'); - - for (; i + 7 < view.size(); i += 8) { - uint64_t word{}; - memcpy(&word, view.data() + i, sizeof(word)); - word = swap_bytes_if_big_endian(word); - uint64_t xor1 = word ^ mask1; - uint64_t xor2 = word ^ mask2; - uint64_t xor3 = word ^ mask3; - uint64_t xor4 = word ^ mask4; - uint64_t is_match = has_zero_byte(xor1) | has_zero_byte(xor2) | - has_zero_byte(xor3) | has_zero_byte(xor4); - if (is_match) { - return size_t(i + index_of_first_set_byte(is_match)); - } - } - - if (i < view.size()) { - uint64_t word{}; - memcpy(&word, view.data() + i, view.size() - i); - word = swap_bytes_if_big_endian(word); - uint64_t xor1 = word ^ mask1; - uint64_t xor2 = word ^ mask2; - uint64_t xor3 = word ^ mask3; - uint64_t xor4 = word ^ mask4; - uint64_t is_match = has_zero_byte(xor1) | has_zero_byte(xor2) | - has_zero_byte(xor3) | has_zero_byte(xor4); - if (is_match) { - return size_t(i + index_of_first_set_byte(is_match)); + // performance note: we might be able to gain further performance + // with SIMD instrinsics. + for (auto pos = view.begin(); pos != view.end(); ++pos) { + if (authority_delimiter_special[(uint8_t)*pos]) { + return pos - view.begin(); } } - - return view.size(); + return size_t(view.size()); } +// @ / ? +static constexpr std::array authority_delimiter = []() constexpr { + std::array result{}; + for (int i : {'@', '/', '?'}) { + result[i] = 1; + } + return result; +}(); +// credit: @the-moisrex recommended a table-based approach ada_really_inline size_t find_authority_delimiter(std::string_view view) noexcept { - auto has_zero_byte = [](uint64_t v) { - return ((v - 0x0101010101010101) & ~(v)&0x8080808080808080); - }; - auto index_of_first_set_byte = [](uint64_t v) { - return ((((v - 1) & 0x101010101010101) * 0x101010101010101) >> 56) - 1; - }; - auto broadcast = [](uint8_t v) -> uint64_t { - return 0x101010101010101ull * v; - }; - size_t i = 0; - uint64_t mask1 = broadcast('@'); - uint64_t mask2 = broadcast('/'); - uint64_t mask3 = broadcast('?'); - - for (; i + 7 < view.size(); i += 8) { - uint64_t word{}; - memcpy(&word, view.data() + i, sizeof(word)); - word = swap_bytes_if_big_endian(word); - uint64_t xor1 = word ^ mask1; - uint64_t xor2 = word ^ mask2; - uint64_t xor3 = word ^ mask3; - uint64_t is_match = - has_zero_byte(xor1) | has_zero_byte(xor2) | has_zero_byte(xor3); - if (is_match) { - return size_t(i + index_of_first_set_byte(is_match)); + // performance note: we might be able to gain further performance + // with SIMD instrinsics. + for (auto pos = view.begin(); pos != view.end(); ++pos) { + if (authority_delimiter[(uint8_t)*pos]) { + return pos - view.begin(); } } - - if (i < view.size()) { - uint64_t word{}; - memcpy(&word, view.data() + i, view.size() - i); - word = swap_bytes_if_big_endian(word); - uint64_t xor1 = word ^ mask1; - uint64_t xor2 = word ^ mask2; - uint64_t xor3 = word ^ mask3; - uint64_t is_match = - has_zero_byte(xor1) | has_zero_byte(xor2) | has_zero_byte(xor3); - if (is_match) { - return size_t(i + index_of_first_set_byte(is_match)); - } - } - - return view.size(); + return size_t(view.size()); } } // namespace ada::helpers @@ -11143,6 +11209,7 @@ namespace ada { ada_warn_unused std::string to_string(ada::state state) { return ada::helpers::get_state(state); } +#undef ada_make_uint8x16_t } // namespace ada /* end file src/helpers.cpp */ /* begin file src/url.cpp */ @@ -11674,10 +11741,9 @@ ada_really_inline void url::parse_path(std::string_view input) { path = "/"; } } - return; } -std::string url::to_string() const { +[[nodiscard]] std::string url::to_string() const { if (!is_valid) { return "null"; } @@ -11797,7 +11863,7 @@ namespace ada { return host.value_or(""); } -[[nodiscard]] const std::string_view url::get_pathname() const noexcept { +[[nodiscard]] std::string_view url::get_pathname() const noexcept { return path; } @@ -12983,7 +13049,7 @@ template url_aggregator parse_url( namespace ada { -bool url_components::check_offset_consistency() const noexcept { +[[nodiscard]] bool url_components::check_offset_consistency() const noexcept { /** * https://user:pass@example.com:1234/foo/bar?baz#quux * | | | | ^^^^| | | @@ -13059,7 +13125,7 @@ bool url_components::check_offset_consistency() const noexcept { return true; } -std::string url_components::to_string() const { +[[nodiscard]] std::string url_components::to_string() const { std::string answer; auto back = std::back_insert_iterator(answer); answer.append("{\n"); @@ -13847,7 +13913,7 @@ bool url_aggregator::set_hostname(const std::string_view input) { return helpers::substring(buffer, 0, components.protocol_end); } -std::string ada::url_aggregator::to_string() const { +[[nodiscard]] std::string ada::url_aggregator::to_string() const { ada_log("url_aggregator::to_string buffer:", buffer, "[", buffer.size(), " bytes]"); if (!is_valid) { @@ -14292,7 +14358,7 @@ bool url_aggregator::parse_opaque_host(std::string_view input) { return true; } -std::string url_aggregator::to_diagram() const { +[[nodiscard]] std::string url_aggregator::to_diagram() const { if (!is_valid) { return "invalid"; } @@ -14449,7 +14515,7 @@ std::string url_aggregator::to_diagram() const { return answer; } -bool url_aggregator::validate() const noexcept { +[[nodiscard]] bool url_aggregator::validate() const noexcept { if (!is_valid) { return true; } @@ -14817,6 +14883,11 @@ ada::result& get_instance(void* result) noexcept { extern "C" { typedef void* ada_url; +typedef void* ada_url_search_params; +typedef void* ada_strings; +typedef void* ada_url_search_params_keys_iter; +typedef void* ada_url_search_params_values_iter; +typedef void* ada_url_search_params_entries_iter; struct ada_string { const char* data; @@ -14828,6 +14899,11 @@ struct ada_owned_string { size_t length; }; +struct ada_string_pair { + ada_string key; + ada_string value; +}; + ada_string ada_string_create(const char* data, size_t length) { ada_string out{}; out.data = data; @@ -15267,6 +15343,256 @@ ada_owned_string ada_idna_to_ascii(const char* input, size_t length) { return owned; } +ada_url_search_params ada_parse_search_params(const char* input, + size_t length) { + return new ada::result( + ada::url_search_params(std::string_view(input, length))); +} + +void ada_free_search_params(ada_url_search_params result) { + ada::result* r = + (ada::result*)result; + delete r; +} + +ada_owned_string ada_search_params_to_string(ada_url_search_params result) { + ada::result& r = + *(ada::result*)result; + if (!r) return ada_owned_string{NULL, 0}; + std::string out = r->to_string(); + ada_owned_string owned{}; + owned.length = out.size(); + owned.data = new char[owned.length]; + memcpy((void*)owned.data, out.data(), owned.length); + return owned; +} + +size_t ada_search_params_size(ada_url_search_params result) { + ada::result& r = + *(ada::result*)result; + if (!r) return 0; + return r->size(); +} + +void ada_search_params_sort(ada_url_search_params result) { + ada::result& r = + *(ada::result*)result; + if (r) r->sort(); +} + +void ada_search_params_append(ada_url_search_params result, const char* key, + size_t key_length, const char* value, + size_t value_length) { + ada::result& r = + *(ada::result*)result; + if (r) { + r->append(std::string_view(key, key_length), + std::string_view(value, value_length)); + } +} + +void ada_search_params_set(ada_url_search_params result, const char* key, + size_t key_length, const char* value, + size_t value_length) { + ada::result& r = + *(ada::result*)result; + if (r) { + r->set(std::string_view(key, key_length), + std::string_view(value, value_length)); + } +} + +void ada_search_params_remove(ada_url_search_params result, const char* key, + size_t key_length) { + ada::result& r = + *(ada::result*)result; + if (r) { + r->remove(std::string_view(key, key_length)); + } +} + +void ada_search_params_remove_value(ada_url_search_params result, + const char* key, size_t key_length, + const char* value, size_t value_length) { + ada::result& r = + *(ada::result*)result; + if (r) { + r->remove(std::string_view(key, key_length), + std::string_view(value, value_length)); + } +} + +bool ada_search_params_has(ada_url_search_params result, const char* key, + size_t key_length) { + ada::result& r = + *(ada::result*)result; + if (!r) return false; + return r->has(std::string_view(key, key_length)); +} + +bool ada_search_params_has_value(ada_url_search_params result, const char* key, + size_t key_length, const char* value, + size_t value_length) { + ada::result& r = + *(ada::result*)result; + if (!r) return false; + return r->has(std::string_view(key, key_length), + std::string_view(value, value_length)); +} + +ada_string ada_search_params_get(ada_url_search_params result, const char* key, + size_t key_length) { + ada::result& r = + *(ada::result*)result; + if (!r) return ada_string_create(NULL, 0); + auto found = r->get(std::string_view(key, key_length)); + if (!found.has_value()) return ada_string_create(NULL, 0); + return ada_string_create(found->data(), found->length()); +} + +ada_strings ada_search_params_get_all(ada_url_search_params result, + const char* key, size_t key_length) { + ada::result& r = + *(ada::result*)result; + if (!r) { + return new ada::result>( + std::vector()); + } + return new ada::result>( + r->get_all(std::string_view(key, key_length))); +} + +ada_url_search_params_keys_iter ada_search_params_get_keys( + ada_url_search_params result) { + ada::result& r = + *(ada::result*)result; + if (!r) { + return new ada::result( + ada::url_search_params_keys_iter()); + } + return new ada::result(r->get_keys()); +} + +ada_url_search_params_values_iter ada_search_params_get_values( + ada_url_search_params result) { + ada::result& r = + *(ada::result*)result; + if (!r) { + return new ada::result( + ada::url_search_params_values_iter()); + } + return new ada::result(r->get_values()); +} + +ada_url_search_params_entries_iter ada_search_params_get_entries( + ada_url_search_params result) { + ada::result& r = + *(ada::result*)result; + if (!r) { + return new ada::result( + ada::url_search_params_entries_iter()); + } + return new ada::result(r->get_entries()); +} + +void ada_free_strings(ada_strings result) { + ada::result>* r = + (ada::result>*)result; + delete r; +} + +size_t ada_strings_size(ada_strings result) { + ada::result>* r = + (ada::result>*)result; + if (!r) return 0; + return (*r)->size(); +} + +ada_string ada_strings_get(ada_strings result, size_t index) { + ada::result>* r = + (ada::result>*)result; + if (!r) return ada_string_create(NULL, 0); + std::string_view view = (*r)->at(index); + return ada_string_create(view.data(), view.length()); +} + +void ada_free_search_params_keys_iter(ada_url_search_params_keys_iter result) { + ada::result* r = + (ada::result*)result; + delete r; +} + +ada_string ada_search_params_keys_iter_next( + ada_url_search_params_keys_iter result) { + ada::result* r = + (ada::result*)result; + if (!r) return ada_string_create(NULL, 0); + auto next = (*r)->next(); + if (!next.has_value()) return ada_string_create(NULL, 0); + return ada_string_create(next->data(), next->length()); +} + +bool ada_search_params_keys_iter_has_next( + ada_url_search_params_keys_iter result) { + ada::result* r = + (ada::result*)result; + if (!r) return false; + return (*r)->has_next(); +} + +void ada_free_search_params_values_iter( + ada_url_search_params_values_iter result) { + ada::result* r = + (ada::result*)result; + delete r; +} + +ada_string ada_search_params_values_iter_next( + ada_url_search_params_values_iter result) { + ada::result* r = + (ada::result*)result; + if (!r) return ada_string_create(NULL, 0); + auto next = (*r)->next(); + if (!next.has_value()) return ada_string_create(NULL, 0); + return ada_string_create(next->data(), next->length()); +} + +bool ada_search_params_values_iter_has_next( + ada_url_search_params_values_iter result) { + ada::result* r = + (ada::result*)result; + if (!r) return false; + return (*r)->has_next(); +} + +void ada_free_search_params_entries_iter( + ada_url_search_params_entries_iter result) { + ada::result* r = + (ada::result*)result; + delete r; +} + +ada_string_pair ada_search_params_entries_iter_next( + ada_url_search_params_entries_iter result) { + ada::result* r = + (ada::result*)result; + if (!r) return {ada_string_create(NULL, 0), ada_string_create(NULL, 0)}; + auto next = (*r)->next(); + if (!next.has_value()) + return {ada_string_create(NULL, 0), ada_string_create(NULL, 0)}; + return ada_string_pair{ + ada_string_create(next->first.data(), next->first.length()), + ada_string_create(next->second.data(), next->second.length())}; +} + +bool ada_search_params_entries_iter_has_next( + ada_url_search_params_entries_iter result) { + ada::result* r = + (ada::result*)result; + if (!r) return false; + return (*r)->has_next(); +} + } // extern "C" /* end file src/ada_c.cpp */ /* end file src/ada.cpp */ diff --git a/deps/ada/ada.h b/deps/ada/ada.h index d6f705a5d6db67..a4aa39d17046ad 100644 --- a/deps/ada/ada.h +++ b/deps/ada/ada.h @@ -1,4 +1,4 @@ -/* auto-generated on 2023-09-30 20:34:30 -0400. Do not edit! */ +/* auto-generated on 2023-11-19 13:35:02 -0500. Do not edit! */ /* begin file include/ada.h */ /** * @file ada.h @@ -98,7 +98,7 @@ namespace ada::idna { /** * @see https://www.unicode.org/reports/tr46/#Validity_Criteria */ -bool is_label_valid(const std::u32string_view label); +bool is_label_valid(std::u32string_view label); } // namespace ada::idna @@ -479,14 +479,14 @@ namespace ada { #endif // ADA_COMMON_DEFS_H /* end file include/ada/common_defs.h */ -#include +#include /** * @namespace ada::character_sets * @brief Includes the definitions for unicode character sets. */ namespace ada::character_sets { -ada_really_inline bool bit_at(const uint8_t a[], const uint8_t i); +ada_really_inline bool bit_at(const uint8_t a[], uint8_t i); } // namespace ada::character_sets #endif // ADA_CHARACTER_SETS_H @@ -996,7 +996,7 @@ ada_really_inline bool bit_at(const uint8_t a[], const uint8_t i) { } // namespace ada::character_sets -#endif // ADA_CHARACTER_SETS_H +#endif // ADA_CHARACTER_SETS_INL_H /* end file include/ada/character_sets-inl.h */ /* begin file include/ada/checkers-inl.h */ /** @@ -1312,12 +1312,12 @@ struct url_components { * @return true if the offset values are * consistent with a possible URL string */ - bool check_offset_consistency() const noexcept; + [[nodiscard]] bool check_offset_consistency() const noexcept; /** * Converts a url_components to JSON stringified version. */ - std::string to_string() const; + [[nodiscard]] std::string to_string() const; }; // struct url_components @@ -1505,13 +1505,17 @@ struct url_base { * @return On failure, it returns zero. * @see https://url.spec.whatwg.org/#host-parsing */ - virtual ada_really_inline size_t parse_port( - std::string_view view, bool check_trailing_content = false) noexcept = 0; + virtual size_t parse_port(std::string_view view, + bool check_trailing_content) noexcept = 0; + + virtual ada_really_inline size_t parse_port(std::string_view view) noexcept { + return this->parse_port(view, false); + } /** * Returns a JSON string representation of this URL. */ - virtual std::string to_string() const = 0; + [[nodiscard]] virtual std::string to_string() const = 0; /** @private */ virtual inline void clear_pathname() = 0; @@ -1520,10 +1524,10 @@ struct url_base { virtual inline void clear_search() = 0; /** @private */ - virtual inline bool has_hash() const noexcept = 0; + [[nodiscard]] virtual inline bool has_hash() const noexcept = 0; /** @private */ - virtual inline bool has_search() const noexcept = 0; + [[nodiscard]] virtual inline bool has_search() const noexcept = 0; }; // url_base @@ -1593,7 +1597,7 @@ ada_really_inline bool shorten_path(std::string_view& path, * * @see https://url.spec.whatwg.org/ */ -ada_really_inline void parse_prepared_path(const std::string_view input, +ada_really_inline void parse_prepared_path(std::string_view input, ada::scheme::type type, std::string& path); @@ -1666,18 +1670,6 @@ template ada_really_inline void strip_trailing_spaces_from_opaque_path( url_type& url) noexcept; -/** - * @private - * Reverse the order of the bytes. - */ -ada_really_inline uint64_t swap_bytes(uint64_t val) noexcept; - -/** - * @private - * Reverse the order of the bytes but only if the system is big endian - */ -ada_really_inline uint64_t swap_bytes_if_big_endian(uint64_t val) noexcept; - /** * @private * Finds the delimiter of a view in authority state. @@ -4381,7 +4373,7 @@ constexpr ada::scheme::type get_scheme_type(std::string_view scheme) noexcept { } // namespace ada::scheme -#endif // ADA_SCHEME_H +#endif // ADA_SCHEME_INL_H /* end file include/ada/scheme-inl.h */ /* begin file include/ada/serializers.h */ /** @@ -4423,7 +4415,7 @@ std::string ipv6(const std::array& address) noexcept; * network address. * @see https://url.spec.whatwg.org/#concept-ipv4-serializer */ -std::string ipv4(const uint64_t address) noexcept; +std::string ipv4(uint64_t address) noexcept; } // namespace ada::serializers @@ -4508,8 +4500,7 @@ ada_really_inline bool has_tabs_or_newline( * Checks if the input is a forbidden host code point. * @see https://url.spec.whatwg.org/#forbidden-host-code-point */ -ada_really_inline constexpr bool is_forbidden_host_code_point( - const char c) noexcept; +ada_really_inline constexpr bool is_forbidden_host_code_point(char c) noexcept; /** * Checks if the input contains a forbidden domain code point. @@ -4533,12 +4524,12 @@ contains_forbidden_domain_code_point_or_upper(const char* input, * @see https://url.spec.whatwg.org/#forbidden-domain-code-point */ ada_really_inline constexpr bool is_forbidden_domain_code_point( - const char c) noexcept; + char c) noexcept; /** * Checks if the input is alphanumeric, '+', '-' or '.' */ -ada_really_inline constexpr bool is_alnum_plus(const char c) noexcept; +ada_really_inline constexpr bool is_alnum_plus(char c) noexcept; /** * @details An ASCII hex digit is an ASCII upper hex digit or ASCII lower hex @@ -4546,7 +4537,7 @@ ada_really_inline constexpr bool is_alnum_plus(const char c) noexcept; * range U+0041 (A) to U+0046 (F), inclusive. An ASCII lower hex digit is an * ASCII digit or a code point in the range U+0061 (a) to U+0066 (f), inclusive. */ -ada_really_inline constexpr bool is_ascii_hex_digit(const char c) noexcept; +ada_really_inline constexpr bool is_ascii_hex_digit(char c) noexcept; /** * Checks if the input is a C0 control or space character. @@ -4555,33 +4546,33 @@ ada_really_inline constexpr bool is_ascii_hex_digit(const char c) noexcept; * A C0 control is a code point in the range U+0000 NULL to U+001F INFORMATION * SEPARATOR ONE, inclusive. */ -ada_really_inline constexpr bool is_c0_control_or_space(const char c) noexcept; +ada_really_inline constexpr bool is_c0_control_or_space(char c) noexcept; /** * Checks if the input is a ASCII tab or newline character. * * @details An ASCII tab or newline is U+0009 TAB, U+000A LF, or U+000D CR. */ -ada_really_inline constexpr bool is_ascii_tab_or_newline(const char c) noexcept; +ada_really_inline constexpr bool is_ascii_tab_or_newline(char c) noexcept; /** * @details A double-dot path segment must be ".." or an ASCII case-insensitive * match for ".%2e", "%2e.", or "%2e%2e". */ ada_really_inline ada_constexpr bool is_double_dot_path_segment( - const std::string_view input) noexcept; + std::string_view input) noexcept; /** * @details A single-dot path segment must be "." or an ASCII case-insensitive * match for "%2e". */ ada_really_inline constexpr bool is_single_dot_path_segment( - const std::string_view input) noexcept; + std::string_view input) noexcept; /** * @details ipv4 character might contain 0-9 or a-f character ranges. */ -ada_really_inline constexpr bool is_lowercase_hex(const char c) noexcept; +ada_really_inline constexpr bool is_lowercase_hex(char c) noexcept; /** * @details Convert hex to binary. Caller is responsible to ensure that @@ -4597,20 +4588,20 @@ ada_really_inline unsigned constexpr convert_hex_to_binary(char c) noexcept; * @see https://github.com/nodejs/node/blob/main/src/node_url.cc#L245 * @see https://encoding.spec.whatwg.org/#utf-8-decode-without-bom */ -std::string percent_decode(const std::string_view input, size_t first_percent); +std::string percent_decode(std::string_view input, size_t first_percent); /** * Returns a percent-encoding string whether percent encoding was needed or not. * @see https://github.com/nodejs/node/blob/main/src/node_url.cc#L226 */ -std::string percent_encode(const std::string_view input, +std::string percent_encode(std::string_view input, const uint8_t character_set[]); /** * Returns a percent-encoded string version of input, while starting the percent * encoding at the provided index. * @see https://github.com/nodejs/node/blob/main/src/node_url.cc#L226 */ -std::string percent_encode(const std::string_view input, +std::string percent_encode(std::string_view input, const uint8_t character_set[], size_t index); /** * Returns true if percent encoding was needed, in which case, we store @@ -4620,13 +4611,13 @@ std::string percent_encode(const std::string_view input, * @see https://github.com/nodejs/node/blob/main/src/node_url.cc#L226 */ template -bool percent_encode(const std::string_view input, const uint8_t character_set[], +bool percent_encode(std::string_view input, const uint8_t character_set[], std::string& out); /** * Returns the index at which percent encoding should start, or (equivalently), * the length of the prefix that does not require percent encoding. */ -ada_really_inline size_t percent_encode_index(const std::string_view input, +ada_really_inline size_t percent_encode_index(std::string_view input, const uint8_t character_set[]); /** * Lowers the string in-place, assuming that the content is ASCII. @@ -4673,18 +4664,18 @@ struct url_aggregator : url_base { url_aggregator(url_aggregator &&u) noexcept = default; url_aggregator &operator=(url_aggregator &&u) noexcept = default; url_aggregator &operator=(const url_aggregator &u) = default; - ~url_aggregator() = default; - - bool set_href(const std::string_view input); - bool set_host(const std::string_view input); - bool set_hostname(const std::string_view input); - bool set_protocol(const std::string_view input); - bool set_username(const std::string_view input); - bool set_password(const std::string_view input); - bool set_port(const std::string_view input); - bool set_pathname(const std::string_view input); - void set_search(const std::string_view input); - void set_hash(const std::string_view input); + ~url_aggregator() override = default; + + bool set_href(std::string_view input); + bool set_host(std::string_view input); + bool set_hostname(std::string_view input); + bool set_protocol(std::string_view input); + bool set_username(std::string_view input); + bool set_password(std::string_view input); + bool set_port(std::string_view input); + bool set_pathname(std::string_view input); + void set_search(std::string_view input); + void set_hash(std::string_view input); [[nodiscard]] bool has_valid_domain() const noexcept override; /** @@ -4702,7 +4693,7 @@ struct url_aggregator : url_base { * @see https://url.spec.whatwg.org/#dom-url-href * @see https://url.spec.whatwg.org/#concept-url-serializer */ - inline std::string_view get_href() const noexcept; + [[nodiscard]] inline std::string_view get_href() const noexcept; /** * The username getter steps are to return this's URL's username. * This function does not allocate memory. @@ -4762,7 +4753,7 @@ struct url_aggregator : url_base { * @return size of the pathname in bytes * @see https://url.spec.whatwg.org/#dom-url-pathname */ - ada_really_inline uint32_t get_pathname_length() const noexcept; + [[nodiscard]] ada_really_inline uint32_t get_pathname_length() const noexcept; /** * Return U+003F (?), followed by this's URL's query. * This function does not allocate memory. @@ -4811,18 +4802,18 @@ struct url_aggregator : url_base { /** * Returns a string representation of this URL. */ - std::string to_string() const override; + [[nodiscard]] std::string to_string() const override; /** * Returns a string diagram of this URL. */ - std::string to_diagram() const; + [[nodiscard]] std::string to_diagram() const; /** * Verifies that the parsed URL could be valid. Useful for debugging purposes. * @return true if the URL is valid, otherwise return true of the offsets are * possible. */ - bool validate() const noexcept; + [[nodiscard]] bool validate() const noexcept; /** @return true if it has an host but it is the empty string */ [[nodiscard]] inline bool has_empty_hostname() const noexcept; @@ -4869,9 +4860,12 @@ struct url_aggregator : url_base { */ inline void reserve(uint32_t capacity); - ada_really_inline size_t - parse_port(std::string_view view, - bool check_trailing_content = false) noexcept override; + ada_really_inline size_t parse_port( + std::string_view view, bool check_trailing_content) noexcept override; + + ada_really_inline size_t parse_port(std::string_view view) noexcept override { + return this->parse_port(view, false); + } /** * Return true on success. @@ -4900,7 +4894,7 @@ struct url_aggregator : url_base { [[nodiscard]] inline bool cannot_have_credentials_or_port() const; template - bool set_host_or_hostname(const std::string_view input); + bool set_host_or_hostname(std::string_view input); ada_really_inline bool parse_host(std::string_view input); @@ -4911,26 +4905,26 @@ struct url_aggregator : url_base { inline void update_base_search(std::string_view input); inline void update_base_search(std::string_view input, const uint8_t *query_percent_encode_set); - inline void update_base_pathname(const std::string_view input); - inline void update_base_username(const std::string_view input); - inline void append_base_username(const std::string_view input); - inline void update_base_password(const std::string_view input); - inline void append_base_password(const std::string_view input); + inline void update_base_pathname(std::string_view input); + inline void update_base_username(std::string_view input); + inline void append_base_username(std::string_view input); + inline void update_base_password(std::string_view input); + inline void append_base_password(std::string_view input); inline void update_base_port(uint32_t input); - inline void append_base_pathname(const std::string_view input); - inline uint32_t retrieve_base_port() const; + inline void append_base_pathname(std::string_view input); + [[nodiscard]] inline uint32_t retrieve_base_port() const; inline void clear_hostname(); inline void clear_password(); inline void clear_pathname() override; - inline bool has_dash_dot() const noexcept; + [[nodiscard]] inline bool has_dash_dot() const noexcept; void delete_dash_dot(); inline void consume_prepared_path(std::string_view input); template [[nodiscard]] ada_really_inline bool parse_scheme_with_colon( - const std::string_view input); + std::string_view input); ada_really_inline uint32_t replace_and_resize(uint32_t start, uint32_t end, std::string_view input); - inline bool has_authority() const noexcept; + [[nodiscard]] inline bool has_authority() const noexcept; inline void set_protocol_as_file(); inline void set_scheme(std::string_view new_scheme) noexcept; /** @@ -5026,7 +5020,9 @@ ada_really_inline bool begins_with(std::string_view view, std::string_view prefix); /** - * Returns true if an input is an ipv4 address. + * Returns true if an input is an ipv4 address. It is assumed that the string + * does not contain uppercase ASCII characters (the input should have been + * lowered cased before calling this function) and is not empty. */ ada_really_inline ada_constexpr bool is_ipv4(std::string_view view) noexcept; @@ -5092,7 +5088,7 @@ struct url : url_base { url(url &&u) noexcept = default; url &operator=(url &&u) noexcept = default; url &operator=(const url &u) = default; - ~url() = default; + ~url() override = default; /** * @private @@ -5153,7 +5149,7 @@ struct url : url_base { /** * Returns a JSON string representation of this URL. */ - std::string to_string() const override; + [[nodiscard]] std::string to_string() const override; /** * @see https://url.spec.whatwg.org/#dom-url-href @@ -5200,7 +5196,7 @@ struct url : url_base { * @return a newly allocated string. * @see https://url.spec.whatwg.org/#dom-url-pathname */ - [[nodiscard]] const std::string_view get_pathname() const noexcept; + [[nodiscard]] std::string_view get_pathname() const noexcept; /** * Compute the pathname length in bytes without instantiating a view or a @@ -5208,7 +5204,7 @@ struct url : url_base { * @return size of the pathname in bytes * @see https://url.spec.whatwg.org/#dom-url-pathname */ - ada_really_inline size_t get_pathname_length() const noexcept; + [[nodiscard]] ada_really_inline size_t get_pathname_length() const noexcept; /** * Return U+003F (?), followed by this's URL's query. @@ -5228,60 +5224,60 @@ struct url : url_base { * @return Returns true on successful operation. * @see https://url.spec.whatwg.org/#dom-url-username */ - bool set_username(const std::string_view input); + bool set_username(std::string_view input); /** * @return Returns true on success. * @see https://url.spec.whatwg.org/#dom-url-password */ - bool set_password(const std::string_view input); + bool set_password(std::string_view input); /** * @return Returns true on success. * @see https://url.spec.whatwg.org/#dom-url-port */ - bool set_port(const std::string_view input); + bool set_port(std::string_view input); /** * This function always succeeds. * @see https://url.spec.whatwg.org/#dom-url-hash */ - void set_hash(const std::string_view input); + void set_hash(std::string_view input); /** * This function always succeeds. * @see https://url.spec.whatwg.org/#dom-url-search */ - void set_search(const std::string_view input); + void set_search(std::string_view input); /** * @return Returns true on success. * @see https://url.spec.whatwg.org/#dom-url-search */ - bool set_pathname(const std::string_view input); + bool set_pathname(std::string_view input); /** * @return Returns true on success. * @see https://url.spec.whatwg.org/#dom-url-host */ - bool set_host(const std::string_view input); + bool set_host(std::string_view input); /** * @return Returns true on success. * @see https://url.spec.whatwg.org/#dom-url-hostname */ - bool set_hostname(const std::string_view input); + bool set_hostname(std::string_view input); /** * @return Returns true on success. * @see https://url.spec.whatwg.org/#dom-url-protocol */ - bool set_protocol(const std::string_view input); + bool set_protocol(std::string_view input); /** * @see https://url.spec.whatwg.org/#dom-url-href */ - bool set_href(const std::string_view input); + bool set_href(std::string_view input); /** * The password getter steps are to return this's URL's password. @@ -5352,9 +5348,9 @@ struct url : url_base { inline void update_base_search(std::string_view input, const uint8_t query_percent_encode_set[]); inline void update_base_search(std::optional input); - inline void update_base_pathname(const std::string_view input); - inline void update_base_username(const std::string_view input); - inline void update_base_password(const std::string_view input); + inline void update_base_pathname(std::string_view input); + inline void update_base_username(std::string_view input); + inline void update_base_password(std::string_view input); inline void update_base_port(std::optional input); /** @@ -5400,9 +5396,12 @@ struct url : url_base { */ [[nodiscard]] inline bool cannot_have_credentials_or_port() const; - ada_really_inline size_t - parse_port(std::string_view view, - bool check_trailing_content = false) noexcept override; + ada_really_inline size_t parse_port( + std::string_view view, bool check_trailing_content) noexcept override; + + ada_really_inline size_t parse_port(std::string_view view) noexcept override { + return this->parse_port(view, false); + } /** * Take the scheme from another URL. The scheme string is copied from the @@ -5421,8 +5420,7 @@ struct url : url_base { [[nodiscard]] ada_really_inline bool parse_host(std::string_view input); template - [[nodiscard]] ada_really_inline bool parse_scheme( - const std::string_view input); + [[nodiscard]] ada_really_inline bool parse_scheme(std::string_view input); inline void clear_pathname() override; inline void clear_search() override; @@ -5438,7 +5436,7 @@ struct url : url_base { * * @see https://url.spec.whatwg.org/ */ - ada_really_inline void parse_path(const std::string_view input); + ada_really_inline void parse_path(std::string_view input); /** * Set the scheme for this URL. The provided scheme should be a valid @@ -5525,7 +5523,9 @@ inline std::ostream &operator<<(std::ostream &out, const ada::url &u) { return out << u.to_string(); } -size_t url::get_pathname_length() const noexcept { return path.size(); } +[[nodiscard]] size_t url::get_pathname_length() const noexcept { + return path.size(); +} [[nodiscard]] ada_really_inline ada::url_components url::get_components() const noexcept { @@ -5902,7 +5902,7 @@ inline void url_aggregator::update_base_hostname(const std::string_view input) { ADA_ASSERT_TRUE(validate()); } -ada_really_inline uint32_t +[[nodiscard]] ada_really_inline uint32_t url_aggregator::get_pathname_length() const noexcept { ada_log("url_aggregator::get_pathname_length"); uint32_t ending_index = uint32_t(buffer.size()); @@ -6337,7 +6337,7 @@ inline void url_aggregator::clear_port() { ADA_ASSERT_TRUE(validate()); } -inline uint32_t url_aggregator::retrieve_base_port() const { +[[nodiscard]] inline uint32_t url_aggregator::retrieve_base_port() const { ada_log("url_aggregator::retrieve_base_port"); return components.port; } @@ -6562,28 +6562,40 @@ inline bool url_aggregator::has_port() const noexcept { return has_hostname() && components.pathname_start != components.host_end; } -inline bool url_aggregator::has_dash_dot() const noexcept { +[[nodiscard]] inline bool url_aggregator::has_dash_dot() const noexcept { // If url's host is null, url does not have an opaque path, url's path's size // is greater than 1, and url's path[0] is the empty string, then append // U+002F (/) followed by U+002E (.) to output. ada_log("url_aggregator::has_dash_dot"); - // Performance: instead of doing this potentially expensive check, we could - // just have a boolean value in the structure. #if ADA_DEVELOPMENT_CHECKS - if (components.pathname_start + 1 < buffer.size() && - components.pathname_start == components.host_end + 2) { - ADA_ASSERT_TRUE(buffer[components.host_end] == '/'); - ADA_ASSERT_TRUE(buffer[components.host_end + 1] == '.'); + // If pathname_start and host_end are exactly two characters apart, then we + // either have a one-digit port such as http://test.com:5?param=1 or else we + // have a /.: sequence such as "non-spec:/.//". We test that this is the case. + if (components.pathname_start == components.host_end + 2) { + ADA_ASSERT_TRUE((buffer[components.host_end] == '/' && + buffer[components.host_end + 1] == '.') || + (buffer[components.host_end] == ':' && + checkers::is_digit(buffer[components.host_end + 1]))); + } + if (components.pathname_start == components.host_end + 2 && + buffer[components.host_end] == '/' && + buffer[components.host_end + 1] == '.') { + ADA_ASSERT_TRUE(components.pathname_start + 1 < buffer.size()); ADA_ASSERT_TRUE(buffer[components.pathname_start] == '/'); ADA_ASSERT_TRUE(buffer[components.pathname_start + 1] == '/'); } #endif - return !has_opaque_path && - components.pathname_start == components.host_end + 2 && - components.pathname_start + 1 < buffer.size(); + // Performance: it should be uncommon for components.pathname_start == + // components.host_end + 2 to be true. So we put this check first in the + // sequence. Most times, we do not have an opaque path. Checking for '/.' is + // more expensive, but should be uncommon. + return components.pathname_start == components.host_end + 2 && + !has_opaque_path && buffer[components.host_end] == '/' && + buffer[components.host_end + 1] == '.'; } -inline std::string_view url_aggregator::get_href() const noexcept { +[[nodiscard]] inline std::string_view url_aggregator::get_href() + const noexcept { ada_log("url_aggregator::get_href"); return buffer; } @@ -6675,6 +6687,26 @@ inline std::ostream &operator<<(std::ostream &out, namespace ada { +enum class url_search_params_iter_type { + KEYS, + VALUES, + ENTRIES, +}; + +template +struct url_search_params_iter; + +typedef std::pair key_value_view_pair; + +using url_search_params_keys_iter = + url_search_params_iter; +using url_search_params_values_iter = + url_search_params_iter; +using url_search_params_entries_iter = + url_search_params_iter; + /** * @see https://url.spec.whatwg.org/#interface-urlsearchparams */ @@ -6737,6 +6769,42 @@ struct url_search_params { */ inline std::string to_string(); + /** + * Returns a simple JS-style iterator over all of the keys in this + * url_search_params. The keys in the iterator are not unique. The valid + * lifespan of the iterator is tied to the url_search_params. The iterator + * must be freed when you're done with it. + * @see https://url.spec.whatwg.org/#interface-urlsearchparams + */ + inline url_search_params_keys_iter get_keys(); + + /** + * Returns a simple JS-style iterator over all of the values in this + * url_search_params. The valid lifespan of the iterator is tied to the + * url_search_params. The iterator must be freed when you're done with it. + * @see https://url.spec.whatwg.org/#interface-urlsearchparams + */ + inline url_search_params_values_iter get_values(); + + /** + * Returns a simple JS-style iterator over all of the entries in this + * url_search_params. The entries are pairs of keys and corresponding values. + * The valid lifespan of the iterator is tied to the url_search_params. The + * iterator must be freed when you're done with it. + * @see https://url.spec.whatwg.org/#interface-urlsearchparams + */ + inline url_search_params_entries_iter get_entries(); + + /** + * C++ style conventional iterator support. const only because we + * do not really want the params to be modified via the iterator. + */ + inline auto begin() const { return params.begin(); } + inline auto end() const { return params.end(); } + inline auto front() const { return params.front(); } + inline auto back() const { return params.back(); } + inline auto operator[](size_t index) const { return params[index]; } + private: typedef std::pair key_value_pair; std::vector params{}; @@ -6745,8 +6813,44 @@ struct url_search_params { * @see https://url.spec.whatwg.org/#concept-urlencoded-parser */ void initialize(std::string_view init); + + template + friend struct url_search_params_iter; }; // url_search_params +/** + * Implements a non-conventional iterator pattern that is closer in style to + * JavaScript's definition of an iterator. + * + * @see https://webidl.spec.whatwg.org/#idl-iterable + */ +template +struct url_search_params_iter { + inline url_search_params_iter() : params(EMPTY) {} + url_search_params_iter(const url_search_params_iter &u) = default; + url_search_params_iter(url_search_params_iter &&u) noexcept = default; + url_search_params_iter &operator=(url_search_params_iter &&u) noexcept = + default; + url_search_params_iter &operator=(const url_search_params_iter &u) = default; + ~url_search_params_iter() = default; + + /** + * Return the next item in the iterator or std::nullopt if done. + */ + inline std::optional next(); + + inline bool has_next(); + + private: + static url_search_params EMPTY; + inline url_search_params_iter(url_search_params ¶ms_) : params(params_) {} + + url_search_params ¶ms; + size_t pos = 0; + + friend struct url_search_params; +}; + } // namespace ada #endif /* end file include/ada/url_search_params.h */ @@ -6767,6 +6871,10 @@ struct url_search_params { namespace ada { +// A default, empty url_search_params for use with empty iterators. +template +url_search_params url_search_params_iter::EMPTY; + inline void url_search_params::initialize(std::string_view input) { if (!input.empty() && input.front() == '?') { input.remove_prefix(1); @@ -6914,6 +7022,48 @@ inline void url_search_params::sort() { }); } +inline url_search_params_keys_iter url_search_params::get_keys() { + return url_search_params_keys_iter(*this); +} + +/** + * @see https://url.spec.whatwg.org/#interface-urlsearchparams + */ +inline url_search_params_values_iter url_search_params::get_values() { + return url_search_params_values_iter(*this); +} + +/** + * @see https://url.spec.whatwg.org/#interface-urlsearchparams + */ +inline url_search_params_entries_iter url_search_params::get_entries() { + return url_search_params_entries_iter(*this); +} + +template +inline bool url_search_params_iter::has_next() { + return pos < params.params.size(); +} + +template <> +inline std::optional url_search_params_keys_iter::next() { + if (!has_next()) return std::nullopt; + return params.params[pos++].first; +} + +template <> +inline std::optional url_search_params_values_iter::next() { + if (!has_next()) return std::nullopt; + return params.params[pos++].second; +} + +template <> +inline std::optional +url_search_params_entries_iter::next() { + if (!has_next()) return std::nullopt; + return params.params[pos++]; +} + } // namespace ada #endif // ADA_URL_SEARCH_PARAMS_INL_H @@ -6928,14 +7078,14 @@ inline void url_search_params::sort() { #ifndef ADA_ADA_VERSION_H #define ADA_ADA_VERSION_H -#define ADA_VERSION "2.6.10" +#define ADA_VERSION "2.7.4" namespace ada { enum { ADA_VERSION_MAJOR = 2, - ADA_VERSION_MINOR = 6, - ADA_VERSION_REVISION = 10, + ADA_VERSION_MINOR = 7, + ADA_VERSION_REVISION = 4, }; } // namespace ada diff --git a/deps/ada/ada_c.h b/deps/ada/ada_c.h index 040915518f32a0..173e27bb16af06 100644 --- a/deps/ada/ada_c.h +++ b/deps/ada/ada_c.h @@ -109,4 +109,77 @@ const ada_url_components* ada_get_components(ada_url result); ada_owned_string ada_idna_to_unicode(const char* input, size_t length); ada_owned_string ada_idna_to_ascii(const char* input, size_t length); +// url search params +typedef void* ada_url_search_params; + +// Represents an std::vector +typedef void* ada_strings; +typedef void* ada_url_search_params_keys_iter; +typedef void* ada_url_search_params_values_iter; + +typedef struct { + ada_string key; + ada_string value; +} ada_string_pair; + +typedef void* ada_url_search_params_entries_iter; + +ada_url_search_params ada_parse_search_params(const char* input, size_t length); +void ada_free_search_params(ada_url_search_params result); + +size_t ada_search_params_size(ada_url_search_params result); +void ada_search_params_sort(ada_url_search_params result); +ada_owned_string ada_search_params_to_string(ada_url_search_params result); + +void ada_search_params_append(ada_url_search_params result, const char* key, + size_t key_length, const char* value, + size_t value_length); +void ada_search_params_set(ada_url_search_params result, const char* key, + size_t key_length, const char* value, + size_t value_length); +void ada_search_params_remove(ada_url_search_params result, const char* key, + size_t key_length); +void ada_search_params_remove_value(ada_url_search_params result, + const char* key, size_t key_length, + const char* value, size_t value_length); +bool ada_search_params_has(ada_url_search_params result, const char* key, + size_t key_length); +bool ada_search_params_has_value(ada_url_search_params result, const char* key, + size_t key_length, const char* value, + size_t value_length); +ada_string ada_search_params_get(ada_url_search_params result, const char* key, + size_t key_length); +ada_strings ada_search_params_get_all(ada_url_search_params result, + const char* key, size_t key_length); +ada_url_search_params_keys_iter ada_search_params_get_keys( + ada_url_search_params result); +ada_url_search_params_values_iter ada_search_params_get_values( + ada_url_search_params result); +ada_url_search_params_entries_iter ada_search_params_get_entries( + ada_url_search_params result); + +void ada_free_strings(ada_strings result); +size_t ada_strings_size(ada_strings result); +ada_string ada_strings_get(ada_strings result, size_t index); + +void ada_free_search_params_keys_iter(ada_url_search_params_keys_iter result); +ada_string ada_search_params_keys_iter_next( + ada_url_search_params_keys_iter result); +bool ada_search_params_keys_iter_has_next( + ada_url_search_params_keys_iter result); + +void ada_free_search_params_values_iter( + ada_url_search_params_values_iter result); +ada_string ada_search_params_values_iter_next( + ada_url_search_params_values_iter result); +bool ada_search_params_values_iter_has_next( + ada_url_search_params_values_iter result); + +void ada_free_search_params_entries_iter( + ada_url_search_params_entries_iter result); +ada_string_pair ada_search_params_entries_iter_next( + ada_url_search_params_entries_iter result); +bool ada_search_params_entries_iter_has_next( + ada_url_search_params_entries_iter result); + #endif // ADA_C_H diff --git a/deps/ada/unofficial.gni b/deps/ada/unofficial.gni new file mode 100644 index 00000000000000..ab7dc27de3e304 --- /dev/null +++ b/deps/ada/unofficial.gni @@ -0,0 +1,25 @@ +# This file is used by GN for building, which is NOT the build system used for +# building official binaries. +# Please edit the gyp files if you are making changes to build system. + +import("../../node.gni") +import("$node_v8_path/gni/v8.gni") + +# The actual configurations are put inside a template in unofficial.gni to +# prevent accidental edits from contributors. +template("ada_gn_build") { + config("ada_config") { + include_dirs = [ "." ] + } + + gypi_values = exec_script("../../tools/gypi_to_gn.py", + [ rebase_path("ada.gyp") ], + "scope", + [ "ada.gyp" ]) + + source_set(target_name) { + forward_variables_from(invoker, "*") + public_configs = [ ":ada_config" ] + sources = gypi_values.ada_sources + } +} diff --git a/deps/base64/BUILD.gn b/deps/base64/BUILD.gn new file mode 100644 index 00000000000000..172dd960910439 --- /dev/null +++ b/deps/base64/BUILD.gn @@ -0,0 +1,14 @@ +############################################################################## +# # +# DO NOT EDIT THIS FILE! # +# # +############################################################################## + +# This file is used by GN for building, which is NOT the build system used for +# building official binaries. +# Please modify the gyp files if you are making changes to build system. + +import("unofficial.gni") + +base64_gn_build("base64") { +} diff --git a/deps/base64/base64.gyp b/deps/base64/base64.gyp index 06b20a142b1679..5d0a0c05dc2a08 100644 --- a/deps/base64/base64.gyp +++ b/deps/base64/base64.gyp @@ -49,6 +49,7 @@ 'HAVE_SSE42=1', 'HAVE_AVX=1', 'HAVE_AVX2=1', + 'HAVE_AVX512=1', ], 'dependencies': [ 'base64_ssse3', @@ -56,6 +57,7 @@ 'base64_sse42', 'base64_avx', 'base64_avx2', + 'base64_avx512', ], }, { 'sources': [ @@ -64,6 +66,7 @@ 'base64/lib/arch/sse42/codec.c', 'base64/lib/arch/avx/codec.c', 'base64/lib/arch/avx2/codec.c', + 'base64/lib/arch/avx512/codec.c', ], }], ], @@ -165,6 +168,30 @@ ], }, + { + 'target_name': 'base64_avx512', + 'type': 'static_library', + 'include_dirs': [ 'base64/include', 'base64/lib' ], + 'sources': [ 'base64/lib/arch/avx512/codec.c' ], + 'defines': [ 'BASE64_STATIC_DEFINE', 'HAVE_AVX512=1' ], + 'conditions': [ + [ 'OS!="win"', { + 'cflags': [ '-mavx512vl', '-mavx512vbmi' ], + 'xcode_settings': { + 'OTHER_CFLAGS': [ '-mavx512vl', '-mavx512vbmi' ] + }, + }, { + 'msvs_settings': { + 'VCCLCompilerTool': { + 'AdditionalOptions': [ + '/arch:AVX512' + ], + }, + }, + }], + ], + }, + { 'target_name': 'base64_neon32', 'type': 'static_library', diff --git a/deps/base64/base64/.gitignore b/deps/base64/base64/.gitignore index 837a2306a6294b..bb7b160deb3702 100644 --- a/deps/base64/base64/.gitignore +++ b/deps/base64/base64/.gitignore @@ -1,12 +1 @@ -*.o -bin/base64 -lib/config.h -test/benchmark -test/test_base64 - -# visual studio symbol db, etc. -.vs/ -# build directory used by CMakePresets -out/ -# private cmake presets -CMakeUserPresets.json +# Intentionally empty diff --git a/deps/base64/base64/CMakeLists.txt b/deps/base64/base64/CMakeLists.txt index 56076e47a6aa3a..be1de665a2cd59 100644 --- a/deps/base64/base64/CMakeLists.txt +++ b/deps/base64/base64/CMakeLists.txt @@ -17,7 +17,7 @@ if (POLICY CMP0127) cmake_policy(SET CMP0127 NEW) endif() -project(base64 LANGUAGES C VERSION 0.5.0) +project(base64 LANGUAGES C VERSION 0.5.1) include(GNUInstallDirs) include(CMakeDependentOption) @@ -62,6 +62,8 @@ cmake_dependent_option(BASE64_WITH_AVX "add AVX codepath" ON ${_IS_X86} OFF) add_feature_info(AVX BASE64_WITH_AVX "add AVX codepath") cmake_dependent_option(BASE64_WITH_AVX2 "add AVX 2 codepath" ON ${_IS_X86} OFF) add_feature_info(AVX2 BASE64_WITH_AVX2 "add AVX2 codepath") +cmake_dependent_option(BASE64_WITH_AVX512 "add AVX 512 codepath" ON ${_IS_X86} OFF) +add_feature_info(AVX512 BASE64_WITH_AVX512 "add AVX512 codepath") cmake_dependent_option(BASE64_WITH_NEON32 "add NEON32 codepath" OFF _TARGET_ARCH_arm OFF) add_feature_info(NEON32 BASE64_WITH_NEON32 "add NEON32 codepath") @@ -118,6 +120,7 @@ add_library(base64 lib/arch/sse42/codec.c lib/arch/avx/codec.c lib/arch/avx2/codec.c + lib/arch/avx512/codec.c lib/arch/neon32/codec.c lib/arch/neon64/codec.c @@ -206,6 +209,7 @@ if (_TARGET_ARCH STREQUAL "x86" OR _TARGET_ARCH STREQUAL "x64") configure_codec(SSE42 __SSSE4_2__) configure_codec(AVX) configure_codec(AVX2) + configure_codec(AVX512) elseif (_TARGET_ARCH STREQUAL "arm") set(BASE64_NEON32_CFLAGS "${COMPILE_FLAGS_NEON32}" CACHE STRING "the NEON32 compile flags (for 'lib/arch/neon32/codec.c')") diff --git a/deps/base64/base64/LICENSE b/deps/base64/base64/LICENSE index 9446393a82a847..109d6521b122c0 100644 --- a/deps/base64/base64/LICENSE +++ b/deps/base64/base64/LICENSE @@ -1,7 +1,7 @@ Copyright (c) 2005-2007, Nick Galbreath -Copyright (c) 2013-2019, Alfred Klomp -Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2015-2018, Wojciech Muła Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) 2013-2022, Alfred Klomp All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/deps/base64/base64/Makefile b/deps/base64/base64/Makefile index 2bb01e204fcfac..bcb944551ae881 100644 --- a/deps/base64/base64/Makefile +++ b/deps/base64/base64/Makefile @@ -4,6 +4,7 @@ CFLAGS += -std=c99 -O3 -Wall -Wextra -pedantic OBJCOPY ?= objcopy OBJS = \ + lib/arch/avx512/codec.o \ lib/arch/avx2/codec.o \ lib/arch/generic/codec.o \ lib/arch/neon32/codec.o \ @@ -16,6 +17,7 @@ OBJS = \ lib/codec_choose.o \ lib/tables/tables.o +HAVE_AVX512 = 0 HAVE_AVX2 = 0 HAVE_NEON32 = 0 HAVE_NEON64 = 0 @@ -26,6 +28,9 @@ HAVE_AVX = 0 # The user should supply compiler flags for the codecs they want to build. # Check which codecs we're going to include: +ifdef AVX512_CFLAGS + HAVE_AVX512 = 1 +endif ifdef AVX2_CFLAGS HAVE_AVX2 = 1 endif @@ -64,7 +69,8 @@ lib/libbase64.o: $(OBJS) $(OBJCOPY) --keep-global-symbols=lib/exports.txt $@ lib/config.h: - @echo "#define HAVE_AVX2 $(HAVE_AVX2)" > $@ + @echo "#define HAVE_AVX512 $(HAVE_AVX512)" > $@ + @echo "#define HAVE_AVX2 $(HAVE_AVX2)" >> $@ @echo "#define HAVE_NEON32 $(HAVE_NEON32)" >> $@ @echo "#define HAVE_NEON64 $(HAVE_NEON64)" >> $@ @echo "#define HAVE_SSSE3 $(HAVE_SSSE3)" >> $@ @@ -75,6 +81,7 @@ lib/config.h: $(OBJS): lib/config.h $(OBJS): CFLAGS += -Ilib +lib/arch/avx512/codec.o: CFLAGS += $(AVX512_CFLAGS) lib/arch/avx2/codec.o: CFLAGS += $(AVX2_CFLAGS) lib/arch/neon32/codec.o: CFLAGS += $(NEON32_CFLAGS) lib/arch/neon64/codec.o: CFLAGS += $(NEON64_CFLAGS) diff --git a/deps/base64/base64/README.md b/deps/base64/base64/README.md index b953c324c9dc1e..ae0a914965e101 100644 --- a/deps/base64/base64/README.md +++ b/deps/base64/base64/README.md @@ -3,7 +3,7 @@ [![Build Status](https://github.com/aklomp/base64/actions/workflows/test.yml/badge.svg)](https://github.com/aklomp/base64/actions/workflows/test.yml) This is an implementation of a base64 stream encoding/decoding library in C99 -with SIMD (AVX2, NEON, AArch64/NEON, SSSE3, SSE4.1, SSE4.2, AVX) and +with SIMD (AVX2, AVX512, NEON, AArch64/NEON, SSSE3, SSE4.1, SSE4.2, AVX) and [OpenMP](http://www.openmp.org) acceleration. It also contains wrapper functions to encode/decode simple length-delimited strings. This library aims to be: @@ -19,6 +19,10 @@ will pick an optimized codec that lets it encode/decode 12 or 24 bytes at a time, which gives a speedup of four or more times compared to the "plain" bytewise codec. +AVX512 support is only for encoding at present, utilizing the AVX512 VL and VBMI +instructions. Decoding part reused AVX2 implementations. For CPUs later than +Cannonlake (manufactured in 2018) supports these instructions. + NEON support is hardcoded to on or off at compile time, because portable runtime feature detection is unavailable on ARM. @@ -59,6 +63,9 @@ optimizations described by Wojciech Muła in a [articles](http://0x80.pl/notesen/2016-01-17-sse-base64-decoding.html). His own code is [here](https://github.com/WojciechMula/toys/tree/master/base64). +The AVX512 encoder is based on code from Wojciech Muła's +[base64simd](https://github.com/WojciechMula/base64simd) library. + The OpenMP implementation was added by Ferry Toth (@htot) from [Exalon Delft](http://www.exalondelft.nl). ## Building @@ -76,8 +83,8 @@ To compile just the "plain" library without SIMD codecs, type: make lib/libbase64.o ``` -Optional SIMD codecs can be included by specifying the `AVX2_CFLAGS`, `NEON32_CFLAGS`, `NEON64_CFLAGS`, -`SSSE3_CFLAGS`, `SSE41_CFLAGS`, `SSE42_CFLAGS` and/or `AVX_CFLAGS` environment variables. +Optional SIMD codecs can be included by specifying the `AVX2_CFLAGS`, `AVX512_CFLAGS`, +`NEON32_CFLAGS`, `NEON64_CFLAGS`, `SSSE3_CFLAGS`, `SSE41_CFLAGS`, `SSE42_CFLAGS` and/or `AVX_CFLAGS` environment variables. A typical build invocation on x86 looks like this: ```sh @@ -93,6 +100,15 @@ Example: AVX2_CFLAGS=-mavx2 make ``` +### AVX512 + +To build and include the AVX512 codec, set the `AVX512_CFLAGS` environment variable to a value that will turn on AVX512 support in your compiler, typically `-mavx512vl -mavx512vbmi`. +Example: + +```sh +AVX512_CFLAGS="-mavx512vl -mavx512vbmi" make +``` + The codec will only be used if runtime feature detection shows that the target machine supports AVX2. ### SSSE3 @@ -208,6 +224,7 @@ Mainly there for testing purposes, this is also useful on ARM where the only way The following constants can be used: - `BASE64_FORCE_AVX2` +- `BASE64_FORCE_AVX512` - `BASE64_FORCE_NEON32` - `BASE64_FORCE_NEON64` - `BASE64_FORCE_PLAIN` @@ -434,7 +451,7 @@ x86 processors | i7-4770 @ 3.4 GHz DDR1600 OPENMP 4 thread | 4884\* | 7099\* | 4917\* | 7057\* | 4799\* | 7143\* | 4902\* | 7219\* | | i7-4770 @ 3.4 GHz DDR1600 OPENMP 8 thread | 5212\* | 8849\* | 5284\* | 9099\* | 5289\* | 9220\* | 4849\* | 9200\* | | i7-4870HQ @ 2.5 GHz | 1471\* | 3066\* | 6721\* | 6962\* | 7015\* | 8267\* | 8328\* | 11576\* | -| i5-4590S @ 3.0 GHz | 3356 | 3197 | 4363 | 6104 | 4243 | 6233 | 4160 | 6344 | +| i5-4590S @ 3.0 GHz | 3356 | 3197 | 4363 | 6104 | 4243\* | 6233 | 4160\* | 6344 | | Xeon X5570 @ 2.93 GHz | 2161 | 1508 | 3160 | 3915 | - | - | - | - | | Pentium4 @ 3.4 GHz | 896 | 740 | - | - | - | - | - | - | | Atom N270 | 243 | 266 | 508 | 387 | - | - | - | - | diff --git a/deps/base64/base64/bin/base64.c b/deps/base64/base64/bin/base64.c index e4384fe885d3eb..98d6b3cbab560c 100644 --- a/deps/base64/base64/bin/base64.c +++ b/deps/base64/base64/bin/base64.c @@ -1,128 +1,477 @@ -#include // size_t -#include // fopen() -#include // strlen() +#define _XOPEN_SOURCE // IOV_MAX + +#include +#include +#include +#include +#include #include +#include +#include +#include #include "../include/libbase64.h" -#define BUFSIZE 1024 * 1024 +// Size of the buffer for the "raw" (not base64-encoded) data in bytes. +#define BUFFER_RAW_SIZE (1024 * 1024) -static char buf[BUFSIZE]; -static char out[(BUFSIZE * 5) / 3]; // Technically 4/3 of input, but take some margin -size_t nread; -size_t nout; +// Size of the buffer for the base64-encoded data in bytes. The base64-encoded +// data is 4/3 the size of the input, with some margin to be sure. +#define BUFFER_ENC_SIZE (BUFFER_RAW_SIZE * 4 / 3 + 16) -static int -enc (FILE *fp) +// Global config structure. +struct config { + + // Name by which the program was called on the command line. + const char *name; + + // Name of the input file for logging purposes. + const char *file; + + // Input file handle. + FILE *fp; + + // Wrap width in characters, for encoding only. + size_t wrap; + + // Whether to run in decode mode. + bool decode; + + // Whether to just print the help text and exit. + bool print_help; +}; + +// Input/output buffer structure. +struct buffer { + + // Runtime-allocated buffer for raw (unencoded) data. + char *raw; + + // Runtime-allocated buffer for base64-encoded data. + char *enc; +}; + +static bool +buffer_alloc (const struct config *config, struct buffer *buf) +{ + if ((buf->raw = malloc(BUFFER_RAW_SIZE)) == NULL || + (buf->enc = malloc(BUFFER_ENC_SIZE)) == NULL) { + free(buf->raw); + fprintf(stderr, "%s: malloc: %s\n", + config->name, strerror(errno)); + return false; + } + + return true; +} + +static void +buffer_free (struct buffer *buf) +{ + free(buf->raw); + free(buf->enc); +} + +static bool +writev_retry (const struct config *config, struct iovec *iov, size_t nvec) +{ + // Writing nothing always succeeds. + if (nvec == 0) { + return true; + } + + while (true) { + ssize_t nwrite; + + // Try to write the vectors to stdout. + if ((nwrite = writev(1, iov, nvec)) < 0) { + + // Retry on EINTR. + if (errno == EINTR) { + continue; + } + + // Quit on other errors. + fprintf(stderr, "%s: writev: %s\n", + config->name, strerror(errno)); + return false; + } + + // The return value of `writev' is the number of bytes written. + // To check for success, we traverse the list and remove all + // written vectors. The call succeeded if the list is empty. + while (true) { + + // Retry if this vector is not or partially written. + if (iov->iov_len > (size_t) nwrite) { + char *base = iov->iov_base; + + iov->iov_base = (size_t) nwrite + base; + iov->iov_len -= (size_t) nwrite; + break; + } + + // Move to the next vector. + nwrite -= iov->iov_len; + iov++; + + // Return successfully if all vectors were written. + if (--nvec == 0) { + return true; + } + } + } +} + +static inline bool +iov_append (const struct config *config, struct iovec *iov, + size_t *nvec, char *base, const size_t len) +{ + // Add the buffer to the IO vector array. + iov[*nvec].iov_base = base; + iov[*nvec].iov_len = len; + + // Increment the array index. Flush the array if it is full. + if (++(*nvec) == IOV_MAX) { + if (writev_retry(config, iov, IOV_MAX) == false) { + return false; + } + *nvec = 0; + } + + return true; +} + +static bool +write_stdout (const struct config *config, const char *buf, size_t len) +{ + while (len > 0) { + ssize_t nwrite; + + // Try to write the buffer to stdout. + if ((nwrite = write(1, buf, len)) < 0) { + + // Retry on EINTR. + if (errno == EINTR) { + continue; + } + + // Quit on other errors. + fprintf(stderr, "%s: write: %s\n", + config->name, strerror(errno)); + return false; + } + + // Update the buffer position. + buf += (size_t) nwrite; + len -= (size_t) nwrite; + } + + return true; +} + +static bool +write_wrapped (const struct config *config, char *buf, size_t len) +{ + static size_t col = 0; + + // Special case: if buf is NULL, print final trailing newline. + if (buf == NULL) { + if (config->wrap > 0 && col > 0) { + return write_stdout(config, "\n", 1); + } + return true; + } + + // If no wrap width is given, write the entire buffer. + if (config->wrap == 0) { + return write_stdout(config, buf, len); + } + + // Statically allocated IO vector buffer. + static struct iovec iov[IOV_MAX]; + size_t nvec = 0; + + while (len > 0) { + + // Number of characters to fill the current line. + size_t nwrite = config->wrap - col; + + // Do not write more data than is available. + if (nwrite > len) { + nwrite = len; + } + + // Append the data to the IO vector array. + if (iov_append(config, iov, &nvec, buf, nwrite) == false) { + return false; + } + + // Advance the buffer. + len -= nwrite; + buf += nwrite; + col += nwrite; + + // If the line is full, append a newline. + if (col == config->wrap) { + if (iov_append(config, iov, &nvec, "\n", 1) == false) { + return false; + } + col = 0; + } + } + + // Write the remaining vectors. + if (writev_retry(config, iov, nvec) == false) { + return false; + } + + return true; +} + +static bool +encode (const struct config *config, struct buffer *buf) { - int ret = 1; + size_t nread, nout; struct base64_state state; + // Initialize the encoder's state structure. base64_stream_encode_init(&state, 0); - while ((nread = fread(buf, 1, BUFSIZE, fp)) > 0) { - base64_stream_encode(&state, buf, nread, out, &nout); - if (nout) { - fwrite(out, nout, 1, stdout); - } - if (feof(fp)) { - break; + // Read raw data into the buffer. + while ((nread = fread(buf->raw, 1, BUFFER_RAW_SIZE, config->fp)) > 0) { + + // Encode the raw input into the encoded buffer. + base64_stream_encode(&state, buf->raw, nread, buf->enc, &nout); + + // Append the encoded data to the output stream. + if (write_wrapped(config, buf->enc, nout) == false) { + return false; } } - if (ferror(fp)) { - fprintf(stderr, "read error\n"); - ret = 0; - goto out; + + // Check for stream errors. + if (ferror(config->fp)) { + fprintf(stderr, "%s: %s: read error\n", + config->name, config->file); + return false; } - base64_stream_encode_final(&state, out, &nout); - if (nout) { - fwrite(out, nout, 1, stdout); + // Finalize the encoding by adding proper stream terminators. + base64_stream_encode_final(&state, buf->enc, &nout); + + // Append this tail to the output stream. + if (write_wrapped(config, buf->enc, nout) == false) { + return false; } -out: fclose(fp); - fclose(stdout); - return ret; + + // Print optional trailing newline. + if (write_wrapped(config, NULL, 0) == false) { + return false; + } + + return true; } static int -dec (FILE *fp) +decode (const struct config *config, struct buffer *buf) { - int ret = 1; + size_t nread, nout; struct base64_state state; + // Initialize the decoder's state structure. base64_stream_decode_init(&state, 0); - while ((nread = fread(buf, 1, BUFSIZE, fp)) > 0) { - if (!base64_stream_decode(&state, buf, nread, out, &nout)) { - fprintf(stderr, "decoding error\n"); - ret = 0; - goto out; - } - if (nout) { - fwrite(out, nout, 1, stdout); + // Read encoded data into the buffer. Use the smallest buffer size to + // be on the safe side: the decoded output will fit the raw buffer. + while ((nread = fread(buf->enc, 1, BUFFER_RAW_SIZE, config->fp)) > 0) { + + // Decode the input into the raw buffer. + if (base64_stream_decode(&state, buf->enc, nread, + buf->raw, &nout) == 0) { + fprintf(stderr, "%s: %s: decoding error\n", + config->name, config->file); + return false; } - if (feof(fp)) { - break; + + // Append the raw data to the output stream. + if (write_stdout(config, buf->raw, nout) == false) { + return false; } } - if (ferror(fp)) { - fprintf(stderr, "read error\n"); - ret = 0; + + // Check for stream errors. + if (ferror(config->fp)) { + fprintf(stderr, "%s: %s: read error\n", + config->name, config->file); + return false; } -out: fclose(fp); - fclose(stdout); - return ret; + + return true; } -int -main (int argc, char **argv) +static void +usage (FILE *fp, const struct config *config) { - char *file; - FILE *fp; - int decode = 0; - - // Parse options: - for (;;) - { - int c; - int opt_index = 0; - static struct option opt_long[] = { - { "decode", 0, 0, 'd' }, - { 0, 0, 0, 0 } - }; - if ((c = getopt_long(argc, argv, "d", opt_long, &opt_index)) == -1) { + const char *usage = + "Usage: %s [OPTION]... [FILE]\n" + "If no FILE is given or is specified as '-', " + "read from standard input.\n" + "Options:\n" + " -d, --decode Decode a base64 stream.\n" + " -h, --help Print this help text.\n" + " -w, --wrap=COLS Wrap encoded lines at this column. " + "Default 76, 0 to disable.\n"; + + fprintf(fp, usage, config->name); +} + +static bool +get_wrap (struct config *config, const char *str) +{ + char *eptr; + + // Reject empty strings. + if (*str == '\0') { + return false; + } + + // Convert the input string to a signed long. + const long wrap = strtol(str, &eptr, 10); + + // Reject negative numbers. + if (wrap < 0) { + return false; + } + + // Reject strings containing non-digits. + if (*eptr != '\0') { + return false; + } + + config->wrap = (size_t) wrap; + return true; +} + +static bool +parse_opts (int argc, char **argv, struct config *config) +{ + int c; + static const struct option opts[] = { + { "decode", no_argument, NULL, 'd' }, + { "help", no_argument, NULL, 'h' }, + { "wrap", required_argument, NULL, 'w' }, + { NULL } + }; + + // Remember the program's name. + config->name = *argv; + + // Parse command line options. + while ((c = getopt_long(argc, argv, ":dhw:", opts, NULL)) != -1) { + switch (c) { + case 'd': + config->decode = true; break; - } - switch (c) - { - case 'd': - decode = 1; - break; + + case 'h': + config->print_help = true; + return true; + + case 'w': + if (get_wrap(config, optarg) == false) { + fprintf(stderr, + "%s: invalid wrap value '%s'\n", + config->name, optarg); + return false; + } + break; + + case ':': + fprintf(stderr, "%s: missing argument for '%c'\n", + config->name, optopt); + return false; + + default: + fprintf(stderr, "%s: unknown option '%c'\n", + config->name, optopt); + return false; } } - // No options left on command line? Read from stdin: + // Return successfully if no filename was given. if (optind >= argc) { - fp = stdin; + return true; } - // One option left on command line? Treat it as a file: - else if (optind + 1 == argc) { - file = argv[optind]; - if (strcmp(file, "-") == 0) { - fp = stdin; - } - else if ((fp = fopen(file, "rb")) == NULL) { - printf("cannot open %s\n", file); - return 1; - } + // Return unsuccessfully if more than one filename was given. + if (optind + 1 < argc) { + fprintf(stderr, "%s: too many files\n", config->name); + return false; + } + + // For compatibility with GNU Coreutils base64, treat a filename of '-' + // as standard input. + if (strcmp(argv[optind], "-") == 0) { + return true; + } + + // Save the name of the file. + config->file = argv[optind]; + + // Open the file. + if ((config->fp = fopen(config->file, "rb")) == NULL) { + fprintf(stderr, "%s: %s: %s\n", + config->name, config->file, strerror(errno)); + return false; + } + + return true; +} + +int +main (int argc, char **argv) +{ + // Default program config. + struct config config = { + .file = "stdin", + .fp = stdin, + .wrap = 76, + .decode = false, + .print_help = false, + }; + struct buffer buf; + + // Parse options from the command line. + if (parse_opts(argc, argv, &config) == false) { + usage(stderr, &config); + return 1; } - // More than one option left on command line? Syntax error: - else { - printf("Usage: %s \n", argv[0]); + // Return early if the user just wanted the help text. + if (config.print_help) { + usage(stdout, &config); + return 0; + } + + // Allocate buffers. + if (buffer_alloc(&config, &buf) == false) { return 1; } - // Invert return codes to create shell return code: - return (decode) ? !dec(fp) : !enc(fp); + // Encode or decode the input based on the user's choice. + const bool ret = config.decode + ? decode(&config, &buf) + : encode(&config, &buf); + + // Free the buffers. + buffer_free(&buf); + + // Close the input file. + fclose(config.fp); + + // Close the output stream. + fclose(stdout); + + // That's all, folks. + return ret ? 0 : 1; } diff --git a/deps/base64/base64/cmake/Modules/TargetSIMDInstructionSet.cmake b/deps/base64/base64/cmake/Modules/TargetSIMDInstructionSet.cmake index ba1f6e51815eec..485080905319a6 100644 --- a/deps/base64/base64/cmake/Modules/TargetSIMDInstructionSet.cmake +++ b/deps/base64/base64/cmake/Modules/TargetSIMDInstructionSet.cmake @@ -21,6 +21,7 @@ macro(define_SIMD_compile_flags) set(COMPILE_FLAGS_SSE42 "-msse4.2") set(COMPILE_FLAGS_AVX "-mavx") set(COMPILE_FLAGS_AVX2 "-mavx2") + set(COMPILE_FLAGS_AVX512 "-mavx512vl -mavx512vbmi") #arm set(COMPILE_FLAGS_NEON32 "-mfpu=neon") @@ -30,5 +31,6 @@ macro(define_SIMD_compile_flags) set(COMPILE_FLAGS_SSE42 " ") set(COMPILE_FLAGS_AVX "/arch:AVX") set(COMPILE_FLAGS_AVX2 "/arch:AVX2") + set(COMPILE_FLAGS_AVX512 "/arch:AVX512") endif() endmacro(define_SIMD_compile_flags) diff --git a/deps/base64/base64/cmake/config.h.in b/deps/base64/base64/cmake/config.h.in index 8530d1e13d4801..c7faa94bc0903d 100644 --- a/deps/base64/base64/cmake/config.h.in +++ b/deps/base64/base64/cmake/config.h.in @@ -16,6 +16,9 @@ #cmakedefine01 BASE64_WITH_AVX2 #define HAVE_AVX2 BASE64_WITH_AVX2 +#cmakedefine01 BASE64_WITH_AVX512 +#define HAVE_AVX512 BASE64_WITH_AVX512 + #cmakedefine01 BASE64_WITH_NEON32 #define HAVE_NEON32 BASE64_WITH_NEON32 diff --git a/deps/base64/base64/include/libbase64.h b/deps/base64/base64/include/libbase64.h index d470a82f1028dc..c5908973c5e73c 100644 --- a/deps/base64/base64/include/libbase64.h +++ b/deps/base64/base64/include/libbase64.h @@ -53,6 +53,7 @@ extern "C" { #define BASE64_FORCE_SSE41 (1 << 5) #define BASE64_FORCE_SSE42 (1 << 6) #define BASE64_FORCE_AVX (1 << 7) +#define BASE64_FORCE_AVX512 (1 << 8) struct base64_state { int eof; diff --git a/deps/base64/base64/lib/arch/avx/codec.c b/deps/base64/base64/lib/arch/avx/codec.c index a7a963d8358918..b069618e29463e 100644 --- a/deps/base64/base64/lib/arch/avx/codec.c +++ b/deps/base64/base64/lib/arch/avx/codec.c @@ -11,11 +11,25 @@ #if HAVE_AVX #include +// Only enable inline assembly on supported compilers and on 64-bit CPUs. +#ifndef BASE64_AVX_USE_ASM +# if (defined(__GNUC__) || defined(__clang__)) && BASE64_WORDSIZE == 64 +# define BASE64_AVX_USE_ASM 1 +# else +# define BASE64_AVX_USE_ASM 0 +# endif +#endif + #include "../ssse3/dec_reshuffle.c" #include "../ssse3/dec_loop.c" -#include "../ssse3/enc_translate.c" -#include "../ssse3/enc_reshuffle.c" -#include "../ssse3/enc_loop.c" + +#if BASE64_AVX_USE_ASM +# include "enc_loop_asm.c" +#else +# include "../ssse3/enc_translate.c" +# include "../ssse3/enc_reshuffle.c" +# include "../ssse3/enc_loop.c" +#endif #endif // HAVE_AVX @@ -23,7 +37,17 @@ BASE64_ENC_FUNCTION(avx) { #if HAVE_AVX #include "../generic/enc_head.c" + + // For supported compilers, use a hand-optimized inline assembly + // encoder. Otherwise fall back on the SSSE3 encoder, but compiled with + // AVX flags to generate better optimized AVX code. + +#if BASE64_AVX_USE_ASM + enc_loop_avx(&s, &slen, &o, &olen); +#else enc_loop_ssse3(&s, &slen, &o, &olen); +#endif + #include "../generic/enc_tail.c" #else BASE64_ENC_STUB diff --git a/deps/base64/base64/lib/arch/avx/enc_loop_asm.c b/deps/base64/base64/lib/arch/avx/enc_loop_asm.c new file mode 100644 index 00000000000000..979269af57740e --- /dev/null +++ b/deps/base64/base64/lib/arch/avx/enc_loop_asm.c @@ -0,0 +1,264 @@ +// Apologies in advance for combining the preprocessor with inline assembly, +// two notoriously gnarly parts of C, but it was necessary to avoid a lot of +// code repetition. The preprocessor is used to template large sections of +// inline assembly that differ only in the registers used. If the code was +// written out by hand, it would become very large and hard to audit. + +// Generate a block of inline assembly that loads register R0 from memory. The +// offset at which the register is loaded is set by the given round. +#define LOAD(R0, ROUND) \ + "vlddqu ("#ROUND" * 12)(%[src]), %["R0"] \n\t" + +// Generate a block of inline assembly that deinterleaves and shuffles register +// R0 using preloaded constants. Outputs in R0 and R1. +#define SHUF(R0, R1, R2) \ + "vpshufb %[lut0], %["R0"], %["R1"] \n\t" \ + "vpand %["R1"], %[msk0], %["R2"] \n\t" \ + "vpand %["R1"], %[msk2], %["R1"] \n\t" \ + "vpmulhuw %["R2"], %[msk1], %["R2"] \n\t" \ + "vpmullw %["R1"], %[msk3], %["R1"] \n\t" \ + "vpor %["R1"], %["R2"], %["R1"] \n\t" + +// Generate a block of inline assembly that takes R0 and R1 and translates +// their contents to the base64 alphabet, using preloaded constants. +#define TRAN(R0, R1, R2) \ + "vpsubusb %[n51], %["R1"], %["R0"] \n\t" \ + "vpcmpgtb %[n25], %["R1"], %["R2"] \n\t" \ + "vpsubb %["R2"], %["R0"], %["R0"] \n\t" \ + "vpshufb %["R0"], %[lut1], %["R2"] \n\t" \ + "vpaddb %["R1"], %["R2"], %["R0"] \n\t" + +// Generate a block of inline assembly that stores the given register R0 at an +// offset set by the given round. +#define STOR(R0, ROUND) \ + "vmovdqu %["R0"], ("#ROUND" * 16)(%[dst]) \n\t" + +// Generate a block of inline assembly that generates a single self-contained +// encoder round: fetch the data, process it, and store the result. Then update +// the source and destination pointers. +#define ROUND() \ + LOAD("a", 0) \ + SHUF("a", "b", "c") \ + TRAN("a", "b", "c") \ + STOR("a", 0) \ + "add $12, %[src] \n\t" \ + "add $16, %[dst] \n\t" + +// Define a macro that initiates a three-way interleaved encoding round by +// preloading registers a, b and c from memory. +// The register graph shows which registers are in use during each step, and +// is a visual aid for choosing registers for that step. Symbol index: +// +// + indicates that a register is loaded by that step. +// | indicates that a register is in use and must not be touched. +// - indicates that a register is decommissioned by that step. +// x indicates that a register is used as a temporary by that step. +// V indicates that a register is an input or output to the macro. +// +#define ROUND_3_INIT() /* a b c d e f */ \ + LOAD("a", 0) /* + */ \ + SHUF("a", "d", "e") /* | + x */ \ + LOAD("b", 1) /* | + | */ \ + TRAN("a", "d", "e") /* | | - x */ \ + LOAD("c", 2) /* V V V */ + +// Define a macro that translates, shuffles and stores the input registers A, B +// and C, and preloads registers D, E and F for the next round. +// This macro can be arbitrarily daisy-chained by feeding output registers D, E +// and F back into the next round as input registers A, B and C. The macro +// carefully interleaves memory operations with data operations for optimal +// pipelined performance. + +#define ROUND_3(ROUND, A,B,C,D,E,F) /* A B C D E F */ \ + LOAD(D, (ROUND + 3)) /* V V V + */ \ + SHUF(B, E, F) /* | | | | + x */ \ + STOR(A, (ROUND + 0)) /* - | | | | */ \ + TRAN(B, E, F) /* | | | - x */ \ + LOAD(E, (ROUND + 4)) /* | | | + */ \ + SHUF(C, A, F) /* + | | | | x */ \ + STOR(B, (ROUND + 1)) /* | - | | | */ \ + TRAN(C, A, F) /* - | | | x */ \ + LOAD(F, (ROUND + 5)) /* | | | + */ \ + SHUF(D, A, B) /* + x | | | | */ \ + STOR(C, (ROUND + 2)) /* | - | | | */ \ + TRAN(D, A, B) /* - x V V V */ + +// Define a macro that terminates a ROUND_3 macro by taking pre-loaded +// registers D, E and F, and translating, shuffling and storing them. +#define ROUND_3_END(ROUND, A,B,C,D,E,F) /* A B C D E F */ \ + SHUF(E, A, B) /* + x V V V */ \ + STOR(D, (ROUND + 3)) /* | - | | */ \ + TRAN(E, A, B) /* - x | | */ \ + SHUF(F, C, D) /* + x | | */ \ + STOR(E, (ROUND + 4)) /* | - | */ \ + TRAN(F, C, D) /* - x | */ \ + STOR(F, (ROUND + 5)) /* - */ + +// Define a type A round. Inputs are a, b, and c, outputs are d, e, and f. +#define ROUND_3_A(ROUND) \ + ROUND_3(ROUND, "a", "b", "c", "d", "e", "f") + +// Define a type B round. Inputs and outputs are swapped with regard to type A. +#define ROUND_3_B(ROUND) \ + ROUND_3(ROUND, "d", "e", "f", "a", "b", "c") + +// Terminating macro for a type A round. +#define ROUND_3_A_LAST(ROUND) \ + ROUND_3_A(ROUND) \ + ROUND_3_END(ROUND, "a", "b", "c", "d", "e", "f") + +// Terminating macro for a type B round. +#define ROUND_3_B_LAST(ROUND) \ + ROUND_3_B(ROUND) \ + ROUND_3_END(ROUND, "d", "e", "f", "a", "b", "c") + +// Suppress clang's warning that the literal string in the asm statement is +// overlong (longer than the ISO-mandated minimum size of 4095 bytes for C99 +// compilers). It may be true, but the goal here is not C99 portability. +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Woverlength-strings" + +static inline void +enc_loop_avx (const uint8_t **s, size_t *slen, uint8_t **o, size_t *olen) +{ + // For a clearer explanation of the algorithm used by this function, + // please refer to the plain (not inline assembly) implementation. This + // function follows the same basic logic. + + if (*slen < 16) { + return; + } + + // Process blocks of 12 bytes at a time. Input is read in blocks of 16 + // bytes, so "reserve" four bytes from the input buffer to ensure that + // we never read beyond the end of the input buffer. + size_t rounds = (*slen - 4) / 12; + + *slen -= rounds * 12; // 12 bytes consumed per round + *olen += rounds * 16; // 16 bytes produced per round + + // Number of times to go through the 36x loop. + size_t loops = rounds / 36; + + // Number of rounds remaining after the 36x loop. + rounds %= 36; + + // Lookup tables. + const __m128i lut0 = _mm_set_epi8( + 10, 11, 9, 10, 7, 8, 6, 7, 4, 5, 3, 4, 1, 2, 0, 1); + + const __m128i lut1 = _mm_setr_epi8( + 65, 71, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -19, -16, 0, 0); + + // Temporary registers. + __m128i a, b, c, d, e, f; + + __asm__ volatile ( + + // If there are 36 rounds or more, enter a 36x unrolled loop of + // interleaved encoding rounds. The rounds interleave memory + // operations (load/store) with data operations (table lookups, + // etc) to maximize pipeline throughput. + " test %[loops], %[loops] \n\t" + " jz 18f \n\t" + " jmp 36f \n\t" + " \n\t" + ".balign 64 \n\t" + "36: " ROUND_3_INIT() + " " ROUND_3_A( 0) + " " ROUND_3_B( 3) + " " ROUND_3_A( 6) + " " ROUND_3_B( 9) + " " ROUND_3_A(12) + " " ROUND_3_B(15) + " " ROUND_3_A(18) + " " ROUND_3_B(21) + " " ROUND_3_A(24) + " " ROUND_3_B(27) + " " ROUND_3_A_LAST(30) + " add $(12 * 36), %[src] \n\t" + " add $(16 * 36), %[dst] \n\t" + " dec %[loops] \n\t" + " jnz 36b \n\t" + + // Enter an 18x unrolled loop for rounds of 18 or more. + "18: cmp $18, %[rounds] \n\t" + " jl 9f \n\t" + " " ROUND_3_INIT() + " " ROUND_3_A(0) + " " ROUND_3_B(3) + " " ROUND_3_A(6) + " " ROUND_3_B(9) + " " ROUND_3_A_LAST(12) + " sub $18, %[rounds] \n\t" + " add $(12 * 18), %[src] \n\t" + " add $(16 * 18), %[dst] \n\t" + + // Enter a 9x unrolled loop for rounds of 9 or more. + "9: cmp $9, %[rounds] \n\t" + " jl 6f \n\t" + " " ROUND_3_INIT() + " " ROUND_3_A(0) + " " ROUND_3_B_LAST(3) + " sub $9, %[rounds] \n\t" + " add $(12 * 9), %[src] \n\t" + " add $(16 * 9), %[dst] \n\t" + + // Enter a 6x unrolled loop for rounds of 6 or more. + "6: cmp $6, %[rounds] \n\t" + " jl 55f \n\t" + " " ROUND_3_INIT() + " " ROUND_3_A_LAST(0) + " sub $6, %[rounds] \n\t" + " add $(12 * 6), %[src] \n\t" + " add $(16 * 6), %[dst] \n\t" + + // Dispatch the remaining rounds 0..5. + "55: cmp $3, %[rounds] \n\t" + " jg 45f \n\t" + " je 3f \n\t" + " cmp $1, %[rounds] \n\t" + " jg 2f \n\t" + " je 1f \n\t" + " jmp 0f \n\t" + + "45: cmp $4, %[rounds] \n\t" + " je 4f \n\t" + + // Block of non-interlaced encoding rounds, which can each + // individually be jumped to. Rounds fall through to the next. + "5: " ROUND() + "4: " ROUND() + "3: " ROUND() + "2: " ROUND() + "1: " ROUND() + "0: \n\t" + + // Outputs (modified). + : [rounds] "+r" (rounds), + [loops] "+r" (loops), + [src] "+r" (*s), + [dst] "+r" (*o), + [a] "=&x" (a), + [b] "=&x" (b), + [c] "=&x" (c), + [d] "=&x" (d), + [e] "=&x" (e), + [f] "=&x" (f) + + // Inputs (not modified). + : [lut0] "x" (lut0), + [lut1] "x" (lut1), + [msk0] "x" (_mm_set1_epi32(0x0FC0FC00)), + [msk1] "x" (_mm_set1_epi32(0x04000040)), + [msk2] "x" (_mm_set1_epi32(0x003F03F0)), + [msk3] "x" (_mm_set1_epi32(0x01000010)), + [n51] "x" (_mm_set1_epi8(51)), + [n25] "x" (_mm_set1_epi8(25)) + + // Clobbers. + : "cc", "memory" + ); +} + +#pragma GCC diagnostic pop diff --git a/deps/base64/base64/lib/arch/avx2/codec.c b/deps/base64/base64/lib/arch/avx2/codec.c index 0498548b80d286..8a2aa4a6071500 100644 --- a/deps/base64/base64/lib/arch/avx2/codec.c +++ b/deps/base64/base64/lib/arch/avx2/codec.c @@ -11,11 +11,25 @@ #if HAVE_AVX2 #include +// Only enable inline assembly on supported compilers and on 64-bit CPUs. +#ifndef BASE64_AVX2_USE_ASM +# if (defined(__GNUC__) || defined(__clang__)) && BASE64_WORDSIZE == 64 +# define BASE64_AVX2_USE_ASM 1 +# else +# define BASE64_AVX2_USE_ASM 0 +# endif +#endif + #include "dec_reshuffle.c" #include "dec_loop.c" -#include "enc_translate.c" -#include "enc_reshuffle.c" -#include "enc_loop.c" + +#if BASE64_AVX2_USE_ASM +# include "enc_loop_asm.c" +#else +# include "enc_translate.c" +# include "enc_reshuffle.c" +# include "enc_loop.c" +#endif #endif // HAVE_AVX2 diff --git a/deps/base64/base64/lib/arch/avx2/enc_loop_asm.c b/deps/base64/base64/lib/arch/avx2/enc_loop_asm.c new file mode 100644 index 00000000000000..eb775a1d1f03d0 --- /dev/null +++ b/deps/base64/base64/lib/arch/avx2/enc_loop_asm.c @@ -0,0 +1,291 @@ +// Apologies in advance for combining the preprocessor with inline assembly, +// two notoriously gnarly parts of C, but it was necessary to avoid a lot of +// code repetition. The preprocessor is used to template large sections of +// inline assembly that differ only in the registers used. If the code was +// written out by hand, it would become very large and hard to audit. + +// Generate a block of inline assembly that loads register R0 from memory. The +// offset at which the register is loaded is set by the given round and a +// constant offset. +#define LOAD(R0, ROUND, OFFSET) \ + "vlddqu ("#ROUND" * 24 + "#OFFSET")(%[src]), %["R0"] \n\t" + +// Generate a block of inline assembly that deinterleaves and shuffles register +// R0 using preloaded constants. Outputs in R0 and R1. +#define SHUF(R0, R1, R2) \ + "vpshufb %[lut0], %["R0"], %["R1"] \n\t" \ + "vpand %["R1"], %[msk0], %["R2"] \n\t" \ + "vpand %["R1"], %[msk2], %["R1"] \n\t" \ + "vpmulhuw %["R2"], %[msk1], %["R2"] \n\t" \ + "vpmullw %["R1"], %[msk3], %["R1"] \n\t" \ + "vpor %["R1"], %["R2"], %["R1"] \n\t" + +// Generate a block of inline assembly that takes R0 and R1 and translates +// their contents to the base64 alphabet, using preloaded constants. +#define TRAN(R0, R1, R2) \ + "vpsubusb %[n51], %["R1"], %["R0"] \n\t" \ + "vpcmpgtb %[n25], %["R1"], %["R2"] \n\t" \ + "vpsubb %["R2"], %["R0"], %["R0"] \n\t" \ + "vpshufb %["R0"], %[lut1], %["R2"] \n\t" \ + "vpaddb %["R1"], %["R2"], %["R0"] \n\t" + +// Generate a block of inline assembly that stores the given register R0 at an +// offset set by the given round. +#define STOR(R0, ROUND) \ + "vmovdqu %["R0"], ("#ROUND" * 32)(%[dst]) \n\t" + +// Generate a block of inline assembly that generates a single self-contained +// encoder round: fetch the data, process it, and store the result. Then update +// the source and destination pointers. +#define ROUND() \ + LOAD("a", 0, -4) \ + SHUF("a", "b", "c") \ + TRAN("a", "b", "c") \ + STOR("a", 0) \ + "add $24, %[src] \n\t" \ + "add $32, %[dst] \n\t" + +// Define a macro that initiates a three-way interleaved encoding round by +// preloading registers a, b and c from memory. +// The register graph shows which registers are in use during each step, and +// is a visual aid for choosing registers for that step. Symbol index: +// +// + indicates that a register is loaded by that step. +// | indicates that a register is in use and must not be touched. +// - indicates that a register is decommissioned by that step. +// x indicates that a register is used as a temporary by that step. +// V indicates that a register is an input or output to the macro. +// +#define ROUND_3_INIT() /* a b c d e f */ \ + LOAD("a", 0, -4) /* + */ \ + SHUF("a", "d", "e") /* | + x */ \ + LOAD("b", 1, -4) /* | + | */ \ + TRAN("a", "d", "e") /* | | - x */ \ + LOAD("c", 2, -4) /* V V V */ + +// Define a macro that translates, shuffles and stores the input registers A, B +// and C, and preloads registers D, E and F for the next round. +// This macro can be arbitrarily daisy-chained by feeding output registers D, E +// and F back into the next round as input registers A, B and C. The macro +// carefully interleaves memory operations with data operations for optimal +// pipelined performance. + +#define ROUND_3(ROUND, A,B,C,D,E,F) /* A B C D E F */ \ + LOAD(D, (ROUND + 3), -4) /* V V V + */ \ + SHUF(B, E, F) /* | | | | + x */ \ + STOR(A, (ROUND + 0)) /* - | | | | */ \ + TRAN(B, E, F) /* | | | - x */ \ + LOAD(E, (ROUND + 4), -4) /* | | | + */ \ + SHUF(C, A, F) /* + | | | | x */ \ + STOR(B, (ROUND + 1)) /* | - | | | */ \ + TRAN(C, A, F) /* - | | | x */ \ + LOAD(F, (ROUND + 5), -4) /* | | | + */ \ + SHUF(D, A, B) /* + x | | | | */ \ + STOR(C, (ROUND + 2)) /* | - | | | */ \ + TRAN(D, A, B) /* - x V V V */ + +// Define a macro that terminates a ROUND_3 macro by taking pre-loaded +// registers D, E and F, and translating, shuffling and storing them. +#define ROUND_3_END(ROUND, A,B,C,D,E,F) /* A B C D E F */ \ + SHUF(E, A, B) /* + x V V V */ \ + STOR(D, (ROUND + 3)) /* | - | | */ \ + TRAN(E, A, B) /* - x | | */ \ + SHUF(F, C, D) /* + x | | */ \ + STOR(E, (ROUND + 4)) /* | - | */ \ + TRAN(F, C, D) /* - x | */ \ + STOR(F, (ROUND + 5)) /* - */ + +// Define a type A round. Inputs are a, b, and c, outputs are d, e, and f. +#define ROUND_3_A(ROUND) \ + ROUND_3(ROUND, "a", "b", "c", "d", "e", "f") + +// Define a type B round. Inputs and outputs are swapped with regard to type A. +#define ROUND_3_B(ROUND) \ + ROUND_3(ROUND, "d", "e", "f", "a", "b", "c") + +// Terminating macro for a type A round. +#define ROUND_3_A_LAST(ROUND) \ + ROUND_3_A(ROUND) \ + ROUND_3_END(ROUND, "a", "b", "c", "d", "e", "f") + +// Terminating macro for a type B round. +#define ROUND_3_B_LAST(ROUND) \ + ROUND_3_B(ROUND) \ + ROUND_3_END(ROUND, "d", "e", "f", "a", "b", "c") + +// Suppress clang's warning that the literal string in the asm statement is +// overlong (longer than the ISO-mandated minimum size of 4095 bytes for C99 +// compilers). It may be true, but the goal here is not C99 portability. +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Woverlength-strings" + +static inline void +enc_loop_avx2 (const uint8_t **s, size_t *slen, uint8_t **o, size_t *olen) +{ + // For a clearer explanation of the algorithm used by this function, + // please refer to the plain (not inline assembly) implementation. This + // function follows the same basic logic. + + if (*slen < 32) { + return; + } + + // Process blocks of 24 bytes at a time. Because blocks are loaded 32 + // bytes at a time an offset of -4, ensure that there will be at least + // 4 remaining bytes after the last round, so that the final read will + // not pass beyond the bounds of the input buffer. + size_t rounds = (*slen - 4) / 24; + + *slen -= rounds * 24; // 24 bytes consumed per round + *olen += rounds * 32; // 32 bytes produced per round + + // Pre-decrement the number of rounds to get the number of rounds + // *after* the first round, which is handled as a special case. + rounds--; + + // Number of times to go through the 36x loop. + size_t loops = rounds / 36; + + // Number of rounds remaining after the 36x loop. + rounds %= 36; + + // Lookup tables. + const __m256i lut0 = _mm256_set_epi8( + 10, 11, 9, 10, 7, 8, 6, 7, 4, 5, 3, 4, 1, 2, 0, 1, + 14, 15, 13, 14, 11, 12, 10, 11, 8, 9, 7, 8, 5, 6, 4, 5); + + const __m256i lut1 = _mm256_setr_epi8( + 65, 71, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -19, -16, 0, 0, + 65, 71, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -19, -16, 0, 0); + + // Temporary registers. + __m256i a, b, c, d, e; + + // Temporary register f doubles as the shift mask for the first round. + __m256i f = _mm256_setr_epi32(0, 0, 1, 2, 3, 4, 5, 6); + + __asm__ volatile ( + + // The first loop iteration requires special handling to ensure + // that the read, which is normally done at an offset of -4, + // does not underflow the buffer. Load the buffer at an offset + // of 0 and permute the input to achieve the same effect. + LOAD("a", 0, 0) + "vpermd %[a], %[f], %[a] \n\t" + + // Perform the standard shuffling and translation steps. + SHUF("a", "b", "c") + TRAN("a", "b", "c") + + // Store the result and increment the source and dest pointers. + "vmovdqu %[a], (%[dst]) \n\t" + "add $24, %[src] \n\t" + "add $32, %[dst] \n\t" + + // If there are 36 rounds or more, enter a 36x unrolled loop of + // interleaved encoding rounds. The rounds interleave memory + // operations (load/store) with data operations (table lookups, + // etc) to maximize pipeline throughput. + " test %[loops], %[loops] \n\t" + " jz 18f \n\t" + " jmp 36f \n\t" + " \n\t" + ".balign 64 \n\t" + "36: " ROUND_3_INIT() + " " ROUND_3_A( 0) + " " ROUND_3_B( 3) + " " ROUND_3_A( 6) + " " ROUND_3_B( 9) + " " ROUND_3_A(12) + " " ROUND_3_B(15) + " " ROUND_3_A(18) + " " ROUND_3_B(21) + " " ROUND_3_A(24) + " " ROUND_3_B(27) + " " ROUND_3_A_LAST(30) + " add $(24 * 36), %[src] \n\t" + " add $(32 * 36), %[dst] \n\t" + " dec %[loops] \n\t" + " jnz 36b \n\t" + + // Enter an 18x unrolled loop for rounds of 18 or more. + "18: cmp $18, %[rounds] \n\t" + " jl 9f \n\t" + " " ROUND_3_INIT() + " " ROUND_3_A(0) + " " ROUND_3_B(3) + " " ROUND_3_A(6) + " " ROUND_3_B(9) + " " ROUND_3_A_LAST(12) + " sub $18, %[rounds] \n\t" + " add $(24 * 18), %[src] \n\t" + " add $(32 * 18), %[dst] \n\t" + + // Enter a 9x unrolled loop for rounds of 9 or more. + "9: cmp $9, %[rounds] \n\t" + " jl 6f \n\t" + " " ROUND_3_INIT() + " " ROUND_3_A(0) + " " ROUND_3_B_LAST(3) + " sub $9, %[rounds] \n\t" + " add $(24 * 9), %[src] \n\t" + " add $(32 * 9), %[dst] \n\t" + + // Enter a 6x unrolled loop for rounds of 6 or more. + "6: cmp $6, %[rounds] \n\t" + " jl 55f \n\t" + " " ROUND_3_INIT() + " " ROUND_3_A_LAST(0) + " sub $6, %[rounds] \n\t" + " add $(24 * 6), %[src] \n\t" + " add $(32 * 6), %[dst] \n\t" + + // Dispatch the remaining rounds 0..5. + "55: cmp $3, %[rounds] \n\t" + " jg 45f \n\t" + " je 3f \n\t" + " cmp $1, %[rounds] \n\t" + " jg 2f \n\t" + " je 1f \n\t" + " jmp 0f \n\t" + + "45: cmp $4, %[rounds] \n\t" + " je 4f \n\t" + + // Block of non-interlaced encoding rounds, which can each + // individually be jumped to. Rounds fall through to the next. + "5: " ROUND() + "4: " ROUND() + "3: " ROUND() + "2: " ROUND() + "1: " ROUND() + "0: \n\t" + + // Outputs (modified). + : [rounds] "+r" (rounds), + [loops] "+r" (loops), + [src] "+r" (*s), + [dst] "+r" (*o), + [a] "=&x" (a), + [b] "=&x" (b), + [c] "=&x" (c), + [d] "=&x" (d), + [e] "=&x" (e), + [f] "+x" (f) + + // Inputs (not modified). + : [lut0] "x" (lut0), + [lut1] "x" (lut1), + [msk0] "x" (_mm256_set1_epi32(0x0FC0FC00)), + [msk1] "x" (_mm256_set1_epi32(0x04000040)), + [msk2] "x" (_mm256_set1_epi32(0x003F03F0)), + [msk3] "x" (_mm256_set1_epi32(0x01000010)), + [n51] "x" (_mm256_set1_epi8(51)), + [n25] "x" (_mm256_set1_epi8(25)) + + // Clobbers. + : "cc", "memory" + ); +} + +#pragma GCC diagnostic pop diff --git a/deps/base64/base64/lib/arch/avx512/codec.c b/deps/base64/base64/lib/arch/avx512/codec.c new file mode 100644 index 00000000000000..664120853d4316 --- /dev/null +++ b/deps/base64/base64/lib/arch/avx512/codec.c @@ -0,0 +1,42 @@ +#include +#include +#include + +#include "../../../include/libbase64.h" +#include "../../tables/tables.h" +#include "../../codecs.h" +#include "config.h" +#include "../../env.h" + +#if HAVE_AVX512 +#include + +#include "../avx2/dec_reshuffle.c" +#include "../avx2/dec_loop.c" +#include "enc_reshuffle_translate.c" +#include "enc_loop.c" + +#endif // HAVE_AVX512 + +BASE64_ENC_FUNCTION(avx512) +{ +#if HAVE_AVX512 + #include "../generic/enc_head.c" + enc_loop_avx512(&s, &slen, &o, &olen); + #include "../generic/enc_tail.c" +#else + BASE64_ENC_STUB +#endif +} + +// Reuse AVX2 decoding. Not supporting AVX512 at present +BASE64_DEC_FUNCTION(avx512) +{ +#if HAVE_AVX512 + #include "../generic/dec_head.c" + dec_loop_avx2(&s, &slen, &o, &olen); + #include "../generic/dec_tail.c" +#else + BASE64_DEC_STUB +#endif +} diff --git a/deps/base64/base64/lib/arch/avx512/enc_loop.c b/deps/base64/base64/lib/arch/avx512/enc_loop.c new file mode 100644 index 00000000000000..4c71e160ae820a --- /dev/null +++ b/deps/base64/base64/lib/arch/avx512/enc_loop.c @@ -0,0 +1,61 @@ +static inline void +enc_loop_avx512_inner (const uint8_t **s, uint8_t **o) +{ + // Load input. + __m512i src = _mm512_loadu_si512((__m512i *) *s); + + // Reshuffle, translate, store. + src = enc_reshuffle_translate(src); + _mm512_storeu_si512((__m512i *) *o, src); + + *s += 48; + *o += 64; +} + +static inline void +enc_loop_avx512 (const uint8_t **s, size_t *slen, uint8_t **o, size_t *olen) +{ + if (*slen < 64) { + return; + } + + // Process blocks of 48 bytes at a time. Because blocks are loaded 64 + // bytes at a time, ensure that there will be at least 24 remaining + // bytes after the last round, so that the final read will not pass + // beyond the bounds of the input buffer. + size_t rounds = (*slen - 24) / 48; + + *slen -= rounds * 48; // 48 bytes consumed per round + *olen += rounds * 64; // 64 bytes produced per round + + while (rounds > 0) { + if (rounds >= 8) { + enc_loop_avx512_inner(s, o); + enc_loop_avx512_inner(s, o); + enc_loop_avx512_inner(s, o); + enc_loop_avx512_inner(s, o); + enc_loop_avx512_inner(s, o); + enc_loop_avx512_inner(s, o); + enc_loop_avx512_inner(s, o); + enc_loop_avx512_inner(s, o); + rounds -= 8; + continue; + } + if (rounds >= 4) { + enc_loop_avx512_inner(s, o); + enc_loop_avx512_inner(s, o); + enc_loop_avx512_inner(s, o); + enc_loop_avx512_inner(s, o); + rounds -= 4; + continue; + } + if (rounds >= 2) { + enc_loop_avx512_inner(s, o); + enc_loop_avx512_inner(s, o); + rounds -= 2; + continue; + } + enc_loop_avx512_inner(s, o); + break; + } +} diff --git a/deps/base64/base64/lib/arch/avx512/enc_reshuffle_translate.c b/deps/base64/base64/lib/arch/avx512/enc_reshuffle_translate.c new file mode 100644 index 00000000000000..5c332bb24ca4e3 --- /dev/null +++ b/deps/base64/base64/lib/arch/avx512/enc_reshuffle_translate.c @@ -0,0 +1,50 @@ +// AVX512 algorithm is based on permutevar and multishift. The code is based on +// https://github.com/WojciechMula/base64simd which is under BSD-2 license. + +static inline __m512i +enc_reshuffle_translate (const __m512i input) +{ + // 32-bit input + // [ 0 0 0 0 0 0 0 0|c1 c0 d5 d4 d3 d2 d1 d0| + // b3 b2 b1 b0 c5 c4 c3 c2|a5 a4 a3 a2 a1 a0 b5 b4] + // output order [1, 2, 0, 1] + // [b3 b2 b1 b0 c5 c4 c3 c2|c1 c0 d5 d4 d3 d2 d1 d0| + // a5 a4 a3 a2 a1 a0 b5 b4|b3 b2 b1 b0 c3 c2 c1 c0] + + const __m512i shuffle_input = _mm512_setr_epi32(0x01020001, + 0x04050304, + 0x07080607, + 0x0a0b090a, + 0x0d0e0c0d, + 0x10110f10, + 0x13141213, + 0x16171516, + 0x191a1819, + 0x1c1d1b1c, + 0x1f201e1f, + 0x22232122, + 0x25262425, + 0x28292728, + 0x2b2c2a2b, + 0x2e2f2d2e); + + // Reorder bytes + // [b3 b2 b1 b0 c5 c4 c3 c2|c1 c0 d5 d4 d3 d2 d1 d0| + // a5 a4 a3 a2 a1 a0 b5 b4|b3 b2 b1 b0 c3 c2 c1 c0] + const __m512i in = _mm512_permutexvar_epi8(shuffle_input, input); + + // After multishift a single 32-bit lane has following layout + // [c1 c0 d5 d4 d3 d2 d1 d0|b1 b0 c5 c4 c3 c2 c1 c0| + // a1 a0 b5 b4 b3 b2 b1 b0|d1 d0 a5 a4 a3 a2 a1 a0] + // (a = [10:17], b = [4:11], c = [22:27], d = [16:21]) + + // 48, 54, 36, 42, 16, 22, 4, 10 + const __m512i shifts = _mm512_set1_epi64(0x3036242a1016040alu); + __m512i shuffled_in = _mm512_multishift_epi64_epi8(shifts, in); + + // Translate immediatedly after reshuffled. + const __m512i lookup = _mm512_loadu_si512(base64_table_enc_6bit); + + // Translation 6-bit values to ASCII. + return _mm512_permutexvar_epi8(shuffled_in, lookup); +} diff --git a/deps/base64/base64/lib/arch/neon32/enc_loop.c b/deps/base64/base64/lib/arch/neon32/enc_loop.c index e9e8e28525691b..d694b33733cd61 100644 --- a/deps/base64/base64/lib/arch/neon32/enc_loop.c +++ b/deps/base64/base64/lib/arch/neon32/enc_loop.c @@ -100,7 +100,8 @@ enc_loop_neon32_inner_asm (const uint8_t **s, uint8_t **o) [n63] "w" (n63) // Clobbers. - : "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31" + : "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", + "cc", "memory" ); } #endif diff --git a/deps/base64/base64/lib/arch/neon64/enc_loop_asm.c b/deps/base64/base64/lib/arch/neon64/enc_loop_asm.c index cf2fd27e80d2ca..182e9cdf4a17db 100644 --- a/deps/base64/base64/lib/arch/neon64/enc_loop_asm.c +++ b/deps/base64/base64/lib/arch/neon64/enc_loop_asm.c @@ -160,7 +160,8 @@ enc_loop_neon64 (const uint8_t **s, size_t *slen, uint8_t **o, size_t *olen) // Clobbers. : "v2", "v3", "v4", "v5", "v8", "v9", "v10", "v11", - "v12", "v13", "v14", "v15" + "v12", "v13", "v14", "v15", + "cc", "memory" ); } diff --git a/deps/base64/base64/lib/arch/sse41/codec.c b/deps/base64/base64/lib/arch/sse41/codec.c index 00645feda836d0..6e5afe30011b7b 100644 --- a/deps/base64/base64/lib/arch/sse41/codec.c +++ b/deps/base64/base64/lib/arch/sse41/codec.c @@ -11,11 +11,25 @@ #if HAVE_SSE41 #include +// Only enable inline assembly on supported compilers and on 64-bit CPUs. +#ifndef BASE64_SSE41_USE_ASM +# if (defined(__GNUC__) || defined(__clang__)) && BASE64_WORDSIZE == 64 +# define BASE64_SSE41_USE_ASM 1 +# else +# define BASE64_SSE41_USE_ASM 0 +# endif +#endif + #include "../ssse3/dec_reshuffle.c" #include "../ssse3/dec_loop.c" -#include "../ssse3/enc_translate.c" -#include "../ssse3/enc_reshuffle.c" -#include "../ssse3/enc_loop.c" + +#if BASE64_SSE41_USE_ASM +# include "../ssse3/enc_loop_asm.c" +#else +# include "../ssse3/enc_translate.c" +# include "../ssse3/enc_reshuffle.c" +# include "../ssse3/enc_loop.c" +#endif #endif // HAVE_SSE41 diff --git a/deps/base64/base64/lib/arch/sse42/codec.c b/deps/base64/base64/lib/arch/sse42/codec.c index cf5d97cfb293ca..dde823b7aa0aa6 100644 --- a/deps/base64/base64/lib/arch/sse42/codec.c +++ b/deps/base64/base64/lib/arch/sse42/codec.c @@ -11,11 +11,25 @@ #if HAVE_SSE42 #include +// Only enable inline assembly on supported compilers and on 64-bit CPUs. +#ifndef BASE64_SSE42_USE_ASM +# if (defined(__GNUC__) || defined(__clang__)) && BASE64_WORDSIZE == 64 +# define BASE64_SSE42_USE_ASM 1 +# else +# define BASE64_SSE42_USE_ASM 0 +# endif +#endif + #include "../ssse3/dec_reshuffle.c" #include "../ssse3/dec_loop.c" -#include "../ssse3/enc_translate.c" -#include "../ssse3/enc_reshuffle.c" -#include "../ssse3/enc_loop.c" + +#if BASE64_SSE42_USE_ASM +# include "../ssse3/enc_loop_asm.c" +#else +# include "../ssse3/enc_translate.c" +# include "../ssse3/enc_reshuffle.c" +# include "../ssse3/enc_loop.c" +#endif #endif // HAVE_SSE42 diff --git a/deps/base64/base64/lib/arch/ssse3/codec.c b/deps/base64/base64/lib/arch/ssse3/codec.c index ad14a4589deb70..a812a2901f4efb 100644 --- a/deps/base64/base64/lib/arch/ssse3/codec.c +++ b/deps/base64/base64/lib/arch/ssse3/codec.c @@ -11,11 +11,27 @@ #if HAVE_SSSE3 #include +// Only enable inline assembly on supported compilers and on 64-bit CPUs. +// 32-bit CPUs with SSSE3 support, such as low-end Atoms, only have eight XMM +// registers, which is not enough to run the inline assembly. +#ifndef BASE64_SSSE3_USE_ASM +# if (defined(__GNUC__) || defined(__clang__)) && BASE64_WORDSIZE == 64 +# define BASE64_SSSE3_USE_ASM 1 +# else +# define BASE64_SSSE3_USE_ASM 0 +# endif +#endif + #include "dec_reshuffle.c" #include "dec_loop.c" -#include "enc_reshuffle.c" -#include "enc_translate.c" -#include "enc_loop.c" + +#if BASE64_SSSE3_USE_ASM +# include "enc_loop_asm.c" +#else +# include "enc_reshuffle.c" +# include "enc_translate.c" +# include "enc_loop.c" +#endif #endif // HAVE_SSSE3 diff --git a/deps/base64/base64/lib/arch/ssse3/enc_loop_asm.c b/deps/base64/base64/lib/arch/ssse3/enc_loop_asm.c new file mode 100644 index 00000000000000..0cdb340a63b7fc --- /dev/null +++ b/deps/base64/base64/lib/arch/ssse3/enc_loop_asm.c @@ -0,0 +1,268 @@ +// Apologies in advance for combining the preprocessor with inline assembly, +// two notoriously gnarly parts of C, but it was necessary to avoid a lot of +// code repetition. The preprocessor is used to template large sections of +// inline assembly that differ only in the registers used. If the code was +// written out by hand, it would become very large and hard to audit. + +// Generate a block of inline assembly that loads register R0 from memory. The +// offset at which the register is loaded is set by the given round. +#define LOAD(R0, ROUND) \ + "lddqu ("#ROUND" * 12)(%[src]), %["R0"] \n\t" + +// Generate a block of inline assembly that deinterleaves and shuffles register +// R0 using preloaded constants. Outputs in R0 and R1. +#define SHUF(R0, R1) \ + "pshufb %[lut0], %["R0"] \n\t" \ + "movdqa %["R0"], %["R1"] \n\t" \ + "pand %[msk0], %["R0"] \n\t" \ + "pand %[msk2], %["R1"] \n\t" \ + "pmulhuw %[msk1], %["R0"] \n\t" \ + "pmullw %[msk3], %["R1"] \n\t" \ + "por %["R1"], %["R0"] \n\t" + +// Generate a block of inline assembly that takes R0 and R1 and translates +// their contents to the base64 alphabet, using preloaded constants. +#define TRAN(R0, R1, R2) \ + "movdqa %["R0"], %["R1"] \n\t" \ + "movdqa %["R0"], %["R2"] \n\t" \ + "psubusb %[n51], %["R1"] \n\t" \ + "pcmpgtb %[n25], %["R2"] \n\t" \ + "psubb %["R2"], %["R1"] \n\t" \ + "movdqa %[lut1], %["R2"] \n\t" \ + "pshufb %["R1"], %["R2"] \n\t" \ + "paddb %["R2"], %["R0"] \n\t" + +// Generate a block of inline assembly that stores the given register R0 at an +// offset set by the given round. +#define STOR(R0, ROUND) \ + "movdqu %["R0"], ("#ROUND" * 16)(%[dst]) \n\t" + +// Generate a block of inline assembly that generates a single self-contained +// encoder round: fetch the data, process it, and store the result. Then update +// the source and destination pointers. +#define ROUND() \ + LOAD("a", 0) \ + SHUF("a", "b") \ + TRAN("a", "b", "c") \ + STOR("a", 0) \ + "add $12, %[src] \n\t" \ + "add $16, %[dst] \n\t" + +// Define a macro that initiates a three-way interleaved encoding round by +// preloading registers a, b and c from memory. +// The register graph shows which registers are in use during each step, and +// is a visual aid for choosing registers for that step. Symbol index: +// +// + indicates that a register is loaded by that step. +// | indicates that a register is in use and must not be touched. +// - indicates that a register is decommissioned by that step. +// x indicates that a register is used as a temporary by that step. +// V indicates that a register is an input or output to the macro. +// +#define ROUND_3_INIT() /* a b c d e f */ \ + LOAD("a", 0) /* + */ \ + SHUF("a", "d") /* | + */ \ + LOAD("b", 1) /* | + | */ \ + TRAN("a", "d", "e") /* | | - x */ \ + LOAD("c", 2) /* V V V */ + +// Define a macro that translates, shuffles and stores the input registers A, B +// and C, and preloads registers D, E and F for the next round. +// This macro can be arbitrarily daisy-chained by feeding output registers D, E +// and F back into the next round as input registers A, B and C. The macro +// carefully interleaves memory operations with data operations for optimal +// pipelined performance. + +#define ROUND_3(ROUND, A,B,C,D,E,F) /* A B C D E F */ \ + LOAD(D, (ROUND + 3)) /* V V V + */ \ + SHUF(B, E) /* | | | | + */ \ + STOR(A, (ROUND + 0)) /* - | | | | */ \ + TRAN(B, E, F) /* | | | - x */ \ + LOAD(E, (ROUND + 4)) /* | | | + */ \ + SHUF(C, A) /* + | | | | */ \ + STOR(B, (ROUND + 1)) /* | - | | | */ \ + TRAN(C, A, F) /* - | | | x */ \ + LOAD(F, (ROUND + 5)) /* | | | + */ \ + SHUF(D, A) /* + | | | | */ \ + STOR(C, (ROUND + 2)) /* | - | | | */ \ + TRAN(D, A, B) /* - x V V V */ + +// Define a macro that terminates a ROUND_3 macro by taking pre-loaded +// registers D, E and F, and translating, shuffling and storing them. +#define ROUND_3_END(ROUND, A,B,C,D,E,F) /* A B C D E F */ \ + SHUF(E, A) /* + V V V */ \ + STOR(D, (ROUND + 3)) /* | - | | */ \ + TRAN(E, A, B) /* - x | | */ \ + SHUF(F, C) /* + | | */ \ + STOR(E, (ROUND + 4)) /* | - | */ \ + TRAN(F, C, D) /* - x | */ \ + STOR(F, (ROUND + 5)) /* - */ + +// Define a type A round. Inputs are a, b, and c, outputs are d, e, and f. +#define ROUND_3_A(ROUND) \ + ROUND_3(ROUND, "a", "b", "c", "d", "e", "f") + +// Define a type B round. Inputs and outputs are swapped with regard to type A. +#define ROUND_3_B(ROUND) \ + ROUND_3(ROUND, "d", "e", "f", "a", "b", "c") + +// Terminating macro for a type A round. +#define ROUND_3_A_LAST(ROUND) \ + ROUND_3_A(ROUND) \ + ROUND_3_END(ROUND, "a", "b", "c", "d", "e", "f") + +// Terminating macro for a type B round. +#define ROUND_3_B_LAST(ROUND) \ + ROUND_3_B(ROUND) \ + ROUND_3_END(ROUND, "d", "e", "f", "a", "b", "c") + +// Suppress clang's warning that the literal string in the asm statement is +// overlong (longer than the ISO-mandated minimum size of 4095 bytes for C99 +// compilers). It may be true, but the goal here is not C99 portability. +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Woverlength-strings" + +static inline void +enc_loop_ssse3 (const uint8_t **s, size_t *slen, uint8_t **o, size_t *olen) +{ + // For a clearer explanation of the algorithm used by this function, + // please refer to the plain (not inline assembly) implementation. This + // function follows the same basic logic. + + if (*slen < 16) { + return; + } + + // Process blocks of 12 bytes at a time. Input is read in blocks of 16 + // bytes, so "reserve" four bytes from the input buffer to ensure that + // we never read beyond the end of the input buffer. + size_t rounds = (*slen - 4) / 12; + + *slen -= rounds * 12; // 12 bytes consumed per round + *olen += rounds * 16; // 16 bytes produced per round + + // Number of times to go through the 36x loop. + size_t loops = rounds / 36; + + // Number of rounds remaining after the 36x loop. + rounds %= 36; + + // Lookup tables. + const __m128i lut0 = _mm_set_epi8( + 10, 11, 9, 10, 7, 8, 6, 7, 4, 5, 3, 4, 1, 2, 0, 1); + + const __m128i lut1 = _mm_setr_epi8( + 65, 71, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -19, -16, 0, 0); + + // Temporary registers. + __m128i a, b, c, d, e, f; + + __asm__ volatile ( + + // If there are 36 rounds or more, enter a 36x unrolled loop of + // interleaved encoding rounds. The rounds interleave memory + // operations (load/store) with data operations (table lookups, + // etc) to maximize pipeline throughput. + " test %[loops], %[loops] \n\t" + " jz 18f \n\t" + " jmp 36f \n\t" + " \n\t" + ".balign 64 \n\t" + "36: " ROUND_3_INIT() + " " ROUND_3_A( 0) + " " ROUND_3_B( 3) + " " ROUND_3_A( 6) + " " ROUND_3_B( 9) + " " ROUND_3_A(12) + " " ROUND_3_B(15) + " " ROUND_3_A(18) + " " ROUND_3_B(21) + " " ROUND_3_A(24) + " " ROUND_3_B(27) + " " ROUND_3_A_LAST(30) + " add $(12 * 36), %[src] \n\t" + " add $(16 * 36), %[dst] \n\t" + " dec %[loops] \n\t" + " jnz 36b \n\t" + + // Enter an 18x unrolled loop for rounds of 18 or more. + "18: cmp $18, %[rounds] \n\t" + " jl 9f \n\t" + " " ROUND_3_INIT() + " " ROUND_3_A(0) + " " ROUND_3_B(3) + " " ROUND_3_A(6) + " " ROUND_3_B(9) + " " ROUND_3_A_LAST(12) + " sub $18, %[rounds] \n\t" + " add $(12 * 18), %[src] \n\t" + " add $(16 * 18), %[dst] \n\t" + + // Enter a 9x unrolled loop for rounds of 9 or more. + "9: cmp $9, %[rounds] \n\t" + " jl 6f \n\t" + " " ROUND_3_INIT() + " " ROUND_3_A(0) + " " ROUND_3_B_LAST(3) + " sub $9, %[rounds] \n\t" + " add $(12 * 9), %[src] \n\t" + " add $(16 * 9), %[dst] \n\t" + + // Enter a 6x unrolled loop for rounds of 6 or more. + "6: cmp $6, %[rounds] \n\t" + " jl 55f \n\t" + " " ROUND_3_INIT() + " " ROUND_3_A_LAST(0) + " sub $6, %[rounds] \n\t" + " add $(12 * 6), %[src] \n\t" + " add $(16 * 6), %[dst] \n\t" + + // Dispatch the remaining rounds 0..5. + "55: cmp $3, %[rounds] \n\t" + " jg 45f \n\t" + " je 3f \n\t" + " cmp $1, %[rounds] \n\t" + " jg 2f \n\t" + " je 1f \n\t" + " jmp 0f \n\t" + + "45: cmp $4, %[rounds] \n\t" + " je 4f \n\t" + + // Block of non-interlaced encoding rounds, which can each + // individually be jumped to. Rounds fall through to the next. + "5: " ROUND() + "4: " ROUND() + "3: " ROUND() + "2: " ROUND() + "1: " ROUND() + "0: \n\t" + + // Outputs (modified). + : [rounds] "+r" (rounds), + [loops] "+r" (loops), + [src] "+r" (*s), + [dst] "+r" (*o), + [a] "=&x" (a), + [b] "=&x" (b), + [c] "=&x" (c), + [d] "=&x" (d), + [e] "=&x" (e), + [f] "=&x" (f) + + // Inputs (not modified). + : [lut0] "x" (lut0), + [lut1] "x" (lut1), + [msk0] "x" (_mm_set1_epi32(0x0FC0FC00)), + [msk1] "x" (_mm_set1_epi32(0x04000040)), + [msk2] "x" (_mm_set1_epi32(0x003F03F0)), + [msk3] "x" (_mm_set1_epi32(0x01000010)), + [n51] "x" (_mm_set1_epi8(51)), + [n25] "x" (_mm_set1_epi8(25)) + + // Clobbers. + : "cc", "memory" + ); +} + +#pragma GCC diagnostic pop diff --git a/deps/base64/base64/lib/codec_choose.c b/deps/base64/base64/lib/codec_choose.c index 6a07d6a74cc24f..abef3f2ae9f403 100644 --- a/deps/base64/base64/lib/codec_choose.c +++ b/deps/base64/base64/lib/codec_choose.c @@ -2,6 +2,7 @@ #include #include #include +#include #include "../include/libbase64.h" #include "codecs.h" @@ -10,7 +11,7 @@ #if (__x86_64__ || __i386__ || _M_X86 || _M_X64) #define BASE64_X86 - #if (HAVE_SSSE3 || HAVE_SSE41 || HAVE_SSE42 || HAVE_AVX || HAVE_AVX2) + #if (HAVE_SSSE3 || HAVE_SSE41 || HAVE_SSE42 || HAVE_AVX || HAVE_AVX2 || HAVE_AVX512) #define BASE64_X86_SIMD #endif #endif @@ -31,7 +32,7 @@ __cpuid_count(__level, 0, __eax, __ebx, __ecx, __edx) #else #include - #if HAVE_AVX2 || HAVE_AVX + #if HAVE_AVX512 || HAVE_AVX2 || HAVE_AVX #if ((__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 2) || (__clang_major__ >= 3)) static inline uint64_t _xgetbv (uint32_t index) { @@ -45,6 +46,12 @@ #endif #endif +#ifndef bit_AVX512vl +#define bit_AVX512vl (1 << 31) +#endif +#ifndef bit_AVX512vbmi +#define bit_AVX512vbmi (1 << 1) +#endif #ifndef bit_AVX2 #define bit_AVX2 (1 << 5) #endif @@ -75,6 +82,7 @@ BASE64_ENC_FUNCTION(arch); \ BASE64_DEC_FUNCTION(arch); \ +BASE64_CODEC_FUNCS(avx512) BASE64_CODEC_FUNCS(avx2) BASE64_CODEC_FUNCS(neon32) BASE64_CODEC_FUNCS(neon64) @@ -91,9 +99,10 @@ codec_choose_forced (struct codec *codec, int flags) // always allow it, even if the codec is a no-op. // For testing purposes. - if (!(flags & 0xFF)) { + if (!(flags & 0xFFFF)) { return false; } + if (flags & BASE64_FORCE_AVX2) { codec->enc = base64_stream_encode_avx2; codec->dec = base64_stream_decode_avx2; @@ -134,6 +143,11 @@ codec_choose_forced (struct codec *codec, int flags) codec->dec = base64_stream_decode_avx; return true; } + if (flags & BASE64_FORCE_AVX512) { + codec->enc = base64_stream_encode_avx512; + codec->dec = base64_stream_decode_avx512; + return true; + } return false; } @@ -178,8 +192,8 @@ codec_choose_x86 (struct codec *codec) max_level = __get_cpuid_max(0, NULL); #endif - #if HAVE_AVX2 || HAVE_AVX - // Check for AVX/AVX2 support: + #if HAVE_AVX512 || HAVE_AVX2 || HAVE_AVX + // Check for AVX/AVX2/AVX512 support: // Checking for AVX requires 3 things: // 1) CPUID indicates that the OS uses XSAVE and XRSTORE instructions // (allowing saving YMM registers on context switch) @@ -194,7 +208,17 @@ codec_choose_x86 (struct codec *codec) if (ecx & bit_XSAVE_XRSTORE) { uint64_t xcr_mask; xcr_mask = _xgetbv(_XCR_XFEATURE_ENABLED_MASK); - if (xcr_mask & _XCR_XMM_AND_YMM_STATE_ENABLED_BY_OS) { + if ((xcr_mask & _XCR_XMM_AND_YMM_STATE_ENABLED_BY_OS) == _XCR_XMM_AND_YMM_STATE_ENABLED_BY_OS) { // check multiple bits at once + #if HAVE_AVX512 + if (max_level >= 7) { + __cpuid_count(7, 0, eax, ebx, ecx, edx); + if ((ebx & bit_AVX512vl) && (ecx & bit_AVX512vbmi)) { + codec->enc = base64_stream_encode_avx512; + codec->dec = base64_stream_decode_avx512; + return true; + } + } + #endif #if HAVE_AVX2 if (max_level >= 7) { __cpuid_count(7, 0, eax, ebx, ecx, edx); diff --git a/deps/base64/base64/lib/lib.c b/deps/base64/base64/lib/lib.c index 4703512b87ab46..053931a9918b2b 100644 --- a/deps/base64/base64/lib/lib.c +++ b/deps/base64/base64/lib/lib.c @@ -68,7 +68,7 @@ void base64_stream_decode_init (struct base64_state *state, int flags) { // If any of the codec flags are set, redo choice: - if (codec.dec == NULL || flags & 0xFF) { + if (codec.dec == NULL || flags & 0xFFFF) { codec_choose(&codec, flags); } state->eof = 0; diff --git a/deps/base64/base64/test/Makefile b/deps/base64/base64/test/Makefile index d1045824195edb..c896627e0bd8d6 100644 --- a/deps/base64/base64/test/Makefile +++ b/deps/base64/base64/test/Makefile @@ -11,12 +11,15 @@ else BENCH_LDFLAGS=-lrt endif -.PHONY: clean test +.PHONY: clean test valgrind test: clean test_base64 benchmark ./test_base64 ./benchmark +valgrind: clean test_base64 + valgrind --error-exitcode=2 ./test_base64 + test_base64: test_base64.c codec_supported.o ../lib/libbase64.o $(CC) $(CFLAGS) -o $@ $^ diff --git a/deps/base64/base64/test/ci/analysis.sh b/deps/base64/base64/test/ci/analysis.sh new file mode 100755 index 00000000000000..f7da1857fe05e3 --- /dev/null +++ b/deps/base64/base64/test/ci/analysis.sh @@ -0,0 +1,37 @@ +#!/bin/bash +set -ve + +MACHINE=$(uname -m) +export CC=gcc + +uname -a +clang --version # make analyse +${CC} --version # make -C test valgrind + +for USE_ASSEMBLY in 0 1; do + if [ "${MACHINE}" == "x86_64" ]; then + export SSSE3_CFLAGS="-mssse3 -DBASE64_SSSE3_USE_ASM=${USE_ASSEMBLY}" + export SSE41_CFLAGS="-msse4.1 -DBASE64_SSE41_USE_ASM=${USE_ASSEMBLY}" + export SSE42_CFLAGS="-msse4.2 -DBASE64_SSE42_USE_ASM=${USE_ASSEMBLY}" + export AVX_CFLAGS="-mavx -DBASE64_AVX_USE_ASM=${USE_ASSEMBLY}" + export AVX2_CFLAGS="-mavx2 -DBASE64_AVX2_USE_ASM=${USE_ASSEMBLY}" + # Temporarily disable AVX512; it is not available in CI yet. + # export AVX512_CFLAGS="-mavx512vl -mavx512vbmi" + elif [ "${MACHINE}" == "aarch64" ]; then + export NEON64_CFLAGS="-march=armv8-a" + elif [ "${MACHINE}" == "armv7l" ]; then + export NEON32_CFLAGS="-march=armv7-a -mfloat-abi=hard -mfpu=neon" + fi + + if [ ${USE_ASSEMBLY} -eq 0 ]; then + echo "::group::analyze" + make analyze + echo "::endgroup::" + fi + + echo "::group::valgrind (USE_ASSEMBLY=${USE_ASSEMBLY})" + make clean + make + make -C test valgrind + echo "::endgroup::" +done diff --git a/deps/base64/base64/test/ci/test.sh b/deps/base64/base64/test/ci/test.sh index 066a49f400b95c..fb188418cca0a9 100755 --- a/deps/base64/base64/test/ci/test.sh +++ b/deps/base64/base64/test/ci/test.sh @@ -7,9 +7,11 @@ if [ "${MACHINE}" == "x86_64" ]; then export SSE41_CFLAGS=-msse4.1 export SSE42_CFLAGS=-msse4.2 export AVX_CFLAGS=-mavx - # no AVX2 on GHA macOS + # no AVX2 or AVX512 on GHA macOS if [ "$(uname -s)" != "Darwin" ]; then export AVX2_CFLAGS=-mavx2 + # Temporarily disable AVX512; it is not available in CI yet. + # export AVX512_CFLAGS="-mavx512vl -mavx512vbmi" fi elif [ "${MACHINE}" == "aarch64" ]; then export NEON64_CFLAGS="-march=armv8-a" diff --git a/deps/base64/base64/test/codec_supported.c b/deps/base64/base64/test/codec_supported.c index a027b9943bf8ed..f68c766875abcd 100644 --- a/deps/base64/base64/test/codec_supported.c +++ b/deps/base64/base64/test/codec_supported.c @@ -11,6 +11,7 @@ static char *_codecs[] = , "SSE41" , "SSE42" , "AVX" +, "AVX512" , NULL } ; diff --git a/deps/base64/base64/test/test_base64.c b/deps/base64/base64/test/test_base64.c index bec52d146c824a..94aad2d489b9f7 100644 --- a/deps/base64/base64/test/test_base64.c +++ b/deps/base64/base64/test/test_base64.c @@ -1,6 +1,7 @@ #include #include #include +#include #include "../include/libbase64.h" #include "codec_supported.h" #include "moby_dick.h" @@ -92,7 +93,7 @@ assert_roundtrip (int flags, const char *src) } static int -test_char_table (int flags) +test_char_table (int flags, bool use_malloc) { bool fail = false; char chr[256]; @@ -107,8 +108,24 @@ test_char_table (int flags) for (int i = 0; i < 256; i++) { size_t chrlen = 256 - i; + char* src = &chr[i]; + if (use_malloc) { + src = malloc(chrlen); /* malloc/copy this so valgrind can find out-of-bound access */ + if (src == NULL) { + printf( + "FAIL: encoding @ %d: allocation of %lu bytes failed\n", + i, (unsigned long)chrlen + ); + fail = true; + continue; + } + memcpy(src, &chr[i], chrlen); + } - base64_encode(&chr[i], chrlen, enc, &enclen, BASE64_FORCE_PLAIN); + base64_encode(src, chrlen, enc, &enclen, flags); + if (use_malloc) { + free(src); + } if (!base64_decode(enc, enclen, dec, &declen, flags)) { printf("FAIL: decoding @ %d: decoding error\n", i); @@ -198,6 +215,11 @@ test_streaming (int flags) while (base64_stream_decode(&state, &ref[inpos], (inpos + bs > reflen) ? reflen - inpos : bs, &enc[enclen], &partlen)) { enclen += partlen; inpos += bs; + + // Has the entire buffer been consumed? + if (inpos >= 400) { + break; + } } if (enclen != 256) { printf("FAIL: stream decoding gave incorrect size: " @@ -336,7 +358,8 @@ test_one_codec (const char *codec, int flags) fail |= assert_roundtrip(flags, vec[i].out); } - fail |= test_char_table(flags); + fail |= test_char_table(flags, false); /* test with unaligned input buffer */ + fail |= test_char_table(flags, true); /* test for out-of-bound input read */ fail |= test_streaming(flags); fail |= test_invalid_dec_input(flags); diff --git a/deps/base64/unofficial.gni b/deps/base64/unofficial.gni new file mode 100644 index 00000000000000..5c46dea5d90d90 --- /dev/null +++ b/deps/base64/unofficial.gni @@ -0,0 +1,153 @@ +# This file is used by GN for building, which is NOT the build system used for +# building official binaries. +# Please edit the gyp files if you are making changes to build system. + +# The actual configurations are put inside a template in unofficial.gni to +# prevent accidental edits from contributors. +template("base64_gn_build") { + config("base64_external_config") { + include_dirs = [ "base64/include" ] + if (!is_component_build) { + defines = [ "BASE64_STATIC_DEFINE" ] + } + } + + config("base64_internal_config") { + include_dirs = [ "base64/lib" ] + if (is_component_build) { + defines = [ "BASE64_EXPORTS" ] + } else { + defines = [] + } + if (target_cpu == "x86" || target_cpu == "x64") { + defines += [ + "HAVE_SSSE3=1", + "HAVE_SSE41=1", + "HAVE_SSE42=1", + "HAVE_AVX=1", + "HAVE_AVX2=1", + "HAVE_AVX512=1", + ] + } + if (target_cpu == "arm") { + defines += [ "HAVE_NEON32=1" ] + } + if (target_cpu == "arm64") { + defines += [ "HAVE_NEON64=1" ] + } + if (is_clang || !is_win) { + cflags_c = [ + "-Wno-implicit-fallthrough", + "-Wno-shadow", + "-Wno-unused-but-set-variable", + ] + } + } + + gypi_values = exec_script("../../tools/gypi_to_gn.py", + [ rebase_path("base64.gyp") ], + "scope", + [ "base64.gyp" ]) + + component(target_name) { + forward_variables_from(invoker, "*") + configs += [ ":base64_internal_config" ] + public_configs = [ ":base64_external_config" ] + sources = gypi_values.base64_sources_common + deps = [ + ":base64_ssse3", + ":base64_sse41", + ":base64_sse42", + ":base64_avx", + ":base64_avx2", + ":base64_avx512", + ":base64_neon32", + ":base64_neon64", + ] + } + + source_set("base64_ssse3") { + configs += [ ":base64_internal_config" ] + sources = [ "base64/lib/arch/ssse3/codec.c" ] + if (target_cpu == "x86" || target_cpu == "x64") { + if (is_clang || !is_win) { + cflags_c = [ "-mssse3" ] + } + } + } + + source_set("base64_sse41") { + configs += [ ":base64_internal_config" ] + sources = [ "base64/lib/arch/sse41/codec.c" ] + if (target_cpu == "x86" || target_cpu == "x64") { + if (is_clang || !is_win) { + cflags_c = [ "-msse4.1" ] + } + } + } + + source_set("base64_sse42") { + configs += [ ":base64_internal_config" ] + sources = [ "base64/lib/arch/sse42/codec.c" ] + if (target_cpu == "x86" || target_cpu == "x64") { + if (is_clang || !is_win) { + cflags_c = [ "-msse4.2" ] + } + } + } + + source_set("base64_avx") { + configs += [ ":base64_internal_config" ] + sources = [ "base64/lib/arch/avx/codec.c" ] + if (target_cpu == "x86" || target_cpu == "x64") { + if (is_clang || !is_win) { + cflags_c = [ "-mavx" ] + } else if (is_win) { + cflags_c = [ "/arch:AVX" ] + } + } + } + + source_set("base64_avx2") { + configs += [ ":base64_internal_config" ] + sources = [ "base64/lib/arch/avx2/codec.c" ] + if (target_cpu == "x86" || target_cpu == "x64") { + if (is_clang || !is_win) { + cflags_c = [ "-mavx2" ] + } else if (is_win) { + cflags_c = [ "/arch:AVX2" ] + } + } + } + + source_set("base64_avx512") { + configs += [ ":base64_internal_config" ] + sources = [ "base64/lib/arch/avx512/codec.c" ] + if (target_cpu == "x86" || target_cpu == "x64") { + if (is_clang || !is_win) { + cflags_c = [ + "-mavx512vl", + "-mavx512vbmi", + ] + } else if (is_win) { + cflags_c = [ "/arch:AVX512" ] + } + } + } + + source_set("base64_neon32") { + configs += [ ":base64_internal_config" ] + sources = [ "base64/lib/arch/neon32/codec.c" ] + if (target_cpu == "arm") { + if (is_clang || !is_win) { + cflags_c = [ "-mfpu=neon" ] + } + } + } + + source_set("base64_neon64") { + configs += [ ":base64_internal_config" ] + sources = [ "base64/lib/arch/neon64/codec.c" ] + # NEON is required in arm64, so no -mfpu flag is needed + } +} diff --git a/deps/brotli/BUILD.gn b/deps/brotli/BUILD.gn new file mode 100644 index 00000000000000..8bdf8ce74d9789 --- /dev/null +++ b/deps/brotli/BUILD.gn @@ -0,0 +1,14 @@ +############################################################################## +# # +# DO NOT EDIT THIS FILE! # +# # +############################################################################## + +# This file is used by GN for building, which is NOT the build system used for +# building official binaries. +# Please modify the gyp files if you are making changes to build system. + +import("unofficial.gni") + +brotli_gn_build("brotli") { +} diff --git a/deps/brotli/brotli.gyp b/deps/brotli/brotli.gyp index 9fc9bcdfd54ece..f82660d82c6cfa 100644 --- a/deps/brotli/brotli.gyp +++ b/deps/brotli/brotli.gyp @@ -6,6 +6,7 @@ 'c/common/context.c', 'c/common/dictionary.c', 'c/common/platform.c', + 'c/common/shared_dictionary.c', 'c/common/transform.c', # Decoder @@ -22,6 +23,7 @@ 'c/enc/brotli_bit_stream.c', 'c/enc/cluster.c', 'c/enc/command.c', + 'c/enc/compound_dictionary.c', 'c/enc/compress_fragment.c', 'c/enc/compress_fragment_two_pass.c', 'c/enc/dictionary_hash.c', diff --git a/deps/brotli/c/common/constants.c b/deps/brotli/c/common/constants.c index 6bad9f613ca5d4..89866b150503c6 100644 --- a/deps/brotli/c/common/constants.c +++ b/deps/brotli/c/common/constants.c @@ -4,7 +4,7 @@ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ -#include "./constants.h" +#include "constants.h" const BrotliPrefixCodeRange _kBrotliPrefixCodeRanges[BROTLI_NUM_BLOCK_LEN_SYMBOLS] = { diff --git a/deps/brotli/c/common/constants.h b/deps/brotli/c/common/constants.h index e848195a0dc20f..31e5bd376e90fc 100644 --- a/deps/brotli/c/common/constants.h +++ b/deps/brotli/c/common/constants.h @@ -12,10 +12,11 @@ #ifndef BROTLI_COMMON_CONSTANTS_H_ #define BROTLI_COMMON_CONSTANTS_H_ -#include "./platform.h" #include #include +#include "platform.h" + /* Specification: 7.3. Encoding of the context map */ #define BROTLI_CONTEXT_MAP_MAX_RLE 16 diff --git a/deps/brotli/c/common/context.c b/deps/brotli/c/common/context.c index 2c2dceba9b6229..7f9c95869917b3 100644 --- a/deps/brotli/c/common/context.c +++ b/deps/brotli/c/common/context.c @@ -1,4 +1,4 @@ -#include "./context.h" +#include "context.h" #include diff --git a/deps/brotli/c/common/dictionary.bin b/deps/brotli/c/common/dictionary.bin deleted file mode 100644 index a585c0e292eba1..00000000000000 --- a/deps/brotli/c/common/dictionary.bin +++ /dev/null @@ -1,432 +0,0 @@ -timedownlifeleftbackcodedatashowonlysitecityopenjustlikefreeworktextyearoverbodyloveformbookplaylivelinehelphomesidemorewordlongthemviewfindpagedaysfullheadtermeachareafromtruemarkableuponhighdatelandnewsevennextcasebothpostusedmadehandherewhatnameLinkblogsizebaseheldmakemainuser') +holdendswithNewsreadweresigntakehavegameseencallpathwellplusmenufilmpartjointhislistgoodneedwayswestjobsmindalsologorichuseslastteamarmyfoodkingwilleastwardbestfirePageknowaway.pngmovethanloadgiveselfnotemuchfeedmanyrockicononcelookhidediedHomerulehostajaxinfoclublawslesshalfsomesuchzone100%onescareTimeracebluefourweekfacehopegavehardlostwhenparkkeptpassshiproomHTMLplanTypedonesavekeepflaglinksoldfivetookratetownjumpthusdarkcardfilefearstaykillthatfallautoever.comtalkshopvotedeepmoderestturnbornbandfellroseurl(skinrolecomeactsagesmeetgold.jpgitemvaryfeltthensenddropViewcopy1.0"stopelseliestourpack.gifpastcss?graymean>rideshotlatesaidroadvar feeljohnrickportfast'UA-deadpoorbilltypeU.S.woodmust2px;Inforankwidewantwalllead[0];paulwavesure$('#waitmassarmsgoesgainlangpaid!-- lockunitrootwalkfirmwifexml"songtest20pxkindrowstoolfontmailsafestarmapscorerainflowbabyspansays4px;6px;artsfootrealwikiheatsteptriporg/lakeweaktoldFormcastfansbankveryrunsjulytask1px;goalgrewslowedgeid="sets5px;.js?40pxif (soonseatnonetubezerosentreedfactintogiftharm18pxcamehillboldzoomvoideasyringfillpeakinitcost3px;jacktagsbitsrolleditknewnearironfreddiskwentsoilputs/js/holyT22:ISBNT20:adamsees

json', 'contT21: RSSloopasiamoon

soulLINEfortcartT14:

80px!--<9px;T04:mike:46ZniceinchYorkricezh:'));puremageparatonebond:37Z_of_']);000,zh:tankyardbowlbush:56ZJava30px -|} -%C3%:34ZjeffEXPIcashvisagolfsnowzh:quer.csssickmeatmin.binddellhirepicsrent:36ZHTTP-201fotowolfEND xbox:54ZBODYdick; -} -exit:35Zvarsbeat'});diet999;anne}}sonyguysfuckpipe|- -!002)ndow[1];[]; -Log salt - bangtrimbath){ -00px -});ko:feesad> s:// [];tollplug(){ -{ - .js'200pdualboat.JPG); -}quot); - -'); - -} 201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037201320122011201020092008200720062005200420032002200120001999199819971996199519941993199219911990198919881987198619851984198319821981198019791978197719761975197419731972197119701969196819671966196519641963196219611960195919581957195619551954195319521951195010001024139400009999comomásesteestaperotodohacecadaañobiendíaasívidacasootroforosolootracualdijosidograntipotemadebealgoquéestonadatrespococasabajotodasinoaguapuesunosantediceluisellamayozonaamorpisoobraclicellodioshoracasiзанаомрарутанепоотизнодотожеонихНаеебымыВысовывоНообПолиниРФНеМытыОнимдаЗаДаНуОбтеИзейнуммТыужفيأنمامعكلأورديافىهولملكاولهبسالإنهيأيقدهلثمبهلوليبلايبكشيامأمنتبيلنحبهممشوشfirstvideolightworldmediawhitecloseblackrightsmallbooksplacemusicfieldorderpointvalueleveltableboardhousegroupworksyearsstatetodaywaterstartstyledeathpowerphonenighterrorinputabouttermstitletoolseventlocaltimeslargewordsgamesshortspacefocusclearmodelblockguideradiosharewomenagainmoneyimagenamesyounglineslatercolorgreenfront&watchforcepricerulesbeginaftervisitissueareasbelowindextotalhourslabelprintpressbuiltlinksspeedstudytradefoundsenseundershownformsrangeaddedstillmovedtakenaboveflashfixedoftenotherviewschecklegalriveritemsquickshapehumanexistgoingmoviethirdbasicpeacestagewidthloginideaswrotepagesusersdrivestorebreaksouthvoicesitesmonthwherebuildwhichearthforumthreesportpartyClicklowerlivesclasslayerentrystoryusagesoundcourtyour birthpopuptypesapplyImagebeinguppernoteseveryshowsmeansextramatchtrackknownearlybegansuperpapernorthlearngivennamedendedTermspartsGroupbrandusingwomanfalsereadyaudiotakeswhile.com/livedcasesdailychildgreatjudgethoseunitsneverbroadcoastcoverapplefilescyclesceneplansclickwritequeenpieceemailframeolderphotolimitcachecivilscaleenterthemetheretouchboundroyalaskedwholesincestock namefaithheartemptyofferscopeownedmightalbumthinkbloodarraymajortrustcanonunioncountvalidstoneStyleLoginhappyoccurleft:freshquitefilmsgradeneedsurbanfightbasishoverauto;route.htmlmixedfinalYour slidetopicbrownalonedrawnsplitreachRightdatesmarchquotegoodsLinksdoubtasyncthumballowchiefyouthnovel10px;serveuntilhandsCheckSpacequeryjamesequaltwice0,000Startpanelsongsroundeightshiftworthpostsleadsweeksavoidthesemilesplanesmartalphaplantmarksratesplaysclaimsalestextsstarswrong

thing.org/multiheardPowerstandtokensolid(thisbringshipsstafftriedcallsfullyfactsagentThis //-->adminegyptEvent15px;Emailtrue"crossspentblogsbox">notedleavechinasizesguestrobotheavytrue,sevengrandcrimesignsawaredancephase> - - -name=diegopage swiss--> - -#fff;">Log.com"treatsheet) && 14px;sleepntentfiledja:id="cName"worseshots-box-delta -<bears:48Z spendbakershops= "";php">ction13px;brianhellosize=o=%2F joinmaybe, fjsimg" ")[0]MTopBType"newlyDanskczechtrailknowsfaq">zh-cn10); --1");type=bluestrulydavis.js';> - -form jesus100% menu. - -walesrisksumentddingb-likteachgif" vegasdanskeestishqipsuomisobredesdeentretodospuedeañosestátienehastaotrospartedondenuevohacerformamismomejormundoaquídíassóloayudafechatodastantomenosdatosotrassitiomuchoahoralugarmayorestoshorastenerantesfotosestaspaísnuevasaludforosmedioquienmesespoderchileserávecesdecirjoséestarventagrupohechoellostengoamigocosasnivelgentemismaairesjuliotemashaciafavorjuniolibrepuntobuenoautorabrilbuenatextomarzosaberlistaluegocómoenerojuegoperúhaberestoynuncamujervalorfueralibrogustaigualvotoscasosguíapuedosomosavisousteddebennochebuscafaltaeurosseriedichocursoclavecasasleónplazolargoobrasvistaapoyojuntotratavistocrearcampohemoscincocargopisosordenhacenáreadiscopedrocercapuedapapelmenorútilclarojorgecalleponertardenadiemarcasigueellassiglocochemotosmadreclaserestoniñoquedapasarbancohijosviajepabloéstevienereinodejarfondocanalnorteletracausatomarmanoslunesautosvillavendopesartipostengamarcollevapadreunidovamoszonasambosbandamariaabusomuchasubirriojavivirgradochicaallíjovendichaestantalessalirsuelopesosfinesllamabuscoéstalleganegroplazahumorpagarjuntadobleislasbolsabañohablaluchaÁreadicenjugarnotasvalleallácargadolorabajoestégustomentemariofirmacostofichaplatahogarartesleyesaquelmuseobasespocosmitadcielochicomiedoganarsantoetapadebesplayaredessietecortecoreadudasdeseoviejodeseaaguas"domaincommonstatuseventsmastersystemactionbannerremovescrollupdateglobalmediumfilternumberchangeresultpublicscreenchoosenormaltravelissuessourcetargetspringmodulemobileswitchphotosborderregionitselfsocialactivecolumnrecordfollowtitle>eitherlengthfamilyfriendlayoutauthorcreatereviewsummerserverplayedplayerexpandpolicyformatdoublepointsseriespersonlivingdesignmonthsforcesuniqueweightpeopleenergynaturesearchfigurehavingcustomoffsetletterwindowsubmitrendergroupsuploadhealthmethodvideosschoolfutureshadowdebatevaluesObjectothersrightsleaguechromesimplenoticesharedendingseasonreportonlinesquarebuttonimagesenablemovinglatestwinterFranceperiodstrongrepeatLondondetailformeddemandsecurepassedtoggleplacesdevicestaticcitiesstreamyellowattackstreetflighthiddeninfo">openedusefulvalleycausesleadersecretseconddamagesportsexceptratingsignedthingseffectfieldsstatesofficevisualeditorvolumeReportmuseummoviesparentaccessmostlymother" id="marketgroundchancesurveybeforesymbolmomentspeechmotioninsidematterCenterobjectexistsmiddleEuropegrowthlegacymannerenoughcareeransweroriginportalclientselectrandomclosedtopicscomingfatheroptionsimplyraisedescapechosenchurchdefinereasoncorneroutputmemoryiframepolicemodelsNumberduringoffersstyleskilledlistedcalledsilvermargindeletebetterbrowselimitsGlobalsinglewidgetcenterbudgetnowrapcreditclaimsenginesafetychoicespirit-stylespreadmakingneededrussiapleaseextentScriptbrokenallowschargedividefactormember-basedtheoryconfigaroundworkedhelpedChurchimpactshouldalwayslogo" bottomlist">){var prefixorangeHeader.push(couplegardenbridgelaunchReviewtakingvisionlittledatingButtonbeautythemesforgotSearchanchoralmostloadedChangereturnstringreloadMobileincomesupplySourceordersviewed courseAbout islandPhilipawardshandleimportOfficeregardskillsnationSportsdegreeweekly (e.g.behinddoctorloggedunitedbeyond-scaleacceptservedmarineFootercamera -_form"leavesstress" /> -.gif" onloadloaderOxfordsistersurvivlistenfemaleDesignsize="appealtext">levelsthankshigherforcedanimalanyoneAfricaagreedrecentPeople
wonderpricesturned|| {};main">inlinesundaywrap">failedcensusminutebeaconquotes150px|estateremoteemail"linkedright;signalformal1.htmlsignupprincefloat:.png" forum.AccesspaperssoundsextendHeightsliderUTF-8"& Before. WithstudioownersmanageprofitjQueryannualparamsboughtfamousgooglelongeri++) {israelsayingdecidehome">headerensurebranchpiecesblock;statedtop">boston.test(avatartested_countforumsschemaindex,filledsharesreaderalert(appearSubmitline">body"> -* TheThoughseeingjerseyNews -System DavidcancertablesprovedApril reallydriveritem">more">boardscolorscampusfirst || [];media.guitarfinishwidth:showedOther .php" assumelayerswilsonstoresreliefswedenCustomeasily your String - -Whiltaylorclear:resortfrenchthough") + "buyingbrandsMembername">oppingsector5px;">vspacepostermajor coffeemartinmaturehappenkansaslink">Images=falsewhile hspace0& - -In powerPolski-colorjordanBottomStart -count2.htmlnews">01.jpgOnline-rightmillerseniorISBN 00,000 guidesvalue)ectionrepair.xml" rights.html-blockregExp:hoverwithinvirginphones
combination of marginwidth="createElement(w.attachEvent(src="https://aIn particular, align="left" Czech RepublicUnited Kingdomcorrespondenceconcluded that.html" title="(function () {comes from theapplication offounder of theattempting to carbon dioxide - -
-opportunity tocommunications -
- -Department of ecclesiasticalthere has beenresulting fromhas never beenthe first timein response toautomatically - -
collection of descended fromsection of theaccept-charsetto be confusedmember of the padding-right:translation ofinterpretation href='http://whether or notThere are alsothere are manya small numberother parts ofimpossible to class="buttonlocated in the. However, theand eventuallyAt the end of because of itsrepresents themany countriesfor many yearsearliest knownbecause it waspt"> valign="top" inhabitants offollowing year -
- - -style="margin-instead of theintroduced thethe process ofincreasing thedifferences inestimated thatespecially the/div>
class="footerand especiallytype="button" which included> -media="screen"
/page> - -
the United States - - - " action="http:// -
- -beginning of the revealed that thetelevision series" rel="nofollow"> target="_blank">claiming that thehttp%3A%2F%2Fwww.manifestations ofPrime Minister ofinfluenced by theclass="clearfix">/div> - - -three-dimensionalChurch of Englandof North Carolinasquare kilometres.addEventListenerdistinct from thecommonly known asPhonetic Alphabetdeclared that thecontrolled by theBenjamin Franklinrole-playing gamethe University ofin Western Europepersonal computerProject Gutenbergregardless of thehas been proposedtogether with the>
  • of the populationofficial language -the InternationalAccording to the pe="text/css" /> -coincide with thetwo-thirds of theDuring this time,during the periodannounced that hethe internationaland more recentlybelieved that theconsciousness andformerly known assurrounded by thefirst appeared inoccasionally usedposition:absolute;" target="_blank" position:relative;text-align:center;jax/libs/jquery/1.background-color:#type="application/anguage" content=" - -
    -distinction between/" target="_blank"> -w.addEventListener?action="http://www.icon" href="http:// style="background:type="text/css" /> -meta property="og:t - - - - - -
    -
    type="text/css" /> -interchangeably withmore closely relatedsocial and politicalthat would otherwiseperpendicular to thestyle type="text/csstype="submit" name="families residing indeveloping countriescomputer programmingeconomic developmentdetermination of thefor more informationon several occasionsportuguês (Europeu)УкраїнськаукраїнськаРоссийскойматериаловинформацииуправлениянеобходимоинформацияИнформацияРеспубликиколичествоинформациютерриториидостаточноالمتواجدونالاشتراكاتالاقتراحاتhtml; charset=UTF-8" setTimeout(function()display:inline-block; diff --git a/deps/npm/node_modules/node-gyp/README.md b/deps/npm/node_modules/node-gyp/README.md index 99494a38d09b38..f46ee06308db1e 100644 --- a/deps/npm/node_modules/node-gyp/README.md +++ b/deps/npm/node_modules/node-gyp/README.md @@ -1,12 +1,13 @@ # `node-gyp` - Node.js native addon build tool -[![Build Status](https://github.com/nodejs/node-gyp/workflows/Tests/badge.svg?branch=master)](https://github.com/nodejs/node-gyp/actions?query=workflow%3ATests+branch%3Amaster) +[![Build Status](https://github.com/nodejs/node-gyp/workflows/Tests/badge.svg?branch=main)](https://github.com/nodejs/node-gyp/actions?query=workflow%3ATests+branch%3Amain) ![npm](https://img.shields.io/npm/dm/node-gyp) `node-gyp` is a cross-platform command-line tool written in Node.js for compiling native addon modules for Node.js. It contains a vendored copy of the [gyp-next](https://github.com/nodejs/gyp-next) project that was previously used -by the Chromium team, extended to support the development of Node.js native addons. +by the Chromium team and extended to support the development of Node.js native +addons. Note that `node-gyp` is _not_ used to build Node.js itself. @@ -31,27 +32,26 @@ Depending on your operating system, you will need to install: ### On Unix - * Python v3.7, v3.8, v3.9, or v3.10 + * [A supported version of Python](https://devguide.python.org/versions/) * `make` * A proper C/C++ compiler toolchain, like [GCC](https://gcc.gnu.org) ### On macOS -**ATTENTION**: If your Mac has been _upgraded_ to macOS Catalina (10.15) or higher, please read [macOS_Catalina.md](macOS_Catalina.md). - - * Python v3.7, v3.8, v3.9, or v3.10 - * `XCode Command Line Tools` which will install `clang`, `clang++`, and `make`. - * Install the `XCode Command Line Tools` standalone by running `xcode-select --install`. -- OR -- + * [A supported version of Python](https://devguide.python.org/versions/) + * `Xcode Command Line Tools` which will install `clang`, `clang++`, and `make`. + * Install the `Xcode Command Line Tools` standalone by running `xcode-select --install`. -- OR -- * Alternatively, if you already have the [full Xcode installed](https://developer.apple.com/xcode/download/), you can install the Command Line Tools under the menu `Xcode -> Open Developer Tool -> More Developer Tools...`. ### On Windows -Install the current version of Python from the [Microsoft Store package](https://www.microsoft.com/en-us/p/python-310/9pjpw5ldxlz5). +Install the current [version of Python](https://devguide.python.org/versions/) from the +[Microsoft Store](https://apps.microsoft.com/store/search?publisher=Python+Software+Foundation). Install tools and configuration manually: * Install Visual C++ Build Environment: [Visual Studio Build Tools](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=BuildTools) - (using "Visual C++ build tools" workload) or [Visual Studio Community](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community) + (using "Visual C++ build tools" if using a version older than VS2019, otherwise use "Desktop development with C++" workload) or [Visual Studio Community](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community) (using the "Desktop development with C++" workload) If the above steps didn't work for you, please visit [Microsoft's Node.js Guidelines for Windows](https://github.com/Microsoft/nodejs-guidelines/blob/master/windows-environment.md#compiling-native-addon-modules) for additional tips. @@ -62,9 +62,9 @@ Install tools and configuration manually: ### Configuring Python Dependency -`node-gyp` requires that you have installed a compatible version of Python, one of: v3.7, v3.8, -v3.9, or v3.10. If you have multiple Python versions installed, you can identify which Python -version `node-gyp` should use in one of the following ways: +`node-gyp` requires that you have installed a [supported version of Python](https://devguide.python.org/versions/). +If you have multiple versions of Python installed, you can identify which version +`node-gyp` should use in one of the following ways: 1. by setting the `--python` command-line option, e.g.: @@ -73,24 +73,28 @@ node-gyp --python /path/to/executable/python ``` 2. If `node-gyp` is called by way of `npm`, *and* you have multiple versions of -Python installed, then you can set `npm`'s 'python' config key to the appropriate -value: - +Python installed, then you can set the `npm_config_python` environment variable +to the appropriate path: ``` bash -npm config set python /path/to/executable/python +export npm_config_python=/path/to/executable/python +``` +    Or on Windows: +```console +py --list-paths # To see the installed Python versions +set npm_config_python=C:\path\to\python.exe ``` 3. If the `PYTHON` environment variable is set to the path of a Python executable, -then that version will be used, if it is a compatible version. +then that version will be used if it is a supported version. 4. If the `NODE_GYP_FORCE_PYTHON` environment variable is set to the path of a Python executable, it will be used instead of any of the other configured or -builtin Python search paths. If it's not a compatible version, no further +built-in Python search paths. If it's not a compatible version, no further searching will be done. ### Build for Third Party Node.js Runtimes -When building modules for third party Node.js runtimes like Electron, which have +When building modules for third-party Node.js runtimes like Electron, which have different build configurations from the official Node.js distribution, you should use `--dist-url` or `--nodedir` flags to specify the headers of the runtime to build for. @@ -106,7 +110,7 @@ to work around configuration errors. ## How to Use -To compile your native addon, first go to its root directory: +To compile your native addon first go to its root directory: ``` bash cd my_node_addon @@ -168,7 +172,7 @@ The **[docs](./docs/)** directory contains additional documentation on specific Some additional resources for Node.js native addons and writing `gyp` configuration files: * ["Going Native" a nodeschool.io tutorial](http://nodeschool.io/#goingnative) - * ["Hello World" node addon example](https://github.com/nodejs/node/tree/master/test/addons/hello-world) + * ["Hello World" node addon example](https://github.com/nodejs/node/tree/main/test/addons/hello-world) * [gyp user documentation](https://gyp.gsrc.io/docs/UserDocumentation.md) * [gyp input format reference](https://gyp.gsrc.io/docs/InputFormatReference.md) * [*"binding.gyp" files out in the wild* wiki page](./docs/binding.gyp-files-in-the-wild.md) @@ -240,7 +244,7 @@ Or this on Windows: set npm_config_devdir=c:\temp\.gyp ``` -### `npm` configuration +### `npm` configuration for npm versions before v9 Use the form `OPTION_NAME` for any of the command options listed above. diff --git a/deps/npm/node_modules/node-gyp/bin/node-gyp.js b/deps/npm/node_modules/node-gyp/bin/node-gyp.js index 8652ea21eceebb..f8317b47b34147 100755 --- a/deps/npm/node_modules/node-gyp/bin/node-gyp.js +++ b/deps/npm/node_modules/node-gyp/bin/node-gyp.js @@ -6,7 +6,7 @@ process.title = 'node-gyp' const envPaths = require('env-paths') const gyp = require('../') -const log = require('npmlog') +const log = require('../lib/log') const os = require('os') /** @@ -14,11 +14,11 @@ const os = require('os') */ const prog = gyp() -var completed = false +let completed = false prog.parseArgv(process.argv) prog.devDir = prog.opts.devdir -var homeDir = os.homedir() +const homeDir = os.homedir() if (prog.devDir) { prog.devDir = prog.devDir.replace(/^~/, homeDir) } else if (homeDir) { @@ -32,9 +32,9 @@ if (prog.devDir) { if (prog.todo.length === 0) { if (~process.argv.indexOf('-v') || ~process.argv.indexOf('--version')) { - console.log('v%s', prog.version) + log.stdout('v%s', prog.version) } else { - console.log('%s', prog.usage()) + log.stdout('%s', prog.usage()) } process.exit(0) } @@ -48,11 +48,11 @@ log.info('using', 'node@%s | %s | %s', process.versions.node, process.platform, * Change dir if -C/--directory was passed. */ -var dir = prog.opts.directory +const dir = prog.opts.directory if (dir) { - var fs = require('fs') + const fs = require('fs') try { - var stat = fs.statSync(dir) + const stat = fs.statSync(dir) if (stat.isDirectory()) { log.info('chdir', dir) process.chdir(dir) @@ -68,8 +68,8 @@ if (dir) { } } -function run () { - var command = prog.todo.shift() +async function run () { + const command = prog.todo.shift() if (!command) { // done! completed = true @@ -77,30 +77,28 @@ function run () { return } - prog.commands[command.name](command.args, function (err) { - if (err) { - log.error(command.name + ' error') - log.error('stack', err.stack) - errorMessage() - log.error('not ok') - return process.exit(1) - } + try { + const args = await prog.commands[command.name](command.args) ?? [] + if (command.name === 'list') { - var versions = arguments[1] - if (versions.length > 0) { - versions.forEach(function (version) { - console.log(version) - }) + if (args.length) { + args.forEach((version) => log.stdout(version)) } else { - console.log('No node development files installed. Use `node-gyp install` to install a version.') + log.stdout('No node development files installed. Use `node-gyp install` to install a version.') } - } else if (arguments.length >= 2) { - console.log.apply(console, [].slice.call(arguments, 1)) + } else if (args.length >= 1) { + log.stdout(...args.slice(1)) } // now run the next command in the queue - process.nextTick(run) - }) + return run() + } catch (err) { + log.error(command.name + ' error') + log.error('stack', err.stack) + errorMessage() + log.error('not ok') + return process.exit(1) + } } process.on('exit', function (code) { @@ -120,7 +118,7 @@ process.on('uncaughtException', function (err) { function errorMessage () { // copied from npm's lib/utils/error-handler.js - var os = require('os') + const os = require('os') log.error('System', os.type() + ' ' + os.release()) log.error('command', process.argv .map(JSON.stringify).join(' ')) diff --git a/deps/npm/node_modules/node-gyp/docs/Error-pre-versions-of-node-cannot-be-installed.md b/deps/npm/node_modules/node-gyp/docs/Error-pre-versions-of-node-cannot-be-installed.md deleted file mode 100644 index c1e1158d70190b..00000000000000 --- a/deps/npm/node_modules/node-gyp/docs/Error-pre-versions-of-node-cannot-be-installed.md +++ /dev/null @@ -1,94 +0,0 @@ -When using `node-gyp` you might see an error like this when attempting to compile/install a node.js native addon: - -``` -$ npm install bcrypt -npm http GET https://registry.npmjs.org/bcrypt/0.7.5 -npm http 304 https://registry.npmjs.org/bcrypt/0.7.5 -npm http GET https://registry.npmjs.org/bindings/1.0.0 -npm http 304 https://registry.npmjs.org/bindings/1.0.0 - -> bcrypt@0.7.5 install /home/ubuntu/public/song-swap/node_modules/bcrypt -> node-gyp rebuild - -gyp ERR! configure error -gyp ERR! stack Error: "pre" versions of node cannot be installed, use the --nodedir flag instead -gyp ERR! stack at install (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/install.js:69:16) -gyp ERR! stack at Object.self.commands.(anonymous function) [as install] (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/node-gyp.js:56:37) -gyp ERR! stack at getNodeDir (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:219:20) -gyp ERR! stack at /usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:105:9 -gyp ERR! stack at ChildProcess.exithandler (child_process.js:630:7) -gyp ERR! stack at ChildProcess.EventEmitter.emit (events.js:99:17) -gyp ERR! stack at maybeClose (child_process.js:730:16) -gyp ERR! stack at Process.ChildProcess._handle.onexit (child_process.js:797:5) -gyp ERR! System Linux 3.5.0-21-generic -gyp ERR! command "node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild" -gyp ERR! cwd /home/ubuntu/public/song-swap/node_modules/bcrypt -gyp ERR! node -v v0.11.2-pre -gyp ERR! node-gyp -v v0.9.5 -gyp ERR! not ok -npm ERR! bcrypt@0.7.5 install: `node-gyp rebuild` -npm ERR! `sh "-c" "node-gyp rebuild"` failed with 1 -npm ERR! -npm ERR! Failed at the bcrypt@0.7.5 install script. -npm ERR! This is most likely a problem with the bcrypt package, -npm ERR! not with npm itself. -npm ERR! Tell the author that this fails on your system: -npm ERR! node-gyp rebuild -npm ERR! You can get their info via: -npm ERR! npm owner ls bcrypt -npm ERR! There is likely additional logging output above. - -npm ERR! System Linux 3.5.0-21-generic -npm ERR! command "/usr/local/bin/node" "/usr/local/bin/npm" "install" "bcrypt" -npm ERR! cwd /home/ubuntu/public/song-swap -npm ERR! node -v v0.11.2-pre -npm ERR! npm -v 1.2.18 -npm ERR! code ELIFECYCLE -npm ERR! -npm ERR! Additional logging details can be found in: -npm ERR! /home/ubuntu/public/song-swap/npm-debug.log -npm ERR! not ok code 0 -``` - -The main error here is: - -``` -Error: "pre" versions of node cannot be installed, use the --nodedir flag instead -``` - -This error is caused when you attempt to compile a native addon using a version of node.js with `-pre` at the end of the version number: - -``` bash -$ node -v -v0.10.4-pre -``` - -## How to avoid (the short answer) - -To avoid this error completely just use a stable release of node.js. i.e. `v0.10.4`, and __not__ `v0.10.4-pre`. - -## How to fix (the long answer) - -This error happens because `node-gyp` does not know what header files were used to compile your "pre" version of node, and therefore it needs you to specify the node source code directory path using the `--nodedir` flag. - -For example, if I compiled my development ("pre") version of node.js using the source code in `/Users/nrajlich/node`, then I could invoke `node-gyp` like: - -``` bash -$ node-gyp rebuild --nodedir=/Users/nrajlich/node -``` - -Or install an native addon through `npm` like: - -``` bash -$ npm install bcrypt --nodedir=/Users/nrajlich/node -``` - -### Always use `--nodedir` - -__Note:__ This is for advanced users who use `-pre` versions of node more often than tagged releases. - -If you're invoking `node-gyp` through `npm`, then you can leverage `npm`'s configuration system and not have to specify the `--nodedir` flag all the time: - -``` bash -$ npm config set nodedir /Users/nrajlich/node -``` \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/docs/Force-npm-to-use-global-node-gyp.md b/deps/npm/node_modules/node-gyp/docs/Force-npm-to-use-global-node-gyp.md deleted file mode 100644 index c6304e490a75d9..00000000000000 --- a/deps/npm/node_modules/node-gyp/docs/Force-npm-to-use-global-node-gyp.md +++ /dev/null @@ -1,47 +0,0 @@ -# Force npm to use global installed node-gyp - -**Note: These instructions only work with npm 6 or older. For a solution that works with npm 8 (or older), see [Updating-npm-bundled-node-gyp.md](Updating-npm-bundled-node-gyp.md).** - -[Many issues](https://github.com/nodejs/node-gyp/labels/ERR%21%20node-gyp%20-v%20%3C%3D%20v5.1.0) are opened by users who are -not running a [current version of node-gyp](https://github.com/nodejs/node-gyp/releases). - -npm bundles its own, internal, copy of node-gyp located at `npm/node_modules`, within npm's private dependencies which are separate from *globally* accessible packages. Therefore this internal copy of node-gyp is independent from any globally installed copy of node-gyp that -may have been installed via `npm install -g node-gyp`. - -So npm's internal copy of node-gyp **isn't** stored inside *global* `node_modules` and thus isn't available for use as a standalone package. npm uses it's *internal* copy of `node-gyp` to automatically build native addons. - -When you install a _new_ version of node-gyp outside of npm, it'll go into your *global* `node_modules`, but not under the `npm/node_modules` (where internal copy of node-gyp is stored). So it will get into your `$PATH` and you will be able to use this globally installed version (**but not internal node-gyp of npm**) as any other globally installed package. - -The catch is that npm **won't** use global version unless you tell it to, it'll keep on using the **internal one**. You need to instruct it to by setting the `node_gyp` config variable (which goes into your `~/.npmrc`). You do this by running the `npm config set` command as below. Then npm will use the command in the path you supply whenever it needs to build a native addon. - -**Important**: You also need to remember to unset this when you upgrade npm with a newer version of node-gyp, or you have to manually keep your globally installed node-gyp to date. See "Undo" below. - -## Linux and macOS -``` -npm install --global node-gyp@latest -npm config set node_gyp $(npm prefix -g)/lib/node_modules/node-gyp/bin/node-gyp.js -``` - -`sudo` may be required for the first command if you get a permission error. - -## Windows - -### Windows Command Prompt -``` -npm install --global node-gyp@latest -for /f "delims=" %P in ('npm prefix -g') do npm config set node_gyp "%P\node_modules\node-gyp\bin\node-gyp.js" -``` - -### Powershell -``` -npm install --global node-gyp@latest -npm prefix -g | % {npm config set node_gyp "$_\node_modules\node-gyp\bin\node-gyp.js"} -``` - -## Undo -**Beware** if you don't unset the `node_gyp` config option, npm will continue to use the globally installed version of node-gyp rather than the one it ships with, which may end up being newer. - -``` -npm config delete node_gyp -npm uninstall --global node-gyp -``` diff --git a/deps/npm/node_modules/node-gyp/docs/Home.md b/deps/npm/node_modules/node-gyp/docs/Home.md deleted file mode 100644 index fe099868b28225..00000000000000 --- a/deps/npm/node_modules/node-gyp/docs/Home.md +++ /dev/null @@ -1,7 +0,0 @@ -Welcome to the node-gyp wiki! - - * [["binding.gyp" files out in the wild]] - * [[Linking to OpenSSL]] - * [[Common Issues]] - * [[Updating npm's bundled node-gyp]] - * [[Error: "pre" versions of node cannot be installed]] diff --git a/deps/npm/node_modules/node-gyp/docs/Linking-to-OpenSSL.md b/deps/npm/node_modules/node-gyp/docs/Linking-to-OpenSSL.md deleted file mode 100644 index 1c17ab8e313667..00000000000000 --- a/deps/npm/node_modules/node-gyp/docs/Linking-to-OpenSSL.md +++ /dev/null @@ -1,86 +0,0 @@ -A handful of native addons require linking to OpenSSL in one way or another. This introduces a small challenge since node will sometimes bundle OpenSSL statically (the default for node >= v0.8.x), or sometimes dynamically link to the system OpenSSL (default for node <= v0.6.x). - -Good native addons should account for both scenarios. It's recommended that you use the `binding.gyp` file provided below as a starting-point for any addon that needs to use OpenSSL: - -``` python -{ - 'variables': { - # node v0.6.x doesn't give us its build variables, - # but on Unix it was only possible to use the system OpenSSL library, - # so default the variable to "true", v0.8.x node and up will overwrite it. - 'node_shared_openssl%': 'true' - }, - 'targets': [ - { - 'target_name': 'binding', - 'sources': [ - 'src/binding.cc' - ], - 'conditions': [ - ['node_shared_openssl=="false"', { - # so when "node_shared_openssl" is "false", then OpenSSL has been - # bundled into the node executable. So we need to include the same - # header files that were used when building node. - 'include_dirs': [ - '<(node_root_dir)/deps/openssl/openssl/include' - ], - "conditions" : [ - ["target_arch=='ia32'", { - "include_dirs": [ "<(node_root_dir)/deps/openssl/config/piii" ] - }], - ["target_arch=='x64'", { - "include_dirs": [ "<(node_root_dir)/deps/openssl/config/k8" ] - }], - ["target_arch=='arm'", { - "include_dirs": [ "<(node_root_dir)/deps/openssl/config/arm" ] - }] - ] - }] - ] - } - ] -} -``` - -This ensures that when OpenSSL is statically linked into `node` then, the bundled OpenSSL headers are included, but when the system OpenSSL is in use, then only those headers will be used. - -## Windows? - -As you can see this baseline `binding.gyp` file only accounts for the Unix scenario. Currently on Windows the situation is a little less ideal. On Windows, OpenSSL is _always_ statically compiled into the `node` executable, so ideally it would be possible to use that copy of OpenSSL when building native addons. - -Unfortunately it doesn't seem like that is possible at the moment, as there would need to be tweaks made to the generated `node.lib` file to include the openssl glue functions, or a new `openssl.lib` file would need to be created during the node build. I'm not sure which is the easiest/most feasible. - -In the meantime, one possible solution is using another copy of OpenSSL, which is what [`node-bcrypt`](https://github.com/ncb000gt/node.bcrypt.js) currently does. Adding something like this to your `binding.gyp` file's `"conditions"` block would enable this: - -``` python - [ 'OS=="win"', { - 'conditions': [ - # "openssl_root" is the directory on Windows of the OpenSSL files. - # Check the "target_arch" variable to set good default values for - # both 64-bit and 32-bit builds of the module. - ['target_arch=="x64"', { - 'variables': { - 'openssl_root%': 'C:/OpenSSL-Win64' - }, - }, { - 'variables': { - 'openssl_root%': 'C:/OpenSSL-Win32' - }, - }], - ], - 'libraries': [ - '-l<(openssl_root)/lib/libeay32.lib', - ], - 'include_dirs': [ - '<(openssl_root)/include', - ], - }] -``` - -Now you can direct your users to install OpenSSL on Windows from here (be sure to tell them to install the 64-bit version if they're compiling against a 64-bit version of node): http://slproweb.com/products/Win32OpenSSL.html - -Also note that both `node-gyp` and `npm` allow you to overwrite that default `openssl_root` variable on the command line: - -``` bash -$ node-gyp rebuild --openssl-root="C:\Users\Nathan\Desktop\openssl" -``` \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/docs/README.md b/deps/npm/node_modules/node-gyp/docs/README.md deleted file mode 100644 index 487fb0a57edbfa..00000000000000 --- a/deps/npm/node_modules/node-gyp/docs/README.md +++ /dev/null @@ -1,19 +0,0 @@ -## Versions of `node-gyp` that are earlier than v9.x.x - -Please look thru your error log for the string `gyp info using node-gyp@` and if that version number is less than the [current release of node-gyp](https://github.com/nodejs/node-gyp/releases) then __please upgrade__ using [these instructions](https://github.com/nodejs/node-gyp/blob/master/docs/Updating-npm-bundled-node-gyp.md) and then try your command again. - -## `node-sass` is deprecated - -Please be aware that the package [`node-sass` is deprecated](https://github.com/sass/node-sass#node-sass) so you should actively seek alternatives. You can try: -``` -npm uninstall node-sass -npm install sass --save -# or ... -npm install --global node-sass@latest -``` -`node-sass` projects _may_ work by downgrading to Node.js v14 but [that release is end-of-life](https://github.com/nodejs/release#release-schedule). -But in any case, please avoid opening new `node-sass` issues on this repo because we [cannot help much](https://github.com/nodejs/node-gyp/issues?q=is%3Aissue+label%3A%22Node+Sass+--%3E+Dart+Sass%22+). - -## Issues finding the installed Visual Studio - -In cmd, [`npm config set msvs_version 20xx`](https://github.com/nodejs/node-gyp#on-windows) with ___xx___ matching your locally installed version of Visual Studio. diff --git a/deps/npm/node_modules/node-gyp/docs/Updating-npm-bundled-node-gyp.md b/deps/npm/node_modules/node-gyp/docs/Updating-npm-bundled-node-gyp.md deleted file mode 100644 index 5759add3fee572..00000000000000 --- a/deps/npm/node_modules/node-gyp/docs/Updating-npm-bundled-node-gyp.md +++ /dev/null @@ -1,72 +0,0 @@ -# Updating the npm-bundled version of node-gyp - -**Note: These instructions are (only) tested and known to work with npm 8 and older.** - -**Note: These instructions will be undone if you reinstall or upgrade npm or node! For a more permanent (and simpler) solution, see [Force-npm-to-use-global-node-gyp.md](Force-npm-to-use-global-node-gyp.md). (npm 6 or older only!)** - -[Many issues](https://github.com/nodejs/node-gyp/issues?q=label%3A"ERR!+node-gyp+-v+<%3D+v9.x.x") are opened by users who are -not running a [current version of node-gyp](https://github.com/nodejs/node-gyp/releases). - -`npm` bundles its own, internal, copy of `node-gyp`. This internal copy is independent of any globally installed copy of node-gyp that -may have been installed via `npm install -g node-gyp`. - -This means that while `node-gyp` doesn't get installed into your `$PATH` by default, npm still keeps its own copy to invoke when you -attempt to `npm install` a native add-on. - -Sometimes, you may need to update npm's internal node-gyp to a newer version than what is installed. A simple `npm install -g node-gyp` -_won't_ do the trick since npm will still continue to use its internal copy over the global one. - -So instead: - -## Version of npm - -We need to start by knowing your version of `npm`: -```bash -npm --version -``` - -## Linux, macOS, Solaris, etc. - -Unix is easy. Just run the following command. - -If your npm is version ___7 or 8___, do: -```bash -$ npm explore npm/node_modules/@npmcli/run-script -g -- npm_config_global=false npm install node-gyp@latest -``` - -Else if your npm is version ___less than 7___, do: -```bash -$ npm explore npm/node_modules/npm-lifecycle -g -- npm install node-gyp@latest -``` - -If the command fails with a permissions error, please try `sudo` and then the command. - -## Windows - -Windows is a bit trickier, since `npm` might be installed to the "Program Files" directory, which needs admin privileges in order to -modify on current Windows. Therefore, run the following commands __inside a `cmd.exe` started with "Run as Administrator"__: - -First we need to find the location of `node`. If you don't already know the location that `node.exe` got installed to, then run: -```bash -$ where node -``` - -Now `cd` to the directory that `node.exe` is contained in e.g.: -```bash -$ cd "C:\Program Files\nodejs" -``` - -If your npm version is ___7 or 8___, do: -```bash -cd node_modules\npm\node_modules\@npmcli\run-script -``` - -Else if your npm version is ___less than 7___, do: -```bash -cd node_modules\npm\node_modules\npm-lifecycle -``` - -Finish by running: -```bash -$ npm install node-gyp@latest -``` diff --git a/deps/npm/node_modules/node-gyp/docs/binding.gyp-files-in-the-wild.md b/deps/npm/node_modules/node-gyp/docs/binding.gyp-files-in-the-wild.md deleted file mode 100644 index 78afb32544776f..00000000000000 --- a/deps/npm/node_modules/node-gyp/docs/binding.gyp-files-in-the-wild.md +++ /dev/null @@ -1,49 +0,0 @@ -This page contains links to some examples of existing `binding.gyp` files that other node modules are using. Take a look at them for inspiration. - -To add to this page, just add the link to the project's `binding.gyp` file below: - - * [ons](https://github.com/XadillaX/aliyun-ons/blob/master/binding.gyp) - * [thmclrx](https://github.com/XadillaX/thmclrx/blob/master/binding.gyp) - * [libxmljs](https://github.com/polotek/libxmljs/blob/master/binding.gyp) - * [node-buffertools](https://github.com/bnoordhuis/node-buffertools/blob/master/binding.gyp) - * [node-canvas](https://github.com/LearnBoost/node-canvas/blob/master/binding.gyp) - * [node-ffi](https://github.com/rbranson/node-ffi/blob/master/binding.gyp) + [libffi](https://github.com/rbranson/node-ffi/blob/master/deps/libffi/libffi.gyp) - * [node-time](https://github.com/TooTallNate/node-time/blob/master/binding.gyp) - * [node-sass](https://github.com/sass/node-sass/blob/master/binding.gyp) + [libsass](https://github.com/sass/node-sass/blob/master/src/libsass.gyp) - * [node-serialport](https://github.com/voodootikigod/node-serialport/blob/master/binding.gyp) - * [node-weak](https://github.com/TooTallNate/node-weak/blob/master/binding.gyp) - * [pty.js](https://github.com/chjj/pty.js/blob/master/binding.gyp) - * [ref](https://github.com/TooTallNate/ref/blob/master/binding.gyp) - * [appjs](https://github.com/milani/appjs/blob/master/binding.gyp) - * [nwm](https://github.com/mixu/nwm/blob/master/binding.gyp) - * [bcrypt](https://github.com/ncb000gt/node.bcrypt.js/blob/master/binding.gyp) - * [nk-mysql](https://github.com/mmod/nodamysql/blob/master/binding.gyp) - * [nk-xrm-installer](https://github.com/mmod/nk-xrm-installer/blob/master/binding.gyp) + [includable.gypi](https://github.com/mmod/nk-xrm-installer/blob/master/includable.gypi) + [unpack.py](https://github.com/mmod/nk-xrm-installer/blob/master/unpack.py) + [disburse.py](https://github.com/mmod/nk-xrm-installer/blob/master/disburse.py) - .py files above provide complete reference for examples of fetching source via http, extracting, and moving files. - * [node-memwatch](https://github.com/lloyd/node-memwatch/blob/master/binding.gyp) - * [node-ip2location](https://github.com/bolgovr/node-ip2location/blob/master/binding.gyp) - * [node-midi](https://github.com/justinlatimer/node-midi/blob/master/binding.gyp) - * [node-sqlite3](https://github.com/developmentseed/node-sqlite3/blob/master/binding.gyp) + [libsqlite3](https://github.com/developmentseed/node-sqlite3/blob/master/deps/sqlite3.gyp) - * [node-zipfile](https://github.com/mapbox/node-zipfile/blob/master/binding.gyp) - * [node-mapnik](https://github.com/mapnik/node-mapnik/blob/master/binding.gyp) - * [node-inotify](https://github.com/c4milo/node-inotify/blob/master/binding.gyp) - * [v8-profiler](https://github.com/c4milo/v8-profiler/blob/master/binding.gyp) - * [airtunes](https://github.com/radioline/node_airtunes/blob/master/binding.gyp) - * [node-fann](https://github.com/c4milo/node-fann/blob/master/binding.gyp) - * [node-talib](https://github.com/oransel/node-talib/blob/master/binding.gyp) - * [node-leveldown](https://github.com/rvagg/node-leveldown/blob/master/binding.gyp) + [leveldb.gyp](https://github.com/rvagg/node-leveldown/blob/master/deps/leveldb/leveldb.gyp) + [snappy.gyp](https://github.com/rvagg/node-leveldown/blob/master/deps/snappy/snappy.gyp) - * [node-expat](https://github.com/astro/node-expat/blob/master/binding.gyp) + [libexpat](https://github.com/astro/node-expat/blob/master/deps/libexpat/libexpat.gyp) - * [node-openvg-canvas](https://github.com/luismreis/node-openvg-canvas/blob/master/binding.gyp) + [node-openvg](https://github.com/luismreis/node-openvg/blob/master/binding.gyp) - * [node-cryptopp](https://github.com/BatikhSouri/node-cryptopp/blob/master/binding.gyp) - * [topcube](https://github.com/creationix/topcube/blob/master/binding.gyp) - * [node-osmium](https://github.com/osmcode/node-osmium/blob/master/binding.gyp) - * [node-osrm](https://github.com/DennisOSRM/node-osrm) - * [node-oracle](https://github.com/joeferner/node-oracle/blob/master/binding.gyp) - * [node-process-list](https://github.com/ReklatsMasters/node-process-list/blob/master/binding.gyp) - * [node-nanomsg](https://github.com/nickdesaulniers/node-nanomsg/blob/master/binding.gyp) - * [Ghostscript4JS](https://github.com/NickNaso/ghostscript4js/blob/master/binding.gyp) - * [nodecv](https://github.com/xudafeng/nodecv/blob/master/binding.gyp) - * [magick-cli](https://github.com/NickNaso/magick-cli/blob/master/binding.gyp) - * [sharp](https://github.com/lovell/sharp/blob/master/binding.gyp) - * [krb5](https://github.com/adaltas/node-krb5/blob/master/binding.gyp) - * [node-heapdump](https://github.com/bnoordhuis/node-heapdump/blob/master/binding.gyp) diff --git a/deps/npm/node_modules/node-gyp/gyp/.flake8 b/deps/npm/node_modules/node-gyp/gyp/.flake8 deleted file mode 100644 index ea0c7680ef87b2..00000000000000 --- a/deps/npm/node_modules/node-gyp/gyp/.flake8 +++ /dev/null @@ -1,4 +0,0 @@ -[flake8] -max-complexity = 101 -max-line-length = 88 -extend-ignore = E203 # whitespace before ':' to agree with psf/black diff --git a/deps/npm/node_modules/node-gyp/gyp/.github/workflows/Python_tests.yml b/deps/npm/node_modules/node-gyp/gyp/.github/workflows/Python_tests.yml deleted file mode 100644 index aad135027ce8fc..00000000000000 --- a/deps/npm/node_modules/node-gyp/gyp/.github/workflows/Python_tests.yml +++ /dev/null @@ -1,36 +0,0 @@ -# TODO: Enable os: windows-latest -# TODO: Enable pytest --doctest-modules - -name: Python_tests -on: - push: - branches: [ main ] - pull_request: - branches: [ main ] - workflow_dispatch: -jobs: - Python_tests: - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - max-parallel: 8 - matrix: - os: [macos-latest, ubuntu-latest] # , windows-latest] - python-version: ["3.7", "3.8", "3.9", "3.10", "3.11-dev"] - steps: - - uses: actions/checkout@v3 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python-version }} - - name: Install dependencies - run: | - python -m pip install --upgrade pip setuptools - pip install --editable ".[dev]" - - run: ./gyp -V && ./gyp --version && gyp -V && gyp --version - - name: Lint with flake8 - run: flake8 . --ignore=E203,W503 --max-complexity=101 --max-line-length=88 --show-source --statistics - - name: Test with pytest - run: pytest - # - name: Run doctests with pytest - # run: pytest --doctest-modules diff --git a/deps/npm/node_modules/node-gyp/gyp/.github/workflows/node-gyp.yml b/deps/npm/node_modules/node-gyp/gyp/.github/workflows/node-gyp.yml deleted file mode 100644 index 7cc1f9e0754365..00000000000000 --- a/deps/npm/node_modules/node-gyp/gyp/.github/workflows/node-gyp.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: node-gyp integration -on: - push: - branches: [ main ] - pull_request: - branches: [ main ] - workflow_dispatch: -jobs: - integration: - strategy: - fail-fast: false - matrix: - os: [macos-latest, ubuntu-latest, windows-latest] - python: ["3.7", "3.10"] - - runs-on: ${{ matrix.os }} - steps: - - name: Clone gyp-next - uses: actions/checkout@v3 - with: - path: gyp-next - - name: Clone nodejs/node-gyp - uses: actions/checkout@v3 - with: - repository: nodejs/node-gyp - path: node-gyp - - uses: actions/setup-node@v3 - with: - node-version: 14.x - - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python }} - - name: Install dependencies - run: | - cd node-gyp - npm install --no-progress - - name: Replace gyp in node-gyp - shell: bash - run: | - rm -rf node-gyp/gyp - cp -r gyp-next node-gyp/gyp - - name: Run tests - run: | - cd node-gyp - npm test diff --git a/deps/npm/node_modules/node-gyp/gyp/.github/workflows/nodejs-windows.yml b/deps/npm/node_modules/node-gyp/gyp/.github/workflows/nodejs-windows.yml deleted file mode 100644 index 4e6c9548ff5c59..00000000000000 --- a/deps/npm/node_modules/node-gyp/gyp/.github/workflows/nodejs-windows.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Node.js Windows integration - -on: - push: - branches: [ main ] - pull_request: - branches: [ main ] - workflow_dispatch: - -jobs: - build-windows: - runs-on: windows-2019 - steps: - - name: Clone gyp-next - uses: actions/checkout@v3 - with: - path: gyp-next - - name: Clone nodejs/node - uses: actions/checkout@v3 - with: - repository: nodejs/node - path: node - - name: Install deps - run: choco install nasm - - name: Replace gyp in Node.js - run: | - rm -Recurse node/tools/gyp - cp -Recurse gyp-next node/tools/gyp - - name: Build Node.js - run: | - cd node - ./vcbuild.bat diff --git a/deps/npm/node_modules/node-gyp/gyp/.github/workflows/release-please.yml b/deps/npm/node_modules/node-gyp/gyp/.github/workflows/release-please.yml deleted file mode 100644 index 665c4c48fed210..00000000000000 --- a/deps/npm/node_modules/node-gyp/gyp/.github/workflows/release-please.yml +++ /dev/null @@ -1,16 +0,0 @@ -on: - push: - branches: - - main - -name: release-please -jobs: - release-please: - runs-on: ubuntu-latest - steps: - - uses: google-github-actions/release-please-action@v3 - with: - token: ${{ secrets.GITHUB_TOKEN }} - release-type: python - package-name: gyp-next - bump-minor-pre-major: true diff --git a/deps/npm/node_modules/node-gyp/gyp/AUTHORS b/deps/npm/node_modules/node-gyp/gyp/AUTHORS deleted file mode 100644 index f49a357b9ed104..00000000000000 --- a/deps/npm/node_modules/node-gyp/gyp/AUTHORS +++ /dev/null @@ -1,16 +0,0 @@ -# Names should be added to this file like so: -# Name or Organization - -Google Inc. <*@google.com> -Bloomberg Finance L.P. <*@bloomberg.net> -IBM Inc. <*@*.ibm.com> -Yandex LLC <*@yandex-team.ru> - -Steven Knight -Ryan Norton -David J. Sankel -Eric N. Vander Weele -Tom Freudenberg -Julien Brianceau -Refael Ackermann -Ujjwal Sharma diff --git a/deps/npm/node_modules/node-gyp/gyp/CHANGELOG.md b/deps/npm/node_modules/node-gyp/gyp/CHANGELOG.md deleted file mode 100644 index 4b4968f6a4ca8e..00000000000000 --- a/deps/npm/node_modules/node-gyp/gyp/CHANGELOG.md +++ /dev/null @@ -1,233 +0,0 @@ -# Changelog - -## [0.14.0](https://github.com/nodejs/gyp-next/compare/v0.13.0...v0.14.0) (2022-10-08) - - -### Features - -* Add command line argument for `gyp --version` ([#164](https://github.com/nodejs/gyp-next/issues/164)) ([5c9f4d0](https://github.com/nodejs/gyp-next/commit/5c9f4d05678dd855e18ed2327219e5d18e5374db)) -* ninja build for iOS ([#174](https://github.com/nodejs/gyp-next/issues/174)) ([b6f2714](https://github.com/nodejs/gyp-next/commit/b6f271424e0033d7ed54d437706695af2ba7a1bf)) -* **zos:** support IBM Open XL C/C++ & PL/I compilers on z/OS ([#178](https://github.com/nodejs/gyp-next/issues/178)) ([43a7211](https://github.com/nodejs/gyp-next/commit/43a72110ae3fafb13c9625cc7a969624b27cda47)) - - -### Bug Fixes - -* lock windows env ([#163](https://github.com/nodejs/gyp-next/issues/163)) ([44bd0dd](https://github.com/nodejs/gyp-next/commit/44bd0ddc93ea0b5770a44dd326a2e4ae62c21442)) -* move configuration information into pyproject.toml ([#176](https://github.com/nodejs/gyp-next/issues/176)) ([d69d8ec](https://github.com/nodejs/gyp-next/commit/d69d8ece6dbff7af4f2ea073c9fd170baf8cb7f7)) -* node.js debugger adds stderr (but exit code is 0) -> shouldn't throw ([#179](https://github.com/nodejs/gyp-next/issues/179)) ([1a457d9](https://github.com/nodejs/gyp-next/commit/1a457d9ed08cfd30c9fa551bc5cf0d90fb583787)) - -## [0.13.0](https://www.github.com/nodejs/gyp-next/compare/v0.12.1...v0.13.0) (2022-05-11) - - -### Features - -* add PRODUCT_DIR_ABS variable ([#151](https://www.github.com/nodejs/gyp-next/issues/151)) ([80d2626](https://www.github.com/nodejs/gyp-next/commit/80d26263581db829b61b312a7bdb5cc791df7824)) - - -### Bug Fixes - -* execvp: printf: Argument list too long ([#147](https://www.github.com/nodejs/gyp-next/issues/147)) ([c4e14f3](https://www.github.com/nodejs/gyp-next/commit/c4e14f301673fadbac3ab7882d0b5f4d02530cb9)) - -### [0.12.1](https://www.github.com/nodejs/gyp-next/compare/v0.12.0...v0.12.1) (2022-04-06) - - -### Bug Fixes - -* **msvs:** avoid fixing path for arguments with "=" ([#143](https://www.github.com/nodejs/gyp-next/issues/143)) ([7e8f16e](https://www.github.com/nodejs/gyp-next/commit/7e8f16eb165e042e64bec98fa6c2a0232a42c26b)) - -## [0.12.0](https://www.github.com/nodejs/gyp-next/compare/v0.11.0...v0.12.0) (2022-04-04) - - -### Features - -* support building shared libraries on z/OS ([#137](https://www.github.com/nodejs/gyp-next/issues/137)) ([293bcfa](https://www.github.com/nodejs/gyp-next/commit/293bcfa4c25c6adb743377adafc45a80fee492c6)) - -## [0.11.0](https://www.github.com/nodejs/gyp-next/compare/v0.10.1...v0.11.0) (2022-03-04) - - -### Features - -* Add proper support for IBM i ([#140](https://www.github.com/nodejs/gyp-next/issues/140)) ([fdda4a3](https://www.github.com/nodejs/gyp-next/commit/fdda4a3038b8a7042ad960ce7a223687c24a21b1)) - -### [0.10.1](https://www.github.com/nodejs/gyp-next/compare/v0.10.0...v0.10.1) (2021-11-24) - - -### Bug Fixes - -* **make:** only generate makefile for multiple toolsets if requested ([#133](https://www.github.com/nodejs/gyp-next/issues/133)) ([f463a77](https://www.github.com/nodejs/gyp-next/commit/f463a77705973289ea38fec1b244c922ac438e26)) - -## [0.10.0](https://www.github.com/nodejs/gyp-next/compare/v0.9.6...v0.10.0) (2021-08-26) - - -### Features - -* **msvs:** add support for Visual Studio 2022 ([#124](https://www.github.com/nodejs/gyp-next/issues/124)) ([4bd9215](https://www.github.com/nodejs/gyp-next/commit/4bd9215c44d300f06e916aec1d6327c22b78272d)) - -### [0.9.6](https://www.github.com/nodejs/gyp-next/compare/v0.9.5...v0.9.6) (2021-08-23) - - -### Bug Fixes - -* align flake8 test ([#122](https://www.github.com/nodejs/gyp-next/issues/122)) ([f1faa8d](https://www.github.com/nodejs/gyp-next/commit/f1faa8d3081e1a47e917ff910892f00dff16cf8a)) -* **msvs:** fix paths again in action command arguments ([#121](https://www.github.com/nodejs/gyp-next/issues/121)) ([7159dfb](https://www.github.com/nodejs/gyp-next/commit/7159dfbc5758c9ec717e215f2c36daf482c846a1)) - -### [0.9.5](https://www.github.com/nodejs/gyp-next/compare/v0.9.4...v0.9.5) (2021-08-18) - - -### Bug Fixes - -* add python 3.6 to node-gyp integration test ([3462d4c](https://www.github.com/nodejs/gyp-next/commit/3462d4ce3c31cce747513dc7ca9760c81d57c60e)) -* revert for windows compatibility ([d078e7d](https://www.github.com/nodejs/gyp-next/commit/d078e7d7ae080ddae243188f6415f940376a7368)) -* support msvs_quote_cmd in ninja generator ([#117](https://www.github.com/nodejs/gyp-next/issues/117)) ([46486ac](https://www.github.com/nodejs/gyp-next/commit/46486ac6e9329529d51061e006a5b39631e46729)) - -### [0.9.4](https://www.github.com/nodejs/gyp-next/compare/v0.9.3...v0.9.4) (2021-08-09) - - -### Bug Fixes - -* .S is an extension for asm file on Windows ([#115](https://www.github.com/nodejs/gyp-next/issues/115)) ([d2fad44](https://www.github.com/nodejs/gyp-next/commit/d2fad44ef3a79ca8900f1307060153ded57053fc)) - -### [0.9.3](https://www.github.com/nodejs/gyp-next/compare/v0.9.2...v0.9.3) (2021-07-07) - - -### Bug Fixes - -* build failure with ninja and Python 3 on Windows ([#113](https://www.github.com/nodejs/gyp-next/issues/113)) ([c172d10](https://www.github.com/nodejs/gyp-next/commit/c172d105deff5db4244e583942215918fa80dd3c)) - -### [0.9.2](https://www.github.com/nodejs/gyp-next/compare/v0.9.1...v0.9.2) (2021-05-21) - - -### Bug Fixes - -* add support of utf8 encoding ([#105](https://www.github.com/nodejs/gyp-next/issues/105)) ([4d0f93c](https://www.github.com/nodejs/gyp-next/commit/4d0f93c249286d1f0c0f665f5fe7346119f98cf1)) - -### [0.9.1](https://www.github.com/nodejs/gyp-next/compare/v0.9.0...v0.9.1) (2021-05-14) - - -### Bug Fixes - -* py lint ([3b6a8ee](https://www.github.com/nodejs/gyp-next/commit/3b6a8ee7a66193a8a6867eba9e1d2b70bdf04402)) - -## [0.9.0](https://www.github.com/nodejs/gyp-next/compare/v0.8.1...v0.9.0) (2021-05-13) - - -### Features - -* use LDFLAGS_host for host toolset ([#98](https://www.github.com/nodejs/gyp-next/issues/98)) ([bea5c7b](https://www.github.com/nodejs/gyp-next/commit/bea5c7bd67d6ad32acbdce79767a5481c70675a2)) - - -### Bug Fixes - -* msvs.py: remove overindentation ([#102](https://www.github.com/nodejs/gyp-next/issues/102)) ([3f83e99](https://www.github.com/nodejs/gyp-next/commit/3f83e99056d004d9579ceb786e06b624ddc36529)) -* update gyp.el to change case to cl-case ([#93](https://www.github.com/nodejs/gyp-next/issues/93)) ([13d5b66](https://www.github.com/nodejs/gyp-next/commit/13d5b66aab35985af9c2fb1174fdc6e1c1407ecc)) - -### [0.8.1](https://www.github.com/nodejs/gyp-next/compare/v0.8.0...v0.8.1) (2021-02-18) - - -### Bug Fixes - -* update shebang lines from python to python3 ([#94](https://www.github.com/nodejs/gyp-next/issues/94)) ([a1b0d41](https://www.github.com/nodejs/gyp-next/commit/a1b0d4171a8049a4ab7a614202063dec332f2df4)) - -## [0.8.0](https://www.github.com/nodejs/gyp-next/compare/v0.7.0...v0.8.0) (2021-01-15) - - -### ⚠ BREAKING CHANGES - -* remove support for Python 2 - -### Bug Fixes - -* revert posix build job ([#86](https://www.github.com/nodejs/gyp-next/issues/86)) ([39dc34f](https://www.github.com/nodejs/gyp-next/commit/39dc34f0799c074624005fb9bbccf6e028607f9d)) - - -### gyp - -* Remove support for Python 2 ([#88](https://www.github.com/nodejs/gyp-next/issues/88)) ([22e4654](https://www.github.com/nodejs/gyp-next/commit/22e465426fd892403c95534229af819a99c3f8dc)) - -## [0.7.0](https://www.github.com/nodejs/gyp-next/compare/v0.6.2...v0.7.0) (2020-12-17) - - -### ⚠ BREAKING CHANGES - -* **msvs:** On Windows, arguments passed to the "action" commands are no longer transformed to replace slashes with backslashes. - -### Features - -* **xcode:** --cross-compiling overrides arch-specific settings ([973bae0](https://www.github.com/nodejs/gyp-next/commit/973bae0b7b08be7b680ecae9565fbd04b3e0787d)) - - -### Bug Fixes - -* **msvs:** do not fix paths in action command arguments ([fc22f83](https://www.github.com/nodejs/gyp-next/commit/fc22f8335e2016da4aae4f4233074bd651d2faea)) -* cmake on python 3 ([fd61f5f](https://www.github.com/nodejs/gyp-next/commit/fd61f5faa5275ec8fc98e3c7868c0dd46f109540)) -* ValueError: invalid mode: 'rU' while trying to load binding.gyp ([d0504e6](https://www.github.com/nodejs/gyp-next/commit/d0504e6700ce48f44957a4d5891b142a60be946f)) -* xcode cmake parsing ([eefe8d1](https://www.github.com/nodejs/gyp-next/commit/eefe8d10e99863bc4ac7e2ed32facd608d400d4b)) - -### [0.6.2](https://www.github.com/nodejs/gyp-next/compare/v0.6.1...v0.6.2) (2020-10-16) - - -### Bug Fixes - -* do not rewrite absolute paths to avoid long paths ([#74](https://www.github.com/nodejs/gyp-next/issues/74)) ([c2ccc1a](https://www.github.com/nodejs/gyp-next/commit/c2ccc1a81f7f94433a94f4d01a2e820db4c4331a)) -* only include MARMASM when toolset is target ([5a2794a](https://www.github.com/nodejs/gyp-next/commit/5a2794aefb58f0c00404ff042b61740bc8b8d5cd)) - -### [0.6.1](https://github.com/nodejs/gyp-next/compare/v0.6.0...v0.6.1) (2020-10-14) - - -### Bug Fixes - -* Correctly rename object files for absolute paths in MSVS generator. - -## [0.6.0](https://github.com/nodejs/gyp-next/compare/v0.5.0...v0.6.0) (2020-10-13) - - -### Features - -* The Makefile generator will now output shared libraries directly to the product directory on all platforms (previously only macOS). - -## [0.5.0](https://github.com/nodejs/gyp-next/compare/v0.4.0...v0.5.0) (2020-09-30) - - -### Features - -* Extended compile_commands_json generator to consider more file extensions than just `c` and `cc`. `cpp` and `cxx` are now supported. -* Source files with duplicate basenames are now supported. - -### Removed - -* The `--no-duplicate-basename-check` option was removed. -* The `msvs_enable_marmasm` configuration option was removed in favor of auto-inclusion of the "marmasm" sections for Windows on ARM. - -## [0.4.0](https://github.com/nodejs/gyp-next/compare/v0.3.0...v0.4.0) (2020-07-14) - - -### Features - -* Added support for passing arbitrary architectures to Xcode builds, enables `arm64` builds. - -### Bug Fixes - -* Fixed a bug on Solaris where copying archives failed. - -## [0.3.0](https://github.com/nodejs/gyp-next/compare/v0.2.1...v0.3.0) (2020-06-06) - - -### Features - -* Added support for MSVC cross-compilation. This allows compilation on x64 for a Windows ARM target. - -### Bug Fixes - -* Fixed XCode CLT version detection on macOS Catalina. - -### [0.2.1](https://github.com/nodejs/gyp-next/compare/v0.2.0...v0.2.1) (2020-05-05) - - -### Bug Fixes - -* Relicensed to Node.js contributors. -* Fixed Windows bug introduced in v0.2.0. - -## [0.2.0](https://github.com/nodejs/gyp-next/releases/tag/v0.2.0) (2020-04-06) - -This is the first release of this project, based on https://chromium.googlesource.com/external/gyp with changes made over the years in Node.js and node-gyp. diff --git a/deps/npm/node_modules/node-gyp/gyp/CODE_OF_CONDUCT.md b/deps/npm/node_modules/node-gyp/gyp/CODE_OF_CONDUCT.md deleted file mode 100644 index d724027fd9aadb..00000000000000 --- a/deps/npm/node_modules/node-gyp/gyp/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,4 +0,0 @@ -# Code of Conduct - -* [Node.js Code of Conduct](https://github.com/nodejs/admin/blob/HEAD/CODE_OF_CONDUCT.md) -* [Node.js Moderation Policy](https://github.com/nodejs/admin/blob/HEAD/Moderation-Policy.md) diff --git a/deps/npm/node_modules/node-gyp/gyp/CONTRIBUTING.md b/deps/npm/node_modules/node-gyp/gyp/CONTRIBUTING.md deleted file mode 100644 index 1a0bcde2b48d8e..00000000000000 --- a/deps/npm/node_modules/node-gyp/gyp/CONTRIBUTING.md +++ /dev/null @@ -1,32 +0,0 @@ -# Contributing to gyp-next - -## Code of Conduct - -This project is bound to the [Node.js Code of Conduct](https://github.com/nodejs/admin/blob/HEAD/CODE_OF_CONDUCT.md). - - -## Developer's Certificate of Origin 1.1 - -By making a contribution to this project, I certify that: - -* (a) The contribution was created in whole or in part by me and I - have the right to submit it under the open source license - indicated in the file; or - -* (b) The contribution is based upon previous work that, to the best - of my knowledge, is covered under an appropriate open source - license and I have the right under that license to submit that - work with modifications, whether created in whole or in part - by me, under the same open source license (unless I am - permitted to submit under a different license), as indicated - in the file; or - -* (c) The contribution was provided directly to me by some other - person who certified (a), (b) or (c) and I have not modified - it. - -* (d) I understand and agree that this project and the contribution - are public and that a record of the contribution (including all - personal information I submit with it, including my sign-off) is - maintained indefinitely and may be redistributed consistent with - this project or the open source license(s) involved. diff --git a/deps/npm/node_modules/node-gyp/gyp/README.md b/deps/npm/node_modules/node-gyp/gyp/README.md index 9ffc2b21e81b8b..be1d7b9ebf6611 100644 --- a/deps/npm/node_modules/node-gyp/gyp/README.md +++ b/deps/npm/node_modules/node-gyp/gyp/README.md @@ -5,3 +5,26 @@ Documents are available at [gyp.gsrc.io](https://gyp.gsrc.io), or you can check __gyp-next__ is [released](https://github.com/nodejs/gyp-next/releases) to the [__Python Packaging Index__](https://pypi.org/project/gyp-next) (PyPI) and can be installed with the command: * `python3 -m pip install gyp-next` + +When used as a command line utility, __gyp-next__ can also be installed with [pipx](https://pypa.github.io/pipx): +* `pipx install gyp-next` +``` +Installing to a new venv 'gyp-next' + installed package gyp-next 0.13.0, installed using Python 3.10.6 + These apps are now globally available + - gyp +done! ✨ 🌟 ✨ +``` + +Or to run __gyp-next__ directly without installing it: +* `pipx run gyp-next --help` +``` +NOTE: running app 'gyp' from 'gyp-next' +usage: usage: gyp [options ...] [build_file ...] + +options: + -h, --help show this help message and exit + --build CONFIGS configuration for build after project generation + --check check format of gyp files + [ ... ] +``` diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py index d6b189760cef99..bc0e93d07f8900 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py @@ -285,19 +285,17 @@ def Write(self, writer=gyp.common.WriteOnDiff): "\tEndProjectSection\r\n" ) - if isinstance(e, MSVSFolder): - if e.items: - f.write("\tProjectSection(SolutionItems) = preProject\r\n") - for i in e.items: - f.write(f"\t\t{i} = {i}\r\n") - f.write("\tEndProjectSection\r\n") - - if isinstance(e, MSVSProject): - if e.dependencies: - f.write("\tProjectSection(ProjectDependencies) = postProject\r\n") - for d in e.dependencies: - f.write(f"\t\t{d.get_guid()} = {d.get_guid()}\r\n") - f.write("\tEndProjectSection\r\n") + if isinstance(e, MSVSFolder) and e.items: + f.write("\tProjectSection(SolutionItems) = preProject\r\n") + for i in e.items: + f.write(f"\t\t{i} = {i}\r\n") + f.write("\tEndProjectSection\r\n") + + if isinstance(e, MSVSProject) and e.dependencies: + f.write("\tProjectSection(ProjectDependencies) = postProject\r\n") + for d in e.dependencies: + f.write(f"\t\t{d.get_guid()} = {d.get_guid()}\r\n") + f.write("\tEndProjectSection\r\n") f.write("EndProject\r\n") @@ -353,7 +351,7 @@ def Write(self, writer=gyp.common.WriteOnDiff): # Folder mappings # Omit this section if there are no folders - if any([e.entries for e in all_entries if isinstance(e, MSVSFolder)]): + if any(e.entries for e in all_entries if isinstance(e, MSVSFolder)): f.write("\tGlobalSection(NestedProjects) = preSolution\r\n") for e in all_entries: if not isinstance(e, MSVSFolder): diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py index f0cfabe8349099..629f3f61b4819d 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py @@ -79,7 +79,7 @@ def __init__(self, project_path, version, name, guid=None, platforms=None): self.files_section = ["Files"] # Keep a dict keyed on filename to speed up access. - self.files_dict = dict() + self.files_dict = {} def AddToolFile(self, path): """Adds a tool file to the project. diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py index e89a971a3bb4fd..93633dbca133c7 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py @@ -141,7 +141,7 @@ class _Boolean(_Type): """Boolean settings, can have the values 'false' or 'true'.""" def _Validate(self, value): - if value != "true" and value != "false": + if value not in {"true", "false"}: raise ValueError("expected bool; got %r" % value) def ValidateMSVS(self, value): diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/__init__.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/__init__.py index 2aa39d0318860f..d6cc01307d997c 100755 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/__init__.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/__init__.py @@ -108,7 +108,9 @@ def Load( if default_variables["GENERATOR"] == "ninja": default_variables.setdefault( "PRODUCT_DIR_ABS", - os.path.join(output_dir, "out", default_variables["build_type"]), + os.path.join( + output_dir, "out", default_variables.get("build_type", "default") + ), ) else: default_variables.setdefault( @@ -622,7 +624,7 @@ def gyp_main(args): if options.generator_flags: gen_flags += options.generator_flags generator_flags = NameValueListToDict(gen_flags) - if DEBUG_GENERAL in gyp.debug.keys(): + if DEBUG_GENERAL in gyp.debug: DebugOutput(DEBUG_GENERAL, "generator_flags: %s", generator_flags) # Generate all requested formats (use a set in case we got one format request diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/common.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/common.py index d77adee8afd55d..b73a0c55b1e349 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/common.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/common.py @@ -144,20 +144,16 @@ def RelativePath(path, relative_to, follow_path_symlink=True): # symlink, this option has no effect. # Convert to normalized (and therefore absolute paths). - if follow_path_symlink: - path = os.path.realpath(path) - else: - path = os.path.abspath(path) + path = os.path.realpath(path) if follow_path_symlink else os.path.abspath(path) relative_to = os.path.realpath(relative_to) # On Windows, we can't create a relative path to a different drive, so just # use the absolute path. - if sys.platform == "win32": - if ( - os.path.splitdrive(path)[0].lower() - != os.path.splitdrive(relative_to)[0].lower() - ): - return path + if sys.platform == "win32" and ( + os.path.splitdrive(path)[0].lower() + != os.path.splitdrive(relative_to)[0].lower() + ): + return path # Split the paths into components. path_split = path.split(os.path.sep) @@ -277,10 +273,7 @@ def EncodePOSIXShellArgument(argument): if not isinstance(argument, str): argument = str(argument) - if _quote.search(argument): - quote = '"' - else: - quote = "" + quote = '"' if _quote.search(argument) else "" encoded = quote + re.sub(_escape, r"\\\1", argument) + quote diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py index bda1a47468ae2b..02567b251446d7 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py @@ -121,7 +121,11 @@ def WriteXmlIfChanged(content, path, encoding="utf-8", pretty=False, if win32 and os.linesep != "\r\n": xml_string = xml_string.replace("\n", "\r\n") - default_encoding = locale.getdefaultlocale()[1] + try: # getdefaultlocale() was removed in Python 3.11 + default_encoding = locale.getdefaultlocale()[1] + except AttributeError: + default_encoding = locale.getencoding() + if default_encoding and default_encoding.upper() != encoding.upper(): xml_string = xml_string.encode(encoding) diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py index 342f693a329d26..2d9b15210dc126 100755 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py @@ -76,6 +76,8 @@ def test_EasyXml_complex(self): '\'Debug|Win32\'" Label="Configuration">' "Application" "Unicode" + "SpectreLoadCF" + "14.36.32532" "" "" ) @@ -99,6 +101,8 @@ def test_EasyXml_complex(self): }, ["ConfigurationType", "Application"], ["CharacterSet", "Unicode"], + ["SpectreMitigation", "SpectreLoadCF"], + ["VCToolsVersion", "14.36.32532"], ], ] ) diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py index f15df00c36373e..1334f2fca9967c 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py @@ -379,7 +379,7 @@ def _GenerateTargets(data, target_list, target_dicts, toplevel_dir, files, build target.is_executable = target_type == "executable" target.is_static_library = target_type == "static_library" target.is_or_has_linked_ancestor = ( - target_type == "executable" or target_type == "shared_library" + target_type in {"executable", "shared_library"} ) build_file = gyp.common.ParseQualifiedTarget(target_name)[0] @@ -433,14 +433,14 @@ def _GetUnqualifiedToTargetMapping(all_targets, to_find): if not to_find: return {}, [] to_find = set(to_find) - for target_name in all_targets.keys(): + for target_name in all_targets: extracted = gyp.common.ParseQualifiedTarget(target_name) if len(extracted) > 1 and extracted[1] in to_find: to_find.remove(extracted[1]) result[extracted[1]] = all_targets[target_name] if not to_find: return result, [] - return result, [x for x in to_find] + return result, list(to_find) def _DoesTargetDependOnMatchingTargets(target): @@ -451,8 +451,8 @@ def _DoesTargetDependOnMatchingTargets(target): if target.match_status == MATCH_STATUS_DOESNT_MATCH: return False if ( - target.match_status == MATCH_STATUS_MATCHES - or target.match_status == MATCH_STATUS_MATCHES_BY_DEPENDENCY + target.match_status in {MATCH_STATUS_MATCHES, + MATCH_STATUS_MATCHES_BY_DEPENDENCY} ): return True for dep in target.deps: @@ -683,11 +683,9 @@ def find_matching_test_target_names(self): ) test_target_names_contains_all = "all" in self._test_target_names if test_target_names_contains_all: - test_targets = [ - x for x in (set(test_targets_no_all) | set(self._root_targets)) - ] + test_targets = list(set(test_targets_no_all) | set(self._root_targets)) else: - test_targets = [x for x in test_targets_no_all] + test_targets = list(test_targets_no_all) print("supplied test_targets") for target_name in self._test_target_names: print("\t", target_name) @@ -702,9 +700,9 @@ def find_matching_test_target_names(self): if matching_test_targets_contains_all: # Remove any of the targets for all that were not explicitly supplied, # 'all' is subsequentely added to the matching names below. - matching_test_targets = [ - x for x in (set(matching_test_targets) & set(test_targets_no_all)) - ] + matching_test_targets = list( + set(matching_test_targets) & set(test_targets_no_all) + ) print("matched test_targets") for target in matching_test_targets: print("\t", target.name) @@ -729,9 +727,7 @@ def find_matching_compile_target_names(self): self._supplied_target_names_no_all(), self._unqualified_mapping ) if "all" in self._supplied_target_names(): - supplied_targets = [ - x for x in (set(supplied_targets) | set(self._root_targets)) - ] + supplied_targets = list(set(supplied_targets) | set(self._root_targets)) print("Supplied test_targets & compile_targets") for target in supplied_targets: print("\t", target.name) diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py index cdf1a4832cf1ad..d3c97c666db077 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py @@ -697,7 +697,7 @@ def ComputeOutputParts(self, spec): target, ) - if self.type != "static_library" and self.type != "shared_library": + if self.type not in {"static_library", "shared_library"}: target_prefix = spec.get("product_prefix", target_prefix) target = spec.get("product_name", target) product_ext = spec.get("product_extension") diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py index c95d18415cdb37..320a891aa8adc9 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py @@ -103,7 +103,7 @@ def NormjoinPathForceCMakeSource(base_path, rel_path): """ if os.path.isabs(rel_path): return rel_path - if any([rel_path.startswith(var) for var in FULL_PATH_VARS]): + if any(rel_path.startswith(var) for var in FULL_PATH_VARS): return rel_path # TODO: do we need to check base_path for absolute variables as well? return os.path.join( @@ -328,7 +328,7 @@ def WriteActions(target_name, actions, extra_sources, extra_deps, path_to_gyp, o def NormjoinRulePathForceCMakeSource(base_path, rel_path, rule_source): if rel_path.startswith(("${RULE_INPUT_PATH}", "${RULE_INPUT_DIRNAME}")): - if any([rule_source.startswith(var) for var in FULL_PATH_VARS]): + if any(rule_source.startswith(var) for var in FULL_PATH_VARS): return rel_path return NormjoinPathForceCMakeSource(base_path, rel_path) @@ -929,10 +929,7 @@ def WriteTarget( product_prefix = spec.get("product_prefix", default_product_prefix) product_name = spec.get("product_name", default_product_name) product_ext = spec.get("product_extension") - if product_ext: - product_ext = "." + product_ext - else: - product_ext = default_product_ext + product_ext = "." + product_ext if product_ext else default_product_ext SetTargetProperty(output, cmake_target_name, "PREFIX", product_prefix) SetTargetProperty( diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py index f330a04dea4c53..0ffa3bb5980fe9 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py @@ -34,7 +34,7 @@ def IsMac(params): - return "mac" == gyp.common.GetFlavor(params) + return gyp.common.GetFlavor(params) == "mac" def CalculateVariables(default_variables, params): @@ -93,7 +93,7 @@ def resolve(filename): gyp.common.EncodePOSIXShellArgument(file), ) ) - commands.append(dict(command=command, directory=output_dir, file=file)) + commands.append({"command": command, "directory": output_dir, "file": file}) def GenerateOutput(target_list, target_dicts, data, params): @@ -108,7 +108,10 @@ def GenerateOutput(target_list, target_dicts, data, params): cwd = os.path.dirname(build_file) AddCommandsForTarget(cwd, target, params, per_config_commands) - output_dir = params["generator_flags"].get("output_dir", "out") + try: + output_dir = params["options"].generator_output + except (AttributeError, KeyError): + output_dir = params["generator_flags"].get("output_dir", "out") for configuration_name, commands in per_config_commands.items(): filename = os.path.join(output_dir, configuration_name, "compile_commands.json") gyp.common.EnsureDirExists(filename) diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py index a851b4db757eda..52aeae6050990b 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py @@ -248,10 +248,7 @@ def GetAllDefines(target_list, target_dicts, data, config_name, params, compiler continue cpp_line_parts = cpp_line.split(" ", 2) key = cpp_line_parts[1] - if len(cpp_line_parts) >= 3: - val = cpp_line_parts[2] - else: - val = "1" + val = cpp_line_parts[2] if len(cpp_line_parts) >= 3 else "1" all_defines[key] = val return all_defines diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py index f1d01a629d435f..1b9974948e4de5 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py @@ -681,10 +681,7 @@ def WriteRootHeaderSuffixRules(writer): def Compilable(filename): """Return true if the file is compilable (should be in OBJS).""" - for res in (filename.endswith(e) for e in COMPILABLE_EXTENSIONS): - if res: - return True - return False + return any(res for res in (filename.endswith(e) for e in COMPILABLE_EXTENSIONS)) def Linkable(filename): @@ -778,7 +775,7 @@ def __init__(self, generator_flags, flavor): self.suffix_rules_objdir2 = {} # Generate suffix rules for all compilable extensions. - for ext in COMPILABLE_EXTENSIONS.keys(): + for ext in COMPILABLE_EXTENSIONS: # Suffix rules for source folder. self.suffix_rules_srcdir.update( { @@ -1066,7 +1063,7 @@ def WriteActions( # libraries, but until everything is made cross-compile safe, also use # target libraries. # TODO(piman): when everything is cross-compile safe, remove lib.target - if self.flavor == "zos" or self.flavor == "aix": + if self.flavor in {"zos", "aix"}: self.WriteLn( "cmd_%s = LIBPATH=$(builddir)/lib.host:" "$(builddir)/lib.target:$$LIBPATH; " @@ -1992,10 +1989,7 @@ def WriteTarget( and self.toolset == "target" ): # On mac, products are created in install_path immediately. - assert install_path == self.output, "{} != {}".format( - install_path, - self.output, - ) + assert install_path == self.output, f"{install_path} != {self.output}" # Point the target alias to the final binary output. self.WriteMakeRule( @@ -2034,7 +2028,7 @@ def WriteTarget( installable_deps.append( self.GetUnversionedSidedeckFromSidedeck(install_path) ) - if self.output != self.alias and self.alias != self.target: + if self.alias not in (self.output, self.target): self.WriteMakeRule( [self.alias], installable_deps, diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py index fd950057847980..13b0794b4dccc3 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py @@ -164,7 +164,7 @@ def _FixPath(path, separator="\\"): fixpath_prefix and path and not os.path.isabs(path) - and not path[0] == "$" + and path[0] != "$" and not _IsWindowsAbsPath(path) ): path = os.path.join(fixpath_prefix, path) @@ -281,9 +281,9 @@ def _ToolSetOrAppend(tools, tool_name, setting, value, only_if_unset=False): else: value = [i.replace("/", "\\") for i in value] if not tools.get(tool_name): - tools[tool_name] = dict() + tools[tool_name] = {} tool = tools[tool_name] - if "CompileAsWinRT" == setting: + if setting == "CompileAsWinRT": return if tool.get(setting): if only_if_unset: @@ -412,10 +412,7 @@ def _BuildCommandLineForRuleRaw( return input_dir_preamble + cmd else: # Convert cat --> type to mimic unix. - if cmd[0] == "cat": - command = ["type"] - else: - command = [cmd[0].replace("/", "\\")] + command = ["type"] if cmd[0] == "cat" else [cmd[0].replace("/", "\\")] # Add call before command to ensure that commands can be tied together one # after the other without aborting in Incredibuild, since IB makes a bat # file out of the raw command string, and some commands (like python) are @@ -438,6 +435,7 @@ def _BuildCommandLineForRuleRaw( # Support a mode for using cmd directly. # Convert any paths to native form (first element is used directly). # TODO(quote): regularize quoting path names throughout the module + command[1] = '"%s"' % command[1] arguments = ['"%s"' % i for i in arguments] # Collapse into a single command. return input_dir_preamble + " ".join(command + arguments) @@ -687,7 +685,7 @@ def _GenerateExternalRules(rules, output_dir, spec, sources, options, actions_to all_outputs.update(OrderedSet(outputs)) # Only use one target from each rule as the dependency for # 'all' so we don't try to build each rule multiple times. - first_outputs.append(list(outputs)[0]) + first_outputs.append(next(iter(outputs))) # Get the unique output directories for this rule. output_dirs = [os.path.split(i)[0] for i in outputs] for od in output_dirs: @@ -756,7 +754,7 @@ def _EscapeEnvironmentVariableExpansion(s): Returns: The escaped string. - """ # noqa: E731,E123,E501 + """ s = s.replace("%", "%%") return s @@ -1189,7 +1187,7 @@ def _AddConfigurationToMSVSProject(p, spec, config_type, config_name, config): precompiled_header = config.get("msvs_precompiled_header") # Prepare the list of tools as a dictionary. - tools = dict() + tools = {} # Add in user specified msvs_settings. msvs_settings = config.get("msvs_settings", {}) MSVSSettings.ValidateMSVSSettings(msvs_settings) @@ -1384,10 +1382,7 @@ def _GetDefines(config): """ defines = [] for d in config.get("defines", []): - if type(d) == list: - fd = "=".join([str(dpart) for dpart in d]) - else: - fd = str(d) + fd = "=".join([str(dpart) for dpart in d]) if isinstance(d, list) else str(d) defines.append(fd) return defines @@ -1578,10 +1573,10 @@ def _AdjustSourcesAndConvertToFilterHierarchy( # such as ../../src/modules/module1 etc. if version.UsesVcxproj(): while ( - all([isinstance(s, MSVSProject.Filter) for s in sources]) + all(isinstance(s, MSVSProject.Filter) for s in sources) and len({s.name for s in sources}) == 1 ): - assert all([len(s.contents) == 1 for s in sources]) + assert all(len(s.contents) == 1 for s in sources) sources = [s.contents[0] for s in sources] else: while len(sources) == 1 and isinstance(sources[0], MSVSProject.Filter): @@ -1598,10 +1593,7 @@ def _IdlFilesHandledNonNatively(spec, sources): if rule["extension"] == "idl" and int(rule.get("msvs_external_rule", 0)): using_idl = True break - if using_idl: - excluded_idl = [i for i in sources if i.endswith(".idl")] - else: - excluded_idl = [] + excluded_idl = [i for i in sources if i.endswith(".idl")] if using_idl else [] return excluded_idl @@ -1819,7 +1811,7 @@ def _GetPathDict(root, path): parent, folder = os.path.split(path) parent_dict = _GetPathDict(root, parent) if folder not in parent_dict: - parent_dict[folder] = dict() + parent_dict[folder] = {} return parent_dict[folder] @@ -3013,18 +3005,26 @@ def _GetMSBuildConfigurationDetails(spec, build_file): msbuild_attributes = _GetMSBuildAttributes(spec, settings, build_file) condition = _GetConfigurationCondition(name, settings, spec) character_set = msbuild_attributes.get("CharacterSet") + vctools_version = msbuild_attributes.get("VCToolsVersion") config_type = msbuild_attributes.get("ConfigurationType") _AddConditionalProperty(properties, condition, "ConfigurationType", config_type) + spectre_mitigation = msbuild_attributes.get('SpectreMitigation') + if spectre_mitigation: + _AddConditionalProperty(properties, condition, "SpectreMitigation", + spectre_mitigation) if config_type == "Driver": _AddConditionalProperty(properties, condition, "DriverType", "WDM") _AddConditionalProperty( properties, condition, "TargetVersion", _ConfigTargetVersion(settings) ) - if character_set: - if "msvs_enable_winrt" not in spec: - _AddConditionalProperty( - properties, condition, "CharacterSet", character_set - ) + if character_set and "msvs_enable_winrt" not in spec: + _AddConditionalProperty( + properties, condition, "CharacterSet", character_set + ) + if vctools_version and "msvs_enable_winrt" not in spec: + _AddConditionalProperty( + properties, condition, "VCToolsVersion", vctools_version + ) return _GetMSBuildPropertyGroup(spec, "Configuration", properties) @@ -3104,6 +3104,10 @@ def _ConvertMSVSBuildAttributes(spec, config, build_file): msbuild_attributes[a] = _ConvertMSVSCharacterSet(msvs_attributes[a]) elif a == "ConfigurationType": msbuild_attributes[a] = _ConvertMSVSConfigurationType(msvs_attributes[a]) + elif a == "SpectreMitigation": + msbuild_attributes[a] = msvs_attributes[a] + elif a == "VCToolsVersion": + msbuild_attributes[a] = msvs_attributes[a] else: print("Warning: Do not know how to convert MSVS attribute " + a) return msbuild_attributes @@ -3326,15 +3330,14 @@ def _GetMSBuildToolSettingsSections(spec, configurations): for tool_name, tool_settings in sorted(msbuild_settings.items()): # Skip the tool named '' which is a holder of global settings handled # by _GetMSBuildConfigurationGlobalProperties. - if tool_name: - if tool_settings: - tool = [tool_name] - for name, value in sorted(tool_settings.items()): - formatted_value = _GetValueFormattedForMSBuild( - tool_name, name, value - ) - tool.append([name, formatted_value]) - group.append(tool) + if tool_name and tool_settings: + tool = [tool_name] + for name, value in sorted(tool_settings.items()): + formatted_value = _GetValueFormattedForMSBuild( + tool_name, name, value + ) + tool.append([name, formatted_value]) + group.append(tool) groups.append(group) return groups @@ -3462,10 +3465,7 @@ def _GetValueFormattedForMSBuild(tool_name, name, value): "Link": ["AdditionalOptions"], "Lib": ["AdditionalOptions"], } - if tool_name in exceptions and name in exceptions[tool_name]: - char = " " - else: - char = ";" + char = " " if name in exceptions.get(tool_name, []) else ";" formatted_value = char.join( [MSVSSettings.ConvertVCMacrosToMSBuild(i) for i in value] ) diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py index ca04ee13a1c1bf..8ba341e96d3f0d 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py @@ -1815,10 +1815,7 @@ def ComputeOutputFileName(self, spec, type=None): "executable": default_variables["EXECUTABLE_SUFFIX"], } extension = spec.get("product_extension") - if extension: - extension = "." + extension - else: - extension = DEFAULT_EXTENSION.get(type, "") + extension = "." + extension if extension else DEFAULT_EXTENSION.get(type, "") if "product_name" in spec: # If we were given an explicit name, use that. @@ -2533,7 +2530,7 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, config_name description="SOLINK $lib", restat=True, command=mtime_preserving_solink_base - % {"suffix": "@$link_file_list"}, # noqa: E501 + % {"suffix": "@$link_file_list"}, rspfile="$link_file_list", rspfile_content=( "-Wl,--whole-archive $in $solibs -Wl," "--no-whole-archive $libs" diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py index 2f4d17e514e439..1ac672c3876bd9 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py @@ -439,7 +439,7 @@ def Finalize2(self, xcode_targets, xcode_target_to_target_dict): # it opens the project file, which will result in unnecessary diffs. # TODO(mark): This is evil because it relies on internal knowledge of # PBXProject._other_pbxprojects. - for other_pbxproject in self.project._other_pbxprojects.keys(): + for other_pbxproject in self.project._other_pbxprojects: self.project.AddOrGetProjectReference(other_pbxproject) self.project.SortRemoteProductReferences() @@ -1118,10 +1118,7 @@ def GenerateOutput(target_list, target_dicts, data, params): for concrete_output_index, concrete_output in enumerate( concrete_outputs ): - if concrete_output_index == 0: - bol = "" - else: - bol = " " + bol = "" if concrete_output_index == 0 else " " makefile.write(f"{bol}{concrete_output} \\\n") concrete_output_dir = posixpath.dirname(concrete_output) diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/input.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/input.py index d9699a0a502183..8f39519dee51fb 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/input.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/input.py @@ -16,9 +16,9 @@ import sys import threading import traceback -from distutils.version import StrictVersion from gyp.common import GypError from gyp.common import OrderedSet +from packaging.version import Version # A list of types that are treated as linkable. linkable_types = [ @@ -225,7 +225,7 @@ def LoadOneBuildFile(build_file_path, data, aux_data, includes, is_target, check return data[build_file_path] if os.path.exists(build_file_path): - build_file_contents = open(build_file_path, encoding='utf-8').read() + build_file_contents = open(build_file_path, encoding="utf-8").read() else: raise GypError(f"{build_file_path} not found (cwd: {os.getcwd()})") @@ -870,10 +870,7 @@ def ExpandVariables(input, phase, variables, build_file): # This works around actions/rules which have more inputs than will # fit on the command line. if file_list: - if type(contents) is list: - contents_list = contents - else: - contents_list = contents.split(" ") + contents_list = contents if type(contents) is list else contents.split(" ") replacement = contents_list[0] if os.path.isabs(replacement): raise GypError('| cannot handle absolute paths, got "%s"' % replacement) @@ -1183,7 +1180,7 @@ def EvalSingleCondition(cond_expr, true_dict, false_dict, phase, variables, buil else: ast_code = compile(cond_expr_expanded, "", "eval") cached_conditions_asts[cond_expr_expanded] = ast_code - env = {"__builtins__": {}, "v": StrictVersion} + env = {"__builtins__": {}, "v": Version} if eval(ast_code, env, variables): return true_dict return false_dict @@ -1579,14 +1576,12 @@ def ExpandWildcardDependencies(targets, data): continue dependency_target_name = dependency_target_dict["target_name"] if ( - dependency_target != "*" - and dependency_target != dependency_target_name + dependency_target not in {"*", dependency_target_name} ): continue dependency_target_toolset = dependency_target_dict["toolset"] if ( - dependency_toolset != "*" - and dependency_toolset != dependency_target_toolset + dependency_toolset not in {"*", dependency_target_toolset} ): continue dependency = gyp.common.QualifiedTarget( @@ -1630,15 +1625,14 @@ def RemoveSelfDependencies(targets): dependencies = target_dict.get(dependency_key, []) if dependencies: for t in dependencies: - if t == target_name: - if ( - targets[t] - .get("variables", {}) - .get("prune_self_dependency", 0) - ): - target_dict[dependency_key] = Filter( - dependencies, target_name - ) + if t == target_name and ( + targets[t] + .get("variables", {}) + .get("prune_self_dependency", 0) + ): + target_dict[dependency_key] = Filter( + dependencies, target_name + ) def RemoveLinkDependenciesFromNoneTargets(targets): @@ -2238,10 +2232,7 @@ def is_in_set_or_list(x, s, items): singleton = False if type(item) in (str, int): # The cheap and easy case. - if is_paths: - to_item = MakePathRelative(to_file, fro_file, item) - else: - to_item = item + to_item = MakePathRelative(to_file, fro_file, item) if is_paths else item if not (type(item) is str and item.startswith("-")): # Any string that doesn't begin with a "-" is a singleton - it can @@ -2467,10 +2458,7 @@ def SetUpConfigurations(target, target_dict): new_configuration_dict = {} for (key, target_val) in target_dict.items(): key_ext = key[-1:] - if key_ext in key_suffixes: - key_base = key[:-1] - else: - key_base = key + key_base = key[:-1] if key_ext in key_suffixes else key if key_base not in non_configuration_keys: new_configuration_dict[key] = gyp.simple_copy.deepcopy(target_val) @@ -2482,7 +2470,7 @@ def SetUpConfigurations(target, target_dict): merged_configurations[configuration] = new_configuration_dict # Put the new configurations back into the target dict as a configuration. - for configuration in merged_configurations.keys(): + for configuration in merged_configurations: target_dict["configurations"][configuration] = merged_configurations[ configuration ] @@ -2499,19 +2487,16 @@ def SetUpConfigurations(target, target_dict): delete_keys = [] for key in target_dict: key_ext = key[-1:] - if key_ext in key_suffixes: - key_base = key[:-1] - else: - key_base = key + key_base = key[:-1] if key_ext in key_suffixes else key if key_base not in non_configuration_keys: delete_keys.append(key) for key in delete_keys: del target_dict[key] # Check the configurations to see if they contain invalid keys. - for configuration in target_dict["configurations"].keys(): + for configuration in target_dict["configurations"]: configuration_dict = target_dict["configurations"][configuration] - for key in configuration_dict.keys(): + for key in configuration_dict: if key in invalid_configuration_keys: raise GypError( "%s not allowed in the %s configuration, found in " @@ -2554,7 +2539,7 @@ def ProcessListFiltersInDict(name, the_dict): del_lists = [] for key, value in the_dict.items(): operation = key[-1] - if operation != "!" and operation != "/": + if operation not in {"!", "/"}: continue if type(value) is not list: diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py index 5b9c2712e091b4..38fa21dd666697 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py @@ -93,7 +93,7 @@ def _AddPrefix(element, prefix): if element is None: return element # Note, not Iterable because we don't want to handle strings like that. - if isinstance(element, list) or isinstance(element, tuple): + if isinstance(element, (list, tuple)): return [prefix + e for e in element] else: return prefix + element @@ -105,7 +105,7 @@ def _DoRemapping(element, map): if map is not None and element is not None: if not callable(map): map = map.get # Assume it's a dict, otherwise a callable to do the remap. - if isinstance(element, list) or isinstance(element, tuple): + if isinstance(element, (list, tuple)): element = filter(None, [map(elem) for elem in element]) else: element = map(element) @@ -117,7 +117,7 @@ def _AppendOrReturn(append, element): then add |element| to it, adding each item in |element| if it's a list or tuple.""" if append is not None and element is not None: - if isinstance(element, list) or isinstance(element, tuple): + if isinstance(element, (list, tuple)): append.extend(element) else: append.append(element) @@ -183,7 +183,7 @@ def ExtractSharedMSVSSystemIncludes(configs, generator_flags): expanded_system_includes = OrderedSet( [ExpandMacros(include, env) for include in all_system_includes] ) - if any(["$" in include for include in expanded_system_includes]): + if any("$" in include for include in expanded_system_includes): # Some path relies on target-specific variables, bail. return None @@ -255,10 +255,7 @@ def GetVSMacroEnv(self, base_to_build=None, config=None): """Get a dict of variables mapping internal VS macro names to their gyp equivalents.""" target_arch = self.GetArch(config) - if target_arch == "x86": - target_platform = "Win32" - else: - target_platform = target_arch + target_platform = "Win32" if target_arch == "x86" else target_arch target_name = self.spec.get("product_prefix", "") + self.spec.get( "product_name", self.spec["target_name"] ) @@ -738,10 +735,7 @@ def GetLdflags( # TODO(scottmg): This should sort of be somewhere else (not really a flag). ld("AdditionalDependencies", prefix="") - if self.GetArch(config) == "x86": - safeseh_default = "true" - else: - safeseh_default = None + safeseh_default = "true" if self.GetArch(config) == "x86" else None ld( "ImageHasSafeExceptionHandlers", map={"false": ":NO", "true": ""}, @@ -960,15 +954,12 @@ def GetRuleShellFlags(self, rule): def _HasExplicitRuleForExtension(self, spec, extension): """Determine if there's an explicit rule for a particular extension.""" - for rule in spec.get("rules", []): - if rule["extension"] == extension: - return True - return False + return any(rule["extension"] == extension for rule in spec.get("rules", [])) def _HasExplicitIdlActions(self, spec): """Determine if an action should not run midl for .idl files.""" return any( - [action.get("explicit_idl_action", 0) for action in spec.get("actions", [])] + action.get("explicit_idl_action", 0) for action in spec.get("actions", []) ) def HasExplicitIdlRulesOrActions(self, spec): diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py index 638eee40029411..171d7295747fcd 100755 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py @@ -219,11 +219,10 @@ def ExecLinkWithManifests( our_manifest = "%(out)s.manifest" % variables # Load and normalize the manifests. mt.exe sometimes removes whitespace, # and sometimes doesn't unfortunately. - with open(our_manifest) as our_f: - with open(assert_manifest) as assert_f: - translator = str.maketrans('', '', string.whitespace) - our_data = our_f.read().translate(translator) - assert_data = assert_f.read().translate(translator) + with open(our_manifest) as our_f, open(assert_manifest) as assert_f: + translator = str.maketrans("", "", string.whitespace) + our_data = our_f.read().translate(translator) + assert_data = assert_f.read().translate(translator) if our_data != assert_data: os.unlink(out) diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py index a75d8eeab7bda0..29caf1ce7fbb97 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py @@ -685,10 +685,7 @@ def GetCflags(self, configname, arch=None): if platform_root: cflags.append("-F" + platform_root + "/Developer/Library/Frameworks/") - if sdk_root: - framework_root = sdk_root - else: - framework_root = "" + framework_root = sdk_root if sdk_root else "" config = self.spec["configurations"][self.configname] framework_dirs = config.get("mac_framework_dirs", []) for directory in framework_dirs: @@ -1248,10 +1245,7 @@ def _AdjustLibrary(self, library, config_name=None): l_flag = "-framework " + os.path.splitext(os.path.basename(library))[0] else: m = self.library_re.match(library) - if m: - l_flag = "-l" + m.group(1) - else: - l_flag = library + l_flag = "-l" + m.group(1) if m else library sdk_root = self._SdkPath(config_name) if not sdk_root: @@ -1545,7 +1539,7 @@ def CLTVersion(): except GypError: continue - regex = re.compile(r'Command Line Tools for Xcode\s+(?P\S+)') + regex = re.compile(r"Command Line Tools for Xcode\s+(?P\S+)") try: output = GetStdout(["/usr/sbin/softwareupdate", "--history"]) return re.search(regex, output).groupdict()["version"] diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py index 4e0ec5e8828f79..33c667c266bf69 100644 --- a/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py @@ -971,7 +971,7 @@ def __init__(self, properties=None, id=None, parent=None): if "path" in self._properties and "name" not in self._properties: path = self._properties["path"] name = posixpath.basename(path) - if name != "" and path != name: + if name not in ("", path): self.SetProperty("name", name) if "path" in self._properties and ( @@ -2355,9 +2355,8 @@ def __init__( # property was supplied, set "productName" if it is not present. Also set # the "PRODUCT_NAME" build setting in each configuration, but only if # the setting is not present in any build configuration. - if "name" in self._properties: - if "productName" not in self._properties: - self.SetProperty("productName", self._properties["name"]) + if "name" in self._properties and "productName" not in self._properties: + self.SetProperty("productName", self._properties["name"]) if "productName" in self._properties: if "buildConfigurationList" in self._properties: @@ -2547,13 +2546,12 @@ def __init__( force_extension = suffix[1:] if ( - self._properties["productType"] - == "com.apple.product-type-bundle.unit.test" - or self._properties["productType"] - == "com.apple.product-type-bundle.ui-testing" - ): - if force_extension is None: - force_extension = suffix[1:] + self._properties["productType"] in { + "com.apple.product-type-bundle.unit.test", + "com.apple.product-type-bundle.ui-testing" + } + ) and force_extension is None: + force_extension = suffix[1:] if force_extension is not None: # If it's a wrapper (bundle), set WRAPPER_EXTENSION. @@ -2636,10 +2634,13 @@ def HeadersPhase(self): # frameworks phases, if any. insert_at = len(self._properties["buildPhases"]) for index, phase in enumerate(self._properties["buildPhases"]): - if ( - isinstance(phase, PBXResourcesBuildPhase) - or isinstance(phase, PBXSourcesBuildPhase) - or isinstance(phase, PBXFrameworksBuildPhase) + if isinstance( + phase, + ( + PBXResourcesBuildPhase, + PBXSourcesBuildPhase, + PBXFrameworksBuildPhase, + ), ): insert_at = index break @@ -2658,9 +2659,7 @@ def ResourcesPhase(self): # phases, if any. insert_at = len(self._properties["buildPhases"]) for index, phase in enumerate(self._properties["buildPhases"]): - if isinstance(phase, PBXSourcesBuildPhase) or isinstance( - phase, PBXFrameworksBuildPhase - ): + if isinstance(phase, (PBXSourcesBuildPhase, PBXFrameworksBuildPhase)): insert_at = index break @@ -2701,8 +2700,10 @@ def AddDependency(self, other): other._properties["productType"] == static_library_type or ( ( - other._properties["productType"] == shared_library_type - or other._properties["productType"] == framework_type + other._properties["productType"] in { + shared_library_type, + framework_type + } ) and ( (not other.HasBuildSetting("MACH_O_TYPE")) diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/LICENSE b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/LICENSE new file mode 100644 index 00000000000000..6f62d44e4ef733 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/LICENSE @@ -0,0 +1,3 @@ +This software is made available under the terms of *either* of the licenses +found in LICENSE.APACHE or LICENSE.BSD. Contributions to this software is made +under the terms of *both* these licenses. diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.APACHE b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.APACHE new file mode 100644 index 00000000000000..f433b1a53f5b83 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.APACHE @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.BSD b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.BSD new file mode 100644 index 00000000000000..42ce7b75c92fb0 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/LICENSE.BSD @@ -0,0 +1,23 @@ +Copyright (c) Donald Stufft and individual contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/__init__.py b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/__init__.py new file mode 100644 index 00000000000000..5fd91838316fbe --- /dev/null +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/__init__.py @@ -0,0 +1,15 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +__title__ = "packaging" +__summary__ = "Core utilities for Python packages" +__uri__ = "https://github.com/pypa/packaging" + +__version__ = "23.3.dev0" + +__author__ = "Donald Stufft and individual contributors" +__email__ = "donald@stufft.io" + +__license__ = "BSD-2-Clause or Apache-2.0" +__copyright__ = "2014 %s" % __author__ diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/_elffile.py b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/_elffile.py new file mode 100644 index 00000000000000..6fb19b30bb53c1 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/_elffile.py @@ -0,0 +1,108 @@ +""" +ELF file parser. + +This provides a class ``ELFFile`` that parses an ELF executable in a similar +interface to ``ZipFile``. Only the read interface is implemented. + +Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca +ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html +""" + +import enum +import os +import struct +from typing import IO, Optional, Tuple + + +class ELFInvalid(ValueError): + pass + + +class EIClass(enum.IntEnum): + C32 = 1 + C64 = 2 + + +class EIData(enum.IntEnum): + Lsb = 1 + Msb = 2 + + +class EMachine(enum.IntEnum): + I386 = 3 + S390 = 22 + Arm = 40 + X8664 = 62 + AArc64 = 183 + + +class ELFFile: + """ + Representation of an ELF executable. + """ + + def __init__(self, f: IO[bytes]) -> None: + self._f = f + + try: + ident = self._read("16B") + except struct.error: + raise ELFInvalid("unable to parse identification") + magic = bytes(ident[:4]) + if magic != b"\x7fELF": + raise ELFInvalid(f"invalid magic: {magic!r}") + + self.capacity = ident[4] # Format for program header (bitness). + self.encoding = ident[5] # Data structure encoding (endianness). + + try: + # e_fmt: Format for program header. + # p_fmt: Format for section header. + # p_idx: Indexes to find p_type, p_offset, and p_filesz. + e_fmt, self._p_fmt, self._p_idx = { + (1, 1): ("HHIIIIIHHH", ">IIIIIIII", (0, 1, 4)), # 32-bit MSB. + (2, 1): ("HHIQQQIHHH", ">IIQQQQQQ", (0, 2, 5)), # 64-bit MSB. + }[(self.capacity, self.encoding)] + except KeyError: + raise ELFInvalid( + f"unrecognized capacity ({self.capacity}) or " + f"encoding ({self.encoding})" + ) + + try: + ( + _, + self.machine, # Architecture type. + _, + _, + self._e_phoff, # Offset of program header. + _, + self.flags, # Processor-specific flags. + _, + self._e_phentsize, # Size of section. + self._e_phnum, # Number of sections. + ) = self._read(e_fmt) + except struct.error as e: + raise ELFInvalid("unable to parse machine and section information") from e + + def _read(self, fmt: str) -> Tuple[int, ...]: + return struct.unpack(fmt, self._f.read(struct.calcsize(fmt))) + + @property + def interpreter(self) -> Optional[str]: + """ + The path recorded in the ``PT_INTERP`` section header. + """ + for index in range(self._e_phnum): + self._f.seek(self._e_phoff + self._e_phentsize * index) + try: + data = self._read(self._p_fmt) + except struct.error: + continue + if data[self._p_idx[0]] != 3: # Not PT_INTERP. + continue + self._f.seek(data[self._p_idx[1]]) + return os.fsdecode(self._f.read(data[self._p_idx[2]])).strip("\0") + return None diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/_manylinux.py b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/_manylinux.py new file mode 100644 index 00000000000000..3705d50db9193e --- /dev/null +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/_manylinux.py @@ -0,0 +1,252 @@ +import collections +import contextlib +import functools +import os +import re +import sys +import warnings +from typing import Dict, Generator, Iterator, NamedTuple, Optional, Sequence, Tuple + +from ._elffile import EIClass, EIData, ELFFile, EMachine + +EF_ARM_ABIMASK = 0xFF000000 +EF_ARM_ABI_VER5 = 0x05000000 +EF_ARM_ABI_FLOAT_HARD = 0x00000400 + + +# `os.PathLike` not a generic type until Python 3.9, so sticking with `str` +# as the type for `path` until then. +@contextlib.contextmanager +def _parse_elf(path: str) -> Generator[Optional[ELFFile], None, None]: + try: + with open(path, "rb") as f: + yield ELFFile(f) + except (OSError, TypeError, ValueError): + yield None + + +def _is_linux_armhf(executable: str) -> bool: + # hard-float ABI can be detected from the ELF header of the running + # process + # https://static.docs.arm.com/ihi0044/g/aaelf32.pdf + with _parse_elf(executable) as f: + return ( + f is not None + and f.capacity == EIClass.C32 + and f.encoding == EIData.Lsb + and f.machine == EMachine.Arm + and f.flags & EF_ARM_ABIMASK == EF_ARM_ABI_VER5 + and f.flags & EF_ARM_ABI_FLOAT_HARD == EF_ARM_ABI_FLOAT_HARD + ) + + +def _is_linux_i686(executable: str) -> bool: + with _parse_elf(executable) as f: + return ( + f is not None + and f.capacity == EIClass.C32 + and f.encoding == EIData.Lsb + and f.machine == EMachine.I386 + ) + + +def _have_compatible_abi(executable: str, archs: Sequence[str]) -> bool: + if "armv7l" in archs: + return _is_linux_armhf(executable) + if "i686" in archs: + return _is_linux_i686(executable) + allowed_archs = {"x86_64", "aarch64", "ppc64", "ppc64le", "s390x", "loongarch64"} + return any(arch in allowed_archs for arch in archs) + + +# If glibc ever changes its major version, we need to know what the last +# minor version was, so we can build the complete list of all versions. +# For now, guess what the highest minor version might be, assume it will +# be 50 for testing. Once this actually happens, update the dictionary +# with the actual value. +_LAST_GLIBC_MINOR: Dict[int, int] = collections.defaultdict(lambda: 50) + + +class _GLibCVersion(NamedTuple): + major: int + minor: int + + +def _glibc_version_string_confstr() -> Optional[str]: + """ + Primary implementation of glibc_version_string using os.confstr. + """ + # os.confstr is quite a bit faster than ctypes.DLL. It's also less likely + # to be broken or missing. This strategy is used in the standard library + # platform module. + # https://github.com/python/cpython/blob/fcf1d003bf4f0100c/Lib/platform.py#L175-L183 + try: + # Should be a string like "glibc 2.17". + version_string: str = getattr(os, "confstr")("CS_GNU_LIBC_VERSION") + assert version_string is not None + _, version = version_string.rsplit() + except (AssertionError, AttributeError, OSError, ValueError): + # os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)... + return None + return version + + +def _glibc_version_string_ctypes() -> Optional[str]: + """ + Fallback implementation of glibc_version_string using ctypes. + """ + try: + import ctypes + except ImportError: + return None + + # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen + # manpage says, "If filename is NULL, then the returned handle is for the + # main program". This way we can let the linker do the work to figure out + # which libc our process is actually using. + # + # We must also handle the special case where the executable is not a + # dynamically linked executable. This can occur when using musl libc, + # for example. In this situation, dlopen() will error, leading to an + # OSError. Interestingly, at least in the case of musl, there is no + # errno set on the OSError. The single string argument used to construct + # OSError comes from libc itself and is therefore not portable to + # hard code here. In any case, failure to call dlopen() means we + # can proceed, so we bail on our attempt. + try: + process_namespace = ctypes.CDLL(None) + except OSError: + return None + + try: + gnu_get_libc_version = process_namespace.gnu_get_libc_version + except AttributeError: + # Symbol doesn't exist -> therefore, we are not linked to + # glibc. + return None + + # Call gnu_get_libc_version, which returns a string like "2.5" + gnu_get_libc_version.restype = ctypes.c_char_p + version_str: str = gnu_get_libc_version() + # py2 / py3 compatibility: + if not isinstance(version_str, str): + version_str = version_str.decode("ascii") + + return version_str + + +def _glibc_version_string() -> Optional[str]: + """Returns glibc version string, or None if not using glibc.""" + return _glibc_version_string_confstr() or _glibc_version_string_ctypes() + + +def _parse_glibc_version(version_str: str) -> Tuple[int, int]: + """Parse glibc version. + + We use a regexp instead of str.split because we want to discard any + random junk that might come after the minor version -- this might happen + in patched/forked versions of glibc (e.g. Linaro's version of glibc + uses version strings like "2.20-2014.11"). See gh-3588. + """ + m = re.match(r"(?P[0-9]+)\.(?P[0-9]+)", version_str) + if not m: + warnings.warn( + f"Expected glibc version with 2 components major.minor," + f" got: {version_str}", + RuntimeWarning, + ) + return -1, -1 + return int(m.group("major")), int(m.group("minor")) + + +@functools.lru_cache() +def _get_glibc_version() -> Tuple[int, int]: + version_str = _glibc_version_string() + if version_str is None: + return (-1, -1) + return _parse_glibc_version(version_str) + + +# From PEP 513, PEP 600 +def _is_compatible(arch: str, version: _GLibCVersion) -> bool: + sys_glibc = _get_glibc_version() + if sys_glibc < version: + return False + # Check for presence of _manylinux module. + try: + import _manylinux # noqa + except ImportError: + return True + if hasattr(_manylinux, "manylinux_compatible"): + result = _manylinux.manylinux_compatible(version[0], version[1], arch) + if result is not None: + return bool(result) + return True + if version == _GLibCVersion(2, 5): + if hasattr(_manylinux, "manylinux1_compatible"): + return bool(_manylinux.manylinux1_compatible) + if version == _GLibCVersion(2, 12): + if hasattr(_manylinux, "manylinux2010_compatible"): + return bool(_manylinux.manylinux2010_compatible) + if version == _GLibCVersion(2, 17): + if hasattr(_manylinux, "manylinux2014_compatible"): + return bool(_manylinux.manylinux2014_compatible) + return True + + +_LEGACY_MANYLINUX_MAP = { + # CentOS 7 w/ glibc 2.17 (PEP 599) + (2, 17): "manylinux2014", + # CentOS 6 w/ glibc 2.12 (PEP 571) + (2, 12): "manylinux2010", + # CentOS 5 w/ glibc 2.5 (PEP 513) + (2, 5): "manylinux1", +} + + +def platform_tags(archs: Sequence[str]) -> Iterator[str]: + """Generate manylinux tags compatible to the current platform. + + :param archs: Sequence of compatible architectures. + The first one shall be the closest to the actual architecture and be the part of + platform tag after the ``linux_`` prefix, e.g. ``x86_64``. + The ``linux_`` prefix is assumed as a prerequisite for the current platform to + be manylinux-compatible. + + :returns: An iterator of compatible manylinux tags. + """ + if not _have_compatible_abi(sys.executable, archs): + return + # Oldest glibc to be supported regardless of architecture is (2, 17). + too_old_glibc2 = _GLibCVersion(2, 16) + if set(archs) & {"x86_64", "i686"}: + # On x86/i686 also oldest glibc to be supported is (2, 5). + too_old_glibc2 = _GLibCVersion(2, 4) + current_glibc = _GLibCVersion(*_get_glibc_version()) + glibc_max_list = [current_glibc] + # We can assume compatibility across glibc major versions. + # https://sourceware.org/bugzilla/show_bug.cgi?id=24636 + # + # Build a list of maximum glibc versions so that we can + # output the canonical list of all glibc from current_glibc + # down to too_old_glibc2, including all intermediary versions. + for glibc_major in range(current_glibc.major - 1, 1, -1): + glibc_minor = _LAST_GLIBC_MINOR[glibc_major] + glibc_max_list.append(_GLibCVersion(glibc_major, glibc_minor)) + for arch in archs: + for glibc_max in glibc_max_list: + if glibc_max.major == too_old_glibc2.major: + min_minor = too_old_glibc2.minor + else: + # For other glibc major versions oldest supported is (x, 0). + min_minor = -1 + for glibc_minor in range(glibc_max.minor, min_minor, -1): + glibc_version = _GLibCVersion(glibc_max.major, glibc_minor) + tag = "manylinux_{}_{}".format(*glibc_version) + if _is_compatible(arch, glibc_version): + yield f"{tag}_{arch}" + # Handle the legacy manylinux1, manylinux2010, manylinux2014 tags. + if glibc_version in _LEGACY_MANYLINUX_MAP: + legacy_tag = _LEGACY_MANYLINUX_MAP[glibc_version] + if _is_compatible(arch, glibc_version): + yield f"{legacy_tag}_{arch}" diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/_musllinux.py b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/_musllinux.py new file mode 100644 index 00000000000000..86419df9d7087f --- /dev/null +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/_musllinux.py @@ -0,0 +1,83 @@ +"""PEP 656 support. + +This module implements logic to detect if the currently running Python is +linked against musl, and what musl version is used. +""" + +import functools +import re +import subprocess +import sys +from typing import Iterator, NamedTuple, Optional, Sequence + +from ._elffile import ELFFile + + +class _MuslVersion(NamedTuple): + major: int + minor: int + + +def _parse_musl_version(output: str) -> Optional[_MuslVersion]: + lines = [n for n in (n.strip() for n in output.splitlines()) if n] + if len(lines) < 2 or lines[0][:4] != "musl": + return None + m = re.match(r"Version (\d+)\.(\d+)", lines[1]) + if not m: + return None + return _MuslVersion(major=int(m.group(1)), minor=int(m.group(2))) + + +@functools.lru_cache() +def _get_musl_version(executable: str) -> Optional[_MuslVersion]: + """Detect currently-running musl runtime version. + + This is done by checking the specified executable's dynamic linking + information, and invoking the loader to parse its output for a version + string. If the loader is musl, the output would be something like:: + + musl libc (x86_64) + Version 1.2.2 + Dynamic Program Loader + """ + try: + with open(executable, "rb") as f: + ld = ELFFile(f).interpreter + except (OSError, TypeError, ValueError): + return None + if ld is None or "musl" not in ld: + return None + proc = subprocess.run([ld], stderr=subprocess.PIPE, text=True) + return _parse_musl_version(proc.stderr) + + +def platform_tags(archs: Sequence[str]) -> Iterator[str]: + """Generate musllinux tags compatible to the current platform. + + :param archs: Sequence of compatible architectures. + The first one shall be the closest to the actual architecture and be the part of + platform tag after the ``linux_`` prefix, e.g. ``x86_64``. + The ``linux_`` prefix is assumed as a prerequisite for the current platform to + be musllinux-compatible. + + :returns: An iterator of compatible musllinux tags. + """ + sys_musl = _get_musl_version(sys.executable) + if sys_musl is None: # Python not dynamically linked against musl. + return + for arch in archs: + for minor in range(sys_musl.minor, -1, -1): + yield f"musllinux_{sys_musl.major}_{minor}_{arch}" + + +if __name__ == "__main__": # pragma: no cover + import sysconfig + + plat = sysconfig.get_platform() + assert plat.startswith("linux-"), "not linux" + + print("plat:", plat) + print("musl:", _get_musl_version(sys.executable)) + print("tags:", end=" ") + for t in platform_tags(re.sub(r"[.-]", "_", plat.split("-", 1)[-1])): + print(t, end="\n ") diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/_parser.py b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/_parser.py new file mode 100644 index 00000000000000..4576981c2dd755 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/_parser.py @@ -0,0 +1,359 @@ +"""Handwritten parser of dependency specifiers. + +The docstring for each __parse_* function contains ENBF-inspired grammar representing +the implementation. +""" + +import ast +from typing import Any, List, NamedTuple, Optional, Tuple, Union + +from ._tokenizer import DEFAULT_RULES, Tokenizer + + +class Node: + def __init__(self, value: str) -> None: + self.value = value + + def __str__(self) -> str: + return self.value + + def __repr__(self) -> str: + return f"<{self.__class__.__name__}('{self}')>" + + def serialize(self) -> str: + raise NotImplementedError + + +class Variable(Node): + def serialize(self) -> str: + return str(self) + + +class Value(Node): + def serialize(self) -> str: + return f'"{self}"' + + +class Op(Node): + def serialize(self) -> str: + return str(self) + + +MarkerVar = Union[Variable, Value] +MarkerItem = Tuple[MarkerVar, Op, MarkerVar] +# MarkerAtom = Union[MarkerItem, List["MarkerAtom"]] +# MarkerList = List[Union["MarkerList", MarkerAtom, str]] +# mypy does not support recursive type definition +# https://github.com/python/mypy/issues/731 +MarkerAtom = Any +MarkerList = List[Any] + + +class ParsedRequirement(NamedTuple): + name: str + url: str + extras: List[str] + specifier: str + marker: Optional[MarkerList] + + +# -------------------------------------------------------------------------------------- +# Recursive descent parser for dependency specifier +# -------------------------------------------------------------------------------------- +def parse_requirement(source: str) -> ParsedRequirement: + return _parse_requirement(Tokenizer(source, rules=DEFAULT_RULES)) + + +def _parse_requirement(tokenizer: Tokenizer) -> ParsedRequirement: + """ + requirement = WS? IDENTIFIER WS? extras WS? requirement_details + """ + tokenizer.consume("WS") + + name_token = tokenizer.expect( + "IDENTIFIER", expected="package name at the start of dependency specifier" + ) + name = name_token.text + tokenizer.consume("WS") + + extras = _parse_extras(tokenizer) + tokenizer.consume("WS") + + url, specifier, marker = _parse_requirement_details(tokenizer) + tokenizer.expect("END", expected="end of dependency specifier") + + return ParsedRequirement(name, url, extras, specifier, marker) + + +def _parse_requirement_details( + tokenizer: Tokenizer, +) -> Tuple[str, str, Optional[MarkerList]]: + """ + requirement_details = AT URL (WS requirement_marker?)? + | specifier WS? (requirement_marker)? + """ + + specifier = "" + url = "" + marker = None + + if tokenizer.check("AT"): + tokenizer.read() + tokenizer.consume("WS") + + url_start = tokenizer.position + url = tokenizer.expect("URL", expected="URL after @").text + if tokenizer.check("END", peek=True): + return (url, specifier, marker) + + tokenizer.expect("WS", expected="whitespace after URL") + + # The input might end after whitespace. + if tokenizer.check("END", peek=True): + return (url, specifier, marker) + + marker = _parse_requirement_marker( + tokenizer, span_start=url_start, after="URL and whitespace" + ) + else: + specifier_start = tokenizer.position + specifier = _parse_specifier(tokenizer) + tokenizer.consume("WS") + + if tokenizer.check("END", peek=True): + return (url, specifier, marker) + + marker = _parse_requirement_marker( + tokenizer, + span_start=specifier_start, + after=( + "version specifier" + if specifier + else "name and no valid version specifier" + ), + ) + + return (url, specifier, marker) + + +def _parse_requirement_marker( + tokenizer: Tokenizer, *, span_start: int, after: str +) -> MarkerList: + """ + requirement_marker = SEMICOLON marker WS? + """ + + if not tokenizer.check("SEMICOLON"): + tokenizer.raise_syntax_error( + f"Expected end or semicolon (after {after})", + span_start=span_start, + ) + tokenizer.read() + + marker = _parse_marker(tokenizer) + tokenizer.consume("WS") + + return marker + + +def _parse_extras(tokenizer: Tokenizer) -> List[str]: + """ + extras = (LEFT_BRACKET wsp* extras_list? wsp* RIGHT_BRACKET)? + """ + if not tokenizer.check("LEFT_BRACKET", peek=True): + return [] + + with tokenizer.enclosing_tokens( + "LEFT_BRACKET", + "RIGHT_BRACKET", + around="extras", + ): + tokenizer.consume("WS") + extras = _parse_extras_list(tokenizer) + tokenizer.consume("WS") + + return extras + + +def _parse_extras_list(tokenizer: Tokenizer) -> List[str]: + """ + extras_list = identifier (wsp* ',' wsp* identifier)* + """ + extras: List[str] = [] + + if not tokenizer.check("IDENTIFIER"): + return extras + + extras.append(tokenizer.read().text) + + while True: + tokenizer.consume("WS") + if tokenizer.check("IDENTIFIER", peek=True): + tokenizer.raise_syntax_error("Expected comma between extra names") + elif not tokenizer.check("COMMA"): + break + + tokenizer.read() + tokenizer.consume("WS") + + extra_token = tokenizer.expect("IDENTIFIER", expected="extra name after comma") + extras.append(extra_token.text) + + return extras + + +def _parse_specifier(tokenizer: Tokenizer) -> str: + """ + specifier = LEFT_PARENTHESIS WS? version_many WS? RIGHT_PARENTHESIS + | WS? version_many WS? + """ + with tokenizer.enclosing_tokens( + "LEFT_PARENTHESIS", + "RIGHT_PARENTHESIS", + around="version specifier", + ): + tokenizer.consume("WS") + parsed_specifiers = _parse_version_many(tokenizer) + tokenizer.consume("WS") + + return parsed_specifiers + + +def _parse_version_many(tokenizer: Tokenizer) -> str: + """ + version_many = (SPECIFIER (WS? COMMA WS? SPECIFIER)*)? + """ + parsed_specifiers = "" + while tokenizer.check("SPECIFIER"): + span_start = tokenizer.position + parsed_specifiers += tokenizer.read().text + if tokenizer.check("VERSION_PREFIX_TRAIL", peek=True): + tokenizer.raise_syntax_error( + ".* suffix can only be used with `==` or `!=` operators", + span_start=span_start, + span_end=tokenizer.position + 1, + ) + if tokenizer.check("VERSION_LOCAL_LABEL_TRAIL", peek=True): + tokenizer.raise_syntax_error( + "Local version label can only be used with `==` or `!=` operators", + span_start=span_start, + span_end=tokenizer.position, + ) + tokenizer.consume("WS") + if not tokenizer.check("COMMA"): + break + parsed_specifiers += tokenizer.read().text + tokenizer.consume("WS") + + return parsed_specifiers + + +# -------------------------------------------------------------------------------------- +# Recursive descent parser for marker expression +# -------------------------------------------------------------------------------------- +def parse_marker(source: str) -> MarkerList: + return _parse_full_marker(Tokenizer(source, rules=DEFAULT_RULES)) + + +def _parse_full_marker(tokenizer: Tokenizer) -> MarkerList: + retval = _parse_marker(tokenizer) + tokenizer.expect("END", expected="end of marker expression") + return retval + + +def _parse_marker(tokenizer: Tokenizer) -> MarkerList: + """ + marker = marker_atom (BOOLOP marker_atom)+ + """ + expression = [_parse_marker_atom(tokenizer)] + while tokenizer.check("BOOLOP"): + token = tokenizer.read() + expr_right = _parse_marker_atom(tokenizer) + expression.extend((token.text, expr_right)) + return expression + + +def _parse_marker_atom(tokenizer: Tokenizer) -> MarkerAtom: + """ + marker_atom = WS? LEFT_PARENTHESIS WS? marker WS? RIGHT_PARENTHESIS WS? + | WS? marker_item WS? + """ + + tokenizer.consume("WS") + if tokenizer.check("LEFT_PARENTHESIS", peek=True): + with tokenizer.enclosing_tokens( + "LEFT_PARENTHESIS", + "RIGHT_PARENTHESIS", + around="marker expression", + ): + tokenizer.consume("WS") + marker: MarkerAtom = _parse_marker(tokenizer) + tokenizer.consume("WS") + else: + marker = _parse_marker_item(tokenizer) + tokenizer.consume("WS") + return marker + + +def _parse_marker_item(tokenizer: Tokenizer) -> MarkerItem: + """ + marker_item = WS? marker_var WS? marker_op WS? marker_var WS? + """ + tokenizer.consume("WS") + marker_var_left = _parse_marker_var(tokenizer) + tokenizer.consume("WS") + marker_op = _parse_marker_op(tokenizer) + tokenizer.consume("WS") + marker_var_right = _parse_marker_var(tokenizer) + tokenizer.consume("WS") + return (marker_var_left, marker_op, marker_var_right) + + +def _parse_marker_var(tokenizer: Tokenizer) -> MarkerVar: + """ + marker_var = VARIABLE | QUOTED_STRING + """ + if tokenizer.check("VARIABLE"): + return process_env_var(tokenizer.read().text.replace(".", "_")) + elif tokenizer.check("QUOTED_STRING"): + return process_python_str(tokenizer.read().text) + else: + tokenizer.raise_syntax_error( + message="Expected a marker variable or quoted string" + ) + + +def process_env_var(env_var: str) -> Variable: + if ( + env_var == "platform_python_implementation" + or env_var == "python_implementation" + ): + return Variable("platform_python_implementation") + else: + return Variable(env_var) + + +def process_python_str(python_str: str) -> Value: + value = ast.literal_eval(python_str) + return Value(str(value)) + + +def _parse_marker_op(tokenizer: Tokenizer) -> Op: + """ + marker_op = IN | NOT IN | OP + """ + if tokenizer.check("IN"): + tokenizer.read() + return Op("in") + elif tokenizer.check("NOT"): + tokenizer.read() + tokenizer.expect("WS", expected="whitespace after 'not'") + tokenizer.expect("IN", expected="'in' after 'not'") + return Op("not in") + elif tokenizer.check("OP"): + return Op(tokenizer.read().text) + else: + return tokenizer.raise_syntax_error( + "Expected marker operator, one of " + "<=, <, !=, ==, >=, >, ~=, ===, in, not in" + ) diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/_structures.py b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/_structures.py new file mode 100644 index 00000000000000..90a6465f9682c8 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/_structures.py @@ -0,0 +1,61 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + + +class InfinityType: + def __repr__(self) -> str: + return "Infinity" + + def __hash__(self) -> int: + return hash(repr(self)) + + def __lt__(self, other: object) -> bool: + return False + + def __le__(self, other: object) -> bool: + return False + + def __eq__(self, other: object) -> bool: + return isinstance(other, self.__class__) + + def __gt__(self, other: object) -> bool: + return True + + def __ge__(self, other: object) -> bool: + return True + + def __neg__(self: object) -> "NegativeInfinityType": + return NegativeInfinity + + +Infinity = InfinityType() + + +class NegativeInfinityType: + def __repr__(self) -> str: + return "-Infinity" + + def __hash__(self) -> int: + return hash(repr(self)) + + def __lt__(self, other: object) -> bool: + return True + + def __le__(self, other: object) -> bool: + return True + + def __eq__(self, other: object) -> bool: + return isinstance(other, self.__class__) + + def __gt__(self, other: object) -> bool: + return False + + def __ge__(self, other: object) -> bool: + return False + + def __neg__(self: object) -> InfinityType: + return Infinity + + +NegativeInfinity = NegativeInfinityType() diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/_tokenizer.py b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/_tokenizer.py new file mode 100644 index 00000000000000..dd0d648d49a7c1 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/_tokenizer.py @@ -0,0 +1,192 @@ +import contextlib +import re +from dataclasses import dataclass +from typing import Dict, Iterator, NoReturn, Optional, Tuple, Union + +from .specifiers import Specifier + + +@dataclass +class Token: + name: str + text: str + position: int + + +class ParserSyntaxError(Exception): + """The provided source text could not be parsed correctly.""" + + def __init__( + self, + message: str, + *, + source: str, + span: Tuple[int, int], + ) -> None: + self.span = span + self.message = message + self.source = source + + super().__init__() + + def __str__(self) -> str: + marker = " " * self.span[0] + "~" * (self.span[1] - self.span[0]) + "^" + return "\n ".join([self.message, self.source, marker]) + + +DEFAULT_RULES: "Dict[str, Union[str, re.Pattern[str]]]" = { + "LEFT_PARENTHESIS": r"\(", + "RIGHT_PARENTHESIS": r"\)", + "LEFT_BRACKET": r"\[", + "RIGHT_BRACKET": r"\]", + "SEMICOLON": r";", + "COMMA": r",", + "QUOTED_STRING": re.compile( + r""" + ( + ('[^']*') + | + ("[^"]*") + ) + """, + re.VERBOSE, + ), + "OP": r"(===|==|~=|!=|<=|>=|<|>)", + "BOOLOP": r"\b(or|and)\b", + "IN": r"\bin\b", + "NOT": r"\bnot\b", + "VARIABLE": re.compile( + r""" + \b( + python_version + |python_full_version + |os[._]name + |sys[._]platform + |platform_(release|system) + |platform[._](version|machine|python_implementation) + |python_implementation + |implementation_(name|version) + |extra + )\b + """, + re.VERBOSE, + ), + "SPECIFIER": re.compile( + Specifier._operator_regex_str + Specifier._version_regex_str, + re.VERBOSE | re.IGNORECASE, + ), + "AT": r"\@", + "URL": r"[^ \t]+", + "IDENTIFIER": r"\b[a-zA-Z0-9][a-zA-Z0-9._-]*\b", + "VERSION_PREFIX_TRAIL": r"\.\*", + "VERSION_LOCAL_LABEL_TRAIL": r"\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*", + "WS": r"[ \t]+", + "END": r"$", +} + + +class Tokenizer: + """Context-sensitive token parsing. + + Provides methods to examine the input stream to check whether the next token + matches. + """ + + def __init__( + self, + source: str, + *, + rules: "Dict[str, Union[str, re.Pattern[str]]]", + ) -> None: + self.source = source + self.rules: Dict[str, re.Pattern[str]] = { + name: re.compile(pattern) for name, pattern in rules.items() + } + self.next_token: Optional[Token] = None + self.position = 0 + + def consume(self, name: str) -> None: + """Move beyond provided token name, if at current position.""" + if self.check(name): + self.read() + + def check(self, name: str, *, peek: bool = False) -> bool: + """Check whether the next token has the provided name. + + By default, if the check succeeds, the token *must* be read before + another check. If `peek` is set to `True`, the token is not loaded and + would need to be checked again. + """ + assert ( + self.next_token is None + ), f"Cannot check for {name!r}, already have {self.next_token!r}" + assert name in self.rules, f"Unknown token name: {name!r}" + + expression = self.rules[name] + + match = expression.match(self.source, self.position) + if match is None: + return False + if not peek: + self.next_token = Token(name, match[0], self.position) + return True + + def expect(self, name: str, *, expected: str) -> Token: + """Expect a certain token name next, failing with a syntax error otherwise. + + The token is *not* read. + """ + if not self.check(name): + raise self.raise_syntax_error(f"Expected {expected}") + return self.read() + + def read(self) -> Token: + """Consume the next token and return it.""" + token = self.next_token + assert token is not None + + self.position += len(token.text) + self.next_token = None + + return token + + def raise_syntax_error( + self, + message: str, + *, + span_start: Optional[int] = None, + span_end: Optional[int] = None, + ) -> NoReturn: + """Raise ParserSyntaxError at the given position.""" + span = ( + self.position if span_start is None else span_start, + self.position if span_end is None else span_end, + ) + raise ParserSyntaxError( + message, + source=self.source, + span=span, + ) + + @contextlib.contextmanager + def enclosing_tokens( + self, open_token: str, close_token: str, *, around: str + ) -> Iterator[None]: + if self.check(open_token): + open_position = self.position + self.read() + else: + open_position = None + + yield + + if open_position is None: + return + + if not self.check(close_token): + self.raise_syntax_error( + f"Expected matching {close_token} for {open_token}, after {around}", + span_start=open_position, + ) + + self.read() diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/markers.py b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/markers.py new file mode 100644 index 00000000000000..8b98fca7233be6 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/markers.py @@ -0,0 +1,252 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +import operator +import os +import platform +import sys +from typing import Any, Callable, Dict, List, Optional, Tuple, Union + +from ._parser import ( + MarkerAtom, + MarkerList, + Op, + Value, + Variable, + parse_marker as _parse_marker, +) +from ._tokenizer import ParserSyntaxError +from .specifiers import InvalidSpecifier, Specifier +from .utils import canonicalize_name + +__all__ = [ + "InvalidMarker", + "UndefinedComparison", + "UndefinedEnvironmentName", + "Marker", + "default_environment", +] + +Operator = Callable[[str, str], bool] + + +class InvalidMarker(ValueError): + """ + An invalid marker was found, users should refer to PEP 508. + """ + + +class UndefinedComparison(ValueError): + """ + An invalid operation was attempted on a value that doesn't support it. + """ + + +class UndefinedEnvironmentName(ValueError): + """ + A name was attempted to be used that does not exist inside of the + environment. + """ + + +def _normalize_extra_values(results: Any) -> Any: + """ + Normalize extra values. + """ + if isinstance(results[0], tuple): + lhs, op, rhs = results[0] + if isinstance(lhs, Variable) and lhs.value == "extra": + normalized_extra = canonicalize_name(rhs.value) + rhs = Value(normalized_extra) + elif isinstance(rhs, Variable) and rhs.value == "extra": + normalized_extra = canonicalize_name(lhs.value) + lhs = Value(normalized_extra) + results[0] = lhs, op, rhs + return results + + +def _format_marker( + marker: Union[List[str], MarkerAtom, str], first: Optional[bool] = True +) -> str: + + assert isinstance(marker, (list, tuple, str)) + + # Sometimes we have a structure like [[...]] which is a single item list + # where the single item is itself it's own list. In that case we want skip + # the rest of this function so that we don't get extraneous () on the + # outside. + if ( + isinstance(marker, list) + and len(marker) == 1 + and isinstance(marker[0], (list, tuple)) + ): + return _format_marker(marker[0]) + + if isinstance(marker, list): + inner = (_format_marker(m, first=False) for m in marker) + if first: + return " ".join(inner) + else: + return "(" + " ".join(inner) + ")" + elif isinstance(marker, tuple): + return " ".join([m.serialize() for m in marker]) + else: + return marker + + +_operators: Dict[str, Operator] = { + "in": lambda lhs, rhs: lhs in rhs, + "not in": lambda lhs, rhs: lhs not in rhs, + "<": operator.lt, + "<=": operator.le, + "==": operator.eq, + "!=": operator.ne, + ">=": operator.ge, + ">": operator.gt, +} + + +def _eval_op(lhs: str, op: Op, rhs: str) -> bool: + try: + spec = Specifier("".join([op.serialize(), rhs])) + except InvalidSpecifier: + pass + else: + return spec.contains(lhs, prereleases=True) + + oper: Optional[Operator] = _operators.get(op.serialize()) + if oper is None: + raise UndefinedComparison(f"Undefined {op!r} on {lhs!r} and {rhs!r}.") + + return oper(lhs, rhs) + + +def _normalize(*values: str, key: str) -> Tuple[str, ...]: + # PEP 685 – Comparison of extra names for optional distribution dependencies + # https://peps.python.org/pep-0685/ + # > When comparing extra names, tools MUST normalize the names being + # > compared using the semantics outlined in PEP 503 for names + if key == "extra": + return tuple(canonicalize_name(v) for v in values) + + # other environment markers don't have such standards + return values + + +def _evaluate_markers(markers: MarkerList, environment: Dict[str, str]) -> bool: + groups: List[List[bool]] = [[]] + + for marker in markers: + assert isinstance(marker, (list, tuple, str)) + + if isinstance(marker, list): + groups[-1].append(_evaluate_markers(marker, environment)) + elif isinstance(marker, tuple): + lhs, op, rhs = marker + + if isinstance(lhs, Variable): + environment_key = lhs.value + lhs_value = environment[environment_key] + rhs_value = rhs.value + else: + lhs_value = lhs.value + environment_key = rhs.value + rhs_value = environment[environment_key] + + lhs_value, rhs_value = _normalize(lhs_value, rhs_value, key=environment_key) + groups[-1].append(_eval_op(lhs_value, op, rhs_value)) + else: + assert marker in ["and", "or"] + if marker == "or": + groups.append([]) + + return any(all(item) for item in groups) + + +def format_full_version(info: "sys._version_info") -> str: + version = "{0.major}.{0.minor}.{0.micro}".format(info) + kind = info.releaselevel + if kind != "final": + version += kind[0] + str(info.serial) + return version + + +def default_environment() -> Dict[str, str]: + iver = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + return { + "implementation_name": implementation_name, + "implementation_version": iver, + "os_name": os.name, + "platform_machine": platform.machine(), + "platform_release": platform.release(), + "platform_system": platform.system(), + "platform_version": platform.version(), + "python_full_version": platform.python_version(), + "platform_python_implementation": platform.python_implementation(), + "python_version": ".".join(platform.python_version_tuple()[:2]), + "sys_platform": sys.platform, + } + + +class Marker: + def __init__(self, marker: str) -> None: + # Note: We create a Marker object without calling this constructor in + # packaging.requirements.Requirement. If any additional logic is + # added here, make sure to mirror/adapt Requirement. + try: + self._markers = _normalize_extra_values(_parse_marker(marker)) + # The attribute `_markers` can be described in terms of a recursive type: + # MarkerList = List[Union[Tuple[Node, ...], str, MarkerList]] + # + # For example, the following expression: + # python_version > "3.6" or (python_version == "3.6" and os_name == "unix") + # + # is parsed into: + # [ + # (, ')>, ), + # 'and', + # [ + # (, , ), + # 'or', + # (, , ) + # ] + # ] + except ParserSyntaxError as e: + raise InvalidMarker(str(e)) from e + + def __str__(self) -> str: + return _format_marker(self._markers) + + def __repr__(self) -> str: + return f"" + + def __hash__(self) -> int: + return hash((self.__class__.__name__, str(self))) + + def __eq__(self, other: Any) -> bool: + if not isinstance(other, Marker): + return NotImplemented + + return str(self) == str(other) + + def evaluate(self, environment: Optional[Dict[str, str]] = None) -> bool: + """Evaluate a marker. + + Return the boolean from evaluating the given marker against the + environment. environment is an optional argument to override all or + part of the determined environment. + + The environment is determined from the current Python process. + """ + current_environment = default_environment() + current_environment["extra"] = "" + if environment is not None: + current_environment.update(environment) + # The API used to allow setting extra to None. We need to handle this + # case for backwards compatibility. + if current_environment["extra"] is None: + current_environment["extra"] = "" + + return _evaluate_markers(self._markers, current_environment) diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/metadata.py b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/metadata.py new file mode 100644 index 00000000000000..fb274930799da0 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/metadata.py @@ -0,0 +1,825 @@ +import email.feedparser +import email.header +import email.message +import email.parser +import email.policy +import sys +import typing +from typing import ( + Any, + Callable, + Dict, + Generic, + List, + Optional, + Tuple, + Type, + Union, + cast, +) + +from . import requirements, specifiers, utils, version as version_module + +T = typing.TypeVar("T") +if sys.version_info[:2] >= (3, 8): # pragma: no cover + from typing import Literal, TypedDict +else: # pragma: no cover + if typing.TYPE_CHECKING: + from typing_extensions import Literal, TypedDict + else: + try: + from typing_extensions import Literal, TypedDict + except ImportError: + + class Literal: + def __init_subclass__(*_args, **_kwargs): + pass + + class TypedDict: + def __init_subclass__(*_args, **_kwargs): + pass + + +try: + ExceptionGroup +except NameError: # pragma: no cover + + class ExceptionGroup(Exception): # noqa: N818 + """A minimal implementation of :external:exc:`ExceptionGroup` from Python 3.11. + + If :external:exc:`ExceptionGroup` is already defined by Python itself, + that version is used instead. + """ + + message: str + exceptions: List[Exception] + + def __init__(self, message: str, exceptions: List[Exception]) -> None: + self.message = message + self.exceptions = exceptions + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({self.message!r}, {self.exceptions!r})" + +else: # pragma: no cover + ExceptionGroup = ExceptionGroup + + +class InvalidMetadata(ValueError): + """A metadata field contains invalid data.""" + + field: str + """The name of the field that contains invalid data.""" + + def __init__(self, field: str, message: str) -> None: + self.field = field + super().__init__(message) + + +# The RawMetadata class attempts to make as few assumptions about the underlying +# serialization formats as possible. The idea is that as long as a serialization +# formats offer some very basic primitives in *some* way then we can support +# serializing to and from that format. +class RawMetadata(TypedDict, total=False): + """A dictionary of raw core metadata. + + Each field in core metadata maps to a key of this dictionary (when data is + provided). The key is lower-case and underscores are used instead of dashes + compared to the equivalent core metadata field. Any core metadata field that + can be specified multiple times or can hold multiple values in a single + field have a key with a plural name. See :class:`Metadata` whose attributes + match the keys of this dictionary. + + Core metadata fields that can be specified multiple times are stored as a + list or dict depending on which is appropriate for the field. Any fields + which hold multiple values in a single field are stored as a list. + + """ + + # Metadata 1.0 - PEP 241 + metadata_version: str + name: str + version: str + platforms: List[str] + summary: str + description: str + keywords: List[str] + home_page: str + author: str + author_email: str + license: str + + # Metadata 1.1 - PEP 314 + supported_platforms: List[str] + download_url: str + classifiers: List[str] + requires: List[str] + provides: List[str] + obsoletes: List[str] + + # Metadata 1.2 - PEP 345 + maintainer: str + maintainer_email: str + requires_dist: List[str] + provides_dist: List[str] + obsoletes_dist: List[str] + requires_python: str + requires_external: List[str] + project_urls: Dict[str, str] + + # Metadata 2.0 + # PEP 426 attempted to completely revamp the metadata format + # but got stuck without ever being able to build consensus on + # it and ultimately ended up withdrawn. + # + # However, a number of tools had started emitting METADATA with + # `2.0` Metadata-Version, so for historical reasons, this version + # was skipped. + + # Metadata 2.1 - PEP 566 + description_content_type: str + provides_extra: List[str] + + # Metadata 2.2 - PEP 643 + dynamic: List[str] + + # Metadata 2.3 - PEP 685 + # No new fields were added in PEP 685, just some edge case were + # tightened up to provide better interoptability. + + +_STRING_FIELDS = { + "author", + "author_email", + "description", + "description_content_type", + "download_url", + "home_page", + "license", + "maintainer", + "maintainer_email", + "metadata_version", + "name", + "requires_python", + "summary", + "version", +} + +_LIST_FIELDS = { + "classifiers", + "dynamic", + "obsoletes", + "obsoletes_dist", + "platforms", + "provides", + "provides_dist", + "provides_extra", + "requires", + "requires_dist", + "requires_external", + "supported_platforms", +} + +_DICT_FIELDS = { + "project_urls", +} + + +def _parse_keywords(data: str) -> List[str]: + """Split a string of comma-separate keyboards into a list of keywords.""" + return [k.strip() for k in data.split(",")] + + +def _parse_project_urls(data: List[str]) -> Dict[str, str]: + """Parse a list of label/URL string pairings separated by a comma.""" + urls = {} + for pair in data: + # Our logic is slightly tricky here as we want to try and do + # *something* reasonable with malformed data. + # + # The main thing that we have to worry about, is data that does + # not have a ',' at all to split the label from the Value. There + # isn't a singular right answer here, and we will fail validation + # later on (if the caller is validating) so it doesn't *really* + # matter, but since the missing value has to be an empty str + # and our return value is dict[str, str], if we let the key + # be the missing value, then they'd have multiple '' values that + # overwrite each other in a accumulating dict. + # + # The other potentional issue is that it's possible to have the + # same label multiple times in the metadata, with no solid "right" + # answer with what to do in that case. As such, we'll do the only + # thing we can, which is treat the field as unparseable and add it + # to our list of unparsed fields. + parts = [p.strip() for p in pair.split(",", 1)] + parts.extend([""] * (max(0, 2 - len(parts)))) # Ensure 2 items + + # TODO: The spec doesn't say anything about if the keys should be + # considered case sensitive or not... logically they should + # be case-preserving and case-insensitive, but doing that + # would open up more cases where we might have duplicate + # entries. + label, url = parts + if label in urls: + # The label already exists in our set of urls, so this field + # is unparseable, and we can just add the whole thing to our + # unparseable data and stop processing it. + raise KeyError("duplicate labels in project urls") + urls[label] = url + + return urls + + +def _get_payload(msg: email.message.Message, source: Union[bytes, str]) -> str: + """Get the body of the message.""" + # If our source is a str, then our caller has managed encodings for us, + # and we don't need to deal with it. + if isinstance(source, str): + payload: str = msg.get_payload() + return payload + # If our source is a bytes, then we're managing the encoding and we need + # to deal with it. + else: + bpayload: bytes = msg.get_payload(decode=True) + try: + return bpayload.decode("utf8", "strict") + except UnicodeDecodeError: + raise ValueError("payload in an invalid encoding") + + +# The various parse_FORMAT functions here are intended to be as lenient as +# possible in their parsing, while still returning a correctly typed +# RawMetadata. +# +# To aid in this, we also generally want to do as little touching of the +# data as possible, except where there are possibly some historic holdovers +# that make valid data awkward to work with. +# +# While this is a lower level, intermediate format than our ``Metadata`` +# class, some light touch ups can make a massive difference in usability. + +# Map METADATA fields to RawMetadata. +_EMAIL_TO_RAW_MAPPING = { + "author": "author", + "author-email": "author_email", + "classifier": "classifiers", + "description": "description", + "description-content-type": "description_content_type", + "download-url": "download_url", + "dynamic": "dynamic", + "home-page": "home_page", + "keywords": "keywords", + "license": "license", + "maintainer": "maintainer", + "maintainer-email": "maintainer_email", + "metadata-version": "metadata_version", + "name": "name", + "obsoletes": "obsoletes", + "obsoletes-dist": "obsoletes_dist", + "platform": "platforms", + "project-url": "project_urls", + "provides": "provides", + "provides-dist": "provides_dist", + "provides-extra": "provides_extra", + "requires": "requires", + "requires-dist": "requires_dist", + "requires-external": "requires_external", + "requires-python": "requires_python", + "summary": "summary", + "supported-platform": "supported_platforms", + "version": "version", +} +_RAW_TO_EMAIL_MAPPING = {raw: email for email, raw in _EMAIL_TO_RAW_MAPPING.items()} + + +def parse_email(data: Union[bytes, str]) -> Tuple[RawMetadata, Dict[str, List[str]]]: + """Parse a distribution's metadata stored as email headers (e.g. from ``METADATA``). + + This function returns a two-item tuple of dicts. The first dict is of + recognized fields from the core metadata specification. Fields that can be + parsed and translated into Python's built-in types are converted + appropriately. All other fields are left as-is. Fields that are allowed to + appear multiple times are stored as lists. + + The second dict contains all other fields from the metadata. This includes + any unrecognized fields. It also includes any fields which are expected to + be parsed into a built-in type but were not formatted appropriately. Finally, + any fields that are expected to appear only once but are repeated are + included in this dict. + + """ + raw: Dict[str, Union[str, List[str], Dict[str, str]]] = {} + unparsed: Dict[str, List[str]] = {} + + if isinstance(data, str): + parsed = email.parser.Parser(policy=email.policy.compat32).parsestr(data) + else: + parsed = email.parser.BytesParser(policy=email.policy.compat32).parsebytes(data) + + # We have to wrap parsed.keys() in a set, because in the case of multiple + # values for a key (a list), the key will appear multiple times in the + # list of keys, but we're avoiding that by using get_all(). + for name in frozenset(parsed.keys()): + # Header names in RFC are case insensitive, so we'll normalize to all + # lower case to make comparisons easier. + name = name.lower() + + # We use get_all() here, even for fields that aren't multiple use, + # because otherwise someone could have e.g. two Name fields, and we + # would just silently ignore it rather than doing something about it. + headers = parsed.get_all(name) or [] + + # The way the email module works when parsing bytes is that it + # unconditionally decodes the bytes as ascii using the surrogateescape + # handler. When you pull that data back out (such as with get_all() ), + # it looks to see if the str has any surrogate escapes, and if it does + # it wraps it in a Header object instead of returning the string. + # + # As such, we'll look for those Header objects, and fix up the encoding. + value = [] + # Flag if we have run into any issues processing the headers, thus + # signalling that the data belongs in 'unparsed'. + valid_encoding = True + for h in headers: + # It's unclear if this can return more types than just a Header or + # a str, so we'll just assert here to make sure. + assert isinstance(h, (email.header.Header, str)) + + # If it's a header object, we need to do our little dance to get + # the real data out of it. In cases where there is invalid data + # we're going to end up with mojibake, but there's no obvious, good + # way around that without reimplementing parts of the Header object + # ourselves. + # + # That should be fine since, if mojibacked happens, this key is + # going into the unparsed dict anyways. + if isinstance(h, email.header.Header): + # The Header object stores it's data as chunks, and each chunk + # can be independently encoded, so we'll need to check each + # of them. + chunks: List[Tuple[bytes, Optional[str]]] = [] + for bin, encoding in email.header.decode_header(h): + try: + bin.decode("utf8", "strict") + except UnicodeDecodeError: + # Enable mojibake. + encoding = "latin1" + valid_encoding = False + else: + encoding = "utf8" + chunks.append((bin, encoding)) + + # Turn our chunks back into a Header object, then let that + # Header object do the right thing to turn them into a + # string for us. + value.append(str(email.header.make_header(chunks))) + # This is already a string, so just add it. + else: + value.append(h) + + # We've processed all of our values to get them into a list of str, + # but we may have mojibake data, in which case this is an unparsed + # field. + if not valid_encoding: + unparsed[name] = value + continue + + raw_name = _EMAIL_TO_RAW_MAPPING.get(name) + if raw_name is None: + # This is a bit of a weird situation, we've encountered a key that + # we don't know what it means, so we don't know whether it's meant + # to be a list or not. + # + # Since we can't really tell one way or another, we'll just leave it + # as a list, even though it may be a single item list, because that's + # what makes the most sense for email headers. + unparsed[name] = value + continue + + # If this is one of our string fields, then we'll check to see if our + # value is a list of a single item. If it is then we'll assume that + # it was emitted as a single string, and unwrap the str from inside + # the list. + # + # If it's any other kind of data, then we haven't the faintest clue + # what we should parse it as, and we have to just add it to our list + # of unparsed stuff. + if raw_name in _STRING_FIELDS and len(value) == 1: + raw[raw_name] = value[0] + # If this is one of our list of string fields, then we can just assign + # the value, since email *only* has strings, and our get_all() call + # above ensures that this is a list. + elif raw_name in _LIST_FIELDS: + raw[raw_name] = value + # Special Case: Keywords + # The keywords field is implemented in the metadata spec as a str, + # but it conceptually is a list of strings, and is serialized using + # ", ".join(keywords), so we'll do some light data massaging to turn + # this into what it logically is. + elif raw_name == "keywords" and len(value) == 1: + raw[raw_name] = _parse_keywords(value[0]) + # Special Case: Project-URL + # The project urls is implemented in the metadata spec as a list of + # specially-formatted strings that represent a key and a value, which + # is fundamentally a mapping, however the email format doesn't support + # mappings in a sane way, so it was crammed into a list of strings + # instead. + # + # We will do a little light data massaging to turn this into a map as + # it logically should be. + elif raw_name == "project_urls": + try: + raw[raw_name] = _parse_project_urls(value) + except KeyError: + unparsed[name] = value + # Nothing that we've done has managed to parse this, so it'll just + # throw it in our unparseable data and move on. + else: + unparsed[name] = value + + # We need to support getting the Description from the message payload in + # addition to getting it from the the headers. This does mean, though, there + # is the possibility of it being set both ways, in which case we put both + # in 'unparsed' since we don't know which is right. + try: + payload = _get_payload(parsed, data) + except ValueError: + unparsed.setdefault("description", []).append( + parsed.get_payload(decode=isinstance(data, bytes)) + ) + else: + if payload: + # Check to see if we've already got a description, if so then both + # it, and this body move to unparseable. + if "description" in raw: + description_header = cast(str, raw.pop("description")) + unparsed.setdefault("description", []).extend( + [description_header, payload] + ) + elif "description" in unparsed: + unparsed["description"].append(payload) + else: + raw["description"] = payload + + # We need to cast our `raw` to a metadata, because a TypedDict only support + # literal key names, but we're computing our key names on purpose, but the + # way this function is implemented, our `TypedDict` can only have valid key + # names. + return cast(RawMetadata, raw), unparsed + + +_NOT_FOUND = object() + + +# Keep the two values in sync. +_VALID_METADATA_VERSIONS = ["1.0", "1.1", "1.2", "2.1", "2.2", "2.3"] +_MetadataVersion = Literal["1.0", "1.1", "1.2", "2.1", "2.2", "2.3"] + +_REQUIRED_ATTRS = frozenset(["metadata_version", "name", "version"]) + + +class _Validator(Generic[T]): + """Validate a metadata field. + + All _process_*() methods correspond to a core metadata field. The method is + called with the field's raw value. If the raw value is valid it is returned + in its "enriched" form (e.g. ``version.Version`` for the ``Version`` field). + If the raw value is invalid, :exc:`InvalidMetadata` is raised (with a cause + as appropriate). + """ + + name: str + raw_name: str + added: _MetadataVersion + + def __init__( + self, + *, + added: _MetadataVersion = "1.0", + ) -> None: + self.added = added + + def __set_name__(self, _owner: "Metadata", name: str) -> None: + self.name = name + self.raw_name = _RAW_TO_EMAIL_MAPPING[name] + + def __get__(self, instance: "Metadata", _owner: Type["Metadata"]) -> T: + # With Python 3.8, the caching can be replaced with functools.cached_property(). + # No need to check the cache as attribute lookup will resolve into the + # instance's __dict__ before __get__ is called. + cache = instance.__dict__ + value = instance._raw.get(self.name) + + # To make the _process_* methods easier, we'll check if the value is None + # and if this field is NOT a required attribute, and if both of those + # things are true, we'll skip the the converter. This will mean that the + # converters never have to deal with the None union. + if self.name in _REQUIRED_ATTRS or value is not None: + try: + converter: Callable[[Any], T] = getattr(self, f"_process_{self.name}") + except AttributeError: + pass + else: + value = converter(value) + + cache[self.name] = value + try: + del instance._raw[self.name] # type: ignore[misc] + except KeyError: + pass + + return cast(T, value) + + def _invalid_metadata( + self, msg: str, cause: Optional[Exception] = None + ) -> InvalidMetadata: + exc = InvalidMetadata( + self.raw_name, msg.format_map({"field": repr(self.raw_name)}) + ) + exc.__cause__ = cause + return exc + + def _process_metadata_version(self, value: str) -> _MetadataVersion: + # Implicitly makes Metadata-Version required. + if value not in _VALID_METADATA_VERSIONS: + raise self._invalid_metadata(f"{value!r} is not a valid metadata version") + return cast(_MetadataVersion, value) + + def _process_name(self, value: str) -> str: + if not value: + raise self._invalid_metadata("{field} is a required field") + # Validate the name as a side-effect. + try: + utils.canonicalize_name(value, validate=True) + except utils.InvalidName as exc: + raise self._invalid_metadata( + f"{value!r} is invalid for {{field}}", cause=exc + ) + else: + return value + + def _process_version(self, value: str) -> version_module.Version: + if not value: + raise self._invalid_metadata("{field} is a required field") + try: + return version_module.parse(value) + except version_module.InvalidVersion as exc: + raise self._invalid_metadata( + f"{value!r} is invalid for {{field}}", cause=exc + ) + + def _process_summary(self, value: str) -> str: + """Check the field contains no newlines.""" + if "\n" in value: + raise self._invalid_metadata("{field} must be a single line") + return value + + def _process_description_content_type(self, value: str) -> str: + content_types = {"text/plain", "text/x-rst", "text/markdown"} + message = email.message.EmailMessage() + message["content-type"] = value + + content_type, parameters = ( + # Defaults to `text/plain` if parsing failed. + message.get_content_type().lower(), + message["content-type"].params, + ) + # Check if content-type is valid or defaulted to `text/plain` and thus was + # not parseable. + if content_type not in content_types or content_type not in value.lower(): + raise self._invalid_metadata( + f"{{field}} must be one of {list(content_types)}, not {value!r}" + ) + + charset = parameters.get("charset", "UTF-8") + if charset != "UTF-8": + raise self._invalid_metadata( + f"{{field}} can only specify the UTF-8 charset, not {list(charset)}" + ) + + markdown_variants = {"GFM", "CommonMark"} + variant = parameters.get("variant", "GFM") # Use an acceptable default. + if content_type == "text/markdown" and variant not in markdown_variants: + raise self._invalid_metadata( + f"valid Markdown variants for {{field}} are {list(markdown_variants)}, " + f"not {variant!r}", + ) + return value + + def _process_dynamic(self, value: List[str]) -> List[str]: + for dynamic_field in map(str.lower, value): + if dynamic_field in {"name", "version", "metadata-version"}: + raise self._invalid_metadata( + f"{value!r} is not allowed as a dynamic field" + ) + elif dynamic_field not in _EMAIL_TO_RAW_MAPPING: + raise self._invalid_metadata(f"{value!r} is not a valid dynamic field") + return list(map(str.lower, value)) + + def _process_provides_extra( + self, + value: List[str], + ) -> List[utils.NormalizedName]: + normalized_names = [] + try: + for name in value: + normalized_names.append(utils.canonicalize_name(name, validate=True)) + except utils.InvalidName as exc: + raise self._invalid_metadata( + f"{name!r} is invalid for {{field}}", cause=exc + ) + else: + return normalized_names + + def _process_requires_python(self, value: str) -> specifiers.SpecifierSet: + try: + return specifiers.SpecifierSet(value) + except specifiers.InvalidSpecifier as exc: + raise self._invalid_metadata( + f"{value!r} is invalid for {{field}}", cause=exc + ) + + def _process_requires_dist( + self, + value: List[str], + ) -> List[requirements.Requirement]: + reqs = [] + try: + for req in value: + reqs.append(requirements.Requirement(req)) + except requirements.InvalidRequirement as exc: + raise self._invalid_metadata(f"{req!r} is invalid for {{field}}", cause=exc) + else: + return reqs + + +class Metadata: + """Representation of distribution metadata. + + Compared to :class:`RawMetadata`, this class provides objects representing + metadata fields instead of only using built-in types. Any invalid metadata + will cause :exc:`InvalidMetadata` to be raised (with a + :py:attr:`~BaseException.__cause__` attribute as appropriate). + """ + + _raw: RawMetadata + + @classmethod + def from_raw(cls, data: RawMetadata, *, validate: bool = True) -> "Metadata": + """Create an instance from :class:`RawMetadata`. + + If *validate* is true, all metadata will be validated. All exceptions + related to validation will be gathered and raised as an :class:`ExceptionGroup`. + """ + ins = cls() + ins._raw = data.copy() # Mutations occur due to caching enriched values. + + if validate: + exceptions: List[Exception] = [] + try: + metadata_version = ins.metadata_version + metadata_age = _VALID_METADATA_VERSIONS.index(metadata_version) + except InvalidMetadata as metadata_version_exc: + exceptions.append(metadata_version_exc) + metadata_version = None + + # Make sure to check for the fields that are present, the required + # fields (so their absence can be reported). + fields_to_check = frozenset(ins._raw) | _REQUIRED_ATTRS + # Remove fields that have already been checked. + fields_to_check -= {"metadata_version"} + + for key in fields_to_check: + try: + if metadata_version: + # Can't use getattr() as that triggers descriptor protocol which + # will fail due to no value for the instance argument. + try: + field_metadata_version = cls.__dict__[key].added + except KeyError: + exc = InvalidMetadata(key, f"unrecognized field: {key!r}") + exceptions.append(exc) + continue + field_age = _VALID_METADATA_VERSIONS.index( + field_metadata_version + ) + if field_age > metadata_age: + field = _RAW_TO_EMAIL_MAPPING[key] + exc = InvalidMetadata( + field, + "{field} introduced in metadata version " + "{field_metadata_version}, not {metadata_version}", + ) + exceptions.append(exc) + continue + getattr(ins, key) + except InvalidMetadata as exc: + exceptions.append(exc) + + if exceptions: + raise ExceptionGroup("invalid metadata", exceptions) + + return ins + + @classmethod + def from_email( + cls, data: Union[bytes, str], *, validate: bool = True + ) -> "Metadata": + """Parse metadata from email headers. + + If *validate* is true, the metadata will be validated. All exceptions + related to validation will be gathered and raised as an :class:`ExceptionGroup`. + """ + raw, unparsed = parse_email(data) + + if validate: + exceptions: list[Exception] = [] + for unparsed_key in unparsed: + if unparsed_key in _EMAIL_TO_RAW_MAPPING: + message = f"{unparsed_key!r} has invalid data" + else: + message = f"unrecognized field: {unparsed_key!r}" + exceptions.append(InvalidMetadata(unparsed_key, message)) + + if exceptions: + raise ExceptionGroup("unparsed", exceptions) + + try: + return cls.from_raw(raw, validate=validate) + except ExceptionGroup as exc_group: + raise ExceptionGroup( + "invalid or unparsed metadata", exc_group.exceptions + ) from None + + metadata_version: _Validator[_MetadataVersion] = _Validator() + """:external:ref:`core-metadata-metadata-version` + (required; validated to be a valid metadata version)""" + name: _Validator[str] = _Validator() + """:external:ref:`core-metadata-name` + (required; validated using :func:`~packaging.utils.canonicalize_name` and its + *validate* parameter)""" + version: _Validator[version_module.Version] = _Validator() + """:external:ref:`core-metadata-version` (required)""" + dynamic: _Validator[Optional[List[str]]] = _Validator( + added="2.2", + ) + """:external:ref:`core-metadata-dynamic` + (validated against core metadata field names and lowercased)""" + platforms: _Validator[Optional[List[str]]] = _Validator() + """:external:ref:`core-metadata-platform`""" + supported_platforms: _Validator[Optional[List[str]]] = _Validator(added="1.1") + """:external:ref:`core-metadata-supported-platform`""" + summary: _Validator[Optional[str]] = _Validator() + """:external:ref:`core-metadata-summary` (validated to contain no newlines)""" + description: _Validator[Optional[str]] = _Validator() # TODO 2.1: can be in body + """:external:ref:`core-metadata-description`""" + description_content_type: _Validator[Optional[str]] = _Validator(added="2.1") + """:external:ref:`core-metadata-description-content-type` (validated)""" + keywords: _Validator[Optional[List[str]]] = _Validator() + """:external:ref:`core-metadata-keywords`""" + home_page: _Validator[Optional[str]] = _Validator() + """:external:ref:`core-metadata-home-page`""" + download_url: _Validator[Optional[str]] = _Validator(added="1.1") + """:external:ref:`core-metadata-download-url`""" + author: _Validator[Optional[str]] = _Validator() + """:external:ref:`core-metadata-author`""" + author_email: _Validator[Optional[str]] = _Validator() + """:external:ref:`core-metadata-author-email`""" + maintainer: _Validator[Optional[str]] = _Validator(added="1.2") + """:external:ref:`core-metadata-maintainer`""" + maintainer_email: _Validator[Optional[str]] = _Validator(added="1.2") + """:external:ref:`core-metadata-maintainer-email`""" + license: _Validator[Optional[str]] = _Validator() + """:external:ref:`core-metadata-license`""" + classifiers: _Validator[Optional[List[str]]] = _Validator(added="1.1") + """:external:ref:`core-metadata-classifier`""" + requires_dist: _Validator[Optional[List[requirements.Requirement]]] = _Validator( + added="1.2" + ) + """:external:ref:`core-metadata-requires-dist`""" + requires_python: _Validator[Optional[specifiers.SpecifierSet]] = _Validator( + added="1.2" + ) + """:external:ref:`core-metadata-requires-python`""" + # Because `Requires-External` allows for non-PEP 440 version specifiers, we + # don't do any processing on the values. + requires_external: _Validator[Optional[List[str]]] = _Validator(added="1.2") + """:external:ref:`core-metadata-requires-external`""" + project_urls: _Validator[Optional[Dict[str, str]]] = _Validator(added="1.2") + """:external:ref:`core-metadata-project-url`""" + # PEP 685 lets us raise an error if an extra doesn't pass `Name` validation + # regardless of metadata version. + provides_extra: _Validator[Optional[List[utils.NormalizedName]]] = _Validator( + added="2.1", + ) + """:external:ref:`core-metadata-provides-extra`""" + provides_dist: _Validator[Optional[List[str]]] = _Validator(added="1.2") + """:external:ref:`core-metadata-provides-dist`""" + obsoletes_dist: _Validator[Optional[List[str]]] = _Validator(added="1.2") + """:external:ref:`core-metadata-obsoletes-dist`""" + requires: _Validator[Optional[List[str]]] = _Validator(added="1.1") + """``Requires`` (deprecated)""" + provides: _Validator[Optional[List[str]]] = _Validator(added="1.1") + """``Provides`` (deprecated)""" + obsoletes: _Validator[Optional[List[str]]] = _Validator(added="1.1") + """``Obsoletes`` (deprecated)""" diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/py.typed b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/py.typed new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/requirements.py b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/requirements.py new file mode 100644 index 00000000000000..0c00eba331b736 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/requirements.py @@ -0,0 +1,90 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from typing import Any, Iterator, Optional, Set + +from ._parser import parse_requirement as _parse_requirement +from ._tokenizer import ParserSyntaxError +from .markers import Marker, _normalize_extra_values +from .specifiers import SpecifierSet +from .utils import canonicalize_name + + +class InvalidRequirement(ValueError): + """ + An invalid requirement was found, users should refer to PEP 508. + """ + + +class Requirement: + """Parse a requirement. + + Parse a given requirement string into its parts, such as name, specifier, + URL, and extras. Raises InvalidRequirement on a badly-formed requirement + string. + """ + + # TODO: Can we test whether something is contained within a requirement? + # If so how do we do that? Do we need to test against the _name_ of + # the thing as well as the version? What about the markers? + # TODO: Can we normalize the name and extra name? + + def __init__(self, requirement_string: str) -> None: + try: + parsed = _parse_requirement(requirement_string) + except ParserSyntaxError as e: + raise InvalidRequirement(str(e)) from e + + self.name: str = parsed.name + self.url: Optional[str] = parsed.url or None + self.extras: Set[str] = set(parsed.extras if parsed.extras else []) + self.specifier: SpecifierSet = SpecifierSet(parsed.specifier) + self.marker: Optional[Marker] = None + if parsed.marker is not None: + self.marker = Marker.__new__(Marker) + self.marker._markers = _normalize_extra_values(parsed.marker) + + def _iter_parts(self, name: str) -> Iterator[str]: + yield name + + if self.extras: + formatted_extras = ",".join(sorted(self.extras)) + yield f"[{formatted_extras}]" + + if self.specifier: + yield str(self.specifier) + + if self.url: + yield f"@ {self.url}" + if self.marker: + yield " " + + if self.marker: + yield f"; {self.marker}" + + def __str__(self) -> str: + return "".join(self._iter_parts(self.name)) + + def __repr__(self) -> str: + return f"" + + def __hash__(self) -> int: + return hash( + ( + self.__class__.__name__, + *self._iter_parts(canonicalize_name(self.name)), + ) + ) + + def __eq__(self, other: Any) -> bool: + if not isinstance(other, Requirement): + return NotImplemented + + return ( + canonicalize_name(self.name) == canonicalize_name(other.name) + and self.extras == other.extras + and self.specifier == other.specifier + and self.url == other.url + and self.marker == other.marker + ) diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/specifiers.py b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/specifiers.py new file mode 100644 index 00000000000000..94448327ae2d44 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/specifiers.py @@ -0,0 +1,1030 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +""" +.. testsetup:: + + from packaging.specifiers import Specifier, SpecifierSet, InvalidSpecifier + from packaging.version import Version +""" + +import abc +import itertools +import re +from typing import ( + Callable, + Iterable, + Iterator, + List, + Optional, + Set, + Tuple, + TypeVar, + Union, +) + +from .utils import canonicalize_version +from .version import Version + +UnparsedVersion = Union[Version, str] +UnparsedVersionVar = TypeVar("UnparsedVersionVar", bound=UnparsedVersion) +CallableOperator = Callable[[Version, str], bool] + + +def _coerce_version(version: UnparsedVersion) -> Version: + if not isinstance(version, Version): + version = Version(version) + return version + + +class InvalidSpecifier(ValueError): + """ + Raised when attempting to create a :class:`Specifier` with a specifier + string that is invalid. + + >>> Specifier("lolwat") + Traceback (most recent call last): + ... + packaging.specifiers.InvalidSpecifier: Invalid specifier: 'lolwat' + """ + + +class BaseSpecifier(metaclass=abc.ABCMeta): + @abc.abstractmethod + def __str__(self) -> str: + """ + Returns the str representation of this Specifier-like object. This + should be representative of the Specifier itself. + """ + + @abc.abstractmethod + def __hash__(self) -> int: + """ + Returns a hash value for this Specifier-like object. + """ + + @abc.abstractmethod + def __eq__(self, other: object) -> bool: + """ + Returns a boolean representing whether or not the two Specifier-like + objects are equal. + + :param other: The other object to check against. + """ + + @property + @abc.abstractmethod + def prereleases(self) -> Optional[bool]: + """Whether or not pre-releases as a whole are allowed. + + This can be set to either ``True`` or ``False`` to explicitly enable or disable + prereleases or it can be set to ``None`` (the default) to use default semantics. + """ + + @prereleases.setter + def prereleases(self, value: bool) -> None: + """Setter for :attr:`prereleases`. + + :param value: The value to set. + """ + + @abc.abstractmethod + def contains(self, item: str, prereleases: Optional[bool] = None) -> bool: + """ + Determines if the given item is contained within this specifier. + """ + + @abc.abstractmethod + def filter( + self, iterable: Iterable[UnparsedVersionVar], prereleases: Optional[bool] = None + ) -> Iterator[UnparsedVersionVar]: + """ + Takes an iterable of items and filters them so that only items which + are contained within this specifier are allowed in it. + """ + + +class Specifier(BaseSpecifier): + """This class abstracts handling of version specifiers. + + .. tip:: + + It is generally not required to instantiate this manually. You should instead + prefer to work with :class:`SpecifierSet` instead, which can parse + comma-separated version specifiers (which is what package metadata contains). + """ + + _operator_regex_str = r""" + (?P(~=|==|!=|<=|>=|<|>|===)) + """ + _version_regex_str = r""" + (?P + (?: + # The identity operators allow for an escape hatch that will + # do an exact string match of the version you wish to install. + # This will not be parsed by PEP 440 and we cannot determine + # any semantic meaning from it. This operator is discouraged + # but included entirely as an escape hatch. + (?<====) # Only match for the identity operator + \s* + [^\s;)]* # The arbitrary version can be just about anything, + # we match everything except for whitespace, a + # semi-colon for marker support, and a closing paren + # since versions can be enclosed in them. + ) + | + (?: + # The (non)equality operators allow for wild card and local + # versions to be specified so we have to define these two + # operators separately to enable that. + (?<===|!=) # Only match for equals and not equals + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + + # You cannot use a wild card and a pre-release, post-release, a dev or + # local version together so group them with a | and make them optional. + (?: + \.\* # Wild card syntax of .* + | + (?: # pre release + [-_\.]? + (alpha|beta|preview|pre|a|b|c|rc) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local + )? + ) + | + (?: + # The compatible operator requires at least two digits in the + # release segment. + (?<=~=) # Only match for the compatible operator + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) + (?: # pre release + [-_\.]? + (alpha|beta|preview|pre|a|b|c|rc) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + | + (?: + # All other operators only allow a sub set of what the + # (non)equality operators do. Specifically they do not allow + # local versions to be specified nor do they allow the prefix + # matching wild cards. + (?=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + "===": "arbitrary", + } + + def __init__(self, spec: str = "", prereleases: Optional[bool] = None) -> None: + """Initialize a Specifier instance. + + :param spec: + The string representation of a specifier which will be parsed and + normalized before use. + :param prereleases: + This tells the specifier if it should accept prerelease versions if + applicable or not. The default of ``None`` will autodetect it from the + given specifiers. + :raises InvalidSpecifier: + If the given specifier is invalid (i.e. bad syntax). + """ + match = self._regex.search(spec) + if not match: + raise InvalidSpecifier(f"Invalid specifier: '{spec}'") + + self._spec: Tuple[str, str] = ( + match.group("operator").strip(), + match.group("version").strip(), + ) + + # Store whether or not this Specifier should accept prereleases + self._prereleases = prereleases + + # https://github.com/python/mypy/pull/13475#pullrequestreview-1079784515 + @property # type: ignore[override] + def prereleases(self) -> bool: + # If there is an explicit prereleases set for this, then we'll just + # blindly use that. + if self._prereleases is not None: + return self._prereleases + + # Look at all of our specifiers and determine if they are inclusive + # operators, and if they are if they are including an explicit + # prerelease. + operator, version = self._spec + if operator in ["==", ">=", "<=", "~=", "==="]: + # The == specifier can include a trailing .*, if it does we + # want to remove before parsing. + if operator == "==" and version.endswith(".*"): + version = version[:-2] + + # Parse the version, and if it is a pre-release than this + # specifier allows pre-releases. + if Version(version).is_prerelease: + return True + + return False + + @prereleases.setter + def prereleases(self, value: bool) -> None: + self._prereleases = value + + @property + def operator(self) -> str: + """The operator of this specifier. + + >>> Specifier("==1.2.3").operator + '==' + """ + return self._spec[0] + + @property + def version(self) -> str: + """The version of this specifier. + + >>> Specifier("==1.2.3").version + '1.2.3' + """ + return self._spec[1] + + def __repr__(self) -> str: + """A representation of the Specifier that shows all internal state. + + >>> Specifier('>=1.0.0') + =1.0.0')> + >>> Specifier('>=1.0.0', prereleases=False) + =1.0.0', prereleases=False)> + >>> Specifier('>=1.0.0', prereleases=True) + =1.0.0', prereleases=True)> + """ + pre = ( + f", prereleases={self.prereleases!r}" + if self._prereleases is not None + else "" + ) + + return f"<{self.__class__.__name__}({str(self)!r}{pre})>" + + def __str__(self) -> str: + """A string representation of the Specifier that can be round-tripped. + + >>> str(Specifier('>=1.0.0')) + '>=1.0.0' + >>> str(Specifier('>=1.0.0', prereleases=False)) + '>=1.0.0' + """ + return "{}{}".format(*self._spec) + + @property + def _canonical_spec(self) -> Tuple[str, str]: + canonical_version = canonicalize_version( + self._spec[1], + strip_trailing_zero=(self._spec[0] != "~="), + ) + return self._spec[0], canonical_version + + def __hash__(self) -> int: + return hash(self._canonical_spec) + + def __eq__(self, other: object) -> bool: + """Whether or not the two Specifier-like objects are equal. + + :param other: The other object to check against. + + The value of :attr:`prereleases` is ignored. + + >>> Specifier("==1.2.3") == Specifier("== 1.2.3.0") + True + >>> (Specifier("==1.2.3", prereleases=False) == + ... Specifier("==1.2.3", prereleases=True)) + True + >>> Specifier("==1.2.3") == "==1.2.3" + True + >>> Specifier("==1.2.3") == Specifier("==1.2.4") + False + >>> Specifier("==1.2.3") == Specifier("~=1.2.3") + False + """ + if isinstance(other, str): + try: + other = self.__class__(str(other)) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._canonical_spec == other._canonical_spec + + def _get_operator(self, op: str) -> CallableOperator: + operator_callable: CallableOperator = getattr( + self, f"_compare_{self._operators[op]}" + ) + return operator_callable + + def _compare_compatible(self, prospective: Version, spec: str) -> bool: + + # Compatible releases have an equivalent combination of >= and ==. That + # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to + # implement this in terms of the other specifiers instead of + # implementing it ourselves. The only thing we need to do is construct + # the other specifiers. + + # We want everything but the last item in the version, but we want to + # ignore suffix segments. + prefix = _version_join( + list(itertools.takewhile(_is_not_suffix, _version_split(spec)))[:-1] + ) + + # Add the prefix notation to the end of our string + prefix += ".*" + + return self._get_operator(">=")(prospective, spec) and self._get_operator("==")( + prospective, prefix + ) + + def _compare_equal(self, prospective: Version, spec: str) -> bool: + + # We need special logic to handle prefix matching + if spec.endswith(".*"): + # In the case of prefix matching we want to ignore local segment. + normalized_prospective = canonicalize_version( + prospective.public, strip_trailing_zero=False + ) + # Get the normalized version string ignoring the trailing .* + normalized_spec = canonicalize_version(spec[:-2], strip_trailing_zero=False) + # Split the spec out by bangs and dots, and pretend that there is + # an implicit dot in between a release segment and a pre-release segment. + split_spec = _version_split(normalized_spec) + + # Split the prospective version out by bangs and dots, and pretend + # that there is an implicit dot in between a release segment and + # a pre-release segment. + split_prospective = _version_split(normalized_prospective) + + # 0-pad the prospective version before shortening it to get the correct + # shortened version. + padded_prospective, _ = _pad_version(split_prospective, split_spec) + + # Shorten the prospective version to be the same length as the spec + # so that we can determine if the specifier is a prefix of the + # prospective version or not. + shortened_prospective = padded_prospective[: len(split_spec)] + + return shortened_prospective == split_spec + else: + # Convert our spec string into a Version + spec_version = Version(spec) + + # If the specifier does not have a local segment, then we want to + # act as if the prospective version also does not have a local + # segment. + if not spec_version.local: + prospective = Version(prospective.public) + + return prospective == spec_version + + def _compare_not_equal(self, prospective: Version, spec: str) -> bool: + return not self._compare_equal(prospective, spec) + + def _compare_less_than_equal(self, prospective: Version, spec: str) -> bool: + + # NB: Local version identifiers are NOT permitted in the version + # specifier, so local version labels can be universally removed from + # the prospective version. + return Version(prospective.public) <= Version(spec) + + def _compare_greater_than_equal(self, prospective: Version, spec: str) -> bool: + + # NB: Local version identifiers are NOT permitted in the version + # specifier, so local version labels can be universally removed from + # the prospective version. + return Version(prospective.public) >= Version(spec) + + def _compare_less_than(self, prospective: Version, spec_str: str) -> bool: + + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec_str) + + # Check to see if the prospective version is less than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective < spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a pre-release version, that we do not accept pre-release + # versions for the version mentioned in the specifier (e.g. <3.1 should + # not match 3.1.dev0, but should match 3.0.dev0). + if not spec.is_prerelease and prospective.is_prerelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # less than the spec version *and* it's not a pre-release of the same + # version in the spec. + return True + + def _compare_greater_than(self, prospective: Version, spec_str: str) -> bool: + + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec_str) + + # Check to see if the prospective version is greater than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective > spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a post-release version, that we do not accept + # post-release versions for the version mentioned in the specifier + # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). + if not spec.is_postrelease and prospective.is_postrelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # Ensure that we do not allow a local version of the version mentioned + # in the specifier, which is technically greater than, to match. + if prospective.local is not None: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # greater than the spec version *and* it's not a pre-release of the + # same version in the spec. + return True + + def _compare_arbitrary(self, prospective: Version, spec: str) -> bool: + return str(prospective).lower() == str(spec).lower() + + def __contains__(self, item: Union[str, Version]) -> bool: + """Return whether or not the item is contained in this specifier. + + :param item: The item to check for. + + This is used for the ``in`` operator and behaves the same as + :meth:`contains` with no ``prereleases`` argument passed. + + >>> "1.2.3" in Specifier(">=1.2.3") + True + >>> Version("1.2.3") in Specifier(">=1.2.3") + True + >>> "1.0.0" in Specifier(">=1.2.3") + False + >>> "1.3.0a1" in Specifier(">=1.2.3") + False + >>> "1.3.0a1" in Specifier(">=1.2.3", prereleases=True) + True + """ + return self.contains(item) + + def contains( + self, item: UnparsedVersion, prereleases: Optional[bool] = None + ) -> bool: + """Return whether or not the item is contained in this specifier. + + :param item: + The item to check for, which can be a version string or a + :class:`Version` instance. + :param prereleases: + Whether or not to match prereleases with this Specifier. If set to + ``None`` (the default), it uses :attr:`prereleases` to determine + whether or not prereleases are allowed. + + >>> Specifier(">=1.2.3").contains("1.2.3") + True + >>> Specifier(">=1.2.3").contains(Version("1.2.3")) + True + >>> Specifier(">=1.2.3").contains("1.0.0") + False + >>> Specifier(">=1.2.3").contains("1.3.0a1") + False + >>> Specifier(">=1.2.3", prereleases=True).contains("1.3.0a1") + True + >>> Specifier(">=1.2.3").contains("1.3.0a1", prereleases=True) + True + """ + + # Determine if prereleases are to be allowed or not. + if prereleases is None: + prereleases = self.prereleases + + # Normalize item to a Version, this allows us to have a shortcut for + # "2.0" in Specifier(">=2") + normalized_item = _coerce_version(item) + + # Determine if we should be supporting prereleases in this specifier + # or not, if we do not support prereleases than we can short circuit + # logic if this version is a prereleases. + if normalized_item.is_prerelease and not prereleases: + return False + + # Actually do the comparison to determine if this item is contained + # within this Specifier or not. + operator_callable: CallableOperator = self._get_operator(self.operator) + return operator_callable(normalized_item, self.version) + + def filter( + self, iterable: Iterable[UnparsedVersionVar], prereleases: Optional[bool] = None + ) -> Iterator[UnparsedVersionVar]: + """Filter items in the given iterable, that match the specifier. + + :param iterable: + An iterable that can contain version strings and :class:`Version` instances. + The items in the iterable will be filtered according to the specifier. + :param prereleases: + Whether or not to allow prereleases in the returned iterator. If set to + ``None`` (the default), it will be intelligently decide whether to allow + prereleases or not (based on the :attr:`prereleases` attribute, and + whether the only versions matching are prereleases). + + This method is smarter than just ``filter(Specifier().contains, [...])`` + because it implements the rule from :pep:`440` that a prerelease item + SHOULD be accepted if no other versions match the given specifier. + + >>> list(Specifier(">=1.2.3").filter(["1.2", "1.3", "1.5a1"])) + ['1.3'] + >>> list(Specifier(">=1.2.3").filter(["1.2", "1.2.3", "1.3", Version("1.4")])) + ['1.2.3', '1.3', ] + >>> list(Specifier(">=1.2.3").filter(["1.2", "1.5a1"])) + ['1.5a1'] + >>> list(Specifier(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True)) + ['1.3', '1.5a1'] + >>> list(Specifier(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"])) + ['1.3', '1.5a1'] + """ + + yielded = False + found_prereleases = [] + + kw = {"prereleases": prereleases if prereleases is not None else True} + + # Attempt to iterate over all the values in the iterable and if any of + # them match, yield them. + for version in iterable: + parsed_version = _coerce_version(version) + + if self.contains(parsed_version, **kw): + # If our version is a prerelease, and we were not set to allow + # prereleases, then we'll store it for later in case nothing + # else matches this specifier. + if parsed_version.is_prerelease and not ( + prereleases or self.prereleases + ): + found_prereleases.append(version) + # Either this is not a prerelease, or we should have been + # accepting prereleases from the beginning. + else: + yielded = True + yield version + + # Now that we've iterated over everything, determine if we've yielded + # any values, and if we have not and we have any prereleases stored up + # then we will go ahead and yield the prereleases. + if not yielded and found_prereleases: + for version in found_prereleases: + yield version + + +_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") + + +def _version_split(version: str) -> List[str]: + """Split version into components. + + The split components are intended for version comparison. The logic does + not attempt to retain the original version string, so joining the + components back with :func:`_version_join` may not produce the original + version string. + """ + result: List[str] = [] + + epoch, _, rest = version.rpartition("!") + result.append(epoch or "0") + + for item in rest.split("."): + match = _prefix_regex.search(item) + if match: + result.extend(match.groups()) + else: + result.append(item) + return result + + +def _version_join(components: List[str]) -> str: + """Join split version components into a version string. + + This function assumes the input came from :func:`_version_split`, where the + first component must be the epoch (either empty or numeric), and all other + components numeric. + """ + epoch, *rest = components + return f"{epoch}!{'.'.join(rest)}" + + +def _is_not_suffix(segment: str) -> bool: + return not any( + segment.startswith(prefix) for prefix in ("dev", "a", "b", "rc", "post") + ) + + +def _pad_version(left: List[str], right: List[str]) -> Tuple[List[str], List[str]]: + left_split, right_split = [], [] + + # Get the release segment of our versions + left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) + right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) + + # Get the rest of our versions + left_split.append(left[len(left_split[0]) :]) + right_split.append(right[len(right_split[0]) :]) + + # Insert our padding + left_split.insert(1, ["0"] * max(0, len(right_split[0]) - len(left_split[0]))) + right_split.insert(1, ["0"] * max(0, len(left_split[0]) - len(right_split[0]))) + + return (list(itertools.chain(*left_split)), list(itertools.chain(*right_split))) + + +class SpecifierSet(BaseSpecifier): + """This class abstracts handling of a set of version specifiers. + + It can be passed a single specifier (``>=3.0``), a comma-separated list of + specifiers (``>=3.0,!=3.1``), or no specifier at all. + """ + + def __init__( + self, specifiers: str = "", prereleases: Optional[bool] = None + ) -> None: + """Initialize a SpecifierSet instance. + + :param specifiers: + The string representation of a specifier or a comma-separated list of + specifiers which will be parsed and normalized before use. + :param prereleases: + This tells the SpecifierSet if it should accept prerelease versions if + applicable or not. The default of ``None`` will autodetect it from the + given specifiers. + + :raises InvalidSpecifier: + If the given ``specifiers`` are not parseable than this exception will be + raised. + """ + + # Split on `,` to break each individual specifier into it's own item, and + # strip each item to remove leading/trailing whitespace. + split_specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] + + # Parsed each individual specifier, attempting first to make it a + # Specifier. + parsed: Set[Specifier] = set() + for specifier in split_specifiers: + parsed.add(Specifier(specifier)) + + # Turn our parsed specifiers into a frozen set and save them for later. + self._specs = frozenset(parsed) + + # Store our prereleases value so we can use it later to determine if + # we accept prereleases or not. + self._prereleases = prereleases + + @property + def prereleases(self) -> Optional[bool]: + # If we have been given an explicit prerelease modifier, then we'll + # pass that through here. + if self._prereleases is not None: + return self._prereleases + + # If we don't have any specifiers, and we don't have a forced value, + # then we'll just return None since we don't know if this should have + # pre-releases or not. + if not self._specs: + return None + + # Otherwise we'll see if any of the given specifiers accept + # prereleases, if any of them do we'll return True, otherwise False. + return any(s.prereleases for s in self._specs) + + @prereleases.setter + def prereleases(self, value: bool) -> None: + self._prereleases = value + + def __repr__(self) -> str: + """A representation of the specifier set that shows all internal state. + + Note that the ordering of the individual specifiers within the set may not + match the input string. + + >>> SpecifierSet('>=1.0.0,!=2.0.0') + =1.0.0')> + >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=False) + =1.0.0', prereleases=False)> + >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=True) + =1.0.0', prereleases=True)> + """ + pre = ( + f", prereleases={self.prereleases!r}" + if self._prereleases is not None + else "" + ) + + return f"" + + def __str__(self) -> str: + """A string representation of the specifier set that can be round-tripped. + + Note that the ordering of the individual specifiers within the set may not + match the input string. + + >>> str(SpecifierSet(">=1.0.0,!=1.0.1")) + '!=1.0.1,>=1.0.0' + >>> str(SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False)) + '!=1.0.1,>=1.0.0' + """ + return ",".join(sorted(str(s) for s in self._specs)) + + def __hash__(self) -> int: + return hash(self._specs) + + def __and__(self, other: Union["SpecifierSet", str]) -> "SpecifierSet": + """Return a SpecifierSet which is a combination of the two sets. + + :param other: The other object to combine with. + + >>> SpecifierSet(">=1.0.0,!=1.0.1") & '<=2.0.0,!=2.0.1' + =1.0.0')> + >>> SpecifierSet(">=1.0.0,!=1.0.1") & SpecifierSet('<=2.0.0,!=2.0.1') + =1.0.0')> + """ + if isinstance(other, str): + other = SpecifierSet(other) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + specifier = SpecifierSet() + specifier._specs = frozenset(self._specs | other._specs) + + if self._prereleases is None and other._prereleases is not None: + specifier._prereleases = other._prereleases + elif self._prereleases is not None and other._prereleases is None: + specifier._prereleases = self._prereleases + elif self._prereleases == other._prereleases: + specifier._prereleases = self._prereleases + else: + raise ValueError( + "Cannot combine SpecifierSets with True and False prerelease " + "overrides." + ) + + return specifier + + def __eq__(self, other: object) -> bool: + """Whether or not the two SpecifierSet-like objects are equal. + + :param other: The other object to check against. + + The value of :attr:`prereleases` is ignored. + + >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.1") + True + >>> (SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False) == + ... SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True)) + True + >>> SpecifierSet(">=1.0.0,!=1.0.1") == ">=1.0.0,!=1.0.1" + True + >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0") + False + >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.2") + False + """ + if isinstance(other, (str, Specifier)): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs == other._specs + + def __len__(self) -> int: + """Returns the number of specifiers in this specifier set.""" + return len(self._specs) + + def __iter__(self) -> Iterator[Specifier]: + """ + Returns an iterator over all the underlying :class:`Specifier` instances + in this specifier set. + + >>> sorted(SpecifierSet(">=1.0.0,!=1.0.1"), key=str) + [, =1.0.0')>] + """ + return iter(self._specs) + + def __contains__(self, item: UnparsedVersion) -> bool: + """Return whether or not the item is contained in this specifier. + + :param item: The item to check for. + + This is used for the ``in`` operator and behaves the same as + :meth:`contains` with no ``prereleases`` argument passed. + + >>> "1.2.3" in SpecifierSet(">=1.0.0,!=1.0.1") + True + >>> Version("1.2.3") in SpecifierSet(">=1.0.0,!=1.0.1") + True + >>> "1.0.1" in SpecifierSet(">=1.0.0,!=1.0.1") + False + >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1") + False + >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True) + True + """ + return self.contains(item) + + def contains( + self, + item: UnparsedVersion, + prereleases: Optional[bool] = None, + installed: Optional[bool] = None, + ) -> bool: + """Return whether or not the item is contained in this SpecifierSet. + + :param item: + The item to check for, which can be a version string or a + :class:`Version` instance. + :param prereleases: + Whether or not to match prereleases with this SpecifierSet. If set to + ``None`` (the default), it uses :attr:`prereleases` to determine + whether or not prereleases are allowed. + + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.2.3") + True + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains(Version("1.2.3")) + True + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.0.1") + False + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1") + False + >>> SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True).contains("1.3.0a1") + True + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1", prereleases=True) + True + """ + # Ensure that our item is a Version instance. + if not isinstance(item, Version): + item = Version(item) + + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # We can determine if we're going to allow pre-releases by looking to + # see if any of the underlying items supports them. If none of them do + # and this item is a pre-release then we do not allow it and we can + # short circuit that here. + # Note: This means that 1.0.dev1 would not be contained in something + # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 + if not prereleases and item.is_prerelease: + return False + + if installed and item.is_prerelease: + item = Version(item.base_version) + + # We simply dispatch to the underlying specs here to make sure that the + # given version is contained within all of them. + # Note: This use of all() here means that an empty set of specifiers + # will always return True, this is an explicit design decision. + return all(s.contains(item, prereleases=prereleases) for s in self._specs) + + def filter( + self, iterable: Iterable[UnparsedVersionVar], prereleases: Optional[bool] = None + ) -> Iterator[UnparsedVersionVar]: + """Filter items in the given iterable, that match the specifiers in this set. + + :param iterable: + An iterable that can contain version strings and :class:`Version` instances. + The items in the iterable will be filtered according to the specifier. + :param prereleases: + Whether or not to allow prereleases in the returned iterator. If set to + ``None`` (the default), it will be intelligently decide whether to allow + prereleases or not (based on the :attr:`prereleases` attribute, and + whether the only versions matching are prereleases). + + This method is smarter than just ``filter(SpecifierSet(...).contains, [...])`` + because it implements the rule from :pep:`440` that a prerelease item + SHOULD be accepted if no other versions match the given specifier. + + >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", "1.5a1"])) + ['1.3'] + >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", Version("1.4")])) + ['1.3', ] + >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.5a1"])) + [] + >>> list(SpecifierSet(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True)) + ['1.3', '1.5a1'] + >>> list(SpecifierSet(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"])) + ['1.3', '1.5a1'] + + An "empty" SpecifierSet will filter items based on the presence of prerelease + versions in the set. + + >>> list(SpecifierSet("").filter(["1.3", "1.5a1"])) + ['1.3'] + >>> list(SpecifierSet("").filter(["1.5a1"])) + ['1.5a1'] + >>> list(SpecifierSet("", prereleases=True).filter(["1.3", "1.5a1"])) + ['1.3', '1.5a1'] + >>> list(SpecifierSet("").filter(["1.3", "1.5a1"], prereleases=True)) + ['1.3', '1.5a1'] + """ + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # If we have any specifiers, then we want to wrap our iterable in the + # filter method for each one, this will act as a logical AND amongst + # each specifier. + if self._specs: + for spec in self._specs: + iterable = spec.filter(iterable, prereleases=bool(prereleases)) + return iter(iterable) + # If we do not have any specifiers, then we need to have a rough filter + # which will filter out any pre-releases, unless there are no final + # releases. + else: + filtered: List[UnparsedVersionVar] = [] + found_prereleases: List[UnparsedVersionVar] = [] + + for item in iterable: + parsed_version = _coerce_version(item) + + # Store any item which is a pre-release for later unless we've + # already found a final version or we are accepting prereleases + if parsed_version.is_prerelease and not prereleases: + if not filtered: + found_prereleases.append(item) + else: + filtered.append(item) + + # If we've found no items except for pre-releases, then we'll go + # ahead and use the pre-releases + if not filtered and found_prereleases and prereleases is None: + return iter(found_prereleases) + + return iter(filtered) diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/tags.py b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/tags.py new file mode 100644 index 00000000000000..37f33b1ef849ed --- /dev/null +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/tags.py @@ -0,0 +1,553 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +import logging +import platform +import struct +import subprocess +import sys +import sysconfig +from importlib.machinery import EXTENSION_SUFFIXES +from typing import ( + Dict, + FrozenSet, + Iterable, + Iterator, + List, + Optional, + Sequence, + Tuple, + Union, + cast, +) + +from . import _manylinux, _musllinux + +logger = logging.getLogger(__name__) + +PythonVersion = Sequence[int] +MacVersion = Tuple[int, int] + +INTERPRETER_SHORT_NAMES: Dict[str, str] = { + "python": "py", # Generic. + "cpython": "cp", + "pypy": "pp", + "ironpython": "ip", + "jython": "jy", +} + + +_32_BIT_INTERPRETER = struct.calcsize("P") == 4 + + +class Tag: + """ + A representation of the tag triple for a wheel. + + Instances are considered immutable and thus are hashable. Equality checking + is also supported. + """ + + __slots__ = ["_interpreter", "_abi", "_platform", "_hash"] + + def __init__(self, interpreter: str, abi: str, platform: str) -> None: + self._interpreter = interpreter.lower() + self._abi = abi.lower() + self._platform = platform.lower() + # The __hash__ of every single element in a Set[Tag] will be evaluated each time + # that a set calls its `.disjoint()` method, which may be called hundreds of + # times when scanning a page of links for packages with tags matching that + # Set[Tag]. Pre-computing the value here produces significant speedups for + # downstream consumers. + self._hash = hash((self._interpreter, self._abi, self._platform)) + + @property + def interpreter(self) -> str: + return self._interpreter + + @property + def abi(self) -> str: + return self._abi + + @property + def platform(self) -> str: + return self._platform + + def __eq__(self, other: object) -> bool: + if not isinstance(other, Tag): + return NotImplemented + + return ( + (self._hash == other._hash) # Short-circuit ASAP for perf reasons. + and (self._platform == other._platform) + and (self._abi == other._abi) + and (self._interpreter == other._interpreter) + ) + + def __hash__(self) -> int: + return self._hash + + def __str__(self) -> str: + return f"{self._interpreter}-{self._abi}-{self._platform}" + + def __repr__(self) -> str: + return f"<{self} @ {id(self)}>" + + +def parse_tag(tag: str) -> FrozenSet[Tag]: + """ + Parses the provided tag (e.g. `py3-none-any`) into a frozenset of Tag instances. + + Returning a set is required due to the possibility that the tag is a + compressed tag set. + """ + tags = set() + interpreters, abis, platforms = tag.split("-") + for interpreter in interpreters.split("."): + for abi in abis.split("."): + for platform_ in platforms.split("."): + tags.add(Tag(interpreter, abi, platform_)) + return frozenset(tags) + + +def _get_config_var(name: str, warn: bool = False) -> Union[int, str, None]: + value: Union[int, str, None] = sysconfig.get_config_var(name) + if value is None and warn: + logger.debug( + "Config variable '%s' is unset, Python ABI tag may be incorrect", name + ) + return value + + +def _normalize_string(string: str) -> str: + return string.replace(".", "_").replace("-", "_").replace(" ", "_") + + +def _abi3_applies(python_version: PythonVersion) -> bool: + """ + Determine if the Python version supports abi3. + + PEP 384 was first implemented in Python 3.2. + """ + return len(python_version) > 1 and tuple(python_version) >= (3, 2) + + +def _cpython_abis(py_version: PythonVersion, warn: bool = False) -> List[str]: + py_version = tuple(py_version) # To allow for version comparison. + abis = [] + version = _version_nodot(py_version[:2]) + debug = pymalloc = ucs4 = "" + with_debug = _get_config_var("Py_DEBUG", warn) + has_refcount = hasattr(sys, "gettotalrefcount") + # Windows doesn't set Py_DEBUG, so checking for support of debug-compiled + # extension modules is the best option. + # https://github.com/pypa/pip/issues/3383#issuecomment-173267692 + has_ext = "_d.pyd" in EXTENSION_SUFFIXES + if with_debug or (with_debug is None and (has_refcount or has_ext)): + debug = "d" + if py_version < (3, 8): + with_pymalloc = _get_config_var("WITH_PYMALLOC", warn) + if with_pymalloc or with_pymalloc is None: + pymalloc = "m" + if py_version < (3, 3): + unicode_size = _get_config_var("Py_UNICODE_SIZE", warn) + if unicode_size == 4 or ( + unicode_size is None and sys.maxunicode == 0x10FFFF + ): + ucs4 = "u" + elif debug: + # Debug builds can also load "normal" extension modules. + # We can also assume no UCS-4 or pymalloc requirement. + abis.append(f"cp{version}") + abis.insert( + 0, + "cp{version}{debug}{pymalloc}{ucs4}".format( + version=version, debug=debug, pymalloc=pymalloc, ucs4=ucs4 + ), + ) + return abis + + +def cpython_tags( + python_version: Optional[PythonVersion] = None, + abis: Optional[Iterable[str]] = None, + platforms: Optional[Iterable[str]] = None, + *, + warn: bool = False, +) -> Iterator[Tag]: + """ + Yields the tags for a CPython interpreter. + + The tags consist of: + - cp-- + - cp-abi3- + - cp-none- + - cp-abi3- # Older Python versions down to 3.2. + + If python_version only specifies a major version then user-provided ABIs and + the 'none' ABItag will be used. + + If 'abi3' or 'none' are specified in 'abis' then they will be yielded at + their normal position and not at the beginning. + """ + if not python_version: + python_version = sys.version_info[:2] + + interpreter = f"cp{_version_nodot(python_version[:2])}" + + if abis is None: + if len(python_version) > 1: + abis = _cpython_abis(python_version, warn) + else: + abis = [] + abis = list(abis) + # 'abi3' and 'none' are explicitly handled later. + for explicit_abi in ("abi3", "none"): + try: + abis.remove(explicit_abi) + except ValueError: + pass + + platforms = list(platforms or platform_tags()) + for abi in abis: + for platform_ in platforms: + yield Tag(interpreter, abi, platform_) + if _abi3_applies(python_version): + yield from (Tag(interpreter, "abi3", platform_) for platform_ in platforms) + yield from (Tag(interpreter, "none", platform_) for platform_ in platforms) + + if _abi3_applies(python_version): + for minor_version in range(python_version[1] - 1, 1, -1): + for platform_ in platforms: + interpreter = "cp{version}".format( + version=_version_nodot((python_version[0], minor_version)) + ) + yield Tag(interpreter, "abi3", platform_) + + +def _generic_abi() -> List[str]: + """ + Return the ABI tag based on EXT_SUFFIX. + """ + # The following are examples of `EXT_SUFFIX`. + # We want to keep the parts which are related to the ABI and remove the + # parts which are related to the platform: + # - linux: '.cpython-310-x86_64-linux-gnu.so' => cp310 + # - mac: '.cpython-310-darwin.so' => cp310 + # - win: '.cp310-win_amd64.pyd' => cp310 + # - win: '.pyd' => cp37 (uses _cpython_abis()) + # - pypy: '.pypy38-pp73-x86_64-linux-gnu.so' => pypy38_pp73 + # - graalpy: '.graalpy-38-native-x86_64-darwin.dylib' + # => graalpy_38_native + + ext_suffix = _get_config_var("EXT_SUFFIX", warn=True) + if not isinstance(ext_suffix, str) or ext_suffix[0] != ".": + raise SystemError("invalid sysconfig.get_config_var('EXT_SUFFIX')") + parts = ext_suffix.split(".") + if len(parts) < 3: + # CPython3.7 and earlier uses ".pyd" on Windows. + return _cpython_abis(sys.version_info[:2]) + soabi = parts[1] + if soabi.startswith("cpython"): + # non-windows + abi = "cp" + soabi.split("-")[1] + elif soabi.startswith("cp"): + # windows + abi = soabi.split("-")[0] + elif soabi.startswith("pypy"): + abi = "-".join(soabi.split("-")[:2]) + elif soabi.startswith("graalpy"): + abi = "-".join(soabi.split("-")[:3]) + elif soabi: + # pyston, ironpython, others? + abi = soabi + else: + return [] + return [_normalize_string(abi)] + + +def generic_tags( + interpreter: Optional[str] = None, + abis: Optional[Iterable[str]] = None, + platforms: Optional[Iterable[str]] = None, + *, + warn: bool = False, +) -> Iterator[Tag]: + """ + Yields the tags for a generic interpreter. + + The tags consist of: + - -- + + The "none" ABI will be added if it was not explicitly provided. + """ + if not interpreter: + interp_name = interpreter_name() + interp_version = interpreter_version(warn=warn) + interpreter = "".join([interp_name, interp_version]) + if abis is None: + abis = _generic_abi() + else: + abis = list(abis) + platforms = list(platforms or platform_tags()) + if "none" not in abis: + abis.append("none") + for abi in abis: + for platform_ in platforms: + yield Tag(interpreter, abi, platform_) + + +def _py_interpreter_range(py_version: PythonVersion) -> Iterator[str]: + """ + Yields Python versions in descending order. + + After the latest version, the major-only version will be yielded, and then + all previous versions of that major version. + """ + if len(py_version) > 1: + yield f"py{_version_nodot(py_version[:2])}" + yield f"py{py_version[0]}" + if len(py_version) > 1: + for minor in range(py_version[1] - 1, -1, -1): + yield f"py{_version_nodot((py_version[0], minor))}" + + +def compatible_tags( + python_version: Optional[PythonVersion] = None, + interpreter: Optional[str] = None, + platforms: Optional[Iterable[str]] = None, +) -> Iterator[Tag]: + """ + Yields the sequence of tags that are compatible with a specific version of Python. + + The tags consist of: + - py*-none- + - -none-any # ... if `interpreter` is provided. + - py*-none-any + """ + if not python_version: + python_version = sys.version_info[:2] + platforms = list(platforms or platform_tags()) + for version in _py_interpreter_range(python_version): + for platform_ in platforms: + yield Tag(version, "none", platform_) + if interpreter: + yield Tag(interpreter, "none", "any") + for version in _py_interpreter_range(python_version): + yield Tag(version, "none", "any") + + +def _mac_arch(arch: str, is_32bit: bool = _32_BIT_INTERPRETER) -> str: + if not is_32bit: + return arch + + if arch.startswith("ppc"): + return "ppc" + + return "i386" + + +def _mac_binary_formats(version: MacVersion, cpu_arch: str) -> List[str]: + formats = [cpu_arch] + if cpu_arch == "x86_64": + if version < (10, 4): + return [] + formats.extend(["intel", "fat64", "fat32"]) + + elif cpu_arch == "i386": + if version < (10, 4): + return [] + formats.extend(["intel", "fat32", "fat"]) + + elif cpu_arch == "ppc64": + # TODO: Need to care about 32-bit PPC for ppc64 through 10.2? + if version > (10, 5) or version < (10, 4): + return [] + formats.append("fat64") + + elif cpu_arch == "ppc": + if version > (10, 6): + return [] + formats.extend(["fat32", "fat"]) + + if cpu_arch in {"arm64", "x86_64"}: + formats.append("universal2") + + if cpu_arch in {"x86_64", "i386", "ppc64", "ppc", "intel"}: + formats.append("universal") + + return formats + + +def mac_platforms( + version: Optional[MacVersion] = None, arch: Optional[str] = None +) -> Iterator[str]: + """ + Yields the platform tags for a macOS system. + + The `version` parameter is a two-item tuple specifying the macOS version to + generate platform tags for. The `arch` parameter is the CPU architecture to + generate platform tags for. Both parameters default to the appropriate value + for the current system. + """ + version_str, _, cpu_arch = platform.mac_ver() + if version is None: + version = cast("MacVersion", tuple(map(int, version_str.split(".")[:2]))) + if version == (10, 16): + # When built against an older macOS SDK, Python will report macOS 10.16 + # instead of the real version. + version_str = subprocess.run( + [ + sys.executable, + "-sS", + "-c", + "import platform; print(platform.mac_ver()[0])", + ], + check=True, + env={"SYSTEM_VERSION_COMPAT": "0"}, + stdout=subprocess.PIPE, + text=True, + ).stdout + version = cast("MacVersion", tuple(map(int, version_str.split(".")[:2]))) + else: + version = version + if arch is None: + arch = _mac_arch(cpu_arch) + else: + arch = arch + + if (10, 0) <= version and version < (11, 0): + # Prior to Mac OS 11, each yearly release of Mac OS bumped the + # "minor" version number. The major version was always 10. + for minor_version in range(version[1], -1, -1): + compat_version = 10, minor_version + binary_formats = _mac_binary_formats(compat_version, arch) + for binary_format in binary_formats: + yield "macosx_{major}_{minor}_{binary_format}".format( + major=10, minor=minor_version, binary_format=binary_format + ) + + if version >= (11, 0): + # Starting with Mac OS 11, each yearly release bumps the major version + # number. The minor versions are now the midyear updates. + for major_version in range(version[0], 10, -1): + compat_version = major_version, 0 + binary_formats = _mac_binary_formats(compat_version, arch) + for binary_format in binary_formats: + yield "macosx_{major}_{minor}_{binary_format}".format( + major=major_version, minor=0, binary_format=binary_format + ) + + if version >= (11, 0): + # Mac OS 11 on x86_64 is compatible with binaries from previous releases. + # Arm64 support was introduced in 11.0, so no Arm binaries from previous + # releases exist. + # + # However, the "universal2" binary format can have a + # macOS version earlier than 11.0 when the x86_64 part of the binary supports + # that version of macOS. + if arch == "x86_64": + for minor_version in range(16, 3, -1): + compat_version = 10, minor_version + binary_formats = _mac_binary_formats(compat_version, arch) + for binary_format in binary_formats: + yield "macosx_{major}_{minor}_{binary_format}".format( + major=compat_version[0], + minor=compat_version[1], + binary_format=binary_format, + ) + else: + for minor_version in range(16, 3, -1): + compat_version = 10, minor_version + binary_format = "universal2" + yield "macosx_{major}_{minor}_{binary_format}".format( + major=compat_version[0], + minor=compat_version[1], + binary_format=binary_format, + ) + + +def _linux_platforms(is_32bit: bool = _32_BIT_INTERPRETER) -> Iterator[str]: + linux = _normalize_string(sysconfig.get_platform()) + if not linux.startswith("linux_"): + # we should never be here, just yield the sysconfig one and return + yield linux + return + if is_32bit: + if linux == "linux_x86_64": + linux = "linux_i686" + elif linux == "linux_aarch64": + linux = "linux_armv8l" + _, arch = linux.split("_", 1) + archs = {"armv8l": ["armv8l", "armv7l"]}.get(arch, [arch]) + yield from _manylinux.platform_tags(archs) + yield from _musllinux.platform_tags(archs) + for arch in archs: + yield f"linux_{arch}" + + +def _generic_platforms() -> Iterator[str]: + yield _normalize_string(sysconfig.get_platform()) + + +def platform_tags() -> Iterator[str]: + """ + Provides the platform tags for this installation. + """ + if platform.system() == "Darwin": + return mac_platforms() + elif platform.system() == "Linux": + return _linux_platforms() + else: + return _generic_platforms() + + +def interpreter_name() -> str: + """ + Returns the name of the running interpreter. + + Some implementations have a reserved, two-letter abbreviation which will + be returned when appropriate. + """ + name = sys.implementation.name + return INTERPRETER_SHORT_NAMES.get(name) or name + + +def interpreter_version(*, warn: bool = False) -> str: + """ + Returns the version of the running interpreter. + """ + version = _get_config_var("py_version_nodot", warn=warn) + if version: + version = str(version) + else: + version = _version_nodot(sys.version_info[:2]) + return version + + +def _version_nodot(version: PythonVersion) -> str: + return "".join(map(str, version)) + + +def sys_tags(*, warn: bool = False) -> Iterator[Tag]: + """ + Returns the sequence of tag triples for the running interpreter. + + The order of the sequence corresponds to priority order for the + interpreter, from most to least important. + """ + + interp_name = interpreter_name() + if interp_name == "cp": + yield from cpython_tags(warn=warn) + else: + yield from generic_tags() + + if interp_name == "pp": + interp = "pp3" + elif interp_name == "cp": + interp = "cp" + interpreter_version(warn=warn) + else: + interp = None + yield from compatible_tags(interpreter=interp) diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/utils.py b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/utils.py new file mode 100644 index 00000000000000..c2c2f75aa80628 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/utils.py @@ -0,0 +1,172 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +import re +from typing import FrozenSet, NewType, Tuple, Union, cast + +from .tags import Tag, parse_tag +from .version import InvalidVersion, Version + +BuildTag = Union[Tuple[()], Tuple[int, str]] +NormalizedName = NewType("NormalizedName", str) + + +class InvalidName(ValueError): + """ + An invalid distribution name; users should refer to the packaging user guide. + """ + + +class InvalidWheelFilename(ValueError): + """ + An invalid wheel filename was found, users should refer to PEP 427. + """ + + +class InvalidSdistFilename(ValueError): + """ + An invalid sdist filename was found, users should refer to the packaging user guide. + """ + + +# Core metadata spec for `Name` +_validate_regex = re.compile( + r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$", re.IGNORECASE +) +_canonicalize_regex = re.compile(r"[-_.]+") +_normalized_regex = re.compile(r"^([a-z0-9]|[a-z0-9]([a-z0-9-](?!--))*[a-z0-9])$") +# PEP 427: The build number must start with a digit. +_build_tag_regex = re.compile(r"(\d+)(.*)") + + +def canonicalize_name(name: str, *, validate: bool = False) -> NormalizedName: + if validate and not _validate_regex.match(name): + raise InvalidName(f"name is invalid: {name!r}") + # This is taken from PEP 503. + value = _canonicalize_regex.sub("-", name).lower() + return cast(NormalizedName, value) + + +def is_normalized_name(name: str) -> bool: + return _normalized_regex.match(name) is not None + + +def canonicalize_version( + version: Union[Version, str], *, strip_trailing_zero: bool = True +) -> str: + """ + This is very similar to Version.__str__, but has one subtle difference + with the way it handles the release segment. + """ + if isinstance(version, str): + try: + parsed = Version(version) + except InvalidVersion: + # Legacy versions cannot be normalized + return version + else: + parsed = version + + parts = [] + + # Epoch + if parsed.epoch != 0: + parts.append(f"{parsed.epoch}!") + + # Release segment + release_segment = ".".join(str(x) for x in parsed.release) + if strip_trailing_zero: + # NB: This strips trailing '.0's to normalize + release_segment = re.sub(r"(\.0)+$", "", release_segment) + parts.append(release_segment) + + # Pre-release + if parsed.pre is not None: + parts.append("".join(str(x) for x in parsed.pre)) + + # Post-release + if parsed.post is not None: + parts.append(f".post{parsed.post}") + + # Development release + if parsed.dev is not None: + parts.append(f".dev{parsed.dev}") + + # Local version segment + if parsed.local is not None: + parts.append(f"+{parsed.local}") + + return "".join(parts) + + +def parse_wheel_filename( + filename: str, +) -> Tuple[NormalizedName, Version, BuildTag, FrozenSet[Tag]]: + if not filename.endswith(".whl"): + raise InvalidWheelFilename( + f"Invalid wheel filename (extension must be '.whl'): {filename}" + ) + + filename = filename[:-4] + dashes = filename.count("-") + if dashes not in (4, 5): + raise InvalidWheelFilename( + f"Invalid wheel filename (wrong number of parts): {filename}" + ) + + parts = filename.split("-", dashes - 2) + name_part = parts[0] + # See PEP 427 for the rules on escaping the project name. + if "__" in name_part or re.match(r"^[\w\d._]*$", name_part, re.UNICODE) is None: + raise InvalidWheelFilename(f"Invalid project name: {filename}") + name = canonicalize_name(name_part) + + try: + version = Version(parts[1]) + except InvalidVersion as e: + raise InvalidWheelFilename( + f"Invalid wheel filename (invalid version): {filename}" + ) from e + + if dashes == 5: + build_part = parts[2] + build_match = _build_tag_regex.match(build_part) + if build_match is None: + raise InvalidWheelFilename( + f"Invalid build number: {build_part} in '{filename}'" + ) + build = cast(BuildTag, (int(build_match.group(1)), build_match.group(2))) + else: + build = () + tags = parse_tag(parts[-1]) + return (name, version, build, tags) + + +def parse_sdist_filename(filename: str) -> Tuple[NormalizedName, Version]: + if filename.endswith(".tar.gz"): + file_stem = filename[: -len(".tar.gz")] + elif filename.endswith(".zip"): + file_stem = filename[: -len(".zip")] + else: + raise InvalidSdistFilename( + f"Invalid sdist filename (extension must be '.tar.gz' or '.zip'):" + f" {filename}" + ) + + # We are requiring a PEP 440 version, which cannot contain dashes, + # so we split on the last dash. + name_part, sep, version_part = file_stem.rpartition("-") + if not sep: + raise InvalidSdistFilename(f"Invalid sdist filename: {filename}") + + name = canonicalize_name(name_part) + + try: + version = Version(version_part) + except InvalidVersion as e: + raise InvalidSdistFilename( + f"Invalid sdist filename (invalid version): {filename}" + ) from e + + return (name, version) diff --git a/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/version.py b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/version.py new file mode 100644 index 00000000000000..5faab9bd0dcf28 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/gyp/pylib/packaging/version.py @@ -0,0 +1,563 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +""" +.. testsetup:: + + from packaging.version import parse, Version +""" + +import itertools +import re +from typing import Any, Callable, NamedTuple, Optional, SupportsInt, Tuple, Union + +from ._structures import Infinity, InfinityType, NegativeInfinity, NegativeInfinityType + +__all__ = ["VERSION_PATTERN", "parse", "Version", "InvalidVersion"] + +LocalType = Tuple[Union[int, str], ...] + +CmpPrePostDevType = Union[InfinityType, NegativeInfinityType, Tuple[str, int]] +CmpLocalType = Union[ + NegativeInfinityType, + Tuple[Union[Tuple[int, str], Tuple[NegativeInfinityType, Union[int, str]]], ...], +] +CmpKey = Tuple[ + int, + Tuple[int, ...], + CmpPrePostDevType, + CmpPrePostDevType, + CmpPrePostDevType, + CmpLocalType, +] +VersionComparisonMethod = Callable[[CmpKey, CmpKey], bool] + + +class _Version(NamedTuple): + epoch: int + release: Tuple[int, ...] + dev: Optional[Tuple[str, int]] + pre: Optional[Tuple[str, int]] + post: Optional[Tuple[str, int]] + local: Optional[LocalType] + + +def parse(version: str) -> "Version": + """Parse the given version string. + + >>> parse('1.0.dev1') + + + :param version: The version string to parse. + :raises InvalidVersion: When the version string is not a valid version. + """ + return Version(version) + + +class InvalidVersion(ValueError): + """Raised when a version string is not a valid version. + + >>> Version("invalid") + Traceback (most recent call last): + ... + packaging.version.InvalidVersion: Invalid version: 'invalid' + """ + + +class _BaseVersion: + _key: Tuple[Any, ...] + + def __hash__(self) -> int: + return hash(self._key) + + # Please keep the duplicated `isinstance` check + # in the six comparisons hereunder + # unless you find a way to avoid adding overhead function calls. + def __lt__(self, other: "_BaseVersion") -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key < other._key + + def __le__(self, other: "_BaseVersion") -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key <= other._key + + def __eq__(self, other: object) -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key == other._key + + def __ge__(self, other: "_BaseVersion") -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key >= other._key + + def __gt__(self, other: "_BaseVersion") -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key > other._key + + def __ne__(self, other: object) -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key != other._key + + +# Deliberately not anchored to the start and end of the string, to make it +# easier for 3rd party code to reuse +_VERSION_PATTERN = r""" + v? + (?: + (?:(?P[0-9]+)!)? # epoch + (?P[0-9]+(?:\.[0-9]+)*) # release segment + (?P
                                              # pre-release
    +            [-_\.]?
    +            (?Palpha|a|beta|b|preview|pre|c|rc)
    +            [-_\.]?
    +            (?P[0-9]+)?
    +        )?
    +        (?P                                         # post release
    +            (?:-(?P[0-9]+))
    +            |
    +            (?:
    +                [-_\.]?
    +                (?Ppost|rev|r)
    +                [-_\.]?
    +                (?P[0-9]+)?
    +            )
    +        )?
    +        (?P                                          # dev release
    +            [-_\.]?
    +            (?Pdev)
    +            [-_\.]?
    +            (?P[0-9]+)?
    +        )?
    +    )
    +    (?:\+(?P[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
    +"""
    +
    +VERSION_PATTERN = _VERSION_PATTERN
    +"""
    +A string containing the regular expression used to match a valid version.
    +
    +The pattern is not anchored at either end, and is intended for embedding in larger
    +expressions (for example, matching a version number as part of a file name). The
    +regular expression should be compiled with the ``re.VERBOSE`` and ``re.IGNORECASE``
    +flags set.
    +
    +:meta hide-value:
    +"""
    +
    +
    +class Version(_BaseVersion):
    +    """This class abstracts handling of a project's versions.
    +
    +    A :class:`Version` instance is comparison aware and can be compared and
    +    sorted using the standard Python interfaces.
    +
    +    >>> v1 = Version("1.0a5")
    +    >>> v2 = Version("1.0")
    +    >>> v1
    +    
    +    >>> v2
    +    
    +    >>> v1 < v2
    +    True
    +    >>> v1 == v2
    +    False
    +    >>> v1 > v2
    +    False
    +    >>> v1 >= v2
    +    False
    +    >>> v1 <= v2
    +    True
    +    """
    +
    +    _regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE)
    +    _key: CmpKey
    +
    +    def __init__(self, version: str) -> None:
    +        """Initialize a Version object.
    +
    +        :param version:
    +            The string representation of a version which will be parsed and normalized
    +            before use.
    +        :raises InvalidVersion:
    +            If the ``version`` does not conform to PEP 440 in any way then this
    +            exception will be raised.
    +        """
    +
    +        # Validate the version and parse it into pieces
    +        match = self._regex.search(version)
    +        if not match:
    +            raise InvalidVersion(f"Invalid version: '{version}'")
    +
    +        # Store the parsed out pieces of the version
    +        self._version = _Version(
    +            epoch=int(match.group("epoch")) if match.group("epoch") else 0,
    +            release=tuple(int(i) for i in match.group("release").split(".")),
    +            pre=_parse_letter_version(match.group("pre_l"), match.group("pre_n")),
    +            post=_parse_letter_version(
    +                match.group("post_l"), match.group("post_n1") or match.group("post_n2")
    +            ),
    +            dev=_parse_letter_version(match.group("dev_l"), match.group("dev_n")),
    +            local=_parse_local_version(match.group("local")),
    +        )
    +
    +        # Generate a key which will be used for sorting
    +        self._key = _cmpkey(
    +            self._version.epoch,
    +            self._version.release,
    +            self._version.pre,
    +            self._version.post,
    +            self._version.dev,
    +            self._version.local,
    +        )
    +
    +    def __repr__(self) -> str:
    +        """A representation of the Version that shows all internal state.
    +
    +        >>> Version('1.0.0')
    +        
    +        """
    +        return f""
    +
    +    def __str__(self) -> str:
    +        """A string representation of the version that can be rounded-tripped.
    +
    +        >>> str(Version("1.0a5"))
    +        '1.0a5'
    +        """
    +        parts = []
    +
    +        # Epoch
    +        if self.epoch != 0:
    +            parts.append(f"{self.epoch}!")
    +
    +        # Release segment
    +        parts.append(".".join(str(x) for x in self.release))
    +
    +        # Pre-release
    +        if self.pre is not None:
    +            parts.append("".join(str(x) for x in self.pre))
    +
    +        # Post-release
    +        if self.post is not None:
    +            parts.append(f".post{self.post}")
    +
    +        # Development release
    +        if self.dev is not None:
    +            parts.append(f".dev{self.dev}")
    +
    +        # Local version segment
    +        if self.local is not None:
    +            parts.append(f"+{self.local}")
    +
    +        return "".join(parts)
    +
    +    @property
    +    def epoch(self) -> int:
    +        """The epoch of the version.
    +
    +        >>> Version("2.0.0").epoch
    +        0
    +        >>> Version("1!2.0.0").epoch
    +        1
    +        """
    +        return self._version.epoch
    +
    +    @property
    +    def release(self) -> Tuple[int, ...]:
    +        """The components of the "release" segment of the version.
    +
    +        >>> Version("1.2.3").release
    +        (1, 2, 3)
    +        >>> Version("2.0.0").release
    +        (2, 0, 0)
    +        >>> Version("1!2.0.0.post0").release
    +        (2, 0, 0)
    +
    +        Includes trailing zeroes but not the epoch or any pre-release / development /
    +        post-release suffixes.
    +        """
    +        return self._version.release
    +
    +    @property
    +    def pre(self) -> Optional[Tuple[str, int]]:
    +        """The pre-release segment of the version.
    +
    +        >>> print(Version("1.2.3").pre)
    +        None
    +        >>> Version("1.2.3a1").pre
    +        ('a', 1)
    +        >>> Version("1.2.3b1").pre
    +        ('b', 1)
    +        >>> Version("1.2.3rc1").pre
    +        ('rc', 1)
    +        """
    +        return self._version.pre
    +
    +    @property
    +    def post(self) -> Optional[int]:
    +        """The post-release number of the version.
    +
    +        >>> print(Version("1.2.3").post)
    +        None
    +        >>> Version("1.2.3.post1").post
    +        1
    +        """
    +        return self._version.post[1] if self._version.post else None
    +
    +    @property
    +    def dev(self) -> Optional[int]:
    +        """The development number of the version.
    +
    +        >>> print(Version("1.2.3").dev)
    +        None
    +        >>> Version("1.2.3.dev1").dev
    +        1
    +        """
    +        return self._version.dev[1] if self._version.dev else None
    +
    +    @property
    +    def local(self) -> Optional[str]:
    +        """The local version segment of the version.
    +
    +        >>> print(Version("1.2.3").local)
    +        None
    +        >>> Version("1.2.3+abc").local
    +        'abc'
    +        """
    +        if self._version.local:
    +            return ".".join(str(x) for x in self._version.local)
    +        else:
    +            return None
    +
    +    @property
    +    def public(self) -> str:
    +        """The public portion of the version.
    +
    +        >>> Version("1.2.3").public
    +        '1.2.3'
    +        >>> Version("1.2.3+abc").public
    +        '1.2.3'
    +        >>> Version("1.2.3+abc.dev1").public
    +        '1.2.3'
    +        """
    +        return str(self).split("+", 1)[0]
    +
    +    @property
    +    def base_version(self) -> str:
    +        """The "base version" of the version.
    +
    +        >>> Version("1.2.3").base_version
    +        '1.2.3'
    +        >>> Version("1.2.3+abc").base_version
    +        '1.2.3'
    +        >>> Version("1!1.2.3+abc.dev1").base_version
    +        '1!1.2.3'
    +
    +        The "base version" is the public version of the project without any pre or post
    +        release markers.
    +        """
    +        parts = []
    +
    +        # Epoch
    +        if self.epoch != 0:
    +            parts.append(f"{self.epoch}!")
    +
    +        # Release segment
    +        parts.append(".".join(str(x) for x in self.release))
    +
    +        return "".join(parts)
    +
    +    @property
    +    def is_prerelease(self) -> bool:
    +        """Whether this version is a pre-release.
    +
    +        >>> Version("1.2.3").is_prerelease
    +        False
    +        >>> Version("1.2.3a1").is_prerelease
    +        True
    +        >>> Version("1.2.3b1").is_prerelease
    +        True
    +        >>> Version("1.2.3rc1").is_prerelease
    +        True
    +        >>> Version("1.2.3dev1").is_prerelease
    +        True
    +        """
    +        return self.dev is not None or self.pre is not None
    +
    +    @property
    +    def is_postrelease(self) -> bool:
    +        """Whether this version is a post-release.
    +
    +        >>> Version("1.2.3").is_postrelease
    +        False
    +        >>> Version("1.2.3.post1").is_postrelease
    +        True
    +        """
    +        return self.post is not None
    +
    +    @property
    +    def is_devrelease(self) -> bool:
    +        """Whether this version is a development release.
    +
    +        >>> Version("1.2.3").is_devrelease
    +        False
    +        >>> Version("1.2.3.dev1").is_devrelease
    +        True
    +        """
    +        return self.dev is not None
    +
    +    @property
    +    def major(self) -> int:
    +        """The first item of :attr:`release` or ``0`` if unavailable.
    +
    +        >>> Version("1.2.3").major
    +        1
    +        """
    +        return self.release[0] if len(self.release) >= 1 else 0
    +
    +    @property
    +    def minor(self) -> int:
    +        """The second item of :attr:`release` or ``0`` if unavailable.
    +
    +        >>> Version("1.2.3").minor
    +        2
    +        >>> Version("1").minor
    +        0
    +        """
    +        return self.release[1] if len(self.release) >= 2 else 0
    +
    +    @property
    +    def micro(self) -> int:
    +        """The third item of :attr:`release` or ``0`` if unavailable.
    +
    +        >>> Version("1.2.3").micro
    +        3
    +        >>> Version("1").micro
    +        0
    +        """
    +        return self.release[2] if len(self.release) >= 3 else 0
    +
    +
    +def _parse_letter_version(
    +    letter: Optional[str], number: Union[str, bytes, SupportsInt, None]
    +) -> Optional[Tuple[str, int]]:
    +
    +    if letter:
    +        # We consider there to be an implicit 0 in a pre-release if there is
    +        # not a numeral associated with it.
    +        if number is None:
    +            number = 0
    +
    +        # We normalize any letters to their lower case form
    +        letter = letter.lower()
    +
    +        # We consider some words to be alternate spellings of other words and
    +        # in those cases we want to normalize the spellings to our preferred
    +        # spelling.
    +        if letter == "alpha":
    +            letter = "a"
    +        elif letter == "beta":
    +            letter = "b"
    +        elif letter in ["c", "pre", "preview"]:
    +            letter = "rc"
    +        elif letter in ["rev", "r"]:
    +            letter = "post"
    +
    +        return letter, int(number)
    +    if not letter and number:
    +        # We assume if we are given a number, but we are not given a letter
    +        # then this is using the implicit post release syntax (e.g. 1.0-1)
    +        letter = "post"
    +
    +        return letter, int(number)
    +
    +    return None
    +
    +
    +_local_version_separators = re.compile(r"[\._-]")
    +
    +
    +def _parse_local_version(local: Optional[str]) -> Optional[LocalType]:
    +    """
    +    Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
    +    """
    +    if local is not None:
    +        return tuple(
    +            part.lower() if not part.isdigit() else int(part)
    +            for part in _local_version_separators.split(local)
    +        )
    +    return None
    +
    +
    +def _cmpkey(
    +    epoch: int,
    +    release: Tuple[int, ...],
    +    pre: Optional[Tuple[str, int]],
    +    post: Optional[Tuple[str, int]],
    +    dev: Optional[Tuple[str, int]],
    +    local: Optional[LocalType],
    +) -> CmpKey:
    +
    +    # When we compare a release version, we want to compare it with all of the
    +    # trailing zeros removed. So we'll use a reverse the list, drop all the now
    +    # leading zeros until we come to something non zero, then take the rest
    +    # re-reverse it back into the correct order and make it a tuple and use
    +    # that for our sorting key.
    +    _release = tuple(
    +        reversed(list(itertools.dropwhile(lambda x: x == 0, reversed(release))))
    +    )
    +
    +    # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0.
    +    # We'll do this by abusing the pre segment, but we _only_ want to do this
    +    # if there is not a pre or a post segment. If we have one of those then
    +    # the normal sorting rules will handle this case correctly.
    +    if pre is None and post is None and dev is not None:
    +        _pre: CmpPrePostDevType = NegativeInfinity
    +    # Versions without a pre-release (except as noted above) should sort after
    +    # those with one.
    +    elif pre is None:
    +        _pre = Infinity
    +    else:
    +        _pre = pre
    +
    +    # Versions without a post segment should sort before those with one.
    +    if post is None:
    +        _post: CmpPrePostDevType = NegativeInfinity
    +
    +    else:
    +        _post = post
    +
    +    # Versions without a development segment should sort after those with one.
    +    if dev is None:
    +        _dev: CmpPrePostDevType = Infinity
    +
    +    else:
    +        _dev = dev
    +
    +    if local is None:
    +        # Versions without a local segment should sort before those with one.
    +        _local: CmpLocalType = NegativeInfinity
    +    else:
    +        # Versions with a local segment need that segment parsed to implement
    +        # the sorting rules in PEP440.
    +        # - Alpha numeric segments sort before numeric segments
    +        # - Alpha numeric segments sort lexicographically
    +        # - Numeric segments sort numerically
    +        # - Shorter versions sort before longer versions when the prefixes
    +        #   match exactly
    +        _local = tuple(
    +            (i, "") if isinstance(i, int) else (NegativeInfinity, i) for i in local
    +        )
    +
    +    return epoch, _release, _pre, _post, _dev, _local
    diff --git a/deps/npm/node_modules/node-gyp/gyp/pyproject.toml b/deps/npm/node_modules/node-gyp/gyp/pyproject.toml
    index d8a5451520cc3c..0c25d0b3c1a065 100644
    --- a/deps/npm/node_modules/node-gyp/gyp/pyproject.toml
    +++ b/deps/npm/node_modules/node-gyp/gyp/pyproject.toml
    @@ -4,14 +4,16 @@ build-backend = "setuptools.build_meta"
     
     [project]
     name = "gyp-next"
    -version = "0.14.0"
    +version = "0.16.1"
     authors = [
       { name="Node.js contributors", email="ryzokuken@disroot.org" },
     ]
     description = "A fork of the GYP build system for use in the Node.js projects"
     readme = "README.md"
     license = { file="LICENSE" }
    -requires-python = ">=3.6"
    +requires-python = ">=3.8"
    +# The Python module "packaging" is vendored in the "pylib/packaging" directory to support Python >= 3.12.
    +# dependencies = ["packaging>=23.1"]  # Uncomment this line if the vendored version is removed.
     classifiers = [
         "Development Status :: 3 - Alpha",
         "Environment :: Console",
    @@ -20,15 +22,14 @@ classifiers = [
         "Natural Language :: English",
         "Programming Language :: Python",
         "Programming Language :: Python :: 3",
    -    "Programming Language :: Python :: 3.6",
    -    "Programming Language :: Python :: 3.7",
         "Programming Language :: Python :: 3.8",
         "Programming Language :: Python :: 3.9",
         "Programming Language :: Python :: 3.10",
    +    "Programming Language :: Python :: 3.11",
     ]
     
     [project.optional-dependencies]
    -dev = ["flake8", "pytest"]
    +dev = ["flake8", "ruff", "pytest"]
     
     [project.scripts]
     gyp = "gyp:script_main"
    @@ -36,6 +37,83 @@ gyp = "gyp:script_main"
     [project.urls]
     "Homepage" = "https://github.com/nodejs/gyp-next"
     
    +[tool.ruff]
    +select = [
    +  "C4",   # flake8-comprehensions
    +  "C90",  # McCabe cyclomatic complexity
    +  "DTZ",  # flake8-datetimez
    +  "E",    # pycodestyle
    +  "F",    # Pyflakes
    +  "G",    # flake8-logging-format
    +  "ICN",  # flake8-import-conventions
    +  "INT",  # flake8-gettext
    +  "PL",   # Pylint
    +  "PYI",  # flake8-pyi
    +  "RSE",  # flake8-raise
    +  "RUF",  # Ruff-specific rules
    +  "T10",  # flake8-debugger
    +  "TCH",  # flake8-type-checking
    +  "TID",  # flake8-tidy-imports
    +  "UP",   # pyupgrade
    +  "W",    # pycodestyle
    +  "YTT",  # flake8-2020
    +  # "A",    # flake8-builtins
    +  # "ANN",  # flake8-annotations
    +  # "ARG",  # flake8-unused-arguments
    +  # "B",    # flake8-bugbear
    +  # "BLE",  # flake8-blind-except
    +  # "COM",  # flake8-commas
    +  # "D",    # pydocstyle
    +  # "DJ",   # flake8-django
    +  # "EM",   # flake8-errmsg
    +  # "ERA",  # eradicate
    +  # "EXE",  # flake8-executable
    +  # "FBT",  # flake8-boolean-trap
    +  # "I",    # isort
    +  # "INP",  # flake8-no-pep420
    +  # "ISC",  # flake8-implicit-str-concat
    +  # "N",    # pep8-naming
    +  # "NPY",  # NumPy-specific rules
    +  # "PD",   # pandas-vet
    +  # "PGH",  # pygrep-hooks
    +  # "PIE",  # flake8-pie
    +  # "PT",   # flake8-pytest-style
    +  # "PTH",  # flake8-use-pathlib
    +  # "Q",    # flake8-quotes
    +  # "RET",  # flake8-return
    +  # "S",    # flake8-bandit
    +  # "SIM",  # flake8-simplify
    +  # "SLF",  # flake8-self
    +  # "T20",  # flake8-print
    +  # "TRY",  # tryceratops
    +]
    +ignore = [
    +  "E721",
    +  "PLC1901",
    +  "PLR0402",
    +  "PLR1714",
    +  "PLR2004",
    +  "PLR5501",
    +  "PLW0603",
    +  "PLW2901",
    +  "PYI024",
    +  "RUF005",
    +  "RUF012",
    +  "UP031",
    +]
    +extend-exclude = ["pylib/packaging"]
    +line-length = 88
    +target-version = "py37"
    +
    +[tool.ruff.mccabe]
    +max-complexity = 101
    +
    +[tool.ruff.pylint]
    +max-args = 11
    +max-branches = 108
    +max-returns = 10
    +max-statements = 286
    +
     [tool.setuptools]
     package-dir = {"" = "pylib"}
     packages = ["gyp", "gyp.generator"]
    diff --git a/deps/npm/node_modules/node-gyp/gyp/tools/README b/deps/npm/node_modules/node-gyp/gyp/tools/README
    deleted file mode 100644
    index 84a73d15214b68..00000000000000
    --- a/deps/npm/node_modules/node-gyp/gyp/tools/README
    +++ /dev/null
    @@ -1,15 +0,0 @@
    -pretty_vcproj:
    -  Usage: pretty_vcproj.py "c:\path\to\vcproj.vcproj" [key1=value1] [key2=value2]
    -
    -  They key/value pair are used to resolve vsprops name.
    -
    -  For example, if I want to diff the base.vcproj project:
    -
    -  pretty_vcproj.py z:\dev\src-chrome\src\base\build\base.vcproj "$(SolutionDir)=z:\dev\src-chrome\src\chrome\\" "$(CHROMIUM_BUILD)=" "$(CHROME_BUILD_TYPE)=" > original.txt
    -  pretty_vcproj.py z:\dev\src-chrome\src\base\base_gyp.vcproj "$(SolutionDir)=z:\dev\src-chrome\src\chrome\\" "$(CHROMIUM_BUILD)=" "$(CHROME_BUILD_TYPE)=" > gyp.txt
    -
    -  And you can use your favorite diff tool to see the changes.
    -
    -  Note: In the case of base.vcproj, the original vcproj is one level up the generated one.
    -        I suggest you do a search and replace for '"..\' and replace it with '"' in original.txt
    -        before you perform the diff.
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/gyp/tools/Xcode/README b/deps/npm/node_modules/node-gyp/gyp/tools/Xcode/README
    deleted file mode 100644
    index 2492a2c2f8f170..00000000000000
    --- a/deps/npm/node_modules/node-gyp/gyp/tools/Xcode/README
    +++ /dev/null
    @@ -1,5 +0,0 @@
    -Specifications contains syntax formatters for Xcode 3. These do not appear to be supported yet on Xcode 4. To use these with Xcode 3 please install both the gyp.pbfilespec and gyp.xclangspec files in
    -
    -~/Library/Application Support/Developer/Shared/Xcode/Specifications/
    -
    -and restart Xcode.
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/gyp/tools/Xcode/Specifications/gyp.pbfilespec b/deps/npm/node_modules/node-gyp/gyp/tools/Xcode/Specifications/gyp.pbfilespec
    deleted file mode 100644
    index 85e2e268a51b76..00000000000000
    --- a/deps/npm/node_modules/node-gyp/gyp/tools/Xcode/Specifications/gyp.pbfilespec
    +++ /dev/null
    @@ -1,27 +0,0 @@
    -/*
    -	gyp.pbfilespec
    -	GYP source file spec for Xcode 3
    -
    -	There is not much documentation available regarding the format
    -	of .pbfilespec files. As a starting point, see for instance the
    -	outdated documentation at:
    -	http://maxao.free.fr/xcode-plugin-interface/specifications.html
    -	and the files in:
    -	/Developer/Library/PrivateFrameworks/XcodeEdit.framework/Versions/A/Resources/
    -
    -	Place this file in directory:
    -	~/Library/Application Support/Developer/Shared/Xcode/Specifications/
    -*/
    -
    -(
    -	{
    -		Identifier = sourcecode.gyp;
    -		BasedOn = sourcecode;
    -		Name = "GYP Files";
    -		Extensions = ("gyp", "gypi");
    -		MIMETypes = ("text/gyp");
    -		Language = "xcode.lang.gyp";
    -		IsTextFile = YES;
    -		IsSourceFile = YES;
    -	}
    -)
    diff --git a/deps/npm/node_modules/node-gyp/gyp/tools/Xcode/Specifications/gyp.xclangspec b/deps/npm/node_modules/node-gyp/gyp/tools/Xcode/Specifications/gyp.xclangspec
    deleted file mode 100644
    index 3b3506d319e0f2..00000000000000
    --- a/deps/npm/node_modules/node-gyp/gyp/tools/Xcode/Specifications/gyp.xclangspec
    +++ /dev/null
    @@ -1,226 +0,0 @@
    -/*
    -	Copyright (c) 2011 Google Inc. All rights reserved.
    -	Use of this source code is governed by a BSD-style license that can be
    -	found in the LICENSE file.
    -	
    -	gyp.xclangspec
    -	GYP language specification for Xcode 3
    -
    -	There is not much documentation available regarding the format
    -	of .xclangspec files. As a starting point, see for instance the
    -	outdated documentation at:
    -	http://maxao.free.fr/xcode-plugin-interface/specifications.html
    -	and the files in:
    -	/Developer/Library/PrivateFrameworks/XcodeEdit.framework/Versions/A/Resources/
    -
    -	Place this file in directory:
    -	~/Library/Application Support/Developer/Shared/Xcode/Specifications/
    -*/
    -
    -(
    -
    -    {
    -        Identifier = "xcode.lang.gyp.keyword";
    -        Syntax = {
    -            Words = (
    -                "and",
    -                "or",
    -                " (caar gyp-parse-history) target-point)
    -    (setq gyp-parse-history (cdr gyp-parse-history))))
    -
    -(defun gyp-parse-point ()
    -  "The point of the last parse state added by gyp-parse-to."
    -  (caar gyp-parse-history))
    -
    -(defun gyp-parse-sections ()
    -  "A list of section symbols holding at the last parse state point."
    -  (cdar gyp-parse-history))
    -
    -(defun gyp-inside-dictionary-p ()
    -  "Predicate returning true if the parser is inside a dictionary."
    -  (not (eq (cadar gyp-parse-history) 'list)))
    -
    -(defun gyp-add-parse-history (point sections)
    -  "Add parse state SECTIONS to the parse history at POINT so that parsing can be
    -   resumed instantly."
    -  (while (>= (caar gyp-parse-history) point)
    -    (setq gyp-parse-history (cdr gyp-parse-history)))
    -  (setq gyp-parse-history (cons (cons point sections) gyp-parse-history)))
    -
    -(defun gyp-parse-to (target-point)
    -  "Parses from (point) to TARGET-POINT adding the parse state information to
    -   gyp-parse-state-history. Parsing stops if TARGET-POINT is reached or if a
    -   string literal has been parsed. Returns nil if no further parsing can be
    -   done, otherwise returns the position of the start of a parsed string, leaving
    -   the point at the end of the string."
    -  (let ((parsing t)
    -        string-start)
    -    (while parsing
    -      (setq string-start nil)
    -      ;; Parse up to a character that starts a sexp, or if the nesting
    -      ;; level decreases.
    -      (let ((state (parse-partial-sexp (gyp-parse-point)
    -                                       target-point
    -                                       -1
    -                                       t))
    -            (sections (gyp-parse-sections)))
    -        (if (= (nth 0 state) -1)
    -            (setq sections (cdr sections)) ; pop out a level
    -          (cond ((looking-at-p "['\"]") ; a string
    -                 (setq string-start (point))
    -                 (goto-char (scan-sexps (point) 1))
    -                 (if (gyp-inside-dictionary-p)
    -                     ;; Look for sections inside a dictionary
    -                     (let ((section (gyp-section-name
    -                                     (buffer-substring-no-properties
    -                                      (+ 1 string-start)
    -                                      (- (point) 1)))))
    -                       (setq sections (cons section (cdr sections)))))
    -                 ;; Stop after the string so it can be fontified.
    -                 (setq target-point (point)))
    -                ((looking-at-p "{")
    -                 ;; Inside a dictionary. Increase nesting.
    -                 (forward-char 1)
    -                 (setq sections (cons 'unknown sections)))
    -                ((looking-at-p "\\[")
    -                 ;; Inside a list. Increase nesting
    -                 (forward-char 1)
    -                 (setq sections (cons 'list sections)))
    -                ((not (eobp))
    -                 ;; other
    -                 (forward-char 1))))
    -        (gyp-add-parse-history (point) sections)
    -        (setq parsing (< (point) target-point))))
    -    string-start))
    -
    -(defun gyp-section-at-point ()
    -  "Transform the last parse state, which is a list of nested sections and return
    -   the section symbol that should be used to determine font-lock information for
    -   the string. Can return nil indicating the string should not have any attached
    -   section."
    -  (let ((sections (gyp-parse-sections)))
    -    (cond
    -     ((eq (car sections) 'conditions)
    -      ;; conditions can occur in a variables section, but we still want to
    -      ;; highlight it as a keyword.
    -      nil)
    -     ((and (eq (car sections) 'list)
    -           (eq (cadr sections) 'list))
    -      ;; conditions and sources can have items in [[ ]]
    -      (caddr sections))
    -     (t (cadr sections)))))
    -
    -(defun gyp-section-match (limit)
    -  "Parse from (point) to LIMIT returning by means of match data what was
    -   matched. The group of the match indicates what style font-lock should apply.
    -   See also `gyp-add-font-lock-keywords'."
    -  (gyp-invalidate-parse-states-after (point))
    -  (let ((group nil)
    -        (string-start t))
    -    (while (and (< (point) limit)
    -                (not group)
    -                string-start)
    -      (setq string-start (gyp-parse-to limit))
    -      (if string-start
    -          (setq group (cl-case (gyp-section-at-point)
    -                        ('dependencies 1)
    -                        ('variables 2)
    -                        ('conditions 2)
    -                        ('sources 3)
    -                        ('defines 4)
    -                        (nil nil)))))
    -    (if group
    -        (progn
    -          ;; Set the match data to indicate to the font-lock mechanism the
    -          ;; highlighting to be performed.
    -          (set-match-data (append (list string-start (point))
    -                                  (make-list (* (1- group) 2) nil)
    -                                  (list (1+ string-start) (1- (point)))))
    -          t))))
    -
    -;;; Please see http://code.google.com/p/gyp/wiki/GypLanguageSpecification for
    -;;; canonical list of keywords.
    -(defun gyp-add-font-lock-keywords ()
    -  "Add gyp-mode keywords to font-lock mechanism."
    -  ;; TODO(jknotten): Move all the keyword highlighting into gyp-section-match
    -  ;; so that we can do the font-locking in a single font-lock pass.
    -  (font-lock-add-keywords
    -   nil
    -   (list
    -    ;; Top-level keywords
    -    (list (concat "['\"]\\("
    -              (regexp-opt (list "action" "action_name" "actions" "cflags"
    -                                "cflags_cc" "conditions" "configurations"
    -                                "copies" "defines" "dependencies" "destination"
    -                                "direct_dependent_settings"
    -                                "export_dependent_settings" "extension" "files"
    -                                "include_dirs" "includes" "inputs" "ldflags" "libraries"
    -                                "link_settings" "mac_bundle" "message"
    -                                "msvs_external_rule" "outputs" "product_name"
    -                                "process_outputs_as_sources" "rules" "rule_name"
    -                                "sources" "suppress_wildcard"
    -                                "target_conditions" "target_defaults"
    -                                "target_defines" "target_name" "toolsets"
    -                                "targets" "type" "variables" "xcode_settings"))
    -              "[!/+=]?\\)") 1 'font-lock-keyword-face t)
    -    ;; Type of target
    -    (list (concat "['\"]\\("
    -              (regexp-opt (list "loadable_module" "static_library"
    -                                "shared_library" "executable" "none"))
    -              "\\)") 1 'font-lock-type-face t)
    -    (list "\\(?:target\\|action\\)_name['\"]\\s-*:\\s-*['\"]\\([^ '\"]*\\)" 1
    -          'font-lock-function-name-face t)
    -    (list 'gyp-section-match
    -          (list 1 'font-lock-function-name-face t t) ; dependencies
    -          (list 2 'font-lock-variable-name-face t t) ; variables, conditions
    -          (list 3 'font-lock-constant-face t t) ; sources
    -          (list 4 'font-lock-preprocessor-face t t)) ; preprocessor
    -    ;; Variable expansion
    -    (list "<@?(\\([^\n )]+\\))" 1 'font-lock-variable-name-face t)
    -    ;; Command expansion
    -    (list " "{dst}"')
    -
    -    print("}")
    -
    -
    -def main():
    -    if len(sys.argv) < 2:
    -        print(__doc__, file=sys.stderr)
    -        print(file=sys.stderr)
    -        print("usage: %s target1 target2..." % (sys.argv[0]), file=sys.stderr)
    -        return 1
    -
    -    edges = LoadEdges("dump.json", sys.argv[1:])
    -
    -    WriteGraph(edges)
    -    return 0
    -
    -
    -if __name__ == "__main__":
    -    sys.exit(main())
    diff --git a/deps/npm/node_modules/node-gyp/gyp/tools/pretty_gyp.py b/deps/npm/node_modules/node-gyp/gyp/tools/pretty_gyp.py
    deleted file mode 100755
    index 6eef3a1bbf02a5..00000000000000
    --- a/deps/npm/node_modules/node-gyp/gyp/tools/pretty_gyp.py
    +++ /dev/null
    @@ -1,156 +0,0 @@
    -#!/usr/bin/env python3
    -
    -# Copyright (c) 2012 Google Inc. All rights reserved.
    -# Use of this source code is governed by a BSD-style license that can be
    -# found in the LICENSE file.
    -
    -"""Pretty-prints the contents of a GYP file."""
    -
    -
    -import sys
    -import re
    -
    -
    -# Regex to remove comments when we're counting braces.
    -COMMENT_RE = re.compile(r"\s*#.*")
    -
    -# Regex to remove quoted strings when we're counting braces.
    -# It takes into account quoted quotes, and makes sure that the quotes match.
    -# NOTE: It does not handle quotes that span more than one line, or
    -# cases where an escaped quote is preceded by an escaped backslash.
    -QUOTE_RE_STR = r'(?P[\'"])(.*?)(? 0:
    -        after = True
    -
    -    # This catches the special case of a closing brace having something
    -    # other than just whitespace ahead of it -- we don't want to
    -    # unindent that until after this line is printed so it stays with
    -    # the previous indentation level.
    -    if cnt < 0 and closing_prefix_re.match(stripline):
    -        after = True
    -    return (cnt, after)
    -
    -
    -def prettyprint_input(lines):
    -    """Does the main work of indenting the input based on the brace counts."""
    -    indent = 0
    -    basic_offset = 2
    -    for line in lines:
    -        if COMMENT_RE.match(line):
    -            print(line)
    -        else:
    -            line = line.strip("\r\n\t ")  # Otherwise doesn't strip \r on Unix.
    -            if len(line) > 0:
    -                (brace_diff, after) = count_braces(line)
    -                if brace_diff != 0:
    -                    if after:
    -                        print(" " * (basic_offset * indent) + line)
    -                        indent += brace_diff
    -                    else:
    -                        indent += brace_diff
    -                        print(" " * (basic_offset * indent) + line)
    -                else:
    -                    print(" " * (basic_offset * indent) + line)
    -            else:
    -                print("")
    -
    -
    -def main():
    -    if len(sys.argv) > 1:
    -        data = open(sys.argv[1]).read().splitlines()
    -    else:
    -        data = sys.stdin.read().splitlines()
    -    # Split up the double braces.
    -    lines = split_double_braces(data)
    -
    -    # Indent and print the output.
    -    prettyprint_input(lines)
    -    return 0
    -
    -
    -if __name__ == "__main__":
    -    sys.exit(main())
    diff --git a/deps/npm/node_modules/node-gyp/gyp/tools/pretty_sln.py b/deps/npm/node_modules/node-gyp/gyp/tools/pretty_sln.py
    deleted file mode 100755
    index 6ca0cd12a7ba06..00000000000000
    --- a/deps/npm/node_modules/node-gyp/gyp/tools/pretty_sln.py
    +++ /dev/null
    @@ -1,181 +0,0 @@
    -#!/usr/bin/env python3
    -
    -# Copyright (c) 2012 Google Inc. All rights reserved.
    -# Use of this source code is governed by a BSD-style license that can be
    -# found in the LICENSE file.
    -
    -"""Prints the information in a sln file in a diffable way.
    -
    -   It first outputs each projects in alphabetical order with their
    -   dependencies.
    -
    -   Then it outputs a possible build order.
    -"""
    -
    -
    -import os
    -import re
    -import sys
    -import pretty_vcproj
    -
    -__author__ = "nsylvain (Nicolas Sylvain)"
    -
    -
    -def BuildProject(project, built, projects, deps):
    -    # if all dependencies are done, we can build it, otherwise we try to build the
    -    # dependency.
    -    # This is not infinite-recursion proof.
    -    for dep in deps[project]:
    -        if dep not in built:
    -            BuildProject(dep, built, projects, deps)
    -    print(project)
    -    built.append(project)
    -
    -
    -def ParseSolution(solution_file):
    -    # All projects, their clsid and paths.
    -    projects = dict()
    -
    -    # A list of dependencies associated with a project.
    -    dependencies = dict()
    -
    -    # Regular expressions that matches the SLN format.
    -    # The first line of a project definition.
    -    begin_project = re.compile(
    -        r'^Project\("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942'
    -        r'}"\) = "(.*)", "(.*)", "(.*)"$'
    -    )
    -    # The last line of a project definition.
    -    end_project = re.compile("^EndProject$")
    -    # The first line of a dependency list.
    -    begin_dep = re.compile(r"ProjectSection\(ProjectDependencies\) = postProject$")
    -    # The last line of a dependency list.
    -    end_dep = re.compile("EndProjectSection$")
    -    # A line describing a dependency.
    -    dep_line = re.compile(" *({.*}) = ({.*})$")
    -
    -    in_deps = False
    -    solution = open(solution_file)
    -    for line in solution:
    -        results = begin_project.search(line)
    -        if results:
    -            # Hack to remove icu because the diff is too different.
    -            if results.group(1).find("icu") != -1:
    -                continue
    -            # We remove "_gyp" from the names because it helps to diff them.
    -            current_project = results.group(1).replace("_gyp", "")
    -            projects[current_project] = [
    -                results.group(2).replace("_gyp", ""),
    -                results.group(3),
    -                results.group(2),
    -            ]
    -            dependencies[current_project] = []
    -            continue
    -
    -        results = end_project.search(line)
    -        if results:
    -            current_project = None
    -            continue
    -
    -        results = begin_dep.search(line)
    -        if results:
    -            in_deps = True
    -            continue
    -
    -        results = end_dep.search(line)
    -        if results:
    -            in_deps = False
    -            continue
    -
    -        results = dep_line.search(line)
    -        if results and in_deps and current_project:
    -            dependencies[current_project].append(results.group(1))
    -            continue
    -
    -    # Change all dependencies clsid to name instead.
    -    for project in dependencies:
    -        # For each dependencies in this project
    -        new_dep_array = []
    -        for dep in dependencies[project]:
    -            # Look for the project name matching this cldis
    -            for project_info in projects:
    -                if projects[project_info][1] == dep:
    -                    new_dep_array.append(project_info)
    -        dependencies[project] = sorted(new_dep_array)
    -
    -    return (projects, dependencies)
    -
    -
    -def PrintDependencies(projects, deps):
    -    print("---------------------------------------")
    -    print("Dependencies for all projects")
    -    print("---------------------------------------")
    -    print("--                                   --")
    -
    -    for (project, dep_list) in sorted(deps.items()):
    -        print("Project : %s" % project)
    -        print("Path : %s" % projects[project][0])
    -        if dep_list:
    -            for dep in dep_list:
    -                print("  - %s" % dep)
    -        print("")
    -
    -    print("--                                   --")
    -
    -
    -def PrintBuildOrder(projects, deps):
    -    print("---------------------------------------")
    -    print("Build order                            ")
    -    print("---------------------------------------")
    -    print("--                                   --")
    -
    -    built = []
    -    for (project, _) in sorted(deps.items()):
    -        if project not in built:
    -            BuildProject(project, built, projects, deps)
    -
    -    print("--                                   --")
    -
    -
    -def PrintVCProj(projects):
    -
    -    for project in projects:
    -        print("-------------------------------------")
    -        print("-------------------------------------")
    -        print(project)
    -        print(project)
    -        print(project)
    -        print("-------------------------------------")
    -        print("-------------------------------------")
    -
    -        project_path = os.path.abspath(
    -            os.path.join(os.path.dirname(sys.argv[1]), projects[project][2])
    -        )
    -
    -        pretty = pretty_vcproj
    -        argv = [
    -            "",
    -            project_path,
    -            "$(SolutionDir)=%s\\" % os.path.dirname(sys.argv[1]),
    -        ]
    -        argv.extend(sys.argv[3:])
    -        pretty.main(argv)
    -
    -
    -def main():
    -    # check if we have exactly 1 parameter.
    -    if len(sys.argv) < 2:
    -        print('Usage: %s "c:\\path\\to\\project.sln"' % sys.argv[0])
    -        return 1
    -
    -    (projects, deps) = ParseSolution(sys.argv[1])
    -    PrintDependencies(projects, deps)
    -    PrintBuildOrder(projects, deps)
    -
    -    if "--recursive" in sys.argv:
    -        PrintVCProj(projects)
    -    return 0
    -
    -
    -if __name__ == "__main__":
    -    sys.exit(main())
    diff --git a/deps/npm/node_modules/node-gyp/gyp/tools/pretty_vcproj.py b/deps/npm/node_modules/node-gyp/gyp/tools/pretty_vcproj.py
    deleted file mode 100755
    index 00d32debda51f0..00000000000000
    --- a/deps/npm/node_modules/node-gyp/gyp/tools/pretty_vcproj.py
    +++ /dev/null
    @@ -1,339 +0,0 @@
    -#!/usr/bin/env python3
    -
    -# Copyright (c) 2012 Google Inc. All rights reserved.
    -# Use of this source code is governed by a BSD-style license that can be
    -# found in the LICENSE file.
    -
    -"""Make the format of a vcproj really pretty.
    -
    -   This script normalize and sort an xml. It also fetches all the properties
    -   inside linked vsprops and include them explicitly in the vcproj.
    -
    -   It outputs the resulting xml to stdout.
    -"""
    -
    -
    -import os
    -import sys
    -
    -from xml.dom.minidom import parse
    -from xml.dom.minidom import Node
    -
    -__author__ = "nsylvain (Nicolas Sylvain)"
    -ARGUMENTS = None
    -REPLACEMENTS = dict()
    -
    -
    -def cmp(x, y):
    -    return (x > y) - (x < y)
    -
    -
    -class CmpTuple:
    -    """Compare function between 2 tuple."""
    -
    -    def __call__(self, x, y):
    -        return cmp(x[0], y[0])
    -
    -
    -class CmpNode:
    -    """Compare function between 2 xml nodes."""
    -
    -    def __call__(self, x, y):
    -        def get_string(node):
    -            node_string = "node"
    -            node_string += node.nodeName
    -            if node.nodeValue:
    -                node_string += node.nodeValue
    -
    -            if node.attributes:
    -                # We first sort by name, if present.
    -                node_string += node.getAttribute("Name")
    -
    -                all_nodes = []
    -                for (name, value) in node.attributes.items():
    -                    all_nodes.append((name, value))
    -
    -                all_nodes.sort(CmpTuple())
    -                for (name, value) in all_nodes:
    -                    node_string += name
    -                    node_string += value
    -
    -            return node_string
    -
    -        return cmp(get_string(x), get_string(y))
    -
    -
    -def PrettyPrintNode(node, indent=0):
    -    if node.nodeType == Node.TEXT_NODE:
    -        if node.data.strip():
    -            print("{}{}".format(" " * indent, node.data.strip()))
    -        return
    -
    -    if node.childNodes:
    -        node.normalize()
    -    # Get the number of attributes
    -    attr_count = 0
    -    if node.attributes:
    -        attr_count = node.attributes.length
    -
    -    # Print the main tag
    -    if attr_count == 0:
    -        print("{}<{}>".format(" " * indent, node.nodeName))
    -    else:
    -        print("{}<{}".format(" " * indent, node.nodeName))
    -
    -        all_attributes = []
    -        for (name, value) in node.attributes.items():
    -            all_attributes.append((name, value))
    -            all_attributes.sort(CmpTuple())
    -        for (name, value) in all_attributes:
    -            print('{}  {}="{}"'.format(" " * indent, name, value))
    -        print("%s>" % (" " * indent))
    -    if node.nodeValue:
    -        print("{}  {}".format(" " * indent, node.nodeValue))
    -
    -    for sub_node in node.childNodes:
    -        PrettyPrintNode(sub_node, indent=indent + 2)
    -    print("{}".format(" " * indent, node.nodeName))
    -
    -
    -def FlattenFilter(node):
    -    """Returns a list of all the node and sub nodes."""
    -    node_list = []
    -
    -    if node.attributes and node.getAttribute("Name") == "_excluded_files":
    -        # We don't add the "_excluded_files" filter.
    -        return []
    -
    -    for current in node.childNodes:
    -        if current.nodeName == "Filter":
    -            node_list.extend(FlattenFilter(current))
    -        else:
    -            node_list.append(current)
    -
    -    return node_list
    -
    -
    -def FixFilenames(filenames, current_directory):
    -    new_list = []
    -    for filename in filenames:
    -        if filename:
    -            for key in REPLACEMENTS:
    -                filename = filename.replace(key, REPLACEMENTS[key])
    -            os.chdir(current_directory)
    -            filename = filename.strip("\"' ")
    -            if filename.startswith("$"):
    -                new_list.append(filename)
    -            else:
    -                new_list.append(os.path.abspath(filename))
    -    return new_list
    -
    -
    -def AbsoluteNode(node):
    -    """Makes all the properties we know about in this node absolute."""
    -    if node.attributes:
    -        for (name, value) in node.attributes.items():
    -            if name in [
    -                "InheritedPropertySheets",
    -                "RelativePath",
    -                "AdditionalIncludeDirectories",
    -                "IntermediateDirectory",
    -                "OutputDirectory",
    -                "AdditionalLibraryDirectories",
    -            ]:
    -                # We want to fix up these paths
    -                path_list = value.split(";")
    -                new_list = FixFilenames(path_list, os.path.dirname(ARGUMENTS[1]))
    -                node.setAttribute(name, ";".join(new_list))
    -            if not value:
    -                node.removeAttribute(name)
    -
    -
    -def CleanupVcproj(node):
    -    """For each sub node, we call recursively this function."""
    -    for sub_node in node.childNodes:
    -        AbsoluteNode(sub_node)
    -        CleanupVcproj(sub_node)
    -
    -    # Normalize the node, and remove all extraneous whitespaces.
    -    for sub_node in node.childNodes:
    -        if sub_node.nodeType == Node.TEXT_NODE:
    -            sub_node.data = sub_node.data.replace("\r", "")
    -            sub_node.data = sub_node.data.replace("\n", "")
    -            sub_node.data = sub_node.data.rstrip()
    -
    -    # Fix all the semicolon separated attributes to be sorted, and we also
    -    # remove the dups.
    -    if node.attributes:
    -        for (name, value) in node.attributes.items():
    -            sorted_list = sorted(value.split(";"))
    -            unique_list = []
    -            for i in sorted_list:
    -                if not unique_list.count(i):
    -                    unique_list.append(i)
    -            node.setAttribute(name, ";".join(unique_list))
    -            if not value:
    -                node.removeAttribute(name)
    -
    -    if node.childNodes:
    -        node.normalize()
    -
    -    # For each node, take a copy, and remove it from the list.
    -    node_array = []
    -    while node.childNodes and node.childNodes[0]:
    -        # Take a copy of the node and remove it from the list.
    -        current = node.childNodes[0]
    -        node.removeChild(current)
    -
    -        # If the child is a filter, we want to append all its children
    -        # to this same list.
    -        if current.nodeName == "Filter":
    -            node_array.extend(FlattenFilter(current))
    -        else:
    -            node_array.append(current)
    -
    -    # Sort the list.
    -    node_array.sort(CmpNode())
    -
    -    # Insert the nodes in the correct order.
    -    for new_node in node_array:
    -        # But don't append empty tool node.
    -        if new_node.nodeName == "Tool":
    -            if new_node.attributes and new_node.attributes.length == 1:
    -                # This one was empty.
    -                continue
    -        if new_node.nodeName == "UserMacro":
    -            continue
    -        node.appendChild(new_node)
    -
    -
    -def GetConfiguationNodes(vcproj):
    -    # TODO(nsylvain): Find a better way to navigate the xml.
    -    nodes = []
    -    for node in vcproj.childNodes:
    -        if node.nodeName == "Configurations":
    -            for sub_node in node.childNodes:
    -                if sub_node.nodeName == "Configuration":
    -                    nodes.append(sub_node)
    -
    -    return nodes
    -
    -
    -def GetChildrenVsprops(filename):
    -    dom = parse(filename)
    -    if dom.documentElement.attributes:
    -        vsprops = dom.documentElement.getAttribute("InheritedPropertySheets")
    -        return FixFilenames(vsprops.split(";"), os.path.dirname(filename))
    -    return []
    -
    -
    -def SeekToNode(node1, child2):
    -    # A text node does not have properties.
    -    if child2.nodeType == Node.TEXT_NODE:
    -        return None
    -
    -    # Get the name of the current node.
    -    current_name = child2.getAttribute("Name")
    -    if not current_name:
    -        # There is no name. We don't know how to merge.
    -        return None
    -
    -    # Look through all the nodes to find a match.
    -    for sub_node in node1.childNodes:
    -        if sub_node.nodeName == child2.nodeName:
    -            name = sub_node.getAttribute("Name")
    -            if name == current_name:
    -                return sub_node
    -
    -    # No match. We give up.
    -    return None
    -
    -
    -def MergeAttributes(node1, node2):
    -    # No attributes to merge?
    -    if not node2.attributes:
    -        return
    -
    -    for (name, value2) in node2.attributes.items():
    -        # Don't merge the 'Name' attribute.
    -        if name == "Name":
    -            continue
    -        value1 = node1.getAttribute(name)
    -        if value1:
    -            # The attribute exist in the main node. If it's equal, we leave it
    -            # untouched, otherwise we concatenate it.
    -            if value1 != value2:
    -                node1.setAttribute(name, ";".join([value1, value2]))
    -        else:
    -            # The attribute does not exist in the main node. We append this one.
    -            node1.setAttribute(name, value2)
    -
    -        # If the attribute was a property sheet attributes, we remove it, since
    -        # they are useless.
    -        if name == "InheritedPropertySheets":
    -            node1.removeAttribute(name)
    -
    -
    -def MergeProperties(node1, node2):
    -    MergeAttributes(node1, node2)
    -    for child2 in node2.childNodes:
    -        child1 = SeekToNode(node1, child2)
    -        if child1:
    -            MergeProperties(child1, child2)
    -        else:
    -            node1.appendChild(child2.cloneNode(True))
    -
    -
    -def main(argv):
    -    """Main function of this vcproj prettifier."""
    -    global ARGUMENTS
    -    ARGUMENTS = argv
    -
    -    # check if we have exactly 1 parameter.
    -    if len(argv) < 2:
    -        print(
    -            'Usage: %s "c:\\path\\to\\vcproj.vcproj" [key1=value1] '
    -            "[key2=value2]" % argv[0]
    -        )
    -        return 1
    -
    -    # Parse the keys
    -    for i in range(2, len(argv)):
    -        (key, value) = argv[i].split("=")
    -        REPLACEMENTS[key] = value
    -
    -    # Open the vcproj and parse the xml.
    -    dom = parse(argv[1])
    -
    -    # First thing we need to do is find the Configuration Node and merge them
    -    # with the vsprops they include.
    -    for configuration_node in GetConfiguationNodes(dom.documentElement):
    -        # Get the property sheets associated with this configuration.
    -        vsprops = configuration_node.getAttribute("InheritedPropertySheets")
    -
    -        # Fix the filenames to be absolute.
    -        vsprops_list = FixFilenames(
    -            vsprops.strip().split(";"), os.path.dirname(argv[1])
    -        )
    -
    -        # Extend the list of vsprops with all vsprops contained in the current
    -        # vsprops.
    -        for current_vsprops in vsprops_list:
    -            vsprops_list.extend(GetChildrenVsprops(current_vsprops))
    -
    -        # Now that we have all the vsprops, we need to merge them.
    -        for current_vsprops in vsprops_list:
    -            MergeProperties(configuration_node, parse(current_vsprops).documentElement)
    -
    -    # Now that everything is merged, we need to cleanup the xml.
    -    CleanupVcproj(dom.documentElement)
    -
    -    # Finally, we use the prett xml function to print the vcproj back to the
    -    # user.
    -    # print dom.toprettyxml(newl="\n")
    -    PrettyPrintNode(dom.documentElement)
    -    return 0
    -
    -
    -if __name__ == "__main__":
    -    sys.exit(main(sys.argv))
    diff --git a/deps/npm/node_modules/node-gyp/lib/build.js b/deps/npm/node_modules/node-gyp/lib/build.js
    index ea1f90652a05d8..6b8d84d3ede344 100644
    --- a/deps/npm/node_modules/node-gyp/lib/build.js
    +++ b/deps/npm/node_modules/node-gyp/lib/build.js
    @@ -1,14 +1,14 @@
     'use strict'
     
    -const fs = require('graceful-fs')
    +const fs = require('graceful-fs').promises
     const path = require('path')
    -const glob = require('glob')
    -const log = require('npmlog')
    +const { glob } = require('glob')
    +const log = require('./log')
     const which = require('which')
     const win = process.platform === 'win32'
     
    -function build (gyp, argv, callback) {
    -  var platformMake = 'make'
    +async function build (gyp, argv) {
    +  let platformMake = 'make'
       if (process.platform === 'aix') {
         platformMake = 'gmake'
       } else if (process.platform === 'os400') {
    @@ -21,113 +21,107 @@ function build (gyp, argv, callback) {
         })
       }
     
    -  var makeCommand = gyp.opts.make || process.env.MAKE || platformMake
    -  var command = win ? 'msbuild' : makeCommand
    -  var jobs = gyp.opts.jobs || process.env.JOBS
    -  var buildType
    -  var config
    -  var arch
    -  var nodeDir
    -  var guessedSolution
    +  const makeCommand = gyp.opts.make || process.env.MAKE || platformMake
    +  let command = win ? 'msbuild' : makeCommand
    +  const jobs = gyp.opts.jobs || process.env.JOBS
    +  let buildType
    +  let config
    +  let arch
    +  let nodeDir
    +  let guessedSolution
    +  let python
    +  let buildBinsDir
     
    -  loadConfigGypi()
    +  await loadConfigGypi()
     
       /**
        * Load the "config.gypi" file that was generated during "configure".
        */
     
    -  function loadConfigGypi () {
    -    var configPath = path.resolve('build', 'config.gypi')
    -
    -    fs.readFile(configPath, 'utf8', function (err, data) {
    -      if (err) {
    -        if (err.code === 'ENOENT') {
    -          callback(new Error('You must run `node-gyp configure` first!'))
    -        } else {
    -          callback(err)
    -        }
    -        return
    +  async function loadConfigGypi () {
    +    let data
    +    try {
    +      const configPath = path.resolve('build', 'config.gypi')
    +      data = await fs.readFile(configPath, 'utf8')
    +    } catch (err) {
    +      if (err.code === 'ENOENT') {
    +        throw new Error('You must run `node-gyp configure` first!')
    +      } else {
    +        throw err
           }
    -      config = JSON.parse(data.replace(/#.+\n/, ''))
    +    }
     
    -      // get the 'arch', 'buildType', and 'nodeDir' vars from the config
    -      buildType = config.target_defaults.default_configuration
    -      arch = config.variables.target_arch
    -      nodeDir = config.variables.nodedir
    +    config = JSON.parse(data.replace(/#.+\n/, ''))
     
    -      if ('debug' in gyp.opts) {
    -        buildType = gyp.opts.debug ? 'Debug' : 'Release'
    -      }
    -      if (!buildType) {
    -        buildType = 'Release'
    -      }
    +    // get the 'arch', 'buildType', and 'nodeDir' vars from the config
    +    buildType = config.target_defaults.default_configuration
    +    arch = config.variables.target_arch
    +    nodeDir = config.variables.nodedir
    +    python = config.variables.python
     
    -      log.verbose('build type', buildType)
    -      log.verbose('architecture', arch)
    -      log.verbose('node dev dir', nodeDir)
    +    if ('debug' in gyp.opts) {
    +      buildType = gyp.opts.debug ? 'Debug' : 'Release'
    +    }
    +    if (!buildType) {
    +      buildType = 'Release'
    +    }
     
    -      if (win) {
    -        findSolutionFile()
    -      } else {
    -        doWhich()
    -      }
    -    })
    +    log.verbose('build type', buildType)
    +    log.verbose('architecture', arch)
    +    log.verbose('node dev dir', nodeDir)
    +    log.verbose('python', python)
    +
    +    if (win) {
    +      await findSolutionFile()
    +    } else {
    +      await doWhich()
    +    }
       }
     
       /**
        * On Windows, find the first build/*.sln file.
        */
     
    -  function findSolutionFile () {
    -    glob('build/*.sln', function (err, files) {
    -      if (err) {
    -        return callback(err)
    -      }
    -      if (files.length === 0) {
    -        return callback(new Error('Could not find *.sln file. Did you run "configure"?'))
    -      }
    -      guessedSolution = files[0]
    -      log.verbose('found first Solution file', guessedSolution)
    -      doWhich()
    -    })
    +  async function findSolutionFile () {
    +    const files = await glob('build/*.sln')
    +    if (files.length === 0) {
    +      throw new Error('Could not find *.sln file. Did you run "configure"?')
    +    }
    +    guessedSolution = files[0]
    +    log.verbose('found first Solution file', guessedSolution)
    +    await doWhich()
       }
     
       /**
        * Uses node-which to locate the msbuild / make executable.
        */
     
    -  function doWhich () {
    +  async function doWhich () {
         // On Windows use msbuild provided by node-gyp configure
         if (win) {
           if (!config.variables.msbuild_path) {
    -        return callback(new Error(
    -          'MSBuild is not set, please run `node-gyp configure`.'))
    +        throw new Error('MSBuild is not set, please run `node-gyp configure`.')
           }
           command = config.variables.msbuild_path
           log.verbose('using MSBuild:', command)
    -      doBuild()
    +      await doBuild()
           return
         }
    +
         // First make sure we have the build command in the PATH
    -    which(command, function (err, execPath) {
    -      if (err) {
    -        // Some other error or 'make' not found on Unix, report that to the user
    -        callback(err)
    -        return
    -      }
    -      log.verbose('`which` succeeded for `' + command + '`', execPath)
    -      doBuild()
    -    })
    +    const execPath = await which(command)
    +    log.verbose('`which` succeeded for `' + command + '`', execPath)
    +    await doBuild()
       }
     
       /**
        * Actually spawn the process and compile the module.
        */
     
    -  function doBuild () {
    +  async function doBuild () {
         // Enable Verbose build
    -    var verbose = log.levels[log.level] <= log.levels.verbose
    -    var j
    +    const verbose = log.logger.isVisible('verbose')
    +    let j
     
         if (!win && verbose) {
           argv.push('V=1')
    @@ -147,10 +141,12 @@ function build (gyp, argv, callback) {
           // Convert .gypi config target_arch to MSBuild /Platform
           // Since there are many ways to state '32-bit Intel', default to it.
           // N.B. msbuild's Condition string equality tests are case-insensitive.
    -      var archLower = arch.toLowerCase()
    -      var p = archLower === 'x64' ? 'x64'
    -        : (archLower === 'arm' ? 'ARM'
    -          : (archLower === 'arm64' ? 'ARM64' : 'Win32'))
    +      const archLower = arch.toLowerCase()
    +      const p = archLower === 'x64'
    +        ? 'x64'
    +        : (archLower === 'arm'
    +            ? 'ARM'
    +            : (archLower === 'arm64' ? 'ARM64' : 'Win32'))
           argv.push('/p:Configuration=' + buildType + ';Platform=' + p)
           if (jobs) {
             j = parseInt(jobs, 10)
    @@ -179,7 +175,7 @@ function build (gyp, argv, callback) {
     
         if (win) {
           // did the user specify their own .sln file?
    -      var hasSln = argv.some(function (arg) {
    +      const hasSln = argv.some(function (arg) {
             return path.extname(arg) === '.sln'
           })
           if (!hasSln) {
    @@ -189,23 +185,34 @@ function build (gyp, argv, callback) {
     
         if (!win) {
           // Add build-time dependency symlinks (such as Python) to PATH
    -      const buildBinsDir = path.resolve('build', 'node_gyp_bins')
    +      buildBinsDir = path.resolve('build', 'node_gyp_bins')
           process.env.PATH = `${buildBinsDir}:${process.env.PATH}`
    -      log.verbose('bin symlinks', `adding symlinks (such as Python), at "${buildBinsDir}", to PATH`)
    +      await fs.mkdir(buildBinsDir, { recursive: true })
    +      const symlinkDestination = path.join(buildBinsDir, 'python3')
    +      try {
    +        await fs.unlink(symlinkDestination)
    +      } catch (err) {
    +        if (err.code !== 'ENOENT') throw err
    +      }
    +      await fs.symlink(python, symlinkDestination)
    +      log.verbose('bin symlinks', `created symlink to "${python}" in "${buildBinsDir}" and added to PATH`)
         }
     
    -    var proc = gyp.spawn(command, argv)
    -    proc.on('exit', onExit)
    -  }
    +    const proc = gyp.spawn(command, argv)
    +    await new Promise((resolve, reject) => proc.on('exit', async (code, signal) => {
    +      if (buildBinsDir) {
    +        // Clean up the build-time dependency symlinks:
    +        await fs.rm(buildBinsDir, { recursive: true })
    +      }
     
    -  function onExit (code, signal) {
    -    if (code !== 0) {
    -      return callback(new Error('`' + command + '` failed with exit code: ' + code))
    -    }
    -    if (signal) {
    -      return callback(new Error('`' + command + '` got signal: ' + signal))
    -    }
    -    callback()
    +      if (code !== 0) {
    +        return reject(new Error('`' + command + '` failed with exit code: ' + code))
    +      }
    +      if (signal) {
    +        return reject(new Error('`' + command + '` got signal: ' + signal))
    +      }
    +      resolve()
    +    }))
       }
     }
     
    diff --git a/deps/npm/node_modules/node-gyp/lib/clean.js b/deps/npm/node_modules/node-gyp/lib/clean.js
    index dbfa4dbb99d3cb..523f8016caecef 100644
    --- a/deps/npm/node_modules/node-gyp/lib/clean.js
    +++ b/deps/npm/node_modules/node-gyp/lib/clean.js
    @@ -1,14 +1,14 @@
     'use strict'
     
    -const rm = require('rimraf')
    -const log = require('npmlog')
    +const fs = require('graceful-fs').promises
    +const log = require('./log')
     
    -function clean (gyp, argv, callback) {
    +async function clean (gyp, argv) {
       // Remove the 'build' dir
    -  var buildDir = 'build'
    +  const buildDir = 'build'
     
       log.verbose('clean', 'removing "%s" directory', buildDir)
    -  rm(buildDir, callback)
    +  await fs.rm(buildDir, { recursive: true, force: true })
     }
     
     module.exports = clean
    diff --git a/deps/npm/node_modules/node-gyp/lib/configure.js b/deps/npm/node_modules/node-gyp/lib/configure.js
    index 1ca3ade70935ee..8da41a849dfcf6 100644
    --- a/deps/npm/node_modules/node-gyp/lib/configure.js
    +++ b/deps/npm/node_modules/node-gyp/lib/configure.js
    @@ -1,47 +1,36 @@
     'use strict'
     
    -const fs = require('graceful-fs')
    +const { promises: fs } = require('graceful-fs')
     const path = require('path')
    -const log = require('npmlog')
    +const log = require('./log')
     const os = require('os')
     const processRelease = require('./process-release')
     const win = process.platform === 'win32'
     const findNodeDirectory = require('./find-node-directory')
    -const createConfigGypi = require('./create-config-gypi')
    -const msgFormat = require('util').format
    -var findPython = require('./find-python')
    -if (win) {
    -  var findVisualStudio = require('./find-visualstudio')
    -}
    -
    -function configure (gyp, argv, callback) {
    -  var python
    -  var buildDir = path.resolve('build')
    -  var buildBinsDir = path.join(buildDir, 'node_gyp_bins')
    -  var configNames = ['config.gypi', 'common.gypi']
    -  var configs = []
    -  var nodeDir
    -  var release = processRelease(argv, gyp, process.version, process.release)
    -
    -  findPython(gyp.opts.python, function (err, found) {
    -    if (err) {
    -      callback(err)
    -    } else {
    -      python = found
    -      getNodeDir()
    -    }
    -  })
    -
    -  function getNodeDir () {
    +const { createConfigGypi } = require('./create-config-gypi')
    +const { format: msgFormat } = require('util')
    +const { findAccessibleSync } = require('./util')
    +const { findPython } = require('./find-python')
    +const { findVisualStudio } = win ? require('./find-visualstudio') : {}
    +
    +async function configure (gyp, argv) {
    +  const buildDir = path.resolve('build')
    +  const configNames = ['config.gypi', 'common.gypi']
    +  const configs = []
    +  let nodeDir
    +  const release = processRelease(argv, gyp, process.version, process.release)
    +
    +  const python = await findPython(gyp.opts.python)
    +  return getNodeDir()
    +
    +  async function getNodeDir () {
         // 'python' should be set by now
         process.env.PYTHON = python
     
         if (gyp.opts.nodedir) {
           // --nodedir was specified. use that for the dev files
           nodeDir = gyp.opts.nodedir.replace(/^~/, os.homedir())
    -
           log.verbose('get node dir', 'compiling against specified --nodedir dev files: %s', nodeDir)
    -      createBuildDir()
         } else {
           // if no --nodedir specified, ensure node dependencies are installed
           if ('v' + release.version !== process.version) {
    @@ -54,108 +43,66 @@ function configure (gyp, argv, callback) {
     
           if (!release.semver) {
             // could not parse the version string with semver
    -        return callback(new Error('Invalid version number: ' + release.version))
    +        throw new Error('Invalid version number: ' + release.version)
           }
     
           // If the tarball option is set, always remove and reinstall the headers
           // into devdir. Otherwise only install if they're not already there.
           gyp.opts.ensure = !gyp.opts.tarball
     
    -      gyp.commands.install([release.version], function (err) {
    -        if (err) {
    -          return callback(err)
    -        }
    -        log.verbose('get node dir', 'target node version installed:', release.versionDir)
    -        nodeDir = path.resolve(gyp.devDir, release.versionDir)
    -        createBuildDir()
    -      })
    -    }
    -  }
    +      await gyp.commands.install([release.version])
     
    -  function createBuildDir () {
    -    log.verbose('build dir', 'attempting to create "build" dir: %s', buildDir)
    +      log.verbose('get node dir', 'target node version installed:', release.versionDir)
    +      nodeDir = path.resolve(gyp.devDir, release.versionDir)
    +    }
     
    -    const deepestBuildDirSubdirectory = win ? buildDir : buildBinsDir
    -    fs.mkdir(deepestBuildDirSubdirectory, { recursive: true }, function (err, isNew) {
    -      if (err) {
    -        return callback(err)
    -      }
    -      log.verbose(
    -        'build dir', '"build" dir needed to be created?', isNew ? 'Yes' : 'No'
    -      )
    -      if (win) {
    -        findVisualStudio(release.semver, gyp.opts.msvs_version,
    -          createConfigFile)
    -      } else {
    -        createPythonSymlink()
    -        createConfigFile()
    -      }
    -    })
    +    return createBuildDir()
       }
     
    -  function createPythonSymlink () {
    -    const symlinkDestination = path.join(buildBinsDir, 'python3')
    -
    -    log.verbose('python symlink', `creating symlink to "${python}" at "${symlinkDestination}"`)
    +  async function createBuildDir () {
    +    log.verbose('build dir', 'attempting to create "build" dir: %s', buildDir)
     
    -    fs.unlink(symlinkDestination, function (err) {
    -      if (err && err.code !== 'ENOENT') {
    -        log.verbose('python symlink', 'error when attempting to remove existing symlink')
    -        log.verbose('python symlink', err.stack, 'errno: ' + err.errno)
    -      }
    -      fs.symlink(python, symlinkDestination, function (err) {
    -        if (err) {
    -          log.verbose('python symlink', 'error when attempting to create Python symlink')
    -          log.verbose('python symlink', err.stack, 'errno: ' + err.errno)
    -        }
    -      })
    -    })
    +    const isNew = await fs.mkdir(buildDir, { recursive: true })
    +    log.verbose(
    +      'build dir', '"build" dir needed to be created?', isNew ? 'Yes' : 'No'
    +    )
    +    const vsInfo = win ? await findVisualStudio(release.semver, gyp.opts['msvs-version']) : null
    +    return createConfigFile(vsInfo)
       }
     
    -  function createConfigFile (err, vsInfo) {
    -    if (err) {
    -      return callback(err)
    -    }
    -    if (process.platform === 'win32') {
    +  async function createConfigFile (vsInfo) {
    +    if (win) {
           process.env.GYP_MSVS_VERSION = Math.min(vsInfo.versionYear, 2015)
           process.env.GYP_MSVS_OVERRIDE_PATH = vsInfo.path
         }
    -    createConfigGypi({ gyp, buildDir, nodeDir, vsInfo }).then(configPath => {
    -      configs.push(configPath)
    -      findConfigs()
    -    }).catch(err => {
    -      callback(err)
    -    })
    +    const configPath = await createConfigGypi({ gyp, buildDir, nodeDir, vsInfo, python })
    +    configs.push(configPath)
    +    return findConfigs()
       }
     
    -  function findConfigs () {
    -    var name = configNames.shift()
    +  async function findConfigs () {
    +    const name = configNames.shift()
         if (!name) {
           return runGyp()
         }
    -    var fullPath = path.resolve(name)
     
    +    const fullPath = path.resolve(name)
         log.verbose(name, 'checking for gypi file: %s', fullPath)
    -    fs.stat(fullPath, function (err) {
    -      if (err) {
    -        if (err.code === 'ENOENT') {
    -          findConfigs() // check next gypi filename
    -        } else {
    -          callback(err)
    -        }
    -      } else {
    -        log.verbose(name, 'found gypi file')
    -        configs.push(fullPath)
    -        findConfigs()
    +    try {
    +      await fs.stat(fullPath)
    +      log.verbose(name, 'found gypi file')
    +      configs.push(fullPath)
    +    } catch (err) {
    +      // ENOENT will check next gypi filename
    +      if (err.code !== 'ENOENT') {
    +        throw err
           }
    -    })
    -  }
    -
    -  function runGyp (err) {
    -    if (err) {
    -      return callback(err)
         }
     
    +    return findConfigs()
    +  }
    +
    +  async function runGyp () {
         if (!~argv.indexOf('-f') && !~argv.indexOf('--format')) {
           if (win) {
             log.verbose('gyp', 'gyp format was not specified; forcing "msvs"')
    @@ -175,11 +122,13 @@ function configure (gyp, argv, callback) {
     
         // For AIX and z/OS we need to set up the path to the exports file
         // which contains the symbols needed for linking.
    -    var nodeExpFile
    +    let nodeExpFile
    +    let nodeRootDir
    +    let candidates
    +    let logprefix = 'find exports file'
         if (process.platform === 'aix' || process.platform === 'os390' || process.platform === 'os400') {
    -      var ext = process.platform === 'os390' ? 'x' : 'exp'
    -      var nodeRootDir = findNodeDirectory()
    -      var candidates
    +      const ext = process.platform === 'os390' ? 'x' : 'exp'
    +      nodeRootDir = findNodeDirectory()
     
           if (process.platform === 'aix' || process.platform === 'os400') {
             candidates = [
    @@ -202,24 +151,23 @@ function configure (gyp, argv, callback) {
             })
           }
     
    -      var logprefix = 'find exports file'
           nodeExpFile = findAccessibleSync(logprefix, nodeRootDir, candidates)
           if (nodeExpFile !== undefined) {
             log.verbose(logprefix, 'Found exports file: %s', nodeExpFile)
           } else {
    -        var msg = msgFormat('Could not find node.%s file in %s', ext, nodeRootDir)
    +        const msg = msgFormat('Could not find node.%s file in %s', ext, nodeRootDir)
             log.error(logprefix, 'Could not find exports file')
    -        return callback(new Error(msg))
    +        throw new Error(msg)
           }
         }
     
         // For z/OS we need to set up the path to zoslib include directory,
         // which contains headers included in v8config.h.
    -    var zoslibIncDir
    +    let zoslibIncDir
         if (process.platform === 'os390') {
           logprefix = "find zoslib's zos-base.h:"
           let msg
    -      var zoslibIncPath = process.env.ZOSLIB_INCLUDES
    +      let zoslibIncPath = process.env.ZOSLIB_INCLUDES
           if (zoslibIncPath) {
             zoslibIncPath = findAccessibleSync(logprefix, zoslibIncPath, ['zos-base.h'])
             if (zoslibIncPath === undefined) {
    @@ -247,114 +195,88 @@ function configure (gyp, argv, callback) {
           } else if (release.version.split('.')[0] >= 16) {
             // zoslib is only shipped in Node v16 and above.
             log.error(logprefix, msg)
    -        return callback(new Error(msg))
    +        throw new Error(msg)
           }
         }
     
         // this logic ported from the old `gyp_addon` python file
    -    var gypScript = path.resolve(__dirname, '..', 'gyp', 'gyp_main.py')
    -    var addonGypi = path.resolve(__dirname, '..', 'addon.gypi')
    -    var commonGypi = path.resolve(nodeDir, 'include/node/common.gypi')
    -    fs.stat(commonGypi, function (err) {
    -      if (err) {
    -        commonGypi = path.resolve(nodeDir, 'common.gypi')
    -      }
    +    const gypScript = path.resolve(__dirname, '..', 'gyp', 'gyp_main.py')
    +    const addonGypi = path.resolve(__dirname, '..', 'addon.gypi')
    +    let commonGypi = path.resolve(nodeDir, 'include/node/common.gypi')
    +    try {
    +      await fs.stat(commonGypi)
    +    } catch (err) {
    +      commonGypi = path.resolve(nodeDir, 'common.gypi')
    +    }
     
    -      var outputDir = 'build'
    -      if (win) {
    -        // Windows expects an absolute path
    -        outputDir = buildDir
    -      }
    -      var nodeGypDir = path.resolve(__dirname, '..')
    -
    -      var nodeLibFile = path.join(nodeDir,
    -        !gyp.opts.nodedir ? '<(target_arch)' : '$(Configuration)',
    -        release.name + '.lib')
    -
    -      argv.push('-I', addonGypi)
    -      argv.push('-I', commonGypi)
    -      argv.push('-Dlibrary=shared_library')
    -      argv.push('-Dvisibility=default')
    -      argv.push('-Dnode_root_dir=' + nodeDir)
    -      if (process.platform === 'aix' || process.platform === 'os390' || process.platform === 'os400') {
    -        argv.push('-Dnode_exp_file=' + nodeExpFile)
    -        if (process.platform === 'os390' && zoslibIncDir) {
    -          argv.push('-Dzoslib_include_dir=' + zoslibIncDir)
    -        }
    -      }
    -      argv.push('-Dnode_gyp_dir=' + nodeGypDir)
    +    let outputDir = 'build'
    +    if (win) {
    +      // Windows expects an absolute path
    +      outputDir = buildDir
    +    }
    +    const nodeGypDir = path.resolve(__dirname, '..')
     
    -      // Do this to keep Cygwin environments happy, else the unescaped '\' gets eaten up,
    -      // resulting in bad paths, Ex c:parentFolderfolderanotherFolder instead of c:\parentFolder\folder\anotherFolder
    -      if (win) {
    -        nodeLibFile = nodeLibFile.replace(/\\/g, '\\\\')
    -      }
    -      argv.push('-Dnode_lib_file=' + nodeLibFile)
    -      argv.push('-Dmodule_root_dir=' + process.cwd())
    -      argv.push('-Dnode_engine=' +
    -        (gyp.opts.node_engine || process.jsEngine || 'v8'))
    -      argv.push('--depth=.')
    -      argv.push('--no-parallel')
    +    let nodeLibFile = path.join(nodeDir,
    +      !gyp.opts.nodedir ? '<(target_arch)' : '$(Configuration)',
    +      release.name + '.lib')
     
    -      // tell gyp to write the Makefile/Solution files into output_dir
    -      argv.push('--generator-output', outputDir)
    +    argv.push('-I', addonGypi)
    +    argv.push('-I', commonGypi)
    +    argv.push('-Dlibrary=shared_library')
    +    argv.push('-Dvisibility=default')
    +    argv.push('-Dnode_root_dir=' + nodeDir)
    +    if (process.platform === 'aix' || process.platform === 'os390' || process.platform === 'os400') {
    +      argv.push('-Dnode_exp_file=' + nodeExpFile)
    +      if (process.platform === 'os390' && zoslibIncDir) {
    +        argv.push('-Dzoslib_include_dir=' + zoslibIncDir)
    +      }
    +    }
    +    argv.push('-Dnode_gyp_dir=' + nodeGypDir)
     
    -      // tell make to write its output into the same dir
    -      argv.push('-Goutput_dir=.')
    +    // Do this to keep Cygwin environments happy, else the unescaped '\' gets eaten up,
    +    // resulting in bad paths, Ex c:parentFolderfolderanotherFolder instead of c:\parentFolder\folder\anotherFolder
    +    if (win) {
    +      nodeLibFile = nodeLibFile.replace(/\\/g, '\\\\')
    +    }
    +    argv.push('-Dnode_lib_file=' + nodeLibFile)
    +    argv.push('-Dmodule_root_dir=' + process.cwd())
    +    argv.push('-Dnode_engine=' +
    +        (gyp.opts.node_engine || process.jsEngine || 'v8'))
    +    argv.push('--depth=.')
    +    argv.push('--no-parallel')
     
    -      // enforce use of the "binding.gyp" file
    -      argv.unshift('binding.gyp')
    +    // tell gyp to write the Makefile/Solution files into output_dir
    +    argv.push('--generator-output', outputDir)
     
    -      // execute `gyp` from the current target nodedir
    -      argv.unshift(gypScript)
    +    // tell make to write its output into the same dir
    +    argv.push('-Goutput_dir=.')
     
    -      // make sure python uses files that came with this particular node package
    -      var pypath = [path.join(__dirname, '..', 'gyp', 'pylib')]
    -      if (process.env.PYTHONPATH) {
    -        pypath.push(process.env.PYTHONPATH)
    -      }
    -      process.env.PYTHONPATH = pypath.join(win ? ';' : ':')
    +    // enforce use of the "binding.gyp" file
    +    argv.unshift('binding.gyp')
     
    -      var cp = gyp.spawn(python, argv)
    -      cp.on('exit', onCpExit)
    -    })
    -  }
    +    // execute `gyp` from the current target nodedir
    +    argv.unshift(gypScript)
     
    -  function onCpExit (code) {
    -    if (code !== 0) {
    -      callback(new Error('`gyp` failed with exit code: ' + code))
    -    } else {
    -      // we're done
    -      callback()
    +    // make sure python uses files that came with this particular node package
    +    const pypath = [path.join(__dirname, '..', 'gyp', 'pylib')]
    +    if (process.env.PYTHONPATH) {
    +      pypath.push(process.env.PYTHONPATH)
         }
    -  }
    -}
    +    process.env.PYTHONPATH = pypath.join(win ? ';' : ':')
     
    -/**
    - * Returns the first file or directory from an array of candidates that is
    - * readable by the current user, or undefined if none of the candidates are
    - * readable.
    - */
    -function findAccessibleSync (logprefix, dir, candidates) {
    -  for (var next = 0; next < candidates.length; next++) {
    -    var candidate = path.resolve(dir, candidates[next])
    -    try {
    -      var fd = fs.openSync(candidate, 'r')
    -    } catch (e) {
    -      // this candidate was not found or not readable, do nothing
    -      log.silly(logprefix, 'Could not open %s: %s', candidate, e.message)
    -      continue
    -    }
    -    fs.closeSync(fd)
    -    log.silly(logprefix, 'Found readable %s', candidate)
    -    return candidate
    +    await new Promise((resolve, reject) => {
    +      const cp = gyp.spawn(python, argv)
    +      cp.on('exit', (code) => {
    +        if (code !== 0) {
    +          reject(new Error('`gyp` failed with exit code: ' + code))
    +        } else {
    +          // we're done
    +          resolve()
    +        }
    +      })
    +    })
       }
    -
    -  return undefined
     }
     
     module.exports = configure
    -module.exports.test = {
    -  findAccessibleSync: findAccessibleSync
    -}
     module.exports.usage = 'Generates ' + (win ? 'MSVC project files' : 'a Makefile') + ' for the current module'
    diff --git a/deps/npm/node_modules/node-gyp/lib/create-config-gypi.js b/deps/npm/node_modules/node-gyp/lib/create-config-gypi.js
    index ced49115027336..d598dea6e2e7fa 100644
    --- a/deps/npm/node_modules/node-gyp/lib/create-config-gypi.js
    +++ b/deps/npm/node_modules/node-gyp/lib/create-config-gypi.js
    @@ -1,7 +1,7 @@
     'use strict'
     
    -const fs = require('graceful-fs')
    -const log = require('npmlog')
    +const fs = require('graceful-fs').promises
    +const log = require('./log')
     const path = require('path')
     
     function parseConfigGypi (config) {
    @@ -24,7 +24,7 @@ async function getBaseConfigGypi ({ gyp, nodeDir }) {
       if (shouldReadConfigGypi && nodeDir) {
         try {
           const baseConfigGypiPath = path.resolve(nodeDir, 'include/node/config.gypi')
    -      const baseConfigGypi = await fs.promises.readFile(baseConfigGypiPath)
    +      const baseConfigGypi = await fs.readFile(baseConfigGypiPath)
           return parseConfigGypi(baseConfigGypi.toString())
         } catch (err) {
           log.warn('read config.gypi', err.message)
    @@ -35,7 +35,7 @@ async function getBaseConfigGypi ({ gyp, nodeDir }) {
       return JSON.parse(JSON.stringify(process.config))
     }
     
    -async function getCurrentConfigGypi ({ gyp, nodeDir, vsInfo }) {
    +async function getCurrentConfigGypi ({ gyp, nodeDir, vsInfo, python }) {
       const config = await getBaseConfigGypi({ gyp, nodeDir })
       if (!config.target_defaults) {
         config.target_defaults = {}
    @@ -75,6 +75,9 @@ async function getCurrentConfigGypi ({ gyp, nodeDir, vsInfo }) {
       // set the node development directory
       variables.nodedir = nodeDir
     
    +  // set the configured Python path
    +  variables.python = python
    +
       // disable -T "thin" static archives by default
       variables.standalone_static_library = gyp.opts.thin ? 0 : 1
     
    @@ -112,13 +115,13 @@ async function getCurrentConfigGypi ({ gyp, nodeDir, vsInfo }) {
       return config
     }
     
    -async function createConfigGypi ({ gyp, buildDir, nodeDir, vsInfo }) {
    +async function createConfigGypi ({ gyp, buildDir, nodeDir, vsInfo, python }) {
       const configFilename = 'config.gypi'
       const configPath = path.resolve(buildDir, configFilename)
     
       log.verbose('build/' + configFilename, 'creating config file')
     
    -  const config = await getCurrentConfigGypi({ gyp, nodeDir, vsInfo })
    +  const config = await getCurrentConfigGypi({ gyp, nodeDir, vsInfo, python })
     
       // ensures that any boolean values in config.gypi get stringified
       function boolsToString (k, v) {
    @@ -135,13 +138,13 @@ async function createConfigGypi ({ gyp, buildDir, nodeDir, vsInfo }) {
     
       const json = JSON.stringify(config, boolsToString, 2)
       log.verbose('build/' + configFilename, 'writing out config file: %s', configPath)
    -  await fs.promises.writeFile(configPath, [prefix, json, ''].join('\n'))
    +  await fs.writeFile(configPath, [prefix, json, ''].join('\n'))
     
       return configPath
     }
     
    -module.exports = createConfigGypi
    -module.exports.test = {
    -  parseConfigGypi: parseConfigGypi,
    -  getCurrentConfigGypi: getCurrentConfigGypi
    +module.exports = {
    +  createConfigGypi,
    +  parseConfigGypi,
    +  getCurrentConfigGypi
     }
    diff --git a/deps/npm/node_modules/node-gyp/lib/download.js b/deps/npm/node_modules/node-gyp/lib/download.js
    new file mode 100644
    index 00000000000000..ed0aa37f441165
    --- /dev/null
    +++ b/deps/npm/node_modules/node-gyp/lib/download.js
    @@ -0,0 +1,39 @@
    +const fetch = require('make-fetch-happen')
    +const { promises: fs } = require('graceful-fs')
    +const log = require('./log')
    +
    +async function download (gyp, url) {
    +  log.http('GET', url)
    +
    +  const requestOpts = {
    +    headers: {
    +      'User-Agent': `node-gyp v${gyp.version} (node ${process.version})`,
    +      Connection: 'keep-alive'
    +    },
    +    proxy: gyp.opts.proxy,
    +    noProxy: gyp.opts.noproxy
    +  }
    +
    +  const cafile = gyp.opts.cafile
    +  if (cafile) {
    +    requestOpts.ca = await readCAFile(cafile)
    +  }
    +
    +  const res = await fetch(url, requestOpts)
    +  log.http(res.status, res.url)
    +
    +  return res
    +}
    +
    +async function readCAFile (filename) {
    +  // The CA file can contain multiple certificates so split on certificate
    +  // boundaries.  [\S\s]*? is used to match everything including newlines.
    +  const ca = await fs.readFile(filename, 'utf8')
    +  const re = /(-----BEGIN CERTIFICATE-----[\S\s]*?-----END CERTIFICATE-----)/g
    +  return ca.match(re)
    +}
    +
    +module.exports = {
    +  download,
    +  readCAFile
    +}
    diff --git a/deps/npm/node_modules/node-gyp/lib/find-node-directory.js b/deps/npm/node_modules/node-gyp/lib/find-node-directory.js
    index 0dd781a6cfae8c..8838b81d338997 100644
    --- a/deps/npm/node_modules/node-gyp/lib/find-node-directory.js
    +++ b/deps/npm/node_modules/node-gyp/lib/find-node-directory.js
    @@ -1,7 +1,7 @@
     'use strict'
     
     const path = require('path')
    -const log = require('npmlog')
    +const log = require('./log')
     
     function findNodeDirectory (scriptLocation, processObj) {
       // set dirname and process if not passed in
    @@ -14,10 +14,10 @@ function findNodeDirectory (scriptLocation, processObj) {
       }
     
       // Have a look to see what is above us, to try and work out where we are
    -  var npmParentDirectory = path.join(scriptLocation, '../../../..')
    +  const npmParentDirectory = path.join(scriptLocation, '../../../..')
       log.verbose('node-gyp root', 'npm_parent_directory is ' +
                   path.basename(npmParentDirectory))
    -  var nodeRootDir = ''
    +  let nodeRootDir = ''
     
       log.verbose('node-gyp root', 'Finding node root directory')
       if (path.basename(npmParentDirectory) === 'deps') {
    @@ -41,8 +41,8 @@ function findNodeDirectory (scriptLocation, processObj) {
       } else {
         // We don't know where we are, try working it out from the location
         // of the node binary
    -    var nodeDir = path.dirname(processObj.execPath)
    -    var directoryUp = path.basename(nodeDir)
    +    const nodeDir = path.dirname(processObj.execPath)
    +    const directoryUp = path.basename(nodeDir)
         if (directoryUp === 'bin') {
           nodeRootDir = path.join(nodeDir, '..')
         } else if (directoryUp === 'Release' || directoryUp === 'Debug') {
    diff --git a/deps/npm/node_modules/node-gyp/lib/find-python.js b/deps/npm/node_modules/node-gyp/lib/find-python.js
    index a445e825b9d7e3..615da57bb85723 100644
    --- a/deps/npm/node_modules/node-gyp/lib/find-python.js
    +++ b/deps/npm/node_modules/node-gyp/lib/find-python.js
    @@ -1,11 +1,15 @@
     'use strict'
     
    -const log = require('npmlog')
    +const log = require('./log')
     const semver = require('semver')
    -const cp = require('child_process')
    -const extend = require('util')._extend // eslint-disable-line
    +const { execFile } = require('./util')
     const win = process.platform === 'win32'
    -const logWithPrefix = require('./util').logWithPrefix
    +
    +function getOsUserInfo () {
    +  try {
    +    return require('os').userInfo().username
    +  } catch {}
    +}
     
     const systemDrive = process.env.SystemDrive || 'C:'
     const username = process.env.USERNAME || process.env.USER || getOsUserInfo()
    @@ -15,7 +19,7 @@ const programFiles = process.env.ProgramW6432 || process.env.ProgramFiles || `${
     const programFilesX86 = process.env['ProgramFiles(x86)'] || `${programFiles} (x86)`
     
     const winDefaultLocationsArray = []
    -for (const majorMinor of ['39', '38', '37', '36']) {
    +for (const majorMinor of ['311', '310', '39', '38']) {
       if (foundLocalAppData) {
         winDefaultLocationsArray.push(
           `${localAppData}\\Programs\\Python\\Python${majorMinor}\\python.exe`,
    @@ -33,45 +37,39 @@ for (const majorMinor of ['39', '38', '37', '36']) {
       }
     }
     
    -function getOsUserInfo () {
    -  try {
    -    return require('os').userInfo().username
    -  } catch (e) {}
    -}
    -
    -function PythonFinder (configPython, callback) {
    -  this.callback = callback
    -  this.configPython = configPython
    -  this.errorLog = []
    -}
    +class PythonFinder {
    +  static findPython = (...args) => new PythonFinder(...args).findPython()
     
    -PythonFinder.prototype = {
    -  log: logWithPrefix(log, 'find Python'),
    -  argsExecutable: ['-c', 'import sys; print(sys.executable);'],
    -  argsVersion: ['-c', 'import sys; print("%s.%s.%s" % sys.version_info[:3]);'],
    -  semverRange: '>=3.6.0',
    +  log = log.withPrefix('find Python')
    +  argsExecutable = ['-c', 'import sys; print(sys.executable);']
    +  argsVersion = ['-c', 'import sys; print("%s.%s.%s" % sys.version_info[:3]);']
    +  semverRange = '>=3.6.0'
     
       // These can be overridden for testing:
    -  execFile: cp.execFile,
    -  env: process.env,
    -  win: win,
    -  pyLauncher: 'py.exe',
    -  winDefaultLocations: winDefaultLocationsArray,
    +  execFile = execFile
    +  env = process.env
    +  win = win
    +  pyLauncher = 'py.exe'
    +  winDefaultLocations = winDefaultLocationsArray
    +
    +  constructor (configPython) {
    +    this.configPython = configPython
    +    this.errorLog = []
    +  }
     
       // Logs a message at verbose level, but also saves it to be displayed later
       // at error level if an error occurs. This should help diagnose the problem.
    -  addLog: function addLog (message) {
    +  addLog (message) {
         this.log.verbose(message)
         this.errorLog.push(message)
    -  },
    +  }
     
       // Find Python by trying a sequence of possibilities.
       // Ignore errors, keep trying until Python is found.
    -  findPython: function findPython () {
    -    const SKIP = 0; const FAIL = 1
    -    var toCheck = getChecks.apply(this)
    -
    -    function getChecks () {
    +  async findPython () {
    +    const SKIP = 0
    +    const FAIL = 1
    +    const toCheck = (() => {
           if (this.env.NODE_GYP_FORCE_PYTHON) {
             return [{
               before: () => {
    @@ -80,12 +78,11 @@ PythonFinder.prototype = {
                 this.addLog('- process.env.NODE_GYP_FORCE_PYTHON is ' +
                   `"${this.env.NODE_GYP_FORCE_PYTHON}"`)
               },
    -          check: this.checkCommand,
    -          arg: this.env.NODE_GYP_FORCE_PYTHON
    +          check: () => this.checkCommand(this.env.NODE_GYP_FORCE_PYTHON)
             }]
           }
     
    -      var checks = [
    +      const checks = [
             {
               before: () => {
                 if (!this.configPython) {
    @@ -98,8 +95,7 @@ PythonFinder.prototype = {
                 this.addLog('- "--python=" or "npm config get python" is ' +
                   `"${this.configPython}"`)
               },
    -          check: this.checkCommand,
    -          arg: this.configPython
    +          check: () => this.checkCommand(this.configPython)
             },
             {
               before: () => {
    @@ -112,78 +108,69 @@ PythonFinder.prototype = {
                   'variable PYTHON')
                 this.addLog(`- process.env.PYTHON is "${this.env.PYTHON}"`)
               },
    -          check: this.checkCommand,
    -          arg: this.env.PYTHON
    -        },
    +          check: () => this.checkCommand(this.env.PYTHON)
    +        }
    +      ]
    +
    +      if (this.win) {
    +        checks.push({
    +          before: () => {
    +            this.addLog(
    +              'checking if the py launcher can be used to find Python 3')
    +          },
    +          check: () => this.checkPyLauncher()
    +        })
    +      }
    +
    +      checks.push(...[
             {
               before: () => { this.addLog('checking if "python3" can be used') },
    -          check: this.checkCommand,
    -          arg: 'python3'
    +          check: () => this.checkCommand('python3')
             },
             {
               before: () => { this.addLog('checking if "python" can be used') },
    -          check: this.checkCommand,
    -          arg: 'python'
    +          check: () => this.checkCommand('python')
             }
    -      ]
    +      ])
     
           if (this.win) {
    -        for (var i = 0; i < this.winDefaultLocations.length; ++i) {
    +        for (let i = 0; i < this.winDefaultLocations.length; ++i) {
               const location = this.winDefaultLocations[i]
               checks.push({
    -            before: () => {
    -              this.addLog('checking if Python is ' +
    -                `${location}`)
    -            },
    -            check: this.checkExecPath,
    -            arg: location
    +            before: () => this.addLog(`checking if Python is ${location}`),
    +            check: () => this.checkExecPath(location)
               })
             }
    -        checks.push({
    -          before: () => {
    -            this.addLog(
    -              'checking if the py launcher can be used to find Python 3')
    -          },
    -          check: this.checkPyLauncher
    -        })
           }
     
           return checks
    -    }
    -
    -    function runChecks (err) {
    -      this.log.silly('runChecks: err = %j', (err && err.stack) || err)
    +    })()
     
    -      const check = toCheck.shift()
    -      if (!check) {
    -        return this.fail()
    -      }
    -
    -      const before = check.before.apply(this)
    +    for (const check of toCheck) {
    +      const before = check.before()
           if (before === SKIP) {
    -        return runChecks.apply(this)
    +        continue
           }
           if (before === FAIL) {
             return this.fail()
           }
    -
    -      const args = [runChecks.bind(this)]
    -      if (check.arg) {
    -        args.unshift(check.arg)
    +      try {
    +        return await check.check()
    +      } catch (err) {
    +        this.log.silly('runChecks: err = %j', (err && err.stack) || err)
           }
    -      check.check.apply(this, args)
         }
     
    -    runChecks.apply(this)
    -  },
    +    return this.fail()
    +  }
     
       // Check if command is a valid Python to use.
       // Will exit the Python finder on success.
       // If on Windows, run in a CMD shell to support BAT/CMD launchers.
    -  checkCommand: function checkCommand (command, errorCallback) {
    -    var exec = command
    -    var args = this.argsExecutable
    -    var shell = false
    +  async checkCommand (command) {
    +    let exec = command
    +    let args = this.argsExecutable
    +    let shell = false
         if (this.win) {
           // Arguments have to be manually quoted
           exec = `"${exec}"`
    @@ -192,19 +179,19 @@ PythonFinder.prototype = {
         }
     
         this.log.verbose(`- executing "${command}" to get executable path`)
    -    this.run(exec, args, shell, function (err, execPath) {
    -      // Possible outcomes:
    -      // - Error: not in PATH, not executable or execution fails
    -      // - Gibberish: the next command to check version will fail
    -      // - Absolute path to executable
    -      if (err) {
    -        this.addLog(`- "${command}" is not in PATH or produced an error`)
    -        return errorCallback(err)
    -      }
    +    // Possible outcomes:
    +    // - Error: not in PATH, not executable or execution fails
    +    // - Gibberish: the next command to check version will fail
    +    // - Absolute path to executable
    +    try {
    +      const execPath = await this.run(exec, args, shell)
           this.addLog(`- executable path is "${execPath}"`)
    -      this.checkExecPath(execPath, errorCallback)
    -    }.bind(this))
    -  },
    +      return this.checkExecPath(execPath)
    +    } catch (err) {
    +      this.addLog(`- "${command}" is not in PATH or produced an error`)
    +      throw err
    +    }
    +  }
     
       // Check if the py launcher can find a valid Python to use.
       // Will exit the Python finder on success.
    @@ -216,97 +203,86 @@ PythonFinder.prototype = {
       // the first command line argument. Since "py.exe -3" would be an invalid
       // executable for "execFile", we have to use the launcher to figure out
       // where the actual "python.exe" executable is located.
    -  checkPyLauncher: function checkPyLauncher (errorCallback) {
    -    this.log.verbose(
    -      `- executing "${this.pyLauncher}" to get Python 3 executable path`)
    -    this.run(this.pyLauncher, ['-3', ...this.argsExecutable], false,
    -      function (err, execPath) {
    -      // Possible outcomes: same as checkCommand
    -        if (err) {
    -          this.addLog(
    -            `- "${this.pyLauncher}" is not in PATH or produced an error`)
    -          return errorCallback(err)
    -        }
    -        this.addLog(`- executable path is "${execPath}"`)
    -        this.checkExecPath(execPath, errorCallback)
    -      }.bind(this))
    -  },
    +  async checkPyLauncher () {
    +    this.log.verbose(`- executing "${this.pyLauncher}" to get Python 3 executable path`)
    +    // Possible outcomes: same as checkCommand
    +    try {
    +      const execPath = await this.run(this.pyLauncher, ['-3', ...this.argsExecutable], false)
    +      this.addLog(`- executable path is "${execPath}"`)
    +      return this.checkExecPath(execPath)
    +    } catch (err) {
    +      this.addLog(`- "${this.pyLauncher}" is not in PATH or produced an error`)
    +      throw err
    +    }
    +  }
     
       // Check if a Python executable is the correct version to use.
       // Will exit the Python finder on success.
    -  checkExecPath: function checkExecPath (execPath, errorCallback) {
    +  async checkExecPath (execPath) {
         this.log.verbose(`- executing "${execPath}" to get version`)
    -    this.run(execPath, this.argsVersion, false, function (err, version) {
    -      // Possible outcomes:
    -      // - Error: executable can not be run (likely meaning the command wasn't
    -      //   a Python executable and the previous command produced gibberish)
    -      // - Gibberish: somehow the last command produced an executable path,
    -      //   this will fail when verifying the version
    -      // - Version of the Python executable
    -      if (err) {
    -        this.addLog(`- "${execPath}" could not be run`)
    -        return errorCallback(err)
    -      }
    +    // Possible outcomes:
    +    // - Error: executable can not be run (likely meaning the command wasn't
    +    //   a Python executable and the previous command produced gibberish)
    +    // - Gibberish: somehow the last command produced an executable path,
    +    //   this will fail when verifying the version
    +    // - Version of the Python executable
    +    try {
    +      const version = await this.run(execPath, this.argsVersion, false)
           this.addLog(`- version is "${version}"`)
     
           const range = new semver.Range(this.semverRange)
    -      var valid = false
    +      let valid = false
           try {
             valid = range.test(version)
           } catch (err) {
             this.log.silly('range.test() threw:\n%s', err.stack)
             this.addLog(`- "${execPath}" does not have a valid version`)
             this.addLog('- is it a Python executable?')
    -        return errorCallback(err)
    +        throw err
           }
    -
           if (!valid) {
             this.addLog(`- version is ${version} - should be ${this.semverRange}`)
             this.addLog('- THIS VERSION OF PYTHON IS NOT SUPPORTED')
    -        return errorCallback(new Error(
    -          `Found unsupported Python version ${version}`))
    +        throw new Error(`Found unsupported Python version ${version}`)
           }
    -      this.succeed(execPath, version)
    -    }.bind(this))
    -  },
    +      return this.succeed(execPath, version)
    +    } catch (err) {
    +      this.addLog(`- "${execPath}" could not be run`)
    +      throw err
    +    }
    +  }
     
       // Run an executable or shell command, trimming the output.
    -  run: function run (exec, args, shell, callback) {
    -    var env = extend({}, this.env)
    +  async run (exec, args, shell) {
    +    const env = Object.assign({}, this.env)
         env.TERM = 'dumb'
    -    const opts = { env: env, shell: shell }
    +    const opts = { env, shell }
     
         this.log.silly('execFile: exec = %j', exec)
         this.log.silly('execFile: args = %j', args)
         this.log.silly('execFile: opts = %j', opts)
         try {
    -      this.execFile(exec, args, opts, execFileCallback.bind(this))
    -    } catch (err) {
    -      this.log.silly('execFile: threw:\n%s', err.stack)
    -      return callback(err)
    -    }
    -
    -    function execFileCallback (err, stdout, stderr) {
    +      const [err, stdout, stderr] = await this.execFile(exec, args, opts)
           this.log.silly('execFile result: err = %j', (err && err.stack) || err)
           this.log.silly('execFile result: stdout = %j', stdout)
           this.log.silly('execFile result: stderr = %j', stderr)
    -      if (err) {
    -        return callback(err)
    -      }
    -      const execPath = stdout.trim()
    -      callback(null, execPath)
    +      return stdout.trim()
    +    } catch (err) {
    +      this.log.silly('execFile: threw:\n%s', err.stack)
    +      throw err
         }
    -  },
    +  }
     
    -  succeed: function succeed (execPath, version) {
    +  succeed (execPath, version) {
         this.log.info(`using Python version ${version} found at "${execPath}"`)
    -    process.nextTick(this.callback.bind(null, null, execPath))
    -  },
    +    return execPath
    +  }
     
    -  fail: function fail () {
    +  fail () {
         const errorLog = this.errorLog.join('\n')
     
    -    const pathExample = this.win ? 'C:\\Path\\To\\python.exe'
    +    const pathExample = this.win
    +      ? 'C:\\Path\\To\\python.exe'
           : '/path/to/pythonexecutable'
         // For Windows 80 col console, use up to the column before the one marked
         // with X (total 79 chars including logger prefix, 58 chars usable here):
    @@ -327,18 +303,8 @@ PythonFinder.prototype = {
         ].join('\n')
     
         this.log.error(`\n${errorLog}\n\n${info}\n`)
    -    process.nextTick(this.callback.bind(null, new Error(
    -      'Could not find any Python installation to use')))
    +    throw new Error('Could not find any Python installation to use')
       }
     }
     
    -function findPython (configPython, callback) {
    -  var finder = new PythonFinder(configPython, callback)
    -  finder.findPython()
    -}
    -
    -module.exports = findPython
    -module.exports.test = {
    -  PythonFinder: PythonFinder,
    -  findPython: findPython
    -}
    +module.exports = PythonFinder
    diff --git a/deps/npm/node_modules/node-gyp/lib/find-visualstudio.js b/deps/npm/node_modules/node-gyp/lib/find-visualstudio.js
    index 16f6e79559307c..b57770259abde3 100644
    --- a/deps/npm/node_modules/node-gyp/lib/find-visualstudio.js
    +++ b/deps/npm/node_modules/node-gyp/lib/find-visualstudio.js
    @@ -1,39 +1,32 @@
     'use strict'
     
    -const log = require('npmlog')
    -const execFile = require('child_process').execFile
    -const fs = require('fs')
    -const path = require('path').win32
    -const logWithPrefix = require('./util').logWithPrefix
    -const regSearchKeys = require('./util').regSearchKeys
    -
    -function findVisualStudio (nodeSemver, configMsvsVersion, callback) {
    -  const finder = new VisualStudioFinder(nodeSemver, configMsvsVersion,
    -    callback)
    -  finder.findVisualStudio()
    -}
    +const log = require('./log')
    +const { existsSync } = require('fs')
    +const { win32: path } = require('path')
    +const { regSearchKeys, execFile } = require('./util')
     
    -function VisualStudioFinder (nodeSemver, configMsvsVersion, callback) {
    -  this.nodeSemver = nodeSemver
    -  this.configMsvsVersion = configMsvsVersion
    -  this.callback = callback
    -  this.errorLog = []
    -  this.validVersions = []
    -}
    +class VisualStudioFinder {
    +  static findVisualStudio = (...args) => new VisualStudioFinder(...args).findVisualStudio()
    +
    +  log = log.withPrefix('find VS')
     
    -VisualStudioFinder.prototype = {
    -  log: logWithPrefix(log, 'find VS'),
    +  regSearchKeys = regSearchKeys
     
    -  regSearchKeys: regSearchKeys,
    +  constructor (nodeSemver, configMsvsVersion) {
    +    this.nodeSemver = nodeSemver
    +    this.configMsvsVersion = configMsvsVersion
    +    this.errorLog = []
    +    this.validVersions = []
    +  }
     
       // Logs a message at verbose level, but also saves it to be displayed later
       // at error level if an error occurs. This should help diagnose the problem.
    -  addLog: function addLog (message) {
    +  addLog (message) {
         this.log.verbose(message)
         this.errorLog.push(message)
    -  },
    +  }
     
    -  findVisualStudio: function findVisualStudio () {
    +  async findVisualStudio () {
         this.configVersionYear = null
         this.configPath = null
         if (this.configMsvsVersion) {
    @@ -60,32 +53,30 @@ VisualStudioFinder.prototype = {
           this.addLog('VCINSTALLDIR not set, not running in VS Command Prompt')
         }
     
    -    this.findVisualStudio2017OrNewer((info) => {
    +    const checks = [
    +      () => this.findVisualStudio2017OrNewer(),
    +      () => this.findVisualStudio2015(),
    +      () => this.findVisualStudio2013()
    +    ]
    +
    +    for (const check of checks) {
    +      const info = await check()
           if (info) {
             return this.succeed(info)
           }
    -      this.findVisualStudio2015((info) => {
    -        if (info) {
    -          return this.succeed(info)
    -        }
    -        this.findVisualStudio2013((info) => {
    -          if (info) {
    -            return this.succeed(info)
    -          }
    -          this.fail()
    -        })
    -      })
    -    })
    -  },
    +    }
    +
    +    return this.fail()
    +  }
     
    -  succeed: function succeed (info) {
    +  succeed (info) {
         this.log.info(`using VS${info.versionYear} (${info.version}) found at:` +
                       `\n"${info.path}"` +
                       '\nrun with --verbose for detailed information')
    -    process.nextTick(this.callback.bind(null, null, info))
    -  },
    +    return info
    +  }
     
    -  fail: function fail () {
    +  fail () {
         if (this.configMsvsVersion && this.envVcInstallDir) {
           this.errorLog.push(
             'msvs_version does not match this VS Command Prompt or the',
    @@ -119,17 +110,16 @@ VisualStudioFinder.prototype = {
         ].join('\n')
     
         this.log.error(`\n${errorLog}\n\n${infoLog}\n`)
    -    process.nextTick(this.callback.bind(null, new Error(
    -      'Could not find any Visual Studio installation to use')))
    -  },
    +    throw new Error('Could not find any Visual Studio installation to use')
    +  }
     
       // Invoke the PowerShell script to get information about Visual Studio 2017
       // or newer installations
    -  findVisualStudio2017OrNewer: function findVisualStudio2017OrNewer (cb) {
    -    var ps = path.join(process.env.SystemRoot, 'System32',
    +  async findVisualStudio2017OrNewer () {
    +    const ps = path.join(process.env.SystemRoot, 'System32',
           'WindowsPowerShell', 'v1.0', 'powershell.exe')
    -    var csFile = path.join(__dirname, 'Find-VisualStudio.cs')
    -    var psArgs = [
    +    const csFile = path.join(__dirname, 'Find-VisualStudio.cs')
    +    const psArgs = [
           '-ExecutionPolicy',
           'Unrestricted',
           '-NoProfile',
    @@ -138,22 +128,19 @@ VisualStudioFinder.prototype = {
         ]
     
         this.log.silly('Running', ps, psArgs)
    -    var child = execFile(ps, psArgs, { encoding: 'utf8' },
    -      (err, stdout, stderr) => {
    -        this.parseData(err, stdout, stderr, cb)
    -      })
    -    child.stdin.end()
    -  },
    +    const [err, stdout, stderr] = await execFile(ps, psArgs, { encoding: 'utf8' })
    +    return this.parseData(err, stdout, stderr)
    +  }
     
       // Parse the output of the PowerShell script and look for an installation
       // of Visual Studio 2017 or newer to use
    -  parseData: function parseData (err, stdout, stderr, cb) {
    +  parseData (err, stdout, stderr) {
         this.log.silly('PS stderr = %j', stderr)
     
         const failPowershell = () => {
           this.addLog(
             'could not use PowerShell to find Visual Studio 2017 or newer, try re-running with \'--loglevel silly\' for more details')
    -      cb(null)
    +      return null
         }
     
         if (err) {
    @@ -161,7 +148,7 @@ VisualStudioFinder.prototype = {
           return failPowershell()
         }
     
    -    var vsInfo
    +    let vsInfo
         try {
           vsInfo = JSON.parse(stdout)
         } catch (e) {
    @@ -178,7 +165,7 @@ VisualStudioFinder.prototype = {
         vsInfo = vsInfo.map((info) => {
           this.log.silly(`processing installation: "${info.path}"`)
           info.path = path.resolve(info.path)
    -      var ret = this.getVersionInfo(info)
    +      const ret = this.getVersionInfo(info)
           ret.path = info.path
           ret.msBuild = this.getMSBuild(info, ret.versionYear)
           ret.toolset = this.getToolset(info, ret.versionYear)
    @@ -199,7 +186,7 @@ VisualStudioFinder.prototype = {
         // Sort to place newer versions first
         vsInfo.sort((a, b) => b.versionYear - a.versionYear)
     
    -    for (var i = 0; i < vsInfo.length; ++i) {
    +    for (let i = 0; i < vsInfo.length; ++i) {
           const info = vsInfo[i]
           this.addLog(`checking VS${info.versionYear} (${info.version}) found ` +
                       `at:\n"${info.path}"`)
    @@ -229,23 +216,23 @@ VisualStudioFinder.prototype = {
             continue
           }
     
    -      return cb(info)
    +      return info
         }
     
         this.addLog(
           'could not find a version of Visual Studio 2017 or newer to use')
    -    cb(null)
    -  },
    +    return null
    +  }
     
       // Helper - process version information
    -  getVersionInfo: function getVersionInfo (info) {
    +  getVersionInfo (info) {
         const match = /^(\d+)\.(\d+)\..*/.exec(info.version)
         if (!match) {
           this.log.silly('- failed to parse version:', info.version)
           return {}
         }
         this.log.silly('- version match = %j', match)
    -    var ret = {
    +    const ret = {
           version: info.version,
           versionMajor: parseInt(match[1], 10),
           versionMinor: parseInt(match[2], 10)
    @@ -264,14 +251,14 @@ VisualStudioFinder.prototype = {
         }
         this.log.silly('- unsupported version:', ret.versionMajor)
         return {}
    -  },
    +  }
     
    -  msBuildPathExists: function msBuildPathExists (path) {
    -    return fs.existsSync(path)
    -  },
    +  msBuildPathExists (path) {
    +    return existsSync(path)
    +  }
     
       // Helper - process MSBuild information
    -  getMSBuild: function getMSBuild (info, versionYear) {
    +  getMSBuild (info, versionYear) {
         const pkg = 'Microsoft.VisualStudio.VC.MSBuild.Base'
         const msbuildPath = path.join(info.path, 'MSBuild', 'Current', 'Bin', 'MSBuild.exe')
         const msbuildPathArm64 = path.join(info.path, 'MSBuild', 'Current', 'Bin', 'arm64', 'MSBuild.exe')
    @@ -295,10 +282,10 @@ VisualStudioFinder.prototype = {
           return msbuildPath
         }
         return null
    -  },
    +  }
     
       // Helper - process toolset information
    -  getToolset: function getToolset (info, versionYear) {
    +  getToolset (info, versionYear) {
         const pkg = 'Microsoft.VisualStudio.Component.VC.Tools.x86.x64'
         const express = 'Microsoft.VisualStudio.WDExpress'
     
    @@ -319,15 +306,15 @@ VisualStudioFinder.prototype = {
         }
         this.log.silly('- invalid versionYear:', versionYear)
         return null
    -  },
    +  }
     
       // Helper - process Windows SDK information
    -  getSDK: function getSDK (info) {
    +  getSDK (info) {
         const win8SDK = 'Microsoft.VisualStudio.Component.Windows81SDK'
         const win10SDKPrefix = 'Microsoft.VisualStudio.Component.Windows10SDK.'
         const win11SDKPrefix = 'Microsoft.VisualStudio.Component.Windows11SDK.'
     
    -    var Win10or11SDKVer = 0
    +    let Win10or11SDKVer = 0
         info.packages.forEach((pkg) => {
           if (!pkg.startsWith(win10SDKPrefix) && !pkg.startsWith(win11SDKPrefix)) {
             return
    @@ -354,14 +341,14 @@ VisualStudioFinder.prototype = {
           return '8.1'
         }
         return null
    -  },
    +  }
     
       // Find an installation of Visual Studio 2015 to use
    -  findVisualStudio2015: function findVisualStudio2015 (cb) {
    +  async findVisualStudio2015 () {
         if (this.nodeSemver.major >= 19) {
           this.addLog(
             'not looking for VS2015 as it is only supported up to Node.js 18')
    -      return cb(null)
    +      return null
         }
         return this.findOldVS({
           version: '14.0',
    @@ -369,15 +356,15 @@ VisualStudioFinder.prototype = {
           versionMinor: 0,
           versionYear: 2015,
           toolset: 'v140'
    -    }, cb)
    -  },
    +    })
    +  }
     
       // Find an installation of Visual Studio 2013 to use
    -  findVisualStudio2013: function findVisualStudio2013 (cb) {
    +  async findVisualStudio2013 () {
         if (this.nodeSemver.major >= 9) {
           this.addLog(
             'not looking for VS2013 as it is only supported up to Node.js 8')
    -      return cb(null)
    +      return null
         }
         return this.findOldVS({
           version: '12.0',
    @@ -385,55 +372,52 @@ VisualStudioFinder.prototype = {
           versionMinor: 0,
           versionYear: 2013,
           toolset: 'v120'
    -    }, cb)
    -  },
    +    })
    +  }
     
       // Helper - common code for VS2013 and VS2015
    -  findOldVS: function findOldVS (info, cb) {
    +  async findOldVS (info) {
         const regVC7 = ['HKLM\\Software\\Microsoft\\VisualStudio\\SxS\\VC7',
           'HKLM\\Software\\Wow6432Node\\Microsoft\\VisualStudio\\SxS\\VC7']
         const regMSBuild = 'HKLM\\Software\\Microsoft\\MSBuild\\ToolsVersions'
     
         this.addLog(`looking for Visual Studio ${info.versionYear}`)
    -    this.regSearchKeys(regVC7, info.version, [], (err, res) => {
    -      if (err) {
    -        this.addLog('- not found')
    -        return cb(null)
    -      }
    -
    +    try {
    +      let res = await this.regSearchKeys(regVC7, info.version, [])
           const vsPath = path.resolve(res, '..')
           this.addLog(`- found in "${vsPath}"`)
    -
           const msBuildRegOpts = process.arch === 'ia32' ? [] : ['/reg:32']
    -      this.regSearchKeys([`${regMSBuild}\\${info.version}`],
    -        'MSBuildToolsPath', msBuildRegOpts, (err, res) => {
    -          if (err) {
    -            this.addLog(
    -              '- could not find MSBuild in registry for this version')
    -            return cb(null)
    -          }
    -
    -          const msBuild = path.join(res, 'MSBuild.exe')
    -          this.addLog(`- MSBuild in "${msBuild}"`)
    -
    -          if (!this.checkConfigVersion(info.versionYear, vsPath)) {
    -            return cb(null)
    -          }
    -
    -          info.path = vsPath
    -          info.msBuild = msBuild
    -          info.sdk = null
    -          cb(info)
    -        })
    -    })
    -  },
    +
    +      try {
    +        res = await this.regSearchKeys([`${regMSBuild}\\${info.version}`], 'MSBuildToolsPath', msBuildRegOpts)
    +      } catch (err) {
    +        this.addLog('- could not find MSBuild in registry for this version')
    +        return null
    +      }
    +
    +      const msBuild = path.join(res, 'MSBuild.exe')
    +      this.addLog(`- MSBuild in "${msBuild}"`)
    +
    +      if (!this.checkConfigVersion(info.versionYear, vsPath)) {
    +        return null
    +      }
    +
    +      info.path = vsPath
    +      info.msBuild = msBuild
    +      info.sdk = null
    +      return info
    +    } catch (err) {
    +      this.addLog('- not found')
    +      return null
    +    }
    +  }
     
       // After finding a usable version of Visual Studio:
       // - add it to validVersions to be displayed at the end if a specific
       //   version was requested and not found;
       // - check if this is the version that was requested.
       // - check if this matches the Visual Studio Command Prompt
    -  checkConfigVersion: function checkConfigVersion (versionYear, vsPath) {
    +  checkConfigVersion (versionYear, vsPath) {
         this.validVersions.push(versionYear)
         this.validVersions.push(vsPath)
     
    @@ -456,8 +440,4 @@ VisualStudioFinder.prototype = {
       }
     }
     
    -module.exports = findVisualStudio
    -module.exports.test = {
    -  VisualStudioFinder: VisualStudioFinder,
    -  findVisualStudio: findVisualStudio
    -}
    +module.exports = VisualStudioFinder
    diff --git a/deps/npm/node_modules/node-gyp/lib/install.js b/deps/npm/node_modules/node-gyp/lib/install.js
    index 1eb9f14c6742aa..7196a316296fb8 100644
    --- a/deps/npm/node_modules/node-gyp/lib/install.js
    +++ b/deps/npm/node_modules/node-gyp/lib/install.js
    @@ -1,26 +1,21 @@
     'use strict'
     
    -const fs = require('graceful-fs')
    +const { createWriteStream, promises: fs } = require('graceful-fs')
     const os = require('os')
     const { backOff } = require('exponential-backoff')
    -const rm = require('rimraf')
     const tar = require('tar')
     const path = require('path')
    -const util = require('util')
    -const stream = require('stream')
    +const { Transform, promises: { pipeline } } = require('stream')
     const crypto = require('crypto')
    -const log = require('npmlog')
    +const log = require('./log')
     const semver = require('semver')
    -const fetch = require('make-fetch-happen')
    +const { download } = require('./download')
     const processRelease = require('./process-release')
    -const win = process.platform === 'win32'
    -const streamPipeline = util.promisify(stream.pipeline)
     
    -/**
    - * @param {typeof import('graceful-fs')} fs
    - */
    +const win = process.platform === 'win32'
     
    -async function install (fs, gyp, argv) {
    +async function install (gyp, argv) {
    +  log.stdout()
       const release = processRelease(argv, gyp, process.version, process.release)
       // Detecting target_arch based on logic from create-cnfig-gyp.js. Used on Windows only.
       const arch = win ? (gyp.opts.target_arch || gyp.opts.arch || process.arch || 'ia32') : ''
    @@ -60,7 +55,7 @@ async function install (fs, gyp, argv) {
       if (gyp.opts.ensure) {
         log.verbose('install', '--ensure was passed, so won\'t reinstall if already installed')
         try {
    -      await fs.promises.stat(devDir)
    +      await fs.stat(devDir)
         } catch (err) {
           if (err.code === 'ENOENT') {
             log.verbose('install', 'version not already installed, continuing with install', release.version)
    @@ -78,7 +73,7 @@ async function install (fs, gyp, argv) {
         const installVersionFile = path.resolve(devDir, 'installVersion')
         let installVersion = 0
         try {
    -      const ver = await fs.promises.readFile(installVersionFile, 'ascii')
    +      const ver = await fs.readFile(installVersionFile, 'ascii')
           installVersion = parseInt(ver, 10) || 0
         } catch (err) {
           if (err.code !== 'ENOENT') {
    @@ -100,7 +95,7 @@ async function install (fs, gyp, argv) {
           log.verbose('on Windows; need to check node.lib')
           const nodeLibPath = path.resolve(devDir, arch, 'node.lib')
           try {
    -        await fs.promises.stat(nodeLibPath)
    +        await fs.stat(nodeLibPath)
           } catch (err) {
             if (err.code === 'ENOENT') {
               log.verbose('install', `version not already installed for ${arch}, continuing with install`, release.version)
    @@ -126,12 +121,12 @@ async function install (fs, gyp, argv) {
     
       async function copyDirectory (src, dest) {
         try {
    -      await fs.promises.stat(src)
    +      await fs.stat(src)
         } catch {
           throw new Error(`Missing source directory for copy: ${src}`)
         }
    -    await fs.promises.mkdir(dest, { recursive: true })
    -    const entries = await fs.promises.readdir(src, { withFileTypes: true })
    +    await fs.mkdir(dest, { recursive: true })
    +    const entries = await fs.readdir(src, { withFileTypes: true })
         for (const entry of entries) {
           if (entry.isDirectory()) {
             await copyDirectory(path.join(src, entry.name), path.join(dest, entry.name))
    @@ -140,12 +135,12 @@ async function install (fs, gyp, argv) {
             // Windows so use an exponential backoff to resolve collisions
             await backOff(async () => {
               try {
    -            await fs.promises.copyFile(path.join(src, entry.name), path.join(dest, entry.name))
    +            await fs.copyFile(path.join(src, entry.name), path.join(dest, entry.name))
               } catch (err) {
                 // if ensure, check if file already exists and that's good enough
                 if (gyp.opts.ensure && err.code === 'EBUSY') {
                   try {
    -                await fs.promises.stat(path.join(dest, entry.name))
    +                await fs.stat(path.join(dest, entry.name))
                     return
                   } catch {}
                 }
    @@ -163,7 +158,7 @@ async function install (fs, gyp, argv) {
     
         // first create the dir for the node dev files
         try {
    -      const created = await fs.promises.mkdir(devDir, { recursive: true })
    +      const created = await fs.mkdir(devDir, { recursive: true })
     
           if (created) {
             log.verbose('created devDir', created)
    @@ -208,7 +203,7 @@ async function install (fs, gyp, argv) {
         // on Windows there can be file errors from tar if parallel installs
         // are happening (not uncommon with multiple native modules) so
         // extract the tarball to a temp directory first and then copy over
    -    const tarExtractDir = win ? await fs.promises.mkdtemp(path.join(os.tmpdir(), 'node-gyp-tmp-')) : devDir
    +    const tarExtractDir = win ? await fs.mkdtemp(path.join(os.tmpdir(), 'node-gyp-tmp-')) : devDir
     
         try {
           if (shouldDownloadTarball) {
    @@ -228,7 +223,7 @@ async function install (fs, gyp, argv) {
                   throw new Error(`${res.status} response downloading ${release.tarballUrl}`)
                 }
     
    -            await streamPipeline(
    +            await pipeline(
                   res.body,
                   // content checksum
                   new ShaSum((_, checksum) => {
    @@ -267,7 +262,7 @@ async function install (fs, gyp, argv) {
           // need to download node.lib
             ...(win ? [downloadNodeLib()] : []),
             // write the "installVersion" file
    -        fs.promises.writeFile(installVersionPath, gyp.package.installVersion + '\n'),
    +        fs.writeFile(installVersionPath, gyp.package.installVersion + '\n'),
             // Only download SHASUMS.txt if we downloaded something in need of SHA verification
             ...(!tarPath || win ? [downloadShasums()] : [])
           ])
    @@ -289,7 +284,7 @@ async function install (fs, gyp, argv) {
           if (tarExtractDir !== devDir) {
             try {
               // try to cleanup temp dir
    -          await util.promisify(rm)(tarExtractDir)
    +          await fs.rm(tarExtractDir, { recursive: true })
             } catch {
               log.warn('failed to clean up temp tarball extract directory')
             }
    @@ -329,7 +324,7 @@ async function install (fs, gyp, argv) {
           log.verbose(name, 'dir', dir)
           log.verbose(name, 'url', libUrl)
     
    -      await fs.promises.mkdir(dir, { recursive: true })
    +      await fs.mkdir(dir, { recursive: true })
           log.verbose('streaming', name, 'to:', targetLibPath)
     
           const res = await download(gyp, libUrl)
    @@ -339,13 +334,13 @@ async function install (fs, gyp, argv) {
             throw new Error(`${res.status} status code downloading ${name}`)
           }
     
    -      return streamPipeline(
    +      return pipeline(
             res.body,
             new ShaSum((_, checksum) => {
               contentShasums[libPath] = checksum
               log.verbose('content checksum', libPath, checksum)
             }),
    -        fs.createWriteStream(targetLibPath)
    +        createWriteStream(targetLibPath)
           )
         } // downloadNodeLib()
       } // go()
    @@ -363,7 +358,7 @@ async function install (fs, gyp, argv) {
       async function rollback (err) {
         log.warn('install', 'got an error, rolling back install')
         // roll-back the install if anything went wrong
    -    await util.promisify(gyp.commands.remove)([release.versionDir])
    +    await gyp.commands.remove([release.versionDir])
         throw err
       }
     
    @@ -394,11 +389,11 @@ async function install (fs, gyp, argv) {
           log.verbose('tmpdir == cwd', 'automatically will remove dev files after to save disk space')
           gyp.todo.push({ name: 'remove', args: argv })
         }
    -    return util.promisify(gyp.commands.install)([noretry].concat(argv))
    +    return gyp.commands.install([noretry].concat(argv))
       }
     }
     
    -class ShaSum extends stream.Transform {
    +class ShaSum extends Transform {
       constructor (callback) {
         super()
         this._callback = callback
    @@ -416,43 +411,5 @@ class ShaSum extends stream.Transform {
       }
     }
     
    -async function download (gyp, url) {
    -  log.http('GET', url)
    -
    -  const requestOpts = {
    -    headers: {
    -      'User-Agent': `node-gyp v${gyp.version} (node ${process.version})`,
    -      Connection: 'keep-alive'
    -    },
    -    proxy: gyp.opts.proxy,
    -    noProxy: gyp.opts.noproxy
    -  }
    -
    -  const cafile = gyp.opts.cafile
    -  if (cafile) {
    -    requestOpts.ca = await readCAFile(cafile)
    -  }
    -
    -  const res = await fetch(url, requestOpts)
    -  log.http(res.status, res.url)
    -
    -  return res
    -}
    -
    -async function readCAFile (filename) {
    -  // The CA file can contain multiple certificates so split on certificate
    -  // boundaries.  [\S\s]*? is used to match everything including newlines.
    -  const ca = await fs.promises.readFile(filename, 'utf8')
    -  const re = /(-----BEGIN CERTIFICATE-----[\S\s]*?-----END CERTIFICATE-----)/g
    -  return ca.match(re)
    -}
    -
    -module.exports = function (gyp, argv, callback) {
    -  install(fs, gyp, argv).then(callback.bind(undefined, null), callback)
    -}
    -module.exports.test = {
    -  download,
    -  install,
    -  readCAFile
    -}
    +module.exports = install
     module.exports.usage = 'Install node development files for the specified node version.'
    diff --git a/deps/npm/node_modules/node-gyp/lib/list.js b/deps/npm/node_modules/node-gyp/lib/list.js
    index 405ebc0d889590..36889ad4f71e27 100644
    --- a/deps/npm/node_modules/node-gyp/lib/list.js
    +++ b/deps/npm/node_modules/node-gyp/lib/list.js
    @@ -1,26 +1,25 @@
     'use strict'
     
    -const fs = require('graceful-fs')
    -const log = require('npmlog')
    +const fs = require('graceful-fs').promises
    +const log = require('./log')
     
    -function list (gyp, args, callback) {
    -  var devDir = gyp.devDir
    +async function list (gyp, args) {
    +  const devDir = gyp.devDir
       log.verbose('list', 'using node-gyp dir:', devDir)
     
    -  fs.readdir(devDir, onreaddir)
    -
    -  function onreaddir (err, versions) {
    -    if (err && err.code !== 'ENOENT') {
    -      return callback(err)
    +  let versions = []
    +  try {
    +    const dir = await fs.readdir(devDir)
    +    if (Array.isArray(dir)) {
    +      versions = dir.filter((v) => v !== 'current')
         }
    -
    -    if (Array.isArray(versions)) {
    -      versions = versions.filter(function (v) { return v !== 'current' })
    -    } else {
    -      versions = []
    +  } catch (err) {
    +    if (err && err.code !== 'ENOENT') {
    +      throw err
         }
    -    callback(null, versions)
       }
    +
    +  return versions
     }
     
     module.exports = list
    diff --git a/deps/npm/node_modules/node-gyp/lib/log.js b/deps/npm/node_modules/node-gyp/lib/log.js
    new file mode 100644
    index 00000000000000..6841719abab5a9
    --- /dev/null
    +++ b/deps/npm/node_modules/node-gyp/lib/log.js
    @@ -0,0 +1,169 @@
    +'use strict'
    +
    +const procLog = require('proc-log')
    +const { format } = require('util')
    +
    +// helper to emit log messages with a predefined prefix
    +const logLevels = Object.keys(procLog).filter((k) => typeof procLog[k] === 'function')
    +const withPrefix = (prefix) => logLevels.reduce((acc, level) => {
    +  acc[level] = (...args) => procLog[level](prefix, ...args)
    +  return acc
    +}, {})
    +
    +// very basic ansi color generator
    +const COLORS = {
    +  wrap: (str, colors) => {
    +    const codes = colors.filter(c => typeof c === 'number')
    +    return `\x1b[${codes.join(';')}m${str}\x1b[0m`
    +  },
    +  inverse: 7,
    +  fg: {
    +    black: 30,
    +    red: 31,
    +    green: 32,
    +    yellow: 33,
    +    blue: 34,
    +    magenta: 35,
    +    cyan: 36,
    +    white: 37
    +  },
    +  bg: {
    +    black: 40,
    +    red: 41,
    +    green: 42,
    +    yellow: 43,
    +    blue: 44,
    +    magenta: 45,
    +    cyan: 46,
    +    white: 47
    +  }
    +}
    +
    +class Logger {
    +  #buffer = []
    +  #paused = null
    +  #level = null
    +  #stream = null
    +
    +  // ordered from loudest to quietest
    +  #levels = [{
    +    id: 'silly',
    +    display: 'sill',
    +    style: { inverse: true }
    +  }, {
    +    id: 'verbose',
    +    display: 'verb',
    +    style: { fg: 'cyan', bg: 'black' }
    +  }, {
    +    id: 'info',
    +    style: { fg: 'green' }
    +  }, {
    +    id: 'http',
    +    style: { fg: 'green', bg: 'black' }
    +  }, {
    +    id: 'notice',
    +    style: { fg: 'cyan', bg: 'black' }
    +  }, {
    +    id: 'warn',
    +    display: 'WARN',
    +    style: { fg: 'black', bg: 'yellow' }
    +  }, {
    +    id: 'error',
    +    display: 'ERR!',
    +    style: { fg: 'red', bg: 'black' }
    +  }]
    +
    +  constructor (stream) {
    +    process.on('log', (...args) => this.#onLog(...args))
    +    this.#levels = new Map(this.#levels.map((level, index) => [level.id, { ...level, index }]))
    +    this.level = 'info'
    +    this.stream = stream
    +    procLog.pause()
    +  }
    +
    +  get stream () {
    +    return this.#stream
    +  }
    +
    +  set stream (stream) {
    +    this.#stream = stream
    +  }
    +
    +  get level () {
    +    return this.#levels.get(this.#level) ?? null
    +  }
    +
    +  set level (level) {
    +    this.#level = this.#levels.get(level)?.id ?? null
    +  }
    +
    +  isVisible (level) {
    +    return this.level?.index <= this.#levels.get(level)?.index ?? -1
    +  }
    +
    +  #onLog (...args) {
    +    const [level] = args
    +
    +    if (level === 'pause') {
    +      this.#paused = true
    +      return
    +    }
    +
    +    if (level === 'resume') {
    +      this.#paused = false
    +      this.#buffer.forEach((b) => this.#log(...b))
    +      this.#buffer.length = 0
    +      return
    +    }
    +
    +    if (this.#paused) {
    +      this.#buffer.push(args)
    +      return
    +    }
    +
    +    this.#log(...args)
    +  }
    +
    +  #color (str, { fg, bg, inverse }) {
    +    if (!this.#stream?.isTTY) {
    +      return str
    +    }
    +
    +    return COLORS.wrap(str, [
    +      COLORS.fg[fg],
    +      COLORS.bg[bg],
    +      inverse && COLORS.inverse
    +    ])
    +  }
    +
    +  #log (levelId, msgPrefix, ...args) {
    +    if (!this.isVisible(levelId) || typeof this.#stream?.write !== 'function') {
    +      return
    +    }
    +
    +    const level = this.#levels.get(levelId)
    +
    +    const prefixParts = [
    +      this.#color('gyp', { fg: 'white', bg: 'black' }),
    +      this.#color(level.display ?? level.id, level.style)
    +    ]
    +    if (msgPrefix) {
    +      prefixParts.push(this.#color(msgPrefix, { fg: 'magenta' }))
    +    }
    +
    +    const prefix = prefixParts.join(' ').trim() + ' '
    +    const lines = format(...args).split(/\r?\n/).map(l => prefix + l.trim())
    +
    +    this.#stream.write(lines.join('\n') + '\n')
    +  }
    +}
    +
    +// used to suppress logs in tests
    +const NULL_LOGGER = !!process.env.NODE_GYP_NULL_LOGGER
    +
    +module.exports = {
    +  logger: new Logger(NULL_LOGGER ? null : process.stderr),
    +  stdout: NULL_LOGGER ? () => {} : (...args) => console.log(...args),
    +  withPrefix,
    +  ...procLog
    +}
    diff --git a/deps/npm/node_modules/node-gyp/lib/node-gyp.js b/deps/npm/node_modules/node-gyp/lib/node-gyp.js
    index e492ec1026d9d3..5e25bf996f8b22 100644
    --- a/deps/npm/node_modules/node-gyp/lib/node-gyp.js
    +++ b/deps/npm/node_modules/node-gyp/lib/node-gyp.js
    @@ -2,10 +2,10 @@
     
     const path = require('path')
     const nopt = require('nopt')
    -const log = require('npmlog')
    +const log = require('./log')
     const childProcess = require('child_process')
    -const EE = require('events').EventEmitter
    -const inherits = require('util').inherits
    +const { EventEmitter } = require('events')
    +
     const commands = [
       // Module build commands
       'build',
    @@ -17,199 +17,172 @@ const commands = [
       'list',
       'remove'
     ]
    -const aliases = {
    -  ls: 'list',
    -  rm: 'remove'
    -}
    -
    -// differentiate node-gyp's logs from npm's
    -log.heading = 'gyp'
    -
    -function gyp () {
    -  return new Gyp()
    -}
     
    -function Gyp () {
    -  var self = this
    +class Gyp extends EventEmitter {
    +  /**
    +   * Export the contents of the package.json.
    +   */
    +  package = require('../package.json')
    +
    +  /**
    +   * nopt configuration definitions
    +   */
    +  configDefs = {
    +    help: Boolean, // everywhere
    +    arch: String, // 'configure'
    +    cafile: String, // 'install'
    +    debug: Boolean, // 'build'
    +    directory: String, // bin
    +    make: String, // 'build'
    +    'msvs-version': String, // 'configure'
    +    ensure: Boolean, // 'install'
    +    solution: String, // 'build' (windows only)
    +    proxy: String, // 'install'
    +    noproxy: String, // 'install'
    +    devdir: String, // everywhere
    +    nodedir: String, // 'configure'
    +    loglevel: String, // everywhere
    +    python: String, // 'configure'
    +    'dist-url': String, // 'install'
    +    tarball: String, // 'install'
    +    jobs: String, // 'build'
    +    thin: String, // 'configure'
    +    'force-process-config': Boolean // 'configure'
    +  }
     
    -  this.devDir = ''
    -  this.commands = {}
    +  /**
    +   * nopt shorthands
    +   */
    +  shorthands = {
    +    release: '--no-debug',
    +    C: '--directory',
    +    debug: '--debug',
    +    j: '--jobs',
    +    silly: '--loglevel=silly',
    +    verbose: '--loglevel=verbose',
    +    silent: '--loglevel=silent'
    +  }
     
    -  commands.forEach(function (command) {
    -    self.commands[command] = function (argv, callback) {
    -      log.verbose('command', command, argv)
    -      return require('./' + command)(self, argv, callback)
    -    }
    -  })
    -}
    -inherits(Gyp, EE)
    -exports.Gyp = Gyp
    -var proto = Gyp.prototype
    -
    -/**
    - * Export the contents of the package.json.
    - */
    -
    -proto.package = require('../package.json')
    -
    -/**
    - * nopt configuration definitions
    - */
    -
    -proto.configDefs = {
    -  help: Boolean, // everywhere
    -  arch: String, // 'configure'
    -  cafile: String, // 'install'
    -  debug: Boolean, // 'build'
    -  directory: String, // bin
    -  make: String, // 'build'
    -  msvs_version: String, // 'configure'
    -  ensure: Boolean, // 'install'
    -  solution: String, // 'build' (windows only)
    -  proxy: String, // 'install'
    -  noproxy: String, // 'install'
    -  devdir: String, // everywhere
    -  nodedir: String, // 'configure'
    -  loglevel: String, // everywhere
    -  python: String, // 'configure'
    -  'dist-url': String, // 'install'
    -  tarball: String, // 'install'
    -  jobs: String, // 'build'
    -  thin: String, // 'configure'
    -  'force-process-config': Boolean // 'configure'
    -}
    +  /**
    +   * expose the command aliases for the bin file to use.
    +   */
    +  aliases = {
    +    ls: 'list',
    +    rm: 'remove'
    +  }
     
    -/**
    - * nopt shorthands
    - */
    -
    -proto.shorthands = {
    -  release: '--no-debug',
    -  C: '--directory',
    -  debug: '--debug',
    -  j: '--jobs',
    -  silly: '--loglevel=silly',
    -  verbose: '--loglevel=verbose',
    -  silent: '--loglevel=silent'
    -}
    +  constructor (...args) {
    +    super(...args)
     
    -/**
    - * expose the command aliases for the bin file to use.
    - */
    +    this.devDir = ''
     
    -proto.aliases = aliases
    +    this.commands = commands.reduce((acc, command) => {
    +      acc[command] = (argv) => require('./' + command)(this, argv)
    +      return acc
    +    }, {})
     
    -/**
    - * Parses the given argv array and sets the 'opts',
    - * 'argv' and 'command' properties.
    - */
    +    Object.defineProperty(this, 'version', {
    +      enumerable: true,
    +      get: function () { return this.package.version }
    +    })
    +  }
     
    -proto.parseArgv = function parseOpts (argv) {
    -  this.opts = nopt(this.configDefs, this.shorthands, argv)
    -  this.argv = this.opts.argv.remain.slice()
    +  /**
    +   * Parses the given argv array and sets the 'opts',
    +   * 'argv' and 'command' properties.
    +   */
    +  parseArgv (argv) {
    +    this.opts = nopt(this.configDefs, this.shorthands, argv)
    +    this.argv = this.opts.argv.remain.slice()
     
    -  var commands = this.todo = []
    +    const commands = this.todo = []
     
    -  // create a copy of the argv array with aliases mapped
    -  argv = this.argv.map(function (arg) {
    +    // create a copy of the argv array with aliases mapped
    +    argv = this.argv.map((arg) => {
         // is this an alias?
    -    if (arg in this.aliases) {
    -      arg = this.aliases[arg]
    -    }
    -    return arg
    -  }, this)
    -
    -  // process the mapped args into "command" objects ("name" and "args" props)
    -  argv.slice().forEach(function (arg) {
    -    if (arg in this.commands) {
    -      var args = argv.splice(0, argv.indexOf(arg))
    -      argv.shift()
    -      if (commands.length > 0) {
    -        commands[commands.length - 1].args = args
    +      if (arg in this.aliases) {
    +        arg = this.aliases[arg]
    +      }
    +      return arg
    +    })
    +
    +    // process the mapped args into "command" objects ("name" and "args" props)
    +    argv.slice().forEach((arg) => {
    +      if (arg in this.commands) {
    +        const args = argv.splice(0, argv.indexOf(arg))
    +        argv.shift()
    +        if (commands.length > 0) {
    +          commands[commands.length - 1].args = args
    +        }
    +        commands.push({ name: arg, args: [] })
           }
    -      commands.push({ name: arg, args: [] })
    +    })
    +    if (commands.length > 0) {
    +      commands[commands.length - 1].args = argv.splice(0)
         }
    -  }, this)
    -  if (commands.length > 0) {
    -    commands[commands.length - 1].args = argv.splice(0)
    -  }
     
    -  // support for inheriting config env variables from npm
    -  var npmConfigPrefix = 'npm_config_'
    -  Object.keys(process.env).forEach(function (name) {
    -    if (name.indexOf(npmConfigPrefix) !== 0) {
    -      return
    -    }
    -    var val = process.env[name]
    -    if (name === npmConfigPrefix + 'loglevel') {
    -      log.level = val
    -    } else {
    +    // support for inheriting config env variables from npm
    +    const npmConfigPrefix = 'npm_config_'
    +    Object.keys(process.env).forEach((name) => {
    +      if (name.indexOf(npmConfigPrefix) !== 0) {
    +        return
    +      }
    +      const val = process.env[name]
    +      if (name === npmConfigPrefix + 'loglevel') {
    +        log.logger.level = val
    +      } else {
           // add the user-defined options to the config
    -      name = name.substring(npmConfigPrefix.length)
    -      // gyp@741b7f1 enters an infinite loop when it encounters
    -      // zero-length options so ensure those don't get through.
    -      if (name) {
    +        name = name.substring(npmConfigPrefix.length)
    +        // gyp@741b7f1 enters an infinite loop when it encounters
    +        // zero-length options so ensure those don't get through.
    +        if (name) {
             // convert names like force_process_config to force-process-config
    -        if (name.includes('_')) {
    -          name = name.replace(/_/g, '-')
    +          if (name.includes('_')) {
    +            name = name.replace(/_/g, '-')
    +          }
    +          this.opts[name] = val
             }
    -        this.opts[name] = val
           }
    -    }
    -  }, this)
    +    })
     
    -  if (this.opts.loglevel) {
    -    log.level = this.opts.loglevel
    +    if (this.opts.loglevel) {
    +      log.logger.level = this.opts.loglevel
    +    }
    +    log.resume()
       }
    -  log.resume()
    -}
    -
    -/**
    - * Spawns a child process and emits a 'spawn' event.
    - */
     
    -proto.spawn = function spawn (command, args, opts) {
    -  if (!opts) {
    -    opts = {}
    -  }
    -  if (!opts.silent && !opts.stdio) {
    -    opts.stdio = [0, 1, 2]
    +  /**
    +   * Spawns a child process and emits a 'spawn' event.
    +   */
    +  spawn (command, args, opts) {
    +    if (!opts) {
    +      opts = {}
    +    }
    +    if (!opts.silent && !opts.stdio) {
    +      opts.stdio = [0, 1, 2]
    +    }
    +    const cp = childProcess.spawn(command, args, opts)
    +    log.info('spawn', command)
    +    log.info('spawn args', args)
    +    return cp
       }
    -  var cp = childProcess.spawn(command, args, opts)
    -  log.info('spawn', command)
    -  log.info('spawn args', args)
    -  return cp
    -}
     
    -/**
    - * Returns the usage instructions for node-gyp.
    - */
    -
    -proto.usage = function usage () {
    -  var str = [
    -    '',
    -    '  Usage: node-gyp  [options]',
    -    '',
    -    '  where  is one of:',
    -    commands.map(function (c) {
    -      return '    - ' + c + ' - ' + require('./' + c).usage
    -    }).join('\n'),
    -    '',
    -    'node-gyp@' + this.version + '  ' + path.resolve(__dirname, '..'),
    -    'node@' + process.versions.node
    -  ].join('\n')
    -  return str
    +  /**
    +   * Returns the usage instructions for node-gyp.
    +   */
    +  usage () {
    +    return [
    +      '',
    +      '  Usage: node-gyp  [options]',
    +      '',
    +      '  where  is one of:',
    +      commands.map((c) => '    - ' + c + ' - ' + require('./' + c).usage).join('\n'),
    +      '',
    +      'node-gyp@' + this.version + '  ' + path.resolve(__dirname, '..'),
    +      'node@' + process.versions.node
    +    ].join('\n')
    +  }
     }
     
    -/**
    - * Version number getter.
    - */
    -
    -Object.defineProperty(proto, 'version', {
    -  get: function () {
    -    return this.package.version
    -  },
    -  enumerable: true
    -})
    -
    -module.exports = exports = gyp
    +module.exports = () => new Gyp()
    +module.exports.Gyp = Gyp
    diff --git a/deps/npm/node_modules/node-gyp/lib/process-release.js b/deps/npm/node_modules/node-gyp/lib/process-release.js
    index 95b55e4426dee7..c9a319dfadd2bc 100644
    --- a/deps/npm/node_modules/node-gyp/lib/process-release.js
    +++ b/deps/npm/node_modules/node-gyp/lib/process-release.js
    @@ -1,11 +1,11 @@
    -/* eslint-disable node/no-deprecated-api */
    +/* eslint-disable n/no-deprecated-api */
     
     'use strict'
     
     const semver = require('semver')
     const url = require('url')
     const path = require('path')
    -const log = require('npmlog')
    +const log = require('./log')
     
     // versions where -headers.tar.gz started shipping
     const headersTarballRange = '>= 3.0.0 || ~0.12.10 || ~0.10.42'
    @@ -17,29 +17,28 @@ const bitsreV3 = /\/win-(x86|ia32|x64)\// // io.js v3.x.x shipped with "ia32" bu
     // file names. Inputs come from command-line switches (--target, --dist-url),
     // `process.version` and `process.release` where it exists.
     function processRelease (argv, gyp, defaultVersion, defaultRelease) {
    -  var version = (semver.valid(argv[0]) && argv[0]) || gyp.opts.target || defaultVersion
    -  var versionSemver = semver.parse(version)
    -  var overrideDistUrl = gyp.opts['dist-url'] || gyp.opts.disturl
    -  var isDefaultVersion
    -  var isNamedForLegacyIojs
    -  var name
    -  var distBaseUrl
    -  var baseUrl
    -  var libUrl32
    -  var libUrl64
    -  var libUrlArm64
    -  var tarballUrl
    -  var canGetHeaders
    +  let version = (semver.valid(argv[0]) && argv[0]) || gyp.opts.target || defaultVersion
    +  const versionSemver = semver.parse(version)
    +  let overrideDistUrl = gyp.opts['dist-url'] || gyp.opts.disturl
    +  let isNamedForLegacyIojs
    +  let name
    +  let distBaseUrl
    +  let baseUrl
    +  let libUrl32
    +  let libUrl64
    +  let libUrlArm64
    +  let tarballUrl
    +  let canGetHeaders
     
       if (!versionSemver) {
         // not a valid semver string, nothing we can do
    -    return { version: version }
    +    return { version }
       }
       // flatten version into String
       version = versionSemver.version
     
       // defaultVersion should come from process.version so ought to be valid semver
    -  isDefaultVersion = version === semver.parse(defaultVersion).version
    +  const isDefaultVersion = version === semver.parse(defaultVersion).version
     
       // can't use process.release if we're using --target=x.y.z
       if (!isDefaultVersion) {
    @@ -101,11 +100,11 @@ function processRelease (argv, gyp, defaultVersion, defaultRelease) {
       }
     
       return {
    -    version: version,
    +    version,
         semver: versionSemver,
    -    name: name,
    -    baseUrl: baseUrl,
    -    tarballUrl: tarballUrl,
    +    name,
    +    baseUrl,
    +    tarballUrl,
         shasumsUrl: url.resolve(baseUrl, 'SHASUMS256.txt'),
         versionDir: (name !== 'node' ? name + '-' : '') + version,
         ia32: {
    @@ -128,8 +127,8 @@ function normalizePath (p) {
     }
     
     function resolveLibUrl (name, defaultUrl, arch, versionMajor) {
    -  var base = url.resolve(defaultUrl, './')
    -  var hasLibUrl = bitsre.test(defaultUrl) || (versionMajor === 3 && bitsreV3.test(defaultUrl))
    +  const base = url.resolve(defaultUrl, './')
    +  const hasLibUrl = bitsre.test(defaultUrl) || (versionMajor === 3 && bitsreV3.test(defaultUrl))
     
       if (!hasLibUrl) {
         // let's assume it's a baseUrl then
    diff --git a/deps/npm/node_modules/node-gyp/lib/rebuild.js b/deps/npm/node_modules/node-gyp/lib/rebuild.js
    index a1c5b27cbe56a5..609817665e2dba 100644
    --- a/deps/npm/node_modules/node-gyp/lib/rebuild.js
    +++ b/deps/npm/node_modules/node-gyp/lib/rebuild.js
    @@ -1,12 +1,11 @@
     'use strict'
     
    -function rebuild (gyp, argv, callback) {
    +async function rebuild (gyp, argv) {
       gyp.todo.push(
         { name: 'clean', args: [] }
         , { name: 'configure', args: argv }
         , { name: 'build', args: [] }
       )
    -  process.nextTick(callback)
     }
     
     module.exports = rebuild
    diff --git a/deps/npm/node_modules/node-gyp/lib/remove.js b/deps/npm/node_modules/node-gyp/lib/remove.js
    index 8c945e5659001c..7efdb01a662e76 100644
    --- a/deps/npm/node_modules/node-gyp/lib/remove.js
    +++ b/deps/npm/node_modules/node-gyp/lib/remove.js
    @@ -1,46 +1,43 @@
     'use strict'
     
    -const fs = require('fs')
    -const rm = require('rimraf')
    +const fs = require('graceful-fs').promises
     const path = require('path')
    -const log = require('npmlog')
    +const log = require('./log')
     const semver = require('semver')
     
    -function remove (gyp, argv, callback) {
    -  var devDir = gyp.devDir
    +async function remove (gyp, argv) {
    +  const devDir = gyp.devDir
       log.verbose('remove', 'using node-gyp dir:', devDir)
     
       // get the user-specified version to remove
    -  var version = argv[0] || gyp.opts.target
    +  let version = argv[0] || gyp.opts.target
       log.verbose('remove', 'removing target version:', version)
     
       if (!version) {
    -    return callback(new Error('You must specify a version number to remove. Ex: "' + process.version + '"'))
    +    throw new Error('You must specify a version number to remove. Ex: "' + process.version + '"')
       }
     
    -  var versionSemver = semver.parse(version)
    +  const versionSemver = semver.parse(version)
       if (versionSemver) {
         // flatten the version Array into a String
         version = versionSemver.version
       }
     
    -  var versionPath = path.resolve(gyp.devDir, version)
    +  const versionPath = path.resolve(gyp.devDir, version)
       log.verbose('remove', 'removing development files for version:', version)
     
       // first check if its even installed
    -  fs.stat(versionPath, function (err) {
    -    if (err) {
    -      if (err.code === 'ENOENT') {
    -        callback(null, 'version was already uninstalled: ' + version)
    -      } else {
    -        callback(err)
    -      }
    -      return
    +  try {
    +    await fs.stat(versionPath)
    +  } catch (err) {
    +    if (err.code === 'ENOENT') {
    +      return 'version was already uninstalled: ' + version
         }
    -    // Go ahead and delete the dir
    -    rm(versionPath, callback)
    -  })
    +    throw err
    +  }
    +
    +  await fs.rm(versionPath, { recursive: true, force: true })
     }
     
    -module.exports = exports = remove
    +module.exports = remove
     module.exports.usage = 'Removes the node development files for the specified version'
    diff --git a/deps/npm/node_modules/node-gyp/lib/util.js b/deps/npm/node_modules/node-gyp/lib/util.js
    index 3e23c628e6ad71..3f6aeeb7dcb436 100644
    --- a/deps/npm/node_modules/node-gyp/lib/util.js
    +++ b/deps/npm/node_modules/node-gyp/lib/util.js
    @@ -1,64 +1,81 @@
     'use strict'
     
    -const log = require('npmlog')
    -const execFile = require('child_process').execFile
    +const cp = require('child_process')
     const path = require('path')
    +const { openSync, closeSync } = require('graceful-fs')
    +const log = require('./log')
     
    -function logWithPrefix (log, prefix) {
    -  function setPrefix (logFunction) {
    -    return (...args) => logFunction.apply(null, [ prefix, ...args ]) // eslint-disable-line
    -  }
    -  return {
    -    silly: setPrefix(log.silly),
    -    verbose: setPrefix(log.verbose),
    -    info: setPrefix(log.info),
    -    warn: setPrefix(log.warn),
    -    error: setPrefix(log.error)
    -  }
    -}
    +const execFile = async (...args) => new Promise((resolve) => {
    +  const child = cp.execFile(...args, (...a) => resolve(a))
    +  child.stdin.end()
    +})
     
    -function regGetValue (key, value, addOpts, cb) {
    +async function regGetValue (key, value, addOpts) {
       const outReValue = value.replace(/\W/g, '.')
       const outRe = new RegExp(`^\\s+${outReValue}\\s+REG_\\w+\\s+(\\S.*)$`, 'im')
       const reg = path.join(process.env.SystemRoot, 'System32', 'reg.exe')
       const regArgs = ['query', key, '/v', value].concat(addOpts)
     
       log.silly('reg', 'running', reg, regArgs)
    -  const child = execFile(reg, regArgs, { encoding: 'utf8' },
    -    function (err, stdout, stderr) {
    -      log.silly('reg', 'reg.exe stdout = %j', stdout)
    -      if (err || stderr.trim() !== '') {
    -        log.silly('reg', 'reg.exe err = %j', err && (err.stack || err))
    -        log.silly('reg', 'reg.exe stderr = %j', stderr)
    -        return cb(err, stderr)
    -      }
    +  const [err, stdout, stderr] = await execFile(reg, regArgs, { encoding: 'utf8' })
     
    -      const result = outRe.exec(stdout)
    -      if (!result) {
    -        log.silly('reg', 'error parsing stdout')
    -        return cb(new Error('Could not parse output of reg.exe'))
    -      }
    -      log.silly('reg', 'found: %j', result[1])
    -      cb(null, result[1])
    -    })
    -  child.stdin.end()
    +  log.silly('reg', 'reg.exe stdout = %j', stdout)
    +  if (err || stderr.trim() !== '') {
    +    log.silly('reg', 'reg.exe err = %j', err && (err.stack || err))
    +    log.silly('reg', 'reg.exe stderr = %j', stderr)
    +    if (err) {
    +      throw err
    +    }
    +    throw new Error(stderr)
    +  }
    +
    +  const result = outRe.exec(stdout)
    +  if (!result) {
    +    log.silly('reg', 'error parsing stdout')
    +    throw new Error('Could not parse output of reg.exe')
    +  }
    +
    +  log.silly('reg', 'found: %j', result[1])
    +  return result[1]
    +}
    +
    +async function regSearchKeys (keys, value, addOpts) {
    +  for (const key of keys) {
    +    try {
    +      return await regGetValue(key, value, addOpts)
    +    } catch {
    +      continue
    +    }
    +  }
     }
     
    -function regSearchKeys (keys, value, addOpts, cb) {
    -  var i = 0
    -  const search = () => {
    -    log.silly('reg-search', 'looking for %j in %j', value, keys[i])
    -    regGetValue(keys[i], value, addOpts, (err, res) => {
    -      ++i
    -      if (err && i < keys.length) { return search() }
    -      cb(err, res)
    -    })
    +/**
    + * Returns the first file or directory from an array of candidates that is
    + * readable by the current user, or undefined if none of the candidates are
    + * readable.
    + */
    +function findAccessibleSync (logprefix, dir, candidates) {
    +  for (let next = 0; next < candidates.length; next++) {
    +    const candidate = path.resolve(dir, candidates[next])
    +    let fd
    +    try {
    +      fd = openSync(candidate, 'r')
    +    } catch (e) {
    +      // this candidate was not found or not readable, do nothing
    +      log.silly(logprefix, 'Could not open %s: %s', candidate, e.message)
    +      continue
    +    }
    +    closeSync(fd)
    +    log.silly(logprefix, 'Found readable %s', candidate)
    +    return candidate
       }
    -  search()
    +
    +  return undefined
     }
     
     module.exports = {
    -  logWithPrefix: logWithPrefix,
    -  regGetValue: regGetValue,
    -  regSearchKeys: regSearchKeys
    +  execFile,
    +  regGetValue,
    +  regSearchKeys,
    +  findAccessibleSync
     }
    diff --git a/deps/npm/node_modules/node-gyp/macOS_Catalina.md b/deps/npm/node_modules/node-gyp/macOS_Catalina.md
    deleted file mode 100644
    index dde5fe3f7d4fbf..00000000000000
    --- a/deps/npm/node_modules/node-gyp/macOS_Catalina.md
    +++ /dev/null
    @@ -1,104 +0,0 @@
    -# Installation notes for macOS Catalina (v10.15)
    -
    -_This document specifically refers to upgrades from previous versions of macOS to Catalina (10.15). It should be removed from the source repository when Catalina ceases to be the latest macOS version or when future Catalina versions no longer raise these issues._
    -
    -**Both upgrading to macOS Catalina and running a Software Update in Catalina may cause normal `node-gyp` installations to fail. This might manifest as the following error during `npm install`:**
    -
    -```console
    -gyp: No Xcode or CLT version detected!
    -```
    -
    -## node-gyp v7
    -
    -The newest release of `node-gyp` should solve this problem. If you are using `node-gyp` directly then you should be able to install v7 and use it as-is.
    -
    -If you need to use `node-gyp` from within `npm` (e.g. through `npm install`), you will have to install `node-gyp` (either globally with `-g` or to a predictable location) and tell `npm` where the new version is. Either use:
    -
    -* `npm config set node_gyp `; or
    -* run `npm` with an environment variable prefix: `npm_config_node_gyp= npm install`
    -
    -Where "path to node-gyp" is to the `node-gyp` executable which may be a symlink in your global bin directory (e.g. `/usr/local/bin/node-gyp`), or a path to the `node-gyp` installation directory and the `bin/node-gyp.js` file within it (e.g. `/usr/local/lib/node_modules/node-gyp/bin/node-gyp.js`).
    -
    -**If you use `npm config set` to change your global `node_gyp` you are responsible for keeping it up to date and can't rely on `npm` to give you a newer version when available.** Use `npm config delete node_gyp` to unset this configuration option.
    -
    -## Fixing Catalina for older versions of `node-gyp`
    -
    -### Is my Mac running macOS Catalina?
    -Let's first make sure that your Mac is running Catalina:
    -```
    -% sw_vers
    -    ProductName:	Mac OS X
    -    ProductVersion:	10.15
    -    BuildVersion:	19A602
    -```
    -If `ProductVersion` is less then `10.15` then this document is not for you. Normal install docs for `node-gyp` on macOS can be found at https://github.com/nodejs/node-gyp#on-macos
    -
    -
    -### The acid test
    -To see if `Xcode Command Line Tools` is installed in a way that will work with `node-gyp`, run:
    -```
    -curl -sL https://github.com/nodejs/node-gyp/raw/main/macOS_Catalina_acid_test.sh | bash
    -```
    -
    -If test succeeded, _you are done_! You should be ready to [install](https://github.com/nodejs/node-gyp#installation) `node-gyp`.
    -
    -If test failed, there is a problem with your Xcode Command Line Tools installation. [Continue to Solutions](#Solutions).
    -
    -### Solutions
    -There are three ways to install the Xcode libraries `node-gyp` needs on macOS. People running Catalina have had success with some but not others in a way that has been unpredictable.
    -
    -1. With the full Xcode (~7.6 GB download) from the `App Store` app.
    -2. With the _much_ smaller Xcode Command Line Tools via `xcode-select --install`
    -3. With the _much_ smaller Xcode Command Line Tools via manual download. **For people running the latest version of Catalina (10.15.2 at the time of this writing), this has worked when the other two solutions haven't.**
    -
    -### Installing `node-gyp` using the full Xcode
    -1. `xcodebuild -version` should show `Xcode 11.1` or later.
    -    * If not, then install/upgrade Xcode from the App Store app.
    -2. Open the Xcode app and...
    -    * Under __Preferences > Locations__ select the tools if their location is empty.
    -    * Allow Xcode app to do an essential install of the most recent compiler tools.
    -3. Once all installations are _complete_, quit out of Xcode.
    -4. `sudo xcodebuild -license accept`  # If you agree with the licensing terms.
    -5. `softwareupdate -l`  # No listing is a good sign.
    -    * If Xcode or Tools upgrades are listed, use "Software Upgrade" to install them.
    -6. `xcode-select -version`  # Should return `xcode-select version 2370` or later.
    -7. `xcode-select -print-path`  # Should return `/Applications/Xcode.app/Contents/Developer`
    -8. Try the [_acid test_ steps above](#The-acid-test) to see if your Mac is ready.
    -9. If the _acid test_ does _not_ pass then...
    -10. `sudo xcode-select --reset`  # Enter root password.  No output is normal.
    -11. Repeat step 7 above.  Is the path different this time?  Repeat the _acid test_.
    -
    -### Installing `node-gyp` using the Xcode Command Line Tools via `xcode-select --install`
    -1. If the _acid test_ has not succeeded, then try `xcode-select --install`
    -2. If the installation command returns `xcode-select: error: command line tools are already installed, use "Software Update" to install updates`, continue to [remove and reinstall](#i-did-all-that-and-the-acid-test-still-does-not-pass--)
    -3. Wait until the install process is _complete_.
    -4. `softwareupdate -l`  # No listing is a good sign.
    -    * If Xcode or Tools upgrades are listed, use "Software Update" to install them.
    -5. `xcode-select -version`  # Should return `xcode-select version 2370` or later.
    -6. `xcode-select -print-path`  # Should return `/Library/Developer/CommandLineTools`
    -7. Try the [_acid test_ steps above](#The-acid-test) to see if your Mac is ready.
    -8. If the _acid test_ does _not_ pass then...
    -9. `sudo xcode-select --reset`  # Enter root password.  No output is normal.
    -10. Repeat step 5 above.  Is the path different this time?  Repeat the _acid test_.
    -
    -### Installing `node-gyp` using the Xcode Command Line Tools via manual download
    -1. Download the appropriate version of the "Command Line Tools for Xcode" for your version of Catalina from . As of MacOS 10.15.5, that's [Command_Line_Tools_for_Xcode_11.5.dmg](https://download.developer.apple.com/Developer_Tools/Command_Line_Tools_for_Xcode_11.5/Command_Line_Tools_for_Xcode_11.5.dmg)
    -2. Install the package.
    -3. Run the [_acid test_ steps above](#The-acid-test).
    -
    -### I did all that and the acid test still does not pass :-(
    -1. `sudo rm -rf $(xcode-select -print-path)`  # Enter root password.  No output is normal.
    -2. `sudo rm -rf /Library/Developer/CommandLineTools`  # Enter root password.
    -3. `sudo xcode-select --reset`
    -4. `xcode-select --install`
    -5. If the [_acid test_ steps above](#The-acid-test) still does _not_ pass then...
    -6. `npm explore npm -g -- npm install node-gyp@latest`
    -7. `npm explore npm -g -- npm explore npm-lifecycle -- npm install node-gyp@latest`
    -8. If the _acid test_ still does _not_ pass then...
    -9. Add a comment to https://github.com/nodejs/node-gyp/issues/1927 so we can improve.
    -
    -Lessons learned from:
    -* https://github.com/nodejs/node-gyp/issues/1779
    -* https://github.com/nodejs/node-gyp/issues/1861
    -* https://github.com/nodejs/node-gyp/issues/1927 and elsewhere
    -* Thanks to @rrrix for discovering Solution 3
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/abbrev/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/abbrev/LICENSE
    deleted file mode 100644
    index 9bcfa9d7d8d26e..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/abbrev/LICENSE
    +++ /dev/null
    @@ -1,46 +0,0 @@
    -This software is dual-licensed under the ISC and MIT licenses.
    -You may use this software under EITHER of the following licenses.
    -
    -----------
    -
    -The ISC License
    -
    -Copyright (c) Isaac Z. Schlueter and Contributors
    -
    -Permission to use, copy, modify, and/or distribute this software for any
    -purpose with or without fee is hereby granted, provided that the above
    -copyright notice and this permission notice appear in all copies.
    -
    -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
    -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    -
    -----------
    -
    -Copyright Isaac Z. Schlueter and Contributors
    -All rights reserved.
    -
    -Permission is hereby granted, free of charge, to any person
    -obtaining a copy of this software and associated documentation
    -files (the "Software"), to deal in the Software without
    -restriction, including without limitation the rights to use,
    -copy, modify, merge, publish, distribute, sublicense, and/or sell
    -copies of the Software, and to permit persons to whom the
    -Software is furnished to do so, subject to the following
    -conditions:
    -
    -The above copyright notice and this permission notice shall be
    -included in all copies or substantial portions of the Software.
    -
    -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
    -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
    -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
    -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
    -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
    -OTHER DEALINGS IN THE SOFTWARE.
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/abbrev/abbrev.js b/deps/npm/node_modules/node-gyp/node_modules/abbrev/abbrev.js
    deleted file mode 100644
    index 7b1dc5d67694a2..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/abbrev/abbrev.js
    +++ /dev/null
    @@ -1,61 +0,0 @@
    -module.exports = exports = abbrev.abbrev = abbrev
    -
    -abbrev.monkeyPatch = monkeyPatch
    -
    -function monkeyPatch () {
    -  Object.defineProperty(Array.prototype, 'abbrev', {
    -    value: function () { return abbrev(this) },
    -    enumerable: false, configurable: true, writable: true
    -  })
    -
    -  Object.defineProperty(Object.prototype, 'abbrev', {
    -    value: function () { return abbrev(Object.keys(this)) },
    -    enumerable: false, configurable: true, writable: true
    -  })
    -}
    -
    -function abbrev (list) {
    -  if (arguments.length !== 1 || !Array.isArray(list)) {
    -    list = Array.prototype.slice.call(arguments, 0)
    -  }
    -  for (var i = 0, l = list.length, args = [] ; i < l ; i ++) {
    -    args[i] = typeof list[i] === "string" ? list[i] : String(list[i])
    -  }
    -
    -  // sort them lexicographically, so that they're next to their nearest kin
    -  args = args.sort(lexSort)
    -
    -  // walk through each, seeing how much it has in common with the next and previous
    -  var abbrevs = {}
    -    , prev = ""
    -  for (var i = 0, l = args.length ; i < l ; i ++) {
    -    var current = args[i]
    -      , next = args[i + 1] || ""
    -      , nextMatches = true
    -      , prevMatches = true
    -    if (current === next) continue
    -    for (var j = 0, cl = current.length ; j < cl ; j ++) {
    -      var curChar = current.charAt(j)
    -      nextMatches = nextMatches && curChar === next.charAt(j)
    -      prevMatches = prevMatches && curChar === prev.charAt(j)
    -      if (!nextMatches && !prevMatches) {
    -        j ++
    -        break
    -      }
    -    }
    -    prev = current
    -    if (j === cl) {
    -      abbrevs[current] = current
    -      continue
    -    }
    -    for (var a = current.substr(0, j) ; j <= cl ; j ++) {
    -      abbrevs[a] = current
    -      a += current.charAt(j)
    -    }
    -  }
    -  return abbrevs
    -}
    -
    -function lexSort (a, b) {
    -  return a === b ? 0 : a > b ? 1 : -1
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/abbrev/package.json b/deps/npm/node_modules/node-gyp/node_modules/abbrev/package.json
    deleted file mode 100644
    index bf4e8015bba9d5..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/abbrev/package.json
    +++ /dev/null
    @@ -1,21 +0,0 @@
    -{
    -  "name": "abbrev",
    -  "version": "1.1.1",
    -  "description": "Like ruby's abbrev module, but in js",
    -  "author": "Isaac Z. Schlueter ",
    -  "main": "abbrev.js",
    -  "scripts": {
    -    "test": "tap test.js --100",
    -    "preversion": "npm test",
    -    "postversion": "npm publish",
    -    "postpublish": "git push origin --all; git push origin --tags"
    -  },
    -  "repository": "http://github.com/isaacs/abbrev-js",
    -  "license": "ISC",
    -  "devDependencies": {
    -    "tap": "^10.1"
    -  },
    -  "files": [
    -    "abbrev.js"
    -  ]
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/are-we-there-yet/LICENSE.md b/deps/npm/node_modules/node-gyp/node_modules/are-we-there-yet/LICENSE.md
    deleted file mode 100644
    index 845be76f64e789..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/are-we-there-yet/LICENSE.md
    +++ /dev/null
    @@ -1,18 +0,0 @@
    -ISC License
    -
    -Copyright npm, Inc.
    -
    -Permission to use, copy, modify, and/or distribute this
    -software for any purpose with or without fee is hereby
    -granted, provided that the above copyright notice and this
    -permission notice appear in all copies.
    -
    -THE SOFTWARE IS PROVIDED "AS IS" AND NPM DISCLAIMS ALL
    -WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
    -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
    -EVENT SHALL NPM BE LIABLE FOR ANY SPECIAL, DIRECT,
    -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
    -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
    -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
    -USE OR PERFORMANCE OF THIS SOFTWARE.
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/are-we-there-yet/lib/index.js b/deps/npm/node_modules/node-gyp/node_modules/are-we-there-yet/lib/index.js
    deleted file mode 100644
    index 57d8743fdad177..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/are-we-there-yet/lib/index.js
    +++ /dev/null
    @@ -1,4 +0,0 @@
    -'use strict'
    -exports.TrackerGroup = require('./tracker-group.js')
    -exports.Tracker = require('./tracker.js')
    -exports.TrackerStream = require('./tracker-stream.js')
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/are-we-there-yet/lib/tracker-base.js b/deps/npm/node_modules/node-gyp/node_modules/are-we-there-yet/lib/tracker-base.js
    deleted file mode 100644
    index 6f436875578a7a..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/are-we-there-yet/lib/tracker-base.js
    +++ /dev/null
    @@ -1,11 +0,0 @@
    -'use strict'
    -var EventEmitter = require('events').EventEmitter
    -var util = require('util')
    -
    -var trackerId = 0
    -var TrackerBase = module.exports = function (name) {
    -  EventEmitter.call(this)
    -  this.id = ++trackerId
    -  this.name = name
    -}
    -util.inherits(TrackerBase, EventEmitter)
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/are-we-there-yet/lib/tracker-group.js b/deps/npm/node_modules/node-gyp/node_modules/are-we-there-yet/lib/tracker-group.js
    deleted file mode 100644
    index a3c7af804c4d3b..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/are-we-there-yet/lib/tracker-group.js
    +++ /dev/null
    @@ -1,116 +0,0 @@
    -'use strict'
    -var util = require('util')
    -var TrackerBase = require('./tracker-base.js')
    -var Tracker = require('./tracker.js')
    -var TrackerStream = require('./tracker-stream.js')
    -
    -var TrackerGroup = module.exports = function (name) {
    -  TrackerBase.call(this, name)
    -  this.parentGroup = null
    -  this.trackers = []
    -  this.completion = {}
    -  this.weight = {}
    -  this.totalWeight = 0
    -  this.finished = false
    -  this.bubbleChange = bubbleChange(this)
    -}
    -util.inherits(TrackerGroup, TrackerBase)
    -
    -function bubbleChange (trackerGroup) {
    -  return function (name, completed, tracker) {
    -    trackerGroup.completion[tracker.id] = completed
    -    if (trackerGroup.finished) {
    -      return
    -    }
    -    trackerGroup.emit('change', name || trackerGroup.name, trackerGroup.completed(), trackerGroup)
    -  }
    -}
    -
    -TrackerGroup.prototype.nameInTree = function () {
    -  var names = []
    -  var from = this
    -  while (from) {
    -    names.unshift(from.name)
    -    from = from.parentGroup
    -  }
    -  return names.join('/')
    -}
    -
    -TrackerGroup.prototype.addUnit = function (unit, weight) {
    -  if (unit.addUnit) {
    -    var toTest = this
    -    while (toTest) {
    -      if (unit === toTest) {
    -        throw new Error(
    -          'Attempted to add tracker group ' +
    -          unit.name + ' to tree that already includes it ' +
    -          this.nameInTree(this))
    -      }
    -      toTest = toTest.parentGroup
    -    }
    -    unit.parentGroup = this
    -  }
    -  this.weight[unit.id] = weight || 1
    -  this.totalWeight += this.weight[unit.id]
    -  this.trackers.push(unit)
    -  this.completion[unit.id] = unit.completed()
    -  unit.on('change', this.bubbleChange)
    -  if (!this.finished) {
    -    this.emit('change', unit.name, this.completion[unit.id], unit)
    -  }
    -  return unit
    -}
    -
    -TrackerGroup.prototype.completed = function () {
    -  if (this.trackers.length === 0) {
    -    return 0
    -  }
    -  var valPerWeight = 1 / this.totalWeight
    -  var completed = 0
    -  for (var ii = 0; ii < this.trackers.length; ii++) {
    -    var trackerId = this.trackers[ii].id
    -    completed +=
    -      valPerWeight * this.weight[trackerId] * this.completion[trackerId]
    -  }
    -  return completed
    -}
    -
    -TrackerGroup.prototype.newGroup = function (name, weight) {
    -  return this.addUnit(new TrackerGroup(name), weight)
    -}
    -
    -TrackerGroup.prototype.newItem = function (name, todo, weight) {
    -  return this.addUnit(new Tracker(name, todo), weight)
    -}
    -
    -TrackerGroup.prototype.newStream = function (name, todo, weight) {
    -  return this.addUnit(new TrackerStream(name, todo), weight)
    -}
    -
    -TrackerGroup.prototype.finish = function () {
    -  this.finished = true
    -  if (!this.trackers.length) {
    -    this.addUnit(new Tracker(), 1, true)
    -  }
    -  for (var ii = 0; ii < this.trackers.length; ii++) {
    -    var tracker = this.trackers[ii]
    -    tracker.finish()
    -    tracker.removeListener('change', this.bubbleChange)
    -  }
    -  this.emit('change', this.name, 1, this)
    -}
    -
    -var buffer = '                                  '
    -TrackerGroup.prototype.debug = function (depth) {
    -  depth = depth || 0
    -  var indent = depth ? buffer.slice(0, depth) : ''
    -  var output = indent + (this.name || 'top') + ': ' + this.completed() + '\n'
    -  this.trackers.forEach(function (tracker) {
    -    if (tracker instanceof TrackerGroup) {
    -      output += tracker.debug(depth + 1)
    -    } else {
    -      output += indent + ' ' + tracker.name + ': ' + tracker.completed() + '\n'
    -    }
    -  })
    -  return output
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/are-we-there-yet/lib/tracker-stream.js b/deps/npm/node_modules/node-gyp/node_modules/are-we-there-yet/lib/tracker-stream.js
    deleted file mode 100644
    index e1cf85055702a7..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/are-we-there-yet/lib/tracker-stream.js
    +++ /dev/null
    @@ -1,36 +0,0 @@
    -'use strict'
    -var util = require('util')
    -var stream = require('readable-stream')
    -var delegate = require('delegates')
    -var Tracker = require('./tracker.js')
    -
    -var TrackerStream = module.exports = function (name, size, options) {
    -  stream.Transform.call(this, options)
    -  this.tracker = new Tracker(name, size)
    -  this.name = name
    -  this.id = this.tracker.id
    -  this.tracker.on('change', delegateChange(this))
    -}
    -util.inherits(TrackerStream, stream.Transform)
    -
    -function delegateChange (trackerStream) {
    -  return function (name, completion, tracker) {
    -    trackerStream.emit('change', name, completion, trackerStream)
    -  }
    -}
    -
    -TrackerStream.prototype._transform = function (data, encoding, cb) {
    -  this.tracker.completeWork(data.length ? data.length : 1)
    -  this.push(data)
    -  cb()
    -}
    -
    -TrackerStream.prototype._flush = function (cb) {
    -  this.tracker.finish()
    -  cb()
    -}
    -
    -delegate(TrackerStream.prototype, 'tracker')
    -  .method('completed')
    -  .method('addWork')
    -  .method('finish')
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/are-we-there-yet/lib/tracker.js b/deps/npm/node_modules/node-gyp/node_modules/are-we-there-yet/lib/tracker.js
    deleted file mode 100644
    index a8f8b3ba013915..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/are-we-there-yet/lib/tracker.js
    +++ /dev/null
    @@ -1,32 +0,0 @@
    -'use strict'
    -var util = require('util')
    -var TrackerBase = require('./tracker-base.js')
    -
    -var Tracker = module.exports = function (name, todo) {
    -  TrackerBase.call(this, name)
    -  this.workDone = 0
    -  this.workTodo = todo || 0
    -}
    -util.inherits(Tracker, TrackerBase)
    -
    -Tracker.prototype.completed = function () {
    -  return this.workTodo === 0 ? 0 : this.workDone / this.workTodo
    -}
    -
    -Tracker.prototype.addWork = function (work) {
    -  this.workTodo += work
    -  this.emit('change', this.name, this.completed(), this)
    -}
    -
    -Tracker.prototype.completeWork = function (work) {
    -  this.workDone += work
    -  if (this.workDone > this.workTodo) {
    -    this.workDone = this.workTodo
    -  }
    -  this.emit('change', this.name, this.completed(), this)
    -}
    -
    -Tracker.prototype.finish = function () {
    -  this.workTodo = this.workDone = 1
    -  this.emit('change', this.name, 1, this)
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/are-we-there-yet/package.json b/deps/npm/node_modules/node-gyp/node_modules/are-we-there-yet/package.json
    deleted file mode 100644
    index cc3d7504299fa2..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/are-we-there-yet/package.json
    +++ /dev/null
    @@ -1,56 +0,0 @@
    -{
    -  "name": "are-we-there-yet",
    -  "version": "3.0.1",
    -  "description": "Keep track of the overall completion of many disparate processes",
    -  "main": "lib/index.js",
    -  "scripts": {
    -    "test": "tap",
    -    "npmclilint": "npmcli-lint",
    -    "lint": "eslint \"**/*.js\"",
    -    "lintfix": "npm run lint -- --fix",
    -    "posttest": "npm run lint",
    -    "postsnap": "npm run lintfix --",
    -    "preversion": "npm test",
    -    "postversion": "npm publish",
    -    "prepublishOnly": "git push origin --follow-tags",
    -    "snap": "tap",
    -    "postlint": "template-oss-check",
    -    "template-oss-apply": "template-oss-apply --force"
    -  },
    -  "repository": {
    -    "type": "git",
    -    "url": "https://github.com/npm/are-we-there-yet.git"
    -  },
    -  "author": "GitHub Inc.",
    -  "license": "ISC",
    -  "bugs": {
    -    "url": "https://github.com/npm/are-we-there-yet/issues"
    -  },
    -  "homepage": "https://github.com/npm/are-we-there-yet",
    -  "devDependencies": {
    -    "@npmcli/eslint-config": "^3.0.1",
    -    "@npmcli/template-oss": "3.5.0",
    -    "tap": "^16.0.1"
    -  },
    -  "dependencies": {
    -    "delegates": "^1.0.0",
    -    "readable-stream": "^3.6.0"
    -  },
    -  "files": [
    -    "bin/",
    -    "lib/"
    -  ],
    -  "engines": {
    -    "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
    -  },
    -  "tap": {
    -    "branches": 68,
    -    "statements": 92,
    -    "functions": 86,
    -    "lines": 92
    -  },
    -  "templateOSS": {
    -    "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "version": "3.5.0"
    -  }
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/brace-expansion/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/brace-expansion/LICENSE
    deleted file mode 100644
    index de3226673c3874..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/brace-expansion/LICENSE
    +++ /dev/null
    @@ -1,21 +0,0 @@
    -MIT License
    -
    -Copyright (c) 2013 Julian Gruber 
    -
    -Permission is hereby granted, free of charge, to any person obtaining a copy
    -of this software and associated documentation files (the "Software"), to deal
    -in the Software without restriction, including without limitation the rights
    -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    -copies of the Software, and to permit persons to whom the Software is
    -furnished to do so, subject to the following conditions:
    -
    -The above copyright notice and this permission notice shall be included in all
    -copies or substantial portions of the Software.
    -
    -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    -SOFTWARE.
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/brace-expansion/index.js b/deps/npm/node_modules/node-gyp/node_modules/brace-expansion/index.js
    deleted file mode 100644
    index 2b6f4f85c951fc..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/brace-expansion/index.js
    +++ /dev/null
    @@ -1,200 +0,0 @@
    -var concatMap = require('concat-map');
    -var balanced = require('balanced-match');
    -
    -module.exports = expandTop;
    -
    -var escSlash = '\0SLASH'+Math.random()+'\0';
    -var escOpen = '\0OPEN'+Math.random()+'\0';
    -var escClose = '\0CLOSE'+Math.random()+'\0';
    -var escComma = '\0COMMA'+Math.random()+'\0';
    -var escPeriod = '\0PERIOD'+Math.random()+'\0';
    -
    -function numeric(str) {
    -  return parseInt(str, 10) == str
    -    ? parseInt(str, 10)
    -    : str.charCodeAt(0);
    -}
    -
    -function escapeBraces(str) {
    -  return str.split('\\\\').join(escSlash)
    -            .split('\\{').join(escOpen)
    -            .split('\\}').join(escClose)
    -            .split('\\,').join(escComma)
    -            .split('\\.').join(escPeriod);
    -}
    -
    -function unescapeBraces(str) {
    -  return str.split(escSlash).join('\\')
    -            .split(escOpen).join('{')
    -            .split(escClose).join('}')
    -            .split(escComma).join(',')
    -            .split(escPeriod).join('.');
    -}
    -
    -
    -// Basically just str.split(","), but handling cases
    -// where we have nested braced sections, which should be
    -// treated as individual members, like {a,{b,c},d}
    -function parseCommaParts(str) {
    -  if (!str)
    -    return [''];
    -
    -  var parts = [];
    -  var m = balanced('{', '}', str);
    -
    -  if (!m)
    -    return str.split(',');
    -
    -  var pre = m.pre;
    -  var body = m.body;
    -  var post = m.post;
    -  var p = pre.split(',');
    -
    -  p[p.length-1] += '{' + body + '}';
    -  var postParts = parseCommaParts(post);
    -  if (post.length) {
    -    p[p.length-1] += postParts.shift();
    -    p.push.apply(p, postParts);
    -  }
    -
    -  parts.push.apply(parts, p);
    -
    -  return parts;
    -}
    -
    -function expandTop(str) {
    -  if (!str)
    -    return [];
    -
    -  // I don't know why Bash 4.3 does this, but it does.
    -  // Anything starting with {} will have the first two bytes preserved
    -  // but *only* at the top level, so {},a}b will not expand to anything,
    -  // but a{},b}c will be expanded to [a}c,abc].
    -  // One could argue that this is a bug in Bash, but since the goal of
    -  // this module is to match Bash's rules, we escape a leading {}
    -  if (str.substr(0, 2) === '{}') {
    -    str = '\\{\\}' + str.substr(2);
    -  }
    -
    -  return expand(escapeBraces(str), true).map(unescapeBraces);
    -}
    -
    -function identity(e) {
    -  return e;
    -}
    -
    -function embrace(str) {
    -  return '{' + str + '}';
    -}
    -function isPadded(el) {
    -  return /^-?0\d/.test(el);
    -}
    -
    -function lte(i, y) {
    -  return i <= y;
    -}
    -function gte(i, y) {
    -  return i >= y;
    -}
    -
    -function expand(str, isTop) {
    -  var expansions = [];
    -
    -  var m = balanced('{', '}', str);
    -  if (!m || /\$$/.test(m.pre)) return [str];
    -
    -  var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
    -  var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
    -  var isSequence = isNumericSequence || isAlphaSequence;
    -  var isOptions = m.body.indexOf(',') >= 0;
    -  if (!isSequence && !isOptions) {
    -    // {a},b}
    -    if (m.post.match(/,.*\}/)) {
    -      str = m.pre + '{' + m.body + escClose + m.post;
    -      return expand(str);
    -    }
    -    return [str];
    -  }
    -
    -  var n;
    -  if (isSequence) {
    -    n = m.body.split(/\.\./);
    -  } else {
    -    n = parseCommaParts(m.body);
    -    if (n.length === 1) {
    -      // x{{a,b}}y ==> x{a}y x{b}y
    -      n = expand(n[0], false).map(embrace);
    -      if (n.length === 1) {
    -        var post = m.post.length
    -          ? expand(m.post, false)
    -          : [''];
    -        return post.map(function(p) {
    -          return m.pre + n[0] + p;
    -        });
    -      }
    -    }
    -  }
    -
    -  // at this point, n is the parts, and we know it's not a comma set
    -  // with a single entry.
    -
    -  // no need to expand pre, since it is guaranteed to be free of brace-sets
    -  var pre = m.pre;
    -  var post = m.post.length
    -    ? expand(m.post, false)
    -    : [''];
    -
    -  var N;
    -
    -  if (isSequence) {
    -    var x = numeric(n[0]);
    -    var y = numeric(n[1]);
    -    var width = Math.max(n[0].length, n[1].length)
    -    var incr = n.length == 3
    -      ? Math.abs(numeric(n[2]))
    -      : 1;
    -    var test = lte;
    -    var reverse = y < x;
    -    if (reverse) {
    -      incr *= -1;
    -      test = gte;
    -    }
    -    var pad = n.some(isPadded);
    -
    -    N = [];
    -
    -    for (var i = x; test(i, y); i += incr) {
    -      var c;
    -      if (isAlphaSequence) {
    -        c = String.fromCharCode(i);
    -        if (c === '\\')
    -          c = '';
    -      } else {
    -        c = String(i);
    -        if (pad) {
    -          var need = width - c.length;
    -          if (need > 0) {
    -            var z = new Array(need + 1).join('0');
    -            if (i < 0)
    -              c = '-' + z + c.slice(1);
    -            else
    -              c = z + c;
    -          }
    -        }
    -      }
    -      N.push(c);
    -    }
    -  } else {
    -    N = concatMap(n, function(el) { return expand(el, false) });
    -  }
    -
    -  for (var j = 0; j < N.length; j++) {
    -    for (var k = 0; k < post.length; k++) {
    -      var expansion = pre + N[j] + post[k];
    -      if (!isTop || isSequence || expansion)
    -        expansions.push(expansion);
    -    }
    -  }
    -
    -  return expansions;
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/brace-expansion/package.json b/deps/npm/node_modules/node-gyp/node_modules/brace-expansion/package.json
    deleted file mode 100644
    index a18faa8fd67b82..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/brace-expansion/package.json
    +++ /dev/null
    @@ -1,47 +0,0 @@
    -{
    -  "name": "brace-expansion",
    -  "description": "Brace expansion as known from sh/bash",
    -  "version": "1.1.11",
    -  "repository": {
    -    "type": "git",
    -    "url": "git://github.com/juliangruber/brace-expansion.git"
    -  },
    -  "homepage": "https://github.com/juliangruber/brace-expansion",
    -  "main": "index.js",
    -  "scripts": {
    -    "test": "tape test/*.js",
    -    "gentest": "bash test/generate.sh",
    -    "bench": "matcha test/perf/bench.js"
    -  },
    -  "dependencies": {
    -    "balanced-match": "^1.0.0",
    -    "concat-map": "0.0.1"
    -  },
    -  "devDependencies": {
    -    "matcha": "^0.7.0",
    -    "tape": "^4.6.0"
    -  },
    -  "keywords": [],
    -  "author": {
    -    "name": "Julian Gruber",
    -    "email": "mail@juliangruber.com",
    -    "url": "http://juliangruber.com"
    -  },
    -  "license": "MIT",
    -  "testling": {
    -    "files": "test/*.js",
    -    "browsers": [
    -      "ie/8..latest",
    -      "firefox/20..latest",
    -      "firefox/nightly",
    -      "chrome/25..latest",
    -      "chrome/canary",
    -      "opera/12..latest",
    -      "opera/next",
    -      "safari/5.1..latest",
    -      "ipad/6.0..latest",
    -      "iphone/6.0..latest",
    -      "android-browser/4.2..latest"
    -    ]
    -  }
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/LICENSE.md b/deps/npm/node_modules/node-gyp/node_modules/cacache/LICENSE.md
    deleted file mode 100644
    index 8d28acf866d932..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/LICENSE.md
    +++ /dev/null
    @@ -1,16 +0,0 @@
    -ISC License
    -
    -Copyright (c) npm, Inc.
    -
    -Permission to use, copy, modify, and/or distribute this software for
    -any purpose with or without fee is hereby granted, provided that the
    -above copyright notice and this permission notice appear in all copies.
    -
    -THE SOFTWARE IS PROVIDED "AS IS" AND THE COPYRIGHT HOLDER DISCLAIMS
    -ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
    -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
    -COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
    -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
    -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
    -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
    -USE OR PERFORMANCE OF THIS SOFTWARE.
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/path.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/path.js
    deleted file mode 100644
    index ad5a76a4f73f26..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/path.js
    +++ /dev/null
    @@ -1,29 +0,0 @@
    -'use strict'
    -
    -const contentVer = require('../../package.json')['cache-version'].content
    -const hashToSegments = require('../util/hash-to-segments')
    -const path = require('path')
    -const ssri = require('ssri')
    -
    -// Current format of content file path:
    -//
    -// sha512-BaSE64Hex= ->
    -// ~/.my-cache/content-v2/sha512/ba/da/55deadbeefc0ffee
    -//
    -module.exports = contentPath
    -
    -function contentPath (cache, integrity) {
    -  const sri = ssri.parse(integrity, { single: true })
    -  // contentPath is the *strongest* algo given
    -  return path.join(
    -    contentDir(cache),
    -    sri.algorithm,
    -    ...hashToSegments(sri.hexDigest())
    -  )
    -}
    -
    -module.exports.contentDir = contentDir
    -
    -function contentDir (cache) {
    -  return path.join(cache, `content-v${contentVer}`)
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/read.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/read.js
    deleted file mode 100644
    index f41b539df65dce..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/read.js
    +++ /dev/null
    @@ -1,166 +0,0 @@
    -'use strict'
    -
    -const fs = require('fs/promises')
    -const fsm = require('fs-minipass')
    -const ssri = require('ssri')
    -const contentPath = require('./path')
    -const Pipeline = require('minipass-pipeline')
    -
    -module.exports = read
    -
    -const MAX_SINGLE_READ_SIZE = 64 * 1024 * 1024
    -async function read (cache, integrity, opts = {}) {
    -  const { size } = opts
    -  const { stat, cpath, sri } = await withContentSri(cache, integrity, async (cpath, sri) => {
    -    // get size
    -    const stat = await fs.stat(cpath)
    -    return { stat, cpath, sri }
    -  })
    -  if (typeof size === 'number' && stat.size !== size) {
    -    throw sizeError(size, stat.size)
    -  }
    -
    -  if (stat.size > MAX_SINGLE_READ_SIZE) {
    -    return readPipeline(cpath, stat.size, sri, new Pipeline()).concat()
    -  }
    -
    -  const data = await fs.readFile(cpath, { encoding: null })
    -  if (!ssri.checkData(data, sri)) {
    -    throw integrityError(sri, cpath)
    -  }
    -
    -  return data
    -}
    -
    -const readPipeline = (cpath, size, sri, stream) => {
    -  stream.push(
    -    new fsm.ReadStream(cpath, {
    -      size,
    -      readSize: MAX_SINGLE_READ_SIZE,
    -    }),
    -    ssri.integrityStream({
    -      integrity: sri,
    -      size,
    -    })
    -  )
    -  return stream
    -}
    -
    -module.exports.stream = readStream
    -module.exports.readStream = readStream
    -
    -function readStream (cache, integrity, opts = {}) {
    -  const { size } = opts
    -  const stream = new Pipeline()
    -  // Set all this up to run on the stream and then just return the stream
    -  Promise.resolve().then(async () => {
    -    const { stat, cpath, sri } = await withContentSri(cache, integrity, async (cpath, sri) => {
    -      // just stat to ensure it exists
    -      const stat = await fs.stat(cpath)
    -      return { stat, cpath, sri }
    -    })
    -    if (typeof size === 'number' && size !== stat.size) {
    -      return stream.emit('error', sizeError(size, stat.size))
    -    }
    -
    -    return readPipeline(cpath, stat.size, sri, stream)
    -  }).catch(err => stream.emit('error', err))
    -
    -  return stream
    -}
    -
    -module.exports.copy = copy
    -
    -function copy (cache, integrity, dest) {
    -  return withContentSri(cache, integrity, (cpath, sri) => {
    -    return fs.copyFile(cpath, dest)
    -  })
    -}
    -
    -module.exports.hasContent = hasContent
    -
    -async function hasContent (cache, integrity) {
    -  if (!integrity) {
    -    return false
    -  }
    -
    -  try {
    -    return await withContentSri(cache, integrity, async (cpath, sri) => {
    -      const stat = await fs.stat(cpath)
    -      return { size: stat.size, sri, stat }
    -    })
    -  } catch (err) {
    -    if (err.code === 'ENOENT') {
    -      return false
    -    }
    -
    -    if (err.code === 'EPERM') {
    -      /* istanbul ignore else */
    -      if (process.platform !== 'win32') {
    -        throw err
    -      } else {
    -        return false
    -      }
    -    }
    -  }
    -}
    -
    -async function withContentSri (cache, integrity, fn) {
    -  const sri = ssri.parse(integrity)
    -  // If `integrity` has multiple entries, pick the first digest
    -  // with available local data.
    -  const algo = sri.pickAlgorithm()
    -  const digests = sri[algo]
    -
    -  if (digests.length <= 1) {
    -    const cpath = contentPath(cache, digests[0])
    -    return fn(cpath, digests[0])
    -  } else {
    -    // Can't use race here because a generic error can happen before
    -    // a ENOENT error, and can happen before a valid result
    -    const results = await Promise.all(digests.map(async (meta) => {
    -      try {
    -        return await withContentSri(cache, meta, fn)
    -      } catch (err) {
    -        if (err.code === 'ENOENT') {
    -          return Object.assign(
    -            new Error('No matching content found for ' + sri.toString()),
    -            { code: 'ENOENT' }
    -          )
    -        }
    -        return err
    -      }
    -    }))
    -    // Return the first non error if it is found
    -    const result = results.find((r) => !(r instanceof Error))
    -    if (result) {
    -      return result
    -    }
    -
    -    // Throw the No matching content found error
    -    const enoentError = results.find((r) => r.code === 'ENOENT')
    -    if (enoentError) {
    -      throw enoentError
    -    }
    -
    -    // Throw generic error
    -    throw results.find((r) => r instanceof Error)
    -  }
    -}
    -
    -function sizeError (expected, found) {
    -  /* eslint-disable-next-line max-len */
    -  const err = new Error(`Bad data size: expected inserted data to be ${expected} bytes, but got ${found} instead`)
    -  err.expected = expected
    -  err.found = found
    -  err.code = 'EBADSIZE'
    -  return err
    -}
    -
    -function integrityError (sri, path) {
    -  const err = new Error(`Integrity verification failed for ${sri} (${path})`)
    -  err.code = 'EINTEGRITY'
    -  err.sri = sri
    -  err.path = path
    -  return err
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/rm.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/rm.js
    deleted file mode 100644
    index ce58d679e4cb25..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/rm.js
    +++ /dev/null
    @@ -1,18 +0,0 @@
    -'use strict'
    -
    -const fs = require('fs/promises')
    -const contentPath = require('./path')
    -const { hasContent } = require('./read')
    -
    -module.exports = rm
    -
    -async function rm (cache, integrity) {
    -  const content = await hasContent(cache, integrity)
    -  // ~pretty~ sure we can't end up with a content lacking sri, but be safe
    -  if (content && content.sri) {
    -    await fs.rm(contentPath(cache, content.sri), { recursive: true, force: true })
    -    return true
    -  } else {
    -    return false
    -  }
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/write.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/write.js
    deleted file mode 100644
    index 71461465812878..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/write.js
    +++ /dev/null
    @@ -1,205 +0,0 @@
    -'use strict'
    -
    -const events = require('events')
    -
    -const contentPath = require('./path')
    -const fs = require('fs/promises')
    -const { moveFile } = require('@npmcli/fs')
    -const { Minipass } = require('minipass')
    -const Pipeline = require('minipass-pipeline')
    -const Flush = require('minipass-flush')
    -const path = require('path')
    -const ssri = require('ssri')
    -const uniqueFilename = require('unique-filename')
    -const fsm = require('fs-minipass')
    -
    -module.exports = write
    -
    -// Cache of move operations in process so we don't duplicate
    -const moveOperations = new Map()
    -
    -async function write (cache, data, opts = {}) {
    -  const { algorithms, size, integrity } = opts
    -
    -  if (typeof size === 'number' && data.length !== size) {
    -    throw sizeError(size, data.length)
    -  }
    -
    -  const sri = ssri.fromData(data, algorithms ? { algorithms } : {})
    -  if (integrity && !ssri.checkData(data, integrity, opts)) {
    -    throw checksumError(integrity, sri)
    -  }
    -
    -  for (const algo in sri) {
    -    const tmp = await makeTmp(cache, opts)
    -    const hash = sri[algo].toString()
    -    try {
    -      await fs.writeFile(tmp.target, data, { flag: 'wx' })
    -      await moveToDestination(tmp, cache, hash, opts)
    -    } finally {
    -      if (!tmp.moved) {
    -        await fs.rm(tmp.target, { recursive: true, force: true })
    -      }
    -    }
    -  }
    -  return { integrity: sri, size: data.length }
    -}
    -
    -module.exports.stream = writeStream
    -
    -// writes proxied to the 'inputStream' that is passed to the Promise
    -// 'end' is deferred until content is handled.
    -class CacacheWriteStream extends Flush {
    -  constructor (cache, opts) {
    -    super()
    -    this.opts = opts
    -    this.cache = cache
    -    this.inputStream = new Minipass()
    -    this.inputStream.on('error', er => this.emit('error', er))
    -    this.inputStream.on('drain', () => this.emit('drain'))
    -    this.handleContentP = null
    -  }
    -
    -  write (chunk, encoding, cb) {
    -    if (!this.handleContentP) {
    -      this.handleContentP = handleContent(
    -        this.inputStream,
    -        this.cache,
    -        this.opts
    -      )
    -    }
    -    return this.inputStream.write(chunk, encoding, cb)
    -  }
    -
    -  flush (cb) {
    -    this.inputStream.end(() => {
    -      if (!this.handleContentP) {
    -        const e = new Error('Cache input stream was empty')
    -        e.code = 'ENODATA'
    -        // empty streams are probably emitting end right away.
    -        // defer this one tick by rejecting a promise on it.
    -        return Promise.reject(e).catch(cb)
    -      }
    -      // eslint-disable-next-line promise/catch-or-return
    -      this.handleContentP.then(
    -        (res) => {
    -          res.integrity && this.emit('integrity', res.integrity)
    -          // eslint-disable-next-line promise/always-return
    -          res.size !== null && this.emit('size', res.size)
    -          cb()
    -        },
    -        (er) => cb(er)
    -      )
    -    })
    -  }
    -}
    -
    -function writeStream (cache, opts = {}) {
    -  return new CacacheWriteStream(cache, opts)
    -}
    -
    -async function handleContent (inputStream, cache, opts) {
    -  const tmp = await makeTmp(cache, opts)
    -  try {
    -    const res = await pipeToTmp(inputStream, cache, tmp.target, opts)
    -    await moveToDestination(
    -      tmp,
    -      cache,
    -      res.integrity,
    -      opts
    -    )
    -    return res
    -  } finally {
    -    if (!tmp.moved) {
    -      await fs.rm(tmp.target, { recursive: true, force: true })
    -    }
    -  }
    -}
    -
    -async function pipeToTmp (inputStream, cache, tmpTarget, opts) {
    -  const outStream = new fsm.WriteStream(tmpTarget, {
    -    flags: 'wx',
    -  })
    -
    -  if (opts.integrityEmitter) {
    -    // we need to create these all simultaneously since they can fire in any order
    -    const [integrity, size] = await Promise.all([
    -      events.once(opts.integrityEmitter, 'integrity').then(res => res[0]),
    -      events.once(opts.integrityEmitter, 'size').then(res => res[0]),
    -      new Pipeline(inputStream, outStream).promise(),
    -    ])
    -    return { integrity, size }
    -  }
    -
    -  let integrity
    -  let size
    -  const hashStream = ssri.integrityStream({
    -    integrity: opts.integrity,
    -    algorithms: opts.algorithms,
    -    size: opts.size,
    -  })
    -  hashStream.on('integrity', i => {
    -    integrity = i
    -  })
    -  hashStream.on('size', s => {
    -    size = s
    -  })
    -
    -  const pipeline = new Pipeline(inputStream, hashStream, outStream)
    -  await pipeline.promise()
    -  return { integrity, size }
    -}
    -
    -async function makeTmp (cache, opts) {
    -  const tmpTarget = uniqueFilename(path.join(cache, 'tmp'), opts.tmpPrefix)
    -  await fs.mkdir(path.dirname(tmpTarget), { recursive: true })
    -  return {
    -    target: tmpTarget,
    -    moved: false,
    -  }
    -}
    -
    -async function moveToDestination (tmp, cache, sri, opts) {
    -  const destination = contentPath(cache, sri)
    -  const destDir = path.dirname(destination)
    -  if (moveOperations.has(destination)) {
    -    return moveOperations.get(destination)
    -  }
    -  moveOperations.set(
    -    destination,
    -    fs.mkdir(destDir, { recursive: true })
    -      .then(async () => {
    -        await moveFile(tmp.target, destination, { overwrite: false })
    -        tmp.moved = true
    -        return tmp.moved
    -      })
    -      .catch(err => {
    -        if (!err.message.startsWith('The destination file exists')) {
    -          throw Object.assign(err, { code: 'EEXIST' })
    -        }
    -      }).finally(() => {
    -        moveOperations.delete(destination)
    -      })
    -
    -  )
    -  return moveOperations.get(destination)
    -}
    -
    -function sizeError (expected, found) {
    -  /* eslint-disable-next-line max-len */
    -  const err = new Error(`Bad data size: expected inserted data to be ${expected} bytes, but got ${found} instead`)
    -  err.expected = expected
    -  err.found = found
    -  err.code = 'EBADSIZE'
    -  return err
    -}
    -
    -function checksumError (expected, found) {
    -  const err = new Error(`Integrity check failed:
    -  Wanted: ${expected}
    -   Found: ${found}`)
    -  err.code = 'EINTEGRITY'
    -  err.expected = expected
    -  err.found = found
    -  return err
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/entry-index.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/entry-index.js
    deleted file mode 100644
    index 722a37af5ce157..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/entry-index.js
    +++ /dev/null
    @@ -1,330 +0,0 @@
    -'use strict'
    -
    -const crypto = require('crypto')
    -const {
    -  appendFile,
    -  mkdir,
    -  readFile,
    -  readdir,
    -  rm,
    -  writeFile,
    -} = require('fs/promises')
    -const { Minipass } = require('minipass')
    -const path = require('path')
    -const ssri = require('ssri')
    -const uniqueFilename = require('unique-filename')
    -
    -const contentPath = require('./content/path')
    -const hashToSegments = require('./util/hash-to-segments')
    -const indexV = require('../package.json')['cache-version'].index
    -const { moveFile } = require('@npmcli/fs')
    -
    -module.exports.NotFoundError = class NotFoundError extends Error {
    -  constructor (cache, key) {
    -    super(`No cache entry for ${key} found in ${cache}`)
    -    this.code = 'ENOENT'
    -    this.cache = cache
    -    this.key = key
    -  }
    -}
    -
    -module.exports.compact = compact
    -
    -async function compact (cache, key, matchFn, opts = {}) {
    -  const bucket = bucketPath(cache, key)
    -  const entries = await bucketEntries(bucket)
    -  const newEntries = []
    -  // we loop backwards because the bottom-most result is the newest
    -  // since we add new entries with appendFile
    -  for (let i = entries.length - 1; i >= 0; --i) {
    -    const entry = entries[i]
    -    // a null integrity could mean either a delete was appended
    -    // or the user has simply stored an index that does not map
    -    // to any content. we determine if the user wants to keep the
    -    // null integrity based on the validateEntry function passed in options.
    -    // if the integrity is null and no validateEntry is provided, we break
    -    // as we consider the null integrity to be a deletion of everything
    -    // that came before it.
    -    if (entry.integrity === null && !opts.validateEntry) {
    -      break
    -    }
    -
    -    // if this entry is valid, and it is either the first entry or
    -    // the newEntries array doesn't already include an entry that
    -    // matches this one based on the provided matchFn, then we add
    -    // it to the beginning of our list
    -    if ((!opts.validateEntry || opts.validateEntry(entry) === true) &&
    -      (newEntries.length === 0 ||
    -        !newEntries.find((oldEntry) => matchFn(oldEntry, entry)))) {
    -      newEntries.unshift(entry)
    -    }
    -  }
    -
    -  const newIndex = '\n' + newEntries.map((entry) => {
    -    const stringified = JSON.stringify(entry)
    -    const hash = hashEntry(stringified)
    -    return `${hash}\t${stringified}`
    -  }).join('\n')
    -
    -  const setup = async () => {
    -    const target = uniqueFilename(path.join(cache, 'tmp'), opts.tmpPrefix)
    -    await mkdir(path.dirname(target), { recursive: true })
    -    return {
    -      target,
    -      moved: false,
    -    }
    -  }
    -
    -  const teardown = async (tmp) => {
    -    if (!tmp.moved) {
    -      return rm(tmp.target, { recursive: true, force: true })
    -    }
    -  }
    -
    -  const write = async (tmp) => {
    -    await writeFile(tmp.target, newIndex, { flag: 'wx' })
    -    await mkdir(path.dirname(bucket), { recursive: true })
    -    // we use @npmcli/move-file directly here because we
    -    // want to overwrite the existing file
    -    await moveFile(tmp.target, bucket)
    -    tmp.moved = true
    -  }
    -
    -  // write the file atomically
    -  const tmp = await setup()
    -  try {
    -    await write(tmp)
    -  } finally {
    -    await teardown(tmp)
    -  }
    -
    -  // we reverse the list we generated such that the newest
    -  // entries come first in order to make looping through them easier
    -  // the true passed to formatEntry tells it to keep null
    -  // integrity values, if they made it this far it's because
    -  // validateEntry returned true, and as such we should return it
    -  return newEntries.reverse().map((entry) => formatEntry(cache, entry, true))
    -}
    -
    -module.exports.insert = insert
    -
    -async function insert (cache, key, integrity, opts = {}) {
    -  const { metadata, size, time } = opts
    -  const bucket = bucketPath(cache, key)
    -  const entry = {
    -    key,
    -    integrity: integrity && ssri.stringify(integrity),
    -    time: time || Date.now(),
    -    size,
    -    metadata,
    -  }
    -  try {
    -    await mkdir(path.dirname(bucket), { recursive: true })
    -    const stringified = JSON.stringify(entry)
    -    // NOTE - Cleverness ahoy!
    -    //
    -    // This works because it's tremendously unlikely for an entry to corrupt
    -    // another while still preserving the string length of the JSON in
    -    // question. So, we just slap the length in there and verify it on read.
    -    //
    -    // Thanks to @isaacs for the whiteboarding session that ended up with
    -    // this.
    -    await appendFile(bucket, `\n${hashEntry(stringified)}\t${stringified}`)
    -  } catch (err) {
    -    if (err.code === 'ENOENT') {
    -      return undefined
    -    }
    -
    -    throw err
    -  }
    -  return formatEntry(cache, entry)
    -}
    -
    -module.exports.find = find
    -
    -async function find (cache, key) {
    -  const bucket = bucketPath(cache, key)
    -  try {
    -    const entries = await bucketEntries(bucket)
    -    return entries.reduce((latest, next) => {
    -      if (next && next.key === key) {
    -        return formatEntry(cache, next)
    -      } else {
    -        return latest
    -      }
    -    }, null)
    -  } catch (err) {
    -    if (err.code === 'ENOENT') {
    -      return null
    -    } else {
    -      throw err
    -    }
    -  }
    -}
    -
    -module.exports.delete = del
    -
    -function del (cache, key, opts = {}) {
    -  if (!opts.removeFully) {
    -    return insert(cache, key, null, opts)
    -  }
    -
    -  const bucket = bucketPath(cache, key)
    -  return rm(bucket, { recursive: true, force: true })
    -}
    -
    -module.exports.lsStream = lsStream
    -
    -function lsStream (cache) {
    -  const indexDir = bucketDir(cache)
    -  const stream = new Minipass({ objectMode: true })
    -
    -  // Set all this up to run on the stream and then just return the stream
    -  Promise.resolve().then(async () => {
    -    const buckets = await readdirOrEmpty(indexDir)
    -    await Promise.all(buckets.map(async (bucket) => {
    -      const bucketPath = path.join(indexDir, bucket)
    -      const subbuckets = await readdirOrEmpty(bucketPath)
    -      await Promise.all(subbuckets.map(async (subbucket) => {
    -        const subbucketPath = path.join(bucketPath, subbucket)
    -
    -        // "/cachename//./*"
    -        const subbucketEntries = await readdirOrEmpty(subbucketPath)
    -        await Promise.all(subbucketEntries.map(async (entry) => {
    -          const entryPath = path.join(subbucketPath, entry)
    -          try {
    -            const entries = await bucketEntries(entryPath)
    -            // using a Map here prevents duplicate keys from showing up
    -            // twice, I guess?
    -            const reduced = entries.reduce((acc, entry) => {
    -              acc.set(entry.key, entry)
    -              return acc
    -            }, new Map())
    -            // reduced is a map of key => entry
    -            for (const entry of reduced.values()) {
    -              const formatted = formatEntry(cache, entry)
    -              if (formatted) {
    -                stream.write(formatted)
    -              }
    -            }
    -          } catch (err) {
    -            if (err.code === 'ENOENT') {
    -              return undefined
    -            }
    -            throw err
    -          }
    -        }))
    -      }))
    -    }))
    -    stream.end()
    -    return stream
    -  }).catch(err => stream.emit('error', err))
    -
    -  return stream
    -}
    -
    -module.exports.ls = ls
    -
    -async function ls (cache) {
    -  const entries = await lsStream(cache).collect()
    -  return entries.reduce((acc, xs) => {
    -    acc[xs.key] = xs
    -    return acc
    -  }, {})
    -}
    -
    -module.exports.bucketEntries = bucketEntries
    -
    -async function bucketEntries (bucket, filter) {
    -  const data = await readFile(bucket, 'utf8')
    -  return _bucketEntries(data, filter)
    -}
    -
    -function _bucketEntries (data, filter) {
    -  const entries = []
    -  data.split('\n').forEach((entry) => {
    -    if (!entry) {
    -      return
    -    }
    -
    -    const pieces = entry.split('\t')
    -    if (!pieces[1] || hashEntry(pieces[1]) !== pieces[0]) {
    -      // Hash is no good! Corruption or malice? Doesn't matter!
    -      // EJECT EJECT
    -      return
    -    }
    -    let obj
    -    try {
    -      obj = JSON.parse(pieces[1])
    -    } catch (_) {
    -      // eslint-ignore-next-line no-empty-block
    -    }
    -    // coverage disabled here, no need to test with an entry that parses to something falsey
    -    // istanbul ignore else
    -    if (obj) {
    -      entries.push(obj)
    -    }
    -  })
    -  return entries
    -}
    -
    -module.exports.bucketDir = bucketDir
    -
    -function bucketDir (cache) {
    -  return path.join(cache, `index-v${indexV}`)
    -}
    -
    -module.exports.bucketPath = bucketPath
    -
    -function bucketPath (cache, key) {
    -  const hashed = hashKey(key)
    -  return path.join.apply(
    -    path,
    -    [bucketDir(cache)].concat(hashToSegments(hashed))
    -  )
    -}
    -
    -module.exports.hashKey = hashKey
    -
    -function hashKey (key) {
    -  return hash(key, 'sha256')
    -}
    -
    -module.exports.hashEntry = hashEntry
    -
    -function hashEntry (str) {
    -  return hash(str, 'sha1')
    -}
    -
    -function hash (str, digest) {
    -  return crypto
    -    .createHash(digest)
    -    .update(str)
    -    .digest('hex')
    -}
    -
    -function formatEntry (cache, entry, keepAll) {
    -  // Treat null digests as deletions. They'll shadow any previous entries.
    -  if (!entry.integrity && !keepAll) {
    -    return null
    -  }
    -
    -  return {
    -    key: entry.key,
    -    integrity: entry.integrity,
    -    path: entry.integrity ? contentPath(cache, entry.integrity) : undefined,
    -    size: entry.size,
    -    time: entry.time,
    -    metadata: entry.metadata,
    -  }
    -}
    -
    -function readdirOrEmpty (dir) {
    -  return readdir(dir).catch((err) => {
    -    if (err.code === 'ENOENT' || err.code === 'ENOTDIR') {
    -      return []
    -    }
    -
    -    throw err
    -  })
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/get.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/get.js
    deleted file mode 100644
    index 80ec206c7ecaaa..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/get.js
    +++ /dev/null
    @@ -1,170 +0,0 @@
    -'use strict'
    -
    -const Collect = require('minipass-collect')
    -const { Minipass } = require('minipass')
    -const Pipeline = require('minipass-pipeline')
    -
    -const index = require('./entry-index')
    -const memo = require('./memoization')
    -const read = require('./content/read')
    -
    -async function getData (cache, key, opts = {}) {
    -  const { integrity, memoize, size } = opts
    -  const memoized = memo.get(cache, key, opts)
    -  if (memoized && memoize !== false) {
    -    return {
    -      metadata: memoized.entry.metadata,
    -      data: memoized.data,
    -      integrity: memoized.entry.integrity,
    -      size: memoized.entry.size,
    -    }
    -  }
    -
    -  const entry = await index.find(cache, key, opts)
    -  if (!entry) {
    -    throw new index.NotFoundError(cache, key)
    -  }
    -  const data = await read(cache, entry.integrity, { integrity, size })
    -  if (memoize) {
    -    memo.put(cache, entry, data, opts)
    -  }
    -
    -  return {
    -    data,
    -    metadata: entry.metadata,
    -    size: entry.size,
    -    integrity: entry.integrity,
    -  }
    -}
    -module.exports = getData
    -
    -async function getDataByDigest (cache, key, opts = {}) {
    -  const { integrity, memoize, size } = opts
    -  const memoized = memo.get.byDigest(cache, key, opts)
    -  if (memoized && memoize !== false) {
    -    return memoized
    -  }
    -
    -  const res = await read(cache, key, { integrity, size })
    -  if (memoize) {
    -    memo.put.byDigest(cache, key, res, opts)
    -  }
    -  return res
    -}
    -module.exports.byDigest = getDataByDigest
    -
    -const getMemoizedStream = (memoized) => {
    -  const stream = new Minipass()
    -  stream.on('newListener', function (ev, cb) {
    -    ev === 'metadata' && cb(memoized.entry.metadata)
    -    ev === 'integrity' && cb(memoized.entry.integrity)
    -    ev === 'size' && cb(memoized.entry.size)
    -  })
    -  stream.end(memoized.data)
    -  return stream
    -}
    -
    -function getStream (cache, key, opts = {}) {
    -  const { memoize, size } = opts
    -  const memoized = memo.get(cache, key, opts)
    -  if (memoized && memoize !== false) {
    -    return getMemoizedStream(memoized)
    -  }
    -
    -  const stream = new Pipeline()
    -  // Set all this up to run on the stream and then just return the stream
    -  Promise.resolve().then(async () => {
    -    const entry = await index.find(cache, key)
    -    if (!entry) {
    -      throw new index.NotFoundError(cache, key)
    -    }
    -
    -    stream.emit('metadata', entry.metadata)
    -    stream.emit('integrity', entry.integrity)
    -    stream.emit('size', entry.size)
    -    stream.on('newListener', function (ev, cb) {
    -      ev === 'metadata' && cb(entry.metadata)
    -      ev === 'integrity' && cb(entry.integrity)
    -      ev === 'size' && cb(entry.size)
    -    })
    -
    -    const src = read.readStream(
    -      cache,
    -      entry.integrity,
    -      { ...opts, size: typeof size !== 'number' ? entry.size : size }
    -    )
    -
    -    if (memoize) {
    -      const memoStream = new Collect.PassThrough()
    -      memoStream.on('collect', data => memo.put(cache, entry, data, opts))
    -      stream.unshift(memoStream)
    -    }
    -    stream.unshift(src)
    -    return stream
    -  }).catch((err) => stream.emit('error', err))
    -
    -  return stream
    -}
    -
    -module.exports.stream = getStream
    -
    -function getStreamDigest (cache, integrity, opts = {}) {
    -  const { memoize } = opts
    -  const memoized = memo.get.byDigest(cache, integrity, opts)
    -  if (memoized && memoize !== false) {
    -    const stream = new Minipass()
    -    stream.end(memoized)
    -    return stream
    -  } else {
    -    const stream = read.readStream(cache, integrity, opts)
    -    if (!memoize) {
    -      return stream
    -    }
    -
    -    const memoStream = new Collect.PassThrough()
    -    memoStream.on('collect', data => memo.put.byDigest(
    -      cache,
    -      integrity,
    -      data,
    -      opts
    -    ))
    -    return new Pipeline(stream, memoStream)
    -  }
    -}
    -
    -module.exports.stream.byDigest = getStreamDigest
    -
    -function info (cache, key, opts = {}) {
    -  const { memoize } = opts
    -  const memoized = memo.get(cache, key, opts)
    -  if (memoized && memoize !== false) {
    -    return Promise.resolve(memoized.entry)
    -  } else {
    -    return index.find(cache, key)
    -  }
    -}
    -module.exports.info = info
    -
    -async function copy (cache, key, dest, opts = {}) {
    -  const entry = await index.find(cache, key, opts)
    -  if (!entry) {
    -    throw new index.NotFoundError(cache, key)
    -  }
    -  await read.copy(cache, entry.integrity, dest, opts)
    -  return {
    -    metadata: entry.metadata,
    -    size: entry.size,
    -    integrity: entry.integrity,
    -  }
    -}
    -
    -module.exports.copy = copy
    -
    -async function copyByDigest (cache, key, dest, opts = {}) {
    -  await read.copy(cache, key, dest, opts)
    -  return key
    -}
    -
    -module.exports.copy.byDigest = copyByDigest
    -
    -module.exports.hasContent = read.hasContent
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/index.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/index.js
    deleted file mode 100644
    index c9b0da5f3a271b..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/index.js
    +++ /dev/null
    @@ -1,42 +0,0 @@
    -'use strict'
    -
    -const get = require('./get.js')
    -const put = require('./put.js')
    -const rm = require('./rm.js')
    -const verify = require('./verify.js')
    -const { clearMemoized } = require('./memoization.js')
    -const tmp = require('./util/tmp.js')
    -const index = require('./entry-index.js')
    -
    -module.exports.index = {}
    -module.exports.index.compact = index.compact
    -module.exports.index.insert = index.insert
    -
    -module.exports.ls = index.ls
    -module.exports.ls.stream = index.lsStream
    -
    -module.exports.get = get
    -module.exports.get.byDigest = get.byDigest
    -module.exports.get.stream = get.stream
    -module.exports.get.stream.byDigest = get.stream.byDigest
    -module.exports.get.copy = get.copy
    -module.exports.get.copy.byDigest = get.copy.byDigest
    -module.exports.get.info = get.info
    -module.exports.get.hasContent = get.hasContent
    -
    -module.exports.put = put
    -module.exports.put.stream = put.stream
    -
    -module.exports.rm = rm.entry
    -module.exports.rm.all = rm.all
    -module.exports.rm.entry = module.exports.rm
    -module.exports.rm.content = rm.content
    -
    -module.exports.clearMemoized = clearMemoized
    -
    -module.exports.tmp = {}
    -module.exports.tmp.mkdir = tmp.mkdir
    -module.exports.tmp.withTmp = tmp.withTmp
    -
    -module.exports.verify = verify
    -module.exports.verify.lastRun = verify.lastRun
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/memoization.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/memoization.js
    deleted file mode 100644
    index 0ff604a479c9c1..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/memoization.js
    +++ /dev/null
    @@ -1,72 +0,0 @@
    -'use strict'
    -
    -const LRU = require('lru-cache')
    -
    -const MEMOIZED = new LRU({
    -  max: 500,
    -  maxSize: 50 * 1024 * 1024, // 50MB
    -  ttl: 3 * 60 * 1000, // 3 minutes
    -  sizeCalculation: (entry, key) => key.startsWith('key:') ? entry.data.length : entry.length,
    -})
    -
    -module.exports.clearMemoized = clearMemoized
    -
    -function clearMemoized () {
    -  const old = {}
    -  MEMOIZED.forEach((v, k) => {
    -    old[k] = v
    -  })
    -  MEMOIZED.clear()
    -  return old
    -}
    -
    -module.exports.put = put
    -
    -function put (cache, entry, data, opts) {
    -  pickMem(opts).set(`key:${cache}:${entry.key}`, { entry, data })
    -  putDigest(cache, entry.integrity, data, opts)
    -}
    -
    -module.exports.put.byDigest = putDigest
    -
    -function putDigest (cache, integrity, data, opts) {
    -  pickMem(opts).set(`digest:${cache}:${integrity}`, data)
    -}
    -
    -module.exports.get = get
    -
    -function get (cache, key, opts) {
    -  return pickMem(opts).get(`key:${cache}:${key}`)
    -}
    -
    -module.exports.get.byDigest = getDigest
    -
    -function getDigest (cache, integrity, opts) {
    -  return pickMem(opts).get(`digest:${cache}:${integrity}`)
    -}
    -
    -class ObjProxy {
    -  constructor (obj) {
    -    this.obj = obj
    -  }
    -
    -  get (key) {
    -    return this.obj[key]
    -  }
    -
    -  set (key, val) {
    -    this.obj[key] = val
    -  }
    -}
    -
    -function pickMem (opts) {
    -  if (!opts || !opts.memoize) {
    -    return MEMOIZED
    -  } else if (opts.memoize.get && opts.memoize.set) {
    -    return opts.memoize
    -  } else if (typeof opts.memoize === 'object') {
    -    return new ObjProxy(opts.memoize)
    -  } else {
    -    return MEMOIZED
    -  }
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/put.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/put.js
    deleted file mode 100644
    index 9fc932d5f6dec5..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/put.js
    +++ /dev/null
    @@ -1,80 +0,0 @@
    -'use strict'
    -
    -const index = require('./entry-index')
    -const memo = require('./memoization')
    -const write = require('./content/write')
    -const Flush = require('minipass-flush')
    -const { PassThrough } = require('minipass-collect')
    -const Pipeline = require('minipass-pipeline')
    -
    -const putOpts = (opts) => ({
    -  algorithms: ['sha512'],
    -  ...opts,
    -})
    -
    -module.exports = putData
    -
    -async function putData (cache, key, data, opts = {}) {
    -  const { memoize } = opts
    -  opts = putOpts(opts)
    -  const res = await write(cache, data, opts)
    -  const entry = await index.insert(cache, key, res.integrity, { ...opts, size: res.size })
    -  if (memoize) {
    -    memo.put(cache, entry, data, opts)
    -  }
    -
    -  return res.integrity
    -}
    -
    -module.exports.stream = putStream
    -
    -function putStream (cache, key, opts = {}) {
    -  const { memoize } = opts
    -  opts = putOpts(opts)
    -  let integrity
    -  let size
    -  let error
    -
    -  let memoData
    -  const pipeline = new Pipeline()
    -  // first item in the pipeline is the memoizer, because we need
    -  // that to end first and get the collected data.
    -  if (memoize) {
    -    const memoizer = new PassThrough().on('collect', data => {
    -      memoData = data
    -    })
    -    pipeline.push(memoizer)
    -  }
    -
    -  // contentStream is a write-only, not a passthrough
    -  // no data comes out of it.
    -  const contentStream = write.stream(cache, opts)
    -    .on('integrity', (int) => {
    -      integrity = int
    -    })
    -    .on('size', (s) => {
    -      size = s
    -    })
    -    .on('error', (err) => {
    -      error = err
    -    })
    -
    -  pipeline.push(contentStream)
    -
    -  // last but not least, we write the index and emit hash and size,
    -  // and memoize if we're doing that
    -  pipeline.push(new Flush({
    -    async flush () {
    -      if (!error) {
    -        const entry = await index.insert(cache, key, integrity, { ...opts, size })
    -        if (memoize && memoData) {
    -          memo.put(cache, entry, memoData, opts)
    -        }
    -        pipeline.emit('integrity', integrity)
    -        pipeline.emit('size', size)
    -      }
    -    },
    -  }))
    -
    -  return pipeline
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/rm.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/rm.js
    deleted file mode 100644
    index a94760c7cf2430..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/rm.js
    +++ /dev/null
    @@ -1,31 +0,0 @@
    -'use strict'
    -
    -const { rm } = require('fs/promises')
    -const glob = require('./util/glob.js')
    -const index = require('./entry-index')
    -const memo = require('./memoization')
    -const path = require('path')
    -const rmContent = require('./content/rm')
    -
    -module.exports = entry
    -module.exports.entry = entry
    -
    -function entry (cache, key, opts) {
    -  memo.clearMemoized()
    -  return index.delete(cache, key, opts)
    -}
    -
    -module.exports.content = content
    -
    -function content (cache, integrity) {
    -  memo.clearMemoized()
    -  return rmContent(cache, integrity)
    -}
    -
    -module.exports.all = all
    -
    -async function all (cache) {
    -  memo.clearMemoized()
    -  const paths = await glob(path.join(cache, '*(content-*|index-*)'), { silent: true, nosort: true })
    -  return Promise.all(paths.map((p) => rm(p, { recursive: true, force: true })))
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/glob.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/glob.js
    deleted file mode 100644
    index 8500c1c16a429f..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/glob.js
    +++ /dev/null
    @@ -1,7 +0,0 @@
    -'use strict'
    -
    -const { glob } = require('glob')
    -const path = require('path')
    -
    -const globify = (pattern) => pattern.split(path.win32.sep).join(path.posix.sep)
    -module.exports = (path, options) => glob(globify(path), options)
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/hash-to-segments.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/hash-to-segments.js
    deleted file mode 100644
    index 445599b5038088..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/hash-to-segments.js
    +++ /dev/null
    @@ -1,7 +0,0 @@
    -'use strict'
    -
    -module.exports = hashToSegments
    -
    -function hashToSegments (hash) {
    -  return [hash.slice(0, 2), hash.slice(2, 4), hash.slice(4)]
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/tmp.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/tmp.js
    deleted file mode 100644
    index 0bf5302136ebeb..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/tmp.js
    +++ /dev/null
    @@ -1,26 +0,0 @@
    -'use strict'
    -
    -const { withTempDir } = require('@npmcli/fs')
    -const fs = require('fs/promises')
    -const path = require('path')
    -
    -module.exports.mkdir = mktmpdir
    -
    -async function mktmpdir (cache, opts = {}) {
    -  const { tmpPrefix } = opts
    -  const tmpDir = path.join(cache, 'tmp')
    -  await fs.mkdir(tmpDir, { recursive: true, owner: 'inherit' })
    -  // do not use path.join(), it drops the trailing / if tmpPrefix is unset
    -  const target = `${tmpDir}${path.sep}${tmpPrefix || ''}`
    -  return fs.mkdtemp(target, { owner: 'inherit' })
    -}
    -
    -module.exports.withTmp = withTmp
    -
    -function withTmp (cache, opts, cb) {
    -  if (!cb) {
    -    cb = opts
    -    opts = {}
    -  }
    -  return withTempDir(path.join(cache, 'tmp'), cb, opts)
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/verify.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/verify.js
    deleted file mode 100644
    index 62e85c946490fc..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/verify.js
    +++ /dev/null
    @@ -1,257 +0,0 @@
    -'use strict'
    -
    -const {
    -  mkdir,
    -  readFile,
    -  rm,
    -  stat,
    -  truncate,
    -  writeFile,
    -} = require('fs/promises')
    -const pMap = require('p-map')
    -const contentPath = require('./content/path')
    -const fsm = require('fs-minipass')
    -const glob = require('./util/glob.js')
    -const index = require('./entry-index')
    -const path = require('path')
    -const ssri = require('ssri')
    -
    -const hasOwnProperty = (obj, key) =>
    -  Object.prototype.hasOwnProperty.call(obj, key)
    -
    -const verifyOpts = (opts) => ({
    -  concurrency: 20,
    -  log: { silly () {} },
    -  ...opts,
    -})
    -
    -module.exports = verify
    -
    -async function verify (cache, opts) {
    -  opts = verifyOpts(opts)
    -  opts.log.silly('verify', 'verifying cache at', cache)
    -
    -  const steps = [
    -    markStartTime,
    -    fixPerms,
    -    garbageCollect,
    -    rebuildIndex,
    -    cleanTmp,
    -    writeVerifile,
    -    markEndTime,
    -  ]
    -
    -  const stats = {}
    -  for (const step of steps) {
    -    const label = step.name
    -    const start = new Date()
    -    const s = await step(cache, opts)
    -    if (s) {
    -      Object.keys(s).forEach((k) => {
    -        stats[k] = s[k]
    -      })
    -    }
    -    const end = new Date()
    -    if (!stats.runTime) {
    -      stats.runTime = {}
    -    }
    -    stats.runTime[label] = end - start
    -  }
    -  stats.runTime.total = stats.endTime - stats.startTime
    -  opts.log.silly(
    -    'verify',
    -    'verification finished for',
    -    cache,
    -    'in',
    -    `${stats.runTime.total}ms`
    -  )
    -  return stats
    -}
    -
    -async function markStartTime (cache, opts) {
    -  return { startTime: new Date() }
    -}
    -
    -async function markEndTime (cache, opts) {
    -  return { endTime: new Date() }
    -}
    -
    -async function fixPerms (cache, opts) {
    -  opts.log.silly('verify', 'fixing cache permissions')
    -  await mkdir(cache, { recursive: true })
    -  return null
    -}
    -
    -// Implements a naive mark-and-sweep tracing garbage collector.
    -//
    -// The algorithm is basically as follows:
    -// 1. Read (and filter) all index entries ("pointers")
    -// 2. Mark each integrity value as "live"
    -// 3. Read entire filesystem tree in `content-vX/` dir
    -// 4. If content is live, verify its checksum and delete it if it fails
    -// 5. If content is not marked as live, rm it.
    -//
    -async function garbageCollect (cache, opts) {
    -  opts.log.silly('verify', 'garbage collecting content')
    -  const indexStream = index.lsStream(cache)
    -  const liveContent = new Set()
    -  indexStream.on('data', (entry) => {
    -    if (opts.filter && !opts.filter(entry)) {
    -      return
    -    }
    -
    -    // integrity is stringified, re-parse it so we can get each hash
    -    const integrity = ssri.parse(entry.integrity)
    -    for (const algo in integrity) {
    -      liveContent.add(integrity[algo].toString())
    -    }
    -  })
    -  await new Promise((resolve, reject) => {
    -    indexStream.on('end', resolve).on('error', reject)
    -  })
    -  const contentDir = contentPath.contentDir(cache)
    -  const files = await glob(path.join(contentDir, '**'), {
    -    follow: false,
    -    nodir: true,
    -    nosort: true,
    -  })
    -  const stats = {
    -    verifiedContent: 0,
    -    reclaimedCount: 0,
    -    reclaimedSize: 0,
    -    badContentCount: 0,
    -    keptSize: 0,
    -  }
    -  await pMap(
    -    files,
    -    async (f) => {
    -      const split = f.split(/[/\\]/)
    -      const digest = split.slice(split.length - 3).join('')
    -      const algo = split[split.length - 4]
    -      const integrity = ssri.fromHex(digest, algo)
    -      if (liveContent.has(integrity.toString())) {
    -        const info = await verifyContent(f, integrity)
    -        if (!info.valid) {
    -          stats.reclaimedCount++
    -          stats.badContentCount++
    -          stats.reclaimedSize += info.size
    -        } else {
    -          stats.verifiedContent++
    -          stats.keptSize += info.size
    -        }
    -      } else {
    -        // No entries refer to this content. We can delete.
    -        stats.reclaimedCount++
    -        const s = await stat(f)
    -        await rm(f, { recursive: true, force: true })
    -        stats.reclaimedSize += s.size
    -      }
    -      return stats
    -    },
    -    { concurrency: opts.concurrency }
    -  )
    -  return stats
    -}
    -
    -async function verifyContent (filepath, sri) {
    -  const contentInfo = {}
    -  try {
    -    const { size } = await stat(filepath)
    -    contentInfo.size = size
    -    contentInfo.valid = true
    -    await ssri.checkStream(new fsm.ReadStream(filepath), sri)
    -  } catch (err) {
    -    if (err.code === 'ENOENT') {
    -      return { size: 0, valid: false }
    -    }
    -    if (err.code !== 'EINTEGRITY') {
    -      throw err
    -    }
    -
    -    await rm(filepath, { recursive: true, force: true })
    -    contentInfo.valid = false
    -  }
    -  return contentInfo
    -}
    -
    -async function rebuildIndex (cache, opts) {
    -  opts.log.silly('verify', 'rebuilding index')
    -  const entries = await index.ls(cache)
    -  const stats = {
    -    missingContent: 0,
    -    rejectedEntries: 0,
    -    totalEntries: 0,
    -  }
    -  const buckets = {}
    -  for (const k in entries) {
    -    /* istanbul ignore else */
    -    if (hasOwnProperty(entries, k)) {
    -      const hashed = index.hashKey(k)
    -      const entry = entries[k]
    -      const excluded = opts.filter && !opts.filter(entry)
    -      excluded && stats.rejectedEntries++
    -      if (buckets[hashed] && !excluded) {
    -        buckets[hashed].push(entry)
    -      } else if (buckets[hashed] && excluded) {
    -        // skip
    -      } else if (excluded) {
    -        buckets[hashed] = []
    -        buckets[hashed]._path = index.bucketPath(cache, k)
    -      } else {
    -        buckets[hashed] = [entry]
    -        buckets[hashed]._path = index.bucketPath(cache, k)
    -      }
    -    }
    -  }
    -  await pMap(
    -    Object.keys(buckets),
    -    (key) => {
    -      return rebuildBucket(cache, buckets[key], stats, opts)
    -    },
    -    { concurrency: opts.concurrency }
    -  )
    -  return stats
    -}
    -
    -async function rebuildBucket (cache, bucket, stats, opts) {
    -  await truncate(bucket._path)
    -  // This needs to be serialized because cacache explicitly
    -  // lets very racy bucket conflicts clobber each other.
    -  for (const entry of bucket) {
    -    const content = contentPath(cache, entry.integrity)
    -    try {
    -      await stat(content)
    -      await index.insert(cache, entry.key, entry.integrity, {
    -        metadata: entry.metadata,
    -        size: entry.size,
    -        time: entry.time,
    -      })
    -      stats.totalEntries++
    -    } catch (err) {
    -      if (err.code === 'ENOENT') {
    -        stats.rejectedEntries++
    -        stats.missingContent++
    -      } else {
    -        throw err
    -      }
    -    }
    -  }
    -}
    -
    -function cleanTmp (cache, opts) {
    -  opts.log.silly('verify', 'cleaning tmp directory')
    -  return rm(path.join(cache, 'tmp'), { recursive: true, force: true })
    -}
    -
    -async function writeVerifile (cache, opts) {
    -  const verifile = path.join(cache, '_lastverified')
    -  opts.log.silly('verify', 'writing verifile to ' + verifile)
    -  return writeFile(verifile, `${Date.now()}`)
    -}
    -
    -module.exports.lastRun = lastRun
    -
    -async function lastRun (cache) {
    -  const data = await readFile(path.join(cache, '_lastverified'), { encoding: 'utf8' })
    -  return new Date(+data)
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion/LICENSE
    deleted file mode 100644
    index de3226673c3874..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion/LICENSE
    +++ /dev/null
    @@ -1,21 +0,0 @@
    -MIT License
    -
    -Copyright (c) 2013 Julian Gruber 
    -
    -Permission is hereby granted, free of charge, to any person obtaining a copy
    -of this software and associated documentation files (the "Software"), to deal
    -in the Software without restriction, including without limitation the rights
    -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    -copies of the Software, and to permit persons to whom the Software is
    -furnished to do so, subject to the following conditions:
    -
    -The above copyright notice and this permission notice shall be included in all
    -copies or substantial portions of the Software.
    -
    -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    -SOFTWARE.
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion/index.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion/index.js
    deleted file mode 100644
    index 668fb1cb9d45a4..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion/index.js
    +++ /dev/null
    @@ -1,202 +0,0 @@
    -var balanced = require('balanced-match');
    -
    -module.exports = expandTop;
    -
    -var escSlash = '\0SLASH'+Math.random()+'\0';
    -var escOpen = '\0OPEN'+Math.random()+'\0';
    -var escClose = '\0CLOSE'+Math.random()+'\0';
    -var escComma = '\0COMMA'+Math.random()+'\0';
    -var escPeriod = '\0PERIOD'+Math.random()+'\0';
    -
    -function numeric(str) {
    -  return parseInt(str, 10) == str
    -    ? parseInt(str, 10)
    -    : str.charCodeAt(0);
    -}
    -
    -function escapeBraces(str) {
    -  return str.split('\\\\').join(escSlash)
    -            .split('\\{').join(escOpen)
    -            .split('\\}').join(escClose)
    -            .split('\\,').join(escComma)
    -            .split('\\.').join(escPeriod);
    -}
    -
    -function unescapeBraces(str) {
    -  return str.split(escSlash).join('\\')
    -            .split(escOpen).join('{')
    -            .split(escClose).join('}')
    -            .split(escComma).join(',')
    -            .split(escPeriod).join('.');
    -}
    -
    -
    -// Basically just str.split(","), but handling cases
    -// where we have nested braced sections, which should be
    -// treated as individual members, like {a,{b,c},d}
    -function parseCommaParts(str) {
    -  if (!str)
    -    return [''];
    -
    -  var parts = [];
    -  var m = balanced('{', '}', str);
    -
    -  if (!m)
    -    return str.split(',');
    -
    -  var pre = m.pre;
    -  var body = m.body;
    -  var post = m.post;
    -  var p = pre.split(',');
    -
    -  p[p.length-1] += '{' + body + '}';
    -  var postParts = parseCommaParts(post);
    -  if (post.length) {
    -    p[p.length-1] += postParts.shift();
    -    p.push.apply(p, postParts);
    -  }
    -
    -  parts.push.apply(parts, p);
    -
    -  return parts;
    -}
    -
    -function expandTop(str) {
    -  if (!str)
    -    return [];
    -
    -  // I don't know why Bash 4.3 does this, but it does.
    -  // Anything starting with {} will have the first two bytes preserved
    -  // but *only* at the top level, so {},a}b will not expand to anything,
    -  // but a{},b}c will be expanded to [a}c,abc].
    -  // One could argue that this is a bug in Bash, but since the goal of
    -  // this module is to match Bash's rules, we escape a leading {}
    -  if (str.substr(0, 2) === '{}') {
    -    str = '\\{\\}' + str.substr(2);
    -  }
    -
    -  return expand(escapeBraces(str), true).map(unescapeBraces);
    -}
    -
    -function embrace(str) {
    -  return '{' + str + '}';
    -}
    -function isPadded(el) {
    -  return /^-?0\d/.test(el);
    -}
    -
    -function lte(i, y) {
    -  return i <= y;
    -}
    -function gte(i, y) {
    -  return i >= y;
    -}
    -
    -function expand(str, isTop) {
    -  var expansions = [];
    -
    -  var m = balanced('{', '}', str);
    -  if (!m) return [str];
    -
    -  // no need to expand pre, since it is guaranteed to be free of brace-sets
    -  var pre = m.pre;
    -  var post = m.post.length
    -    ? expand(m.post, false)
    -    : [''];
    -
    -  if (/\$$/.test(m.pre)) {
    -    for (var k = 0; k < post.length; k++) {
    -      var expansion = pre+ '{' + m.body + '}' + post[k];
    -      expansions.push(expansion);
    -    }
    -  } else {
    -    var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
    -    var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
    -    var isSequence = isNumericSequence || isAlphaSequence;
    -    var isOptions = m.body.indexOf(',') >= 0;
    -    if (!isSequence && !isOptions) {
    -      // {a},b}
    -      if (m.post.match(/,.*\}/)) {
    -        str = m.pre + '{' + m.body + escClose + m.post;
    -        return expand(str);
    -      }
    -      return [str];
    -    }
    -
    -    var n;
    -    if (isSequence) {
    -      n = m.body.split(/\.\./);
    -    } else {
    -      n = parseCommaParts(m.body);
    -      if (n.length === 1) {
    -        // x{{a,b}}y ==> x{a}y x{b}y
    -        n = expand(n[0], false).map(embrace);
    -        if (n.length === 1) {
    -          return post.map(function(p) {
    -            return m.pre + n[0] + p;
    -          });
    -        }
    -      }
    -    }
    -
    -    // at this point, n is the parts, and we know it's not a comma set
    -    // with a single entry.
    -    var N;
    -
    -    if (isSequence) {
    -      var x = numeric(n[0]);
    -      var y = numeric(n[1]);
    -      var width = Math.max(n[0].length, n[1].length)
    -      var incr = n.length == 3
    -        ? Math.abs(numeric(n[2]))
    -        : 1;
    -      var test = lte;
    -      var reverse = y < x;
    -      if (reverse) {
    -        incr *= -1;
    -        test = gte;
    -      }
    -      var pad = n.some(isPadded);
    -
    -      N = [];
    -
    -      for (var i = x; test(i, y); i += incr) {
    -        var c;
    -        if (isAlphaSequence) {
    -          c = String.fromCharCode(i);
    -          if (c === '\\')
    -            c = '';
    -        } else {
    -          c = String(i);
    -          if (pad) {
    -            var need = width - c.length;
    -            if (need > 0) {
    -              var z = new Array(need + 1).join('0');
    -              if (i < 0)
    -                c = '-' + z + c.slice(1);
    -              else
    -                c = z + c;
    -            }
    -          }
    -        }
    -        N.push(c);
    -      }
    -    } else {
    -      N = [];
    -
    -      for (var j = 0; j < n.length; j++) {
    -        N.push.apply(N, expand(n[j], false));
    -      }
    -    }
    -
    -    for (var j = 0; j < N.length; j++) {
    -      for (var k = 0; k < post.length; k++) {
    -        var expansion = pre + N[j] + post[k];
    -        if (!isTop || isSequence || expansion)
    -          expansions.push(expansion);
    -      }
    -    }
    -  }
    -
    -  return expansions;
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion/package.json b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion/package.json
    deleted file mode 100644
    index 7097d41e39de5d..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion/package.json
    +++ /dev/null
    @@ -1,46 +0,0 @@
    -{
    -  "name": "brace-expansion",
    -  "description": "Brace expansion as known from sh/bash",
    -  "version": "2.0.1",
    -  "repository": {
    -    "type": "git",
    -    "url": "git://github.com/juliangruber/brace-expansion.git"
    -  },
    -  "homepage": "https://github.com/juliangruber/brace-expansion",
    -  "main": "index.js",
    -  "scripts": {
    -    "test": "tape test/*.js",
    -    "gentest": "bash test/generate.sh",
    -    "bench": "matcha test/perf/bench.js"
    -  },
    -  "dependencies": {
    -    "balanced-match": "^1.0.0"
    -  },
    -  "devDependencies": {
    -    "@c4312/matcha": "^1.3.1",
    -    "tape": "^4.6.0"
    -  },
    -  "keywords": [],
    -  "author": {
    -    "name": "Julian Gruber",
    -    "email": "mail@juliangruber.com",
    -    "url": "http://juliangruber.com"
    -  },
    -  "license": "MIT",
    -  "testling": {
    -    "files": "test/*.js",
    -    "browsers": [
    -      "ie/8..latest",
    -      "firefox/20..latest",
    -      "firefox/nightly",
    -      "chrome/25..latest",
    -      "chrome/canary",
    -      "opera/12..latest",
    -      "opera/next",
    -      "safari/5.1..latest",
    -      "ipad/6.0..latest",
    -      "iphone/6.0..latest",
    -      "android-browser/4.2..latest"
    -    ]
    -  }
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/LICENSE
    deleted file mode 100644
    index ec7df93329abf3..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/LICENSE
    +++ /dev/null
    @@ -1,15 +0,0 @@
    -The ISC License
    -
    -Copyright (c) 2009-2023 Isaac Z. Schlueter and Contributors
    -
    -Permission to use, copy, modify, and/or distribute this software for any
    -purpose with or without fee is hereby granted, provided that the above
    -copyright notice and this permission notice appear in all copies.
    -
    -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
    -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/README.md b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/README.md
    deleted file mode 100644
    index 1bde1494664d4d..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/README.md
    +++ /dev/null
    @@ -1,1214 +0,0 @@
    -# Glob
    -
    -Match files using the patterns the shell uses.
    -
    -The most correct and second fastest glob implementation in
    -JavaScript. (See **Comparison to Other JavaScript Glob
    -Implementations** at the bottom of this readme.)
    -
    -![a fun cartoon logo made of glob characters](https://github.com/isaacs/node-glob/raw/main/logo/glob.png)
    -
    -## Usage
    -
    -Install with npm
    -
    -```
    -npm i glob
    -```
    -
    -**Note** the npm package name is _not_ `node-glob` that's a
    -different thing that was abandoned years ago. Just `glob`.
    -
    -```js
    -// load using import
    -import { glob, globSync, globStream, globStreamSync, Glob } from 'glob'
    -// or using commonjs, that's fine, too
    -const {
    -  glob,
    -  globSync,
    -  globStream,
    -  globStreamSync,
    -  Glob,
    -} = require('glob')
    -
    -// the main glob() and globSync() resolve/return array of filenames
    -
    -// all js files, but don't look in node_modules
    -const jsfiles = await glob('**/*.js', { ignore: 'node_modules/**' })
    -
    -// pass in a signal to cancel the glob walk
    -const stopAfter100ms = await glob('**/*.css', {
    -  signal: AbortSignal.timeout(100),
    -})
    -
    -// multiple patterns supported as well
    -const images = await glob(['css/*.{png,jpeg}', 'public/*.{png,jpeg}'])
    -
    -// but of course you can do that with the glob pattern also
    -// the sync function is the same, just returns a string[] instead
    -// of Promise
    -const imagesAlt = globSync('{css,public}/*.{png,jpeg}')
    -
    -// you can also stream them, this is a Minipass stream
    -const filesStream = globStream(['**/*.dat', 'logs/**/*.log'])
    -
    -// construct a Glob object if you wanna do it that way, which
    -// allows for much faster walks if you have to look in the same
    -// folder multiple times.
    -const g = new Glob('**/foo', {})
    -// glob objects are async iterators, can also do globIterate() or
    -// g.iterate(), same deal
    -for await (const file of g) {
    -  console.log('found a foo file:', file)
    -}
    -// pass a glob as the glob options to reuse its settings and caches
    -const g2 = new Glob('**/bar', g)
    -// sync iteration works as well
    -for (const file of g2) {
    -  console.log('found a bar file:', file)
    -}
    -
    -// you can also pass withFileTypes: true to get Path objects
    -// these are like a Dirent, but with some more added powers
    -// check out http://npm.im/path-scurry for more info on their API
    -const g3 = new Glob('**/baz/**', { withFileTypes: true })
    -g3.stream().on('data', path => {
    -  console.log(
    -    'got a path object',
    -    path.fullpath(),
    -    path.isDirectory(),
    -    path.readdirSync().map(e => e.name)
    -  )
    -})
    -
    -// if you use stat:true and withFileTypes, you can sort results
    -// by things like modified time, filter by permission mode, etc.
    -// All Stats fields will be available in that case. Slightly
    -// slower, though.
    -// For example:
    -const results = await glob('**', { stat: true, withFileTypes: true })
    -
    -const timeSortedFiles = results
    -  .sort((a, b) => a.mtimeMS - b.mtimeMS)
    -  .map(path => path.fullpath())
    -
    -const groupReadableFiles = results
    -  .filter(path => path.mode & 0o040)
    -  .map(path => path.fullpath())
    -
    -// custom ignores can be done like this, for example by saying
    -// you'll ignore all markdown files, and all folders named 'docs'
    -const customIgnoreResults = await glob('**', {
    -  ignore: {
    -    ignored: p => /\.md$/.test(p.name),
    -    childrenIgnored: p => p.isNamed('docs'),
    -  },
    -})
    -
    -// another fun use case, only return files with the same name as
    -// their parent folder, plus either `.ts` or `.js`
    -const folderNamedModules = await glob('**/*.{ts,js}', {
    -  ignore: {
    -    ignored: p => {
    -      const pp = p.parent
    -      return !(p.isNamed(pp.name + '.ts') || p.isNamed(pp.name + '.js'))
    -    },
    -  },
    -})
    -
    -// find all files edited in the last hour, to do this, we ignore
    -// all of them that are more than an hour old
    -const newFiles = await glob('**', {
    -  // need stat so we have mtime
    -  stat: true,
    -  // only want the files, not the dirs
    -  nodir: true,
    -  ignore: {
    -    ignored: p => {
    -      return new Date() - p.mtime > 60 * 60 * 1000
    -    },
    -    // could add similar childrenIgnored here as well, but
    -    // directory mtime is inconsistent across platforms, so
    -    // probably better not to, unless you know the system
    -    // tracks this reliably.
    -  },
    -})
    -```
    -
    -**Note** Glob patterns should always use `/` as a path separator,
    -even on Windows systems, as `\` is used to escape glob
    -characters. If you wish to use `\` as a path separator _instead
    -of_ using it as an escape character on Windows platforms, you may
    -set `windowsPathsNoEscape:true` in the options. In this mode,
    -special glob characters cannot be escaped, making it impossible
    -to match a literal `*` `?` and so on in filenames.
    -
    -## Command Line Interface
    -
    -```
    -$ glob -h
    -
    -Usage:
    -  glob [options] [ [ ...]]
    -
    -Expand the positional glob expression arguments into any matching file system
    -paths found.
    -
    -  -c --cmd=
    -                         Run the command provided, passing the glob expression
    -                         matches as arguments.
    -
    -  -A --all               By default, the glob cli command will not expand any
    -                         arguments that are an exact match to a file on disk.
    -
    -                         This prevents double-expanding, in case the shell
    -                         expands an argument whose filename is a glob
    -                         expression.
    -
    -                         For example, if 'app/*.ts' would match 'app/[id].ts',
    -                         then on Windows powershell or cmd.exe, 'glob app/*.ts'
    -                         will expand to 'app/[id].ts', as expected. However, in
    -                         posix shells such as bash or zsh, the shell will first
    -                         expand 'app/*.ts' to a list of filenames. Then glob
    -                         will look for a file matching 'app/[id].ts' (ie,
    -                         'app/i.ts' or 'app/d.ts'), which is unexpected.
    -
    -                         Setting '--all' prevents this behavior, causing glob to
    -                         treat ALL patterns as glob expressions to be expanded,
    -                         even if they are an exact match to a file on disk.
    -
    -                         When setting this option, be sure to enquote arguments
    -                         so that the shell will not expand them prior to passing
    -                         them to the glob command process.
    -
    -  -a --absolute          Expand to absolute paths
    -  -d --dot-relative      Prepend './' on relative matches
    -  -m --mark              Append a / on any directories matched
    -  -x --posix             Always resolve to posix style paths, using '/' as the
    -                         directory separator, even on Windows. Drive letter
    -                         absolute matches on Windows will be expanded to their
    -                         full resolved UNC maths, eg instead of 'C:\foo\bar', it
    -                         will expand to '//?/C:/foo/bar'.
    -
    -  -f --follow            Follow symlinked directories when expanding '**'
    -  -R --realpath          Call 'fs.realpath' on all of the results. In the case
    -                         of an entry that cannot be resolved, the entry is
    -                         omitted. This incurs a slight performance penalty, of
    -                         course, because of the added system calls.
    -
    -  -s --stat              Call 'fs.lstat' on all entries, whether required or not
    -                         to determine if it's a valid match.
    -
    -  -b --match-base        Perform a basename-only match if the pattern does not
    -                         contain any slash characters. That is, '*.js' would be
    -                         treated as equivalent to '**/*.js', matching js files
    -                         in all directories.
    -
    -  --dot                  Allow patterns to match files/directories that start
    -                         with '.', even if the pattern does not start with '.'
    -
    -  --nobrace              Do not expand {...} patterns
    -  --nocase               Perform a case-insensitive match. This defaults to
    -                         'true' on macOS and Windows platforms, and false on all
    -                         others.
    -
    -                         Note: 'nocase' should only be explicitly set when it is
    -                         known that the filesystem's case sensitivity differs
    -                         from the platform default. If set 'true' on
    -                         case-insensitive file systems, then the walk may return
    -                         more or less results than expected.
    -
    -  --nodir                Do not match directories, only files.
    -
    -                         Note: to *only* match directories, append a '/' at the
    -                         end of the pattern.
    -
    -  --noext                Do not expand extglob patterns, such as '+(a|b)'
    -  --noglobstar           Do not expand '**' against multiple path portions. Ie,
    -                         treat it as a normal '*' instead.
    -
    -  --windows-path-no-escape
    -                         Use '\' as a path separator *only*, and *never* as an
    -                         escape character. If set, all '\' characters are
    -                         replaced with '/' in the pattern.
    -
    -  -D --max-depth=  Maximum depth to traverse from the current working
    -                         directory
    -
    -  -C --cwd=    Current working directory to execute/match in
    -  -r --root= A string path resolved against the 'cwd', which is used
    -                         as the starting point for absolute patterns that start
    -                         with '/' (but not drive letters or UNC paths on
    -                         Windows).
    -
    -                         Note that this *doesn't* necessarily limit the walk to
    -                         the 'root' directory, and doesn't affect the cwd
    -                         starting point for non-absolute patterns. A pattern
    -                         containing '..' will still be able to traverse out of
    -                         the root directory, if it is not an actual root
    -                         directory on the filesystem, and any non-absolute
    -                         patterns will still be matched in the 'cwd'.
    -
    -                         To start absolute and non-absolute patterns in the same
    -                         path, you can use '--root=' to set it to the empty
    -                         string. However, be aware that on Windows systems, a
    -                         pattern like 'x:/*' or '//host/share/*' will *always*
    -                         start in the 'x:/' or '//host/share/' directory,
    -                         regardless of the --root setting.
    -
    -  --platform=  Defaults to the value of 'process.platform' if
    -                         available, or 'linux' if not. Setting --platform=win32
    -                         on non-Windows systems may cause strange behavior!
    -
    -  -i --ignore=
    -                         Glob patterns to ignore Can be set multiple times
    -  -v --debug             Output a huge amount of noisy debug information about
    -                         patterns as they are parsed and used to match files.
    -
    -  -h --help              Show this usage information
    -```
    -
    -## `glob(pattern: string | string[], options?: GlobOptions) => Promise`
    -
    -Perform an asynchronous glob search for the pattern(s) specified.
    -Returns
    -[Path](https://isaacs.github.io/path-scurry/classes/PathBase)
    -objects if the `withFileTypes` option is set to `true`. See below
    -for full options field desciptions.
    -
    -## `globSync(pattern: string | string[], options?: GlobOptions) => string[] | Path[]`
    -
    -Synchronous form of `glob()`.
    -
    -Alias: `glob.sync()`
    -
    -## `globIterate(pattern: string | string[], options?: GlobOptions) => AsyncGenerator`
    -
    -Return an async iterator for walking glob pattern matches.
    -
    -Alias: `glob.iterate()`
    -
    -## `globIterateSync(pattern: string | string[], options?: GlobOptions) => Generator`
    -
    -Return a sync iterator for walking glob pattern matches.
    -
    -Alias: `glob.iterate.sync()`, `glob.sync.iterate()`
    -
    -## `globStream(pattern: string | string[], options?: GlobOptions) => Minipass`
    -
    -Return a stream that emits all the strings or `Path` objects and
    -then emits `end` when completed.
    -
    -Alias: `glob.stream()`
    -
    -## `globStreamSync(pattern: string | string[], options?: GlobOptions) => Minipass`
    -
    -Syncronous form of `globStream()`. Will read all the matches as
    -fast as you consume them, even all in a single tick if you
    -consume them immediately, but will still respond to backpressure
    -if they're not consumed immediately.
    -
    -Alias: `glob.stream.sync()`, `glob.sync.stream()`
    -
    -## `hasMagic(pattern: string | string[], options?: GlobOptions) => boolean`
    -
    -Returns `true` if the provided pattern contains any "magic" glob
    -characters, given the options provided.
    -
    -Brace expansion is not considered "magic" unless the
    -`magicalBraces` option is set, as brace expansion just turns one
    -string into an array of strings. So a pattern like `'x{a,b}y'`
    -would return `false`, because `'xay'` and `'xby'` both do not
    -contain any magic glob characters, and it's treated the same as
    -if you had called it on `['xay', 'xby']`. When
    -`magicalBraces:true` is in the options, brace expansion _is_
    -treated as a pattern having magic.
    -
    -## `escape(pattern: string, options?: GlobOptions) => string`
    -
    -Escape all magic characters in a glob pattern, so that it will
    -only ever match literal strings
    -
    -If the `windowsPathsNoEscape` option is used, then characters are
    -escaped by wrapping in `[]`, because a magic character wrapped in
    -a character class can only be satisfied by that exact character.
    -
    -Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot
    -be escaped or unescaped.
    -
    -## `unescape(pattern: string, options?: GlobOptions) => string`
    -
    -Un-escape a glob string that may contain some escaped characters.
    -
    -If the `windowsPathsNoEscape` option is used, then square-brace
    -escapes are removed, but not backslash escapes. For example, it
    -will turn the string `'[*]'` into `*`, but it will not turn
    -`'\\*'` into `'*'`, because `\` is a path separator in
    -`windowsPathsNoEscape` mode.
    -
    -When `windowsPathsNoEscape` is not set, then both brace escapes
    -and backslash escapes are removed.
    -
    -Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot
    -be escaped or unescaped.
    -
    -## Class `Glob`
    -
    -An object that can perform glob pattern traversals.
    -
    -### `const g = new Glob(pattern: string | string[], options: GlobOptions)`
    -
    -Options object is required.
    -
    -See full options descriptions below.
    -
    -Note that a previous `Glob` object can be passed as the
    -`GlobOptions` to another `Glob` instantiation to re-use settings
    -and caches with a new pattern.
    -
    -Traversal functions can be called multiple times to run the walk
    -again.
    -
    -### `g.stream()`
    -
    -Stream results asynchronously,
    -
    -### `g.streamSync()`
    -
    -Stream results synchronously.
    -
    -### `g.iterate()`
    -
    -Default async iteration function. Returns an AsyncGenerator that
    -iterates over the results.
    -
    -### `g.iterateSync()`
    -
    -Default sync iteration function. Returns a Generator that
    -iterates over the results.
    -
    -### `g.walk()`
    -
    -Returns a Promise that resolves to the results array.
    -
    -### `g.walkSync()`
    -
    -Returns a results array.
    -
    -### Properties
    -
    -All options are stored as properties on the `Glob` object.
    -
    -- `opts` The options provided to the constructor.
    -- `patterns` An array of parsed immutable `Pattern` objects.
    -
    -## Options
    -
    -Exported as `GlobOptions` TypeScript interface. A `GlobOptions`
    -object may be provided to any of the exported methods, and must
    -be provided to the `Glob` constructor.
    -
    -All options are optional, boolean, and false by default, unless
    -otherwise noted.
    -
    -All resolved options are added to the Glob object as properties.
    -
    -If you are running many `glob` operations, you can pass a Glob
    -object as the `options` argument to a subsequent operation to
    -share the previously loaded cache.
    -
    -- `cwd` String path or `file://` string or URL object. The
    -  current working directory in which to search. Defaults to
    -  `process.cwd()`. See also: "Windows, CWDs, Drive Letters, and
    -  UNC Paths", below.
    -
    -  This option may be eiher a string path or a `file://` URL
    -  object or string.
    -
    -- `root` A string path resolved against the `cwd` option, which
    -  is used as the starting point for absolute patterns that start
    -  with `/`, (but not drive letters or UNC paths on Windows).
    -
    -  Note that this _doesn't_ necessarily limit the walk to the
    -  `root` directory, and doesn't affect the cwd starting point for
    -  non-absolute patterns. A pattern containing `..` will still be
    -  able to traverse out of the root directory, if it is not an
    -  actual root directory on the filesystem, and any non-absolute
    -  patterns will be matched in the `cwd`. For example, the
    -  pattern `/../*` with `{root:'/some/path'}` will return all
    -  files in `/some`, not all files in `/some/path`. The pattern
    -  `*` with `{root:'/some/path'}` will return all the entries in
    -  the cwd, not the entries in `/some/path`.
    -
    -  To start absolute and non-absolute patterns in the same
    -  path, you can use `{root:''}`. However, be aware that on
    -  Windows systems, a pattern like `x:/*` or `//host/share/*` will
    -  _always_ start in the `x:/` or `//host/share` directory,
    -  regardless of the `root` setting.
    -
    -- `windowsPathsNoEscape` Use `\\` as a path separator _only_, and
    -  _never_ as an escape character. If set, all `\\` characters are
    -  replaced with `/` in the pattern.
    -
    -  Note that this makes it **impossible** to match against paths
    -  containing literal glob pattern characters, but allows matching
    -  with patterns constructed using `path.join()` and
    -  `path.resolve()` on Windows platforms, mimicking the (buggy!)
    -  behavior of Glob v7 and before on Windows. Please use with
    -  caution, and be mindful of [the caveat below about Windows
    -  paths](#windows). (For legacy reasons, this is also set if
    -  `allowWindowsEscape` is set to the exact value `false`.)
    -
    -- `dot` Include `.dot` files in normal matches and `globstar`
    -  matches. Note that an explicit dot in a portion of the pattern
    -  will always match dot files.
    -
    -- `magicalBraces` Treat brace expansion like `{a,b}` as a "magic"
    -  pattern. Has no effect if {@link nobrace} is set.
    -
    -  Only has effect on the {@link hasMagic} function, no effect on
    -  glob pattern matching itself.
    -
    -- `dotRelative` Prepend all relative path strings with `./` (or
    -  `.\` on Windows).
    -
    -  Without this option, returned relative paths are "bare", so
    -  instead of returning `'./foo/bar'`, they are returned as
    -  `'foo/bar'`.
    -
    -  Relative patterns starting with `'../'` are not prepended with
    -  `./`, even if this option is set.
    -
    -- `mark` Add a `/` character to directory matches. Note that this
    -  requires additional stat calls.
    -
    -- `nobrace` Do not expand `{a,b}` and `{1..3}` brace sets.
    -
    -- `noglobstar` Do not match `**` against multiple filenames. (Ie,
    -  treat it as a normal `*` instead.)
    -
    -- `noext` Do not match "extglob" patterns such as `+(a|b)`.
    -
    -- `nocase` Perform a case-insensitive match. This defaults to
    -  `true` on macOS and Windows systems, and `false` on all others.
    -
    -  **Note** `nocase` should only be explicitly set when it is
    -  known that the filesystem's case sensitivity differs from the
    -  platform default. If set `true` on case-sensitive file
    -  systems, or `false` on case-insensitive file systems, then the
    -  walk may return more or less results than expected.
    -
    -- `maxDepth` Specify a number to limit the depth of the directory
    -  traversal to this many levels below the `cwd`.
    -
    -- `matchBase` Perform a basename-only match if the pattern does
    -  not contain any slash characters. That is, `*.js` would be
    -  treated as equivalent to `**/*.js`, matching all js files in
    -  all directories.
    -
    -- `nodir` Do not match directories, only files. (Note: to match
    -  _only_ directories, put a `/` at the end of the pattern.)
    -
    -- `stat` Call `lstat()` on all entries, whether required or not
    -  to determine whether it's a valid match. When used with
    -  `withFileTypes`, this means that matches will include data such
    -  as modified time, permissions, and so on. Note that this will
    -  incur a performance cost due to the added system calls.
    -
    -- `ignore` string or string[], or an object with `ignore` and
    -  `ignoreChildren` methods.
    -
    -  If a string or string[] is provided, then this is treated as a
    -  glob pattern or array of glob patterns to exclude from matches.
    -  To ignore all children within a directory, as well as the entry
    -  itself, append `'/**'` to the ignore pattern.
    -
    -  **Note** `ignore` patterns are _always_ in `dot:true` mode,
    -  regardless of any other settings.
    -
    -  If an object is provided that has `ignored(path)` and/or
    -  `childrenIgnored(path)` methods, then these methods will be
    -  called to determine whether any Path is a match or if its
    -  children should be traversed, respectively.
    -
    -- `follow` Follow symlinked directories when expanding `**`
    -  patterns. This can result in a lot of duplicate references in
    -  the presence of cyclic links, and make performance quite bad.
    -
    -  By default, a `**` in a pattern will follow 1 symbolic link if
    -  it is not the first item in the pattern, or none if it is the
    -  first item in the pattern, following the same behavior as Bash.
    -
    -- `realpath` Set to true to call `fs.realpath` on all of the
    -  results. In the case of an entry that cannot be resolved, the
    -  entry is omitted. This incurs a slight performance penalty, of
    -  course, because of the added system calls.
    -
    -- `absolute` Set to true to always receive absolute paths for
    -  matched files. Set to `false` to always receive relative paths
    -  for matched files.
    -
    -  By default, when this option is not set, absolute paths are
    -  returned for patterns that are absolute, and otherwise paths
    -  are returned that are relative to the `cwd` setting.
    -
    -  This does _not_ make an extra system call to get the realpath,
    -  it only does string path resolution.
    -
    -  `absolute` may not be used along with `withFileTypes`.
    -
    -- `posix` Set to true to use `/` as the path separator in
    -  returned results. On posix systems, this has no effect. On
    -  Windows systems, this will return `/` delimited path results,
    -  and absolute paths will be returned in their full resolved UNC
    -  path form, eg insted of `'C:\\foo\\bar'`, it will return
    -  `//?/C:/foo/bar`.
    -
    -- `platform` Defaults to value of `process.platform` if
    -  available, or `'linux'` if not. Setting `platform:'win32'` on
    -  non-Windows systems may cause strange behavior.
    -
    -- `withFileTypes` Return [PathScurry](http://npm.im/path-scurry)
    -  `Path` objects instead of strings. These are similar to a
    -  NodeJS `Dirent` object, but with additional methods and
    -  properties.
    -
    -  `withFileTypes` may not be used along with `absolute`.
    -
    -- `signal` An AbortSignal which will cancel the Glob walk when
    -  triggered.
    -
    -- `fs` An override object to pass in custom filesystem methods.
    -  See [PathScurry docs](http://npm.im/path-scurry) for what can
    -  be overridden.
    -
    -- `scurry` A [PathScurry](http://npm.im/path-scurry) object used
    -  to traverse the file system. If the `nocase` option is set
    -  explicitly, then any provided `scurry` object must match this
    -  setting.
    -
    -## Glob Primer
    -
    -Much more information about glob pattern expansion can be found
    -by running `man bash` and searching for `Pattern Matching`.
    -
    -"Globs" are the patterns you type when you do stuff like `ls
    -*.js` on the command line, or put `build/*` in a `.gitignore`
    -file.
    -
    -Before parsing the path part patterns, braced sections are
    -expanded into a set. Braced sections start with `{` and end with
    -`}`, with 2 or more comma-delimited sections within. Braced
    -sections may contain slash characters, so `a{/b/c,bcd}` would
    -expand into `a/b/c` and `abcd`.
    -
    -The following characters have special magic meaning when used in
    -a path portion. With the exception of `**`, none of these match
    -path separators (ie, `/` on all platforms, and `\` on Windows).
    -
    -- `*` Matches 0 or more characters in a single path portion.
    -  When alone in a path portion, it must match at least 1
    -  character. If `dot:true` is not specified, then `*` will not
    -  match against a `.` character at the start of a path portion.
    -- `?` Matches 1 character. If `dot:true` is not specified, then
    -  `?` will not match against a `.` character at the start of a
    -  path portion.
    -- `[...]` Matches a range of characters, similar to a RegExp
    -  range. If the first character of the range is `!` or `^` then
    -  it matches any character not in the range. If the first
    -  character is `]`, then it will be considered the same as `\]`,
    -  rather than the end of the character class.
    -- `!(pattern|pattern|pattern)` Matches anything that does not
    -  match any of the patterns provided. May _not_ contain `/`
    -  characters. Similar to `*`, if alone in a path portion, then
    -  the path portion must have at least one character.
    -- `?(pattern|pattern|pattern)` Matches zero or one occurrence of
    -  the patterns provided. May _not_ contain `/` characters.
    -- `+(pattern|pattern|pattern)` Matches one or more occurrences of
    -  the patterns provided. May _not_ contain `/` characters.
    -- `*(a|b|c)` Matches zero or more occurrences of the patterns
    -  provided. May _not_ contain `/` characters.
    -- `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns
    -  provided. May _not_ contain `/` characters.
    -- `**` If a "globstar" is alone in a path portion, then it
    -  matches zero or more directories and subdirectories searching
    -  for matches. It does not crawl symlinked directories, unless
    -  `{follow:true}` is passed in the options object. A pattern
    -  like `a/b/**` will only match `a/b` if it is a directory.
    -  Follows 1 symbolic link if not the first item in the pattern,
    -  or 0 if it is the first item, unless `follow:true` is set, in
    -  which case it follows all symbolic links.
    -
    -`[:class:]` patterns are supported by this implementation, but
    -`[=c=]` and `[.symbol.]` style class patterns are not.
    -
    -### Dots
    -
    -If a file or directory path portion has a `.` as the first
    -character, then it will not match any glob pattern unless that
    -pattern's corresponding path part also has a `.` as its first
    -character.
    -
    -For example, the pattern `a/.*/c` would match the file at
    -`a/.b/c`. However the pattern `a/*/c` would not, because `*` does
    -not start with a dot character.
    -
    -You can make glob treat dots as normal characters by setting
    -`dot:true` in the options.
    -
    -### Basename Matching
    -
    -If you set `matchBase:true` in the options, and the pattern has
    -no slashes in it, then it will seek for any file anywhere in the
    -tree with a matching basename. For example, `*.js` would match
    -`test/simple/basic.js`.
    -
    -### Empty Sets
    -
    -If no matching files are found, then an empty array is returned.
    -This differs from the shell, where the pattern itself is
    -returned. For example:
    -
    -```sh
    -$ echo a*s*d*f
    -a*s*d*f
    -```
    -
    -## Comparisons to other fnmatch/glob implementations
    -
    -While strict compliance with the existing standards is a
    -worthwhile goal, some discrepancies exist between node-glob and
    -other implementations, and are intentional.
    -
    -The double-star character `**` is supported by default, unless
    -the `noglobstar` flag is set. This is supported in the manner of
    -bsdglob and bash 5, where `**` only has special significance if
    -it is the only thing in a path part. That is, `a/**/b` will match
    -`a/x/y/b`, but `a/**b` will not.
    -
    -Note that symlinked directories are not traversed as part of a
    -`**`, though their contents may match against subsequent portions
    -of the pattern. This prevents infinite loops and duplicates and
    -the like. You can force glob to traverse symlinks with `**` by
    -setting `{follow:true}` in the options.
    -
    -There is no equivalent of the `nonull` option. A pattern that
    -does not find any matches simply resolves to nothing. (An empty
    -array, immediately ended stream, etc.)
    -
    -If brace expansion is not disabled, then it is performed before
    -any other interpretation of the glob pattern. Thus, a pattern
    -like `+(a|{b),c)}`, which would not be valid in bash or zsh, is
    -expanded **first** into the set of `+(a|b)` and `+(a|c)`, and
    -those patterns are checked for validity. Since those two are
    -valid, matching proceeds.
    -
    -The character class patterns `[:class:]` (posix standard named
    -classes) style class patterns are supported and unicode-aware,
    -but `[=c=]` (locale-specific character collation weight), and
    -`[.symbol.]` (collating symbol), are not.
    -
    -### Repeated Slashes
    -
    -Unlike Bash and zsh, repeated `/` are always coalesced into a
    -single path separator.
    -
    -### Comments and Negation
    -
    -Previously, this module let you mark a pattern as a "comment" if
    -it started with a `#` character, or a "negated" pattern if it
    -started with a `!` character.
    -
    -These options were deprecated in version 5, and removed in
    -version 6.
    -
    -To specify things that should not match, use the `ignore` option.
    -
    -## Windows
    -
    -**Please only use forward-slashes in glob expressions.**
    -
    -Though windows uses either `/` or `\` as its path separator, only
    -`/` characters are used by this glob implementation. You must use
    -forward-slashes **only** in glob expressions. Back-slashes will
    -always be interpreted as escape characters, not path separators.
    -
    -Results from absolute patterns such as `/foo/*` are mounted onto
    -the root setting using `path.join`. On windows, this will by
    -default result in `/foo/*` matching `C:\foo\bar.txt`.
    -
    -To automatically coerce all `\` characters to `/` in pattern
    -strings, **thus making it impossible to escape literal glob
    -characters**, you may set the `windowsPathsNoEscape` option to
    -`true`.
    -
    -### Windows, CWDs, Drive Letters, and UNC Paths
    -
    -On posix systems, when a pattern starts with `/`, any `cwd`
    -option is ignored, and the traversal starts at `/`, plus any
    -non-magic path portions specified in the pattern.
    -
    -On Windows systems, the behavior is similar, but the concept of
    -an "absolute path" is somewhat more involved.
    -
    -#### UNC Paths
    -
    -A UNC path may be used as the start of a pattern on Windows
    -platforms. For example, a pattern like: `//?/x:/*` will return
    -all file entries in the root of the `x:` drive. A pattern like
    -`//ComputerName/Share/*` will return all files in the associated
    -share.
    -
    -UNC path roots are always compared case insensitively.
    -
    -#### Drive Letters
    -
    -A pattern starting with a drive letter, like `c:/*`, will search
    -in that drive, regardless of any `cwd` option provided.
    -
    -If the pattern starts with `/`, and is not a UNC path, and there
    -is an explicit `cwd` option set with a drive letter, then the
    -drive letter in the `cwd` is used as the root of the directory
    -traversal.
    -
    -For example, `glob('/tmp', { cwd: 'c:/any/thing' })` will return
    -`['c:/tmp']` as the result.
    -
    -If an explicit `cwd` option is not provided, and the pattern
    -starts with `/`, then the traversal will run on the root of the
    -drive provided as the `cwd` option. (That is, it is the result of
    -`path.resolve('/')`.)
    -
    -## Race Conditions
    -
    -Glob searching, by its very nature, is susceptible to race
    -conditions, since it relies on directory walking.
    -
    -As a result, it is possible that a file that exists when glob
    -looks for it may have been deleted or modified by the time it
    -returns the result.
    -
    -By design, this implementation caches all readdir calls that it
    -makes, in order to cut down on system overhead. However, this
    -also makes it even more susceptible to races, especially if the
    -cache object is reused between glob calls.
    -
    -Users are thus advised not to use a glob result as a guarantee of
    -filesystem state in the face of rapid changes. For the vast
    -majority of operations, this is never a problem.
    -
    -### See Also:
    -
    -- `man sh`
    -- `man bash` [Pattern
    -  Matching](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html)
    -- `man 3 fnmatch`
    -- `man 5 gitignore`
    -- [minimatch documentation](https://github.com/isaacs/minimatch)
    -
    -## Glob Logo
    -
    -Glob's logo was created by [Tanya
    -Brassie](http://tanyabrassie.com/). Logo files can be found
    -[here](https://github.com/isaacs/node-glob/tree/master/logo).
    -
    -The logo is licensed under a [Creative Commons
    -Attribution-ShareAlike 4.0 International
    -License](https://creativecommons.org/licenses/by-sa/4.0/).
    -
    -## Contributing
    -
    -Any change to behavior (including bugfixes) must come with a
    -test.
    -
    -Patches that fail tests or reduce performance will be rejected.
    -
    -```sh
    -# to run tests
    -npm test
    -
    -# to re-generate test fixtures
    -npm run test-regen
    -
    -# run the benchmarks
    -npm run bench
    -
    -# to profile javascript
    -npm run prof
    -```
    -
    -## Comparison to Other JavaScript Glob Implementations
    -
    -**tl;dr**
    -
    -- If you want glob matching that is as faithful as possible to
    -  Bash pattern expansion semantics, and as fast as possible
    -  within that constraint, _use this module_.
    -- If you are reasonably sure that the patterns you will encounter
    -  are relatively simple, and want the absolutely fastest glob
    -  matcher out there, _use [fast-glob](http://npm.im/fast-glob)_.
    -- If you are reasonably sure that the patterns you will encounter
    -  are relatively simple, and want the convenience of
    -  automatically respecting `.gitignore` files, _use
    -  [globby](http://npm.im/globby)_.
    -
    -There are some other glob matcher libraries on npm, but these
    -three are (in my opinion, as of 2023) the best.
    -
    ----
    -
    -**full explanation**
    -
    -Every library reflects a set of opinions and priorities in the
    -trade-offs it makes. Other than this library, I can personally
    -recommend both [globby](http://npm.im/globby) and
    -[fast-glob](http://npm.im/fast-glob), though they differ in their
    -benefits and drawbacks.
    -
    -Both have very nice APIs and are reasonably fast.
    -
    -`fast-glob` is, as far as I am aware, the fastest glob
    -implementation in JavaScript today. However, there are many
    -cases where the choices that `fast-glob` makes in pursuit of
    -speed mean that its results differ from the results returned by
    -Bash and other sh-like shells, which may be surprising.
    -
    -In my testing, `fast-glob` is around 10-20% faster than this
    -module when walking over 200k files nested 4 directories
    -deep[1](#fn-webscale). However, there are some inconsistencies
    -with Bash matching behavior that this module does not suffer
    -from:
    -
    -- `**` only matches files, not directories
    -- `..` path portions are not handled unless they appear at the
    -  start of the pattern
    -- `./!()` will not match any files that _start_ with
    -  ``, even if they do not match ``. For
    -  example, `!(9).txt` will not match `9999.txt`.
    -- Some brace patterns in the middle of a pattern will result in
    -  failing to find certain matches.
    -- Extglob patterns are allowed to contain `/` characters.
    -
    -Globby exhibits all of the same pattern semantics as fast-glob,
    -(as it is a wrapper around fast-glob) and is slightly slower than
    -node-glob (by about 10-20% in the benchmark test set, or in other
    -words, anywhere from 20-50% slower than fast-glob). However, it
    -adds some API conveniences that may be worth the costs.
    -
    -- Support for `.gitignore` and other ignore files.
    -- Support for negated globs (ie, patterns starting with `!`
    -  rather than using a separate `ignore` option).
    -
    -The priority of this module is "correctness" in the sense of
    -performing a glob pattern expansion as faithfully as possible to
    -the behavior of Bash and other sh-like shells, with as much speed
    -as possible.
    -
    -Note that prior versions of `node-glob` are _not_ on this list.
    -Former versions of this module are far too slow for any cases
    -where performance matters at all, and were designed with APIs
    -that are extremely dated by current JavaScript standards.
    -
    ----
    -
    -[1]: In the cases where this module
    -returns results and `fast-glob` doesn't, it's even faster, of
    -course.
    -
    -![lumpy space princess saying 'oh my GLOB'](https://github.com/isaacs/node-glob/raw/main/oh-my-glob.gif)
    -
    -### Benchmark Results
    -
    -First number is time, smaller is better.
    -
    -Second number is the count of results returned.
    -
    -```
    ---- pattern: '**' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.598s  200364
    -node globby sync                0m0.765s  200364
    -node current globSync mjs       0m0.683s  222656
    -node current glob syncStream    0m0.649s  222656
    -~~ async ~~
    -node fast-glob async            0m0.350s  200364
    -node globby async               0m0.509s  200364
    -node current glob async mjs     0m0.463s  222656
    -node current glob stream        0m0.411s  222656
    -
    ---- pattern: '**/..' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.486s  0
    -node globby sync                0m0.769s  200364
    -node current globSync mjs       0m0.564s  2242
    -node current glob syncStream    0m0.583s  2242
    -~~ async ~~
    -node fast-glob async            0m0.283s  0
    -node globby async               0m0.512s  200364
    -node current glob async mjs     0m0.299s  2242
    -node current glob stream        0m0.312s  2242
    -
    ---- pattern: './**/0/**/0/**/0/**/0/**/*.txt' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.490s  10
    -node globby sync                0m0.517s  10
    -node current globSync mjs       0m0.540s  10
    -node current glob syncStream    0m0.550s  10
    -~~ async ~~
    -node fast-glob async            0m0.290s  10
    -node globby async               0m0.296s  10
    -node current glob async mjs     0m0.278s  10
    -node current glob stream        0m0.302s  10
    -
    ---- pattern: './**/[01]/**/[12]/**/[23]/**/[45]/**/*.txt' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.500s  160
    -node globby sync                0m0.528s  160
    -node current globSync mjs       0m0.556s  160
    -node current glob syncStream    0m0.573s  160
    -~~ async ~~
    -node fast-glob async            0m0.283s  160
    -node globby async               0m0.301s  160
    -node current glob async mjs     0m0.306s  160
    -node current glob stream        0m0.322s  160
    -
    ---- pattern: './**/0/**/0/**/*.txt' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.502s  5230
    -node globby sync                0m0.527s  5230
    -node current globSync mjs       0m0.544s  5230
    -node current glob syncStream    0m0.557s  5230
    -~~ async ~~
    -node fast-glob async            0m0.285s  5230
    -node globby async               0m0.305s  5230
    -node current glob async mjs     0m0.304s  5230
    -node current glob stream        0m0.310s  5230
    -
    ---- pattern: '**/*.txt' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.580s  200023
    -node globby sync                0m0.771s  200023
    -node current globSync mjs       0m0.685s  200023
    -node current glob syncStream    0m0.649s  200023
    -~~ async ~~
    -node fast-glob async            0m0.349s  200023
    -node globby async               0m0.509s  200023
    -node current glob async mjs     0m0.427s  200023
    -node current glob stream        0m0.388s  200023
    -
    ---- pattern: '{**/*.txt,**/?/**/*.txt,**/?/**/?/**/*.txt,**/?/**/?/**/?/**/*.txt,**/?/**/?/**/?/**/?/**/*.txt}' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.589s  200023
    -node globby sync                0m0.771s  200023
    -node current globSync mjs       0m0.716s  200023
    -node current glob syncStream    0m0.684s  200023
    -~~ async ~~
    -node fast-glob async            0m0.351s  200023
    -node globby async               0m0.518s  200023
    -node current glob async mjs     0m0.462s  200023
    -node current glob stream        0m0.468s  200023
    -
    ---- pattern: '**/5555/0000/*.txt' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.496s  1000
    -node globby sync                0m0.519s  1000
    -node current globSync mjs       0m0.539s  1000
    -node current glob syncStream    0m0.567s  1000
    -~~ async ~~
    -node fast-glob async            0m0.285s  1000
    -node globby async               0m0.299s  1000
    -node current glob async mjs     0m0.305s  1000
    -node current glob stream        0m0.301s  1000
    -
    ---- pattern: './**/0/**/../[01]/**/0/../**/0/*.txt' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.484s  0
    -node globby sync                0m0.507s  0
    -node current globSync mjs       0m0.577s  4880
    -node current glob syncStream    0m0.586s  4880
    -~~ async ~~
    -node fast-glob async            0m0.280s  0
    -node globby async               0m0.298s  0
    -node current glob async mjs     0m0.327s  4880
    -node current glob stream        0m0.324s  4880
    -
    ---- pattern: '**/????/????/????/????/*.txt' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.547s  100000
    -node globby sync                0m0.673s  100000
    -node current globSync mjs       0m0.626s  100000
    -node current glob syncStream    0m0.618s  100000
    -~~ async ~~
    -node fast-glob async            0m0.315s  100000
    -node globby async               0m0.414s  100000
    -node current glob async mjs     0m0.366s  100000
    -node current glob stream        0m0.345s  100000
    -
    ---- pattern: './{**/?{/**/?{/**/?{/**/?,,,,},,,,},,,,},,,}/**/*.txt' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.588s  100000
    -node globby sync                0m0.670s  100000
    -node current globSync mjs       0m0.717s  200023
    -node current glob syncStream    0m0.687s  200023
    -~~ async ~~
    -node fast-glob async            0m0.343s  100000
    -node globby async               0m0.418s  100000
    -node current glob async mjs     0m0.519s  200023
    -node current glob stream        0m0.451s  200023
    -
    ---- pattern: '**/!(0|9).txt' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.573s  160023
    -node globby sync                0m0.731s  160023
    -node current globSync mjs       0m0.680s  180023
    -node current glob syncStream    0m0.659s  180023
    -~~ async ~~
    -node fast-glob async            0m0.345s  160023
    -node globby async               0m0.476s  160023
    -node current glob async mjs     0m0.427s  180023
    -node current glob stream        0m0.388s  180023
    -
    ---- pattern: './{*/**/../{*/**/../{*/**/../{*/**/../{*/**,,,,},,,,},,,,},,,,},,,,}/*.txt' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.483s  0
    -node globby sync                0m0.512s  0
    -node current globSync mjs       0m0.811s  200023
    -node current glob syncStream    0m0.773s  200023
    -~~ async ~~
    -node fast-glob async            0m0.280s  0
    -node globby async               0m0.299s  0
    -node current glob async mjs     0m0.617s  200023
    -node current glob stream        0m0.568s  200023
    -
    ---- pattern: './*/**/../*/**/../*/**/../*/**/../*/**/../*/**/../*/**/../*/**/*.txt' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.485s  0
    -node globby sync                0m0.507s  0
    -node current globSync mjs       0m0.759s  200023
    -node current glob syncStream    0m0.740s  200023
    -~~ async ~~
    -node fast-glob async            0m0.281s  0
    -node globby async               0m0.297s  0
    -node current glob async mjs     0m0.544s  200023
    -node current glob stream        0m0.464s  200023
    -
    ---- pattern: './*/**/../*/**/../*/**/../*/**/../*/**/*.txt' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.486s  0
    -node globby sync                0m0.513s  0
    -node current globSync mjs       0m0.734s  200023
    -node current glob syncStream    0m0.696s  200023
    -~~ async ~~
    -node fast-glob async            0m0.286s  0
    -node globby async               0m0.296s  0
    -node current glob async mjs     0m0.506s  200023
    -node current glob stream        0m0.483s  200023
    -
    ---- pattern: './0/**/../1/**/../2/**/../3/**/../4/**/../5/**/../6/**/../7/**/*.txt' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.060s  0
    -node globby sync                0m0.074s  0
    -node current globSync mjs       0m0.067s  0
    -node current glob syncStream    0m0.066s  0
    -~~ async ~~
    -node fast-glob async            0m0.060s  0
    -node globby async               0m0.075s  0
    -node current glob async mjs     0m0.066s  0
    -node current glob stream        0m0.067s  0
    -
    ---- pattern: './**/?/**/?/**/?/**/?/**/*.txt' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.568s  100000
    -node globby sync                0m0.651s  100000
    -node current globSync mjs       0m0.619s  100000
    -node current glob syncStream    0m0.617s  100000
    -~~ async ~~
    -node fast-glob async            0m0.332s  100000
    -node globby async               0m0.409s  100000
    -node current glob async mjs     0m0.372s  100000
    -node current glob stream        0m0.351s  100000
    -
    ---- pattern: '**/*/**/*/**/*/**/*/**' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.603s  200113
    -node globby sync                0m0.798s  200113
    -node current globSync mjs       0m0.730s  222137
    -node current glob syncStream    0m0.693s  222137
    -~~ async ~~
    -node fast-glob async            0m0.356s  200113
    -node globby async               0m0.525s  200113
    -node current glob async mjs     0m0.508s  222137
    -node current glob stream        0m0.455s  222137
    -
    ---- pattern: './**/*/**/*/**/*/**/*/**/*.txt' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.622s  200000
    -node globby sync                0m0.792s  200000
    -node current globSync mjs       0m0.722s  200000
    -node current glob syncStream    0m0.695s  200000
    -~~ async ~~
    -node fast-glob async            0m0.369s  200000
    -node globby async               0m0.527s  200000
    -node current glob async mjs     0m0.502s  200000
    -node current glob stream        0m0.481s  200000
    -
    ---- pattern: '**/*.txt' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.588s  200023
    -node globby sync                0m0.771s  200023
    -node current globSync mjs       0m0.684s  200023
    -node current glob syncStream    0m0.658s  200023
    -~~ async ~~
    -node fast-glob async            0m0.352s  200023
    -node globby async               0m0.516s  200023
    -node current glob async mjs     0m0.432s  200023
    -node current glob stream        0m0.384s  200023
    -
    ---- pattern: './**/**/**/**/**/**/**/**/*.txt' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.589s  200023
    -node globby sync                0m0.766s  200023
    -node current globSync mjs       0m0.682s  200023
    -node current glob syncStream    0m0.652s  200023
    -~~ async ~~
    -node fast-glob async            0m0.352s  200023
    -node globby async               0m0.523s  200023
    -node current glob async mjs     0m0.436s  200023
    -node current glob stream        0m0.380s  200023
    -
    ---- pattern: '**/*/*.txt' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.592s  200023
    -node globby sync                0m0.776s  200023
    -node current globSync mjs       0m0.691s  200023
    -node current glob syncStream    0m0.659s  200023
    -~~ async ~~
    -node fast-glob async            0m0.357s  200023
    -node globby async               0m0.513s  200023
    -node current glob async mjs     0m0.471s  200023
    -node current glob stream        0m0.424s  200023
    -
    ---- pattern: '**/*/**/*.txt' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.585s  200023
    -node globby sync                0m0.766s  200023
    -node current globSync mjs       0m0.694s  200023
    -node current glob syncStream    0m0.664s  200023
    -~~ async ~~
    -node fast-glob async            0m0.350s  200023
    -node globby async               0m0.514s  200023
    -node current glob async mjs     0m0.472s  200023
    -node current glob stream        0m0.424s  200023
    -
    ---- pattern: '**/[0-9]/**/*.txt' ---
    -~~ sync ~~
    -node fast-glob sync             0m0.544s  100000
    -node globby sync                0m0.636s  100000
    -node current globSync mjs       0m0.626s  100000
    -node current glob syncStream    0m0.621s  100000
    -~~ async ~~
    -node fast-glob async            0m0.322s  100000
    -node globby async               0m0.404s  100000
    -node current glob async mjs     0m0.360s  100000
    -node current glob stream        0m0.352s  100000
    -```
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/package.json b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/package.json
    deleted file mode 100644
    index c15df94a3582bf..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/package.json
    +++ /dev/null
    @@ -1,4 +0,0 @@
    -{
    -  "version": "10.3.3",
    -  "type": "commonjs"
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/bin.d.ts b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/bin.d.ts
    deleted file mode 100644
    index 34e005228653c8..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/bin.d.ts
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -#!/usr/bin/env node
    -export {};
    -//# sourceMappingURL=bin.d.ts.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/bin.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/bin.d.ts.map
    deleted file mode 100644
    index c10c656ec75109..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/bin.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../../../src/bin.ts"],"names":[],"mappings":""}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/bin.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/bin.js
    deleted file mode 100755
    index 4a8a88f2734d2e..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/bin.js
    +++ /dev/null
    @@ -1,270 +0,0 @@
    -#!/usr/bin/env node
    -"use strict";
    -Object.defineProperty(exports, "__esModule", { value: true });
    -const foreground_child_1 = require("foreground-child");
    -const fs_1 = require("fs");
    -const jackspeak_1 = require("jackspeak");
    -const package_json_1 = require("../package.json");
    -const index_js_1 = require("./index.js");
    -const j = (0, jackspeak_1.jack)({
    -    usage: 'glob [options] [ [ ...]]',
    -})
    -    .description(`
    -    Glob v${package_json_1.version}
    -
    -    Expand the positional glob expression arguments into any matching file
    -    system paths found.
    -  `)
    -    .opt({
    -    cmd: {
    -        short: 'c',
    -        hint: 'command',
    -        description: `Run the command provided, passing the glob expression
    -                    matches as arguments.`,
    -    },
    -})
    -    .opt({
    -    default: {
    -        short: 'p',
    -        hint: 'pattern',
    -        description: `If no positional arguments are provided, glob will use
    -                    this pattern`,
    -    },
    -})
    -    .flag({
    -    all: {
    -        short: 'A',
    -        description: `By default, the glob cli command will not expand any
    -                    arguments that are an exact match to a file on disk.
    -
    -                    This prevents double-expanding, in case the shell expands
    -                    an argument whose filename is a glob expression.
    -
    -                    For example, if 'app/*.ts' would match 'app/[id].ts', then
    -                    on Windows powershell or cmd.exe, 'glob app/*.ts' will
    -                    expand to 'app/[id].ts', as expected. However, in posix
    -                    shells such as bash or zsh, the shell will first expand
    -                    'app/*.ts' to a list of filenames. Then glob will look
    -                    for a file matching 'app/[id].ts' (ie, 'app/i.ts' or
    -                    'app/d.ts'), which is unexpected.
    -
    -                    Setting '--all' prevents this behavior, causing glob
    -                    to treat ALL patterns as glob expressions to be expanded,
    -                    even if they are an exact match to a file on disk.
    -
    -                    When setting this option, be sure to enquote arguments
    -                    so that the shell will not expand them prior to passing
    -                    them to the glob command process.
    -      `,
    -    },
    -    absolute: {
    -        short: 'a',
    -        description: 'Expand to absolute paths',
    -    },
    -    'dot-relative': {
    -        short: 'd',
    -        description: `Prepend './' on relative matches`,
    -    },
    -    mark: {
    -        short: 'm',
    -        description: `Append a / on any directories matched`,
    -    },
    -    posix: {
    -        short: 'x',
    -        description: `Always resolve to posix style paths, using '/' as the
    -                    directory separator, even on Windows. Drive letter
    -                    absolute matches on Windows will be expanded to their
    -                    full resolved UNC maths, eg instead of 'C:\\foo\\bar',
    -                    it will expand to '//?/C:/foo/bar'.
    -      `,
    -    },
    -    follow: {
    -        short: 'f',
    -        description: `Follow symlinked directories when expanding '**'`,
    -    },
    -    realpath: {
    -        short: 'R',
    -        description: `Call 'fs.realpath' on all of the results. In the case
    -                    of an entry that cannot be resolved, the entry is
    -                    omitted. This incurs a slight performance penalty, of
    -                    course, because of the added system calls.`,
    -    },
    -    stat: {
    -        short: 's',
    -        description: `Call 'fs.lstat' on all entries, whether required or not
    -                    to determine if it's a valid match.`,
    -    },
    -    'match-base': {
    -        short: 'b',
    -        description: `Perform a basename-only match if the pattern does not
    -                    contain any slash characters. That is, '*.js' would be
    -                    treated as equivalent to '**/*.js', matching js files
    -                    in all directories.
    -      `,
    -    },
    -    dot: {
    -        description: `Allow patterns to match files/directories that start
    -                    with '.', even if the pattern does not start with '.'
    -      `,
    -    },
    -    nobrace: {
    -        description: 'Do not expand {...} patterns',
    -    },
    -    nocase: {
    -        description: `Perform a case-insensitive match. This defaults to
    -                    'true' on macOS and Windows platforms, and false on
    -                    all others.
    -
    -                    Note: 'nocase' should only be explicitly set when it is
    -                    known that the filesystem's case sensitivity differs
    -                    from the platform default. If set 'true' on
    -                    case-insensitive file systems, then the walk may return
    -                    more or less results than expected.
    -      `,
    -    },
    -    nodir: {
    -        description: `Do not match directories, only files.
    -
    -                    Note: to *only* match directories, append a '/' at the
    -                    end of the pattern.
    -      `,
    -    },
    -    noext: {
    -        description: `Do not expand extglob patterns, such as '+(a|b)'`,
    -    },
    -    noglobstar: {
    -        description: `Do not expand '**' against multiple path portions.
    -                    Ie, treat it as a normal '*' instead.`,
    -    },
    -    'windows-path-no-escape': {
    -        description: `Use '\\' as a path separator *only*, and *never* as an
    -                    escape character. If set, all '\\' characters are
    -                    replaced with '/' in the pattern.`,
    -    },
    -})
    -    .num({
    -    'max-depth': {
    -        short: 'D',
    -        description: `Maximum depth to traverse from the current
    -                    working directory`,
    -    },
    -})
    -    .opt({
    -    cwd: {
    -        short: 'C',
    -        description: 'Current working directory to execute/match in',
    -        default: process.cwd(),
    -    },
    -    root: {
    -        short: 'r',
    -        description: `A string path resolved against the 'cwd', which is
    -                    used as the starting point for absolute patterns that
    -                    start with '/' (but not drive letters or UNC paths
    -                    on Windows).
    -
    -                    Note that this *doesn't* necessarily limit the walk to
    -                    the 'root' directory, and doesn't affect the cwd
    -                    starting point for non-absolute patterns. A pattern
    -                    containing '..' will still be able to traverse out of
    -                    the root directory, if it is not an actual root directory
    -                    on the filesystem, and any non-absolute patterns will
    -                    still be matched in the 'cwd'.
    -
    -                    To start absolute and non-absolute patterns in the same
    -                    path, you can use '--root=' to set it to the empty
    -                    string. However, be aware that on Windows systems, a
    -                    pattern like 'x:/*' or '//host/share/*' will *always*
    -                    start in the 'x:/' or '//host/share/' directory,
    -                    regardless of the --root setting.
    -      `,
    -    },
    -    platform: {
    -        description: `Defaults to the value of 'process.platform' if
    -                    available, or 'linux' if not. Setting --platform=win32
    -                    on non-Windows systems may cause strange behavior!`,
    -        validate: v => new Set([
    -            'aix',
    -            'android',
    -            'darwin',
    -            'freebsd',
    -            'haiku',
    -            'linux',
    -            'openbsd',
    -            'sunos',
    -            'win32',
    -            'cygwin',
    -            'netbsd',
    -        ]).has(v),
    -    },
    -})
    -    .optList({
    -    ignore: {
    -        short: 'i',
    -        description: `Glob patterns to ignore`,
    -    },
    -})
    -    .flag({
    -    debug: {
    -        short: 'v',
    -        description: `Output a huge amount of noisy debug information about
    -                    patterns as they are parsed and used to match files.`,
    -    },
    -})
    -    .flag({
    -    help: {
    -        short: 'h',
    -        description: 'Show this usage information',
    -    },
    -});
    -try {
    -    const { positionals, values } = j.parse();
    -    if (values.help) {
    -        console.log(j.usage());
    -        process.exit(0);
    -    }
    -    if (positionals.length === 0 && !values.default)
    -        throw 'No patterns provided';
    -    if (positionals.length === 0 && values.default)
    -        positionals.push(values.default);
    -    const patterns = values.all
    -        ? positionals
    -        : positionals.filter(p => !(0, fs_1.existsSync)(p));
    -    const matches = values.all ? [] : positionals.filter(p => (0, fs_1.existsSync)(p));
    -    const stream = (0, index_js_1.globStream)(patterns, {
    -        absolute: values.absolute,
    -        cwd: values.cwd,
    -        dot: values.dot,
    -        dotRelative: values['dot-relative'],
    -        follow: values.follow,
    -        ignore: values.ignore,
    -        mark: values.mark,
    -        matchBase: values['match-base'],
    -        maxDepth: values['max-depth'],
    -        nobrace: values.nobrace,
    -        nocase: values.nocase,
    -        nodir: values.nodir,
    -        noext: values.noext,
    -        noglobstar: values.noglobstar,
    -        platform: values.platform,
    -        realpath: values.realpath,
    -        root: values.root,
    -        stat: values.stat,
    -        debug: values.debug,
    -        posix: values.posix,
    -    });
    -    const cmd = values.cmd;
    -    if (!cmd) {
    -        matches.forEach(m => console.log(m));
    -        stream.on('data', f => console.log(f));
    -    }
    -    else {
    -        stream.on('data', f => matches.push(f));
    -        stream.on('end', () => (0, foreground_child_1.foregroundChild)(cmd, matches, { shell: true }));
    -    }
    -}
    -catch (e) {
    -    console.error(j.usage());
    -    console.error(e instanceof Error ? e.message : String(e));
    -    process.exit(1);
    -}
    -//# sourceMappingURL=bin.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/bin.js.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/bin.js.map
    deleted file mode 100644
    index e189acfd01b1a7..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/bin.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"bin.js","sourceRoot":"","sources":["../../../src/bin.ts"],"names":[],"mappings":";;;AACA,uDAAkD;AAClD,2BAA+B;AAC/B,yCAAgC;AAChC,kDAAyC;AACzC,yCAAuC;AAEvC,MAAM,CAAC,GAAG,IAAA,gBAAI,EAAC;IACb,KAAK,EAAE,4CAA4C;CACpD,CAAC;KACC,WAAW,CACV;YACQ,sBAAO;;;;GAIhB,CACA;KACA,GAAG,CAAC;IACH,GAAG,EAAE;QACH,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,SAAS;QACf,WAAW,EAAE;0CACuB;KACrC;CACF,CAAC;KACD,GAAG,CAAC;IACH,OAAO,EAAE;QACP,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,SAAS;QACf,WAAW,EAAE;iCACc;KAC5B;CACF,CAAC;KACD,IAAI,CAAC;IACJ,GAAG,EAAE;QACH,KAAK,EAAE,GAAG;QACV,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;OAqBZ;KACF;IACD,QAAQ,EAAE;QACR,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,0BAA0B;KACxC;IACD,cAAc,EAAE;QACd,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,kCAAkC;KAChD;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,uCAAuC;KACrD;IACD,KAAK,EAAE;QACL,KAAK,EAAE,GAAG;QACV,WAAW,EAAE;;;;;OAKZ;KACF;IAED,MAAM,EAAE;QACN,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,kDAAkD;KAChE;IACD,QAAQ,EAAE;QACR,KAAK,EAAE,GAAG;QACV,WAAW,EAAE;;;+DAG4C;KAC1D;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,GAAG;QACV,WAAW,EAAE;wDACqC;KACnD;IACD,YAAY,EAAE;QACZ,KAAK,EAAE,GAAG;QACV,WAAW,EAAE;;;;OAIZ;KACF;IAED,GAAG,EAAE;QACH,WAAW,EAAE;;OAEZ;KACF;IACD,OAAO,EAAE;QACP,WAAW,EAAE,8BAA8B;KAC5C;IACD,MAAM,EAAE;QACN,WAAW,EAAE;;;;;;;;;OASZ;KACF;IACD,KAAK,EAAE;QACL,WAAW,EAAE;;;;OAIZ;KACF;IACD,KAAK,EAAE;QACL,WAAW,EAAE,kDAAkD;KAChE;IACD,UAAU,EAAE;QACV,WAAW,EAAE;0DACuC;KACrD;IACD,wBAAwB,EAAE;QACxB,WAAW,EAAE;;sDAEmC;KACjD;CACF,CAAC;KACD,GAAG,CAAC;IACH,WAAW,EAAE;QACX,KAAK,EAAE,GAAG;QACV,WAAW,EAAE;sCACmB;KACjC;CACF,CAAC;KACD,GAAG,CAAC;IACH,GAAG,EAAE;QACH,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,+CAA+C;QAC5D,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE;KACvB;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,GAAG;QACV,WAAW,EAAE;;;;;;;;;;;;;;;;;;;OAmBZ;KACF;IACD,QAAQ,EAAE;QACR,WAAW,EAAE;;uEAEoD;QACjE,QAAQ,EAAE,CAAC,CAAC,EAAE,CACZ,IAAI,GAAG,CAAC;YACN,KAAK;YACL,SAAS;YACT,QAAQ;YACR,SAAS;YACT,OAAO;YACP,OAAO;YACP,SAAS;YACT,OAAO;YACP,OAAO;YACP,QAAQ;YACR,QAAQ;SACT,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;KACZ;CACF,CAAC;KACD,OAAO,CAAC;IACP,MAAM,EAAE;QACN,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,yBAAyB;KACvC;CACF,CAAC;KACD,IAAI,CAAC;IACJ,KAAK,EAAE;QACL,KAAK,EAAE,GAAG;QACV,WAAW,EAAE;yEACsD;KACpE;CACF,CAAC;KACD,IAAI,CAAC;IACJ,IAAI,EAAE;QACJ,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,6BAA6B;KAC3C;CACF,CAAC,CAAA;AAEJ,IAAI;IACF,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,CAAA;IACzC,IAAI,MAAM,CAAC,IAAI,EAAE;QACf,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;QACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;KAChB;IACD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;QAC7C,MAAM,sBAAsB,CAAA;IAC9B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO;QAC5C,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG;QACzB,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAA,eAAU,EAAC,CAAC,CAAC,CAAC,CAAA;IAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAA,eAAU,EAAC,CAAC,CAAC,CAAC,CAAA;IACxE,MAAM,MAAM,GAAG,IAAA,qBAAU,EAAC,QAAQ,EAAE;QAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,WAAW,EAAE,MAAM,CAAC,cAAc,CAAC;QACnC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,SAAS,EAAE,MAAM,CAAC,YAAY,CAAC;QAC/B,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC;QAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,QAAQ,EAAE,MAAM,CAAC,QAAuC;QACxD,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC,CAAA;IAEF,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAA;IACtB,IAAI,CAAC,GAAG,EAAE;QACR,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACpC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;KACvC;SAAM;QACL,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QACvC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAA,kCAAe,EAAC,GAAG,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;KACvE;CACF;AAAC,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;IACxB,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;CAChB","sourcesContent":["#!/usr/bin/env node\nimport { foregroundChild } from 'foreground-child'\nimport { existsSync } from 'fs'\nimport { jack } from 'jackspeak'\nimport { version } from '../package.json'\nimport { globStream } from './index.js'\n\nconst j = jack({\n  usage: 'glob [options] [ [ ...]]',\n})\n  .description(\n    `\n    Glob v${version}\n\n    Expand the positional glob expression arguments into any matching file\n    system paths found.\n  `\n  )\n  .opt({\n    cmd: {\n      short: 'c',\n      hint: 'command',\n      description: `Run the command provided, passing the glob expression\n                    matches as arguments.`,\n    },\n  })\n  .opt({\n    default: {\n      short: 'p',\n      hint: 'pattern',\n      description: `If no positional arguments are provided, glob will use\n                    this pattern`,\n    },\n  })\n  .flag({\n    all: {\n      short: 'A',\n      description: `By default, the glob cli command will not expand any\n                    arguments that are an exact match to a file on disk.\n\n                    This prevents double-expanding, in case the shell expands\n                    an argument whose filename is a glob expression.\n\n                    For example, if 'app/*.ts' would match 'app/[id].ts', then\n                    on Windows powershell or cmd.exe, 'glob app/*.ts' will\n                    expand to 'app/[id].ts', as expected. However, in posix\n                    shells such as bash or zsh, the shell will first expand\n                    'app/*.ts' to a list of filenames. Then glob will look\n                    for a file matching 'app/[id].ts' (ie, 'app/i.ts' or\n                    'app/d.ts'), which is unexpected.\n\n                    Setting '--all' prevents this behavior, causing glob\n                    to treat ALL patterns as glob expressions to be expanded,\n                    even if they are an exact match to a file on disk.\n\n                    When setting this option, be sure to enquote arguments\n                    so that the shell will not expand them prior to passing\n                    them to the glob command process.\n      `,\n    },\n    absolute: {\n      short: 'a',\n      description: 'Expand to absolute paths',\n    },\n    'dot-relative': {\n      short: 'd',\n      description: `Prepend './' on relative matches`,\n    },\n    mark: {\n      short: 'm',\n      description: `Append a / on any directories matched`,\n    },\n    posix: {\n      short: 'x',\n      description: `Always resolve to posix style paths, using '/' as the\n                    directory separator, even on Windows. Drive letter\n                    absolute matches on Windows will be expanded to their\n                    full resolved UNC maths, eg instead of 'C:\\\\foo\\\\bar',\n                    it will expand to '//?/C:/foo/bar'.\n      `,\n    },\n\n    follow: {\n      short: 'f',\n      description: `Follow symlinked directories when expanding '**'`,\n    },\n    realpath: {\n      short: 'R',\n      description: `Call 'fs.realpath' on all of the results. In the case\n                    of an entry that cannot be resolved, the entry is\n                    omitted. This incurs a slight performance penalty, of\n                    course, because of the added system calls.`,\n    },\n    stat: {\n      short: 's',\n      description: `Call 'fs.lstat' on all entries, whether required or not\n                    to determine if it's a valid match.`,\n    },\n    'match-base': {\n      short: 'b',\n      description: `Perform a basename-only match if the pattern does not\n                    contain any slash characters. That is, '*.js' would be\n                    treated as equivalent to '**/*.js', matching js files\n                    in all directories.\n      `,\n    },\n\n    dot: {\n      description: `Allow patterns to match files/directories that start\n                    with '.', even if the pattern does not start with '.'\n      `,\n    },\n    nobrace: {\n      description: 'Do not expand {...} patterns',\n    },\n    nocase: {\n      description: `Perform a case-insensitive match. This defaults to\n                    'true' on macOS and Windows platforms, and false on\n                    all others.\n\n                    Note: 'nocase' should only be explicitly set when it is\n                    known that the filesystem's case sensitivity differs\n                    from the platform default. If set 'true' on\n                    case-insensitive file systems, then the walk may return\n                    more or less results than expected.\n      `,\n    },\n    nodir: {\n      description: `Do not match directories, only files.\n\n                    Note: to *only* match directories, append a '/' at the\n                    end of the pattern.\n      `,\n    },\n    noext: {\n      description: `Do not expand extglob patterns, such as '+(a|b)'`,\n    },\n    noglobstar: {\n      description: `Do not expand '**' against multiple path portions.\n                    Ie, treat it as a normal '*' instead.`,\n    },\n    'windows-path-no-escape': {\n      description: `Use '\\\\' as a path separator *only*, and *never* as an\n                    escape character. If set, all '\\\\' characters are\n                    replaced with '/' in the pattern.`,\n    },\n  })\n  .num({\n    'max-depth': {\n      short: 'D',\n      description: `Maximum depth to traverse from the current\n                    working directory`,\n    },\n  })\n  .opt({\n    cwd: {\n      short: 'C',\n      description: 'Current working directory to execute/match in',\n      default: process.cwd(),\n    },\n    root: {\n      short: 'r',\n      description: `A string path resolved against the 'cwd', which is\n                    used as the starting point for absolute patterns that\n                    start with '/' (but not drive letters or UNC paths\n                    on Windows).\n\n                    Note that this *doesn't* necessarily limit the walk to\n                    the 'root' directory, and doesn't affect the cwd\n                    starting point for non-absolute patterns. A pattern\n                    containing '..' will still be able to traverse out of\n                    the root directory, if it is not an actual root directory\n                    on the filesystem, and any non-absolute patterns will\n                    still be matched in the 'cwd'.\n\n                    To start absolute and non-absolute patterns in the same\n                    path, you can use '--root=' to set it to the empty\n                    string. However, be aware that on Windows systems, a\n                    pattern like 'x:/*' or '//host/share/*' will *always*\n                    start in the 'x:/' or '//host/share/' directory,\n                    regardless of the --root setting.\n      `,\n    },\n    platform: {\n      description: `Defaults to the value of 'process.platform' if\n                    available, or 'linux' if not. Setting --platform=win32\n                    on non-Windows systems may cause strange behavior!`,\n      validate: v =>\n        new Set([\n          'aix',\n          'android',\n          'darwin',\n          'freebsd',\n          'haiku',\n          'linux',\n          'openbsd',\n          'sunos',\n          'win32',\n          'cygwin',\n          'netbsd',\n        ]).has(v),\n    },\n  })\n  .optList({\n    ignore: {\n      short: 'i',\n      description: `Glob patterns to ignore`,\n    },\n  })\n  .flag({\n    debug: {\n      short: 'v',\n      description: `Output a huge amount of noisy debug information about\n                    patterns as they are parsed and used to match files.`,\n    },\n  })\n  .flag({\n    help: {\n      short: 'h',\n      description: 'Show this usage information',\n    },\n  })\n\ntry {\n  const { positionals, values } = j.parse()\n  if (values.help) {\n    console.log(j.usage())\n    process.exit(0)\n  }\n  if (positionals.length === 0 && !values.default)\n    throw 'No patterns provided'\n  if (positionals.length === 0 && values.default)\n    positionals.push(values.default)\n  const patterns = values.all\n    ? positionals\n    : positionals.filter(p => !existsSync(p))\n  const matches = values.all ? [] : positionals.filter(p => existsSync(p))\n  const stream = globStream(patterns, {\n    absolute: values.absolute,\n    cwd: values.cwd,\n    dot: values.dot,\n    dotRelative: values['dot-relative'],\n    follow: values.follow,\n    ignore: values.ignore,\n    mark: values.mark,\n    matchBase: values['match-base'],\n    maxDepth: values['max-depth'],\n    nobrace: values.nobrace,\n    nocase: values.nocase,\n    nodir: values.nodir,\n    noext: values.noext,\n    noglobstar: values.noglobstar,\n    platform: values.platform as undefined | NodeJS.Platform,\n    realpath: values.realpath,\n    root: values.root,\n    stat: values.stat,\n    debug: values.debug,\n    posix: values.posix,\n  })\n\n  const cmd = values.cmd\n  if (!cmd) {\n    matches.forEach(m => console.log(m))\n    stream.on('data', f => console.log(f))\n  } else {\n    stream.on('data', f => matches.push(f))\n    stream.on('end', () => foregroundChild(cmd, matches, { shell: true }))\n  }\n} catch (e) {\n  console.error(j.usage())\n  console.error(e instanceof Error ? e.message : String(e))\n  process.exit(1)\n}\n"]}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/glob.d.ts b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/glob.d.ts
    deleted file mode 100644
    index a8b3da7722b652..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/glob.d.ts
    +++ /dev/null
    @@ -1,344 +0,0 @@
    -/// 
    -import { Minimatch } from 'minimatch';
    -import { Minipass } from 'minipass';
    -import { FSOption, Path, PathScurry } from 'path-scurry';
    -import { IgnoreLike } from './ignore.js';
    -import { Pattern } from './pattern.js';
    -export type MatchSet = Minimatch['set'];
    -export type GlobParts = Exclude;
    -/**
    - * A `GlobOptions` object may be provided to any of the exported methods, and
    - * must be provided to the `Glob` constructor.
    - *
    - * All options are optional, boolean, and false by default, unless otherwise
    - * noted.
    - *
    - * All resolved options are added to the Glob object as properties.
    - *
    - * If you are running many `glob` operations, you can pass a Glob object as the
    - * `options` argument to a subsequent operation to share the previously loaded
    - * cache.
    - */
    -export interface GlobOptions {
    -    /**
    -     * Set to `true` to always receive absolute paths for
    -     * matched files. Set to `false` to always return relative paths.
    -     *
    -     * When this option is not set, absolute paths are returned for patterns
    -     * that are absolute, and otherwise paths are returned that are relative
    -     * to the `cwd` setting.
    -     *
    -     * This does _not_ make an extra system call to get
    -     * the realpath, it only does string path resolution.
    -     *
    -     * Conflicts with {@link withFileTypes}
    -     */
    -    absolute?: boolean;
    -    /**
    -     * Set to false to enable {@link windowsPathsNoEscape}
    -     *
    -     * @deprecated
    -     */
    -    allowWindowsEscape?: boolean;
    -    /**
    -     * The current working directory in which to search. Defaults to
    -     * `process.cwd()`.
    -     *
    -     * May be eiher a string path or a `file://` URL object or string.
    -     */
    -    cwd?: string | URL;
    -    /**
    -     * Include `.dot` files in normal matches and `globstar`
    -     * matches. Note that an explicit dot in a portion of the pattern
    -     * will always match dot files.
    -     */
    -    dot?: boolean;
    -    /**
    -     * Prepend all relative path strings with `./` (or `.\` on Windows).
    -     *
    -     * Without this option, returned relative paths are "bare", so instead of
    -     * returning `'./foo/bar'`, they are returned as `'foo/bar'`.
    -     *
    -     * Relative patterns starting with `'../'` are not prepended with `./`, even
    -     * if this option is set.
    -     */
    -    dotRelative?: boolean;
    -    /**
    -     * Follow symlinked directories when expanding `**`
    -     * patterns. This can result in a lot of duplicate references in
    -     * the presence of cyclic links, and make performance quite bad.
    -     *
    -     * By default, a `**` in a pattern will follow 1 symbolic link if
    -     * it is not the first item in the pattern, or none if it is the
    -     * first item in the pattern, following the same behavior as Bash.
    -     */
    -    follow?: boolean;
    -    /**
    -     * string or string[], or an object with `ignore` and `ignoreChildren`
    -     * methods.
    -     *
    -     * If a string or string[] is provided, then this is treated as a glob
    -     * pattern or array of glob patterns to exclude from matches. To ignore all
    -     * children within a directory, as well as the entry itself, append `'/**'`
    -     * to the ignore pattern.
    -     *
    -     * **Note** `ignore` patterns are _always_ in `dot:true` mode, regardless of
    -     * any other settings.
    -     *
    -     * If an object is provided that has `ignored(path)` and/or
    -     * `childrenIgnored(path)` methods, then these methods will be called to
    -     * determine whether any Path is a match or if its children should be
    -     * traversed, respectively.
    -     */
    -    ignore?: string | string[] | IgnoreLike;
    -    /**
    -     * Treat brace expansion like `{a,b}` as a "magic" pattern. Has no
    -     * effect if {@link nobrace} is set.
    -     *
    -     * Only has effect on the {@link hasMagic} function.
    -     */
    -    magicalBraces?: boolean;
    -    /**
    -     * Add a `/` character to directory matches. Note that this requires
    -     * additional stat calls in some cases.
    -     */
    -    mark?: boolean;
    -    /**
    -     * Perform a basename-only match if the pattern does not contain any slash
    -     * characters. That is, `*.js` would be treated as equivalent to
    -     * `**\/*.js`, matching all js files in all directories.
    -     */
    -    matchBase?: boolean;
    -    /**
    -     * Limit the directory traversal to a given depth below the cwd.
    -     * Note that this does NOT prevent traversal to sibling folders,
    -     * root patterns, and so on. It only limits the maximum folder depth
    -     * that the walk will descend, relative to the cwd.
    -     */
    -    maxDepth?: number;
    -    /**
    -     * Do not expand `{a,b}` and `{1..3}` brace sets.
    -     */
    -    nobrace?: boolean;
    -    /**
    -     * Perform a case-insensitive match. This defaults to `true` on macOS and
    -     * Windows systems, and `false` on all others.
    -     *
    -     * **Note** `nocase` should only be explicitly set when it is
    -     * known that the filesystem's case sensitivity differs from the
    -     * platform default. If set `true` on case-sensitive file
    -     * systems, or `false` on case-insensitive file systems, then the
    -     * walk may return more or less results than expected.
    -     */
    -    nocase?: boolean;
    -    /**
    -     * Do not match directories, only files. (Note: to match
    -     * _only_ directories, put a `/` at the end of the pattern.)
    -     */
    -    nodir?: boolean;
    -    /**
    -     * Do not match "extglob" patterns such as `+(a|b)`.
    -     */
    -    noext?: boolean;
    -    /**
    -     * Do not match `**` against multiple filenames. (Ie, treat it as a normal
    -     * `*` instead.)
    -     *
    -     * Conflicts with {@link matchBase}
    -     */
    -    noglobstar?: boolean;
    -    /**
    -     * Defaults to value of `process.platform` if available, or `'linux'` if
    -     * not. Setting `platform:'win32'` on non-Windows systems may cause strange
    -     * behavior.
    -     */
    -    platform?: NodeJS.Platform;
    -    /**
    -     * Set to true to call `fs.realpath` on all of the
    -     * results. In the case of an entry that cannot be resolved, the
    -     * entry is omitted. This incurs a slight performance penalty, of
    -     * course, because of the added system calls.
    -     */
    -    realpath?: boolean;
    -    /**
    -     *
    -     * A string path resolved against the `cwd` option, which
    -     * is used as the starting point for absolute patterns that start
    -     * with `/`, (but not drive letters or UNC paths on Windows).
    -     *
    -     * Note that this _doesn't_ necessarily limit the walk to the
    -     * `root` directory, and doesn't affect the cwd starting point for
    -     * non-absolute patterns. A pattern containing `..` will still be
    -     * able to traverse out of the root directory, if it is not an
    -     * actual root directory on the filesystem, and any non-absolute
    -     * patterns will be matched in the `cwd`. For example, the
    -     * pattern `/../*` with `{root:'/some/path'}` will return all
    -     * files in `/some`, not all files in `/some/path`. The pattern
    -     * `*` with `{root:'/some/path'}` will return all the entries in
    -     * the cwd, not the entries in `/some/path`.
    -     *
    -     * To start absolute and non-absolute patterns in the same
    -     * path, you can use `{root:''}`. However, be aware that on
    -     * Windows systems, a pattern like `x:/*` or `//host/share/*` will
    -     * _always_ start in the `x:/` or `//host/share` directory,
    -     * regardless of the `root` setting.
    -     */
    -    root?: string;
    -    /**
    -     * A [PathScurry](http://npm.im/path-scurry) object used
    -     * to traverse the file system. If the `nocase` option is set
    -     * explicitly, then any provided `scurry` object must match this
    -     * setting.
    -     */
    -    scurry?: PathScurry;
    -    /**
    -     * Call `lstat()` on all entries, whether required or not to determine
    -     * if it's a valid match. When used with {@link withFileTypes}, this means
    -     * that matches will include data such as modified time, permissions, and
    -     * so on.  Note that this will incur a performance cost due to the added
    -     * system calls.
    -     */
    -    stat?: boolean;
    -    /**
    -     * An AbortSignal which will cancel the Glob walk when
    -     * triggered.
    -     */
    -    signal?: AbortSignal;
    -    /**
    -     * Use `\\` as a path separator _only_, and
    -     *  _never_ as an escape character. If set, all `\\` characters are
    -     *  replaced with `/` in the pattern.
    -     *
    -     *  Note that this makes it **impossible** to match against paths
    -     *  containing literal glob pattern characters, but allows matching
    -     *  with patterns constructed using `path.join()` and
    -     *  `path.resolve()` on Windows platforms, mimicking the (buggy!)
    -     *  behavior of Glob v7 and before on Windows. Please use with
    -     *  caution, and be mindful of [the caveat below about Windows
    -     *  paths](#windows). (For legacy reasons, this is also set if
    -     *  `allowWindowsEscape` is set to the exact value `false`.)
    -     */
    -    windowsPathsNoEscape?: boolean;
    -    /**
    -     * Return [PathScurry](http://npm.im/path-scurry)
    -     * `Path` objects instead of strings. These are similar to a
    -     * NodeJS `Dirent` object, but with additional methods and
    -     * properties.
    -     *
    -     * Conflicts with {@link absolute}
    -     */
    -    withFileTypes?: boolean;
    -    /**
    -     * An fs implementation to override some or all of the defaults.  See
    -     * http://npm.im/path-scurry for details about what can be overridden.
    -     */
    -    fs?: FSOption;
    -    /**
    -     * Just passed along to Minimatch.  Note that this makes all pattern
    -     * matching operations slower and *extremely* noisy.
    -     */
    -    debug?: boolean;
    -    /**
    -     * Return `/` delimited paths, even on Windows.
    -     *
    -     * On posix systems, this has no effect.  But, on Windows, it means that
    -     * paths will be `/` delimited, and absolute paths will be their full
    -     * resolved UNC forms, eg instead of `'C:\\foo\\bar'`, it would return
    -     * `'//?/C:/foo/bar'`
    -     */
    -    posix?: boolean;
    -}
    -export type GlobOptionsWithFileTypesTrue = GlobOptions & {
    -    withFileTypes: true;
    -    absolute?: undefined;
    -    mark?: undefined;
    -    posix?: undefined;
    -};
    -export type GlobOptionsWithFileTypesFalse = GlobOptions & {
    -    withFileTypes?: false;
    -};
    -export type GlobOptionsWithFileTypesUnset = GlobOptions & {
    -    withFileTypes?: undefined;
    -};
    -export type Result = Opts extends GlobOptionsWithFileTypesTrue ? Path : Opts extends GlobOptionsWithFileTypesFalse ? string : Opts extends GlobOptionsWithFileTypesUnset ? string : string | Path;
    -export type Results = Result[];
    -export type FileTypes = Opts extends GlobOptionsWithFileTypesTrue ? true : Opts extends GlobOptionsWithFileTypesFalse ? false : Opts extends GlobOptionsWithFileTypesUnset ? false : boolean;
    -/**
    - * An object that can perform glob pattern traversals.
    - */
    -export declare class Glob implements GlobOptions {
    -    absolute?: boolean;
    -    cwd: string;
    -    root?: string;
    -    dot: boolean;
    -    dotRelative: boolean;
    -    follow: boolean;
    -    ignore?: string | string[] | IgnoreLike;
    -    magicalBraces: boolean;
    -    mark?: boolean;
    -    matchBase: boolean;
    -    maxDepth: number;
    -    nobrace: boolean;
    -    nocase: boolean;
    -    nodir: boolean;
    -    noext: boolean;
    -    noglobstar: boolean;
    -    pattern: string[];
    -    platform: NodeJS.Platform;
    -    realpath: boolean;
    -    scurry: PathScurry;
    -    stat: boolean;
    -    signal?: AbortSignal;
    -    windowsPathsNoEscape: boolean;
    -    withFileTypes: FileTypes;
    -    /**
    -     * The options provided to the constructor.
    -     */
    -    opts: Opts;
    -    /**
    -     * An array of parsed immutable {@link Pattern} objects.
    -     */
    -    patterns: Pattern[];
    -    /**
    -     * All options are stored as properties on the `Glob` object.
    -     *
    -     * See {@link GlobOptions} for full options descriptions.
    -     *
    -     * Note that a previous `Glob` object can be passed as the
    -     * `GlobOptions` to another `Glob` instantiation to re-use settings
    -     * and caches with a new pattern.
    -     *
    -     * Traversal functions can be called multiple times to run the walk
    -     * again.
    -     */
    -    constructor(pattern: string | string[], opts: Opts);
    -    /**
    -     * Returns a Promise that resolves to the results array.
    -     */
    -    walk(): Promise>;
    -    /**
    -     * synchronous {@link Glob.walk}
    -     */
    -    walkSync(): Results;
    -    /**
    -     * Stream results asynchronously.
    -     */
    -    stream(): Minipass, Result>;
    -    /**
    -     * Stream results synchronously.
    -     */
    -    streamSync(): Minipass, Result>;
    -    /**
    -     * Default sync iteration function. Returns a Generator that
    -     * iterates over the results.
    -     */
    -    iterateSync(): Generator, void, void>;
    -    [Symbol.iterator](): Generator, void, void>;
    -    /**
    -     * Default async iteration function. Returns an AsyncGenerator that
    -     * iterates over the results.
    -     */
    -    iterate(): AsyncGenerator, void, void>;
    -    [Symbol.asyncIterator](): AsyncGenerator, void, void>;
    -}
    -//# sourceMappingURL=glob.d.ts.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/glob.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/glob.d.ts.map
    deleted file mode 100644
    index 6353d8b3c47126..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/glob.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../../src/glob.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,WAAW,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EACL,QAAQ,EACR,IAAI,EACJ,UAAU,EAIX,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAGtC,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAA;AACvC,MAAM,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAA;AAWlE;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAE5B;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;IAElB;;;;OAIG;IACH,GAAG,CAAC,EAAE,OAAO,CAAA;IAEb;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IAErB;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAEhB;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,UAAU,CAAA;IAEvC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IAEvB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IAEd;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IAEnB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAEhB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IAEpB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;IAE1B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb;;;;;OAKG;IACH,MAAM,CAAC,EAAE,UAAU,CAAA;IAEnB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IAEd;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAA;IAEpB;;;;;;;;;;;;;OAaG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAE9B;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IAEvB;;;OAGG;IACH,EAAE,CAAC,EAAE,QAAQ,CAAA;IAEb;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,MAAM,4BAA4B,GAAG,WAAW,GAAG;IACvD,aAAa,EAAE,IAAI,CAAA;IAEnB,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG,WAAW,GAAG;IACxD,aAAa,CAAC,EAAE,KAAK,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG,WAAW,GAAG;IACxD,aAAa,CAAC,EAAE,SAAS,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,MAAM,CAAC,IAAI,IAAI,IAAI,SAAS,4BAA4B,GAChE,IAAI,GACJ,IAAI,SAAS,6BAA6B,GAC1C,MAAM,GACN,IAAI,SAAS,6BAA6B,GAC1C,MAAM,GACN,MAAM,GAAG,IAAI,CAAA;AACjB,MAAM,MAAM,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAA;AAE1C,MAAM,MAAM,SAAS,CAAC,IAAI,IAAI,IAAI,SAAS,4BAA4B,GACnE,IAAI,GACJ,IAAI,SAAS,6BAA6B,GAC1C,KAAK,GACL,IAAI,SAAS,6BAA6B,GAC1C,KAAK,GACL,OAAO,CAAA;AAEX;;GAEG;AACH,qBAAa,IAAI,CAAC,IAAI,SAAS,WAAW,CAAE,YAAW,WAAW;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,OAAO,CAAA;IACZ,WAAW,EAAE,OAAO,CAAA;IACpB,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,UAAU,CAAA;IACvC,aAAa,EAAE,OAAO,CAAA;IACtB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,OAAO,CAAA;IACf,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,EAAE,OAAO,CAAA;IACd,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAA;IACzB,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,UAAU,CAAA;IAClB,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,oBAAoB,EAAE,OAAO,CAAA;IAC7B,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;IAE9B;;OAEG;IACH,IAAI,EAAE,IAAI,CAAA;IAEV;;OAEG;IACH,QAAQ,EAAE,OAAO,EAAE,CAAA;IAEnB;;;;;;;;;;;OAWG;gBACS,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI;IAwHlD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAmBpC;;OAEG;IACH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAezB;;OAEG;IACH,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAa9C;;OAEG;IACH,UAAU,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAalD;;;OAGG;IACH,WAAW,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;IAGlD,CAAC,MAAM,CAAC,QAAQ,CAAC;IAIjB;;;OAGG;IACH,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;IAGnD,CAAC,MAAM,CAAC,aAAa,CAAC;CAGvB"}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/glob.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/glob.js
    deleted file mode 100644
    index eb37c6b9a6601e..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/glob.js
    +++ /dev/null
    @@ -1,238 +0,0 @@
    -"use strict";
    -Object.defineProperty(exports, "__esModule", { value: true });
    -exports.Glob = void 0;
    -const minimatch_1 = require("minimatch");
    -const path_scurry_1 = require("path-scurry");
    -const url_1 = require("url");
    -const pattern_js_1 = require("./pattern.js");
    -const walker_js_1 = require("./walker.js");
    -// if no process global, just call it linux.
    -// so we default to case-sensitive, / separators
    -const defaultPlatform = typeof process === 'object' &&
    -    process &&
    -    typeof process.platform === 'string'
    -    ? process.platform
    -    : 'linux';
    -/**
    - * An object that can perform glob pattern traversals.
    - */
    -class Glob {
    -    absolute;
    -    cwd;
    -    root;
    -    dot;
    -    dotRelative;
    -    follow;
    -    ignore;
    -    magicalBraces;
    -    mark;
    -    matchBase;
    -    maxDepth;
    -    nobrace;
    -    nocase;
    -    nodir;
    -    noext;
    -    noglobstar;
    -    pattern;
    -    platform;
    -    realpath;
    -    scurry;
    -    stat;
    -    signal;
    -    windowsPathsNoEscape;
    -    withFileTypes;
    -    /**
    -     * The options provided to the constructor.
    -     */
    -    opts;
    -    /**
    -     * An array of parsed immutable {@link Pattern} objects.
    -     */
    -    patterns;
    -    /**
    -     * All options are stored as properties on the `Glob` object.
    -     *
    -     * See {@link GlobOptions} for full options descriptions.
    -     *
    -     * Note that a previous `Glob` object can be passed as the
    -     * `GlobOptions` to another `Glob` instantiation to re-use settings
    -     * and caches with a new pattern.
    -     *
    -     * Traversal functions can be called multiple times to run the walk
    -     * again.
    -     */
    -    constructor(pattern, opts) {
    -        /* c8 ignore start */
    -        if (!opts)
    -            throw new TypeError('glob options required');
    -        /* c8 ignore stop */
    -        this.withFileTypes = !!opts.withFileTypes;
    -        this.signal = opts.signal;
    -        this.follow = !!opts.follow;
    -        this.dot = !!opts.dot;
    -        this.dotRelative = !!opts.dotRelative;
    -        this.nodir = !!opts.nodir;
    -        this.mark = !!opts.mark;
    -        if (!opts.cwd) {
    -            this.cwd = '';
    -        }
    -        else if (opts.cwd instanceof URL || opts.cwd.startsWith('file://')) {
    -            opts.cwd = (0, url_1.fileURLToPath)(opts.cwd);
    -        }
    -        this.cwd = opts.cwd || '';
    -        this.root = opts.root;
    -        this.magicalBraces = !!opts.magicalBraces;
    -        this.nobrace = !!opts.nobrace;
    -        this.noext = !!opts.noext;
    -        this.realpath = !!opts.realpath;
    -        this.absolute = opts.absolute;
    -        this.noglobstar = !!opts.noglobstar;
    -        this.matchBase = !!opts.matchBase;
    -        this.maxDepth =
    -            typeof opts.maxDepth === 'number' ? opts.maxDepth : Infinity;
    -        this.stat = !!opts.stat;
    -        this.ignore = opts.ignore;
    -        if (this.withFileTypes && this.absolute !== undefined) {
    -            throw new Error('cannot set absolute and withFileTypes:true');
    -        }
    -        if (typeof pattern === 'string') {
    -            pattern = [pattern];
    -        }
    -        this.windowsPathsNoEscape =
    -            !!opts.windowsPathsNoEscape ||
    -                opts.allowWindowsEscape === false;
    -        if (this.windowsPathsNoEscape) {
    -            pattern = pattern.map(p => p.replace(/\\/g, '/'));
    -        }
    -        if (this.matchBase) {
    -            if (opts.noglobstar) {
    -                throw new TypeError('base matching requires globstar');
    -            }
    -            pattern = pattern.map(p => (p.includes('/') ? p : `./**/${p}`));
    -        }
    -        this.pattern = pattern;
    -        this.platform = opts.platform || defaultPlatform;
    -        this.opts = { ...opts, platform: this.platform };
    -        if (opts.scurry) {
    -            this.scurry = opts.scurry;
    -            if (opts.nocase !== undefined &&
    -                opts.nocase !== opts.scurry.nocase) {
    -                throw new Error('nocase option contradicts provided scurry option');
    -            }
    -        }
    -        else {
    -            const Scurry = opts.platform === 'win32'
    -                ? path_scurry_1.PathScurryWin32
    -                : opts.platform === 'darwin'
    -                    ? path_scurry_1.PathScurryDarwin
    -                    : opts.platform
    -                        ? path_scurry_1.PathScurryPosix
    -                        : path_scurry_1.PathScurry;
    -            this.scurry = new Scurry(this.cwd, {
    -                nocase: opts.nocase,
    -                fs: opts.fs,
    -            });
    -        }
    -        this.nocase = this.scurry.nocase;
    -        // If you do nocase:true on a case-sensitive file system, then
    -        // we need to use regexps instead of strings for non-magic
    -        // path portions, because statting `aBc` won't return results
    -        // for the file `AbC` for example.
    -        const nocaseMagicOnly = this.platform === 'darwin' || this.platform === 'win32';
    -        const mmo = {
    -            // default nocase based on platform
    -            ...opts,
    -            dot: this.dot,
    -            matchBase: this.matchBase,
    -            nobrace: this.nobrace,
    -            nocase: this.nocase,
    -            nocaseMagicOnly,
    -            nocomment: true,
    -            noext: this.noext,
    -            nonegate: true,
    -            optimizationLevel: 2,
    -            platform: this.platform,
    -            windowsPathsNoEscape: this.windowsPathsNoEscape,
    -            debug: !!this.opts.debug,
    -        };
    -        const mms = this.pattern.map(p => new minimatch_1.Minimatch(p, mmo));
    -        const [matchSet, globParts] = mms.reduce((set, m) => {
    -            set[0].push(...m.set);
    -            set[1].push(...m.globParts);
    -            return set;
    -        }, [[], []]);
    -        this.patterns = matchSet.map((set, i) => {
    -            return new pattern_js_1.Pattern(set, globParts[i], 0, this.platform);
    -        });
    -    }
    -    async walk() {
    -        // Walkers always return array of Path objects, so we just have to
    -        // coerce them into the right shape.  It will have already called
    -        // realpath() if the option was set to do so, so we know that's cached.
    -        // start out knowing the cwd, at least
    -        return [
    -            ...(await new walker_js_1.GlobWalker(this.patterns, this.scurry.cwd, {
    -                ...this.opts,
    -                maxDepth: this.maxDepth !== Infinity
    -                    ? this.maxDepth + this.scurry.cwd.depth()
    -                    : Infinity,
    -                platform: this.platform,
    -                nocase: this.nocase,
    -            }).walk()),
    -        ];
    -    }
    -    walkSync() {
    -        return [
    -            ...new walker_js_1.GlobWalker(this.patterns, this.scurry.cwd, {
    -                ...this.opts,
    -                maxDepth: this.maxDepth !== Infinity
    -                    ? this.maxDepth + this.scurry.cwd.depth()
    -                    : Infinity,
    -                platform: this.platform,
    -                nocase: this.nocase,
    -            }).walkSync(),
    -        ];
    -    }
    -    stream() {
    -        return new walker_js_1.GlobStream(this.patterns, this.scurry.cwd, {
    -            ...this.opts,
    -            maxDepth: this.maxDepth !== Infinity
    -                ? this.maxDepth + this.scurry.cwd.depth()
    -                : Infinity,
    -            platform: this.platform,
    -            nocase: this.nocase,
    -        }).stream();
    -    }
    -    streamSync() {
    -        return new walker_js_1.GlobStream(this.patterns, this.scurry.cwd, {
    -            ...this.opts,
    -            maxDepth: this.maxDepth !== Infinity
    -                ? this.maxDepth + this.scurry.cwd.depth()
    -                : Infinity,
    -            platform: this.platform,
    -            nocase: this.nocase,
    -        }).streamSync();
    -    }
    -    /**
    -     * Default sync iteration function. Returns a Generator that
    -     * iterates over the results.
    -     */
    -    iterateSync() {
    -        return this.streamSync()[Symbol.iterator]();
    -    }
    -    [Symbol.iterator]() {
    -        return this.iterateSync();
    -    }
    -    /**
    -     * Default async iteration function. Returns an AsyncGenerator that
    -     * iterates over the results.
    -     */
    -    iterate() {
    -        return this.stream()[Symbol.asyncIterator]();
    -    }
    -    [Symbol.asyncIterator]() {
    -        return this.iterate();
    -    }
    -}
    -exports.Glob = Glob;
    -//# sourceMappingURL=glob.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/glob.js.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/glob.js.map
    deleted file mode 100644
    index 7a7a9b28627480..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/glob.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"glob.js","sourceRoot":"","sources":["../../../src/glob.ts"],"names":[],"mappings":";;;AAAA,yCAAuD;AAEvD,6CAOoB;AACpB,6BAAmC;AAEnC,6CAAsC;AACtC,2CAAoD;AAKpD,4CAA4C;AAC5C,gDAAgD;AAChD,MAAM,eAAe,GACnB,OAAO,OAAO,KAAK,QAAQ;IAC3B,OAAO;IACP,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ;IAClC,CAAC,CAAC,OAAO,CAAC,QAAQ;IAClB,CAAC,CAAC,OAAO,CAAA;AAgTb;;GAEG;AACH,MAAa,IAAI;IACf,QAAQ,CAAU;IAClB,GAAG,CAAQ;IACX,IAAI,CAAS;IACb,GAAG,CAAS;IACZ,WAAW,CAAS;IACpB,MAAM,CAAS;IACf,MAAM,CAAiC;IACvC,aAAa,CAAS;IACtB,IAAI,CAAU;IACd,SAAS,CAAS;IAClB,QAAQ,CAAQ;IAChB,OAAO,CAAS;IAChB,MAAM,CAAS;IACf,KAAK,CAAS;IACd,KAAK,CAAS;IACd,UAAU,CAAS;IACnB,OAAO,CAAU;IACjB,QAAQ,CAAiB;IACzB,QAAQ,CAAS;IACjB,MAAM,CAAY;IAClB,IAAI,CAAS;IACb,MAAM,CAAc;IACpB,oBAAoB,CAAS;IAC7B,aAAa,CAAiB;IAE9B;;OAEG;IACH,IAAI,CAAM;IAEV;;OAEG;IACH,QAAQ,CAAW;IAEnB;;;;;;;;;;;OAWG;IACH,YAAY,OAA0B,EAAE,IAAU;QAChD,qBAAqB;QACrB,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,SAAS,CAAC,uBAAuB,CAAC,CAAA;QACvD,oBAAoB;QACpB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,aAAgC,CAAA;QAC5D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QACzB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAA;QAC3B,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAA;QACrB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,CAAA;QACrC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAA;QACzB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;QACvB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,IAAI,CAAC,GAAG,GAAG,EAAE,CAAA;SACd;aAAM,IAAI,IAAI,CAAC,GAAG,YAAY,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;YACpE,IAAI,CAAC,GAAG,GAAG,IAAA,mBAAa,EAAC,IAAI,CAAC,GAAG,CAAC,CAAA;SACnC;QACD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,CAAA;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACrB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAA;QACzC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAA;QAC7B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAA;QACzB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAA;QAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAE7B,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAA;QACnC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAA;QACjC,IAAI,CAAC,QAAQ;YACX,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAA;QAC9D,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAEzB,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE;YACrD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;SAC9D;QAED,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;YAC/B,OAAO,GAAG,CAAC,OAAO,CAAC,CAAA;SACpB;QAED,IAAI,CAAC,oBAAoB;YACvB,CAAC,CAAC,IAAI,CAAC,oBAAoB;gBAC1B,IAAoB,CAAC,kBAAkB,KAAK,KAAK,CAAA;QAEpD,IAAI,IAAI,CAAC,oBAAoB,EAAE;YAC7B,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;SAClD;QAED,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,IAAI,CAAC,UAAU,EAAE;gBACnB,MAAM,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAA;aACvD;YACD,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;SAChE;QAED,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QAEtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,eAAe,CAAA;QAChD,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAA;QAChD,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;YACzB,IACE,IAAI,CAAC,MAAM,KAAK,SAAS;gBACzB,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,EAClC;gBACA,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;aACpE;SACF;aAAM;YACL,MAAM,MAAM,GACV,IAAI,CAAC,QAAQ,KAAK,OAAO;gBACvB,CAAC,CAAC,6BAAe;gBACjB,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ;oBAC5B,CAAC,CAAC,8BAAgB;oBAClB,CAAC,CAAC,IAAI,CAAC,QAAQ;wBACf,CAAC,CAAC,6BAAe;wBACjB,CAAC,CAAC,wBAAU,CAAA;YAChB,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;gBACjC,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,EAAE,EAAE,IAAI,CAAC,EAAE;aACZ,CAAC,CAAA;SACH;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;QAEhC,8DAA8D;QAC9D,0DAA0D;QAC1D,6DAA6D;QAC7D,kCAAkC;QAClC,MAAM,eAAe,GACnB,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAA;QAEzD,MAAM,GAAG,GAAqB;YAC5B,mCAAmC;YACnC,GAAG,IAAI;YACP,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,eAAe;YACf,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI;YACd,iBAAiB,EAAE,CAAC;YACpB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;YAC/C,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;SACzB,CAAA;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,qBAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QACxD,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,GAAG,CAAC,MAAM,CACtC,CAAC,GAA0B,EAAE,CAAC,EAAE,EAAE;YAChC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;YACrB,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAA;YAC3B,OAAO,GAAG,CAAA;QACZ,CAAC,EACD,CAAC,EAAE,EAAE,EAAE,CAAC,CACT,CAAA;QACD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACtC,OAAO,IAAI,oBAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QACzD,CAAC,CAAC,CAAA;IACJ,CAAC;IAMD,KAAK,CAAC,IAAI;QACR,kEAAkE;QAClE,iEAAiE;QACjE,uEAAuE;QACvE,sCAAsC;QACtC,OAAO;YACL,GAAG,CAAC,MAAM,IAAI,sBAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;gBACvD,GAAG,IAAI,CAAC,IAAI;gBACZ,QAAQ,EACN,IAAI,CAAC,QAAQ,KAAK,QAAQ;oBACxB,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE;oBACzC,CAAC,CAAC,QAAQ;gBACd,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC,IAAI,EAAE,CAAC;SACX,CAAA;IACH,CAAC;IAMD,QAAQ;QACN,OAAO;YACL,GAAG,IAAI,sBAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;gBAChD,GAAG,IAAI,CAAC,IAAI;gBACZ,QAAQ,EACN,IAAI,CAAC,QAAQ,KAAK,QAAQ;oBACxB,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE;oBACzC,CAAC,CAAC,QAAQ;gBACd,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC,QAAQ,EAAE;SACd,CAAA;IACH,CAAC;IAMD,MAAM;QACJ,OAAO,IAAI,sBAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YACpD,GAAG,IAAI,CAAC,IAAI;YACZ,QAAQ,EACN,IAAI,CAAC,QAAQ,KAAK,QAAQ;gBACxB,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE;gBACzC,CAAC,CAAC,QAAQ;YACd,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC,MAAM,EAAE,CAAA;IACb,CAAC;IAMD,UAAU;QACR,OAAO,IAAI,sBAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YACpD,GAAG,IAAI,CAAC,IAAI;YACZ,QAAQ,EACN,IAAI,CAAC,QAAQ,KAAK,QAAQ;gBACxB,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE;gBACzC,CAAC,CAAC,QAAQ;YACd,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC,UAAU,EAAE,CAAA;IACjB,CAAC;IAED;;;OAGG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAA;IAC7C,CAAC;IACD,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,CAAC,WAAW,EAAE,CAAA;IAC3B,CAAC;IAED;;;OAGG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAA;IAC9C,CAAC;IACD,CAAC,MAAM,CAAC,aAAa,CAAC;QACpB,OAAO,IAAI,CAAC,OAAO,EAAE,CAAA;IACvB,CAAC;CACF;AArQD,oBAqQC","sourcesContent":["import { Minimatch, MinimatchOptions } from 'minimatch'\nimport { Minipass } from 'minipass'\nimport {\n  FSOption,\n  Path,\n  PathScurry,\n  PathScurryDarwin,\n  PathScurryPosix,\n  PathScurryWin32,\n} from 'path-scurry'\nimport { fileURLToPath } from 'url'\nimport { IgnoreLike } from './ignore.js'\nimport { Pattern } from './pattern.js'\nimport { GlobStream, GlobWalker } from './walker.js'\n\nexport type MatchSet = Minimatch['set']\nexport type GlobParts = Exclude\n\n// if no process global, just call it linux.\n// so we default to case-sensitive, / separators\nconst defaultPlatform: NodeJS.Platform =\n  typeof process === 'object' &&\n  process &&\n  typeof process.platform === 'string'\n    ? process.platform\n    : 'linux'\n\n/**\n * A `GlobOptions` object may be provided to any of the exported methods, and\n * must be provided to the `Glob` constructor.\n *\n * All options are optional, boolean, and false by default, unless otherwise\n * noted.\n *\n * All resolved options are added to the Glob object as properties.\n *\n * If you are running many `glob` operations, you can pass a Glob object as the\n * `options` argument to a subsequent operation to share the previously loaded\n * cache.\n */\nexport interface GlobOptions {\n  /**\n   * Set to `true` to always receive absolute paths for\n   * matched files. Set to `false` to always return relative paths.\n   *\n   * When this option is not set, absolute paths are returned for patterns\n   * that are absolute, and otherwise paths are returned that are relative\n   * to the `cwd` setting.\n   *\n   * This does _not_ make an extra system call to get\n   * the realpath, it only does string path resolution.\n   *\n   * Conflicts with {@link withFileTypes}\n   */\n  absolute?: boolean\n\n  /**\n   * Set to false to enable {@link windowsPathsNoEscape}\n   *\n   * @deprecated\n   */\n  allowWindowsEscape?: boolean\n\n  /**\n   * The current working directory in which to search. Defaults to\n   * `process.cwd()`.\n   *\n   * May be eiher a string path or a `file://` URL object or string.\n   */\n  cwd?: string | URL\n\n  /**\n   * Include `.dot` files in normal matches and `globstar`\n   * matches. Note that an explicit dot in a portion of the pattern\n   * will always match dot files.\n   */\n  dot?: boolean\n\n  /**\n   * Prepend all relative path strings with `./` (or `.\\` on Windows).\n   *\n   * Without this option, returned relative paths are \"bare\", so instead of\n   * returning `'./foo/bar'`, they are returned as `'foo/bar'`.\n   *\n   * Relative patterns starting with `'../'` are not prepended with `./`, even\n   * if this option is set.\n   */\n  dotRelative?: boolean\n\n  /**\n   * Follow symlinked directories when expanding `**`\n   * patterns. This can result in a lot of duplicate references in\n   * the presence of cyclic links, and make performance quite bad.\n   *\n   * By default, a `**` in a pattern will follow 1 symbolic link if\n   * it is not the first item in the pattern, or none if it is the\n   * first item in the pattern, following the same behavior as Bash.\n   */\n  follow?: boolean\n\n  /**\n   * string or string[], or an object with `ignore` and `ignoreChildren`\n   * methods.\n   *\n   * If a string or string[] is provided, then this is treated as a glob\n   * pattern or array of glob patterns to exclude from matches. To ignore all\n   * children within a directory, as well as the entry itself, append `'/**'`\n   * to the ignore pattern.\n   *\n   * **Note** `ignore` patterns are _always_ in `dot:true` mode, regardless of\n   * any other settings.\n   *\n   * If an object is provided that has `ignored(path)` and/or\n   * `childrenIgnored(path)` methods, then these methods will be called to\n   * determine whether any Path is a match or if its children should be\n   * traversed, respectively.\n   */\n  ignore?: string | string[] | IgnoreLike\n\n  /**\n   * Treat brace expansion like `{a,b}` as a \"magic\" pattern. Has no\n   * effect if {@link nobrace} is set.\n   *\n   * Only has effect on the {@link hasMagic} function.\n   */\n  magicalBraces?: boolean\n\n  /**\n   * Add a `/` character to directory matches. Note that this requires\n   * additional stat calls in some cases.\n   */\n  mark?: boolean\n\n  /**\n   * Perform a basename-only match if the pattern does not contain any slash\n   * characters. That is, `*.js` would be treated as equivalent to\n   * `**\\/*.js`, matching all js files in all directories.\n   */\n  matchBase?: boolean\n\n  /**\n   * Limit the directory traversal to a given depth below the cwd.\n   * Note that this does NOT prevent traversal to sibling folders,\n   * root patterns, and so on. It only limits the maximum folder depth\n   * that the walk will descend, relative to the cwd.\n   */\n  maxDepth?: number\n\n  /**\n   * Do not expand `{a,b}` and `{1..3}` brace sets.\n   */\n  nobrace?: boolean\n\n  /**\n   * Perform a case-insensitive match. This defaults to `true` on macOS and\n   * Windows systems, and `false` on all others.\n   *\n   * **Note** `nocase` should only be explicitly set when it is\n   * known that the filesystem's case sensitivity differs from the\n   * platform default. If set `true` on case-sensitive file\n   * systems, or `false` on case-insensitive file systems, then the\n   * walk may return more or less results than expected.\n   */\n  nocase?: boolean\n\n  /**\n   * Do not match directories, only files. (Note: to match\n   * _only_ directories, put a `/` at the end of the pattern.)\n   */\n  nodir?: boolean\n\n  /**\n   * Do not match \"extglob\" patterns such as `+(a|b)`.\n   */\n  noext?: boolean\n\n  /**\n   * Do not match `**` against multiple filenames. (Ie, treat it as a normal\n   * `*` instead.)\n   *\n   * Conflicts with {@link matchBase}\n   */\n  noglobstar?: boolean\n\n  /**\n   * Defaults to value of `process.platform` if available, or `'linux'` if\n   * not. Setting `platform:'win32'` on non-Windows systems may cause strange\n   * behavior.\n   */\n  platform?: NodeJS.Platform\n\n  /**\n   * Set to true to call `fs.realpath` on all of the\n   * results. In the case of an entry that cannot be resolved, the\n   * entry is omitted. This incurs a slight performance penalty, of\n   * course, because of the added system calls.\n   */\n  realpath?: boolean\n\n  /**\n   *\n   * A string path resolved against the `cwd` option, which\n   * is used as the starting point for absolute patterns that start\n   * with `/`, (but not drive letters or UNC paths on Windows).\n   *\n   * Note that this _doesn't_ necessarily limit the walk to the\n   * `root` directory, and doesn't affect the cwd starting point for\n   * non-absolute patterns. A pattern containing `..` will still be\n   * able to traverse out of the root directory, if it is not an\n   * actual root directory on the filesystem, and any non-absolute\n   * patterns will be matched in the `cwd`. For example, the\n   * pattern `/../*` with `{root:'/some/path'}` will return all\n   * files in `/some`, not all files in `/some/path`. The pattern\n   * `*` with `{root:'/some/path'}` will return all the entries in\n   * the cwd, not the entries in `/some/path`.\n   *\n   * To start absolute and non-absolute patterns in the same\n   * path, you can use `{root:''}`. However, be aware that on\n   * Windows systems, a pattern like `x:/*` or `//host/share/*` will\n   * _always_ start in the `x:/` or `//host/share` directory,\n   * regardless of the `root` setting.\n   */\n  root?: string\n\n  /**\n   * A [PathScurry](http://npm.im/path-scurry) object used\n   * to traverse the file system. If the `nocase` option is set\n   * explicitly, then any provided `scurry` object must match this\n   * setting.\n   */\n  scurry?: PathScurry\n\n  /**\n   * Call `lstat()` on all entries, whether required or not to determine\n   * if it's a valid match. When used with {@link withFileTypes}, this means\n   * that matches will include data such as modified time, permissions, and\n   * so on.  Note that this will incur a performance cost due to the added\n   * system calls.\n   */\n  stat?: boolean\n\n  /**\n   * An AbortSignal which will cancel the Glob walk when\n   * triggered.\n   */\n  signal?: AbortSignal\n\n  /**\n   * Use `\\\\` as a path separator _only_, and\n   *  _never_ as an escape character. If set, all `\\\\` characters are\n   *  replaced with `/` in the pattern.\n   *\n   *  Note that this makes it **impossible** to match against paths\n   *  containing literal glob pattern characters, but allows matching\n   *  with patterns constructed using `path.join()` and\n   *  `path.resolve()` on Windows platforms, mimicking the (buggy!)\n   *  behavior of Glob v7 and before on Windows. Please use with\n   *  caution, and be mindful of [the caveat below about Windows\n   *  paths](#windows). (For legacy reasons, this is also set if\n   *  `allowWindowsEscape` is set to the exact value `false`.)\n   */\n  windowsPathsNoEscape?: boolean\n\n  /**\n   * Return [PathScurry](http://npm.im/path-scurry)\n   * `Path` objects instead of strings. These are similar to a\n   * NodeJS `Dirent` object, but with additional methods and\n   * properties.\n   *\n   * Conflicts with {@link absolute}\n   */\n  withFileTypes?: boolean\n\n  /**\n   * An fs implementation to override some or all of the defaults.  See\n   * http://npm.im/path-scurry for details about what can be overridden.\n   */\n  fs?: FSOption\n\n  /**\n   * Just passed along to Minimatch.  Note that this makes all pattern\n   * matching operations slower and *extremely* noisy.\n   */\n  debug?: boolean\n\n  /**\n   * Return `/` delimited paths, even on Windows.\n   *\n   * On posix systems, this has no effect.  But, on Windows, it means that\n   * paths will be `/` delimited, and absolute paths will be their full\n   * resolved UNC forms, eg instead of `'C:\\\\foo\\\\bar'`, it would return\n   * `'//?/C:/foo/bar'`\n   */\n  posix?: boolean\n}\n\nexport type GlobOptionsWithFileTypesTrue = GlobOptions & {\n  withFileTypes: true\n  // string options not relevant if returning Path objects.\n  absolute?: undefined\n  mark?: undefined\n  posix?: undefined\n}\n\nexport type GlobOptionsWithFileTypesFalse = GlobOptions & {\n  withFileTypes?: false\n}\n\nexport type GlobOptionsWithFileTypesUnset = GlobOptions & {\n  withFileTypes?: undefined\n}\n\nexport type Result = Opts extends GlobOptionsWithFileTypesTrue\n  ? Path\n  : Opts extends GlobOptionsWithFileTypesFalse\n  ? string\n  : Opts extends GlobOptionsWithFileTypesUnset\n  ? string\n  : string | Path\nexport type Results = Result[]\n\nexport type FileTypes = Opts extends GlobOptionsWithFileTypesTrue\n  ? true\n  : Opts extends GlobOptionsWithFileTypesFalse\n  ? false\n  : Opts extends GlobOptionsWithFileTypesUnset\n  ? false\n  : boolean\n\n/**\n * An object that can perform glob pattern traversals.\n */\nexport class Glob implements GlobOptions {\n  absolute?: boolean\n  cwd: string\n  root?: string\n  dot: boolean\n  dotRelative: boolean\n  follow: boolean\n  ignore?: string | string[] | IgnoreLike\n  magicalBraces: boolean\n  mark?: boolean\n  matchBase: boolean\n  maxDepth: number\n  nobrace: boolean\n  nocase: boolean\n  nodir: boolean\n  noext: boolean\n  noglobstar: boolean\n  pattern: string[]\n  platform: NodeJS.Platform\n  realpath: boolean\n  scurry: PathScurry\n  stat: boolean\n  signal?: AbortSignal\n  windowsPathsNoEscape: boolean\n  withFileTypes: FileTypes\n\n  /**\n   * The options provided to the constructor.\n   */\n  opts: Opts\n\n  /**\n   * An array of parsed immutable {@link Pattern} objects.\n   */\n  patterns: Pattern[]\n\n  /**\n   * All options are stored as properties on the `Glob` object.\n   *\n   * See {@link GlobOptions} for full options descriptions.\n   *\n   * Note that a previous `Glob` object can be passed as the\n   * `GlobOptions` to another `Glob` instantiation to re-use settings\n   * and caches with a new pattern.\n   *\n   * Traversal functions can be called multiple times to run the walk\n   * again.\n   */\n  constructor(pattern: string | string[], opts: Opts) {\n    /* c8 ignore start */\n    if (!opts) throw new TypeError('glob options required')\n    /* c8 ignore stop */\n    this.withFileTypes = !!opts.withFileTypes as FileTypes\n    this.signal = opts.signal\n    this.follow = !!opts.follow\n    this.dot = !!opts.dot\n    this.dotRelative = !!opts.dotRelative\n    this.nodir = !!opts.nodir\n    this.mark = !!opts.mark\n    if (!opts.cwd) {\n      this.cwd = ''\n    } else if (opts.cwd instanceof URL || opts.cwd.startsWith('file://')) {\n      opts.cwd = fileURLToPath(opts.cwd)\n    }\n    this.cwd = opts.cwd || ''\n    this.root = opts.root\n    this.magicalBraces = !!opts.magicalBraces\n    this.nobrace = !!opts.nobrace\n    this.noext = !!opts.noext\n    this.realpath = !!opts.realpath\n    this.absolute = opts.absolute\n\n    this.noglobstar = !!opts.noglobstar\n    this.matchBase = !!opts.matchBase\n    this.maxDepth =\n      typeof opts.maxDepth === 'number' ? opts.maxDepth : Infinity\n    this.stat = !!opts.stat\n    this.ignore = opts.ignore\n\n    if (this.withFileTypes && this.absolute !== undefined) {\n      throw new Error('cannot set absolute and withFileTypes:true')\n    }\n\n    if (typeof pattern === 'string') {\n      pattern = [pattern]\n    }\n\n    this.windowsPathsNoEscape =\n      !!opts.windowsPathsNoEscape ||\n      (opts as GlobOptions).allowWindowsEscape === false\n\n    if (this.windowsPathsNoEscape) {\n      pattern = pattern.map(p => p.replace(/\\\\/g, '/'))\n    }\n\n    if (this.matchBase) {\n      if (opts.noglobstar) {\n        throw new TypeError('base matching requires globstar')\n      }\n      pattern = pattern.map(p => (p.includes('/') ? p : `./**/${p}`))\n    }\n\n    this.pattern = pattern\n\n    this.platform = opts.platform || defaultPlatform\n    this.opts = { ...opts, platform: this.platform }\n    if (opts.scurry) {\n      this.scurry = opts.scurry\n      if (\n        opts.nocase !== undefined &&\n        opts.nocase !== opts.scurry.nocase\n      ) {\n        throw new Error('nocase option contradicts provided scurry option')\n      }\n    } else {\n      const Scurry =\n        opts.platform === 'win32'\n          ? PathScurryWin32\n          : opts.platform === 'darwin'\n          ? PathScurryDarwin\n          : opts.platform\n          ? PathScurryPosix\n          : PathScurry\n      this.scurry = new Scurry(this.cwd, {\n        nocase: opts.nocase,\n        fs: opts.fs,\n      })\n    }\n    this.nocase = this.scurry.nocase\n\n    // If you do nocase:true on a case-sensitive file system, then\n    // we need to use regexps instead of strings for non-magic\n    // path portions, because statting `aBc` won't return results\n    // for the file `AbC` for example.\n    const nocaseMagicOnly =\n      this.platform === 'darwin' || this.platform === 'win32'\n\n    const mmo: MinimatchOptions = {\n      // default nocase based on platform\n      ...opts,\n      dot: this.dot,\n      matchBase: this.matchBase,\n      nobrace: this.nobrace,\n      nocase: this.nocase,\n      nocaseMagicOnly,\n      nocomment: true,\n      noext: this.noext,\n      nonegate: true,\n      optimizationLevel: 2,\n      platform: this.platform,\n      windowsPathsNoEscape: this.windowsPathsNoEscape,\n      debug: !!this.opts.debug,\n    }\n\n    const mms = this.pattern.map(p => new Minimatch(p, mmo))\n    const [matchSet, globParts] = mms.reduce(\n      (set: [MatchSet, GlobParts], m) => {\n        set[0].push(...m.set)\n        set[1].push(...m.globParts)\n        return set\n      },\n      [[], []]\n    )\n    this.patterns = matchSet.map((set, i) => {\n      return new Pattern(set, globParts[i], 0, this.platform)\n    })\n  }\n\n  /**\n   * Returns a Promise that resolves to the results array.\n   */\n  async walk(): Promise>\n  async walk(): Promise<(string | Path)[]> {\n    // Walkers always return array of Path objects, so we just have to\n    // coerce them into the right shape.  It will have already called\n    // realpath() if the option was set to do so, so we know that's cached.\n    // start out knowing the cwd, at least\n    return [\n      ...(await new GlobWalker(this.patterns, this.scurry.cwd, {\n        ...this.opts,\n        maxDepth:\n          this.maxDepth !== Infinity\n            ? this.maxDepth + this.scurry.cwd.depth()\n            : Infinity,\n        platform: this.platform,\n        nocase: this.nocase,\n      }).walk()),\n    ]\n  }\n\n  /**\n   * synchronous {@link Glob.walk}\n   */\n  walkSync(): Results\n  walkSync(): (string | Path)[] {\n    return [\n      ...new GlobWalker(this.patterns, this.scurry.cwd, {\n        ...this.opts,\n        maxDepth:\n          this.maxDepth !== Infinity\n            ? this.maxDepth + this.scurry.cwd.depth()\n            : Infinity,\n        platform: this.platform,\n        nocase: this.nocase,\n      }).walkSync(),\n    ]\n  }\n\n  /**\n   * Stream results asynchronously.\n   */\n  stream(): Minipass, Result>\n  stream(): Minipass {\n    return new GlobStream(this.patterns, this.scurry.cwd, {\n      ...this.opts,\n      maxDepth:\n        this.maxDepth !== Infinity\n          ? this.maxDepth + this.scurry.cwd.depth()\n          : Infinity,\n      platform: this.platform,\n      nocase: this.nocase,\n    }).stream()\n  }\n\n  /**\n   * Stream results synchronously.\n   */\n  streamSync(): Minipass, Result>\n  streamSync(): Minipass {\n    return new GlobStream(this.patterns, this.scurry.cwd, {\n      ...this.opts,\n      maxDepth:\n        this.maxDepth !== Infinity\n          ? this.maxDepth + this.scurry.cwd.depth()\n          : Infinity,\n      platform: this.platform,\n      nocase: this.nocase,\n    }).streamSync()\n  }\n\n  /**\n   * Default sync iteration function. Returns a Generator that\n   * iterates over the results.\n   */\n  iterateSync(): Generator, void, void> {\n    return this.streamSync()[Symbol.iterator]()\n  }\n  [Symbol.iterator]() {\n    return this.iterateSync()\n  }\n\n  /**\n   * Default async iteration function. Returns an AsyncGenerator that\n   * iterates over the results.\n   */\n  iterate(): AsyncGenerator, void, void> {\n    return this.stream()[Symbol.asyncIterator]()\n  }\n  [Symbol.asyncIterator]() {\n    return this.iterate()\n  }\n}\n"]}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/has-magic.d.ts b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/has-magic.d.ts
    deleted file mode 100644
    index 8aec3bd9725175..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/has-magic.d.ts
    +++ /dev/null
    @@ -1,14 +0,0 @@
    -import { GlobOptions } from './glob.js';
    -/**
    - * Return true if the patterns provided contain any magic glob characters,
    - * given the options provided.
    - *
    - * Brace expansion is not considered "magic" unless the `magicalBraces` option
    - * is set, as brace expansion just turns one string into an array of strings.
    - * So a pattern like `'x{a,b}y'` would return `false`, because `'xay'` and
    - * `'xby'` both do not contain any magic glob characters, and it's treated the
    - * same as if you had called it on `['xay', 'xby']`. When `magicalBraces:true`
    - * is in the options, brace expansion _is_ treated as a pattern having magic.
    - */
    -export declare const hasMagic: (pattern: string | string[], options?: GlobOptions) => boolean;
    -//# sourceMappingURL=has-magic.d.ts.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/has-magic.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/has-magic.d.ts.map
    deleted file mode 100644
    index dd5053f80b44c3..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/has-magic.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"has-magic.d.ts","sourceRoot":"","sources":["../../../src/has-magic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAEvC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,QAAQ,YACV,MAAM,GAAG,MAAM,EAAE,YACjB,WAAW,KACnB,OAQF,CAAA"}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/has-magic.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/has-magic.js
    deleted file mode 100644
    index 0918bd57e0f1c2..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/has-magic.js
    +++ /dev/null
    @@ -1,27 +0,0 @@
    -"use strict";
    -Object.defineProperty(exports, "__esModule", { value: true });
    -exports.hasMagic = void 0;
    -const minimatch_1 = require("minimatch");
    -/**
    - * Return true if the patterns provided contain any magic glob characters,
    - * given the options provided.
    - *
    - * Brace expansion is not considered "magic" unless the `magicalBraces` option
    - * is set, as brace expansion just turns one string into an array of strings.
    - * So a pattern like `'x{a,b}y'` would return `false`, because `'xay'` and
    - * `'xby'` both do not contain any magic glob characters, and it's treated the
    - * same as if you had called it on `['xay', 'xby']`. When `magicalBraces:true`
    - * is in the options, brace expansion _is_ treated as a pattern having magic.
    - */
    -const hasMagic = (pattern, options = {}) => {
    -    if (!Array.isArray(pattern)) {
    -        pattern = [pattern];
    -    }
    -    for (const p of pattern) {
    -        if (new minimatch_1.Minimatch(p, options).hasMagic())
    -            return true;
    -    }
    -    return false;
    -};
    -exports.hasMagic = hasMagic;
    -//# sourceMappingURL=has-magic.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/has-magic.js.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/has-magic.js.map
    deleted file mode 100644
    index 9b73cfad7d05e4..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/has-magic.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"has-magic.js","sourceRoot":"","sources":["../../../src/has-magic.ts"],"names":[],"mappings":";;;AAAA,yCAAqC;AAGrC;;;;;;;;;;GAUG;AACI,MAAM,QAAQ,GAAG,CACtB,OAA0B,EAC1B,UAAuB,EAAE,EAChB,EAAE;IACX,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,OAAO,GAAG,CAAC,OAAO,CAAC,CAAA;KACpB;IACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;QACvB,IAAI,IAAI,qBAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE;YAAE,OAAO,IAAI,CAAA;KACtD;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAXY,QAAA,QAAQ,YAWpB","sourcesContent":["import { Minimatch } from 'minimatch'\nimport { GlobOptions } from './glob.js'\n\n/**\n * Return true if the patterns provided contain any magic glob characters,\n * given the options provided.\n *\n * Brace expansion is not considered \"magic\" unless the `magicalBraces` option\n * is set, as brace expansion just turns one string into an array of strings.\n * So a pattern like `'x{a,b}y'` would return `false`, because `'xay'` and\n * `'xby'` both do not contain any magic glob characters, and it's treated the\n * same as if you had called it on `['xay', 'xby']`. When `magicalBraces:true`\n * is in the options, brace expansion _is_ treated as a pattern having magic.\n */\nexport const hasMagic = (\n  pattern: string | string[],\n  options: GlobOptions = {}\n): boolean => {\n  if (!Array.isArray(pattern)) {\n    pattern = [pattern]\n  }\n  for (const p of pattern) {\n    if (new Minimatch(p, options).hasMagic()) return true\n  }\n  return false\n}\n"]}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/ignore.d.ts b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/ignore.d.ts
    deleted file mode 100644
    index e9d74f3b5e1291..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/ignore.d.ts
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -import { Minimatch } from 'minimatch';
    -import { Path } from 'path-scurry';
    -import { GlobWalkerOpts } from './walker.js';
    -export interface IgnoreLike {
    -    ignored?: (p: Path) => boolean;
    -    childrenIgnored?: (p: Path) => boolean;
    -}
    -/**
    - * Class used to process ignored patterns
    - */
    -export declare class Ignore implements IgnoreLike {
    -    relative: Minimatch[];
    -    relativeChildren: Minimatch[];
    -    absolute: Minimatch[];
    -    absoluteChildren: Minimatch[];
    -    constructor(ignored: string[], { nobrace, nocase, noext, noglobstar, platform, }: GlobWalkerOpts);
    -    ignored(p: Path): boolean;
    -    childrenIgnored(p: Path): boolean;
    -}
    -//# sourceMappingURL=ignore.d.ts.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/ignore.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/ignore.d.ts.map
    deleted file mode 100644
    index 3d604838d1eed2..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/ignore.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"ignore.d.ts","sourceRoot":"","sources":["../../../src/ignore.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,OAAO,CAAA;IAC9B,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,OAAO,CAAA;CACvC;AASD;;GAEG;AACH,qBAAa,MAAO,YAAW,UAAU;IACvC,QAAQ,EAAE,SAAS,EAAE,CAAA;IACrB,gBAAgB,EAAE,SAAS,EAAE,CAAA;IAC7B,QAAQ,EAAE,SAAS,EAAE,CAAA;IACrB,gBAAgB,EAAE,SAAS,EAAE,CAAA;gBAG3B,OAAO,EAAE,MAAM,EAAE,EACjB,EACE,OAAO,EACP,MAAM,EACN,KAAK,EACL,UAAU,EACV,QAA0B,GAC3B,EAAE,cAAc;IAiDnB,OAAO,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO;IAczB,eAAe,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO;CAWlC"}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/ignore.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/ignore.js
    deleted file mode 100644
    index 0cbcca335e1cca..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/ignore.js
    +++ /dev/null
    @@ -1,103 +0,0 @@
    -"use strict";
    -// give it a pattern, and it'll be able to tell you if
    -// a given path should be ignored.
    -// Ignoring a path ignores its children if the pattern ends in /**
    -// Ignores are always parsed in dot:true mode
    -Object.defineProperty(exports, "__esModule", { value: true });
    -exports.Ignore = void 0;
    -const minimatch_1 = require("minimatch");
    -const pattern_js_1 = require("./pattern.js");
    -const defaultPlatform = typeof process === 'object' &&
    -    process &&
    -    typeof process.platform === 'string'
    -    ? process.platform
    -    : 'linux';
    -/**
    - * Class used to process ignored patterns
    - */
    -class Ignore {
    -    relative;
    -    relativeChildren;
    -    absolute;
    -    absoluteChildren;
    -    constructor(ignored, { nobrace, nocase, noext, noglobstar, platform = defaultPlatform, }) {
    -        this.relative = [];
    -        this.absolute = [];
    -        this.relativeChildren = [];
    -        this.absoluteChildren = [];
    -        const mmopts = {
    -            dot: true,
    -            nobrace,
    -            nocase,
    -            noext,
    -            noglobstar,
    -            optimizationLevel: 2,
    -            platform,
    -            nocomment: true,
    -            nonegate: true,
    -        };
    -        // this is a little weird, but it gives us a clean set of optimized
    -        // minimatch matchers, without getting tripped up if one of them
    -        // ends in /** inside a brace section, and it's only inefficient at
    -        // the start of the walk, not along it.
    -        // It'd be nice if the Pattern class just had a .test() method, but
    -        // handling globstars is a bit of a pita, and that code already lives
    -        // in minimatch anyway.
    -        // Another way would be if maybe Minimatch could take its set/globParts
    -        // as an option, and then we could at least just use Pattern to test
    -        // for absolute-ness.
    -        // Yet another way, Minimatch could take an array of glob strings, and
    -        // a cwd option, and do the right thing.
    -        for (const ign of ignored) {
    -            const mm = new minimatch_1.Minimatch(ign, mmopts);
    -            for (let i = 0; i < mm.set.length; i++) {
    -                const parsed = mm.set[i];
    -                const globParts = mm.globParts[i];
    -                const p = new pattern_js_1.Pattern(parsed, globParts, 0, platform);
    -                const m = new minimatch_1.Minimatch(p.globString(), mmopts);
    -                const children = globParts[globParts.length - 1] === '**';
    -                const absolute = p.isAbsolute();
    -                if (absolute)
    -                    this.absolute.push(m);
    -                else
    -                    this.relative.push(m);
    -                if (children) {
    -                    if (absolute)
    -                        this.absoluteChildren.push(m);
    -                    else
    -                        this.relativeChildren.push(m);
    -                }
    -            }
    -        }
    -    }
    -    ignored(p) {
    -        const fullpath = p.fullpath();
    -        const fullpaths = `${fullpath}/`;
    -        const relative = p.relative() || '.';
    -        const relatives = `${relative}/`;
    -        for (const m of this.relative) {
    -            if (m.match(relative) || m.match(relatives))
    -                return true;
    -        }
    -        for (const m of this.absolute) {
    -            if (m.match(fullpath) || m.match(fullpaths))
    -                return true;
    -        }
    -        return false;
    -    }
    -    childrenIgnored(p) {
    -        const fullpath = p.fullpath() + '/';
    -        const relative = (p.relative() || '.') + '/';
    -        for (const m of this.relativeChildren) {
    -            if (m.match(relative))
    -                return true;
    -        }
    -        for (const m of this.absoluteChildren) {
    -            if (m.match(fullpath))
    -                true;
    -        }
    -        return false;
    -    }
    -}
    -exports.Ignore = Ignore;
    -//# sourceMappingURL=ignore.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/ignore.js.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/ignore.js.map
    deleted file mode 100644
    index 7595b4c68f79ed..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/ignore.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"ignore.js","sourceRoot":"","sources":["../../../src/ignore.ts"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,kCAAkC;AAClC,kEAAkE;AAClE,6CAA6C;;;AAE7C,yCAAqC;AAErC,6CAAsC;AAQtC,MAAM,eAAe,GACnB,OAAO,OAAO,KAAK,QAAQ;IAC3B,OAAO;IACP,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ;IAClC,CAAC,CAAC,OAAO,CAAC,QAAQ;IAClB,CAAC,CAAC,OAAO,CAAA;AAEb;;GAEG;AACH,MAAa,MAAM;IACjB,QAAQ,CAAa;IACrB,gBAAgB,CAAa;IAC7B,QAAQ,CAAa;IACrB,gBAAgB,CAAa;IAE7B,YACE,OAAiB,EACjB,EACE,OAAO,EACP,MAAM,EACN,KAAK,EACL,UAAU,EACV,QAAQ,GAAG,eAAe,GACX;QAEjB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAClB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAClB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAA;QAC1B,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAA;QAC1B,MAAM,MAAM,GAAG;YACb,GAAG,EAAE,IAAI;YACT,OAAO;YACP,MAAM;YACN,KAAK;YACL,UAAU;YACV,iBAAiB,EAAE,CAAC;YACpB,QAAQ;YACR,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,IAAI;SACf,CAAA;QAED,mEAAmE;QACnE,gEAAgE;QAChE,mEAAmE;QACnE,uCAAuC;QACvC,mEAAmE;QACnE,qEAAqE;QACrE,uBAAuB;QACvB,uEAAuE;QACvE,oEAAoE;QACpE,qBAAqB;QACrB,sEAAsE;QACtE,wCAAwC;QACxC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;YACzB,MAAM,EAAE,GAAG,IAAI,qBAAS,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACtC,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;gBACxB,MAAM,SAAS,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;gBACjC,MAAM,CAAC,GAAG,IAAI,oBAAO,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAA;gBACrD,MAAM,CAAC,GAAG,IAAI,qBAAS,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,CAAA;gBAC/C,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,CAAA;gBACzD,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,EAAE,CAAA;gBAC/B,IAAI,QAAQ;oBAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;;oBAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBAC1B,IAAI,QAAQ,EAAE;oBACZ,IAAI,QAAQ;wBAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;;wBACtC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;iBACnC;aACF;SACF;IACH,CAAC;IAED,OAAO,CAAC,CAAO;QACb,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC7B,MAAM,SAAS,GAAG,GAAG,QAAQ,GAAG,CAAA;QAChC,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAA;QACpC,MAAM,SAAS,GAAG,GAAG,QAAQ,GAAG,CAAA;QAChC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YAC7B,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;gBAAE,OAAO,IAAI,CAAA;SACzD;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YAC7B,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;gBAAE,OAAO,IAAI,CAAA;SACzD;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,eAAe,CAAC,CAAO;QACrB,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAA;QACnC,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,GAAG,GAAG,CAAA;QAC5C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACrC,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAAE,OAAO,IAAI,CAAA;SACnC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACrC,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAAE,IAAI,CAAA;SAC5B;QACD,OAAO,KAAK,CAAA;IACd,CAAC;CACF;AAxFD,wBAwFC","sourcesContent":["// give it a pattern, and it'll be able to tell you if\n// a given path should be ignored.\n// Ignoring a path ignores its children if the pattern ends in /**\n// Ignores are always parsed in dot:true mode\n\nimport { Minimatch } from 'minimatch'\nimport { Path } from 'path-scurry'\nimport { Pattern } from './pattern.js'\nimport { GlobWalkerOpts } from './walker.js'\n\nexport interface IgnoreLike {\n  ignored?: (p: Path) => boolean\n  childrenIgnored?: (p: Path) => boolean\n}\n\nconst defaultPlatform: NodeJS.Platform =\n  typeof process === 'object' &&\n  process &&\n  typeof process.platform === 'string'\n    ? process.platform\n    : 'linux'\n\n/**\n * Class used to process ignored patterns\n */\nexport class Ignore implements IgnoreLike {\n  relative: Minimatch[]\n  relativeChildren: Minimatch[]\n  absolute: Minimatch[]\n  absoluteChildren: Minimatch[]\n\n  constructor(\n    ignored: string[],\n    {\n      nobrace,\n      nocase,\n      noext,\n      noglobstar,\n      platform = defaultPlatform,\n    }: GlobWalkerOpts\n  ) {\n    this.relative = []\n    this.absolute = []\n    this.relativeChildren = []\n    this.absoluteChildren = []\n    const mmopts = {\n      dot: true,\n      nobrace,\n      nocase,\n      noext,\n      noglobstar,\n      optimizationLevel: 2,\n      platform,\n      nocomment: true,\n      nonegate: true,\n    }\n\n    // this is a little weird, but it gives us a clean set of optimized\n    // minimatch matchers, without getting tripped up if one of them\n    // ends in /** inside a brace section, and it's only inefficient at\n    // the start of the walk, not along it.\n    // It'd be nice if the Pattern class just had a .test() method, but\n    // handling globstars is a bit of a pita, and that code already lives\n    // in minimatch anyway.\n    // Another way would be if maybe Minimatch could take its set/globParts\n    // as an option, and then we could at least just use Pattern to test\n    // for absolute-ness.\n    // Yet another way, Minimatch could take an array of glob strings, and\n    // a cwd option, and do the right thing.\n    for (const ign of ignored) {\n      const mm = new Minimatch(ign, mmopts)\n      for (let i = 0; i < mm.set.length; i++) {\n        const parsed = mm.set[i]\n        const globParts = mm.globParts[i]\n        const p = new Pattern(parsed, globParts, 0, platform)\n        const m = new Minimatch(p.globString(), mmopts)\n        const children = globParts[globParts.length - 1] === '**'\n        const absolute = p.isAbsolute()\n        if (absolute) this.absolute.push(m)\n        else this.relative.push(m)\n        if (children) {\n          if (absolute) this.absoluteChildren.push(m)\n          else this.relativeChildren.push(m)\n        }\n      }\n    }\n  }\n\n  ignored(p: Path): boolean {\n    const fullpath = p.fullpath()\n    const fullpaths = `${fullpath}/`\n    const relative = p.relative() || '.'\n    const relatives = `${relative}/`\n    for (const m of this.relative) {\n      if (m.match(relative) || m.match(relatives)) return true\n    }\n    for (const m of this.absolute) {\n      if (m.match(fullpath) || m.match(fullpaths)) return true\n    }\n    return false\n  }\n\n  childrenIgnored(p: Path): boolean {\n    const fullpath = p.fullpath() + '/'\n    const relative = (p.relative() || '.') + '/'\n    for (const m of this.relativeChildren) {\n      if (m.match(relative)) return true\n    }\n    for (const m of this.absoluteChildren) {\n      if (m.match(fullpath)) true\n    }\n    return false\n  }\n}\n"]}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/index.d.ts b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/index.d.ts
    deleted file mode 100644
    index 669bf12e6d5916..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/index.d.ts
    +++ /dev/null
    @@ -1,95 +0,0 @@
    -import { Minipass } from 'minipass';
    -import { Path } from 'path-scurry';
    -import type { GlobOptions, GlobOptionsWithFileTypesFalse, GlobOptionsWithFileTypesTrue, GlobOptionsWithFileTypesUnset } from './glob.js';
    -import { Glob } from './glob.js';
    -/**
    - * Syncronous form of {@link globStream}. Will read all the matches as fast as
    - * you consume them, even all in a single tick if you consume them immediately,
    - * but will still respond to backpressure if they're not consumed immediately.
    - */
    -export declare function globStreamSync(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Minipass;
    -export declare function globStreamSync(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Minipass;
    -export declare function globStreamSync(pattern: string | string[], options: GlobOptionsWithFileTypesUnset): Minipass;
    -export declare function globStreamSync(pattern: string | string[], options: GlobOptions): Minipass | Minipass;
    -/**
    - * Return a stream that emits all the strings or `Path` objects and
    - * then emits `end` when completed.
    - */
    -export declare function globStream(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Minipass;
    -export declare function globStream(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Minipass;
    -export declare function globStream(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): Minipass;
    -export declare function globStream(pattern: string | string[], options: GlobOptions): Minipass | Minipass;
    -/**
    - * Synchronous form of {@link glob}
    - */
    -export declare function globSync(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): string[];
    -export declare function globSync(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Path[];
    -export declare function globSync(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): string[];
    -export declare function globSync(pattern: string | string[], options: GlobOptions): Path[] | string[];
    -/**
    - * Perform an asynchronous glob search for the pattern(s) specified. Returns
    - * [Path](https://isaacs.github.io/path-scurry/classes/PathBase) objects if the
    - * {@link withFileTypes} option is set to `true`. See {@link GlobOptions} for
    - * full option descriptions.
    - */
    -declare function glob_(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): Promise;
    -declare function glob_(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Promise;
    -declare function glob_(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Promise;
    -declare function glob_(pattern: string | string[], options: GlobOptions): Promise;
    -/**
    - * Return a sync iterator for walking glob pattern matches.
    - */
    -export declare function globIterateSync(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): Generator;
    -export declare function globIterateSync(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Generator;
    -export declare function globIterateSync(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Generator;
    -export declare function globIterateSync(pattern: string | string[], options: GlobOptions): Generator | Generator;
    -/**
    - * Return an async iterator for walking glob pattern matches.
    - */
    -export declare function globIterate(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): AsyncGenerator;
    -export declare function globIterate(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): AsyncGenerator;
    -export declare function globIterate(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): AsyncGenerator;
    -export declare function globIterate(pattern: string | string[], options: GlobOptions): AsyncGenerator | AsyncGenerator;
    -export declare const streamSync: typeof globStreamSync;
    -export declare const stream: typeof globStream & {
    -    sync: typeof globStreamSync;
    -};
    -export declare const iterateSync: typeof globIterateSync;
    -export declare const iterate: typeof globIterate & {
    -    sync: typeof globIterateSync;
    -};
    -export declare const sync: typeof globSync & {
    -    stream: typeof globStreamSync;
    -    iterate: typeof globIterateSync;
    -};
    -export { escape, unescape } from 'minimatch';
    -export { Glob } from './glob.js';
    -export type { GlobOptions, GlobOptionsWithFileTypesFalse, GlobOptionsWithFileTypesTrue, GlobOptionsWithFileTypesUnset, } from './glob.js';
    -export { hasMagic } from './has-magic.js';
    -export type { IgnoreLike } from './ignore.js';
    -export type { MatchStream } from './walker.js';
    -export declare const glob: typeof glob_ & {
    -    glob: typeof glob_;
    -    globSync: typeof globSync;
    -    sync: typeof globSync & {
    -        stream: typeof globStreamSync;
    -        iterate: typeof globIterateSync;
    -    };
    -    globStream: typeof globStream;
    -    stream: typeof globStream & {
    -        sync: typeof globStreamSync;
    -    };
    -    globStreamSync: typeof globStreamSync;
    -    streamSync: typeof globStreamSync;
    -    globIterate: typeof globIterate;
    -    iterate: typeof globIterate & {
    -        sync: typeof globIterateSync;
    -    };
    -    globIterateSync: typeof globIterateSync;
    -    iterateSync: typeof globIterateSync;
    -    Glob: typeof Glob;
    -    hasMagic: (pattern: string | string[], options?: GlobOptions) => boolean;
    -    escape: (s: string, { windowsPathsNoEscape, }?: Pick | undefined) => string;
    -    unescape: (s: string, { windowsPathsNoEscape, }?: Pick | undefined) => string;
    -};
    -//# sourceMappingURL=index.d.ts.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/index.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/index.d.ts.map
    deleted file mode 100644
    index 4e9ba085ce45b2..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/index.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,KAAK,EACV,WAAW,EACX,6BAA6B,EAC7B,4BAA4B,EAC5B,6BAA6B,EAC9B,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAGhC;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AACvB,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAC3B,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAC3B,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAQlD;;;GAGG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAC3B,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AACvB,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAC3B,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAQlD;;GAEG;AACH,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,MAAM,EAAE,CAAA;AACX,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,IAAI,EAAE,CAAA;AACT,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,MAAM,EAAE,CAAA;AACX,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,IAAI,EAAE,GAAG,MAAM,EAAE,CAAA;AAQpB;;;;;GAKG;AACH,iBAAe,KAAK,CAClB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;AACpB,iBAAe,KAAK,CAClB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;AAClB,iBAAe,KAAK,CAClB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;AACpB,iBAAe,KAAK,CAClB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;AAQ7B;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAChC,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAC9B,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAChC,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAQ9D;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACrC,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACnC,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACrC,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AASxE,eAAO,MAAM,UAAU,uBAAiB,CAAA;AACxC,eAAO,MAAM,MAAM;;CAAsD,CAAA;AACzE,eAAO,MAAM,WAAW,wBAAkB,CAAA;AAC1C,eAAO,MAAM,OAAO;;CAElB,CAAA;AACF,eAAO,MAAM,IAAI;;;CAGf,CAAA;AAGF,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,YAAY,EACV,WAAW,EACX,6BAA6B,EAC7B,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAG9C,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;CAgBf,CAAA"}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/index.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/index.js
    deleted file mode 100644
    index 71c31c03dd339b..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/index.js
    +++ /dev/null
    @@ -1,68 +0,0 @@
    -"use strict";
    -Object.defineProperty(exports, "__esModule", { value: true });
    -exports.glob = exports.hasMagic = exports.Glob = exports.unescape = exports.escape = exports.sync = exports.iterate = exports.iterateSync = exports.stream = exports.streamSync = exports.globIterate = exports.globIterateSync = exports.globSync = exports.globStream = exports.globStreamSync = void 0;
    -const minimatch_1 = require("minimatch");
    -const glob_js_1 = require("./glob.js");
    -const has_magic_js_1 = require("./has-magic.js");
    -function globStreamSync(pattern, options = {}) {
    -    return new glob_js_1.Glob(pattern, options).streamSync();
    -}
    -exports.globStreamSync = globStreamSync;
    -function globStream(pattern, options = {}) {
    -    return new glob_js_1.Glob(pattern, options).stream();
    -}
    -exports.globStream = globStream;
    -function globSync(pattern, options = {}) {
    -    return new glob_js_1.Glob(pattern, options).walkSync();
    -}
    -exports.globSync = globSync;
    -async function glob_(pattern, options = {}) {
    -    return new glob_js_1.Glob(pattern, options).walk();
    -}
    -function globIterateSync(pattern, options = {}) {
    -    return new glob_js_1.Glob(pattern, options).iterateSync();
    -}
    -exports.globIterateSync = globIterateSync;
    -function globIterate(pattern, options = {}) {
    -    return new glob_js_1.Glob(pattern, options).iterate();
    -}
    -exports.globIterate = globIterate;
    -// aliases: glob.sync.stream() glob.stream.sync() glob.sync() etc
    -exports.streamSync = globStreamSync;
    -exports.stream = Object.assign(globStream, { sync: globStreamSync });
    -exports.iterateSync = globIterateSync;
    -exports.iterate = Object.assign(globIterate, {
    -    sync: globIterateSync,
    -});
    -exports.sync = Object.assign(globSync, {
    -    stream: globStreamSync,
    -    iterate: globIterateSync,
    -});
    -/* c8 ignore start */
    -var minimatch_2 = require("minimatch");
    -Object.defineProperty(exports, "escape", { enumerable: true, get: function () { return minimatch_2.escape; } });
    -Object.defineProperty(exports, "unescape", { enumerable: true, get: function () { return minimatch_2.unescape; } });
    -var glob_js_2 = require("./glob.js");
    -Object.defineProperty(exports, "Glob", { enumerable: true, get: function () { return glob_js_2.Glob; } });
    -var has_magic_js_2 = require("./has-magic.js");
    -Object.defineProperty(exports, "hasMagic", { enumerable: true, get: function () { return has_magic_js_2.hasMagic; } });
    -/* c8 ignore stop */
    -exports.glob = Object.assign(glob_, {
    -    glob: glob_,
    -    globSync,
    -    sync: exports.sync,
    -    globStream,
    -    stream: exports.stream,
    -    globStreamSync,
    -    streamSync: exports.streamSync,
    -    globIterate,
    -    iterate: exports.iterate,
    -    globIterateSync,
    -    iterateSync: exports.iterateSync,
    -    Glob: glob_js_1.Glob,
    -    hasMagic: has_magic_js_1.hasMagic,
    -    escape: minimatch_1.escape,
    -    unescape: minimatch_1.unescape,
    -});
    -exports.glob.glob = exports.glob;
    -//# sourceMappingURL=index.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/index.js.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/index.js.map
    deleted file mode 100644
    index 060338fbd1b94b..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/index.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAA4C;AAS5C,uCAAgC;AAChC,iDAAyC;AAuBzC,SAAgB,cAAc,CAC5B,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,cAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,UAAU,EAAE,CAAA;AAChD,CAAC;AALD,wCAKC;AAsBD,SAAgB,UAAU,CACxB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,cAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,EAAE,CAAA;AAC5C,CAAC;AALD,gCAKC;AAqBD,SAAgB,QAAQ,CACtB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,cAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAA;AAC9C,CAAC;AALD,4BAKC;AAwBD,KAAK,UAAU,KAAK,CAClB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,cAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;AAC1C,CAAC;AAqBD,SAAgB,eAAe,CAC7B,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,cAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;AACjD,CAAC;AALD,0CAKC;AAqBD,SAAgB,WAAW,CACzB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,cAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,OAAO,EAAE,CAAA;AAC7C,CAAC;AALD,kCAKC;AAED,iEAAiE;AACpD,QAAA,UAAU,GAAG,cAAc,CAAA;AAC3B,QAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAA;AAC5D,QAAA,WAAW,GAAG,eAAe,CAAA;AAC7B,QAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;IAChD,IAAI,EAAE,eAAe;CACtB,CAAC,CAAA;AACW,QAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;IAC1C,MAAM,EAAE,cAAc;IACtB,OAAO,EAAE,eAAe;CACzB,CAAC,CAAA;AAEF,qBAAqB;AACrB,uCAA4C;AAAnC,mGAAA,MAAM,OAAA;AAAE,qGAAA,QAAQ,OAAA;AACzB,qCAAgC;AAAvB,+FAAA,IAAI,OAAA;AAOb,+CAAyC;AAAhC,wGAAA,QAAQ,OAAA;AAGjB,oBAAoB;AAEP,QAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;IACvC,IAAI,EAAE,KAAK;IACX,QAAQ;IACR,IAAI,EAAJ,YAAI;IACJ,UAAU;IACV,MAAM,EAAN,cAAM;IACN,cAAc;IACd,UAAU,EAAV,kBAAU;IACV,WAAW;IACX,OAAO,EAAP,eAAO;IACP,eAAe;IACf,WAAW,EAAX,mBAAW;IACX,IAAI,EAAJ,cAAI;IACJ,QAAQ,EAAR,uBAAQ;IACR,MAAM,EAAN,kBAAM;IACN,QAAQ,EAAR,oBAAQ;CACT,CAAC,CAAA;AACF,YAAI,CAAC,IAAI,GAAG,YAAI,CAAA","sourcesContent":["import { escape, unescape } from 'minimatch'\nimport { Minipass } from 'minipass'\nimport { Path } from 'path-scurry'\nimport type {\n  GlobOptions,\n  GlobOptionsWithFileTypesFalse,\n  GlobOptionsWithFileTypesTrue,\n  GlobOptionsWithFileTypesUnset,\n} from './glob.js'\nimport { Glob } from './glob.js'\nimport { hasMagic } from './has-magic.js'\n\n/**\n * Syncronous form of {@link globStream}. Will read all the matches as fast as\n * you consume them, even all in a single tick if you consume them immediately,\n * but will still respond to backpressure if they're not consumed immediately.\n */\nexport function globStreamSync(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesTrue\n): Minipass\nexport function globStreamSync(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesFalse\n): Minipass\nexport function globStreamSync(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesUnset\n): Minipass\nexport function globStreamSync(\n  pattern: string | string[],\n  options: GlobOptions\n): Minipass | Minipass\nexport function globStreamSync(\n  pattern: string | string[],\n  options: GlobOptions = {}\n) {\n  return new Glob(pattern, options).streamSync()\n}\n\n/**\n * Return a stream that emits all the strings or `Path` objects and\n * then emits `end` when completed.\n */\nexport function globStream(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesFalse\n): Minipass\nexport function globStream(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesTrue\n): Minipass\nexport function globStream(\n  pattern: string | string[],\n  options?: GlobOptionsWithFileTypesUnset | undefined\n): Minipass\nexport function globStream(\n  pattern: string | string[],\n  options: GlobOptions\n): Minipass | Minipass\nexport function globStream(\n  pattern: string | string[],\n  options: GlobOptions = {}\n) {\n  return new Glob(pattern, options).stream()\n}\n\n/**\n * Synchronous form of {@link glob}\n */\nexport function globSync(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesFalse\n): string[]\nexport function globSync(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesTrue\n): Path[]\nexport function globSync(\n  pattern: string | string[],\n  options?: GlobOptionsWithFileTypesUnset | undefined\n): string[]\nexport function globSync(\n  pattern: string | string[],\n  options: GlobOptions\n): Path[] | string[]\nexport function globSync(\n  pattern: string | string[],\n  options: GlobOptions = {}\n) {\n  return new Glob(pattern, options).walkSync()\n}\n\n/**\n * Perform an asynchronous glob search for the pattern(s) specified. Returns\n * [Path](https://isaacs.github.io/path-scurry/classes/PathBase) objects if the\n * {@link withFileTypes} option is set to `true`. See {@link GlobOptions} for\n * full option descriptions.\n */\nasync function glob_(\n  pattern: string | string[],\n  options?: GlobOptionsWithFileTypesUnset | undefined\n): Promise\nasync function glob_(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesTrue\n): Promise\nasync function glob_(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesFalse\n): Promise\nasync function glob_(\n  pattern: string | string[],\n  options: GlobOptions\n): Promise\nasync function glob_(\n  pattern: string | string[],\n  options: GlobOptions = {}\n) {\n  return new Glob(pattern, options).walk()\n}\n\n/**\n * Return a sync iterator for walking glob pattern matches.\n */\nexport function globIterateSync(\n  pattern: string | string[],\n  options?: GlobOptionsWithFileTypesUnset | undefined\n): Generator\nexport function globIterateSync(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesTrue\n): Generator\nexport function globIterateSync(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesFalse\n): Generator\nexport function globIterateSync(\n  pattern: string | string[],\n  options: GlobOptions\n): Generator | Generator\nexport function globIterateSync(\n  pattern: string | string[],\n  options: GlobOptions = {}\n) {\n  return new Glob(pattern, options).iterateSync()\n}\n\n/**\n * Return an async iterator for walking glob pattern matches.\n */\nexport function globIterate(\n  pattern: string | string[],\n  options?: GlobOptionsWithFileTypesUnset | undefined\n): AsyncGenerator\nexport function globIterate(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesTrue\n): AsyncGenerator\nexport function globIterate(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesFalse\n): AsyncGenerator\nexport function globIterate(\n  pattern: string | string[],\n  options: GlobOptions\n): AsyncGenerator | AsyncGenerator\nexport function globIterate(\n  pattern: string | string[],\n  options: GlobOptions = {}\n) {\n  return new Glob(pattern, options).iterate()\n}\n\n// aliases: glob.sync.stream() glob.stream.sync() glob.sync() etc\nexport const streamSync = globStreamSync\nexport const stream = Object.assign(globStream, { sync: globStreamSync })\nexport const iterateSync = globIterateSync\nexport const iterate = Object.assign(globIterate, {\n  sync: globIterateSync,\n})\nexport const sync = Object.assign(globSync, {\n  stream: globStreamSync,\n  iterate: globIterateSync,\n})\n\n/* c8 ignore start */\nexport { escape, unescape } from 'minimatch'\nexport { Glob } from './glob.js'\nexport type {\n  GlobOptions,\n  GlobOptionsWithFileTypesFalse,\n  GlobOptionsWithFileTypesTrue,\n  GlobOptionsWithFileTypesUnset,\n} from './glob.js'\nexport { hasMagic } from './has-magic.js'\nexport type { IgnoreLike } from './ignore.js'\nexport type { MatchStream } from './walker.js'\n/* c8 ignore stop */\n\nexport const glob = Object.assign(glob_, {\n  glob: glob_,\n  globSync,\n  sync,\n  globStream,\n  stream,\n  globStreamSync,\n  streamSync,\n  globIterate,\n  iterate,\n  globIterateSync,\n  iterateSync,\n  Glob,\n  hasMagic,\n  escape,\n  unescape,\n})\nglob.glob = glob\n"]}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/pattern.d.ts b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/pattern.d.ts
    deleted file mode 100644
    index 109cc4e7a5dae3..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/pattern.d.ts
    +++ /dev/null
    @@ -1,77 +0,0 @@
    -/// 
    -import { GLOBSTAR } from 'minimatch';
    -export type MMPattern = string | RegExp | typeof GLOBSTAR;
    -export type PatternList = [p: MMPattern, ...rest: MMPattern[]];
    -export type UNCPatternList = [
    -    p0: '',
    -    p1: '',
    -    p2: string,
    -    p3: string,
    -    ...rest: MMPattern[]
    -];
    -export type DrivePatternList = [p0: string, ...rest: MMPattern[]];
    -export type AbsolutePatternList = [p0: '', ...rest: MMPattern[]];
    -export type GlobList = [p: string, ...rest: string[]];
    -/**
    - * An immutable-ish view on an array of glob parts and their parsed
    - * results
    - */
    -export declare class Pattern {
    -    #private;
    -    readonly length: number;
    -    constructor(patternList: MMPattern[], globList: string[], index: number, platform: NodeJS.Platform);
    -    /**
    -     * The first entry in the parsed list of patterns
    -     */
    -    pattern(): MMPattern;
    -    /**
    -     * true of if pattern() returns a string
    -     */
    -    isString(): boolean;
    -    /**
    -     * true of if pattern() returns GLOBSTAR
    -     */
    -    isGlobstar(): boolean;
    -    /**
    -     * true if pattern() returns a regexp
    -     */
    -    isRegExp(): boolean;
    -    /**
    -     * The /-joined set of glob parts that make up this pattern
    -     */
    -    globString(): string;
    -    /**
    -     * true if there are more pattern parts after this one
    -     */
    -    hasMore(): boolean;
    -    /**
    -     * The rest of the pattern after this part, or null if this is the end
    -     */
    -    rest(): Pattern | null;
    -    /**
    -     * true if the pattern represents a //unc/path/ on windows
    -     */
    -    isUNC(): boolean;
    -    /**
    -     * True if the pattern starts with a drive letter on Windows
    -     */
    -    isDrive(): boolean;
    -    /**
    -     * True if the pattern is rooted on an absolute path
    -     */
    -    isAbsolute(): boolean;
    -    /**
    -     * consume the root of the pattern, and return it
    -     */
    -    root(): string;
    -    /**
    -     * Check to see if the current globstar pattern is allowed to follow
    -     * a symbolic link.
    -     */
    -    checkFollowGlobstar(): boolean;
    -    /**
    -     * Mark that the current globstar pattern is following a symbolic link
    -     */
    -    markFollowGlobstar(): boolean;
    -}
    -//# sourceMappingURL=pattern.d.ts.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/pattern.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/pattern.d.ts.map
    deleted file mode 100644
    index 48430f63db0947..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/pattern.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"pattern.d.ts","sourceRoot":"","sources":["../../../src/pattern.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,QAAQ,CAAA;AAGzD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;AAC9D,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,MAAM;IACV,GAAG,IAAI,EAAE,SAAS,EAAE;CACrB,CAAA;AACD,MAAM,MAAM,gBAAgB,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;AACjE,MAAM,MAAM,mBAAmB,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;AAChE,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;AAMrD;;;GAGG;AACH,qBAAa,OAAO;;IAIlB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;gBAUrB,WAAW,EAAE,SAAS,EAAE,EACxB,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,CAAC,QAAQ;IA6D3B;;OAEG;IACH,OAAO,IAAI,SAAS;IAIpB;;OAEG;IACH,QAAQ,IAAI,OAAO;IAGnB;;OAEG;IACH,UAAU,IAAI,OAAO;IAGrB;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACH,UAAU,IAAI,MAAM;IAUpB;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,IAAI,IAAI,OAAO,GAAG,IAAI;IAetB;;OAEG;IACH,KAAK,IAAI,OAAO;IAoBhB;;OAEG;IACH,OAAO,IAAI,OAAO;IAelB;;OAEG;IACH,UAAU,IAAI,OAAO;IAUrB;;OAEG;IACH,IAAI,IAAI,MAAM;IAOd;;;OAGG;IACH,mBAAmB,IAAI,OAAO;IAQ9B;;OAEG;IACH,kBAAkB,IAAI,OAAO;CAM9B"}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/pattern.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/pattern.js
    deleted file mode 100644
    index 181371293d8605..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/pattern.js
    +++ /dev/null
    @@ -1,219 +0,0 @@
    -"use strict";
    -// this is just a very light wrapper around 2 arrays with an offset index
    -Object.defineProperty(exports, "__esModule", { value: true });
    -exports.Pattern = void 0;
    -const minimatch_1 = require("minimatch");
    -const isPatternList = (pl) => pl.length >= 1;
    -const isGlobList = (gl) => gl.length >= 1;
    -/**
    - * An immutable-ish view on an array of glob parts and their parsed
    - * results
    - */
    -class Pattern {
    -    #patternList;
    -    #globList;
    -    #index;
    -    length;
    -    #platform;
    -    #rest;
    -    #globString;
    -    #isDrive;
    -    #isUNC;
    -    #isAbsolute;
    -    #followGlobstar = true;
    -    constructor(patternList, globList, index, platform) {
    -        if (!isPatternList(patternList)) {
    -            throw new TypeError('empty pattern list');
    -        }
    -        if (!isGlobList(globList)) {
    -            throw new TypeError('empty glob list');
    -        }
    -        if (globList.length !== patternList.length) {
    -            throw new TypeError('mismatched pattern list and glob list lengths');
    -        }
    -        this.length = patternList.length;
    -        if (index < 0 || index >= this.length) {
    -            throw new TypeError('index out of range');
    -        }
    -        this.#patternList = patternList;
    -        this.#globList = globList;
    -        this.#index = index;
    -        this.#platform = platform;
    -        // normalize root entries of absolute patterns on initial creation.
    -        if (this.#index === 0) {
    -            // c: => ['c:/']
    -            // C:/ => ['C:/']
    -            // C:/x => ['C:/', 'x']
    -            // //host/share => ['//host/share/']
    -            // //host/share/ => ['//host/share/']
    -            // //host/share/x => ['//host/share/', 'x']
    -            // /etc => ['/', 'etc']
    -            // / => ['/']
    -            if (this.isUNC()) {
    -                // '' / '' / 'host' / 'share'
    -                const [p0, p1, p2, p3, ...prest] = this.#patternList;
    -                const [g0, g1, g2, g3, ...grest] = this.#globList;
    -                if (prest[0] === '') {
    -                    // ends in /
    -                    prest.shift();
    -                    grest.shift();
    -                }
    -                const p = [p0, p1, p2, p3, ''].join('/');
    -                const g = [g0, g1, g2, g3, ''].join('/');
    -                this.#patternList = [p, ...prest];
    -                this.#globList = [g, ...grest];
    -                this.length = this.#patternList.length;
    -            }
    -            else if (this.isDrive() || this.isAbsolute()) {
    -                const [p1, ...prest] = this.#patternList;
    -                const [g1, ...grest] = this.#globList;
    -                if (prest[0] === '') {
    -                    // ends in /
    -                    prest.shift();
    -                    grest.shift();
    -                }
    -                const p = p1 + '/';
    -                const g = g1 + '/';
    -                this.#patternList = [p, ...prest];
    -                this.#globList = [g, ...grest];
    -                this.length = this.#patternList.length;
    -            }
    -        }
    -    }
    -    /**
    -     * The first entry in the parsed list of patterns
    -     */
    -    pattern() {
    -        return this.#patternList[this.#index];
    -    }
    -    /**
    -     * true of if pattern() returns a string
    -     */
    -    isString() {
    -        return typeof this.#patternList[this.#index] === 'string';
    -    }
    -    /**
    -     * true of if pattern() returns GLOBSTAR
    -     */
    -    isGlobstar() {
    -        return this.#patternList[this.#index] === minimatch_1.GLOBSTAR;
    -    }
    -    /**
    -     * true if pattern() returns a regexp
    -     */
    -    isRegExp() {
    -        return this.#patternList[this.#index] instanceof RegExp;
    -    }
    -    /**
    -     * The /-joined set of glob parts that make up this pattern
    -     */
    -    globString() {
    -        return (this.#globString =
    -            this.#globString ||
    -                (this.#index === 0
    -                    ? this.isAbsolute()
    -                        ? this.#globList[0] + this.#globList.slice(1).join('/')
    -                        : this.#globList.join('/')
    -                    : this.#globList.slice(this.#index).join('/')));
    -    }
    -    /**
    -     * true if there are more pattern parts after this one
    -     */
    -    hasMore() {
    -        return this.length > this.#index + 1;
    -    }
    -    /**
    -     * The rest of the pattern after this part, or null if this is the end
    -     */
    -    rest() {
    -        if (this.#rest !== undefined)
    -            return this.#rest;
    -        if (!this.hasMore())
    -            return (this.#rest = null);
    -        this.#rest = new Pattern(this.#patternList, this.#globList, this.#index + 1, this.#platform);
    -        this.#rest.#isAbsolute = this.#isAbsolute;
    -        this.#rest.#isUNC = this.#isUNC;
    -        this.#rest.#isDrive = this.#isDrive;
    -        return this.#rest;
    -    }
    -    /**
    -     * true if the pattern represents a //unc/path/ on windows
    -     */
    -    isUNC() {
    -        const pl = this.#patternList;
    -        return this.#isUNC !== undefined
    -            ? this.#isUNC
    -            : (this.#isUNC =
    -                this.#platform === 'win32' &&
    -                    this.#index === 0 &&
    -                    pl[0] === '' &&
    -                    pl[1] === '' &&
    -                    typeof pl[2] === 'string' &&
    -                    !!pl[2] &&
    -                    typeof pl[3] === 'string' &&
    -                    !!pl[3]);
    -    }
    -    // pattern like C:/...
    -    // split = ['C:', ...]
    -    // XXX: would be nice to handle patterns like `c:*` to test the cwd
    -    // in c: for *, but I don't know of a way to even figure out what that
    -    // cwd is without actually chdir'ing into it?
    -    /**
    -     * True if the pattern starts with a drive letter on Windows
    -     */
    -    isDrive() {
    -        const pl = this.#patternList;
    -        return this.#isDrive !== undefined
    -            ? this.#isDrive
    -            : (this.#isDrive =
    -                this.#platform === 'win32' &&
    -                    this.#index === 0 &&
    -                    this.length > 1 &&
    -                    typeof pl[0] === 'string' &&
    -                    /^[a-z]:$/i.test(pl[0]));
    -    }
    -    // pattern = '/' or '/...' or '/x/...'
    -    // split = ['', ''] or ['', ...] or ['', 'x', ...]
    -    // Drive and UNC both considered absolute on windows
    -    /**
    -     * True if the pattern is rooted on an absolute path
    -     */
    -    isAbsolute() {
    -        const pl = this.#patternList;
    -        return this.#isAbsolute !== undefined
    -            ? this.#isAbsolute
    -            : (this.#isAbsolute =
    -                (pl[0] === '' && pl.length > 1) ||
    -                    this.isDrive() ||
    -                    this.isUNC());
    -    }
    -    /**
    -     * consume the root of the pattern, and return it
    -     */
    -    root() {
    -        const p = this.#patternList[0];
    -        return typeof p === 'string' && this.isAbsolute() && this.#index === 0
    -            ? p
    -            : '';
    -    }
    -    /**
    -     * Check to see if the current globstar pattern is allowed to follow
    -     * a symbolic link.
    -     */
    -    checkFollowGlobstar() {
    -        return !(this.#index === 0 ||
    -            !this.isGlobstar() ||
    -            !this.#followGlobstar);
    -    }
    -    /**
    -     * Mark that the current globstar pattern is following a symbolic link
    -     */
    -    markFollowGlobstar() {
    -        if (this.#index === 0 || !this.isGlobstar() || !this.#followGlobstar)
    -            return false;
    -        this.#followGlobstar = false;
    -        return true;
    -    }
    -}
    -exports.Pattern = Pattern;
    -//# sourceMappingURL=pattern.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/pattern.js.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/pattern.js.map
    deleted file mode 100644
    index ba5293ff9f2489..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/pattern.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"pattern.js","sourceRoot":"","sources":["../../../src/pattern.ts"],"names":[],"mappings":";AAAA,yEAAyE;;;AAEzE,yCAAoC;AAgBpC,MAAM,aAAa,GAAG,CAAC,EAAe,EAAqB,EAAE,CAC3D,EAAE,CAAC,MAAM,IAAI,CAAC,CAAA;AAChB,MAAM,UAAU,GAAG,CAAC,EAAY,EAAkB,EAAE,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,CAAA;AAEnE;;;GAGG;AACH,MAAa,OAAO;IACT,YAAY,CAAa;IACzB,SAAS,CAAU;IACnB,MAAM,CAAQ;IACd,MAAM,CAAQ;IACd,SAAS,CAAiB;IACnC,KAAK,CAAiB;IACtB,WAAW,CAAS;IACpB,QAAQ,CAAU;IAClB,MAAM,CAAU;IAChB,WAAW,CAAU;IACrB,eAAe,GAAY,IAAI,CAAA;IAE/B,YACE,WAAwB,EACxB,QAAkB,EAClB,KAAa,EACb,QAAyB;QAEzB,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE;YAC/B,MAAM,IAAI,SAAS,CAAC,oBAAoB,CAAC,CAAA;SAC1C;QACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;YACzB,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;SACvC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,EAAE;YAC1C,MAAM,IAAI,SAAS,CAAC,+CAA+C,CAAC,CAAA;SACrE;QACD,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAA;QAChC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE;YACrC,MAAM,IAAI,SAAS,CAAC,oBAAoB,CAAC,CAAA;SAC1C;QACD,IAAI,CAAC,YAAY,GAAG,WAAW,CAAA;QAC/B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QACzB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QAEzB,mEAAmE;QACnE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YACrB,gBAAgB;YAChB,iBAAiB;YACjB,uBAAuB;YACvB,oCAAoC;YACpC,qCAAqC;YACrC,2CAA2C;YAC3C,uBAAuB;YACvB,aAAa;YACb,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE;gBAChB,6BAA6B;gBAC7B,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,YAAY,CAAA;gBACpD,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAA;gBACjD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE;oBACnB,YAAY;oBACZ,KAAK,CAAC,KAAK,EAAE,CAAA;oBACb,KAAK,CAAC,KAAK,EAAE,CAAA;iBACd;gBACD,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACxC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACxC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAA;gBACjC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAA;gBAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAA;aACvC;iBAAM,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;gBAC9C,MAAM,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,YAAY,CAAA;gBACxC,MAAM,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAA;gBACrC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE;oBACnB,YAAY;oBACZ,KAAK,CAAC,KAAK,EAAE,CAAA;oBACb,KAAK,CAAC,KAAK,EAAE,CAAA;iBACd;gBACD,MAAM,CAAC,GAAI,EAAa,GAAG,GAAG,CAAA;gBAC9B,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,CAAA;gBAClB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAA;gBACjC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAA;gBAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAA;aACvC;SACF;IACH,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACvC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAA;IAC3D,CAAC;IACD;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,oBAAQ,CAAA;IACpD,CAAC;IACD;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,MAAM,CAAA;IACzD,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,CAAC,IAAI,CAAC,WAAW;YACtB,IAAI,CAAC,WAAW;gBAChB,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;oBAChB,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE;wBACjB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;wBACvD,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;oBAC5B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACrD,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,KAAK,CAAA;QAC/C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAA;QAC/C,IAAI,CAAC,KAAK,GAAG,IAAI,OAAO,CACtB,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,MAAM,GAAG,CAAC,EACf,IAAI,CAAC,SAAS,CACf,CAAA;QACD,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;QACzC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAC/B,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QACnC,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAA;QAC5B,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS;YAC9B,CAAC,CAAC,IAAI,CAAC,MAAM;YACb,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM;gBACV,IAAI,CAAC,SAAS,KAAK,OAAO;oBAC1B,IAAI,CAAC,MAAM,KAAK,CAAC;oBACjB,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE;oBACZ,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE;oBACZ,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,QAAQ;oBACzB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBACP,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,QAAQ;oBACzB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IAED,sBAAsB;IACtB,sBAAsB;IACtB,mEAAmE;IACnE,sEAAsE;IACtE,6CAA6C;IAC7C;;OAEG;IACH,OAAO;QACL,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAA;QAC5B,OAAO,IAAI,CAAC,QAAQ,KAAK,SAAS;YAChC,CAAC,CAAC,IAAI,CAAC,QAAQ;YACf,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ;gBACZ,IAAI,CAAC,SAAS,KAAK,OAAO;oBAC1B,IAAI,CAAC,MAAM,KAAK,CAAC;oBACjB,IAAI,CAAC,MAAM,GAAG,CAAC;oBACf,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,QAAQ;oBACzB,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAChC,CAAC;IAED,sCAAsC;IACtC,kDAAkD;IAClD,oDAAoD;IACpD;;OAEG;IACH,UAAU;QACR,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAA;QAC5B,OAAO,IAAI,CAAC,WAAW,KAAK,SAAS;YACnC,CAAC,CAAC,IAAI,CAAC,WAAW;YAClB,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW;gBACf,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;oBAC/B,IAAI,CAAC,OAAO,EAAE;oBACd,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;IACrB,CAAC;IAED;;OAEG;IACH,IAAI;QACF,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC9B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YACpE,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,EAAE,CAAA;IACR,CAAC;IAED;;;OAGG;IACH,mBAAmB;QACjB,OAAO,CAAC,CACN,IAAI,CAAC,MAAM,KAAK,CAAC;YACjB,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,CAAC,IAAI,CAAC,eAAe,CACtB,CAAA;IACH,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe;YAClE,OAAO,KAAK,CAAA;QACd,IAAI,CAAC,eAAe,GAAG,KAAK,CAAA;QAC5B,OAAO,IAAI,CAAA;IACb,CAAC;CACF;AAnOD,0BAmOC","sourcesContent":["// this is just a very light wrapper around 2 arrays with an offset index\n\nimport { GLOBSTAR } from 'minimatch'\nexport type MMPattern = string | RegExp | typeof GLOBSTAR\n\n// an array of length >= 1\nexport type PatternList = [p: MMPattern, ...rest: MMPattern[]]\nexport type UNCPatternList = [\n  p0: '',\n  p1: '',\n  p2: string,\n  p3: string,\n  ...rest: MMPattern[]\n]\nexport type DrivePatternList = [p0: string, ...rest: MMPattern[]]\nexport type AbsolutePatternList = [p0: '', ...rest: MMPattern[]]\nexport type GlobList = [p: string, ...rest: string[]]\n\nconst isPatternList = (pl: MMPattern[]): pl is PatternList =>\n  pl.length >= 1\nconst isGlobList = (gl: string[]): gl is GlobList => gl.length >= 1\n\n/**\n * An immutable-ish view on an array of glob parts and their parsed\n * results\n */\nexport class Pattern {\n  readonly #patternList: PatternList\n  readonly #globList: GlobList\n  readonly #index: number\n  readonly length: number\n  readonly #platform: NodeJS.Platform\n  #rest?: Pattern | null\n  #globString?: string\n  #isDrive?: boolean\n  #isUNC?: boolean\n  #isAbsolute?: boolean\n  #followGlobstar: boolean = true\n\n  constructor(\n    patternList: MMPattern[],\n    globList: string[],\n    index: number,\n    platform: NodeJS.Platform\n  ) {\n    if (!isPatternList(patternList)) {\n      throw new TypeError('empty pattern list')\n    }\n    if (!isGlobList(globList)) {\n      throw new TypeError('empty glob list')\n    }\n    if (globList.length !== patternList.length) {\n      throw new TypeError('mismatched pattern list and glob list lengths')\n    }\n    this.length = patternList.length\n    if (index < 0 || index >= this.length) {\n      throw new TypeError('index out of range')\n    }\n    this.#patternList = patternList\n    this.#globList = globList\n    this.#index = index\n    this.#platform = platform\n\n    // normalize root entries of absolute patterns on initial creation.\n    if (this.#index === 0) {\n      // c: => ['c:/']\n      // C:/ => ['C:/']\n      // C:/x => ['C:/', 'x']\n      // //host/share => ['//host/share/']\n      // //host/share/ => ['//host/share/']\n      // //host/share/x => ['//host/share/', 'x']\n      // /etc => ['/', 'etc']\n      // / => ['/']\n      if (this.isUNC()) {\n        // '' / '' / 'host' / 'share'\n        const [p0, p1, p2, p3, ...prest] = this.#patternList\n        const [g0, g1, g2, g3, ...grest] = this.#globList\n        if (prest[0] === '') {\n          // ends in /\n          prest.shift()\n          grest.shift()\n        }\n        const p = [p0, p1, p2, p3, ''].join('/')\n        const g = [g0, g1, g2, g3, ''].join('/')\n        this.#patternList = [p, ...prest]\n        this.#globList = [g, ...grest]\n        this.length = this.#patternList.length\n      } else if (this.isDrive() || this.isAbsolute()) {\n        const [p1, ...prest] = this.#patternList\n        const [g1, ...grest] = this.#globList\n        if (prest[0] === '') {\n          // ends in /\n          prest.shift()\n          grest.shift()\n        }\n        const p = (p1 as string) + '/'\n        const g = g1 + '/'\n        this.#patternList = [p, ...prest]\n        this.#globList = [g, ...grest]\n        this.length = this.#patternList.length\n      }\n    }\n  }\n\n  /**\n   * The first entry in the parsed list of patterns\n   */\n  pattern(): MMPattern {\n    return this.#patternList[this.#index]\n  }\n\n  /**\n   * true of if pattern() returns a string\n   */\n  isString(): boolean {\n    return typeof this.#patternList[this.#index] === 'string'\n  }\n  /**\n   * true of if pattern() returns GLOBSTAR\n   */\n  isGlobstar(): boolean {\n    return this.#patternList[this.#index] === GLOBSTAR\n  }\n  /**\n   * true if pattern() returns a regexp\n   */\n  isRegExp(): boolean {\n    return this.#patternList[this.#index] instanceof RegExp\n  }\n\n  /**\n   * The /-joined set of glob parts that make up this pattern\n   */\n  globString(): string {\n    return (this.#globString =\n      this.#globString ||\n      (this.#index === 0\n        ? this.isAbsolute()\n          ? this.#globList[0] + this.#globList.slice(1).join('/')\n          : this.#globList.join('/')\n        : this.#globList.slice(this.#index).join('/')))\n  }\n\n  /**\n   * true if there are more pattern parts after this one\n   */\n  hasMore(): boolean {\n    return this.length > this.#index + 1\n  }\n\n  /**\n   * The rest of the pattern after this part, or null if this is the end\n   */\n  rest(): Pattern | null {\n    if (this.#rest !== undefined) return this.#rest\n    if (!this.hasMore()) return (this.#rest = null)\n    this.#rest = new Pattern(\n      this.#patternList,\n      this.#globList,\n      this.#index + 1,\n      this.#platform\n    )\n    this.#rest.#isAbsolute = this.#isAbsolute\n    this.#rest.#isUNC = this.#isUNC\n    this.#rest.#isDrive = this.#isDrive\n    return this.#rest\n  }\n\n  /**\n   * true if the pattern represents a //unc/path/ on windows\n   */\n  isUNC(): boolean {\n    const pl = this.#patternList\n    return this.#isUNC !== undefined\n      ? this.#isUNC\n      : (this.#isUNC =\n          this.#platform === 'win32' &&\n          this.#index === 0 &&\n          pl[0] === '' &&\n          pl[1] === '' &&\n          typeof pl[2] === 'string' &&\n          !!pl[2] &&\n          typeof pl[3] === 'string' &&\n          !!pl[3])\n  }\n\n  // pattern like C:/...\n  // split = ['C:', ...]\n  // XXX: would be nice to handle patterns like `c:*` to test the cwd\n  // in c: for *, but I don't know of a way to even figure out what that\n  // cwd is without actually chdir'ing into it?\n  /**\n   * True if the pattern starts with a drive letter on Windows\n   */\n  isDrive(): boolean {\n    const pl = this.#patternList\n    return this.#isDrive !== undefined\n      ? this.#isDrive\n      : (this.#isDrive =\n          this.#platform === 'win32' &&\n          this.#index === 0 &&\n          this.length > 1 &&\n          typeof pl[0] === 'string' &&\n          /^[a-z]:$/i.test(pl[0]))\n  }\n\n  // pattern = '/' or '/...' or '/x/...'\n  // split = ['', ''] or ['', ...] or ['', 'x', ...]\n  // Drive and UNC both considered absolute on windows\n  /**\n   * True if the pattern is rooted on an absolute path\n   */\n  isAbsolute(): boolean {\n    const pl = this.#patternList\n    return this.#isAbsolute !== undefined\n      ? this.#isAbsolute\n      : (this.#isAbsolute =\n          (pl[0] === '' && pl.length > 1) ||\n          this.isDrive() ||\n          this.isUNC())\n  }\n\n  /**\n   * consume the root of the pattern, and return it\n   */\n  root(): string {\n    const p = this.#patternList[0]\n    return typeof p === 'string' && this.isAbsolute() && this.#index === 0\n      ? p\n      : ''\n  }\n\n  /**\n   * Check to see if the current globstar pattern is allowed to follow\n   * a symbolic link.\n   */\n  checkFollowGlobstar(): boolean {\n    return !(\n      this.#index === 0 ||\n      !this.isGlobstar() ||\n      !this.#followGlobstar\n    )\n  }\n\n  /**\n   * Mark that the current globstar pattern is following a symbolic link\n   */\n  markFollowGlobstar(): boolean {\n    if (this.#index === 0 || !this.isGlobstar() || !this.#followGlobstar)\n      return false\n    this.#followGlobstar = false\n    return true\n  }\n}\n"]}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/processor.d.ts b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/processor.d.ts
    deleted file mode 100644
    index ccedfbf2820f7d..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/processor.d.ts
    +++ /dev/null
    @@ -1,59 +0,0 @@
    -import { MMRegExp } from 'minimatch';
    -import { Path } from 'path-scurry';
    -import { Pattern } from './pattern.js';
    -import { GlobWalkerOpts } from './walker.js';
    -/**
    - * A cache of which patterns have been processed for a given Path
    - */
    -export declare class HasWalkedCache {
    -    store: Map>;
    -    constructor(store?: Map>);
    -    copy(): HasWalkedCache;
    -    hasWalked(target: Path, pattern: Pattern): boolean | undefined;
    -    storeWalked(target: Path, pattern: Pattern): void;
    -}
    -/**
    - * A record of which paths have been matched in a given walk step,
    - * and whether they only are considered a match if they are a directory,
    - * and whether their absolute or relative path should be returned.
    - */
    -export declare class MatchRecord {
    -    store: Map;
    -    add(target: Path, absolute: boolean, ifDir: boolean): void;
    -    entries(): [Path, boolean, boolean][];
    -}
    -/**
    - * A collection of patterns that must be processed in a subsequent step
    - * for a given path.
    - */
    -export declare class SubWalks {
    -    store: Map;
    -    add(target: Path, pattern: Pattern): void;
    -    get(target: Path): Pattern[];
    -    entries(): [Path, Pattern[]][];
    -    keys(): Path[];
    -}
    -/**
    - * The class that processes patterns for a given path.
    - *
    - * Handles child entry filtering, and determining whether a path's
    - * directory contents must be read.
    - */
    -export declare class Processor {
    -    hasWalkedCache: HasWalkedCache;
    -    matches: MatchRecord;
    -    subwalks: SubWalks;
    -    patterns?: Pattern[];
    -    follow: boolean;
    -    dot: boolean;
    -    opts: GlobWalkerOpts;
    -    constructor(opts: GlobWalkerOpts, hasWalkedCache?: HasWalkedCache);
    -    processPatterns(target: Path, patterns: Pattern[]): this;
    -    subwalkTargets(): Path[];
    -    child(): Processor;
    -    filterEntries(parent: Path, entries: Path[]): Processor;
    -    testGlobstar(e: Path, pattern: Pattern, rest: Pattern | null, absolute: boolean): void;
    -    testRegExp(e: Path, p: MMRegExp, rest: Pattern | null, absolute: boolean): void;
    -    testString(e: Path, p: string, rest: Pattern | null, absolute: boolean): void;
    -}
    -//# sourceMappingURL=processor.d.ts.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/processor.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/processor.d.ts.map
    deleted file mode 100644
    index ca6c63ca264b27..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/processor.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../../../src/processor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAY,QAAQ,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAa,OAAO,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C;;GAEG;AACH,qBAAa,cAAc;IACzB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;gBACnB,KAAK,GAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAGvD,IAAI;IAGJ,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO;IAGxC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO;CAM3C;AAED;;;;GAIG;AACH,qBAAa,WAAW;IACtB,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAY;IACpC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;IAMnD,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE;CAOtC;AAED;;;GAGG;AACH,qBAAa,QAAQ;IACnB,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAY;IACvC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO;IAWlC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,EAAE;IAS5B,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE;IAG9B,IAAI,IAAI,IAAI,EAAE;CAGf;AAED;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,cAAc,EAAE,cAAc,CAAA;IAC9B,OAAO,cAAoB;IAC3B,QAAQ,WAAiB;IACzB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;IACpB,MAAM,EAAE,OAAO,CAAA;IACf,GAAG,EAAE,OAAO,CAAA;IACZ,IAAI,EAAE,cAAc,CAAA;gBAER,IAAI,EAAE,cAAc,EAAE,cAAc,CAAC,EAAE,cAAc;IASjE,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE;IAwGjD,cAAc,IAAI,IAAI,EAAE;IAIxB,KAAK;IAQL,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,SAAS;IAqBvD,YAAY,CACV,CAAC,EAAE,IAAI,EACP,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,OAAO,GAAG,IAAI,EACpB,QAAQ,EAAE,OAAO;IA8CnB,UAAU,CACR,CAAC,EAAE,IAAI,EACP,CAAC,EAAE,QAAQ,EACX,IAAI,EAAE,OAAO,GAAG,IAAI,EACpB,QAAQ,EAAE,OAAO;IAUnB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO;CASvE"}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/processor.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/processor.js
    deleted file mode 100644
    index bd067e9b9033dc..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/processor.js
    +++ /dev/null
    @@ -1,309 +0,0 @@
    -"use strict";
    -// synchronous utility for filtering entries and calculating subwalks
    -Object.defineProperty(exports, "__esModule", { value: true });
    -exports.Processor = exports.SubWalks = exports.MatchRecord = exports.HasWalkedCache = void 0;
    -const minimatch_1 = require("minimatch");
    -/**
    - * A cache of which patterns have been processed for a given Path
    - */
    -class HasWalkedCache {
    -    store;
    -    constructor(store = new Map()) {
    -        this.store = store;
    -    }
    -    copy() {
    -        return new HasWalkedCache(new Map(this.store));
    -    }
    -    hasWalked(target, pattern) {
    -        return this.store.get(target.fullpath())?.has(pattern.globString());
    -    }
    -    storeWalked(target, pattern) {
    -        const fullpath = target.fullpath();
    -        const cached = this.store.get(fullpath);
    -        if (cached)
    -            cached.add(pattern.globString());
    -        else
    -            this.store.set(fullpath, new Set([pattern.globString()]));
    -    }
    -}
    -exports.HasWalkedCache = HasWalkedCache;
    -/**
    - * A record of which paths have been matched in a given walk step,
    - * and whether they only are considered a match if they are a directory,
    - * and whether their absolute or relative path should be returned.
    - */
    -class MatchRecord {
    -    store = new Map();
    -    add(target, absolute, ifDir) {
    -        const n = (absolute ? 2 : 0) | (ifDir ? 1 : 0);
    -        const current = this.store.get(target);
    -        this.store.set(target, current === undefined ? n : n & current);
    -    }
    -    // match, absolute, ifdir
    -    entries() {
    -        return [...this.store.entries()].map(([path, n]) => [
    -            path,
    -            !!(n & 2),
    -            !!(n & 1),
    -        ]);
    -    }
    -}
    -exports.MatchRecord = MatchRecord;
    -/**
    - * A collection of patterns that must be processed in a subsequent step
    - * for a given path.
    - */
    -class SubWalks {
    -    store = new Map();
    -    add(target, pattern) {
    -        if (!target.canReaddir()) {
    -            return;
    -        }
    -        const subs = this.store.get(target);
    -        if (subs) {
    -            if (!subs.find(p => p.globString() === pattern.globString())) {
    -                subs.push(pattern);
    -            }
    -        }
    -        else
    -            this.store.set(target, [pattern]);
    -    }
    -    get(target) {
    -        const subs = this.store.get(target);
    -        /* c8 ignore start */
    -        if (!subs) {
    -            throw new Error('attempting to walk unknown path');
    -        }
    -        /* c8 ignore stop */
    -        return subs;
    -    }
    -    entries() {
    -        return this.keys().map(k => [k, this.store.get(k)]);
    -    }
    -    keys() {
    -        return [...this.store.keys()].filter(t => t.canReaddir());
    -    }
    -}
    -exports.SubWalks = SubWalks;
    -/**
    - * The class that processes patterns for a given path.
    - *
    - * Handles child entry filtering, and determining whether a path's
    - * directory contents must be read.
    - */
    -class Processor {
    -    hasWalkedCache;
    -    matches = new MatchRecord();
    -    subwalks = new SubWalks();
    -    patterns;
    -    follow;
    -    dot;
    -    opts;
    -    constructor(opts, hasWalkedCache) {
    -        this.opts = opts;
    -        this.follow = !!opts.follow;
    -        this.dot = !!opts.dot;
    -        this.hasWalkedCache = hasWalkedCache
    -            ? hasWalkedCache.copy()
    -            : new HasWalkedCache();
    -    }
    -    processPatterns(target, patterns) {
    -        this.patterns = patterns;
    -        const processingSet = patterns.map(p => [target, p]);
    -        // map of paths to the magic-starting subwalks they need to walk
    -        // first item in patterns is the filter
    -        for (let [t, pattern] of processingSet) {
    -            this.hasWalkedCache.storeWalked(t, pattern);
    -            const root = pattern.root();
    -            const absolute = pattern.isAbsolute() && this.opts.absolute !== false;
    -            // start absolute patterns at root
    -            if (root) {
    -                t = t.resolve(root === '/' && this.opts.root !== undefined
    -                    ? this.opts.root
    -                    : root);
    -                const rest = pattern.rest();
    -                if (!rest) {
    -                    this.matches.add(t, true, false);
    -                    continue;
    -                }
    -                else {
    -                    pattern = rest;
    -                }
    -            }
    -            if (t.isENOENT())
    -                continue;
    -            let p;
    -            let rest;
    -            let changed = false;
    -            while (typeof (p = pattern.pattern()) === 'string' &&
    -                (rest = pattern.rest())) {
    -                const c = t.resolve(p);
    -                // we can be reasonably sure that .. is a readable dir
    -                if (c.isUnknown() && p !== '..')
    -                    break;
    -                t = c;
    -                pattern = rest;
    -                changed = true;
    -            }
    -            p = pattern.pattern();
    -            rest = pattern.rest();
    -            if (changed) {
    -                if (this.hasWalkedCache.hasWalked(t, pattern))
    -                    continue;
    -                this.hasWalkedCache.storeWalked(t, pattern);
    -            }
    -            // now we have either a final string for a known entry,
    -            // more strings for an unknown entry,
    -            // or a pattern starting with magic, mounted on t.
    -            if (typeof p === 'string') {
    -                // must be final entry
    -                if (!rest) {
    -                    const ifDir = p === '..' || p === '' || p === '.';
    -                    this.matches.add(t.resolve(p), absolute, ifDir);
    -                }
    -                else {
    -                    this.subwalks.add(t, pattern);
    -                }
    -                continue;
    -            }
    -            else if (p === minimatch_1.GLOBSTAR) {
    -                // if no rest, match and subwalk pattern
    -                // if rest, process rest and subwalk pattern
    -                // if it's a symlink, but we didn't get here by way of a
    -                // globstar match (meaning it's the first time THIS globstar
    -                // has traversed a symlink), then we follow it. Otherwise, stop.
    -                if (!t.isSymbolicLink() ||
    -                    this.follow ||
    -                    pattern.checkFollowGlobstar()) {
    -                    this.subwalks.add(t, pattern);
    -                }
    -                const rp = rest?.pattern();
    -                const rrest = rest?.rest();
    -                if (!rest || ((rp === '' || rp === '.') && !rrest)) {
    -                    // only HAS to be a dir if it ends in **/ or **/.
    -                    // but ending in ** will match files as well.
    -                    this.matches.add(t, absolute, rp === '' || rp === '.');
    -                }
    -                else {
    -                    if (rp === '..') {
    -                        // this would mean you're matching **/.. at the fs root,
    -                        // and no thanks, I'm not gonna test that specific case.
    -                        /* c8 ignore start */
    -                        const tp = t.parent || t;
    -                        /* c8 ignore stop */
    -                        if (!rrest)
    -                            this.matches.add(tp, absolute, true);
    -                        else if (!this.hasWalkedCache.hasWalked(tp, rrest)) {
    -                            this.subwalks.add(tp, rrest);
    -                        }
    -                    }
    -                }
    -            }
    -            else if (p instanceof RegExp) {
    -                this.subwalks.add(t, pattern);
    -            }
    -        }
    -        return this;
    -    }
    -    subwalkTargets() {
    -        return this.subwalks.keys();
    -    }
    -    child() {
    -        return new Processor(this.opts, this.hasWalkedCache);
    -    }
    -    // return a new Processor containing the subwalks for each
    -    // child entry, and a set of matches, and
    -    // a hasWalkedCache that's a copy of this one
    -    // then we're going to call
    -    filterEntries(parent, entries) {
    -        const patterns = this.subwalks.get(parent);
    -        // put matches and entry walks into the results processor
    -        const results = this.child();
    -        for (const e of entries) {
    -            for (const pattern of patterns) {
    -                const absolute = pattern.isAbsolute();
    -                const p = pattern.pattern();
    -                const rest = pattern.rest();
    -                if (p === minimatch_1.GLOBSTAR) {
    -                    results.testGlobstar(e, pattern, rest, absolute);
    -                }
    -                else if (p instanceof RegExp) {
    -                    results.testRegExp(e, p, rest, absolute);
    -                }
    -                else {
    -                    results.testString(e, p, rest, absolute);
    -                }
    -            }
    -        }
    -        return results;
    -    }
    -    testGlobstar(e, pattern, rest, absolute) {
    -        if (this.dot || !e.name.startsWith('.')) {
    -            if (!pattern.hasMore()) {
    -                this.matches.add(e, absolute, false);
    -            }
    -            if (e.canReaddir()) {
    -                // if we're in follow mode or it's not a symlink, just keep
    -                // testing the same pattern. If there's more after the globstar,
    -                // then this symlink consumes the globstar. If not, then we can
    -                // follow at most ONE symlink along the way, so we mark it, which
    -                // also checks to ensure that it wasn't already marked.
    -                if (this.follow || !e.isSymbolicLink()) {
    -                    this.subwalks.add(e, pattern);
    -                }
    -                else if (e.isSymbolicLink()) {
    -                    if (rest && pattern.checkFollowGlobstar()) {
    -                        this.subwalks.add(e, rest);
    -                    }
    -                    else if (pattern.markFollowGlobstar()) {
    -                        this.subwalks.add(e, pattern);
    -                    }
    -                }
    -            }
    -        }
    -        // if the NEXT thing matches this entry, then also add
    -        // the rest.
    -        if (rest) {
    -            const rp = rest.pattern();
    -            if (typeof rp === 'string' &&
    -                // dots and empty were handled already
    -                rp !== '..' &&
    -                rp !== '' &&
    -                rp !== '.') {
    -                this.testString(e, rp, rest.rest(), absolute);
    -            }
    -            else if (rp === '..') {
    -                /* c8 ignore start */
    -                const ep = e.parent || e;
    -                /* c8 ignore stop */
    -                this.subwalks.add(ep, rest);
    -            }
    -            else if (rp instanceof RegExp) {
    -                this.testRegExp(e, rp, rest.rest(), absolute);
    -            }
    -        }
    -    }
    -    testRegExp(e, p, rest, absolute) {
    -        if (!p.test(e.name))
    -            return;
    -        if (!rest) {
    -            this.matches.add(e, absolute, false);
    -        }
    -        else {
    -            this.subwalks.add(e, rest);
    -        }
    -    }
    -    testString(e, p, rest, absolute) {
    -        // should never happen?
    -        if (!e.isNamed(p))
    -            return;
    -        if (!rest) {
    -            this.matches.add(e, absolute, false);
    -        }
    -        else {
    -            this.subwalks.add(e, rest);
    -        }
    -    }
    -}
    -exports.Processor = Processor;
    -//# sourceMappingURL=processor.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/processor.js.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/processor.js.map
    deleted file mode 100644
    index bcbac1f723f983..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/processor.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"processor.js","sourceRoot":"","sources":["../../../src/processor.ts"],"names":[],"mappings":";AAAA,qEAAqE;;;AAErE,yCAA8C;AAK9C;;GAEG;AACH,MAAa,cAAc;IACzB,KAAK,CAA0B;IAC/B,YAAY,QAAkC,IAAI,GAAG,EAAE;QACrD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IACD,IAAI;QACF,OAAO,IAAI,cAAc,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IAChD,CAAC;IACD,SAAS,CAAC,MAAY,EAAE,OAAgB;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;IACrE,CAAC;IACD,WAAW,CAAC,MAAY,EAAE,OAAgB;QACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAA;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACvC,IAAI,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;;YACvC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAA;IAChE,CAAC;CACF;AAjBD,wCAiBC;AAED;;;;GAIG;AACH,MAAa,WAAW;IACtB,KAAK,GAAsB,IAAI,GAAG,EAAE,CAAA;IACpC,GAAG,CAAC,MAAY,EAAE,QAAiB,EAAE,KAAc;QACjD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACtC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAA;IACjE,CAAC;IACD,yBAAyB;IACzB,OAAO;QACL,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAClD,IAAI;YACJ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACT,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SACV,CAAC,CAAA;IACJ,CAAC;CACF;AAfD,kCAeC;AAED;;;GAGG;AACH,MAAa,QAAQ;IACnB,KAAK,GAAyB,IAAI,GAAG,EAAE,CAAA;IACvC,GAAG,CAAC,MAAY,EAAE,OAAgB;QAChC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE;YACxB,OAAM;SACP;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACnC,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE;gBAC5D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;aACnB;SACF;;YAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IAC1C,CAAC;IACD,GAAG,CAAC,MAAY;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACnC,qBAAqB;QACrB,IAAI,CAAC,IAAI,EAAE;YACT,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;SACnD;QACD,oBAAoB;QACpB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAc,CAAC,CAAC,CAAA;IAClE,CAAC;IACD,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAA;IAC3D,CAAC;CACF;AA5BD,4BA4BC;AAED;;;;;GAKG;AACH,MAAa,SAAS;IACpB,cAAc,CAAgB;IAC9B,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;IAC3B,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAA;IACzB,QAAQ,CAAY;IACpB,MAAM,CAAS;IACf,GAAG,CAAS;IACZ,IAAI,CAAgB;IAEpB,YAAY,IAAoB,EAAE,cAA+B;QAC/D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAA;QAC3B,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAA;QACrB,IAAI,CAAC,cAAc,GAAG,cAAc;YAClC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE;YACvB,CAAC,CAAC,IAAI,cAAc,EAAE,CAAA;IAC1B,CAAC;IAED,eAAe,CAAC,MAAY,EAAE,QAAmB;QAC/C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,MAAM,aAAa,GAAsB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;QAEvE,gEAAgE;QAChE,uCAAuC;QAEvC,KAAK,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,aAAa,EAAE;YACtC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;YAE3C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;YAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAA;YAErE,kCAAkC;YAClC,IAAI,IAAI,EAAE;gBACR,CAAC,GAAG,CAAC,CAAC,OAAO,CACX,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS;oBAC1C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;oBAChB,CAAC,CAAC,IAAI,CACT,CAAA;gBACD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;gBAC3B,IAAI,CAAC,IAAI,EAAE;oBACT,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;oBAChC,SAAQ;iBACT;qBAAM;oBACL,OAAO,GAAG,IAAI,CAAA;iBACf;aACF;YAED,IAAI,CAAC,CAAC,QAAQ,EAAE;gBAAE,SAAQ;YAE1B,IAAI,CAAY,CAAA;YAChB,IAAI,IAAoB,CAAA;YACxB,IAAI,OAAO,GAAG,KAAK,CAAA;YACnB,OACE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,QAAQ;gBAC3C,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EACvB;gBACA,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;gBACtB,sDAAsD;gBACtD,IAAI,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,IAAI;oBAAE,MAAK;gBACtC,CAAC,GAAG,CAAC,CAAA;gBACL,OAAO,GAAG,IAAI,CAAA;gBACd,OAAO,GAAG,IAAI,CAAA;aACf;YACD,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;YACrB,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;YACrB,IAAI,OAAO,EAAE;gBACX,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC;oBAAE,SAAQ;gBACvD,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;aAC5C;YAED,uDAAuD;YACvD,qCAAqC;YACrC,kDAAkD;YAClD,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;gBACzB,sBAAsB;gBACtB,IAAI,CAAC,IAAI,EAAE;oBACT,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,CAAA;oBACjD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;iBAChD;qBAAM;oBACL,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;iBAC9B;gBACD,SAAQ;aACT;iBAAM,IAAI,CAAC,KAAK,oBAAQ,EAAE;gBACzB,wCAAwC;gBACxC,4CAA4C;gBAC5C,wDAAwD;gBACxD,4DAA4D;gBAC5D,gEAAgE;gBAChE,IACE,CAAC,CAAC,CAAC,cAAc,EAAE;oBACnB,IAAI,CAAC,MAAM;oBACX,OAAO,CAAC,mBAAmB,EAAE,EAC7B;oBACA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;iBAC9B;gBACD,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAA;gBAC1B,MAAM,KAAK,GAAG,IAAI,EAAE,IAAI,EAAE,CAAA;gBAC1B,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;oBAClD,iDAAiD;oBACjD,6CAA6C;oBAC7C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAA;iBACvD;qBAAM;oBACL,IAAI,EAAE,KAAK,IAAI,EAAE;wBACf,wDAAwD;wBACxD,wDAAwD;wBACxD,qBAAqB;wBACrB,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAA;wBACxB,oBAAoB;wBACpB,IAAI,CAAC,KAAK;4BAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;6BAC3C,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE;4BAClD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;yBAC7B;qBACF;iBACF;aACF;iBAAM,IAAI,CAAC,YAAY,MAAM,EAAE;gBAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;aAC9B;SACF;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC7B,CAAC;IAED,KAAK;QACH,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,CAAA;IACtD,CAAC;IAED,0DAA0D;IAC1D,yCAAyC;IACzC,6CAA6C;IAC7C,2BAA2B;IAC3B,aAAa,CAAC,MAAY,EAAE,OAAe;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAC1C,yDAAyD;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;QAC5B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;YACvB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;gBAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,CAAA;gBACrC,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;gBAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;gBAC3B,IAAI,CAAC,KAAK,oBAAQ,EAAE;oBAClB,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;iBACjD;qBAAM,IAAI,CAAC,YAAY,MAAM,EAAE;oBAC9B,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;iBACzC;qBAAM;oBACL,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;iBACzC;aACF;SACF;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,YAAY,CACV,CAAO,EACP,OAAgB,EAChB,IAAoB,EACpB,QAAiB;QAEjB,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YACvC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE;gBACtB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;aACrC;YACD,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE;gBAClB,2DAA2D;gBAC3D,gEAAgE;gBAChE,+DAA+D;gBAC/D,iEAAiE;gBACjE,uDAAuD;gBACvD,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE;oBACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;iBAC9B;qBAAM,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE;oBAC7B,IAAI,IAAI,IAAI,OAAO,CAAC,mBAAmB,EAAE,EAAE;wBACzC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;qBAC3B;yBAAM,IAAI,OAAO,CAAC,kBAAkB,EAAE,EAAE;wBACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;qBAC9B;iBACF;aACF;SACF;QACD,sDAAsD;QACtD,YAAY;QACZ,IAAI,IAAI,EAAE;YACR,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;YACzB,IACE,OAAO,EAAE,KAAK,QAAQ;gBACtB,sCAAsC;gBACtC,EAAE,KAAK,IAAI;gBACX,EAAE,KAAK,EAAE;gBACT,EAAE,KAAK,GAAG,EACV;gBACA,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAA;aAC9C;iBAAM,IAAI,EAAE,KAAK,IAAI,EAAE;gBACtB,qBAAqB;gBACrB,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAA;gBACxB,oBAAoB;gBACpB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;aAC5B;iBAAM,IAAI,EAAE,YAAY,MAAM,EAAE;gBAC/B,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAA;aAC9C;SACF;IACH,CAAC;IAED,UAAU,CACR,CAAO,EACP,CAAW,EACX,IAAoB,EACpB,QAAiB;QAEjB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,OAAM;QAC3B,IAAI,CAAC,IAAI,EAAE;YACT,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;SACrC;aAAM;YACL,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;SAC3B;IACH,CAAC;IAED,UAAU,CAAC,CAAO,EAAE,CAAS,EAAE,IAAoB,EAAE,QAAiB;QACpE,uBAAuB;QACvB,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,OAAM;QACzB,IAAI,CAAC,IAAI,EAAE;YACT,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;SACrC;aAAM;YACL,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;SAC3B;IACH,CAAC;CACF;AApOD,8BAoOC","sourcesContent":["// synchronous utility for filtering entries and calculating subwalks\n\nimport { GLOBSTAR, MMRegExp } from 'minimatch'\nimport { Path } from 'path-scurry'\nimport { MMPattern, Pattern } from './pattern.js'\nimport { GlobWalkerOpts } from './walker.js'\n\n/**\n * A cache of which patterns have been processed for a given Path\n */\nexport class HasWalkedCache {\n  store: Map>\n  constructor(store: Map> = new Map()) {\n    this.store = store\n  }\n  copy() {\n    return new HasWalkedCache(new Map(this.store))\n  }\n  hasWalked(target: Path, pattern: Pattern) {\n    return this.store.get(target.fullpath())?.has(pattern.globString())\n  }\n  storeWalked(target: Path, pattern: Pattern) {\n    const fullpath = target.fullpath()\n    const cached = this.store.get(fullpath)\n    if (cached) cached.add(pattern.globString())\n    else this.store.set(fullpath, new Set([pattern.globString()]))\n  }\n}\n\n/**\n * A record of which paths have been matched in a given walk step,\n * and whether they only are considered a match if they are a directory,\n * and whether their absolute or relative path should be returned.\n */\nexport class MatchRecord {\n  store: Map = new Map()\n  add(target: Path, absolute: boolean, ifDir: boolean) {\n    const n = (absolute ? 2 : 0) | (ifDir ? 1 : 0)\n    const current = this.store.get(target)\n    this.store.set(target, current === undefined ? n : n & current)\n  }\n  // match, absolute, ifdir\n  entries(): [Path, boolean, boolean][] {\n    return [...this.store.entries()].map(([path, n]) => [\n      path,\n      !!(n & 2),\n      !!(n & 1),\n    ])\n  }\n}\n\n/**\n * A collection of patterns that must be processed in a subsequent step\n * for a given path.\n */\nexport class SubWalks {\n  store: Map = new Map()\n  add(target: Path, pattern: Pattern) {\n    if (!target.canReaddir()) {\n      return\n    }\n    const subs = this.store.get(target)\n    if (subs) {\n      if (!subs.find(p => p.globString() === pattern.globString())) {\n        subs.push(pattern)\n      }\n    } else this.store.set(target, [pattern])\n  }\n  get(target: Path): Pattern[] {\n    const subs = this.store.get(target)\n    /* c8 ignore start */\n    if (!subs) {\n      throw new Error('attempting to walk unknown path')\n    }\n    /* c8 ignore stop */\n    return subs\n  }\n  entries(): [Path, Pattern[]][] {\n    return this.keys().map(k => [k, this.store.get(k) as Pattern[]])\n  }\n  keys(): Path[] {\n    return [...this.store.keys()].filter(t => t.canReaddir())\n  }\n}\n\n/**\n * The class that processes patterns for a given path.\n *\n * Handles child entry filtering, and determining whether a path's\n * directory contents must be read.\n */\nexport class Processor {\n  hasWalkedCache: HasWalkedCache\n  matches = new MatchRecord()\n  subwalks = new SubWalks()\n  patterns?: Pattern[]\n  follow: boolean\n  dot: boolean\n  opts: GlobWalkerOpts\n\n  constructor(opts: GlobWalkerOpts, hasWalkedCache?: HasWalkedCache) {\n    this.opts = opts\n    this.follow = !!opts.follow\n    this.dot = !!opts.dot\n    this.hasWalkedCache = hasWalkedCache\n      ? hasWalkedCache.copy()\n      : new HasWalkedCache()\n  }\n\n  processPatterns(target: Path, patterns: Pattern[]) {\n    this.patterns = patterns\n    const processingSet: [Path, Pattern][] = patterns.map(p => [target, p])\n\n    // map of paths to the magic-starting subwalks they need to walk\n    // first item in patterns is the filter\n\n    for (let [t, pattern] of processingSet) {\n      this.hasWalkedCache.storeWalked(t, pattern)\n\n      const root = pattern.root()\n      const absolute = pattern.isAbsolute() && this.opts.absolute !== false\n\n      // start absolute patterns at root\n      if (root) {\n        t = t.resolve(\n          root === '/' && this.opts.root !== undefined\n            ? this.opts.root\n            : root\n        )\n        const rest = pattern.rest()\n        if (!rest) {\n          this.matches.add(t, true, false)\n          continue\n        } else {\n          pattern = rest\n        }\n      }\n\n      if (t.isENOENT()) continue\n\n      let p: MMPattern\n      let rest: Pattern | null\n      let changed = false\n      while (\n        typeof (p = pattern.pattern()) === 'string' &&\n        (rest = pattern.rest())\n      ) {\n        const c = t.resolve(p)\n        // we can be reasonably sure that .. is a readable dir\n        if (c.isUnknown() && p !== '..') break\n        t = c\n        pattern = rest\n        changed = true\n      }\n      p = pattern.pattern()\n      rest = pattern.rest()\n      if (changed) {\n        if (this.hasWalkedCache.hasWalked(t, pattern)) continue\n        this.hasWalkedCache.storeWalked(t, pattern)\n      }\n\n      // now we have either a final string for a known entry,\n      // more strings for an unknown entry,\n      // or a pattern starting with magic, mounted on t.\n      if (typeof p === 'string') {\n        // must be final entry\n        if (!rest) {\n          const ifDir = p === '..' || p === '' || p === '.'\n          this.matches.add(t.resolve(p), absolute, ifDir)\n        } else {\n          this.subwalks.add(t, pattern)\n        }\n        continue\n      } else if (p === GLOBSTAR) {\n        // if no rest, match and subwalk pattern\n        // if rest, process rest and subwalk pattern\n        // if it's a symlink, but we didn't get here by way of a\n        // globstar match (meaning it's the first time THIS globstar\n        // has traversed a symlink), then we follow it. Otherwise, stop.\n        if (\n          !t.isSymbolicLink() ||\n          this.follow ||\n          pattern.checkFollowGlobstar()\n        ) {\n          this.subwalks.add(t, pattern)\n        }\n        const rp = rest?.pattern()\n        const rrest = rest?.rest()\n        if (!rest || ((rp === '' || rp === '.') && !rrest)) {\n          // only HAS to be a dir if it ends in **/ or **/.\n          // but ending in ** will match files as well.\n          this.matches.add(t, absolute, rp === '' || rp === '.')\n        } else {\n          if (rp === '..') {\n            // this would mean you're matching **/.. at the fs root,\n            // and no thanks, I'm not gonna test that specific case.\n            /* c8 ignore start */\n            const tp = t.parent || t\n            /* c8 ignore stop */\n            if (!rrest) this.matches.add(tp, absolute, true)\n            else if (!this.hasWalkedCache.hasWalked(tp, rrest)) {\n              this.subwalks.add(tp, rrest)\n            }\n          }\n        }\n      } else if (p instanceof RegExp) {\n        this.subwalks.add(t, pattern)\n      }\n    }\n\n    return this\n  }\n\n  subwalkTargets(): Path[] {\n    return this.subwalks.keys()\n  }\n\n  child() {\n    return new Processor(this.opts, this.hasWalkedCache)\n  }\n\n  // return a new Processor containing the subwalks for each\n  // child entry, and a set of matches, and\n  // a hasWalkedCache that's a copy of this one\n  // then we're going to call\n  filterEntries(parent: Path, entries: Path[]): Processor {\n    const patterns = this.subwalks.get(parent)\n    // put matches and entry walks into the results processor\n    const results = this.child()\n    for (const e of entries) {\n      for (const pattern of patterns) {\n        const absolute = pattern.isAbsolute()\n        const p = pattern.pattern()\n        const rest = pattern.rest()\n        if (p === GLOBSTAR) {\n          results.testGlobstar(e, pattern, rest, absolute)\n        } else if (p instanceof RegExp) {\n          results.testRegExp(e, p, rest, absolute)\n        } else {\n          results.testString(e, p, rest, absolute)\n        }\n      }\n    }\n    return results\n  }\n\n  testGlobstar(\n    e: Path,\n    pattern: Pattern,\n    rest: Pattern | null,\n    absolute: boolean\n  ) {\n    if (this.dot || !e.name.startsWith('.')) {\n      if (!pattern.hasMore()) {\n        this.matches.add(e, absolute, false)\n      }\n      if (e.canReaddir()) {\n        // if we're in follow mode or it's not a symlink, just keep\n        // testing the same pattern. If there's more after the globstar,\n        // then this symlink consumes the globstar. If not, then we can\n        // follow at most ONE symlink along the way, so we mark it, which\n        // also checks to ensure that it wasn't already marked.\n        if (this.follow || !e.isSymbolicLink()) {\n          this.subwalks.add(e, pattern)\n        } else if (e.isSymbolicLink()) {\n          if (rest && pattern.checkFollowGlobstar()) {\n            this.subwalks.add(e, rest)\n          } else if (pattern.markFollowGlobstar()) {\n            this.subwalks.add(e, pattern)\n          }\n        }\n      }\n    }\n    // if the NEXT thing matches this entry, then also add\n    // the rest.\n    if (rest) {\n      const rp = rest.pattern()\n      if (\n        typeof rp === 'string' &&\n        // dots and empty were handled already\n        rp !== '..' &&\n        rp !== '' &&\n        rp !== '.'\n      ) {\n        this.testString(e, rp, rest.rest(), absolute)\n      } else if (rp === '..') {\n        /* c8 ignore start */\n        const ep = e.parent || e\n        /* c8 ignore stop */\n        this.subwalks.add(ep, rest)\n      } else if (rp instanceof RegExp) {\n        this.testRegExp(e, rp, rest.rest(), absolute)\n      }\n    }\n  }\n\n  testRegExp(\n    e: Path,\n    p: MMRegExp,\n    rest: Pattern | null,\n    absolute: boolean\n  ) {\n    if (!p.test(e.name)) return\n    if (!rest) {\n      this.matches.add(e, absolute, false)\n    } else {\n      this.subwalks.add(e, rest)\n    }\n  }\n\n  testString(e: Path, p: string, rest: Pattern | null, absolute: boolean) {\n    // should never happen?\n    if (!e.isNamed(p)) return\n    if (!rest) {\n      this.matches.add(e, absolute, false)\n    } else {\n      this.subwalks.add(e, rest)\n    }\n  }\n}\n"]}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/walker.d.ts b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/walker.d.ts
    deleted file mode 100644
    index 5c1a0414971b3a..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/walker.d.ts
    +++ /dev/null
    @@ -1,96 +0,0 @@
    -/// 
    -/**
    - * Single-use utility classes to provide functionality to the {@link Glob}
    - * methods.
    - *
    - * @module
    - */
    -import { Minipass } from 'minipass';
    -import { Path } from 'path-scurry';
    -import { IgnoreLike } from './ignore.js';
    -import { Pattern } from './pattern.js';
    -import { Processor } from './processor.js';
    -export interface GlobWalkerOpts {
    -    absolute?: boolean;
    -    allowWindowsEscape?: boolean;
    -    cwd?: string | URL;
    -    dot?: boolean;
    -    dotRelative?: boolean;
    -    follow?: boolean;
    -    ignore?: string | string[] | IgnoreLike;
    -    mark?: boolean;
    -    matchBase?: boolean;
    -    maxDepth?: number;
    -    nobrace?: boolean;
    -    nocase?: boolean;
    -    nodir?: boolean;
    -    noext?: boolean;
    -    noglobstar?: boolean;
    -    platform?: NodeJS.Platform;
    -    posix?: boolean;
    -    realpath?: boolean;
    -    root?: string;
    -    stat?: boolean;
    -    signal?: AbortSignal;
    -    windowsPathsNoEscape?: boolean;
    -    withFileTypes?: boolean;
    -}
    -export type GWOFileTypesTrue = GlobWalkerOpts & {
    -    withFileTypes: true;
    -};
    -export type GWOFileTypesFalse = GlobWalkerOpts & {
    -    withFileTypes: false;
    -};
    -export type GWOFileTypesUnset = GlobWalkerOpts & {
    -    withFileTypes?: undefined;
    -};
    -export type Result = O extends GWOFileTypesTrue ? Path : O extends GWOFileTypesFalse ? string : O extends GWOFileTypesUnset ? string : Path | string;
    -export type Matches = O extends GWOFileTypesTrue ? Set : O extends GWOFileTypesFalse ? Set : O extends GWOFileTypesUnset ? Set : Set;
    -export type MatchStream = O extends GWOFileTypesTrue ? Minipass : O extends GWOFileTypesFalse ? Minipass : O extends GWOFileTypesUnset ? Minipass : Minipass;
    -/**
    - * basic walking utilities that all the glob walker types use
    - */
    -export declare abstract class GlobUtil {
    -    #private;
    -    path: Path;
    -    patterns: Pattern[];
    -    opts: O;
    -    seen: Set;
    -    paused: boolean;
    -    aborted: boolean;
    -    signal?: AbortSignal;
    -    maxDepth: number;
    -    constructor(patterns: Pattern[], path: Path, opts: O);
    -    pause(): void;
    -    resume(): void;
    -    onResume(fn: () => any): void;
    -    matchCheck(e: Path, ifDir: boolean): Promise;
    -    matchCheckTest(e: Path | undefined, ifDir: boolean): Path | undefined;
    -    matchCheckSync(e: Path, ifDir: boolean): Path | undefined;
    -    abstract matchEmit(p: Result): void;
    -    abstract matchEmit(p: string | Path): void;
    -    matchFinish(e: Path, absolute: boolean): void;
    -    match(e: Path, absolute: boolean, ifDir: boolean): Promise;
    -    matchSync(e: Path, absolute: boolean, ifDir: boolean): void;
    -    walkCB(target: Path, patterns: Pattern[], cb: () => any): void;
    -    walkCB2(target: Path, patterns: Pattern[], processor: Processor, cb: () => any): any;
    -    walkCB3(target: Path, entries: Path[], processor: Processor, cb: () => any): void;
    -    walkCBSync(target: Path, patterns: Pattern[], cb: () => any): void;
    -    walkCB2Sync(target: Path, patterns: Pattern[], processor: Processor, cb: () => any): any;
    -    walkCB3Sync(target: Path, entries: Path[], processor: Processor, cb: () => any): void;
    -}
    -export declare class GlobWalker extends GlobUtil {
    -    matches: O extends GWOFileTypesTrue ? Set : O extends GWOFileTypesFalse ? Set : O extends GWOFileTypesUnset ? Set : Set;
    -    constructor(patterns: Pattern[], path: Path, opts: O);
    -    matchEmit(e: Result): void;
    -    walk(): Promise>;
    -    walkSync(): Matches;
    -}
    -export declare class GlobStream extends GlobUtil {
    -    results: O extends GWOFileTypesTrue ? Minipass : O extends GWOFileTypesFalse ? Minipass : O extends GWOFileTypesUnset ? Minipass : Minipass;
    -    constructor(patterns: Pattern[], path: Path, opts: O);
    -    matchEmit(e: Result): void;
    -    stream(): MatchStream;
    -    streamSync(): MatchStream;
    -}
    -//# sourceMappingURL=walker.d.ts.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/walker.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/walker.d.ts.map
    deleted file mode 100644
    index dda062358f1998..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/walker.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"walker.d.ts","sourceRoot":"","sources":["../../../src/walker.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAU,UAAU,EAAE,MAAM,aAAa,CAAA;AAOhD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;IAClB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,UAAU,CAAA;IACvC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,SAAS,CAAC,EAAE,OAAO,CAAA;IAGnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG;IAC9C,aAAa,EAAE,IAAI,CAAA;CACpB,CAAA;AACD,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG;IAC/C,aAAa,EAAE,KAAK,CAAA;CACrB,CAAA;AACD,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG;IAC/C,aAAa,CAAC,EAAE,SAAS,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,cAAc,IAAI,CAAC,SAAS,gBAAgB,GACrE,IAAI,GACJ,CAAC,SAAS,iBAAiB,GAC3B,MAAM,GACN,CAAC,SAAS,iBAAiB,GAC3B,MAAM,GACN,IAAI,GAAG,MAAM,CAAA;AAEjB,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,cAAc,IAAI,CAAC,SAAS,gBAAgB,GACtE,GAAG,CAAC,IAAI,CAAC,GACT,CAAC,SAAS,iBAAiB,GAC3B,GAAG,CAAC,MAAM,CAAC,GACX,CAAC,SAAS,iBAAiB,GAC3B,GAAG,CAAC,MAAM,CAAC,GACX,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,CAAA;AAEtB,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,cAAc,IAC9C,CAAC,SAAS,gBAAgB,GACtB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,GACpB,CAAC,SAAS,iBAAiB,GAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,GACxB,CAAC,SAAS,iBAAiB,GAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,GACxB,QAAQ,CAAC,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAA;AAY5C;;GAEG;AACH,8BAAsB,QAAQ,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc;;IACtE,IAAI,EAAE,IAAI,CAAA;IACV,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,IAAI,EAAE,CAAC,CAAA;IACP,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAkB;IACjC,MAAM,EAAE,OAAO,CAAQ;IACvB,OAAO,EAAE,OAAO,CAAQ;IAIxB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;gBAEJ,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IA8BpD,KAAK;IAGL,MAAM;IAUN,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG;IAahB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IAYpE,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS;IAUrE,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS;IAYzD,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IACtC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAE1C,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO;IAsBhC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtE,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAK3D,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG;IAOvD,OAAO,CACL,MAAM,EAAE,IAAI,EACZ,QAAQ,EAAE,OAAO,EAAE,EACnB,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,MAAM,GAAG;IA2Cf,OAAO,CACL,MAAM,EAAE,IAAI,EACZ,OAAO,EAAE,IAAI,EAAE,EACf,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,MAAM,GAAG;IAsBf,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG;IAO3D,WAAW,CACT,MAAM,EAAE,IAAI,EACZ,QAAQ,EAAE,OAAO,EAAE,EACnB,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,MAAM,GAAG;IAqCf,WAAW,CACT,MAAM,EAAE,IAAI,EACZ,OAAO,EAAE,IAAI,EAAE,EACf,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,MAAM,GAAG;CAoBhB;AAED,qBAAa,UAAU,CACrB,CAAC,SAAS,cAAc,GAAG,cAAc,CACzC,SAAQ,QAAQ,CAAC,CAAC,CAAC;IACnB,OAAO,EAAE,CAAC,SAAS,gBAAgB,GAC/B,GAAG,CAAC,IAAI,CAAC,GACT,CAAC,SAAS,iBAAiB,GAC3B,GAAG,CAAC,MAAM,CAAC,GACX,CAAC,SAAS,iBAAiB,GAC3B,GAAG,CAAC,MAAM,CAAC,GACX,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,CAAA;gBAEV,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAKpD,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAKvB,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAiBjC,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC;CAWvB;AAED,qBAAa,UAAU,CACrB,CAAC,SAAS,cAAc,GAAG,cAAc,CACzC,SAAQ,QAAQ,CAAC,CAAC,CAAC;IACnB,OAAO,EAAE,CAAC,SAAS,gBAAgB,GAC/B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,GACpB,CAAC,SAAS,iBAAiB,GAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,GACxB,CAAC,SAAS,iBAAiB,GAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,GACxB,QAAQ,CAAC,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAA;gBAE9B,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAUpD,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAM7B,MAAM,IAAI,WAAW,CAAC,CAAC,CAAC;IAYxB,UAAU,IAAI,WAAW,CAAC,CAAC,CAAC;CAO7B"}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/walker.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/walker.js
    deleted file mode 100644
    index 9651ce1164016c..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/walker.js
    +++ /dev/null
    @@ -1,358 +0,0 @@
    -"use strict";
    -Object.defineProperty(exports, "__esModule", { value: true });
    -exports.GlobStream = exports.GlobWalker = exports.GlobUtil = void 0;
    -/**
    - * Single-use utility classes to provide functionality to the {@link Glob}
    - * methods.
    - *
    - * @module
    - */
    -const minipass_1 = require("minipass");
    -const ignore_js_1 = require("./ignore.js");
    -const processor_js_1 = require("./processor.js");
    -const makeIgnore = (ignore, opts) => typeof ignore === 'string'
    -    ? new ignore_js_1.Ignore([ignore], opts)
    -    : Array.isArray(ignore)
    -        ? new ignore_js_1.Ignore(ignore, opts)
    -        : ignore;
    -/**
    - * basic walking utilities that all the glob walker types use
    - */
    -class GlobUtil {
    -    path;
    -    patterns;
    -    opts;
    -    seen = new Set();
    -    paused = false;
    -    aborted = false;
    -    #onResume = [];
    -    #ignore;
    -    #sep;
    -    signal;
    -    maxDepth;
    -    constructor(patterns, path, opts) {
    -        this.patterns = patterns;
    -        this.path = path;
    -        this.opts = opts;
    -        this.#sep = !opts.posix && opts.platform === 'win32' ? '\\' : '/';
    -        if (opts.ignore) {
    -            this.#ignore = makeIgnore(opts.ignore, opts);
    -        }
    -        // ignore, always set with maxDepth, but it's optional on the
    -        // GlobOptions type
    -        /* c8 ignore start */
    -        this.maxDepth = opts.maxDepth || Infinity;
    -        /* c8 ignore stop */
    -        if (opts.signal) {
    -            this.signal = opts.signal;
    -            this.signal.addEventListener('abort', () => {
    -                this.#onResume.length = 0;
    -            });
    -        }
    -    }
    -    #ignored(path) {
    -        return this.seen.has(path) || !!this.#ignore?.ignored?.(path);
    -    }
    -    #childrenIgnored(path) {
    -        return !!this.#ignore?.childrenIgnored?.(path);
    -    }
    -    // backpressure mechanism
    -    pause() {
    -        this.paused = true;
    -    }
    -    resume() {
    -        /* c8 ignore start */
    -        if (this.signal?.aborted)
    -            return;
    -        /* c8 ignore stop */
    -        this.paused = false;
    -        let fn = undefined;
    -        while (!this.paused && (fn = this.#onResume.shift())) {
    -            fn();
    -        }
    -    }
    -    onResume(fn) {
    -        if (this.signal?.aborted)
    -            return;
    -        /* c8 ignore start */
    -        if (!this.paused) {
    -            fn();
    -        }
    -        else {
    -            /* c8 ignore stop */
    -            this.#onResume.push(fn);
    -        }
    -    }
    -    // do the requisite realpath/stat checking, and return the path
    -    // to add or undefined to filter it out.
    -    async matchCheck(e, ifDir) {
    -        if (ifDir && this.opts.nodir)
    -            return undefined;
    -        let rpc;
    -        if (this.opts.realpath) {
    -            rpc = e.realpathCached() || (await e.realpath());
    -            if (!rpc)
    -                return undefined;
    -            e = rpc;
    -        }
    -        const needStat = e.isUnknown() || this.opts.stat;
    -        return this.matchCheckTest(needStat ? await e.lstat() : e, ifDir);
    -    }
    -    matchCheckTest(e, ifDir) {
    -        return e &&
    -            (this.maxDepth === Infinity || e.depth() <= this.maxDepth) &&
    -            (!ifDir || e.canReaddir()) &&
    -            (!this.opts.nodir || !e.isDirectory()) &&
    -            !this.#ignored(e)
    -            ? e
    -            : undefined;
    -    }
    -    matchCheckSync(e, ifDir) {
    -        if (ifDir && this.opts.nodir)
    -            return undefined;
    -        let rpc;
    -        if (this.opts.realpath) {
    -            rpc = e.realpathCached() || e.realpathSync();
    -            if (!rpc)
    -                return undefined;
    -            e = rpc;
    -        }
    -        const needStat = e.isUnknown() || this.opts.stat;
    -        return this.matchCheckTest(needStat ? e.lstatSync() : e, ifDir);
    -    }
    -    matchFinish(e, absolute) {
    -        if (this.#ignored(e))
    -            return;
    -        const abs = this.opts.absolute === undefined ? absolute : this.opts.absolute;
    -        this.seen.add(e);
    -        const mark = this.opts.mark && e.isDirectory() ? this.#sep : '';
    -        // ok, we have what we need!
    -        if (this.opts.withFileTypes) {
    -            this.matchEmit(e);
    -        }
    -        else if (abs) {
    -            const abs = this.opts.posix ? e.fullpathPosix() : e.fullpath();
    -            this.matchEmit(abs + mark);
    -        }
    -        else {
    -            const rel = this.opts.posix ? e.relativePosix() : e.relative();
    -            const pre = this.opts.dotRelative && !rel.startsWith('..' + this.#sep)
    -                ? '.' + this.#sep
    -                : '';
    -            this.matchEmit(!rel ? '.' + mark : pre + rel + mark);
    -        }
    -    }
    -    async match(e, absolute, ifDir) {
    -        const p = await this.matchCheck(e, ifDir);
    -        if (p)
    -            this.matchFinish(p, absolute);
    -    }
    -    matchSync(e, absolute, ifDir) {
    -        const p = this.matchCheckSync(e, ifDir);
    -        if (p)
    -            this.matchFinish(p, absolute);
    -    }
    -    walkCB(target, patterns, cb) {
    -        /* c8 ignore start */
    -        if (this.signal?.aborted)
    -            cb();
    -        /* c8 ignore stop */
    -        this.walkCB2(target, patterns, new processor_js_1.Processor(this.opts), cb);
    -    }
    -    walkCB2(target, patterns, processor, cb) {
    -        if (this.#childrenIgnored(target))
    -            return cb();
    -        if (this.signal?.aborted)
    -            cb();
    -        if (this.paused) {
    -            this.onResume(() => this.walkCB2(target, patterns, processor, cb));
    -            return;
    -        }
    -        processor.processPatterns(target, patterns);
    -        // done processing.  all of the above is sync, can be abstracted out.
    -        // subwalks is a map of paths to the entry filters they need
    -        // matches is a map of paths to [absolute, ifDir] tuples.
    -        let tasks = 1;
    -        const next = () => {
    -            if (--tasks === 0)
    -                cb();
    -        };
    -        for (const [m, absolute, ifDir] of processor.matches.entries()) {
    -            if (this.#ignored(m))
    -                continue;
    -            tasks++;
    -            this.match(m, absolute, ifDir).then(() => next());
    -        }
    -        for (const t of processor.subwalkTargets()) {
    -            if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) {
    -                continue;
    -            }
    -            tasks++;
    -            const childrenCached = t.readdirCached();
    -            if (t.calledReaddir())
    -                this.walkCB3(t, childrenCached, processor, next);
    -            else {
    -                t.readdirCB((_, entries) => this.walkCB3(t, entries, processor, next), true);
    -            }
    -        }
    -        next();
    -    }
    -    walkCB3(target, entries, processor, cb) {
    -        processor = processor.filterEntries(target, entries);
    -        let tasks = 1;
    -        const next = () => {
    -            if (--tasks === 0)
    -                cb();
    -        };
    -        for (const [m, absolute, ifDir] of processor.matches.entries()) {
    -            if (this.#ignored(m))
    -                continue;
    -            tasks++;
    -            this.match(m, absolute, ifDir).then(() => next());
    -        }
    -        for (const [target, patterns] of processor.subwalks.entries()) {
    -            tasks++;
    -            this.walkCB2(target, patterns, processor.child(), next);
    -        }
    -        next();
    -    }
    -    walkCBSync(target, patterns, cb) {
    -        /* c8 ignore start */
    -        if (this.signal?.aborted)
    -            cb();
    -        /* c8 ignore stop */
    -        this.walkCB2Sync(target, patterns, new processor_js_1.Processor(this.opts), cb);
    -    }
    -    walkCB2Sync(target, patterns, processor, cb) {
    -        if (this.#childrenIgnored(target))
    -            return cb();
    -        if (this.signal?.aborted)
    -            cb();
    -        if (this.paused) {
    -            this.onResume(() => this.walkCB2Sync(target, patterns, processor, cb));
    -            return;
    -        }
    -        processor.processPatterns(target, patterns);
    -        // done processing.  all of the above is sync, can be abstracted out.
    -        // subwalks is a map of paths to the entry filters they need
    -        // matches is a map of paths to [absolute, ifDir] tuples.
    -        let tasks = 1;
    -        const next = () => {
    -            if (--tasks === 0)
    -                cb();
    -        };
    -        for (const [m, absolute, ifDir] of processor.matches.entries()) {
    -            if (this.#ignored(m))
    -                continue;
    -            this.matchSync(m, absolute, ifDir);
    -        }
    -        for (const t of processor.subwalkTargets()) {
    -            if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) {
    -                continue;
    -            }
    -            tasks++;
    -            const children = t.readdirSync();
    -            this.walkCB3Sync(t, children, processor, next);
    -        }
    -        next();
    -    }
    -    walkCB3Sync(target, entries, processor, cb) {
    -        processor = processor.filterEntries(target, entries);
    -        let tasks = 1;
    -        const next = () => {
    -            if (--tasks === 0)
    -                cb();
    -        };
    -        for (const [m, absolute, ifDir] of processor.matches.entries()) {
    -            if (this.#ignored(m))
    -                continue;
    -            this.matchSync(m, absolute, ifDir);
    -        }
    -        for (const [target, patterns] of processor.subwalks.entries()) {
    -            tasks++;
    -            this.walkCB2Sync(target, patterns, processor.child(), next);
    -        }
    -        next();
    -    }
    -}
    -exports.GlobUtil = GlobUtil;
    -class GlobWalker extends GlobUtil {
    -    matches;
    -    constructor(patterns, path, opts) {
    -        super(patterns, path, opts);
    -        this.matches = new Set();
    -    }
    -    matchEmit(e) {
    -        this.matches.add(e);
    -    }
    -    async walk() {
    -        if (this.signal?.aborted)
    -            throw this.signal.reason;
    -        if (this.path.isUnknown()) {
    -            await this.path.lstat();
    -        }
    -        await new Promise((res, rej) => {
    -            this.walkCB(this.path, this.patterns, () => {
    -                if (this.signal?.aborted) {
    -                    rej(this.signal.reason);
    -                }
    -                else {
    -                    res(this.matches);
    -                }
    -            });
    -        });
    -        return this.matches;
    -    }
    -    walkSync() {
    -        if (this.signal?.aborted)
    -            throw this.signal.reason;
    -        if (this.path.isUnknown()) {
    -            this.path.lstatSync();
    -        }
    -        // nothing for the callback to do, because this never pauses
    -        this.walkCBSync(this.path, this.patterns, () => {
    -            if (this.signal?.aborted)
    -                throw this.signal.reason;
    -        });
    -        return this.matches;
    -    }
    -}
    -exports.GlobWalker = GlobWalker;
    -class GlobStream extends GlobUtil {
    -    results;
    -    constructor(patterns, path, opts) {
    -        super(patterns, path, opts);
    -        this.results = new minipass_1.Minipass({
    -            signal: this.signal,
    -            objectMode: true,
    -        });
    -        this.results.on('drain', () => this.resume());
    -        this.results.on('resume', () => this.resume());
    -    }
    -    matchEmit(e) {
    -        this.results.write(e);
    -        if (!this.results.flowing)
    -            this.pause();
    -    }
    -    stream() {
    -        const target = this.path;
    -        if (target.isUnknown()) {
    -            target.lstat().then(() => {
    -                this.walkCB(target, this.patterns, () => this.results.end());
    -            });
    -        }
    -        else {
    -            this.walkCB(target, this.patterns, () => this.results.end());
    -        }
    -        return this.results;
    -    }
    -    streamSync() {
    -        if (this.path.isUnknown()) {
    -            this.path.lstatSync();
    -        }
    -        this.walkCBSync(this.path, this.patterns, () => this.results.end());
    -        return this.results;
    -    }
    -}
    -exports.GlobStream = GlobStream;
    -//# sourceMappingURL=walker.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/walker.js.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/walker.js.map
    deleted file mode 100644
    index a7af398939ae48..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/cjs/src/walker.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"walker.js","sourceRoot":"","sources":["../../../src/walker.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACH,uCAAmC;AAEnC,2CAAgD;AAQhD,iDAA0C;AAiE1C,MAAM,UAAU,GAAG,CACjB,MAAsC,EACtC,IAAoB,EACR,EAAE,CACd,OAAO,MAAM,KAAK,QAAQ;IACxB,CAAC,CAAC,IAAI,kBAAM,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;IAC5B,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QACvB,CAAC,CAAC,IAAI,kBAAM,CAAC,MAAM,EAAE,IAAI,CAAC;QAC1B,CAAC,CAAC,MAAM,CAAA;AAEZ;;GAEG;AACH,MAAsB,QAAQ;IAC5B,IAAI,CAAM;IACV,QAAQ,CAAW;IACnB,IAAI,CAAG;IACP,IAAI,GAAc,IAAI,GAAG,EAAQ,CAAA;IACjC,MAAM,GAAY,KAAK,CAAA;IACvB,OAAO,GAAY,KAAK,CAAA;IACxB,SAAS,GAAkB,EAAE,CAAA;IAC7B,OAAO,CAAa;IACpB,IAAI,CAAY;IAChB,MAAM,CAAc;IACpB,QAAQ,CAAQ;IAGhB,YAAY,QAAmB,EAAE,IAAU,EAAE,IAAO;QAClD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAA;QACjE,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;SAC7C;QACD,6DAA6D;QAC7D,mBAAmB;QACnB,qBAAqB;QACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAA;QACzC,oBAAoB;QACpB,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;YACzB,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBACzC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAA;YAC3B,CAAC,CAAC,CAAA;SACH;IACH,CAAC;IAED,QAAQ,CAAC,IAAU;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAA;IAC/D,CAAC;IACD,gBAAgB,CAAC,IAAU;QACzB,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,IAAI,CAAC,CAAA;IAChD,CAAC;IAED,yBAAyB;IACzB,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;IACpB,CAAC;IACD,MAAM;QACJ,qBAAqB;QACrB,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,OAAM;QAChC,oBAAoB;QACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,EAAE,GAA4B,SAAS,CAAA;QAC3C,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE;YACpD,EAAE,EAAE,CAAA;SACL;IACH,CAAC;IACD,QAAQ,CAAC,EAAa;QACpB,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,OAAM;QAChC,qBAAqB;QACrB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,EAAE,EAAE,CAAA;SACL;aAAM;YACL,oBAAoB;YACpB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;SACxB;IACH,CAAC;IAED,+DAA+D;IAC/D,wCAAwC;IACxC,KAAK,CAAC,UAAU,CAAC,CAAO,EAAE,KAAc;QACtC,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAA;QAC9C,IAAI,GAAqB,CAAA;QACzB,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YACtB,GAAG,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;YAChD,IAAI,CAAC,GAAG;gBAAE,OAAO,SAAS,CAAA;YAC1B,CAAC,GAAG,GAAG,CAAA;SACR;QACD,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;QAChD,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACnE,CAAC;IAED,cAAc,CAAC,CAAmB,EAAE,KAAc;QAChD,OAAO,CAAC;YACN,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC;YAC1D,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YAC1B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACtC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,SAAS,CAAA;IACf,CAAC;IAED,cAAc,CAAC,CAAO,EAAE,KAAc;QACpC,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAA;QAC9C,IAAI,GAAqB,CAAA;QACzB,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YACtB,GAAG,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,YAAY,EAAE,CAAA;YAC5C,IAAI,CAAC,GAAG;gBAAE,OAAO,SAAS,CAAA;YAC1B,CAAC,GAAG,GAAG,CAAA;SACR;QACD,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;QAChD,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACjE,CAAC;IAKD,WAAW,CAAC,CAAO,EAAE,QAAiB;QACpC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAM;QAC5B,MAAM,GAAG,GACP,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAA;QAClE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;QAC/D,4BAA4B;QAC5B,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YAC3B,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;SAClB;aAAM,IAAI,GAAG,EAAE;YACd,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;YAC9D,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,IAAI,CAAC,CAAA;SAC3B;aAAM;YACL,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;YAC9D,MAAM,GAAG,GACP,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;gBACxD,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI;gBACjB,CAAC,CAAC,EAAE,CAAA;YACR,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,CAAA;SACrD;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,CAAO,EAAE,QAAiB,EAAE,KAAc;QACpD,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QACzC,IAAI,CAAC;YAAE,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IACtC,CAAC;IAED,SAAS,CAAC,CAAO,EAAE,QAAiB,EAAE,KAAc;QAClD,MAAM,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QACvC,IAAI,CAAC;YAAE,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IACtC,CAAC;IAED,MAAM,CAAC,MAAY,EAAE,QAAmB,EAAE,EAAa;QACrD,qBAAqB;QACrB,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,EAAE,EAAE,CAAA;QAC9B,oBAAoB;QACpB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,wBAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IAC9D,CAAC;IAED,OAAO,CACL,MAAY,EACZ,QAAmB,EACnB,SAAoB,EACpB,EAAa;QAEb,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,EAAE,CAAA;QAC9C,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,EAAE,EAAE,CAAA;QAC9B,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAA;YAClE,OAAM;SACP;QACD,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAE3C,qEAAqE;QACrE,4DAA4D;QAC5D,yDAAyD;QACzD,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,EAAE,KAAK,KAAK,CAAC;gBAAE,EAAE,EAAE,CAAA;QACzB,CAAC,CAAA;QAED,KAAK,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE;YAC9D,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,SAAQ;YAC9B,KAAK,EAAE,CAAA;YACP,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;SAClD;QAED,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,cAAc,EAAE,EAAE;YAC1C,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE;gBAC5D,SAAQ;aACT;YACD,KAAK,EAAE,CAAA;YACP,MAAM,cAAc,GAAG,CAAC,CAAC,aAAa,EAAE,CAAA;YACxC,IAAI,CAAC,CAAC,aAAa,EAAE;gBACnB,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;iBAC7C;gBACH,CAAC,CAAC,SAAS,CACT,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,EACzD,IAAI,CACL,CAAA;aACF;SACF;QAED,IAAI,EAAE,CAAA;IACR,CAAC;IAED,OAAO,CACL,MAAY,EACZ,OAAe,EACf,SAAoB,EACpB,EAAa;QAEb,SAAS,GAAG,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAEpD,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,EAAE,KAAK,KAAK,CAAC;gBAAE,EAAE,EAAE,CAAA;QACzB,CAAC,CAAA;QAED,KAAK,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE;YAC9D,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,SAAQ;YAC9B,KAAK,EAAE,CAAA;YACP,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;SAClD;QACD,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE;YAC7D,KAAK,EAAE,CAAA;YACP,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAA;SACxD;QAED,IAAI,EAAE,CAAA;IACR,CAAC;IAED,UAAU,CAAC,MAAY,EAAE,QAAmB,EAAE,EAAa;QACzD,qBAAqB;QACrB,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,EAAE,EAAE,CAAA;QAC9B,oBAAoB;QACpB,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,wBAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IAClE,CAAC;IAED,WAAW,CACT,MAAY,EACZ,QAAmB,EACnB,SAAoB,EACpB,EAAa;QAEb,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,EAAE,CAAA;QAC9C,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,EAAE,EAAE,CAAA;QAC9B,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CACjB,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC,CAClD,CAAA;YACD,OAAM;SACP;QACD,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAE3C,qEAAqE;QACrE,4DAA4D;QAC5D,yDAAyD;QACzD,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,EAAE,KAAK,KAAK,CAAC;gBAAE,EAAE,EAAE,CAAA;QACzB,CAAC,CAAA;QAED,KAAK,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE;YAC9D,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,SAAQ;YAC9B,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;SACnC;QAED,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,cAAc,EAAE,EAAE;YAC1C,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE;gBAC5D,SAAQ;aACT;YACD,KAAK,EAAE,CAAA;YACP,MAAM,QAAQ,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;YAChC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;SAC/C;QAED,IAAI,EAAE,CAAA;IACR,CAAC;IAED,WAAW,CACT,MAAY,EACZ,OAAe,EACf,SAAoB,EACpB,EAAa;QAEb,SAAS,GAAG,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAEpD,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,EAAE,KAAK,KAAK,CAAC;gBAAE,EAAE,EAAE,CAAA;QACzB,CAAC,CAAA;QAED,KAAK,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE;YAC9D,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,SAAQ;YAC9B,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;SACnC;QACD,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE;YAC7D,KAAK,EAAE,CAAA;YACP,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAA;SAC5D;QAED,IAAI,EAAE,CAAA;IACR,CAAC;CACF;AAlSD,4BAkSC;AAED,MAAa,UAEX,SAAQ,QAAW;IACnB,OAAO,CAMe;IAEtB,YAAY,QAAmB,EAAE,IAAU,EAAE,IAAO;QAClD,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAgB,CAAA;IACxC,CAAC;IAGD,SAAS,CAAC,CAAgB;QACxB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;QAClD,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;YACzB,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;SACxB;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;gBACzC,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE;oBACxB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;iBACxB;qBAAM;oBACL,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;iBAClB;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QACF,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,QAAQ;QACN,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;QAClD,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;YACzB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAA;SACtB;QACD,4DAA4D;QAC5D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;YAC7C,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;gBAAE,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;QACpD,CAAC,CAAC,CAAA;QACF,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;CACF;AAjDD,gCAiDC;AAED,MAAa,UAEX,SAAQ,QAAW;IACnB,OAAO,CAMmC;IAE1C,YAAY,QAAmB,EAAE,IAAU,EAAE,IAAO;QAClD,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,mBAAQ,CAAC;YAC1B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE,IAAI;SACjB,CAAmB,CAAA;QACpB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;QAC7C,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;IAChD,CAAC;IAGD,SAAS,CAAC,CAAgB;QACxB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACrB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,IAAI,CAAC,KAAK,EAAE,CAAA;IACzC,CAAC;IAED,MAAM;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAA;QACxB,IAAI,MAAM,CAAC,SAAS,EAAE,EAAE;YACtB,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;gBACvB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;YAC9D,CAAC,CAAC,CAAA;SACH;aAAM;YACL,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;SAC7D;QACD,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,UAAU;QACR,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;YACzB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAA;SACtB;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QACnE,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;CACF;AA9CD,gCA8CC","sourcesContent":["/**\n * Single-use utility classes to provide functionality to the {@link Glob}\n * methods.\n *\n * @module\n */\nimport { Minipass } from 'minipass'\nimport { Path } from 'path-scurry'\nimport { Ignore, IgnoreLike } from './ignore.js'\n\n// XXX can we somehow make it so that it NEVER processes a given path more than\n// once, enough that the match set tracking is no longer needed?  that'd speed\n// things up a lot.  Or maybe bring back nounique, and skip it in that case?\n\n// a single minimatch set entry with 1 or more parts\nimport { Pattern } from './pattern.js'\nimport { Processor } from './processor.js'\n\nexport interface GlobWalkerOpts {\n  absolute?: boolean\n  allowWindowsEscape?: boolean\n  cwd?: string | URL\n  dot?: boolean\n  dotRelative?: boolean\n  follow?: boolean\n  ignore?: string | string[] | IgnoreLike\n  mark?: boolean\n  matchBase?: boolean\n  // Note: maxDepth here means \"maximum actual Path.depth()\",\n  // not \"maximum depth beyond cwd\"\n  maxDepth?: number\n  nobrace?: boolean\n  nocase?: boolean\n  nodir?: boolean\n  noext?: boolean\n  noglobstar?: boolean\n  platform?: NodeJS.Platform\n  posix?: boolean\n  realpath?: boolean\n  root?: string\n  stat?: boolean\n  signal?: AbortSignal\n  windowsPathsNoEscape?: boolean\n  withFileTypes?: boolean\n}\n\nexport type GWOFileTypesTrue = GlobWalkerOpts & {\n  withFileTypes: true\n}\nexport type GWOFileTypesFalse = GlobWalkerOpts & {\n  withFileTypes: false\n}\nexport type GWOFileTypesUnset = GlobWalkerOpts & {\n  withFileTypes?: undefined\n}\n\nexport type Result = O extends GWOFileTypesTrue\n  ? Path\n  : O extends GWOFileTypesFalse\n  ? string\n  : O extends GWOFileTypesUnset\n  ? string\n  : Path | string\n\nexport type Matches = O extends GWOFileTypesTrue\n  ? Set\n  : O extends GWOFileTypesFalse\n  ? Set\n  : O extends GWOFileTypesUnset\n  ? Set\n  : Set\n\nexport type MatchStream =\n  O extends GWOFileTypesTrue\n    ? Minipass\n    : O extends GWOFileTypesFalse\n    ? Minipass\n    : O extends GWOFileTypesUnset\n    ? Minipass\n    : Minipass\n\nconst makeIgnore = (\n  ignore: string | string[] | IgnoreLike,\n  opts: GlobWalkerOpts\n): IgnoreLike =>\n  typeof ignore === 'string'\n    ? new Ignore([ignore], opts)\n    : Array.isArray(ignore)\n    ? new Ignore(ignore, opts)\n    : ignore\n\n/**\n * basic walking utilities that all the glob walker types use\n */\nexport abstract class GlobUtil {\n  path: Path\n  patterns: Pattern[]\n  opts: O\n  seen: Set = new Set()\n  paused: boolean = false\n  aborted: boolean = false\n  #onResume: (() => any)[] = []\n  #ignore?: IgnoreLike\n  #sep: '\\\\' | '/'\n  signal?: AbortSignal\n  maxDepth: number\n\n  constructor(patterns: Pattern[], path: Path, opts: O)\n  constructor(patterns: Pattern[], path: Path, opts: O) {\n    this.patterns = patterns\n    this.path = path\n    this.opts = opts\n    this.#sep = !opts.posix && opts.platform === 'win32' ? '\\\\' : '/'\n    if (opts.ignore) {\n      this.#ignore = makeIgnore(opts.ignore, opts)\n    }\n    // ignore, always set with maxDepth, but it's optional on the\n    // GlobOptions type\n    /* c8 ignore start */\n    this.maxDepth = opts.maxDepth || Infinity\n    /* c8 ignore stop */\n    if (opts.signal) {\n      this.signal = opts.signal\n      this.signal.addEventListener('abort', () => {\n        this.#onResume.length = 0\n      })\n    }\n  }\n\n  #ignored(path: Path): boolean {\n    return this.seen.has(path) || !!this.#ignore?.ignored?.(path)\n  }\n  #childrenIgnored(path: Path): boolean {\n    return !!this.#ignore?.childrenIgnored?.(path)\n  }\n\n  // backpressure mechanism\n  pause() {\n    this.paused = true\n  }\n  resume() {\n    /* c8 ignore start */\n    if (this.signal?.aborted) return\n    /* c8 ignore stop */\n    this.paused = false\n    let fn: (() => any) | undefined = undefined\n    while (!this.paused && (fn = this.#onResume.shift())) {\n      fn()\n    }\n  }\n  onResume(fn: () => any) {\n    if (this.signal?.aborted) return\n    /* c8 ignore start */\n    if (!this.paused) {\n      fn()\n    } else {\n      /* c8 ignore stop */\n      this.#onResume.push(fn)\n    }\n  }\n\n  // do the requisite realpath/stat checking, and return the path\n  // to add or undefined to filter it out.\n  async matchCheck(e: Path, ifDir: boolean): Promise {\n    if (ifDir && this.opts.nodir) return undefined\n    let rpc: Path | undefined\n    if (this.opts.realpath) {\n      rpc = e.realpathCached() || (await e.realpath())\n      if (!rpc) return undefined\n      e = rpc\n    }\n    const needStat = e.isUnknown() || this.opts.stat\n    return this.matchCheckTest(needStat ? await e.lstat() : e, ifDir)\n  }\n\n  matchCheckTest(e: Path | undefined, ifDir: boolean): Path | undefined {\n    return e &&\n      (this.maxDepth === Infinity || e.depth() <= this.maxDepth) &&\n      (!ifDir || e.canReaddir()) &&\n      (!this.opts.nodir || !e.isDirectory()) &&\n      !this.#ignored(e)\n      ? e\n      : undefined\n  }\n\n  matchCheckSync(e: Path, ifDir: boolean): Path | undefined {\n    if (ifDir && this.opts.nodir) return undefined\n    let rpc: Path | undefined\n    if (this.opts.realpath) {\n      rpc = e.realpathCached() || e.realpathSync()\n      if (!rpc) return undefined\n      e = rpc\n    }\n    const needStat = e.isUnknown() || this.opts.stat\n    return this.matchCheckTest(needStat ? e.lstatSync() : e, ifDir)\n  }\n\n  abstract matchEmit(p: Result): void\n  abstract matchEmit(p: string | Path): void\n\n  matchFinish(e: Path, absolute: boolean) {\n    if (this.#ignored(e)) return\n    const abs =\n      this.opts.absolute === undefined ? absolute : this.opts.absolute\n    this.seen.add(e)\n    const mark = this.opts.mark && e.isDirectory() ? this.#sep : ''\n    // ok, we have what we need!\n    if (this.opts.withFileTypes) {\n      this.matchEmit(e)\n    } else if (abs) {\n      const abs = this.opts.posix ? e.fullpathPosix() : e.fullpath()\n      this.matchEmit(abs + mark)\n    } else {\n      const rel = this.opts.posix ? e.relativePosix() : e.relative()\n      const pre =\n        this.opts.dotRelative && !rel.startsWith('..' + this.#sep)\n          ? '.' + this.#sep\n          : ''\n      this.matchEmit(!rel ? '.' + mark : pre + rel + mark)\n    }\n  }\n\n  async match(e: Path, absolute: boolean, ifDir: boolean): Promise {\n    const p = await this.matchCheck(e, ifDir)\n    if (p) this.matchFinish(p, absolute)\n  }\n\n  matchSync(e: Path, absolute: boolean, ifDir: boolean): void {\n    const p = this.matchCheckSync(e, ifDir)\n    if (p) this.matchFinish(p, absolute)\n  }\n\n  walkCB(target: Path, patterns: Pattern[], cb: () => any) {\n    /* c8 ignore start */\n    if (this.signal?.aborted) cb()\n    /* c8 ignore stop */\n    this.walkCB2(target, patterns, new Processor(this.opts), cb)\n  }\n\n  walkCB2(\n    target: Path,\n    patterns: Pattern[],\n    processor: Processor,\n    cb: () => any\n  ) {\n    if (this.#childrenIgnored(target)) return cb()\n    if (this.signal?.aborted) cb()\n    if (this.paused) {\n      this.onResume(() => this.walkCB2(target, patterns, processor, cb))\n      return\n    }\n    processor.processPatterns(target, patterns)\n\n    // done processing.  all of the above is sync, can be abstracted out.\n    // subwalks is a map of paths to the entry filters they need\n    // matches is a map of paths to [absolute, ifDir] tuples.\n    let tasks = 1\n    const next = () => {\n      if (--tasks === 0) cb()\n    }\n\n    for (const [m, absolute, ifDir] of processor.matches.entries()) {\n      if (this.#ignored(m)) continue\n      tasks++\n      this.match(m, absolute, ifDir).then(() => next())\n    }\n\n    for (const t of processor.subwalkTargets()) {\n      if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) {\n        continue\n      }\n      tasks++\n      const childrenCached = t.readdirCached()\n      if (t.calledReaddir())\n        this.walkCB3(t, childrenCached, processor, next)\n      else {\n        t.readdirCB(\n          (_, entries) => this.walkCB3(t, entries, processor, next),\n          true\n        )\n      }\n    }\n\n    next()\n  }\n\n  walkCB3(\n    target: Path,\n    entries: Path[],\n    processor: Processor,\n    cb: () => any\n  ) {\n    processor = processor.filterEntries(target, entries)\n\n    let tasks = 1\n    const next = () => {\n      if (--tasks === 0) cb()\n    }\n\n    for (const [m, absolute, ifDir] of processor.matches.entries()) {\n      if (this.#ignored(m)) continue\n      tasks++\n      this.match(m, absolute, ifDir).then(() => next())\n    }\n    for (const [target, patterns] of processor.subwalks.entries()) {\n      tasks++\n      this.walkCB2(target, patterns, processor.child(), next)\n    }\n\n    next()\n  }\n\n  walkCBSync(target: Path, patterns: Pattern[], cb: () => any) {\n    /* c8 ignore start */\n    if (this.signal?.aborted) cb()\n    /* c8 ignore stop */\n    this.walkCB2Sync(target, patterns, new Processor(this.opts), cb)\n  }\n\n  walkCB2Sync(\n    target: Path,\n    patterns: Pattern[],\n    processor: Processor,\n    cb: () => any\n  ) {\n    if (this.#childrenIgnored(target)) return cb()\n    if (this.signal?.aborted) cb()\n    if (this.paused) {\n      this.onResume(() =>\n        this.walkCB2Sync(target, patterns, processor, cb)\n      )\n      return\n    }\n    processor.processPatterns(target, patterns)\n\n    // done processing.  all of the above is sync, can be abstracted out.\n    // subwalks is a map of paths to the entry filters they need\n    // matches is a map of paths to [absolute, ifDir] tuples.\n    let tasks = 1\n    const next = () => {\n      if (--tasks === 0) cb()\n    }\n\n    for (const [m, absolute, ifDir] of processor.matches.entries()) {\n      if (this.#ignored(m)) continue\n      this.matchSync(m, absolute, ifDir)\n    }\n\n    for (const t of processor.subwalkTargets()) {\n      if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) {\n        continue\n      }\n      tasks++\n      const children = t.readdirSync()\n      this.walkCB3Sync(t, children, processor, next)\n    }\n\n    next()\n  }\n\n  walkCB3Sync(\n    target: Path,\n    entries: Path[],\n    processor: Processor,\n    cb: () => any\n  ) {\n    processor = processor.filterEntries(target, entries)\n\n    let tasks = 1\n    const next = () => {\n      if (--tasks === 0) cb()\n    }\n\n    for (const [m, absolute, ifDir] of processor.matches.entries()) {\n      if (this.#ignored(m)) continue\n      this.matchSync(m, absolute, ifDir)\n    }\n    for (const [target, patterns] of processor.subwalks.entries()) {\n      tasks++\n      this.walkCB2Sync(target, patterns, processor.child(), next)\n    }\n\n    next()\n  }\n}\n\nexport class GlobWalker<\n  O extends GlobWalkerOpts = GlobWalkerOpts\n> extends GlobUtil {\n  matches: O extends GWOFileTypesTrue\n    ? Set\n    : O extends GWOFileTypesFalse\n    ? Set\n    : O extends GWOFileTypesUnset\n    ? Set\n    : Set\n\n  constructor(patterns: Pattern[], path: Path, opts: O) {\n    super(patterns, path, opts)\n    this.matches = new Set() as Matches\n  }\n\n  matchEmit(e: Result): void\n  matchEmit(e: Path | string): void {\n    this.matches.add(e)\n  }\n\n  async walk(): Promise> {\n    if (this.signal?.aborted) throw this.signal.reason\n    if (this.path.isUnknown()) {\n      await this.path.lstat()\n    }\n    await new Promise((res, rej) => {\n      this.walkCB(this.path, this.patterns, () => {\n        if (this.signal?.aborted) {\n          rej(this.signal.reason)\n        } else {\n          res(this.matches)\n        }\n      })\n    })\n    return this.matches\n  }\n\n  walkSync(): Matches {\n    if (this.signal?.aborted) throw this.signal.reason\n    if (this.path.isUnknown()) {\n      this.path.lstatSync()\n    }\n    // nothing for the callback to do, because this never pauses\n    this.walkCBSync(this.path, this.patterns, () => {\n      if (this.signal?.aborted) throw this.signal.reason\n    })\n    return this.matches\n  }\n}\n\nexport class GlobStream<\n  O extends GlobWalkerOpts = GlobWalkerOpts\n> extends GlobUtil {\n  results: O extends GWOFileTypesTrue\n    ? Minipass\n    : O extends GWOFileTypesFalse\n    ? Minipass\n    : O extends GWOFileTypesUnset\n    ? Minipass\n    : Minipass\n\n  constructor(patterns: Pattern[], path: Path, opts: O) {\n    super(patterns, path, opts)\n    this.results = new Minipass({\n      signal: this.signal,\n      objectMode: true,\n    }) as MatchStream\n    this.results.on('drain', () => this.resume())\n    this.results.on('resume', () => this.resume())\n  }\n\n  matchEmit(e: Result): void\n  matchEmit(e: Path | string): void {\n    this.results.write(e)\n    if (!this.results.flowing) this.pause()\n  }\n\n  stream(): MatchStream {\n    const target = this.path\n    if (target.isUnknown()) {\n      target.lstat().then(() => {\n        this.walkCB(target, this.patterns, () => this.results.end())\n      })\n    } else {\n      this.walkCB(target, this.patterns, () => this.results.end())\n    }\n    return this.results\n  }\n\n  streamSync(): MatchStream {\n    if (this.path.isUnknown()) {\n      this.path.lstatSync()\n    }\n    this.walkCBSync(this.path, this.patterns, () => this.results.end())\n    return this.results\n  }\n}\n"]}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/glob.d.ts b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/glob.d.ts
    deleted file mode 100644
    index a8b3da7722b652..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/glob.d.ts
    +++ /dev/null
    @@ -1,344 +0,0 @@
    -/// 
    -import { Minimatch } from 'minimatch';
    -import { Minipass } from 'minipass';
    -import { FSOption, Path, PathScurry } from 'path-scurry';
    -import { IgnoreLike } from './ignore.js';
    -import { Pattern } from './pattern.js';
    -export type MatchSet = Minimatch['set'];
    -export type GlobParts = Exclude;
    -/**
    - * A `GlobOptions` object may be provided to any of the exported methods, and
    - * must be provided to the `Glob` constructor.
    - *
    - * All options are optional, boolean, and false by default, unless otherwise
    - * noted.
    - *
    - * All resolved options are added to the Glob object as properties.
    - *
    - * If you are running many `glob` operations, you can pass a Glob object as the
    - * `options` argument to a subsequent operation to share the previously loaded
    - * cache.
    - */
    -export interface GlobOptions {
    -    /**
    -     * Set to `true` to always receive absolute paths for
    -     * matched files. Set to `false` to always return relative paths.
    -     *
    -     * When this option is not set, absolute paths are returned for patterns
    -     * that are absolute, and otherwise paths are returned that are relative
    -     * to the `cwd` setting.
    -     *
    -     * This does _not_ make an extra system call to get
    -     * the realpath, it only does string path resolution.
    -     *
    -     * Conflicts with {@link withFileTypes}
    -     */
    -    absolute?: boolean;
    -    /**
    -     * Set to false to enable {@link windowsPathsNoEscape}
    -     *
    -     * @deprecated
    -     */
    -    allowWindowsEscape?: boolean;
    -    /**
    -     * The current working directory in which to search. Defaults to
    -     * `process.cwd()`.
    -     *
    -     * May be eiher a string path or a `file://` URL object or string.
    -     */
    -    cwd?: string | URL;
    -    /**
    -     * Include `.dot` files in normal matches and `globstar`
    -     * matches. Note that an explicit dot in a portion of the pattern
    -     * will always match dot files.
    -     */
    -    dot?: boolean;
    -    /**
    -     * Prepend all relative path strings with `./` (or `.\` on Windows).
    -     *
    -     * Without this option, returned relative paths are "bare", so instead of
    -     * returning `'./foo/bar'`, they are returned as `'foo/bar'`.
    -     *
    -     * Relative patterns starting with `'../'` are not prepended with `./`, even
    -     * if this option is set.
    -     */
    -    dotRelative?: boolean;
    -    /**
    -     * Follow symlinked directories when expanding `**`
    -     * patterns. This can result in a lot of duplicate references in
    -     * the presence of cyclic links, and make performance quite bad.
    -     *
    -     * By default, a `**` in a pattern will follow 1 symbolic link if
    -     * it is not the first item in the pattern, or none if it is the
    -     * first item in the pattern, following the same behavior as Bash.
    -     */
    -    follow?: boolean;
    -    /**
    -     * string or string[], or an object with `ignore` and `ignoreChildren`
    -     * methods.
    -     *
    -     * If a string or string[] is provided, then this is treated as a glob
    -     * pattern or array of glob patterns to exclude from matches. To ignore all
    -     * children within a directory, as well as the entry itself, append `'/**'`
    -     * to the ignore pattern.
    -     *
    -     * **Note** `ignore` patterns are _always_ in `dot:true` mode, regardless of
    -     * any other settings.
    -     *
    -     * If an object is provided that has `ignored(path)` and/or
    -     * `childrenIgnored(path)` methods, then these methods will be called to
    -     * determine whether any Path is a match or if its children should be
    -     * traversed, respectively.
    -     */
    -    ignore?: string | string[] | IgnoreLike;
    -    /**
    -     * Treat brace expansion like `{a,b}` as a "magic" pattern. Has no
    -     * effect if {@link nobrace} is set.
    -     *
    -     * Only has effect on the {@link hasMagic} function.
    -     */
    -    magicalBraces?: boolean;
    -    /**
    -     * Add a `/` character to directory matches. Note that this requires
    -     * additional stat calls in some cases.
    -     */
    -    mark?: boolean;
    -    /**
    -     * Perform a basename-only match if the pattern does not contain any slash
    -     * characters. That is, `*.js` would be treated as equivalent to
    -     * `**\/*.js`, matching all js files in all directories.
    -     */
    -    matchBase?: boolean;
    -    /**
    -     * Limit the directory traversal to a given depth below the cwd.
    -     * Note that this does NOT prevent traversal to sibling folders,
    -     * root patterns, and so on. It only limits the maximum folder depth
    -     * that the walk will descend, relative to the cwd.
    -     */
    -    maxDepth?: number;
    -    /**
    -     * Do not expand `{a,b}` and `{1..3}` brace sets.
    -     */
    -    nobrace?: boolean;
    -    /**
    -     * Perform a case-insensitive match. This defaults to `true` on macOS and
    -     * Windows systems, and `false` on all others.
    -     *
    -     * **Note** `nocase` should only be explicitly set when it is
    -     * known that the filesystem's case sensitivity differs from the
    -     * platform default. If set `true` on case-sensitive file
    -     * systems, or `false` on case-insensitive file systems, then the
    -     * walk may return more or less results than expected.
    -     */
    -    nocase?: boolean;
    -    /**
    -     * Do not match directories, only files. (Note: to match
    -     * _only_ directories, put a `/` at the end of the pattern.)
    -     */
    -    nodir?: boolean;
    -    /**
    -     * Do not match "extglob" patterns such as `+(a|b)`.
    -     */
    -    noext?: boolean;
    -    /**
    -     * Do not match `**` against multiple filenames. (Ie, treat it as a normal
    -     * `*` instead.)
    -     *
    -     * Conflicts with {@link matchBase}
    -     */
    -    noglobstar?: boolean;
    -    /**
    -     * Defaults to value of `process.platform` if available, or `'linux'` if
    -     * not. Setting `platform:'win32'` on non-Windows systems may cause strange
    -     * behavior.
    -     */
    -    platform?: NodeJS.Platform;
    -    /**
    -     * Set to true to call `fs.realpath` on all of the
    -     * results. In the case of an entry that cannot be resolved, the
    -     * entry is omitted. This incurs a slight performance penalty, of
    -     * course, because of the added system calls.
    -     */
    -    realpath?: boolean;
    -    /**
    -     *
    -     * A string path resolved against the `cwd` option, which
    -     * is used as the starting point for absolute patterns that start
    -     * with `/`, (but not drive letters or UNC paths on Windows).
    -     *
    -     * Note that this _doesn't_ necessarily limit the walk to the
    -     * `root` directory, and doesn't affect the cwd starting point for
    -     * non-absolute patterns. A pattern containing `..` will still be
    -     * able to traverse out of the root directory, if it is not an
    -     * actual root directory on the filesystem, and any non-absolute
    -     * patterns will be matched in the `cwd`. For example, the
    -     * pattern `/../*` with `{root:'/some/path'}` will return all
    -     * files in `/some`, not all files in `/some/path`. The pattern
    -     * `*` with `{root:'/some/path'}` will return all the entries in
    -     * the cwd, not the entries in `/some/path`.
    -     *
    -     * To start absolute and non-absolute patterns in the same
    -     * path, you can use `{root:''}`. However, be aware that on
    -     * Windows systems, a pattern like `x:/*` or `//host/share/*` will
    -     * _always_ start in the `x:/` or `//host/share` directory,
    -     * regardless of the `root` setting.
    -     */
    -    root?: string;
    -    /**
    -     * A [PathScurry](http://npm.im/path-scurry) object used
    -     * to traverse the file system. If the `nocase` option is set
    -     * explicitly, then any provided `scurry` object must match this
    -     * setting.
    -     */
    -    scurry?: PathScurry;
    -    /**
    -     * Call `lstat()` on all entries, whether required or not to determine
    -     * if it's a valid match. When used with {@link withFileTypes}, this means
    -     * that matches will include data such as modified time, permissions, and
    -     * so on.  Note that this will incur a performance cost due to the added
    -     * system calls.
    -     */
    -    stat?: boolean;
    -    /**
    -     * An AbortSignal which will cancel the Glob walk when
    -     * triggered.
    -     */
    -    signal?: AbortSignal;
    -    /**
    -     * Use `\\` as a path separator _only_, and
    -     *  _never_ as an escape character. If set, all `\\` characters are
    -     *  replaced with `/` in the pattern.
    -     *
    -     *  Note that this makes it **impossible** to match against paths
    -     *  containing literal glob pattern characters, but allows matching
    -     *  with patterns constructed using `path.join()` and
    -     *  `path.resolve()` on Windows platforms, mimicking the (buggy!)
    -     *  behavior of Glob v7 and before on Windows. Please use with
    -     *  caution, and be mindful of [the caveat below about Windows
    -     *  paths](#windows). (For legacy reasons, this is also set if
    -     *  `allowWindowsEscape` is set to the exact value `false`.)
    -     */
    -    windowsPathsNoEscape?: boolean;
    -    /**
    -     * Return [PathScurry](http://npm.im/path-scurry)
    -     * `Path` objects instead of strings. These are similar to a
    -     * NodeJS `Dirent` object, but with additional methods and
    -     * properties.
    -     *
    -     * Conflicts with {@link absolute}
    -     */
    -    withFileTypes?: boolean;
    -    /**
    -     * An fs implementation to override some or all of the defaults.  See
    -     * http://npm.im/path-scurry for details about what can be overridden.
    -     */
    -    fs?: FSOption;
    -    /**
    -     * Just passed along to Minimatch.  Note that this makes all pattern
    -     * matching operations slower and *extremely* noisy.
    -     */
    -    debug?: boolean;
    -    /**
    -     * Return `/` delimited paths, even on Windows.
    -     *
    -     * On posix systems, this has no effect.  But, on Windows, it means that
    -     * paths will be `/` delimited, and absolute paths will be their full
    -     * resolved UNC forms, eg instead of `'C:\\foo\\bar'`, it would return
    -     * `'//?/C:/foo/bar'`
    -     */
    -    posix?: boolean;
    -}
    -export type GlobOptionsWithFileTypesTrue = GlobOptions & {
    -    withFileTypes: true;
    -    absolute?: undefined;
    -    mark?: undefined;
    -    posix?: undefined;
    -};
    -export type GlobOptionsWithFileTypesFalse = GlobOptions & {
    -    withFileTypes?: false;
    -};
    -export type GlobOptionsWithFileTypesUnset = GlobOptions & {
    -    withFileTypes?: undefined;
    -};
    -export type Result = Opts extends GlobOptionsWithFileTypesTrue ? Path : Opts extends GlobOptionsWithFileTypesFalse ? string : Opts extends GlobOptionsWithFileTypesUnset ? string : string | Path;
    -export type Results = Result[];
    -export type FileTypes = Opts extends GlobOptionsWithFileTypesTrue ? true : Opts extends GlobOptionsWithFileTypesFalse ? false : Opts extends GlobOptionsWithFileTypesUnset ? false : boolean;
    -/**
    - * An object that can perform glob pattern traversals.
    - */
    -export declare class Glob implements GlobOptions {
    -    absolute?: boolean;
    -    cwd: string;
    -    root?: string;
    -    dot: boolean;
    -    dotRelative: boolean;
    -    follow: boolean;
    -    ignore?: string | string[] | IgnoreLike;
    -    magicalBraces: boolean;
    -    mark?: boolean;
    -    matchBase: boolean;
    -    maxDepth: number;
    -    nobrace: boolean;
    -    nocase: boolean;
    -    nodir: boolean;
    -    noext: boolean;
    -    noglobstar: boolean;
    -    pattern: string[];
    -    platform: NodeJS.Platform;
    -    realpath: boolean;
    -    scurry: PathScurry;
    -    stat: boolean;
    -    signal?: AbortSignal;
    -    windowsPathsNoEscape: boolean;
    -    withFileTypes: FileTypes;
    -    /**
    -     * The options provided to the constructor.
    -     */
    -    opts: Opts;
    -    /**
    -     * An array of parsed immutable {@link Pattern} objects.
    -     */
    -    patterns: Pattern[];
    -    /**
    -     * All options are stored as properties on the `Glob` object.
    -     *
    -     * See {@link GlobOptions} for full options descriptions.
    -     *
    -     * Note that a previous `Glob` object can be passed as the
    -     * `GlobOptions` to another `Glob` instantiation to re-use settings
    -     * and caches with a new pattern.
    -     *
    -     * Traversal functions can be called multiple times to run the walk
    -     * again.
    -     */
    -    constructor(pattern: string | string[], opts: Opts);
    -    /**
    -     * Returns a Promise that resolves to the results array.
    -     */
    -    walk(): Promise>;
    -    /**
    -     * synchronous {@link Glob.walk}
    -     */
    -    walkSync(): Results;
    -    /**
    -     * Stream results asynchronously.
    -     */
    -    stream(): Minipass, Result>;
    -    /**
    -     * Stream results synchronously.
    -     */
    -    streamSync(): Minipass, Result>;
    -    /**
    -     * Default sync iteration function. Returns a Generator that
    -     * iterates over the results.
    -     */
    -    iterateSync(): Generator, void, void>;
    -    [Symbol.iterator](): Generator, void, void>;
    -    /**
    -     * Default async iteration function. Returns an AsyncGenerator that
    -     * iterates over the results.
    -     */
    -    iterate(): AsyncGenerator, void, void>;
    -    [Symbol.asyncIterator](): AsyncGenerator, void, void>;
    -}
    -//# sourceMappingURL=glob.d.ts.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/glob.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/glob.d.ts.map
    deleted file mode 100644
    index d45258ac24a580..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/glob.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/glob.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,WAAW,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EACL,QAAQ,EACR,IAAI,EACJ,UAAU,EAIX,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAGtC,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAA;AACvC,MAAM,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAA;AAWlE;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAE5B;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;IAElB;;;;OAIG;IACH,GAAG,CAAC,EAAE,OAAO,CAAA;IAEb;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IAErB;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAEhB;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,UAAU,CAAA;IAEvC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IAEvB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IAEd;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IAEnB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAEhB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IAEpB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;IAE1B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb;;;;;OAKG;IACH,MAAM,CAAC,EAAE,UAAU,CAAA;IAEnB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IAEd;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAA;IAEpB;;;;;;;;;;;;;OAaG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAE9B;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IAEvB;;;OAGG;IACH,EAAE,CAAC,EAAE,QAAQ,CAAA;IAEb;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,MAAM,4BAA4B,GAAG,WAAW,GAAG;IACvD,aAAa,EAAE,IAAI,CAAA;IAEnB,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG,WAAW,GAAG;IACxD,aAAa,CAAC,EAAE,KAAK,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG,WAAW,GAAG;IACxD,aAAa,CAAC,EAAE,SAAS,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,MAAM,CAAC,IAAI,IAAI,IAAI,SAAS,4BAA4B,GAChE,IAAI,GACJ,IAAI,SAAS,6BAA6B,GAC1C,MAAM,GACN,IAAI,SAAS,6BAA6B,GAC1C,MAAM,GACN,MAAM,GAAG,IAAI,CAAA;AACjB,MAAM,MAAM,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAA;AAE1C,MAAM,MAAM,SAAS,CAAC,IAAI,IAAI,IAAI,SAAS,4BAA4B,GACnE,IAAI,GACJ,IAAI,SAAS,6BAA6B,GAC1C,KAAK,GACL,IAAI,SAAS,6BAA6B,GAC1C,KAAK,GACL,OAAO,CAAA;AAEX;;GAEG;AACH,qBAAa,IAAI,CAAC,IAAI,SAAS,WAAW,CAAE,YAAW,WAAW;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,OAAO,CAAA;IACZ,WAAW,EAAE,OAAO,CAAA;IACpB,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,UAAU,CAAA;IACvC,aAAa,EAAE,OAAO,CAAA;IACtB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,OAAO,CAAA;IACf,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,EAAE,OAAO,CAAA;IACd,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAA;IACzB,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,UAAU,CAAA;IAClB,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,oBAAoB,EAAE,OAAO,CAAA;IAC7B,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;IAE9B;;OAEG;IACH,IAAI,EAAE,IAAI,CAAA;IAEV;;OAEG;IACH,QAAQ,EAAE,OAAO,EAAE,CAAA;IAEnB;;;;;;;;;;;OAWG;gBACS,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI;IAwHlD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAmBpC;;OAEG;IACH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAezB;;OAEG;IACH,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAa9C;;OAEG;IACH,UAAU,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAalD;;;OAGG;IACH,WAAW,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;IAGlD,CAAC,MAAM,CAAC,QAAQ,CAAC;IAIjB;;;OAGG;IACH,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;IAGnD,CAAC,MAAM,CAAC,aAAa,CAAC;CAGvB"}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/glob.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/glob.js
    deleted file mode 100644
    index 8ff26154427be9..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/glob.js
    +++ /dev/null
    @@ -1,234 +0,0 @@
    -import { Minimatch } from 'minimatch';
    -import { PathScurry, PathScurryDarwin, PathScurryPosix, PathScurryWin32, } from 'path-scurry';
    -import { fileURLToPath } from 'url';
    -import { Pattern } from './pattern.js';
    -import { GlobStream, GlobWalker } from './walker.js';
    -// if no process global, just call it linux.
    -// so we default to case-sensitive, / separators
    -const defaultPlatform = typeof process === 'object' &&
    -    process &&
    -    typeof process.platform === 'string'
    -    ? process.platform
    -    : 'linux';
    -/**
    - * An object that can perform glob pattern traversals.
    - */
    -export class Glob {
    -    absolute;
    -    cwd;
    -    root;
    -    dot;
    -    dotRelative;
    -    follow;
    -    ignore;
    -    magicalBraces;
    -    mark;
    -    matchBase;
    -    maxDepth;
    -    nobrace;
    -    nocase;
    -    nodir;
    -    noext;
    -    noglobstar;
    -    pattern;
    -    platform;
    -    realpath;
    -    scurry;
    -    stat;
    -    signal;
    -    windowsPathsNoEscape;
    -    withFileTypes;
    -    /**
    -     * The options provided to the constructor.
    -     */
    -    opts;
    -    /**
    -     * An array of parsed immutable {@link Pattern} objects.
    -     */
    -    patterns;
    -    /**
    -     * All options are stored as properties on the `Glob` object.
    -     *
    -     * See {@link GlobOptions} for full options descriptions.
    -     *
    -     * Note that a previous `Glob` object can be passed as the
    -     * `GlobOptions` to another `Glob` instantiation to re-use settings
    -     * and caches with a new pattern.
    -     *
    -     * Traversal functions can be called multiple times to run the walk
    -     * again.
    -     */
    -    constructor(pattern, opts) {
    -        /* c8 ignore start */
    -        if (!opts)
    -            throw new TypeError('glob options required');
    -        /* c8 ignore stop */
    -        this.withFileTypes = !!opts.withFileTypes;
    -        this.signal = opts.signal;
    -        this.follow = !!opts.follow;
    -        this.dot = !!opts.dot;
    -        this.dotRelative = !!opts.dotRelative;
    -        this.nodir = !!opts.nodir;
    -        this.mark = !!opts.mark;
    -        if (!opts.cwd) {
    -            this.cwd = '';
    -        }
    -        else if (opts.cwd instanceof URL || opts.cwd.startsWith('file://')) {
    -            opts.cwd = fileURLToPath(opts.cwd);
    -        }
    -        this.cwd = opts.cwd || '';
    -        this.root = opts.root;
    -        this.magicalBraces = !!opts.magicalBraces;
    -        this.nobrace = !!opts.nobrace;
    -        this.noext = !!opts.noext;
    -        this.realpath = !!opts.realpath;
    -        this.absolute = opts.absolute;
    -        this.noglobstar = !!opts.noglobstar;
    -        this.matchBase = !!opts.matchBase;
    -        this.maxDepth =
    -            typeof opts.maxDepth === 'number' ? opts.maxDepth : Infinity;
    -        this.stat = !!opts.stat;
    -        this.ignore = opts.ignore;
    -        if (this.withFileTypes && this.absolute !== undefined) {
    -            throw new Error('cannot set absolute and withFileTypes:true');
    -        }
    -        if (typeof pattern === 'string') {
    -            pattern = [pattern];
    -        }
    -        this.windowsPathsNoEscape =
    -            !!opts.windowsPathsNoEscape ||
    -                opts.allowWindowsEscape === false;
    -        if (this.windowsPathsNoEscape) {
    -            pattern = pattern.map(p => p.replace(/\\/g, '/'));
    -        }
    -        if (this.matchBase) {
    -            if (opts.noglobstar) {
    -                throw new TypeError('base matching requires globstar');
    -            }
    -            pattern = pattern.map(p => (p.includes('/') ? p : `./**/${p}`));
    -        }
    -        this.pattern = pattern;
    -        this.platform = opts.platform || defaultPlatform;
    -        this.opts = { ...opts, platform: this.platform };
    -        if (opts.scurry) {
    -            this.scurry = opts.scurry;
    -            if (opts.nocase !== undefined &&
    -                opts.nocase !== opts.scurry.nocase) {
    -                throw new Error('nocase option contradicts provided scurry option');
    -            }
    -        }
    -        else {
    -            const Scurry = opts.platform === 'win32'
    -                ? PathScurryWin32
    -                : opts.platform === 'darwin'
    -                    ? PathScurryDarwin
    -                    : opts.platform
    -                        ? PathScurryPosix
    -                        : PathScurry;
    -            this.scurry = new Scurry(this.cwd, {
    -                nocase: opts.nocase,
    -                fs: opts.fs,
    -            });
    -        }
    -        this.nocase = this.scurry.nocase;
    -        // If you do nocase:true on a case-sensitive file system, then
    -        // we need to use regexps instead of strings for non-magic
    -        // path portions, because statting `aBc` won't return results
    -        // for the file `AbC` for example.
    -        const nocaseMagicOnly = this.platform === 'darwin' || this.platform === 'win32';
    -        const mmo = {
    -            // default nocase based on platform
    -            ...opts,
    -            dot: this.dot,
    -            matchBase: this.matchBase,
    -            nobrace: this.nobrace,
    -            nocase: this.nocase,
    -            nocaseMagicOnly,
    -            nocomment: true,
    -            noext: this.noext,
    -            nonegate: true,
    -            optimizationLevel: 2,
    -            platform: this.platform,
    -            windowsPathsNoEscape: this.windowsPathsNoEscape,
    -            debug: !!this.opts.debug,
    -        };
    -        const mms = this.pattern.map(p => new Minimatch(p, mmo));
    -        const [matchSet, globParts] = mms.reduce((set, m) => {
    -            set[0].push(...m.set);
    -            set[1].push(...m.globParts);
    -            return set;
    -        }, [[], []]);
    -        this.patterns = matchSet.map((set, i) => {
    -            return new Pattern(set, globParts[i], 0, this.platform);
    -        });
    -    }
    -    async walk() {
    -        // Walkers always return array of Path objects, so we just have to
    -        // coerce them into the right shape.  It will have already called
    -        // realpath() if the option was set to do so, so we know that's cached.
    -        // start out knowing the cwd, at least
    -        return [
    -            ...(await new GlobWalker(this.patterns, this.scurry.cwd, {
    -                ...this.opts,
    -                maxDepth: this.maxDepth !== Infinity
    -                    ? this.maxDepth + this.scurry.cwd.depth()
    -                    : Infinity,
    -                platform: this.platform,
    -                nocase: this.nocase,
    -            }).walk()),
    -        ];
    -    }
    -    walkSync() {
    -        return [
    -            ...new GlobWalker(this.patterns, this.scurry.cwd, {
    -                ...this.opts,
    -                maxDepth: this.maxDepth !== Infinity
    -                    ? this.maxDepth + this.scurry.cwd.depth()
    -                    : Infinity,
    -                platform: this.platform,
    -                nocase: this.nocase,
    -            }).walkSync(),
    -        ];
    -    }
    -    stream() {
    -        return new GlobStream(this.patterns, this.scurry.cwd, {
    -            ...this.opts,
    -            maxDepth: this.maxDepth !== Infinity
    -                ? this.maxDepth + this.scurry.cwd.depth()
    -                : Infinity,
    -            platform: this.platform,
    -            nocase: this.nocase,
    -        }).stream();
    -    }
    -    streamSync() {
    -        return new GlobStream(this.patterns, this.scurry.cwd, {
    -            ...this.opts,
    -            maxDepth: this.maxDepth !== Infinity
    -                ? this.maxDepth + this.scurry.cwd.depth()
    -                : Infinity,
    -            platform: this.platform,
    -            nocase: this.nocase,
    -        }).streamSync();
    -    }
    -    /**
    -     * Default sync iteration function. Returns a Generator that
    -     * iterates over the results.
    -     */
    -    iterateSync() {
    -        return this.streamSync()[Symbol.iterator]();
    -    }
    -    [Symbol.iterator]() {
    -        return this.iterateSync();
    -    }
    -    /**
    -     * Default async iteration function. Returns an AsyncGenerator that
    -     * iterates over the results.
    -     */
    -    iterate() {
    -        return this.stream()[Symbol.asyncIterator]();
    -    }
    -    [Symbol.asyncIterator]() {
    -        return this.iterate();
    -    }
    -}
    -//# sourceMappingURL=glob.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/glob.js.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/glob.js.map
    deleted file mode 100644
    index 94558c1d2c66a4..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/glob.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/glob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,WAAW,CAAA;AAEvD,OAAO,EAGL,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AAEnC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAKpD,4CAA4C;AAC5C,gDAAgD;AAChD,MAAM,eAAe,GACnB,OAAO,OAAO,KAAK,QAAQ;IAC3B,OAAO;IACP,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ;IAClC,CAAC,CAAC,OAAO,CAAC,QAAQ;IAClB,CAAC,CAAC,OAAO,CAAA;AAgTb;;GAEG;AACH,MAAM,OAAO,IAAI;IACf,QAAQ,CAAU;IAClB,GAAG,CAAQ;IACX,IAAI,CAAS;IACb,GAAG,CAAS;IACZ,WAAW,CAAS;IACpB,MAAM,CAAS;IACf,MAAM,CAAiC;IACvC,aAAa,CAAS;IACtB,IAAI,CAAU;IACd,SAAS,CAAS;IAClB,QAAQ,CAAQ;IAChB,OAAO,CAAS;IAChB,MAAM,CAAS;IACf,KAAK,CAAS;IACd,KAAK,CAAS;IACd,UAAU,CAAS;IACnB,OAAO,CAAU;IACjB,QAAQ,CAAiB;IACzB,QAAQ,CAAS;IACjB,MAAM,CAAY;IAClB,IAAI,CAAS;IACb,MAAM,CAAc;IACpB,oBAAoB,CAAS;IAC7B,aAAa,CAAiB;IAE9B;;OAEG;IACH,IAAI,CAAM;IAEV;;OAEG;IACH,QAAQ,CAAW;IAEnB;;;;;;;;;;;OAWG;IACH,YAAY,OAA0B,EAAE,IAAU;QAChD,qBAAqB;QACrB,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,SAAS,CAAC,uBAAuB,CAAC,CAAA;QACvD,oBAAoB;QACpB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,aAAgC,CAAA;QAC5D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QACzB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAA;QAC3B,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAA;QACrB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,CAAA;QACrC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAA;QACzB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;QACvB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,IAAI,CAAC,GAAG,GAAG,EAAE,CAAA;SACd;aAAM,IAAI,IAAI,CAAC,GAAG,YAAY,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;YACpE,IAAI,CAAC,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;SACnC;QACD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,CAAA;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACrB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAA;QACzC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAA;QAC7B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAA;QACzB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAA;QAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAE7B,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAA;QACnC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAA;QACjC,IAAI,CAAC,QAAQ;YACX,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAA;QAC9D,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAEzB,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE;YACrD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;SAC9D;QAED,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;YAC/B,OAAO,GAAG,CAAC,OAAO,CAAC,CAAA;SACpB;QAED,IAAI,CAAC,oBAAoB;YACvB,CAAC,CAAC,IAAI,CAAC,oBAAoB;gBAC1B,IAAoB,CAAC,kBAAkB,KAAK,KAAK,CAAA;QAEpD,IAAI,IAAI,CAAC,oBAAoB,EAAE;YAC7B,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;SAClD;QAED,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,IAAI,CAAC,UAAU,EAAE;gBACnB,MAAM,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAA;aACvD;YACD,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;SAChE;QAED,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QAEtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,eAAe,CAAA;QAChD,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAA;QAChD,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;YACzB,IACE,IAAI,CAAC,MAAM,KAAK,SAAS;gBACzB,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,EAClC;gBACA,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;aACpE;SACF;aAAM;YACL,MAAM,MAAM,GACV,IAAI,CAAC,QAAQ,KAAK,OAAO;gBACvB,CAAC,CAAC,eAAe;gBACjB,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ;oBAC5B,CAAC,CAAC,gBAAgB;oBAClB,CAAC,CAAC,IAAI,CAAC,QAAQ;wBACf,CAAC,CAAC,eAAe;wBACjB,CAAC,CAAC,UAAU,CAAA;YAChB,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;gBACjC,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,EAAE,EAAE,IAAI,CAAC,EAAE;aACZ,CAAC,CAAA;SACH;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;QAEhC,8DAA8D;QAC9D,0DAA0D;QAC1D,6DAA6D;QAC7D,kCAAkC;QAClC,MAAM,eAAe,GACnB,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAA;QAEzD,MAAM,GAAG,GAAqB;YAC5B,mCAAmC;YACnC,GAAG,IAAI;YACP,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,eAAe;YACf,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI;YACd,iBAAiB,EAAE,CAAC;YACpB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;YAC/C,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;SACzB,CAAA;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QACxD,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,GAAG,CAAC,MAAM,CACtC,CAAC,GAA0B,EAAE,CAAC,EAAE,EAAE;YAChC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;YACrB,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAA;YAC3B,OAAO,GAAG,CAAA;QACZ,CAAC,EACD,CAAC,EAAE,EAAE,EAAE,CAAC,CACT,CAAA;QACD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACtC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QACzD,CAAC,CAAC,CAAA;IACJ,CAAC;IAMD,KAAK,CAAC,IAAI;QACR,kEAAkE;QAClE,iEAAiE;QACjE,uEAAuE;QACvE,sCAAsC;QACtC,OAAO;YACL,GAAG,CAAC,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;gBACvD,GAAG,IAAI,CAAC,IAAI;gBACZ,QAAQ,EACN,IAAI,CAAC,QAAQ,KAAK,QAAQ;oBACxB,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE;oBACzC,CAAC,CAAC,QAAQ;gBACd,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC,IAAI,EAAE,CAAC;SACX,CAAA;IACH,CAAC;IAMD,QAAQ;QACN,OAAO;YACL,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;gBAChD,GAAG,IAAI,CAAC,IAAI;gBACZ,QAAQ,EACN,IAAI,CAAC,QAAQ,KAAK,QAAQ;oBACxB,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE;oBACzC,CAAC,CAAC,QAAQ;gBACd,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC,QAAQ,EAAE;SACd,CAAA;IACH,CAAC;IAMD,MAAM;QACJ,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YACpD,GAAG,IAAI,CAAC,IAAI;YACZ,QAAQ,EACN,IAAI,CAAC,QAAQ,KAAK,QAAQ;gBACxB,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE;gBACzC,CAAC,CAAC,QAAQ;YACd,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC,MAAM,EAAE,CAAA;IACb,CAAC;IAMD,UAAU;QACR,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YACpD,GAAG,IAAI,CAAC,IAAI;YACZ,QAAQ,EACN,IAAI,CAAC,QAAQ,KAAK,QAAQ;gBACxB,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE;gBACzC,CAAC,CAAC,QAAQ;YACd,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC,UAAU,EAAE,CAAA;IACjB,CAAC;IAED;;;OAGG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAA;IAC7C,CAAC;IACD,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,CAAC,WAAW,EAAE,CAAA;IAC3B,CAAC;IAED;;;OAGG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAA;IAC9C,CAAC;IACD,CAAC,MAAM,CAAC,aAAa,CAAC;QACpB,OAAO,IAAI,CAAC,OAAO,EAAE,CAAA;IACvB,CAAC;CACF","sourcesContent":["import { Minimatch, MinimatchOptions } from 'minimatch'\nimport { Minipass } from 'minipass'\nimport {\n  FSOption,\n  Path,\n  PathScurry,\n  PathScurryDarwin,\n  PathScurryPosix,\n  PathScurryWin32,\n} from 'path-scurry'\nimport { fileURLToPath } from 'url'\nimport { IgnoreLike } from './ignore.js'\nimport { Pattern } from './pattern.js'\nimport { GlobStream, GlobWalker } from './walker.js'\n\nexport type MatchSet = Minimatch['set']\nexport type GlobParts = Exclude\n\n// if no process global, just call it linux.\n// so we default to case-sensitive, / separators\nconst defaultPlatform: NodeJS.Platform =\n  typeof process === 'object' &&\n  process &&\n  typeof process.platform === 'string'\n    ? process.platform\n    : 'linux'\n\n/**\n * A `GlobOptions` object may be provided to any of the exported methods, and\n * must be provided to the `Glob` constructor.\n *\n * All options are optional, boolean, and false by default, unless otherwise\n * noted.\n *\n * All resolved options are added to the Glob object as properties.\n *\n * If you are running many `glob` operations, you can pass a Glob object as the\n * `options` argument to a subsequent operation to share the previously loaded\n * cache.\n */\nexport interface GlobOptions {\n  /**\n   * Set to `true` to always receive absolute paths for\n   * matched files. Set to `false` to always return relative paths.\n   *\n   * When this option is not set, absolute paths are returned for patterns\n   * that are absolute, and otherwise paths are returned that are relative\n   * to the `cwd` setting.\n   *\n   * This does _not_ make an extra system call to get\n   * the realpath, it only does string path resolution.\n   *\n   * Conflicts with {@link withFileTypes}\n   */\n  absolute?: boolean\n\n  /**\n   * Set to false to enable {@link windowsPathsNoEscape}\n   *\n   * @deprecated\n   */\n  allowWindowsEscape?: boolean\n\n  /**\n   * The current working directory in which to search. Defaults to\n   * `process.cwd()`.\n   *\n   * May be eiher a string path or a `file://` URL object or string.\n   */\n  cwd?: string | URL\n\n  /**\n   * Include `.dot` files in normal matches and `globstar`\n   * matches. Note that an explicit dot in a portion of the pattern\n   * will always match dot files.\n   */\n  dot?: boolean\n\n  /**\n   * Prepend all relative path strings with `./` (or `.\\` on Windows).\n   *\n   * Without this option, returned relative paths are \"bare\", so instead of\n   * returning `'./foo/bar'`, they are returned as `'foo/bar'`.\n   *\n   * Relative patterns starting with `'../'` are not prepended with `./`, even\n   * if this option is set.\n   */\n  dotRelative?: boolean\n\n  /**\n   * Follow symlinked directories when expanding `**`\n   * patterns. This can result in a lot of duplicate references in\n   * the presence of cyclic links, and make performance quite bad.\n   *\n   * By default, a `**` in a pattern will follow 1 symbolic link if\n   * it is not the first item in the pattern, or none if it is the\n   * first item in the pattern, following the same behavior as Bash.\n   */\n  follow?: boolean\n\n  /**\n   * string or string[], or an object with `ignore` and `ignoreChildren`\n   * methods.\n   *\n   * If a string or string[] is provided, then this is treated as a glob\n   * pattern or array of glob patterns to exclude from matches. To ignore all\n   * children within a directory, as well as the entry itself, append `'/**'`\n   * to the ignore pattern.\n   *\n   * **Note** `ignore` patterns are _always_ in `dot:true` mode, regardless of\n   * any other settings.\n   *\n   * If an object is provided that has `ignored(path)` and/or\n   * `childrenIgnored(path)` methods, then these methods will be called to\n   * determine whether any Path is a match or if its children should be\n   * traversed, respectively.\n   */\n  ignore?: string | string[] | IgnoreLike\n\n  /**\n   * Treat brace expansion like `{a,b}` as a \"magic\" pattern. Has no\n   * effect if {@link nobrace} is set.\n   *\n   * Only has effect on the {@link hasMagic} function.\n   */\n  magicalBraces?: boolean\n\n  /**\n   * Add a `/` character to directory matches. Note that this requires\n   * additional stat calls in some cases.\n   */\n  mark?: boolean\n\n  /**\n   * Perform a basename-only match if the pattern does not contain any slash\n   * characters. That is, `*.js` would be treated as equivalent to\n   * `**\\/*.js`, matching all js files in all directories.\n   */\n  matchBase?: boolean\n\n  /**\n   * Limit the directory traversal to a given depth below the cwd.\n   * Note that this does NOT prevent traversal to sibling folders,\n   * root patterns, and so on. It only limits the maximum folder depth\n   * that the walk will descend, relative to the cwd.\n   */\n  maxDepth?: number\n\n  /**\n   * Do not expand `{a,b}` and `{1..3}` brace sets.\n   */\n  nobrace?: boolean\n\n  /**\n   * Perform a case-insensitive match. This defaults to `true` on macOS and\n   * Windows systems, and `false` on all others.\n   *\n   * **Note** `nocase` should only be explicitly set when it is\n   * known that the filesystem's case sensitivity differs from the\n   * platform default. If set `true` on case-sensitive file\n   * systems, or `false` on case-insensitive file systems, then the\n   * walk may return more or less results than expected.\n   */\n  nocase?: boolean\n\n  /**\n   * Do not match directories, only files. (Note: to match\n   * _only_ directories, put a `/` at the end of the pattern.)\n   */\n  nodir?: boolean\n\n  /**\n   * Do not match \"extglob\" patterns such as `+(a|b)`.\n   */\n  noext?: boolean\n\n  /**\n   * Do not match `**` against multiple filenames. (Ie, treat it as a normal\n   * `*` instead.)\n   *\n   * Conflicts with {@link matchBase}\n   */\n  noglobstar?: boolean\n\n  /**\n   * Defaults to value of `process.platform` if available, or `'linux'` if\n   * not. Setting `platform:'win32'` on non-Windows systems may cause strange\n   * behavior.\n   */\n  platform?: NodeJS.Platform\n\n  /**\n   * Set to true to call `fs.realpath` on all of the\n   * results. In the case of an entry that cannot be resolved, the\n   * entry is omitted. This incurs a slight performance penalty, of\n   * course, because of the added system calls.\n   */\n  realpath?: boolean\n\n  /**\n   *\n   * A string path resolved against the `cwd` option, which\n   * is used as the starting point for absolute patterns that start\n   * with `/`, (but not drive letters or UNC paths on Windows).\n   *\n   * Note that this _doesn't_ necessarily limit the walk to the\n   * `root` directory, and doesn't affect the cwd starting point for\n   * non-absolute patterns. A pattern containing `..` will still be\n   * able to traverse out of the root directory, if it is not an\n   * actual root directory on the filesystem, and any non-absolute\n   * patterns will be matched in the `cwd`. For example, the\n   * pattern `/../*` with `{root:'/some/path'}` will return all\n   * files in `/some`, not all files in `/some/path`. The pattern\n   * `*` with `{root:'/some/path'}` will return all the entries in\n   * the cwd, not the entries in `/some/path`.\n   *\n   * To start absolute and non-absolute patterns in the same\n   * path, you can use `{root:''}`. However, be aware that on\n   * Windows systems, a pattern like `x:/*` or `//host/share/*` will\n   * _always_ start in the `x:/` or `//host/share` directory,\n   * regardless of the `root` setting.\n   */\n  root?: string\n\n  /**\n   * A [PathScurry](http://npm.im/path-scurry) object used\n   * to traverse the file system. If the `nocase` option is set\n   * explicitly, then any provided `scurry` object must match this\n   * setting.\n   */\n  scurry?: PathScurry\n\n  /**\n   * Call `lstat()` on all entries, whether required or not to determine\n   * if it's a valid match. When used with {@link withFileTypes}, this means\n   * that matches will include data such as modified time, permissions, and\n   * so on.  Note that this will incur a performance cost due to the added\n   * system calls.\n   */\n  stat?: boolean\n\n  /**\n   * An AbortSignal which will cancel the Glob walk when\n   * triggered.\n   */\n  signal?: AbortSignal\n\n  /**\n   * Use `\\\\` as a path separator _only_, and\n   *  _never_ as an escape character. If set, all `\\\\` characters are\n   *  replaced with `/` in the pattern.\n   *\n   *  Note that this makes it **impossible** to match against paths\n   *  containing literal glob pattern characters, but allows matching\n   *  with patterns constructed using `path.join()` and\n   *  `path.resolve()` on Windows platforms, mimicking the (buggy!)\n   *  behavior of Glob v7 and before on Windows. Please use with\n   *  caution, and be mindful of [the caveat below about Windows\n   *  paths](#windows). (For legacy reasons, this is also set if\n   *  `allowWindowsEscape` is set to the exact value `false`.)\n   */\n  windowsPathsNoEscape?: boolean\n\n  /**\n   * Return [PathScurry](http://npm.im/path-scurry)\n   * `Path` objects instead of strings. These are similar to a\n   * NodeJS `Dirent` object, but with additional methods and\n   * properties.\n   *\n   * Conflicts with {@link absolute}\n   */\n  withFileTypes?: boolean\n\n  /**\n   * An fs implementation to override some or all of the defaults.  See\n   * http://npm.im/path-scurry for details about what can be overridden.\n   */\n  fs?: FSOption\n\n  /**\n   * Just passed along to Minimatch.  Note that this makes all pattern\n   * matching operations slower and *extremely* noisy.\n   */\n  debug?: boolean\n\n  /**\n   * Return `/` delimited paths, even on Windows.\n   *\n   * On posix systems, this has no effect.  But, on Windows, it means that\n   * paths will be `/` delimited, and absolute paths will be their full\n   * resolved UNC forms, eg instead of `'C:\\\\foo\\\\bar'`, it would return\n   * `'//?/C:/foo/bar'`\n   */\n  posix?: boolean\n}\n\nexport type GlobOptionsWithFileTypesTrue = GlobOptions & {\n  withFileTypes: true\n  // string options not relevant if returning Path objects.\n  absolute?: undefined\n  mark?: undefined\n  posix?: undefined\n}\n\nexport type GlobOptionsWithFileTypesFalse = GlobOptions & {\n  withFileTypes?: false\n}\n\nexport type GlobOptionsWithFileTypesUnset = GlobOptions & {\n  withFileTypes?: undefined\n}\n\nexport type Result = Opts extends GlobOptionsWithFileTypesTrue\n  ? Path\n  : Opts extends GlobOptionsWithFileTypesFalse\n  ? string\n  : Opts extends GlobOptionsWithFileTypesUnset\n  ? string\n  : string | Path\nexport type Results = Result[]\n\nexport type FileTypes = Opts extends GlobOptionsWithFileTypesTrue\n  ? true\n  : Opts extends GlobOptionsWithFileTypesFalse\n  ? false\n  : Opts extends GlobOptionsWithFileTypesUnset\n  ? false\n  : boolean\n\n/**\n * An object that can perform glob pattern traversals.\n */\nexport class Glob implements GlobOptions {\n  absolute?: boolean\n  cwd: string\n  root?: string\n  dot: boolean\n  dotRelative: boolean\n  follow: boolean\n  ignore?: string | string[] | IgnoreLike\n  magicalBraces: boolean\n  mark?: boolean\n  matchBase: boolean\n  maxDepth: number\n  nobrace: boolean\n  nocase: boolean\n  nodir: boolean\n  noext: boolean\n  noglobstar: boolean\n  pattern: string[]\n  platform: NodeJS.Platform\n  realpath: boolean\n  scurry: PathScurry\n  stat: boolean\n  signal?: AbortSignal\n  windowsPathsNoEscape: boolean\n  withFileTypes: FileTypes\n\n  /**\n   * The options provided to the constructor.\n   */\n  opts: Opts\n\n  /**\n   * An array of parsed immutable {@link Pattern} objects.\n   */\n  patterns: Pattern[]\n\n  /**\n   * All options are stored as properties on the `Glob` object.\n   *\n   * See {@link GlobOptions} for full options descriptions.\n   *\n   * Note that a previous `Glob` object can be passed as the\n   * `GlobOptions` to another `Glob` instantiation to re-use settings\n   * and caches with a new pattern.\n   *\n   * Traversal functions can be called multiple times to run the walk\n   * again.\n   */\n  constructor(pattern: string | string[], opts: Opts) {\n    /* c8 ignore start */\n    if (!opts) throw new TypeError('glob options required')\n    /* c8 ignore stop */\n    this.withFileTypes = !!opts.withFileTypes as FileTypes\n    this.signal = opts.signal\n    this.follow = !!opts.follow\n    this.dot = !!opts.dot\n    this.dotRelative = !!opts.dotRelative\n    this.nodir = !!opts.nodir\n    this.mark = !!opts.mark\n    if (!opts.cwd) {\n      this.cwd = ''\n    } else if (opts.cwd instanceof URL || opts.cwd.startsWith('file://')) {\n      opts.cwd = fileURLToPath(opts.cwd)\n    }\n    this.cwd = opts.cwd || ''\n    this.root = opts.root\n    this.magicalBraces = !!opts.magicalBraces\n    this.nobrace = !!opts.nobrace\n    this.noext = !!opts.noext\n    this.realpath = !!opts.realpath\n    this.absolute = opts.absolute\n\n    this.noglobstar = !!opts.noglobstar\n    this.matchBase = !!opts.matchBase\n    this.maxDepth =\n      typeof opts.maxDepth === 'number' ? opts.maxDepth : Infinity\n    this.stat = !!opts.stat\n    this.ignore = opts.ignore\n\n    if (this.withFileTypes && this.absolute !== undefined) {\n      throw new Error('cannot set absolute and withFileTypes:true')\n    }\n\n    if (typeof pattern === 'string') {\n      pattern = [pattern]\n    }\n\n    this.windowsPathsNoEscape =\n      !!opts.windowsPathsNoEscape ||\n      (opts as GlobOptions).allowWindowsEscape === false\n\n    if (this.windowsPathsNoEscape) {\n      pattern = pattern.map(p => p.replace(/\\\\/g, '/'))\n    }\n\n    if (this.matchBase) {\n      if (opts.noglobstar) {\n        throw new TypeError('base matching requires globstar')\n      }\n      pattern = pattern.map(p => (p.includes('/') ? p : `./**/${p}`))\n    }\n\n    this.pattern = pattern\n\n    this.platform = opts.platform || defaultPlatform\n    this.opts = { ...opts, platform: this.platform }\n    if (opts.scurry) {\n      this.scurry = opts.scurry\n      if (\n        opts.nocase !== undefined &&\n        opts.nocase !== opts.scurry.nocase\n      ) {\n        throw new Error('nocase option contradicts provided scurry option')\n      }\n    } else {\n      const Scurry =\n        opts.platform === 'win32'\n          ? PathScurryWin32\n          : opts.platform === 'darwin'\n          ? PathScurryDarwin\n          : opts.platform\n          ? PathScurryPosix\n          : PathScurry\n      this.scurry = new Scurry(this.cwd, {\n        nocase: opts.nocase,\n        fs: opts.fs,\n      })\n    }\n    this.nocase = this.scurry.nocase\n\n    // If you do nocase:true on a case-sensitive file system, then\n    // we need to use regexps instead of strings for non-magic\n    // path portions, because statting `aBc` won't return results\n    // for the file `AbC` for example.\n    const nocaseMagicOnly =\n      this.platform === 'darwin' || this.platform === 'win32'\n\n    const mmo: MinimatchOptions = {\n      // default nocase based on platform\n      ...opts,\n      dot: this.dot,\n      matchBase: this.matchBase,\n      nobrace: this.nobrace,\n      nocase: this.nocase,\n      nocaseMagicOnly,\n      nocomment: true,\n      noext: this.noext,\n      nonegate: true,\n      optimizationLevel: 2,\n      platform: this.platform,\n      windowsPathsNoEscape: this.windowsPathsNoEscape,\n      debug: !!this.opts.debug,\n    }\n\n    const mms = this.pattern.map(p => new Minimatch(p, mmo))\n    const [matchSet, globParts] = mms.reduce(\n      (set: [MatchSet, GlobParts], m) => {\n        set[0].push(...m.set)\n        set[1].push(...m.globParts)\n        return set\n      },\n      [[], []]\n    )\n    this.patterns = matchSet.map((set, i) => {\n      return new Pattern(set, globParts[i], 0, this.platform)\n    })\n  }\n\n  /**\n   * Returns a Promise that resolves to the results array.\n   */\n  async walk(): Promise>\n  async walk(): Promise<(string | Path)[]> {\n    // Walkers always return array of Path objects, so we just have to\n    // coerce them into the right shape.  It will have already called\n    // realpath() if the option was set to do so, so we know that's cached.\n    // start out knowing the cwd, at least\n    return [\n      ...(await new GlobWalker(this.patterns, this.scurry.cwd, {\n        ...this.opts,\n        maxDepth:\n          this.maxDepth !== Infinity\n            ? this.maxDepth + this.scurry.cwd.depth()\n            : Infinity,\n        platform: this.platform,\n        nocase: this.nocase,\n      }).walk()),\n    ]\n  }\n\n  /**\n   * synchronous {@link Glob.walk}\n   */\n  walkSync(): Results\n  walkSync(): (string | Path)[] {\n    return [\n      ...new GlobWalker(this.patterns, this.scurry.cwd, {\n        ...this.opts,\n        maxDepth:\n          this.maxDepth !== Infinity\n            ? this.maxDepth + this.scurry.cwd.depth()\n            : Infinity,\n        platform: this.platform,\n        nocase: this.nocase,\n      }).walkSync(),\n    ]\n  }\n\n  /**\n   * Stream results asynchronously.\n   */\n  stream(): Minipass, Result>\n  stream(): Minipass {\n    return new GlobStream(this.patterns, this.scurry.cwd, {\n      ...this.opts,\n      maxDepth:\n        this.maxDepth !== Infinity\n          ? this.maxDepth + this.scurry.cwd.depth()\n          : Infinity,\n      platform: this.platform,\n      nocase: this.nocase,\n    }).stream()\n  }\n\n  /**\n   * Stream results synchronously.\n   */\n  streamSync(): Minipass, Result>\n  streamSync(): Minipass {\n    return new GlobStream(this.patterns, this.scurry.cwd, {\n      ...this.opts,\n      maxDepth:\n        this.maxDepth !== Infinity\n          ? this.maxDepth + this.scurry.cwd.depth()\n          : Infinity,\n      platform: this.platform,\n      nocase: this.nocase,\n    }).streamSync()\n  }\n\n  /**\n   * Default sync iteration function. Returns a Generator that\n   * iterates over the results.\n   */\n  iterateSync(): Generator, void, void> {\n    return this.streamSync()[Symbol.iterator]()\n  }\n  [Symbol.iterator]() {\n    return this.iterateSync()\n  }\n\n  /**\n   * Default async iteration function. Returns an AsyncGenerator that\n   * iterates over the results.\n   */\n  iterate(): AsyncGenerator, void, void> {\n    return this.stream()[Symbol.asyncIterator]()\n  }\n  [Symbol.asyncIterator]() {\n    return this.iterate()\n  }\n}\n"]}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/has-magic.d.ts b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/has-magic.d.ts
    deleted file mode 100644
    index 8aec3bd9725175..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/has-magic.d.ts
    +++ /dev/null
    @@ -1,14 +0,0 @@
    -import { GlobOptions } from './glob.js';
    -/**
    - * Return true if the patterns provided contain any magic glob characters,
    - * given the options provided.
    - *
    - * Brace expansion is not considered "magic" unless the `magicalBraces` option
    - * is set, as brace expansion just turns one string into an array of strings.
    - * So a pattern like `'x{a,b}y'` would return `false`, because `'xay'` and
    - * `'xby'` both do not contain any magic glob characters, and it's treated the
    - * same as if you had called it on `['xay', 'xby']`. When `magicalBraces:true`
    - * is in the options, brace expansion _is_ treated as a pattern having magic.
    - */
    -export declare const hasMagic: (pattern: string | string[], options?: GlobOptions) => boolean;
    -//# sourceMappingURL=has-magic.d.ts.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/has-magic.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/has-magic.d.ts.map
    deleted file mode 100644
    index b24dd4ec47e0bb..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/has-magic.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"has-magic.d.ts","sourceRoot":"","sources":["../../src/has-magic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAEvC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,QAAQ,YACV,MAAM,GAAG,MAAM,EAAE,YACjB,WAAW,KACnB,OAQF,CAAA"}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/has-magic.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/has-magic.js
    deleted file mode 100644
    index ba2321ab868d02..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/has-magic.js
    +++ /dev/null
    @@ -1,23 +0,0 @@
    -import { Minimatch } from 'minimatch';
    -/**
    - * Return true if the patterns provided contain any magic glob characters,
    - * given the options provided.
    - *
    - * Brace expansion is not considered "magic" unless the `magicalBraces` option
    - * is set, as brace expansion just turns one string into an array of strings.
    - * So a pattern like `'x{a,b}y'` would return `false`, because `'xay'` and
    - * `'xby'` both do not contain any magic glob characters, and it's treated the
    - * same as if you had called it on `['xay', 'xby']`. When `magicalBraces:true`
    - * is in the options, brace expansion _is_ treated as a pattern having magic.
    - */
    -export const hasMagic = (pattern, options = {}) => {
    -    if (!Array.isArray(pattern)) {
    -        pattern = [pattern];
    -    }
    -    for (const p of pattern) {
    -        if (new Minimatch(p, options).hasMagic())
    -            return true;
    -    }
    -    return false;
    -};
    -//# sourceMappingURL=has-magic.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/has-magic.js.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/has-magic.js.map
    deleted file mode 100644
    index 27fd78dbae62cf..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/has-magic.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"has-magic.js","sourceRoot":"","sources":["../../src/has-magic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAGrC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,OAA0B,EAC1B,UAAuB,EAAE,EAChB,EAAE;IACX,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,OAAO,GAAG,CAAC,OAAO,CAAC,CAAA;KACpB;IACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;QACvB,IAAI,IAAI,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE;YAAE,OAAO,IAAI,CAAA;KACtD;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA","sourcesContent":["import { Minimatch } from 'minimatch'\nimport { GlobOptions } from './glob.js'\n\n/**\n * Return true if the patterns provided contain any magic glob characters,\n * given the options provided.\n *\n * Brace expansion is not considered \"magic\" unless the `magicalBraces` option\n * is set, as brace expansion just turns one string into an array of strings.\n * So a pattern like `'x{a,b}y'` would return `false`, because `'xay'` and\n * `'xby'` both do not contain any magic glob characters, and it's treated the\n * same as if you had called it on `['xay', 'xby']`. When `magicalBraces:true`\n * is in the options, brace expansion _is_ treated as a pattern having magic.\n */\nexport const hasMagic = (\n  pattern: string | string[],\n  options: GlobOptions = {}\n): boolean => {\n  if (!Array.isArray(pattern)) {\n    pattern = [pattern]\n  }\n  for (const p of pattern) {\n    if (new Minimatch(p, options).hasMagic()) return true\n  }\n  return false\n}\n"]}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/ignore.d.ts b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/ignore.d.ts
    deleted file mode 100644
    index e9d74f3b5e1291..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/ignore.d.ts
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -import { Minimatch } from 'minimatch';
    -import { Path } from 'path-scurry';
    -import { GlobWalkerOpts } from './walker.js';
    -export interface IgnoreLike {
    -    ignored?: (p: Path) => boolean;
    -    childrenIgnored?: (p: Path) => boolean;
    -}
    -/**
    - * Class used to process ignored patterns
    - */
    -export declare class Ignore implements IgnoreLike {
    -    relative: Minimatch[];
    -    relativeChildren: Minimatch[];
    -    absolute: Minimatch[];
    -    absoluteChildren: Minimatch[];
    -    constructor(ignored: string[], { nobrace, nocase, noext, noglobstar, platform, }: GlobWalkerOpts);
    -    ignored(p: Path): boolean;
    -    childrenIgnored(p: Path): boolean;
    -}
    -//# sourceMappingURL=ignore.d.ts.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/ignore.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/ignore.d.ts.map
    deleted file mode 100644
    index e0018cf935b046..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/ignore.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"ignore.d.ts","sourceRoot":"","sources":["../../src/ignore.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,OAAO,CAAA;IAC9B,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,OAAO,CAAA;CACvC;AASD;;GAEG;AACH,qBAAa,MAAO,YAAW,UAAU;IACvC,QAAQ,EAAE,SAAS,EAAE,CAAA;IACrB,gBAAgB,EAAE,SAAS,EAAE,CAAA;IAC7B,QAAQ,EAAE,SAAS,EAAE,CAAA;IACrB,gBAAgB,EAAE,SAAS,EAAE,CAAA;gBAG3B,OAAO,EAAE,MAAM,EAAE,EACjB,EACE,OAAO,EACP,MAAM,EACN,KAAK,EACL,UAAU,EACV,QAA0B,GAC3B,EAAE,cAAc;IAiDnB,OAAO,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO;IAczB,eAAe,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO;CAWlC"}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/ignore.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/ignore.js
    deleted file mode 100644
    index 2dbaa16a11460e..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/ignore.js
    +++ /dev/null
    @@ -1,99 +0,0 @@
    -// give it a pattern, and it'll be able to tell you if
    -// a given path should be ignored.
    -// Ignoring a path ignores its children if the pattern ends in /**
    -// Ignores are always parsed in dot:true mode
    -import { Minimatch } from 'minimatch';
    -import { Pattern } from './pattern.js';
    -const defaultPlatform = typeof process === 'object' &&
    -    process &&
    -    typeof process.platform === 'string'
    -    ? process.platform
    -    : 'linux';
    -/**
    - * Class used to process ignored patterns
    - */
    -export class Ignore {
    -    relative;
    -    relativeChildren;
    -    absolute;
    -    absoluteChildren;
    -    constructor(ignored, { nobrace, nocase, noext, noglobstar, platform = defaultPlatform, }) {
    -        this.relative = [];
    -        this.absolute = [];
    -        this.relativeChildren = [];
    -        this.absoluteChildren = [];
    -        const mmopts = {
    -            dot: true,
    -            nobrace,
    -            nocase,
    -            noext,
    -            noglobstar,
    -            optimizationLevel: 2,
    -            platform,
    -            nocomment: true,
    -            nonegate: true,
    -        };
    -        // this is a little weird, but it gives us a clean set of optimized
    -        // minimatch matchers, without getting tripped up if one of them
    -        // ends in /** inside a brace section, and it's only inefficient at
    -        // the start of the walk, not along it.
    -        // It'd be nice if the Pattern class just had a .test() method, but
    -        // handling globstars is a bit of a pita, and that code already lives
    -        // in minimatch anyway.
    -        // Another way would be if maybe Minimatch could take its set/globParts
    -        // as an option, and then we could at least just use Pattern to test
    -        // for absolute-ness.
    -        // Yet another way, Minimatch could take an array of glob strings, and
    -        // a cwd option, and do the right thing.
    -        for (const ign of ignored) {
    -            const mm = new Minimatch(ign, mmopts);
    -            for (let i = 0; i < mm.set.length; i++) {
    -                const parsed = mm.set[i];
    -                const globParts = mm.globParts[i];
    -                const p = new Pattern(parsed, globParts, 0, platform);
    -                const m = new Minimatch(p.globString(), mmopts);
    -                const children = globParts[globParts.length - 1] === '**';
    -                const absolute = p.isAbsolute();
    -                if (absolute)
    -                    this.absolute.push(m);
    -                else
    -                    this.relative.push(m);
    -                if (children) {
    -                    if (absolute)
    -                        this.absoluteChildren.push(m);
    -                    else
    -                        this.relativeChildren.push(m);
    -                }
    -            }
    -        }
    -    }
    -    ignored(p) {
    -        const fullpath = p.fullpath();
    -        const fullpaths = `${fullpath}/`;
    -        const relative = p.relative() || '.';
    -        const relatives = `${relative}/`;
    -        for (const m of this.relative) {
    -            if (m.match(relative) || m.match(relatives))
    -                return true;
    -        }
    -        for (const m of this.absolute) {
    -            if (m.match(fullpath) || m.match(fullpaths))
    -                return true;
    -        }
    -        return false;
    -    }
    -    childrenIgnored(p) {
    -        const fullpath = p.fullpath() + '/';
    -        const relative = (p.relative() || '.') + '/';
    -        for (const m of this.relativeChildren) {
    -            if (m.match(relative))
    -                return true;
    -        }
    -        for (const m of this.absoluteChildren) {
    -            if (m.match(fullpath))
    -                true;
    -        }
    -        return false;
    -    }
    -}
    -//# sourceMappingURL=ignore.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/ignore.js.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/ignore.js.map
    deleted file mode 100644
    index 1038b712396eaf..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/ignore.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"ignore.js","sourceRoot":"","sources":["../../src/ignore.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,kCAAkC;AAClC,kEAAkE;AAClE,6CAA6C;AAE7C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAQtC,MAAM,eAAe,GACnB,OAAO,OAAO,KAAK,QAAQ;IAC3B,OAAO;IACP,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ;IAClC,CAAC,CAAC,OAAO,CAAC,QAAQ;IAClB,CAAC,CAAC,OAAO,CAAA;AAEb;;GAEG;AACH,MAAM,OAAO,MAAM;IACjB,QAAQ,CAAa;IACrB,gBAAgB,CAAa;IAC7B,QAAQ,CAAa;IACrB,gBAAgB,CAAa;IAE7B,YACE,OAAiB,EACjB,EACE,OAAO,EACP,MAAM,EACN,KAAK,EACL,UAAU,EACV,QAAQ,GAAG,eAAe,GACX;QAEjB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAClB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAClB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAA;QAC1B,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAA;QAC1B,MAAM,MAAM,GAAG;YACb,GAAG,EAAE,IAAI;YACT,OAAO;YACP,MAAM;YACN,KAAK;YACL,UAAU;YACV,iBAAiB,EAAE,CAAC;YACpB,QAAQ;YACR,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,IAAI;SACf,CAAA;QAED,mEAAmE;QACnE,gEAAgE;QAChE,mEAAmE;QACnE,uCAAuC;QACvC,mEAAmE;QACnE,qEAAqE;QACrE,uBAAuB;QACvB,uEAAuE;QACvE,oEAAoE;QACpE,qBAAqB;QACrB,sEAAsE;QACtE,wCAAwC;QACxC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;YACzB,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACtC,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;gBACxB,MAAM,SAAS,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;gBACjC,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAA;gBACrD,MAAM,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,CAAA;gBAC/C,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,CAAA;gBACzD,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,EAAE,CAAA;gBAC/B,IAAI,QAAQ;oBAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;;oBAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBAC1B,IAAI,QAAQ,EAAE;oBACZ,IAAI,QAAQ;wBAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;;wBACtC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;iBACnC;aACF;SACF;IACH,CAAC;IAED,OAAO,CAAC,CAAO;QACb,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC7B,MAAM,SAAS,GAAG,GAAG,QAAQ,GAAG,CAAA;QAChC,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAA;QACpC,MAAM,SAAS,GAAG,GAAG,QAAQ,GAAG,CAAA;QAChC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YAC7B,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;gBAAE,OAAO,IAAI,CAAA;SACzD;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YAC7B,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;gBAAE,OAAO,IAAI,CAAA;SACzD;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,eAAe,CAAC,CAAO;QACrB,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAA;QACnC,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,GAAG,GAAG,CAAA;QAC5C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACrC,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAAE,OAAO,IAAI,CAAA;SACnC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACrC,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAAE,IAAI,CAAA;SAC5B;QACD,OAAO,KAAK,CAAA;IACd,CAAC;CACF","sourcesContent":["// give it a pattern, and it'll be able to tell you if\n// a given path should be ignored.\n// Ignoring a path ignores its children if the pattern ends in /**\n// Ignores are always parsed in dot:true mode\n\nimport { Minimatch } from 'minimatch'\nimport { Path } from 'path-scurry'\nimport { Pattern } from './pattern.js'\nimport { GlobWalkerOpts } from './walker.js'\n\nexport interface IgnoreLike {\n  ignored?: (p: Path) => boolean\n  childrenIgnored?: (p: Path) => boolean\n}\n\nconst defaultPlatform: NodeJS.Platform =\n  typeof process === 'object' &&\n  process &&\n  typeof process.platform === 'string'\n    ? process.platform\n    : 'linux'\n\n/**\n * Class used to process ignored patterns\n */\nexport class Ignore implements IgnoreLike {\n  relative: Minimatch[]\n  relativeChildren: Minimatch[]\n  absolute: Minimatch[]\n  absoluteChildren: Minimatch[]\n\n  constructor(\n    ignored: string[],\n    {\n      nobrace,\n      nocase,\n      noext,\n      noglobstar,\n      platform = defaultPlatform,\n    }: GlobWalkerOpts\n  ) {\n    this.relative = []\n    this.absolute = []\n    this.relativeChildren = []\n    this.absoluteChildren = []\n    const mmopts = {\n      dot: true,\n      nobrace,\n      nocase,\n      noext,\n      noglobstar,\n      optimizationLevel: 2,\n      platform,\n      nocomment: true,\n      nonegate: true,\n    }\n\n    // this is a little weird, but it gives us a clean set of optimized\n    // minimatch matchers, without getting tripped up if one of them\n    // ends in /** inside a brace section, and it's only inefficient at\n    // the start of the walk, not along it.\n    // It'd be nice if the Pattern class just had a .test() method, but\n    // handling globstars is a bit of a pita, and that code already lives\n    // in minimatch anyway.\n    // Another way would be if maybe Minimatch could take its set/globParts\n    // as an option, and then we could at least just use Pattern to test\n    // for absolute-ness.\n    // Yet another way, Minimatch could take an array of glob strings, and\n    // a cwd option, and do the right thing.\n    for (const ign of ignored) {\n      const mm = new Minimatch(ign, mmopts)\n      for (let i = 0; i < mm.set.length; i++) {\n        const parsed = mm.set[i]\n        const globParts = mm.globParts[i]\n        const p = new Pattern(parsed, globParts, 0, platform)\n        const m = new Minimatch(p.globString(), mmopts)\n        const children = globParts[globParts.length - 1] === '**'\n        const absolute = p.isAbsolute()\n        if (absolute) this.absolute.push(m)\n        else this.relative.push(m)\n        if (children) {\n          if (absolute) this.absoluteChildren.push(m)\n          else this.relativeChildren.push(m)\n        }\n      }\n    }\n  }\n\n  ignored(p: Path): boolean {\n    const fullpath = p.fullpath()\n    const fullpaths = `${fullpath}/`\n    const relative = p.relative() || '.'\n    const relatives = `${relative}/`\n    for (const m of this.relative) {\n      if (m.match(relative) || m.match(relatives)) return true\n    }\n    for (const m of this.absolute) {\n      if (m.match(fullpath) || m.match(fullpaths)) return true\n    }\n    return false\n  }\n\n  childrenIgnored(p: Path): boolean {\n    const fullpath = p.fullpath() + '/'\n    const relative = (p.relative() || '.') + '/'\n    for (const m of this.relativeChildren) {\n      if (m.match(relative)) return true\n    }\n    for (const m of this.absoluteChildren) {\n      if (m.match(fullpath)) true\n    }\n    return false\n  }\n}\n"]}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/index.d.ts b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/index.d.ts
    deleted file mode 100644
    index 669bf12e6d5916..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/index.d.ts
    +++ /dev/null
    @@ -1,95 +0,0 @@
    -import { Minipass } from 'minipass';
    -import { Path } from 'path-scurry';
    -import type { GlobOptions, GlobOptionsWithFileTypesFalse, GlobOptionsWithFileTypesTrue, GlobOptionsWithFileTypesUnset } from './glob.js';
    -import { Glob } from './glob.js';
    -/**
    - * Syncronous form of {@link globStream}. Will read all the matches as fast as
    - * you consume them, even all in a single tick if you consume them immediately,
    - * but will still respond to backpressure if they're not consumed immediately.
    - */
    -export declare function globStreamSync(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Minipass;
    -export declare function globStreamSync(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Minipass;
    -export declare function globStreamSync(pattern: string | string[], options: GlobOptionsWithFileTypesUnset): Minipass;
    -export declare function globStreamSync(pattern: string | string[], options: GlobOptions): Minipass | Minipass;
    -/**
    - * Return a stream that emits all the strings or `Path` objects and
    - * then emits `end` when completed.
    - */
    -export declare function globStream(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Minipass;
    -export declare function globStream(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Minipass;
    -export declare function globStream(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): Minipass;
    -export declare function globStream(pattern: string | string[], options: GlobOptions): Minipass | Minipass;
    -/**
    - * Synchronous form of {@link glob}
    - */
    -export declare function globSync(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): string[];
    -export declare function globSync(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Path[];
    -export declare function globSync(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): string[];
    -export declare function globSync(pattern: string | string[], options: GlobOptions): Path[] | string[];
    -/**
    - * Perform an asynchronous glob search for the pattern(s) specified. Returns
    - * [Path](https://isaacs.github.io/path-scurry/classes/PathBase) objects if the
    - * {@link withFileTypes} option is set to `true`. See {@link GlobOptions} for
    - * full option descriptions.
    - */
    -declare function glob_(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): Promise;
    -declare function glob_(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Promise;
    -declare function glob_(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Promise;
    -declare function glob_(pattern: string | string[], options: GlobOptions): Promise;
    -/**
    - * Return a sync iterator for walking glob pattern matches.
    - */
    -export declare function globIterateSync(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): Generator;
    -export declare function globIterateSync(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): Generator;
    -export declare function globIterateSync(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): Generator;
    -export declare function globIterateSync(pattern: string | string[], options: GlobOptions): Generator | Generator;
    -/**
    - * Return an async iterator for walking glob pattern matches.
    - */
    -export declare function globIterate(pattern: string | string[], options?: GlobOptionsWithFileTypesUnset | undefined): AsyncGenerator;
    -export declare function globIterate(pattern: string | string[], options: GlobOptionsWithFileTypesTrue): AsyncGenerator;
    -export declare function globIterate(pattern: string | string[], options: GlobOptionsWithFileTypesFalse): AsyncGenerator;
    -export declare function globIterate(pattern: string | string[], options: GlobOptions): AsyncGenerator | AsyncGenerator;
    -export declare const streamSync: typeof globStreamSync;
    -export declare const stream: typeof globStream & {
    -    sync: typeof globStreamSync;
    -};
    -export declare const iterateSync: typeof globIterateSync;
    -export declare const iterate: typeof globIterate & {
    -    sync: typeof globIterateSync;
    -};
    -export declare const sync: typeof globSync & {
    -    stream: typeof globStreamSync;
    -    iterate: typeof globIterateSync;
    -};
    -export { escape, unescape } from 'minimatch';
    -export { Glob } from './glob.js';
    -export type { GlobOptions, GlobOptionsWithFileTypesFalse, GlobOptionsWithFileTypesTrue, GlobOptionsWithFileTypesUnset, } from './glob.js';
    -export { hasMagic } from './has-magic.js';
    -export type { IgnoreLike } from './ignore.js';
    -export type { MatchStream } from './walker.js';
    -export declare const glob: typeof glob_ & {
    -    glob: typeof glob_;
    -    globSync: typeof globSync;
    -    sync: typeof globSync & {
    -        stream: typeof globStreamSync;
    -        iterate: typeof globIterateSync;
    -    };
    -    globStream: typeof globStream;
    -    stream: typeof globStream & {
    -        sync: typeof globStreamSync;
    -    };
    -    globStreamSync: typeof globStreamSync;
    -    streamSync: typeof globStreamSync;
    -    globIterate: typeof globIterate;
    -    iterate: typeof globIterate & {
    -        sync: typeof globIterateSync;
    -    };
    -    globIterateSync: typeof globIterateSync;
    -    iterateSync: typeof globIterateSync;
    -    Glob: typeof Glob;
    -    hasMagic: (pattern: string | string[], options?: GlobOptions) => boolean;
    -    escape: (s: string, { windowsPathsNoEscape, }?: Pick | undefined) => string;
    -    unescape: (s: string, { windowsPathsNoEscape, }?: Pick | undefined) => string;
    -};
    -//# sourceMappingURL=index.d.ts.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/index.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/index.d.ts.map
    deleted file mode 100644
    index c60290eb118a91..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/index.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,KAAK,EACV,WAAW,EACX,6BAA6B,EAC7B,4BAA4B,EAC5B,6BAA6B,EAC9B,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAGhC;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AACvB,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAC3B,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAC3B,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAQlD;;;GAGG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAC3B,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AACvB,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAC3B,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAQlD;;GAEG;AACH,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,MAAM,EAAE,CAAA;AACX,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,IAAI,EAAE,CAAA;AACT,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,MAAM,EAAE,CAAA;AACX,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,IAAI,EAAE,GAAG,MAAM,EAAE,CAAA;AAQpB;;;;;GAKG;AACH,iBAAe,KAAK,CAClB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;AACpB,iBAAe,KAAK,CAClB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;AAClB,iBAAe,KAAK,CAClB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;AACpB,iBAAe,KAAK,CAClB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;AAQ7B;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAChC,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAC9B,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAChC,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAQ9D;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,6BAA6B,GAAG,SAAS,GAClD,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACrC,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,4BAA4B,GACpC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACnC,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,6BAA6B,GACrC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACrC,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,OAAO,EAAE,WAAW,GACnB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AASxE,eAAO,MAAM,UAAU,uBAAiB,CAAA;AACxC,eAAO,MAAM,MAAM;;CAAsD,CAAA;AACzE,eAAO,MAAM,WAAW,wBAAkB,CAAA;AAC1C,eAAO,MAAM,OAAO;;CAElB,CAAA;AACF,eAAO,MAAM,IAAI;;;CAGf,CAAA;AAGF,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,YAAY,EACV,WAAW,EACX,6BAA6B,EAC7B,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAG9C,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;CAgBf,CAAA"}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/index.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/index.js
    deleted file mode 100644
    index 7b270117e740ad..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/index.js
    +++ /dev/null
    @@ -1,56 +0,0 @@
    -import { escape, unescape } from 'minimatch';
    -import { Glob } from './glob.js';
    -import { hasMagic } from './has-magic.js';
    -export function globStreamSync(pattern, options = {}) {
    -    return new Glob(pattern, options).streamSync();
    -}
    -export function globStream(pattern, options = {}) {
    -    return new Glob(pattern, options).stream();
    -}
    -export function globSync(pattern, options = {}) {
    -    return new Glob(pattern, options).walkSync();
    -}
    -async function glob_(pattern, options = {}) {
    -    return new Glob(pattern, options).walk();
    -}
    -export function globIterateSync(pattern, options = {}) {
    -    return new Glob(pattern, options).iterateSync();
    -}
    -export function globIterate(pattern, options = {}) {
    -    return new Glob(pattern, options).iterate();
    -}
    -// aliases: glob.sync.stream() glob.stream.sync() glob.sync() etc
    -export const streamSync = globStreamSync;
    -export const stream = Object.assign(globStream, { sync: globStreamSync });
    -export const iterateSync = globIterateSync;
    -export const iterate = Object.assign(globIterate, {
    -    sync: globIterateSync,
    -});
    -export const sync = Object.assign(globSync, {
    -    stream: globStreamSync,
    -    iterate: globIterateSync,
    -});
    -/* c8 ignore start */
    -export { escape, unescape } from 'minimatch';
    -export { Glob } from './glob.js';
    -export { hasMagic } from './has-magic.js';
    -/* c8 ignore stop */
    -export const glob = Object.assign(glob_, {
    -    glob: glob_,
    -    globSync,
    -    sync,
    -    globStream,
    -    stream,
    -    globStreamSync,
    -    streamSync,
    -    globIterate,
    -    iterate,
    -    globIterateSync,
    -    iterateSync,
    -    Glob,
    -    hasMagic,
    -    escape,
    -    unescape,
    -});
    -glob.glob = glob;
    -//# sourceMappingURL=index.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/index.js.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/index.js.map
    deleted file mode 100644
    index 2d4fc077271b15..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/index.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAS5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAuBzC,MAAM,UAAU,cAAc,CAC5B,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,UAAU,EAAE,CAAA;AAChD,CAAC;AAsBD,MAAM,UAAU,UAAU,CACxB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,EAAE,CAAA;AAC5C,CAAC;AAqBD,MAAM,UAAU,QAAQ,CACtB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAA;AAC9C,CAAC;AAwBD,KAAK,UAAU,KAAK,CAClB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;AAC1C,CAAC;AAqBD,MAAM,UAAU,eAAe,CAC7B,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;AACjD,CAAC;AAqBD,MAAM,UAAU,WAAW,CACzB,OAA0B,EAC1B,UAAuB,EAAE;IAEzB,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,OAAO,EAAE,CAAA;AAC7C,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,MAAM,UAAU,GAAG,cAAc,CAAA;AACxC,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAA;AACzE,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAA;AAC1C,MAAM,CAAC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;IAChD,IAAI,EAAE,eAAe;CACtB,CAAC,CAAA;AACF,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;IAC1C,MAAM,EAAE,cAAc;IACtB,OAAO,EAAE,eAAe;CACzB,CAAC,CAAA;AAEF,qBAAqB;AACrB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAOhC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAGzC,oBAAoB;AAEpB,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;IACvC,IAAI,EAAE,KAAK;IACX,QAAQ;IACR,IAAI;IACJ,UAAU;IACV,MAAM;IACN,cAAc;IACd,UAAU;IACV,WAAW;IACX,OAAO;IACP,eAAe;IACf,WAAW;IACX,IAAI;IACJ,QAAQ;IACR,MAAM;IACN,QAAQ;CACT,CAAC,CAAA;AACF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA","sourcesContent":["import { escape, unescape } from 'minimatch'\nimport { Minipass } from 'minipass'\nimport { Path } from 'path-scurry'\nimport type {\n  GlobOptions,\n  GlobOptionsWithFileTypesFalse,\n  GlobOptionsWithFileTypesTrue,\n  GlobOptionsWithFileTypesUnset,\n} from './glob.js'\nimport { Glob } from './glob.js'\nimport { hasMagic } from './has-magic.js'\n\n/**\n * Syncronous form of {@link globStream}. Will read all the matches as fast as\n * you consume them, even all in a single tick if you consume them immediately,\n * but will still respond to backpressure if they're not consumed immediately.\n */\nexport function globStreamSync(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesTrue\n): Minipass\nexport function globStreamSync(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesFalse\n): Minipass\nexport function globStreamSync(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesUnset\n): Minipass\nexport function globStreamSync(\n  pattern: string | string[],\n  options: GlobOptions\n): Minipass | Minipass\nexport function globStreamSync(\n  pattern: string | string[],\n  options: GlobOptions = {}\n) {\n  return new Glob(pattern, options).streamSync()\n}\n\n/**\n * Return a stream that emits all the strings or `Path` objects and\n * then emits `end` when completed.\n */\nexport function globStream(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesFalse\n): Minipass\nexport function globStream(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesTrue\n): Minipass\nexport function globStream(\n  pattern: string | string[],\n  options?: GlobOptionsWithFileTypesUnset | undefined\n): Minipass\nexport function globStream(\n  pattern: string | string[],\n  options: GlobOptions\n): Minipass | Minipass\nexport function globStream(\n  pattern: string | string[],\n  options: GlobOptions = {}\n) {\n  return new Glob(pattern, options).stream()\n}\n\n/**\n * Synchronous form of {@link glob}\n */\nexport function globSync(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesFalse\n): string[]\nexport function globSync(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesTrue\n): Path[]\nexport function globSync(\n  pattern: string | string[],\n  options?: GlobOptionsWithFileTypesUnset | undefined\n): string[]\nexport function globSync(\n  pattern: string | string[],\n  options: GlobOptions\n): Path[] | string[]\nexport function globSync(\n  pattern: string | string[],\n  options: GlobOptions = {}\n) {\n  return new Glob(pattern, options).walkSync()\n}\n\n/**\n * Perform an asynchronous glob search for the pattern(s) specified. Returns\n * [Path](https://isaacs.github.io/path-scurry/classes/PathBase) objects if the\n * {@link withFileTypes} option is set to `true`. See {@link GlobOptions} for\n * full option descriptions.\n */\nasync function glob_(\n  pattern: string | string[],\n  options?: GlobOptionsWithFileTypesUnset | undefined\n): Promise\nasync function glob_(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesTrue\n): Promise\nasync function glob_(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesFalse\n): Promise\nasync function glob_(\n  pattern: string | string[],\n  options: GlobOptions\n): Promise\nasync function glob_(\n  pattern: string | string[],\n  options: GlobOptions = {}\n) {\n  return new Glob(pattern, options).walk()\n}\n\n/**\n * Return a sync iterator for walking glob pattern matches.\n */\nexport function globIterateSync(\n  pattern: string | string[],\n  options?: GlobOptionsWithFileTypesUnset | undefined\n): Generator\nexport function globIterateSync(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesTrue\n): Generator\nexport function globIterateSync(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesFalse\n): Generator\nexport function globIterateSync(\n  pattern: string | string[],\n  options: GlobOptions\n): Generator | Generator\nexport function globIterateSync(\n  pattern: string | string[],\n  options: GlobOptions = {}\n) {\n  return new Glob(pattern, options).iterateSync()\n}\n\n/**\n * Return an async iterator for walking glob pattern matches.\n */\nexport function globIterate(\n  pattern: string | string[],\n  options?: GlobOptionsWithFileTypesUnset | undefined\n): AsyncGenerator\nexport function globIterate(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesTrue\n): AsyncGenerator\nexport function globIterate(\n  pattern: string | string[],\n  options: GlobOptionsWithFileTypesFalse\n): AsyncGenerator\nexport function globIterate(\n  pattern: string | string[],\n  options: GlobOptions\n): AsyncGenerator | AsyncGenerator\nexport function globIterate(\n  pattern: string | string[],\n  options: GlobOptions = {}\n) {\n  return new Glob(pattern, options).iterate()\n}\n\n// aliases: glob.sync.stream() glob.stream.sync() glob.sync() etc\nexport const streamSync = globStreamSync\nexport const stream = Object.assign(globStream, { sync: globStreamSync })\nexport const iterateSync = globIterateSync\nexport const iterate = Object.assign(globIterate, {\n  sync: globIterateSync,\n})\nexport const sync = Object.assign(globSync, {\n  stream: globStreamSync,\n  iterate: globIterateSync,\n})\n\n/* c8 ignore start */\nexport { escape, unescape } from 'minimatch'\nexport { Glob } from './glob.js'\nexport type {\n  GlobOptions,\n  GlobOptionsWithFileTypesFalse,\n  GlobOptionsWithFileTypesTrue,\n  GlobOptionsWithFileTypesUnset,\n} from './glob.js'\nexport { hasMagic } from './has-magic.js'\nexport type { IgnoreLike } from './ignore.js'\nexport type { MatchStream } from './walker.js'\n/* c8 ignore stop */\n\nexport const glob = Object.assign(glob_, {\n  glob: glob_,\n  globSync,\n  sync,\n  globStream,\n  stream,\n  globStreamSync,\n  streamSync,\n  globIterate,\n  iterate,\n  globIterateSync,\n  iterateSync,\n  Glob,\n  hasMagic,\n  escape,\n  unescape,\n})\nglob.glob = glob\n"]}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/package.json b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/package.json
    deleted file mode 100644
    index 5cc80943d565b7..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/package.json
    +++ /dev/null
    @@ -1,4 +0,0 @@
    -{
    -  "version": "10.3.3",
    -  "type": "module"
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/pattern.d.ts b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/pattern.d.ts
    deleted file mode 100644
    index 109cc4e7a5dae3..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/pattern.d.ts
    +++ /dev/null
    @@ -1,77 +0,0 @@
    -/// 
    -import { GLOBSTAR } from 'minimatch';
    -export type MMPattern = string | RegExp | typeof GLOBSTAR;
    -export type PatternList = [p: MMPattern, ...rest: MMPattern[]];
    -export type UNCPatternList = [
    -    p0: '',
    -    p1: '',
    -    p2: string,
    -    p3: string,
    -    ...rest: MMPattern[]
    -];
    -export type DrivePatternList = [p0: string, ...rest: MMPattern[]];
    -export type AbsolutePatternList = [p0: '', ...rest: MMPattern[]];
    -export type GlobList = [p: string, ...rest: string[]];
    -/**
    - * An immutable-ish view on an array of glob parts and their parsed
    - * results
    - */
    -export declare class Pattern {
    -    #private;
    -    readonly length: number;
    -    constructor(patternList: MMPattern[], globList: string[], index: number, platform: NodeJS.Platform);
    -    /**
    -     * The first entry in the parsed list of patterns
    -     */
    -    pattern(): MMPattern;
    -    /**
    -     * true of if pattern() returns a string
    -     */
    -    isString(): boolean;
    -    /**
    -     * true of if pattern() returns GLOBSTAR
    -     */
    -    isGlobstar(): boolean;
    -    /**
    -     * true if pattern() returns a regexp
    -     */
    -    isRegExp(): boolean;
    -    /**
    -     * The /-joined set of glob parts that make up this pattern
    -     */
    -    globString(): string;
    -    /**
    -     * true if there are more pattern parts after this one
    -     */
    -    hasMore(): boolean;
    -    /**
    -     * The rest of the pattern after this part, or null if this is the end
    -     */
    -    rest(): Pattern | null;
    -    /**
    -     * true if the pattern represents a //unc/path/ on windows
    -     */
    -    isUNC(): boolean;
    -    /**
    -     * True if the pattern starts with a drive letter on Windows
    -     */
    -    isDrive(): boolean;
    -    /**
    -     * True if the pattern is rooted on an absolute path
    -     */
    -    isAbsolute(): boolean;
    -    /**
    -     * consume the root of the pattern, and return it
    -     */
    -    root(): string;
    -    /**
    -     * Check to see if the current globstar pattern is allowed to follow
    -     * a symbolic link.
    -     */
    -    checkFollowGlobstar(): boolean;
    -    /**
    -     * Mark that the current globstar pattern is following a symbolic link
    -     */
    -    markFollowGlobstar(): boolean;
    -}
    -//# sourceMappingURL=pattern.d.ts.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/pattern.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/pattern.d.ts.map
    deleted file mode 100644
    index 1430a77dadbbe4..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/pattern.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"pattern.d.ts","sourceRoot":"","sources":["../../src/pattern.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,QAAQ,CAAA;AAGzD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;AAC9D,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,MAAM;IACV,GAAG,IAAI,EAAE,SAAS,EAAE;CACrB,CAAA;AACD,MAAM,MAAM,gBAAgB,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;AACjE,MAAM,MAAM,mBAAmB,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;AAChE,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;AAMrD;;;GAGG;AACH,qBAAa,OAAO;;IAIlB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;gBAUrB,WAAW,EAAE,SAAS,EAAE,EACxB,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,CAAC,QAAQ;IA6D3B;;OAEG;IACH,OAAO,IAAI,SAAS;IAIpB;;OAEG;IACH,QAAQ,IAAI,OAAO;IAGnB;;OAEG;IACH,UAAU,IAAI,OAAO;IAGrB;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACH,UAAU,IAAI,MAAM;IAUpB;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,IAAI,IAAI,OAAO,GAAG,IAAI;IAetB;;OAEG;IACH,KAAK,IAAI,OAAO;IAoBhB;;OAEG;IACH,OAAO,IAAI,OAAO;IAelB;;OAEG;IACH,UAAU,IAAI,OAAO;IAUrB;;OAEG;IACH,IAAI,IAAI,MAAM;IAOd;;;OAGG;IACH,mBAAmB,IAAI,OAAO;IAQ9B;;OAEG;IACH,kBAAkB,IAAI,OAAO;CAM9B"}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/pattern.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/pattern.js
    deleted file mode 100644
    index 60aa415d92fd12..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/pattern.js
    +++ /dev/null
    @@ -1,215 +0,0 @@
    -// this is just a very light wrapper around 2 arrays with an offset index
    -import { GLOBSTAR } from 'minimatch';
    -const isPatternList = (pl) => pl.length >= 1;
    -const isGlobList = (gl) => gl.length >= 1;
    -/**
    - * An immutable-ish view on an array of glob parts and their parsed
    - * results
    - */
    -export class Pattern {
    -    #patternList;
    -    #globList;
    -    #index;
    -    length;
    -    #platform;
    -    #rest;
    -    #globString;
    -    #isDrive;
    -    #isUNC;
    -    #isAbsolute;
    -    #followGlobstar = true;
    -    constructor(patternList, globList, index, platform) {
    -        if (!isPatternList(patternList)) {
    -            throw new TypeError('empty pattern list');
    -        }
    -        if (!isGlobList(globList)) {
    -            throw new TypeError('empty glob list');
    -        }
    -        if (globList.length !== patternList.length) {
    -            throw new TypeError('mismatched pattern list and glob list lengths');
    -        }
    -        this.length = patternList.length;
    -        if (index < 0 || index >= this.length) {
    -            throw new TypeError('index out of range');
    -        }
    -        this.#patternList = patternList;
    -        this.#globList = globList;
    -        this.#index = index;
    -        this.#platform = platform;
    -        // normalize root entries of absolute patterns on initial creation.
    -        if (this.#index === 0) {
    -            // c: => ['c:/']
    -            // C:/ => ['C:/']
    -            // C:/x => ['C:/', 'x']
    -            // //host/share => ['//host/share/']
    -            // //host/share/ => ['//host/share/']
    -            // //host/share/x => ['//host/share/', 'x']
    -            // /etc => ['/', 'etc']
    -            // / => ['/']
    -            if (this.isUNC()) {
    -                // '' / '' / 'host' / 'share'
    -                const [p0, p1, p2, p3, ...prest] = this.#patternList;
    -                const [g0, g1, g2, g3, ...grest] = this.#globList;
    -                if (prest[0] === '') {
    -                    // ends in /
    -                    prest.shift();
    -                    grest.shift();
    -                }
    -                const p = [p0, p1, p2, p3, ''].join('/');
    -                const g = [g0, g1, g2, g3, ''].join('/');
    -                this.#patternList = [p, ...prest];
    -                this.#globList = [g, ...grest];
    -                this.length = this.#patternList.length;
    -            }
    -            else if (this.isDrive() || this.isAbsolute()) {
    -                const [p1, ...prest] = this.#patternList;
    -                const [g1, ...grest] = this.#globList;
    -                if (prest[0] === '') {
    -                    // ends in /
    -                    prest.shift();
    -                    grest.shift();
    -                }
    -                const p = p1 + '/';
    -                const g = g1 + '/';
    -                this.#patternList = [p, ...prest];
    -                this.#globList = [g, ...grest];
    -                this.length = this.#patternList.length;
    -            }
    -        }
    -    }
    -    /**
    -     * The first entry in the parsed list of patterns
    -     */
    -    pattern() {
    -        return this.#patternList[this.#index];
    -    }
    -    /**
    -     * true of if pattern() returns a string
    -     */
    -    isString() {
    -        return typeof this.#patternList[this.#index] === 'string';
    -    }
    -    /**
    -     * true of if pattern() returns GLOBSTAR
    -     */
    -    isGlobstar() {
    -        return this.#patternList[this.#index] === GLOBSTAR;
    -    }
    -    /**
    -     * true if pattern() returns a regexp
    -     */
    -    isRegExp() {
    -        return this.#patternList[this.#index] instanceof RegExp;
    -    }
    -    /**
    -     * The /-joined set of glob parts that make up this pattern
    -     */
    -    globString() {
    -        return (this.#globString =
    -            this.#globString ||
    -                (this.#index === 0
    -                    ? this.isAbsolute()
    -                        ? this.#globList[0] + this.#globList.slice(1).join('/')
    -                        : this.#globList.join('/')
    -                    : this.#globList.slice(this.#index).join('/')));
    -    }
    -    /**
    -     * true if there are more pattern parts after this one
    -     */
    -    hasMore() {
    -        return this.length > this.#index + 1;
    -    }
    -    /**
    -     * The rest of the pattern after this part, or null if this is the end
    -     */
    -    rest() {
    -        if (this.#rest !== undefined)
    -            return this.#rest;
    -        if (!this.hasMore())
    -            return (this.#rest = null);
    -        this.#rest = new Pattern(this.#patternList, this.#globList, this.#index + 1, this.#platform);
    -        this.#rest.#isAbsolute = this.#isAbsolute;
    -        this.#rest.#isUNC = this.#isUNC;
    -        this.#rest.#isDrive = this.#isDrive;
    -        return this.#rest;
    -    }
    -    /**
    -     * true if the pattern represents a //unc/path/ on windows
    -     */
    -    isUNC() {
    -        const pl = this.#patternList;
    -        return this.#isUNC !== undefined
    -            ? this.#isUNC
    -            : (this.#isUNC =
    -                this.#platform === 'win32' &&
    -                    this.#index === 0 &&
    -                    pl[0] === '' &&
    -                    pl[1] === '' &&
    -                    typeof pl[2] === 'string' &&
    -                    !!pl[2] &&
    -                    typeof pl[3] === 'string' &&
    -                    !!pl[3]);
    -    }
    -    // pattern like C:/...
    -    // split = ['C:', ...]
    -    // XXX: would be nice to handle patterns like `c:*` to test the cwd
    -    // in c: for *, but I don't know of a way to even figure out what that
    -    // cwd is without actually chdir'ing into it?
    -    /**
    -     * True if the pattern starts with a drive letter on Windows
    -     */
    -    isDrive() {
    -        const pl = this.#patternList;
    -        return this.#isDrive !== undefined
    -            ? this.#isDrive
    -            : (this.#isDrive =
    -                this.#platform === 'win32' &&
    -                    this.#index === 0 &&
    -                    this.length > 1 &&
    -                    typeof pl[0] === 'string' &&
    -                    /^[a-z]:$/i.test(pl[0]));
    -    }
    -    // pattern = '/' or '/...' or '/x/...'
    -    // split = ['', ''] or ['', ...] or ['', 'x', ...]
    -    // Drive and UNC both considered absolute on windows
    -    /**
    -     * True if the pattern is rooted on an absolute path
    -     */
    -    isAbsolute() {
    -        const pl = this.#patternList;
    -        return this.#isAbsolute !== undefined
    -            ? this.#isAbsolute
    -            : (this.#isAbsolute =
    -                (pl[0] === '' && pl.length > 1) ||
    -                    this.isDrive() ||
    -                    this.isUNC());
    -    }
    -    /**
    -     * consume the root of the pattern, and return it
    -     */
    -    root() {
    -        const p = this.#patternList[0];
    -        return typeof p === 'string' && this.isAbsolute() && this.#index === 0
    -            ? p
    -            : '';
    -    }
    -    /**
    -     * Check to see if the current globstar pattern is allowed to follow
    -     * a symbolic link.
    -     */
    -    checkFollowGlobstar() {
    -        return !(this.#index === 0 ||
    -            !this.isGlobstar() ||
    -            !this.#followGlobstar);
    -    }
    -    /**
    -     * Mark that the current globstar pattern is following a symbolic link
    -     */
    -    markFollowGlobstar() {
    -        if (this.#index === 0 || !this.isGlobstar() || !this.#followGlobstar)
    -            return false;
    -        this.#followGlobstar = false;
    -        return true;
    -    }
    -}
    -//# sourceMappingURL=pattern.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/pattern.js.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/pattern.js.map
    deleted file mode 100644
    index bb039c142107fc..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/pattern.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"pattern.js","sourceRoot":"","sources":["../../src/pattern.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAgBpC,MAAM,aAAa,GAAG,CAAC,EAAe,EAAqB,EAAE,CAC3D,EAAE,CAAC,MAAM,IAAI,CAAC,CAAA;AAChB,MAAM,UAAU,GAAG,CAAC,EAAY,EAAkB,EAAE,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,CAAA;AAEnE;;;GAGG;AACH,MAAM,OAAO,OAAO;IACT,YAAY,CAAa;IACzB,SAAS,CAAU;IACnB,MAAM,CAAQ;IACd,MAAM,CAAQ;IACd,SAAS,CAAiB;IACnC,KAAK,CAAiB;IACtB,WAAW,CAAS;IACpB,QAAQ,CAAU;IAClB,MAAM,CAAU;IAChB,WAAW,CAAU;IACrB,eAAe,GAAY,IAAI,CAAA;IAE/B,YACE,WAAwB,EACxB,QAAkB,EAClB,KAAa,EACb,QAAyB;QAEzB,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE;YAC/B,MAAM,IAAI,SAAS,CAAC,oBAAoB,CAAC,CAAA;SAC1C;QACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;YACzB,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;SACvC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,EAAE;YAC1C,MAAM,IAAI,SAAS,CAAC,+CAA+C,CAAC,CAAA;SACrE;QACD,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAA;QAChC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE;YACrC,MAAM,IAAI,SAAS,CAAC,oBAAoB,CAAC,CAAA;SAC1C;QACD,IAAI,CAAC,YAAY,GAAG,WAAW,CAAA;QAC/B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QACzB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QAEzB,mEAAmE;QACnE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YACrB,gBAAgB;YAChB,iBAAiB;YACjB,uBAAuB;YACvB,oCAAoC;YACpC,qCAAqC;YACrC,2CAA2C;YAC3C,uBAAuB;YACvB,aAAa;YACb,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE;gBAChB,6BAA6B;gBAC7B,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,YAAY,CAAA;gBACpD,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAA;gBACjD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE;oBACnB,YAAY;oBACZ,KAAK,CAAC,KAAK,EAAE,CAAA;oBACb,KAAK,CAAC,KAAK,EAAE,CAAA;iBACd;gBACD,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACxC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACxC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAA;gBACjC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAA;gBAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAA;aACvC;iBAAM,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;gBAC9C,MAAM,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,YAAY,CAAA;gBACxC,MAAM,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAA;gBACrC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE;oBACnB,YAAY;oBACZ,KAAK,CAAC,KAAK,EAAE,CAAA;oBACb,KAAK,CAAC,KAAK,EAAE,CAAA;iBACd;gBACD,MAAM,CAAC,GAAI,EAAa,GAAG,GAAG,CAAA;gBAC9B,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,CAAA;gBAClB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAA;gBACjC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAA;gBAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAA;aACvC;SACF;IACH,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACvC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAA;IAC3D,CAAC;IACD;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAA;IACpD,CAAC;IACD;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,MAAM,CAAA;IACzD,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,CAAC,IAAI,CAAC,WAAW;YACtB,IAAI,CAAC,WAAW;gBAChB,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;oBAChB,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE;wBACjB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;wBACvD,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;oBAC5B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACrD,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,KAAK,CAAA;QAC/C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAA;QAC/C,IAAI,CAAC,KAAK,GAAG,IAAI,OAAO,CACtB,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,MAAM,GAAG,CAAC,EACf,IAAI,CAAC,SAAS,CACf,CAAA;QACD,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;QACzC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAC/B,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QACnC,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAA;QAC5B,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS;YAC9B,CAAC,CAAC,IAAI,CAAC,MAAM;YACb,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM;gBACV,IAAI,CAAC,SAAS,KAAK,OAAO;oBAC1B,IAAI,CAAC,MAAM,KAAK,CAAC;oBACjB,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE;oBACZ,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE;oBACZ,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,QAAQ;oBACzB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBACP,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,QAAQ;oBACzB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IAED,sBAAsB;IACtB,sBAAsB;IACtB,mEAAmE;IACnE,sEAAsE;IACtE,6CAA6C;IAC7C;;OAEG;IACH,OAAO;QACL,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAA;QAC5B,OAAO,IAAI,CAAC,QAAQ,KAAK,SAAS;YAChC,CAAC,CAAC,IAAI,CAAC,QAAQ;YACf,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ;gBACZ,IAAI,CAAC,SAAS,KAAK,OAAO;oBAC1B,IAAI,CAAC,MAAM,KAAK,CAAC;oBACjB,IAAI,CAAC,MAAM,GAAG,CAAC;oBACf,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,QAAQ;oBACzB,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAChC,CAAC;IAED,sCAAsC;IACtC,kDAAkD;IAClD,oDAAoD;IACpD;;OAEG;IACH,UAAU;QACR,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAA;QAC5B,OAAO,IAAI,CAAC,WAAW,KAAK,SAAS;YACnC,CAAC,CAAC,IAAI,CAAC,WAAW;YAClB,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW;gBACf,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;oBAC/B,IAAI,CAAC,OAAO,EAAE;oBACd,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;IACrB,CAAC;IAED;;OAEG;IACH,IAAI;QACF,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC9B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YACpE,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,EAAE,CAAA;IACR,CAAC;IAED;;;OAGG;IACH,mBAAmB;QACjB,OAAO,CAAC,CACN,IAAI,CAAC,MAAM,KAAK,CAAC;YACjB,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,CAAC,IAAI,CAAC,eAAe,CACtB,CAAA;IACH,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe;YAClE,OAAO,KAAK,CAAA;QACd,IAAI,CAAC,eAAe,GAAG,KAAK,CAAA;QAC5B,OAAO,IAAI,CAAA;IACb,CAAC;CACF","sourcesContent":["// this is just a very light wrapper around 2 arrays with an offset index\n\nimport { GLOBSTAR } from 'minimatch'\nexport type MMPattern = string | RegExp | typeof GLOBSTAR\n\n// an array of length >= 1\nexport type PatternList = [p: MMPattern, ...rest: MMPattern[]]\nexport type UNCPatternList = [\n  p0: '',\n  p1: '',\n  p2: string,\n  p3: string,\n  ...rest: MMPattern[]\n]\nexport type DrivePatternList = [p0: string, ...rest: MMPattern[]]\nexport type AbsolutePatternList = [p0: '', ...rest: MMPattern[]]\nexport type GlobList = [p: string, ...rest: string[]]\n\nconst isPatternList = (pl: MMPattern[]): pl is PatternList =>\n  pl.length >= 1\nconst isGlobList = (gl: string[]): gl is GlobList => gl.length >= 1\n\n/**\n * An immutable-ish view on an array of glob parts and their parsed\n * results\n */\nexport class Pattern {\n  readonly #patternList: PatternList\n  readonly #globList: GlobList\n  readonly #index: number\n  readonly length: number\n  readonly #platform: NodeJS.Platform\n  #rest?: Pattern | null\n  #globString?: string\n  #isDrive?: boolean\n  #isUNC?: boolean\n  #isAbsolute?: boolean\n  #followGlobstar: boolean = true\n\n  constructor(\n    patternList: MMPattern[],\n    globList: string[],\n    index: number,\n    platform: NodeJS.Platform\n  ) {\n    if (!isPatternList(patternList)) {\n      throw new TypeError('empty pattern list')\n    }\n    if (!isGlobList(globList)) {\n      throw new TypeError('empty glob list')\n    }\n    if (globList.length !== patternList.length) {\n      throw new TypeError('mismatched pattern list and glob list lengths')\n    }\n    this.length = patternList.length\n    if (index < 0 || index >= this.length) {\n      throw new TypeError('index out of range')\n    }\n    this.#patternList = patternList\n    this.#globList = globList\n    this.#index = index\n    this.#platform = platform\n\n    // normalize root entries of absolute patterns on initial creation.\n    if (this.#index === 0) {\n      // c: => ['c:/']\n      // C:/ => ['C:/']\n      // C:/x => ['C:/', 'x']\n      // //host/share => ['//host/share/']\n      // //host/share/ => ['//host/share/']\n      // //host/share/x => ['//host/share/', 'x']\n      // /etc => ['/', 'etc']\n      // / => ['/']\n      if (this.isUNC()) {\n        // '' / '' / 'host' / 'share'\n        const [p0, p1, p2, p3, ...prest] = this.#patternList\n        const [g0, g1, g2, g3, ...grest] = this.#globList\n        if (prest[0] === '') {\n          // ends in /\n          prest.shift()\n          grest.shift()\n        }\n        const p = [p0, p1, p2, p3, ''].join('/')\n        const g = [g0, g1, g2, g3, ''].join('/')\n        this.#patternList = [p, ...prest]\n        this.#globList = [g, ...grest]\n        this.length = this.#patternList.length\n      } else if (this.isDrive() || this.isAbsolute()) {\n        const [p1, ...prest] = this.#patternList\n        const [g1, ...grest] = this.#globList\n        if (prest[0] === '') {\n          // ends in /\n          prest.shift()\n          grest.shift()\n        }\n        const p = (p1 as string) + '/'\n        const g = g1 + '/'\n        this.#patternList = [p, ...prest]\n        this.#globList = [g, ...grest]\n        this.length = this.#patternList.length\n      }\n    }\n  }\n\n  /**\n   * The first entry in the parsed list of patterns\n   */\n  pattern(): MMPattern {\n    return this.#patternList[this.#index]\n  }\n\n  /**\n   * true of if pattern() returns a string\n   */\n  isString(): boolean {\n    return typeof this.#patternList[this.#index] === 'string'\n  }\n  /**\n   * true of if pattern() returns GLOBSTAR\n   */\n  isGlobstar(): boolean {\n    return this.#patternList[this.#index] === GLOBSTAR\n  }\n  /**\n   * true if pattern() returns a regexp\n   */\n  isRegExp(): boolean {\n    return this.#patternList[this.#index] instanceof RegExp\n  }\n\n  /**\n   * The /-joined set of glob parts that make up this pattern\n   */\n  globString(): string {\n    return (this.#globString =\n      this.#globString ||\n      (this.#index === 0\n        ? this.isAbsolute()\n          ? this.#globList[0] + this.#globList.slice(1).join('/')\n          : this.#globList.join('/')\n        : this.#globList.slice(this.#index).join('/')))\n  }\n\n  /**\n   * true if there are more pattern parts after this one\n   */\n  hasMore(): boolean {\n    return this.length > this.#index + 1\n  }\n\n  /**\n   * The rest of the pattern after this part, or null if this is the end\n   */\n  rest(): Pattern | null {\n    if (this.#rest !== undefined) return this.#rest\n    if (!this.hasMore()) return (this.#rest = null)\n    this.#rest = new Pattern(\n      this.#patternList,\n      this.#globList,\n      this.#index + 1,\n      this.#platform\n    )\n    this.#rest.#isAbsolute = this.#isAbsolute\n    this.#rest.#isUNC = this.#isUNC\n    this.#rest.#isDrive = this.#isDrive\n    return this.#rest\n  }\n\n  /**\n   * true if the pattern represents a //unc/path/ on windows\n   */\n  isUNC(): boolean {\n    const pl = this.#patternList\n    return this.#isUNC !== undefined\n      ? this.#isUNC\n      : (this.#isUNC =\n          this.#platform === 'win32' &&\n          this.#index === 0 &&\n          pl[0] === '' &&\n          pl[1] === '' &&\n          typeof pl[2] === 'string' &&\n          !!pl[2] &&\n          typeof pl[3] === 'string' &&\n          !!pl[3])\n  }\n\n  // pattern like C:/...\n  // split = ['C:', ...]\n  // XXX: would be nice to handle patterns like `c:*` to test the cwd\n  // in c: for *, but I don't know of a way to even figure out what that\n  // cwd is without actually chdir'ing into it?\n  /**\n   * True if the pattern starts with a drive letter on Windows\n   */\n  isDrive(): boolean {\n    const pl = this.#patternList\n    return this.#isDrive !== undefined\n      ? this.#isDrive\n      : (this.#isDrive =\n          this.#platform === 'win32' &&\n          this.#index === 0 &&\n          this.length > 1 &&\n          typeof pl[0] === 'string' &&\n          /^[a-z]:$/i.test(pl[0]))\n  }\n\n  // pattern = '/' or '/...' or '/x/...'\n  // split = ['', ''] or ['', ...] or ['', 'x', ...]\n  // Drive and UNC both considered absolute on windows\n  /**\n   * True if the pattern is rooted on an absolute path\n   */\n  isAbsolute(): boolean {\n    const pl = this.#patternList\n    return this.#isAbsolute !== undefined\n      ? this.#isAbsolute\n      : (this.#isAbsolute =\n          (pl[0] === '' && pl.length > 1) ||\n          this.isDrive() ||\n          this.isUNC())\n  }\n\n  /**\n   * consume the root of the pattern, and return it\n   */\n  root(): string {\n    const p = this.#patternList[0]\n    return typeof p === 'string' && this.isAbsolute() && this.#index === 0\n      ? p\n      : ''\n  }\n\n  /**\n   * Check to see if the current globstar pattern is allowed to follow\n   * a symbolic link.\n   */\n  checkFollowGlobstar(): boolean {\n    return !(\n      this.#index === 0 ||\n      !this.isGlobstar() ||\n      !this.#followGlobstar\n    )\n  }\n\n  /**\n   * Mark that the current globstar pattern is following a symbolic link\n   */\n  markFollowGlobstar(): boolean {\n    if (this.#index === 0 || !this.isGlobstar() || !this.#followGlobstar)\n      return false\n    this.#followGlobstar = false\n    return true\n  }\n}\n"]}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/processor.d.ts b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/processor.d.ts
    deleted file mode 100644
    index ccedfbf2820f7d..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/processor.d.ts
    +++ /dev/null
    @@ -1,59 +0,0 @@
    -import { MMRegExp } from 'minimatch';
    -import { Path } from 'path-scurry';
    -import { Pattern } from './pattern.js';
    -import { GlobWalkerOpts } from './walker.js';
    -/**
    - * A cache of which patterns have been processed for a given Path
    - */
    -export declare class HasWalkedCache {
    -    store: Map>;
    -    constructor(store?: Map>);
    -    copy(): HasWalkedCache;
    -    hasWalked(target: Path, pattern: Pattern): boolean | undefined;
    -    storeWalked(target: Path, pattern: Pattern): void;
    -}
    -/**
    - * A record of which paths have been matched in a given walk step,
    - * and whether they only are considered a match if they are a directory,
    - * and whether their absolute or relative path should be returned.
    - */
    -export declare class MatchRecord {
    -    store: Map;
    -    add(target: Path, absolute: boolean, ifDir: boolean): void;
    -    entries(): [Path, boolean, boolean][];
    -}
    -/**
    - * A collection of patterns that must be processed in a subsequent step
    - * for a given path.
    - */
    -export declare class SubWalks {
    -    store: Map;
    -    add(target: Path, pattern: Pattern): void;
    -    get(target: Path): Pattern[];
    -    entries(): [Path, Pattern[]][];
    -    keys(): Path[];
    -}
    -/**
    - * The class that processes patterns for a given path.
    - *
    - * Handles child entry filtering, and determining whether a path's
    - * directory contents must be read.
    - */
    -export declare class Processor {
    -    hasWalkedCache: HasWalkedCache;
    -    matches: MatchRecord;
    -    subwalks: SubWalks;
    -    patterns?: Pattern[];
    -    follow: boolean;
    -    dot: boolean;
    -    opts: GlobWalkerOpts;
    -    constructor(opts: GlobWalkerOpts, hasWalkedCache?: HasWalkedCache);
    -    processPatterns(target: Path, patterns: Pattern[]): this;
    -    subwalkTargets(): Path[];
    -    child(): Processor;
    -    filterEntries(parent: Path, entries: Path[]): Processor;
    -    testGlobstar(e: Path, pattern: Pattern, rest: Pattern | null, absolute: boolean): void;
    -    testRegExp(e: Path, p: MMRegExp, rest: Pattern | null, absolute: boolean): void;
    -    testString(e: Path, p: string, rest: Pattern | null, absolute: boolean): void;
    -}
    -//# sourceMappingURL=processor.d.ts.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/processor.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/processor.d.ts.map
    deleted file mode 100644
    index 75d92efe28cb1d..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/processor.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../../src/processor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAY,QAAQ,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAa,OAAO,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C;;GAEG;AACH,qBAAa,cAAc;IACzB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;gBACnB,KAAK,GAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAGvD,IAAI;IAGJ,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO;IAGxC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO;CAM3C;AAED;;;;GAIG;AACH,qBAAa,WAAW;IACtB,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAY;IACpC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;IAMnD,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE;CAOtC;AAED;;;GAGG;AACH,qBAAa,QAAQ;IACnB,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAY;IACvC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO;IAWlC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,EAAE;IAS5B,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE;IAG9B,IAAI,IAAI,IAAI,EAAE;CAGf;AAED;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,cAAc,EAAE,cAAc,CAAA;IAC9B,OAAO,cAAoB;IAC3B,QAAQ,WAAiB;IACzB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;IACpB,MAAM,EAAE,OAAO,CAAA;IACf,GAAG,EAAE,OAAO,CAAA;IACZ,IAAI,EAAE,cAAc,CAAA;gBAER,IAAI,EAAE,cAAc,EAAE,cAAc,CAAC,EAAE,cAAc;IASjE,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE;IAwGjD,cAAc,IAAI,IAAI,EAAE;IAIxB,KAAK;IAQL,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,SAAS;IAqBvD,YAAY,CACV,CAAC,EAAE,IAAI,EACP,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,OAAO,GAAG,IAAI,EACpB,QAAQ,EAAE,OAAO;IA8CnB,UAAU,CACR,CAAC,EAAE,IAAI,EACP,CAAC,EAAE,QAAQ,EACX,IAAI,EAAE,OAAO,GAAG,IAAI,EACpB,QAAQ,EAAE,OAAO;IAUnB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO;CASvE"}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/processor.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/processor.js
    deleted file mode 100644
    index dd2228ad6761a5..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/processor.js
    +++ /dev/null
    @@ -1,302 +0,0 @@
    -// synchronous utility for filtering entries and calculating subwalks
    -import { GLOBSTAR } from 'minimatch';
    -/**
    - * A cache of which patterns have been processed for a given Path
    - */
    -export class HasWalkedCache {
    -    store;
    -    constructor(store = new Map()) {
    -        this.store = store;
    -    }
    -    copy() {
    -        return new HasWalkedCache(new Map(this.store));
    -    }
    -    hasWalked(target, pattern) {
    -        return this.store.get(target.fullpath())?.has(pattern.globString());
    -    }
    -    storeWalked(target, pattern) {
    -        const fullpath = target.fullpath();
    -        const cached = this.store.get(fullpath);
    -        if (cached)
    -            cached.add(pattern.globString());
    -        else
    -            this.store.set(fullpath, new Set([pattern.globString()]));
    -    }
    -}
    -/**
    - * A record of which paths have been matched in a given walk step,
    - * and whether they only are considered a match if they are a directory,
    - * and whether their absolute or relative path should be returned.
    - */
    -export class MatchRecord {
    -    store = new Map();
    -    add(target, absolute, ifDir) {
    -        const n = (absolute ? 2 : 0) | (ifDir ? 1 : 0);
    -        const current = this.store.get(target);
    -        this.store.set(target, current === undefined ? n : n & current);
    -    }
    -    // match, absolute, ifdir
    -    entries() {
    -        return [...this.store.entries()].map(([path, n]) => [
    -            path,
    -            !!(n & 2),
    -            !!(n & 1),
    -        ]);
    -    }
    -}
    -/**
    - * A collection of patterns that must be processed in a subsequent step
    - * for a given path.
    - */
    -export class SubWalks {
    -    store = new Map();
    -    add(target, pattern) {
    -        if (!target.canReaddir()) {
    -            return;
    -        }
    -        const subs = this.store.get(target);
    -        if (subs) {
    -            if (!subs.find(p => p.globString() === pattern.globString())) {
    -                subs.push(pattern);
    -            }
    -        }
    -        else
    -            this.store.set(target, [pattern]);
    -    }
    -    get(target) {
    -        const subs = this.store.get(target);
    -        /* c8 ignore start */
    -        if (!subs) {
    -            throw new Error('attempting to walk unknown path');
    -        }
    -        /* c8 ignore stop */
    -        return subs;
    -    }
    -    entries() {
    -        return this.keys().map(k => [k, this.store.get(k)]);
    -    }
    -    keys() {
    -        return [...this.store.keys()].filter(t => t.canReaddir());
    -    }
    -}
    -/**
    - * The class that processes patterns for a given path.
    - *
    - * Handles child entry filtering, and determining whether a path's
    - * directory contents must be read.
    - */
    -export class Processor {
    -    hasWalkedCache;
    -    matches = new MatchRecord();
    -    subwalks = new SubWalks();
    -    patterns;
    -    follow;
    -    dot;
    -    opts;
    -    constructor(opts, hasWalkedCache) {
    -        this.opts = opts;
    -        this.follow = !!opts.follow;
    -        this.dot = !!opts.dot;
    -        this.hasWalkedCache = hasWalkedCache
    -            ? hasWalkedCache.copy()
    -            : new HasWalkedCache();
    -    }
    -    processPatterns(target, patterns) {
    -        this.patterns = patterns;
    -        const processingSet = patterns.map(p => [target, p]);
    -        // map of paths to the magic-starting subwalks they need to walk
    -        // first item in patterns is the filter
    -        for (let [t, pattern] of processingSet) {
    -            this.hasWalkedCache.storeWalked(t, pattern);
    -            const root = pattern.root();
    -            const absolute = pattern.isAbsolute() && this.opts.absolute !== false;
    -            // start absolute patterns at root
    -            if (root) {
    -                t = t.resolve(root === '/' && this.opts.root !== undefined
    -                    ? this.opts.root
    -                    : root);
    -                const rest = pattern.rest();
    -                if (!rest) {
    -                    this.matches.add(t, true, false);
    -                    continue;
    -                }
    -                else {
    -                    pattern = rest;
    -                }
    -            }
    -            if (t.isENOENT())
    -                continue;
    -            let p;
    -            let rest;
    -            let changed = false;
    -            while (typeof (p = pattern.pattern()) === 'string' &&
    -                (rest = pattern.rest())) {
    -                const c = t.resolve(p);
    -                // we can be reasonably sure that .. is a readable dir
    -                if (c.isUnknown() && p !== '..')
    -                    break;
    -                t = c;
    -                pattern = rest;
    -                changed = true;
    -            }
    -            p = pattern.pattern();
    -            rest = pattern.rest();
    -            if (changed) {
    -                if (this.hasWalkedCache.hasWalked(t, pattern))
    -                    continue;
    -                this.hasWalkedCache.storeWalked(t, pattern);
    -            }
    -            // now we have either a final string for a known entry,
    -            // more strings for an unknown entry,
    -            // or a pattern starting with magic, mounted on t.
    -            if (typeof p === 'string') {
    -                // must be final entry
    -                if (!rest) {
    -                    const ifDir = p === '..' || p === '' || p === '.';
    -                    this.matches.add(t.resolve(p), absolute, ifDir);
    -                }
    -                else {
    -                    this.subwalks.add(t, pattern);
    -                }
    -                continue;
    -            }
    -            else if (p === GLOBSTAR) {
    -                // if no rest, match and subwalk pattern
    -                // if rest, process rest and subwalk pattern
    -                // if it's a symlink, but we didn't get here by way of a
    -                // globstar match (meaning it's the first time THIS globstar
    -                // has traversed a symlink), then we follow it. Otherwise, stop.
    -                if (!t.isSymbolicLink() ||
    -                    this.follow ||
    -                    pattern.checkFollowGlobstar()) {
    -                    this.subwalks.add(t, pattern);
    -                }
    -                const rp = rest?.pattern();
    -                const rrest = rest?.rest();
    -                if (!rest || ((rp === '' || rp === '.') && !rrest)) {
    -                    // only HAS to be a dir if it ends in **/ or **/.
    -                    // but ending in ** will match files as well.
    -                    this.matches.add(t, absolute, rp === '' || rp === '.');
    -                }
    -                else {
    -                    if (rp === '..') {
    -                        // this would mean you're matching **/.. at the fs root,
    -                        // and no thanks, I'm not gonna test that specific case.
    -                        /* c8 ignore start */
    -                        const tp = t.parent || t;
    -                        /* c8 ignore stop */
    -                        if (!rrest)
    -                            this.matches.add(tp, absolute, true);
    -                        else if (!this.hasWalkedCache.hasWalked(tp, rrest)) {
    -                            this.subwalks.add(tp, rrest);
    -                        }
    -                    }
    -                }
    -            }
    -            else if (p instanceof RegExp) {
    -                this.subwalks.add(t, pattern);
    -            }
    -        }
    -        return this;
    -    }
    -    subwalkTargets() {
    -        return this.subwalks.keys();
    -    }
    -    child() {
    -        return new Processor(this.opts, this.hasWalkedCache);
    -    }
    -    // return a new Processor containing the subwalks for each
    -    // child entry, and a set of matches, and
    -    // a hasWalkedCache that's a copy of this one
    -    // then we're going to call
    -    filterEntries(parent, entries) {
    -        const patterns = this.subwalks.get(parent);
    -        // put matches and entry walks into the results processor
    -        const results = this.child();
    -        for (const e of entries) {
    -            for (const pattern of patterns) {
    -                const absolute = pattern.isAbsolute();
    -                const p = pattern.pattern();
    -                const rest = pattern.rest();
    -                if (p === GLOBSTAR) {
    -                    results.testGlobstar(e, pattern, rest, absolute);
    -                }
    -                else if (p instanceof RegExp) {
    -                    results.testRegExp(e, p, rest, absolute);
    -                }
    -                else {
    -                    results.testString(e, p, rest, absolute);
    -                }
    -            }
    -        }
    -        return results;
    -    }
    -    testGlobstar(e, pattern, rest, absolute) {
    -        if (this.dot || !e.name.startsWith('.')) {
    -            if (!pattern.hasMore()) {
    -                this.matches.add(e, absolute, false);
    -            }
    -            if (e.canReaddir()) {
    -                // if we're in follow mode or it's not a symlink, just keep
    -                // testing the same pattern. If there's more after the globstar,
    -                // then this symlink consumes the globstar. If not, then we can
    -                // follow at most ONE symlink along the way, so we mark it, which
    -                // also checks to ensure that it wasn't already marked.
    -                if (this.follow || !e.isSymbolicLink()) {
    -                    this.subwalks.add(e, pattern);
    -                }
    -                else if (e.isSymbolicLink()) {
    -                    if (rest && pattern.checkFollowGlobstar()) {
    -                        this.subwalks.add(e, rest);
    -                    }
    -                    else if (pattern.markFollowGlobstar()) {
    -                        this.subwalks.add(e, pattern);
    -                    }
    -                }
    -            }
    -        }
    -        // if the NEXT thing matches this entry, then also add
    -        // the rest.
    -        if (rest) {
    -            const rp = rest.pattern();
    -            if (typeof rp === 'string' &&
    -                // dots and empty were handled already
    -                rp !== '..' &&
    -                rp !== '' &&
    -                rp !== '.') {
    -                this.testString(e, rp, rest.rest(), absolute);
    -            }
    -            else if (rp === '..') {
    -                /* c8 ignore start */
    -                const ep = e.parent || e;
    -                /* c8 ignore stop */
    -                this.subwalks.add(ep, rest);
    -            }
    -            else if (rp instanceof RegExp) {
    -                this.testRegExp(e, rp, rest.rest(), absolute);
    -            }
    -        }
    -    }
    -    testRegExp(e, p, rest, absolute) {
    -        if (!p.test(e.name))
    -            return;
    -        if (!rest) {
    -            this.matches.add(e, absolute, false);
    -        }
    -        else {
    -            this.subwalks.add(e, rest);
    -        }
    -    }
    -    testString(e, p, rest, absolute) {
    -        // should never happen?
    -        if (!e.isNamed(p))
    -            return;
    -        if (!rest) {
    -            this.matches.add(e, absolute, false);
    -        }
    -        else {
    -            this.subwalks.add(e, rest);
    -        }
    -    }
    -}
    -//# sourceMappingURL=processor.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/processor.js.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/processor.js.map
    deleted file mode 100644
    index bf17d8e99b04a6..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/processor.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"processor.js","sourceRoot":"","sources":["../../src/processor.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,OAAO,EAAE,QAAQ,EAAY,MAAM,WAAW,CAAA;AAK9C;;GAEG;AACH,MAAM,OAAO,cAAc;IACzB,KAAK,CAA0B;IAC/B,YAAY,QAAkC,IAAI,GAAG,EAAE;QACrD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IACD,IAAI;QACF,OAAO,IAAI,cAAc,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IAChD,CAAC;IACD,SAAS,CAAC,MAAY,EAAE,OAAgB;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;IACrE,CAAC;IACD,WAAW,CAAC,MAAY,EAAE,OAAgB;QACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAA;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACvC,IAAI,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;;YACvC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAA;IAChE,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,WAAW;IACtB,KAAK,GAAsB,IAAI,GAAG,EAAE,CAAA;IACpC,GAAG,CAAC,MAAY,EAAE,QAAiB,EAAE,KAAc;QACjD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACtC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAA;IACjE,CAAC;IACD,yBAAyB;IACzB,OAAO;QACL,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAClD,IAAI;YACJ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACT,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SACV,CAAC,CAAA;IACJ,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,QAAQ;IACnB,KAAK,GAAyB,IAAI,GAAG,EAAE,CAAA;IACvC,GAAG,CAAC,MAAY,EAAE,OAAgB;QAChC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE;YACxB,OAAM;SACP;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACnC,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE;gBAC5D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;aACnB;SACF;;YAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IAC1C,CAAC;IACD,GAAG,CAAC,MAAY;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACnC,qBAAqB;QACrB,IAAI,CAAC,IAAI,EAAE;YACT,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;SACnD;QACD,oBAAoB;QACpB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAc,CAAC,CAAC,CAAA;IAClE,CAAC;IACD,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAA;IAC3D,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,SAAS;IACpB,cAAc,CAAgB;IAC9B,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;IAC3B,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAA;IACzB,QAAQ,CAAY;IACpB,MAAM,CAAS;IACf,GAAG,CAAS;IACZ,IAAI,CAAgB;IAEpB,YAAY,IAAoB,EAAE,cAA+B;QAC/D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAA;QAC3B,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAA;QACrB,IAAI,CAAC,cAAc,GAAG,cAAc;YAClC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE;YACvB,CAAC,CAAC,IAAI,cAAc,EAAE,CAAA;IAC1B,CAAC;IAED,eAAe,CAAC,MAAY,EAAE,QAAmB;QAC/C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,MAAM,aAAa,GAAsB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;QAEvE,gEAAgE;QAChE,uCAAuC;QAEvC,KAAK,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,aAAa,EAAE;YACtC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;YAE3C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;YAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAA;YAErE,kCAAkC;YAClC,IAAI,IAAI,EAAE;gBACR,CAAC,GAAG,CAAC,CAAC,OAAO,CACX,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS;oBAC1C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;oBAChB,CAAC,CAAC,IAAI,CACT,CAAA;gBACD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;gBAC3B,IAAI,CAAC,IAAI,EAAE;oBACT,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;oBAChC,SAAQ;iBACT;qBAAM;oBACL,OAAO,GAAG,IAAI,CAAA;iBACf;aACF;YAED,IAAI,CAAC,CAAC,QAAQ,EAAE;gBAAE,SAAQ;YAE1B,IAAI,CAAY,CAAA;YAChB,IAAI,IAAoB,CAAA;YACxB,IAAI,OAAO,GAAG,KAAK,CAAA;YACnB,OACE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,QAAQ;gBAC3C,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EACvB;gBACA,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;gBACtB,sDAAsD;gBACtD,IAAI,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,IAAI;oBAAE,MAAK;gBACtC,CAAC,GAAG,CAAC,CAAA;gBACL,OAAO,GAAG,IAAI,CAAA;gBACd,OAAO,GAAG,IAAI,CAAA;aACf;YACD,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;YACrB,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;YACrB,IAAI,OAAO,EAAE;gBACX,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC;oBAAE,SAAQ;gBACvD,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;aAC5C;YAED,uDAAuD;YACvD,qCAAqC;YACrC,kDAAkD;YAClD,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;gBACzB,sBAAsB;gBACtB,IAAI,CAAC,IAAI,EAAE;oBACT,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,CAAA;oBACjD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;iBAChD;qBAAM;oBACL,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;iBAC9B;gBACD,SAAQ;aACT;iBAAM,IAAI,CAAC,KAAK,QAAQ,EAAE;gBACzB,wCAAwC;gBACxC,4CAA4C;gBAC5C,wDAAwD;gBACxD,4DAA4D;gBAC5D,gEAAgE;gBAChE,IACE,CAAC,CAAC,CAAC,cAAc,EAAE;oBACnB,IAAI,CAAC,MAAM;oBACX,OAAO,CAAC,mBAAmB,EAAE,EAC7B;oBACA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;iBAC9B;gBACD,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAA;gBAC1B,MAAM,KAAK,GAAG,IAAI,EAAE,IAAI,EAAE,CAAA;gBAC1B,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;oBAClD,iDAAiD;oBACjD,6CAA6C;oBAC7C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAA;iBACvD;qBAAM;oBACL,IAAI,EAAE,KAAK,IAAI,EAAE;wBACf,wDAAwD;wBACxD,wDAAwD;wBACxD,qBAAqB;wBACrB,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAA;wBACxB,oBAAoB;wBACpB,IAAI,CAAC,KAAK;4BAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;6BAC3C,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE;4BAClD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;yBAC7B;qBACF;iBACF;aACF;iBAAM,IAAI,CAAC,YAAY,MAAM,EAAE;gBAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;aAC9B;SACF;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC7B,CAAC;IAED,KAAK;QACH,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,CAAA;IACtD,CAAC;IAED,0DAA0D;IAC1D,yCAAyC;IACzC,6CAA6C;IAC7C,2BAA2B;IAC3B,aAAa,CAAC,MAAY,EAAE,OAAe;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAC1C,yDAAyD;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;QAC5B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;YACvB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;gBAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,CAAA;gBACrC,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;gBAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;gBAC3B,IAAI,CAAC,KAAK,QAAQ,EAAE;oBAClB,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;iBACjD;qBAAM,IAAI,CAAC,YAAY,MAAM,EAAE;oBAC9B,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;iBACzC;qBAAM;oBACL,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;iBACzC;aACF;SACF;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,YAAY,CACV,CAAO,EACP,OAAgB,EAChB,IAAoB,EACpB,QAAiB;QAEjB,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YACvC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE;gBACtB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;aACrC;YACD,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE;gBAClB,2DAA2D;gBAC3D,gEAAgE;gBAChE,+DAA+D;gBAC/D,iEAAiE;gBACjE,uDAAuD;gBACvD,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE;oBACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;iBAC9B;qBAAM,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE;oBAC7B,IAAI,IAAI,IAAI,OAAO,CAAC,mBAAmB,EAAE,EAAE;wBACzC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;qBAC3B;yBAAM,IAAI,OAAO,CAAC,kBAAkB,EAAE,EAAE;wBACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;qBAC9B;iBACF;aACF;SACF;QACD,sDAAsD;QACtD,YAAY;QACZ,IAAI,IAAI,EAAE;YACR,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;YACzB,IACE,OAAO,EAAE,KAAK,QAAQ;gBACtB,sCAAsC;gBACtC,EAAE,KAAK,IAAI;gBACX,EAAE,KAAK,EAAE;gBACT,EAAE,KAAK,GAAG,EACV;gBACA,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAA;aAC9C;iBAAM,IAAI,EAAE,KAAK,IAAI,EAAE;gBACtB,qBAAqB;gBACrB,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAA;gBACxB,oBAAoB;gBACpB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;aAC5B;iBAAM,IAAI,EAAE,YAAY,MAAM,EAAE;gBAC/B,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAA;aAC9C;SACF;IACH,CAAC;IAED,UAAU,CACR,CAAO,EACP,CAAW,EACX,IAAoB,EACpB,QAAiB;QAEjB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,OAAM;QAC3B,IAAI,CAAC,IAAI,EAAE;YACT,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;SACrC;aAAM;YACL,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;SAC3B;IACH,CAAC;IAED,UAAU,CAAC,CAAO,EAAE,CAAS,EAAE,IAAoB,EAAE,QAAiB;QACpE,uBAAuB;QACvB,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,OAAM;QACzB,IAAI,CAAC,IAAI,EAAE;YACT,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;SACrC;aAAM;YACL,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;SAC3B;IACH,CAAC;CACF","sourcesContent":["// synchronous utility for filtering entries and calculating subwalks\n\nimport { GLOBSTAR, MMRegExp } from 'minimatch'\nimport { Path } from 'path-scurry'\nimport { MMPattern, Pattern } from './pattern.js'\nimport { GlobWalkerOpts } from './walker.js'\n\n/**\n * A cache of which patterns have been processed for a given Path\n */\nexport class HasWalkedCache {\n  store: Map>\n  constructor(store: Map> = new Map()) {\n    this.store = store\n  }\n  copy() {\n    return new HasWalkedCache(new Map(this.store))\n  }\n  hasWalked(target: Path, pattern: Pattern) {\n    return this.store.get(target.fullpath())?.has(pattern.globString())\n  }\n  storeWalked(target: Path, pattern: Pattern) {\n    const fullpath = target.fullpath()\n    const cached = this.store.get(fullpath)\n    if (cached) cached.add(pattern.globString())\n    else this.store.set(fullpath, new Set([pattern.globString()]))\n  }\n}\n\n/**\n * A record of which paths have been matched in a given walk step,\n * and whether they only are considered a match if they are a directory,\n * and whether their absolute or relative path should be returned.\n */\nexport class MatchRecord {\n  store: Map = new Map()\n  add(target: Path, absolute: boolean, ifDir: boolean) {\n    const n = (absolute ? 2 : 0) | (ifDir ? 1 : 0)\n    const current = this.store.get(target)\n    this.store.set(target, current === undefined ? n : n & current)\n  }\n  // match, absolute, ifdir\n  entries(): [Path, boolean, boolean][] {\n    return [...this.store.entries()].map(([path, n]) => [\n      path,\n      !!(n & 2),\n      !!(n & 1),\n    ])\n  }\n}\n\n/**\n * A collection of patterns that must be processed in a subsequent step\n * for a given path.\n */\nexport class SubWalks {\n  store: Map = new Map()\n  add(target: Path, pattern: Pattern) {\n    if (!target.canReaddir()) {\n      return\n    }\n    const subs = this.store.get(target)\n    if (subs) {\n      if (!subs.find(p => p.globString() === pattern.globString())) {\n        subs.push(pattern)\n      }\n    } else this.store.set(target, [pattern])\n  }\n  get(target: Path): Pattern[] {\n    const subs = this.store.get(target)\n    /* c8 ignore start */\n    if (!subs) {\n      throw new Error('attempting to walk unknown path')\n    }\n    /* c8 ignore stop */\n    return subs\n  }\n  entries(): [Path, Pattern[]][] {\n    return this.keys().map(k => [k, this.store.get(k) as Pattern[]])\n  }\n  keys(): Path[] {\n    return [...this.store.keys()].filter(t => t.canReaddir())\n  }\n}\n\n/**\n * The class that processes patterns for a given path.\n *\n * Handles child entry filtering, and determining whether a path's\n * directory contents must be read.\n */\nexport class Processor {\n  hasWalkedCache: HasWalkedCache\n  matches = new MatchRecord()\n  subwalks = new SubWalks()\n  patterns?: Pattern[]\n  follow: boolean\n  dot: boolean\n  opts: GlobWalkerOpts\n\n  constructor(opts: GlobWalkerOpts, hasWalkedCache?: HasWalkedCache) {\n    this.opts = opts\n    this.follow = !!opts.follow\n    this.dot = !!opts.dot\n    this.hasWalkedCache = hasWalkedCache\n      ? hasWalkedCache.copy()\n      : new HasWalkedCache()\n  }\n\n  processPatterns(target: Path, patterns: Pattern[]) {\n    this.patterns = patterns\n    const processingSet: [Path, Pattern][] = patterns.map(p => [target, p])\n\n    // map of paths to the magic-starting subwalks they need to walk\n    // first item in patterns is the filter\n\n    for (let [t, pattern] of processingSet) {\n      this.hasWalkedCache.storeWalked(t, pattern)\n\n      const root = pattern.root()\n      const absolute = pattern.isAbsolute() && this.opts.absolute !== false\n\n      // start absolute patterns at root\n      if (root) {\n        t = t.resolve(\n          root === '/' && this.opts.root !== undefined\n            ? this.opts.root\n            : root\n        )\n        const rest = pattern.rest()\n        if (!rest) {\n          this.matches.add(t, true, false)\n          continue\n        } else {\n          pattern = rest\n        }\n      }\n\n      if (t.isENOENT()) continue\n\n      let p: MMPattern\n      let rest: Pattern | null\n      let changed = false\n      while (\n        typeof (p = pattern.pattern()) === 'string' &&\n        (rest = pattern.rest())\n      ) {\n        const c = t.resolve(p)\n        // we can be reasonably sure that .. is a readable dir\n        if (c.isUnknown() && p !== '..') break\n        t = c\n        pattern = rest\n        changed = true\n      }\n      p = pattern.pattern()\n      rest = pattern.rest()\n      if (changed) {\n        if (this.hasWalkedCache.hasWalked(t, pattern)) continue\n        this.hasWalkedCache.storeWalked(t, pattern)\n      }\n\n      // now we have either a final string for a known entry,\n      // more strings for an unknown entry,\n      // or a pattern starting with magic, mounted on t.\n      if (typeof p === 'string') {\n        // must be final entry\n        if (!rest) {\n          const ifDir = p === '..' || p === '' || p === '.'\n          this.matches.add(t.resolve(p), absolute, ifDir)\n        } else {\n          this.subwalks.add(t, pattern)\n        }\n        continue\n      } else if (p === GLOBSTAR) {\n        // if no rest, match and subwalk pattern\n        // if rest, process rest and subwalk pattern\n        // if it's a symlink, but we didn't get here by way of a\n        // globstar match (meaning it's the first time THIS globstar\n        // has traversed a symlink), then we follow it. Otherwise, stop.\n        if (\n          !t.isSymbolicLink() ||\n          this.follow ||\n          pattern.checkFollowGlobstar()\n        ) {\n          this.subwalks.add(t, pattern)\n        }\n        const rp = rest?.pattern()\n        const rrest = rest?.rest()\n        if (!rest || ((rp === '' || rp === '.') && !rrest)) {\n          // only HAS to be a dir if it ends in **/ or **/.\n          // but ending in ** will match files as well.\n          this.matches.add(t, absolute, rp === '' || rp === '.')\n        } else {\n          if (rp === '..') {\n            // this would mean you're matching **/.. at the fs root,\n            // and no thanks, I'm not gonna test that specific case.\n            /* c8 ignore start */\n            const tp = t.parent || t\n            /* c8 ignore stop */\n            if (!rrest) this.matches.add(tp, absolute, true)\n            else if (!this.hasWalkedCache.hasWalked(tp, rrest)) {\n              this.subwalks.add(tp, rrest)\n            }\n          }\n        }\n      } else if (p instanceof RegExp) {\n        this.subwalks.add(t, pattern)\n      }\n    }\n\n    return this\n  }\n\n  subwalkTargets(): Path[] {\n    return this.subwalks.keys()\n  }\n\n  child() {\n    return new Processor(this.opts, this.hasWalkedCache)\n  }\n\n  // return a new Processor containing the subwalks for each\n  // child entry, and a set of matches, and\n  // a hasWalkedCache that's a copy of this one\n  // then we're going to call\n  filterEntries(parent: Path, entries: Path[]): Processor {\n    const patterns = this.subwalks.get(parent)\n    // put matches and entry walks into the results processor\n    const results = this.child()\n    for (const e of entries) {\n      for (const pattern of patterns) {\n        const absolute = pattern.isAbsolute()\n        const p = pattern.pattern()\n        const rest = pattern.rest()\n        if (p === GLOBSTAR) {\n          results.testGlobstar(e, pattern, rest, absolute)\n        } else if (p instanceof RegExp) {\n          results.testRegExp(e, p, rest, absolute)\n        } else {\n          results.testString(e, p, rest, absolute)\n        }\n      }\n    }\n    return results\n  }\n\n  testGlobstar(\n    e: Path,\n    pattern: Pattern,\n    rest: Pattern | null,\n    absolute: boolean\n  ) {\n    if (this.dot || !e.name.startsWith('.')) {\n      if (!pattern.hasMore()) {\n        this.matches.add(e, absolute, false)\n      }\n      if (e.canReaddir()) {\n        // if we're in follow mode or it's not a symlink, just keep\n        // testing the same pattern. If there's more after the globstar,\n        // then this symlink consumes the globstar. If not, then we can\n        // follow at most ONE symlink along the way, so we mark it, which\n        // also checks to ensure that it wasn't already marked.\n        if (this.follow || !e.isSymbolicLink()) {\n          this.subwalks.add(e, pattern)\n        } else if (e.isSymbolicLink()) {\n          if (rest && pattern.checkFollowGlobstar()) {\n            this.subwalks.add(e, rest)\n          } else if (pattern.markFollowGlobstar()) {\n            this.subwalks.add(e, pattern)\n          }\n        }\n      }\n    }\n    // if the NEXT thing matches this entry, then also add\n    // the rest.\n    if (rest) {\n      const rp = rest.pattern()\n      if (\n        typeof rp === 'string' &&\n        // dots and empty were handled already\n        rp !== '..' &&\n        rp !== '' &&\n        rp !== '.'\n      ) {\n        this.testString(e, rp, rest.rest(), absolute)\n      } else if (rp === '..') {\n        /* c8 ignore start */\n        const ep = e.parent || e\n        /* c8 ignore stop */\n        this.subwalks.add(ep, rest)\n      } else if (rp instanceof RegExp) {\n        this.testRegExp(e, rp, rest.rest(), absolute)\n      }\n    }\n  }\n\n  testRegExp(\n    e: Path,\n    p: MMRegExp,\n    rest: Pattern | null,\n    absolute: boolean\n  ) {\n    if (!p.test(e.name)) return\n    if (!rest) {\n      this.matches.add(e, absolute, false)\n    } else {\n      this.subwalks.add(e, rest)\n    }\n  }\n\n  testString(e: Path, p: string, rest: Pattern | null, absolute: boolean) {\n    // should never happen?\n    if (!e.isNamed(p)) return\n    if (!rest) {\n      this.matches.add(e, absolute, false)\n    } else {\n      this.subwalks.add(e, rest)\n    }\n  }\n}\n"]}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/walker.d.ts b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/walker.d.ts
    deleted file mode 100644
    index 5c1a0414971b3a..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/walker.d.ts
    +++ /dev/null
    @@ -1,96 +0,0 @@
    -/// 
    -/**
    - * Single-use utility classes to provide functionality to the {@link Glob}
    - * methods.
    - *
    - * @module
    - */
    -import { Minipass } from 'minipass';
    -import { Path } from 'path-scurry';
    -import { IgnoreLike } from './ignore.js';
    -import { Pattern } from './pattern.js';
    -import { Processor } from './processor.js';
    -export interface GlobWalkerOpts {
    -    absolute?: boolean;
    -    allowWindowsEscape?: boolean;
    -    cwd?: string | URL;
    -    dot?: boolean;
    -    dotRelative?: boolean;
    -    follow?: boolean;
    -    ignore?: string | string[] | IgnoreLike;
    -    mark?: boolean;
    -    matchBase?: boolean;
    -    maxDepth?: number;
    -    nobrace?: boolean;
    -    nocase?: boolean;
    -    nodir?: boolean;
    -    noext?: boolean;
    -    noglobstar?: boolean;
    -    platform?: NodeJS.Platform;
    -    posix?: boolean;
    -    realpath?: boolean;
    -    root?: string;
    -    stat?: boolean;
    -    signal?: AbortSignal;
    -    windowsPathsNoEscape?: boolean;
    -    withFileTypes?: boolean;
    -}
    -export type GWOFileTypesTrue = GlobWalkerOpts & {
    -    withFileTypes: true;
    -};
    -export type GWOFileTypesFalse = GlobWalkerOpts & {
    -    withFileTypes: false;
    -};
    -export type GWOFileTypesUnset = GlobWalkerOpts & {
    -    withFileTypes?: undefined;
    -};
    -export type Result = O extends GWOFileTypesTrue ? Path : O extends GWOFileTypesFalse ? string : O extends GWOFileTypesUnset ? string : Path | string;
    -export type Matches = O extends GWOFileTypesTrue ? Set : O extends GWOFileTypesFalse ? Set : O extends GWOFileTypesUnset ? Set : Set;
    -export type MatchStream = O extends GWOFileTypesTrue ? Minipass : O extends GWOFileTypesFalse ? Minipass : O extends GWOFileTypesUnset ? Minipass : Minipass;
    -/**
    - * basic walking utilities that all the glob walker types use
    - */
    -export declare abstract class GlobUtil {
    -    #private;
    -    path: Path;
    -    patterns: Pattern[];
    -    opts: O;
    -    seen: Set;
    -    paused: boolean;
    -    aborted: boolean;
    -    signal?: AbortSignal;
    -    maxDepth: number;
    -    constructor(patterns: Pattern[], path: Path, opts: O);
    -    pause(): void;
    -    resume(): void;
    -    onResume(fn: () => any): void;
    -    matchCheck(e: Path, ifDir: boolean): Promise;
    -    matchCheckTest(e: Path | undefined, ifDir: boolean): Path | undefined;
    -    matchCheckSync(e: Path, ifDir: boolean): Path | undefined;
    -    abstract matchEmit(p: Result): void;
    -    abstract matchEmit(p: string | Path): void;
    -    matchFinish(e: Path, absolute: boolean): void;
    -    match(e: Path, absolute: boolean, ifDir: boolean): Promise;
    -    matchSync(e: Path, absolute: boolean, ifDir: boolean): void;
    -    walkCB(target: Path, patterns: Pattern[], cb: () => any): void;
    -    walkCB2(target: Path, patterns: Pattern[], processor: Processor, cb: () => any): any;
    -    walkCB3(target: Path, entries: Path[], processor: Processor, cb: () => any): void;
    -    walkCBSync(target: Path, patterns: Pattern[], cb: () => any): void;
    -    walkCB2Sync(target: Path, patterns: Pattern[], processor: Processor, cb: () => any): any;
    -    walkCB3Sync(target: Path, entries: Path[], processor: Processor, cb: () => any): void;
    -}
    -export declare class GlobWalker extends GlobUtil {
    -    matches: O extends GWOFileTypesTrue ? Set : O extends GWOFileTypesFalse ? Set : O extends GWOFileTypesUnset ? Set : Set;
    -    constructor(patterns: Pattern[], path: Path, opts: O);
    -    matchEmit(e: Result): void;
    -    walk(): Promise>;
    -    walkSync(): Matches;
    -}
    -export declare class GlobStream extends GlobUtil {
    -    results: O extends GWOFileTypesTrue ? Minipass : O extends GWOFileTypesFalse ? Minipass : O extends GWOFileTypesUnset ? Minipass : Minipass;
    -    constructor(patterns: Pattern[], path: Path, opts: O);
    -    matchEmit(e: Result): void;
    -    stream(): MatchStream;
    -    streamSync(): MatchStream;
    -}
    -//# sourceMappingURL=walker.d.ts.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/walker.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/walker.d.ts.map
    deleted file mode 100644
    index 7c8df20b2f323c..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/walker.d.ts.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"walker.d.ts","sourceRoot":"","sources":["../../src/walker.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAU,UAAU,EAAE,MAAM,aAAa,CAAA;AAOhD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;IAClB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,UAAU,CAAA;IACvC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,SAAS,CAAC,EAAE,OAAO,CAAA;IAGnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG;IAC9C,aAAa,EAAE,IAAI,CAAA;CACpB,CAAA;AACD,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG;IAC/C,aAAa,EAAE,KAAK,CAAA;CACrB,CAAA;AACD,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG;IAC/C,aAAa,CAAC,EAAE,SAAS,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,cAAc,IAAI,CAAC,SAAS,gBAAgB,GACrE,IAAI,GACJ,CAAC,SAAS,iBAAiB,GAC3B,MAAM,GACN,CAAC,SAAS,iBAAiB,GAC3B,MAAM,GACN,IAAI,GAAG,MAAM,CAAA;AAEjB,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,cAAc,IAAI,CAAC,SAAS,gBAAgB,GACtE,GAAG,CAAC,IAAI,CAAC,GACT,CAAC,SAAS,iBAAiB,GAC3B,GAAG,CAAC,MAAM,CAAC,GACX,CAAC,SAAS,iBAAiB,GAC3B,GAAG,CAAC,MAAM,CAAC,GACX,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,CAAA;AAEtB,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,cAAc,IAC9C,CAAC,SAAS,gBAAgB,GACtB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,GACpB,CAAC,SAAS,iBAAiB,GAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,GACxB,CAAC,SAAS,iBAAiB,GAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,GACxB,QAAQ,CAAC,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAA;AAY5C;;GAEG;AACH,8BAAsB,QAAQ,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc;;IACtE,IAAI,EAAE,IAAI,CAAA;IACV,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,IAAI,EAAE,CAAC,CAAA;IACP,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAkB;IACjC,MAAM,EAAE,OAAO,CAAQ;IACvB,OAAO,EAAE,OAAO,CAAQ;IAIxB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;gBAEJ,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IA8BpD,KAAK;IAGL,MAAM;IAUN,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG;IAahB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IAYpE,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS;IAUrE,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS;IAYzD,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IACtC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAE1C,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO;IAsBhC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtE,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAK3D,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG;IAOvD,OAAO,CACL,MAAM,EAAE,IAAI,EACZ,QAAQ,EAAE,OAAO,EAAE,EACnB,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,MAAM,GAAG;IA2Cf,OAAO,CACL,MAAM,EAAE,IAAI,EACZ,OAAO,EAAE,IAAI,EAAE,EACf,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,MAAM,GAAG;IAsBf,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG;IAO3D,WAAW,CACT,MAAM,EAAE,IAAI,EACZ,QAAQ,EAAE,OAAO,EAAE,EACnB,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,MAAM,GAAG;IAqCf,WAAW,CACT,MAAM,EAAE,IAAI,EACZ,OAAO,EAAE,IAAI,EAAE,EACf,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,MAAM,GAAG;CAoBhB;AAED,qBAAa,UAAU,CACrB,CAAC,SAAS,cAAc,GAAG,cAAc,CACzC,SAAQ,QAAQ,CAAC,CAAC,CAAC;IACnB,OAAO,EAAE,CAAC,SAAS,gBAAgB,GAC/B,GAAG,CAAC,IAAI,CAAC,GACT,CAAC,SAAS,iBAAiB,GAC3B,GAAG,CAAC,MAAM,CAAC,GACX,CAAC,SAAS,iBAAiB,GAC3B,GAAG,CAAC,MAAM,CAAC,GACX,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,CAAA;gBAEV,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAKpD,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAKvB,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAiBjC,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC;CAWvB;AAED,qBAAa,UAAU,CACrB,CAAC,SAAS,cAAc,GAAG,cAAc,CACzC,SAAQ,QAAQ,CAAC,CAAC,CAAC;IACnB,OAAO,EAAE,CAAC,SAAS,gBAAgB,GAC/B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,GACpB,CAAC,SAAS,iBAAiB,GAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,GACxB,CAAC,SAAS,iBAAiB,GAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,GACxB,QAAQ,CAAC,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAA;gBAE9B,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAUpD,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAM7B,MAAM,IAAI,WAAW,CAAC,CAAC,CAAC;IAYxB,UAAU,IAAI,WAAW,CAAC,CAAC,CAAC;CAO7B"}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/walker.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/walker.js
    deleted file mode 100644
    index 6f3358b0c39a32..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/walker.js
    +++ /dev/null
    @@ -1,352 +0,0 @@
    -/**
    - * Single-use utility classes to provide functionality to the {@link Glob}
    - * methods.
    - *
    - * @module
    - */
    -import { Minipass } from 'minipass';
    -import { Ignore } from './ignore.js';
    -import { Processor } from './processor.js';
    -const makeIgnore = (ignore, opts) => typeof ignore === 'string'
    -    ? new Ignore([ignore], opts)
    -    : Array.isArray(ignore)
    -        ? new Ignore(ignore, opts)
    -        : ignore;
    -/**
    - * basic walking utilities that all the glob walker types use
    - */
    -export class GlobUtil {
    -    path;
    -    patterns;
    -    opts;
    -    seen = new Set();
    -    paused = false;
    -    aborted = false;
    -    #onResume = [];
    -    #ignore;
    -    #sep;
    -    signal;
    -    maxDepth;
    -    constructor(patterns, path, opts) {
    -        this.patterns = patterns;
    -        this.path = path;
    -        this.opts = opts;
    -        this.#sep = !opts.posix && opts.platform === 'win32' ? '\\' : '/';
    -        if (opts.ignore) {
    -            this.#ignore = makeIgnore(opts.ignore, opts);
    -        }
    -        // ignore, always set with maxDepth, but it's optional on the
    -        // GlobOptions type
    -        /* c8 ignore start */
    -        this.maxDepth = opts.maxDepth || Infinity;
    -        /* c8 ignore stop */
    -        if (opts.signal) {
    -            this.signal = opts.signal;
    -            this.signal.addEventListener('abort', () => {
    -                this.#onResume.length = 0;
    -            });
    -        }
    -    }
    -    #ignored(path) {
    -        return this.seen.has(path) || !!this.#ignore?.ignored?.(path);
    -    }
    -    #childrenIgnored(path) {
    -        return !!this.#ignore?.childrenIgnored?.(path);
    -    }
    -    // backpressure mechanism
    -    pause() {
    -        this.paused = true;
    -    }
    -    resume() {
    -        /* c8 ignore start */
    -        if (this.signal?.aborted)
    -            return;
    -        /* c8 ignore stop */
    -        this.paused = false;
    -        let fn = undefined;
    -        while (!this.paused && (fn = this.#onResume.shift())) {
    -            fn();
    -        }
    -    }
    -    onResume(fn) {
    -        if (this.signal?.aborted)
    -            return;
    -        /* c8 ignore start */
    -        if (!this.paused) {
    -            fn();
    -        }
    -        else {
    -            /* c8 ignore stop */
    -            this.#onResume.push(fn);
    -        }
    -    }
    -    // do the requisite realpath/stat checking, and return the path
    -    // to add or undefined to filter it out.
    -    async matchCheck(e, ifDir) {
    -        if (ifDir && this.opts.nodir)
    -            return undefined;
    -        let rpc;
    -        if (this.opts.realpath) {
    -            rpc = e.realpathCached() || (await e.realpath());
    -            if (!rpc)
    -                return undefined;
    -            e = rpc;
    -        }
    -        const needStat = e.isUnknown() || this.opts.stat;
    -        return this.matchCheckTest(needStat ? await e.lstat() : e, ifDir);
    -    }
    -    matchCheckTest(e, ifDir) {
    -        return e &&
    -            (this.maxDepth === Infinity || e.depth() <= this.maxDepth) &&
    -            (!ifDir || e.canReaddir()) &&
    -            (!this.opts.nodir || !e.isDirectory()) &&
    -            !this.#ignored(e)
    -            ? e
    -            : undefined;
    -    }
    -    matchCheckSync(e, ifDir) {
    -        if (ifDir && this.opts.nodir)
    -            return undefined;
    -        let rpc;
    -        if (this.opts.realpath) {
    -            rpc = e.realpathCached() || e.realpathSync();
    -            if (!rpc)
    -                return undefined;
    -            e = rpc;
    -        }
    -        const needStat = e.isUnknown() || this.opts.stat;
    -        return this.matchCheckTest(needStat ? e.lstatSync() : e, ifDir);
    -    }
    -    matchFinish(e, absolute) {
    -        if (this.#ignored(e))
    -            return;
    -        const abs = this.opts.absolute === undefined ? absolute : this.opts.absolute;
    -        this.seen.add(e);
    -        const mark = this.opts.mark && e.isDirectory() ? this.#sep : '';
    -        // ok, we have what we need!
    -        if (this.opts.withFileTypes) {
    -            this.matchEmit(e);
    -        }
    -        else if (abs) {
    -            const abs = this.opts.posix ? e.fullpathPosix() : e.fullpath();
    -            this.matchEmit(abs + mark);
    -        }
    -        else {
    -            const rel = this.opts.posix ? e.relativePosix() : e.relative();
    -            const pre = this.opts.dotRelative && !rel.startsWith('..' + this.#sep)
    -                ? '.' + this.#sep
    -                : '';
    -            this.matchEmit(!rel ? '.' + mark : pre + rel + mark);
    -        }
    -    }
    -    async match(e, absolute, ifDir) {
    -        const p = await this.matchCheck(e, ifDir);
    -        if (p)
    -            this.matchFinish(p, absolute);
    -    }
    -    matchSync(e, absolute, ifDir) {
    -        const p = this.matchCheckSync(e, ifDir);
    -        if (p)
    -            this.matchFinish(p, absolute);
    -    }
    -    walkCB(target, patterns, cb) {
    -        /* c8 ignore start */
    -        if (this.signal?.aborted)
    -            cb();
    -        /* c8 ignore stop */
    -        this.walkCB2(target, patterns, new Processor(this.opts), cb);
    -    }
    -    walkCB2(target, patterns, processor, cb) {
    -        if (this.#childrenIgnored(target))
    -            return cb();
    -        if (this.signal?.aborted)
    -            cb();
    -        if (this.paused) {
    -            this.onResume(() => this.walkCB2(target, patterns, processor, cb));
    -            return;
    -        }
    -        processor.processPatterns(target, patterns);
    -        // done processing.  all of the above is sync, can be abstracted out.
    -        // subwalks is a map of paths to the entry filters they need
    -        // matches is a map of paths to [absolute, ifDir] tuples.
    -        let tasks = 1;
    -        const next = () => {
    -            if (--tasks === 0)
    -                cb();
    -        };
    -        for (const [m, absolute, ifDir] of processor.matches.entries()) {
    -            if (this.#ignored(m))
    -                continue;
    -            tasks++;
    -            this.match(m, absolute, ifDir).then(() => next());
    -        }
    -        for (const t of processor.subwalkTargets()) {
    -            if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) {
    -                continue;
    -            }
    -            tasks++;
    -            const childrenCached = t.readdirCached();
    -            if (t.calledReaddir())
    -                this.walkCB3(t, childrenCached, processor, next);
    -            else {
    -                t.readdirCB((_, entries) => this.walkCB3(t, entries, processor, next), true);
    -            }
    -        }
    -        next();
    -    }
    -    walkCB3(target, entries, processor, cb) {
    -        processor = processor.filterEntries(target, entries);
    -        let tasks = 1;
    -        const next = () => {
    -            if (--tasks === 0)
    -                cb();
    -        };
    -        for (const [m, absolute, ifDir] of processor.matches.entries()) {
    -            if (this.#ignored(m))
    -                continue;
    -            tasks++;
    -            this.match(m, absolute, ifDir).then(() => next());
    -        }
    -        for (const [target, patterns] of processor.subwalks.entries()) {
    -            tasks++;
    -            this.walkCB2(target, patterns, processor.child(), next);
    -        }
    -        next();
    -    }
    -    walkCBSync(target, patterns, cb) {
    -        /* c8 ignore start */
    -        if (this.signal?.aborted)
    -            cb();
    -        /* c8 ignore stop */
    -        this.walkCB2Sync(target, patterns, new Processor(this.opts), cb);
    -    }
    -    walkCB2Sync(target, patterns, processor, cb) {
    -        if (this.#childrenIgnored(target))
    -            return cb();
    -        if (this.signal?.aborted)
    -            cb();
    -        if (this.paused) {
    -            this.onResume(() => this.walkCB2Sync(target, patterns, processor, cb));
    -            return;
    -        }
    -        processor.processPatterns(target, patterns);
    -        // done processing.  all of the above is sync, can be abstracted out.
    -        // subwalks is a map of paths to the entry filters they need
    -        // matches is a map of paths to [absolute, ifDir] tuples.
    -        let tasks = 1;
    -        const next = () => {
    -            if (--tasks === 0)
    -                cb();
    -        };
    -        for (const [m, absolute, ifDir] of processor.matches.entries()) {
    -            if (this.#ignored(m))
    -                continue;
    -            this.matchSync(m, absolute, ifDir);
    -        }
    -        for (const t of processor.subwalkTargets()) {
    -            if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) {
    -                continue;
    -            }
    -            tasks++;
    -            const children = t.readdirSync();
    -            this.walkCB3Sync(t, children, processor, next);
    -        }
    -        next();
    -    }
    -    walkCB3Sync(target, entries, processor, cb) {
    -        processor = processor.filterEntries(target, entries);
    -        let tasks = 1;
    -        const next = () => {
    -            if (--tasks === 0)
    -                cb();
    -        };
    -        for (const [m, absolute, ifDir] of processor.matches.entries()) {
    -            if (this.#ignored(m))
    -                continue;
    -            this.matchSync(m, absolute, ifDir);
    -        }
    -        for (const [target, patterns] of processor.subwalks.entries()) {
    -            tasks++;
    -            this.walkCB2Sync(target, patterns, processor.child(), next);
    -        }
    -        next();
    -    }
    -}
    -export class GlobWalker extends GlobUtil {
    -    matches;
    -    constructor(patterns, path, opts) {
    -        super(patterns, path, opts);
    -        this.matches = new Set();
    -    }
    -    matchEmit(e) {
    -        this.matches.add(e);
    -    }
    -    async walk() {
    -        if (this.signal?.aborted)
    -            throw this.signal.reason;
    -        if (this.path.isUnknown()) {
    -            await this.path.lstat();
    -        }
    -        await new Promise((res, rej) => {
    -            this.walkCB(this.path, this.patterns, () => {
    -                if (this.signal?.aborted) {
    -                    rej(this.signal.reason);
    -                }
    -                else {
    -                    res(this.matches);
    -                }
    -            });
    -        });
    -        return this.matches;
    -    }
    -    walkSync() {
    -        if (this.signal?.aborted)
    -            throw this.signal.reason;
    -        if (this.path.isUnknown()) {
    -            this.path.lstatSync();
    -        }
    -        // nothing for the callback to do, because this never pauses
    -        this.walkCBSync(this.path, this.patterns, () => {
    -            if (this.signal?.aborted)
    -                throw this.signal.reason;
    -        });
    -        return this.matches;
    -    }
    -}
    -export class GlobStream extends GlobUtil {
    -    results;
    -    constructor(patterns, path, opts) {
    -        super(patterns, path, opts);
    -        this.results = new Minipass({
    -            signal: this.signal,
    -            objectMode: true,
    -        });
    -        this.results.on('drain', () => this.resume());
    -        this.results.on('resume', () => this.resume());
    -    }
    -    matchEmit(e) {
    -        this.results.write(e);
    -        if (!this.results.flowing)
    -            this.pause();
    -    }
    -    stream() {
    -        const target = this.path;
    -        if (target.isUnknown()) {
    -            target.lstat().then(() => {
    -                this.walkCB(target, this.patterns, () => this.results.end());
    -            });
    -        }
    -        else {
    -            this.walkCB(target, this.patterns, () => this.results.end());
    -        }
    -        return this.results;
    -    }
    -    streamSync() {
    -        if (this.path.isUnknown()) {
    -            this.path.lstatSync();
    -        }
    -        this.walkCBSync(this.path, this.patterns, () => this.results.end());
    -        return this.results;
    -    }
    -}
    -//# sourceMappingURL=walker.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/walker.js.map b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/walker.js.map
    deleted file mode 100644
    index 8756bfca294503..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/dist/mjs/walker.js.map
    +++ /dev/null
    @@ -1 +0,0 @@
    -{"version":3,"file":"walker.js","sourceRoot":"","sources":["../../src/walker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEnC,OAAO,EAAE,MAAM,EAAc,MAAM,aAAa,CAAA;AAQhD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAiE1C,MAAM,UAAU,GAAG,CACjB,MAAsC,EACtC,IAAoB,EACR,EAAE,CACd,OAAO,MAAM,KAAK,QAAQ;IACxB,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;IAC5B,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QACvB,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;QAC1B,CAAC,CAAC,MAAM,CAAA;AAEZ;;GAEG;AACH,MAAM,OAAgB,QAAQ;IAC5B,IAAI,CAAM;IACV,QAAQ,CAAW;IACnB,IAAI,CAAG;IACP,IAAI,GAAc,IAAI,GAAG,EAAQ,CAAA;IACjC,MAAM,GAAY,KAAK,CAAA;IACvB,OAAO,GAAY,KAAK,CAAA;IACxB,SAAS,GAAkB,EAAE,CAAA;IAC7B,OAAO,CAAa;IACpB,IAAI,CAAY;IAChB,MAAM,CAAc;IACpB,QAAQ,CAAQ;IAGhB,YAAY,QAAmB,EAAE,IAAU,EAAE,IAAO;QAClD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAA;QACjE,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;SAC7C;QACD,6DAA6D;QAC7D,mBAAmB;QACnB,qBAAqB;QACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAA;QACzC,oBAAoB;QACpB,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;YACzB,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBACzC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAA;YAC3B,CAAC,CAAC,CAAA;SACH;IACH,CAAC;IAED,QAAQ,CAAC,IAAU;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAA;IAC/D,CAAC;IACD,gBAAgB,CAAC,IAAU;QACzB,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,IAAI,CAAC,CAAA;IAChD,CAAC;IAED,yBAAyB;IACzB,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;IACpB,CAAC;IACD,MAAM;QACJ,qBAAqB;QACrB,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,OAAM;QAChC,oBAAoB;QACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,EAAE,GAA4B,SAAS,CAAA;QAC3C,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE;YACpD,EAAE,EAAE,CAAA;SACL;IACH,CAAC;IACD,QAAQ,CAAC,EAAa;QACpB,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,OAAM;QAChC,qBAAqB;QACrB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,EAAE,EAAE,CAAA;SACL;aAAM;YACL,oBAAoB;YACpB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;SACxB;IACH,CAAC;IAED,+DAA+D;IAC/D,wCAAwC;IACxC,KAAK,CAAC,UAAU,CAAC,CAAO,EAAE,KAAc;QACtC,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAA;QAC9C,IAAI,GAAqB,CAAA;QACzB,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YACtB,GAAG,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;YAChD,IAAI,CAAC,GAAG;gBAAE,OAAO,SAAS,CAAA;YAC1B,CAAC,GAAG,GAAG,CAAA;SACR;QACD,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;QAChD,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACnE,CAAC;IAED,cAAc,CAAC,CAAmB,EAAE,KAAc;QAChD,OAAO,CAAC;YACN,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC;YAC1D,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YAC1B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACtC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,SAAS,CAAA;IACf,CAAC;IAED,cAAc,CAAC,CAAO,EAAE,KAAc;QACpC,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAA;QAC9C,IAAI,GAAqB,CAAA;QACzB,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YACtB,GAAG,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,YAAY,EAAE,CAAA;YAC5C,IAAI,CAAC,GAAG;gBAAE,OAAO,SAAS,CAAA;YAC1B,CAAC,GAAG,GAAG,CAAA;SACR;QACD,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;QAChD,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACjE,CAAC;IAKD,WAAW,CAAC,CAAO,EAAE,QAAiB;QACpC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAM;QAC5B,MAAM,GAAG,GACP,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAA;QAClE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;QAC/D,4BAA4B;QAC5B,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YAC3B,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;SAClB;aAAM,IAAI,GAAG,EAAE;YACd,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;YAC9D,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,IAAI,CAAC,CAAA;SAC3B;aAAM;YACL,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;YAC9D,MAAM,GAAG,GACP,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;gBACxD,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI;gBACjB,CAAC,CAAC,EAAE,CAAA;YACR,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,CAAA;SACrD;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,CAAO,EAAE,QAAiB,EAAE,KAAc;QACpD,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QACzC,IAAI,CAAC;YAAE,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IACtC,CAAC;IAED,SAAS,CAAC,CAAO,EAAE,QAAiB,EAAE,KAAc;QAClD,MAAM,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QACvC,IAAI,CAAC;YAAE,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IACtC,CAAC;IAED,MAAM,CAAC,MAAY,EAAE,QAAmB,EAAE,EAAa;QACrD,qBAAqB;QACrB,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,EAAE,EAAE,CAAA;QAC9B,oBAAoB;QACpB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IAC9D,CAAC;IAED,OAAO,CACL,MAAY,EACZ,QAAmB,EACnB,SAAoB,EACpB,EAAa;QAEb,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,EAAE,CAAA;QAC9C,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,EAAE,EAAE,CAAA;QAC9B,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAA;YAClE,OAAM;SACP;QACD,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAE3C,qEAAqE;QACrE,4DAA4D;QAC5D,yDAAyD;QACzD,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,EAAE,KAAK,KAAK,CAAC;gBAAE,EAAE,EAAE,CAAA;QACzB,CAAC,CAAA;QAED,KAAK,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE;YAC9D,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,SAAQ;YAC9B,KAAK,EAAE,CAAA;YACP,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;SAClD;QAED,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,cAAc,EAAE,EAAE;YAC1C,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE;gBAC5D,SAAQ;aACT;YACD,KAAK,EAAE,CAAA;YACP,MAAM,cAAc,GAAG,CAAC,CAAC,aAAa,EAAE,CAAA;YACxC,IAAI,CAAC,CAAC,aAAa,EAAE;gBACnB,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;iBAC7C;gBACH,CAAC,CAAC,SAAS,CACT,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,EACzD,IAAI,CACL,CAAA;aACF;SACF;QAED,IAAI,EAAE,CAAA;IACR,CAAC;IAED,OAAO,CACL,MAAY,EACZ,OAAe,EACf,SAAoB,EACpB,EAAa;QAEb,SAAS,GAAG,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAEpD,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,EAAE,KAAK,KAAK,CAAC;gBAAE,EAAE,EAAE,CAAA;QACzB,CAAC,CAAA;QAED,KAAK,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE;YAC9D,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,SAAQ;YAC9B,KAAK,EAAE,CAAA;YACP,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;SAClD;QACD,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE;YAC7D,KAAK,EAAE,CAAA;YACP,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAA;SACxD;QAED,IAAI,EAAE,CAAA;IACR,CAAC;IAED,UAAU,CAAC,MAAY,EAAE,QAAmB,EAAE,EAAa;QACzD,qBAAqB;QACrB,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,EAAE,EAAE,CAAA;QAC9B,oBAAoB;QACpB,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IAClE,CAAC;IAED,WAAW,CACT,MAAY,EACZ,QAAmB,EACnB,SAAoB,EACpB,EAAa;QAEb,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,EAAE,CAAA;QAC9C,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,EAAE,EAAE,CAAA;QAC9B,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CACjB,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC,CAClD,CAAA;YACD,OAAM;SACP;QACD,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAE3C,qEAAqE;QACrE,4DAA4D;QAC5D,yDAAyD;QACzD,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,EAAE,KAAK,KAAK,CAAC;gBAAE,EAAE,EAAE,CAAA;QACzB,CAAC,CAAA;QAED,KAAK,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE;YAC9D,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,SAAQ;YAC9B,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;SACnC;QAED,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,cAAc,EAAE,EAAE;YAC1C,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE;gBAC5D,SAAQ;aACT;YACD,KAAK,EAAE,CAAA;YACP,MAAM,QAAQ,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;YAChC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;SAC/C;QAED,IAAI,EAAE,CAAA;IACR,CAAC;IAED,WAAW,CACT,MAAY,EACZ,OAAe,EACf,SAAoB,EACpB,EAAa;QAEb,SAAS,GAAG,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAEpD,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,EAAE,KAAK,KAAK,CAAC;gBAAE,EAAE,EAAE,CAAA;QACzB,CAAC,CAAA;QAED,KAAK,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE;YAC9D,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,SAAQ;YAC9B,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;SACnC;QACD,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE;YAC7D,KAAK,EAAE,CAAA;YACP,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAA;SAC5D;QAED,IAAI,EAAE,CAAA;IACR,CAAC;CACF;AAED,MAAM,OAAO,UAEX,SAAQ,QAAW;IACnB,OAAO,CAMe;IAEtB,YAAY,QAAmB,EAAE,IAAU,EAAE,IAAO;QAClD,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAgB,CAAA;IACxC,CAAC;IAGD,SAAS,CAAC,CAAgB;QACxB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;QAClD,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;YACzB,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;SACxB;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;gBACzC,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE;oBACxB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;iBACxB;qBAAM;oBACL,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;iBAClB;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QACF,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,QAAQ;QACN,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;YAAE,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;QAClD,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;YACzB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAA;SACtB;QACD,4DAA4D;QAC5D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;YAC7C,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;gBAAE,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;QACpD,CAAC,CAAC,CAAA;QACF,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;CACF;AAED,MAAM,OAAO,UAEX,SAAQ,QAAW;IACnB,OAAO,CAMmC;IAE1C,YAAY,QAAmB,EAAE,IAAU,EAAE,IAAO;QAClD,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,QAAQ,CAAC;YAC1B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE,IAAI;SACjB,CAAmB,CAAA;QACpB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;QAC7C,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;IAChD,CAAC;IAGD,SAAS,CAAC,CAAgB;QACxB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACrB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,IAAI,CAAC,KAAK,EAAE,CAAA;IACzC,CAAC;IAED,MAAM;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAA;QACxB,IAAI,MAAM,CAAC,SAAS,EAAE,EAAE;YACtB,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;gBACvB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;YAC9D,CAAC,CAAC,CAAA;SACH;aAAM;YACL,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;SAC7D;QACD,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,UAAU;QACR,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;YACzB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAA;SACtB;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QACnE,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;CACF","sourcesContent":["/**\n * Single-use utility classes to provide functionality to the {@link Glob}\n * methods.\n *\n * @module\n */\nimport { Minipass } from 'minipass'\nimport { Path } from 'path-scurry'\nimport { Ignore, IgnoreLike } from './ignore.js'\n\n// XXX can we somehow make it so that it NEVER processes a given path more than\n// once, enough that the match set tracking is no longer needed?  that'd speed\n// things up a lot.  Or maybe bring back nounique, and skip it in that case?\n\n// a single minimatch set entry with 1 or more parts\nimport { Pattern } from './pattern.js'\nimport { Processor } from './processor.js'\n\nexport interface GlobWalkerOpts {\n  absolute?: boolean\n  allowWindowsEscape?: boolean\n  cwd?: string | URL\n  dot?: boolean\n  dotRelative?: boolean\n  follow?: boolean\n  ignore?: string | string[] | IgnoreLike\n  mark?: boolean\n  matchBase?: boolean\n  // Note: maxDepth here means \"maximum actual Path.depth()\",\n  // not \"maximum depth beyond cwd\"\n  maxDepth?: number\n  nobrace?: boolean\n  nocase?: boolean\n  nodir?: boolean\n  noext?: boolean\n  noglobstar?: boolean\n  platform?: NodeJS.Platform\n  posix?: boolean\n  realpath?: boolean\n  root?: string\n  stat?: boolean\n  signal?: AbortSignal\n  windowsPathsNoEscape?: boolean\n  withFileTypes?: boolean\n}\n\nexport type GWOFileTypesTrue = GlobWalkerOpts & {\n  withFileTypes: true\n}\nexport type GWOFileTypesFalse = GlobWalkerOpts & {\n  withFileTypes: false\n}\nexport type GWOFileTypesUnset = GlobWalkerOpts & {\n  withFileTypes?: undefined\n}\n\nexport type Result = O extends GWOFileTypesTrue\n  ? Path\n  : O extends GWOFileTypesFalse\n  ? string\n  : O extends GWOFileTypesUnset\n  ? string\n  : Path | string\n\nexport type Matches = O extends GWOFileTypesTrue\n  ? Set\n  : O extends GWOFileTypesFalse\n  ? Set\n  : O extends GWOFileTypesUnset\n  ? Set\n  : Set\n\nexport type MatchStream =\n  O extends GWOFileTypesTrue\n    ? Minipass\n    : O extends GWOFileTypesFalse\n    ? Minipass\n    : O extends GWOFileTypesUnset\n    ? Minipass\n    : Minipass\n\nconst makeIgnore = (\n  ignore: string | string[] | IgnoreLike,\n  opts: GlobWalkerOpts\n): IgnoreLike =>\n  typeof ignore === 'string'\n    ? new Ignore([ignore], opts)\n    : Array.isArray(ignore)\n    ? new Ignore(ignore, opts)\n    : ignore\n\n/**\n * basic walking utilities that all the glob walker types use\n */\nexport abstract class GlobUtil {\n  path: Path\n  patterns: Pattern[]\n  opts: O\n  seen: Set = new Set()\n  paused: boolean = false\n  aborted: boolean = false\n  #onResume: (() => any)[] = []\n  #ignore?: IgnoreLike\n  #sep: '\\\\' | '/'\n  signal?: AbortSignal\n  maxDepth: number\n\n  constructor(patterns: Pattern[], path: Path, opts: O)\n  constructor(patterns: Pattern[], path: Path, opts: O) {\n    this.patterns = patterns\n    this.path = path\n    this.opts = opts\n    this.#sep = !opts.posix && opts.platform === 'win32' ? '\\\\' : '/'\n    if (opts.ignore) {\n      this.#ignore = makeIgnore(opts.ignore, opts)\n    }\n    // ignore, always set with maxDepth, but it's optional on the\n    // GlobOptions type\n    /* c8 ignore start */\n    this.maxDepth = opts.maxDepth || Infinity\n    /* c8 ignore stop */\n    if (opts.signal) {\n      this.signal = opts.signal\n      this.signal.addEventListener('abort', () => {\n        this.#onResume.length = 0\n      })\n    }\n  }\n\n  #ignored(path: Path): boolean {\n    return this.seen.has(path) || !!this.#ignore?.ignored?.(path)\n  }\n  #childrenIgnored(path: Path): boolean {\n    return !!this.#ignore?.childrenIgnored?.(path)\n  }\n\n  // backpressure mechanism\n  pause() {\n    this.paused = true\n  }\n  resume() {\n    /* c8 ignore start */\n    if (this.signal?.aborted) return\n    /* c8 ignore stop */\n    this.paused = false\n    let fn: (() => any) | undefined = undefined\n    while (!this.paused && (fn = this.#onResume.shift())) {\n      fn()\n    }\n  }\n  onResume(fn: () => any) {\n    if (this.signal?.aborted) return\n    /* c8 ignore start */\n    if (!this.paused) {\n      fn()\n    } else {\n      /* c8 ignore stop */\n      this.#onResume.push(fn)\n    }\n  }\n\n  // do the requisite realpath/stat checking, and return the path\n  // to add or undefined to filter it out.\n  async matchCheck(e: Path, ifDir: boolean): Promise {\n    if (ifDir && this.opts.nodir) return undefined\n    let rpc: Path | undefined\n    if (this.opts.realpath) {\n      rpc = e.realpathCached() || (await e.realpath())\n      if (!rpc) return undefined\n      e = rpc\n    }\n    const needStat = e.isUnknown() || this.opts.stat\n    return this.matchCheckTest(needStat ? await e.lstat() : e, ifDir)\n  }\n\n  matchCheckTest(e: Path | undefined, ifDir: boolean): Path | undefined {\n    return e &&\n      (this.maxDepth === Infinity || e.depth() <= this.maxDepth) &&\n      (!ifDir || e.canReaddir()) &&\n      (!this.opts.nodir || !e.isDirectory()) &&\n      !this.#ignored(e)\n      ? e\n      : undefined\n  }\n\n  matchCheckSync(e: Path, ifDir: boolean): Path | undefined {\n    if (ifDir && this.opts.nodir) return undefined\n    let rpc: Path | undefined\n    if (this.opts.realpath) {\n      rpc = e.realpathCached() || e.realpathSync()\n      if (!rpc) return undefined\n      e = rpc\n    }\n    const needStat = e.isUnknown() || this.opts.stat\n    return this.matchCheckTest(needStat ? e.lstatSync() : e, ifDir)\n  }\n\n  abstract matchEmit(p: Result): void\n  abstract matchEmit(p: string | Path): void\n\n  matchFinish(e: Path, absolute: boolean) {\n    if (this.#ignored(e)) return\n    const abs =\n      this.opts.absolute === undefined ? absolute : this.opts.absolute\n    this.seen.add(e)\n    const mark = this.opts.mark && e.isDirectory() ? this.#sep : ''\n    // ok, we have what we need!\n    if (this.opts.withFileTypes) {\n      this.matchEmit(e)\n    } else if (abs) {\n      const abs = this.opts.posix ? e.fullpathPosix() : e.fullpath()\n      this.matchEmit(abs + mark)\n    } else {\n      const rel = this.opts.posix ? e.relativePosix() : e.relative()\n      const pre =\n        this.opts.dotRelative && !rel.startsWith('..' + this.#sep)\n          ? '.' + this.#sep\n          : ''\n      this.matchEmit(!rel ? '.' + mark : pre + rel + mark)\n    }\n  }\n\n  async match(e: Path, absolute: boolean, ifDir: boolean): Promise {\n    const p = await this.matchCheck(e, ifDir)\n    if (p) this.matchFinish(p, absolute)\n  }\n\n  matchSync(e: Path, absolute: boolean, ifDir: boolean): void {\n    const p = this.matchCheckSync(e, ifDir)\n    if (p) this.matchFinish(p, absolute)\n  }\n\n  walkCB(target: Path, patterns: Pattern[], cb: () => any) {\n    /* c8 ignore start */\n    if (this.signal?.aborted) cb()\n    /* c8 ignore stop */\n    this.walkCB2(target, patterns, new Processor(this.opts), cb)\n  }\n\n  walkCB2(\n    target: Path,\n    patterns: Pattern[],\n    processor: Processor,\n    cb: () => any\n  ) {\n    if (this.#childrenIgnored(target)) return cb()\n    if (this.signal?.aborted) cb()\n    if (this.paused) {\n      this.onResume(() => this.walkCB2(target, patterns, processor, cb))\n      return\n    }\n    processor.processPatterns(target, patterns)\n\n    // done processing.  all of the above is sync, can be abstracted out.\n    // subwalks is a map of paths to the entry filters they need\n    // matches is a map of paths to [absolute, ifDir] tuples.\n    let tasks = 1\n    const next = () => {\n      if (--tasks === 0) cb()\n    }\n\n    for (const [m, absolute, ifDir] of processor.matches.entries()) {\n      if (this.#ignored(m)) continue\n      tasks++\n      this.match(m, absolute, ifDir).then(() => next())\n    }\n\n    for (const t of processor.subwalkTargets()) {\n      if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) {\n        continue\n      }\n      tasks++\n      const childrenCached = t.readdirCached()\n      if (t.calledReaddir())\n        this.walkCB3(t, childrenCached, processor, next)\n      else {\n        t.readdirCB(\n          (_, entries) => this.walkCB3(t, entries, processor, next),\n          true\n        )\n      }\n    }\n\n    next()\n  }\n\n  walkCB3(\n    target: Path,\n    entries: Path[],\n    processor: Processor,\n    cb: () => any\n  ) {\n    processor = processor.filterEntries(target, entries)\n\n    let tasks = 1\n    const next = () => {\n      if (--tasks === 0) cb()\n    }\n\n    for (const [m, absolute, ifDir] of processor.matches.entries()) {\n      if (this.#ignored(m)) continue\n      tasks++\n      this.match(m, absolute, ifDir).then(() => next())\n    }\n    for (const [target, patterns] of processor.subwalks.entries()) {\n      tasks++\n      this.walkCB2(target, patterns, processor.child(), next)\n    }\n\n    next()\n  }\n\n  walkCBSync(target: Path, patterns: Pattern[], cb: () => any) {\n    /* c8 ignore start */\n    if (this.signal?.aborted) cb()\n    /* c8 ignore stop */\n    this.walkCB2Sync(target, patterns, new Processor(this.opts), cb)\n  }\n\n  walkCB2Sync(\n    target: Path,\n    patterns: Pattern[],\n    processor: Processor,\n    cb: () => any\n  ) {\n    if (this.#childrenIgnored(target)) return cb()\n    if (this.signal?.aborted) cb()\n    if (this.paused) {\n      this.onResume(() =>\n        this.walkCB2Sync(target, patterns, processor, cb)\n      )\n      return\n    }\n    processor.processPatterns(target, patterns)\n\n    // done processing.  all of the above is sync, can be abstracted out.\n    // subwalks is a map of paths to the entry filters they need\n    // matches is a map of paths to [absolute, ifDir] tuples.\n    let tasks = 1\n    const next = () => {\n      if (--tasks === 0) cb()\n    }\n\n    for (const [m, absolute, ifDir] of processor.matches.entries()) {\n      if (this.#ignored(m)) continue\n      this.matchSync(m, absolute, ifDir)\n    }\n\n    for (const t of processor.subwalkTargets()) {\n      if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) {\n        continue\n      }\n      tasks++\n      const children = t.readdirSync()\n      this.walkCB3Sync(t, children, processor, next)\n    }\n\n    next()\n  }\n\n  walkCB3Sync(\n    target: Path,\n    entries: Path[],\n    processor: Processor,\n    cb: () => any\n  ) {\n    processor = processor.filterEntries(target, entries)\n\n    let tasks = 1\n    const next = () => {\n      if (--tasks === 0) cb()\n    }\n\n    for (const [m, absolute, ifDir] of processor.matches.entries()) {\n      if (this.#ignored(m)) continue\n      this.matchSync(m, absolute, ifDir)\n    }\n    for (const [target, patterns] of processor.subwalks.entries()) {\n      tasks++\n      this.walkCB2Sync(target, patterns, processor.child(), next)\n    }\n\n    next()\n  }\n}\n\nexport class GlobWalker<\n  O extends GlobWalkerOpts = GlobWalkerOpts\n> extends GlobUtil {\n  matches: O extends GWOFileTypesTrue\n    ? Set\n    : O extends GWOFileTypesFalse\n    ? Set\n    : O extends GWOFileTypesUnset\n    ? Set\n    : Set\n\n  constructor(patterns: Pattern[], path: Path, opts: O) {\n    super(patterns, path, opts)\n    this.matches = new Set() as Matches\n  }\n\n  matchEmit(e: Result): void\n  matchEmit(e: Path | string): void {\n    this.matches.add(e)\n  }\n\n  async walk(): Promise> {\n    if (this.signal?.aborted) throw this.signal.reason\n    if (this.path.isUnknown()) {\n      await this.path.lstat()\n    }\n    await new Promise((res, rej) => {\n      this.walkCB(this.path, this.patterns, () => {\n        if (this.signal?.aborted) {\n          rej(this.signal.reason)\n        } else {\n          res(this.matches)\n        }\n      })\n    })\n    return this.matches\n  }\n\n  walkSync(): Matches {\n    if (this.signal?.aborted) throw this.signal.reason\n    if (this.path.isUnknown()) {\n      this.path.lstatSync()\n    }\n    // nothing for the callback to do, because this never pauses\n    this.walkCBSync(this.path, this.patterns, () => {\n      if (this.signal?.aborted) throw this.signal.reason\n    })\n    return this.matches\n  }\n}\n\nexport class GlobStream<\n  O extends GlobWalkerOpts = GlobWalkerOpts\n> extends GlobUtil {\n  results: O extends GWOFileTypesTrue\n    ? Minipass\n    : O extends GWOFileTypesFalse\n    ? Minipass\n    : O extends GWOFileTypesUnset\n    ? Minipass\n    : Minipass\n\n  constructor(patterns: Pattern[], path: Path, opts: O) {\n    super(patterns, path, opts)\n    this.results = new Minipass({\n      signal: this.signal,\n      objectMode: true,\n    }) as MatchStream\n    this.results.on('drain', () => this.resume())\n    this.results.on('resume', () => this.resume())\n  }\n\n  matchEmit(e: Result): void\n  matchEmit(e: Path | string): void {\n    this.results.write(e)\n    if (!this.results.flowing) this.pause()\n  }\n\n  stream(): MatchStream {\n    const target = this.path\n    if (target.isUnknown()) {\n      target.lstat().then(() => {\n        this.walkCB(target, this.patterns, () => this.results.end())\n      })\n    } else {\n      this.walkCB(target, this.patterns, () => this.results.end())\n    }\n    return this.results\n  }\n\n  streamSync(): MatchStream {\n    if (this.path.isUnknown()) {\n      this.path.lstatSync()\n    }\n    this.walkCBSync(this.path, this.patterns, () => this.results.end())\n    return this.results\n  }\n}\n"]}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/package.json b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/package.json
    deleted file mode 100644
    index 2d25985d2bbb5d..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob/package.json
    +++ /dev/null
    @@ -1,98 +0,0 @@
    -{
    -  "author": "Isaac Z. Schlueter  (https://blog.izs.me/)",
    -  "name": "glob",
    -  "description": "the most correct and second fastest glob implementation in JavaScript",
    -  "version": "10.3.3",
    -  "bin": "./dist/cjs/src/bin.js",
    -  "repository": {
    -    "type": "git",
    -    "url": "git://github.com/isaacs/node-glob.git"
    -  },
    -  "main": "./dist/cjs/src/index.js",
    -  "module": "./dist/mjs/index.js",
    -  "types": "./dist/mjs/index.d.ts",
    -  "exports": {
    -    ".": {
    -      "import": {
    -        "types": "./dist/mjs/index.d.ts",
    -        "default": "./dist/mjs/index.js"
    -      },
    -      "require": {
    -        "types": "./dist/cjs/src/index.d.ts",
    -        "default": "./dist/cjs/src/index.js"
    -      }
    -    }
    -  },
    -  "files": [
    -    "dist"
    -  ],
    -  "scripts": {
    -    "preversion": "npm test",
    -    "postversion": "npm publish",
    -    "prepublishOnly": "git push origin --follow-tags",
    -    "preprepare": "rm -rf dist",
    -    "prepare": "tsc -p tsconfig.json && tsc -p tsconfig-esm.json && bash fixup.sh",
    -    "pretest": "npm run prepare",
    -    "presnap": "npm run prepare",
    -    "test": "c8 tap",
    -    "snap": "c8 tap",
    -    "format": "prettier --write . --loglevel warn",
    -    "typedoc": "typedoc --tsconfig tsconfig-esm.json ./src/*.ts",
    -    "prepublish": "npm run benchclean",
    -    "profclean": "rm -f v8.log profile.txt",
    -    "test-regen": "npm run profclean && TEST_REGEN=1 node --no-warnings --loader ts-node/esm test/00-setup.ts",
    -    "prebench": "npm run prepare",
    -    "bench": "bash benchmark.sh",
    -    "preprof": "npm run prepare",
    -    "prof": "bash prof.sh",
    -    "benchclean": "node benchclean.js"
    -  },
    -  "prettier": {
    -    "semi": false,
    -    "printWidth": 75,
    -    "tabWidth": 2,
    -    "useTabs": false,
    -    "singleQuote": true,
    -    "jsxSingleQuote": false,
    -    "bracketSameLine": true,
    -    "arrowParens": "avoid",
    -    "endOfLine": "lf"
    -  },
    -  "dependencies": {
    -    "foreground-child": "^3.1.0",
    -    "jackspeak": "^2.0.3",
    -    "minimatch": "^9.0.1",
    -    "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
    -    "path-scurry": "^1.10.1"
    -  },
    -  "devDependencies": {
    -    "@types/node": "^20.3.2",
    -    "@types/tap": "^15.0.7",
    -    "c8": "^7.12.0",
    -    "memfs": "^3.4.13",
    -    "mkdirp": "^2.1.4",
    -    "prettier": "^2.8.3",
    -    "rimraf": "^4.1.3",
    -    "tap": "^16.3.4",
    -    "ts-node": "^10.9.1",
    -    "typedoc": "^0.23.24",
    -    "typescript": "^4.9.4"
    -  },
    -  "tap": {
    -    "before": "test/00-setup.ts",
    -    "coverage": false,
    -    "node-arg": [
    -      "--no-warnings",
    -      "--loader",
    -      "ts-node/esm"
    -    ],
    -    "ts": false
    -  },
    -  "license": "ISC",
    -  "funding": {
    -    "url": "https://github.com/sponsors/isaacs"
    -  },
    -  "engines": {
    -    "node": ">=16 || 14 >=14.17"
    -  }
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/LICENSE
    deleted file mode 100644
    index 1493534e60dce4..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/LICENSE
    +++ /dev/null
    @@ -1,15 +0,0 @@
    -The ISC License
    -
    -Copyright (c) 2011-2023 Isaac Z. Schlueter and Contributors
    -
    -Permission to use, copy, modify, and/or distribute this software for any
    -purpose with or without fee is hereby granted, provided that the above
    -copyright notice and this permission notice appear in all copies.
    -
    -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
    -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/cjs/assert-valid-pattern.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/cjs/assert-valid-pattern.js
    deleted file mode 100644
    index 5fc86bbd0116c9..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/cjs/assert-valid-pattern.js
    +++ /dev/null
    @@ -1,14 +0,0 @@
    -"use strict";
    -Object.defineProperty(exports, "__esModule", { value: true });
    -exports.assertValidPattern = void 0;
    -const MAX_PATTERN_LENGTH = 1024 * 64;
    -const assertValidPattern = (pattern) => {
    -    if (typeof pattern !== 'string') {
    -        throw new TypeError('invalid pattern');
    -    }
    -    if (pattern.length > MAX_PATTERN_LENGTH) {
    -        throw new TypeError('pattern is too long');
    -    }
    -};
    -exports.assertValidPattern = assertValidPattern;
    -//# sourceMappingURL=assert-valid-pattern.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/cjs/ast.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/cjs/ast.js
    deleted file mode 100644
    index 0b0cc8f3c50b3d..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/cjs/ast.js
    +++ /dev/null
    @@ -1,589 +0,0 @@
    -"use strict";
    -// parse a single path portion
    -Object.defineProperty(exports, "__esModule", { value: true });
    -exports.AST = void 0;
    -const brace_expressions_js_1 = require("./brace-expressions.js");
    -const unescape_js_1 = require("./unescape.js");
    -const types = new Set(['!', '?', '+', '*', '@']);
    -const isExtglobType = (c) => types.has(c);
    -// Patterns that get prepended to bind to the start of either the
    -// entire string, or just a single path portion, to prevent dots
    -// and/or traversal patterns, when needed.
    -// Exts don't need the ^ or / bit, because the root binds that already.
    -const startNoTraversal = '(?!(?:^|/)\\.\\.?(?:$|/))';
    -const startNoDot = '(?!\\.)';
    -// characters that indicate a start of pattern needs the "no dots" bit,
    -// because a dot *might* be matched. ( is not in the list, because in
    -// the case of a child extglob, it will handle the prevention itself.
    -const addPatternStart = new Set(['[', '.']);
    -// cases where traversal is A-OK, no dot prevention needed
    -const justDots = new Set(['..', '.']);
    -const reSpecials = new Set('().*{}+?[]^$\\!');
    -const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
    -// any single thing other than /
    -const qmark = '[^/]';
    -// * => any number of characters
    -const star = qmark + '*?';
    -// use + when we need to ensure that *something* matches, because the * is
    -// the only thing in the path portion.
    -const starNoEmpty = qmark + '+?';
    -// remove the \ chars that we added if we end up doing a nonmagic compare
    -// const deslash = (s: string) => s.replace(/\\(.)/g, '$1')
    -class AST {
    -    type;
    -    #root;
    -    #hasMagic;
    -    #uflag = false;
    -    #parts = [];
    -    #parent;
    -    #parentIndex;
    -    #negs;
    -    #filledNegs = false;
    -    #options;
    -    #toString;
    -    // set to true if it's an extglob with no children
    -    // (which really means one child of '')
    -    #emptyExt = false;
    -    constructor(type, parent, options = {}) {
    -        this.type = type;
    -        // extglobs are inherently magical
    -        if (type)
    -            this.#hasMagic = true;
    -        this.#parent = parent;
    -        this.#root = this.#parent ? this.#parent.#root : this;
    -        this.#options = this.#root === this ? options : this.#root.#options;
    -        this.#negs = this.#root === this ? [] : this.#root.#negs;
    -        if (type === '!' && !this.#root.#filledNegs)
    -            this.#negs.push(this);
    -        this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0;
    -    }
    -    get hasMagic() {
    -        /* c8 ignore start */
    -        if (this.#hasMagic !== undefined)
    -            return this.#hasMagic;
    -        /* c8 ignore stop */
    -        for (const p of this.#parts) {
    -            if (typeof p === 'string')
    -                continue;
    -            if (p.type || p.hasMagic)
    -                return (this.#hasMagic = true);
    -        }
    -        // note: will be undefined until we generate the regexp src and find out
    -        return this.#hasMagic;
    -    }
    -    // reconstructs the pattern
    -    toString() {
    -        if (this.#toString !== undefined)
    -            return this.#toString;
    -        if (!this.type) {
    -            return (this.#toString = this.#parts.map(p => String(p)).join(''));
    -        }
    -        else {
    -            return (this.#toString =
    -                this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')');
    -        }
    -    }
    -    #fillNegs() {
    -        /* c8 ignore start */
    -        if (this !== this.#root)
    -            throw new Error('should only call on root');
    -        if (this.#filledNegs)
    -            return this;
    -        /* c8 ignore stop */
    -        // call toString() once to fill this out
    -        this.toString();
    -        this.#filledNegs = true;
    -        let n;
    -        while ((n = this.#negs.pop())) {
    -            if (n.type !== '!')
    -                continue;
    -            // walk up the tree, appending everthing that comes AFTER parentIndex
    -            let p = n;
    -            let pp = p.#parent;
    -            while (pp) {
    -                for (let i = p.#parentIndex + 1; !pp.type && i < pp.#parts.length; i++) {
    -                    for (const part of n.#parts) {
    -                        /* c8 ignore start */
    -                        if (typeof part === 'string') {
    -                            throw new Error('string part in extglob AST??');
    -                        }
    -                        /* c8 ignore stop */
    -                        part.copyIn(pp.#parts[i]);
    -                    }
    -                }
    -                p = pp;
    -                pp = p.#parent;
    -            }
    -        }
    -        return this;
    -    }
    -    push(...parts) {
    -        for (const p of parts) {
    -            if (p === '')
    -                continue;
    -            /* c8 ignore start */
    -            if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) {
    -                throw new Error('invalid part: ' + p);
    -            }
    -            /* c8 ignore stop */
    -            this.#parts.push(p);
    -        }
    -    }
    -    toJSON() {
    -        const ret = this.type === null
    -            ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON()))
    -            : [this.type, ...this.#parts.map(p => p.toJSON())];
    -        if (this.isStart() && !this.type)
    -            ret.unshift([]);
    -        if (this.isEnd() &&
    -            (this === this.#root ||
    -                (this.#root.#filledNegs && this.#parent?.type === '!'))) {
    -            ret.push({});
    -        }
    -        return ret;
    -    }
    -    isStart() {
    -        if (this.#root === this)
    -            return true;
    -        // if (this.type) return !!this.#parent?.isStart()
    -        if (!this.#parent?.isStart())
    -            return false;
    -        if (this.#parentIndex === 0)
    -            return true;
    -        // if everything AHEAD of this is a negation, then it's still the "start"
    -        const p = this.#parent;
    -        for (let i = 0; i < this.#parentIndex; i++) {
    -            const pp = p.#parts[i];
    -            if (!(pp instanceof AST && pp.type === '!')) {
    -                return false;
    -            }
    -        }
    -        return true;
    -    }
    -    isEnd() {
    -        if (this.#root === this)
    -            return true;
    -        if (this.#parent?.type === '!')
    -            return true;
    -        if (!this.#parent?.isEnd())
    -            return false;
    -        if (!this.type)
    -            return this.#parent?.isEnd();
    -        // if not root, it'll always have a parent
    -        /* c8 ignore start */
    -        const pl = this.#parent ? this.#parent.#parts.length : 0;
    -        /* c8 ignore stop */
    -        return this.#parentIndex === pl - 1;
    -    }
    -    copyIn(part) {
    -        if (typeof part === 'string')
    -            this.push(part);
    -        else
    -            this.push(part.clone(this));
    -    }
    -    clone(parent) {
    -        const c = new AST(this.type, parent);
    -        for (const p of this.#parts) {
    -            c.copyIn(p);
    -        }
    -        return c;
    -    }
    -    static #parseAST(str, ast, pos, opt) {
    -        let escaping = false;
    -        let inBrace = false;
    -        let braceStart = -1;
    -        let braceNeg = false;
    -        if (ast.type === null) {
    -            // outside of a extglob, append until we find a start
    -            let i = pos;
    -            let acc = '';
    -            while (i < str.length) {
    -                const c = str.charAt(i++);
    -                // still accumulate escapes at this point, but we do ignore
    -                // starts that are escaped
    -                if (escaping || c === '\\') {
    -                    escaping = !escaping;
    -                    acc += c;
    -                    continue;
    -                }
    -                if (inBrace) {
    -                    if (i === braceStart + 1) {
    -                        if (c === '^' || c === '!') {
    -                            braceNeg = true;
    -                        }
    -                    }
    -                    else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
    -                        inBrace = false;
    -                    }
    -                    acc += c;
    -                    continue;
    -                }
    -                else if (c === '[') {
    -                    inBrace = true;
    -                    braceStart = i;
    -                    braceNeg = false;
    -                    acc += c;
    -                    continue;
    -                }
    -                if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') {
    -                    ast.push(acc);
    -                    acc = '';
    -                    const ext = new AST(c, ast);
    -                    i = AST.#parseAST(str, ext, i, opt);
    -                    ast.push(ext);
    -                    continue;
    -                }
    -                acc += c;
    -            }
    -            ast.push(acc);
    -            return i;
    -        }
    -        // some kind of extglob, pos is at the (
    -        // find the next | or )
    -        let i = pos + 1;
    -        let part = new AST(null, ast);
    -        const parts = [];
    -        let acc = '';
    -        while (i < str.length) {
    -            const c = str.charAt(i++);
    -            // still accumulate escapes at this point, but we do ignore
    -            // starts that are escaped
    -            if (escaping || c === '\\') {
    -                escaping = !escaping;
    -                acc += c;
    -                continue;
    -            }
    -            if (inBrace) {
    -                if (i === braceStart + 1) {
    -                    if (c === '^' || c === '!') {
    -                        braceNeg = true;
    -                    }
    -                }
    -                else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
    -                    inBrace = false;
    -                }
    -                acc += c;
    -                continue;
    -            }
    -            else if (c === '[') {
    -                inBrace = true;
    -                braceStart = i;
    -                braceNeg = false;
    -                acc += c;
    -                continue;
    -            }
    -            if (isExtglobType(c) && str.charAt(i) === '(') {
    -                part.push(acc);
    -                acc = '';
    -                const ext = new AST(c, part);
    -                part.push(ext);
    -                i = AST.#parseAST(str, ext, i, opt);
    -                continue;
    -            }
    -            if (c === '|') {
    -                part.push(acc);
    -                acc = '';
    -                parts.push(part);
    -                part = new AST(null, ast);
    -                continue;
    -            }
    -            if (c === ')') {
    -                if (acc === '' && ast.#parts.length === 0) {
    -                    ast.#emptyExt = true;
    -                }
    -                part.push(acc);
    -                acc = '';
    -                ast.push(...parts, part);
    -                return i;
    -            }
    -            acc += c;
    -        }
    -        // unfinished extglob
    -        // if we got here, it was a malformed extglob! not an extglob, but
    -        // maybe something else in there.
    -        ast.type = null;
    -        ast.#hasMagic = undefined;
    -        ast.#parts = [str.substring(pos - 1)];
    -        return i;
    -    }
    -    static fromGlob(pattern, options = {}) {
    -        const ast = new AST(null, undefined, options);
    -        AST.#parseAST(pattern, ast, 0, options);
    -        return ast;
    -    }
    -    // returns the regular expression if there's magic, or the unescaped
    -    // string if not.
    -    toMMPattern() {
    -        // should only be called on root
    -        /* c8 ignore start */
    -        if (this !== this.#root)
    -            return this.#root.toMMPattern();
    -        /* c8 ignore stop */
    -        const glob = this.toString();
    -        const [re, body, hasMagic, uflag] = this.toRegExpSource();
    -        // if we're in nocase mode, and not nocaseMagicOnly, then we do
    -        // still need a regular expression if we have to case-insensitively
    -        // match capital/lowercase characters.
    -        const anyMagic = hasMagic ||
    -            this.#hasMagic ||
    -            (this.#options.nocase &&
    -                !this.#options.nocaseMagicOnly &&
    -                glob.toUpperCase() !== glob.toLowerCase());
    -        if (!anyMagic) {
    -            return body;
    -        }
    -        const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '');
    -        return Object.assign(new RegExp(`^${re}$`, flags), {
    -            _src: re,
    -            _glob: glob,
    -        });
    -    }
    -    // returns the string match, the regexp source, whether there's magic
    -    // in the regexp (so a regular expression is required) and whether or
    -    // not the uflag is needed for the regular expression (for posix classes)
    -    // TODO: instead of injecting the start/end at this point, just return
    -    // the BODY of the regexp, along with the start/end portions suitable
    -    // for binding the start/end in either a joined full-path makeRe context
    -    // (where we bind to (^|/), or a standalone matchPart context (where
    -    // we bind to ^, and not /).  Otherwise slashes get duped!
    -    //
    -    // In part-matching mode, the start is:
    -    // - if not isStart: nothing
    -    // - if traversal possible, but not allowed: ^(?!\.\.?$)
    -    // - if dots allowed or not possible: ^
    -    // - if dots possible and not allowed: ^(?!\.)
    -    // end is:
    -    // - if not isEnd(): nothing
    -    // - else: $
    -    //
    -    // In full-path matching mode, we put the slash at the START of the
    -    // pattern, so start is:
    -    // - if first pattern: same as part-matching mode
    -    // - if not isStart(): nothing
    -    // - if traversal possible, but not allowed: /(?!\.\.?(?:$|/))
    -    // - if dots allowed or not possible: /
    -    // - if dots possible and not allowed: /(?!\.)
    -    // end is:
    -    // - if last pattern, same as part-matching mode
    -    // - else nothing
    -    //
    -    // Always put the (?:$|/) on negated tails, though, because that has to be
    -    // there to bind the end of the negated pattern portion, and it's easier to
    -    // just stick it in now rather than try to inject it later in the middle of
    -    // the pattern.
    -    //
    -    // We can just always return the same end, and leave it up to the caller
    -    // to know whether it's going to be used joined or in parts.
    -    // And, if the start is adjusted slightly, can do the same there:
    -    // - if not isStart: nothing
    -    // - if traversal possible, but not allowed: (?:/|^)(?!\.\.?$)
    -    // - if dots allowed or not possible: (?:/|^)
    -    // - if dots possible and not allowed: (?:/|^)(?!\.)
    -    //
    -    // But it's better to have a simpler binding without a conditional, for
    -    // performance, so probably better to return both start options.
    -    //
    -    // Then the caller just ignores the end if it's not the first pattern,
    -    // and the start always gets applied.
    -    //
    -    // But that's always going to be $ if it's the ending pattern, or nothing,
    -    // so the caller can just attach $ at the end of the pattern when building.
    -    //
    -    // So the todo is:
    -    // - better detect what kind of start is needed
    -    // - return both flavors of starting pattern
    -    // - attach $ at the end of the pattern when creating the actual RegExp
    -    //
    -    // Ah, but wait, no, that all only applies to the root when the first pattern
    -    // is not an extglob. If the first pattern IS an extglob, then we need all
    -    // that dot prevention biz to live in the extglob portions, because eg
    -    // +(*|.x*) can match .xy but not .yx.
    -    //
    -    // So, return the two flavors if it's #root and the first child is not an
    -    // AST, otherwise leave it to the child AST to handle it, and there,
    -    // use the (?:^|/) style of start binding.
    -    //
    -    // Even simplified further:
    -    // - Since the start for a join is eg /(?!\.) and the start for a part
    -    // is ^(?!\.), we can just prepend (?!\.) to the pattern (either root
    -    // or start or whatever) and prepend ^ or / at the Regexp construction.
    -    toRegExpSource(allowDot) {
    -        const dot = allowDot ?? !!this.#options.dot;
    -        if (this.#root === this)
    -            this.#fillNegs();
    -        if (!this.type) {
    -            const noEmpty = this.isStart() && this.isEnd();
    -            const src = this.#parts
    -                .map(p => {
    -                const [re, _, hasMagic, uflag] = typeof p === 'string'
    -                    ? AST.#parseGlob(p, this.#hasMagic, noEmpty)
    -                    : p.toRegExpSource(allowDot);
    -                this.#hasMagic = this.#hasMagic || hasMagic;
    -                this.#uflag = this.#uflag || uflag;
    -                return re;
    -            })
    -                .join('');
    -            let start = '';
    -            if (this.isStart()) {
    -                if (typeof this.#parts[0] === 'string') {
    -                    // this is the string that will match the start of the pattern,
    -                    // so we need to protect against dots and such.
    -                    // '.' and '..' cannot match unless the pattern is that exactly,
    -                    // even if it starts with . or dot:true is set.
    -                    const dotTravAllowed = this.#parts.length === 1 && justDots.has(this.#parts[0]);
    -                    if (!dotTravAllowed) {
    -                        const aps = addPatternStart;
    -                        // check if we have a possibility of matching . or ..,
    -                        // and prevent that.
    -                        const needNoTrav =
    -                        // dots are allowed, and the pattern starts with [ or .
    -                        (dot && aps.has(src.charAt(0))) ||
    -                            // the pattern starts with \., and then [ or .
    -                            (src.startsWith('\\.') && aps.has(src.charAt(2))) ||
    -                            // the pattern starts with \.\., and then [ or .
    -                            (src.startsWith('\\.\\.') && aps.has(src.charAt(4)));
    -                        // no need to prevent dots if it can't match a dot, or if a
    -                        // sub-pattern will be preventing it anyway.
    -                        const needNoDot = !dot && !allowDot && aps.has(src.charAt(0));
    -                        start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : '';
    -                    }
    -                }
    -            }
    -            // append the "end of path portion" pattern to negation tails
    -            let end = '';
    -            if (this.isEnd() &&
    -                this.#root.#filledNegs &&
    -                this.#parent?.type === '!') {
    -                end = '(?:$|\\/)';
    -            }
    -            const final = start + src + end;
    -            return [
    -                final,
    -                (0, unescape_js_1.unescape)(src),
    -                (this.#hasMagic = !!this.#hasMagic),
    -                this.#uflag,
    -            ];
    -        }
    -        // We need to calculate the body *twice* if it's a repeat pattern
    -        // at the start, once in nodot mode, then again in dot mode, so a
    -        // pattern like *(?) can match 'x.y'
    -        const repeated = this.type === '*' || this.type === '+';
    -        // some kind of extglob
    -        const start = this.type === '!' ? '(?:(?!(?:' : '(?:';
    -        let body = this.#partsToRegExp(dot);
    -        if (this.isStart() && this.isEnd() && !body && this.type !== '!') {
    -            // invalid extglob, has to at least be *something* present, if it's
    -            // the entire path portion.
    -            const s = this.toString();
    -            this.#parts = [s];
    -            this.type = null;
    -            this.#hasMagic = undefined;
    -            return [s, (0, unescape_js_1.unescape)(this.toString()), false, false];
    -        }
    -        // XXX abstract out this map method
    -        let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot
    -            ? ''
    -            : this.#partsToRegExp(true);
    -        if (bodyDotAllowed === body) {
    -            bodyDotAllowed = '';
    -        }
    -        if (bodyDotAllowed) {
    -            body = `(?:${body})(?:${bodyDotAllowed})*?`;
    -        }
    -        // an empty !() is exactly equivalent to a starNoEmpty
    -        let final = '';
    -        if (this.type === '!' && this.#emptyExt) {
    -            final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty;
    -        }
    -        else {
    -            const close = this.type === '!'
    -                ? // !() must match something,but !(x) can match ''
    -                    '))' +
    -                        (this.isStart() && !dot && !allowDot ? startNoDot : '') +
    -                        star +
    -                        ')'
    -                : this.type === '@'
    -                    ? ')'
    -                    : this.type === '?'
    -                        ? ')?'
    -                        : this.type === '+' && bodyDotAllowed
    -                            ? ')'
    -                            : this.type === '*' && bodyDotAllowed
    -                                ? `)?`
    -                                : `)${this.type}`;
    -            final = start + body + close;
    -        }
    -        return [
    -            final,
    -            (0, unescape_js_1.unescape)(body),
    -            (this.#hasMagic = !!this.#hasMagic),
    -            this.#uflag,
    -        ];
    -    }
    -    #partsToRegExp(dot) {
    -        return this.#parts
    -            .map(p => {
    -            // extglob ASTs should only contain parent ASTs
    -            /* c8 ignore start */
    -            if (typeof p === 'string') {
    -                throw new Error('string type in extglob ast??');
    -            }
    -            /* c8 ignore stop */
    -            // can ignore hasMagic, because extglobs are already always magic
    -            const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot);
    -            this.#uflag = this.#uflag || uflag;
    -            return re;
    -        })
    -            .filter(p => !(this.isStart() && this.isEnd()) || !!p)
    -            .join('|');
    -    }
    -    static #parseGlob(glob, hasMagic, noEmpty = false) {
    -        let escaping = false;
    -        let re = '';
    -        let uflag = false;
    -        for (let i = 0; i < glob.length; i++) {
    -            const c = glob.charAt(i);
    -            if (escaping) {
    -                escaping = false;
    -                re += (reSpecials.has(c) ? '\\' : '') + c;
    -                continue;
    -            }
    -            if (c === '\\') {
    -                if (i === glob.length - 1) {
    -                    re += '\\\\';
    -                }
    -                else {
    -                    escaping = true;
    -                }
    -                continue;
    -            }
    -            if (c === '[') {
    -                const [src, needUflag, consumed, magic] = (0, brace_expressions_js_1.parseClass)(glob, i);
    -                if (consumed) {
    -                    re += src;
    -                    uflag = uflag || needUflag;
    -                    i += consumed - 1;
    -                    hasMagic = hasMagic || magic;
    -                    continue;
    -                }
    -            }
    -            if (c === '*') {
    -                if (noEmpty && glob === '*')
    -                    re += starNoEmpty;
    -                else
    -                    re += star;
    -                hasMagic = true;
    -                continue;
    -            }
    -            if (c === '?') {
    -                re += qmark;
    -                hasMagic = true;
    -                continue;
    -            }
    -            re += regExpEscape(c);
    -        }
    -        return [re, (0, unescape_js_1.unescape)(glob), !!hasMagic, uflag];
    -    }
    -}
    -exports.AST = AST;
    -//# sourceMappingURL=ast.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/cjs/brace-expressions.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/cjs/brace-expressions.js
    deleted file mode 100644
    index 0e13eefc4cfee2..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/cjs/brace-expressions.js
    +++ /dev/null
    @@ -1,152 +0,0 @@
    -"use strict";
    -// translate the various posix character classes into unicode properties
    -// this works across all unicode locales
    -Object.defineProperty(exports, "__esModule", { value: true });
    -exports.parseClass = void 0;
    -// { : [, /u flag required, negated]
    -const posixClasses = {
    -    '[:alnum:]': ['\\p{L}\\p{Nl}\\p{Nd}', true],
    -    '[:alpha:]': ['\\p{L}\\p{Nl}', true],
    -    '[:ascii:]': ['\\x' + '00-\\x' + '7f', false],
    -    '[:blank:]': ['\\p{Zs}\\t', true],
    -    '[:cntrl:]': ['\\p{Cc}', true],
    -    '[:digit:]': ['\\p{Nd}', true],
    -    '[:graph:]': ['\\p{Z}\\p{C}', true, true],
    -    '[:lower:]': ['\\p{Ll}', true],
    -    '[:print:]': ['\\p{C}', true],
    -    '[:punct:]': ['\\p{P}', true],
    -    '[:space:]': ['\\p{Z}\\t\\r\\n\\v\\f', true],
    -    '[:upper:]': ['\\p{Lu}', true],
    -    '[:word:]': ['\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}', true],
    -    '[:xdigit:]': ['A-Fa-f0-9', false],
    -};
    -// only need to escape a few things inside of brace expressions
    -// escapes: [ \ ] -
    -const braceEscape = (s) => s.replace(/[[\]\\-]/g, '\\$&');
    -// escape all regexp magic characters
    -const regexpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
    -// everything has already been escaped, we just have to join
    -const rangesToString = (ranges) => ranges.join('');
    -// takes a glob string at a posix brace expression, and returns
    -// an equivalent regular expression source, and boolean indicating
    -// whether the /u flag needs to be applied, and the number of chars
    -// consumed to parse the character class.
    -// This also removes out of order ranges, and returns ($.) if the
    -// entire class just no good.
    -const parseClass = (glob, position) => {
    -    const pos = position;
    -    /* c8 ignore start */
    -    if (glob.charAt(pos) !== '[') {
    -        throw new Error('not in a brace expression');
    -    }
    -    /* c8 ignore stop */
    -    const ranges = [];
    -    const negs = [];
    -    let i = pos + 1;
    -    let sawStart = false;
    -    let uflag = false;
    -    let escaping = false;
    -    let negate = false;
    -    let endPos = pos;
    -    let rangeStart = '';
    -    WHILE: while (i < glob.length) {
    -        const c = glob.charAt(i);
    -        if ((c === '!' || c === '^') && i === pos + 1) {
    -            negate = true;
    -            i++;
    -            continue;
    -        }
    -        if (c === ']' && sawStart && !escaping) {
    -            endPos = i + 1;
    -            break;
    -        }
    -        sawStart = true;
    -        if (c === '\\') {
    -            if (!escaping) {
    -                escaping = true;
    -                i++;
    -                continue;
    -            }
    -            // escaped \ char, fall through and treat like normal char
    -        }
    -        if (c === '[' && !escaping) {
    -            // either a posix class, a collation equivalent, or just a [
    -            for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {
    -                if (glob.startsWith(cls, i)) {
    -                    // invalid, [a-[] is fine, but not [a-[:alpha]]
    -                    if (rangeStart) {
    -                        return ['$.', false, glob.length - pos, true];
    -                    }
    -                    i += cls.length;
    -                    if (neg)
    -                        negs.push(unip);
    -                    else
    -                        ranges.push(unip);
    -                    uflag = uflag || u;
    -                    continue WHILE;
    -                }
    -            }
    -        }
    -        // now it's just a normal character, effectively
    -        escaping = false;
    -        if (rangeStart) {
    -            // throw this range away if it's not valid, but others
    -            // can still match.
    -            if (c > rangeStart) {
    -                ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c));
    -            }
    -            else if (c === rangeStart) {
    -                ranges.push(braceEscape(c));
    -            }
    -            rangeStart = '';
    -            i++;
    -            continue;
    -        }
    -        // now might be the start of a range.
    -        // can be either c-d or c-] or c] or c] at this point
    -        if (glob.startsWith('-]', i + 1)) {
    -            ranges.push(braceEscape(c + '-'));
    -            i += 2;
    -            continue;
    -        }
    -        if (glob.startsWith('-', i + 1)) {
    -            rangeStart = c;
    -            i += 2;
    -            continue;
    -        }
    -        // not the start of a range, just a single character
    -        ranges.push(braceEscape(c));
    -        i++;
    -    }
    -    if (endPos < i) {
    -        // didn't see the end of the class, not a valid class,
    -        // but might still be valid as a literal match.
    -        return ['', false, 0, false];
    -    }
    -    // if we got no ranges and no negates, then we have a range that
    -    // cannot possibly match anything, and that poisons the whole glob
    -    if (!ranges.length && !negs.length) {
    -        return ['$.', false, glob.length - pos, true];
    -    }
    -    // if we got one positive range, and it's a single character, then that's
    -    // not actually a magic pattern, it's just that one literal character.
    -    // we should not treat that as "magic", we should just return the literal
    -    // character. [_] is a perfectly valid way to escape glob magic chars.
    -    if (negs.length === 0 &&
    -        ranges.length === 1 &&
    -        /^\\?.$/.test(ranges[0]) &&
    -        !negate) {
    -        const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0];
    -        return [regexpEscape(r), false, endPos - pos, false];
    -    }
    -    const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']';
    -    const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']';
    -    const comb = ranges.length && negs.length
    -        ? '(' + sranges + '|' + snegs + ')'
    -        : ranges.length
    -            ? sranges
    -            : snegs;
    -    return [comb, uflag, endPos - pos, true];
    -};
    -exports.parseClass = parseClass;
    -//# sourceMappingURL=brace-expressions.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/cjs/escape.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/cjs/escape.js
    deleted file mode 100644
    index 02a4f8a8e0a588..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/cjs/escape.js
    +++ /dev/null
    @@ -1,22 +0,0 @@
    -"use strict";
    -Object.defineProperty(exports, "__esModule", { value: true });
    -exports.escape = void 0;
    -/**
    - * Escape all magic characters in a glob pattern.
    - *
    - * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape}
    - * option is used, then characters are escaped by wrapping in `[]`, because
    - * a magic character wrapped in a character class can only be satisfied by
    - * that exact character.  In this mode, `\` is _not_ escaped, because it is
    - * not interpreted as a magic character, but instead as a path separator.
    - */
    -const escape = (s, { windowsPathsNoEscape = false, } = {}) => {
    -    // don't need to escape +@! because we escape the parens
    -    // that make those magic, and escaping ! as [!] isn't valid,
    -    // because [!]] is a valid glob class meaning not ']'.
    -    return windowsPathsNoEscape
    -        ? s.replace(/[?*()[\]]/g, '[$&]')
    -        : s.replace(/[?*()[\]\\]/g, '\\$&');
    -};
    -exports.escape = escape;
    -//# sourceMappingURL=escape.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/cjs/index.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/cjs/index.js
    deleted file mode 100644
    index d70e681fef5d7d..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/cjs/index.js
    +++ /dev/null
    @@ -1,1011 +0,0 @@
    -"use strict";
    -var __importDefault = (this && this.__importDefault) || function (mod) {
    -    return (mod && mod.__esModule) ? mod : { "default": mod };
    -};
    -Object.defineProperty(exports, "__esModule", { value: true });
    -exports.unescape = exports.escape = exports.AST = exports.Minimatch = exports.match = exports.makeRe = exports.braceExpand = exports.defaults = exports.filter = exports.GLOBSTAR = exports.sep = exports.minimatch = void 0;
    -const brace_expansion_1 = __importDefault(require("brace-expansion"));
    -const assert_valid_pattern_js_1 = require("./assert-valid-pattern.js");
    -const ast_js_1 = require("./ast.js");
    -const escape_js_1 = require("./escape.js");
    -const unescape_js_1 = require("./unescape.js");
    -const minimatch = (p, pattern, options = {}) => {
    -    (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
    -    // shortcut: comments match nothing.
    -    if (!options.nocomment && pattern.charAt(0) === '#') {
    -        return false;
    -    }
    -    return new Minimatch(pattern, options).match(p);
    -};
    -exports.minimatch = minimatch;
    -// Optimized checking for the most common glob patterns.
    -const starDotExtRE = /^\*+([^+@!?\*\[\(]*)$/;
    -const starDotExtTest = (ext) => (f) => !f.startsWith('.') && f.endsWith(ext);
    -const starDotExtTestDot = (ext) => (f) => f.endsWith(ext);
    -const starDotExtTestNocase = (ext) => {
    -    ext = ext.toLowerCase();
    -    return (f) => !f.startsWith('.') && f.toLowerCase().endsWith(ext);
    -};
    -const starDotExtTestNocaseDot = (ext) => {
    -    ext = ext.toLowerCase();
    -    return (f) => f.toLowerCase().endsWith(ext);
    -};
    -const starDotStarRE = /^\*+\.\*+$/;
    -const starDotStarTest = (f) => !f.startsWith('.') && f.includes('.');
    -const starDotStarTestDot = (f) => f !== '.' && f !== '..' && f.includes('.');
    -const dotStarRE = /^\.\*+$/;
    -const dotStarTest = (f) => f !== '.' && f !== '..' && f.startsWith('.');
    -const starRE = /^\*+$/;
    -const starTest = (f) => f.length !== 0 && !f.startsWith('.');
    -const starTestDot = (f) => f.length !== 0 && f !== '.' && f !== '..';
    -const qmarksRE = /^\?+([^+@!?\*\[\(]*)?$/;
    -const qmarksTestNocase = ([$0, ext = '']) => {
    -    const noext = qmarksTestNoExt([$0]);
    -    if (!ext)
    -        return noext;
    -    ext = ext.toLowerCase();
    -    return (f) => noext(f) && f.toLowerCase().endsWith(ext);
    -};
    -const qmarksTestNocaseDot = ([$0, ext = '']) => {
    -    const noext = qmarksTestNoExtDot([$0]);
    -    if (!ext)
    -        return noext;
    -    ext = ext.toLowerCase();
    -    return (f) => noext(f) && f.toLowerCase().endsWith(ext);
    -};
    -const qmarksTestDot = ([$0, ext = '']) => {
    -    const noext = qmarksTestNoExtDot([$0]);
    -    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);
    -};
    -const qmarksTest = ([$0, ext = '']) => {
    -    const noext = qmarksTestNoExt([$0]);
    -    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);
    -};
    -const qmarksTestNoExt = ([$0]) => {
    -    const len = $0.length;
    -    return (f) => f.length === len && !f.startsWith('.');
    -};
    -const qmarksTestNoExtDot = ([$0]) => {
    -    const len = $0.length;
    -    return (f) => f.length === len && f !== '.' && f !== '..';
    -};
    -/* c8 ignore start */
    -const defaultPlatform = (typeof process === 'object' && process
    -    ? (typeof process.env === 'object' &&
    -        process.env &&
    -        process.env.__MINIMATCH_TESTING_PLATFORM__) ||
    -        process.platform
    -    : 'posix');
    -const path = {
    -    win32: { sep: '\\' },
    -    posix: { sep: '/' },
    -};
    -/* c8 ignore stop */
    -exports.sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep;
    -exports.minimatch.sep = exports.sep;
    -exports.GLOBSTAR = Symbol('globstar **');
    -exports.minimatch.GLOBSTAR = exports.GLOBSTAR;
    -// any single thing other than /
    -// don't need to escape / when using new RegExp()
    -const qmark = '[^/]';
    -// * => any number of characters
    -const star = qmark + '*?';
    -// ** when dots are allowed.  Anything goes, except .. and .
    -// not (^ or / followed by one or two dots followed by $ or /),
    -// followed by anything, any number of times.
    -const twoStarDot = '(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?';
    -// not a ^ or / followed by a dot,
    -// followed by anything, any number of times.
    -const twoStarNoDot = '(?:(?!(?:\\/|^)\\.).)*?';
    -const filter = (pattern, options = {}) => (p) => (0, exports.minimatch)(p, pattern, options);
    -exports.filter = filter;
    -exports.minimatch.filter = exports.filter;
    -const ext = (a, b = {}) => Object.assign({}, a, b);
    -const defaults = (def) => {
    -    if (!def || typeof def !== 'object' || !Object.keys(def).length) {
    -        return exports.minimatch;
    -    }
    -    const orig = exports.minimatch;
    -    const m = (p, pattern, options = {}) => orig(p, pattern, ext(def, options));
    -    return Object.assign(m, {
    -        Minimatch: class Minimatch extends orig.Minimatch {
    -            constructor(pattern, options = {}) {
    -                super(pattern, ext(def, options));
    -            }
    -            static defaults(options) {
    -                return orig.defaults(ext(def, options)).Minimatch;
    -            }
    -        },
    -        AST: class AST extends orig.AST {
    -            /* c8 ignore start */
    -            constructor(type, parent, options = {}) {
    -                super(type, parent, ext(def, options));
    -            }
    -            /* c8 ignore stop */
    -            static fromGlob(pattern, options = {}) {
    -                return orig.AST.fromGlob(pattern, ext(def, options));
    -            }
    -        },
    -        unescape: (s, options = {}) => orig.unescape(s, ext(def, options)),
    -        escape: (s, options = {}) => orig.escape(s, ext(def, options)),
    -        filter: (pattern, options = {}) => orig.filter(pattern, ext(def, options)),
    -        defaults: (options) => orig.defaults(ext(def, options)),
    -        makeRe: (pattern, options = {}) => orig.makeRe(pattern, ext(def, options)),
    -        braceExpand: (pattern, options = {}) => orig.braceExpand(pattern, ext(def, options)),
    -        match: (list, pattern, options = {}) => orig.match(list, pattern, ext(def, options)),
    -        sep: orig.sep,
    -        GLOBSTAR: exports.GLOBSTAR,
    -    });
    -};
    -exports.defaults = defaults;
    -exports.minimatch.defaults = exports.defaults;
    -// Brace expansion:
    -// a{b,c}d -> abd acd
    -// a{b,}c -> abc ac
    -// a{0..3}d -> a0d a1d a2d a3d
    -// a{b,c{d,e}f}g -> abg acdfg acefg
    -// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
    -//
    -// Invalid sets are not expanded.
    -// a{2..}b -> a{2..}b
    -// a{b}c -> a{b}c
    -const braceExpand = (pattern, options = {}) => {
    -    (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
    -    // Thanks to Yeting Li  for
    -    // improving this regexp to avoid a ReDOS vulnerability.
    -    if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
    -        // shortcut. no need to expand.
    -        return [pattern];
    -    }
    -    return (0, brace_expansion_1.default)(pattern);
    -};
    -exports.braceExpand = braceExpand;
    -exports.minimatch.braceExpand = exports.braceExpand;
    -// parse a component of the expanded set.
    -// At this point, no pattern may contain "/" in it
    -// so we're going to return a 2d array, where each entry is the full
    -// pattern, split on '/', and then turned into a regular expression.
    -// A regexp is made at the end which joins each array with an
    -// escaped /, and another full one which joins each regexp with |.
    -//
    -// Following the lead of Bash 4.1, note that "**" only has special meaning
    -// when it is the *only* thing in a path portion.  Otherwise, any series
    -// of * is equivalent to a single *.  Globstar behavior is enabled by
    -// default, and can be disabled by setting options.noglobstar.
    -const makeRe = (pattern, options = {}) => new Minimatch(pattern, options).makeRe();
    -exports.makeRe = makeRe;
    -exports.minimatch.makeRe = exports.makeRe;
    -const match = (list, pattern, options = {}) => {
    -    const mm = new Minimatch(pattern, options);
    -    list = list.filter(f => mm.match(f));
    -    if (mm.options.nonull && !list.length) {
    -        list.push(pattern);
    -    }
    -    return list;
    -};
    -exports.match = match;
    -exports.minimatch.match = exports.match;
    -// replace stuff like \* with *
    -const globMagic = /[?*]|[+@!]\(.*?\)|\[|\]/;
    -const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
    -class Minimatch {
    -    options;
    -    set;
    -    pattern;
    -    windowsPathsNoEscape;
    -    nonegate;
    -    negate;
    -    comment;
    -    empty;
    -    preserveMultipleSlashes;
    -    partial;
    -    globSet;
    -    globParts;
    -    nocase;
    -    isWindows;
    -    platform;
    -    windowsNoMagicRoot;
    -    regexp;
    -    constructor(pattern, options = {}) {
    -        (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
    -        options = options || {};
    -        this.options = options;
    -        this.pattern = pattern;
    -        this.platform = options.platform || defaultPlatform;
    -        this.isWindows = this.platform === 'win32';
    -        this.windowsPathsNoEscape =
    -            !!options.windowsPathsNoEscape || options.allowWindowsEscape === false;
    -        if (this.windowsPathsNoEscape) {
    -            this.pattern = this.pattern.replace(/\\/g, '/');
    -        }
    -        this.preserveMultipleSlashes = !!options.preserveMultipleSlashes;
    -        this.regexp = null;
    -        this.negate = false;
    -        this.nonegate = !!options.nonegate;
    -        this.comment = false;
    -        this.empty = false;
    -        this.partial = !!options.partial;
    -        this.nocase = !!this.options.nocase;
    -        this.windowsNoMagicRoot =
    -            options.windowsNoMagicRoot !== undefined
    -                ? options.windowsNoMagicRoot
    -                : !!(this.isWindows && this.nocase);
    -        this.globSet = [];
    -        this.globParts = [];
    -        this.set = [];
    -        // make the set of regexps etc.
    -        this.make();
    -    }
    -    hasMagic() {
    -        if (this.options.magicalBraces && this.set.length > 1) {
    -            return true;
    -        }
    -        for (const pattern of this.set) {
    -            for (const part of pattern) {
    -                if (typeof part !== 'string')
    -                    return true;
    -            }
    -        }
    -        return false;
    -    }
    -    debug(..._) { }
    -    make() {
    -        const pattern = this.pattern;
    -        const options = this.options;
    -        // empty patterns and comments match nothing.
    -        if (!options.nocomment && pattern.charAt(0) === '#') {
    -            this.comment = true;
    -            return;
    -        }
    -        if (!pattern) {
    -            this.empty = true;
    -            return;
    -        }
    -        // step 1: figure out negation, etc.
    -        this.parseNegate();
    -        // step 2: expand braces
    -        this.globSet = [...new Set(this.braceExpand())];
    -        if (options.debug) {
    -            this.debug = (...args) => console.error(...args);
    -        }
    -        this.debug(this.pattern, this.globSet);
    -        // step 3: now we have a set, so turn each one into a series of
    -        // path-portion matching patterns.
    -        // These will be regexps, except in the case of "**", which is
    -        // set to the GLOBSTAR object for globstar behavior,
    -        // and will not contain any / characters
    -        //
    -        // First, we preprocess to make the glob pattern sets a bit simpler
    -        // and deduped.  There are some perf-killing patterns that can cause
    -        // problems with a glob walk, but we can simplify them down a bit.
    -        const rawGlobParts = this.globSet.map(s => this.slashSplit(s));
    -        this.globParts = this.preprocess(rawGlobParts);
    -        this.debug(this.pattern, this.globParts);
    -        // glob --> regexps
    -        let set = this.globParts.map((s, _, __) => {
    -            if (this.isWindows && this.windowsNoMagicRoot) {
    -                // check if it's a drive or unc path.
    -                const isUNC = s[0] === '' &&
    -                    s[1] === '' &&
    -                    (s[2] === '?' || !globMagic.test(s[2])) &&
    -                    !globMagic.test(s[3]);
    -                const isDrive = /^[a-z]:/i.test(s[0]);
    -                if (isUNC) {
    -                    return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))];
    -                }
    -                else if (isDrive) {
    -                    return [s[0], ...s.slice(1).map(ss => this.parse(ss))];
    -                }
    -            }
    -            return s.map(ss => this.parse(ss));
    -        });
    -        this.debug(this.pattern, set);
    -        // filter out everything that didn't compile properly.
    -        this.set = set.filter(s => s.indexOf(false) === -1);
    -        // do not treat the ? in UNC paths as magic
    -        if (this.isWindows) {
    -            for (let i = 0; i < this.set.length; i++) {
    -                const p = this.set[i];
    -                if (p[0] === '' &&
    -                    p[1] === '' &&
    -                    this.globParts[i][2] === '?' &&
    -                    typeof p[3] === 'string' &&
    -                    /^[a-z]:$/i.test(p[3])) {
    -                    p[2] = '?';
    -                }
    -            }
    -        }
    -        this.debug(this.pattern, this.set);
    -    }
    -    // various transforms to equivalent pattern sets that are
    -    // faster to process in a filesystem walk.  The goal is to
    -    // eliminate what we can, and push all ** patterns as far
    -    // to the right as possible, even if it increases the number
    -    // of patterns that we have to process.
    -    preprocess(globParts) {
    -        // if we're not in globstar mode, then turn all ** into *
    -        if (this.options.noglobstar) {
    -            for (let i = 0; i < globParts.length; i++) {
    -                for (let j = 0; j < globParts[i].length; j++) {
    -                    if (globParts[i][j] === '**') {
    -                        globParts[i][j] = '*';
    -                    }
    -                }
    -            }
    -        }
    -        const { optimizationLevel = 1 } = this.options;
    -        if (optimizationLevel >= 2) {
    -            // aggressive optimization for the purpose of fs walking
    -            globParts = this.firstPhasePreProcess(globParts);
    -            globParts = this.secondPhasePreProcess(globParts);
    -        }
    -        else if (optimizationLevel >= 1) {
    -            // just basic optimizations to remove some .. parts
    -            globParts = this.levelOneOptimize(globParts);
    -        }
    -        else {
    -            globParts = this.adjascentGlobstarOptimize(globParts);
    -        }
    -        return globParts;
    -    }
    -    // just get rid of adjascent ** portions
    -    adjascentGlobstarOptimize(globParts) {
    -        return globParts.map(parts => {
    -            let gs = -1;
    -            while (-1 !== (gs = parts.indexOf('**', gs + 1))) {
    -                let i = gs;
    -                while (parts[i + 1] === '**') {
    -                    i++;
    -                }
    -                if (i !== gs) {
    -                    parts.splice(gs, i - gs);
    -                }
    -            }
    -            return parts;
    -        });
    -    }
    -    // get rid of adjascent ** and resolve .. portions
    -    levelOneOptimize(globParts) {
    -        return globParts.map(parts => {
    -            parts = parts.reduce((set, part) => {
    -                const prev = set[set.length - 1];
    -                if (part === '**' && prev === '**') {
    -                    return set;
    -                }
    -                if (part === '..') {
    -                    if (prev && prev !== '..' && prev !== '.' && prev !== '**') {
    -                        set.pop();
    -                        return set;
    -                    }
    -                }
    -                set.push(part);
    -                return set;
    -            }, []);
    -            return parts.length === 0 ? [''] : parts;
    -        });
    -    }
    -    levelTwoFileOptimize(parts) {
    -        if (!Array.isArray(parts)) {
    -            parts = this.slashSplit(parts);
    -        }
    -        let didSomething = false;
    -        do {
    -            didSomething = false;
    -            // 
    // -> 
    /
    -            if (!this.preserveMultipleSlashes) {
    -                for (let i = 1; i < parts.length - 1; i++) {
    -                    const p = parts[i];
    -                    // don't squeeze out UNC patterns
    -                    if (i === 1 && p === '' && parts[0] === '')
    -                        continue;
    -                    if (p === '.' || p === '') {
    -                        didSomething = true;
    -                        parts.splice(i, 1);
    -                        i--;
    -                    }
    -                }
    -                if (parts[0] === '.' &&
    -                    parts.length === 2 &&
    -                    (parts[1] === '.' || parts[1] === '')) {
    -                    didSomething = true;
    -                    parts.pop();
    -                }
    -            }
    -            // 
    /

    /../ ->

    /
    -            let dd = 0;
    -            while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
    -                const p = parts[dd - 1];
    -                if (p && p !== '.' && p !== '..' && p !== '**') {
    -                    didSomething = true;
    -                    parts.splice(dd - 1, 2);
    -                    dd -= 2;
    -                }
    -            }
    -        } while (didSomething);
    -        return parts.length === 0 ? [''] : parts;
    -    }
    -    // First phase: single-pattern processing
    -    // 
     is 1 or more portions
    -    //  is 1 or more portions
    -    // 

    is any portion other than ., .., '', or ** - // is . or '' - // - // **/.. is *brutal* for filesystem walking performance, because - // it effectively resets the recursive walk each time it occurs, - // and ** cannot be reduced out by a .. pattern part like a regexp - // or most strings (other than .., ., and '') can be. - // - //

    /**/../

    /

    / -> {

    /../

    /

    /,

    /**/

    /

    /} - //

    // -> 
    /
    -    // 
    /

    /../ ->

    /
    -    // **/**/ -> **/
    -    //
    -    // **/*/ -> */**/ <== not valid because ** doesn't follow
    -    // this WOULD be allowed if ** did follow symlinks, or * didn't
    -    firstPhasePreProcess(globParts) {
    -        let didSomething = false;
    -        do {
    -            didSomething = false;
    -            // 
    /**/../

    /

    / -> {

    /../

    /

    /,

    /**/

    /

    /} - for (let parts of globParts) { - let gs = -1; - while (-1 !== (gs = parts.indexOf('**', gs + 1))) { - let gss = gs; - while (parts[gss + 1] === '**') { - //

    /**/**/ -> 
    /**/
    -                        gss++;
    -                    }
    -                    // eg, if gs is 2 and gss is 4, that means we have 3 **
    -                    // parts, and can remove 2 of them.
    -                    if (gss > gs) {
    -                        parts.splice(gs + 1, gss - gs);
    -                    }
    -                    let next = parts[gs + 1];
    -                    const p = parts[gs + 2];
    -                    const p2 = parts[gs + 3];
    -                    if (next !== '..')
    -                        continue;
    -                    if (!p ||
    -                        p === '.' ||
    -                        p === '..' ||
    -                        !p2 ||
    -                        p2 === '.' ||
    -                        p2 === '..') {
    -                        continue;
    -                    }
    -                    didSomething = true;
    -                    // edit parts in place, and push the new one
    -                    parts.splice(gs, 1);
    -                    const other = parts.slice(0);
    -                    other[gs] = '**';
    -                    globParts.push(other);
    -                    gs--;
    -                }
    -                // 
    // -> 
    /
    -                if (!this.preserveMultipleSlashes) {
    -                    for (let i = 1; i < parts.length - 1; i++) {
    -                        const p = parts[i];
    -                        // don't squeeze out UNC patterns
    -                        if (i === 1 && p === '' && parts[0] === '')
    -                            continue;
    -                        if (p === '.' || p === '') {
    -                            didSomething = true;
    -                            parts.splice(i, 1);
    -                            i--;
    -                        }
    -                    }
    -                    if (parts[0] === '.' &&
    -                        parts.length === 2 &&
    -                        (parts[1] === '.' || parts[1] === '')) {
    -                        didSomething = true;
    -                        parts.pop();
    -                    }
    -                }
    -                // 
    /

    /../ ->

    /
    -                let dd = 0;
    -                while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
    -                    const p = parts[dd - 1];
    -                    if (p && p !== '.' && p !== '..' && p !== '**') {
    -                        didSomething = true;
    -                        const needDot = dd === 1 && parts[dd + 1] === '**';
    -                        const splin = needDot ? ['.'] : [];
    -                        parts.splice(dd - 1, 2, ...splin);
    -                        if (parts.length === 0)
    -                            parts.push('');
    -                        dd -= 2;
    -                    }
    -                }
    -            }
    -        } while (didSomething);
    -        return globParts;
    -    }
    -    // second phase: multi-pattern dedupes
    -    // {
    /*/,
    /

    /} ->

    /*/
    -    // {
    /,
    /} -> 
    /
    -    // {
    /**/,
    /} -> 
    /**/
    -    //
    -    // {
    /**/,
    /**/

    /} ->

    /**/
    -    // ^-- not valid because ** doens't follow symlinks
    -    secondPhasePreProcess(globParts) {
    -        for (let i = 0; i < globParts.length - 1; i++) {
    -            for (let j = i + 1; j < globParts.length; j++) {
    -                const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes);
    -                if (!matched)
    -                    continue;
    -                globParts[i] = matched;
    -                globParts[j] = [];
    -            }
    -        }
    -        return globParts.filter(gs => gs.length);
    -    }
    -    partsMatch(a, b, emptyGSMatch = false) {
    -        let ai = 0;
    -        let bi = 0;
    -        let result = [];
    -        let which = '';
    -        while (ai < a.length && bi < b.length) {
    -            if (a[ai] === b[bi]) {
    -                result.push(which === 'b' ? b[bi] : a[ai]);
    -                ai++;
    -                bi++;
    -            }
    -            else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {
    -                result.push(a[ai]);
    -                ai++;
    -            }
    -            else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {
    -                result.push(b[bi]);
    -                bi++;
    -            }
    -            else if (a[ai] === '*' &&
    -                b[bi] &&
    -                (this.options.dot || !b[bi].startsWith('.')) &&
    -                b[bi] !== '**') {
    -                if (which === 'b')
    -                    return false;
    -                which = 'a';
    -                result.push(a[ai]);
    -                ai++;
    -                bi++;
    -            }
    -            else if (b[bi] === '*' &&
    -                a[ai] &&
    -                (this.options.dot || !a[ai].startsWith('.')) &&
    -                a[ai] !== '**') {
    -                if (which === 'a')
    -                    return false;
    -                which = 'b';
    -                result.push(b[bi]);
    -                ai++;
    -                bi++;
    -            }
    -            else {
    -                return false;
    -            }
    -        }
    -        // if we fall out of the loop, it means they two are identical
    -        // as long as their lengths match
    -        return a.length === b.length && result;
    -    }
    -    parseNegate() {
    -        if (this.nonegate)
    -            return;
    -        const pattern = this.pattern;
    -        let negate = false;
    -        let negateOffset = 0;
    -        for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {
    -            negate = !negate;
    -            negateOffset++;
    -        }
    -        if (negateOffset)
    -            this.pattern = pattern.slice(negateOffset);
    -        this.negate = negate;
    -    }
    -    // set partial to true to test if, for example,
    -    // "/a/b" matches the start of "/*/b/*/d"
    -    // Partial means, if you run out of file before you run
    -    // out of pattern, then that's fine, as long as all
    -    // the parts match.
    -    matchOne(file, pattern, partial = false) {
    -        const options = this.options;
    -        // UNC paths like //?/X:/... can match X:/... and vice versa
    -        // Drive letters in absolute drive or unc paths are always compared
    -        // case-insensitively.
    -        if (this.isWindows) {
    -            const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0]);
    -            const fileUNC = !fileDrive &&
    -                file[0] === '' &&
    -                file[1] === '' &&
    -                file[2] === '?' &&
    -                /^[a-z]:$/i.test(file[3]);
    -            const patternDrive = typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0]);
    -            const patternUNC = !patternDrive &&
    -                pattern[0] === '' &&
    -                pattern[1] === '' &&
    -                pattern[2] === '?' &&
    -                typeof pattern[3] === 'string' &&
    -                /^[a-z]:$/i.test(pattern[3]);
    -            const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined;
    -            const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined;
    -            if (typeof fdi === 'number' && typeof pdi === 'number') {
    -                const [fd, pd] = [file[fdi], pattern[pdi]];
    -                if (fd.toLowerCase() === pd.toLowerCase()) {
    -                    pattern[pdi] = fd;
    -                    if (pdi > fdi) {
    -                        pattern = pattern.slice(pdi);
    -                    }
    -                    else if (fdi > pdi) {
    -                        file = file.slice(fdi);
    -                    }
    -                }
    -            }
    -        }
    -        // resolve and reduce . and .. portions in the file as well.
    -        // dont' need to do the second phase, because it's only one string[]
    -        const { optimizationLevel = 1 } = this.options;
    -        if (optimizationLevel >= 2) {
    -            file = this.levelTwoFileOptimize(file);
    -        }
    -        this.debug('matchOne', this, { file, pattern });
    -        this.debug('matchOne', file.length, pattern.length);
    -        for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) {
    -            this.debug('matchOne loop');
    -            var p = pattern[pi];
    -            var f = file[fi];
    -            this.debug(pattern, p, f);
    -            // should be impossible.
    -            // some invalid regexp stuff in the set.
    -            /* c8 ignore start */
    -            if (p === false) {
    -                return false;
    -            }
    -            /* c8 ignore stop */
    -            if (p === exports.GLOBSTAR) {
    -                this.debug('GLOBSTAR', [pattern, p, f]);
    -                // "**"
    -                // a/**/b/**/c would match the following:
    -                // a/b/x/y/z/c
    -                // a/x/y/z/b/c
    -                // a/b/x/b/x/c
    -                // a/b/c
    -                // To do this, take the rest of the pattern after
    -                // the **, and see if it would match the file remainder.
    -                // If so, return success.
    -                // If not, the ** "swallows" a segment, and try again.
    -                // This is recursively awful.
    -                //
    -                // a/**/b/**/c matching a/b/x/y/z/c
    -                // - a matches a
    -                // - doublestar
    -                //   - matchOne(b/x/y/z/c, b/**/c)
    -                //     - b matches b
    -                //     - doublestar
    -                //       - matchOne(x/y/z/c, c) -> no
    -                //       - matchOne(y/z/c, c) -> no
    -                //       - matchOne(z/c, c) -> no
    -                //       - matchOne(c, c) yes, hit
    -                var fr = fi;
    -                var pr = pi + 1;
    -                if (pr === pl) {
    -                    this.debug('** at the end');
    -                    // a ** at the end will just swallow the rest.
    -                    // We have found a match.
    -                    // however, it will not swallow /.x, unless
    -                    // options.dot is set.
    -                    // . and .. are *never* matched by **, for explosively
    -                    // exponential reasons.
    -                    for (; fi < fl; fi++) {
    -                        if (file[fi] === '.' ||
    -                            file[fi] === '..' ||
    -                            (!options.dot && file[fi].charAt(0) === '.'))
    -                            return false;
    -                    }
    -                    return true;
    -                }
    -                // ok, let's see if we can swallow whatever we can.
    -                while (fr < fl) {
    -                    var swallowee = file[fr];
    -                    this.debug('\nglobstar while', file, fr, pattern, pr, swallowee);
    -                    // XXX remove this slice.  Just pass the start index.
    -                    if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
    -                        this.debug('globstar found match!', fr, fl, swallowee);
    -                        // found a match.
    -                        return true;
    -                    }
    -                    else {
    -                        // can't swallow "." or ".." ever.
    -                        // can only swallow ".foo" when explicitly asked.
    -                        if (swallowee === '.' ||
    -                            swallowee === '..' ||
    -                            (!options.dot && swallowee.charAt(0) === '.')) {
    -                            this.debug('dot detected!', file, fr, pattern, pr);
    -                            break;
    -                        }
    -                        // ** swallows a segment, and continue.
    -                        this.debug('globstar swallow a segment, and continue');
    -                        fr++;
    -                    }
    -                }
    -                // no match was found.
    -                // However, in partial mode, we can't say this is necessarily over.
    -                /* c8 ignore start */
    -                if (partial) {
    -                    // ran out of file
    -                    this.debug('\n>>> no match, partial?', file, fr, pattern, pr);
    -                    if (fr === fl) {
    -                        return true;
    -                    }
    -                }
    -                /* c8 ignore stop */
    -                return false;
    -            }
    -            // something other than **
    -            // non-magic patterns just have to match exactly
    -            // patterns with magic have been turned into regexps.
    -            let hit;
    -            if (typeof p === 'string') {
    -                hit = f === p;
    -                this.debug('string match', p, f, hit);
    -            }
    -            else {
    -                hit = p.test(f);
    -                this.debug('pattern match', p, f, hit);
    -            }
    -            if (!hit)
    -                return false;
    -        }
    -        // Note: ending in / means that we'll get a final ""
    -        // at the end of the pattern.  This can only match a
    -        // corresponding "" at the end of the file.
    -        // If the file ends in /, then it can only match a
    -        // a pattern that ends in /, unless the pattern just
    -        // doesn't have any more for it. But, a/b/ should *not*
    -        // match "a/b/*", even though "" matches against the
    -        // [^/]*? pattern, except in partial mode, where it might
    -        // simply not be reached yet.
    -        // However, a/b/ should still satisfy a/*
    -        // now either we fell off the end of the pattern, or we're done.
    -        if (fi === fl && pi === pl) {
    -            // ran out of pattern and filename at the same time.
    -            // an exact hit!
    -            return true;
    -        }
    -        else if (fi === fl) {
    -            // ran out of file, but still had pattern left.
    -            // this is ok if we're doing the match as part of
    -            // a glob fs traversal.
    -            return partial;
    -        }
    -        else if (pi === pl) {
    -            // ran out of pattern, still have file left.
    -            // this is only acceptable if we're on the very last
    -            // empty segment of a file with a trailing slash.
    -            // a/* should match a/b/
    -            return fi === fl - 1 && file[fi] === '';
    -            /* c8 ignore start */
    -        }
    -        else {
    -            // should be unreachable.
    -            throw new Error('wtf?');
    -        }
    -        /* c8 ignore stop */
    -    }
    -    braceExpand() {
    -        return (0, exports.braceExpand)(this.pattern, this.options);
    -    }
    -    parse(pattern) {
    -        (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
    -        const options = this.options;
    -        // shortcuts
    -        if (pattern === '**')
    -            return exports.GLOBSTAR;
    -        if (pattern === '')
    -            return '';
    -        // far and away, the most common glob pattern parts are
    -        // *, *.*, and *.  Add a fast check method for those.
    -        let m;
    -        let fastTest = null;
    -        if ((m = pattern.match(starRE))) {
    -            fastTest = options.dot ? starTestDot : starTest;
    -        }
    -        else if ((m = pattern.match(starDotExtRE))) {
    -            fastTest = (options.nocase
    -                ? options.dot
    -                    ? starDotExtTestNocaseDot
    -                    : starDotExtTestNocase
    -                : options.dot
    -                    ? starDotExtTestDot
    -                    : starDotExtTest)(m[1]);
    -        }
    -        else if ((m = pattern.match(qmarksRE))) {
    -            fastTest = (options.nocase
    -                ? options.dot
    -                    ? qmarksTestNocaseDot
    -                    : qmarksTestNocase
    -                : options.dot
    -                    ? qmarksTestDot
    -                    : qmarksTest)(m);
    -        }
    -        else if ((m = pattern.match(starDotStarRE))) {
    -            fastTest = options.dot ? starDotStarTestDot : starDotStarTest;
    -        }
    -        else if ((m = pattern.match(dotStarRE))) {
    -            fastTest = dotStarTest;
    -        }
    -        const re = ast_js_1.AST.fromGlob(pattern, this.options).toMMPattern();
    -        return fastTest ? Object.assign(re, { test: fastTest }) : re;
    -    }
    -    makeRe() {
    -        if (this.regexp || this.regexp === false)
    -            return this.regexp;
    -        // at this point, this.set is a 2d array of partial
    -        // pattern strings, or "**".
    -        //
    -        // It's better to use .match().  This function shouldn't
    -        // be used, really, but it's pretty convenient sometimes,
    -        // when you just want to work with a regex.
    -        const set = this.set;
    -        if (!set.length) {
    -            this.regexp = false;
    -            return this.regexp;
    -        }
    -        const options = this.options;
    -        const twoStar = options.noglobstar
    -            ? star
    -            : options.dot
    -                ? twoStarDot
    -                : twoStarNoDot;
    -        const flags = new Set(options.nocase ? ['i'] : []);
    -        // regexpify non-globstar patterns
    -        // if ** is only item, then we just do one twoStar
    -        // if ** is first, and there are more, prepend (\/|twoStar\/)? to next
    -        // if ** is last, append (\/twoStar|) to previous
    -        // if ** is in the middle, append (\/|\/twoStar\/) to previous
    -        // then filter out GLOBSTAR symbols
    -        let re = set
    -            .map(pattern => {
    -            const pp = pattern.map(p => {
    -                if (p instanceof RegExp) {
    -                    for (const f of p.flags.split(''))
    -                        flags.add(f);
    -                }
    -                return typeof p === 'string'
    -                    ? regExpEscape(p)
    -                    : p === exports.GLOBSTAR
    -                        ? exports.GLOBSTAR
    -                        : p._src;
    -            });
    -            pp.forEach((p, i) => {
    -                const next = pp[i + 1];
    -                const prev = pp[i - 1];
    -                if (p !== exports.GLOBSTAR || prev === exports.GLOBSTAR) {
    -                    return;
    -                }
    -                if (prev === undefined) {
    -                    if (next !== undefined && next !== exports.GLOBSTAR) {
    -                        pp[i + 1] = '(?:\\/|' + twoStar + '\\/)?' + next;
    -                    }
    -                    else {
    -                        pp[i] = twoStar;
    -                    }
    -                }
    -                else if (next === undefined) {
    -                    pp[i - 1] = prev + '(?:\\/|' + twoStar + ')?';
    -                }
    -                else if (next !== exports.GLOBSTAR) {
    -                    pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + '\\/)' + next;
    -                    pp[i + 1] = exports.GLOBSTAR;
    -                }
    -            });
    -            return pp.filter(p => p !== exports.GLOBSTAR).join('/');
    -        })
    -            .join('|');
    -        // need to wrap in parens if we had more than one thing with |,
    -        // otherwise only the first will be anchored to ^ and the last to $
    -        const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', ''];
    -        // must match entire pattern
    -        // ending in a * or ** will make it less strict.
    -        re = '^' + open + re + close + '$';
    -        // can match anything, as long as it's not this.
    -        if (this.negate)
    -            re = '^(?!' + re + ').+$';
    -        try {
    -            this.regexp = new RegExp(re, [...flags].join(''));
    -            /* c8 ignore start */
    -        }
    -        catch (ex) {
    -            // should be impossible
    -            this.regexp = false;
    -        }
    -        /* c8 ignore stop */
    -        return this.regexp;
    -    }
    -    slashSplit(p) {
    -        // if p starts with // on windows, we preserve that
    -        // so that UNC paths aren't broken.  Otherwise, any number of
    -        // / characters are coalesced into one, unless
    -        // preserveMultipleSlashes is set to true.
    -        if (this.preserveMultipleSlashes) {
    -            return p.split('/');
    -        }
    -        else if (this.isWindows && /^\/\/[^\/]+/.test(p)) {
    -            // add an extra '' for the one we lose
    -            return ['', ...p.split(/\/+/)];
    -        }
    -        else {
    -            return p.split(/\/+/);
    -        }
    -    }
    -    match(f, partial = this.partial) {
    -        this.debug('match', f, this.pattern);
    -        // short-circuit in the case of busted things.
    -        // comments, etc.
    -        if (this.comment) {
    -            return false;
    -        }
    -        if (this.empty) {
    -            return f === '';
    -        }
    -        if (f === '/' && partial) {
    -            return true;
    -        }
    -        const options = this.options;
    -        // windows: need to use /, not \
    -        if (this.isWindows) {
    -            f = f.split('\\').join('/');
    -        }
    -        // treat the test path as a set of pathparts.
    -        const ff = this.slashSplit(f);
    -        this.debug(this.pattern, 'split', ff);
    -        // just ONE of the pattern sets in this.set needs to match
    -        // in order for it to be valid.  If negating, then just one
    -        // match means that we have failed.
    -        // Either way, return on the first hit.
    -        const set = this.set;
    -        this.debug(this.pattern, 'set', set);
    -        // Find the basename of the path by looking for the last non-empty segment
    -        let filename = ff[ff.length - 1];
    -        if (!filename) {
    -            for (let i = ff.length - 2; !filename && i >= 0; i--) {
    -                filename = ff[i];
    -            }
    -        }
    -        for (let i = 0; i < set.length; i++) {
    -            const pattern = set[i];
    -            let file = ff;
    -            if (options.matchBase && pattern.length === 1) {
    -                file = [filename];
    -            }
    -            const hit = this.matchOne(file, pattern, partial);
    -            if (hit) {
    -                if (options.flipNegate) {
    -                    return true;
    -                }
    -                return !this.negate;
    -            }
    -        }
    -        // didn't get any hits.  this is success if it's a negative
    -        // pattern, failure otherwise.
    -        if (options.flipNegate) {
    -            return false;
    -        }
    -        return this.negate;
    -    }
    -    static defaults(def) {
    -        return exports.minimatch.defaults(def).Minimatch;
    -    }
    -}
    -exports.Minimatch = Minimatch;
    -/* c8 ignore start */
    -var ast_js_2 = require("./ast.js");
    -Object.defineProperty(exports, "AST", { enumerable: true, get: function () { return ast_js_2.AST; } });
    -var escape_js_2 = require("./escape.js");
    -Object.defineProperty(exports, "escape", { enumerable: true, get: function () { return escape_js_2.escape; } });
    -var unescape_js_2 = require("./unescape.js");
    -Object.defineProperty(exports, "unescape", { enumerable: true, get: function () { return unescape_js_2.unescape; } });
    -/* c8 ignore stop */
    -exports.minimatch.AST = ast_js_1.AST;
    -exports.minimatch.Minimatch = Minimatch;
    -exports.minimatch.escape = escape_js_1.escape;
    -exports.minimatch.unescape = unescape_js_1.unescape;
    -//# sourceMappingURL=index.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/cjs/package.json b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/cjs/package.json
    deleted file mode 100644
    index 5bbefffbabee39..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/cjs/package.json
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -{
    -  "type": "commonjs"
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/cjs/unescape.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/cjs/unescape.js
    deleted file mode 100644
    index 47c36bcee5a02a..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/cjs/unescape.js
    +++ /dev/null
    @@ -1,24 +0,0 @@
    -"use strict";
    -Object.defineProperty(exports, "__esModule", { value: true });
    -exports.unescape = void 0;
    -/**
    - * Un-escape a string that has been escaped with {@link escape}.
    - *
    - * If the {@link windowsPathsNoEscape} option is used, then square-brace
    - * escapes are removed, but not backslash escapes.  For example, it will turn
    - * the string `'[*]'` into `*`, but it will not turn `'\\*'` into `'*'`,
    - * becuase `\` is a path separator in `windowsPathsNoEscape` mode.
    - *
    - * When `windowsPathsNoEscape` is not set, then both brace escapes and
    - * backslash escapes are removed.
    - *
    - * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
    - * or unescaped.
    - */
    -const unescape = (s, { windowsPathsNoEscape = false, } = {}) => {
    -    return windowsPathsNoEscape
    -        ? s.replace(/\[([^\/\\])\]/g, '$1')
    -        : s.replace(/((?!\\).|^)\[([^\/\\])\]/g, '$1$2').replace(/\\([^\/])/g, '$1');
    -};
    -exports.unescape = unescape;
    -//# sourceMappingURL=unescape.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/mjs/assert-valid-pattern.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/mjs/assert-valid-pattern.js
    deleted file mode 100644
    index 7b534fc30200bb..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/mjs/assert-valid-pattern.js
    +++ /dev/null
    @@ -1,10 +0,0 @@
    -const MAX_PATTERN_LENGTH = 1024 * 64;
    -export const assertValidPattern = (pattern) => {
    -    if (typeof pattern !== 'string') {
    -        throw new TypeError('invalid pattern');
    -    }
    -    if (pattern.length > MAX_PATTERN_LENGTH) {
    -        throw new TypeError('pattern is too long');
    -    }
    -};
    -//# sourceMappingURL=assert-valid-pattern.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/mjs/ast.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/mjs/ast.js
    deleted file mode 100644
    index 7fb1f83e6182a0..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/mjs/ast.js
    +++ /dev/null
    @@ -1,585 +0,0 @@
    -// parse a single path portion
    -import { parseClass } from './brace-expressions.js';
    -import { unescape } from './unescape.js';
    -const types = new Set(['!', '?', '+', '*', '@']);
    -const isExtglobType = (c) => types.has(c);
    -// Patterns that get prepended to bind to the start of either the
    -// entire string, or just a single path portion, to prevent dots
    -// and/or traversal patterns, when needed.
    -// Exts don't need the ^ or / bit, because the root binds that already.
    -const startNoTraversal = '(?!(?:^|/)\\.\\.?(?:$|/))';
    -const startNoDot = '(?!\\.)';
    -// characters that indicate a start of pattern needs the "no dots" bit,
    -// because a dot *might* be matched. ( is not in the list, because in
    -// the case of a child extglob, it will handle the prevention itself.
    -const addPatternStart = new Set(['[', '.']);
    -// cases where traversal is A-OK, no dot prevention needed
    -const justDots = new Set(['..', '.']);
    -const reSpecials = new Set('().*{}+?[]^$\\!');
    -const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
    -// any single thing other than /
    -const qmark = '[^/]';
    -// * => any number of characters
    -const star = qmark + '*?';
    -// use + when we need to ensure that *something* matches, because the * is
    -// the only thing in the path portion.
    -const starNoEmpty = qmark + '+?';
    -// remove the \ chars that we added if we end up doing a nonmagic compare
    -// const deslash = (s: string) => s.replace(/\\(.)/g, '$1')
    -export class AST {
    -    type;
    -    #root;
    -    #hasMagic;
    -    #uflag = false;
    -    #parts = [];
    -    #parent;
    -    #parentIndex;
    -    #negs;
    -    #filledNegs = false;
    -    #options;
    -    #toString;
    -    // set to true if it's an extglob with no children
    -    // (which really means one child of '')
    -    #emptyExt = false;
    -    constructor(type, parent, options = {}) {
    -        this.type = type;
    -        // extglobs are inherently magical
    -        if (type)
    -            this.#hasMagic = true;
    -        this.#parent = parent;
    -        this.#root = this.#parent ? this.#parent.#root : this;
    -        this.#options = this.#root === this ? options : this.#root.#options;
    -        this.#negs = this.#root === this ? [] : this.#root.#negs;
    -        if (type === '!' && !this.#root.#filledNegs)
    -            this.#negs.push(this);
    -        this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0;
    -    }
    -    get hasMagic() {
    -        /* c8 ignore start */
    -        if (this.#hasMagic !== undefined)
    -            return this.#hasMagic;
    -        /* c8 ignore stop */
    -        for (const p of this.#parts) {
    -            if (typeof p === 'string')
    -                continue;
    -            if (p.type || p.hasMagic)
    -                return (this.#hasMagic = true);
    -        }
    -        // note: will be undefined until we generate the regexp src and find out
    -        return this.#hasMagic;
    -    }
    -    // reconstructs the pattern
    -    toString() {
    -        if (this.#toString !== undefined)
    -            return this.#toString;
    -        if (!this.type) {
    -            return (this.#toString = this.#parts.map(p => String(p)).join(''));
    -        }
    -        else {
    -            return (this.#toString =
    -                this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')');
    -        }
    -    }
    -    #fillNegs() {
    -        /* c8 ignore start */
    -        if (this !== this.#root)
    -            throw new Error('should only call on root');
    -        if (this.#filledNegs)
    -            return this;
    -        /* c8 ignore stop */
    -        // call toString() once to fill this out
    -        this.toString();
    -        this.#filledNegs = true;
    -        let n;
    -        while ((n = this.#negs.pop())) {
    -            if (n.type !== '!')
    -                continue;
    -            // walk up the tree, appending everthing that comes AFTER parentIndex
    -            let p = n;
    -            let pp = p.#parent;
    -            while (pp) {
    -                for (let i = p.#parentIndex + 1; !pp.type && i < pp.#parts.length; i++) {
    -                    for (const part of n.#parts) {
    -                        /* c8 ignore start */
    -                        if (typeof part === 'string') {
    -                            throw new Error('string part in extglob AST??');
    -                        }
    -                        /* c8 ignore stop */
    -                        part.copyIn(pp.#parts[i]);
    -                    }
    -                }
    -                p = pp;
    -                pp = p.#parent;
    -            }
    -        }
    -        return this;
    -    }
    -    push(...parts) {
    -        for (const p of parts) {
    -            if (p === '')
    -                continue;
    -            /* c8 ignore start */
    -            if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) {
    -                throw new Error('invalid part: ' + p);
    -            }
    -            /* c8 ignore stop */
    -            this.#parts.push(p);
    -        }
    -    }
    -    toJSON() {
    -        const ret = this.type === null
    -            ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON()))
    -            : [this.type, ...this.#parts.map(p => p.toJSON())];
    -        if (this.isStart() && !this.type)
    -            ret.unshift([]);
    -        if (this.isEnd() &&
    -            (this === this.#root ||
    -                (this.#root.#filledNegs && this.#parent?.type === '!'))) {
    -            ret.push({});
    -        }
    -        return ret;
    -    }
    -    isStart() {
    -        if (this.#root === this)
    -            return true;
    -        // if (this.type) return !!this.#parent?.isStart()
    -        if (!this.#parent?.isStart())
    -            return false;
    -        if (this.#parentIndex === 0)
    -            return true;
    -        // if everything AHEAD of this is a negation, then it's still the "start"
    -        const p = this.#parent;
    -        for (let i = 0; i < this.#parentIndex; i++) {
    -            const pp = p.#parts[i];
    -            if (!(pp instanceof AST && pp.type === '!')) {
    -                return false;
    -            }
    -        }
    -        return true;
    -    }
    -    isEnd() {
    -        if (this.#root === this)
    -            return true;
    -        if (this.#parent?.type === '!')
    -            return true;
    -        if (!this.#parent?.isEnd())
    -            return false;
    -        if (!this.type)
    -            return this.#parent?.isEnd();
    -        // if not root, it'll always have a parent
    -        /* c8 ignore start */
    -        const pl = this.#parent ? this.#parent.#parts.length : 0;
    -        /* c8 ignore stop */
    -        return this.#parentIndex === pl - 1;
    -    }
    -    copyIn(part) {
    -        if (typeof part === 'string')
    -            this.push(part);
    -        else
    -            this.push(part.clone(this));
    -    }
    -    clone(parent) {
    -        const c = new AST(this.type, parent);
    -        for (const p of this.#parts) {
    -            c.copyIn(p);
    -        }
    -        return c;
    -    }
    -    static #parseAST(str, ast, pos, opt) {
    -        let escaping = false;
    -        let inBrace = false;
    -        let braceStart = -1;
    -        let braceNeg = false;
    -        if (ast.type === null) {
    -            // outside of a extglob, append until we find a start
    -            let i = pos;
    -            let acc = '';
    -            while (i < str.length) {
    -                const c = str.charAt(i++);
    -                // still accumulate escapes at this point, but we do ignore
    -                // starts that are escaped
    -                if (escaping || c === '\\') {
    -                    escaping = !escaping;
    -                    acc += c;
    -                    continue;
    -                }
    -                if (inBrace) {
    -                    if (i === braceStart + 1) {
    -                        if (c === '^' || c === '!') {
    -                            braceNeg = true;
    -                        }
    -                    }
    -                    else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
    -                        inBrace = false;
    -                    }
    -                    acc += c;
    -                    continue;
    -                }
    -                else if (c === '[') {
    -                    inBrace = true;
    -                    braceStart = i;
    -                    braceNeg = false;
    -                    acc += c;
    -                    continue;
    -                }
    -                if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') {
    -                    ast.push(acc);
    -                    acc = '';
    -                    const ext = new AST(c, ast);
    -                    i = AST.#parseAST(str, ext, i, opt);
    -                    ast.push(ext);
    -                    continue;
    -                }
    -                acc += c;
    -            }
    -            ast.push(acc);
    -            return i;
    -        }
    -        // some kind of extglob, pos is at the (
    -        // find the next | or )
    -        let i = pos + 1;
    -        let part = new AST(null, ast);
    -        const parts = [];
    -        let acc = '';
    -        while (i < str.length) {
    -            const c = str.charAt(i++);
    -            // still accumulate escapes at this point, but we do ignore
    -            // starts that are escaped
    -            if (escaping || c === '\\') {
    -                escaping = !escaping;
    -                acc += c;
    -                continue;
    -            }
    -            if (inBrace) {
    -                if (i === braceStart + 1) {
    -                    if (c === '^' || c === '!') {
    -                        braceNeg = true;
    -                    }
    -                }
    -                else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
    -                    inBrace = false;
    -                }
    -                acc += c;
    -                continue;
    -            }
    -            else if (c === '[') {
    -                inBrace = true;
    -                braceStart = i;
    -                braceNeg = false;
    -                acc += c;
    -                continue;
    -            }
    -            if (isExtglobType(c) && str.charAt(i) === '(') {
    -                part.push(acc);
    -                acc = '';
    -                const ext = new AST(c, part);
    -                part.push(ext);
    -                i = AST.#parseAST(str, ext, i, opt);
    -                continue;
    -            }
    -            if (c === '|') {
    -                part.push(acc);
    -                acc = '';
    -                parts.push(part);
    -                part = new AST(null, ast);
    -                continue;
    -            }
    -            if (c === ')') {
    -                if (acc === '' && ast.#parts.length === 0) {
    -                    ast.#emptyExt = true;
    -                }
    -                part.push(acc);
    -                acc = '';
    -                ast.push(...parts, part);
    -                return i;
    -            }
    -            acc += c;
    -        }
    -        // unfinished extglob
    -        // if we got here, it was a malformed extglob! not an extglob, but
    -        // maybe something else in there.
    -        ast.type = null;
    -        ast.#hasMagic = undefined;
    -        ast.#parts = [str.substring(pos - 1)];
    -        return i;
    -    }
    -    static fromGlob(pattern, options = {}) {
    -        const ast = new AST(null, undefined, options);
    -        AST.#parseAST(pattern, ast, 0, options);
    -        return ast;
    -    }
    -    // returns the regular expression if there's magic, or the unescaped
    -    // string if not.
    -    toMMPattern() {
    -        // should only be called on root
    -        /* c8 ignore start */
    -        if (this !== this.#root)
    -            return this.#root.toMMPattern();
    -        /* c8 ignore stop */
    -        const glob = this.toString();
    -        const [re, body, hasMagic, uflag] = this.toRegExpSource();
    -        // if we're in nocase mode, and not nocaseMagicOnly, then we do
    -        // still need a regular expression if we have to case-insensitively
    -        // match capital/lowercase characters.
    -        const anyMagic = hasMagic ||
    -            this.#hasMagic ||
    -            (this.#options.nocase &&
    -                !this.#options.nocaseMagicOnly &&
    -                glob.toUpperCase() !== glob.toLowerCase());
    -        if (!anyMagic) {
    -            return body;
    -        }
    -        const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '');
    -        return Object.assign(new RegExp(`^${re}$`, flags), {
    -            _src: re,
    -            _glob: glob,
    -        });
    -    }
    -    // returns the string match, the regexp source, whether there's magic
    -    // in the regexp (so a regular expression is required) and whether or
    -    // not the uflag is needed for the regular expression (for posix classes)
    -    // TODO: instead of injecting the start/end at this point, just return
    -    // the BODY of the regexp, along with the start/end portions suitable
    -    // for binding the start/end in either a joined full-path makeRe context
    -    // (where we bind to (^|/), or a standalone matchPart context (where
    -    // we bind to ^, and not /).  Otherwise slashes get duped!
    -    //
    -    // In part-matching mode, the start is:
    -    // - if not isStart: nothing
    -    // - if traversal possible, but not allowed: ^(?!\.\.?$)
    -    // - if dots allowed or not possible: ^
    -    // - if dots possible and not allowed: ^(?!\.)
    -    // end is:
    -    // - if not isEnd(): nothing
    -    // - else: $
    -    //
    -    // In full-path matching mode, we put the slash at the START of the
    -    // pattern, so start is:
    -    // - if first pattern: same as part-matching mode
    -    // - if not isStart(): nothing
    -    // - if traversal possible, but not allowed: /(?!\.\.?(?:$|/))
    -    // - if dots allowed or not possible: /
    -    // - if dots possible and not allowed: /(?!\.)
    -    // end is:
    -    // - if last pattern, same as part-matching mode
    -    // - else nothing
    -    //
    -    // Always put the (?:$|/) on negated tails, though, because that has to be
    -    // there to bind the end of the negated pattern portion, and it's easier to
    -    // just stick it in now rather than try to inject it later in the middle of
    -    // the pattern.
    -    //
    -    // We can just always return the same end, and leave it up to the caller
    -    // to know whether it's going to be used joined or in parts.
    -    // And, if the start is adjusted slightly, can do the same there:
    -    // - if not isStart: nothing
    -    // - if traversal possible, but not allowed: (?:/|^)(?!\.\.?$)
    -    // - if dots allowed or not possible: (?:/|^)
    -    // - if dots possible and not allowed: (?:/|^)(?!\.)
    -    //
    -    // But it's better to have a simpler binding without a conditional, for
    -    // performance, so probably better to return both start options.
    -    //
    -    // Then the caller just ignores the end if it's not the first pattern,
    -    // and the start always gets applied.
    -    //
    -    // But that's always going to be $ if it's the ending pattern, or nothing,
    -    // so the caller can just attach $ at the end of the pattern when building.
    -    //
    -    // So the todo is:
    -    // - better detect what kind of start is needed
    -    // - return both flavors of starting pattern
    -    // - attach $ at the end of the pattern when creating the actual RegExp
    -    //
    -    // Ah, but wait, no, that all only applies to the root when the first pattern
    -    // is not an extglob. If the first pattern IS an extglob, then we need all
    -    // that dot prevention biz to live in the extglob portions, because eg
    -    // +(*|.x*) can match .xy but not .yx.
    -    //
    -    // So, return the two flavors if it's #root and the first child is not an
    -    // AST, otherwise leave it to the child AST to handle it, and there,
    -    // use the (?:^|/) style of start binding.
    -    //
    -    // Even simplified further:
    -    // - Since the start for a join is eg /(?!\.) and the start for a part
    -    // is ^(?!\.), we can just prepend (?!\.) to the pattern (either root
    -    // or start or whatever) and prepend ^ or / at the Regexp construction.
    -    toRegExpSource(allowDot) {
    -        const dot = allowDot ?? !!this.#options.dot;
    -        if (this.#root === this)
    -            this.#fillNegs();
    -        if (!this.type) {
    -            const noEmpty = this.isStart() && this.isEnd();
    -            const src = this.#parts
    -                .map(p => {
    -                const [re, _, hasMagic, uflag] = typeof p === 'string'
    -                    ? AST.#parseGlob(p, this.#hasMagic, noEmpty)
    -                    : p.toRegExpSource(allowDot);
    -                this.#hasMagic = this.#hasMagic || hasMagic;
    -                this.#uflag = this.#uflag || uflag;
    -                return re;
    -            })
    -                .join('');
    -            let start = '';
    -            if (this.isStart()) {
    -                if (typeof this.#parts[0] === 'string') {
    -                    // this is the string that will match the start of the pattern,
    -                    // so we need to protect against dots and such.
    -                    // '.' and '..' cannot match unless the pattern is that exactly,
    -                    // even if it starts with . or dot:true is set.
    -                    const dotTravAllowed = this.#parts.length === 1 && justDots.has(this.#parts[0]);
    -                    if (!dotTravAllowed) {
    -                        const aps = addPatternStart;
    -                        // check if we have a possibility of matching . or ..,
    -                        // and prevent that.
    -                        const needNoTrav =
    -                        // dots are allowed, and the pattern starts with [ or .
    -                        (dot && aps.has(src.charAt(0))) ||
    -                            // the pattern starts with \., and then [ or .
    -                            (src.startsWith('\\.') && aps.has(src.charAt(2))) ||
    -                            // the pattern starts with \.\., and then [ or .
    -                            (src.startsWith('\\.\\.') && aps.has(src.charAt(4)));
    -                        // no need to prevent dots if it can't match a dot, or if a
    -                        // sub-pattern will be preventing it anyway.
    -                        const needNoDot = !dot && !allowDot && aps.has(src.charAt(0));
    -                        start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : '';
    -                    }
    -                }
    -            }
    -            // append the "end of path portion" pattern to negation tails
    -            let end = '';
    -            if (this.isEnd() &&
    -                this.#root.#filledNegs &&
    -                this.#parent?.type === '!') {
    -                end = '(?:$|\\/)';
    -            }
    -            const final = start + src + end;
    -            return [
    -                final,
    -                unescape(src),
    -                (this.#hasMagic = !!this.#hasMagic),
    -                this.#uflag,
    -            ];
    -        }
    -        // We need to calculate the body *twice* if it's a repeat pattern
    -        // at the start, once in nodot mode, then again in dot mode, so a
    -        // pattern like *(?) can match 'x.y'
    -        const repeated = this.type === '*' || this.type === '+';
    -        // some kind of extglob
    -        const start = this.type === '!' ? '(?:(?!(?:' : '(?:';
    -        let body = this.#partsToRegExp(dot);
    -        if (this.isStart() && this.isEnd() && !body && this.type !== '!') {
    -            // invalid extglob, has to at least be *something* present, if it's
    -            // the entire path portion.
    -            const s = this.toString();
    -            this.#parts = [s];
    -            this.type = null;
    -            this.#hasMagic = undefined;
    -            return [s, unescape(this.toString()), false, false];
    -        }
    -        // XXX abstract out this map method
    -        let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot
    -            ? ''
    -            : this.#partsToRegExp(true);
    -        if (bodyDotAllowed === body) {
    -            bodyDotAllowed = '';
    -        }
    -        if (bodyDotAllowed) {
    -            body = `(?:${body})(?:${bodyDotAllowed})*?`;
    -        }
    -        // an empty !() is exactly equivalent to a starNoEmpty
    -        let final = '';
    -        if (this.type === '!' && this.#emptyExt) {
    -            final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty;
    -        }
    -        else {
    -            const close = this.type === '!'
    -                ? // !() must match something,but !(x) can match ''
    -                    '))' +
    -                        (this.isStart() && !dot && !allowDot ? startNoDot : '') +
    -                        star +
    -                        ')'
    -                : this.type === '@'
    -                    ? ')'
    -                    : this.type === '?'
    -                        ? ')?'
    -                        : this.type === '+' && bodyDotAllowed
    -                            ? ')'
    -                            : this.type === '*' && bodyDotAllowed
    -                                ? `)?`
    -                                : `)${this.type}`;
    -            final = start + body + close;
    -        }
    -        return [
    -            final,
    -            unescape(body),
    -            (this.#hasMagic = !!this.#hasMagic),
    -            this.#uflag,
    -        ];
    -    }
    -    #partsToRegExp(dot) {
    -        return this.#parts
    -            .map(p => {
    -            // extglob ASTs should only contain parent ASTs
    -            /* c8 ignore start */
    -            if (typeof p === 'string') {
    -                throw new Error('string type in extglob ast??');
    -            }
    -            /* c8 ignore stop */
    -            // can ignore hasMagic, because extglobs are already always magic
    -            const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot);
    -            this.#uflag = this.#uflag || uflag;
    -            return re;
    -        })
    -            .filter(p => !(this.isStart() && this.isEnd()) || !!p)
    -            .join('|');
    -    }
    -    static #parseGlob(glob, hasMagic, noEmpty = false) {
    -        let escaping = false;
    -        let re = '';
    -        let uflag = false;
    -        for (let i = 0; i < glob.length; i++) {
    -            const c = glob.charAt(i);
    -            if (escaping) {
    -                escaping = false;
    -                re += (reSpecials.has(c) ? '\\' : '') + c;
    -                continue;
    -            }
    -            if (c === '\\') {
    -                if (i === glob.length - 1) {
    -                    re += '\\\\';
    -                }
    -                else {
    -                    escaping = true;
    -                }
    -                continue;
    -            }
    -            if (c === '[') {
    -                const [src, needUflag, consumed, magic] = parseClass(glob, i);
    -                if (consumed) {
    -                    re += src;
    -                    uflag = uflag || needUflag;
    -                    i += consumed - 1;
    -                    hasMagic = hasMagic || magic;
    -                    continue;
    -                }
    -            }
    -            if (c === '*') {
    -                if (noEmpty && glob === '*')
    -                    re += starNoEmpty;
    -                else
    -                    re += star;
    -                hasMagic = true;
    -                continue;
    -            }
    -            if (c === '?') {
    -                re += qmark;
    -                hasMagic = true;
    -                continue;
    -            }
    -            re += regExpEscape(c);
    -        }
    -        return [re, unescape(glob), !!hasMagic, uflag];
    -    }
    -}
    -//# sourceMappingURL=ast.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/mjs/brace-expressions.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/mjs/brace-expressions.js
    deleted file mode 100644
    index c629d6ae816e27..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/mjs/brace-expressions.js
    +++ /dev/null
    @@ -1,148 +0,0 @@
    -// translate the various posix character classes into unicode properties
    -// this works across all unicode locales
    -// { : [, /u flag required, negated]
    -const posixClasses = {
    -    '[:alnum:]': ['\\p{L}\\p{Nl}\\p{Nd}', true],
    -    '[:alpha:]': ['\\p{L}\\p{Nl}', true],
    -    '[:ascii:]': ['\\x' + '00-\\x' + '7f', false],
    -    '[:blank:]': ['\\p{Zs}\\t', true],
    -    '[:cntrl:]': ['\\p{Cc}', true],
    -    '[:digit:]': ['\\p{Nd}', true],
    -    '[:graph:]': ['\\p{Z}\\p{C}', true, true],
    -    '[:lower:]': ['\\p{Ll}', true],
    -    '[:print:]': ['\\p{C}', true],
    -    '[:punct:]': ['\\p{P}', true],
    -    '[:space:]': ['\\p{Z}\\t\\r\\n\\v\\f', true],
    -    '[:upper:]': ['\\p{Lu}', true],
    -    '[:word:]': ['\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}', true],
    -    '[:xdigit:]': ['A-Fa-f0-9', false],
    -};
    -// only need to escape a few things inside of brace expressions
    -// escapes: [ \ ] -
    -const braceEscape = (s) => s.replace(/[[\]\\-]/g, '\\$&');
    -// escape all regexp magic characters
    -const regexpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
    -// everything has already been escaped, we just have to join
    -const rangesToString = (ranges) => ranges.join('');
    -// takes a glob string at a posix brace expression, and returns
    -// an equivalent regular expression source, and boolean indicating
    -// whether the /u flag needs to be applied, and the number of chars
    -// consumed to parse the character class.
    -// This also removes out of order ranges, and returns ($.) if the
    -// entire class just no good.
    -export const parseClass = (glob, position) => {
    -    const pos = position;
    -    /* c8 ignore start */
    -    if (glob.charAt(pos) !== '[') {
    -        throw new Error('not in a brace expression');
    -    }
    -    /* c8 ignore stop */
    -    const ranges = [];
    -    const negs = [];
    -    let i = pos + 1;
    -    let sawStart = false;
    -    let uflag = false;
    -    let escaping = false;
    -    let negate = false;
    -    let endPos = pos;
    -    let rangeStart = '';
    -    WHILE: while (i < glob.length) {
    -        const c = glob.charAt(i);
    -        if ((c === '!' || c === '^') && i === pos + 1) {
    -            negate = true;
    -            i++;
    -            continue;
    -        }
    -        if (c === ']' && sawStart && !escaping) {
    -            endPos = i + 1;
    -            break;
    -        }
    -        sawStart = true;
    -        if (c === '\\') {
    -            if (!escaping) {
    -                escaping = true;
    -                i++;
    -                continue;
    -            }
    -            // escaped \ char, fall through and treat like normal char
    -        }
    -        if (c === '[' && !escaping) {
    -            // either a posix class, a collation equivalent, or just a [
    -            for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {
    -                if (glob.startsWith(cls, i)) {
    -                    // invalid, [a-[] is fine, but not [a-[:alpha]]
    -                    if (rangeStart) {
    -                        return ['$.', false, glob.length - pos, true];
    -                    }
    -                    i += cls.length;
    -                    if (neg)
    -                        negs.push(unip);
    -                    else
    -                        ranges.push(unip);
    -                    uflag = uflag || u;
    -                    continue WHILE;
    -                }
    -            }
    -        }
    -        // now it's just a normal character, effectively
    -        escaping = false;
    -        if (rangeStart) {
    -            // throw this range away if it's not valid, but others
    -            // can still match.
    -            if (c > rangeStart) {
    -                ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c));
    -            }
    -            else if (c === rangeStart) {
    -                ranges.push(braceEscape(c));
    -            }
    -            rangeStart = '';
    -            i++;
    -            continue;
    -        }
    -        // now might be the start of a range.
    -        // can be either c-d or c-] or c] or c] at this point
    -        if (glob.startsWith('-]', i + 1)) {
    -            ranges.push(braceEscape(c + '-'));
    -            i += 2;
    -            continue;
    -        }
    -        if (glob.startsWith('-', i + 1)) {
    -            rangeStart = c;
    -            i += 2;
    -            continue;
    -        }
    -        // not the start of a range, just a single character
    -        ranges.push(braceEscape(c));
    -        i++;
    -    }
    -    if (endPos < i) {
    -        // didn't see the end of the class, not a valid class,
    -        // but might still be valid as a literal match.
    -        return ['', false, 0, false];
    -    }
    -    // if we got no ranges and no negates, then we have a range that
    -    // cannot possibly match anything, and that poisons the whole glob
    -    if (!ranges.length && !negs.length) {
    -        return ['$.', false, glob.length - pos, true];
    -    }
    -    // if we got one positive range, and it's a single character, then that's
    -    // not actually a magic pattern, it's just that one literal character.
    -    // we should not treat that as "magic", we should just return the literal
    -    // character. [_] is a perfectly valid way to escape glob magic chars.
    -    if (negs.length === 0 &&
    -        ranges.length === 1 &&
    -        /^\\?.$/.test(ranges[0]) &&
    -        !negate) {
    -        const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0];
    -        return [regexpEscape(r), false, endPos - pos, false];
    -    }
    -    const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']';
    -    const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']';
    -    const comb = ranges.length && negs.length
    -        ? '(' + sranges + '|' + snegs + ')'
    -        : ranges.length
    -            ? sranges
    -            : snegs;
    -    return [comb, uflag, endPos - pos, true];
    -};
    -//# sourceMappingURL=brace-expressions.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/mjs/escape.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/mjs/escape.js
    deleted file mode 100644
    index 16f7c8c7bdc646..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/mjs/escape.js
    +++ /dev/null
    @@ -1,18 +0,0 @@
    -/**
    - * Escape all magic characters in a glob pattern.
    - *
    - * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape}
    - * option is used, then characters are escaped by wrapping in `[]`, because
    - * a magic character wrapped in a character class can only be satisfied by
    - * that exact character.  In this mode, `\` is _not_ escaped, because it is
    - * not interpreted as a magic character, but instead as a path separator.
    - */
    -export const escape = (s, { windowsPathsNoEscape = false, } = {}) => {
    -    // don't need to escape +@! because we escape the parens
    -    // that make those magic, and escaping ! as [!] isn't valid,
    -    // because [!]] is a valid glob class meaning not ']'.
    -    return windowsPathsNoEscape
    -        ? s.replace(/[?*()[\]]/g, '[$&]')
    -        : s.replace(/[?*()[\]\\]/g, '\\$&');
    -};
    -//# sourceMappingURL=escape.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/mjs/index.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/mjs/index.js
    deleted file mode 100644
    index 831b6a67f63fb4..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/mjs/index.js
    +++ /dev/null
    @@ -1,995 +0,0 @@
    -import expand from 'brace-expansion';
    -import { assertValidPattern } from './assert-valid-pattern.js';
    -import { AST } from './ast.js';
    -import { escape } from './escape.js';
    -import { unescape } from './unescape.js';
    -export const minimatch = (p, pattern, options = {}) => {
    -    assertValidPattern(pattern);
    -    // shortcut: comments match nothing.
    -    if (!options.nocomment && pattern.charAt(0) === '#') {
    -        return false;
    -    }
    -    return new Minimatch(pattern, options).match(p);
    -};
    -// Optimized checking for the most common glob patterns.
    -const starDotExtRE = /^\*+([^+@!?\*\[\(]*)$/;
    -const starDotExtTest = (ext) => (f) => !f.startsWith('.') && f.endsWith(ext);
    -const starDotExtTestDot = (ext) => (f) => f.endsWith(ext);
    -const starDotExtTestNocase = (ext) => {
    -    ext = ext.toLowerCase();
    -    return (f) => !f.startsWith('.') && f.toLowerCase().endsWith(ext);
    -};
    -const starDotExtTestNocaseDot = (ext) => {
    -    ext = ext.toLowerCase();
    -    return (f) => f.toLowerCase().endsWith(ext);
    -};
    -const starDotStarRE = /^\*+\.\*+$/;
    -const starDotStarTest = (f) => !f.startsWith('.') && f.includes('.');
    -const starDotStarTestDot = (f) => f !== '.' && f !== '..' && f.includes('.');
    -const dotStarRE = /^\.\*+$/;
    -const dotStarTest = (f) => f !== '.' && f !== '..' && f.startsWith('.');
    -const starRE = /^\*+$/;
    -const starTest = (f) => f.length !== 0 && !f.startsWith('.');
    -const starTestDot = (f) => f.length !== 0 && f !== '.' && f !== '..';
    -const qmarksRE = /^\?+([^+@!?\*\[\(]*)?$/;
    -const qmarksTestNocase = ([$0, ext = '']) => {
    -    const noext = qmarksTestNoExt([$0]);
    -    if (!ext)
    -        return noext;
    -    ext = ext.toLowerCase();
    -    return (f) => noext(f) && f.toLowerCase().endsWith(ext);
    -};
    -const qmarksTestNocaseDot = ([$0, ext = '']) => {
    -    const noext = qmarksTestNoExtDot([$0]);
    -    if (!ext)
    -        return noext;
    -    ext = ext.toLowerCase();
    -    return (f) => noext(f) && f.toLowerCase().endsWith(ext);
    -};
    -const qmarksTestDot = ([$0, ext = '']) => {
    -    const noext = qmarksTestNoExtDot([$0]);
    -    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);
    -};
    -const qmarksTest = ([$0, ext = '']) => {
    -    const noext = qmarksTestNoExt([$0]);
    -    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);
    -};
    -const qmarksTestNoExt = ([$0]) => {
    -    const len = $0.length;
    -    return (f) => f.length === len && !f.startsWith('.');
    -};
    -const qmarksTestNoExtDot = ([$0]) => {
    -    const len = $0.length;
    -    return (f) => f.length === len && f !== '.' && f !== '..';
    -};
    -/* c8 ignore start */
    -const defaultPlatform = (typeof process === 'object' && process
    -    ? (typeof process.env === 'object' &&
    -        process.env &&
    -        process.env.__MINIMATCH_TESTING_PLATFORM__) ||
    -        process.platform
    -    : 'posix');
    -const path = {
    -    win32: { sep: '\\' },
    -    posix: { sep: '/' },
    -};
    -/* c8 ignore stop */
    -export const sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep;
    -minimatch.sep = sep;
    -export const GLOBSTAR = Symbol('globstar **');
    -minimatch.GLOBSTAR = GLOBSTAR;
    -// any single thing other than /
    -// don't need to escape / when using new RegExp()
    -const qmark = '[^/]';
    -// * => any number of characters
    -const star = qmark + '*?';
    -// ** when dots are allowed.  Anything goes, except .. and .
    -// not (^ or / followed by one or two dots followed by $ or /),
    -// followed by anything, any number of times.
    -const twoStarDot = '(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?';
    -// not a ^ or / followed by a dot,
    -// followed by anything, any number of times.
    -const twoStarNoDot = '(?:(?!(?:\\/|^)\\.).)*?';
    -export const filter = (pattern, options = {}) => (p) => minimatch(p, pattern, options);
    -minimatch.filter = filter;
    -const ext = (a, b = {}) => Object.assign({}, a, b);
    -export const defaults = (def) => {
    -    if (!def || typeof def !== 'object' || !Object.keys(def).length) {
    -        return minimatch;
    -    }
    -    const orig = minimatch;
    -    const m = (p, pattern, options = {}) => orig(p, pattern, ext(def, options));
    -    return Object.assign(m, {
    -        Minimatch: class Minimatch extends orig.Minimatch {
    -            constructor(pattern, options = {}) {
    -                super(pattern, ext(def, options));
    -            }
    -            static defaults(options) {
    -                return orig.defaults(ext(def, options)).Minimatch;
    -            }
    -        },
    -        AST: class AST extends orig.AST {
    -            /* c8 ignore start */
    -            constructor(type, parent, options = {}) {
    -                super(type, parent, ext(def, options));
    -            }
    -            /* c8 ignore stop */
    -            static fromGlob(pattern, options = {}) {
    -                return orig.AST.fromGlob(pattern, ext(def, options));
    -            }
    -        },
    -        unescape: (s, options = {}) => orig.unescape(s, ext(def, options)),
    -        escape: (s, options = {}) => orig.escape(s, ext(def, options)),
    -        filter: (pattern, options = {}) => orig.filter(pattern, ext(def, options)),
    -        defaults: (options) => orig.defaults(ext(def, options)),
    -        makeRe: (pattern, options = {}) => orig.makeRe(pattern, ext(def, options)),
    -        braceExpand: (pattern, options = {}) => orig.braceExpand(pattern, ext(def, options)),
    -        match: (list, pattern, options = {}) => orig.match(list, pattern, ext(def, options)),
    -        sep: orig.sep,
    -        GLOBSTAR: GLOBSTAR,
    -    });
    -};
    -minimatch.defaults = defaults;
    -// Brace expansion:
    -// a{b,c}d -> abd acd
    -// a{b,}c -> abc ac
    -// a{0..3}d -> a0d a1d a2d a3d
    -// a{b,c{d,e}f}g -> abg acdfg acefg
    -// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
    -//
    -// Invalid sets are not expanded.
    -// a{2..}b -> a{2..}b
    -// a{b}c -> a{b}c
    -export const braceExpand = (pattern, options = {}) => {
    -    assertValidPattern(pattern);
    -    // Thanks to Yeting Li  for
    -    // improving this regexp to avoid a ReDOS vulnerability.
    -    if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
    -        // shortcut. no need to expand.
    -        return [pattern];
    -    }
    -    return expand(pattern);
    -};
    -minimatch.braceExpand = braceExpand;
    -// parse a component of the expanded set.
    -// At this point, no pattern may contain "/" in it
    -// so we're going to return a 2d array, where each entry is the full
    -// pattern, split on '/', and then turned into a regular expression.
    -// A regexp is made at the end which joins each array with an
    -// escaped /, and another full one which joins each regexp with |.
    -//
    -// Following the lead of Bash 4.1, note that "**" only has special meaning
    -// when it is the *only* thing in a path portion.  Otherwise, any series
    -// of * is equivalent to a single *.  Globstar behavior is enabled by
    -// default, and can be disabled by setting options.noglobstar.
    -export const makeRe = (pattern, options = {}) => new Minimatch(pattern, options).makeRe();
    -minimatch.makeRe = makeRe;
    -export const match = (list, pattern, options = {}) => {
    -    const mm = new Minimatch(pattern, options);
    -    list = list.filter(f => mm.match(f));
    -    if (mm.options.nonull && !list.length) {
    -        list.push(pattern);
    -    }
    -    return list;
    -};
    -minimatch.match = match;
    -// replace stuff like \* with *
    -const globMagic = /[?*]|[+@!]\(.*?\)|\[|\]/;
    -const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
    -export class Minimatch {
    -    options;
    -    set;
    -    pattern;
    -    windowsPathsNoEscape;
    -    nonegate;
    -    negate;
    -    comment;
    -    empty;
    -    preserveMultipleSlashes;
    -    partial;
    -    globSet;
    -    globParts;
    -    nocase;
    -    isWindows;
    -    platform;
    -    windowsNoMagicRoot;
    -    regexp;
    -    constructor(pattern, options = {}) {
    -        assertValidPattern(pattern);
    -        options = options || {};
    -        this.options = options;
    -        this.pattern = pattern;
    -        this.platform = options.platform || defaultPlatform;
    -        this.isWindows = this.platform === 'win32';
    -        this.windowsPathsNoEscape =
    -            !!options.windowsPathsNoEscape || options.allowWindowsEscape === false;
    -        if (this.windowsPathsNoEscape) {
    -            this.pattern = this.pattern.replace(/\\/g, '/');
    -        }
    -        this.preserveMultipleSlashes = !!options.preserveMultipleSlashes;
    -        this.regexp = null;
    -        this.negate = false;
    -        this.nonegate = !!options.nonegate;
    -        this.comment = false;
    -        this.empty = false;
    -        this.partial = !!options.partial;
    -        this.nocase = !!this.options.nocase;
    -        this.windowsNoMagicRoot =
    -            options.windowsNoMagicRoot !== undefined
    -                ? options.windowsNoMagicRoot
    -                : !!(this.isWindows && this.nocase);
    -        this.globSet = [];
    -        this.globParts = [];
    -        this.set = [];
    -        // make the set of regexps etc.
    -        this.make();
    -    }
    -    hasMagic() {
    -        if (this.options.magicalBraces && this.set.length > 1) {
    -            return true;
    -        }
    -        for (const pattern of this.set) {
    -            for (const part of pattern) {
    -                if (typeof part !== 'string')
    -                    return true;
    -            }
    -        }
    -        return false;
    -    }
    -    debug(..._) { }
    -    make() {
    -        const pattern = this.pattern;
    -        const options = this.options;
    -        // empty patterns and comments match nothing.
    -        if (!options.nocomment && pattern.charAt(0) === '#') {
    -            this.comment = true;
    -            return;
    -        }
    -        if (!pattern) {
    -            this.empty = true;
    -            return;
    -        }
    -        // step 1: figure out negation, etc.
    -        this.parseNegate();
    -        // step 2: expand braces
    -        this.globSet = [...new Set(this.braceExpand())];
    -        if (options.debug) {
    -            this.debug = (...args) => console.error(...args);
    -        }
    -        this.debug(this.pattern, this.globSet);
    -        // step 3: now we have a set, so turn each one into a series of
    -        // path-portion matching patterns.
    -        // These will be regexps, except in the case of "**", which is
    -        // set to the GLOBSTAR object for globstar behavior,
    -        // and will not contain any / characters
    -        //
    -        // First, we preprocess to make the glob pattern sets a bit simpler
    -        // and deduped.  There are some perf-killing patterns that can cause
    -        // problems with a glob walk, but we can simplify them down a bit.
    -        const rawGlobParts = this.globSet.map(s => this.slashSplit(s));
    -        this.globParts = this.preprocess(rawGlobParts);
    -        this.debug(this.pattern, this.globParts);
    -        // glob --> regexps
    -        let set = this.globParts.map((s, _, __) => {
    -            if (this.isWindows && this.windowsNoMagicRoot) {
    -                // check if it's a drive or unc path.
    -                const isUNC = s[0] === '' &&
    -                    s[1] === '' &&
    -                    (s[2] === '?' || !globMagic.test(s[2])) &&
    -                    !globMagic.test(s[3]);
    -                const isDrive = /^[a-z]:/i.test(s[0]);
    -                if (isUNC) {
    -                    return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))];
    -                }
    -                else if (isDrive) {
    -                    return [s[0], ...s.slice(1).map(ss => this.parse(ss))];
    -                }
    -            }
    -            return s.map(ss => this.parse(ss));
    -        });
    -        this.debug(this.pattern, set);
    -        // filter out everything that didn't compile properly.
    -        this.set = set.filter(s => s.indexOf(false) === -1);
    -        // do not treat the ? in UNC paths as magic
    -        if (this.isWindows) {
    -            for (let i = 0; i < this.set.length; i++) {
    -                const p = this.set[i];
    -                if (p[0] === '' &&
    -                    p[1] === '' &&
    -                    this.globParts[i][2] === '?' &&
    -                    typeof p[3] === 'string' &&
    -                    /^[a-z]:$/i.test(p[3])) {
    -                    p[2] = '?';
    -                }
    -            }
    -        }
    -        this.debug(this.pattern, this.set);
    -    }
    -    // various transforms to equivalent pattern sets that are
    -    // faster to process in a filesystem walk.  The goal is to
    -    // eliminate what we can, and push all ** patterns as far
    -    // to the right as possible, even if it increases the number
    -    // of patterns that we have to process.
    -    preprocess(globParts) {
    -        // if we're not in globstar mode, then turn all ** into *
    -        if (this.options.noglobstar) {
    -            for (let i = 0; i < globParts.length; i++) {
    -                for (let j = 0; j < globParts[i].length; j++) {
    -                    if (globParts[i][j] === '**') {
    -                        globParts[i][j] = '*';
    -                    }
    -                }
    -            }
    -        }
    -        const { optimizationLevel = 1 } = this.options;
    -        if (optimizationLevel >= 2) {
    -            // aggressive optimization for the purpose of fs walking
    -            globParts = this.firstPhasePreProcess(globParts);
    -            globParts = this.secondPhasePreProcess(globParts);
    -        }
    -        else if (optimizationLevel >= 1) {
    -            // just basic optimizations to remove some .. parts
    -            globParts = this.levelOneOptimize(globParts);
    -        }
    -        else {
    -            globParts = this.adjascentGlobstarOptimize(globParts);
    -        }
    -        return globParts;
    -    }
    -    // just get rid of adjascent ** portions
    -    adjascentGlobstarOptimize(globParts) {
    -        return globParts.map(parts => {
    -            let gs = -1;
    -            while (-1 !== (gs = parts.indexOf('**', gs + 1))) {
    -                let i = gs;
    -                while (parts[i + 1] === '**') {
    -                    i++;
    -                }
    -                if (i !== gs) {
    -                    parts.splice(gs, i - gs);
    -                }
    -            }
    -            return parts;
    -        });
    -    }
    -    // get rid of adjascent ** and resolve .. portions
    -    levelOneOptimize(globParts) {
    -        return globParts.map(parts => {
    -            parts = parts.reduce((set, part) => {
    -                const prev = set[set.length - 1];
    -                if (part === '**' && prev === '**') {
    -                    return set;
    -                }
    -                if (part === '..') {
    -                    if (prev && prev !== '..' && prev !== '.' && prev !== '**') {
    -                        set.pop();
    -                        return set;
    -                    }
    -                }
    -                set.push(part);
    -                return set;
    -            }, []);
    -            return parts.length === 0 ? [''] : parts;
    -        });
    -    }
    -    levelTwoFileOptimize(parts) {
    -        if (!Array.isArray(parts)) {
    -            parts = this.slashSplit(parts);
    -        }
    -        let didSomething = false;
    -        do {
    -            didSomething = false;
    -            // 
    // -> 
    /
    -            if (!this.preserveMultipleSlashes) {
    -                for (let i = 1; i < parts.length - 1; i++) {
    -                    const p = parts[i];
    -                    // don't squeeze out UNC patterns
    -                    if (i === 1 && p === '' && parts[0] === '')
    -                        continue;
    -                    if (p === '.' || p === '') {
    -                        didSomething = true;
    -                        parts.splice(i, 1);
    -                        i--;
    -                    }
    -                }
    -                if (parts[0] === '.' &&
    -                    parts.length === 2 &&
    -                    (parts[1] === '.' || parts[1] === '')) {
    -                    didSomething = true;
    -                    parts.pop();
    -                }
    -            }
    -            // 
    /

    /../ ->

    /
    -            let dd = 0;
    -            while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
    -                const p = parts[dd - 1];
    -                if (p && p !== '.' && p !== '..' && p !== '**') {
    -                    didSomething = true;
    -                    parts.splice(dd - 1, 2);
    -                    dd -= 2;
    -                }
    -            }
    -        } while (didSomething);
    -        return parts.length === 0 ? [''] : parts;
    -    }
    -    // First phase: single-pattern processing
    -    // 
     is 1 or more portions
    -    //  is 1 or more portions
    -    // 

    is any portion other than ., .., '', or ** - // is . or '' - // - // **/.. is *brutal* for filesystem walking performance, because - // it effectively resets the recursive walk each time it occurs, - // and ** cannot be reduced out by a .. pattern part like a regexp - // or most strings (other than .., ., and '') can be. - // - //

    /**/../

    /

    / -> {

    /../

    /

    /,

    /**/

    /

    /} - //

    // -> 
    /
    -    // 
    /

    /../ ->

    /
    -    // **/**/ -> **/
    -    //
    -    // **/*/ -> */**/ <== not valid because ** doesn't follow
    -    // this WOULD be allowed if ** did follow symlinks, or * didn't
    -    firstPhasePreProcess(globParts) {
    -        let didSomething = false;
    -        do {
    -            didSomething = false;
    -            // 
    /**/../

    /

    / -> {

    /../

    /

    /,

    /**/

    /

    /} - for (let parts of globParts) { - let gs = -1; - while (-1 !== (gs = parts.indexOf('**', gs + 1))) { - let gss = gs; - while (parts[gss + 1] === '**') { - //

    /**/**/ -> 
    /**/
    -                        gss++;
    -                    }
    -                    // eg, if gs is 2 and gss is 4, that means we have 3 **
    -                    // parts, and can remove 2 of them.
    -                    if (gss > gs) {
    -                        parts.splice(gs + 1, gss - gs);
    -                    }
    -                    let next = parts[gs + 1];
    -                    const p = parts[gs + 2];
    -                    const p2 = parts[gs + 3];
    -                    if (next !== '..')
    -                        continue;
    -                    if (!p ||
    -                        p === '.' ||
    -                        p === '..' ||
    -                        !p2 ||
    -                        p2 === '.' ||
    -                        p2 === '..') {
    -                        continue;
    -                    }
    -                    didSomething = true;
    -                    // edit parts in place, and push the new one
    -                    parts.splice(gs, 1);
    -                    const other = parts.slice(0);
    -                    other[gs] = '**';
    -                    globParts.push(other);
    -                    gs--;
    -                }
    -                // 
    // -> 
    /
    -                if (!this.preserveMultipleSlashes) {
    -                    for (let i = 1; i < parts.length - 1; i++) {
    -                        const p = parts[i];
    -                        // don't squeeze out UNC patterns
    -                        if (i === 1 && p === '' && parts[0] === '')
    -                            continue;
    -                        if (p === '.' || p === '') {
    -                            didSomething = true;
    -                            parts.splice(i, 1);
    -                            i--;
    -                        }
    -                    }
    -                    if (parts[0] === '.' &&
    -                        parts.length === 2 &&
    -                        (parts[1] === '.' || parts[1] === '')) {
    -                        didSomething = true;
    -                        parts.pop();
    -                    }
    -                }
    -                // 
    /

    /../ ->

    /
    -                let dd = 0;
    -                while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
    -                    const p = parts[dd - 1];
    -                    if (p && p !== '.' && p !== '..' && p !== '**') {
    -                        didSomething = true;
    -                        const needDot = dd === 1 && parts[dd + 1] === '**';
    -                        const splin = needDot ? ['.'] : [];
    -                        parts.splice(dd - 1, 2, ...splin);
    -                        if (parts.length === 0)
    -                            parts.push('');
    -                        dd -= 2;
    -                    }
    -                }
    -            }
    -        } while (didSomething);
    -        return globParts;
    -    }
    -    // second phase: multi-pattern dedupes
    -    // {
    /*/,
    /

    /} ->

    /*/
    -    // {
    /,
    /} -> 
    /
    -    // {
    /**/,
    /} -> 
    /**/
    -    //
    -    // {
    /**/,
    /**/

    /} ->

    /**/
    -    // ^-- not valid because ** doens't follow symlinks
    -    secondPhasePreProcess(globParts) {
    -        for (let i = 0; i < globParts.length - 1; i++) {
    -            for (let j = i + 1; j < globParts.length; j++) {
    -                const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes);
    -                if (!matched)
    -                    continue;
    -                globParts[i] = matched;
    -                globParts[j] = [];
    -            }
    -        }
    -        return globParts.filter(gs => gs.length);
    -    }
    -    partsMatch(a, b, emptyGSMatch = false) {
    -        let ai = 0;
    -        let bi = 0;
    -        let result = [];
    -        let which = '';
    -        while (ai < a.length && bi < b.length) {
    -            if (a[ai] === b[bi]) {
    -                result.push(which === 'b' ? b[bi] : a[ai]);
    -                ai++;
    -                bi++;
    -            }
    -            else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {
    -                result.push(a[ai]);
    -                ai++;
    -            }
    -            else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {
    -                result.push(b[bi]);
    -                bi++;
    -            }
    -            else if (a[ai] === '*' &&
    -                b[bi] &&
    -                (this.options.dot || !b[bi].startsWith('.')) &&
    -                b[bi] !== '**') {
    -                if (which === 'b')
    -                    return false;
    -                which = 'a';
    -                result.push(a[ai]);
    -                ai++;
    -                bi++;
    -            }
    -            else if (b[bi] === '*' &&
    -                a[ai] &&
    -                (this.options.dot || !a[ai].startsWith('.')) &&
    -                a[ai] !== '**') {
    -                if (which === 'a')
    -                    return false;
    -                which = 'b';
    -                result.push(b[bi]);
    -                ai++;
    -                bi++;
    -            }
    -            else {
    -                return false;
    -            }
    -        }
    -        // if we fall out of the loop, it means they two are identical
    -        // as long as their lengths match
    -        return a.length === b.length && result;
    -    }
    -    parseNegate() {
    -        if (this.nonegate)
    -            return;
    -        const pattern = this.pattern;
    -        let negate = false;
    -        let negateOffset = 0;
    -        for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {
    -            negate = !negate;
    -            negateOffset++;
    -        }
    -        if (negateOffset)
    -            this.pattern = pattern.slice(negateOffset);
    -        this.negate = negate;
    -    }
    -    // set partial to true to test if, for example,
    -    // "/a/b" matches the start of "/*/b/*/d"
    -    // Partial means, if you run out of file before you run
    -    // out of pattern, then that's fine, as long as all
    -    // the parts match.
    -    matchOne(file, pattern, partial = false) {
    -        const options = this.options;
    -        // UNC paths like //?/X:/... can match X:/... and vice versa
    -        // Drive letters in absolute drive or unc paths are always compared
    -        // case-insensitively.
    -        if (this.isWindows) {
    -            const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0]);
    -            const fileUNC = !fileDrive &&
    -                file[0] === '' &&
    -                file[1] === '' &&
    -                file[2] === '?' &&
    -                /^[a-z]:$/i.test(file[3]);
    -            const patternDrive = typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0]);
    -            const patternUNC = !patternDrive &&
    -                pattern[0] === '' &&
    -                pattern[1] === '' &&
    -                pattern[2] === '?' &&
    -                typeof pattern[3] === 'string' &&
    -                /^[a-z]:$/i.test(pattern[3]);
    -            const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined;
    -            const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined;
    -            if (typeof fdi === 'number' && typeof pdi === 'number') {
    -                const [fd, pd] = [file[fdi], pattern[pdi]];
    -                if (fd.toLowerCase() === pd.toLowerCase()) {
    -                    pattern[pdi] = fd;
    -                    if (pdi > fdi) {
    -                        pattern = pattern.slice(pdi);
    -                    }
    -                    else if (fdi > pdi) {
    -                        file = file.slice(fdi);
    -                    }
    -                }
    -            }
    -        }
    -        // resolve and reduce . and .. portions in the file as well.
    -        // dont' need to do the second phase, because it's only one string[]
    -        const { optimizationLevel = 1 } = this.options;
    -        if (optimizationLevel >= 2) {
    -            file = this.levelTwoFileOptimize(file);
    -        }
    -        this.debug('matchOne', this, { file, pattern });
    -        this.debug('matchOne', file.length, pattern.length);
    -        for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) {
    -            this.debug('matchOne loop');
    -            var p = pattern[pi];
    -            var f = file[fi];
    -            this.debug(pattern, p, f);
    -            // should be impossible.
    -            // some invalid regexp stuff in the set.
    -            /* c8 ignore start */
    -            if (p === false) {
    -                return false;
    -            }
    -            /* c8 ignore stop */
    -            if (p === GLOBSTAR) {
    -                this.debug('GLOBSTAR', [pattern, p, f]);
    -                // "**"
    -                // a/**/b/**/c would match the following:
    -                // a/b/x/y/z/c
    -                // a/x/y/z/b/c
    -                // a/b/x/b/x/c
    -                // a/b/c
    -                // To do this, take the rest of the pattern after
    -                // the **, and see if it would match the file remainder.
    -                // If so, return success.
    -                // If not, the ** "swallows" a segment, and try again.
    -                // This is recursively awful.
    -                //
    -                // a/**/b/**/c matching a/b/x/y/z/c
    -                // - a matches a
    -                // - doublestar
    -                //   - matchOne(b/x/y/z/c, b/**/c)
    -                //     - b matches b
    -                //     - doublestar
    -                //       - matchOne(x/y/z/c, c) -> no
    -                //       - matchOne(y/z/c, c) -> no
    -                //       - matchOne(z/c, c) -> no
    -                //       - matchOne(c, c) yes, hit
    -                var fr = fi;
    -                var pr = pi + 1;
    -                if (pr === pl) {
    -                    this.debug('** at the end');
    -                    // a ** at the end will just swallow the rest.
    -                    // We have found a match.
    -                    // however, it will not swallow /.x, unless
    -                    // options.dot is set.
    -                    // . and .. are *never* matched by **, for explosively
    -                    // exponential reasons.
    -                    for (; fi < fl; fi++) {
    -                        if (file[fi] === '.' ||
    -                            file[fi] === '..' ||
    -                            (!options.dot && file[fi].charAt(0) === '.'))
    -                            return false;
    -                    }
    -                    return true;
    -                }
    -                // ok, let's see if we can swallow whatever we can.
    -                while (fr < fl) {
    -                    var swallowee = file[fr];
    -                    this.debug('\nglobstar while', file, fr, pattern, pr, swallowee);
    -                    // XXX remove this slice.  Just pass the start index.
    -                    if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
    -                        this.debug('globstar found match!', fr, fl, swallowee);
    -                        // found a match.
    -                        return true;
    -                    }
    -                    else {
    -                        // can't swallow "." or ".." ever.
    -                        // can only swallow ".foo" when explicitly asked.
    -                        if (swallowee === '.' ||
    -                            swallowee === '..' ||
    -                            (!options.dot && swallowee.charAt(0) === '.')) {
    -                            this.debug('dot detected!', file, fr, pattern, pr);
    -                            break;
    -                        }
    -                        // ** swallows a segment, and continue.
    -                        this.debug('globstar swallow a segment, and continue');
    -                        fr++;
    -                    }
    -                }
    -                // no match was found.
    -                // However, in partial mode, we can't say this is necessarily over.
    -                /* c8 ignore start */
    -                if (partial) {
    -                    // ran out of file
    -                    this.debug('\n>>> no match, partial?', file, fr, pattern, pr);
    -                    if (fr === fl) {
    -                        return true;
    -                    }
    -                }
    -                /* c8 ignore stop */
    -                return false;
    -            }
    -            // something other than **
    -            // non-magic patterns just have to match exactly
    -            // patterns with magic have been turned into regexps.
    -            let hit;
    -            if (typeof p === 'string') {
    -                hit = f === p;
    -                this.debug('string match', p, f, hit);
    -            }
    -            else {
    -                hit = p.test(f);
    -                this.debug('pattern match', p, f, hit);
    -            }
    -            if (!hit)
    -                return false;
    -        }
    -        // Note: ending in / means that we'll get a final ""
    -        // at the end of the pattern.  This can only match a
    -        // corresponding "" at the end of the file.
    -        // If the file ends in /, then it can only match a
    -        // a pattern that ends in /, unless the pattern just
    -        // doesn't have any more for it. But, a/b/ should *not*
    -        // match "a/b/*", even though "" matches against the
    -        // [^/]*? pattern, except in partial mode, where it might
    -        // simply not be reached yet.
    -        // However, a/b/ should still satisfy a/*
    -        // now either we fell off the end of the pattern, or we're done.
    -        if (fi === fl && pi === pl) {
    -            // ran out of pattern and filename at the same time.
    -            // an exact hit!
    -            return true;
    -        }
    -        else if (fi === fl) {
    -            // ran out of file, but still had pattern left.
    -            // this is ok if we're doing the match as part of
    -            // a glob fs traversal.
    -            return partial;
    -        }
    -        else if (pi === pl) {
    -            // ran out of pattern, still have file left.
    -            // this is only acceptable if we're on the very last
    -            // empty segment of a file with a trailing slash.
    -            // a/* should match a/b/
    -            return fi === fl - 1 && file[fi] === '';
    -            /* c8 ignore start */
    -        }
    -        else {
    -            // should be unreachable.
    -            throw new Error('wtf?');
    -        }
    -        /* c8 ignore stop */
    -    }
    -    braceExpand() {
    -        return braceExpand(this.pattern, this.options);
    -    }
    -    parse(pattern) {
    -        assertValidPattern(pattern);
    -        const options = this.options;
    -        // shortcuts
    -        if (pattern === '**')
    -            return GLOBSTAR;
    -        if (pattern === '')
    -            return '';
    -        // far and away, the most common glob pattern parts are
    -        // *, *.*, and *.  Add a fast check method for those.
    -        let m;
    -        let fastTest = null;
    -        if ((m = pattern.match(starRE))) {
    -            fastTest = options.dot ? starTestDot : starTest;
    -        }
    -        else if ((m = pattern.match(starDotExtRE))) {
    -            fastTest = (options.nocase
    -                ? options.dot
    -                    ? starDotExtTestNocaseDot
    -                    : starDotExtTestNocase
    -                : options.dot
    -                    ? starDotExtTestDot
    -                    : starDotExtTest)(m[1]);
    -        }
    -        else if ((m = pattern.match(qmarksRE))) {
    -            fastTest = (options.nocase
    -                ? options.dot
    -                    ? qmarksTestNocaseDot
    -                    : qmarksTestNocase
    -                : options.dot
    -                    ? qmarksTestDot
    -                    : qmarksTest)(m);
    -        }
    -        else if ((m = pattern.match(starDotStarRE))) {
    -            fastTest = options.dot ? starDotStarTestDot : starDotStarTest;
    -        }
    -        else if ((m = pattern.match(dotStarRE))) {
    -            fastTest = dotStarTest;
    -        }
    -        const re = AST.fromGlob(pattern, this.options).toMMPattern();
    -        return fastTest ? Object.assign(re, { test: fastTest }) : re;
    -    }
    -    makeRe() {
    -        if (this.regexp || this.regexp === false)
    -            return this.regexp;
    -        // at this point, this.set is a 2d array of partial
    -        // pattern strings, or "**".
    -        //
    -        // It's better to use .match().  This function shouldn't
    -        // be used, really, but it's pretty convenient sometimes,
    -        // when you just want to work with a regex.
    -        const set = this.set;
    -        if (!set.length) {
    -            this.regexp = false;
    -            return this.regexp;
    -        }
    -        const options = this.options;
    -        const twoStar = options.noglobstar
    -            ? star
    -            : options.dot
    -                ? twoStarDot
    -                : twoStarNoDot;
    -        const flags = new Set(options.nocase ? ['i'] : []);
    -        // regexpify non-globstar patterns
    -        // if ** is only item, then we just do one twoStar
    -        // if ** is first, and there are more, prepend (\/|twoStar\/)? to next
    -        // if ** is last, append (\/twoStar|) to previous
    -        // if ** is in the middle, append (\/|\/twoStar\/) to previous
    -        // then filter out GLOBSTAR symbols
    -        let re = set
    -            .map(pattern => {
    -            const pp = pattern.map(p => {
    -                if (p instanceof RegExp) {
    -                    for (const f of p.flags.split(''))
    -                        flags.add(f);
    -                }
    -                return typeof p === 'string'
    -                    ? regExpEscape(p)
    -                    : p === GLOBSTAR
    -                        ? GLOBSTAR
    -                        : p._src;
    -            });
    -            pp.forEach((p, i) => {
    -                const next = pp[i + 1];
    -                const prev = pp[i - 1];
    -                if (p !== GLOBSTAR || prev === GLOBSTAR) {
    -                    return;
    -                }
    -                if (prev === undefined) {
    -                    if (next !== undefined && next !== GLOBSTAR) {
    -                        pp[i + 1] = '(?:\\/|' + twoStar + '\\/)?' + next;
    -                    }
    -                    else {
    -                        pp[i] = twoStar;
    -                    }
    -                }
    -                else if (next === undefined) {
    -                    pp[i - 1] = prev + '(?:\\/|' + twoStar + ')?';
    -                }
    -                else if (next !== GLOBSTAR) {
    -                    pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + '\\/)' + next;
    -                    pp[i + 1] = GLOBSTAR;
    -                }
    -            });
    -            return pp.filter(p => p !== GLOBSTAR).join('/');
    -        })
    -            .join('|');
    -        // need to wrap in parens if we had more than one thing with |,
    -        // otherwise only the first will be anchored to ^ and the last to $
    -        const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', ''];
    -        // must match entire pattern
    -        // ending in a * or ** will make it less strict.
    -        re = '^' + open + re + close + '$';
    -        // can match anything, as long as it's not this.
    -        if (this.negate)
    -            re = '^(?!' + re + ').+$';
    -        try {
    -            this.regexp = new RegExp(re, [...flags].join(''));
    -            /* c8 ignore start */
    -        }
    -        catch (ex) {
    -            // should be impossible
    -            this.regexp = false;
    -        }
    -        /* c8 ignore stop */
    -        return this.regexp;
    -    }
    -    slashSplit(p) {
    -        // if p starts with // on windows, we preserve that
    -        // so that UNC paths aren't broken.  Otherwise, any number of
    -        // / characters are coalesced into one, unless
    -        // preserveMultipleSlashes is set to true.
    -        if (this.preserveMultipleSlashes) {
    -            return p.split('/');
    -        }
    -        else if (this.isWindows && /^\/\/[^\/]+/.test(p)) {
    -            // add an extra '' for the one we lose
    -            return ['', ...p.split(/\/+/)];
    -        }
    -        else {
    -            return p.split(/\/+/);
    -        }
    -    }
    -    match(f, partial = this.partial) {
    -        this.debug('match', f, this.pattern);
    -        // short-circuit in the case of busted things.
    -        // comments, etc.
    -        if (this.comment) {
    -            return false;
    -        }
    -        if (this.empty) {
    -            return f === '';
    -        }
    -        if (f === '/' && partial) {
    -            return true;
    -        }
    -        const options = this.options;
    -        // windows: need to use /, not \
    -        if (this.isWindows) {
    -            f = f.split('\\').join('/');
    -        }
    -        // treat the test path as a set of pathparts.
    -        const ff = this.slashSplit(f);
    -        this.debug(this.pattern, 'split', ff);
    -        // just ONE of the pattern sets in this.set needs to match
    -        // in order for it to be valid.  If negating, then just one
    -        // match means that we have failed.
    -        // Either way, return on the first hit.
    -        const set = this.set;
    -        this.debug(this.pattern, 'set', set);
    -        // Find the basename of the path by looking for the last non-empty segment
    -        let filename = ff[ff.length - 1];
    -        if (!filename) {
    -            for (let i = ff.length - 2; !filename && i >= 0; i--) {
    -                filename = ff[i];
    -            }
    -        }
    -        for (let i = 0; i < set.length; i++) {
    -            const pattern = set[i];
    -            let file = ff;
    -            if (options.matchBase && pattern.length === 1) {
    -                file = [filename];
    -            }
    -            const hit = this.matchOne(file, pattern, partial);
    -            if (hit) {
    -                if (options.flipNegate) {
    -                    return true;
    -                }
    -                return !this.negate;
    -            }
    -        }
    -        // didn't get any hits.  this is success if it's a negative
    -        // pattern, failure otherwise.
    -        if (options.flipNegate) {
    -            return false;
    -        }
    -        return this.negate;
    -    }
    -    static defaults(def) {
    -        return minimatch.defaults(def).Minimatch;
    -    }
    -}
    -/* c8 ignore start */
    -export { AST } from './ast.js';
    -export { escape } from './escape.js';
    -export { unescape } from './unescape.js';
    -/* c8 ignore stop */
    -minimatch.AST = AST;
    -minimatch.Minimatch = Minimatch;
    -minimatch.escape = escape;
    -minimatch.unescape = unescape;
    -//# sourceMappingURL=index.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/mjs/unescape.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/mjs/unescape.js
    deleted file mode 100644
    index 0faf9a2b7306f7..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/mjs/unescape.js
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -/**
    - * Un-escape a string that has been escaped with {@link escape}.
    - *
    - * If the {@link windowsPathsNoEscape} option is used, then square-brace
    - * escapes are removed, but not backslash escapes.  For example, it will turn
    - * the string `'[*]'` into `*`, but it will not turn `'\\*'` into `'*'`,
    - * becuase `\` is a path separator in `windowsPathsNoEscape` mode.
    - *
    - * When `windowsPathsNoEscape` is not set, then both brace escapes and
    - * backslash escapes are removed.
    - *
    - * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
    - * or unescaped.
    - */
    -export const unescape = (s, { windowsPathsNoEscape = false, } = {}) => {
    -    return windowsPathsNoEscape
    -        ? s.replace(/\[([^\/\\])\]/g, '$1')
    -        : s.replace(/((?!\\).|^)\[([^\/\\])\]/g, '$1$2').replace(/\\([^\/])/g, '$1');
    -};
    -//# sourceMappingURL=unescape.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minipass/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minipass/LICENSE
    deleted file mode 100644
    index 97f8e32ed82e4c..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minipass/LICENSE
    +++ /dev/null
    @@ -1,15 +0,0 @@
    -The ISC License
    -
    -Copyright (c) 2017-2023 npm, Inc., Isaac Z. Schlueter, and Contributors
    -
    -Permission to use, copy, modify, and/or distribute this software for any
    -purpose with or without fee is hereby granted, provided that the above
    -copyright notice and this permission notice appear in all copies.
    -
    -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
    -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minipass/dist/cjs/index.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minipass/dist/cjs/index.js
    deleted file mode 100644
    index b6cdae8eb514b8..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minipass/dist/cjs/index.js
    +++ /dev/null
    @@ -1,1028 +0,0 @@
    -"use strict";
    -var __importDefault = (this && this.__importDefault) || function (mod) {
    -    return (mod && mod.__esModule) ? mod : { "default": mod };
    -};
    -Object.defineProperty(exports, "__esModule", { value: true });
    -exports.Minipass = exports.isWritable = exports.isReadable = exports.isStream = void 0;
    -const proc = typeof process === 'object' && process
    -    ? process
    -    : {
    -        stdout: null,
    -        stderr: null,
    -    };
    -const events_1 = require("events");
    -const stream_1 = __importDefault(require("stream"));
    -const string_decoder_1 = require("string_decoder");
    -/**
    - * Return true if the argument is a Minipass stream, Node stream, or something
    - * else that Minipass can interact with.
    - */
    -const isStream = (s) => !!s &&
    -    typeof s === 'object' &&
    -    (s instanceof Minipass ||
    -        s instanceof stream_1.default ||
    -        (0, exports.isReadable)(s) ||
    -        (0, exports.isWritable)(s));
    -exports.isStream = isStream;
    -/**
    - * Return true if the argument is a valid {@link Minipass.Readable}
    - */
    -const isReadable = (s) => !!s &&
    -    typeof s === 'object' &&
    -    s instanceof events_1.EventEmitter &&
    -    typeof s.pipe === 'function' &&
    -    // node core Writable streams have a pipe() method, but it throws
    -    s.pipe !== stream_1.default.Writable.prototype.pipe;
    -exports.isReadable = isReadable;
    -/**
    - * Return true if the argument is a valid {@link Minipass.Writable}
    - */
    -const isWritable = (s) => !!s &&
    -    typeof s === 'object' &&
    -    s instanceof events_1.EventEmitter &&
    -    typeof s.write === 'function' &&
    -    typeof s.end === 'function';
    -exports.isWritable = isWritable;
    -const EOF = Symbol('EOF');
    -const MAYBE_EMIT_END = Symbol('maybeEmitEnd');
    -const EMITTED_END = Symbol('emittedEnd');
    -const EMITTING_END = Symbol('emittingEnd');
    -const EMITTED_ERROR = Symbol('emittedError');
    -const CLOSED = Symbol('closed');
    -const READ = Symbol('read');
    -const FLUSH = Symbol('flush');
    -const FLUSHCHUNK = Symbol('flushChunk');
    -const ENCODING = Symbol('encoding');
    -const DECODER = Symbol('decoder');
    -const FLOWING = Symbol('flowing');
    -const PAUSED = Symbol('paused');
    -const RESUME = Symbol('resume');
    -const BUFFER = Symbol('buffer');
    -const PIPES = Symbol('pipes');
    -const BUFFERLENGTH = Symbol('bufferLength');
    -const BUFFERPUSH = Symbol('bufferPush');
    -const BUFFERSHIFT = Symbol('bufferShift');
    -const OBJECTMODE = Symbol('objectMode');
    -// internal event when stream is destroyed
    -const DESTROYED = Symbol('destroyed');
    -// internal event when stream has an error
    -const ERROR = Symbol('error');
    -const EMITDATA = Symbol('emitData');
    -const EMITEND = Symbol('emitEnd');
    -const EMITEND2 = Symbol('emitEnd2');
    -const ASYNC = Symbol('async');
    -const ABORT = Symbol('abort');
    -const ABORTED = Symbol('aborted');
    -const SIGNAL = Symbol('signal');
    -const DATALISTENERS = Symbol('dataListeners');
    -const DISCARDED = Symbol('discarded');
    -const defer = (fn) => Promise.resolve().then(fn);
    -const nodefer = (fn) => fn();
    -const isEndish = (ev) => ev === 'end' || ev === 'finish' || ev === 'prefinish';
    -const isArrayBufferLike = (b) => b instanceof ArrayBuffer ||
    -    (!!b &&
    -        typeof b === 'object' &&
    -        b.constructor &&
    -        b.constructor.name === 'ArrayBuffer' &&
    -        b.byteLength >= 0);
    -const isArrayBufferView = (b) => !Buffer.isBuffer(b) && ArrayBuffer.isView(b);
    -/**
    - * Internal class representing a pipe to a destination stream.
    - *
    - * @internal
    - */
    -class Pipe {
    -    src;
    -    dest;
    -    opts;
    -    ondrain;
    -    constructor(src, dest, opts) {
    -        this.src = src;
    -        this.dest = dest;
    -        this.opts = opts;
    -        this.ondrain = () => src[RESUME]();
    -        this.dest.on('drain', this.ondrain);
    -    }
    -    unpipe() {
    -        this.dest.removeListener('drain', this.ondrain);
    -    }
    -    // only here for the prototype
    -    /* c8 ignore start */
    -    proxyErrors(_er) { }
    -    /* c8 ignore stop */
    -    end() {
    -        this.unpipe();
    -        if (this.opts.end)
    -            this.dest.end();
    -    }
    -}
    -/**
    - * Internal class representing a pipe to a destination stream where
    - * errors are proxied.
    - *
    - * @internal
    - */
    -class PipeProxyErrors extends Pipe {
    -    unpipe() {
    -        this.src.removeListener('error', this.proxyErrors);
    -        super.unpipe();
    -    }
    -    constructor(src, dest, opts) {
    -        super(src, dest, opts);
    -        this.proxyErrors = er => dest.emit('error', er);
    -        src.on('error', this.proxyErrors);
    -    }
    -}
    -const isObjectModeOptions = (o) => !!o.objectMode;
    -const isEncodingOptions = (o) => !o.objectMode && !!o.encoding && o.encoding !== 'buffer';
    -/**
    - * Main export, the Minipass class
    - *
    - * `RType` is the type of data emitted, defaults to Buffer
    - *
    - * `WType` is the type of data to be written, if RType is buffer or string,
    - * then any {@link Minipass.ContiguousData} is allowed.
    - *
    - * `Events` is the set of event handler signatures that this object
    - * will emit, see {@link Minipass.Events}
    - */
    -class Minipass extends events_1.EventEmitter {
    -    [FLOWING] = false;
    -    [PAUSED] = false;
    -    [PIPES] = [];
    -    [BUFFER] = [];
    -    [OBJECTMODE];
    -    [ENCODING];
    -    [ASYNC];
    -    [DECODER];
    -    [EOF] = false;
    -    [EMITTED_END] = false;
    -    [EMITTING_END] = false;
    -    [CLOSED] = false;
    -    [EMITTED_ERROR] = null;
    -    [BUFFERLENGTH] = 0;
    -    [DESTROYED] = false;
    -    [SIGNAL];
    -    [ABORTED] = false;
    -    [DATALISTENERS] = 0;
    -    [DISCARDED] = false;
    -    /**
    -     * true if the stream can be written
    -     */
    -    writable = true;
    -    /**
    -     * true if the stream can be read
    -     */
    -    readable = true;
    -    /**
    -     * If `RType` is Buffer, then options do not need to be provided.
    -     * Otherwise, an options object must be provided to specify either
    -     * {@link Minipass.SharedOptions.objectMode} or
    -     * {@link Minipass.SharedOptions.encoding}, as appropriate.
    -     */
    -    constructor(...args) {
    -        const options = (args[0] ||
    -            {});
    -        super();
    -        if (options.objectMode && typeof options.encoding === 'string') {
    -            throw new TypeError('Encoding and objectMode may not be used together');
    -        }
    -        if (isObjectModeOptions(options)) {
    -            this[OBJECTMODE] = true;
    -            this[ENCODING] = null;
    -        }
    -        else if (isEncodingOptions(options)) {
    -            this[ENCODING] = options.encoding;
    -            this[OBJECTMODE] = false;
    -        }
    -        else {
    -            this[OBJECTMODE] = false;
    -            this[ENCODING] = null;
    -        }
    -        this[ASYNC] = !!options.async;
    -        this[DECODER] = this[ENCODING]
    -            ? new string_decoder_1.StringDecoder(this[ENCODING])
    -            : null;
    -        //@ts-ignore - private option for debugging and testing
    -        if (options && options.debugExposeBuffer === true) {
    -            Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] });
    -        }
    -        //@ts-ignore - private option for debugging and testing
    -        if (options && options.debugExposePipes === true) {
    -            Object.defineProperty(this, 'pipes', { get: () => this[PIPES] });
    -        }
    -        const { signal } = options;
    -        if (signal) {
    -            this[SIGNAL] = signal;
    -            if (signal.aborted) {
    -                this[ABORT]();
    -            }
    -            else {
    -                signal.addEventListener('abort', () => this[ABORT]());
    -            }
    -        }
    -    }
    -    /**
    -     * The amount of data stored in the buffer waiting to be read.
    -     *
    -     * For Buffer strings, this will be the total byte length.
    -     * For string encoding streams, this will be the string character length,
    -     * according to JavaScript's `string.length` logic.
    -     * For objectMode streams, this is a count of the items waiting to be
    -     * emitted.
    -     */
    -    get bufferLength() {
    -        return this[BUFFERLENGTH];
    -    }
    -    /**
    -     * The `BufferEncoding` currently in use, or `null`
    -     */
    -    get encoding() {
    -        return this[ENCODING];
    -    }
    -    /**
    -     * @deprecated - This is a read only property
    -     */
    -    set encoding(_enc) {
    -        throw new Error('Encoding must be set at instantiation time');
    -    }
    -    /**
    -     * @deprecated - Encoding may only be set at instantiation time
    -     */
    -    setEncoding(_enc) {
    -        throw new Error('Encoding must be set at instantiation time');
    -    }
    -    /**
    -     * True if this is an objectMode stream
    -     */
    -    get objectMode() {
    -        return this[OBJECTMODE];
    -    }
    -    /**
    -     * @deprecated - This is a read-only property
    -     */
    -    set objectMode(_om) {
    -        throw new Error('objectMode must be set at instantiation time');
    -    }
    -    /**
    -     * true if this is an async stream
    -     */
    -    get ['async']() {
    -        return this[ASYNC];
    -    }
    -    /**
    -     * Set to true to make this stream async.
    -     *
    -     * Once set, it cannot be unset, as this would potentially cause incorrect
    -     * behavior.  Ie, a sync stream can be made async, but an async stream
    -     * cannot be safely made sync.
    -     */
    -    set ['async'](a) {
    -        this[ASYNC] = this[ASYNC] || !!a;
    -    }
    -    // drop everything and get out of the flow completely
    -    [ABORT]() {
    -        this[ABORTED] = true;
    -        this.emit('abort', this[SIGNAL]?.reason);
    -        this.destroy(this[SIGNAL]?.reason);
    -    }
    -    /**
    -     * True if the stream has been aborted.
    -     */
    -    get aborted() {
    -        return this[ABORTED];
    -    }
    -    /**
    -     * No-op setter. Stream aborted status is set via the AbortSignal provided
    -     * in the constructor options.
    -     */
    -    set aborted(_) { }
    -    write(chunk, encoding, cb) {
    -        if (this[ABORTED])
    -            return false;
    -        if (this[EOF])
    -            throw new Error('write after end');
    -        if (this[DESTROYED]) {
    -            this.emit('error', Object.assign(new Error('Cannot call write after a stream was destroyed'), { code: 'ERR_STREAM_DESTROYED' }));
    -            return true;
    -        }
    -        if (typeof encoding === 'function') {
    -            cb = encoding;
    -            encoding = 'utf8';
    -        }
    -        if (!encoding)
    -            encoding = 'utf8';
    -        const fn = this[ASYNC] ? defer : nodefer;
    -        // convert array buffers and typed array views into buffers
    -        // at some point in the future, we may want to do the opposite!
    -        // leave strings and buffers as-is
    -        // anything is only allowed if in object mode, so throw
    -        if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {
    -            if (isArrayBufferView(chunk)) {
    -                //@ts-ignore - sinful unsafe type changing
    -                chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength);
    -            }
    -            else if (isArrayBufferLike(chunk)) {
    -                //@ts-ignore - sinful unsafe type changing
    -                chunk = Buffer.from(chunk);
    -            }
    -            else if (typeof chunk !== 'string') {
    -                throw new Error('Non-contiguous data written to non-objectMode stream');
    -            }
    -        }
    -        // handle object mode up front, since it's simpler
    -        // this yields better performance, fewer checks later.
    -        if (this[OBJECTMODE]) {
    -            // maybe impossible?
    -            /* c8 ignore start */
    -            if (this[FLOWING] && this[BUFFERLENGTH] !== 0)
    -                this[FLUSH](true);
    -            /* c8 ignore stop */
    -            if (this[FLOWING])
    -                this.emit('data', chunk);
    -            else
    -                this[BUFFERPUSH](chunk);
    -            if (this[BUFFERLENGTH] !== 0)
    -                this.emit('readable');
    -            if (cb)
    -                fn(cb);
    -            return this[FLOWING];
    -        }
    -        // at this point the chunk is a buffer or string
    -        // don't buffer it up or send it to the decoder
    -        if (!chunk.length) {
    -            if (this[BUFFERLENGTH] !== 0)
    -                this.emit('readable');
    -            if (cb)
    -                fn(cb);
    -            return this[FLOWING];
    -        }
    -        // fast-path writing strings of same encoding to a stream with
    -        // an empty buffer, skipping the buffer/decoder dance
    -        if (typeof chunk === 'string' &&
    -            // unless it is a string already ready for us to use
    -            !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)) {
    -            //@ts-ignore - sinful unsafe type change
    -            chunk = Buffer.from(chunk, encoding);
    -        }
    -        if (Buffer.isBuffer(chunk) && this[ENCODING]) {
    -            //@ts-ignore - sinful unsafe type change
    -            chunk = this[DECODER].write(chunk);
    -        }
    -        // Note: flushing CAN potentially switch us into not-flowing mode
    -        if (this[FLOWING] && this[BUFFERLENGTH] !== 0)
    -            this[FLUSH](true);
    -        if (this[FLOWING])
    -            this.emit('data', chunk);
    -        else
    -            this[BUFFERPUSH](chunk);
    -        if (this[BUFFERLENGTH] !== 0)
    -            this.emit('readable');
    -        if (cb)
    -            fn(cb);
    -        return this[FLOWING];
    -    }
    -    /**
    -     * Low-level explicit read method.
    -     *
    -     * In objectMode, the argument is ignored, and one item is returned if
    -     * available.
    -     *
    -     * `n` is the number of bytes (or in the case of encoding streams,
    -     * characters) to consume. If `n` is not provided, then the entire buffer
    -     * is returned, or `null` is returned if no data is available.
    -     *
    -     * If `n` is greater that the amount of data in the internal buffer,
    -     * then `null` is returned.
    -     */
    -    read(n) {
    -        if (this[DESTROYED])
    -            return null;
    -        this[DISCARDED] = false;
    -        if (this[BUFFERLENGTH] === 0 ||
    -            n === 0 ||
    -            (n && n > this[BUFFERLENGTH])) {
    -            this[MAYBE_EMIT_END]();
    -            return null;
    -        }
    -        if (this[OBJECTMODE])
    -            n = null;
    -        if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {
    -            // not object mode, so if we have an encoding, then RType is string
    -            // otherwise, must be Buffer
    -            this[BUFFER] = [
    -                (this[ENCODING]
    -                    ? this[BUFFER].join('')
    -                    : Buffer.concat(this[BUFFER], this[BUFFERLENGTH])),
    -            ];
    -        }
    -        const ret = this[READ](n || null, this[BUFFER][0]);
    -        this[MAYBE_EMIT_END]();
    -        return ret;
    -    }
    -    [READ](n, chunk) {
    -        if (this[OBJECTMODE])
    -            this[BUFFERSHIFT]();
    -        else {
    -            const c = chunk;
    -            if (n === c.length || n === null)
    -                this[BUFFERSHIFT]();
    -            else if (typeof c === 'string') {
    -                this[BUFFER][0] = c.slice(n);
    -                chunk = c.slice(0, n);
    -                this[BUFFERLENGTH] -= n;
    -            }
    -            else {
    -                this[BUFFER][0] = c.subarray(n);
    -                chunk = c.subarray(0, n);
    -                this[BUFFERLENGTH] -= n;
    -            }
    -        }
    -        this.emit('data', chunk);
    -        if (!this[BUFFER].length && !this[EOF])
    -            this.emit('drain');
    -        return chunk;
    -    }
    -    end(chunk, encoding, cb) {
    -        if (typeof chunk === 'function') {
    -            cb = chunk;
    -            chunk = undefined;
    -        }
    -        if (typeof encoding === 'function') {
    -            cb = encoding;
    -            encoding = 'utf8';
    -        }
    -        if (chunk !== undefined)
    -            this.write(chunk, encoding);
    -        if (cb)
    -            this.once('end', cb);
    -        this[EOF] = true;
    -        this.writable = false;
    -        // if we haven't written anything, then go ahead and emit,
    -        // even if we're not reading.
    -        // we'll re-emit if a new 'end' listener is added anyway.
    -        // This makes MP more suitable to write-only use cases.
    -        if (this[FLOWING] || !this[PAUSED])
    -            this[MAYBE_EMIT_END]();
    -        return this;
    -    }
    -    // don't let the internal resume be overwritten
    -    [RESUME]() {
    -        if (this[DESTROYED])
    -            return;
    -        if (!this[DATALISTENERS] && !this[PIPES].length) {
    -            this[DISCARDED] = true;
    -        }
    -        this[PAUSED] = false;
    -        this[FLOWING] = true;
    -        this.emit('resume');
    -        if (this[BUFFER].length)
    -            this[FLUSH]();
    -        else if (this[EOF])
    -            this[MAYBE_EMIT_END]();
    -        else
    -            this.emit('drain');
    -    }
    -    /**
    -     * Resume the stream if it is currently in a paused state
    -     *
    -     * If called when there are no pipe destinations or `data` event listeners,
    -     * this will place the stream in a "discarded" state, where all data will
    -     * be thrown away. The discarded state is removed if a pipe destination or
    -     * data handler is added, if pause() is called, or if any synchronous or
    -     * asynchronous iteration is started.
    -     */
    -    resume() {
    -        return this[RESUME]();
    -    }
    -    /**
    -     * Pause the stream
    -     */
    -    pause() {
    -        this[FLOWING] = false;
    -        this[PAUSED] = true;
    -        this[DISCARDED] = false;
    -    }
    -    /**
    -     * true if the stream has been forcibly destroyed
    -     */
    -    get destroyed() {
    -        return this[DESTROYED];
    -    }
    -    /**
    -     * true if the stream is currently in a flowing state, meaning that
    -     * any writes will be immediately emitted.
    -     */
    -    get flowing() {
    -        return this[FLOWING];
    -    }
    -    /**
    -     * true if the stream is currently in a paused state
    -     */
    -    get paused() {
    -        return this[PAUSED];
    -    }
    -    [BUFFERPUSH](chunk) {
    -        if (this[OBJECTMODE])
    -            this[BUFFERLENGTH] += 1;
    -        else
    -            this[BUFFERLENGTH] += chunk.length;
    -        this[BUFFER].push(chunk);
    -    }
    -    [BUFFERSHIFT]() {
    -        if (this[OBJECTMODE])
    -            this[BUFFERLENGTH] -= 1;
    -        else
    -            this[BUFFERLENGTH] -= this[BUFFER][0].length;
    -        return this[BUFFER].shift();
    -    }
    -    [FLUSH](noDrain = false) {
    -        do { } while (this[FLUSHCHUNK](this[BUFFERSHIFT]()) &&
    -            this[BUFFER].length);
    -        if (!noDrain && !this[BUFFER].length && !this[EOF])
    -            this.emit('drain');
    -    }
    -    [FLUSHCHUNK](chunk) {
    -        this.emit('data', chunk);
    -        return this[FLOWING];
    -    }
    -    /**
    -     * Pipe all data emitted by this stream into the destination provided.
    -     *
    -     * Triggers the flow of data.
    -     */
    -    pipe(dest, opts) {
    -        if (this[DESTROYED])
    -            return dest;
    -        this[DISCARDED] = false;
    -        const ended = this[EMITTED_END];
    -        opts = opts || {};
    -        if (dest === proc.stdout || dest === proc.stderr)
    -            opts.end = false;
    -        else
    -            opts.end = opts.end !== false;
    -        opts.proxyErrors = !!opts.proxyErrors;
    -        // piping an ended stream ends immediately
    -        if (ended) {
    -            if (opts.end)
    -                dest.end();
    -        }
    -        else {
    -            // "as" here just ignores the WType, which pipes don't care about,
    -            // since they're only consuming from us, and writing to the dest
    -            this[PIPES].push(!opts.proxyErrors
    -                ? new Pipe(this, dest, opts)
    -                : new PipeProxyErrors(this, dest, opts));
    -            if (this[ASYNC])
    -                defer(() => this[RESUME]());
    -            else
    -                this[RESUME]();
    -        }
    -        return dest;
    -    }
    -    /**
    -     * Fully unhook a piped destination stream.
    -     *
    -     * If the destination stream was the only consumer of this stream (ie,
    -     * there are no other piped destinations or `'data'` event listeners)
    -     * then the flow of data will stop until there is another consumer or
    -     * {@link Minipass#resume} is explicitly called.
    -     */
    -    unpipe(dest) {
    -        const p = this[PIPES].find(p => p.dest === dest);
    -        if (p) {
    -            if (this[PIPES].length === 1) {
    -                if (this[FLOWING] && this[DATALISTENERS] === 0) {
    -                    this[FLOWING] = false;
    -                }
    -                this[PIPES] = [];
    -            }
    -            else
    -                this[PIPES].splice(this[PIPES].indexOf(p), 1);
    -            p.unpipe();
    -        }
    -    }
    -    /**
    -     * Alias for {@link Minipass#on}
    -     */
    -    addListener(ev, handler) {
    -        return this.on(ev, handler);
    -    }
    -    /**
    -     * Mostly identical to `EventEmitter.on`, with the following
    -     * behavior differences to prevent data loss and unnecessary hangs:
    -     *
    -     * - Adding a 'data' event handler will trigger the flow of data
    -     *
    -     * - Adding a 'readable' event handler when there is data waiting to be read
    -     *   will cause 'readable' to be emitted immediately.
    -     *
    -     * - Adding an 'endish' event handler ('end', 'finish', etc.) which has
    -     *   already passed will cause the event to be emitted immediately and all
    -     *   handlers removed.
    -     *
    -     * - Adding an 'error' event handler after an error has been emitted will
    -     *   cause the event to be re-emitted immediately with the error previously
    -     *   raised.
    -     */
    -    on(ev, handler) {
    -        const ret = super.on(ev, handler);
    -        if (ev === 'data') {
    -            this[DISCARDED] = false;
    -            this[DATALISTENERS]++;
    -            if (!this[PIPES].length && !this[FLOWING]) {
    -                this[RESUME]();
    -            }
    -        }
    -        else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) {
    -            super.emit('readable');
    -        }
    -        else if (isEndish(ev) && this[EMITTED_END]) {
    -            super.emit(ev);
    -            this.removeAllListeners(ev);
    -        }
    -        else if (ev === 'error' && this[EMITTED_ERROR]) {
    -            const h = handler;
    -            if (this[ASYNC])
    -                defer(() => h.call(this, this[EMITTED_ERROR]));
    -            else
    -                h.call(this, this[EMITTED_ERROR]);
    -        }
    -        return ret;
    -    }
    -    /**
    -     * Alias for {@link Minipass#off}
    -     */
    -    removeListener(ev, handler) {
    -        return this.off(ev, handler);
    -    }
    -    /**
    -     * Mostly identical to `EventEmitter.off`
    -     *
    -     * If a 'data' event handler is removed, and it was the last consumer
    -     * (ie, there are no pipe destinations or other 'data' event listeners),
    -     * then the flow of data will stop until there is another consumer or
    -     * {@link Minipass#resume} is explicitly called.
    -     */
    -    off(ev, handler) {
    -        const ret = super.off(ev, handler);
    -        // if we previously had listeners, and now we don't, and we don't
    -        // have any pipes, then stop the flow, unless it's been explicitly
    -        // put in a discarded flowing state via stream.resume().
    -        if (ev === 'data') {
    -            this[DATALISTENERS] = this.listeners('data').length;
    -            if (this[DATALISTENERS] === 0 &&
    -                !this[DISCARDED] &&
    -                !this[PIPES].length) {
    -                this[FLOWING] = false;
    -            }
    -        }
    -        return ret;
    -    }
    -    /**
    -     * Mostly identical to `EventEmitter.removeAllListeners`
    -     *
    -     * If all 'data' event handlers are removed, and they were the last consumer
    -     * (ie, there are no pipe destinations), then the flow of data will stop
    -     * until there is another consumer or {@link Minipass#resume} is explicitly
    -     * called.
    -     */
    -    removeAllListeners(ev) {
    -        const ret = super.removeAllListeners(ev);
    -        if (ev === 'data' || ev === undefined) {
    -            this[DATALISTENERS] = 0;
    -            if (!this[DISCARDED] && !this[PIPES].length) {
    -                this[FLOWING] = false;
    -            }
    -        }
    -        return ret;
    -    }
    -    /**
    -     * true if the 'end' event has been emitted
    -     */
    -    get emittedEnd() {
    -        return this[EMITTED_END];
    -    }
    -    [MAYBE_EMIT_END]() {
    -        if (!this[EMITTING_END] &&
    -            !this[EMITTED_END] &&
    -            !this[DESTROYED] &&
    -            this[BUFFER].length === 0 &&
    -            this[EOF]) {
    -            this[EMITTING_END] = true;
    -            this.emit('end');
    -            this.emit('prefinish');
    -            this.emit('finish');
    -            if (this[CLOSED])
    -                this.emit('close');
    -            this[EMITTING_END] = false;
    -        }
    -    }
    -    /**
    -     * Mostly identical to `EventEmitter.emit`, with the following
    -     * behavior differences to prevent data loss and unnecessary hangs:
    -     *
    -     * If the stream has been destroyed, and the event is something other
    -     * than 'close' or 'error', then `false` is returned and no handlers
    -     * are called.
    -     *
    -     * If the event is 'end', and has already been emitted, then the event
    -     * is ignored. If the stream is in a paused or non-flowing state, then
    -     * the event will be deferred until data flow resumes. If the stream is
    -     * async, then handlers will be called on the next tick rather than
    -     * immediately.
    -     *
    -     * If the event is 'close', and 'end' has not yet been emitted, then
    -     * the event will be deferred until after 'end' is emitted.
    -     *
    -     * If the event is 'error', and an AbortSignal was provided for the stream,
    -     * and there are no listeners, then the event is ignored, matching the
    -     * behavior of node core streams in the presense of an AbortSignal.
    -     *
    -     * If the event is 'finish' or 'prefinish', then all listeners will be
    -     * removed after emitting the event, to prevent double-firing.
    -     */
    -    emit(ev, ...args) {
    -        const data = args[0];
    -        // error and close are only events allowed after calling destroy()
    -        if (ev !== 'error' &&
    -            ev !== 'close' &&
    -            ev !== DESTROYED &&
    -            this[DESTROYED]) {
    -            return false;
    -        }
    -        else if (ev === 'data') {
    -            return !this[OBJECTMODE] && !data
    -                ? false
    -                : this[ASYNC]
    -                    ? (defer(() => this[EMITDATA](data)), true)
    -                    : this[EMITDATA](data);
    -        }
    -        else if (ev === 'end') {
    -            return this[EMITEND]();
    -        }
    -        else if (ev === 'close') {
    -            this[CLOSED] = true;
    -            // don't emit close before 'end' and 'finish'
    -            if (!this[EMITTED_END] && !this[DESTROYED])
    -                return false;
    -            const ret = super.emit('close');
    -            this.removeAllListeners('close');
    -            return ret;
    -        }
    -        else if (ev === 'error') {
    -            this[EMITTED_ERROR] = data;
    -            super.emit(ERROR, data);
    -            const ret = !this[SIGNAL] || this.listeners('error').length
    -                ? super.emit('error', data)
    -                : false;
    -            this[MAYBE_EMIT_END]();
    -            return ret;
    -        }
    -        else if (ev === 'resume') {
    -            const ret = super.emit('resume');
    -            this[MAYBE_EMIT_END]();
    -            return ret;
    -        }
    -        else if (ev === 'finish' || ev === 'prefinish') {
    -            const ret = super.emit(ev);
    -            this.removeAllListeners(ev);
    -            return ret;
    -        }
    -        // Some other unknown event
    -        const ret = super.emit(ev, ...args);
    -        this[MAYBE_EMIT_END]();
    -        return ret;
    -    }
    -    [EMITDATA](data) {
    -        for (const p of this[PIPES]) {
    -            if (p.dest.write(data) === false)
    -                this.pause();
    -        }
    -        const ret = this[DISCARDED] ? false : super.emit('data', data);
    -        this[MAYBE_EMIT_END]();
    -        return ret;
    -    }
    -    [EMITEND]() {
    -        if (this[EMITTED_END])
    -            return false;
    -        this[EMITTED_END] = true;
    -        this.readable = false;
    -        return this[ASYNC]
    -            ? (defer(() => this[EMITEND2]()), true)
    -            : this[EMITEND2]();
    -    }
    -    [EMITEND2]() {
    -        if (this[DECODER]) {
    -            const data = this[DECODER].end();
    -            if (data) {
    -                for (const p of this[PIPES]) {
    -                    p.dest.write(data);
    -                }
    -                if (!this[DISCARDED])
    -                    super.emit('data', data);
    -            }
    -        }
    -        for (const p of this[PIPES]) {
    -            p.end();
    -        }
    -        const ret = super.emit('end');
    -        this.removeAllListeners('end');
    -        return ret;
    -    }
    -    /**
    -     * Return a Promise that resolves to an array of all emitted data once
    -     * the stream ends.
    -     */
    -    async collect() {
    -        const buf = Object.assign([], {
    -            dataLength: 0,
    -        });
    -        if (!this[OBJECTMODE])
    -            buf.dataLength = 0;
    -        // set the promise first, in case an error is raised
    -        // by triggering the flow here.
    -        const p = this.promise();
    -        this.on('data', c => {
    -            buf.push(c);
    -            if (!this[OBJECTMODE])
    -                buf.dataLength += c.length;
    -        });
    -        await p;
    -        return buf;
    -    }
    -    /**
    -     * Return a Promise that resolves to the concatenation of all emitted data
    -     * once the stream ends.
    -     *
    -     * Not allowed on objectMode streams.
    -     */
    -    async concat() {
    -        if (this[OBJECTMODE]) {
    -            throw new Error('cannot concat in objectMode');
    -        }
    -        const buf = await this.collect();
    -        return (this[ENCODING]
    -            ? buf.join('')
    -            : Buffer.concat(buf, buf.dataLength));
    -    }
    -    /**
    -     * Return a void Promise that resolves once the stream ends.
    -     */
    -    async promise() {
    -        return new Promise((resolve, reject) => {
    -            this.on(DESTROYED, () => reject(new Error('stream destroyed')));
    -            this.on('error', er => reject(er));
    -            this.on('end', () => resolve());
    -        });
    -    }
    -    /**
    -     * Asynchronous `for await of` iteration.
    -     *
    -     * This will continue emitting all chunks until the stream terminates.
    -     */
    -    [Symbol.asyncIterator]() {
    -        // set this up front, in case the consumer doesn't call next()
    -        // right away.
    -        this[DISCARDED] = false;
    -        let stopped = false;
    -        const stop = async () => {
    -            this.pause();
    -            stopped = true;
    -            return { value: undefined, done: true };
    -        };
    -        const next = () => {
    -            if (stopped)
    -                return stop();
    -            const res = this.read();
    -            if (res !== null)
    -                return Promise.resolve({ done: false, value: res });
    -            if (this[EOF])
    -                return stop();
    -            let resolve;
    -            let reject;
    -            const onerr = (er) => {
    -                this.off('data', ondata);
    -                this.off('end', onend);
    -                this.off(DESTROYED, ondestroy);
    -                stop();
    -                reject(er);
    -            };
    -            const ondata = (value) => {
    -                this.off('error', onerr);
    -                this.off('end', onend);
    -                this.off(DESTROYED, ondestroy);
    -                this.pause();
    -                resolve({ value, done: !!this[EOF] });
    -            };
    -            const onend = () => {
    -                this.off('error', onerr);
    -                this.off('data', ondata);
    -                this.off(DESTROYED, ondestroy);
    -                stop();
    -                resolve({ done: true, value: undefined });
    -            };
    -            const ondestroy = () => onerr(new Error('stream destroyed'));
    -            return new Promise((res, rej) => {
    -                reject = rej;
    -                resolve = res;
    -                this.once(DESTROYED, ondestroy);
    -                this.once('error', onerr);
    -                this.once('end', onend);
    -                this.once('data', ondata);
    -            });
    -        };
    -        return {
    -            next,
    -            throw: stop,
    -            return: stop,
    -            [Symbol.asyncIterator]() {
    -                return this;
    -            },
    -        };
    -    }
    -    /**
    -     * Synchronous `for of` iteration.
    -     *
    -     * The iteration will terminate when the internal buffer runs out, even
    -     * if the stream has not yet terminated.
    -     */
    -    [Symbol.iterator]() {
    -        // set this up front, in case the consumer doesn't call next()
    -        // right away.
    -        this[DISCARDED] = false;
    -        let stopped = false;
    -        const stop = () => {
    -            this.pause();
    -            this.off(ERROR, stop);
    -            this.off(DESTROYED, stop);
    -            this.off('end', stop);
    -            stopped = true;
    -            return { done: true, value: undefined };
    -        };
    -        const next = () => {
    -            if (stopped)
    -                return stop();
    -            const value = this.read();
    -            return value === null ? stop() : { done: false, value };
    -        };
    -        this.once('end', stop);
    -        this.once(ERROR, stop);
    -        this.once(DESTROYED, stop);
    -        return {
    -            next,
    -            throw: stop,
    -            return: stop,
    -            [Symbol.iterator]() {
    -                return this;
    -            },
    -        };
    -    }
    -    /**
    -     * Destroy a stream, preventing it from being used for any further purpose.
    -     *
    -     * If the stream has a `close()` method, then it will be called on
    -     * destruction.
    -     *
    -     * After destruction, any attempt to write data, read data, or emit most
    -     * events will be ignored.
    -     *
    -     * If an error argument is provided, then it will be emitted in an
    -     * 'error' event.
    -     */
    -    destroy(er) {
    -        if (this[DESTROYED]) {
    -            if (er)
    -                this.emit('error', er);
    -            else
    -                this.emit(DESTROYED);
    -            return this;
    -        }
    -        this[DESTROYED] = true;
    -        this[DISCARDED] = true;
    -        // throw away all buffered data, it's never coming out
    -        this[BUFFER].length = 0;
    -        this[BUFFERLENGTH] = 0;
    -        const wc = this;
    -        if (typeof wc.close === 'function' && !this[CLOSED])
    -            wc.close();
    -        if (er)
    -            this.emit('error', er);
    -        // if no error to emit, still reject pending promises
    -        else
    -            this.emit(DESTROYED);
    -        return this;
    -    }
    -    /**
    -     * Alias for {@link isStream}
    -     *
    -     * Former export location, maintained for backwards compatibility.
    -     *
    -     * @deprecated
    -     */
    -    static get isStream() {
    -        return exports.isStream;
    -    }
    -}
    -exports.Minipass = Minipass;
    -//# sourceMappingURL=index.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minipass/dist/cjs/package.json b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minipass/dist/cjs/package.json
    deleted file mode 100644
    index 5bbefffbabee39..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minipass/dist/cjs/package.json
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -{
    -  "type": "commonjs"
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minipass/dist/mjs/index.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minipass/dist/mjs/index.js
    deleted file mode 100644
    index b65fafbae43a4e..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minipass/dist/mjs/index.js
    +++ /dev/null
    @@ -1,1018 +0,0 @@
    -const proc = typeof process === 'object' && process
    -    ? process
    -    : {
    -        stdout: null,
    -        stderr: null,
    -    };
    -import { EventEmitter } from 'events';
    -import Stream from 'stream';
    -import { StringDecoder } from 'string_decoder';
    -/**
    - * Return true if the argument is a Minipass stream, Node stream, or something
    - * else that Minipass can interact with.
    - */
    -export const isStream = (s) => !!s &&
    -    typeof s === 'object' &&
    -    (s instanceof Minipass ||
    -        s instanceof Stream ||
    -        isReadable(s) ||
    -        isWritable(s));
    -/**
    - * Return true if the argument is a valid {@link Minipass.Readable}
    - */
    -export const isReadable = (s) => !!s &&
    -    typeof s === 'object' &&
    -    s instanceof EventEmitter &&
    -    typeof s.pipe === 'function' &&
    -    // node core Writable streams have a pipe() method, but it throws
    -    s.pipe !== Stream.Writable.prototype.pipe;
    -/**
    - * Return true if the argument is a valid {@link Minipass.Writable}
    - */
    -export const isWritable = (s) => !!s &&
    -    typeof s === 'object' &&
    -    s instanceof EventEmitter &&
    -    typeof s.write === 'function' &&
    -    typeof s.end === 'function';
    -const EOF = Symbol('EOF');
    -const MAYBE_EMIT_END = Symbol('maybeEmitEnd');
    -const EMITTED_END = Symbol('emittedEnd');
    -const EMITTING_END = Symbol('emittingEnd');
    -const EMITTED_ERROR = Symbol('emittedError');
    -const CLOSED = Symbol('closed');
    -const READ = Symbol('read');
    -const FLUSH = Symbol('flush');
    -const FLUSHCHUNK = Symbol('flushChunk');
    -const ENCODING = Symbol('encoding');
    -const DECODER = Symbol('decoder');
    -const FLOWING = Symbol('flowing');
    -const PAUSED = Symbol('paused');
    -const RESUME = Symbol('resume');
    -const BUFFER = Symbol('buffer');
    -const PIPES = Symbol('pipes');
    -const BUFFERLENGTH = Symbol('bufferLength');
    -const BUFFERPUSH = Symbol('bufferPush');
    -const BUFFERSHIFT = Symbol('bufferShift');
    -const OBJECTMODE = Symbol('objectMode');
    -// internal event when stream is destroyed
    -const DESTROYED = Symbol('destroyed');
    -// internal event when stream has an error
    -const ERROR = Symbol('error');
    -const EMITDATA = Symbol('emitData');
    -const EMITEND = Symbol('emitEnd');
    -const EMITEND2 = Symbol('emitEnd2');
    -const ASYNC = Symbol('async');
    -const ABORT = Symbol('abort');
    -const ABORTED = Symbol('aborted');
    -const SIGNAL = Symbol('signal');
    -const DATALISTENERS = Symbol('dataListeners');
    -const DISCARDED = Symbol('discarded');
    -const defer = (fn) => Promise.resolve().then(fn);
    -const nodefer = (fn) => fn();
    -const isEndish = (ev) => ev === 'end' || ev === 'finish' || ev === 'prefinish';
    -const isArrayBufferLike = (b) => b instanceof ArrayBuffer ||
    -    (!!b &&
    -        typeof b === 'object' &&
    -        b.constructor &&
    -        b.constructor.name === 'ArrayBuffer' &&
    -        b.byteLength >= 0);
    -const isArrayBufferView = (b) => !Buffer.isBuffer(b) && ArrayBuffer.isView(b);
    -/**
    - * Internal class representing a pipe to a destination stream.
    - *
    - * @internal
    - */
    -class Pipe {
    -    src;
    -    dest;
    -    opts;
    -    ondrain;
    -    constructor(src, dest, opts) {
    -        this.src = src;
    -        this.dest = dest;
    -        this.opts = opts;
    -        this.ondrain = () => src[RESUME]();
    -        this.dest.on('drain', this.ondrain);
    -    }
    -    unpipe() {
    -        this.dest.removeListener('drain', this.ondrain);
    -    }
    -    // only here for the prototype
    -    /* c8 ignore start */
    -    proxyErrors(_er) { }
    -    /* c8 ignore stop */
    -    end() {
    -        this.unpipe();
    -        if (this.opts.end)
    -            this.dest.end();
    -    }
    -}
    -/**
    - * Internal class representing a pipe to a destination stream where
    - * errors are proxied.
    - *
    - * @internal
    - */
    -class PipeProxyErrors extends Pipe {
    -    unpipe() {
    -        this.src.removeListener('error', this.proxyErrors);
    -        super.unpipe();
    -    }
    -    constructor(src, dest, opts) {
    -        super(src, dest, opts);
    -        this.proxyErrors = er => dest.emit('error', er);
    -        src.on('error', this.proxyErrors);
    -    }
    -}
    -const isObjectModeOptions = (o) => !!o.objectMode;
    -const isEncodingOptions = (o) => !o.objectMode && !!o.encoding && o.encoding !== 'buffer';
    -/**
    - * Main export, the Minipass class
    - *
    - * `RType` is the type of data emitted, defaults to Buffer
    - *
    - * `WType` is the type of data to be written, if RType is buffer or string,
    - * then any {@link Minipass.ContiguousData} is allowed.
    - *
    - * `Events` is the set of event handler signatures that this object
    - * will emit, see {@link Minipass.Events}
    - */
    -export class Minipass extends EventEmitter {
    -    [FLOWING] = false;
    -    [PAUSED] = false;
    -    [PIPES] = [];
    -    [BUFFER] = [];
    -    [OBJECTMODE];
    -    [ENCODING];
    -    [ASYNC];
    -    [DECODER];
    -    [EOF] = false;
    -    [EMITTED_END] = false;
    -    [EMITTING_END] = false;
    -    [CLOSED] = false;
    -    [EMITTED_ERROR] = null;
    -    [BUFFERLENGTH] = 0;
    -    [DESTROYED] = false;
    -    [SIGNAL];
    -    [ABORTED] = false;
    -    [DATALISTENERS] = 0;
    -    [DISCARDED] = false;
    -    /**
    -     * true if the stream can be written
    -     */
    -    writable = true;
    -    /**
    -     * true if the stream can be read
    -     */
    -    readable = true;
    -    /**
    -     * If `RType` is Buffer, then options do not need to be provided.
    -     * Otherwise, an options object must be provided to specify either
    -     * {@link Minipass.SharedOptions.objectMode} or
    -     * {@link Minipass.SharedOptions.encoding}, as appropriate.
    -     */
    -    constructor(...args) {
    -        const options = (args[0] ||
    -            {});
    -        super();
    -        if (options.objectMode && typeof options.encoding === 'string') {
    -            throw new TypeError('Encoding and objectMode may not be used together');
    -        }
    -        if (isObjectModeOptions(options)) {
    -            this[OBJECTMODE] = true;
    -            this[ENCODING] = null;
    -        }
    -        else if (isEncodingOptions(options)) {
    -            this[ENCODING] = options.encoding;
    -            this[OBJECTMODE] = false;
    -        }
    -        else {
    -            this[OBJECTMODE] = false;
    -            this[ENCODING] = null;
    -        }
    -        this[ASYNC] = !!options.async;
    -        this[DECODER] = this[ENCODING]
    -            ? new StringDecoder(this[ENCODING])
    -            : null;
    -        //@ts-ignore - private option for debugging and testing
    -        if (options && options.debugExposeBuffer === true) {
    -            Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] });
    -        }
    -        //@ts-ignore - private option for debugging and testing
    -        if (options && options.debugExposePipes === true) {
    -            Object.defineProperty(this, 'pipes', { get: () => this[PIPES] });
    -        }
    -        const { signal } = options;
    -        if (signal) {
    -            this[SIGNAL] = signal;
    -            if (signal.aborted) {
    -                this[ABORT]();
    -            }
    -            else {
    -                signal.addEventListener('abort', () => this[ABORT]());
    -            }
    -        }
    -    }
    -    /**
    -     * The amount of data stored in the buffer waiting to be read.
    -     *
    -     * For Buffer strings, this will be the total byte length.
    -     * For string encoding streams, this will be the string character length,
    -     * according to JavaScript's `string.length` logic.
    -     * For objectMode streams, this is a count of the items waiting to be
    -     * emitted.
    -     */
    -    get bufferLength() {
    -        return this[BUFFERLENGTH];
    -    }
    -    /**
    -     * The `BufferEncoding` currently in use, or `null`
    -     */
    -    get encoding() {
    -        return this[ENCODING];
    -    }
    -    /**
    -     * @deprecated - This is a read only property
    -     */
    -    set encoding(_enc) {
    -        throw new Error('Encoding must be set at instantiation time');
    -    }
    -    /**
    -     * @deprecated - Encoding may only be set at instantiation time
    -     */
    -    setEncoding(_enc) {
    -        throw new Error('Encoding must be set at instantiation time');
    -    }
    -    /**
    -     * True if this is an objectMode stream
    -     */
    -    get objectMode() {
    -        return this[OBJECTMODE];
    -    }
    -    /**
    -     * @deprecated - This is a read-only property
    -     */
    -    set objectMode(_om) {
    -        throw new Error('objectMode must be set at instantiation time');
    -    }
    -    /**
    -     * true if this is an async stream
    -     */
    -    get ['async']() {
    -        return this[ASYNC];
    -    }
    -    /**
    -     * Set to true to make this stream async.
    -     *
    -     * Once set, it cannot be unset, as this would potentially cause incorrect
    -     * behavior.  Ie, a sync stream can be made async, but an async stream
    -     * cannot be safely made sync.
    -     */
    -    set ['async'](a) {
    -        this[ASYNC] = this[ASYNC] || !!a;
    -    }
    -    // drop everything and get out of the flow completely
    -    [ABORT]() {
    -        this[ABORTED] = true;
    -        this.emit('abort', this[SIGNAL]?.reason);
    -        this.destroy(this[SIGNAL]?.reason);
    -    }
    -    /**
    -     * True if the stream has been aborted.
    -     */
    -    get aborted() {
    -        return this[ABORTED];
    -    }
    -    /**
    -     * No-op setter. Stream aborted status is set via the AbortSignal provided
    -     * in the constructor options.
    -     */
    -    set aborted(_) { }
    -    write(chunk, encoding, cb) {
    -        if (this[ABORTED])
    -            return false;
    -        if (this[EOF])
    -            throw new Error('write after end');
    -        if (this[DESTROYED]) {
    -            this.emit('error', Object.assign(new Error('Cannot call write after a stream was destroyed'), { code: 'ERR_STREAM_DESTROYED' }));
    -            return true;
    -        }
    -        if (typeof encoding === 'function') {
    -            cb = encoding;
    -            encoding = 'utf8';
    -        }
    -        if (!encoding)
    -            encoding = 'utf8';
    -        const fn = this[ASYNC] ? defer : nodefer;
    -        // convert array buffers and typed array views into buffers
    -        // at some point in the future, we may want to do the opposite!
    -        // leave strings and buffers as-is
    -        // anything is only allowed if in object mode, so throw
    -        if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {
    -            if (isArrayBufferView(chunk)) {
    -                //@ts-ignore - sinful unsafe type changing
    -                chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength);
    -            }
    -            else if (isArrayBufferLike(chunk)) {
    -                //@ts-ignore - sinful unsafe type changing
    -                chunk = Buffer.from(chunk);
    -            }
    -            else if (typeof chunk !== 'string') {
    -                throw new Error('Non-contiguous data written to non-objectMode stream');
    -            }
    -        }
    -        // handle object mode up front, since it's simpler
    -        // this yields better performance, fewer checks later.
    -        if (this[OBJECTMODE]) {
    -            // maybe impossible?
    -            /* c8 ignore start */
    -            if (this[FLOWING] && this[BUFFERLENGTH] !== 0)
    -                this[FLUSH](true);
    -            /* c8 ignore stop */
    -            if (this[FLOWING])
    -                this.emit('data', chunk);
    -            else
    -                this[BUFFERPUSH](chunk);
    -            if (this[BUFFERLENGTH] !== 0)
    -                this.emit('readable');
    -            if (cb)
    -                fn(cb);
    -            return this[FLOWING];
    -        }
    -        // at this point the chunk is a buffer or string
    -        // don't buffer it up or send it to the decoder
    -        if (!chunk.length) {
    -            if (this[BUFFERLENGTH] !== 0)
    -                this.emit('readable');
    -            if (cb)
    -                fn(cb);
    -            return this[FLOWING];
    -        }
    -        // fast-path writing strings of same encoding to a stream with
    -        // an empty buffer, skipping the buffer/decoder dance
    -        if (typeof chunk === 'string' &&
    -            // unless it is a string already ready for us to use
    -            !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)) {
    -            //@ts-ignore - sinful unsafe type change
    -            chunk = Buffer.from(chunk, encoding);
    -        }
    -        if (Buffer.isBuffer(chunk) && this[ENCODING]) {
    -            //@ts-ignore - sinful unsafe type change
    -            chunk = this[DECODER].write(chunk);
    -        }
    -        // Note: flushing CAN potentially switch us into not-flowing mode
    -        if (this[FLOWING] && this[BUFFERLENGTH] !== 0)
    -            this[FLUSH](true);
    -        if (this[FLOWING])
    -            this.emit('data', chunk);
    -        else
    -            this[BUFFERPUSH](chunk);
    -        if (this[BUFFERLENGTH] !== 0)
    -            this.emit('readable');
    -        if (cb)
    -            fn(cb);
    -        return this[FLOWING];
    -    }
    -    /**
    -     * Low-level explicit read method.
    -     *
    -     * In objectMode, the argument is ignored, and one item is returned if
    -     * available.
    -     *
    -     * `n` is the number of bytes (or in the case of encoding streams,
    -     * characters) to consume. If `n` is not provided, then the entire buffer
    -     * is returned, or `null` is returned if no data is available.
    -     *
    -     * If `n` is greater that the amount of data in the internal buffer,
    -     * then `null` is returned.
    -     */
    -    read(n) {
    -        if (this[DESTROYED])
    -            return null;
    -        this[DISCARDED] = false;
    -        if (this[BUFFERLENGTH] === 0 ||
    -            n === 0 ||
    -            (n && n > this[BUFFERLENGTH])) {
    -            this[MAYBE_EMIT_END]();
    -            return null;
    -        }
    -        if (this[OBJECTMODE])
    -            n = null;
    -        if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {
    -            // not object mode, so if we have an encoding, then RType is string
    -            // otherwise, must be Buffer
    -            this[BUFFER] = [
    -                (this[ENCODING]
    -                    ? this[BUFFER].join('')
    -                    : Buffer.concat(this[BUFFER], this[BUFFERLENGTH])),
    -            ];
    -        }
    -        const ret = this[READ](n || null, this[BUFFER][0]);
    -        this[MAYBE_EMIT_END]();
    -        return ret;
    -    }
    -    [READ](n, chunk) {
    -        if (this[OBJECTMODE])
    -            this[BUFFERSHIFT]();
    -        else {
    -            const c = chunk;
    -            if (n === c.length || n === null)
    -                this[BUFFERSHIFT]();
    -            else if (typeof c === 'string') {
    -                this[BUFFER][0] = c.slice(n);
    -                chunk = c.slice(0, n);
    -                this[BUFFERLENGTH] -= n;
    -            }
    -            else {
    -                this[BUFFER][0] = c.subarray(n);
    -                chunk = c.subarray(0, n);
    -                this[BUFFERLENGTH] -= n;
    -            }
    -        }
    -        this.emit('data', chunk);
    -        if (!this[BUFFER].length && !this[EOF])
    -            this.emit('drain');
    -        return chunk;
    -    }
    -    end(chunk, encoding, cb) {
    -        if (typeof chunk === 'function') {
    -            cb = chunk;
    -            chunk = undefined;
    -        }
    -        if (typeof encoding === 'function') {
    -            cb = encoding;
    -            encoding = 'utf8';
    -        }
    -        if (chunk !== undefined)
    -            this.write(chunk, encoding);
    -        if (cb)
    -            this.once('end', cb);
    -        this[EOF] = true;
    -        this.writable = false;
    -        // if we haven't written anything, then go ahead and emit,
    -        // even if we're not reading.
    -        // we'll re-emit if a new 'end' listener is added anyway.
    -        // This makes MP more suitable to write-only use cases.
    -        if (this[FLOWING] || !this[PAUSED])
    -            this[MAYBE_EMIT_END]();
    -        return this;
    -    }
    -    // don't let the internal resume be overwritten
    -    [RESUME]() {
    -        if (this[DESTROYED])
    -            return;
    -        if (!this[DATALISTENERS] && !this[PIPES].length) {
    -            this[DISCARDED] = true;
    -        }
    -        this[PAUSED] = false;
    -        this[FLOWING] = true;
    -        this.emit('resume');
    -        if (this[BUFFER].length)
    -            this[FLUSH]();
    -        else if (this[EOF])
    -            this[MAYBE_EMIT_END]();
    -        else
    -            this.emit('drain');
    -    }
    -    /**
    -     * Resume the stream if it is currently in a paused state
    -     *
    -     * If called when there are no pipe destinations or `data` event listeners,
    -     * this will place the stream in a "discarded" state, where all data will
    -     * be thrown away. The discarded state is removed if a pipe destination or
    -     * data handler is added, if pause() is called, or if any synchronous or
    -     * asynchronous iteration is started.
    -     */
    -    resume() {
    -        return this[RESUME]();
    -    }
    -    /**
    -     * Pause the stream
    -     */
    -    pause() {
    -        this[FLOWING] = false;
    -        this[PAUSED] = true;
    -        this[DISCARDED] = false;
    -    }
    -    /**
    -     * true if the stream has been forcibly destroyed
    -     */
    -    get destroyed() {
    -        return this[DESTROYED];
    -    }
    -    /**
    -     * true if the stream is currently in a flowing state, meaning that
    -     * any writes will be immediately emitted.
    -     */
    -    get flowing() {
    -        return this[FLOWING];
    -    }
    -    /**
    -     * true if the stream is currently in a paused state
    -     */
    -    get paused() {
    -        return this[PAUSED];
    -    }
    -    [BUFFERPUSH](chunk) {
    -        if (this[OBJECTMODE])
    -            this[BUFFERLENGTH] += 1;
    -        else
    -            this[BUFFERLENGTH] += chunk.length;
    -        this[BUFFER].push(chunk);
    -    }
    -    [BUFFERSHIFT]() {
    -        if (this[OBJECTMODE])
    -            this[BUFFERLENGTH] -= 1;
    -        else
    -            this[BUFFERLENGTH] -= this[BUFFER][0].length;
    -        return this[BUFFER].shift();
    -    }
    -    [FLUSH](noDrain = false) {
    -        do { } while (this[FLUSHCHUNK](this[BUFFERSHIFT]()) &&
    -            this[BUFFER].length);
    -        if (!noDrain && !this[BUFFER].length && !this[EOF])
    -            this.emit('drain');
    -    }
    -    [FLUSHCHUNK](chunk) {
    -        this.emit('data', chunk);
    -        return this[FLOWING];
    -    }
    -    /**
    -     * Pipe all data emitted by this stream into the destination provided.
    -     *
    -     * Triggers the flow of data.
    -     */
    -    pipe(dest, opts) {
    -        if (this[DESTROYED])
    -            return dest;
    -        this[DISCARDED] = false;
    -        const ended = this[EMITTED_END];
    -        opts = opts || {};
    -        if (dest === proc.stdout || dest === proc.stderr)
    -            opts.end = false;
    -        else
    -            opts.end = opts.end !== false;
    -        opts.proxyErrors = !!opts.proxyErrors;
    -        // piping an ended stream ends immediately
    -        if (ended) {
    -            if (opts.end)
    -                dest.end();
    -        }
    -        else {
    -            // "as" here just ignores the WType, which pipes don't care about,
    -            // since they're only consuming from us, and writing to the dest
    -            this[PIPES].push(!opts.proxyErrors
    -                ? new Pipe(this, dest, opts)
    -                : new PipeProxyErrors(this, dest, opts));
    -            if (this[ASYNC])
    -                defer(() => this[RESUME]());
    -            else
    -                this[RESUME]();
    -        }
    -        return dest;
    -    }
    -    /**
    -     * Fully unhook a piped destination stream.
    -     *
    -     * If the destination stream was the only consumer of this stream (ie,
    -     * there are no other piped destinations or `'data'` event listeners)
    -     * then the flow of data will stop until there is another consumer or
    -     * {@link Minipass#resume} is explicitly called.
    -     */
    -    unpipe(dest) {
    -        const p = this[PIPES].find(p => p.dest === dest);
    -        if (p) {
    -            if (this[PIPES].length === 1) {
    -                if (this[FLOWING] && this[DATALISTENERS] === 0) {
    -                    this[FLOWING] = false;
    -                }
    -                this[PIPES] = [];
    -            }
    -            else
    -                this[PIPES].splice(this[PIPES].indexOf(p), 1);
    -            p.unpipe();
    -        }
    -    }
    -    /**
    -     * Alias for {@link Minipass#on}
    -     */
    -    addListener(ev, handler) {
    -        return this.on(ev, handler);
    -    }
    -    /**
    -     * Mostly identical to `EventEmitter.on`, with the following
    -     * behavior differences to prevent data loss and unnecessary hangs:
    -     *
    -     * - Adding a 'data' event handler will trigger the flow of data
    -     *
    -     * - Adding a 'readable' event handler when there is data waiting to be read
    -     *   will cause 'readable' to be emitted immediately.
    -     *
    -     * - Adding an 'endish' event handler ('end', 'finish', etc.) which has
    -     *   already passed will cause the event to be emitted immediately and all
    -     *   handlers removed.
    -     *
    -     * - Adding an 'error' event handler after an error has been emitted will
    -     *   cause the event to be re-emitted immediately with the error previously
    -     *   raised.
    -     */
    -    on(ev, handler) {
    -        const ret = super.on(ev, handler);
    -        if (ev === 'data') {
    -            this[DISCARDED] = false;
    -            this[DATALISTENERS]++;
    -            if (!this[PIPES].length && !this[FLOWING]) {
    -                this[RESUME]();
    -            }
    -        }
    -        else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) {
    -            super.emit('readable');
    -        }
    -        else if (isEndish(ev) && this[EMITTED_END]) {
    -            super.emit(ev);
    -            this.removeAllListeners(ev);
    -        }
    -        else if (ev === 'error' && this[EMITTED_ERROR]) {
    -            const h = handler;
    -            if (this[ASYNC])
    -                defer(() => h.call(this, this[EMITTED_ERROR]));
    -            else
    -                h.call(this, this[EMITTED_ERROR]);
    -        }
    -        return ret;
    -    }
    -    /**
    -     * Alias for {@link Minipass#off}
    -     */
    -    removeListener(ev, handler) {
    -        return this.off(ev, handler);
    -    }
    -    /**
    -     * Mostly identical to `EventEmitter.off`
    -     *
    -     * If a 'data' event handler is removed, and it was the last consumer
    -     * (ie, there are no pipe destinations or other 'data' event listeners),
    -     * then the flow of data will stop until there is another consumer or
    -     * {@link Minipass#resume} is explicitly called.
    -     */
    -    off(ev, handler) {
    -        const ret = super.off(ev, handler);
    -        // if we previously had listeners, and now we don't, and we don't
    -        // have any pipes, then stop the flow, unless it's been explicitly
    -        // put in a discarded flowing state via stream.resume().
    -        if (ev === 'data') {
    -            this[DATALISTENERS] = this.listeners('data').length;
    -            if (this[DATALISTENERS] === 0 &&
    -                !this[DISCARDED] &&
    -                !this[PIPES].length) {
    -                this[FLOWING] = false;
    -            }
    -        }
    -        return ret;
    -    }
    -    /**
    -     * Mostly identical to `EventEmitter.removeAllListeners`
    -     *
    -     * If all 'data' event handlers are removed, and they were the last consumer
    -     * (ie, there are no pipe destinations), then the flow of data will stop
    -     * until there is another consumer or {@link Minipass#resume} is explicitly
    -     * called.
    -     */
    -    removeAllListeners(ev) {
    -        const ret = super.removeAllListeners(ev);
    -        if (ev === 'data' || ev === undefined) {
    -            this[DATALISTENERS] = 0;
    -            if (!this[DISCARDED] && !this[PIPES].length) {
    -                this[FLOWING] = false;
    -            }
    -        }
    -        return ret;
    -    }
    -    /**
    -     * true if the 'end' event has been emitted
    -     */
    -    get emittedEnd() {
    -        return this[EMITTED_END];
    -    }
    -    [MAYBE_EMIT_END]() {
    -        if (!this[EMITTING_END] &&
    -            !this[EMITTED_END] &&
    -            !this[DESTROYED] &&
    -            this[BUFFER].length === 0 &&
    -            this[EOF]) {
    -            this[EMITTING_END] = true;
    -            this.emit('end');
    -            this.emit('prefinish');
    -            this.emit('finish');
    -            if (this[CLOSED])
    -                this.emit('close');
    -            this[EMITTING_END] = false;
    -        }
    -    }
    -    /**
    -     * Mostly identical to `EventEmitter.emit`, with the following
    -     * behavior differences to prevent data loss and unnecessary hangs:
    -     *
    -     * If the stream has been destroyed, and the event is something other
    -     * than 'close' or 'error', then `false` is returned and no handlers
    -     * are called.
    -     *
    -     * If the event is 'end', and has already been emitted, then the event
    -     * is ignored. If the stream is in a paused or non-flowing state, then
    -     * the event will be deferred until data flow resumes. If the stream is
    -     * async, then handlers will be called on the next tick rather than
    -     * immediately.
    -     *
    -     * If the event is 'close', and 'end' has not yet been emitted, then
    -     * the event will be deferred until after 'end' is emitted.
    -     *
    -     * If the event is 'error', and an AbortSignal was provided for the stream,
    -     * and there are no listeners, then the event is ignored, matching the
    -     * behavior of node core streams in the presense of an AbortSignal.
    -     *
    -     * If the event is 'finish' or 'prefinish', then all listeners will be
    -     * removed after emitting the event, to prevent double-firing.
    -     */
    -    emit(ev, ...args) {
    -        const data = args[0];
    -        // error and close are only events allowed after calling destroy()
    -        if (ev !== 'error' &&
    -            ev !== 'close' &&
    -            ev !== DESTROYED &&
    -            this[DESTROYED]) {
    -            return false;
    -        }
    -        else if (ev === 'data') {
    -            return !this[OBJECTMODE] && !data
    -                ? false
    -                : this[ASYNC]
    -                    ? (defer(() => this[EMITDATA](data)), true)
    -                    : this[EMITDATA](data);
    -        }
    -        else if (ev === 'end') {
    -            return this[EMITEND]();
    -        }
    -        else if (ev === 'close') {
    -            this[CLOSED] = true;
    -            // don't emit close before 'end' and 'finish'
    -            if (!this[EMITTED_END] && !this[DESTROYED])
    -                return false;
    -            const ret = super.emit('close');
    -            this.removeAllListeners('close');
    -            return ret;
    -        }
    -        else if (ev === 'error') {
    -            this[EMITTED_ERROR] = data;
    -            super.emit(ERROR, data);
    -            const ret = !this[SIGNAL] || this.listeners('error').length
    -                ? super.emit('error', data)
    -                : false;
    -            this[MAYBE_EMIT_END]();
    -            return ret;
    -        }
    -        else if (ev === 'resume') {
    -            const ret = super.emit('resume');
    -            this[MAYBE_EMIT_END]();
    -            return ret;
    -        }
    -        else if (ev === 'finish' || ev === 'prefinish') {
    -            const ret = super.emit(ev);
    -            this.removeAllListeners(ev);
    -            return ret;
    -        }
    -        // Some other unknown event
    -        const ret = super.emit(ev, ...args);
    -        this[MAYBE_EMIT_END]();
    -        return ret;
    -    }
    -    [EMITDATA](data) {
    -        for (const p of this[PIPES]) {
    -            if (p.dest.write(data) === false)
    -                this.pause();
    -        }
    -        const ret = this[DISCARDED] ? false : super.emit('data', data);
    -        this[MAYBE_EMIT_END]();
    -        return ret;
    -    }
    -    [EMITEND]() {
    -        if (this[EMITTED_END])
    -            return false;
    -        this[EMITTED_END] = true;
    -        this.readable = false;
    -        return this[ASYNC]
    -            ? (defer(() => this[EMITEND2]()), true)
    -            : this[EMITEND2]();
    -    }
    -    [EMITEND2]() {
    -        if (this[DECODER]) {
    -            const data = this[DECODER].end();
    -            if (data) {
    -                for (const p of this[PIPES]) {
    -                    p.dest.write(data);
    -                }
    -                if (!this[DISCARDED])
    -                    super.emit('data', data);
    -            }
    -        }
    -        for (const p of this[PIPES]) {
    -            p.end();
    -        }
    -        const ret = super.emit('end');
    -        this.removeAllListeners('end');
    -        return ret;
    -    }
    -    /**
    -     * Return a Promise that resolves to an array of all emitted data once
    -     * the stream ends.
    -     */
    -    async collect() {
    -        const buf = Object.assign([], {
    -            dataLength: 0,
    -        });
    -        if (!this[OBJECTMODE])
    -            buf.dataLength = 0;
    -        // set the promise first, in case an error is raised
    -        // by triggering the flow here.
    -        const p = this.promise();
    -        this.on('data', c => {
    -            buf.push(c);
    -            if (!this[OBJECTMODE])
    -                buf.dataLength += c.length;
    -        });
    -        await p;
    -        return buf;
    -    }
    -    /**
    -     * Return a Promise that resolves to the concatenation of all emitted data
    -     * once the stream ends.
    -     *
    -     * Not allowed on objectMode streams.
    -     */
    -    async concat() {
    -        if (this[OBJECTMODE]) {
    -            throw new Error('cannot concat in objectMode');
    -        }
    -        const buf = await this.collect();
    -        return (this[ENCODING]
    -            ? buf.join('')
    -            : Buffer.concat(buf, buf.dataLength));
    -    }
    -    /**
    -     * Return a void Promise that resolves once the stream ends.
    -     */
    -    async promise() {
    -        return new Promise((resolve, reject) => {
    -            this.on(DESTROYED, () => reject(new Error('stream destroyed')));
    -            this.on('error', er => reject(er));
    -            this.on('end', () => resolve());
    -        });
    -    }
    -    /**
    -     * Asynchronous `for await of` iteration.
    -     *
    -     * This will continue emitting all chunks until the stream terminates.
    -     */
    -    [Symbol.asyncIterator]() {
    -        // set this up front, in case the consumer doesn't call next()
    -        // right away.
    -        this[DISCARDED] = false;
    -        let stopped = false;
    -        const stop = async () => {
    -            this.pause();
    -            stopped = true;
    -            return { value: undefined, done: true };
    -        };
    -        const next = () => {
    -            if (stopped)
    -                return stop();
    -            const res = this.read();
    -            if (res !== null)
    -                return Promise.resolve({ done: false, value: res });
    -            if (this[EOF])
    -                return stop();
    -            let resolve;
    -            let reject;
    -            const onerr = (er) => {
    -                this.off('data', ondata);
    -                this.off('end', onend);
    -                this.off(DESTROYED, ondestroy);
    -                stop();
    -                reject(er);
    -            };
    -            const ondata = (value) => {
    -                this.off('error', onerr);
    -                this.off('end', onend);
    -                this.off(DESTROYED, ondestroy);
    -                this.pause();
    -                resolve({ value, done: !!this[EOF] });
    -            };
    -            const onend = () => {
    -                this.off('error', onerr);
    -                this.off('data', ondata);
    -                this.off(DESTROYED, ondestroy);
    -                stop();
    -                resolve({ done: true, value: undefined });
    -            };
    -            const ondestroy = () => onerr(new Error('stream destroyed'));
    -            return new Promise((res, rej) => {
    -                reject = rej;
    -                resolve = res;
    -                this.once(DESTROYED, ondestroy);
    -                this.once('error', onerr);
    -                this.once('end', onend);
    -                this.once('data', ondata);
    -            });
    -        };
    -        return {
    -            next,
    -            throw: stop,
    -            return: stop,
    -            [Symbol.asyncIterator]() {
    -                return this;
    -            },
    -        };
    -    }
    -    /**
    -     * Synchronous `for of` iteration.
    -     *
    -     * The iteration will terminate when the internal buffer runs out, even
    -     * if the stream has not yet terminated.
    -     */
    -    [Symbol.iterator]() {
    -        // set this up front, in case the consumer doesn't call next()
    -        // right away.
    -        this[DISCARDED] = false;
    -        let stopped = false;
    -        const stop = () => {
    -            this.pause();
    -            this.off(ERROR, stop);
    -            this.off(DESTROYED, stop);
    -            this.off('end', stop);
    -            stopped = true;
    -            return { done: true, value: undefined };
    -        };
    -        const next = () => {
    -            if (stopped)
    -                return stop();
    -            const value = this.read();
    -            return value === null ? stop() : { done: false, value };
    -        };
    -        this.once('end', stop);
    -        this.once(ERROR, stop);
    -        this.once(DESTROYED, stop);
    -        return {
    -            next,
    -            throw: stop,
    -            return: stop,
    -            [Symbol.iterator]() {
    -                return this;
    -            },
    -        };
    -    }
    -    /**
    -     * Destroy a stream, preventing it from being used for any further purpose.
    -     *
    -     * If the stream has a `close()` method, then it will be called on
    -     * destruction.
    -     *
    -     * After destruction, any attempt to write data, read data, or emit most
    -     * events will be ignored.
    -     *
    -     * If an error argument is provided, then it will be emitted in an
    -     * 'error' event.
    -     */
    -    destroy(er) {
    -        if (this[DESTROYED]) {
    -            if (er)
    -                this.emit('error', er);
    -            else
    -                this.emit(DESTROYED);
    -            return this;
    -        }
    -        this[DESTROYED] = true;
    -        this[DISCARDED] = true;
    -        // throw away all buffered data, it's never coming out
    -        this[BUFFER].length = 0;
    -        this[BUFFERLENGTH] = 0;
    -        const wc = this;
    -        if (typeof wc.close === 'function' && !this[CLOSED])
    -            wc.close();
    -        if (er)
    -            this.emit('error', er);
    -        // if no error to emit, still reject pending promises
    -        else
    -            this.emit(DESTROYED);
    -        return this;
    -    }
    -    /**
    -     * Alias for {@link isStream}
    -     *
    -     * Former export location, maintained for backwards compatibility.
    -     *
    -     * @deprecated
    -     */
    -    static get isStream() {
    -        return isStream;
    -    }
    -}
    -//# sourceMappingURL=index.js.map
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minipass/dist/mjs/package.json b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minipass/dist/mjs/package.json
    deleted file mode 100644
    index 3dbc1ca591c055..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minipass/dist/mjs/package.json
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -{
    -  "type": "module"
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minipass/package.json b/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minipass/package.json
    deleted file mode 100644
    index 6faaa247a5bc66..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minipass/package.json
    +++ /dev/null
    @@ -1,82 +0,0 @@
    -{
    -  "name": "minipass",
    -  "version": "7.0.3",
    -  "description": "minimal implementation of a PassThrough stream",
    -  "main": "./dist/cjs/index.js",
    -  "module": "./dist/mjs/index.js",
    -  "types": "./dist/cjs/index.js",
    -  "exports": {
    -    ".": {
    -      "import": {
    -        "types": "./dist/mjs/index.d.ts",
    -        "default": "./dist/mjs/index.js"
    -      },
    -      "require": {
    -        "types": "./dist/cjs/index.d.ts",
    -        "default": "./dist/cjs/index.js"
    -      }
    -    },
    -    "./package.json": "./package.json"
    -  },
    -  "files": [
    -    "dist"
    -  ],
    -  "scripts": {
    -    "preversion": "npm test",
    -    "postversion": "npm publish",
    -    "prepublishOnly": "git push origin --follow-tags",
    -    "preprepare": "rm -rf dist",
    -    "prepare": "tsc -p tsconfig.json && tsc -p tsconfig-esm.json && bash ./scripts/fixup.sh",
    -    "pretest": "npm run prepare",
    -    "presnap": "npm run prepare",
    -    "test": "c8 tap",
    -    "snap": "c8 tap",
    -    "format": "prettier --write . --loglevel warn",
    -    "typedoc": "typedoc --tsconfig tsconfig-esm.json ./src/*.ts"
    -  },
    -  "tap": {
    -    "coverage": false,
    -    "node-arg": [
    -      "--enable-source-maps",
    -      "--no-warnings",
    -      "--loader",
    -      "ts-node/esm"
    -    ],
    -    "ts": false
    -  },
    -  "prettier": {
    -    "semi": false,
    -    "printWidth": 75,
    -    "tabWidth": 2,
    -    "useTabs": false,
    -    "singleQuote": true,
    -    "jsxSingleQuote": false,
    -    "bracketSameLine": true,
    -    "arrowParens": "avoid",
    -    "endOfLine": "lf"
    -  },
    -  "devDependencies": {
    -    "@types/node": "^20.1.2",
    -    "@types/tap": "^15.0.8",
    -    "c8": "^7.13.0",
    -    "prettier": "^2.6.2",
    -    "tap": "^16.3.0",
    -    "ts-node": "^10.9.1",
    -    "typedoc": "^0.24.8",
    -    "typescript": "^5.1.3",
    -    "end-of-stream": "^1.4.0",
    -    "node-abort-controller": "^3.1.1",
    -    "sync-content": "^1.0.2",
    -    "through2": "^2.0.3"
    -  },
    -  "repository": "https://github.com/isaacs/minipass",
    -  "keywords": [
    -    "passthrough",
    -    "stream"
    -  ],
    -  "author": "Isaac Z. Schlueter  (http://blog.izs.me/)",
    -  "license": "ISC",
    -  "engines": {
    -    "node": ">=16 || 14 >=14.17"
    -  }
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/package.json b/deps/npm/node_modules/node-gyp/node_modules/cacache/package.json
    deleted file mode 100644
    index ab58cb8b7c50f4..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/package.json
    +++ /dev/null
    @@ -1,82 +0,0 @@
    -{
    -  "name": "cacache",
    -  "version": "17.1.4",
    -  "cache-version": {
    -    "content": "2",
    -    "index": "5"
    -  },
    -  "description": "Fast, fault-tolerant, cross-platform, disk-based, data-agnostic, content-addressable cache.",
    -  "main": "lib/index.js",
    -  "files": [
    -    "bin/",
    -    "lib/"
    -  ],
    -  "scripts": {
    -    "test": "tap",
    -    "snap": "tap",
    -    "coverage": "tap",
    -    "test-docker": "docker run -it --rm --name pacotest -v \"$PWD\":/tmp -w /tmp node:latest npm test",
    -    "lint": "eslint \"**/*.js\"",
    -    "npmclilint": "npmcli-lint",
    -    "lintfix": "npm run lint -- --fix",
    -    "postsnap": "npm run lintfix --",
    -    "postlint": "template-oss-check",
    -    "posttest": "npm run lint",
    -    "template-oss-apply": "template-oss-apply --force"
    -  },
    -  "repository": {
    -    "type": "git",
    -    "url": "https://github.com/npm/cacache.git"
    -  },
    -  "keywords": [
    -    "cache",
    -    "caching",
    -    "content-addressable",
    -    "sri",
    -    "sri hash",
    -    "subresource integrity",
    -    "cache",
    -    "storage",
    -    "store",
    -    "file store",
    -    "filesystem",
    -    "disk cache",
    -    "disk storage"
    -  ],
    -  "license": "ISC",
    -  "dependencies": {
    -    "@npmcli/fs": "^3.1.0",
    -    "fs-minipass": "^3.0.0",
    -    "glob": "^10.2.2",
    -    "lru-cache": "^7.7.1",
    -    "minipass": "^7.0.3",
    -    "minipass-collect": "^1.0.2",
    -    "minipass-flush": "^1.0.5",
    -    "minipass-pipeline": "^1.2.4",
    -    "p-map": "^4.0.0",
    -    "ssri": "^10.0.0",
    -    "tar": "^6.1.11",
    -    "unique-filename": "^3.0.0"
    -  },
    -  "devDependencies": {
    -    "@npmcli/eslint-config": "^4.0.0",
    -    "@npmcli/template-oss": "4.18.0",
    -    "tap": "^16.0.0"
    -  },
    -  "engines": {
    -    "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
    -  },
    -  "templateOSS": {
    -    "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "windowsCI": false,
    -    "version": "4.18.0",
    -    "publish": "true"
    -  },
    -  "author": "GitHub Inc.",
    -  "tap": {
    -    "nyc-arg": [
    -      "--exclude",
    -      "tap-snapshots/**"
    -    ]
    -  }
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/gauge/LICENSE.md b/deps/npm/node_modules/node-gyp/node_modules/gauge/LICENSE.md
    deleted file mode 100644
    index 5fc208ff122e08..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/gauge/LICENSE.md
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -
    -
    -ISC License
    -
    -Copyright npm, Inc.
    -
    -Permission to use, copy, modify, and/or distribute this
    -software for any purpose with or without fee is hereby
    -granted, provided that the above copyright notice and this
    -permission notice appear in all copies.
    -
    -THE SOFTWARE IS PROVIDED "AS IS" AND NPM DISCLAIMS ALL
    -WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
    -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
    -EVENT SHALL NPM BE LIABLE FOR ANY SPECIAL, DIRECT,
    -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
    -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
    -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
    -USE OR PERFORMANCE OF THIS SOFTWARE.
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/base-theme.js b/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/base-theme.js
    deleted file mode 100644
    index 00bf5684cddab8..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/base-theme.js
    +++ /dev/null
    @@ -1,18 +0,0 @@
    -'use strict'
    -var spin = require('./spin.js')
    -var progressBar = require('./progress-bar.js')
    -
    -module.exports = {
    -  activityIndicator: function (values, theme, width) {
    -    if (values.spun == null) {
    -      return
    -    }
    -    return spin(theme, values.spun)
    -  },
    -  progressbar: function (values, theme, width) {
    -    if (values.completed == null) {
    -      return
    -    }
    -    return progressBar(theme, width, values.completed)
    -  },
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/error.js b/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/error.js
    deleted file mode 100644
    index d9914ba5335d25..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/error.js
    +++ /dev/null
    @@ -1,24 +0,0 @@
    -'use strict'
    -var util = require('util')
    -
    -var User = exports.User = function User (msg) {
    -  var err = new Error(msg)
    -  Error.captureStackTrace(err, User)
    -  err.code = 'EGAUGE'
    -  return err
    -}
    -
    -exports.MissingTemplateValue = function MissingTemplateValue (item, values) {
    -  var err = new User(util.format('Missing template value "%s"', item.type))
    -  Error.captureStackTrace(err, MissingTemplateValue)
    -  err.template = item
    -  err.values = values
    -  return err
    -}
    -
    -exports.Internal = function Internal (msg) {
    -  var err = new Error(msg)
    -  Error.captureStackTrace(err, Internal)
    -  err.code = 'EGAUGEINTERNAL'
    -  return err
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/has-color.js b/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/has-color.js
    deleted file mode 100644
    index 16cba0eb47d332..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/has-color.js
    +++ /dev/null
    @@ -1,4 +0,0 @@
    -'use strict'
    -var colorSupport = require('color-support')
    -
    -module.exports = colorSupport().hasBasic
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/index.js b/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/index.js
    deleted file mode 100644
    index 37fc5ac60a16fd..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/index.js
    +++ /dev/null
    @@ -1,289 +0,0 @@
    -'use strict'
    -var Plumbing = require('./plumbing.js')
    -var hasUnicode = require('has-unicode')
    -var hasColor = require('./has-color.js')
    -var onExit = require('signal-exit')
    -var defaultThemes = require('./themes')
    -var setInterval = require('./set-interval.js')
    -var process = require('./process.js')
    -var setImmediate = require('./set-immediate')
    -
    -module.exports = Gauge
    -
    -function callWith (obj, method) {
    -  return function () {
    -    return method.call(obj)
    -  }
    -}
    -
    -function Gauge (arg1, arg2) {
    -  var options, writeTo
    -  if (arg1 && arg1.write) {
    -    writeTo = arg1
    -    options = arg2 || {}
    -  } else if (arg2 && arg2.write) {
    -    writeTo = arg2
    -    options = arg1 || {}
    -  } else {
    -    writeTo = process.stderr
    -    options = arg1 || arg2 || {}
    -  }
    -
    -  this._status = {
    -    spun: 0,
    -    section: '',
    -    subsection: '',
    -  }
    -  this._paused = false // are we paused for back pressure?
    -  this._disabled = true // are all progress bar updates disabled?
    -  this._showing = false // do we WANT the progress bar on screen
    -  this._onScreen = false // IS the progress bar on screen
    -  this._needsRedraw = false // should we print something at next tick?
    -  this._hideCursor = options.hideCursor == null ? true : options.hideCursor
    -  this._fixedFramerate = options.fixedFramerate == null
    -    ? !(/^v0\.8\./.test(process.version))
    -    : options.fixedFramerate
    -  this._lastUpdateAt = null
    -  this._updateInterval = options.updateInterval == null ? 50 : options.updateInterval
    -
    -  this._themes = options.themes || defaultThemes
    -  this._theme = options.theme
    -  var theme = this._computeTheme(options.theme)
    -  var template = options.template || [
    -    { type: 'progressbar', length: 20 },
    -    { type: 'activityIndicator', kerning: 1, length: 1 },
    -    { type: 'section', kerning: 1, default: '' },
    -    { type: 'subsection', kerning: 1, default: '' },
    -  ]
    -  this.setWriteTo(writeTo, options.tty)
    -  var PlumbingClass = options.Plumbing || Plumbing
    -  this._gauge = new PlumbingClass(theme, template, this.getWidth())
    -
    -  this._$$doRedraw = callWith(this, this._doRedraw)
    -  this._$$handleSizeChange = callWith(this, this._handleSizeChange)
    -
    -  this._cleanupOnExit = options.cleanupOnExit == null || options.cleanupOnExit
    -  this._removeOnExit = null
    -
    -  if (options.enabled || (options.enabled == null && this._tty && this._tty.isTTY)) {
    -    this.enable()
    -  } else {
    -    this.disable()
    -  }
    -}
    -Gauge.prototype = {}
    -
    -Gauge.prototype.isEnabled = function () {
    -  return !this._disabled
    -}
    -
    -Gauge.prototype.setTemplate = function (template) {
    -  this._gauge.setTemplate(template)
    -  if (this._showing) {
    -    this._requestRedraw()
    -  }
    -}
    -
    -Gauge.prototype._computeTheme = function (theme) {
    -  if (!theme) {
    -    theme = {}
    -  }
    -  if (typeof theme === 'string') {
    -    theme = this._themes.getTheme(theme)
    -  } else if (
    -    Object.keys(theme).length === 0 || theme.hasUnicode != null || theme.hasColor != null
    -  ) {
    -    var useUnicode = theme.hasUnicode == null ? hasUnicode() : theme.hasUnicode
    -    var useColor = theme.hasColor == null ? hasColor : theme.hasColor
    -    theme = this._themes.getDefault({
    -      hasUnicode: useUnicode,
    -      hasColor: useColor,
    -      platform: theme.platform,
    -    })
    -  }
    -  return theme
    -}
    -
    -Gauge.prototype.setThemeset = function (themes) {
    -  this._themes = themes
    -  this.setTheme(this._theme)
    -}
    -
    -Gauge.prototype.setTheme = function (theme) {
    -  this._gauge.setTheme(this._computeTheme(theme))
    -  if (this._showing) {
    -    this._requestRedraw()
    -  }
    -  this._theme = theme
    -}
    -
    -Gauge.prototype._requestRedraw = function () {
    -  this._needsRedraw = true
    -  if (!this._fixedFramerate) {
    -    this._doRedraw()
    -  }
    -}
    -
    -Gauge.prototype.getWidth = function () {
    -  return ((this._tty && this._tty.columns) || 80) - 1
    -}
    -
    -Gauge.prototype.setWriteTo = function (writeTo, tty) {
    -  var enabled = !this._disabled
    -  if (enabled) {
    -    this.disable()
    -  }
    -  this._writeTo = writeTo
    -  this._tty = tty ||
    -    (writeTo === process.stderr && process.stdout.isTTY && process.stdout) ||
    -    (writeTo.isTTY && writeTo) ||
    -    this._tty
    -  if (this._gauge) {
    -    this._gauge.setWidth(this.getWidth())
    -  }
    -  if (enabled) {
    -    this.enable()
    -  }
    -}
    -
    -Gauge.prototype.enable = function () {
    -  if (!this._disabled) {
    -    return
    -  }
    -  this._disabled = false
    -  if (this._tty) {
    -    this._enableEvents()
    -  }
    -  if (this._showing) {
    -    this.show()
    -  }
    -}
    -
    -Gauge.prototype.disable = function () {
    -  if (this._disabled) {
    -    return
    -  }
    -  if (this._showing) {
    -    this._lastUpdateAt = null
    -    this._showing = false
    -    this._doRedraw()
    -    this._showing = true
    -  }
    -  this._disabled = true
    -  if (this._tty) {
    -    this._disableEvents()
    -  }
    -}
    -
    -Gauge.prototype._enableEvents = function () {
    -  if (this._cleanupOnExit) {
    -    this._removeOnExit = onExit(callWith(this, this.disable))
    -  }
    -  this._tty.on('resize', this._$$handleSizeChange)
    -  if (this._fixedFramerate) {
    -    this.redrawTracker = setInterval(this._$$doRedraw, this._updateInterval)
    -    if (this.redrawTracker.unref) {
    -      this.redrawTracker.unref()
    -    }
    -  }
    -}
    -
    -Gauge.prototype._disableEvents = function () {
    -  this._tty.removeListener('resize', this._$$handleSizeChange)
    -  if (this._fixedFramerate) {
    -    clearInterval(this.redrawTracker)
    -  }
    -  if (this._removeOnExit) {
    -    this._removeOnExit()
    -  }
    -}
    -
    -Gauge.prototype.hide = function (cb) {
    -  if (this._disabled) {
    -    return cb && process.nextTick(cb)
    -  }
    -  if (!this._showing) {
    -    return cb && process.nextTick(cb)
    -  }
    -  this._showing = false
    -  this._doRedraw()
    -  cb && setImmediate(cb)
    -}
    -
    -Gauge.prototype.show = function (section, completed) {
    -  this._showing = true
    -  if (typeof section === 'string') {
    -    this._status.section = section
    -  } else if (typeof section === 'object') {
    -    var sectionKeys = Object.keys(section)
    -    for (var ii = 0; ii < sectionKeys.length; ++ii) {
    -      var key = sectionKeys[ii]
    -      this._status[key] = section[key]
    -    }
    -  }
    -  if (completed != null) {
    -    this._status.completed = completed
    -  }
    -  if (this._disabled) {
    -    return
    -  }
    -  this._requestRedraw()
    -}
    -
    -Gauge.prototype.pulse = function (subsection) {
    -  this._status.subsection = subsection || ''
    -  this._status.spun++
    -  if (this._disabled) {
    -    return
    -  }
    -  if (!this._showing) {
    -    return
    -  }
    -  this._requestRedraw()
    -}
    -
    -Gauge.prototype._handleSizeChange = function () {
    -  this._gauge.setWidth(this._tty.columns - 1)
    -  this._requestRedraw()
    -}
    -
    -Gauge.prototype._doRedraw = function () {
    -  if (this._disabled || this._paused) {
    -    return
    -  }
    -  if (!this._fixedFramerate) {
    -    var now = Date.now()
    -    if (this._lastUpdateAt && now - this._lastUpdateAt < this._updateInterval) {
    -      return
    -    }
    -    this._lastUpdateAt = now
    -  }
    -  if (!this._showing && this._onScreen) {
    -    this._onScreen = false
    -    var result = this._gauge.hide()
    -    if (this._hideCursor) {
    -      result += this._gauge.showCursor()
    -    }
    -    return this._writeTo.write(result)
    -  }
    -  if (!this._showing && !this._onScreen) {
    -    return
    -  }
    -  if (this._showing && !this._onScreen) {
    -    this._onScreen = true
    -    this._needsRedraw = true
    -    if (this._hideCursor) {
    -      this._writeTo.write(this._gauge.hideCursor())
    -    }
    -  }
    -  if (!this._needsRedraw) {
    -    return
    -  }
    -  if (!this._writeTo.write(this._gauge.show(this._status))) {
    -    this._paused = true
    -    this._writeTo.on('drain', callWith(this, function () {
    -      this._paused = false
    -      this._doRedraw()
    -    }))
    -  }
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/plumbing.js b/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/plumbing.js
    deleted file mode 100644
    index c4dc3e074b95e8..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/plumbing.js
    +++ /dev/null
    @@ -1,50 +0,0 @@
    -'use strict'
    -var consoleControl = require('console-control-strings')
    -var renderTemplate = require('./render-template.js')
    -var validate = require('aproba')
    -
    -var Plumbing = module.exports = function (theme, template, width) {
    -  if (!width) {
    -    width = 80
    -  }
    -  validate('OAN', [theme, template, width])
    -  this.showing = false
    -  this.theme = theme
    -  this.width = width
    -  this.template = template
    -}
    -Plumbing.prototype = {}
    -
    -Plumbing.prototype.setTheme = function (theme) {
    -  validate('O', [theme])
    -  this.theme = theme
    -}
    -
    -Plumbing.prototype.setTemplate = function (template) {
    -  validate('A', [template])
    -  this.template = template
    -}
    -
    -Plumbing.prototype.setWidth = function (width) {
    -  validate('N', [width])
    -  this.width = width
    -}
    -
    -Plumbing.prototype.hide = function () {
    -  return consoleControl.gotoSOL() + consoleControl.eraseLine()
    -}
    -
    -Plumbing.prototype.hideCursor = consoleControl.hideCursor
    -
    -Plumbing.prototype.showCursor = consoleControl.showCursor
    -
    -Plumbing.prototype.show = function (status) {
    -  var values = Object.create(this.theme)
    -  for (var key in status) {
    -    values[key] = status[key]
    -  }
    -
    -  return renderTemplate(this.width, this.template, values).trim() +
    -         consoleControl.color('reset') +
    -         consoleControl.eraseLine() + consoleControl.gotoSOL()
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/process.js b/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/process.js
    deleted file mode 100644
    index 05e85694d755b6..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/process.js
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -'use strict'
    -// this exists so we can replace it during testing
    -module.exports = process
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/progress-bar.js b/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/progress-bar.js
    deleted file mode 100644
    index 184ff2500aae4d..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/progress-bar.js
    +++ /dev/null
    @@ -1,41 +0,0 @@
    -'use strict'
    -var validate = require('aproba')
    -var renderTemplate = require('./render-template.js')
    -var wideTruncate = require('./wide-truncate')
    -var stringWidth = require('string-width')
    -
    -module.exports = function (theme, width, completed) {
    -  validate('ONN', [theme, width, completed])
    -  if (completed < 0) {
    -    completed = 0
    -  }
    -  if (completed > 1) {
    -    completed = 1
    -  }
    -  if (width <= 0) {
    -    return ''
    -  }
    -  var sofar = Math.round(width * completed)
    -  var rest = width - sofar
    -  var template = [
    -    { type: 'complete', value: repeat(theme.complete, sofar), length: sofar },
    -    { type: 'remaining', value: repeat(theme.remaining, rest), length: rest },
    -  ]
    -  return renderTemplate(width, template, theme)
    -}
    -
    -// lodash's way of repeating
    -function repeat (string, width) {
    -  var result = ''
    -  var n = width
    -  do {
    -    if (n % 2) {
    -      result += string
    -    }
    -    n = Math.floor(n / 2)
    -    /* eslint no-self-assign: 0 */
    -    string += string
    -  } while (n && stringWidth(result) < width)
    -
    -  return wideTruncate(result, width)
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/render-template.js b/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/render-template.js
    deleted file mode 100644
    index d1b52c0f48095a..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/render-template.js
    +++ /dev/null
    @@ -1,222 +0,0 @@
    -'use strict'
    -var align = require('wide-align')
    -var validate = require('aproba')
    -var wideTruncate = require('./wide-truncate')
    -var error = require('./error')
    -var TemplateItem = require('./template-item')
    -
    -function renderValueWithValues (values) {
    -  return function (item) {
    -    return renderValue(item, values)
    -  }
    -}
    -
    -var renderTemplate = module.exports = function (width, template, values) {
    -  var items = prepareItems(width, template, values)
    -  var rendered = items.map(renderValueWithValues(values)).join('')
    -  return align.left(wideTruncate(rendered, width), width)
    -}
    -
    -function preType (item) {
    -  var cappedTypeName = item.type[0].toUpperCase() + item.type.slice(1)
    -  return 'pre' + cappedTypeName
    -}
    -
    -function postType (item) {
    -  var cappedTypeName = item.type[0].toUpperCase() + item.type.slice(1)
    -  return 'post' + cappedTypeName
    -}
    -
    -function hasPreOrPost (item, values) {
    -  if (!item.type) {
    -    return
    -  }
    -  return values[preType(item)] || values[postType(item)]
    -}
    -
    -function generatePreAndPost (baseItem, parentValues) {
    -  var item = Object.assign({}, baseItem)
    -  var values = Object.create(parentValues)
    -  var template = []
    -  var pre = preType(item)
    -  var post = postType(item)
    -  if (values[pre]) {
    -    template.push({ value: values[pre] })
    -    values[pre] = null
    -  }
    -  item.minLength = null
    -  item.length = null
    -  item.maxLength = null
    -  template.push(item)
    -  values[item.type] = values[item.type]
    -  if (values[post]) {
    -    template.push({ value: values[post] })
    -    values[post] = null
    -  }
    -  return function ($1, $2, length) {
    -    return renderTemplate(length, template, values)
    -  }
    -}
    -
    -function prepareItems (width, template, values) {
    -  function cloneAndObjectify (item, index, arr) {
    -    var cloned = new TemplateItem(item, width)
    -    var type = cloned.type
    -    if (cloned.value == null) {
    -      if (!(type in values)) {
    -        if (cloned.default == null) {
    -          throw new error.MissingTemplateValue(cloned, values)
    -        } else {
    -          cloned.value = cloned.default
    -        }
    -      } else {
    -        cloned.value = values[type]
    -      }
    -    }
    -    if (cloned.value == null || cloned.value === '') {
    -      return null
    -    }
    -    cloned.index = index
    -    cloned.first = index === 0
    -    cloned.last = index === arr.length - 1
    -    if (hasPreOrPost(cloned, values)) {
    -      cloned.value = generatePreAndPost(cloned, values)
    -    }
    -    return cloned
    -  }
    -
    -  var output = template.map(cloneAndObjectify).filter(function (item) {
    -    return item != null
    -  })
    -
    -  var remainingSpace = width
    -  var variableCount = output.length
    -
    -  function consumeSpace (length) {
    -    if (length > remainingSpace) {
    -      length = remainingSpace
    -    }
    -    remainingSpace -= length
    -  }
    -
    -  function finishSizing (item, length) {
    -    if (item.finished) {
    -      throw new error.Internal('Tried to finish template item that was already finished')
    -    }
    -    if (length === Infinity) {
    -      throw new error.Internal('Length of template item cannot be infinity')
    -    }
    -    if (length != null) {
    -      item.length = length
    -    }
    -    item.minLength = null
    -    item.maxLength = null
    -    --variableCount
    -    item.finished = true
    -    if (item.length == null) {
    -      item.length = item.getBaseLength()
    -    }
    -    if (item.length == null) {
    -      throw new error.Internal('Finished template items must have a length')
    -    }
    -    consumeSpace(item.getLength())
    -  }
    -
    -  output.forEach(function (item) {
    -    if (!item.kerning) {
    -      return
    -    }
    -    var prevPadRight = item.first ? 0 : output[item.index - 1].padRight
    -    if (!item.first && prevPadRight < item.kerning) {
    -      item.padLeft = item.kerning - prevPadRight
    -    }
    -    if (!item.last) {
    -      item.padRight = item.kerning
    -    }
    -  })
    -
    -  // Finish any that have a fixed (literal or intuited) length
    -  output.forEach(function (item) {
    -    if (item.getBaseLength() == null) {
    -      return
    -    }
    -    finishSizing(item)
    -  })
    -
    -  var resized = 0
    -  var resizing
    -  var hunkSize
    -  do {
    -    resizing = false
    -    hunkSize = Math.round(remainingSpace / variableCount)
    -    output.forEach(function (item) {
    -      if (item.finished) {
    -        return
    -      }
    -      if (!item.maxLength) {
    -        return
    -      }
    -      if (item.getMaxLength() < hunkSize) {
    -        finishSizing(item, item.maxLength)
    -        resizing = true
    -      }
    -    })
    -  } while (resizing && resized++ < output.length)
    -  if (resizing) {
    -    throw new error.Internal('Resize loop iterated too many times while determining maxLength')
    -  }
    -
    -  resized = 0
    -  do {
    -    resizing = false
    -    hunkSize = Math.round(remainingSpace / variableCount)
    -    output.forEach(function (item) {
    -      if (item.finished) {
    -        return
    -      }
    -      if (!item.minLength) {
    -        return
    -      }
    -      if (item.getMinLength() >= hunkSize) {
    -        finishSizing(item, item.minLength)
    -        resizing = true
    -      }
    -    })
    -  } while (resizing && resized++ < output.length)
    -  if (resizing) {
    -    throw new error.Internal('Resize loop iterated too many times while determining minLength')
    -  }
    -
    -  hunkSize = Math.round(remainingSpace / variableCount)
    -  output.forEach(function (item) {
    -    if (item.finished) {
    -      return
    -    }
    -    finishSizing(item, hunkSize)
    -  })
    -
    -  return output
    -}
    -
    -function renderFunction (item, values, length) {
    -  validate('OON', arguments)
    -  if (item.type) {
    -    return item.value(values, values[item.type + 'Theme'] || {}, length)
    -  } else {
    -    return item.value(values, {}, length)
    -  }
    -}
    -
    -function renderValue (item, values) {
    -  var length = item.getBaseLength()
    -  var value = typeof item.value === 'function' ? renderFunction(item, values, length) : item.value
    -  if (value == null || value === '') {
    -    return ''
    -  }
    -  var alignWith = align[item.align] || align.left
    -  var leftPadding = item.padLeft ? align.left('', item.padLeft) : ''
    -  var rightPadding = item.padRight ? align.right('', item.padRight) : ''
    -  var truncated = wideTruncate(String(value), length)
    -  var aligned = alignWith(truncated, length)
    -  return leftPadding + aligned + rightPadding
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/set-immediate.js b/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/set-immediate.js
    deleted file mode 100644
    index 6650a485c49933..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/set-immediate.js
    +++ /dev/null
    @@ -1,7 +0,0 @@
    -'use strict'
    -var process = require('./process')
    -try {
    -  module.exports = setImmediate
    -} catch (ex) {
    -  module.exports = process.nextTick
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/set-interval.js b/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/set-interval.js
    deleted file mode 100644
    index 576198793c5504..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/set-interval.js
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -'use strict'
    -// this exists so we can replace it during testing
    -module.exports = setInterval
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/spin.js b/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/spin.js
    deleted file mode 100644
    index 34142ee31acc7c..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/spin.js
    +++ /dev/null
    @@ -1,5 +0,0 @@
    -'use strict'
    -
    -module.exports = function spin (spinstr, spun) {
    -  return spinstr[spun % spinstr.length]
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/template-item.js b/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/template-item.js
    deleted file mode 100644
    index e307e9b7421e73..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/template-item.js
    +++ /dev/null
    @@ -1,87 +0,0 @@
    -'use strict'
    -var stringWidth = require('string-width')
    -
    -module.exports = TemplateItem
    -
    -function isPercent (num) {
    -  if (typeof num !== 'string') {
    -    return false
    -  }
    -  return num.slice(-1) === '%'
    -}
    -
    -function percent (num) {
    -  return Number(num.slice(0, -1)) / 100
    -}
    -
    -function TemplateItem (values, outputLength) {
    -  this.overallOutputLength = outputLength
    -  this.finished = false
    -  this.type = null
    -  this.value = null
    -  this.length = null
    -  this.maxLength = null
    -  this.minLength = null
    -  this.kerning = null
    -  this.align = 'left'
    -  this.padLeft = 0
    -  this.padRight = 0
    -  this.index = null
    -  this.first = null
    -  this.last = null
    -  if (typeof values === 'string') {
    -    this.value = values
    -  } else {
    -    for (var prop in values) {
    -      this[prop] = values[prop]
    -    }
    -  }
    -  // Realize percents
    -  if (isPercent(this.length)) {
    -    this.length = Math.round(this.overallOutputLength * percent(this.length))
    -  }
    -  if (isPercent(this.minLength)) {
    -    this.minLength = Math.round(this.overallOutputLength * percent(this.minLength))
    -  }
    -  if (isPercent(this.maxLength)) {
    -    this.maxLength = Math.round(this.overallOutputLength * percent(this.maxLength))
    -  }
    -  return this
    -}
    -
    -TemplateItem.prototype = {}
    -
    -TemplateItem.prototype.getBaseLength = function () {
    -  var length = this.length
    -  if (
    -    length == null &&
    -    typeof this.value === 'string' &&
    -    this.maxLength == null &&
    -    this.minLength == null
    -  ) {
    -    length = stringWidth(this.value)
    -  }
    -  return length
    -}
    -
    -TemplateItem.prototype.getLength = function () {
    -  var length = this.getBaseLength()
    -  if (length == null) {
    -    return null
    -  }
    -  return length + this.padLeft + this.padRight
    -}
    -
    -TemplateItem.prototype.getMaxLength = function () {
    -  if (this.maxLength == null) {
    -    return null
    -  }
    -  return this.maxLength + this.padLeft + this.padRight
    -}
    -
    -TemplateItem.prototype.getMinLength = function () {
    -  if (this.minLength == null) {
    -    return null
    -  }
    -  return this.minLength + this.padLeft + this.padRight
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/theme-set.js b/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/theme-set.js
    deleted file mode 100644
    index 643d7dbb1da346..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/theme-set.js
    +++ /dev/null
    @@ -1,122 +0,0 @@
    -'use strict'
    -
    -module.exports = function () {
    -  return ThemeSetProto.newThemeSet()
    -}
    -
    -var ThemeSetProto = {}
    -
    -ThemeSetProto.baseTheme = require('./base-theme.js')
    -
    -ThemeSetProto.newTheme = function (parent, theme) {
    -  if (!theme) {
    -    theme = parent
    -    parent = this.baseTheme
    -  }
    -  return Object.assign({}, parent, theme)
    -}
    -
    -ThemeSetProto.getThemeNames = function () {
    -  return Object.keys(this.themes)
    -}
    -
    -ThemeSetProto.addTheme = function (name, parent, theme) {
    -  this.themes[name] = this.newTheme(parent, theme)
    -}
    -
    -ThemeSetProto.addToAllThemes = function (theme) {
    -  var themes = this.themes
    -  Object.keys(themes).forEach(function (name) {
    -    Object.assign(themes[name], theme)
    -  })
    -  Object.assign(this.baseTheme, theme)
    -}
    -
    -ThemeSetProto.getTheme = function (name) {
    -  if (!this.themes[name]) {
    -    throw this.newMissingThemeError(name)
    -  }
    -  return this.themes[name]
    -}
    -
    -ThemeSetProto.setDefault = function (opts, name) {
    -  if (name == null) {
    -    name = opts
    -    opts = {}
    -  }
    -  var platform = opts.platform == null ? 'fallback' : opts.platform
    -  var hasUnicode = !!opts.hasUnicode
    -  var hasColor = !!opts.hasColor
    -  if (!this.defaults[platform]) {
    -    this.defaults[platform] = { true: {}, false: {} }
    -  }
    -  this.defaults[platform][hasUnicode][hasColor] = name
    -}
    -
    -ThemeSetProto.getDefault = function (opts) {
    -  if (!opts) {
    -    opts = {}
    -  }
    -  var platformName = opts.platform || process.platform
    -  var platform = this.defaults[platformName] || this.defaults.fallback
    -  var hasUnicode = !!opts.hasUnicode
    -  var hasColor = !!opts.hasColor
    -  if (!platform) {
    -    throw this.newMissingDefaultThemeError(platformName, hasUnicode, hasColor)
    -  }
    -  if (!platform[hasUnicode][hasColor]) {
    -    if (hasUnicode && hasColor && platform[!hasUnicode][hasColor]) {
    -      hasUnicode = false
    -    } else if (hasUnicode && hasColor && platform[hasUnicode][!hasColor]) {
    -      hasColor = false
    -    } else if (hasUnicode && hasColor && platform[!hasUnicode][!hasColor]) {
    -      hasUnicode = false
    -      hasColor = false
    -    } else if (hasUnicode && !hasColor && platform[!hasUnicode][hasColor]) {
    -      hasUnicode = false
    -    } else if (!hasUnicode && hasColor && platform[hasUnicode][!hasColor]) {
    -      hasColor = false
    -    } else if (platform === this.defaults.fallback) {
    -      throw this.newMissingDefaultThemeError(platformName, hasUnicode, hasColor)
    -    }
    -  }
    -  if (platform[hasUnicode][hasColor]) {
    -    return this.getTheme(platform[hasUnicode][hasColor])
    -  } else {
    -    return this.getDefault(Object.assign({}, opts, { platform: 'fallback' }))
    -  }
    -}
    -
    -ThemeSetProto.newMissingThemeError = function newMissingThemeError (name) {
    -  var err = new Error('Could not find a gauge theme named "' + name + '"')
    -  Error.captureStackTrace.call(err, newMissingThemeError)
    -  err.theme = name
    -  err.code = 'EMISSINGTHEME'
    -  return err
    -}
    -
    -ThemeSetProto.newMissingDefaultThemeError =
    -  function newMissingDefaultThemeError (platformName, hasUnicode, hasColor) {
    -    var err = new Error(
    -      'Could not find a gauge theme for your platform/unicode/color use combo:\n' +
    -    '    platform = ' + platformName + '\n' +
    -    '    hasUnicode = ' + hasUnicode + '\n' +
    -    '    hasColor = ' + hasColor)
    -    Error.captureStackTrace.call(err, newMissingDefaultThemeError)
    -    err.platform = platformName
    -    err.hasUnicode = hasUnicode
    -    err.hasColor = hasColor
    -    err.code = 'EMISSINGTHEME'
    -    return err
    -  }
    -
    -ThemeSetProto.newThemeSet = function () {
    -  var themeset = function (opts) {
    -    return themeset.getDefault(opts)
    -  }
    -  return Object.assign(themeset, ThemeSetProto, {
    -    themes: Object.assign({}, this.themes),
    -    baseTheme: Object.assign({}, this.baseTheme),
    -    defaults: JSON.parse(JSON.stringify(this.defaults || {})),
    -  })
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/themes.js b/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/themes.js
    deleted file mode 100644
    index d2e62bbccb3d82..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/themes.js
    +++ /dev/null
    @@ -1,56 +0,0 @@
    -'use strict'
    -var color = require('console-control-strings').color
    -var ThemeSet = require('./theme-set.js')
    -
    -var themes = module.exports = new ThemeSet()
    -
    -themes.addTheme('ASCII', {
    -  preProgressbar: '[',
    -  postProgressbar: ']',
    -  progressbarTheme: {
    -    complete: '#',
    -    remaining: '.',
    -  },
    -  activityIndicatorTheme: '-\\|/',
    -  preSubsection: '>',
    -})
    -
    -themes.addTheme('colorASCII', themes.getTheme('ASCII'), {
    -  progressbarTheme: {
    -    preComplete: color('bgBrightWhite', 'brightWhite'),
    -    complete: '#',
    -    postComplete: color('reset'),
    -    preRemaining: color('bgBrightBlack', 'brightBlack'),
    -    remaining: '.',
    -    postRemaining: color('reset'),
    -  },
    -})
    -
    -themes.addTheme('brailleSpinner', {
    -  preProgressbar: '(',
    -  postProgressbar: ')',
    -  progressbarTheme: {
    -    complete: '#',
    -    remaining: '⠂',
    -  },
    -  activityIndicatorTheme: '⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏',
    -  preSubsection: '>',
    -})
    -
    -themes.addTheme('colorBrailleSpinner', themes.getTheme('brailleSpinner'), {
    -  progressbarTheme: {
    -    preComplete: color('bgBrightWhite', 'brightWhite'),
    -    complete: '#',
    -    postComplete: color('reset'),
    -    preRemaining: color('bgBrightBlack', 'brightBlack'),
    -    remaining: '⠂',
    -    postRemaining: color('reset'),
    -  },
    -})
    -
    -themes.setDefault({}, 'ASCII')
    -themes.setDefault({ hasColor: true }, 'colorASCII')
    -themes.setDefault({ platform: 'darwin', hasUnicode: true }, 'brailleSpinner')
    -themes.setDefault({ platform: 'darwin', hasUnicode: true, hasColor: true }, 'colorBrailleSpinner')
    -themes.setDefault({ platform: 'linux', hasUnicode: true }, 'brailleSpinner')
    -themes.setDefault({ platform: 'linux', hasUnicode: true, hasColor: true }, 'colorBrailleSpinner')
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/wide-truncate.js b/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/wide-truncate.js
    deleted file mode 100644
    index 5284a699ac3fb5..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/gauge/lib/wide-truncate.js
    +++ /dev/null
    @@ -1,31 +0,0 @@
    -'use strict'
    -var stringWidth = require('string-width')
    -var stripAnsi = require('strip-ansi')
    -
    -module.exports = wideTruncate
    -
    -function wideTruncate (str, target) {
    -  if (stringWidth(str) === 0) {
    -    return str
    -  }
    -  if (target <= 0) {
    -    return ''
    -  }
    -  if (stringWidth(str) <= target) {
    -    return str
    -  }
    -
    -  // We compute the number of bytes of ansi sequences here and add
    -  // that to our initial truncation to ensure that we don't slice one
    -  // that we want to keep in half.
    -  var noAnsi = stripAnsi(str)
    -  var ansiSize = str.length + noAnsi.length
    -  var truncated = str.slice(0, target + ansiSize)
    -
    -  // we have to shrink the result to account for our ansi sequence buffer
    -  // (if an ansi sequence was truncated) and double width characters.
    -  while (stringWidth(truncated) > target) {
    -    truncated = truncated.slice(0, -1)
    -  }
    -  return truncated
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/gauge/package.json b/deps/npm/node_modules/node-gyp/node_modules/gauge/package.json
    deleted file mode 100644
    index bce3e68a33f699..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/gauge/package.json
    +++ /dev/null
    @@ -1,66 +0,0 @@
    -{
    -  "name": "gauge",
    -  "version": "4.0.4",
    -  "description": "A terminal based horizontal gauge",
    -  "main": "lib",
    -  "scripts": {
    -    "test": "tap",
    -    "lint": "eslint \"**/*.js\"",
    -    "postlint": "template-oss-check",
    -    "lintfix": "npm run lint -- --fix",
    -    "preversion": "npm test",
    -    "postversion": "npm publish",
    -    "prepublishOnly": "git push origin --follow-tags",
    -    "snap": "tap",
    -    "posttest": "npm run lint",
    -    "template-oss-apply": "template-oss-apply --force"
    -  },
    -  "repository": {
    -    "type": "git",
    -    "url": "https://github.com/npm/gauge.git"
    -  },
    -  "keywords": [
    -    "progressbar",
    -    "progress",
    -    "gauge"
    -  ],
    -  "author": "GitHub Inc.",
    -  "license": "ISC",
    -  "bugs": {
    -    "url": "https://github.com/npm/gauge/issues"
    -  },
    -  "homepage": "https://github.com/npm/gauge",
    -  "dependencies": {
    -    "aproba": "^1.0.3 || ^2.0.0",
    -    "color-support": "^1.1.3",
    -    "console-control-strings": "^1.1.0",
    -    "has-unicode": "^2.0.1",
    -    "signal-exit": "^3.0.7",
    -    "string-width": "^4.2.3",
    -    "strip-ansi": "^6.0.1",
    -    "wide-align": "^1.1.5"
    -  },
    -  "devDependencies": {
    -    "@npmcli/eslint-config": "^3.0.1",
    -    "@npmcli/template-oss": "3.2.0",
    -    "readable-stream": "^3.6.0",
    -    "tap": "^16.0.1"
    -  },
    -  "files": [
    -    "bin/",
    -    "lib/"
    -  ],
    -  "engines": {
    -    "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
    -  },
    -  "tap": {
    -    "branches": 79,
    -    "statements": 89,
    -    "functions": 92,
    -    "lines": 90
    -  },
    -  "templateOSS": {
    -    "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "version": "3.2.0"
    -  }
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/glob/LICENSE
    deleted file mode 100644
    index 42ca266df1d523..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/glob/LICENSE
    +++ /dev/null
    @@ -1,21 +0,0 @@
    -The ISC License
    -
    -Copyright (c) Isaac Z. Schlueter and Contributors
    -
    -Permission to use, copy, modify, and/or distribute this software for any
    -purpose with or without fee is hereby granted, provided that the above
    -copyright notice and this permission notice appear in all copies.
    -
    -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
    -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    -
    -## Glob Logo
    -
    -Glob's logo created by Tanya Brassie , licensed
    -under a Creative Commons Attribution-ShareAlike 4.0 International License
    -https://creativecommons.org/licenses/by-sa/4.0/
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/common.js b/deps/npm/node_modules/node-gyp/node_modules/glob/common.js
    deleted file mode 100644
    index 424c46e1dab1be..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/glob/common.js
    +++ /dev/null
    @@ -1,238 +0,0 @@
    -exports.setopts = setopts
    -exports.ownProp = ownProp
    -exports.makeAbs = makeAbs
    -exports.finish = finish
    -exports.mark = mark
    -exports.isIgnored = isIgnored
    -exports.childrenIgnored = childrenIgnored
    -
    -function ownProp (obj, field) {
    -  return Object.prototype.hasOwnProperty.call(obj, field)
    -}
    -
    -var fs = require("fs")
    -var path = require("path")
    -var minimatch = require("minimatch")
    -var isAbsolute = require("path-is-absolute")
    -var Minimatch = minimatch.Minimatch
    -
    -function alphasort (a, b) {
    -  return a.localeCompare(b, 'en')
    -}
    -
    -function setupIgnores (self, options) {
    -  self.ignore = options.ignore || []
    -
    -  if (!Array.isArray(self.ignore))
    -    self.ignore = [self.ignore]
    -
    -  if (self.ignore.length) {
    -    self.ignore = self.ignore.map(ignoreMap)
    -  }
    -}
    -
    -// ignore patterns are always in dot:true mode.
    -function ignoreMap (pattern) {
    -  var gmatcher = null
    -  if (pattern.slice(-3) === '/**') {
    -    var gpattern = pattern.replace(/(\/\*\*)+$/, '')
    -    gmatcher = new Minimatch(gpattern, { dot: true })
    -  }
    -
    -  return {
    -    matcher: new Minimatch(pattern, { dot: true }),
    -    gmatcher: gmatcher
    -  }
    -}
    -
    -function setopts (self, pattern, options) {
    -  if (!options)
    -    options = {}
    -
    -  // base-matching: just use globstar for that.
    -  if (options.matchBase && -1 === pattern.indexOf("/")) {
    -    if (options.noglobstar) {
    -      throw new Error("base matching requires globstar")
    -    }
    -    pattern = "**/" + pattern
    -  }
    -
    -  self.silent = !!options.silent
    -  self.pattern = pattern
    -  self.strict = options.strict !== false
    -  self.realpath = !!options.realpath
    -  self.realpathCache = options.realpathCache || Object.create(null)
    -  self.follow = !!options.follow
    -  self.dot = !!options.dot
    -  self.mark = !!options.mark
    -  self.nodir = !!options.nodir
    -  if (self.nodir)
    -    self.mark = true
    -  self.sync = !!options.sync
    -  self.nounique = !!options.nounique
    -  self.nonull = !!options.nonull
    -  self.nosort = !!options.nosort
    -  self.nocase = !!options.nocase
    -  self.stat = !!options.stat
    -  self.noprocess = !!options.noprocess
    -  self.absolute = !!options.absolute
    -  self.fs = options.fs || fs
    -
    -  self.maxLength = options.maxLength || Infinity
    -  self.cache = options.cache || Object.create(null)
    -  self.statCache = options.statCache || Object.create(null)
    -  self.symlinks = options.symlinks || Object.create(null)
    -
    -  setupIgnores(self, options)
    -
    -  self.changedCwd = false
    -  var cwd = process.cwd()
    -  if (!ownProp(options, "cwd"))
    -    self.cwd = cwd
    -  else {
    -    self.cwd = path.resolve(options.cwd)
    -    self.changedCwd = self.cwd !== cwd
    -  }
    -
    -  self.root = options.root || path.resolve(self.cwd, "/")
    -  self.root = path.resolve(self.root)
    -  if (process.platform === "win32")
    -    self.root = self.root.replace(/\\/g, "/")
    -
    -  // TODO: is an absolute `cwd` supposed to be resolved against `root`?
    -  // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test')
    -  self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd)
    -  if (process.platform === "win32")
    -    self.cwdAbs = self.cwdAbs.replace(/\\/g, "/")
    -  self.nomount = !!options.nomount
    -
    -  // disable comments and negation in Minimatch.
    -  // Note that they are not supported in Glob itself anyway.
    -  options.nonegate = true
    -  options.nocomment = true
    -  // always treat \ in patterns as escapes, not path separators
    -  options.allowWindowsEscape = false
    -
    -  self.minimatch = new Minimatch(pattern, options)
    -  self.options = self.minimatch.options
    -}
    -
    -function finish (self) {
    -  var nou = self.nounique
    -  var all = nou ? [] : Object.create(null)
    -
    -  for (var i = 0, l = self.matches.length; i < l; i ++) {
    -    var matches = self.matches[i]
    -    if (!matches || Object.keys(matches).length === 0) {
    -      if (self.nonull) {
    -        // do like the shell, and spit out the literal glob
    -        var literal = self.minimatch.globSet[i]
    -        if (nou)
    -          all.push(literal)
    -        else
    -          all[literal] = true
    -      }
    -    } else {
    -      // had matches
    -      var m = Object.keys(matches)
    -      if (nou)
    -        all.push.apply(all, m)
    -      else
    -        m.forEach(function (m) {
    -          all[m] = true
    -        })
    -    }
    -  }
    -
    -  if (!nou)
    -    all = Object.keys(all)
    -
    -  if (!self.nosort)
    -    all = all.sort(alphasort)
    -
    -  // at *some* point we statted all of these
    -  if (self.mark) {
    -    for (var i = 0; i < all.length; i++) {
    -      all[i] = self._mark(all[i])
    -    }
    -    if (self.nodir) {
    -      all = all.filter(function (e) {
    -        var notDir = !(/\/$/.test(e))
    -        var c = self.cache[e] || self.cache[makeAbs(self, e)]
    -        if (notDir && c)
    -          notDir = c !== 'DIR' && !Array.isArray(c)
    -        return notDir
    -      })
    -    }
    -  }
    -
    -  if (self.ignore.length)
    -    all = all.filter(function(m) {
    -      return !isIgnored(self, m)
    -    })
    -
    -  self.found = all
    -}
    -
    -function mark (self, p) {
    -  var abs = makeAbs(self, p)
    -  var c = self.cache[abs]
    -  var m = p
    -  if (c) {
    -    var isDir = c === 'DIR' || Array.isArray(c)
    -    var slash = p.slice(-1) === '/'
    -
    -    if (isDir && !slash)
    -      m += '/'
    -    else if (!isDir && slash)
    -      m = m.slice(0, -1)
    -
    -    if (m !== p) {
    -      var mabs = makeAbs(self, m)
    -      self.statCache[mabs] = self.statCache[abs]
    -      self.cache[mabs] = self.cache[abs]
    -    }
    -  }
    -
    -  return m
    -}
    -
    -// lotta situps...
    -function makeAbs (self, f) {
    -  var abs = f
    -  if (f.charAt(0) === '/') {
    -    abs = path.join(self.root, f)
    -  } else if (isAbsolute(f) || f === '') {
    -    abs = f
    -  } else if (self.changedCwd) {
    -    abs = path.resolve(self.cwd, f)
    -  } else {
    -    abs = path.resolve(f)
    -  }
    -
    -  if (process.platform === 'win32')
    -    abs = abs.replace(/\\/g, '/')
    -
    -  return abs
    -}
    -
    -
    -// Return true, if pattern ends with globstar '**', for the accompanying parent directory.
    -// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents
    -function isIgnored (self, path) {
    -  if (!self.ignore.length)
    -    return false
    -
    -  return self.ignore.some(function(item) {
    -    return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))
    -  })
    -}
    -
    -function childrenIgnored (self, path) {
    -  if (!self.ignore.length)
    -    return false
    -
    -  return self.ignore.some(function(item) {
    -    return !!(item.gmatcher && item.gmatcher.match(path))
    -  })
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/glob.js b/deps/npm/node_modules/node-gyp/node_modules/glob/glob.js
    deleted file mode 100644
    index 37a4d7e60775a3..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/glob/glob.js
    +++ /dev/null
    @@ -1,790 +0,0 @@
    -// Approach:
    -//
    -// 1. Get the minimatch set
    -// 2. For each pattern in the set, PROCESS(pattern, false)
    -// 3. Store matches per-set, then uniq them
    -//
    -// PROCESS(pattern, inGlobStar)
    -// Get the first [n] items from pattern that are all strings
    -// Join these together.  This is PREFIX.
    -//   If there is no more remaining, then stat(PREFIX) and
    -//   add to matches if it succeeds.  END.
    -//
    -// If inGlobStar and PREFIX is symlink and points to dir
    -//   set ENTRIES = []
    -// else readdir(PREFIX) as ENTRIES
    -//   If fail, END
    -//
    -// with ENTRIES
    -//   If pattern[n] is GLOBSTAR
    -//     // handle the case where the globstar match is empty
    -//     // by pruning it out, and testing the resulting pattern
    -//     PROCESS(pattern[0..n] + pattern[n+1 .. $], false)
    -//     // handle other cases.
    -//     for ENTRY in ENTRIES (not dotfiles)
    -//       // attach globstar + tail onto the entry
    -//       // Mark that this entry is a globstar match
    -//       PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)
    -//
    -//   else // not globstar
    -//     for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)
    -//       Test ENTRY against pattern[n]
    -//       If fails, continue
    -//       If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])
    -//
    -// Caveat:
    -//   Cache all stats and readdirs results to minimize syscall.  Since all
    -//   we ever care about is existence and directory-ness, we can just keep
    -//   `true` for files, and [children,...] for directories, or `false` for
    -//   things that don't exist.
    -
    -module.exports = glob
    -
    -var rp = require('fs.realpath')
    -var minimatch = require('minimatch')
    -var Minimatch = minimatch.Minimatch
    -var inherits = require('inherits')
    -var EE = require('events').EventEmitter
    -var path = require('path')
    -var assert = require('assert')
    -var isAbsolute = require('path-is-absolute')
    -var globSync = require('./sync.js')
    -var common = require('./common.js')
    -var setopts = common.setopts
    -var ownProp = common.ownProp
    -var inflight = require('inflight')
    -var util = require('util')
    -var childrenIgnored = common.childrenIgnored
    -var isIgnored = common.isIgnored
    -
    -var once = require('once')
    -
    -function glob (pattern, options, cb) {
    -  if (typeof options === 'function') cb = options, options = {}
    -  if (!options) options = {}
    -
    -  if (options.sync) {
    -    if (cb)
    -      throw new TypeError('callback provided to sync glob')
    -    return globSync(pattern, options)
    -  }
    -
    -  return new Glob(pattern, options, cb)
    -}
    -
    -glob.sync = globSync
    -var GlobSync = glob.GlobSync = globSync.GlobSync
    -
    -// old api surface
    -glob.glob = glob
    -
    -function extend (origin, add) {
    -  if (add === null || typeof add !== 'object') {
    -    return origin
    -  }
    -
    -  var keys = Object.keys(add)
    -  var i = keys.length
    -  while (i--) {
    -    origin[keys[i]] = add[keys[i]]
    -  }
    -  return origin
    -}
    -
    -glob.hasMagic = function (pattern, options_) {
    -  var options = extend({}, options_)
    -  options.noprocess = true
    -
    -  var g = new Glob(pattern, options)
    -  var set = g.minimatch.set
    -
    -  if (!pattern)
    -    return false
    -
    -  if (set.length > 1)
    -    return true
    -
    -  for (var j = 0; j < set[0].length; j++) {
    -    if (typeof set[0][j] !== 'string')
    -      return true
    -  }
    -
    -  return false
    -}
    -
    -glob.Glob = Glob
    -inherits(Glob, EE)
    -function Glob (pattern, options, cb) {
    -  if (typeof options === 'function') {
    -    cb = options
    -    options = null
    -  }
    -
    -  if (options && options.sync) {
    -    if (cb)
    -      throw new TypeError('callback provided to sync glob')
    -    return new GlobSync(pattern, options)
    -  }
    -
    -  if (!(this instanceof Glob))
    -    return new Glob(pattern, options, cb)
    -
    -  setopts(this, pattern, options)
    -  this._didRealPath = false
    -
    -  // process each pattern in the minimatch set
    -  var n = this.minimatch.set.length
    -
    -  // The matches are stored as {: true,...} so that
    -  // duplicates are automagically pruned.
    -  // Later, we do an Object.keys() on these.
    -  // Keep them as a list so we can fill in when nonull is set.
    -  this.matches = new Array(n)
    -
    -  if (typeof cb === 'function') {
    -    cb = once(cb)
    -    this.on('error', cb)
    -    this.on('end', function (matches) {
    -      cb(null, matches)
    -    })
    -  }
    -
    -  var self = this
    -  this._processing = 0
    -
    -  this._emitQueue = []
    -  this._processQueue = []
    -  this.paused = false
    -
    -  if (this.noprocess)
    -    return this
    -
    -  if (n === 0)
    -    return done()
    -
    -  var sync = true
    -  for (var i = 0; i < n; i ++) {
    -    this._process(this.minimatch.set[i], i, false, done)
    -  }
    -  sync = false
    -
    -  function done () {
    -    --self._processing
    -    if (self._processing <= 0) {
    -      if (sync) {
    -        process.nextTick(function () {
    -          self._finish()
    -        })
    -      } else {
    -        self._finish()
    -      }
    -    }
    -  }
    -}
    -
    -Glob.prototype._finish = function () {
    -  assert(this instanceof Glob)
    -  if (this.aborted)
    -    return
    -
    -  if (this.realpath && !this._didRealpath)
    -    return this._realpath()
    -
    -  common.finish(this)
    -  this.emit('end', this.found)
    -}
    -
    -Glob.prototype._realpath = function () {
    -  if (this._didRealpath)
    -    return
    -
    -  this._didRealpath = true
    -
    -  var n = this.matches.length
    -  if (n === 0)
    -    return this._finish()
    -
    -  var self = this
    -  for (var i = 0; i < this.matches.length; i++)
    -    this._realpathSet(i, next)
    -
    -  function next () {
    -    if (--n === 0)
    -      self._finish()
    -  }
    -}
    -
    -Glob.prototype._realpathSet = function (index, cb) {
    -  var matchset = this.matches[index]
    -  if (!matchset)
    -    return cb()
    -
    -  var found = Object.keys(matchset)
    -  var self = this
    -  var n = found.length
    -
    -  if (n === 0)
    -    return cb()
    -
    -  var set = this.matches[index] = Object.create(null)
    -  found.forEach(function (p, i) {
    -    // If there's a problem with the stat, then it means that
    -    // one or more of the links in the realpath couldn't be
    -    // resolved.  just return the abs value in that case.
    -    p = self._makeAbs(p)
    -    rp.realpath(p, self.realpathCache, function (er, real) {
    -      if (!er)
    -        set[real] = true
    -      else if (er.syscall === 'stat')
    -        set[p] = true
    -      else
    -        self.emit('error', er) // srsly wtf right here
    -
    -      if (--n === 0) {
    -        self.matches[index] = set
    -        cb()
    -      }
    -    })
    -  })
    -}
    -
    -Glob.prototype._mark = function (p) {
    -  return common.mark(this, p)
    -}
    -
    -Glob.prototype._makeAbs = function (f) {
    -  return common.makeAbs(this, f)
    -}
    -
    -Glob.prototype.abort = function () {
    -  this.aborted = true
    -  this.emit('abort')
    -}
    -
    -Glob.prototype.pause = function () {
    -  if (!this.paused) {
    -    this.paused = true
    -    this.emit('pause')
    -  }
    -}
    -
    -Glob.prototype.resume = function () {
    -  if (this.paused) {
    -    this.emit('resume')
    -    this.paused = false
    -    if (this._emitQueue.length) {
    -      var eq = this._emitQueue.slice(0)
    -      this._emitQueue.length = 0
    -      for (var i = 0; i < eq.length; i ++) {
    -        var e = eq[i]
    -        this._emitMatch(e[0], e[1])
    -      }
    -    }
    -    if (this._processQueue.length) {
    -      var pq = this._processQueue.slice(0)
    -      this._processQueue.length = 0
    -      for (var i = 0; i < pq.length; i ++) {
    -        var p = pq[i]
    -        this._processing--
    -        this._process(p[0], p[1], p[2], p[3])
    -      }
    -    }
    -  }
    -}
    -
    -Glob.prototype._process = function (pattern, index, inGlobStar, cb) {
    -  assert(this instanceof Glob)
    -  assert(typeof cb === 'function')
    -
    -  if (this.aborted)
    -    return
    -
    -  this._processing++
    -  if (this.paused) {
    -    this._processQueue.push([pattern, index, inGlobStar, cb])
    -    return
    -  }
    -
    -  //console.error('PROCESS %d', this._processing, pattern)
    -
    -  // Get the first [n] parts of pattern that are all strings.
    -  var n = 0
    -  while (typeof pattern[n] === 'string') {
    -    n ++
    -  }
    -  // now n is the index of the first one that is *not* a string.
    -
    -  // see if there's anything else
    -  var prefix
    -  switch (n) {
    -    // if not, then this is rather simple
    -    case pattern.length:
    -      this._processSimple(pattern.join('/'), index, cb)
    -      return
    -
    -    case 0:
    -      // pattern *starts* with some non-trivial item.
    -      // going to readdir(cwd), but not include the prefix in matches.
    -      prefix = null
    -      break
    -
    -    default:
    -      // pattern has some string bits in the front.
    -      // whatever it starts with, whether that's 'absolute' like /foo/bar,
    -      // or 'relative' like '../baz'
    -      prefix = pattern.slice(0, n).join('/')
    -      break
    -  }
    -
    -  var remain = pattern.slice(n)
    -
    -  // get the list of entries.
    -  var read
    -  if (prefix === null)
    -    read = '.'
    -  else if (isAbsolute(prefix) ||
    -      isAbsolute(pattern.map(function (p) {
    -        return typeof p === 'string' ? p : '[*]'
    -      }).join('/'))) {
    -    if (!prefix || !isAbsolute(prefix))
    -      prefix = '/' + prefix
    -    read = prefix
    -  } else
    -    read = prefix
    -
    -  var abs = this._makeAbs(read)
    -
    -  //if ignored, skip _processing
    -  if (childrenIgnored(this, read))
    -    return cb()
    -
    -  var isGlobStar = remain[0] === minimatch.GLOBSTAR
    -  if (isGlobStar)
    -    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)
    -  else
    -    this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)
    -}
    -
    -Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {
    -  var self = this
    -  this._readdir(abs, inGlobStar, function (er, entries) {
    -    return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
    -  })
    -}
    -
    -Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
    -
    -  // if the abs isn't a dir, then nothing can match!
    -  if (!entries)
    -    return cb()
    -
    -  // It will only match dot entries if it starts with a dot, or if
    -  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.
    -  var pn = remain[0]
    -  var negate = !!this.minimatch.negate
    -  var rawGlob = pn._glob
    -  var dotOk = this.dot || rawGlob.charAt(0) === '.'
    -
    -  var matchedEntries = []
    -  for (var i = 0; i < entries.length; i++) {
    -    var e = entries[i]
    -    if (e.charAt(0) !== '.' || dotOk) {
    -      var m
    -      if (negate && !prefix) {
    -        m = !e.match(pn)
    -      } else {
    -        m = e.match(pn)
    -      }
    -      if (m)
    -        matchedEntries.push(e)
    -    }
    -  }
    -
    -  //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)
    -
    -  var len = matchedEntries.length
    -  // If there are no matched entries, then nothing matches.
    -  if (len === 0)
    -    return cb()
    -
    -  // if this is the last remaining pattern bit, then no need for
    -  // an additional stat *unless* the user has specified mark or
    -  // stat explicitly.  We know they exist, since readdir returned
    -  // them.
    -
    -  if (remain.length === 1 && !this.mark && !this.stat) {
    -    if (!this.matches[index])
    -      this.matches[index] = Object.create(null)
    -
    -    for (var i = 0; i < len; i ++) {
    -      var e = matchedEntries[i]
    -      if (prefix) {
    -        if (prefix !== '/')
    -          e = prefix + '/' + e
    -        else
    -          e = prefix + e
    -      }
    -
    -      if (e.charAt(0) === '/' && !this.nomount) {
    -        e = path.join(this.root, e)
    -      }
    -      this._emitMatch(index, e)
    -    }
    -    // This was the last one, and no stats were needed
    -    return cb()
    -  }
    -
    -  // now test all matched entries as stand-ins for that part
    -  // of the pattern.
    -  remain.shift()
    -  for (var i = 0; i < len; i ++) {
    -    var e = matchedEntries[i]
    -    var newPattern
    -    if (prefix) {
    -      if (prefix !== '/')
    -        e = prefix + '/' + e
    -      else
    -        e = prefix + e
    -    }
    -    this._process([e].concat(remain), index, inGlobStar, cb)
    -  }
    -  cb()
    -}
    -
    -Glob.prototype._emitMatch = function (index, e) {
    -  if (this.aborted)
    -    return
    -
    -  if (isIgnored(this, e))
    -    return
    -
    -  if (this.paused) {
    -    this._emitQueue.push([index, e])
    -    return
    -  }
    -
    -  var abs = isAbsolute(e) ? e : this._makeAbs(e)
    -
    -  if (this.mark)
    -    e = this._mark(e)
    -
    -  if (this.absolute)
    -    e = abs
    -
    -  if (this.matches[index][e])
    -    return
    -
    -  if (this.nodir) {
    -    var c = this.cache[abs]
    -    if (c === 'DIR' || Array.isArray(c))
    -      return
    -  }
    -
    -  this.matches[index][e] = true
    -
    -  var st = this.statCache[abs]
    -  if (st)
    -    this.emit('stat', e, st)
    -
    -  this.emit('match', e)
    -}
    -
    -Glob.prototype._readdirInGlobStar = function (abs, cb) {
    -  if (this.aborted)
    -    return
    -
    -  // follow all symlinked directories forever
    -  // just proceed as if this is a non-globstar situation
    -  if (this.follow)
    -    return this._readdir(abs, false, cb)
    -
    -  var lstatkey = 'lstat\0' + abs
    -  var self = this
    -  var lstatcb = inflight(lstatkey, lstatcb_)
    -
    -  if (lstatcb)
    -    self.fs.lstat(abs, lstatcb)
    -
    -  function lstatcb_ (er, lstat) {
    -    if (er && er.code === 'ENOENT')
    -      return cb()
    -
    -    var isSym = lstat && lstat.isSymbolicLink()
    -    self.symlinks[abs] = isSym
    -
    -    // If it's not a symlink or a dir, then it's definitely a regular file.
    -    // don't bother doing a readdir in that case.
    -    if (!isSym && lstat && !lstat.isDirectory()) {
    -      self.cache[abs] = 'FILE'
    -      cb()
    -    } else
    -      self._readdir(abs, false, cb)
    -  }
    -}
    -
    -Glob.prototype._readdir = function (abs, inGlobStar, cb) {
    -  if (this.aborted)
    -    return
    -
    -  cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb)
    -  if (!cb)
    -    return
    -
    -  //console.error('RD %j %j', +inGlobStar, abs)
    -  if (inGlobStar && !ownProp(this.symlinks, abs))
    -    return this._readdirInGlobStar(abs, cb)
    -
    -  if (ownProp(this.cache, abs)) {
    -    var c = this.cache[abs]
    -    if (!c || c === 'FILE')
    -      return cb()
    -
    -    if (Array.isArray(c))
    -      return cb(null, c)
    -  }
    -
    -  var self = this
    -  self.fs.readdir(abs, readdirCb(this, abs, cb))
    -}
    -
    -function readdirCb (self, abs, cb) {
    -  return function (er, entries) {
    -    if (er)
    -      self._readdirError(abs, er, cb)
    -    else
    -      self._readdirEntries(abs, entries, cb)
    -  }
    -}
    -
    -Glob.prototype._readdirEntries = function (abs, entries, cb) {
    -  if (this.aborted)
    -    return
    -
    -  // if we haven't asked to stat everything, then just
    -  // assume that everything in there exists, so we can avoid
    -  // having to stat it a second time.
    -  if (!this.mark && !this.stat) {
    -    for (var i = 0; i < entries.length; i ++) {
    -      var e = entries[i]
    -      if (abs === '/')
    -        e = abs + e
    -      else
    -        e = abs + '/' + e
    -      this.cache[e] = true
    -    }
    -  }
    -
    -  this.cache[abs] = entries
    -  return cb(null, entries)
    -}
    -
    -Glob.prototype._readdirError = function (f, er, cb) {
    -  if (this.aborted)
    -    return
    -
    -  // handle errors, and cache the information
    -  switch (er.code) {
    -    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
    -    case 'ENOTDIR': // totally normal. means it *does* exist.
    -      var abs = this._makeAbs(f)
    -      this.cache[abs] = 'FILE'
    -      if (abs === this.cwdAbs) {
    -        var error = new Error(er.code + ' invalid cwd ' + this.cwd)
    -        error.path = this.cwd
    -        error.code = er.code
    -        this.emit('error', error)
    -        this.abort()
    -      }
    -      break
    -
    -    case 'ENOENT': // not terribly unusual
    -    case 'ELOOP':
    -    case 'ENAMETOOLONG':
    -    case 'UNKNOWN':
    -      this.cache[this._makeAbs(f)] = false
    -      break
    -
    -    default: // some unusual error.  Treat as failure.
    -      this.cache[this._makeAbs(f)] = false
    -      if (this.strict) {
    -        this.emit('error', er)
    -        // If the error is handled, then we abort
    -        // if not, we threw out of here
    -        this.abort()
    -      }
    -      if (!this.silent)
    -        console.error('glob error', er)
    -      break
    -  }
    -
    -  return cb()
    -}
    -
    -Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {
    -  var self = this
    -  this._readdir(abs, inGlobStar, function (er, entries) {
    -    self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
    -  })
    -}
    -
    -
    -Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
    -  //console.error('pgs2', prefix, remain[0], entries)
    -
    -  // no entries means not a dir, so it can never have matches
    -  // foo.txt/** doesn't match foo.txt
    -  if (!entries)
    -    return cb()
    -
    -  // test without the globstar, and with every child both below
    -  // and replacing the globstar.
    -  var remainWithoutGlobStar = remain.slice(1)
    -  var gspref = prefix ? [ prefix ] : []
    -  var noGlobStar = gspref.concat(remainWithoutGlobStar)
    -
    -  // the noGlobStar pattern exits the inGlobStar state
    -  this._process(noGlobStar, index, false, cb)
    -
    -  var isSym = this.symlinks[abs]
    -  var len = entries.length
    -
    -  // If it's a symlink, and we're in a globstar, then stop
    -  if (isSym && inGlobStar)
    -    return cb()
    -
    -  for (var i = 0; i < len; i++) {
    -    var e = entries[i]
    -    if (e.charAt(0) === '.' && !this.dot)
    -      continue
    -
    -    // these two cases enter the inGlobStar state
    -    var instead = gspref.concat(entries[i], remainWithoutGlobStar)
    -    this._process(instead, index, true, cb)
    -
    -    var below = gspref.concat(entries[i], remain)
    -    this._process(below, index, true, cb)
    -  }
    -
    -  cb()
    -}
    -
    -Glob.prototype._processSimple = function (prefix, index, cb) {
    -  // XXX review this.  Shouldn't it be doing the mounting etc
    -  // before doing stat?  kinda weird?
    -  var self = this
    -  this._stat(prefix, function (er, exists) {
    -    self._processSimple2(prefix, index, er, exists, cb)
    -  })
    -}
    -Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {
    -
    -  //console.error('ps2', prefix, exists)
    -
    -  if (!this.matches[index])
    -    this.matches[index] = Object.create(null)
    -
    -  // If it doesn't exist, then just mark the lack of results
    -  if (!exists)
    -    return cb()
    -
    -  if (prefix && isAbsolute(prefix) && !this.nomount) {
    -    var trail = /[\/\\]$/.test(prefix)
    -    if (prefix.charAt(0) === '/') {
    -      prefix = path.join(this.root, prefix)
    -    } else {
    -      prefix = path.resolve(this.root, prefix)
    -      if (trail)
    -        prefix += '/'
    -    }
    -  }
    -
    -  if (process.platform === 'win32')
    -    prefix = prefix.replace(/\\/g, '/')
    -
    -  // Mark this as a match
    -  this._emitMatch(index, prefix)
    -  cb()
    -}
    -
    -// Returns either 'DIR', 'FILE', or false
    -Glob.prototype._stat = function (f, cb) {
    -  var abs = this._makeAbs(f)
    -  var needDir = f.slice(-1) === '/'
    -
    -  if (f.length > this.maxLength)
    -    return cb()
    -
    -  if (!this.stat && ownProp(this.cache, abs)) {
    -    var c = this.cache[abs]
    -
    -    if (Array.isArray(c))
    -      c = 'DIR'
    -
    -    // It exists, but maybe not how we need it
    -    if (!needDir || c === 'DIR')
    -      return cb(null, c)
    -
    -    if (needDir && c === 'FILE')
    -      return cb()
    -
    -    // otherwise we have to stat, because maybe c=true
    -    // if we know it exists, but not what it is.
    -  }
    -
    -  var exists
    -  var stat = this.statCache[abs]
    -  if (stat !== undefined) {
    -    if (stat === false)
    -      return cb(null, stat)
    -    else {
    -      var type = stat.isDirectory() ? 'DIR' : 'FILE'
    -      if (needDir && type === 'FILE')
    -        return cb()
    -      else
    -        return cb(null, type, stat)
    -    }
    -  }
    -
    -  var self = this
    -  var statcb = inflight('stat\0' + abs, lstatcb_)
    -  if (statcb)
    -    self.fs.lstat(abs, statcb)
    -
    -  function lstatcb_ (er, lstat) {
    -    if (lstat && lstat.isSymbolicLink()) {
    -      // If it's a symlink, then treat it as the target, unless
    -      // the target does not exist, then treat it as a file.
    -      return self.fs.stat(abs, function (er, stat) {
    -        if (er)
    -          self._stat2(f, abs, null, lstat, cb)
    -        else
    -          self._stat2(f, abs, er, stat, cb)
    -      })
    -    } else {
    -      self._stat2(f, abs, er, lstat, cb)
    -    }
    -  }
    -}
    -
    -Glob.prototype._stat2 = function (f, abs, er, stat, cb) {
    -  if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
    -    this.statCache[abs] = false
    -    return cb()
    -  }
    -
    -  var needDir = f.slice(-1) === '/'
    -  this.statCache[abs] = stat
    -
    -  if (abs.slice(-1) === '/' && stat && !stat.isDirectory())
    -    return cb(null, false, stat)
    -
    -  var c = true
    -  if (stat)
    -    c = stat.isDirectory() ? 'DIR' : 'FILE'
    -  this.cache[abs] = this.cache[abs] || c
    -
    -  if (needDir && c === 'FILE')
    -    return cb()
    -
    -  return cb(null, c, stat)
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/package.json b/deps/npm/node_modules/node-gyp/node_modules/glob/package.json
    deleted file mode 100644
    index 5940b649b7e65a..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/glob/package.json
    +++ /dev/null
    @@ -1,55 +0,0 @@
    -{
    -  "author": "Isaac Z. Schlueter  (http://blog.izs.me/)",
    -  "name": "glob",
    -  "description": "a little globber",
    -  "version": "7.2.3",
    -  "publishConfig": {
    -    "tag": "v7-legacy"
    -  },
    -  "repository": {
    -    "type": "git",
    -    "url": "git://github.com/isaacs/node-glob.git"
    -  },
    -  "main": "glob.js",
    -  "files": [
    -    "glob.js",
    -    "sync.js",
    -    "common.js"
    -  ],
    -  "engines": {
    -    "node": "*"
    -  },
    -  "dependencies": {
    -    "fs.realpath": "^1.0.0",
    -    "inflight": "^1.0.4",
    -    "inherits": "2",
    -    "minimatch": "^3.1.1",
    -    "once": "^1.3.0",
    -    "path-is-absolute": "^1.0.0"
    -  },
    -  "devDependencies": {
    -    "memfs": "^3.2.0",
    -    "mkdirp": "0",
    -    "rimraf": "^2.2.8",
    -    "tap": "^15.0.6",
    -    "tick": "0.0.6"
    -  },
    -  "tap": {
    -    "before": "test/00-setup.js",
    -    "after": "test/zz-cleanup.js",
    -    "jobs": 1
    -  },
    -  "scripts": {
    -    "prepublish": "npm run benchclean",
    -    "profclean": "rm -f v8.log profile.txt",
    -    "test": "tap",
    -    "test-regen": "npm run profclean && TEST_REGEN=1 node test/00-setup.js",
    -    "bench": "bash benchmark.sh",
    -    "prof": "bash prof.sh && cat profile.txt",
    -    "benchclean": "node benchclean.js"
    -  },
    -  "license": "ISC",
    -  "funding": {
    -    "url": "https://github.com/sponsors/isaacs"
    -  }
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/glob/sync.js b/deps/npm/node_modules/node-gyp/node_modules/glob/sync.js
    deleted file mode 100644
    index 2c4f480192d28d..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/glob/sync.js
    +++ /dev/null
    @@ -1,486 +0,0 @@
    -module.exports = globSync
    -globSync.GlobSync = GlobSync
    -
    -var rp = require('fs.realpath')
    -var minimatch = require('minimatch')
    -var Minimatch = minimatch.Minimatch
    -var Glob = require('./glob.js').Glob
    -var util = require('util')
    -var path = require('path')
    -var assert = require('assert')
    -var isAbsolute = require('path-is-absolute')
    -var common = require('./common.js')
    -var setopts = common.setopts
    -var ownProp = common.ownProp
    -var childrenIgnored = common.childrenIgnored
    -var isIgnored = common.isIgnored
    -
    -function globSync (pattern, options) {
    -  if (typeof options === 'function' || arguments.length === 3)
    -    throw new TypeError('callback provided to sync glob\n'+
    -                        'See: https://github.com/isaacs/node-glob/issues/167')
    -
    -  return new GlobSync(pattern, options).found
    -}
    -
    -function GlobSync (pattern, options) {
    -  if (!pattern)
    -    throw new Error('must provide pattern')
    -
    -  if (typeof options === 'function' || arguments.length === 3)
    -    throw new TypeError('callback provided to sync glob\n'+
    -                        'See: https://github.com/isaacs/node-glob/issues/167')
    -
    -  if (!(this instanceof GlobSync))
    -    return new GlobSync(pattern, options)
    -
    -  setopts(this, pattern, options)
    -
    -  if (this.noprocess)
    -    return this
    -
    -  var n = this.minimatch.set.length
    -  this.matches = new Array(n)
    -  for (var i = 0; i < n; i ++) {
    -    this._process(this.minimatch.set[i], i, false)
    -  }
    -  this._finish()
    -}
    -
    -GlobSync.prototype._finish = function () {
    -  assert.ok(this instanceof GlobSync)
    -  if (this.realpath) {
    -    var self = this
    -    this.matches.forEach(function (matchset, index) {
    -      var set = self.matches[index] = Object.create(null)
    -      for (var p in matchset) {
    -        try {
    -          p = self._makeAbs(p)
    -          var real = rp.realpathSync(p, self.realpathCache)
    -          set[real] = true
    -        } catch (er) {
    -          if (er.syscall === 'stat')
    -            set[self._makeAbs(p)] = true
    -          else
    -            throw er
    -        }
    -      }
    -    })
    -  }
    -  common.finish(this)
    -}
    -
    -
    -GlobSync.prototype._process = function (pattern, index, inGlobStar) {
    -  assert.ok(this instanceof GlobSync)
    -
    -  // Get the first [n] parts of pattern that are all strings.
    -  var n = 0
    -  while (typeof pattern[n] === 'string') {
    -    n ++
    -  }
    -  // now n is the index of the first one that is *not* a string.
    -
    -  // See if there's anything else
    -  var prefix
    -  switch (n) {
    -    // if not, then this is rather simple
    -    case pattern.length:
    -      this._processSimple(pattern.join('/'), index)
    -      return
    -
    -    case 0:
    -      // pattern *starts* with some non-trivial item.
    -      // going to readdir(cwd), but not include the prefix in matches.
    -      prefix = null
    -      break
    -
    -    default:
    -      // pattern has some string bits in the front.
    -      // whatever it starts with, whether that's 'absolute' like /foo/bar,
    -      // or 'relative' like '../baz'
    -      prefix = pattern.slice(0, n).join('/')
    -      break
    -  }
    -
    -  var remain = pattern.slice(n)
    -
    -  // get the list of entries.
    -  var read
    -  if (prefix === null)
    -    read = '.'
    -  else if (isAbsolute(prefix) ||
    -      isAbsolute(pattern.map(function (p) {
    -        return typeof p === 'string' ? p : '[*]'
    -      }).join('/'))) {
    -    if (!prefix || !isAbsolute(prefix))
    -      prefix = '/' + prefix
    -    read = prefix
    -  } else
    -    read = prefix
    -
    -  var abs = this._makeAbs(read)
    -
    -  //if ignored, skip processing
    -  if (childrenIgnored(this, read))
    -    return
    -
    -  var isGlobStar = remain[0] === minimatch.GLOBSTAR
    -  if (isGlobStar)
    -    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar)
    -  else
    -    this._processReaddir(prefix, read, abs, remain, index, inGlobStar)
    -}
    -
    -
    -GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) {
    -  var entries = this._readdir(abs, inGlobStar)
    -
    -  // if the abs isn't a dir, then nothing can match!
    -  if (!entries)
    -    return
    -
    -  // It will only match dot entries if it starts with a dot, or if
    -  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.
    -  var pn = remain[0]
    -  var negate = !!this.minimatch.negate
    -  var rawGlob = pn._glob
    -  var dotOk = this.dot || rawGlob.charAt(0) === '.'
    -
    -  var matchedEntries = []
    -  for (var i = 0; i < entries.length; i++) {
    -    var e = entries[i]
    -    if (e.charAt(0) !== '.' || dotOk) {
    -      var m
    -      if (negate && !prefix) {
    -        m = !e.match(pn)
    -      } else {
    -        m = e.match(pn)
    -      }
    -      if (m)
    -        matchedEntries.push(e)
    -    }
    -  }
    -
    -  var len = matchedEntries.length
    -  // If there are no matched entries, then nothing matches.
    -  if (len === 0)
    -    return
    -
    -  // if this is the last remaining pattern bit, then no need for
    -  // an additional stat *unless* the user has specified mark or
    -  // stat explicitly.  We know they exist, since readdir returned
    -  // them.
    -
    -  if (remain.length === 1 && !this.mark && !this.stat) {
    -    if (!this.matches[index])
    -      this.matches[index] = Object.create(null)
    -
    -    for (var i = 0; i < len; i ++) {
    -      var e = matchedEntries[i]
    -      if (prefix) {
    -        if (prefix.slice(-1) !== '/')
    -          e = prefix + '/' + e
    -        else
    -          e = prefix + e
    -      }
    -
    -      if (e.charAt(0) === '/' && !this.nomount) {
    -        e = path.join(this.root, e)
    -      }
    -      this._emitMatch(index, e)
    -    }
    -    // This was the last one, and no stats were needed
    -    return
    -  }
    -
    -  // now test all matched entries as stand-ins for that part
    -  // of the pattern.
    -  remain.shift()
    -  for (var i = 0; i < len; i ++) {
    -    var e = matchedEntries[i]
    -    var newPattern
    -    if (prefix)
    -      newPattern = [prefix, e]
    -    else
    -      newPattern = [e]
    -    this._process(newPattern.concat(remain), index, inGlobStar)
    -  }
    -}
    -
    -
    -GlobSync.prototype._emitMatch = function (index, e) {
    -  if (isIgnored(this, e))
    -    return
    -
    -  var abs = this._makeAbs(e)
    -
    -  if (this.mark)
    -    e = this._mark(e)
    -
    -  if (this.absolute) {
    -    e = abs
    -  }
    -
    -  if (this.matches[index][e])
    -    return
    -
    -  if (this.nodir) {
    -    var c = this.cache[abs]
    -    if (c === 'DIR' || Array.isArray(c))
    -      return
    -  }
    -
    -  this.matches[index][e] = true
    -
    -  if (this.stat)
    -    this._stat(e)
    -}
    -
    -
    -GlobSync.prototype._readdirInGlobStar = function (abs) {
    -  // follow all symlinked directories forever
    -  // just proceed as if this is a non-globstar situation
    -  if (this.follow)
    -    return this._readdir(abs, false)
    -
    -  var entries
    -  var lstat
    -  var stat
    -  try {
    -    lstat = this.fs.lstatSync(abs)
    -  } catch (er) {
    -    if (er.code === 'ENOENT') {
    -      // lstat failed, doesn't exist
    -      return null
    -    }
    -  }
    -
    -  var isSym = lstat && lstat.isSymbolicLink()
    -  this.symlinks[abs] = isSym
    -
    -  // If it's not a symlink or a dir, then it's definitely a regular file.
    -  // don't bother doing a readdir in that case.
    -  if (!isSym && lstat && !lstat.isDirectory())
    -    this.cache[abs] = 'FILE'
    -  else
    -    entries = this._readdir(abs, false)
    -
    -  return entries
    -}
    -
    -GlobSync.prototype._readdir = function (abs, inGlobStar) {
    -  var entries
    -
    -  if (inGlobStar && !ownProp(this.symlinks, abs))
    -    return this._readdirInGlobStar(abs)
    -
    -  if (ownProp(this.cache, abs)) {
    -    var c = this.cache[abs]
    -    if (!c || c === 'FILE')
    -      return null
    -
    -    if (Array.isArray(c))
    -      return c
    -  }
    -
    -  try {
    -    return this._readdirEntries(abs, this.fs.readdirSync(abs))
    -  } catch (er) {
    -    this._readdirError(abs, er)
    -    return null
    -  }
    -}
    -
    -GlobSync.prototype._readdirEntries = function (abs, entries) {
    -  // if we haven't asked to stat everything, then just
    -  // assume that everything in there exists, so we can avoid
    -  // having to stat it a second time.
    -  if (!this.mark && !this.stat) {
    -    for (var i = 0; i < entries.length; i ++) {
    -      var e = entries[i]
    -      if (abs === '/')
    -        e = abs + e
    -      else
    -        e = abs + '/' + e
    -      this.cache[e] = true
    -    }
    -  }
    -
    -  this.cache[abs] = entries
    -
    -  // mark and cache dir-ness
    -  return entries
    -}
    -
    -GlobSync.prototype._readdirError = function (f, er) {
    -  // handle errors, and cache the information
    -  switch (er.code) {
    -    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
    -    case 'ENOTDIR': // totally normal. means it *does* exist.
    -      var abs = this._makeAbs(f)
    -      this.cache[abs] = 'FILE'
    -      if (abs === this.cwdAbs) {
    -        var error = new Error(er.code + ' invalid cwd ' + this.cwd)
    -        error.path = this.cwd
    -        error.code = er.code
    -        throw error
    -      }
    -      break
    -
    -    case 'ENOENT': // not terribly unusual
    -    case 'ELOOP':
    -    case 'ENAMETOOLONG':
    -    case 'UNKNOWN':
    -      this.cache[this._makeAbs(f)] = false
    -      break
    -
    -    default: // some unusual error.  Treat as failure.
    -      this.cache[this._makeAbs(f)] = false
    -      if (this.strict)
    -        throw er
    -      if (!this.silent)
    -        console.error('glob error', er)
    -      break
    -  }
    -}
    -
    -GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) {
    -
    -  var entries = this._readdir(abs, inGlobStar)
    -
    -  // no entries means not a dir, so it can never have matches
    -  // foo.txt/** doesn't match foo.txt
    -  if (!entries)
    -    return
    -
    -  // test without the globstar, and with every child both below
    -  // and replacing the globstar.
    -  var remainWithoutGlobStar = remain.slice(1)
    -  var gspref = prefix ? [ prefix ] : []
    -  var noGlobStar = gspref.concat(remainWithoutGlobStar)
    -
    -  // the noGlobStar pattern exits the inGlobStar state
    -  this._process(noGlobStar, index, false)
    -
    -  var len = entries.length
    -  var isSym = this.symlinks[abs]
    -
    -  // If it's a symlink, and we're in a globstar, then stop
    -  if (isSym && inGlobStar)
    -    return
    -
    -  for (var i = 0; i < len; i++) {
    -    var e = entries[i]
    -    if (e.charAt(0) === '.' && !this.dot)
    -      continue
    -
    -    // these two cases enter the inGlobStar state
    -    var instead = gspref.concat(entries[i], remainWithoutGlobStar)
    -    this._process(instead, index, true)
    -
    -    var below = gspref.concat(entries[i], remain)
    -    this._process(below, index, true)
    -  }
    -}
    -
    -GlobSync.prototype._processSimple = function (prefix, index) {
    -  // XXX review this.  Shouldn't it be doing the mounting etc
    -  // before doing stat?  kinda weird?
    -  var exists = this._stat(prefix)
    -
    -  if (!this.matches[index])
    -    this.matches[index] = Object.create(null)
    -
    -  // If it doesn't exist, then just mark the lack of results
    -  if (!exists)
    -    return
    -
    -  if (prefix && isAbsolute(prefix) && !this.nomount) {
    -    var trail = /[\/\\]$/.test(prefix)
    -    if (prefix.charAt(0) === '/') {
    -      prefix = path.join(this.root, prefix)
    -    } else {
    -      prefix = path.resolve(this.root, prefix)
    -      if (trail)
    -        prefix += '/'
    -    }
    -  }
    -
    -  if (process.platform === 'win32')
    -    prefix = prefix.replace(/\\/g, '/')
    -
    -  // Mark this as a match
    -  this._emitMatch(index, prefix)
    -}
    -
    -// Returns either 'DIR', 'FILE', or false
    -GlobSync.prototype._stat = function (f) {
    -  var abs = this._makeAbs(f)
    -  var needDir = f.slice(-1) === '/'
    -
    -  if (f.length > this.maxLength)
    -    return false
    -
    -  if (!this.stat && ownProp(this.cache, abs)) {
    -    var c = this.cache[abs]
    -
    -    if (Array.isArray(c))
    -      c = 'DIR'
    -
    -    // It exists, but maybe not how we need it
    -    if (!needDir || c === 'DIR')
    -      return c
    -
    -    if (needDir && c === 'FILE')
    -      return false
    -
    -    // otherwise we have to stat, because maybe c=true
    -    // if we know it exists, but not what it is.
    -  }
    -
    -  var exists
    -  var stat = this.statCache[abs]
    -  if (!stat) {
    -    var lstat
    -    try {
    -      lstat = this.fs.lstatSync(abs)
    -    } catch (er) {
    -      if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
    -        this.statCache[abs] = false
    -        return false
    -      }
    -    }
    -
    -    if (lstat && lstat.isSymbolicLink()) {
    -      try {
    -        stat = this.fs.statSync(abs)
    -      } catch (er) {
    -        stat = lstat
    -      }
    -    } else {
    -      stat = lstat
    -    }
    -  }
    -
    -  this.statCache[abs] = stat
    -
    -  var c = true
    -  if (stat)
    -    c = stat.isDirectory() ? 'DIR' : 'FILE'
    -
    -  this.cache[abs] = this.cache[abs] || c
    -
    -  if (needDir && c === 'FILE')
    -    return false
    -
    -  return c
    -}
    -
    -GlobSync.prototype._mark = function (p) {
    -  return common.mark(this, p)
    -}
    -
    -GlobSync.prototype._makeAbs = function (f) {
    -  return common.makeAbs(this, f)
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/lru-cache/LICENSE
    deleted file mode 100644
    index f785757cd63f86..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/LICENSE
    +++ /dev/null
    @@ -1,15 +0,0 @@
    -The ISC License
    -
    -Copyright (c) 2010-2023 Isaac Z. Schlueter and Contributors
    -
    -Permission to use, copy, modify, and/or distribute this software for any
    -purpose with or without fee is hereby granted, provided that the above
    -copyright notice and this permission notice appear in all copies.
    -
    -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
    -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/index.js b/deps/npm/node_modules/node-gyp/node_modules/lru-cache/index.js
    deleted file mode 100644
    index 48e99fe5e5a70c..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/index.js
    +++ /dev/null
    @@ -1,1227 +0,0 @@
    -const perf =
    -  typeof performance === 'object' &&
    -  performance &&
    -  typeof performance.now === 'function'
    -    ? performance
    -    : Date
    -
    -const hasAbortController = typeof AbortController === 'function'
    -
    -// minimal backwards-compatibility polyfill
    -// this doesn't have nearly all the checks and whatnot that
    -// actual AbortController/Signal has, but it's enough for
    -// our purposes, and if used properly, behaves the same.
    -const AC = hasAbortController
    -  ? AbortController
    -  : class AbortController {
    -      constructor() {
    -        this.signal = new AS()
    -      }
    -      abort(reason = new Error('This operation was aborted')) {
    -        this.signal.reason = this.signal.reason || reason
    -        this.signal.aborted = true
    -        this.signal.dispatchEvent({
    -          type: 'abort',
    -          target: this.signal,
    -        })
    -      }
    -    }
    -
    -const hasAbortSignal = typeof AbortSignal === 'function'
    -// Some polyfills put this on the AC class, not global
    -const hasACAbortSignal = typeof AC.AbortSignal === 'function'
    -const AS = hasAbortSignal
    -  ? AbortSignal
    -  : hasACAbortSignal
    -  ? AC.AbortController
    -  : class AbortSignal {
    -      constructor() {
    -        this.reason = undefined
    -        this.aborted = false
    -        this._listeners = []
    -      }
    -      dispatchEvent(e) {
    -        if (e.type === 'abort') {
    -          this.aborted = true
    -          this.onabort(e)
    -          this._listeners.forEach(f => f(e), this)
    -        }
    -      }
    -      onabort() {}
    -      addEventListener(ev, fn) {
    -        if (ev === 'abort') {
    -          this._listeners.push(fn)
    -        }
    -      }
    -      removeEventListener(ev, fn) {
    -        if (ev === 'abort') {
    -          this._listeners = this._listeners.filter(f => f !== fn)
    -        }
    -      }
    -    }
    -
    -const warned = new Set()
    -const deprecatedOption = (opt, instead) => {
    -  const code = `LRU_CACHE_OPTION_${opt}`
    -  if (shouldWarn(code)) {
    -    warn(code, `${opt} option`, `options.${instead}`, LRUCache)
    -  }
    -}
    -const deprecatedMethod = (method, instead) => {
    -  const code = `LRU_CACHE_METHOD_${method}`
    -  if (shouldWarn(code)) {
    -    const { prototype } = LRUCache
    -    const { get } = Object.getOwnPropertyDescriptor(prototype, method)
    -    warn(code, `${method} method`, `cache.${instead}()`, get)
    -  }
    -}
    -const deprecatedProperty = (field, instead) => {
    -  const code = `LRU_CACHE_PROPERTY_${field}`
    -  if (shouldWarn(code)) {
    -    const { prototype } = LRUCache
    -    const { get } = Object.getOwnPropertyDescriptor(prototype, field)
    -    warn(code, `${field} property`, `cache.${instead}`, get)
    -  }
    -}
    -
    -const emitWarning = (...a) => {
    -  typeof process === 'object' &&
    -  process &&
    -  typeof process.emitWarning === 'function'
    -    ? process.emitWarning(...a)
    -    : console.error(...a)
    -}
    -
    -const shouldWarn = code => !warned.has(code)
    -
    -const warn = (code, what, instead, fn) => {
    -  warned.add(code)
    -  const msg = `The ${what} is deprecated. Please use ${instead} instead.`
    -  emitWarning(msg, 'DeprecationWarning', code, fn)
    -}
    -
    -const isPosInt = n => n && n === Math.floor(n) && n > 0 && isFinite(n)
    -
    -/* istanbul ignore next - This is a little bit ridiculous, tbh.
    - * The maximum array length is 2^32-1 or thereabouts on most JS impls.
    - * And well before that point, you're caching the entire world, I mean,
    - * that's ~32GB of just integers for the next/prev links, plus whatever
    - * else to hold that many keys and values.  Just filling the memory with
    - * zeroes at init time is brutal when you get that big.
    - * But why not be complete?
    - * Maybe in the future, these limits will have expanded. */
    -const getUintArray = max =>
    -  !isPosInt(max)
    -    ? null
    -    : max <= Math.pow(2, 8)
    -    ? Uint8Array
    -    : max <= Math.pow(2, 16)
    -    ? Uint16Array
    -    : max <= Math.pow(2, 32)
    -    ? Uint32Array
    -    : max <= Number.MAX_SAFE_INTEGER
    -    ? ZeroArray
    -    : null
    -
    -class ZeroArray extends Array {
    -  constructor(size) {
    -    super(size)
    -    this.fill(0)
    -  }
    -}
    -
    -class Stack {
    -  constructor(max) {
    -    if (max === 0) {
    -      return []
    -    }
    -    const UintArray = getUintArray(max)
    -    this.heap = new UintArray(max)
    -    this.length = 0
    -  }
    -  push(n) {
    -    this.heap[this.length++] = n
    -  }
    -  pop() {
    -    return this.heap[--this.length]
    -  }
    -}
    -
    -class LRUCache {
    -  constructor(options = {}) {
    -    const {
    -      max = 0,
    -      ttl,
    -      ttlResolution = 1,
    -      ttlAutopurge,
    -      updateAgeOnGet,
    -      updateAgeOnHas,
    -      allowStale,
    -      dispose,
    -      disposeAfter,
    -      noDisposeOnSet,
    -      noUpdateTTL,
    -      maxSize = 0,
    -      maxEntrySize = 0,
    -      sizeCalculation,
    -      fetchMethod,
    -      fetchContext,
    -      noDeleteOnFetchRejection,
    -      noDeleteOnStaleGet,
    -      allowStaleOnFetchRejection,
    -      allowStaleOnFetchAbort,
    -      ignoreFetchAbort,
    -    } = options
    -
    -    // deprecated options, don't trigger a warning for getting them if
    -    // the thing being passed in is another LRUCache we're copying.
    -    const { length, maxAge, stale } =
    -      options instanceof LRUCache ? {} : options
    -
    -    if (max !== 0 && !isPosInt(max)) {
    -      throw new TypeError('max option must be a nonnegative integer')
    -    }
    -
    -    const UintArray = max ? getUintArray(max) : Array
    -    if (!UintArray) {
    -      throw new Error('invalid max value: ' + max)
    -    }
    -
    -    this.max = max
    -    this.maxSize = maxSize
    -    this.maxEntrySize = maxEntrySize || this.maxSize
    -    this.sizeCalculation = sizeCalculation || length
    -    if (this.sizeCalculation) {
    -      if (!this.maxSize && !this.maxEntrySize) {
    -        throw new TypeError(
    -          'cannot set sizeCalculation without setting maxSize or maxEntrySize'
    -        )
    -      }
    -      if (typeof this.sizeCalculation !== 'function') {
    -        throw new TypeError('sizeCalculation set to non-function')
    -      }
    -    }
    -
    -    this.fetchMethod = fetchMethod || null
    -    if (this.fetchMethod && typeof this.fetchMethod !== 'function') {
    -      throw new TypeError(
    -        'fetchMethod must be a function if specified'
    -      )
    -    }
    -
    -    this.fetchContext = fetchContext
    -    if (!this.fetchMethod && fetchContext !== undefined) {
    -      throw new TypeError(
    -        'cannot set fetchContext without fetchMethod'
    -      )
    -    }
    -
    -    this.keyMap = new Map()
    -    this.keyList = new Array(max).fill(null)
    -    this.valList = new Array(max).fill(null)
    -    this.next = new UintArray(max)
    -    this.prev = new UintArray(max)
    -    this.head = 0
    -    this.tail = 0
    -    this.free = new Stack(max)
    -    this.initialFill = 1
    -    this.size = 0
    -
    -    if (typeof dispose === 'function') {
    -      this.dispose = dispose
    -    }
    -    if (typeof disposeAfter === 'function') {
    -      this.disposeAfter = disposeAfter
    -      this.disposed = []
    -    } else {
    -      this.disposeAfter = null
    -      this.disposed = null
    -    }
    -    this.noDisposeOnSet = !!noDisposeOnSet
    -    this.noUpdateTTL = !!noUpdateTTL
    -    this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection
    -    this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection
    -    this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort
    -    this.ignoreFetchAbort = !!ignoreFetchAbort
    -
    -    // NB: maxEntrySize is set to maxSize if it's set
    -    if (this.maxEntrySize !== 0) {
    -      if (this.maxSize !== 0) {
    -        if (!isPosInt(this.maxSize)) {
    -          throw new TypeError(
    -            'maxSize must be a positive integer if specified'
    -          )
    -        }
    -      }
    -      if (!isPosInt(this.maxEntrySize)) {
    -        throw new TypeError(
    -          'maxEntrySize must be a positive integer if specified'
    -        )
    -      }
    -      this.initializeSizeTracking()
    -    }
    -
    -    this.allowStale = !!allowStale || !!stale
    -    this.noDeleteOnStaleGet = !!noDeleteOnStaleGet
    -    this.updateAgeOnGet = !!updateAgeOnGet
    -    this.updateAgeOnHas = !!updateAgeOnHas
    -    this.ttlResolution =
    -      isPosInt(ttlResolution) || ttlResolution === 0
    -        ? ttlResolution
    -        : 1
    -    this.ttlAutopurge = !!ttlAutopurge
    -    this.ttl = ttl || maxAge || 0
    -    if (this.ttl) {
    -      if (!isPosInt(this.ttl)) {
    -        throw new TypeError(
    -          'ttl must be a positive integer if specified'
    -        )
    -      }
    -      this.initializeTTLTracking()
    -    }
    -
    -    // do not allow completely unbounded caches
    -    if (this.max === 0 && this.ttl === 0 && this.maxSize === 0) {
    -      throw new TypeError(
    -        'At least one of max, maxSize, or ttl is required'
    -      )
    -    }
    -    if (!this.ttlAutopurge && !this.max && !this.maxSize) {
    -      const code = 'LRU_CACHE_UNBOUNDED'
    -      if (shouldWarn(code)) {
    -        warned.add(code)
    -        const msg =
    -          'TTL caching without ttlAutopurge, max, or maxSize can ' +
    -          'result in unbounded memory consumption.'
    -        emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache)
    -      }
    -    }
    -
    -    if (stale) {
    -      deprecatedOption('stale', 'allowStale')
    -    }
    -    if (maxAge) {
    -      deprecatedOption('maxAge', 'ttl')
    -    }
    -    if (length) {
    -      deprecatedOption('length', 'sizeCalculation')
    -    }
    -  }
    -
    -  getRemainingTTL(key) {
    -    return this.has(key, { updateAgeOnHas: false }) ? Infinity : 0
    -  }
    -
    -  initializeTTLTracking() {
    -    this.ttls = new ZeroArray(this.max)
    -    this.starts = new ZeroArray(this.max)
    -
    -    this.setItemTTL = (index, ttl, start = perf.now()) => {
    -      this.starts[index] = ttl !== 0 ? start : 0
    -      this.ttls[index] = ttl
    -      if (ttl !== 0 && this.ttlAutopurge) {
    -        const t = setTimeout(() => {
    -          if (this.isStale(index)) {
    -            this.delete(this.keyList[index])
    -          }
    -        }, ttl + 1)
    -        /* istanbul ignore else - unref() not supported on all platforms */
    -        if (t.unref) {
    -          t.unref()
    -        }
    -      }
    -    }
    -
    -    this.updateItemAge = index => {
    -      this.starts[index] = this.ttls[index] !== 0 ? perf.now() : 0
    -    }
    -
    -    this.statusTTL = (status, index) => {
    -      if (status) {
    -        status.ttl = this.ttls[index]
    -        status.start = this.starts[index]
    -        status.now = cachedNow || getNow()
    -        status.remainingTTL = status.now + status.ttl - status.start
    -      }
    -    }
    -
    -    // debounce calls to perf.now() to 1s so we're not hitting
    -    // that costly call repeatedly.
    -    let cachedNow = 0
    -    const getNow = () => {
    -      const n = perf.now()
    -      if (this.ttlResolution > 0) {
    -        cachedNow = n
    -        const t = setTimeout(
    -          () => (cachedNow = 0),
    -          this.ttlResolution
    -        )
    -        /* istanbul ignore else - not available on all platforms */
    -        if (t.unref) {
    -          t.unref()
    -        }
    -      }
    -      return n
    -    }
    -
    -    this.getRemainingTTL = key => {
    -      const index = this.keyMap.get(key)
    -      if (index === undefined) {
    -        return 0
    -      }
    -      return this.ttls[index] === 0 || this.starts[index] === 0
    -        ? Infinity
    -        : this.starts[index] +
    -            this.ttls[index] -
    -            (cachedNow || getNow())
    -    }
    -
    -    this.isStale = index => {
    -      return (
    -        this.ttls[index] !== 0 &&
    -        this.starts[index] !== 0 &&
    -        (cachedNow || getNow()) - this.starts[index] >
    -          this.ttls[index]
    -      )
    -    }
    -  }
    -  updateItemAge(_index) {}
    -  statusTTL(_status, _index) {}
    -  setItemTTL(_index, _ttl, _start) {}
    -  isStale(_index) {
    -    return false
    -  }
    -
    -  initializeSizeTracking() {
    -    this.calculatedSize = 0
    -    this.sizes = new ZeroArray(this.max)
    -    this.removeItemSize = index => {
    -      this.calculatedSize -= this.sizes[index]
    -      this.sizes[index] = 0
    -    }
    -    this.requireSize = (k, v, size, sizeCalculation) => {
    -      // provisionally accept background fetches.
    -      // actual value size will be checked when they return.
    -      if (this.isBackgroundFetch(v)) {
    -        return 0
    -      }
    -      if (!isPosInt(size)) {
    -        if (sizeCalculation) {
    -          if (typeof sizeCalculation !== 'function') {
    -            throw new TypeError('sizeCalculation must be a function')
    -          }
    -          size = sizeCalculation(v, k)
    -          if (!isPosInt(size)) {
    -            throw new TypeError(
    -              'sizeCalculation return invalid (expect positive integer)'
    -            )
    -          }
    -        } else {
    -          throw new TypeError(
    -            'invalid size value (must be positive integer). ' +
    -              'When maxSize or maxEntrySize is used, sizeCalculation or size ' +
    -              'must be set.'
    -          )
    -        }
    -      }
    -      return size
    -    }
    -    this.addItemSize = (index, size, status) => {
    -      this.sizes[index] = size
    -      if (this.maxSize) {
    -        const maxSize = this.maxSize - this.sizes[index]
    -        while (this.calculatedSize > maxSize) {
    -          this.evict(true)
    -        }
    -      }
    -      this.calculatedSize += this.sizes[index]
    -      if (status) {
    -        status.entrySize = size
    -        status.totalCalculatedSize = this.calculatedSize
    -      }
    -    }
    -  }
    -  removeItemSize(_index) {}
    -  addItemSize(_index, _size) {}
    -  requireSize(_k, _v, size, sizeCalculation) {
    -    if (size || sizeCalculation) {
    -      throw new TypeError(
    -        'cannot set size without setting maxSize or maxEntrySize on cache'
    -      )
    -    }
    -  }
    -
    -  *indexes({ allowStale = this.allowStale } = {}) {
    -    if (this.size) {
    -      for (let i = this.tail; true; ) {
    -        if (!this.isValidIndex(i)) {
    -          break
    -        }
    -        if (allowStale || !this.isStale(i)) {
    -          yield i
    -        }
    -        if (i === this.head) {
    -          break
    -        } else {
    -          i = this.prev[i]
    -        }
    -      }
    -    }
    -  }
    -
    -  *rindexes({ allowStale = this.allowStale } = {}) {
    -    if (this.size) {
    -      for (let i = this.head; true; ) {
    -        if (!this.isValidIndex(i)) {
    -          break
    -        }
    -        if (allowStale || !this.isStale(i)) {
    -          yield i
    -        }
    -        if (i === this.tail) {
    -          break
    -        } else {
    -          i = this.next[i]
    -        }
    -      }
    -    }
    -  }
    -
    -  isValidIndex(index) {
    -    return (
    -      index !== undefined &&
    -      this.keyMap.get(this.keyList[index]) === index
    -    )
    -  }
    -
    -  *entries() {
    -    for (const i of this.indexes()) {
    -      if (
    -        this.valList[i] !== undefined &&
    -        this.keyList[i] !== undefined &&
    -        !this.isBackgroundFetch(this.valList[i])
    -      ) {
    -        yield [this.keyList[i], this.valList[i]]
    -      }
    -    }
    -  }
    -  *rentries() {
    -    for (const i of this.rindexes()) {
    -      if (
    -        this.valList[i] !== undefined &&
    -        this.keyList[i] !== undefined &&
    -        !this.isBackgroundFetch(this.valList[i])
    -      ) {
    -        yield [this.keyList[i], this.valList[i]]
    -      }
    -    }
    -  }
    -
    -  *keys() {
    -    for (const i of this.indexes()) {
    -      if (
    -        this.keyList[i] !== undefined &&
    -        !this.isBackgroundFetch(this.valList[i])
    -      ) {
    -        yield this.keyList[i]
    -      }
    -    }
    -  }
    -  *rkeys() {
    -    for (const i of this.rindexes()) {
    -      if (
    -        this.keyList[i] !== undefined &&
    -        !this.isBackgroundFetch(this.valList[i])
    -      ) {
    -        yield this.keyList[i]
    -      }
    -    }
    -  }
    -
    -  *values() {
    -    for (const i of this.indexes()) {
    -      if (
    -        this.valList[i] !== undefined &&
    -        !this.isBackgroundFetch(this.valList[i])
    -      ) {
    -        yield this.valList[i]
    -      }
    -    }
    -  }
    -  *rvalues() {
    -    for (const i of this.rindexes()) {
    -      if (
    -        this.valList[i] !== undefined &&
    -        !this.isBackgroundFetch(this.valList[i])
    -      ) {
    -        yield this.valList[i]
    -      }
    -    }
    -  }
    -
    -  [Symbol.iterator]() {
    -    return this.entries()
    -  }
    -
    -  find(fn, getOptions) {
    -    for (const i of this.indexes()) {
    -      const v = this.valList[i]
    -      const value = this.isBackgroundFetch(v)
    -        ? v.__staleWhileFetching
    -        : v
    -      if (value === undefined) continue
    -      if (fn(value, this.keyList[i], this)) {
    -        return this.get(this.keyList[i], getOptions)
    -      }
    -    }
    -  }
    -
    -  forEach(fn, thisp = this) {
    -    for (const i of this.indexes()) {
    -      const v = this.valList[i]
    -      const value = this.isBackgroundFetch(v)
    -        ? v.__staleWhileFetching
    -        : v
    -      if (value === undefined) continue
    -      fn.call(thisp, value, this.keyList[i], this)
    -    }
    -  }
    -
    -  rforEach(fn, thisp = this) {
    -    for (const i of this.rindexes()) {
    -      const v = this.valList[i]
    -      const value = this.isBackgroundFetch(v)
    -        ? v.__staleWhileFetching
    -        : v
    -      if (value === undefined) continue
    -      fn.call(thisp, value, this.keyList[i], this)
    -    }
    -  }
    -
    -  get prune() {
    -    deprecatedMethod('prune', 'purgeStale')
    -    return this.purgeStale
    -  }
    -
    -  purgeStale() {
    -    let deleted = false
    -    for (const i of this.rindexes({ allowStale: true })) {
    -      if (this.isStale(i)) {
    -        this.delete(this.keyList[i])
    -        deleted = true
    -      }
    -    }
    -    return deleted
    -  }
    -
    -  dump() {
    -    const arr = []
    -    for (const i of this.indexes({ allowStale: true })) {
    -      const key = this.keyList[i]
    -      const v = this.valList[i]
    -      const value = this.isBackgroundFetch(v)
    -        ? v.__staleWhileFetching
    -        : v
    -      if (value === undefined) continue
    -      const entry = { value }
    -      if (this.ttls) {
    -        entry.ttl = this.ttls[i]
    -        // always dump the start relative to a portable timestamp
    -        // it's ok for this to be a bit slow, it's a rare operation.
    -        const age = perf.now() - this.starts[i]
    -        entry.start = Math.floor(Date.now() - age)
    -      }
    -      if (this.sizes) {
    -        entry.size = this.sizes[i]
    -      }
    -      arr.unshift([key, entry])
    -    }
    -    return arr
    -  }
    -
    -  load(arr) {
    -    this.clear()
    -    for (const [key, entry] of arr) {
    -      if (entry.start) {
    -        // entry.start is a portable timestamp, but we may be using
    -        // node's performance.now(), so calculate the offset.
    -        // it's ok for this to be a bit slow, it's a rare operation.
    -        const age = Date.now() - entry.start
    -        entry.start = perf.now() - age
    -      }
    -      this.set(key, entry.value, entry)
    -    }
    -  }
    -
    -  dispose(_v, _k, _reason) {}
    -
    -  set(
    -    k,
    -    v,
    -    {
    -      ttl = this.ttl,
    -      start,
    -      noDisposeOnSet = this.noDisposeOnSet,
    -      size = 0,
    -      sizeCalculation = this.sizeCalculation,
    -      noUpdateTTL = this.noUpdateTTL,
    -      status,
    -    } = {}
    -  ) {
    -    size = this.requireSize(k, v, size, sizeCalculation)
    -    // if the item doesn't fit, don't do anything
    -    // NB: maxEntrySize set to maxSize by default
    -    if (this.maxEntrySize && size > this.maxEntrySize) {
    -      if (status) {
    -        status.set = 'miss'
    -        status.maxEntrySizeExceeded = true
    -      }
    -      // have to delete, in case a background fetch is there already.
    -      // in non-async cases, this is a no-op
    -      this.delete(k)
    -      return this
    -    }
    -    let index = this.size === 0 ? undefined : this.keyMap.get(k)
    -    if (index === undefined) {
    -      // addition
    -      index = this.newIndex()
    -      this.keyList[index] = k
    -      this.valList[index] = v
    -      this.keyMap.set(k, index)
    -      this.next[this.tail] = index
    -      this.prev[index] = this.tail
    -      this.tail = index
    -      this.size++
    -      this.addItemSize(index, size, status)
    -      if (status) {
    -        status.set = 'add'
    -      }
    -      noUpdateTTL = false
    -    } else {
    -      // update
    -      this.moveToTail(index)
    -      const oldVal = this.valList[index]
    -      if (v !== oldVal) {
    -        if (this.isBackgroundFetch(oldVal)) {
    -          oldVal.__abortController.abort(new Error('replaced'))
    -        } else {
    -          if (!noDisposeOnSet) {
    -            this.dispose(oldVal, k, 'set')
    -            if (this.disposeAfter) {
    -              this.disposed.push([oldVal, k, 'set'])
    -            }
    -          }
    -        }
    -        this.removeItemSize(index)
    -        this.valList[index] = v
    -        this.addItemSize(index, size, status)
    -        if (status) {
    -          status.set = 'replace'
    -          const oldValue =
    -            oldVal && this.isBackgroundFetch(oldVal)
    -              ? oldVal.__staleWhileFetching
    -              : oldVal
    -          if (oldValue !== undefined) status.oldValue = oldValue
    -        }
    -      } else if (status) {
    -        status.set = 'update'
    -      }
    -    }
    -    if (ttl !== 0 && this.ttl === 0 && !this.ttls) {
    -      this.initializeTTLTracking()
    -    }
    -    if (!noUpdateTTL) {
    -      this.setItemTTL(index, ttl, start)
    -    }
    -    this.statusTTL(status, index)
    -    if (this.disposeAfter) {
    -      while (this.disposed.length) {
    -        this.disposeAfter(...this.disposed.shift())
    -      }
    -    }
    -    return this
    -  }
    -
    -  newIndex() {
    -    if (this.size === 0) {
    -      return this.tail
    -    }
    -    if (this.size === this.max && this.max !== 0) {
    -      return this.evict(false)
    -    }
    -    if (this.free.length !== 0) {
    -      return this.free.pop()
    -    }
    -    // initial fill, just keep writing down the list
    -    return this.initialFill++
    -  }
    -
    -  pop() {
    -    if (this.size) {
    -      const val = this.valList[this.head]
    -      this.evict(true)
    -      return val
    -    }
    -  }
    -
    -  evict(free) {
    -    const head = this.head
    -    const k = this.keyList[head]
    -    const v = this.valList[head]
    -    if (this.isBackgroundFetch(v)) {
    -      v.__abortController.abort(new Error('evicted'))
    -    } else {
    -      this.dispose(v, k, 'evict')
    -      if (this.disposeAfter) {
    -        this.disposed.push([v, k, 'evict'])
    -      }
    -    }
    -    this.removeItemSize(head)
    -    // if we aren't about to use the index, then null these out
    -    if (free) {
    -      this.keyList[head] = null
    -      this.valList[head] = null
    -      this.free.push(head)
    -    }
    -    this.head = this.next[head]
    -    this.keyMap.delete(k)
    -    this.size--
    -    return head
    -  }
    -
    -  has(k, { updateAgeOnHas = this.updateAgeOnHas, status } = {}) {
    -    const index = this.keyMap.get(k)
    -    if (index !== undefined) {
    -      if (!this.isStale(index)) {
    -        if (updateAgeOnHas) {
    -          this.updateItemAge(index)
    -        }
    -        if (status) status.has = 'hit'
    -        this.statusTTL(status, index)
    -        return true
    -      } else if (status) {
    -        status.has = 'stale'
    -        this.statusTTL(status, index)
    -      }
    -    } else if (status) {
    -      status.has = 'miss'
    -    }
    -    return false
    -  }
    -
    -  // like get(), but without any LRU updating or TTL expiration
    -  peek(k, { allowStale = this.allowStale } = {}) {
    -    const index = this.keyMap.get(k)
    -    if (index !== undefined && (allowStale || !this.isStale(index))) {
    -      const v = this.valList[index]
    -      // either stale and allowed, or forcing a refresh of non-stale value
    -      return this.isBackgroundFetch(v) ? v.__staleWhileFetching : v
    -    }
    -  }
    -
    -  backgroundFetch(k, index, options, context) {
    -    const v = index === undefined ? undefined : this.valList[index]
    -    if (this.isBackgroundFetch(v)) {
    -      return v
    -    }
    -    const ac = new AC()
    -    if (options.signal) {
    -      options.signal.addEventListener('abort', () =>
    -        ac.abort(options.signal.reason)
    -      )
    -    }
    -    const fetchOpts = {
    -      signal: ac.signal,
    -      options,
    -      context,
    -    }
    -    const cb = (v, updateCache = false) => {
    -      const { aborted } = ac.signal
    -      const ignoreAbort = options.ignoreFetchAbort && v !== undefined
    -      if (options.status) {
    -        if (aborted && !updateCache) {
    -          options.status.fetchAborted = true
    -          options.status.fetchError = ac.signal.reason
    -          if (ignoreAbort) options.status.fetchAbortIgnored = true
    -        } else {
    -          options.status.fetchResolved = true
    -        }
    -      }
    -      if (aborted && !ignoreAbort && !updateCache) {
    -        return fetchFail(ac.signal.reason)
    -      }
    -      // either we didn't abort, and are still here, or we did, and ignored
    -      if (this.valList[index] === p) {
    -        if (v === undefined) {
    -          if (p.__staleWhileFetching) {
    -            this.valList[index] = p.__staleWhileFetching
    -          } else {
    -            this.delete(k)
    -          }
    -        } else {
    -          if (options.status) options.status.fetchUpdated = true
    -          this.set(k, v, fetchOpts.options)
    -        }
    -      }
    -      return v
    -    }
    -    const eb = er => {
    -      if (options.status) {
    -        options.status.fetchRejected = true
    -        options.status.fetchError = er
    -      }
    -      return fetchFail(er)
    -    }
    -    const fetchFail = er => {
    -      const { aborted } = ac.signal
    -      const allowStaleAborted =
    -        aborted && options.allowStaleOnFetchAbort
    -      const allowStale =
    -        allowStaleAborted || options.allowStaleOnFetchRejection
    -      const noDelete = allowStale || options.noDeleteOnFetchRejection
    -      if (this.valList[index] === p) {
    -        // if we allow stale on fetch rejections, then we need to ensure that
    -        // the stale value is not removed from the cache when the fetch fails.
    -        const del = !noDelete || p.__staleWhileFetching === undefined
    -        if (del) {
    -          this.delete(k)
    -        } else if (!allowStaleAborted) {
    -          // still replace the *promise* with the stale value,
    -          // since we are done with the promise at this point.
    -          // leave it untouched if we're still waiting for an
    -          // aborted background fetch that hasn't yet returned.
    -          this.valList[index] = p.__staleWhileFetching
    -        }
    -      }
    -      if (allowStale) {
    -        if (options.status && p.__staleWhileFetching !== undefined) {
    -          options.status.returnedStale = true
    -        }
    -        return p.__staleWhileFetching
    -      } else if (p.__returned === p) {
    -        throw er
    -      }
    -    }
    -    const pcall = (res, rej) => {
    -      this.fetchMethod(k, v, fetchOpts).then(v => res(v), rej)
    -      // ignored, we go until we finish, regardless.
    -      // defer check until we are actually aborting,
    -      // so fetchMethod can override.
    -      ac.signal.addEventListener('abort', () => {
    -        if (
    -          !options.ignoreFetchAbort ||
    -          options.allowStaleOnFetchAbort
    -        ) {
    -          res()
    -          // when it eventually resolves, update the cache.
    -          if (options.allowStaleOnFetchAbort) {
    -            res = v => cb(v, true)
    -          }
    -        }
    -      })
    -    }
    -    if (options.status) options.status.fetchDispatched = true
    -    const p = new Promise(pcall).then(cb, eb)
    -    p.__abortController = ac
    -    p.__staleWhileFetching = v
    -    p.__returned = null
    -    if (index === undefined) {
    -      // internal, don't expose status.
    -      this.set(k, p, { ...fetchOpts.options, status: undefined })
    -      index = this.keyMap.get(k)
    -    } else {
    -      this.valList[index] = p
    -    }
    -    return p
    -  }
    -
    -  isBackgroundFetch(p) {
    -    return (
    -      p &&
    -      typeof p === 'object' &&
    -      typeof p.then === 'function' &&
    -      Object.prototype.hasOwnProperty.call(
    -        p,
    -        '__staleWhileFetching'
    -      ) &&
    -      Object.prototype.hasOwnProperty.call(p, '__returned') &&
    -      (p.__returned === p || p.__returned === null)
    -    )
    -  }
    -
    -  // this takes the union of get() and set() opts, because it does both
    -  async fetch(
    -    k,
    -    {
    -      // get options
    -      allowStale = this.allowStale,
    -      updateAgeOnGet = this.updateAgeOnGet,
    -      noDeleteOnStaleGet = this.noDeleteOnStaleGet,
    -      // set options
    -      ttl = this.ttl,
    -      noDisposeOnSet = this.noDisposeOnSet,
    -      size = 0,
    -      sizeCalculation = this.sizeCalculation,
    -      noUpdateTTL = this.noUpdateTTL,
    -      // fetch exclusive options
    -      noDeleteOnFetchRejection = this.noDeleteOnFetchRejection,
    -      allowStaleOnFetchRejection = this.allowStaleOnFetchRejection,
    -      ignoreFetchAbort = this.ignoreFetchAbort,
    -      allowStaleOnFetchAbort = this.allowStaleOnFetchAbort,
    -      fetchContext = this.fetchContext,
    -      forceRefresh = false,
    -      status,
    -      signal,
    -    } = {}
    -  ) {
    -    if (!this.fetchMethod) {
    -      if (status) status.fetch = 'get'
    -      return this.get(k, {
    -        allowStale,
    -        updateAgeOnGet,
    -        noDeleteOnStaleGet,
    -        status,
    -      })
    -    }
    -
    -    const options = {
    -      allowStale,
    -      updateAgeOnGet,
    -      noDeleteOnStaleGet,
    -      ttl,
    -      noDisposeOnSet,
    -      size,
    -      sizeCalculation,
    -      noUpdateTTL,
    -      noDeleteOnFetchRejection,
    -      allowStaleOnFetchRejection,
    -      allowStaleOnFetchAbort,
    -      ignoreFetchAbort,
    -      status,
    -      signal,
    -    }
    -
    -    let index = this.keyMap.get(k)
    -    if (index === undefined) {
    -      if (status) status.fetch = 'miss'
    -      const p = this.backgroundFetch(k, index, options, fetchContext)
    -      return (p.__returned = p)
    -    } else {
    -      // in cache, maybe already fetching
    -      const v = this.valList[index]
    -      if (this.isBackgroundFetch(v)) {
    -        const stale =
    -          allowStale && v.__staleWhileFetching !== undefined
    -        if (status) {
    -          status.fetch = 'inflight'
    -          if (stale) status.returnedStale = true
    -        }
    -        return stale ? v.__staleWhileFetching : (v.__returned = v)
    -      }
    -
    -      // if we force a refresh, that means do NOT serve the cached value,
    -      // unless we are already in the process of refreshing the cache.
    -      const isStale = this.isStale(index)
    -      if (!forceRefresh && !isStale) {
    -        if (status) status.fetch = 'hit'
    -        this.moveToTail(index)
    -        if (updateAgeOnGet) {
    -          this.updateItemAge(index)
    -        }
    -        this.statusTTL(status, index)
    -        return v
    -      }
    -
    -      // ok, it is stale or a forced refresh, and not already fetching.
    -      // refresh the cache.
    -      const p = this.backgroundFetch(k, index, options, fetchContext)
    -      const hasStale = p.__staleWhileFetching !== undefined
    -      const staleVal = hasStale && allowStale
    -      if (status) {
    -        status.fetch = hasStale && isStale ? 'stale' : 'refresh'
    -        if (staleVal && isStale) status.returnedStale = true
    -      }
    -      return staleVal ? p.__staleWhileFetching : (p.__returned = p)
    -    }
    -  }
    -
    -  get(
    -    k,
    -    {
    -      allowStale = this.allowStale,
    -      updateAgeOnGet = this.updateAgeOnGet,
    -      noDeleteOnStaleGet = this.noDeleteOnStaleGet,
    -      status,
    -    } = {}
    -  ) {
    -    const index = this.keyMap.get(k)
    -    if (index !== undefined) {
    -      const value = this.valList[index]
    -      const fetching = this.isBackgroundFetch(value)
    -      this.statusTTL(status, index)
    -      if (this.isStale(index)) {
    -        if (status) status.get = 'stale'
    -        // delete only if not an in-flight background fetch
    -        if (!fetching) {
    -          if (!noDeleteOnStaleGet) {
    -            this.delete(k)
    -          }
    -          if (status) status.returnedStale = allowStale
    -          return allowStale ? value : undefined
    -        } else {
    -          if (status) {
    -            status.returnedStale =
    -              allowStale && value.__staleWhileFetching !== undefined
    -          }
    -          return allowStale ? value.__staleWhileFetching : undefined
    -        }
    -      } else {
    -        if (status) status.get = 'hit'
    -        // if we're currently fetching it, we don't actually have it yet
    -        // it's not stale, which means this isn't a staleWhileRefetching.
    -        // If it's not stale, and fetching, AND has a __staleWhileFetching
    -        // value, then that means the user fetched with {forceRefresh:true},
    -        // so it's safe to return that value.
    -        if (fetching) {
    -          return value.__staleWhileFetching
    -        }
    -        this.moveToTail(index)
    -        if (updateAgeOnGet) {
    -          this.updateItemAge(index)
    -        }
    -        return value
    -      }
    -    } else if (status) {
    -      status.get = 'miss'
    -    }
    -  }
    -
    -  connect(p, n) {
    -    this.prev[n] = p
    -    this.next[p] = n
    -  }
    -
    -  moveToTail(index) {
    -    // if tail already, nothing to do
    -    // if head, move head to next[index]
    -    // else
    -    //   move next[prev[index]] to next[index] (head has no prev)
    -    //   move prev[next[index]] to prev[index]
    -    // prev[index] = tail
    -    // next[tail] = index
    -    // tail = index
    -    if (index !== this.tail) {
    -      if (index === this.head) {
    -        this.head = this.next[index]
    -      } else {
    -        this.connect(this.prev[index], this.next[index])
    -      }
    -      this.connect(this.tail, index)
    -      this.tail = index
    -    }
    -  }
    -
    -  get del() {
    -    deprecatedMethod('del', 'delete')
    -    return this.delete
    -  }
    -
    -  delete(k) {
    -    let deleted = false
    -    if (this.size !== 0) {
    -      const index = this.keyMap.get(k)
    -      if (index !== undefined) {
    -        deleted = true
    -        if (this.size === 1) {
    -          this.clear()
    -        } else {
    -          this.removeItemSize(index)
    -          const v = this.valList[index]
    -          if (this.isBackgroundFetch(v)) {
    -            v.__abortController.abort(new Error('deleted'))
    -          } else {
    -            this.dispose(v, k, 'delete')
    -            if (this.disposeAfter) {
    -              this.disposed.push([v, k, 'delete'])
    -            }
    -          }
    -          this.keyMap.delete(k)
    -          this.keyList[index] = null
    -          this.valList[index] = null
    -          if (index === this.tail) {
    -            this.tail = this.prev[index]
    -          } else if (index === this.head) {
    -            this.head = this.next[index]
    -          } else {
    -            this.next[this.prev[index]] = this.next[index]
    -            this.prev[this.next[index]] = this.prev[index]
    -          }
    -          this.size--
    -          this.free.push(index)
    -        }
    -      }
    -    }
    -    if (this.disposed) {
    -      while (this.disposed.length) {
    -        this.disposeAfter(...this.disposed.shift())
    -      }
    -    }
    -    return deleted
    -  }
    -
    -  clear() {
    -    for (const index of this.rindexes({ allowStale: true })) {
    -      const v = this.valList[index]
    -      if (this.isBackgroundFetch(v)) {
    -        v.__abortController.abort(new Error('deleted'))
    -      } else {
    -        const k = this.keyList[index]
    -        this.dispose(v, k, 'delete')
    -        if (this.disposeAfter) {
    -          this.disposed.push([v, k, 'delete'])
    -        }
    -      }
    -    }
    -
    -    this.keyMap.clear()
    -    this.valList.fill(null)
    -    this.keyList.fill(null)
    -    if (this.ttls) {
    -      this.ttls.fill(0)
    -      this.starts.fill(0)
    -    }
    -    if (this.sizes) {
    -      this.sizes.fill(0)
    -    }
    -    this.head = 0
    -    this.tail = 0
    -    this.initialFill = 1
    -    this.free.length = 0
    -    this.calculatedSize = 0
    -    this.size = 0
    -    if (this.disposed) {
    -      while (this.disposed.length) {
    -        this.disposeAfter(...this.disposed.shift())
    -      }
    -    }
    -  }
    -
    -  get reset() {
    -    deprecatedMethod('reset', 'clear')
    -    return this.clear
    -  }
    -
    -  get length() {
    -    deprecatedProperty('length', 'size')
    -    return this.size
    -  }
    -
    -  static get AbortController() {
    -    return AC
    -  }
    -  static get AbortSignal() {
    -    return AS
    -  }
    -}
    -
    -module.exports = LRUCache
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/index.mjs b/deps/npm/node_modules/node-gyp/node_modules/lru-cache/index.mjs
    deleted file mode 100644
    index 4a0b4813ec5157..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/index.mjs
    +++ /dev/null
    @@ -1,1227 +0,0 @@
    -const perf =
    -  typeof performance === 'object' &&
    -  performance &&
    -  typeof performance.now === 'function'
    -    ? performance
    -    : Date
    -
    -const hasAbortController = typeof AbortController === 'function'
    -
    -// minimal backwards-compatibility polyfill
    -// this doesn't have nearly all the checks and whatnot that
    -// actual AbortController/Signal has, but it's enough for
    -// our purposes, and if used properly, behaves the same.
    -const AC = hasAbortController
    -  ? AbortController
    -  : class AbortController {
    -      constructor() {
    -        this.signal = new AS()
    -      }
    -      abort(reason = new Error('This operation was aborted')) {
    -        this.signal.reason = this.signal.reason || reason
    -        this.signal.aborted = true
    -        this.signal.dispatchEvent({
    -          type: 'abort',
    -          target: this.signal,
    -        })
    -      }
    -    }
    -
    -const hasAbortSignal = typeof AbortSignal === 'function'
    -// Some polyfills put this on the AC class, not global
    -const hasACAbortSignal = typeof AC.AbortSignal === 'function'
    -const AS = hasAbortSignal
    -  ? AbortSignal
    -  : hasACAbortSignal
    -  ? AC.AbortController
    -  : class AbortSignal {
    -      constructor() {
    -        this.reason = undefined
    -        this.aborted = false
    -        this._listeners = []
    -      }
    -      dispatchEvent(e) {
    -        if (e.type === 'abort') {
    -          this.aborted = true
    -          this.onabort(e)
    -          this._listeners.forEach(f => f(e), this)
    -        }
    -      }
    -      onabort() {}
    -      addEventListener(ev, fn) {
    -        if (ev === 'abort') {
    -          this._listeners.push(fn)
    -        }
    -      }
    -      removeEventListener(ev, fn) {
    -        if (ev === 'abort') {
    -          this._listeners = this._listeners.filter(f => f !== fn)
    -        }
    -      }
    -    }
    -
    -const warned = new Set()
    -const deprecatedOption = (opt, instead) => {
    -  const code = `LRU_CACHE_OPTION_${opt}`
    -  if (shouldWarn(code)) {
    -    warn(code, `${opt} option`, `options.${instead}`, LRUCache)
    -  }
    -}
    -const deprecatedMethod = (method, instead) => {
    -  const code = `LRU_CACHE_METHOD_${method}`
    -  if (shouldWarn(code)) {
    -    const { prototype } = LRUCache
    -    const { get } = Object.getOwnPropertyDescriptor(prototype, method)
    -    warn(code, `${method} method`, `cache.${instead}()`, get)
    -  }
    -}
    -const deprecatedProperty = (field, instead) => {
    -  const code = `LRU_CACHE_PROPERTY_${field}`
    -  if (shouldWarn(code)) {
    -    const { prototype } = LRUCache
    -    const { get } = Object.getOwnPropertyDescriptor(prototype, field)
    -    warn(code, `${field} property`, `cache.${instead}`, get)
    -  }
    -}
    -
    -const emitWarning = (...a) => {
    -  typeof process === 'object' &&
    -  process &&
    -  typeof process.emitWarning === 'function'
    -    ? process.emitWarning(...a)
    -    : console.error(...a)
    -}
    -
    -const shouldWarn = code => !warned.has(code)
    -
    -const warn = (code, what, instead, fn) => {
    -  warned.add(code)
    -  const msg = `The ${what} is deprecated. Please use ${instead} instead.`
    -  emitWarning(msg, 'DeprecationWarning', code, fn)
    -}
    -
    -const isPosInt = n => n && n === Math.floor(n) && n > 0 && isFinite(n)
    -
    -/* istanbul ignore next - This is a little bit ridiculous, tbh.
    - * The maximum array length is 2^32-1 or thereabouts on most JS impls.
    - * And well before that point, you're caching the entire world, I mean,
    - * that's ~32GB of just integers for the next/prev links, plus whatever
    - * else to hold that many keys and values.  Just filling the memory with
    - * zeroes at init time is brutal when you get that big.
    - * But why not be complete?
    - * Maybe in the future, these limits will have expanded. */
    -const getUintArray = max =>
    -  !isPosInt(max)
    -    ? null
    -    : max <= Math.pow(2, 8)
    -    ? Uint8Array
    -    : max <= Math.pow(2, 16)
    -    ? Uint16Array
    -    : max <= Math.pow(2, 32)
    -    ? Uint32Array
    -    : max <= Number.MAX_SAFE_INTEGER
    -    ? ZeroArray
    -    : null
    -
    -class ZeroArray extends Array {
    -  constructor(size) {
    -    super(size)
    -    this.fill(0)
    -  }
    -}
    -
    -class Stack {
    -  constructor(max) {
    -    if (max === 0) {
    -      return []
    -    }
    -    const UintArray = getUintArray(max)
    -    this.heap = new UintArray(max)
    -    this.length = 0
    -  }
    -  push(n) {
    -    this.heap[this.length++] = n
    -  }
    -  pop() {
    -    return this.heap[--this.length]
    -  }
    -}
    -
    -class LRUCache {
    -  constructor(options = {}) {
    -    const {
    -      max = 0,
    -      ttl,
    -      ttlResolution = 1,
    -      ttlAutopurge,
    -      updateAgeOnGet,
    -      updateAgeOnHas,
    -      allowStale,
    -      dispose,
    -      disposeAfter,
    -      noDisposeOnSet,
    -      noUpdateTTL,
    -      maxSize = 0,
    -      maxEntrySize = 0,
    -      sizeCalculation,
    -      fetchMethod,
    -      fetchContext,
    -      noDeleteOnFetchRejection,
    -      noDeleteOnStaleGet,
    -      allowStaleOnFetchRejection,
    -      allowStaleOnFetchAbort,
    -      ignoreFetchAbort,
    -    } = options
    -
    -    // deprecated options, don't trigger a warning for getting them if
    -    // the thing being passed in is another LRUCache we're copying.
    -    const { length, maxAge, stale } =
    -      options instanceof LRUCache ? {} : options
    -
    -    if (max !== 0 && !isPosInt(max)) {
    -      throw new TypeError('max option must be a nonnegative integer')
    -    }
    -
    -    const UintArray = max ? getUintArray(max) : Array
    -    if (!UintArray) {
    -      throw new Error('invalid max value: ' + max)
    -    }
    -
    -    this.max = max
    -    this.maxSize = maxSize
    -    this.maxEntrySize = maxEntrySize || this.maxSize
    -    this.sizeCalculation = sizeCalculation || length
    -    if (this.sizeCalculation) {
    -      if (!this.maxSize && !this.maxEntrySize) {
    -        throw new TypeError(
    -          'cannot set sizeCalculation without setting maxSize or maxEntrySize'
    -        )
    -      }
    -      if (typeof this.sizeCalculation !== 'function') {
    -        throw new TypeError('sizeCalculation set to non-function')
    -      }
    -    }
    -
    -    this.fetchMethod = fetchMethod || null
    -    if (this.fetchMethod && typeof this.fetchMethod !== 'function') {
    -      throw new TypeError(
    -        'fetchMethod must be a function if specified'
    -      )
    -    }
    -
    -    this.fetchContext = fetchContext
    -    if (!this.fetchMethod && fetchContext !== undefined) {
    -      throw new TypeError(
    -        'cannot set fetchContext without fetchMethod'
    -      )
    -    }
    -
    -    this.keyMap = new Map()
    -    this.keyList = new Array(max).fill(null)
    -    this.valList = new Array(max).fill(null)
    -    this.next = new UintArray(max)
    -    this.prev = new UintArray(max)
    -    this.head = 0
    -    this.tail = 0
    -    this.free = new Stack(max)
    -    this.initialFill = 1
    -    this.size = 0
    -
    -    if (typeof dispose === 'function') {
    -      this.dispose = dispose
    -    }
    -    if (typeof disposeAfter === 'function') {
    -      this.disposeAfter = disposeAfter
    -      this.disposed = []
    -    } else {
    -      this.disposeAfter = null
    -      this.disposed = null
    -    }
    -    this.noDisposeOnSet = !!noDisposeOnSet
    -    this.noUpdateTTL = !!noUpdateTTL
    -    this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection
    -    this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection
    -    this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort
    -    this.ignoreFetchAbort = !!ignoreFetchAbort
    -
    -    // NB: maxEntrySize is set to maxSize if it's set
    -    if (this.maxEntrySize !== 0) {
    -      if (this.maxSize !== 0) {
    -        if (!isPosInt(this.maxSize)) {
    -          throw new TypeError(
    -            'maxSize must be a positive integer if specified'
    -          )
    -        }
    -      }
    -      if (!isPosInt(this.maxEntrySize)) {
    -        throw new TypeError(
    -          'maxEntrySize must be a positive integer if specified'
    -        )
    -      }
    -      this.initializeSizeTracking()
    -    }
    -
    -    this.allowStale = !!allowStale || !!stale
    -    this.noDeleteOnStaleGet = !!noDeleteOnStaleGet
    -    this.updateAgeOnGet = !!updateAgeOnGet
    -    this.updateAgeOnHas = !!updateAgeOnHas
    -    this.ttlResolution =
    -      isPosInt(ttlResolution) || ttlResolution === 0
    -        ? ttlResolution
    -        : 1
    -    this.ttlAutopurge = !!ttlAutopurge
    -    this.ttl = ttl || maxAge || 0
    -    if (this.ttl) {
    -      if (!isPosInt(this.ttl)) {
    -        throw new TypeError(
    -          'ttl must be a positive integer if specified'
    -        )
    -      }
    -      this.initializeTTLTracking()
    -    }
    -
    -    // do not allow completely unbounded caches
    -    if (this.max === 0 && this.ttl === 0 && this.maxSize === 0) {
    -      throw new TypeError(
    -        'At least one of max, maxSize, or ttl is required'
    -      )
    -    }
    -    if (!this.ttlAutopurge && !this.max && !this.maxSize) {
    -      const code = 'LRU_CACHE_UNBOUNDED'
    -      if (shouldWarn(code)) {
    -        warned.add(code)
    -        const msg =
    -          'TTL caching without ttlAutopurge, max, or maxSize can ' +
    -          'result in unbounded memory consumption.'
    -        emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache)
    -      }
    -    }
    -
    -    if (stale) {
    -      deprecatedOption('stale', 'allowStale')
    -    }
    -    if (maxAge) {
    -      deprecatedOption('maxAge', 'ttl')
    -    }
    -    if (length) {
    -      deprecatedOption('length', 'sizeCalculation')
    -    }
    -  }
    -
    -  getRemainingTTL(key) {
    -    return this.has(key, { updateAgeOnHas: false }) ? Infinity : 0
    -  }
    -
    -  initializeTTLTracking() {
    -    this.ttls = new ZeroArray(this.max)
    -    this.starts = new ZeroArray(this.max)
    -
    -    this.setItemTTL = (index, ttl, start = perf.now()) => {
    -      this.starts[index] = ttl !== 0 ? start : 0
    -      this.ttls[index] = ttl
    -      if (ttl !== 0 && this.ttlAutopurge) {
    -        const t = setTimeout(() => {
    -          if (this.isStale(index)) {
    -            this.delete(this.keyList[index])
    -          }
    -        }, ttl + 1)
    -        /* istanbul ignore else - unref() not supported on all platforms */
    -        if (t.unref) {
    -          t.unref()
    -        }
    -      }
    -    }
    -
    -    this.updateItemAge = index => {
    -      this.starts[index] = this.ttls[index] !== 0 ? perf.now() : 0
    -    }
    -
    -    this.statusTTL = (status, index) => {
    -      if (status) {
    -        status.ttl = this.ttls[index]
    -        status.start = this.starts[index]
    -        status.now = cachedNow || getNow()
    -        status.remainingTTL = status.now + status.ttl - status.start
    -      }
    -    }
    -
    -    // debounce calls to perf.now() to 1s so we're not hitting
    -    // that costly call repeatedly.
    -    let cachedNow = 0
    -    const getNow = () => {
    -      const n = perf.now()
    -      if (this.ttlResolution > 0) {
    -        cachedNow = n
    -        const t = setTimeout(
    -          () => (cachedNow = 0),
    -          this.ttlResolution
    -        )
    -        /* istanbul ignore else - not available on all platforms */
    -        if (t.unref) {
    -          t.unref()
    -        }
    -      }
    -      return n
    -    }
    -
    -    this.getRemainingTTL = key => {
    -      const index = this.keyMap.get(key)
    -      if (index === undefined) {
    -        return 0
    -      }
    -      return this.ttls[index] === 0 || this.starts[index] === 0
    -        ? Infinity
    -        : this.starts[index] +
    -            this.ttls[index] -
    -            (cachedNow || getNow())
    -    }
    -
    -    this.isStale = index => {
    -      return (
    -        this.ttls[index] !== 0 &&
    -        this.starts[index] !== 0 &&
    -        (cachedNow || getNow()) - this.starts[index] >
    -          this.ttls[index]
    -      )
    -    }
    -  }
    -  updateItemAge(_index) {}
    -  statusTTL(_status, _index) {}
    -  setItemTTL(_index, _ttl, _start) {}
    -  isStale(_index) {
    -    return false
    -  }
    -
    -  initializeSizeTracking() {
    -    this.calculatedSize = 0
    -    this.sizes = new ZeroArray(this.max)
    -    this.removeItemSize = index => {
    -      this.calculatedSize -= this.sizes[index]
    -      this.sizes[index] = 0
    -    }
    -    this.requireSize = (k, v, size, sizeCalculation) => {
    -      // provisionally accept background fetches.
    -      // actual value size will be checked when they return.
    -      if (this.isBackgroundFetch(v)) {
    -        return 0
    -      }
    -      if (!isPosInt(size)) {
    -        if (sizeCalculation) {
    -          if (typeof sizeCalculation !== 'function') {
    -            throw new TypeError('sizeCalculation must be a function')
    -          }
    -          size = sizeCalculation(v, k)
    -          if (!isPosInt(size)) {
    -            throw new TypeError(
    -              'sizeCalculation return invalid (expect positive integer)'
    -            )
    -          }
    -        } else {
    -          throw new TypeError(
    -            'invalid size value (must be positive integer). ' +
    -              'When maxSize or maxEntrySize is used, sizeCalculation or size ' +
    -              'must be set.'
    -          )
    -        }
    -      }
    -      return size
    -    }
    -    this.addItemSize = (index, size, status) => {
    -      this.sizes[index] = size
    -      if (this.maxSize) {
    -        const maxSize = this.maxSize - this.sizes[index]
    -        while (this.calculatedSize > maxSize) {
    -          this.evict(true)
    -        }
    -      }
    -      this.calculatedSize += this.sizes[index]
    -      if (status) {
    -        status.entrySize = size
    -        status.totalCalculatedSize = this.calculatedSize
    -      }
    -    }
    -  }
    -  removeItemSize(_index) {}
    -  addItemSize(_index, _size) {}
    -  requireSize(_k, _v, size, sizeCalculation) {
    -    if (size || sizeCalculation) {
    -      throw new TypeError(
    -        'cannot set size without setting maxSize or maxEntrySize on cache'
    -      )
    -    }
    -  }
    -
    -  *indexes({ allowStale = this.allowStale } = {}) {
    -    if (this.size) {
    -      for (let i = this.tail; true; ) {
    -        if (!this.isValidIndex(i)) {
    -          break
    -        }
    -        if (allowStale || !this.isStale(i)) {
    -          yield i
    -        }
    -        if (i === this.head) {
    -          break
    -        } else {
    -          i = this.prev[i]
    -        }
    -      }
    -    }
    -  }
    -
    -  *rindexes({ allowStale = this.allowStale } = {}) {
    -    if (this.size) {
    -      for (let i = this.head; true; ) {
    -        if (!this.isValidIndex(i)) {
    -          break
    -        }
    -        if (allowStale || !this.isStale(i)) {
    -          yield i
    -        }
    -        if (i === this.tail) {
    -          break
    -        } else {
    -          i = this.next[i]
    -        }
    -      }
    -    }
    -  }
    -
    -  isValidIndex(index) {
    -    return (
    -      index !== undefined &&
    -      this.keyMap.get(this.keyList[index]) === index
    -    )
    -  }
    -
    -  *entries() {
    -    for (const i of this.indexes()) {
    -      if (
    -        this.valList[i] !== undefined &&
    -        this.keyList[i] !== undefined &&
    -        !this.isBackgroundFetch(this.valList[i])
    -      ) {
    -        yield [this.keyList[i], this.valList[i]]
    -      }
    -    }
    -  }
    -  *rentries() {
    -    for (const i of this.rindexes()) {
    -      if (
    -        this.valList[i] !== undefined &&
    -        this.keyList[i] !== undefined &&
    -        !this.isBackgroundFetch(this.valList[i])
    -      ) {
    -        yield [this.keyList[i], this.valList[i]]
    -      }
    -    }
    -  }
    -
    -  *keys() {
    -    for (const i of this.indexes()) {
    -      if (
    -        this.keyList[i] !== undefined &&
    -        !this.isBackgroundFetch(this.valList[i])
    -      ) {
    -        yield this.keyList[i]
    -      }
    -    }
    -  }
    -  *rkeys() {
    -    for (const i of this.rindexes()) {
    -      if (
    -        this.keyList[i] !== undefined &&
    -        !this.isBackgroundFetch(this.valList[i])
    -      ) {
    -        yield this.keyList[i]
    -      }
    -    }
    -  }
    -
    -  *values() {
    -    for (const i of this.indexes()) {
    -      if (
    -        this.valList[i] !== undefined &&
    -        !this.isBackgroundFetch(this.valList[i])
    -      ) {
    -        yield this.valList[i]
    -      }
    -    }
    -  }
    -  *rvalues() {
    -    for (const i of this.rindexes()) {
    -      if (
    -        this.valList[i] !== undefined &&
    -        !this.isBackgroundFetch(this.valList[i])
    -      ) {
    -        yield this.valList[i]
    -      }
    -    }
    -  }
    -
    -  [Symbol.iterator]() {
    -    return this.entries()
    -  }
    -
    -  find(fn, getOptions) {
    -    for (const i of this.indexes()) {
    -      const v = this.valList[i]
    -      const value = this.isBackgroundFetch(v)
    -        ? v.__staleWhileFetching
    -        : v
    -      if (value === undefined) continue
    -      if (fn(value, this.keyList[i], this)) {
    -        return this.get(this.keyList[i], getOptions)
    -      }
    -    }
    -  }
    -
    -  forEach(fn, thisp = this) {
    -    for (const i of this.indexes()) {
    -      const v = this.valList[i]
    -      const value = this.isBackgroundFetch(v)
    -        ? v.__staleWhileFetching
    -        : v
    -      if (value === undefined) continue
    -      fn.call(thisp, value, this.keyList[i], this)
    -    }
    -  }
    -
    -  rforEach(fn, thisp = this) {
    -    for (const i of this.rindexes()) {
    -      const v = this.valList[i]
    -      const value = this.isBackgroundFetch(v)
    -        ? v.__staleWhileFetching
    -        : v
    -      if (value === undefined) continue
    -      fn.call(thisp, value, this.keyList[i], this)
    -    }
    -  }
    -
    -  get prune() {
    -    deprecatedMethod('prune', 'purgeStale')
    -    return this.purgeStale
    -  }
    -
    -  purgeStale() {
    -    let deleted = false
    -    for (const i of this.rindexes({ allowStale: true })) {
    -      if (this.isStale(i)) {
    -        this.delete(this.keyList[i])
    -        deleted = true
    -      }
    -    }
    -    return deleted
    -  }
    -
    -  dump() {
    -    const arr = []
    -    for (const i of this.indexes({ allowStale: true })) {
    -      const key = this.keyList[i]
    -      const v = this.valList[i]
    -      const value = this.isBackgroundFetch(v)
    -        ? v.__staleWhileFetching
    -        : v
    -      if (value === undefined) continue
    -      const entry = { value }
    -      if (this.ttls) {
    -        entry.ttl = this.ttls[i]
    -        // always dump the start relative to a portable timestamp
    -        // it's ok for this to be a bit slow, it's a rare operation.
    -        const age = perf.now() - this.starts[i]
    -        entry.start = Math.floor(Date.now() - age)
    -      }
    -      if (this.sizes) {
    -        entry.size = this.sizes[i]
    -      }
    -      arr.unshift([key, entry])
    -    }
    -    return arr
    -  }
    -
    -  load(arr) {
    -    this.clear()
    -    for (const [key, entry] of arr) {
    -      if (entry.start) {
    -        // entry.start is a portable timestamp, but we may be using
    -        // node's performance.now(), so calculate the offset.
    -        // it's ok for this to be a bit slow, it's a rare operation.
    -        const age = Date.now() - entry.start
    -        entry.start = perf.now() - age
    -      }
    -      this.set(key, entry.value, entry)
    -    }
    -  }
    -
    -  dispose(_v, _k, _reason) {}
    -
    -  set(
    -    k,
    -    v,
    -    {
    -      ttl = this.ttl,
    -      start,
    -      noDisposeOnSet = this.noDisposeOnSet,
    -      size = 0,
    -      sizeCalculation = this.sizeCalculation,
    -      noUpdateTTL = this.noUpdateTTL,
    -      status,
    -    } = {}
    -  ) {
    -    size = this.requireSize(k, v, size, sizeCalculation)
    -    // if the item doesn't fit, don't do anything
    -    // NB: maxEntrySize set to maxSize by default
    -    if (this.maxEntrySize && size > this.maxEntrySize) {
    -      if (status) {
    -        status.set = 'miss'
    -        status.maxEntrySizeExceeded = true
    -      }
    -      // have to delete, in case a background fetch is there already.
    -      // in non-async cases, this is a no-op
    -      this.delete(k)
    -      return this
    -    }
    -    let index = this.size === 0 ? undefined : this.keyMap.get(k)
    -    if (index === undefined) {
    -      // addition
    -      index = this.newIndex()
    -      this.keyList[index] = k
    -      this.valList[index] = v
    -      this.keyMap.set(k, index)
    -      this.next[this.tail] = index
    -      this.prev[index] = this.tail
    -      this.tail = index
    -      this.size++
    -      this.addItemSize(index, size, status)
    -      if (status) {
    -        status.set = 'add'
    -      }
    -      noUpdateTTL = false
    -    } else {
    -      // update
    -      this.moveToTail(index)
    -      const oldVal = this.valList[index]
    -      if (v !== oldVal) {
    -        if (this.isBackgroundFetch(oldVal)) {
    -          oldVal.__abortController.abort(new Error('replaced'))
    -        } else {
    -          if (!noDisposeOnSet) {
    -            this.dispose(oldVal, k, 'set')
    -            if (this.disposeAfter) {
    -              this.disposed.push([oldVal, k, 'set'])
    -            }
    -          }
    -        }
    -        this.removeItemSize(index)
    -        this.valList[index] = v
    -        this.addItemSize(index, size, status)
    -        if (status) {
    -          status.set = 'replace'
    -          const oldValue =
    -            oldVal && this.isBackgroundFetch(oldVal)
    -              ? oldVal.__staleWhileFetching
    -              : oldVal
    -          if (oldValue !== undefined) status.oldValue = oldValue
    -        }
    -      } else if (status) {
    -        status.set = 'update'
    -      }
    -    }
    -    if (ttl !== 0 && this.ttl === 0 && !this.ttls) {
    -      this.initializeTTLTracking()
    -    }
    -    if (!noUpdateTTL) {
    -      this.setItemTTL(index, ttl, start)
    -    }
    -    this.statusTTL(status, index)
    -    if (this.disposeAfter) {
    -      while (this.disposed.length) {
    -        this.disposeAfter(...this.disposed.shift())
    -      }
    -    }
    -    return this
    -  }
    -
    -  newIndex() {
    -    if (this.size === 0) {
    -      return this.tail
    -    }
    -    if (this.size === this.max && this.max !== 0) {
    -      return this.evict(false)
    -    }
    -    if (this.free.length !== 0) {
    -      return this.free.pop()
    -    }
    -    // initial fill, just keep writing down the list
    -    return this.initialFill++
    -  }
    -
    -  pop() {
    -    if (this.size) {
    -      const val = this.valList[this.head]
    -      this.evict(true)
    -      return val
    -    }
    -  }
    -
    -  evict(free) {
    -    const head = this.head
    -    const k = this.keyList[head]
    -    const v = this.valList[head]
    -    if (this.isBackgroundFetch(v)) {
    -      v.__abortController.abort(new Error('evicted'))
    -    } else {
    -      this.dispose(v, k, 'evict')
    -      if (this.disposeAfter) {
    -        this.disposed.push([v, k, 'evict'])
    -      }
    -    }
    -    this.removeItemSize(head)
    -    // if we aren't about to use the index, then null these out
    -    if (free) {
    -      this.keyList[head] = null
    -      this.valList[head] = null
    -      this.free.push(head)
    -    }
    -    this.head = this.next[head]
    -    this.keyMap.delete(k)
    -    this.size--
    -    return head
    -  }
    -
    -  has(k, { updateAgeOnHas = this.updateAgeOnHas, status } = {}) {
    -    const index = this.keyMap.get(k)
    -    if (index !== undefined) {
    -      if (!this.isStale(index)) {
    -        if (updateAgeOnHas) {
    -          this.updateItemAge(index)
    -        }
    -        if (status) status.has = 'hit'
    -        this.statusTTL(status, index)
    -        return true
    -      } else if (status) {
    -        status.has = 'stale'
    -        this.statusTTL(status, index)
    -      }
    -    } else if (status) {
    -      status.has = 'miss'
    -    }
    -    return false
    -  }
    -
    -  // like get(), but without any LRU updating or TTL expiration
    -  peek(k, { allowStale = this.allowStale } = {}) {
    -    const index = this.keyMap.get(k)
    -    if (index !== undefined && (allowStale || !this.isStale(index))) {
    -      const v = this.valList[index]
    -      // either stale and allowed, or forcing a refresh of non-stale value
    -      return this.isBackgroundFetch(v) ? v.__staleWhileFetching : v
    -    }
    -  }
    -
    -  backgroundFetch(k, index, options, context) {
    -    const v = index === undefined ? undefined : this.valList[index]
    -    if (this.isBackgroundFetch(v)) {
    -      return v
    -    }
    -    const ac = new AC()
    -    if (options.signal) {
    -      options.signal.addEventListener('abort', () =>
    -        ac.abort(options.signal.reason)
    -      )
    -    }
    -    const fetchOpts = {
    -      signal: ac.signal,
    -      options,
    -      context,
    -    }
    -    const cb = (v, updateCache = false) => {
    -      const { aborted } = ac.signal
    -      const ignoreAbort = options.ignoreFetchAbort && v !== undefined
    -      if (options.status) {
    -        if (aborted && !updateCache) {
    -          options.status.fetchAborted = true
    -          options.status.fetchError = ac.signal.reason
    -          if (ignoreAbort) options.status.fetchAbortIgnored = true
    -        } else {
    -          options.status.fetchResolved = true
    -        }
    -      }
    -      if (aborted && !ignoreAbort && !updateCache) {
    -        return fetchFail(ac.signal.reason)
    -      }
    -      // either we didn't abort, and are still here, or we did, and ignored
    -      if (this.valList[index] === p) {
    -        if (v === undefined) {
    -          if (p.__staleWhileFetching) {
    -            this.valList[index] = p.__staleWhileFetching
    -          } else {
    -            this.delete(k)
    -          }
    -        } else {
    -          if (options.status) options.status.fetchUpdated = true
    -          this.set(k, v, fetchOpts.options)
    -        }
    -      }
    -      return v
    -    }
    -    const eb = er => {
    -      if (options.status) {
    -        options.status.fetchRejected = true
    -        options.status.fetchError = er
    -      }
    -      return fetchFail(er)
    -    }
    -    const fetchFail = er => {
    -      const { aborted } = ac.signal
    -      const allowStaleAborted =
    -        aborted && options.allowStaleOnFetchAbort
    -      const allowStale =
    -        allowStaleAborted || options.allowStaleOnFetchRejection
    -      const noDelete = allowStale || options.noDeleteOnFetchRejection
    -      if (this.valList[index] === p) {
    -        // if we allow stale on fetch rejections, then we need to ensure that
    -        // the stale value is not removed from the cache when the fetch fails.
    -        const del = !noDelete || p.__staleWhileFetching === undefined
    -        if (del) {
    -          this.delete(k)
    -        } else if (!allowStaleAborted) {
    -          // still replace the *promise* with the stale value,
    -          // since we are done with the promise at this point.
    -          // leave it untouched if we're still waiting for an
    -          // aborted background fetch that hasn't yet returned.
    -          this.valList[index] = p.__staleWhileFetching
    -        }
    -      }
    -      if (allowStale) {
    -        if (options.status && p.__staleWhileFetching !== undefined) {
    -          options.status.returnedStale = true
    -        }
    -        return p.__staleWhileFetching
    -      } else if (p.__returned === p) {
    -        throw er
    -      }
    -    }
    -    const pcall = (res, rej) => {
    -      this.fetchMethod(k, v, fetchOpts).then(v => res(v), rej)
    -      // ignored, we go until we finish, regardless.
    -      // defer check until we are actually aborting,
    -      // so fetchMethod can override.
    -      ac.signal.addEventListener('abort', () => {
    -        if (
    -          !options.ignoreFetchAbort ||
    -          options.allowStaleOnFetchAbort
    -        ) {
    -          res()
    -          // when it eventually resolves, update the cache.
    -          if (options.allowStaleOnFetchAbort) {
    -            res = v => cb(v, true)
    -          }
    -        }
    -      })
    -    }
    -    if (options.status) options.status.fetchDispatched = true
    -    const p = new Promise(pcall).then(cb, eb)
    -    p.__abortController = ac
    -    p.__staleWhileFetching = v
    -    p.__returned = null
    -    if (index === undefined) {
    -      // internal, don't expose status.
    -      this.set(k, p, { ...fetchOpts.options, status: undefined })
    -      index = this.keyMap.get(k)
    -    } else {
    -      this.valList[index] = p
    -    }
    -    return p
    -  }
    -
    -  isBackgroundFetch(p) {
    -    return (
    -      p &&
    -      typeof p === 'object' &&
    -      typeof p.then === 'function' &&
    -      Object.prototype.hasOwnProperty.call(
    -        p,
    -        '__staleWhileFetching'
    -      ) &&
    -      Object.prototype.hasOwnProperty.call(p, '__returned') &&
    -      (p.__returned === p || p.__returned === null)
    -    )
    -  }
    -
    -  // this takes the union of get() and set() opts, because it does both
    -  async fetch(
    -    k,
    -    {
    -      // get options
    -      allowStale = this.allowStale,
    -      updateAgeOnGet = this.updateAgeOnGet,
    -      noDeleteOnStaleGet = this.noDeleteOnStaleGet,
    -      // set options
    -      ttl = this.ttl,
    -      noDisposeOnSet = this.noDisposeOnSet,
    -      size = 0,
    -      sizeCalculation = this.sizeCalculation,
    -      noUpdateTTL = this.noUpdateTTL,
    -      // fetch exclusive options
    -      noDeleteOnFetchRejection = this.noDeleteOnFetchRejection,
    -      allowStaleOnFetchRejection = this.allowStaleOnFetchRejection,
    -      ignoreFetchAbort = this.ignoreFetchAbort,
    -      allowStaleOnFetchAbort = this.allowStaleOnFetchAbort,
    -      fetchContext = this.fetchContext,
    -      forceRefresh = false,
    -      status,
    -      signal,
    -    } = {}
    -  ) {
    -    if (!this.fetchMethod) {
    -      if (status) status.fetch = 'get'
    -      return this.get(k, {
    -        allowStale,
    -        updateAgeOnGet,
    -        noDeleteOnStaleGet,
    -        status,
    -      })
    -    }
    -
    -    const options = {
    -      allowStale,
    -      updateAgeOnGet,
    -      noDeleteOnStaleGet,
    -      ttl,
    -      noDisposeOnSet,
    -      size,
    -      sizeCalculation,
    -      noUpdateTTL,
    -      noDeleteOnFetchRejection,
    -      allowStaleOnFetchRejection,
    -      allowStaleOnFetchAbort,
    -      ignoreFetchAbort,
    -      status,
    -      signal,
    -    }
    -
    -    let index = this.keyMap.get(k)
    -    if (index === undefined) {
    -      if (status) status.fetch = 'miss'
    -      const p = this.backgroundFetch(k, index, options, fetchContext)
    -      return (p.__returned = p)
    -    } else {
    -      // in cache, maybe already fetching
    -      const v = this.valList[index]
    -      if (this.isBackgroundFetch(v)) {
    -        const stale =
    -          allowStale && v.__staleWhileFetching !== undefined
    -        if (status) {
    -          status.fetch = 'inflight'
    -          if (stale) status.returnedStale = true
    -        }
    -        return stale ? v.__staleWhileFetching : (v.__returned = v)
    -      }
    -
    -      // if we force a refresh, that means do NOT serve the cached value,
    -      // unless we are already in the process of refreshing the cache.
    -      const isStale = this.isStale(index)
    -      if (!forceRefresh && !isStale) {
    -        if (status) status.fetch = 'hit'
    -        this.moveToTail(index)
    -        if (updateAgeOnGet) {
    -          this.updateItemAge(index)
    -        }
    -        this.statusTTL(status, index)
    -        return v
    -      }
    -
    -      // ok, it is stale or a forced refresh, and not already fetching.
    -      // refresh the cache.
    -      const p = this.backgroundFetch(k, index, options, fetchContext)
    -      const hasStale = p.__staleWhileFetching !== undefined
    -      const staleVal = hasStale && allowStale
    -      if (status) {
    -        status.fetch = hasStale && isStale ? 'stale' : 'refresh'
    -        if (staleVal && isStale) status.returnedStale = true
    -      }
    -      return staleVal ? p.__staleWhileFetching : (p.__returned = p)
    -    }
    -  }
    -
    -  get(
    -    k,
    -    {
    -      allowStale = this.allowStale,
    -      updateAgeOnGet = this.updateAgeOnGet,
    -      noDeleteOnStaleGet = this.noDeleteOnStaleGet,
    -      status,
    -    } = {}
    -  ) {
    -    const index = this.keyMap.get(k)
    -    if (index !== undefined) {
    -      const value = this.valList[index]
    -      const fetching = this.isBackgroundFetch(value)
    -      this.statusTTL(status, index)
    -      if (this.isStale(index)) {
    -        if (status) status.get = 'stale'
    -        // delete only if not an in-flight background fetch
    -        if (!fetching) {
    -          if (!noDeleteOnStaleGet) {
    -            this.delete(k)
    -          }
    -          if (status) status.returnedStale = allowStale
    -          return allowStale ? value : undefined
    -        } else {
    -          if (status) {
    -            status.returnedStale =
    -              allowStale && value.__staleWhileFetching !== undefined
    -          }
    -          return allowStale ? value.__staleWhileFetching : undefined
    -        }
    -      } else {
    -        if (status) status.get = 'hit'
    -        // if we're currently fetching it, we don't actually have it yet
    -        // it's not stale, which means this isn't a staleWhileRefetching.
    -        // If it's not stale, and fetching, AND has a __staleWhileFetching
    -        // value, then that means the user fetched with {forceRefresh:true},
    -        // so it's safe to return that value.
    -        if (fetching) {
    -          return value.__staleWhileFetching
    -        }
    -        this.moveToTail(index)
    -        if (updateAgeOnGet) {
    -          this.updateItemAge(index)
    -        }
    -        return value
    -      }
    -    } else if (status) {
    -      status.get = 'miss'
    -    }
    -  }
    -
    -  connect(p, n) {
    -    this.prev[n] = p
    -    this.next[p] = n
    -  }
    -
    -  moveToTail(index) {
    -    // if tail already, nothing to do
    -    // if head, move head to next[index]
    -    // else
    -    //   move next[prev[index]] to next[index] (head has no prev)
    -    //   move prev[next[index]] to prev[index]
    -    // prev[index] = tail
    -    // next[tail] = index
    -    // tail = index
    -    if (index !== this.tail) {
    -      if (index === this.head) {
    -        this.head = this.next[index]
    -      } else {
    -        this.connect(this.prev[index], this.next[index])
    -      }
    -      this.connect(this.tail, index)
    -      this.tail = index
    -    }
    -  }
    -
    -  get del() {
    -    deprecatedMethod('del', 'delete')
    -    return this.delete
    -  }
    -
    -  delete(k) {
    -    let deleted = false
    -    if (this.size !== 0) {
    -      const index = this.keyMap.get(k)
    -      if (index !== undefined) {
    -        deleted = true
    -        if (this.size === 1) {
    -          this.clear()
    -        } else {
    -          this.removeItemSize(index)
    -          const v = this.valList[index]
    -          if (this.isBackgroundFetch(v)) {
    -            v.__abortController.abort(new Error('deleted'))
    -          } else {
    -            this.dispose(v, k, 'delete')
    -            if (this.disposeAfter) {
    -              this.disposed.push([v, k, 'delete'])
    -            }
    -          }
    -          this.keyMap.delete(k)
    -          this.keyList[index] = null
    -          this.valList[index] = null
    -          if (index === this.tail) {
    -            this.tail = this.prev[index]
    -          } else if (index === this.head) {
    -            this.head = this.next[index]
    -          } else {
    -            this.next[this.prev[index]] = this.next[index]
    -            this.prev[this.next[index]] = this.prev[index]
    -          }
    -          this.size--
    -          this.free.push(index)
    -        }
    -      }
    -    }
    -    if (this.disposed) {
    -      while (this.disposed.length) {
    -        this.disposeAfter(...this.disposed.shift())
    -      }
    -    }
    -    return deleted
    -  }
    -
    -  clear() {
    -    for (const index of this.rindexes({ allowStale: true })) {
    -      const v = this.valList[index]
    -      if (this.isBackgroundFetch(v)) {
    -        v.__abortController.abort(new Error('deleted'))
    -      } else {
    -        const k = this.keyList[index]
    -        this.dispose(v, k, 'delete')
    -        if (this.disposeAfter) {
    -          this.disposed.push([v, k, 'delete'])
    -        }
    -      }
    -    }
    -
    -    this.keyMap.clear()
    -    this.valList.fill(null)
    -    this.keyList.fill(null)
    -    if (this.ttls) {
    -      this.ttls.fill(0)
    -      this.starts.fill(0)
    -    }
    -    if (this.sizes) {
    -      this.sizes.fill(0)
    -    }
    -    this.head = 0
    -    this.tail = 0
    -    this.initialFill = 1
    -    this.free.length = 0
    -    this.calculatedSize = 0
    -    this.size = 0
    -    if (this.disposed) {
    -      while (this.disposed.length) {
    -        this.disposeAfter(...this.disposed.shift())
    -      }
    -    }
    -  }
    -
    -  get reset() {
    -    deprecatedMethod('reset', 'clear')
    -    return this.clear
    -  }
    -
    -  get length() {
    -    deprecatedProperty('length', 'size')
    -    return this.size
    -  }
    -
    -  static get AbortController() {
    -    return AC
    -  }
    -  static get AbortSignal() {
    -    return AS
    -  }
    -}
    -
    -export default LRUCache
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/package.json b/deps/npm/node_modules/node-gyp/node_modules/lru-cache/package.json
    deleted file mode 100644
    index 9684991727e7a2..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/lru-cache/package.json
    +++ /dev/null
    @@ -1,96 +0,0 @@
    -{
    -  "name": "lru-cache",
    -  "description": "A cache object that deletes the least-recently-used items.",
    -  "version": "7.18.3",
    -  "author": "Isaac Z. Schlueter ",
    -  "keywords": [
    -    "mru",
    -    "lru",
    -    "cache"
    -  ],
    -  "sideEffects": false,
    -  "scripts": {
    -    "build": "npm run prepare",
    -    "pretest": "npm run prepare",
    -    "presnap": "npm run prepare",
    -    "prepare": "node ./scripts/transpile-to-esm.js",
    -    "size": "size-limit",
    -    "test": "tap",
    -    "snap": "tap",
    -    "preversion": "npm test",
    -    "postversion": "npm publish",
    -    "prepublishOnly": "git push origin --follow-tags",
    -    "format": "prettier --write .",
    -    "typedoc": "typedoc ./index.d.ts"
    -  },
    -  "type": "commonjs",
    -  "main": "./index.js",
    -  "module": "./index.mjs",
    -  "types": "./index.d.ts",
    -  "exports": {
    -    ".": {
    -      "import": {
    -        "types": "./index.d.ts",
    -        "default": "./index.mjs"
    -      },
    -      "require": {
    -        "types": "./index.d.ts",
    -        "default": "./index.js"
    -      }
    -    },
    -    "./package.json": "./package.json"
    -  },
    -  "repository": "git://github.com/isaacs/node-lru-cache.git",
    -  "devDependencies": {
    -    "@size-limit/preset-small-lib": "^7.0.8",
    -    "@types/node": "^17.0.31",
    -    "@types/tap": "^15.0.6",
    -    "benchmark": "^2.1.4",
    -    "c8": "^7.11.2",
    -    "clock-mock": "^1.0.6",
    -    "eslint-config-prettier": "^8.5.0",
    -    "prettier": "^2.6.2",
    -    "size-limit": "^7.0.8",
    -    "tap": "^16.3.4",
    -    "ts-node": "^10.7.0",
    -    "tslib": "^2.4.0",
    -    "typedoc": "^0.23.24",
    -    "typescript": "^4.6.4"
    -  },
    -  "license": "ISC",
    -  "files": [
    -    "index.js",
    -    "index.mjs",
    -    "index.d.ts"
    -  ],
    -  "engines": {
    -    "node": ">=12"
    -  },
    -  "prettier": {
    -    "semi": false,
    -    "printWidth": 70,
    -    "tabWidth": 2,
    -    "useTabs": false,
    -    "singleQuote": true,
    -    "jsxSingleQuote": false,
    -    "bracketSameLine": true,
    -    "arrowParens": "avoid",
    -    "endOfLine": "lf"
    -  },
    -  "tap": {
    -    "nyc-arg": [
    -      "--include=index.js"
    -    ],
    -    "node-arg": [
    -      "--expose-gc",
    -      "--require",
    -      "ts-node/register"
    -    ],
    -    "ts": false
    -  },
    -  "size-limit": [
    -    {
    -      "path": "./index.js"
    -    }
    -  ]
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/LICENSE
    deleted file mode 100644
    index 1808eb2844231c..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/LICENSE
    +++ /dev/null
    @@ -1,16 +0,0 @@
    -ISC License
    -
    -Copyright 2017-2022 (c) npm, Inc.
    -
    -Permission to use, copy, modify, and/or distribute this software for
    -any purpose with or without fee is hereby granted, provided that the
    -above copyright notice and this permission notice appear in all copies.
    -
    -THE SOFTWARE IS PROVIDED "AS IS" AND THE COPYRIGHT HOLDER DISCLAIMS
    -ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
    -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
    -COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
    -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
    -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
    -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
    -USE OR PERFORMANCE OF THIS SOFTWARE.
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/agent.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/agent.js
    deleted file mode 100644
    index dd68492ed7ea7b..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/agent.js
    +++ /dev/null
    @@ -1,214 +0,0 @@
    -'use strict'
    -const LRU = require('lru-cache')
    -const url = require('url')
    -const isLambda = require('is-lambda')
    -const dns = require('./dns.js')
    -
    -const AGENT_CACHE = new LRU({ max: 50 })
    -const HttpAgent = require('agentkeepalive')
    -const HttpsAgent = HttpAgent.HttpsAgent
    -
    -module.exports = getAgent
    -
    -const getAgentTimeout = timeout =>
    -  typeof timeout !== 'number' || !timeout ? 0 : timeout + 1
    -
    -const getMaxSockets = maxSockets => maxSockets || 15
    -
    -function getAgent (uri, opts) {
    -  const parsedUri = new url.URL(typeof uri === 'string' ? uri : uri.url)
    -  const isHttps = parsedUri.protocol === 'https:'
    -  const pxuri = getProxyUri(parsedUri.href, opts)
    -
    -  // If opts.timeout is zero, set the agentTimeout to zero as well. A timeout
    -  // of zero disables the timeout behavior (OS limits still apply). Else, if
    -  // opts.timeout is a non-zero value, set it to timeout + 1, to ensure that
    -  // the node-fetch-npm timeout will always fire first, giving us more
    -  // consistent errors.
    -  const agentTimeout = getAgentTimeout(opts.timeout)
    -  const agentMaxSockets = getMaxSockets(opts.maxSockets)
    -
    -  const key = [
    -    `https:${isHttps}`,
    -    pxuri
    -      ? `proxy:${pxuri.protocol}//${pxuri.host}:${pxuri.port}`
    -      : '>no-proxy<',
    -    `local-address:${opts.localAddress || '>no-local-address<'}`,
    -    `strict-ssl:${isHttps ? opts.rejectUnauthorized : '>no-strict-ssl<'}`,
    -    `ca:${(isHttps && opts.ca) || '>no-ca<'}`,
    -    `cert:${(isHttps && opts.cert) || '>no-cert<'}`,
    -    `key:${(isHttps && opts.key) || '>no-key<'}`,
    -    `timeout:${agentTimeout}`,
    -    `maxSockets:${agentMaxSockets}`,
    -  ].join(':')
    -
    -  if (opts.agent != null) { // `agent: false` has special behavior!
    -    return opts.agent
    -  }
    -
    -  // keep alive in AWS lambda makes no sense
    -  const lambdaAgent = !isLambda ? null
    -    : isHttps ? require('https').globalAgent
    -    : require('http').globalAgent
    -
    -  if (isLambda && !pxuri) {
    -    return lambdaAgent
    -  }
    -
    -  if (AGENT_CACHE.peek(key)) {
    -    return AGENT_CACHE.get(key)
    -  }
    -
    -  if (pxuri) {
    -    const pxopts = isLambda ? {
    -      ...opts,
    -      agent: lambdaAgent,
    -    } : opts
    -    const proxy = getProxy(pxuri, pxopts, isHttps)
    -    AGENT_CACHE.set(key, proxy)
    -    return proxy
    -  }
    -
    -  const agent = isHttps ? new HttpsAgent({
    -    maxSockets: agentMaxSockets,
    -    ca: opts.ca,
    -    cert: opts.cert,
    -    key: opts.key,
    -    localAddress: opts.localAddress,
    -    rejectUnauthorized: opts.rejectUnauthorized,
    -    timeout: agentTimeout,
    -    freeSocketTimeout: 15000,
    -    lookup: dns.getLookup(opts.dns),
    -  }) : new HttpAgent({
    -    maxSockets: agentMaxSockets,
    -    localAddress: opts.localAddress,
    -    timeout: agentTimeout,
    -    freeSocketTimeout: 15000,
    -    lookup: dns.getLookup(opts.dns),
    -  })
    -  AGENT_CACHE.set(key, agent)
    -  return agent
    -}
    -
    -function checkNoProxy (uri, opts) {
    -  const host = new url.URL(uri).hostname.split('.').reverse()
    -  let noproxy = (opts.noProxy || getProcessEnv('no_proxy'))
    -  if (typeof noproxy === 'string') {
    -    noproxy = noproxy.split(',').map(n => n.trim())
    -  }
    -
    -  return noproxy && noproxy.some(no => {
    -    const noParts = no.split('.').filter(x => x).reverse()
    -    if (!noParts.length) {
    -      return false
    -    }
    -    for (let i = 0; i < noParts.length; i++) {
    -      if (host[i] !== noParts[i]) {
    -        return false
    -      }
    -    }
    -    return true
    -  })
    -}
    -
    -module.exports.getProcessEnv = getProcessEnv
    -
    -function getProcessEnv (env) {
    -  if (!env) {
    -    return
    -  }
    -
    -  let value
    -
    -  if (Array.isArray(env)) {
    -    for (const e of env) {
    -      value = process.env[e] ||
    -        process.env[e.toUpperCase()] ||
    -        process.env[e.toLowerCase()]
    -      if (typeof value !== 'undefined') {
    -        break
    -      }
    -    }
    -  }
    -
    -  if (typeof env === 'string') {
    -    value = process.env[env] ||
    -      process.env[env.toUpperCase()] ||
    -      process.env[env.toLowerCase()]
    -  }
    -
    -  return value
    -}
    -
    -module.exports.getProxyUri = getProxyUri
    -function getProxyUri (uri, opts) {
    -  const protocol = new url.URL(uri).protocol
    -
    -  const proxy = opts.proxy ||
    -    (
    -      protocol === 'https:' &&
    -      getProcessEnv('https_proxy')
    -    ) ||
    -    (
    -      protocol === 'http:' &&
    -      getProcessEnv(['https_proxy', 'http_proxy', 'proxy'])
    -    )
    -  if (!proxy) {
    -    return null
    -  }
    -
    -  const parsedProxy = (typeof proxy === 'string') ? new url.URL(proxy) : proxy
    -
    -  return !checkNoProxy(uri, opts) && parsedProxy
    -}
    -
    -const getAuth = u =>
    -  u.username && u.password ? decodeURIComponent(`${u.username}:${u.password}`)
    -  : u.username ? decodeURIComponent(u.username)
    -  : null
    -
    -const getPath = u => u.pathname + u.search + u.hash
    -
    -const HttpProxyAgent = require('http-proxy-agent')
    -const HttpsProxyAgent = require('https-proxy-agent')
    -const { SocksProxyAgent } = require('socks-proxy-agent')
    -module.exports.getProxy = getProxy
    -function getProxy (proxyUrl, opts, isHttps) {
    -  // our current proxy agents do not support an overridden dns lookup method, so will not
    -  // benefit from the dns cache
    -  const popts = {
    -    host: proxyUrl.hostname,
    -    port: proxyUrl.port,
    -    protocol: proxyUrl.protocol,
    -    path: getPath(proxyUrl),
    -    auth: getAuth(proxyUrl),
    -    ca: opts.ca,
    -    cert: opts.cert,
    -    key: opts.key,
    -    timeout: getAgentTimeout(opts.timeout),
    -    localAddress: opts.localAddress,
    -    maxSockets: getMaxSockets(opts.maxSockets),
    -    rejectUnauthorized: opts.rejectUnauthorized,
    -  }
    -
    -  if (proxyUrl.protocol === 'http:' || proxyUrl.protocol === 'https:') {
    -    if (!isHttps) {
    -      return new HttpProxyAgent(popts)
    -    } else {
    -      return new HttpsProxyAgent(popts)
    -    }
    -  } else if (proxyUrl.protocol.startsWith('socks')) {
    -    // socks-proxy-agent uses hostname not host
    -    popts.hostname = popts.host
    -    delete popts.host
    -    return new SocksProxyAgent(popts)
    -  } else {
    -    throw Object.assign(
    -      new Error(`unsupported proxy protocol: '${proxyUrl.protocol}'`),
    -      {
    -        code: 'EUNSUPPORTEDPROXY',
    -        url: proxyUrl.href,
    -      }
    -    )
    -  }
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/entry.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/entry.js
    deleted file mode 100644
    index 45141095074ecb..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/entry.js
    +++ /dev/null
    @@ -1,469 +0,0 @@
    -const { Request, Response } = require('minipass-fetch')
    -const { Minipass } = require('minipass')
    -const MinipassFlush = require('minipass-flush')
    -const cacache = require('cacache')
    -const url = require('url')
    -
    -const CachingMinipassPipeline = require('../pipeline.js')
    -const CachePolicy = require('./policy.js')
    -const cacheKey = require('./key.js')
    -const remote = require('../remote.js')
    -
    -const hasOwnProperty = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop)
    -
    -// allow list for request headers that will be written to the cache index
    -// note: we will also store any request headers
    -// that are named in a response's vary header
    -const KEEP_REQUEST_HEADERS = [
    -  'accept-charset',
    -  'accept-encoding',
    -  'accept-language',
    -  'accept',
    -  'cache-control',
    -]
    -
    -// allow list for response headers that will be written to the cache index
    -// note: we must not store the real response's age header, or when we load
    -// a cache policy based on the metadata it will think the cached response
    -// is always stale
    -const KEEP_RESPONSE_HEADERS = [
    -  'cache-control',
    -  'content-encoding',
    -  'content-language',
    -  'content-type',
    -  'date',
    -  'etag',
    -  'expires',
    -  'last-modified',
    -  'link',
    -  'location',
    -  'pragma',
    -  'vary',
    -]
    -
    -// return an object containing all metadata to be written to the index
    -const getMetadata = (request, response, options) => {
    -  const metadata = {
    -    time: Date.now(),
    -    url: request.url,
    -    reqHeaders: {},
    -    resHeaders: {},
    -
    -    // options on which we must match the request and vary the response
    -    options: {
    -      compress: options.compress != null ? options.compress : request.compress,
    -    },
    -  }
    -
    -  // only save the status if it's not a 200 or 304
    -  if (response.status !== 200 && response.status !== 304) {
    -    metadata.status = response.status
    -  }
    -
    -  for (const name of KEEP_REQUEST_HEADERS) {
    -    if (request.headers.has(name)) {
    -      metadata.reqHeaders[name] = request.headers.get(name)
    -    }
    -  }
    -
    -  // if the request's host header differs from the host in the url
    -  // we need to keep it, otherwise it's just noise and we ignore it
    -  const host = request.headers.get('host')
    -  const parsedUrl = new url.URL(request.url)
    -  if (host && parsedUrl.host !== host) {
    -    metadata.reqHeaders.host = host
    -  }
    -
    -  // if the response has a vary header, make sure
    -  // we store the relevant request headers too
    -  if (response.headers.has('vary')) {
    -    const vary = response.headers.get('vary')
    -    // a vary of "*" means every header causes a different response.
    -    // in that scenario, we do not include any additional headers
    -    // as the freshness check will always fail anyway and we don't
    -    // want to bloat the cache indexes
    -    if (vary !== '*') {
    -      // copy any other request headers that will vary the response
    -      const varyHeaders = vary.trim().toLowerCase().split(/\s*,\s*/)
    -      for (const name of varyHeaders) {
    -        if (request.headers.has(name)) {
    -          metadata.reqHeaders[name] = request.headers.get(name)
    -        }
    -      }
    -    }
    -  }
    -
    -  for (const name of KEEP_RESPONSE_HEADERS) {
    -    if (response.headers.has(name)) {
    -      metadata.resHeaders[name] = response.headers.get(name)
    -    }
    -  }
    -
    -  for (const name of options.cacheAdditionalHeaders) {
    -    if (response.headers.has(name)) {
    -      metadata.resHeaders[name] = response.headers.get(name)
    -    }
    -  }
    -
    -  return metadata
    -}
    -
    -// symbols used to hide objects that may be lazily evaluated in a getter
    -const _request = Symbol('request')
    -const _response = Symbol('response')
    -const _policy = Symbol('policy')
    -
    -class CacheEntry {
    -  constructor ({ entry, request, response, options }) {
    -    if (entry) {
    -      this.key = entry.key
    -      this.entry = entry
    -      // previous versions of this module didn't write an explicit timestamp in
    -      // the metadata, so fall back to the entry's timestamp. we can't use the
    -      // entry timestamp to determine staleness because cacache will update it
    -      // when it verifies its data
    -      this.entry.metadata.time = this.entry.metadata.time || this.entry.time
    -    } else {
    -      this.key = cacheKey(request)
    -    }
    -
    -    this.options = options
    -
    -    // these properties are behind getters that lazily evaluate
    -    this[_request] = request
    -    this[_response] = response
    -    this[_policy] = null
    -  }
    -
    -  // returns a CacheEntry instance that satisfies the given request
    -  // or undefined if no existing entry satisfies
    -  static async find (request, options) {
    -    try {
    -      // compacts the index and returns an array of unique entries
    -      var matches = await cacache.index.compact(options.cachePath, cacheKey(request), (A, B) => {
    -        const entryA = new CacheEntry({ entry: A, options })
    -        const entryB = new CacheEntry({ entry: B, options })
    -        return entryA.policy.satisfies(entryB.request)
    -      }, {
    -        validateEntry: (entry) => {
    -          // clean out entries with a buggy content-encoding value
    -          if (entry.metadata &&
    -              entry.metadata.resHeaders &&
    -              entry.metadata.resHeaders['content-encoding'] === null) {
    -            return false
    -          }
    -
    -          // if an integrity is null, it needs to have a status specified
    -          if (entry.integrity === null) {
    -            return !!(entry.metadata && entry.metadata.status)
    -          }
    -
    -          return true
    -        },
    -      })
    -    } catch (err) {
    -      // if the compact request fails, ignore the error and return
    -      return
    -    }
    -
    -    // a cache mode of 'reload' means to behave as though we have no cache
    -    // on the way to the network. return undefined to allow cacheFetch to
    -    // create a brand new request no matter what.
    -    if (options.cache === 'reload') {
    -      return
    -    }
    -
    -    // find the specific entry that satisfies the request
    -    let match
    -    for (const entry of matches) {
    -      const _entry = new CacheEntry({
    -        entry,
    -        options,
    -      })
    -
    -      if (_entry.policy.satisfies(request)) {
    -        match = _entry
    -        break
    -      }
    -    }
    -
    -    return match
    -  }
    -
    -  // if the user made a PUT/POST/PATCH then we invalidate our
    -  // cache for the same url by deleting the index entirely
    -  static async invalidate (request, options) {
    -    const key = cacheKey(request)
    -    try {
    -      await cacache.rm.entry(options.cachePath, key, { removeFully: true })
    -    } catch (err) {
    -      // ignore errors
    -    }
    -  }
    -
    -  get request () {
    -    if (!this[_request]) {
    -      this[_request] = new Request(this.entry.metadata.url, {
    -        method: 'GET',
    -        headers: this.entry.metadata.reqHeaders,
    -        ...this.entry.metadata.options,
    -      })
    -    }
    -
    -    return this[_request]
    -  }
    -
    -  get response () {
    -    if (!this[_response]) {
    -      this[_response] = new Response(null, {
    -        url: this.entry.metadata.url,
    -        counter: this.options.counter,
    -        status: this.entry.metadata.status || 200,
    -        headers: {
    -          ...this.entry.metadata.resHeaders,
    -          'content-length': this.entry.size,
    -        },
    -      })
    -    }
    -
    -    return this[_response]
    -  }
    -
    -  get policy () {
    -    if (!this[_policy]) {
    -      this[_policy] = new CachePolicy({
    -        entry: this.entry,
    -        request: this.request,
    -        response: this.response,
    -        options: this.options,
    -      })
    -    }
    -
    -    return this[_policy]
    -  }
    -
    -  // wraps the response in a pipeline that stores the data
    -  // in the cache while the user consumes it
    -  async store (status) {
    -    // if we got a status other than 200, 301, or 308,
    -    // or the CachePolicy forbid storage, append the
    -    // cache status header and return it untouched
    -    if (
    -      this.request.method !== 'GET' ||
    -      ![200, 301, 308].includes(this.response.status) ||
    -      !this.policy.storable()
    -    ) {
    -      this.response.headers.set('x-local-cache-status', 'skip')
    -      return this.response
    -    }
    -
    -    const size = this.response.headers.get('content-length')
    -    const cacheOpts = {
    -      algorithms: this.options.algorithms,
    -      metadata: getMetadata(this.request, this.response, this.options),
    -      size,
    -      integrity: this.options.integrity,
    -      integrityEmitter: this.response.body.hasIntegrityEmitter && this.response.body,
    -    }
    -
    -    let body = null
    -    // we only set a body if the status is a 200, redirects are
    -    // stored as metadata only
    -    if (this.response.status === 200) {
    -      let cacheWriteResolve, cacheWriteReject
    -      const cacheWritePromise = new Promise((resolve, reject) => {
    -        cacheWriteResolve = resolve
    -        cacheWriteReject = reject
    -      })
    -
    -      body = new CachingMinipassPipeline({ events: ['integrity', 'size'] }, new MinipassFlush({
    -        flush () {
    -          return cacheWritePromise
    -        },
    -      }))
    -      // this is always true since if we aren't reusing the one from the remote fetch, we
    -      // are using the one from cacache
    -      body.hasIntegrityEmitter = true
    -
    -      const onResume = () => {
    -        const tee = new Minipass()
    -        const cacheStream = cacache.put.stream(this.options.cachePath, this.key, cacheOpts)
    -        // re-emit the integrity and size events on our new response body so they can be reused
    -        cacheStream.on('integrity', i => body.emit('integrity', i))
    -        cacheStream.on('size', s => body.emit('size', s))
    -        // stick a flag on here so downstream users will know if they can expect integrity events
    -        tee.pipe(cacheStream)
    -        // TODO if the cache write fails, log a warning but return the response anyway
    -        // eslint-disable-next-line promise/catch-or-return
    -        cacheStream.promise().then(cacheWriteResolve, cacheWriteReject)
    -        body.unshift(tee)
    -        body.unshift(this.response.body)
    -      }
    -
    -      body.once('resume', onResume)
    -      body.once('end', () => body.removeListener('resume', onResume))
    -    } else {
    -      await cacache.index.insert(this.options.cachePath, this.key, null, cacheOpts)
    -    }
    -
    -    // note: we do not set the x-local-cache-hash header because we do not know
    -    // the hash value until after the write to the cache completes, which doesn't
    -    // happen until after the response has been sent and it's too late to write
    -    // the header anyway
    -    this.response.headers.set('x-local-cache', encodeURIComponent(this.options.cachePath))
    -    this.response.headers.set('x-local-cache-key', encodeURIComponent(this.key))
    -    this.response.headers.set('x-local-cache-mode', 'stream')
    -    this.response.headers.set('x-local-cache-status', status)
    -    this.response.headers.set('x-local-cache-time', new Date().toISOString())
    -    const newResponse = new Response(body, {
    -      url: this.response.url,
    -      status: this.response.status,
    -      headers: this.response.headers,
    -      counter: this.options.counter,
    -    })
    -    return newResponse
    -  }
    -
    -  // use the cached data to create a response and return it
    -  async respond (method, options, status) {
    -    let response
    -    if (method === 'HEAD' || [301, 308].includes(this.response.status)) {
    -      // if the request is a HEAD, or the response is a redirect,
    -      // then the metadata in the entry already includes everything
    -      // we need to build a response
    -      response = this.response
    -    } else {
    -      // we're responding with a full cached response, so create a body
    -      // that reads from cacache and attach it to a new Response
    -      const body = new Minipass()
    -      const headers = { ...this.policy.responseHeaders() }
    -
    -      const onResume = () => {
    -        const cacheStream = cacache.get.stream.byDigest(
    -          this.options.cachePath, this.entry.integrity, { memoize: this.options.memoize }
    -        )
    -        cacheStream.on('error', async (err) => {
    -          cacheStream.pause()
    -          if (err.code === 'EINTEGRITY') {
    -            await cacache.rm.content(
    -              this.options.cachePath, this.entry.integrity, { memoize: this.options.memoize }
    -            )
    -          }
    -          if (err.code === 'ENOENT' || err.code === 'EINTEGRITY') {
    -            await CacheEntry.invalidate(this.request, this.options)
    -          }
    -          body.emit('error', err)
    -          cacheStream.resume()
    -        })
    -        // emit the integrity and size events based on our metadata so we're consistent
    -        body.emit('integrity', this.entry.integrity)
    -        body.emit('size', Number(headers['content-length']))
    -        cacheStream.pipe(body)
    -      }
    -
    -      body.once('resume', onResume)
    -      body.once('end', () => body.removeListener('resume', onResume))
    -      response = new Response(body, {
    -        url: this.entry.metadata.url,
    -        counter: options.counter,
    -        status: 200,
    -        headers,
    -      })
    -    }
    -
    -    response.headers.set('x-local-cache', encodeURIComponent(this.options.cachePath))
    -    response.headers.set('x-local-cache-hash', encodeURIComponent(this.entry.integrity))
    -    response.headers.set('x-local-cache-key', encodeURIComponent(this.key))
    -    response.headers.set('x-local-cache-mode', 'stream')
    -    response.headers.set('x-local-cache-status', status)
    -    response.headers.set('x-local-cache-time', new Date(this.entry.metadata.time).toUTCString())
    -    return response
    -  }
    -
    -  // use the provided request along with this cache entry to
    -  // revalidate the stored response. returns a response, either
    -  // from the cache or from the update
    -  async revalidate (request, options) {
    -    const revalidateRequest = new Request(request, {
    -      headers: this.policy.revalidationHeaders(request),
    -    })
    -
    -    try {
    -      // NOTE: be sure to remove the headers property from the
    -      // user supplied options, since we have already defined
    -      // them on the new request object. if they're still in the
    -      // options then those will overwrite the ones from the policy
    -      var response = await remote(revalidateRequest, {
    -        ...options,
    -        headers: undefined,
    -      })
    -    } catch (err) {
    -      // if the network fetch fails, return the stale
    -      // cached response unless it has a cache-control
    -      // of 'must-revalidate'
    -      if (!this.policy.mustRevalidate) {
    -        return this.respond(request.method, options, 'stale')
    -      }
    -
    -      throw err
    -    }
    -
    -    if (this.policy.revalidated(revalidateRequest, response)) {
    -      // we got a 304, write a new index to the cache and respond from cache
    -      const metadata = getMetadata(request, response, options)
    -      // 304 responses do not include headers that are specific to the response data
    -      // since they do not include a body, so we copy values for headers that were
    -      // in the old cache entry to the new one, if the new metadata does not already
    -      // include that header
    -      for (const name of KEEP_RESPONSE_HEADERS) {
    -        if (
    -          !hasOwnProperty(metadata.resHeaders, name) &&
    -          hasOwnProperty(this.entry.metadata.resHeaders, name)
    -        ) {
    -          metadata.resHeaders[name] = this.entry.metadata.resHeaders[name]
    -        }
    -      }
    -
    -      for (const name of options.cacheAdditionalHeaders) {
    -        const inMeta = hasOwnProperty(metadata.resHeaders, name)
    -        const inEntry = hasOwnProperty(this.entry.metadata.resHeaders, name)
    -        const inPolicy = hasOwnProperty(this.policy.response.headers, name)
    -
    -        // if the header is in the existing entry, but it is not in the metadata
    -        // then we need to write it to the metadata as this will refresh the on-disk cache
    -        if (!inMeta && inEntry) {
    -          metadata.resHeaders[name] = this.entry.metadata.resHeaders[name]
    -        }
    -        // if the header is in the metadata, but not in the policy, then we need to set
    -        // it in the policy so that it's included in the immediate response. future
    -        // responses will load a new cache entry, so we don't need to change that
    -        if (!inPolicy && inMeta) {
    -          this.policy.response.headers[name] = metadata.resHeaders[name]
    -        }
    -      }
    -
    -      try {
    -        await cacache.index.insert(options.cachePath, this.key, this.entry.integrity, {
    -          size: this.entry.size,
    -          metadata,
    -        })
    -      } catch (err) {
    -        // if updating the cache index fails, we ignore it and
    -        // respond anyway
    -      }
    -      return this.respond(request.method, options, 'revalidated')
    -    }
    -
    -    // if we got a modified response, create a new entry based on it
    -    const newEntry = new CacheEntry({
    -      request,
    -      response,
    -      options,
    -    })
    -
    -    // respond with the new entry while writing it to the cache
    -    return newEntry.store('updated')
    -  }
    -}
    -
    -module.exports = CacheEntry
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/errors.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/errors.js
    deleted file mode 100644
    index 67a66573bebe66..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/errors.js
    +++ /dev/null
    @@ -1,11 +0,0 @@
    -class NotCachedError extends Error {
    -  constructor (url) {
    -    /* eslint-disable-next-line max-len */
    -    super(`request to ${url} failed: cache mode is 'only-if-cached' but no cached response is available.`)
    -    this.code = 'ENOTCACHED'
    -  }
    -}
    -
    -module.exports = {
    -  NotCachedError,
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/index.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/index.js
    deleted file mode 100644
    index 0de49d23fb9336..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/index.js
    +++ /dev/null
    @@ -1,49 +0,0 @@
    -const { NotCachedError } = require('./errors.js')
    -const CacheEntry = require('./entry.js')
    -const remote = require('../remote.js')
    -
    -// do whatever is necessary to get a Response and return it
    -const cacheFetch = async (request, options) => {
    -  // try to find a cached entry that satisfies this request
    -  const entry = await CacheEntry.find(request, options)
    -  if (!entry) {
    -    // no cached result, if the cache mode is 'only-if-cached' that's a failure
    -    if (options.cache === 'only-if-cached') {
    -      throw new NotCachedError(request.url)
    -    }
    -
    -    // otherwise, we make a request, store it and return it
    -    const response = await remote(request, options)
    -    const newEntry = new CacheEntry({ request, response, options })
    -    return newEntry.store('miss')
    -  }
    -
    -  // we have a cached response that satisfies this request, however if the cache
    -  // mode is 'no-cache' then we send the revalidation request no matter what
    -  if (options.cache === 'no-cache') {
    -    return entry.revalidate(request, options)
    -  }
    -
    -  // if the cached entry is not stale, or if the cache mode is 'force-cache' or
    -  // 'only-if-cached' we can respond with the cached entry. set the status
    -  // based on the result of needsRevalidation and respond
    -  const _needsRevalidation = entry.policy.needsRevalidation(request)
    -  if (options.cache === 'force-cache' ||
    -      options.cache === 'only-if-cached' ||
    -      !_needsRevalidation) {
    -    return entry.respond(request.method, options, _needsRevalidation ? 'stale' : 'hit')
    -  }
    -
    -  // if we got here, the cache entry is stale so revalidate it
    -  return entry.revalidate(request, options)
    -}
    -
    -cacheFetch.invalidate = async (request, options) => {
    -  if (!options.cachePath) {
    -    return
    -  }
    -
    -  return CacheEntry.invalidate(request, options)
    -}
    -
    -module.exports = cacheFetch
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/key.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/key.js
    deleted file mode 100644
    index f7684d562b7fae..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/key.js
    +++ /dev/null
    @@ -1,17 +0,0 @@
    -const { URL, format } = require('url')
    -
    -// options passed to url.format() when generating a key
    -const formatOptions = {
    -  auth: false,
    -  fragment: false,
    -  search: true,
    -  unicode: false,
    -}
    -
    -// returns a string to be used as the cache key for the Request
    -const cacheKey = (request) => {
    -  const parsed = new URL(request.url)
    -  return `make-fetch-happen:request-cache:${format(parsed, formatOptions)}`
    -}
    -
    -module.exports = cacheKey
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/policy.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/policy.js
    deleted file mode 100644
    index ada3c8600dae92..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/policy.js
    +++ /dev/null
    @@ -1,161 +0,0 @@
    -const CacheSemantics = require('http-cache-semantics')
    -const Negotiator = require('negotiator')
    -const ssri = require('ssri')
    -
    -// options passed to http-cache-semantics constructor
    -const policyOptions = {
    -  shared: false,
    -  ignoreCargoCult: true,
    -}
    -
    -// a fake empty response, used when only testing the
    -// request for storability
    -const emptyResponse = { status: 200, headers: {} }
    -
    -// returns a plain object representation of the Request
    -const requestObject = (request) => {
    -  const _obj = {
    -    method: request.method,
    -    url: request.url,
    -    headers: {},
    -    compress: request.compress,
    -  }
    -
    -  request.headers.forEach((value, key) => {
    -    _obj.headers[key] = value
    -  })
    -
    -  return _obj
    -}
    -
    -// returns a plain object representation of the Response
    -const responseObject = (response) => {
    -  const _obj = {
    -    status: response.status,
    -    headers: {},
    -  }
    -
    -  response.headers.forEach((value, key) => {
    -    _obj.headers[key] = value
    -  })
    -
    -  return _obj
    -}
    -
    -class CachePolicy {
    -  constructor ({ entry, request, response, options }) {
    -    this.entry = entry
    -    this.request = requestObject(request)
    -    this.response = responseObject(response)
    -    this.options = options
    -    this.policy = new CacheSemantics(this.request, this.response, policyOptions)
    -
    -    if (this.entry) {
    -      // if we have an entry, copy the timestamp to the _responseTime
    -      // this is necessary because the CacheSemantics constructor forces
    -      // the value to Date.now() which means a policy created from a
    -      // cache entry is likely to always identify itself as stale
    -      this.policy._responseTime = this.entry.metadata.time
    -    }
    -  }
    -
    -  // static method to quickly determine if a request alone is storable
    -  static storable (request, options) {
    -    // no cachePath means no caching
    -    if (!options.cachePath) {
    -      return false
    -    }
    -
    -    // user explicitly asked not to cache
    -    if (options.cache === 'no-store') {
    -      return false
    -    }
    -
    -    // we only cache GET and HEAD requests
    -    if (!['GET', 'HEAD'].includes(request.method)) {
    -      return false
    -    }
    -
    -    // otherwise, let http-cache-semantics make the decision
    -    // based on the request's headers
    -    const policy = new CacheSemantics(requestObject(request), emptyResponse, policyOptions)
    -    return policy.storable()
    -  }
    -
    -  // returns true if the policy satisfies the request
    -  satisfies (request) {
    -    const _req = requestObject(request)
    -    if (this.request.headers.host !== _req.headers.host) {
    -      return false
    -    }
    -
    -    if (this.request.compress !== _req.compress) {
    -      return false
    -    }
    -
    -    const negotiatorA = new Negotiator(this.request)
    -    const negotiatorB = new Negotiator(_req)
    -
    -    if (JSON.stringify(negotiatorA.mediaTypes()) !== JSON.stringify(negotiatorB.mediaTypes())) {
    -      return false
    -    }
    -
    -    if (JSON.stringify(negotiatorA.languages()) !== JSON.stringify(negotiatorB.languages())) {
    -      return false
    -    }
    -
    -    if (JSON.stringify(negotiatorA.encodings()) !== JSON.stringify(negotiatorB.encodings())) {
    -      return false
    -    }
    -
    -    if (this.options.integrity) {
    -      return ssri.parse(this.options.integrity).match(this.entry.integrity)
    -    }
    -
    -    return true
    -  }
    -
    -  // returns true if the request and response allow caching
    -  storable () {
    -    return this.policy.storable()
    -  }
    -
    -  // NOTE: this is a hack to avoid parsing the cache-control
    -  // header ourselves, it returns true if the response's
    -  // cache-control contains must-revalidate
    -  get mustRevalidate () {
    -    return !!this.policy._rescc['must-revalidate']
    -  }
    -
    -  // returns true if the cached response requires revalidation
    -  // for the given request
    -  needsRevalidation (request) {
    -    const _req = requestObject(request)
    -    // force method to GET because we only cache GETs
    -    // but can serve a HEAD from a cached GET
    -    _req.method = 'GET'
    -    return !this.policy.satisfiesWithoutRevalidation(_req)
    -  }
    -
    -  responseHeaders () {
    -    return this.policy.responseHeaders()
    -  }
    -
    -  // returns a new object containing the appropriate headers
    -  // to send a revalidation request
    -  revalidationHeaders (request) {
    -    const _req = requestObject(request)
    -    return this.policy.revalidationHeaders(_req)
    -  }
    -
    -  // returns true if the request/response was revalidated
    -  // successfully. returns false if a new response was received
    -  revalidated (request, response) {
    -    const _req = requestObject(request)
    -    const _res = responseObject(response)
    -    const policy = this.policy.revalidatedPolicy(_req, _res)
    -    return !policy.modified
    -  }
    -}
    -
    -module.exports = CachePolicy
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/dns.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/dns.js
    deleted file mode 100644
    index 13102b57c4aa06..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/dns.js
    +++ /dev/null
    @@ -1,49 +0,0 @@
    -const LRUCache = require('lru-cache')
    -const dns = require('dns')
    -
    -const defaultOptions = exports.defaultOptions = {
    -  family: undefined,
    -  hints: dns.ADDRCONFIG,
    -  all: false,
    -  verbatim: undefined,
    -}
    -
    -const lookupCache = exports.lookupCache = new LRUCache({ max: 50 })
    -
    -// this is a factory so that each request can have its own opts (i.e. ttl)
    -// while still sharing the cache across all requests
    -exports.getLookup = (dnsOptions) => {
    -  return (hostname, options, callback) => {
    -    if (typeof options === 'function') {
    -      callback = options
    -      options = null
    -    } else if (typeof options === 'number') {
    -      options = { family: options }
    -    }
    -
    -    options = { ...defaultOptions, ...options }
    -
    -    const key = JSON.stringify({
    -      hostname,
    -      family: options.family,
    -      hints: options.hints,
    -      all: options.all,
    -      verbatim: options.verbatim,
    -    })
    -
    -    if (lookupCache.has(key)) {
    -      const [address, family] = lookupCache.get(key)
    -      process.nextTick(callback, null, address, family)
    -      return
    -    }
    -
    -    dnsOptions.lookup(hostname, options, (err, address, family) => {
    -      if (err) {
    -        return callback(err)
    -      }
    -
    -      lookupCache.set(key, [address, family], { ttl: dnsOptions.ttl })
    -      return callback(null, address, family)
    -    })
    -  }
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/fetch.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/fetch.js
    deleted file mode 100644
    index 233ba67e165502..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/fetch.js
    +++ /dev/null
    @@ -1,118 +0,0 @@
    -'use strict'
    -
    -const { FetchError, Request, isRedirect } = require('minipass-fetch')
    -const url = require('url')
    -
    -const CachePolicy = require('./cache/policy.js')
    -const cache = require('./cache/index.js')
    -const remote = require('./remote.js')
    -
    -// given a Request, a Response and user options
    -// return true if the response is a redirect that
    -// can be followed. we throw errors that will result
    -// in the fetch being rejected if the redirect is
    -// possible but invalid for some reason
    -const canFollowRedirect = (request, response, options) => {
    -  if (!isRedirect(response.status)) {
    -    return false
    -  }
    -
    -  if (options.redirect === 'manual') {
    -    return false
    -  }
    -
    -  if (options.redirect === 'error') {
    -    throw new FetchError(`redirect mode is set to error: ${request.url}`,
    -      'no-redirect', { code: 'ENOREDIRECT' })
    -  }
    -
    -  if (!response.headers.has('location')) {
    -    throw new FetchError(`redirect location header missing for: ${request.url}`,
    -      'no-location', { code: 'EINVALIDREDIRECT' })
    -  }
    -
    -  if (request.counter >= request.follow) {
    -    throw new FetchError(`maximum redirect reached at: ${request.url}`,
    -      'max-redirect', { code: 'EMAXREDIRECT' })
    -  }
    -
    -  return true
    -}
    -
    -// given a Request, a Response, and the user's options return an object
    -// with a new Request and a new options object that will be used for
    -// following the redirect
    -const getRedirect = (request, response, options) => {
    -  const _opts = { ...options }
    -  const location = response.headers.get('location')
    -  const redirectUrl = new url.URL(location, /^https?:/.test(location) ? undefined : request.url)
    -  // Comment below is used under the following license:
    -  /**
    -   * @license
    -   * Copyright (c) 2010-2012 Mikeal Rogers
    -   * Licensed under the Apache License, Version 2.0 (the "License");
    -   * you may not use this file except in compliance with the License.
    -   * You may obtain a copy of the License at
    -   * http://www.apache.org/licenses/LICENSE-2.0
    -   * Unless required by applicable law or agreed to in writing,
    -   * software distributed under the License is distributed on an "AS
    -   * IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
    -   * express or implied. See the License for the specific language
    -   * governing permissions and limitations under the License.
    -   */
    -
    -  // Remove authorization if changing hostnames (but not if just
    -  // changing ports or protocols).  This matches the behavior of request:
    -  // https://github.com/request/request/blob/b12a6245/lib/redirect.js#L134-L138
    -  if (new url.URL(request.url).hostname !== redirectUrl.hostname) {
    -    request.headers.delete('authorization')
    -    request.headers.delete('cookie')
    -  }
    -
    -  // for POST request with 301/302 response, or any request with 303 response,
    -  // use GET when following redirect
    -  if (
    -    response.status === 303 ||
    -    (request.method === 'POST' && [301, 302].includes(response.status))
    -  ) {
    -    _opts.method = 'GET'
    -    _opts.body = null
    -    request.headers.delete('content-length')
    -  }
    -
    -  _opts.headers = {}
    -  request.headers.forEach((value, key) => {
    -    _opts.headers[key] = value
    -  })
    -
    -  _opts.counter = ++request.counter
    -  const redirectReq = new Request(url.format(redirectUrl), _opts)
    -  return {
    -    request: redirectReq,
    -    options: _opts,
    -  }
    -}
    -
    -const fetch = async (request, options) => {
    -  const response = CachePolicy.storable(request, options)
    -    ? await cache(request, options)
    -    : await remote(request, options)
    -
    -  // if the request wasn't a GET or HEAD, and the response
    -  // status is between 200 and 399 inclusive, invalidate the
    -  // request url
    -  if (!['GET', 'HEAD'].includes(request.method) &&
    -      response.status >= 200 &&
    -      response.status <= 399) {
    -    await cache.invalidate(request, options)
    -  }
    -
    -  if (!canFollowRedirect(request, response, options)) {
    -    return response
    -  }
    -
    -  const redirect = getRedirect(request, response, options)
    -  return fetch(redirect.request, redirect.options)
    -}
    -
    -module.exports = fetch
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/index.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/index.js
    deleted file mode 100644
    index 2f12e8e1b61131..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/index.js
    +++ /dev/null
    @@ -1,41 +0,0 @@
    -const { FetchError, Headers, Request, Response } = require('minipass-fetch')
    -
    -const configureOptions = require('./options.js')
    -const fetch = require('./fetch.js')
    -
    -const makeFetchHappen = (url, opts) => {
    -  const options = configureOptions(opts)
    -
    -  const request = new Request(url, options)
    -  return fetch(request, options)
    -}
    -
    -makeFetchHappen.defaults = (defaultUrl, defaultOptions = {}, wrappedFetch = makeFetchHappen) => {
    -  if (typeof defaultUrl === 'object') {
    -    defaultOptions = defaultUrl
    -    defaultUrl = null
    -  }
    -
    -  const defaultedFetch = (url, options = {}) => {
    -    const finalUrl = url || defaultUrl
    -    const finalOptions = {
    -      ...defaultOptions,
    -      ...options,
    -      headers: {
    -        ...defaultOptions.headers,
    -        ...options.headers,
    -      },
    -    }
    -    return wrappedFetch(finalUrl, finalOptions)
    -  }
    -
    -  defaultedFetch.defaults = (defaultUrl1, defaultOptions1 = {}) =>
    -    makeFetchHappen.defaults(defaultUrl1, defaultOptions1, defaultedFetch)
    -  return defaultedFetch
    -}
    -
    -module.exports = makeFetchHappen
    -module.exports.FetchError = FetchError
    -module.exports.Headers = Headers
    -module.exports.Request = Request
    -module.exports.Response = Response
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/options.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/options.js
    deleted file mode 100644
    index f77511279f831d..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/options.js
    +++ /dev/null
    @@ -1,54 +0,0 @@
    -const dns = require('dns')
    -
    -const conditionalHeaders = [
    -  'if-modified-since',
    -  'if-none-match',
    -  'if-unmodified-since',
    -  'if-match',
    -  'if-range',
    -]
    -
    -const configureOptions = (opts) => {
    -  const { strictSSL, ...options } = { ...opts }
    -  options.method = options.method ? options.method.toUpperCase() : 'GET'
    -  options.rejectUnauthorized = strictSSL !== false
    -
    -  if (!options.retry) {
    -    options.retry = { retries: 0 }
    -  } else if (typeof options.retry === 'string') {
    -    const retries = parseInt(options.retry, 10)
    -    if (isFinite(retries)) {
    -      options.retry = { retries }
    -    } else {
    -      options.retry = { retries: 0 }
    -    }
    -  } else if (typeof options.retry === 'number') {
    -    options.retry = { retries: options.retry }
    -  } else {
    -    options.retry = { retries: 0, ...options.retry }
    -  }
    -
    -  options.dns = { ttl: 5 * 60 * 1000, lookup: dns.lookup, ...options.dns }
    -
    -  options.cache = options.cache || 'default'
    -  if (options.cache === 'default') {
    -    const hasConditionalHeader = Object.keys(options.headers || {}).some((name) => {
    -      return conditionalHeaders.includes(name.toLowerCase())
    -    })
    -    if (hasConditionalHeader) {
    -      options.cache = 'no-store'
    -    }
    -  }
    -
    -  options.cacheAdditionalHeaders = options.cacheAdditionalHeaders || []
    -
    -  // cacheManager is deprecated, but if it's set and
    -  // cachePath is not we should copy it to the new field
    -  if (options.cacheManager && !options.cachePath) {
    -    options.cachePath = options.cacheManager
    -  }
    -
    -  return options
    -}
    -
    -module.exports = configureOptions
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/pipeline.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/pipeline.js
    deleted file mode 100644
    index b1d221b2d0ce31..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/pipeline.js
    +++ /dev/null
    @@ -1,41 +0,0 @@
    -'use strict'
    -
    -const MinipassPipeline = require('minipass-pipeline')
    -
    -class CachingMinipassPipeline extends MinipassPipeline {
    -  #events = []
    -  #data = new Map()
    -
    -  constructor (opts, ...streams) {
    -    // CRITICAL: do NOT pass the streams to the call to super(), this will start
    -    // the flow of data and potentially cause the events we need to catch to emit
    -    // before we've finished our own setup. instead we call super() with no args,
    -    // finish our setup, and then push the streams into ourselves to start the
    -    // data flow
    -    super()
    -    this.#events = opts.events
    -
    -    /* istanbul ignore next - coverage disabled because this is pointless to test here */
    -    if (streams.length) {
    -      this.push(...streams)
    -    }
    -  }
    -
    -  on (event, handler) {
    -    if (this.#events.includes(event) && this.#data.has(event)) {
    -      return handler(...this.#data.get(event))
    -    }
    -
    -    return super.on(event, handler)
    -  }
    -
    -  emit (event, ...data) {
    -    if (this.#events.includes(event)) {
    -      this.#data.set(event, data)
    -    }
    -
    -    return super.emit(event, ...data)
    -  }
    -}
    -
    -module.exports = CachingMinipassPipeline
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/remote.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/remote.js
    deleted file mode 100644
    index bdbcc79cad908d..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/remote.js
    +++ /dev/null
    @@ -1,121 +0,0 @@
    -const { Minipass } = require('minipass')
    -const fetch = require('minipass-fetch')
    -const promiseRetry = require('promise-retry')
    -const ssri = require('ssri')
    -
    -const CachingMinipassPipeline = require('./pipeline.js')
    -const getAgent = require('./agent.js')
    -const pkg = require('../package.json')
    -
    -const USER_AGENT = `${pkg.name}/${pkg.version} (+https://npm.im/${pkg.name})`
    -
    -const RETRY_ERRORS = [
    -  'ECONNRESET', // remote socket closed on us
    -  'ECONNREFUSED', // remote host refused to open connection
    -  'EADDRINUSE', // failed to bind to a local port (proxy?)
    -  'ETIMEDOUT', // someone in the transaction is WAY TOO SLOW
    -  'ERR_SOCKET_TIMEOUT', // same as above, but this one comes from agentkeepalive
    -  // Known codes we do NOT retry on:
    -  // ENOTFOUND (getaddrinfo failure. Either bad hostname, or offline)
    -]
    -
    -const RETRY_TYPES = [
    -  'request-timeout',
    -]
    -
    -// make a request directly to the remote source,
    -// retrying certain classes of errors as well as
    -// following redirects (through the cache if necessary)
    -// and verifying response integrity
    -const remoteFetch = (request, options) => {
    -  const agent = getAgent(request.url, options)
    -  if (!request.headers.has('connection')) {
    -    request.headers.set('connection', agent ? 'keep-alive' : 'close')
    -  }
    -
    -  if (!request.headers.has('user-agent')) {
    -    request.headers.set('user-agent', USER_AGENT)
    -  }
    -
    -  // keep our own options since we're overriding the agent
    -  // and the redirect mode
    -  const _opts = {
    -    ...options,
    -    agent,
    -    redirect: 'manual',
    -  }
    -
    -  return promiseRetry(async (retryHandler, attemptNum) => {
    -    const req = new fetch.Request(request, _opts)
    -    try {
    -      let res = await fetch(req, _opts)
    -      if (_opts.integrity && res.status === 200) {
    -        // we got a 200 response and the user has specified an expected
    -        // integrity value, so wrap the response in an ssri stream to verify it
    -        const integrityStream = ssri.integrityStream({
    -          algorithms: _opts.algorithms,
    -          integrity: _opts.integrity,
    -          size: _opts.size,
    -        })
    -        const pipeline = new CachingMinipassPipeline({
    -          events: ['integrity', 'size'],
    -        }, res.body, integrityStream)
    -        // we also propagate the integrity and size events out to the pipeline so we can use
    -        // this new response body as an integrityEmitter for cacache
    -        integrityStream.on('integrity', i => pipeline.emit('integrity', i))
    -        integrityStream.on('size', s => pipeline.emit('size', s))
    -        res = new fetch.Response(pipeline, res)
    -        // set an explicit flag so we know if our response body will emit integrity and size
    -        res.body.hasIntegrityEmitter = true
    -      }
    -
    -      res.headers.set('x-fetch-attempts', attemptNum)
    -
    -      // do not retry POST requests, or requests with a streaming body
    -      // do retry requests with a 408, 420, 429 or 500+ status in the response
    -      const isStream = Minipass.isStream(req.body)
    -      const isRetriable = req.method !== 'POST' &&
    -          !isStream &&
    -          ([408, 420, 429].includes(res.status) || res.status >= 500)
    -
    -      if (isRetriable) {
    -        if (typeof options.onRetry === 'function') {
    -          options.onRetry(res)
    -        }
    -
    -        return retryHandler(res)
    -      }
    -
    -      return res
    -    } catch (err) {
    -      const code = (err.code === 'EPROMISERETRY')
    -        ? err.retried.code
    -        : err.code
    -
    -      // err.retried will be the thing that was thrown from above
    -      // if it's a response, we just got a bad status code and we
    -      // can re-throw to allow the retry
    -      const isRetryError = err.retried instanceof fetch.Response ||
    -        (RETRY_ERRORS.includes(code) && RETRY_TYPES.includes(err.type))
    -
    -      if (req.method === 'POST' || isRetryError) {
    -        throw err
    -      }
    -
    -      if (typeof options.onRetry === 'function') {
    -        options.onRetry(err)
    -      }
    -
    -      return retryHandler(err)
    -    }
    -  }, options.retry).catch((err) => {
    -    // don't reject for http errors, just return them
    -    if (err.status >= 400 && err.type !== 'system') {
    -      return err
    -    }
    -
    -    throw err
    -  })
    -}
    -
    -module.exports = remoteFetch
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/package.json b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/package.json
    deleted file mode 100644
    index fd415dc9966faa..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/package.json
    +++ /dev/null
    @@ -1,78 +0,0 @@
    -{
    -  "name": "make-fetch-happen",
    -  "version": "11.1.1",
    -  "description": "Opinionated, caching, retrying fetch client",
    -  "main": "lib/index.js",
    -  "files": [
    -    "bin/",
    -    "lib/"
    -  ],
    -  "scripts": {
    -    "test": "tap",
    -    "posttest": "npm run lint",
    -    "eslint": "eslint",
    -    "lint": "eslint \"**/*.js\"",
    -    "lintfix": "npm run lint -- --fix",
    -    "postlint": "template-oss-check",
    -    "snap": "tap",
    -    "template-oss-apply": "template-oss-apply --force"
    -  },
    -  "repository": {
    -    "type": "git",
    -    "url": "https://github.com/npm/make-fetch-happen.git"
    -  },
    -  "keywords": [
    -    "http",
    -    "request",
    -    "fetch",
    -    "mean girls",
    -    "caching",
    -    "cache",
    -    "subresource integrity"
    -  ],
    -  "author": "GitHub Inc.",
    -  "license": "ISC",
    -  "dependencies": {
    -    "agentkeepalive": "^4.2.1",
    -    "cacache": "^17.0.0",
    -    "http-cache-semantics": "^4.1.1",
    -    "http-proxy-agent": "^5.0.0",
    -    "https-proxy-agent": "^5.0.0",
    -    "is-lambda": "^1.0.1",
    -    "lru-cache": "^7.7.1",
    -    "minipass": "^5.0.0",
    -    "minipass-fetch": "^3.0.0",
    -    "minipass-flush": "^1.0.5",
    -    "minipass-pipeline": "^1.2.4",
    -    "negotiator": "^0.6.3",
    -    "promise-retry": "^2.0.1",
    -    "socks-proxy-agent": "^7.0.0",
    -    "ssri": "^10.0.0"
    -  },
    -  "devDependencies": {
    -    "@npmcli/eslint-config": "^4.0.0",
    -    "@npmcli/template-oss": "4.14.1",
    -    "nock": "^13.2.4",
    -    "safe-buffer": "^5.2.1",
    -    "standard-version": "^9.3.2",
    -    "tap": "^16.0.0"
    -  },
    -  "engines": {
    -    "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
    -  },
    -  "tap": {
    -    "color": 1,
    -    "files": "test/*.js",
    -    "check-coverage": true,
    -    "timeout": 60,
    -    "nyc-arg": [
    -      "--exclude",
    -      "tap-snapshots/**"
    -    ]
    -  },
    -  "templateOSS": {
    -    "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "version": "4.14.1",
    -    "publish": "true"
    -  }
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/minimatch/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/minimatch/LICENSE
    deleted file mode 100644
    index 19129e315fe593..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/minimatch/LICENSE
    +++ /dev/null
    @@ -1,15 +0,0 @@
    -The ISC License
    -
    -Copyright (c) Isaac Z. Schlueter and Contributors
    -
    -Permission to use, copy, modify, and/or distribute this software for any
    -purpose with or without fee is hereby granted, provided that the above
    -copyright notice and this permission notice appear in all copies.
    -
    -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
    -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/minimatch/minimatch.js b/deps/npm/node_modules/node-gyp/node_modules/minimatch/minimatch.js
    deleted file mode 100644
    index fda45ade7cfc35..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/minimatch/minimatch.js
    +++ /dev/null
    @@ -1,947 +0,0 @@
    -module.exports = minimatch
    -minimatch.Minimatch = Minimatch
    -
    -var path = (function () { try { return require('path') } catch (e) {}}()) || {
    -  sep: '/'
    -}
    -minimatch.sep = path.sep
    -
    -var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
    -var expand = require('brace-expansion')
    -
    -var plTypes = {
    -  '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
    -  '?': { open: '(?:', close: ')?' },
    -  '+': { open: '(?:', close: ')+' },
    -  '*': { open: '(?:', close: ')*' },
    -  '@': { open: '(?:', close: ')' }
    -}
    -
    -// any single thing other than /
    -// don't need to escape / when using new RegExp()
    -var qmark = '[^/]'
    -
    -// * => any number of characters
    -var star = qmark + '*?'
    -
    -// ** when dots are allowed.  Anything goes, except .. and .
    -// not (^ or / followed by one or two dots followed by $ or /),
    -// followed by anything, any number of times.
    -var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?'
    -
    -// not a ^ or / followed by a dot,
    -// followed by anything, any number of times.
    -var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?'
    -
    -// characters that need to be escaped in RegExp.
    -var reSpecials = charSet('().*{}+?[]^$\\!')
    -
    -// "abc" -> { a:true, b:true, c:true }
    -function charSet (s) {
    -  return s.split('').reduce(function (set, c) {
    -    set[c] = true
    -    return set
    -  }, {})
    -}
    -
    -// normalizes slashes.
    -var slashSplit = /\/+/
    -
    -minimatch.filter = filter
    -function filter (pattern, options) {
    -  options = options || {}
    -  return function (p, i, list) {
    -    return minimatch(p, pattern, options)
    -  }
    -}
    -
    -function ext (a, b) {
    -  b = b || {}
    -  var t = {}
    -  Object.keys(a).forEach(function (k) {
    -    t[k] = a[k]
    -  })
    -  Object.keys(b).forEach(function (k) {
    -    t[k] = b[k]
    -  })
    -  return t
    -}
    -
    -minimatch.defaults = function (def) {
    -  if (!def || typeof def !== 'object' || !Object.keys(def).length) {
    -    return minimatch
    -  }
    -
    -  var orig = minimatch
    -
    -  var m = function minimatch (p, pattern, options) {
    -    return orig(p, pattern, ext(def, options))
    -  }
    -
    -  m.Minimatch = function Minimatch (pattern, options) {
    -    return new orig.Minimatch(pattern, ext(def, options))
    -  }
    -  m.Minimatch.defaults = function defaults (options) {
    -    return orig.defaults(ext(def, options)).Minimatch
    -  }
    -
    -  m.filter = function filter (pattern, options) {
    -    return orig.filter(pattern, ext(def, options))
    -  }
    -
    -  m.defaults = function defaults (options) {
    -    return orig.defaults(ext(def, options))
    -  }
    -
    -  m.makeRe = function makeRe (pattern, options) {
    -    return orig.makeRe(pattern, ext(def, options))
    -  }
    -
    -  m.braceExpand = function braceExpand (pattern, options) {
    -    return orig.braceExpand(pattern, ext(def, options))
    -  }
    -
    -  m.match = function (list, pattern, options) {
    -    return orig.match(list, pattern, ext(def, options))
    -  }
    -
    -  return m
    -}
    -
    -Minimatch.defaults = function (def) {
    -  return minimatch.defaults(def).Minimatch
    -}
    -
    -function minimatch (p, pattern, options) {
    -  assertValidPattern(pattern)
    -
    -  if (!options) options = {}
    -
    -  // shortcut: comments match nothing.
    -  if (!options.nocomment && pattern.charAt(0) === '#') {
    -    return false
    -  }
    -
    -  return new Minimatch(pattern, options).match(p)
    -}
    -
    -function Minimatch (pattern, options) {
    -  if (!(this instanceof Minimatch)) {
    -    return new Minimatch(pattern, options)
    -  }
    -
    -  assertValidPattern(pattern)
    -
    -  if (!options) options = {}
    -
    -  pattern = pattern.trim()
    -
    -  // windows support: need to use /, not \
    -  if (!options.allowWindowsEscape && path.sep !== '/') {
    -    pattern = pattern.split(path.sep).join('/')
    -  }
    -
    -  this.options = options
    -  this.set = []
    -  this.pattern = pattern
    -  this.regexp = null
    -  this.negate = false
    -  this.comment = false
    -  this.empty = false
    -  this.partial = !!options.partial
    -
    -  // make the set of regexps etc.
    -  this.make()
    -}
    -
    -Minimatch.prototype.debug = function () {}
    -
    -Minimatch.prototype.make = make
    -function make () {
    -  var pattern = this.pattern
    -  var options = this.options
    -
    -  // empty patterns and comments match nothing.
    -  if (!options.nocomment && pattern.charAt(0) === '#') {
    -    this.comment = true
    -    return
    -  }
    -  if (!pattern) {
    -    this.empty = true
    -    return
    -  }
    -
    -  // step 1: figure out negation, etc.
    -  this.parseNegate()
    -
    -  // step 2: expand braces
    -  var set = this.globSet = this.braceExpand()
    -
    -  if (options.debug) this.debug = function debug() { console.error.apply(console, arguments) }
    -
    -  this.debug(this.pattern, set)
    -
    -  // step 3: now we have a set, so turn each one into a series of path-portion
    -  // matching patterns.
    -  // These will be regexps, except in the case of "**", which is
    -  // set to the GLOBSTAR object for globstar behavior,
    -  // and will not contain any / characters
    -  set = this.globParts = set.map(function (s) {
    -    return s.split(slashSplit)
    -  })
    -
    -  this.debug(this.pattern, set)
    -
    -  // glob --> regexps
    -  set = set.map(function (s, si, set) {
    -    return s.map(this.parse, this)
    -  }, this)
    -
    -  this.debug(this.pattern, set)
    -
    -  // filter out everything that didn't compile properly.
    -  set = set.filter(function (s) {
    -    return s.indexOf(false) === -1
    -  })
    -
    -  this.debug(this.pattern, set)
    -
    -  this.set = set
    -}
    -
    -Minimatch.prototype.parseNegate = parseNegate
    -function parseNegate () {
    -  var pattern = this.pattern
    -  var negate = false
    -  var options = this.options
    -  var negateOffset = 0
    -
    -  if (options.nonegate) return
    -
    -  for (var i = 0, l = pattern.length
    -    ; i < l && pattern.charAt(i) === '!'
    -    ; i++) {
    -    negate = !negate
    -    negateOffset++
    -  }
    -
    -  if (negateOffset) this.pattern = pattern.substr(negateOffset)
    -  this.negate = negate
    -}
    -
    -// Brace expansion:
    -// a{b,c}d -> abd acd
    -// a{b,}c -> abc ac
    -// a{0..3}d -> a0d a1d a2d a3d
    -// a{b,c{d,e}f}g -> abg acdfg acefg
    -// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
    -//
    -// Invalid sets are not expanded.
    -// a{2..}b -> a{2..}b
    -// a{b}c -> a{b}c
    -minimatch.braceExpand = function (pattern, options) {
    -  return braceExpand(pattern, options)
    -}
    -
    -Minimatch.prototype.braceExpand = braceExpand
    -
    -function braceExpand (pattern, options) {
    -  if (!options) {
    -    if (this instanceof Minimatch) {
    -      options = this.options
    -    } else {
    -      options = {}
    -    }
    -  }
    -
    -  pattern = typeof pattern === 'undefined'
    -    ? this.pattern : pattern
    -
    -  assertValidPattern(pattern)
    -
    -  // Thanks to Yeting Li  for
    -  // improving this regexp to avoid a ReDOS vulnerability.
    -  if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
    -    // shortcut. no need to expand.
    -    return [pattern]
    -  }
    -
    -  return expand(pattern)
    -}
    -
    -var MAX_PATTERN_LENGTH = 1024 * 64
    -var assertValidPattern = function (pattern) {
    -  if (typeof pattern !== 'string') {
    -    throw new TypeError('invalid pattern')
    -  }
    -
    -  if (pattern.length > MAX_PATTERN_LENGTH) {
    -    throw new TypeError('pattern is too long')
    -  }
    -}
    -
    -// parse a component of the expanded set.
    -// At this point, no pattern may contain "/" in it
    -// so we're going to return a 2d array, where each entry is the full
    -// pattern, split on '/', and then turned into a regular expression.
    -// A regexp is made at the end which joins each array with an
    -// escaped /, and another full one which joins each regexp with |.
    -//
    -// Following the lead of Bash 4.1, note that "**" only has special meaning
    -// when it is the *only* thing in a path portion.  Otherwise, any series
    -// of * is equivalent to a single *.  Globstar behavior is enabled by
    -// default, and can be disabled by setting options.noglobstar.
    -Minimatch.prototype.parse = parse
    -var SUBPARSE = {}
    -function parse (pattern, isSub) {
    -  assertValidPattern(pattern)
    -
    -  var options = this.options
    -
    -  // shortcuts
    -  if (pattern === '**') {
    -    if (!options.noglobstar)
    -      return GLOBSTAR
    -    else
    -      pattern = '*'
    -  }
    -  if (pattern === '') return ''
    -
    -  var re = ''
    -  var hasMagic = !!options.nocase
    -  var escaping = false
    -  // ? => one single character
    -  var patternListStack = []
    -  var negativeLists = []
    -  var stateChar
    -  var inClass = false
    -  var reClassStart = -1
    -  var classStart = -1
    -  // . and .. never match anything that doesn't start with .,
    -  // even when options.dot is set.
    -  var patternStart = pattern.charAt(0) === '.' ? '' // anything
    -  // not (start or / followed by . or .. followed by / or end)
    -  : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
    -  : '(?!\\.)'
    -  var self = this
    -
    -  function clearStateChar () {
    -    if (stateChar) {
    -      // we had some state-tracking character
    -      // that wasn't consumed by this pass.
    -      switch (stateChar) {
    -        case '*':
    -          re += star
    -          hasMagic = true
    -        break
    -        case '?':
    -          re += qmark
    -          hasMagic = true
    -        break
    -        default:
    -          re += '\\' + stateChar
    -        break
    -      }
    -      self.debug('clearStateChar %j %j', stateChar, re)
    -      stateChar = false
    -    }
    -  }
    -
    -  for (var i = 0, len = pattern.length, c
    -    ; (i < len) && (c = pattern.charAt(i))
    -    ; i++) {
    -    this.debug('%s\t%s %s %j', pattern, i, re, c)
    -
    -    // skip over any that are escaped.
    -    if (escaping && reSpecials[c]) {
    -      re += '\\' + c
    -      escaping = false
    -      continue
    -    }
    -
    -    switch (c) {
    -      /* istanbul ignore next */
    -      case '/': {
    -        // completely not allowed, even escaped.
    -        // Should already be path-split by now.
    -        return false
    -      }
    -
    -      case '\\':
    -        clearStateChar()
    -        escaping = true
    -      continue
    -
    -      // the various stateChar values
    -      // for the "extglob" stuff.
    -      case '?':
    -      case '*':
    -      case '+':
    -      case '@':
    -      case '!':
    -        this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c)
    -
    -        // all of those are literals inside a class, except that
    -        // the glob [!a] means [^a] in regexp
    -        if (inClass) {
    -          this.debug('  in class')
    -          if (c === '!' && i === classStart + 1) c = '^'
    -          re += c
    -          continue
    -        }
    -
    -        // if we already have a stateChar, then it means
    -        // that there was something like ** or +? in there.
    -        // Handle the stateChar, then proceed with this one.
    -        self.debug('call clearStateChar %j', stateChar)
    -        clearStateChar()
    -        stateChar = c
    -        // if extglob is disabled, then +(asdf|foo) isn't a thing.
    -        // just clear the statechar *now*, rather than even diving into
    -        // the patternList stuff.
    -        if (options.noext) clearStateChar()
    -      continue
    -
    -      case '(':
    -        if (inClass) {
    -          re += '('
    -          continue
    -        }
    -
    -        if (!stateChar) {
    -          re += '\\('
    -          continue
    -        }
    -
    -        patternListStack.push({
    -          type: stateChar,
    -          start: i - 1,
    -          reStart: re.length,
    -          open: plTypes[stateChar].open,
    -          close: plTypes[stateChar].close
    -        })
    -        // negation is (?:(?!js)[^/]*)
    -        re += stateChar === '!' ? '(?:(?!(?:' : '(?:'
    -        this.debug('plType %j %j', stateChar, re)
    -        stateChar = false
    -      continue
    -
    -      case ')':
    -        if (inClass || !patternListStack.length) {
    -          re += '\\)'
    -          continue
    -        }
    -
    -        clearStateChar()
    -        hasMagic = true
    -        var pl = patternListStack.pop()
    -        // negation is (?:(?!js)[^/]*)
    -        // The others are (?:)
    -        re += pl.close
    -        if (pl.type === '!') {
    -          negativeLists.push(pl)
    -        }
    -        pl.reEnd = re.length
    -      continue
    -
    -      case '|':
    -        if (inClass || !patternListStack.length || escaping) {
    -          re += '\\|'
    -          escaping = false
    -          continue
    -        }
    -
    -        clearStateChar()
    -        re += '|'
    -      continue
    -
    -      // these are mostly the same in regexp and glob
    -      case '[':
    -        // swallow any state-tracking char before the [
    -        clearStateChar()
    -
    -        if (inClass) {
    -          re += '\\' + c
    -          continue
    -        }
    -
    -        inClass = true
    -        classStart = i
    -        reClassStart = re.length
    -        re += c
    -      continue
    -
    -      case ']':
    -        //  a right bracket shall lose its special
    -        //  meaning and represent itself in
    -        //  a bracket expression if it occurs
    -        //  first in the list.  -- POSIX.2 2.8.3.2
    -        if (i === classStart + 1 || !inClass) {
    -          re += '\\' + c
    -          escaping = false
    -          continue
    -        }
    -
    -        // handle the case where we left a class open.
    -        // "[z-a]" is valid, equivalent to "\[z-a\]"
    -        // split where the last [ was, make sure we don't have
    -        // an invalid re. if so, re-walk the contents of the
    -        // would-be class to re-translate any characters that
    -        // were passed through as-is
    -        // TODO: It would probably be faster to determine this
    -        // without a try/catch and a new RegExp, but it's tricky
    -        // to do safely.  For now, this is safe and works.
    -        var cs = pattern.substring(classStart + 1, i)
    -        try {
    -          RegExp('[' + cs + ']')
    -        } catch (er) {
    -          // not a valid class!
    -          var sp = this.parse(cs, SUBPARSE)
    -          re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
    -          hasMagic = hasMagic || sp[1]
    -          inClass = false
    -          continue
    -        }
    -
    -        // finish up the class.
    -        hasMagic = true
    -        inClass = false
    -        re += c
    -      continue
    -
    -      default:
    -        // swallow any state char that wasn't consumed
    -        clearStateChar()
    -
    -        if (escaping) {
    -          // no need
    -          escaping = false
    -        } else if (reSpecials[c]
    -          && !(c === '^' && inClass)) {
    -          re += '\\'
    -        }
    -
    -        re += c
    -
    -    } // switch
    -  } // for
    -
    -  // handle the case where we left a class open.
    -  // "[abc" is valid, equivalent to "\[abc"
    -  if (inClass) {
    -    // split where the last [ was, and escape it
    -    // this is a huge pita.  We now have to re-walk
    -    // the contents of the would-be class to re-translate
    -    // any characters that were passed through as-is
    -    cs = pattern.substr(classStart + 1)
    -    sp = this.parse(cs, SUBPARSE)
    -    re = re.substr(0, reClassStart) + '\\[' + sp[0]
    -    hasMagic = hasMagic || sp[1]
    -  }
    -
    -  // handle the case where we had a +( thing at the *end*
    -  // of the pattern.
    -  // each pattern list stack adds 3 chars, and we need to go through
    -  // and escape any | chars that were passed through as-is for the regexp.
    -  // Go through and escape them, taking care not to double-escape any
    -  // | chars that were already escaped.
    -  for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
    -    var tail = re.slice(pl.reStart + pl.open.length)
    -    this.debug('setting tail', re, pl)
    -    // maybe some even number of \, then maybe 1 \, followed by a |
    -    tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {
    -      if (!$2) {
    -        // the | isn't already escaped, so escape it.
    -        $2 = '\\'
    -      }
    -
    -      // need to escape all those slashes *again*, without escaping the
    -      // one that we need for escaping the | character.  As it works out,
    -      // escaping an even number of slashes can be done by simply repeating
    -      // it exactly after itself.  That's why this trick works.
    -      //
    -      // I am sorry that you have to see this.
    -      return $1 + $1 + $2 + '|'
    -    })
    -
    -    this.debug('tail=%j\n   %s', tail, tail, pl, re)
    -    var t = pl.type === '*' ? star
    -      : pl.type === '?' ? qmark
    -      : '\\' + pl.type
    -
    -    hasMagic = true
    -    re = re.slice(0, pl.reStart) + t + '\\(' + tail
    -  }
    -
    -  // handle trailing things that only matter at the very end.
    -  clearStateChar()
    -  if (escaping) {
    -    // trailing \\
    -    re += '\\\\'
    -  }
    -
    -  // only need to apply the nodot start if the re starts with
    -  // something that could conceivably capture a dot
    -  var addPatternStart = false
    -  switch (re.charAt(0)) {
    -    case '[': case '.': case '(': addPatternStart = true
    -  }
    -
    -  // Hack to work around lack of negative lookbehind in JS
    -  // A pattern like: *.!(x).!(y|z) needs to ensure that a name
    -  // like 'a.xyz.yz' doesn't match.  So, the first negative
    -  // lookahead, has to look ALL the way ahead, to the end of
    -  // the pattern.
    -  for (var n = negativeLists.length - 1; n > -1; n--) {
    -    var nl = negativeLists[n]
    -
    -    var nlBefore = re.slice(0, nl.reStart)
    -    var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)
    -    var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)
    -    var nlAfter = re.slice(nl.reEnd)
    -
    -    nlLast += nlAfter
    -
    -    // Handle nested stuff like *(*.js|!(*.json)), where open parens
    -    // mean that we should *not* include the ) in the bit that is considered
    -    // "after" the negated section.
    -    var openParensBefore = nlBefore.split('(').length - 1
    -    var cleanAfter = nlAfter
    -    for (i = 0; i < openParensBefore; i++) {
    -      cleanAfter = cleanAfter.replace(/\)[+*?]?/, '')
    -    }
    -    nlAfter = cleanAfter
    -
    -    var dollar = ''
    -    if (nlAfter === '' && isSub !== SUBPARSE) {
    -      dollar = '$'
    -    }
    -    var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast
    -    re = newRe
    -  }
    -
    -  // if the re is not "" at this point, then we need to make sure
    -  // it doesn't match against an empty path part.
    -  // Otherwise a/* will match a/, which it should not.
    -  if (re !== '' && hasMagic) {
    -    re = '(?=.)' + re
    -  }
    -
    -  if (addPatternStart) {
    -    re = patternStart + re
    -  }
    -
    -  // parsing just a piece of a larger pattern.
    -  if (isSub === SUBPARSE) {
    -    return [re, hasMagic]
    -  }
    -
    -  // skip the regexp for non-magical patterns
    -  // unescape anything in it, though, so that it'll be
    -  // an exact match against a file etc.
    -  if (!hasMagic) {
    -    return globUnescape(pattern)
    -  }
    -
    -  var flags = options.nocase ? 'i' : ''
    -  try {
    -    var regExp = new RegExp('^' + re + '$', flags)
    -  } catch (er) /* istanbul ignore next - should be impossible */ {
    -    // If it was an invalid regular expression, then it can't match
    -    // anything.  This trick looks for a character after the end of
    -    // the string, which is of course impossible, except in multi-line
    -    // mode, but it's not a /m regex.
    -    return new RegExp('$.')
    -  }
    -
    -  regExp._glob = pattern
    -  regExp._src = re
    -
    -  return regExp
    -}
    -
    -minimatch.makeRe = function (pattern, options) {
    -  return new Minimatch(pattern, options || {}).makeRe()
    -}
    -
    -Minimatch.prototype.makeRe = makeRe
    -function makeRe () {
    -  if (this.regexp || this.regexp === false) return this.regexp
    -
    -  // at this point, this.set is a 2d array of partial
    -  // pattern strings, or "**".
    -  //
    -  // It's better to use .match().  This function shouldn't
    -  // be used, really, but it's pretty convenient sometimes,
    -  // when you just want to work with a regex.
    -  var set = this.set
    -
    -  if (!set.length) {
    -    this.regexp = false
    -    return this.regexp
    -  }
    -  var options = this.options
    -
    -  var twoStar = options.noglobstar ? star
    -    : options.dot ? twoStarDot
    -    : twoStarNoDot
    -  var flags = options.nocase ? 'i' : ''
    -
    -  var re = set.map(function (pattern) {
    -    return pattern.map(function (p) {
    -      return (p === GLOBSTAR) ? twoStar
    -      : (typeof p === 'string') ? regExpEscape(p)
    -      : p._src
    -    }).join('\\\/')
    -  }).join('|')
    -
    -  // must match entire pattern
    -  // ending in a * or ** will make it less strict.
    -  re = '^(?:' + re + ')$'
    -
    -  // can match anything, as long as it's not this.
    -  if (this.negate) re = '^(?!' + re + ').*$'
    -
    -  try {
    -    this.regexp = new RegExp(re, flags)
    -  } catch (ex) /* istanbul ignore next - should be impossible */ {
    -    this.regexp = false
    -  }
    -  return this.regexp
    -}
    -
    -minimatch.match = function (list, pattern, options) {
    -  options = options || {}
    -  var mm = new Minimatch(pattern, options)
    -  list = list.filter(function (f) {
    -    return mm.match(f)
    -  })
    -  if (mm.options.nonull && !list.length) {
    -    list.push(pattern)
    -  }
    -  return list
    -}
    -
    -Minimatch.prototype.match = function match (f, partial) {
    -  if (typeof partial === 'undefined') partial = this.partial
    -  this.debug('match', f, this.pattern)
    -  // short-circuit in the case of busted things.
    -  // comments, etc.
    -  if (this.comment) return false
    -  if (this.empty) return f === ''
    -
    -  if (f === '/' && partial) return true
    -
    -  var options = this.options
    -
    -  // windows: need to use /, not \
    -  if (path.sep !== '/') {
    -    f = f.split(path.sep).join('/')
    -  }
    -
    -  // treat the test path as a set of pathparts.
    -  f = f.split(slashSplit)
    -  this.debug(this.pattern, 'split', f)
    -
    -  // just ONE of the pattern sets in this.set needs to match
    -  // in order for it to be valid.  If negating, then just one
    -  // match means that we have failed.
    -  // Either way, return on the first hit.
    -
    -  var set = this.set
    -  this.debug(this.pattern, 'set', set)
    -
    -  // Find the basename of the path by looking for the last non-empty segment
    -  var filename
    -  var i
    -  for (i = f.length - 1; i >= 0; i--) {
    -    filename = f[i]
    -    if (filename) break
    -  }
    -
    -  for (i = 0; i < set.length; i++) {
    -    var pattern = set[i]
    -    var file = f
    -    if (options.matchBase && pattern.length === 1) {
    -      file = [filename]
    -    }
    -    var hit = this.matchOne(file, pattern, partial)
    -    if (hit) {
    -      if (options.flipNegate) return true
    -      return !this.negate
    -    }
    -  }
    -
    -  // didn't get any hits.  this is success if it's a negative
    -  // pattern, failure otherwise.
    -  if (options.flipNegate) return false
    -  return this.negate
    -}
    -
    -// set partial to true to test if, for example,
    -// "/a/b" matches the start of "/*/b/*/d"
    -// Partial means, if you run out of file before you run
    -// out of pattern, then that's fine, as long as all
    -// the parts match.
    -Minimatch.prototype.matchOne = function (file, pattern, partial) {
    -  var options = this.options
    -
    -  this.debug('matchOne',
    -    { 'this': this, file: file, pattern: pattern })
    -
    -  this.debug('matchOne', file.length, pattern.length)
    -
    -  for (var fi = 0,
    -      pi = 0,
    -      fl = file.length,
    -      pl = pattern.length
    -      ; (fi < fl) && (pi < pl)
    -      ; fi++, pi++) {
    -    this.debug('matchOne loop')
    -    var p = pattern[pi]
    -    var f = file[fi]
    -
    -    this.debug(pattern, p, f)
    -
    -    // should be impossible.
    -    // some invalid regexp stuff in the set.
    -    /* istanbul ignore if */
    -    if (p === false) return false
    -
    -    if (p === GLOBSTAR) {
    -      this.debug('GLOBSTAR', [pattern, p, f])
    -
    -      // "**"
    -      // a/**/b/**/c would match the following:
    -      // a/b/x/y/z/c
    -      // a/x/y/z/b/c
    -      // a/b/x/b/x/c
    -      // a/b/c
    -      // To do this, take the rest of the pattern after
    -      // the **, and see if it would match the file remainder.
    -      // If so, return success.
    -      // If not, the ** "swallows" a segment, and try again.
    -      // This is recursively awful.
    -      //
    -      // a/**/b/**/c matching a/b/x/y/z/c
    -      // - a matches a
    -      // - doublestar
    -      //   - matchOne(b/x/y/z/c, b/**/c)
    -      //     - b matches b
    -      //     - doublestar
    -      //       - matchOne(x/y/z/c, c) -> no
    -      //       - matchOne(y/z/c, c) -> no
    -      //       - matchOne(z/c, c) -> no
    -      //       - matchOne(c, c) yes, hit
    -      var fr = fi
    -      var pr = pi + 1
    -      if (pr === pl) {
    -        this.debug('** at the end')
    -        // a ** at the end will just swallow the rest.
    -        // We have found a match.
    -        // however, it will not swallow /.x, unless
    -        // options.dot is set.
    -        // . and .. are *never* matched by **, for explosively
    -        // exponential reasons.
    -        for (; fi < fl; fi++) {
    -          if (file[fi] === '.' || file[fi] === '..' ||
    -            (!options.dot && file[fi].charAt(0) === '.')) return false
    -        }
    -        return true
    -      }
    -
    -      // ok, let's see if we can swallow whatever we can.
    -      while (fr < fl) {
    -        var swallowee = file[fr]
    -
    -        this.debug('\nglobstar while', file, fr, pattern, pr, swallowee)
    -
    -        // XXX remove this slice.  Just pass the start index.
    -        if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
    -          this.debug('globstar found match!', fr, fl, swallowee)
    -          // found a match.
    -          return true
    -        } else {
    -          // can't swallow "." or ".." ever.
    -          // can only swallow ".foo" when explicitly asked.
    -          if (swallowee === '.' || swallowee === '..' ||
    -            (!options.dot && swallowee.charAt(0) === '.')) {
    -            this.debug('dot detected!', file, fr, pattern, pr)
    -            break
    -          }
    -
    -          // ** swallows a segment, and continue.
    -          this.debug('globstar swallow a segment, and continue')
    -          fr++
    -        }
    -      }
    -
    -      // no match was found.
    -      // However, in partial mode, we can't say this is necessarily over.
    -      // If there's more *pattern* left, then
    -      /* istanbul ignore if */
    -      if (partial) {
    -        // ran out of file
    -        this.debug('\n>>> no match, partial?', file, fr, pattern, pr)
    -        if (fr === fl) return true
    -      }
    -      return false
    -    }
    -
    -    // something other than **
    -    // non-magic patterns just have to match exactly
    -    // patterns with magic have been turned into regexps.
    -    var hit
    -    if (typeof p === 'string') {
    -      hit = f === p
    -      this.debug('string match', p, f, hit)
    -    } else {
    -      hit = f.match(p)
    -      this.debug('pattern match', p, f, hit)
    -    }
    -
    -    if (!hit) return false
    -  }
    -
    -  // Note: ending in / means that we'll get a final ""
    -  // at the end of the pattern.  This can only match a
    -  // corresponding "" at the end of the file.
    -  // If the file ends in /, then it can only match a
    -  // a pattern that ends in /, unless the pattern just
    -  // doesn't have any more for it. But, a/b/ should *not*
    -  // match "a/b/*", even though "" matches against the
    -  // [^/]*? pattern, except in partial mode, where it might
    -  // simply not be reached yet.
    -  // However, a/b/ should still satisfy a/*
    -
    -  // now either we fell off the end of the pattern, or we're done.
    -  if (fi === fl && pi === pl) {
    -    // ran out of pattern and filename at the same time.
    -    // an exact hit!
    -    return true
    -  } else if (fi === fl) {
    -    // ran out of file, but still had pattern left.
    -    // this is ok if we're doing the match as part of
    -    // a glob fs traversal.
    -    return partial
    -  } else /* istanbul ignore else */ if (pi === pl) {
    -    // ran out of pattern, still have file left.
    -    // this is only acceptable if we're on the very last
    -    // empty segment of a file with a trailing slash.
    -    // a/* should match a/b/
    -    return (fi === fl - 1) && (file[fi] === '')
    -  }
    -
    -  // should be unreachable.
    -  /* istanbul ignore next */
    -  throw new Error('wtf?')
    -}
    -
    -// replace stuff like \* with *
    -function globUnescape (s) {
    -  return s.replace(/\\(.)/g, '$1')
    -}
    -
    -function regExpEscape (s) {
    -  return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/minimatch/package.json b/deps/npm/node_modules/node-gyp/node_modules/minimatch/package.json
    deleted file mode 100644
    index 566efdfe45cb80..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/minimatch/package.json
    +++ /dev/null
    @@ -1,33 +0,0 @@
    -{
    -  "author": "Isaac Z. Schlueter  (http://blog.izs.me)",
    -  "name": "minimatch",
    -  "description": "a glob matcher in javascript",
    -  "version": "3.1.2",
    -  "publishConfig": {
    -    "tag": "v3-legacy"
    -  },
    -  "repository": {
    -    "type": "git",
    -    "url": "git://github.com/isaacs/minimatch.git"
    -  },
    -  "main": "minimatch.js",
    -  "scripts": {
    -    "test": "tap",
    -    "preversion": "npm test",
    -    "postversion": "npm publish",
    -    "postpublish": "git push origin --all; git push origin --tags"
    -  },
    -  "engines": {
    -    "node": "*"
    -  },
    -  "dependencies": {
    -    "brace-expansion": "^1.1.7"
    -  },
    -  "devDependencies": {
    -    "tap": "^15.1.6"
    -  },
    -  "license": "ISC",
    -  "files": [
    -    "minimatch.js"
    -  ]
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/minipass/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/minipass/LICENSE
    deleted file mode 100644
    index 97f8e32ed82e4c..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/minipass/LICENSE
    +++ /dev/null
    @@ -1,15 +0,0 @@
    -The ISC License
    -
    -Copyright (c) 2017-2023 npm, Inc., Isaac Z. Schlueter, and Contributors
    -
    -Permission to use, copy, modify, and/or distribute this software for any
    -purpose with or without fee is hereby granted, provided that the above
    -copyright notice and this permission notice appear in all copies.
    -
    -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
    -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/minipass/index.js b/deps/npm/node_modules/node-gyp/node_modules/minipass/index.js
    deleted file mode 100644
    index ed07c17acd97b7..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/minipass/index.js
    +++ /dev/null
    @@ -1,702 +0,0 @@
    -'use strict'
    -const proc =
    -  typeof process === 'object' && process
    -    ? process
    -    : {
    -        stdout: null,
    -        stderr: null,
    -      }
    -const EE = require('events')
    -const Stream = require('stream')
    -const stringdecoder = require('string_decoder')
    -const SD = stringdecoder.StringDecoder
    -
    -const EOF = Symbol('EOF')
    -const MAYBE_EMIT_END = Symbol('maybeEmitEnd')
    -const EMITTED_END = Symbol('emittedEnd')
    -const EMITTING_END = Symbol('emittingEnd')
    -const EMITTED_ERROR = Symbol('emittedError')
    -const CLOSED = Symbol('closed')
    -const READ = Symbol('read')
    -const FLUSH = Symbol('flush')
    -const FLUSHCHUNK = Symbol('flushChunk')
    -const ENCODING = Symbol('encoding')
    -const DECODER = Symbol('decoder')
    -const FLOWING = Symbol('flowing')
    -const PAUSED = Symbol('paused')
    -const RESUME = Symbol('resume')
    -const BUFFER = Symbol('buffer')
    -const PIPES = Symbol('pipes')
    -const BUFFERLENGTH = Symbol('bufferLength')
    -const BUFFERPUSH = Symbol('bufferPush')
    -const BUFFERSHIFT = Symbol('bufferShift')
    -const OBJECTMODE = Symbol('objectMode')
    -// internal event when stream is destroyed
    -const DESTROYED = Symbol('destroyed')
    -// internal event when stream has an error
    -const ERROR = Symbol('error')
    -const EMITDATA = Symbol('emitData')
    -const EMITEND = Symbol('emitEnd')
    -const EMITEND2 = Symbol('emitEnd2')
    -const ASYNC = Symbol('async')
    -const ABORT = Symbol('abort')
    -const ABORTED = Symbol('aborted')
    -const SIGNAL = Symbol('signal')
    -
    -const defer = fn => Promise.resolve().then(fn)
    -
    -// TODO remove when Node v8 support drops
    -const doIter = global._MP_NO_ITERATOR_SYMBOLS_ !== '1'
    -const ASYNCITERATOR =
    -  (doIter && Symbol.asyncIterator) || Symbol('asyncIterator not implemented')
    -const ITERATOR =
    -  (doIter && Symbol.iterator) || Symbol('iterator not implemented')
    -
    -// events that mean 'the stream is over'
    -// these are treated specially, and re-emitted
    -// if they are listened for after emitting.
    -const isEndish = ev => ev === 'end' || ev === 'finish' || ev === 'prefinish'
    -
    -const isArrayBuffer = b =>
    -  b instanceof ArrayBuffer ||
    -  (typeof b === 'object' &&
    -    b.constructor &&
    -    b.constructor.name === 'ArrayBuffer' &&
    -    b.byteLength >= 0)
    -
    -const isArrayBufferView = b => !Buffer.isBuffer(b) && ArrayBuffer.isView(b)
    -
    -class Pipe {
    -  constructor(src, dest, opts) {
    -    this.src = src
    -    this.dest = dest
    -    this.opts = opts
    -    this.ondrain = () => src[RESUME]()
    -    dest.on('drain', this.ondrain)
    -  }
    -  unpipe() {
    -    this.dest.removeListener('drain', this.ondrain)
    -  }
    -  // istanbul ignore next - only here for the prototype
    -  proxyErrors() {}
    -  end() {
    -    this.unpipe()
    -    if (this.opts.end) this.dest.end()
    -  }
    -}
    -
    -class PipeProxyErrors extends Pipe {
    -  unpipe() {
    -    this.src.removeListener('error', this.proxyErrors)
    -    super.unpipe()
    -  }
    -  constructor(src, dest, opts) {
    -    super(src, dest, opts)
    -    this.proxyErrors = er => dest.emit('error', er)
    -    src.on('error', this.proxyErrors)
    -  }
    -}
    -
    -class Minipass extends Stream {
    -  constructor(options) {
    -    super()
    -    this[FLOWING] = false
    -    // whether we're explicitly paused
    -    this[PAUSED] = false
    -    this[PIPES] = []
    -    this[BUFFER] = []
    -    this[OBJECTMODE] = (options && options.objectMode) || false
    -    if (this[OBJECTMODE]) this[ENCODING] = null
    -    else this[ENCODING] = (options && options.encoding) || null
    -    if (this[ENCODING] === 'buffer') this[ENCODING] = null
    -    this[ASYNC] = (options && !!options.async) || false
    -    this[DECODER] = this[ENCODING] ? new SD(this[ENCODING]) : null
    -    this[EOF] = false
    -    this[EMITTED_END] = false
    -    this[EMITTING_END] = false
    -    this[CLOSED] = false
    -    this[EMITTED_ERROR] = null
    -    this.writable = true
    -    this.readable = true
    -    this[BUFFERLENGTH] = 0
    -    this[DESTROYED] = false
    -    if (options && options.debugExposeBuffer === true) {
    -      Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] })
    -    }
    -    if (options && options.debugExposePipes === true) {
    -      Object.defineProperty(this, 'pipes', { get: () => this[PIPES] })
    -    }
    -    this[SIGNAL] = options && options.signal
    -    this[ABORTED] = false
    -    if (this[SIGNAL]) {
    -      this[SIGNAL].addEventListener('abort', () => this[ABORT]())
    -      if (this[SIGNAL].aborted) {
    -        this[ABORT]()
    -      }
    -    }
    -  }
    -
    -  get bufferLength() {
    -    return this[BUFFERLENGTH]
    -  }
    -
    -  get encoding() {
    -    return this[ENCODING]
    -  }
    -  set encoding(enc) {
    -    if (this[OBJECTMODE]) throw new Error('cannot set encoding in objectMode')
    -
    -    if (
    -      this[ENCODING] &&
    -      enc !== this[ENCODING] &&
    -      ((this[DECODER] && this[DECODER].lastNeed) || this[BUFFERLENGTH])
    -    )
    -      throw new Error('cannot change encoding')
    -
    -    if (this[ENCODING] !== enc) {
    -      this[DECODER] = enc ? new SD(enc) : null
    -      if (this[BUFFER].length)
    -        this[BUFFER] = this[BUFFER].map(chunk => this[DECODER].write(chunk))
    -    }
    -
    -    this[ENCODING] = enc
    -  }
    -
    -  setEncoding(enc) {
    -    this.encoding = enc
    -  }
    -
    -  get objectMode() {
    -    return this[OBJECTMODE]
    -  }
    -  set objectMode(om) {
    -    this[OBJECTMODE] = this[OBJECTMODE] || !!om
    -  }
    -
    -  get ['async']() {
    -    return this[ASYNC]
    -  }
    -  set ['async'](a) {
    -    this[ASYNC] = this[ASYNC] || !!a
    -  }
    -
    -  // drop everything and get out of the flow completely
    -  [ABORT]() {
    -    this[ABORTED] = true
    -    this.emit('abort', this[SIGNAL].reason)
    -    this.destroy(this[SIGNAL].reason)
    -  }
    -
    -  get aborted() {
    -    return this[ABORTED]
    -  }
    -  set aborted(_) {}
    -
    -  write(chunk, encoding, cb) {
    -    if (this[ABORTED]) return false
    -    if (this[EOF]) throw new Error('write after end')
    -
    -    if (this[DESTROYED]) {
    -      this.emit(
    -        'error',
    -        Object.assign(
    -          new Error('Cannot call write after a stream was destroyed'),
    -          { code: 'ERR_STREAM_DESTROYED' }
    -        )
    -      )
    -      return true
    -    }
    -
    -    if (typeof encoding === 'function') (cb = encoding), (encoding = 'utf8')
    -
    -    if (!encoding) encoding = 'utf8'
    -
    -    const fn = this[ASYNC] ? defer : f => f()
    -
    -    // convert array buffers and typed array views into buffers
    -    // at some point in the future, we may want to do the opposite!
    -    // leave strings and buffers as-is
    -    // anything else switches us into object mode
    -    if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {
    -      if (isArrayBufferView(chunk))
    -        chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength)
    -      else if (isArrayBuffer(chunk)) chunk = Buffer.from(chunk)
    -      else if (typeof chunk !== 'string')
    -        // use the setter so we throw if we have encoding set
    -        this.objectMode = true
    -    }
    -
    -    // handle object mode up front, since it's simpler
    -    // this yields better performance, fewer checks later.
    -    if (this[OBJECTMODE]) {
    -      /* istanbul ignore if - maybe impossible? */
    -      if (this.flowing && this[BUFFERLENGTH] !== 0) this[FLUSH](true)
    -
    -      if (this.flowing) this.emit('data', chunk)
    -      else this[BUFFERPUSH](chunk)
    -
    -      if (this[BUFFERLENGTH] !== 0) this.emit('readable')
    -
    -      if (cb) fn(cb)
    -
    -      return this.flowing
    -    }
    -
    -    // at this point the chunk is a buffer or string
    -    // don't buffer it up or send it to the decoder
    -    if (!chunk.length) {
    -      if (this[BUFFERLENGTH] !== 0) this.emit('readable')
    -      if (cb) fn(cb)
    -      return this.flowing
    -    }
    -
    -    // fast-path writing strings of same encoding to a stream with
    -    // an empty buffer, skipping the buffer/decoder dance
    -    if (
    -      typeof chunk === 'string' &&
    -      // unless it is a string already ready for us to use
    -      !(encoding === this[ENCODING] && !this[DECODER].lastNeed)
    -    ) {
    -      chunk = Buffer.from(chunk, encoding)
    -    }
    -
    -    if (Buffer.isBuffer(chunk) && this[ENCODING])
    -      chunk = this[DECODER].write(chunk)
    -
    -    // Note: flushing CAN potentially switch us into not-flowing mode
    -    if (this.flowing && this[BUFFERLENGTH] !== 0) this[FLUSH](true)
    -
    -    if (this.flowing) this.emit('data', chunk)
    -    else this[BUFFERPUSH](chunk)
    -
    -    if (this[BUFFERLENGTH] !== 0) this.emit('readable')
    -
    -    if (cb) fn(cb)
    -
    -    return this.flowing
    -  }
    -
    -  read(n) {
    -    if (this[DESTROYED]) return null
    -
    -    if (this[BUFFERLENGTH] === 0 || n === 0 || n > this[BUFFERLENGTH]) {
    -      this[MAYBE_EMIT_END]()
    -      return null
    -    }
    -
    -    if (this[OBJECTMODE]) n = null
    -
    -    if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {
    -      if (this.encoding) this[BUFFER] = [this[BUFFER].join('')]
    -      else this[BUFFER] = [Buffer.concat(this[BUFFER], this[BUFFERLENGTH])]
    -    }
    -
    -    const ret = this[READ](n || null, this[BUFFER][0])
    -    this[MAYBE_EMIT_END]()
    -    return ret
    -  }
    -
    -  [READ](n, chunk) {
    -    if (n === chunk.length || n === null) this[BUFFERSHIFT]()
    -    else {
    -      this[BUFFER][0] = chunk.slice(n)
    -      chunk = chunk.slice(0, n)
    -      this[BUFFERLENGTH] -= n
    -    }
    -
    -    this.emit('data', chunk)
    -
    -    if (!this[BUFFER].length && !this[EOF]) this.emit('drain')
    -
    -    return chunk
    -  }
    -
    -  end(chunk, encoding, cb) {
    -    if (typeof chunk === 'function') (cb = chunk), (chunk = null)
    -    if (typeof encoding === 'function') (cb = encoding), (encoding = 'utf8')
    -    if (chunk) this.write(chunk, encoding)
    -    if (cb) this.once('end', cb)
    -    this[EOF] = true
    -    this.writable = false
    -
    -    // if we haven't written anything, then go ahead and emit,
    -    // even if we're not reading.
    -    // we'll re-emit if a new 'end' listener is added anyway.
    -    // This makes MP more suitable to write-only use cases.
    -    if (this.flowing || !this[PAUSED]) this[MAYBE_EMIT_END]()
    -    return this
    -  }
    -
    -  // don't let the internal resume be overwritten
    -  [RESUME]() {
    -    if (this[DESTROYED]) return
    -
    -    this[PAUSED] = false
    -    this[FLOWING] = true
    -    this.emit('resume')
    -    if (this[BUFFER].length) this[FLUSH]()
    -    else if (this[EOF]) this[MAYBE_EMIT_END]()
    -    else this.emit('drain')
    -  }
    -
    -  resume() {
    -    return this[RESUME]()
    -  }
    -
    -  pause() {
    -    this[FLOWING] = false
    -    this[PAUSED] = true
    -  }
    -
    -  get destroyed() {
    -    return this[DESTROYED]
    -  }
    -
    -  get flowing() {
    -    return this[FLOWING]
    -  }
    -
    -  get paused() {
    -    return this[PAUSED]
    -  }
    -
    -  [BUFFERPUSH](chunk) {
    -    if (this[OBJECTMODE]) this[BUFFERLENGTH] += 1
    -    else this[BUFFERLENGTH] += chunk.length
    -    this[BUFFER].push(chunk)
    -  }
    -
    -  [BUFFERSHIFT]() {
    -    if (this[OBJECTMODE]) this[BUFFERLENGTH] -= 1
    -    else this[BUFFERLENGTH] -= this[BUFFER][0].length
    -    return this[BUFFER].shift()
    -  }
    -
    -  [FLUSH](noDrain) {
    -    do {} while (this[FLUSHCHUNK](this[BUFFERSHIFT]()) && this[BUFFER].length)
    -
    -    if (!noDrain && !this[BUFFER].length && !this[EOF]) this.emit('drain')
    -  }
    -
    -  [FLUSHCHUNK](chunk) {
    -    this.emit('data', chunk)
    -    return this.flowing
    -  }
    -
    -  pipe(dest, opts) {
    -    if (this[DESTROYED]) return
    -
    -    const ended = this[EMITTED_END]
    -    opts = opts || {}
    -    if (dest === proc.stdout || dest === proc.stderr) opts.end = false
    -    else opts.end = opts.end !== false
    -    opts.proxyErrors = !!opts.proxyErrors
    -
    -    // piping an ended stream ends immediately
    -    if (ended) {
    -      if (opts.end) dest.end()
    -    } else {
    -      this[PIPES].push(
    -        !opts.proxyErrors
    -          ? new Pipe(this, dest, opts)
    -          : new PipeProxyErrors(this, dest, opts)
    -      )
    -      if (this[ASYNC]) defer(() => this[RESUME]())
    -      else this[RESUME]()
    -    }
    -
    -    return dest
    -  }
    -
    -  unpipe(dest) {
    -    const p = this[PIPES].find(p => p.dest === dest)
    -    if (p) {
    -      this[PIPES].splice(this[PIPES].indexOf(p), 1)
    -      p.unpipe()
    -    }
    -  }
    -
    -  addListener(ev, fn) {
    -    return this.on(ev, fn)
    -  }
    -
    -  on(ev, fn) {
    -    const ret = super.on(ev, fn)
    -    if (ev === 'data' && !this[PIPES].length && !this.flowing) this[RESUME]()
    -    else if (ev === 'readable' && this[BUFFERLENGTH] !== 0)
    -      super.emit('readable')
    -    else if (isEndish(ev) && this[EMITTED_END]) {
    -      super.emit(ev)
    -      this.removeAllListeners(ev)
    -    } else if (ev === 'error' && this[EMITTED_ERROR]) {
    -      if (this[ASYNC]) defer(() => fn.call(this, this[EMITTED_ERROR]))
    -      else fn.call(this, this[EMITTED_ERROR])
    -    }
    -    return ret
    -  }
    -
    -  get emittedEnd() {
    -    return this[EMITTED_END]
    -  }
    -
    -  [MAYBE_EMIT_END]() {
    -    if (
    -      !this[EMITTING_END] &&
    -      !this[EMITTED_END] &&
    -      !this[DESTROYED] &&
    -      this[BUFFER].length === 0 &&
    -      this[EOF]
    -    ) {
    -      this[EMITTING_END] = true
    -      this.emit('end')
    -      this.emit('prefinish')
    -      this.emit('finish')
    -      if (this[CLOSED]) this.emit('close')
    -      this[EMITTING_END] = false
    -    }
    -  }
    -
    -  emit(ev, data, ...extra) {
    -    // error and close are only events allowed after calling destroy()
    -    if (ev !== 'error' && ev !== 'close' && ev !== DESTROYED && this[DESTROYED])
    -      return
    -    else if (ev === 'data') {
    -      return !this[OBJECTMODE] && !data
    -        ? false
    -        : this[ASYNC]
    -        ? defer(() => this[EMITDATA](data))
    -        : this[EMITDATA](data)
    -    } else if (ev === 'end') {
    -      return this[EMITEND]()
    -    } else if (ev === 'close') {
    -      this[CLOSED] = true
    -      // don't emit close before 'end' and 'finish'
    -      if (!this[EMITTED_END] && !this[DESTROYED]) return
    -      const ret = super.emit('close')
    -      this.removeAllListeners('close')
    -      return ret
    -    } else if (ev === 'error') {
    -      this[EMITTED_ERROR] = data
    -      super.emit(ERROR, data)
    -      const ret =
    -        !this[SIGNAL] || this.listeners('error').length
    -          ? super.emit('error', data)
    -          : false
    -      this[MAYBE_EMIT_END]()
    -      return ret
    -    } else if (ev === 'resume') {
    -      const ret = super.emit('resume')
    -      this[MAYBE_EMIT_END]()
    -      return ret
    -    } else if (ev === 'finish' || ev === 'prefinish') {
    -      const ret = super.emit(ev)
    -      this.removeAllListeners(ev)
    -      return ret
    -    }
    -
    -    // Some other unknown event
    -    const ret = super.emit(ev, data, ...extra)
    -    this[MAYBE_EMIT_END]()
    -    return ret
    -  }
    -
    -  [EMITDATA](data) {
    -    for (const p of this[PIPES]) {
    -      if (p.dest.write(data) === false) this.pause()
    -    }
    -    const ret = super.emit('data', data)
    -    this[MAYBE_EMIT_END]()
    -    return ret
    -  }
    -
    -  [EMITEND]() {
    -    if (this[EMITTED_END]) return
    -
    -    this[EMITTED_END] = true
    -    this.readable = false
    -    if (this[ASYNC]) defer(() => this[EMITEND2]())
    -    else this[EMITEND2]()
    -  }
    -
    -  [EMITEND2]() {
    -    if (this[DECODER]) {
    -      const data = this[DECODER].end()
    -      if (data) {
    -        for (const p of this[PIPES]) {
    -          p.dest.write(data)
    -        }
    -        super.emit('data', data)
    -      }
    -    }
    -
    -    for (const p of this[PIPES]) {
    -      p.end()
    -    }
    -    const ret = super.emit('end')
    -    this.removeAllListeners('end')
    -    return ret
    -  }
    -
    -  // const all = await stream.collect()
    -  collect() {
    -    const buf = []
    -    if (!this[OBJECTMODE]) buf.dataLength = 0
    -    // set the promise first, in case an error is raised
    -    // by triggering the flow here.
    -    const p = this.promise()
    -    this.on('data', c => {
    -      buf.push(c)
    -      if (!this[OBJECTMODE]) buf.dataLength += c.length
    -    })
    -    return p.then(() => buf)
    -  }
    -
    -  // const data = await stream.concat()
    -  concat() {
    -    return this[OBJECTMODE]
    -      ? Promise.reject(new Error('cannot concat in objectMode'))
    -      : this.collect().then(buf =>
    -          this[OBJECTMODE]
    -            ? Promise.reject(new Error('cannot concat in objectMode'))
    -            : this[ENCODING]
    -            ? buf.join('')
    -            : Buffer.concat(buf, buf.dataLength)
    -        )
    -  }
    -
    -  // stream.promise().then(() => done, er => emitted error)
    -  promise() {
    -    return new Promise((resolve, reject) => {
    -      this.on(DESTROYED, () => reject(new Error('stream destroyed')))
    -      this.on('error', er => reject(er))
    -      this.on('end', () => resolve())
    -    })
    -  }
    -
    -  // for await (let chunk of stream)
    -  [ASYNCITERATOR]() {
    -    let stopped = false
    -    const stop = () => {
    -      this.pause()
    -      stopped = true
    -      return Promise.resolve({ done: true })
    -    }
    -    const next = () => {
    -      if (stopped) return stop()
    -      const res = this.read()
    -      if (res !== null) return Promise.resolve({ done: false, value: res })
    -
    -      if (this[EOF]) return stop()
    -
    -      let resolve = null
    -      let reject = null
    -      const onerr = er => {
    -        this.removeListener('data', ondata)
    -        this.removeListener('end', onend)
    -        this.removeListener(DESTROYED, ondestroy)
    -        stop()
    -        reject(er)
    -      }
    -      const ondata = value => {
    -        this.removeListener('error', onerr)
    -        this.removeListener('end', onend)
    -        this.removeListener(DESTROYED, ondestroy)
    -        this.pause()
    -        resolve({ value: value, done: !!this[EOF] })
    -      }
    -      const onend = () => {
    -        this.removeListener('error', onerr)
    -        this.removeListener('data', ondata)
    -        this.removeListener(DESTROYED, ondestroy)
    -        stop()
    -        resolve({ done: true })
    -      }
    -      const ondestroy = () => onerr(new Error('stream destroyed'))
    -      return new Promise((res, rej) => {
    -        reject = rej
    -        resolve = res
    -        this.once(DESTROYED, ondestroy)
    -        this.once('error', onerr)
    -        this.once('end', onend)
    -        this.once('data', ondata)
    -      })
    -    }
    -
    -    return {
    -      next,
    -      throw: stop,
    -      return: stop,
    -      [ASYNCITERATOR]() {
    -        return this
    -      },
    -    }
    -  }
    -
    -  // for (let chunk of stream)
    -  [ITERATOR]() {
    -    let stopped = false
    -    const stop = () => {
    -      this.pause()
    -      this.removeListener(ERROR, stop)
    -      this.removeListener(DESTROYED, stop)
    -      this.removeListener('end', stop)
    -      stopped = true
    -      return { done: true }
    -    }
    -
    -    const next = () => {
    -      if (stopped) return stop()
    -      const value = this.read()
    -      return value === null ? stop() : { value }
    -    }
    -    this.once('end', stop)
    -    this.once(ERROR, stop)
    -    this.once(DESTROYED, stop)
    -
    -    return {
    -      next,
    -      throw: stop,
    -      return: stop,
    -      [ITERATOR]() {
    -        return this
    -      },
    -    }
    -  }
    -
    -  destroy(er) {
    -    if (this[DESTROYED]) {
    -      if (er) this.emit('error', er)
    -      else this.emit(DESTROYED)
    -      return this
    -    }
    -
    -    this[DESTROYED] = true
    -
    -    // throw away all buffered data, it's never coming out
    -    this[BUFFER].length = 0
    -    this[BUFFERLENGTH] = 0
    -
    -    if (typeof this.close === 'function' && !this[CLOSED]) this.close()
    -
    -    if (er) this.emit('error', er)
    -    // if no error to emit, still reject pending promises
    -    else this.emit(DESTROYED)
    -
    -    return this
    -  }
    -
    -  static isStream(s) {
    -    return (
    -      !!s &&
    -      (s instanceof Minipass ||
    -        s instanceof Stream ||
    -        (s instanceof EE &&
    -          // readable
    -          (typeof s.pipe === 'function' ||
    -            // writable
    -            (typeof s.write === 'function' && typeof s.end === 'function'))))
    -    )
    -  }
    -}
    -
    -exports.Minipass = Minipass
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/minipass/index.mjs b/deps/npm/node_modules/node-gyp/node_modules/minipass/index.mjs
    deleted file mode 100644
    index 89b3fbf1a4d445..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/minipass/index.mjs
    +++ /dev/null
    @@ -1,700 +0,0 @@
    -'use strict'
    -const proc =
    -  typeof process === 'object' && process
    -    ? process
    -    : {
    -        stdout: null,
    -        stderr: null,
    -      }
    -import EE from 'events'
    -import Stream from 'stream'
    -import stringdecoder from 'string_decoder'
    -const SD = stringdecoder.StringDecoder
    -
    -const EOF = Symbol('EOF')
    -const MAYBE_EMIT_END = Symbol('maybeEmitEnd')
    -const EMITTED_END = Symbol('emittedEnd')
    -const EMITTING_END = Symbol('emittingEnd')
    -const EMITTED_ERROR = Symbol('emittedError')
    -const CLOSED = Symbol('closed')
    -const READ = Symbol('read')
    -const FLUSH = Symbol('flush')
    -const FLUSHCHUNK = Symbol('flushChunk')
    -const ENCODING = Symbol('encoding')
    -const DECODER = Symbol('decoder')
    -const FLOWING = Symbol('flowing')
    -const PAUSED = Symbol('paused')
    -const RESUME = Symbol('resume')
    -const BUFFER = Symbol('buffer')
    -const PIPES = Symbol('pipes')
    -const BUFFERLENGTH = Symbol('bufferLength')
    -const BUFFERPUSH = Symbol('bufferPush')
    -const BUFFERSHIFT = Symbol('bufferShift')
    -const OBJECTMODE = Symbol('objectMode')
    -// internal event when stream is destroyed
    -const DESTROYED = Symbol('destroyed')
    -// internal event when stream has an error
    -const ERROR = Symbol('error')
    -const EMITDATA = Symbol('emitData')
    -const EMITEND = Symbol('emitEnd')
    -const EMITEND2 = Symbol('emitEnd2')
    -const ASYNC = Symbol('async')
    -const ABORT = Symbol('abort')
    -const ABORTED = Symbol('aborted')
    -const SIGNAL = Symbol('signal')
    -
    -const defer = fn => Promise.resolve().then(fn)
    -
    -// TODO remove when Node v8 support drops
    -const doIter = global._MP_NO_ITERATOR_SYMBOLS_ !== '1'
    -const ASYNCITERATOR =
    -  (doIter && Symbol.asyncIterator) || Symbol('asyncIterator not implemented')
    -const ITERATOR =
    -  (doIter && Symbol.iterator) || Symbol('iterator not implemented')
    -
    -// events that mean 'the stream is over'
    -// these are treated specially, and re-emitted
    -// if they are listened for after emitting.
    -const isEndish = ev => ev === 'end' || ev === 'finish' || ev === 'prefinish'
    -
    -const isArrayBuffer = b =>
    -  b instanceof ArrayBuffer ||
    -  (typeof b === 'object' &&
    -    b.constructor &&
    -    b.constructor.name === 'ArrayBuffer' &&
    -    b.byteLength >= 0)
    -
    -const isArrayBufferView = b => !Buffer.isBuffer(b) && ArrayBuffer.isView(b)
    -
    -class Pipe {
    -  constructor(src, dest, opts) {
    -    this.src = src
    -    this.dest = dest
    -    this.opts = opts
    -    this.ondrain = () => src[RESUME]()
    -    dest.on('drain', this.ondrain)
    -  }
    -  unpipe() {
    -    this.dest.removeListener('drain', this.ondrain)
    -  }
    -  // istanbul ignore next - only here for the prototype
    -  proxyErrors() {}
    -  end() {
    -    this.unpipe()
    -    if (this.opts.end) this.dest.end()
    -  }
    -}
    -
    -class PipeProxyErrors extends Pipe {
    -  unpipe() {
    -    this.src.removeListener('error', this.proxyErrors)
    -    super.unpipe()
    -  }
    -  constructor(src, dest, opts) {
    -    super(src, dest, opts)
    -    this.proxyErrors = er => dest.emit('error', er)
    -    src.on('error', this.proxyErrors)
    -  }
    -}
    -
    -export class Minipass extends Stream {
    -  constructor(options) {
    -    super()
    -    this[FLOWING] = false
    -    // whether we're explicitly paused
    -    this[PAUSED] = false
    -    this[PIPES] = []
    -    this[BUFFER] = []
    -    this[OBJECTMODE] = (options && options.objectMode) || false
    -    if (this[OBJECTMODE]) this[ENCODING] = null
    -    else this[ENCODING] = (options && options.encoding) || null
    -    if (this[ENCODING] === 'buffer') this[ENCODING] = null
    -    this[ASYNC] = (options && !!options.async) || false
    -    this[DECODER] = this[ENCODING] ? new SD(this[ENCODING]) : null
    -    this[EOF] = false
    -    this[EMITTED_END] = false
    -    this[EMITTING_END] = false
    -    this[CLOSED] = false
    -    this[EMITTED_ERROR] = null
    -    this.writable = true
    -    this.readable = true
    -    this[BUFFERLENGTH] = 0
    -    this[DESTROYED] = false
    -    if (options && options.debugExposeBuffer === true) {
    -      Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] })
    -    }
    -    if (options && options.debugExposePipes === true) {
    -      Object.defineProperty(this, 'pipes', { get: () => this[PIPES] })
    -    }
    -    this[SIGNAL] = options && options.signal
    -    this[ABORTED] = false
    -    if (this[SIGNAL]) {
    -      this[SIGNAL].addEventListener('abort', () => this[ABORT]())
    -      if (this[SIGNAL].aborted) {
    -        this[ABORT]()
    -      }
    -    }
    -  }
    -
    -  get bufferLength() {
    -    return this[BUFFERLENGTH]
    -  }
    -
    -  get encoding() {
    -    return this[ENCODING]
    -  }
    -  set encoding(enc) {
    -    if (this[OBJECTMODE]) throw new Error('cannot set encoding in objectMode')
    -
    -    if (
    -      this[ENCODING] &&
    -      enc !== this[ENCODING] &&
    -      ((this[DECODER] && this[DECODER].lastNeed) || this[BUFFERLENGTH])
    -    )
    -      throw new Error('cannot change encoding')
    -
    -    if (this[ENCODING] !== enc) {
    -      this[DECODER] = enc ? new SD(enc) : null
    -      if (this[BUFFER].length)
    -        this[BUFFER] = this[BUFFER].map(chunk => this[DECODER].write(chunk))
    -    }
    -
    -    this[ENCODING] = enc
    -  }
    -
    -  setEncoding(enc) {
    -    this.encoding = enc
    -  }
    -
    -  get objectMode() {
    -    return this[OBJECTMODE]
    -  }
    -  set objectMode(om) {
    -    this[OBJECTMODE] = this[OBJECTMODE] || !!om
    -  }
    -
    -  get ['async']() {
    -    return this[ASYNC]
    -  }
    -  set ['async'](a) {
    -    this[ASYNC] = this[ASYNC] || !!a
    -  }
    -
    -  // drop everything and get out of the flow completely
    -  [ABORT]() {
    -    this[ABORTED] = true
    -    this.emit('abort', this[SIGNAL].reason)
    -    this.destroy(this[SIGNAL].reason)
    -  }
    -
    -  get aborted() {
    -    return this[ABORTED]
    -  }
    -  set aborted(_) {}
    -
    -  write(chunk, encoding, cb) {
    -    if (this[ABORTED]) return false
    -    if (this[EOF]) throw new Error('write after end')
    -
    -    if (this[DESTROYED]) {
    -      this.emit(
    -        'error',
    -        Object.assign(
    -          new Error('Cannot call write after a stream was destroyed'),
    -          { code: 'ERR_STREAM_DESTROYED' }
    -        )
    -      )
    -      return true
    -    }
    -
    -    if (typeof encoding === 'function') (cb = encoding), (encoding = 'utf8')
    -
    -    if (!encoding) encoding = 'utf8'
    -
    -    const fn = this[ASYNC] ? defer : f => f()
    -
    -    // convert array buffers and typed array views into buffers
    -    // at some point in the future, we may want to do the opposite!
    -    // leave strings and buffers as-is
    -    // anything else switches us into object mode
    -    if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {
    -      if (isArrayBufferView(chunk))
    -        chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength)
    -      else if (isArrayBuffer(chunk)) chunk = Buffer.from(chunk)
    -      else if (typeof chunk !== 'string')
    -        // use the setter so we throw if we have encoding set
    -        this.objectMode = true
    -    }
    -
    -    // handle object mode up front, since it's simpler
    -    // this yields better performance, fewer checks later.
    -    if (this[OBJECTMODE]) {
    -      /* istanbul ignore if - maybe impossible? */
    -      if (this.flowing && this[BUFFERLENGTH] !== 0) this[FLUSH](true)
    -
    -      if (this.flowing) this.emit('data', chunk)
    -      else this[BUFFERPUSH](chunk)
    -
    -      if (this[BUFFERLENGTH] !== 0) this.emit('readable')
    -
    -      if (cb) fn(cb)
    -
    -      return this.flowing
    -    }
    -
    -    // at this point the chunk is a buffer or string
    -    // don't buffer it up or send it to the decoder
    -    if (!chunk.length) {
    -      if (this[BUFFERLENGTH] !== 0) this.emit('readable')
    -      if (cb) fn(cb)
    -      return this.flowing
    -    }
    -
    -    // fast-path writing strings of same encoding to a stream with
    -    // an empty buffer, skipping the buffer/decoder dance
    -    if (
    -      typeof chunk === 'string' &&
    -      // unless it is a string already ready for us to use
    -      !(encoding === this[ENCODING] && !this[DECODER].lastNeed)
    -    ) {
    -      chunk = Buffer.from(chunk, encoding)
    -    }
    -
    -    if (Buffer.isBuffer(chunk) && this[ENCODING])
    -      chunk = this[DECODER].write(chunk)
    -
    -    // Note: flushing CAN potentially switch us into not-flowing mode
    -    if (this.flowing && this[BUFFERLENGTH] !== 0) this[FLUSH](true)
    -
    -    if (this.flowing) this.emit('data', chunk)
    -    else this[BUFFERPUSH](chunk)
    -
    -    if (this[BUFFERLENGTH] !== 0) this.emit('readable')
    -
    -    if (cb) fn(cb)
    -
    -    return this.flowing
    -  }
    -
    -  read(n) {
    -    if (this[DESTROYED]) return null
    -
    -    if (this[BUFFERLENGTH] === 0 || n === 0 || n > this[BUFFERLENGTH]) {
    -      this[MAYBE_EMIT_END]()
    -      return null
    -    }
    -
    -    if (this[OBJECTMODE]) n = null
    -
    -    if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {
    -      if (this.encoding) this[BUFFER] = [this[BUFFER].join('')]
    -      else this[BUFFER] = [Buffer.concat(this[BUFFER], this[BUFFERLENGTH])]
    -    }
    -
    -    const ret = this[READ](n || null, this[BUFFER][0])
    -    this[MAYBE_EMIT_END]()
    -    return ret
    -  }
    -
    -  [READ](n, chunk) {
    -    if (n === chunk.length || n === null) this[BUFFERSHIFT]()
    -    else {
    -      this[BUFFER][0] = chunk.slice(n)
    -      chunk = chunk.slice(0, n)
    -      this[BUFFERLENGTH] -= n
    -    }
    -
    -    this.emit('data', chunk)
    -
    -    if (!this[BUFFER].length && !this[EOF]) this.emit('drain')
    -
    -    return chunk
    -  }
    -
    -  end(chunk, encoding, cb) {
    -    if (typeof chunk === 'function') (cb = chunk), (chunk = null)
    -    if (typeof encoding === 'function') (cb = encoding), (encoding = 'utf8')
    -    if (chunk) this.write(chunk, encoding)
    -    if (cb) this.once('end', cb)
    -    this[EOF] = true
    -    this.writable = false
    -
    -    // if we haven't written anything, then go ahead and emit,
    -    // even if we're not reading.
    -    // we'll re-emit if a new 'end' listener is added anyway.
    -    // This makes MP more suitable to write-only use cases.
    -    if (this.flowing || !this[PAUSED]) this[MAYBE_EMIT_END]()
    -    return this
    -  }
    -
    -  // don't let the internal resume be overwritten
    -  [RESUME]() {
    -    if (this[DESTROYED]) return
    -
    -    this[PAUSED] = false
    -    this[FLOWING] = true
    -    this.emit('resume')
    -    if (this[BUFFER].length) this[FLUSH]()
    -    else if (this[EOF]) this[MAYBE_EMIT_END]()
    -    else this.emit('drain')
    -  }
    -
    -  resume() {
    -    return this[RESUME]()
    -  }
    -
    -  pause() {
    -    this[FLOWING] = false
    -    this[PAUSED] = true
    -  }
    -
    -  get destroyed() {
    -    return this[DESTROYED]
    -  }
    -
    -  get flowing() {
    -    return this[FLOWING]
    -  }
    -
    -  get paused() {
    -    return this[PAUSED]
    -  }
    -
    -  [BUFFERPUSH](chunk) {
    -    if (this[OBJECTMODE]) this[BUFFERLENGTH] += 1
    -    else this[BUFFERLENGTH] += chunk.length
    -    this[BUFFER].push(chunk)
    -  }
    -
    -  [BUFFERSHIFT]() {
    -    if (this[OBJECTMODE]) this[BUFFERLENGTH] -= 1
    -    else this[BUFFERLENGTH] -= this[BUFFER][0].length
    -    return this[BUFFER].shift()
    -  }
    -
    -  [FLUSH](noDrain) {
    -    do {} while (this[FLUSHCHUNK](this[BUFFERSHIFT]()) && this[BUFFER].length)
    -
    -    if (!noDrain && !this[BUFFER].length && !this[EOF]) this.emit('drain')
    -  }
    -
    -  [FLUSHCHUNK](chunk) {
    -    this.emit('data', chunk)
    -    return this.flowing
    -  }
    -
    -  pipe(dest, opts) {
    -    if (this[DESTROYED]) return
    -
    -    const ended = this[EMITTED_END]
    -    opts = opts || {}
    -    if (dest === proc.stdout || dest === proc.stderr) opts.end = false
    -    else opts.end = opts.end !== false
    -    opts.proxyErrors = !!opts.proxyErrors
    -
    -    // piping an ended stream ends immediately
    -    if (ended) {
    -      if (opts.end) dest.end()
    -    } else {
    -      this[PIPES].push(
    -        !opts.proxyErrors
    -          ? new Pipe(this, dest, opts)
    -          : new PipeProxyErrors(this, dest, opts)
    -      )
    -      if (this[ASYNC]) defer(() => this[RESUME]())
    -      else this[RESUME]()
    -    }
    -
    -    return dest
    -  }
    -
    -  unpipe(dest) {
    -    const p = this[PIPES].find(p => p.dest === dest)
    -    if (p) {
    -      this[PIPES].splice(this[PIPES].indexOf(p), 1)
    -      p.unpipe()
    -    }
    -  }
    -
    -  addListener(ev, fn) {
    -    return this.on(ev, fn)
    -  }
    -
    -  on(ev, fn) {
    -    const ret = super.on(ev, fn)
    -    if (ev === 'data' && !this[PIPES].length && !this.flowing) this[RESUME]()
    -    else if (ev === 'readable' && this[BUFFERLENGTH] !== 0)
    -      super.emit('readable')
    -    else if (isEndish(ev) && this[EMITTED_END]) {
    -      super.emit(ev)
    -      this.removeAllListeners(ev)
    -    } else if (ev === 'error' && this[EMITTED_ERROR]) {
    -      if (this[ASYNC]) defer(() => fn.call(this, this[EMITTED_ERROR]))
    -      else fn.call(this, this[EMITTED_ERROR])
    -    }
    -    return ret
    -  }
    -
    -  get emittedEnd() {
    -    return this[EMITTED_END]
    -  }
    -
    -  [MAYBE_EMIT_END]() {
    -    if (
    -      !this[EMITTING_END] &&
    -      !this[EMITTED_END] &&
    -      !this[DESTROYED] &&
    -      this[BUFFER].length === 0 &&
    -      this[EOF]
    -    ) {
    -      this[EMITTING_END] = true
    -      this.emit('end')
    -      this.emit('prefinish')
    -      this.emit('finish')
    -      if (this[CLOSED]) this.emit('close')
    -      this[EMITTING_END] = false
    -    }
    -  }
    -
    -  emit(ev, data, ...extra) {
    -    // error and close are only events allowed after calling destroy()
    -    if (ev !== 'error' && ev !== 'close' && ev !== DESTROYED && this[DESTROYED])
    -      return
    -    else if (ev === 'data') {
    -      return !this[OBJECTMODE] && !data
    -        ? false
    -        : this[ASYNC]
    -        ? defer(() => this[EMITDATA](data))
    -        : this[EMITDATA](data)
    -    } else if (ev === 'end') {
    -      return this[EMITEND]()
    -    } else if (ev === 'close') {
    -      this[CLOSED] = true
    -      // don't emit close before 'end' and 'finish'
    -      if (!this[EMITTED_END] && !this[DESTROYED]) return
    -      const ret = super.emit('close')
    -      this.removeAllListeners('close')
    -      return ret
    -    } else if (ev === 'error') {
    -      this[EMITTED_ERROR] = data
    -      super.emit(ERROR, data)
    -      const ret =
    -        !this[SIGNAL] || this.listeners('error').length
    -          ? super.emit('error', data)
    -          : false
    -      this[MAYBE_EMIT_END]()
    -      return ret
    -    } else if (ev === 'resume') {
    -      const ret = super.emit('resume')
    -      this[MAYBE_EMIT_END]()
    -      return ret
    -    } else if (ev === 'finish' || ev === 'prefinish') {
    -      const ret = super.emit(ev)
    -      this.removeAllListeners(ev)
    -      return ret
    -    }
    -
    -    // Some other unknown event
    -    const ret = super.emit(ev, data, ...extra)
    -    this[MAYBE_EMIT_END]()
    -    return ret
    -  }
    -
    -  [EMITDATA](data) {
    -    for (const p of this[PIPES]) {
    -      if (p.dest.write(data) === false) this.pause()
    -    }
    -    const ret = super.emit('data', data)
    -    this[MAYBE_EMIT_END]()
    -    return ret
    -  }
    -
    -  [EMITEND]() {
    -    if (this[EMITTED_END]) return
    -
    -    this[EMITTED_END] = true
    -    this.readable = false
    -    if (this[ASYNC]) defer(() => this[EMITEND2]())
    -    else this[EMITEND2]()
    -  }
    -
    -  [EMITEND2]() {
    -    if (this[DECODER]) {
    -      const data = this[DECODER].end()
    -      if (data) {
    -        for (const p of this[PIPES]) {
    -          p.dest.write(data)
    -        }
    -        super.emit('data', data)
    -      }
    -    }
    -
    -    for (const p of this[PIPES]) {
    -      p.end()
    -    }
    -    const ret = super.emit('end')
    -    this.removeAllListeners('end')
    -    return ret
    -  }
    -
    -  // const all = await stream.collect()
    -  collect() {
    -    const buf = []
    -    if (!this[OBJECTMODE]) buf.dataLength = 0
    -    // set the promise first, in case an error is raised
    -    // by triggering the flow here.
    -    const p = this.promise()
    -    this.on('data', c => {
    -      buf.push(c)
    -      if (!this[OBJECTMODE]) buf.dataLength += c.length
    -    })
    -    return p.then(() => buf)
    -  }
    -
    -  // const data = await stream.concat()
    -  concat() {
    -    return this[OBJECTMODE]
    -      ? Promise.reject(new Error('cannot concat in objectMode'))
    -      : this.collect().then(buf =>
    -          this[OBJECTMODE]
    -            ? Promise.reject(new Error('cannot concat in objectMode'))
    -            : this[ENCODING]
    -            ? buf.join('')
    -            : Buffer.concat(buf, buf.dataLength)
    -        )
    -  }
    -
    -  // stream.promise().then(() => done, er => emitted error)
    -  promise() {
    -    return new Promise((resolve, reject) => {
    -      this.on(DESTROYED, () => reject(new Error('stream destroyed')))
    -      this.on('error', er => reject(er))
    -      this.on('end', () => resolve())
    -    })
    -  }
    -
    -  // for await (let chunk of stream)
    -  [ASYNCITERATOR]() {
    -    let stopped = false
    -    const stop = () => {
    -      this.pause()
    -      stopped = true
    -      return Promise.resolve({ done: true })
    -    }
    -    const next = () => {
    -      if (stopped) return stop()
    -      const res = this.read()
    -      if (res !== null) return Promise.resolve({ done: false, value: res })
    -
    -      if (this[EOF]) return stop()
    -
    -      let resolve = null
    -      let reject = null
    -      const onerr = er => {
    -        this.removeListener('data', ondata)
    -        this.removeListener('end', onend)
    -        this.removeListener(DESTROYED, ondestroy)
    -        stop()
    -        reject(er)
    -      }
    -      const ondata = value => {
    -        this.removeListener('error', onerr)
    -        this.removeListener('end', onend)
    -        this.removeListener(DESTROYED, ondestroy)
    -        this.pause()
    -        resolve({ value: value, done: !!this[EOF] })
    -      }
    -      const onend = () => {
    -        this.removeListener('error', onerr)
    -        this.removeListener('data', ondata)
    -        this.removeListener(DESTROYED, ondestroy)
    -        stop()
    -        resolve({ done: true })
    -      }
    -      const ondestroy = () => onerr(new Error('stream destroyed'))
    -      return new Promise((res, rej) => {
    -        reject = rej
    -        resolve = res
    -        this.once(DESTROYED, ondestroy)
    -        this.once('error', onerr)
    -        this.once('end', onend)
    -        this.once('data', ondata)
    -      })
    -    }
    -
    -    return {
    -      next,
    -      throw: stop,
    -      return: stop,
    -      [ASYNCITERATOR]() {
    -        return this
    -      },
    -    }
    -  }
    -
    -  // for (let chunk of stream)
    -  [ITERATOR]() {
    -    let stopped = false
    -    const stop = () => {
    -      this.pause()
    -      this.removeListener(ERROR, stop)
    -      this.removeListener(DESTROYED, stop)
    -      this.removeListener('end', stop)
    -      stopped = true
    -      return { done: true }
    -    }
    -
    -    const next = () => {
    -      if (stopped) return stop()
    -      const value = this.read()
    -      return value === null ? stop() : { value }
    -    }
    -    this.once('end', stop)
    -    this.once(ERROR, stop)
    -    this.once(DESTROYED, stop)
    -
    -    return {
    -      next,
    -      throw: stop,
    -      return: stop,
    -      [ITERATOR]() {
    -        return this
    -      },
    -    }
    -  }
    -
    -  destroy(er) {
    -    if (this[DESTROYED]) {
    -      if (er) this.emit('error', er)
    -      else this.emit(DESTROYED)
    -      return this
    -    }
    -
    -    this[DESTROYED] = true
    -
    -    // throw away all buffered data, it's never coming out
    -    this[BUFFER].length = 0
    -    this[BUFFERLENGTH] = 0
    -
    -    if (typeof this.close === 'function' && !this[CLOSED]) this.close()
    -
    -    if (er) this.emit('error', er)
    -    // if no error to emit, still reject pending promises
    -    else this.emit(DESTROYED)
    -
    -    return this
    -  }
    -
    -  static isStream(s) {
    -    return (
    -      !!s &&
    -      (s instanceof Minipass ||
    -        s instanceof Stream ||
    -        (s instanceof EE &&
    -          // readable
    -          (typeof s.pipe === 'function' ||
    -            // writable
    -            (typeof s.write === 'function' && typeof s.end === 'function'))))
    -    )
    -  }
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/minipass/package.json b/deps/npm/node_modules/node-gyp/node_modules/minipass/package.json
    deleted file mode 100644
    index 0e20e988047f23..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/minipass/package.json
    +++ /dev/null
    @@ -1,76 +0,0 @@
    -{
    -  "name": "minipass",
    -  "version": "5.0.0",
    -  "description": "minimal implementation of a PassThrough stream",
    -  "main": "./index.js",
    -  "module": "./index.mjs",
    -  "types": "./index.d.ts",
    -  "exports": {
    -    ".": {
    -      "import": {
    -        "types": "./index.d.ts",
    -        "default": "./index.mjs"
    -      },
    -      "require": {
    -        "types": "./index.d.ts",
    -        "default": "./index.js"
    -      }
    -    },
    -    "./package.json": "./package.json"
    -  },
    -  "devDependencies": {
    -    "@types/node": "^17.0.41",
    -    "end-of-stream": "^1.4.0",
    -    "node-abort-controller": "^3.1.1",
    -    "prettier": "^2.6.2",
    -    "tap": "^16.2.0",
    -    "through2": "^2.0.3",
    -    "ts-node": "^10.8.1",
    -    "typedoc": "^0.23.24",
    -    "typescript": "^4.7.3"
    -  },
    -  "scripts": {
    -    "pretest": "npm run prepare",
    -    "presnap": "npm run prepare",
    -    "prepare": "node ./scripts/transpile-to-esm.js",
    -    "snap": "tap",
    -    "test": "tap",
    -    "preversion": "npm test",
    -    "postversion": "npm publish",
    -    "postpublish": "git push origin --follow-tags",
    -    "typedoc": "typedoc ./index.d.ts",
    -    "format": "prettier --write . --loglevel warn"
    -  },
    -  "repository": {
    -    "type": "git",
    -    "url": "git+https://github.com/isaacs/minipass.git"
    -  },
    -  "keywords": [
    -    "passthrough",
    -    "stream"
    -  ],
    -  "author": "Isaac Z. Schlueter  (http://blog.izs.me/)",
    -  "license": "ISC",
    -  "files": [
    -    "index.d.ts",
    -    "index.js",
    -    "index.mjs"
    -  ],
    -  "tap": {
    -    "check-coverage": true
    -  },
    -  "engines": {
    -    "node": ">=8"
    -  },
    -  "prettier": {
    -    "semi": false,
    -    "printWidth": 80,
    -    "tabWidth": 2,
    -    "useTabs": false,
    -    "singleQuote": true,
    -    "jsxSingleQuote": false,
    -    "bracketSameLine": true,
    -    "arrowParens": "avoid",
    -    "endOfLine": "lf"
    -  }
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/nopt/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/nopt/LICENSE
    deleted file mode 100644
    index 19129e315fe593..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/nopt/LICENSE
    +++ /dev/null
    @@ -1,15 +0,0 @@
    -The ISC License
    -
    -Copyright (c) Isaac Z. Schlueter and Contributors
    -
    -Permission to use, copy, modify, and/or distribute this software for any
    -purpose with or without fee is hereby granted, provided that the above
    -copyright notice and this permission notice appear in all copies.
    -
    -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
    -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/nopt/README.md b/deps/npm/node_modules/node-gyp/node_modules/nopt/README.md
    deleted file mode 100644
    index a99531c04655fe..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/nopt/README.md
    +++ /dev/null
    @@ -1,213 +0,0 @@
    -If you want to write an option parser, and have it be good, there are
    -two ways to do it.  The Right Way, and the Wrong Way.
    -
    -The Wrong Way is to sit down and write an option parser.  We've all done
    -that.
    -
    -The Right Way is to write some complex configurable program with so many
    -options that you hit the limit of your frustration just trying to
    -manage them all, and defer it with duct-tape solutions until you see
    -exactly to the core of the problem, and finally snap and write an
    -awesome option parser.
    -
    -If you want to write an option parser, don't write an option parser.
    -Write a package manager, or a source control system, or a service
    -restarter, or an operating system.  You probably won't end up with a
    -good one of those, but if you don't give up, and you are relentless and
    -diligent enough in your procrastination, you may just end up with a very
    -nice option parser.
    -
    -## USAGE
    -
    -```javascript
    -// my-program.js
    -var nopt = require("nopt")
    -  , Stream = require("stream").Stream
    -  , path = require("path")
    -  , knownOpts = { "foo" : [String, null]
    -                , "bar" : [Stream, Number]
    -                , "baz" : path
    -                , "bloo" : [ "big", "medium", "small" ]
    -                , "flag" : Boolean
    -                , "pick" : Boolean
    -                , "many1" : [String, Array]
    -                , "many2" : [path, Array]
    -                }
    -  , shortHands = { "foofoo" : ["--foo", "Mr. Foo"]
    -                 , "b7" : ["--bar", "7"]
    -                 , "m" : ["--bloo", "medium"]
    -                 , "p" : ["--pick"]
    -                 , "f" : ["--flag"]
    -                 }
    -             // everything is optional.
    -             // knownOpts and shorthands default to {}
    -             // arg list defaults to process.argv
    -             // slice defaults to 2
    -  , parsed = nopt(knownOpts, shortHands, process.argv, 2)
    -console.log(parsed)
    -```
    -
    -This would give you support for any of the following:
    -
    -```console
    -$ node my-program.js --foo "blerp" --no-flag
    -{ "foo" : "blerp", "flag" : false }
    -
    -$ node my-program.js ---bar 7 --foo "Mr. Hand" --flag
    -{ bar: 7, foo: "Mr. Hand", flag: true }
    -
    -$ node my-program.js --foo "blerp" -f -----p
    -{ foo: "blerp", flag: true, pick: true }
    -
    -$ node my-program.js -fp --foofoo
    -{ foo: "Mr. Foo", flag: true, pick: true }
    -
    -$ node my-program.js --foofoo -- -fp  # -- stops the flag parsing.
    -{ foo: "Mr. Foo", argv: { remain: ["-fp"] } }
    -
    -$ node my-program.js --blatzk -fp # unknown opts are ok.
    -{ blatzk: true, flag: true, pick: true }
    -
    -$ node my-program.js --blatzk=1000 -fp # but you need to use = if they have a value
    -{ blatzk: 1000, flag: true, pick: true }
    -
    -$ node my-program.js --no-blatzk -fp # unless they start with "no-"
    -{ blatzk: false, flag: true, pick: true }
    -
    -$ node my-program.js --baz b/a/z # known paths are resolved.
    -{ baz: "/Users/isaacs/b/a/z" }
    -
    -# if Array is one of the types, then it can take many
    -# values, and will always be an array.  The other types provided
    -# specify what types are allowed in the list.
    -
    -$ node my-program.js --many1 5 --many1 null --many1 foo
    -{ many1: ["5", "null", "foo"] }
    -
    -$ node my-program.js --many2 foo --many2 bar
    -{ many2: ["/path/to/foo", "path/to/bar"] }
    -```
    -
    -Read the tests at the bottom of `lib/nopt.js` for more examples of
    -what this puppy can do.
    -
    -## Types
    -
    -The following types are supported, and defined on `nopt.typeDefs`
    -
    -* String: A normal string.  No parsing is done.
    -* path: A file system path.  Gets resolved against cwd if not absolute.
    -* url: A url.  If it doesn't parse, it isn't accepted.
    -* Number: Must be numeric.
    -* Date: Must parse as a date. If it does, and `Date` is one of the options,
    -  then it will return a Date object, not a string.
    -* Boolean: Must be either `true` or `false`.  If an option is a boolean,
    -  then it does not need a value, and its presence will imply `true` as
    -  the value.  To negate boolean flags, do `--no-whatever` or `--whatever
    -  false`
    -* NaN: Means that the option is strictly not allowed.  Any value will
    -  fail.
    -* Stream: An object matching the "Stream" class in node.  Valuable
    -  for use when validating programmatically.  (npm uses this to let you
    -  supply any WriteStream on the `outfd` and `logfd` config options.)
    -* Array: If `Array` is specified as one of the types, then the value
    -  will be parsed as a list of options.  This means that multiple values
    -  can be specified, and that the value will always be an array.
    -
    -If a type is an array of values not on this list, then those are
    -considered valid values.  For instance, in the example above, the
    -`--bloo` option can only be one of `"big"`, `"medium"`, or `"small"`,
    -and any other value will be rejected.
    -
    -When parsing unknown fields, `"true"`, `"false"`, and `"null"` will be
    -interpreted as their JavaScript equivalents.
    -
    -You can also mix types and values, or multiple types, in a list.  For
    -instance `{ blah: [Number, null] }` would allow a value to be set to
    -either a Number or null.  When types are ordered, this implies a
    -preference, and the first type that can be used to properly interpret
    -the value will be used.
    -
    -To define a new type, add it to `nopt.typeDefs`.  Each item in that
    -hash is an object with a `type` member and a `validate` method.  The
    -`type` member is an object that matches what goes in the type list.  The
    -`validate` method is a function that gets called with `validate(data,
    -key, val)`.  Validate methods should assign `data[key]` to the valid
    -value of `val` if it can be handled properly, or return boolean
    -`false` if it cannot.
    -
    -You can also call `nopt.clean(data, types, typeDefs)` to clean up a
    -config object and remove its invalid properties.
    -
    -## Error Handling
    -
    -By default, nopt outputs a warning to standard error when invalid values for
    -known options are found.  You can change this behavior by assigning a method
    -to `nopt.invalidHandler`.  This method will be called with
    -the offending `nopt.invalidHandler(key, val, types)`.
    -
    -If no `nopt.invalidHandler` is assigned, then it will console.error
    -its whining.  If it is assigned to boolean `false` then the warning is
    -suppressed.
    -
    -## Abbreviations
    -
    -Yes, they are supported.  If you define options like this:
    -
    -```javascript
    -{ "foolhardyelephants" : Boolean
    -, "pileofmonkeys" : Boolean }
    -```
    -
    -Then this will work:
    -
    -```bash
    -node program.js --foolhar --pil
    -node program.js --no-f --pileofmon
    -# etc.
    -```
    -
    -## Shorthands
    -
    -Shorthands are a hash of shorter option names to a snippet of args that
    -they expand to.
    -
    -If multiple one-character shorthands are all combined, and the
    -combination does not unambiguously match any other option or shorthand,
    -then they will be broken up into their constituent parts.  For example:
    -
    -```json
    -{ "s" : ["--loglevel", "silent"]
    -, "g" : "--global"
    -, "f" : "--force"
    -, "p" : "--parseable"
    -, "l" : "--long"
    -}
    -```
    -
    -```bash
    -npm ls -sgflp
    -# just like doing this:
    -npm ls --loglevel silent --global --force --long --parseable
    -```
    -
    -## The Rest of the args
    -
    -The config object returned by nopt is given a special member called
    -`argv`, which is an object with the following fields:
    -
    -* `remain`: The remaining args after all the parsing has occurred.
    -* `original`: The args as they originally appeared.
    -* `cooked`: The args after flags and shorthands are expanded.
    -
    -## Slicing
    -
    -Node programs are called with more or less the exact argv as it appears
    -in C land, after the v8 and node-specific options have been plucked off.
    -As such, `argv[0]` is always `node` and `argv[1]` is always the
    -JavaScript program being run.
    -
    -That's usually not very useful to you.  So they're sliced off by
    -default.  If you want them, then you can pass in `0` as the last
    -argument, or any other number that you'd like to slice off the start of
    -the list.
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/nopt/bin/nopt.js b/deps/npm/node_modules/node-gyp/node_modules/nopt/bin/nopt.js
    deleted file mode 100755
    index bb04291c607acf..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/nopt/bin/nopt.js
    +++ /dev/null
    @@ -1,56 +0,0 @@
    -#!/usr/bin/env node
    -var nopt = require('../lib/nopt')
    -var path = require('path')
    -var types = { num: Number,
    -  bool: Boolean,
    -  help: Boolean,
    -  list: Array,
    -  'num-list': [Number, Array],
    -  'str-list': [String, Array],
    -  'bool-list': [Boolean, Array],
    -  str: String,
    -  clear: Boolean,
    -  config: Boolean,
    -  length: Number,
    -  file: path,
    -}
    -var shorthands = { s: ['--str', 'astring'],
    -  b: ['--bool'],
    -  nb: ['--no-bool'],
    -  tft: ['--bool-list', '--no-bool-list', '--bool-list', 'true'],
    -  '?': ['--help'],
    -  h: ['--help'],
    -  H: ['--help'],
    -  n: ['--num', '125'],
    -  c: ['--config'],
    -  l: ['--length'],
    -  f: ['--file'],
    -}
    -var parsed = nopt(types
    -  , shorthands
    -  , process.argv
    -  , 2)
    -
    -console.log('parsed', parsed)
    -
    -if (parsed.help) {
    -  console.log('')
    -  console.log('nopt cli tester')
    -  console.log('')
    -  console.log('types')
    -  console.log(Object.keys(types).map(function M (t) {
    -    var type = types[t]
    -    if (Array.isArray(type)) {
    -      return [t, type.map(function (mappedType) {
    -        return mappedType.name
    -      })]
    -    }
    -    return [t, type && type.name]
    -  }).reduce(function (s, i) {
    -    s[i[0]] = i[1]
    -    return s
    -  }, {}))
    -  console.log('')
    -  console.log('shorthands')
    -  console.log(shorthands)
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/nopt/lib/nopt.js b/deps/npm/node_modules/node-gyp/node_modules/nopt/lib/nopt.js
    deleted file mode 100644
    index 5829c2fe0f6379..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/nopt/lib/nopt.js
    +++ /dev/null
    @@ -1,515 +0,0 @@
    -// info about each config option.
    -
    -var debug = process.env.DEBUG_NOPT || process.env.NOPT_DEBUG
    -  ? function () {
    -    console.error.apply(console, arguments)
    -  }
    -  : function () {}
    -
    -var url = require('url')
    -var path = require('path')
    -var Stream = require('stream').Stream
    -var abbrev = require('abbrev')
    -var os = require('os')
    -
    -module.exports = exports = nopt
    -exports.clean = clean
    -
    -exports.typeDefs =
    -  { String: { type: String, validate: validateString },
    -    Boolean: { type: Boolean, validate: validateBoolean },
    -    url: { type: url, validate: validateUrl },
    -    Number: { type: Number, validate: validateNumber },
    -    path: { type: path, validate: validatePath },
    -    Stream: { type: Stream, validate: validateStream },
    -    Date: { type: Date, validate: validateDate },
    -  }
    -
    -function nopt (types, shorthands, args, slice) {
    -  args = args || process.argv
    -  types = types || {}
    -  shorthands = shorthands || {}
    -  if (typeof slice !== 'number') {
    -    slice = 2
    -  }
    -
    -  debug(types, shorthands, args, slice)
    -
    -  args = args.slice(slice)
    -  var data = {}
    -  var argv = {
    -    remain: [],
    -    cooked: args,
    -    original: args.slice(0),
    -  }
    -
    -  parse(args, data, argv.remain, types, shorthands)
    -  // now data is full
    -  clean(data, types, exports.typeDefs)
    -  data.argv = argv
    -  Object.defineProperty(data.argv, 'toString', { value: function () {
    -    return this.original.map(JSON.stringify).join(' ')
    -  },
    -  enumerable: false })
    -  return data
    -}
    -
    -function clean (data, types, typeDefs) {
    -  typeDefs = typeDefs || exports.typeDefs
    -  var remove = {}
    -  var typeDefault = [false, true, null, String, Array]
    -
    -  Object.keys(data).forEach(function (k) {
    -    if (k === 'argv') {
    -      return
    -    }
    -    var val = data[k]
    -    var isArray = Array.isArray(val)
    -    var type = types[k]
    -    if (!isArray) {
    -      val = [val]
    -    }
    -    if (!type) {
    -      type = typeDefault
    -    }
    -    if (type === Array) {
    -      type = typeDefault.concat(Array)
    -    }
    -    if (!Array.isArray(type)) {
    -      type = [type]
    -    }
    -
    -    debug('val=%j', val)
    -    debug('types=', type)
    -    val = val.map(function (v) {
    -      // if it's an unknown value, then parse false/true/null/numbers/dates
    -      if (typeof v === 'string') {
    -        debug('string %j', v)
    -        v = v.trim()
    -        if ((v === 'null' && ~type.indexOf(null))
    -            || (v === 'true' &&
    -               (~type.indexOf(true) || ~type.indexOf(Boolean)))
    -            || (v === 'false' &&
    -               (~type.indexOf(false) || ~type.indexOf(Boolean)))) {
    -          v = JSON.parse(v)
    -          debug('jsonable %j', v)
    -        } else if (~type.indexOf(Number) && !isNaN(v)) {
    -          debug('convert to number', v)
    -          v = +v
    -        } else if (~type.indexOf(Date) && !isNaN(Date.parse(v))) {
    -          debug('convert to date', v)
    -          v = new Date(v)
    -        }
    -      }
    -
    -      if (!Object.prototype.hasOwnProperty.call(types, k)) {
    -        return v
    -      }
    -
    -      // allow `--no-blah` to set 'blah' to null if null is allowed
    -      if (v === false && ~type.indexOf(null) &&
    -          !(~type.indexOf(false) || ~type.indexOf(Boolean))) {
    -        v = null
    -      }
    -
    -      var d = {}
    -      d[k] = v
    -      debug('prevalidated val', d, v, types[k])
    -      if (!validate(d, k, v, types[k], typeDefs)) {
    -        if (exports.invalidHandler) {
    -          exports.invalidHandler(k, v, types[k], data)
    -        } else if (exports.invalidHandler !== false) {
    -          debug('invalid: ' + k + '=' + v, types[k])
    -        }
    -        return remove
    -      }
    -      debug('validated v', d, v, types[k])
    -      return d[k]
    -    }).filter(function (v) {
    -      return v !== remove
    -    })
    -
    -    // if we allow Array specifically, then an empty array is how we
    -    // express 'no value here', not null.  Allow it.
    -    if (!val.length && type.indexOf(Array) === -1) {
    -      debug('VAL HAS NO LENGTH, DELETE IT', val, k, type.indexOf(Array))
    -      delete data[k]
    -    } else if (isArray) {
    -      debug(isArray, data[k], val)
    -      data[k] = val
    -    } else {
    -      data[k] = val[0]
    -    }
    -
    -    debug('k=%s val=%j', k, val, data[k])
    -  })
    -}
    -
    -function validateString (data, k, val) {
    -  data[k] = String(val)
    -}
    -
    -function validatePath (data, k, val) {
    -  if (val === true) {
    -    return false
    -  }
    -  if (val === null) {
    -    return true
    -  }
    -
    -  val = String(val)
    -
    -  var isWin = process.platform === 'win32'
    -  var homePattern = isWin ? /^~(\/|\\)/ : /^~\//
    -  var home = os.homedir()
    -
    -  if (home && val.match(homePattern)) {
    -    data[k] = path.resolve(home, val.slice(2))
    -  } else {
    -    data[k] = path.resolve(val)
    -  }
    -  return true
    -}
    -
    -function validateNumber (data, k, val) {
    -  debug('validate Number %j %j %j', k, val, isNaN(val))
    -  if (isNaN(val)) {
    -    return false
    -  }
    -  data[k] = +val
    -}
    -
    -function validateDate (data, k, val) {
    -  var s = Date.parse(val)
    -  debug('validate Date %j %j %j', k, val, s)
    -  if (isNaN(s)) {
    -    return false
    -  }
    -  data[k] = new Date(val)
    -}
    -
    -function validateBoolean (data, k, val) {
    -  if (val instanceof Boolean) {
    -    val = val.valueOf()
    -  } else if (typeof val === 'string') {
    -    if (!isNaN(val)) {
    -      val = !!(+val)
    -    } else if (val === 'null' || val === 'false') {
    -      val = false
    -    } else {
    -      val = true
    -    }
    -  } else {
    -    val = !!val
    -  }
    -  data[k] = val
    -}
    -
    -function validateUrl (data, k, val) {
    -  // Changing this would be a breaking change in the npm cli
    -  /* eslint-disable-next-line node/no-deprecated-api */
    -  val = url.parse(String(val))
    -  if (!val.host) {
    -    return false
    -  }
    -  data[k] = val.href
    -}
    -
    -function validateStream (data, k, val) {
    -  if (!(val instanceof Stream)) {
    -    return false
    -  }
    -  data[k] = val
    -}
    -
    -function validate (data, k, val, type, typeDefs) {
    -  // arrays are lists of types.
    -  if (Array.isArray(type)) {
    -    for (let i = 0, l = type.length; i < l; i++) {
    -      if (type[i] === Array) {
    -        continue
    -      }
    -      if (validate(data, k, val, type[i], typeDefs)) {
    -        return true
    -      }
    -    }
    -    delete data[k]
    -    return false
    -  }
    -
    -  // an array of anything?
    -  if (type === Array) {
    -    return true
    -  }
    -
    -  // Original comment:
    -  // NaN is poisonous.  Means that something is not allowed.
    -  // New comment: Changing this to an isNaN check breaks a lot of tests.
    -  // Something is being assumed here that is not actually what happens in
    -  // practice.  Fixing it is outside the scope of getting linting to pass in
    -  // this repo. Leaving as-is for now.
    -  /* eslint-disable-next-line no-self-compare */
    -  if (type !== type) {
    -    debug('Poison NaN', k, val, type)
    -    delete data[k]
    -    return false
    -  }
    -
    -  // explicit list of values
    -  if (val === type) {
    -    debug('Explicitly allowed %j', val)
    -    // if (isArray) (data[k] = data[k] || []).push(val)
    -    // else data[k] = val
    -    data[k] = val
    -    return true
    -  }
    -
    -  // now go through the list of typeDefs, validate against each one.
    -  var ok = false
    -  var types = Object.keys(typeDefs)
    -  for (let i = 0, l = types.length; i < l; i++) {
    -    debug('test type %j %j %j', k, val, types[i])
    -    var t = typeDefs[types[i]]
    -    if (t && (
    -      (type && type.name && t.type && t.type.name) ?
    -        (type.name === t.type.name) :
    -        (type === t.type)
    -    )) {
    -      var d = {}
    -      ok = t.validate(d, k, val) !== false
    -      val = d[k]
    -      if (ok) {
    -        // if (isArray) (data[k] = data[k] || []).push(val)
    -        // else data[k] = val
    -        data[k] = val
    -        break
    -      }
    -    }
    -  }
    -  debug('OK? %j (%j %j %j)', ok, k, val, types[types.length - 1])
    -
    -  if (!ok) {
    -    delete data[k]
    -  }
    -  return ok
    -}
    -
    -function parse (args, data, remain, types, shorthands) {
    -  debug('parse', args, data, remain)
    -
    -  var abbrevs = abbrev(Object.keys(types))
    -  var shortAbbr = abbrev(Object.keys(shorthands))
    -
    -  for (var i = 0; i < args.length; i++) {
    -    var arg = args[i]
    -    debug('arg', arg)
    -
    -    if (arg.match(/^-{2,}$/)) {
    -      // done with keys.
    -      // the rest are args.
    -      remain.push.apply(remain, args.slice(i + 1))
    -      args[i] = '--'
    -      break
    -    }
    -    var hadEq = false
    -    if (arg.charAt(0) === '-' && arg.length > 1) {
    -      var at = arg.indexOf('=')
    -      if (at > -1) {
    -        hadEq = true
    -        var v = arg.slice(at + 1)
    -        arg = arg.slice(0, at)
    -        args.splice(i, 1, arg, v)
    -      }
    -
    -      // see if it's a shorthand
    -      // if so, splice and back up to re-parse it.
    -      var shRes = resolveShort(arg, shorthands, shortAbbr, abbrevs)
    -      debug('arg=%j shRes=%j', arg, shRes)
    -      if (shRes) {
    -        debug(arg, shRes)
    -        args.splice.apply(args, [i, 1].concat(shRes))
    -        if (arg !== shRes[0]) {
    -          i--
    -          continue
    -        }
    -      }
    -      arg = arg.replace(/^-+/, '')
    -      var no = null
    -      while (arg.toLowerCase().indexOf('no-') === 0) {
    -        no = !no
    -        arg = arg.slice(3)
    -      }
    -
    -      if (abbrevs[arg]) {
    -        arg = abbrevs[arg]
    -      }
    -
    -      var argType = types[arg]
    -      var isTypeArray = Array.isArray(argType)
    -      if (isTypeArray && argType.length === 1) {
    -        isTypeArray = false
    -        argType = argType[0]
    -      }
    -
    -      var isArray = argType === Array ||
    -        isTypeArray && argType.indexOf(Array) !== -1
    -
    -      // allow unknown things to be arrays if specified multiple times.
    -      if (
    -        !Object.prototype.hasOwnProperty.call(types, arg) &&
    -        Object.prototype.hasOwnProperty.call(data, arg)
    -      ) {
    -        if (!Array.isArray(data[arg])) {
    -          data[arg] = [data[arg]]
    -        }
    -        isArray = true
    -      }
    -
    -      var val
    -      var la = args[i + 1]
    -
    -      var isBool = typeof no === 'boolean' ||
    -        argType === Boolean ||
    -        isTypeArray && argType.indexOf(Boolean) !== -1 ||
    -        (typeof argType === 'undefined' && !hadEq) ||
    -        (la === 'false' &&
    -         (argType === null ||
    -          isTypeArray && ~argType.indexOf(null)))
    -
    -      if (isBool) {
    -        // just set and move along
    -        val = !no
    -        // however, also support --bool true or --bool false
    -        if (la === 'true' || la === 'false') {
    -          val = JSON.parse(la)
    -          la = null
    -          if (no) {
    -            val = !val
    -          }
    -          i++
    -        }
    -
    -        // also support "foo":[Boolean, "bar"] and "--foo bar"
    -        if (isTypeArray && la) {
    -          if (~argType.indexOf(la)) {
    -            // an explicit type
    -            val = la
    -            i++
    -          } else if (la === 'null' && ~argType.indexOf(null)) {
    -            // null allowed
    -            val = null
    -            i++
    -          } else if (!la.match(/^-{2,}[^-]/) &&
    -                      !isNaN(la) &&
    -                      ~argType.indexOf(Number)) {
    -            // number
    -            val = +la
    -            i++
    -          } else if (!la.match(/^-[^-]/) && ~argType.indexOf(String)) {
    -            // string
    -            val = la
    -            i++
    -          }
    -        }
    -
    -        if (isArray) {
    -          (data[arg] = data[arg] || []).push(val)
    -        } else {
    -          data[arg] = val
    -        }
    -
    -        continue
    -      }
    -
    -      if (argType === String) {
    -        if (la === undefined) {
    -          la = ''
    -        } else if (la.match(/^-{1,2}[^-]+/)) {
    -          la = ''
    -          i--
    -        }
    -      }
    -
    -      if (la && la.match(/^-{2,}$/)) {
    -        la = undefined
    -        i--
    -      }
    -
    -      val = la === undefined ? true : la
    -      if (isArray) {
    -        (data[arg] = data[arg] || []).push(val)
    -      } else {
    -        data[arg] = val
    -      }
    -
    -      i++
    -      continue
    -    }
    -    remain.push(arg)
    -  }
    -}
    -
    -function resolveShort (arg, shorthands, shortAbbr, abbrevs) {
    -  // handle single-char shorthands glommed together, like
    -  // npm ls -glp, but only if there is one dash, and only if
    -  // all of the chars are single-char shorthands, and it's
    -  // not a match to some other abbrev.
    -  arg = arg.replace(/^-+/, '')
    -
    -  // if it's an exact known option, then don't go any further
    -  if (abbrevs[arg] === arg) {
    -    return null
    -  }
    -
    -  // if it's an exact known shortopt, same deal
    -  if (shorthands[arg]) {
    -    // make it an array, if it's a list of words
    -    if (shorthands[arg] && !Array.isArray(shorthands[arg])) {
    -      shorthands[arg] = shorthands[arg].split(/\s+/)
    -    }
    -
    -    return shorthands[arg]
    -  }
    -
    -  // first check to see if this arg is a set of single-char shorthands
    -  var singles = shorthands.___singles
    -  if (!singles) {
    -    singles = Object.keys(shorthands).filter(function (s) {
    -      return s.length === 1
    -    }).reduce(function (l, r) {
    -      l[r] = true
    -      return l
    -    }, {})
    -    shorthands.___singles = singles
    -    debug('shorthand singles', singles)
    -  }
    -
    -  var chrs = arg.split('').filter(function (c) {
    -    return singles[c]
    -  })
    -
    -  if (chrs.join('') === arg) {
    -    return chrs.map(function (c) {
    -      return shorthands[c]
    -    }).reduce(function (l, r) {
    -      return l.concat(r)
    -    }, [])
    -  }
    -
    -  // if it's an arg abbrev, and not a literal shorthand, then prefer the arg
    -  if (abbrevs[arg] && !shorthands[arg]) {
    -    return null
    -  }
    -
    -  // if it's an abbr for a shorthand, then use that
    -  if (shortAbbr[arg]) {
    -    arg = shortAbbr[arg]
    -  }
    -
    -  // make it an array, if it's a list of words
    -  if (shorthands[arg] && !Array.isArray(shorthands[arg])) {
    -    shorthands[arg] = shorthands[arg].split(/\s+/)
    -  }
    -
    -  return shorthands[arg]
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/nopt/package.json b/deps/npm/node_modules/node-gyp/node_modules/nopt/package.json
    deleted file mode 100644
    index a3cd13d8c714bd..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/nopt/package.json
    +++ /dev/null
    @@ -1,53 +0,0 @@
    -{
    -  "name": "nopt",
    -  "version": "6.0.0",
    -  "description": "Option parsing for Node, supporting types, shorthands, etc. Used by npm.",
    -  "author": "GitHub Inc.",
    -  "main": "lib/nopt.js",
    -  "scripts": {
    -    "preversion": "npm test",
    -    "postversion": "npm publish",
    -    "prepublishOnly": "git push origin --follow-tags",
    -    "test": "tap",
    -    "lint": "eslint \"**/*.js\"",
    -    "postlint": "template-oss-check",
    -    "template-oss-apply": "template-oss-apply --force",
    -    "lintfix": "npm run lint -- --fix",
    -    "snap": "tap",
    -    "posttest": "npm run lint"
    -  },
    -  "repository": {
    -    "type": "git",
    -    "url": "https://github.com/npm/nopt.git"
    -  },
    -  "bin": {
    -    "nopt": "bin/nopt.js"
    -  },
    -  "license": "ISC",
    -  "dependencies": {
    -    "abbrev": "^1.0.0"
    -  },
    -  "devDependencies": {
    -    "@npmcli/eslint-config": "^3.0.1",
    -    "@npmcli/template-oss": "3.5.0",
    -    "tap": "^16.3.0"
    -  },
    -  "tap": {
    -    "lines": 87,
    -    "functions": 91,
    -    "branches": 81,
    -    "statements": 87
    -  },
    -  "files": [
    -    "bin/",
    -    "lib/"
    -  ],
    -  "engines": {
    -    "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
    -  },
    -  "templateOSS": {
    -    "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "windowsCI": false,
    -    "version": "3.5.0"
    -  }
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/npmlog/LICENSE.md b/deps/npm/node_modules/node-gyp/node_modules/npmlog/LICENSE.md
    deleted file mode 100644
    index 5fc208ff122e08..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/npmlog/LICENSE.md
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -
    -
    -ISC License
    -
    -Copyright npm, Inc.
    -
    -Permission to use, copy, modify, and/or distribute this
    -software for any purpose with or without fee is hereby
    -granted, provided that the above copyright notice and this
    -permission notice appear in all copies.
    -
    -THE SOFTWARE IS PROVIDED "AS IS" AND NPM DISCLAIMS ALL
    -WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
    -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
    -EVENT SHALL NPM BE LIABLE FOR ANY SPECIAL, DIRECT,
    -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
    -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
    -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
    -USE OR PERFORMANCE OF THIS SOFTWARE.
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/npmlog/lib/log.js b/deps/npm/node_modules/node-gyp/node_modules/npmlog/lib/log.js
    deleted file mode 100644
    index be650c6a426080..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/npmlog/lib/log.js
    +++ /dev/null
    @@ -1,404 +0,0 @@
    -'use strict'
    -var Progress = require('are-we-there-yet')
    -var Gauge = require('gauge')
    -var EE = require('events').EventEmitter
    -var log = exports = module.exports = new EE()
    -var util = require('util')
    -
    -var setBlocking = require('set-blocking')
    -var consoleControl = require('console-control-strings')
    -
    -setBlocking(true)
    -var stream = process.stderr
    -Object.defineProperty(log, 'stream', {
    -  set: function (newStream) {
    -    stream = newStream
    -    if (this.gauge) {
    -      this.gauge.setWriteTo(stream, stream)
    -    }
    -  },
    -  get: function () {
    -    return stream
    -  },
    -})
    -
    -// by default, decide based on tty-ness.
    -var colorEnabled
    -log.useColor = function () {
    -  return colorEnabled != null ? colorEnabled : stream.isTTY
    -}
    -
    -log.enableColor = function () {
    -  colorEnabled = true
    -  this.gauge.setTheme({ hasColor: colorEnabled, hasUnicode: unicodeEnabled })
    -}
    -log.disableColor = function () {
    -  colorEnabled = false
    -  this.gauge.setTheme({ hasColor: colorEnabled, hasUnicode: unicodeEnabled })
    -}
    -
    -// default level
    -log.level = 'info'
    -
    -log.gauge = new Gauge(stream, {
    -  enabled: false, // no progress bars unless asked
    -  theme: { hasColor: log.useColor() },
    -  template: [
    -    { type: 'progressbar', length: 20 },
    -    { type: 'activityIndicator', kerning: 1, length: 1 },
    -    { type: 'section', default: '' },
    -    ':',
    -    { type: 'logline', kerning: 1, default: '' },
    -  ],
    -})
    -
    -log.tracker = new Progress.TrackerGroup()
    -
    -// we track this separately as we may need to temporarily disable the
    -// display of the status bar for our own loggy purposes.
    -log.progressEnabled = log.gauge.isEnabled()
    -
    -var unicodeEnabled
    -
    -log.enableUnicode = function () {
    -  unicodeEnabled = true
    -  this.gauge.setTheme({ hasColor: this.useColor(), hasUnicode: unicodeEnabled })
    -}
    -
    -log.disableUnicode = function () {
    -  unicodeEnabled = false
    -  this.gauge.setTheme({ hasColor: this.useColor(), hasUnicode: unicodeEnabled })
    -}
    -
    -log.setGaugeThemeset = function (themes) {
    -  this.gauge.setThemeset(themes)
    -}
    -
    -log.setGaugeTemplate = function (template) {
    -  this.gauge.setTemplate(template)
    -}
    -
    -log.enableProgress = function () {
    -  if (this.progressEnabled) {
    -    return
    -  }
    -
    -  this.progressEnabled = true
    -  this.tracker.on('change', this.showProgress)
    -  if (this._paused) {
    -    return
    -  }
    -
    -  this.gauge.enable()
    -}
    -
    -log.disableProgress = function () {
    -  if (!this.progressEnabled) {
    -    return
    -  }
    -  this.progressEnabled = false
    -  this.tracker.removeListener('change', this.showProgress)
    -  this.gauge.disable()
    -}
    -
    -var trackerConstructors = ['newGroup', 'newItem', 'newStream']
    -
    -var mixinLog = function (tracker) {
    -  // mixin the public methods from log into the tracker
    -  // (except: conflicts and one's we handle specially)
    -  Object.keys(log).forEach(function (P) {
    -    if (P[0] === '_') {
    -      return
    -    }
    -
    -    if (trackerConstructors.filter(function (C) {
    -      return C === P
    -    }).length) {
    -      return
    -    }
    -
    -    if (tracker[P]) {
    -      return
    -    }
    -
    -    if (typeof log[P] !== 'function') {
    -      return
    -    }
    -
    -    var func = log[P]
    -    tracker[P] = function () {
    -      return func.apply(log, arguments)
    -    }
    -  })
    -  // if the new tracker is a group, make sure any subtrackers get
    -  // mixed in too
    -  if (tracker instanceof Progress.TrackerGroup) {
    -    trackerConstructors.forEach(function (C) {
    -      var func = tracker[C]
    -      tracker[C] = function () {
    -        return mixinLog(func.apply(tracker, arguments))
    -      }
    -    })
    -  }
    -  return tracker
    -}
    -
    -// Add tracker constructors to the top level log object
    -trackerConstructors.forEach(function (C) {
    -  log[C] = function () {
    -    return mixinLog(this.tracker[C].apply(this.tracker, arguments))
    -  }
    -})
    -
    -log.clearProgress = function (cb) {
    -  if (!this.progressEnabled) {
    -    return cb && process.nextTick(cb)
    -  }
    -
    -  this.gauge.hide(cb)
    -}
    -
    -log.showProgress = function (name, completed) {
    -  if (!this.progressEnabled) {
    -    return
    -  }
    -
    -  var values = {}
    -  if (name) {
    -    values.section = name
    -  }
    -
    -  var last = log.record[log.record.length - 1]
    -  if (last) {
    -    values.subsection = last.prefix
    -    var disp = log.disp[last.level] || last.level
    -    var logline = this._format(disp, log.style[last.level])
    -    if (last.prefix) {
    -      logline += ' ' + this._format(last.prefix, this.prefixStyle)
    -    }
    -
    -    logline += ' ' + last.message.split(/\r?\n/)[0]
    -    values.logline = logline
    -  }
    -  values.completed = completed || this.tracker.completed()
    -  this.gauge.show(values)
    -}.bind(log) // bind for use in tracker's on-change listener
    -
    -// temporarily stop emitting, but don't drop
    -log.pause = function () {
    -  this._paused = true
    -  if (this.progressEnabled) {
    -    this.gauge.disable()
    -  }
    -}
    -
    -log.resume = function () {
    -  if (!this._paused) {
    -    return
    -  }
    -
    -  this._paused = false
    -
    -  var b = this._buffer
    -  this._buffer = []
    -  b.forEach(function (m) {
    -    this.emitLog(m)
    -  }, this)
    -  if (this.progressEnabled) {
    -    this.gauge.enable()
    -  }
    -}
    -
    -log._buffer = []
    -
    -var id = 0
    -log.record = []
    -log.maxRecordSize = 10000
    -log.log = function (lvl, prefix, message) {
    -  var l = this.levels[lvl]
    -  if (l === undefined) {
    -    return this.emit('error', new Error(util.format(
    -      'Undefined log level: %j', lvl)))
    -  }
    -
    -  var a = new Array(arguments.length - 2)
    -  var stack = null
    -  for (var i = 2; i < arguments.length; i++) {
    -    var arg = a[i - 2] = arguments[i]
    -
    -    // resolve stack traces to a plain string.
    -    if (typeof arg === 'object' && arg instanceof Error && arg.stack) {
    -      Object.defineProperty(arg, 'stack', {
    -        value: stack = arg.stack + '',
    -        enumerable: true,
    -        writable: true,
    -      })
    -    }
    -  }
    -  if (stack) {
    -    a.unshift(stack + '\n')
    -  }
    -  message = util.format.apply(util, a)
    -
    -  var m = {
    -    id: id++,
    -    level: lvl,
    -    prefix: String(prefix || ''),
    -    message: message,
    -    messageRaw: a,
    -  }
    -
    -  this.emit('log', m)
    -  this.emit('log.' + lvl, m)
    -  if (m.prefix) {
    -    this.emit(m.prefix, m)
    -  }
    -
    -  this.record.push(m)
    -  var mrs = this.maxRecordSize
    -  var n = this.record.length - mrs
    -  if (n > mrs / 10) {
    -    var newSize = Math.floor(mrs * 0.9)
    -    this.record = this.record.slice(-1 * newSize)
    -  }
    -
    -  this.emitLog(m)
    -}.bind(log)
    -
    -log.emitLog = function (m) {
    -  if (this._paused) {
    -    this._buffer.push(m)
    -    return
    -  }
    -  if (this.progressEnabled) {
    -    this.gauge.pulse(m.prefix)
    -  }
    -
    -  var l = this.levels[m.level]
    -  if (l === undefined) {
    -    return
    -  }
    -
    -  if (l < this.levels[this.level]) {
    -    return
    -  }
    -
    -  if (l > 0 && !isFinite(l)) {
    -    return
    -  }
    -
    -  // If 'disp' is null or undefined, use the lvl as a default
    -  // Allows: '', 0 as valid disp
    -  var disp = log.disp[m.level] != null ? log.disp[m.level] : m.level
    -  this.clearProgress()
    -  m.message.split(/\r?\n/).forEach(function (line) {
    -    var heading = this.heading
    -    if (heading) {
    -      this.write(heading, this.headingStyle)
    -      this.write(' ')
    -    }
    -    this.write(disp, log.style[m.level])
    -    var p = m.prefix || ''
    -    if (p) {
    -      this.write(' ')
    -    }
    -
    -    this.write(p, this.prefixStyle)
    -    this.write(' ' + line + '\n')
    -  }, this)
    -  this.showProgress()
    -}
    -
    -log._format = function (msg, style) {
    -  if (!stream) {
    -    return
    -  }
    -
    -  var output = ''
    -  if (this.useColor()) {
    -    style = style || {}
    -    var settings = []
    -    if (style.fg) {
    -      settings.push(style.fg)
    -    }
    -
    -    if (style.bg) {
    -      settings.push('bg' + style.bg[0].toUpperCase() + style.bg.slice(1))
    -    }
    -
    -    if (style.bold) {
    -      settings.push('bold')
    -    }
    -
    -    if (style.underline) {
    -      settings.push('underline')
    -    }
    -
    -    if (style.inverse) {
    -      settings.push('inverse')
    -    }
    -
    -    if (settings.length) {
    -      output += consoleControl.color(settings)
    -    }
    -
    -    if (style.beep) {
    -      output += consoleControl.beep()
    -    }
    -  }
    -  output += msg
    -  if (this.useColor()) {
    -    output += consoleControl.color('reset')
    -  }
    -
    -  return output
    -}
    -
    -log.write = function (msg, style) {
    -  if (!stream) {
    -    return
    -  }
    -
    -  stream.write(this._format(msg, style))
    -}
    -
    -log.addLevel = function (lvl, n, style, disp) {
    -  // If 'disp' is null or undefined, use the lvl as a default
    -  if (disp == null) {
    -    disp = lvl
    -  }
    -
    -  this.levels[lvl] = n
    -  this.style[lvl] = style
    -  if (!this[lvl]) {
    -    this[lvl] = function () {
    -      var a = new Array(arguments.length + 1)
    -      a[0] = lvl
    -      for (var i = 0; i < arguments.length; i++) {
    -        a[i + 1] = arguments[i]
    -      }
    -
    -      return this.log.apply(this, a)
    -    }.bind(this)
    -  }
    -  this.disp[lvl] = disp
    -}
    -
    -log.prefixStyle = { fg: 'magenta' }
    -log.headingStyle = { fg: 'white', bg: 'black' }
    -
    -log.style = {}
    -log.levels = {}
    -log.disp = {}
    -log.addLevel('silly', -Infinity, { inverse: true }, 'sill')
    -log.addLevel('verbose', 1000, { fg: 'cyan', bg: 'black' }, 'verb')
    -log.addLevel('info', 2000, { fg: 'green' })
    -log.addLevel('timing', 2500, { fg: 'green', bg: 'black' })
    -log.addLevel('http', 3000, { fg: 'green', bg: 'black' })
    -log.addLevel('notice', 3500, { fg: 'cyan', bg: 'black' })
    -log.addLevel('warn', 4000, { fg: 'black', bg: 'yellow' }, 'WARN')
    -log.addLevel('error', 5000, { fg: 'red', bg: 'black' }, 'ERR!')
    -log.addLevel('silent', Infinity)
    -
    -// allow 'error' prefix
    -log.on('error', function () {})
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/npmlog/package.json b/deps/npm/node_modules/node-gyp/node_modules/npmlog/package.json
    deleted file mode 100644
    index bdb5a384781ce8..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/npmlog/package.json
    +++ /dev/null
    @@ -1,51 +0,0 @@
    -{
    -  "author": "GitHub Inc.",
    -  "name": "npmlog",
    -  "description": "logger for npm",
    -  "version": "6.0.2",
    -  "repository": {
    -    "type": "git",
    -    "url": "https://github.com/npm/npmlog.git"
    -  },
    -  "main": "lib/log.js",
    -  "files": [
    -    "bin/",
    -    "lib/"
    -  ],
    -  "scripts": {
    -    "test": "tap",
    -    "npmclilint": "npmcli-lint",
    -    "lint": "eslint \"**/*.js\"",
    -    "lintfix": "npm run lint -- --fix",
    -    "posttest": "npm run lint",
    -    "postsnap": "npm run lintfix --",
    -    "postlint": "template-oss-check",
    -    "preversion": "npm test",
    -    "postversion": "npm publish",
    -    "prepublishOnly": "git push origin --follow-tags",
    -    "snap": "tap",
    -    "template-oss-apply": "template-oss-apply --force"
    -  },
    -  "dependencies": {
    -    "are-we-there-yet": "^3.0.0",
    -    "console-control-strings": "^1.1.0",
    -    "gauge": "^4.0.3",
    -    "set-blocking": "^2.0.0"
    -  },
    -  "devDependencies": {
    -    "@npmcli/eslint-config": "^3.0.1",
    -    "@npmcli/template-oss": "3.4.1",
    -    "tap": "^16.0.1"
    -  },
    -  "license": "ISC",
    -  "engines": {
    -    "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
    -  },
    -  "tap": {
    -    "branches": 95
    -  },
    -  "templateOSS": {
    -    "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "version": "3.4.1"
    -  }
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/CONTRIBUTING.md b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/CONTRIBUTING.md
    deleted file mode 100644
    index f478d58dca85b2..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/CONTRIBUTING.md
    +++ /dev/null
    @@ -1,38 +0,0 @@
    -# Developer's Certificate of Origin 1.1
    -
    -By making a contribution to this project, I certify that:
    -
    -* (a) The contribution was created in whole or in part by me and I
    -  have the right to submit it under the open source license
    -  indicated in the file; or
    -
    -* (b) The contribution is based upon previous work that, to the best
    -  of my knowledge, is covered under an appropriate open source
    -  license and I have the right under that license to submit that
    -  work with modifications, whether created in whole or in part
    -  by me, under the same open source license (unless I am
    -  permitted to submit under a different license), as indicated
    -  in the file; or
    -
    -* (c) The contribution was provided directly to me by some other
    -  person who certified (a), (b) or (c) and I have not modified
    -  it.
    -
    -* (d) I understand and agree that this project and the contribution
    -  are public and that a record of the contribution (including all
    -  personal information I submit with it, including my sign-off) is
    -  maintained indefinitely and may be redistributed consistent with
    -  this project or the open source license(s) involved.
    -
    -## Moderation Policy
    -
    -The [Node.js Moderation Policy] applies to this WG.
    -
    -## Code of Conduct
    -
    -The [Node.js Code of Conduct][] applies to this WG.
    -
    -[Node.js Code of Conduct]:
    -https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md
    -[Node.js Moderation Policy]:
    -https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/GOVERNANCE.md b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/GOVERNANCE.md
    deleted file mode 100644
    index 16ffb93f24bece..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/GOVERNANCE.md
    +++ /dev/null
    @@ -1,136 +0,0 @@
    -### Streams Working Group
    -
    -The Node.js Streams is jointly governed by a Working Group
    -(WG)
    -that is responsible for high-level guidance of the project.
    -
    -The WG has final authority over this project including:
    -
    -* Technical direction
    -* Project governance and process (including this policy)
    -* Contribution policy
    -* GitHub repository hosting
    -* Conduct guidelines
    -* Maintaining the list of additional Collaborators
    -
    -For the current list of WG members, see the project
    -[README.md](./README.md#current-project-team-members).
    -
    -### Collaborators
    -
    -The readable-stream GitHub repository is
    -maintained by the WG and additional Collaborators who are added by the
    -WG on an ongoing basis.
    -
    -Individuals making significant and valuable contributions are made
    -Collaborators and given commit-access to the project. These
    -individuals are identified by the WG and their addition as
    -Collaborators is discussed during the WG meeting.
    -
    -_Note:_ If you make a significant contribution and are not considered
    -for commit-access log an issue or contact a WG member directly and it
    -will be brought up in the next WG meeting.
    -
    -Modifications of the contents of the readable-stream repository are
    -made on
    -a collaborative basis. Anybody with a GitHub account may propose a
    -modification via pull request and it will be considered by the project
    -Collaborators. All pull requests must be reviewed and accepted by a
    -Collaborator with sufficient expertise who is able to take full
    -responsibility for the change. In the case of pull requests proposed
    -by an existing Collaborator, an additional Collaborator is required
    -for sign-off. Consensus should be sought if additional Collaborators
    -participate and there is disagreement around a particular
    -modification. See _Consensus Seeking Process_ below for further detail
    -on the consensus model used for governance.
    -
    -Collaborators may opt to elevate significant or controversial
    -modifications, or modifications that have not found consensus to the
    -WG for discussion by assigning the ***WG-agenda*** tag to a pull
    -request or issue. The WG should serve as the final arbiter where
    -required.
    -
    -For the current list of Collaborators, see the project
    -[README.md](./README.md#members).
    -
    -### WG Membership
    -
    -WG seats are not time-limited.  There is no fixed size of the WG.
    -However, the expected target is between 6 and 12, to ensure adequate
    -coverage of important areas of expertise, balanced with the ability to
    -make decisions efficiently.
    -
    -There is no specific set of requirements or qualifications for WG
    -membership beyond these rules.
    -
    -The WG may add additional members to the WG by unanimous consensus.
    -
    -A WG member may be removed from the WG by voluntary resignation, or by
    -unanimous consensus of all other WG members.
    -
    -Changes to WG membership should be posted in the agenda, and may be
    -suggested as any other agenda item (see "WG Meetings" below).
    -
    -If an addition or removal is proposed during a meeting, and the full
    -WG is not in attendance to participate, then the addition or removal
    -is added to the agenda for the subsequent meeting.  This is to ensure
    -that all members are given the opportunity to participate in all
    -membership decisions.  If a WG member is unable to attend a meeting
    -where a planned membership decision is being made, then their consent
    -is assumed.
    -
    -No more than 1/3 of the WG members may be affiliated with the same
    -employer.  If removal or resignation of a WG member, or a change of
    -employment by a WG member, creates a situation where more than 1/3 of
    -the WG membership shares an employer, then the situation must be
    -immediately remedied by the resignation or removal of one or more WG
    -members affiliated with the over-represented employer(s).
    -
    -### WG Meetings
    -
    -The WG meets occasionally on a Google Hangout On Air. A designated moderator
    -approved by the WG runs the meeting. Each meeting should be
    -published to YouTube.
    -
    -Items are added to the WG agenda that are considered contentious or
    -are modifications of governance, contribution policy, WG membership,
    -or release process.
    -
    -The intention of the agenda is not to approve or review all patches;
    -that should happen continuously on GitHub and be handled by the larger
    -group of Collaborators.
    -
    -Any community member or contributor can ask that something be added to
    -the next meeting's agenda by logging a GitHub Issue. Any Collaborator,
    -WG member or the moderator can add the item to the agenda by adding
    -the ***WG-agenda*** tag to the issue.
    -
    -Prior to each WG meeting the moderator will share the Agenda with
    -members of the WG. WG members can add any items they like to the
    -agenda at the beginning of each meeting. The moderator and the WG
    -cannot veto or remove items.
    -
    -The WG may invite persons or representatives from certain projects to
    -participate in a non-voting capacity.
    -
    -The moderator is responsible for summarizing the discussion of each
    -agenda item and sends it as a pull request after the meeting.
    -
    -### Consensus Seeking Process
    -
    -The WG follows a
    -[Consensus
    -Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making)
    -decision-making model.
    -
    -When an agenda item has appeared to reach a consensus the moderator
    -will ask "Does anyone object?" as a final call for dissent from the
    -consensus.
    -
    -If an agenda item cannot reach a consensus a WG member can call for
    -either a closing vote or a vote to table the issue to the next
    -meeting. The call for a vote must be seconded by a majority of the WG
    -or else the discussion will continue. Simple majority wins.
    -
    -Note that changes to WG membership require a majority consensus.  See
    -"WG Membership" above.
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/LICENSE
    deleted file mode 100644
    index 2873b3b2e59507..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/LICENSE
    +++ /dev/null
    @@ -1,47 +0,0 @@
    -Node.js is licensed for use as follows:
    -
    -"""
    -Copyright Node.js contributors. All rights reserved.
    -
    -Permission is hereby granted, free of charge, to any person obtaining a copy
    -of this software and associated documentation files (the "Software"), to
    -deal in the Software without restriction, including without limitation the
    -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
    -sell copies of the Software, and to permit persons to whom the Software is
    -furnished to do so, subject to the following conditions:
    -
    -The above copyright notice and this permission notice shall be included in
    -all copies or substantial portions of the Software.
    -
    -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
    -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
    -IN THE SOFTWARE.
    -"""
    -
    -This license applies to parts of Node.js originating from the
    -https://github.com/joyent/node repository:
    -
    -"""
    -Copyright Joyent, Inc. and other Node contributors. All rights reserved.
    -Permission is hereby granted, free of charge, to any person obtaining a copy
    -of this software and associated documentation files (the "Software"), to
    -deal in the Software without restriction, including without limitation the
    -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
    -sell copies of the Software, and to permit persons to whom the Software is
    -furnished to do so, subject to the following conditions:
    -
    -The above copyright notice and this permission notice shall be included in
    -all copies or substantial portions of the Software.
    -
    -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
    -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
    -IN THE SOFTWARE.
    -"""
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/errors-browser.js b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/errors-browser.js
    deleted file mode 100644
    index fb8e73e1893b10..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/errors-browser.js
    +++ /dev/null
    @@ -1,127 +0,0 @@
    -'use strict';
    -
    -function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
    -
    -var codes = {};
    -
    -function createErrorType(code, message, Base) {
    -  if (!Base) {
    -    Base = Error;
    -  }
    -
    -  function getMessage(arg1, arg2, arg3) {
    -    if (typeof message === 'string') {
    -      return message;
    -    } else {
    -      return message(arg1, arg2, arg3);
    -    }
    -  }
    -
    -  var NodeError =
    -  /*#__PURE__*/
    -  function (_Base) {
    -    _inheritsLoose(NodeError, _Base);
    -
    -    function NodeError(arg1, arg2, arg3) {
    -      return _Base.call(this, getMessage(arg1, arg2, arg3)) || this;
    -    }
    -
    -    return NodeError;
    -  }(Base);
    -
    -  NodeError.prototype.name = Base.name;
    -  NodeError.prototype.code = code;
    -  codes[code] = NodeError;
    -} // https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js
    -
    -
    -function oneOf(expected, thing) {
    -  if (Array.isArray(expected)) {
    -    var len = expected.length;
    -    expected = expected.map(function (i) {
    -      return String(i);
    -    });
    -
    -    if (len > 2) {
    -      return "one of ".concat(thing, " ").concat(expected.slice(0, len - 1).join(', '), ", or ") + expected[len - 1];
    -    } else if (len === 2) {
    -      return "one of ".concat(thing, " ").concat(expected[0], " or ").concat(expected[1]);
    -    } else {
    -      return "of ".concat(thing, " ").concat(expected[0]);
    -    }
    -  } else {
    -    return "of ".concat(thing, " ").concat(String(expected));
    -  }
    -} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
    -
    -
    -function startsWith(str, search, pos) {
    -  return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;
    -} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
    -
    -
    -function endsWith(str, search, this_len) {
    -  if (this_len === undefined || this_len > str.length) {
    -    this_len = str.length;
    -  }
    -
    -  return str.substring(this_len - search.length, this_len) === search;
    -} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes
    -
    -
    -function includes(str, search, start) {
    -  if (typeof start !== 'number') {
    -    start = 0;
    -  }
    -
    -  if (start + search.length > str.length) {
    -    return false;
    -  } else {
    -    return str.indexOf(search, start) !== -1;
    -  }
    -}
    -
    -createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) {
    -  return 'The value "' + value + '" is invalid for option "' + name + '"';
    -}, TypeError);
    -createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) {
    -  // determiner: 'must be' or 'must not be'
    -  var determiner;
    -
    -  if (typeof expected === 'string' && startsWith(expected, 'not ')) {
    -    determiner = 'must not be';
    -    expected = expected.replace(/^not /, '');
    -  } else {
    -    determiner = 'must be';
    -  }
    -
    -  var msg;
    -
    -  if (endsWith(name, ' argument')) {
    -    // For cases like 'first argument'
    -    msg = "The ".concat(name, " ").concat(determiner, " ").concat(oneOf(expected, 'type'));
    -  } else {
    -    var type = includes(name, '.') ? 'property' : 'argument';
    -    msg = "The \"".concat(name, "\" ").concat(type, " ").concat(determiner, " ").concat(oneOf(expected, 'type'));
    -  }
    -
    -  msg += ". Received type ".concat(typeof actual);
    -  return msg;
    -}, TypeError);
    -createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF');
    -createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) {
    -  return 'The ' + name + ' method is not implemented';
    -});
    -createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close');
    -createErrorType('ERR_STREAM_DESTROYED', function (name) {
    -  return 'Cannot call ' + name + ' after a stream was destroyed';
    -});
    -createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times');
    -createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable');
    -createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end');
    -createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError);
    -createErrorType('ERR_UNKNOWN_ENCODING', function (arg) {
    -  return 'Unknown encoding: ' + arg;
    -}, TypeError);
    -createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event');
    -module.exports.codes = codes;
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/errors.js b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/errors.js
    deleted file mode 100644
    index 8471526d6e7f75..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/errors.js
    +++ /dev/null
    @@ -1,116 +0,0 @@
    -'use strict';
    -
    -const codes = {};
    -
    -function createErrorType(code, message, Base) {
    -  if (!Base) {
    -    Base = Error
    -  }
    -
    -  function getMessage (arg1, arg2, arg3) {
    -    if (typeof message === 'string') {
    -      return message
    -    } else {
    -      return message(arg1, arg2, arg3)
    -    }
    -  }
    -
    -  class NodeError extends Base {
    -    constructor (arg1, arg2, arg3) {
    -      super(getMessage(arg1, arg2, arg3));
    -    }
    -  }
    -
    -  NodeError.prototype.name = Base.name;
    -  NodeError.prototype.code = code;
    -
    -  codes[code] = NodeError;
    -}
    -
    -// https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js
    -function oneOf(expected, thing) {
    -  if (Array.isArray(expected)) {
    -    const len = expected.length;
    -    expected = expected.map((i) => String(i));
    -    if (len > 2) {
    -      return `one of ${thing} ${expected.slice(0, len - 1).join(', ')}, or ` +
    -             expected[len - 1];
    -    } else if (len === 2) {
    -      return `one of ${thing} ${expected[0]} or ${expected[1]}`;
    -    } else {
    -      return `of ${thing} ${expected[0]}`;
    -    }
    -  } else {
    -    return `of ${thing} ${String(expected)}`;
    -  }
    -}
    -
    -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
    -function startsWith(str, search, pos) {
    -	return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;
    -}
    -
    -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
    -function endsWith(str, search, this_len) {
    -	if (this_len === undefined || this_len > str.length) {
    -		this_len = str.length;
    -	}
    -	return str.substring(this_len - search.length, this_len) === search;
    -}
    -
    -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes
    -function includes(str, search, start) {
    -  if (typeof start !== 'number') {
    -    start = 0;
    -  }
    -
    -  if (start + search.length > str.length) {
    -    return false;
    -  } else {
    -    return str.indexOf(search, start) !== -1;
    -  }
    -}
    -
    -createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) {
    -  return 'The value "' + value + '" is invalid for option "' + name + '"'
    -}, TypeError);
    -createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) {
    -  // determiner: 'must be' or 'must not be'
    -  let determiner;
    -  if (typeof expected === 'string' && startsWith(expected, 'not ')) {
    -    determiner = 'must not be';
    -    expected = expected.replace(/^not /, '');
    -  } else {
    -    determiner = 'must be';
    -  }
    -
    -  let msg;
    -  if (endsWith(name, ' argument')) {
    -    // For cases like 'first argument'
    -    msg = `The ${name} ${determiner} ${oneOf(expected, 'type')}`;
    -  } else {
    -    const type = includes(name, '.') ? 'property' : 'argument';
    -    msg = `The "${name}" ${type} ${determiner} ${oneOf(expected, 'type')}`;
    -  }
    -
    -  msg += `. Received type ${typeof actual}`;
    -  return msg;
    -}, TypeError);
    -createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF');
    -createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) {
    -  return 'The ' + name + ' method is not implemented'
    -});
    -createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close');
    -createErrorType('ERR_STREAM_DESTROYED', function (name) {
    -  return 'Cannot call ' + name + ' after a stream was destroyed';
    -});
    -createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times');
    -createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable');
    -createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end');
    -createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError);
    -createErrorType('ERR_UNKNOWN_ENCODING', function (arg) {
    -  return 'Unknown encoding: ' + arg
    -}, TypeError);
    -createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event');
    -
    -module.exports.codes = codes;
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/experimentalWarning.js b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/experimentalWarning.js
    deleted file mode 100644
    index 78e841495bf24d..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/experimentalWarning.js
    +++ /dev/null
    @@ -1,17 +0,0 @@
    -'use strict'
    -
    -var experimentalWarnings = new Set();
    -
    -function emitExperimentalWarning(feature) {
    -  if (experimentalWarnings.has(feature)) return;
    -  var msg = feature + ' is an experimental feature. This feature could ' +
    -       'change at any time';
    -  experimentalWarnings.add(feature);
    -  process.emitWarning(msg, 'ExperimentalWarning');
    -}
    -
    -function noop() {}
    -
    -module.exports.emitExperimentalWarning = process.emitWarning
    -  ? emitExperimentalWarning
    -  : noop;
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/_stream_duplex.js b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/_stream_duplex.js
    deleted file mode 100644
    index 19abfa604d5ef7..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/_stream_duplex.js
    +++ /dev/null
    @@ -1,126 +0,0 @@
    -// Copyright Joyent, Inc. and other Node contributors.
    -//
    -// Permission is hereby granted, free of charge, to any person obtaining a
    -// copy of this software and associated documentation files (the
    -// "Software"), to deal in the Software without restriction, including
    -// without limitation the rights to use, copy, modify, merge, publish,
    -// distribute, sublicense, and/or sell copies of the Software, and to permit
    -// persons to whom the Software is furnished to do so, subject to the
    -// following conditions:
    -//
    -// The above copyright notice and this permission notice shall be included
    -// in all copies or substantial portions of the Software.
    -//
    -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
    -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
    -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
    -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
    -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
    -// USE OR OTHER DEALINGS IN THE SOFTWARE.
    -
    -// a duplex stream is just a stream that is both readable and writable.
    -// Since JS doesn't have multiple prototypal inheritance, this class
    -// prototypally inherits from Readable, and then parasitically from
    -// Writable.
    -
    -'use strict';
    -
    -/**/
    -var objectKeys = Object.keys || function (obj) {
    -  var keys = [];
    -  for (var key in obj) keys.push(key);
    -  return keys;
    -};
    -/**/
    -
    -module.exports = Duplex;
    -var Readable = require('./_stream_readable');
    -var Writable = require('./_stream_writable');
    -require('inherits')(Duplex, Readable);
    -{
    -  // Allow the keys array to be GC'ed.
    -  var keys = objectKeys(Writable.prototype);
    -  for (var v = 0; v < keys.length; v++) {
    -    var method = keys[v];
    -    if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
    -  }
    -}
    -function Duplex(options) {
    -  if (!(this instanceof Duplex)) return new Duplex(options);
    -  Readable.call(this, options);
    -  Writable.call(this, options);
    -  this.allowHalfOpen = true;
    -  if (options) {
    -    if (options.readable === false) this.readable = false;
    -    if (options.writable === false) this.writable = false;
    -    if (options.allowHalfOpen === false) {
    -      this.allowHalfOpen = false;
    -      this.once('end', onend);
    -    }
    -  }
    -}
    -Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', {
    -  // making it explicit this property is not enumerable
    -  // because otherwise some prototype manipulation in
    -  // userland will fail
    -  enumerable: false,
    -  get: function get() {
    -    return this._writableState.highWaterMark;
    -  }
    -});
    -Object.defineProperty(Duplex.prototype, 'writableBuffer', {
    -  // making it explicit this property is not enumerable
    -  // because otherwise some prototype manipulation in
    -  // userland will fail
    -  enumerable: false,
    -  get: function get() {
    -    return this._writableState && this._writableState.getBuffer();
    -  }
    -});
    -Object.defineProperty(Duplex.prototype, 'writableLength', {
    -  // making it explicit this property is not enumerable
    -  // because otherwise some prototype manipulation in
    -  // userland will fail
    -  enumerable: false,
    -  get: function get() {
    -    return this._writableState.length;
    -  }
    -});
    -
    -// the no-half-open enforcer
    -function onend() {
    -  // If the writable side ended, then we're ok.
    -  if (this._writableState.ended) return;
    -
    -  // no more data can be written.
    -  // But allow more writes to happen in this tick.
    -  process.nextTick(onEndNT, this);
    -}
    -function onEndNT(self) {
    -  self.end();
    -}
    -Object.defineProperty(Duplex.prototype, 'destroyed', {
    -  // making it explicit this property is not enumerable
    -  // because otherwise some prototype manipulation in
    -  // userland will fail
    -  enumerable: false,
    -  get: function get() {
    -    if (this._readableState === undefined || this._writableState === undefined) {
    -      return false;
    -    }
    -    return this._readableState.destroyed && this._writableState.destroyed;
    -  },
    -  set: function set(value) {
    -    // we ignore the value if the stream
    -    // has not been initialized yet
    -    if (this._readableState === undefined || this._writableState === undefined) {
    -      return;
    -    }
    -
    -    // backward compatibility, the user is explicitly
    -    // managing destroyed
    -    this._readableState.destroyed = value;
    -    this._writableState.destroyed = value;
    -  }
    -});
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/_stream_passthrough.js b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/_stream_passthrough.js
    deleted file mode 100644
    index 24a6bdde2903fa..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/_stream_passthrough.js
    +++ /dev/null
    @@ -1,37 +0,0 @@
    -// Copyright Joyent, Inc. and other Node contributors.
    -//
    -// Permission is hereby granted, free of charge, to any person obtaining a
    -// copy of this software and associated documentation files (the
    -// "Software"), to deal in the Software without restriction, including
    -// without limitation the rights to use, copy, modify, merge, publish,
    -// distribute, sublicense, and/or sell copies of the Software, and to permit
    -// persons to whom the Software is furnished to do so, subject to the
    -// following conditions:
    -//
    -// The above copyright notice and this permission notice shall be included
    -// in all copies or substantial portions of the Software.
    -//
    -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
    -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
    -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
    -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
    -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
    -// USE OR OTHER DEALINGS IN THE SOFTWARE.
    -
    -// a passthrough stream.
    -// basically just the most minimal sort of Transform stream.
    -// Every written chunk gets output as-is.
    -
    -'use strict';
    -
    -module.exports = PassThrough;
    -var Transform = require('./_stream_transform');
    -require('inherits')(PassThrough, Transform);
    -function PassThrough(options) {
    -  if (!(this instanceof PassThrough)) return new PassThrough(options);
    -  Transform.call(this, options);
    -}
    -PassThrough.prototype._transform = function (chunk, encoding, cb) {
    -  cb(null, chunk);
    -};
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/_stream_readable.js b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/_stream_readable.js
    deleted file mode 100644
    index df1f608d532606..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/_stream_readable.js
    +++ /dev/null
    @@ -1,1027 +0,0 @@
    -// Copyright Joyent, Inc. and other Node contributors.
    -//
    -// Permission is hereby granted, free of charge, to any person obtaining a
    -// copy of this software and associated documentation files (the
    -// "Software"), to deal in the Software without restriction, including
    -// without limitation the rights to use, copy, modify, merge, publish,
    -// distribute, sublicense, and/or sell copies of the Software, and to permit
    -// persons to whom the Software is furnished to do so, subject to the
    -// following conditions:
    -//
    -// The above copyright notice and this permission notice shall be included
    -// in all copies or substantial portions of the Software.
    -//
    -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
    -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
    -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
    -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
    -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
    -// USE OR OTHER DEALINGS IN THE SOFTWARE.
    -
    -'use strict';
    -
    -module.exports = Readable;
    -
    -/**/
    -var Duplex;
    -/**/
    -
    -Readable.ReadableState = ReadableState;
    -
    -/**/
    -var EE = require('events').EventEmitter;
    -var EElistenerCount = function EElistenerCount(emitter, type) {
    -  return emitter.listeners(type).length;
    -};
    -/**/
    -
    -/**/
    -var Stream = require('./internal/streams/stream');
    -/**/
    -
    -var Buffer = require('buffer').Buffer;
    -var OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};
    -function _uint8ArrayToBuffer(chunk) {
    -  return Buffer.from(chunk);
    -}
    -function _isUint8Array(obj) {
    -  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
    -}
    -
    -/**/
    -var debugUtil = require('util');
    -var debug;
    -if (debugUtil && debugUtil.debuglog) {
    -  debug = debugUtil.debuglog('stream');
    -} else {
    -  debug = function debug() {};
    -}
    -/**/
    -
    -var BufferList = require('./internal/streams/buffer_list');
    -var destroyImpl = require('./internal/streams/destroy');
    -var _require = require('./internal/streams/state'),
    -  getHighWaterMark = _require.getHighWaterMark;
    -var _require$codes = require('../errors').codes,
    -  ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,
    -  ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF,
    -  ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
    -  ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT;
    -
    -// Lazy loaded to improve the startup performance.
    -var StringDecoder;
    -var createReadableStreamAsyncIterator;
    -var from;
    -require('inherits')(Readable, Stream);
    -var errorOrDestroy = destroyImpl.errorOrDestroy;
    -var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
    -function prependListener(emitter, event, fn) {
    -  // Sadly this is not cacheable as some libraries bundle their own
    -  // event emitter implementation with them.
    -  if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);
    -
    -  // This is a hack to make sure that our error handler is attached before any
    -  // userland ones.  NEVER DO THIS. This is here only because this code needs
    -  // to continue to work with older versions of Node.js that do not include
    -  // the prependListener() method. The goal is to eventually remove this hack.
    -  if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
    -}
    -function ReadableState(options, stream, isDuplex) {
    -  Duplex = Duplex || require('./_stream_duplex');
    -  options = options || {};
    -
    -  // Duplex streams are both readable and writable, but share
    -  // the same options object.
    -  // However, some cases require setting options to different
    -  // values for the readable and the writable sides of the duplex stream.
    -  // These options can be provided separately as readableXXX and writableXXX.
    -  if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex;
    -
    -  // object stream flag. Used to make read(n) ignore n and to
    -  // make all the buffer merging and length checks go away
    -  this.objectMode = !!options.objectMode;
    -  if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;
    -
    -  // the point at which it stops calling _read() to fill the buffer
    -  // Note: 0 is a valid value, means "don't call _read preemptively ever"
    -  this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex);
    -
    -  // A linked list is used to store data chunks instead of an array because the
    -  // linked list can remove elements from the beginning faster than
    -  // array.shift()
    -  this.buffer = new BufferList();
    -  this.length = 0;
    -  this.pipes = null;
    -  this.pipesCount = 0;
    -  this.flowing = null;
    -  this.ended = false;
    -  this.endEmitted = false;
    -  this.reading = false;
    -
    -  // a flag to be able to tell if the event 'readable'/'data' is emitted
    -  // immediately, or on a later tick.  We set this to true at first, because
    -  // any actions that shouldn't happen until "later" should generally also
    -  // not happen before the first read call.
    -  this.sync = true;
    -
    -  // whenever we return null, then we set a flag to say
    -  // that we're awaiting a 'readable' event emission.
    -  this.needReadable = false;
    -  this.emittedReadable = false;
    -  this.readableListening = false;
    -  this.resumeScheduled = false;
    -  this.paused = true;
    -
    -  // Should close be emitted on destroy. Defaults to true.
    -  this.emitClose = options.emitClose !== false;
    -
    -  // Should .destroy() be called after 'end' (and potentially 'finish')
    -  this.autoDestroy = !!options.autoDestroy;
    -
    -  // has it been destroyed
    -  this.destroyed = false;
    -
    -  // Crypto is kind of old and crusty.  Historically, its default string
    -  // encoding is 'binary' so we have to make this configurable.
    -  // Everything else in the universe uses 'utf8', though.
    -  this.defaultEncoding = options.defaultEncoding || 'utf8';
    -
    -  // the number of writers that are awaiting a drain event in .pipe()s
    -  this.awaitDrain = 0;
    -
    -  // if true, a maybeReadMore has been scheduled
    -  this.readingMore = false;
    -  this.decoder = null;
    -  this.encoding = null;
    -  if (options.encoding) {
    -    if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
    -    this.decoder = new StringDecoder(options.encoding);
    -    this.encoding = options.encoding;
    -  }
    -}
    -function Readable(options) {
    -  Duplex = Duplex || require('./_stream_duplex');
    -  if (!(this instanceof Readable)) return new Readable(options);
    -
    -  // Checking for a Stream.Duplex instance is faster here instead of inside
    -  // the ReadableState constructor, at least with V8 6.5
    -  var isDuplex = this instanceof Duplex;
    -  this._readableState = new ReadableState(options, this, isDuplex);
    -
    -  // legacy
    -  this.readable = true;
    -  if (options) {
    -    if (typeof options.read === 'function') this._read = options.read;
    -    if (typeof options.destroy === 'function') this._destroy = options.destroy;
    -  }
    -  Stream.call(this);
    -}
    -Object.defineProperty(Readable.prototype, 'destroyed', {
    -  // making it explicit this property is not enumerable
    -  // because otherwise some prototype manipulation in
    -  // userland will fail
    -  enumerable: false,
    -  get: function get() {
    -    if (this._readableState === undefined) {
    -      return false;
    -    }
    -    return this._readableState.destroyed;
    -  },
    -  set: function set(value) {
    -    // we ignore the value if the stream
    -    // has not been initialized yet
    -    if (!this._readableState) {
    -      return;
    -    }
    -
    -    // backward compatibility, the user is explicitly
    -    // managing destroyed
    -    this._readableState.destroyed = value;
    -  }
    -});
    -Readable.prototype.destroy = destroyImpl.destroy;
    -Readable.prototype._undestroy = destroyImpl.undestroy;
    -Readable.prototype._destroy = function (err, cb) {
    -  cb(err);
    -};
    -
    -// Manually shove something into the read() buffer.
    -// This returns true if the highWaterMark has not been hit yet,
    -// similar to how Writable.write() returns true if you should
    -// write() some more.
    -Readable.prototype.push = function (chunk, encoding) {
    -  var state = this._readableState;
    -  var skipChunkCheck;
    -  if (!state.objectMode) {
    -    if (typeof chunk === 'string') {
    -      encoding = encoding || state.defaultEncoding;
    -      if (encoding !== state.encoding) {
    -        chunk = Buffer.from(chunk, encoding);
    -        encoding = '';
    -      }
    -      skipChunkCheck = true;
    -    }
    -  } else {
    -    skipChunkCheck = true;
    -  }
    -  return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
    -};
    -
    -// Unshift should *always* be something directly out of read()
    -Readable.prototype.unshift = function (chunk) {
    -  return readableAddChunk(this, chunk, null, true, false);
    -};
    -function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
    -  debug('readableAddChunk', chunk);
    -  var state = stream._readableState;
    -  if (chunk === null) {
    -    state.reading = false;
    -    onEofChunk(stream, state);
    -  } else {
    -    var er;
    -    if (!skipChunkCheck) er = chunkInvalid(state, chunk);
    -    if (er) {
    -      errorOrDestroy(stream, er);
    -    } else if (state.objectMode || chunk && chunk.length > 0) {
    -      if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
    -        chunk = _uint8ArrayToBuffer(chunk);
    -      }
    -      if (addToFront) {
    -        if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true);
    -      } else if (state.ended) {
    -        errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF());
    -      } else if (state.destroyed) {
    -        return false;
    -      } else {
    -        state.reading = false;
    -        if (state.decoder && !encoding) {
    -          chunk = state.decoder.write(chunk);
    -          if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
    -        } else {
    -          addChunk(stream, state, chunk, false);
    -        }
    -      }
    -    } else if (!addToFront) {
    -      state.reading = false;
    -      maybeReadMore(stream, state);
    -    }
    -  }
    -
    -  // We can push more data if we are below the highWaterMark.
    -  // Also, if we have no data yet, we can stand some more bytes.
    -  // This is to work around cases where hwm=0, such as the repl.
    -  return !state.ended && (state.length < state.highWaterMark || state.length === 0);
    -}
    -function addChunk(stream, state, chunk, addToFront) {
    -  if (state.flowing && state.length === 0 && !state.sync) {
    -    state.awaitDrain = 0;
    -    stream.emit('data', chunk);
    -  } else {
    -    // update the buffer info.
    -    state.length += state.objectMode ? 1 : chunk.length;
    -    if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
    -    if (state.needReadable) emitReadable(stream);
    -  }
    -  maybeReadMore(stream, state);
    -}
    -function chunkInvalid(state, chunk) {
    -  var er;
    -  if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
    -    er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk);
    -  }
    -  return er;
    -}
    -Readable.prototype.isPaused = function () {
    -  return this._readableState.flowing === false;
    -};
    -
    -// backwards compatibility.
    -Readable.prototype.setEncoding = function (enc) {
    -  if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
    -  var decoder = new StringDecoder(enc);
    -  this._readableState.decoder = decoder;
    -  // If setEncoding(null), decoder.encoding equals utf8
    -  this._readableState.encoding = this._readableState.decoder.encoding;
    -
    -  // Iterate over current buffer to convert already stored Buffers:
    -  var p = this._readableState.buffer.head;
    -  var content = '';
    -  while (p !== null) {
    -    content += decoder.write(p.data);
    -    p = p.next;
    -  }
    -  this._readableState.buffer.clear();
    -  if (content !== '') this._readableState.buffer.push(content);
    -  this._readableState.length = content.length;
    -  return this;
    -};
    -
    -// Don't raise the hwm > 1GB
    -var MAX_HWM = 0x40000000;
    -function computeNewHighWaterMark(n) {
    -  if (n >= MAX_HWM) {
    -    // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE.
    -    n = MAX_HWM;
    -  } else {
    -    // Get the next highest power of 2 to prevent increasing hwm excessively in
    -    // tiny amounts
    -    n--;
    -    n |= n >>> 1;
    -    n |= n >>> 2;
    -    n |= n >>> 4;
    -    n |= n >>> 8;
    -    n |= n >>> 16;
    -    n++;
    -  }
    -  return n;
    -}
    -
    -// This function is designed to be inlinable, so please take care when making
    -// changes to the function body.
    -function howMuchToRead(n, state) {
    -  if (n <= 0 || state.length === 0 && state.ended) return 0;
    -  if (state.objectMode) return 1;
    -  if (n !== n) {
    -    // Only flow one buffer at a time
    -    if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
    -  }
    -  // If we're asking for more than the current hwm, then raise the hwm.
    -  if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
    -  if (n <= state.length) return n;
    -  // Don't have enough
    -  if (!state.ended) {
    -    state.needReadable = true;
    -    return 0;
    -  }
    -  return state.length;
    -}
    -
    -// you can override either this method, or the async _read(n) below.
    -Readable.prototype.read = function (n) {
    -  debug('read', n);
    -  n = parseInt(n, 10);
    -  var state = this._readableState;
    -  var nOrig = n;
    -  if (n !== 0) state.emittedReadable = false;
    -
    -  // if we're doing read(0) to trigger a readable event, but we
    -  // already have a bunch of data in the buffer, then just trigger
    -  // the 'readable' event and move on.
    -  if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) {
    -    debug('read: emitReadable', state.length, state.ended);
    -    if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
    -    return null;
    -  }
    -  n = howMuchToRead(n, state);
    -
    -  // if we've ended, and we're now clear, then finish it up.
    -  if (n === 0 && state.ended) {
    -    if (state.length === 0) endReadable(this);
    -    return null;
    -  }
    -
    -  // All the actual chunk generation logic needs to be
    -  // *below* the call to _read.  The reason is that in certain
    -  // synthetic stream cases, such as passthrough streams, _read
    -  // may be a completely synchronous operation which may change
    -  // the state of the read buffer, providing enough data when
    -  // before there was *not* enough.
    -  //
    -  // So, the steps are:
    -  // 1. Figure out what the state of things will be after we do
    -  // a read from the buffer.
    -  //
    -  // 2. If that resulting state will trigger a _read, then call _read.
    -  // Note that this may be asynchronous, or synchronous.  Yes, it is
    -  // deeply ugly to write APIs this way, but that still doesn't mean
    -  // that the Readable class should behave improperly, as streams are
    -  // designed to be sync/async agnostic.
    -  // Take note if the _read call is sync or async (ie, if the read call
    -  // has returned yet), so that we know whether or not it's safe to emit
    -  // 'readable' etc.
    -  //
    -  // 3. Actually pull the requested chunks out of the buffer and return.
    -
    -  // if we need a readable event, then we need to do some reading.
    -  var doRead = state.needReadable;
    -  debug('need readable', doRead);
    -
    -  // if we currently have less than the highWaterMark, then also read some
    -  if (state.length === 0 || state.length - n < state.highWaterMark) {
    -    doRead = true;
    -    debug('length less than watermark', doRead);
    -  }
    -
    -  // however, if we've ended, then there's no point, and if we're already
    -  // reading, then it's unnecessary.
    -  if (state.ended || state.reading) {
    -    doRead = false;
    -    debug('reading or ended', doRead);
    -  } else if (doRead) {
    -    debug('do read');
    -    state.reading = true;
    -    state.sync = true;
    -    // if the length is currently zero, then we *need* a readable event.
    -    if (state.length === 0) state.needReadable = true;
    -    // call internal read method
    -    this._read(state.highWaterMark);
    -    state.sync = false;
    -    // If _read pushed data synchronously, then `reading` will be false,
    -    // and we need to re-evaluate how much data we can return to the user.
    -    if (!state.reading) n = howMuchToRead(nOrig, state);
    -  }
    -  var ret;
    -  if (n > 0) ret = fromList(n, state);else ret = null;
    -  if (ret === null) {
    -    state.needReadable = state.length <= state.highWaterMark;
    -    n = 0;
    -  } else {
    -    state.length -= n;
    -    state.awaitDrain = 0;
    -  }
    -  if (state.length === 0) {
    -    // If we have nothing in the buffer, then we want to know
    -    // as soon as we *do* get something into the buffer.
    -    if (!state.ended) state.needReadable = true;
    -
    -    // If we tried to read() past the EOF, then emit end on the next tick.
    -    if (nOrig !== n && state.ended) endReadable(this);
    -  }
    -  if (ret !== null) this.emit('data', ret);
    -  return ret;
    -};
    -function onEofChunk(stream, state) {
    -  debug('onEofChunk');
    -  if (state.ended) return;
    -  if (state.decoder) {
    -    var chunk = state.decoder.end();
    -    if (chunk && chunk.length) {
    -      state.buffer.push(chunk);
    -      state.length += state.objectMode ? 1 : chunk.length;
    -    }
    -  }
    -  state.ended = true;
    -  if (state.sync) {
    -    // if we are sync, wait until next tick to emit the data.
    -    // Otherwise we risk emitting data in the flow()
    -    // the readable code triggers during a read() call
    -    emitReadable(stream);
    -  } else {
    -    // emit 'readable' now to make sure it gets picked up.
    -    state.needReadable = false;
    -    if (!state.emittedReadable) {
    -      state.emittedReadable = true;
    -      emitReadable_(stream);
    -    }
    -  }
    -}
    -
    -// Don't emit readable right away in sync mode, because this can trigger
    -// another read() call => stack overflow.  This way, it might trigger
    -// a nextTick recursion warning, but that's not so bad.
    -function emitReadable(stream) {
    -  var state = stream._readableState;
    -  debug('emitReadable', state.needReadable, state.emittedReadable);
    -  state.needReadable = false;
    -  if (!state.emittedReadable) {
    -    debug('emitReadable', state.flowing);
    -    state.emittedReadable = true;
    -    process.nextTick(emitReadable_, stream);
    -  }
    -}
    -function emitReadable_(stream) {
    -  var state = stream._readableState;
    -  debug('emitReadable_', state.destroyed, state.length, state.ended);
    -  if (!state.destroyed && (state.length || state.ended)) {
    -    stream.emit('readable');
    -    state.emittedReadable = false;
    -  }
    -
    -  // The stream needs another readable event if
    -  // 1. It is not flowing, as the flow mechanism will take
    -  //    care of it.
    -  // 2. It is not ended.
    -  // 3. It is below the highWaterMark, so we can schedule
    -  //    another readable later.
    -  state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark;
    -  flow(stream);
    -}
    -
    -// at this point, the user has presumably seen the 'readable' event,
    -// and called read() to consume some data.  that may have triggered
    -// in turn another _read(n) call, in which case reading = true if
    -// it's in progress.
    -// However, if we're not ended, or reading, and the length < hwm,
    -// then go ahead and try to read some more preemptively.
    -function maybeReadMore(stream, state) {
    -  if (!state.readingMore) {
    -    state.readingMore = true;
    -    process.nextTick(maybeReadMore_, stream, state);
    -  }
    -}
    -function maybeReadMore_(stream, state) {
    -  // Attempt to read more data if we should.
    -  //
    -  // The conditions for reading more data are (one of):
    -  // - Not enough data buffered (state.length < state.highWaterMark). The loop
    -  //   is responsible for filling the buffer with enough data if such data
    -  //   is available. If highWaterMark is 0 and we are not in the flowing mode
    -  //   we should _not_ attempt to buffer any extra data. We'll get more data
    -  //   when the stream consumer calls read() instead.
    -  // - No data in the buffer, and the stream is in flowing mode. In this mode
    -  //   the loop below is responsible for ensuring read() is called. Failing to
    -  //   call read here would abort the flow and there's no other mechanism for
    -  //   continuing the flow if the stream consumer has just subscribed to the
    -  //   'data' event.
    -  //
    -  // In addition to the above conditions to keep reading data, the following
    -  // conditions prevent the data from being read:
    -  // - The stream has ended (state.ended).
    -  // - There is already a pending 'read' operation (state.reading). This is a
    -  //   case where the the stream has called the implementation defined _read()
    -  //   method, but they are processing the call asynchronously and have _not_
    -  //   called push() with new data. In this case we skip performing more
    -  //   read()s. The execution ends in this method again after the _read() ends
    -  //   up calling push() with more data.
    -  while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) {
    -    var len = state.length;
    -    debug('maybeReadMore read 0');
    -    stream.read(0);
    -    if (len === state.length)
    -      // didn't get any data, stop spinning.
    -      break;
    -  }
    -  state.readingMore = false;
    -}
    -
    -// abstract method.  to be overridden in specific implementation classes.
    -// call cb(er, data) where data is <= n in length.
    -// for virtual (non-string, non-buffer) streams, "length" is somewhat
    -// arbitrary, and perhaps not very meaningful.
    -Readable.prototype._read = function (n) {
    -  errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()'));
    -};
    -Readable.prototype.pipe = function (dest, pipeOpts) {
    -  var src = this;
    -  var state = this._readableState;
    -  switch (state.pipesCount) {
    -    case 0:
    -      state.pipes = dest;
    -      break;
    -    case 1:
    -      state.pipes = [state.pipes, dest];
    -      break;
    -    default:
    -      state.pipes.push(dest);
    -      break;
    -  }
    -  state.pipesCount += 1;
    -  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
    -  var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
    -  var endFn = doEnd ? onend : unpipe;
    -  if (state.endEmitted) process.nextTick(endFn);else src.once('end', endFn);
    -  dest.on('unpipe', onunpipe);
    -  function onunpipe(readable, unpipeInfo) {
    -    debug('onunpipe');
    -    if (readable === src) {
    -      if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
    -        unpipeInfo.hasUnpiped = true;
    -        cleanup();
    -      }
    -    }
    -  }
    -  function onend() {
    -    debug('onend');
    -    dest.end();
    -  }
    -
    -  // when the dest drains, it reduces the awaitDrain counter
    -  // on the source.  This would be more elegant with a .once()
    -  // handler in flow(), but adding and removing repeatedly is
    -  // too slow.
    -  var ondrain = pipeOnDrain(src);
    -  dest.on('drain', ondrain);
    -  var cleanedUp = false;
    -  function cleanup() {
    -    debug('cleanup');
    -    // cleanup event handlers once the pipe is broken
    -    dest.removeListener('close', onclose);
    -    dest.removeListener('finish', onfinish);
    -    dest.removeListener('drain', ondrain);
    -    dest.removeListener('error', onerror);
    -    dest.removeListener('unpipe', onunpipe);
    -    src.removeListener('end', onend);
    -    src.removeListener('end', unpipe);
    -    src.removeListener('data', ondata);
    -    cleanedUp = true;
    -
    -    // if the reader is waiting for a drain event from this
    -    // specific writer, then it would cause it to never start
    -    // flowing again.
    -    // So, if this is awaiting a drain, then we just call it now.
    -    // If we don't know, then assume that we are waiting for one.
    -    if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
    -  }
    -  src.on('data', ondata);
    -  function ondata(chunk) {
    -    debug('ondata');
    -    var ret = dest.write(chunk);
    -    debug('dest.write', ret);
    -    if (ret === false) {
    -      // If the user unpiped during `dest.write()`, it is possible
    -      // to get stuck in a permanently paused state if that write
    -      // also returned false.
    -      // => Check whether `dest` is still a piping destination.
    -      if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
    -        debug('false write response, pause', state.awaitDrain);
    -        state.awaitDrain++;
    -      }
    -      src.pause();
    -    }
    -  }
    -
    -  // if the dest has an error, then stop piping into it.
    -  // however, don't suppress the throwing behavior for this.
    -  function onerror(er) {
    -    debug('onerror', er);
    -    unpipe();
    -    dest.removeListener('error', onerror);
    -    if (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, er);
    -  }
    -
    -  // Make sure our error handler is attached before userland ones.
    -  prependListener(dest, 'error', onerror);
    -
    -  // Both close and finish should trigger unpipe, but only once.
    -  function onclose() {
    -    dest.removeListener('finish', onfinish);
    -    unpipe();
    -  }
    -  dest.once('close', onclose);
    -  function onfinish() {
    -    debug('onfinish');
    -    dest.removeListener('close', onclose);
    -    unpipe();
    -  }
    -  dest.once('finish', onfinish);
    -  function unpipe() {
    -    debug('unpipe');
    -    src.unpipe(dest);
    -  }
    -
    -  // tell the dest that it's being piped to
    -  dest.emit('pipe', src);
    -
    -  // start the flow if it hasn't been started already.
    -  if (!state.flowing) {
    -    debug('pipe resume');
    -    src.resume();
    -  }
    -  return dest;
    -};
    -function pipeOnDrain(src) {
    -  return function pipeOnDrainFunctionResult() {
    -    var state = src._readableState;
    -    debug('pipeOnDrain', state.awaitDrain);
    -    if (state.awaitDrain) state.awaitDrain--;
    -    if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
    -      state.flowing = true;
    -      flow(src);
    -    }
    -  };
    -}
    -Readable.prototype.unpipe = function (dest) {
    -  var state = this._readableState;
    -  var unpipeInfo = {
    -    hasUnpiped: false
    -  };
    -
    -  // if we're not piping anywhere, then do nothing.
    -  if (state.pipesCount === 0) return this;
    -
    -  // just one destination.  most common case.
    -  if (state.pipesCount === 1) {
    -    // passed in one, but it's not the right one.
    -    if (dest && dest !== state.pipes) return this;
    -    if (!dest) dest = state.pipes;
    -
    -    // got a match.
    -    state.pipes = null;
    -    state.pipesCount = 0;
    -    state.flowing = false;
    -    if (dest) dest.emit('unpipe', this, unpipeInfo);
    -    return this;
    -  }
    -
    -  // slow case. multiple pipe destinations.
    -
    -  if (!dest) {
    -    // remove all.
    -    var dests = state.pipes;
    -    var len = state.pipesCount;
    -    state.pipes = null;
    -    state.pipesCount = 0;
    -    state.flowing = false;
    -    for (var i = 0; i < len; i++) dests[i].emit('unpipe', this, {
    -      hasUnpiped: false
    -    });
    -    return this;
    -  }
    -
    -  // try to find the right one.
    -  var index = indexOf(state.pipes, dest);
    -  if (index === -1) return this;
    -  state.pipes.splice(index, 1);
    -  state.pipesCount -= 1;
    -  if (state.pipesCount === 1) state.pipes = state.pipes[0];
    -  dest.emit('unpipe', this, unpipeInfo);
    -  return this;
    -};
    -
    -// set up data events if they are asked for
    -// Ensure readable listeners eventually get something
    -Readable.prototype.on = function (ev, fn) {
    -  var res = Stream.prototype.on.call(this, ev, fn);
    -  var state = this._readableState;
    -  if (ev === 'data') {
    -    // update readableListening so that resume() may be a no-op
    -    // a few lines down. This is needed to support once('readable').
    -    state.readableListening = this.listenerCount('readable') > 0;
    -
    -    // Try start flowing on next tick if stream isn't explicitly paused
    -    if (state.flowing !== false) this.resume();
    -  } else if (ev === 'readable') {
    -    if (!state.endEmitted && !state.readableListening) {
    -      state.readableListening = state.needReadable = true;
    -      state.flowing = false;
    -      state.emittedReadable = false;
    -      debug('on readable', state.length, state.reading);
    -      if (state.length) {
    -        emitReadable(this);
    -      } else if (!state.reading) {
    -        process.nextTick(nReadingNextTick, this);
    -      }
    -    }
    -  }
    -  return res;
    -};
    -Readable.prototype.addListener = Readable.prototype.on;
    -Readable.prototype.removeListener = function (ev, fn) {
    -  var res = Stream.prototype.removeListener.call(this, ev, fn);
    -  if (ev === 'readable') {
    -    // We need to check if there is someone still listening to
    -    // readable and reset the state. However this needs to happen
    -    // after readable has been emitted but before I/O (nextTick) to
    -    // support once('readable', fn) cycles. This means that calling
    -    // resume within the same tick will have no
    -    // effect.
    -    process.nextTick(updateReadableListening, this);
    -  }
    -  return res;
    -};
    -Readable.prototype.removeAllListeners = function (ev) {
    -  var res = Stream.prototype.removeAllListeners.apply(this, arguments);
    -  if (ev === 'readable' || ev === undefined) {
    -    // We need to check if there is someone still listening to
    -    // readable and reset the state. However this needs to happen
    -    // after readable has been emitted but before I/O (nextTick) to
    -    // support once('readable', fn) cycles. This means that calling
    -    // resume within the same tick will have no
    -    // effect.
    -    process.nextTick(updateReadableListening, this);
    -  }
    -  return res;
    -};
    -function updateReadableListening(self) {
    -  var state = self._readableState;
    -  state.readableListening = self.listenerCount('readable') > 0;
    -  if (state.resumeScheduled && !state.paused) {
    -    // flowing needs to be set to true now, otherwise
    -    // the upcoming resume will not flow.
    -    state.flowing = true;
    -
    -    // crude way to check if we should resume
    -  } else if (self.listenerCount('data') > 0) {
    -    self.resume();
    -  }
    -}
    -function nReadingNextTick(self) {
    -  debug('readable nexttick read 0');
    -  self.read(0);
    -}
    -
    -// pause() and resume() are remnants of the legacy readable stream API
    -// If the user uses them, then switch into old mode.
    -Readable.prototype.resume = function () {
    -  var state = this._readableState;
    -  if (!state.flowing) {
    -    debug('resume');
    -    // we flow only if there is no one listening
    -    // for readable, but we still have to call
    -    // resume()
    -    state.flowing = !state.readableListening;
    -    resume(this, state);
    -  }
    -  state.paused = false;
    -  return this;
    -};
    -function resume(stream, state) {
    -  if (!state.resumeScheduled) {
    -    state.resumeScheduled = true;
    -    process.nextTick(resume_, stream, state);
    -  }
    -}
    -function resume_(stream, state) {
    -  debug('resume', state.reading);
    -  if (!state.reading) {
    -    stream.read(0);
    -  }
    -  state.resumeScheduled = false;
    -  stream.emit('resume');
    -  flow(stream);
    -  if (state.flowing && !state.reading) stream.read(0);
    -}
    -Readable.prototype.pause = function () {
    -  debug('call pause flowing=%j', this._readableState.flowing);
    -  if (this._readableState.flowing !== false) {
    -    debug('pause');
    -    this._readableState.flowing = false;
    -    this.emit('pause');
    -  }
    -  this._readableState.paused = true;
    -  return this;
    -};
    -function flow(stream) {
    -  var state = stream._readableState;
    -  debug('flow', state.flowing);
    -  while (state.flowing && stream.read() !== null);
    -}
    -
    -// wrap an old-style stream as the async data source.
    -// This is *not* part of the readable stream interface.
    -// It is an ugly unfortunate mess of history.
    -Readable.prototype.wrap = function (stream) {
    -  var _this = this;
    -  var state = this._readableState;
    -  var paused = false;
    -  stream.on('end', function () {
    -    debug('wrapped end');
    -    if (state.decoder && !state.ended) {
    -      var chunk = state.decoder.end();
    -      if (chunk && chunk.length) _this.push(chunk);
    -    }
    -    _this.push(null);
    -  });
    -  stream.on('data', function (chunk) {
    -    debug('wrapped data');
    -    if (state.decoder) chunk = state.decoder.write(chunk);
    -
    -    // don't skip over falsy values in objectMode
    -    if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
    -    var ret = _this.push(chunk);
    -    if (!ret) {
    -      paused = true;
    -      stream.pause();
    -    }
    -  });
    -
    -  // proxy all the other methods.
    -  // important when wrapping filters and duplexes.
    -  for (var i in stream) {
    -    if (this[i] === undefined && typeof stream[i] === 'function') {
    -      this[i] = function methodWrap(method) {
    -        return function methodWrapReturnFunction() {
    -          return stream[method].apply(stream, arguments);
    -        };
    -      }(i);
    -    }
    -  }
    -
    -  // proxy certain important events.
    -  for (var n = 0; n < kProxyEvents.length; n++) {
    -    stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
    -  }
    -
    -  // when we try to consume some more bytes, simply unpause the
    -  // underlying stream.
    -  this._read = function (n) {
    -    debug('wrapped _read', n);
    -    if (paused) {
    -      paused = false;
    -      stream.resume();
    -    }
    -  };
    -  return this;
    -};
    -if (typeof Symbol === 'function') {
    -  Readable.prototype[Symbol.asyncIterator] = function () {
    -    if (createReadableStreamAsyncIterator === undefined) {
    -      createReadableStreamAsyncIterator = require('./internal/streams/async_iterator');
    -    }
    -    return createReadableStreamAsyncIterator(this);
    -  };
    -}
    -Object.defineProperty(Readable.prototype, 'readableHighWaterMark', {
    -  // making it explicit this property is not enumerable
    -  // because otherwise some prototype manipulation in
    -  // userland will fail
    -  enumerable: false,
    -  get: function get() {
    -    return this._readableState.highWaterMark;
    -  }
    -});
    -Object.defineProperty(Readable.prototype, 'readableBuffer', {
    -  // making it explicit this property is not enumerable
    -  // because otherwise some prototype manipulation in
    -  // userland will fail
    -  enumerable: false,
    -  get: function get() {
    -    return this._readableState && this._readableState.buffer;
    -  }
    -});
    -Object.defineProperty(Readable.prototype, 'readableFlowing', {
    -  // making it explicit this property is not enumerable
    -  // because otherwise some prototype manipulation in
    -  // userland will fail
    -  enumerable: false,
    -  get: function get() {
    -    return this._readableState.flowing;
    -  },
    -  set: function set(state) {
    -    if (this._readableState) {
    -      this._readableState.flowing = state;
    -    }
    -  }
    -});
    -
    -// exposed for testing purposes only.
    -Readable._fromList = fromList;
    -Object.defineProperty(Readable.prototype, 'readableLength', {
    -  // making it explicit this property is not enumerable
    -  // because otherwise some prototype manipulation in
    -  // userland will fail
    -  enumerable: false,
    -  get: function get() {
    -    return this._readableState.length;
    -  }
    -});
    -
    -// Pluck off n bytes from an array of buffers.
    -// Length is the combined lengths of all the buffers in the list.
    -// This function is designed to be inlinable, so please take care when making
    -// changes to the function body.
    -function fromList(n, state) {
    -  // nothing buffered
    -  if (state.length === 0) return null;
    -  var ret;
    -  if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
    -    // read it all, truncate the list
    -    if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length);
    -    state.buffer.clear();
    -  } else {
    -    // read part of list
    -    ret = state.buffer.consume(n, state.decoder);
    -  }
    -  return ret;
    -}
    -function endReadable(stream) {
    -  var state = stream._readableState;
    -  debug('endReadable', state.endEmitted);
    -  if (!state.endEmitted) {
    -    state.ended = true;
    -    process.nextTick(endReadableNT, state, stream);
    -  }
    -}
    -function endReadableNT(state, stream) {
    -  debug('endReadableNT', state.endEmitted, state.length);
    -
    -  // Check that we didn't get one last unshift.
    -  if (!state.endEmitted && state.length === 0) {
    -    state.endEmitted = true;
    -    stream.readable = false;
    -    stream.emit('end');
    -    if (state.autoDestroy) {
    -      // In case of duplex streams we need a way to detect
    -      // if the writable side is ready for autoDestroy as well
    -      var wState = stream._writableState;
    -      if (!wState || wState.autoDestroy && wState.finished) {
    -        stream.destroy();
    -      }
    -    }
    -  }
    -}
    -if (typeof Symbol === 'function') {
    -  Readable.from = function (iterable, opts) {
    -    if (from === undefined) {
    -      from = require('./internal/streams/from');
    -    }
    -    return from(Readable, iterable, opts);
    -  };
    -}
    -function indexOf(xs, x) {
    -  for (var i = 0, l = xs.length; i < l; i++) {
    -    if (xs[i] === x) return i;
    -  }
    -  return -1;
    -}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/_stream_transform.js b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/_stream_transform.js
    deleted file mode 100644
    index 1ccb7157be8b8c..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/_stream_transform.js
    +++ /dev/null
    @@ -1,190 +0,0 @@
    -// Copyright Joyent, Inc. and other Node contributors.
    -//
    -// Permission is hereby granted, free of charge, to any person obtaining a
    -// copy of this software and associated documentation files (the
    -// "Software"), to deal in the Software without restriction, including
    -// without limitation the rights to use, copy, modify, merge, publish,
    -// distribute, sublicense, and/or sell copies of the Software, and to permit
    -// persons to whom the Software is furnished to do so, subject to the
    -// following conditions:
    -//
    -// The above copyright notice and this permission notice shall be included
    -// in all copies or substantial portions of the Software.
    -//
    -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
    -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
    -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
    -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
    -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
    -// USE OR OTHER DEALINGS IN THE SOFTWARE.
    -
    -// a transform stream is a readable/writable stream where you do
    -// something with the data.  Sometimes it's called a "filter",
    -// but that's not a great name for it, since that implies a thing where
    -// some bits pass through, and others are simply ignored.  (That would
    -// be a valid example of a transform, of course.)
    -//
    -// While the output is causally related to the input, it's not a
    -// necessarily symmetric or synchronous transformation.  For example,
    -// a zlib stream might take multiple plain-text writes(), and then
    -// emit a single compressed chunk some time in the future.
    -//
    -// Here's how this works:
    -//
    -// The Transform stream has all the aspects of the readable and writable
    -// stream classes.  When you write(chunk), that calls _write(chunk,cb)
    -// internally, and returns false if there's a lot of pending writes
    -// buffered up.  When you call read(), that calls _read(n) until
    -// there's enough pending readable data buffered up.
    -//
    -// In a transform stream, the written data is placed in a buffer.  When
    -// _read(n) is called, it transforms the queued up data, calling the
    -// buffered _write cb's as it consumes chunks.  If consuming a single
    -// written chunk would result in multiple output chunks, then the first
    -// outputted bit calls the readcb, and subsequent chunks just go into
    -// the read buffer, and will cause it to emit 'readable' if necessary.
    -//
    -// This way, back-pressure is actually determined by the reading side,
    -// since _read has to be called to start processing a new chunk.  However,
    -// a pathological inflate type of transform can cause excessive buffering
    -// here.  For example, imagine a stream where every byte of input is
    -// interpreted as an integer from 0-255, and then results in that many
    -// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in
    -// 1kb of data being output.  In this case, you could write a very small
    -// amount of input, and end up with a very large amount of output.  In
    -// such a pathological inflating mechanism, there'd be no way to tell
    -// the system to stop doing the transform.  A single 4MB write could
    -// cause the system to run out of memory.
    -//
    -// However, even in such a pathological case, only a single written chunk
    -// would be consumed, and then the rest would wait (un-transformed) until
    -// the results of the previous transformed chunk were consumed.
    -
    -'use strict';
    -
    -module.exports = Transform;
    -var _require$codes = require('../errors').codes,
    -  ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
    -  ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,
    -  ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING,
    -  ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0;
    -var Duplex = require('./_stream_duplex');
    -require('inherits')(Transform, Duplex);
    -function afterTransform(er, data) {
    -  var ts = this._transformState;
    -  ts.transforming = false;
    -  var cb = ts.writecb;
    -  if (cb === null) {
    -    return this.emit('error', new ERR_MULTIPLE_CALLBACK());
    -  }
    -  ts.writechunk = null;
    -  ts.writecb = null;
    -  if (data != null)
    -    // single equals check for both `null` and `undefined`
    -    this.push(data);
    -  cb(er);
    -  var rs = this._readableState;
    -  rs.reading = false;
    -  if (rs.needReadable || rs.length < rs.highWaterMark) {
    -    this._read(rs.highWaterMark);
    -  }
    -}
    -function Transform(options) {
    -  if (!(this instanceof Transform)) return new Transform(options);
    -  Duplex.call(this, options);
    -  this._transformState = {
    -    afterTransform: afterTransform.bind(this),
    -    needTransform: false,
    -    transforming: false,
    -    writecb: null,
    -    writechunk: null,
    -    writeencoding: null
    -  };
    -
    -  // start out asking for a readable event once data is transformed.
    -  this._readableState.needReadable = true;
    -
    -  // we have implemented the _read method, and done the other things
    -  // that Readable wants before the first _read call, so unset the
    -  // sync guard flag.
    -  this._readableState.sync = false;
    -  if (options) {
    -    if (typeof options.transform === 'function') this._transform = options.transform;
    -    if (typeof options.flush === 'function') this._flush = options.flush;
    -  }
    -
    -  // When the writable side finishes, then flush out anything remaining.
    -  this.on('prefinish', prefinish);
    -}
    -function prefinish() {
    -  var _this = this;
    -  if (typeof this._flush === 'function' && !this._readableState.destroyed) {
    -    this._flush(function (er, data) {
    -      done(_this, er, data);
    -    });
    -  } else {
    -    done(this, null, null);
    -  }
    -}
    -Transform.prototype.push = function (chunk, encoding) {
    -  this._transformState.needTransform = false;
    -  return Duplex.prototype.push.call(this, chunk, encoding);
    -};
    -
    -// This is the part where you do stuff!
    -// override this function in implementation classes.
    -// 'chunk' is an input chunk.
    -//
    -// Call `push(newChunk)` to pass along transformed output
    -// to the readable side.  You may call 'push' zero or more times.
    -//
    -// Call `cb(err)` when you are done with this chunk.  If you pass
    -// an error, then that'll put the hurt on the whole operation.  If you
    -// never call cb(), then you'll never get another chunk.
    -Transform.prototype._transform = function (chunk, encoding, cb) {
    -  cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()'));
    -};
    -Transform.prototype._write = function (chunk, encoding, cb) {
    -  var ts = this._transformState;
    -  ts.writecb = cb;
    -  ts.writechunk = chunk;
    -  ts.writeencoding = encoding;
    -  if (!ts.transforming) {
    -    var rs = this._readableState;
    -    if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
    -  }
    -};
    -
    -// Doesn't matter what the args are here.
    -// _transform does all the work.
    -// That we got here means that the readable side wants more data.
    -Transform.prototype._read = function (n) {
    -  var ts = this._transformState;
    -  if (ts.writechunk !== null && !ts.transforming) {
    -    ts.transforming = true;
    -    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
    -  } else {
    -    // mark that we need a transform, so that any data that comes in
    -    // will get processed, now that we've asked for it.
    -    ts.needTransform = true;
    -  }
    -};
    -Transform.prototype._destroy = function (err, cb) {
    -  Duplex.prototype._destroy.call(this, err, function (err2) {
    -    cb(err2);
    -  });
    -};
    -function done(stream, er, data) {
    -  if (er) return stream.emit('error', er);
    -  if (data != null)
    -    // single equals check for both `null` and `undefined`
    -    stream.push(data);
    -
    -  // TODO(BridgeAR): Write a test for these two error cases
    -  // if there's nothing in the write buffer, then that means
    -  // that nothing more will ever be provided
    -  if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0();
    -  if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING();
    -  return stream.push(null);
    -}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/_stream_writable.js b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/_stream_writable.js
    deleted file mode 100644
    index 292415e23a192b..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/_stream_writable.js
    +++ /dev/null
    @@ -1,641 +0,0 @@
    -// Copyright Joyent, Inc. and other Node contributors.
    -//
    -// Permission is hereby granted, free of charge, to any person obtaining a
    -// copy of this software and associated documentation files (the
    -// "Software"), to deal in the Software without restriction, including
    -// without limitation the rights to use, copy, modify, merge, publish,
    -// distribute, sublicense, and/or sell copies of the Software, and to permit
    -// persons to whom the Software is furnished to do so, subject to the
    -// following conditions:
    -//
    -// The above copyright notice and this permission notice shall be included
    -// in all copies or substantial portions of the Software.
    -//
    -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
    -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
    -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
    -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
    -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
    -// USE OR OTHER DEALINGS IN THE SOFTWARE.
    -
    -// A bit simpler than readable streams.
    -// Implement an async ._write(chunk, encoding, cb), and it'll handle all
    -// the drain event emission and buffering.
    -
    -'use strict';
    -
    -module.exports = Writable;
    -
    -/*  */
    -function WriteReq(chunk, encoding, cb) {
    -  this.chunk = chunk;
    -  this.encoding = encoding;
    -  this.callback = cb;
    -  this.next = null;
    -}
    -
    -// It seems a linked list but it is not
    -// there will be only 2 of these for each stream
    -function CorkedRequest(state) {
    -  var _this = this;
    -  this.next = null;
    -  this.entry = null;
    -  this.finish = function () {
    -    onCorkedFinish(_this, state);
    -  };
    -}
    -/*  */
    -
    -/**/
    -var Duplex;
    -/**/
    -
    -Writable.WritableState = WritableState;
    -
    -/**/
    -var internalUtil = {
    -  deprecate: require('util-deprecate')
    -};
    -/**/
    -
    -/**/
    -var Stream = require('./internal/streams/stream');
    -/**/
    -
    -var Buffer = require('buffer').Buffer;
    -var OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};
    -function _uint8ArrayToBuffer(chunk) {
    -  return Buffer.from(chunk);
    -}
    -function _isUint8Array(obj) {
    -  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
    -}
    -var destroyImpl = require('./internal/streams/destroy');
    -var _require = require('./internal/streams/state'),
    -  getHighWaterMark = _require.getHighWaterMark;
    -var _require$codes = require('../errors').codes,
    -  ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,
    -  ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
    -  ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,
    -  ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE,
    -  ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED,
    -  ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES,
    -  ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END,
    -  ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING;
    -var errorOrDestroy = destroyImpl.errorOrDestroy;
    -require('inherits')(Writable, Stream);
    -function nop() {}
    -function WritableState(options, stream, isDuplex) {
    -  Duplex = Duplex || require('./_stream_duplex');
    -  options = options || {};
    -
    -  // Duplex streams are both readable and writable, but share
    -  // the same options object.
    -  // However, some cases require setting options to different
    -  // values for the readable and the writable sides of the duplex stream,
    -  // e.g. options.readableObjectMode vs. options.writableObjectMode, etc.
    -  if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex;
    -
    -  // object stream flag to indicate whether or not this stream
    -  // contains buffers or objects.
    -  this.objectMode = !!options.objectMode;
    -  if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;
    -
    -  // the point at which write() starts returning false
    -  // Note: 0 is a valid value, means that we always return false if
    -  // the entire buffer is not flushed immediately on write()
    -  this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex);
    -
    -  // if _final has been called
    -  this.finalCalled = false;
    -
    -  // drain event flag.
    -  this.needDrain = false;
    -  // at the start of calling end()
    -  this.ending = false;
    -  // when end() has been called, and returned
    -  this.ended = false;
    -  // when 'finish' is emitted
    -  this.finished = false;
    -
    -  // has it been destroyed
    -  this.destroyed = false;
    -
    -  // should we decode strings into buffers before passing to _write?
    -  // this is here so that some node-core streams can optimize string
    -  // handling at a lower level.
    -  var noDecode = options.decodeStrings === false;
    -  this.decodeStrings = !noDecode;
    -
    -  // Crypto is kind of old and crusty.  Historically, its default string
    -  // encoding is 'binary' so we have to make this configurable.
    -  // Everything else in the universe uses 'utf8', though.
    -  this.defaultEncoding = options.defaultEncoding || 'utf8';
    -
    -  // not an actual buffer we keep track of, but a measurement
    -  // of how much we're waiting to get pushed to some underlying
    -  // socket or file.
    -  this.length = 0;
    -
    -  // a flag to see when we're in the middle of a write.
    -  this.writing = false;
    -
    -  // when true all writes will be buffered until .uncork() call
    -  this.corked = 0;
    -
    -  // a flag to be able to tell if the onwrite cb is called immediately,
    -  // or on a later tick.  We set this to true at first, because any
    -  // actions that shouldn't happen until "later" should generally also
    -  // not happen before the first write call.
    -  this.sync = true;
    -
    -  // a flag to know if we're processing previously buffered items, which
    -  // may call the _write() callback in the same tick, so that we don't
    -  // end up in an overlapped onwrite situation.
    -  this.bufferProcessing = false;
    -
    -  // the callback that's passed to _write(chunk,cb)
    -  this.onwrite = function (er) {
    -    onwrite(stream, er);
    -  };
    -
    -  // the callback that the user supplies to write(chunk,encoding,cb)
    -  this.writecb = null;
    -
    -  // the amount that is being written when _write is called.
    -  this.writelen = 0;
    -  this.bufferedRequest = null;
    -  this.lastBufferedRequest = null;
    -
    -  // number of pending user-supplied write callbacks
    -  // this must be 0 before 'finish' can be emitted
    -  this.pendingcb = 0;
    -
    -  // emit prefinish if the only thing we're waiting for is _write cbs
    -  // This is relevant for synchronous Transform streams
    -  this.prefinished = false;
    -
    -  // True if the error was already emitted and should not be thrown again
    -  this.errorEmitted = false;
    -
    -  // Should close be emitted on destroy. Defaults to true.
    -  this.emitClose = options.emitClose !== false;
    -
    -  // Should .destroy() be called after 'finish' (and potentially 'end')
    -  this.autoDestroy = !!options.autoDestroy;
    -
    -  // count buffered requests
    -  this.bufferedRequestCount = 0;
    -
    -  // allocate the first CorkedRequest, there is always
    -  // one allocated and free to use, and we maintain at most two
    -  this.corkedRequestsFree = new CorkedRequest(this);
    -}
    -WritableState.prototype.getBuffer = function getBuffer() {
    -  var current = this.bufferedRequest;
    -  var out = [];
    -  while (current) {
    -    out.push(current);
    -    current = current.next;
    -  }
    -  return out;
    -};
    -(function () {
    -  try {
    -    Object.defineProperty(WritableState.prototype, 'buffer', {
    -      get: internalUtil.deprecate(function writableStateBufferGetter() {
    -        return this.getBuffer();
    -      }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')
    -    });
    -  } catch (_) {}
    -})();
    -
    -// Test _writableState for inheritance to account for Duplex streams,
    -// whose prototype chain only points to Readable.
    -var realHasInstance;
    -if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
    -  realHasInstance = Function.prototype[Symbol.hasInstance];
    -  Object.defineProperty(Writable, Symbol.hasInstance, {
    -    value: function value(object) {
    -      if (realHasInstance.call(this, object)) return true;
    -      if (this !== Writable) return false;
    -      return object && object._writableState instanceof WritableState;
    -    }
    -  });
    -} else {
    -  realHasInstance = function realHasInstance(object) {
    -    return object instanceof this;
    -  };
    -}
    -function Writable(options) {
    -  Duplex = Duplex || require('./_stream_duplex');
    -
    -  // Writable ctor is applied to Duplexes, too.
    -  // `realHasInstance` is necessary because using plain `instanceof`
    -  // would return false, as no `_writableState` property is attached.
    -
    -  // Trying to use the custom `instanceof` for Writable here will also break the
    -  // Node.js LazyTransform implementation, which has a non-trivial getter for
    -  // `_writableState` that would lead to infinite recursion.
    -
    -  // Checking for a Stream.Duplex instance is faster here instead of inside
    -  // the WritableState constructor, at least with V8 6.5
    -  var isDuplex = this instanceof Duplex;
    -  if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options);
    -  this._writableState = new WritableState(options, this, isDuplex);
    -
    -  // legacy.
    -  this.writable = true;
    -  if (options) {
    -    if (typeof options.write === 'function') this._write = options.write;
    -    if (typeof options.writev === 'function') this._writev = options.writev;
    -    if (typeof options.destroy === 'function') this._destroy = options.destroy;
    -    if (typeof options.final === 'function') this._final = options.final;
    -  }
    -  Stream.call(this);
    -}
    -
    -// Otherwise people can pipe Writable streams, which is just wrong.
    -Writable.prototype.pipe = function () {
    -  errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE());
    -};
    -function writeAfterEnd(stream, cb) {
    -  var er = new ERR_STREAM_WRITE_AFTER_END();
    -  // TODO: defer error events consistently everywhere, not just the cb
    -  errorOrDestroy(stream, er);
    -  process.nextTick(cb, er);
    -}
    -
    -// Checks that a user-supplied chunk is valid, especially for the particular
    -// mode the stream is in. Currently this means that `null` is never accepted
    -// and undefined/non-string values are only allowed in object mode.
    -function validChunk(stream, state, chunk, cb) {
    -  var er;
    -  if (chunk === null) {
    -    er = new ERR_STREAM_NULL_VALUES();
    -  } else if (typeof chunk !== 'string' && !state.objectMode) {
    -    er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk);
    -  }
    -  if (er) {
    -    errorOrDestroy(stream, er);
    -    process.nextTick(cb, er);
    -    return false;
    -  }
    -  return true;
    -}
    -Writable.prototype.write = function (chunk, encoding, cb) {
    -  var state = this._writableState;
    -  var ret = false;
    -  var isBuf = !state.objectMode && _isUint8Array(chunk);
    -  if (isBuf && !Buffer.isBuffer(chunk)) {
    -    chunk = _uint8ArrayToBuffer(chunk);
    -  }
    -  if (typeof encoding === 'function') {
    -    cb = encoding;
    -    encoding = null;
    -  }
    -  if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
    -  if (typeof cb !== 'function') cb = nop;
    -  if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
    -    state.pendingcb++;
    -    ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
    -  }
    -  return ret;
    -};
    -Writable.prototype.cork = function () {
    -  this._writableState.corked++;
    -};
    -Writable.prototype.uncork = function () {
    -  var state = this._writableState;
    -  if (state.corked) {
    -    state.corked--;
    -    if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
    -  }
    -};
    -Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
    -  // node::ParseEncoding() requires lower case.
    -  if (typeof encoding === 'string') encoding = encoding.toLowerCase();
    -  if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding);
    -  this._writableState.defaultEncoding = encoding;
    -  return this;
    -};
    -Object.defineProperty(Writable.prototype, 'writableBuffer', {
    -  // making it explicit this property is not enumerable
    -  // because otherwise some prototype manipulation in
    -  // userland will fail
    -  enumerable: false,
    -  get: function get() {
    -    return this._writableState && this._writableState.getBuffer();
    -  }
    -});
    -function decodeChunk(state, chunk, encoding) {
    -  if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
    -    chunk = Buffer.from(chunk, encoding);
    -  }
    -  return chunk;
    -}
    -Object.defineProperty(Writable.prototype, 'writableHighWaterMark', {
    -  // making it explicit this property is not enumerable
    -  // because otherwise some prototype manipulation in
    -  // userland will fail
    -  enumerable: false,
    -  get: function get() {
    -    return this._writableState.highWaterMark;
    -  }
    -});
    -
    -// if we're already writing something, then just put this
    -// in the queue, and wait our turn.  Otherwise, call _write
    -// If we return false, then we need a drain event, so set that flag.
    -function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
    -  if (!isBuf) {
    -    var newChunk = decodeChunk(state, chunk, encoding);
    -    if (chunk !== newChunk) {
    -      isBuf = true;
    -      encoding = 'buffer';
    -      chunk = newChunk;
    -    }
    -  }
    -  var len = state.objectMode ? 1 : chunk.length;
    -  state.length += len;
    -  var ret = state.length < state.highWaterMark;
    -  // we must ensure that previous needDrain will not be reset to false.
    -  if (!ret) state.needDrain = true;
    -  if (state.writing || state.corked) {
    -    var last = state.lastBufferedRequest;
    -    state.lastBufferedRequest = {
    -      chunk: chunk,
    -      encoding: encoding,
    -      isBuf: isBuf,
    -      callback: cb,
    -      next: null
    -    };
    -    if (last) {
    -      last.next = state.lastBufferedRequest;
    -    } else {
    -      state.bufferedRequest = state.lastBufferedRequest;
    -    }
    -    state.bufferedRequestCount += 1;
    -  } else {
    -    doWrite(stream, state, false, len, chunk, encoding, cb);
    -  }
    -  return ret;
    -}
    -function doWrite(stream, state, writev, len, chunk, encoding, cb) {
    -  state.writelen = len;
    -  state.writecb = cb;
    -  state.writing = true;
    -  state.sync = true;
    -  if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));else if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
    -  state.sync = false;
    -}
    -function onwriteError(stream, state, sync, er, cb) {
    -  --state.pendingcb;
    -  if (sync) {
    -    // defer the callback if we are being called synchronously
    -    // to avoid piling up things on the stack
    -    process.nextTick(cb, er);
    -    // this can emit finish, and it will always happen
    -    // after error
    -    process.nextTick(finishMaybe, stream, state);
    -    stream._writableState.errorEmitted = true;
    -    errorOrDestroy(stream, er);
    -  } else {
    -    // the caller expect this to happen before if
    -    // it is async
    -    cb(er);
    -    stream._writableState.errorEmitted = true;
    -    errorOrDestroy(stream, er);
    -    // this can emit finish, but finish must
    -    // always follow error
    -    finishMaybe(stream, state);
    -  }
    -}
    -function onwriteStateUpdate(state) {
    -  state.writing = false;
    -  state.writecb = null;
    -  state.length -= state.writelen;
    -  state.writelen = 0;
    -}
    -function onwrite(stream, er) {
    -  var state = stream._writableState;
    -  var sync = state.sync;
    -  var cb = state.writecb;
    -  if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK();
    -  onwriteStateUpdate(state);
    -  if (er) onwriteError(stream, state, sync, er, cb);else {
    -    // Check if we're actually ready to finish, but don't emit yet
    -    var finished = needFinish(state) || stream.destroyed;
    -    if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
    -      clearBuffer(stream, state);
    -    }
    -    if (sync) {
    -      process.nextTick(afterWrite, stream, state, finished, cb);
    -    } else {
    -      afterWrite(stream, state, finished, cb);
    -    }
    -  }
    -}
    -function afterWrite(stream, state, finished, cb) {
    -  if (!finished) onwriteDrain(stream, state);
    -  state.pendingcb--;
    -  cb();
    -  finishMaybe(stream, state);
    -}
    -
    -// Must force callback to be called on nextTick, so that we don't
    -// emit 'drain' before the write() consumer gets the 'false' return
    -// value, and has a chance to attach a 'drain' listener.
    -function onwriteDrain(stream, state) {
    -  if (state.length === 0 && state.needDrain) {
    -    state.needDrain = false;
    -    stream.emit('drain');
    -  }
    -}
    -
    -// if there's something in the buffer waiting, then process it
    -function clearBuffer(stream, state) {
    -  state.bufferProcessing = true;
    -  var entry = state.bufferedRequest;
    -  if (stream._writev && entry && entry.next) {
    -    // Fast case, write everything using _writev()
    -    var l = state.bufferedRequestCount;
    -    var buffer = new Array(l);
    -    var holder = state.corkedRequestsFree;
    -    holder.entry = entry;
    -    var count = 0;
    -    var allBuffers = true;
    -    while (entry) {
    -      buffer[count] = entry;
    -      if (!entry.isBuf) allBuffers = false;
    -      entry = entry.next;
    -      count += 1;
    -    }
    -    buffer.allBuffers = allBuffers;
    -    doWrite(stream, state, true, state.length, buffer, '', holder.finish);
    -
    -    // doWrite is almost always async, defer these to save a bit of time
    -    // as the hot path ends with doWrite
    -    state.pendingcb++;
    -    state.lastBufferedRequest = null;
    -    if (holder.next) {
    -      state.corkedRequestsFree = holder.next;
    -      holder.next = null;
    -    } else {
    -      state.corkedRequestsFree = new CorkedRequest(state);
    -    }
    -    state.bufferedRequestCount = 0;
    -  } else {
    -    // Slow case, write chunks one-by-one
    -    while (entry) {
    -      var chunk = entry.chunk;
    -      var encoding = entry.encoding;
    -      var cb = entry.callback;
    -      var len = state.objectMode ? 1 : chunk.length;
    -      doWrite(stream, state, false, len, chunk, encoding, cb);
    -      entry = entry.next;
    -      state.bufferedRequestCount--;
    -      // if we didn't call the onwrite immediately, then
    -      // it means that we need to wait until it does.
    -      // also, that means that the chunk and cb are currently
    -      // being processed, so move the buffer counter past them.
    -      if (state.writing) {
    -        break;
    -      }
    -    }
    -    if (entry === null) state.lastBufferedRequest = null;
    -  }
    -  state.bufferedRequest = entry;
    -  state.bufferProcessing = false;
    -}
    -Writable.prototype._write = function (chunk, encoding, cb) {
    -  cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()'));
    -};
    -Writable.prototype._writev = null;
    -Writable.prototype.end = function (chunk, encoding, cb) {
    -  var state = this._writableState;
    -  if (typeof chunk === 'function') {
    -    cb = chunk;
    -    chunk = null;
    -    encoding = null;
    -  } else if (typeof encoding === 'function') {
    -    cb = encoding;
    -    encoding = null;
    -  }
    -  if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);
    -
    -  // .end() fully uncorks
    -  if (state.corked) {
    -    state.corked = 1;
    -    this.uncork();
    -  }
    -
    -  // ignore unnecessary end() calls.
    -  if (!state.ending) endWritable(this, state, cb);
    -  return this;
    -};
    -Object.defineProperty(Writable.prototype, 'writableLength', {
    -  // making it explicit this property is not enumerable
    -  // because otherwise some prototype manipulation in
    -  // userland will fail
    -  enumerable: false,
    -  get: function get() {
    -    return this._writableState.length;
    -  }
    -});
    -function needFinish(state) {
    -  return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
    -}
    -function callFinal(stream, state) {
    -  stream._final(function (err) {
    -    state.pendingcb--;
    -    if (err) {
    -      errorOrDestroy(stream, err);
    -    }
    -    state.prefinished = true;
    -    stream.emit('prefinish');
    -    finishMaybe(stream, state);
    -  });
    -}
    -function prefinish(stream, state) {
    -  if (!state.prefinished && !state.finalCalled) {
    -    if (typeof stream._final === 'function' && !state.destroyed) {
    -      state.pendingcb++;
    -      state.finalCalled = true;
    -      process.nextTick(callFinal, stream, state);
    -    } else {
    -      state.prefinished = true;
    -      stream.emit('prefinish');
    -    }
    -  }
    -}
    -function finishMaybe(stream, state) {
    -  var need = needFinish(state);
    -  if (need) {
    -    prefinish(stream, state);
    -    if (state.pendingcb === 0) {
    -      state.finished = true;
    -      stream.emit('finish');
    -      if (state.autoDestroy) {
    -        // In case of duplex streams we need a way to detect
    -        // if the readable side is ready for autoDestroy as well
    -        var rState = stream._readableState;
    -        if (!rState || rState.autoDestroy && rState.endEmitted) {
    -          stream.destroy();
    -        }
    -      }
    -    }
    -  }
    -  return need;
    -}
    -function endWritable(stream, state, cb) {
    -  state.ending = true;
    -  finishMaybe(stream, state);
    -  if (cb) {
    -    if (state.finished) process.nextTick(cb);else stream.once('finish', cb);
    -  }
    -  state.ended = true;
    -  stream.writable = false;
    -}
    -function onCorkedFinish(corkReq, state, err) {
    -  var entry = corkReq.entry;
    -  corkReq.entry = null;
    -  while (entry) {
    -    var cb = entry.callback;
    -    state.pendingcb--;
    -    cb(err);
    -    entry = entry.next;
    -  }
    -
    -  // reuse the free corkReq.
    -  state.corkedRequestsFree.next = corkReq;
    -}
    -Object.defineProperty(Writable.prototype, 'destroyed', {
    -  // making it explicit this property is not enumerable
    -  // because otherwise some prototype manipulation in
    -  // userland will fail
    -  enumerable: false,
    -  get: function get() {
    -    if (this._writableState === undefined) {
    -      return false;
    -    }
    -    return this._writableState.destroyed;
    -  },
    -  set: function set(value) {
    -    // we ignore the value if the stream
    -    // has not been initialized yet
    -    if (!this._writableState) {
    -      return;
    -    }
    -
    -    // backward compatibility, the user is explicitly
    -    // managing destroyed
    -    this._writableState.destroyed = value;
    -  }
    -});
    -Writable.prototype.destroy = destroyImpl.destroy;
    -Writable.prototype._undestroy = destroyImpl.undestroy;
    -Writable.prototype._destroy = function (err, cb) {
    -  cb(err);
    -};
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/async_iterator.js b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/async_iterator.js
    deleted file mode 100644
    index 742c5a4674794d..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/async_iterator.js
    +++ /dev/null
    @@ -1,180 +0,0 @@
    -'use strict';
    -
    -var _Object$setPrototypeO;
    -function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
    -function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
    -function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
    -var finished = require('./end-of-stream');
    -var kLastResolve = Symbol('lastResolve');
    -var kLastReject = Symbol('lastReject');
    -var kError = Symbol('error');
    -var kEnded = Symbol('ended');
    -var kLastPromise = Symbol('lastPromise');
    -var kHandlePromise = Symbol('handlePromise');
    -var kStream = Symbol('stream');
    -function createIterResult(value, done) {
    -  return {
    -    value: value,
    -    done: done
    -  };
    -}
    -function readAndResolve(iter) {
    -  var resolve = iter[kLastResolve];
    -  if (resolve !== null) {
    -    var data = iter[kStream].read();
    -    // we defer if data is null
    -    // we can be expecting either 'end' or
    -    // 'error'
    -    if (data !== null) {
    -      iter[kLastPromise] = null;
    -      iter[kLastResolve] = null;
    -      iter[kLastReject] = null;
    -      resolve(createIterResult(data, false));
    -    }
    -  }
    -}
    -function onReadable(iter) {
    -  // we wait for the next tick, because it might
    -  // emit an error with process.nextTick
    -  process.nextTick(readAndResolve, iter);
    -}
    -function wrapForNext(lastPromise, iter) {
    -  return function (resolve, reject) {
    -    lastPromise.then(function () {
    -      if (iter[kEnded]) {
    -        resolve(createIterResult(undefined, true));
    -        return;
    -      }
    -      iter[kHandlePromise](resolve, reject);
    -    }, reject);
    -  };
    -}
    -var AsyncIteratorPrototype = Object.getPrototypeOf(function () {});
    -var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = {
    -  get stream() {
    -    return this[kStream];
    -  },
    -  next: function next() {
    -    var _this = this;
    -    // if we have detected an error in the meanwhile
    -    // reject straight away
    -    var error = this[kError];
    -    if (error !== null) {
    -      return Promise.reject(error);
    -    }
    -    if (this[kEnded]) {
    -      return Promise.resolve(createIterResult(undefined, true));
    -    }
    -    if (this[kStream].destroyed) {
    -      // We need to defer via nextTick because if .destroy(err) is
    -      // called, the error will be emitted via nextTick, and
    -      // we cannot guarantee that there is no error lingering around
    -      // waiting to be emitted.
    -      return new Promise(function (resolve, reject) {
    -        process.nextTick(function () {
    -          if (_this[kError]) {
    -            reject(_this[kError]);
    -          } else {
    -            resolve(createIterResult(undefined, true));
    -          }
    -        });
    -      });
    -    }
    -
    -    // if we have multiple next() calls
    -    // we will wait for the previous Promise to finish
    -    // this logic is optimized to support for await loops,
    -    // where next() is only called once at a time
    -    var lastPromise = this[kLastPromise];
    -    var promise;
    -    if (lastPromise) {
    -      promise = new Promise(wrapForNext(lastPromise, this));
    -    } else {
    -      // fast path needed to support multiple this.push()
    -      // without triggering the next() queue
    -      var data = this[kStream].read();
    -      if (data !== null) {
    -        return Promise.resolve(createIterResult(data, false));
    -      }
    -      promise = new Promise(this[kHandlePromise]);
    -    }
    -    this[kLastPromise] = promise;
    -    return promise;
    -  }
    -}, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () {
    -  return this;
    -}), _defineProperty(_Object$setPrototypeO, "return", function _return() {
    -  var _this2 = this;
    -  // destroy(err, cb) is a private API
    -  // we can guarantee we have that here, because we control the
    -  // Readable class this is attached to
    -  return new Promise(function (resolve, reject) {
    -    _this2[kStream].destroy(null, function (err) {
    -      if (err) {
    -        reject(err);
    -        return;
    -      }
    -      resolve(createIterResult(undefined, true));
    -    });
    -  });
    -}), _Object$setPrototypeO), AsyncIteratorPrototype);
    -var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) {
    -  var _Object$create;
    -  var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, {
    -    value: stream,
    -    writable: true
    -  }), _defineProperty(_Object$create, kLastResolve, {
    -    value: null,
    -    writable: true
    -  }), _defineProperty(_Object$create, kLastReject, {
    -    value: null,
    -    writable: true
    -  }), _defineProperty(_Object$create, kError, {
    -    value: null,
    -    writable: true
    -  }), _defineProperty(_Object$create, kEnded, {
    -    value: stream._readableState.endEmitted,
    -    writable: true
    -  }), _defineProperty(_Object$create, kHandlePromise, {
    -    value: function value(resolve, reject) {
    -      var data = iterator[kStream].read();
    -      if (data) {
    -        iterator[kLastPromise] = null;
    -        iterator[kLastResolve] = null;
    -        iterator[kLastReject] = null;
    -        resolve(createIterResult(data, false));
    -      } else {
    -        iterator[kLastResolve] = resolve;
    -        iterator[kLastReject] = reject;
    -      }
    -    },
    -    writable: true
    -  }), _Object$create));
    -  iterator[kLastPromise] = null;
    -  finished(stream, function (err) {
    -    if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') {
    -      var reject = iterator[kLastReject];
    -      // reject if we are waiting for data in the Promise
    -      // returned by next() and store the error
    -      if (reject !== null) {
    -        iterator[kLastPromise] = null;
    -        iterator[kLastResolve] = null;
    -        iterator[kLastReject] = null;
    -        reject(err);
    -      }
    -      iterator[kError] = err;
    -      return;
    -    }
    -    var resolve = iterator[kLastResolve];
    -    if (resolve !== null) {
    -      iterator[kLastPromise] = null;
    -      iterator[kLastResolve] = null;
    -      iterator[kLastReject] = null;
    -      resolve(createIterResult(undefined, true));
    -    }
    -    iterator[kEnded] = true;
    -  });
    -  stream.on('readable', onReadable.bind(null, iterator));
    -  return iterator;
    -};
    -module.exports = createReadableStreamAsyncIterator;
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/buffer_list.js b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/buffer_list.js
    deleted file mode 100644
    index 69bda497d35f34..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/buffer_list.js
    +++ /dev/null
    @@ -1,183 +0,0 @@
    -'use strict';
    -
    -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
    -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
    -function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
    -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
    -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
    -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
    -function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
    -function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
    -var _require = require('buffer'),
    -  Buffer = _require.Buffer;
    -var _require2 = require('util'),
    -  inspect = _require2.inspect;
    -var custom = inspect && inspect.custom || 'inspect';
    -function copyBuffer(src, target, offset) {
    -  Buffer.prototype.copy.call(src, target, offset);
    -}
    -module.exports = /*#__PURE__*/function () {
    -  function BufferList() {
    -    _classCallCheck(this, BufferList);
    -    this.head = null;
    -    this.tail = null;
    -    this.length = 0;
    -  }
    -  _createClass(BufferList, [{
    -    key: "push",
    -    value: function push(v) {
    -      var entry = {
    -        data: v,
    -        next: null
    -      };
    -      if (this.length > 0) this.tail.next = entry;else this.head = entry;
    -      this.tail = entry;
    -      ++this.length;
    -    }
    -  }, {
    -    key: "unshift",
    -    value: function unshift(v) {
    -      var entry = {
    -        data: v,
    -        next: this.head
    -      };
    -      if (this.length === 0) this.tail = entry;
    -      this.head = entry;
    -      ++this.length;
    -    }
    -  }, {
    -    key: "shift",
    -    value: function shift() {
    -      if (this.length === 0) return;
    -      var ret = this.head.data;
    -      if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
    -      --this.length;
    -      return ret;
    -    }
    -  }, {
    -    key: "clear",
    -    value: function clear() {
    -      this.head = this.tail = null;
    -      this.length = 0;
    -    }
    -  }, {
    -    key: "join",
    -    value: function join(s) {
    -      if (this.length === 0) return '';
    -      var p = this.head;
    -      var ret = '' + p.data;
    -      while (p = p.next) ret += s + p.data;
    -      return ret;
    -    }
    -  }, {
    -    key: "concat",
    -    value: function concat(n) {
    -      if (this.length === 0) return Buffer.alloc(0);
    -      var ret = Buffer.allocUnsafe(n >>> 0);
    -      var p = this.head;
    -      var i = 0;
    -      while (p) {
    -        copyBuffer(p.data, ret, i);
    -        i += p.data.length;
    -        p = p.next;
    -      }
    -      return ret;
    -    }
    -
    -    // Consumes a specified amount of bytes or characters from the buffered data.
    -  }, {
    -    key: "consume",
    -    value: function consume(n, hasStrings) {
    -      var ret;
    -      if (n < this.head.data.length) {
    -        // `slice` is the same for buffers and strings.
    -        ret = this.head.data.slice(0, n);
    -        this.head.data = this.head.data.slice(n);
    -      } else if (n === this.head.data.length) {
    -        // First chunk is a perfect match.
    -        ret = this.shift();
    -      } else {
    -        // Result spans more than one buffer.
    -        ret = hasStrings ? this._getString(n) : this._getBuffer(n);
    -      }
    -      return ret;
    -    }
    -  }, {
    -    key: "first",
    -    value: function first() {
    -      return this.head.data;
    -    }
    -
    -    // Consumes a specified amount of characters from the buffered data.
    -  }, {
    -    key: "_getString",
    -    value: function _getString(n) {
    -      var p = this.head;
    -      var c = 1;
    -      var ret = p.data;
    -      n -= ret.length;
    -      while (p = p.next) {
    -        var str = p.data;
    -        var nb = n > str.length ? str.length : n;
    -        if (nb === str.length) ret += str;else ret += str.slice(0, n);
    -        n -= nb;
    -        if (n === 0) {
    -          if (nb === str.length) {
    -            ++c;
    -            if (p.next) this.head = p.next;else this.head = this.tail = null;
    -          } else {
    -            this.head = p;
    -            p.data = str.slice(nb);
    -          }
    -          break;
    -        }
    -        ++c;
    -      }
    -      this.length -= c;
    -      return ret;
    -    }
    -
    -    // Consumes a specified amount of bytes from the buffered data.
    -  }, {
    -    key: "_getBuffer",
    -    value: function _getBuffer(n) {
    -      var ret = Buffer.allocUnsafe(n);
    -      var p = this.head;
    -      var c = 1;
    -      p.data.copy(ret);
    -      n -= p.data.length;
    -      while (p = p.next) {
    -        var buf = p.data;
    -        var nb = n > buf.length ? buf.length : n;
    -        buf.copy(ret, ret.length - n, 0, nb);
    -        n -= nb;
    -        if (n === 0) {
    -          if (nb === buf.length) {
    -            ++c;
    -            if (p.next) this.head = p.next;else this.head = this.tail = null;
    -          } else {
    -            this.head = p;
    -            p.data = buf.slice(nb);
    -          }
    -          break;
    -        }
    -        ++c;
    -      }
    -      this.length -= c;
    -      return ret;
    -    }
    -
    -    // Make sure the linked list only shows the minimal necessary information.
    -  }, {
    -    key: custom,
    -    value: function value(_, options) {
    -      return inspect(this, _objectSpread(_objectSpread({}, options), {}, {
    -        // Only inspect one level.
    -        depth: 0,
    -        // It should not recurse.
    -        customInspect: false
    -      }));
    -    }
    -  }]);
    -  return BufferList;
    -}();
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/destroy.js b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/destroy.js
    deleted file mode 100644
    index 31a17c4dc46388..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/destroy.js
    +++ /dev/null
    @@ -1,96 +0,0 @@
    -'use strict';
    -
    -// undocumented cb() API, needed for core, not for public API
    -function destroy(err, cb) {
    -  var _this = this;
    -  var readableDestroyed = this._readableState && this._readableState.destroyed;
    -  var writableDestroyed = this._writableState && this._writableState.destroyed;
    -  if (readableDestroyed || writableDestroyed) {
    -    if (cb) {
    -      cb(err);
    -    } else if (err) {
    -      if (!this._writableState) {
    -        process.nextTick(emitErrorNT, this, err);
    -      } else if (!this._writableState.errorEmitted) {
    -        this._writableState.errorEmitted = true;
    -        process.nextTick(emitErrorNT, this, err);
    -      }
    -    }
    -    return this;
    -  }
    -
    -  // we set destroyed to true before firing error callbacks in order
    -  // to make it re-entrance safe in case destroy() is called within callbacks
    -
    -  if (this._readableState) {
    -    this._readableState.destroyed = true;
    -  }
    -
    -  // if this is a duplex stream mark the writable part as destroyed as well
    -  if (this._writableState) {
    -    this._writableState.destroyed = true;
    -  }
    -  this._destroy(err || null, function (err) {
    -    if (!cb && err) {
    -      if (!_this._writableState) {
    -        process.nextTick(emitErrorAndCloseNT, _this, err);
    -      } else if (!_this._writableState.errorEmitted) {
    -        _this._writableState.errorEmitted = true;
    -        process.nextTick(emitErrorAndCloseNT, _this, err);
    -      } else {
    -        process.nextTick(emitCloseNT, _this);
    -      }
    -    } else if (cb) {
    -      process.nextTick(emitCloseNT, _this);
    -      cb(err);
    -    } else {
    -      process.nextTick(emitCloseNT, _this);
    -    }
    -  });
    -  return this;
    -}
    -function emitErrorAndCloseNT(self, err) {
    -  emitErrorNT(self, err);
    -  emitCloseNT(self);
    -}
    -function emitCloseNT(self) {
    -  if (self._writableState && !self._writableState.emitClose) return;
    -  if (self._readableState && !self._readableState.emitClose) return;
    -  self.emit('close');
    -}
    -function undestroy() {
    -  if (this._readableState) {
    -    this._readableState.destroyed = false;
    -    this._readableState.reading = false;
    -    this._readableState.ended = false;
    -    this._readableState.endEmitted = false;
    -  }
    -  if (this._writableState) {
    -    this._writableState.destroyed = false;
    -    this._writableState.ended = false;
    -    this._writableState.ending = false;
    -    this._writableState.finalCalled = false;
    -    this._writableState.prefinished = false;
    -    this._writableState.finished = false;
    -    this._writableState.errorEmitted = false;
    -  }
    -}
    -function emitErrorNT(self, err) {
    -  self.emit('error', err);
    -}
    -function errorOrDestroy(stream, err) {
    -  // We have tests that rely on errors being emitted
    -  // in the same tick, so changing this is semver major.
    -  // For now when you opt-in to autoDestroy we allow
    -  // the error to be emitted nextTick. In a future
    -  // semver major update we should change the default to this.
    -
    -  var rState = stream._readableState;
    -  var wState = stream._writableState;
    -  if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err);
    -}
    -module.exports = {
    -  destroy: destroy,
    -  undestroy: undestroy,
    -  errorOrDestroy: errorOrDestroy
    -};
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/end-of-stream.js b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/end-of-stream.js
    deleted file mode 100644
    index 59c671b5af769b..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/end-of-stream.js
    +++ /dev/null
    @@ -1,86 +0,0 @@
    -// Ported from https://github.com/mafintosh/end-of-stream with
    -// permission from the author, Mathias Buus (@mafintosh).
    -
    -'use strict';
    -
    -var ERR_STREAM_PREMATURE_CLOSE = require('../../../errors').codes.ERR_STREAM_PREMATURE_CLOSE;
    -function once(callback) {
    -  var called = false;
    -  return function () {
    -    if (called) return;
    -    called = true;
    -    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
    -      args[_key] = arguments[_key];
    -    }
    -    callback.apply(this, args);
    -  };
    -}
    -function noop() {}
    -function isRequest(stream) {
    -  return stream.setHeader && typeof stream.abort === 'function';
    -}
    -function eos(stream, opts, callback) {
    -  if (typeof opts === 'function') return eos(stream, null, opts);
    -  if (!opts) opts = {};
    -  callback = once(callback || noop);
    -  var readable = opts.readable || opts.readable !== false && stream.readable;
    -  var writable = opts.writable || opts.writable !== false && stream.writable;
    -  var onlegacyfinish = function onlegacyfinish() {
    -    if (!stream.writable) onfinish();
    -  };
    -  var writableEnded = stream._writableState && stream._writableState.finished;
    -  var onfinish = function onfinish() {
    -    writable = false;
    -    writableEnded = true;
    -    if (!readable) callback.call(stream);
    -  };
    -  var readableEnded = stream._readableState && stream._readableState.endEmitted;
    -  var onend = function onend() {
    -    readable = false;
    -    readableEnded = true;
    -    if (!writable) callback.call(stream);
    -  };
    -  var onerror = function onerror(err) {
    -    callback.call(stream, err);
    -  };
    -  var onclose = function onclose() {
    -    var err;
    -    if (readable && !readableEnded) {
    -      if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();
    -      return callback.call(stream, err);
    -    }
    -    if (writable && !writableEnded) {
    -      if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();
    -      return callback.call(stream, err);
    -    }
    -  };
    -  var onrequest = function onrequest() {
    -    stream.req.on('finish', onfinish);
    -  };
    -  if (isRequest(stream)) {
    -    stream.on('complete', onfinish);
    -    stream.on('abort', onclose);
    -    if (stream.req) onrequest();else stream.on('request', onrequest);
    -  } else if (writable && !stream._writableState) {
    -    // legacy streams
    -    stream.on('end', onlegacyfinish);
    -    stream.on('close', onlegacyfinish);
    -  }
    -  stream.on('end', onend);
    -  stream.on('finish', onfinish);
    -  if (opts.error !== false) stream.on('error', onerror);
    -  stream.on('close', onclose);
    -  return function () {
    -    stream.removeListener('complete', onfinish);
    -    stream.removeListener('abort', onclose);
    -    stream.removeListener('request', onrequest);
    -    if (stream.req) stream.req.removeListener('finish', onfinish);
    -    stream.removeListener('end', onlegacyfinish);
    -    stream.removeListener('close', onlegacyfinish);
    -    stream.removeListener('finish', onfinish);
    -    stream.removeListener('end', onend);
    -    stream.removeListener('error', onerror);
    -    stream.removeListener('close', onclose);
    -  };
    -}
    -module.exports = eos;
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/from-browser.js b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/from-browser.js
    deleted file mode 100644
    index a4ce56f3c90f60..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/from-browser.js
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -module.exports = function () {
    -  throw new Error('Readable.from is not available in the browser')
    -};
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/from.js b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/from.js
    deleted file mode 100644
    index 0a34ee92e3df85..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/from.js
    +++ /dev/null
    @@ -1,52 +0,0 @@
    -'use strict';
    -
    -function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
    -function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
    -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
    -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
    -function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
    -function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
    -function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
    -var ERR_INVALID_ARG_TYPE = require('../../../errors').codes.ERR_INVALID_ARG_TYPE;
    -function from(Readable, iterable, opts) {
    -  var iterator;
    -  if (iterable && typeof iterable.next === 'function') {
    -    iterator = iterable;
    -  } else if (iterable && iterable[Symbol.asyncIterator]) iterator = iterable[Symbol.asyncIterator]();else if (iterable && iterable[Symbol.iterator]) iterator = iterable[Symbol.iterator]();else throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable);
    -  var readable = new Readable(_objectSpread({
    -    objectMode: true
    -  }, opts));
    -  // Reading boolean to protect against _read
    -  // being called before last iteration completion.
    -  var reading = false;
    -  readable._read = function () {
    -    if (!reading) {
    -      reading = true;
    -      next();
    -    }
    -  };
    -  function next() {
    -    return _next2.apply(this, arguments);
    -  }
    -  function _next2() {
    -    _next2 = _asyncToGenerator(function* () {
    -      try {
    -        var _yield$iterator$next = yield iterator.next(),
    -          value = _yield$iterator$next.value,
    -          done = _yield$iterator$next.done;
    -        if (done) {
    -          readable.push(null);
    -        } else if (readable.push(yield value)) {
    -          next();
    -        } else {
    -          reading = false;
    -        }
    -      } catch (err) {
    -        readable.destroy(err);
    -      }
    -    });
    -    return _next2.apply(this, arguments);
    -  }
    -  return readable;
    -}
    -module.exports = from;
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/pipeline.js b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/pipeline.js
    deleted file mode 100644
    index e6f39241f98dd8..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/pipeline.js
    +++ /dev/null
    @@ -1,86 +0,0 @@
    -// Ported from https://github.com/mafintosh/pump with
    -// permission from the author, Mathias Buus (@mafintosh).
    -
    -'use strict';
    -
    -var eos;
    -function once(callback) {
    -  var called = false;
    -  return function () {
    -    if (called) return;
    -    called = true;
    -    callback.apply(void 0, arguments);
    -  };
    -}
    -var _require$codes = require('../../../errors').codes,
    -  ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS,
    -  ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED;
    -function noop(err) {
    -  // Rethrow the error if it exists to avoid swallowing it
    -  if (err) throw err;
    -}
    -function isRequest(stream) {
    -  return stream.setHeader && typeof stream.abort === 'function';
    -}
    -function destroyer(stream, reading, writing, callback) {
    -  callback = once(callback);
    -  var closed = false;
    -  stream.on('close', function () {
    -    closed = true;
    -  });
    -  if (eos === undefined) eos = require('./end-of-stream');
    -  eos(stream, {
    -    readable: reading,
    -    writable: writing
    -  }, function (err) {
    -    if (err) return callback(err);
    -    closed = true;
    -    callback();
    -  });
    -  var destroyed = false;
    -  return function (err) {
    -    if (closed) return;
    -    if (destroyed) return;
    -    destroyed = true;
    -
    -    // request.destroy just do .end - .abort is what we want
    -    if (isRequest(stream)) return stream.abort();
    -    if (typeof stream.destroy === 'function') return stream.destroy();
    -    callback(err || new ERR_STREAM_DESTROYED('pipe'));
    -  };
    -}
    -function call(fn) {
    -  fn();
    -}
    -function pipe(from, to) {
    -  return from.pipe(to);
    -}
    -function popCallback(streams) {
    -  if (!streams.length) return noop;
    -  if (typeof streams[streams.length - 1] !== 'function') return noop;
    -  return streams.pop();
    -}
    -function pipeline() {
    -  for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) {
    -    streams[_key] = arguments[_key];
    -  }
    -  var callback = popCallback(streams);
    -  if (Array.isArray(streams[0])) streams = streams[0];
    -  if (streams.length < 2) {
    -    throw new ERR_MISSING_ARGS('streams');
    -  }
    -  var error;
    -  var destroys = streams.map(function (stream, i) {
    -    var reading = i < streams.length - 1;
    -    var writing = i > 0;
    -    return destroyer(stream, reading, writing, function (err) {
    -      if (!error) error = err;
    -      if (err) destroys.forEach(call);
    -      if (reading) return;
    -      destroys.forEach(call);
    -      callback(error);
    -    });
    -  });
    -  return streams.reduce(pipe);
    -}
    -module.exports = pipeline;
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/state.js b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/state.js
    deleted file mode 100644
    index 3fbf8927e00179..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/state.js
    +++ /dev/null
    @@ -1,22 +0,0 @@
    -'use strict';
    -
    -var ERR_INVALID_OPT_VALUE = require('../../../errors').codes.ERR_INVALID_OPT_VALUE;
    -function highWaterMarkFrom(options, isDuplex, duplexKey) {
    -  return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null;
    -}
    -function getHighWaterMark(state, options, duplexKey, isDuplex) {
    -  var hwm = highWaterMarkFrom(options, isDuplex, duplexKey);
    -  if (hwm != null) {
    -    if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) {
    -      var name = isDuplex ? duplexKey : 'highWaterMark';
    -      throw new ERR_INVALID_OPT_VALUE(name, hwm);
    -    }
    -    return Math.floor(hwm);
    -  }
    -
    -  // Default value
    -  return state.objectMode ? 16 : 16 * 1024;
    -}
    -module.exports = {
    -  getHighWaterMark: getHighWaterMark
    -};
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/stream-browser.js b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/stream-browser.js
    deleted file mode 100644
    index 9332a3fdae7060..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/stream-browser.js
    +++ /dev/null
    @@ -1 +0,0 @@
    -module.exports = require('events').EventEmitter;
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/stream.js b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/stream.js
    deleted file mode 100644
    index ce2ad5b6ee57f4..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/lib/internal/streams/stream.js
    +++ /dev/null
    @@ -1 +0,0 @@
    -module.exports = require('stream');
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/package.json b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/package.json
    deleted file mode 100644
    index ade59e71aa0f17..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/package.json
    +++ /dev/null
    @@ -1,68 +0,0 @@
    -{
    -  "name": "readable-stream",
    -  "version": "3.6.2",
    -  "description": "Streams3, a user-land copy of the stream library from Node.js",
    -  "main": "readable.js",
    -  "engines": {
    -    "node": ">= 6"
    -  },
    -  "dependencies": {
    -    "inherits": "^2.0.3",
    -    "string_decoder": "^1.1.1",
    -    "util-deprecate": "^1.0.1"
    -  },
    -  "devDependencies": {
    -    "@babel/cli": "^7.2.0",
    -    "@babel/core": "^7.2.0",
    -    "@babel/polyfill": "^7.0.0",
    -    "@babel/preset-env": "^7.2.0",
    -    "airtap": "0.0.9",
    -    "assert": "^1.4.0",
    -    "bl": "^2.0.0",
    -    "deep-strict-equal": "^0.2.0",
    -    "events.once": "^2.0.2",
    -    "glob": "^7.1.2",
    -    "gunzip-maybe": "^1.4.1",
    -    "hyperquest": "^2.1.3",
    -    "lolex": "^2.6.0",
    -    "nyc": "^11.0.0",
    -    "pump": "^3.0.0",
    -    "rimraf": "^2.6.2",
    -    "tap": "^12.0.0",
    -    "tape": "^4.9.0",
    -    "tar-fs": "^1.16.2",
    -    "util-promisify": "^2.1.0"
    -  },
    -  "scripts": {
    -    "test": "tap -J --no-esm test/parallel/*.js test/ours/*.js",
    -    "ci": "TAP=1 tap --no-esm test/parallel/*.js test/ours/*.js | tee test.tap",
    -    "test-browsers": "airtap --sauce-connect --loopback airtap.local -- test/browser.js",
    -    "test-browser-local": "airtap --open --local -- test/browser.js",
    -    "cover": "nyc npm test",
    -    "report": "nyc report --reporter=lcov",
    -    "update-browser-errors": "babel -o errors-browser.js errors.js"
    -  },
    -  "repository": {
    -    "type": "git",
    -    "url": "git://github.com/nodejs/readable-stream"
    -  },
    -  "keywords": [
    -    "readable",
    -    "stream",
    -    "pipe"
    -  ],
    -  "browser": {
    -    "util": false,
    -    "worker_threads": false,
    -    "./errors": "./errors-browser.js",
    -    "./readable.js": "./readable-browser.js",
    -    "./lib/internal/streams/from.js": "./lib/internal/streams/from-browser.js",
    -    "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js"
    -  },
    -  "nyc": {
    -    "include": [
    -      "lib/**.js"
    -    ]
    -  },
    -  "license": "MIT"
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/readable-browser.js b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/readable-browser.js
    deleted file mode 100644
    index adbf60de832f9d..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/readable-browser.js
    +++ /dev/null
    @@ -1,9 +0,0 @@
    -exports = module.exports = require('./lib/_stream_readable.js');
    -exports.Stream = exports;
    -exports.Readable = exports;
    -exports.Writable = require('./lib/_stream_writable.js');
    -exports.Duplex = require('./lib/_stream_duplex.js');
    -exports.Transform = require('./lib/_stream_transform.js');
    -exports.PassThrough = require('./lib/_stream_passthrough.js');
    -exports.finished = require('./lib/internal/streams/end-of-stream.js');
    -exports.pipeline = require('./lib/internal/streams/pipeline.js');
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/readable.js b/deps/npm/node_modules/node-gyp/node_modules/readable-stream/readable.js
    deleted file mode 100644
    index 9e0ca120ded827..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/readable-stream/readable.js
    +++ /dev/null
    @@ -1,16 +0,0 @@
    -var Stream = require('stream');
    -if (process.env.READABLE_STREAM === 'disable' && Stream) {
    -  module.exports = Stream.Readable;
    -  Object.assign(module.exports, Stream);
    -  module.exports.Stream = Stream;
    -} else {
    -  exports = module.exports = require('./lib/_stream_readable.js');
    -  exports.Stream = Stream || exports;
    -  exports.Readable = exports;
    -  exports.Writable = require('./lib/_stream_writable.js');
    -  exports.Duplex = require('./lib/_stream_duplex.js');
    -  exports.Transform = require('./lib/_stream_transform.js');
    -  exports.PassThrough = require('./lib/_stream_passthrough.js');
    -  exports.finished = require('./lib/internal/streams/end-of-stream.js');
    -  exports.pipeline = require('./lib/internal/streams/pipeline.js');
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/signal-exit/LICENSE.txt b/deps/npm/node_modules/node-gyp/node_modules/signal-exit/LICENSE.txt
    deleted file mode 100644
    index eead04a12162dc..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/signal-exit/LICENSE.txt
    +++ /dev/null
    @@ -1,16 +0,0 @@
    -The ISC License
    -
    -Copyright (c) 2015, Contributors
    -
    -Permission to use, copy, modify, and/or distribute this software
    -for any purpose with or without fee is hereby granted, provided
    -that the above copyright notice and this permission notice
    -appear in all copies.
    -
    -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
    -OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE
    -LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
    -OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
    -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
    -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/signal-exit/index.js b/deps/npm/node_modules/node-gyp/node_modules/signal-exit/index.js
    deleted file mode 100644
    index 93703f369265c6..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/signal-exit/index.js
    +++ /dev/null
    @@ -1,202 +0,0 @@
    -// Note: since nyc uses this module to output coverage, any lines
    -// that are in the direct sync flow of nyc's outputCoverage are
    -// ignored, since we can never get coverage for them.
    -// grab a reference to node's real process object right away
    -var process = global.process
    -
    -const processOk = function (process) {
    -  return process &&
    -    typeof process === 'object' &&
    -    typeof process.removeListener === 'function' &&
    -    typeof process.emit === 'function' &&
    -    typeof process.reallyExit === 'function' &&
    -    typeof process.listeners === 'function' &&
    -    typeof process.kill === 'function' &&
    -    typeof process.pid === 'number' &&
    -    typeof process.on === 'function'
    -}
    -
    -// some kind of non-node environment, just no-op
    -/* istanbul ignore if */
    -if (!processOk(process)) {
    -  module.exports = function () {
    -    return function () {}
    -  }
    -} else {
    -  var assert = require('assert')
    -  var signals = require('./signals.js')
    -  var isWin = /^win/i.test(process.platform)
    -
    -  var EE = require('events')
    -  /* istanbul ignore if */
    -  if (typeof EE !== 'function') {
    -    EE = EE.EventEmitter
    -  }
    -
    -  var emitter
    -  if (process.__signal_exit_emitter__) {
    -    emitter = process.__signal_exit_emitter__
    -  } else {
    -    emitter = process.__signal_exit_emitter__ = new EE()
    -    emitter.count = 0
    -    emitter.emitted = {}
    -  }
    -
    -  // Because this emitter is a global, we have to check to see if a
    -  // previous version of this library failed to enable infinite listeners.
    -  // I know what you're about to say.  But literally everything about
    -  // signal-exit is a compromise with evil.  Get used to it.
    -  if (!emitter.infinite) {
    -    emitter.setMaxListeners(Infinity)
    -    emitter.infinite = true
    -  }
    -
    -  module.exports = function (cb, opts) {
    -    /* istanbul ignore if */
    -    if (!processOk(global.process)) {
    -      return function () {}
    -    }
    -    assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler')
    -
    -    if (loaded === false) {
    -      load()
    -    }
    -
    -    var ev = 'exit'
    -    if (opts && opts.alwaysLast) {
    -      ev = 'afterexit'
    -    }
    -
    -    var remove = function () {
    -      emitter.removeListener(ev, cb)
    -      if (emitter.listeners('exit').length === 0 &&
    -          emitter.listeners('afterexit').length === 0) {
    -        unload()
    -      }
    -    }
    -    emitter.on(ev, cb)
    -
    -    return remove
    -  }
    -
    -  var unload = function unload () {
    -    if (!loaded || !processOk(global.process)) {
    -      return
    -    }
    -    loaded = false
    -
    -    signals.forEach(function (sig) {
    -      try {
    -        process.removeListener(sig, sigListeners[sig])
    -      } catch (er) {}
    -    })
    -    process.emit = originalProcessEmit
    -    process.reallyExit = originalProcessReallyExit
    -    emitter.count -= 1
    -  }
    -  module.exports.unload = unload
    -
    -  var emit = function emit (event, code, signal) {
    -    /* istanbul ignore if */
    -    if (emitter.emitted[event]) {
    -      return
    -    }
    -    emitter.emitted[event] = true
    -    emitter.emit(event, code, signal)
    -  }
    -
    -  // { : , ... }
    -  var sigListeners = {}
    -  signals.forEach(function (sig) {
    -    sigListeners[sig] = function listener () {
    -      /* istanbul ignore if */
    -      if (!processOk(global.process)) {
    -        return
    -      }
    -      // If there are no other listeners, an exit is coming!
    -      // Simplest way: remove us and then re-send the signal.
    -      // We know that this will kill the process, so we can
    -      // safely emit now.
    -      var listeners = process.listeners(sig)
    -      if (listeners.length === emitter.count) {
    -        unload()
    -        emit('exit', null, sig)
    -        /* istanbul ignore next */
    -        emit('afterexit', null, sig)
    -        /* istanbul ignore next */
    -        if (isWin && sig === 'SIGHUP') {
    -          // "SIGHUP" throws an `ENOSYS` error on Windows,
    -          // so use a supported signal instead
    -          sig = 'SIGINT'
    -        }
    -        /* istanbul ignore next */
    -        process.kill(process.pid, sig)
    -      }
    -    }
    -  })
    -
    -  module.exports.signals = function () {
    -    return signals
    -  }
    -
    -  var loaded = false
    -
    -  var load = function load () {
    -    if (loaded || !processOk(global.process)) {
    -      return
    -    }
    -    loaded = true
    -
    -    // This is the number of onSignalExit's that are in play.
    -    // It's important so that we can count the correct number of
    -    // listeners on signals, and don't wait for the other one to
    -    // handle it instead of us.
    -    emitter.count += 1
    -
    -    signals = signals.filter(function (sig) {
    -      try {
    -        process.on(sig, sigListeners[sig])
    -        return true
    -      } catch (er) {
    -        return false
    -      }
    -    })
    -
    -    process.emit = processEmit
    -    process.reallyExit = processReallyExit
    -  }
    -  module.exports.load = load
    -
    -  var originalProcessReallyExit = process.reallyExit
    -  var processReallyExit = function processReallyExit (code) {
    -    /* istanbul ignore if */
    -    if (!processOk(global.process)) {
    -      return
    -    }
    -    process.exitCode = code || /* istanbul ignore next */ 0
    -    emit('exit', process.exitCode, null)
    -    /* istanbul ignore next */
    -    emit('afterexit', process.exitCode, null)
    -    /* istanbul ignore next */
    -    originalProcessReallyExit.call(process, process.exitCode)
    -  }
    -
    -  var originalProcessEmit = process.emit
    -  var processEmit = function processEmit (ev, arg) {
    -    if (ev === 'exit' && processOk(global.process)) {
    -      /* istanbul ignore else */
    -      if (arg !== undefined) {
    -        process.exitCode = arg
    -      }
    -      var ret = originalProcessEmit.apply(this, arguments)
    -      /* istanbul ignore next */
    -      emit('exit', process.exitCode, null)
    -      /* istanbul ignore next */
    -      emit('afterexit', process.exitCode, null)
    -      /* istanbul ignore next */
    -      return ret
    -    } else {
    -      return originalProcessEmit.apply(this, arguments)
    -    }
    -  }
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/signal-exit/package.json b/deps/npm/node_modules/node-gyp/node_modules/signal-exit/package.json
    deleted file mode 100644
    index e1a00311f9fbe5..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/signal-exit/package.json
    +++ /dev/null
    @@ -1,38 +0,0 @@
    -{
    -  "name": "signal-exit",
    -  "version": "3.0.7",
    -  "description": "when you want to fire an event no matter how a process exits.",
    -  "main": "index.js",
    -  "scripts": {
    -    "test": "tap",
    -    "snap": "tap",
    -    "preversion": "npm test",
    -    "postversion": "npm publish",
    -    "prepublishOnly": "git push origin --follow-tags"
    -  },
    -  "files": [
    -    "index.js",
    -    "signals.js"
    -  ],
    -  "repository": {
    -    "type": "git",
    -    "url": "https://github.com/tapjs/signal-exit.git"
    -  },
    -  "keywords": [
    -    "signal",
    -    "exit"
    -  ],
    -  "author": "Ben Coe ",
    -  "license": "ISC",
    -  "bugs": {
    -    "url": "https://github.com/tapjs/signal-exit/issues"
    -  },
    -  "homepage": "https://github.com/tapjs/signal-exit",
    -  "devDependencies": {
    -    "chai": "^3.5.0",
    -    "coveralls": "^3.1.1",
    -    "nyc": "^15.1.0",
    -    "standard-version": "^9.3.1",
    -    "tap": "^15.1.1"
    -  }
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/signal-exit/signals.js b/deps/npm/node_modules/node-gyp/node_modules/signal-exit/signals.js
    deleted file mode 100644
    index 3bd67a8a554e30..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/signal-exit/signals.js
    +++ /dev/null
    @@ -1,53 +0,0 @@
    -// This is not the set of all possible signals.
    -//
    -// It IS, however, the set of all signals that trigger
    -// an exit on either Linux or BSD systems.  Linux is a
    -// superset of the signal names supported on BSD, and
    -// the unknown signals just fail to register, so we can
    -// catch that easily enough.
    -//
    -// Don't bother with SIGKILL.  It's uncatchable, which
    -// means that we can't fire any callbacks anyway.
    -//
    -// If a user does happen to register a handler on a non-
    -// fatal signal like SIGWINCH or something, and then
    -// exit, it'll end up firing `process.emit('exit')`, so
    -// the handler will be fired anyway.
    -//
    -// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised
    -// artificially, inherently leave the process in a
    -// state from which it is not safe to try and enter JS
    -// listeners.
    -module.exports = [
    -  'SIGABRT',
    -  'SIGALRM',
    -  'SIGHUP',
    -  'SIGINT',
    -  'SIGTERM'
    -]
    -
    -if (process.platform !== 'win32') {
    -  module.exports.push(
    -    'SIGVTALRM',
    -    'SIGXCPU',
    -    'SIGXFSZ',
    -    'SIGUSR2',
    -    'SIGTRAP',
    -    'SIGSYS',
    -    'SIGQUIT',
    -    'SIGIOT'
    -    // should detect profiler and enable/disable accordingly.
    -    // see #21
    -    // 'SIGPROF'
    -  )
    -}
    -
    -if (process.platform === 'linux') {
    -  module.exports.push(
    -    'SIGIO',
    -    'SIGPOLL',
    -    'SIGPWR',
    -    'SIGSTKFLT',
    -    'SIGUNUSED'
    -  )
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/which/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/which/LICENSE
    deleted file mode 100644
    index 19129e315fe593..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/which/LICENSE
    +++ /dev/null
    @@ -1,15 +0,0 @@
    -The ISC License
    -
    -Copyright (c) Isaac Z. Schlueter and Contributors
    -
    -Permission to use, copy, modify, and/or distribute this software for any
    -purpose with or without fee is hereby granted, provided that the above
    -copyright notice and this permission notice appear in all copies.
    -
    -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
    -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/which/README.md b/deps/npm/node_modules/node-gyp/node_modules/which/README.md
    deleted file mode 100644
    index cd833509f3bcc9..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/which/README.md
    +++ /dev/null
    @@ -1,54 +0,0 @@
    -# which
    -
    -Like the unix `which` utility.
    -
    -Finds the first instance of a specified executable in the PATH
    -environment variable.  Does not cache the results, so `hash -r` is not
    -needed when the PATH changes.
    -
    -## USAGE
    -
    -```javascript
    -var which = require('which')
    -
    -// async usage
    -which('node', function (er, resolvedPath) {
    -  // er is returned if no "node" is found on the PATH
    -  // if it is found, then the absolute path to the exec is returned
    -})
    -
    -// or promise
    -which('node').then(resolvedPath => { ... }).catch(er => { ... not found ... })
    -
    -// sync usage
    -// throws if not found
    -var resolved = which.sync('node')
    -
    -// if nothrow option is used, returns null if not found
    -resolved = which.sync('node', {nothrow: true})
    -
    -// Pass options to override the PATH and PATHEXT environment vars.
    -which('node', { path: someOtherPath }, function (er, resolved) {
    -  if (er)
    -    throw er
    -  console.log('found at %j', resolved)
    -})
    -```
    -
    -## CLI USAGE
    -
    -Same as the BSD `which(1)` binary.
    -
    -```
    -usage: which [-as] program ...
    -```
    -
    -## OPTIONS
    -
    -You may pass an options object as the second argument.
    -
    -- `path`: Use instead of the `PATH` environment variable.
    -- `pathExt`: Use instead of the `PATHEXT` environment variable.
    -- `all`: Return all matches, instead of just the first one.  Note that
    -  this means the function returns an array of strings instead of a
    -  single string.
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/which/bin/node-which b/deps/npm/node_modules/node-gyp/node_modules/which/bin/node-which
    deleted file mode 100755
    index 7cee3729eebdd0..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/which/bin/node-which
    +++ /dev/null
    @@ -1,52 +0,0 @@
    -#!/usr/bin/env node
    -var which = require("../")
    -if (process.argv.length < 3)
    -  usage()
    -
    -function usage () {
    -  console.error('usage: which [-as] program ...')
    -  process.exit(1)
    -}
    -
    -var all = false
    -var silent = false
    -var dashdash = false
    -var args = process.argv.slice(2).filter(function (arg) {
    -  if (dashdash || !/^-/.test(arg))
    -    return true
    -
    -  if (arg === '--') {
    -    dashdash = true
    -    return false
    -  }
    -
    -  var flags = arg.substr(1).split('')
    -  for (var f = 0; f < flags.length; f++) {
    -    var flag = flags[f]
    -    switch (flag) {
    -      case 's':
    -        silent = true
    -        break
    -      case 'a':
    -        all = true
    -        break
    -      default:
    -        console.error('which: illegal option -- ' + flag)
    -        usage()
    -    }
    -  }
    -  return false
    -})
    -
    -process.exit(args.reduce(function (pv, current) {
    -  try {
    -    var f = which.sync(current, { all: all })
    -    if (all)
    -      f = f.join('\n')
    -    if (!silent)
    -      console.log(f)
    -    return pv;
    -  } catch (e) {
    -    return 1;
    -  }
    -}, 0))
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/which/package.json b/deps/npm/node_modules/node-gyp/node_modules/which/package.json
    deleted file mode 100644
    index 97ad7fbabc52b5..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/which/package.json
    +++ /dev/null
    @@ -1,43 +0,0 @@
    -{
    -  "author": "Isaac Z. Schlueter  (http://blog.izs.me)",
    -  "name": "which",
    -  "description": "Like which(1) unix command. Find the first instance of an executable in the PATH.",
    -  "version": "2.0.2",
    -  "repository": {
    -    "type": "git",
    -    "url": "git://github.com/isaacs/node-which.git"
    -  },
    -  "main": "which.js",
    -  "bin": {
    -    "node-which": "./bin/node-which"
    -  },
    -  "license": "ISC",
    -  "dependencies": {
    -    "isexe": "^2.0.0"
    -  },
    -  "devDependencies": {
    -    "mkdirp": "^0.5.0",
    -    "rimraf": "^2.6.2",
    -    "tap": "^14.6.9"
    -  },
    -  "scripts": {
    -    "test": "tap",
    -    "preversion": "npm test",
    -    "postversion": "npm publish",
    -    "prepublish": "npm run changelog",
    -    "prechangelog": "bash gen-changelog.sh",
    -    "changelog": "git add CHANGELOG.md",
    -    "postchangelog": "git commit -m 'update changelog - '${npm_package_version}",
    -    "postpublish": "git push origin --follow-tags"
    -  },
    -  "files": [
    -    "which.js",
    -    "bin/node-which"
    -  ],
    -  "tap": {
    -    "check-coverage": true
    -  },
    -  "engines": {
    -    "node": ">= 8"
    -  }
    -}
    diff --git a/deps/npm/node_modules/node-gyp/node_modules/which/which.js b/deps/npm/node_modules/node-gyp/node_modules/which/which.js
    deleted file mode 100644
    index 82afffd2143749..00000000000000
    --- a/deps/npm/node_modules/node-gyp/node_modules/which/which.js
    +++ /dev/null
    @@ -1,125 +0,0 @@
    -const isWindows = process.platform === 'win32' ||
    -    process.env.OSTYPE === 'cygwin' ||
    -    process.env.OSTYPE === 'msys'
    -
    -const path = require('path')
    -const COLON = isWindows ? ';' : ':'
    -const isexe = require('isexe')
    -
    -const getNotFoundError = (cmd) =>
    -  Object.assign(new Error(`not found: ${cmd}`), { code: 'ENOENT' })
    -
    -const getPathInfo = (cmd, opt) => {
    -  const colon = opt.colon || COLON
    -
    -  // If it has a slash, then we don't bother searching the pathenv.
    -  // just check the file itself, and that's it.
    -  const pathEnv = cmd.match(/\//) || isWindows && cmd.match(/\\/) ? ['']
    -    : (
    -      [
    -        // windows always checks the cwd first
    -        ...(isWindows ? [process.cwd()] : []),
    -        ...(opt.path || process.env.PATH ||
    -          /* istanbul ignore next: very unusual */ '').split(colon),
    -      ]
    -    )
    -  const pathExtExe = isWindows
    -    ? opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM'
    -    : ''
    -  const pathExt = isWindows ? pathExtExe.split(colon) : ['']
    -
    -  if (isWindows) {
    -    if (cmd.indexOf('.') !== -1 && pathExt[0] !== '')
    -      pathExt.unshift('')
    -  }
    -
    -  return {
    -    pathEnv,
    -    pathExt,
    -    pathExtExe,
    -  }
    -}
    -
    -const which = (cmd, opt, cb) => {
    -  if (typeof opt === 'function') {
    -    cb = opt
    -    opt = {}
    -  }
    -  if (!opt)
    -    opt = {}
    -
    -  const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt)
    -  const found = []
    -
    -  const step = i => new Promise((resolve, reject) => {
    -    if (i === pathEnv.length)
    -      return opt.all && found.length ? resolve(found)
    -        : reject(getNotFoundError(cmd))
    -
    -    const ppRaw = pathEnv[i]
    -    const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw
    -
    -    const pCmd = path.join(pathPart, cmd)
    -    const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd
    -      : pCmd
    -
    -    resolve(subStep(p, i, 0))
    -  })
    -
    -  const subStep = (p, i, ii) => new Promise((resolve, reject) => {
    -    if (ii === pathExt.length)
    -      return resolve(step(i + 1))
    -    const ext = pathExt[ii]
    -    isexe(p + ext, { pathExt: pathExtExe }, (er, is) => {
    -      if (!er && is) {
    -        if (opt.all)
    -          found.push(p + ext)
    -        else
    -          return resolve(p + ext)
    -      }
    -      return resolve(subStep(p, i, ii + 1))
    -    })
    -  })
    -
    -  return cb ? step(0).then(res => cb(null, res), cb) : step(0)
    -}
    -
    -const whichSync = (cmd, opt) => {
    -  opt = opt || {}
    -
    -  const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt)
    -  const found = []
    -
    -  for (let i = 0; i < pathEnv.length; i ++) {
    -    const ppRaw = pathEnv[i]
    -    const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw
    -
    -    const pCmd = path.join(pathPart, cmd)
    -    const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd
    -      : pCmd
    -
    -    for (let j = 0; j < pathExt.length; j ++) {
    -      const cur = p + pathExt[j]
    -      try {
    -        const is = isexe.sync(cur, { pathExt: pathExtExe })
    -        if (is) {
    -          if (opt.all)
    -            found.push(cur)
    -          else
    -            return cur
    -        }
    -      } catch (ex) {}
    -    }
    -  }
    -
    -  if (opt.all && found.length)
    -    return found
    -
    -  if (opt.nothrow)
    -    return null
    -
    -  throw getNotFoundError(cmd)
    -}
    -
    -module.exports = which
    -which.sync = whichSync
    diff --git a/deps/npm/node_modules/node-gyp/package.json b/deps/npm/node_modules/node-gyp/package.json
    index 7e9fb648ab0825..80c63f2e72c3d9 100644
    --- a/deps/npm/node_modules/node-gyp/package.json
    +++ b/deps/npm/node_modules/node-gyp/package.json
    @@ -11,7 +11,7 @@
         "bindings",
         "gyp"
       ],
    -  "version": "9.4.0",
    +  "version": "10.0.1",
       "installVersion": 11,
       "author": "Nathan Rajlich  (http://tootallnate.net)",
       "repository": {
    @@ -24,28 +24,28 @@
       "dependencies": {
         "env-paths": "^2.2.0",
         "exponential-backoff": "^3.1.1",
    -    "glob": "^7.1.4",
    +    "glob": "^10.3.10",
         "graceful-fs": "^4.2.6",
    -    "make-fetch-happen": "^11.0.3",
    -    "nopt": "^6.0.0",
    -    "npmlog": "^6.0.0",
    -    "rimraf": "^3.0.2",
    +    "make-fetch-happen": "^13.0.0",
    +    "nopt": "^7.0.0",
    +    "proc-log": "^3.0.0",
         "semver": "^7.3.5",
         "tar": "^6.1.2",
    -    "which": "^2.0.2"
    +    "which": "^4.0.0"
       },
       "engines": {
    -    "node": "^12.13 || ^14.13 || >=16"
    +    "node": "^16.14.0 || >=18.0.0"
       },
       "devDependencies": {
         "bindings": "^1.5.0",
    +    "cross-env": "^7.0.3",
         "mocha": "^10.2.0",
         "nan": "^2.14.2",
         "require-inject": "^1.4.4",
    -    "standard": "^14.3.4"
    +    "standard": "^17.0.0"
       },
       "scripts": {
    -    "lint": "standard */*.js test/**/*.js",
    -    "test": "npm run lint && mocha --reporter=test/reporter.js test/test-download.js test/test-*"
    +    "lint": "standard \"*/*.js\" \"test/**/*.js\" \".github/**/*.js\"",
    +    "test": "cross-env NODE_GYP_NULL_LOGGER=true mocha --timeout 15000 test/test-download.js test/test-*"
       }
     }
    diff --git a/deps/npm/node_modules/node-gyp/test/common.js b/deps/npm/node_modules/node-gyp/test/common.js
    deleted file mode 100644
    index b714ee29029d36..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/common.js
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -const envPaths = require('env-paths')
    -
    -module.exports.devDir = () => envPaths('node-gyp', { suffix: '' }).cache
    diff --git a/deps/npm/node_modules/node-gyp/test/fixtures/VS_2017_BuildTools_minimal.txt b/deps/npm/node_modules/node-gyp/test/fixtures/VS_2017_BuildTools_minimal.txt
    deleted file mode 100644
    index 244f6b07982409..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/fixtures/VS_2017_BuildTools_minimal.txt
    +++ /dev/null
    @@ -1 +0,0 @@
    -[{"path":"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\BuildTools","version":"15.9.28307.665","packages":["Microsoft.VisualStudio.Product.BuildTools","Microsoft.VisualStudio.Component.VC.CoreIde","Microsoft.VisualStudio.VC.Ide.Pro","Microsoft.VisualStudio.VC.Ide.Pro.Resources","Microsoft.VisualStudio.VC.Templates.Pro","Microsoft.VisualStudio.VC.Templates.Pro.Resources","Microsoft.VisualStudio.VC.Items.Pro","Microsoft.VisualStudio.PackageGroup.VC.CoreIDE.Reduced","Microsoft.VisualStudio.VC.Ide.MDD","Microsoft.VisualStudio.VC.Ide.x64","Microsoft.VisualStudio.PackageGroup.VC.CoreIDE.Express","Microsoft.VisualStudio.PackageGroup.Debugger.Script","Microsoft.VisualStudio.JavaScript.LanguageService","Microsoft.VisualStudio.JavaScript.LanguageService.Resources","Microsoft.VisualStudio.Debugger.Script.Msi","Microsoft.VisualStudio.Debugger.Script","Microsoft.VisualStudio.Debugger.Script","Microsoft.VisualStudio.Debugger.Script.Resources","Microsoft.VisualStudio.Debugger.Script.Resources","Microsoft.VisualStudio.VC.Ide.WinXPlus","Microsoft.VisualStudio.VC.Ide.Dskx","Microsoft.VisualStudio.VC.Ide.Dskx.Resources","Microsoft.VisualStudio.VC.Ide.Core","Microsoft.VisualStudio.VC.Ide.Core.Resources","Microsoft.VisualStudio.VC.Ide.Base","Microsoft.VisualStudio.VC.Ide.LanguageService","Microsoft.VisualStudio.VC.Ide.ResourceEditor","Microsoft.VisualStudio.VC.Ide.ResourceEditor.Resources","Microsoft.VisualStudio.VC.Ide.ProjectSystem","Microsoft.VisualStudio.VC.Ide.ProjectSystem.Resources","Microsoft.VisualStudio.VC.Ide.Core.VCProjectEngine","Microsoft.VisualStudio.VC.Ide.Core.VCProjectEngine.Resources","Microsoft.VisualStudio.VC.Ide.LanguageService.Resources","Microsoft.VisualStudio.VC.Ide.Base.Resources","Microsoft.VisualStudio.PackageGroup.Core","Microsoft.VisualStudio.TestTools.TeamFoundationClient","Microsoft.VisualStudio.PackageGroup.Debugger.Core","Microsoft.VisualStudio.Debugger.VSCodeDebuggerHost","Microsoft.VisualStudio.VC.Ide.Debugger","Microsoft.VisualStudio.VC.Ide.Debugger.Resources","Microsoft.VisualStudio.VC.Ide.Common","Microsoft.VisualStudio.VC.Ide.Common.Resources","Microsoft.VisualStudio.Debugger.Parallel","Microsoft.VisualStudio.Debugger.Parallel.Resources","Microsoft.VisualStudio.Debugger.CollectionAgents","Microsoft.VisualStudio.Debugger.Managed","Microsoft.CodeAnalysis.VisualStudio.Setup.Resources","Microsoft.CodeAnalysis.VisualStudio.Setup","Microsoft.CodeAnalysis.ExpressionEvaluator.Resources","Microsoft.CodeAnalysis.ExpressionEvaluator","Microsoft.VisualStudio.Debugger.Managed.Resources","Microsoft.VisualStudio.Debugger.Remote","Microsoft.VisualStudio.Debugger.Remote","Microsoft.VisualStudio.Debugger.Remote.Resources","Microsoft.VisualStudio.Debugger.Remote.Resources","Microsoft.VisualStudio.Debugger","Microsoft.VisualStudio.VC.MSVCDis","Microsoft.VisualStudio.ScriptedHost","Microsoft.VisualStudio.ScriptedHost.Targeted","Microsoft.VisualStudio.ScriptedHost.Resources","Microsoft.IntelliTrace.DiagnosticsHub","Microsoft.VisualStudio.Debugger.Resources","Microsoft.PackageGroup.ClientDiagnostics","Microsoft.VisualStudio.AppResponsiveness","Microsoft.VisualStudio.AppResponsiveness.Targeted","Microsoft.VisualStudio.AppResponsiveness.Resources","Microsoft.VisualStudio.ClientDiagnostics","Microsoft.VisualStudio.ClientDiagnostics.Targeted","Microsoft.VisualStudio.ClientDiagnostics.Resources","Microsoft.VisualStudio.PackageGroup.CommunityCore","Microsoft.VisualStudio.ProjectSystem.Full","Microsoft.VisualStudio.ProjectSystem","Microsoft.VisualStudio.Community.x86","Microsoft.VisualStudio.Community.x64","Microsoft.VisualStudio.Community","Microsoft.IntelliTrace.CollectorCab","Microsoft.VisualStudio.Community.Resources","Microsoft.VisualStudio.WebSiteProject.DTE","Microsoft.MSHtml","Microsoft.VisualStudio.Community.Msi.Resources","Microsoft.VisualStudio.Community.Msi","Microsoft.VisualStudio.MinShell.Interop.Msi","Microsoft.VisualStudio.PackageGroup.CoreEditor","PortableFacades","Microsoft.VisualStudio.VirtualTree","Microsoft.VisualStudio.PackageGroup.Progression","Microsoft.VisualStudio.PerformanceProvider","Microsoft.VisualStudio.GraphModel","Microsoft.VisualStudio.GraphProvider","Microsoft.DiaSymReader","Microsoft.VisualStudio.TextMateGrammars","Microsoft.VisualStudio.PackageGroup.TeamExplorer","Microsoft.TeamFoundation.OfficeIntegration","Microsoft.TeamFoundation.OfficeIntegration.Resources","Microsoft.VisualStudio.TeamExplorer","Microsoft.ServiceHub","Microsoft.VisualStudio.ProjectServices","Microsoft.VisualStudio.SLNX.VSIX","Microsoft.VisualStudio.FileHandler.Msi","Microsoft.VisualStudio.FileHandler.Msi","Microsoft.VisualStudio.PackageGroup.MinShell","Microsoft.VisualStudio.MinShell.Msi","Microsoft.VisualStudio.MinShell.Msi.Resources","Microsoft.VisualStudio.MinShell.Interop","Microsoft.VisualStudio.Log","Microsoft.VisualStudio.Log.Targeted","Microsoft.VisualStudio.Log.Resources","Microsoft.VisualStudio.Finalizer","Microsoft.VisualStudio.CoreEditor","Microsoft.VisualStudio.Connected","Microsoft.VisualStudio.Connected.Resources","Microsoft.VisualStudio.MinShell","Microsoft.VisualStudio.MinShell.Platform","Microsoft.VisualStudio.MinShell.Platform.Resources","Microsoft.VisualStudio.MefHosting","Microsoft.VisualStudio.MefHosting.Resources","Microsoft.VisualStudio.Initializer","Microsoft.VisualStudio.ExtensionManager","Microsoft.VisualStudio.Editors","Microsoft.Net.4.TargetingPack","Microsoft.VisualStudio.Component.Windows10SDK.17134","Win10SDK_10.0.17134","Microsoft.VisualStudio.Component.VC.Tools.x86.x64","Microsoft.VisualCpp.CodeAnalysis.Extensions","Microsoft.VisualCpp.CodeAnalysis.Extensions.X86","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X86","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X86.Resources","Microsoft.VisualCpp.CodeAnalysis.Extensions.X64","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X64","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X64.Resources","Microsoft.VisualStudio.Component.Static.Analysis.Tools","Microsoft.VisualStudio.StaticAnalysis","Microsoft.VisualStudio.StaticAnalysis.Resources","Microsoft.VisualCpp.Tools.HostX64.TargetX86","Microsoft.VisualCpp.VCTip.HostX64.TargetX86","Microsoft.VisualCpp.Tools.HostX64.TargetX86.Resources","Microsoft.VisualCpp.Tools.HostX64.TargetX64","Microsoft.VisualCpp.VCTip.HostX64.TargetX64","Microsoft.VisualCpp.Tools.HostX64.TargetX64.Resources","Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX64","Microsoft.VisualCpp.Premium.Tools.Hostx86.Targetx64.Resources","Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX86","Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX86.Resources","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX86","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX86.Resources","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX64","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX64.Resources","Microsoft.VisualCpp.PGO.X86","Microsoft.VisualCpp.PGO.X64","Microsoft.VisualCpp.PGO.Headers","Microsoft.VisualCpp.CRT.x86.Store","Microsoft.VisualCpp.CRT.x86.OneCore.Desktop","Microsoft.VisualCpp.CRT.x64.Store","Microsoft.VisualCpp.CRT.x64.OneCore.Desktop","Microsoft.VisualCpp.CRT.Redist.x86.OneCore.Desktop","Microsoft.VisualCpp.CRT.Redist.x64.OneCore.Desktop","Microsoft.VisualCpp.CRT.ClickOnce.Msi","Microsoft.VisualStudio.PackageGroup.VC.Tools.x86","Microsoft.VisualCpp.Tools.HostX86.TargetX64","Microsoft.VisualCpp.VCTip.hostX86.targetX64","Microsoft.VisualCpp.Tools.Hostx86.Targetx64.Resources","Microsoft.VisualCpp.Tools.HostX86.TargetX86","Microsoft.VisualCpp.VCTip.hostX86.targetX86","Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources","Microsoft.VisualCpp.Tools.Core.Resources","Microsoft.VisualCpp.Tools.Core.x86","Microsoft.VisualCpp.Tools.Common.Utils","Microsoft.VisualCpp.Tools.Common.Utils.Resources","Microsoft.VisualCpp.DIA.SDK","Microsoft.VisualCpp.CRT.x86.Desktop","Microsoft.VisualCpp.CRT.x64.Desktop","Microsoft.VisualCpp.CRT.Source","Microsoft.VisualCpp.CRT.Redist.X86","Microsoft.VisualCpp.CRT.Redist.X64","Microsoft.VisualCpp.CRT.Redist.Resources","Microsoft.VisualCpp.RuntimeDebug.14","Microsoft.VisualCpp.RuntimeDebug.14","Microsoft.VisualCpp.Redist.14","Microsoft.VisualCpp.Redist.14","Microsoft.VisualCpp.CRT.Headers","Microsoft.VisualStudio.VC.MSBuild.X86","Microsoft.VisualStudio.VC.MSBuild.X64","Microsoft.VS.VC.MSBuild.X64.Resources","Microsoft.VisualStudio.VC.MSBuild.Base","Microsoft.VisualStudio.VC.MSBuild.Base.Resources","Microsoft.VisualStudio.VC.MSBuild.ARM","Microsoft.VisualStudio.Workload.MSBuildTools","Microsoft.VisualStudio.Component.CoreBuildTools","Microsoft.VisualStudio.Setup.Configuration","Microsoft.VisualStudio.PackageGroup.VsDevCmd","Microsoft.VisualStudio.VsDevCmd.Ext.NetFxSdk","Microsoft.VisualStudio.VsDevCmd.Core.WinSdk","Microsoft.VisualStudio.VsDevCmd.Core.DotNet","Microsoft.VisualStudio.VC.DevCmd","Microsoft.VisualStudio.VC.DevCmd.Resources","Microsoft.VisualStudio.BuildTools.Resources","Microsoft.VisualStudio.Net.Eula.Resources","Microsoft.Build.Dependencies","Microsoft.Build.FileTracker.Msi","Microsoft.Component.MSBuild","Microsoft.PythonTools.BuildCore.Vsix","Microsoft.NuGet.Build.Tasks","Microsoft.VisualStudio.Component.Roslyn.Compiler","Microsoft.CodeAnalysis.Compilers.Resources","Microsoft.CodeAnalysis.Compilers","Microsoft.Net.PackageGroup.4.6.1.Redist","Microsoft.VisualStudio.NativeImageSupport","Microsoft.Build"]}]
    diff --git a/deps/npm/node_modules/node-gyp/test/fixtures/VS_2017_Community_workload.txt b/deps/npm/node_modules/node-gyp/test/fixtures/VS_2017_Community_workload.txt
    deleted file mode 100644
    index dd5e77dafb9dfe..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/fixtures/VS_2017_Community_workload.txt
    +++ /dev/null
    @@ -1 +0,0 @@
    -[{"path":"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community","version":"15.9.28307.665","packages":["Microsoft.VisualStudio.Component.Windows10SDK.IpOverUsb","Win10SDK_IpOverUsb","Microsoft.VisualStudio.Component.VC.ATL.ARM64","Microsoft.VisualCpp.ATL.ARM64","Microsoft.VisualStudio.Component.VC.ATL.ARM","Microsoft.VisualCpp.ATL.ARM","Microsoft.VisualStudio.Component.VC.Tools.ARM","Microsoft.VisualCpp.Tools.HostX64.TargetX86.Resources","Microsoft.VisualStudio.Graphics.Analyzer.Resources","Microsoft.Icecap.Analysis","Microsoft.VisualCpp.CRT.Redist.arm.OneCore.Desktop","Microsoft.VisualCpp.CRT.arm.Store","Microsoft.VisualCpp.CRT.arm.Desktop","Microsoft.VisualStudio.PackageGroup.VC.Tools.x64.ARM","Microsoft.VisualCpp.Premium.Tools.Hostx86.Targetarm","Microsoft.VisualCpp.Premium.Tools.HostX86.TargetARM.Resources","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetARM","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetARM.Resources","Microsoft.VisualCpp.Premium.Tools.ARM.Base","Microsoft.VisualCpp.Premium.Tools.ARM.Base.Resources","Microsoft.VisualCpp.PGO.ARM","Microsoft.VisualCpp.Tools.HostX64.TargetX64","Microsoft.VisualStudio.Product.Community","Microsoft.VisualCpp.Tools.Hostx86.Targetarm","Microsoft.VisualStudio.Component.VC.Tools.ARM64","Microsoft.VisualStudio.VC.MSBuild.Arm64","Microsoft.VisualCpp.CRT.Redist.ARM64.OneCore.Desktop","Microsoft.VisualCpp.VCTip.HostX64.TargetX64","Microsoft.VisualCpp.CRT.ARM64.OneCore.Desktop","Microsoft.VisualCpp.CRT.ARM64.Store","Microsoft.VisualCpp.CRT.ARM64.Desktop","Microsoft.VisualCpp.Tools.HostX64.TargetX64.Resources","Microsoft.Icecap.Analysis.Resources","Microsoft.VisualCpp.VCTip.hostX86.targetARM","Microsoft.VisualStudio.PackageGroup.VC.Tools.x64.ARM64","Microsoft.VisualCpp.Tools.Core","Microsoft.VisualCpp.PGO.ARM64","Microsoft.VisualCpp.Premium.Tools.Hostx86.Targetarm64","Microsoft.VisualCpp.Premium.Tools.HostX86.TargetARM64.Resources","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetARM64","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetARM64.Resources","Microsoft.VisualCpp.Premium.Tools.ARM64.Base","Microsoft.VisualCpp.Tools.HostX86.TargetX64","Microsoft.VisualCpp.Tools.HostX86.TargetARM.Resources","Microsoft.VisualCpp.CRT.Redist.ARM64","Microsoft.VisualCpp.CRT.arm.OneCore.Desktop","Microsoft.VisualCpp.CodeAnalysis.Extensions.X86","Microsoft.VisualCpp.CodeAnalysis.Extensions.X64","Microsoft.VisualCpp.VCTip.HostX64.TargetX86","Component.WixToolset.VisualStudioExtension.Dev15","WixToolset.VisualStudioExtension.Dev15","Microsoft.VisualCpp.MFC.X64","Microsoft.VisualCpp.ATL.Headers","Microsoft.VisualStudio.Component.VC.CMake.Project","Microsoft.VisualStudio.VC.CMake","Microsoft.VisualStudio.VC.CMake.Project","Microsoft.VisualStudio.Component.Windows10SDK.17763","Microsoft.VisualStudio.VC.MSBuild.Base.Resources","MLGen","Microsoft.VisualStudio.Graphics.Analyzer","Microsoft.VisualStudio.Component.TestTools.Core","Microsoft.VisualCpp.Tools.Core.x86","Microsoft.VisualCpp.CRT.x86.OneCore.Desktop","Microsoft.VisualCpp.DIA.SDK","Microsoft.VisualCpp.CRT.x64.OneCore.Desktop","Microsoft.VisualCpp.CRT.ClickOnce.Msi","Microsoft.VisualStudio.NuGet.Licenses","SQLCommon","Microsoft.VisualStudio.VC.MSBuild.X86","Microsoft.VisualCpp.Tools.HostX64.TargetARM","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X64","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X64.Resources","Microsoft.VisualCpp.HTMLHelpWorkshop.Msi","Microsoft.Icecap.Collection.Msi.Resources","Microsoft.VisualCpp.Tools.Hostx86.Targetx64.Resources","Microsoft.VisualCpp.VCTip.hostX64.targetARM","Microsoft.VisualStudio.VC.Ide.Dskx.Resources","Microsoft.VisualStudio.VC.Templates.UnitTest","Microsoft.VisualStudio.TestTools.TestPlatform.V1.CPP","Microsoft.VisualStudio.VC.Ide.Core","Microsoft.VisualStudio.Graphics.Appid","Microsoft.VisualCpp.ATL.Source","Microsoft.VisualStudio.VC.Ide.Core.Resources","Microsoft.VisualStudio.Debugger.ImmersiveActivateHelper.Msi","Microsoft.VisualStudio.Debugger.JustInTime","Microsoft.DiagnosticsHub.CpuSampling","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Common","Microsoft.VisualStudio.TestTools.TP.Legacy.Common.Res","Microsoft.VisualStudio.ProTools.Resources","Microsoft.VisualStudio.Community.Msi","Microsoft.VisualCpp.Tools.HostX64.TargetARM.Resources","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Agent","Microsoft.Component.MSBuild","Microsoft.VisualStudio.Graphics.Msi","Microsoft.VisualStudio.WebToolsExtensions","Microsoft.VisualCpp.Tools.Hostx86.Targetarm64","Microsoft.VisualStudio.TextTemplating.MSBuild","Microsoft.VisualCpp.VCTip.hostX86.targetARM64","Microsoft.VisualStudio.VC.Ide.Core.VCProjectEngine","Microsoft.VisualCpp.Tools.HostX86.TargetARM64.Resources","Microsoft.VisualStudio.RazorExtension","Microsoft.VisualCpp.CRT.x86.Store","Microsoft.VisualCpp.Tools.Core.Resources","Microsoft.VisualStudio.Debugger.Script","Microsoft.VisualStudio.Debugger.Script","Microsoft.VisualCpp.MFC.Source","Microsoft.VisualCpp.CRT.x86.Desktop","Microsoft.VisualStudio.VC.MSBuild.X64","Microsoft.VisualStudio.VC.Items.Pro","Microsoft.VisualStudio.Graphics.Viewers","Microsoft.VisualCpp.CRT.x64.Desktop","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X86.Resources","Microsoft.VisualCpp.MFC.Redist.X86","Microsoft.VisualStudio.WebToolsExtensions.Chip","Microsoft.DiagnosticsHub.Runtime.Resources","Microsoft.DiagnosticsHub.CpuSampling.Targeted","Microsoft.VisualStudio.VC.Ide.LanguageService.Resources","Microsoft.VisualStudio.Component.VC.DiagnosticTools","Microsoft.VisualCpp.MFC.Redist.X64","Microsoft.VisualStudio.PackageGroup.TestTools.Native","Microsoft.VisualStudio.Graphics.Viewers.Resources","Microsoft.VisualCpp.MFC.MBCS","Microsoft.VisualStudio.Debugger.Remote.Resources","Microsoft.VisualStudio.Component.TextTemplating","Win10SDK_10.0.17763","Microsoft.VisualStudio.VC.Ide.Base.Resources","Microsoft.VisualCpp.MFC.MBCS.X64","Microsoft.VisualStudio.PackageGroup.TestTools.CodeCoverage","Microsoft.VisualStudio.Graphics.EnableTools","Microsoft.VisualStudio.Graphics.Appid.Resources","Microsoft.VisualStudio.VC.MSBuild.Base","Microsoft.VisualStudio.VC.MSBuild.ARM","Microsoft.VisualCpp.MFC.Headers","Microsoft.VisualCpp.CRT.Redist.x86.OneCore.Desktop","Microsoft.VisualCpp.Tools.HostX86.TargetX86","Microsoft.VisualStudio.VC.Ide.Base","Microsoft.VisualStudio.Graphics.Analyzer.Targeted","Microsoft.VisualCpp.CRT.Headers","Microsoft.DiagnosticsHub.Runtime.Targeted","Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX86","Microsoft.VisualCpp.Tools.HostX64.TargetARM64","Microsoft.VisualCpp.VCTip.hostX64.targetARM64","Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX86.Resources","Microsoft.Icecap.Collection.Msi","Microsoft.VisualCpp.ATL.X86","Microsoft.VisualCpp.Tools.HostX64.TargetARM64.Resources","Microsoft.VisualStudio.Component.VC.ATLMFC","Microsoft.VisualCpp.VCTip.hostX86.targetX86","Microsoft.Icecap.Collection.Msi.Resources.Targeted","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX86","Microsoft.VisualStudio.Component.Graphics.Tools","Microsoft.VisualStudio.WebTools.Resources","Microsoft.VisualCpp.ATL.X64","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX86.Resources","Microsoft.VisualStudio.Component.Graphics.Win81","Microsoft.VisualStudio.VC.Ide.MDD","Microsoft.VisualStudio.VC.Ide.ResourceEditor","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX64","Microsoft.Icecap.Analysis.Resources.Targeted","Microsoft.VisualStudio.Debugger.Script.Msi","Microsoft.VisualStudio.Component.VC.CoreIde","Microsoft.VisualStudio.VC.Ide.MFC.Resources","Microsoft.VisualStudio.Debugger.Script.Resources","Microsoft.VisualStudio.PackageGroup.VC.Tools.x86","Microsoft.VisualStudio.TextTemplating.Core","Microsoft.VisualStudio.JavaScript.LanguageService","Microsoft.VisualStudio.VC.Ide.ResourceEditor.Resources","Microsoft.VisualStudio.VC.Ide.ProjectSystem.Resources","Microsoft.VisualStudio.Component.VC.TestAdapterForBoostTest","Microsoft.VisualStudio.VC.Ide.ProjectSystem","Microsoft.VisualStudio.VC.Ide.Dskx","Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources","Microsoft.CredentialProvider","Microsoft.VisualStudio.VC.Templates.Desktop","Microsoft.VisualStudio.VC.Ide.Pro.Resources","Microsoft.VisualStudio.ComponentGroup.WebToolsExtensions","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Core","Microsoft.VisualStudio.TextTemplating.Integration","Microsoft.VisualStudio.Component.NuGet","Microsoft.VisualStudio.PackageGroup.VC.CoreIDE.Reduced","Microsoft.VisualCpp.PGO.Headers","Microsoft.DiagnosticsHub.Collection","Microsoft.Icecap.Collection.Msi.Targeted","Microsoft.VisualStudio.VC.Ide.LanguageService","Microsoft.VisualStudio.WebTools.WSP.FSA","Microsoft.VisualStudio.Graphics.Msi","Microsoft.VisualCpp.CRT.Redist.X86","Microsoft.VisualStudio.Branding.Community","Microsoft.VisualStudio.VC.Ide.x64","Microsoft.VisualStudio.WebToolsExtensions.Common","Microsoft.VisualStudio.WebTools.MSBuild","Microsoft.VisualStudio.NuGet.Core","Microsoft.DiagnosticsHub.Collection.Service","Microsoft.VisualStudio.VC.Ide.Core.VCProjectEngine.Resources","Microsoft.CodeAnalysis.ExpressionEvaluator","Microsoft.VisualCpp.CRT.Redist.X64","Microsoft.VisualCpp.RuntimeDebug.14","Microsoft.VS.VC.MSBuild.X64.Resources","Microsoft.VisualCpp.CRT.Source","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Tips.Resources","Microsoft.VisualStudio.VC.Ide.WinXPlus","Microsoft.VisualCpp.RuntimeDebug.14","Microsoft.VisualCpp.Redist.14.Latest","Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX64","Microsoft.VisualCpp.CRT.Redist.Resources","Microsoft.VisualCpp.Redist.14.Latest","Microsoft.Net.4.TargetingPack","Microsoft.VisualStudio.Debugger.Script.Resources","Microsoft.VisualCpp.CRT.x64.Store","Microsoft.VisualStudio.VC.Ide.Debugger.Resources","Microsoft.DiaSymReader.Native","Microsoft.VisualCpp.Redist.14","Microsoft.VisualCpp.Redist.14","Microsoft.VisualStudio.StaticAnalysis","Microsoft.VisualStudio.TestTools.TeamFoundationClient","Microsoft.VisualStudio.TestTools.TestPlatform.V1.CLI","Microsoft.VisualStudio.VC.Ide.Common","Microsoft.VisualStudio.Community.Extra.Resources","Microsoft.VisualStudio.Component.Roslyn.LanguageServices","Microsoft.DiagnosticsHub.Collection.StopService.Install","Microsoft.VisualStudio.InteractiveWindow","Microsoft.PackageGroup.DiagnosticsHub.Platform","Microsoft.VisualStudio.StaticAnalysis.Resources","Microsoft.VisualStudio.Debugger.Remote","Microsoft.VisualStudio.VC.Ide.Common.Resources","Microsoft.VisualCpp.Tools.HostX64.TargetX86","Microsoft.VisualStudio.VC.DevCmd","Microsoft.VisualStudio.Community.Extra","Microsoft.VisualStudio.TestTools.TP.Legacy.Tips.Msi","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.TestTools","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Core.Resources","Microsoft.VisualStudio.PackageGroup.TestTools.Core","Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.V2.CLI","Microsoft.VisualStudio.Debugger.Remote","Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.V1.CLI","Microsoft.VisualStudio.Component.VC.Tools.x86.x64","Microsoft.VisualStudio.TestTools.Pex.Common","Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.Legacy","Microsoft.VisualStudio.PackageGroup.MinShell.Interop","Microsoft.CodeAnalysis.ExpressionEvaluator.Resources","Microsoft.VisualCpp.CodeAnalysis.Extensions","Microsoft.VisualStudio.PackageGroup.CoreEditor","Microsoft.VisualStudio.Component.Roslyn.Compiler","Microsoft.VisualStudio.ScriptedHost.Targeted","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Professional","Microsoft.VisualStudio.Debugger.Resources","Microsoft.VisualStudio.Debugger.Parallel","Microsoft.VisualStudio.Debugger.Parallel.Resources","Microsoft.VisualCpp.PGO.X64","Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.IDE","Microsoft.VisualStudio.GraphModel","Microsoft.VisualStudio.PackageGroup.TestTools.DataCollectors","sqlsysclrtypes","Microsoft.VisualStudio.ProTools","Component.Microsoft.VisualStudio.RazorExtension","Microsoft.VisualStudio.TestTools.TestPlatform.V2.CLI","Microsoft.Build.Dependencies","Microsoft.VisualStudio.WebTools.WSP.FSA.Resources","Microsoft.VisualStudio.Component.Static.Analysis.Tools","Microsoft.VisualStudio.VC.Ide.ATL.Resources","Microsoft.VisualStudio.VC.Templates.UnitTest.Resources","Microsoft.VisualStudio.Debugger.Managed","Microsoft.VisualStudio.Workload.NativeDesktop","Microsoft.VisualStudio.Component.VC.TestAdapterForGoogleTest","Microsoft.VisualStudio.Debugger.JustInTime.Msi","Microsoft.Net.PackageGroup.4.6.1.Redist","Microsoft.VisualStudio.Debugger.VSCodeDebuggerHost","sqlsysclrtypes","Microsoft.VisualStudio.Debugger.Managed.Resources","Microsoft.VisualStudio.TestTools.TP.Legacy.Tips.Common","Microsoft.VisualStudio.VC.Ide.Debugger","Microsoft.VisualStudio.AppResponsiveness","Microsoft.VisualStudio.Debugger.Remote.Resources","Microsoft.VisualStudio.TestTools.TestWIExtension","Microsoft.VisualStudio.VC.Ide.Pro","Microsoft.VisualStudio.PackageGroup.Debugger.Core","Microsoft.VisualStudio.PackageGroup.VC.CoreIDE.Express","Microsoft.VisualStudio.WebTools","Microsoft.VisualStudio.Component.VC.Redist.14.Latest","Microsoft.VisualStudio.VsDevCmd.Core.WinSdk","Microsoft.VisualStudio.TestTools.TestPlatform.IDE","Microsoft.VisualStudio.TextTemplating.Integration.Resources","Microsoft.VisualStudio.Debugger.CollectionAgents","Microsoft.VisualStudio.Debugger","Microsoft.VisualStudio.PackageGroup.Debugger.Script","Microsoft.VisualStudio.VC.MSVCDis","Microsoft.VisualStudio.ScriptedHost","Microsoft.VisualStudio.ClientDiagnostics.Targeted","Microsoft.VisualStudio.ScriptedHost.Resources","Microsoft.TeamFoundation.OfficeIntegration.Resources","Microsoft.IntelliTrace.DiagnosticsHub","Microsoft.VisualStudio.JavaScript.LanguageService.Resources","Microsoft.VisualStudio.VC.Ide.TestAdapterForGoogleTest","Microsoft.VisualStudio.PackageGroup.Community","Microsoft.VisualStudio.ClientDiagnostics","Microsoft.VisualStudio.Component.Windows10SDK.17134","Microsoft.VisualStudio.PackageGroup.Core","PortableFacades","Microsoft.DiaSymReader","Microsoft.DiagnosticsHub.Runtime","Microsoft.VisualStudio.Component.CoreEditor","Microsoft.VisualStudio.AppResponsiveness.Targeted","Microsoft.VisualStudio.AppResponsiveness.Resources","Microsoft.VisualStudio.Community","Microsoft.TeamFoundation.OfficeIntegration","Microsoft.VisualStudio.WebSiteProject.DTE","Microsoft.VisualStudio.ClientDiagnostics.Resources","Microsoft.VisualStudio.ProjectSystem.Full","Microsoft.VisualStudio.ProjectSystem","Microsoft.VisualCpp.Tools.Common.UtilsPrereq","Microsoft.IntelliTrace.CollectorCab","Microsoft.VisualStudio.Community.Resources","Microsoft.VisualCpp.Tools.Common.Utils","Microsoft.ServiceHub","Microsoft.VisualStudio.Editors","Microsoft.VisualStudio.TeamExplorer","Microsoft.CodeAnalysis.VisualStudio.InteractiveComponents.Resources","Microsoft.VisualStudio.MinShell.Interop.Msi","Microsoft.VisualStudio.GraphProvider","Microsoft.CodeAnalysis.VisualStudio.InteractiveComponents","Microsoft.CodeAnalysis.VisualStudio.Setup.Interactive.Resources","Microsoft.CodeAnalysis.VisualStudio.Setup.Resources","Microsoft.VisualStudio.Community.x86","Microsoft.VisualStudio.Community.x64","Microsoft.CodeAnalysis.VisualStudio.Setup","Microsoft.NuGet.Build.Tasks","Microsoft.PackageGroup.ClientDiagnostics","Microsoft.CodeAnalysis.Compilers.Resources","Microsoft.CodeAnalysis.Compilers","Microsoft.VisualCpp.Tools.Common.Utils.Resources","Microsoft.VisualStudio.Net.Eula.Resources","Microsoft.VisualStudio.PackageGroup.CommunityCore","Microsoft.Build","Microsoft.VisualStudio.VC.Ide.TestAdapterForBoostTest","Microsoft.VisualStudio.VC.Ide.ATL","Microsoft.VisualStudio.TextMateGrammars","Microsoft.VisualStudio.Workload.CoreEditor","Microsoft.VisualStudio.MinShell.Interop","Microsoft.Build.FileTracker.Msi","Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Core","Microsoft.MSHtml","Microsoft.VisualStudio.Community.Msi.Resources","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Tips","Microsoft.VisualStudio.Devenv.Msi","Microsoft.VisualStudio.Component.VC.ATL","Microsoft.VisualStudio.VC.Templates.Pro","Microsoft.VisualCpp.CRT.Redist.x64.OneCore.Desktop","Microsoft.VisualStudio.SLNX.VSIX","Microsoft.VisualStudio.CoreEditor","Win10SDK_10.0.17134","Microsoft.VisualStudio.VsDevCmd.Ext.NetFxSdk","Microsoft.VisualStudio.Component.Debugger.JustInTime","Microsoft.VisualStudio.VC.Ide.MFC","Microsoft.VisualStudio.VsDevCmd.Core.DotNet","Microsoft.VisualStudio.PackageGroup.VsDevCmd","Microsoft.VisualStudio.Finalizer","Microsoft.VisualStudio.VirtualTree","Microsoft.VisualStudio.FileHandler.Msi","Microsoft.VisualStudio.ProjectServices","Microsoft.VisualStudio.VC.DevCmd.Resources","Microsoft.VisualStudio.MinShell","Microsoft.VisualStudio.PackageGroup.Progression","Microsoft.VisualStudio.PerformanceProvider","Microsoft.VisualStudio.Connected.Resources","Microsoft.VisualStudio.Log","Microsoft.VisualStudio.PackageGroup.TeamExplorer","Microsoft.VisualStudio.Log.Targeted","Microsoft.VisualStudio.MinShell.Platform","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X86","Microsoft.VisualStudio.FileHandler.Msi","Microsoft.VisualStudio.VC.Templates.Pro.Resources","Microsoft.VisualStudio.Devenv","Microsoft.VisualCpp.VCTip.hostX86.targetX64","Microsoft.VisualStudio.Devenv.Resources","Microsoft.VisualStudio.MinShell.Platform.Resources","Microsoft.VisualStudio.Connected","Microsoft.VisualStudio.MefHosting","Microsoft.DiagnosticsHub.Collection.StopService.Uninstall","Microsoft.VisualStudio.PackageGroup.MinShell","Microsoft.VisualStudio.MefHosting.Resources","Microsoft.VisualCpp.MFC.X86","Microsoft.VisualStudio.Log.Resources","Microsoft.Icecap.Analysis.Targeted","Microsoft.VisualCpp.Premium.Tools.Hostx86.Targetx64.Resources","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX64.Resources","Microsoft.VisualCpp.PGO.X86","Microsoft.VisualStudio.ExtensionManager","Microsoft.VisualStudio.MinShell.x86","Microsoft.VisualStudio.MinShell.Msi","Microsoft.VisualStudio.Setup.Configuration","Microsoft.VisualStudio.LanguageServer","Microsoft.VisualStudio.NativeImageSupport","Microsoft.VisualStudio.MinShell.Msi.Resources","Microsoft.VisualStudio.Devenv.Config","Microsoft.VisualStudio.MinShell.Resources","Microsoft.VisualStudio.Initializer","Microsoft.Net.PackageGroup.4.6.Redist"]}]
    diff --git a/deps/npm/node_modules/node-gyp/test/fixtures/VS_2017_Express.txt b/deps/npm/node_modules/node-gyp/test/fixtures/VS_2017_Express.txt
    deleted file mode 100644
    index c4b3b5f2b01635..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/fixtures/VS_2017_Express.txt
    +++ /dev/null
    @@ -1 +0,0 @@
    -[{"path":"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\WDExpress","version":"15.9.28307.858","packages":["Microsoft.VisualStudio.Product.WDExpress","Microsoft.VisualStudio.Workload.WDExpress","Microsoft.VisualStudio.Component.Windows10SDK.17763","MLGen","Win10SDK_10.0.17763","Microsoft.VisualStudio.Component.Windows10SDK.14393","Win10SDK_10.0.14393.795","Microsoft.VisualStudio.VC.Items.Pro","Microsoft.VisualStudio.VC.Ide.Pro","Microsoft.VisualStudio.VC.Ide.Pro.Resources","Microsoft.VisualStudio.Component.VC.Tools.ARM64","Microsoft.VisualStudio.VC.MSBuild.Arm64","Microsoft.VisualCpp.CRT.Redist.ARM64.OneCore.Desktop","Microsoft.VisualCpp.CRT.Redist.ARM64","Microsoft.VisualCpp.CRT.ARM64.OneCore.Desktop","Microsoft.VisualCpp.CRT.ARM64.Store","Microsoft.VisualCpp.CRT.ARM64.Desktop","Microsoft.VisualCpp.Tools.Hostx86.Targetarm64","Microsoft.VisualCpp.VCTip.hostX86.targetARM64","Microsoft.VisualCpp.Tools.HostX86.TargetARM64.Resources","Microsoft.VisualStudio.Component.VC.Tools.ARM","Microsoft.VisualCpp.Tools.Hostx86.Targetarm","Microsoft.VisualCpp.VCTip.hostX86.targetARM","Microsoft.VisualCpp.Tools.HostX86.TargetARM.Resources","Microsoft.VisualCpp.CRT.x86.Store","Microsoft.VisualCpp.CRT.x86.OneCore.Desktop","Microsoft.VisualCpp.CRT.x64.Store","Microsoft.VisualCpp.CRT.x64.OneCore.Desktop","Microsoft.VisualCpp.CRT.Redist.arm.OneCore.Desktop","Microsoft.VisualCpp.CRT.arm.OneCore.Desktop","Microsoft.VisualCpp.CRT.arm.Store","Microsoft.VisualCpp.CRT.arm.Desktop","Microsoft.VisualStudio.VC.Templates.UnitTest","Microsoft.VisualStudio.TestTools.TestPlatform.V1.CPP","Microsoft.VisualStudio.VC.Templates.UnitTest.Resources","Microsoft.VisualStudio.VC.Templates.Desktop","Microsoft.VisualStudio.VC.Templates.Pro","Microsoft.VisualStudio.VC.Templates.Pro.Resources","Microsoft.VisualStudio.PackageGroup.VC.CoreIDE.Express","Microsoft.VisualStudio.PackageGroup.Debugger.Script","Microsoft.VisualStudio.JavaScript.LanguageService","Microsoft.VisualStudio.JavaScript.LanguageService.Resources","Microsoft.VisualStudio.Debugger.Script.Msi","Microsoft.VisualStudio.Debugger.Script","Microsoft.VisualStudio.Debugger.Script","Microsoft.VisualStudio.Debugger.Script.Resources","Microsoft.VisualStudio.Debugger.Script.Resources","Microsoft.VisualStudio.VC.MSBuild.X64","Microsoft.VS.VC.MSBuild.X64.Resources","Microsoft.VisualStudio.VC.MSBuild.ARM","Microsoft.VisualStudio.VC.MSBuild.X86","Microsoft.VisualStudio.VC.MSBuild.Base","Microsoft.VisualStudio.VC.MSBuild.Base.Resources","Microsoft.VisualStudio.VC.Ide.WinXPlus","Microsoft.VisualStudio.VC.Ide.Dskx","Microsoft.VisualStudio.VC.Ide.Dskx.Resources","Microsoft.VisualStudio.VC.Ide.Core","Microsoft.VisualStudio.VC.Ide.Core.Resources","Microsoft.VisualStudio.VC.Ide.Base","Microsoft.VisualStudio.VC.Ide.Base.Resources","Microsoft.VisualStudio.Component.VC.CLI.Support","Microsoft.VisualCpp.CLI.X86","Microsoft.VisualCpp.CLI.X64","Microsoft.VisualCpp.CLI.Source","Microsoft.VisualCpp.CLI.ARM64","Microsoft.VisualCpp.CLI.ARM","Microsoft.VisualStudio.VC.Templates.CLR","Microsoft.VisualStudio.VC.Ide.LanguageService","Microsoft.VisualStudio.VC.Ide.ResourceEditor","Microsoft.VisualStudio.VC.Ide.ResourceEditor.Resources","Microsoft.VisualStudio.VC.Ide.ProjectSystem","Microsoft.VisualStudio.VC.Ide.ProjectSystem.Resources","Microsoft.VisualStudio.VC.Ide.Core.VCProjectEngine","Microsoft.VisualStudio.VC.Ide.Core.VCProjectEngine.Resources","Microsoft.VisualStudio.VC.Ide.LanguageService.Resources","Microsoft.VisualStudio.VC.Templates.CLR.Resources","Microsoft.Component.VC.Runtime.OSSupport","Microsoft.Windows.UniversalCRT.Tools.Msi","Microsoft.Windows.UniversalCRT.Tools.Msi","Microsoft.Windows.UniversalCRT.ExtensionSDK.Msi","Microsoft.Windows.UniversalCRT.HeadersLibsSources.Msi","Microsoft.VisualStudio.PackageGroup.VC.Tools.x86","Microsoft.VisualCpp.Tools.HostX86.TargetX64","Microsoft.VisualCpp.VCTip.hostX86.targetX64","Microsoft.VisualCpp.Tools.Hostx86.Targetx64.Resources","Microsoft.VisualCpp.Tools.HostX86.TargetX86","Microsoft.VisualCpp.VCTip.hostX86.targetX86","Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources","Microsoft.VisualCpp.Tools.Core.Resources","Microsoft.VisualCpp.Tools.Core.x86","Microsoft.VisualCpp.Tools.Common.Utils","Microsoft.VisualCpp.Tools.Common.Utils.Resources","Microsoft.VisualCpp.DIA.SDK","Microsoft.VisualCpp.CRT.x86.Desktop","Microsoft.VisualCpp.CRT.x64.Desktop","Microsoft.VisualCpp.CRT.Source","Microsoft.VisualCpp.CRT.Redist.X86","Microsoft.VisualCpp.CRT.Redist.X64","Microsoft.VisualCpp.CRT.Redist.Resources","Microsoft.VisualCpp.RuntimeDebug.14","Microsoft.VisualCpp.RuntimeDebug.14","Microsoft.VisualCpp.CRT.Headers","Microsoft.Component.HelpViewer","Microsoft.HelpViewer","Microsoft.VisualStudio.Help.Configuration.Msi","Microsoft.VisualStudio.Component.SQL.DataSources","Microsoft.VisualStudio.Component.SQL.SSDT","Microsoft.VisualStudio.Component.SQL.CMDUtils","sqlcmdlnutils","Microsoft.VisualStudio.Component.Common.Azure.Tools","Microsoft.VisualStudio.Azure.CommonAzureTools","SSDT","Microsoft.VisualStudio.Component.SQL.ADAL","sql_adalsql","Microsoft.VisualStudio.Component.NuGet","Microsoft.CredentialProvider","Microsoft.VisualStudio.NuGet.Licenses","Microsoft.VisualStudio.Component.SQL.LocalDB.Runtime","Microsoft.VisualStudio.Component.SQL.NCLI","sqllocaldb","sqlncli","Microsoft.VisualStudio.Component.EntityFramework","Microsoft.VisualStudio.PackageGroup.DslRuntime","Microsoft.VisualStudio.Dsl.Core","Microsoft.VisualStudio.Dsl.GraphObject","Microsoft.VisualStudio.Dsl.Core.Resources","Microsoft.VisualStudio.EntityFrameworkTools","Microsoft.VisualStudio.EntityFrameworkTools.Msi","Microsoft.VisualStudio.Component.Roslyn.LanguageServices","Microsoft.VisualStudio.InteractiveWindow","Microsoft.DiaSymReader.Native","Microsoft.VisualStudio.Component.Static.Analysis.Tools","Microsoft.VisualCpp.Redist.14","Microsoft.VisualCpp.Redist.14","Microsoft.VisualStudio.StaticAnalysis","Microsoft.VisualStudio.StaticAnalysis.Resources","Microsoft.CodeAnalysis.VisualStudio.InteractiveComponents.Resources","Microsoft.CodeAnalysis.VisualStudio.InteractiveComponents","Microsoft.CodeAnalysis.VisualStudio.Setup.Interactive.Resources","Microsoft.Net.ComponentGroup.TargetingPacks.Common","Microsoft.Net.Component.4.6.TargetingPack","Microsoft.Net.4.6.TargetingPack","Microsoft.Net.Component.4.5.2.TargetingPack","Microsoft.Net.4.5.2.TargetingPack","Microsoft.Net.Component.4.5.1.TargetingPack","Microsoft.Net.4.5.1.TargetingPack","Microsoft.Net.Component.4.5.TargetingPack","Microsoft.Net.4.5.TargetingPack","Microsoft.Net.Component.4.TargetingPack","Microsoft.Net.4.TargetingPack","Microsoft.Net.ComponentGroup.DevelopmentPrerequisites","Microsoft.Net.Component.4.6.1.TargetingPack","Microsoft.Net.4.6.1.TargetingPack","Microsoft.Net.Cumulative.TargetingPack.Resources","Microsoft.Net.Component.4.6.1.SDK","Microsoft.Net.4.6.1.SDK","Microsoft.VisualStudio.Component.TextTemplating","Microsoft.VisualStudio.TextTemplating.MSBuild","Microsoft.VisualStudio.TextTemplating.Integration","Microsoft.VisualStudio.TextTemplating.Core","Microsoft.VisualStudio.TextTemplating.Integration.Resources","Microsoft.VisualStudio.Component.VisualStudioData","Microsoft.VisualStudio.Component.SQL.CLR","Microsoft.VisualStudio.ProTools","sqlsysclrtypes","sqlsysclrtypes","SQLCommon","Microsoft.VisualStudio.ProTools.Resources","Microsoft.VisualStudio.XamlDiagnostics","Microsoft.VisualStudio.XamlDiagnostics.Resources","Microsoft.VisualStudio.XamlDesigner","Microsoft.VisualStudio.XamlDesigner.Resources","Microsoft.VisualStudio.XamlDesigner.Executables","Microsoft.VisualStudio.XamlShared","Microsoft.VisualStudio.XamlShared.Resources","Microsoft.VisualStudio.PackageGroup.TestTools.Managed","Microsoft.VisualStudio.PackageGroup.IntelliTrace.Core","Microsoft.IntelliTrace.Core","Microsoft.IntelliTrace.Core.Targeted","Microsoft.IntelliTrace.ProfilerProxy.Msi.x64","Microsoft.IntelliTrace.ProfilerProxy.Msi","Microsoft.VisualStudio.NuGet.Core","Microsoft.VisualStudio.TestWindow.SourceBasedTestDiscovery","Microsoft.VisualStudio.TestWindow.Dotnet","Microsoft.VisualStudio.TestTools.TestGeneration","Microsoft.VisualStudio.PackageGroup.TestTools.CodeCoverage","Microsoft.VisualStudio.PackageGroup.TestTools.Enterprise","Microsoft.VisualStudio.PackageGroup.TestTools.MSTestV2.Managed","Microsoft.VisualStudio.TestTools.MSTestV2.WizardExtension.UnitTest","Microsoft.VisualStudio.PackageGroup.TestTools.Core","Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.V2.CLI","Microsoft.VisualStudio.TestTools.TestPlatform.V2.CLI","Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.V1.CLI","Microsoft.VisualStudio.TestTools.TestPlatform.V1.CLI","Microsoft.VisualStudio.TestTools.Pex.Common","Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.Legacy","Microsoft.VisualStudio.PackageGroup.MinShell.Interop","Microsoft.VisualStudio.TestTools.TP.Legacy.Tips.Msi","Microsoft.VisualStudio.TestTools.TP.Legacy.Tips.Common","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Tips","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Tips.Resources","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.TestTools","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Professional","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Common","Microsoft.VisualStudio.TestTools.TP.Legacy.Common.Res","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Core","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Core.Resources","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Agent","Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.IDE","Microsoft.VisualStudio.TestTools.TestWIExtension","Microsoft.VisualStudio.TestTools.TestPlatform.IDE","Microsoft.VisualStudio.PackageGroup.TestTools.DataCollectors","Microsoft.Component.ClickOnce","Microsoft.VisualStudio.PackageGroup.ClickOnce.MSBuild","Microsoft.VisualCpp.CRT.ClickOnce.Msi","Microsoft.ClickOnce.SignTool.Msi","Microsoft.SQL.ClickOnceBootstrapper.Msi","Microsoft.Net.ClickOnceBootstrapper","Microsoft.ClickOnce.BootStrapper.Msi.Resources","Microsoft.ClickOnce.BootStrapper.Msi","Microsoft.VisualStudio.WebTools.WSP.FSA","Microsoft.VisualStudio.WebTools.WSP.FSA.Resources","Microsoft.VisualStudio.PackageGroup.Community","Microsoft.VisualStudio.Community.Extra.Resources","Microsoft.VisualStudio.Community.Extra","Microsoft.VisualStudio.PackageGroup.Core","Microsoft.VisualStudio.TestTools.TeamFoundationClient","Microsoft.VisualStudio.PackageGroup.Debugger.Core","Microsoft.VisualStudio.Debugger.VSCodeDebuggerHost","Microsoft.VisualStudio.VC.Ide.Debugger","Microsoft.VisualStudio.VC.Ide.Debugger.Resources","Microsoft.VisualStudio.VC.Ide.Common","Microsoft.VisualStudio.VC.Ide.Common.Resources","Microsoft.VisualStudio.Debugger.Parallel","Microsoft.VisualStudio.Debugger.Parallel.Resources","Microsoft.VisualStudio.Debugger.CollectionAgents","Microsoft.VisualStudio.Debugger.Managed","Microsoft.CodeAnalysis.VisualStudio.Setup.Resources","Microsoft.CodeAnalysis.VisualStudio.Setup","Microsoft.CodeAnalysis.ExpressionEvaluator.Resources","Microsoft.CodeAnalysis.ExpressionEvaluator","Microsoft.VisualStudio.Debugger.Managed.Resources","Microsoft.VisualStudio.Debugger.Remote","Microsoft.VisualStudio.Debugger.Remote","Microsoft.VisualStudio.Debugger.Remote.Resources","Microsoft.VisualStudio.Debugger.Remote.Resources","Microsoft.VisualStudio.Debugger","Microsoft.VisualStudio.VC.MSVCDis","Microsoft.VisualStudio.ScriptedHost","Microsoft.VisualStudio.ScriptedHost.Targeted","Microsoft.VisualStudio.ScriptedHost.Resources","Microsoft.IntelliTrace.DiagnosticsHub","Microsoft.VisualStudio.Debugger.Resources","Microsoft.PackageGroup.ClientDiagnostics","Microsoft.VisualStudio.AppResponsiveness","Microsoft.VisualStudio.AppResponsiveness.Targeted","Microsoft.VisualStudio.AppResponsiveness.Resources","Microsoft.VisualStudio.ClientDiagnostics","Microsoft.VisualStudio.ClientDiagnostics.Targeted","Microsoft.VisualStudio.ClientDiagnostics.Resources","Microsoft.VisualStudio.PackageGroup.CommunityCore","Microsoft.VisualStudio.ProjectSystem.Full","Microsoft.VisualStudio.ProjectSystem","Microsoft.VisualStudio.Community.x86","Microsoft.VisualStudio.Community.x64","Microsoft.VisualStudio.Community","Microsoft.IntelliTrace.CollectorCab","Microsoft.VisualStudio.Community.Resources","Microsoft.VisualStudio.Net.Eula.Resources","Microsoft.VisualStudio.WebSiteProject.DTE","Microsoft.MSHtml","Microsoft.VisualStudio.Community.Msi.Resources","Microsoft.VisualStudio.Community.Msi","Microsoft.VisualStudio.MinShell.Interop.Msi","Microsoft.VisualStudio.Editors","Microsoft.VisualStudio.ClickOnce.Resources","Microsoft.VisualStudio.ClickOnce","Microsoft.Component.MSBuild","Microsoft.NuGet.Build.Tasks","Microsoft.VisualStudio.Component.Roslyn.Compiler","Microsoft.CodeAnalysis.Compilers.Resources","Microsoft.CodeAnalysis.Compilers","Microsoft.Net.PackageGroup.4.6.1.Redist","Microsoft.VisualStudio.TemplateEngine","Microsoft.VisualStudio.WebToolsExtensions.Common","Microsoft.NET.Sdk","Microsoft.VisualStudio.PackageGroup.TestTools.Templates.Managed","Microsoft.VisualStudio.TestTools.Templates.Managed","Microsoft.VisualStudio.TestTools.Templates.Managed.Resources","Microsoft.VisualStudio.Templates.VB.MSTestv2.Desktop.UnitTest","Microsoft.VisualStudio.Templates.CS.MSTestv2.Desktop.UnitTest","Microsoft.VisualStudio.Templates.VB.Wpf","Microsoft.VisualStudio.Templates.VB.Wpf.Resources","Microsoft.VisualStudio.Templates.VB.Winforms","Microsoft.VisualStudio.Templates.VB.ManagedCore","Microsoft.VisualStudio.Templates.VB.Shared","Microsoft.VisualStudio.Templates.VB.Shared.Resources","Microsoft.VisualStudio.Templates.VB.ManagedCore.Resources","Microsoft.VisualStudio.Templates.CS.GettingStarted.Desktop.Package","Microsoft.VisualStudio.Templates.GetStarted.Desktop.Setup","Microsoft.VisualStudio.Templates.CS.GettingStarted.Console.Package","Microsoft.VisualStudio.Templates.GetStarted.Resources","Microsoft.VisualStudio.Templates.GetStarted.Common.Setup","Microsoft.VisualStudio.Templates.GetStarted.Console.Setup","Microsoft.VisualStudio.Templates.CS.Wpf","Microsoft.VisualStudio.Templates.CS.Wpf.Resources","Microsoft.VisualStudio.Templates.CS.Winforms","Microsoft.VisualStudio.Templates.CS.ManagedCore","Microsoft.VisualStudio.Templates.CS.Shared","Microsoft.VisualStudio.Templates.Editorconfig.Wizard.Setup","Templates.Editorconfig.SolutionFile.Setup","Microsoft.VisualStudio.Templates.CS.Shared.Resources","Microsoft.VisualStudio.Templates.CS.ManagedCore.Resources","Microsoft.VisualStudio.Component.CoreEditor","Microsoft.VisualStudio.PackageGroup.CoreEditor","PortableFacades","Microsoft.VisualStudio.PackageGroup.VsDevCmd","Microsoft.VisualStudio.VsDevCmd.Ext.NetFxSdk","Microsoft.VisualStudio.VsDevCmd.Core.WinSdk","Microsoft.VisualStudio.VsDevCmd.Core.DotNet","Microsoft.VisualStudio.VC.DevCmd","Microsoft.VisualStudio.VC.DevCmd.Resources","Microsoft.VisualStudio.VirtualTree","Microsoft.VisualStudio.PackageGroup.Progression","Microsoft.VisualStudio.PerformanceProvider","Microsoft.VisualStudio.GraphModel","Microsoft.VisualStudio.GraphProvider","Microsoft.DiaSymReader","Microsoft.Build.Dependencies","Microsoft.Build.FileTracker.Msi","Microsoft.Build","Microsoft.VisualStudio.TextMateGrammars","Microsoft.VisualStudio.PackageGroup.TeamExplorer","Microsoft.TeamFoundation.OfficeIntegration","Microsoft.TeamFoundation.OfficeIntegration.Resources","Microsoft.VisualStudio.TeamExplorer","Microsoft.ServiceHub","Microsoft.VisualStudio.ProjectServices","Microsoft.VisualStudio.SLNX.VSIX","Microsoft.VisualStudio.FileHandler.Msi","Microsoft.VisualStudio.FileHandler.Msi","Microsoft.VisualStudio.PackageGroup.MinShell","Microsoft.VisualStudio.MinShell.Interop","Microsoft.VisualStudio.Log","Microsoft.VisualStudio.Log.Targeted","Microsoft.VisualStudio.Log.Resources","Microsoft.VisualStudio.Finalizer","Microsoft.VisualStudio.WDExpress","Microsoft.VisualStudio.WDExpress.Resources","Microsoft.VisualStudio.CoreEditor","Microsoft.VisualStudio.Connected","Microsoft.VisualStudio.Connected.Resources","Microsoft.VisualStudio.MinShell","Microsoft.VisualStudio.Setup.Configuration","Microsoft.VisualStudio.MinShell.Platform","Microsoft.VisualStudio.MinShell.Platform.Resources","Microsoft.VisualStudio.MefHosting","Microsoft.VisualStudio.MefHosting.Resources","Microsoft.VisualStudio.Initializer","Microsoft.VisualStudio.ExtensionManager","Microsoft.VisualStudio.MinShell.x86","Microsoft.VisualStudio.NativeImageSupport","Microsoft.VisualStudio.MinShell.Msi","Microsoft.VisualStudio.MinShell.Msi.Resources","Microsoft.VisualStudio.LanguageServer","Microsoft.VisualStudio.MinShell.Resources","Microsoft.Net.PackageGroup.4.6.Redist","Microsoft.VisualStudio.Branding.WDExpress"]}]
    diff --git a/deps/npm/node_modules/node-gyp/test/fixtures/VS_2017_Unusable.txt b/deps/npm/node_modules/node-gyp/test/fixtures/VS_2017_Unusable.txt
    deleted file mode 100644
    index fc0a257f447830..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/fixtures/VS_2017_Unusable.txt
    +++ /dev/null
    @@ -1 +0,0 @@
    -[{"path":"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\BuildToolsUnusable","version":"15.9.28307.665","packages":["Microsoft.VisualStudio.Product.BuildTools","Microsoft.VisualStudio.Component.Windows10SDK.17134","Win10SDK_10.0.17134","Microsoft.VisualStudio.Component.VC.Tools.x86.x64","Microsoft.VisualCpp.CodeAnalysis.Extensions","Microsoft.VisualCpp.CodeAnalysis.Extensions.X86","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X86","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X86.Resources","Microsoft.VisualCpp.CodeAnalysis.Extensions.X64","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X64","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X64.Resources","Microsoft.VisualStudio.Component.Static.Analysis.Tools","Microsoft.VisualStudio.StaticAnalysis","Microsoft.VisualStudio.StaticAnalysis.Resources","Microsoft.VisualCpp.Tools.HostX64.TargetX86","Microsoft.VisualCpp.VCTip.HostX64.TargetX86","Microsoft.VisualCpp.Tools.HostX64.TargetX86.Resources","Microsoft.VisualCpp.Tools.HostX64.TargetX64","Microsoft.VisualCpp.VCTip.HostX64.TargetX64","Microsoft.VisualCpp.Tools.HostX64.TargetX64.Resources","Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX64","Microsoft.VisualCpp.Premium.Tools.Hostx86.Targetx64.Resources","Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX86","Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX86.Resources","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX86","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX86.Resources","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX64","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX64.Resources","Microsoft.VisualCpp.PGO.X86","Microsoft.VisualCpp.PGO.X64","Microsoft.VisualCpp.PGO.Headers","Microsoft.VisualCpp.CRT.x86.Store","Microsoft.VisualCpp.CRT.x86.OneCore.Desktop","Microsoft.VisualCpp.CRT.x64.Store","Microsoft.VisualCpp.CRT.x64.OneCore.Desktop","Microsoft.VisualCpp.CRT.Redist.x86.OneCore.Desktop","Microsoft.VisualCpp.CRT.Redist.x64.OneCore.Desktop","Microsoft.VisualCpp.CRT.ClickOnce.Msi","Microsoft.VisualStudio.PackageGroup.VC.Tools.x86","Microsoft.VisualCpp.Tools.HostX86.TargetX64","Microsoft.VisualCpp.VCTip.hostX86.targetX64","Microsoft.VisualCpp.Tools.Hostx86.Targetx64.Resources","Microsoft.VisualCpp.Tools.HostX86.TargetX86","Microsoft.VisualCpp.VCTip.hostX86.targetX86","Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources","Microsoft.VisualCpp.Tools.Core.Resources","Microsoft.VisualCpp.Tools.Core.x86","Microsoft.VisualCpp.Tools.Common.Utils","Microsoft.VisualCpp.Tools.Common.Utils.Resources","Microsoft.VisualCpp.DIA.SDK","Microsoft.VisualCpp.CRT.x86.Desktop","Microsoft.VisualCpp.CRT.x64.Desktop","Microsoft.VisualCpp.CRT.Source","Microsoft.VisualCpp.CRT.Redist.X86","Microsoft.VisualCpp.CRT.Redist.X64","Microsoft.VisualCpp.CRT.Redist.Resources","Microsoft.VisualCpp.RuntimeDebug.14","Microsoft.VisualCpp.RuntimeDebug.14","Microsoft.VisualCpp.Redist.14","Microsoft.VisualCpp.Redist.14","Microsoft.VisualCpp.CRT.Headers","Microsoft.VisualStudio.Workload.MSBuildTools","Microsoft.VisualStudio.Component.CoreBuildTools","Microsoft.VisualStudio.Setup.Configuration","Microsoft.VisualStudio.PackageGroup.VsDevCmd","Microsoft.VisualStudio.VsDevCmd.Ext.NetFxSdk","Microsoft.VisualStudio.VsDevCmd.Core.WinSdk","Microsoft.VisualStudio.VsDevCmd.Core.DotNet","Microsoft.VisualStudio.VC.DevCmd","Microsoft.VisualStudio.VC.DevCmd.Resources","Microsoft.VisualStudio.BuildTools.Resources","Microsoft.VisualStudio.Net.Eula.Resources","Microsoft.Build.Dependencies","Microsoft.Build.FileTracker.Msi","Microsoft.Component.MSBuild","Microsoft.PythonTools.BuildCore.Vsix","Microsoft.NuGet.Build.Tasks","Microsoft.VisualStudio.Component.Roslyn.Compiler","Microsoft.CodeAnalysis.Compilers.Resources","Microsoft.CodeAnalysis.Compilers","Microsoft.Net.PackageGroup.4.6.1.Redist","Microsoft.Net.4.6.1.FullRedist.NonThreshold","Microsoft.Windows.UniversalCRT.Msu.81","Microsoft.VisualStudio.NativeImageSupport","Microsoft.Build"]}]
    diff --git a/deps/npm/node_modules/node-gyp/test/fixtures/VS_2019_BuildTools_minimal.txt b/deps/npm/node_modules/node-gyp/test/fixtures/VS_2019_BuildTools_minimal.txt
    deleted file mode 100644
    index f07d2541648829..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/fixtures/VS_2019_BuildTools_minimal.txt
    +++ /dev/null
    @@ -1 +0,0 @@
    -[{"path":"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools","version":"16.1.28922.388","packages":["Microsoft.VisualStudio.Product.BuildTools","Microsoft.VisualStudio.Component.VC.CoreIde","Microsoft.VisualStudio.VC.Ide.Pro","Microsoft.VisualStudio.VC.Ide.Pro.Resources","Microsoft.VisualStudio.VC.Templates.Pro","Microsoft.VisualStudio.VC.Templates.Pro.Resources","Microsoft.VisualStudio.VC.Items.Pro","Microsoft.VisualStudio.PackageGroup.VC.CoreIDE.Reduced","Microsoft.VisualStudio.VC.Ide.MDD","Microsoft.VisualStudio.PackageGroup.Core","Microsoft.VisualStudio.CodeSense.Community","Microsoft.VisualStudio.TestTools.TeamFoundationClient","Microsoft.PackageGroup.ClientDiagnostics","Microsoft.VisualStudio.AppResponsiveness","Microsoft.VisualStudio.AppResponsiveness.Targeted","Microsoft.VisualStudio.AppResponsiveness.Resources","Microsoft.VisualStudio.ClientDiagnostics","Microsoft.VisualStudio.ClientDiagnostics.Targeted","Microsoft.VisualStudio.ClientDiagnostics.Resources","Microsoft.VisualStudio.PackageGroup.CommunityCore","Microsoft.VisualStudio.ProjectSystem.Full","Microsoft.VisualStudio.ProjectSystem","Microsoft.VisualStudio.Community.x86","Microsoft.VisualStudio.Community.x64","Microsoft.VisualStudio.Community","Microsoft.IntelliTrace.CollectorCab","Microsoft.VisualStudio.Community.Resources","Microsoft.VisualStudio.WebSiteProject.DTE","Microsoft.MSHtml","Microsoft.VisualStudio.Platform.CallHierarchy","Microsoft.VisualStudio.Community.Msi.Resources","Microsoft.VisualStudio.Community.Msi","Microsoft.VisualStudio.MinShell.Interop.Msi","Microsoft.VisualStudio.PackageGroup.CoreEditor","Microsoft.VisualStudio.VirtualTree","Microsoft.VisualStudio.PackageGroup.Progression","Microsoft.VisualStudio.PerformanceProvider","Microsoft.VisualStudio.GraphModel","Microsoft.VisualStudio.GraphProvider","Microsoft.VisualStudio.TextMateGrammars","Microsoft.VisualStudio.PackageGroup.TeamExplorer.Common","Microsoft.VisualStudio.TeamExplorer","Microsoft.ServiceHub","Microsoft.VisualStudio.ProjectServices","Microsoft.VisualStudio.OpenFolder.VSIX","Microsoft.VisualStudio.FileHandler.Msi","Microsoft.VisualStudio.FileHandler.Msi","Microsoft.VisualStudio.PackageGroup.MinShell","Microsoft.VisualStudio.MinShell.Msi","Microsoft.VisualStudio.MinShell.Msi.Resources","Microsoft.VisualStudio.MinShell.Interop","Microsoft.VisualStudio.Log","Microsoft.VisualStudio.Log.Targeted","Microsoft.VisualStudio.Log.Resources","Microsoft.VisualStudio.Finalizer","Microsoft.VisualStudio.CoreEditor","Microsoft.VisualStudio.Platform.NavigateTo","Microsoft.VisualStudio.Connected","Microsoft.VisualStudio.Connected.Resources","Microsoft.VisualStudio.VC.Ide.x64","Microsoft.VisualStudio.PackageGroup.VC.CoreIDE.Express","Microsoft.VisualStudio.PackageGroup.Debugger.Script","Microsoft.VisualStudio.Debugger.Script.Msi","Microsoft.VisualStudio.Debugger.Script","Microsoft.VisualStudio.Debugger.Script","Microsoft.VisualStudio.Debugger.Script.Resources","Microsoft.VisualStudio.Debugger.Script.Resources","Microsoft.VisualStudio.VC.Ide.WinXPlus","Microsoft.VisualStudio.VC.Ide.Dskx","Microsoft.VisualStudio.VC.Ide.Dskx.Resources","Microsoft.VisualStudio.VC.Ide.Base","Microsoft.VisualStudio.VC.Ide.LanguageService","Microsoft.VisualStudio.VC.Ide.Core","Microsoft.VisualStudio.VisualC.Logging","Microsoft.VisualStudio.VC.Ide.Core.Resources","Microsoft.VisualStudio.VC.Ide.VCPkgDatabase","Microsoft.VisualStudio.VC.Ide.ResourceEditor","Microsoft.VisualStudio.VC.Ide.ResourceEditor.Resources","Microsoft.VisualStudio.VC.Ide.ProjectSystem","Microsoft.VisualStudio.VC.Ide.ProjectSystem.Resources","Microsoft.VisualStudio.VC.Ide.Core.VCProjectEngine","Microsoft.VisualStudio.VC.Ide.Core.VCProjectEngine.Resources","Microsoft.VisualStudio.VC.Ide.LanguageService.Resources","Microsoft.VisualStudio.VC.Ide.Base.Resources","Microsoft.Net.4.TargetingPack","Microsoft.VisualStudio.PackageGroup.Debugger.Core","Microsoft.VisualStudio.PackageGroup.Debugger.TimeTravel.Record","Microsoft.VisualStudio.Debugger.TimeTravel.Runtime","Microsoft.VisualStudio.Debugger.TimeTravel.Runtime","Microsoft.VisualStudio.Debugger.TimeTravel.Agent","Microsoft.VisualStudio.Debugger.TimeTravel.Record","Microsoft.VisualStudio.Debugger.VSCodeDebuggerHost","Microsoft.VisualStudio.VC.Ide.Debugger","Microsoft.VisualStudio.VC.Ide.Debugger.Concord","Microsoft.VisualStudio.VC.Ide.Debugger.Concord.Resources","Microsoft.VisualStudio.VC.Ide.Debugger.Resources","Microsoft.VisualStudio.VC.Ide.Common","Microsoft.VisualStudio.VC.Ide.Common.Resources","Microsoft.VisualStudio.Debugger.Parallel","Microsoft.VisualStudio.Debugger.Parallel.Resources","Microsoft.VisualStudio.Debugger.CollectionAgents","Microsoft.VisualStudio.Debugger.Managed","Microsoft.DiaSymReader","Microsoft.CodeAnalysis.ExpressionEvaluator","Microsoft.VisualStudio.Debugger.Concord.Managed","Microsoft.VisualStudio.Debugger.Concord.Managed.Resources","Microsoft.VisualStudio.Debugger.Managed.Resources","Microsoft.VisualStudio.Debugger.Remote","Microsoft.VisualStudio.Debugger.Concord.Remote","Microsoft.VisualStudio.Debugger.Concord.Remote.Resources","Microsoft.VisualStudio.Debugger.Remote","Microsoft.VisualStudio.Debugger.Concord.Remote","Microsoft.VisualStudio.Debugger.Concord.Remote.Resources","Microsoft.VisualStudio.Debugger.Remote.Resources","Microsoft.VisualStudio.Debugger.Remote.Resources","Microsoft.VisualStudio.Debugger","Microsoft.VisualStudio.PerfLib","Microsoft.VisualStudio.Debugger.Package.DiagHub.Client.VSx86","Microsoft.VisualStudio.Debugger.Remote.DiagHub.Client","Microsoft.VisualStudio.Debugger.Remote.DiagHub.Client","Microsoft.VisualStudio.VC.MSVCDis","Microsoft.VisualStudio.ScriptedHost","Microsoft.VisualStudio.ScriptedHost.Targeted","Microsoft.VisualStudio.ScriptedHost.Resources","Microsoft.VisualStudio.Editors","Microsoft.IntelliTrace.DiagnosticsHub","Microsoft.VisualStudio.MinShell","Microsoft.VisualStudio.MinShell.Platform","Microsoft.VisualStudio.MinShell.Platform.Resources","Microsoft.VisualStudio.MefHosting","Microsoft.VisualStudio.MefHosting.Resources","Microsoft.VisualStudio.Initializer","Microsoft.VisualStudio.ExtensionManager","Microsoft.VisualStudio.Platform.Editor","Microsoft.VisualStudio.Debugger.Concord","Microsoft.VisualStudio.Debugger.Concord.Resources","Microsoft.VisualStudio.Debugger.Resources","Microsoft.CodeAnalysis.VisualStudio.Setup","Microsoft.VisualStudio.Component.Windows10SDK.17134","Win10SDK_10.0.17134","Microsoft.VisualStudio.Component.VC.Tools.x86.x64","Microsoft.VisualCpp.CodeAnalysis.Extensions","Microsoft.VisualCpp.CodeAnalysis.Extensions.X86","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X86","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X86.Resources","Microsoft.VisualCpp.CodeAnalysis.Extensions.X64","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X64","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X64.Resources","Microsoft.VisualStudio.StaticAnalysis","Microsoft.VisualStudio.StaticAnalysis.Resources","Microsoft.VisualCpp.Tools.HostX64.TargetX86","Microsoft.VisualCpp.VCTip.HostX64.TargetX86","Microsoft.VisualCpp.Tools.HostX64.TargetX86.Resources","Microsoft.VisualCpp.Tools.HostX64.TargetX64","Microsoft.VisualCpp.VCTip.HostX64.TargetX64","Microsoft.VisualCpp.Tools.HostX64.TargetX64.Resources","Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX64","Microsoft.VisualCpp.Premium.Tools.Hostx86.Targetx64.Resources","Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX86","Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX86.Resources","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX86","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX86.Resources","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX64","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX64.Resources","Microsoft.VisualCpp.PGO.X86","Microsoft.VisualCpp.PGO.X64","Microsoft.VisualCpp.PGO.Headers","Microsoft.VisualCpp.CRT.x86.Store","Microsoft.VisualCpp.CRT.x86.OneCore.Desktop","Microsoft.VisualCpp.CRT.x64.Store","Microsoft.VisualCpp.CRT.x64.OneCore.Desktop","Microsoft.VisualCpp.CRT.Redist.x86.OneCore.Desktop","Microsoft.VisualCpp.CRT.Redist.x64.OneCore.Desktop","Microsoft.VisualCpp.CRT.ClickOnce.Msi","Microsoft.VisualStudio.PackageGroup.VC.Tools.x86","Microsoft.VisualCpp.Tools.HostX86.TargetX64","Microsoft.VisualCpp.VCTip.hostX86.targetX64","Microsoft.VisualCpp.Tools.Hostx86.Targetx64.Resources","Microsoft.VisualCpp.Tools.HostX86.TargetX86","Microsoft.VisualCpp.VCTip.hostX86.targetX86","Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources","Microsoft.VisualCpp.Tools.Core.Resources","Microsoft.VisualCpp.Tools.Core.x86","Microsoft.VisualCpp.Tools.Common.Utils","Microsoft.VisualCpp.Tools.Common.Utils.Resources","Microsoft.VisualCpp.DIA.SDK","Microsoft.VisualCpp.CRT.x86.Desktop","Microsoft.VisualCpp.CRT.x64.Desktop","Microsoft.VisualCpp.CRT.Source","Microsoft.VisualCpp.CRT.Redist.X86","Microsoft.VisualCpp.CRT.Redist.X64","Microsoft.VisualCpp.CRT.Redist.Resources","Microsoft.VisualCpp.RuntimeDebug.14","Microsoft.VisualCpp.RuntimeDebug.14","Microsoft.VisualCpp.Redist.14.Latest","Microsoft.VisualCpp.Redist.14.Latest","Microsoft.VisualCpp.Redist.14","Microsoft.VisualCpp.Redist.14","Microsoft.VisualCpp.CRT.Headers","Microsoft.VisualStudio.VC.MSBuild.x86.v142","Microsoft.VisualStudio.VC.MSBuild.X86","Microsoft.VisualStudio.VC.MSBuild.X64.v142","Microsoft.VisualStudio.VC.MSBuild.X64","Microsoft.VS.VC.MSBuild.X64.Resources","Microsoft.VisualStudio.VC.MSBuild.ARM.v142","Microsoft.VisualStudio.VC.MSBuild.ARM","Microsoft.VisualStudio.VC.MSBuild.Base","Microsoft.VisualStudio.VC.MSBuild.Base.Resources","Microsoft.VisualStudio.Workload.MSBuildTools","Microsoft.VisualStudio.Component.CoreBuildTools","Microsoft.VisualStudio.Setup.Configuration","Microsoft.VisualStudio.PackageGroup.VsDevCmd","Microsoft.VisualStudio.VsDevCmd.Ext.NetFxSdk","Microsoft.VisualStudio.VsDevCmd.Core.WinSdk","Microsoft.VisualStudio.VsDevCmd.Core.DotNet","Microsoft.VisualStudio.VC.DevCmd","Microsoft.VisualStudio.VC.DevCmd.Resources","Microsoft.VisualStudio.BuildTools.Resources","Microsoft.VisualStudio.Net.Eula.Resources","Microsoft.Build.Dependencies","Microsoft.Build.FileTracker.Msi","Microsoft.Component.MSBuild","Microsoft.PythonTools.BuildCore.Vsix","Microsoft.NuGet.Build.Tasks","Microsoft.VisualStudio.Component.Roslyn.Compiler","Microsoft.CodeAnalysis.Compilers","Microsoft.Net.PackageGroup.4.7.2.Redist","Microsoft.VisualStudio.NativeImageSupport","Microsoft.Build","Microsoft.VisualStudio.PackageGroup.NuGet","Microsoft.VisualStudio.NuGet.BuildTools"]}]
    diff --git a/deps/npm/node_modules/node-gyp/test/fixtures/VS_2019_Community_workload.txt b/deps/npm/node_modules/node-gyp/test/fixtures/VS_2019_Community_workload.txt
    deleted file mode 100644
    index 50071c25f189e5..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/fixtures/VS_2019_Community_workload.txt
    +++ /dev/null
    @@ -1 +0,0 @@
    -[{"path":"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community","version":"16.1.28922.388","packages":["Microsoft.VisualStudio.Workload.NativeDesktop","Microsoft.VisualStudio.Component.VC.TestAdapterForGoogleTest","Microsoft.VisualStudio.VC.Ide.TestAdapterForGoogleTest","Microsoft.VisualStudio.Component.VC.TestAdapterForBoostTest","Microsoft.VisualStudio.VC.Ide.TestAdapterForBoostTest","Microsoft.VisualStudio.Component.VC.ATL","Microsoft.VisualStudio.VC.Ide.ATL","Microsoft.VisualStudio.VC.Ide.ATL.Resources","Microsoft.VisualCpp.ATL.X86","Microsoft.VisualCpp.ATL.X64","Microsoft.VisualCpp.ATL.Source","Microsoft.VisualCpp.ATL.Headers","Microsoft.VisualStudio.Component.VC.CMake.Project","Microsoft.VisualStudio.VC.CMake","Microsoft.VisualStudio.VC.CMake.Project","Microsoft.VisualStudio.VC.ExternalBuildFramework","Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Core","Microsoft.VisualStudio.PackageGroup.TestTools.Native","Microsoft.VisualStudio.Component.VC.Redist.14.Latest","Microsoft.VisualStudio.VC.Templates.UnitTest","Microsoft.VisualStudio.VC.UnitTest.Desktop.Build.Core","Microsoft.VisualStudio.TestTools.TestPlatform.V1.CPP","Microsoft.VisualStudio.VC.Templates.UnitTest.Resources","Microsoft.VisualStudio.VC.Templates.Desktop","Microsoft.VisualStudio.Component.Debugger.JustInTime","Microsoft.VisualStudio.Debugger.ImmersiveActivateHelper.Msi","Microsoft.VisualStudio.Debugger.JustInTime","Microsoft.VisualStudio.Debugger.JustInTime.Msi","Microsoft.VisualStudio.Component.Windows10SDK.17763","Win10SDK_10.0.17763","Microsoft.VisualStudio.Component.VC.DiagnosticTools","Microsoft.VisualStudio.Component.Graphics.Tools","Microsoft.VisualStudio.Component.VC.Tools.x86.x64","Microsoft.VisualCpp.CodeAnalysis.Extensions","Microsoft.VisualCpp.CodeAnalysis.Extensions.X86","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X86","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X86.Resources","Microsoft.VisualCpp.CodeAnalysis.Extensions.X64","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X64","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X64.Resources","Microsoft.VisualCpp.Tools.HostX64.TargetX86","Microsoft.VisualCpp.VCTip.HostX64.TargetX86","Microsoft.VisualCpp.Tools.HostX64.TargetX86.Resources","Microsoft.VisualCpp.Tools.HostX64.TargetX64","Microsoft.VisualCpp.VCTip.HostX64.TargetX64","Microsoft.VisualCpp.Tools.HostX64.TargetX64.Resources","Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX64","Microsoft.VisualCpp.Premium.Tools.Hostx86.Targetx64.Resources","Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX86","Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX86.Resources","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX86","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX86.Resources","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX64","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX64.Resources","Microsoft.VisualCpp.PGO.X86","Microsoft.VisualCpp.PGO.X64","Microsoft.VisualCpp.PGO.Headers","Microsoft.VisualCpp.CRT.x86.Store","Microsoft.VisualCpp.CRT.x86.OneCore.Desktop","Microsoft.VisualCpp.CRT.x64.Store","Microsoft.VisualCpp.CRT.x64.OneCore.Desktop","Microsoft.VisualCpp.CRT.Redist.x86.OneCore.Desktop","Microsoft.VisualCpp.CRT.Redist.x64.OneCore.Desktop","Microsoft.VisualStudio.PackageGroup.VC.Tools.x86","Microsoft.VisualCpp.Tools.HostX86.TargetX64","Microsoft.VisualCpp.VCTip.hostX86.targetX64","Microsoft.VisualCpp.Tools.Hostx86.Targetx64.Resources","Microsoft.VisualCpp.Tools.HostX86.TargetX86","Microsoft.VisualCpp.VCTip.hostX86.targetX86","Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources","Microsoft.VisualCpp.Tools.Core.Resources","Microsoft.VisualCpp.Tools.Core.x86","Microsoft.VisualCpp.DIA.SDK","Microsoft.VisualCpp.CRT.x86.Desktop","Microsoft.VisualCpp.CRT.x64.Desktop","Microsoft.VisualCpp.CRT.Source","Microsoft.VisualCpp.CRT.Redist.X86","Microsoft.VisualCpp.CRT.Redist.X64","Microsoft.VisualCpp.CRT.Redist.Resources","Microsoft.VisualCpp.RuntimeDebug.14","Microsoft.VisualCpp.RuntimeDebug.14","Microsoft.VisualCpp.Redist.14.Latest","Microsoft.VisualCpp.Redist.14.Latest","Microsoft.VisualCpp.CRT.Headers","Microsoft.VisualStudio.Graphics.Viewers","Microsoft.VisualStudio.Graphics.Viewers.Resources","Microsoft.VisualStudio.Graphics.Msi","Microsoft.VisualStudio.Graphics.Msi","Microsoft.VisualStudio.Graphics.Analyzer","Microsoft.VisualStudio.Graphics.Analyzer.Targeted","Microsoft.VisualStudio.Graphics.Analyzer.Resources","Microsoft.VisualStudio.Graphics.Appid","Microsoft.VisualStudio.Graphics.Appid.Resources","Microsoft.VisualStudio.Component.VC.CoreIde","Microsoft.VisualStudio.VC.Ide.Pro","Microsoft.VisualStudio.VC.Ide.Pro.Resources","Microsoft.VisualStudio.VC.Templates.Pro","Microsoft.VisualStudio.VC.Templates.Pro.Resources","Microsoft.VisualStudio.VC.Items.Pro","Microsoft.VisualStudio.PackageGroup.VC.CoreIDE.Reduced","Microsoft.VisualStudio.VC.Ide.x64","Microsoft.VisualStudio.PackageGroup.VC.CoreIDE.Express","Microsoft.VisualStudio.VC.MSBuild.X64.v142","Microsoft.VisualStudio.VC.MSBuild.X64","Microsoft.VS.VC.MSBuild.X64.Resources","Microsoft.VisualStudio.VC.MSBuild.ARM.v142","Microsoft.VisualStudio.VC.MSBuild.ARM","Microsoft.VisualStudio.VC.MSBuild.x86.v142","Microsoft.VisualStudio.VC.MSBuild.X86","Microsoft.VisualStudio.VC.MSBuild.Base","Microsoft.VisualStudio.VC.MSBuild.Base.Resources","Microsoft.VisualStudio.VC.Ide.WinXPlus","Microsoft.VisualStudio.VC.Ide.Dskx","Microsoft.VisualStudio.VC.Ide.Dskx.Resources","Microsoft.VisualStudio.VC.Ide.Base","Microsoft.VisualStudio.VC.Ide.LanguageService","Microsoft.VisualStudio.VC.Ide.Core","Microsoft.VisualStudio.VC.Ide.Core.Resources","Microsoft.VisualStudio.VC.Ide.VCPkgDatabase","Microsoft.VisualStudio.VC.Ide.ProjectSystem","Microsoft.VisualStudio.VC.Ide.ProjectSystem.Resources","Microsoft.VisualStudio.VC.Ide.Core.VCProjectEngine","Microsoft.VisualStudio.VC.Ide.Core.VCProjectEngine.Resources","Microsoft.VisualStudio.VC.Ide.LanguageService.Resources","Microsoft.VisualStudio.VC.Ide.Base.Resources","Component.Microsoft.VisualStudio.LiveShare","Microsoft.VisualStudio.LiveShare","Microsoft.Icecap.Analysis","Microsoft.Icecap.Analysis.Targeted","Microsoft.Icecap.Analysis.Resources","Microsoft.Icecap.Analysis.Resources.Targeted","Microsoft.Icecap.Collection.Msi","Microsoft.Icecap.Collection.Msi.Targeted","Microsoft.Icecap.Collection.Msi.Resources","Microsoft.Icecap.Collection.Msi.Resources.Targeted","Microsoft.DiagnosticsHub.Instrumentation","Microsoft.DiagnosticsHub.CpuSampling.ExternalDependencies","Microsoft.DiagnosticsHub.CpuSampling","Microsoft.DiagnosticsHub.CpuSampling.Targeted","Microsoft.PackageGroup.DiagnosticsHub.Platform","Microsoft.DiagnosticsHub.Runtime.ExternalDependencies","Microsoft.DiagnosticsHub.Runtime.ExternalDependencies.Targeted","Microsoft.DiagnosticsHub.Collection.ExternalDependencies.x64","Microsoft.DiagnosticsHub.Collection.StopService.Uninstall","Microsoft.DiagnosticsHub.Runtime","Microsoft.DiagnosticsHub.Runtime.Targeted","Microsoft.DiagnosticsHub.Collection","Microsoft.DiagnosticsHub.Collection.Service","Microsoft.DiagnosticsHub.Collection.StopService.Install","Microsoft.VisualStudio.Component.IntelliCode","Microsoft.VisualStudio.IntelliCode","Microsoft.Net.4.TargetingPack","Microsoft.VisualStudio.VC.Ide.ResourceEditor","Microsoft.VisualStudio.VC.Ide.ResourceEditor.Resources","Microsoft.VisualStudio.PackageGroup.TestTools.CodeCoverage","Microsoft.VisualStudio.PackageGroup.TestTools.Core","Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.V2.CLI","Microsoft.VisualStudio.TestTools.TestPlatform.V2.CLI","Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.V1.CLI","Microsoft.VisualStudio.TestTools.TestPlatform.V1.CLI","Microsoft.VisualStudio.TestTools.Pex.Common","Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.Legacy","Microsoft.VisualStudio.PackageGroup.MinShell.Interop","Microsoft.VisualStudio.TestTools.TP.Legacy.Tips.Msi","Microsoft.VisualStudio.TestTools.TP.Legacy.Tips.Common","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Tips","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Tips.Resources","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.TestTools","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Professional","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Common","Microsoft.VisualStudio.TestTools.TP.Legacy.Common.Res","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Core","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Core.Resources","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Agent","Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.IDE","Microsoft.VisualStudio.TestTools.TestWIExtension","Microsoft.VisualStudio.TestTools.TestPlatform.IDE","Microsoft.VisualStudio.PackageGroup.TestTools.DataCollectors","Microsoft.VisualStudio.LiveShareApi","Microsoft.VisualStudio.Component.TextTemplating","Microsoft.VisualStudio.TextTemplating.MSBuild","Microsoft.VisualStudio.TextTemplating.Integration","Microsoft.VisualStudio.TextTemplating.Core","Microsoft.VisualStudio.TextTemplating.Integration.Resources","Microsoft.VisualCpp.CRT.ClickOnce.Msi","Microsoft.Component.MSBuild","Microsoft.NuGet.Build.Tasks","Microsoft.DiagnosticsHub.KB2882822.Win7","Microsoft.VisualStudio.PackageGroup.Debugger.Script","Microsoft.VisualStudio.Debugger.Script.Msi","Microsoft.VisualStudio.Debugger.Script","Microsoft.VisualStudio.Debugger.Script","Microsoft.VisualStudio.Debugger.Script.Resources","Microsoft.VisualStudio.Debugger.Script.Resources","Microsoft.VisualStudio.ComponentGroup.WebToolsExtensions","Microsoft.VisualStudio.ProTools","sqlsysclrtypes","sqlsysclrtypes","SQLCommon","Microsoft.VisualStudio.ProTools.Resources","Microsoft.VisualStudio.WebToolsExtensions","Microsoft.VisualStudio.WebTools","Microsoft.VisualStudio.WebTools.Resources","Microsoft.VisualStudio.WebTools.MSBuild","Microsoft.VisualStudio.WebTools.WSP.FSA","Microsoft.VisualStudio.WebTools.WSP.FSA.Resources","Microsoft.VisualStudio.VC.Ide.MDD","Microsoft.VisualStudio.VisualC.Logging","Microsoft.WebTools.Shared","Microsoft.WebTools.DotNet.Core.ItemTemplates","Microsoft.VisualCpp.Redist.14","Microsoft.VisualCpp.Redist.14","Microsoft.Windows.UniversalCRT.Msu.7","Microsoft.VisualStudio.StaticAnalysis","Microsoft.VisualStudio.StaticAnalysis.Resources","Microsoft.VisualStudio.Component.Roslyn.Compiler","Microsoft.CodeAnalysis.Compilers","Microsoft.VisualStudio.Component.NuGet","Microsoft.CredentialProvider","Microsoft.VisualStudio.NuGet.PowershellBindingRedirect","Microsoft.VisualStudio.NuGet.Licenses","Microsoft.VisualStudio.PackageGroup.Community","Microsoft.VisualStudio.Community.Extra.Resources","Microsoft.VisualStudio.Community.Extra","Microsoft.VisualStudio.PackageGroup.Core","Microsoft.VisualStudio.CodeSense.Community","Microsoft.VisualStudio.TestTools.TeamFoundationClient","Microsoft.VisualStudio.PackageGroup.Debugger.Core","Microsoft.VisualStudio.PackageGroup.Debugger.TimeTravel.Record","Microsoft.VisualStudio.Debugger.TimeTravel.Runtime","Microsoft.VisualStudio.Debugger.TimeTravel.Runtime","Microsoft.VisualStudio.Debugger.TimeTravel.Agent","Microsoft.VisualStudio.Debugger.TimeTravel.Record","Microsoft.VisualStudio.Debugger.VSCodeDebuggerHost","Microsoft.VisualStudio.VC.Ide.Debugger","Microsoft.VisualStudio.VC.Ide.Debugger.Concord","Microsoft.VisualStudio.VC.Ide.Debugger.Concord.Resources","Microsoft.VisualStudio.VC.Ide.Debugger.Resources","Microsoft.VisualStudio.VC.Ide.Common","Microsoft.VisualStudio.VC.Ide.Common.Resources","Microsoft.VisualStudio.Debugger.Parallel","Microsoft.VisualStudio.Debugger.Parallel.Resources","Microsoft.VisualStudio.Debugger.CollectionAgents","Microsoft.VisualStudio.Debugger.Managed","Microsoft.CodeAnalysis.VisualStudio.Setup","Microsoft.CodeAnalysis.ExpressionEvaluator","Microsoft.VisualStudio.Debugger.Concord.Managed","Microsoft.VisualStudio.Debugger.Concord.Managed.Resources","Microsoft.VisualStudio.Debugger.Managed.Resources","Microsoft.VisualStudio.Debugger.Remote","Microsoft.VisualStudio.Debugger.Remote.DbgHelp.Win8","Microsoft.VisualStudio.Debugger.Concord.Remote","Microsoft.VisualStudio.Debugger.Concord.Remote.Resources","Microsoft.VisualStudio.Debugger.Remote","Microsoft.VisualStudio.Debugger.Remote.DbgHelp.Win8","Microsoft.VisualStudio.Debugger.Concord.Remote","Microsoft.VisualStudio.Debugger.Concord.Remote.Resources","Microsoft.VisualStudio.Debugger.Remote.Resources","Microsoft.VisualStudio.Debugger.Remote.Resources","Microsoft.VisualStudio.Debugger","Microsoft.VisualStudio.Debugger.Package.DiagHub.Client.VSx86","Microsoft.VisualStudio.Debugger.Remote.DiagHub.Client","Microsoft.VisualStudio.Debugger.Remote.DiagHub.Client","Microsoft.VisualStudio.Debugger.DbgHelp.Win8","Microsoft.VisualStudio.VC.MSVCDis","Microsoft.VisualStudio.ScriptedHost","Microsoft.VisualStudio.ScriptedHost.Targeted","Microsoft.VisualStudio.ScriptedHost.Resources","Microsoft.IntelliTrace.DiagnosticsHub","Microsoft.VisualStudio.Debugger.Concord","Microsoft.VisualStudio.Debugger.Concord.Resources","Microsoft.VisualStudio.Debugger.Resources","Microsoft.PackageGroup.ClientDiagnostics","Microsoft.VisualStudio.AppResponsiveness","Microsoft.VisualStudio.AppResponsiveness.Targeted","Microsoft.VisualStudio.AppResponsiveness.Resources","Microsoft.VisualStudio.ClientDiagnostics","Microsoft.VisualStudio.ClientDiagnostics.Targeted","Microsoft.VisualStudio.ClientDiagnostics.Resources","Microsoft.VisualStudio.PackageGroup.CommunityCore","Microsoft.VisualStudio.ProjectSystem.Full","Microsoft.VisualStudio.ProjectSystem","Microsoft.VisualStudio.Community.x86","Microsoft.VisualStudio.Community.x64","Microsoft.VisualStudio.Community","Microsoft.IntelliTrace.CollectorCab","Microsoft.VisualStudio.Community.Resources","Microsoft.VisualStudio.Net.Eula.Resources","Microsoft.VisualStudio.WebSiteProject.DTE","Microsoft.MSHtml","Microsoft.VisualStudio.Platform.CallHierarchy","Microsoft.VisualStudio.Community.Msi.Resources","Microsoft.VisualStudio.Community.Msi","Microsoft.VisualStudio.Devenv.Msi","Microsoft.VisualStudio.MinShell.Interop.Msi","Microsoft.VisualStudio.Editors","Microsoft.VisualStudio.Product.Community","Microsoft.VisualStudio.Workload.CoreEditor","Microsoft.VisualStudio.Component.CoreEditor","Microsoft.VisualStudio.PackageGroup.CoreEditor","Microsoft.VisualCpp.Tools.Common.UtilsPrereq","Microsoft.VisualCpp.Tools.Common.Utils","Microsoft.VisualCpp.Tools.Common.Utils.Resources","Microsoft.VisualStudio.PackageGroup.VsDevCmd","Microsoft.VisualStudio.VsDevCmd.Ext.NetFxSdk","Microsoft.VisualStudio.VsDevCmd.Core.WinSdk","Microsoft.VisualStudio.VsDevCmd.Core.DotNet","Microsoft.VisualStudio.VC.DevCmd","Microsoft.VisualStudio.VC.DevCmd.Resources","Microsoft.VisualStudio.VirtualTree","Microsoft.VisualStudio.PackageGroup.Progression","Microsoft.VisualStudio.PerformanceProvider","Microsoft.VisualStudio.GraphModel","Microsoft.VisualStudio.GraphProvider","Microsoft.DiaSymReader","Microsoft.Build.Dependencies","Microsoft.Build.FileTracker.Msi","Microsoft.Build","Microsoft.VisualStudio.PackageGroup.NuGet","Microsoft.VisualStudio.NuGet.Core","Microsoft.VisualStudio.TextMateGrammars","Microsoft.VisualStudio.PackageGroup.TeamExplorer.Common","Microsoft.VisualStudio.TeamExplorer","Microsoft.ServiceHub","Microsoft.VisualStudio.ProjectServices","Microsoft.VisualStudio.OpenFolder.VSIX","Microsoft.VisualStudio.FileHandler.Msi","Microsoft.VisualStudio.FileHandler.Msi","Microsoft.VisualStudio.PackageGroup.MinShell","Microsoft.VisualStudio.MinShell.Interop","Microsoft.VisualStudio.Log","Microsoft.VisualStudio.Log.Targeted","Microsoft.VisualStudio.Log.Resources","Microsoft.VisualStudio.Finalizer","Microsoft.VisualStudio.Devenv","Microsoft.VisualStudio.Devenv.Resources","Microsoft.VisualStudio.CoreEditor","Microsoft.VisualStudio.Platform.NavigateTo","Microsoft.VisualStudio.Connected","Microsoft.VisualStudio.PerfLib","Microsoft.VisualStudio.Connected.Resources","Microsoft.VisualStudio.MinShell","Microsoft.VisualStudio.Setup.Configuration","Microsoft.VisualStudio.MinShell.Platform","Microsoft.VisualStudio.MinShell.Platform.Resources","Microsoft.VisualStudio.MefHosting","Microsoft.VisualStudio.MefHosting.Resources","Microsoft.VisualStudio.Initializer","Microsoft.VisualStudio.ExtensionManager","Microsoft.VisualStudio.Platform.Editor","Microsoft.VisualStudio.MinShell.x86","Microsoft.VisualStudio.NativeImageSupport","Microsoft.VisualStudio.MinShell.Msi","Microsoft.VisualStudio.MinShell.Msi.Resources","Microsoft.VisualStudio.LanguageServer","Microsoft.VisualStudio.Devenv.Config","Microsoft.VisualStudio.MinShell.Resources","Microsoft.Net.PackageGroup.4.7.2.Redist","Microsoft.Net.4.7.2.FullRedist","Microsoft.VisualStudio.Branding.Community"]}]
    diff --git a/deps/npm/node_modules/node-gyp/test/fixtures/VS_2019_Preview.txt b/deps/npm/node_modules/node-gyp/test/fixtures/VS_2019_Preview.txt
    deleted file mode 100644
    index 806509e7ce8652..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/fixtures/VS_2019_Preview.txt
    +++ /dev/null
    @@ -1 +0,0 @@
    -[{"path":"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Preview","version":"16.0.28608.199","packages":["Microsoft.VisualStudio.Product.Enterprise","Microsoft.VisualStudio.Workload.NativeDesktop","Microsoft.VisualStudio.Component.VC.TestAdapterForGoogleTest","Microsoft.VisualStudio.VC.Ide.TestAdapterForGoogleTest","Microsoft.VisualStudio.Component.VC.TestAdapterForBoostTest","Microsoft.VisualStudio.VC.Ide.TestAdapterForBoostTest","Microsoft.VisualStudio.Component.VC.ATL","Microsoft.VisualStudio.VC.Ide.ATL","Microsoft.VisualStudio.VC.Ide.ATL.Resources","Microsoft.VisualCpp.ATL.X86","Microsoft.VisualCpp.ATL.X64","Microsoft.VisualCpp.ATL.Source","Microsoft.VisualCpp.ATL.Headers","Microsoft.VisualStudio.Component.VC.CMake.Project","Microsoft.VisualStudio.VC.CMake","Microsoft.VisualStudio.VC.CMake.Project","Microsoft.VisualStudio.VC.ExternalBuildFramework","Microsoft.VisualStudio.Component.VC.DiagnosticTools","Microsoft.VisualStudio.Component.Graphics.Tools","Microsoft.VisualStudio.Graphics.Viewers","Microsoft.VisualStudio.Graphics.Viewers.Resources","Microsoft.VisualStudio.Graphics.EnableTools","Microsoft.VisualStudio.Graphics.Msi","Microsoft.VisualStudio.Graphics.Msi","Microsoft.VisualStudio.Graphics.Analyzer","Microsoft.VisualStudio.Graphics.Analyzer.Targeted","Microsoft.VisualStudio.Graphics.Analyzer.Resources","Microsoft.VisualStudio.Graphics.Appid","Microsoft.VisualStudio.Graphics.Appid.Resources","Microsoft.VisualStudio.Component.Windows10SDK.17763","Win10SDK_10.0.17763","Microsoft.VisualStudio.Component.VC.Tools.x86.x64","Microsoft.VisualCpp.CodeAnalysis.Extensions","Microsoft.VisualCpp.CodeAnalysis.Extensions.X86","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X86","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X86.Resources","Microsoft.VisualCpp.CodeAnalysis.Extensions.X64","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X64","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X64.Resources","Microsoft.VisualCpp.Tools.HostX64.TargetX86","Microsoft.VisualCpp.VCTip.HostX64.TargetX86","Microsoft.VisualCpp.Tools.HostX64.TargetX86.Resources","Microsoft.VisualCpp.Tools.HostX64.TargetX64","Microsoft.VisualCpp.VCTip.HostX64.TargetX64","Microsoft.VisualCpp.Tools.HostX64.TargetX64.Resources","Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX64","Microsoft.VisualCpp.Premium.Tools.Hostx86.Targetx64.Resources","Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX86","Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX86.Resources","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX86","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX86.Resources","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX64","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX64.Resources","Microsoft.VisualCpp.PGO.X86","Microsoft.VisualCpp.PGO.X64","Microsoft.VisualCpp.PGO.Headers","Microsoft.VisualCpp.CRT.x86.Store","Microsoft.VisualCpp.CRT.x86.OneCore.Desktop","Microsoft.VisualCpp.CRT.x64.Store","Microsoft.VisualCpp.CRT.x64.OneCore.Desktop","Microsoft.VisualCpp.CRT.Redist.x86.OneCore.Desktop","Microsoft.VisualCpp.CRT.Redist.x64.OneCore.Desktop","Microsoft.VisualStudio.PackageGroup.VC.Tools.x86","Microsoft.VisualCpp.Tools.HostX86.TargetX64","Microsoft.VisualCpp.VCTip.hostX86.targetX64","Microsoft.VisualCpp.Tools.Hostx86.Targetx64.Resources","Microsoft.VisualCpp.Tools.HostX86.TargetX86","Microsoft.VisualCpp.VCTip.hostX86.targetX86","Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources","Microsoft.VisualCpp.Tools.Core.Resources","Microsoft.VisualCpp.Tools.Core.x86","Microsoft.VisualCpp.DIA.SDK","Microsoft.VisualCpp.CRT.x86.Desktop","Microsoft.VisualCpp.CRT.x64.Desktop","Microsoft.VisualCpp.CRT.Source","Microsoft.VisualCpp.CRT.Redist.X86","Microsoft.VisualCpp.CRT.Redist.X64","Microsoft.VisualCpp.CRT.Redist.Resources","Microsoft.VisualCpp.RuntimeDebug.14","Microsoft.VisualCpp.RuntimeDebug.14","Microsoft.VisualCpp.CRT.Headers","Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Core","Microsoft.VisualStudio.PackageGroup.TestTools.Native","Microsoft.VisualStudio.ComponentGroup.ArchitectureTools.Native","Microsoft.VisualStudio.Component.ClassDesigner","Microsoft.VisualStudio.ClassDesigner","Microsoft.VisualStudio.ClassDesigner.Resources","Microsoft.VisualStudio.Component.VC.Redist.14.Latest","Microsoft.VisualCpp.Redist.14.Latest","Microsoft.VisualCpp.Redist.14.Latest","Microsoft.VisualStudio.VC.Templates.UnitTest","Microsoft.VisualStudio.VC.UnitTest.Desktop.Build.Core","Microsoft.VisualStudio.TestTools.TestPlatform.V1.CPP","Microsoft.VisualStudio.VC.Templates.UnitTest.Resources","Microsoft.VisualStudio.VC.Templates.Desktop","Microsoft.VisualStudio.Component.VC.CoreIde","Microsoft.VisualStudio.VC.Ide.Pro","Microsoft.VisualStudio.VC.Ide.Pro.Resources","Microsoft.VisualStudio.VC.Templates.Pro","Microsoft.VisualStudio.VC.Templates.Pro.Resources","Microsoft.VisualStudio.VC.Items.Pro","Microsoft.VisualStudio.PackageGroup.VC.CoreIDE.Reduced","Microsoft.VisualStudio.VC.Ide.x64","Microsoft.VisualStudio.PackageGroup.VC.CoreIDE.Express","Microsoft.VisualStudio.VC.MSBuild.X64.v142","Microsoft.VisualStudio.VC.MSBuild.X64","Microsoft.VS.VC.MSBuild.X64.Resources","Microsoft.VisualStudio.VC.MSBuild.ARM.v142","Microsoft.VisualStudio.VC.MSBuild.ARM","Microsoft.VisualStudio.VC.MSBuild.x86.v142","Microsoft.VisualStudio.VC.MSBuild.X86","Microsoft.VisualStudio.VC.MSBuild.Base","Microsoft.VisualStudio.VC.MSBuild.Base.Resources","Microsoft.VisualStudio.VC.Ide.WinXPlus","Microsoft.VisualStudio.VC.Ide.Dskx","Microsoft.VisualStudio.VC.Ide.Dskx.Resources","Microsoft.VisualStudio.VC.Ide.Base","Microsoft.VisualStudio.VC.Ide.LanguageService","Microsoft.VisualStudio.VC.Ide.Core","Microsoft.VisualStudio.VC.Ide.Core.Resources","Microsoft.VisualStudio.VC.Ide.VCPkgDatabase","Microsoft.VisualStudio.VC.Ide.Progression.Enterprise","Microsoft.VisualStudio.VC.Ide.ProjectSystem","Microsoft.VisualStudio.VC.Ide.ProjectSystem.Resources","Microsoft.VisualStudio.VC.Ide.Core.VCProjectEngine","Microsoft.VisualStudio.VC.Ide.Core.VCProjectEngine.Resources","Microsoft.VisualStudio.VC.Ide.LanguageService.Resources","Microsoft.VisualStudio.VC.Ide.Base.Resources","Microsoft.VisualStudio.Component.CodeMap","Microsoft.VisualStudio.Component.GraphDocument","Microsoft.VisualStudio.Vmp","Microsoft.VisualStudio.GraphDocument","Microsoft.VisualStudio.GraphDocument.Resources","Microsoft.VisualStudio.CodeMap","Microsoft.VisualStudio.Component.SQL.LocalDB.Runtime","Microsoft.VisualStudio.Component.SQL.NCLI","sqllocaldb","sqlncli","Microsoft.VisualStudio.ComponentGroup.WebToolsExtensions","Microsoft.VisualStudio.WebToolsExtensions","Microsoft.VisualStudio.WebTools","Microsoft.VisualStudio.WebTools.Resources","Microsoft.VisualStudio.WebTools.MSBuild","Microsoft.VisualStudio.PackageGroup.Debugger.Script","Microsoft.VisualStudio.Debugger.Script.Msi","Microsoft.VisualStudio.Debugger.Script","Microsoft.VisualStudio.Debugger.Script","Microsoft.VisualStudio.Debugger.Script.Resources","Microsoft.VisualStudio.Debugger.Script.Resources","Microsoft.VisualStudio.VC.Ide.MDD","Microsoft.VisualStudio.Component.NuGet","Microsoft.CredentialProvider","Component.Microsoft.VisualStudio.LiveShare","Microsoft.VisualStudio.LiveShare","Microsoft.VisualStudio.Component.Debugger.JustInTime","Microsoft.VisualStudio.Debugger.ImmersiveActivateHelper.Msi","Microsoft.VisualStudio.Debugger.JustInTime","Microsoft.VisualStudio.Debugger.JustInTime.Msi","Microsoft.VisualStudio.Component.IntelliTrace.FrontEnd","Microsoft.IntelliTrace.DiagnosticsHubAgent.Targeted","Microsoft.IntelliTrace.Debugger","Microsoft.IntelliTrace.Debugger.Targeted","Microsoft.IntelliTrace.FrontEnd","Microsoft.DiagnosticsHub.Instrumentation","Microsoft.DiagnosticsHub.CpuSampling","Microsoft.DiagnosticsHub.CpuSampling.Targeted","Microsoft.PackageGroup.DiagnosticsHub.Platform","Microsoft.DiagnosticsHub.Collection.StopService.Uninstall","Microsoft.DiagnosticsHub.Runtime","Microsoft.DiagnosticsHub.Runtime.Targeted","Microsoft.DiagnosticsHub.Runtime.Resources","Microsoft.DiagnosticsHub.Collection","Microsoft.DiagnosticsHub.Collection.Service","Microsoft.DiagnosticsHub.Collection.StopService.Install","Microsoft.VisualStudio.Dsl.GraphObject","Microsoft.Net.4.TargetingPack","Microsoft.VisualStudio.VC.Ide.ResourceEditor","Microsoft.VisualStudio.VC.Ide.ResourceEditor.Resources","Microsoft.VisualStudio.NuGet.Licenses","Microsoft.WebTools.Shared","Microsoft.VisualStudio.WebToolsExtensions.DotNet.Core.ItemTemplates","Microsoft.VisualStudio.Component.TextTemplating","Microsoft.VisualStudio.TextTemplating.MSBuild","Microsoft.VisualStudio.TextTemplating.Integration","Microsoft.VisualStudio.TextTemplating.Core","Microsoft.VisualStudio.TextTemplating.Integration.Resources","Microsoft.VisualStudio.ProTools","sqlsysclrtypes","sqlsysclrtypes","SQLCommon","Microsoft.VisualStudio.ProTools.Resources","Microsoft.VisualStudio.NuGet.Core","Microsoft.VisualStudio.PackageGroup.TestTools.CodeCoverage","Microsoft.VisualStudio.PackageGroup.IntelliTrace.Core","Microsoft.IntelliTrace.Core","Microsoft.IntelliTrace.Core.Concord","Microsoft.IntelliTrace.Core.Targeted","Microsoft.IntelliTrace.ProfilerProxy.Msi.x64","Microsoft.IntelliTrace.ProfilerProxy.Msi","Microsoft.VisualStudio.TestTools.DynamicCodeCoverage","Microsoft.VisualStudio.TestTools.CodeCoverage.Msi","Microsoft.VisualStudio.TestTools.CodeCoverage","Microsoft.Icecap.Analysis","Microsoft.Icecap.Analysis.Targeted","Microsoft.Icecap.Analysis.Resources","Microsoft.Icecap.Analysis.Resources.Targeted","Microsoft.Icecap.Collection.Msi","Microsoft.Icecap.Collection.Msi.Targeted","Microsoft.Icecap.Collection.Msi.Resources","Microsoft.Icecap.Collection.Msi.Resources.Targeted","Microsoft.VisualStudio.PackageGroup.TestTools.Core","Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.V2.CLI","Microsoft.VisualStudio.TestTools.TestPlatform.V2.CLI","Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.V1.CLI","Microsoft.VisualStudio.TestTools.TestPlatform.V1.CLI","Microsoft.VisualStudio.TestTools.Pex.Common","Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.Legacy","Microsoft.VisualStudio.PackageGroup.MinShell.Interop","Microsoft.VisualStudio.TestTools.TP.Legacy.Tips.Msi","Microsoft.VisualStudio.TestTools.TP.Legacy.Tips.Common","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Tips","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Tips.Resources","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.TestTools","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Remote","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Professional","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Core.Premium","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Common","Microsoft.VisualStudio.TestTools.TP.Legacy.Common.Res","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Core","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Core.Resources","Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Agent","Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.IDE","Microsoft.VisualStudio.TestTools.TestWIExtension","Microsoft.VisualStudio.TestTools.TestPlatform.IDE","Microsoft.VisualStudio.PackageGroup.TestTools.DataCollectors","Microsoft.VisualStudio.TestTools.NE.Msi.Targeted","Microsoft.VisualStudio.TestTools.NetworkEmulation","Microsoft.VisualStudio.TestTools.DataCollectors","Microsoft.VisualCpp.CRT.ClickOnce.Msi","Microsoft.VisualStudio.WebTools.WSP.FSA","Microsoft.VisualStudio.WebTools.WSP.FSA.Resources","Microsoft.VisualStudio.Component.Static.Analysis.Tools","Microsoft.VisualCpp.Redist.14","Microsoft.VisualCpp.Redist.14","Microsoft.VisualStudio.StaticAnalysis","Microsoft.VisualStudio.StaticAnalysis.Resources","Microsoft.VisualStudio.PackageGroup.Community","Microsoft.VisualStudio.Community.Extra.Resources","Microsoft.VisualStudio.Community.Extra","Microsoft.VisualStudio.PackageGroup.Core","Microsoft.VisualStudio.CodeSense","Microsoft.VisualStudio.CodeSense.Community","Microsoft.VisualStudio.TestTools.TeamFoundationClient","Microsoft.VisualStudio.PackageGroup.Debugger.Core","Microsoft.VisualStudio.PackageGroup.Debugger.TimeTravel.Record","Microsoft.VisualStudio.Debugger.TimeTravel.Runtime","Microsoft.VisualStudio.Debugger.TimeTravel.Runtime","Microsoft.VisualStudio.Debugger.TimeTravel.Agent","Microsoft.VisualStudio.Debugger.TimeTravel.Record","Microsoft.VisualStudio.Debugger.VSCodeDebuggerHost","Microsoft.VisualStudio.VC.Ide.Debugger","Microsoft.VisualStudio.VC.Ide.Debugger.Concord","Microsoft.VisualStudio.VC.Ide.Debugger.Concord.Resources","Microsoft.VisualStudio.VC.Ide.Debugger.Resources","Microsoft.VisualStudio.VC.Ide.Common","Microsoft.VisualStudio.VC.Ide.Common.Resources","Microsoft.VisualStudio.Debugger.Parallel","Microsoft.VisualStudio.Debugger.Parallel.Resources","Microsoft.VisualStudio.Debugger.CollectionAgents","Microsoft.VisualStudio.Debugger.Managed","Microsoft.VisualStudio.Debugger.Concord.Managed","Microsoft.VisualStudio.Debugger.Concord.Managed.Resources","Microsoft.VisualStudio.Debugger.Managed.Resources","Microsoft.VisualStudio.Debugger.Remote","Microsoft.VisualStudio.Debugger.Concord.Remote","Microsoft.VisualStudio.Debugger.Concord.Remote.Resources","Microsoft.VisualStudio.Debugger.Remote","Microsoft.VisualStudio.Debugger.Concord.Remote","Microsoft.VisualStudio.Debugger.Concord.Remote.Resources","Microsoft.VisualStudio.Debugger.Remote.Resources","Microsoft.VisualStudio.Debugger.Remote.Resources","Microsoft.VisualStudio.Debugger","Microsoft.VisualStudio.Debugger.Package.DiagHub.Client.VSx86","Microsoft.VisualStudio.Debugger.Remote.DiagHub.Client","Microsoft.VisualStudio.Debugger.Remote.DiagHub.Client","Microsoft.VisualStudio.VC.MSVCDis","Microsoft.VisualStudio.ScriptedHost","Microsoft.VisualStudio.ScriptedHost.Targeted","Microsoft.VisualStudio.ScriptedHost.Resources","Microsoft.IntelliTrace.DiagnosticsHub","Microsoft.VisualStudio.Debugger.Concord","Microsoft.VisualStudio.Debugger.Concord.Resources","Microsoft.VisualStudio.Debugger.Resources","Microsoft.PackageGroup.ClientDiagnostics","Microsoft.VisualStudio.AppResponsiveness","Microsoft.VisualStudio.AppResponsiveness.Targeted","Microsoft.VisualStudio.AppResponsiveness.Resources","Microsoft.VisualStudio.ClientDiagnostics","Microsoft.VisualStudio.ClientDiagnostics.Targeted","Microsoft.VisualStudio.ClientDiagnostics.Resources","Microsoft.VisualStudio.PackageGroup.ProfessionalCore","Microsoft.VisualStudio.Professional","Microsoft.VisualStudio.Professional.Msi","Microsoft.VisualStudio.PackageGroup.EnterpriseCore","Microsoft.VisualStudio.Enterprise.Msi","Microsoft.VisualStudio.Enterprise","Microsoft.ShDocVw","Microsoft.VisualStudio.PackageGroup.CommunityCore","Microsoft.VisualStudio.ProjectSystem.Full","Microsoft.VisualStudio.ProjectSystem","Microsoft.VisualStudio.Community.x86","Microsoft.VisualStudio.Community.x64","Microsoft.VisualStudio.Community","Microsoft.IntelliTrace.CollectorCab","Microsoft.VisualStudio.Community.Resources","Microsoft.VisualStudio.WebSiteProject.DTE","Microsoft.MSHtml","Microsoft.VisualStudio.Platform.CallHierarchy","Microsoft.VisualStudio.Community.Msi.Resources","Microsoft.VisualStudio.Community.Msi","Microsoft.VisualStudio.Devenv.Msi","Microsoft.VisualStudio.MinShell.Interop.Msi","Microsoft.VisualStudio.Editors","Microsoft.VisualStudio.Net.Eula.Resources","Microsoft.CodeAnalysis.ExpressionEvaluator","Microsoft.CodeAnalysis.VisualStudio.Setup","Microsoft.Component.MSBuild","Microsoft.NuGet.Build.Tasks","Microsoft.VisualStudio.Component.Roslyn.Compiler","Microsoft.CodeAnalysis.Compilers","Microsoft.VisualStudio.Workload.CoreEditor","Microsoft.VisualStudio.Component.CoreEditor","Microsoft.VisualStudio.PackageGroup.CoreEditor","Microsoft.VisualCpp.Tools.Common.UtilsPrereq","Microsoft.VisualCpp.Tools.Common.Utils","Microsoft.VisualCpp.Tools.Common.Utils.Resources","Microsoft.VisualStudio.PackageGroup.VsDevCmd","Microsoft.VisualStudio.VsDevCmd.Ext.NetFxSdk","Microsoft.VisualStudio.VsDevCmd.Core.WinSdk","Microsoft.VisualStudio.VsDevCmd.Core.DotNet","Microsoft.VisualStudio.VC.DevCmd","Microsoft.VisualStudio.VC.DevCmd.Resources","Microsoft.VisualStudio.VirtualTree","Microsoft.VisualStudio.PackageGroup.Progression","Microsoft.VisualStudio.PerformanceProvider","Microsoft.VisualStudio.GraphModel","Microsoft.VisualStudio.GraphProvider","Microsoft.DiaSymReader","Microsoft.Build.Dependencies","Microsoft.Build.FileTracker.Msi","Microsoft.Build","Microsoft.VisualStudio.TextMateGrammars","Microsoft.VisualStudio.PackageGroup.TeamExplorer.Common","Microsoft.VisualStudio.TeamExplorer","Microsoft.ServiceHub","Microsoft.VisualStudio.ProjectServices","Microsoft.VisualStudio.SLNX.VSIX","Microsoft.VisualStudio.FileHandler.Msi","Microsoft.VisualStudio.FileHandler.Msi","Microsoft.VisualStudio.PackageGroup.MinShell","Microsoft.VisualStudio.MinShell.Interop","Microsoft.VisualStudio.Log","Microsoft.VisualStudio.Log.Targeted","Microsoft.VisualStudio.Log.Resources","Microsoft.VisualStudio.Finalizer","Microsoft.VisualStudio.Devenv","Microsoft.VisualStudio.Devenv.Resources","Microsoft.VisualStudio.CoreEditor","Microsoft.VisualStudio.Platform.NavigateTo","Microsoft.VisualStudio.Connected","Microsoft.VisualStudio.Connected.Resources","Microsoft.VisualStudio.MinShell","Microsoft.VisualStudio.Setup.Configuration","Microsoft.VisualStudio.Platform.Search","Microsoft.VisualStudio.MinShell.Platform","Microsoft.VisualStudio.MinShell.Platform.Resources","Microsoft.VisualStudio.MefHosting","Microsoft.VisualStudio.MefHosting.Resources","Microsoft.VisualStudio.Initializer","Microsoft.VisualStudio.ExtensionManager","Microsoft.VisualStudio.Platform.Editor","Microsoft.VisualStudio.MinShell.x86","Microsoft.VisualStudio.NativeImageSupport","Microsoft.VisualStudio.MinShell.Msi","Microsoft.VisualStudio.MinShell.Msi.Resources","Microsoft.VisualStudio.LanguageServer","Microsoft.VisualStudio.Devenv.Config","Microsoft.VisualStudio.MinShell.Resources","Microsoft.Net.PackageGroup.4.7.2.Redist","Microsoft.VisualStudio.Branding.Enterprise"]}]
    diff --git a/deps/npm/node_modules/node-gyp/test/fixtures/VS_2022_Community_workload.txt b/deps/npm/node_modules/node-gyp/test/fixtures/VS_2022_Community_workload.txt
    deleted file mode 100644
    index 7cd20f85989261..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/fixtures/VS_2022_Community_workload.txt
    +++ /dev/null
    @@ -1,569 +0,0 @@
    -[
    -    {
    -        "path": "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community",
    -        "version": "17.4.33213.308",
    -        "packages": [
    -            "Microsoft.VisualStudio.Product.Community",
    -            "Microsoft.VisualStudio.PackageGroup.LiveShare.VSCore",
    -            "Microsoft.VisualStudio.LiveShare.VSCore",
    -            "Microsoft.VisualStudio.Workload.NativeDesktop",
    -            "Microsoft.VisualStudio.Component.VC.ASAN",
    -            "Microsoft.VisualCpp.ASAN.X86",
    -            "Microsoft.VC.14.34.17.4.ASAN.X86.base",
    -            "Microsoft.VC.14.34.17.4.ASAN.X64.base",
    -            "Microsoft.VC.14.34.17.4.ASAN.Headers.base",
    -            "Microsoft.VisualStudio.VC.IDE.Project.Factories",
    -            "Microsoft.VisualStudio.Component.VC.TestAdapterForGoogleTest",
    -            "Microsoft.VisualStudio.VC.Ide.TestAdapterForGoogleTest",
    -            "Microsoft.VisualStudio.Component.VC.TestAdapterForBoostTest",
    -            "Microsoft.VisualStudio.VC.Ide.TestAdapterForBoostTest",
    -            "Microsoft.VisualStudio.Component.VC.CMake.Project",
    -            "Microsoft.VisualStudio.ComponentGroup.WebToolsExtensions.CMake",
    -            "Microsoft.VisualStudio.VC.CMake",
    -            "Microsoft.VisualStudio.VC.CMake.Project",
    -            "Microsoft.VisualStudio.VC.CMake.Client",
    -            "Microsoft.VisualStudio.VC.ExternalBuildFramework",
    -            "Microsoft.VisualStudio.Component.VC.DiagnosticTools",
    -            "Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Core",
    -            "Microsoft.VisualStudio.PackageGroup.TestTools.Native",
    -            "Microsoft.VisualStudio.Component.VC.Redist.14.Latest",
    -            "Microsoft.VisualStudio.VC.Templates.UnitTest",
    -            "Microsoft.VisualStudio.VC.UnitTest.Desktop.Build.Core",
    -            "Microsoft.VisualStudio.TestTools.TestPlatform.V1.CPP",
    -            "Microsoft.VisualStudio.VC.Templates.UnitTest.Resources",
    -            "Microsoft.VisualStudio.VC.Templates.Desktop",
    -            "Microsoft.VisualStudio.Component.Graphics",
    -            "Microsoft.VisualStudio.Graphics.Viewers",
    -            "Microsoft.VisualStudio.Graphics.Viewers.Resources",
    -            "Microsoft.VisualStudio.Component.VC.ATL.ARM64",
    -            "Microsoft.VisualCpp.ATL.ARM64",
    -            "Microsoft.VC.14.34.17.4.ATL.ARM64.base",
    -            "Microsoft.VisualStudio.Component.VC.ATL",
    -            "Microsoft.VisualStudio.VC.Ide.ATL",
    -            "Microsoft.VisualStudio.VC.Ide.ATL.Resources",
    -            "Microsoft.VisualCpp.ATL.X86",
    -            "Microsoft.VC.14.34.17.4.ATL.X86.base",
    -            "Microsoft.VisualCpp.ATL.X64",
    -            "Microsoft.VC.14.34.17.4.ATL.X64.base",
    -            "Microsoft.VC.14.34.17.4.Props.ATLMFC",
    -            "Microsoft.VisualCpp.ATL.Source",
    -            "Microsoft.VC.14.34.17.4.ATL.Source.base",
    -            "Microsoft.VisualCpp.ATL.Headers",
    -            "Microsoft.VC.14.34.17.4.ATL.Headers.base",
    -            "Microsoft.VC.14.34.17.4.Servicing.ATL",
    -            "Microsoft.VisualStudio.Component.VC.Tools.ARM64",
    -            "Microsoft.VisualStudio.VC.MSBuild.v170.ARM64.v143",
    -            "Microsoft.VisualStudio.VC.MSBuild.v170.ARM64",
    -            "Microsoft.VS.VC.vcvars.arm64.Shortcuts",
    -            "Microsoft.VisualCpp.CA.Ext.Hostx64.TargetARM64",
    -            "Microsoft.VC.14.34.17.4.CA.Ext.Hostx64.TargetARM64.base",
    -            "Microsoft.VC.14.34.17.4.CA.Ext.Hostx64.TargetARM64.Res.base",
    -            "Microsoft.VisualCpp.CA.Ext.Hostx86.TargetARM64",
    -            "Microsoft.VC.14.34.17.4.CA.Ext.Hostx86.TargetARM64.base",
    -            "Microsoft.VC.14.34.17.4.CA.Ext.Hostx86.TargetARM64.Res.base",
    -            "Microsoft.VisualCpp.CA.Ext.HostARM64.TargetARM64",
    -            "Microsoft.VC.14.34.17.4.CA.Ext.HostARM64.TargetARM64.base",
    -            "Microsoft.VC.14.34.17.4.CA.Ext.HostARM64.TargetARM64.Res.base",
    -            "Microsoft.VisualCpp.Tools.Hostx86.Targetarm64",
    -            "Microsoft.VC.14.34.17.4.Tools.Hostx86.Targetarm64.base",
    -            "Microsoft.VC.14.34.17.4.Tools.HostX86.TargetARM64.Res.base",
    -            "Microsoft.VisualCpp.Tools.HostARM64.TargetARM64",
    -            "Microsoft.VC.14.34.17.4.Tools.HostARM64.TargetARM64.base",
    -            "Microsoft.VC.14.34.17.4.Tools.HostARM64.TargetARM64.Res.base",
    -            "Microsoft.VisualCpp.CRT.Redist.ARM64.OneCore.Desktop",
    -            "Microsoft.VC.14.34.17.4.CRT.Redist.ARM64.OneCore.Desktop.base",
    -            "Microsoft.VisualCpp.CRT.Redist.ARM64",
    -            "Microsoft.VC.14.34.17.4.CRT.Redist.ARM64.base",
    -            "Microsoft.VisualCpp.CRT.ARM64.OneCore.Desktop",
    -            "Microsoft.VC.14.34.17.4.CRT.ARM64.OneCore.Desktop.base",
    -            "Microsoft.VC.14.34.17.4.CRT.ARM64.OneCore.Desktop.debug.base",
    -            "Microsoft.VisualCpp.CRT.ARM64.Store",
    -            "Microsoft.VC.14.34.17.4.CRT.ARM64.Store.base",
    -            "Microsoft.VisualCpp.CRT.ARM64.Desktop",
    -            "Microsoft.VC.14.34.17.4.CRT.ARM64.Desktop.base",
    -            "Microsoft.VC.14.34.17.4.CRT.ARM64.Desktop.debug.base",
    -            "Microsoft.VisualStudio.PackageGroup.VC.Tools.x64.ARM64",
    -            "Microsoft.VisualCpp.Tools.Core",
    -            "Microsoft.VisualCpp.PGO.ARM64",
    -            "Microsoft.VC.14.34.17.4.PGO.ARM64.base",
    -            "Microsoft.VisualCpp.Premium.Tools.Hostx86.Targetarm64",
    -            "Microsoft.VC.14.34.17.4.Premium.Tools.Hostx86.Targetarm64.base",
    -            "Microsoft.VC.14.34.17.4.Prem.HostX86.TargetARM64.Res.base",
    -            "Microsoft.VisualCpp.Premium.Tools.HostX64.TargetARM64",
    -            "Microsoft.VC.14.34.17.4.Premium.Tools.HostX64.TargetARM64.base",
    -            "Microsoft.VC.14.34.17.4.Prem.HostX64.TargetARM64.Res.base",
    -            "Microsoft.VisualCpp.Premium.Tools.ARM64.Base",
    -            "Microsoft.VC.14.34.17.4.Premium.Tools.ARM64.Base.base",
    -            "Microsoft.VisualCpp.Tools.HostX64.TargetARM64",
    -            "Microsoft.VC.14.34.17.4.Tools.HostX64.TargetARM64.base",
    -            "Microsoft.VC.14.34.17.4.Props.ARM64",
    -            "Microsoft.VC.14.34.17.4.Tools.HostX64.TargetARM64.Res.base",
    -            "Microsoft.VisualStudio.Component.VC.Tools.ARM64EC",
    -            "Microsoft.VisualStudio.Component.Windows11SDK.22621",
    -            "Win11SDK_10.0.22621",
    -            "Microsoft.VisualStudio.VC.MSBuild.v170.ARM64EC.v143",
    -            "Microsoft.VisualStudio.VC.MSBuild.v170.ARM64EC",
    -            "Microsoft.VisualCpp.CRT.ARM64EC.Store",
    -            "Microsoft.VC.14.34.17.4.CRT.ARM64EC.Store.base",
    -            "Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
    -            "Microsoft.VisualCpp.CodeAnalysis.Extensions",
    -            "Microsoft.VisualCpp.CA.Ext.HostARM64.Targetx64",
    -            "Microsoft.VC.14.34.17.4.CA.Ext.HostARM64.Targetx64.base",
    -            "Microsoft.VC.14.34.17.4.CA.Ext.HostARM64.Targetx64.Res.base",
    -            "Microsoft.VisualCpp.CA.Ext.HostARM64.Targetx86",
    -            "Microsoft.VC.14.34.17.4.CA.Ext.HostARM64.Targetx86.base",
    -            "Microsoft.VC.14.34.17.4.CA.Ext.HostARM64.Targetx86.Res.base",
    -            "Microsoft.VisualCpp.CA.Ext.Hostx86.Targetx64",
    -            "Microsoft.VC.14.34.17.4.CA.Ext.Hostx86.Targetx64.base",
    -            "Microsoft.VC.14.34.17.4.CA.Ext.Hostx86.Targetx64.Res.base",
    -            "Microsoft.VisualCpp.CA.Ext.Hostx86.Targetx86",
    -            "Microsoft.VC.14.34.17.4.CA.Ext.Hostx86.Targetx86.base",
    -            "Microsoft.VC.14.34.17.4.CA.Ext.Hostx86.Targetx86.Res.base",
    -            "Microsoft.VisualCpp.CA.Ext.Hostx64.Targetx64",
    -            "Microsoft.VC.14.34.17.4.CA.Ext.Hostx64.Targetx64.base",
    -            "Microsoft.VC.14.34.17.4.CA.Ext.Hostx64.Targetx64.Res.base",
    -            "Microsoft.VisualCpp.CA.Ext.Hostx64.Targetx86",
    -            "Microsoft.VC.14.34.17.4.CA.Ext.Hostx64.Targetx86.base",
    -            "Microsoft.VC.14.34.17.4.Servicing.CAExtensions",
    -            "Microsoft.VC.14.34.17.4.CA.Ext.Hostx64.Targetx86.Res.base",
    -            "Microsoft.VisualCpp.Tools.HostX64.TargetX86",
    -            "Microsoft.VC.14.34.17.4.Tools.HostX64.TargetX86.base",
    -            "Microsoft.VC.14.34.17.4.Tools.HostX64.TargetX86.Res.base",
    -            "Microsoft.VisualCpp.Tools.HostX64.TargetX64",
    -            "Microsoft.VC.14.34.17.4.Tools.HostX64.TargetX64.base",
    -            "Microsoft.VC.14.34.17.4.Tools.HostX64.TargetX64.Res.base",
    -            "Microsoft.VisualCpp.Tools.HostARM64.TargetX86",
    -            "Microsoft.VC.14.34.17.4.Tools.HostARM64.TargetX86.base",
    -            "Microsoft.VisualCpp.RuntimeDebug.14",
    -            "Microsoft.VC.14.34.17.4.Tools.HostARM64.TargetX86.Res.base",
    -            "Microsoft.VisualCpp.Tools.HostARM64.TargetX64",
    -            "Microsoft.VC.14.34.17.4.Tools.HostARM64.TargetX64.base",
    -            "Microsoft.VisualCpp.RuntimeDebug.14.ARM64",
    -            "Microsoft.VisualCpp.Redist.14.Latest",
    -            "Microsoft.VisualCpp.Redist.14.Latest",
    -            "Microsoft.VC.14.34.17.4.Tools.HostARM64.Targetx64.Res.base",
    -            "Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX64",
    -            "Microsoft.VC.14.34.17.4.Premium.Tools.HostX86.TargetX64.base",
    -            "Microsoft.VC.14.34.17.4.Prem.Hostx86.Targetx64.Res.base",
    -            "Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX86",
    -            "Microsoft.VC.14.34.17.4.Premium.Tools.HostX86.TargetX86.base",
    -            "Microsoft.VC.14.34.17.4.Prem.HostX86.TargetX86.Res.base",
    -            "Microsoft.VisualCpp.Premium.Tools.HostARM64.TargetX86",
    -            "Microsoft.VC.14.34.17.4.Premium.Tools.HostARM64.TargetX86.base",
    -            "Microsoft.VC.14.34.17.4.Prem.HostARM64.TargetX86.Res.base",
    -            "Microsoft.VisualCpp.Premium.Tools.HostARM64.TargetX64",
    -            "Microsoft.VC.14.34.17.4.Premium.Tools.HostARM64.TargetX64.base",
    -            "Microsoft.VC.14.34.17.4.Prem.HostARM64.Targetx64.Res.base",
    -            "Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX86",
    -            "Microsoft.VC.14.34.17.4.Premium.Tools.HostX64.TargetX86.base",
    -            "Microsoft.VC.14.34.17.4.Prem.HostX64.TargetX86.Res.base",
    -            "Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX64",
    -            "Microsoft.VC.14.34.17.4.Premium.Tools.HostX64.TargetX64.base",
    -            "Microsoft.VC.14.34.17.4.Prem.HostX64.TargetX64.Res.base",
    -            "Microsoft.VisualCpp.PGO.X86",
    -            "Microsoft.VC.14.34.17.4.PGO.X86.base",
    -            "Microsoft.VisualCpp.PGO.X64",
    -            "Microsoft.VC.14.34.17.4.PGO.X64.base",
    -            "Microsoft.VisualCpp.PGO.Headers",
    -            "Microsoft.VC.14.34.17.4.PGO.Headers.base",
    -            "Microsoft.VisualCpp.CRT.x86.Store",
    -            "Microsoft.VC.14.34.17.4.CRT.x86.Store.base",
    -            "Microsoft.VisualCpp.CRT.x86.OneCore.Desktop",
    -            "Microsoft.VC.14.34.17.4.CRT.x86.OneCore.Desktop.base",
    -            "Microsoft.VisualCpp.CRT.x64.Store",
    -            "Microsoft.VC.14.34.17.4.CRT.x64.Store.base",
    -            "Microsoft.VisualCpp.CRT.x64.OneCore.Desktop",
    -            "Microsoft.VC.14.34.17.4.CRT.x64.OneCore.Desktop.base",
    -            "Microsoft.VisualCpp.CRT.Redist.x86.OneCore.Desktop",
    -            "Microsoft.VC.14.34.17.4.CRT.Redist.x86.OneCore.Desktop.base",
    -            "Microsoft.VisualCpp.CRT.Redist.x64.OneCore.Desktop",
    -            "Microsoft.VC.14.34.17.4.CRT.Redist.x64.OneCore.Desktop.base",
    -            "Microsoft.VisualStudio.PackageGroup.VC.Tools.x86",
    -            "Microsoft.VisualCpp.Tools.Hostx86.Targetx64.Res",
    -            "Microsoft.VisualCpp.Tools.HostX86.TargetX64",
    -            "Microsoft.VC.14.34.17.4.Tools.HostX86.TargetX64.base",
    -            "Microsoft.VC.14.34.17.4.Props.x64",
    -            "Microsoft.VC.14.34.17.4.Tools.Hostx86.Targetx64.Res.base",
    -            "Microsoft.VisualCpp.Tools.HostX86.TargetX86.Res",
    -            "Microsoft.VisualCpp.Tools.HostX86.TargetX86",
    -            "Microsoft.VC.14.34.17.4.Tools.HostX86.TargetX86.base",
    -            "Microsoft.VC.14.34.17.4.Servicing.Compilers",
    -            "Microsoft.VC.14.34.17.4.Props.x86",
    -            "Microsoft.VC.14.34.17.4.Props",
    -            "Microsoft.VC.14.34.17.4.Tools.HostX86.TargetX86.Res.base",
    -            "Microsoft.VisualCpp.Tools.Core.Resources",
    -            "Microsoft.VisualCpp.Tools.Core.x86",
    -            "Microsoft.VC.14.34.17.4.Tools.Core.Props",
    -            "Microsoft.VisualCpp.DIA.SDK",
    -            "Microsoft.VisualCpp.Servicing.DIASDK",
    -            "Microsoft.VisualCpp.CRT.x86.Desktop",
    -            "Microsoft.VC.14.34.17.4.CRT.x86.Desktop.base",
    -            "Microsoft.VisualCpp.CRT.x64.Desktop",
    -            "Microsoft.VC.14.34.17.4.CRT.x64.Desktop.base",
    -            "Microsoft.VisualCpp.CRT.Source",
    -            "Microsoft.VC.14.34.17.4.CRT.Source.base",
    -            "Microsoft.VisualCpp.CRT.Redist.X86",
    -            "Microsoft.VC.14.34.17.4.CRT.Redist.X86.base",
    -            "Microsoft.VisualCpp.CRT.Redist.X64",
    -            "Microsoft.VisualCpp.CRT.Redist.Resources",
    -            "Microsoft.VC.14.34.17.4.CRT.Redist.X64.base",
    -            "Microsoft.VisualCpp.CRT.Headers",
    -            "Microsoft.VC.14.34.17.4.CRT.Headers.base",
    -            "Microsoft.VC.14.34.17.4.Servicing.CrtHeaders",
    -            "Microsoft.VC.14.34.17.4.Servicing",
    -            "Microsoft.VisualStudio.Component.VC.CoreIde",
    -            "Microsoft.VisualStudio.VC.Ide.Pro",
    -            "Microsoft.VisualStudio.VC.Ide.Pro.Resources",
    -            "Microsoft.VisualStudio.VC.Templates.General",
    -            "Microsoft.VisualStudio.VC.Templates.General.Resources",
    -            "Microsoft.VisualStudio.VC.Items.Pro",
    -            "Microsoft.VisualStudio.PackageGroup.VC.CoreIDE.Reduced",
    -            "Microsoft.VisualStudio.VC.Ide.x64",
    -            "Microsoft.VisualStudio.PackageGroup.VC.CoreIDE.Express",
    -            "Microsoft.VisualStudio.VC.vcvars",
    -            "Microsoft.VS.VC.vcvars.x86.Shortcuts",
    -            "Microsoft.VS.VC.vcvars.x64.Shortcuts",
    -            "Microsoft.VS.VC.vcvars.arm64_x64.Shortcuts",
    -            "Microsoft.VisualStudio.VC.MSBuild.v170.X64.v143",
    -            "Microsoft.VisualStudio.VC.MSBuild.v170.X64",
    -            "Microsoft.VisualStudio.VC.MSBuild.v170.ARM.v143",
    -            "Microsoft.VisualStudio.VC.MSBuild.v170.ARM",
    -            "Microsoft.VisualStudio.VC.MSBuild.v170.x86.v143",
    -            "Microsoft.VisualStudio.VC.MSBuild.v170.X86",
    -            "Microsoft.VisualStudio.VC.MSBuild.v170.Base",
    -            "Microsoft.VisualStudio.VC.MSBuild.v170.Base.Resources",
    -            "Microsoft.VisualStudio.VC.Ide.WinXPlus",
    -            "Microsoft.VisualStudio.VC.Ide.Dskx",
    -            "Microsoft.VisualStudio.VC.Ide.Dskx.Resources",
    -            "Microsoft.VisualStudio.VC.Ide.Base",
    -            "Microsoft.VisualStudio.VC.Ide.LanguageService",
    -            "Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.Scripts",
    -            "Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.PythonDistro",
    -            "Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.3rdPartyLibs.10",
    -            "Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.3rdPartyLibs.9",
    -            "Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.3rdPartyLibs.8",
    -            "Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.3rdPartyLibs.7",
    -            "Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.3rdPartyLibs.6",
    -            "Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.3rdPartyLibs.5",
    -            "Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.3rdPartyLibs.4",
    -            "Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.3rdPartyLibs.3",
    -            "Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.3rdPartyLibs.2",
    -            "Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.3rdPartyLibs.1",
    -            "Microsoft.VisualStudio.VC.Ide.VCPkgDatabase",
    -            "Microsoft.VisualStudio.VC.Ide.Core",
    -            "Microsoft.VisualStudio.VC.Ide.ProjectSystem",
    -            "Microsoft.VisualStudio.VC.Ide.ProjectSystem.Resources",
    -            "Microsoft.VisualStudio.VC.Ide.Core.VCProjectEngine",
    -            "Microsoft.VisualStudio.VC.Ide.Core.VCProjectEngine.Resources",
    -            "Microsoft.VisualStudio.VC.Ide.LanguageService.Resources",
    -            "Microsoft.VisualStudio.VC.Llvm.Base",
    -            "Microsoft.VisualStudio.VC.Ide.Base.Resources",
    -            "Microsoft.Net.PackageGroup.4.8.1.Redist",
    -            "Microsoft.VisualStudio.Component.IntelliCode",
    -            "Microsoft.VisualStudio.IntelliCode.CSharp",
    -            "Microsoft.VisualStudio.IntelliCode",
    -            "Component.Microsoft.VisualStudio.LiveShare.2022",
    -            "Microsoft.VisualStudio.Component.Debugger.JustInTime",
    -            "Microsoft.VisualStudio.Debugger.ImmersiveActivateHelper.Msi",
    -            "Microsoft.VisualStudio.Debugger.JustInTime",
    -            "Microsoft.VisualStudio.Debugger.JustInTime.Msi",
    -            "Microsoft.VisualStudio.LiveShare.2022",
    -            "Microsoft.Icecap.Analysis",
    -            "Microsoft.Icecap.Analysis.Resources",
    -            "Microsoft.Icecap.Analysis.Resources.Targeted",
    -            "Microsoft.Icecap.Collection.Msi",
    -            "Microsoft.Icecap.Collection.Msi.Targeted",
    -            "Microsoft.Icecap.Collection.Msi.Resources",
    -            "Microsoft.Icecap.Collection.Msi.Resources.Targeted",
    -            "Microsoft.DiagnosticsHub.Instrumentation",
    -            "Microsoft.DiagnosticsHub.Instrumentation.Targeted",
    -            "Microsoft.DiagnosticsHub.CpuSampling",
    -            "Microsoft.DiagnosticsHub.CpuSampling.Targeted",
    -            "Microsoft.PackageGroup.DiagnosticsHub.Platform",
    -            "Microsoft.VisualStudio.InstrumentationEngine.ARM64",
    -            "Microsoft.VisualStudio.InstrumentationEngine",
    -            "Microsoft.DiagnosticsHub.Runtime.ExternalDependencies",
    -            "SQLiteCore",
    -            "SQLiteCore.Targeted",
    -            "Microsoft.DiagnosticsHub.Runtime.ExternalDependencies.Targeted",
    -            "Microsoft.DiagnosticsHub.Runtime",
    -            "Microsoft.DiagnosticsHub.Runtime.Targeted",
    -            "Microsoft.DiagnosticsHub.Collection.ExternalDependencies.arm64",
    -            "Microsoft.DiagnosticsHub.Collection",
    -            "Microsoft.DiagnosticsHub.Collection.Service",
    -            "Microsoft.VisualStudio.VC.Ide.MDD",
    -            "Microsoft.VisualStudio.VC.Ide.Linux.ConnectionManager",
    -            "Microsoft.VisualStudio.VisualC.Utilities",
    -            "Microsoft.VisualStudio.VisualC.Utilities.Resources",
    -            "Microsoft.VisualStudio.VC.Ide.Linux.ConnectionManager.Resources",
    -            "Microsoft.VisualStudio.VC.Ide.ResourceEditor",
    -            "Microsoft.VisualStudio.VC.Ide.ResourceEditor.Resources",
    -            "Microsoft.VisualStudio.PackageGroup.TestTools.Core",
    -            "Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.V2.CLI",
    -            "Microsoft.VisualStudio.TestTools.TestPlatform.V2.CLI",
    -            "Microsoft.VisualStudio.TestTools.Pex.Common",
    -            "Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.V1.CLI",
    -            "Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.Legacy",
    -            "Microsoft.VisualStudio.PackageGroup.MinShell.Interop",
    -            "Microsoft.VisualStudio.TestTools.TP.Legacy.Tips.Msi",
    -            "Microsoft.VisualStudio.TestTools.TP.Legacy.Tips.Common",
    -            "Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Tips",
    -            "Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Tips.Resources",
    -            "Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.TestSettings",
    -            "Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Professional",
    -            "Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Common",
    -            "Microsoft.VisualStudio.TestTools.TP.Legacy.Common.Res",
    -            "Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Core",
    -            "Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Core.Resources",
    -            "Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Agent",
    -            "Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.IDE",
    -            "Microsoft.VisualStudio.Cache.Service",
    -            "Microsoft.VisualStudio.TestTools.TestWIExtension",
    -            "Microsoft.VisualStudio.TestTools.TestPlatform.V1.CLI",
    -            "Microsoft.VisualStudio.TestTools.TestPlatform.IDE",
    -            "Microsoft.VisualStudio.PackageGroup.TestTools.CodeCoverage",
    -            "Microsoft.VisualStudio.PackageGroup.TestTools.DataCollectors",
    -            "Microsoft.VisualStudio.Component.NuGet",
    -            "Microsoft.CredentialProvider",
    -            "Microsoft.VisualStudio.NuGet.Licenses",
    -            "Microsoft.VisualStudio.Component.TextTemplating",
    -            "Microsoft.VisualStudio.TextTemplating.MSBuild",
    -            "Microsoft.VisualStudio.TextTemplating.Integration",
    -            "Microsoft.VisualStudio.TextTemplating.Core",
    -            "Microsoft.VisualStudio.TextTemplating.Integration.Resources",
    -            "Microsoft.VisualCpp.CRT.ClickOnce.Msi",
    -            "Microsoft.VisualStudio.Component.Roslyn.LanguageServices",
    -            "Microsoft.VisualStudio.InteractiveWindow",
    -            "Microsoft.DiaSymReader.Native",
    -            "Microsoft.VisualCpp.Redist.14",
    -            "Microsoft.VisualCpp.Redist.14",
    -            "Microsoft.VisualCpp.Servicing.Redist",
    -            "Microsoft.VisualStudio.PackageGroup.StaticAnalysis",
    -            "Microsoft.VisualStudio.StaticAnalysis.IDE",
    -            "Microsoft.VisualStudio.StaticAnalysis.IDE.Resources",
    -            "Microsoft.VisualStudio.StaticAnalysis.FxCop.Resources",
    -            "Microsoft.VisualStudio.StaticAnalysis.auxil",
    -            "Microsoft.VisualStudio.StaticAnalysis.auxil.Resources",
    -            "Roslyn.VisualStudio.Setup.ServiceHub",
    -            "Microsoft.Component.MSBuild",
    -            "Microsoft.NuGet.Build.Tasks.Setup",
    -            "Microsoft.VisualStudio.Component.Roslyn.Compiler",
    -            "Microsoft.CodeAnalysis.Compilers",
    -            "Microsoft.VisualStudio.Component.JavaScript.TypeScript",
    -            "Microsoft.VisualStudio.JavaScript.ProjectSystem",
    -            "Microsoft.VisualStudio.ComponentGroup.WebToolsExtensions",
    -            "Microsoft.VisualStudio.ProTools",
    -            "sqlsysclrtypes",
    -            "SQLCommon",
    -            "Microsoft.VisualStudio.ProTools.Resources",
    -            "Microsoft.VisualStudio.Web.Scaffolding",
    -            "Microsoft.VisualStudio.WebToolsExtensions",
    -            "Microsoft.VisualStudio.ConnectedServices.Core",
    -            "Microsoft.VisualStudio.WebTools",
    -            "Microsoft.VisualStudio.WebToolsExtensions.MSBuild",
    -            "Microsoft.VisualStudio.WebTools.Resources",
    -            "Microsoft.VisualStudio.WebTools.WSP.FSA",
    -            "Microsoft.VisualStudio.WebTools.WSP.FSA.Resources",
    -            "Microsoft.VisualStudio.PackageGroup.Debugger.Script",
    -            "Microsoft.VisualStudio.Component.TypeScript.TSServer",
    -            "Microsoft.VisualStudio.Package.TypeScript.TSServer",
    -            "Microsoft.VisualStudio.PackageGroup.JavaScript.Language",
    -            "Microsoft.VisualStudio.Package.NodeJs",
    -            "TypeScript.Build",
    -            "TypeScript.LanguageService",
    -            "TypeScript.Tools",
    -            "Microsoft.VisualStudio.PackageGroup.Community",
    -            "Microsoft.VisualStudio.Community.VB.x86",
    -            "Microsoft.VisualStudio.Community.VB.x64",
    -            "Microsoft.VisualStudio.PackageGroup.Core",
    -            "Microsoft.VisualStudio.CodeSense.Community",
    -            "Microsoft.VisualStudio.TestTools.TeamFoundationClient",
    -            "Microsoft.VisualStudio.PackageGroup.Debugger.Core",
    -            "Microsoft.VisualStudio.Debugger.BrokeredServices",
    -            "Microsoft.VisualStudio.Debugger.VSCodeDebuggerHost",
    -            "Microsoft.VisualStudio.Debugger.AzureAttach",
    -            "Microsoft.VisualStudio.Web.Azure.Common",
    -            "Microsoft.WebTools.Shared",
    -            "Microsoft.WebTools.DotNet.Core.ItemTemplates",
    -            "Microsoft.VisualStudio.PackageGroup.Debugger.TimeTravel.Replay",
    -            "Microsoft.VisualStudio.VC.Ide.Debugger",
    -            "Microsoft.VisualStudio.VC.Ide.Debugger.Concord",
    -            "Microsoft.VisualStudio.VC.Ide.Debugger.Concord.Resources",
    -            "Microsoft.VisualStudio.VC.Ide.Debugger.Resources",
    -            "Microsoft.VisualStudio.VC.Ide.Common",
    -            "Microsoft.VisualStudio.VC.Ide.Common.Resources",
    -            "Microsoft.VisualStudio.Debugger.CollectionAgents",
    -            "Microsoft.VisualStudio.Debugger.Parallel",
    -            "Microsoft.VisualStudio.Debugger.Parallel.Resources",
    -            "Microsoft.VisualStudio.Debugger.Managed",
    -            "Microsoft.CodeAnalysis.ExpressionEvaluator",
    -            "Microsoft.CodeAnalysis.VisualStudio.Setup",
    -            "Microsoft.VisualStudio.Debugger.Concord.Managed",
    -            "Microsoft.VisualStudio.Debugger.Concord.Managed.Resources",
    -            "Microsoft.VisualStudio.Debugger.Managed.Resources",
    -            "Microsoft.VisualStudio.Debugger.TargetComposition",
    -            "Microsoft.VisualStudio.Debugger.TargetComposition.Remote.arm64",
    -            "Microsoft.VisualStudio.Debugger.TargetComposition.Remote",
    -            "Microsoft.VisualStudio.Debugger.TargetComposition.Remote",
    -            "Microsoft.VisualStudio.Debugger.Remote",
    -            "Microsoft.VisualStudio.Debugger.Concord.Remote",
    -            "Microsoft.VisualStudio.Debugger.Concord.Remote.Resources",
    -            "Microsoft.VisualStudio.Debugger.Remote",
    -            "Microsoft.VisualStudio.Debugger.Remote.ARM64",
    -            "Microsoft.VisualStudio.Debugger.Concord.Remote.ARM64",
    -            "Microsoft.VisualStudio.Debugger.Concord.Remote.Resources.ARM64",
    -            "Microsoft.VisualStudio.Debugger.Remote.ARM",
    -            "Microsoft.VisualStudio.Debugger.Concord.Remote.ARM",
    -            "Microsoft.VisualStudio.Debugger.Concord.Remote.Resources.ARM",
    -            "Microsoft.VisualStudio.Debugger.Remote.Resources.ARM",
    -            "Microsoft.VisualStudio.Debugger.Remote.Resources.ARM64",
    -            "Microsoft.VisualStudio.Debugger.Concord.Remote",
    -            "Microsoft.VisualStudio.Debugger.Concord.Remote.Resources",
    -            "Microsoft.VisualStudio.Debugger.Remote.Resources",
    -            "Microsoft.VisualStudio.Debugger.Remote.Resources",
    -            "Microsoft.VisualStudio.Debugger",
    -            "Microsoft.VisualStudio.VC.MSVCDis",
    -            "Microsoft.IntelliTrace.DiagnosticsHub",
    -            "Microsoft.VisualStudio.Debugger.Concord",
    -            "Microsoft.VisualStudio.Debugger.Concord.Resources",
    -            "Microsoft.VisualStudio.Debugger.Resources",
    -            "Microsoft.VisualStudio.Debugger.Package.DiagHub.Client",
    -            "Microsoft.VisualStudio.Debugger.Remote.DiagnosticsHub.Client",
    -            "Microsoft.VisualStudio.Debugger.Remote.DiagnosticsHub.Client",
    -            "Microsoft.VisualStudio.Debugger.Remote.DiagnosticsHub.Client",
    -            "Microsoft.PackageGroup.ClientDiagnostics",
    -            "Microsoft.VisualStudio.AppResponsiveness",
    -            "Microsoft.VisualStudio.AppResponsiveness.Targeted",
    -            "Microsoft.VisualStudio.AppResponsiveness.Resources",
    -            "Microsoft.VisualStudio.ClientDiagnostics",
    -            "Microsoft.VisualStudio.ClientDiagnostics.Targeted",
    -            "Microsoft.VisualStudio.ClientDiagnostics.Resources",
    -            "Microsoft.VisualStudio.PackageGroup.CommunityCore",
    -            "Microsoft.VisualStudio.ProjectSystem.Full",
    -            "Microsoft.VisualStudio.LiveShareApi",
    -            "Microsoft.VisualStudio.ProjectSystem.Query",
    -            "Microsoft.VisualStudio.ProjectSystem",
    -            "Microsoft.VisualStudio.Community.x86",
    -            "Microsoft.VisualStudio.Community.x64",
    -            "Microsoft.VisualStudio.Community.Msi.Resources",
    -            "Microsoft.VisualStudio.Community.Msi",
    -            "Microsoft.VisualStudio.Community.Shared.Msi",
    -            "Microsoft.VisualStudio.Devenv.Msi",
    -            "Microsoft.VisualStudio.Devenv.Shared.Msi",
    -            "Microsoft.VisualStudio.MinShell.Interop.Msi",
    -            "Microsoft.VisualStudio.MinShell.Interop.Shared.Msi",
    -            "Microsoft.VisualStudio.Editors",
    -            "Microsoft.VisualStudio.Workload.CoreEditor",
    -            "Microsoft.VisualStudio.Component.CoreEditor",
    -            "Microsoft.VisualStudio.PackageGroup.CoreEditor",
    -            "Microsoft.WebView2",
    -            "Microsoft.VisualStudio.ScriptedHost",
    -            "Microsoft.VisualStudio.ScriptedHost.Targeted",
    -            "Microsoft.VisualCpp.Tools.Common.UtilsPrereq",
    -            "Microsoft.VisualCpp.Tools.Common.Utils",
    -            "Microsoft.VisualCpp.Tools.Common.Utils.Resources",
    -            "Microsoft.VisualStudio.PackageGroup.VsDevCmd",
    -            "Microsoft.VisualStudio.VsDevCmd.Ext.NetFxSdk",
    -            "Microsoft.VisualStudio.VsDevCmd.Core.WinSdk",
    -            "Microsoft.VisualStudio.VsDevCmd.Core.DotNet",
    -            "Microsoft.VisualStudio.VC.DevCmd",
    -            "Microsoft.VisualStudio.VC.DevCmd.Resources",
    -            "Microsoft.VisualStudio.VirtualTree",
    -            "Microsoft.DiaSymReader",
    -            "Microsoft.Build.Dependencies",
    -            "Microsoft.Build.FileTracker.Msi",
    -            "Microsoft.Build",
    -            "Microsoft.VisualStudio.PackageGroup.NuGet",
    -            "Microsoft.DataAI.NuGetRecommender",
    -            "Microsoft.VisualStudio.NuGet.Core",
    -            "Microsoft.Build.Arm64",
    -            "Microsoft.Build.UnGAC",
    -            "Microsoft.VisualStudio.TextMateGrammars",
    -            "Microsoft.VisualStudio.Platform.Markdown",
    -            "Microsoft.VisualStudio.Platform.CrossRepositorySearch",
    -            "Microsoft.VisualStudio.PackageGroup.TeamExplorer.Common",
    -            "Microsoft.VisualStudio.TeamExplorer",
    -            "Microsoft.VisualStudio.PackageGroup.ServiceHub",
    -            "Microsoft.ServiceHub.Node",
    -            "Microsoft.ServiceHub.Managed",
    -            "Microsoft.ServiceHub.arm64",
    -            "Microsoft.VisualStudio.ProjectServices",
    -            "Microsoft.VisualStudio.OpenFolder.VSIX",
    -            "Microsoft.VisualStudio.FileHandler.Msi",
    -            "Microsoft.VisualStudio.FileHandler.Msi",
    -            "Microsoft.VisualStudio.PackageGroup.MinShell",
    -            "Microsoft.VisualStudio.MinShell.Msi",
    -            "Microsoft.VisualStudio.MinShell.Shared.Msi",
    -            "Microsoft.VisualStudio.MinShell.Msi.Resources",
    -            "Microsoft.VisualStudio.MinShell.Interop",
    -            "CoreEditorFonts",
    -            "Microsoft.VisualStudio.Log",
    -            "Microsoft.VisualStudio.Log.Targeted",
    -            "Microsoft.VisualStudio.Log.Resources",
    -            "Microsoft.VisualStudio.Finalizer",
    -            "Microsoft.VisualStudio.Devenv",
    -            "Microsoft.VisualStudio.Devenv.Resources",
    -            "Microsoft.VisualStudio.CoreEditor",
    -            "Microsoft.VisualStudio.Navigation.RichCodeNav",
    -            "Microsoft.VisualStudio.Platform.NavigateTo",
    -            "Microsoft.VisualStudio.Connected",
    -            "SQLitePCLRaw",
    -            "SQLitePCLRaw.Targeted",
    -            "Microsoft.VisualStudio.Connected.Auto",
    -            "Microsoft.VisualStudio.Connected.Auto.Resources",
    -            "Microsoft.VisualStudio.AzureSDK",
    -            "Microsoft.VisualStudio.PerfLib",
    -            "Microsoft.VisualStudio.Connected.Resources",
    -            "Microsoft.Net.PackageGroup.4.8.Redist",
    -            "Microsoft.VisualStudio.PackageGroup.Progression",
    -            "Microsoft.VisualStudio.PerformanceProvider",
    -            "Microsoft.VisualStudio.GraphModel",
    -            "Microsoft.VisualStudio.GraphProvider",
    -            "Microsoft.VisualStudio.Community.VB.Targeted",
    -            "Microsoft.VisualStudio.Community.VB.Neutral",
    -            "Microsoft.VisualStudio.Community.CSharp.Targeted",
    -            "Microsoft.VisualStudio.Community.CSharp.Neutral",
    -            "Microsoft.VisualStudio.Community.ProductArch.TargetedExtra",
    -            "Microsoft.VisualStudio.Community.ProductArch.Targeted",
    -            "Microsoft.VisualStudio.Community.ProductArch.NeutralExtra",
    -            "Microsoft.DiaSymReader.PortablePdb",
    -            "Microsoft.IntelliTrace.CollectorCab",
    -            "Microsoft.VisualStudio.Community.VB.Resources.Targeted",
    -            "Microsoft.VisualStudio.Community.VB.Resources.Neutral",
    -            "Microsoft.VisualStudio.Community.CSharp.Resources.Targeted",
    -            "Microsoft.VisualStudio.Community.CSharp.Resources.Neutral",
    -            "Microsoft.VisualStudio.Community.ProductArch.Resources.Targeted",
    -            "Microsoft.VisualStudio.Community.ProductArch.Resources.NeutralExtra",
    -            "Microsoft.VisualStudio.Net.Eula.Resources",
    -            "Microsoft.VisualStudio.Community.ProductArch.Resources.Neutral",
    -            "Microsoft.VisualStudio.WebSiteProject.DTE",
    -            "Microsoft.VisualStudio.Diagnostics.AspNetHelper",
    -            "Microsoft.VisualStudio.Diagnostics.AspNetHelper.Standard",
    -            "Microsoft.MSHtml",
    -            "Microsoft.VisualStudio.Platform.CallHierarchy",
    -            "Microsoft.VisualStudio.Community.ProductArch.Neutral",
    -            "Microsoft.VisualStudio.MinShell",
    -            "Microsoft.VisualStudio.VsWebProtocolSelector.Msi",
    -            "Microsoft.Net.6.WindowsDesktop.Runtime",
    -            "Microsoft.Net.6.Runtime",
    -            "Microsoft.VisualStudio.PackageGroup.Setup.Common",
    -            "Microsoft.VisualStudio.Setup.WMIProvider",
    -            "Microsoft.VisualStudio.Setup.Configuration.Interop",
    -            "Microsoft.VisualStudio.Setup.Configuration",
    -            "Microsoft.VisualStudio.Extensibility.Container",
    -            "Microsoft.VisualStudio.LanguageServer",
    -            "Microsoft.VisualStudio.Platform.Terminal",
    -            "Microsoft.VisualStudio.MefHosting",
    -            "Microsoft.VisualStudio.Initializer",
    -            "Microsoft.VisualStudio.ExtensionManager",
    -            "Microsoft.VisualStudio.Platform.Editor",
    -            "Microsoft.VisualStudio.MinShell.Targeted",
    -            "Microsoft.VisualStudio.NativeImageSupport",
    -            "Microsoft.VisualStudio.Devenv.Config",
    -            "Microsoft.VisualStudio.MinShell.Resources.arm64",
    -            "Microsoft.VisualStudio.MinShell.Auto",
    -            "Microsoft.VisualStudio.MinShell.Auto.Resources",
    -            "Microsoft.VisualStudio.Branding.Community"
    -        ]
    -    }
    -]
    diff --git a/deps/npm/node_modules/node-gyp/test/fixtures/certs.js b/deps/npm/node_modules/node-gyp/test/fixtures/certs.js
    deleted file mode 100644
    index 766e54b5ed3900..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/fixtures/certs.js
    +++ /dev/null
    @@ -1,150 +0,0 @@
    -module.exports['ca.key'] = `
    ------BEGIN RSA PRIVATE KEY-----
    -MIIEowIBAAKCAQEAtTbG0k2UFUyCdZuip0TTEtXRHh57qosegrpHPBreSNTxt7OT
    -KfOUZp2rToTHeN9w0ZbV2eKRI5AuFx8Cmlm73/KIHKzSNTBATGMeeHnGaxvL/W/s
    -KJdTDRNf7/qCXHQ+gsuEWWCFzOZuHmmAQa2IBX2HAQTqXJI8+2iJ9gytFfJLxjqy
    -6O4u9ugZVHSyQJWs49tGRcWMlNm7EMStADFvJn3S11xe/kwIA2mSI/eddDnzL0Mx
    -AkR9dQBL66xOABLL5v3QQdhipfHluX6HLbDd/1YsFTuOpgvLRlr72rTAFrQZCokV
    -hXPiqstn5zJFW5arHakvMR0+OPaICF5feh/4qQIDAQABAoIBAHWg6exnWUF+GY0Y
    -CrwDS/QFASpI5UNt7M809bqJQlMKjyEMmvF3YJQ/soxUWlsWx1f1TjmR/V6VX6W4
    -hmsE5pRXDY13jTfja0lqacQQYAD02TRY63XpzIpHUlYnSWmUN2OVkgKmShQYW9C3
    -8P4xE4Nk2TaLJ0oRzy3uzOb/kXcVaJfknBRUnOhuaTSs+w4l4pPXueYA7xuHgVsL
    -Qq0S4kK+PmdwCMB7gzlAAQhCM3vQ1U4cjC9JIIKSmPy7BcvD0kBfVPIFQ2byGpA1
    -VkWBLSyeig0YxA5oIshK5cLiDIfBIiCSEzm4AMhVhGf0tbGEwiPljxKjbarYUUIi
    -ATMk83UCgYEA7kKeOveuPbMqxmT42swfa9OU5jLUjH+VExU0Kv3BbEjv/OGt0fac
    -/cs1Ze3vnrtCHudVajocFjydb8B4c62DbA4/T+LcUw/HaMaORbOoICQidi/zZ1Lj
    -gjg8Ip2WKXEhSAwqUpaFd6w16NZOxiTh+NDaRKywwbe8j57eDH4uR6MCgYEAwrTS
    -q5ra6+WDGUFMs0y3GMbL8j14PGhxBQBYSTM//NysI+EM6eeKn1cV3BbphEw//jgE
    -0pVokkjvLAQWWEG2dZyRxRE3YAMgOAIPx5zbJCim3iBVuoqY9ckLg2jF8Fqqubsb
    -3Rf2/Xzn/rFqsXdhsjGcJpdN66T9aEjwEkAnc0MCgYA5cOYk4UGormFJo147oaqR
    -nFjxhp+nn7qY9yu0kajoKk1xchct337J0Qv2nv5+DjdKrArzqT7MPaDXKFfhy5s7
    -mdO5tr/XZp50rCnws/d8iDmmtLjB2EHxSw10avmg1B1p+UTa1F8pEuOMVt529r1j
    -9zYoCFo02c8j8PEnoeQWcQKBgQCVBCuQZu5SSM/zTkTTnU0sy0lf1qflI9IMD92B
    -+JVqg8HDnAR0KF+x38a9MVP7ixgXCuy19t+XxfY269HmLjTlArWV671D4GCSPRGy
    -plwZ6nr72ieCo3y57+q94jxL3jh3+bozlpnUG/q6tTKBLGs7JDjsWDSsuxOu8tO6
    -RBttXQKBgB6LQFOTjDMfsFHKsnQXFUZId3GG/iLg3WCWxEo88T5Rq3JIR0zDpW8H
    -cKhl/sPY+JVHsxizNCMPtp7Hn7GrB6D/v9LbO0jpG2U0BFiJ6zhiDopbP9B0EAW4
    -5JJ+JGKRKoCxs3DmSVyns0gU4j4rVte97UWyVy5TZ8Acr/qrgOA1
    ------END RSA PRIVATE KEY-----
    -`
    -
    -module.exports['ca.crt'] = `
    ------BEGIN CERTIFICATE-----
    -MIIDmzCCAoOgAwIBAgIUDA0GrvcnG41XT6LYFeNwvq8YV1UwDQYJKoZIhvcNAQEL
    -BQAwXTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRAwDgYDVQQKDAdOb2RlLmpz
    -MREwDwYDVQQLDAhub2RlLWd5cDEcMBoGA1UEAwwTbm9kZS1neXAubm9kZWpzLm9y
    -ZzAeFw0yMjA1MTEwNDIyMjRaFw00OTA5MjUwNDIyMjRaMF0xCzAJBgNVBAYTAlVT
    -MQswCQYDVQQIDAJDQTEQMA4GA1UECgwHTm9kZS5qczERMA8GA1UECwwIbm9kZS1n
    -eXAxHDAaBgNVBAMME25vZGUtZ3lwLm5vZGVqcy5vcmcwggEiMA0GCSqGSIb3DQEB
    -AQUAA4IBDwAwggEKAoIBAQC1NsbSTZQVTIJ1m6KnRNMS1dEeHnuqix6Cukc8Gt5I
    -1PG3s5Mp85RmnatOhMd433DRltXZ4pEjkC4XHwKaWbvf8ogcrNI1MEBMYx54ecZr
    -G8v9b+wol1MNE1/v+oJcdD6Cy4RZYIXM5m4eaYBBrYgFfYcBBOpckjz7aIn2DK0V
    -8kvGOrLo7i726BlUdLJAlazj20ZFxYyU2bsQxK0AMW8mfdLXXF7+TAgDaZIj9510
    -OfMvQzECRH11AEvrrE4AEsvm/dBB2GKl8eW5foctsN3/ViwVO46mC8tGWvvatMAW
    -tBkKiRWFc+Kqy2fnMkVblqsdqS8xHT449ogIXl96H/ipAgMBAAGjUzBRMB0GA1Ud
    -DgQWBBT6LcYYABEOAMv4hI/5bC82rGlD/DAfBgNVHSMEGDAWgBT6LcYYABEOAMv4
    -hI/5bC82rGlD/DAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQA9
    -D+qoKw0njub+NaFRS2DFbSiKb5JKTxVjU5aNusFONFLSXBuRpnYyjjkXpJy8JMWz
    -g8GFDEPP6kiSb8xaPNrFcUzb4PFzJabNTuaLJpBpd2gNBj5AeYwwpRa2DPv/b4yw
    -y2mfULuCWS09ZAguI2OcaARlAsFxYN0IuQ6pN1AvGFGee67ve9l2VF/hhwEi4lCk
    -MM0CWlP6COJ8TX7X0MTtexVOgo9m3hBuTSYEZClYFIdSOk10xkPl8Y3Iz/x6mzfK
    -Uu2l2ZtYvSdAX1CQMds3ZWt0ChNNEjOKPv4g2QSDhGkiqrmi4wUS81g68wKqOpqn
    -GbN8uKxIfyMjqZKaujPR
    ------END CERTIFICATE-----
    -`
    -
    -module.exports['server.key'] = `
    ------BEGIN RSA PRIVATE KEY-----
    -MIIEpAIBAAKCAQEAvPM99BkYrBcTM355dhz4XzhSDRGxa9qttUlBSgEsbu2UjsRm
    -XjDS+60XXd66tWpPwLeUd2uvlC/ltv5ekv+EBu35j1KfA1+K1rtFzb1i40kMCsns
    -OoXjgpsN2wvkxMdFkT2bkqKCS6X0xzlWea1t4poKh9iG7n3otk4RzPNawfwQ9W5n
    -o9/8i6AUwDbuK4dhAId/Inw2aKrMyQ+AiSvsDM2wUMq+pV7nP46f7MhR4xiGz14z
    -ATFdjM3Oo/1NKrr0WgVM6i0eNAtuIDqIs8YE7SfODe/SzpJySxewutfYi62OaLh/
    -hmWByj/pF5SoNMLyJHxn4GyKK+Qle9NJAThLiwIDAQABAoIBAQCZs4h/Cvct7etZ
    -pRUqxnAoDQl5xh28LXvGj1uD1qaNacfBxvO6xR6rSedLHcZlkqBjlTI5XqjJ85h6
    -njrSevWsKWMrejsNpGetO1OSA+/wEVixYgY+qPEkKftAZ1Fl3O+zMRlfU8CHxuzy
    -Lqsweap8fW/5h2JjmJp3ydPjE0aNqpQ+0LtYBBawKDIe2zPNOmTPwz3D8qJNQJKU
    -Qdj08dO/vPZncllPagGvpqhfv4hMyNChr71eBbEFsi3O5VJxfZyj+fQG0DGocr/y
    -sV54HtYk5j06wMxZFLQtaJn+1pOXquZMNwodSPnbrR/+CI1SZeB8N6VyqqOdmrDz
    -5NbfGJiRAoGBAPrCuQxJwgc2MzpEtrXA4+1uuV8QWGy3+wNKxKw4lgyC7peXXrVK
    -l9FkOOAPr8puPRABgDS9t6vo59BAP3Wrx0oJ9PA/Qn03WYLfJMepWqlK7ni9kS04
    -5owRTduK7P190sp0m6iicsnchGSSOchECwB5UmtHysEFiuY0T+0pdNbjAoGBAMDl
    -57lwZDfNTGGDxLQYVzbrXgKcD60DW9MhvH3uso6cw5NYs3tmENCh9D6YrCNN4PmL
    -zdp4dKbOFoGJdy22TK31nrezUuNKSK+QKH2gsmNVI+a5QokNO1Cfk+PMLoOR5du2
    -nwyVvzdaBwuXU4fhmwvLv/SCFNEJ0EgUILeMETE5AoGBAIwLXf9v3e3bJkb/gy8E
    -mAbNVLez0D5/ja9r/WTVgW9hXFDLF/iVvS4TE/SGrj2WzYF35RsPbVmUDIrwpsBX
    -/EfsQaA/JCn8VIBTkR31Bg4QLBjAfijMY22MaHgZIXv83lF1SE2o1ATKpCHqzFx9
    -K8vK9e22PZUJPGaOhqjEA13TAoGAEPipSJFw38/6NmInfkjd84EFxmkAoBI5k/vV
    -36aOoyl7s40MTYEPXavCF3fLPVfuwUXhmKUcbkiXhlIX4De3y15e1n66fjDc8EVY
    -qqTmzQKCpBwMlI5Ld65yjoo6VW0SsiABIlRSfIY5NHXd7YiV4ZXNj6+aMUIRxyWu
    -Mzfpk1ECgYBZw8lML+F8XbcmCLGYuicf0V/wgFaJr8nnPeW7AiQrv13Ju1ItEaC8
    -Tz8F7OfC+FoUb0MGjXHKquDVBDs4xSuS+Ol+rlZEK68ALpm8sUgp6YjARYiXlprs
    -6o4kN0P5F+DVU2SP6fo9zKLCxaTH9VAQ9C3VUViGAFLBt4DVDmj77g==
    ------END RSA PRIVATE KEY-----
    -`
    -
    -module.exports['server.crt'] = `
    ------BEGIN CERTIFICATE-----
    -MIIDNzCCAh8CFBg1Ph5t5rBlAbCrEn/PexNy9WunMA0GCSqGSIb3DQEBCwUAMF0x
    -CzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEQMA4GA1UECgwHTm9kZS5qczERMA8G
    -A1UECwwIbm9kZS1neXAxHDAaBgNVBAMME25vZGUtZ3lwLm5vZGVqcy5vcmcwHhcN
    -MjIwNTExMDQyMjI0WhcNMjMwOTIzMDQyMjI0WjBTMQswCQYDVQQGEwJVUzELMAkG
    -A1UECAwCQ0ExEDAOBgNVBAoMB05vZGUuanMxETAPBgNVBAsMCG5vZGUtZ3lwMRIw
    -EAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
    -AQC88z30GRisFxMzfnl2HPhfOFINEbFr2q21SUFKASxu7ZSOxGZeMNL7rRdd3rq1
    -ak/At5R3a6+UL+W2/l6S/4QG7fmPUp8DX4rWu0XNvWLjSQwKyew6heOCmw3bC+TE
    -x0WRPZuSooJLpfTHOVZ5rW3imgqH2Ibufei2ThHM81rB/BD1bmej3/yLoBTANu4r
    -h2EAh38ifDZoqszJD4CJK+wMzbBQyr6lXuc/jp/syFHjGIbPXjMBMV2Mzc6j/U0q
    -uvRaBUzqLR40C24gOoizxgTtJ84N79LOknJLF7C619iLrY5ouH+GZYHKP+kXlKg0
    -wvIkfGfgbIor5CV700kBOEuLAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAEhaNEye
    -JsE4eG1xaGmHq7w9eV0neOaZ58XCuF1sSEMIy9uMnl3aOdctxh/1SYkqJyMct79q
    -Ra2UZ6mauRlOeqdHb+HZKrFYYUOtd1HOWWJ44Gaya2EQMiTbd/Ns9Th2KTbTOCbL
    -CHFNska9Ty2ioT7VcrVuIEXFPMua5T4lnCkNJQla800pHHOak2baN/c66Io+8XI2
    -xiqaVrLT3qvpzdiiEjo4POeRnWMIgJJshy77Am5JlhaJiAqP1AHfh/tYpliGkjXF
    -8DSgSoLHSQfalJ4VQvP4XLc/XnmF5Zt6bvwUxCllEBFRneU74bW7/euYX/TpYobr
    -Y+YM7fGiCqwHdUs=
    ------END CERTIFICATE-----
    -`
    -
    -module.exports['ca-bundle.crt'] = `
    ------BEGIN CERTIFICATE-----
    -MIIDJjCCAg4CAhnOMA0GCSqGSIb3DQEBBQUAMH0xCzAJBgNVBAYTAlVTMQswCQYD
    -VQQIDAJDQTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEZMBcGA1UECgwQU3Ryb25n
    -TG9vcCwgSW5jLjESMBAGA1UECwwJU3Ryb25nT3BzMRowGAYDVQQDDBFjYS5zdHJv
    -bmdsb29wLmNvbTAeFw0xNTEyMDgyMzM1MzNaFw00MzA0MjQyMzM1MzNaMBkxFzAV
    -BgNVBAMMDnN0cm9uZ2xvb3AuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
    -CgKCAQEAwOYI7OZ2FX/YjRgLZoDQlbPc5UZXU/j0e1wwiJNPtPEax9Y5Uoza0Pnt
    -Ikzkc2SfvQ+IJrhXo385tI0W5juuqbHnE7UrjUuPjUX6NHevkxcs/flmjan5wnZM
    -cPsGhH71WDuUEEflvZihf2Se2x+xgZtMhc5XGmVmRuZFYKvkgUhA2/w8/QrK+jPT
    -n9QRJxZjWNh2RBdC1B7u4jffSmOSUljYFH1I2eTeY+Rdi6YUIYSU9gEoZxsv3Tia
    -SomfMF5jt2Mouo6MzA+IhLvvFjcrcph1Qxgi9RkfdCMMd+Ipm9YWELkyG1bDRpQy
    -0iyHD4gvVsAqz1Y2KdRSdc3Kt+nTqwIDAQABoxkwFzAVBgNVHREEDjAMhwQAAAAA
    -hwR/AAABMA0GCSqGSIb3DQEBBQUAA4IBAQAhy4J0hML3NgmDRHdL5/iTucBe22Mf
    -jJjg2aifD1S187dHm+Il4qZNO2plWwAhN0h704f+8wpsaALxUvBIu6nvlvcMP5PH
    -jGN5JLe2Km3UaPvYOQU2SgacLilu+uBcIo2JSHLV6O7ziqUj5Gior6YxDLCtEZie
    -Ea8aX5/YjuACtEMJ1JjRqjgkM66XAoUe0E8onOK3FgTIO3tGoTJwRp0zS50pFuP0
    -PsZtT04ck6mmXEXXknNoAyBCvPypfms9OHqcUIW9fiQnrGbS/Ri4QSQYj0DtFk/1
    -na4fY1gf3zTHxH8259b/TOOaPfTnCEsOQtjUrWNR4xhmVZ+HJy4yytUW
    ------END CERTIFICATE-----
    ------BEGIN CERTIFICATE-----
    -MIIDbzCCAlcCAmm6MA0GCSqGSIb3DQEBCwUAMH0xCzAJBgNVBAYTAlVTMQswCQYD
    -VQQIDAJDQTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEZMBcGA1UECgwQU3Ryb25n
    -TG9vcCwgSW5jLjESMBAGA1UECwwJU3Ryb25nT3BzMRowGAYDVQQDDBFjYS5zdHJv
    -bmdsb29wLmNvbTAeFw0xNTEyMDgyMzM1MzNaFw00MzA0MjQyMzM1MzNaMH0xCzAJ
    -BgNVBAYTAlVTMQswCQYDVQQIDAJDQTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEZ
    -MBcGA1UECgwQU3Ryb25nTG9vcCwgSW5jLjESMBAGA1UECwwJU3Ryb25nT3BzMRow
    -GAYDVQQDDBFjYS5zdHJvbmdsb29wLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP
    -ADCCAQoCggEBANfj86jkvvYDjHBgiqWhk9Cj+bqiMq3MqnV0CBO4iuK33Fo6XssE
    -H+yVdXlIBFbFe6t655MdBVOR2Sfj7WqNh96vhu6PyDHiwcQlTaiLU6nhIed1J4Wv
    -lvnJHFmp8Wbtx5AgLT4UYu03ftvXEl2DLi3vhSL2tRM1ebXHB/KPbRWkb25DPX0P
    -foOHot3f2dgNe2x6kponf7E/QDmAu3s7Nlkfh+ryDhgGU7wocXEhXbprNqRqOGNo
    -xbXgUI+/9XDxYT/7Gn5LF/fPjtN+aB0SKMnTsDhprVlZie83mlqJ46fOOrR+vrsQ
    -mi/1m/TadrARtZoIExC/cQRdVM05EK4tUa8CAwEAATANBgkqhkiG9w0BAQsFAAOC
    -AQEAQ7k5WhyhDTIGYCNzRnrMHWSzGqa1y4tJMW06wafJNRqTm1cthq1ibc6Hfq5a
    -K10K0qMcgauRTfQ1MWrVCTW/KnJ1vkhiTOH+RvxapGn84gSaRmV6KZen0+gMsgae
    -KEGe/3Hn+PmDVV+PTamHgPACfpTww38WHIe/7Ce9gHfG7MZ8cKHNZhDy0IAYPln+
    -YRwMLd7JNQffHAbWb2CE1mcea4H/12U8JZW5tHCF6y9V+7IuDzqwIrLKcW3lG17n
    -VUG6ODF/Ryqn3V5X+TL91YyXi6c34y34IpC7MQDV/67U7+5Bp5CfeDPWW2wVSrW+
    -uGZtfEvhbNm6m2i4UNmpCXxUZQ==
    ------END CERTIFICATE-----
    -`
    diff --git a/deps/npm/node_modules/node-gyp/test/fixtures/nodedir/include/node/config.gypi b/deps/npm/node_modules/node-gyp/test/fixtures/nodedir/include/node/config.gypi
    deleted file mode 100644
    index e767534082f8ce..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/fixtures/nodedir/include/node/config.gypi
    +++ /dev/null
    @@ -1,6 +0,0 @@
    -# Test configuration
    -{
    -  'variables': {
    -    'build_with_electron': true
    -  }
    -}
    diff --git a/deps/npm/node_modules/node-gyp/test/fixtures/test-charmap.py b/deps/npm/node_modules/node-gyp/test/fixtures/test-charmap.py
    deleted file mode 100644
    index 63aa77bb482ef2..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/fixtures/test-charmap.py
    +++ /dev/null
    @@ -1,31 +0,0 @@
    -import sys
    -import locale
    -
    -try:
    -    reload(sys)
    -except NameError:  # Python 3
    -    pass
    -
    -
    -def main():
    -    encoding = locale.getdefaultlocale()[1]
    -    if not encoding:
    -        return False
    -
    -    try:
    -        sys.setdefaultencoding(encoding)
    -    except AttributeError:  # Python 3
    -        pass
    -
    -    textmap = {
    -        "cp936": "\u4e2d\u6587",
    -        "cp1252": "Lat\u012Bna",
    -        "cp932": "\u306b\u307b\u3093\u3054",
    -    }
    -    if encoding in textmap:
    -        print(textmap[encoding])
    -    return True
    -
    -
    -if __name__ == "__main__":
    -    print(main())
    diff --git a/deps/npm/node_modules/node-gyp/test/process-exec-sync.js b/deps/npm/node_modules/node-gyp/test/process-exec-sync.js
    deleted file mode 100644
    index 21763bc26de108..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/process-exec-sync.js
    +++ /dev/null
    @@ -1,140 +0,0 @@
    -'use strict'
    -
    -const fs = require('graceful-fs')
    -const childProcess = require('child_process')
    -
    -function startsWith (str, search, pos) {
    -  if (String.prototype.startsWith) {
    -    return str.startsWith(search, pos)
    -  }
    -
    -  return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search
    -}
    -
    -function processExecSync (file, args, options) {
    -  var child, error, timeout, tmpdir, command
    -  command = makeCommand(file, args)
    -
    -  /*
    -    this function emulates child_process.execSync for legacy node <= 0.10.x
    -    derived from https://github.com/gvarsanyi/sync-exec/blob/master/js/sync-exec.js
    -  */
    -
    -  options = options || {}
    -  // init timeout
    -  timeout = Date.now() + options.timeout
    -  // init tmpdir
    -  var osTempBase = '/tmp'
    -  var os = determineOS()
    -  osTempBase = '/tmp'
    -
    -  if (process.env.TMP) {
    -    osTempBase = process.env.TMP
    -  }
    -
    -  if (osTempBase[osTempBase.length - 1] !== '/') {
    -    osTempBase += '/'
    -  }
    -
    -  tmpdir = osTempBase + 'processExecSync.' + Date.now() + Math.random()
    -  fs.mkdirSync(tmpdir)
    -
    -  // init command
    -  if (os === 'linux') {
    -    command = '(' + command + ' > ' + tmpdir + '/stdout 2> ' + tmpdir +
    -      '/stderr); echo $? > ' + tmpdir + '/status'
    -  } else {
    -    command = '(' + command + ' > ' + tmpdir + '/stdout 2> ' + tmpdir +
    -      '/stderr) | echo %errorlevel% > ' + tmpdir + '/status | exit'
    -  }
    -
    -  // init child
    -  child = childProcess.exec(command, options)
    -
    -  var maxTry = 100000 // increases the test time by 6 seconds on win-2016-node-0.10
    -  var tryCount = 0
    -  while (tryCount < maxTry) {
    -    try {
    -      var x = fs.readFileSync(tmpdir + '/status')
    -      if (x.toString() === '0') {
    -        break
    -      }
    -    } catch (ignore) {}
    -    tryCount++
    -    if (Date.now() > timeout) {
    -      error = child
    -      break
    -    }
    -  }
    -
    -  ['stdout', 'stderr', 'status'].forEach(function (file) {
    -    child[file] = fs.readFileSync(tmpdir + '/' + file, options.encoding)
    -    setTimeout(unlinkFile, 500, tmpdir + '/' + file)
    -  })
    -
    -  child.status = Number(child.status)
    -  if (child.status !== 0) {
    -    error = child
    -  }
    -
    -  try {
    -    fs.rmdirSync(tmpdir)
    -  } catch (ignore) {}
    -  if (error) {
    -    throw error
    -  }
    -  return child.stdout
    -}
    -
    -function makeCommand (file, args) {
    -  var command, quote
    -  command = file
    -  if (args.length > 0) {
    -    for (var i in args) {
    -      command = command + ' '
    -      if (args[i][0] === '-') {
    -        command = command + args[i]
    -      } else {
    -        if (!quote) {
    -          command = command + '"'
    -          quote = true
    -        }
    -        command = command + args[i]
    -        if (quote) {
    -          if (args.length === (parseInt(i) + 1)) {
    -            command = command + '"'
    -          }
    -        }
    -      }
    -    }
    -  }
    -  return command
    -}
    -
    -function determineOS () {
    -  var os = ''
    -  var tmpVar = ''
    -  if (process.env.OSTYPE) {
    -    tmpVar = process.env.OSTYPE
    -  } else if (process.env.OS) {
    -    tmpVar = process.env.OS
    -  } else {
    -    // default is linux
    -    tmpVar = 'linux'
    -  }
    -
    -  if (startsWith(tmpVar, 'linux')) {
    -    os = 'linux'
    -  }
    -  if (startsWith(tmpVar, 'win')) {
    -    os = 'win'
    -  }
    -
    -  return os
    -}
    -
    -function unlinkFile (file) {
    -  fs.unlinkSync(file)
    -}
    -
    -module.exports = processExecSync
    diff --git a/deps/npm/node_modules/node-gyp/test/reporter.js b/deps/npm/node_modules/node-gyp/test/reporter.js
    deleted file mode 100644
    index 9964b1b5d504c0..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/reporter.js
    +++ /dev/null
    @@ -1,75 +0,0 @@
    -const Mocha = require('mocha')
    -
    -class Reporter {
    -  constructor (runner) {
    -    this.failedTests = []
    -
    -    runner.on(Mocha.Runner.constants.EVENT_RUN_BEGIN, () => {
    -      console.log('Starting tests')
    -    })
    -
    -    runner.on(Mocha.Runner.constants.EVENT_RUN_END, () => {
    -      console.log('Tests finished')
    -      console.log()
    -      console.log('****************')
    -      console.log('* TESTS REPORT *')
    -      console.log('****************')
    -      console.log()
    -      console.log(`Executed ${runner.stats.suites} suites with ${runner.stats.tests} tests in ${runner.stats.duration} ms`)
    -      console.log(`  Passed: ${runner.stats.passes}`)
    -      console.log(`  Skipped: ${runner.stats.pending}`)
    -      console.log(`  Failed: ${runner.stats.failures}`)
    -      if (this.failedTests.length > 0) {
    -        console.log()
    -        console.log('  Failed test details')
    -        this.failedTests.forEach((failedTest, index) => {
    -          console.log()
    -          console.log(`    ${index + 1}.'${failedTest.test.fullTitle()}'`)
    -          console.log(`      Name: ${failedTest.error.name}`)
    -          console.log(`      Message: ${failedTest.error.message}`)
    -          console.log(`      Code: ${failedTest.error.code}`)
    -          console.log(`      Stack: ${failedTest.error.stack}`)
    -        })
    -      }
    -      console.log()
    -    })
    -
    -    runner.on(Mocha.Runner.constants.EVENT_SUITE_BEGIN, (suite) => {
    -      if (suite.root) {
    -        return
    -      }
    -      console.log(`Starting suite '${suite.title}'`)
    -    })
    -
    -    runner.on(Mocha.Runner.constants.EVENT_SUITE_END, (suite) => {
    -      if (suite.root) {
    -        return
    -      }
    -      console.log(`Suite '${suite.title}' finished`)
    -      console.log()
    -    })
    -
    -    runner.on(Mocha.Runner.constants.EVENT_TEST_BEGIN, (test) => {
    -      console.log(`Starting test '${test.title}'`)
    -    })
    -
    -    runner.on(Mocha.Runner.constants.EVENT_TEST_PASS, (test) => {
    -      console.log(`Test '${test.title}' passed in ${test.duration} ms`)
    -    })
    -
    -    runner.on(Mocha.Runner.constants.EVENT_TEST_PENDING, (test) => {
    -      console.log(`Test '${test.title}' skipped in ${test.duration} ms`)
    -    })
    -
    -    runner.on(Mocha.Runner.constants.EVENT_TEST_FAIL, (test, error) => {
    -      this.failedTests.push({ test, error })
    -      console.log(`Test '${test.title}' failed in ${test.duration} ms with ${error}`)
    -    })
    -
    -    runner.on(Mocha.Runner.constants.EVENT_TEST_END, (test) => {
    -      console.log()
    -    })
    -  }
    -}
    -
    -module.exports = Reporter
    diff --git a/deps/npm/node_modules/node-gyp/test/simple-proxy.js b/deps/npm/node_modules/node-gyp/test/simple-proxy.js
    deleted file mode 100644
    index cb0dfcfec7edcd..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/simple-proxy.js
    +++ /dev/null
    @@ -1,27 +0,0 @@
    -'use strict'
    -
    -const http = require('http')
    -const https = require('https')
    -const server = http.createServer(handler)
    -const port = +process.argv[2]
    -const prefix = process.argv[3]
    -const upstream = process.argv[4]
    -var calls = 0
    -
    -server.listen(port)
    -
    -function handler (req, res) {
    -  if (req.url.indexOf(prefix) !== 0) {
    -    throw new Error('request url [' + req.url + '] does not start with [' + prefix + ']')
    -  }
    -
    -  var upstreamUrl = upstream + req.url.substring(prefix.length)
    -  https.get(upstreamUrl, function (ures) {
    -    ures.on('end', function () {
    -      if (++calls === 2) {
    -        server.close()
    -      }
    -    })
    -    ures.pipe(res)
    -  })
    -}
    diff --git a/deps/npm/node_modules/node-gyp/test/test-addon.js b/deps/npm/node_modules/node-gyp/test/test-addon.js
    deleted file mode 100644
    index 43556620a85abb..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/test-addon.js
    +++ /dev/null
    @@ -1,152 +0,0 @@
    -'use strict'
    -
    -const { describe, it } = require('mocha')
    -const assert = require('assert')
    -const path = require('path')
    -const fs = require('graceful-fs')
    -const childProcess = require('child_process')
    -const os = require('os')
    -const addonPath = path.resolve(__dirname, 'node_modules', 'hello_world')
    -const nodeGyp = path.resolve(__dirname, '..', 'bin', 'node-gyp.js')
    -const execFileSync = childProcess.execFileSync || require('./process-exec-sync')
    -const execFile = childProcess.execFile
    -
    -function runHello (hostProcess) {
    -  if (!hostProcess) {
    -    hostProcess = process.execPath
    -  }
    -  var testCode = "console.log(require('hello_world').hello())"
    -  return execFileSync(hostProcess, ['-e', testCode], { cwd: __dirname }).toString()
    -}
    -
    -function getEncoding () {
    -  var code = 'import locale;print(locale.getdefaultlocale()[1])'
    -  return execFileSync('python', ['-c', code]).toString().trim()
    -}
    -
    -function checkCharmapValid () {
    -  var data
    -  try {
    -    data = execFileSync('python', ['fixtures/test-charmap.py'],
    -      { cwd: __dirname })
    -  } catch (err) {
    -    return false
    -  }
    -  var lines = data.toString().trim().split('\n')
    -  return lines.pop() === 'True'
    -}
    -
    -describe('addon', function () {
    -  this.timeout(300000)
    -
    -  it('build simple addon', function (done) {
    -    // Set the loglevel otherwise the output disappears when run via 'npm test'
    -    var cmd = [nodeGyp, 'rebuild', '-C', addonPath, '--loglevel=verbose']
    -    var proc = execFile(process.execPath, cmd, function (err, stdout, stderr) {
    -      var logLines = stderr.toString().trim().split(/\r?\n/)
    -      var lastLine = logLines[logLines.length - 1]
    -      assert.strictEqual(err, null)
    -      assert.strictEqual(lastLine, 'gyp info ok', 'should end in ok')
    -      assert.strictEqual(runHello().trim(), 'world')
    -      done()
    -    })
    -    proc.stdout.setEncoding('utf-8')
    -    proc.stderr.setEncoding('utf-8')
    -  })
    -
    -  it('build simple addon in path with non-ascii characters', function (done) {
    -    if (!checkCharmapValid()) {
    -      return this.skip('python console app can\'t encode non-ascii character.')
    -    }
    -
    -    var testDirNames = {
    -      cp936: '文件夹',
    -      cp1252: 'Latīna',
    -      cp932: 'フォルダ'
    -    }
    -    // Select non-ascii characters by current encoding
    -    var testDirName = testDirNames[getEncoding()]
    -    // If encoding is UTF-8 or other then no need to test
    -    if (!testDirName) {
    -      return this.skip('no need to test')
    -    }
    -
    -    this.timeout(300000)
    -
    -    var data
    -    var configPath = path.join(addonPath, 'build', 'config.gypi')
    -    try {
    -      data = fs.readFileSync(configPath, 'utf8')
    -    } catch (err) {
    -      assert.fail(err)
    -      return
    -    }
    -    var config = JSON.parse(data.replace(/#.+\n/, ''))
    -    var nodeDir = config.variables.nodedir
    -    var testNodeDir = path.join(addonPath, testDirName)
    -    // Create symbol link to path with non-ascii characters
    -    try {
    -      fs.symlinkSync(nodeDir, testNodeDir, 'dir')
    -    } catch (err) {
    -      switch (err.code) {
    -        case 'EEXIST': break
    -        case 'EPERM':
    -          assert.fail(err, null, 'Please try to running console as an administrator')
    -          return
    -        default:
    -          assert.fail(err)
    -          return
    -      }
    -    }
    -
    -    var cmd = [
    -      nodeGyp,
    -      'rebuild',
    -      '-C',
    -      addonPath,
    -      '--loglevel=verbose',
    -      '-nodedir=' + testNodeDir
    -    ]
    -    var proc = execFile(process.execPath, cmd, function (err, stdout, stderr) {
    -      try {
    -        fs.unlink(testNodeDir)
    -      } catch (err) {
    -        assert.fail(err)
    -      }
    -
    -      var logLines = stderr.toString().trim().split(/\r?\n/)
    -      var lastLine = logLines[logLines.length - 1]
    -      assert.strictEqual(err, null)
    -      assert.strictEqual(lastLine, 'gyp info ok', 'should end in ok')
    -      assert.strictEqual(runHello().trim(), 'world')
    -      done()
    -    })
    -    proc.stdout.setEncoding('utf-8')
    -    proc.stderr.setEncoding('utf-8')
    -  })
    -
    -  it('addon works with renamed host executable', function (done) {
    -    // No `fs.copyFileSync` before node8.
    -    if (process.version.substr(1).split('.')[0] < 8) {
    -      return this.skip('skipping test for old node version')
    -    }
    -
    -    this.timeout(300000)
    -
    -    var notNodePath = path.join(os.tmpdir(), 'notnode' + path.extname(process.execPath))
    -    fs.copyFileSync(process.execPath, notNodePath)
    -
    -    var cmd = [nodeGyp, 'rebuild', '-C', addonPath, '--loglevel=verbose']
    -    var proc = execFile(process.execPath, cmd, function (err, stdout, stderr) {
    -      var logLines = stderr.toString().trim().split(/\r?\n/)
    -      var lastLine = logLines[logLines.length - 1]
    -      assert.strictEqual(err, null)
    -      assert.strictEqual(lastLine, 'gyp info ok', 'should end in ok')
    -      assert.strictEqual(runHello(notNodePath).trim(), 'world')
    -      fs.unlinkSync(notNodePath)
    -      done()
    -    })
    -    proc.stdout.setEncoding('utf-8')
    -    proc.stderr.setEncoding('utf-8')
    -  })
    -})
    diff --git a/deps/npm/node_modules/node-gyp/test/test-configure-python.js b/deps/npm/node_modules/node-gyp/test/test-configure-python.js
    deleted file mode 100644
    index ab1e5511fad980..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/test-configure-python.js
    +++ /dev/null
    @@ -1,81 +0,0 @@
    -'use strict'
    -
    -const { describe, it } = require('mocha')
    -const assert = require('assert')
    -const path = require('path')
    -const devDir = require('./common').devDir()
    -const gyp = require('../lib/node-gyp')
    -const requireInject = require('require-inject')
    -const configure = requireInject('../lib/configure', {
    -  'graceful-fs': {
    -    openSync: function () { return 0 },
    -    closeSync: function () { },
    -    writeFile: function (file, data, cb) { cb() },
    -    stat: function (file, cb) { cb(null, {}) },
    -    mkdir: function (dir, options, cb) { cb() },
    -    promises: {
    -      writeFile: function (file, data) { return Promise.resolve(null) }
    -    },
    -    unlink: function (path, cb) { cb() },
    -    symlink: function (target, path, cb) { cb() }
    -  }
    -})
    -
    -const EXPECTED_PYPATH = path.join(__dirname, '..', 'gyp', 'pylib')
    -const SEPARATOR = process.platform === 'win32' ? ';' : ':'
    -const SPAWN_RESULT = cb => ({ on: function () { cb() } })
    -
    -require('npmlog').level = 'warn'
    -
    -describe('configure-python', function () {
    -  it('configure PYTHONPATH with no existing env', function (done) {
    -    delete process.env.PYTHONPATH
    -
    -    var prog = gyp()
    -    prog.parseArgv([])
    -    prog.spawn = function () {
    -      assert.strictEqual(process.env.PYTHONPATH, EXPECTED_PYPATH)
    -      return SPAWN_RESULT(done)
    -    }
    -    prog.devDir = devDir
    -    configure(prog, [], assert.fail)
    -  })
    -
    -  it('configure PYTHONPATH with existing env of one dir', function (done) {
    -    var existingPath = path.join('a', 'b')
    -    process.env.PYTHONPATH = existingPath
    -
    -    var prog = gyp()
    -    prog.parseArgv([])
    -    prog.spawn = function () {
    -      assert.strictEqual(process.env.PYTHONPATH, [EXPECTED_PYPATH, existingPath].join(SEPARATOR))
    -
    -      var dirs = process.env.PYTHONPATH.split(SEPARATOR)
    -      assert.deepStrictEqual(dirs, [EXPECTED_PYPATH, existingPath])
    -
    -      return SPAWN_RESULT(done)
    -    }
    -    prog.devDir = devDir
    -    configure(prog, [], assert.fail)
    -  })
    -
    -  it('configure PYTHONPATH with existing env of multiple dirs', function (done) {
    -    var pythonDir1 = path.join('a', 'b')
    -    var pythonDir2 = path.join('b', 'c')
    -    var existingPath = [pythonDir1, pythonDir2].join(SEPARATOR)
    -    process.env.PYTHONPATH = existingPath
    -
    -    var prog = gyp()
    -    prog.parseArgv([])
    -    prog.spawn = function () {
    -      assert.strictEqual(process.env.PYTHONPATH, [EXPECTED_PYPATH, existingPath].join(SEPARATOR))
    -
    -      var dirs = process.env.PYTHONPATH.split(SEPARATOR)
    -      assert.deepStrictEqual(dirs, [EXPECTED_PYPATH, pythonDir1, pythonDir2])
    -
    -      return SPAWN_RESULT(done)
    -    }
    -    prog.devDir = devDir
    -    configure(prog, [], assert.fail)
    -  })
    -})
    diff --git a/deps/npm/node_modules/node-gyp/test/test-create-config-gypi.js b/deps/npm/node_modules/node-gyp/test/test-create-config-gypi.js
    deleted file mode 100644
    index 725819b6aa1029..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/test-create-config-gypi.js
    +++ /dev/null
    @@ -1,61 +0,0 @@
    -'use strict'
    -
    -const path = require('path')
    -const { describe, it } = require('mocha')
    -const assert = require('assert')
    -const gyp = require('../lib/node-gyp')
    -const createConfigGypi = require('../lib/create-config-gypi')
    -const { parseConfigGypi, getCurrentConfigGypi } = createConfigGypi.test
    -
    -describe('create-config-gypi', function () {
    -  it('config.gypi with no options', async function () {
    -    const prog = gyp()
    -    prog.parseArgv([])
    -
    -    const config = await getCurrentConfigGypi({ gyp: prog, vsInfo: {} })
    -    assert.strictEqual(config.target_defaults.default_configuration, 'Release')
    -    assert.strictEqual(config.variables.target_arch, process.arch)
    -  })
    -
    -  it('config.gypi with --debug', async function () {
    -    const prog = gyp()
    -    prog.parseArgv(['_', '_', '--debug'])
    -
    -    const config = await getCurrentConfigGypi({ gyp: prog, vsInfo: {} })
    -    assert.strictEqual(config.target_defaults.default_configuration, 'Debug')
    -  })
    -
    -  it('config.gypi with custom options', async function () {
    -    const prog = gyp()
    -    prog.parseArgv(['_', '_', '--shared-libxml2'])
    -
    -    const config = await getCurrentConfigGypi({ gyp: prog, vsInfo: {} })
    -    assert.strictEqual(config.variables.shared_libxml2, true)
    -  })
    -
    -  it('config.gypi with nodedir', async function () {
    -    const nodeDir = path.join(__dirname, 'fixtures', 'nodedir')
    -
    -    const prog = gyp()
    -    prog.parseArgv(['_', '_', `--nodedir=${nodeDir}`])
    -
    -    const config = await getCurrentConfigGypi({ gyp: prog, nodeDir, vsInfo: {} })
    -    assert.strictEqual(config.variables.build_with_electron, true)
    -  })
    -
    -  it('config.gypi with --force-process-config', async function () {
    -    const nodeDir = path.join(__dirname, 'fixtures', 'nodedir')
    -
    -    const prog = gyp()
    -    prog.parseArgv(['_', '_', '--force-process-config', `--nodedir=${nodeDir}`])
    -
    -    const config = await getCurrentConfigGypi({ gyp: prog, nodeDir, vsInfo: {} })
    -    assert.strictEqual(config.variables.build_with_electron, undefined)
    -  })
    -
    -  it('config.gypi parsing', function () {
    -    const str = "# Some comments\n{'variables': {'multiline': 'A'\n'B'}}"
    -    const config = parseConfigGypi(str)
    -    assert.deepStrictEqual(config, { variables: { multiline: 'AB' } })
    -  })
    -})
    diff --git a/deps/npm/node_modules/node-gyp/test/test-download.js b/deps/npm/node_modules/node-gyp/test/test-download.js
    deleted file mode 100644
    index 1dd5a51b062c0b..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/test-download.js
    +++ /dev/null
    @@ -1,210 +0,0 @@
    -'use strict'
    -
    -const { describe, it, after } = require('mocha')
    -const assert = require('assert')
    -const fs = require('fs')
    -const path = require('path')
    -const util = require('util')
    -const http = require('http')
    -const https = require('https')
    -const install = require('../lib/install')
    -const semver = require('semver')
    -const devDir = require('./common').devDir()
    -const rimraf = require('rimraf')
    -const gyp = require('../lib/node-gyp')
    -const log = require('npmlog')
    -const certs = require('./fixtures/certs')
    -
    -log.level = 'warn'
    -
    -describe('download', function () {
    -  it('download over http', async function () {
    -    const server = http.createServer((req, res) => {
    -      assert.strictEqual(req.headers['user-agent'], `node-gyp v42 (node ${process.version})`)
    -      res.end('ok')
    -    })
    -
    -    after(() => new Promise((resolve) => server.close(resolve)))
    -
    -    const host = 'localhost'
    -    await new Promise((resolve) => server.listen(0, host, resolve))
    -    const { port } = server.address()
    -    const gyp = {
    -      opts: {},
    -      version: '42'
    -    }
    -    const url = `http://${host}:${port}`
    -    const res = await install.test.download(gyp, url)
    -    assert.strictEqual(await res.text(), 'ok')
    -  })
    -
    -  it('download over https with custom ca', async function () {
    -    const cafile = path.join(__dirname, 'fixtures/ca.crt')
    -    const cacontents = certs['ca.crt']
    -    const cert = certs['server.crt']
    -    const key = certs['server.key']
    -    await fs.promises.writeFile(cafile, cacontents, 'utf8')
    -    const ca = await install.test.readCAFile(cafile)
    -
    -    assert.strictEqual(ca.length, 1)
    -
    -    const options = { ca: ca, cert: cert, key: key }
    -    const server = https.createServer(options, (req, res) => {
    -      assert.strictEqual(req.headers['user-agent'], `node-gyp v42 (node ${process.version})`)
    -      res.end('ok')
    -    })
    -
    -    after(async () => {
    -      await new Promise((resolve) => server.close(resolve))
    -      await fs.promises.unlink(cafile)
    -    })
    -
    -    server.on('clientError', (err) => { throw err })
    -
    -    const host = 'localhost'
    -    await new Promise((resolve) => server.listen(0, host, resolve))
    -    const { port } = server.address()
    -    const gyp = {
    -      opts: { cafile },
    -      version: '42'
    -    }
    -    const url = `https://${host}:${port}`
    -    const res = await install.test.download(gyp, url)
    -    assert.strictEqual(await res.text(), 'ok')
    -  })
    -
    -  it('download over http with proxy', async function () {
    -    const server = http.createServer((_, res) => {
    -      res.end('ok')
    -    })
    -
    -    const pserver = http.createServer((req, res) => {
    -      assert.strictEqual(req.headers['user-agent'], `node-gyp v42 (node ${process.version})`)
    -      res.end('proxy ok')
    -    })
    -
    -    after(() => Promise.all([
    -      new Promise((resolve) => server.close(resolve)),
    -      new Promise((resolve) => pserver.close(resolve))
    -    ]))
    -
    -    const host = 'localhost'
    -    await new Promise((resolve) => server.listen(0, host, resolve))
    -    const { port } = server.address()
    -    await new Promise((resolve) => pserver.listen(port + 1, host, resolve))
    -    const gyp = {
    -      opts: {
    -        proxy: `http://${host}:${port + 1}`,
    -        noproxy: 'bad'
    -      },
    -      version: '42'
    -    }
    -    const url = `http://${host}:${port}`
    -    const res = await install.test.download(gyp, url)
    -    assert.strictEqual(await res.text(), 'proxy ok')
    -  })
    -
    -  it('download over http with noproxy', async function () {
    -    const server = http.createServer((req, res) => {
    -      assert.strictEqual(req.headers['user-agent'], `node-gyp v42 (node ${process.version})`)
    -      res.end('ok')
    -    })
    -
    -    const pserver = http.createServer((_, res) => {
    -      res.end('proxy ok')
    -    })
    -
    -    after(() => Promise.all([
    -      new Promise((resolve) => server.close(resolve)),
    -      new Promise((resolve) => pserver.close(resolve))
    -    ]))
    -
    -    const host = 'localhost'
    -    await new Promise((resolve) => server.listen(0, host, resolve))
    -    const { port } = server.address()
    -    await new Promise((resolve) => pserver.listen(port + 1, host, resolve))
    -    const gyp = {
    -      opts: {
    -        proxy: `http://${host}:${port + 1}`,
    -        noproxy: host
    -      },
    -      version: '42'
    -    }
    -    const url = `http://${host}:${port}`
    -    const res = await install.test.download(gyp, url)
    -    assert.strictEqual(await res.text(), 'ok')
    -  })
    -
    -  it('download with missing cafile', async function () {
    -    const gyp = {
    -      opts: { cafile: 'no.such.file' }
    -    }
    -    try {
    -      await install.test.download(gyp, {}, 'http://bad/')
    -    } catch (e) {
    -      assert.ok(/no.such.file/.test(e.message))
    -    }
    -  })
    -
    -  it('check certificate splitting', async function () {
    -    const cafile = path.join(__dirname, 'fixtures/ca-bundle.crt')
    -    const cacontents = certs['ca-bundle.crt']
    -    await fs.promises.writeFile(cafile, cacontents, 'utf8')
    -    after(async () => {
    -      await fs.promises.unlink(cafile)
    -    })
    -    const cas = await install.test.readCAFile(path.join(__dirname, 'fixtures/ca-bundle.crt'))
    -    assert.strictEqual(cas.length, 2)
    -    assert.notStrictEqual(cas[0], cas[1])
    -  })
    -
    -  // only run this test if we are running a version of Node with predictable version path behavior
    -
    -  it('download headers (actual)', async function () {
    -    if (process.env.FAST_TEST ||
    -        process.release.name !== 'node' ||
    -        semver.prerelease(process.version) !== null ||
    -        semver.satisfies(process.version, '<10')) {
    -      return this.skip('Skipping actual download of headers due to test environment configuration')
    -    }
    -
    -    this.timeout(300000)
    -
    -    const expectedDir = path.join(devDir, process.version.replace(/^v/, ''))
    -    await util.promisify(rimraf)(expectedDir)
    -
    -    const prog = gyp()
    -    prog.parseArgv([])
    -    prog.devDir = devDir
    -    log.level = 'warn'
    -    await util.promisify(install)(prog, [])
    -
    -    const data = await fs.promises.readFile(path.join(expectedDir, 'installVersion'), 'utf8')
    -    assert.strictEqual(data, '11\n', 'correct installVersion')
    -
    -    const list = await fs.promises.readdir(path.join(expectedDir, 'include/node'))
    -    assert.ok(list.includes('common.gypi'))
    -    assert.ok(list.includes('config.gypi'))
    -    assert.ok(list.includes('node.h'))
    -    assert.ok(list.includes('node_version.h'))
    -    assert.ok(list.includes('openssl'))
    -    assert.ok(list.includes('uv'))
    -    assert.ok(list.includes('uv.h'))
    -    assert.ok(list.includes('v8-platform.h'))
    -    assert.ok(list.includes('v8.h'))
    -    assert.ok(list.includes('zlib.h'))
    -
    -    const lines = (await fs.promises.readFile(path.join(expectedDir, 'include/node/node_version.h'), 'utf8')).split('\n')
    -
    -    // extract the 3 version parts from the defines to build a valid version string and
    -    // and check them against our current env version
    -    const version = ['major', 'minor', 'patch'].reduce((version, type) => {
    -      const re = new RegExp(`^#define\\sNODE_${type.toUpperCase()}_VERSION`)
    -      const line = lines.find((l) => re.test(l))
    -      const i = line ? parseInt(line.replace(/^[^0-9]+([0-9]+).*$/, '$1'), 10) : 'ERROR'
    -      return `${version}${type !== 'major' ? '.' : 'v'}${i}`
    -    }, '')
    -
    -    assert.strictEqual(version, process.version)
    -  })
    -})
    diff --git a/deps/npm/node_modules/node-gyp/test/test-find-accessible-sync.js b/deps/npm/node_modules/node-gyp/test/test-find-accessible-sync.js
    deleted file mode 100644
    index 7edbc0c76446ed..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/test-find-accessible-sync.js
    +++ /dev/null
    @@ -1,73 +0,0 @@
    -'use strict'
    -
    -const { describe, it } = require('mocha')
    -const assert = require('assert')
    -const path = require('path')
    -const requireInject = require('require-inject')
    -const configure = requireInject('../lib/configure', {
    -  'graceful-fs': {
    -    closeSync: function () { return undefined },
    -    openSync: function (path) {
    -      if (readableFiles.some(function (f) { return f === path })) {
    -        return 0
    -      } else {
    -        var error = new Error('ENOENT - not found')
    -        throw error
    -      }
    -    }
    -  }
    -})
    -
    -const dir = path.sep + 'testdir'
    -const readableFile = 'readable_file'
    -const anotherReadableFile = 'another_readable_file'
    -const readableFileInDir = 'somedir' + path.sep + readableFile
    -const readableFiles = [
    -  path.resolve(dir, readableFile),
    -  path.resolve(dir, anotherReadableFile),
    -  path.resolve(dir, readableFileInDir)
    -]
    -
    -describe('find-accessible-sync', function () {
    -  it('find accessible - empty array', function () {
    -    var candidates = []
    -    var found = configure.test.findAccessibleSync('test', dir, candidates)
    -    assert.strictEqual(found, undefined)
    -  })
    -
    -  it('find accessible - single item array, readable', function () {
    -    var candidates = [readableFile]
    -    var found = configure.test.findAccessibleSync('test', dir, candidates)
    -    assert.strictEqual(found, path.resolve(dir, readableFile))
    -  })
    -
    -  it('find accessible - single item array, readable in subdir', function () {
    -    var candidates = [readableFileInDir]
    -    var found = configure.test.findAccessibleSync('test', dir, candidates)
    -    assert.strictEqual(found, path.resolve(dir, readableFileInDir))
    -  })
    -
    -  it('find accessible - single item array, unreadable', function () {
    -    var candidates = ['unreadable_file']
    -    var found = configure.test.findAccessibleSync('test', dir, candidates)
    -    assert.strictEqual(found, undefined)
    -  })
    -
    -  it('find accessible - multi item array, no matches', function () {
    -    var candidates = ['non_existent_file', 'unreadable_file']
    -    var found = configure.test.findAccessibleSync('test', dir, candidates)
    -    assert.strictEqual(found, undefined)
    -  })
    -
    -  it('find accessible - multi item array, single match', function () {
    -    var candidates = ['non_existent_file', readableFile]
    -    var found = configure.test.findAccessibleSync('test', dir, candidates)
    -    assert.strictEqual(found, path.resolve(dir, readableFile))
    -  })
    -
    -  it('find accessible - multi item array, return first match', function () {
    -    var candidates = ['non_existent_file', anotherReadableFile, readableFile]
    -    var found = configure.test.findAccessibleSync('test', dir, candidates)
    -    assert.strictEqual(found, path.resolve(dir, anotherReadableFile))
    -  })
    -})
    diff --git a/deps/npm/node_modules/node-gyp/test/test-find-node-directory.js b/deps/npm/node_modules/node-gyp/test/test-find-node-directory.js
    deleted file mode 100644
    index ca299f63306469..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/test-find-node-directory.js
    +++ /dev/null
    @@ -1,115 +0,0 @@
    -'use strict'
    -
    -const { describe, it } = require('mocha')
    -const assert = require('assert')
    -const path = require('path')
    -const findNodeDirectory = require('../lib/find-node-directory')
    -
    -const platforms = ['darwin', 'freebsd', 'linux', 'sunos', 'win32', 'aix', 'os400']
    -
    -describe('find-node-directory', function () {
    -  // we should find the directory based on the directory
    -  // the script is running in and it should match the layout
    -  // in a build tree where npm is installed in
    -  // .... /deps/npm
    -  it('test find-node-directory - node install', function () {
    -    for (var next = 0; next < platforms.length; next++) {
    -      var processObj = { execPath: '/x/y/bin/node', platform: platforms[next] }
    -      assert.strictEqual(
    -        findNodeDirectory('/x/deps/npm/node_modules/node-gyp/lib', processObj),
    -        path.join('/x'))
    -    }
    -  })
    -
    -  // we should find the directory based on the directory
    -  // the script is running in and it should match the layout
    -  // in an installed tree where npm is installed in
    -  // .... /lib/node_modules/npm or .../node_modules/npm
    -  // depending on the patform
    -  it('test find-node-directory - node build', function () {
    -    for (var next = 0; next < platforms.length; next++) {
    -      var processObj = { execPath: '/x/y/bin/node', platform: platforms[next] }
    -      if (platforms[next] === 'win32') {
    -        assert.strictEqual(
    -          findNodeDirectory('/y/node_modules/npm/node_modules/node-gyp/lib',
    -            processObj), path.join('/y'))
    -      } else {
    -        assert.strictEqual(
    -          findNodeDirectory('/y/lib/node_modules/npm/node_modules/node-gyp/lib',
    -            processObj), path.join('/y'))
    -      }
    -    }
    -  })
    -
    -  // we should find the directory based on the execPath
    -  // for node and match because it was in the bin directory
    -  it('test find-node-directory - node in bin directory', function () {
    -    for (var next = 0; next < platforms.length; next++) {
    -      var processObj = { execPath: '/x/y/bin/node', platform: platforms[next] }
    -      assert.strictEqual(
    -        findNodeDirectory('/nothere/npm/node_modules/node-gyp/lib', processObj),
    -        path.join('/x/y'))
    -    }
    -  })
    -
    -  // we should find the directory based on the execPath
    -  // for node and match because it was in the Release directory
    -  it('test find-node-directory - node in build release dir', function () {
    -    for (var next = 0; next < platforms.length; next++) {
    -      var processObj
    -      if (platforms[next] === 'win32') {
    -        processObj = { execPath: '/x/y/Release/node', platform: platforms[next] }
    -      } else {
    -        processObj = {
    -          execPath: '/x/y/out/Release/node',
    -          platform: platforms[next]
    -        }
    -      }
    -
    -      assert.strictEqual(
    -        findNodeDirectory('/nothere/npm/node_modules/node-gyp/lib', processObj),
    -        path.join('/x/y'))
    -    }
    -  })
    -
    -  // we should find the directory based on the execPath
    -  // for node and match because it was in the Debug directory
    -  it('test find-node-directory - node in Debug release dir', function () {
    -    for (var next = 0; next < platforms.length; next++) {
    -      var processObj
    -      if (platforms[next] === 'win32') {
    -        processObj = { execPath: '/a/b/Debug/node', platform: platforms[next] }
    -      } else {
    -        processObj = { execPath: '/a/b/out/Debug/node', platform: platforms[next] }
    -      }
    -
    -      assert.strictEqual(
    -        findNodeDirectory('/nothere/npm/node_modules/node-gyp/lib', processObj),
    -        path.join('/a/b'))
    -    }
    -  })
    -
    -  // we should not find it as it will not match based on the execPath nor
    -  // the directory from which the script is running
    -  it('test find-node-directory - not found', function () {
    -    for (var next = 0; next < platforms.length; next++) {
    -      var processObj = { execPath: '/x/y/z/y', platform: next }
    -      assert.strictEqual(findNodeDirectory('/a/b/c/d', processObj), '')
    -    }
    -  })
    -
    -  // we should find the directory based on the directory
    -  // the script is running in and it should match the layout
    -  // in a build tree where npm is installed in
    -  // .... /deps/npm
    -  // same test as above but make sure additional directory entries
    -  // don't cause an issue
    -  it('test find-node-directory - node install', function () {
    -    for (var next = 0; next < platforms.length; next++) {
    -      var processObj = { execPath: '/x/y/bin/node', platform: platforms[next] }
    -      assert.strictEqual(
    -        findNodeDirectory('/x/y/z/a/b/c/deps/npm/node_modules/node-gyp/lib',
    -          processObj), path.join('/x/y/z/a/b/c'))
    -    }
    -  })
    -})
    diff --git a/deps/npm/node_modules/node-gyp/test/test-find-python.js b/deps/npm/node_modules/node-gyp/test/test-find-python.js
    deleted file mode 100644
    index 592c480f24fef2..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/test-find-python.js
    +++ /dev/null
    @@ -1,213 +0,0 @@
    -'use strict'
    -
    -delete process.env.PYTHON
    -
    -const { describe, it } = require('mocha')
    -const assert = require('assert')
    -const findPython = require('../lib/find-python')
    -const execFile = require('child_process').execFile
    -const PythonFinder = findPython.test.PythonFinder
    -
    -require('npmlog').level = 'warn'
    -
    -describe('find-python', function () {
    -  it('find python', function () {
    -    findPython.test.findPython(null, function (err, found) {
    -      assert.strictEqual(err, null)
    -      var proc = execFile(found, ['-V'], function (err, stdout, stderr) {
    -        assert.strictEqual(err, null)
    -        assert.ok(/Python 3/.test(stdout))
    -        assert.strictEqual(stderr, '')
    -      })
    -      proc.stdout.setEncoding('utf-8')
    -      proc.stderr.setEncoding('utf-8')
    -    })
    -  })
    -
    -  function poison (object, property) {
    -    function fail () {
    -      console.error(Error(`Property ${property} should not have been accessed.`))
    -      process.abort()
    -    }
    -    var descriptor = {
    -      configurable: false,
    -      enumerable: false,
    -      get: fail,
    -      set: fail
    -    }
    -    Object.defineProperty(object, property, descriptor)
    -  }
    -
    -  function TestPythonFinder () {
    -    PythonFinder.apply(this, arguments)
    -  }
    -  TestPythonFinder.prototype = Object.create(PythonFinder.prototype)
    -  // Silence npmlog - remove for debugging
    -  TestPythonFinder.prototype.log = {
    -    silly: () => {},
    -    verbose: () => {},
    -    info: () => {},
    -    warn: () => {},
    -    error: () => {}
    -  }
    -  delete TestPythonFinder.prototype.env.NODE_GYP_FORCE_PYTHON
    -
    -  it('find python - python', function () {
    -    var f = new TestPythonFinder('python', done)
    -    f.execFile = function (program, args, opts, cb) {
    -      f.execFile = function (program, args, opts, cb) {
    -        poison(f, 'execFile')
    -        assert.strictEqual(program, '/path/python')
    -        assert.ok(/sys\.version_info/.test(args[1]))
    -        cb(null, '3.9.1')
    -      }
    -      assert.strictEqual(program,
    -        process.platform === 'win32' ? '"python"' : 'python')
    -      assert.ok(/sys\.executable/.test(args[1]))
    -      cb(null, '/path/python')
    -    }
    -    f.findPython()
    -
    -    function done (err, python) {
    -      assert.strictEqual(err, null)
    -      assert.strictEqual(python, '/path/python')
    -    }
    -  })
    -
    -  it('find python - python too old', function () {
    -    var f = new TestPythonFinder(null, done)
    -    f.execFile = function (program, args, opts, cb) {
    -      if (/sys\.executable/.test(args[args.length - 1])) {
    -        cb(null, '/path/python')
    -      } else if (/sys\.version_info/.test(args[args.length - 1])) {
    -        cb(null, '2.3.4')
    -      } else {
    -        assert.fail()
    -      }
    -    }
    -    f.findPython()
    -
    -    function done (err) {
    -      assert.ok(/Could not find any Python/.test(err))
    -      assert.ok(/not supported/i.test(f.errorLog))
    -    }
    -  })
    -
    -  it('find python - no python', function () {
    -    var f = new TestPythonFinder(null, done)
    -    f.execFile = function (program, args, opts, cb) {
    -      if (/sys\.executable/.test(args[args.length - 1])) {
    -        cb(new Error('not found'))
    -      } else if (/sys\.version_info/.test(args[args.length - 1])) {
    -        cb(new Error('not a Python executable'))
    -      } else {
    -        assert.fail()
    -      }
    -    }
    -    f.findPython()
    -
    -    function done (err) {
    -      assert.ok(/Could not find any Python/.test(err))
    -      assert.ok(/not in PATH/.test(f.errorLog))
    -    }
    -  })
    -
    -  it('find python - no python2, no python, unix', function () {
    -    var f = new TestPythonFinder(null, done)
    -    f.checkPyLauncher = assert.fail
    -    f.win = false
    -
    -    f.execFile = function (program, args, opts, cb) {
    -      if (/sys\.executable/.test(args[args.length - 1])) {
    -        cb(new Error('not found'))
    -      } else {
    -        assert.fail()
    -      }
    -    }
    -    f.findPython()
    -
    -    function done (err) {
    -      assert.ok(/Could not find any Python/.test(err))
    -      assert.ok(/not in PATH/.test(f.errorLog))
    -    }
    -  })
    -
    -  it('find python - no python, use python launcher', function () {
    -    var f = new TestPythonFinder(null, done)
    -    f.win = true
    -
    -    f.execFile = function (program, args, opts, cb) {
    -      if (program === 'py.exe') {
    -        assert.notStrictEqual(args.indexOf('-3'), -1)
    -        assert.notStrictEqual(args.indexOf('-c'), -1)
    -        return cb(null, 'Z:\\snake.exe')
    -      }
    -      if (/sys\.executable/.test(args[args.length - 1])) {
    -        cb(new Error('not found'))
    -      } else if (f.winDefaultLocations.includes(program)) {
    -        cb(new Error('not found'))
    -      } else if (/sys\.version_info/.test(args[args.length - 1])) {
    -        if (program === 'Z:\\snake.exe') {
    -          cb(null, '3.9.0')
    -        } else {
    -          assert.fail()
    -        }
    -      } else {
    -        assert.fail()
    -      }
    -    }
    -    f.findPython()
    -
    -    function done (err, python) {
    -      assert.strictEqual(err, null)
    -      assert.strictEqual(python, 'Z:\\snake.exe')
    -    }
    -  })
    -
    -  it('find python - no python, no python launcher, good guess', function () {
    -    var f = new TestPythonFinder(null, done)
    -    f.win = true
    -    const expectedProgram = f.winDefaultLocations[0]
    -
    -    f.execFile = function (program, args, opts, cb) {
    -      if (program === 'py.exe') {
    -        return cb(new Error('not found'))
    -      }
    -      if (/sys\.executable/.test(args[args.length - 1])) {
    -        cb(new Error('not found'))
    -      } else if (program === expectedProgram &&
    -                 /sys\.version_info/.test(args[args.length - 1])) {
    -        cb(null, '3.7.3')
    -      } else {
    -        assert.fail()
    -      }
    -    }
    -    f.findPython()
    -
    -    function done (err, python) {
    -      assert.strictEqual(err, null)
    -      assert.ok(python === expectedProgram)
    -    }
    -  })
    -
    -  it('find python - no python, no python launcher, bad guess', function () {
    -    var f = new TestPythonFinder(null, done)
    -    f.win = true
    -
    -    f.execFile = function (program, args, opts, cb) {
    -      if (/sys\.executable/.test(args[args.length - 1])) {
    -        cb(new Error('not found'))
    -      } else if (/sys\.version_info/.test(args[args.length - 1])) {
    -        cb(new Error('not a Python executable'))
    -      } else {
    -        assert.fail()
    -      }
    -    }
    -    f.findPython()
    -
    -    function done (err) {
    -      assert.ok(/Could not find any Python/.test(err))
    -      assert.ok(/not in PATH/.test(f.errorLog))
    -    }
    -  })
    -})
    diff --git a/deps/npm/node_modules/node-gyp/test/test-find-visualstudio.js b/deps/npm/node_modules/node-gyp/test/test-find-visualstudio.js
    deleted file mode 100644
    index 29d9a7dba5f550..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/test-find-visualstudio.js
    +++ /dev/null
    @@ -1,670 +0,0 @@
    -'use strict'
    -
    -const { describe, it } = require('mocha')
    -const assert = require('assert')
    -const fs = require('fs')
    -const path = require('path')
    -const findVisualStudio = require('../lib/find-visualstudio')
    -const VisualStudioFinder = findVisualStudio.test.VisualStudioFinder
    -
    -const semverV1 = { major: 1, minor: 0, patch: 0 }
    -
    -delete process.env.VCINSTALLDIR
    -
    -function poison (object, property) {
    -  function fail () {
    -    console.error(Error(`Property ${property} should not have been accessed.`))
    -    process.abort()
    -  }
    -  var descriptor = {
    -    configurable: false,
    -    enumerable: false,
    -    get: fail,
    -    set: fail
    -  }
    -  Object.defineProperty(object, property, descriptor)
    -}
    -
    -function TestVisualStudioFinder () { VisualStudioFinder.apply(this, arguments) }
    -TestVisualStudioFinder.prototype = Object.create(VisualStudioFinder.prototype)
    -// Silence npmlog - remove for debugging
    -TestVisualStudioFinder.prototype.log = {
    -  silly: () => {},
    -  verbose: () => {},
    -  info: () => {},
    -  warn: () => {},
    -  error: () => {}
    -}
    -
    -describe('find-visualstudio', function () {
    -  it('VS2013', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
    -      assert.strictEqual(err, null)
    -      assert.deepStrictEqual(info, {
    -        msBuild: 'C:\\MSBuild12\\MSBuild.exe',
    -        path: 'C:\\VS2013',
    -        sdk: null,
    -        toolset: 'v120',
    -        version: '12.0',
    -        versionMajor: 12,
    -        versionMinor: 0,
    -        versionYear: 2013
    -      })
    -    })
    -
    -    finder.findVisualStudio2017OrNewer = (cb) => {
    -      finder.parseData(new Error(), '', '', cb)
    -    }
    -    finder.regSearchKeys = (keys, value, addOpts, cb) => {
    -      for (var i = 0; i < keys.length; ++i) {
    -        const fullName = `${keys[i]}\\${value}`
    -        switch (fullName) {
    -          case 'HKLM\\Software\\Microsoft\\VisualStudio\\SxS\\VC7\\14.0':
    -          case 'HKLM\\Software\\Wow6432Node\\Microsoft\\VisualStudio\\SxS\\VC7\\14.0':
    -            continue
    -          case 'HKLM\\Software\\Microsoft\\VisualStudio\\SxS\\VC7\\12.0':
    -            assert.ok(true, `expected search for registry value ${fullName}`)
    -            return cb(null, 'C:\\VS2013\\VC\\')
    -          case 'HKLM\\Software\\Microsoft\\MSBuild\\ToolsVersions\\12.0\\MSBuildToolsPath':
    -            assert.ok(true, `expected search for registry value ${fullName}`)
    -            return cb(null, 'C:\\MSBuild12\\')
    -          default:
    -            assert.fail(`unexpected search for registry value ${fullName}`)
    -        }
    -      }
    -      return cb(new Error())
    -    }
    -    finder.findVisualStudio()
    -  })
    -
    -  it('VS2013 should not be found on new node versions', function () {
    -    const finder = new TestVisualStudioFinder({
    -      major: 10,
    -      minor: 0,
    -      patch: 0
    -    }, null, (err, info) => {
    -      assert.ok(/find .* Visual Studio/i.test(err), 'expect error')
    -      assert.ok(!info, 'no data')
    -    })
    -
    -    finder.findVisualStudio2017OrNewer = (cb) => {
    -      const file = path.join(__dirname, 'fixtures', 'VS_2017_Unusable.txt')
    -      const data = fs.readFileSync(file)
    -      finder.parseData(null, data, '', cb)
    -    }
    -    finder.regSearchKeys = (keys, value, addOpts, cb) => {
    -      for (var i = 0; i < keys.length; ++i) {
    -        const fullName = `${keys[i]}\\${value}`
    -        switch (fullName) {
    -          case 'HKLM\\Software\\Microsoft\\VisualStudio\\SxS\\VC7\\14.0':
    -          case 'HKLM\\Software\\Wow6432Node\\Microsoft\\VisualStudio\\SxS\\VC7\\14.0':
    -            continue
    -          default:
    -            assert.fail(`unexpected search for registry value ${fullName}`)
    -        }
    -      }
    -      return cb(new Error())
    -    }
    -    finder.findVisualStudio()
    -  })
    -
    -  it('VS2015', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
    -      assert.strictEqual(err, null)
    -      assert.deepStrictEqual(info, {
    -        msBuild: 'C:\\MSBuild14\\MSBuild.exe',
    -        path: 'C:\\VS2015',
    -        sdk: null,
    -        toolset: 'v140',
    -        version: '14.0',
    -        versionMajor: 14,
    -        versionMinor: 0,
    -        versionYear: 2015
    -      })
    -    })
    -
    -    finder.findVisualStudio2017OrNewer = (cb) => {
    -      finder.parseData(new Error(), '', '', cb)
    -    }
    -    finder.regSearchKeys = (keys, value, addOpts, cb) => {
    -      for (var i = 0; i < keys.length; ++i) {
    -        const fullName = `${keys[i]}\\${value}`
    -        switch (fullName) {
    -          case 'HKLM\\Software\\Microsoft\\VisualStudio\\SxS\\VC7\\14.0':
    -            assert.ok(true, `expected search for registry value ${fullName}`)
    -            return cb(null, 'C:\\VS2015\\VC\\')
    -          case 'HKLM\\Software\\Microsoft\\MSBuild\\ToolsVersions\\14.0\\MSBuildToolsPath':
    -            assert.ok(true, `expected search for registry value ${fullName}`)
    -            return cb(null, 'C:\\MSBuild14\\')
    -          default:
    -            assert.fail(`unexpected search for registry value ${fullName}`)
    -        }
    -      }
    -      return cb(new Error())
    -    }
    -    finder.findVisualStudio()
    -  })
    -
    -  it('error from PowerShell', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, null, null)
    -
    -    finder.parseData(new Error(), '', '', (info) => {
    -      assert.ok(/use PowerShell/i.test(finder.errorLog[0]), 'expect error')
    -      assert.ok(!info, 'no data')
    -    })
    -  })
    -
    -  it('empty output from PowerShell', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, null, null)
    -
    -    finder.parseData(null, '', '', (info) => {
    -      assert.ok(/use PowerShell/i.test(finder.errorLog[0]), 'expect error')
    -      assert.ok(!info, 'no data')
    -    })
    -  })
    -
    -  it('output from PowerShell not JSON', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, null, null)
    -
    -    finder.parseData(null, 'AAAABBBB', '', (info) => {
    -      assert.ok(/use PowerShell/i.test(finder.errorLog[0]), 'expect error')
    -      assert.ok(!info, 'no data')
    -    })
    -  })
    -
    -  it('wrong JSON from PowerShell', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, null, null)
    -
    -    finder.parseData(null, '{}', '', (info) => {
    -      assert.ok(/use PowerShell/i.test(finder.errorLog[0]), 'expect error')
    -      assert.ok(!info, 'no data')
    -    })
    -  })
    -
    -  it('empty JSON from PowerShell', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, null, null)
    -
    -    finder.parseData(null, '[]', '', (info) => {
    -      assert.ok(/find .* Visual Studio/i.test(finder.errorLog[0]), 'expect error')
    -      assert.ok(!info, 'no data')
    -    })
    -  })
    -
    -  it('future version', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, null, null)
    -
    -    finder.parseData(null, JSON.stringify([{
    -      packages: [
    -        'Microsoft.VisualStudio.Component.VC.Tools.x86.x64',
    -        'Microsoft.VisualStudio.Component.Windows10SDK.17763',
    -        'Microsoft.VisualStudio.VC.MSBuild.Base'
    -      ],
    -      path: 'C:\\VS',
    -      version: '9999.9999.9999.9999'
    -    }]), '', (info) => {
    -      assert.ok(/unknown version/i.test(finder.errorLog[0]), 'expect error')
    -      assert.ok(/find .* Visual Studio/i.test(finder.errorLog[1]), 'expect error')
    -      assert.ok(!info, 'no data')
    -    })
    -  })
    -
    -  it('single unusable VS2017', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, null, null)
    -
    -    const file = path.join(__dirname, 'fixtures', 'VS_2017_Unusable.txt')
    -    const data = fs.readFileSync(file)
    -    finder.parseData(null, data, '', (info) => {
    -      assert.ok(/checking/i.test(finder.errorLog[0]), 'expect error')
    -      assert.ok(/find .* Visual Studio/i.test(finder.errorLog[2]), 'expect error')
    -      assert.ok(!info, 'no data')
    -    })
    -  })
    -
    -  it('minimal VS2017 Build Tools', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
    -      assert.strictEqual(err, null)
    -      assert.deepStrictEqual(info, {
    -        msBuild: 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\' +
    -          'BuildTools\\MSBuild\\15.0\\Bin\\MSBuild.exe',
    -        path:
    -          'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\BuildTools',
    -        sdk: '10.0.17134.0',
    -        toolset: 'v141',
    -        version: '15.9.28307.665',
    -        versionMajor: 15,
    -        versionMinor: 9,
    -        versionYear: 2017
    -      })
    -    })
    -
    -    poison(finder, 'regSearchKeys')
    -    finder.findVisualStudio2017OrNewer = (cb) => {
    -      const file = path.join(__dirname, 'fixtures',
    -        'VS_2017_BuildTools_minimal.txt')
    -      const data = fs.readFileSync(file)
    -      finder.parseData(null, data, '', cb)
    -    }
    -    finder.findVisualStudio()
    -  })
    -
    -  it('VS2017 Community with C++ workload', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
    -      assert.strictEqual(err, null)
    -      assert.deepStrictEqual(info, {
    -        msBuild: 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\' +
    -          'Community\\MSBuild\\15.0\\Bin\\MSBuild.exe',
    -        path:
    -          'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community',
    -        sdk: '10.0.17763.0',
    -        toolset: 'v141',
    -        version: '15.9.28307.665',
    -        versionMajor: 15,
    -        versionMinor: 9,
    -        versionYear: 2017
    -      })
    -    })
    -
    -    poison(finder, 'regSearchKeys')
    -    finder.findVisualStudio2017OrNewer = (cb) => {
    -      const file = path.join(__dirname, 'fixtures',
    -        'VS_2017_Community_workload.txt')
    -      const data = fs.readFileSync(file)
    -      finder.parseData(null, data, '', cb)
    -    }
    -    finder.findVisualStudio()
    -  })
    -
    -  it('VS2017 Express', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
    -      assert.strictEqual(err, null)
    -      assert.deepStrictEqual(info, {
    -        msBuild: 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\' +
    -          'WDExpress\\MSBuild\\15.0\\Bin\\MSBuild.exe',
    -        path:
    -          'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\WDExpress',
    -        sdk: '10.0.17763.0',
    -        toolset: 'v141',
    -        version: '15.9.28307.858',
    -        versionMajor: 15,
    -        versionMinor: 9,
    -        versionYear: 2017
    -      })
    -    })
    -
    -    poison(finder, 'regSearchKeys')
    -    finder.findVisualStudio2017OrNewer = (cb) => {
    -      const file = path.join(__dirname, 'fixtures', 'VS_2017_Express.txt')
    -      const data = fs.readFileSync(file)
    -      finder.parseData(null, data, '', cb)
    -    }
    -    finder.findVisualStudio()
    -  })
    -
    -  it('VS2019 Preview with C++ workload', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
    -      assert.strictEqual(err, null)
    -      assert.deepStrictEqual(info, {
    -        msBuild: 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\' +
    -          'Preview\\MSBuild\\Current\\Bin\\MSBuild.exe',
    -        path:
    -          'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Preview',
    -        sdk: '10.0.17763.0',
    -        toolset: 'v142',
    -        version: '16.0.28608.199',
    -        versionMajor: 16,
    -        versionMinor: 0,
    -        versionYear: 2019
    -      })
    -    })
    -
    -    poison(finder, 'regSearchKeys')
    -    finder.findVisualStudio2017OrNewer = (cb) => {
    -      const file = path.join(__dirname, 'fixtures',
    -        'VS_2019_Preview.txt')
    -      const data = fs.readFileSync(file)
    -      finder.parseData(null, data, '', cb)
    -    }
    -    finder.findVisualStudio()
    -  })
    -
    -  it('minimal VS2019 Build Tools', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
    -      assert.strictEqual(err, null)
    -      assert.deepStrictEqual(info, {
    -        msBuild: 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\' +
    -          'BuildTools\\MSBuild\\Current\\Bin\\MSBuild.exe',
    -        path:
    -          'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools',
    -        sdk: '10.0.17134.0',
    -        toolset: 'v142',
    -        version: '16.1.28922.388',
    -        versionMajor: 16,
    -        versionMinor: 1,
    -        versionYear: 2019
    -      })
    -    })
    -
    -    poison(finder, 'regSearchKeys')
    -    finder.findVisualStudio2017OrNewer = (cb) => {
    -      const file = path.join(__dirname, 'fixtures',
    -        'VS_2019_BuildTools_minimal.txt')
    -      const data = fs.readFileSync(file)
    -      finder.parseData(null, data, '', cb)
    -    }
    -    finder.findVisualStudio()
    -  })
    -
    -  it('VS2019 Community with C++ workload', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
    -      assert.strictEqual(err, null)
    -      assert.deepStrictEqual(info, {
    -        msBuild: 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\' +
    -          'Community\\MSBuild\\Current\\Bin\\MSBuild.exe',
    -        path:
    -          'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community',
    -        sdk: '10.0.17763.0',
    -        toolset: 'v142',
    -        version: '16.1.28922.388',
    -        versionMajor: 16,
    -        versionMinor: 1,
    -        versionYear: 2019
    -      })
    -    })
    -
    -    poison(finder, 'regSearchKeys')
    -    finder.findVisualStudio2017OrNewer = (cb) => {
    -      const file = path.join(__dirname, 'fixtures',
    -        'VS_2019_Community_workload.txt')
    -      const data = fs.readFileSync(file)
    -      finder.parseData(null, data, '', cb)
    -    }
    -    finder.findVisualStudio()
    -  })
    -
    -  it('VS2022 Preview with C++ workload', function () {
    -    const msBuildPath = process.arch === 'arm64'
    -      ? 'C:\\Program Files\\Microsoft Visual Studio\\2022\\' +
    -        'Community\\MSBuild\\Current\\Bin\\arm64\\MSBuild.exe'
    -      : 'C:\\Program Files\\Microsoft Visual Studio\\2022\\' +
    -        'Community\\MSBuild\\Current\\Bin\\MSBuild.exe'
    -
    -    const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
    -      assert.strictEqual(err, null)
    -      assert.deepStrictEqual(info, {
    -        msBuild: msBuildPath,
    -        path:
    -          'C:\\Program Files\\Microsoft Visual Studio\\2022\\Community',
    -        sdk: '10.0.22621.0',
    -        toolset: 'v143',
    -        version: '17.4.33213.308',
    -        versionMajor: 17,
    -        versionMinor: 4,
    -        versionYear: 2022
    -      })
    -    })
    -
    -    poison(finder, 'regSearchKeys')
    -    finder.msBuildPathExists = (path) => {
    -      return true
    -    }
    -    finder.findVisualStudio2017OrNewer = (cb) => {
    -      const file = path.join(__dirname, 'fixtures',
    -        'VS_2022_Community_workload.txt')
    -      const data = fs.readFileSync(file)
    -      finder.parseData(null, data, '', cb)
    -    }
    -    finder.findVisualStudio()
    -  })
    -
    -  function allVsVersions (finder) {
    -    finder.findVisualStudio2017OrNewer = (cb) => {
    -      const data0 = JSON.parse(fs.readFileSync(path.join(__dirname, 'fixtures',
    -        'VS_2017_Unusable.txt')))
    -      const data1 = JSON.parse(fs.readFileSync(path.join(__dirname, 'fixtures',
    -        'VS_2017_BuildTools_minimal.txt')))
    -      const data2 = JSON.parse(fs.readFileSync(path.join(__dirname, 'fixtures',
    -        'VS_2017_Community_workload.txt')))
    -      const data3 = JSON.parse(fs.readFileSync(path.join(__dirname, 'fixtures',
    -        'VS_2017_Express.txt')))
    -      const data4 = JSON.parse(fs.readFileSync(path.join(__dirname, 'fixtures',
    -        'VS_2019_Preview.txt')))
    -      const data5 = JSON.parse(fs.readFileSync(path.join(__dirname, 'fixtures',
    -        'VS_2019_BuildTools_minimal.txt')))
    -      const data6 = JSON.parse(fs.readFileSync(path.join(__dirname, 'fixtures',
    -        'VS_2019_Community_workload.txt')))
    -      const data7 = JSON.parse(fs.readFileSync(path.join(__dirname, 'fixtures',
    -        'VS_2022_Community_workload.txt')))
    -      const data = JSON.stringify(data0.concat(data1, data2, data3, data4,
    -        data5, data6, data7))
    -      finder.parseData(null, data, '', cb)
    -    }
    -    finder.regSearchKeys = (keys, value, addOpts, cb) => {
    -      for (var i = 0; i < keys.length; ++i) {
    -        const fullName = `${keys[i]}\\${value}`
    -        switch (fullName) {
    -          case 'HKLM\\Software\\Microsoft\\VisualStudio\\SxS\\VC7\\14.0':
    -          case 'HKLM\\Software\\Microsoft\\VisualStudio\\SxS\\VC7\\12.0':
    -            continue
    -          case 'HKLM\\Software\\Wow6432Node\\Microsoft\\VisualStudio\\SxS\\VC7\\12.0':
    -            return cb(null, 'C:\\VS2013\\VC\\')
    -          case 'HKLM\\Software\\Microsoft\\MSBuild\\ToolsVersions\\12.0\\MSBuildToolsPath':
    -            return cb(null, 'C:\\MSBuild12\\')
    -          case 'HKLM\\Software\\Wow6432Node\\Microsoft\\VisualStudio\\SxS\\VC7\\14.0':
    -            return cb(null, 'C:\\VS2015\\VC\\')
    -          case 'HKLM\\Software\\Microsoft\\MSBuild\\ToolsVersions\\14.0\\MSBuildToolsPath':
    -            return cb(null, 'C:\\MSBuild14\\')
    -          default:
    -            assert.fail(`unexpected search for registry value ${fullName}`)
    -        }
    -      }
    -      return cb(new Error())
    -    }
    -  }
    -
    -  it('fail when looking for invalid path', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, 'AABB', (err, info) => {
    -      assert.ok(/find .* Visual Studio/i.test(err), 'expect error')
    -      assert.ok(!info, 'no data')
    -    })
    -
    -    allVsVersions(finder)
    -    finder.findVisualStudio()
    -  })
    -
    -  it('look for VS2013 by version number', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, '2013', (err, info) => {
    -      assert.strictEqual(err, null)
    -      assert.deepStrictEqual(info.versionYear, 2013)
    -    })
    -
    -    allVsVersions(finder)
    -    finder.findVisualStudio()
    -  })
    -
    -  it('look for VS2013 by installation path', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, 'C:\\VS2013',
    -      (err, info) => {
    -        assert.strictEqual(err, null)
    -        assert.deepStrictEqual(info.path, 'C:\\VS2013')
    -      })
    -
    -    allVsVersions(finder)
    -    finder.findVisualStudio()
    -  })
    -
    -  it('look for VS2015 by version number', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, '2015', (err, info) => {
    -      assert.strictEqual(err, null)
    -      assert.deepStrictEqual(info.versionYear, 2015)
    -    })
    -
    -    allVsVersions(finder)
    -    finder.findVisualStudio()
    -  })
    -
    -  it('look for VS2015 by installation path', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, 'C:\\VS2015',
    -      (err, info) => {
    -        assert.strictEqual(err, null)
    -        assert.deepStrictEqual(info.path, 'C:\\VS2015')
    -      })
    -
    -    allVsVersions(finder)
    -    finder.findVisualStudio()
    -  })
    -
    -  it('look for VS2017 by version number', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, '2017', (err, info) => {
    -      assert.strictEqual(err, null)
    -      assert.deepStrictEqual(info.versionYear, 2017)
    -    })
    -
    -    allVsVersions(finder)
    -    finder.findVisualStudio()
    -  })
    -
    -  it('look for VS2017 by installation path', function () {
    -    const finder = new TestVisualStudioFinder(semverV1,
    -      'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community',
    -      (err, info) => {
    -        assert.strictEqual(err, null)
    -        assert.deepStrictEqual(info.path,
    -          'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community')
    -      })
    -
    -    allVsVersions(finder)
    -    finder.findVisualStudio()
    -  })
    -
    -  it('look for VS2019 by version number', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, '2019', (err, info) => {
    -      assert.strictEqual(err, null)
    -      assert.deepStrictEqual(info.versionYear, 2019)
    -    })
    -
    -    allVsVersions(finder)
    -    finder.findVisualStudio()
    -  })
    -
    -  it('look for VS2019 by installation path', function () {
    -    const finder = new TestVisualStudioFinder(semverV1,
    -      'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools',
    -      (err, info) => {
    -        assert.strictEqual(err, null)
    -        assert.deepStrictEqual(info.path,
    -          'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools')
    -      })
    -
    -    allVsVersions(finder)
    -    finder.findVisualStudio()
    -  })
    -
    -  it('look for VS2022 by version number', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, '2022', (err, info) => {
    -      assert.strictEqual(err, null)
    -      assert.deepStrictEqual(info.versionYear, 2022)
    -    })
    -
    -    finder.msBuildPathExists = (path) => {
    -      return true
    -    }
    -
    -    allVsVersions(finder)
    -    finder.findVisualStudio()
    -  })
    -
    -  it('msvs_version match should be case insensitive', function () {
    -    const finder = new TestVisualStudioFinder(semverV1,
    -      'c:\\program files (x86)\\microsoft visual studio\\2019\\BUILDTOOLS',
    -      (err, info) => {
    -        assert.strictEqual(err, null)
    -        assert.deepStrictEqual(info.path,
    -          'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools')
    -      })
    -
    -    allVsVersions(finder)
    -    finder.findVisualStudio()
    -  })
    -
    -  it('latest version should be found by default', function () {
    -    const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
    -      assert.strictEqual(err, null)
    -      assert.deepStrictEqual(info.versionYear, 2022)
    -    })
    -
    -    finder.msBuildPathExists = (path) => {
    -      return true
    -    }
    -
    -    allVsVersions(finder)
    -    finder.findVisualStudio()
    -  })
    -
    -  it('run on a usable VS Command Prompt', function () {
    -    process.env.VCINSTALLDIR = 'C:\\VS2015\\VC'
    -    // VSINSTALLDIR is not defined on Visual C++ Build Tools 2015
    -    delete process.env.VSINSTALLDIR
    -
    -    const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
    -      assert.strictEqual(err, null)
    -      assert.deepStrictEqual(info.path, 'C:\\VS2015')
    -    })
    -
    -    allVsVersions(finder)
    -    finder.findVisualStudio()
    -  })
    -
    -  it('VCINSTALLDIR match should be case insensitive', function () {
    -    process.env.VCINSTALLDIR =
    -      'c:\\program files (x86)\\microsoft visual studio\\2019\\BUILDTOOLS\\VC'
    -
    -    const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
    -      assert.strictEqual(err, null)
    -      assert.deepStrictEqual(info.path,
    -        'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools')
    -    })
    -
    -    allVsVersions(finder)
    -    finder.findVisualStudio()
    -  })
    -
    -  it('run on a unusable VS Command Prompt', function () {
    -    process.env.VCINSTALLDIR =
    -      'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildToolsUnusable\\VC'
    -
    -    const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
    -      assert.ok(/find .* Visual Studio/i.test(err), 'expect error')
    -      assert.ok(!info, 'no data')
    -    })
    -
    -    allVsVersions(finder)
    -    finder.findVisualStudio()
    -  })
    -
    -  it('run on a VS Command Prompt with matching msvs_version', function () {
    -    process.env.VCINSTALLDIR = 'C:\\VS2015\\VC'
    -
    -    const finder = new TestVisualStudioFinder(semverV1, 'C:\\VS2015',
    -      (err, info) => {
    -        assert.strictEqual(err, null)
    -        assert.deepStrictEqual(info.path, 'C:\\VS2015')
    -      })
    -
    -    allVsVersions(finder)
    -    finder.findVisualStudio()
    -  })
    -
    -  it('run on a VS Command Prompt with mismatched msvs_version', function () {
    -    process.env.VCINSTALLDIR =
    -      'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\VC'
    -
    -    const finder = new TestVisualStudioFinder(semverV1, 'C:\\VS2015',
    -      (err, info) => {
    -        assert.ok(/find .* Visual Studio/i.test(err), 'expect error')
    -        assert.ok(!info, 'no data')
    -      })
    -
    -    allVsVersions(finder)
    -    finder.findVisualStudio()
    -  })
    -})
    diff --git a/deps/npm/node_modules/node-gyp/test/test-install.js b/deps/npm/node_modules/node-gyp/test/test-install.js
    deleted file mode 100644
    index 235acf52313969..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/test-install.js
    +++ /dev/null
    @@ -1,137 +0,0 @@
    -'use strict'
    -
    -const { describe, it, after } = require('mocha')
    -const assert = require('assert')
    -const path = require('path')
    -const os = require('os')
    -const util = require('util')
    -const { test: { download, install } } = require('../lib/install')
    -const rimraf = require('rimraf')
    -const gyp = require('../lib/node-gyp')
    -const log = require('npmlog')
    -const semver = require('semver')
    -const stream = require('stream')
    -const streamPipeline = util.promisify(stream.pipeline)
    -
    -log.level = 'error' // we expect a warning
    -
    -describe('install', function () {
    -  it('EACCES retry once', async () => {
    -    const fs = {
    -      promises: {
    -        stat (_) {
    -          const err = new Error()
    -          err.code = 'EACCES'
    -          assert.ok(true)
    -          throw err
    -        }
    -      }
    -    }
    -
    -    const Gyp = {
    -      devDir: __dirname,
    -      opts: {
    -        ensure: true
    -      },
    -      commands: {
    -        install (argv, cb) {
    -          install(fs, Gyp, argv).then(cb, cb)
    -        },
    -        remove (_, cb) {
    -          cb()
    -        }
    -      }
    -    }
    -
    -    try {
    -      await install(fs, Gyp, [])
    -    } catch (err) {
    -      assert.ok(true)
    -      if (/"pre" versions of node cannot be installed/.test(err.message)) {
    -        assert.ok(true)
    -      }
    -    }
    -  })
    -
    -  // only run these tests if we are running a version of Node with predictable version path behavior
    -  const skipParallelInstallTests = process.env.FAST_TEST ||
    -    process.release.name !== 'node' ||
    -    semver.prerelease(process.version) !== null ||
    -    semver.satisfies(process.version, '<10')
    -
    -  async function parallelInstallsTest (test, fs, devDir, prog) {
    -    if (skipParallelInstallTests) {
    -      return test.skip('Skipping parallel installs test due to test environment configuration')
    -    }
    -
    -    after(async () => {
    -      await util.promisify(rimraf)(devDir)
    -    })
    -
    -    const expectedDir = path.join(devDir, process.version.replace(/^v/, ''))
    -    await util.promisify(rimraf)(expectedDir)
    -
    -    await Promise.all([
    -      install(fs, prog, []),
    -      install(fs, prog, []),
    -      install(fs, prog, []),
    -      install(fs, prog, []),
    -      install(fs, prog, []),
    -      install(fs, prog, []),
    -      install(fs, prog, []),
    -      install(fs, prog, []),
    -      install(fs, prog, []),
    -      install(fs, prog, [])
    -    ])
    -  }
    -
    -  it('parallel installs (ensure=true)', async function () {
    -    this.timeout(600000)
    -
    -    const fs = require('graceful-fs')
    -    const devDir = await util.promisify(fs.mkdtemp)(path.join(os.tmpdir(), 'node-gyp-test-'))
    -
    -    const prog = gyp()
    -    prog.parseArgv([])
    -    prog.devDir = devDir
    -    prog.opts.ensure = true
    -    log.level = 'warn'
    -
    -    await parallelInstallsTest(this, fs, devDir, prog)
    -  })
    -
    -  it('parallel installs (ensure=false)', async function () {
    -    this.timeout(600000)
    -
    -    const fs = require('graceful-fs')
    -    const devDir = await util.promisify(fs.mkdtemp)(path.join(os.tmpdir(), 'node-gyp-test-'))
    -
    -    const prog = gyp()
    -    prog.parseArgv([])
    -    prog.devDir = devDir
    -    prog.opts.ensure = false
    -    log.level = 'warn'
    -
    -    await parallelInstallsTest(this, fs, devDir, prog)
    -  })
    -
    -  it('parallel installs (tarball)', async function () {
    -    this.timeout(600000)
    -
    -    const fs = require('graceful-fs')
    -    const devDir = await util.promisify(fs.mkdtemp)(path.join(os.tmpdir(), 'node-gyp-test-'))
    -
    -    const prog = gyp()
    -    prog.parseArgv([])
    -    prog.devDir = devDir
    -    prog.opts.tarball = path.join(devDir, 'node-headers.tar.gz')
    -    log.level = 'warn'
    -
    -    await streamPipeline(
    -      (await download(prog, `https://nodejs.org/dist/${process.version}/node-${process.version}.tar.gz`)).body,
    -      fs.createWriteStream(prog.opts.tarball)
    -    )
    -
    -    await parallelInstallsTest(this, fs, devDir, prog)
    -  })
    -})
    diff --git a/deps/npm/node_modules/node-gyp/test/test-options.js b/deps/npm/node_modules/node-gyp/test/test-options.js
    deleted file mode 100644
    index 24e79c80a18432..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/test-options.js
    +++ /dev/null
    @@ -1,41 +0,0 @@
    -'use strict'
    -
    -const { describe, it } = require('mocha')
    -const assert = require('assert')
    -const gyp = require('../lib/node-gyp')
    -
    -describe('options', function () {
    -  it('options in environment', () => {
    -    // `npm test` dumps a ton of npm_config_* variables in the environment.
    -    Object.keys(process.env)
    -      .filter((key) => /^npm_config_/.test(key))
    -      .forEach((key) => { delete process.env[key] })
    -
    -    // in some platforms, certain keys are stubborn and cannot be removed
    -    const keys = Object.keys(process.env)
    -      .filter((key) => /^npm_config_/.test(key))
    -      .map((key) => key.substring('npm_config_'.length))
    -      .concat('argv', 'x')
    -
    -    // Zero-length keys should get filtered out.
    -    process.env.npm_config_ = '42'
    -    // Other keys should get added.
    -    process.env.npm_config_x = '42'
    -    // Except loglevel.
    -    process.env.npm_config_loglevel = 'debug'
    -
    -    const g = gyp()
    -    g.parseArgv(['rebuild']) // Also sets opts.argv.
    -
    -    assert.deepStrictEqual(Object.keys(g.opts).sort(), keys.sort())
    -  })
    -
    -  it('options with spaces in environment', () => {
    -    process.env.npm_config_force_process_config = 'true'
    -
    -    const g = gyp()
    -    g.parseArgv(['rebuild']) // Also sets opts.argv.
    -
    -    assert.strictEqual(g.opts['force-process-config'], 'true')
    -  })
    -})
    diff --git a/deps/npm/node_modules/node-gyp/test/test-process-release.js b/deps/npm/node_modules/node-gyp/test/test-process-release.js
    deleted file mode 100644
    index 0f40666473028c..00000000000000
    --- a/deps/npm/node_modules/node-gyp/test/test-process-release.js
    +++ /dev/null
    @@ -1,401 +0,0 @@
    -'use strict'
    -
    -const { describe, it } = require('mocha')
    -const assert = require('assert')
    -const processRelease = require('../lib/process-release')
    -
    -describe('process-release', function () {
    -  it('test process release - process.version = 0.8.20', function () {
    -    var release = processRelease([], { opts: {} }, 'v0.8.20', null)
    -
    -    assert.strictEqual(release.semver.version, '0.8.20')
    -    delete release.semver
    -
    -    assert.deepStrictEqual(release, {
    -      version: '0.8.20',
    -      name: 'node',
    -      baseUrl: 'https://nodejs.org/dist/v0.8.20/',
    -      tarballUrl: 'https://nodejs.org/dist/v0.8.20/node-v0.8.20.tar.gz',
    -      shasumsUrl: 'https://nodejs.org/dist/v0.8.20/SHASUMS256.txt',
    -      versionDir: '0.8.20',
    -      ia32: { libUrl: 'https://nodejs.org/dist/v0.8.20/node.lib', libPath: 'node.lib' },
    -      x64: { libUrl: 'https://nodejs.org/dist/v0.8.20/x64/node.lib', libPath: 'x64/node.lib' },
    -      arm64: { libUrl: 'https://nodejs.org/dist/v0.8.20/arm64/node.lib', libPath: 'arm64/node.lib' }
    -    })
    -  })
    -
    -  it('test process release - process.version = 0.10.21', function () {
    -    var release = processRelease([], { opts: {} }, 'v0.10.21', null)
    -
    -    assert.strictEqual(release.semver.version, '0.10.21')
    -    delete release.semver
    -
    -    assert.deepStrictEqual(release, {
    -      version: '0.10.21',
    -      name: 'node',
    -      baseUrl: 'https://nodejs.org/dist/v0.10.21/',
    -      tarballUrl: 'https://nodejs.org/dist/v0.10.21/node-v0.10.21.tar.gz',
    -      shasumsUrl: 'https://nodejs.org/dist/v0.10.21/SHASUMS256.txt',
    -      versionDir: '0.10.21',
    -      ia32: { libUrl: 'https://nodejs.org/dist/v0.10.21/node.lib', libPath: 'node.lib' },
    -      x64: { libUrl: 'https://nodejs.org/dist/v0.10.21/x64/node.lib', libPath: 'x64/node.lib' },
    -      arm64: { libUrl: 'https://nodejs.org/dist/v0.10.21/arm64/node.lib', libPath: 'arm64/node.lib' }
    -    })
    -  })
    -
    -  // prior to -headers.tar.gz
    -  it('test process release - process.version = 0.12.9', function () {
    -    var release = processRelease([], { opts: {} }, 'v0.12.9', null)
    -
    -    assert.strictEqual(release.semver.version, '0.12.9')
    -    delete release.semver
    -
    -    assert.deepStrictEqual(release, {
    -      version: '0.12.9',
    -      name: 'node',
    -      baseUrl: 'https://nodejs.org/dist/v0.12.9/',
    -      tarballUrl: 'https://nodejs.org/dist/v0.12.9/node-v0.12.9.tar.gz',
    -      shasumsUrl: 'https://nodejs.org/dist/v0.12.9/SHASUMS256.txt',
    -      versionDir: '0.12.9',
    -      ia32: { libUrl: 'https://nodejs.org/dist/v0.12.9/node.lib', libPath: 'node.lib' },
    -      x64: { libUrl: 'https://nodejs.org/dist/v0.12.9/x64/node.lib', libPath: 'x64/node.lib' },
    -      arm64: { libUrl: 'https://nodejs.org/dist/v0.12.9/arm64/node.lib', libPath: 'arm64/node.lib' }
    -    })
    -  })
    -
    -  // prior to -headers.tar.gz
    -  it('test process release - process.version = 0.10.41', function () {
    -    var release = processRelease([], { opts: {} }, 'v0.10.41', null)
    -
    -    assert.strictEqual(release.semver.version, '0.10.41')
    -    delete release.semver
    -
    -    assert.deepStrictEqual(release, {
    -      version: '0.10.41',
    -      name: 'node',
    -      baseUrl: 'https://nodejs.org/dist/v0.10.41/',
    -      tarballUrl: 'https://nodejs.org/dist/v0.10.41/node-v0.10.41.tar.gz',
    -      shasumsUrl: 'https://nodejs.org/dist/v0.10.41/SHASUMS256.txt',
    -      versionDir: '0.10.41',
    -      ia32: { libUrl: 'https://nodejs.org/dist/v0.10.41/node.lib', libPath: 'node.lib' },
    -      x64: { libUrl: 'https://nodejs.org/dist/v0.10.41/x64/node.lib', libPath: 'x64/node.lib' },
    -      arm64: { libUrl: 'https://nodejs.org/dist/v0.10.41/arm64/node.lib', libPath: 'arm64/node.lib' }
    -    })
    -  })
    -
    -  // has -headers.tar.gz
    -  it('test process release - process.release ~ node@0.10.42', function () {
    -    var release = processRelease([], { opts: {} }, 'v0.10.42', null)
    -
    -    assert.strictEqual(release.semver.version, '0.10.42')
    -    delete release.semver
    -
    -    assert.deepStrictEqual(release, {
    -      version: '0.10.42',
    -      name: 'node',
    -      baseUrl: 'https://nodejs.org/dist/v0.10.42/',
    -      tarballUrl: 'https://nodejs.org/dist/v0.10.42/node-v0.10.42-headers.tar.gz',
    -      shasumsUrl: 'https://nodejs.org/dist/v0.10.42/SHASUMS256.txt',
    -      versionDir: '0.10.42',
    -      ia32: { libUrl: 'https://nodejs.org/dist/v0.10.42/node.lib', libPath: 'node.lib' },
    -      x64: { libUrl: 'https://nodejs.org/dist/v0.10.42/x64/node.lib', libPath: 'x64/node.lib' },
    -      arm64: { libUrl: 'https://nodejs.org/dist/v0.10.42/arm64/node.lib', libPath: 'arm64/node.lib' }
    -    })
    -  })
    -
    -  // has -headers.tar.gz
    -  it('test process release - process.release ~ node@0.12.10', function () {
    -    var release = processRelease([], { opts: {} }, 'v0.12.10', null)
    -
    -    assert.strictEqual(release.semver.version, '0.12.10')
    -    delete release.semver
    -
    -    assert.deepStrictEqual(release, {
    -      version: '0.12.10',
    -      name: 'node',
    -      baseUrl: 'https://nodejs.org/dist/v0.12.10/',
    -      tarballUrl: 'https://nodejs.org/dist/v0.12.10/node-v0.12.10-headers.tar.gz',
    -      shasumsUrl: 'https://nodejs.org/dist/v0.12.10/SHASUMS256.txt',
    -      versionDir: '0.12.10',
    -      ia32: { libUrl: 'https://nodejs.org/dist/v0.12.10/node.lib', libPath: 'node.lib' },
    -      x64: { libUrl: 'https://nodejs.org/dist/v0.12.10/x64/node.lib', libPath: 'x64/node.lib' },
    -      arm64: { libUrl: 'https://nodejs.org/dist/v0.12.10/arm64/node.lib', libPath: 'arm64/node.lib' }
    -    })
    -  })
    -
    -  it('test process release - process.release ~ node@4.1.23', function () {
    -    var release = processRelease([], { opts: {} }, 'v4.1.23', {
    -      name: 'node',
    -      headersUrl: 'https://nodejs.org/dist/v4.1.23/node-v4.1.23-headers.tar.gz'
    -    })
    -
    -    assert.strictEqual(release.semver.version, '4.1.23')
    -    delete release.semver
    -
    -    assert.deepStrictEqual(release, {
    -      version: '4.1.23',
    -      name: 'node',
    -      baseUrl: 'https://nodejs.org/dist/v4.1.23/',
    -      tarballUrl: 'https://nodejs.org/dist/v4.1.23/node-v4.1.23-headers.tar.gz',
    -      shasumsUrl: 'https://nodejs.org/dist/v4.1.23/SHASUMS256.txt',
    -      versionDir: '4.1.23',
    -      ia32: { libUrl: 'https://nodejs.org/dist/v4.1.23/win-x86/node.lib', libPath: 'win-x86/node.lib' },
    -      x64: { libUrl: 'https://nodejs.org/dist/v4.1.23/win-x64/node.lib', libPath: 'win-x64/node.lib' },
    -      arm64: { libUrl: 'https://nodejs.org/dist/v4.1.23/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
    -    })
    -  })
    -
    -  it('test process release - process.release ~ node@4.1.23 / corp build', function () {
    -    var release = processRelease([], { opts: {} }, 'v4.1.23', {
    -      name: 'node',
    -      headersUrl: 'https://some.custom.location/node-v4.1.23-headers.tar.gz'
    -    })
    -
    -    assert.strictEqual(release.semver.version, '4.1.23')
    -    delete release.semver
    -
    -    assert.deepStrictEqual(release, {
    -      version: '4.1.23',
    -      name: 'node',
    -      baseUrl: 'https://some.custom.location/',
    -      tarballUrl: 'https://some.custom.location/node-v4.1.23-headers.tar.gz',
    -      shasumsUrl: 'https://some.custom.location/SHASUMS256.txt',
    -      versionDir: '4.1.23',
    -      ia32: { libUrl: 'https://some.custom.location/win-x86/node.lib', libPath: 'win-x86/node.lib' },
    -      x64: { libUrl: 'https://some.custom.location/win-x64/node.lib', libPath: 'win-x64/node.lib' },
    -      arm64: { libUrl: 'https://some.custom.location/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
    -    })
    -  })
    -
    -  it('test process release - process.release ~ node@12.8.0 Windows', function () {
    -    var release = processRelease([], { opts: {} }, 'v12.8.0', {
    -      name: 'node',
    -      sourceUrl: 'https://nodejs.org/download/release/v12.8.0/node-v12.8.0.tar.gz',
    -      headersUrl: 'https://nodejs.org/download/release/v12.8.0/node-v12.8.0-headers.tar.gz',
    -      libUrl: 'https://nodejs.org/download/release/v12.8.0/win-x64/node.lib'
    -    })
    -
    -    assert.strictEqual(release.semver.version, '12.8.0')
    -    delete release.semver
    -
    -    assert.deepStrictEqual(release, {
    -      version: '12.8.0',
    -      name: 'node',
    -      baseUrl: 'https://nodejs.org/download/release/v12.8.0/',
    -      tarballUrl: 'https://nodejs.org/download/release/v12.8.0/node-v12.8.0-headers.tar.gz',
    -      shasumsUrl: 'https://nodejs.org/download/release/v12.8.0/SHASUMS256.txt',
    -      versionDir: '12.8.0',
    -      ia32: { libUrl: 'https://nodejs.org/download/release/v12.8.0/win-x86/node.lib', libPath: 'win-x86/node.lib' },
    -      x64: { libUrl: 'https://nodejs.org/download/release/v12.8.0/win-x64/node.lib', libPath: 'win-x64/node.lib' },
    -      arm64: { libUrl: 'https://nodejs.org/download/release/v12.8.0/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
    -    })
    -  })
    -
    -  it('test process release - process.release ~ node@12.8.0 Windows ARM64', function () {
    -    var release = processRelease([], { opts: {} }, 'v12.8.0', {
    -      name: 'node',
    -      sourceUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/node-v12.8.0.tar.gz',
    -      headersUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/node-v12.8.0-headers.tar.gz',
    -      libUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/win-arm64/node.lib'
    -    })
    -
    -    assert.strictEqual(release.semver.version, '12.8.0')
    -    delete release.semver
    -
    -    assert.deepStrictEqual(release, {
    -      version: '12.8.0',
    -      name: 'node',
    -      baseUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/',
    -      tarballUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/node-v12.8.0-headers.tar.gz',
    -      shasumsUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/SHASUMS256.txt',
    -      versionDir: '12.8.0',
    -      ia32: { libUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/win-x86/node.lib', libPath: 'win-x86/node.lib' },
    -      x64: { libUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/win-x64/node.lib', libPath: 'win-x64/node.lib' },
    -      arm64: { libUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
    -    })
    -  })
    -
    -  it('test process release - process.release ~ node@4.1.23 --target=0.10.40', function () {
    -    var release = processRelease([], { opts: { target: '0.10.40' } }, 'v4.1.23', {
    -      name: 'node',
    -      headersUrl: 'https://nodejs.org/dist/v4.1.23/node-v4.1.23-headers.tar.gz'
    -    })
    -
    -    assert.strictEqual(release.semver.version, '0.10.40')
    -    delete release.semver
    -
    -    assert.deepStrictEqual(release, {
    -      version: '0.10.40',
    -      name: 'node',
    -      baseUrl: 'https://nodejs.org/dist/v0.10.40/',
    -      tarballUrl: 'https://nodejs.org/dist/v0.10.40/node-v0.10.40.tar.gz',
    -      shasumsUrl: 'https://nodejs.org/dist/v0.10.40/SHASUMS256.txt',
    -      versionDir: '0.10.40',
    -      ia32: { libUrl: 'https://nodejs.org/dist/v0.10.40/node.lib', libPath: 'node.lib' },
    -      x64: { libUrl: 'https://nodejs.org/dist/v0.10.40/x64/node.lib', libPath: 'x64/node.lib' },
    -      arm64: { libUrl: 'https://nodejs.org/dist/v0.10.40/arm64/node.lib', libPath: 'arm64/node.lib' }
    -    })
    -  })
    -
    -  it('test process release - process.release ~ node@4.1.23 --dist-url=https://foo.bar/baz', function () {
    -    var release = processRelease([], { opts: { 'dist-url': 'https://foo.bar/baz' } }, 'v4.1.23', {
    -      name: 'node',
    -      headersUrl: 'https://nodejs.org/dist/v4.1.23/node-v4.1.23-headers.tar.gz'
    -    })
    -
    -    assert.strictEqual(release.semver.version, '4.1.23')
    -    delete release.semver
    -
    -    assert.deepStrictEqual(release, {
    -      version: '4.1.23',
    -      name: 'node',
    -      baseUrl: 'https://foo.bar/baz/v4.1.23/',
    -      tarballUrl: 'https://foo.bar/baz/v4.1.23/node-v4.1.23-headers.tar.gz',
    -      shasumsUrl: 'https://foo.bar/baz/v4.1.23/SHASUMS256.txt',
    -      versionDir: '4.1.23',
    -      ia32: { libUrl: 'https://foo.bar/baz/v4.1.23/win-x86/node.lib', libPath: 'win-x86/node.lib' },
    -      x64: { libUrl: 'https://foo.bar/baz/v4.1.23/win-x64/node.lib', libPath: 'win-x64/node.lib' },
    -      arm64: { libUrl: 'https://foo.bar/baz/v4.1.23/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
    -    })
    -  })
    -
    -  it('test process release - process.release ~ frankenstein@4.1.23', function () {
    -    var release = processRelease([], { opts: {} }, 'v4.1.23', {
    -      name: 'frankenstein',
    -      headersUrl: 'https://frankensteinjs.org/dist/v4.1.23/frankenstein-v4.1.23-headers.tar.gz'
    -    })
    -
    -    assert.strictEqual(release.semver.version, '4.1.23')
    -    delete release.semver
    -
    -    assert.deepStrictEqual(release, {
    -      version: '4.1.23',
    -      name: 'frankenstein',
    -      baseUrl: 'https://frankensteinjs.org/dist/v4.1.23/',
    -      tarballUrl: 'https://frankensteinjs.org/dist/v4.1.23/frankenstein-v4.1.23-headers.tar.gz',
    -      shasumsUrl: 'https://frankensteinjs.org/dist/v4.1.23/SHASUMS256.txt',
    -      versionDir: 'frankenstein-4.1.23',
    -      ia32: { libUrl: 'https://frankensteinjs.org/dist/v4.1.23/win-x86/frankenstein.lib', libPath: 'win-x86/frankenstein.lib' },
    -      x64: { libUrl: 'https://frankensteinjs.org/dist/v4.1.23/win-x64/frankenstein.lib', libPath: 'win-x64/frankenstein.lib' },
    -      arm64: { libUrl: 'https://frankensteinjs.org/dist/v4.1.23/win-arm64/frankenstein.lib', libPath: 'win-arm64/frankenstein.lib' }
    -    })
    -  })
    -
    -  it('test process release - process.release ~ frankenstein@4.1.23 --dist-url=http://foo.bar/baz/', function () {
    -    var release = processRelease([], { opts: { 'dist-url': 'http://foo.bar/baz/' } }, 'v4.1.23', {
    -      name: 'frankenstein',
    -      headersUrl: 'https://frankensteinjs.org/dist/v4.1.23/frankenstein-v4.1.23.tar.gz'
    -    })
    -
    -    assert.strictEqual(release.semver.version, '4.1.23')
    -    delete release.semver
    -
    -    assert.deepStrictEqual(release, {
    -      version: '4.1.23',
    -      name: 'frankenstein',
    -      baseUrl: 'http://foo.bar/baz/v4.1.23/',
    -      tarballUrl: 'http://foo.bar/baz/v4.1.23/frankenstein-v4.1.23-headers.tar.gz',
    -      shasumsUrl: 'http://foo.bar/baz/v4.1.23/SHASUMS256.txt',
    -      versionDir: 'frankenstein-4.1.23',
    -      ia32: { libUrl: 'http://foo.bar/baz/v4.1.23/win-x86/frankenstein.lib', libPath: 'win-x86/frankenstein.lib' },
    -      x64: { libUrl: 'http://foo.bar/baz/v4.1.23/win-x64/frankenstein.lib', libPath: 'win-x64/frankenstein.lib' },
    -      arm64: { libUrl: 'http://foo.bar/baz/v4.1.23/win-arm64/frankenstein.lib', libPath: 'win-arm64/frankenstein.lib' }
    -    })
    -  })
    -
    -  it('test process release - process.release ~ node@4.0.0-rc.4', function () {
    -    var release = processRelease([], { opts: {} }, 'v4.0.0-rc.4', {
    -      name: 'node',
    -      headersUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/node-v4.0.0-rc.4-headers.tar.gz'
    -    })
    -
    -    assert.strictEqual(release.semver.version, '4.0.0-rc.4')
    -    delete release.semver
    -
    -    assert.deepStrictEqual(release, {
    -      version: '4.0.0-rc.4',
    -      name: 'node',
    -      baseUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/',
    -      tarballUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/node-v4.0.0-rc.4-headers.tar.gz',
    -      shasumsUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/SHASUMS256.txt',
    -      versionDir: '4.0.0-rc.4',
    -      ia32: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-x86/node.lib', libPath: 'win-x86/node.lib' },
    -      x64: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-x64/node.lib', libPath: 'win-x64/node.lib' },
    -      arm64: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
    -    })
    -  })
    -
    -  it('test process release - process.release ~ node@4.0.0-rc.4 passed as argv[0]', function () {
    -  // note the missing 'v' on the arg, it should normalise when checking
    -    // whether we're on the default or not
    -    var release = processRelease(['4.0.0-rc.4'], { opts: {} }, 'v4.0.0-rc.4', {
    -      name: 'node',
    -      headersUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/node-v4.0.0-rc.4-headers.tar.gz'
    -    })
    -
    -    assert.strictEqual(release.semver.version, '4.0.0-rc.4')
    -    delete release.semver
    -
    -    assert.deepStrictEqual(release, {
    -      version: '4.0.0-rc.4',
    -      name: 'node',
    -      baseUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/',
    -      tarballUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/node-v4.0.0-rc.4-headers.tar.gz',
    -      shasumsUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/SHASUMS256.txt',
    -      versionDir: '4.0.0-rc.4',
    -      ia32: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-x86/node.lib', libPath: 'win-x86/node.lib' },
    -      x64: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-x64/node.lib', libPath: 'win-x64/node.lib' },
    -      arm64: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
    -    })
    -  })
    -
    -  it('test process release - process.release ~ node@4.0.0-rc.4 - bogus string passed as argv[0]', function () {
    -  // additional arguments can be passed in on the commandline that should be ignored if they
    -    // are not specifying a valid version @ position 0
    -    var release = processRelease(['this is no version!'], { opts: {} }, 'v4.0.0-rc.4', {
    -      name: 'node',
    -      headersUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/node-v4.0.0-rc.4-headers.tar.gz'
    -    })
    -
    -    assert.strictEqual(release.semver.version, '4.0.0-rc.4')
    -    delete release.semver
    -
    -    assert.deepStrictEqual(release, {
    -      version: '4.0.0-rc.4',
    -      name: 'node',
    -      baseUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/',
    -      tarballUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/node-v4.0.0-rc.4-headers.tar.gz',
    -      shasumsUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/SHASUMS256.txt',
    -      versionDir: '4.0.0-rc.4',
    -      ia32: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-x86/node.lib', libPath: 'win-x86/node.lib' },
    -      x64: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-x64/node.lib', libPath: 'win-x64/node.lib' },
    -      arm64: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
    -    })
    -  })
    -
    -  it('test process release - NODEJS_ORG_MIRROR', function () {
    -    process.env.NODEJS_ORG_MIRROR = 'http://foo.bar'
    -
    -    var release = processRelease([], { opts: {} }, 'v4.1.23', {
    -      name: 'node',
    -      headersUrl: 'https://nodejs.org/dist/v4.1.23/node-v4.1.23-headers.tar.gz'
    -    })
    -
    -    assert.strictEqual(release.semver.version, '4.1.23')
    -    delete release.semver
    -
    -    assert.deepStrictEqual(release, {
    -      version: '4.1.23',
    -      name: 'node',
    -      baseUrl: 'http://foo.bar/v4.1.23/',
    -      tarballUrl: 'http://foo.bar/v4.1.23/node-v4.1.23-headers.tar.gz',
    -      shasumsUrl: 'http://foo.bar/v4.1.23/SHASUMS256.txt',
    -      versionDir: '4.1.23',
    -      ia32: { libUrl: 'http://foo.bar/v4.1.23/win-x86/node.lib', libPath: 'win-x86/node.lib' },
    -      x64: { libUrl: 'http://foo.bar/v4.1.23/win-x64/node.lib', libPath: 'win-x64/node.lib' },
    -      arm64: { libUrl: 'http://foo.bar/v4.1.23/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
    -    })
    -
    -    delete process.env.NODEJS_ORG_MIRROR
    -  })
    -})
    diff --git a/deps/npm/node_modules/node-gyp/update-gyp.py b/deps/npm/node_modules/node-gyp/update-gyp.py
    deleted file mode 100755
    index 70e2d100288ec6..00000000000000
    --- a/deps/npm/node_modules/node-gyp/update-gyp.py
    +++ /dev/null
    @@ -1,64 +0,0 @@
    -#!/usr/bin/env python3
    -
    -import argparse
    -import os
    -import shutil
    -import subprocess
    -import tarfile
    -import tempfile
    -import urllib.request
    -
    -BASE_URL = "https://github.com/nodejs/gyp-next/archive/"
    -CHECKOUT_PATH = os.path.dirname(os.path.realpath(__file__))
    -CHECKOUT_GYP_PATH = os.path.join(CHECKOUT_PATH, "gyp")
    -
    -parser = argparse.ArgumentParser()
    -parser.add_argument("tag", help="gyp tag to update to")
    -args = parser.parse_args()
    -
    -tar_url = BASE_URL + args.tag + ".tar.gz"
    -
    -changed_files = subprocess.check_output(["git", "diff", "--name-only"]).strip()
    -if changed_files:
    -    raise Exception("Can't update gyp while you have uncommitted changes in node-gyp")
    -
    -with tempfile.TemporaryDirectory() as tmp_dir:
    -    tar_file = os.path.join(tmp_dir, "gyp.tar.gz")
    -    unzip_target = os.path.join(tmp_dir, "gyp")
    -    with open(tar_file, "wb") as f:
    -        print("Downloading gyp-next@" + args.tag + " into temporary directory...")
    -        print("From: " + tar_url)
    -        with urllib.request.urlopen(tar_url) as in_file:
    -            f.write(in_file.read())
    -
    -        print("Unzipping...")
    -        with tarfile.open(tar_file, "r:gz") as tar_ref:
    -            def is_within_directory(directory, target):
    -
    -                abs_directory = os.path.abspath(directory)
    -                abs_target = os.path.abspath(target)
    -
    -                prefix = os.path.commonprefix([abs_directory, abs_target])
    -
    -                return prefix == abs_directory
    -
    -            def safe_extract(tar, path=".", members=None, *, numeric_owner=False):
    -
    -                for member in tar.getmembers():
    -                    member_path = os.path.join(path, member.name)
    -                    if not is_within_directory(path, member_path):
    -                        raise Exception("Attempted Path Traversal in Tar File")
    -
    -                tar.extractall(path, members, numeric_owner=numeric_owner)
    -
    -            safe_extract(tar_ref, unzip_target)
    -
    -        print("Moving to current checkout (" + CHECKOUT_PATH + ")...")
    -        if os.path.exists(CHECKOUT_GYP_PATH):
    -            shutil.rmtree(CHECKOUT_GYP_PATH)
    -        shutil.move(
    -            os.path.join(unzip_target, os.listdir(unzip_target)[0]), CHECKOUT_GYP_PATH
    -        )
    -
    -subprocess.check_output(["git", "add", "gyp"], cwd=CHECKOUT_PATH)
    -subprocess.check_output(["git", "commit", "-m", "feat(gyp): update gyp to " + args.tag])
    diff --git a/deps/npm/node_modules/npm-install-checks/lib/index.js b/deps/npm/node_modules/npm-install-checks/lib/index.js
    index f0ba2c07ad0812..545472b61dc604 100644
    --- a/deps/npm/node_modules/npm-install-checks/lib/index.js
    +++ b/deps/npm/node_modules/npm-install-checks/lib/index.js
    @@ -36,7 +36,9 @@ const checkPlatform = (target, force = false, environment = {}) => {
       let libcFamily = null
       if (target.libc) {
         // libc checks only work in linux, any value is a failure if we aren't
    -    if (platform !== 'linux') {
    +    if (environment.libc) {
    +      libcOk = checkList(environment.libc, target.libc)
    +    } else if (platform !== 'linux') {
           libcOk = false
         } else {
           const report = process.report.getReport()
    diff --git a/deps/npm/node_modules/npm-install-checks/package.json b/deps/npm/node_modules/npm-install-checks/package.json
    index 50378808d75d08..11a3b87750e25a 100644
    --- a/deps/npm/node_modules/npm-install-checks/package.json
    +++ b/deps/npm/node_modules/npm-install-checks/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "npm-install-checks",
    -  "version": "6.2.0",
    +  "version": "6.3.0",
       "description": "Check the engines and platform fields in package.json",
       "main": "lib/index.js",
       "dependencies": {
    @@ -8,7 +8,7 @@
       },
       "devDependencies": {
         "@npmcli/eslint-config": "^4.0.0",
    -    "@npmcli/template-oss": "4.18.0",
    +    "@npmcli/template-oss": "4.19.0",
         "tap": "^16.0.1"
       },
       "scripts": {
    @@ -39,7 +39,7 @@
       "author": "GitHub Inc.",
       "templateOSS": {
         "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "version": "4.18.0",
    +    "version": "4.19.0",
         "publish": "true"
       },
       "tap": {
    diff --git a/deps/npm/node_modules/npm-registry-fetch/lib/auth.js b/deps/npm/node_modules/npm-registry-fetch/lib/auth.js
    index 870ce0d923cd0f..9270025fa8d902 100644
    --- a/deps/npm/node_modules/npm-registry-fetch/lib/auth.js
    +++ b/deps/npm/node_modules/npm-registry-fetch/lib/auth.js
    @@ -4,8 +4,8 @@ const npa = require('npm-package-arg')
     const { URL } = require('url')
     
     // Find the longest registry key that is used for some kind of auth
    -// in the options.
    -const regKeyFromURI = (uri, opts) => {
    +// in the options.  Returns the registry key and the auth config.
    +const regFromURI = (uri, opts) => {
       const parsed = new URL(uri)
       // try to find a config key indicating we have auth for this registry
       // can be one of :_authToken, :_auth, :_password and :username, or
    @@ -14,23 +14,40 @@ const regKeyFromURI = (uri, opts) => {
       // stopping when we reach '//'.
       let regKey = `//${parsed.host}${parsed.pathname}`
       while (regKey.length > '//'.length) {
    +    const authKey = hasAuth(regKey, opts)
         // got some auth for this URI
    -    if (hasAuth(regKey, opts)) {
    -      return regKey
    +    if (authKey) {
    +      return { regKey, authKey }
         }
     
         // can be either //host/some/path/:_auth or //host/some/path:_auth
         // walk up by removing EITHER what's after the slash OR the slash itself
         regKey = regKey.replace(/([^/]+|\/)$/, '')
       }
    +  return { regKey: false, authKey: null }
     }
     
    -const hasAuth = (regKey, opts) => (
    -  opts[`${regKey}:_authToken`] ||
    -  opts[`${regKey}:_auth`] ||
    -  opts[`${regKey}:username`] && opts[`${regKey}:_password`] ||
    -  opts[`${regKey}:certfile`] && opts[`${regKey}:keyfile`]
    -)
    +// Not only do we want to know if there is auth, but if we are calling `npm
    +// logout` we want to know what config value specifically provided it.  This is
    +// so we can look up where the config came from to delete it (i.e. user vs
    +// project)
    +const hasAuth = (regKey, opts) => {
    +  if (opts[`${regKey}:_authToken`]) {
    +    return '_authToken'
    +  }
    +  if (opts[`${regKey}:_auth`]) {
    +    return '_auth'
    +  }
    +  if (opts[`${regKey}:username`] && opts[`${regKey}:_password`]) {
    +    // 'password' can be inferred to also be present
    +    return 'username'
    +  }
    +  if (opts[`${regKey}:certfile`] && opts[`${regKey}:keyfile`]) {
    +    // 'keyfile' can be inferred to also be present
    +    return 'certfile'
    +  }
    +  return false
    +}
     
     const sameHost = (a, b) => {
       const parsedA = new URL(a)
    @@ -63,11 +80,14 @@ const getAuth = (uri, opts = {}) => {
       if (!uri) {
         throw new Error('URI is required')
       }
    -  const regKey = regKeyFromURI(uri, forceAuth || opts)
    +  const { regKey, authKey } = regFromURI(uri, forceAuth || opts)
     
       // we are only allowed to use what's in forceAuth if specified
       if (forceAuth && !regKey) {
         return new Auth({
    +      // if we force auth we don't want to refer back to anything in config
    +      regKey: false,
    +      authKey: null,
           scopeAuthKey: null,
           token: forceAuth._authToken || forceAuth.token,
           username: forceAuth.username,
    @@ -88,8 +108,8 @@ const getAuth = (uri, opts = {}) => {
           // registry where we logged in, but the same auth SHOULD be sent
           // to that artifact host, then we track where it was coming in from,
           // and warn the user if we get a 4xx error on it.
    -      const scopeAuthKey = regKeyFromURI(registry, opts)
    -      return new Auth({ scopeAuthKey })
    +      const { regKey: scopeAuthKey, authKey: _authKey } = regFromURI(registry, opts)
    +      return new Auth({ scopeAuthKey, regKey: scopeAuthKey, authKey: _authKey })
         }
       }
     
    @@ -104,6 +124,8 @@ const getAuth = (uri, opts = {}) => {
     
       return new Auth({
         scopeAuthKey: null,
    +    regKey,
    +    authKey,
         token,
         auth,
         username,
    @@ -114,8 +136,22 @@ const getAuth = (uri, opts = {}) => {
     }
     
     class Auth {
    -  constructor ({ token, auth, username, password, scopeAuthKey, certfile, keyfile }) {
    +  constructor ({
    +    token,
    +    auth,
    +    username,
    +    password,
    +    scopeAuthKey,
    +    certfile,
    +    keyfile,
    +    regKey,
    +    authKey,
    +  }) {
    +    // same as regKey but only present for scoped auth. Should have been named scopeRegKey
         this.scopeAuthKey = scopeAuthKey
    +    // `${regKey}:${authKey}` will get you back to the auth config that gave us auth
    +    this.regKey = regKey
    +    this.authKey = authKey
         this.token = null
         this.auth = null
         this.isBasicAuth = false
    diff --git a/deps/npm/node_modules/npm-registry-fetch/lib/index.js b/deps/npm/node_modules/npm-registry-fetch/lib/index.js
    index 23e349c5c5b96d..bb413f862d92d0 100644
    --- a/deps/npm/node_modules/npm-registry-fetch/lib/index.js
    +++ b/deps/npm/node_modules/npm-registry-fetch/lib/index.js
    @@ -166,6 +166,8 @@ function regFetch (uri, /* istanbul ignore next */ opts_ = {}) {
       return Promise.resolve(body).then(doFetch)
     }
     
    +module.exports.getAuth = getAuth
    +
     module.exports.json = fetchJSON
     function fetchJSON (uri, opts) {
       return regFetch(uri, opts).then(res => res.json())
    diff --git a/deps/npm/node_modules/npm-registry-fetch/package.json b/deps/npm/node_modules/npm-registry-fetch/package.json
    index 2afadf939743b8..b715d52391a933 100644
    --- a/deps/npm/node_modules/npm-registry-fetch/package.json
    +++ b/deps/npm/node_modules/npm-registry-fetch/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "npm-registry-fetch",
    -  "version": "16.0.0",
    +  "version": "16.1.0",
       "description": "Fetch-based http client for use with npm registry APIs",
       "main": "lib",
       "files": [
    @@ -41,7 +41,7 @@
       },
       "devDependencies": {
         "@npmcli/eslint-config": "^4.0.0",
    -    "@npmcli/template-oss": "4.18.0",
    +    "@npmcli/template-oss": "4.19.0",
         "cacache": "^18.0.0",
         "nock": "^13.2.4",
         "require-inject": "^1.4.4",
    @@ -61,13 +61,7 @@
       },
       "templateOSS": {
         "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    -    "version": "4.18.0",
    -    "publish": "true",
    -    "ciVersions": [
    -      "16.14.0",
    -      "16.x",
    -      "18.0.0",
    -      "18.x"
    -    ]
    +    "version": "4.19.0",
    +    "publish": "true"
       }
     }
    diff --git a/deps/npm/node_modules/once/LICENSE b/deps/npm/node_modules/once/LICENSE
    deleted file mode 100644
    index 19129e315fe593..00000000000000
    --- a/deps/npm/node_modules/once/LICENSE
    +++ /dev/null
    @@ -1,15 +0,0 @@
    -The ISC License
    -
    -Copyright (c) Isaac Z. Schlueter and Contributors
    -
    -Permission to use, copy, modify, and/or distribute this software for any
    -purpose with or without fee is hereby granted, provided that the above
    -copyright notice and this permission notice appear in all copies.
    -
    -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
    -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    diff --git a/deps/npm/node_modules/once/once.js b/deps/npm/node_modules/once/once.js
    deleted file mode 100644
    index 235406736d9d94..00000000000000
    --- a/deps/npm/node_modules/once/once.js
    +++ /dev/null
    @@ -1,42 +0,0 @@
    -var wrappy = require('wrappy')
    -module.exports = wrappy(once)
    -module.exports.strict = wrappy(onceStrict)
    -
    -once.proto = once(function () {
    -  Object.defineProperty(Function.prototype, 'once', {
    -    value: function () {
    -      return once(this)
    -    },
    -    configurable: true
    -  })
    -
    -  Object.defineProperty(Function.prototype, 'onceStrict', {
    -    value: function () {
    -      return onceStrict(this)
    -    },
    -    configurable: true
    -  })
    -})
    -
    -function once (fn) {
    -  var f = function () {
    -    if (f.called) return f.value
    -    f.called = true
    -    return f.value = fn.apply(this, arguments)
    -  }
    -  f.called = false
    -  return f
    -}
    -
    -function onceStrict (fn) {
    -  var f = function () {
    -    if (f.called)
    -      throw new Error(f.onceError)
    -    f.called = true
    -    return f.value = fn.apply(this, arguments)
    -  }
    -  var name = fn.name || 'Function wrapped with `once`'
    -  f.onceError = name + " shouldn't be called more than once"
    -  f.called = false
    -  return f
    -}
    diff --git a/deps/npm/node_modules/once/package.json b/deps/npm/node_modules/once/package.json
    deleted file mode 100644
    index 16815b2fa11193..00000000000000
    --- a/deps/npm/node_modules/once/package.json
    +++ /dev/null
    @@ -1,33 +0,0 @@
    -{
    -  "name": "once",
    -  "version": "1.4.0",
    -  "description": "Run a function exactly one time",
    -  "main": "once.js",
    -  "directories": {
    -    "test": "test"
    -  },
    -  "dependencies": {
    -    "wrappy": "1"
    -  },
    -  "devDependencies": {
    -    "tap": "^7.0.1"
    -  },
    -  "scripts": {
    -    "test": "tap test/*.js"
    -  },
    -  "files": [
    -    "once.js"
    -  ],
    -  "repository": {
    -    "type": "git",
    -    "url": "git://github.com/isaacs/once"
    -  },
    -  "keywords": [
    -    "once",
    -    "function",
    -    "one",
    -    "single"
    -  ],
    -  "author": "Isaac Z. Schlueter  (http://blog.izs.me/)",
    -  "license": "ISC"
    -}
    diff --git a/deps/npm/node_modules/path-is-absolute/index.js b/deps/npm/node_modules/path-is-absolute/index.js
    deleted file mode 100644
    index 22aa6c35607997..00000000000000
    --- a/deps/npm/node_modules/path-is-absolute/index.js
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -'use strict';
    -
    -function posix(path) {
    -	return path.charAt(0) === '/';
    -}
    -
    -function win32(path) {
    -	// https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56
    -	var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/;
    -	var result = splitDeviceRe.exec(path);
    -	var device = result[1] || '';
    -	var isUnc = Boolean(device && device.charAt(1) !== ':');
    -
    -	// UNC paths are always absolute
    -	return Boolean(result[2] || isUnc);
    -}
    -
    -module.exports = process.platform === 'win32' ? win32 : posix;
    -module.exports.posix = posix;
    -module.exports.win32 = win32;
    diff --git a/deps/npm/node_modules/path-is-absolute/license b/deps/npm/node_modules/path-is-absolute/license
    deleted file mode 100644
    index 654d0bfe943437..00000000000000
    --- a/deps/npm/node_modules/path-is-absolute/license
    +++ /dev/null
    @@ -1,21 +0,0 @@
    -The MIT License (MIT)
    -
    -Copyright (c) Sindre Sorhus  (sindresorhus.com)
    -
    -Permission is hereby granted, free of charge, to any person obtaining a copy
    -of this software and associated documentation files (the "Software"), to deal
    -in the Software without restriction, including without limitation the rights
    -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    -copies of the Software, and to permit persons to whom the Software is
    -furnished to do so, subject to the following conditions:
    -
    -The above copyright notice and this permission notice shall be included in
    -all copies or substantial portions of the Software.
    -
    -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    -THE SOFTWARE.
    diff --git a/deps/npm/node_modules/path-is-absolute/package.json b/deps/npm/node_modules/path-is-absolute/package.json
    deleted file mode 100644
    index 91196d5e9c1336..00000000000000
    --- a/deps/npm/node_modules/path-is-absolute/package.json
    +++ /dev/null
    @@ -1,43 +0,0 @@
    -{
    -  "name": "path-is-absolute",
    -  "version": "1.0.1",
    -  "description": "Node.js 0.12 path.isAbsolute() ponyfill",
    -  "license": "MIT",
    -  "repository": "sindresorhus/path-is-absolute",
    -  "author": {
    -    "name": "Sindre Sorhus",
    -    "email": "sindresorhus@gmail.com",
    -    "url": "sindresorhus.com"
    -  },
    -  "engines": {
    -    "node": ">=0.10.0"
    -  },
    -  "scripts": {
    -    "test": "xo && node test.js"
    -  },
    -  "files": [
    -    "index.js"
    -  ],
    -  "keywords": [
    -    "path",
    -    "paths",
    -    "file",
    -    "dir",
    -    "absolute",
    -    "isabsolute",
    -    "is-absolute",
    -    "built-in",
    -    "util",
    -    "utils",
    -    "core",
    -    "ponyfill",
    -    "polyfill",
    -    "shim",
    -    "is",
    -    "detect",
    -    "check"
    -  ],
    -  "devDependencies": {
    -    "xo": "^0.16.0"
    -  }
    -}
    diff --git a/deps/npm/node_modules/readable-stream/lib/stream/promises.js b/deps/npm/node_modules/readable-stream/lib/stream/promises.js
    index b85c51f47f1ce1..5d4ce15f4904b7 100644
    --- a/deps/npm/node_modules/readable-stream/lib/stream/promises.js
    +++ b/deps/npm/node_modules/readable-stream/lib/stream/promises.js
    @@ -4,7 +4,7 @@ const { ArrayPrototypePop, Promise } = require('../ours/primordials')
     const { isIterable, isNodeStream, isWebStream } = require('../internal/streams/utils')
     const { pipelineImpl: pl } = require('../internal/streams/pipeline')
     const { finished } = require('../internal/streams/end-of-stream')
    -require('stream')
    +require('../../lib/stream.js')
     function pipeline(...streams) {
       return new Promise((resolve, reject) => {
         let signal
    diff --git a/deps/npm/node_modules/readable-stream/package.json b/deps/npm/node_modules/readable-stream/package.json
    index c4f6504cc7cc66..289f3a45a634f3 100644
    --- a/deps/npm/node_modules/readable-stream/package.json
    +++ b/deps/npm/node_modules/readable-stream/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "readable-stream",
    -  "version": "4.4.0",
    +  "version": "4.4.2",
       "description": "Node.js Streams, a user-land copy of the stream library from Node.js",
       "homepage": "https://github.com/nodejs/readable-stream",
       "license": "MIT",
    @@ -39,6 +39,7 @@
         "test:prepare": "node test/browser/runner-prepare.mjs",
         "test:browsers": "node test/browser/runner-browser.mjs",
         "test:bundlers": "node test/browser/runner-node.mjs",
    +    "test:readable-stream-only": "node readable-stream-test/runner-prepare.mjs",
         "coverage": "c8 -c ./c8.json tap --rcfile=./tap.yml test/parallel/test-*.js test/ours/test-*.js",
         "format": "prettier -w src lib test",
         "lint": "eslint src"
    @@ -47,7 +48,8 @@
         "abort-controller": "^3.0.0",
         "buffer": "^6.0.3",
         "events": "^3.3.0",
    -    "process": "^0.11.10"
    +    "process": "^0.11.10",
    +    "string_decoder": "^1.3.0"
       },
       "devDependencies": {
         "@babel/core": "^7.17.10",
    diff --git a/deps/npm/node_modules/rimraf/LICENSE b/deps/npm/node_modules/rimraf/LICENSE
    deleted file mode 100644
    index 19129e315fe593..00000000000000
    --- a/deps/npm/node_modules/rimraf/LICENSE
    +++ /dev/null
    @@ -1,15 +0,0 @@
    -The ISC License
    -
    -Copyright (c) Isaac Z. Schlueter and Contributors
    -
    -Permission to use, copy, modify, and/or distribute this software for any
    -purpose with or without fee is hereby granted, provided that the above
    -copyright notice and this permission notice appear in all copies.
    -
    -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
    -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    diff --git a/deps/npm/node_modules/rimraf/README.md b/deps/npm/node_modules/rimraf/README.md
    deleted file mode 100644
    index 423b8cf854ad3e..00000000000000
    --- a/deps/npm/node_modules/rimraf/README.md
    +++ /dev/null
    @@ -1,101 +0,0 @@
    -[![Build Status](https://travis-ci.org/isaacs/rimraf.svg?branch=master)](https://travis-ci.org/isaacs/rimraf) [![Dependency Status](https://david-dm.org/isaacs/rimraf.svg)](https://david-dm.org/isaacs/rimraf) [![devDependency Status](https://david-dm.org/isaacs/rimraf/dev-status.svg)](https://david-dm.org/isaacs/rimraf#info=devDependencies)
    -
    -The [UNIX command](http://en.wikipedia.org/wiki/Rm_(Unix)) `rm -rf` for node.
    -
    -Install with `npm install rimraf`, or just drop rimraf.js somewhere.
    -
    -## API
    -
    -`rimraf(f, [opts], callback)`
    -
    -The first parameter will be interpreted as a globbing pattern for files. If you
    -want to disable globbing you can do so with `opts.disableGlob` (defaults to
    -`false`). This might be handy, for instance, if you have filenames that contain
    -globbing wildcard characters.
    -
    -The callback will be called with an error if there is one.  Certain
    -errors are handled for you:
    -
    -* Windows: `EBUSY` and `ENOTEMPTY` - rimraf will back off a maximum of
    -  `opts.maxBusyTries` times before giving up, adding 100ms of wait
    -  between each attempt.  The default `maxBusyTries` is 3.
    -* `ENOENT` - If the file doesn't exist, rimraf will return
    -  successfully, since your desired outcome is already the case.
    -* `EMFILE` - Since `readdir` requires opening a file descriptor, it's
    -  possible to hit `EMFILE` if too many file descriptors are in use.
    -  In the sync case, there's nothing to be done for this.  But in the
    -  async case, rimraf will gradually back off with timeouts up to
    -  `opts.emfileWait` ms, which defaults to 1000.
    -
    -## options
    -
    -* unlink, chmod, stat, lstat, rmdir, readdir,
    -  unlinkSync, chmodSync, statSync, lstatSync, rmdirSync, readdirSync
    -
    -    In order to use a custom file system library, you can override
    -    specific fs functions on the options object.
    -
    -    If any of these functions are present on the options object, then
    -    the supplied function will be used instead of the default fs
    -    method.
    -
    -    Sync methods are only relevant for `rimraf.sync()`, of course.
    -
    -    For example:
    -
    -    ```javascript
    -    var myCustomFS = require('some-custom-fs')
    -
    -    rimraf('some-thing', myCustomFS, callback)
    -    ```
    -
    -* maxBusyTries
    -
    -    If an `EBUSY`, `ENOTEMPTY`, or `EPERM` error code is encountered
    -    on Windows systems, then rimraf will retry with a linear backoff
    -    wait of 100ms longer on each try.  The default maxBusyTries is 3.
    -
    -    Only relevant for async usage.
    -
    -* emfileWait
    -
    -    If an `EMFILE` error is encountered, then rimraf will retry
    -    repeatedly with a linear backoff of 1ms longer on each try, until
    -    the timeout counter hits this max.  The default limit is 1000.
    -
    -    If you repeatedly encounter `EMFILE` errors, then consider using
    -    [graceful-fs](http://npm.im/graceful-fs) in your program.
    -
    -    Only relevant for async usage.
    -
    -* glob
    -
    -    Set to `false` to disable [glob](http://npm.im/glob) pattern
    -    matching.
    -
    -    Set to an object to pass options to the glob module.  The default
    -    glob options are `{ nosort: true, silent: true }`.
    -
    -    Glob version 6 is used in this module.
    -
    -    Relevant for both sync and async usage.
    -
    -* disableGlob
    -
    -    Set to any non-falsey value to disable globbing entirely.
    -    (Equivalent to setting `glob: false`.)
    -
    -## rimraf.sync
    -
    -It can remove stuff synchronously, too.  But that's not so good.  Use
    -the async API.  It's better.
    -
    -## CLI
    -
    -If installed with `npm install rimraf -g` it can be used as a global
    -command `rimraf  [ ...]` which is useful for cross platform support.
    -
    -## mkdirp
    -
    -If you need to create a directory recursively, check out
    -[mkdirp](https://github.com/substack/node-mkdirp).
    diff --git a/deps/npm/node_modules/rimraf/bin.js b/deps/npm/node_modules/rimraf/bin.js
    deleted file mode 100755
    index 023814cc93e849..00000000000000
    --- a/deps/npm/node_modules/rimraf/bin.js
    +++ /dev/null
    @@ -1,68 +0,0 @@
    -#!/usr/bin/env node
    -
    -const rimraf = require('./')
    -
    -const path = require('path')
    -
    -const isRoot = arg => /^(\/|[a-zA-Z]:\\)$/.test(path.resolve(arg))
    -const filterOutRoot = arg => {
    -  const ok = preserveRoot === false || !isRoot(arg)
    -  if (!ok) {
    -    console.error(`refusing to remove ${arg}`)
    -    console.error('Set --no-preserve-root to allow this')
    -  }
    -  return ok
    -}
    -
    -let help = false
    -let dashdash = false
    -let noglob = false
    -let preserveRoot = true
    -const args = process.argv.slice(2).filter(arg => {
    -  if (dashdash)
    -    return !!arg
    -  else if (arg === '--')
    -    dashdash = true
    -  else if (arg === '--no-glob' || arg === '-G')
    -    noglob = true
    -  else if (arg === '--glob' || arg === '-g')
    -    noglob = false
    -  else if (arg.match(/^(-+|\/)(h(elp)?|\?)$/))
    -    help = true
    -  else if (arg === '--preserve-root')
    -    preserveRoot = true
    -  else if (arg === '--no-preserve-root')
    -    preserveRoot = false
    -  else
    -    return !!arg
    -}).filter(arg => !preserveRoot || filterOutRoot(arg))
    -
    -const go = n => {
    -  if (n >= args.length)
    -    return
    -  const options = noglob ? { glob: false } : {}
    -  rimraf(args[n], options, er => {
    -    if (er)
    -      throw er
    -    go(n+1)
    -  })
    -}
    -
    -if (help || args.length === 0) {
    -  // If they didn't ask for help, then this is not a "success"
    -  const log = help ? console.log : console.error
    -  log('Usage: rimraf  [ ...]')
    -  log('')
    -  log('  Deletes all files and folders at "path" recursively.')
    -  log('')
    -  log('Options:')
    -  log('')
    -  log('  -h, --help          Display this usage info')
    -  log('  -G, --no-glob       Do not expand glob patterns in arguments')
    -  log('  -g, --glob          Expand glob patterns in arguments (default)')
    -  log('  --preserve-root     Do not remove \'/\' (default)')
    -  log('  --no-preserve-root  Do not treat \'/\' specially')
    -  log('  --                  Stop parsing flags')
    -  process.exit(help ? 0 : 1)
    -} else
    -  go(0)
    diff --git a/deps/npm/node_modules/rimraf/node_modules/brace-expansion/LICENSE b/deps/npm/node_modules/rimraf/node_modules/brace-expansion/LICENSE
    deleted file mode 100644
    index de3226673c3874..00000000000000
    --- a/deps/npm/node_modules/rimraf/node_modules/brace-expansion/LICENSE
    +++ /dev/null
    @@ -1,21 +0,0 @@
    -MIT License
    -
    -Copyright (c) 2013 Julian Gruber 
    -
    -Permission is hereby granted, free of charge, to any person obtaining a copy
    -of this software and associated documentation files (the "Software"), to deal
    -in the Software without restriction, including without limitation the rights
    -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    -copies of the Software, and to permit persons to whom the Software is
    -furnished to do so, subject to the following conditions:
    -
    -The above copyright notice and this permission notice shall be included in all
    -copies or substantial portions of the Software.
    -
    -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    -SOFTWARE.
    diff --git a/deps/npm/node_modules/rimraf/node_modules/brace-expansion/index.js b/deps/npm/node_modules/rimraf/node_modules/brace-expansion/index.js
    deleted file mode 100644
    index 2b6f4f85c951fc..00000000000000
    --- a/deps/npm/node_modules/rimraf/node_modules/brace-expansion/index.js
    +++ /dev/null
    @@ -1,200 +0,0 @@
    -var concatMap = require('concat-map');
    -var balanced = require('balanced-match');
    -
    -module.exports = expandTop;
    -
    -var escSlash = '\0SLASH'+Math.random()+'\0';
    -var escOpen = '\0OPEN'+Math.random()+'\0';
    -var escClose = '\0CLOSE'+Math.random()+'\0';
    -var escComma = '\0COMMA'+Math.random()+'\0';
    -var escPeriod = '\0PERIOD'+Math.random()+'\0';
    -
    -function numeric(str) {
    -  return parseInt(str, 10) == str
    -    ? parseInt(str, 10)
    -    : str.charCodeAt(0);
    -}
    -
    -function escapeBraces(str) {
    -  return str.split('\\\\').join(escSlash)
    -            .split('\\{').join(escOpen)
    -            .split('\\}').join(escClose)
    -            .split('\\,').join(escComma)
    -            .split('\\.').join(escPeriod);
    -}
    -
    -function unescapeBraces(str) {
    -  return str.split(escSlash).join('\\')
    -            .split(escOpen).join('{')
    -            .split(escClose).join('}')
    -            .split(escComma).join(',')
    -            .split(escPeriod).join('.');
    -}
    -
    -
    -// Basically just str.split(","), but handling cases
    -// where we have nested braced sections, which should be
    -// treated as individual members, like {a,{b,c},d}
    -function parseCommaParts(str) {
    -  if (!str)
    -    return [''];
    -
    -  var parts = [];
    -  var m = balanced('{', '}', str);
    -
    -  if (!m)
    -    return str.split(',');
    -
    -  var pre = m.pre;
    -  var body = m.body;
    -  var post = m.post;
    -  var p = pre.split(',');
    -
    -  p[p.length-1] += '{' + body + '}';
    -  var postParts = parseCommaParts(post);
    -  if (post.length) {
    -    p[p.length-1] += postParts.shift();
    -    p.push.apply(p, postParts);
    -  }
    -
    -  parts.push.apply(parts, p);
    -
    -  return parts;
    -}
    -
    -function expandTop(str) {
    -  if (!str)
    -    return [];
    -
    -  // I don't know why Bash 4.3 does this, but it does.
    -  // Anything starting with {} will have the first two bytes preserved
    -  // but *only* at the top level, so {},a}b will not expand to anything,
    -  // but a{},b}c will be expanded to [a}c,abc].
    -  // One could argue that this is a bug in Bash, but since the goal of
    -  // this module is to match Bash's rules, we escape a leading {}
    -  if (str.substr(0, 2) === '{}') {
    -    str = '\\{\\}' + str.substr(2);
    -  }
    -
    -  return expand(escapeBraces(str), true).map(unescapeBraces);
    -}
    -
    -function identity(e) {
    -  return e;
    -}
    -
    -function embrace(str) {
    -  return '{' + str + '}';
    -}
    -function isPadded(el) {
    -  return /^-?0\d/.test(el);
    -}
    -
    -function lte(i, y) {
    -  return i <= y;
    -}
    -function gte(i, y) {
    -  return i >= y;
    -}
    -
    -function expand(str, isTop) {
    -  var expansions = [];
    -
    -  var m = balanced('{', '}', str);
    -  if (!m || /\$$/.test(m.pre)) return [str];
    -
    -  var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
    -  var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
    -  var isSequence = isNumericSequence || isAlphaSequence;
    -  var isOptions = m.body.indexOf(',') >= 0;
    -  if (!isSequence && !isOptions) {
    -    // {a},b}
    -    if (m.post.match(/,.*\}/)) {
    -      str = m.pre + '{' + m.body + escClose + m.post;
    -      return expand(str);
    -    }
    -    return [str];
    -  }
    -
    -  var n;
    -  if (isSequence) {
    -    n = m.body.split(/\.\./);
    -  } else {
    -    n = parseCommaParts(m.body);
    -    if (n.length === 1) {
    -      // x{{a,b}}y ==> x{a}y x{b}y
    -      n = expand(n[0], false).map(embrace);
    -      if (n.length === 1) {
    -        var post = m.post.length
    -          ? expand(m.post, false)
    -          : [''];
    -        return post.map(function(p) {
    -          return m.pre + n[0] + p;
    -        });
    -      }
    -    }
    -  }
    -
    -  // at this point, n is the parts, and we know it's not a comma set
    -  // with a single entry.
    -
    -  // no need to expand pre, since it is guaranteed to be free of brace-sets
    -  var pre = m.pre;
    -  var post = m.post.length
    -    ? expand(m.post, false)
    -    : [''];
    -
    -  var N;
    -
    -  if (isSequence) {
    -    var x = numeric(n[0]);
    -    var y = numeric(n[1]);
    -    var width = Math.max(n[0].length, n[1].length)
    -    var incr = n.length == 3
    -      ? Math.abs(numeric(n[2]))
    -      : 1;
    -    var test = lte;
    -    var reverse = y < x;
    -    if (reverse) {
    -      incr *= -1;
    -      test = gte;
    -    }
    -    var pad = n.some(isPadded);
    -
    -    N = [];
    -
    -    for (var i = x; test(i, y); i += incr) {
    -      var c;
    -      if (isAlphaSequence) {
    -        c = String.fromCharCode(i);
    -        if (c === '\\')
    -          c = '';
    -      } else {
    -        c = String(i);
    -        if (pad) {
    -          var need = width - c.length;
    -          if (need > 0) {
    -            var z = new Array(need + 1).join('0');
    -            if (i < 0)
    -              c = '-' + z + c.slice(1);
    -            else
    -              c = z + c;
    -          }
    -        }
    -      }
    -      N.push(c);
    -    }
    -  } else {
    -    N = concatMap(n, function(el) { return expand(el, false) });
    -  }
    -
    -  for (var j = 0; j < N.length; j++) {
    -    for (var k = 0; k < post.length; k++) {
    -      var expansion = pre + N[j] + post[k];
    -      if (!isTop || isSequence || expansion)
    -        expansions.push(expansion);
    -    }
    -  }
    -
    -  return expansions;
    -}
    diff --git a/deps/npm/node_modules/rimraf/node_modules/brace-expansion/package.json b/deps/npm/node_modules/rimraf/node_modules/brace-expansion/package.json
    deleted file mode 100644
    index a18faa8fd67b82..00000000000000
    --- a/deps/npm/node_modules/rimraf/node_modules/brace-expansion/package.json
    +++ /dev/null
    @@ -1,47 +0,0 @@
    -{
    -  "name": "brace-expansion",
    -  "description": "Brace expansion as known from sh/bash",
    -  "version": "1.1.11",
    -  "repository": {
    -    "type": "git",
    -    "url": "git://github.com/juliangruber/brace-expansion.git"
    -  },
    -  "homepage": "https://github.com/juliangruber/brace-expansion",
    -  "main": "index.js",
    -  "scripts": {
    -    "test": "tape test/*.js",
    -    "gentest": "bash test/generate.sh",
    -    "bench": "matcha test/perf/bench.js"
    -  },
    -  "dependencies": {
    -    "balanced-match": "^1.0.0",
    -    "concat-map": "0.0.1"
    -  },
    -  "devDependencies": {
    -    "matcha": "^0.7.0",
    -    "tape": "^4.6.0"
    -  },
    -  "keywords": [],
    -  "author": {
    -    "name": "Julian Gruber",
    -    "email": "mail@juliangruber.com",
    -    "url": "http://juliangruber.com"
    -  },
    -  "license": "MIT",
    -  "testling": {
    -    "files": "test/*.js",
    -    "browsers": [
    -      "ie/8..latest",
    -      "firefox/20..latest",
    -      "firefox/nightly",
    -      "chrome/25..latest",
    -      "chrome/canary",
    -      "opera/12..latest",
    -      "opera/next",
    -      "safari/5.1..latest",
    -      "ipad/6.0..latest",
    -      "iphone/6.0..latest",
    -      "android-browser/4.2..latest"
    -    ]
    -  }
    -}
    diff --git a/deps/npm/node_modules/rimraf/node_modules/glob/LICENSE b/deps/npm/node_modules/rimraf/node_modules/glob/LICENSE
    deleted file mode 100644
    index 42ca266df1d523..00000000000000
    --- a/deps/npm/node_modules/rimraf/node_modules/glob/LICENSE
    +++ /dev/null
    @@ -1,21 +0,0 @@
    -The ISC License
    -
    -Copyright (c) Isaac Z. Schlueter and Contributors
    -
    -Permission to use, copy, modify, and/or distribute this software for any
    -purpose with or without fee is hereby granted, provided that the above
    -copyright notice and this permission notice appear in all copies.
    -
    -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
    -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    -
    -## Glob Logo
    -
    -Glob's logo created by Tanya Brassie , licensed
    -under a Creative Commons Attribution-ShareAlike 4.0 International License
    -https://creativecommons.org/licenses/by-sa/4.0/
    diff --git a/deps/npm/node_modules/rimraf/node_modules/glob/common.js b/deps/npm/node_modules/rimraf/node_modules/glob/common.js
    deleted file mode 100644
    index 424c46e1dab1be..00000000000000
    --- a/deps/npm/node_modules/rimraf/node_modules/glob/common.js
    +++ /dev/null
    @@ -1,238 +0,0 @@
    -exports.setopts = setopts
    -exports.ownProp = ownProp
    -exports.makeAbs = makeAbs
    -exports.finish = finish
    -exports.mark = mark
    -exports.isIgnored = isIgnored
    -exports.childrenIgnored = childrenIgnored
    -
    -function ownProp (obj, field) {
    -  return Object.prototype.hasOwnProperty.call(obj, field)
    -}
    -
    -var fs = require("fs")
    -var path = require("path")
    -var minimatch = require("minimatch")
    -var isAbsolute = require("path-is-absolute")
    -var Minimatch = minimatch.Minimatch
    -
    -function alphasort (a, b) {
    -  return a.localeCompare(b, 'en')
    -}
    -
    -function setupIgnores (self, options) {
    -  self.ignore = options.ignore || []
    -
    -  if (!Array.isArray(self.ignore))
    -    self.ignore = [self.ignore]
    -
    -  if (self.ignore.length) {
    -    self.ignore = self.ignore.map(ignoreMap)
    -  }
    -}
    -
    -// ignore patterns are always in dot:true mode.
    -function ignoreMap (pattern) {
    -  var gmatcher = null
    -  if (pattern.slice(-3) === '/**') {
    -    var gpattern = pattern.replace(/(\/\*\*)+$/, '')
    -    gmatcher = new Minimatch(gpattern, { dot: true })
    -  }
    -
    -  return {
    -    matcher: new Minimatch(pattern, { dot: true }),
    -    gmatcher: gmatcher
    -  }
    -}
    -
    -function setopts (self, pattern, options) {
    -  if (!options)
    -    options = {}
    -
    -  // base-matching: just use globstar for that.
    -  if (options.matchBase && -1 === pattern.indexOf("/")) {
    -    if (options.noglobstar) {
    -      throw new Error("base matching requires globstar")
    -    }
    -    pattern = "**/" + pattern
    -  }
    -
    -  self.silent = !!options.silent
    -  self.pattern = pattern
    -  self.strict = options.strict !== false
    -  self.realpath = !!options.realpath
    -  self.realpathCache = options.realpathCache || Object.create(null)
    -  self.follow = !!options.follow
    -  self.dot = !!options.dot
    -  self.mark = !!options.mark
    -  self.nodir = !!options.nodir
    -  if (self.nodir)
    -    self.mark = true
    -  self.sync = !!options.sync
    -  self.nounique = !!options.nounique
    -  self.nonull = !!options.nonull
    -  self.nosort = !!options.nosort
    -  self.nocase = !!options.nocase
    -  self.stat = !!options.stat
    -  self.noprocess = !!options.noprocess
    -  self.absolute = !!options.absolute
    -  self.fs = options.fs || fs
    -
    -  self.maxLength = options.maxLength || Infinity
    -  self.cache = options.cache || Object.create(null)
    -  self.statCache = options.statCache || Object.create(null)
    -  self.symlinks = options.symlinks || Object.create(null)
    -
    -  setupIgnores(self, options)
    -
    -  self.changedCwd = false
    -  var cwd = process.cwd()
    -  if (!ownProp(options, "cwd"))
    -    self.cwd = cwd
    -  else {
    -    self.cwd = path.resolve(options.cwd)
    -    self.changedCwd = self.cwd !== cwd
    -  }
    -
    -  self.root = options.root || path.resolve(self.cwd, "/")
    -  self.root = path.resolve(self.root)
    -  if (process.platform === "win32")
    -    self.root = self.root.replace(/\\/g, "/")
    -
    -  // TODO: is an absolute `cwd` supposed to be resolved against `root`?
    -  // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test')
    -  self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd)
    -  if (process.platform === "win32")
    -    self.cwdAbs = self.cwdAbs.replace(/\\/g, "/")
    -  self.nomount = !!options.nomount
    -
    -  // disable comments and negation in Minimatch.
    -  // Note that they are not supported in Glob itself anyway.
    -  options.nonegate = true
    -  options.nocomment = true
    -  // always treat \ in patterns as escapes, not path separators
    -  options.allowWindowsEscape = false
    -
    -  self.minimatch = new Minimatch(pattern, options)
    -  self.options = self.minimatch.options
    -}
    -
    -function finish (self) {
    -  var nou = self.nounique
    -  var all = nou ? [] : Object.create(null)
    -
    -  for (var i = 0, l = self.matches.length; i < l; i ++) {
    -    var matches = self.matches[i]
    -    if (!matches || Object.keys(matches).length === 0) {
    -      if (self.nonull) {
    -        // do like the shell, and spit out the literal glob
    -        var literal = self.minimatch.globSet[i]
    -        if (nou)
    -          all.push(literal)
    -        else
    -          all[literal] = true
    -      }
    -    } else {
    -      // had matches
    -      var m = Object.keys(matches)
    -      if (nou)
    -        all.push.apply(all, m)
    -      else
    -        m.forEach(function (m) {
    -          all[m] = true
    -        })
    -    }
    -  }
    -
    -  if (!nou)
    -    all = Object.keys(all)
    -
    -  if (!self.nosort)
    -    all = all.sort(alphasort)
    -
    -  // at *some* point we statted all of these
    -  if (self.mark) {
    -    for (var i = 0; i < all.length; i++) {
    -      all[i] = self._mark(all[i])
    -    }
    -    if (self.nodir) {
    -      all = all.filter(function (e) {
    -        var notDir = !(/\/$/.test(e))
    -        var c = self.cache[e] || self.cache[makeAbs(self, e)]
    -        if (notDir && c)
    -          notDir = c !== 'DIR' && !Array.isArray(c)
    -        return notDir
    -      })
    -    }
    -  }
    -
    -  if (self.ignore.length)
    -    all = all.filter(function(m) {
    -      return !isIgnored(self, m)
    -    })
    -
    -  self.found = all
    -}
    -
    -function mark (self, p) {
    -  var abs = makeAbs(self, p)
    -  var c = self.cache[abs]
    -  var m = p
    -  if (c) {
    -    var isDir = c === 'DIR' || Array.isArray(c)
    -    var slash = p.slice(-1) === '/'
    -
    -    if (isDir && !slash)
    -      m += '/'
    -    else if (!isDir && slash)
    -      m = m.slice(0, -1)
    -
    -    if (m !== p) {
    -      var mabs = makeAbs(self, m)
    -      self.statCache[mabs] = self.statCache[abs]
    -      self.cache[mabs] = self.cache[abs]
    -    }
    -  }
    -
    -  return m
    -}
    -
    -// lotta situps...
    -function makeAbs (self, f) {
    -  var abs = f
    -  if (f.charAt(0) === '/') {
    -    abs = path.join(self.root, f)
    -  } else if (isAbsolute(f) || f === '') {
    -    abs = f
    -  } else if (self.changedCwd) {
    -    abs = path.resolve(self.cwd, f)
    -  } else {
    -    abs = path.resolve(f)
    -  }
    -
    -  if (process.platform === 'win32')
    -    abs = abs.replace(/\\/g, '/')
    -
    -  return abs
    -}
    -
    -
    -// Return true, if pattern ends with globstar '**', for the accompanying parent directory.
    -// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents
    -function isIgnored (self, path) {
    -  if (!self.ignore.length)
    -    return false
    -
    -  return self.ignore.some(function(item) {
    -    return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))
    -  })
    -}
    -
    -function childrenIgnored (self, path) {
    -  if (!self.ignore.length)
    -    return false
    -
    -  return self.ignore.some(function(item) {
    -    return !!(item.gmatcher && item.gmatcher.match(path))
    -  })
    -}
    diff --git a/deps/npm/node_modules/rimraf/node_modules/glob/glob.js b/deps/npm/node_modules/rimraf/node_modules/glob/glob.js
    deleted file mode 100644
    index 37a4d7e60775a3..00000000000000
    --- a/deps/npm/node_modules/rimraf/node_modules/glob/glob.js
    +++ /dev/null
    @@ -1,790 +0,0 @@
    -// Approach:
    -//
    -// 1. Get the minimatch set
    -// 2. For each pattern in the set, PROCESS(pattern, false)
    -// 3. Store matches per-set, then uniq them
    -//
    -// PROCESS(pattern, inGlobStar)
    -// Get the first [n] items from pattern that are all strings
    -// Join these together.  This is PREFIX.
    -//   If there is no more remaining, then stat(PREFIX) and
    -//   add to matches if it succeeds.  END.
    -//
    -// If inGlobStar and PREFIX is symlink and points to dir
    -//   set ENTRIES = []
    -// else readdir(PREFIX) as ENTRIES
    -//   If fail, END
    -//
    -// with ENTRIES
    -//   If pattern[n] is GLOBSTAR
    -//     // handle the case where the globstar match is empty
    -//     // by pruning it out, and testing the resulting pattern
    -//     PROCESS(pattern[0..n] + pattern[n+1 .. $], false)
    -//     // handle other cases.
    -//     for ENTRY in ENTRIES (not dotfiles)
    -//       // attach globstar + tail onto the entry
    -//       // Mark that this entry is a globstar match
    -//       PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)
    -//
    -//   else // not globstar
    -//     for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)
    -//       Test ENTRY against pattern[n]
    -//       If fails, continue
    -//       If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])
    -//
    -// Caveat:
    -//   Cache all stats and readdirs results to minimize syscall.  Since all
    -//   we ever care about is existence and directory-ness, we can just keep
    -//   `true` for files, and [children,...] for directories, or `false` for
    -//   things that don't exist.
    -
    -module.exports = glob
    -
    -var rp = require('fs.realpath')
    -var minimatch = require('minimatch')
    -var Minimatch = minimatch.Minimatch
    -var inherits = require('inherits')
    -var EE = require('events').EventEmitter
    -var path = require('path')
    -var assert = require('assert')
    -var isAbsolute = require('path-is-absolute')
    -var globSync = require('./sync.js')
    -var common = require('./common.js')
    -var setopts = common.setopts
    -var ownProp = common.ownProp
    -var inflight = require('inflight')
    -var util = require('util')
    -var childrenIgnored = common.childrenIgnored
    -var isIgnored = common.isIgnored
    -
    -var once = require('once')
    -
    -function glob (pattern, options, cb) {
    -  if (typeof options === 'function') cb = options, options = {}
    -  if (!options) options = {}
    -
    -  if (options.sync) {
    -    if (cb)
    -      throw new TypeError('callback provided to sync glob')
    -    return globSync(pattern, options)
    -  }
    -
    -  return new Glob(pattern, options, cb)
    -}
    -
    -glob.sync = globSync
    -var GlobSync = glob.GlobSync = globSync.GlobSync
    -
    -// old api surface
    -glob.glob = glob
    -
    -function extend (origin, add) {
    -  if (add === null || typeof add !== 'object') {
    -    return origin
    -  }
    -
    -  var keys = Object.keys(add)
    -  var i = keys.length
    -  while (i--) {
    -    origin[keys[i]] = add[keys[i]]
    -  }
    -  return origin
    -}
    -
    -glob.hasMagic = function (pattern, options_) {
    -  var options = extend({}, options_)
    -  options.noprocess = true
    -
    -  var g = new Glob(pattern, options)
    -  var set = g.minimatch.set
    -
    -  if (!pattern)
    -    return false
    -
    -  if (set.length > 1)
    -    return true
    -
    -  for (var j = 0; j < set[0].length; j++) {
    -    if (typeof set[0][j] !== 'string')
    -      return true
    -  }
    -
    -  return false
    -}
    -
    -glob.Glob = Glob
    -inherits(Glob, EE)
    -function Glob (pattern, options, cb) {
    -  if (typeof options === 'function') {
    -    cb = options
    -    options = null
    -  }
    -
    -  if (options && options.sync) {
    -    if (cb)
    -      throw new TypeError('callback provided to sync glob')
    -    return new GlobSync(pattern, options)
    -  }
    -
    -  if (!(this instanceof Glob))
    -    return new Glob(pattern, options, cb)
    -
    -  setopts(this, pattern, options)
    -  this._didRealPath = false
    -
    -  // process each pattern in the minimatch set
    -  var n = this.minimatch.set.length
    -
    -  // The matches are stored as {: true,...} so that
    -  // duplicates are automagically pruned.
    -  // Later, we do an Object.keys() on these.
    -  // Keep them as a list so we can fill in when nonull is set.
    -  this.matches = new Array(n)
    -
    -  if (typeof cb === 'function') {
    -    cb = once(cb)
    -    this.on('error', cb)
    -    this.on('end', function (matches) {
    -      cb(null, matches)
    -    })
    -  }
    -
    -  var self = this
    -  this._processing = 0
    -
    -  this._emitQueue = []
    -  this._processQueue = []
    -  this.paused = false
    -
    -  if (this.noprocess)
    -    return this
    -
    -  if (n === 0)
    -    return done()
    -
    -  var sync = true
    -  for (var i = 0; i < n; i ++) {
    -    this._process(this.minimatch.set[i], i, false, done)
    -  }
    -  sync = false
    -
    -  function done () {
    -    --self._processing
    -    if (self._processing <= 0) {
    -      if (sync) {
    -        process.nextTick(function () {
    -          self._finish()
    -        })
    -      } else {
    -        self._finish()
    -      }
    -    }
    -  }
    -}
    -
    -Glob.prototype._finish = function () {
    -  assert(this instanceof Glob)
    -  if (this.aborted)
    -    return
    -
    -  if (this.realpath && !this._didRealpath)
    -    return this._realpath()
    -
    -  common.finish(this)
    -  this.emit('end', this.found)
    -}
    -
    -Glob.prototype._realpath = function () {
    -  if (this._didRealpath)
    -    return
    -
    -  this._didRealpath = true
    -
    -  var n = this.matches.length
    -  if (n === 0)
    -    return this._finish()
    -
    -  var self = this
    -  for (var i = 0; i < this.matches.length; i++)
    -    this._realpathSet(i, next)
    -
    -  function next () {
    -    if (--n === 0)
    -      self._finish()
    -  }
    -}
    -
    -Glob.prototype._realpathSet = function (index, cb) {
    -  var matchset = this.matches[index]
    -  if (!matchset)
    -    return cb()
    -
    -  var found = Object.keys(matchset)
    -  var self = this
    -  var n = found.length
    -
    -  if (n === 0)
    -    return cb()
    -
    -  var set = this.matches[index] = Object.create(null)
    -  found.forEach(function (p, i) {
    -    // If there's a problem with the stat, then it means that
    -    // one or more of the links in the realpath couldn't be
    -    // resolved.  just return the abs value in that case.
    -    p = self._makeAbs(p)
    -    rp.realpath(p, self.realpathCache, function (er, real) {
    -      if (!er)
    -        set[real] = true
    -      else if (er.syscall === 'stat')
    -        set[p] = true
    -      else
    -        self.emit('error', er) // srsly wtf right here
    -
    -      if (--n === 0) {
    -        self.matches[index] = set
    -        cb()
    -      }
    -    })
    -  })
    -}
    -
    -Glob.prototype._mark = function (p) {
    -  return common.mark(this, p)
    -}
    -
    -Glob.prototype._makeAbs = function (f) {
    -  return common.makeAbs(this, f)
    -}
    -
    -Glob.prototype.abort = function () {
    -  this.aborted = true
    -  this.emit('abort')
    -}
    -
    -Glob.prototype.pause = function () {
    -  if (!this.paused) {
    -    this.paused = true
    -    this.emit('pause')
    -  }
    -}
    -
    -Glob.prototype.resume = function () {
    -  if (this.paused) {
    -    this.emit('resume')
    -    this.paused = false
    -    if (this._emitQueue.length) {
    -      var eq = this._emitQueue.slice(0)
    -      this._emitQueue.length = 0
    -      for (var i = 0; i < eq.length; i ++) {
    -        var e = eq[i]
    -        this._emitMatch(e[0], e[1])
    -      }
    -    }
    -    if (this._processQueue.length) {
    -      var pq = this._processQueue.slice(0)
    -      this._processQueue.length = 0
    -      for (var i = 0; i < pq.length; i ++) {
    -        var p = pq[i]
    -        this._processing--
    -        this._process(p[0], p[1], p[2], p[3])
    -      }
    -    }
    -  }
    -}
    -
    -Glob.prototype._process = function (pattern, index, inGlobStar, cb) {
    -  assert(this instanceof Glob)
    -  assert(typeof cb === 'function')
    -
    -  if (this.aborted)
    -    return
    -
    -  this._processing++
    -  if (this.paused) {
    -    this._processQueue.push([pattern, index, inGlobStar, cb])
    -    return
    -  }
    -
    -  //console.error('PROCESS %d', this._processing, pattern)
    -
    -  // Get the first [n] parts of pattern that are all strings.
    -  var n = 0
    -  while (typeof pattern[n] === 'string') {
    -    n ++
    -  }
    -  // now n is the index of the first one that is *not* a string.
    -
    -  // see if there's anything else
    -  var prefix
    -  switch (n) {
    -    // if not, then this is rather simple
    -    case pattern.length:
    -      this._processSimple(pattern.join('/'), index, cb)
    -      return
    -
    -    case 0:
    -      // pattern *starts* with some non-trivial item.
    -      // going to readdir(cwd), but not include the prefix in matches.
    -      prefix = null
    -      break
    -
    -    default:
    -      // pattern has some string bits in the front.
    -      // whatever it starts with, whether that's 'absolute' like /foo/bar,
    -      // or 'relative' like '../baz'
    -      prefix = pattern.slice(0, n).join('/')
    -      break
    -  }
    -
    -  var remain = pattern.slice(n)
    -
    -  // get the list of entries.
    -  var read
    -  if (prefix === null)
    -    read = '.'
    -  else if (isAbsolute(prefix) ||
    -      isAbsolute(pattern.map(function (p) {
    -        return typeof p === 'string' ? p : '[*]'
    -      }).join('/'))) {
    -    if (!prefix || !isAbsolute(prefix))
    -      prefix = '/' + prefix
    -    read = prefix
    -  } else
    -    read = prefix
    -
    -  var abs = this._makeAbs(read)
    -
    -  //if ignored, skip _processing
    -  if (childrenIgnored(this, read))
    -    return cb()
    -
    -  var isGlobStar = remain[0] === minimatch.GLOBSTAR
    -  if (isGlobStar)
    -    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)
    -  else
    -    this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)
    -}
    -
    -Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {
    -  var self = this
    -  this._readdir(abs, inGlobStar, function (er, entries) {
    -    return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
    -  })
    -}
    -
    -Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
    -
    -  // if the abs isn't a dir, then nothing can match!
    -  if (!entries)
    -    return cb()
    -
    -  // It will only match dot entries if it starts with a dot, or if
    -  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.
    -  var pn = remain[0]
    -  var negate = !!this.minimatch.negate
    -  var rawGlob = pn._glob
    -  var dotOk = this.dot || rawGlob.charAt(0) === '.'
    -
    -  var matchedEntries = []
    -  for (var i = 0; i < entries.length; i++) {
    -    var e = entries[i]
    -    if (e.charAt(0) !== '.' || dotOk) {
    -      var m
    -      if (negate && !prefix) {
    -        m = !e.match(pn)
    -      } else {
    -        m = e.match(pn)
    -      }
    -      if (m)
    -        matchedEntries.push(e)
    -    }
    -  }
    -
    -  //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)
    -
    -  var len = matchedEntries.length
    -  // If there are no matched entries, then nothing matches.
    -  if (len === 0)
    -    return cb()
    -
    -  // if this is the last remaining pattern bit, then no need for
    -  // an additional stat *unless* the user has specified mark or
    -  // stat explicitly.  We know they exist, since readdir returned
    -  // them.
    -
    -  if (remain.length === 1 && !this.mark && !this.stat) {
    -    if (!this.matches[index])
    -      this.matches[index] = Object.create(null)
    -
    -    for (var i = 0; i < len; i ++) {
    -      var e = matchedEntries[i]
    -      if (prefix) {
    -        if (prefix !== '/')
    -          e = prefix + '/' + e
    -        else
    -          e = prefix + e
    -      }
    -
    -      if (e.charAt(0) === '/' && !this.nomount) {
    -        e = path.join(this.root, e)
    -      }
    -      this._emitMatch(index, e)
    -    }
    -    // This was the last one, and no stats were needed
    -    return cb()
    -  }
    -
    -  // now test all matched entries as stand-ins for that part
    -  // of the pattern.
    -  remain.shift()
    -  for (var i = 0; i < len; i ++) {
    -    var e = matchedEntries[i]
    -    var newPattern
    -    if (prefix) {
    -      if (prefix !== '/')
    -        e = prefix + '/' + e
    -      else
    -        e = prefix + e
    -    }
    -    this._process([e].concat(remain), index, inGlobStar, cb)
    -  }
    -  cb()
    -}
    -
    -Glob.prototype._emitMatch = function (index, e) {
    -  if (this.aborted)
    -    return
    -
    -  if (isIgnored(this, e))
    -    return
    -
    -  if (this.paused) {
    -    this._emitQueue.push([index, e])
    -    return
    -  }
    -
    -  var abs = isAbsolute(e) ? e : this._makeAbs(e)
    -
    -  if (this.mark)
    -    e = this._mark(e)
    -
    -  if (this.absolute)
    -    e = abs
    -
    -  if (this.matches[index][e])
    -    return
    -
    -  if (this.nodir) {
    -    var c = this.cache[abs]
    -    if (c === 'DIR' || Array.isArray(c))
    -      return
    -  }
    -
    -  this.matches[index][e] = true
    -
    -  var st = this.statCache[abs]
    -  if (st)
    -    this.emit('stat', e, st)
    -
    -  this.emit('match', e)
    -}
    -
    -Glob.prototype._readdirInGlobStar = function (abs, cb) {
    -  if (this.aborted)
    -    return
    -
    -  // follow all symlinked directories forever
    -  // just proceed as if this is a non-globstar situation
    -  if (this.follow)
    -    return this._readdir(abs, false, cb)
    -
    -  var lstatkey = 'lstat\0' + abs
    -  var self = this
    -  var lstatcb = inflight(lstatkey, lstatcb_)
    -
    -  if (lstatcb)
    -    self.fs.lstat(abs, lstatcb)
    -
    -  function lstatcb_ (er, lstat) {
    -    if (er && er.code === 'ENOENT')
    -      return cb()
    -
    -    var isSym = lstat && lstat.isSymbolicLink()
    -    self.symlinks[abs] = isSym
    -
    -    // If it's not a symlink or a dir, then it's definitely a regular file.
    -    // don't bother doing a readdir in that case.
    -    if (!isSym && lstat && !lstat.isDirectory()) {
    -      self.cache[abs] = 'FILE'
    -      cb()
    -    } else
    -      self._readdir(abs, false, cb)
    -  }
    -}
    -
    -Glob.prototype._readdir = function (abs, inGlobStar, cb) {
    -  if (this.aborted)
    -    return
    -
    -  cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb)
    -  if (!cb)
    -    return
    -
    -  //console.error('RD %j %j', +inGlobStar, abs)
    -  if (inGlobStar && !ownProp(this.symlinks, abs))
    -    return this._readdirInGlobStar(abs, cb)
    -
    -  if (ownProp(this.cache, abs)) {
    -    var c = this.cache[abs]
    -    if (!c || c === 'FILE')
    -      return cb()
    -
    -    if (Array.isArray(c))
    -      return cb(null, c)
    -  }
    -
    -  var self = this
    -  self.fs.readdir(abs, readdirCb(this, abs, cb))
    -}
    -
    -function readdirCb (self, abs, cb) {
    -  return function (er, entries) {
    -    if (er)
    -      self._readdirError(abs, er, cb)
    -    else
    -      self._readdirEntries(abs, entries, cb)
    -  }
    -}
    -
    -Glob.prototype._readdirEntries = function (abs, entries, cb) {
    -  if (this.aborted)
    -    return
    -
    -  // if we haven't asked to stat everything, then just
    -  // assume that everything in there exists, so we can avoid
    -  // having to stat it a second time.
    -  if (!this.mark && !this.stat) {
    -    for (var i = 0; i < entries.length; i ++) {
    -      var e = entries[i]
    -      if (abs === '/')
    -        e = abs + e
    -      else
    -        e = abs + '/' + e
    -      this.cache[e] = true
    -    }
    -  }
    -
    -  this.cache[abs] = entries
    -  return cb(null, entries)
    -}
    -
    -Glob.prototype._readdirError = function (f, er, cb) {
    -  if (this.aborted)
    -    return
    -
    -  // handle errors, and cache the information
    -  switch (er.code) {
    -    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
    -    case 'ENOTDIR': // totally normal. means it *does* exist.
    -      var abs = this._makeAbs(f)
    -      this.cache[abs] = 'FILE'
    -      if (abs === this.cwdAbs) {
    -        var error = new Error(er.code + ' invalid cwd ' + this.cwd)
    -        error.path = this.cwd
    -        error.code = er.code
    -        this.emit('error', error)
    -        this.abort()
    -      }
    -      break
    -
    -    case 'ENOENT': // not terribly unusual
    -    case 'ELOOP':
    -    case 'ENAMETOOLONG':
    -    case 'UNKNOWN':
    -      this.cache[this._makeAbs(f)] = false
    -      break
    -
    -    default: // some unusual error.  Treat as failure.
    -      this.cache[this._makeAbs(f)] = false
    -      if (this.strict) {
    -        this.emit('error', er)
    -        // If the error is handled, then we abort
    -        // if not, we threw out of here
    -        this.abort()
    -      }
    -      if (!this.silent)
    -        console.error('glob error', er)
    -      break
    -  }
    -
    -  return cb()
    -}
    -
    -Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {
    -  var self = this
    -  this._readdir(abs, inGlobStar, function (er, entries) {
    -    self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
    -  })
    -}
    -
    -
    -Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
    -  //console.error('pgs2', prefix, remain[0], entries)
    -
    -  // no entries means not a dir, so it can never have matches
    -  // foo.txt/** doesn't match foo.txt
    -  if (!entries)
    -    return cb()
    -
    -  // test without the globstar, and with every child both below
    -  // and replacing the globstar.
    -  var remainWithoutGlobStar = remain.slice(1)
    -  var gspref = prefix ? [ prefix ] : []
    -  var noGlobStar = gspref.concat(remainWithoutGlobStar)
    -
    -  // the noGlobStar pattern exits the inGlobStar state
    -  this._process(noGlobStar, index, false, cb)
    -
    -  var isSym = this.symlinks[abs]
    -  var len = entries.length
    -
    -  // If it's a symlink, and we're in a globstar, then stop
    -  if (isSym && inGlobStar)
    -    return cb()
    -
    -  for (var i = 0; i < len; i++) {
    -    var e = entries[i]
    -    if (e.charAt(0) === '.' && !this.dot)
    -      continue
    -
    -    // these two cases enter the inGlobStar state
    -    var instead = gspref.concat(entries[i], remainWithoutGlobStar)
    -    this._process(instead, index, true, cb)
    -
    -    var below = gspref.concat(entries[i], remain)
    -    this._process(below, index, true, cb)
    -  }
    -
    -  cb()
    -}
    -
    -Glob.prototype._processSimple = function (prefix, index, cb) {
    -  // XXX review this.  Shouldn't it be doing the mounting etc
    -  // before doing stat?  kinda weird?
    -  var self = this
    -  this._stat(prefix, function (er, exists) {
    -    self._processSimple2(prefix, index, er, exists, cb)
    -  })
    -}
    -Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {
    -
    -  //console.error('ps2', prefix, exists)
    -
    -  if (!this.matches[index])
    -    this.matches[index] = Object.create(null)
    -
    -  // If it doesn't exist, then just mark the lack of results
    -  if (!exists)
    -    return cb()
    -
    -  if (prefix && isAbsolute(prefix) && !this.nomount) {
    -    var trail = /[\/\\]$/.test(prefix)
    -    if (prefix.charAt(0) === '/') {
    -      prefix = path.join(this.root, prefix)
    -    } else {
    -      prefix = path.resolve(this.root, prefix)
    -      if (trail)
    -        prefix += '/'
    -    }
    -  }
    -
    -  if (process.platform === 'win32')
    -    prefix = prefix.replace(/\\/g, '/')
    -
    -  // Mark this as a match
    -  this._emitMatch(index, prefix)
    -  cb()
    -}
    -
    -// Returns either 'DIR', 'FILE', or false
    -Glob.prototype._stat = function (f, cb) {
    -  var abs = this._makeAbs(f)
    -  var needDir = f.slice(-1) === '/'
    -
    -  if (f.length > this.maxLength)
    -    return cb()
    -
    -  if (!this.stat && ownProp(this.cache, abs)) {
    -    var c = this.cache[abs]
    -
    -    if (Array.isArray(c))
    -      c = 'DIR'
    -
    -    // It exists, but maybe not how we need it
    -    if (!needDir || c === 'DIR')
    -      return cb(null, c)
    -
    -    if (needDir && c === 'FILE')
    -      return cb()
    -
    -    // otherwise we have to stat, because maybe c=true
    -    // if we know it exists, but not what it is.
    -  }
    -
    -  var exists
    -  var stat = this.statCache[abs]
    -  if (stat !== undefined) {
    -    if (stat === false)
    -      return cb(null, stat)
    -    else {
    -      var type = stat.isDirectory() ? 'DIR' : 'FILE'
    -      if (needDir && type === 'FILE')
    -        return cb()
    -      else
    -        return cb(null, type, stat)
    -    }
    -  }
    -
    -  var self = this
    -  var statcb = inflight('stat\0' + abs, lstatcb_)
    -  if (statcb)
    -    self.fs.lstat(abs, statcb)
    -
    -  function lstatcb_ (er, lstat) {
    -    if (lstat && lstat.isSymbolicLink()) {
    -      // If it's a symlink, then treat it as the target, unless
    -      // the target does not exist, then treat it as a file.
    -      return self.fs.stat(abs, function (er, stat) {
    -        if (er)
    -          self._stat2(f, abs, null, lstat, cb)
    -        else
    -          self._stat2(f, abs, er, stat, cb)
    -      })
    -    } else {
    -      self._stat2(f, abs, er, lstat, cb)
    -    }
    -  }
    -}
    -
    -Glob.prototype._stat2 = function (f, abs, er, stat, cb) {
    -  if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
    -    this.statCache[abs] = false
    -    return cb()
    -  }
    -
    -  var needDir = f.slice(-1) === '/'
    -  this.statCache[abs] = stat
    -
    -  if (abs.slice(-1) === '/' && stat && !stat.isDirectory())
    -    return cb(null, false, stat)
    -
    -  var c = true
    -  if (stat)
    -    c = stat.isDirectory() ? 'DIR' : 'FILE'
    -  this.cache[abs] = this.cache[abs] || c
    -
    -  if (needDir && c === 'FILE')
    -    return cb()
    -
    -  return cb(null, c, stat)
    -}
    diff --git a/deps/npm/node_modules/rimraf/node_modules/glob/package.json b/deps/npm/node_modules/rimraf/node_modules/glob/package.json
    deleted file mode 100644
    index 5940b649b7e65a..00000000000000
    --- a/deps/npm/node_modules/rimraf/node_modules/glob/package.json
    +++ /dev/null
    @@ -1,55 +0,0 @@
    -{
    -  "author": "Isaac Z. Schlueter  (http://blog.izs.me/)",
    -  "name": "glob",
    -  "description": "a little globber",
    -  "version": "7.2.3",
    -  "publishConfig": {
    -    "tag": "v7-legacy"
    -  },
    -  "repository": {
    -    "type": "git",
    -    "url": "git://github.com/isaacs/node-glob.git"
    -  },
    -  "main": "glob.js",
    -  "files": [
    -    "glob.js",
    -    "sync.js",
    -    "common.js"
    -  ],
    -  "engines": {
    -    "node": "*"
    -  },
    -  "dependencies": {
    -    "fs.realpath": "^1.0.0",
    -    "inflight": "^1.0.4",
    -    "inherits": "2",
    -    "minimatch": "^3.1.1",
    -    "once": "^1.3.0",
    -    "path-is-absolute": "^1.0.0"
    -  },
    -  "devDependencies": {
    -    "memfs": "^3.2.0",
    -    "mkdirp": "0",
    -    "rimraf": "^2.2.8",
    -    "tap": "^15.0.6",
    -    "tick": "0.0.6"
    -  },
    -  "tap": {
    -    "before": "test/00-setup.js",
    -    "after": "test/zz-cleanup.js",
    -    "jobs": 1
    -  },
    -  "scripts": {
    -    "prepublish": "npm run benchclean",
    -    "profclean": "rm -f v8.log profile.txt",
    -    "test": "tap",
    -    "test-regen": "npm run profclean && TEST_REGEN=1 node test/00-setup.js",
    -    "bench": "bash benchmark.sh",
    -    "prof": "bash prof.sh && cat profile.txt",
    -    "benchclean": "node benchclean.js"
    -  },
    -  "license": "ISC",
    -  "funding": {
    -    "url": "https://github.com/sponsors/isaacs"
    -  }
    -}
    diff --git a/deps/npm/node_modules/rimraf/node_modules/glob/sync.js b/deps/npm/node_modules/rimraf/node_modules/glob/sync.js
    deleted file mode 100644
    index 2c4f480192d28d..00000000000000
    --- a/deps/npm/node_modules/rimraf/node_modules/glob/sync.js
    +++ /dev/null
    @@ -1,486 +0,0 @@
    -module.exports = globSync
    -globSync.GlobSync = GlobSync
    -
    -var rp = require('fs.realpath')
    -var minimatch = require('minimatch')
    -var Minimatch = minimatch.Minimatch
    -var Glob = require('./glob.js').Glob
    -var util = require('util')
    -var path = require('path')
    -var assert = require('assert')
    -var isAbsolute = require('path-is-absolute')
    -var common = require('./common.js')
    -var setopts = common.setopts
    -var ownProp = common.ownProp
    -var childrenIgnored = common.childrenIgnored
    -var isIgnored = common.isIgnored
    -
    -function globSync (pattern, options) {
    -  if (typeof options === 'function' || arguments.length === 3)
    -    throw new TypeError('callback provided to sync glob\n'+
    -                        'See: https://github.com/isaacs/node-glob/issues/167')
    -
    -  return new GlobSync(pattern, options).found
    -}
    -
    -function GlobSync (pattern, options) {
    -  if (!pattern)
    -    throw new Error('must provide pattern')
    -
    -  if (typeof options === 'function' || arguments.length === 3)
    -    throw new TypeError('callback provided to sync glob\n'+
    -                        'See: https://github.com/isaacs/node-glob/issues/167')
    -
    -  if (!(this instanceof GlobSync))
    -    return new GlobSync(pattern, options)
    -
    -  setopts(this, pattern, options)
    -
    -  if (this.noprocess)
    -    return this
    -
    -  var n = this.minimatch.set.length
    -  this.matches = new Array(n)
    -  for (var i = 0; i < n; i ++) {
    -    this._process(this.minimatch.set[i], i, false)
    -  }
    -  this._finish()
    -}
    -
    -GlobSync.prototype._finish = function () {
    -  assert.ok(this instanceof GlobSync)
    -  if (this.realpath) {
    -    var self = this
    -    this.matches.forEach(function (matchset, index) {
    -      var set = self.matches[index] = Object.create(null)
    -      for (var p in matchset) {
    -        try {
    -          p = self._makeAbs(p)
    -          var real = rp.realpathSync(p, self.realpathCache)
    -          set[real] = true
    -        } catch (er) {
    -          if (er.syscall === 'stat')
    -            set[self._makeAbs(p)] = true
    -          else
    -            throw er
    -        }
    -      }
    -    })
    -  }
    -  common.finish(this)
    -}
    -
    -
    -GlobSync.prototype._process = function (pattern, index, inGlobStar) {
    -  assert.ok(this instanceof GlobSync)
    -
    -  // Get the first [n] parts of pattern that are all strings.
    -  var n = 0
    -  while (typeof pattern[n] === 'string') {
    -    n ++
    -  }
    -  // now n is the index of the first one that is *not* a string.
    -
    -  // See if there's anything else
    -  var prefix
    -  switch (n) {
    -    // if not, then this is rather simple
    -    case pattern.length:
    -      this._processSimple(pattern.join('/'), index)
    -      return
    -
    -    case 0:
    -      // pattern *starts* with some non-trivial item.
    -      // going to readdir(cwd), but not include the prefix in matches.
    -      prefix = null
    -      break
    -
    -    default:
    -      // pattern has some string bits in the front.
    -      // whatever it starts with, whether that's 'absolute' like /foo/bar,
    -      // or 'relative' like '../baz'
    -      prefix = pattern.slice(0, n).join('/')
    -      break
    -  }
    -
    -  var remain = pattern.slice(n)
    -
    -  // get the list of entries.
    -  var read
    -  if (prefix === null)
    -    read = '.'
    -  else if (isAbsolute(prefix) ||
    -      isAbsolute(pattern.map(function (p) {
    -        return typeof p === 'string' ? p : '[*]'
    -      }).join('/'))) {
    -    if (!prefix || !isAbsolute(prefix))
    -      prefix = '/' + prefix
    -    read = prefix
    -  } else
    -    read = prefix
    -
    -  var abs = this._makeAbs(read)
    -
    -  //if ignored, skip processing
    -  if (childrenIgnored(this, read))
    -    return
    -
    -  var isGlobStar = remain[0] === minimatch.GLOBSTAR
    -  if (isGlobStar)
    -    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar)
    -  else
    -    this._processReaddir(prefix, read, abs, remain, index, inGlobStar)
    -}
    -
    -
    -GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) {
    -  var entries = this._readdir(abs, inGlobStar)
    -
    -  // if the abs isn't a dir, then nothing can match!
    -  if (!entries)
    -    return
    -
    -  // It will only match dot entries if it starts with a dot, or if
    -  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.
    -  var pn = remain[0]
    -  var negate = !!this.minimatch.negate
    -  var rawGlob = pn._glob
    -  var dotOk = this.dot || rawGlob.charAt(0) === '.'
    -
    -  var matchedEntries = []
    -  for (var i = 0; i < entries.length; i++) {
    -    var e = entries[i]
    -    if (e.charAt(0) !== '.' || dotOk) {
    -      var m
    -      if (negate && !prefix) {
    -        m = !e.match(pn)
    -      } else {
    -        m = e.match(pn)
    -      }
    -      if (m)
    -        matchedEntries.push(e)
    -    }
    -  }
    -
    -  var len = matchedEntries.length
    -  // If there are no matched entries, then nothing matches.
    -  if (len === 0)
    -    return
    -
    -  // if this is the last remaining pattern bit, then no need for
    -  // an additional stat *unless* the user has specified mark or
    -  // stat explicitly.  We know they exist, since readdir returned
    -  // them.
    -
    -  if (remain.length === 1 && !this.mark && !this.stat) {
    -    if (!this.matches[index])
    -      this.matches[index] = Object.create(null)
    -
    -    for (var i = 0; i < len; i ++) {
    -      var e = matchedEntries[i]
    -      if (prefix) {
    -        if (prefix.slice(-1) !== '/')
    -          e = prefix + '/' + e
    -        else
    -          e = prefix + e
    -      }
    -
    -      if (e.charAt(0) === '/' && !this.nomount) {
    -        e = path.join(this.root, e)
    -      }
    -      this._emitMatch(index, e)
    -    }
    -    // This was the last one, and no stats were needed
    -    return
    -  }
    -
    -  // now test all matched entries as stand-ins for that part
    -  // of the pattern.
    -  remain.shift()
    -  for (var i = 0; i < len; i ++) {
    -    var e = matchedEntries[i]
    -    var newPattern
    -    if (prefix)
    -      newPattern = [prefix, e]
    -    else
    -      newPattern = [e]
    -    this._process(newPattern.concat(remain), index, inGlobStar)
    -  }
    -}
    -
    -
    -GlobSync.prototype._emitMatch = function (index, e) {
    -  if (isIgnored(this, e))
    -    return
    -
    -  var abs = this._makeAbs(e)
    -
    -  if (this.mark)
    -    e = this._mark(e)
    -
    -  if (this.absolute) {
    -    e = abs
    -  }
    -
    -  if (this.matches[index][e])
    -    return
    -
    -  if (this.nodir) {
    -    var c = this.cache[abs]
    -    if (c === 'DIR' || Array.isArray(c))
    -      return
    -  }
    -
    -  this.matches[index][e] = true
    -
    -  if (this.stat)
    -    this._stat(e)
    -}
    -
    -
    -GlobSync.prototype._readdirInGlobStar = function (abs) {
    -  // follow all symlinked directories forever
    -  // just proceed as if this is a non-globstar situation
    -  if (this.follow)
    -    return this._readdir(abs, false)
    -
    -  var entries
    -  var lstat
    -  var stat
    -  try {
    -    lstat = this.fs.lstatSync(abs)
    -  } catch (er) {
    -    if (er.code === 'ENOENT') {
    -      // lstat failed, doesn't exist
    -      return null
    -    }
    -  }
    -
    -  var isSym = lstat && lstat.isSymbolicLink()
    -  this.symlinks[abs] = isSym
    -
    -  // If it's not a symlink or a dir, then it's definitely a regular file.
    -  // don't bother doing a readdir in that case.
    -  if (!isSym && lstat && !lstat.isDirectory())
    -    this.cache[abs] = 'FILE'
    -  else
    -    entries = this._readdir(abs, false)
    -
    -  return entries
    -}
    -
    -GlobSync.prototype._readdir = function (abs, inGlobStar) {
    -  var entries
    -
    -  if (inGlobStar && !ownProp(this.symlinks, abs))
    -    return this._readdirInGlobStar(abs)
    -
    -  if (ownProp(this.cache, abs)) {
    -    var c = this.cache[abs]
    -    if (!c || c === 'FILE')
    -      return null
    -
    -    if (Array.isArray(c))
    -      return c
    -  }
    -
    -  try {
    -    return this._readdirEntries(abs, this.fs.readdirSync(abs))
    -  } catch (er) {
    -    this._readdirError(abs, er)
    -    return null
    -  }
    -}
    -
    -GlobSync.prototype._readdirEntries = function (abs, entries) {
    -  // if we haven't asked to stat everything, then just
    -  // assume that everything in there exists, so we can avoid
    -  // having to stat it a second time.
    -  if (!this.mark && !this.stat) {
    -    for (var i = 0; i < entries.length; i ++) {
    -      var e = entries[i]
    -      if (abs === '/')
    -        e = abs + e
    -      else
    -        e = abs + '/' + e
    -      this.cache[e] = true
    -    }
    -  }
    -
    -  this.cache[abs] = entries
    -
    -  // mark and cache dir-ness
    -  return entries
    -}
    -
    -GlobSync.prototype._readdirError = function (f, er) {
    -  // handle errors, and cache the information
    -  switch (er.code) {
    -    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
    -    case 'ENOTDIR': // totally normal. means it *does* exist.
    -      var abs = this._makeAbs(f)
    -      this.cache[abs] = 'FILE'
    -      if (abs === this.cwdAbs) {
    -        var error = new Error(er.code + ' invalid cwd ' + this.cwd)
    -        error.path = this.cwd
    -        error.code = er.code
    -        throw error
    -      }
    -      break
    -
    -    case 'ENOENT': // not terribly unusual
    -    case 'ELOOP':
    -    case 'ENAMETOOLONG':
    -    case 'UNKNOWN':
    -      this.cache[this._makeAbs(f)] = false
    -      break
    -
    -    default: // some unusual error.  Treat as failure.
    -      this.cache[this._makeAbs(f)] = false
    -      if (this.strict)
    -        throw er
    -      if (!this.silent)
    -        console.error('glob error', er)
    -      break
    -  }
    -}
    -
    -GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) {
    -
    -  var entries = this._readdir(abs, inGlobStar)
    -
    -  // no entries means not a dir, so it can never have matches
    -  // foo.txt/** doesn't match foo.txt
    -  if (!entries)
    -    return
    -
    -  // test without the globstar, and with every child both below
    -  // and replacing the globstar.
    -  var remainWithoutGlobStar = remain.slice(1)
    -  var gspref = prefix ? [ prefix ] : []
    -  var noGlobStar = gspref.concat(remainWithoutGlobStar)
    -
    -  // the noGlobStar pattern exits the inGlobStar state
    -  this._process(noGlobStar, index, false)
    -
    -  var len = entries.length
    -  var isSym = this.symlinks[abs]
    -
    -  // If it's a symlink, and we're in a globstar, then stop
    -  if (isSym && inGlobStar)
    -    return
    -
    -  for (var i = 0; i < len; i++) {
    -    var e = entries[i]
    -    if (e.charAt(0) === '.' && !this.dot)
    -      continue
    -
    -    // these two cases enter the inGlobStar state
    -    var instead = gspref.concat(entries[i], remainWithoutGlobStar)
    -    this._process(instead, index, true)
    -
    -    var below = gspref.concat(entries[i], remain)
    -    this._process(below, index, true)
    -  }
    -}
    -
    -GlobSync.prototype._processSimple = function (prefix, index) {
    -  // XXX review this.  Shouldn't it be doing the mounting etc
    -  // before doing stat?  kinda weird?
    -  var exists = this._stat(prefix)
    -
    -  if (!this.matches[index])
    -    this.matches[index] = Object.create(null)
    -
    -  // If it doesn't exist, then just mark the lack of results
    -  if (!exists)
    -    return
    -
    -  if (prefix && isAbsolute(prefix) && !this.nomount) {
    -    var trail = /[\/\\]$/.test(prefix)
    -    if (prefix.charAt(0) === '/') {
    -      prefix = path.join(this.root, prefix)
    -    } else {
    -      prefix = path.resolve(this.root, prefix)
    -      if (trail)
    -        prefix += '/'
    -    }
    -  }
    -
    -  if (process.platform === 'win32')
    -    prefix = prefix.replace(/\\/g, '/')
    -
    -  // Mark this as a match
    -  this._emitMatch(index, prefix)
    -}
    -
    -// Returns either 'DIR', 'FILE', or false
    -GlobSync.prototype._stat = function (f) {
    -  var abs = this._makeAbs(f)
    -  var needDir = f.slice(-1) === '/'
    -
    -  if (f.length > this.maxLength)
    -    return false
    -
    -  if (!this.stat && ownProp(this.cache, abs)) {
    -    var c = this.cache[abs]
    -
    -    if (Array.isArray(c))
    -      c = 'DIR'
    -
    -    // It exists, but maybe not how we need it
    -    if (!needDir || c === 'DIR')
    -      return c
    -
    -    if (needDir && c === 'FILE')
    -      return false
    -
    -    // otherwise we have to stat, because maybe c=true
    -    // if we know it exists, but not what it is.
    -  }
    -
    -  var exists
    -  var stat = this.statCache[abs]
    -  if (!stat) {
    -    var lstat
    -    try {
    -      lstat = this.fs.lstatSync(abs)
    -    } catch (er) {
    -      if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
    -        this.statCache[abs] = false
    -        return false
    -      }
    -    }
    -
    -    if (lstat && lstat.isSymbolicLink()) {
    -      try {
    -        stat = this.fs.statSync(abs)
    -      } catch (er) {
    -        stat = lstat
    -      }
    -    } else {
    -      stat = lstat
    -    }
    -  }
    -
    -  this.statCache[abs] = stat
    -
    -  var c = true
    -  if (stat)
    -    c = stat.isDirectory() ? 'DIR' : 'FILE'
    -
    -  this.cache[abs] = this.cache[abs] || c
    -
    -  if (needDir && c === 'FILE')
    -    return false
    -
    -  return c
    -}
    -
    -GlobSync.prototype._mark = function (p) {
    -  return common.mark(this, p)
    -}
    -
    -GlobSync.prototype._makeAbs = function (f) {
    -  return common.makeAbs(this, f)
    -}
    diff --git a/deps/npm/node_modules/rimraf/node_modules/minimatch/LICENSE b/deps/npm/node_modules/rimraf/node_modules/minimatch/LICENSE
    deleted file mode 100644
    index 19129e315fe593..00000000000000
    --- a/deps/npm/node_modules/rimraf/node_modules/minimatch/LICENSE
    +++ /dev/null
    @@ -1,15 +0,0 @@
    -The ISC License
    -
    -Copyright (c) Isaac Z. Schlueter and Contributors
    -
    -Permission to use, copy, modify, and/or distribute this software for any
    -purpose with or without fee is hereby granted, provided that the above
    -copyright notice and this permission notice appear in all copies.
    -
    -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
    -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    diff --git a/deps/npm/node_modules/rimraf/node_modules/minimatch/minimatch.js b/deps/npm/node_modules/rimraf/node_modules/minimatch/minimatch.js
    deleted file mode 100644
    index fda45ade7cfc35..00000000000000
    --- a/deps/npm/node_modules/rimraf/node_modules/minimatch/minimatch.js
    +++ /dev/null
    @@ -1,947 +0,0 @@
    -module.exports = minimatch
    -minimatch.Minimatch = Minimatch
    -
    -var path = (function () { try { return require('path') } catch (e) {}}()) || {
    -  sep: '/'
    -}
    -minimatch.sep = path.sep
    -
    -var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
    -var expand = require('brace-expansion')
    -
    -var plTypes = {
    -  '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
    -  '?': { open: '(?:', close: ')?' },
    -  '+': { open: '(?:', close: ')+' },
    -  '*': { open: '(?:', close: ')*' },
    -  '@': { open: '(?:', close: ')' }
    -}
    -
    -// any single thing other than /
    -// don't need to escape / when using new RegExp()
    -var qmark = '[^/]'
    -
    -// * => any number of characters
    -var star = qmark + '*?'
    -
    -// ** when dots are allowed.  Anything goes, except .. and .
    -// not (^ or / followed by one or two dots followed by $ or /),
    -// followed by anything, any number of times.
    -var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?'
    -
    -// not a ^ or / followed by a dot,
    -// followed by anything, any number of times.
    -var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?'
    -
    -// characters that need to be escaped in RegExp.
    -var reSpecials = charSet('().*{}+?[]^$\\!')
    -
    -// "abc" -> { a:true, b:true, c:true }
    -function charSet (s) {
    -  return s.split('').reduce(function (set, c) {
    -    set[c] = true
    -    return set
    -  }, {})
    -}
    -
    -// normalizes slashes.
    -var slashSplit = /\/+/
    -
    -minimatch.filter = filter
    -function filter (pattern, options) {
    -  options = options || {}
    -  return function (p, i, list) {
    -    return minimatch(p, pattern, options)
    -  }
    -}
    -
    -function ext (a, b) {
    -  b = b || {}
    -  var t = {}
    -  Object.keys(a).forEach(function (k) {
    -    t[k] = a[k]
    -  })
    -  Object.keys(b).forEach(function (k) {
    -    t[k] = b[k]
    -  })
    -  return t
    -}
    -
    -minimatch.defaults = function (def) {
    -  if (!def || typeof def !== 'object' || !Object.keys(def).length) {
    -    return minimatch
    -  }
    -
    -  var orig = minimatch
    -
    -  var m = function minimatch (p, pattern, options) {
    -    return orig(p, pattern, ext(def, options))
    -  }
    -
    -  m.Minimatch = function Minimatch (pattern, options) {
    -    return new orig.Minimatch(pattern, ext(def, options))
    -  }
    -  m.Minimatch.defaults = function defaults (options) {
    -    return orig.defaults(ext(def, options)).Minimatch
    -  }
    -
    -  m.filter = function filter (pattern, options) {
    -    return orig.filter(pattern, ext(def, options))
    -  }
    -
    -  m.defaults = function defaults (options) {
    -    return orig.defaults(ext(def, options))
    -  }
    -
    -  m.makeRe = function makeRe (pattern, options) {
    -    return orig.makeRe(pattern, ext(def, options))
    -  }
    -
    -  m.braceExpand = function braceExpand (pattern, options) {
    -    return orig.braceExpand(pattern, ext(def, options))
    -  }
    -
    -  m.match = function (list, pattern, options) {
    -    return orig.match(list, pattern, ext(def, options))
    -  }
    -
    -  return m
    -}
    -
    -Minimatch.defaults = function (def) {
    -  return minimatch.defaults(def).Minimatch
    -}
    -
    -function minimatch (p, pattern, options) {
    -  assertValidPattern(pattern)
    -
    -  if (!options) options = {}
    -
    -  // shortcut: comments match nothing.
    -  if (!options.nocomment && pattern.charAt(0) === '#') {
    -    return false
    -  }
    -
    -  return new Minimatch(pattern, options).match(p)
    -}
    -
    -function Minimatch (pattern, options) {
    -  if (!(this instanceof Minimatch)) {
    -    return new Minimatch(pattern, options)
    -  }
    -
    -  assertValidPattern(pattern)
    -
    -  if (!options) options = {}
    -
    -  pattern = pattern.trim()
    -
    -  // windows support: need to use /, not \
    -  if (!options.allowWindowsEscape && path.sep !== '/') {
    -    pattern = pattern.split(path.sep).join('/')
    -  }
    -
    -  this.options = options
    -  this.set = []
    -  this.pattern = pattern
    -  this.regexp = null
    -  this.negate = false
    -  this.comment = false
    -  this.empty = false
    -  this.partial = !!options.partial
    -
    -  // make the set of regexps etc.
    -  this.make()
    -}
    -
    -Minimatch.prototype.debug = function () {}
    -
    -Minimatch.prototype.make = make
    -function make () {
    -  var pattern = this.pattern
    -  var options = this.options
    -
    -  // empty patterns and comments match nothing.
    -  if (!options.nocomment && pattern.charAt(0) === '#') {
    -    this.comment = true
    -    return
    -  }
    -  if (!pattern) {
    -    this.empty = true
    -    return
    -  }
    -
    -  // step 1: figure out negation, etc.
    -  this.parseNegate()
    -
    -  // step 2: expand braces
    -  var set = this.globSet = this.braceExpand()
    -
    -  if (options.debug) this.debug = function debug() { console.error.apply(console, arguments) }
    -
    -  this.debug(this.pattern, set)
    -
    -  // step 3: now we have a set, so turn each one into a series of path-portion
    -  // matching patterns.
    -  // These will be regexps, except in the case of "**", which is
    -  // set to the GLOBSTAR object for globstar behavior,
    -  // and will not contain any / characters
    -  set = this.globParts = set.map(function (s) {
    -    return s.split(slashSplit)
    -  })
    -
    -  this.debug(this.pattern, set)
    -
    -  // glob --> regexps
    -  set = set.map(function (s, si, set) {
    -    return s.map(this.parse, this)
    -  }, this)
    -
    -  this.debug(this.pattern, set)
    -
    -  // filter out everything that didn't compile properly.
    -  set = set.filter(function (s) {
    -    return s.indexOf(false) === -1
    -  })
    -
    -  this.debug(this.pattern, set)
    -
    -  this.set = set
    -}
    -
    -Minimatch.prototype.parseNegate = parseNegate
    -function parseNegate () {
    -  var pattern = this.pattern
    -  var negate = false
    -  var options = this.options
    -  var negateOffset = 0
    -
    -  if (options.nonegate) return
    -
    -  for (var i = 0, l = pattern.length
    -    ; i < l && pattern.charAt(i) === '!'
    -    ; i++) {
    -    negate = !negate
    -    negateOffset++
    -  }
    -
    -  if (negateOffset) this.pattern = pattern.substr(negateOffset)
    -  this.negate = negate
    -}
    -
    -// Brace expansion:
    -// a{b,c}d -> abd acd
    -// a{b,}c -> abc ac
    -// a{0..3}d -> a0d a1d a2d a3d
    -// a{b,c{d,e}f}g -> abg acdfg acefg
    -// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
    -//
    -// Invalid sets are not expanded.
    -// a{2..}b -> a{2..}b
    -// a{b}c -> a{b}c
    -minimatch.braceExpand = function (pattern, options) {
    -  return braceExpand(pattern, options)
    -}
    -
    -Minimatch.prototype.braceExpand = braceExpand
    -
    -function braceExpand (pattern, options) {
    -  if (!options) {
    -    if (this instanceof Minimatch) {
    -      options = this.options
    -    } else {
    -      options = {}
    -    }
    -  }
    -
    -  pattern = typeof pattern === 'undefined'
    -    ? this.pattern : pattern
    -
    -  assertValidPattern(pattern)
    -
    -  // Thanks to Yeting Li  for
    -  // improving this regexp to avoid a ReDOS vulnerability.
    -  if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
    -    // shortcut. no need to expand.
    -    return [pattern]
    -  }
    -
    -  return expand(pattern)
    -}
    -
    -var MAX_PATTERN_LENGTH = 1024 * 64
    -var assertValidPattern = function (pattern) {
    -  if (typeof pattern !== 'string') {
    -    throw new TypeError('invalid pattern')
    -  }
    -
    -  if (pattern.length > MAX_PATTERN_LENGTH) {
    -    throw new TypeError('pattern is too long')
    -  }
    -}
    -
    -// parse a component of the expanded set.
    -// At this point, no pattern may contain "/" in it
    -// so we're going to return a 2d array, where each entry is the full
    -// pattern, split on '/', and then turned into a regular expression.
    -// A regexp is made at the end which joins each array with an
    -// escaped /, and another full one which joins each regexp with |.
    -//
    -// Following the lead of Bash 4.1, note that "**" only has special meaning
    -// when it is the *only* thing in a path portion.  Otherwise, any series
    -// of * is equivalent to a single *.  Globstar behavior is enabled by
    -// default, and can be disabled by setting options.noglobstar.
    -Minimatch.prototype.parse = parse
    -var SUBPARSE = {}
    -function parse (pattern, isSub) {
    -  assertValidPattern(pattern)
    -
    -  var options = this.options
    -
    -  // shortcuts
    -  if (pattern === '**') {
    -    if (!options.noglobstar)
    -      return GLOBSTAR
    -    else
    -      pattern = '*'
    -  }
    -  if (pattern === '') return ''
    -
    -  var re = ''
    -  var hasMagic = !!options.nocase
    -  var escaping = false
    -  // ? => one single character
    -  var patternListStack = []
    -  var negativeLists = []
    -  var stateChar
    -  var inClass = false
    -  var reClassStart = -1
    -  var classStart = -1
    -  // . and .. never match anything that doesn't start with .,
    -  // even when options.dot is set.
    -  var patternStart = pattern.charAt(0) === '.' ? '' // anything
    -  // not (start or / followed by . or .. followed by / or end)
    -  : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
    -  : '(?!\\.)'
    -  var self = this
    -
    -  function clearStateChar () {
    -    if (stateChar) {
    -      // we had some state-tracking character
    -      // that wasn't consumed by this pass.
    -      switch (stateChar) {
    -        case '*':
    -          re += star
    -          hasMagic = true
    -        break
    -        case '?':
    -          re += qmark
    -          hasMagic = true
    -        break
    -        default:
    -          re += '\\' + stateChar
    -        break
    -      }
    -      self.debug('clearStateChar %j %j', stateChar, re)
    -      stateChar = false
    -    }
    -  }
    -
    -  for (var i = 0, len = pattern.length, c
    -    ; (i < len) && (c = pattern.charAt(i))
    -    ; i++) {
    -    this.debug('%s\t%s %s %j', pattern, i, re, c)
    -
    -    // skip over any that are escaped.
    -    if (escaping && reSpecials[c]) {
    -      re += '\\' + c
    -      escaping = false
    -      continue
    -    }
    -
    -    switch (c) {
    -      /* istanbul ignore next */
    -      case '/': {
    -        // completely not allowed, even escaped.
    -        // Should already be path-split by now.
    -        return false
    -      }
    -
    -      case '\\':
    -        clearStateChar()
    -        escaping = true
    -      continue
    -
    -      // the various stateChar values
    -      // for the "extglob" stuff.
    -      case '?':
    -      case '*':
    -      case '+':
    -      case '@':
    -      case '!':
    -        this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c)
    -
    -        // all of those are literals inside a class, except that
    -        // the glob [!a] means [^a] in regexp
    -        if (inClass) {
    -          this.debug('  in class')
    -          if (c === '!' && i === classStart + 1) c = '^'
    -          re += c
    -          continue
    -        }
    -
    -        // if we already have a stateChar, then it means
    -        // that there was something like ** or +? in there.
    -        // Handle the stateChar, then proceed with this one.
    -        self.debug('call clearStateChar %j', stateChar)
    -        clearStateChar()
    -        stateChar = c
    -        // if extglob is disabled, then +(asdf|foo) isn't a thing.
    -        // just clear the statechar *now*, rather than even diving into
    -        // the patternList stuff.
    -        if (options.noext) clearStateChar()
    -      continue
    -
    -      case '(':
    -        if (inClass) {
    -          re += '('
    -          continue
    -        }
    -
    -        if (!stateChar) {
    -          re += '\\('
    -          continue
    -        }
    -
    -        patternListStack.push({
    -          type: stateChar,
    -          start: i - 1,
    -          reStart: re.length,
    -          open: plTypes[stateChar].open,
    -          close: plTypes[stateChar].close
    -        })
    -        // negation is (?:(?!js)[^/]*)
    -        re += stateChar === '!' ? '(?:(?!(?:' : '(?:'
    -        this.debug('plType %j %j', stateChar, re)
    -        stateChar = false
    -      continue
    -
    -      case ')':
    -        if (inClass || !patternListStack.length) {
    -          re += '\\)'
    -          continue
    -        }
    -
    -        clearStateChar()
    -        hasMagic = true
    -        var pl = patternListStack.pop()
    -        // negation is (?:(?!js)[^/]*)
    -        // The others are (?:)
    -        re += pl.close
    -        if (pl.type === '!') {
    -          negativeLists.push(pl)
    -        }
    -        pl.reEnd = re.length
    -      continue
    -
    -      case '|':
    -        if (inClass || !patternListStack.length || escaping) {
    -          re += '\\|'
    -          escaping = false
    -          continue
    -        }
    -
    -        clearStateChar()
    -        re += '|'
    -      continue
    -
    -      // these are mostly the same in regexp and glob
    -      case '[':
    -        // swallow any state-tracking char before the [
    -        clearStateChar()
    -
    -        if (inClass) {
    -          re += '\\' + c
    -          continue
    -        }
    -
    -        inClass = true
    -        classStart = i
    -        reClassStart = re.length
    -        re += c
    -      continue
    -
    -      case ']':
    -        //  a right bracket shall lose its special
    -        //  meaning and represent itself in
    -        //  a bracket expression if it occurs
    -        //  first in the list.  -- POSIX.2 2.8.3.2
    -        if (i === classStart + 1 || !inClass) {
    -          re += '\\' + c
    -          escaping = false
    -          continue
    -        }
    -
    -        // handle the case where we left a class open.
    -        // "[z-a]" is valid, equivalent to "\[z-a\]"
    -        // split where the last [ was, make sure we don't have
    -        // an invalid re. if so, re-walk the contents of the
    -        // would-be class to re-translate any characters that
    -        // were passed through as-is
    -        // TODO: It would probably be faster to determine this
    -        // without a try/catch and a new RegExp, but it's tricky
    -        // to do safely.  For now, this is safe and works.
    -        var cs = pattern.substring(classStart + 1, i)
    -        try {
    -          RegExp('[' + cs + ']')
    -        } catch (er) {
    -          // not a valid class!
    -          var sp = this.parse(cs, SUBPARSE)
    -          re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
    -          hasMagic = hasMagic || sp[1]
    -          inClass = false
    -          continue
    -        }
    -
    -        // finish up the class.
    -        hasMagic = true
    -        inClass = false
    -        re += c
    -      continue
    -
    -      default:
    -        // swallow any state char that wasn't consumed
    -        clearStateChar()
    -
    -        if (escaping) {
    -          // no need
    -          escaping = false
    -        } else if (reSpecials[c]
    -          && !(c === '^' && inClass)) {
    -          re += '\\'
    -        }
    -
    -        re += c
    -
    -    } // switch
    -  } // for
    -
    -  // handle the case where we left a class open.
    -  // "[abc" is valid, equivalent to "\[abc"
    -  if (inClass) {
    -    // split where the last [ was, and escape it
    -    // this is a huge pita.  We now have to re-walk
    -    // the contents of the would-be class to re-translate
    -    // any characters that were passed through as-is
    -    cs = pattern.substr(classStart + 1)
    -    sp = this.parse(cs, SUBPARSE)
    -    re = re.substr(0, reClassStart) + '\\[' + sp[0]
    -    hasMagic = hasMagic || sp[1]
    -  }
    -
    -  // handle the case where we had a +( thing at the *end*
    -  // of the pattern.
    -  // each pattern list stack adds 3 chars, and we need to go through
    -  // and escape any | chars that were passed through as-is for the regexp.
    -  // Go through and escape them, taking care not to double-escape any
    -  // | chars that were already escaped.
    -  for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
    -    var tail = re.slice(pl.reStart + pl.open.length)
    -    this.debug('setting tail', re, pl)
    -    // maybe some even number of \, then maybe 1 \, followed by a |
    -    tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {
    -      if (!$2) {
    -        // the | isn't already escaped, so escape it.
    -        $2 = '\\'
    -      }
    -
    -      // need to escape all those slashes *again*, without escaping the
    -      // one that we need for escaping the | character.  As it works out,
    -      // escaping an even number of slashes can be done by simply repeating
    -      // it exactly after itself.  That's why this trick works.
    -      //
    -      // I am sorry that you have to see this.
    -      return $1 + $1 + $2 + '|'
    -    })
    -
    -    this.debug('tail=%j\n   %s', tail, tail, pl, re)
    -    var t = pl.type === '*' ? star
    -      : pl.type === '?' ? qmark
    -      : '\\' + pl.type
    -
    -    hasMagic = true
    -    re = re.slice(0, pl.reStart) + t + '\\(' + tail
    -  }
    -
    -  // handle trailing things that only matter at the very end.
    -  clearStateChar()
    -  if (escaping) {
    -    // trailing \\
    -    re += '\\\\'
    -  }
    -
    -  // only need to apply the nodot start if the re starts with
    -  // something that could conceivably capture a dot
    -  var addPatternStart = false
    -  switch (re.charAt(0)) {
    -    case '[': case '.': case '(': addPatternStart = true
    -  }
    -
    -  // Hack to work around lack of negative lookbehind in JS
    -  // A pattern like: *.!(x).!(y|z) needs to ensure that a name
    -  // like 'a.xyz.yz' doesn't match.  So, the first negative
    -  // lookahead, has to look ALL the way ahead, to the end of
    -  // the pattern.
    -  for (var n = negativeLists.length - 1; n > -1; n--) {
    -    var nl = negativeLists[n]
    -
    -    var nlBefore = re.slice(0, nl.reStart)
    -    var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)
    -    var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)
    -    var nlAfter = re.slice(nl.reEnd)
    -
    -    nlLast += nlAfter
    -
    -    // Handle nested stuff like *(*.js|!(*.json)), where open parens
    -    // mean that we should *not* include the ) in the bit that is considered
    -    // "after" the negated section.
    -    var openParensBefore = nlBefore.split('(').length - 1
    -    var cleanAfter = nlAfter
    -    for (i = 0; i < openParensBefore; i++) {
    -      cleanAfter = cleanAfter.replace(/\)[+*?]?/, '')
    -    }
    -    nlAfter = cleanAfter
    -
    -    var dollar = ''
    -    if (nlAfter === '' && isSub !== SUBPARSE) {
    -      dollar = '$'
    -    }
    -    var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast
    -    re = newRe
    -  }
    -
    -  // if the re is not "" at this point, then we need to make sure
    -  // it doesn't match against an empty path part.
    -  // Otherwise a/* will match a/, which it should not.
    -  if (re !== '' && hasMagic) {
    -    re = '(?=.)' + re
    -  }
    -
    -  if (addPatternStart) {
    -    re = patternStart + re
    -  }
    -
    -  // parsing just a piece of a larger pattern.
    -  if (isSub === SUBPARSE) {
    -    return [re, hasMagic]
    -  }
    -
    -  // skip the regexp for non-magical patterns
    -  // unescape anything in it, though, so that it'll be
    -  // an exact match against a file etc.
    -  if (!hasMagic) {
    -    return globUnescape(pattern)
    -  }
    -
    -  var flags = options.nocase ? 'i' : ''
    -  try {
    -    var regExp = new RegExp('^' + re + '$', flags)
    -  } catch (er) /* istanbul ignore next - should be impossible */ {
    -    // If it was an invalid regular expression, then it can't match
    -    // anything.  This trick looks for a character after the end of
    -    // the string, which is of course impossible, except in multi-line
    -    // mode, but it's not a /m regex.
    -    return new RegExp('$.')
    -  }
    -
    -  regExp._glob = pattern
    -  regExp._src = re
    -
    -  return regExp
    -}
    -
    -minimatch.makeRe = function (pattern, options) {
    -  return new Minimatch(pattern, options || {}).makeRe()
    -}
    -
    -Minimatch.prototype.makeRe = makeRe
    -function makeRe () {
    -  if (this.regexp || this.regexp === false) return this.regexp
    -
    -  // at this point, this.set is a 2d array of partial
    -  // pattern strings, or "**".
    -  //
    -  // It's better to use .match().  This function shouldn't
    -  // be used, really, but it's pretty convenient sometimes,
    -  // when you just want to work with a regex.
    -  var set = this.set
    -
    -  if (!set.length) {
    -    this.regexp = false
    -    return this.regexp
    -  }
    -  var options = this.options
    -
    -  var twoStar = options.noglobstar ? star
    -    : options.dot ? twoStarDot
    -    : twoStarNoDot
    -  var flags = options.nocase ? 'i' : ''
    -
    -  var re = set.map(function (pattern) {
    -    return pattern.map(function (p) {
    -      return (p === GLOBSTAR) ? twoStar
    -      : (typeof p === 'string') ? regExpEscape(p)
    -      : p._src
    -    }).join('\\\/')
    -  }).join('|')
    -
    -  // must match entire pattern
    -  // ending in a * or ** will make it less strict.
    -  re = '^(?:' + re + ')$'
    -
    -  // can match anything, as long as it's not this.
    -  if (this.negate) re = '^(?!' + re + ').*$'
    -
    -  try {
    -    this.regexp = new RegExp(re, flags)
    -  } catch (ex) /* istanbul ignore next - should be impossible */ {
    -    this.regexp = false
    -  }
    -  return this.regexp
    -}
    -
    -minimatch.match = function (list, pattern, options) {
    -  options = options || {}
    -  var mm = new Minimatch(pattern, options)
    -  list = list.filter(function (f) {
    -    return mm.match(f)
    -  })
    -  if (mm.options.nonull && !list.length) {
    -    list.push(pattern)
    -  }
    -  return list
    -}
    -
    -Minimatch.prototype.match = function match (f, partial) {
    -  if (typeof partial === 'undefined') partial = this.partial
    -  this.debug('match', f, this.pattern)
    -  // short-circuit in the case of busted things.
    -  // comments, etc.
    -  if (this.comment) return false
    -  if (this.empty) return f === ''
    -
    -  if (f === '/' && partial) return true
    -
    -  var options = this.options
    -
    -  // windows: need to use /, not \
    -  if (path.sep !== '/') {
    -    f = f.split(path.sep).join('/')
    -  }
    -
    -  // treat the test path as a set of pathparts.
    -  f = f.split(slashSplit)
    -  this.debug(this.pattern, 'split', f)
    -
    -  // just ONE of the pattern sets in this.set needs to match
    -  // in order for it to be valid.  If negating, then just one
    -  // match means that we have failed.
    -  // Either way, return on the first hit.
    -
    -  var set = this.set
    -  this.debug(this.pattern, 'set', set)
    -
    -  // Find the basename of the path by looking for the last non-empty segment
    -  var filename
    -  var i
    -  for (i = f.length - 1; i >= 0; i--) {
    -    filename = f[i]
    -    if (filename) break
    -  }
    -
    -  for (i = 0; i < set.length; i++) {
    -    var pattern = set[i]
    -    var file = f
    -    if (options.matchBase && pattern.length === 1) {
    -      file = [filename]
    -    }
    -    var hit = this.matchOne(file, pattern, partial)
    -    if (hit) {
    -      if (options.flipNegate) return true
    -      return !this.negate
    -    }
    -  }
    -
    -  // didn't get any hits.  this is success if it's a negative
    -  // pattern, failure otherwise.
    -  if (options.flipNegate) return false
    -  return this.negate
    -}
    -
    -// set partial to true to test if, for example,
    -// "/a/b" matches the start of "/*/b/*/d"
    -// Partial means, if you run out of file before you run
    -// out of pattern, then that's fine, as long as all
    -// the parts match.
    -Minimatch.prototype.matchOne = function (file, pattern, partial) {
    -  var options = this.options
    -
    -  this.debug('matchOne',
    -    { 'this': this, file: file, pattern: pattern })
    -
    -  this.debug('matchOne', file.length, pattern.length)
    -
    -  for (var fi = 0,
    -      pi = 0,
    -      fl = file.length,
    -      pl = pattern.length
    -      ; (fi < fl) && (pi < pl)
    -      ; fi++, pi++) {
    -    this.debug('matchOne loop')
    -    var p = pattern[pi]
    -    var f = file[fi]
    -
    -    this.debug(pattern, p, f)
    -
    -    // should be impossible.
    -    // some invalid regexp stuff in the set.
    -    /* istanbul ignore if */
    -    if (p === false) return false
    -
    -    if (p === GLOBSTAR) {
    -      this.debug('GLOBSTAR', [pattern, p, f])
    -
    -      // "**"
    -      // a/**/b/**/c would match the following:
    -      // a/b/x/y/z/c
    -      // a/x/y/z/b/c
    -      // a/b/x/b/x/c
    -      // a/b/c
    -      // To do this, take the rest of the pattern after
    -      // the **, and see if it would match the file remainder.
    -      // If so, return success.
    -      // If not, the ** "swallows" a segment, and try again.
    -      // This is recursively awful.
    -      //
    -      // a/**/b/**/c matching a/b/x/y/z/c
    -      // - a matches a
    -      // - doublestar
    -      //   - matchOne(b/x/y/z/c, b/**/c)
    -      //     - b matches b
    -      //     - doublestar
    -      //       - matchOne(x/y/z/c, c) -> no
    -      //       - matchOne(y/z/c, c) -> no
    -      //       - matchOne(z/c, c) -> no
    -      //       - matchOne(c, c) yes, hit
    -      var fr = fi
    -      var pr = pi + 1
    -      if (pr === pl) {
    -        this.debug('** at the end')
    -        // a ** at the end will just swallow the rest.
    -        // We have found a match.
    -        // however, it will not swallow /.x, unless
    -        // options.dot is set.
    -        // . and .. are *never* matched by **, for explosively
    -        // exponential reasons.
    -        for (; fi < fl; fi++) {
    -          if (file[fi] === '.' || file[fi] === '..' ||
    -            (!options.dot && file[fi].charAt(0) === '.')) return false
    -        }
    -        return true
    -      }
    -
    -      // ok, let's see if we can swallow whatever we can.
    -      while (fr < fl) {
    -        var swallowee = file[fr]
    -
    -        this.debug('\nglobstar while', file, fr, pattern, pr, swallowee)
    -
    -        // XXX remove this slice.  Just pass the start index.
    -        if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
    -          this.debug('globstar found match!', fr, fl, swallowee)
    -          // found a match.
    -          return true
    -        } else {
    -          // can't swallow "." or ".." ever.
    -          // can only swallow ".foo" when explicitly asked.
    -          if (swallowee === '.' || swallowee === '..' ||
    -            (!options.dot && swallowee.charAt(0) === '.')) {
    -            this.debug('dot detected!', file, fr, pattern, pr)
    -            break
    -          }
    -
    -          // ** swallows a segment, and continue.
    -          this.debug('globstar swallow a segment, and continue')
    -          fr++
    -        }
    -      }
    -
    -      // no match was found.
    -      // However, in partial mode, we can't say this is necessarily over.
    -      // If there's more *pattern* left, then
    -      /* istanbul ignore if */
    -      if (partial) {
    -        // ran out of file
    -        this.debug('\n>>> no match, partial?', file, fr, pattern, pr)
    -        if (fr === fl) return true
    -      }
    -      return false
    -    }
    -
    -    // something other than **
    -    // non-magic patterns just have to match exactly
    -    // patterns with magic have been turned into regexps.
    -    var hit
    -    if (typeof p === 'string') {
    -      hit = f === p
    -      this.debug('string match', p, f, hit)
    -    } else {
    -      hit = f.match(p)
    -      this.debug('pattern match', p, f, hit)
    -    }
    -
    -    if (!hit) return false
    -  }
    -
    -  // Note: ending in / means that we'll get a final ""
    -  // at the end of the pattern.  This can only match a
    -  // corresponding "" at the end of the file.
    -  // If the file ends in /, then it can only match a
    -  // a pattern that ends in /, unless the pattern just
    -  // doesn't have any more for it. But, a/b/ should *not*
    -  // match "a/b/*", even though "" matches against the
    -  // [^/]*? pattern, except in partial mode, where it might
    -  // simply not be reached yet.
    -  // However, a/b/ should still satisfy a/*
    -
    -  // now either we fell off the end of the pattern, or we're done.
    -  if (fi === fl && pi === pl) {
    -    // ran out of pattern and filename at the same time.
    -    // an exact hit!
    -    return true
    -  } else if (fi === fl) {
    -    // ran out of file, but still had pattern left.
    -    // this is ok if we're doing the match as part of
    -    // a glob fs traversal.
    -    return partial
    -  } else /* istanbul ignore else */ if (pi === pl) {
    -    // ran out of pattern, still have file left.
    -    // this is only acceptable if we're on the very last
    -    // empty segment of a file with a trailing slash.
    -    // a/* should match a/b/
    -    return (fi === fl - 1) && (file[fi] === '')
    -  }
    -
    -  // should be unreachable.
    -  /* istanbul ignore next */
    -  throw new Error('wtf?')
    -}
    -
    -// replace stuff like \* with *
    -function globUnescape (s) {
    -  return s.replace(/\\(.)/g, '$1')
    -}
    -
    -function regExpEscape (s) {
    -  return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
    -}
    diff --git a/deps/npm/node_modules/rimraf/node_modules/minimatch/package.json b/deps/npm/node_modules/rimraf/node_modules/minimatch/package.json
    deleted file mode 100644
    index 566efdfe45cb80..00000000000000
    --- a/deps/npm/node_modules/rimraf/node_modules/minimatch/package.json
    +++ /dev/null
    @@ -1,33 +0,0 @@
    -{
    -  "author": "Isaac Z. Schlueter  (http://blog.izs.me)",
    -  "name": "minimatch",
    -  "description": "a glob matcher in javascript",
    -  "version": "3.1.2",
    -  "publishConfig": {
    -    "tag": "v3-legacy"
    -  },
    -  "repository": {
    -    "type": "git",
    -    "url": "git://github.com/isaacs/minimatch.git"
    -  },
    -  "main": "minimatch.js",
    -  "scripts": {
    -    "test": "tap",
    -    "preversion": "npm test",
    -    "postversion": "npm publish",
    -    "postpublish": "git push origin --all; git push origin --tags"
    -  },
    -  "engines": {
    -    "node": "*"
    -  },
    -  "dependencies": {
    -    "brace-expansion": "^1.1.7"
    -  },
    -  "devDependencies": {
    -    "tap": "^15.1.6"
    -  },
    -  "license": "ISC",
    -  "files": [
    -    "minimatch.js"
    -  ]
    -}
    diff --git a/deps/npm/node_modules/rimraf/package.json b/deps/npm/node_modules/rimraf/package.json
    deleted file mode 100644
    index 1bf8d5e38775d7..00000000000000
    --- a/deps/npm/node_modules/rimraf/package.json
    +++ /dev/null
    @@ -1,32 +0,0 @@
    -{
    -  "name": "rimraf",
    -  "version": "3.0.2",
    -  "main": "rimraf.js",
    -  "description": "A deep deletion module for node (like `rm -rf`)",
    -  "author": "Isaac Z. Schlueter  (http://blog.izs.me/)",
    -  "license": "ISC",
    -  "repository": "git://github.com/isaacs/rimraf.git",
    -  "scripts": {
    -    "preversion": "npm test",
    -    "postversion": "npm publish",
    -    "postpublish": "git push origin --follow-tags",
    -    "test": "tap test/*.js"
    -  },
    -  "bin": "./bin.js",
    -  "dependencies": {
    -    "glob": "^7.1.3"
    -  },
    -  "files": [
    -    "LICENSE",
    -    "README.md",
    -    "bin.js",
    -    "rimraf.js"
    -  ],
    -  "devDependencies": {
    -    "mkdirp": "^0.5.1",
    -    "tap": "^12.1.1"
    -  },
    -  "funding": {
    -    "url": "https://github.com/sponsors/isaacs"
    -  }
    -}
    diff --git a/deps/npm/node_modules/rimraf/rimraf.js b/deps/npm/node_modules/rimraf/rimraf.js
    deleted file mode 100644
    index 34da4171d75598..00000000000000
    --- a/deps/npm/node_modules/rimraf/rimraf.js
    +++ /dev/null
    @@ -1,360 +0,0 @@
    -const assert = require("assert")
    -const path = require("path")
    -const fs = require("fs")
    -let glob = undefined
    -try {
    -  glob = require("glob")
    -} catch (_err) {
    -  // treat glob as optional.
    -}
    -
    -const defaultGlobOpts = {
    -  nosort: true,
    -  silent: true
    -}
    -
    -// for EMFILE handling
    -let timeout = 0
    -
    -const isWindows = (process.platform === "win32")
    -
    -const defaults = options => {
    -  const methods = [
    -    'unlink',
    -    'chmod',
    -    'stat',
    -    'lstat',
    -    'rmdir',
    -    'readdir'
    -  ]
    -  methods.forEach(m => {
    -    options[m] = options[m] || fs[m]
    -    m = m + 'Sync'
    -    options[m] = options[m] || fs[m]
    -  })
    -
    -  options.maxBusyTries = options.maxBusyTries || 3
    -  options.emfileWait = options.emfileWait || 1000
    -  if (options.glob === false) {
    -    options.disableGlob = true
    -  }
    -  if (options.disableGlob !== true && glob === undefined) {
    -    throw Error('glob dependency not found, set `options.disableGlob = true` if intentional')
    -  }
    -  options.disableGlob = options.disableGlob || false
    -  options.glob = options.glob || defaultGlobOpts
    -}
    -
    -const rimraf = (p, options, cb) => {
    -  if (typeof options === 'function') {
    -    cb = options
    -    options = {}
    -  }
    -
    -  assert(p, 'rimraf: missing path')
    -  assert.equal(typeof p, 'string', 'rimraf: path should be a string')
    -  assert.equal(typeof cb, 'function', 'rimraf: callback function required')
    -  assert(options, 'rimraf: invalid options argument provided')
    -  assert.equal(typeof options, 'object', 'rimraf: options should be object')
    -
    -  defaults(options)
    -
    -  let busyTries = 0
    -  let errState = null
    -  let n = 0
    -
    -  const next = (er) => {
    -    errState = errState || er
    -    if (--n === 0)
    -      cb(errState)
    -  }
    -
    -  const afterGlob = (er, results) => {
    -    if (er)
    -      return cb(er)
    -
    -    n = results.length
    -    if (n === 0)
    -      return cb()
    -
    -    results.forEach(p => {
    -      const CB = (er) => {
    -        if (er) {
    -          if ((er.code === "EBUSY" || er.code === "ENOTEMPTY" || er.code === "EPERM") &&
    -              busyTries < options.maxBusyTries) {
    -            busyTries ++
    -            // try again, with the same exact callback as this one.
    -            return setTimeout(() => rimraf_(p, options, CB), busyTries * 100)
    -          }
    -
    -          // this one won't happen if graceful-fs is used.
    -          if (er.code === "EMFILE" && timeout < options.emfileWait) {
    -            return setTimeout(() => rimraf_(p, options, CB), timeout ++)
    -          }
    -
    -          // already gone
    -          if (er.code === "ENOENT") er = null
    -        }
    -
    -        timeout = 0
    -        next(er)
    -      }
    -      rimraf_(p, options, CB)
    -    })
    -  }
    -
    -  if (options.disableGlob || !glob.hasMagic(p))
    -    return afterGlob(null, [p])
    -
    -  options.lstat(p, (er, stat) => {
    -    if (!er)
    -      return afterGlob(null, [p])
    -
    -    glob(p, options.glob, afterGlob)
    -  })
    -
    -}
    -
    -// Two possible strategies.
    -// 1. Assume it's a file.  unlink it, then do the dir stuff on EPERM or EISDIR
    -// 2. Assume it's a directory.  readdir, then do the file stuff on ENOTDIR
    -//
    -// Both result in an extra syscall when you guess wrong.  However, there
    -// are likely far more normal files in the world than directories.  This
    -// is based on the assumption that a the average number of files per
    -// directory is >= 1.
    -//
    -// If anyone ever complains about this, then I guess the strategy could
    -// be made configurable somehow.  But until then, YAGNI.
    -const rimraf_ = (p, options, cb) => {
    -  assert(p)
    -  assert(options)
    -  assert(typeof cb === 'function')
    -
    -  // sunos lets the root user unlink directories, which is... weird.
    -  // so we have to lstat here and make sure it's not a dir.
    -  options.lstat(p, (er, st) => {
    -    if (er && er.code === "ENOENT")
    -      return cb(null)
    -
    -    // Windows can EPERM on stat.  Life is suffering.
    -    if (er && er.code === "EPERM" && isWindows)
    -      fixWinEPERM(p, options, er, cb)
    -
    -    if (st && st.isDirectory())
    -      return rmdir(p, options, er, cb)
    -
    -    options.unlink(p, er => {
    -      if (er) {
    -        if (er.code === "ENOENT")
    -          return cb(null)
    -        if (er.code === "EPERM")
    -          return (isWindows)
    -            ? fixWinEPERM(p, options, er, cb)
    -            : rmdir(p, options, er, cb)
    -        if (er.code === "EISDIR")
    -          return rmdir(p, options, er, cb)
    -      }
    -      return cb(er)
    -    })
    -  })
    -}
    -
    -const fixWinEPERM = (p, options, er, cb) => {
    -  assert(p)
    -  assert(options)
    -  assert(typeof cb === 'function')
    -
    -  options.chmod(p, 0o666, er2 => {
    -    if (er2)
    -      cb(er2.code === "ENOENT" ? null : er)
    -    else
    -      options.stat(p, (er3, stats) => {
    -        if (er3)
    -          cb(er3.code === "ENOENT" ? null : er)
    -        else if (stats.isDirectory())
    -          rmdir(p, options, er, cb)
    -        else
    -          options.unlink(p, cb)
    -      })
    -  })
    -}
    -
    -const fixWinEPERMSync = (p, options, er) => {
    -  assert(p)
    -  assert(options)
    -
    -  try {
    -    options.chmodSync(p, 0o666)
    -  } catch (er2) {
    -    if (er2.code === "ENOENT")
    -      return
    -    else
    -      throw er
    -  }
    -
    -  let stats
    -  try {
    -    stats = options.statSync(p)
    -  } catch (er3) {
    -    if (er3.code === "ENOENT")
    -      return
    -    else
    -      throw er
    -  }
    -
    -  if (stats.isDirectory())
    -    rmdirSync(p, options, er)
    -  else
    -    options.unlinkSync(p)
    -}
    -
    -const rmdir = (p, options, originalEr, cb) => {
    -  assert(p)
    -  assert(options)
    -  assert(typeof cb === 'function')
    -
    -  // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
    -  // if we guessed wrong, and it's not a directory, then
    -  // raise the original error.
    -  options.rmdir(p, er => {
    -    if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM"))
    -      rmkids(p, options, cb)
    -    else if (er && er.code === "ENOTDIR")
    -      cb(originalEr)
    -    else
    -      cb(er)
    -  })
    -}
    -
    -const rmkids = (p, options, cb) => {
    -  assert(p)
    -  assert(options)
    -  assert(typeof cb === 'function')
    -
    -  options.readdir(p, (er, files) => {
    -    if (er)
    -      return cb(er)
    -    let n = files.length
    -    if (n === 0)
    -      return options.rmdir(p, cb)
    -    let errState
    -    files.forEach(f => {
    -      rimraf(path.join(p, f), options, er => {
    -        if (errState)
    -          return
    -        if (er)
    -          return cb(errState = er)
    -        if (--n === 0)
    -          options.rmdir(p, cb)
    -      })
    -    })
    -  })
    -}
    -
    -// this looks simpler, and is strictly *faster*, but will
    -// tie up the JavaScript thread and fail on excessively
    -// deep directory trees.
    -const rimrafSync = (p, options) => {
    -  options = options || {}
    -  defaults(options)
    -
    -  assert(p, 'rimraf: missing path')
    -  assert.equal(typeof p, 'string', 'rimraf: path should be a string')
    -  assert(options, 'rimraf: missing options')
    -  assert.equal(typeof options, 'object', 'rimraf: options should be object')
    -
    -  let results
    -
    -  if (options.disableGlob || !glob.hasMagic(p)) {
    -    results = [p]
    -  } else {
    -    try {
    -      options.lstatSync(p)
    -      results = [p]
    -    } catch (er) {
    -      results = glob.sync(p, options.glob)
    -    }
    -  }
    -
    -  if (!results.length)
    -    return
    -
    -  for (let i = 0; i < results.length; i++) {
    -    const p = results[i]
    -
    -    let st
    -    try {
    -      st = options.lstatSync(p)
    -    } catch (er) {
    -      if (er.code === "ENOENT")
    -        return
    -
    -      // Windows can EPERM on stat.  Life is suffering.
    -      if (er.code === "EPERM" && isWindows)
    -        fixWinEPERMSync(p, options, er)
    -    }
    -
    -    try {
    -      // sunos lets the root user unlink directories, which is... weird.
    -      if (st && st.isDirectory())
    -        rmdirSync(p, options, null)
    -      else
    -        options.unlinkSync(p)
    -    } catch (er) {
    -      if (er.code === "ENOENT")
    -        return
    -      if (er.code === "EPERM")
    -        return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er)
    -      if (er.code !== "EISDIR")
    -        throw er
    -
    -      rmdirSync(p, options, er)
    -    }
    -  }
    -}
    -
    -const rmdirSync = (p, options, originalEr) => {
    -  assert(p)
    -  assert(options)
    -
    -  try {
    -    options.rmdirSync(p)
    -  } catch (er) {
    -    if (er.code === "ENOENT")
    -      return
    -    if (er.code === "ENOTDIR")
    -      throw originalEr
    -    if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")
    -      rmkidsSync(p, options)
    -  }
    -}
    -
    -const rmkidsSync = (p, options) => {
    -  assert(p)
    -  assert(options)
    -  options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options))
    -
    -  // We only end up here once we got ENOTEMPTY at least once, and
    -  // at this point, we are guaranteed to have removed all the kids.
    -  // So, we know that it won't be ENOENT or ENOTDIR or anything else.
    -  // try really hard to delete stuff on windows, because it has a
    -  // PROFOUNDLY annoying habit of not closing handles promptly when
    -  // files are deleted, resulting in spurious ENOTEMPTY errors.
    -  const retries = isWindows ? 100 : 1
    -  let i = 0
    -  do {
    -    let threw = true
    -    try {
    -      const ret = options.rmdirSync(p, options)
    -      threw = false
    -      return ret
    -    } finally {
    -      if (++i < retries && threw)
    -        continue
    -    }
    -  } while (true)
    -}
    -
    -module.exports = rimraf
    -rimraf.sync = rimrafSync
    diff --git a/deps/npm/node_modules/signal-exit/dist/cjs/index.js b/deps/npm/node_modules/signal-exit/dist/cjs/index.js
    index 2e6c18316b9a5d..27d4e4f7fc7763 100644
    --- a/deps/npm/node_modules/signal-exit/dist/cjs/index.js
    +++ b/deps/npm/node_modules/signal-exit/dist/cjs/index.js
    @@ -20,7 +20,7 @@ const processOk = (process) => !!process &&
     const kExitEmitter = Symbol.for('signal-exit emitter');
     const global = globalThis;
     const ObjectDefineProperty = Object.defineProperty.bind(Object);
    -// teeny tiny ee
    +// teeny special purpose ee
     class Emitter {
         emitted = {
             afterExit: false,
    @@ -63,12 +63,17 @@ class Emitter {
         }
         emit(ev, code, signal) {
             if (this.emitted[ev]) {
    -            return;
    +            return false;
             }
             this.emitted[ev] = true;
    +        let ret = false;
             for (const fn of this.listeners[ev]) {
    -            fn(code, signal);
    +            ret = fn(code, signal) === true || ret;
    +        }
    +        if (ev === 'exit') {
    +            ret = this.emit('afterExit', code, signal) || ret;
             }
    +        return ret;
         }
     }
     class SignalExitBase {
    @@ -122,18 +127,22 @@ class SignalExit extends SignalExitBase {
                     // exit v4 are not aware of each other, and each will attempt to let
                     // the other handle it, so neither of them do. To correct this, we
                     // detect if we're the only handler *except* for previous versions
    -                // of signal-exit.
    +                // of signal-exit, and increment by the count of listeners it has
    +                // created.
                     /* c8 ignore start */
    -                //@ts-ignore
    -                if (typeof process.__signal_exit_emitter__ === 'object')
    -                    count++;
    +                const p = process;
    +                if (typeof p.__signal_exit_emitter__ === 'object' &&
    +                    typeof p.__signal_exit_emitter__.count === 'number') {
    +                    count += p.__signal_exit_emitter__.count;
    +                }
                     /* c8 ignore stop */
                     if (listeners.length === count) {
                         this.unload();
    -                    this.#emitter.emit('exit', null, sig);
    -                    this.#emitter.emit('afterExit', null, sig);
    +                    const ret = this.#emitter.emit('exit', null, sig);
                         /* c8 ignore start */
    -                    process.kill(process.pid, sig === 'SIGHUP' ? this.#hupSig : sig);
    +                    const s = sig === 'SIGHUP' ? this.#hupSig : sig;
    +                    if (!ret)
    +                        process.kill(process.pid, s);
                         /* c8 ignore stop */
                     }
                 };
    @@ -216,7 +225,6 @@ class SignalExit extends SignalExitBase {
             this.#process.exitCode = code || 0;
             /* c8 ignore stop */
             this.#emitter.emit('exit', this.#process.exitCode, null);
    -        this.#emitter.emit('afterExit', this.#process.exitCode, null);
             return this.#originalProcessReallyExit.call(this.#process, this.#process.exitCode);
         }
         #processEmit(ev, ...args) {
    @@ -230,7 +238,6 @@ class SignalExit extends SignalExitBase {
                 const ret = og.call(this.#process, ev, ...args);
                 /* c8 ignore start */
                 this.#emitter.emit('exit', this.#process.exitCode, null);
    -            this.#emitter.emit('afterExit', this.#process.exitCode, null);
                 /* c8 ignore stop */
                 return ret;
             }
    diff --git a/deps/npm/node_modules/signal-exit/dist/mjs/index.js b/deps/npm/node_modules/signal-exit/dist/mjs/index.js
    index 1e8dea6d4930b6..9a86ee86e1bc0d 100644
    --- a/deps/npm/node_modules/signal-exit/dist/mjs/index.js
    +++ b/deps/npm/node_modules/signal-exit/dist/mjs/index.js
    @@ -16,7 +16,7 @@ const processOk = (process) => !!process &&
     const kExitEmitter = Symbol.for('signal-exit emitter');
     const global = globalThis;
     const ObjectDefineProperty = Object.defineProperty.bind(Object);
    -// teeny tiny ee
    +// teeny special purpose ee
     class Emitter {
         emitted = {
             afterExit: false,
    @@ -59,12 +59,17 @@ class Emitter {
         }
         emit(ev, code, signal) {
             if (this.emitted[ev]) {
    -            return;
    +            return false;
             }
             this.emitted[ev] = true;
    +        let ret = false;
             for (const fn of this.listeners[ev]) {
    -            fn(code, signal);
    +            ret = fn(code, signal) === true || ret;
    +        }
    +        if (ev === 'exit') {
    +            ret = this.emit('afterExit', code, signal) || ret;
             }
    +        return ret;
         }
     }
     class SignalExitBase {
    @@ -118,18 +123,22 @@ class SignalExit extends SignalExitBase {
                     // exit v4 are not aware of each other, and each will attempt to let
                     // the other handle it, so neither of them do. To correct this, we
                     // detect if we're the only handler *except* for previous versions
    -                // of signal-exit.
    +                // of signal-exit, and increment by the count of listeners it has
    +                // created.
                     /* c8 ignore start */
    -                //@ts-ignore
    -                if (typeof process.__signal_exit_emitter__ === 'object')
    -                    count++;
    +                const p = process;
    +                if (typeof p.__signal_exit_emitter__ === 'object' &&
    +                    typeof p.__signal_exit_emitter__.count === 'number') {
    +                    count += p.__signal_exit_emitter__.count;
    +                }
                     /* c8 ignore stop */
                     if (listeners.length === count) {
                         this.unload();
    -                    this.#emitter.emit('exit', null, sig);
    -                    this.#emitter.emit('afterExit', null, sig);
    +                    const ret = this.#emitter.emit('exit', null, sig);
                         /* c8 ignore start */
    -                    process.kill(process.pid, sig === 'SIGHUP' ? this.#hupSig : sig);
    +                    const s = sig === 'SIGHUP' ? this.#hupSig : sig;
    +                    if (!ret)
    +                        process.kill(process.pid, s);
                         /* c8 ignore stop */
                     }
                 };
    @@ -212,7 +221,6 @@ class SignalExit extends SignalExitBase {
             this.#process.exitCode = code || 0;
             /* c8 ignore stop */
             this.#emitter.emit('exit', this.#process.exitCode, null);
    -        this.#emitter.emit('afterExit', this.#process.exitCode, null);
             return this.#originalProcessReallyExit.call(this.#process, this.#process.exitCode);
         }
         #processEmit(ev, ...args) {
    @@ -226,7 +234,6 @@ class SignalExit extends SignalExitBase {
                 const ret = og.call(this.#process, ev, ...args);
                 /* c8 ignore start */
                 this.#emitter.emit('exit', this.#process.exitCode, null);
    -            this.#emitter.emit('afterExit', this.#process.exitCode, null);
                 /* c8 ignore stop */
                 return ret;
             }
    diff --git a/deps/npm/node_modules/signal-exit/package.json b/deps/npm/node_modules/signal-exit/package.json
    index 455452f96a0b3f..ac176cec743748 100644
    --- a/deps/npm/node_modules/signal-exit/package.json
    +++ b/deps/npm/node_modules/signal-exit/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "signal-exit",
    -  "version": "4.0.2",
    +  "version": "4.1.0",
       "description": "when you want to fire an event no matter how a process exits.",
       "main": "./dist/cjs/index.js",
       "module": "./dist/mjs/index.js",
    diff --git a/deps/npm/node_modules/socks-proxy-agent/dist/index.js b/deps/npm/node_modules/socks-proxy-agent/dist/index.js
    index 55b598b7f5ca73..102ecd64c0b9d6 100644
    --- a/deps/npm/node_modules/socks-proxy-agent/dist/index.js
    +++ b/deps/npm/node_modules/socks-proxy-agent/dist/index.js
    @@ -1,12 +1,26 @@
     "use strict";
    -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    -    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    -    return new (P || (P = Promise))(function (resolve, reject) {
    -        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
    -        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
    -        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
    -        step((generator = generator.apply(thisArg, _arguments || [])).next());
    -    });
    +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    +    if (k2 === undefined) k2 = k;
    +    var desc = Object.getOwnPropertyDescriptor(m, k);
    +    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
    +      desc = { enumerable: true, get: function() { return m[k]; } };
    +    }
    +    Object.defineProperty(o, k2, desc);
    +}) : (function(o, m, k, k2) {
    +    if (k2 === undefined) k2 = k;
    +    o[k2] = m[k];
    +}));
    +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    +    Object.defineProperty(o, "default", { enumerable: true, value: v });
    +}) : function(o, v) {
    +    o["default"] = v;
    +});
    +var __importStar = (this && this.__importStar) || function (mod) {
    +    if (mod && mod.__esModule) return mod;
    +    var result = {};
    +    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    +    __setModuleDefault(result, mod);
    +    return result;
     };
     var __importDefault = (this && this.__importDefault) || function (mod) {
         return (mod && mod.__esModule) ? mod : { "default": mod };
    @@ -16,173 +30,144 @@ exports.SocksProxyAgent = void 0;
     const socks_1 = require("socks");
     const agent_base_1 = require("agent-base");
     const debug_1 = __importDefault(require("debug"));
    -const dns_1 = __importDefault(require("dns"));
    -const tls_1 = __importDefault(require("tls"));
    +const dns = __importStar(require("dns"));
    +const net = __importStar(require("net"));
    +const tls = __importStar(require("tls"));
    +const url_1 = require("url");
     const debug = (0, debug_1.default)('socks-proxy-agent');
    -function parseSocksProxy(opts) {
    -    var _a;
    -    let port = 0;
    +function parseSocksURL(url) {
         let lookup = false;
         let type = 5;
    -    const host = opts.hostname;
    -    if (host == null) {
    -        throw new TypeError('No "host"');
    -    }
    -    if (typeof opts.port === 'number') {
    -        port = opts.port;
    -    }
    -    else if (typeof opts.port === 'string') {
    -        port = parseInt(opts.port, 10);
    -    }
    +    const host = url.hostname;
         // From RFC 1928, Section 3: https://tools.ietf.org/html/rfc1928#section-3
         // "The SOCKS service is conventionally located on TCP port 1080"
    -    if (port == null) {
    -        port = 1080;
    -    }
    +    const port = parseInt(url.port, 10) || 1080;
         // figure out if we want socks v4 or v5, based on the "protocol" used.
         // Defaults to 5.
    -    if (opts.protocol != null) {
    -        switch (opts.protocol.replace(':', '')) {
    -            case 'socks4':
    -                lookup = true;
    -            // pass through
    -            case 'socks4a':
    -                type = 4;
    -                break;
    -            case 'socks5':
    -                lookup = true;
    -            // pass through
    -            case 'socks': // no version specified, default to 5h
    -            case 'socks5h':
    -                type = 5;
    -                break;
    -            default:
    -                throw new TypeError(`A "socks" protocol must be specified! Got: ${String(opts.protocol)}`);
    -        }
    -    }
    -    if (typeof opts.type !== 'undefined') {
    -        if (opts.type === 4 || opts.type === 5) {
    -            type = opts.type;
    -        }
    -        else {
    -            throw new TypeError(`"type" must be 4 or 5, got: ${String(opts.type)}`);
    -        }
    +    switch (url.protocol.replace(':', '')) {
    +        case 'socks4':
    +            lookup = true;
    +            type = 4;
    +            break;
    +        // pass through
    +        case 'socks4a':
    +            type = 4;
    +            break;
    +        case 'socks5':
    +            lookup = true;
    +            type = 5;
    +            break;
    +        // pass through
    +        case 'socks': // no version specified, default to 5h
    +            type = 5;
    +            break;
    +        case 'socks5h':
    +            type = 5;
    +            break;
    +        default:
    +            throw new TypeError(`A "socks" protocol must be specified! Got: ${String(url.protocol)}`);
         }
         const proxy = {
             host,
             port,
    -        type
    +        type,
         };
    -    let userId = (_a = opts.userId) !== null && _a !== void 0 ? _a : opts.username;
    -    let password = opts.password;
    -    if (opts.auth != null) {
    -        const auth = opts.auth.split(':');
    -        userId = auth[0];
    -        password = auth[1];
    -    }
    -    if (userId != null) {
    +    if (url.username) {
             Object.defineProperty(proxy, 'userId', {
    -            value: userId,
    -            enumerable: false
    +            value: decodeURIComponent(url.username),
    +            enumerable: false,
             });
         }
    -    if (password != null) {
    +    if (url.password != null) {
             Object.defineProperty(proxy, 'password', {
    -            value: password,
    -            enumerable: false
    +            value: decodeURIComponent(url.password),
    +            enumerable: false,
             });
         }
         return { lookup, proxy };
     }
    -const normalizeProxyOptions = (input) => {
    -    let proxyOptions;
    -    if (typeof input === 'string') {
    -        proxyOptions = new URL(input);
    -    }
    -    else {
    -        proxyOptions = input;
    -    }
    -    if (proxyOptions == null) {
    -        throw new TypeError('a SOCKS proxy server `host` and `port` must be specified!');
    -    }
    -    return proxyOptions;
    -};
     class SocksProxyAgent extends agent_base_1.Agent {
    -    constructor(input, options) {
    -        var _a;
    -        const proxyOptions = normalizeProxyOptions(input);
    -        super(proxyOptions);
    -        const parsedProxy = parseSocksProxy(proxyOptions);
    -        this.shouldLookup = parsedProxy.lookup;
    -        this.proxy = parsedProxy.proxy;
    -        this.tlsConnectionOptions = proxyOptions.tls != null ? proxyOptions.tls : {};
    -        this.timeout = (_a = options === null || options === void 0 ? void 0 : options.timeout) !== null && _a !== void 0 ? _a : null;
    +    constructor(uri, opts) {
    +        super(opts);
    +        const url = typeof uri === 'string' ? new url_1.URL(uri) : uri;
    +        const { proxy, lookup } = parseSocksURL(url);
    +        this.shouldLookup = lookup;
    +        this.proxy = proxy;
    +        this.timeout = opts?.timeout ?? null;
         }
         /**
          * Initiates a SOCKS connection to the specified SOCKS proxy server,
          * which in turn connects to the specified remote host and port.
    -     *
    -     * @api protected
          */
    -    callback(req, opts) {
    -        var _a;
    -        return __awaiter(this, void 0, void 0, function* () {
    -            const { shouldLookup, proxy, timeout } = this;
    -            let { host, port, lookup: lookupCallback } = opts;
    -            if (host == null) {
    -                throw new Error('No `host` defined!');
    -            }
    -            if (shouldLookup) {
    -                // Client-side DNS resolution for "4" and "5" socks proxy versions.
    -                host = yield new Promise((resolve, reject) => {
    -                    // Use the request's custom lookup, if one was configured:
    -                    const lookupFn = lookupCallback !== null && lookupCallback !== void 0 ? lookupCallback : dns_1.default.lookup;
    -                    lookupFn(host, {}, (err, res) => {
    -                        if (err) {
    -                            reject(err);
    -                        }
    -                        else {
    -                            resolve(res);
    -                        }
    -                    });
    -                });
    -            }
    -            const socksOpts = {
    -                proxy,
    -                destination: { host, port },
    -                command: 'connect',
    -                timeout: timeout !== null && timeout !== void 0 ? timeout : undefined
    -            };
    -            const cleanup = (tlsSocket) => {
    -                req.destroy();
    -                socket.destroy();
    -                if (tlsSocket)
    -                    tlsSocket.destroy();
    -            };
    -            debug('Creating socks proxy connection: %o', socksOpts);
    -            const { socket } = yield socks_1.SocksClient.createConnection(socksOpts);
    -            debug('Successfully created socks proxy connection');
    -            if (timeout !== null) {
    -                socket.setTimeout(timeout);
    -                socket.on('timeout', () => cleanup());
    -            }
    -            if (opts.secureEndpoint) {
    -                // The proxy is connecting to a TLS server, so upgrade
    -                // this socket connection to a TLS connection.
    -                debug('Upgrading socket connection to TLS');
    -                const servername = (_a = opts.servername) !== null && _a !== void 0 ? _a : opts.host;
    -                const tlsSocket = tls_1.default.connect(Object.assign(Object.assign(Object.assign({}, omit(opts, 'host', 'hostname', 'path', 'port')), { socket,
    -                    servername }), this.tlsConnectionOptions));
    -                tlsSocket.once('error', (error) => {
    -                    debug('socket TLS error', error.message);
    -                    cleanup(tlsSocket);
    +    async connect(req, opts) {
    +        const { shouldLookup, proxy, timeout } = this;
    +        if (!opts.host) {
    +            throw new Error('No `host` defined!');
    +        }
    +        let { host } = opts;
    +        const { port, lookup: lookupFn = dns.lookup } = opts;
    +        if (shouldLookup) {
    +            // Client-side DNS resolution for "4" and "5" socks proxy versions.
    +            host = await new Promise((resolve, reject) => {
    +                // Use the request's custom lookup, if one was configured:
    +                lookupFn(host, {}, (err, res) => {
    +                    if (err) {
    +                        reject(err);
    +                    }
    +                    else {
    +                        resolve(res);
    +                    }
                     });
    -                return tlsSocket;
    -            }
    -            return socket;
    -        });
    +            });
    +        }
    +        const socksOpts = {
    +            proxy,
    +            destination: {
    +                host,
    +                port: typeof port === 'number' ? port : parseInt(port, 10),
    +            },
    +            command: 'connect',
    +            timeout: timeout ?? undefined,
    +        };
    +        const cleanup = (tlsSocket) => {
    +            req.destroy();
    +            socket.destroy();
    +            if (tlsSocket)
    +                tlsSocket.destroy();
    +        };
    +        debug('Creating socks proxy connection: %o', socksOpts);
    +        const { socket } = await socks_1.SocksClient.createConnection(socksOpts);
    +        debug('Successfully created socks proxy connection');
    +        if (timeout !== null) {
    +            socket.setTimeout(timeout);
    +            socket.on('timeout', () => cleanup());
    +        }
    +        if (opts.secureEndpoint) {
    +            // The proxy is connecting to a TLS server, so upgrade
    +            // this socket connection to a TLS connection.
    +            debug('Upgrading socket connection to TLS');
    +            const servername = opts.servername || opts.host;
    +            const tlsSocket = tls.connect({
    +                ...omit(opts, 'host', 'path', 'port'),
    +                socket,
    +                servername: net.isIP(servername) ? undefined : servername,
    +            });
    +            tlsSocket.once('error', (error) => {
    +                debug('Socket TLS error', error.message);
    +                cleanup(tlsSocket);
    +            });
    +            return tlsSocket;
    +        }
    +        return socket;
         }
     }
    +SocksProxyAgent.protocols = [
    +    'socks',
    +    'socks4',
    +    'socks4a',
    +    'socks5',
    +    'socks5h',
    +];
     exports.SocksProxyAgent = SocksProxyAgent;
     function omit(obj, ...keys) {
         const ret = {};
    diff --git a/deps/npm/node_modules/socks-proxy-agent/package.json b/deps/npm/node_modules/socks-proxy-agent/package.json
    index aa2999969c1743..6e1c2c12de3674 100644
    --- a/deps/npm/node_modules/socks-proxy-agent/package.json
    +++ b/deps/npm/node_modules/socks-proxy-agent/package.json
    @@ -1,9 +1,12 @@
     {
       "name": "socks-proxy-agent",
    +  "version": "8.0.2",
       "description": "A SOCKS proxy `http.Agent` implementation for HTTP and HTTPS",
    -  "homepage": "https://github.com/TooTallNate/node-socks-proxy-agent#readme",
    -  "version": "7.0.0",
    -  "main": "dist/index.js",
    +  "main": "./dist/index.js",
    +  "types": "./dist/index.d.ts",
    +  "files": [
    +    "dist"
    +  ],
       "author": {
         "email": "nathan@tootallnate.net",
         "name": "Nathan Rajlich",
    @@ -89,10 +92,8 @@
       ],
       "repository": {
         "type": "git",
    -    "url": "git://github.com/TooTallNate/node-socks-proxy-agent.git"
    -  },
    -  "bugs": {
    -    "url": "https://github.com/TooTallNate/node-socks-proxy-agent/issues"
    +    "url": "https://github.com/TooTallNate/proxy-agents.git",
    +    "directory": "packages/socks-proxy-agent"
       },
       "keywords": [
         "agent",
    @@ -106,76 +107,36 @@
         "socks5h"
       ],
       "dependencies": {
    -    "agent-base": "^6.0.2",
    -    "debug": "^4.3.3",
    -    "socks": "^2.6.2"
    +    "agent-base": "^7.0.2",
    +    "debug": "^4.3.4",
    +    "socks": "^2.7.1"
       },
       "devDependencies": {
    -    "@commitlint/cli": "latest",
    -    "@commitlint/config-conventional": "latest",
    -    "@types/debug": "latest",
    -    "@types/node": "latest",
    -    "cacheable-lookup": "latest",
    -    "conventional-github-releaser": "latest",
    -    "dns2": "latest",
    -    "finepack": "latest",
    -    "git-authors-cli": "latest",
    -    "mocha": "9",
    -    "nano-staged": "latest",
    -    "npm-check-updates": "latest",
    -    "prettier-standard": "latest",
    -    "raw-body": "latest",
    -    "rimraf": "latest",
    -    "simple-git-hooks": "latest",
    +    "@types/async-retry": "^1.4.5",
    +    "@types/debug": "^4.1.7",
    +    "@types/dns2": "^2.0.3",
    +    "@types/jest": "^29.5.1",
    +    "@types/node": "^14.18.45",
    +    "async-listen": "^3.0.0",
    +    "async-retry": "^1.3.3",
    +    "cacheable-lookup": "^6.1.0",
    +    "dns2": "^2.1.0",
    +    "jest": "^29.5.0",
         "socksv5": "github:TooTallNate/socksv5#fix/dstSock-close-event",
    -    "standard": "latest",
    -    "standard-markdown": "latest",
    -    "standard-version": "latest",
    -    "ts-standard": "latest",
    -    "typescript": "latest"
    +    "ts-jest": "^29.1.0",
    +    "typescript": "^5.0.4",
    +    "proxy": "2.1.1",
    +    "tsconfig": "0.0.0"
       },
       "engines": {
    -    "node": ">= 10"
    +    "node": ">= 14"
       },
    -  "files": [
    -    "dist"
    -  ],
    +  "license": "MIT",
       "scripts": {
         "build": "tsc",
    -    "clean": "rimraf node_modules",
    -    "contributors": "(git-authors-cli && finepack && git add package.json && git commit -m 'build: contributors' --no-verify) || true",
    -    "lint": "ts-standard",
    -    "postrelease": "npm run release:tags && npm run release:github && (ci-publish || npm publish --access=public)",
    -    "prebuild": "rimraf dist",
    -    "prepublishOnly": "npm run build",
    -    "prerelease": "npm run update:check && npm run contributors",
    -    "release": "standard-version -a",
    -    "release:github": "conventional-github-releaser -p angular",
    -    "release:tags": "git push --follow-tags origin HEAD:master",
    -    "test": "mocha --reporter spec",
    -    "update": "ncu -u",
    -    "update:check": "ncu -- --error-level 2"
    -  },
    -  "license": "MIT",
    -  "commitlint": {
    -    "extends": [
    -      "@commitlint/config-conventional"
    -    ]
    -  },
    -  "nano-staged": {
    -    "*.js": [
    -      "prettier-standard"
    -    ],
    -    "*.md": [
    -      "standard-markdown"
    -    ],
    -    "package.json": [
    -      "finepack"
    -    ]
    -  },
    -  "simple-git-hooks": {
    -    "commit-msg": "npx commitlint --edit",
    -    "pre-commit": "npx nano-staged"
    -  },
    -  "typings": "dist/index.d.ts"
    -}
    +    "test": "jest --env node --verbose --bail test/test.ts",
    +    "test-e2e": "jest --env node --verbose --bail test/e2e.test.ts",
    +    "lint": "eslint . --ext .ts",
    +    "pack": "node ../../scripts/pack.mjs"
    +  }
    +}
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/spdx-license-ids/deprecated.json b/deps/npm/node_modules/spdx-license-ids/deprecated.json
    index 278531e40c613d..a877dc3efd8bd2 100644
    --- a/deps/npm/node_modules/spdx-license-ids/deprecated.json
    +++ b/deps/npm/node_modules/spdx-license-ids/deprecated.json
    @@ -7,18 +7,24 @@
     	"GFDL-1.2",
     	"GFDL-1.3",
     	"GPL-1.0",
    +	"GPL-1.0+",
     	"GPL-2.0",
    +	"GPL-2.0+",
     	"GPL-2.0-with-GCC-exception",
     	"GPL-2.0-with-autoconf-exception",
     	"GPL-2.0-with-bison-exception",
     	"GPL-2.0-with-classpath-exception",
     	"GPL-2.0-with-font-exception",
     	"GPL-3.0",
    +	"GPL-3.0+",
     	"GPL-3.0-with-GCC-exception",
     	"GPL-3.0-with-autoconf-exception",
     	"LGPL-2.0",
    +	"LGPL-2.0+",
     	"LGPL-2.1",
    +	"LGPL-2.1+",
     	"LGPL-3.0",
    +	"LGPL-3.0+",
     	"Nunit",
     	"StandardML-NJ",
     	"bzip2-1.0.5",
    diff --git a/deps/npm/node_modules/spdx-license-ids/index.json b/deps/npm/node_modules/spdx-license-ids/index.json
    index 04c03126d98eb8..a7b98b24b6273e 100644
    --- a/deps/npm/node_modules/spdx-license-ids/index.json
    +++ b/deps/npm/node_modules/spdx-license-ids/index.json
    @@ -22,10 +22,13 @@
     	"APSL-1.1",
     	"APSL-1.2",
     	"APSL-2.0",
    +	"ASWF-Digital-Assets-1.0",
    +	"ASWF-Digital-Assets-1.1",
     	"Abstyles",
     	"AdaCore-doc",
     	"Adobe-2006",
     	"Adobe-Glyph",
    +	"Adobe-Utopia",
     	"Afmparse",
     	"Aladdin",
     	"Apache-1.0",
    @@ -44,6 +47,7 @@
     	"BSD-3-Clause",
     	"BSD-3-Clause-Attribution",
     	"BSD-3-Clause-Clear",
    +	"BSD-3-Clause-HP",
     	"BSD-3-Clause-LBNL",
     	"BSD-3-Clause-Modification",
     	"BSD-3-Clause-No-Military-License",
    @@ -51,6 +55,8 @@
     	"BSD-3-Clause-No-Nuclear-License-2014",
     	"BSD-3-Clause-No-Nuclear-Warranty",
     	"BSD-3-Clause-Open-MPI",
    +	"BSD-3-Clause-Sun",
    +	"BSD-3-Clause-flex",
     	"BSD-4-Clause",
     	"BSD-4-Clause-Shortened",
     	"BSD-4-Clause-UC",
    @@ -58,8 +64,10 @@
     	"BSD-4.3TAHOE",
     	"BSD-Advertising-Acknowledgement",
     	"BSD-Attribution-HPND-disclaimer",
    +	"BSD-Inferno-Nettverk",
     	"BSD-Protection",
     	"BSD-Source-Code",
    +	"BSD-Systemics",
     	"BSL-1.0",
     	"BUSL-1.1",
     	"Baekmuk",
    @@ -71,6 +79,7 @@
     	"Bitstream-Charter",
     	"Bitstream-Vera",
     	"BlueOak-1.0.0",
    +	"Boehm-GC",
     	"Borceux",
     	"Brian-Gladman-3-Clause",
     	"C-UDA-1.0",
    @@ -125,6 +134,7 @@
     	"CC-BY-SA-3.0",
     	"CC-BY-SA-3.0-AT",
     	"CC-BY-SA-3.0-DE",
    +	"CC-BY-SA-3.0-IGO",
     	"CC-BY-SA-4.0",
     	"CC-PDDC",
     	"CC0-1.0",
    @@ -161,11 +171,13 @@
     	"Community-Spec-1.0",
     	"Condor-1.1",
     	"Cornell-Lossless-JPEG",
    +	"Cronyx",
     	"Crossword",
     	"CrystalStacker",
     	"Cube",
     	"D-FSL-1.0",
     	"DL-DE-BY-2.0",
    +	"DL-DE-ZERO-2.0",
     	"DOC",
     	"DRL-1.0",
     	"DSDP",
    @@ -185,6 +197,7 @@
     	"Entessa",
     	"ErlPL-1.1",
     	"Eurosym",
    +	"FBM",
     	"FDK-AAC",
     	"FSFAP",
     	"FSFUL",
    @@ -192,9 +205,11 @@
     	"FSFULLRWD",
     	"FTL",
     	"Fair",
    +	"Ferguson-Twofish",
     	"Frameworx-1.0",
     	"FreeBSD-DOC",
     	"FreeImage",
    +	"Furuseth",
     	"GD",
     	"GFDL-1.1-invariants-only",
     	"GFDL-1.1-invariants-or-later",
    @@ -227,9 +242,17 @@
     	"Glulxe",
     	"Graphics-Gems",
     	"HP-1986",
    +	"HP-1989",
     	"HPND",
    +	"HPND-DEC",
     	"HPND-Markus-Kuhn",
    +	"HPND-Pbmplus",
    +	"HPND-UC",
    +	"HPND-doc",
    +	"HPND-doc-sell",
     	"HPND-export-US",
    +	"HPND-export-US-modify",
    +	"HPND-sell-regexpr",
     	"HPND-sell-variant",
     	"HPND-sell-variant-MIT-disclaimer",
     	"HTMLTIDY",
    @@ -246,6 +269,7 @@
     	"ImageMagick",
     	"Imlib2",
     	"Info-ZIP",
    +	"Inner-Net-2.0",
     	"Intel",
     	"Intel-ACPI",
     	"Interbase-1.0",
    @@ -254,6 +278,7 @@
     	"JSON",
     	"Jam",
     	"JasPer-2.0",
    +	"Kastrup",
     	"Kazlib",
     	"Knuth-CTAN",
     	"LAL-1.2",
    @@ -276,23 +301,32 @@
     	"LZMA-SDK-9.11-to-9.20",
     	"LZMA-SDK-9.22",
     	"Latex2e",
    +	"Latex2e-translated-notice",
     	"Leptonica",
     	"LiLiQ-P-1.1",
     	"LiLiQ-R-1.1",
     	"LiLiQ-Rplus-1.1",
     	"Libpng",
     	"Linux-OpenIB",
    +	"Linux-man-pages-1-para",
     	"Linux-man-pages-copyleft",
    +	"Linux-man-pages-copyleft-2-para",
    +	"Linux-man-pages-copyleft-var",
    +	"Lucida-Bitmap-Fonts",
     	"MIT",
     	"MIT-0",
     	"MIT-CMU",
    +	"MIT-Festival",
     	"MIT-Modern-Variant",
     	"MIT-Wu",
     	"MIT-advertising",
     	"MIT-enna",
     	"MIT-feh",
     	"MIT-open-group",
    +	"MIT-testregex",
     	"MITNFA",
    +	"MMIXware",
    +	"MPEG-SSG",
     	"MPL-1.0",
     	"MPL-1.1",
     	"MPL-2.0",
    @@ -303,6 +337,7 @@
     	"MTLL",
     	"MakeIndex",
     	"Martin-Birgmeier",
    +	"McPhee-slideshow",
     	"Minpack",
     	"MirOS",
     	"Motosoto",
    @@ -319,6 +354,7 @@
     	"NICTA-1.0",
     	"NIST-PD",
     	"NIST-PD-fallback",
    +	"NIST-Software",
     	"NLOD-1.0",
     	"NLOD-2.0",
     	"NLPL",
    @@ -370,8 +406,10 @@
     	"OLDAP-2.6",
     	"OLDAP-2.7",
     	"OLDAP-2.8",
    +	"OLFL-1.3",
     	"OML",
     	"OPL-1.0",
    +	"OPL-UK-3.0",
     	"OPUBL-1.0",
     	"OSET-PL-2.1",
     	"OSL-1.0",
    @@ -381,6 +419,7 @@
     	"OSL-3.0",
     	"OpenPBS-2.3",
     	"OpenSSL",
    +	"PADL",
     	"PDDL-1.0",
     	"PHP-3.0",
     	"PHP-3.01",
    @@ -409,10 +448,13 @@
     	"SGI-B-1.0",
     	"SGI-B-1.1",
     	"SGI-B-2.0",
    +	"SGI-OpenGL",
    +	"SGP4",
     	"SHL-0.5",
     	"SHL-0.51",
     	"SISSL",
     	"SISSL-1.2",
    +	"SL",
     	"SMLNJ",
     	"SMPPL",
     	"SNIA",
    @@ -427,6 +469,7 @@
     	"Sendmail-8.23",
     	"SimPL-2.0",
     	"Sleepycat",
    +	"Soundex",
     	"Spencer-86",
     	"Spencer-94",
     	"Spencer-99",
    @@ -442,14 +485,18 @@
     	"TPDL",
     	"TPL-1.0",
     	"TTWL",
    +	"TTYP0",
     	"TU-Berlin-1.0",
     	"TU-Berlin-2.0",
    +	"TermReadKey",
     	"UCAR",
     	"UCL-1.0",
     	"UPL-1.0",
    +	"URT-RLE",
     	"Unicode-DFS-2015",
     	"Unicode-DFS-2016",
     	"Unicode-TOU",
    +	"UnixCrypt",
     	"Unlicense",
     	"VOSTROM",
     	"VSL-1.0",
    @@ -459,12 +506,15 @@
     	"W3C-20150513",
     	"WTFPL",
     	"Watcom-1.0",
    +	"Widget-Workshop",
     	"Wsuipa",
     	"X11",
     	"X11-distribute-modifications-variant",
     	"XFree86-1.1",
     	"XSkat",
    +	"Xdebug-1.03",
     	"Xerox",
    +	"Xfig",
     	"Xnet",
     	"YPL-1.0",
     	"YPL-1.1",
    @@ -472,20 +522,24 @@
     	"ZPL-2.0",
     	"ZPL-2.1",
     	"Zed",
    +	"Zeeff",
     	"Zend-2.0",
     	"Zimbra-1.3",
     	"Zimbra-1.4",
     	"Zlib",
     	"blessing",
     	"bzip2-1.0.6",
    +	"check-cvs",
     	"checkmk",
     	"copyleft-next-0.3.0",
     	"copyleft-next-0.3.1",
     	"curl",
     	"diffmark",
    +	"dtoa",
     	"dvipdfm",
     	"eGenix",
     	"etalab-2.0",
    +	"fwlw",
     	"gSOAP-1.3b",
     	"gnuplot",
     	"iMatix",
    @@ -493,12 +547,20 @@
     	"libselinux-1.0",
     	"libtiff",
     	"libutil-David-Nugent",
    +	"lsof",
    +	"magaz",
    +	"metamail",
     	"mpi-permissive",
     	"mpich2",
     	"mplus",
    +	"pnmstitch",
     	"psfrag",
     	"psutils",
    +	"python-ldap",
     	"snprintf",
    +	"ssh-keyscan",
    +	"swrule",
    +	"ulem",
     	"w3m",
     	"xinetd",
     	"xlock",
    diff --git a/deps/npm/node_modules/spdx-license-ids/package.json b/deps/npm/node_modules/spdx-license-ids/package.json
    index ea060776d9cf76..196b02705769a9 100644
    --- a/deps/npm/node_modules/spdx-license-ids/package.json
    +++ b/deps/npm/node_modules/spdx-license-ids/package.json
    @@ -1,6 +1,6 @@
     {
     	"name": "spdx-license-ids",
    -	"version": "3.0.13",
    +	"version": "3.0.16",
     	"description": "A list of SPDX license identifiers",
     	"repository": "jslicense/spdx-license-ids",
     	"author": "Shinnosuke Watanabe (https://github.com/shinnn)",
    @@ -28,10 +28,10 @@
     	],
     	"devDependencies": {
     		"@shinnn/eslint-config": "^7.0.0",
    -		"eslint": "^8.2.0",
    +		"eslint": "^8.49.0",
     		"eslint-formatter-codeframe": "^7.32.1",
     		"rmfr": "^2.0.0",
    -		"tape": "^5.3.1"
    +		"tape": "^5.6.6"
     	},
     	"eslintConfig": {
     		"extends": "@shinnn"
    diff --git a/deps/npm/node_modules/string-width-cjs/node_modules/ansi-regex/index.js b/deps/npm/node_modules/string-width-cjs/node_modules/ansi-regex/index.js
    new file mode 100644
    index 00000000000000..616ff837d3ff01
    --- /dev/null
    +++ b/deps/npm/node_modules/string-width-cjs/node_modules/ansi-regex/index.js
    @@ -0,0 +1,10 @@
    +'use strict';
    +
    +module.exports = ({onlyFirst = false} = {}) => {
    +	const pattern = [
    +		'[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
    +		'(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'
    +	].join('|');
    +
    +	return new RegExp(pattern, onlyFirst ? undefined : 'g');
    +};
    diff --git a/deps/npm/node_modules/string-width-cjs/node_modules/ansi-regex/license b/deps/npm/node_modules/string-width-cjs/node_modules/ansi-regex/license
    new file mode 100644
    index 00000000000000..e7af2f77107d73
    --- /dev/null
    +++ b/deps/npm/node_modules/string-width-cjs/node_modules/ansi-regex/license
    @@ -0,0 +1,9 @@
    +MIT License
    +
    +Copyright (c) Sindre Sorhus  (sindresorhus.com)
    +
    +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
    +
    +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
    +
    +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    diff --git a/deps/npm/node_modules/string-width-cjs/node_modules/ansi-regex/package.json b/deps/npm/node_modules/string-width-cjs/node_modules/ansi-regex/package.json
    new file mode 100644
    index 00000000000000..017f53116a9e28
    --- /dev/null
    +++ b/deps/npm/node_modules/string-width-cjs/node_modules/ansi-regex/package.json
    @@ -0,0 +1,55 @@
    +{
    +	"name": "ansi-regex",
    +	"version": "5.0.1",
    +	"description": "Regular expression for matching ANSI escape codes",
    +	"license": "MIT",
    +	"repository": "chalk/ansi-regex",
    +	"author": {
    +		"name": "Sindre Sorhus",
    +		"email": "sindresorhus@gmail.com",
    +		"url": "sindresorhus.com"
    +	},
    +	"engines": {
    +		"node": ">=8"
    +	},
    +	"scripts": {
    +		"test": "xo && ava && tsd",
    +		"view-supported": "node fixtures/view-codes.js"
    +	},
    +	"files": [
    +		"index.js",
    +		"index.d.ts"
    +	],
    +	"keywords": [
    +		"ansi",
    +		"styles",
    +		"color",
    +		"colour",
    +		"colors",
    +		"terminal",
    +		"console",
    +		"cli",
    +		"string",
    +		"tty",
    +		"escape",
    +		"formatting",
    +		"rgb",
    +		"256",
    +		"shell",
    +		"xterm",
    +		"command-line",
    +		"text",
    +		"regex",
    +		"regexp",
    +		"re",
    +		"match",
    +		"test",
    +		"find",
    +		"pattern"
    +	],
    +	"devDependencies": {
    +		"ava": "^2.4.0",
    +		"tsd": "^0.9.0",
    +		"xo": "^0.25.3"
    +	}
    +}
    diff --git a/deps/npm/node_modules/string-width-cjs/node_modules/strip-ansi/index.js b/deps/npm/node_modules/string-width-cjs/node_modules/strip-ansi/index.js
    new file mode 100644
    index 00000000000000..9a593dfcd1fd5c
    --- /dev/null
    +++ b/deps/npm/node_modules/string-width-cjs/node_modules/strip-ansi/index.js
    @@ -0,0 +1,4 @@
    +'use strict';
    +const ansiRegex = require('ansi-regex');
    +
    +module.exports = string => typeof string === 'string' ? string.replace(ansiRegex(), '') : string;
    diff --git a/deps/npm/node_modules/string-width-cjs/node_modules/strip-ansi/license b/deps/npm/node_modules/string-width-cjs/node_modules/strip-ansi/license
    new file mode 100644
    index 00000000000000..e7af2f77107d73
    --- /dev/null
    +++ b/deps/npm/node_modules/string-width-cjs/node_modules/strip-ansi/license
    @@ -0,0 +1,9 @@
    +MIT License
    +
    +Copyright (c) Sindre Sorhus  (sindresorhus.com)
    +
    +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
    +
    +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
    +
    +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    diff --git a/deps/npm/node_modules/string-width-cjs/node_modules/strip-ansi/package.json b/deps/npm/node_modules/string-width-cjs/node_modules/strip-ansi/package.json
    new file mode 100644
    index 00000000000000..1a41108d42831c
    --- /dev/null
    +++ b/deps/npm/node_modules/string-width-cjs/node_modules/strip-ansi/package.json
    @@ -0,0 +1,54 @@
    +{
    +	"name": "strip-ansi",
    +	"version": "6.0.1",
    +	"description": "Strip ANSI escape codes from a string",
    +	"license": "MIT",
    +	"repository": "chalk/strip-ansi",
    +	"author": {
    +		"name": "Sindre Sorhus",
    +		"email": "sindresorhus@gmail.com",
    +		"url": "sindresorhus.com"
    +	},
    +	"engines": {
    +		"node": ">=8"
    +	},
    +	"scripts": {
    +		"test": "xo && ava && tsd"
    +	},
    +	"files": [
    +		"index.js",
    +		"index.d.ts"
    +	],
    +	"keywords": [
    +		"strip",
    +		"trim",
    +		"remove",
    +		"ansi",
    +		"styles",
    +		"color",
    +		"colour",
    +		"colors",
    +		"terminal",
    +		"console",
    +		"string",
    +		"tty",
    +		"escape",
    +		"formatting",
    +		"rgb",
    +		"256",
    +		"shell",
    +		"xterm",
    +		"log",
    +		"logging",
    +		"command-line",
    +		"text"
    +	],
    +	"dependencies": {
    +		"ansi-regex": "^5.0.1"
    +	},
    +	"devDependencies": {
    +		"ava": "^2.4.0",
    +		"tsd": "^0.10.0",
    +		"xo": "^0.25.3"
    +	}
    +}
    diff --git a/deps/npm/node_modules/string-width/node_modules/ansi-regex/index.js b/deps/npm/node_modules/string-width/node_modules/ansi-regex/index.js
    new file mode 100644
    index 00000000000000..616ff837d3ff01
    --- /dev/null
    +++ b/deps/npm/node_modules/string-width/node_modules/ansi-regex/index.js
    @@ -0,0 +1,10 @@
    +'use strict';
    +
    +module.exports = ({onlyFirst = false} = {}) => {
    +	const pattern = [
    +		'[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
    +		'(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'
    +	].join('|');
    +
    +	return new RegExp(pattern, onlyFirst ? undefined : 'g');
    +};
    diff --git a/deps/npm/node_modules/string-width/node_modules/ansi-regex/license b/deps/npm/node_modules/string-width/node_modules/ansi-regex/license
    new file mode 100644
    index 00000000000000..e7af2f77107d73
    --- /dev/null
    +++ b/deps/npm/node_modules/string-width/node_modules/ansi-regex/license
    @@ -0,0 +1,9 @@
    +MIT License
    +
    +Copyright (c) Sindre Sorhus  (sindresorhus.com)
    +
    +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
    +
    +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
    +
    +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    diff --git a/deps/npm/node_modules/string-width/node_modules/ansi-regex/package.json b/deps/npm/node_modules/string-width/node_modules/ansi-regex/package.json
    new file mode 100644
    index 00000000000000..017f53116a9e28
    --- /dev/null
    +++ b/deps/npm/node_modules/string-width/node_modules/ansi-regex/package.json
    @@ -0,0 +1,55 @@
    +{
    +	"name": "ansi-regex",
    +	"version": "5.0.1",
    +	"description": "Regular expression for matching ANSI escape codes",
    +	"license": "MIT",
    +	"repository": "chalk/ansi-regex",
    +	"author": {
    +		"name": "Sindre Sorhus",
    +		"email": "sindresorhus@gmail.com",
    +		"url": "sindresorhus.com"
    +	},
    +	"engines": {
    +		"node": ">=8"
    +	},
    +	"scripts": {
    +		"test": "xo && ava && tsd",
    +		"view-supported": "node fixtures/view-codes.js"
    +	},
    +	"files": [
    +		"index.js",
    +		"index.d.ts"
    +	],
    +	"keywords": [
    +		"ansi",
    +		"styles",
    +		"color",
    +		"colour",
    +		"colors",
    +		"terminal",
    +		"console",
    +		"cli",
    +		"string",
    +		"tty",
    +		"escape",
    +		"formatting",
    +		"rgb",
    +		"256",
    +		"shell",
    +		"xterm",
    +		"command-line",
    +		"text",
    +		"regex",
    +		"regexp",
    +		"re",
    +		"match",
    +		"test",
    +		"find",
    +		"pattern"
    +	],
    +	"devDependencies": {
    +		"ava": "^2.4.0",
    +		"tsd": "^0.9.0",
    +		"xo": "^0.25.3"
    +	}
    +}
    diff --git a/deps/npm/node_modules/string-width/node_modules/strip-ansi/index.js b/deps/npm/node_modules/string-width/node_modules/strip-ansi/index.js
    new file mode 100644
    index 00000000000000..9a593dfcd1fd5c
    --- /dev/null
    +++ b/deps/npm/node_modules/string-width/node_modules/strip-ansi/index.js
    @@ -0,0 +1,4 @@
    +'use strict';
    +const ansiRegex = require('ansi-regex');
    +
    +module.exports = string => typeof string === 'string' ? string.replace(ansiRegex(), '') : string;
    diff --git a/deps/npm/node_modules/string-width/node_modules/strip-ansi/license b/deps/npm/node_modules/string-width/node_modules/strip-ansi/license
    new file mode 100644
    index 00000000000000..e7af2f77107d73
    --- /dev/null
    +++ b/deps/npm/node_modules/string-width/node_modules/strip-ansi/license
    @@ -0,0 +1,9 @@
    +MIT License
    +
    +Copyright (c) Sindre Sorhus  (sindresorhus.com)
    +
    +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
    +
    +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
    +
    +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    diff --git a/deps/npm/node_modules/string-width/node_modules/strip-ansi/package.json b/deps/npm/node_modules/string-width/node_modules/strip-ansi/package.json
    new file mode 100644
    index 00000000000000..1a41108d42831c
    --- /dev/null
    +++ b/deps/npm/node_modules/string-width/node_modules/strip-ansi/package.json
    @@ -0,0 +1,54 @@
    +{
    +	"name": "strip-ansi",
    +	"version": "6.0.1",
    +	"description": "Strip ANSI escape codes from a string",
    +	"license": "MIT",
    +	"repository": "chalk/strip-ansi",
    +	"author": {
    +		"name": "Sindre Sorhus",
    +		"email": "sindresorhus@gmail.com",
    +		"url": "sindresorhus.com"
    +	},
    +	"engines": {
    +		"node": ">=8"
    +	},
    +	"scripts": {
    +		"test": "xo && ava && tsd"
    +	},
    +	"files": [
    +		"index.js",
    +		"index.d.ts"
    +	],
    +	"keywords": [
    +		"strip",
    +		"trim",
    +		"remove",
    +		"ansi",
    +		"styles",
    +		"color",
    +		"colour",
    +		"colors",
    +		"terminal",
    +		"console",
    +		"string",
    +		"tty",
    +		"escape",
    +		"formatting",
    +		"rgb",
    +		"256",
    +		"shell",
    +		"xterm",
    +		"log",
    +		"logging",
    +		"command-line",
    +		"text"
    +	],
    +	"dependencies": {
    +		"ansi-regex": "^5.0.1"
    +	},
    +	"devDependencies": {
    +		"ava": "^2.4.0",
    +		"tsd": "^0.10.0",
    +		"xo": "^0.25.3"
    +	}
    +}
    diff --git a/deps/npm/node_modules/strip-ansi-cjs/node_modules/ansi-regex/index.js b/deps/npm/node_modules/strip-ansi-cjs/node_modules/ansi-regex/index.js
    new file mode 100644
    index 00000000000000..616ff837d3ff01
    --- /dev/null
    +++ b/deps/npm/node_modules/strip-ansi-cjs/node_modules/ansi-regex/index.js
    @@ -0,0 +1,10 @@
    +'use strict';
    +
    +module.exports = ({onlyFirst = false} = {}) => {
    +	const pattern = [
    +		'[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
    +		'(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'
    +	].join('|');
    +
    +	return new RegExp(pattern, onlyFirst ? undefined : 'g');
    +};
    diff --git a/deps/npm/node_modules/strip-ansi-cjs/node_modules/ansi-regex/license b/deps/npm/node_modules/strip-ansi-cjs/node_modules/ansi-regex/license
    new file mode 100644
    index 00000000000000..e7af2f77107d73
    --- /dev/null
    +++ b/deps/npm/node_modules/strip-ansi-cjs/node_modules/ansi-regex/license
    @@ -0,0 +1,9 @@
    +MIT License
    +
    +Copyright (c) Sindre Sorhus  (sindresorhus.com)
    +
    +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
    +
    +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
    +
    +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    diff --git a/deps/npm/node_modules/strip-ansi-cjs/node_modules/ansi-regex/package.json b/deps/npm/node_modules/strip-ansi-cjs/node_modules/ansi-regex/package.json
    new file mode 100644
    index 00000000000000..017f53116a9e28
    --- /dev/null
    +++ b/deps/npm/node_modules/strip-ansi-cjs/node_modules/ansi-regex/package.json
    @@ -0,0 +1,55 @@
    +{
    +	"name": "ansi-regex",
    +	"version": "5.0.1",
    +	"description": "Regular expression for matching ANSI escape codes",
    +	"license": "MIT",
    +	"repository": "chalk/ansi-regex",
    +	"author": {
    +		"name": "Sindre Sorhus",
    +		"email": "sindresorhus@gmail.com",
    +		"url": "sindresorhus.com"
    +	},
    +	"engines": {
    +		"node": ">=8"
    +	},
    +	"scripts": {
    +		"test": "xo && ava && tsd",
    +		"view-supported": "node fixtures/view-codes.js"
    +	},
    +	"files": [
    +		"index.js",
    +		"index.d.ts"
    +	],
    +	"keywords": [
    +		"ansi",
    +		"styles",
    +		"color",
    +		"colour",
    +		"colors",
    +		"terminal",
    +		"console",
    +		"cli",
    +		"string",
    +		"tty",
    +		"escape",
    +		"formatting",
    +		"rgb",
    +		"256",
    +		"shell",
    +		"xterm",
    +		"command-line",
    +		"text",
    +		"regex",
    +		"regexp",
    +		"re",
    +		"match",
    +		"test",
    +		"find",
    +		"pattern"
    +	],
    +	"devDependencies": {
    +		"ava": "^2.4.0",
    +		"tsd": "^0.9.0",
    +		"xo": "^0.25.3"
    +	}
    +}
    diff --git a/deps/npm/node_modules/strip-ansi/index.js b/deps/npm/node_modules/strip-ansi/index.js
    index 9a593dfcd1fd5c..ba19750e64e061 100644
    --- a/deps/npm/node_modules/strip-ansi/index.js
    +++ b/deps/npm/node_modules/strip-ansi/index.js
    @@ -1,4 +1,14 @@
    -'use strict';
    -const ansiRegex = require('ansi-regex');
    +import ansiRegex from 'ansi-regex';
     
    -module.exports = string => typeof string === 'string' ? string.replace(ansiRegex(), '') : string;
    +const regex = ansiRegex();
    +
    +export default function stripAnsi(string) {
    +	if (typeof string !== 'string') {
    +		throw new TypeError(`Expected a \`string\`, got \`${typeof string}\``);
    +	}
    +
    +	// Even though the regex is global, we don't need to reset the `.lastIndex`
    +	// because unlike `.exec()` and `.test()`, `.replace()` does it automatically
    +	// and doing it manually has a performance penalty.
    +	return string.replace(regex, '');
    +}
    diff --git a/deps/npm/node_modules/strip-ansi/license b/deps/npm/node_modules/strip-ansi/license
    index e7af2f77107d73..fa7ceba3eb4a96 100644
    --- a/deps/npm/node_modules/strip-ansi/license
    +++ b/deps/npm/node_modules/strip-ansi/license
    @@ -1,6 +1,6 @@
     MIT License
     
    -Copyright (c) Sindre Sorhus  (sindresorhus.com)
    +Copyright (c) Sindre Sorhus  (https://sindresorhus.com)
     
     Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
     
    diff --git a/deps/npm/node_modules/strip-ansi/package.json b/deps/npm/node_modules/strip-ansi/package.json
    index 1a41108d42831c..e1f455c325b007 100644
    --- a/deps/npm/node_modules/strip-ansi/package.json
    +++ b/deps/npm/node_modules/strip-ansi/package.json
    @@ -1,16 +1,19 @@
     {
     	"name": "strip-ansi",
    -	"version": "6.0.1",
    +	"version": "7.1.0",
     	"description": "Strip ANSI escape codes from a string",
     	"license": "MIT",
     	"repository": "chalk/strip-ansi",
    +	"funding": "https://github.com/chalk/strip-ansi?sponsor=1",
     	"author": {
     		"name": "Sindre Sorhus",
     		"email": "sindresorhus@gmail.com",
    -		"url": "sindresorhus.com"
    +		"url": "https://sindresorhus.com"
     	},
    +	"type": "module",
    +	"exports": "./index.js",
     	"engines": {
    -		"node": ">=8"
    +		"node": ">=12"
     	},
     	"scripts": {
     		"test": "xo && ava && tsd"
    @@ -44,11 +47,11 @@
     		"text"
     	],
     	"dependencies": {
    -		"ansi-regex": "^5.0.1"
    +		"ansi-regex": "^6.0.1"
     	},
     	"devDependencies": {
    -		"ava": "^2.4.0",
    -		"tsd": "^0.10.0",
    -		"xo": "^0.25.3"
    +		"ava": "^3.15.0",
    +		"tsd": "^0.17.0",
    +		"xo": "^0.44.0"
     	}
     }
    diff --git a/deps/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-regex/index.js b/deps/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-regex/index.js
    new file mode 100644
    index 00000000000000..616ff837d3ff01
    --- /dev/null
    +++ b/deps/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-regex/index.js
    @@ -0,0 +1,10 @@
    +'use strict';
    +
    +module.exports = ({onlyFirst = false} = {}) => {
    +	const pattern = [
    +		'[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
    +		'(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'
    +	].join('|');
    +
    +	return new RegExp(pattern, onlyFirst ? undefined : 'g');
    +};
    diff --git a/deps/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-regex/license b/deps/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-regex/license
    new file mode 100644
    index 00000000000000..e7af2f77107d73
    --- /dev/null
    +++ b/deps/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-regex/license
    @@ -0,0 +1,9 @@
    +MIT License
    +
    +Copyright (c) Sindre Sorhus  (sindresorhus.com)
    +
    +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
    +
    +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
    +
    +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    diff --git a/deps/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-regex/package.json b/deps/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-regex/package.json
    new file mode 100644
    index 00000000000000..017f53116a9e28
    --- /dev/null
    +++ b/deps/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-regex/package.json
    @@ -0,0 +1,55 @@
    +{
    +	"name": "ansi-regex",
    +	"version": "5.0.1",
    +	"description": "Regular expression for matching ANSI escape codes",
    +	"license": "MIT",
    +	"repository": "chalk/ansi-regex",
    +	"author": {
    +		"name": "Sindre Sorhus",
    +		"email": "sindresorhus@gmail.com",
    +		"url": "sindresorhus.com"
    +	},
    +	"engines": {
    +		"node": ">=8"
    +	},
    +	"scripts": {
    +		"test": "xo && ava && tsd",
    +		"view-supported": "node fixtures/view-codes.js"
    +	},
    +	"files": [
    +		"index.js",
    +		"index.d.ts"
    +	],
    +	"keywords": [
    +		"ansi",
    +		"styles",
    +		"color",
    +		"colour",
    +		"colors",
    +		"terminal",
    +		"console",
    +		"cli",
    +		"string",
    +		"tty",
    +		"escape",
    +		"formatting",
    +		"rgb",
    +		"256",
    +		"shell",
    +		"xterm",
    +		"command-line",
    +		"text",
    +		"regex",
    +		"regexp",
    +		"re",
    +		"match",
    +		"test",
    +		"find",
    +		"pattern"
    +	],
    +	"devDependencies": {
    +		"ava": "^2.4.0",
    +		"tsd": "^0.9.0",
    +		"xo": "^0.25.3"
    +	}
    +}
    diff --git a/deps/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles/index.js b/deps/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles/index.js
    new file mode 100644
    index 00000000000000..5d82581a13f990
    --- /dev/null
    +++ b/deps/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles/index.js
    @@ -0,0 +1,163 @@
    +'use strict';
    +
    +const wrapAnsi16 = (fn, offset) => (...args) => {
    +	const code = fn(...args);
    +	return `\u001B[${code + offset}m`;
    +};
    +
    +const wrapAnsi256 = (fn, offset) => (...args) => {
    +	const code = fn(...args);
    +	return `\u001B[${38 + offset};5;${code}m`;
    +};
    +
    +const wrapAnsi16m = (fn, offset) => (...args) => {
    +	const rgb = fn(...args);
    +	return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`;
    +};
    +
    +const ansi2ansi = n => n;
    +const rgb2rgb = (r, g, b) => [r, g, b];
    +
    +const setLazyProperty = (object, property, get) => {
    +	Object.defineProperty(object, property, {
    +		get: () => {
    +			const value = get();
    +
    +			Object.defineProperty(object, property, {
    +				value,
    +				enumerable: true,
    +				configurable: true
    +			});
    +
    +			return value;
    +		},
    +		enumerable: true,
    +		configurable: true
    +	});
    +};
    +
    +/** @type {typeof import('color-convert')} */
    +let colorConvert;
    +const makeDynamicStyles = (wrap, targetSpace, identity, isBackground) => {
    +	if (colorConvert === undefined) {
    +		colorConvert = require('color-convert');
    +	}
    +
    +	const offset = isBackground ? 10 : 0;
    +	const styles = {};
    +
    +	for (const [sourceSpace, suite] of Object.entries(colorConvert)) {
    +		const name = sourceSpace === 'ansi16' ? 'ansi' : sourceSpace;
    +		if (sourceSpace === targetSpace) {
    +			styles[name] = wrap(identity, offset);
    +		} else if (typeof suite === 'object') {
    +			styles[name] = wrap(suite[targetSpace], offset);
    +		}
    +	}
    +
    +	return styles;
    +};
    +
    +function assembleStyles() {
    +	const codes = new Map();
    +	const styles = {
    +		modifier: {
    +			reset: [0, 0],
    +			// 21 isn't widely supported and 22 does the same thing
    +			bold: [1, 22],
    +			dim: [2, 22],
    +			italic: [3, 23],
    +			underline: [4, 24],
    +			inverse: [7, 27],
    +			hidden: [8, 28],
    +			strikethrough: [9, 29]
    +		},
    +		color: {
    +			black: [30, 39],
    +			red: [31, 39],
    +			green: [32, 39],
    +			yellow: [33, 39],
    +			blue: [34, 39],
    +			magenta: [35, 39],
    +			cyan: [36, 39],
    +			white: [37, 39],
    +
    +			// Bright color
    +			blackBright: [90, 39],
    +			redBright: [91, 39],
    +			greenBright: [92, 39],
    +			yellowBright: [93, 39],
    +			blueBright: [94, 39],
    +			magentaBright: [95, 39],
    +			cyanBright: [96, 39],
    +			whiteBright: [97, 39]
    +		},
    +		bgColor: {
    +			bgBlack: [40, 49],
    +			bgRed: [41, 49],
    +			bgGreen: [42, 49],
    +			bgYellow: [43, 49],
    +			bgBlue: [44, 49],
    +			bgMagenta: [45, 49],
    +			bgCyan: [46, 49],
    +			bgWhite: [47, 49],
    +
    +			// Bright color
    +			bgBlackBright: [100, 49],
    +			bgRedBright: [101, 49],
    +			bgGreenBright: [102, 49],
    +			bgYellowBright: [103, 49],
    +			bgBlueBright: [104, 49],
    +			bgMagentaBright: [105, 49],
    +			bgCyanBright: [106, 49],
    +			bgWhiteBright: [107, 49]
    +		}
    +	};
    +
    +	// Alias bright black as gray (and grey)
    +	styles.color.gray = styles.color.blackBright;
    +	styles.bgColor.bgGray = styles.bgColor.bgBlackBright;
    +	styles.color.grey = styles.color.blackBright;
    +	styles.bgColor.bgGrey = styles.bgColor.bgBlackBright;
    +
    +	for (const [groupName, group] of Object.entries(styles)) {
    +		for (const [styleName, style] of Object.entries(group)) {
    +			styles[styleName] = {
    +				open: `\u001B[${style[0]}m`,
    +				close: `\u001B[${style[1]}m`
    +			};
    +
    +			group[styleName] = styles[styleName];
    +
    +			codes.set(style[0], style[1]);
    +		}
    +
    +		Object.defineProperty(styles, groupName, {
    +			value: group,
    +			enumerable: false
    +		});
    +	}
    +
    +	Object.defineProperty(styles, 'codes', {
    +		value: codes,
    +		enumerable: false
    +	});
    +
    +	styles.color.close = '\u001B[39m';
    +	styles.bgColor.close = '\u001B[49m';
    +
    +	setLazyProperty(styles.color, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, false));
    +	setLazyProperty(styles.color, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, false));
    +	setLazyProperty(styles.color, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, false));
    +	setLazyProperty(styles.bgColor, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, true));
    +	setLazyProperty(styles.bgColor, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, true));
    +	setLazyProperty(styles.bgColor, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, true));
    +
    +	return styles;
    +}
    +
    +// Make the export immutable
    +Object.defineProperty(module, 'exports', {
    +	enumerable: true,
    +	get: assembleStyles
    +});
    diff --git a/deps/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles/license b/deps/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles/license
    new file mode 100644
    index 00000000000000..e7af2f77107d73
    --- /dev/null
    +++ b/deps/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles/license
    @@ -0,0 +1,9 @@
    +MIT License
    +
    +Copyright (c) Sindre Sorhus  (sindresorhus.com)
    +
    +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
    +
    +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
    +
    +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    diff --git a/deps/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles/package.json b/deps/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles/package.json
    new file mode 100644
    index 00000000000000..75393284d7e474
    --- /dev/null
    +++ b/deps/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles/package.json
    @@ -0,0 +1,56 @@
    +{
    +	"name": "ansi-styles",
    +	"version": "4.3.0",
    +	"description": "ANSI escape codes for styling strings in the terminal",
    +	"license": "MIT",
    +	"repository": "chalk/ansi-styles",
    +	"funding": "https://github.com/chalk/ansi-styles?sponsor=1",
    +	"author": {
    +		"name": "Sindre Sorhus",
    +		"email": "sindresorhus@gmail.com",
    +		"url": "sindresorhus.com"
    +	},
    +	"engines": {
    +		"node": ">=8"
    +	},
    +	"scripts": {
    +		"test": "xo && ava && tsd",
    +		"screenshot": "svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor"
    +	},
    +	"files": [
    +		"index.js",
    +		"index.d.ts"
    +	],
    +	"keywords": [
    +		"ansi",
    +		"styles",
    +		"color",
    +		"colour",
    +		"colors",
    +		"terminal",
    +		"console",
    +		"cli",
    +		"string",
    +		"tty",
    +		"escape",
    +		"formatting",
    +		"rgb",
    +		"256",
    +		"shell",
    +		"xterm",
    +		"log",
    +		"logging",
    +		"command-line",
    +		"text"
    +	],
    +	"dependencies": {
    +		"color-convert": "^2.0.1"
    +	},
    +	"devDependencies": {
    +		"@types/color-convert": "^1.9.0",
    +		"ava": "^2.3.0",
    +		"svg-term-cli": "^2.1.1",
    +		"tsd": "^0.11.0",
    +		"xo": "^0.25.3"
    +	}
    +}
    diff --git a/deps/npm/node_modules/wrap-ansi-cjs/node_modules/strip-ansi/index.js b/deps/npm/node_modules/wrap-ansi-cjs/node_modules/strip-ansi/index.js
    new file mode 100644
    index 00000000000000..9a593dfcd1fd5c
    --- /dev/null
    +++ b/deps/npm/node_modules/wrap-ansi-cjs/node_modules/strip-ansi/index.js
    @@ -0,0 +1,4 @@
    +'use strict';
    +const ansiRegex = require('ansi-regex');
    +
    +module.exports = string => typeof string === 'string' ? string.replace(ansiRegex(), '') : string;
    diff --git a/deps/npm/node_modules/wrap-ansi-cjs/node_modules/strip-ansi/license b/deps/npm/node_modules/wrap-ansi-cjs/node_modules/strip-ansi/license
    new file mode 100644
    index 00000000000000..e7af2f77107d73
    --- /dev/null
    +++ b/deps/npm/node_modules/wrap-ansi-cjs/node_modules/strip-ansi/license
    @@ -0,0 +1,9 @@
    +MIT License
    +
    +Copyright (c) Sindre Sorhus  (sindresorhus.com)
    +
    +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
    +
    +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
    +
    +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    diff --git a/deps/npm/node_modules/wrap-ansi-cjs/node_modules/strip-ansi/package.json b/deps/npm/node_modules/wrap-ansi-cjs/node_modules/strip-ansi/package.json
    new file mode 100644
    index 00000000000000..1a41108d42831c
    --- /dev/null
    +++ b/deps/npm/node_modules/wrap-ansi-cjs/node_modules/strip-ansi/package.json
    @@ -0,0 +1,54 @@
    +{
    +	"name": "strip-ansi",
    +	"version": "6.0.1",
    +	"description": "Strip ANSI escape codes from a string",
    +	"license": "MIT",
    +	"repository": "chalk/strip-ansi",
    +	"author": {
    +		"name": "Sindre Sorhus",
    +		"email": "sindresorhus@gmail.com",
    +		"url": "sindresorhus.com"
    +	},
    +	"engines": {
    +		"node": ">=8"
    +	},
    +	"scripts": {
    +		"test": "xo && ava && tsd"
    +	},
    +	"files": [
    +		"index.js",
    +		"index.d.ts"
    +	],
    +	"keywords": [
    +		"strip",
    +		"trim",
    +		"remove",
    +		"ansi",
    +		"styles",
    +		"color",
    +		"colour",
    +		"colors",
    +		"terminal",
    +		"console",
    +		"string",
    +		"tty",
    +		"escape",
    +		"formatting",
    +		"rgb",
    +		"256",
    +		"shell",
    +		"xterm",
    +		"log",
    +		"logging",
    +		"command-line",
    +		"text"
    +	],
    +	"dependencies": {
    +		"ansi-regex": "^5.0.1"
    +	},
    +	"devDependencies": {
    +		"ava": "^2.4.0",
    +		"tsd": "^0.10.0",
    +		"xo": "^0.25.3"
    +	}
    +}
    diff --git a/deps/npm/node_modules/wrap-ansi/node_modules/ansi-regex/index.js b/deps/npm/node_modules/wrap-ansi/node_modules/ansi-regex/index.js
    deleted file mode 100644
    index 130a0929b8ce8c..00000000000000
    --- a/deps/npm/node_modules/wrap-ansi/node_modules/ansi-regex/index.js
    +++ /dev/null
    @@ -1,8 +0,0 @@
    -export default function ansiRegex({onlyFirst = false} = {}) {
    -	const pattern = [
    -	    '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
    -		'(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'
    -	].join('|');
    -
    -	return new RegExp(pattern, onlyFirst ? undefined : 'g');
    -}
    diff --git a/deps/npm/node_modules/wrap-ansi/node_modules/ansi-styles/index.js b/deps/npm/node_modules/wrap-ansi/node_modules/ansi-styles/index.js
    deleted file mode 100644
    index d7bede44b7b6ba..00000000000000
    --- a/deps/npm/node_modules/wrap-ansi/node_modules/ansi-styles/index.js
    +++ /dev/null
    @@ -1,223 +0,0 @@
    -const ANSI_BACKGROUND_OFFSET = 10;
    -
    -const wrapAnsi16 = (offset = 0) => code => `\u001B[${code + offset}m`;
    -
    -const wrapAnsi256 = (offset = 0) => code => `\u001B[${38 + offset};5;${code}m`;
    -
    -const wrapAnsi16m = (offset = 0) => (red, green, blue) => `\u001B[${38 + offset};2;${red};${green};${blue}m`;
    -
    -const styles = {
    -	modifier: {
    -		reset: [0, 0],
    -		// 21 isn't widely supported and 22 does the same thing
    -		bold: [1, 22],
    -		dim: [2, 22],
    -		italic: [3, 23],
    -		underline: [4, 24],
    -		overline: [53, 55],
    -		inverse: [7, 27],
    -		hidden: [8, 28],
    -		strikethrough: [9, 29],
    -	},
    -	color: {
    -		black: [30, 39],
    -		red: [31, 39],
    -		green: [32, 39],
    -		yellow: [33, 39],
    -		blue: [34, 39],
    -		magenta: [35, 39],
    -		cyan: [36, 39],
    -		white: [37, 39],
    -
    -		// Bright color
    -		blackBright: [90, 39],
    -		gray: [90, 39], // Alias of `blackBright`
    -		grey: [90, 39], // Alias of `blackBright`
    -		redBright: [91, 39],
    -		greenBright: [92, 39],
    -		yellowBright: [93, 39],
    -		blueBright: [94, 39],
    -		magentaBright: [95, 39],
    -		cyanBright: [96, 39],
    -		whiteBright: [97, 39],
    -	},
    -	bgColor: {
    -		bgBlack: [40, 49],
    -		bgRed: [41, 49],
    -		bgGreen: [42, 49],
    -		bgYellow: [43, 49],
    -		bgBlue: [44, 49],
    -		bgMagenta: [45, 49],
    -		bgCyan: [46, 49],
    -		bgWhite: [47, 49],
    -
    -		// Bright color
    -		bgBlackBright: [100, 49],
    -		bgGray: [100, 49], // Alias of `bgBlackBright`
    -		bgGrey: [100, 49], // Alias of `bgBlackBright`
    -		bgRedBright: [101, 49],
    -		bgGreenBright: [102, 49],
    -		bgYellowBright: [103, 49],
    -		bgBlueBright: [104, 49],
    -		bgMagentaBright: [105, 49],
    -		bgCyanBright: [106, 49],
    -		bgWhiteBright: [107, 49],
    -	},
    -};
    -
    -export const modifierNames = Object.keys(styles.modifier);
    -export const foregroundColorNames = Object.keys(styles.color);
    -export const backgroundColorNames = Object.keys(styles.bgColor);
    -export const colorNames = [...foregroundColorNames, ...backgroundColorNames];
    -
    -function assembleStyles() {
    -	const codes = new Map();
    -
    -	for (const [groupName, group] of Object.entries(styles)) {
    -		for (const [styleName, style] of Object.entries(group)) {
    -			styles[styleName] = {
    -				open: `\u001B[${style[0]}m`,
    -				close: `\u001B[${style[1]}m`,
    -			};
    -
    -			group[styleName] = styles[styleName];
    -
    -			codes.set(style[0], style[1]);
    -		}
    -
    -		Object.defineProperty(styles, groupName, {
    -			value: group,
    -			enumerable: false,
    -		});
    -	}
    -
    -	Object.defineProperty(styles, 'codes', {
    -		value: codes,
    -		enumerable: false,
    -	});
    -
    -	styles.color.close = '\u001B[39m';
    -	styles.bgColor.close = '\u001B[49m';
    -
    -	styles.color.ansi = wrapAnsi16();
    -	styles.color.ansi256 = wrapAnsi256();
    -	styles.color.ansi16m = wrapAnsi16m();
    -	styles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);
    -	styles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);
    -	styles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);
    -
    -	// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js
    -	Object.defineProperties(styles, {
    -		rgbToAnsi256: {
    -			value: (red, green, blue) => {
    -				// We use the extended greyscale palette here, with the exception of
    -				// black and white. normal palette only has 4 greyscale shades.
    -				if (red === green && green === blue) {
    -					if (red < 8) {
    -						return 16;
    -					}
    -
    -					if (red > 248) {
    -						return 231;
    -					}
    -
    -					return Math.round(((red - 8) / 247) * 24) + 232;
    -				}
    -
    -				return 16
    -					+ (36 * Math.round(red / 255 * 5))
    -					+ (6 * Math.round(green / 255 * 5))
    -					+ Math.round(blue / 255 * 5);
    -			},
    -			enumerable: false,
    -		},
    -		hexToRgb: {
    -			value: hex => {
    -				const matches = /[a-f\d]{6}|[a-f\d]{3}/i.exec(hex.toString(16));
    -				if (!matches) {
    -					return [0, 0, 0];
    -				}
    -
    -				let [colorString] = matches;
    -
    -				if (colorString.length === 3) {
    -					colorString = [...colorString].map(character => character + character).join('');
    -				}
    -
    -				const integer = Number.parseInt(colorString, 16);
    -
    -				return [
    -					/* eslint-disable no-bitwise */
    -					(integer >> 16) & 0xFF,
    -					(integer >> 8) & 0xFF,
    -					integer & 0xFF,
    -					/* eslint-enable no-bitwise */
    -				];
    -			},
    -			enumerable: false,
    -		},
    -		hexToAnsi256: {
    -			value: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),
    -			enumerable: false,
    -		},
    -		ansi256ToAnsi: {
    -			value: code => {
    -				if (code < 8) {
    -					return 30 + code;
    -				}
    -
    -				if (code < 16) {
    -					return 90 + (code - 8);
    -				}
    -
    -				let red;
    -				let green;
    -				let blue;
    -
    -				if (code >= 232) {
    -					red = (((code - 232) * 10) + 8) / 255;
    -					green = red;
    -					blue = red;
    -				} else {
    -					code -= 16;
    -
    -					const remainder = code % 36;
    -
    -					red = Math.floor(code / 36) / 5;
    -					green = Math.floor(remainder / 6) / 5;
    -					blue = (remainder % 6) / 5;
    -				}
    -
    -				const value = Math.max(red, green, blue) * 2;
    -
    -				if (value === 0) {
    -					return 30;
    -				}
    -
    -				// eslint-disable-next-line no-bitwise
    -				let result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));
    -
    -				if (value === 2) {
    -					result += 60;
    -				}
    -
    -				return result;
    -			},
    -			enumerable: false,
    -		},
    -		rgbToAnsi: {
    -			value: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),
    -			enumerable: false,
    -		},
    -		hexToAnsi: {
    -			value: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),
    -			enumerable: false,
    -		},
    -	});
    -
    -	return styles;
    -}
    -
    -const ansiStyles = assembleStyles();
    -
    -export default ansiStyles;
    diff --git a/deps/npm/node_modules/wrap-ansi/node_modules/strip-ansi/index.js b/deps/npm/node_modules/wrap-ansi/node_modules/strip-ansi/index.js
    deleted file mode 100644
    index ba19750e64e061..00000000000000
    --- a/deps/npm/node_modules/wrap-ansi/node_modules/strip-ansi/index.js
    +++ /dev/null
    @@ -1,14 +0,0 @@
    -import ansiRegex from 'ansi-regex';
    -
    -const regex = ansiRegex();
    -
    -export default function stripAnsi(string) {
    -	if (typeof string !== 'string') {
    -		throw new TypeError(`Expected a \`string\`, got \`${typeof string}\``);
    -	}
    -
    -	// Even though the regex is global, we don't need to reset the `.lastIndex`
    -	// because unlike `.exec()` and `.test()`, `.replace()` does it automatically
    -	// and doing it manually has a performance penalty.
    -	return string.replace(regex, '');
    -}
    diff --git a/deps/npm/node_modules/wrap-ansi/node_modules/strip-ansi/license b/deps/npm/node_modules/wrap-ansi/node_modules/strip-ansi/license
    deleted file mode 100644
    index fa7ceba3eb4a96..00000000000000
    --- a/deps/npm/node_modules/wrap-ansi/node_modules/strip-ansi/license
    +++ /dev/null
    @@ -1,9 +0,0 @@
    -MIT License
    -
    -Copyright (c) Sindre Sorhus  (https://sindresorhus.com)
    -
    -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
    -
    -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
    -
    -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    diff --git a/deps/npm/node_modules/wrappy/LICENSE b/deps/npm/node_modules/wrappy/LICENSE
    deleted file mode 100644
    index 19129e315fe593..00000000000000
    --- a/deps/npm/node_modules/wrappy/LICENSE
    +++ /dev/null
    @@ -1,15 +0,0 @@
    -The ISC License
    -
    -Copyright (c) Isaac Z. Schlueter and Contributors
    -
    -Permission to use, copy, modify, and/or distribute this software for any
    -purpose with or without fee is hereby granted, provided that the above
    -copyright notice and this permission notice appear in all copies.
    -
    -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
    -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    diff --git a/deps/npm/node_modules/wrappy/package.json b/deps/npm/node_modules/wrappy/package.json
    deleted file mode 100644
    index 130752046714d6..00000000000000
    --- a/deps/npm/node_modules/wrappy/package.json
    +++ /dev/null
    @@ -1,29 +0,0 @@
    -{
    -  "name": "wrappy",
    -  "version": "1.0.2",
    -  "description": "Callback wrapping utility",
    -  "main": "wrappy.js",
    -  "files": [
    -    "wrappy.js"
    -  ],
    -  "directories": {
    -    "test": "test"
    -  },
    -  "dependencies": {},
    -  "devDependencies": {
    -    "tap": "^2.3.1"
    -  },
    -  "scripts": {
    -    "test": "tap --coverage test/*.js"
    -  },
    -  "repository": {
    -    "type": "git",
    -    "url": "https://github.com/npm/wrappy"
    -  },
    -  "author": "Isaac Z. Schlueter  (http://blog.izs.me/)",
    -  "license": "ISC",
    -  "bugs": {
    -    "url": "https://github.com/npm/wrappy/issues"
    -  },
    -  "homepage": "https://github.com/npm/wrappy"
    -}
    diff --git a/deps/npm/node_modules/wrappy/wrappy.js b/deps/npm/node_modules/wrappy/wrappy.js
    deleted file mode 100644
    index bb7e7d6fcf70fd..00000000000000
    --- a/deps/npm/node_modules/wrappy/wrappy.js
    +++ /dev/null
    @@ -1,33 +0,0 @@
    -// Returns a wrapper function that returns a wrapped callback
    -// The wrapper function should do some stuff, and return a
    -// presumably different callback function.
    -// This makes sure that own properties are retained, so that
    -// decorations and such are not lost along the way.
    -module.exports = wrappy
    -function wrappy (fn, cb) {
    -  if (fn && cb) return wrappy(fn)(cb)
    -
    -  if (typeof fn !== 'function')
    -    throw new TypeError('need wrapper function')
    -
    -  Object.keys(fn).forEach(function (k) {
    -    wrapper[k] = fn[k]
    -  })
    -
    -  return wrapper
    -
    -  function wrapper() {
    -    var args = new Array(arguments.length)
    -    for (var i = 0; i < args.length; i++) {
    -      args[i] = arguments[i]
    -    }
    -    var ret = fn.apply(this, args)
    -    var cb = args[args.length-1]
    -    if (typeof ret === 'function' && ret !== cb) {
    -      Object.keys(cb).forEach(function (k) {
    -        ret[k] = cb[k]
    -      })
    -    }
    -    return ret
    -  }
    -}
    diff --git a/deps/npm/package.json b/deps/npm/package.json
    index 3246377f0cb725..a946e38493e0e4 100644
    --- a/deps/npm/package.json
    +++ b/deps/npm/package.json
    @@ -1,5 +1,5 @@
     {
    -  "version": "10.2.0",
    +  "version": "10.2.4",
       "name": "npm",
       "description": "a package manager for JavaScript",
       "workspaces": [
    @@ -52,19 +52,19 @@
       },
       "dependencies": {
         "@isaacs/string-locale-compare": "^1.1.0",
    -    "@npmcli/arborist": "^7.2.0",
    -    "@npmcli/config": "^8.0.0",
    +    "@npmcli/arborist": "^7.2.1",
    +    "@npmcli/config": "^8.0.2",
         "@npmcli/fs": "^3.1.0",
         "@npmcli/map-workspaces": "^3.0.4",
         "@npmcli/package-json": "^5.0.0",
         "@npmcli/promise-spawn": "^7.0.0",
    -    "@npmcli/run-script": "^7.0.1",
    -    "@sigstore/tuf": "^2.1.0",
    +    "@npmcli/run-script": "^7.0.2",
    +    "@sigstore/tuf": "^2.2.0",
         "abbrev": "^2.0.0",
         "archy": "~1.0.0",
         "cacache": "^18.0.0",
         "chalk": "^5.3.0",
    -    "ci-info": "^3.8.0",
    +    "ci-info": "^4.0.0",
         "cli-columns": "^4.0.0",
         "cli-table3": "^0.6.3",
         "columnify": "^1.6.0",
    @@ -75,33 +75,33 @@
         "hosted-git-info": "^7.0.1",
         "ini": "^4.1.1",
         "init-package-json": "^6.0.0",
    -    "is-cidr": "^4.0.2",
    +    "is-cidr": "^5.0.3",
         "json-parse-even-better-errors": "^3.0.0",
         "libnpmaccess": "^8.0.1",
    -    "libnpmdiff": "^6.0.2",
    -    "libnpmexec": "^7.0.2",
    -    "libnpmfund": "^5.0.0",
    +    "libnpmdiff": "^6.0.3",
    +    "libnpmexec": "^7.0.4",
    +    "libnpmfund": "^5.0.1",
         "libnpmhook": "^10.0.0",
         "libnpmorg": "^6.0.1",
    -    "libnpmpack": "^6.0.2",
    -    "libnpmpublish": "^9.0.1",
    +    "libnpmpack": "^6.0.3",
    +    "libnpmpublish": "^9.0.2",
         "libnpmsearch": "^7.0.0",
         "libnpmteam": "^6.0.0",
    -    "libnpmversion": "^5.0.0",
    +    "libnpmversion": "^5.0.1",
         "make-fetch-happen": "^13.0.0",
         "minimatch": "^9.0.3",
         "minipass": "^7.0.4",
         "minipass-pipeline": "^1.2.4",
         "ms": "^2.1.2",
    -    "node-gyp": "^9.4.0",
    +    "node-gyp": "^10.0.1",
         "nopt": "^7.2.0",
         "normalize-package-data": "^6.0.0",
         "npm-audit-report": "^5.0.0",
    -    "npm-install-checks": "^6.2.0",
    +    "npm-install-checks": "^6.3.0",
         "npm-package-arg": "^11.0.1",
         "npm-pick-manifest": "^9.0.0",
         "npm-profile": "^9.0.0",
    -    "npm-registry-fetch": "^16.0.0",
    +    "npm-registry-fetch": "^16.1.0",
         "npm-user-validate": "^2.0.0",
         "npmlog": "^7.0.1",
         "p-map": "^4.0.0",
    @@ -113,7 +113,7 @@
         "semver": "^7.5.4",
         "spdx-expression-parse": "^3.0.1",
         "ssri": "^10.0.5",
    -    "strip-ansi": "^6.0.1",
    +    "strip-ansi": "^7.1.0",
         "supports-color": "^9.4.0",
         "tar": "^6.2.0",
         "text-table": "~0.2.0",
    @@ -209,7 +209,7 @@
         "ajv-formats-draft2019": "^1.6.1",
         "diff": "^5.1.0",
         "licensee": "^10.0.0",
    -    "nock": "^13.3.3",
    +    "nock": "^13.3.8",
         "npm-packlist": "^8.0.0",
         "remark": "^14.0.2",
         "remark-gfm": "^3.0.1",
    diff --git a/deps/npm/tap-snapshots/test/lib/commands/search.js.test.cjs b/deps/npm/tap-snapshots/test/lib/commands/search.js.test.cjs
    index 50032deb745739..3fd12d699bd77f 100644
    --- a/deps/npm/tap-snapshots/test/lib/commands/search.js.test.cjs
    +++ b/deps/npm/tap-snapshots/test/lib/commands/search.js.test.cjs
    @@ -46,20 +46,20 @@ pkg-no-desc               |                      | =lukekarrys     | 2019-09-26
     `
     
     exports[`test/lib/commands/search.js TAP search  --parseable > should have expected search results as parseable 1`] = `
    -libnpm	Collection of programmatic APIs for the npm CLI	=nlf =ruyadorno =darcyclarke =isaacs	2019-07-16 	3.0.1	npm api package manager lib
    -libnpmaccess	programmatic library for \`npm access\` commands	=nlf =ruyadorno =darcyclarke =isaacs	2020-11-03 	4.0.1	libnpmaccess
    -@evocateur/libnpmaccess	programmatic library for \`npm access\` commands	=evocateur	2019-07-16 	3.1.2
    -@evocateur/libnpmpublish	Programmatic API for the bits behind npm publish and unpublish	=evocateur	2019-07-16 	1.2.2
    -libnpmorg	Programmatic api for \`npm org\` commands	=nlf =ruyadorno =darcyclarke =isaacs	2020-11-03 	2.0.1	libnpm npm package manager api orgs teams
    -libnpmsearch	Programmatic API for searching in npm and compatible registries.	=nlf =ruyadorno =darcyclarke =isaacs	2020-12-08 	3.1.0	npm search api libnpm
    -libnpmteam	npm Team management APIs	=nlf =ruyadorno =darcyclarke =isaacs	2020-11-03 	2.0.2
    -libnpmhook	programmatic API for managing npm registry hooks	=nlf =ruyadorno =darcyclarke =isaacs	2020-11-03 	6.0.1	npm hooks registry npm api
    -libnpmpublish	Programmatic API for the bits behind npm publish and unpublish	=nlf =ruyadorno =darcyclarke =isaacs	2020-11-03 	4.0.0
    -libnpmfund	Programmatic API for npm fund	=nlf =ruyadorno =darcyclarke =isaacs	2020-12-08 	1.0.2	npm npmcli libnpm cli git fund gitfund
    -@npmcli/map-workspaces	Retrieves a name:pathname Map for a given workspaces config	=nlf =ruyadorno =darcyclarke =isaacs	2020-09-30 	1.0.1	npm  bad map npmcli libnpm cli workspaces map-workspaces
    -libnpmversion	library to do the things that 'npm version' does	=nlf =ruyadorno =darcyclarke =isaacs	2020-11-04 	1.0.7
    -@types/libnpmsearch	TypeScript definitions for libnpmsearch	=types	2019-09-26 	2.0.1
    -pkg-no-desc		=lukekarrys	2019-09-26 	1.0.0
    +libnpm	Collection of programmatic APIs for the npm CLI	=nlf =ruyadorno =darcyclarke =isaacs	2019-07-16	3.0.1	npm api package manager lib
    +libnpmaccess	programmatic library for \`npm access\` commands	=nlf =ruyadorno =darcyclarke =isaacs	2020-11-03	4.0.1	libnpmaccess
    +@evocateur/libnpmaccess	programmatic library for \`npm access\` commands	=evocateur	2019-07-16	3.1.2
    +@evocateur/libnpmpublish	Programmatic API for the bits behind npm publish and unpublish	=evocateur	2019-07-16	1.2.2
    +libnpmorg	Programmatic api for \`npm org\` commands	=nlf =ruyadorno =darcyclarke =isaacs	2020-11-03	2.0.1	libnpm npm package manager api orgs teams
    +libnpmsearch	Programmatic API for searching in npm and compatible registries.	=nlf =ruyadorno =darcyclarke =isaacs	2020-12-08	3.1.0	npm search api libnpm
    +libnpmteam	npm Team management APIs	=nlf =ruyadorno =darcyclarke =isaacs	2020-11-03	2.0.2
    +libnpmhook	programmatic API for managing npm registry hooks	=nlf =ruyadorno =darcyclarke =isaacs	2020-11-03	6.0.1	npm hooks registry npm api
    +libnpmpublish	Programmatic API for the bits behind npm publish and unpublish	=nlf =ruyadorno =darcyclarke =isaacs	2020-11-03	4.0.0
    +libnpmfund	Programmatic API for npm fund	=nlf =ruyadorno =darcyclarke =isaacs	2020-12-08	1.0.2	npm npmcli libnpm cli git fund gitfund
    +@npmcli/map-workspaces	Retrieves a name:pathname Map for a given workspaces config	=nlf =ruyadorno =darcyclarke =isaacs	2020-09-30	1.0.1	npm  bad map npmcli libnpm cli workspaces map-workspaces
    +libnpmversion	library to do the things that 'npm version' does	=nlf =ruyadorno =darcyclarke =isaacs	2020-11-04	1.0.7
    +@types/libnpmsearch	TypeScript definitions for libnpmsearch	=types	2019-09-26	2.0.1
    +pkg-no-desc		=lukekarrys	2019-09-26	1.0.0
     `
     
     exports[`test/lib/commands/search.js TAP search  > should have filtered expected search results 1`] = `
    diff --git a/deps/npm/tap-snapshots/test/lib/commands/view.js.test.cjs b/deps/npm/tap-snapshots/test/lib/commands/view.js.test.cjs
    index d5b7a3b4a79068..5248d439afad95 100644
    --- a/deps/npm/tap-snapshots/test/lib/commands/view.js.test.cjs
    +++ b/deps/npm/tap-snapshots/test/lib/commands/view.js.test.cjs
    @@ -315,6 +315,10 @@ maintainers[0].name = 'claudia'
     maintainers[1].name = 'isaacs'
     `
     
    +exports[`test/lib/commands/view.js TAP specific field names fields with empty values > must match snapshot 1`] = `
    +
    +`
    +
     exports[`test/lib/commands/view.js TAP specific field names maintainers with email > must match snapshot 1`] = `
     maintainers = [
       { name: 'claudia', email: 'c@yellow.com', twitter: 'cyellow' },
    diff --git a/deps/npm/tap-snapshots/test/lib/utils/error-message.js.test.cjs b/deps/npm/tap-snapshots/test/lib/utils/error-message.js.test.cjs
    index 1cd3d4cf1ac567..fe581fb6beb291 100644
    --- a/deps/npm/tap-snapshots/test/lib/utils/error-message.js.test.cjs
    +++ b/deps/npm/tap-snapshots/test/lib/utils/error-message.js.test.cjs
    @@ -1137,7 +1137,7 @@ Object {
         Array [
           "",
           String(
    -        To correct this please trying logging in again with:
    +        To correct this please try logging in again with:
                 npm login
           ),
         ],
    diff --git a/deps/npm/tap-snapshots/test/lib/utils/sbom-cyclonedx.js.test.cjs b/deps/npm/tap-snapshots/test/lib/utils/sbom-cyclonedx.js.test.cjs
    index 878dfd4be4705b..7a8d79017f36a2 100644
    --- a/deps/npm/tap-snapshots/test/lib/utils/sbom-cyclonedx.js.test.cjs
    +++ b/deps/npm/tap-snapshots/test/lib/utils/sbom-cyclonedx.js.test.cjs
    @@ -912,6 +912,61 @@ exports[`test/lib/utils/sbom-cyclonedx.js TAP single node - with license express
     }
     `
     
    +exports[`test/lib/utils/sbom-cyclonedx.js TAP single node - with license object > must match snapshot 1`] = `
    +{
    +  "$schema": "http://cyclonedx.org/schema/bom-1.5.schema.json",
    +  "bomFormat": "CycloneDX",
    +  "specVersion": "1.5",
    +  "serialNumber": "urn:uuid:00000000-0000-0000-0000-000000000000",
    +  "version": 1,
    +  "metadata": {
    +    "timestamp": "2020-01-01T00:00:00.000Z",
    +    "lifecycles": [
    +      {
    +        "phase": "build"
    +      }
    +    ],
    +    "tools": [
    +      {
    +        "vendor": "npm",
    +        "name": "cli",
    +        "version": "10.0.0 "
    +      }
    +    ],
    +    "component": {
    +      "bom-ref": "root@1.0.0",
    +      "type": "library",
    +      "name": "root",
    +      "version": "1.0.0",
    +      "scope": "required",
    +      "author": "Author",
    +      "purl": "pkg:npm/root@1.0.0",
    +      "properties": [
    +        {
    +          "name": "cdx:npm:package:path",
    +          "value": ""
    +        }
    +      ],
    +      "externalReferences": [],
    +      "licenses": [
    +        {
    +          "license": {
    +            "id": "MIT"
    +          }
    +        }
    +      ]
    +    }
    +  },
    +  "components": [],
    +  "dependencies": [
    +    {
    +      "ref": "root@1.0.0",
    +      "dependsOn": []
    +    }
    +  ]
    +}
    +`
    +
     exports[`test/lib/utils/sbom-cyclonedx.js TAP single node - with repository url > must match snapshot 1`] = `
     {
       "$schema": "http://cyclonedx.org/schema/bom-1.5.schema.json",
    diff --git a/deps/npm/tap-snapshots/test/lib/utils/sbom-spdx.js.test.cjs b/deps/npm/tap-snapshots/test/lib/utils/sbom-spdx.js.test.cjs
    index 890bd29b7d2639..aeda27793a04ff 100644
    --- a/deps/npm/tap-snapshots/test/lib/utils/sbom-spdx.js.test.cjs
    +++ b/deps/npm/tap-snapshots/test/lib/utils/sbom-spdx.js.test.cjs
    @@ -504,3 +504,138 @@ exports[`test/lib/utils/sbom-spdx.js TAP single node - with integrity > must mat
       ]
     }
     `
    +
    +exports[`test/lib/utils/sbom-spdx.js TAP single node - with license expression > must match snapshot 1`] = `
    +{
    +  "spdxVersion": "SPDX-2.3",
    +  "dataLicense": "CC0-1.0",
    +  "SPDXID": "SPDXRef-DOCUMENT",
    +  "name": "root@1.0.0",
    +  "documentNamespace": "docns",
    +  "creationInfo": {
    +    "created": "2020-01-01T00:00:00.000Z",
    +    "creators": [
    +      "Tool: npm/cli-10.0.0 "
    +    ]
    +  },
    +  "documentDescribes": [
    +    "SPDXRef-Package-root-1.0.0"
    +  ],
    +  "packages": [
    +    {
    +      "name": "root",
    +      "SPDXID": "SPDXRef-Package-root-1.0.0",
    +      "versionInfo": "1.0.0",
    +      "packageFileName": "",
    +      "downloadLocation": "NOASSERTION",
    +      "filesAnalyzed": false,
    +      "homepage": "NOASSERTION",
    +      "licenseDeclared": "(MIT OR Apache-2.0)",
    +      "externalRefs": [
    +        {
    +          "referenceCategory": "PACKAGE-MANAGER",
    +          "referenceType": "purl",
    +          "referenceLocator": "pkg:npm/root@1.0.0"
    +        }
    +      ]
    +    }
    +  ],
    +  "relationships": [
    +    {
    +      "spdxElementId": "SPDXRef-DOCUMENT",
    +      "relatedSpdxElement": "SPDXRef-Package-root-1.0.0",
    +      "relationshipType": "DESCRIBES"
    +    }
    +  ]
    +}
    +`
    +
    +exports[`test/lib/utils/sbom-spdx.js TAP single node - with license object > must match snapshot 1`] = `
    +{
    +  "spdxVersion": "SPDX-2.3",
    +  "dataLicense": "CC0-1.0",
    +  "SPDXID": "SPDXRef-DOCUMENT",
    +  "name": "root@1.0.0",
    +  "documentNamespace": "docns",
    +  "creationInfo": {
    +    "created": "2020-01-01T00:00:00.000Z",
    +    "creators": [
    +      "Tool: npm/cli-10.0.0 "
    +    ]
    +  },
    +  "documentDescribes": [
    +    "SPDXRef-Package-root-1.0.0"
    +  ],
    +  "packages": [
    +    {
    +      "name": "root",
    +      "SPDXID": "SPDXRef-Package-root-1.0.0",
    +      "versionInfo": "1.0.0",
    +      "packageFileName": "",
    +      "downloadLocation": "NOASSERTION",
    +      "filesAnalyzed": false,
    +      "homepage": "NOASSERTION",
    +      "licenseDeclared": "MIT",
    +      "externalRefs": [
    +        {
    +          "referenceCategory": "PACKAGE-MANAGER",
    +          "referenceType": "purl",
    +          "referenceLocator": "pkg:npm/root@1.0.0"
    +        }
    +      ]
    +    }
    +  ],
    +  "relationships": [
    +    {
    +      "spdxElementId": "SPDXRef-DOCUMENT",
    +      "relatedSpdxElement": "SPDXRef-Package-root-1.0.0",
    +      "relationshipType": "DESCRIBES"
    +    }
    +  ]
    +}
    +`
    +
    +exports[`test/lib/utils/sbom-spdx.js TAP single node - with single license > must match snapshot 1`] = `
    +{
    +  "spdxVersion": "SPDX-2.3",
    +  "dataLicense": "CC0-1.0",
    +  "SPDXID": "SPDXRef-DOCUMENT",
    +  "name": "root@1.0.0",
    +  "documentNamespace": "docns",
    +  "creationInfo": {
    +    "created": "2020-01-01T00:00:00.000Z",
    +    "creators": [
    +      "Tool: npm/cli-10.0.0 "
    +    ]
    +  },
    +  "documentDescribes": [
    +    "SPDXRef-Package-root-1.0.0"
    +  ],
    +  "packages": [
    +    {
    +      "name": "root",
    +      "SPDXID": "SPDXRef-Package-root-1.0.0",
    +      "versionInfo": "1.0.0",
    +      "packageFileName": "",
    +      "downloadLocation": "NOASSERTION",
    +      "filesAnalyzed": false,
    +      "homepage": "NOASSERTION",
    +      "licenseDeclared": "ISC",
    +      "externalRefs": [
    +        {
    +          "referenceCategory": "PACKAGE-MANAGER",
    +          "referenceType": "purl",
    +          "referenceLocator": "pkg:npm/root@1.0.0"
    +        }
    +      ]
    +    }
    +  ],
    +  "relationships": [
    +    {
    +      "spdxElementId": "SPDXRef-DOCUMENT",
    +      "relatedSpdxElement": "SPDXRef-Package-root-1.0.0",
    +      "relationshipType": "DESCRIBES"
    +    }
    +  ]
    +}
    +`
    diff --git a/deps/npm/test/bin/windows-shims.js b/deps/npm/test/bin/windows-shims.js
    index 5e8a75842293d7..5fa6ff142b7377 100644
    --- a/deps/npm/test/bin/windows-shims.js
    +++ b/deps/npm/test/bin/windows-shims.js
    @@ -1,20 +1,23 @@
     const t = require('tap')
     const { spawnSync } = require('child_process')
     const { resolve, join, extname, basename, sep } = require('path')
    -const { copyFileSync, readFileSync, chmodSync, readdirSync, rmSync } = require('fs')
    +const { copyFileSync, readFileSync, chmodSync, readdirSync, rmSync, statSync } = require('fs')
     const Diff = require('diff')
     const { sync: which } = require('which')
     const { version } = require('../../package.json')
     
    -const ROOT = resolve(__dirname, '../..')
    -const BIN = join(ROOT, 'bin')
    -const SHIMS = readdirSync(BIN).reduce((acc, shim) => {
    -  if (extname(shim) !== '.js') {
    -    acc[shim] = readFileSync(join(BIN, shim), 'utf-8')
    +const readNonJsFiles = (dir) => readdirSync(dir).reduce((acc, shim) => {
    +  const p = join(dir, shim)
    +  if (extname(p) !== '.js' && !statSync(p).isDirectory()) {
    +    acc[shim] = readFileSync(p, 'utf-8')
       }
       return acc
     }, {})
     
    +const ROOT = resolve(__dirname, '../..')
    +const BIN = join(ROOT, 'bin')
    +const SHIMS = readNonJsFiles(BIN)
    +const NODE_GYP = readNonJsFiles(join(BIN, 'node-gyp-bin'))
     const SHIM_EXTS = [...new Set(Object.keys(SHIMS).map(p => extname(p)))]
     
     // windows requires each segment of a command path to be quoted when using shell: true
    @@ -63,6 +66,21 @@ t.test('shim contents', t => {
       })
     })
     
    +t.test('node-gyp', t => {
    +  // these files need to exist to avoid breaking yarn 1.x
    +
    +  for (const [key, file] of Object.entries(NODE_GYP)) {
    +    t.match(file, /npm_config_node_gyp/, `${key} contains env var`)
    +    t.match(
    +      file,
    +      /[\\/]\.\.[\\/]\.\.[\\/]node_modules[\\/]node-gyp[\\/]bin[\\/]node-gyp\.js/,
    +      `${key} contains path`
    +    )
    +  }
    +
    +  t.end()
    +})
    +
     t.test('run shims', t => {
       const path = t.testdir({
         ...SHIMS,
    diff --git a/deps/npm/test/lib/commands/audit.js b/deps/npm/test/lib/commands/audit.js
    index 25ced6655e654a..623c7b6485159f 100644
    --- a/deps/npm/test/lib/commands/audit.js
    +++ b/deps/npm/test/lib/commands/audit.js
    @@ -1393,7 +1393,7 @@ t.test('audit signatures', async t => {
     
         await t.rejects(
           npm.exec('audit', ['signatures']),
    -      /found no dependencies to audit that where installed from a supported registry/
    +      /found no dependencies to audit that were installed from a supported registry/
         )
       })
     
    @@ -1424,7 +1424,7 @@ t.test('audit signatures', async t => {
     
         await t.rejects(
           npm.exec('audit', ['signatures']),
    -      /found no dependencies to audit that where installed from a supported registry/
    +      /found no dependencies to audit that were installed from a supported registry/
         )
       })
     
    @@ -1766,7 +1766,7 @@ t.test('audit signatures', async t => {
     
         await t.rejects(
           npm.exec('audit', ['signatures']),
    -      /found no dependencies to audit that where installed from a supported registry/
    +      /found no dependencies to audit that were installed from a supported registry/
         )
       })
     
    @@ -1787,7 +1787,7 @@ t.test('audit signatures', async t => {
     
         await t.rejects(
           npm.exec('audit', ['signatures']),
    -      /found no dependencies to audit that where installed from a supported registry/
    +      /found no dependencies to audit that were installed from a supported registry/
         )
       })
     
    @@ -1815,7 +1815,7 @@ t.test('audit signatures', async t => {
     
         await t.rejects(
           npm.exec('audit', ['signatures']),
    -      /found no dependencies to audit that where installed from a supported registry/
    +      /found no dependencies to audit that were installed from a supported registry/
         )
       })
     
    @@ -1844,7 +1844,7 @@ t.test('audit signatures', async t => {
     
         await t.rejects(
           npm.exec('audit', ['signatures']),
    -      /found no dependencies to audit that where installed from a supported registry/
    +      /found no dependencies to audit that were installed from a supported registry/
         )
       })
     
    diff --git a/deps/npm/test/lib/commands/exec.js b/deps/npm/test/lib/commands/exec.js
    index 07a3e6ebd8ed95..3cb4e90e855fe4 100644
    --- a/deps/npm/test/lib/commands/exec.js
    +++ b/deps/npm/test/lib/commands/exec.js
    @@ -88,7 +88,7 @@ t.test('--prefix', async t => {
       t.ok(exists.isFile(), 'bin ran, creating file')
     })
     
    -t.test('workspaces', async t => {
    +t.test('runs in workspace path', async t => {
       const registry = new MockRegistry({
         tap: t,
         registry: 'https://registry.npmjs.org/',
    @@ -124,12 +124,101 @@ t.test('workspaces', async t => {
       await registry.package({ manifest,
         tarballs: {
           '1.0.0': path.join(npm.prefix, 'npm-exec-test'),
    -    } })
    +    },
    +  })
       await npm.exec('exec', ['@npmcli/npx-test'])
       const exists = await fs.stat(path.join(npm.prefix, 'workspace-a', 'npm-exec-test-success'))
       t.ok(exists.isFile(), 'bin ran, creating file inside workspace')
     })
     
    +t.test('finds workspace bin first', async t => {
    +  const { npm } = await loadMockNpm(t, {
    +    config: {
    +      workspace: ['workspace-a'],
    +    },
    +    prefixDir: {
    +      'package.json': JSON.stringify({
    +        name: '@npmcli/npx-workspace-root-test',
    +        bin: { 'npx-test': 'index.js' },
    +        workspaces: ['workspace-a'],
    +      }),
    +      'index.js': `#!/usr/bin/env node
    +  require('fs').writeFileSync('npm-exec-test-fail', '')`,
    +      'workspace-a': {
    +        'package.json': JSON.stringify({
    +          name: '@npmcli/npx-workspace-test',
    +          bin: { 'npx-test': 'index.js' },
    +        }),
    +        'index.js': `#!/usr/bin/env node
    +  require('fs').writeFileSync('npm-exec-test-success', '')`,
    +      },
    +    },
    +  })
    +
    +  await npm.exec('install', []) // reify
    +  await npm.exec('exec', ['npx-test'])
    +  const exists = await fs.stat(path.join(npm.prefix, 'workspace-a', 'npm-exec-test-success'))
    +  t.ok(exists.isFile(), 'bin ran, creating file inside workspace')
    +  t.rejects(fs.stat(path.join(npm.prefix, 'npm-exec-test-fail')))
    +})
    +
    +t.test('finds workspace dep first', async t => {
    +  const registry = new MockRegistry({
    +    tap: t,
    +    registry: 'https://registry.npmjs.org/',
    +  })
    +
    +  const manifest = registry.manifest({ name: '@npmcli/subdep', versions: ['1.0.0', '2.0.0'] })
    +  manifest.versions['1.0.0'].bin = { 'npx-test': 'index.js' }
    +  manifest.versions['2.0.0'].bin = { 'npx-test': 'index.js' }
    +
    +  const { npm } = await loadMockNpm(t, {
    +    prefixDir: {
    +      subdep: {
    +        one: {
    +          'package.json': JSON.stringify(manifest.versions['1.0.0']),
    +          'index.js': `#!/usr/bin/env node
    +  require('fs').writeFileSync('npm-exec-test-one', '')`,
    +        },
    +        two: {
    +          'package.json': JSON.stringify(manifest.versions['2.0.0']),
    +          'index.js': `#!/usr/bin/env node
    +  require('fs').writeFileSync('npm-exec-test-two', '')`,
    +        },
    +      },
    +      'package.json': JSON.stringify({
    +        name: '@npmcli/npx-workspace-root-test',
    +        dependencies: { '@npmcli/subdep': '1.0.0' },
    +        bin: { 'npx-test': 'index.js' },
    +        workspaces: ['workspace-a'],
    +      }),
    +      'index.js': `#!/usr/bin/env node
    +  require('fs').writeFileSync('npm-exec-test-fail', '')`,
    +      'workspace-a': {
    +        'package.json': JSON.stringify({
    +          name: '@npmcli/npx-workspace-test',
    +          dependencies: { '@npmcli/subdep': '2.0.0' },
    +          bin: { 'npx-test': 'index.js' },
    +        }),
    +        'index.js': `#!/usr/bin/env node
    +  require('fs').writeFileSync('npm-exec-test-success', '')`,
    +      },
    +    },
    +  })
    +
    +  await registry.package({ manifest,
    +    tarballs: {
    +      '1.0.0': path.join(npm.prefix, 'subdep', 'one'),
    +      '2.0.0': path.join(npm.prefix, 'subdep', 'two'),
    +    },
    +  })
    +  await npm.exec('install', [])
    +  npm.config.set('workspace', ['workspace-a'])
    +  await npm.exec('exec', ['npx-test'])
    +  const exists = await fs.stat(path.join(npm.prefix, 'workspace-a', 'npm-exec-test-success'))
    +  t.ok(exists.isFile(), 'bin ran, creating file')
    +})
    +
     t.test('npx --no-install @npmcli/npx-test', async t => {
       const registry = new MockRegistry({
         tap: t,
    diff --git a/deps/npm/test/lib/commands/hook.js b/deps/npm/test/lib/commands/hook.js
    index d3de4f5c55efad..448045cdd69162 100644
    --- a/deps/npm/test/lib/commands/hook.js
    +++ b/deps/npm/test/lib/commands/hook.js
    @@ -243,7 +243,8 @@ t.test('npm hook ls', async t => {
         'received the correct arguments'
       )
       t.equal(outputs[0][0], 'You have 3 hooks configured.', 'prints the correct header')
    -  const out = require('strip-ansi')(outputs[1][0])
    +  const { default: stripAnsi } = await import('strip-ansi')
    +  const out = stripAnsi(outputs[1][0])
       t.match(out, /semver.*https:\/\/google.com.*\n.*\n.*never triggered/, 'prints package hook')
       t.match(out, /@npmcli.*https:\/\/google.com.*\n.*\n.*triggered just now/, 'prints scope hook')
       t.match(out, /~npm.*https:\/\/google.com.*\n.*\n.*never triggered/, 'prints owner hook')
    @@ -292,7 +293,8 @@ t.test('npm hook ls, single result', async t => {
         'received the correct arguments'
       )
       t.equal(outputs[0][0], 'You have one hook configured.', 'prints the correct header')
    -  const out = require('strip-ansi')(outputs[1][0])
    +  const { default: stripAnsi } = await import('strip-ansi')
    +  const out = stripAnsi(outputs[1][0])
       t.match(out, /semver.*https:\/\/google.com.*\n.*\n.*never triggered/, 'prints package hook')
     })
     
    diff --git a/deps/npm/test/lib/commands/link.js b/deps/npm/test/lib/commands/link.js
    index 65792fd141acba..85bada28d67b1e 100644
    --- a/deps/npm/test/lib/commands/link.js
    +++ b/deps/npm/test/lib/commands/link.js
    @@ -369,6 +369,40 @@ t.test('link pkg already in global space when prefix is a symlink', async t => {
       t.matchSnapshot(await printLinks(), 'should create a local symlink to global pkg')
     })
     
    +t.test('should not save link to package file', async t => {
    +  const { link, prefix } = await mockLink(t, {
    +    globalPrefixDir: {
    +      node_modules: {
    +        '@myscope': {
    +          linked: t.fixture('symlink', '../../../other/scoped-linked'),
    +        },
    +      },
    +    },
    +    otherDirs: {
    +      'scoped-linked': {
    +        'package.json': JSON.stringify({
    +          name: '@myscope/linked',
    +          version: '1.0.0',
    +        }),
    +      },
    +    },
    +    prefixDir: {
    +      'package.json': JSON.stringify({
    +        name: 'my-project',
    +        version: '1.0.0',
    +      }),
    +    },
    +    config: { save: false },
    +  })
    +
    +  await link.exec(['@myscope/linked'])
    +  t.match(
    +    require(resolve(prefix, 'package.json')).dependencies,
    +    undefined,
    +    'should not save to package.json upon linking'
    +  )
    +})
    +
     t.test('should not prune dependencies when linking packages', async t => {
       const { link, prefix } = await mockLink(t, {
         globalPrefixDir: {
    diff --git a/deps/npm/test/lib/commands/logout.js b/deps/npm/test/lib/commands/logout.js
    index 4ff21665f30354..881003729ab4a1 100644
    --- a/deps/npm/test/lib/commands/logout.js
    +++ b/deps/npm/test/lib/commands/logout.js
    @@ -1,170 +1,154 @@
     const t = require('tap')
     const fs = require('fs/promises')
    -const npmFetch = require('npm-registry-fetch')
    -const mockNpm = require('../../fixtures/mock-npm')
    +const { load: loadMockNpm } = require('../../fixtures/mock-npm.js')
    +const MockRegistry = require('@npmcli/mock-registry')
     const { join } = require('path')
     
    -const mockLogout = async (t, { userRc = [], ...npmOpts } = {}) => {
    -  let result = null
    -
    -  const mock = await mockNpm(t, {
    -    command: 'logout',
    -    mocks: {
    -      // XXX: refactor to use mock registry
    -      'npm-registry-fetch': Object.assign(async (url, opts) => {
    -        result = { url, opts }
    -      }, npmFetch),
    -    },
    -    ...npmOpts,
    +t.test('token logout - user config', async t => {
    +  const { npm, home, logs } = await loadMockNpm(t, {
         homeDir: {
    -      '.npmrc': userRc.join('\n'),
    +      '.npmrc': [
    +        '//registry.npmjs.org/:_authToken=@foo/',
    +        'other-config=true',
    +      ].join('\n'),
         },
       })
     
    -  return {
    -    ...mock,
    -    result: () => result,
    -    // get only the message portion of the verbose log from the command
    -    logMsg: () => mock.logs.verbose.find(l => l[0] === 'logout')[1],
    -    userRc: () => fs.readFile(join(mock.home, '.npmrc'), 'utf-8').then(r => r.trim()),
    -  }
    -}
    -
    -t.test('token logout', async t => {
    -  const { logout, logMsg, result, userRc } = await mockLogout(t, {
    -    userRc: [
    -      '//registry.npmjs.org/:_authToken=@foo/',
    -      'other-config=true',
    -    ],
    -  })
    -
    -  await logout.exec([])
    -
    +  const mockRegistry = new MockRegistry({ tap: t, registry: 'https://registry.npmjs.org/' })
    +  mockRegistry.logout('@foo/')
    +  await npm.exec('logout', [])
       t.equal(
    -    logMsg(),
    +    logs.verbose.find(l => l[0] === 'logout')[1],
         'clearing token for https://registry.npmjs.org/',
         'should log message with correct registry'
       )
    +  const userRc = await fs.readFile(join(home, '.npmrc'), 'utf-8')
    +  t.equal(userRc.trim(), 'other-config=true')
    +})
     
    -  t.match(
    -    result(),
    -    {
    -      url: '/-/user/token/%40foo%2F',
    -      opts: {
    -        registry: 'https://registry.npmjs.org/',
    -        scope: '',
    -        '//registry.npmjs.org/:_authToken': '@foo/',
    -        method: 'DELETE',
    -        ignoreBody: true,
    -      },
    +t.test('token scoped logout - user config', async t => {
    +  const { npm, home, logs } = await loadMockNpm(t, {
    +    config: {
    +      scope: '@myscope',
         },
    -    'should call npm-registry-fetch with expected values'
    -  )
    -
    -  t.equal(await userRc(), 'other-config=true')
    -})
    +    homeDir: {
    +      '.npmrc': [
    +        '//diff-registry.npmjs.com/:_authToken=@bar/',
    +        '//registry.npmjs.org/:_authToken=@foo/',
    +        '@myscope:registry=https://diff-registry.npmjs.com/',
     
    -t.test('token scoped logout', async t => {
    -  const { logout, logMsg, result, userRc } = await mockLogout(t, {
    -    config: { scope: '@myscope' },
    -    userRc: [
    -      '//diff-registry.npmjs.com/:_authToken=@bar/',
    -      '//registry.npmjs.org/:_authToken=@foo/',
    -      '@myscope:registry=https://diff-registry.npmjs.com/',
    -    ],
    +      ].join('\n'),
    +    },
       })
     
    -  await logout.exec([])
    -
    +  const mockRegistry = new MockRegistry({ tap: t, registry: 'https://diff-registry.npmjs.com/' })
    +  mockRegistry.logout('@bar/')
    +  await npm.exec('logout', [])
       t.equal(
    -    logMsg(),
    +    logs.verbose.find(l => l[0] === 'logout')[1],
         'clearing token for https://diff-registry.npmjs.com/',
         'should log message with correct registry'
       )
     
    -  t.match(
    -    result(),
    -    {
    -      url: '/-/user/token/%40bar%2F',
    -      opts: {
    -        registry: 'https://registry.npmjs.org/',
    -        '@myscope:registry': 'https://diff-registry.npmjs.com/',
    -        scope: '@myscope',
    -        '//registry.npmjs.org/:_authToken': '@foo/', // <- removed by npm-registry-fetch
    -        '//diff-registry.npmjs.com/:_authToken': '@bar/',
    -        method: 'DELETE',
    -        ignoreBody: true,
    -      },
    -    },
    -    'should call npm-registry-fetch with expected values'
    -  )
    -
    -  t.equal(await userRc(), '//registry.npmjs.org/:_authToken=@foo/')
    +  const userRc = await fs.readFile(join(home, '.npmrc'), 'utf-8')
    +  t.equal(userRc.trim(), '//registry.npmjs.org/:_authToken=@foo/')
     })
     
    -t.test('user/pass logout', async t => {
    -  const { logout, logMsg, userRc } = await mockLogout(t, {
    -    userRc: [
    -      '//registry.npmjs.org/:username=foo',
    -      '//registry.npmjs.org/:_password=bar',
    -      'other-config=true',
    -    ],
    +t.test('user/pass logout - user config', async t => {
    +  const { npm, home, logs } = await loadMockNpm(t, {
    +    homeDir: {
    +      '.npmrc': [
    +        '//registry.npmjs.org/:username=foo',
    +        '//registry.npmjs.org/:_password=bar',
    +        'other-config=true',
    +      ].join('\n'),
    +    },
       })
     
    -  await logout.exec([])
    -
    +  await npm.exec('logout', [])
       t.equal(
    -    logMsg(),
    +    logs.verbose.find(l => l[0] === 'logout')[1],
         'clearing user credentials for https://registry.npmjs.org/',
         'should log message with correct registry'
       )
     
    -  t.equal(await userRc(), 'other-config=true')
    +  const userRc = await fs.readFile(join(home, '.npmrc'), 'utf-8')
    +  t.equal(userRc.trim(), 'other-config=true')
     })
     
     t.test('missing credentials', async t => {
    -  const { logout } = await mockLogout(t)
    +  const { npm } = await loadMockNpm(t)
     
       await t.rejects(
    -    logout.exec([]),
    +    npm.exec('logout', []),
         {
           code: 'ENEEDAUTH',
           message: /not logged in to https:\/\/registry.npmjs.org\/, so can't log out!/,
         },
    -    'should throw with expected error code'
    +    'should reject with expected error code'
       )
     })
     
     t.test('ignore invalid scoped registry config', async t => {
    -  const { logout, logMsg, result, userRc } = await mockLogout(t, {
    +  const { npm, home, logs } = await loadMockNpm(t, {
         config: { scope: '@myscope' },
    -    userRc: [
    -      '//registry.npmjs.org/:_authToken=@foo/',
    -      'other-config=true',
    -    ],
    +    homeDir: {
    +      '.npmrc': [
    +        '//registry.npmjs.org/:_authToken=@foo/',
    +        'other-config=true',
    +
    +      ].join('\n'),
    +    },
       })
     
    -  await logout.exec([])
    +  const mockRegistry = new MockRegistry({ tap: t, registry: 'https://registry.npmjs.org/' })
    +  mockRegistry.logout('@foo/')
    +  await npm.exec('logout', [])
     
       t.equal(
    -    logMsg(),
    +    logs.verbose.find(l => l[0] === 'logout')[1],
         'clearing token for https://registry.npmjs.org/',
         'should log message with correct registry'
       )
    +  const userRc = await fs.readFile(join(home, '.npmrc'), 'utf-8')
    +  t.equal(userRc.trim(), 'other-config=true')
    +})
     
    -  t.match(
    -    result(),
    -    {
    -      url: '/-/user/token/%40foo%2F',
    -      opts: {
    -        '//registry.npmjs.org/:_authToken': '@foo/',
    -        registry: 'https://registry.npmjs.org/',
    -        method: 'DELETE',
    -        ignoreBody: true,
    -      },
    +t.test('token logout - project config', async t => {
    +  const { npm, home, logs, prefix } = await loadMockNpm(t, {
    +    homeDir: {
    +      '.npmrc': [
    +        '//registry.npmjs.org/:_authToken=@foo/',
    +        'other-config=true',
    +      ].join('\n'),
         },
    -    'should call npm-registry-fetch with expected values'
    -  )
    +    prefixDir: {
    +      '.npmrc': [
    +        '//registry.npmjs.org/:_authToken=@bar/',
    +        'other-config=true',
    +      ].join('\n'),
    +    },
    +  })
     
    -  t.equal(await userRc(), 'other-config=true')
    +  const mockRegistry = new MockRegistry({ tap: t, registry: 'https://registry.npmjs.org/' })
    +  mockRegistry.logout('@bar/')
    +  await npm.exec('logout', [])
    +
    +  t.equal(
    +    logs.verbose.find(l => l[0] === 'logout')[1],
    +    'clearing token for https://registry.npmjs.org/',
    +    'should log message with correct registry'
    +  )
    +  const userRc = await fs.readFile(join(home, '.npmrc'), 'utf-8')
    +  t.equal(userRc.trim(), [
    +    '//registry.npmjs.org/:_authToken=@foo/',
    +    'other-config=true',
    +  ].join('\n'), 'leaves user config alone')
    +  t.equal(
    +    logs.verbose.find(l => l[0] === 'logout')[1],
    +    'clearing token for https://registry.npmjs.org/',
    +    'should log message with correct registry'
    +  )
    +  const projectRc = await fs.readFile(join(prefix, '.npmrc'), 'utf-8')
    +  t.equal(projectRc.trim(), 'other-config=true', 'removes project config')
     })
    diff --git a/deps/npm/test/lib/commands/org.js b/deps/npm/test/lib/commands/org.js
    index 5c239295c33432..ed8fb238c4b0d8 100644
    --- a/deps/npm/test/lib/commands/org.js
    +++ b/deps/npm/test/lib/commands/org.js
    @@ -1,5 +1,4 @@
     const t = require('tap')
    -const ansiTrim = require('strip-ansi')
     const mockNpm = require('../../fixtures/mock-npm')
     
     const mockOrg = async (t, { orgSize = 1, orgList = {}, ...npmOpts } = {}) => {
    @@ -427,7 +426,8 @@ t.test('npm org ls', async t => {
         },
         'receieved the correct args'
       )
    -  const out = ansiTrim(outputs[0][0])
    +  const { default: stripAnsi } = await import('strip-ansi')
    +  const out = stripAnsi(outputs[0][0])
       t.match(out, /one.*developer/, 'contains the developer member')
       t.match(out, /two.*admin/, 'contains the admin member')
       t.match(out, /three.*owner/, 'contains the owner member')
    @@ -452,7 +452,8 @@ t.test('npm org ls - user filter', async t => {
         },
         'receieved the correct args'
       )
    -  const out = ansiTrim(outputs[0][0])
    +  const { default: stripAnsi } = await import('strip-ansi')
    +  const out = stripAnsi(outputs[0][0])
       t.match(out, /username.*admin/, 'contains the filtered member')
       t.notMatch(out, /missing.*admin/, 'does not contain other members')
     })
    @@ -475,7 +476,8 @@ t.test('npm org ls - user filter, missing user', async t => {
         },
         'receieved the correct args'
       )
    -  const out = ansiTrim(outputs[0][0])
    +  const { default: stripAnsi } = await import('strip-ansi')
    +  const out = stripAnsi(outputs[0][0])
       t.notMatch(out, /username/, 'does not contain the requested member')
       t.notMatch(out, /missing.*admin/, 'does not contain other members')
     })
    diff --git a/deps/npm/test/lib/commands/pkg.js b/deps/npm/test/lib/commands/pkg.js
    index e915ef942410f5..168870f59d9d1e 100644
    --- a/deps/npm/test/lib/commands/pkg.js
    +++ b/deps/npm/test/lib/commands/pkg.js
    @@ -83,6 +83,50 @@ t.test('get single arg', async t => {
       )
     })
     
    +t.test('get multiple arg', async t => {
    +  const { pkg, OUTPUT } = await mockNpm(t, {
    +    prefixDir: {
    +      'package.json': JSON.stringify({
    +        name: 'foo',
    +        version: '1.1.1',
    +      }),
    +    },
    +  })
    +
    +  await pkg('get', 'name', 'version')
    +
    +  t.strictSame(
    +    JSON.parse(OUTPUT()),
    +    {
    +      name: 'foo',
    +      version: '1.1.1',
    +    },
    +    'should print retrieved package.json field'
    +  )
    +})
    +
    +t.test('get multiple arg with empty value', async t => {
    +  const { pkg, OUTPUT } = await mockNpm(t, {
    +    prefixDir: {
    +      'package.json': JSON.stringify({
    +        name: 'foo',
    +        author: '',
    +      }),
    +    },
    +  })
    +
    +  await pkg('get', 'name', 'author')
    +
    +  t.strictSame(
    +    JSON.parse(OUTPUT()),
    +    {
    +      name: 'foo',
    +      author: '',
    +    },
    +    'should print retrieved package.json field regardless of empty value'
    +  )
    +})
    +
     t.test('get nested arg', async t => {
       const { pkg, OUTPUT } = await mockNpm(t, {
         prefixDir: {
    @@ -618,6 +662,43 @@ t.test('workspaces', async t => {
       )
     })
     
    +t.test('single workspace', async t => {
    +  const { pkg, OUTPUT } = await mockNpm(t, {
    +    prefixDir: {
    +      'package.json': JSON.stringify({
    +        name: 'root',
    +        version: '1.0.0',
    +        workspaces: [
    +          'packages/*',
    +        ],
    +      }),
    +      packages: {
    +        a: {
    +          'package.json': JSON.stringify({
    +            name: 'a',
    +            version: '1.0.0',
    +          }),
    +        },
    +        b: {
    +          'package.json': JSON.stringify({
    +            name: 'b',
    +            version: '1.2.3',
    +          }),
    +        },
    +      },
    +    },
    +    config: { workspace: ['packages/a'] },
    +  })
    +
    +  await pkg('get', 'name', 'version')
    +
    +  t.strictSame(
    +    JSON.parse(OUTPUT()),
    +    { a: { name: 'a', version: '1.0.0' } },
    +    'should only return info for one workspace'
    +  )
    +})
    +
     t.test('fix', async t => {
       const { pkg, readPackageJson } = await mockNpm(t, {
         prefixDir: {
    diff --git a/deps/npm/test/lib/commands/view.js b/deps/npm/test/lib/commands/view.js
    index ca07ef9eec2ff6..a99c8d6242212c 100644
    --- a/deps/npm/test/lib/commands/view.js
    +++ b/deps/npm/test/lib/commands/view.js
    @@ -101,6 +101,7 @@ const packument = (nv, opts) => {
             email: 'foo@yellow.com',
             twitter: 'foo',
           },
    +      empty: '',
           readme: 'a very useful readme',
           versions: {
             '1.0.0': {
    @@ -425,6 +426,11 @@ t.test('specific field names', async t => {
         await view.exec(['yellow@1.x.x', 'maintainers.name'])
         t.matchSnapshot(outputs.join('\n'))
       })
    +
    +  t.test('fields with empty values', async t => {
    +    await view.exec(['yellow', 'empty'])
    +    t.matchSnapshot(outputs.join('\n'))
    +  })
     })
     
     t.test('throw error if global mode', async t => {
    diff --git a/deps/npm/test/lib/utils/open-url.js b/deps/npm/test/lib/utils/open-url.js
    index 0ce1b57aa5f9f7..dab7b41b92f1fb 100644
    --- a/deps/npm/test/lib/utils/open-url.js
    +++ b/deps/npm/test/lib/utils/open-url.js
    @@ -124,7 +124,7 @@ t.test('prints where to go when given browser does not exist', async t => {
       const { openerUrl, openerOpts, joinedOutput } = await mockOpenUrl(t,
         ['https://www.npmjs.com', 'npm home'],
         {
    -      openerResult: Object.assign(new Error('failed'), { code: 'ENOENT' }),
    +      openerResult: Object.assign(new Error('failed'), { code: 127 }),
         }
       )
     
    diff --git a/deps/npm/test/lib/utils/sbom-cyclonedx.js b/deps/npm/test/lib/utils/sbom-cyclonedx.js
    index 540feb9eb0ee34..da9b3f757988b4 100644
    --- a/deps/npm/test/lib/utils/sbom-cyclonedx.js
    +++ b/deps/npm/test/lib/utils/sbom-cyclonedx.js
    @@ -190,6 +190,20 @@ t.test('single node - with license expression', t => {
       t.end()
     })
     
    +t.test('single node - with license object', t => {
    +  const pkg = {
    +    ...rootPkg,
    +    license: {
    +      type: 'MIT',
    +      url: 'http://github.com/kriskowal/q/raw/master/LICENSE',
    +    },
    +  }
    +  const node = { ...root, package: pkg }
    +  const res = cyclonedxOutput({ npm, nodes: [node] })
    +  t.matchSnapshot(JSON.stringify(res))
    +  t.end()
    +})
    +
     t.test('single node - from git url', t => {
       const node = { ...root, type: 'git', resolved: 'https://github.com/foo/bar#1234' }
       const res = cyclonedxOutput({ npm, nodes: [node] })
    @@ -205,13 +219,15 @@ t.test('single node - no package info', t => {
     })
     
     t.test('node - with deps', t => {
    -  const node = { ...root,
    +  const node = {
    +    ...root,
         edgesOut: [
           { to: dep1 },
           { to: dep2 },
           { to: undefined },
           { to: { pkgid: 'foo' } },
    -    ] }
    +    ],
    +  }
       const res = cyclonedxOutput({ npm, nodes: [node, dep1, dep2, dep2Link] })
       t.matchSnapshot(JSON.stringify(res))
       t.end()
    diff --git a/deps/npm/test/lib/utils/sbom-spdx.js b/deps/npm/test/lib/utils/sbom-spdx.js
    index 74f6c3f34e71c4..d69e85667dc85b 100644
    --- a/deps/npm/test/lib/utils/sbom-spdx.js
    +++ b/deps/npm/test/lib/utils/sbom-spdx.js
    @@ -109,6 +109,36 @@ t.test('single node - application package type', t => {
       t.end()
     })
     
    +t.test('single node - with single license', t => {
    +  const pkg = { ...rootPkg, license: 'ISC' }
    +  const node = { ...root, package: pkg }
    +  const res = spdxOutput({ npm, nodes: [node] })
    +  t.matchSnapshot(JSON.stringify(res))
    +  t.end()
    +})
    +
    +t.test('single node - with license object', t => {
    +  const pkg = {
    +    ...rootPkg,
    +    license: {
    +      type: 'MIT',
    +      url: 'http://github.com/kriskowal/q/raw/master/LICENSE',
    +    },
    +  }
    +  const node = { ...root, package: pkg }
    +  const res = spdxOutput({ npm, nodes: [node] })
    +  t.matchSnapshot(JSON.stringify(res))
    +  t.end()
    +})
    +
    +t.test('single node - with license expression', t => {
    +  const pkg = { ...rootPkg, license: '(MIT OR Apache-2.0)' }
    +  const node = { ...root, package: pkg }
    +  const res = spdxOutput({ npm, nodes: [node] })
    +  t.matchSnapshot(JSON.stringify(res))
    +  t.end()
    +})
    +
     t.test('single node - with description', t => {
       const pkg = { ...rootPkg, description: 'Package description' }
       const node = { ...root, package: pkg }
    diff --git a/deps/openssl/BUILD.gn b/deps/openssl/BUILD.gn
    new file mode 100644
    index 00000000000000..7d2db10a84c6c4
    --- /dev/null
    +++ b/deps/openssl/BUILD.gn
    @@ -0,0 +1,14 @@
    +##############################################################################
    +#                                                                            #
    +#                       DO NOT EDIT THIS FILE!                               #
    +#                                                                            #
    +##############################################################################
    +
    +# This file is used by GN for building, which is NOT the build system used for
    +# building official binaries.
    +# Please modify the gyp files if you are making changes to build system.
    +
    +import("unofficial.gni")
    +
    +openssl_gn_build("openssl") {
    +}
    diff --git a/deps/openssl/config/archs/BSD-x86/asm/configdata.pm b/deps/openssl/config/archs/BSD-x86/asm/configdata.pm
    index 667d9eb6c472cd..2eec8ceaa21cb7 100644
    --- a/deps/openssl/config/archs/BSD-x86/asm/configdata.pm
    +++ b/deps/openssl/config/archs/BSD-x86/asm/configdata.pm
    @@ -156,7 +156,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -203,7 +203,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -255,11 +255,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "BSD-x86",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/BSD-x86/asm/crypto/buildinf.h b/deps/openssl/config/archs/BSD-x86/asm/crypto/buildinf.h
    index c83c080bcb3ade..b5d8c7c8adce23 100644
    --- a/deps/openssl/config/archs/BSD-x86/asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/BSD-x86/asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: BSD-x86"
    -#define DATE "built on: Sun Aug  6 00:25:19 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:48:37 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/BSD-x86/asm/include/openssl/opensslv.h b/deps/openssl/config/archs/BSD-x86/asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/BSD-x86/asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/BSD-x86/asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/BSD-x86/asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/BSD-x86/asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/BSD-x86/asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/BSD-x86/asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/BSD-x86/asm_avx2/configdata.pm b/deps/openssl/config/archs/BSD-x86/asm_avx2/configdata.pm
    index d21a502b43b514..b9fef9eebf98a6 100644
    --- a/deps/openssl/config/archs/BSD-x86/asm_avx2/configdata.pm
    +++ b/deps/openssl/config/archs/BSD-x86/asm_avx2/configdata.pm
    @@ -156,7 +156,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -203,7 +203,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -255,11 +255,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "BSD-x86",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/BSD-x86/asm_avx2/crypto/buildinf.h b/deps/openssl/config/archs/BSD-x86/asm_avx2/crypto/buildinf.h
    index b3e839decc98ce..4b373bd0dc21f4 100644
    --- a/deps/openssl/config/archs/BSD-x86/asm_avx2/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/BSD-x86/asm_avx2/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: BSD-x86"
    -#define DATE "built on: Sun Aug  6 00:25:40 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:48:56 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/BSD-x86/asm_avx2/include/openssl/opensslv.h b/deps/openssl/config/archs/BSD-x86/asm_avx2/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/BSD-x86/asm_avx2/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/BSD-x86/asm_avx2/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/BSD-x86/asm_avx2/include/openssl/pkcs7.h b/deps/openssl/config/archs/BSD-x86/asm_avx2/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/BSD-x86/asm_avx2/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/BSD-x86/asm_avx2/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/BSD-x86/no-asm/configdata.pm b/deps/openssl/config/archs/BSD-x86/no-asm/configdata.pm
    index df06e22c5669e8..65137fe6dcc5b3 100644
    --- a/deps/openssl/config/archs/BSD-x86/no-asm/configdata.pm
    +++ b/deps/openssl/config/archs/BSD-x86/no-asm/configdata.pm
    @@ -154,7 +154,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -202,7 +202,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-asm no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -255,11 +255,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "BSD-x86",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/BSD-x86/no-asm/crypto/buildinf.h b/deps/openssl/config/archs/BSD-x86/no-asm/crypto/buildinf.h
    index 0b2dc3af6c4db6..edf452c92abb33 100644
    --- a/deps/openssl/config/archs/BSD-x86/no-asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/BSD-x86/no-asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: BSD-x86"
    -#define DATE "built on: Sun Aug  6 00:26:00 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:49:16 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/BSD-x86/no-asm/include/openssl/opensslv.h b/deps/openssl/config/archs/BSD-x86/no-asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/BSD-x86/no-asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/BSD-x86/no-asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/BSD-x86/no-asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/BSD-x86/no-asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/BSD-x86/no-asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/BSD-x86/no-asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/BSD-x86_64/asm/configdata.pm b/deps/openssl/config/archs/BSD-x86_64/asm/configdata.pm
    index f3476682006a8a..82a08c7ee72579 100644
    --- a/deps/openssl/config/archs/BSD-x86_64/asm/configdata.pm
    +++ b/deps/openssl/config/archs/BSD-x86_64/asm/configdata.pm
    @@ -156,7 +156,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -203,7 +203,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -255,11 +255,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "BSD-x86_64",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/BSD-x86_64/asm/crypto/buildinf.h b/deps/openssl/config/archs/BSD-x86_64/asm/crypto/buildinf.h
    index 8220828c4d379e..9b2212f3ae4bd1 100644
    --- a/deps/openssl/config/archs/BSD-x86_64/asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/BSD-x86_64/asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: BSD-x86_64"
    -#define DATE "built on: Sun Aug  6 00:26:19 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:49:35 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/BSD-x86_64/asm/include/openssl/opensslv.h b/deps/openssl/config/archs/BSD-x86_64/asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/BSD-x86_64/asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/BSD-x86_64/asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/BSD-x86_64/asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/BSD-x86_64/asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/BSD-x86_64/asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/BSD-x86_64/asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/BSD-x86_64/asm_avx2/configdata.pm b/deps/openssl/config/archs/BSD-x86_64/asm_avx2/configdata.pm
    index 07333980e3d535..397887f1e385f7 100644
    --- a/deps/openssl/config/archs/BSD-x86_64/asm_avx2/configdata.pm
    +++ b/deps/openssl/config/archs/BSD-x86_64/asm_avx2/configdata.pm
    @@ -156,7 +156,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -203,7 +203,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -255,11 +255,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "BSD-x86_64",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/BSD-x86_64/asm_avx2/crypto/buildinf.h b/deps/openssl/config/archs/BSD-x86_64/asm_avx2/crypto/buildinf.h
    index 0141bc595c4669..1148cc2a577c0c 100644
    --- a/deps/openssl/config/archs/BSD-x86_64/asm_avx2/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/BSD-x86_64/asm_avx2/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: BSD-x86_64"
    -#define DATE "built on: Sun Aug  6 00:26:43 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:49:58 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/BSD-x86_64/asm_avx2/include/openssl/opensslv.h b/deps/openssl/config/archs/BSD-x86_64/asm_avx2/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/BSD-x86_64/asm_avx2/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/BSD-x86_64/asm_avx2/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/BSD-x86_64/asm_avx2/include/openssl/pkcs7.h b/deps/openssl/config/archs/BSD-x86_64/asm_avx2/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/BSD-x86_64/asm_avx2/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/BSD-x86_64/asm_avx2/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/BSD-x86_64/no-asm/configdata.pm b/deps/openssl/config/archs/BSD-x86_64/no-asm/configdata.pm
    index daa479b8c190aa..3a36a6286ecc1e 100644
    --- a/deps/openssl/config/archs/BSD-x86_64/no-asm/configdata.pm
    +++ b/deps/openssl/config/archs/BSD-x86_64/no-asm/configdata.pm
    @@ -154,7 +154,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -202,7 +202,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-asm no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -255,11 +255,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "BSD-x86_64",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/BSD-x86_64/no-asm/crypto/buildinf.h b/deps/openssl/config/archs/BSD-x86_64/no-asm/crypto/buildinf.h
    index f1fbc792476400..d9add13d2a3d32 100644
    --- a/deps/openssl/config/archs/BSD-x86_64/no-asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/BSD-x86_64/no-asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: BSD-x86_64"
    -#define DATE "built on: Sun Aug  6 00:27:07 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:50:22 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/BSD-x86_64/no-asm/include/openssl/opensslv.h b/deps/openssl/config/archs/BSD-x86_64/no-asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/BSD-x86_64/no-asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/BSD-x86_64/no-asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/BSD-x86_64/no-asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/BSD-x86_64/no-asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/BSD-x86_64/no-asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/BSD-x86_64/no-asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/VC-WIN32/asm/configdata.pm b/deps/openssl/config/archs/VC-WIN32/asm/configdata.pm
    index ca62a99b20e7e9..8bf601f3902773 100644
    --- a/deps/openssl/config/archs/VC-WIN32/asm/configdata.pm
    +++ b/deps/openssl/config/archs/VC-WIN32/asm/configdata.pm
    @@ -165,7 +165,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -216,7 +216,7 @@ our %config = (
         ],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -268,11 +268,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "VC-WIN32",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "lib",
    @@ -287,7 +287,7 @@ our %target = (
         "LDFLAGS" => "/nologo /debug",
         "MT" => "mt",
         "MTFLAGS" => "-nologo",
    -    "RANLIB" => "CODE(0x55c06cf5ea80)",
    +    "RANLIB" => "CODE(0x558d4506ace0)",
         "RC" => "rc",
         "_conf_fname_int" => [
             "Configurations/00-base-templates.conf",
    diff --git a/deps/openssl/config/archs/VC-WIN32/asm/crypto/buildinf.h b/deps/openssl/config/archs/VC-WIN32/asm/crypto/buildinf.h
    index b4978c23fed544..8a88b5d57d37eb 100644
    --- a/deps/openssl/config/archs/VC-WIN32/asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/VC-WIN32/asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: "
    -#define DATE "built on: Sun Aug  6 00:43:26 2023 UTC"
    +#define DATE "built on: Thu Oct 26 15:04:24 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/VC-WIN32/asm/include/openssl/opensslv.h b/deps/openssl/config/archs/VC-WIN32/asm/include/openssl/opensslv.h
    index 38b44f1054ad3d..a410f0eddf361c 100644
    --- a/deps/openssl/config/archs/VC-WIN32/asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/VC-WIN32/asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/VC-WIN32/asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/VC-WIN32/asm/include/openssl/pkcs7.h
    index 3978fd087bca3b..0a95a93e59e262 100644
    --- a/deps/openssl/config/archs/VC-WIN32/asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/VC-WIN32/asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/VC-WIN32/asm_avx2/configdata.pm b/deps/openssl/config/archs/VC-WIN32/asm_avx2/configdata.pm
    index 62ccddd60f494f..b0c0b52ee69d56 100644
    --- a/deps/openssl/config/archs/VC-WIN32/asm_avx2/configdata.pm
    +++ b/deps/openssl/config/archs/VC-WIN32/asm_avx2/configdata.pm
    @@ -165,7 +165,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -216,7 +216,7 @@ our %config = (
         ],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -268,11 +268,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "VC-WIN32",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "lib",
    @@ -287,7 +287,7 @@ our %target = (
         "LDFLAGS" => "/nologo /debug",
         "MT" => "mt",
         "MTFLAGS" => "-nologo",
    -    "RANLIB" => "CODE(0x55b8a711a640)",
    +    "RANLIB" => "CODE(0x55f14f6dce20)",
         "RC" => "rc",
         "_conf_fname_int" => [
             "Configurations/00-base-templates.conf",
    diff --git a/deps/openssl/config/archs/VC-WIN32/asm_avx2/crypto/buildinf.h b/deps/openssl/config/archs/VC-WIN32/asm_avx2/crypto/buildinf.h
    index 00774a2a9b5c85..82019d38ddffd7 100644
    --- a/deps/openssl/config/archs/VC-WIN32/asm_avx2/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/VC-WIN32/asm_avx2/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: "
    -#define DATE "built on: Sun Aug  6 00:43:47 2023 UTC"
    +#define DATE "built on: Thu Oct 26 15:04:43 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/VC-WIN32/asm_avx2/include/openssl/opensslv.h b/deps/openssl/config/archs/VC-WIN32/asm_avx2/include/openssl/opensslv.h
    index 38b44f1054ad3d..a410f0eddf361c 100644
    --- a/deps/openssl/config/archs/VC-WIN32/asm_avx2/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/VC-WIN32/asm_avx2/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/VC-WIN32/asm_avx2/include/openssl/pkcs7.h b/deps/openssl/config/archs/VC-WIN32/asm_avx2/include/openssl/pkcs7.h
    index 3978fd087bca3b..0a95a93e59e262 100644
    --- a/deps/openssl/config/archs/VC-WIN32/asm_avx2/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/VC-WIN32/asm_avx2/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/VC-WIN32/no-asm/configdata.pm b/deps/openssl/config/archs/VC-WIN32/no-asm/configdata.pm
    index 9a5d93c30fa1ab..40491bd28bd763 100644
    --- a/deps/openssl/config/archs/VC-WIN32/no-asm/configdata.pm
    +++ b/deps/openssl/config/archs/VC-WIN32/no-asm/configdata.pm
    @@ -163,7 +163,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -215,7 +215,7 @@ our %config = (
         ],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-asm no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -268,11 +268,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "VC-WIN32",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "lib",
    @@ -287,7 +287,7 @@ our %target = (
         "LDFLAGS" => "/nologo /debug",
         "MT" => "mt",
         "MTFLAGS" => "-nologo",
    -    "RANLIB" => "CODE(0x55ac94d0db28)",
    +    "RANLIB" => "CODE(0x55dfb3e6a5e8)",
         "RC" => "rc",
         "_conf_fname_int" => [
             "Configurations/00-base-templates.conf",
    diff --git a/deps/openssl/config/archs/VC-WIN32/no-asm/crypto/buildinf.h b/deps/openssl/config/archs/VC-WIN32/no-asm/crypto/buildinf.h
    index b19b8b48b13928..3894b1e4a023f9 100644
    --- a/deps/openssl/config/archs/VC-WIN32/no-asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/VC-WIN32/no-asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: "
    -#define DATE "built on: Sun Aug  6 00:44:09 2023 UTC"
    +#define DATE "built on: Thu Oct 26 15:05:01 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/VC-WIN32/no-asm/include/openssl/opensslv.h b/deps/openssl/config/archs/VC-WIN32/no-asm/include/openssl/opensslv.h
    index 38b44f1054ad3d..a410f0eddf361c 100644
    --- a/deps/openssl/config/archs/VC-WIN32/no-asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/VC-WIN32/no-asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/VC-WIN32/no-asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/VC-WIN32/no-asm/include/openssl/pkcs7.h
    index 3978fd087bca3b..0a95a93e59e262 100644
    --- a/deps/openssl/config/archs/VC-WIN32/no-asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/VC-WIN32/no-asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/VC-WIN64-ARM/no-asm/configdata.pm b/deps/openssl/config/archs/VC-WIN64-ARM/no-asm/configdata.pm
    index 4c747db9cfb5c7..e450e0c1904e51 100644
    --- a/deps/openssl/config/archs/VC-WIN64-ARM/no-asm/configdata.pm
    +++ b/deps/openssl/config/archs/VC-WIN64-ARM/no-asm/configdata.pm
    @@ -163,7 +163,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -213,7 +213,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-asm no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -266,11 +266,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "VC-WIN64-ARM",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "lib",
    @@ -283,7 +283,7 @@ our %target = (
         "LDFLAGS" => "/nologo /debug",
         "MT" => "mt",
         "MTFLAGS" => "-nologo",
    -    "RANLIB" => "CODE(0x56025ddf3078)",
    +    "RANLIB" => "CODE(0x55619ad3d968)",
         "RC" => "rc",
         "_conf_fname_int" => [
             "Configurations/00-base-templates.conf",
    diff --git a/deps/openssl/config/archs/VC-WIN64-ARM/no-asm/crypto/buildinf.h b/deps/openssl/config/archs/VC-WIN64-ARM/no-asm/crypto/buildinf.h
    index f32efe5d98eca3..2611edb7bd6bf2 100644
    --- a/deps/openssl/config/archs/VC-WIN64-ARM/no-asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/VC-WIN64-ARM/no-asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: VC-WIN64-ARM"
    -#define DATE "built on: Sun Aug  6 00:44:29 2023 UTC"
    +#define DATE "built on: Thu Oct 26 15:05:18 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/VC-WIN64-ARM/no-asm/include/openssl/opensslv.h b/deps/openssl/config/archs/VC-WIN64-ARM/no-asm/include/openssl/opensslv.h
    index 38b44f1054ad3d..a410f0eddf361c 100644
    --- a/deps/openssl/config/archs/VC-WIN64-ARM/no-asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/VC-WIN64-ARM/no-asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/VC-WIN64-ARM/no-asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/VC-WIN64-ARM/no-asm/include/openssl/pkcs7.h
    index 3978fd087bca3b..0a95a93e59e262 100644
    --- a/deps/openssl/config/archs/VC-WIN64-ARM/no-asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/VC-WIN64-ARM/no-asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/VC-WIN64A/asm/configdata.pm b/deps/openssl/config/archs/VC-WIN64A/asm/configdata.pm
    index 80443a734d38e4..ca90ef75c27121 100644
    --- a/deps/openssl/config/archs/VC-WIN64A/asm/configdata.pm
    +++ b/deps/openssl/config/archs/VC-WIN64A/asm/configdata.pm
    @@ -168,7 +168,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -219,7 +219,7 @@ our %config = (
         ],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -271,11 +271,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "VC-WIN64A",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "lib",
    @@ -290,7 +290,7 @@ our %target = (
         "LDFLAGS" => "/nologo /debug",
         "MT" => "mt",
         "MTFLAGS" => "-nologo",
    -    "RANLIB" => "CODE(0x56532d60fad0)",
    +    "RANLIB" => "CODE(0x559ccffc4580)",
         "RC" => "rc",
         "_conf_fname_int" => [
             "Configurations/00-base-templates.conf",
    @@ -356,7 +356,7 @@ our %target = (
         "mtoutflag" => "-outputresource:",
         "multilib" => "-x64",
         "perl_platform" => "Windows::MSVC",
    -    "perlasm_scheme" => "auto",
    +    "perlasm_scheme" => "nasm",
         "rcoutflag" => "/fo",
         "shared_cflag" => "",
         "shared_defflag" => "",
    diff --git a/deps/openssl/config/archs/VC-WIN64A/asm/crypto/buildinf.h b/deps/openssl/config/archs/VC-WIN64A/asm/crypto/buildinf.h
    index 06a91884502b77..8daa2d52f03a84 100644
    --- a/deps/openssl/config/archs/VC-WIN64A/asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/VC-WIN64A/asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: "
    -#define DATE "built on: Sun Aug  6 00:42:10 2023 UTC"
    +#define DATE "built on: Thu Oct 26 15:03:22 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/VC-WIN64A/asm/crypto/poly1305/poly1305-x86_64.asm b/deps/openssl/config/archs/VC-WIN64A/asm/crypto/poly1305/poly1305-x86_64.asm
    index 26f683384d1806..fb3823608c949b 100644
    --- a/deps/openssl/config/archs/VC-WIN64A/asm/crypto/poly1305/poly1305-x86_64.asm
    +++ b/deps/openssl/config/archs/VC-WIN64A/asm/crypto/poly1305/poly1305-x86_64.asm
    @@ -46,11 +46,6 @@ $L$SEH_begin_poly1305_init:
     	lea	rax,[poly1305_blocks_avx2]
     	bt	r9,37
     	cmovc	r10,rax
    -	mov	rax,2149646336
    -	shr	r9,32
    -	and	r9,rax
    -	cmp	r9,rax
    -	je	NEAR $L$init_base2_44
     	mov	rax,0x0ffffffc0fffffff
     	mov	rcx,0x0ffffffc0ffffffc
     	and	rax,QWORD[rsi]
    @@ -2605,1029 +2600,6 @@ $L$do_avx512_epilogue:
     	DB	0F3h,0C3h		;repret
     
     $L$SEH_end_poly1305_blocks_avx512:
    -
    -ALIGN	32
    -poly1305_init_base2_44:
    -	mov	QWORD[8+rsp],rdi	;WIN64 prologue
    -	mov	QWORD[16+rsp],rsi
    -	mov	rax,rsp
    -$L$SEH_begin_poly1305_init_base2_44:
    -	mov	rdi,rcx
    -	mov	rsi,rdx
    -	mov	rdx,r8
    -
    -
    -
    -	xor	rax,rax
    -	mov	QWORD[rdi],rax
    -	mov	QWORD[8+rdi],rax
    -	mov	QWORD[16+rdi],rax
    -
    -$L$init_base2_44:
    -	lea	r10,[poly1305_blocks_vpmadd52]
    -	lea	r11,[poly1305_emit_base2_44]
    -
    -	mov	rax,0x0ffffffc0fffffff
    -	mov	rcx,0x0ffffffc0ffffffc
    -	and	rax,QWORD[rsi]
    -	mov	r8,0x00000fffffffffff
    -	and	rcx,QWORD[8+rsi]
    -	mov	r9,0x00000fffffffffff
    -	and	r8,rax
    -	shrd	rax,rcx,44
    -	mov	QWORD[40+rdi],r8
    -	and	rax,r9
    -	shr	rcx,24
    -	mov	QWORD[48+rdi],rax
    -	lea	rax,[rax*4+rax]
    -	mov	QWORD[56+rdi],rcx
    -	shl	rax,2
    -	lea	rcx,[rcx*4+rcx]
    -	shl	rcx,2
    -	mov	QWORD[24+rdi],rax
    -	mov	QWORD[32+rdi],rcx
    -	mov	QWORD[64+rdi],-1
    -	mov	QWORD[rdx],r10
    -	mov	QWORD[8+rdx],r11
    -	mov	eax,1
    -	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
    -	mov	rsi,QWORD[16+rsp]
    -	DB	0F3h,0C3h		;repret
    -
    -$L$SEH_end_poly1305_init_base2_44:
    -
    -ALIGN	32
    -poly1305_blocks_vpmadd52:
    -	mov	QWORD[8+rsp],rdi	;WIN64 prologue
    -	mov	QWORD[16+rsp],rsi
    -	mov	rax,rsp
    -$L$SEH_begin_poly1305_blocks_vpmadd52:
    -	mov	rdi,rcx
    -	mov	rsi,rdx
    -	mov	rdx,r8
    -	mov	rcx,r9
    -
    -
    -
    -DB	243,15,30,250
    -	shr	rdx,4
    -	jz	NEAR $L$no_data_vpmadd52
    -
    -	shl	rcx,40
    -	mov	r8,QWORD[64+rdi]
    -
    -
    -
    -
    -
    -
    -	mov	rax,3
    -	mov	r10,1
    -	cmp	rdx,4
    -	cmovae	rax,r10
    -	test	r8,r8
    -	cmovns	rax,r10
    -
    -	and	rax,rdx
    -	jz	NEAR $L$blocks_vpmadd52_4x
    -
    -	sub	rdx,rax
    -	mov	r10d,7
    -	mov	r11d,1
    -	kmovw	k7,r10d
    -	lea	r10,[$L$2_44_inp_permd]
    -	kmovw	k1,r11d
    -
    -	vmovq	xmm21,rcx
    -	vmovdqa64	ymm19,YMMWORD[r10]
    -	vmovdqa64	ymm20,YMMWORD[32+r10]
    -	vpermq	ymm21,ymm21,0xcf
    -	vmovdqa64	ymm22,YMMWORD[64+r10]
    -
    -	vmovdqu64	ymm16{k7}{z},[rdi]
    -	vmovdqu64	ymm3{k7}{z},[40+rdi]
    -	vmovdqu64	ymm4{k7}{z},[32+rdi]
    -	vmovdqu64	ymm5{k7}{z},[24+rdi]
    -
    -	vmovdqa64	ymm23,YMMWORD[96+r10]
    -	vmovdqa64	ymm24,YMMWORD[128+r10]
    -
    -	jmp	NEAR $L$oop_vpmadd52
    -
    -ALIGN	32
    -$L$oop_vpmadd52:
    -	vmovdqu32	xmm18,XMMWORD[rsi]
    -	lea	rsi,[16+rsi]
    -
    -	vpermd	ymm18,ymm19,ymm18
    -	vpsrlvq	ymm18,ymm18,ymm20
    -	vpandq	ymm18,ymm18,ymm22
    -	vporq	ymm18,ymm18,ymm21
    -
    -	vpaddq	ymm16,ymm16,ymm18
    -
    -	vpermq	ymm0{k7}{z},ymm16,0
    -	vpermq	ymm1{k7}{z},ymm16,85
    -	vpermq	ymm2{k7}{z},ymm16,170
    -
    -	vpxord	ymm16,ymm16,ymm16
    -	vpxord	ymm17,ymm17,ymm17
    -
    -	vpmadd52luq	ymm16,ymm0,ymm3
    -	vpmadd52huq	ymm17,ymm0,ymm3
    -
    -	vpmadd52luq	ymm16,ymm1,ymm4
    -	vpmadd52huq	ymm17,ymm1,ymm4
    -
    -	vpmadd52luq	ymm16,ymm2,ymm5
    -	vpmadd52huq	ymm17,ymm2,ymm5
    -
    -	vpsrlvq	ymm18,ymm16,ymm23
    -	vpsllvq	ymm17,ymm17,ymm24
    -	vpandq	ymm16,ymm16,ymm22
    -
    -	vpaddq	ymm17,ymm17,ymm18
    -
    -	vpermq	ymm17,ymm17,147
    -
    -	vpaddq	ymm16,ymm16,ymm17
    -
    -	vpsrlvq	ymm18,ymm16,ymm23
    -	vpandq	ymm16,ymm16,ymm22
    -
    -	vpermq	ymm18,ymm18,147
    -
    -	vpaddq	ymm16,ymm16,ymm18
    -
    -	vpermq	ymm18{k1}{z},ymm16,147
    -
    -	vpaddq	ymm16,ymm16,ymm18
    -	vpsllq	ymm18,ymm18,2
    -
    -	vpaddq	ymm16,ymm16,ymm18
    -
    -	dec	rax
    -	jnz	NEAR $L$oop_vpmadd52
    -
    -	vmovdqu64	YMMWORD[rdi]{k7},ymm16
    -
    -	test	rdx,rdx
    -	jnz	NEAR $L$blocks_vpmadd52_4x
    -
    -$L$no_data_vpmadd52:
    -	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
    -	mov	rsi,QWORD[16+rsp]
    -	DB	0F3h,0C3h		;repret
    -
    -$L$SEH_end_poly1305_blocks_vpmadd52:
    -
    -ALIGN	32
    -poly1305_blocks_vpmadd52_4x:
    -	mov	QWORD[8+rsp],rdi	;WIN64 prologue
    -	mov	QWORD[16+rsp],rsi
    -	mov	rax,rsp
    -$L$SEH_begin_poly1305_blocks_vpmadd52_4x:
    -	mov	rdi,rcx
    -	mov	rsi,rdx
    -	mov	rdx,r8
    -	mov	rcx,r9
    -
    -
    -
    -	shr	rdx,4
    -	jz	NEAR $L$no_data_vpmadd52_4x
    -
    -	shl	rcx,40
    -	mov	r8,QWORD[64+rdi]
    -
    -$L$blocks_vpmadd52_4x:
    -	vpbroadcastq	ymm31,rcx
    -
    -	vmovdqa64	ymm28,YMMWORD[$L$x_mask44]
    -	mov	eax,5
    -	vmovdqa64	ymm29,YMMWORD[$L$x_mask42]
    -	kmovw	k1,eax
    -
    -	test	r8,r8
    -	js	NEAR $L$init_vpmadd52
    -
    -	vmovq	xmm0,QWORD[rdi]
    -	vmovq	xmm1,QWORD[8+rdi]
    -	vmovq	xmm2,QWORD[16+rdi]
    -
    -	test	rdx,3
    -	jnz	NEAR $L$blocks_vpmadd52_2x_do
    -
    -$L$blocks_vpmadd52_4x_do:
    -	vpbroadcastq	ymm3,QWORD[64+rdi]
    -	vpbroadcastq	ymm4,QWORD[96+rdi]
    -	vpbroadcastq	ymm5,QWORD[128+rdi]
    -	vpbroadcastq	ymm16,QWORD[160+rdi]
    -
    -$L$blocks_vpmadd52_4x_key_loaded:
    -	vpsllq	ymm17,ymm5,2
    -	vpaddq	ymm17,ymm17,ymm5
    -	vpsllq	ymm17,ymm17,2
    -
    -	test	rdx,7
    -	jz	NEAR $L$blocks_vpmadd52_8x
    -
    -	vmovdqu64	ymm26,YMMWORD[rsi]
    -	vmovdqu64	ymm27,YMMWORD[32+rsi]
    -	lea	rsi,[64+rsi]
    -
    -	vpunpcklqdq	ymm25,ymm26,ymm27
    -	vpunpckhqdq	ymm27,ymm26,ymm27
    -
    -
    -
    -	vpsrlq	ymm26,ymm27,24
    -	vporq	ymm26,ymm26,ymm31
    -	vpaddq	ymm2,ymm2,ymm26
    -	vpandq	ymm24,ymm25,ymm28
    -	vpsrlq	ymm25,ymm25,44
    -	vpsllq	ymm27,ymm27,20
    -	vporq	ymm25,ymm25,ymm27
    -	vpandq	ymm25,ymm25,ymm28
    -
    -	sub	rdx,4
    -	jz	NEAR $L$tail_vpmadd52_4x
    -	jmp	NEAR $L$oop_vpmadd52_4x
    -	ud2
    -
    -ALIGN	32
    -$L$init_vpmadd52:
    -	vmovq	xmm16,QWORD[24+rdi]
    -	vmovq	xmm2,QWORD[56+rdi]
    -	vmovq	xmm17,QWORD[32+rdi]
    -	vmovq	xmm3,QWORD[40+rdi]
    -	vmovq	xmm4,QWORD[48+rdi]
    -
    -	vmovdqa	ymm0,ymm3
    -	vmovdqa	ymm1,ymm4
    -	vmovdqa	ymm5,ymm2
    -
    -	mov	eax,2
    -
    -$L$mul_init_vpmadd52:
    -	vpxorq	ymm18,ymm18,ymm18
    -	vpmadd52luq	ymm18,ymm16,ymm2
    -	vpxorq	ymm19,ymm19,ymm19
    -	vpmadd52huq	ymm19,ymm16,ymm2
    -	vpxorq	ymm20,ymm20,ymm20
    -	vpmadd52luq	ymm20,ymm17,ymm2
    -	vpxorq	ymm21,ymm21,ymm21
    -	vpmadd52huq	ymm21,ymm17,ymm2
    -	vpxorq	ymm22,ymm22,ymm22
    -	vpmadd52luq	ymm22,ymm3,ymm2
    -	vpxorq	ymm23,ymm23,ymm23
    -	vpmadd52huq	ymm23,ymm3,ymm2
    -
    -	vpmadd52luq	ymm18,ymm3,ymm0
    -	vpmadd52huq	ymm19,ymm3,ymm0
    -	vpmadd52luq	ymm20,ymm4,ymm0
    -	vpmadd52huq	ymm21,ymm4,ymm0
    -	vpmadd52luq	ymm22,ymm5,ymm0
    -	vpmadd52huq	ymm23,ymm5,ymm0
    -
    -	vpmadd52luq	ymm18,ymm17,ymm1
    -	vpmadd52huq	ymm19,ymm17,ymm1
    -	vpmadd52luq	ymm20,ymm3,ymm1
    -	vpmadd52huq	ymm21,ymm3,ymm1
    -	vpmadd52luq	ymm22,ymm4,ymm1
    -	vpmadd52huq	ymm23,ymm4,ymm1
    -
    -
    -
    -	vpsrlq	ymm30,ymm18,44
    -	vpsllq	ymm19,ymm19,8
    -	vpandq	ymm0,ymm18,ymm28
    -	vpaddq	ymm19,ymm19,ymm30
    -
    -	vpaddq	ymm20,ymm20,ymm19
    -
    -	vpsrlq	ymm30,ymm20,44
    -	vpsllq	ymm21,ymm21,8
    -	vpandq	ymm1,ymm20,ymm28
    -	vpaddq	ymm21,ymm21,ymm30
    -
    -	vpaddq	ymm22,ymm22,ymm21
    -
    -	vpsrlq	ymm30,ymm22,42
    -	vpsllq	ymm23,ymm23,10
    -	vpandq	ymm2,ymm22,ymm29
    -	vpaddq	ymm23,ymm23,ymm30
    -
    -	vpaddq	ymm0,ymm0,ymm23
    -	vpsllq	ymm23,ymm23,2
    -
    -	vpaddq	ymm0,ymm0,ymm23
    -
    -	vpsrlq	ymm30,ymm0,44
    -	vpandq	ymm0,ymm0,ymm28
    -
    -	vpaddq	ymm1,ymm1,ymm30
    -
    -	dec	eax
    -	jz	NEAR $L$done_init_vpmadd52
    -
    -	vpunpcklqdq	ymm4,ymm1,ymm4
    -	vpbroadcastq	xmm1,xmm1
    -	vpunpcklqdq	ymm5,ymm2,ymm5
    -	vpbroadcastq	xmm2,xmm2
    -	vpunpcklqdq	ymm3,ymm0,ymm3
    -	vpbroadcastq	xmm0,xmm0
    -
    -	vpsllq	ymm16,ymm4,2
    -	vpsllq	ymm17,ymm5,2
    -	vpaddq	ymm16,ymm16,ymm4
    -	vpaddq	ymm17,ymm17,ymm5
    -	vpsllq	ymm16,ymm16,2
    -	vpsllq	ymm17,ymm17,2
    -
    -	jmp	NEAR $L$mul_init_vpmadd52
    -	ud2
    -
    -ALIGN	32
    -$L$done_init_vpmadd52:
    -	vinserti128	ymm4,ymm1,xmm4,1
    -	vinserti128	ymm5,ymm2,xmm5,1
    -	vinserti128	ymm3,ymm0,xmm3,1
    -
    -	vpermq	ymm4,ymm4,216
    -	vpermq	ymm5,ymm5,216
    -	vpermq	ymm3,ymm3,216
    -
    -	vpsllq	ymm16,ymm4,2
    -	vpaddq	ymm16,ymm16,ymm4
    -	vpsllq	ymm16,ymm16,2
    -
    -	vmovq	xmm0,QWORD[rdi]
    -	vmovq	xmm1,QWORD[8+rdi]
    -	vmovq	xmm2,QWORD[16+rdi]
    -
    -	test	rdx,3
    -	jnz	NEAR $L$done_init_vpmadd52_2x
    -
    -	vmovdqu64	YMMWORD[64+rdi],ymm3
    -	vpbroadcastq	ymm3,xmm3
    -	vmovdqu64	YMMWORD[96+rdi],ymm4
    -	vpbroadcastq	ymm4,xmm4
    -	vmovdqu64	YMMWORD[128+rdi],ymm5
    -	vpbroadcastq	ymm5,xmm5
    -	vmovdqu64	YMMWORD[160+rdi],ymm16
    -	vpbroadcastq	ymm16,xmm16
    -
    -	jmp	NEAR $L$blocks_vpmadd52_4x_key_loaded
    -	ud2
    -
    -ALIGN	32
    -$L$done_init_vpmadd52_2x:
    -	vmovdqu64	YMMWORD[64+rdi],ymm3
    -	vpsrldq	ymm3,ymm3,8
    -	vmovdqu64	YMMWORD[96+rdi],ymm4
    -	vpsrldq	ymm4,ymm4,8
    -	vmovdqu64	YMMWORD[128+rdi],ymm5
    -	vpsrldq	ymm5,ymm5,8
    -	vmovdqu64	YMMWORD[160+rdi],ymm16
    -	vpsrldq	ymm16,ymm16,8
    -	jmp	NEAR $L$blocks_vpmadd52_2x_key_loaded
    -	ud2
    -
    -ALIGN	32
    -$L$blocks_vpmadd52_2x_do:
    -	vmovdqu64	ymm5{k1}{z},[((128+8))+rdi]
    -	vmovdqu64	ymm16{k1}{z},[((160+8))+rdi]
    -	vmovdqu64	ymm3{k1}{z},[((64+8))+rdi]
    -	vmovdqu64	ymm4{k1}{z},[((96+8))+rdi]
    -
    -$L$blocks_vpmadd52_2x_key_loaded:
    -	vmovdqu64	ymm26,YMMWORD[rsi]
    -	vpxorq	ymm27,ymm27,ymm27
    -	lea	rsi,[32+rsi]
    -
    -	vpunpcklqdq	ymm25,ymm26,ymm27
    -	vpunpckhqdq	ymm27,ymm26,ymm27
    -
    -
    -
    -	vpsrlq	ymm26,ymm27,24
    -	vporq	ymm26,ymm26,ymm31
    -	vpaddq	ymm2,ymm2,ymm26
    -	vpandq	ymm24,ymm25,ymm28
    -	vpsrlq	ymm25,ymm25,44
    -	vpsllq	ymm27,ymm27,20
    -	vporq	ymm25,ymm25,ymm27
    -	vpandq	ymm25,ymm25,ymm28
    -
    -	jmp	NEAR $L$tail_vpmadd52_2x
    -	ud2
    -
    -ALIGN	32
    -$L$oop_vpmadd52_4x:
    -
    -	vpaddq	ymm0,ymm0,ymm24
    -	vpaddq	ymm1,ymm1,ymm25
    -
    -	vpxorq	ymm18,ymm18,ymm18
    -	vpmadd52luq	ymm18,ymm16,ymm2
    -	vpxorq	ymm19,ymm19,ymm19
    -	vpmadd52huq	ymm19,ymm16,ymm2
    -	vpxorq	ymm20,ymm20,ymm20
    -	vpmadd52luq	ymm20,ymm17,ymm2
    -	vpxorq	ymm21,ymm21,ymm21
    -	vpmadd52huq	ymm21,ymm17,ymm2
    -	vpxorq	ymm22,ymm22,ymm22
    -	vpmadd52luq	ymm22,ymm3,ymm2
    -	vpxorq	ymm23,ymm23,ymm23
    -	vpmadd52huq	ymm23,ymm3,ymm2
    -
    -	vmovdqu64	ymm26,YMMWORD[rsi]
    -	vmovdqu64	ymm27,YMMWORD[32+rsi]
    -	lea	rsi,[64+rsi]
    -	vpmadd52luq	ymm18,ymm3,ymm0
    -	vpmadd52huq	ymm19,ymm3,ymm0
    -	vpmadd52luq	ymm20,ymm4,ymm0
    -	vpmadd52huq	ymm21,ymm4,ymm0
    -	vpmadd52luq	ymm22,ymm5,ymm0
    -	vpmadd52huq	ymm23,ymm5,ymm0
    -
    -	vpunpcklqdq	ymm25,ymm26,ymm27
    -	vpunpckhqdq	ymm27,ymm26,ymm27
    -	vpmadd52luq	ymm18,ymm17,ymm1
    -	vpmadd52huq	ymm19,ymm17,ymm1
    -	vpmadd52luq	ymm20,ymm3,ymm1
    -	vpmadd52huq	ymm21,ymm3,ymm1
    -	vpmadd52luq	ymm22,ymm4,ymm1
    -	vpmadd52huq	ymm23,ymm4,ymm1
    -
    -
    -
    -	vpsrlq	ymm30,ymm18,44
    -	vpsllq	ymm19,ymm19,8
    -	vpandq	ymm0,ymm18,ymm28
    -	vpaddq	ymm19,ymm19,ymm30
    -
    -	vpsrlq	ymm26,ymm27,24
    -	vporq	ymm26,ymm26,ymm31
    -	vpaddq	ymm20,ymm20,ymm19
    -
    -	vpsrlq	ymm30,ymm20,44
    -	vpsllq	ymm21,ymm21,8
    -	vpandq	ymm1,ymm20,ymm28
    -	vpaddq	ymm21,ymm21,ymm30
    -
    -	vpandq	ymm24,ymm25,ymm28
    -	vpsrlq	ymm25,ymm25,44
    -	vpsllq	ymm27,ymm27,20
    -	vpaddq	ymm22,ymm22,ymm21
    -
    -	vpsrlq	ymm30,ymm22,42
    -	vpsllq	ymm23,ymm23,10
    -	vpandq	ymm2,ymm22,ymm29
    -	vpaddq	ymm23,ymm23,ymm30
    -
    -	vpaddq	ymm2,ymm2,ymm26
    -	vpaddq	ymm0,ymm0,ymm23
    -	vpsllq	ymm23,ymm23,2
    -
    -	vpaddq	ymm0,ymm0,ymm23
    -	vporq	ymm25,ymm25,ymm27
    -	vpandq	ymm25,ymm25,ymm28
    -
    -	vpsrlq	ymm30,ymm0,44
    -	vpandq	ymm0,ymm0,ymm28
    -
    -	vpaddq	ymm1,ymm1,ymm30
    -
    -	sub	rdx,4
    -	jnz	NEAR $L$oop_vpmadd52_4x
    -
    -$L$tail_vpmadd52_4x:
    -	vmovdqu64	ymm5,YMMWORD[128+rdi]
    -	vmovdqu64	ymm16,YMMWORD[160+rdi]
    -	vmovdqu64	ymm3,YMMWORD[64+rdi]
    -	vmovdqu64	ymm4,YMMWORD[96+rdi]
    -
    -$L$tail_vpmadd52_2x:
    -	vpsllq	ymm17,ymm5,2
    -	vpaddq	ymm17,ymm17,ymm5
    -	vpsllq	ymm17,ymm17,2
    -
    -
    -	vpaddq	ymm0,ymm0,ymm24
    -	vpaddq	ymm1,ymm1,ymm25
    -
    -	vpxorq	ymm18,ymm18,ymm18
    -	vpmadd52luq	ymm18,ymm16,ymm2
    -	vpxorq	ymm19,ymm19,ymm19
    -	vpmadd52huq	ymm19,ymm16,ymm2
    -	vpxorq	ymm20,ymm20,ymm20
    -	vpmadd52luq	ymm20,ymm17,ymm2
    -	vpxorq	ymm21,ymm21,ymm21
    -	vpmadd52huq	ymm21,ymm17,ymm2
    -	vpxorq	ymm22,ymm22,ymm22
    -	vpmadd52luq	ymm22,ymm3,ymm2
    -	vpxorq	ymm23,ymm23,ymm23
    -	vpmadd52huq	ymm23,ymm3,ymm2
    -
    -	vpmadd52luq	ymm18,ymm3,ymm0
    -	vpmadd52huq	ymm19,ymm3,ymm0
    -	vpmadd52luq	ymm20,ymm4,ymm0
    -	vpmadd52huq	ymm21,ymm4,ymm0
    -	vpmadd52luq	ymm22,ymm5,ymm0
    -	vpmadd52huq	ymm23,ymm5,ymm0
    -
    -	vpmadd52luq	ymm18,ymm17,ymm1
    -	vpmadd52huq	ymm19,ymm17,ymm1
    -	vpmadd52luq	ymm20,ymm3,ymm1
    -	vpmadd52huq	ymm21,ymm3,ymm1
    -	vpmadd52luq	ymm22,ymm4,ymm1
    -	vpmadd52huq	ymm23,ymm4,ymm1
    -
    -
    -
    -
    -	mov	eax,1
    -	kmovw	k1,eax
    -	vpsrldq	ymm24,ymm18,8
    -	vpsrldq	ymm0,ymm19,8
    -	vpsrldq	ymm25,ymm20,8
    -	vpsrldq	ymm1,ymm21,8
    -	vpaddq	ymm18,ymm18,ymm24
    -	vpaddq	ymm19,ymm19,ymm0
    -	vpsrldq	ymm26,ymm22,8
    -	vpsrldq	ymm2,ymm23,8
    -	vpaddq	ymm20,ymm20,ymm25
    -	vpaddq	ymm21,ymm21,ymm1
    -	vpermq	ymm24,ymm18,0x2
    -	vpermq	ymm0,ymm19,0x2
    -	vpaddq	ymm22,ymm22,ymm26
    -	vpaddq	ymm23,ymm23,ymm2
    -
    -	vpermq	ymm25,ymm20,0x2
    -	vpermq	ymm1,ymm21,0x2
    -	vpaddq	ymm18{k1}{z},ymm18,ymm24
    -	vpaddq	ymm19{k1}{z},ymm19,ymm0
    -	vpermq	ymm26,ymm22,0x2
    -	vpermq	ymm2,ymm23,0x2
    -	vpaddq	ymm20{k1}{z},ymm20,ymm25
    -	vpaddq	ymm21{k1}{z},ymm21,ymm1
    -	vpaddq	ymm22{k1}{z},ymm22,ymm26
    -	vpaddq	ymm23{k1}{z},ymm23,ymm2
    -
    -
    -
    -	vpsrlq	ymm30,ymm18,44
    -	vpsllq	ymm19,ymm19,8
    -	vpandq	ymm0,ymm18,ymm28
    -	vpaddq	ymm19,ymm19,ymm30
    -
    -	vpaddq	ymm20,ymm20,ymm19
    -
    -	vpsrlq	ymm30,ymm20,44
    -	vpsllq	ymm21,ymm21,8
    -	vpandq	ymm1,ymm20,ymm28
    -	vpaddq	ymm21,ymm21,ymm30
    -
    -	vpaddq	ymm22,ymm22,ymm21
    -
    -	vpsrlq	ymm30,ymm22,42
    -	vpsllq	ymm23,ymm23,10
    -	vpandq	ymm2,ymm22,ymm29
    -	vpaddq	ymm23,ymm23,ymm30
    -
    -	vpaddq	ymm0,ymm0,ymm23
    -	vpsllq	ymm23,ymm23,2
    -
    -	vpaddq	ymm0,ymm0,ymm23
    -
    -	vpsrlq	ymm30,ymm0,44
    -	vpandq	ymm0,ymm0,ymm28
    -
    -	vpaddq	ymm1,ymm1,ymm30
    -
    -
    -	sub	rdx,2
    -	ja	NEAR $L$blocks_vpmadd52_4x_do
    -
    -	vmovq	QWORD[rdi],xmm0
    -	vmovq	QWORD[8+rdi],xmm1
    -	vmovq	QWORD[16+rdi],xmm2
    -	vzeroall
    -
    -$L$no_data_vpmadd52_4x:
    -	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
    -	mov	rsi,QWORD[16+rsp]
    -	DB	0F3h,0C3h		;repret
    -
    -$L$SEH_end_poly1305_blocks_vpmadd52_4x:
    -
    -ALIGN	32
    -poly1305_blocks_vpmadd52_8x:
    -	mov	QWORD[8+rsp],rdi	;WIN64 prologue
    -	mov	QWORD[16+rsp],rsi
    -	mov	rax,rsp
    -$L$SEH_begin_poly1305_blocks_vpmadd52_8x:
    -	mov	rdi,rcx
    -	mov	rsi,rdx
    -	mov	rdx,r8
    -	mov	rcx,r9
    -
    -
    -
    -	shr	rdx,4
    -	jz	NEAR $L$no_data_vpmadd52_8x
    -
    -	shl	rcx,40
    -	mov	r8,QWORD[64+rdi]
    -
    -	vmovdqa64	ymm28,YMMWORD[$L$x_mask44]
    -	vmovdqa64	ymm29,YMMWORD[$L$x_mask42]
    -
    -	test	r8,r8
    -	js	NEAR $L$init_vpmadd52
    -
    -	vmovq	xmm0,QWORD[rdi]
    -	vmovq	xmm1,QWORD[8+rdi]
    -	vmovq	xmm2,QWORD[16+rdi]
    -
    -$L$blocks_vpmadd52_8x:
    -
    -
    -
    -	vmovdqu64	ymm5,YMMWORD[128+rdi]
    -	vmovdqu64	ymm16,YMMWORD[160+rdi]
    -	vmovdqu64	ymm3,YMMWORD[64+rdi]
    -	vmovdqu64	ymm4,YMMWORD[96+rdi]
    -
    -	vpsllq	ymm17,ymm5,2
    -	vpaddq	ymm17,ymm17,ymm5
    -	vpsllq	ymm17,ymm17,2
    -
    -	vpbroadcastq	ymm8,xmm5
    -	vpbroadcastq	ymm6,xmm3
    -	vpbroadcastq	ymm7,xmm4
    -
    -	vpxorq	ymm18,ymm18,ymm18
    -	vpmadd52luq	ymm18,ymm16,ymm8
    -	vpxorq	ymm19,ymm19,ymm19
    -	vpmadd52huq	ymm19,ymm16,ymm8
    -	vpxorq	ymm20,ymm20,ymm20
    -	vpmadd52luq	ymm20,ymm17,ymm8
    -	vpxorq	ymm21,ymm21,ymm21
    -	vpmadd52huq	ymm21,ymm17,ymm8
    -	vpxorq	ymm22,ymm22,ymm22
    -	vpmadd52luq	ymm22,ymm3,ymm8
    -	vpxorq	ymm23,ymm23,ymm23
    -	vpmadd52huq	ymm23,ymm3,ymm8
    -
    -	vpmadd52luq	ymm18,ymm3,ymm6
    -	vpmadd52huq	ymm19,ymm3,ymm6
    -	vpmadd52luq	ymm20,ymm4,ymm6
    -	vpmadd52huq	ymm21,ymm4,ymm6
    -	vpmadd52luq	ymm22,ymm5,ymm6
    -	vpmadd52huq	ymm23,ymm5,ymm6
    -
    -	vpmadd52luq	ymm18,ymm17,ymm7
    -	vpmadd52huq	ymm19,ymm17,ymm7
    -	vpmadd52luq	ymm20,ymm3,ymm7
    -	vpmadd52huq	ymm21,ymm3,ymm7
    -	vpmadd52luq	ymm22,ymm4,ymm7
    -	vpmadd52huq	ymm23,ymm4,ymm7
    -
    -
    -
    -	vpsrlq	ymm30,ymm18,44
    -	vpsllq	ymm19,ymm19,8
    -	vpandq	ymm6,ymm18,ymm28
    -	vpaddq	ymm19,ymm19,ymm30
    -
    -	vpaddq	ymm20,ymm20,ymm19
    -
    -	vpsrlq	ymm30,ymm20,44
    -	vpsllq	ymm21,ymm21,8
    -	vpandq	ymm7,ymm20,ymm28
    -	vpaddq	ymm21,ymm21,ymm30
    -
    -	vpaddq	ymm22,ymm22,ymm21
    -
    -	vpsrlq	ymm30,ymm22,42
    -	vpsllq	ymm23,ymm23,10
    -	vpandq	ymm8,ymm22,ymm29
    -	vpaddq	ymm23,ymm23,ymm30
    -
    -	vpaddq	ymm6,ymm6,ymm23
    -	vpsllq	ymm23,ymm23,2
    -
    -	vpaddq	ymm6,ymm6,ymm23
    -
    -	vpsrlq	ymm30,ymm6,44
    -	vpandq	ymm6,ymm6,ymm28
    -
    -	vpaddq	ymm7,ymm7,ymm30
    -
    -
    -
    -
    -
    -	vpunpcklqdq	ymm26,ymm8,ymm5
    -	vpunpckhqdq	ymm5,ymm8,ymm5
    -	vpunpcklqdq	ymm24,ymm6,ymm3
    -	vpunpckhqdq	ymm3,ymm6,ymm3
    -	vpunpcklqdq	ymm25,ymm7,ymm4
    -	vpunpckhqdq	ymm4,ymm7,ymm4
    -	vshufi64x2	zmm8,zmm26,zmm5,0x44
    -	vshufi64x2	zmm6,zmm24,zmm3,0x44
    -	vshufi64x2	zmm7,zmm25,zmm4,0x44
    -
    -	vmovdqu64	zmm26,ZMMWORD[rsi]
    -	vmovdqu64	zmm27,ZMMWORD[64+rsi]
    -	lea	rsi,[128+rsi]
    -
    -	vpsllq	zmm10,zmm8,2
    -	vpsllq	zmm9,zmm7,2
    -	vpaddq	zmm10,zmm10,zmm8
    -	vpaddq	zmm9,zmm9,zmm7
    -	vpsllq	zmm10,zmm10,2
    -	vpsllq	zmm9,zmm9,2
    -
    -	vpbroadcastq	zmm31,rcx
    -	vpbroadcastq	zmm28,xmm28
    -	vpbroadcastq	zmm29,xmm29
    -
    -	vpbroadcastq	zmm16,xmm9
    -	vpbroadcastq	zmm17,xmm10
    -	vpbroadcastq	zmm3,xmm6
    -	vpbroadcastq	zmm4,xmm7
    -	vpbroadcastq	zmm5,xmm8
    -
    -	vpunpcklqdq	zmm25,zmm26,zmm27
    -	vpunpckhqdq	zmm27,zmm26,zmm27
    -
    -
    -
    -	vpsrlq	zmm26,zmm27,24
    -	vporq	zmm26,zmm26,zmm31
    -	vpaddq	zmm2,zmm2,zmm26
    -	vpandq	zmm24,zmm25,zmm28
    -	vpsrlq	zmm25,zmm25,44
    -	vpsllq	zmm27,zmm27,20
    -	vporq	zmm25,zmm25,zmm27
    -	vpandq	zmm25,zmm25,zmm28
    -
    -	sub	rdx,8
    -	jz	NEAR $L$tail_vpmadd52_8x
    -	jmp	NEAR $L$oop_vpmadd52_8x
    -
    -ALIGN	32
    -$L$oop_vpmadd52_8x:
    -
    -	vpaddq	zmm0,zmm0,zmm24
    -	vpaddq	zmm1,zmm1,zmm25
    -
    -	vpxorq	zmm18,zmm18,zmm18
    -	vpmadd52luq	zmm18,zmm16,zmm2
    -	vpxorq	zmm19,zmm19,zmm19
    -	vpmadd52huq	zmm19,zmm16,zmm2
    -	vpxorq	zmm20,zmm20,zmm20
    -	vpmadd52luq	zmm20,zmm17,zmm2
    -	vpxorq	zmm21,zmm21,zmm21
    -	vpmadd52huq	zmm21,zmm17,zmm2
    -	vpxorq	zmm22,zmm22,zmm22
    -	vpmadd52luq	zmm22,zmm3,zmm2
    -	vpxorq	zmm23,zmm23,zmm23
    -	vpmadd52huq	zmm23,zmm3,zmm2
    -
    -	vmovdqu64	zmm26,ZMMWORD[rsi]
    -	vmovdqu64	zmm27,ZMMWORD[64+rsi]
    -	lea	rsi,[128+rsi]
    -	vpmadd52luq	zmm18,zmm3,zmm0
    -	vpmadd52huq	zmm19,zmm3,zmm0
    -	vpmadd52luq	zmm20,zmm4,zmm0
    -	vpmadd52huq	zmm21,zmm4,zmm0
    -	vpmadd52luq	zmm22,zmm5,zmm0
    -	vpmadd52huq	zmm23,zmm5,zmm0
    -
    -	vpunpcklqdq	zmm25,zmm26,zmm27
    -	vpunpckhqdq	zmm27,zmm26,zmm27
    -	vpmadd52luq	zmm18,zmm17,zmm1
    -	vpmadd52huq	zmm19,zmm17,zmm1
    -	vpmadd52luq	zmm20,zmm3,zmm1
    -	vpmadd52huq	zmm21,zmm3,zmm1
    -	vpmadd52luq	zmm22,zmm4,zmm1
    -	vpmadd52huq	zmm23,zmm4,zmm1
    -
    -
    -
    -	vpsrlq	zmm30,zmm18,44
    -	vpsllq	zmm19,zmm19,8
    -	vpandq	zmm0,zmm18,zmm28
    -	vpaddq	zmm19,zmm19,zmm30
    -
    -	vpsrlq	zmm26,zmm27,24
    -	vporq	zmm26,zmm26,zmm31
    -	vpaddq	zmm20,zmm20,zmm19
    -
    -	vpsrlq	zmm30,zmm20,44
    -	vpsllq	zmm21,zmm21,8
    -	vpandq	zmm1,zmm20,zmm28
    -	vpaddq	zmm21,zmm21,zmm30
    -
    -	vpandq	zmm24,zmm25,zmm28
    -	vpsrlq	zmm25,zmm25,44
    -	vpsllq	zmm27,zmm27,20
    -	vpaddq	zmm22,zmm22,zmm21
    -
    -	vpsrlq	zmm30,zmm22,42
    -	vpsllq	zmm23,zmm23,10
    -	vpandq	zmm2,zmm22,zmm29
    -	vpaddq	zmm23,zmm23,zmm30
    -
    -	vpaddq	zmm2,zmm2,zmm26
    -	vpaddq	zmm0,zmm0,zmm23
    -	vpsllq	zmm23,zmm23,2
    -
    -	vpaddq	zmm0,zmm0,zmm23
    -	vporq	zmm25,zmm25,zmm27
    -	vpandq	zmm25,zmm25,zmm28
    -
    -	vpsrlq	zmm30,zmm0,44
    -	vpandq	zmm0,zmm0,zmm28
    -
    -	vpaddq	zmm1,zmm1,zmm30
    -
    -	sub	rdx,8
    -	jnz	NEAR $L$oop_vpmadd52_8x
    -
    -$L$tail_vpmadd52_8x:
    -
    -	vpaddq	zmm0,zmm0,zmm24
    -	vpaddq	zmm1,zmm1,zmm25
    -
    -	vpxorq	zmm18,zmm18,zmm18
    -	vpmadd52luq	zmm18,zmm9,zmm2
    -	vpxorq	zmm19,zmm19,zmm19
    -	vpmadd52huq	zmm19,zmm9,zmm2
    -	vpxorq	zmm20,zmm20,zmm20
    -	vpmadd52luq	zmm20,zmm10,zmm2
    -	vpxorq	zmm21,zmm21,zmm21
    -	vpmadd52huq	zmm21,zmm10,zmm2
    -	vpxorq	zmm22,zmm22,zmm22
    -	vpmadd52luq	zmm22,zmm6,zmm2
    -	vpxorq	zmm23,zmm23,zmm23
    -	vpmadd52huq	zmm23,zmm6,zmm2
    -
    -	vpmadd52luq	zmm18,zmm6,zmm0
    -	vpmadd52huq	zmm19,zmm6,zmm0
    -	vpmadd52luq	zmm20,zmm7,zmm0
    -	vpmadd52huq	zmm21,zmm7,zmm0
    -	vpmadd52luq	zmm22,zmm8,zmm0
    -	vpmadd52huq	zmm23,zmm8,zmm0
    -
    -	vpmadd52luq	zmm18,zmm10,zmm1
    -	vpmadd52huq	zmm19,zmm10,zmm1
    -	vpmadd52luq	zmm20,zmm6,zmm1
    -	vpmadd52huq	zmm21,zmm6,zmm1
    -	vpmadd52luq	zmm22,zmm7,zmm1
    -	vpmadd52huq	zmm23,zmm7,zmm1
    -
    -
    -
    -
    -	mov	eax,1
    -	kmovw	k1,eax
    -	vpsrldq	zmm24,zmm18,8
    -	vpsrldq	zmm0,zmm19,8
    -	vpsrldq	zmm25,zmm20,8
    -	vpsrldq	zmm1,zmm21,8
    -	vpaddq	zmm18,zmm18,zmm24
    -	vpaddq	zmm19,zmm19,zmm0
    -	vpsrldq	zmm26,zmm22,8
    -	vpsrldq	zmm2,zmm23,8
    -	vpaddq	zmm20,zmm20,zmm25
    -	vpaddq	zmm21,zmm21,zmm1
    -	vpermq	zmm24,zmm18,0x2
    -	vpermq	zmm0,zmm19,0x2
    -	vpaddq	zmm22,zmm22,zmm26
    -	vpaddq	zmm23,zmm23,zmm2
    -
    -	vpermq	zmm25,zmm20,0x2
    -	vpermq	zmm1,zmm21,0x2
    -	vpaddq	zmm18,zmm18,zmm24
    -	vpaddq	zmm19,zmm19,zmm0
    -	vpermq	zmm26,zmm22,0x2
    -	vpermq	zmm2,zmm23,0x2
    -	vpaddq	zmm20,zmm20,zmm25
    -	vpaddq	zmm21,zmm21,zmm1
    -	vextracti64x4	ymm24,zmm18,1
    -	vextracti64x4	ymm0,zmm19,1
    -	vpaddq	zmm22,zmm22,zmm26
    -	vpaddq	zmm23,zmm23,zmm2
    -
    -	vextracti64x4	ymm25,zmm20,1
    -	vextracti64x4	ymm1,zmm21,1
    -	vextracti64x4	ymm26,zmm22,1
    -	vextracti64x4	ymm2,zmm23,1
    -	vpaddq	ymm18{k1}{z},ymm18,ymm24
    -	vpaddq	ymm19{k1}{z},ymm19,ymm0
    -	vpaddq	ymm20{k1}{z},ymm20,ymm25
    -	vpaddq	ymm21{k1}{z},ymm21,ymm1
    -	vpaddq	ymm22{k1}{z},ymm22,ymm26
    -	vpaddq	ymm23{k1}{z},ymm23,ymm2
    -
    -
    -
    -	vpsrlq	ymm30,ymm18,44
    -	vpsllq	ymm19,ymm19,8
    -	vpandq	ymm0,ymm18,ymm28
    -	vpaddq	ymm19,ymm19,ymm30
    -
    -	vpaddq	ymm20,ymm20,ymm19
    -
    -	vpsrlq	ymm30,ymm20,44
    -	vpsllq	ymm21,ymm21,8
    -	vpandq	ymm1,ymm20,ymm28
    -	vpaddq	ymm21,ymm21,ymm30
    -
    -	vpaddq	ymm22,ymm22,ymm21
    -
    -	vpsrlq	ymm30,ymm22,42
    -	vpsllq	ymm23,ymm23,10
    -	vpandq	ymm2,ymm22,ymm29
    -	vpaddq	ymm23,ymm23,ymm30
    -
    -	vpaddq	ymm0,ymm0,ymm23
    -	vpsllq	ymm23,ymm23,2
    -
    -	vpaddq	ymm0,ymm0,ymm23
    -
    -	vpsrlq	ymm30,ymm0,44
    -	vpandq	ymm0,ymm0,ymm28
    -
    -	vpaddq	ymm1,ymm1,ymm30
    -
    -
    -
    -	vmovq	QWORD[rdi],xmm0
    -	vmovq	QWORD[8+rdi],xmm1
    -	vmovq	QWORD[16+rdi],xmm2
    -	vzeroall
    -
    -$L$no_data_vpmadd52_8x:
    -	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
    -	mov	rsi,QWORD[16+rsp]
    -	DB	0F3h,0C3h		;repret
    -
    -$L$SEH_end_poly1305_blocks_vpmadd52_8x:
    -
    -ALIGN	32
    -poly1305_emit_base2_44:
    -	mov	QWORD[8+rsp],rdi	;WIN64 prologue
    -	mov	QWORD[16+rsp],rsi
    -	mov	rax,rsp
    -$L$SEH_begin_poly1305_emit_base2_44:
    -	mov	rdi,rcx
    -	mov	rsi,rdx
    -	mov	rdx,r8
    -
    -
    -
    -DB	243,15,30,250
    -	mov	r8,QWORD[rdi]
    -	mov	r9,QWORD[8+rdi]
    -	mov	r10,QWORD[16+rdi]
    -
    -	mov	rax,r9
    -	shr	r9,20
    -	shl	rax,44
    -	mov	rcx,r10
    -	shr	r10,40
    -	shl	rcx,24
    -
    -	add	r8,rax
    -	adc	r9,rcx
    -	adc	r10,0
    -
    -	mov	rax,r8
    -	add	r8,5
    -	mov	rcx,r9
    -	adc	r9,0
    -	adc	r10,0
    -	shr	r10,2
    -	cmovnz	rax,r8
    -	cmovnz	rcx,r9
    -
    -	add	rax,QWORD[rdx]
    -	adc	rcx,QWORD[8+rdx]
    -	mov	QWORD[rsi],rax
    -	mov	QWORD[8+rsi],rcx
    -
    -	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
    -	mov	rsi,QWORD[16+rsp]
    -	DB	0F3h,0C3h		;repret
    -
    -$L$SEH_end_poly1305_emit_base2_44:
     ALIGN	64
     $L$const:
     $L$mask24:
    diff --git a/deps/openssl/config/archs/VC-WIN64A/asm/include/openssl/opensslv.h b/deps/openssl/config/archs/VC-WIN64A/asm/include/openssl/opensslv.h
    index 38b44f1054ad3d..a410f0eddf361c 100644
    --- a/deps/openssl/config/archs/VC-WIN64A/asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/VC-WIN64A/asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/VC-WIN64A/asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/VC-WIN64A/asm/include/openssl/pkcs7.h
    index 3978fd087bca3b..0a95a93e59e262 100644
    --- a/deps/openssl/config/archs/VC-WIN64A/asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/VC-WIN64A/asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/VC-WIN64A/asm_avx2/configdata.pm b/deps/openssl/config/archs/VC-WIN64A/asm_avx2/configdata.pm
    index 08fdeedbf613bf..243ea4184ec432 100644
    --- a/deps/openssl/config/archs/VC-WIN64A/asm_avx2/configdata.pm
    +++ b/deps/openssl/config/archs/VC-WIN64A/asm_avx2/configdata.pm
    @@ -168,7 +168,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -219,7 +219,7 @@ our %config = (
         ],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -271,11 +271,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "VC-WIN64A",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "lib",
    @@ -290,7 +290,7 @@ our %target = (
         "LDFLAGS" => "/nologo /debug",
         "MT" => "mt",
         "MTFLAGS" => "-nologo",
    -    "RANLIB" => "CODE(0x56478be29bd0)",
    +    "RANLIB" => "CODE(0x55a9fd66b620)",
         "RC" => "rc",
         "_conf_fname_int" => [
             "Configurations/00-base-templates.conf",
    @@ -356,7 +356,7 @@ our %target = (
         "mtoutflag" => "-outputresource:",
         "multilib" => "-x64",
         "perl_platform" => "Windows::MSVC",
    -    "perlasm_scheme" => "auto",
    +    "perlasm_scheme" => "nasm",
         "rcoutflag" => "/fo",
         "shared_cflag" => "",
         "shared_defflag" => "",
    diff --git a/deps/openssl/config/archs/VC-WIN64A/asm_avx2/crypto/buildinf.h b/deps/openssl/config/archs/VC-WIN64A/asm_avx2/crypto/buildinf.h
    index 196661655556bf..ebb9fb26fed3ea 100644
    --- a/deps/openssl/config/archs/VC-WIN64A/asm_avx2/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/VC-WIN64A/asm_avx2/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: "
    -#define DATE "built on: Sun Aug  6 00:42:38 2023 UTC"
    +#define DATE "built on: Thu Oct 26 15:03:45 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/VC-WIN64A/asm_avx2/crypto/poly1305/poly1305-x86_64.asm b/deps/openssl/config/archs/VC-WIN64A/asm_avx2/crypto/poly1305/poly1305-x86_64.asm
    index 26f683384d1806..fb3823608c949b 100644
    --- a/deps/openssl/config/archs/VC-WIN64A/asm_avx2/crypto/poly1305/poly1305-x86_64.asm
    +++ b/deps/openssl/config/archs/VC-WIN64A/asm_avx2/crypto/poly1305/poly1305-x86_64.asm
    @@ -46,11 +46,6 @@ $L$SEH_begin_poly1305_init:
     	lea	rax,[poly1305_blocks_avx2]
     	bt	r9,37
     	cmovc	r10,rax
    -	mov	rax,2149646336
    -	shr	r9,32
    -	and	r9,rax
    -	cmp	r9,rax
    -	je	NEAR $L$init_base2_44
     	mov	rax,0x0ffffffc0fffffff
     	mov	rcx,0x0ffffffc0ffffffc
     	and	rax,QWORD[rsi]
    @@ -2605,1029 +2600,6 @@ $L$do_avx512_epilogue:
     	DB	0F3h,0C3h		;repret
     
     $L$SEH_end_poly1305_blocks_avx512:
    -
    -ALIGN	32
    -poly1305_init_base2_44:
    -	mov	QWORD[8+rsp],rdi	;WIN64 prologue
    -	mov	QWORD[16+rsp],rsi
    -	mov	rax,rsp
    -$L$SEH_begin_poly1305_init_base2_44:
    -	mov	rdi,rcx
    -	mov	rsi,rdx
    -	mov	rdx,r8
    -
    -
    -
    -	xor	rax,rax
    -	mov	QWORD[rdi],rax
    -	mov	QWORD[8+rdi],rax
    -	mov	QWORD[16+rdi],rax
    -
    -$L$init_base2_44:
    -	lea	r10,[poly1305_blocks_vpmadd52]
    -	lea	r11,[poly1305_emit_base2_44]
    -
    -	mov	rax,0x0ffffffc0fffffff
    -	mov	rcx,0x0ffffffc0ffffffc
    -	and	rax,QWORD[rsi]
    -	mov	r8,0x00000fffffffffff
    -	and	rcx,QWORD[8+rsi]
    -	mov	r9,0x00000fffffffffff
    -	and	r8,rax
    -	shrd	rax,rcx,44
    -	mov	QWORD[40+rdi],r8
    -	and	rax,r9
    -	shr	rcx,24
    -	mov	QWORD[48+rdi],rax
    -	lea	rax,[rax*4+rax]
    -	mov	QWORD[56+rdi],rcx
    -	shl	rax,2
    -	lea	rcx,[rcx*4+rcx]
    -	shl	rcx,2
    -	mov	QWORD[24+rdi],rax
    -	mov	QWORD[32+rdi],rcx
    -	mov	QWORD[64+rdi],-1
    -	mov	QWORD[rdx],r10
    -	mov	QWORD[8+rdx],r11
    -	mov	eax,1
    -	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
    -	mov	rsi,QWORD[16+rsp]
    -	DB	0F3h,0C3h		;repret
    -
    -$L$SEH_end_poly1305_init_base2_44:
    -
    -ALIGN	32
    -poly1305_blocks_vpmadd52:
    -	mov	QWORD[8+rsp],rdi	;WIN64 prologue
    -	mov	QWORD[16+rsp],rsi
    -	mov	rax,rsp
    -$L$SEH_begin_poly1305_blocks_vpmadd52:
    -	mov	rdi,rcx
    -	mov	rsi,rdx
    -	mov	rdx,r8
    -	mov	rcx,r9
    -
    -
    -
    -DB	243,15,30,250
    -	shr	rdx,4
    -	jz	NEAR $L$no_data_vpmadd52
    -
    -	shl	rcx,40
    -	mov	r8,QWORD[64+rdi]
    -
    -
    -
    -
    -
    -
    -	mov	rax,3
    -	mov	r10,1
    -	cmp	rdx,4
    -	cmovae	rax,r10
    -	test	r8,r8
    -	cmovns	rax,r10
    -
    -	and	rax,rdx
    -	jz	NEAR $L$blocks_vpmadd52_4x
    -
    -	sub	rdx,rax
    -	mov	r10d,7
    -	mov	r11d,1
    -	kmovw	k7,r10d
    -	lea	r10,[$L$2_44_inp_permd]
    -	kmovw	k1,r11d
    -
    -	vmovq	xmm21,rcx
    -	vmovdqa64	ymm19,YMMWORD[r10]
    -	vmovdqa64	ymm20,YMMWORD[32+r10]
    -	vpermq	ymm21,ymm21,0xcf
    -	vmovdqa64	ymm22,YMMWORD[64+r10]
    -
    -	vmovdqu64	ymm16{k7}{z},[rdi]
    -	vmovdqu64	ymm3{k7}{z},[40+rdi]
    -	vmovdqu64	ymm4{k7}{z},[32+rdi]
    -	vmovdqu64	ymm5{k7}{z},[24+rdi]
    -
    -	vmovdqa64	ymm23,YMMWORD[96+r10]
    -	vmovdqa64	ymm24,YMMWORD[128+r10]
    -
    -	jmp	NEAR $L$oop_vpmadd52
    -
    -ALIGN	32
    -$L$oop_vpmadd52:
    -	vmovdqu32	xmm18,XMMWORD[rsi]
    -	lea	rsi,[16+rsi]
    -
    -	vpermd	ymm18,ymm19,ymm18
    -	vpsrlvq	ymm18,ymm18,ymm20
    -	vpandq	ymm18,ymm18,ymm22
    -	vporq	ymm18,ymm18,ymm21
    -
    -	vpaddq	ymm16,ymm16,ymm18
    -
    -	vpermq	ymm0{k7}{z},ymm16,0
    -	vpermq	ymm1{k7}{z},ymm16,85
    -	vpermq	ymm2{k7}{z},ymm16,170
    -
    -	vpxord	ymm16,ymm16,ymm16
    -	vpxord	ymm17,ymm17,ymm17
    -
    -	vpmadd52luq	ymm16,ymm0,ymm3
    -	vpmadd52huq	ymm17,ymm0,ymm3
    -
    -	vpmadd52luq	ymm16,ymm1,ymm4
    -	vpmadd52huq	ymm17,ymm1,ymm4
    -
    -	vpmadd52luq	ymm16,ymm2,ymm5
    -	vpmadd52huq	ymm17,ymm2,ymm5
    -
    -	vpsrlvq	ymm18,ymm16,ymm23
    -	vpsllvq	ymm17,ymm17,ymm24
    -	vpandq	ymm16,ymm16,ymm22
    -
    -	vpaddq	ymm17,ymm17,ymm18
    -
    -	vpermq	ymm17,ymm17,147
    -
    -	vpaddq	ymm16,ymm16,ymm17
    -
    -	vpsrlvq	ymm18,ymm16,ymm23
    -	vpandq	ymm16,ymm16,ymm22
    -
    -	vpermq	ymm18,ymm18,147
    -
    -	vpaddq	ymm16,ymm16,ymm18
    -
    -	vpermq	ymm18{k1}{z},ymm16,147
    -
    -	vpaddq	ymm16,ymm16,ymm18
    -	vpsllq	ymm18,ymm18,2
    -
    -	vpaddq	ymm16,ymm16,ymm18
    -
    -	dec	rax
    -	jnz	NEAR $L$oop_vpmadd52
    -
    -	vmovdqu64	YMMWORD[rdi]{k7},ymm16
    -
    -	test	rdx,rdx
    -	jnz	NEAR $L$blocks_vpmadd52_4x
    -
    -$L$no_data_vpmadd52:
    -	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
    -	mov	rsi,QWORD[16+rsp]
    -	DB	0F3h,0C3h		;repret
    -
    -$L$SEH_end_poly1305_blocks_vpmadd52:
    -
    -ALIGN	32
    -poly1305_blocks_vpmadd52_4x:
    -	mov	QWORD[8+rsp],rdi	;WIN64 prologue
    -	mov	QWORD[16+rsp],rsi
    -	mov	rax,rsp
    -$L$SEH_begin_poly1305_blocks_vpmadd52_4x:
    -	mov	rdi,rcx
    -	mov	rsi,rdx
    -	mov	rdx,r8
    -	mov	rcx,r9
    -
    -
    -
    -	shr	rdx,4
    -	jz	NEAR $L$no_data_vpmadd52_4x
    -
    -	shl	rcx,40
    -	mov	r8,QWORD[64+rdi]
    -
    -$L$blocks_vpmadd52_4x:
    -	vpbroadcastq	ymm31,rcx
    -
    -	vmovdqa64	ymm28,YMMWORD[$L$x_mask44]
    -	mov	eax,5
    -	vmovdqa64	ymm29,YMMWORD[$L$x_mask42]
    -	kmovw	k1,eax
    -
    -	test	r8,r8
    -	js	NEAR $L$init_vpmadd52
    -
    -	vmovq	xmm0,QWORD[rdi]
    -	vmovq	xmm1,QWORD[8+rdi]
    -	vmovq	xmm2,QWORD[16+rdi]
    -
    -	test	rdx,3
    -	jnz	NEAR $L$blocks_vpmadd52_2x_do
    -
    -$L$blocks_vpmadd52_4x_do:
    -	vpbroadcastq	ymm3,QWORD[64+rdi]
    -	vpbroadcastq	ymm4,QWORD[96+rdi]
    -	vpbroadcastq	ymm5,QWORD[128+rdi]
    -	vpbroadcastq	ymm16,QWORD[160+rdi]
    -
    -$L$blocks_vpmadd52_4x_key_loaded:
    -	vpsllq	ymm17,ymm5,2
    -	vpaddq	ymm17,ymm17,ymm5
    -	vpsllq	ymm17,ymm17,2
    -
    -	test	rdx,7
    -	jz	NEAR $L$blocks_vpmadd52_8x
    -
    -	vmovdqu64	ymm26,YMMWORD[rsi]
    -	vmovdqu64	ymm27,YMMWORD[32+rsi]
    -	lea	rsi,[64+rsi]
    -
    -	vpunpcklqdq	ymm25,ymm26,ymm27
    -	vpunpckhqdq	ymm27,ymm26,ymm27
    -
    -
    -
    -	vpsrlq	ymm26,ymm27,24
    -	vporq	ymm26,ymm26,ymm31
    -	vpaddq	ymm2,ymm2,ymm26
    -	vpandq	ymm24,ymm25,ymm28
    -	vpsrlq	ymm25,ymm25,44
    -	vpsllq	ymm27,ymm27,20
    -	vporq	ymm25,ymm25,ymm27
    -	vpandq	ymm25,ymm25,ymm28
    -
    -	sub	rdx,4
    -	jz	NEAR $L$tail_vpmadd52_4x
    -	jmp	NEAR $L$oop_vpmadd52_4x
    -	ud2
    -
    -ALIGN	32
    -$L$init_vpmadd52:
    -	vmovq	xmm16,QWORD[24+rdi]
    -	vmovq	xmm2,QWORD[56+rdi]
    -	vmovq	xmm17,QWORD[32+rdi]
    -	vmovq	xmm3,QWORD[40+rdi]
    -	vmovq	xmm4,QWORD[48+rdi]
    -
    -	vmovdqa	ymm0,ymm3
    -	vmovdqa	ymm1,ymm4
    -	vmovdqa	ymm5,ymm2
    -
    -	mov	eax,2
    -
    -$L$mul_init_vpmadd52:
    -	vpxorq	ymm18,ymm18,ymm18
    -	vpmadd52luq	ymm18,ymm16,ymm2
    -	vpxorq	ymm19,ymm19,ymm19
    -	vpmadd52huq	ymm19,ymm16,ymm2
    -	vpxorq	ymm20,ymm20,ymm20
    -	vpmadd52luq	ymm20,ymm17,ymm2
    -	vpxorq	ymm21,ymm21,ymm21
    -	vpmadd52huq	ymm21,ymm17,ymm2
    -	vpxorq	ymm22,ymm22,ymm22
    -	vpmadd52luq	ymm22,ymm3,ymm2
    -	vpxorq	ymm23,ymm23,ymm23
    -	vpmadd52huq	ymm23,ymm3,ymm2
    -
    -	vpmadd52luq	ymm18,ymm3,ymm0
    -	vpmadd52huq	ymm19,ymm3,ymm0
    -	vpmadd52luq	ymm20,ymm4,ymm0
    -	vpmadd52huq	ymm21,ymm4,ymm0
    -	vpmadd52luq	ymm22,ymm5,ymm0
    -	vpmadd52huq	ymm23,ymm5,ymm0
    -
    -	vpmadd52luq	ymm18,ymm17,ymm1
    -	vpmadd52huq	ymm19,ymm17,ymm1
    -	vpmadd52luq	ymm20,ymm3,ymm1
    -	vpmadd52huq	ymm21,ymm3,ymm1
    -	vpmadd52luq	ymm22,ymm4,ymm1
    -	vpmadd52huq	ymm23,ymm4,ymm1
    -
    -
    -
    -	vpsrlq	ymm30,ymm18,44
    -	vpsllq	ymm19,ymm19,8
    -	vpandq	ymm0,ymm18,ymm28
    -	vpaddq	ymm19,ymm19,ymm30
    -
    -	vpaddq	ymm20,ymm20,ymm19
    -
    -	vpsrlq	ymm30,ymm20,44
    -	vpsllq	ymm21,ymm21,8
    -	vpandq	ymm1,ymm20,ymm28
    -	vpaddq	ymm21,ymm21,ymm30
    -
    -	vpaddq	ymm22,ymm22,ymm21
    -
    -	vpsrlq	ymm30,ymm22,42
    -	vpsllq	ymm23,ymm23,10
    -	vpandq	ymm2,ymm22,ymm29
    -	vpaddq	ymm23,ymm23,ymm30
    -
    -	vpaddq	ymm0,ymm0,ymm23
    -	vpsllq	ymm23,ymm23,2
    -
    -	vpaddq	ymm0,ymm0,ymm23
    -
    -	vpsrlq	ymm30,ymm0,44
    -	vpandq	ymm0,ymm0,ymm28
    -
    -	vpaddq	ymm1,ymm1,ymm30
    -
    -	dec	eax
    -	jz	NEAR $L$done_init_vpmadd52
    -
    -	vpunpcklqdq	ymm4,ymm1,ymm4
    -	vpbroadcastq	xmm1,xmm1
    -	vpunpcklqdq	ymm5,ymm2,ymm5
    -	vpbroadcastq	xmm2,xmm2
    -	vpunpcklqdq	ymm3,ymm0,ymm3
    -	vpbroadcastq	xmm0,xmm0
    -
    -	vpsllq	ymm16,ymm4,2
    -	vpsllq	ymm17,ymm5,2
    -	vpaddq	ymm16,ymm16,ymm4
    -	vpaddq	ymm17,ymm17,ymm5
    -	vpsllq	ymm16,ymm16,2
    -	vpsllq	ymm17,ymm17,2
    -
    -	jmp	NEAR $L$mul_init_vpmadd52
    -	ud2
    -
    -ALIGN	32
    -$L$done_init_vpmadd52:
    -	vinserti128	ymm4,ymm1,xmm4,1
    -	vinserti128	ymm5,ymm2,xmm5,1
    -	vinserti128	ymm3,ymm0,xmm3,1
    -
    -	vpermq	ymm4,ymm4,216
    -	vpermq	ymm5,ymm5,216
    -	vpermq	ymm3,ymm3,216
    -
    -	vpsllq	ymm16,ymm4,2
    -	vpaddq	ymm16,ymm16,ymm4
    -	vpsllq	ymm16,ymm16,2
    -
    -	vmovq	xmm0,QWORD[rdi]
    -	vmovq	xmm1,QWORD[8+rdi]
    -	vmovq	xmm2,QWORD[16+rdi]
    -
    -	test	rdx,3
    -	jnz	NEAR $L$done_init_vpmadd52_2x
    -
    -	vmovdqu64	YMMWORD[64+rdi],ymm3
    -	vpbroadcastq	ymm3,xmm3
    -	vmovdqu64	YMMWORD[96+rdi],ymm4
    -	vpbroadcastq	ymm4,xmm4
    -	vmovdqu64	YMMWORD[128+rdi],ymm5
    -	vpbroadcastq	ymm5,xmm5
    -	vmovdqu64	YMMWORD[160+rdi],ymm16
    -	vpbroadcastq	ymm16,xmm16
    -
    -	jmp	NEAR $L$blocks_vpmadd52_4x_key_loaded
    -	ud2
    -
    -ALIGN	32
    -$L$done_init_vpmadd52_2x:
    -	vmovdqu64	YMMWORD[64+rdi],ymm3
    -	vpsrldq	ymm3,ymm3,8
    -	vmovdqu64	YMMWORD[96+rdi],ymm4
    -	vpsrldq	ymm4,ymm4,8
    -	vmovdqu64	YMMWORD[128+rdi],ymm5
    -	vpsrldq	ymm5,ymm5,8
    -	vmovdqu64	YMMWORD[160+rdi],ymm16
    -	vpsrldq	ymm16,ymm16,8
    -	jmp	NEAR $L$blocks_vpmadd52_2x_key_loaded
    -	ud2
    -
    -ALIGN	32
    -$L$blocks_vpmadd52_2x_do:
    -	vmovdqu64	ymm5{k1}{z},[((128+8))+rdi]
    -	vmovdqu64	ymm16{k1}{z},[((160+8))+rdi]
    -	vmovdqu64	ymm3{k1}{z},[((64+8))+rdi]
    -	vmovdqu64	ymm4{k1}{z},[((96+8))+rdi]
    -
    -$L$blocks_vpmadd52_2x_key_loaded:
    -	vmovdqu64	ymm26,YMMWORD[rsi]
    -	vpxorq	ymm27,ymm27,ymm27
    -	lea	rsi,[32+rsi]
    -
    -	vpunpcklqdq	ymm25,ymm26,ymm27
    -	vpunpckhqdq	ymm27,ymm26,ymm27
    -
    -
    -
    -	vpsrlq	ymm26,ymm27,24
    -	vporq	ymm26,ymm26,ymm31
    -	vpaddq	ymm2,ymm2,ymm26
    -	vpandq	ymm24,ymm25,ymm28
    -	vpsrlq	ymm25,ymm25,44
    -	vpsllq	ymm27,ymm27,20
    -	vporq	ymm25,ymm25,ymm27
    -	vpandq	ymm25,ymm25,ymm28
    -
    -	jmp	NEAR $L$tail_vpmadd52_2x
    -	ud2
    -
    -ALIGN	32
    -$L$oop_vpmadd52_4x:
    -
    -	vpaddq	ymm0,ymm0,ymm24
    -	vpaddq	ymm1,ymm1,ymm25
    -
    -	vpxorq	ymm18,ymm18,ymm18
    -	vpmadd52luq	ymm18,ymm16,ymm2
    -	vpxorq	ymm19,ymm19,ymm19
    -	vpmadd52huq	ymm19,ymm16,ymm2
    -	vpxorq	ymm20,ymm20,ymm20
    -	vpmadd52luq	ymm20,ymm17,ymm2
    -	vpxorq	ymm21,ymm21,ymm21
    -	vpmadd52huq	ymm21,ymm17,ymm2
    -	vpxorq	ymm22,ymm22,ymm22
    -	vpmadd52luq	ymm22,ymm3,ymm2
    -	vpxorq	ymm23,ymm23,ymm23
    -	vpmadd52huq	ymm23,ymm3,ymm2
    -
    -	vmovdqu64	ymm26,YMMWORD[rsi]
    -	vmovdqu64	ymm27,YMMWORD[32+rsi]
    -	lea	rsi,[64+rsi]
    -	vpmadd52luq	ymm18,ymm3,ymm0
    -	vpmadd52huq	ymm19,ymm3,ymm0
    -	vpmadd52luq	ymm20,ymm4,ymm0
    -	vpmadd52huq	ymm21,ymm4,ymm0
    -	vpmadd52luq	ymm22,ymm5,ymm0
    -	vpmadd52huq	ymm23,ymm5,ymm0
    -
    -	vpunpcklqdq	ymm25,ymm26,ymm27
    -	vpunpckhqdq	ymm27,ymm26,ymm27
    -	vpmadd52luq	ymm18,ymm17,ymm1
    -	vpmadd52huq	ymm19,ymm17,ymm1
    -	vpmadd52luq	ymm20,ymm3,ymm1
    -	vpmadd52huq	ymm21,ymm3,ymm1
    -	vpmadd52luq	ymm22,ymm4,ymm1
    -	vpmadd52huq	ymm23,ymm4,ymm1
    -
    -
    -
    -	vpsrlq	ymm30,ymm18,44
    -	vpsllq	ymm19,ymm19,8
    -	vpandq	ymm0,ymm18,ymm28
    -	vpaddq	ymm19,ymm19,ymm30
    -
    -	vpsrlq	ymm26,ymm27,24
    -	vporq	ymm26,ymm26,ymm31
    -	vpaddq	ymm20,ymm20,ymm19
    -
    -	vpsrlq	ymm30,ymm20,44
    -	vpsllq	ymm21,ymm21,8
    -	vpandq	ymm1,ymm20,ymm28
    -	vpaddq	ymm21,ymm21,ymm30
    -
    -	vpandq	ymm24,ymm25,ymm28
    -	vpsrlq	ymm25,ymm25,44
    -	vpsllq	ymm27,ymm27,20
    -	vpaddq	ymm22,ymm22,ymm21
    -
    -	vpsrlq	ymm30,ymm22,42
    -	vpsllq	ymm23,ymm23,10
    -	vpandq	ymm2,ymm22,ymm29
    -	vpaddq	ymm23,ymm23,ymm30
    -
    -	vpaddq	ymm2,ymm2,ymm26
    -	vpaddq	ymm0,ymm0,ymm23
    -	vpsllq	ymm23,ymm23,2
    -
    -	vpaddq	ymm0,ymm0,ymm23
    -	vporq	ymm25,ymm25,ymm27
    -	vpandq	ymm25,ymm25,ymm28
    -
    -	vpsrlq	ymm30,ymm0,44
    -	vpandq	ymm0,ymm0,ymm28
    -
    -	vpaddq	ymm1,ymm1,ymm30
    -
    -	sub	rdx,4
    -	jnz	NEAR $L$oop_vpmadd52_4x
    -
    -$L$tail_vpmadd52_4x:
    -	vmovdqu64	ymm5,YMMWORD[128+rdi]
    -	vmovdqu64	ymm16,YMMWORD[160+rdi]
    -	vmovdqu64	ymm3,YMMWORD[64+rdi]
    -	vmovdqu64	ymm4,YMMWORD[96+rdi]
    -
    -$L$tail_vpmadd52_2x:
    -	vpsllq	ymm17,ymm5,2
    -	vpaddq	ymm17,ymm17,ymm5
    -	vpsllq	ymm17,ymm17,2
    -
    -
    -	vpaddq	ymm0,ymm0,ymm24
    -	vpaddq	ymm1,ymm1,ymm25
    -
    -	vpxorq	ymm18,ymm18,ymm18
    -	vpmadd52luq	ymm18,ymm16,ymm2
    -	vpxorq	ymm19,ymm19,ymm19
    -	vpmadd52huq	ymm19,ymm16,ymm2
    -	vpxorq	ymm20,ymm20,ymm20
    -	vpmadd52luq	ymm20,ymm17,ymm2
    -	vpxorq	ymm21,ymm21,ymm21
    -	vpmadd52huq	ymm21,ymm17,ymm2
    -	vpxorq	ymm22,ymm22,ymm22
    -	vpmadd52luq	ymm22,ymm3,ymm2
    -	vpxorq	ymm23,ymm23,ymm23
    -	vpmadd52huq	ymm23,ymm3,ymm2
    -
    -	vpmadd52luq	ymm18,ymm3,ymm0
    -	vpmadd52huq	ymm19,ymm3,ymm0
    -	vpmadd52luq	ymm20,ymm4,ymm0
    -	vpmadd52huq	ymm21,ymm4,ymm0
    -	vpmadd52luq	ymm22,ymm5,ymm0
    -	vpmadd52huq	ymm23,ymm5,ymm0
    -
    -	vpmadd52luq	ymm18,ymm17,ymm1
    -	vpmadd52huq	ymm19,ymm17,ymm1
    -	vpmadd52luq	ymm20,ymm3,ymm1
    -	vpmadd52huq	ymm21,ymm3,ymm1
    -	vpmadd52luq	ymm22,ymm4,ymm1
    -	vpmadd52huq	ymm23,ymm4,ymm1
    -
    -
    -
    -
    -	mov	eax,1
    -	kmovw	k1,eax
    -	vpsrldq	ymm24,ymm18,8
    -	vpsrldq	ymm0,ymm19,8
    -	vpsrldq	ymm25,ymm20,8
    -	vpsrldq	ymm1,ymm21,8
    -	vpaddq	ymm18,ymm18,ymm24
    -	vpaddq	ymm19,ymm19,ymm0
    -	vpsrldq	ymm26,ymm22,8
    -	vpsrldq	ymm2,ymm23,8
    -	vpaddq	ymm20,ymm20,ymm25
    -	vpaddq	ymm21,ymm21,ymm1
    -	vpermq	ymm24,ymm18,0x2
    -	vpermq	ymm0,ymm19,0x2
    -	vpaddq	ymm22,ymm22,ymm26
    -	vpaddq	ymm23,ymm23,ymm2
    -
    -	vpermq	ymm25,ymm20,0x2
    -	vpermq	ymm1,ymm21,0x2
    -	vpaddq	ymm18{k1}{z},ymm18,ymm24
    -	vpaddq	ymm19{k1}{z},ymm19,ymm0
    -	vpermq	ymm26,ymm22,0x2
    -	vpermq	ymm2,ymm23,0x2
    -	vpaddq	ymm20{k1}{z},ymm20,ymm25
    -	vpaddq	ymm21{k1}{z},ymm21,ymm1
    -	vpaddq	ymm22{k1}{z},ymm22,ymm26
    -	vpaddq	ymm23{k1}{z},ymm23,ymm2
    -
    -
    -
    -	vpsrlq	ymm30,ymm18,44
    -	vpsllq	ymm19,ymm19,8
    -	vpandq	ymm0,ymm18,ymm28
    -	vpaddq	ymm19,ymm19,ymm30
    -
    -	vpaddq	ymm20,ymm20,ymm19
    -
    -	vpsrlq	ymm30,ymm20,44
    -	vpsllq	ymm21,ymm21,8
    -	vpandq	ymm1,ymm20,ymm28
    -	vpaddq	ymm21,ymm21,ymm30
    -
    -	vpaddq	ymm22,ymm22,ymm21
    -
    -	vpsrlq	ymm30,ymm22,42
    -	vpsllq	ymm23,ymm23,10
    -	vpandq	ymm2,ymm22,ymm29
    -	vpaddq	ymm23,ymm23,ymm30
    -
    -	vpaddq	ymm0,ymm0,ymm23
    -	vpsllq	ymm23,ymm23,2
    -
    -	vpaddq	ymm0,ymm0,ymm23
    -
    -	vpsrlq	ymm30,ymm0,44
    -	vpandq	ymm0,ymm0,ymm28
    -
    -	vpaddq	ymm1,ymm1,ymm30
    -
    -
    -	sub	rdx,2
    -	ja	NEAR $L$blocks_vpmadd52_4x_do
    -
    -	vmovq	QWORD[rdi],xmm0
    -	vmovq	QWORD[8+rdi],xmm1
    -	vmovq	QWORD[16+rdi],xmm2
    -	vzeroall
    -
    -$L$no_data_vpmadd52_4x:
    -	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
    -	mov	rsi,QWORD[16+rsp]
    -	DB	0F3h,0C3h		;repret
    -
    -$L$SEH_end_poly1305_blocks_vpmadd52_4x:
    -
    -ALIGN	32
    -poly1305_blocks_vpmadd52_8x:
    -	mov	QWORD[8+rsp],rdi	;WIN64 prologue
    -	mov	QWORD[16+rsp],rsi
    -	mov	rax,rsp
    -$L$SEH_begin_poly1305_blocks_vpmadd52_8x:
    -	mov	rdi,rcx
    -	mov	rsi,rdx
    -	mov	rdx,r8
    -	mov	rcx,r9
    -
    -
    -
    -	shr	rdx,4
    -	jz	NEAR $L$no_data_vpmadd52_8x
    -
    -	shl	rcx,40
    -	mov	r8,QWORD[64+rdi]
    -
    -	vmovdqa64	ymm28,YMMWORD[$L$x_mask44]
    -	vmovdqa64	ymm29,YMMWORD[$L$x_mask42]
    -
    -	test	r8,r8
    -	js	NEAR $L$init_vpmadd52
    -
    -	vmovq	xmm0,QWORD[rdi]
    -	vmovq	xmm1,QWORD[8+rdi]
    -	vmovq	xmm2,QWORD[16+rdi]
    -
    -$L$blocks_vpmadd52_8x:
    -
    -
    -
    -	vmovdqu64	ymm5,YMMWORD[128+rdi]
    -	vmovdqu64	ymm16,YMMWORD[160+rdi]
    -	vmovdqu64	ymm3,YMMWORD[64+rdi]
    -	vmovdqu64	ymm4,YMMWORD[96+rdi]
    -
    -	vpsllq	ymm17,ymm5,2
    -	vpaddq	ymm17,ymm17,ymm5
    -	vpsllq	ymm17,ymm17,2
    -
    -	vpbroadcastq	ymm8,xmm5
    -	vpbroadcastq	ymm6,xmm3
    -	vpbroadcastq	ymm7,xmm4
    -
    -	vpxorq	ymm18,ymm18,ymm18
    -	vpmadd52luq	ymm18,ymm16,ymm8
    -	vpxorq	ymm19,ymm19,ymm19
    -	vpmadd52huq	ymm19,ymm16,ymm8
    -	vpxorq	ymm20,ymm20,ymm20
    -	vpmadd52luq	ymm20,ymm17,ymm8
    -	vpxorq	ymm21,ymm21,ymm21
    -	vpmadd52huq	ymm21,ymm17,ymm8
    -	vpxorq	ymm22,ymm22,ymm22
    -	vpmadd52luq	ymm22,ymm3,ymm8
    -	vpxorq	ymm23,ymm23,ymm23
    -	vpmadd52huq	ymm23,ymm3,ymm8
    -
    -	vpmadd52luq	ymm18,ymm3,ymm6
    -	vpmadd52huq	ymm19,ymm3,ymm6
    -	vpmadd52luq	ymm20,ymm4,ymm6
    -	vpmadd52huq	ymm21,ymm4,ymm6
    -	vpmadd52luq	ymm22,ymm5,ymm6
    -	vpmadd52huq	ymm23,ymm5,ymm6
    -
    -	vpmadd52luq	ymm18,ymm17,ymm7
    -	vpmadd52huq	ymm19,ymm17,ymm7
    -	vpmadd52luq	ymm20,ymm3,ymm7
    -	vpmadd52huq	ymm21,ymm3,ymm7
    -	vpmadd52luq	ymm22,ymm4,ymm7
    -	vpmadd52huq	ymm23,ymm4,ymm7
    -
    -
    -
    -	vpsrlq	ymm30,ymm18,44
    -	vpsllq	ymm19,ymm19,8
    -	vpandq	ymm6,ymm18,ymm28
    -	vpaddq	ymm19,ymm19,ymm30
    -
    -	vpaddq	ymm20,ymm20,ymm19
    -
    -	vpsrlq	ymm30,ymm20,44
    -	vpsllq	ymm21,ymm21,8
    -	vpandq	ymm7,ymm20,ymm28
    -	vpaddq	ymm21,ymm21,ymm30
    -
    -	vpaddq	ymm22,ymm22,ymm21
    -
    -	vpsrlq	ymm30,ymm22,42
    -	vpsllq	ymm23,ymm23,10
    -	vpandq	ymm8,ymm22,ymm29
    -	vpaddq	ymm23,ymm23,ymm30
    -
    -	vpaddq	ymm6,ymm6,ymm23
    -	vpsllq	ymm23,ymm23,2
    -
    -	vpaddq	ymm6,ymm6,ymm23
    -
    -	vpsrlq	ymm30,ymm6,44
    -	vpandq	ymm6,ymm6,ymm28
    -
    -	vpaddq	ymm7,ymm7,ymm30
    -
    -
    -
    -
    -
    -	vpunpcklqdq	ymm26,ymm8,ymm5
    -	vpunpckhqdq	ymm5,ymm8,ymm5
    -	vpunpcklqdq	ymm24,ymm6,ymm3
    -	vpunpckhqdq	ymm3,ymm6,ymm3
    -	vpunpcklqdq	ymm25,ymm7,ymm4
    -	vpunpckhqdq	ymm4,ymm7,ymm4
    -	vshufi64x2	zmm8,zmm26,zmm5,0x44
    -	vshufi64x2	zmm6,zmm24,zmm3,0x44
    -	vshufi64x2	zmm7,zmm25,zmm4,0x44
    -
    -	vmovdqu64	zmm26,ZMMWORD[rsi]
    -	vmovdqu64	zmm27,ZMMWORD[64+rsi]
    -	lea	rsi,[128+rsi]
    -
    -	vpsllq	zmm10,zmm8,2
    -	vpsllq	zmm9,zmm7,2
    -	vpaddq	zmm10,zmm10,zmm8
    -	vpaddq	zmm9,zmm9,zmm7
    -	vpsllq	zmm10,zmm10,2
    -	vpsllq	zmm9,zmm9,2
    -
    -	vpbroadcastq	zmm31,rcx
    -	vpbroadcastq	zmm28,xmm28
    -	vpbroadcastq	zmm29,xmm29
    -
    -	vpbroadcastq	zmm16,xmm9
    -	vpbroadcastq	zmm17,xmm10
    -	vpbroadcastq	zmm3,xmm6
    -	vpbroadcastq	zmm4,xmm7
    -	vpbroadcastq	zmm5,xmm8
    -
    -	vpunpcklqdq	zmm25,zmm26,zmm27
    -	vpunpckhqdq	zmm27,zmm26,zmm27
    -
    -
    -
    -	vpsrlq	zmm26,zmm27,24
    -	vporq	zmm26,zmm26,zmm31
    -	vpaddq	zmm2,zmm2,zmm26
    -	vpandq	zmm24,zmm25,zmm28
    -	vpsrlq	zmm25,zmm25,44
    -	vpsllq	zmm27,zmm27,20
    -	vporq	zmm25,zmm25,zmm27
    -	vpandq	zmm25,zmm25,zmm28
    -
    -	sub	rdx,8
    -	jz	NEAR $L$tail_vpmadd52_8x
    -	jmp	NEAR $L$oop_vpmadd52_8x
    -
    -ALIGN	32
    -$L$oop_vpmadd52_8x:
    -
    -	vpaddq	zmm0,zmm0,zmm24
    -	vpaddq	zmm1,zmm1,zmm25
    -
    -	vpxorq	zmm18,zmm18,zmm18
    -	vpmadd52luq	zmm18,zmm16,zmm2
    -	vpxorq	zmm19,zmm19,zmm19
    -	vpmadd52huq	zmm19,zmm16,zmm2
    -	vpxorq	zmm20,zmm20,zmm20
    -	vpmadd52luq	zmm20,zmm17,zmm2
    -	vpxorq	zmm21,zmm21,zmm21
    -	vpmadd52huq	zmm21,zmm17,zmm2
    -	vpxorq	zmm22,zmm22,zmm22
    -	vpmadd52luq	zmm22,zmm3,zmm2
    -	vpxorq	zmm23,zmm23,zmm23
    -	vpmadd52huq	zmm23,zmm3,zmm2
    -
    -	vmovdqu64	zmm26,ZMMWORD[rsi]
    -	vmovdqu64	zmm27,ZMMWORD[64+rsi]
    -	lea	rsi,[128+rsi]
    -	vpmadd52luq	zmm18,zmm3,zmm0
    -	vpmadd52huq	zmm19,zmm3,zmm0
    -	vpmadd52luq	zmm20,zmm4,zmm0
    -	vpmadd52huq	zmm21,zmm4,zmm0
    -	vpmadd52luq	zmm22,zmm5,zmm0
    -	vpmadd52huq	zmm23,zmm5,zmm0
    -
    -	vpunpcklqdq	zmm25,zmm26,zmm27
    -	vpunpckhqdq	zmm27,zmm26,zmm27
    -	vpmadd52luq	zmm18,zmm17,zmm1
    -	vpmadd52huq	zmm19,zmm17,zmm1
    -	vpmadd52luq	zmm20,zmm3,zmm1
    -	vpmadd52huq	zmm21,zmm3,zmm1
    -	vpmadd52luq	zmm22,zmm4,zmm1
    -	vpmadd52huq	zmm23,zmm4,zmm1
    -
    -
    -
    -	vpsrlq	zmm30,zmm18,44
    -	vpsllq	zmm19,zmm19,8
    -	vpandq	zmm0,zmm18,zmm28
    -	vpaddq	zmm19,zmm19,zmm30
    -
    -	vpsrlq	zmm26,zmm27,24
    -	vporq	zmm26,zmm26,zmm31
    -	vpaddq	zmm20,zmm20,zmm19
    -
    -	vpsrlq	zmm30,zmm20,44
    -	vpsllq	zmm21,zmm21,8
    -	vpandq	zmm1,zmm20,zmm28
    -	vpaddq	zmm21,zmm21,zmm30
    -
    -	vpandq	zmm24,zmm25,zmm28
    -	vpsrlq	zmm25,zmm25,44
    -	vpsllq	zmm27,zmm27,20
    -	vpaddq	zmm22,zmm22,zmm21
    -
    -	vpsrlq	zmm30,zmm22,42
    -	vpsllq	zmm23,zmm23,10
    -	vpandq	zmm2,zmm22,zmm29
    -	vpaddq	zmm23,zmm23,zmm30
    -
    -	vpaddq	zmm2,zmm2,zmm26
    -	vpaddq	zmm0,zmm0,zmm23
    -	vpsllq	zmm23,zmm23,2
    -
    -	vpaddq	zmm0,zmm0,zmm23
    -	vporq	zmm25,zmm25,zmm27
    -	vpandq	zmm25,zmm25,zmm28
    -
    -	vpsrlq	zmm30,zmm0,44
    -	vpandq	zmm0,zmm0,zmm28
    -
    -	vpaddq	zmm1,zmm1,zmm30
    -
    -	sub	rdx,8
    -	jnz	NEAR $L$oop_vpmadd52_8x
    -
    -$L$tail_vpmadd52_8x:
    -
    -	vpaddq	zmm0,zmm0,zmm24
    -	vpaddq	zmm1,zmm1,zmm25
    -
    -	vpxorq	zmm18,zmm18,zmm18
    -	vpmadd52luq	zmm18,zmm9,zmm2
    -	vpxorq	zmm19,zmm19,zmm19
    -	vpmadd52huq	zmm19,zmm9,zmm2
    -	vpxorq	zmm20,zmm20,zmm20
    -	vpmadd52luq	zmm20,zmm10,zmm2
    -	vpxorq	zmm21,zmm21,zmm21
    -	vpmadd52huq	zmm21,zmm10,zmm2
    -	vpxorq	zmm22,zmm22,zmm22
    -	vpmadd52luq	zmm22,zmm6,zmm2
    -	vpxorq	zmm23,zmm23,zmm23
    -	vpmadd52huq	zmm23,zmm6,zmm2
    -
    -	vpmadd52luq	zmm18,zmm6,zmm0
    -	vpmadd52huq	zmm19,zmm6,zmm0
    -	vpmadd52luq	zmm20,zmm7,zmm0
    -	vpmadd52huq	zmm21,zmm7,zmm0
    -	vpmadd52luq	zmm22,zmm8,zmm0
    -	vpmadd52huq	zmm23,zmm8,zmm0
    -
    -	vpmadd52luq	zmm18,zmm10,zmm1
    -	vpmadd52huq	zmm19,zmm10,zmm1
    -	vpmadd52luq	zmm20,zmm6,zmm1
    -	vpmadd52huq	zmm21,zmm6,zmm1
    -	vpmadd52luq	zmm22,zmm7,zmm1
    -	vpmadd52huq	zmm23,zmm7,zmm1
    -
    -
    -
    -
    -	mov	eax,1
    -	kmovw	k1,eax
    -	vpsrldq	zmm24,zmm18,8
    -	vpsrldq	zmm0,zmm19,8
    -	vpsrldq	zmm25,zmm20,8
    -	vpsrldq	zmm1,zmm21,8
    -	vpaddq	zmm18,zmm18,zmm24
    -	vpaddq	zmm19,zmm19,zmm0
    -	vpsrldq	zmm26,zmm22,8
    -	vpsrldq	zmm2,zmm23,8
    -	vpaddq	zmm20,zmm20,zmm25
    -	vpaddq	zmm21,zmm21,zmm1
    -	vpermq	zmm24,zmm18,0x2
    -	vpermq	zmm0,zmm19,0x2
    -	vpaddq	zmm22,zmm22,zmm26
    -	vpaddq	zmm23,zmm23,zmm2
    -
    -	vpermq	zmm25,zmm20,0x2
    -	vpermq	zmm1,zmm21,0x2
    -	vpaddq	zmm18,zmm18,zmm24
    -	vpaddq	zmm19,zmm19,zmm0
    -	vpermq	zmm26,zmm22,0x2
    -	vpermq	zmm2,zmm23,0x2
    -	vpaddq	zmm20,zmm20,zmm25
    -	vpaddq	zmm21,zmm21,zmm1
    -	vextracti64x4	ymm24,zmm18,1
    -	vextracti64x4	ymm0,zmm19,1
    -	vpaddq	zmm22,zmm22,zmm26
    -	vpaddq	zmm23,zmm23,zmm2
    -
    -	vextracti64x4	ymm25,zmm20,1
    -	vextracti64x4	ymm1,zmm21,1
    -	vextracti64x4	ymm26,zmm22,1
    -	vextracti64x4	ymm2,zmm23,1
    -	vpaddq	ymm18{k1}{z},ymm18,ymm24
    -	vpaddq	ymm19{k1}{z},ymm19,ymm0
    -	vpaddq	ymm20{k1}{z},ymm20,ymm25
    -	vpaddq	ymm21{k1}{z},ymm21,ymm1
    -	vpaddq	ymm22{k1}{z},ymm22,ymm26
    -	vpaddq	ymm23{k1}{z},ymm23,ymm2
    -
    -
    -
    -	vpsrlq	ymm30,ymm18,44
    -	vpsllq	ymm19,ymm19,8
    -	vpandq	ymm0,ymm18,ymm28
    -	vpaddq	ymm19,ymm19,ymm30
    -
    -	vpaddq	ymm20,ymm20,ymm19
    -
    -	vpsrlq	ymm30,ymm20,44
    -	vpsllq	ymm21,ymm21,8
    -	vpandq	ymm1,ymm20,ymm28
    -	vpaddq	ymm21,ymm21,ymm30
    -
    -	vpaddq	ymm22,ymm22,ymm21
    -
    -	vpsrlq	ymm30,ymm22,42
    -	vpsllq	ymm23,ymm23,10
    -	vpandq	ymm2,ymm22,ymm29
    -	vpaddq	ymm23,ymm23,ymm30
    -
    -	vpaddq	ymm0,ymm0,ymm23
    -	vpsllq	ymm23,ymm23,2
    -
    -	vpaddq	ymm0,ymm0,ymm23
    -
    -	vpsrlq	ymm30,ymm0,44
    -	vpandq	ymm0,ymm0,ymm28
    -
    -	vpaddq	ymm1,ymm1,ymm30
    -
    -
    -
    -	vmovq	QWORD[rdi],xmm0
    -	vmovq	QWORD[8+rdi],xmm1
    -	vmovq	QWORD[16+rdi],xmm2
    -	vzeroall
    -
    -$L$no_data_vpmadd52_8x:
    -	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
    -	mov	rsi,QWORD[16+rsp]
    -	DB	0F3h,0C3h		;repret
    -
    -$L$SEH_end_poly1305_blocks_vpmadd52_8x:
    -
    -ALIGN	32
    -poly1305_emit_base2_44:
    -	mov	QWORD[8+rsp],rdi	;WIN64 prologue
    -	mov	QWORD[16+rsp],rsi
    -	mov	rax,rsp
    -$L$SEH_begin_poly1305_emit_base2_44:
    -	mov	rdi,rcx
    -	mov	rsi,rdx
    -	mov	rdx,r8
    -
    -
    -
    -DB	243,15,30,250
    -	mov	r8,QWORD[rdi]
    -	mov	r9,QWORD[8+rdi]
    -	mov	r10,QWORD[16+rdi]
    -
    -	mov	rax,r9
    -	shr	r9,20
    -	shl	rax,44
    -	mov	rcx,r10
    -	shr	r10,40
    -	shl	rcx,24
    -
    -	add	r8,rax
    -	adc	r9,rcx
    -	adc	r10,0
    -
    -	mov	rax,r8
    -	add	r8,5
    -	mov	rcx,r9
    -	adc	r9,0
    -	adc	r10,0
    -	shr	r10,2
    -	cmovnz	rax,r8
    -	cmovnz	rcx,r9
    -
    -	add	rax,QWORD[rdx]
    -	adc	rcx,QWORD[8+rdx]
    -	mov	QWORD[rsi],rax
    -	mov	QWORD[8+rsi],rcx
    -
    -	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
    -	mov	rsi,QWORD[16+rsp]
    -	DB	0F3h,0C3h		;repret
    -
    -$L$SEH_end_poly1305_emit_base2_44:
     ALIGN	64
     $L$const:
     $L$mask24:
    diff --git a/deps/openssl/config/archs/VC-WIN64A/asm_avx2/include/openssl/opensslv.h b/deps/openssl/config/archs/VC-WIN64A/asm_avx2/include/openssl/opensslv.h
    index 38b44f1054ad3d..a410f0eddf361c 100644
    --- a/deps/openssl/config/archs/VC-WIN64A/asm_avx2/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/VC-WIN64A/asm_avx2/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/VC-WIN64A/asm_avx2/include/openssl/pkcs7.h b/deps/openssl/config/archs/VC-WIN64A/asm_avx2/include/openssl/pkcs7.h
    index 3978fd087bca3b..0a95a93e59e262 100644
    --- a/deps/openssl/config/archs/VC-WIN64A/asm_avx2/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/VC-WIN64A/asm_avx2/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/VC-WIN64A/no-asm/configdata.pm b/deps/openssl/config/archs/VC-WIN64A/no-asm/configdata.pm
    index 37fe7ad1554464..8216effe724d74 100644
    --- a/deps/openssl/config/archs/VC-WIN64A/no-asm/configdata.pm
    +++ b/deps/openssl/config/archs/VC-WIN64A/no-asm/configdata.pm
    @@ -166,7 +166,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -218,7 +218,7 @@ our %config = (
         ],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-asm no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -271,11 +271,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "VC-WIN64A",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "lib",
    @@ -290,7 +290,7 @@ our %target = (
         "LDFLAGS" => "/nologo /debug",
         "MT" => "mt",
         "MTFLAGS" => "-nologo",
    -    "RANLIB" => "CODE(0x55ad7db3afe8)",
    +    "RANLIB" => "CODE(0x555a33e1b438)",
         "RC" => "rc",
         "_conf_fname_int" => [
             "Configurations/00-base-templates.conf",
    @@ -356,7 +356,7 @@ our %target = (
         "mtoutflag" => "-outputresource:",
         "multilib" => "-x64",
         "perl_platform" => "Windows::MSVC",
    -    "perlasm_scheme" => "auto",
    +    "perlasm_scheme" => "nasm",
         "rcoutflag" => "/fo",
         "shared_cflag" => "",
         "shared_defflag" => "",
    diff --git a/deps/openssl/config/archs/VC-WIN64A/no-asm/crypto/buildinf.h b/deps/openssl/config/archs/VC-WIN64A/no-asm/crypto/buildinf.h
    index f0e9d087e2267d..369ab9a8a4cd45 100644
    --- a/deps/openssl/config/archs/VC-WIN64A/no-asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/VC-WIN64A/no-asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: "
    -#define DATE "built on: Sun Aug  6 00:43:05 2023 UTC"
    +#define DATE "built on: Thu Oct 26 15:04:07 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/VC-WIN64A/no-asm/include/openssl/opensslv.h b/deps/openssl/config/archs/VC-WIN64A/no-asm/include/openssl/opensslv.h
    index 38b44f1054ad3d..a410f0eddf361c 100644
    --- a/deps/openssl/config/archs/VC-WIN64A/no-asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/VC-WIN64A/no-asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/VC-WIN64A/no-asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/VC-WIN64A/no-asm/include/openssl/pkcs7.h
    index 3978fd087bca3b..0a95a93e59e262 100644
    --- a/deps/openssl/config/archs/VC-WIN64A/no-asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/VC-WIN64A/no-asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/aix64-gcc-as/asm/configdata.pm b/deps/openssl/config/archs/aix64-gcc-as/asm/configdata.pm
    index ca05289b718d86..510129745cd0c6 100644
    --- a/deps/openssl/config/archs/aix64-gcc-as/asm/configdata.pm
    +++ b/deps/openssl/config/archs/aix64-gcc-as/asm/configdata.pm
    @@ -156,7 +156,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -206,7 +206,7 @@ our %config = (
         ],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -258,11 +258,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "aix64-gcc-as",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar -X64",
    diff --git a/deps/openssl/config/archs/aix64-gcc-as/asm/crypto/buildinf.h b/deps/openssl/config/archs/aix64-gcc-as/asm/crypto/buildinf.h
    index 3f01432e2b1840..7d0c5f9befa8ba 100644
    --- a/deps/openssl/config/archs/aix64-gcc-as/asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/aix64-gcc-as/asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: aix64-gcc-as"
    -#define DATE "built on: Sun Aug  6 00:24:21 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:47:40 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/aix64-gcc-as/asm/include/openssl/opensslv.h b/deps/openssl/config/archs/aix64-gcc-as/asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/aix64-gcc-as/asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/aix64-gcc-as/asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/aix64-gcc-as/asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/aix64-gcc-as/asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/aix64-gcc-as/asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/aix64-gcc-as/asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/aix64-gcc-as/asm_avx2/configdata.pm b/deps/openssl/config/archs/aix64-gcc-as/asm_avx2/configdata.pm
    index a8d6fc77f0ac2d..65c498fd6d0e27 100644
    --- a/deps/openssl/config/archs/aix64-gcc-as/asm_avx2/configdata.pm
    +++ b/deps/openssl/config/archs/aix64-gcc-as/asm_avx2/configdata.pm
    @@ -156,7 +156,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -206,7 +206,7 @@ our %config = (
         ],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -258,11 +258,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "aix64-gcc-as",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar -X64",
    diff --git a/deps/openssl/config/archs/aix64-gcc-as/asm_avx2/crypto/buildinf.h b/deps/openssl/config/archs/aix64-gcc-as/asm_avx2/crypto/buildinf.h
    index ec624a65971b4b..f2880ddb869f23 100644
    --- a/deps/openssl/config/archs/aix64-gcc-as/asm_avx2/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/aix64-gcc-as/asm_avx2/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: aix64-gcc-as"
    -#define DATE "built on: Sun Aug  6 00:24:41 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:47:59 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/aix64-gcc-as/asm_avx2/include/openssl/opensslv.h b/deps/openssl/config/archs/aix64-gcc-as/asm_avx2/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/aix64-gcc-as/asm_avx2/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/aix64-gcc-as/asm_avx2/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/aix64-gcc-as/asm_avx2/include/openssl/pkcs7.h b/deps/openssl/config/archs/aix64-gcc-as/asm_avx2/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/aix64-gcc-as/asm_avx2/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/aix64-gcc-as/asm_avx2/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/aix64-gcc-as/no-asm/configdata.pm b/deps/openssl/config/archs/aix64-gcc-as/no-asm/configdata.pm
    index fdfbcce8adc844..24ad5c6241368a 100644
    --- a/deps/openssl/config/archs/aix64-gcc-as/no-asm/configdata.pm
    +++ b/deps/openssl/config/archs/aix64-gcc-as/no-asm/configdata.pm
    @@ -154,7 +154,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -205,7 +205,7 @@ our %config = (
         ],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-asm no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -258,11 +258,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "aix64-gcc-as",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar -X64",
    diff --git a/deps/openssl/config/archs/aix64-gcc-as/no-asm/crypto/buildinf.h b/deps/openssl/config/archs/aix64-gcc-as/no-asm/crypto/buildinf.h
    index 83233146a50c97..f7891d1f2dcf82 100644
    --- a/deps/openssl/config/archs/aix64-gcc-as/no-asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/aix64-gcc-as/no-asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: aix64-gcc-as"
    -#define DATE "built on: Sun Aug  6 00:25:01 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:48:18 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/aix64-gcc-as/no-asm/include/openssl/opensslv.h b/deps/openssl/config/archs/aix64-gcc-as/no-asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/aix64-gcc-as/no-asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/aix64-gcc-as/no-asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/aix64-gcc-as/no-asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/aix64-gcc-as/no-asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/aix64-gcc-as/no-asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/aix64-gcc-as/no-asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/darwin-i386-cc/asm/configdata.pm b/deps/openssl/config/archs/darwin-i386-cc/asm/configdata.pm
    index ba53b9f9cea130..ee6540933123b5 100644
    --- a/deps/openssl/config/archs/darwin-i386-cc/asm/configdata.pm
    +++ b/deps/openssl/config/archs/darwin-i386-cc/asm/configdata.pm
    @@ -156,7 +156,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -206,7 +206,7 @@ our %config = (
         ],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -258,11 +258,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "darwin-i386-cc",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/darwin-i386-cc/asm/crypto/buildinf.h b/deps/openssl/config/archs/darwin-i386-cc/asm/crypto/buildinf.h
    index e98ef7735cb4ed..10dc2211417972 100644
    --- a/deps/openssl/config/archs/darwin-i386-cc/asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/darwin-i386-cc/asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: darwin-i386-cc"
    -#define DATE "built on: Sun Aug  6 00:28:31 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:51:44 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/darwin-i386-cc/asm/include/openssl/opensslv.h b/deps/openssl/config/archs/darwin-i386-cc/asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/darwin-i386-cc/asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/darwin-i386-cc/asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/darwin-i386-cc/asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/darwin-i386-cc/asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/darwin-i386-cc/asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/darwin-i386-cc/asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/darwin-i386-cc/asm_avx2/configdata.pm b/deps/openssl/config/archs/darwin-i386-cc/asm_avx2/configdata.pm
    index a1999fe03a4772..6b70420111afc6 100644
    --- a/deps/openssl/config/archs/darwin-i386-cc/asm_avx2/configdata.pm
    +++ b/deps/openssl/config/archs/darwin-i386-cc/asm_avx2/configdata.pm
    @@ -156,7 +156,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -206,7 +206,7 @@ our %config = (
         ],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -258,11 +258,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "darwin-i386-cc",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/darwin-i386-cc/asm_avx2/crypto/buildinf.h b/deps/openssl/config/archs/darwin-i386-cc/asm_avx2/crypto/buildinf.h
    index 76159a1731d678..f2e82653eee930 100644
    --- a/deps/openssl/config/archs/darwin-i386-cc/asm_avx2/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/darwin-i386-cc/asm_avx2/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: darwin-i386-cc"
    -#define DATE "built on: Sun Aug  6 00:28:51 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:52:03 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/darwin-i386-cc/asm_avx2/include/openssl/opensslv.h b/deps/openssl/config/archs/darwin-i386-cc/asm_avx2/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/darwin-i386-cc/asm_avx2/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/darwin-i386-cc/asm_avx2/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/darwin-i386-cc/asm_avx2/include/openssl/pkcs7.h b/deps/openssl/config/archs/darwin-i386-cc/asm_avx2/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/darwin-i386-cc/asm_avx2/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/darwin-i386-cc/asm_avx2/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/darwin-i386-cc/no-asm/configdata.pm b/deps/openssl/config/archs/darwin-i386-cc/no-asm/configdata.pm
    index 97fab50db92bdf..51670419239bfc 100644
    --- a/deps/openssl/config/archs/darwin-i386-cc/no-asm/configdata.pm
    +++ b/deps/openssl/config/archs/darwin-i386-cc/no-asm/configdata.pm
    @@ -154,7 +154,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -205,7 +205,7 @@ our %config = (
         ],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-asm no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -258,11 +258,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "darwin-i386-cc",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/darwin-i386-cc/no-asm/crypto/buildinf.h b/deps/openssl/config/archs/darwin-i386-cc/no-asm/crypto/buildinf.h
    index 67ace143c5c393..f9b9c4c980b695 100644
    --- a/deps/openssl/config/archs/darwin-i386-cc/no-asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/darwin-i386-cc/no-asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: darwin-i386-cc"
    -#define DATE "built on: Sun Aug  6 00:29:11 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:52:23 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/darwin-i386-cc/no-asm/include/openssl/opensslv.h b/deps/openssl/config/archs/darwin-i386-cc/no-asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/darwin-i386-cc/no-asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/darwin-i386-cc/no-asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/darwin-i386-cc/no-asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/darwin-i386-cc/no-asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/darwin-i386-cc/no-asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/darwin-i386-cc/no-asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/darwin64-arm64-cc/asm/configdata.pm b/deps/openssl/config/archs/darwin64-arm64-cc/asm/configdata.pm
    index 9b51a15ef51371..532f2649c95127 100644
    --- a/deps/openssl/config/archs/darwin64-arm64-cc/asm/configdata.pm
    +++ b/deps/openssl/config/archs/darwin64-arm64-cc/asm/configdata.pm
    @@ -156,7 +156,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -206,7 +206,7 @@ our %config = (
         ],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -258,11 +258,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "darwin64-arm64-cc",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/darwin64-arm64-cc/asm/crypto/aes/aesv8-armx.S b/deps/openssl/config/archs/darwin64-arm64-cc/asm/crypto/aes/aesv8-armx.S
    index 5e3afc1ced813d..ae20ad9ff6fbcb 100644
    --- a/deps/openssl/config/archs/darwin64-arm64-cc/asm/crypto/aes/aesv8-armx.S
    +++ b/deps/openssl/config/archs/darwin64-arm64-cc/asm/crypto/aes/aesv8-armx.S
    @@ -103,7 +103,7 @@ L192:
     Loop192:
     	tbl	v6.16b,{v4.16b},v2.16b
     	ext	v5.16b,v0.16b,v3.16b,#12
    -#ifdef __ARMEB__
    +#ifdef __AARCH64EB__
     	st1	{v4.4s},[x2],#16
     	sub	x2,x2,#8
     #else
    @@ -1510,7 +1510,7 @@ _aes_v8_ctr32_encrypt_blocks:
     	ldr	w5,[x3,#240]
     
     	ldr	w8, [x4, #12]
    -#ifdef __ARMEB__
    +#ifdef __AARCH64EB__
     	ld1	{v0.16b},[x4]
     #else
     	ld1	{v0.4s},[x4]
    @@ -1527,7 +1527,7 @@ _aes_v8_ctr32_encrypt_blocks:
     	add	x7,x3,#32
     	mov	w6,w5
     	csel	x12,xzr,x12,lo
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev	w8, w8
     #endif
     	orr	v1.16b,v0.16b,v0.16b
    diff --git a/deps/openssl/config/archs/darwin64-arm64-cc/asm/crypto/buildinf.h b/deps/openssl/config/archs/darwin64-arm64-cc/asm/crypto/buildinf.h
    index 2e38ca1fc8f695..25b8011da926c1 100644
    --- a/deps/openssl/config/archs/darwin64-arm64-cc/asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/darwin64-arm64-cc/asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: darwin64-arm64-cc"
    -#define DATE "built on: Sun Aug  6 00:29:30 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:52:40 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/darwin64-arm64-cc/asm/crypto/modes/ghashv8-armx.S b/deps/openssl/config/archs/darwin64-arm64-cc/asm/crypto/modes/ghashv8-armx.S
    index 200c0d031253ea..dc71d8508de6f8 100644
    --- a/deps/openssl/config/archs/darwin64-arm64-cc/asm/crypto/modes/ghashv8-armx.S
    +++ b/deps/openssl/config/archs/darwin64-arm64-cc/asm/crypto/modes/ghashv8-armx.S
    @@ -101,7 +101,7 @@ _gcm_gmult_v8:
     	movi	v19.16b,#0xe1
     	ld1	{v20.2d,v21.2d},[x1]	//load twisted H, ...
     	shl	v19.2d,v19.2d,#57
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v17.16b,v17.16b
     #endif
     	ext	v3.16b,v17.16b,v17.16b,#8
    @@ -126,7 +126,7 @@ _gcm_gmult_v8:
     	eor	v18.16b,v18.16b,v2.16b
     	eor	v0.16b,v0.16b,v18.16b
     
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v0.16b,v0.16b
     #endif
     	ext	v0.16b,v0.16b,v0.16b,#8
    @@ -163,14 +163,14 @@ _gcm_ghash_v8:
     	ext	v0.16b,v0.16b,v0.16b,#8		//rotate Xi
     	ld1	{v16.2d},[x2],#16	//load [rotated] I[0]
     	shl	v19.2d,v19.2d,#57		//compose 0xc2.0 constant
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v16.16b,v16.16b
     	rev64	v0.16b,v0.16b
     #endif
     	ext	v3.16b,v16.16b,v16.16b,#8		//rotate I[0]
     	b.lo	Lodd_tail_v8		//x3 was less than 32
     	ld1	{v17.2d},[x2],x12	//load [rotated] I[1]
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v17.16b,v17.16b
     #endif
     	ext	v7.16b,v17.16b,v17.16b,#8
    @@ -202,13 +202,13 @@ Loop_mod2x_v8:
     	eor	v18.16b,v0.16b,v2.16b
     	eor	v1.16b,v1.16b,v17.16b
     	ld1	{v17.2d},[x2],x12	//load [rotated] I[i+3]
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v16.16b,v16.16b
     #endif
     	eor	v1.16b,v1.16b,v18.16b
     	pmull	v18.1q,v0.1d,v19.1d		//1st phase of reduction
     
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v17.16b,v17.16b
     #endif
     	ins	v2.d[0],v1.d[1]
    @@ -258,7 +258,7 @@ Lodd_tail_v8:
     	eor	v0.16b,v0.16b,v18.16b
     
     Ldone_v8:
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v0.16b,v0.16b
     #endif
     	ext	v0.16b,v0.16b,v0.16b,#8
    @@ -277,7 +277,7 @@ Lgcm_ghash_v8_4x:
     	shl	v19.2d,v19.2d,#57		//compose 0xc2.0 constant
     
     	ld1	{v4.2d,v5.2d,v6.2d,v7.2d},[x2],#64
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v0.16b,v0.16b
     	rev64	v5.16b,v5.16b
     	rev64	v6.16b,v6.16b
    @@ -321,7 +321,7 @@ Loop4x:
     	eor	v16.16b,v4.16b,v0.16b
     	ld1	{v4.2d,v5.2d,v6.2d,v7.2d},[x2],#64
     	ext	v3.16b,v16.16b,v16.16b,#8
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v5.16b,v5.16b
     	rev64	v6.16b,v6.16b
     	rev64	v7.16b,v7.16b
    @@ -404,7 +404,7 @@ Lthree:
     	eor	v1.16b,v1.16b,v17.16b
     	ld1	{v4.2d,v5.2d,v6.2d},[x2]
     	eor	v1.16b,v1.16b,v18.16b
    -#ifndef	__ARMEB__
    +#ifndef	__AARCH64EB__
     	rev64	v5.16b,v5.16b
     	rev64	v6.16b,v6.16b
     	rev64	v4.16b,v4.16b
    @@ -456,7 +456,7 @@ Ltwo:
     	eor	v1.16b,v1.16b,v17.16b
     	ld1	{v4.2d,v5.2d},[x2]
     	eor	v1.16b,v1.16b,v18.16b
    -#ifndef	__ARMEB__
    +#ifndef	__AARCH64EB__
     	rev64	v5.16b,v5.16b
     	rev64	v4.16b,v4.16b
     #endif
    @@ -499,7 +499,7 @@ Lone:
     	eor	v1.16b,v1.16b,v17.16b
     	ld1	{v4.2d},[x2]
     	eor	v1.16b,v1.16b,v18.16b
    -#ifndef	__ARMEB__
    +#ifndef	__AARCH64EB__
     	rev64	v4.16b,v4.16b
     #endif
     
    @@ -539,7 +539,7 @@ Ldone4x:
     	eor	v0.16b,v0.16b,v18.16b
     	ext	v0.16b,v0.16b,v0.16b,#8
     
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v0.16b,v0.16b
     #endif
     	st1	{v0.2d},[x0]		//write out Xi
    diff --git a/deps/openssl/config/archs/darwin64-arm64-cc/asm/crypto/poly1305/poly1305-armv8.S b/deps/openssl/config/archs/darwin64-arm64-cc/asm/crypto/poly1305/poly1305-armv8.S
    index 90b6d357ac1483..a044e14cb61f5f 100644
    --- a/deps/openssl/config/archs/darwin64-arm64-cc/asm/crypto/poly1305/poly1305-armv8.S
    +++ b/deps/openssl/config/archs/darwin64-arm64-cc/asm/crypto/poly1305/poly1305-armv8.S
    @@ -28,7 +28,7 @@ _poly1305_init:
     	ldp	x7,x8,[x1]		// load key
     	mov	x9,#0xfffffffc0fffffff
     	movk	x9,#0x0fff,lsl#48
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x7,x7			// flip bytes
     	rev	x8,x8
     #endif
    @@ -75,7 +75,7 @@ Lpoly1305_blocks:
     Loop:
     	ldp	x10,x11,[x1],#16	// load input
     	sub	x2,x2,#16
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x10,x10
     	rev	x11,x11
     #endif
    @@ -140,13 +140,13 @@ Lpoly1305_emit:
     	csel	x4,x4,x12,eq
     	csel	x5,x5,x13,eq
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	ror	x10,x10,#32		// flip nonce words
     	ror	x11,x11,#32
     #endif
     	adds	x4,x4,x10		// accumulate nonce
     	adc	x5,x5,x11
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x4,x4			// flip output bytes
     	rev	x5,x5
     #endif
    @@ -266,7 +266,7 @@ Lblocks_neon:
     	adcs	x5,x5,xzr
     	adc	x6,x6,xzr
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x12,x12
     	rev	x13,x13
     #endif
    @@ -312,7 +312,7 @@ Lbase2_64_neon:
     	ldp	x12,x13,[x1],#16	// load input
     	sub	x2,x2,#16
     	add	x9,x8,x8,lsr#2	// s1 = r1 + (r1 >> 2)
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x12,x12
     	rev	x13,x13
     #endif
    @@ -397,7 +397,7 @@ Ldo_neon:
     	lsl	x3,x3,#24
     	add	x15,x0,#48
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x8,x8
     	rev	x12,x12
     	rev	x9,x9
    @@ -433,7 +433,7 @@ Ldo_neon:
     	ld1	{v4.4s,v5.4s,v6.4s,v7.4s},[x15],#64
     	ld1	{v8.4s},[x15]
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x8,x8
     	rev	x12,x12
     	rev	x9,x9
    @@ -494,7 +494,7 @@ Loop_neon:
     	umull	v20.2d,v14.2s,v1.s[2]
     	ldp	x9,x13,[x16],#48
     	umull	v19.2d,v14.2s,v0.s[2]
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x8,x8
     	rev	x12,x12
     	rev	x9,x9
    @@ -559,7 +559,7 @@ Loop_neon:
     	umlal	v23.2d,v11.2s,v3.s[0]
     	umlal	v20.2d,v11.2s,v8.s[0]
     	umlal	v21.2d,v11.2s,v0.s[0]
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x8,x8
     	rev	x12,x12
     	rev	x9,x9
    @@ -840,13 +840,13 @@ Lpoly1305_emit_neon:
     	csel	x4,x4,x12,eq
     	csel	x5,x5,x13,eq
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	ror	x10,x10,#32		// flip nonce words
     	ror	x11,x11,#32
     #endif
     	adds	x4,x4,x10		// accumulate nonce
     	adc	x5,x5,x11
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x4,x4			// flip output bytes
     	rev	x5,x5
     #endif
    diff --git a/deps/openssl/config/archs/darwin64-arm64-cc/asm/include/openssl/opensslv.h b/deps/openssl/config/archs/darwin64-arm64-cc/asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/darwin64-arm64-cc/asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/darwin64-arm64-cc/asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/darwin64-arm64-cc/asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/darwin64-arm64-cc/asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/darwin64-arm64-cc/asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/darwin64-arm64-cc/asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/configdata.pm b/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/configdata.pm
    index a465039cbfa855..ce36db2197645b 100644
    --- a/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/configdata.pm
    +++ b/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/configdata.pm
    @@ -156,7 +156,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -206,7 +206,7 @@ our %config = (
         ],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -258,11 +258,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "darwin64-arm64-cc",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/crypto/aes/aesv8-armx.S b/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/crypto/aes/aesv8-armx.S
    index 5e3afc1ced813d..ae20ad9ff6fbcb 100644
    --- a/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/crypto/aes/aesv8-armx.S
    +++ b/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/crypto/aes/aesv8-armx.S
    @@ -103,7 +103,7 @@ L192:
     Loop192:
     	tbl	v6.16b,{v4.16b},v2.16b
     	ext	v5.16b,v0.16b,v3.16b,#12
    -#ifdef __ARMEB__
    +#ifdef __AARCH64EB__
     	st1	{v4.4s},[x2],#16
     	sub	x2,x2,#8
     #else
    @@ -1510,7 +1510,7 @@ _aes_v8_ctr32_encrypt_blocks:
     	ldr	w5,[x3,#240]
     
     	ldr	w8, [x4, #12]
    -#ifdef __ARMEB__
    +#ifdef __AARCH64EB__
     	ld1	{v0.16b},[x4]
     #else
     	ld1	{v0.4s},[x4]
    @@ -1527,7 +1527,7 @@ _aes_v8_ctr32_encrypt_blocks:
     	add	x7,x3,#32
     	mov	w6,w5
     	csel	x12,xzr,x12,lo
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev	w8, w8
     #endif
     	orr	v1.16b,v0.16b,v0.16b
    diff --git a/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/crypto/buildinf.h b/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/crypto/buildinf.h
    index 513091049d0260..398666786c6285 100644
    --- a/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: darwin64-arm64-cc"
    -#define DATE "built on: Sun Aug  6 00:29:49 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:52:59 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/crypto/modes/ghashv8-armx.S b/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/crypto/modes/ghashv8-armx.S
    index 200c0d031253ea..dc71d8508de6f8 100644
    --- a/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/crypto/modes/ghashv8-armx.S
    +++ b/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/crypto/modes/ghashv8-armx.S
    @@ -101,7 +101,7 @@ _gcm_gmult_v8:
     	movi	v19.16b,#0xe1
     	ld1	{v20.2d,v21.2d},[x1]	//load twisted H, ...
     	shl	v19.2d,v19.2d,#57
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v17.16b,v17.16b
     #endif
     	ext	v3.16b,v17.16b,v17.16b,#8
    @@ -126,7 +126,7 @@ _gcm_gmult_v8:
     	eor	v18.16b,v18.16b,v2.16b
     	eor	v0.16b,v0.16b,v18.16b
     
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v0.16b,v0.16b
     #endif
     	ext	v0.16b,v0.16b,v0.16b,#8
    @@ -163,14 +163,14 @@ _gcm_ghash_v8:
     	ext	v0.16b,v0.16b,v0.16b,#8		//rotate Xi
     	ld1	{v16.2d},[x2],#16	//load [rotated] I[0]
     	shl	v19.2d,v19.2d,#57		//compose 0xc2.0 constant
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v16.16b,v16.16b
     	rev64	v0.16b,v0.16b
     #endif
     	ext	v3.16b,v16.16b,v16.16b,#8		//rotate I[0]
     	b.lo	Lodd_tail_v8		//x3 was less than 32
     	ld1	{v17.2d},[x2],x12	//load [rotated] I[1]
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v17.16b,v17.16b
     #endif
     	ext	v7.16b,v17.16b,v17.16b,#8
    @@ -202,13 +202,13 @@ Loop_mod2x_v8:
     	eor	v18.16b,v0.16b,v2.16b
     	eor	v1.16b,v1.16b,v17.16b
     	ld1	{v17.2d},[x2],x12	//load [rotated] I[i+3]
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v16.16b,v16.16b
     #endif
     	eor	v1.16b,v1.16b,v18.16b
     	pmull	v18.1q,v0.1d,v19.1d		//1st phase of reduction
     
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v17.16b,v17.16b
     #endif
     	ins	v2.d[0],v1.d[1]
    @@ -258,7 +258,7 @@ Lodd_tail_v8:
     	eor	v0.16b,v0.16b,v18.16b
     
     Ldone_v8:
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v0.16b,v0.16b
     #endif
     	ext	v0.16b,v0.16b,v0.16b,#8
    @@ -277,7 +277,7 @@ Lgcm_ghash_v8_4x:
     	shl	v19.2d,v19.2d,#57		//compose 0xc2.0 constant
     
     	ld1	{v4.2d,v5.2d,v6.2d,v7.2d},[x2],#64
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v0.16b,v0.16b
     	rev64	v5.16b,v5.16b
     	rev64	v6.16b,v6.16b
    @@ -321,7 +321,7 @@ Loop4x:
     	eor	v16.16b,v4.16b,v0.16b
     	ld1	{v4.2d,v5.2d,v6.2d,v7.2d},[x2],#64
     	ext	v3.16b,v16.16b,v16.16b,#8
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v5.16b,v5.16b
     	rev64	v6.16b,v6.16b
     	rev64	v7.16b,v7.16b
    @@ -404,7 +404,7 @@ Lthree:
     	eor	v1.16b,v1.16b,v17.16b
     	ld1	{v4.2d,v5.2d,v6.2d},[x2]
     	eor	v1.16b,v1.16b,v18.16b
    -#ifndef	__ARMEB__
    +#ifndef	__AARCH64EB__
     	rev64	v5.16b,v5.16b
     	rev64	v6.16b,v6.16b
     	rev64	v4.16b,v4.16b
    @@ -456,7 +456,7 @@ Ltwo:
     	eor	v1.16b,v1.16b,v17.16b
     	ld1	{v4.2d,v5.2d},[x2]
     	eor	v1.16b,v1.16b,v18.16b
    -#ifndef	__ARMEB__
    +#ifndef	__AARCH64EB__
     	rev64	v5.16b,v5.16b
     	rev64	v4.16b,v4.16b
     #endif
    @@ -499,7 +499,7 @@ Lone:
     	eor	v1.16b,v1.16b,v17.16b
     	ld1	{v4.2d},[x2]
     	eor	v1.16b,v1.16b,v18.16b
    -#ifndef	__ARMEB__
    +#ifndef	__AARCH64EB__
     	rev64	v4.16b,v4.16b
     #endif
     
    @@ -539,7 +539,7 @@ Ldone4x:
     	eor	v0.16b,v0.16b,v18.16b
     	ext	v0.16b,v0.16b,v0.16b,#8
     
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v0.16b,v0.16b
     #endif
     	st1	{v0.2d},[x0]		//write out Xi
    diff --git a/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/crypto/poly1305/poly1305-armv8.S b/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/crypto/poly1305/poly1305-armv8.S
    index 90b6d357ac1483..a044e14cb61f5f 100644
    --- a/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/crypto/poly1305/poly1305-armv8.S
    +++ b/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/crypto/poly1305/poly1305-armv8.S
    @@ -28,7 +28,7 @@ _poly1305_init:
     	ldp	x7,x8,[x1]		// load key
     	mov	x9,#0xfffffffc0fffffff
     	movk	x9,#0x0fff,lsl#48
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x7,x7			// flip bytes
     	rev	x8,x8
     #endif
    @@ -75,7 +75,7 @@ Lpoly1305_blocks:
     Loop:
     	ldp	x10,x11,[x1],#16	// load input
     	sub	x2,x2,#16
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x10,x10
     	rev	x11,x11
     #endif
    @@ -140,13 +140,13 @@ Lpoly1305_emit:
     	csel	x4,x4,x12,eq
     	csel	x5,x5,x13,eq
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	ror	x10,x10,#32		// flip nonce words
     	ror	x11,x11,#32
     #endif
     	adds	x4,x4,x10		// accumulate nonce
     	adc	x5,x5,x11
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x4,x4			// flip output bytes
     	rev	x5,x5
     #endif
    @@ -266,7 +266,7 @@ Lblocks_neon:
     	adcs	x5,x5,xzr
     	adc	x6,x6,xzr
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x12,x12
     	rev	x13,x13
     #endif
    @@ -312,7 +312,7 @@ Lbase2_64_neon:
     	ldp	x12,x13,[x1],#16	// load input
     	sub	x2,x2,#16
     	add	x9,x8,x8,lsr#2	// s1 = r1 + (r1 >> 2)
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x12,x12
     	rev	x13,x13
     #endif
    @@ -397,7 +397,7 @@ Ldo_neon:
     	lsl	x3,x3,#24
     	add	x15,x0,#48
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x8,x8
     	rev	x12,x12
     	rev	x9,x9
    @@ -433,7 +433,7 @@ Ldo_neon:
     	ld1	{v4.4s,v5.4s,v6.4s,v7.4s},[x15],#64
     	ld1	{v8.4s},[x15]
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x8,x8
     	rev	x12,x12
     	rev	x9,x9
    @@ -494,7 +494,7 @@ Loop_neon:
     	umull	v20.2d,v14.2s,v1.s[2]
     	ldp	x9,x13,[x16],#48
     	umull	v19.2d,v14.2s,v0.s[2]
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x8,x8
     	rev	x12,x12
     	rev	x9,x9
    @@ -559,7 +559,7 @@ Loop_neon:
     	umlal	v23.2d,v11.2s,v3.s[0]
     	umlal	v20.2d,v11.2s,v8.s[0]
     	umlal	v21.2d,v11.2s,v0.s[0]
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x8,x8
     	rev	x12,x12
     	rev	x9,x9
    @@ -840,13 +840,13 @@ Lpoly1305_emit_neon:
     	csel	x4,x4,x12,eq
     	csel	x5,x5,x13,eq
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	ror	x10,x10,#32		// flip nonce words
     	ror	x11,x11,#32
     #endif
     	adds	x4,x4,x10		// accumulate nonce
     	adc	x5,x5,x11
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x4,x4			// flip output bytes
     	rev	x5,x5
     #endif
    diff --git a/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/include/openssl/opensslv.h b/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/include/openssl/pkcs7.h b/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/darwin64-arm64-cc/asm_avx2/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/darwin64-arm64-cc/no-asm/configdata.pm b/deps/openssl/config/archs/darwin64-arm64-cc/no-asm/configdata.pm
    index 6519d8eb5ee0d2..d1c07ea505db01 100644
    --- a/deps/openssl/config/archs/darwin64-arm64-cc/no-asm/configdata.pm
    +++ b/deps/openssl/config/archs/darwin64-arm64-cc/no-asm/configdata.pm
    @@ -154,7 +154,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -205,7 +205,7 @@ our %config = (
         ],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-asm no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -258,11 +258,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "darwin64-arm64-cc",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/darwin64-arm64-cc/no-asm/crypto/buildinf.h b/deps/openssl/config/archs/darwin64-arm64-cc/no-asm/crypto/buildinf.h
    index bf5b5aecd602cd..f8a747399b32f4 100644
    --- a/deps/openssl/config/archs/darwin64-arm64-cc/no-asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/darwin64-arm64-cc/no-asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: darwin64-arm64-cc"
    -#define DATE "built on: Sun Aug  6 00:30:09 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:53:18 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/darwin64-arm64-cc/no-asm/include/openssl/opensslv.h b/deps/openssl/config/archs/darwin64-arm64-cc/no-asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/darwin64-arm64-cc/no-asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/darwin64-arm64-cc/no-asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/darwin64-arm64-cc/no-asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/darwin64-arm64-cc/no-asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/darwin64-arm64-cc/no-asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/darwin64-arm64-cc/no-asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/darwin64-x86_64-cc/asm/configdata.pm b/deps/openssl/config/archs/darwin64-x86_64-cc/asm/configdata.pm
    index 8f523192cad9d4..fbffdc36072be9 100644
    --- a/deps/openssl/config/archs/darwin64-x86_64-cc/asm/configdata.pm
    +++ b/deps/openssl/config/archs/darwin64-x86_64-cc/asm/configdata.pm
    @@ -156,7 +156,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -206,7 +206,7 @@ our %config = (
         ],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -258,11 +258,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "darwin64-x86_64-cc",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/darwin64-x86_64-cc/asm/crypto/buildinf.h b/deps/openssl/config/archs/darwin64-x86_64-cc/asm/crypto/buildinf.h
    index 2c108157902d0c..5d70cfc584bb4c 100644
    --- a/deps/openssl/config/archs/darwin64-x86_64-cc/asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/darwin64-x86_64-cc/asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: darwin64-x86_64-cc"
    -#define DATE "built on: Sun Aug  6 00:27:25 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:50:40 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/darwin64-x86_64-cc/asm/include/openssl/opensslv.h b/deps/openssl/config/archs/darwin64-x86_64-cc/asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/darwin64-x86_64-cc/asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/darwin64-x86_64-cc/asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/darwin64-x86_64-cc/asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/darwin64-x86_64-cc/asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/darwin64-x86_64-cc/asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/darwin64-x86_64-cc/asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/darwin64-x86_64-cc/asm_avx2/configdata.pm b/deps/openssl/config/archs/darwin64-x86_64-cc/asm_avx2/configdata.pm
    index d036b582d78c68..e76d49d0c7c8c4 100644
    --- a/deps/openssl/config/archs/darwin64-x86_64-cc/asm_avx2/configdata.pm
    +++ b/deps/openssl/config/archs/darwin64-x86_64-cc/asm_avx2/configdata.pm
    @@ -156,7 +156,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -206,7 +206,7 @@ our %config = (
         ],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -258,11 +258,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "darwin64-x86_64-cc",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/darwin64-x86_64-cc/asm_avx2/crypto/buildinf.h b/deps/openssl/config/archs/darwin64-x86_64-cc/asm_avx2/crypto/buildinf.h
    index 994cec42e962cd..400bfc2f11b14f 100644
    --- a/deps/openssl/config/archs/darwin64-x86_64-cc/asm_avx2/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/darwin64-x86_64-cc/asm_avx2/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: darwin64-x86_64-cc"
    -#define DATE "built on: Sun Aug  6 00:27:49 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:51:03 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/darwin64-x86_64-cc/asm_avx2/include/openssl/opensslv.h b/deps/openssl/config/archs/darwin64-x86_64-cc/asm_avx2/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/darwin64-x86_64-cc/asm_avx2/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/darwin64-x86_64-cc/asm_avx2/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/darwin64-x86_64-cc/asm_avx2/include/openssl/pkcs7.h b/deps/openssl/config/archs/darwin64-x86_64-cc/asm_avx2/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/darwin64-x86_64-cc/asm_avx2/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/darwin64-x86_64-cc/asm_avx2/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/darwin64-x86_64-cc/no-asm/configdata.pm b/deps/openssl/config/archs/darwin64-x86_64-cc/no-asm/configdata.pm
    index e85b222e7d012d..5b1ec98359201f 100644
    --- a/deps/openssl/config/archs/darwin64-x86_64-cc/no-asm/configdata.pm
    +++ b/deps/openssl/config/archs/darwin64-x86_64-cc/no-asm/configdata.pm
    @@ -154,7 +154,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -205,7 +205,7 @@ our %config = (
         ],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-asm no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -258,11 +258,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "darwin64-x86_64-cc",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/darwin64-x86_64-cc/no-asm/crypto/buildinf.h b/deps/openssl/config/archs/darwin64-x86_64-cc/no-asm/crypto/buildinf.h
    index fb875ca7f85df2..935727e4cc5d08 100644
    --- a/deps/openssl/config/archs/darwin64-x86_64-cc/no-asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/darwin64-x86_64-cc/no-asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: darwin64-x86_64-cc"
    -#define DATE "built on: Sun Aug  6 00:28:13 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:51:26 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/darwin64-x86_64-cc/no-asm/include/openssl/opensslv.h b/deps/openssl/config/archs/darwin64-x86_64-cc/no-asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/darwin64-x86_64-cc/no-asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/darwin64-x86_64-cc/no-asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/darwin64-x86_64-cc/no-asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/darwin64-x86_64-cc/no-asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/darwin64-x86_64-cc/no-asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/darwin64-x86_64-cc/no-asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux-aarch64/asm/configdata.pm b/deps/openssl/config/archs/linux-aarch64/asm/configdata.pm
    index 8d48c4016f8c8b..fd7fbe3f636d8a 100644
    --- a/deps/openssl/config/archs/linux-aarch64/asm/configdata.pm
    +++ b/deps/openssl/config/archs/linux-aarch64/asm/configdata.pm
    @@ -159,7 +159,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -207,7 +207,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux-aarch64",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux-aarch64/asm/crypto/aes/aesv8-armx.S b/deps/openssl/config/archs/linux-aarch64/asm/crypto/aes/aesv8-armx.S
    index 51c4d7208da2ba..0d2a81daf9d2bf 100644
    --- a/deps/openssl/config/archs/linux-aarch64/asm/crypto/aes/aesv8-armx.S
    +++ b/deps/openssl/config/archs/linux-aarch64/asm/crypto/aes/aesv8-armx.S
    @@ -103,7 +103,7 @@ aes_v8_set_encrypt_key:
     .Loop192:
     	tbl	v6.16b,{v4.16b},v2.16b
     	ext	v5.16b,v0.16b,v3.16b,#12
    -#ifdef __ARMEB__
    +#ifdef __AARCH64EB__
     	st1	{v4.4s},[x2],#16
     	sub	x2,x2,#8
     #else
    @@ -1510,7 +1510,7 @@ aes_v8_ctr32_encrypt_blocks:
     	ldr	w5,[x3,#240]
     
     	ldr	w8, [x4, #12]
    -#ifdef __ARMEB__
    +#ifdef __AARCH64EB__
     	ld1	{v0.16b},[x4]
     #else
     	ld1	{v0.4s},[x4]
    @@ -1527,7 +1527,7 @@ aes_v8_ctr32_encrypt_blocks:
     	add	x7,x3,#32
     	mov	w6,w5
     	csel	x12,xzr,x12,lo
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev	w8, w8
     #endif
     	orr	v1.16b,v0.16b,v0.16b
    diff --git a/deps/openssl/config/archs/linux-aarch64/asm/crypto/buildinf.h b/deps/openssl/config/archs/linux-aarch64/asm/crypto/buildinf.h
    index 59ce7dfcd536af..aa138ec0af4f2f 100644
    --- a/deps/openssl/config/archs/linux-aarch64/asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux-aarch64/asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux-aarch64"
    -#define DATE "built on: Sun Aug  6 00:30:30 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:53:36 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux-aarch64/asm/crypto/modes/ghashv8-armx.S b/deps/openssl/config/archs/linux-aarch64/asm/crypto/modes/ghashv8-armx.S
    index acd52eb9568633..ea6a66a229e10f 100644
    --- a/deps/openssl/config/archs/linux-aarch64/asm/crypto/modes/ghashv8-armx.S
    +++ b/deps/openssl/config/archs/linux-aarch64/asm/crypto/modes/ghashv8-armx.S
    @@ -101,7 +101,7 @@ gcm_gmult_v8:
     	movi	v19.16b,#0xe1
     	ld1	{v20.2d,v21.2d},[x1]	//load twisted H, ...
     	shl	v19.2d,v19.2d,#57
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v17.16b,v17.16b
     #endif
     	ext	v3.16b,v17.16b,v17.16b,#8
    @@ -126,7 +126,7 @@ gcm_gmult_v8:
     	eor	v18.16b,v18.16b,v2.16b
     	eor	v0.16b,v0.16b,v18.16b
     
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v0.16b,v0.16b
     #endif
     	ext	v0.16b,v0.16b,v0.16b,#8
    @@ -163,14 +163,14 @@ gcm_ghash_v8:
     	ext	v0.16b,v0.16b,v0.16b,#8		//rotate Xi
     	ld1	{v16.2d},[x2],#16	//load [rotated] I[0]
     	shl	v19.2d,v19.2d,#57		//compose 0xc2.0 constant
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v16.16b,v16.16b
     	rev64	v0.16b,v0.16b
     #endif
     	ext	v3.16b,v16.16b,v16.16b,#8		//rotate I[0]
     	b.lo	.Lodd_tail_v8		//x3 was less than 32
     	ld1	{v17.2d},[x2],x12	//load [rotated] I[1]
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v17.16b,v17.16b
     #endif
     	ext	v7.16b,v17.16b,v17.16b,#8
    @@ -202,13 +202,13 @@ gcm_ghash_v8:
     	eor	v18.16b,v0.16b,v2.16b
     	eor	v1.16b,v1.16b,v17.16b
     	ld1	{v17.2d},[x2],x12	//load [rotated] I[i+3]
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v16.16b,v16.16b
     #endif
     	eor	v1.16b,v1.16b,v18.16b
     	pmull	v18.1q,v0.1d,v19.1d		//1st phase of reduction
     
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v17.16b,v17.16b
     #endif
     	ins	v2.d[0],v1.d[1]
    @@ -258,7 +258,7 @@ gcm_ghash_v8:
     	eor	v0.16b,v0.16b,v18.16b
     
     .Ldone_v8:
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v0.16b,v0.16b
     #endif
     	ext	v0.16b,v0.16b,v0.16b,#8
    @@ -277,7 +277,7 @@ gcm_ghash_v8_4x:
     	shl	v19.2d,v19.2d,#57		//compose 0xc2.0 constant
     
     	ld1	{v4.2d,v5.2d,v6.2d,v7.2d},[x2],#64
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v0.16b,v0.16b
     	rev64	v5.16b,v5.16b
     	rev64	v6.16b,v6.16b
    @@ -321,7 +321,7 @@ gcm_ghash_v8_4x:
     	eor	v16.16b,v4.16b,v0.16b
     	ld1	{v4.2d,v5.2d,v6.2d,v7.2d},[x2],#64
     	ext	v3.16b,v16.16b,v16.16b,#8
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v5.16b,v5.16b
     	rev64	v6.16b,v6.16b
     	rev64	v7.16b,v7.16b
    @@ -404,7 +404,7 @@ gcm_ghash_v8_4x:
     	eor	v1.16b,v1.16b,v17.16b
     	ld1	{v4.2d,v5.2d,v6.2d},[x2]
     	eor	v1.16b,v1.16b,v18.16b
    -#ifndef	__ARMEB__
    +#ifndef	__AARCH64EB__
     	rev64	v5.16b,v5.16b
     	rev64	v6.16b,v6.16b
     	rev64	v4.16b,v4.16b
    @@ -456,7 +456,7 @@ gcm_ghash_v8_4x:
     	eor	v1.16b,v1.16b,v17.16b
     	ld1	{v4.2d,v5.2d},[x2]
     	eor	v1.16b,v1.16b,v18.16b
    -#ifndef	__ARMEB__
    +#ifndef	__AARCH64EB__
     	rev64	v5.16b,v5.16b
     	rev64	v4.16b,v4.16b
     #endif
    @@ -499,7 +499,7 @@ gcm_ghash_v8_4x:
     	eor	v1.16b,v1.16b,v17.16b
     	ld1	{v4.2d},[x2]
     	eor	v1.16b,v1.16b,v18.16b
    -#ifndef	__ARMEB__
    +#ifndef	__AARCH64EB__
     	rev64	v4.16b,v4.16b
     #endif
     
    @@ -539,7 +539,7 @@ gcm_ghash_v8_4x:
     	eor	v0.16b,v0.16b,v18.16b
     	ext	v0.16b,v0.16b,v0.16b,#8
     
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v0.16b,v0.16b
     #endif
     	st1	{v0.2d},[x0]		//write out Xi
    diff --git a/deps/openssl/config/archs/linux-aarch64/asm/crypto/poly1305/poly1305-armv8.S b/deps/openssl/config/archs/linux-aarch64/asm/crypto/poly1305/poly1305-armv8.S
    index ea8f390224053a..98ebf48535e5e9 100644
    --- a/deps/openssl/config/archs/linux-aarch64/asm/crypto/poly1305/poly1305-armv8.S
    +++ b/deps/openssl/config/archs/linux-aarch64/asm/crypto/poly1305/poly1305-armv8.S
    @@ -28,7 +28,7 @@ poly1305_init:
     	ldp	x7,x8,[x1]		// load key
     	mov	x9,#0xfffffffc0fffffff
     	movk	x9,#0x0fff,lsl#48
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x7,x7			// flip bytes
     	rev	x8,x8
     #endif
    @@ -75,7 +75,7 @@ poly1305_blocks:
     .Loop:
     	ldp	x10,x11,[x1],#16	// load input
     	sub	x2,x2,#16
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x10,x10
     	rev	x11,x11
     #endif
    @@ -140,13 +140,13 @@ poly1305_emit:
     	csel	x4,x4,x12,eq
     	csel	x5,x5,x13,eq
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	ror	x10,x10,#32		// flip nonce words
     	ror	x11,x11,#32
     #endif
     	adds	x4,x4,x10		// accumulate nonce
     	adc	x5,x5,x11
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x4,x4			// flip output bytes
     	rev	x5,x5
     #endif
    @@ -266,7 +266,7 @@ poly1305_blocks_neon:
     	adcs	x5,x5,xzr
     	adc	x6,x6,xzr
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x12,x12
     	rev	x13,x13
     #endif
    @@ -312,7 +312,7 @@ poly1305_blocks_neon:
     	ldp	x12,x13,[x1],#16	// load input
     	sub	x2,x2,#16
     	add	x9,x8,x8,lsr#2	// s1 = r1 + (r1 >> 2)
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x12,x12
     	rev	x13,x13
     #endif
    @@ -397,7 +397,7 @@ poly1305_blocks_neon:
     	lsl	x3,x3,#24
     	add	x15,x0,#48
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x8,x8
     	rev	x12,x12
     	rev	x9,x9
    @@ -433,7 +433,7 @@ poly1305_blocks_neon:
     	ld1	{v4.4s,v5.4s,v6.4s,v7.4s},[x15],#64
     	ld1	{v8.4s},[x15]
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x8,x8
     	rev	x12,x12
     	rev	x9,x9
    @@ -494,7 +494,7 @@ poly1305_blocks_neon:
     	umull	v20.2d,v14.2s,v1.s[2]
     	ldp	x9,x13,[x16],#48
     	umull	v19.2d,v14.2s,v0.s[2]
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x8,x8
     	rev	x12,x12
     	rev	x9,x9
    @@ -559,7 +559,7 @@ poly1305_blocks_neon:
     	umlal	v23.2d,v11.2s,v3.s[0]
     	umlal	v20.2d,v11.2s,v8.s[0]
     	umlal	v21.2d,v11.2s,v0.s[0]
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x8,x8
     	rev	x12,x12
     	rev	x9,x9
    @@ -840,13 +840,13 @@ poly1305_emit_neon:
     	csel	x4,x4,x12,eq
     	csel	x5,x5,x13,eq
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	ror	x10,x10,#32		// flip nonce words
     	ror	x11,x11,#32
     #endif
     	adds	x4,x4,x10		// accumulate nonce
     	adc	x5,x5,x11
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x4,x4			// flip output bytes
     	rev	x5,x5
     #endif
    diff --git a/deps/openssl/config/archs/linux-aarch64/asm/include/openssl/opensslv.h b/deps/openssl/config/archs/linux-aarch64/asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux-aarch64/asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux-aarch64/asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux-aarch64/asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux-aarch64/asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux-aarch64/asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux-aarch64/asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux-aarch64/asm_avx2/configdata.pm b/deps/openssl/config/archs/linux-aarch64/asm_avx2/configdata.pm
    index 9d498a04297dd0..2802640171fd6e 100644
    --- a/deps/openssl/config/archs/linux-aarch64/asm_avx2/configdata.pm
    +++ b/deps/openssl/config/archs/linux-aarch64/asm_avx2/configdata.pm
    @@ -159,7 +159,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -207,7 +207,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux-aarch64",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux-aarch64/asm_avx2/crypto/aes/aesv8-armx.S b/deps/openssl/config/archs/linux-aarch64/asm_avx2/crypto/aes/aesv8-armx.S
    index 51c4d7208da2ba..0d2a81daf9d2bf 100644
    --- a/deps/openssl/config/archs/linux-aarch64/asm_avx2/crypto/aes/aesv8-armx.S
    +++ b/deps/openssl/config/archs/linux-aarch64/asm_avx2/crypto/aes/aesv8-armx.S
    @@ -103,7 +103,7 @@ aes_v8_set_encrypt_key:
     .Loop192:
     	tbl	v6.16b,{v4.16b},v2.16b
     	ext	v5.16b,v0.16b,v3.16b,#12
    -#ifdef __ARMEB__
    +#ifdef __AARCH64EB__
     	st1	{v4.4s},[x2],#16
     	sub	x2,x2,#8
     #else
    @@ -1510,7 +1510,7 @@ aes_v8_ctr32_encrypt_blocks:
     	ldr	w5,[x3,#240]
     
     	ldr	w8, [x4, #12]
    -#ifdef __ARMEB__
    +#ifdef __AARCH64EB__
     	ld1	{v0.16b},[x4]
     #else
     	ld1	{v0.4s},[x4]
    @@ -1527,7 +1527,7 @@ aes_v8_ctr32_encrypt_blocks:
     	add	x7,x3,#32
     	mov	w6,w5
     	csel	x12,xzr,x12,lo
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev	w8, w8
     #endif
     	orr	v1.16b,v0.16b,v0.16b
    diff --git a/deps/openssl/config/archs/linux-aarch64/asm_avx2/crypto/buildinf.h b/deps/openssl/config/archs/linux-aarch64/asm_avx2/crypto/buildinf.h
    index 8044c52de8534f..fe50bcb0f8eebe 100644
    --- a/deps/openssl/config/archs/linux-aarch64/asm_avx2/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux-aarch64/asm_avx2/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux-aarch64"
    -#define DATE "built on: Sun Aug  6 00:30:52 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:53:55 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux-aarch64/asm_avx2/crypto/modes/ghashv8-armx.S b/deps/openssl/config/archs/linux-aarch64/asm_avx2/crypto/modes/ghashv8-armx.S
    index acd52eb9568633..ea6a66a229e10f 100644
    --- a/deps/openssl/config/archs/linux-aarch64/asm_avx2/crypto/modes/ghashv8-armx.S
    +++ b/deps/openssl/config/archs/linux-aarch64/asm_avx2/crypto/modes/ghashv8-armx.S
    @@ -101,7 +101,7 @@ gcm_gmult_v8:
     	movi	v19.16b,#0xe1
     	ld1	{v20.2d,v21.2d},[x1]	//load twisted H, ...
     	shl	v19.2d,v19.2d,#57
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v17.16b,v17.16b
     #endif
     	ext	v3.16b,v17.16b,v17.16b,#8
    @@ -126,7 +126,7 @@ gcm_gmult_v8:
     	eor	v18.16b,v18.16b,v2.16b
     	eor	v0.16b,v0.16b,v18.16b
     
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v0.16b,v0.16b
     #endif
     	ext	v0.16b,v0.16b,v0.16b,#8
    @@ -163,14 +163,14 @@ gcm_ghash_v8:
     	ext	v0.16b,v0.16b,v0.16b,#8		//rotate Xi
     	ld1	{v16.2d},[x2],#16	//load [rotated] I[0]
     	shl	v19.2d,v19.2d,#57		//compose 0xc2.0 constant
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v16.16b,v16.16b
     	rev64	v0.16b,v0.16b
     #endif
     	ext	v3.16b,v16.16b,v16.16b,#8		//rotate I[0]
     	b.lo	.Lodd_tail_v8		//x3 was less than 32
     	ld1	{v17.2d},[x2],x12	//load [rotated] I[1]
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v17.16b,v17.16b
     #endif
     	ext	v7.16b,v17.16b,v17.16b,#8
    @@ -202,13 +202,13 @@ gcm_ghash_v8:
     	eor	v18.16b,v0.16b,v2.16b
     	eor	v1.16b,v1.16b,v17.16b
     	ld1	{v17.2d},[x2],x12	//load [rotated] I[i+3]
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v16.16b,v16.16b
     #endif
     	eor	v1.16b,v1.16b,v18.16b
     	pmull	v18.1q,v0.1d,v19.1d		//1st phase of reduction
     
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v17.16b,v17.16b
     #endif
     	ins	v2.d[0],v1.d[1]
    @@ -258,7 +258,7 @@ gcm_ghash_v8:
     	eor	v0.16b,v0.16b,v18.16b
     
     .Ldone_v8:
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v0.16b,v0.16b
     #endif
     	ext	v0.16b,v0.16b,v0.16b,#8
    @@ -277,7 +277,7 @@ gcm_ghash_v8_4x:
     	shl	v19.2d,v19.2d,#57		//compose 0xc2.0 constant
     
     	ld1	{v4.2d,v5.2d,v6.2d,v7.2d},[x2],#64
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v0.16b,v0.16b
     	rev64	v5.16b,v5.16b
     	rev64	v6.16b,v6.16b
    @@ -321,7 +321,7 @@ gcm_ghash_v8_4x:
     	eor	v16.16b,v4.16b,v0.16b
     	ld1	{v4.2d,v5.2d,v6.2d,v7.2d},[x2],#64
     	ext	v3.16b,v16.16b,v16.16b,#8
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v5.16b,v5.16b
     	rev64	v6.16b,v6.16b
     	rev64	v7.16b,v7.16b
    @@ -404,7 +404,7 @@ gcm_ghash_v8_4x:
     	eor	v1.16b,v1.16b,v17.16b
     	ld1	{v4.2d,v5.2d,v6.2d},[x2]
     	eor	v1.16b,v1.16b,v18.16b
    -#ifndef	__ARMEB__
    +#ifndef	__AARCH64EB__
     	rev64	v5.16b,v5.16b
     	rev64	v6.16b,v6.16b
     	rev64	v4.16b,v4.16b
    @@ -456,7 +456,7 @@ gcm_ghash_v8_4x:
     	eor	v1.16b,v1.16b,v17.16b
     	ld1	{v4.2d,v5.2d},[x2]
     	eor	v1.16b,v1.16b,v18.16b
    -#ifndef	__ARMEB__
    +#ifndef	__AARCH64EB__
     	rev64	v5.16b,v5.16b
     	rev64	v4.16b,v4.16b
     #endif
    @@ -499,7 +499,7 @@ gcm_ghash_v8_4x:
     	eor	v1.16b,v1.16b,v17.16b
     	ld1	{v4.2d},[x2]
     	eor	v1.16b,v1.16b,v18.16b
    -#ifndef	__ARMEB__
    +#ifndef	__AARCH64EB__
     	rev64	v4.16b,v4.16b
     #endif
     
    @@ -539,7 +539,7 @@ gcm_ghash_v8_4x:
     	eor	v0.16b,v0.16b,v18.16b
     	ext	v0.16b,v0.16b,v0.16b,#8
     
    -#ifndef __ARMEB__
    +#ifndef __AARCH64EB__
     	rev64	v0.16b,v0.16b
     #endif
     	st1	{v0.2d},[x0]		//write out Xi
    diff --git a/deps/openssl/config/archs/linux-aarch64/asm_avx2/crypto/poly1305/poly1305-armv8.S b/deps/openssl/config/archs/linux-aarch64/asm_avx2/crypto/poly1305/poly1305-armv8.S
    index ea8f390224053a..98ebf48535e5e9 100644
    --- a/deps/openssl/config/archs/linux-aarch64/asm_avx2/crypto/poly1305/poly1305-armv8.S
    +++ b/deps/openssl/config/archs/linux-aarch64/asm_avx2/crypto/poly1305/poly1305-armv8.S
    @@ -28,7 +28,7 @@ poly1305_init:
     	ldp	x7,x8,[x1]		// load key
     	mov	x9,#0xfffffffc0fffffff
     	movk	x9,#0x0fff,lsl#48
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x7,x7			// flip bytes
     	rev	x8,x8
     #endif
    @@ -75,7 +75,7 @@ poly1305_blocks:
     .Loop:
     	ldp	x10,x11,[x1],#16	// load input
     	sub	x2,x2,#16
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x10,x10
     	rev	x11,x11
     #endif
    @@ -140,13 +140,13 @@ poly1305_emit:
     	csel	x4,x4,x12,eq
     	csel	x5,x5,x13,eq
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	ror	x10,x10,#32		// flip nonce words
     	ror	x11,x11,#32
     #endif
     	adds	x4,x4,x10		// accumulate nonce
     	adc	x5,x5,x11
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x4,x4			// flip output bytes
     	rev	x5,x5
     #endif
    @@ -266,7 +266,7 @@ poly1305_blocks_neon:
     	adcs	x5,x5,xzr
     	adc	x6,x6,xzr
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x12,x12
     	rev	x13,x13
     #endif
    @@ -312,7 +312,7 @@ poly1305_blocks_neon:
     	ldp	x12,x13,[x1],#16	// load input
     	sub	x2,x2,#16
     	add	x9,x8,x8,lsr#2	// s1 = r1 + (r1 >> 2)
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x12,x12
     	rev	x13,x13
     #endif
    @@ -397,7 +397,7 @@ poly1305_blocks_neon:
     	lsl	x3,x3,#24
     	add	x15,x0,#48
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x8,x8
     	rev	x12,x12
     	rev	x9,x9
    @@ -433,7 +433,7 @@ poly1305_blocks_neon:
     	ld1	{v4.4s,v5.4s,v6.4s,v7.4s},[x15],#64
     	ld1	{v8.4s},[x15]
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x8,x8
     	rev	x12,x12
     	rev	x9,x9
    @@ -494,7 +494,7 @@ poly1305_blocks_neon:
     	umull	v20.2d,v14.2s,v1.s[2]
     	ldp	x9,x13,[x16],#48
     	umull	v19.2d,v14.2s,v0.s[2]
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x8,x8
     	rev	x12,x12
     	rev	x9,x9
    @@ -559,7 +559,7 @@ poly1305_blocks_neon:
     	umlal	v23.2d,v11.2s,v3.s[0]
     	umlal	v20.2d,v11.2s,v8.s[0]
     	umlal	v21.2d,v11.2s,v0.s[0]
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x8,x8
     	rev	x12,x12
     	rev	x9,x9
    @@ -840,13 +840,13 @@ poly1305_emit_neon:
     	csel	x4,x4,x12,eq
     	csel	x5,x5,x13,eq
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	ror	x10,x10,#32		// flip nonce words
     	ror	x11,x11,#32
     #endif
     	adds	x4,x4,x10		// accumulate nonce
     	adc	x5,x5,x11
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x4,x4			// flip output bytes
     	rev	x5,x5
     #endif
    diff --git a/deps/openssl/config/archs/linux-aarch64/asm_avx2/include/openssl/opensslv.h b/deps/openssl/config/archs/linux-aarch64/asm_avx2/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux-aarch64/asm_avx2/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux-aarch64/asm_avx2/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux-aarch64/asm_avx2/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux-aarch64/asm_avx2/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux-aarch64/asm_avx2/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux-aarch64/asm_avx2/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux-aarch64/no-asm/configdata.pm b/deps/openssl/config/archs/linux-aarch64/no-asm/configdata.pm
    index 31514639fa12cd..bf7ab392cebcd7 100644
    --- a/deps/openssl/config/archs/linux-aarch64/no-asm/configdata.pm
    +++ b/deps/openssl/config/archs/linux-aarch64/no-asm/configdata.pm
    @@ -157,7 +157,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -206,7 +206,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-asm no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux-aarch64",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux-aarch64/no-asm/crypto/buildinf.h b/deps/openssl/config/archs/linux-aarch64/no-asm/crypto/buildinf.h
    index 2c556e7c636514..e40fd9e8fa7be3 100644
    --- a/deps/openssl/config/archs/linux-aarch64/no-asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux-aarch64/no-asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux-aarch64"
    -#define DATE "built on: Sun Aug  6 00:31:14 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:54:15 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux-aarch64/no-asm/include/openssl/opensslv.h b/deps/openssl/config/archs/linux-aarch64/no-asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux-aarch64/no-asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux-aarch64/no-asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux-aarch64/no-asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux-aarch64/no-asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux-aarch64/no-asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux-aarch64/no-asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux-armv4/asm/configdata.pm b/deps/openssl/config/archs/linux-armv4/asm/configdata.pm
    index b6536beee0911a..79653867c073ee 100644
    --- a/deps/openssl/config/archs/linux-armv4/asm/configdata.pm
    +++ b/deps/openssl/config/archs/linux-armv4/asm/configdata.pm
    @@ -159,7 +159,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -207,7 +207,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux-armv4",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux-armv4/asm/crypto/aes/bsaes-armv7.S b/deps/openssl/config/archs/linux-armv4/asm/crypto/aes/bsaes-armv7.S
    index 4b7f662140fba1..545d7f76c8a168 100644
    --- a/deps/openssl/config/archs/linux-armv4/asm/crypto/aes/bsaes-armv7.S
    +++ b/deps/openssl/config/archs/linux-armv4/asm/crypto/aes/bsaes-armv7.S
    @@ -1131,7 +1131,7 @@ ossl_bsaes_cbc_encrypt:
     	vstmia	r4, {q7}
     
     .align	2
    -
    +0:
     #endif
     
     	vld1.8	{q15}, [r8]		@ load IV
    @@ -1391,7 +1391,7 @@ ossl_bsaes_ctr32_encrypt_blocks:
     	vstmia	r12, {q7}			@ save last round key
     
     .align	2
    -	add	r12, r3, #248
    +0:	add	r12, r3, #248
     	vld1.8	{q0}, [r8]		@ load counter
     	add	r8, r6, #.LREVM0SR-.LM0	@ borrow r8
     	vldmia	r12, {q4}			@ load round0 key
    @@ -1626,7 +1626,7 @@ ossl_bsaes_xts_encrypt:
     	vstmia	r12, {q7}
     
     .align	2
    -	sub	sp, #0x90			@ place for tweak[9]
    +0:	sub	sp, #0x90			@ place for tweak[9]
     #endif
     
     	vld1.8	{q8}, [r0]			@ initial tweak
    @@ -2112,7 +2112,7 @@ ossl_bsaes_xts_decrypt:
     	vstmia	r4, {q7}
     
     .align	2
    -	sub	sp, #0x90			@ place for tweak[9]
    +0:	sub	sp, #0x90			@ place for tweak[9]
     #endif
     	vld1.8	{q8}, [r0]			@ initial tweak
     	adr	r2, .Lxts_magic
    diff --git a/deps/openssl/config/archs/linux-armv4/asm/crypto/buildinf.h b/deps/openssl/config/archs/linux-armv4/asm/crypto/buildinf.h
    index 16acd7cb38014e..470b8436be3e9a 100644
    --- a/deps/openssl/config/archs/linux-armv4/asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux-armv4/asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux-armv4"
    -#define DATE "built on: Sun Aug  6 00:31:35 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:54:32 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux-armv4/asm/include/openssl/opensslv.h b/deps/openssl/config/archs/linux-armv4/asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux-armv4/asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux-armv4/asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux-armv4/asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux-armv4/asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux-armv4/asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux-armv4/asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux-armv4/asm_avx2/configdata.pm b/deps/openssl/config/archs/linux-armv4/asm_avx2/configdata.pm
    index 2d6713a69fe77a..61ce2baaf0268d 100644
    --- a/deps/openssl/config/archs/linux-armv4/asm_avx2/configdata.pm
    +++ b/deps/openssl/config/archs/linux-armv4/asm_avx2/configdata.pm
    @@ -159,7 +159,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -207,7 +207,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux-armv4",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux-armv4/asm_avx2/crypto/aes/bsaes-armv7.S b/deps/openssl/config/archs/linux-armv4/asm_avx2/crypto/aes/bsaes-armv7.S
    index 4b7f662140fba1..545d7f76c8a168 100644
    --- a/deps/openssl/config/archs/linux-armv4/asm_avx2/crypto/aes/bsaes-armv7.S
    +++ b/deps/openssl/config/archs/linux-armv4/asm_avx2/crypto/aes/bsaes-armv7.S
    @@ -1131,7 +1131,7 @@ ossl_bsaes_cbc_encrypt:
     	vstmia	r4, {q7}
     
     .align	2
    -
    +0:
     #endif
     
     	vld1.8	{q15}, [r8]		@ load IV
    @@ -1391,7 +1391,7 @@ ossl_bsaes_ctr32_encrypt_blocks:
     	vstmia	r12, {q7}			@ save last round key
     
     .align	2
    -	add	r12, r3, #248
    +0:	add	r12, r3, #248
     	vld1.8	{q0}, [r8]		@ load counter
     	add	r8, r6, #.LREVM0SR-.LM0	@ borrow r8
     	vldmia	r12, {q4}			@ load round0 key
    @@ -1626,7 +1626,7 @@ ossl_bsaes_xts_encrypt:
     	vstmia	r12, {q7}
     
     .align	2
    -	sub	sp, #0x90			@ place for tweak[9]
    +0:	sub	sp, #0x90			@ place for tweak[9]
     #endif
     
     	vld1.8	{q8}, [r0]			@ initial tweak
    @@ -2112,7 +2112,7 @@ ossl_bsaes_xts_decrypt:
     	vstmia	r4, {q7}
     
     .align	2
    -	sub	sp, #0x90			@ place for tweak[9]
    +0:	sub	sp, #0x90			@ place for tweak[9]
     #endif
     	vld1.8	{q8}, [r0]			@ initial tweak
     	adr	r2, .Lxts_magic
    diff --git a/deps/openssl/config/archs/linux-armv4/asm_avx2/crypto/buildinf.h b/deps/openssl/config/archs/linux-armv4/asm_avx2/crypto/buildinf.h
    index 2ee5795e784c20..34de4e5471460b 100644
    --- a/deps/openssl/config/archs/linux-armv4/asm_avx2/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux-armv4/asm_avx2/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux-armv4"
    -#define DATE "built on: Sun Aug  6 00:31:58 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:54:52 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux-armv4/asm_avx2/include/openssl/opensslv.h b/deps/openssl/config/archs/linux-armv4/asm_avx2/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux-armv4/asm_avx2/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux-armv4/asm_avx2/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux-armv4/asm_avx2/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux-armv4/asm_avx2/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux-armv4/asm_avx2/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux-armv4/asm_avx2/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux-armv4/no-asm/configdata.pm b/deps/openssl/config/archs/linux-armv4/no-asm/configdata.pm
    index bee312afe923a3..3945676082d3a7 100644
    --- a/deps/openssl/config/archs/linux-armv4/no-asm/configdata.pm
    +++ b/deps/openssl/config/archs/linux-armv4/no-asm/configdata.pm
    @@ -157,7 +157,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -206,7 +206,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-asm no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux-armv4",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux-armv4/no-asm/crypto/buildinf.h b/deps/openssl/config/archs/linux-armv4/no-asm/crypto/buildinf.h
    index 37415a157b7a5a..06676dd0a62428 100644
    --- a/deps/openssl/config/archs/linux-armv4/no-asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux-armv4/no-asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux-armv4"
    -#define DATE "built on: Sun Aug  6 00:32:20 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:55:11 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux-armv4/no-asm/include/openssl/opensslv.h b/deps/openssl/config/archs/linux-armv4/no-asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux-armv4/no-asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux-armv4/no-asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux-armv4/no-asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux-armv4/no-asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux-armv4/no-asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux-armv4/no-asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux-elf/asm/configdata.pm b/deps/openssl/config/archs/linux-elf/asm/configdata.pm
    index fe754b5ea008b5..f42b25e4813c2c 100644
    --- a/deps/openssl/config/archs/linux-elf/asm/configdata.pm
    +++ b/deps/openssl/config/archs/linux-elf/asm/configdata.pm
    @@ -159,7 +159,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -207,7 +207,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux-elf",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux-elf/asm/crypto/buildinf.h b/deps/openssl/config/archs/linux-elf/asm/crypto/buildinf.h
    index f58e1b3b022376..9cfe51eea4fc93 100644
    --- a/deps/openssl/config/archs/linux-elf/asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux-elf/asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux-elf"
    -#define DATE "built on: Sun Aug  6 00:32:41 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:55:29 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux-elf/asm/include/openssl/opensslv.h b/deps/openssl/config/archs/linux-elf/asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux-elf/asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux-elf/asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux-elf/asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux-elf/asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux-elf/asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux-elf/asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux-elf/asm_avx2/configdata.pm b/deps/openssl/config/archs/linux-elf/asm_avx2/configdata.pm
    index 083f6bc78525da..0af1ae16add5e7 100644
    --- a/deps/openssl/config/archs/linux-elf/asm_avx2/configdata.pm
    +++ b/deps/openssl/config/archs/linux-elf/asm_avx2/configdata.pm
    @@ -159,7 +159,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -207,7 +207,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux-elf",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux-elf/asm_avx2/crypto/buildinf.h b/deps/openssl/config/archs/linux-elf/asm_avx2/crypto/buildinf.h
    index cfff344f504f1f..32a9cc3b4e7b0b 100644
    --- a/deps/openssl/config/archs/linux-elf/asm_avx2/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux-elf/asm_avx2/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux-elf"
    -#define DATE "built on: Sun Aug  6 00:33:04 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:55:49 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux-elf/asm_avx2/include/openssl/opensslv.h b/deps/openssl/config/archs/linux-elf/asm_avx2/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux-elf/asm_avx2/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux-elf/asm_avx2/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux-elf/asm_avx2/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux-elf/asm_avx2/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux-elf/asm_avx2/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux-elf/asm_avx2/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux-elf/no-asm/configdata.pm b/deps/openssl/config/archs/linux-elf/no-asm/configdata.pm
    index a5e1137b149e7a..6b8469360a6939 100644
    --- a/deps/openssl/config/archs/linux-elf/no-asm/configdata.pm
    +++ b/deps/openssl/config/archs/linux-elf/no-asm/configdata.pm
    @@ -157,7 +157,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -206,7 +206,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-asm no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux-elf",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux-elf/no-asm/crypto/buildinf.h b/deps/openssl/config/archs/linux-elf/no-asm/crypto/buildinf.h
    index 0dd30616b28e66..d5ca31dd991bac 100644
    --- a/deps/openssl/config/archs/linux-elf/no-asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux-elf/no-asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux-elf"
    -#define DATE "built on: Sun Aug  6 00:33:27 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:56:09 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux-elf/no-asm/include/openssl/opensslv.h b/deps/openssl/config/archs/linux-elf/no-asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux-elf/no-asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux-elf/no-asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux-elf/no-asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux-elf/no-asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux-elf/no-asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux-elf/no-asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux-ppc64le/asm/configdata.pm b/deps/openssl/config/archs/linux-ppc64le/asm/configdata.pm
    index f979f6f060f9b6..c8aa0d7fe32340 100644
    --- a/deps/openssl/config/archs/linux-ppc64le/asm/configdata.pm
    +++ b/deps/openssl/config/archs/linux-ppc64le/asm/configdata.pm
    @@ -159,7 +159,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -207,7 +207,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux-ppc64le",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux-ppc64le/asm/crypto/buildinf.h b/deps/openssl/config/archs/linux-ppc64le/asm/crypto/buildinf.h
    index c45299350be3f9..d1e3acb464a422 100644
    --- a/deps/openssl/config/archs/linux-ppc64le/asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux-ppc64le/asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux-ppc64le"
    -#define DATE "built on: Sun Aug  6 00:35:08 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:57:32 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux-ppc64le/asm/include/openssl/opensslv.h b/deps/openssl/config/archs/linux-ppc64le/asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux-ppc64le/asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux-ppc64le/asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux-ppc64le/asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux-ppc64le/asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux-ppc64le/asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux-ppc64le/asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux-ppc64le/asm_avx2/configdata.pm b/deps/openssl/config/archs/linux-ppc64le/asm_avx2/configdata.pm
    index 08080140eb2e78..0ea84d2ce335f5 100644
    --- a/deps/openssl/config/archs/linux-ppc64le/asm_avx2/configdata.pm
    +++ b/deps/openssl/config/archs/linux-ppc64le/asm_avx2/configdata.pm
    @@ -159,7 +159,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -207,7 +207,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux-ppc64le",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux-ppc64le/asm_avx2/crypto/buildinf.h b/deps/openssl/config/archs/linux-ppc64le/asm_avx2/crypto/buildinf.h
    index 2395cef1030cd0..e29cf2d622f37b 100644
    --- a/deps/openssl/config/archs/linux-ppc64le/asm_avx2/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux-ppc64le/asm_avx2/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux-ppc64le"
    -#define DATE "built on: Sun Aug  6 00:35:31 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:57:51 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux-ppc64le/asm_avx2/include/openssl/opensslv.h b/deps/openssl/config/archs/linux-ppc64le/asm_avx2/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux-ppc64le/asm_avx2/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux-ppc64le/asm_avx2/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux-ppc64le/asm_avx2/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux-ppc64le/asm_avx2/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux-ppc64le/asm_avx2/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux-ppc64le/asm_avx2/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux-ppc64le/no-asm/configdata.pm b/deps/openssl/config/archs/linux-ppc64le/no-asm/configdata.pm
    index 189ada48854119..fe396100caff68 100644
    --- a/deps/openssl/config/archs/linux-ppc64le/no-asm/configdata.pm
    +++ b/deps/openssl/config/archs/linux-ppc64le/no-asm/configdata.pm
    @@ -157,7 +157,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -206,7 +206,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-asm no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux-ppc64le",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux-ppc64le/no-asm/crypto/buildinf.h b/deps/openssl/config/archs/linux-ppc64le/no-asm/crypto/buildinf.h
    index bf4a292031de3f..38c6d24008d45c 100644
    --- a/deps/openssl/config/archs/linux-ppc64le/no-asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux-ppc64le/no-asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux-ppc64le"
    -#define DATE "built on: Sun Aug  6 00:35:54 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:58:10 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux-ppc64le/no-asm/include/openssl/opensslv.h b/deps/openssl/config/archs/linux-ppc64le/no-asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux-ppc64le/no-asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux-ppc64le/no-asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux-ppc64le/no-asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux-ppc64le/no-asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux-ppc64le/no-asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux-ppc64le/no-asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux-x86_64/asm/configdata.pm b/deps/openssl/config/archs/linux-x86_64/asm/configdata.pm
    index 133c99bdb8379f..8c177223983873 100644
    --- a/deps/openssl/config/archs/linux-x86_64/asm/configdata.pm
    +++ b/deps/openssl/config/archs/linux-x86_64/asm/configdata.pm
    @@ -159,7 +159,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -207,7 +207,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux-x86_64",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux-x86_64/asm/crypto/buildinf.h b/deps/openssl/config/archs/linux-x86_64/asm/crypto/buildinf.h
    index 13c3b4c33b64c4..c453e042ec2cd8 100644
    --- a/deps/openssl/config/archs/linux-x86_64/asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux-x86_64/asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux-x86_64"
    -#define DATE "built on: Sun Aug  6 00:33:49 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:56:27 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux-x86_64/asm/include/openssl/opensslv.h b/deps/openssl/config/archs/linux-x86_64/asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux-x86_64/asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux-x86_64/asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux-x86_64/asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux-x86_64/asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux-x86_64/asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux-x86_64/asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux-x86_64/asm_avx2/configdata.pm b/deps/openssl/config/archs/linux-x86_64/asm_avx2/configdata.pm
    index 682f020891c38e..82a028a7500db9 100644
    --- a/deps/openssl/config/archs/linux-x86_64/asm_avx2/configdata.pm
    +++ b/deps/openssl/config/archs/linux-x86_64/asm_avx2/configdata.pm
    @@ -159,7 +159,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -207,7 +207,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux-x86_64",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux-x86_64/asm_avx2/crypto/buildinf.h b/deps/openssl/config/archs/linux-x86_64/asm_avx2/crypto/buildinf.h
    index 1d83deffde45f4..dd77a730662bb9 100644
    --- a/deps/openssl/config/archs/linux-x86_64/asm_avx2/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux-x86_64/asm_avx2/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux-x86_64"
    -#define DATE "built on: Sun Aug  6 00:34:19 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:56:50 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux-x86_64/asm_avx2/include/openssl/opensslv.h b/deps/openssl/config/archs/linux-x86_64/asm_avx2/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux-x86_64/asm_avx2/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux-x86_64/asm_avx2/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux-x86_64/asm_avx2/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux-x86_64/asm_avx2/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux-x86_64/asm_avx2/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux-x86_64/asm_avx2/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux-x86_64/no-asm/configdata.pm b/deps/openssl/config/archs/linux-x86_64/no-asm/configdata.pm
    index 3beffa26651377..74531136b16293 100644
    --- a/deps/openssl/config/archs/linux-x86_64/no-asm/configdata.pm
    +++ b/deps/openssl/config/archs/linux-x86_64/no-asm/configdata.pm
    @@ -157,7 +157,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -206,7 +206,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-asm no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux-x86_64",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux-x86_64/no-asm/crypto/buildinf.h b/deps/openssl/config/archs/linux-x86_64/no-asm/crypto/buildinf.h
    index c3499dd469d71a..eb1d92ca3b85e8 100644
    --- a/deps/openssl/config/archs/linux-x86_64/no-asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux-x86_64/no-asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux-x86_64"
    -#define DATE "built on: Sun Aug  6 00:34:48 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:57:14 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux-x86_64/no-asm/include/openssl/opensslv.h b/deps/openssl/config/archs/linux-x86_64/no-asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux-x86_64/no-asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux-x86_64/no-asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux-x86_64/no-asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux-x86_64/no-asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux-x86_64/no-asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux-x86_64/no-asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux32-s390x/asm/configdata.pm b/deps/openssl/config/archs/linux32-s390x/asm/configdata.pm
    index b4729ad28f92ae..077d1fe8d7f266 100644
    --- a/deps/openssl/config/archs/linux32-s390x/asm/configdata.pm
    +++ b/deps/openssl/config/archs/linux32-s390x/asm/configdata.pm
    @@ -159,7 +159,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -207,7 +207,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux32-s390x",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux32-s390x/asm/crypto/buildinf.h b/deps/openssl/config/archs/linux32-s390x/asm/crypto/buildinf.h
    index 210dcc63df0ff1..12e34e0b8d87b4 100644
    --- a/deps/openssl/config/archs/linux32-s390x/asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux32-s390x/asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux32-s390x"
    -#define DATE "built on: Sun Aug  6 00:36:17 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:58:28 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux32-s390x/asm/include/openssl/opensslv.h b/deps/openssl/config/archs/linux32-s390x/asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux32-s390x/asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux32-s390x/asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux32-s390x/asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux32-s390x/asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux32-s390x/asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux32-s390x/asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux32-s390x/asm_avx2/configdata.pm b/deps/openssl/config/archs/linux32-s390x/asm_avx2/configdata.pm
    index e3ec7d01486663..1a3bfbead00cc9 100644
    --- a/deps/openssl/config/archs/linux32-s390x/asm_avx2/configdata.pm
    +++ b/deps/openssl/config/archs/linux32-s390x/asm_avx2/configdata.pm
    @@ -159,7 +159,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -207,7 +207,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux32-s390x",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux32-s390x/asm_avx2/crypto/buildinf.h b/deps/openssl/config/archs/linux32-s390x/asm_avx2/crypto/buildinf.h
    index e689eb7c7734ff..cc34b5b48f7286 100644
    --- a/deps/openssl/config/archs/linux32-s390x/asm_avx2/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux32-s390x/asm_avx2/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux32-s390x"
    -#define DATE "built on: Sun Aug  6 00:36:40 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:58:48 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux32-s390x/asm_avx2/include/openssl/opensslv.h b/deps/openssl/config/archs/linux32-s390x/asm_avx2/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux32-s390x/asm_avx2/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux32-s390x/asm_avx2/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux32-s390x/asm_avx2/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux32-s390x/asm_avx2/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux32-s390x/asm_avx2/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux32-s390x/asm_avx2/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux32-s390x/no-asm/configdata.pm b/deps/openssl/config/archs/linux32-s390x/no-asm/configdata.pm
    index a71b8dcf839746..e3a8f82fe7462c 100644
    --- a/deps/openssl/config/archs/linux32-s390x/no-asm/configdata.pm
    +++ b/deps/openssl/config/archs/linux32-s390x/no-asm/configdata.pm
    @@ -157,7 +157,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -206,7 +206,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-asm no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux32-s390x",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux32-s390x/no-asm/crypto/buildinf.h b/deps/openssl/config/archs/linux32-s390x/no-asm/crypto/buildinf.h
    index 7c01ad4e90df3b..d228feb5a19ee6 100644
    --- a/deps/openssl/config/archs/linux32-s390x/no-asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux32-s390x/no-asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux32-s390x"
    -#define DATE "built on: Sun Aug  6 00:37:03 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:59:08 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux32-s390x/no-asm/include/openssl/opensslv.h b/deps/openssl/config/archs/linux32-s390x/no-asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux32-s390x/no-asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux32-s390x/no-asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux32-s390x/no-asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux32-s390x/no-asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux32-s390x/no-asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux32-s390x/no-asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux64-loongarch64/no-asm/configdata.pm b/deps/openssl/config/archs/linux64-loongarch64/no-asm/configdata.pm
    index 9576c99c906303..f8186f5553dd14 100644
    --- a/deps/openssl/config/archs/linux64-loongarch64/no-asm/configdata.pm
    +++ b/deps/openssl/config/archs/linux64-loongarch64/no-asm/configdata.pm
    @@ -157,7 +157,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -206,7 +206,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-asm no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux64-loongarch64",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux64-loongarch64/no-asm/crypto/buildinf.h b/deps/openssl/config/archs/linux64-loongarch64/no-asm/crypto/buildinf.h
    index 4e95343a9fb4cd..3ba7a434358453 100644
    --- a/deps/openssl/config/archs/linux64-loongarch64/no-asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux64-loongarch64/no-asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux64-loongarch64"
    -#define DATE "built on: Sun Aug  6 00:45:10 2023 UTC"
    +#define DATE "built on: Thu Oct 26 15:05:52 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux64-loongarch64/no-asm/include/openssl/opensslv.h b/deps/openssl/config/archs/linux64-loongarch64/no-asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux64-loongarch64/no-asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux64-loongarch64/no-asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux64-loongarch64/no-asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux64-loongarch64/no-asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux64-loongarch64/no-asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux64-loongarch64/no-asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux64-mips64/asm/configdata.pm b/deps/openssl/config/archs/linux64-mips64/asm/configdata.pm
    index dbfc0d2736f05a..223edd33ddacd4 100644
    --- a/deps/openssl/config/archs/linux64-mips64/asm/configdata.pm
    +++ b/deps/openssl/config/archs/linux64-mips64/asm/configdata.pm
    @@ -162,7 +162,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -210,7 +210,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -262,11 +262,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux64-mips64",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux64-mips64/asm/crypto/buildinf.h b/deps/openssl/config/archs/linux64-mips64/asm/crypto/buildinf.h
    index 6b70def08e855a..1f63d54c12ba01 100644
    --- a/deps/openssl/config/archs/linux64-mips64/asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux64-mips64/asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux64-mips64"
    -#define DATE "built on: Sun Aug  6 00:38:36 2023 UTC"
    +#define DATE "built on: Thu Oct 26 15:00:22 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux64-mips64/asm/include/openssl/opensslv.h b/deps/openssl/config/archs/linux64-mips64/asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux64-mips64/asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux64-mips64/asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux64-mips64/asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux64-mips64/asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux64-mips64/asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux64-mips64/asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux64-mips64/asm_avx2/configdata.pm b/deps/openssl/config/archs/linux64-mips64/asm_avx2/configdata.pm
    index 3b8e66e40539e8..ab9529b1189573 100644
    --- a/deps/openssl/config/archs/linux64-mips64/asm_avx2/configdata.pm
    +++ b/deps/openssl/config/archs/linux64-mips64/asm_avx2/configdata.pm
    @@ -162,7 +162,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -210,7 +210,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -262,11 +262,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux64-mips64",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux64-mips64/asm_avx2/crypto/buildinf.h b/deps/openssl/config/archs/linux64-mips64/asm_avx2/crypto/buildinf.h
    index 594e838897cbbb..492782784a2fed 100644
    --- a/deps/openssl/config/archs/linux64-mips64/asm_avx2/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux64-mips64/asm_avx2/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux64-mips64"
    -#define DATE "built on: Sun Aug  6 00:38:59 2023 UTC"
    +#define DATE "built on: Thu Oct 26 15:00:41 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux64-mips64/asm_avx2/include/openssl/opensslv.h b/deps/openssl/config/archs/linux64-mips64/asm_avx2/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux64-mips64/asm_avx2/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux64-mips64/asm_avx2/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux64-mips64/asm_avx2/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux64-mips64/asm_avx2/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux64-mips64/asm_avx2/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux64-mips64/asm_avx2/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux64-mips64/no-asm/configdata.pm b/deps/openssl/config/archs/linux64-mips64/no-asm/configdata.pm
    index 01bb1010d678bf..60fd68cd9d1b05 100644
    --- a/deps/openssl/config/archs/linux64-mips64/no-asm/configdata.pm
    +++ b/deps/openssl/config/archs/linux64-mips64/no-asm/configdata.pm
    @@ -157,7 +157,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -206,7 +206,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-asm no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux64-mips64",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux64-mips64/no-asm/crypto/buildinf.h b/deps/openssl/config/archs/linux64-mips64/no-asm/crypto/buildinf.h
    index 1c1ffc1c348702..b2da592e4a422c 100644
    --- a/deps/openssl/config/archs/linux64-mips64/no-asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux64-mips64/no-asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux64-mips64"
    -#define DATE "built on: Sun Aug  6 00:39:21 2023 UTC"
    +#define DATE "built on: Thu Oct 26 15:00:59 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux64-mips64/no-asm/include/openssl/opensslv.h b/deps/openssl/config/archs/linux64-mips64/no-asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux64-mips64/no-asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux64-mips64/no-asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux64-mips64/no-asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux64-mips64/no-asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux64-mips64/no-asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux64-mips64/no-asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux64-riscv64/no-asm/configdata.pm b/deps/openssl/config/archs/linux64-riscv64/no-asm/configdata.pm
    index 2618989ca8c17c..b807271a07fd32 100644
    --- a/deps/openssl/config/archs/linux64-riscv64/no-asm/configdata.pm
    +++ b/deps/openssl/config/archs/linux64-riscv64/no-asm/configdata.pm
    @@ -157,7 +157,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -206,7 +206,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-asm no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux64-riscv64",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux64-riscv64/no-asm/crypto/buildinf.h b/deps/openssl/config/archs/linux64-riscv64/no-asm/crypto/buildinf.h
    index f8ee87111d60b3..2c8f14b9fd31f8 100644
    --- a/deps/openssl/config/archs/linux64-riscv64/no-asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux64-riscv64/no-asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux64-riscv64"
    -#define DATE "built on: Sun Aug  6 00:44:48 2023 UTC"
    +#define DATE "built on: Thu Oct 26 15:05:34 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux64-riscv64/no-asm/include/openssl/opensslv.h b/deps/openssl/config/archs/linux64-riscv64/no-asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux64-riscv64/no-asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux64-riscv64/no-asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux64-riscv64/no-asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux64-riscv64/no-asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux64-riscv64/no-asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux64-riscv64/no-asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux64-s390x/asm/configdata.pm b/deps/openssl/config/archs/linux64-s390x/asm/configdata.pm
    index 31e57b928cac04..7ca0547e9d1176 100644
    --- a/deps/openssl/config/archs/linux64-s390x/asm/configdata.pm
    +++ b/deps/openssl/config/archs/linux64-s390x/asm/configdata.pm
    @@ -159,7 +159,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -207,7 +207,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux64-s390x",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux64-s390x/asm/crypto/buildinf.h b/deps/openssl/config/archs/linux64-s390x/asm/crypto/buildinf.h
    index b10344ae3019e1..aad4edb0f23308 100644
    --- a/deps/openssl/config/archs/linux64-s390x/asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux64-s390x/asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux64-s390x"
    -#define DATE "built on: Sun Aug  6 00:37:26 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:59:26 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux64-s390x/asm/include/openssl/opensslv.h b/deps/openssl/config/archs/linux64-s390x/asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux64-s390x/asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux64-s390x/asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux64-s390x/asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux64-s390x/asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux64-s390x/asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux64-s390x/asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux64-s390x/asm_avx2/configdata.pm b/deps/openssl/config/archs/linux64-s390x/asm_avx2/configdata.pm
    index f7a270be6046c4..67f9b59a4f1473 100644
    --- a/deps/openssl/config/archs/linux64-s390x/asm_avx2/configdata.pm
    +++ b/deps/openssl/config/archs/linux64-s390x/asm_avx2/configdata.pm
    @@ -159,7 +159,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -207,7 +207,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux64-s390x",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux64-s390x/asm_avx2/crypto/buildinf.h b/deps/openssl/config/archs/linux64-s390x/asm_avx2/crypto/buildinf.h
    index c602e1eed19db4..49a18326cda364 100644
    --- a/deps/openssl/config/archs/linux64-s390x/asm_avx2/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux64-s390x/asm_avx2/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux64-s390x"
    -#define DATE "built on: Sun Aug  6 00:37:50 2023 UTC"
    +#define DATE "built on: Thu Oct 26 14:59:45 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux64-s390x/asm_avx2/include/openssl/opensslv.h b/deps/openssl/config/archs/linux64-s390x/asm_avx2/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux64-s390x/asm_avx2/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux64-s390x/asm_avx2/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux64-s390x/asm_avx2/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux64-s390x/asm_avx2/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux64-s390x/asm_avx2/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux64-s390x/asm_avx2/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/linux64-s390x/no-asm/configdata.pm b/deps/openssl/config/archs/linux64-s390x/no-asm/configdata.pm
    index a44e5d6c7ea1d1..0511cc0ad771f1 100644
    --- a/deps/openssl/config/archs/linux64-s390x/no-asm/configdata.pm
    +++ b/deps/openssl/config/archs/linux64-s390x/no-asm/configdata.pm
    @@ -157,7 +157,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -206,7 +206,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-asm no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -259,11 +259,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned char",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "linux64-s390x",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/linux64-s390x/no-asm/crypto/buildinf.h b/deps/openssl/config/archs/linux64-s390x/no-asm/crypto/buildinf.h
    index 6d7b9134d30329..56f3cb4a199951 100644
    --- a/deps/openssl/config/archs/linux64-s390x/no-asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/linux64-s390x/no-asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: linux64-s390x"
    -#define DATE "built on: Sun Aug  6 00:38:14 2023 UTC"
    +#define DATE "built on: Thu Oct 26 15:00:04 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/linux64-s390x/no-asm/include/openssl/opensslv.h b/deps/openssl/config/archs/linux64-s390x/no-asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/linux64-s390x/no-asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/linux64-s390x/no-asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/linux64-s390x/no-asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/linux64-s390x/no-asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/linux64-s390x/no-asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/linux64-s390x/no-asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/solaris-x86-gcc/asm/configdata.pm b/deps/openssl/config/archs/solaris-x86-gcc/asm/configdata.pm
    index d60b22c0286e85..5ab80e6faf2eee 100644
    --- a/deps/openssl/config/archs/solaris-x86-gcc/asm/configdata.pm
    +++ b/deps/openssl/config/archs/solaris-x86-gcc/asm/configdata.pm
    @@ -156,7 +156,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -204,7 +204,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -256,11 +256,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "solaris-x86-gcc",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/solaris-x86-gcc/asm/crypto/buildinf.h b/deps/openssl/config/archs/solaris-x86-gcc/asm/crypto/buildinf.h
    index 6c58b044ea9707..468c40de382836 100644
    --- a/deps/openssl/config/archs/solaris-x86-gcc/asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/solaris-x86-gcc/asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: solaris-x86-gcc"
    -#define DATE "built on: Sun Aug  6 00:39:44 2023 UTC"
    +#define DATE "built on: Thu Oct 26 15:01:17 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/solaris-x86-gcc/asm/include/openssl/opensslv.h b/deps/openssl/config/archs/solaris-x86-gcc/asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/solaris-x86-gcc/asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/solaris-x86-gcc/asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/solaris-x86-gcc/asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/solaris-x86-gcc/asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/solaris-x86-gcc/asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/solaris-x86-gcc/asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/solaris-x86-gcc/asm_avx2/configdata.pm b/deps/openssl/config/archs/solaris-x86-gcc/asm_avx2/configdata.pm
    index ec632ff0f28c57..7e2449164988b9 100644
    --- a/deps/openssl/config/archs/solaris-x86-gcc/asm_avx2/configdata.pm
    +++ b/deps/openssl/config/archs/solaris-x86-gcc/asm_avx2/configdata.pm
    @@ -156,7 +156,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -204,7 +204,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -256,11 +256,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "solaris-x86-gcc",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/solaris-x86-gcc/asm_avx2/crypto/buildinf.h b/deps/openssl/config/archs/solaris-x86-gcc/asm_avx2/crypto/buildinf.h
    index 01fe3449426840..805dcab06bb3b9 100644
    --- a/deps/openssl/config/archs/solaris-x86-gcc/asm_avx2/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/solaris-x86-gcc/asm_avx2/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: solaris-x86-gcc"
    -#define DATE "built on: Sun Aug  6 00:40:07 2023 UTC"
    +#define DATE "built on: Thu Oct 26 15:01:37 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/solaris-x86-gcc/asm_avx2/include/openssl/opensslv.h b/deps/openssl/config/archs/solaris-x86-gcc/asm_avx2/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/solaris-x86-gcc/asm_avx2/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/solaris-x86-gcc/asm_avx2/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/solaris-x86-gcc/asm_avx2/include/openssl/pkcs7.h b/deps/openssl/config/archs/solaris-x86-gcc/asm_avx2/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/solaris-x86-gcc/asm_avx2/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/solaris-x86-gcc/asm_avx2/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/solaris-x86-gcc/no-asm/configdata.pm b/deps/openssl/config/archs/solaris-x86-gcc/no-asm/configdata.pm
    index 5dc7107bb26bbd..cade32bd647c0b 100644
    --- a/deps/openssl/config/archs/solaris-x86-gcc/no-asm/configdata.pm
    +++ b/deps/openssl/config/archs/solaris-x86-gcc/no-asm/configdata.pm
    @@ -154,7 +154,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -203,7 +203,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-asm no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -256,11 +256,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "solaris-x86-gcc",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/solaris-x86-gcc/no-asm/crypto/buildinf.h b/deps/openssl/config/archs/solaris-x86-gcc/no-asm/crypto/buildinf.h
    index d9d8f29beefec3..8201c478c71fe0 100644
    --- a/deps/openssl/config/archs/solaris-x86-gcc/no-asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/solaris-x86-gcc/no-asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: solaris-x86-gcc"
    -#define DATE "built on: Sun Aug  6 00:40:30 2023 UTC"
    +#define DATE "built on: Thu Oct 26 15:01:58 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/solaris-x86-gcc/no-asm/include/openssl/opensslv.h b/deps/openssl/config/archs/solaris-x86-gcc/no-asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/solaris-x86-gcc/no-asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/solaris-x86-gcc/no-asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/solaris-x86-gcc/no-asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/solaris-x86-gcc/no-asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/solaris-x86-gcc/no-asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/solaris-x86-gcc/no-asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/solaris64-x86_64-gcc/asm/configdata.pm b/deps/openssl/config/archs/solaris64-x86_64-gcc/asm/configdata.pm
    index 199dee44226d9f..48232d7ea1f9e6 100644
    --- a/deps/openssl/config/archs/solaris64-x86_64-gcc/asm/configdata.pm
    +++ b/deps/openssl/config/archs/solaris64-x86_64-gcc/asm/configdata.pm
    @@ -156,7 +156,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -204,7 +204,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -256,11 +256,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "solaris64-x86_64-gcc",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/solaris64-x86_64-gcc/asm/crypto/buildinf.h b/deps/openssl/config/archs/solaris64-x86_64-gcc/asm/crypto/buildinf.h
    index 45e22d76fd5e66..f953c4d35bb5b0 100644
    --- a/deps/openssl/config/archs/solaris64-x86_64-gcc/asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/solaris64-x86_64-gcc/asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: solaris64-x86_64-gcc"
    -#define DATE "built on: Sun Aug  6 00:40:52 2023 UTC"
    +#define DATE "built on: Thu Oct 26 15:02:16 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/solaris64-x86_64-gcc/asm/include/openssl/opensslv.h b/deps/openssl/config/archs/solaris64-x86_64-gcc/asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/solaris64-x86_64-gcc/asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/solaris64-x86_64-gcc/asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/solaris64-x86_64-gcc/asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/solaris64-x86_64-gcc/asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/solaris64-x86_64-gcc/asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/solaris64-x86_64-gcc/asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/solaris64-x86_64-gcc/asm_avx2/configdata.pm b/deps/openssl/config/archs/solaris64-x86_64-gcc/asm_avx2/configdata.pm
    index df9f4cc099ead6..4a7a3cf873a3e4 100644
    --- a/deps/openssl/config/archs/solaris64-x86_64-gcc/asm_avx2/configdata.pm
    +++ b/deps/openssl/config/archs/solaris64-x86_64-gcc/asm_avx2/configdata.pm
    @@ -156,7 +156,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -204,7 +204,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -256,11 +256,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "solaris64-x86_64-gcc",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/solaris64-x86_64-gcc/asm_avx2/crypto/buildinf.h b/deps/openssl/config/archs/solaris64-x86_64-gcc/asm_avx2/crypto/buildinf.h
    index 9bff7519bf2417..0fcdd941db1ba8 100644
    --- a/deps/openssl/config/archs/solaris64-x86_64-gcc/asm_avx2/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/solaris64-x86_64-gcc/asm_avx2/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: solaris64-x86_64-gcc"
    -#define DATE "built on: Sun Aug  6 00:41:20 2023 UTC"
    +#define DATE "built on: Thu Oct 26 15:02:40 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/solaris64-x86_64-gcc/asm_avx2/include/openssl/opensslv.h b/deps/openssl/config/archs/solaris64-x86_64-gcc/asm_avx2/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/solaris64-x86_64-gcc/asm_avx2/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/solaris64-x86_64-gcc/asm_avx2/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/solaris64-x86_64-gcc/asm_avx2/include/openssl/pkcs7.h b/deps/openssl/config/archs/solaris64-x86_64-gcc/asm_avx2/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/solaris64-x86_64-gcc/asm_avx2/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/solaris64-x86_64-gcc/asm_avx2/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/config/archs/solaris64-x86_64-gcc/no-asm/configdata.pm b/deps/openssl/config/archs/solaris64-x86_64-gcc/no-asm/configdata.pm
    index a15e817f8966e5..902cd2bbbf9f69 100644
    --- a/deps/openssl/config/archs/solaris64-x86_64-gcc/no-asm/configdata.pm
    +++ b/deps/openssl/config/archs/solaris64-x86_64-gcc/no-asm/configdata.pm
    @@ -154,7 +154,7 @@ our %config = (
         ],
         "dynamic_engines" => "0",
         "ex_libs" => [],
    -    "full_version" => "3.0.10+quic",
    +    "full_version" => "3.0.12+quic",
         "includes" => [],
         "lflags" => [],
         "lib_defines" => [
    @@ -203,7 +203,7 @@ our %config = (
         "openssl_sys_defines" => [],
         "openssldir" => "",
         "options" => "enable-ssl-trace enable-fips no-afalgeng no-asan no-asm no-buildtest-c++ no-comp no-crypto-mdebug no-crypto-mdebug-backtrace no-devcryptoeng no-dynamic-engine no-ec_nistp_64_gcc_128 no-egd no-external-tests no-fuzz-afl no-fuzz-libfuzzer no-ktls no-loadereng no-md2 no-msan no-rc5 no-sctp no-shared no-ssl3 no-ssl3-method no-trace no-ubsan no-unit-test no-uplink no-weak-ssl-ciphers no-zlib no-zlib-dynamic",
    -    "patch" => "10",
    +    "patch" => "12",
         "perl_archname" => "x86_64-linux-gnu-thread-multi",
         "perl_cmd" => "/usr/bin/perl",
         "perl_version" => "5.34.0",
    @@ -256,11 +256,11 @@ our %config = (
         "prerelease" => "",
         "processor" => "",
         "rc4_int" => "unsigned int",
    -    "release_date" => "1 Aug 2023",
    +    "release_date" => "24 Oct 2023",
         "shlib_version" => "81.3",
         "sourcedir" => ".",
         "target" => "solaris64-x86_64-gcc",
    -    "version" => "3.0.10"
    +    "version" => "3.0.12"
     );
     our %target = (
         "AR" => "ar",
    diff --git a/deps/openssl/config/archs/solaris64-x86_64-gcc/no-asm/crypto/buildinf.h b/deps/openssl/config/archs/solaris64-x86_64-gcc/no-asm/crypto/buildinf.h
    index c9d1cb2473635d..84378d6580e182 100644
    --- a/deps/openssl/config/archs/solaris64-x86_64-gcc/no-asm/crypto/buildinf.h
    +++ b/deps/openssl/config/archs/solaris64-x86_64-gcc/no-asm/crypto/buildinf.h
    @@ -11,7 +11,7 @@
      */
     
     #define PLATFORM "platform: solaris64-x86_64-gcc"
    -#define DATE "built on: Sun Aug  6 00:41:48 2023 UTC"
    +#define DATE "built on: Thu Oct 26 15:03:03 2023 UTC"
     
     /*
      * Generate compiler_flags as an array of individual characters. This is a
    diff --git a/deps/openssl/config/archs/solaris64-x86_64-gcc/no-asm/include/openssl/opensslv.h b/deps/openssl/config/archs/solaris64-x86_64-gcc/no-asm/include/openssl/opensslv.h
    index 06ba6600ff29ce..ea36c0ca51c2ab 100644
    --- a/deps/openssl/config/archs/solaris64-x86_64-gcc/no-asm/include/openssl/opensslv.h
    +++ b/deps/openssl/config/archs/solaris64-x86_64-gcc/no-asm/include/openssl/opensslv.h
    @@ -29,7 +29,7 @@ extern "C" {
      */
     # define OPENSSL_VERSION_MAJOR  3
     # define OPENSSL_VERSION_MINOR  0
    -# define OPENSSL_VERSION_PATCH  10
    +# define OPENSSL_VERSION_PATCH  12
     
     /*
      * Additional version information
    @@ -74,21 +74,21 @@ extern "C" {
      * longer variant with OPENSSL_VERSION_PRE_RELEASE_STR and
      * OPENSSL_VERSION_BUILD_METADATA_STR appended.
      */
    -# define OPENSSL_VERSION_STR "3.0.10"
    -# define OPENSSL_FULL_VERSION_STR "3.0.10+quic"
    +# define OPENSSL_VERSION_STR "3.0.12"
    +# define OPENSSL_FULL_VERSION_STR "3.0.12+quic"
     
     /*
      * SECTION 3: ADDITIONAL METADATA
      *
      * These strings are defined separately to allow them to be parsable.
      */
    -# define OPENSSL_RELEASE_DATE "1 Aug 2023"
    +# define OPENSSL_RELEASE_DATE "24 Oct 2023"
     
     /*
      * SECTION 4: BACKWARD COMPATIBILITY
      */
     
    -# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.10+quic 1 Aug 2023"
    +# define OPENSSL_VERSION_TEXT "OpenSSL 3.0.12+quic 24 Oct 2023"
     
     /* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
     # ifdef OPENSSL_VERSION_PRE_RELEASE
    diff --git a/deps/openssl/config/archs/solaris64-x86_64-gcc/no-asm/include/openssl/pkcs7.h b/deps/openssl/config/archs/solaris64-x86_64-gcc/no-asm/include/openssl/pkcs7.h
    index 557a0a7264beec..0ce79bf4fa160e 100644
    --- a/deps/openssl/config/archs/solaris64-x86_64-gcc/no-asm/include/openssl/pkcs7.h
    +++ b/deps/openssl/config/archs/solaris64-x86_64-gcc/no-asm/include/openssl/pkcs7.h
    @@ -2,7 +2,7 @@
      * WARNING: do not edit!
      * Generated by Makefile from include/openssl/pkcs7.h.in
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,8 +56,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/openssl/CHANGES.md b/deps/openssl/openssl/CHANGES.md
    index 374fdc662cb94c..7d892d57ac0914 100644
    --- a/deps/openssl/openssl/CHANGES.md
    +++ b/deps/openssl/openssl/CHANGES.md
    @@ -28,12 +28,44 @@ breaking changes, and mappings for the large list of deprecated functions.
     
     [Migration guide]: https://github.com/openssl/openssl/tree/master/doc/man7/migration_guide.pod
     
    -### Changes between 3.0.10 and 3.0.10+quic [1 Aug 2023]
    +### Changes between 3.0.12 and 3.0.12+quic [24 Oct 2023]
     
     * Add QUIC API support from BoringSSL
     
        *Todd Short*
     
    +### Changes between 3.0.11 and 3.0.12 [24 Oct 2023]
    +
    + * Fix incorrect key and IV resizing issues when calling EVP_EncryptInit_ex2(),
    +   EVP_DecryptInit_ex2() or EVP_CipherInit_ex2() with OSSL_PARAM parameters
    +   that alter the key or IV length ([CVE-2023-5363]).
    +
    +   *Paul Dale*
    +
    +### Changes between 3.0.10 and 3.0.11 [19 Sep 2023]
    +
    + * Fix POLY1305 MAC implementation corrupting XMM registers on Windows.
    +
    +   The POLY1305 MAC (message authentication code) implementation in OpenSSL
    +   does not save the contents of non-volatile XMM registers on Windows 64
    +   platform when calculating the MAC of data larger than 64 bytes. Before
    +   returning to the caller all the XMM registers are set to zero rather than
    +   restoring their previous content. The vulnerable code is used only on newer
    +   x86_64 processors supporting the AVX512-IFMA instructions.
    +
    +   The consequences of this kind of internal application state corruption can
    +   be various - from no consequences, if the calling application does not
    +   depend on the contents of non-volatile XMM registers at all, to the worst
    +   consequences, where the attacker could get complete control of the
    +   application process. However given the contents of the registers are just
    +   zeroized so the attacker cannot put arbitrary values inside, the most likely
    +   consequence, if any, would be an incorrect result of some application
    +   dependent calculations or a crash leading to a denial of service.
    +
    +   ([CVE-2023-4807])
    +
    +   *Bernd Edlinger*
    +
     ### Changes between 3.0.9 and 3.0.10 [1 Aug 2023]
     
      * Fix excessive time spent checking DH q parameter value.
    @@ -19714,6 +19746,8 @@ ndif
     
     
     
    +[CVE-2023-5363]: https://www.openssl.org/news/vulnerabilities.html#CVE-2023-5363
    +[CVE-2023-4807]: https://www.openssl.org/news/vulnerabilities.html#CVE-2023-4807
     [CVE-2023-3817]: https://www.openssl.org/news/vulnerabilities.html#CVE-2023-3817
     [CVE-2023-3446]: https://www.openssl.org/news/vulnerabilities.html#CVE-2023-3446
     [CVE-2023-2975]: https://www.openssl.org/news/vulnerabilities.html#CVE-2023-2975
    diff --git a/deps/openssl/openssl/Configurations/10-main.conf b/deps/openssl/openssl/Configurations/10-main.conf
    index 8010087b46dcea..280a75b213f25c 100644
    --- a/deps/openssl/openssl/Configurations/10-main.conf
    +++ b/deps/openssl/openssl/Configurations/10-main.conf
    @@ -9,19 +9,22 @@ sub vc_win64a_info {
                 $vc_win64a_info = { AS        => "nasm",
                                     ASFLAGS   => "-g",
                                     asflags   => "-Ox -f win64 -DNEAR",
    -                                asoutflag => "-o " };
    +                                asoutflag => "-o ",
    +                                perlasm_scheme => "nasm" };
             } elsif ($disabled{asm}) {
                 # assembler is still used to compile uplink shim
                 $vc_win64a_info = { AS        => "ml64",
                                     ASFLAGS   => "/nologo /Zi",
                                     asflags   => "/c /Cp /Cx",
    -                                asoutflag => "/Fo" };
    +                                asoutflag => "/Fo",
    +                                perlasm_scheme => "masm" };
             } else {
                 $die->("NASM not found - make sure it's installed and available on %PATH%\n");
                 $vc_win64a_info = { AS        => "{unknown}",
                                     ASFLAGS   => "",
                                     asflags   => "",
    -                                asoutflag => "" };
    +                                asoutflag => "",
    +                                perlasm_scheme => "auto" };
             }
         }
         return $vc_win64a_info;
    @@ -1416,7 +1419,7 @@ my %targets = (
             sys_id           => "WIN64A",
             uplink_arch      => 'x86_64',
             asm_arch         => 'x86_64',
    -        perlasm_scheme   => "auto",
    +        perlasm_scheme   => sub { vc_win64a_info()->{perlasm_scheme} },
             multilib         => "-x64",
         },
         "VC-WIN32" => {
    diff --git a/deps/openssl/openssl/Configurations/README.md b/deps/openssl/openssl/Configurations/README.md
    index be8c394d0872b2..de3d8bad8a02d4 100644
    --- a/deps/openssl/openssl/Configurations/README.md
    +++ b/deps/openssl/openssl/Configurations/README.md
    @@ -233,8 +233,14 @@ In each table entry, the following keys are significant:
                                                     is ILP32;
                                RC4_CHAR             RC4 key schedule is made
                                                     up of 'unsigned char's;
    +                                                Note: should not be used
    +                                                for new configuration
    +                                                targets
                                RC4_INT              RC4 key schedule is made
                                                     up of 'unsigned int's;
    +                                                Note: should not be used
    +                                                for new configuration
    +                                                targets
     
     [1] as part of the target configuration, one can have a key called
       `inherit_from` that indicates what other configurations to inherit
    diff --git a/deps/openssl/openssl/Configurations/unix-Makefile.tmpl b/deps/openssl/openssl/Configurations/unix-Makefile.tmpl
    index 17e194f1ef754a..a48fae5fb8b8fe 100644
    --- a/deps/openssl/openssl/Configurations/unix-Makefile.tmpl
    +++ b/deps/openssl/openssl/Configurations/unix-Makefile.tmpl
    @@ -614,28 +614,28 @@ uninstall_sw: uninstall_runtime uninstall_modules uninstall_engines uninstall_de
     install_docs: install_man_docs install_html_docs
     
     uninstall_docs: uninstall_man_docs uninstall_html_docs
    -	$(RM) -r $(DESTDIR)$(DOCDIR)
    +	$(RM) -r "$(DESTDIR)$(DOCDIR)"
     
     {- output_off() if $disabled{fips}; "" -}
     install_fips: build_sw $(INSTALL_FIPSMODULECONF)
     	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
    -	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(MODULESDIR)
    -	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(OPENSSLDIR)
    +	@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(MODULESDIR)"
    +	@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(OPENSSLDIR)"
     	@$(ECHO) "*** Installing FIPS module"
     	@$(ECHO) "install $(INSTALL_FIPSMODULE) -> $(DESTDIR)$(MODULESDIR)/$(FIPSMODULENAME)"
    -	@cp "$(INSTALL_FIPSMODULE)" $(DESTDIR)$(MODULESDIR)/$(FIPSMODULENAME).new
    -	@chmod 755 $(DESTDIR)$(MODULESDIR)/$(FIPSMODULENAME).new
    -	@mv -f $(DESTDIR)$(MODULESDIR)/$(FIPSMODULENAME).new \
    -	       $(DESTDIR)$(MODULESDIR)/$(FIPSMODULENAME)
    +	@cp "$(INSTALL_FIPSMODULE)" "$(DESTDIR)$(MODULESDIR)/$(FIPSMODULENAME).new"
    +	@chmod 755 "$(DESTDIR)$(MODULESDIR)/$(FIPSMODULENAME).new"
    +	@mv -f "$(DESTDIR)$(MODULESDIR)/$(FIPSMODULENAME).new" \
    +	       "$(DESTDIR)$(MODULESDIR)/$(FIPSMODULENAME)"
     	@$(ECHO) "*** Installing FIPS module configuration"
     	@$(ECHO) "install $(INSTALL_FIPSMODULECONF) -> $(DESTDIR)$(OPENSSLDIR)/fipsmodule.cnf"
    -	@cp $(INSTALL_FIPSMODULECONF) $(DESTDIR)$(OPENSSLDIR)/fipsmodule.cnf
    +	@cp $(INSTALL_FIPSMODULECONF) "$(DESTDIR)$(OPENSSLDIR)/fipsmodule.cnf"
     
     uninstall_fips:
     	@$(ECHO) "*** Uninstalling FIPS module configuration"
    -	$(RM) $(DESTDIR)$(OPENSSLDIR)/fipsmodule.cnf
    +	$(RM) "$(DESTDIR)$(OPENSSLDIR)/fipsmodule.cnf"
     	@$(ECHO) "*** Uninstalling FIPS module"
    -	$(RM) $(DESTDIR)$(MODULESDIR)/$(FIPSMODULENAME)
    +	$(RM) "$(DESTDIR)$(MODULESDIR)/$(FIPSMODULENAME)"
     {- if ($disabled{fips}) { output_on(); } else { output_off(); } "" -}
     install_fips:
     	@$(ECHO) "The 'install_fips' target requires the 'enable-fips' option"
    @@ -646,75 +646,75 @@ uninstall_fips:
     
     
     install_ssldirs:
    -	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(OPENSSLDIR)/certs
    -	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(OPENSSLDIR)/private
    -	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(OPENSSLDIR)/misc
    +	@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(OPENSSLDIR)/certs"
    +	@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(OPENSSLDIR)/private"
    +	@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(OPENSSLDIR)/misc"
     	@set -e; for x in dummy $(MISC_SCRIPTS); do \
     		if [ "$$x" = "dummy" ]; then continue; fi; \
     		x1=`echo "$$x" | cut -f1 -d:`; \
     		x2=`echo "$$x" | cut -f2 -d:`; \
     		fn=`basename $$x1`; \
     		$(ECHO) "install $$x1 -> $(DESTDIR)$(OPENSSLDIR)/misc/$$fn"; \
    -		cp $$x1 $(DESTDIR)$(OPENSSLDIR)/misc/$$fn.new; \
    -		chmod 755 $(DESTDIR)$(OPENSSLDIR)/misc/$$fn.new; \
    -		mv -f $(DESTDIR)$(OPENSSLDIR)/misc/$$fn.new \
    -		      $(DESTDIR)$(OPENSSLDIR)/misc/$$fn; \
    +		cp $$x1 "$(DESTDIR)$(OPENSSLDIR)/misc/$$fn.new"; \
    +		chmod 755 "$(DESTDIR)$(OPENSSLDIR)/misc/$$fn.new"; \
    +		mv -f "$(DESTDIR)$(OPENSSLDIR)/misc/$$fn.new" \
    +		      "$(DESTDIR)$(OPENSSLDIR)/misc/$$fn"; \
     		if [ "$$x1" != "$$x2" ]; then \
     			ln=`basename "$$x2"`; \
     			: {- output_off() unless windowsdll(); "" -}; \
     			$(ECHO) "copy $(DESTDIR)$(OPENSSLDIR)/misc/$$ln -> $(DESTDIR)$(OPENSSLDIR)/misc/$$fn"; \
    -			cp $(DESTDIR)$(OPENSSLDIR)/misc/$$fn $(DESTDIR)$(OPENSSLDIR)/misc/$$ln; \
    +			cp "$(DESTDIR)$(OPENSSLDIR)/misc/$$fn" "$(DESTDIR)$(OPENSSLDIR)/misc/$$ln"; \
     			: {- output_on() unless windowsdll();
     			     output_off() if windowsdll(); "" -}; \
     			$(ECHO) "link $(DESTDIR)$(OPENSSLDIR)/misc/$$ln -> $(DESTDIR)$(OPENSSLDIR)/misc/$$fn"; \
    -			ln -sf $$fn $(DESTDIR)$(OPENSSLDIR)/misc/$$ln; \
    +			ln -sf $$fn "$(DESTDIR)$(OPENSSLDIR)/misc/$$ln"; \
     			: {- output_on() if windowsdll(); "" -}; \
     		fi; \
     	done
     	@$(ECHO) "install $(SRCDIR)/apps/openssl.cnf -> $(DESTDIR)$(OPENSSLDIR)/openssl.cnf.dist"
    -	@cp $(SRCDIR)/apps/openssl.cnf $(DESTDIR)$(OPENSSLDIR)/openssl.cnf.new
    -	@chmod 644 $(DESTDIR)$(OPENSSLDIR)/openssl.cnf.new
    -	@mv -f  $(DESTDIR)$(OPENSSLDIR)/openssl.cnf.new $(DESTDIR)$(OPENSSLDIR)/openssl.cnf.dist
    +	@cp $(SRCDIR)/apps/openssl.cnf "$(DESTDIR)$(OPENSSLDIR)/openssl.cnf.new"
    +	@chmod 644 "$(DESTDIR)$(OPENSSLDIR)/openssl.cnf.new"
    +	@mv -f  "$(DESTDIR)$(OPENSSLDIR)/openssl.cnf.new" "$(DESTDIR)$(OPENSSLDIR)/openssl.cnf.dist"
     	@if [ ! -f "$(DESTDIR)$(OPENSSLDIR)/openssl.cnf" ]; then \
     		$(ECHO) "install $(SRCDIR)/apps/openssl.cnf -> $(DESTDIR)$(OPENSSLDIR)/openssl.cnf"; \
    -		cp $(SRCDIR)/apps/openssl.cnf $(DESTDIR)$(OPENSSLDIR)/openssl.cnf; \
    -		chmod 644 $(DESTDIR)$(OPENSSLDIR)/openssl.cnf; \
    +		cp $(SRCDIR)/apps/openssl.cnf "$(DESTDIR)$(OPENSSLDIR)/openssl.cnf"; \
    +		chmod 644 "$(DESTDIR)$(OPENSSLDIR)/openssl.cnf"; \
     	fi
     	@$(ECHO) "install $(SRCDIR)/apps/ct_log_list.cnf -> $(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf.dist"
    -	@cp $(SRCDIR)/apps/ct_log_list.cnf $(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf.new
    -	@chmod 644 $(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf.new
    -	@mv -f  $(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf.new $(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf.dist
    +	@cp $(SRCDIR)/apps/ct_log_list.cnf "$(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf.new"
    +	@chmod 644 "$(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf.new"
    +	@mv -f  "$(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf.new" "$(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf.dist"
     	@if [ ! -f "$(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf" ]; then \
     		$(ECHO) "install $(SRCDIR)/apps/ct_log_list.cnf -> $(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf"; \
    -		cp $(SRCDIR)/apps/ct_log_list.cnf $(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf; \
    -		chmod 644 $(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf; \
    +		cp $(SRCDIR)/apps/ct_log_list.cnf "$(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf"; \
    +		chmod 644 "$(DESTDIR)$(OPENSSLDIR)/ct_log_list.cnf"; \
     	fi
     
     install_dev: install_runtime_libs
     	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
     	@$(ECHO) "*** Installing development files"
    -	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(INSTALLTOP)/include/openssl
    +	@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(INSTALLTOP)/include/openssl"
     	@ : {- output_off() if $disabled{uplink}; "" -}
     	@$(ECHO) "install $(SRCDIR)/ms/applink.c -> $(DESTDIR)$(INSTALLTOP)/include/openssl/applink.c"
    -	@cp $(SRCDIR)/ms/applink.c $(DESTDIR)$(INSTALLTOP)/include/openssl/applink.c
    -	@chmod 644 $(DESTDIR)$(INSTALLTOP)/include/openssl/applink.c
    +	@cp $(SRCDIR)/ms/applink.c "$(DESTDIR)$(INSTALLTOP)/include/openssl/applink.c"
    +	@chmod 644 "$(DESTDIR)$(INSTALLTOP)/include/openssl/applink.c"
     	@ : {- output_on() if $disabled{uplink}; "" -}
     	@set -e; for i in $(SRCDIR)/include/openssl/*.h \
     			  $(BLDDIR)/include/openssl/*.h; do \
     		fn=`basename $$i`; \
     		$(ECHO) "install $$i -> $(DESTDIR)$(INSTALLTOP)/include/openssl/$$fn"; \
    -		cp $$i $(DESTDIR)$(INSTALLTOP)/include/openssl/$$fn; \
    -		chmod 644 $(DESTDIR)$(INSTALLTOP)/include/openssl/$$fn; \
    +		cp $$i "$(DESTDIR)$(INSTALLTOP)/include/openssl/$$fn"; \
    +		chmod 644 "$(DESTDIR)$(INSTALLTOP)/include/openssl/$$fn"; \
     	done
    -	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(libdir)
    +	@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(libdir)"
     	@set -e; for l in $(INSTALL_LIBS); do \
     		fn=`basename $$l`; \
     		$(ECHO) "install $$l -> $(DESTDIR)$(libdir)/$$fn"; \
    -		cp $$l $(DESTDIR)$(libdir)/$$fn.new; \
    -		$(RANLIB) $(DESTDIR)$(libdir)/$$fn.new; \
    -		chmod 644 $(DESTDIR)$(libdir)/$$fn.new; \
    -		mv -f $(DESTDIR)$(libdir)/$$fn.new \
    -		      $(DESTDIR)$(libdir)/$$fn; \
    +		cp $$l "$(DESTDIR)$(libdir)/$$fn.new"; \
    +		$(RANLIB) "$(DESTDIR)$(libdir)/$$fn.new"; \
    +		chmod 644 "$(DESTDIR)$(libdir)/$$fn.new"; \
    +		mv -f "$(DESTDIR)$(libdir)/$$fn.new" \
    +		      "$(DESTDIR)$(libdir)/$$fn"; \
     	done
     	@ : {- output_off() if $disabled{shared}; "" -}
     	@set -e; for s in $(INSTALL_SHLIB_INFO); do \
    @@ -727,18 +727,18 @@ install_dev: install_runtime_libs
     		: {- output_off(); output_on() unless windowsdll() or sharedaix(); "" -}; \
     		if [ "$$fn2" != "" ]; then \
     			$(ECHO) "link $(DESTDIR)$(libdir)/$$fn2 -> $(DESTDIR)$(libdir)/$$fn1"; \
    -			ln -sf $$fn1 $(DESTDIR)$(libdir)/$$fn2; \
    +			ln -sf $$fn1 "$(DESTDIR)$(libdir)/$$fn2"; \
     		fi; \
     		: {- output_off() unless windowsdll() or sharedaix(); output_on() if windowsdll(); "" -}; \
     		if [ "$$fn3" != "" ]; then \
     			$(ECHO) "install $$s3 -> $(DESTDIR)$(libdir)/$$fn3"; \
    -			cp $$s3 $(DESTDIR)$(libdir)/$$fn3.new; \
    -			chmod 755 $(DESTDIR)$(libdir)/$$fn3.new; \
    -			mv -f $(DESTDIR)$(libdir)/$$fn3.new \
    -			      $(DESTDIR)$(libdir)/$$fn3; \
    +			cp $$s3 "$(DESTDIR)$(libdir)/$$fn3.new"; \
    +			chmod 755 "$(DESTDIR)$(libdir)/$$fn3.new"; \
    +			mv -f "$(DESTDIR)$(libdir)/$$fn3.new" \
    +			      "$(DESTDIR)$(libdir)/$$fn3"; \
     		fi; \
     		: {- output_off() if windowsdll(); output_on() if sharedaix(); "" -}; \
    -		a=$(DESTDIR)$(libdir)/$$fn2; \
    +		a="$(DESTDIR)$(libdir)/$$fn2"; \
     		$(ECHO) "install $$s1 -> $$a"; \
     		if [ -f $$a ]; then ( trap "rm -rf /tmp/ar.$$$$" INT 0; \
     			mkdir /tmp/ar.$$$$; ( cd /tmp/ar.$$$$; \
    @@ -755,35 +755,35 @@ install_dev: install_runtime_libs
     		: {- output_off() if sharedaix(); output_on(); "" -}; \
     	done
     	@ : {- output_on() if $disabled{shared}; "" -}
    -	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(libdir)/pkgconfig
    +	@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(libdir)/pkgconfig"
     	@$(ECHO) "install libcrypto.pc -> $(DESTDIR)$(libdir)/pkgconfig/libcrypto.pc"
    -	@cp libcrypto.pc $(DESTDIR)$(libdir)/pkgconfig
    -	@chmod 644 $(DESTDIR)$(libdir)/pkgconfig/libcrypto.pc
    +	@cp libcrypto.pc "$(DESTDIR)$(libdir)/pkgconfig"
    +	@chmod 644 "$(DESTDIR)$(libdir)/pkgconfig/libcrypto.pc"
     	@$(ECHO) "install libssl.pc -> $(DESTDIR)$(libdir)/pkgconfig/libssl.pc"
    -	@cp libssl.pc $(DESTDIR)$(libdir)/pkgconfig
    -	@chmod 644 $(DESTDIR)$(libdir)/pkgconfig/libssl.pc
    +	@cp libssl.pc "$(DESTDIR)$(libdir)/pkgconfig"
    +	@chmod 644 "$(DESTDIR)$(libdir)/pkgconfig/libssl.pc"
     	@$(ECHO) "install openssl.pc -> $(DESTDIR)$(libdir)/pkgconfig/openssl.pc"
    -	@cp openssl.pc $(DESTDIR)$(libdir)/pkgconfig
    -	@chmod 644 $(DESTDIR)$(libdir)/pkgconfig/openssl.pc
    +	@cp openssl.pc "$(DESTDIR)$(libdir)/pkgconfig"
    +	@chmod 644 "$(DESTDIR)$(libdir)/pkgconfig/openssl.pc"
     
     uninstall_dev: uninstall_runtime_libs
     	@$(ECHO) "*** Uninstalling development files"
     	@ : {- output_off() if $disabled{uplink}; "" -}
     	@$(ECHO) "$(RM) $(DESTDIR)$(INSTALLTOP)/include/openssl/applink.c"
    -	@$(RM) $(DESTDIR)$(INSTALLTOP)/include/openssl/applink.c
    +	@$(RM) "$(DESTDIR)$(INSTALLTOP)/include/openssl/applink.c"
     	@ : {- output_on() if $disabled{uplink}; "" -}
     	@set -e; for i in $(SRCDIR)/include/openssl/*.h \
     			  $(BLDDIR)/include/openssl/*.h; do \
     		fn=`basename $$i`; \
     		$(ECHO) "$(RM) $(DESTDIR)$(INSTALLTOP)/include/openssl/$$fn"; \
    -		$(RM) $(DESTDIR)$(INSTALLTOP)/include/openssl/$$fn; \
    +		$(RM) "$(DESTDIR)$(INSTALLTOP)/include/openssl/$$fn"; \
     	done
    -	-$(RMDIR) $(DESTDIR)$(INSTALLTOP)/include/openssl
    -	-$(RMDIR) $(DESTDIR)$(INSTALLTOP)/include
    +	-$(RMDIR) "$(DESTDIR)$(INSTALLTOP)/include/openssl"
    +	-$(RMDIR) "$(DESTDIR)$(INSTALLTOP)/include"
     	@set -e; for l in $(INSTALL_LIBS); do \
     		fn=`basename $$l`; \
     		$(ECHO) "$(RM) $(DESTDIR)$(libdir)/$$fn"; \
    -		$(RM) $(DESTDIR)$(libdir)/$$fn; \
    +		$(RM) "$(DESTDIR)$(libdir)/$$fn"; \
     	done
     	@ : {- output_off() if $disabled{shared}; "" -}
     	@set -e; for s in $(INSTALL_SHLIB_INFO); do \
    @@ -795,39 +795,39 @@ uninstall_dev: uninstall_runtime_libs
     		fn3=`basename "$$s3"`; \
     		: {- output_off() if windowsdll(); "" -}; \
     		$(ECHO) "$(RM) $(DESTDIR)$(libdir)/$$fn1"; \
    -		$(RM) $(DESTDIR)$(libdir)/$$fn1; \
    +		$(RM) "$(DESTDIR)$(libdir)/$$fn1"; \
     		if [ -n "$$fn2" ]; then \
     			$(ECHO) "$(RM) $(DESTDIR)$(libdir)/$$fn2"; \
    -			$(RM) $(DESTDIR)$(libdir)/$$fn2; \
    +			$(RM) "$(DESTDIR)$(libdir)/$$fn2"; \
     		fi; \
     		: {- output_on() if windowsdll(); "" -}{- output_off() unless windowsdll(); "" -}; \
     		if [ -n "$$fn3" ]; then \
     			$(ECHO) "$(RM) $(DESTDIR)$(libdir)/$$fn3"; \
    -			$(RM) $(DESTDIR)$(libdir)/$$fn3; \
    +			$(RM) "$(DESTDIR)$(libdir)/$$fn3"; \
     		fi; \
     		: {- output_on() unless windowsdll(); "" -}; \
     	done
     	@ : {- output_on() if $disabled{shared}; "" -}
    -	$(RM) $(DESTDIR)$(libdir)/pkgconfig/libcrypto.pc
    -	$(RM) $(DESTDIR)$(libdir)/pkgconfig/libssl.pc
    -	$(RM) $(DESTDIR)$(libdir)/pkgconfig/openssl.pc
    -	-$(RMDIR) $(DESTDIR)$(libdir)/pkgconfig
    -	-$(RMDIR) $(DESTDIR)$(libdir)
    +	$(RM) "$(DESTDIR)$(libdir)/pkgconfig/libcrypto.pc"
    +	$(RM) "$(DESTDIR)$(libdir)/pkgconfig/libssl.pc"
    +	$(RM) "$(DESTDIR)$(libdir)/pkgconfig/openssl.pc"
    +	-$(RMDIR) "$(DESTDIR)$(libdir)/pkgconfig"
    +	-$(RMDIR) "$(DESTDIR)$(libdir)"
     
     _install_modules_deps: install_runtime_libs build_modules
     
     install_engines: _install_modules_deps
     	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
    -	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(ENGINESDIR)/
    +	@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(ENGINESDIR)/"
     	@$(ECHO) "*** Installing engines"
     	@set -e; for e in dummy $(INSTALL_ENGINES); do \
     		if [ "$$e" = "dummy" ]; then continue; fi; \
     		fn=`basename $$e`; \
     		$(ECHO) "install $$e -> $(DESTDIR)$(ENGINESDIR)/$$fn"; \
    -		cp $$e $(DESTDIR)$(ENGINESDIR)/$$fn.new; \
    -		chmod 755 $(DESTDIR)$(ENGINESDIR)/$$fn.new; \
    -		mv -f $(DESTDIR)$(ENGINESDIR)/$$fn.new \
    -		      $(DESTDIR)$(ENGINESDIR)/$$fn; \
    +		cp $$e "$(DESTDIR)$(ENGINESDIR)/$$fn.new"; \
    +		chmod 755 "$(DESTDIR)$(ENGINESDIR)/$$fn.new"; \
    +		mv -f "$(DESTDIR)$(ENGINESDIR)/$$fn.new" \
    +		      "$(DESTDIR)$(ENGINESDIR)/$$fn"; \
     	done
     
     uninstall_engines:
    @@ -836,22 +836,22 @@ uninstall_engines:
     		if [ "$$e" = "dummy" ]; then continue; fi; \
     		fn=`basename $$e`; \
     		$(ECHO) "$(RM) $(DESTDIR)$(ENGINESDIR)/$$fn"; \
    -		$(RM) $(DESTDIR)$(ENGINESDIR)/$$fn; \
    +		$(RM) "$(DESTDIR)$(ENGINESDIR)/$$fn"; \
     	done
    -	-$(RMDIR) $(DESTDIR)$(ENGINESDIR)
    +	-$(RMDIR) "$(DESTDIR)$(ENGINESDIR)"
     
     install_modules: _install_modules_deps
     	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
    -	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(MODULESDIR)/
    +	@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(MODULESDIR)/"
     	@$(ECHO) "*** Installing modules"
     	@set -e; for e in dummy $(INSTALL_MODULES); do \
     		if [ "$$e" = "dummy" ]; then continue; fi; \
     		fn=`basename $$e`; \
     		$(ECHO) "install $$e -> $(DESTDIR)$(MODULESDIR)/$$fn"; \
    -		cp $$e $(DESTDIR)$(MODULESDIR)/$$fn.new; \
    -		chmod 755 $(DESTDIR)$(MODULESDIR)/$$fn.new; \
    -		mv -f $(DESTDIR)$(MODULESDIR)/$$fn.new \
    -		      $(DESTDIR)$(MODULESDIR)/$$fn; \
    +		cp $$e "$(DESTDIR)$(MODULESDIR)/$$fn.new"; \
    +		chmod 755 "$(DESTDIR)$(MODULESDIR)/$$fn.new"; \
    +		mv -f "$(DESTDIR)$(MODULESDIR)/$$fn.new" \
    +		      "$(DESTDIR)$(MODULESDIR)/$$fn"; \
     	done
     
     uninstall_modules:
    @@ -860,18 +860,18 @@ uninstall_modules:
     		if [ "$$e" = "dummy" ]; then continue; fi; \
     		fn=`basename $$e`; \
     		$(ECHO) "$(RM) $(DESTDIR)$(MODULESDIR)/$$fn"; \
    -		$(RM) $(DESTDIR)$(MODULESDIR)/$$fn; \
    +		$(RM) "$(DESTDIR)$(MODULESDIR)/$$fn"; \
     	done
    -	-$(RMDIR) $(DESTDIR)$(MODULESDIR)
    +	-$(RMDIR) "$(DESTDIR)$(MODULESDIR)"
     
     install_runtime: install_programs
     
     install_runtime_libs: build_libs
     	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
     	@ : {- output_off() if windowsdll(); "" -}
    -	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(libdir)
    +	@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(libdir)"
     	@ : {- output_on() if windowsdll(); output_off() unless windowsdll(); "" -}
    -	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(INSTALLTOP)/bin
    +	@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(INSTALLTOP)/bin"
     	@ : {- output_on() unless windowsdll(); "" -}
     	@$(ECHO) "*** Installing runtime libraries"
     	@set -e; for s in dummy $(INSTALL_SHLIBS); do \
    @@ -879,40 +879,40 @@ install_runtime_libs: build_libs
     		fn=`basename $$s`; \
     		: {- output_off() unless windowsdll(); "" -}; \
     		$(ECHO) "install $$s -> $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
    -		cp $$s $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new; \
    -		chmod 755 $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new; \
    -		mv -f $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new \
    -		      $(DESTDIR)$(INSTALLTOP)/bin/$$fn; \
    +		cp $$s "$(DESTDIR)$(INSTALLTOP)/bin/$$fn.new"; \
    +		chmod 755 "$(DESTDIR)$(INSTALLTOP)/bin/$$fn.new"; \
    +		mv -f "$(DESTDIR)$(INSTALLTOP)/bin/$$fn.new" \
    +		      "$(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
     		: {- output_on() unless windowsdll(); "" -}{- output_off() if windowsdll(); "" -}; \
     		$(ECHO) "install $$s -> $(DESTDIR)$(libdir)/$$fn"; \
    -		cp $$s $(DESTDIR)$(libdir)/$$fn.new; \
    -		chmod 755 $(DESTDIR)$(libdir)/$$fn.new; \
    -		mv -f $(DESTDIR)$(libdir)/$$fn.new \
    -		      $(DESTDIR)$(libdir)/$$fn; \
    +		cp $$s "$(DESTDIR)$(libdir)/$$fn.new"; \
    +		chmod 755 "$(DESTDIR)$(libdir)/$$fn.new"; \
    +		mv -f "$(DESTDIR)$(libdir)/$$fn.new" \
    +		      "$(DESTDIR)$(libdir)/$$fn"; \
     		: {- output_on() if windowsdll(); "" -}; \
     	done
     
     install_programs: install_runtime_libs build_programs
     	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
    -	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(INSTALLTOP)/bin
    +	@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(INSTALLTOP)/bin"
     	@$(ECHO) "*** Installing runtime programs"
     	@set -e; for x in dummy $(INSTALL_PROGRAMS); do \
     		if [ "$$x" = "dummy" ]; then continue; fi; \
     		fn=`basename $$x`; \
     		$(ECHO) "install $$x -> $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
    -		cp $$x $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new; \
    -		chmod 755 $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new; \
    -		mv -f $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new \
    -		      $(DESTDIR)$(INSTALLTOP)/bin/$$fn; \
    +		cp $$x "$(DESTDIR)$(INSTALLTOP)/bin/$$fn.new"; \
    +		chmod 755 "$(DESTDIR)$(INSTALLTOP)/bin/$$fn.new"; \
    +		mv -f "$(DESTDIR)$(INSTALLTOP)/bin/$$fn.new" \
    +		      "$(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
     	done
     	@set -e; for x in dummy $(BIN_SCRIPTS); do \
     		if [ "$$x" = "dummy" ]; then continue; fi; \
     		fn=`basename $$x`; \
     		$(ECHO) "install $$x -> $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
    -		cp $$x $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new; \
    -		chmod 755 $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new; \
    -		mv -f $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new \
    -		      $(DESTDIR)$(INSTALLTOP)/bin/$$fn; \
    +		cp $$x "$(DESTDIR)$(INSTALLTOP)/bin/$$fn.new"; \
    +		chmod 755 "$(DESTDIR)$(INSTALLTOP)/bin/$$fn.new"; \
    +		mv -f "$(DESTDIR)$(INSTALLTOP)/bin/$$fn.new" \
    +		      "$(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
     	done
     
     uninstall_runtime: uninstall_programs uninstall_runtime_libs
    @@ -924,16 +924,16 @@ uninstall_programs:
     		if [ "$$x" = "dummy" ]; then continue; fi; \
     		fn=`basename $$x`; \
     		$(ECHO) "$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
    -		$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn; \
    +		$(RM) "$(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
     	done;
     	@set -e; for x in dummy $(BIN_SCRIPTS); \
     	do  \
     		if [ "$$x" = "dummy" ]; then continue; fi; \
     		fn=`basename $$x`; \
     		$(ECHO) "$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
    -		$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn; \
    +		$(RM) "$(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
     	done
    -	-$(RMDIR) $(DESTDIR)$(INSTALLTOP)/bin
    +	-$(RMDIR) "$(DESTDIR)$(INSTALLTOP)/bin"
     
     uninstall_runtime_libs:
     	@$(ECHO) "*** Uninstalling runtime libraries"
    @@ -942,49 +942,49 @@ uninstall_runtime_libs:
     		if [ "$$s" = "dummy" ]; then continue; fi; \
     		fn=`basename $$s`; \
     		$(ECHO) "$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
    -		$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn; \
    +		$(RM) "$(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
     	done
     	@ : {- output_on() unless windowsdll(); "" -}
     
     
     install_man_docs: build_man_docs
     	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
    -	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(MANDIR)/man1
    -	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(MANDIR)/man3
    -	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(MANDIR)/man5
    -	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(MANDIR)/man7
    +	@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(MANDIR)/man1"
    +	@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(MANDIR)/man3"
    +	@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(MANDIR)/man5"
    +	@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(MANDIR)/man7"
     	@$(ECHO) "*** Installing manpages"
     	@set -e; for x in dummy $(MANDOCS1); do \
     		if [ "$$x" = "dummy" ]; then continue; fi; \
     		fn=`basename $$x`; \
     		$(ECHO) "install $$x -> $(DESTDIR)$(MANDIR)/man1/$${fn}$(MANSUFFIX)"; \
    -		cp $$x $(DESTDIR)$(MANDIR)/man1/$${fn}$(MANSUFFIX); \
    -		chmod 644 $(DESTDIR)$(MANDIR)/man1/$${fn}$(MANSUFFIX); \
    -		$(PERL) $(SRCDIR)/util/write-man-symlinks install $(SRCDIR)/doc/man1 $(BLDDIR)/doc/man1 $${fn}$(MANSUFFIX) $(DESTDIR)$(MANDIR)/man1; \
    +		cp $$x "$(DESTDIR)$(MANDIR)/man1/$${fn}$(MANSUFFIX)"; \
    +		chmod 644 "$(DESTDIR)$(MANDIR)/man1/$${fn}$(MANSUFFIX)"; \
    +		$(PERL) $(SRCDIR)/util/write-man-symlinks install $(SRCDIR)/doc/man1 $(BLDDIR)/doc/man1 $${fn}$(MANSUFFIX) "$(DESTDIR)$(MANDIR)/man1"; \
     	done
     	@set -e; for x in dummy $(MANDOCS3); do \
     		if [ "$$x" = "dummy" ]; then continue; fi; \
     		fn=`basename $$x`; \
     		$(ECHO) "install $$x -> $(DESTDIR)$(MANDIR)/man3/$${fn}$(MANSUFFIX)"; \
    -		cp $$x $(DESTDIR)$(MANDIR)/man3/$${fn}$(MANSUFFIX); \
    -		chmod 644 $(DESTDIR)$(MANDIR)/man3/$${fn}$(MANSUFFIX); \
    -		$(PERL) $(SRCDIR)/util/write-man-symlinks install $(SRCDIR)/doc/man3 $(BLDDIR)/doc/man3 $${fn}$(MANSUFFIX) $(DESTDIR)$(MANDIR)/man3; \
    +		cp $$x "$(DESTDIR)$(MANDIR)/man3/$${fn}$(MANSUFFIX)"; \
    +		chmod 644 "$(DESTDIR)$(MANDIR)/man3/$${fn}$(MANSUFFIX)"; \
    +		$(PERL) $(SRCDIR)/util/write-man-symlinks install $(SRCDIR)/doc/man3 $(BLDDIR)/doc/man3 $${fn}$(MANSUFFIX) "$(DESTDIR)$(MANDIR)/man3"; \
     	done
     	@set -e; for x in dummy $(MANDOCS5); do \
     		if [ "$$x" = "dummy" ]; then continue; fi; \
     		fn=`basename $$x`; \
     		$(ECHO) "install $$x -> $(DESTDIR)$(MANDIR)/man5/$${fn}$(MANSUFFIX)"; \
    -		cp $$x $(DESTDIR)$(MANDIR)/man5/$${fn}$(MANSUFFIX); \
    -		chmod 644 $(DESTDIR)$(MANDIR)/man5/$${fn}$(MANSUFFIX); \
    -		$(PERL) $(SRCDIR)/util/write-man-symlinks install $(SRCDIR)/doc/man5 $(BLDDIR)/doc/man5 $${fn}$(MANSUFFIX) $(DESTDIR)$(MANDIR)/man5; \
    +		cp $$x "$(DESTDIR)$(MANDIR)/man5/$${fn}$(MANSUFFIX)"; \
    +		chmod 644 "$(DESTDIR)$(MANDIR)/man5/$${fn}$(MANSUFFIX)"; \
    +		$(PERL) $(SRCDIR)/util/write-man-symlinks install $(SRCDIR)/doc/man5 $(BLDDIR)/doc/man5 $${fn}$(MANSUFFIX) "$(DESTDIR)$(MANDIR)/man5"; \
     	done
     	@set -e; for x in dummy $(MANDOCS7); do \
     		if [ "$$x" = "dummy" ]; then continue; fi; \
     		fn=`basename $$x`; \
     		$(ECHO) "install $$x -> $(DESTDIR)$(MANDIR)/man7/$${fn}$(MANSUFFIX)"; \
    -		cp $$x $(DESTDIR)$(MANDIR)/man7/$${fn}$(MANSUFFIX); \
    -		chmod 644 $(DESTDIR)$(MANDIR)/man7/$${fn}$(MANSUFFIX); \
    -		$(PERL) $(SRCDIR)/util/write-man-symlinks install $(SRCDIR)/doc/man7 $(BLDDIR)/doc/man7 $${fn}$(MANSUFFIX) $(DESTDIR)$(MANDIR)/man7; \
    +		cp $$x "$(DESTDIR)$(MANDIR)/man7/$${fn}$(MANSUFFIX)"; \
    +		chmod 644 "$(DESTDIR)$(MANDIR)/man7/$${fn}$(MANSUFFIX)"; \
    +		$(PERL) $(SRCDIR)/util/write-man-symlinks install $(SRCDIR)/doc/man7 $(BLDDIR)/doc/man7 $${fn}$(MANSUFFIX) "$(DESTDIR)$(MANDIR)/man7"; \
     	done
     
     uninstall_man_docs: build_man_docs
    @@ -993,65 +993,65 @@ uninstall_man_docs: build_man_docs
     		if [ "$$x" = "dummy" ]; then continue; fi; \
     		fn=`basename $$x`; \
     		$(ECHO) "$(RM) $(DESTDIR)$(MANDIR)/man1/$${fn}$(MANSUFFIX)"; \
    -		$(RM) $(DESTDIR)$(MANDIR)/man1/$${fn}$(MANSUFFIX); \
    -		$(PERL) $(SRCDIR)/util/write-man-symlinks uninstall $(SRCDIR)/doc/man1 $(BLDDIR)/doc/man1 $${fn}$(MANSUFFIX) $(DESTDIR)$(MANDIR)/man1; \
    +		$(RM) "$(DESTDIR)$(MANDIR)/man1/$${fn}$(MANSUFFIX)"; \
    +		$(PERL) $(SRCDIR)/util/write-man-symlinks uninstall $(SRCDIR)/doc/man1 $(BLDDIR)/doc/man1 $${fn}$(MANSUFFIX) "$(DESTDIR)$(MANDIR)/man1"; \
     	done
     	@set -e; for x in dummy $(MANDOCS3); do \
     		if [ "$$x" = "dummy" ]; then continue; fi; \
     		fn=`basename $$x`; \
     		$(ECHO) "$(RM) $(DESTDIR)$(MANDIR)/man3/$${fn}$(MANSUFFIX)"; \
    -		$(RM) $(DESTDIR)$(MANDIR)/man3/$${fn}$(MANSUFFIX); \
    -		$(PERL) $(SRCDIR)/util/write-man-symlinks uninstall $(SRCDIR)/doc/man3 $(BLDDIR)/doc/man3 $${fn}$(MANSUFFIX) $(DESTDIR)$(MANDIR)/man3; \
    +		$(RM) "$(DESTDIR)$(MANDIR)/man3/$${fn}$(MANSUFFIX)"; \
    +		$(PERL) $(SRCDIR)/util/write-man-symlinks uninstall $(SRCDIR)/doc/man3 $(BLDDIR)/doc/man3 $${fn}$(MANSUFFIX) "$(DESTDIR)$(MANDIR)/man3"; \
     	done
     	@set -e; for x in dummy $(MANDOCS5); do \
     		if [ "$$x" = "dummy" ]; then continue; fi; \
     		fn=`basename $$x`; \
     		$(ECHO) "$(RM) $(DESTDIR)$(MANDIR)/man5/$${fn}$(MANSUFFIX)"; \
    -		$(RM) $(DESTDIR)$(MANDIR)/man5/$${fn}$(MANSUFFIX); \
    -		$(PERL) $(SRCDIR)/util/write-man-symlinks uninstall $(SRCDIR)/doc/man5 $(BLDDIR)/doc/man5 $${fn}$(MANSUFFIX) $(DESTDIR)$(MANDIR)/man5; \
    +		$(RM) "$(DESTDIR)$(MANDIR)/man5/$${fn}$(MANSUFFIX)"; \
    +		$(PERL) $(SRCDIR)/util/write-man-symlinks uninstall $(SRCDIR)/doc/man5 $(BLDDIR)/doc/man5 $${fn}$(MANSUFFIX) "$(DESTDIR)$(MANDIR)/man5"; \
     	done
     	@set -e; for x in dummy $(MANDOCS7); do \
     		if [ "$$x" = "dummy" ]; then continue; fi; \
     		fn=`basename $$x`; \
     		$(ECHO) "$(RM) $(DESTDIR)$(MANDIR)/man7/$${fn}$(MANSUFFIX)"; \
    -		$(RM) $(DESTDIR)$(MANDIR)/man7/$${fn}$(MANSUFFIX); \
    -		$(PERL) $(SRCDIR)/util/write-man-symlinks uninstall $(SRCDIR)/doc/man7 $(BLDDIR)/doc/man7 $${fn}$(MANSUFFIX) $(DESTDIR)$(MANDIR)/man7; \
    +		$(RM) "$(DESTDIR)$(MANDIR)/man7/$${fn}$(MANSUFFIX)"; \
    +		$(PERL) $(SRCDIR)/util/write-man-symlinks uninstall $(SRCDIR)/doc/man7 $(BLDDIR)/doc/man7 $${fn}$(MANSUFFIX) "$(DESTDIR)$(MANDIR)/man7"; \
     	done
     
     install_html_docs: install_image_docs build_html_docs
     	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
    -	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(HTMLDIR)/man1
    -	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(HTMLDIR)/man3
    -	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(HTMLDIR)/man5
    -	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(HTMLDIR)/man7
    +	@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(HTMLDIR)/man1"
    +	@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(HTMLDIR)/man3"
    +	@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(HTMLDIR)/man5"
    +	@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(HTMLDIR)/man7"
     	@$(ECHO) "*** Installing HTML manpages"
     	@set -e; for x in dummy $(HTMLDOCS1); do \
     		if [ "$$x" = "dummy" ]; then continue; fi; \
     		fn=`basename $$x`; \
     		$(ECHO) "install $$x -> $(DESTDIR)$(HTMLDIR)/man1/$$fn"; \
    -		cp $$x $(DESTDIR)$(HTMLDIR)/man1/$$fn; \
    -		chmod 644 $(DESTDIR)$(HTMLDIR)/man1/$$fn; \
    +		cp $$x "$(DESTDIR)$(HTMLDIR)/man1/$$fn"; \
    +		chmod 644 "$(DESTDIR)$(HTMLDIR)/man1/$$fn"; \
     	done
     	@set -e; for x in dummy $(HTMLDOCS3); do \
     		if [ "$$x" = "dummy" ]; then continue; fi; \
     		fn=`basename $$x`; \
     		$(ECHO) "install $$x -> $(DESTDIR)$(HTMLDIR)/man3/$$fn"; \
    -		cp $$x $(DESTDIR)$(HTMLDIR)/man3/$$fn; \
    -		chmod 644 $(DESTDIR)$(HTMLDIR)/man3/$$fn; \
    +		cp $$x "$(DESTDIR)$(HTMLDIR)/man3/$$fn"; \
    +		chmod 644 "$(DESTDIR)$(HTMLDIR)/man3/$$fn"; \
     	done
     	@set -e; for x in dummy $(HTMLDOCS5); do \
     		if [ "$$x" = "dummy" ]; then continue; fi; \
     		fn=`basename $$x`; \
     		$(ECHO) "install $$x -> $(DESTDIR)$(HTMLDIR)/man5/$$fn"; \
    -		cp $$x $(DESTDIR)$(HTMLDIR)/man5/$$fn; \
    -		chmod 644 $(DESTDIR)$(HTMLDIR)/man5/$$fn; \
    +		cp $$x "$(DESTDIR)$(HTMLDIR)/man5/$$fn"; \
    +		chmod 644 "$(DESTDIR)$(HTMLDIR)/man5/$$fn"; \
     	done
     	@set -e; for x in dummy $(HTMLDOCS7); do \
     		if [ "$$x" = "dummy" ]; then continue; fi; \
     		fn=`basename $$x`; \
     		$(ECHO) "install $$x -> $(DESTDIR)$(HTMLDIR)/man7/$$fn"; \
    -		cp $$x $(DESTDIR)$(HTMLDIR)/man7/$$fn; \
    -		chmod 644 $(DESTDIR)$(HTMLDIR)/man7/$$fn; \
    +		cp $$x "$(DESTDIR)$(HTMLDIR)/man7/$$fn"; \
    +		chmod 644 "$(DESTDIR)$(HTMLDIR)/man7/$$fn"; \
     	done
     
     uninstall_html_docs: uninstall_image_docs
    @@ -1060,35 +1060,35 @@ uninstall_html_docs: uninstall_image_docs
     		if [ "$$x" = "dummy" ]; then continue; fi; \
     		fn=`basename $$x`; \
     		$(ECHO) "$(RM) $(DESTDIR)$(HTMLDIR)/man1/$$fn"; \
    -		$(RM) $(DESTDIR)$(HTMLDIR)/man1/$$fn; \
    +		$(RM) "$(DESTDIR)$(HTMLDIR)/man1/$$fn"; \
     	done
     	@set -e; for x in dummy $(HTMLDOCS3); do \
     		if [ "$$x" = "dummy" ]; then continue; fi; \
     		fn=`basename $$x`; \
     		$(ECHO) "$(RM) $(DESTDIR)$(HTMLDIR)/man3/$$fn"; \
    -		$(RM) $(DESTDIR)$(HTMLDIR)/man3/$$fn; \
    +		$(RM) "$(DESTDIR)$(HTMLDIR)/man3/$$fn"; \
     	done
     	@set -e; for x in dummy $(HTMLDOCS5); do \
     		if [ "$$x" = "dummy" ]; then continue; fi; \
     		fn=`basename $$x`; \
     		$(ECHO) "$(RM) $(DESTDIR)$(HTMLDIR)/man5/$$fn"; \
    -		$(RM) $(DESTDIR)$(HTMLDIR)/man5/$$fn; \
    +		$(RM) "$(DESTDIR)$(HTMLDIR)/man5/$$fn"; \
     	done
     	@set -e; for x in dummy $(HTMLDOCS7); do \
     		if [ "$$x" = "dummy" ]; then continue; fi; \
     		fn=`basename $$x`; \
     		$(ECHO) "$(RM) $(DESTDIR)$(HTMLDIR)/man7/$$fn"; \
    -		$(RM) $(DESTDIR)$(HTMLDIR)/man7/$$fn; \
    +		$(RM) "$(DESTDIR)$(HTMLDIR)/man7/$$fn"; \
     	done
     
     install_image_docs:
    -	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(HTMLDIR)/man7/img
    +	@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(HTMLDIR)/man7/img"
     	@set -e; for x in dummy $(IMAGEDOCS7); do \
     		if [ "$$x" = "dummy" ]; then continue; fi; \
     		fn=`basename $$x`; \
     		$(ECHO) "install $$x -> $(DESTDIR)$(HTMLDIR)/man7/img/$$fn"; \
    -		cp $(SRCDIR)/$$x $(DESTDIR)$(HTMLDIR)/man7/img/$$fn; \
    -		chmod 644 $(DESTDIR)$(HTMLDIR)/man7/img/$$fn; \
    +		cp $(SRCDIR)/$$x "$(DESTDIR)$(HTMLDIR)/man7/img/$$fn"; \
    +		chmod 644 "$(DESTDIR)$(HTMLDIR)/man7/img/$$fn"; \
     	done
     
     uninstall_image_docs:
    @@ -1096,7 +1096,7 @@ uninstall_image_docs:
     		if [ "$$x" = "dummy" ]; then continue; fi; \
     		fn=`basename $$x`; \
     		$(ECHO) "$(RM) $(DESTDIR)$(HTMLDIR)/man7/img/$$fn"; \
    -		$(RM) $(DESTDIR)$(HTMLDIR)/man7/img/$$fn; \
    +		$(RM) "$(DESTDIR)$(HTMLDIR)/man7/img/$$fn"; \
     	done
     
     # Developer targets (note: these are only available on Unix) #########
    diff --git a/deps/openssl/openssl/INSTALL.md b/deps/openssl/openssl/INSTALL.md
    index fbcebe17e62c9a..87b1faef90f719 100644
    --- a/deps/openssl/openssl/INSTALL.md
    +++ b/deps/openssl/openssl/INSTALL.md
    @@ -2,8 +2,8 @@ Build and Install
     =================
     
     This document describes installation on all supported operating
    -systems (the Unix/Linux family, including macOS), OpenVMS,
    -and Windows).
    +systems: the Unix/Linux family (including macOS), OpenVMS,
    +and Windows.
     
     Table of Contents
     =================
    diff --git a/deps/openssl/openssl/NEWS.md b/deps/openssl/openssl/NEWS.md
    index feed9026976013..8f0d973e057bb8 100644
    --- a/deps/openssl/openssl/NEWS.md
    +++ b/deps/openssl/openssl/NEWS.md
    @@ -18,6 +18,16 @@ OpenSSL Releases
     OpenSSL 3.0
     -----------
     
    +### Major changes between OpenSSL 3.0.11 and OpenSSL 3.0.12 [24 Oct 2023]
    +
    +  * Mitigate incorrect resize handling for symmetric cipher keys and IVs.
    +    ([CVE-2023-5363])
    +
    +### Major changes between OpenSSL 3.0.10 and OpenSSL 3.0.11 [19 Sep 2023]
    +
    +  * Fix POLY1305 MAC implementation corrupting XMM registers on Windows
    +    ([CVE-2023-4807])
    +
     ### Major changes between OpenSSL 3.0.9 and OpenSSL 3.0.10 [1 Aug 2023]
     
       * Fix excessive time spent checking DH q parameter value ([CVE-2023-3817])
    @@ -1448,6 +1458,8 @@ OpenSSL 0.9.x
     
     
     
    +[CVE-2023-5363]: https://www.openssl.org/news/vulnerabilities.html#CVE-2023-5363
    +[CVE-2023-4807]: https://www.openssl.org/news/vulnerabilities.html#CVE-2023-4807
     [CVE-2023-3817]: https://www.openssl.org/news/vulnerabilities.html#CVE-2023-3817
     [CVE-2023-3446]: https://www.openssl.org/news/vulnerabilities.html#CVE-2023-3446
     [CVE-2023-2975]: https://www.openssl.org/news/vulnerabilities.html#CVE-2023-2975
    diff --git a/deps/openssl/openssl/README-OpenSSL.md b/deps/openssl/openssl/README-OpenSSL.md
    index f2f4fd39ad05bb..b848d050132aae 100644
    --- a/deps/openssl/openssl/README-OpenSSL.md
    +++ b/deps/openssl/openssl/README-OpenSSL.md
    @@ -166,7 +166,7 @@ attempting to develop or distribute cryptographic code.
     Copyright
     =========
     
    -Copyright (c) 1998-2022 The OpenSSL Project
    +Copyright (c) 1998-2023 The OpenSSL Project
     
     Copyright (c) 1995-1998 Eric A. Young, Tim J. Hudson
     
    diff --git a/deps/openssl/openssl/README.md b/deps/openssl/openssl/README.md
    index 80090a262c0502..e73b04b378e322 100644
    --- a/deps/openssl/openssl/README.md
    +++ b/deps/openssl/openssl/README.md
    @@ -4,7 +4,7 @@ What This Is
     This is a fork of [OpenSSL](https://www.openssl.org) to enable QUIC. In addition
     to the website, the official source distribution is at
     . The OpenSSL `README` can be found at
    -[README-OpenSSL.md](https://github.com/quictls/openssl/blob/openssl-3.0.10%2Bquic/README-OpenSSL.md)
    +[README-OpenSSL.md](https://github.com/quictls/openssl/blob/openssl-3.0.12%2Bquic/README-OpenSSL.md)
     
     This fork adds APIs that can be used by QUIC implementations for connection
     handshakes. Quoting the IETF Working group
    diff --git a/deps/openssl/openssl/VERSION.dat b/deps/openssl/openssl/VERSION.dat
    index 3388a2ac907c8f..d416c3662e5dd1 100644
    --- a/deps/openssl/openssl/VERSION.dat
    +++ b/deps/openssl/openssl/VERSION.dat
    @@ -1,7 +1,7 @@
     MAJOR=3
     MINOR=0
    -PATCH=10
    +PATCH=12
     PRE_RELEASE_TAG=
     BUILD_METADATA=quic
    -RELEASE_DATE="1 Aug 2023"
    +RELEASE_DATE="24 Oct 2023"
     SHLIB_VERSION=81.3
    diff --git a/deps/openssl/openssl/apps/cmp.c b/deps/openssl/openssl/apps/cmp.c
    index a317fdb0bf3ed4..c479b15496607f 100644
    --- a/deps/openssl/openssl/apps/cmp.c
    +++ b/deps/openssl/openssl/apps/cmp.c
    @@ -2512,7 +2512,7 @@ static int get_opts(int argc, char **argv)
                 }
                 break;
             case OPT_CSR:
    -            opt_csr = opt_arg();
    +            opt_csr = opt_str();
                 break;
             case OPT_OUT_TRUSTED:
                 opt_out_trusted = opt_str();
    diff --git a/deps/openssl/openssl/apps/dgst.c b/deps/openssl/openssl/apps/dgst.c
    index e12389197de4a6..3f02af0d5738ab 100644
    --- a/deps/openssl/openssl/apps/dgst.c
    +++ b/deps/openssl/openssl/apps/dgst.c
    @@ -320,6 +320,8 @@ int dgst_main(int argc, char **argv)
             sigkey = app_keygen(mac_ctx, mac_name, 0, 0 /* not verbose */);
             /* Verbose output would make external-tests gost-engine fail */
             EVP_PKEY_CTX_free(mac_ctx);
    +        if (sigkey == NULL)
    +            goto end;
         }
     
         if (hmac_key != NULL) {
    diff --git a/deps/openssl/openssl/apps/dhparam.c b/deps/openssl/openssl/apps/dhparam.c
    index 43906cea56497b..2a54dca9d8b552 100644
    --- a/deps/openssl/openssl/apps/dhparam.c
    +++ b/deps/openssl/openssl/apps/dhparam.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -222,6 +222,8 @@ int dhparam_main(int argc, char **argv)
             }
     
             tmppkey = app_paramgen(ctx, alg);
    +        if (tmppkey == NULL)
    +            goto end;
             EVP_PKEY_CTX_free(ctx);
             ctx = NULL;
             if (dsaparam) {
    diff --git a/deps/openssl/openssl/apps/dsaparam.c b/deps/openssl/openssl/apps/dsaparam.c
    index b5555282be6e18..ca91beb5b893bb 100644
    --- a/deps/openssl/openssl/apps/dsaparam.c
    +++ b/deps/openssl/openssl/apps/dsaparam.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -218,6 +218,8 @@ int dsaparam_main(int argc, char **argv)
                 goto end;
             }
             pkey = app_keygen(ctx, "DSA", numbits, verbose);
    +        if (pkey == NULL)
    +            goto end;
             assert(private);
             if (outformat == FORMAT_ASN1)
                 i = i2d_PrivateKey_bio(out, pkey);
    diff --git a/deps/openssl/openssl/apps/enc.c b/deps/openssl/openssl/apps/enc.c
    index b3bf4cc2592d01..c275046cf57a64 100644
    --- a/deps/openssl/openssl/apps/enc.c
    +++ b/deps/openssl/openssl/apps/enc.c
    @@ -624,7 +624,10 @@ int enc_main(int argc, char **argv)
             }
         }
         if (!BIO_flush(wbio)) {
    -        BIO_printf(bio_err, "bad decrypt\n");
    +        if (enc)
    +            BIO_printf(bio_err, "bad encrypt\n");
    +        else
    +            BIO_printf(bio_err, "bad decrypt\n");
             goto end;
         }
     
    diff --git a/deps/openssl/openssl/apps/gendsa.c b/deps/openssl/openssl/apps/gendsa.c
    index 27feb793fed23c..8aefca65566c59 100644
    --- a/deps/openssl/openssl/apps/gendsa.c
    +++ b/deps/openssl/openssl/apps/gendsa.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -146,6 +146,8 @@ int gendsa_main(int argc, char **argv)
             goto end;
         }
         pkey = app_keygen(ctx, "DSA", nbits, verbose);
    +    if (pkey == NULL)
    +        goto end;
     
         assert(private);
         if (!PEM_write_bio_PrivateKey(out, pkey, enc, NULL, 0, NULL, passout)) {
    diff --git a/deps/openssl/openssl/apps/genpkey.c b/deps/openssl/openssl/apps/genpkey.c
    index d00754eeaca09f..705e5c76b47dc0 100644
    --- a/deps/openssl/openssl/apps/genpkey.c
    +++ b/deps/openssl/openssl/apps/genpkey.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2006-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2006-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -183,6 +183,8 @@ int genpkey_main(int argc, char **argv)
     
         pkey = do_param ? app_paramgen(ctx, algname)
                         : app_keygen(ctx, algname, 0, 0 /* not verbose */);
    +    if (pkey == NULL)
    +        goto end;
     
         if (do_param) {
             rv = PEM_write_bio_Parameters(out, pkey);
    diff --git a/deps/openssl/openssl/apps/genrsa.c b/deps/openssl/openssl/apps/genrsa.c
    index 4436b7fa1745a9..6a683517a15fc7 100644
    --- a/deps/openssl/openssl/apps/genrsa.c
    +++ b/deps/openssl/openssl/apps/genrsa.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -203,6 +203,8 @@ int genrsa_main(int argc, char **argv)
             goto end;
         }
         pkey = app_keygen(ctx, "RSA", num, verbose);
    +    if (pkey == NULL)
    +        goto end;
     
         if (verbose) {
             BIGNUM *e = NULL;
    diff --git a/deps/openssl/openssl/apps/lib/apps.c b/deps/openssl/openssl/apps/lib/apps.c
    index 4baeb352fedfb3..a632b0cff2bf68 100644
    --- a/deps/openssl/openssl/apps/lib/apps.c
    +++ b/deps/openssl/openssl/apps/lib/apps.c
    @@ -944,7 +944,7 @@ int load_key_certs_crls_suppress(const char *uri, int format, int maybe_stdin,
             BIO *bio;
     
             if (!maybe_stdin) {
    -            BIO_printf(bio_err, "No filename or uri specified for loading");
    +            BIO_printf(bio_err, "No filename or uri specified for loading\n");
                 goto end;
             }
             uri = "";
    @@ -964,8 +964,10 @@ int load_key_certs_crls_suppress(const char *uri, int format, int maybe_stdin,
             BIO_printf(bio_err, "Could not open file or uri for loading");
             goto end;
         }
    -    if (expect > 0 && !OSSL_STORE_expect(ctx, expect))
    +    if (expect > 0 && !OSSL_STORE_expect(ctx, expect)) {
    +        BIO_printf(bio_err, "Internal error trying to load");
             goto end;
    +    }
     
         failed = NULL;
         while (cnt_expectations > 0 && !OSSL_STORE_eof(ctx)) {
    @@ -1948,16 +1950,17 @@ X509_NAME *parse_name(const char *cp, int chtype, int canmulti,
             nid = OBJ_txt2nid(typestr);
             if (nid == NID_undef) {
                 BIO_printf(bio_err,
    -                       "%s: Skipping unknown %s name attribute \"%s\"\n",
    +                       "%s warning: Skipping unknown %s name attribute \"%s\"\n",
                            opt_getprog(), desc, typestr);
                 if (ismulti)
                     BIO_printf(bio_err,
    -                           "Hint: a '+' in a value string needs be escaped using '\\' else a new member of a multi-valued RDN is expected\n");
    +                           "%s hint: a '+' in a value string needs be escaped using '\\' else a new member of a multi-valued RDN is expected\n",
    +                           opt_getprog());
                 continue;
             }
             if (*valstr == '\0') {
                 BIO_printf(bio_err,
    -                       "%s: No value provided for %s name attribute \"%s\", skipped\n",
    +                       "%s warning: No value provided for %s name attribute \"%s\", skipped\n",
                            opt_getprog(), desc, typestr);
                 continue;
             }
    @@ -3360,8 +3363,8 @@ EVP_PKEY *app_keygen(EVP_PKEY_CTX *ctx, const char *alg, int bits, int verbose)
             BIO_printf(bio_err, "Warning: generating random key material may take a long time\n"
                        "if the system has a poor entropy source\n");
         if (EVP_PKEY_keygen(ctx, &res) <= 0)
    -        app_bail_out("%s: Error generating %s key\n", opt_getprog(),
    -                     alg != NULL ? alg : "asymmetric");
    +        BIO_printf(bio_err, "%s: Error generating %s key\n", opt_getprog(),
    +                   alg != NULL ? alg : "asymmetric");
         return res;
     }
     
    @@ -3373,8 +3376,8 @@ EVP_PKEY *app_paramgen(EVP_PKEY_CTX *ctx, const char *alg)
             BIO_printf(bio_err, "Warning: generating random key parameters may take a long time\n"
                        "if the system has a poor entropy source\n");
         if (EVP_PKEY_paramgen(ctx, &res) <= 0)
    -        app_bail_out("%s: Generating %s key parameters failed\n",
    -                     opt_getprog(), alg != NULL ? alg : "asymmetric");
    +        BIO_printf(bio_err, "%s: Generating %s key parameters failed\n",
    +                   opt_getprog(), alg != NULL ? alg : "asymmetric");
         return res;
     }
     
    diff --git a/deps/openssl/openssl/apps/req.c b/deps/openssl/openssl/apps/req.c
    index 73b320a7098cf0..41191803aef417 100644
    --- a/deps/openssl/openssl/apps/req.c
    +++ b/deps/openssl/openssl/apps/req.c
    @@ -685,6 +685,8 @@ int req_main(int argc, char **argv)
             EVP_PKEY_CTX_set_app_data(genctx, bio_err);
     
             pkey = app_keygen(genctx, keyalgstr, newkey_len, verbose);
    +        if (pkey == NULL)
    +            goto end;
     
             EVP_PKEY_CTX_free(genctx);
             genctx = NULL;
    @@ -990,10 +992,10 @@ int req_main(int argc, char **argv)
             else
                 tpubkey = X509_REQ_get0_pubkey(req);
             if (tpubkey == NULL) {
    -            fprintf(stdout, "Modulus is unavailable\n");
    +            BIO_puts(bio_err, "Modulus is unavailable\n");
                 goto end;
             }
    -        fprintf(stdout, "Modulus=");
    +        BIO_puts(out, "Modulus=");
             if (EVP_PKEY_is_a(tpubkey, "RSA") || EVP_PKEY_is_a(tpubkey, "RSA-PSS")) {
                 BIGNUM *n = NULL;
     
    @@ -1002,9 +1004,9 @@ int req_main(int argc, char **argv)
                 BN_print(out, n);
                 BN_free(n);
             } else {
    -            fprintf(stdout, "Wrong Algorithm type");
    +            BIO_puts(out, "Wrong Algorithm type");
             }
    -        fprintf(stdout, "\n");
    +        BIO_puts(out, "\n");
         }
     
         if (!noout && !gen_x509) {
    diff --git a/deps/openssl/openssl/apps/s_server.c b/deps/openssl/openssl/apps/s_server.c
    index a203d6a091cac3..c8ccdfd03ca196 100644
    --- a/deps/openssl/openssl/apps/s_server.c
    +++ b/deps/openssl/openssl/apps/s_server.c
    @@ -789,7 +789,7 @@ const OPTIONS s_server_options[] = {
          "second server certificate chain file in PEM format"},
         {"dkey", OPT_DKEY, '<',
          "Second private key file to use (usually for DSA)"},
    -    {"dkeyform", OPT_DKEYFORM, 'F',
    +    {"dkeyform", OPT_DKEYFORM, 'f',
          "Second key file format (ENGINE, other values ignored)"},
         {"dpass", OPT_DPASS, 's',
          "Second private key and cert file pass phrase source"},
    diff --git a/deps/openssl/openssl/apps/speed.c b/deps/openssl/openssl/apps/speed.c
    index f30435704d19ce..1113d775b8ab98 100644
    --- a/deps/openssl/openssl/apps/speed.c
    +++ b/deps/openssl/openssl/apps/speed.c
    @@ -3700,7 +3700,8 @@ static void multiblock_speed(const EVP_CIPHER *evp_cipher, int lengths_single,
                 } else {
                     int pad;
     
    -                RAND_bytes(out, 16);
    +                if (RAND_bytes(inp, 16) <= 0)
    +                    app_bail_out("error setting random bytes\n");
                     len += 16;
                     aad[11] = (unsigned char)(len >> 8);
                     aad[12] = (unsigned char)(len);
    diff --git a/deps/openssl/openssl/appveyor.yml b/deps/openssl/openssl/appveyor.yml
    deleted file mode 100644
    index 9bb6f04e0a44cb..00000000000000
    --- a/deps/openssl/openssl/appveyor.yml
    +++ /dev/null
    @@ -1,82 +0,0 @@
    -image:
    -    - Visual Studio 2017
    -
    -platform:
    -    - x64
    -    - x86
    -
    -environment:
    -    fast_finish: true
    -    matrix:
    -        - VSVER: 15
    -
    -configuration:
    -    - shared
    -    - minimal
    -
    -for:
    -    -
    -        branches:
    -            only:
    -                - master
    -        configuration:
    -            - shared
    -            - plain
    -            - minimal
    -
    -before_build:
    -    - ps: >-
    -        Install-Module VSSetup -Scope CurrentUser
    -    - ps: >-
    -        Get-VSSetupInstance -All
    -    - ps: >-
    -        If ($env:Platform -Match "x86") {
    -            $env:VCVARS_PLATFORM="x86"
    -            $env:TARGET="VC-WIN32 no-asm --strict-warnings"
    -        } Else {
    -            $env:VCVARS_PLATFORM="amd64"
    -            $env:TARGET="VC-WIN64A-masm"
    -        }
    -    - ps: >-
    -        If ($env:Configuration -Match "shared") {
    -            $env:CONFIG_OPTS="enable-fips"
    -        } ElseIf ($env:Configuration -Match "minimal") {
    -            $env:CONFIG_OPTS="no-bulk no-asm -DOPENSSL_SMALL_FOOTPRINT"
    -        } Else {
    -            $env:CONFIG_OPTS="no-fips no-shared"
    -        }
    -    - call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" %VCVARS_PLATFORM%
    -    - mkdir _build
    -    - cd _build
    -    - perl ..\Configure %TARGET% no-makedepend %CONFIG_OPTS%
    -    - perl configdata.pm --dump
    -    - cd ..
    -    - ps: >-
    -        If ($env:BUILDONLY -or $env:MAKEVERBOSE) {
    -            $env:NMAKE="nmake"
    -        } Else {
    -            $env:NMAKE="nmake /S"
    -        }
    -    - ps: >-
    -        gci env:* | sort-object name
    -
    -build_script:
    -    - cd _build
    -    - "%NMAKE% build_all_generated"
    -    - "%NMAKE% PERL=no-perl"
    -    - cd ..
    -
    -test_script:
    -    - cd _build
    -    - ps: >-
    -        if ($env:Configuration -Match "plain") {
    -            cmd /c "%NMAKE% test VERBOSE_FAILURE=yes 2>&1"
    -        } Else {
    -            cmd /c "%NMAKE% test VERBOSE_FAILURE=yes TESTS=-test_fuzz 2>&1"
    -        }
    -    - ps: >-
    -        if ($env:Configuration -Match "shared") {
    -            mkdir ..\_install
    -            cmd /c "%NMAKE% install DESTDIR=..\_install 2>&1"
    -        }
    -    - cd ..
    diff --git a/deps/openssl/openssl/crypto/aes/asm/aesv8-armx.pl b/deps/openssl/openssl/crypto/aes/asm/aesv8-armx.pl
    index 544dc7e8effe66..d0e0be6187bd2e 100755
    --- a/deps/openssl/openssl/crypto/aes/asm/aesv8-armx.pl
    +++ b/deps/openssl/openssl/crypto/aes/asm/aesv8-armx.pl
    @@ -3661,6 +3661,9 @@ ()
     	s/\.[ui]?64//o and s/\.16b/\.2d/go;
     	s/\.[42]([sd])\[([0-3])\]/\.$1\[$2\]/o;
     
    +	# Switch preprocessor checks to aarch64 versions.
    +	s/__ARME([BL])__/__AARCH64E$1__/go;
    +
     	print $_,"\n";
         }
     } else {				######## 32-bit code
    diff --git a/deps/openssl/openssl/crypto/arm_arch.h b/deps/openssl/openssl/crypto/arm_arch.h
    index 45d7e155647540..ec4a087fede2fc 100644
    --- a/deps/openssl/openssl/crypto/arm_arch.h
    +++ b/deps/openssl/openssl/crypto/arm_arch.h
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2011-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2011-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -21,11 +21,6 @@
     #  elif defined(__GNUC__)
     #   if   defined(__aarch64__)
     #    define __ARM_ARCH__ 8
    -#    if __BYTE_ORDER__==__ORDER_BIG_ENDIAN__
    -#     define __ARMEB__
    -#    else
    -#     define __ARMEL__
    -#    endif
       /*
        * Why doesn't gcc define __ARM_ARCH__? Instead it defines
        * bunch of below macros. See all_architectures[] table in
    diff --git a/deps/openssl/openssl/crypto/asn1/a_strnid.c b/deps/openssl/openssl/crypto/asn1/a_strnid.c
    index 9e54db929282c5..d052935661d362 100644
    --- a/deps/openssl/openssl/crypto/asn1/a_strnid.c
    +++ b/deps/openssl/openssl/crypto/asn1/a_strnid.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 1999-2020 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1999-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -129,8 +129,10 @@ ASN1_STRING_TABLE *ASN1_STRING_TABLE_get(int nid)
         int idx;
         ASN1_STRING_TABLE fnd;
     
    +#ifndef OPENSSL_NO_AUTOLOAD_CONFIG
         /* "stable" can be impacted by config, so load the config file first */
         OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CONFIG, NULL);
    +#endif
     
         fnd.nid = nid;
         if (stable) {
    diff --git a/deps/openssl/openssl/crypto/asn1/asn1_gen.c b/deps/openssl/openssl/crypto/asn1/asn1_gen.c
    index 64620a4f28a7f6..402ab34e6a46f7 100644
    --- a/deps/openssl/openssl/crypto/asn1/asn1_gen.c
    +++ b/deps/openssl/openssl/crypto/asn1/asn1_gen.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2002-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2002-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -698,9 +698,12 @@ static ASN1_TYPE *asn1_str2type(const char *str, int format, int utype)
                 atmp->value.asn1_string->data = rdata;
                 atmp->value.asn1_string->length = rdlen;
                 atmp->value.asn1_string->type = utype;
    -        } else if (format == ASN1_GEN_FORMAT_ASCII)
    -            ASN1_STRING_set(atmp->value.asn1_string, str, -1);
    -        else if ((format == ASN1_GEN_FORMAT_BITLIST)
    +        } else if (format == ASN1_GEN_FORMAT_ASCII) {
    +            if (!ASN1_STRING_set(atmp->value.asn1_string, str, -1)) {
    +                ERR_raise(ERR_LIB_ASN1, ERR_R_MALLOC_FAILURE);
    +                goto bad_str;
    +            }
    +        } else if ((format == ASN1_GEN_FORMAT_BITLIST)
                      && (utype == V_ASN1_BIT_STRING)) {
                 if (!CONF_parse_list
                     (str, ',', 1, bitstr_cb, atmp->value.bit_string)) {
    diff --git a/deps/openssl/openssl/crypto/bn/bn_gcd.c b/deps/openssl/openssl/crypto/bn/bn_gcd.c
    index 59d024f674ebd5..cd0b0151ec7ed6 100644
    --- a/deps/openssl/openssl/crypto/bn/bn_gcd.c
    +++ b/deps/openssl/openssl/crypto/bn/bn_gcd.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -611,9 +611,9 @@ int BN_gcd(BIGNUM *r, const BIGNUM *in_a, const BIGNUM *in_b, BN_CTX *ctx)
     
         for (i = 0; i < m; i++) {
             /* conditionally flip signs if delta is positive and g is odd */
    -        cond = (-delta >> (8 * sizeof(delta) - 1)) & g->d[0] & 1
    +        cond = ((unsigned int)-delta >> (8 * sizeof(delta) - 1)) & g->d[0] & 1
                 /* make sure g->top > 0 (i.e. if top == 0 then g == 0 always) */
    -            & (~((g->top - 1) >> (sizeof(g->top) * 8 - 1)));
    +            & (~((unsigned int)(g->top - 1) >> (sizeof(g->top) * 8 - 1)));
             delta = (-cond & -delta) | ((cond - 1) & delta);
             r->neg ^= cond;
             /* swap */
    @@ -625,7 +625,7 @@ int BN_gcd(BIGNUM *r, const BIGNUM *in_a, const BIGNUM *in_b, BN_CTX *ctx)
                 goto err;
             BN_consttime_swap(g->d[0] & 1 /* g is odd */
                     /* make sure g->top > 0 (i.e. if top == 0 then g == 0 always) */
    -                & (~((g->top - 1) >> (sizeof(g->top) * 8 - 1))),
    +                & (~((unsigned int)(g->top - 1) >> (sizeof(g->top) * 8 - 1))),
                     g, temp, top);
             if (!BN_rshift1(g, g))
                 goto err;
    diff --git a/deps/openssl/openssl/crypto/build.info b/deps/openssl/openssl/crypto/build.info
    index b90390ae864c40..c04db5591120df 100644
    --- a/deps/openssl/openssl/crypto/build.info
    +++ b/deps/openssl/openssl/crypto/build.info
    @@ -97,8 +97,6 @@ $UTIL_COMMON=\
             context.c sparse_array.c asn1_dsa.c packet.c param_build.c \
             param_build_set.c der_writer.c threads_lib.c params_dup.c
     
    -SHARED_SOURCE[../libssl]=sparse_array.c
    -
     SOURCE[../libcrypto]=$UTIL_COMMON \
             mem.c mem_sec.c \
             cversion.c info.c cpt_err.c ebcdic.c uid.c o_time.c o_dir.c \
    diff --git a/deps/openssl/openssl/crypto/chacha/asm/chacha-ia64.pl b/deps/openssl/openssl/crypto/chacha/asm/chacha-ia64.pl
    index b13d972855754d..78201649d55029 100644
    --- a/deps/openssl/openssl/crypto/chacha/asm/chacha-ia64.pl
    +++ b/deps/openssl/openssl/crypto/chacha/asm/chacha-ia64.pl
    @@ -46,6 +46,8 @@
     	ADDP		@k[11]=4,$key
     	.save		ar.lc,r3
     	mov		r3=ar.lc		}
    +{ .mmi;	ADDP		$out=0,$out
    +	ADDP		$inp=0,$inp		}
     { .mmi;	ADDP		$key=0,$key
     	ADDP		$counter=0,$counter
     	.save		pr,r14
    diff --git a/deps/openssl/openssl/crypto/cmp/cmp_asn.c b/deps/openssl/openssl/crypto/cmp/cmp_asn.c
    index 0ca107554c96dd..a8de73ad979b67 100644
    --- a/deps/openssl/openssl/crypto/cmp/cmp_asn.c
    +++ b/deps/openssl/openssl/crypto/cmp/cmp_asn.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2007-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2007-2023 The OpenSSL Project Authors. All Rights Reserved.
      * Copyright Nokia 2007-2019
      * Copyright Siemens AG 2015-2019
      *
    @@ -188,22 +188,22 @@ int OSSL_CMP_ITAV_push0_stack_item(STACK_OF(OSSL_CMP_ITAV) **itav_sk_p,
         return 0;
     }
     
    -/* get ASN.1 encoded integer, return -1 on error */
    +/* get ASN.1 encoded integer, return -2 on error; -1 is valid for certReqId */
     int ossl_cmp_asn1_get_int(const ASN1_INTEGER *a)
     {
         int64_t res;
     
         if (!ASN1_INTEGER_get_int64(&res, a)) {
             ERR_raise(ERR_LIB_CMP, ASN1_R_INVALID_NUMBER);
    -        return -1;
    +        return -2;
         }
         if (res < INT_MIN) {
             ERR_raise(ERR_LIB_CMP, ASN1_R_TOO_SMALL);
    -        return -1;
    +        return -2;
         }
         if (res > INT_MAX) {
             ERR_raise(ERR_LIB_CMP, ASN1_R_TOO_LARGE);
    -        return -1;
    +        return -2;
         }
         return (int)res;
     }
    diff --git a/deps/openssl/openssl/crypto/cmp/cmp_client.c b/deps/openssl/openssl/crypto/cmp/cmp_client.c
    index dc41f4c3b7d9e2..df334cc0019822 100644
    --- a/deps/openssl/openssl/crypto/cmp/cmp_client.c
    +++ b/deps/openssl/openssl/crypto/cmp/cmp_client.c
    @@ -584,7 +584,7 @@ static int cert_response(OSSL_CMP_CTX *ctx, int sleep, int rid,
             return 0;
         if (rid == OSSL_CMP_CERTREQID_NONE) { /* used for OSSL_CMP_PKIBODY_P10CR */
             rid = ossl_cmp_asn1_get_int(crep->certReqId);
    -        if (rid != OSSL_CMP_CERTREQID_NONE) {
    +        if (rid < OSSL_CMP_CERTREQID_NONE) {
                 ERR_raise(ERR_LIB_CMP, CMP_R_BAD_REQUEST_ID);
                 return 0;
             }
    diff --git a/deps/openssl/openssl/crypto/cmp/cmp_status.c b/deps/openssl/openssl/crypto/cmp/cmp_status.c
    index bfe6cd9906b82a..68144aa4fed878 100644
    --- a/deps/openssl/openssl/crypto/cmp/cmp_status.c
    +++ b/deps/openssl/openssl/crypto/cmp/cmp_status.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2007-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2007-2023 The OpenSSL Project Authors. All Rights Reserved.
      * Copyright Nokia 2007-2019
      * Copyright Siemens AG 2015-2019
      *
    @@ -30,9 +30,12 @@
     
     int ossl_cmp_pkisi_get_status(const OSSL_CMP_PKISI *si)
     {
    +    int res ;
    +
         if (!ossl_assert(si != NULL && si->status != NULL))
             return -1;
    -    return ossl_cmp_asn1_get_int(si->status);
    +    res = ossl_cmp_asn1_get_int(si->status);
    +    return res == -2 ? -1 : res;
     }
     
     const char *ossl_cmp_PKIStatus_to_string(int status)
    diff --git a/deps/openssl/openssl/crypto/cms/cms_enc.c b/deps/openssl/openssl/crypto/cms/cms_enc.c
    index f7007c12319e66..ae88df33a7f0bf 100644
    --- a/deps/openssl/openssl/crypto/cms/cms_enc.c
    +++ b/deps/openssl/openssl/crypto/cms/cms_enc.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2008-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2008-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -15,6 +15,7 @@
     #include 
     #include 
     #include "crypto/evp.h"
    +#include "crypto/asn1.h"
     #include "cms_local.h"
     
     /* CMS EncryptedData Utilities */
    @@ -81,7 +82,7 @@ BIO *ossl_cms_EncryptedContent_init_bio(CMS_EncryptedContentInfo *ec,
     
         if (enc) {
             calg->algorithm = OBJ_nid2obj(EVP_CIPHER_CTX_get_type(ctx));
    -        if (calg->algorithm == NULL) {
    +        if (calg->algorithm == NULL || calg->algorithm->nid == NID_undef) {
                 ERR_raise(ERR_LIB_CMS, CMS_R_UNSUPPORTED_CONTENT_ENCRYPTION_ALGORITHM);
                 goto err;
             }
    diff --git a/deps/openssl/openssl/crypto/cms/cms_env.c b/deps/openssl/openssl/crypto/cms/cms_env.c
    index bd1f3e7345d400..99cf1dcb396ca5 100644
    --- a/deps/openssl/openssl/crypto/cms/cms_env.c
    +++ b/deps/openssl/openssl/crypto/cms/cms_env.c
    @@ -26,7 +26,7 @@ static void cms_env_set_version(CMS_EnvelopedData *env);
     #define CMS_ENVELOPED_STANDARD 1
     #define CMS_ENVELOPED_AUTH     2
     
    -static int cms_get_enveloped_type(const CMS_ContentInfo *cms)
    +static int cms_get_enveloped_type_simple(const CMS_ContentInfo *cms)
     {
         int nid = OBJ_obj2nid(cms->contentType);
     
    @@ -38,11 +38,28 @@ static int cms_get_enveloped_type(const CMS_ContentInfo *cms)
             return CMS_ENVELOPED_AUTH;
     
         default:
    -        ERR_raise(ERR_LIB_CMS, CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA);
             return 0;
         }
     }
     
    +static int cms_get_enveloped_type(const CMS_ContentInfo *cms)
    +{
    +    int ret = cms_get_enveloped_type_simple(cms);
    +
    +    if (ret == 0)
    +        ERR_raise(ERR_LIB_CMS, CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA);
    +    return ret;
    +}
    +
    +void ossl_cms_env_enc_content_free(const CMS_ContentInfo *cinf)
    +{
    +    if (cms_get_enveloped_type_simple(cinf) != 0) {
    +        CMS_EncryptedContentInfo *ec = ossl_cms_get0_env_enc_content(cinf);
    +        if (ec != NULL)
    +            OPENSSL_clear_free(ec->key, ec->keylen);
    +    }
    +}
    +
     CMS_EnvelopedData *ossl_cms_get0_enveloped(CMS_ContentInfo *cms)
     {
         if (OBJ_obj2nid(cms->contentType) != NID_pkcs7_enveloped) {
    diff --git a/deps/openssl/openssl/crypto/cms/cms_err.c b/deps/openssl/openssl/crypto/cms/cms_err.c
    index dcbea201c8e5f4..4bd6a0dc1bf101 100644
    --- a/deps/openssl/openssl/crypto/cms/cms_err.c
    +++ b/deps/openssl/openssl/crypto/cms/cms_err.c
    @@ -1,6 +1,6 @@
     /*
      * Generated by util/mkerr.pl DO NOT EDIT
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -154,6 +154,8 @@ static const ERR_STRING_DATA CMS_str_reasons[] = {
         "unsupported recipientinfo type"},
         {ERR_PACK(ERR_LIB_CMS, 0, CMS_R_UNSUPPORTED_RECIPIENT_TYPE),
         "unsupported recipient type"},
    +    {ERR_PACK(ERR_LIB_CMS, 0, CMS_R_UNSUPPORTED_SIGNATURE_ALGORITHM),
    +    "unsupported signature algorithm"},
         {ERR_PACK(ERR_LIB_CMS, 0, CMS_R_UNSUPPORTED_TYPE), "unsupported type"},
         {ERR_PACK(ERR_LIB_CMS, 0, CMS_R_UNWRAP_ERROR), "unwrap error"},
         {ERR_PACK(ERR_LIB_CMS, 0, CMS_R_UNWRAP_FAILURE), "unwrap failure"},
    diff --git a/deps/openssl/openssl/crypto/cms/cms_lib.c b/deps/openssl/openssl/crypto/cms/cms_lib.c
    index 1d2c5bc42288a0..8b135e95aacc81 100644
    --- a/deps/openssl/openssl/crypto/cms/cms_lib.c
    +++ b/deps/openssl/openssl/crypto/cms/cms_lib.c
    @@ -76,10 +76,7 @@ CMS_ContentInfo *CMS_ContentInfo_new(void)
     void CMS_ContentInfo_free(CMS_ContentInfo *cms)
     {
         if (cms != NULL) {
    -        CMS_EncryptedContentInfo *ec = ossl_cms_get0_env_enc_content(cms);
    -
    -        if (ec != NULL)
    -            OPENSSL_clear_free(ec->key, ec->keylen);
    +        ossl_cms_env_enc_content_free(cms);
             OPENSSL_free(cms->ctx.propq);
             ASN1_item_free((ASN1_VALUE *)cms, ASN1_ITEM_rptr(CMS_ContentInfo));
         }
    diff --git a/deps/openssl/openssl/crypto/cms/cms_local.h b/deps/openssl/openssl/crypto/cms/cms_local.h
    index 15b4a29ce03dce..253f6819e43542 100644
    --- a/deps/openssl/openssl/crypto/cms/cms_local.h
    +++ b/deps/openssl/openssl/crypto/cms/cms_local.h
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2008-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2008-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -444,6 +444,7 @@ BIO *ossl_cms_EnvelopedData_init_bio(CMS_ContentInfo *cms);
     int ossl_cms_EnvelopedData_final(CMS_ContentInfo *cms, BIO *chain);
     BIO *ossl_cms_AuthEnvelopedData_init_bio(CMS_ContentInfo *cms);
     int ossl_cms_AuthEnvelopedData_final(CMS_ContentInfo *cms, BIO *cmsbio);
    +void ossl_cms_env_enc_content_free(const CMS_ContentInfo *cinf);
     CMS_EnvelopedData *ossl_cms_get0_enveloped(CMS_ContentInfo *cms);
     CMS_AuthEnvelopedData *ossl_cms_get0_auth_enveloped(CMS_ContentInfo *cms);
     CMS_EncryptedContentInfo *ossl_cms_get0_env_enc_content(const CMS_ContentInfo *cms);
    diff --git a/deps/openssl/openssl/crypto/cms/cms_sd.c b/deps/openssl/openssl/crypto/cms/cms_sd.c
    index 34c021bba64af7..2093657a2a4a69 100644
    --- a/deps/openssl/openssl/crypto/cms/cms_sd.c
    +++ b/deps/openssl/openssl/crypto/cms/cms_sd.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2008-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2008-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -233,9 +233,9 @@ static int cms_sd_asn1_ctrl(CMS_SignerInfo *si, int cmd)
         int i;
     
         if (EVP_PKEY_is_a(pkey, "DSA") || EVP_PKEY_is_a(pkey, "EC"))
    -        return ossl_cms_ecdsa_dsa_sign(si, cmd);
    +        return ossl_cms_ecdsa_dsa_sign(si, cmd) > 0;
         else if (EVP_PKEY_is_a(pkey, "RSA") || EVP_PKEY_is_a(pkey, "RSA-PSS"))
    -        return ossl_cms_rsa_sign(si, cmd);
    +        return ossl_cms_rsa_sign(si, cmd) > 0;
     
         /* Something else? We'll give engines etc a chance to handle this */
         if (pkey->ameth == NULL || pkey->ameth->pkey_ctrl == NULL)
    @@ -354,11 +354,16 @@ CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms,
     
         if (md == NULL) {
             int def_nid;
    -        if (EVP_PKEY_get_default_digest_nid(pk, &def_nid) <= 0)
    +
    +        if (EVP_PKEY_get_default_digest_nid(pk, &def_nid) <= 0) {
    +            ERR_raise_data(ERR_LIB_CMS, CMS_R_NO_DEFAULT_DIGEST,
    +                           "pkey nid=%d", EVP_PKEY_get_id(pk));
                 goto err;
    +        }
             md = EVP_get_digestbynid(def_nid);
             if (md == NULL) {
    -            ERR_raise(ERR_LIB_CMS, CMS_R_NO_DEFAULT_DIGEST);
    +            ERR_raise_data(ERR_LIB_CMS, CMS_R_NO_DEFAULT_DIGEST,
    +                           "default md nid=%d", def_nid);
                 goto err;
             }
         }
    @@ -398,8 +403,11 @@ CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms,
             }
         }
     
    -    if (!(flags & CMS_KEY_PARAM) && !cms_sd_asn1_ctrl(si, 0))
    +    if (!(flags & CMS_KEY_PARAM) && !cms_sd_asn1_ctrl(si, 0)) {
    +        ERR_raise_data(ERR_LIB_CMS, CMS_R_UNSUPPORTED_SIGNATURE_ALGORITHM,
    +                       "pkey nid=%d", EVP_PKEY_get_id(pk));
             goto err;
    +    }
         if (!(flags & CMS_NOATTR)) {
             /*
              * Initialize signed attributes structure so other attributes
    diff --git a/deps/openssl/openssl/crypto/conf/conf_sap.c b/deps/openssl/openssl/crypto/conf/conf_sap.c
    index 513f8bfc1fb94c..3019bcf31af81a 100644
    --- a/deps/openssl/openssl/crypto/conf/conf_sap.c
    +++ b/deps/openssl/openssl/crypto/conf/conf_sap.c
    @@ -65,7 +65,8 @@ int ossl_config_int(const OPENSSL_INIT_SETTINGS *settings)
     #endif
     
     #ifndef OPENSSL_SYS_UEFI
    -    ret = CONF_modules_load_file(filename, appname, flags);
    +    ret = CONF_modules_load_file_ex(OSSL_LIB_CTX_get0_global_default(),
    +                                    filename, appname, flags);
     #else
         ret = 1;
     #endif
    diff --git a/deps/openssl/openssl/crypto/dh/dh_check.c b/deps/openssl/openssl/crypto/dh/dh_check.c
    index f4173e21371e01..7ba2beae7fd6b9 100644
    --- a/deps/openssl/openssl/crypto/dh/dh_check.c
    +++ b/deps/openssl/openssl/crypto/dh/dh_check.c
    @@ -259,7 +259,8 @@ int DH_check_pub_key(const DH *dh, const BIGNUM *pub_key, int *ret)
      */
     int ossl_dh_check_pub_key_partial(const DH *dh, const BIGNUM *pub_key, int *ret)
     {
    -    return ossl_ffc_validate_public_key_partial(&dh->params, pub_key, ret);
    +    return ossl_ffc_validate_public_key_partial(&dh->params, pub_key, ret)
    +           && *ret == 0;
     }
     
     int ossl_dh_check_priv_key(const DH *dh, const BIGNUM *priv_key, int *ret)
    diff --git a/deps/openssl/openssl/crypto/dh/dh_key.c b/deps/openssl/openssl/crypto/dh/dh_key.c
    index 4e9705beef733b..d84ea99241b9e8 100644
    --- a/deps/openssl/openssl/crypto/dh/dh_key.c
    +++ b/deps/openssl/openssl/crypto/dh/dh_key.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -190,7 +190,6 @@ static int dh_bn_mod_exp(const DH *dh, BIGNUM *r,
     static int dh_init(DH *dh)
     {
         dh->flags |= DH_FLAG_CACHE_MONT_P;
    -    ossl_ffc_params_init(&dh->params);
         dh->dirty_cnt++;
         return 1;
     }
    diff --git a/deps/openssl/openssl/crypto/dh/dh_lib.c b/deps/openssl/openssl/crypto/dh/dh_lib.c
    index 29cda5d7bfa845..5577413e1e0c07 100644
    --- a/deps/openssl/openssl/crypto/dh/dh_lib.c
    +++ b/deps/openssl/openssl/crypto/dh/dh_lib.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -116,6 +116,8 @@ static DH *dh_new_intern(ENGINE *engine, OSSL_LIB_CTX *libctx)
             goto err;
     #endif /* FIPS_MODULE */
     
    +    ossl_ffc_params_init(&ret->params);
    +
         if ((ret->meth->init != NULL) && !ret->meth->init(ret)) {
             ERR_raise(ERR_LIB_DH, ERR_R_INIT_FAIL);
             goto err;
    diff --git a/deps/openssl/openssl/crypto/dsa/dsa_check.c b/deps/openssl/openssl/crypto/dsa/dsa_check.c
    index 7ee914a477ecea..fb0e9129a2956b 100644
    --- a/deps/openssl/openssl/crypto/dsa/dsa_check.c
    +++ b/deps/openssl/openssl/crypto/dsa/dsa_check.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -39,7 +39,8 @@ int ossl_dsa_check_params(const DSA *dsa, int checktype, int *ret)
      */
     int ossl_dsa_check_pub_key(const DSA *dsa, const BIGNUM *pub_key, int *ret)
     {
    -    return ossl_ffc_validate_public_key(&dsa->params, pub_key, ret);
    +    return ossl_ffc_validate_public_key(&dsa->params, pub_key, ret)
    +           && *ret == 0;
     }
     
     /*
    @@ -49,7 +50,8 @@ int ossl_dsa_check_pub_key(const DSA *dsa, const BIGNUM *pub_key, int *ret)
      */
     int ossl_dsa_check_pub_key_partial(const DSA *dsa, const BIGNUM *pub_key, int *ret)
     {
    -    return ossl_ffc_validate_public_key_partial(&dsa->params, pub_key, ret);
    +    return ossl_ffc_validate_public_key_partial(&dsa->params, pub_key, ret)
    +           && *ret == 0;
     }
     
     int ossl_dsa_check_priv_key(const DSA *dsa, const BIGNUM *priv_key, int *ret)
    diff --git a/deps/openssl/openssl/crypto/dsa/dsa_lib.c b/deps/openssl/openssl/crypto/dsa/dsa_lib.c
    index ccc70165921764..2ae3f8e36b265f 100644
    --- a/deps/openssl/openssl/crypto/dsa/dsa_lib.c
    +++ b/deps/openssl/openssl/crypto/dsa/dsa_lib.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -176,6 +176,8 @@ static DSA *dsa_new_intern(ENGINE *engine, OSSL_LIB_CTX *libctx)
             goto err;
     #endif
     
    +    ossl_ffc_params_init(&ret->params);
    +
         if ((ret->meth->init != NULL) && !ret->meth->init(ret)) {
             ERR_raise(ERR_LIB_DSA, ERR_R_INIT_FAIL);
             goto err;
    diff --git a/deps/openssl/openssl/crypto/dsa/dsa_ossl.c b/deps/openssl/openssl/crypto/dsa/dsa_ossl.c
    index 62f7c70149f4fb..8fd66a950e3739 100644
    --- a/deps/openssl/openssl/crypto/dsa/dsa_ossl.c
    +++ b/deps/openssl/openssl/crypto/dsa/dsa_ossl.c
    @@ -441,7 +441,6 @@ static int dsa_do_verify(const unsigned char *dgst, int dgst_len,
     static int dsa_init(DSA *dsa)
     {
         dsa->flags |= DSA_FLAG_CACHE_MONT_P;
    -    ossl_ffc_params_init(&dsa->params);
         dsa->dirty_cnt++;
         return 1;
     }
    diff --git a/deps/openssl/openssl/crypto/encode_decode/decoder_lib.c b/deps/openssl/openssl/crypto/encode_decode/decoder_lib.c
    index e24d2c6cd588be..2e4b7ed60b9c1c 100644
    --- a/deps/openssl/openssl/crypto/encode_decode/decoder_lib.c
    +++ b/deps/openssl/openssl/crypto/encode_decode/decoder_lib.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2020-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2020-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -743,10 +743,11 @@ static int decoder_process(const OSSL_PARAM params[], void *arg)
                                (void *)new_data.ctx, LEVEL, rv);
                 } OSSL_TRACE_END(DECODER);
     
    -            data->flag_construct_called = 1;
                 ok = (rv > 0);
    -            if (ok)
    +            if (ok) {
    +                data->flag_construct_called = 1;
                     goto end;
    +            }
             }
     
             /* The constructor didn't return success */
    diff --git a/deps/openssl/openssl/crypto/encode_decode/decoder_pkey.c b/deps/openssl/openssl/crypto/encode_decode/decoder_pkey.c
    index ed10bb1cee035a..ad5e2805319b57 100644
    --- a/deps/openssl/openssl/crypto/encode_decode/decoder_pkey.c
    +++ b/deps/openssl/openssl/crypto/encode_decode/decoder_pkey.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2020-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2020-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -150,7 +150,11 @@ static int decoder_construct_pkey(OSSL_DECODER_INSTANCE *decoder_inst,
     
                 import_data.keymgmt = keymgmt;
                 import_data.keydata = NULL;
    -            import_data.selection = data->selection;
    +            if (data->selection == 0)
    +                /* import/export functions do not tolerate 0 selection */
    +                import_data.selection = OSSL_KEYMGMT_SELECT_ALL;
    +            else
    +                import_data.selection = data->selection;
     
                 /*
                  * No need to check for errors here, the value of
    diff --git a/deps/openssl/openssl/crypto/engine/eng_lib.c b/deps/openssl/openssl/crypto/engine/eng_lib.c
    index dfd53a43319559..cfdb5a50f481da 100644
    --- a/deps/openssl/openssl/crypto/engine/eng_lib.c
    +++ b/deps/openssl/openssl/crypto/engine/eng_lib.c
    @@ -133,28 +133,34 @@ static ENGINE_CLEANUP_ITEM *int_cleanup_item(ENGINE_CLEANUP_CB *cb)
         return item;
     }
     
    -void engine_cleanup_add_first(ENGINE_CLEANUP_CB *cb)
    +int engine_cleanup_add_first(ENGINE_CLEANUP_CB *cb)
     {
         ENGINE_CLEANUP_ITEM *item;
     
         if (!int_cleanup_check(1))
    -        return;
    +        return 0;
         item = int_cleanup_item(cb);
    -    if (item != NULL)
    -        if (sk_ENGINE_CLEANUP_ITEM_insert(cleanup_stack, item, 0) <= 0)
    -            OPENSSL_free(item);
    +    if (item != NULL) {
    +        if (sk_ENGINE_CLEANUP_ITEM_insert(cleanup_stack, item, 0))
    +            return 1;
    +        OPENSSL_free(item);
    +    }
    +    return 0;
     }
     
    -void engine_cleanup_add_last(ENGINE_CLEANUP_CB *cb)
    +int engine_cleanup_add_last(ENGINE_CLEANUP_CB *cb)
     {
         ENGINE_CLEANUP_ITEM *item;
    +
         if (!int_cleanup_check(1))
    -        return;
    +        return 0;
         item = int_cleanup_item(cb);
         if (item != NULL) {
    -        if (sk_ENGINE_CLEANUP_ITEM_push(cleanup_stack, item) <= 0)
    -            OPENSSL_free(item);
    +        if (sk_ENGINE_CLEANUP_ITEM_push(cleanup_stack, item) > 0)
    +            return 1;
    +        OPENSSL_free(item);
         }
    +    return 0;
     }
     
     /* The API function that performs all cleanup */
    diff --git a/deps/openssl/openssl/crypto/engine/eng_list.c b/deps/openssl/openssl/crypto/engine/eng_list.c
    index 04c73c76286486..f2eed3b071746b 100644
    --- a/deps/openssl/openssl/crypto/engine/eng_list.c
    +++ b/deps/openssl/openssl/crypto/engine/eng_list.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2001-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2001-2023 The OpenSSL Project Authors. All Rights Reserved.
      * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
    @@ -78,12 +78,15 @@ static int engine_list_add(ENGINE *e)
                 ERR_raise(ERR_LIB_ENGINE, ENGINE_R_INTERNAL_LIST_ERROR);
                 return 0;
             }
    -        engine_list_head = e;
    -        e->prev = NULL;
             /*
              * The first time the list allocates, we should register the cleanup.
              */
    -        engine_cleanup_add_last(engine_list_cleanup);
    +        if (!engine_cleanup_add_last(engine_list_cleanup)) {
    +            ERR_raise(ERR_LIB_ENGINE, ENGINE_R_INTERNAL_LIST_ERROR);
    +            return 0;
    +        }
    +        engine_list_head = e;
    +        e->prev = NULL;
         } else {
             /* We are adding to the tail of an existing list. */
             if ((engine_list_tail == NULL) || (engine_list_tail->next != NULL)) {
    diff --git a/deps/openssl/openssl/crypto/engine/eng_local.h b/deps/openssl/openssl/crypto/engine/eng_local.h
    index 03a86299cf88b8..75bc9e6f1675b9 100644
    --- a/deps/openssl/openssl/crypto/engine/eng_local.h
    +++ b/deps/openssl/openssl/crypto/engine/eng_local.h
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2001-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2001-2023 The OpenSSL Project Authors. All Rights Reserved.
      * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
    @@ -46,8 +46,8 @@ typedef struct st_engine_cleanup_item {
         ENGINE_CLEANUP_CB *cb;
     } ENGINE_CLEANUP_ITEM;
     DEFINE_STACK_OF(ENGINE_CLEANUP_ITEM)
    -void engine_cleanup_add_first(ENGINE_CLEANUP_CB *cb);
    -void engine_cleanup_add_last(ENGINE_CLEANUP_CB *cb);
    +int engine_cleanup_add_first(ENGINE_CLEANUP_CB *cb);
    +int engine_cleanup_add_last(ENGINE_CLEANUP_CB *cb);
     
     /* We need stacks of ENGINEs for use in eng_table.c */
     DEFINE_STACK_OF(ENGINE)
    diff --git a/deps/openssl/openssl/crypto/engine/eng_pkey.c b/deps/openssl/openssl/crypto/engine/eng_pkey.c
    index 6e6d6df35b2b9a..f84fcde4601629 100644
    --- a/deps/openssl/openssl/crypto/engine/eng_pkey.c
    +++ b/deps/openssl/openssl/crypto/engine/eng_pkey.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2001-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2001-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -79,6 +79,48 @@ EVP_PKEY *ENGINE_load_private_key(ENGINE *e, const char *key_id,
             ERR_raise(ERR_LIB_ENGINE, ENGINE_R_FAILED_LOADING_PRIVATE_KEY);
             return NULL;
         }
    +    /* We enforce check for legacy key */
    +    switch (EVP_PKEY_get_id(pkey)) {
    +    case EVP_PKEY_RSA:
    +        {
    +        RSA *rsa = EVP_PKEY_get1_RSA(pkey);
    +        EVP_PKEY_set1_RSA(pkey, rsa);
    +        RSA_free(rsa);
    +        }
    +        break;
    +#  ifndef OPENSSL_NO_EC
    +    case EVP_PKEY_SM2:
    +    case EVP_PKEY_EC:
    +        {
    +        EC_KEY *ec = EVP_PKEY_get1_EC_KEY(pkey);
    +        EVP_PKEY_set1_EC_KEY(pkey, ec);
    +        EC_KEY_free(ec);
    +        }
    +        break;
    +#  endif
    +#  ifndef OPENSSL_NO_DSA
    +    case EVP_PKEY_DSA:
    +        {
    +        DSA *dsa = EVP_PKEY_get1_DSA(pkey);
    +        EVP_PKEY_set1_DSA(pkey, dsa);
    +        DSA_free(dsa);
    +        }
    +        break;
    +#endif
    +#  ifndef OPENSSL_NO_DH
    +    case EVP_PKEY_DH:
    +        {
    +        DH *dh = EVP_PKEY_get1_DH(pkey);
    +        EVP_PKEY_set1_DH(pkey, dh);
    +        DH_free(dh);
    +        }
    +        break;
    +#endif
    +    default:
    +        /*Do nothing */
    +        break;
    +    }
    +
         return pkey;
     }
     
    diff --git a/deps/openssl/openssl/crypto/engine/eng_table.c b/deps/openssl/openssl/crypto/engine/eng_table.c
    index a8209d9e71760b..9dc3144bbfd7b6 100644
    --- a/deps/openssl/openssl/crypto/engine/eng_table.c
    +++ b/deps/openssl/openssl/crypto/engine/eng_table.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2001-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2001-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -93,9 +93,12 @@ int engine_table_register(ENGINE_TABLE **table, ENGINE_CLEANUP_CB *cleanup,
             added = 1;
         if (!int_table_check(table, 1))
             goto end;
    -    if (added)
    -        /* The cleanup callback needs to be added */
    -        engine_cleanup_add_first(cleanup);
    +    /* The cleanup callback needs to be added */
    +    if (added && !engine_cleanup_add_first(cleanup)) {
    +        lh_ENGINE_PILE_free(&(*table)->piles);
    +        *table = NULL;
    +        goto end;
    +    }
         while (num_nids--) {
             tmplate.nid = *nids;
             fnd = lh_ENGINE_PILE_retrieve(&(*table)->piles, &tmplate);
    @@ -201,8 +204,10 @@ ENGINE *ossl_engine_table_select(ENGINE_TABLE **table, int nid,
         ENGINE_PILE tmplate, *fnd = NULL;
         int initres, loop = 0;
     
    +#ifndef OPENSSL_NO_AUTOLOAD_CONFIG
         /* Load the config before trying to check if engines are available */
         OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CONFIG, NULL);
    +#endif
     
         if (!(*table)) {
             OSSL_TRACE3(ENGINE_TABLE,
    diff --git a/deps/openssl/openssl/crypto/err/openssl.txt b/deps/openssl/openssl/crypto/err/openssl.txt
    index d3ac1b19063272..d62ee33ecc77fe 100644
    --- a/deps/openssl/openssl/crypto/err/openssl.txt
    +++ b/deps/openssl/openssl/crypto/err/openssl.txt
    @@ -375,6 +375,7 @@ CMS_R_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM:179:\
     CMS_R_UNSUPPORTED_LABEL_SOURCE:193:unsupported label source
     CMS_R_UNSUPPORTED_RECIPIENTINFO_TYPE:155:unsupported recipientinfo type
     CMS_R_UNSUPPORTED_RECIPIENT_TYPE:154:unsupported recipient type
    +CMS_R_UNSUPPORTED_SIGNATURE_ALGORITHM:195:unsupported signature algorithm
     CMS_R_UNSUPPORTED_TYPE:156:unsupported type
     CMS_R_UNWRAP_ERROR:157:unwrap error
     CMS_R_UNWRAP_FAILURE:180:unwrap failure
    diff --git a/deps/openssl/openssl/crypto/evp/ctrl_params_translate.c b/deps/openssl/openssl/crypto/evp/ctrl_params_translate.c
    index b28875037c7281..dcd53b43f92b9c 100644
    --- a/deps/openssl/openssl/crypto/evp/ctrl_params_translate.c
    +++ b/deps/openssl/openssl/crypto/evp/ctrl_params_translate.c
    @@ -1786,7 +1786,8 @@ static int get_rsa_payload_n(enum state state,
     {
         const BIGNUM *bn = NULL;
     
    -    if (EVP_PKEY_get_base_id(ctx->p2) != EVP_PKEY_RSA)
    +    if (EVP_PKEY_get_base_id(ctx->p2) != EVP_PKEY_RSA
    +        && EVP_PKEY_get_base_id(ctx->p2) != EVP_PKEY_RSA_PSS)
             return 0;
         bn = RSA_get0_n(EVP_PKEY_get0_RSA(ctx->p2));
     
    @@ -1799,7 +1800,8 @@ static int get_rsa_payload_e(enum state state,
     {
         const BIGNUM *bn = NULL;
     
    -    if (EVP_PKEY_get_base_id(ctx->p2) != EVP_PKEY_RSA)
    +    if (EVP_PKEY_get_base_id(ctx->p2) != EVP_PKEY_RSA
    +        && EVP_PKEY_get_base_id(ctx->p2) != EVP_PKEY_RSA_PSS)
             return 0;
         bn = RSA_get0_e(EVP_PKEY_get0_RSA(ctx->p2));
     
    @@ -1812,7 +1814,8 @@ static int get_rsa_payload_d(enum state state,
     {
         const BIGNUM *bn = NULL;
     
    -    if (EVP_PKEY_get_base_id(ctx->p2) != EVP_PKEY_RSA)
    +    if (EVP_PKEY_get_base_id(ctx->p2) != EVP_PKEY_RSA
    +        && EVP_PKEY_get_base_id(ctx->p2) != EVP_PKEY_RSA_PSS)
             return 0;
         bn = RSA_get0_d(EVP_PKEY_get0_RSA(ctx->p2));
     
    @@ -1912,7 +1915,8 @@ static int get_rsa_payload_coefficient(enum state state,
                              const struct translation_st *translation,      \
                              struct translation_ctx_st *ctx)                \
         {                                                                   \
    -        if (EVP_PKEY_get_base_id(ctx->p2) != EVP_PKEY_RSA)              \
    +        if (EVP_PKEY_get_base_id(ctx->p2) != EVP_PKEY_RSA               \
    +            && EVP_PKEY_get_base_id(ctx->p2) != EVP_PKEY_RSA_PSS)       \
                 return 0;                                                   \
             return get_rsa_payload_factor(state, translation, ctx, n - 1);  \
         }
    @@ -1923,7 +1927,8 @@ static int get_rsa_payload_coefficient(enum state state,
                              const struct translation_st *translation,      \
                              struct translation_ctx_st *ctx)                \
         {                                                                   \
    -        if (EVP_PKEY_get_base_id(ctx->p2) != EVP_PKEY_RSA)              \
    +        if (EVP_PKEY_get_base_id(ctx->p2) != EVP_PKEY_RSA               \
    +            && EVP_PKEY_get_base_id(ctx->p2) != EVP_PKEY_RSA_PSS)       \
                 return 0;                                                   \
             return get_rsa_payload_exponent(state, translation, ctx,        \
                                             n - 1);                         \
    @@ -1935,7 +1940,8 @@ static int get_rsa_payload_coefficient(enum state state,
                              const struct translation_st *translation,      \
                              struct translation_ctx_st *ctx)                \
         {                                                                   \
    -        if (EVP_PKEY_get_base_id(ctx->p2) != EVP_PKEY_RSA)              \
    +        if (EVP_PKEY_get_base_id(ctx->p2) != EVP_PKEY_RSA               \
    +            && EVP_PKEY_get_base_id(ctx->p2) != EVP_PKEY_RSA_PSS)       \
                 return 0;                                                   \
             return get_rsa_payload_coefficient(state, translation, ctx,     \
                                                n - 1);                      \
    @@ -2271,10 +2277,10 @@ static const struct translation_st evp_pkey_ctx_translations[] = {
         { SET, EVP_PKEY_RSA, EVP_PKEY_RSA_PSS, EVP_PKEY_OP_KEYGEN,
           EVP_PKEY_CTRL_RSA_KEYGEN_BITS, "rsa_keygen_bits", NULL,
           OSSL_PKEY_PARAM_RSA_BITS, OSSL_PARAM_UNSIGNED_INTEGER, NULL },
    -    { SET, EVP_PKEY_RSA, 0, EVP_PKEY_OP_KEYGEN,
    +    { SET, EVP_PKEY_RSA, EVP_PKEY_RSA_PSS, EVP_PKEY_OP_KEYGEN,
           EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP, "rsa_keygen_pubexp", NULL,
           OSSL_PKEY_PARAM_RSA_E, OSSL_PARAM_UNSIGNED_INTEGER, NULL },
    -    { SET, EVP_PKEY_RSA, 0, EVP_PKEY_OP_KEYGEN,
    +    { SET, EVP_PKEY_RSA, EVP_PKEY_RSA_PSS, EVP_PKEY_OP_KEYGEN,
           EVP_PKEY_CTRL_RSA_KEYGEN_PRIMES, "rsa_keygen_primes", NULL,
           OSSL_PKEY_PARAM_RSA_PRIMES, OSSL_PARAM_UNSIGNED_INTEGER, NULL },
     
    diff --git a/deps/openssl/openssl/crypto/evp/evp_enc.c b/deps/openssl/openssl/crypto/evp/evp_enc.c
    index b178d1086473f1..4e6f83e3d0a94a 100644
    --- a/deps/openssl/openssl/crypto/evp/evp_enc.c
    +++ b/deps/openssl/openssl/crypto/evp/evp_enc.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -192,7 +192,12 @@ static int evp_cipher_init_internal(EVP_CIPHER_CTX *ctx,
     #endif
         }
     
    -    if (cipher->prov != NULL) {
    +    if (!ossl_assert(cipher->prov != NULL)) {
    +        ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR);
    +        return 0;
    +    }
    +
    +    if (cipher != ctx->fetched_cipher) {
             if (!EVP_CIPHER_up_ref((EVP_CIPHER *)cipher)) {
                 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR);
                 return 0;
    @@ -218,6 +223,42 @@ static int evp_cipher_init_internal(EVP_CIPHER_CTX *ctx,
                 return 0;
         }
     
    +#ifndef FIPS_MODULE
    +    /*
    +     * Fix for CVE-2023-5363
    +     * Passing in a size as part of the init call takes effect late
    +     * so, force such to occur before the initialisation.
    +     *
    +     * The FIPS provider's internal library context is used in a manner
    +     * such that this is not an issue.
    +     */
    +    if (params != NULL) {
    +        OSSL_PARAM param_lens[3] = { OSSL_PARAM_END, OSSL_PARAM_END,
    +                                     OSSL_PARAM_END };
    +        OSSL_PARAM *q = param_lens;
    +        const OSSL_PARAM *p;
    +
    +        p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_KEYLEN); 
    +        if (p != NULL)
    +            memcpy(q++, p, sizeof(*q));
    +
    +        /*
    +         * Note that OSSL_CIPHER_PARAM_AEAD_IVLEN is a synomym for
    +         * OSSL_CIPHER_PARAM_IVLEN so both are covered here.
    +         */
    +        p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_IVLEN);
    +        if (p != NULL)
    +            memcpy(q++, p, sizeof(*q));
    +
    +        if (q != param_lens) {
    +            if (!EVP_CIPHER_CTX_set_params(ctx, param_lens)) {
    +                ERR_raise(ERR_LIB_EVP, EVP_R_INVALID_LENGTH);
    +                return 0;
    +            }
    +        }
    +    }
    +#endif
    +
         if (enc) {
             if (ctx->cipher->einit == NULL) {
                 ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR);
    diff --git a/deps/openssl/openssl/crypto/evp/legacy_sha.c b/deps/openssl/openssl/crypto/evp/legacy_sha.c
    index 3859286eeb2046..ca9a3264978abe 100644
    --- a/deps/openssl/openssl/crypto/evp/legacy_sha.c
    +++ b/deps/openssl/openssl/crypto/evp/legacy_sha.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2019-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -71,7 +71,11 @@ static int sha1_int_ctrl(EVP_MD_CTX *ctx, int cmd, int p1, void *p2)
     
     static int shake_ctrl(EVP_MD_CTX *evp_ctx, int cmd, int p1, void *p2)
     {
    -    KECCAK1600_CTX *ctx = evp_ctx->md_data;
    +    KECCAK1600_CTX *ctx;
    +
    +    if (evp_ctx == NULL)
    +        return 0;
    +    ctx = evp_ctx->md_data;
     
         switch (cmd) {
         case EVP_MD_CTRL_XOF_LEN:
    diff --git a/deps/openssl/openssl/crypto/evp/p_lib.c b/deps/openssl/openssl/crypto/evp/p_lib.c
    index aa6ec31dab6e9e..04b148a912187e 100644
    --- a/deps/openssl/openssl/crypto/evp/p_lib.c
    +++ b/deps/openssl/openssl/crypto/evp/p_lib.c
    @@ -717,6 +717,7 @@ static void detect_foreign_key(EVP_PKEY *pkey)
     {
         switch (pkey->type) {
         case EVP_PKEY_RSA:
    +    case EVP_PKEY_RSA_PSS:
             pkey->foreign = pkey->pkey.rsa != NULL
                             && ossl_rsa_is_foreign(pkey->pkey.rsa);
             break;
    @@ -1075,6 +1076,7 @@ int EVP_PKEY_can_sign(const EVP_PKEY *pkey)
         if (pkey->keymgmt == NULL) {
             switch (EVP_PKEY_get_base_id(pkey)) {
             case EVP_PKEY_RSA:
    +        case EVP_PKEY_RSA_PSS:
                 return 1;
     # ifndef OPENSSL_NO_DSA
             case EVP_PKEY_DSA:
    @@ -1199,7 +1201,7 @@ int EVP_PKEY_print_public(BIO *out, const EVP_PKEY *pkey,
     int EVP_PKEY_print_private(BIO *out, const EVP_PKEY *pkey,
                                int indent, ASN1_PCTX *pctx)
     {
    -    return print_pkey(pkey, out, indent, EVP_PKEY_KEYPAIR, NULL,
    +    return print_pkey(pkey, out, indent, EVP_PKEY_PRIVATE_KEY, NULL,
                           (pkey->ameth != NULL ? pkey->ameth->priv_print : NULL),
                           pctx);
     }
    diff --git a/deps/openssl/openssl/crypto/evp/pmeth_lib.c b/deps/openssl/openssl/crypto/evp/pmeth_lib.c
    index ce6e1a1ccbd577..ba1971ce461d57 100644
    --- a/deps/openssl/openssl/crypto/evp/pmeth_lib.c
    +++ b/deps/openssl/openssl/crypto/evp/pmeth_lib.c
    @@ -251,10 +251,11 @@ static EVP_PKEY_CTX *int_ctx_new(OSSL_LIB_CTX *libctx,
          */
         if (e != NULL)
             pmeth = ENGINE_get_pkey_meth(e, id);
    -    else if (pkey != NULL && pkey->foreign)
    +    else
    +# endif /* OPENSSL_NO_ENGINE */
    +    if (pkey != NULL && pkey->foreign)
             pmeth = EVP_PKEY_meth_find(id);
         else
    -# endif
             app_pmeth = pmeth = evp_pkey_meth_find_added_by_application(id);
     
         /* END legacy */
    diff --git a/deps/openssl/openssl/crypto/ex_data.c b/deps/openssl/openssl/crypto/ex_data.c
    index 40223f06e4ecb6..13b9288994569c 100644
    --- a/deps/openssl/openssl/crypto/ex_data.c
    +++ b/deps/openssl/openssl/crypto/ex_data.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -163,6 +163,8 @@ int ossl_crypto_get_ex_new_index_ex(OSSL_LIB_CTX *ctx, int class_index,
              * "app_data" routines use ex_data index zero.  See RT 3710. */
             if (ip->meth == NULL
                 || !sk_EX_CALLBACK_push(ip->meth, NULL)) {
    +            sk_EX_CALLBACK_free(ip->meth);
    +            ip->meth = NULL;
                 ERR_raise(ERR_LIB_CRYPTO, ERR_R_MALLOC_FAILURE);
                 goto err;
             }
    diff --git a/deps/openssl/openssl/crypto/ffc/ffc_key_validate.c b/deps/openssl/openssl/crypto/ffc/ffc_key_validate.c
    index 342789621d6df1..a4a2a58e9a7fd9 100644
    --- a/deps/openssl/openssl/crypto/ffc/ffc_key_validate.c
    +++ b/deps/openssl/openssl/crypto/ffc/ffc_key_validate.c
    @@ -26,7 +26,7 @@ int ossl_ffc_validate_public_key_partial(const FFC_PARAMS *params,
         *ret = 0;
         if (params == NULL || pub_key == NULL || params->p == NULL) {
             *ret = FFC_ERROR_PASSED_NULL_PARAM;
    -        return 0;
    +        return 1;
         }
     
         ctx = BN_CTX_new_ex(NULL);
    @@ -39,18 +39,14 @@ int ossl_ffc_validate_public_key_partial(const FFC_PARAMS *params,
         if (tmp == NULL
             || !BN_set_word(tmp, 1))
             goto err;
    -    if (BN_cmp(pub_key, tmp) <= 0) {
    +    if (BN_cmp(pub_key, tmp) <= 0)
             *ret |= FFC_ERROR_PUBKEY_TOO_SMALL;
    -        goto err;
    -    }
         /* Step(1): Verify pub_key <=  p-2 */
         if (BN_copy(tmp, params->p) == NULL
             || !BN_sub_word(tmp, 1))
             goto err;
    -    if (BN_cmp(pub_key, tmp) >= 0) {
    +    if (BN_cmp(pub_key, tmp) >= 0)
             *ret |= FFC_ERROR_PUBKEY_TOO_LARGE;
    -        goto err;
    -    }
         ok = 1;
      err:
         if (ctx != NULL) {
    @@ -73,7 +69,7 @@ int ossl_ffc_validate_public_key(const FFC_PARAMS *params,
         if (!ossl_ffc_validate_public_key_partial(params, pub_key, ret))
             return 0;
     
    -    if (params->q != NULL) {
    +    if (*ret == 0 && params->q != NULL) {
             ctx = BN_CTX_new_ex(NULL);
             if (ctx == NULL)
                 goto err;
    @@ -84,10 +80,8 @@ int ossl_ffc_validate_public_key(const FFC_PARAMS *params,
             if (tmp == NULL
                 || !BN_mod_exp(tmp, pub_key, params->q, params->p, ctx))
                 goto err;
    -        if (!BN_is_one(tmp)) {
    +        if (!BN_is_one(tmp))
                 *ret |= FFC_ERROR_PUBKEY_INVALID;
    -            goto err;
    -        }
         }
     
         ok = 1;
    diff --git a/deps/openssl/openssl/crypto/http/http_client.c b/deps/openssl/openssl/crypto/http/http_client.c
    index ee41c03103e5fc..e3ccc6c4cc2fdd 100644
    --- a/deps/openssl/openssl/crypto/http/http_client.c
    +++ b/deps/openssl/openssl/crypto/http/http_client.c
    @@ -164,7 +164,8 @@ void OSSL_HTTP_REQ_CTX_set_max_response_length(OSSL_HTTP_REQ_CTX *rctx,
     
     /*
      * Create request line using |rctx| and |path| (or "/" in case |path| is NULL).
    - * Server name (and port) must be given if and only if plain HTTP proxy is used.
    + * Server name (and optional port) must be given if and only if
    + * a plain HTTP proxy is used and |path| does not begin with 'http://'.
      */
     int OSSL_HTTP_REQ_CTX_set_request_line(OSSL_HTTP_REQ_CTX *rctx, int method_POST,
                                            const char *server, const char *port,
    @@ -193,11 +194,17 @@ int OSSL_HTTP_REQ_CTX_set_request_line(OSSL_HTTP_REQ_CTX *rctx, int method_POST,
                 return 0;
         }
     
    -    /* Make sure path includes a forward slash */
    -    if (path == NULL)
    +    /* Make sure path includes a forward slash (abs_path) */
    +    if (path == NULL)  {
             path = "/";
    -    if (path[0] != '/' && BIO_printf(rctx->mem, "/") <= 0)
    +    } else if (HAS_PREFIX(path, "http://")) { /* absoluteURI for proxy use */
    +        if (server != NULL) {
    +            ERR_raise(ERR_LIB_HTTP, ERR_R_PASSED_INVALID_ARGUMENT);
    +            return 0;
    +        }
    +    } else if (path[0] != '/' && BIO_printf(rctx->mem, "/") <= 0) {
             return 0;
    +    }
         /*
          * Add (the rest of) the path and the HTTP version,
          * which is fixed to 1.0 for straightforward implementation of keep-alive
    diff --git a/deps/openssl/openssl/crypto/lhash/lhash.c b/deps/openssl/openssl/crypto/lhash/lhash.c
    index 1cd988f01fc76a..a01cfa725e38c7 100644
    --- a/deps/openssl/openssl/crypto/lhash/lhash.c
    +++ b/deps/openssl/openssl/crypto/lhash/lhash.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -266,12 +266,12 @@ static void contract(OPENSSL_LHASH *lh)
             if (n == NULL) {
                 /* fputs("realloc error in lhash",stderr); */
                 lh->error++;
    -            return;
    +        } else {
    +            lh->b = n;
             }
             lh->num_alloc_nodes /= 2;
             lh->pmax /= 2;
             lh->p = lh->pmax - 1;
    -        lh->b = n;
         } else
             lh->p--;
     
    diff --git a/deps/openssl/openssl/crypto/mem.c b/deps/openssl/openssl/crypto/mem.c
    index f6cdcf5a423ec7..34128616e2700e 100644
    --- a/deps/openssl/openssl/crypto/mem.c
    +++ b/deps/openssl/openssl/crypto/mem.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -100,6 +100,9 @@ void CRYPTO_get_alloc_counts(int *mcount, int *rcount, int *fcount)
      *    or    100;100@25;0
      * This means 100 mallocs succeed, then next 100 fail 25% of the time, and
      * all remaining (count is zero) succeed.
    + * The failure percentge can have 2 digits after the comma.  For example:
    + *          0@0.01
    + * This means 0.01% of all allocations will fail.
      */
     static void parseit(void)
     {
    @@ -112,26 +115,27 @@ static void parseit(void)
         /* Get the count (atol will stop at the @ if there), and percentage */
         md_count = atol(md_failstring);
         atsign = strchr(md_failstring, '@');
    -    md_fail_percent = atsign == NULL ? 0 : atoi(atsign + 1);
    +    md_fail_percent = atsign == NULL ? 0 : (int)(atof(atsign + 1) * 100 + 0.5);
     
         if (semi != NULL)
             md_failstring = semi;
     }
     
     /*
    - * Windows doesn't have random(), but it has rand()
    + * Windows doesn't have random() and srandom(), but it has rand() and srand().
      * Some rand() implementations aren't good, but we're not
      * dealing with secure randomness here.
      */
     # ifdef _WIN32
     #  define random() rand()
    +#  define srandom(seed) srand(seed)
     # endif
     /*
      * See if the current malloc should fail.
      */
     static int shouldfail(void)
     {
    -    int roll = (int)(random() % 100);
    +    int roll = (int)(random() % 10000);
         int shoulditfail = roll < md_fail_percent;
     # ifndef _WIN32
     /* suppressed on Windows as POSIX-like file descriptors are non-inheritable */
    @@ -165,6 +169,8 @@ void ossl_malloc_setup_failures(void)
             parseit();
         if ((cp = getenv("OPENSSL_MALLOC_FD")) != NULL)
             md_tracefd = atoi(cp);
    +    if ((cp = getenv("OPENSSL_MALLOC_SEED")) != NULL)
    +        srandom(atoi(cp));
     }
     #endif
     
    @@ -195,7 +201,6 @@ void *CRYPTO_zalloc(size_t num, const char *file, int line)
         void *ret;
     
         ret = CRYPTO_malloc(num, file, line);
    -    FAILTEST();
         if (ret != NULL)
             memset(ret, 0, num);
     
    @@ -208,7 +213,6 @@ void *CRYPTO_realloc(void *str, size_t num, const char *file, int line)
         if (realloc_impl != CRYPTO_realloc)
             return realloc_impl(str, num, file, line);
     
    -    FAILTEST();
         if (str == NULL)
             return CRYPTO_malloc(num, file, line);
     
    @@ -217,6 +221,7 @@ void *CRYPTO_realloc(void *str, size_t num, const char *file, int line)
             return NULL;
         }
     
    +    FAILTEST();
         return realloc(str, num);
     }
     
    diff --git a/deps/openssl/openssl/crypto/modes/asm/ghashv8-armx.pl b/deps/openssl/openssl/crypto/modes/asm/ghashv8-armx.pl
    index b1d35d25b5b19f..b3d94041729e6f 100644
    --- a/deps/openssl/openssl/crypto/modes/asm/ghashv8-armx.pl
    +++ b/deps/openssl/openssl/crypto/modes/asm/ghashv8-armx.pl
    @@ -1,5 +1,5 @@
     #! /usr/bin/env perl
    -# Copyright 2014-2020 The OpenSSL Project Authors. All Rights Reserved.
    +# Copyright 2014-2023 The OpenSSL Project Authors. All Rights Reserved.
     #
     # Licensed under the Apache License 2.0 (the "License").  You may not use
     # this file except in compliance with the License.  You can obtain a copy
    @@ -744,6 +744,9 @@
     	s/\.[uisp]?64//o and s/\.16b/\.2d/go;
     	s/\.[42]([sd])\[([0-3])\]/\.$1\[$2\]/o;
     
    +	# Switch preprocessor checks to aarch64 versions.
    +	s/__ARME([BL])__/__AARCH64E$1__/go;
    +
     	print $_,"\n";
         }
     } else {				######## 32-bit code
    diff --git a/deps/openssl/openssl/crypto/objects/obj_dat.c b/deps/openssl/openssl/crypto/objects/obj_dat.c
    index 1a52000e6e9d64..85d30eb58ae013 100644
    --- a/deps/openssl/openssl/crypto/objects/obj_dat.c
    +++ b/deps/openssl/openssl/crypto/objects/obj_dat.c
    @@ -642,13 +642,14 @@ const void *OBJ_bsearch_ex_(const void *key, const void *base, int num,
         if (p == NULL) {
             const char *base_ = base;
             int l, h, i = 0, c = 0;
    +        char *p1;
     
             for (i = 0; i < num; ++i) {
    -            p = &(base_[i * size]);
    -            c = (*cmp) (key, p);
    +            p1 = &(base_[i * size]);
    +            c = (*cmp) (key, p1);
                 if (c == 0
                     || (c < 0 && (flags & OBJ_BSEARCH_VALUE_ON_NOMATCH)))
    -                return p;
    +                return p1;
             }
         }
     #endif
    diff --git a/deps/openssl/openssl/crypto/param_build_set.c b/deps/openssl/openssl/crypto/param_build_set.c
    index 8b570ded96ebb4..5de06cc7ed685c 100644
    --- a/deps/openssl/openssl/crypto/param_build_set.c
    +++ b/deps/openssl/openssl/crypto/param_build_set.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2020-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -99,21 +99,22 @@ int ossl_param_build_set_multi_key_bn(OSSL_PARAM_BLD *bld, OSSL_PARAM *params,
     {
         int i, sz = sk_BIGNUM_const_num(stk);
         OSSL_PARAM *p;
    -
    +    const BIGNUM *bn;
     
         if (bld != NULL) {
             for (i = 0; i < sz && names[i] != NULL; ++i) {
    -            if (!OSSL_PARAM_BLD_push_BN(bld, names[i],
    -                                        sk_BIGNUM_const_value(stk, i)))
    +            bn = sk_BIGNUM_const_value(stk, i);
    +            if (bn != NULL && !OSSL_PARAM_BLD_push_BN(bld, names[i], bn))
                     return 0;
             }
             return 1;
         }
     
         for (i = 0; i < sz && names[i] != NULL; ++i) {
    +        bn = sk_BIGNUM_const_value(stk, i);
             p = OSSL_PARAM_locate(params, names[i]);
    -        if (p != NULL) {
    -            if (!OSSL_PARAM_set_BN(p, sk_BIGNUM_const_value(stk, i)))
    +        if (p != NULL && bn != NULL) {
    +            if (!OSSL_PARAM_set_BN(p, bn))
                     return 0;
             }
         }
    diff --git a/deps/openssl/openssl/crypto/pem/pem_pkey.c b/deps/openssl/openssl/crypto/pem/pem_pkey.c
    index 3e76852c67a44a..4deee46ce5506f 100644
    --- a/deps/openssl/openssl/crypto/pem/pem_pkey.c
    +++ b/deps/openssl/openssl/crypto/pem/pem_pkey.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -366,10 +366,19 @@ int PEM_write_bio_PrivateKey_traditional(BIO *bp, const EVP_PKEY *x,
         return ret;
     }
     
    +static int no_password_cb(char *buf, int num, int rwflag, void *userdata)
    +{
    +    return -1;
    +}
    +
     EVP_PKEY *PEM_read_bio_Parameters_ex(BIO *bp, EVP_PKEY **x,
                                          OSSL_LIB_CTX *libctx, const char *propq)
     {
    -    return pem_read_bio_key(bp, x, NULL, NULL, libctx, propq,
    +    /*
    +     * PEM_read_bio_Parameters(_ex) should never ask for a password. Any attempt
    +     * to get a password just fails.
    +     */
    +    return pem_read_bio_key(bp, x, no_password_cb, NULL, libctx, propq,
                                 EVP_PKEY_KEY_PARAMETERS);
     }
     
    diff --git a/deps/openssl/openssl/crypto/perlasm/arm-xlate.pl b/deps/openssl/openssl/crypto/perlasm/arm-xlate.pl
    index a90885905c0fdb..38d570c79017c2 100755
    --- a/deps/openssl/openssl/crypto/perlasm/arm-xlate.pl
    +++ b/deps/openssl/openssl/crypto/perlasm/arm-xlate.pl
    @@ -1,5 +1,5 @@
     #! /usr/bin/env perl
    -# Copyright 2015-2020 The OpenSSL Project Authors. All Rights Reserved.
    +# Copyright 2015-2023 The OpenSSL Project Authors. All Rights Reserved.
     #
     # Licensed under the Apache License 2.0 (the "License").  You may not use
     # this file except in compliance with the License.  You can obtain a copy
    @@ -159,9 +159,8 @@ sub expand_line {
         }
     
         {
    -	$line =~ s|(^[\.\w]+)\:\s*||;
    -	my $label = $1;
    -	if ($label) {
    +	if ($line =~ s|(^[\.\w]+)\:\s*||) {
    +	    my $label = $1;
     	    printf "%s:",($GLOBALS{$label} or $label);
     	}
         }
    diff --git a/deps/openssl/openssl/crypto/pkcs12/p12_crt.c b/deps/openssl/openssl/crypto/pkcs12/p12_crt.c
    index 00c71297463d9e..26a444f868b028 100644
    --- a/deps/openssl/openssl/crypto/pkcs12/p12_crt.c
    +++ b/deps/openssl/openssl/crypto/pkcs12/p12_crt.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 1999-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1999-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -14,6 +14,12 @@
     
     static int pkcs12_add_bag(STACK_OF(PKCS12_SAFEBAG) **pbags,
                               PKCS12_SAFEBAG *bag);
    +static PKCS12_SAFEBAG *pkcs12_add_cert_bag(STACK_OF(PKCS12_SAFEBAG) **pbags,
    +                                           X509 *cert,
    +                                           const char *name,
    +                                           int namelen,
    +                                           unsigned char *keyid,
    +                                           int keyidlen);
     
     static int copy_bag_attr(PKCS12_SAFEBAG *bag, EVP_PKEY *pkey, int nid)
     {
    @@ -40,6 +46,9 @@ PKCS12 *PKCS12_create_ex(const char *pass, const char *name, EVP_PKEY *pkey,
         int i;
         unsigned char keyid[EVP_MAX_MD_SIZE];
         unsigned int keyidlen = 0;
    +    int namelen = -1;
    +    unsigned char *pkeyid = NULL;
    +    int pkeyidlen = -1;
     
         /* Set defaults */
         if (nid_cert == NID_undef)
    @@ -64,11 +73,16 @@ PKCS12 *PKCS12_create_ex(const char *pass, const char *name, EVP_PKEY *pkey,
         }
     
         if (cert) {
    -        bag = PKCS12_add_cert(&bags, cert);
    -        if (name && !PKCS12_add_friendlyname(bag, name, -1))
    -            goto err;
    -        if (keyidlen && !PKCS12_add_localkeyid(bag, keyid, keyidlen))
    -            goto err;
    +        if (name == NULL)
    +            name = (char *)X509_alias_get0(cert, &namelen);
    +        if (keyidlen > 0) {
    +            pkeyid = keyid;
    +            pkeyidlen = keyidlen;
    +        } else {
    +            pkeyid = X509_keyid_get0(cert, &pkeyidlen);
    +        }
    +
    +        bag = pkcs12_add_cert_bag(&bags, cert, name, namelen, pkeyid, pkeyidlen);
         }
     
         /* Add all other certificates */
    @@ -139,30 +153,23 @@ PKCS12 *PKCS12_create(const char *pass, const char *name, EVP_PKEY *pkey, X509 *
                                 iter, mac_iter, keytype, NULL, NULL);
     }
     
    -PKCS12_SAFEBAG *PKCS12_add_cert(STACK_OF(PKCS12_SAFEBAG) **pbags, X509 *cert)
    +static PKCS12_SAFEBAG *pkcs12_add_cert_bag(STACK_OF(PKCS12_SAFEBAG) **pbags,
    +                                           X509 *cert,
    +                                           const char *name,
    +                                           int namelen,
    +                                           unsigned char *keyid,
    +                                           int keyidlen)
     {
         PKCS12_SAFEBAG *bag = NULL;
    -    char *name;
    -    int namelen = -1;
    -    unsigned char *keyid;
    -    int keyidlen = -1;
     
         /* Add user certificate */
         if ((bag = PKCS12_SAFEBAG_create_cert(cert)) == NULL)
             goto err;
     
    -    /*
    -     * Use friendlyName and localKeyID in certificate. (if present)
    -     */
    -
    -    name = (char *)X509_alias_get0(cert, &namelen);
    -
    -    if (name && !PKCS12_add_friendlyname(bag, name, namelen))
    +    if (name != NULL && !PKCS12_add_friendlyname(bag, name, namelen))
             goto err;
     
    -    keyid = X509_keyid_get0(cert, &keyidlen);
    -
    -    if (keyid && !PKCS12_add_localkeyid(bag, keyid, keyidlen))
    +    if (keyid != NULL && !PKCS12_add_localkeyid(bag, keyid, keyidlen))
             goto err;
     
         if (!pkcs12_add_bag(pbags, bag))
    @@ -173,7 +180,22 @@ PKCS12_SAFEBAG *PKCS12_add_cert(STACK_OF(PKCS12_SAFEBAG) **pbags, X509 *cert)
      err:
         PKCS12_SAFEBAG_free(bag);
         return NULL;
    +}
    +
    +PKCS12_SAFEBAG *PKCS12_add_cert(STACK_OF(PKCS12_SAFEBAG) **pbags, X509 *cert)
    +{
    +    char *name = NULL;
    +    int namelen = -1;
    +    unsigned char *keyid = NULL;
    +    int keyidlen = -1;
    +
    +    /*
    +     * Use friendlyName and localKeyID in certificate. (if present)
    +     */
    +    name = (char *)X509_alias_get0(cert, &namelen);
    +    keyid = X509_keyid_get0(cert, &keyidlen);
     
    +    return pkcs12_add_cert_bag(pbags, cert, name, namelen, keyid, keyidlen);
     }
     
     PKCS12_SAFEBAG *PKCS12_add_key_ex(STACK_OF(PKCS12_SAFEBAG) **pbags,
    diff --git a/deps/openssl/openssl/crypto/poly1305/asm/poly1305-armv8.pl b/deps/openssl/openssl/crypto/poly1305/asm/poly1305-armv8.pl
    index 113a2151b6fa14..dc39f4053fe6a9 100755
    --- a/deps/openssl/openssl/crypto/poly1305/asm/poly1305-armv8.pl
    +++ b/deps/openssl/openssl/crypto/poly1305/asm/poly1305-armv8.pl
    @@ -1,5 +1,5 @@
     #! /usr/bin/env perl
    -# Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved.
    +# Copyright 2016-2023 The OpenSSL Project Authors. All Rights Reserved.
     #
     # Licensed under the Apache License 2.0 (the "License").  You may not use
     # this file except in compliance with the License.  You can obtain a copy
    @@ -85,7 +85,7 @@
     	ldp	$r0,$r1,[$inp]		// load key
     	mov	$s1,#0xfffffffc0fffffff
     	movk	$s1,#0x0fff,lsl#48
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	$r0,$r0			// flip bytes
     	rev	$r1,$r1
     #endif
    @@ -132,7 +132,7 @@
     .Loop:
     	ldp	$t0,$t1,[$inp],#16	// load input
     	sub	$len,$len,#16
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	$t0,$t0
     	rev	$t1,$t1
     #endif
    @@ -197,13 +197,13 @@
     	csel	$h0,$h0,$d0,eq
     	csel	$h1,$h1,$d1,eq
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	ror	$t0,$t0,#32		// flip nonce words
     	ror	$t1,$t1,#32
     #endif
     	adds	$h0,$h0,$t0		// accumulate nonce
     	adc	$h1,$h1,$t1
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	$h0,$h0			// flip output bytes
     	rev	$h1,$h1
     #endif
    @@ -335,7 +335,7 @@
     	adcs	$h1,$h1,xzr
     	adc	$h2,$h2,xzr
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	$d0,$d0
     	rev	$d1,$d1
     #endif
    @@ -381,7 +381,7 @@
     	ldp	$d0,$d1,[$inp],#16	// load input
     	sub	$len,$len,#16
     	add	$s1,$r1,$r1,lsr#2	// s1 = r1 + (r1 >> 2)
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	$d0,$d0
     	rev	$d1,$d1
     #endif
    @@ -466,7 +466,7 @@
     	lsl	$padbit,$padbit,#24
     	add	x15,$ctx,#48
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x8,x8
     	rev	x12,x12
     	rev	x9,x9
    @@ -502,7 +502,7 @@
     	ld1	{$S2,$R3,$S3,$R4},[x15],#64
     	ld1	{$S4},[x15]
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	x8,x8
     	rev	x12,x12
     	rev	x9,x9
    @@ -563,7 +563,7 @@
     	umull	$ACC1,$IN23_0,${R1}[2]
     	 ldp	x9,x13,[$in2],#48
     	umull	$ACC0,$IN23_0,${R0}[2]
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	 rev	x8,x8
     	 rev	x12,x12
     	 rev	x9,x9
    @@ -628,7 +628,7 @@
     	umlal	$ACC4,$IN01_2,${R2}[0]
     	umlal	$ACC1,$IN01_2,${S4}[0]
     	umlal	$ACC2,$IN01_2,${R0}[0]
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	 rev	x8,x8
     	 rev	x12,x12
     	 rev	x9,x9
    @@ -909,13 +909,13 @@
     	csel	$h0,$h0,$d0,eq
     	csel	$h1,$h1,$d1,eq
     
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	ror	$t0,$t0,#32		// flip nonce words
     	ror	$t1,$t1,#32
     #endif
     	adds	$h0,$h0,$t0		// accumulate nonce
     	adc	$h1,$h1,$t1
    -#ifdef	__ARMEB__
    +#ifdef	__AARCH64EB__
     	rev	$h0,$h0			// flip output bytes
     	rev	$h1,$h1
     #endif
    diff --git a/deps/openssl/openssl/crypto/poly1305/asm/poly1305-x86_64.pl b/deps/openssl/openssl/crypto/poly1305/asm/poly1305-x86_64.pl
    index fa9bfb7a7b814c..4cddca1c514c04 100755
    --- a/deps/openssl/openssl/crypto/poly1305/asm/poly1305-x86_64.pl
    +++ b/deps/openssl/openssl/crypto/poly1305/asm/poly1305-x86_64.pl
    @@ -1,5 +1,5 @@
     #! /usr/bin/env perl
    -# Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved.
    +# Copyright 2016-2023 The OpenSSL Project Authors. All Rights Reserved.
     #
     # Licensed under the Apache License 2.0 (the "License").  You may not use
     # this file except in compliance with the License.  You can obtain a copy
    @@ -195,7 +195,7 @@ sub poly1305_iteration {
     	bt	\$`5+32`,%r9		# AVX2?
     	cmovc	%rax,%r10
     ___
    -$code.=<<___	if ($avx>3);
    +$code.=<<___	if ($avx>3 && !$win64);
     	mov	\$`(1<<31|1<<21|1<<16)`,%rax
     	shr	\$32,%r9
     	and	%rax,%r9
    @@ -2724,7 +2724,7 @@ sub poly1305_iteration {
     .cfi_endproc
     .size	poly1305_blocks_avx512,.-poly1305_blocks_avx512
     ___
    -if ($avx>3) {
    +if ($avx>3 && !$win64) {
     ########################################################################
     # VPMADD52 version using 2^44 radix.
     #
    diff --git a/deps/openssl/openssl/crypto/property/property.c b/deps/openssl/openssl/crypto/property/property.c
    index b97861d4862fa8..602db0f3ff54e9 100644
    --- a/deps/openssl/openssl/crypto/property/property.c
    +++ b/deps/openssl/openssl/crypto/property/property.c
    @@ -129,11 +129,11 @@ static const OSSL_LIB_CTX_METHOD ossl_ctx_global_properties_method = {
     };
     
     OSSL_PROPERTY_LIST **ossl_ctx_global_properties(OSSL_LIB_CTX *libctx,
    -                                                int loadconfig)
    +                                                ossl_unused int loadconfig)
     {
         OSSL_GLOBAL_PROPERTIES *globp;
     
    -#ifndef FIPS_MODULE
    +#if !defined(FIPS_MODULE) && !defined(OPENSSL_NO_AUTOLOAD_CONFIG)
         if (loadconfig && !OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CONFIG, NULL))
             return NULL;
     #endif
    @@ -513,7 +513,7 @@ int ossl_method_store_fetch(OSSL_METHOD_STORE *store,
         if (nid <= 0 || method == NULL || store == NULL)
             return 0;
     
    -#ifndef FIPS_MODULE
    +#if !defined(FIPS_MODULE) && !defined(OPENSSL_NO_AUTOLOAD_CONFIG)
         if (ossl_lib_ctx_is_default(store->ctx)
                 && !OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CONFIG, NULL))
             return 0;
    diff --git a/deps/openssl/openssl/crypto/property/property_parse.c b/deps/openssl/openssl/crypto/property/property_parse.c
    index ca2bd33381bfdd..e3a4998df11fcb 100644
    --- a/deps/openssl/openssl/crypto/property/property_parse.c
    +++ b/deps/openssl/openssl/crypto/property/property_parse.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2019-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2019-2023 The OpenSSL Project Authors. All Rights Reserved.
      * Copyright (c) 2019, Oracle and/or its affiliates.  All rights reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
    @@ -588,15 +588,38 @@ static void put_char(char ch, char **buf, size_t *remain, size_t *needed)
     
     static void put_str(const char *str, char **buf, size_t *remain, size_t *needed)
     {
    -    size_t olen, len;
    +    size_t olen, len, i;
    +    char quote = '\0';
    +    int quotes;
     
         len = olen = strlen(str);
         *needed += len;
     
    -    if (*remain == 0)
    +    /*
    +     * Check to see if we need quotes or not.
    +     * Characters that are legal in a PropertyName don't need quoting.
    +     * We simply assume all others require quotes.
    +     */
    +    for (i = 0; i < len; i++)
    +        if (!ossl_isalnum(str[i]) && str[i] != '.' && str[i] != '_') {
    +            /* Default to single quotes ... */
    +            if (quote == '\0')
    +                quote = '\'';
    +            /* ... but use double quotes if a single is present */
    +            if (str[i] == '\'')
    +                quote = '"';
    +        }
    +
    +    quotes = quote != '\0';
    +    if (*remain == 0) {
    +        *needed += 2 * quotes;
             return;
    +    }
     
    -    if (*remain < len + 1)
    +    if (quotes)
    +        put_char(quote, buf, remain, needed);
    +
    +    if (*remain < len + 1 + quotes)
             len = *remain - 1;
     
         if (len > 0) {
    @@ -605,6 +628,9 @@ static void put_str(const char *str, char **buf, size_t *remain, size_t *needed)
             *remain -= len;
         }
     
    +    if (quotes)
    +        put_char(quote, buf, remain, needed);
    +
         if (len < olen && *remain == 1) {
             **buf = '\0';
             ++*buf;
    diff --git a/deps/openssl/openssl/crypto/provider_core.c b/deps/openssl/openssl/crypto/provider_core.c
    index 7a12328121623e..92cce32c5bbf88 100644
    --- a/deps/openssl/openssl/crypto/provider_core.c
    +++ b/deps/openssl/openssl/crypto/provider_core.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2019-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2019-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -408,7 +408,7 @@ int ossl_provider_info_add_to_store(OSSL_LIB_CTX *libctx,
     }
     
     OSSL_PROVIDER *ossl_provider_find(OSSL_LIB_CTX *libctx, const char *name,
    -                                  int noconfig)
    +                                  ossl_unused int noconfig)
     {
         struct provider_store_st *store = NULL;
         OSSL_PROVIDER *prov = NULL;
    @@ -417,7 +417,7 @@ OSSL_PROVIDER *ossl_provider_find(OSSL_LIB_CTX *libctx, const char *name,
             OSSL_PROVIDER tmpl = { 0, };
             int i;
     
    -#ifndef FIPS_MODULE
    +#if !defined(FIPS_MODULE) && !defined(OPENSSL_NO_AUTOLOAD_CONFIG)
             /*
              * Make sure any providers are loaded from config before we try to find
              * them.
    @@ -1356,7 +1356,7 @@ int ossl_provider_doall_activated(OSSL_LIB_CTX *ctx,
         struct provider_store_st *store = get_provider_store(ctx);
         STACK_OF(OSSL_PROVIDER) *provs = NULL;
     
    -#ifndef FIPS_MODULE
    +#if !defined(FIPS_MODULE) && !defined(OPENSSL_NO_AUTOLOAD_CONFIG)
         /*
          * Make sure any providers are loaded from config before we try to use
          * them.
    diff --git a/deps/openssl/openssl/crypto/rsa/rsa_ameth.c b/deps/openssl/openssl/crypto/rsa/rsa_ameth.c
    index e819780e7d9439..07734077e3228a 100644
    --- a/deps/openssl/openssl/crypto/rsa/rsa_ameth.c
    +++ b/deps/openssl/openssl/crypto/rsa/rsa_ameth.c
    @@ -60,13 +60,16 @@ static int rsa_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey)
         if (!rsa_param_encode(pkey, &str, &strtype))
             return 0;
         penclen = i2d_RSAPublicKey(pkey->pkey.rsa, &penc);
    -    if (penclen <= 0)
    +    if (penclen <= 0) {
    +        ASN1_STRING_free(str);
             return 0;
    +    }
         if (X509_PUBKEY_set0_param(pk, OBJ_nid2obj(pkey->ameth->pkey_id),
                                    strtype, str, penc, penclen))
             return 1;
     
         OPENSSL_free(penc);
    +    ASN1_STRING_free(str);
         return 0;
     }
     
    diff --git a/deps/openssl/openssl/crypto/rsa/rsa_backend.c b/deps/openssl/openssl/crypto/rsa/rsa_backend.c
    index 58187fa2ef59df..f9d1cb361d7704 100644
    --- a/deps/openssl/openssl/crypto/rsa/rsa_backend.c
    +++ b/deps/openssl/openssl/crypto/rsa/rsa_backend.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2020-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2020-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -141,18 +141,6 @@ int ossl_rsa_todata(RSA *rsa, OSSL_PARAM_BLD *bld, OSSL_PARAM params[],
     
         /* Check private key data integrity */
         if (include_private && rsa_d != NULL) {
    -        int numprimes = sk_BIGNUM_const_num(factors);
    -        int numexps = sk_BIGNUM_const_num(exps);
    -        int numcoeffs = sk_BIGNUM_const_num(coeffs);
    -
    -        /*
    -         * It's permissible to have zero primes, i.e. no CRT params.
    -         * Otherwise, there must be at least two, as many exponents,
    -         * and one coefficient less.
    -         */
    -        if (numprimes != 0
    -            && (numprimes < 2 || numexps < 2 || numcoeffs < 1))
    -            goto err;
     
             if (!ossl_param_build_set_bn(bld, params, OSSL_PKEY_PARAM_RSA_D,
                                          rsa_d)
    diff --git a/deps/openssl/openssl/crypto/rsa/rsa_lib.c b/deps/openssl/openssl/crypto/rsa/rsa_lib.c
    index 449097b8b27afc..71a17a92349d3b 100644
    --- a/deps/openssl/openssl/crypto/rsa/rsa_lib.c
    +++ b/deps/openssl/openssl/crypto/rsa/rsa_lib.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -753,18 +753,22 @@ int ossl_rsa_set0_all_params(RSA *r, const STACK_OF(BIGNUM) *primes,
             return 0;
     
         pnum = sk_BIGNUM_num(primes);
    -    if (pnum < 2
    -        || pnum != sk_BIGNUM_num(exps)
    -        || pnum != sk_BIGNUM_num(coeffs) + 1)
    +    if (pnum < 2)
             return 0;
     
         if (!RSA_set0_factors(r, sk_BIGNUM_value(primes, 0),
    -                          sk_BIGNUM_value(primes, 1))
    -        || !RSA_set0_crt_params(r, sk_BIGNUM_value(exps, 0),
    -                                sk_BIGNUM_value(exps, 1),
    -                                sk_BIGNUM_value(coeffs, 0)))
    +                          sk_BIGNUM_value(primes, 1)))
             return 0;
     
    +    if (pnum == sk_BIGNUM_num(exps)
    +        && pnum == sk_BIGNUM_num(coeffs) + 1) {
    +
    +        if (!RSA_set0_crt_params(r, sk_BIGNUM_value(exps, 0),
    +                                 sk_BIGNUM_value(exps, 1),
    +                                 sk_BIGNUM_value(coeffs, 0)))
    +        return 0;
    +    }
    +
     #ifndef FIPS_MODULE
         old_infos = r->prime_infos;
     #endif
    @@ -1084,6 +1088,12 @@ int EVP_PKEY_CTX_get_rsa_mgf1_md(EVP_PKEY_CTX *ctx, const EVP_MD **md)
     int EVP_PKEY_CTX_set0_rsa_oaep_label(EVP_PKEY_CTX *ctx, void *label, int llen)
     {
         OSSL_PARAM rsa_params[2], *p = rsa_params;
    +    const char *empty = "";
    +    /*
    +     * Needed as we swap label with empty if it is NULL, and label is
    +     * freed at the end of this function.
    +     */
    +    void *plabel = label;
         int ret;
     
         if (ctx == NULL || !EVP_PKEY_CTX_IS_ASYM_CIPHER_OP(ctx)) {
    @@ -1096,9 +1106,13 @@ int EVP_PKEY_CTX_set0_rsa_oaep_label(EVP_PKEY_CTX *ctx, void *label, int llen)
         if (!EVP_PKEY_CTX_is_a(ctx, "RSA"))
             return -1;
     
    +    /* Accept NULL for backward compatibility */
    +    if (label == NULL && llen == 0)
    +        plabel = (void *)empty;
    +
         /* Cast away the const. This is read only so should be safe */
         *p++ = OSSL_PARAM_construct_octet_string(OSSL_ASYM_CIPHER_PARAM_OAEP_LABEL,
    -                                             (void *)label, (size_t)llen);
    +                                             (void *)plabel, (size_t)llen);
         *p++ = OSSL_PARAM_construct_end();
     
         ret = evp_pkey_ctx_set_params_strict(ctx, rsa_params);
    diff --git a/deps/openssl/openssl/crypto/srp/srp_vfy.c b/deps/openssl/openssl/crypto/srp/srp_vfy.c
    index e8beb60d278a08..96d511ffe6368e 100644
    --- a/deps/openssl/openssl/crypto/srp/srp_vfy.c
    +++ b/deps/openssl/openssl/crypto/srp/srp_vfy.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2004-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2004-2023 The OpenSSL Project Authors. All Rights Reserved.
      * Copyright (c) 2004, EdelKey Project. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
    @@ -283,6 +283,7 @@ SRP_VBASE *SRP_VBASE_new(char *seed_key)
             return NULL;
         if ((vb->users_pwd = sk_SRP_user_pwd_new_null()) == NULL
             || (vb->gN_cache = sk_SRP_gN_cache_new_null()) == NULL) {
    +        sk_SRP_user_pwd_free(vb->users_pwd);
             OPENSSL_free(vb);
             return NULL;
         }
    diff --git a/deps/openssl/openssl/crypto/store/store_lib.c b/deps/openssl/openssl/crypto/store/store_lib.c
    index 5ff927862916e5..bc12d8dd13a28e 100644
    --- a/deps/openssl/openssl/crypto/store/store_lib.c
    +++ b/deps/openssl/openssl/crypto/store/store_lib.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2016-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2016-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -424,14 +424,14 @@ OSSL_STORE_INFO *OSSL_STORE_load(OSSL_STORE_CTX *ctx)
     
                 load_data.v = NULL;
                 load_data.ctx = ctx;
    +            ctx->error_flag = 0;
     
                 if (!ctx->fetched_loader->p_load(ctx->loader_ctx,
                                                  ossl_store_handle_load_result,
                                                  &load_data,
                                                  ossl_pw_passphrase_callback_dec,
                                                  &ctx->pwdata)) {
    -                if (!OSSL_STORE_eof(ctx))
    -                    ctx->error_flag = 1;
    +                ctx->error_flag = 1;
                     return NULL;
                 }
                 v = load_data.v;
    diff --git a/deps/openssl/openssl/crypto/threads_pthread.c b/deps/openssl/openssl/crypto/threads_pthread.c
    index bfc05a4e878c25..801855c9306e20 100644
    --- a/deps/openssl/openssl/crypto/threads_pthread.c
    +++ b/deps/openssl/openssl/crypto/threads_pthread.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2016-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2016-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -72,8 +72,6 @@ CRYPTO_RWLOCK *CRYPTO_THREAD_lock_new(void)
     #  if !defined (__TANDEM) && !defined (_SPT_MODEL_)
     #   if !defined(NDEBUG) && !defined(OPENSSL_NO_MUTEX_ERRORCHECK)
         pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
    -#   else
    -    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL);
     #   endif
     #  else
         /* The SPT Thread Library does not define MUTEX attributes. */
    diff --git a/deps/openssl/openssl/crypto/x509/v3_ist.c b/deps/openssl/openssl/crypto/x509/v3_ist.c
    index e6fef0153c8eb2..4a3cfa12a471b6 100644
    --- a/deps/openssl/openssl/crypto/x509/v3_ist.c
    +++ b/deps/openssl/openssl/crypto/x509/v3_ist.c
    @@ -51,25 +51,25 @@ static ISSUER_SIGN_TOOL *v2i_issuer_sign_tool(X509V3_EXT_METHOD *method, X509V3_
             if (strcmp(cnf->name, "signTool") == 0) {
                 ist->signTool = ASN1_UTF8STRING_new();
                 if (ist->signTool == NULL || !ASN1_STRING_set(ist->signTool, cnf->value, strlen(cnf->value))) {
    -                ERR_raise(ERR_LIB_X509V3, ERR_R_ASN1_LIB);
    +                ERR_raise(ERR_LIB_X509V3, ERR_R_MALLOC_FAILURE);
                     goto err;
                 }
             } else if (strcmp(cnf->name, "cATool") == 0) {
                 ist->cATool = ASN1_UTF8STRING_new();
                 if (ist->cATool == NULL || !ASN1_STRING_set(ist->cATool, cnf->value, strlen(cnf->value))) {
    -                ERR_raise(ERR_LIB_X509V3, ERR_R_ASN1_LIB);
    +                ERR_raise(ERR_LIB_X509V3, ERR_R_MALLOC_FAILURE);
                     goto err;
                 }
             } else if (strcmp(cnf->name, "signToolCert") == 0) {
                 ist->signToolCert = ASN1_UTF8STRING_new();
                 if (ist->signToolCert == NULL || !ASN1_STRING_set(ist->signToolCert, cnf->value, strlen(cnf->value))) {
    -                ERR_raise(ERR_LIB_X509V3, ERR_R_ASN1_LIB);
    +                ERR_raise(ERR_LIB_X509V3, ERR_R_MALLOC_FAILURE);
                     goto err;
                 }
             } else if (strcmp(cnf->name, "cAToolCert") == 0) {
                 ist->cAToolCert = ASN1_UTF8STRING_new();
                 if (ist->cAToolCert == NULL || !ASN1_STRING_set(ist->cAToolCert, cnf->value, strlen(cnf->value))) {
    -                ERR_raise(ERR_LIB_X509V3, ERR_R_ASN1_LIB);
    +                ERR_raise(ERR_LIB_X509V3, ERR_R_MALLOC_FAILURE);
                     goto err;
                 }
             } else {
    diff --git a/deps/openssl/openssl/crypto/x509/x509_cmp.c b/deps/openssl/openssl/crypto/x509/x509_cmp.c
    index 1027bed82e69da..989fb8faa9f465 100644
    --- a/deps/openssl/openssl/crypto/x509/x509_cmp.c
    +++ b/deps/openssl/openssl/crypto/x509/x509_cmp.c
    @@ -292,12 +292,13 @@ unsigned long X509_NAME_hash_ex(const X509_NAME *x, OSSL_LIB_CTX *libctx,
         unsigned long ret = 0;
         unsigned char md[SHA_DIGEST_LENGTH];
         EVP_MD *sha1 = EVP_MD_fetch(libctx, "SHA1", propq);
    +    int i2d_ret;
     
         /* Make sure X509_NAME structure contains valid cached encoding */
    -    i2d_X509_NAME(x, NULL);
    +    i2d_ret = i2d_X509_NAME(x, NULL);
         if (ok != NULL)
             *ok = 0;
    -    if (sha1 != NULL
    +    if (i2d_ret >= 0 && sha1 != NULL
             && EVP_Digest(x->canon_enc, x->canon_enclen, md, NULL, sha1, NULL)) {
             ret = (((unsigned long)md[0]) | ((unsigned long)md[1] << 8L) |
                    ((unsigned long)md[2] << 16L) | ((unsigned long)md[3] << 24L)
    @@ -325,7 +326,9 @@ unsigned long X509_NAME_hash_old(const X509_NAME *x)
             goto end;
     
         /* Make sure X509_NAME structure contains valid cached encoding */
    -    i2d_X509_NAME(x, NULL);
    +    if (i2d_X509_NAME(x, NULL) < 0)
    +        goto end;
    +
         if (EVP_DigestInit_ex(md_ctx, md5, NULL)
             && EVP_DigestUpdate(md_ctx, x->bytes->data, x->bytes->length)
             && EVP_DigestFinal_ex(md_ctx, md, NULL))
    diff --git a/deps/openssl/openssl/doc/man1/openssl-cmp.pod.in b/deps/openssl/openssl/doc/man1/openssl-cmp.pod.in
    index 4250deb426fc15..9240916fce40fe 100644
    --- a/deps/openssl/openssl/doc/man1/openssl-cmp.pod.in
    +++ b/deps/openssl/openssl/doc/man1/openssl-cmp.pod.in
    @@ -659,11 +659,12 @@ is typically used when authenticating with pre-shared key (password-based MAC).
     
     =item B<-secret> I
     
    -Prefer PBM-based message protection with given source of a secret value.
    -The secret is used for creating PBM-based protection of outgoing messages
    -and (as far as needed) for validating PBM-based protection of incoming messages.
    -PBM stands for Password-Based Message Authentication Code.
    +Provides the source of a secret value to use with MAC-based message protection.
     This takes precedence over the B<-cert> and B<-key> options.
    +The secret is used for creating MAC-based protection of outgoing messages
    +and for validating incoming messages that have MAC-based protection.
    +The algorithm used by default is Password-Based Message Authentication Code (PBM)
    +as defined in RFC 4210 section 5.1.3.1.
     
     For more information about the format of I see
     L.
    @@ -682,7 +683,8 @@ while the subject of B<-oldcert> or B<-subjectName> may provide fallback values.
     The issuer of this certificate is used as one of the recipient fallback values
     and as fallback issuer entry in the certificate template of IR/CR/KUR messages.
     
    -When using signature-based message protection, this "protection certificate"
    +When performing signature-based message protection,
    +this "protection certificate", also called "signer certificate",
     will be included first in the extraCerts field of outgoing messages
     and the signature is done with the corresponding key.
     In Initialization Request (IR) messages this can be used for authenticating
    @@ -713,8 +715,8 @@ have no effect on the certificate verification enabled via this option.
     
     The corresponding private key file for the client's current certificate given in
     the B<-cert> option.
    -This will be used for signature-based message protection unless
    -the B<-secret> option indicating PBM or B<-unprotected_requests> is given.
    +This will be used for signature-based message protection unless the B<-secret>
    +option indicating MAC-based protection or B<-unprotected_requests> is given.
     
     It is also used as a fallback for the B<-newkey> option with IR/CR/KUR messages.
     
    @@ -730,7 +732,7 @@ L.
     =item B<-digest> I
     
     Specifies name of supported digest to use in RFC 4210's MSG_SIG_ALG
    -and as the one-way function (OWF) in MSG_MAC_ALG.
    +and as the one-way function (OWF) in C.
     If applicable, this is used for message protection and
     proof-of-possession (POPO) signatures.
     To see the list of supported digests, use C.
    @@ -738,7 +740,7 @@ Defaults to C.
     
     =item B<-mac> I
     
    -Specifies the name of the MAC algorithm in MSG_MAC_ALG.
    +Specifies the name of the MAC algorithm in C.
     To get the names of supported MAC algorithms use C
     and possibly combine such a name with the name of a supported digest algorithm,
     e.g., hmacWithSHA256.
    @@ -1097,6 +1099,13 @@ only affect the certificate verification enabled via the B<-out_trusted> option.
     
     =head1 NOTES
     
    +When a client obtains from a CMP server CA certificates that it is going to
    +trust, for instance via the C field of a certificate response,
    +authentication of the CMP server is particularly critical.
    +So special care must be taken setting up server authentication
    +using B<-trusted> and related options for certificate-based authentication
    +or B<-secret> for MAC-based protection.
    +
     When setting up CMP configurations and experimenting with enrollment options
     typically various errors occur until the configuration is correct and complete.
     When the CMP server reports an error the client will by default
    @@ -1166,7 +1175,7 @@ In order to update the enrolled certificate one may call
     
       openssl cmp -section insta,kur
     
    -using with PBM-based protection or
    +using MAC-based protection with PBM or
     
       openssl cmp -section insta,kur,signature
     
    @@ -1225,7 +1234,7 @@ Then it can start using the new cert and key.
         -newkey cl_key_new.pem -certout cl_cert.pem
       cp cl_key_new.pem cl_key.pem
     
    -This command sequence can be repated as often as needed.
    +This command sequence can be repeated as often as needed.
     
     =head2 Requesting information from CMP server
     
    diff --git a/deps/openssl/openssl/doc/man1/openssl-cms.pod.in b/deps/openssl/openssl/doc/man1/openssl-cms.pod.in
    index c63a7f330ba636..65a61ee97f1d6a 100644
    --- a/deps/openssl/openssl/doc/man1/openssl-cms.pod.in
    +++ b/deps/openssl/openssl/doc/man1/openssl-cms.pod.in
    @@ -391,7 +391,7 @@ option.
     =item I ...
     
     This is an alternative to using the B<-recip> option when encrypting a message.
    -One or more certificate filennames may be given.
    +One or more certificate filenames may be given.
     
     =item B<-I>
     
    @@ -902,7 +902,7 @@ The B<-engine> option was deprecated in OpenSSL 3.0.
     
     =head1 COPYRIGHT
     
    -Copyright 2008-2021 The OpenSSL Project Authors. All Rights Reserved.
    +Copyright 2008-2023 The OpenSSL Project Authors. All Rights Reserved.
     
     Licensed under the Apache License 2.0 (the "License").  You may not use
     this file except in compliance with the License.  You can obtain a copy
    diff --git a/deps/openssl/openssl/doc/man1/openssl-ts.pod.in b/deps/openssl/openssl/doc/man1/openssl-ts.pod.in
    index 6f718202024757..3e7f7c4be94b2d 100644
    --- a/deps/openssl/openssl/doc/man1/openssl-ts.pod.in
    +++ b/deps/openssl/openssl/doc/man1/openssl-ts.pod.in
    @@ -490,7 +490,7 @@ Default is no.  (Optional)
     =item B
     
     This option specifies the hash function to be used to calculate the TSA's
    -public key certificate identifier. Default is sha256. (Optional)
    +public key certificate identifier. Default is sha1. (Optional)
     
     =back
     
    @@ -652,7 +652,7 @@ L
     
     =head1 COPYRIGHT
     
    -Copyright 2006-2021 The OpenSSL Project Authors. All Rights Reserved.
    +Copyright 2006-2023 The OpenSSL Project Authors. All Rights Reserved.
     
     Licensed under the Apache License 2.0 (the "License").  You may not use
     this file except in compliance with the License.  You can obtain a copy
    diff --git a/deps/openssl/openssl/doc/man3/BIO_s_mem.pod b/deps/openssl/openssl/doc/man3/BIO_s_mem.pod
    index 6b3cc6a2dae943..3bbc3e7fcf02c9 100644
    --- a/deps/openssl/openssl/doc/man3/BIO_s_mem.pod
    +++ b/deps/openssl/openssl/doc/man3/BIO_s_mem.pod
    @@ -59,6 +59,8 @@ positive return value B should be set to a negative value, typically -1.
     
     BIO_get_mem_data() sets *B to a pointer to the start of the memory BIOs data
     and returns the total amount of data available. It is implemented as a macro.
    +Note the pointer returned by this call is informative, no transfer of ownership
    +of this memory is implied.  See notes on BIO_set_close().
     
     BIO_set_mem_buf() sets the internal BUF_MEM structure to B and sets the
     close flag to B, that is B should be either BIO_CLOSE or BIO_NOCLOSE.
    @@ -114,6 +116,10 @@ preceding that write operation cannot be undone.
     Calling BIO_get_mem_ptr() prior to a BIO_reset() call with
     BIO_FLAGS_NONCLEAR_RST set has the same effect as a write operation.
     
    +Calling BIO_set_close() with BIO_NOCLOSE orphans the BUF_MEM internal to the
    +BIO, _not_ its actual data buffer. See the examples section for the proper
    +method for claiming ownership of the data pointer for a deferred free operation.
    +
     =head1 BUGS
     
     There should be an option to set the maximum size of a memory BIO.
    @@ -151,10 +157,24 @@ Extract the BUF_MEM structure from a memory BIO and then free up the BIO:
      BIO_set_close(mem, BIO_NOCLOSE); /* So BIO_free() leaves BUF_MEM alone */
      BIO_free(mem);
     
    +Extract the BUF_MEM ptr, claim ownership of the internal data and free the BIO
    +and BUF_MEM structure:
    +
    + BUF_MEM *bptr;
    + char *data;
    +
    + BIO_get_mem_data(bio, &data);
    + BIO_get_mem_ptr(bio, &bptr);
    + BIO_set_close(mem, BIO_NOCLOSE); /* So BIO_free orphans BUF_MEM */
    + BIO_free(bio);
    + bptr->data = NULL; /* Tell BUF_MEM to orphan data */
    + BUF_MEM_free(bptr);
    + ...
    + free(data);
     
     =head1 COPYRIGHT
     
    -Copyright 2000-2020 The OpenSSL Project Authors. All Rights Reserved.
    +Copyright 2000-2023 The OpenSSL Project Authors. All Rights Reserved.
     
     Licensed under the Apache License 2.0 (the "License").  You may not use
     this file except in compliance with the License.  You can obtain a copy
    diff --git a/deps/openssl/openssl/doc/man3/CMS_add1_signer.pod b/deps/openssl/openssl/doc/man3/CMS_add1_signer.pod
    index 800085b7b86a9b..d606a02cc1fd81 100644
    --- a/deps/openssl/openssl/doc/man3/CMS_add1_signer.pod
    +++ b/deps/openssl/openssl/doc/man3/CMS_add1_signer.pod
    @@ -31,8 +31,8 @@ Unless the B flag is set the returned CMS_ContentInfo
     structure is not complete and must be finalized either by streaming (if
     applicable) or a call to CMS_final().
     
    -The CMS_SignerInfo_sign() function will explicitly sign a CMS_SignerInfo
    -structure, its main use is when B and B flags
    +The CMS_SignerInfo_sign() function explicitly signs a CMS_SignerInfo
    +structure, its main use is when the B and B flags
     are both set.
     
     =head1 NOTES
    @@ -90,6 +90,8 @@ before it is finalized.
     CMS_add1_signer() returns an internal pointer to the CMS_SignerInfo
     structure just added or NULL if an error occurs.
     
    +CMS_SignerInfo_sign() returns 1 on success, 0 on failure.
    +
     =head1 SEE ALSO
     
     L, L,
    @@ -97,7 +99,7 @@ L,
     
     =head1 COPYRIGHT
     
    -Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved.
    +Copyright 2014-2023 The OpenSSL Project Authors. All Rights Reserved.
     
     Licensed under the Apache License 2.0 (the "License").  You may not use
     this file except in compliance with the License.  You can obtain a copy
    diff --git a/deps/openssl/openssl/doc/man3/CMS_sign.pod b/deps/openssl/openssl/doc/man3/CMS_sign.pod
    index 0d812756aef551..03bfc6fce16a74 100644
    --- a/deps/openssl/openssl/doc/man3/CMS_sign.pod
    +++ b/deps/openssl/openssl/doc/man3/CMS_sign.pod
    @@ -105,7 +105,7 @@ The function CMS_sign() is a basic CMS signing function whose output will be
     suitable for many purposes. For finer control of the output format the
     B, B and B parameters can all be B and the
     B flag set. Then one or more signers can be added using the
    -function CMS_sign_add1_signer(), non default digests can be used and custom
    +function CMS_add1_signer(), non default digests can be used and custom
     attributes added. CMS_final() must then be called to finalize the
     structure if streaming is not enabled.
     
    @@ -132,7 +132,7 @@ The CMS_sign_ex() method was added in OpenSSL 3.0.
     
     =head1 COPYRIGHT
     
    -Copyright 2008-2020 The OpenSSL Project Authors. All Rights Reserved.
    +Copyright 2008-2023 The OpenSSL Project Authors. All Rights Reserved.
     
     Licensed under the Apache License 2.0 (the "License").  You may not use
     this file except in compliance with the License.  You can obtain a copy
    diff --git a/deps/openssl/openssl/doc/man3/DH_generate_parameters.pod b/deps/openssl/openssl/doc/man3/DH_generate_parameters.pod
    index 1098a161ea63f2..9c1dff7aedd9ab 100644
    --- a/deps/openssl/openssl/doc/man3/DH_generate_parameters.pod
    +++ b/deps/openssl/openssl/doc/man3/DH_generate_parameters.pod
    @@ -128,6 +128,10 @@ The parameter B is invalid.
     
     =back
     
    +If 0 is returned or B<*codes> is set to a nonzero value the supplied
    +parameters should not be used for Diffie-Hellman operations otherwise
    +the security properties of the key exchange are not guaranteed.
    +
     DH_check_ex(), DH_check_params() and DH_check_pub_key_ex() are similar to
     DH_check() and DH_check_params() respectively, but the error reasons are added
     to the thread's error queue instead of provided as return values from the
    @@ -160,7 +164,7 @@ DH_generate_parameters_ex() instead.
     
     =head1 COPYRIGHT
     
    -Copyright 2000-2021 The OpenSSL Project Authors. All Rights Reserved.
    +Copyright 2000-2023 The OpenSSL Project Authors. All Rights Reserved.
     
     Licensed under the Apache License 2.0 (the "License").  You may not use
     this file except in compliance with the License.  You can obtain a copy
    diff --git a/deps/openssl/openssl/doc/man3/DSA_generate_parameters.pod b/deps/openssl/openssl/doc/man3/DSA_generate_parameters.pod
    index 415c4c8b82ce74..a10dc9ba275940 100644
    --- a/deps/openssl/openssl/doc/man3/DSA_generate_parameters.pod
    +++ b/deps/openssl/openssl/doc/man3/DSA_generate_parameters.pod
    @@ -51,7 +51,7 @@ called as shown below. For information on the BN_GENCB structure and the
     BN_GENCB_call function discussed below, refer to
     L.
     
    -DSA_generate_prime() is similar to DSA_generate_prime_ex() but
    +DSA_generate_parameters() is similar to DSA_generate_parameters_ex() but
     expects an old-style callback function; see
     L for information on the old-style callback.
     
    @@ -126,7 +126,7 @@ DSA_generate_parameters_ex() instead.
     
     =head1 COPYRIGHT
     
    -Copyright 2000-2021 The OpenSSL Project Authors. All Rights Reserved.
    +Copyright 2000-2023 The OpenSSL Project Authors. All Rights Reserved.
     
     Licensed under the Apache License 2.0 (the "License").  You may not use
     this file except in compliance with the License.  You can obtain a copy
    diff --git a/deps/openssl/openssl/doc/man3/EVP_MAC.pod b/deps/openssl/openssl/doc/man3/EVP_MAC.pod
    index 13482ac5e188e7..56ac92a486728e 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_MAC.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_MAC.pod
    @@ -181,7 +181,7 @@ EVP_MAC_CTX_set_params() passes chosen parameters to the underlying
     context, given a context I.
     The set of parameters given with I determine exactly what
     parameters are passed down.
    -If I are NULL, the unterlying context should do nothing and return 1.
    +If I are NULL, the underlying context should do nothing and return 1.
     Note that a parameter that is unknown in the underlying context is
     simply ignored.
     Also, what happens when a needed parameter isn't passed down is
    @@ -481,7 +481,7 @@ These functions were added in OpenSSL 3.0.
     
     =head1 COPYRIGHT
     
    -Copyright 2018-2021 The OpenSSL Project Authors. All Rights Reserved.
    +Copyright 2018-2023 The OpenSSL Project Authors. All Rights Reserved.
     
     Licensed under the Apache License 2.0 (the "License").  You may not use
     this file except in compliance with the License.  You can obtain a copy
    diff --git a/deps/openssl/openssl/doc/man3/EVP_SIGNATURE.pod b/deps/openssl/openssl/doc/man3/EVP_SIGNATURE.pod
    index 600522085398c2..1f534ef33810eb 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_SIGNATURE.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_SIGNATURE.pod
    @@ -61,7 +61,7 @@ EVP_SIGNATURE_get0_provider() returns the provider that I was
     fetched from.
     
     EVP_SIGNATURE_do_all_provided() traverses all SIGNATURE implemented by all
    -activated roviders in the given library context I, and for each of the
    +activated providers in the given library context I, and for each of the
     implementations, calls the given function I with the implementation method
     and the given I as argument.
     
    @@ -106,7 +106,7 @@ The functions described here were added in OpenSSL 3.0.
     
     =head1 COPYRIGHT
     
    -Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved.
    +Copyright 2019-2023 The OpenSSL Project Authors. All Rights Reserved.
     
     Licensed under the Apache License 2.0 (the "License").  You may not use
     this file except in compliance with the License.  You can obtain a copy
    diff --git a/deps/openssl/openssl/doc/man3/EVP_aes_128_gcm.pod b/deps/openssl/openssl/doc/man3/EVP_aes_128_gcm.pod
    index 09cae991295049..485705ea788907 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_aes_128_gcm.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_aes_128_gcm.pod
    @@ -134,13 +134,7 @@ section for details.
     EVP_aes_192_wrap(),
     EVP_aes_256_wrap(),
     EVP_aes_128_wrap_pad(),
    -EVP_aes_128_wrap(),
    -EVP_aes_192_wrap(),
    -EVP_aes_256_wrap(),
     EVP_aes_192_wrap_pad(),
    -EVP_aes_128_wrap(),
    -EVP_aes_192_wrap(),
    -EVP_aes_256_wrap(),
     EVP_aes_256_wrap_pad()
     
     AES key wrap with 128, 192 and 256 bit keys, as according to RFC 3394 section
    @@ -173,7 +167,7 @@ the XTS "tweak" value.
     
     Developers should be aware of the negative performance implications of
     calling these functions multiple times and should consider using
    -L instead.
    +L with L instead.
     See L for further information.
     
     =head1 RETURN VALUES
    diff --git a/deps/openssl/openssl/doc/man3/EVP_aria_128_gcm.pod b/deps/openssl/openssl/doc/man3/EVP_aria_128_gcm.pod
    index 92913652630d52..91aa75ec387172 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_aria_128_gcm.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_aria_128_gcm.pod
    @@ -96,7 +96,7 @@ correctly, see the L section for details.
     
     Developers should be aware of the negative performance implications of
     calling these functions multiple times and should consider using
    -L instead.
    +L with L instead.
     See L for further information.
     
     =head1 RETURN VALUES
    diff --git a/deps/openssl/openssl/doc/man3/EVP_bf_cbc.pod b/deps/openssl/openssl/doc/man3/EVP_bf_cbc.pod
    index 4df98f4bdf47ec..11a909207ac954 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_bf_cbc.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_bf_cbc.pod
    @@ -41,7 +41,7 @@ Blowfish encryption algorithm in CBC, CFB, ECB and OFB modes respectively.
     
     Developers should be aware of the negative performance implications of
     calling these functions multiple times and should consider using
    -L instead.
    +L with L instead.
     See L for further information.
     
     =head1 RETURN VALUES
    diff --git a/deps/openssl/openssl/doc/man3/EVP_blake2b512.pod b/deps/openssl/openssl/doc/man3/EVP_blake2b512.pod
    index 98e1899f6a935d..55bd9f3bce77db 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_blake2b512.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_blake2b512.pod
    @@ -35,7 +35,7 @@ The BLAKE2b algorithm that produces a 512-bit output from a given input.
     
     Developers should be aware of the negative performance implications of
     calling these functions multiple times and should consider using
    -L instead.
    +L with L instead.
     See L for further information.
     
     While the BLAKE2b and BLAKE2s algorithms supports a variable length digest,
    diff --git a/deps/openssl/openssl/doc/man3/EVP_camellia_128_ecb.pod b/deps/openssl/openssl/doc/man3/EVP_camellia_128_ecb.pod
    index a6b597156a77a9..cb6e12e2122b76 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_camellia_128_ecb.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_camellia_128_ecb.pod
    @@ -79,7 +79,7 @@ Camellia for 128, 192 and 256 bit keys in the following modes: CBC, CFB with
     
     Developers should be aware of the negative performance implications of
     calling these functions multiple times and should consider using
    -L instead.
    +L with L instead.
     See L for further information.
     
     =head1 RETURN VALUES
    diff --git a/deps/openssl/openssl/doc/man3/EVP_cast5_cbc.pod b/deps/openssl/openssl/doc/man3/EVP_cast5_cbc.pod
    index 85ff2ad014888f..7fef0598151d85 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_cast5_cbc.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_cast5_cbc.pod
    @@ -41,7 +41,7 @@ CAST encryption algorithm in CBC, ECB, CFB and OFB modes respectively.
     
     Developers should be aware of the negative performance implications of
     calling these functions multiple times and should consider using
    -L instead.
    +L with L instead.
     See L for further information.
     
     =head1 RETURN VALUES
    diff --git a/deps/openssl/openssl/doc/man3/EVP_chacha20.pod b/deps/openssl/openssl/doc/man3/EVP_chacha20.pod
    index 683faa326e1453..7e80c8de40c9ec 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_chacha20.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_chacha20.pod
    @@ -44,7 +44,7 @@ L section for more information.
     
     Developers should be aware of the negative performance implications of
     calling these functions multiple times and should consider using
    -L instead.
    +L with L instead.
     See L for further information.
     
     L
    diff --git a/deps/openssl/openssl/doc/man3/EVP_des_cbc.pod b/deps/openssl/openssl/doc/man3/EVP_des_cbc.pod
    index 501216cd6d77b3..442be8993a29f7 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_des_cbc.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_des_cbc.pod
    @@ -89,7 +89,7 @@ Triple-DES key wrap according to RFC 3217 Section 3.
     
     Developers should be aware of the negative performance implications of
     calling these functions multiple times and should consider using
    -L instead.
    +L with L instead.
     See L for further information.
     
     =head1 RETURN VALUES
    diff --git a/deps/openssl/openssl/doc/man3/EVP_desx_cbc.pod b/deps/openssl/openssl/doc/man3/EVP_desx_cbc.pod
    index fae827192ee995..c22c0de47900c8 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_desx_cbc.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_desx_cbc.pod
    @@ -31,7 +31,7 @@ implementation.
     
     Developers should be aware of the negative performance implications of
     calling this function multiple times and should consider using
    -L instead.
    +L with L instead.
     See L for further information.
     
     =head1 RETURN VALUES
    diff --git a/deps/openssl/openssl/doc/man3/EVP_idea_cbc.pod b/deps/openssl/openssl/doc/man3/EVP_idea_cbc.pod
    index 5a9adaedc4462c..a36aae0bc999e3 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_idea_cbc.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_idea_cbc.pod
    @@ -39,7 +39,7 @@ The IDEA encryption algorithm in CBC, CFB, ECB and OFB modes respectively.
     
     Developers should be aware of the negative performance implications of
     calling these functions multiple times and should consider using
    -L instead.
    +L with L instead.
     See L for further information.
     
     =head1 RETURN VALUES
    diff --git a/deps/openssl/openssl/doc/man3/EVP_md2.pod b/deps/openssl/openssl/doc/man3/EVP_md2.pod
    index 0b473887e01b97..a6f3a010deb5aa 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_md2.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_md2.pod
    @@ -28,7 +28,7 @@ The MD2 algorithm which produces a 128-bit output from a given input.
     
     Developers should be aware of the negative performance implications of
     calling this function multiple times and should consider using
    -L instead.
    +L with L instead.
     See L for further information.
     
     =head1 RETURN VALUES
    diff --git a/deps/openssl/openssl/doc/man3/EVP_md4.pod b/deps/openssl/openssl/doc/man3/EVP_md4.pod
    index baaff9e4eaa2ac..a4e1a7d0a6e910 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_md4.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_md4.pod
    @@ -29,7 +29,7 @@ The MD4 algorithm which produces a 128-bit output from a given input.
     
     Developers should be aware of the negative performance implications of
     calling this function multiple times and should consider using
    -L instead.
    +L with L instead.
     See L for further information.
     
     =head1 RETURN VALUES
    diff --git a/deps/openssl/openssl/doc/man3/EVP_md5.pod b/deps/openssl/openssl/doc/man3/EVP_md5.pod
    index 752fdd1f6c37b3..42370fb3d0a329 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_md5.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_md5.pod
    @@ -40,7 +40,7 @@ WARNING: this algorithm is not intended for non-SSL usage.
     
     Developers should be aware of the negative performance implications of
     calling these functions multiple times and should consider using
    -L instead.
    +L with L or L instead.
     See L for further information.
     
     =head1 RETURN VALUES
    diff --git a/deps/openssl/openssl/doc/man3/EVP_mdc2.pod b/deps/openssl/openssl/doc/man3/EVP_mdc2.pod
    index e9de6f3c560a61..3681bd06a63cd9 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_mdc2.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_mdc2.pod
    @@ -30,7 +30,7 @@ The MDC-2DES algorithm of using MDC-2 with the DES block cipher. It produces a
     
     Developers should be aware of the negative performance implications of
     calling this function multiple times and should consider using
    -L instead.
    +L with L instead.
     See L for further information.
     
     =head1 RETURN VALUES
    diff --git a/deps/openssl/openssl/doc/man3/EVP_rc2_cbc.pod b/deps/openssl/openssl/doc/man3/EVP_rc2_cbc.pod
    index bf4a13ba45c19c..17f6f4b3e254da 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_rc2_cbc.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_rc2_cbc.pod
    @@ -55,7 +55,7 @@ functions to set the key length and effective key length.
     
     Developers should be aware of the negative performance implications of
     calling these functions multiple times and should consider using
    -L instead.
    +L with L instead.
     See L for further information.
     
     =head1 RETURN VALUES
    diff --git a/deps/openssl/openssl/doc/man3/EVP_rc4.pod b/deps/openssl/openssl/doc/man3/EVP_rc4.pod
    index f22e88a6521477..0311ef278ca12d 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_rc4.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_rc4.pod
    @@ -47,7 +47,7 @@ interface.
     
     Developers should be aware of the negative performance implications of
     calling these functions multiple times and should consider using
    -L instead.
    +L with L instead.
     See L for further information.
     
     =head1 RETURN VALUES
    diff --git a/deps/openssl/openssl/doc/man3/EVP_rc5_32_12_16_cbc.pod b/deps/openssl/openssl/doc/man3/EVP_rc5_32_12_16_cbc.pod
    index c177b1845196f2..69fc2f2cc656b9 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_rc5_32_12_16_cbc.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_rc5_32_12_16_cbc.pod
    @@ -60,7 +60,7 @@ is an int.
     
     Developers should be aware of the negative performance implications of
     calling these functions multiple times and should consider using
    -L instead.
    +L with L instead.
     See L for further information.
     
     =head1 RETURN VALUES
    diff --git a/deps/openssl/openssl/doc/man3/EVP_ripemd160.pod b/deps/openssl/openssl/doc/man3/EVP_ripemd160.pod
    index 6ad2d3e0186968..5b96fd09f85037 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_ripemd160.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_ripemd160.pod
    @@ -29,7 +29,7 @@ The RIPEMD-160 algorithm which produces a 160-bit output from a given input.
     
     Developers should be aware of the negative performance implications of
     calling this function multiple times and should consider using
    -L instead.
    +L with L instead.
     See L for further information.
     
     =head1 RETURN VALUES
    diff --git a/deps/openssl/openssl/doc/man3/EVP_seed_cbc.pod b/deps/openssl/openssl/doc/man3/EVP_seed_cbc.pod
    index 010607e5740590..2c821d07c3993a 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_seed_cbc.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_seed_cbc.pod
    @@ -41,7 +41,7 @@ The SEED encryption algorithm in CBC, CFB, ECB and OFB modes respectively.
     
     Developers should be aware of the negative performance implications of
     calling these functions multiple times and should consider using
    -L instead.
    +L with L instead.
     See L for further information.
     
     =head1 RETURN VALUES
    diff --git a/deps/openssl/openssl/doc/man3/EVP_sha1.pod b/deps/openssl/openssl/doc/man3/EVP_sha1.pod
    index 264ddd1addb717..6fc8f07b066a6f 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_sha1.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_sha1.pod
    @@ -29,7 +29,7 @@ The SHA-1 algorithm which produces a 160-bit output from a given input.
     
     Developers should be aware of the negative performance implications of
     calling this function multiple times and should consider using
    -L instead.
    +L with L instead.
     See L for further information.
     
     =head1 RETURN VALUES
    diff --git a/deps/openssl/openssl/doc/man3/EVP_sha224.pod b/deps/openssl/openssl/doc/man3/EVP_sha224.pod
    index 7a50cf9b6c3f15..be09e49ee39325 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_sha224.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_sha224.pod
    @@ -49,7 +49,7 @@ their outputs are of the same size.
     
     Developers should be aware of the negative performance implications of
     calling these functions multiple times and should consider using
    -L instead.
    +L with Linstead.
     See L for further information.
     
     =head1 RETURN VALUES
    diff --git a/deps/openssl/openssl/doc/man3/EVP_sha3_224.pod b/deps/openssl/openssl/doc/man3/EVP_sha3_224.pod
    index 5bb9ae1b89e550..93c0d0b9fb1e0f 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_sha3_224.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_sha3_224.pod
    @@ -54,7 +54,7 @@ B provides that of 256 bits.
     
     Developers should be aware of the negative performance implications of
     calling these functions multiple times and should consider using
    -L instead.
    +L with L or L instead.
     See L for further information.
     
     =head1 RETURN VALUES
    diff --git a/deps/openssl/openssl/doc/man3/EVP_sm3.pod b/deps/openssl/openssl/doc/man3/EVP_sm3.pod
    index 4e8112dc0afee2..65be55e88dba8d 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_sm3.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_sm3.pod
    @@ -28,7 +28,7 @@ The SM3 hash function.
     
     Developers should be aware of the negative performance implications of
     calling this function multiple times and should consider using
    -L instead.
    +L with L instead.
     See L for further information.
     
     =head1 RETURN VALUES
    diff --git a/deps/openssl/openssl/doc/man3/EVP_sm4_cbc.pod b/deps/openssl/openssl/doc/man3/EVP_sm4_cbc.pod
    index b67ade549968c5..48be7a31ad756d 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_sm4_cbc.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_sm4_cbc.pod
    @@ -45,7 +45,7 @@ respectively.
     
     Developers should be aware of the negative performance implications of
     calling these functions multiple times and should consider using
    -L instead.
    +L with L instead.
     See L for further information.
     
     =head1 RETURN VALUES
    diff --git a/deps/openssl/openssl/doc/man3/EVP_whirlpool.pod b/deps/openssl/openssl/doc/man3/EVP_whirlpool.pod
    index a9826e290a4279..c5d465b16f0c3c 100644
    --- a/deps/openssl/openssl/doc/man3/EVP_whirlpool.pod
    +++ b/deps/openssl/openssl/doc/man3/EVP_whirlpool.pod
    @@ -30,7 +30,7 @@ input.
     
     Developers should be aware of the negative performance implications of
     calling this function multiple times and should consider using
    -L instead.
    +L with L instead.
     See L for further information.
     
     =head1 RETURN VALUES
    diff --git a/deps/openssl/openssl/doc/man3/OSSL_CMP_CTX_new.pod b/deps/openssl/openssl/doc/man3/OSSL_CMP_CTX_new.pod
    index e81fb08b00d613..ce7db8f2f08628 100644
    --- a/deps/openssl/openssl/doc/man3/OSSL_CMP_CTX_new.pod
    +++ b/deps/openssl/openssl/doc/man3/OSSL_CMP_CTX_new.pod
    @@ -182,7 +182,7 @@ clearing the internal CMP transaction (aka session) status, PKIStatusInfo,
     and any previous results (newCert, newChain, caPubs, and extraCertsIn)
     from the last executed transaction.
     It also clears any ITAVs that were added by OSSL_CMP_CTX_push0_genm_ITAV().
    -All other field values (i.e., CMP options) are retained for potential re-use.
    +All other field values (i.e., CMP options) are retained for potential reuse.
     
     OSSL_CMP_CTX_set_option() sets the given value for the given option
     (e.g., OSSL_CMP_OPT_IMPLICIT_CONFIRM) in the given OSSL_CMP_CTX structure.
    @@ -260,12 +260,12 @@ The following options can be set:
     
     =item B
             The NID of the digest algorithm to be used as one-way function (OWF)
    -        in RFC 4210's MSG_MAC_ALG for PBM-based message protection.
    +        for MAC-based message protection with password-based MAC (PBM).
    +        See RFC 4210 section 5.1.3.1 for details.
             Default is SHA256.
     
     =item B
    -        The NID of the MAC algorithm to be used in RFC 4210's MSG_MAC_ALG
    -        for PBM-based message protection.
    +        The NID of the MAC algorithm to be used for message protection with PBM.
             Default is HMAC-SHA1 as per RFC 4210.
     
     =item B
    @@ -450,8 +450,8 @@ The reference counts of those certificates handled successfully are increased.
     OSSL_CMP_CTX_get0_untrusted(OSSL_CMP_CTX *ctx) returns a pointer to the
     list of untrusted certs, which may be empty if unset.
     
    -OSSL_CMP_CTX_set1_cert() sets the CMP signer certificate
    -related to the private key used for CMP message protection.
    +OSSL_CMP_CTX_set1_cert() sets the CMP signer certificate, also called protection
    +certificate, related to the private key for signature-based message protection.
     Therefore the public key of this I must correspond to
     the private key set before or thereafter via OSSL_CMP_CTX_set1_pkey().
     When using signature-based protection of CMP request messages
    @@ -481,15 +481,15 @@ OSSL_CMP_CTX_set1_pkey() sets the client's private key corresponding to the
     CMP signer certificate set via OSSL_CMP_CTX_set1_cert().
     This key is used create signature-based protection (protectionAlg = MSG_SIG_ALG)
     of outgoing messages
    -unless a PBM secret has been set via OSSL_CMP_CTX_set1_secretValue().
    +unless a symmetric secret has been set via OSSL_CMP_CTX_set1_secretValue().
     The I argument may be NULL to clear the entry.
     
    -OSSL_CMP_CTX_set1_secretValue() sets the byte string I with length I
    -as PBM secret in the given I or clears it if the I argument is NULL.
    -If present, this secret is used to create PBM-based protection of outgoing
    -messages and to verify any PBM-based protection of incoming messages
    -(protectionAlg = MSG_MAC_ALG). PBM stands for Password-Based MAC.
    -PBM-based protection takes precedence over signature-based protection.
    +OSSL_CMP_CTX_set1_secretValue() sets in I the byte string I of length
    +I to use as pre-shared secret, or clears it if the I argument is NULL.
    +If present, this secret is used to create MAC-based authentication and integrity
    +protection (rather than applying signature-based protection)
    +of outgoing messages and to verify authenticity and integrity of incoming
    +messages that have MAC-based protection (protectionAlg = C).
     
     OSSL_CMP_CTX_set1_referenceValue() sets the given referenceValue I with
     length I in the given I or clears it if the I argument is NULL.
    @@ -500,7 +500,7 @@ then the sender field will contain the NULL-DN
     and the senderKID field of the CMP message header must be set.
     When signature-based protection is used the senderKID will be set to
     the subjectKeyIdentifier of the CMP signer certificate as far as present.
    -If not present or when PBM-based protection is used
    +If not present or when MAC-based protection is used
     the I value is taken as the fallback value for the senderKID.
     
     OSSL_CMP_CTX_set1_recipient() sets the recipient name that will be used in the
    @@ -731,7 +731,7 @@ Set up a CMP client context for sending requests and verifying responses:
         OSSL_CMP_CTX_set1_serverPath(cmp_ctx, path_or_alias);
         OSSL_CMP_CTX_set0_trustedStore(cmp_ctx, ts);
     
    -Set up client credentials for password-based protection (PBM):
    +Set up symmetric credentials for MAC-based message protection such as PBM:
     
         OSSL_CMP_CTX_set1_referenceValue(cmp_ctx, ref, ref_len);
         OSSL_CMP_CTX_set1_secretValue(cmp_ctx, sec, sec_len);
    diff --git a/deps/openssl/openssl/doc/man3/OSSL_CMP_exec_certreq.pod b/deps/openssl/openssl/doc/man3/OSSL_CMP_exec_certreq.pod
    index b0d81c7c41a968..0cabc3bad5ac96 100644
    --- a/deps/openssl/openssl/doc/man3/OSSL_CMP_exec_certreq.pod
    +++ b/deps/openssl/openssl/doc/man3/OSSL_CMP_exec_certreq.pod
    @@ -42,7 +42,7 @@ client-server transactions, i.e., sequences of CMP requests and responses.
     
     All functions take a populated OSSL_CMP_CTX structure as their first argument.
     Usually the server name, port, and path ("CMP alias") need to be set, as well as
    -credentials the client can use for authenticating itself to the client.
    +credentials the client can use for authenticating itself to the server.
     In order to authenticate the server the client typically needs a trust store.
     The functions return their respective main results directly, while there are
     also accessor functions for retrieving various results and status information
    @@ -72,7 +72,7 @@ and need to be filled in using L,
     L, L, etc.
     For P10CR, L needs to be used instead.
     The enrollment session may be blocked by sleeping until the addressed
    -CA (or an intermedate PKI component) can fully process and answer the request.
    +CA (or an intermediate PKI component) can fully process and answer the request.
     
     OSSL_CMP_try_certreq() is an alternative to the above functions that is
     more flexible regarding what to do after receiving a checkAfter value.
    @@ -119,9 +119,17 @@ See RFC 4210 section 5.3.19 and appendix E.5 for details.
     
     CMP is defined in RFC 4210 (and CRMF in RFC 4211).
     
    -So far the CMP client implementation is limited to one request per CMP message
    +The CMP client implementation is limited to one request per CMP message
     (and consequently to at most one response component per CMP message).
     
    +When a client obtains from a CMP server CA certificates that it is going to
    +trust, for instance via the caPubs field of a certificate response,
    +authentication of the CMP server is particularly critical.
    +So special care must be taken setting up server authentication in I
    +using functions such as
    +L (for certificate-based authentication) or
    +L (for MAC-based protection).
    +
     =head1 RETURN VALUES
     
     OSSL_CMP_exec_certreq(), OSSL_CMP_exec_IR_ses(), OSSL_CMP_exec_CR_ses(),
    @@ -163,7 +171,7 @@ The OpenSSL CMP support was added in OpenSSL 3.0.
     
     =head1 COPYRIGHT
     
    -Copyright 2007-2021 The OpenSSL Project Authors. All Rights Reserved.
    +Copyright 2007-2023 The OpenSSL Project Authors. All Rights Reserved.
     
     Licensed under the Apache License 2.0 (the "License").  You may not use
     this file except in compliance with the License.  You can obtain a copy
    diff --git a/deps/openssl/openssl/doc/man3/OSSL_HTTP_REQ_CTX.pod b/deps/openssl/openssl/doc/man3/OSSL_HTTP_REQ_CTX.pod
    index ee61034aa731a7..6216420e4ffe92 100644
    --- a/deps/openssl/openssl/doc/man3/OSSL_HTTP_REQ_CTX.pod
    +++ b/deps/openssl/openssl/doc/man3/OSSL_HTTP_REQ_CTX.pod
    @@ -72,12 +72,16 @@ which collects the HTTP request header lines.
     OSSL_HTTP_REQ_CTX_free() frees up the HTTP request context I.
     The I is not free'd, I will be free'd if I is set.
     
    -OSSL_HTTP_REQ_CTX_set_request_line() adds the HTTP request line to the context.
    +OSSL_HTTP_REQ_CTX_set_request_line() adds the 1st HTTP request line to I.
     The HTTP method is determined by I,
     which should be 1 to indicate C or 0 to indicate C.
    -I and I may be set to indicate a proxy server and port
    -that the request should go through, otherwise they should be left NULL.
    -I is the HTTP request path; if left NULL, C is used.
    +I and I may be set to give the server and the optional port that
    +an HTTP proxy shall forward the request to, otherwise they must be left NULL.
    +I provides the HTTP request path; if left NULL, C is used.
    +For backward compatibility, I may begin with C and thus convey
    +an absoluteURI. In this case it indicates HTTP proxy use and provides also the
    +server (and optionally the port) that the proxy shall forward the request to.
    +In this case the I and I arguments must be NULL.
     
     OSSL_HTTP_REQ_CTX_add1_header() adds header I with value I to the
     context I. It can be called more than once to add multiple header lines.
    diff --git a/deps/openssl/openssl/doc/man3/OSSL_HTTP_transfer.pod b/deps/openssl/openssl/doc/man3/OSSL_HTTP_transfer.pod
    index 3337f6d4a35e51..716e365ef50db0 100644
    --- a/deps/openssl/openssl/doc/man3/OSSL_HTTP_transfer.pod
    +++ b/deps/openssl/openssl/doc/man3/OSSL_HTTP_transfer.pod
    @@ -161,8 +161,11 @@ NULL) to print additional diagnostic information in a user-oriented way.
     
     OSSL_HTTP_set1_request() sets up in I the request header and content data
     and expectations on the response using the following parameters.
    -If  indicates using a proxy for HTTP (but not HTTPS), the server hostname
    -(and optionally port) needs to be placed in the header and thus must be present.
    +If  indicates using a proxy for HTTP (but not HTTPS), the server host
    +(and optionally port) needs to be placed in the header; thus it must be present
    +in I.
    +For backward compatibility, the server (and optional port) may also be given in
    +the I argument beginning with C (thus giving an absoluteURI).
     If I is NULL it defaults to "/".
     If I is NULL the HTTP GET method will be used to send the request
     else HTTP POST with the contents of I and optional I, where
    @@ -274,7 +277,7 @@ All the functions described here were added in OpenSSL 3.0.
     
     =head1 COPYRIGHT
     
    -Copyright 2019-2022 The OpenSSL Project Authors. All Rights Reserved.
    +Copyright 2019-2023 The OpenSSL Project Authors. All Rights Reserved.
     
     Licensed under the Apache License 2.0 (the "License").  You may not use
     this file except in compliance with the License.  You can obtain a copy
    diff --git a/deps/openssl/openssl/doc/man3/PKCS12_create.pod b/deps/openssl/openssl/doc/man3/PKCS12_create.pod
    index dc0f06d9d323c7..92e588062a36ed 100644
    --- a/deps/openssl/openssl/doc/man3/PKCS12_create.pod
    +++ b/deps/openssl/openssl/doc/man3/PKCS12_create.pod
    @@ -42,7 +42,8 @@ can all be set to zero and sensible defaults will be used.
     These defaults are: AES password based encryption (PBES2 with PBKDF2 and
     AES-256-CBC) for private keys and certificates, the PBKDF2 and MAC key
     derivation iteration count of B (currently 2048), and
    -MAC algorithm HMAC with SHA2-256.
    +MAC algorithm HMAC with SHA2-256. The MAC key derivation algorithm used
    +for the outer PKCS#12 structure is PKCS12KDF.
     
     The default MAC iteration count is 1 in order to retain compatibility with
     old software which did not interpret MAC iteration counts. If such compatibility
    @@ -68,6 +69,8 @@ I or I can be set to -1 indicating that no encryption
     should be used.
     
     I can be set to -1 and the MAC will then be omitted entirely.
    +This can be useful when running with the FIPS provider as the PKCS12KDF
    +is not a FIPS approvable algorithm.
     
     PKCS12_create() makes assumptions regarding the encoding of the given pass
     phrase.
    @@ -83,7 +86,9 @@ IETF RFC 7292 (L)
     
     =head1 SEE ALSO
     
    +L,
     L,
    +L,
     L
     
     =head1 HISTORY
    @@ -96,7 +101,7 @@ standards.
     
     =head1 COPYRIGHT
     
    -Copyright 2002-2021 The OpenSSL Project Authors. All Rights Reserved.
    +Copyright 2002-2023 The OpenSSL Project Authors. All Rights Reserved.
     
     Licensed under the Apache License 2.0 (the "License").  You may not use
     this file except in compliance with the License.  You can obtain a copy
    diff --git a/deps/openssl/openssl/doc/man3/PKCS12_gen_mac.pod b/deps/openssl/openssl/doc/man3/PKCS12_gen_mac.pod
    index 37bcd572d841ce..a72df145fedd70 100644
    --- a/deps/openssl/openssl/doc/man3/PKCS12_gen_mac.pod
    +++ b/deps/openssl/openssl/doc/man3/PKCS12_gen_mac.pod
    @@ -22,6 +22,7 @@ PKCS12_verify_mac - Functions to create and manipulate a PKCS#12 structure
     
     PKCS12_gen_mac() generates an HMAC over the entire PKCS#12 object using the
     supplied password along with a set of already configured parameters.
    +The default key generation mechanism used is PKCS12KDF.
     
     PKCS12_verify_mac() verifies the PKCS#12 object's HMAC using the supplied
     password.
    @@ -57,6 +58,7 @@ IETF RFC 7292 (L)
     =head1 SEE ALSO
     
     L,
    +L,
     L,
     L
     
    diff --git a/deps/openssl/openssl/doc/man3/PKCS5_PBKDF2_HMAC.pod b/deps/openssl/openssl/doc/man3/PKCS5_PBKDF2_HMAC.pod
    index 0984e993daefa5..8b5feff9192c02 100644
    --- a/deps/openssl/openssl/doc/man3/PKCS5_PBKDF2_HMAC.pod
    +++ b/deps/openssl/openssl/doc/man3/PKCS5_PBKDF2_HMAC.pod
    @@ -33,7 +33,8 @@ be NULL terminated.
     
     B is the iteration count and its value should be greater than or
     equal to 1. RFC 2898 suggests an iteration count of at least 1000. Any
    -B less than 1 is treated as a single iteration.
    +B value less than 1 is invalid; such values will result in failure
    +and raise the PROV_R_INVALID_ITERATION_COUNT error.
     
     B is the message digest function used in the derivation.
     PKCS5_PBKDF2_HMAC_SHA1() calls PKCS5_PBKDF2_HMAC() with EVP_sha1().
    @@ -66,7 +67,7 @@ L
     
     =head1 COPYRIGHT
     
    -Copyright 2014-2021 The OpenSSL Project Authors. All Rights Reserved.
    +Copyright 2014-2023 The OpenSSL Project Authors. All Rights Reserved.
     
     Licensed under the Apache License 2.0 (the "License").  You may not use
     this file except in compliance with the License.  You can obtain a copy
    diff --git a/deps/openssl/openssl/doc/man3/SSL_CONF_CTX_set_ssl_ctx.pod b/deps/openssl/openssl/doc/man3/SSL_CONF_CTX_set_ssl_ctx.pod
    index 06cc1e4ec539d2..3913ea9390079d 100644
    --- a/deps/openssl/openssl/doc/man3/SSL_CONF_CTX_set_ssl_ctx.pod
    +++ b/deps/openssl/openssl/doc/man3/SSL_CONF_CTX_set_ssl_ctx.pod
    @@ -2,6 +2,7 @@
     
     =head1 NAME
     
    +SSL_CONF_CTX_finish,
     SSL_CONF_CTX_set_ssl_ctx, SSL_CONF_CTX_set_ssl - set context to configure
     
     =head1 SYNOPSIS
    @@ -10,6 +11,7 @@ SSL_CONF_CTX_set_ssl_ctx, SSL_CONF_CTX_set_ssl - set context to configure
     
      void SSL_CONF_CTX_set_ssl_ctx(SSL_CONF_CTX *cctx, SSL_CTX *ctx);
      void SSL_CONF_CTX_set_ssl(SSL_CONF_CTX *cctx, SSL *ssl);
    + int SSL_CONF_CTX_finish(SSL_CONF_CTX *cctx);
     
     =head1 DESCRIPTION
     
    @@ -23,6 +25,10 @@ B structure B. Any previous B or B associated with
     B is cleared. Subsequent calls to SSL_CONF_cmd() will be sent to
     B.
     
    +The function SSL_CONF_CTX_finish() must be called after all configuration
    +operations have been completed. It is used to finalise any operations
    +or to process defaults.
    +
     =head1 NOTES
     
     The context need not be set or it can be set to B in which case only
    @@ -32,6 +38,8 @@ syntax checking of commands is performed, where possible.
     
     SSL_CONF_CTX_set_ssl_ctx() and SSL_CTX_set_ssl() do not return a value.
     
    +SSL_CONF_CTX_finish() returns 1 for success and 0 for failure.
    +
     =head1 SEE ALSO
     
     L,
    @@ -47,7 +55,7 @@ These functions were added in OpenSSL 1.0.2.
     
     =head1 COPYRIGHT
     
    -Copyright 2012-2016 The OpenSSL Project Authors. All Rights Reserved.
    +Copyright 2012-2023 The OpenSSL Project Authors. All Rights Reserved.
     
     Licensed under the Apache License 2.0 (the "License").  You may not use
     this file except in compliance with the License.  You can obtain a copy
    diff --git a/deps/openssl/openssl/doc/man3/SSL_CTX_set_info_callback.pod b/deps/openssl/openssl/doc/man3/SSL_CTX_set_info_callback.pod
    index 9cee6420738486..c1c6a67f85a7d7 100644
    --- a/deps/openssl/openssl/doc/man3/SSL_CTX_set_info_callback.pod
    +++ b/deps/openssl/openssl/doc/man3/SSL_CTX_set_info_callback.pod
    @@ -12,11 +12,15 @@ SSL_get_info_callback
     
      #include 
     
    - void SSL_CTX_set_info_callback(SSL_CTX *ctx, void (*callback)());
    - void (*SSL_CTX_get_info_callback(const SSL_CTX *ctx))();
    + void SSL_CTX_set_info_callback(SSL_CTX *ctx,
    +                                void (*callback) (const SSL *ssl, int type, int val));
     
    - void SSL_set_info_callback(SSL *ssl, void (*callback)());
    - void (*SSL_get_info_callback(const SSL *ssl))();
    + void (*SSL_CTX_get_info_callback(SSL_CTX *ctx)) (const SSL *ssl, int type, int val);
    +
    + void SSL_set_info_callback(SSL *ssl,
    +                            void (*callback) (const SSL *ssl, int type, int val));
    +
    + void (*SSL_get_info_callback(const SSL *ssl)) (const SSL *ssl, int type, int val);
     
     =head1 DESCRIPTION
     
    @@ -119,7 +123,7 @@ SSL_get_info_callback() returns the current setting.
     The following example callback function prints state strings, information
     about alerts being handled and error messages to the B BIO.
     
    - void apps_ssl_info_callback(SSL *s, int where, int ret)
    + void apps_ssl_info_callback(const SSL *s, int where, int ret)
      {
          const char *str;
          int w = where & ~SSL_ST_MASK;
    @@ -156,7 +160,7 @@ L
     
     =head1 COPYRIGHT
     
    -Copyright 2001-2020 The OpenSSL Project Authors. All Rights Reserved.
    +Copyright 2001-2023 The OpenSSL Project Authors. All Rights Reserved.
     
     Licensed under the Apache License 2.0 (the "License").  You may not use
     this file except in compliance with the License.  You can obtain a copy
    diff --git a/deps/openssl/openssl/doc/man3/SSL_new.pod b/deps/openssl/openssl/doc/man3/SSL_new.pod
    index 59d275523f98e7..2b522769169b77 100644
    --- a/deps/openssl/openssl/doc/man3/SSL_new.pod
    +++ b/deps/openssl/openssl/doc/man3/SSL_new.pod
    @@ -35,7 +35,7 @@ MUST NOT have yet started the SSL handshake.  For connections that are not in
     their initial state SSL_dup() just increments an internal
     reference count and returns the I handle.  It may be possible to
     use L to recycle an SSL handle that is not in its initial
    -state for re-use, but this is best avoided.  Instead, save and restore
    +state for reuse, but this is best avoided.  Instead, save and restore
     the session, if desired, and construct a fresh handle for each connection.
     
     The subset of settings in I that are duplicated are:
    @@ -124,7 +124,7 @@ L
     
     =head1 COPYRIGHT
     
    -Copyright 2000-2021 The OpenSSL Project Authors. All Rights Reserved.
    +Copyright 2000-2023 The OpenSSL Project Authors. All Rights Reserved.
     
     Licensed under the Apache License 2.0 (the "License").  You may not use
     this file except in compliance with the License.  You can obtain a copy
    diff --git a/deps/openssl/openssl/doc/man3/d2i_PKCS8PrivateKey_bio.pod b/deps/openssl/openssl/doc/man3/d2i_PKCS8PrivateKey_bio.pod
    index 5b5371b70f19cd..51d8aa8cfb474d 100644
    --- a/deps/openssl/openssl/doc/man3/d2i_PKCS8PrivateKey_bio.pod
    +++ b/deps/openssl/openssl/doc/man3/d2i_PKCS8PrivateKey_bio.pod
    @@ -8,7 +8,7 @@ i2d_PKCS8PrivateKey_nid_bio, i2d_PKCS8PrivateKey_nid_fp - PKCS#8 format private
     
     =head1 SYNOPSIS
     
    - #include 
    + #include 
     
      EVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, void *u);
      EVP_PKEY *d2i_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, void *u);
    @@ -64,7 +64,7 @@ L
     
     =head1 COPYRIGHT
     
    -Copyright 2002-2018 The OpenSSL Project Authors. All Rights Reserved.
    +Copyright 2002-2023 The OpenSSL Project Authors. All Rights Reserved.
     
     Licensed under the Apache License 2.0 (the "License").  You may not use
     this file except in compliance with the License.  You can obtain a copy
    diff --git a/deps/openssl/openssl/doc/man3/d2i_RSAPrivateKey.pod b/deps/openssl/openssl/doc/man3/d2i_RSAPrivateKey.pod
    index b4f5b466090004..08cd2c85e5bd79 100644
    --- a/deps/openssl/openssl/doc/man3/d2i_RSAPrivateKey.pod
    +++ b/deps/openssl/openssl/doc/man3/d2i_RSAPrivateKey.pod
    @@ -28,7 +28,6 @@ d2i_RSA_PUBKEY_fp,
     d2i_DHparams,
     d2i_DHparams_bio,
     d2i_DHparams_fp,
    -d2i_ECPKParameters,
     d2i_ECParameters,
     d2i_ECPrivateKey,
     d2i_ECPrivateKey_bio,
    @@ -56,7 +55,6 @@ i2d_DSA_PUBKEY,
     i2d_DSA_PUBKEY_bio,
     i2d_DSA_PUBKEY_fp,
     i2d_DSAparams,
    -i2d_ECPKParameters,
     i2d_ECParameters,
     i2d_ECPrivateKey,
     i2d_ECPrivateKey_bio,
    @@ -205,7 +203,7 @@ I and I as follows:
     
     =item BPrivateKey>() translates into:
     
    - int selection = EVP_PKEY_PRIVATE_KEY;
    + int selection = EVP_PKEY_KEYPAIR;
      const char *structure = "type-specific";
     
     =item BPublicKey>() translates into:
    @@ -309,7 +307,7 @@ L
     
     =head1 COPYRIGHT
     
    -Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved.
    +Copyright 2020-2023 The OpenSSL Project Authors. All Rights Reserved.
     
     Licensed under the Apache License 2.0 (the "License").  You may not use
     this file except in compliance with the License.  You can obtain a copy
    diff --git a/deps/openssl/openssl/doc/man3/d2i_X509.pod b/deps/openssl/openssl/doc/man3/d2i_X509.pod
    index c79a964e6d7f98..00efb603581661 100644
    --- a/deps/openssl/openssl/doc/man3/d2i_X509.pod
    +++ b/deps/openssl/openssl/doc/man3/d2i_X509.pod
    @@ -53,6 +53,7 @@ d2i_DIST_POINT,
     d2i_DIST_POINT_NAME,
     d2i_DSA_SIG,
     d2i_ECDSA_SIG,
    +d2i_ECPKParameters,
     d2i_EDIPARTYNAME,
     d2i_ESS_CERT_ID,
     d2i_ESS_CERT_ID_V2,
    @@ -223,6 +224,7 @@ i2d_DIST_POINT,
     i2d_DIST_POINT_NAME,
     i2d_DSA_SIG,
     i2d_ECDSA_SIG,
    +i2d_ECPKParameters,
     i2d_EDIPARTYNAME,
     i2d_ESS_CERT_ID,
     i2d_ESS_CERT_ID_V2,
    @@ -388,10 +390,12 @@ to the returned structure is also written to I<*a>.  If an error occurred
     then NULL is returned.
     
     On a successful return, if I<*a> is not NULL then it is assumed that I<*a>
    -contains a valid B> structure and an attempt is made to reuse it. This
    -"reuse" capability is present for historical compatibility but its use is
    -B (see BUGS below, and the discussion in the RETURN
    -VALUES section).
    +contains a valid B> structure and an attempt is made to reuse it.
    +For B> structures where it matters it is possible to set up a library
    +context on the decoded structure this way (see the B section).
    +However using the "reuse" capability for other purposes is B (see B below, and the discussion in the B
    +section).
     
     B_bio>() is similar to B>() except it attempts
     to parse data from BIO I.
    @@ -536,6 +540,22 @@ Alternative technique:
      if (d2i_X509(&x, &p, len) == NULL)
          /* error */
     
    +Setting up a library context and property query:
    +
    + X509 *x;
    + unsigned char *buf;
    + const unsigned char *p;
    + int len;
    + OSSL_LIB_CTX *libctx = ....;
    + const char *propq = ....;
    +
    + /* Set up buf and len to point to the input buffer. */
    + p = buf;
    + x = X509_new_ex(libctx, propq);
    +
    + if (d2i_X509(&x, &p, len) == NULL)
    +     /* error, x was freed and NULL assigned to it (see RETURN VALUES) */
    +
     =head1 WARNINGS
     
     Using a temporary variable is mandatory. A common
    diff --git a/deps/openssl/openssl/doc/man5/x509v3_config.pod b/deps/openssl/openssl/doc/man5/x509v3_config.pod
    index 1830092394bc90..044904022d894e 100644
    --- a/deps/openssl/openssl/doc/man5/x509v3_config.pod
    +++ b/deps/openssl/openssl/doc/man5/x509v3_config.pod
    @@ -93,7 +93,7 @@ numeric identifier, as shown here:
      email.2 = steve@example.org
     
     The syntax of raw extensions is defined by the source code that parses
    -the extension but should be documened.
    +the extension but should be documented.
     See L for an example of a raw extension.
     
     If an extension type is unsupported, then the I extension syntax
    @@ -590,7 +590,7 @@ L
     
     =head1 COPYRIGHT
     
    -Copyright 2004-2021 The OpenSSL Project Authors. All Rights Reserved.
    +Copyright 2004-2023 The OpenSSL Project Authors. All Rights Reserved.
     
     Licensed under the Apache License 2.0 (the "License").  You may not use
     this file except in compliance with the License.  You can obtain a copy
    diff --git a/deps/openssl/openssl/doc/man7/EVP_KDF-PKCS12KDF.pod b/deps/openssl/openssl/doc/man7/EVP_KDF-PKCS12KDF.pod
    index 7edde1dc9bf7f0..98653656986427 100644
    --- a/deps/openssl/openssl/doc/man7/EVP_KDF-PKCS12KDF.pod
    +++ b/deps/openssl/openssl/doc/man7/EVP_KDF-PKCS12KDF.pod
    @@ -46,6 +46,9 @@ RFC 7292 section B.3.
     
     =head1 NOTES
     
    +This algorithm is not available in the FIPS provider as it is not FIPS
    +approvable.
    +
     A typical application of this algorithm is to derive keying material for an
     encryption algorithm from a password in the "pass", a salt in "salt",
     and an iteration count.
    @@ -68,7 +71,8 @@ L,
     L,
     L,
     L,
    -L
    +L,
    +L
     
     =head1 HISTORY
     
    @@ -76,7 +80,7 @@ This functionality was added in OpenSSL 3.0.
     
     =head1 COPYRIGHT
     
    -Copyright 2020 The OpenSSL Project Authors. All Rights Reserved.
    +Copyright 2020-2023 The OpenSSL Project Authors. All Rights Reserved.
     
     Licensed under the Apache License 2.0 (the "License").  You may not use
     this file except in compliance with the License.  You can obtain a copy
    diff --git a/deps/openssl/openssl/doc/man7/migration_guide.pod b/deps/openssl/openssl/doc/man7/migration_guide.pod
    index 1847e9813cbbaf..61641324a7fc9d 100644
    --- a/deps/openssl/openssl/doc/man7/migration_guide.pod
    +++ b/deps/openssl/openssl/doc/man7/migration_guide.pod
    @@ -306,6 +306,15 @@ context and property query and will call an extended version of the key/IV
     derivation function which supports these parameters. This includes
     L, L and L.
     
    +=head4 PKCS#12 KDF versus FIPS
    +
    +Unlike in 1.x.y, the PKCS12KDF algorithm used when a PKCS#12 structure
    +is created with a MAC that does not work with the FIPS provider as the PKCS12KDF
    +is not a FIPS approvable mechanism.
    +
    +See L, L, L,
    +L.
    +
     =head4 Windows thread synchronization changes
     
     Windows thread synchronization uses read/write primitives (SRWLock) when
    diff --git a/deps/openssl/openssl/fuzz/build.info b/deps/openssl/openssl/fuzz/build.info
    index 7b26b8c15228f8..dc976b70f06796 100644
    --- a/deps/openssl/openssl/fuzz/build.info
    +++ b/deps/openssl/openssl/fuzz/build.info
    @@ -9,7 +9,7 @@
     -}
     
     IF[{- !$disabled{"fuzz-afl"} || !$disabled{"fuzz-libfuzzer"} -}]
    -  PROGRAMS{noinst}=asn1 asn1parse bignum bndiv client conf crl server x509
    +  PROGRAMS{noinst}=asn1 asn1parse bignum bndiv client conf crl server
     
       IF[{- !$disabled{"cmp"} -}]
         PROGRAMS{noinst}=cmp
    @@ -23,6 +23,10 @@ IF[{- !$disabled{"fuzz-afl"} || !$disabled{"fuzz-libfuzzer"} -}]
         PROGRAMS{noinst}=ct
       ENDIF
     
    +  IF[{- !$disabled{"ocsp"} -}]
    +    PROGRAMS{noinst}=x509
    +  ENDIF
    +
       SOURCE[asn1]=asn1.c driver.c fuzz_rand.c
       INCLUDE[asn1]=../include {- $ex_inc -}
       DEPEND[asn1]=../libcrypto ../libssl {- $ex_lib -}
    @@ -73,7 +77,7 @@ IF[{- !$disabled{"fuzz-afl"} || !$disabled{"fuzz-libfuzzer"} -}]
     ENDIF
     
     IF[{- !$disabled{tests} -}]
    -  PROGRAMS{noinst}=asn1-test asn1parse-test bignum-test bndiv-test client-test conf-test crl-test server-test x509-test
    +  PROGRAMS{noinst}=asn1-test asn1parse-test bignum-test bndiv-test client-test conf-test crl-test server-test
     
       IF[{- !$disabled{"cmp"} -}]
         PROGRAMS{noinst}=cmp-test
    @@ -87,6 +91,10 @@ IF[{- !$disabled{tests} -}]
         PROGRAMS{noinst}=ct-test
       ENDIF
     
    +  IF[{- !$disabled{"ocsp"} -}]
    +    PROGRAMS{noinst}=x509-test
    +  ENDIF
    +
       SOURCE[asn1-test]=asn1.c test-corpus.c fuzz_rand.c
       INCLUDE[asn1-test]=../include
       DEPEND[asn1-test]=../libcrypto ../libssl
    diff --git a/deps/openssl/openssl/fuzz/x509.c b/deps/openssl/openssl/fuzz/x509.c
    index 78061d176af792..e2d2639164c01d 100644
    --- a/deps/openssl/openssl/fuzz/x509.c
    +++ b/deps/openssl/openssl/fuzz/x509.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2016-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2016-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License");
      * you may not use this file except in compliance with the License.
    @@ -9,6 +9,7 @@
      */
     
     #include 
    +#include 
     #include 
     #include 
     #include 
    @@ -17,31 +18,131 @@
     int FuzzerInitialize(int *argc, char ***argv)
     {
         FuzzerSetRand();
    -    OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL);
    +    OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS
    +       | OPENSSL_INIT_ADD_ALL_CIPHERS | OPENSSL_INIT_ADD_ALL_DIGESTS, NULL);
         ERR_clear_error();
         CRYPTO_free_ex_index(0, -1);
         return 1;
     }
     
    +static int cb(int ok, X509_STORE_CTX *ctx)
    +{
    +    return 1;
    +}
    +
     int FuzzerTestOneInput(const uint8_t *buf, size_t len)
     {
         const unsigned char *p = buf;
    +    size_t orig_len = len;
         unsigned char *der = NULL;
    +    BIO *bio = NULL;
    +    X509 *x509_1 = NULL, *x509_2 = NULL;
    +    X509_STORE *store = NULL;
    +    X509_VERIFY_PARAM *param = NULL;
    +    X509_STORE_CTX *ctx = NULL;
    +    X509_CRL *crl = NULL;
    +    STACK_OF(X509_CRL) *crls = NULL;
    +    STACK_OF(X509) *certs = NULL;
    +    OCSP_RESPONSE *resp = NULL;
    +    OCSP_BASICRESP *bs = NULL;
    +    OCSP_CERTID *id = NULL;
    +
    +    x509_1 = d2i_X509(NULL, &p, len);
    +    if (x509_1 == NULL)
    +        goto err;
    +
    +    bio = BIO_new(BIO_s_null());
    +    if (bio == NULL)
    +        goto err;
    +
    +    /* This will load and print the public key as well as extensions */
    +    X509_print(bio, x509_1);
    +    BIO_free(bio);
    +
    +    X509_issuer_and_serial_hash(x509_1);
    +
    +    i2d_X509(x509_1, &der);
    +    OPENSSL_free(der);
    +
    +    len = orig_len - (p - buf);
    +    x509_2 = d2i_X509(NULL, &p, len);
    +    if (x509_2 == NULL)
    +        goto err;
    +
    +    len = orig_len - (p - buf);
    +    crl = d2i_X509_CRL(NULL, &p, len);
    +    if (crl == NULL)
    +        goto err;
    +
    +    len = orig_len - (p - buf);
    +    resp = d2i_OCSP_RESPONSE(NULL, &p, len);
    +
    +    store = X509_STORE_new();
    +    X509_STORE_add_cert(store, x509_2);
     
    -    X509 *x509 = d2i_X509(NULL, &p, len);
    -    if (x509 != NULL) {
    -        BIO *bio = BIO_new(BIO_s_null());
    -        /* This will load and print the public key as well as extensions */
    -        X509_print(bio, x509);
    -        BIO_free(bio);
    +    param = X509_VERIFY_PARAM_new();
    +    X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_NO_CHECK_TIME);
    +    X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_X509_STRICT);
    +    X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_PARTIAL_CHAIN);
    +    X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_CRL_CHECK);
     
    -        X509_issuer_and_serial_hash(x509);
    +    X509_STORE_set1_param(store, param);
     
    -        i2d_X509(x509, &der);
    -        OPENSSL_free(der);
    +    X509_STORE_set_verify_cb(store, cb);
     
    -        X509_free(x509);
    +    ctx = X509_STORE_CTX_new();
    +    if (ctx == NULL)
    +        goto err;
    +
    +    X509_STORE_CTX_init(ctx, store, x509_1, NULL);
    +
    +    if (crl != NULL) {
    +        crls = sk_X509_CRL_new_null();
    +        if (crls == NULL)
    +            goto err;
    +
    +        sk_X509_CRL_push(crls, crl);
    +        X509_STORE_CTX_set0_crls(ctx, crls);
         }
    +
    +    X509_verify_cert(ctx);
    +
    +    if (resp != NULL)
    +        bs = OCSP_response_get1_basic(resp);
    +
    +    if (bs != NULL) {
    +        int status, reason;
    +        ASN1_GENERALIZEDTIME *revtime, *thisupd, *nextupd;
    +
    +        certs = sk_X509_new_null();
    +        if (certs == NULL)
    +            goto err;
    +
    +        sk_X509_push(certs, x509_1);
    +        sk_X509_push(certs, x509_2);
    +
    +        OCSP_basic_verify(bs, certs, store, OCSP_PARTIAL_CHAIN);
    +
    +        id = OCSP_cert_to_id(NULL, x509_1, x509_2);
    +        if (id == NULL)
    +            goto err;
    +        OCSP_resp_find_status(bs, id, &status, &reason, &revtime, &thisupd,
    +                              &nextupd);
    +    }
    +
    +err:
    +    X509_STORE_CTX_free(ctx);
    +    X509_VERIFY_PARAM_free(param);
    +    X509_STORE_free(store);
    +    X509_free(x509_1);
    +    X509_free(x509_2);
    +    X509_CRL_free(crl);
    +    OCSP_CERTID_free(id);
    +    OCSP_BASICRESP_free(bs);
    +    OCSP_RESPONSE_free(resp);
    +    sk_X509_CRL_free(crls);
    +    sk_X509_free(certs);
    +
         ERR_clear_error();
         return 0;
     }
    diff --git a/deps/openssl/openssl/include/openssl/cmserr.h b/deps/openssl/openssl/include/openssl/cmserr.h
    index d48c2a4ab89f03..f2d7708f10c8d6 100644
    --- a/deps/openssl/openssl/include/openssl/cmserr.h
    +++ b/deps/openssl/openssl/include/openssl/cmserr.h
    @@ -1,6 +1,6 @@
     /*
      * Generated by util/mkerr.pl DO NOT EDIT
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -113,6 +113,7 @@
     #  define CMS_R_UNSUPPORTED_LABEL_SOURCE                   193
     #  define CMS_R_UNSUPPORTED_RECIPIENTINFO_TYPE             155
     #  define CMS_R_UNSUPPORTED_RECIPIENT_TYPE                 154
    +#  define CMS_R_UNSUPPORTED_SIGNATURE_ALGORITHM            195
     #  define CMS_R_UNSUPPORTED_TYPE                           156
     #  define CMS_R_UNWRAP_ERROR                               157
     #  define CMS_R_UNWRAP_FAILURE                             180
    diff --git a/deps/openssl/openssl/include/openssl/evp.h b/deps/openssl/openssl/include/openssl/evp.h
    index 49e8e1df786516..e64072f9656263 100644
    --- a/deps/openssl/openssl/include/openssl/evp.h
    +++ b/deps/openssl/openssl/include/openssl/evp.h
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -85,6 +85,8 @@
     /* Easy to use macros for EVP_PKEY related selections */
     # define EVP_PKEY_KEY_PARAMETERS                                            \
         ( OSSL_KEYMGMT_SELECT_ALL_PARAMETERS )
    +# define EVP_PKEY_PRIVATE_KEY                                               \
    +    ( EVP_PKEY_KEY_PARAMETERS | OSSL_KEYMGMT_SELECT_PRIVATE_KEY )
     # define EVP_PKEY_PUBLIC_KEY                                                \
         ( EVP_PKEY_KEY_PARAMETERS | OSSL_KEYMGMT_SELECT_PUBLIC_KEY )
     # define EVP_PKEY_KEYPAIR                                                   \
    diff --git a/deps/openssl/openssl/include/openssl/pkcs7.h.in b/deps/openssl/openssl/include/openssl/pkcs7.h.in
    index f5c55a3fbe5761..006b38b604110b 100644
    --- a/deps/openssl/openssl/include/openssl/pkcs7.h.in
    +++ b/deps/openssl/openssl/include/openssl/pkcs7.h.in
    @@ -1,7 +1,7 @@
     /*
      * {- join("\n * ", @autowarntext) -}
      *
    - * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -57,8 +57,8 @@ typedef struct pkcs7_signer_info_st {
         PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
         X509_ALGOR *digest_alg;
         STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */
    -    X509_ALGOR *digest_enc_alg;
    -    ASN1_OCTET_STRING *enc_digest;
    +    X509_ALGOR *digest_enc_alg; /* confusing name, actually used for signing */
    +    ASN1_OCTET_STRING *enc_digest; /* confusing name, actually signature */
         STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */
         /* The private key to sign with */
         EVP_PKEY *pkey;
    diff --git a/deps/openssl/openssl/providers/fips-sources.checksums b/deps/openssl/openssl/providers/fips-sources.checksums
    index 42785c33a0d2e0..fa977f5a983829 100644
    --- a/deps/openssl/openssl/providers/fips-sources.checksums
    +++ b/deps/openssl/openssl/providers/fips-sources.checksums
    @@ -21,7 +21,7 @@ c56c324667b67d726e040d70379efba5b270e2937f403c1b5979018b836903c7  crypto/aes/asm
     c7c6694480bb5319690f94826139a93f5c460ebea6dba101b520a76cb956ec93  crypto/aes/asm/aesni-x86_64.pl
     f3a8f3c960c0f47aaa8fc2633d18b14e7c7feeccc536b0115a08bc58333122b6  crypto/aes/asm/aesp8-ppc.pl
     e397a5781893e97dd90a5a52049633be12a43f379ec5751bca2a6350c39444c8  crypto/aes/asm/aest4-sparcv9.pl
    -a097f9d71de7cefa8e93629033ff1986fb01128623ec051d9b5afef55c0e5ebb  crypto/aes/asm/aesv8-armx.pl
    +e3955352a92d56905d63e68937e4758f13190a14a10a3dcb1e5c641c49913c0c  crypto/aes/asm/aesv8-armx.pl
     5e8005fdb6641df465bdda20c3476f7176e6bcd63d5073044a0c02a327c7f172  crypto/aes/asm/bsaes-armv7.pl
     0726a2c4c15c27a12b2f7d5e16863df4a1b1daa7b7d9b728f621b2b224d290e6  crypto/aes/asm/bsaes-x86_64.pl
     1ff94d6bf6c8ae4809f64657eb89260fe3cb22137f649d3c73f72cb190258196  crypto/aes/asm/vpaes-armv8.pl
    @@ -79,7 +79,7 @@ d94295953ab91469fe2b9da2a542b8ea11ac38551ecde8f8202b7f645c2dea16  crypto/bn/bn_d
     74b63a4515894592b7241fb30b91b21510beaa3d397809e3d74bc9a73e879d18  crypto/bn/bn_div.c
     a29b8b7fa8460f11e50f880e3c3c9e0755b93889bcbb5476206c4d938a9c5735  crypto/bn/bn_exp.c
     ec2b6e3af6df473a23e7f1a8522f2554cb0eb5d34e3282458c4a66d242278434  crypto/bn/bn_exp2.c
    -1abab2cc5466b005b939d156e7d8664a4d42a191c9040dbb83941269d6844f0c  crypto/bn/bn_gcd.c
    +baba7c8ae95af6aa36bc9f4be3a2eed33d500451e568ca4bfc6bc7cb48d4f7ea  crypto/bn/bn_gcd.c
     4d6cc7ed36978247a191df1eea0120f8ee97b639ba228793dabe5a8355a1a609  crypto/bn/bn_gf2m.c
     081e8a6abc23599307dab3b1a92113a65e0bf8717cbc40c970c7469350bc4581  crypto/bn/bn_intern.c
     602ed46fbfe12c899dfb7d9d99ff0dbfff96b454fce3cd02817f3e2488dd9192  crypto/bn/bn_kron.c
    @@ -122,20 +122,20 @@ eeef5722ad56bf1af2ff71681bcc8b8525bc7077e973c98cee920ce9bcc66c81  crypto/des/ecb
     61926e30dd940616e80936d1c94c5f522daf0d475fb3a40a9e589e78f322901e  crypto/des/set_key.c
     8344811b14d151f6cd40a7bc45c8f4a1106252b119c1d5e6a589a023f39b107d  crypto/des/spr.h
     816472a54c273906d0a2b58650e0b9d28cc2c8023d120f0d77160f1fe34c4ca3  crypto/dh/dh_backend.c
    -d2d0569bea2598bd405f23b60e5283a6ce353f1145a25ff8f28cf15711743156  crypto/dh/dh_check.c
    +fcbfe5acb73e1b4094efec56a754b803d2c1a53644c78cf6a73ae868e3f3886d  crypto/dh/dh_check.c
     7838e9a35870b0fbcba0aff2f52a2439f64d026e9922bce6e5978c2f22c51120  crypto/dh/dh_gen.c
     6b17861887b2535159b9e6ca4f927767dad3e71b6e8be50055bc784f78e92d64  crypto/dh/dh_group_params.c
     a5cf5cb464b40f1bc5457dc2a6f2c5ec0f050196603cd2ba7037a23ab64adbf7  crypto/dh/dh_kdf.c
    -0afa7dd237f9b21b0cfb0de10505facd57eb07ded905d888d43a1de2356d4002  crypto/dh/dh_key.c
    -b0046b2c4e1d74ff4e93f2486a00f63728909b8a75cbdd29b9100e607f97995c  crypto/dh/dh_lib.c
    +9e61a0b5017d835b348b15e93760c42d8d899ffae4251455c7b3085cfd25294c  crypto/dh/dh_key.c
    +92345c259ea2a8c09e6d6b069d0942bd6ca4642231580f3e8148ae7a832a1115  crypto/dh/dh_lib.c
     8300775d88db0a1aa26a77eb49d6c4f7252e7fee69e1440de4c40edadc9da044  crypto/dh/dh_local.h
     bbcf4fc3067ac462a27d7277973180b7dc140df9262a686c7fbe4318ca01f7b8  crypto/dsa/dsa_backend.c
    -b9c5992089203123c3fae46e39bb4d05e19854087bca7a30ad1f82a3505deec7  crypto/dsa/dsa_check.c
    +d7e0d87494e3b3f0898a56785a219e87a2ce14416393ec32d8c0b5f539c7bdbf  crypto/dsa/dsa_check.c
     ae727bf6319eb57e682de35d75ea357921987953b3688365c710e7fba51c7c58  crypto/dsa/dsa_gen.c
     b1de1624e590dbf76f76953802ff162cc8de7c5e2eaba897313c866424d6902b  crypto/dsa/dsa_key.c
    -9e436a2e0867920c3a5ac58bc14300cad4ab2c4c8fe5e40b355dfd21bfdfe146  crypto/dsa/dsa_lib.c
    +9f4837c5abe53613a2dc1c5db81d073d4f42bd28b6a2d1e93a2b350d8e25d52a  crypto/dsa/dsa_lib.c
     f4d52d3897219786c6046bf76abb2f174655c584caa50272bf5d281720df5022  crypto/dsa/dsa_local.h
    -38062c6eebdb2f88fa0c6592837a96a49de2ae520d3ad483a3e02921c8adb094  crypto/dsa/dsa_ossl.c
    +c5c252f205482a71efeabe226d51a1c541a6ba2dfa9b8b8a70901087a9dc1667  crypto/dsa/dsa_ossl.c
     d612fd05ff98816ba6cf37f84c0e31443ad9d840ed587a7ab2066027da390325  crypto/dsa/dsa_sign.c
     53fa10cc87ac63e35df661882852dc46ae68e6fee83b842f1aeefe00b8900ee1  crypto/dsa/dsa_vrf.c
     d9722ad8c6b6e209865a921f3cda831d09bf54a55cacd1edd9802edb6559190a  crypto/ec/asm/ecp_nistp521-ppc64.pl
    @@ -193,7 +193,7 @@ b4b7c683279454ba41438f50a015cb63ef056ccb9be0168918dfbae00313dc68  crypto/ec/ecp_
     0e75a058dcbbb62cfe39fec6c4a85385dc1a8fce794e4278ce6cebb29763b82b  crypto/evp/dh_support.c
     1af3872164b4a4757bc7896a24b4d2f8eb2cfb4cba0d872a93db69975693e0a6  crypto/evp/digest.c
     838277f228cd3025cf95a9cd435e5606ad1fb5d207bbb057aa29892e6a657c55  crypto/evp/ec_support.c
    -1c3d1b1f800b1f1f5adb1fdbdd67cdf37ca7ea93b264d1468c72a63c140873ce  crypto/evp/evp_enc.c
    +61df3942752307b7006f09d7628348a0cc9e5555469a3a8862349067a52824b7  crypto/evp/evp_enc.c
     7f10367f9b6191c4a8c01784130d26b2d778485a41cdac5fa17c9a1c4096f132  crypto/evp/evp_fetch.c
     ebe32b2895f7f9767710674352c8949efe93b4bbb5e7b71c27bb5d1822339b46  crypto/evp/evp_lib.c
     78f07bf50b6999611a4e9414ab3a20b219b0ab29ca2bd05002d6919a3f67b8eb  crypto/evp/evp_local.h
    @@ -213,11 +213,11 @@ e7e8eb5683cd3fbd409df888020dc353b65ac291361829cc4131d5bc86c9fcb3  crypto/evp/mac
     1f0e9e94e9b0ad322956521b438b78d44cfcd8eb974e8921d05f9e21ba1c05cf  crypto/evp/pmeth_gn.c
     76511fba789089a50ef87774817a5482c33633a76a94ecf7b6e8eb915585575d  crypto/evp/pmeth_lib.c
     4b2dbddf0f9ceed34c3822347138be754fb194febca1c21c46bcc3a5cce33674  crypto/evp/signature.c
    -b06cb8fd4bd95aae1f66e1e145269c82169257f1a60ef0f78f80a3d4c5131fac  crypto/ex_data.c
    +f2acfb82aac20251d05a9c252cc6c282bd44e43feac4ac2e0faf68b9a38aef57  crypto/ex_data.c
     1c8389c5d49616d491978f0f2b2a54ba82d805ec41c8f75c67853216953cf46a  crypto/ffc/ffc_backend.c
     a12af33e605315cdddd6d759e70cd9632f0f33682b9aa7103ed1ecd354fc7e55  crypto/ffc/ffc_dh.c
     854378f57707e31ad02cca6eec94369f91f327288d3665713e249c12f7b13211  crypto/ffc/ffc_key_generate.c
    -2695c9c8ad9193a8c1ab53d5d09712d50d12c91eb8d62e8a15cbc78f327afe84  crypto/ffc/ffc_key_validate.c
    +4e973d956d4ec2087994de8e963be1a512da1441f22e6e7b9cd7ee536e3ff834  crypto/ffc/ffc_key_validate.c
     8b72d5a7452b2c15aec6d20027053a83f7df89d49a3b6cfedd77e2b1a29e9fc1  crypto/ffc/ffc_params.c
     1a1d227f9a0f427d2ec93bc646c726c9cd49a84a343b4aff0c9c744fa6df05a9  crypto/ffc/ffc_params_generate.c
     73dac805abab36cd9df53a421221c71d06a366a4ce479fa788be777f11b47159  crypto/ffc/ffc_params_validate.c
    @@ -225,7 +225,7 @@ a12af33e605315cdddd6d759e70cd9632f0f33682b9aa7103ed1ecd354fc7e55  crypto/ffc/ffc
     0395c1b0834f2f4a0ca1756385f4dc1a4ef6fb925b2db3743df7f57256c5166f  crypto/hmac/hmac_local.h
     0e2d6129504d15ffaf5baa63158ccec0e4b6193a8275333956d8f868ef35127e  crypto/ia64cpuid.S
     f897493b50f4e9dd4cacb2a7accda6683c10ece602641874cdff1dac7128a751  crypto/initthread.c
    -5482c47c266523129980302426d25839fda662f1544f4b684707e6b272a952c9  crypto/lhash/lhash.c
    +7290d8d7ec31a98b17618f218d4f27b393501c7606c814a43db8af1975ad1d10  crypto/lhash/lhash.c
     5d49ce00fc06df1b64cbc139ef45c71e0faf08a33f966bc608c82d574521a49e  crypto/lhash/lhash_local.h
     f866aafae928db1b439ac950dc90744a2397dfe222672fe68b3798396190c8b0  crypto/mem_clr.c
     e14f48d4112c0efe3826b4aa390cc24045a85298cc551ec7f3f36ac4236d7d81  crypto/modes/asm/aes-gcm-armv8_64.pl
    @@ -240,7 +240,7 @@ e472d73d06933667a51a0af973479993eed333c71b43af03095450acb36dbeb4  crypto/modes/a
     26f55a57e77f774d17dfba93d757f78edfa3a03f68a71ffa37ccf3bfc468b1e2  crypto/modes/asm/ghash-x86.pl
     72744131007d2389c09665a59a862f5f6bb61b64bd3456e9b400985cb56586b8  crypto/modes/asm/ghash-x86_64.pl
     a4e9f2e496bd9362b17a1b5989aa4682647cefcff6117f0607122a9e11a9dfd9  crypto/modes/asm/ghashp8-ppc.pl
    -0029b5beb1d4cd4c5ad47164c23f3e7c9d1eaff66ef54af025ee26795b11a1c7  crypto/modes/asm/ghashv8-armx.pl
    +69a13f423ca74c22543900c14aef4a848e3bc75504b65d2f51c6903aebcc17a7  crypto/modes/asm/ghashv8-armx.pl
     65112dfe63cd59487e7bdb1706b44acfcf48ecede12cc3ae51daa5b661f41f06  crypto/modes/cbc128.c
     1611e73dc1e01b5c2201f51756a7405b7673aa0bb872e2957d1ec80c3530486f  crypto/modes/ccm128.c
     d8c2f256532a4b94db6d03aea5cb609cccc938069f644b2fc77c5015648d148d  crypto/modes/cfb128.c
    @@ -252,29 +252,29 @@ e55a816c356b2d526bc6e40c8b81afa02576e4d44c7d7b6bbe444fb8b01aad41  crypto/modes/w
     8aa2504f84a0637b5122f0c963c9d82773ba248bad972ab92be7169995d162b5  crypto/o_str.c
     8ddbbdf43131c10dcd4428aef0eff2b1e98b0410accada0fad41a4925868beef  crypto/packet.c
     a20bfd927d69737c86ca95d3cf636afa8cefd8fe23412d1a3897644a0da21211  crypto/param_build.c
    -c2fe815fb3fd5efe9a6544cae55f9469063a0f6fb728361737b927f6182ae0bb  crypto/param_build_set.c
    +2a0f272dd553b698e8c6fa57962694ebd6064cb03fe26a60df529205568d315d  crypto/param_build_set.c
     0e4a5388a92fabbe5a540176c0b4c5ce258b78dc9168ecc2e805352a06aaf0ba  crypto/params.c
     4fda13f6af05d80b0ab89ec4f5813c274a21a9b4565be958a02d006236cef05c  crypto/params_dup.c
     a0097ff2da8955fe15ba204cb54f3fd48a06f846e2b9826f507b26acf65715c3  crypto/params_from_text.c
     97cb7414dc2f165d5849ee3b46cdfff0afb067729435d9c01a747e0ca41e230c  crypto/ppccap.c
     3ca43596a7528dec8ff9d1a3cd0d68b62640f84b1d6a8b5e4842cfd0be1133ad  crypto/ppccpuid.pl
     b4d34272a0bd1fbe6562022bf7ea6259b6a5a021a48222d415be47ef5ef2a905  crypto/property/defn_cache.c
    -7da6ae864beb1a4daa4be31eb41d48141a3a7eb7a263a4937a6889e05656a595  crypto/property/property.c
    +3c4ade2fed4605e374d85ec1134a98da34e7124f89f44b81a754e8cfe81f14ba  crypto/property/property.c
     66da4f28d408133fb544b14aeb9ad4913e7c5c67e2826e53f0dc5bf4d8fada26  crypto/property/property_local.h
    -921305e62749aec22da4843738bee3448b61e7e30d5309beddc7141ad07a8004  crypto/property/property_parse.c
    +099407e68e705f1458b701b9336f633565fc0843355fedf1ec83794349548a51  crypto/property/property_parse.c
     a7cefda6a117550e2c76e0f307565ce1e11640b11ba10c80e469a837fd1212a3  crypto/property/property_query.c
     065698c8d88a5facc0cbc02a3bd0c642c94687a8c5dd79901c942138b406067d  crypto/property/property_string.c
    -9653ec9c1476350a94b9cc7f8be3d99961fd803870c9ac03315298d2909a6a8e  crypto/provider_core.c
    +0ba5d0297837940c972224c97cbbf3ea4a723c1eed9ce1112538c9bb26208639  crypto/provider_core.c
     d0af10d4091b2032aac1b7db80f8c2e14fa7176592716b25b9437ab6b53c0a89  crypto/provider_local.h
     5ba2e1c74ddcd0453d02e32612299d1eef18eff8493a7606c15d0dc3738ad1d9  crypto/provider_predefined.c
     a5a4472636b8b0095ad8d4acd37e275ad79da1a67ecff7b7b5c3e46c9ebc65b7  crypto/rand/rand_lib.c
     fd03b9bb2c23470fa40880ed3bf9847bb17d50592101a78c0ad7a0f121209788  crypto/rand/rand_local.h
     f0c8792a99132e0b9c027cfa7370f45594a115934cdc9e8f23bdd64abecaf7fd  crypto/rsa/rsa_acvp_test_params.c
    -9e7dd6fc91d3266d4aa4f0f41b7986381122b7d98114e63ebf04c5ee298b5fda  crypto/rsa/rsa_backend.c
    +5834d7c518ad53ea0dd3db811c0e51568c81cc6c117012030101d29003d0725c  crypto/rsa/rsa_backend.c
     38a102cd1da1f6ca5a46e6a22f018237964336274385f5c70cbedcaa6997647e  crypto/rsa/rsa_chk.c
     e32cfa04221a2a3ea33f7bcb93ee51b84cbeba97e94c1fbf6e420b24f97fc9ce  crypto/rsa/rsa_crpt.c
     e995da1c2e5007bd7f5907f369fe45ed15f4e657143a85078c755bd5e6863d0b  crypto/rsa/rsa_gen.c
    -74ed75d1d8e0844800504a137bfd81c3dbcb6c4bd58b5d5fe9d0a362092b6e88  crypto/rsa/rsa_lib.c
    +f2222f270e57559537d3da8abbeb1390bc5376b73dae59d536af6e73eb48bba0  crypto/rsa/rsa_lib.c
     a65e85be5269d8cb88e86b3413c978fa8994419a671092cbf104ff1a08fda23b  crypto/rsa/rsa_local.h
     cf0b75cd54b61b9b9a290ef18d0ddce9fb26a029a54eb3f720d9b25188440f00  crypto/rsa/rsa_mp_names.c
     5c60f6e05db82e13178d805deb1947b8eee4a905e6e77523d3b288da70a46bb5  crypto/rsa/rsa_none.c
    @@ -344,7 +344,7 @@ c50c584c55e56347bb43aca4b796b5344d70daece3061f586b79c871c21f5d1a  crypto/sparse_
     8da78169fa8c09dc3c29c9bf1602b22e88c5eac4815e274ba1864c166e31584b  crypto/stack/stack.c
     7b4efa594d8d1f3ecbf4605cf54f72fb296a3b1d951bdc69e415aaa08f34e5c8  crypto/threads_lib.c
     a41ae93a755e2ec89b3cb5b4932e2b508fdda92ace2e025a2650a6da0e9e972c  crypto/threads_none.c
    -2637a8727dee790812b000f2e02b336f7907949df633dda72938bbaafdb204fe  crypto/threads_pthread.c
    +3729e2bd36f945808b578e0d89fac0fcb3114e4fc9381614bcbd8a9869991716  crypto/threads_pthread.c
     88423960f0414f6fd41fba4f4c67f9f7260c2741e4788adcd52493e895ec8027  crypto/threads_win.c
     fd6c27cf7c6b5449b17f2b725f4203c4c10207f1973db09fd41571efe5de08fd  crypto/x86_64cpuid.pl
     bbec287bb9bf35379885f8f8998b7fd9e8fc22efee9e1b299109af0f33a7ee16  crypto/x86cpuid.pl
    @@ -430,7 +430,7 @@ bc9ec2be442a4f49980ba2c63c8f0da701de1f6e23d7db35d781658f833dd7b9  include/openss
     61c76ee3f12ed0e42503a56421ca00f1cb9a0f4caa5f9c4421c374bcd45917d7  include/openssl/encoder.h
     69dd983f45b8ccd551f084796519446552963a18c52b70470d978b597c81b2dc  include/openssl/encodererr.h
     c6ee8f17d7252bdd0807a124dc6d50a95c32c04e17688b7c2e061998570b7028  include/openssl/err.h.in
    -12ec111c0e22581e0169be5e1838353a085fb51e3042ef59a7db1cee7da73c5b  include/openssl/evp.h
    +b23bf3e2d0a60fe4d768afbe7aab48b47791e1274ae42b28895255119ae7f61d  include/openssl/evp.h
     5bd1b5dcd14067a1fe490d49df911002793c0b4f0bd4492cd8f71cfed7bf9f2a  include/openssl/evperr.h
     5381d96fe867a4ee0ebc09b9e3a262a0d7a27edc5f91dccfb010c7d713cd0820  include/openssl/fips_names.h
     b1d41beba560a41383f899a361b786e04f889106fb5960ec831b0af7996c9783  include/openssl/fipskey.h.in
    @@ -567,18 +567,18 @@ abe2b0f3711eaa34846e155cffc9242e4051c45de896f747afd5ac9d87f637dc  providers/impl
     589f6133799da80760e8bc3ab0191a341ab6d4d2706e92e6eb4a24b0250fefa6  providers/implementations/kdfs/tls1_prf.c
     4d4a6d9a562d2dcfec941d3f113a544663b5ac2fbe4accd89ec70c1cc11751d0  providers/implementations/kdfs/x942kdf.c
     6b6c776b12664164f3cb54c21df61e1c4477c7855d89431a16fb338cdae58d43  providers/implementations/kem/rsa_kem.c
    -37120f8a420de0e44b7dc1f31b50d59520e5318cf546e83684e0c3de5c7b76c5  providers/implementations/keymgmt/dh_kmgmt.c
    -2a4493c9e68f41d37d7ec69c272005c6df7b1a34db2d49663f52e836e4fd888c  providers/implementations/keymgmt/dsa_kmgmt.c
    +11a0d0fb88ed88e965f10b3a0ef6c880f60341df995128f57ad943053aaf15b2  providers/implementations/keymgmt/dh_kmgmt.c
    +a329f57cb041cd03907e9d996fbc2f378ee116c7f8d7fbf1ea08b7a5df7e0304  providers/implementations/keymgmt/dsa_kmgmt.c
     9bc88451d3ae110c7a108ee73d3b3b6bda801ec3494d2dfb9c9970b85c2d34fe  providers/implementations/keymgmt/ec_kmgmt.c
     258ae17bb2dd87ed1511a8eb3fe99eed9b77f5c2f757215ff6b3d0e8791fc251  providers/implementations/keymgmt/ec_kmgmt_imexport.inc
    -d77ece2494e6b12a6201a2806ee5fb24a6dc2fa3e1891a46012a870e0b781ab1  providers/implementations/keymgmt/ecx_kmgmt.c
    +011c36aad6834729043f23eacab417732541ee23916d9afa5bb9164862be00bb  providers/implementations/keymgmt/ecx_kmgmt.c
     053a2be39a87f50b877ebdbbf799cf5faf8b2de33b04311d819d212ee1ea329b  providers/implementations/keymgmt/kdf_legacy_kmgmt.c
    -e30357311e4a3e1c78266af6315fd1fc99584bfb09f4a7cd0ddc7261cf1e17e1  providers/implementations/keymgmt/mac_legacy_kmgmt.c
    +1646b477fa231dd0f6c22444c99098f9b447cab0d39ff69b811262469d4dbe09  providers/implementations/keymgmt/mac_legacy_kmgmt.c
     19f22fc70a6321441e56d5bd4aab3d01d52d17069d4e4b5cefce0f411ecece75  providers/implementations/keymgmt/rsa_kmgmt.c
     aeb42590728ca87b916b8a3d337351b1c82ee0747213e5ce740c2350b3db7185  providers/implementations/macs/cmac_prov.c
     e69aa06f8f3c6f5a26702b9f44a844b8589b99dc0ee590953a29e8b9ef10acbe  providers/implementations/macs/gmac_prov.c
     895c8dc7235b9ad5ff893be0293cbc245a5455e8850195ac7d446646e4ea71d0  providers/implementations/macs/hmac_prov.c
    -f75fbfe5348f93ad610da7d310f4e8fecf18c0549f27605da25d393c33e0edc2  providers/implementations/macs/kmac_prov.c
    +8640b63fd8325aaf8f7128d6cc448d9af448a65bf51a8978075467d33a67944e  providers/implementations/macs/kmac_prov.c
     bf30274dd6b528ae913984775bd8f29c6c48c0ef06d464d0f738217727b7aa5c  providers/implementations/rands/crngt.c
     9d23df7f99beec7392c9d4ed813407050bc2d150098888fe802e2c9705fc33fa  providers/implementations/rands/drbg.c
     bb5f8161a80d0d1a7ee919af2b167972b00afd62e326252ca6aa93101f315f19  providers/implementations/rands/drbg_ctr.c
    diff --git a/deps/openssl/openssl/providers/fips.checksum b/deps/openssl/openssl/providers/fips.checksum
    index ec1978c7fedec1..347a9614339ee8 100644
    --- a/deps/openssl/openssl/providers/fips.checksum
    +++ b/deps/openssl/openssl/providers/fips.checksum
    @@ -1 +1 @@
    -f07990ec634ec6ea3c8c42a664768debcf92a1b0c39bde7041c24df33dd7f052  providers/fips-sources.checksums
    +114b59f288ec2d6ddfcd26187f43cad614c6d4e4a7aba24410494f46f627671c  providers/fips-sources.checksums
    diff --git a/deps/openssl/openssl/providers/implementations/ciphers/cipher_chacha20.c b/deps/openssl/openssl/providers/implementations/ciphers/cipher_chacha20.c
    index 386c865d832e0f..ef80a515d756dc 100644
    --- a/deps/openssl/openssl/providers/implementations/ciphers/cipher_chacha20.c
    +++ b/deps/openssl/openssl/providers/implementations/ciphers/cipher_chacha20.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2019-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -21,6 +21,7 @@
     
     static OSSL_FUNC_cipher_newctx_fn chacha20_newctx;
     static OSSL_FUNC_cipher_freectx_fn chacha20_freectx;
    +static OSSL_FUNC_cipher_dupctx_fn chacha20_dupctx;
     static OSSL_FUNC_cipher_get_params_fn chacha20_get_params;
     static OSSL_FUNC_cipher_get_ctx_params_fn chacha20_get_ctx_params;
     static OSSL_FUNC_cipher_set_ctx_params_fn chacha20_set_ctx_params;
    @@ -64,6 +65,25 @@ static void chacha20_freectx(void *vctx)
         }
     }
     
    +static void *chacha20_dupctx(void *vctx)
    +{
    +    PROV_CHACHA20_CTX *ctx = (PROV_CHACHA20_CTX *)vctx;
    +    PROV_CHACHA20_CTX *dupctx = NULL;
    +
    +    if (ctx != NULL) {
    +        dupctx = OPENSSL_memdup(ctx, sizeof(*dupctx));
    +        if (dupctx != NULL && dupctx->base.tlsmac != NULL && dupctx->base.alloced) {
    +            dupctx->base.tlsmac = OPENSSL_memdup(dupctx->base.tlsmac,
    +                                                 dupctx->base.tlsmacsize);
    +            if (dupctx->base.tlsmac == NULL) {
    +                OPENSSL_free(dupctx);
    +                dupctx = NULL;
    +            }
    +        }
    +    }
    +    return dupctx;
    +}
    +
     static int chacha20_get_params(OSSL_PARAM params[])
     {
         return ossl_cipher_generic_get_params(params, 0, CHACHA20_FLAGS,
    @@ -187,6 +207,7 @@ int ossl_chacha20_dinit(void *vctx, const unsigned char *key, size_t keylen,
     const OSSL_DISPATCH ossl_chacha20_functions[] = {
         { OSSL_FUNC_CIPHER_NEWCTX, (void (*)(void))chacha20_newctx },
         { OSSL_FUNC_CIPHER_FREECTX, (void (*)(void))chacha20_freectx },
    +    { OSSL_FUNC_CIPHER_DUPCTX, (void (*)(void))chacha20_dupctx },
         { OSSL_FUNC_CIPHER_ENCRYPT_INIT, (void (*)(void))ossl_chacha20_einit },
         { OSSL_FUNC_CIPHER_DECRYPT_INIT, (void (*)(void))ossl_chacha20_dinit },
         { OSSL_FUNC_CIPHER_UPDATE, (void (*)(void))chacha20_update },
    diff --git a/deps/openssl/openssl/providers/implementations/encode_decode/decode_der2key.c b/deps/openssl/openssl/providers/implementations/encode_decode/decode_der2key.c
    index b9cee2571bf392..d598f7eba1acc9 100644
    --- a/deps/openssl/openssl/providers/implementations/encode_decode/decode_der2key.c
    +++ b/deps/openssl/openssl/providers/implementations/encode_decode/decode_der2key.c
    @@ -316,10 +316,14 @@ static int der2key_export_object(void *vctx,
         void *keydata;
     
         if (reference_sz == sizeof(keydata) && export != NULL) {
    +        int selection = ctx->selection;
    +
    +        if (selection == 0)
    +            selection = OSSL_KEYMGMT_SELECT_ALL;
             /* The contents of the reference is the address to our object */
             keydata = *(void **)reference;
     
    -        return export(keydata, ctx->selection, export_cb, export_cbarg);
    +        return export(keydata, selection, export_cb, export_cbarg);
         }
         return 0;
     }
    diff --git a/deps/openssl/openssl/providers/implementations/encode_decode/decode_msblob2key.c b/deps/openssl/openssl/providers/implementations/encode_decode/decode_msblob2key.c
    index 501957faba0117..b9d0cabadae2e4 100644
    --- a/deps/openssl/openssl/providers/implementations/encode_decode/decode_msblob2key.c
    +++ b/deps/openssl/openssl/providers/implementations/encode_decode/decode_msblob2key.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2020-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2020-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -79,6 +79,18 @@ static void msblob2key_freectx(void *vctx)
         OPENSSL_free(ctx);
     }
     
    +static int msblob2key_does_selection(void *provctx, int selection)
    +{
    +    if (selection == 0)
    +        return 1;
    +
    +    if ((selection & (OSSL_KEYMGMT_SELECT_PRIVATE_KEY
    +                      | OSSL_KEYMGMT_SELECT_PUBLIC_KEY))  != 0)
    +        return 1;
    +
    +    return 0;
    +}
    +
     static int msblob2key_decode(void *vctx, OSSL_CORE_BIO *cin, int selection,
                                  OSSL_CALLBACK *data_cb, void *data_cbarg,
                                  OSSL_PASSPHRASE_CALLBACK *pw_cb, void *pw_cbarg)
    @@ -211,10 +223,14 @@ msblob2key_export_object(void *vctx,
         void *keydata;
     
         if (reference_sz == sizeof(keydata) && export != NULL) {
    +        int selection = ctx->selection;
    +
    +        if (selection == 0)
    +            selection = OSSL_KEYMGMT_SELECT_ALL;
             /* The contents of the reference is the address to our object */
             keydata = *(void **)reference;
     
    -        return export(keydata, ctx->selection, export_cb, export_cbarg);
    +        return export(keydata, selection, export_cb, export_cbarg);
         }
         return 0;
     }
    @@ -260,6 +276,8 @@ static void rsa_adjust(void *key, struct msblob2key_ctx_st *ctx)
               (void (*)(void))msblob2##keytype##_newctx },                  \
             { OSSL_FUNC_DECODER_FREECTX,                                    \
               (void (*)(void))msblob2key_freectx },                         \
    +        { OSSL_FUNC_DECODER_DOES_SELECTION,                             \
    +          (void (*)(void))msblob2key_does_selection },                  \
             { OSSL_FUNC_DECODER_DECODE,                                     \
               (void (*)(void))msblob2key_decode },                          \
             { OSSL_FUNC_DECODER_EXPORT_OBJECT,                              \
    diff --git a/deps/openssl/openssl/providers/implementations/encode_decode/decode_pvk2key.c b/deps/openssl/openssl/providers/implementations/encode_decode/decode_pvk2key.c
    index c6424165b03bf7..2d7cb15e53e0ae 100644
    --- a/deps/openssl/openssl/providers/implementations/encode_decode/decode_pvk2key.c
    +++ b/deps/openssl/openssl/providers/implementations/encode_decode/decode_pvk2key.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2020-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2020-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -79,6 +79,17 @@ static void pvk2key_freectx(void *vctx)
         OPENSSL_free(ctx);
     }
     
    +static int pvk2key_does_selection(void *provctx, int selection)
    +{
    +    if (selection == 0)
    +        return 1;
    +
    +    if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY)  != 0)
    +        return 1;
    +
    +    return 0;
    +}
    +
     static int pvk2key_decode(void *vctx, OSSL_CORE_BIO *cin, int selection,
                              OSSL_CALLBACK *data_cb, void *data_cbarg,
                              OSSL_PASSPHRASE_CALLBACK *pw_cb, void *pw_cbarg)
    @@ -179,10 +190,14 @@ static int pvk2key_export_object(void *vctx,
         void *keydata;
     
         if (reference_sz == sizeof(keydata) && export != NULL) {
    +        int selection = ctx->selection;
    +
    +        if (selection == 0)
    +            selection = OSSL_KEYMGMT_SELECT_ALL;
             /* The contents of the reference is the address to our object */
             keydata = *(void **)reference;
     
    -        return export(keydata, ctx->selection, export_cb, export_cbarg);
    +        return export(keydata, selection, export_cb, export_cbarg);
         }
         return 0;
     }
    @@ -226,6 +241,8 @@ static void rsa_adjust(void *key, struct pvk2key_ctx_st *ctx)
               (void (*)(void))pvk2##keytype##_newctx },                     \
             { OSSL_FUNC_DECODER_FREECTX,                                    \
               (void (*)(void))pvk2key_freectx },                            \
    +        { OSSL_FUNC_DECODER_DOES_SELECTION,                             \
    +          (void (*)(void))pvk2key_does_selection },                     \
             { OSSL_FUNC_DECODER_DECODE,                                     \
               (void (*)(void))pvk2key_decode },                             \
             { OSSL_FUNC_DECODER_EXPORT_OBJECT,                              \
    diff --git a/deps/openssl/openssl/providers/implementations/encode_decode/encode_key2any.c b/deps/openssl/openssl/providers/implementations/encode_decode/encode_key2any.c
    index c7b01cb2b3e5ef..0f4c62962ddcd4 100644
    --- a/deps/openssl/openssl/providers/implementations/encode_decode/encode_key2any.c
    +++ b/deps/openssl/openssl/providers/implementations/encode_decode/encode_key2any.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2020-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -858,14 +858,17 @@ static int prepare_rsa_params(const void *rsa, int nid, int save,
                     case 1:
                         if ((str = OPENSSL_malloc(str_sz)) == NULL
                             || !WPACKET_init_der(&pkt, str, str_sz)) {
    +                        WPACKET_cleanup(&pkt);
                             goto err;
                         }
                         break;
                     }
                     if (!ossl_DER_w_RSASSA_PSS_params(&pkt, -1, pss)
                         || !WPACKET_finish(&pkt)
    -                    || !WPACKET_get_total_written(&pkt, &str_sz))
    +                    || !WPACKET_get_total_written(&pkt, &str_sz)) {
    +                    WPACKET_cleanup(&pkt);
                         goto err;
    +                }
                     WPACKET_cleanup(&pkt);
     
                     /*
    diff --git a/deps/openssl/openssl/providers/implementations/encode_decode/encode_key2text.c b/deps/openssl/openssl/providers/implementations/encode_decode/encode_key2text.c
    index 7d983f5e51c6df..3e75a9afb370c6 100644
    --- a/deps/openssl/openssl/providers/implementations/encode_decode/encode_key2text.c
    +++ b/deps/openssl/openssl/providers/implementations/encode_decode/encode_key2text.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2020-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2020-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -241,7 +241,7 @@ static int dh_to_text(BIO *out, const void *key, int selection)
                 return 0;
             }
         }
    -    if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0) {
    +    if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0) {
             pub_key = DH_get0_pub_key(dh);
             if (pub_key == NULL) {
                 ERR_raise(ERR_LIB_PROV, PROV_R_NOT_A_PUBLIC_KEY);
    @@ -316,7 +316,7 @@ static int dsa_to_text(BIO *out, const void *key, int selection)
                 return 0;
             }
         }
    -    if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0) {
    +    if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0) {
             pub_key = DSA_get0_pub_key(dsa);
             if (pub_key == NULL) {
                 ERR_raise(ERR_LIB_PROV, PROV_R_NOT_A_PUBLIC_KEY);
    @@ -525,7 +525,7 @@ static int ec_to_text(BIO *out, const void *key, int selection)
             if (priv_len == 0)
                 goto err;
         }
    -    if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0) {
    +    if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0) {
             const EC_POINT *pub_pt = EC_KEY_get0_public_key(ec);
     
             if (pub_pt == NULL) {
    @@ -575,26 +575,31 @@ static int ecx_to_text(BIO *out, const void *key, int selection)
             return 0;
         }
     
    +    switch (ecx->type) {
    +    case ECX_KEY_TYPE_X25519:
    +        type_label = "X25519";
    +        break;
    +    case ECX_KEY_TYPE_X448:
    +        type_label = "X448";
    +        break;
    +    case ECX_KEY_TYPE_ED25519:
    +        type_label = "ED25519";
    +        break;
    +    case ECX_KEY_TYPE_ED448:
    +        type_label = "ED448";
    +        break;
    +    }
    +
         if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0) {
             if (ecx->privkey == NULL) {
                 ERR_raise(ERR_LIB_PROV, PROV_R_NOT_A_PRIVATE_KEY);
                 return 0;
             }
     
    -        switch (ecx->type) {
    -        case ECX_KEY_TYPE_X25519:
    -            type_label = "X25519 Private-Key";
    -            break;
    -        case ECX_KEY_TYPE_X448:
    -            type_label = "X448 Private-Key";
    -            break;
    -        case ECX_KEY_TYPE_ED25519:
    -            type_label = "ED25519 Private-Key";
    -            break;
    -        case ECX_KEY_TYPE_ED448:
    -            type_label = "ED448 Private-Key";
    -            break;
    -        }
    +        if (BIO_printf(out, "%s Private-Key:\n", type_label) <= 0)
    +            return 0;
    +        if (!print_labeled_buf(out, "priv:", ecx->privkey, ecx->keylen))
    +            return 0;
         } else if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0) {
             /* ecx->pubkey is an array, not a pointer... */
             if (!ecx->haspubkey) {
    @@ -602,29 +607,11 @@ static int ecx_to_text(BIO *out, const void *key, int selection)
                 return 0;
             }
     
    -        switch (ecx->type) {
    -        case ECX_KEY_TYPE_X25519:
    -            type_label = "X25519 Public-Key";
    -            break;
    -        case ECX_KEY_TYPE_X448:
    -            type_label = "X448 Public-Key";
    -            break;
    -        case ECX_KEY_TYPE_ED25519:
    -            type_label = "ED25519 Public-Key";
    -            break;
    -        case ECX_KEY_TYPE_ED448:
    -            type_label = "ED448 Public-Key";
    -            break;
    -        }
    +        if (BIO_printf(out, "%s Public-Key:\n", type_label) <= 0)
    +            return 0;
         }
     
    -    if (BIO_printf(out, "%s:\n", type_label) <= 0)
    -        return 0;
    -    if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0
    -        && !print_labeled_buf(out, "priv:", ecx->privkey, ecx->keylen))
    -        return 0;
    -    if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0
    -        && !print_labeled_buf(out, "pub:", ecx->pubkey, ecx->keylen))
    +    if (!print_labeled_buf(out, "pub:", ecx->pubkey, ecx->keylen))
             return 0;
     
         return 1;
    diff --git a/deps/openssl/openssl/providers/implementations/keymgmt/dh_kmgmt.c b/deps/openssl/openssl/providers/implementations/keymgmt/dh_kmgmt.c
    index 9a7dde7c66273b..c14b9765d11b30 100644
    --- a/deps/openssl/openssl/providers/implementations/keymgmt/dh_kmgmt.c
    +++ b/deps/openssl/openssl/providers/implementations/keymgmt/dh_kmgmt.c
    @@ -222,6 +222,9 @@ static int dh_export(void *keydata, int selection, OSSL_CALLBACK *param_cb,
         if (!ossl_prov_is_running() || dh == NULL)
             return 0;
     
    +    if ((selection & DH_POSSIBLE_SELECTIONS) == 0)
    +        return 0;
    +
         tmpl = OSSL_PARAM_BLD_new();
         if (tmpl == NULL)
             return 0;
    @@ -389,7 +392,7 @@ static int dh_validate_public(const DH *dh, int checktype)
             && ossl_dh_is_named_safe_prime_group(dh))
             return ossl_dh_check_pub_key_partial(dh, pub_key, &res);
     
    -    return DH_check_pub_key(dh, pub_key, &res);
    +    return DH_check_pub_key_ex(dh, pub_key);
     }
     
     static int dh_validate_private(const DH *dh)
    diff --git a/deps/openssl/openssl/providers/implementations/keymgmt/dsa_kmgmt.c b/deps/openssl/openssl/providers/implementations/keymgmt/dsa_kmgmt.c
    index cd8b4410b0db63..2f5742cfcc07ce 100644
    --- a/deps/openssl/openssl/providers/implementations/keymgmt/dsa_kmgmt.c
    +++ b/deps/openssl/openssl/providers/implementations/keymgmt/dsa_kmgmt.c
    @@ -223,6 +223,9 @@ static int dsa_export(void *keydata, int selection, OSSL_CALLBACK *param_cb,
         if (!ossl_prov_is_running() || dsa == NULL)
             return 0;
     
    +    if ((selection & DSA_POSSIBLE_SELECTIONS) == 0)
    +        return 0;
    +
         tmpl = OSSL_PARAM_BLD_new();
         if (tmpl == NULL)
             return 0;
    diff --git a/deps/openssl/openssl/providers/implementations/keymgmt/ecx_kmgmt.c b/deps/openssl/openssl/providers/implementations/keymgmt/ecx_kmgmt.c
    index 2a7f867aa56b3b..987d38456fba41 100644
    --- a/deps/openssl/openssl/providers/implementations/keymgmt/ecx_kmgmt.c
    +++ b/deps/openssl/openssl/providers/implementations/keymgmt/ecx_kmgmt.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2020-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2020-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -238,6 +238,9 @@ static int ecx_export(void *keydata, int selection, OSSL_CALLBACK *param_cb,
         if (!ossl_prov_is_running() || key == NULL)
             return 0;
     
    +    if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) == 0)
    +        return 0;
    +
         tmpl = OSSL_PARAM_BLD_new();
         if (tmpl == NULL)
             return 0;
    diff --git a/deps/openssl/openssl/providers/implementations/keymgmt/mac_legacy_kmgmt.c b/deps/openssl/openssl/providers/implementations/keymgmt/mac_legacy_kmgmt.c
    index c934ff16409415..1fae4407fca609 100644
    --- a/deps/openssl/openssl/providers/implementations/keymgmt/mac_legacy_kmgmt.c
    +++ b/deps/openssl/openssl/providers/implementations/keymgmt/mac_legacy_kmgmt.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2020-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2020-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -281,6 +281,9 @@ static int mac_export(void *keydata, int selection, OSSL_CALLBACK *param_cb,
         if (!ossl_prov_is_running() || key == NULL)
             return 0;
     
    +    if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) == 0)
    +        return 0;
    +
         tmpl = OSSL_PARAM_BLD_new();
         if (tmpl == NULL)
             return 0;
    diff --git a/deps/openssl/openssl/providers/implementations/macs/kmac_prov.c b/deps/openssl/openssl/providers/implementations/macs/kmac_prov.c
    index b2f85398b4e284..99e7c60a74ce50 100644
    --- a/deps/openssl/openssl/providers/implementations/macs/kmac_prov.c
    +++ b/deps/openssl/openssl/providers/implementations/macs/kmac_prov.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2018-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2018-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -249,7 +249,7 @@ static int kmac_setkey(struct kmac_data_st *kctx, const unsigned char *key,
             ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
             return 0;
         }
    -    if (w < 0) {
    +    if (w <= 0) {
             ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_DIGEST_LENGTH);
             return 0;
         }
    @@ -289,7 +289,7 @@ static int kmac_init(void *vmacctx, const unsigned char *key,
             return 0;
     
         t = EVP_MD_get_block_size(ossl_prov_digest_md(&kctx->digest));
    -    if (t < 0) {
    +    if (t <= 0) {
             ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_DIGEST_LENGTH);
             return 0;
         }
    diff --git a/deps/openssl/openssl/ssl/ssl_lib.c b/deps/openssl/openssl/ssl/ssl_lib.c
    index a00e1fe3621c9c..b0ab5c6ef80042 100644
    --- a/deps/openssl/openssl/ssl/ssl_lib.c
    +++ b/deps/openssl/openssl/ssl/ssl_lib.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
      * Copyright 2005 Nokia. All rights reserved.
      *
    @@ -631,7 +631,7 @@ int SSL_clear(SSL *s)
         OPENSSL_free(s->psksession_id);
         s->psksession_id = NULL;
         s->psksession_id_len = 0;
    -    s->hello_retry_request = 0;
    +    s->hello_retry_request = SSL_HRR_NONE;
         s->sent_tickets = 0;
     
         s->error = 0;
    @@ -2894,14 +2894,14 @@ char *SSL_get_shared_ciphers(const SSL *s, char *buf, int size)
             if (sk_SSL_CIPHER_find(srvrsk, c) < 0)
                 continue;
     
    -        n = strlen(c->name);
    -        if (n + 1 > size) {
    +        n = OPENSSL_strnlen(c->name, size);
    +        if (n >= size) {
                 if (p != buf)
                     --p;
                 *p = '\0';
                 return buf;
             }
    -        strcpy(p, c->name);
    +        memcpy(p, c->name, n);
             p += n;
             *(p++) = ':';
             size -= n + 1;
    diff --git a/deps/openssl/openssl/ssl/ssl_sess.c b/deps/openssl/openssl/ssl/ssl_sess.c
    index c322a11d9c52a5..d836b33ed0e81d 100644
    --- a/deps/openssl/openssl/ssl/ssl_sess.c
    +++ b/deps/openssl/openssl/ssl/ssl_sess.c
    @@ -198,8 +198,11 @@ SSL_SESSION *ssl_session_dup(const SSL_SESSION *src, int ticket)
         dest->references = 1;
     
         dest->lock = CRYPTO_THREAD_lock_new();
    -    if (dest->lock == NULL)
    +    if (dest->lock == NULL) {
    +        OPENSSL_free(dest);
    +        dest = NULL;
             goto err;
    +    }
     
         if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, dest, &dest->ex_data))
             goto err;
    diff --git a/deps/openssl/openssl/ssl/statem/extensions_srvr.c b/deps/openssl/openssl/ssl/statem/extensions_srvr.c
    index ed53b28aba80ab..0dfbfed9a4af6c 100644
    --- a/deps/openssl/openssl/ssl/statem/extensions_srvr.c
    +++ b/deps/openssl/openssl/ssl/statem/extensions_srvr.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2016-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2016-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -883,7 +883,7 @@ int tls_parse_ctos_cookie(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
         }
     
         /* Act as if this ClientHello came after a HelloRetryRequest */
    -    s->hello_retry_request = 1;
    +    s->hello_retry_request = SSL_HRR_PENDING;
     
         s->ext.cookieok = 1;
     #endif
    diff --git a/deps/openssl/openssl/test/README-dev.md b/deps/openssl/openssl/test/README-dev.md
    index d015bcf5bfb019..d8922de000800f 100644
    --- a/deps/openssl/openssl/test/README-dev.md
    +++ b/deps/openssl/openssl/test/README-dev.md
    @@ -130,7 +130,11 @@ Generic form of C test executables
         int setup_tests(void)
         {
             ADD_TEST(my_test);                  /* Add each test separately     */
    -        return 1;                           /* Indicate success             */
    +        return 1;                           /* Indicates success.  Return 0 */
    +                                            /* to produce an error with a   */
    +                                            /* usage message and -1 for     */
    +                                            /* failure to set up with no    */
    +                                            /* usage message.               */
         }
     
     You should use the `TEST_xxx` macros provided by `testutil.h` to test all failure
    diff --git a/deps/openssl/openssl/test/chacha_internal_test.c b/deps/openssl/openssl/test/chacha_internal_test.c
    index 878bd752e054bb..d316bfd7b36170 100644
    --- a/deps/openssl/openssl/test/chacha_internal_test.c
    +++ b/deps/openssl/openssl/test/chacha_internal_test.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2017 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2017-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -181,7 +181,7 @@ static int test_cha_cha_internal(int n)
     
     int setup_tests(void)
     {
    -#ifdef CPUID_OBJ
    +#ifdef OPENSSL_CPUID_OBJ
         OPENSSL_cpuid_setup();
     #endif
     
    diff --git a/deps/openssl/openssl/test/cmp_asn_test.c b/deps/openssl/openssl/test/cmp_asn_test.c
    index 1e65b383753eab..42a6b93b6b2732 100644
    --- a/deps/openssl/openssl/test/cmp_asn_test.c
    +++ b/deps/openssl/openssl/test/cmp_asn_test.c
    @@ -42,16 +42,28 @@ static void tear_down(CMP_ASN_TEST_FIXTURE *fixture)
     
     static int execute_cmp_asn1_get_int_test(CMP_ASN_TEST_FIXTURE *fixture)
     {
    -    int res;
    +    int res = 0;
         ASN1_INTEGER *asn1integer = ASN1_INTEGER_new();
    +    const int good_int = 77;
    +    const int64_t max_int = INT_MAX;
     
         if (!TEST_ptr(asn1integer))
    -        return 0;
    -    if (!TEST_true(ASN1_INTEGER_set(asn1integer, 77))) {
    +        return res;
    +
    +    if (!TEST_true(ASN1_INTEGER_set(asn1integer, good_int))) {
             ASN1_INTEGER_free(asn1integer);
             return 0;
         }
    -    res = TEST_int_eq(77, ossl_cmp_asn1_get_int(asn1integer));
    +    res = TEST_int_eq(good_int, ossl_cmp_asn1_get_int(asn1integer));
    +    if (res == 0)
    +        goto err;
    +
    +    res = 0;
    +    if (!TEST_true(ASN1_INTEGER_set_int64(asn1integer, max_int + 1)))
    +        goto err;
    +    res = TEST_int_eq(-2, ossl_cmp_asn1_get_int(asn1integer));
    +
    + err:
         ASN1_INTEGER_free(asn1integer);
         return res;
     }
    diff --git a/deps/openssl/openssl/test/cmp_protect_test.c b/deps/openssl/openssl/test/cmp_protect_test.c
    index 32dae32d9398d9..09bf2ec17faffa 100644
    --- a/deps/openssl/openssl/test/cmp_protect_test.c
    +++ b/deps/openssl/openssl/test/cmp_protect_test.c
    @@ -37,15 +37,17 @@ static OSSL_PROVIDER *default_null_provider = NULL, *provider = NULL;
     
     static void tear_down(CMP_PROTECT_TEST_FIXTURE *fixture)
     {
    -    OSSL_CMP_CTX_free(fixture->cmp_ctx);
    -    OSSL_CMP_MSG_free(fixture->msg);
    -    OSSL_CMP_PKISI_free(fixture->si);
    +    if (fixture != NULL) {
    +        OSSL_CMP_CTX_free(fixture->cmp_ctx);
    +        OSSL_CMP_MSG_free(fixture->msg);
    +        OSSL_CMP_PKISI_free(fixture->si);
     
    -    OPENSSL_free(fixture->mem);
    -    sk_X509_free(fixture->certs);
    -    sk_X509_free(fixture->chain);
    +        OPENSSL_free(fixture->mem);
    +        sk_X509_free(fixture->certs);
    +        sk_X509_free(fixture->chain);
     
    -    OPENSSL_free(fixture);
    +        OPENSSL_free(fixture);
    +    }
     }
     
     static CMP_PROTECT_TEST_FIXTURE *set_up(const char *const test_case_name)
    diff --git a/deps/openssl/openssl/test/cmsapitest.c b/deps/openssl/openssl/test/cmsapitest.c
    index d5c4cb8481c210..dbb05cd4962269 100644
    --- a/deps/openssl/openssl/test/cmsapitest.c
    +++ b/deps/openssl/openssl/test/cmsapitest.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2018-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2018-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -56,7 +56,7 @@ static int test_encrypt_decrypt(const EVP_CIPHER *cipher)
         BIO_free(outmsgbio);
         CMS_ContentInfo_free(content);
     
    -    return testresult;
    +    return testresult && TEST_int_eq(ERR_peek_error(), 0);
     }
     
     static int test_encrypt_decrypt_aes_cbc(void)
    @@ -286,7 +286,7 @@ static int test_d2i_CMS_bio_NULL(void)
                                       CMS_NO_SIGNER_CERT_VERIFY));
         CMS_ContentInfo_free(cms);
         BIO_free(bio);
    -    return ret;
    +    return ret && TEST_int_eq(ERR_peek_error(), 0);
     }
     
     static unsigned char *read_all(BIO *bio, long *p_len)
    diff --git a/deps/openssl/openssl/test/endecode_test.c b/deps/openssl/openssl/test/endecode_test.c
    index e3f7b81f693077..5158b39ee41f19 100644
    --- a/deps/openssl/openssl/test/endecode_test.c
    +++ b/deps/openssl/openssl/test/endecode_test.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2020-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2020-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -158,6 +158,7 @@ static int test_encode_decode(const char *file, const int line,
         void *encoded = NULL;
         long encoded_len = 0;
         EVP_PKEY *pkey2 = NULL;
    +    EVP_PKEY *pkey3 = NULL;
         void *encoded2 = NULL;
         long encoded2_len = 0;
         int ok = 0;
    @@ -185,15 +186,25 @@ static int test_encode_decode(const char *file, const int line,
                                     output_type, output_structure,
                                     (flags & FLAG_DECODE_WITH_TYPE ? type : NULL),
                                     selection, pass))
    +        || ((output_structure == NULL
    +             || strcmp(output_structure, "type-specific") != 0)
    +            && !TEST_true(decode_cb(file, line, (void **)&pkey3, encoded, encoded_len,
    +                                    output_type, output_structure,
    +                                    (flags & FLAG_DECODE_WITH_TYPE ? type : NULL),
    +                                    0, pass)))
             || !TEST_true(encode_cb(file, line, &encoded2, &encoded2_len, pkey2, selection,
                                     output_type, output_structure, pass, pcipher)))
             goto end;
     
         if (selection == OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS) {
    -        if (!TEST_int_eq(EVP_PKEY_parameters_eq(pkey, pkey2), 1))
    +        if (!TEST_int_eq(EVP_PKEY_parameters_eq(pkey, pkey2), 1)
    +            || (pkey3 != NULL
    +                && !TEST_int_eq(EVP_PKEY_parameters_eq(pkey, pkey3), 1)))
                 goto end;
         } else {
    -        if (!TEST_int_eq(EVP_PKEY_eq(pkey, pkey2), 1))
    +        if (!TEST_int_eq(EVP_PKEY_eq(pkey, pkey2), 1)
    +            || (pkey3 != NULL
    +                && !TEST_int_eq(EVP_PKEY_eq(pkey, pkey3), 1)))
                 goto end;
         }
     
    @@ -218,6 +229,7 @@ static int test_encode_decode(const char *file, const int line,
         OPENSSL_free(encoded);
         OPENSSL_free(encoded2);
         EVP_PKEY_free(pkey2);
    +    EVP_PKEY_free(pkey3);
         return ok;
     }
     
    diff --git a/deps/openssl/openssl/test/evp_extra_test.c b/deps/openssl/openssl/test/evp_extra_test.c
    index a6667105dcdcda..2318bf6a68c9fe 100644
    --- a/deps/openssl/openssl/test/evp_extra_test.c
    +++ b/deps/openssl/openssl/test/evp_extra_test.c
    @@ -1133,11 +1133,11 @@ static int test_EVP_PKEY_sign(int tst)
     
         if (tst == 0 ) {
             if (!TEST_ptr(pkey = load_example_rsa_key()))
    -                goto out;
    +            goto out;
         } else if (tst == 1) {
     #ifndef OPENSSL_NO_DSA
             if (!TEST_ptr(pkey = load_example_dsa_key()))
    -                goto out;
    +            goto out;
     #else
             ret = 1;
             goto out;
    @@ -1145,7 +1145,82 @@ static int test_EVP_PKEY_sign(int tst)
         } else {
     #ifndef OPENSSL_NO_EC
             if (!TEST_ptr(pkey = load_example_ec_key()))
    +            goto out;
    +#else
    +        ret = 1;
    +        goto out;
    +#endif
    +    }
    +
    +    ctx = EVP_PKEY_CTX_new_from_pkey(testctx, pkey, NULL);
    +    if (!TEST_ptr(ctx)
    +            || !TEST_int_gt(EVP_PKEY_sign_init(ctx), 0)
    +            || !TEST_int_gt(EVP_PKEY_sign(ctx, NULL, &sig_len, tbs,
    +                                          sizeof(tbs)), 0))
    +        goto out;
    +    sig = OPENSSL_malloc(sig_len);
    +    if (!TEST_ptr(sig)
    +            /* Test sending a signature buffer that is too short is rejected */
    +            || !TEST_int_le(EVP_PKEY_sign(ctx, sig, &shortsig_len, tbs,
    +                                          sizeof(tbs)), 0)
    +            || !TEST_int_gt(EVP_PKEY_sign(ctx, sig, &sig_len, tbs, sizeof(tbs)),
    +                            0)
    +            /* Test the signature round-trips */
    +            || !TEST_int_gt(EVP_PKEY_verify_init(ctx), 0)
    +            || !TEST_int_gt(EVP_PKEY_verify(ctx, sig, sig_len, tbs, sizeof(tbs)),
    +                            0))
    +        goto out;
    +
    +    ret = 1;
    + out:
    +    EVP_PKEY_CTX_free(ctx);
    +    OPENSSL_free(sig);
    +    EVP_PKEY_free(pkey);
    +    return ret;
    +}
    +
    +#ifndef OPENSSL_NO_DEPRECATED_3_0
    +static int test_EVP_PKEY_sign_with_app_method(int tst)
    +{
    +    int ret = 0;
    +    EVP_PKEY *pkey = NULL;
    +    RSA *rsa = NULL;
    +    RSA_METHOD *rsa_meth = NULL;
    +#ifndef OPENSSL_NO_DSA
    +    DSA *dsa = NULL;
    +    DSA_METHOD *dsa_meth = NULL;
    +#endif
    +    unsigned char *sig = NULL;
    +    size_t sig_len = 0, shortsig_len = 1;
    +    EVP_PKEY_CTX *ctx = NULL;
    +    unsigned char tbs[] = {
    +        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
    +        0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13
    +    };
    +
    +    if (tst == 0) {
    +        if (!TEST_ptr(pkey = load_example_rsa_key()))
    +            goto out;
    +        if (!TEST_ptr(rsa_meth = RSA_meth_dup(RSA_get_default_method())))
    +            goto out;
    +
    +        if (!TEST_ptr(rsa = EVP_PKEY_get1_RSA(pkey))
    +            || !TEST_int_gt(RSA_set_method(rsa, rsa_meth), 0)
    +            || !TEST_int_gt(EVP_PKEY_assign_RSA(pkey, rsa), 0))
    +            goto out;
    +        rsa = NULL; /* now owned by the pkey */
    +    } else {
    +#ifndef OPENSSL_NO_DSA
    +        if (!TEST_ptr(pkey = load_example_dsa_key()))
                     goto out;
    +        if (!TEST_ptr(dsa_meth = DSA_meth_dup(DSA_get_default_method())))
    +            goto out;
    +
    +        if (!TEST_ptr(dsa = EVP_PKEY_get1_DSA(pkey))
    +            || !TEST_int_gt(DSA_set_method(dsa, dsa_meth), 0)
    +            || !TEST_int_gt(EVP_PKEY_assign_DSA(pkey, dsa), 0))
    +            goto out;
    +        dsa = NULL; /* now owned by the pkey */
     #else
             ret = 1;
             goto out;
    @@ -1176,8 +1251,15 @@ static int test_EVP_PKEY_sign(int tst)
         EVP_PKEY_CTX_free(ctx);
         OPENSSL_free(sig);
         EVP_PKEY_free(pkey);
    +    RSA_free(rsa);
    +    RSA_meth_free(rsa_meth);
    +#ifndef OPENSSL_NO_DSA
    +    DSA_free(dsa);
    +    DSA_meth_free(dsa_meth);
    +#endif
         return ret;
     }
    +#endif /* !OPENSSL_NO_DEPRECATED_3_0 */
     
     /*
      * n = 0 => test using legacy cipher
    @@ -2830,6 +2912,36 @@ static int test_RSA_OAEP_set_get_params(void)
         return ret;
     }
     
    +/* https://github.com/openssl/openssl/issues/21288 */
    +static int test_RSA_OAEP_set_null_label(void)
    +{
    +    int ret = 0;
    +    EVP_PKEY *key = NULL;
    +    EVP_PKEY_CTX *key_ctx = NULL;
    +
    +    if (!TEST_ptr(key = load_example_rsa_key())
    +        || !TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(testctx, key, NULL))
    +        || !TEST_true(EVP_PKEY_encrypt_init(key_ctx)))
    +        goto err;
    +
    +    if (!TEST_true(EVP_PKEY_CTX_set_rsa_padding(key_ctx, RSA_PKCS1_OAEP_PADDING)))
    +        goto err;
    +
    +    if (!TEST_true(EVP_PKEY_CTX_set0_rsa_oaep_label(key_ctx, OPENSSL_strdup("foo"), 0)))
    +        goto err;
    +
    +    if (!TEST_true(EVP_PKEY_CTX_set0_rsa_oaep_label(key_ctx, NULL, 0)))
    +        goto err;
    +
    +    ret = 1;
    +
    + err:
    +    EVP_PKEY_free(key);
    +    EVP_PKEY_CTX_free(key_ctx);
    +
    +    return ret;
    +}
    +
     #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
     static int test_decrypt_null_chunks(void)
     {
    @@ -4739,6 +4851,253 @@ static int test_ecx_not_private_key(int tst)
     }
     #endif /* OPENSSL_NO_EC */
     
    +static int aes_gcm_encrypt(const unsigned char *gcm_key, size_t gcm_key_s,
    +                           const unsigned char *gcm_iv, size_t gcm_ivlen,
    +                           const unsigned char *gcm_pt, size_t gcm_pt_s,
    +                           const unsigned char *gcm_aad, size_t gcm_aad_s,
    +                           const unsigned char *gcm_ct, size_t gcm_ct_s,
    +                           const unsigned char *gcm_tag, size_t gcm_tag_s)
    +{
    +    int ret = 0;
    +    EVP_CIPHER_CTX *ctx;
    +    EVP_CIPHER *cipher = NULL;
    +    int outlen, tmplen;
    +    unsigned char outbuf[1024];
    +    unsigned char outtag[16];
    +    OSSL_PARAM params[2] = {
    +        OSSL_PARAM_END, OSSL_PARAM_END
    +    };
    +
    +    if (!TEST_ptr(ctx = EVP_CIPHER_CTX_new())
    +            || !TEST_ptr(cipher = EVP_CIPHER_fetch(testctx, "AES-256-GCM", "")))
    +        goto err;
    +
    +    params[0] = OSSL_PARAM_construct_size_t(OSSL_CIPHER_PARAM_AEAD_IVLEN,
    +                                            &gcm_ivlen);
    +
    +    if (!TEST_true(EVP_EncryptInit_ex2(ctx, cipher, gcm_key, gcm_iv, params))
    +            || (gcm_aad != NULL
    +                && !TEST_true(EVP_EncryptUpdate(ctx, NULL, &outlen,
    +                                                gcm_aad, gcm_aad_s)))
    +            || !TEST_true(EVP_EncryptUpdate(ctx, outbuf, &outlen,
    +                                            gcm_pt, gcm_pt_s))
    +            || !TEST_true(EVP_EncryptFinal_ex(ctx, outbuf, &tmplen)))
    +        goto err;
    +
    +    params[0] = OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_AEAD_TAG,
    +                                                  outtag, sizeof(outtag));
    +
    +    if (!TEST_true(EVP_CIPHER_CTX_get_params(ctx, params))
    +            || !TEST_mem_eq(outbuf, outlen, gcm_ct, gcm_ct_s)
    +            || !TEST_mem_eq(outtag, gcm_tag_s, gcm_tag, gcm_tag_s))
    +        goto err;
    +
    +    ret = 1;
    +err:
    +    EVP_CIPHER_free(cipher);
    +    EVP_CIPHER_CTX_free(ctx);
    +
    +    return ret;
    +}
    +
    +static int aes_gcm_decrypt(const unsigned char *gcm_key, size_t gcm_key_s,
    +                           const unsigned char *gcm_iv, size_t gcm_ivlen,
    +                           const unsigned char *gcm_pt, size_t gcm_pt_s,
    +                           const unsigned char *gcm_aad, size_t gcm_aad_s,
    +                           const unsigned char *gcm_ct, size_t gcm_ct_s,
    +                           const unsigned char *gcm_tag, size_t gcm_tag_s)
    +{
    +    int ret = 0;
    +    EVP_CIPHER_CTX *ctx;
    +    EVP_CIPHER *cipher = NULL;
    +    int outlen;
    +    unsigned char outbuf[1024];
    +    OSSL_PARAM params[2] = {
    +        OSSL_PARAM_END, OSSL_PARAM_END
    +    };
    +
    +    if ((ctx = EVP_CIPHER_CTX_new()) == NULL)
    +        goto err;
    +
    +    if ((cipher = EVP_CIPHER_fetch(testctx, "AES-256-GCM", "")) == NULL)
    +        goto err;
    +
    +    params[0] = OSSL_PARAM_construct_size_t(OSSL_CIPHER_PARAM_AEAD_IVLEN,
    +                                            &gcm_ivlen);
    +
    +    if (!TEST_true(EVP_DecryptInit_ex2(ctx, cipher, gcm_key, gcm_iv, params))
    +            || (gcm_aad != NULL
    +                && !TEST_true(EVP_DecryptUpdate(ctx, NULL, &outlen,
    +                                                gcm_aad, gcm_aad_s)))
    +            || !TEST_true(EVP_DecryptUpdate(ctx, outbuf, &outlen,
    +                                            gcm_ct, gcm_ct_s))
    +            || !TEST_mem_eq(outbuf, outlen, gcm_pt, gcm_pt_s))
    +        goto err;
    +
    +    params[0] = OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_AEAD_TAG,
    +                                                  (void*)gcm_tag, gcm_tag_s);
    +
    +    if (!TEST_true(EVP_CIPHER_CTX_set_params(ctx, params))
    +            ||!TEST_true(EVP_DecryptFinal_ex(ctx, outbuf, &outlen)))
    +        goto err;
    +
    +    ret = 1;
    +err:
    +    EVP_CIPHER_free(cipher);
    +    EVP_CIPHER_CTX_free(ctx);
    +
    +    return ret;
    +}
    +
    +static int test_aes_gcm_ivlen_change_cve_2023_5363(void)
    +{
    +    /* AES-GCM test data obtained from NIST public test vectors */
    +    static const unsigned char gcm_key[] = {
    +        0xd0, 0xc2, 0x67, 0xc1, 0x9f, 0x30, 0xd8, 0x0b, 0x89, 0x14, 0xbb, 0xbf,
    +        0xb7, 0x2f, 0x73, 0xb8, 0xd3, 0xcd, 0x5f, 0x6a, 0x78, 0x70, 0x15, 0x84,
    +        0x8a, 0x7b, 0x30, 0xe3, 0x8f, 0x16, 0xf1, 0x8b,
    +    };
    +    static const unsigned char gcm_iv[] = {
    +        0xb6, 0xdc, 0xda, 0x95, 0xac, 0x99, 0x77, 0x76, 0x25, 0xae, 0x87, 0xf8,
    +        0xa3, 0xa9, 0xdd, 0x64, 0xd7, 0x9b, 0xbd, 0x5f, 0x4a, 0x0e, 0x54, 0xca,
    +        0x1a, 0x9f, 0xa2, 0xe3, 0xf4, 0x5f, 0x5f, 0xc2, 0xce, 0xa7, 0xb6, 0x14,
    +        0x12, 0x6f, 0xf0, 0xaf, 0xfd, 0x3e, 0x17, 0x35, 0x6e, 0xa0, 0x16, 0x09,
    +        0xdd, 0xa1, 0x3f, 0xd8, 0xdd, 0xf3, 0xdf, 0x4f, 0xcb, 0x18, 0x49, 0xb8,
    +        0xb3, 0x69, 0x2c, 0x5d, 0x4f, 0xad, 0x30, 0x91, 0x08, 0xbc, 0xbe, 0x24,
    +        0x01, 0x0f, 0xbe, 0x9c, 0xfb, 0x4f, 0x5d, 0x19, 0x7f, 0x4c, 0x53, 0xb0,
    +        0x95, 0x90, 0xac, 0x7b, 0x1f, 0x7b, 0xa0, 0x99, 0xe1, 0xf3, 0x48, 0x54,
    +        0xd0, 0xfc, 0xa9, 0xcc, 0x91, 0xf8, 0x1f, 0x9b, 0x6c, 0x9a, 0xe0, 0xdc,
    +        0x63, 0xea, 0x7d, 0x2a, 0x4a, 0x7d, 0xa5, 0xed, 0x68, 0x57, 0x27, 0x6b,
    +        0x68, 0xe0, 0xf2, 0xb8, 0x51, 0x50, 0x8d, 0x3d,
    +    };
    +    static const unsigned char gcm_pt[] = {
    +        0xb8, 0xb6, 0x88, 0x36, 0x44, 0xe2, 0x34, 0xdf, 0x24, 0x32, 0x91, 0x07,
    +        0x4f, 0xe3, 0x6f, 0x81,
    +    };
    +    static const unsigned char gcm_ct[] = {
    +        0xff, 0x4f, 0xb3, 0xf3, 0xf9, 0xa2, 0x51, 0xd4, 0x82, 0xc2, 0xbe, 0xf3,
    +        0xe2, 0xd0, 0xec, 0xed,
    +    };
    +    static const unsigned char gcm_tag[] = {
    +        0xbd, 0x06, 0x38, 0x09, 0xf7, 0xe1, 0xc4, 0x72, 0x0e, 0xf2, 0xea, 0x63,
    +        0xdb, 0x99, 0x6c, 0x21,
    +    };
    +
    +    return aes_gcm_encrypt(gcm_key, sizeof(gcm_key), gcm_iv, sizeof(gcm_iv),
    +                           gcm_pt, sizeof(gcm_pt), NULL, 0,
    +                           gcm_ct, sizeof(gcm_ct), gcm_tag, sizeof(gcm_tag))
    +        && aes_gcm_decrypt(gcm_key, sizeof(gcm_key), gcm_iv, sizeof(gcm_iv),
    +                           gcm_pt, sizeof(gcm_pt), NULL, 0,
    +                           gcm_ct, sizeof(gcm_ct), gcm_tag, sizeof(gcm_tag));
    +}
    +
    +#ifndef OPENSSL_NO_RC4
    +static int rc4_encrypt(const unsigned char *rc4_key, size_t rc4_key_s,
    +                       const unsigned char *rc4_pt, size_t rc4_pt_s,
    +                       const unsigned char *rc4_ct, size_t rc4_ct_s)
    +{
    +    int ret = 0;
    +    EVP_CIPHER_CTX *ctx;
    +    EVP_CIPHER *cipher = NULL;
    +    int outlen, tmplen;
    +    unsigned char outbuf[1024];
    +    OSSL_PARAM params[2] = {
    +        OSSL_PARAM_END, OSSL_PARAM_END
    +    };
    +
    +    if (!TEST_ptr(ctx = EVP_CIPHER_CTX_new())
    +            || !TEST_ptr(cipher = EVP_CIPHER_fetch(testctx, "RC4", "")))
    +        goto err;
    +
    +    params[0] = OSSL_PARAM_construct_size_t(OSSL_CIPHER_PARAM_KEYLEN,
    +                                            &rc4_key_s);
    +
    +    if (!TEST_true(EVP_EncryptInit_ex2(ctx, cipher, rc4_key, NULL, params))
    +            || !TEST_true(EVP_EncryptUpdate(ctx, outbuf, &outlen,
    +                                            rc4_pt, rc4_pt_s))
    +            || !TEST_true(EVP_EncryptFinal_ex(ctx, outbuf, &tmplen)))
    +        goto err;
    +
    +    if (!TEST_mem_eq(outbuf, outlen, rc4_ct, rc4_ct_s))
    +        goto err;
    +
    +    ret = 1;
    +err:
    +    EVP_CIPHER_free(cipher);
    +    EVP_CIPHER_CTX_free(ctx);
    +
    +    return ret;
    +}
    +
    +static int rc4_decrypt(const unsigned char *rc4_key, size_t rc4_key_s,
    +                       const unsigned char *rc4_pt, size_t rc4_pt_s,
    +                       const unsigned char *rc4_ct, size_t rc4_ct_s)
    +{
    +    int ret = 0;
    +    EVP_CIPHER_CTX *ctx;
    +    EVP_CIPHER *cipher = NULL;
    +    int outlen;
    +    unsigned char outbuf[1024];
    +    OSSL_PARAM params[2] = {
    +        OSSL_PARAM_END, OSSL_PARAM_END
    +    };
    +
    +    if ((ctx = EVP_CIPHER_CTX_new()) == NULL)
    +        goto err;
    +
    +    if ((cipher = EVP_CIPHER_fetch(testctx, "RC4", "")) == NULL)
    +        goto err;
    +
    +    params[0] = OSSL_PARAM_construct_size_t(OSSL_CIPHER_PARAM_KEYLEN,
    +                                            &rc4_key_s);
    +
    +    if (!TEST_true(EVP_DecryptInit_ex2(ctx, cipher, rc4_key, NULL, params))
    +            || !TEST_true(EVP_DecryptUpdate(ctx, outbuf, &outlen,
    +                                            rc4_ct, rc4_ct_s))
    +            || !TEST_mem_eq(outbuf, outlen, rc4_pt, rc4_pt_s))
    +        goto err;
    +
    +    ret = 1;
    +err:
    +    EVP_CIPHER_free(cipher);
    +    EVP_CIPHER_CTX_free(ctx);
    +
    +    return ret;
    +}
    +
    +static int test_aes_rc4_keylen_change_cve_2023_5363(void)
    +{
    +    /* RC4 test data obtained from RFC 6229 */
    +    static const struct {
    +        unsigned char key[5];
    +        unsigned char padding[11];
    +    } rc4_key = {
    +        {   /* Five bytes of key material */
    +            0x83, 0x32, 0x22, 0x77, 0x2a,
    +        },
    +        {   /* Random padding to 16 bytes */
    +            0x80, 0xad, 0x97, 0xbd, 0xc9, 0x73, 0xdf, 0x8a, 0xaa, 0x32, 0x91
    +        }
    +    };
    +    static const unsigned char rc4_pt[] = {
    +        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    +        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    +    };
    +    static const unsigned char rc4_ct[] = {
    +        0x80, 0xad, 0x97, 0xbd, 0xc9, 0x73, 0xdf, 0x8a,
    +        0x2e, 0x87, 0x9e, 0x92, 0xa4, 0x97, 0xef, 0xda
    +    };
    +
    +    if (lgcyprov == NULL)
    +        return TEST_skip("Test requires legacy provider to be loaded");
    +
    +    return rc4_encrypt(rc4_key.key, sizeof(rc4_key.key),
    +                       rc4_pt, sizeof(rc4_pt), rc4_ct, sizeof(rc4_ct))
    +        && rc4_decrypt(rc4_key.key, sizeof(rc4_key.key),
    +                       rc4_pt, sizeof(rc4_pt), rc4_ct, sizeof(rc4_ct));
    +}
    +#endif
    +
     int setup_tests(void)
     {
         OPTION_CHOICE o;
    @@ -4771,6 +5130,9 @@ int setup_tests(void)
         ADD_TEST(test_EVP_Digest);
         ADD_TEST(test_EVP_md_null);
         ADD_ALL_TESTS(test_EVP_PKEY_sign, 3);
    +#ifndef OPENSSL_NO_DEPRECATED_3_0
    +    ADD_ALL_TESTS(test_EVP_PKEY_sign_with_app_method, 2);
    +#endif
         ADD_ALL_TESTS(test_EVP_Enveloped, 2);
         ADD_ALL_TESTS(test_d2i_AutoPrivateKey, OSSL_NELEM(keydata));
         ADD_TEST(test_privatekey_to_pkcs8);
    @@ -4814,6 +5176,7 @@ int setup_tests(void)
     #endif
         ADD_TEST(test_RSA_get_set_params);
         ADD_TEST(test_RSA_OAEP_set_get_params);
    +    ADD_TEST(test_RSA_OAEP_set_null_label);
     #if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
         ADD_TEST(test_decrypt_null_chunks);
     #endif
    @@ -4878,6 +5241,12 @@ int setup_tests(void)
         ADD_ALL_TESTS(test_ecx_not_private_key, OSSL_NELEM(keys));
     #endif
     
    +    /* Test cases for CVE-2023-5363 */
    +    ADD_TEST(test_aes_gcm_ivlen_change_cve_2023_5363);
    +#ifndef OPENSSL_NO_RC4
    +    ADD_TEST(test_aes_rc4_keylen_change_cve_2023_5363);
    +#endif
    +
         return 1;
     }
     
    diff --git a/deps/openssl/openssl/test/ffc_internal_test.c b/deps/openssl/openssl/test/ffc_internal_test.c
    index 7f8f44c8a9fdc7..83dec13c8c9b33 100644
    --- a/deps/openssl/openssl/test/ffc_internal_test.c
    +++ b/deps/openssl/openssl/test/ffc_internal_test.c
    @@ -455,22 +455,20 @@ static int ffc_public_validate_test(void)
         if (!TEST_true(BN_set_word(pub, 1)))
             goto err;
         BN_set_negative(pub, 1);
    -    /* Fail if public key is negative */
    -    if (!TEST_false(ossl_ffc_validate_public_key(params, pub, &res)))
    +    /* Check must succeed but set res if public key is negative */
    +    if (!TEST_true(ossl_ffc_validate_public_key(params, pub, &res)))
             goto err;
         if (!TEST_int_eq(FFC_ERROR_PUBKEY_TOO_SMALL, res))
             goto err;
         if (!TEST_true(BN_set_word(pub, 0)))
             goto err;
    -    if (!TEST_int_eq(FFC_ERROR_PUBKEY_TOO_SMALL, res))
    -        goto err;
    -    /* Fail if public key is zero */
    -    if (!TEST_false(ossl_ffc_validate_public_key(params, pub, &res)))
    +    /* Check must succeed but set res if public key is zero */
    +    if (!TEST_true(ossl_ffc_validate_public_key(params, pub, &res)))
             goto err;
         if (!TEST_int_eq(FFC_ERROR_PUBKEY_TOO_SMALL, res))
             goto err;
    -    /* Fail if public key is 1 */
    -    if (!TEST_false(ossl_ffc_validate_public_key(params, BN_value_one(), &res)))
    +    /* Check must succeed but set res if public key is 1 */
    +    if (!TEST_true(ossl_ffc_validate_public_key(params, BN_value_one(), &res)))
             goto err;
         if (!TEST_int_eq(FFC_ERROR_PUBKEY_TOO_SMALL, res))
             goto err;
    @@ -482,24 +480,24 @@ static int ffc_public_validate_test(void)
     
         if (!TEST_ptr(BN_copy(pub, params->p)))
             goto err;
    -    /* Fail if public key = p */
    -    if (!TEST_false(ossl_ffc_validate_public_key(params, pub, &res)))
    +    /* Check must succeed but set res if public key = p */
    +    if (!TEST_true(ossl_ffc_validate_public_key(params, pub, &res)))
             goto err;
         if (!TEST_int_eq(FFC_ERROR_PUBKEY_TOO_LARGE, res))
             goto err;
     
         if (!TEST_true(BN_sub_word(pub, 1)))
             goto err;
    -    /* Fail if public key = p - 1 */
    -    if (!TEST_false(ossl_ffc_validate_public_key(params, pub, &res)))
    +    /* Check must succeed but set res if public key = p - 1 */
    +    if (!TEST_true(ossl_ffc_validate_public_key(params, pub, &res)))
             goto err;
         if (!TEST_int_eq(FFC_ERROR_PUBKEY_TOO_LARGE, res))
             goto err;
     
         if (!TEST_true(BN_sub_word(pub, 1)))
             goto err;
    -    /* Fail if public key is not related to p & q */
    -    if (!TEST_false(ossl_ffc_validate_public_key(params, pub, &res)))
    +    /* Check must succeed but set res if public key is not related to p & q */
    +    if (!TEST_true(ossl_ffc_validate_public_key(params, pub, &res)))
             goto err;
         if (!TEST_int_eq(FFC_ERROR_PUBKEY_INVALID, res))
             goto err;
    @@ -510,14 +508,14 @@ static int ffc_public_validate_test(void)
         if (!TEST_true(ossl_ffc_validate_public_key(params, pub, &res)))
             goto err;
     
    -    /* Fail if params is NULL */
    -    if (!TEST_false(ossl_ffc_validate_public_key(NULL, pub, &res)))
    +    /* Check must succeed but set res if params is NULL */
    +    if (!TEST_true(ossl_ffc_validate_public_key(NULL, pub, &res)))
             goto err;
         if (!TEST_int_eq(FFC_ERROR_PASSED_NULL_PARAM, res))
             goto err;
         res = -1;
    -    /* Fail if pubkey is NULL */
    -    if (!TEST_false(ossl_ffc_validate_public_key(params, NULL, &res)))
    +    /* Check must succeed but set res if pubkey is NULL */
    +    if (!TEST_true(ossl_ffc_validate_public_key(params, NULL, &res)))
             goto err;
         if (!TEST_int_eq(FFC_ERROR_PASSED_NULL_PARAM, res))
             goto err;
    @@ -525,8 +523,8 @@ static int ffc_public_validate_test(void)
     
         BN_free(params->p);
         params->p = NULL;
    -    /* Fail if params->p is NULL */
    -    if (!TEST_false(ossl_ffc_validate_public_key(params, pub, &res)))
    +    /* Check must succeed but set res if params->p is NULL */
    +    if (!TEST_true(ossl_ffc_validate_public_key(params, pub, &res)))
             goto err;
         if (!TEST_int_eq(FFC_ERROR_PASSED_NULL_PARAM, res))
             goto err;
    diff --git a/deps/openssl/openssl/test/pbetest.c b/deps/openssl/openssl/test/pbetest.c
    index d73ae66fa536af..cfffc2b9323327 100644
    --- a/deps/openssl/openssl/test/pbetest.c
    +++ b/deps/openssl/openssl/test/pbetest.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2021-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2021-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -15,6 +15,8 @@
     #include 
     #include 
     #include 
    +#include 
    +#include 
     
     #if !defined OPENSSL_NO_RC4 && !defined OPENSSL_NO_MD5 \
         || !defined OPENSSL_NO_DES && !defined OPENSSL_NO_SHA1
    @@ -123,8 +125,27 @@ static int test_pkcs5_pbe_des_sha1(void)
     }
     #endif
     
    +#ifdef OPENSSL_NO_AUTOLOAD_CONFIG
    +/*
    + * For configurations where we are not autoloading configuration, we need
    + * to access the legacy provider.  The easiest way is to load both the
    + * legacy and default providers directly and unload them on termination.
    + */
    +static OSSL_PROVIDER *legacy, *dflt;
    +#endif
    +
     int setup_tests(void)
     {
    +#ifdef OPENSSL_NO_AUTOLOAD_CONFIG
    +    /* Load required providers if not done via configuration */
    +    legacy = OSSL_PROVIDER_load(NULL, "legacy");
    +    dflt = OSSL_PROVIDER_load(NULL, "default");
    +    if (!TEST_ptr(legacy) || !TEST_ptr(dflt)) {
    +        cleanup_tests();
    +        return -1;
    +    }
    +#endif
    +
     #if !defined OPENSSL_NO_RC4 && !defined OPENSSL_NO_MD5
         ADD_TEST(test_pkcs5_pbe_rc4_md5);
     #endif
    @@ -134,3 +155,13 @@ int setup_tests(void)
     
         return 1;
     }
    +
    +#ifdef OPENSSL_NO_AUTOLOAD_CONFIG
    +void cleanup_tests(void)
    +{
    +    /* Dispose of providers */
    +    OSSL_PROVIDER_unload(legacy);
    +    OSSL_PROVIDER_unload(dflt);
    +    legacy = dflt = NULL;
    +}
    +#endif
    diff --git a/deps/openssl/openssl/test/pemtest.c b/deps/openssl/openssl/test/pemtest.c
    index c8c88bf1f1656f..bf970983654439 100644
    --- a/deps/openssl/openssl/test/pemtest.c
    +++ b/deps/openssl/openssl/test/pemtest.c
    @@ -125,6 +125,35 @@ static int test_empty_payload(void)
         return ret;
     }
     
    +static int test_protected_params(void)
    +{
    +    BIO *b;
    +    static char *protectedpay =
    +        "-----BEGIN RSA PRIVATE KEY-----\n"
    +        "Proc-Type: 4,ENCRYPTED\n"
    +        "DEK-Info: AES-256-CBC,4A44448ED28992710556549B35100CEA\n"
    +        "\n"
    +        "Xw3INxKeH+rUUF57mjATpvj6zknVhedwrlRmRvnwlLv5wqIy5Ae4UVLPh7SUswfC\n"
    +        "-----END RSA PRIVATE KEY-----\n";
    +    EVP_PKEY *pkey = NULL;
    +    int ret = 0;
    +
    +    b = BIO_new_mem_buf(protectedpay, strlen(protectedpay));
    +    if (!TEST_ptr(b))
    +        return 0;
    +
    +    /* Expected to fail because we cannot decrypt protected PEM files */
    +    pkey = PEM_read_bio_Parameters(b, NULL);
    +    if (!TEST_ptr_null(pkey))
    +        goto err;
    +
    +    ret = 1;
    + err:
    +    EVP_PKEY_free(pkey);
    +    BIO_free(b);
    +    return ret;
    +}
    +
     int setup_tests(void)
     {
         if (!TEST_ptr(pemfile = test_get_argument(0)))
    @@ -133,5 +162,6 @@ int setup_tests(void)
         ADD_TEST(test_invalid);
         ADD_TEST(test_cert_key_cert);
         ADD_TEST(test_empty_payload);
    +    ADD_TEST(test_protected_params);
         return 1;
     }
    diff --git a/deps/openssl/openssl/test/pkcs12_format_test.c b/deps/openssl/openssl/test/pkcs12_format_test.c
    index d4129d2522bce8..c142093f72bbbc 100644
    --- a/deps/openssl/openssl/test/pkcs12_format_test.c
    +++ b/deps/openssl/openssl/test/pkcs12_format_test.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2020-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -792,6 +792,70 @@ static int pkcs12_create_test(void)
     }
     #endif
     
    +static int pkcs12_recreate_test(void)
    +{
    +    int ret = 0;
    +    X509 *cert = NULL;
    +    X509 *cert_parsed = NULL;
    +    EVP_PKEY *pkey = NULL;
    +    EVP_PKEY *pkey_parsed = NULL;
    +    PKCS12 *p12 = NULL;
    +    PKCS12 *p12_parsed = NULL;
    +    PKCS12 *p12_recreated = NULL;
    +    const unsigned char *cert_bytes = CERT1;
    +    const unsigned char *key_bytes = KEY1;
    +    BIO *bio = NULL;
    +
    +    cert = d2i_X509(NULL, &cert_bytes, sizeof(CERT1));
    +    if (!TEST_ptr(cert))
    +        goto err;
    +    pkey = d2i_AutoPrivateKey(NULL, &key_bytes, sizeof(KEY1));
    +    if (!TEST_ptr(pkey))
    +        goto err;
    +    p12 = PKCS12_create("pass", NULL, pkey, cert, NULL, NID_aes_256_cbc,
    +                        NID_aes_256_cbc, 2, 1, 0);
    +    if (!TEST_ptr(p12))
    +        goto err;
    +    if (!TEST_int_eq(ERR_peek_error(), 0))
    +        goto err;
    +
    +    bio = BIO_new(BIO_s_mem());
    +    if (!TEST_ptr(bio))
    +        goto err;
    +    if (!TEST_int_eq(i2d_PKCS12_bio(bio, p12), 1))
    +        goto err;
    +    p12_parsed = PKCS12_init_ex(NID_pkcs7_data, testctx, NULL);
    +    if (!TEST_ptr(p12_parsed))
    +        goto err;
    +    p12_parsed = d2i_PKCS12_bio(bio, &p12_parsed);
    +    if (!TEST_ptr(p12_parsed))
    +        goto err;
    +    if (!TEST_int_eq(PKCS12_parse(p12_parsed, "pass", &pkey_parsed,
    +                                  &cert_parsed, NULL), 1))
    +        goto err;
    +
    +    /* cert_parsed also contains auxiliary data */
    +    p12_recreated = PKCS12_create("new_pass", NULL, pkey_parsed, cert_parsed,
    +                                  NULL, NID_aes_256_cbc, NID_aes_256_cbc,
    +                                  2, 1, 0);
    +    if (!TEST_ptr(p12_recreated))
    +        goto err;
    +    if (!TEST_int_eq(ERR_peek_error(), 0))
    +        goto err;
    +
    +    ret = 1;
    +err:
    +    BIO_free(bio);
    +    PKCS12_free(p12);
    +    PKCS12_free(p12_parsed);
    +    PKCS12_free(p12_recreated);
    +    EVP_PKEY_free(pkey);
    +    EVP_PKEY_free(pkey_parsed);
    +    X509_free(cert);
    +    X509_free(cert_parsed);
    +    return ret;
    +}
    +
     typedef enum OPTION_choice {
         OPT_ERR = -1,
         OPT_EOF = 0,
    @@ -873,6 +937,8 @@ int setup_tests(void)
         if (default_libctx)
             ADD_TEST(pkcs12_create_test);
     #endif
    +    if (default_libctx)
    +        ADD_TEST(pkcs12_recreate_test);
         ADD_ALL_TESTS(test_single_key_enc_pass, OSSL_NELEM(passwords));
         ADD_ALL_TESTS(test_single_key_enc_iter, OSSL_NELEM(iters));
         ADD_TEST(test_single_key_with_attrs);
    diff --git a/deps/openssl/openssl/test/property_test.c b/deps/openssl/openssl/test/property_test.c
    index 6a405e364baf10..1005b9952c9a6c 100644
    --- a/deps/openssl/openssl/test/property_test.c
    +++ b/deps/openssl/openssl/test/property_test.c
    @@ -616,6 +616,9 @@ static struct {
         { "", "" },
         { "fips=3", "fips=3" },
         { "fips=-3", "fips=-3" },
    +    { "provider='foo bar'", "provider='foo bar'" },
    +    { "provider=\"foo bar'\"", "provider=\"foo bar'\"" },
    +    { "provider=abc***", "provider='abc***'" },
         { NULL, "" }
     };
     
    diff --git a/deps/openssl/openssl/test/provider_internal_test.c b/deps/openssl/openssl/test/provider_internal_test.c
    index cb7d5efcf54889..1fe8fb0cc5c412 100644
    --- a/deps/openssl/openssl/test/provider_internal_test.c
    +++ b/deps/openssl/openssl/test/provider_internal_test.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 2019-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -83,6 +83,7 @@ static int test_loaded_provider(void)
             && test_provider(prov, expected_greeting1(name));
     }
     
    +# ifndef OPENSSL_NO_AUTOLOAD_CONFIG
     static int test_configured_provider(void)
     {
         const char *name = "p_test_configured";
    @@ -95,6 +96,7 @@ static int test_configured_provider(void)
             TEST_ptr(prov = ossl_provider_find(NULL, name, 0))
             && test_provider(prov, expected_greeting);
     }
    +# endif
     #endif
     
     static int test_cache_flushes(void)
    @@ -139,7 +141,9 @@ int setup_tests(void)
         ADD_TEST(test_builtin_provider);
     #ifndef NO_PROVIDER_MODULE
         ADD_TEST(test_loaded_provider);
    +# ifndef OPENSSL_NO_AUTOLOAD_CONFIG
         ADD_TEST(test_configured_provider);
    +# endif
     #endif
         ADD_TEST(test_cache_flushes);
         return 1;
    diff --git a/deps/openssl/openssl/test/recipes/05-test_rand.t b/deps/openssl/openssl/test/recipes/05-test_rand.t
    index 3f352db9df3a6d..aa012c1907adee 100644
    --- a/deps/openssl/openssl/test/recipes/05-test_rand.t
    +++ b/deps/openssl/openssl/test/recipes/05-test_rand.t
    @@ -1,5 +1,5 @@
     #! /usr/bin/env perl
    -# Copyright 2015-2021 The OpenSSL Project Authors. All Rights Reserved.
    +# Copyright 2015-2023 The OpenSSL Project Authors. All Rights Reserved.
     #
     # Licensed under the Apache License 2.0 (the "License").  You may not use
     # this file except in compliance with the License.  You can obtain a copy
    @@ -29,12 +29,12 @@ SKIP: {
         @randdata = run(app(['openssl', 'rand', '-engine', 'ossltest', '-hex', '16' ]),
                         capture => 1, statusvar => \$success);
         chomp(@randdata);
    -    ok($success and $randdata[0] eq $expected,
    +    ok($success && $randdata[0] eq $expected,
            "rand with ossltest: Check rand output is as expected");
     
         @randdata = run(app(['openssl', 'rand', '-engine', 'dasync', '-hex', '16' ]),
                         capture => 1, statusvar => \$success);
         chomp(@randdata);
    -    ok($success and length($randdata[0]) == 32,
    +    ok($success && length($randdata[0]) == 32,
            "rand with dasync: Check rand output is of expected length");
     }
    diff --git a/deps/openssl/openssl/test/recipes/15-test_rsapss.t b/deps/openssl/openssl/test/recipes/15-test_rsapss.t
    index c566ade933e9d6..44721a32372f78 100644
    --- a/deps/openssl/openssl/test/recipes/15-test_rsapss.t
    +++ b/deps/openssl/openssl/test/recipes/15-test_rsapss.t
    @@ -1,5 +1,5 @@
     #! /usr/bin/env perl
    -# Copyright 2017-2022 The OpenSSL Project Authors. All Rights Reserved.
    +# Copyright 2017-2023 The OpenSSL Project Authors. All Rights Reserved.
     #
     # Licensed under the Apache License 2.0 (the "License").  You may not use
     # this file except in compliance with the License.  You can obtain a copy
    @@ -16,7 +16,7 @@ use OpenSSL::Test::Utils;
     
     setup("test_rsapss");
     
    -plan tests => 11;
    +plan tests => 13;
     
     #using test/testrsa.pem which happens to be a 512 bit RSA
     ok(run(app(['openssl', 'dgst', '-sign', srctop_file('test', 'testrsa.pem'), '-sha1',
    @@ -79,6 +79,8 @@ ok(run(app(['openssl', 'dgst', '-prverify', srctop_file('test', 'testrsa.pem'),
        my $rsapss = "rsapss.key";
        ok(run(app(['openssl', 'genpkey', '-algorithm', 'RSA-PSS',
                    '-pkeyopt', 'rsa_keygen_bits:1024',
    +               '-pkeyopt', 'rsa_keygen_pubexp:65537',
    +               '-pkeyopt', 'rsa_keygen_primes:2',
                    '--out', $rsapss])));
        ok(run(app(['openssl', 'rsa', '-check',
                    '-in', $rsapss])));
    @@ -87,3 +89,11 @@ ok(run(app(['openssl', 'dgst', '-prverify', srctop_file('test', 'testrsa.pem'),
     ok(!run(app([ 'openssl', 'rsa',
                  '-in' => data_file('negativesaltlen.pem')],
                  '-out' => 'badout')));
    +
    +ok(run(app(['openssl', 'genpkey', '-algorithm', 'RSA-PSS', '-pkeyopt', 'rsa_keygen_bits:1024',
    +            '-pkeyopt', 'rsa_pss_keygen_md:SHA256', '-pkeyopt', 'rsa_pss_keygen_saltlen:10',
    +            '-out', 'testrsapss.pem'])),
    +   "openssl genpkey RSA-PSS with pss parameters");
    +ok(run(app(['openssl', 'pkey', '-in', 'testrsapss.pem', '-pubout', '-text'])),
    +   "openssl pkey, execute rsa_pub_encode with pss parameters");
    +unlink 'testrsapss.pem';
    diff --git a/deps/openssl/openssl/test/recipes/25-test_req.t b/deps/openssl/openssl/test/recipes/25-test_req.t
    index e615f1b338855f..8c8274aee699ce 100644
    --- a/deps/openssl/openssl/test/recipes/25-test_req.t
    +++ b/deps/openssl/openssl/test/recipes/25-test_req.t
    @@ -1,5 +1,5 @@
     #! /usr/bin/env perl
    -# Copyright 2015-2022 The OpenSSL Project Authors. All Rights Reserved.
    +# Copyright 2015-2023 The OpenSSL Project Authors. All Rights Reserved.
     #
     # Licensed under the Apache License 2.0 (the "License").  You may not use
     # this file except in compliance with the License.  You can obtain a copy
    @@ -15,7 +15,7 @@ use OpenSSL::Test qw/:DEFAULT srctop_file/;
     
     setup("test_req");
     
    -plan tests => 44;
    +plan tests => 46;
     
     require_ok(srctop_file('test', 'recipes', 'tconversion.pl'));
     
    @@ -473,3 +473,14 @@ my $cert = "self-signed_CA_with_keyUsages.pem";
     generate_cert($cert, "-in", srctop_file(@certs, "ext-check.csr"),
         "-copy_extensions", "copy");
     has_keyUsage($cert, 1);
    +
    +# Generate cert using req with '-modulus'
    +ok(run(app(["openssl", "req", "-x509", "-new", "-days", "365",
    +            "-key", srctop_file("test", "testrsa.pem"),
    +            "-config", srctop_file('test', 'test.cnf'),
    +            "-out", "testreq-cert.pem",
    +            "-modulus"])), "cert req creation - with -modulus");
    +
    +# Verify cert
    +ok(run(app(["openssl", "x509", "-in", "testreq-cert.pem",
    +            "-noout", "-text"])), "cert verification");
    diff --git a/deps/openssl/openssl/test/recipes/30-test_defltfips.t b/deps/openssl/openssl/test/recipes/30-test_defltfips.t
    index 426bd660d1fd61..c8f145405b2b4e 100644
    --- a/deps/openssl/openssl/test/recipes/30-test_defltfips.t
    +++ b/deps/openssl/openssl/test/recipes/30-test_defltfips.t
    @@ -1,5 +1,5 @@
     #! /usr/bin/env perl
    -# Copyright 2015-2021 The OpenSSL Project Authors. All Rights Reserved.
    +# Copyright 2015-2023 The OpenSSL Project Authors. All Rights Reserved.
     #
     # Licensed under the Apache License 2.0 (the "License").  You may not use
     # this file except in compliance with the License.  You can obtain a copy
    @@ -21,6 +21,9 @@ BEGIN {
     use lib srctop_dir('Configurations');
     use lib bldtop_dir('.');
     
    +plan skip_all => "Configuration loading is turned off"
    +    if disabled("autoload-config");
    +
     my $no_fips = disabled('fips') || ($ENV{NO_FIPS} // 0);
     
     plan tests =>
    diff --git a/deps/openssl/openssl/test/recipes/30-test_evp.t b/deps/openssl/openssl/test/recipes/30-test_evp.t
    index 0a036b7da01826..af823515f9bd64 100644
    --- a/deps/openssl/openssl/test/recipes/30-test_evp.t
    +++ b/deps/openssl/openssl/test/recipes/30-test_evp.t
    @@ -1,5 +1,5 @@
     #! /usr/bin/env perl
    -# Copyright 2015-2022 The OpenSSL Project Authors. All Rights Reserved.
    +# Copyright 2015-2023 The OpenSSL Project Authors. All Rights Reserved.
     #
     # Licensed under the Apache License 2.0 (the "License").  You may not use
     # this file except in compliance with the License.  You can obtain a copy
    @@ -173,7 +173,8 @@ sub test_errors { # actually tests diagnostics of OSSL_STORE
     }
     
     SKIP: {
    -    skip "DSA not disabled", 2 if !disabled("dsa");
    +    skip "DSA not disabled or ERR disabled", 2
    +        if !disabled("dsa") || disabled("err");
     
         ok(test_errors(key => 'server-dsa-key.pem',
                        out => 'server-dsa-key.err'),
    diff --git a/deps/openssl/openssl/test/recipes/80-test_cms.t b/deps/openssl/openssl/test/recipes/80-test_cms.t
    index cabbe3ecdf1a5d..be779233130e20 100644
    --- a/deps/openssl/openssl/test/recipes/80-test_cms.t
    +++ b/deps/openssl/openssl/test/recipes/80-test_cms.t
    @@ -50,7 +50,7 @@ my ($no_des, $no_dh, $no_dsa, $no_ec, $no_ec2m, $no_rc2, $no_zlib)
     
     $no_rc2 = 1 if disabled("legacy");
     
    -plan tests => 16;
    +plan tests => 18;
     
     ok(run(test(["pkcs7_test"])), "test pkcs7");
     
    @@ -994,3 +994,28 @@ with({ exit_checker => sub { return shift == 6; } },
                        ])),
                 "Check failure during BIO setup with -stream is handled correctly");
         });
    +
    +# Test case for return value mis-check reported in #21986
    +with({ exit_checker => sub { return shift == 3; } },
    +    sub {
    +        SKIP: {
    +          skip "DSA is not supported in this build", 1 if $no_dsa;
    +
    +          ok(run(app(['openssl', 'cms', '-sign',
    +                      '-in', srctop_file("test", "smcont.txt"),
    +                      '-signer', srctop_file("test/smime-certs", "smdsa1.pem"),
    +                      '-md', 'SHAKE256'])),
    +            "issue#21986");
    +        }
    +    });
    +
    +# Test for problem reported in #22225
    +with({ exit_checker => sub { return shift == 3; } },
    +    sub {
    +	ok(run(app(['openssl', 'cms', '-encrypt',
    +		    '-in', srctop_file("test", "smcont.txt"),
    +		    '-aes-256-ctr', '-recip',
    +		    catfile($smdir, "smec1.pem"),
    +		   ])),
    +	   "Check for failure when cipher does not have an assigned OID (issue#22225)");
    +     });
    diff --git a/deps/openssl/openssl/test/recipes/99-test_fuzz_x509.t b/deps/openssl/openssl/test/recipes/99-test_fuzz_x509.t
    index 9a1e3a19cadce4..b0b86365d10193 100644
    --- a/deps/openssl/openssl/test/recipes/99-test_fuzz_x509.t
    +++ b/deps/openssl/openssl/test/recipes/99-test_fuzz_x509.t
    @@ -1,5 +1,5 @@
     #!/usr/bin/env perl
    -# Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved.
    +# Copyright 2016-2023 The OpenSSL Project Authors. All Rights Reserved.
     #
     # Licensed under the Apache License 2.0 (the "License").  You may not use
     # this file except in compliance with the License.  You can obtain a copy
    @@ -15,6 +15,9 @@ use OpenSSL::Test::Utils;
     my $fuzzer = "x509";
     setup("test_fuzz_${fuzzer}");
     
    +plan skip_all => "This test requires ocsp support"
    +    if disabled("ocsp");
    +
     plan tests => 2; # one more due to below require_ok(...)
     
     require_ok(srctop_file('test','recipes','fuzz.pl'));
    diff --git a/deps/openssl/openssl/test/rsa_test.c b/deps/openssl/openssl/test/rsa_test.c
    index 62a54df74d89db..18345b431a7cc5 100644
    --- a/deps/openssl/openssl/test/rsa_test.c
    +++ b/deps/openssl/openssl/test/rsa_test.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 1999-2021 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1999-2023 The OpenSSL Project Authors. All Rights Reserved.
      *
      * Licensed under the Apache License 2.0 (the "License").  You may not use
      * this file except in compliance with the License.  You can obtain a copy
    @@ -391,10 +391,126 @@ static int test_rsa_security_bit(int n)
         return r;
     }
     
    +static int test_EVP_rsa_legacy_key(void)
    +{
    +    int ret;
    +    size_t buflen = 384;
    +    size_t msglen = 64;
    +    unsigned char sigbuf[384];
    +    unsigned char msgbuf[64];
    +    BIGNUM *p;
    +    BIGNUM *q;
    +    BIGNUM *n;
    +    BIGNUM *d;
    +    BIGNUM *e;
    +    RSA *rsa;
    +    const EVP_MD *md;
    +    EVP_MD_CTX *ctx = NULL;
    +    EVP_PKEY *pkey = NULL;
    +
    +    unsigned char n_data[] = {
    +    0x00, 0xc7, 0x28, 0x7a, 0x28, 0x91, 0x51, 0xa5, 0xe8, 0x3c, 0x45, 0xcf,
    +    0x1d, 0xa9, 0x69, 0x7a, 0x0d, 0xdb, 0xdd, 0x8f, 0xe2, 0xde, 0x85, 0xdd,
    +    0x85, 0x6d, 0x8f, 0x78, 0x20, 0xd6, 0xe, 0xe5, 0x06, 0xcb, 0x9c, 0xd6,
    +    0xd3, 0xca, 0xef, 0x1d, 0x80, 0xd3, 0x18, 0x23, 0x91, 0x5c, 0xe5, 0xc8,
    +    0x44, 0x37, 0x56, 0x1b, 0x68, 0x7f, 0x08, 0xa3, 0x1c, 0xf6, 0xe8, 0x11,
    +    0x38, 0x0f, 0x2e, 0xad, 0xb1, 0x89, 0x8b, 0x08, 0xe8, 0x35, 0xaf, 0x3b,
    +    0xfe, 0x37, 0x8d, 0x21, 0xd5, 0x3f, 0x1f, 0x4b, 0x01, 0x30, 0xd8, 0xd0,
    +    0x24, 0xf7, 0xab, 0x57, 0xad, 0xac, 0xbc, 0x53, 0x6d, 0x84, 0x8e, 0xa1,
    +    0xb2, 0x5b, 0x8e, 0xe7, 0xb3, 0xac, 0xfc, 0x60, 0x22, 0x10, 0x1e, 0x99,
    +    0xfa, 0xa0, 0x60, 0x00, 0x69, 0x5f, 0x8e, 0xca, 0x6d, 0x9c, 0xee, 0x5e,
    +    0x84, 0x4e, 0x53, 0x83, 0x42, 0x76, 0x4d, 0xb8, 0xc1, 0xeb, 0x4e, 0x3d,
    +    0xc3, 0xce, 0xac, 0x79, 0xbb, 0x29, 0x5d, 0x92, 0x33, 0x6e, 0xcf, 0x8f,
    +    0x5a, 0xf0, 0xb3, 0xb5, 0xdc, 0xd5, 0xa3, 0xaf, 0x40, 0x4b, 0x0f, 0x05,
    +    0xac, 0x46, 0x53, 0x2d, 0x5f, 0x20, 0x96, 0x42, 0xa8, 0x47, 0x61, 0x54,
    +    0x05, 0x2c, 0x8a, 0x26, 0x5d, 0x92, 0x1d, 0x01, 0x2a, 0x27, 0x8a, 0xfc,
    +    0x64, 0x24, 0x5c, 0x34, 0xde, 0x92, 0xc6, 0x82, 0xea, 0x4d, 0xe2, 0x52,
    +    0xe5, 0xad, 0x62, 0x00, 0xc6, 0xc8, 0xe9, 0x0c, 0x22, 0xf0, 0x9e, 0xbe,
    +    0xdc, 0x51, 0x58, 0xad, 0x3b, 0xba, 0x2e, 0x45, 0x65, 0xcc, 0x5b, 0x55,
    +    0x46, 0x67, 0x18, 0x4a, 0x80, 0x67, 0x5b, 0x84, 0x7f, 0x13, 0x37, 0x45,
    +    0xd8, 0x03, 0xc6, 0x22, 0xc3, 0x4a, 0x46, 0x6b, 0xde, 0x50, 0xbf, 0x16,
    +    0x0a, 0x23, 0x0b, 0xaa, 0x50, 0x54, 0xf6, 0x20, 0x83, 0x74, 0x33, 0x97,
    +    0x2e, 0xf2, 0x8e, 0x7e, 0x13 };
    +
    +    unsigned char e_data[]  = { 0x01, 0x00, 0x01 };
    +
    +    unsigned char d_data[] = {
    +    0x09, 0x2d, 0xcb, 0xe7, 0x87, 0xbf, 0x10, 0x1a, 0xf2, 0x80, 0x33, 0x2a,
    +    0x06, 0x4f, 0x56, 0xb1, 0x41, 0xd3, 0x65, 0xd8, 0xca, 0x71, 0xb8, 0x02,
    +    0x78, 0xc8, 0xb6, 0x7c, 0x28, 0xf4, 0x6c, 0xe8, 0xd1, 0xc4, 0x92, 0x40,
    +    0x23, 0xa7, 0xbe, 0x9f, 0xdb, 0xda, 0xce, 0x74, 0xda, 0x27, 0xbb, 0x01,
    +    0xad, 0xdd, 0x39, 0x99, 0x28, 0xd5, 0xb0, 0x92, 0xda, 0xac, 0x5a, 0x72,
    +    0xcf, 0x7c, 0x52, 0xc4, 0x0e, 0x77, 0x4a, 0x7b, 0x4d, 0x52, 0x1c, 0xbd,
    +    0x3c, 0x39, 0x34, 0x78, 0x7c, 0x16, 0xc8, 0xa1, 0xae, 0xeb, 0x27, 0x38,
    +    0xb4, 0xf3, 0x80, 0x30, 0x80, 0x78, 0x13, 0x8e, 0x46, 0x20, 0x3e, 0xc2,
    +    0x96, 0x26, 0xb1, 0x76, 0x1e, 0x00, 0x69, 0xbb, 0xd8, 0x2b, 0x58, 0xe4,
    +    0x6c, 0xb4, 0xd0, 0x00, 0x0b, 0x47, 0xec, 0xfb, 0x7d, 0x52, 0x9d, 0x27,
    +    0x92, 0xe6, 0x95, 0x73, 0xa0, 0x39, 0x37, 0xcd, 0x1f, 0x60, 0x13, 0x1c,
    +    0x87, 0x9d, 0xa7, 0x91, 0x90, 0xf9, 0x36, 0xc5, 0xfa, 0x3f, 0xf9, 0x7f,
    +    0x50, 0xf8, 0xb3, 0x54, 0x65, 0xff, 0x6f, 0xa6, 0x22, 0xcc, 0x4a, 0x1e,
    +    0x49, 0x3f, 0x07, 0xc6, 0xf2, 0x65, 0x73, 0x13, 0x1b, 0x2d, 0xb6, 0x15,
    +    0xff, 0xcd, 0x9a, 0x1c, 0xea, 0xef, 0x58, 0x56, 0x91, 0x2d, 0x47, 0x81,
    +    0x56, 0x0d, 0xc3, 0xb0, 0x47, 0x58, 0x8d, 0x05, 0x7d, 0x5b, 0xc0, 0x22,
    +    0xa4, 0xf0, 0x2e, 0x70, 0x36, 0x01, 0x89, 0xa1, 0x71, 0xed, 0x76, 0xe9,
    +    0x8d, 0xf5, 0x49, 0xaf, 0x11, 0xbe, 0xe4, 0xd4, 0x48, 0x92, 0xb6, 0x5b,
    +    0xc2, 0x04, 0xd4, 0x0c, 0x5c, 0x8b, 0xe3, 0xfa, 0x29, 0x63, 0x86, 0xb4,
    +    0x10, 0xad, 0x32, 0x07, 0x85, 0xe2, 0x43, 0x76, 0x16, 0x90, 0xab, 0xdf,
    +    0xb3, 0x36, 0x0a, 0xc4, 0x49, 0x7b, 0x95, 0x48, 0x50, 0x72, 0x8f, 0x7d,
    +    0xf4, 0xfa, 0x60, 0xc1 };
    +
    +    unsigned char p_data[] = {
    +    0x00, 0xed, 0xf7, 0xa7, 0x00, 0x5a, 0xbb, 0xd1, 0x52, 0x65, 0x9b, 0xec,
    +    0xfe, 0x27, 0x8b, 0xe2, 0xbe, 0x40, 0x8c, 0x2f, 0x6f, 0xb4, 0x26, 0xb2,
    +    0xbe, 0x45, 0x4b, 0x3b, 0x5a, 0xaa, 0xc6, 0xaa, 0xfa, 0xc1, 0x3a, 0xa9,
    +    0xa1, 0xba, 0xb7, 0x86, 0x1a, 0x98, 0x15, 0x5f, 0x5c, 0x1c, 0x57, 0x78,
    +    0x78, 0x6a, 0x13, 0xc2, 0x40, 0x7d, 0x07, 0x87, 0x47, 0xc6, 0x96, 0xd5,
    +    0x92, 0xc9, 0x65, 0x2c, 0xfe, 0xbb, 0xe0, 0xd6, 0x76, 0x25, 0x5a, 0xa3,
    +    0xdf, 0x97, 0x4b, 0x64, 0xfd, 0x3b, 0x2b, 0xbc, 0xfb, 0x80, 0xad, 0x3b,
    +    0x7d, 0x1f, 0x48, 0x56, 0x27, 0xf7, 0x2f, 0x8e, 0x92, 0x07, 0xa8, 0x9f,
    +    0xbc, 0x5a, 0xce, 0xfa, 0xd5, 0x67, 0xad, 0xf4, 0xbf, 0xe0, 0xc9, 0x3e,
    +    0x8e, 0xb5, 0x90, 0x58, 0x54, 0x92, 0x9f, 0xda, 0x36, 0xc0, 0x0d, 0x57,
    +    0xfe, 0x6c, 0x23, 0x63, 0x8b, 0xd1, 0x1e, 0x4f, 0xd3 };
    +
    +    unsigned char q_data[] = {
    +    0x00, 0xd6, 0x3f, 0xf5, 0xee, 0xff, 0x4d, 0x7d, 0x8c, 0x1a, 0x85, 0x5d,
    +    0x3c, 0x4f, 0x9d, 0xdf, 0xc7, 0x68, 0x27, 0x7f, 0xe4, 0x4f, 0x4f, 0xd7,
    +    0xa2, 0x3b, 0xcd, 0x4a, 0x34, 0xd8, 0x55, 0x4a, 0x3e, 0x8e, 0xb3, 0xa8,
    +    0xe9, 0x8a, 0xc5, 0x94, 0xd1, 0x09, 0x32, 0x4b, 0x79, 0x8d, 0x7b, 0x03,
    +    0x0b, 0x5d, 0xca, 0x91, 0x41, 0xbc, 0x82, 0xc3, 0x89, 0x67, 0x4d, 0x03,
    +    0x68, 0x03, 0x2d, 0x0e, 0x4e, 0x97, 0x6c, 0xf6, 0x3e, 0x1f, 0xf4, 0x50,
    +    0x06, 0x5d, 0x05, 0x22, 0xf2, 0xf8, 0xf2, 0xde, 0xad, 0x2e, 0x9d, 0xc3,
    +    0x97, 0x1b, 0xc3, 0x75, 0xe7, 0x86, 0xde, 0xc5, 0x11, 0x89, 0xed, 0x6a,
    +    0x13, 0x14, 0x23, 0x4b, 0x98, 0x81, 0xf7, 0xd4, 0x1c, 0xee, 0x30, 0x92,
    +    0x85, 0x20, 0x4f, 0x35, 0x02, 0xfa, 0xda, 0x14, 0x77, 0xfa, 0x08, 0x34,
    +    0x60, 0xc7, 0x93, 0x72, 0xdc, 0xc4, 0x18, 0x70, 0xc1 };
    +
    +    memset(msgbuf, 0xef, 64);
    +
    +    ret = (TEST_ptr((p = BN_bin2bn(p_data, sizeof(p_data), NULL)))
    +           && TEST_ptr((q = BN_bin2bn(q_data, sizeof(q_data), NULL)))
    +           && TEST_ptr((n = BN_bin2bn(n_data, sizeof(n_data), NULL)))
    +           && TEST_ptr((d = BN_bin2bn(d_data, sizeof(d_data), NULL)))
    +           && TEST_ptr((e = BN_bin2bn(e_data, sizeof(e_data), NULL)))
    +           && TEST_ptr((rsa = RSA_new()))
    +           && TEST_ptr((md = EVP_sha256()))
    +           && TEST_ptr((ctx = EVP_MD_CTX_new()))
    +           && TEST_ptr((pkey = EVP_PKEY_new()))
    +           && TEST_true(RSA_set0_factors(rsa, p, q))
    +           && TEST_true(RSA_set0_key(rsa, n, e, d))
    +           && TEST_true(EVP_PKEY_assign_RSA(pkey, rsa))
    +           && TEST_true(EVP_DigestSignInit(ctx, NULL, md, NULL, pkey))
    +           && TEST_true(EVP_DigestSign(ctx, sigbuf, &buflen, msgbuf, msglen)));
    +
    +    EVP_MD_CTX_free(ctx);
    +    EVP_PKEY_free(pkey);
    +    return ret;
    +}
    +
     int setup_tests(void)
     {
         ADD_ALL_TESTS(test_rsa_pkcs1, 3);
         ADD_ALL_TESTS(test_rsa_oaep, 3);
         ADD_ALL_TESTS(test_rsa_security_bit, OSSL_NELEM(rsa_security_bits_cases));
    +    ADD_TEST(test_EVP_rsa_legacy_key);
         return 1;
     }
    diff --git a/deps/openssl/openssl/test/ssl_old_test.c b/deps/openssl/openssl/test/ssl_old_test.c
    index 91c8b5b7b535f6..6b56754b824017 100644
    --- a/deps/openssl/openssl/test/ssl_old_test.c
    +++ b/deps/openssl/openssl/test/ssl_old_test.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
    + * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
      * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
      * Copyright 2005 Nokia. All rights reserved.
      *
    @@ -1525,8 +1525,10 @@ int main(int argc, char *argv[])
                 ERR_print_errors(bio_err);
                 goto end;
             }
    -        SSL_CTX_set0_tmp_dh_pkey(s_ctx, dhpkey);
    -        SSL_CTX_set0_tmp_dh_pkey(s_ctx2, dhpkey);
    +        if (!SSL_CTX_set0_tmp_dh_pkey(s_ctx, dhpkey))
    +            EVP_PKEY_free(dhpkey);
    +        if (!SSL_CTX_set0_tmp_dh_pkey(s_ctx2, dhpkey))
    +            EVP_PKEY_free(dhpkey);
         }
     #endif
     
    diff --git a/deps/openssl/openssl/test/sslapitest.c b/deps/openssl/openssl/test/sslapitest.c
    index 3d0319ee3881af..a7df6552eb16b2 100644
    --- a/deps/openssl/openssl/test/sslapitest.c
    +++ b/deps/openssl/openssl/test/sslapitest.c
    @@ -1681,6 +1681,8 @@ static int test_large_app_data(int tst)
         return testresult;
     }
     
    +#if !defined(OPENSSL_NO_TLS1_2) || !defined(OSSL_NO_USABLE_TLS1_3) \
    +    || !defined(OPENSSL_NO_DTLS)
     static int execute_cleanse_plaintext(const SSL_METHOD *smeth,
                                          const SSL_METHOD *cmeth,
                                          int min_version, int max_version)
    @@ -1702,15 +1704,13 @@ static int execute_cleanse_plaintext(const SSL_METHOD *smeth,
                                            privkey)))
             goto end;
     
    -#ifdef OPENSSL_NO_DTLS1_2
    -    if (smeth == DTLS_server_method()) {
     # ifdef OPENSSL_NO_DTLS1_2
    +    if (smeth == DTLS_server_method()) {
             /* Not supported in the FIPS provider */
             if (is_fips) {
                 testresult = 1;
                 goto end;
             };
    -# endif
             /*
              * Default sigalgs are SHA1 based in  0) {
             ret = run_tests(argv[0]);
             cleanup_tests();
             opt_check_usage();
    -    } else {
    +    } else if (setup_res == 0) {
             opt_help(test_get_options());
         }
     end:
    diff --git a/deps/openssl/openssl/util/missingssl.txt b/deps/openssl/openssl/util/missingssl.txt
    index 48219fd99a9a47..41ca8a8bbc0022 100644
    --- a/deps/openssl/openssl/util/missingssl.txt
    +++ b/deps/openssl/openssl/util/missingssl.txt
    @@ -3,7 +3,6 @@ ERR_load_SSL_strings(3)
     SRP_Calc_A_param(3)
     SSL_COMP_get_name(3)
     SSL_COMP_set0_compression_methods(3)
    -SSL_CONF_CTX_finish(3)
     SSL_CTX_SRP_CTX_free(3)
     SSL_CTX_SRP_CTX_init(3)
     SSL_CTX_get0_certificate(3)
    diff --git a/deps/openssl/openssl_common.gypi b/deps/openssl/openssl_common.gypi
    index 1290fff251fc5b..8745ec130ab878 100644
    --- a/deps/openssl/openssl_common.gypi
    +++ b/deps/openssl/openssl_common.gypi
    @@ -26,7 +26,7 @@
         }, 'OS=="win"', {
           'defines': [
             ## default of Win. See INSTALL in openssl repo.
    -        'OPENSSLDIR="C:\\\Program\ Files\\\Common\ Files\\\SSL"',
    +        'OPENSSLDIR="C:\\\\Program\\ Files\\\\Common\\ Files\\\\SSL"',
             'ENGINESDIR="NUL"',
             'OPENSSL_SYS_WIN32', 'WIN32_LEAN_AND_MEAN', 'L_ENDIAN',
             '_CRT_SECURE_NO_DEPRECATE', 'UNICODE', '_UNICODE',
    diff --git a/deps/openssl/unofficial.gni b/deps/openssl/unofficial.gni
    new file mode 100644
    index 00000000000000..31f31043812427
    --- /dev/null
    +++ b/deps/openssl/unofficial.gni
    @@ -0,0 +1,146 @@
    +# This file is used by GN for building, which is NOT the build system used for
    +# building official binaries.
    +# Please edit the gyp files if you are making changes to build system.
    +
    +declare_args() {
    +  # Do not build optimized assembly for OpenSSL
    +  # FIXME(zcbenz): asm code does not compile with clang.
    +  openssl_no_asm = true
    +}
    +
    +# The actual configurations are put inside a template in unofficial.gni to
    +# prevent accidental edits from contributors.
    +template("openssl_gn_build") {
    +  config("openssl_external_config") {
    +    include_dirs = [
    +      "openssl/crypto/include",
    +      "openssl/include",
    +    ]
    +  }
    +
    +  config("openssl_internal_config") {
    +    gypi_values = exec_script("../../tools/gypi_to_gn.py",
    +                              [ rebase_path("openssl.gypi") ],
    +                              "scope",
    +                              [ "openssl.gypi" ])
    +
    +    defines = [
    +      "MODULESDIR=\"deps/openssl/lib/openssl-modules\"",
    +      "OPENSSL_API_COMPAT=0x10100001L",
    +      "STATIC_LEGACY",
    +    ] + gypi_values.openssl_default_defines_all
    +    if (is_win) {
    +      defines += [
    +        ## default of Win. See INSTALL in openssl repo.
    +        "OPENSSLDIR=\"C:\\\Program\ Files\\\Common\ Files\\\SSL\"",
    +        "ENGINESDIR=\"NUL\"",
    +        "OPENSSL_SYS_WIN32", "WIN32_LEAN_AND_MEAN", "L_ENDIAN",
    +        "_CRT_SECURE_NO_DEPRECATE", "UNICODE", "_UNICODE",
    +      ]
    +    } else if (is_mac) {
    +      defines += [
    +        "OPENSSLDIR=\"/System/Library/OpenSSL/\"",
    +        "ENGINESDIR=\"/dev/null\"",
    +      ]
    +    } else {
    +      defines += [
    +        "OPENSSLDIR=\"/etc/ssl\"",
    +        "ENGINESDIR=\"/dev/null\"",
    +        "TERMIOS",
    +      ]
    +    }
    +
    +    if (is_posix) {
    +      asmflags = [ "-fPIC" ]
    +      cflags = [ "-fPIC" ]
    +      ldflags = [ "-fPIC" ]
    +    }
    +    if (is_clang || !is_win) {
    +      cflags_c = [
    +        "-Wno-atomic-alignment",
    +        "-Wno-constant-conversion",
    +        "-Wno-implicit-fallthrough",
    +        "-Wno-implicit-function-declaration",
    +        "-Wno-sign-compare",
    +        "-Wno-unknown-escape-sequence",
    +        "-Wno-unreachable-code",
    +        "-Wno-unreachable-code-break",
    +        "-Wno-unreachable-code-return",
    +        "-Wno-unused-function",
    +      ]
    +    }
    +    if (is_win) {
    +      libs = [ "crypt32.lib" ]
    +    } else if (is_linux) {
    +      libs = [ "atomic" ]
    +    }
    +
    +    common_gypi_values = exec_script("../../tools/gypi_to_gn.py",
    +                                     [ rebase_path("openssl_common.gypi") ],
    +                                     "scope",
    +                                     [ "openssl_common.gypi" ])
    +    include_dirs = common_gypi_values.include_dirs
    +  }
    +
    +  static_library(target_name) {
    +    forward_variables_from(invoker, "*")
    +
    +    configs += [ ":openssl_internal_config" ]
    +    public_configs = [ ":openssl_external_config" ]
    +
    +    config_path_name = ""
    +    if (is_win) {
    +      if (target_cpu == "x86") {
    +        config_path_name = "VC-WIN32"
    +      } else if (target_cpu == "x64") {
    +        config_path_name = "VC-WIN64A"
    +      } else if (target_cpu == "arm64") {
    +        config_path_name = "VC-WIN64-ARM"
    +      }
    +    } else if (is_linux) {
    +      if (target_cpu == "x86") {
    +        config_path_name = "linux-elf"
    +      } else if (target_cpu == "x64") {
    +        config_path_name = "linux-x86_64"
    +      } else if (target_cpu == "arm") {
    +        config_path_name = "linux-armv4"
    +      } else if (target_cpu == "arm64") {
    +        config_path_name = "linux-aarch64"
    +      }
    +    } else if (is_apple) {
    +      if (target_cpu == "x86") {
    +        config_path_name = "darwin-i386-cc"
    +      } else if (target_cpu == "x64") {
    +        config_path_name = "darwin64-x86_64-cc"
    +      } else if (target_cpu == "arm64") {
    +        config_path_name = "darwin64-arm64-cc"
    +      }
    +    }
    +    assert(config_path_name != "", "Unsupported platform")
    +
    +    # GN variables can not have - in name.
    +    config_name = string_replace(config_path_name, "-", "_")
    +
    +    if (openssl_no_asm) {
    +      asm_name = "no-asm"
    +    } else {
    +      # TODO(zcbenz): Check gas_version and nasm_version.
    +      asm_name = "asm_avx2"
    +    }
    +    if (is_win && target_cpu == "arm64") {
    +      asm_name = "no-asm"
    +    }
    +    config_path = "config/archs/" + config_path_name + "/" + asm_name
    +
    +    gypi_values = exec_script("../../tools/gypi_to_gn.py",
    +                              [ rebase_path(config_path + "/openssl.gypi"), ],
    +                              "scope",
    +                              [ config_path + "/openssl.gypi" ])
    +
    +    include_dirs = rebase_path(gypi_values.include_dirs, ".", config_path)
    +    defines = gypi_values["openssl_defines_" + config_name]
    +    sources = filter_exclude(gypi_values.openssl_sources +
    +                             gypi_values["openssl_sources_" + config_name],
    +                             [ "*.ld" ])
    +  }
    +}
    diff --git a/deps/postject/BUILD.gn b/deps/postject/BUILD.gn
    new file mode 100644
    index 00000000000000..895b5bfc5b3a1a
    --- /dev/null
    +++ b/deps/postject/BUILD.gn
    @@ -0,0 +1,14 @@
    +##############################################################################
    +#                                                                            #
    +#                       DO NOT EDIT THIS FILE!                               #
    +#                                                                            #
    +##############################################################################
    +
    +# This file is used by GN for building, which is NOT the build system used for
    +# building official binaries.
    +# Please modify the gyp files if you are making changes to build system.
    +
    +import("unofficial.gni")
    +
    +postject_gn_build("postject") {
    +}
    diff --git a/deps/postject/unofficial.gni b/deps/postject/unofficial.gni
    new file mode 100644
    index 00000000000000..cbd5e841582100
    --- /dev/null
    +++ b/deps/postject/unofficial.gni
    @@ -0,0 +1,17 @@
    +# This file is used by GN for building, which is NOT the build system used for
    +# building official binaries.
    +# Please edit the gyp files if you are making changes to build system.
    +
    +# The actual configurations are put inside a template in unofficial.gni to
    +# prevent accidental edits from contributors.
    +template("postject_gn_build") {
    +  config("postject_config") {
    +    include_dirs = [ "." ]
    +  }
    +
    +  source_set(target_name) {
    +    forward_variables_from(invoker, "*")
    +    public_configs = [ ":postject_config" ]
    +    sources = [ "postject-api.h" ]
    +  }
    +}
    diff --git a/deps/simdjson/BUILD.gn b/deps/simdjson/BUILD.gn
    new file mode 100644
    index 00000000000000..d0580ccf354d20
    --- /dev/null
    +++ b/deps/simdjson/BUILD.gn
    @@ -0,0 +1,14 @@
    +##############################################################################
    +#                                                                            #
    +#                       DO NOT EDIT THIS FILE!                               #
    +#                                                                            #
    +##############################################################################
    +
    +# This file is used by GN for building, which is NOT the build system used for
    +# building official binaries.
    +# Please modify the gyp files if you are making changes to build system.
    +
    +import("unofficial.gni")
    +
    +simdjson_gn_build("simdjson") {
    +}
    diff --git a/deps/simdjson/LICENSE b/deps/simdjson/LICENSE
    new file mode 100644
    index 00000000000000..71f65b598d907f
    --- /dev/null
    +++ b/deps/simdjson/LICENSE
    @@ -0,0 +1,201 @@
    +                                 Apache License
    +                           Version 2.0, January 2004
    +                        http://www.apache.org/licenses/
    +
    +   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
    +
    +   1. Definitions.
    +
    +      "License" shall mean the terms and conditions for use, reproduction,
    +      and distribution as defined by Sections 1 through 9 of this document.
    +
    +      "Licensor" shall mean the copyright owner or entity authorized by
    +      the copyright owner that is granting the License.
    +
    +      "Legal Entity" shall mean the union of the acting entity and all
    +      other entities that control, are controlled by, or are under common
    +      control with that entity. For the purposes of this definition,
    +      "control" means (i) the power, direct or indirect, to cause the
    +      direction or management of such entity, whether by contract or
    +      otherwise, or (ii) ownership of fifty percent (50%) or more of the
    +      outstanding shares, or (iii) beneficial ownership of such entity.
    +
    +      "You" (or "Your") shall mean an individual or Legal Entity
    +      exercising permissions granted by this License.
    +
    +      "Source" form shall mean the preferred form for making modifications,
    +      including but not limited to software source code, documentation
    +      source, and configuration files.
    +
    +      "Object" form shall mean any form resulting from mechanical
    +      transformation or translation of a Source form, including but
    +      not limited to compiled object code, generated documentation,
    +      and conversions to other media types.
    +
    +      "Work" shall mean the work of authorship, whether in Source or
    +      Object form, made available under the License, as indicated by a
    +      copyright notice that is included in or attached to the work
    +      (an example is provided in the Appendix below).
    +
    +      "Derivative Works" shall mean any work, whether in Source or Object
    +      form, that is based on (or derived from) the Work and for which the
    +      editorial revisions, annotations, elaborations, or other modifications
    +      represent, as a whole, an original work of authorship. For the purposes
    +      of this License, Derivative Works shall not include works that remain
    +      separable from, or merely link (or bind by name) to the interfaces of,
    +      the Work and Derivative Works thereof.
    +
    +      "Contribution" shall mean any work of authorship, including
    +      the original version of the Work and any modifications or additions
    +      to that Work or Derivative Works thereof, that is intentionally
    +      submitted to Licensor for inclusion in the Work by the copyright owner
    +      or by an individual or Legal Entity authorized to submit on behalf of
    +      the copyright owner. For the purposes of this definition, "submitted"
    +      means any form of electronic, verbal, or written communication sent
    +      to the Licensor or its representatives, including but not limited to
    +      communication on electronic mailing lists, source code control systems,
    +      and issue tracking systems that are managed by, or on behalf of, the
    +      Licensor for the purpose of discussing and improving the Work, but
    +      excluding communication that is conspicuously marked or otherwise
    +      designated in writing by the copyright owner as "Not a Contribution."
    +
    +      "Contributor" shall mean Licensor and any individual or Legal Entity
    +      on behalf of whom a Contribution has been received by Licensor and
    +      subsequently incorporated within the Work.
    +
    +   2. Grant of Copyright License. Subject to the terms and conditions of
    +      this License, each Contributor hereby grants to You a perpetual,
    +      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
    +      copyright license to reproduce, prepare Derivative Works of,
    +      publicly display, publicly perform, sublicense, and distribute the
    +      Work and such Derivative Works in Source or Object form.
    +
    +   3. Grant of Patent License. Subject to the terms and conditions of
    +      this License, each Contributor hereby grants to You a perpetual,
    +      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
    +      (except as stated in this section) patent license to make, have made,
    +      use, offer to sell, sell, import, and otherwise transfer the Work,
    +      where such license applies only to those patent claims licensable
    +      by such Contributor that are necessarily infringed by their
    +      Contribution(s) alone or by combination of their Contribution(s)
    +      with the Work to which such Contribution(s) was submitted. If You
    +      institute patent litigation against any entity (including a
    +      cross-claim or counterclaim in a lawsuit) alleging that the Work
    +      or a Contribution incorporated within the Work constitutes direct
    +      or contributory patent infringement, then any patent licenses
    +      granted to You under this License for that Work shall terminate
    +      as of the date such litigation is filed.
    +
    +   4. Redistribution. You may reproduce and distribute copies of the
    +      Work or Derivative Works thereof in any medium, with or without
    +      modifications, and in Source or Object form, provided that You
    +      meet the following conditions:
    +
    +      (a) You must give any other recipients of the Work or
    +          Derivative Works a copy of this License; and
    +
    +      (b) You must cause any modified files to carry prominent notices
    +          stating that You changed the files; and
    +
    +      (c) You must retain, in the Source form of any Derivative Works
    +          that You distribute, all copyright, patent, trademark, and
    +          attribution notices from the Source form of the Work,
    +          excluding those notices that do not pertain to any part of
    +          the Derivative Works; and
    +
    +      (d) If the Work includes a "NOTICE" text file as part of its
    +          distribution, then any Derivative Works that You distribute must
    +          include a readable copy of the attribution notices contained
    +          within such NOTICE file, excluding those notices that do not
    +          pertain to any part of the Derivative Works, in at least one
    +          of the following places: within a NOTICE text file distributed
    +          as part of the Derivative Works; within the Source form or
    +          documentation, if provided along with the Derivative Works; or,
    +          within a display generated by the Derivative Works, if and
    +          wherever such third-party notices normally appear. The contents
    +          of the NOTICE file are for informational purposes only and
    +          do not modify the License. You may add Your own attribution
    +          notices within Derivative Works that You distribute, alongside
    +          or as an addendum to the NOTICE text from the Work, provided
    +          that such additional attribution notices cannot be construed
    +          as modifying the License.
    +
    +      You may add Your own copyright statement to Your modifications and
    +      may provide additional or different license terms and conditions
    +      for use, reproduction, or distribution of Your modifications, or
    +      for any such Derivative Works as a whole, provided Your use,
    +      reproduction, and distribution of the Work otherwise complies with
    +      the conditions stated in this License.
    +
    +   5. Submission of Contributions. Unless You explicitly state otherwise,
    +      any Contribution intentionally submitted for inclusion in the Work
    +      by You to the Licensor shall be under the terms and conditions of
    +      this License, without any additional terms or conditions.
    +      Notwithstanding the above, nothing herein shall supersede or modify
    +      the terms of any separate license agreement you may have executed
    +      with Licensor regarding such Contributions.
    +
    +   6. Trademarks. This License does not grant permission to use the trade
    +      names, trademarks, service marks, or product names of the Licensor,
    +      except as required for reasonable and customary use in describing the
    +      origin of the Work and reproducing the content of the NOTICE file.
    +
    +   7. Disclaimer of Warranty. Unless required by applicable law or
    +      agreed to in writing, Licensor provides the Work (and each
    +      Contributor provides its Contributions) on an "AS IS" BASIS,
    +      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
    +      implied, including, without limitation, any warranties or conditions
    +      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
    +      PARTICULAR PURPOSE. You are solely responsible for determining the
    +      appropriateness of using or redistributing the Work and assume any
    +      risks associated with Your exercise of permissions under this License.
    +
    +   8. Limitation of Liability. In no event and under no legal theory,
    +      whether in tort (including negligence), contract, or otherwise,
    +      unless required by applicable law (such as deliberate and grossly
    +      negligent acts) or agreed to in writing, shall any Contributor be
    +      liable to You for damages, including any direct, indirect, special,
    +      incidental, or consequential damages of any character arising as a
    +      result of this License or out of the use or inability to use the
    +      Work (including but not limited to damages for loss of goodwill,
    +      work stoppage, computer failure or malfunction, or any and all
    +      other commercial damages or losses), even if such Contributor
    +      has been advised of the possibility of such damages.
    +
    +   9. Accepting Warranty or Additional Liability. While redistributing
    +      the Work or Derivative Works thereof, You may choose to offer,
    +      and charge a fee for, acceptance of support, warranty, indemnity,
    +      or other liability obligations and/or rights consistent with this
    +      License. However, in accepting such obligations, You may act only
    +      on Your own behalf and on Your sole responsibility, not on behalf
    +      of any other Contributor, and only if You agree to indemnify,
    +      defend, and hold each Contributor harmless for any liability
    +      incurred by, or claims asserted against, such Contributor by reason
    +      of your accepting any such warranty or additional liability.
    +
    +   END OF TERMS AND CONDITIONS
    +
    +   APPENDIX: How to apply the Apache License to your work.
    +
    +      To apply the Apache License to your work, attach the following
    +      boilerplate notice, with the fields enclosed by brackets "{}"
    +      replaced with your own identifying information. (Don't include
    +      the brackets!)  The text should be enclosed in the appropriate
    +      comment syntax for the file format. We also recommend that a
    +      file or class name and description of purpose be included on the
    +      same "printed page" as the copyright notice for easier
    +      identification within third-party archives.
    +
    +   Copyright 2018-2023 The simdjson authors
    +
    +   Licensed under the Apache License, Version 2.0 (the "License");
    +   you may not use this file except in compliance with the License.
    +   You may obtain a copy of the License at
    +
    +       http://www.apache.org/licenses/LICENSE-2.0
    +
    +   Unless required by applicable law or agreed to in writing, software
    +   distributed under the License is distributed on an "AS IS" BASIS,
    +   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +   See the License for the specific language governing permissions and
    +   limitations under the License.
    diff --git a/deps/simdjson/simdjson.cpp b/deps/simdjson/simdjson.cpp
    new file mode 100644
    index 00000000000000..4dd913b70ba65a
    --- /dev/null
    +++ b/deps/simdjson/simdjson.cpp
    @@ -0,0 +1,43382 @@
    +/* auto-generated on 2023-12-07 12:42:28 -0500. Do not edit! */
    +/* including simdjson.cpp:  */
    +/* begin file simdjson.cpp */
    +#define SIMDJSON_SRC_SIMDJSON_CPP
    +
    +/* including base.h: #include  */
    +/* begin file base.h */
    +#ifndef SIMDJSON_SRC_BASE_H
    +#define SIMDJSON_SRC_BASE_H
    +
    +/* including simdjson/base.h: #include  */
    +/* begin file simdjson/base.h */
    +/**
    + * @file Base declarations for all simdjson headers
    + * @private
    + */
    +#ifndef SIMDJSON_BASE_H
    +#define SIMDJSON_BASE_H
    +
    +/* including simdjson/common_defs.h: #include "simdjson/common_defs.h" */
    +/* begin file simdjson/common_defs.h */
    +#ifndef SIMDJSON_COMMON_DEFS_H
    +#define SIMDJSON_COMMON_DEFS_H
    +
    +#include 
    +/* including simdjson/compiler_check.h: #include "simdjson/compiler_check.h" */
    +/* begin file simdjson/compiler_check.h */
    +#ifndef SIMDJSON_COMPILER_CHECK_H
    +#define SIMDJSON_COMPILER_CHECK_H
    +
    +#ifndef __cplusplus
    +#error simdjson requires a C++ compiler
    +#endif
    +
    +#ifndef SIMDJSON_CPLUSPLUS
    +#if defined(_MSVC_LANG) && !defined(__clang__)
    +#define SIMDJSON_CPLUSPLUS (_MSC_VER == 1900 ? 201103L : _MSVC_LANG)
    +#else
    +#define SIMDJSON_CPLUSPLUS __cplusplus
    +#endif
    +#endif
    +
    +// C++ 17
    +#if !defined(SIMDJSON_CPLUSPLUS17) && (SIMDJSON_CPLUSPLUS >= 201703L)
    +#define SIMDJSON_CPLUSPLUS17 1
    +#endif
    +
    +// C++ 14
    +#if !defined(SIMDJSON_CPLUSPLUS14) && (SIMDJSON_CPLUSPLUS >= 201402L)
    +#define SIMDJSON_CPLUSPLUS14 1
    +#endif
    +
    +// C++ 11
    +#if !defined(SIMDJSON_CPLUSPLUS11) && (SIMDJSON_CPLUSPLUS >= 201103L)
    +#define SIMDJSON_CPLUSPLUS11 1
    +#endif
    +
    +#ifndef SIMDJSON_CPLUSPLUS11
    +#error simdjson requires a compiler compliant with the C++11 standard
    +#endif
    +
    +#ifndef SIMDJSON_IF_CONSTEXPR
    +#if SIMDJSON_CPLUSPLUS17
    +#define SIMDJSON_IF_CONSTEXPR if constexpr
    +#else
    +#define SIMDJSON_IF_CONSTEXPR if
    +#endif
    +#endif
    +
    +#endif // SIMDJSON_COMPILER_CHECK_H
    +/* end file simdjson/compiler_check.h */
    +/* including simdjson/portability.h: #include "simdjson/portability.h" */
    +/* begin file simdjson/portability.h */
    +#ifndef SIMDJSON_PORTABILITY_H
    +#define SIMDJSON_PORTABILITY_H
    +
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#ifndef _WIN32
    +// strcasecmp, strncasecmp
    +#include 
    +#endif
    +
    +#ifdef _MSC_VER
    +#define SIMDJSON_VISUAL_STUDIO 1
    +/**
    + * We want to differentiate carefully between
    + * clang under visual studio and regular visual
    + * studio.
    + *
    + * Under clang for Windows, we enable:
    + *  * target pragmas so that part and only part of the
    + *     code gets compiled for advanced instructions.
    + *
    + */
    +#ifdef __clang__
    +// clang under visual studio
    +#define SIMDJSON_CLANG_VISUAL_STUDIO 1
    +#else
    +// just regular visual studio (best guess)
    +#define SIMDJSON_REGULAR_VISUAL_STUDIO 1
    +#endif // __clang__
    +#endif // _MSC_VER
    +
    +#if defined(__x86_64__) || defined(_M_AMD64)
    +#define SIMDJSON_IS_X86_64 1
    +#elif defined(__aarch64__) || defined(_M_ARM64)
    +#define SIMDJSON_IS_ARM64 1
    +#elif defined(__riscv) && __riscv_xlen == 64
    +#define SIMDJSON_IS_RISCV64 1
    +#elif defined(__PPC64__) || defined(_M_PPC64)
    +#if defined(__ALTIVEC__)
    +#define SIMDJSON_IS_PPC64_VMX 1
    +#endif // defined(__ALTIVEC__)
    +#else
    +#define SIMDJSON_IS_32BITS 1
    +
    +#if defined(_M_IX86) || defined(__i386__)
    +#define SIMDJSON_IS_X86_32BITS 1
    +#elif defined(__arm__) || defined(_M_ARM)
    +#define SIMDJSON_IS_ARM_32BITS 1
    +#elif defined(__PPC__) || defined(_M_PPC)
    +#define SIMDJSON_IS_PPC_32BITS 1
    +#endif
    +
    +#endif // defined(__x86_64__) || defined(_M_AMD64)
    +#ifndef SIMDJSON_IS_32BITS
    +#define SIMDJSON_IS_32BITS 0
    +#endif
    +
    +#if SIMDJSON_IS_32BITS
    +#ifndef SIMDJSON_NO_PORTABILITY_WARNING
    +// In the future, we should allow programmers
    +// to get warning.
    +#endif // SIMDJSON_NO_PORTABILITY_WARNING
    +#endif // SIMDJSON_IS_32BITS
    +
    +#define SIMDJSON_CAT_IMPLEMENTATION_(a,...) a ## __VA_ARGS__
    +#define SIMDJSON_CAT(a,...) SIMDJSON_CAT_IMPLEMENTATION_(a, __VA_ARGS__)
    +
    +#define SIMDJSON_STRINGIFY_IMPLEMENTATION_(a,...) #a SIMDJSON_STRINGIFY(__VA_ARGS__)
    +#define SIMDJSON_STRINGIFY(a,...) SIMDJSON_CAT_IMPLEMENTATION_(a, __VA_ARGS__)
    +
    +// this is almost standard?
    +#undef SIMDJSON_STRINGIFY_IMPLEMENTATION_
    +#undef SIMDJSON_STRINGIFY
    +#define SIMDJSON_STRINGIFY_IMPLEMENTATION_(a) #a
    +#define SIMDJSON_STRINGIFY(a) SIMDJSON_STRINGIFY_IMPLEMENTATION_(a)
    +
    +// Our fast kernels require 64-bit systems.
    +//
    +// On 32-bit x86, we lack 64-bit popcnt, lzcnt, blsr instructions.
    +// Furthermore, the number of SIMD registers is reduced.
    +//
    +// On 32-bit ARM, we would have smaller registers.
    +//
    +// The simdjson users should still have the fallback kernel. It is
    +// slower, but it should run everywhere.
    +
    +//
    +// Enable valid runtime implementations, and select SIMDJSON_BUILTIN_IMPLEMENTATION
    +//
    +
    +// We are going to use runtime dispatch.
    +#if SIMDJSON_IS_X86_64
    +#ifdef __clang__
    +// clang does not have GCC push pop
    +// warning: clang attribute push can't be used within a namespace in clang up
    +// til 8.0 so SIMDJSON_TARGET_REGION and SIMDJSON_UNTARGET_REGION must be *outside* of a
    +// namespace.
    +#define SIMDJSON_TARGET_REGION(T)                                                       \
    +  _Pragma(SIMDJSON_STRINGIFY(                                                           \
    +      clang attribute push(__attribute__((target(T))), apply_to = function)))
    +#define SIMDJSON_UNTARGET_REGION _Pragma("clang attribute pop")
    +#elif defined(__GNUC__)
    +// GCC is easier
    +#define SIMDJSON_TARGET_REGION(T)                                                       \
    +  _Pragma("GCC push_options") _Pragma(SIMDJSON_STRINGIFY(GCC target(T)))
    +#define SIMDJSON_UNTARGET_REGION _Pragma("GCC pop_options")
    +#endif // clang then gcc
    +
    +#endif // x86
    +
    +// Default target region macros don't do anything.
    +#ifndef SIMDJSON_TARGET_REGION
    +#define SIMDJSON_TARGET_REGION(T)
    +#define SIMDJSON_UNTARGET_REGION
    +#endif
    +
    +// Is threading enabled?
    +#if defined(_REENTRANT) || defined(_MT)
    +#ifndef SIMDJSON_THREADS_ENABLED
    +#define SIMDJSON_THREADS_ENABLED
    +#endif
    +#endif
    +
    +// workaround for large stack sizes under -O0.
    +// https://github.com/simdjson/simdjson/issues/691
    +#ifdef __APPLE__
    +#ifndef __OPTIMIZE__
    +// Apple systems have small stack sizes in secondary threads.
    +// Lack of compiler optimization may generate high stack usage.
    +// Users may want to disable threads for safety, but only when
    +// in debug mode which we detect by the fact that the __OPTIMIZE__
    +// macro is not defined.
    +#undef SIMDJSON_THREADS_ENABLED
    +#endif
    +#endif
    +
    +
    +#if defined(__clang__)
    +#define SIMDJSON_NO_SANITIZE_UNDEFINED __attribute__((no_sanitize("undefined")))
    +#elif defined(__GNUC__)
    +#define SIMDJSON_NO_SANITIZE_UNDEFINED __attribute__((no_sanitize_undefined))
    +#else
    +#define SIMDJSON_NO_SANITIZE_UNDEFINED
    +#endif
    +
    +
    +#if defined(__clang__) || defined(__GNUC__)
    +#if defined(__has_feature)
    +#  if __has_feature(memory_sanitizer)
    +#define SIMDJSON_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory")))
    +#  endif // if __has_feature(memory_sanitizer)
    +#endif // defined(__has_feature)
    +#endif
    +// make sure it is defined as 'nothing' if it is unapplicable.
    +#ifndef SIMDJSON_NO_SANITIZE_MEMORY
    +#define SIMDJSON_NO_SANITIZE_MEMORY
    +#endif
    +
    +#if SIMDJSON_VISUAL_STUDIO
    +// This is one case where we do not distinguish between
    +// regular visual studio and clang under visual studio.
    +// clang under Windows has _stricmp (like visual studio) but not strcasecmp (as clang normally has)
    +#define simdjson_strcasecmp _stricmp
    +#define simdjson_strncasecmp _strnicmp
    +#else
    +// The strcasecmp, strncasecmp, and strcasestr functions do not work with multibyte strings (e.g. UTF-8).
    +// So they are only useful for ASCII in our context.
    +// https://www.gnu.org/software/libunistring/manual/libunistring.html#char-_002a-strings
    +#define simdjson_strcasecmp strcasecmp
    +#define simdjson_strncasecmp strncasecmp
    +#endif
    +
    +#if defined(NDEBUG) || defined(__OPTIMIZE__) || (defined(_MSC_VER) && !defined(_DEBUG))
    +// If NDEBUG is set, or __OPTIMIZE__ is set, or we are under MSVC in release mode,
    +// then do away with asserts and use __assume.
    +#if SIMDJSON_VISUAL_STUDIO
    +#define SIMDJSON_UNREACHABLE() __assume(0)
    +#define SIMDJSON_ASSUME(COND) __assume(COND)
    +#else
    +#define SIMDJSON_UNREACHABLE() __builtin_unreachable();
    +#define SIMDJSON_ASSUME(COND) do { if (!(COND)) __builtin_unreachable(); } while (0)
    +#endif
    +
    +#else // defined(NDEBUG) || defined(__OPTIMIZE__) || (defined(_MSC_VER) && !defined(_DEBUG))
    +// This should only ever be enabled in debug mode.
    +#define SIMDJSON_UNREACHABLE() assert(0);
    +#define SIMDJSON_ASSUME(COND) assert(COND)
    +
    +#endif
    +
    +#endif // SIMDJSON_PORTABILITY_H
    +/* end file simdjson/portability.h */
    +
    +namespace simdjson {
    +namespace internal {
    +/**
    + * @private
    + * Our own implementation of the C++17 to_chars function.
    + * Defined in src/to_chars
    + */
    +char *to_chars(char *first, const char *last, double value);
    +/**
    + * @private
    + * A number parsing routine.
    + * Defined in src/from_chars
    + */
    +double from_chars(const char *first) noexcept;
    +double from_chars(const char *first, const char* end) noexcept;
    +}
    +
    +#ifndef SIMDJSON_EXCEPTIONS
    +#if __cpp_exceptions
    +#define SIMDJSON_EXCEPTIONS 1
    +#else
    +#define SIMDJSON_EXCEPTIONS 0
    +#endif
    +#endif
    +
    +} // namespace simdjson
    +
    +#if defined(__GNUC__)
    +  // Marks a block with a name so that MCA analysis can see it.
    +  #define SIMDJSON_BEGIN_DEBUG_BLOCK(name) __asm volatile("# LLVM-MCA-BEGIN " #name);
    +  #define SIMDJSON_END_DEBUG_BLOCK(name) __asm volatile("# LLVM-MCA-END " #name);
    +  #define SIMDJSON_DEBUG_BLOCK(name, block) BEGIN_DEBUG_BLOCK(name); block; END_DEBUG_BLOCK(name);
    +#else
    +  #define SIMDJSON_BEGIN_DEBUG_BLOCK(name)
    +  #define SIMDJSON_END_DEBUG_BLOCK(name)
    +  #define SIMDJSON_DEBUG_BLOCK(name, block)
    +#endif
    +
    +// Align to N-byte boundary
    +#define SIMDJSON_ROUNDUP_N(a, n) (((a) + ((n)-1)) & ~((n)-1))
    +#define SIMDJSON_ROUNDDOWN_N(a, n) ((a) & ~((n)-1))
    +
    +#define SIMDJSON_ISALIGNED_N(ptr, n) (((uintptr_t)(ptr) & ((n)-1)) == 0)
    +
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +
    +  #define simdjson_really_inline __forceinline
    +  #define simdjson_never_inline __declspec(noinline)
    +
    +  #define simdjson_unused
    +  #define simdjson_warn_unused
    +
    +  #ifndef simdjson_likely
    +  #define simdjson_likely(x) x
    +  #endif
    +  #ifndef simdjson_unlikely
    +  #define simdjson_unlikely(x) x
    +  #endif
    +
    +  #define SIMDJSON_PUSH_DISABLE_WARNINGS __pragma(warning( push ))
    +  #define SIMDJSON_PUSH_DISABLE_ALL_WARNINGS __pragma(warning( push, 0 ))
    +  #define SIMDJSON_DISABLE_VS_WARNING(WARNING_NUMBER) __pragma(warning( disable : WARNING_NUMBER ))
    +  // Get rid of Intellisense-only warnings (Code Analysis)
    +  // Though __has_include is C++17, it is supported in Visual Studio 2017 or better (_MSC_VER>=1910).
    +  #ifdef __has_include
    +  #if __has_include()
    +  #include 
    +  #define SIMDJSON_DISABLE_UNDESIRED_WARNINGS SIMDJSON_DISABLE_VS_WARNING(ALL_CPPCORECHECK_WARNINGS)
    +  #endif
    +  #endif
    +
    +  #ifndef SIMDJSON_DISABLE_UNDESIRED_WARNINGS
    +  #define SIMDJSON_DISABLE_UNDESIRED_WARNINGS
    +  #endif
    +
    +  #define SIMDJSON_DISABLE_DEPRECATED_WARNING SIMDJSON_DISABLE_VS_WARNING(4996)
    +  #define SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +  #define SIMDJSON_POP_DISABLE_WARNINGS __pragma(warning( pop ))
    +
    +  #define SIMDJSON_PUSH_DISABLE_UNUSED_WARNINGS
    +  #define SIMDJSON_POP_DISABLE_UNUSED_WARNINGS
    +
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO
    +
    +  #define simdjson_really_inline inline __attribute__((always_inline))
    +  #define simdjson_never_inline inline __attribute__((noinline))
    +
    +  #define simdjson_unused __attribute__((unused))
    +  #define simdjson_warn_unused __attribute__((warn_unused_result))
    +
    +  #ifndef simdjson_likely
    +  #define simdjson_likely(x) __builtin_expect(!!(x), 1)
    +  #endif
    +  #ifndef simdjson_unlikely
    +  #define simdjson_unlikely(x) __builtin_expect(!!(x), 0)
    +  #endif
    +
    +  #define SIMDJSON_PUSH_DISABLE_WARNINGS _Pragma("GCC diagnostic push")
    +  // gcc doesn't seem to disable all warnings with all and extra, add warnings here as necessary
    +  // We do it separately for clang since it has different warnings.
    +  #ifdef __clang__
    +  // clang is missing -Wmaybe-uninitialized.
    +  #define SIMDJSON_PUSH_DISABLE_ALL_WARNINGS SIMDJSON_PUSH_DISABLE_WARNINGS \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Weffc++) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wall) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wconversion) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wextra) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wattributes) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wimplicit-fallthrough) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wnon-virtual-dtor) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wreturn-type) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wshadow) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wunused-parameter) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wunused-variable)
    +  #else // __clang__
    +  #define SIMDJSON_PUSH_DISABLE_ALL_WARNINGS SIMDJSON_PUSH_DISABLE_WARNINGS \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Weffc++) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wall) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wconversion) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wextra) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wattributes) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wimplicit-fallthrough) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wnon-virtual-dtor) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wreturn-type) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wshadow) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wunused-parameter) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wunused-variable) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wmaybe-uninitialized) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wformat-security)
    +  #endif // __clang__
    +
    +  #define SIMDJSON_PRAGMA(P) _Pragma(#P)
    +  #define SIMDJSON_DISABLE_GCC_WARNING(WARNING) SIMDJSON_PRAGMA(GCC diagnostic ignored #WARNING)
    +  #if SIMDJSON_CLANG_VISUAL_STUDIO
    +  #define SIMDJSON_DISABLE_UNDESIRED_WARNINGS SIMDJSON_DISABLE_GCC_WARNING(-Wmicrosoft-include)
    +  #else
    +  #define SIMDJSON_DISABLE_UNDESIRED_WARNINGS
    +  #endif
    +  #define SIMDJSON_DISABLE_DEPRECATED_WARNING SIMDJSON_DISABLE_GCC_WARNING(-Wdeprecated-declarations)
    +  #define SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING SIMDJSON_DISABLE_GCC_WARNING(-Wstrict-overflow)
    +  #define SIMDJSON_POP_DISABLE_WARNINGS _Pragma("GCC diagnostic pop")
    +
    +  #define SIMDJSON_PUSH_DISABLE_UNUSED_WARNINGS SIMDJSON_PUSH_DISABLE_WARNINGS \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wunused)
    +  #define SIMDJSON_POP_DISABLE_UNUSED_WARNINGS SIMDJSON_POP_DISABLE_WARNINGS
    +
    +
    +
    +#endif // MSC_VER
    +
    +#if defined(simdjson_inline)
    +  // Prefer the user's definition of simdjson_inline; don't define it ourselves.
    +#elif defined(__GNUC__) && !defined(__OPTIMIZE__)
    +  // If optimizations are disabled, forcing inlining can lead to significant
    +  // code bloat and high compile times. Don't use simdjson_really_inline for
    +  // unoptimized builds.
    +  #define simdjson_inline inline
    +#else
    +  // Force inlining for most simdjson functions.
    +  #define simdjson_inline simdjson_really_inline
    +#endif
    +
    +#if SIMDJSON_VISUAL_STUDIO
    +    /**
    +     * Windows users need to do some extra work when building
    +     * or using a dynamic library (DLL). When building, we need
    +     * to set SIMDJSON_DLLIMPORTEXPORT to __declspec(dllexport).
    +     * When *using* the DLL, the user needs to set
    +     * SIMDJSON_DLLIMPORTEXPORT __declspec(dllimport).
    +     *
    +     * Static libraries not need require such work.
    +     *
    +     * It does not matter here whether you are using
    +     * the regular visual studio or clang under visual
    +     * studio, you still need to handle these issues.
    +     *
    +     * Non-Windows systems do not have this complexity.
    +     */
    +    #if SIMDJSON_BUILDING_WINDOWS_DYNAMIC_LIBRARY
    +    // We set SIMDJSON_BUILDING_WINDOWS_DYNAMIC_LIBRARY when we build a DLL under Windows.
    +    // It should never happen that both SIMDJSON_BUILDING_WINDOWS_DYNAMIC_LIBRARY and
    +    // SIMDJSON_USING_WINDOWS_DYNAMIC_LIBRARY are set.
    +    #define SIMDJSON_DLLIMPORTEXPORT __declspec(dllexport)
    +    #elif SIMDJSON_USING_WINDOWS_DYNAMIC_LIBRARY
    +    // Windows user who call a dynamic library should set SIMDJSON_USING_WINDOWS_DYNAMIC_LIBRARY to 1.
    +    #define SIMDJSON_DLLIMPORTEXPORT __declspec(dllimport)
    +    #else
    +    // We assume by default static linkage
    +    #define SIMDJSON_DLLIMPORTEXPORT
    +    #endif
    +
    +/**
    + * Workaround for the vcpkg package manager. Only vcpkg should
    + * ever touch the next line. The SIMDJSON_USING_LIBRARY macro is otherwise unused.
    + */
    +#if SIMDJSON_USING_LIBRARY
    +#define SIMDJSON_DLLIMPORTEXPORT __declspec(dllimport)
    +#endif
    +/**
    + * End of workaround for the vcpkg package manager.
    + */
    +#else
    +    #define SIMDJSON_DLLIMPORTEXPORT
    +#endif
    +
    +// C++17 requires string_view.
    +#if SIMDJSON_CPLUSPLUS17
    +#define SIMDJSON_HAS_STRING_VIEW
    +#include  // by the standard, this has to be safe.
    +#endif
    +
    +// This macro (__cpp_lib_string_view) has to be defined
    +// for C++17 and better, but if it is otherwise defined,
    +// we are going to assume that string_view is available
    +// even if we do not have C++17 support.
    +#ifdef __cpp_lib_string_view
    +#define SIMDJSON_HAS_STRING_VIEW
    +#endif
    +
    +// Some systems have string_view even if we do not have C++17 support,
    +// and even if __cpp_lib_string_view is undefined, it is the case
    +// with Apple clang version 11.
    +// We must handle it. *This is important.*
    +#ifndef SIMDJSON_HAS_STRING_VIEW
    +#if defined __has_include
    +// do not combine the next #if with the previous one (unsafe)
    +#if __has_include ()
    +// now it is safe to trigger the include
    +#include  // though the file is there, it does not follow that we got the implementation
    +#if defined(_LIBCPP_STRING_VIEW)
    +// Ah! So we under libc++ which under its Library Fundamentals Technical Specification, which preceded C++17,
    +// included string_view.
    +// This means that we have string_view *even though* we may not have C++17.
    +#define SIMDJSON_HAS_STRING_VIEW
    +#endif // _LIBCPP_STRING_VIEW
    +#endif // __has_include ()
    +#endif // defined __has_include
    +#endif // def SIMDJSON_HAS_STRING_VIEW
    +// end of complicated but important routine to try to detect string_view.
    +
    +//
    +// Backfill std::string_view using nonstd::string_view on systems where
    +// we expect that string_view is missing. Important: if we get this wrong,
    +// we will end up with two string_view definitions and potential trouble.
    +// That is why we work so hard above to avoid it.
    +//
    +#ifndef SIMDJSON_HAS_STRING_VIEW
    +SIMDJSON_PUSH_DISABLE_ALL_WARNINGS
    +/* including simdjson/nonstd/string_view.hpp: #include "simdjson/nonstd/string_view.hpp" */
    +/* begin file simdjson/nonstd/string_view.hpp */
    +// Copyright 2017-2020 by Martin Moene
    +//
    +// string-view lite, a C++17-like string_view for C++98 and later.
    +// For more information see https://github.com/martinmoene/string-view-lite
    +//
    +// Distributed under the Boost Software License, Version 1.0.
    +// (See accompanying file LICENSE.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
    +
    +#pragma once
    +
    +#ifndef NONSTD_SV_LITE_H_INCLUDED
    +#define NONSTD_SV_LITE_H_INCLUDED
    +
    +#define string_view_lite_MAJOR  1
    +#define string_view_lite_MINOR  7
    +#define string_view_lite_PATCH  0
    +
    +#define string_view_lite_VERSION  nssv_STRINGIFY(string_view_lite_MAJOR) "." nssv_STRINGIFY(string_view_lite_MINOR) "." nssv_STRINGIFY(string_view_lite_PATCH)
    +
    +#define nssv_STRINGIFY(  x )  nssv_STRINGIFY_( x )
    +#define nssv_STRINGIFY_( x )  #x
    +
    +// string-view lite configuration:
    +
    +#define nssv_STRING_VIEW_DEFAULT  0
    +#define nssv_STRING_VIEW_NONSTD   1
    +#define nssv_STRING_VIEW_STD      2
    +
    +// tweak header support:
    +
    +#ifdef __has_include
    +# if __has_include()
    +#  include 
    +# endif
    +#define nssv_HAVE_TWEAK_HEADER  1
    +#else
    +#define nssv_HAVE_TWEAK_HEADER  0
    +//# pragma message("string_view.hpp: Note: Tweak header not supported.")
    +#endif
    +
    +// string_view selection and configuration:
    +
    +#if !defined( nssv_CONFIG_SELECT_STRING_VIEW )
    +# define nssv_CONFIG_SELECT_STRING_VIEW  ( nssv_HAVE_STD_STRING_VIEW ? nssv_STRING_VIEW_STD : nssv_STRING_VIEW_NONSTD )
    +#endif
    +
    +#ifndef  nssv_CONFIG_STD_SV_OPERATOR
    +# define nssv_CONFIG_STD_SV_OPERATOR  0
    +#endif
    +
    +#ifndef  nssv_CONFIG_USR_SV_OPERATOR
    +# define nssv_CONFIG_USR_SV_OPERATOR  1
    +#endif
    +
    +#ifdef   nssv_CONFIG_CONVERSION_STD_STRING
    +# define nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS   nssv_CONFIG_CONVERSION_STD_STRING
    +# define nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS  nssv_CONFIG_CONVERSION_STD_STRING
    +#endif
    +
    +#ifndef  nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS
    +# define nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS  1
    +#endif
    +
    +#ifndef  nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
    +# define nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS  1
    +#endif
    +
    +#ifndef  nssv_CONFIG_NO_STREAM_INSERTION
    +# define nssv_CONFIG_NO_STREAM_INSERTION  0
    +#endif
    +
    +// Control presence of exception handling (try and auto discover):
    +
    +#ifndef nssv_CONFIG_NO_EXCEPTIONS
    +# if defined(_MSC_VER)
    +#  include     // for _HAS_EXCEPTIONS
    +# endif
    +# if defined(__cpp_exceptions) || defined(__EXCEPTIONS) || (_HAS_EXCEPTIONS)
    +#  define nssv_CONFIG_NO_EXCEPTIONS  0
    +# else
    +#  define nssv_CONFIG_NO_EXCEPTIONS  1
    +# endif
    +#endif
    +
    +// C++ language version detection (C++23 is speculative):
    +// Note: VC14.0/1900 (VS2015) lacks too much from C++14.
    +
    +#ifndef   nssv_CPLUSPLUS
    +# if defined(_MSVC_LANG ) && !defined(__clang__)
    +#  define nssv_CPLUSPLUS  (_MSC_VER == 1900 ? 201103L : _MSVC_LANG )
    +# else
    +#  define nssv_CPLUSPLUS  __cplusplus
    +# endif
    +#endif
    +
    +#define nssv_CPP98_OR_GREATER  ( nssv_CPLUSPLUS >= 199711L )
    +#define nssv_CPP11_OR_GREATER  ( nssv_CPLUSPLUS >= 201103L )
    +#define nssv_CPP11_OR_GREATER_ ( nssv_CPLUSPLUS >= 201103L )
    +#define nssv_CPP14_OR_GREATER  ( nssv_CPLUSPLUS >= 201402L )
    +#define nssv_CPP17_OR_GREATER  ( nssv_CPLUSPLUS >= 201703L )
    +#define nssv_CPP20_OR_GREATER  ( nssv_CPLUSPLUS >= 202002L )
    +#define nssv_CPP23_OR_GREATER  ( nssv_CPLUSPLUS >= 202300L )
    +
    +// use C++17 std::string_view if available and requested:
    +
    +#if nssv_CPP17_OR_GREATER && defined(__has_include )
    +# if __has_include(  )
    +#  define nssv_HAVE_STD_STRING_VIEW  1
    +# else
    +#  define nssv_HAVE_STD_STRING_VIEW  0
    +# endif
    +#else
    +# define  nssv_HAVE_STD_STRING_VIEW  0
    +#endif
    +
    +#define  nssv_USES_STD_STRING_VIEW  ( (nssv_CONFIG_SELECT_STRING_VIEW == nssv_STRING_VIEW_STD) || ((nssv_CONFIG_SELECT_STRING_VIEW == nssv_STRING_VIEW_DEFAULT) && nssv_HAVE_STD_STRING_VIEW) )
    +
    +#define nssv_HAVE_STARTS_WITH ( nssv_CPP20_OR_GREATER || !nssv_USES_STD_STRING_VIEW )
    +#define nssv_HAVE_ENDS_WITH     nssv_HAVE_STARTS_WITH
    +
    +//
    +// Use C++17 std::string_view:
    +//
    +
    +#if nssv_USES_STD_STRING_VIEW
    +
    +#include 
    +
    +// Extensions for std::string:
    +
    +#if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
    +
    +namespace nonstd {
    +
    +template< class CharT, class Traits, class Allocator = std::allocator >
    +std::basic_string
    +to_string( std::basic_string_view v, Allocator const & a = Allocator() )
    +{
    +    return std::basic_string( v.begin(), v.end(), a );
    +}
    +
    +template< class CharT, class Traits, class Allocator >
    +std::basic_string_view
    +to_string_view( std::basic_string const & s )
    +{
    +    return std::basic_string_view( s.data(), s.size() );
    +}
    +
    +// Literal operators sv and _sv:
    +
    +#if nssv_CONFIG_STD_SV_OPERATOR
    +
    +using namespace std::literals::string_view_literals;
    +
    +#endif
    +
    +#if nssv_CONFIG_USR_SV_OPERATOR
    +
    +inline namespace literals {
    +inline namespace string_view_literals {
    +
    +
    +constexpr std::string_view operator "" _sv( const char* str, size_t len ) noexcept  // (1)
    +{
    +    return std::string_view{ str, len };
    +}
    +
    +constexpr std::u16string_view operator "" _sv( const char16_t* str, size_t len ) noexcept  // (2)
    +{
    +    return std::u16string_view{ str, len };
    +}
    +
    +constexpr std::u32string_view operator "" _sv( const char32_t* str, size_t len ) noexcept  // (3)
    +{
    +    return std::u32string_view{ str, len };
    +}
    +
    +constexpr std::wstring_view operator "" _sv( const wchar_t* str, size_t len ) noexcept  // (4)
    +{
    +    return std::wstring_view{ str, len };
    +}
    +
    +}} // namespace literals::string_view_literals
    +
    +#endif // nssv_CONFIG_USR_SV_OPERATOR
    +
    +} // namespace nonstd
    +
    +#endif // nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
    +
    +namespace nonstd {
    +
    +using std::string_view;
    +using std::wstring_view;
    +using std::u16string_view;
    +using std::u32string_view;
    +using std::basic_string_view;
    +
    +// literal "sv" and "_sv", see above
    +
    +using std::operator==;
    +using std::operator!=;
    +using std::operator<;
    +using std::operator<=;
    +using std::operator>;
    +using std::operator>=;
    +
    +using std::operator<<;
    +
    +} // namespace nonstd
    +
    +#else // nssv_HAVE_STD_STRING_VIEW
    +
    +//
    +// Before C++17: use string_view lite:
    +//
    +
    +// Compiler versions:
    +//
    +// MSVC++  6.0  _MSC_VER == 1200  nssv_COMPILER_MSVC_VERSION ==  60  (Visual Studio 6.0)
    +// MSVC++  7.0  _MSC_VER == 1300  nssv_COMPILER_MSVC_VERSION ==  70  (Visual Studio .NET 2002)
    +// MSVC++  7.1  _MSC_VER == 1310  nssv_COMPILER_MSVC_VERSION ==  71  (Visual Studio .NET 2003)
    +// MSVC++  8.0  _MSC_VER == 1400  nssv_COMPILER_MSVC_VERSION ==  80  (Visual Studio 2005)
    +// MSVC++  9.0  _MSC_VER == 1500  nssv_COMPILER_MSVC_VERSION ==  90  (Visual Studio 2008)
    +// MSVC++ 10.0  _MSC_VER == 1600  nssv_COMPILER_MSVC_VERSION == 100  (Visual Studio 2010)
    +// MSVC++ 11.0  _MSC_VER == 1700  nssv_COMPILER_MSVC_VERSION == 110  (Visual Studio 2012)
    +// MSVC++ 12.0  _MSC_VER == 1800  nssv_COMPILER_MSVC_VERSION == 120  (Visual Studio 2013)
    +// MSVC++ 14.0  _MSC_VER == 1900  nssv_COMPILER_MSVC_VERSION == 140  (Visual Studio 2015)
    +// MSVC++ 14.1  _MSC_VER >= 1910  nssv_COMPILER_MSVC_VERSION == 141  (Visual Studio 2017)
    +// MSVC++ 14.2  _MSC_VER >= 1920  nssv_COMPILER_MSVC_VERSION == 142  (Visual Studio 2019)
    +
    +#if defined(_MSC_VER ) && !defined(__clang__)
    +# define nssv_COMPILER_MSVC_VER      (_MSC_VER )
    +# define nssv_COMPILER_MSVC_VERSION  (_MSC_VER / 10 - 10 * ( 5 + (_MSC_VER < 1900 ) ) )
    +#else
    +# define nssv_COMPILER_MSVC_VER      0
    +# define nssv_COMPILER_MSVC_VERSION  0
    +#endif
    +
    +#define nssv_COMPILER_VERSION( major, minor, patch )  ( 10 * ( 10 * (major) + (minor) ) + (patch) )
    +
    +#if defined( __apple_build_version__ )
    +# define nssv_COMPILER_APPLECLANG_VERSION  nssv_COMPILER_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__)
    +# define nssv_COMPILER_CLANG_VERSION       0
    +#elif defined( __clang__ )
    +# define nssv_COMPILER_APPLECLANG_VERSION  0
    +# define nssv_COMPILER_CLANG_VERSION       nssv_COMPILER_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__)
    +#else
    +# define nssv_COMPILER_APPLECLANG_VERSION  0
    +# define nssv_COMPILER_CLANG_VERSION       0
    +#endif
    +
    +#if defined(__GNUC__) && !defined(__clang__)
    +# define nssv_COMPILER_GNUC_VERSION  nssv_COMPILER_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
    +#else
    +# define nssv_COMPILER_GNUC_VERSION  0
    +#endif
    +
    +// half-open range [lo..hi):
    +#define nssv_BETWEEN( v, lo, hi ) ( (lo) <= (v) && (v) < (hi) )
    +
    +// Presence of language and library features:
    +
    +#ifdef _HAS_CPP0X
    +# define nssv_HAS_CPP0X  _HAS_CPP0X
    +#else
    +# define nssv_HAS_CPP0X  0
    +#endif
    +
    +// Unless defined otherwise below, consider VC14 as C++11 for variant-lite:
    +
    +#if nssv_COMPILER_MSVC_VER >= 1900
    +# undef  nssv_CPP11_OR_GREATER
    +# define nssv_CPP11_OR_GREATER  1
    +#endif
    +
    +#define nssv_CPP11_90   (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1500)
    +#define nssv_CPP11_100  (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1600)
    +#define nssv_CPP11_110  (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1700)
    +#define nssv_CPP11_120  (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1800)
    +#define nssv_CPP11_140  (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1900)
    +#define nssv_CPP11_141  (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1910)
    +
    +#define nssv_CPP14_000  (nssv_CPP14_OR_GREATER)
    +#define nssv_CPP17_000  (nssv_CPP17_OR_GREATER)
    +
    +// Presence of C++11 language features:
    +
    +#define nssv_HAVE_CONSTEXPR_11          nssv_CPP11_140
    +#define nssv_HAVE_EXPLICIT_CONVERSION   nssv_CPP11_140
    +#define nssv_HAVE_INLINE_NAMESPACE      nssv_CPP11_140
    +#define nssv_HAVE_IS_DEFAULT            nssv_CPP11_140
    +#define nssv_HAVE_IS_DELETE             nssv_CPP11_140
    +#define nssv_HAVE_NOEXCEPT              nssv_CPP11_140
    +#define nssv_HAVE_NULLPTR               nssv_CPP11_100
    +#define nssv_HAVE_REF_QUALIFIER         nssv_CPP11_140
    +#define nssv_HAVE_UNICODE_LITERALS      nssv_CPP11_140
    +#define nssv_HAVE_USER_DEFINED_LITERALS nssv_CPP11_140
    +#define nssv_HAVE_WCHAR16_T             nssv_CPP11_100
    +#define nssv_HAVE_WCHAR32_T             nssv_CPP11_100
    +
    +#if ! ( ( nssv_CPP11_OR_GREATER && nssv_COMPILER_CLANG_VERSION ) || nssv_BETWEEN( nssv_COMPILER_CLANG_VERSION, 300, 400 ) )
    +# define nssv_HAVE_STD_DEFINED_LITERALS  nssv_CPP11_140
    +#else
    +# define nssv_HAVE_STD_DEFINED_LITERALS  0
    +#endif
    +
    +// Presence of C++14 language features:
    +
    +#define nssv_HAVE_CONSTEXPR_14          nssv_CPP14_000
    +
    +// Presence of C++17 language features:
    +
    +#define nssv_HAVE_NODISCARD             nssv_CPP17_000
    +
    +// Presence of C++ library features:
    +
    +#define nssv_HAVE_STD_HASH              nssv_CPP11_120
    +
    +// Presence of compiler intrinsics:
    +
    +// Providing char-type specializations for compare() and length() that
    +// use compiler intrinsics can improve compile- and run-time performance.
    +//
    +// The challenge is in using the right combinations of builtin availability
    +// and its constexpr-ness.
    +//
    +// | compiler | __builtin_memcmp (constexpr) | memcmp  (constexpr) |
    +// |----------|------------------------------|---------------------|
    +// | clang    | 4.0              (>= 4.0   ) | any     (?        ) |
    +// | clang-a  | 9.0              (>= 9.0   ) | any     (?        ) |
    +// | gcc      | any              (constexpr) | any     (?        ) |
    +// | msvc     | >= 14.2 C++17    (>= 14.2  ) | any     (?        ) |
    +
    +#define nssv_HAVE_BUILTIN_VER     ( (nssv_CPP17_000 && nssv_COMPILER_MSVC_VERSION >= 142) || nssv_COMPILER_GNUC_VERSION > 0 || nssv_COMPILER_CLANG_VERSION >= 400 || nssv_COMPILER_APPLECLANG_VERSION >= 900 )
    +#define nssv_HAVE_BUILTIN_CE      (  nssv_HAVE_BUILTIN_VER )
    +
    +#define nssv_HAVE_BUILTIN_MEMCMP  ( (nssv_HAVE_CONSTEXPR_14 && nssv_HAVE_BUILTIN_CE) || !nssv_HAVE_CONSTEXPR_14 )
    +#define nssv_HAVE_BUILTIN_STRLEN  ( (nssv_HAVE_CONSTEXPR_11 && nssv_HAVE_BUILTIN_CE) || !nssv_HAVE_CONSTEXPR_11 )
    +
    +#ifdef __has_builtin
    +# define nssv_HAVE_BUILTIN( x )  __has_builtin( x )
    +#else
    +# define nssv_HAVE_BUILTIN( x )  0
    +#endif
    +
    +#if nssv_HAVE_BUILTIN(__builtin_memcmp) || nssv_HAVE_BUILTIN_VER
    +# define nssv_BUILTIN_MEMCMP  __builtin_memcmp
    +#else
    +# define nssv_BUILTIN_MEMCMP  memcmp
    +#endif
    +
    +#if nssv_HAVE_BUILTIN(__builtin_strlen) || nssv_HAVE_BUILTIN_VER
    +# define nssv_BUILTIN_STRLEN  __builtin_strlen
    +#else
    +# define nssv_BUILTIN_STRLEN  strlen
    +#endif
    +
    +// C++ feature usage:
    +
    +#if nssv_HAVE_CONSTEXPR_11
    +# define nssv_constexpr  constexpr
    +#else
    +# define nssv_constexpr  /*constexpr*/
    +#endif
    +
    +#if  nssv_HAVE_CONSTEXPR_14
    +# define nssv_constexpr14  constexpr
    +#else
    +# define nssv_constexpr14  /*constexpr*/
    +#endif
    +
    +#if nssv_HAVE_EXPLICIT_CONVERSION
    +# define nssv_explicit  explicit
    +#else
    +# define nssv_explicit  /*explicit*/
    +#endif
    +
    +#if nssv_HAVE_INLINE_NAMESPACE
    +# define nssv_inline_ns  inline
    +#else
    +# define nssv_inline_ns  /*inline*/
    +#endif
    +
    +#if nssv_HAVE_NOEXCEPT
    +# define nssv_noexcept  noexcept
    +#else
    +# define nssv_noexcept  /*noexcept*/
    +#endif
    +
    +//#if nssv_HAVE_REF_QUALIFIER
    +//# define nssv_ref_qual  &
    +//# define nssv_refref_qual  &&
    +//#else
    +//# define nssv_ref_qual  /*&*/
    +//# define nssv_refref_qual  /*&&*/
    +//#endif
    +
    +#if nssv_HAVE_NULLPTR
    +# define nssv_nullptr  nullptr
    +#else
    +# define nssv_nullptr  NULL
    +#endif
    +
    +#if nssv_HAVE_NODISCARD
    +# define nssv_nodiscard  [[nodiscard]]
    +#else
    +# define nssv_nodiscard  /*[[nodiscard]]*/
    +#endif
    +
    +// Additional includes:
    +
    +#include 
    +#include 
    +#include 
    +#include 
    +#include    // std::char_traits<>
    +
    +#if ! nssv_CONFIG_NO_STREAM_INSERTION
    +# include 
    +#endif
    +
    +#if ! nssv_CONFIG_NO_EXCEPTIONS
    +# include 
    +#endif
    +
    +#if nssv_CPP11_OR_GREATER
    +# include 
    +#endif
    +
    +// Clang, GNUC, MSVC warning suppression macros:
    +
    +#if defined(__clang__)
    +# pragma clang diagnostic ignored "-Wreserved-user-defined-literal"
    +# pragma clang diagnostic push
    +# pragma clang diagnostic ignored "-Wuser-defined-literals"
    +#elif defined(__GNUC__)
    +# pragma  GCC  diagnostic push
    +# pragma  GCC  diagnostic ignored "-Wliteral-suffix"
    +#endif // __clang__
    +
    +#if nssv_COMPILER_MSVC_VERSION >= 140
    +# define nssv_SUPPRESS_MSGSL_WARNING(expr)        [[gsl::suppress(expr)]]
    +# define nssv_SUPPRESS_MSVC_WARNING(code, descr)  __pragma(warning(suppress: code) )
    +# define nssv_DISABLE_MSVC_WARNINGS(codes)        __pragma(warning(push))  __pragma(warning(disable: codes))
    +#else
    +# define nssv_SUPPRESS_MSGSL_WARNING(expr)
    +# define nssv_SUPPRESS_MSVC_WARNING(code, descr)
    +# define nssv_DISABLE_MSVC_WARNINGS(codes)
    +#endif
    +
    +#if defined(__clang__)
    +# define nssv_RESTORE_WARNINGS()  _Pragma("clang diagnostic pop")
    +#elif defined(__GNUC__)
    +# define nssv_RESTORE_WARNINGS()  _Pragma("GCC diagnostic pop")
    +#elif nssv_COMPILER_MSVC_VERSION >= 140
    +# define nssv_RESTORE_WARNINGS()  __pragma(warning(pop ))
    +#else
    +# define nssv_RESTORE_WARNINGS()
    +#endif
    +
    +// Suppress the following MSVC (GSL) warnings:
    +// - C4455, non-gsl   : 'operator ""sv': literal suffix identifiers that do not
    +//                      start with an underscore are reserved
    +// - C26472, gsl::t.1 : don't use a static_cast for arithmetic conversions;
    +//                      use brace initialization, gsl::narrow_cast or gsl::narow
    +// - C26481: gsl::b.1 : don't use pointer arithmetic. Use span instead
    +
    +nssv_DISABLE_MSVC_WARNINGS( 4455 26481 26472 )
    +//nssv_DISABLE_CLANG_WARNINGS( "-Wuser-defined-literals" )
    +//nssv_DISABLE_GNUC_WARNINGS( -Wliteral-suffix )
    +
    +namespace nonstd { namespace sv_lite {
    +
    +//
    +// basic_string_view declaration:
    +//
    +
    +template
    +<
    +    class CharT,
    +    class Traits = std::char_traits
    +>
    +class basic_string_view;
    +
    +namespace detail {
    +
    +// support constexpr comparison in C++14;
    +// for C++17 and later, use provided traits:
    +
    +template< typename CharT >
    +inline nssv_constexpr14 int compare( CharT const * s1, CharT const * s2, std::size_t count )
    +{
    +    while ( count-- != 0 )
    +    {
    +        if ( *s1 < *s2 ) return -1;
    +        if ( *s1 > *s2 ) return +1;
    +        ++s1; ++s2;
    +    }
    +    return 0;
    +}
    +
    +#if nssv_HAVE_BUILTIN_MEMCMP
    +
    +// specialization of compare() for char, see also generic compare() above:
    +
    +inline nssv_constexpr14 int compare( char const * s1, char const * s2, std::size_t count )
    +{
    +    return nssv_BUILTIN_MEMCMP( s1, s2, count );
    +}
    +
    +#endif
    +
    +#if nssv_HAVE_BUILTIN_STRLEN
    +
    +// specialization of length() for char, see also generic length() further below:
    +
    +inline nssv_constexpr std::size_t length( char const * s )
    +{
    +    return nssv_BUILTIN_STRLEN( s );
    +}
    +
    +#endif
    +
    +#if defined(__OPTIMIZE__)
    +
    +// gcc, clang provide __OPTIMIZE__
    +// Expect tail call optimization to make length() non-recursive:
    +
    +template< typename CharT >
    +inline nssv_constexpr std::size_t length( CharT * s, std::size_t result = 0 )
    +{
    +    return *s == '\0' ? result : length( s + 1, result + 1 );
    +}
    +
    +#else // OPTIMIZE
    +
    +// non-recursive:
    +
    +template< typename CharT >
    +inline nssv_constexpr14 std::size_t length( CharT * s )
    +{
    +    std::size_t result = 0;
    +    while ( *s++ != '\0' )
    +    {
    +       ++result;
    +    }
    +    return result;
    +}
    +
    +#endif // OPTIMIZE
    +
    +#if nssv_CPP11_OR_GREATER && ! nssv_CPP17_OR_GREATER
    +#if defined(__OPTIMIZE__)
    +
    +// gcc, clang provide __OPTIMIZE__
    +// Expect tail call optimization to make search() non-recursive:
    +
    +template< class CharT, class Traits = std::char_traits >
    +constexpr const CharT* search( basic_string_view haystack, basic_string_view needle )
    +{
    +    return haystack.starts_with( needle ) ? haystack.begin() :
    +        haystack.empty() ? haystack.end() : search( haystack.substr(1), needle );
    +}
    +
    +#else // OPTIMIZE
    +
    +// non-recursive:
    +
    +template< class CharT, class Traits = std::char_traits >
    +constexpr const CharT* search( basic_string_view haystack, basic_string_view needle )
    +{
    +    return std::search( haystack.begin(), haystack.end(), needle.begin(), needle.end() );
    +}
    +
    +#endif // OPTIMIZE
    +#endif // nssv_CPP11_OR_GREATER && ! nssv_CPP17_OR_GREATER
    +
    +} // namespace detail
    +
    +//
    +// basic_string_view:
    +//
    +
    +template
    +<
    +    class CharT,
    +    class Traits /* = std::char_traits */
    +>
    +class basic_string_view
    +{
    +public:
    +    // Member types:
    +
    +    typedef Traits traits_type;
    +    typedef CharT  value_type;
    +
    +    typedef CharT       * pointer;
    +    typedef CharT const * const_pointer;
    +    typedef CharT       & reference;
    +    typedef CharT const & const_reference;
    +
    +    typedef const_pointer iterator;
    +    typedef const_pointer const_iterator;
    +    typedef std::reverse_iterator< const_iterator > reverse_iterator;
    +    typedef std::reverse_iterator< const_iterator > const_reverse_iterator;
    +
    +    typedef std::size_t     size_type;
    +    typedef std::ptrdiff_t  difference_type;
    +
    +    // 24.4.2.1 Construction and assignment:
    +
    +    nssv_constexpr basic_string_view() nssv_noexcept
    +        : data_( nssv_nullptr )
    +        , size_( 0 )
    +    {}
    +
    +#if nssv_CPP11_OR_GREATER
    +    nssv_constexpr basic_string_view( basic_string_view const & other ) nssv_noexcept = default;
    +#else
    +    nssv_constexpr basic_string_view( basic_string_view const & other ) nssv_noexcept
    +        : data_( other.data_)
    +        , size_( other.size_)
    +    {}
    +#endif
    +
    +    nssv_constexpr basic_string_view( CharT const * s, size_type count ) nssv_noexcept // non-standard noexcept
    +        : data_( s )
    +        , size_( count )
    +    {}
    +
    +    nssv_constexpr basic_string_view( CharT const * s) nssv_noexcept // non-standard noexcept
    +        : data_( s )
    +#if nssv_CPP17_OR_GREATER
    +        , size_( Traits::length(s) )
    +#elif nssv_CPP11_OR_GREATER
    +        , size_( detail::length(s) )
    +#else
    +        , size_( Traits::length(s) )
    +#endif
    +    {}
    +
    +#if  nssv_HAVE_NULLPTR
    +# if nssv_HAVE_IS_DELETE
    +    nssv_constexpr basic_string_view( std::nullptr_t ) nssv_noexcept = delete;
    +# else
    +    private: nssv_constexpr basic_string_view( std::nullptr_t ) nssv_noexcept; public:
    +# endif
    +#endif
    +
    +    // Assignment:
    +
    +#if nssv_CPP11_OR_GREATER
    +    nssv_constexpr14 basic_string_view & operator=( basic_string_view const & other ) nssv_noexcept = default;
    +#else
    +    nssv_constexpr14 basic_string_view & operator=( basic_string_view const & other ) nssv_noexcept
    +    {
    +        data_ = other.data_;
    +        size_ = other.size_;
    +        return *this;
    +    }
    +#endif
    +
    +    // 24.4.2.2 Iterator support:
    +
    +    nssv_constexpr const_iterator begin()  const nssv_noexcept { return data_;         }
    +    nssv_constexpr const_iterator end()    const nssv_noexcept { return data_ + size_; }
    +
    +    nssv_constexpr const_iterator cbegin() const nssv_noexcept { return begin(); }
    +    nssv_constexpr const_iterator cend()   const nssv_noexcept { return end();   }
    +
    +    nssv_constexpr const_reverse_iterator rbegin()  const nssv_noexcept { return const_reverse_iterator( end() );   }
    +    nssv_constexpr const_reverse_iterator rend()    const nssv_noexcept { return const_reverse_iterator( begin() ); }
    +
    +    nssv_constexpr const_reverse_iterator crbegin() const nssv_noexcept { return rbegin(); }
    +    nssv_constexpr const_reverse_iterator crend()   const nssv_noexcept { return rend();   }
    +
    +    // 24.4.2.3 Capacity:
    +
    +    nssv_constexpr size_type size()     const nssv_noexcept { return size_; }
    +    nssv_constexpr size_type length()   const nssv_noexcept { return size_; }
    +    nssv_constexpr size_type max_size() const nssv_noexcept { return (std::numeric_limits< size_type >::max)(); }
    +
    +    // since C++20
    +    nssv_nodiscard nssv_constexpr bool empty() const nssv_noexcept
    +    {
    +        return 0 == size_;
    +    }
    +
    +    // 24.4.2.4 Element access:
    +
    +    nssv_constexpr const_reference operator[]( size_type pos ) const
    +    {
    +        return data_at( pos );
    +    }
    +
    +    nssv_constexpr14 const_reference at( size_type pos ) const
    +    {
    +#if nssv_CONFIG_NO_EXCEPTIONS
    +        assert( pos < size() );
    +#else
    +        if ( pos >= size() )
    +        {
    +            throw std::out_of_range("nonstd::string_view::at()");
    +        }
    +#endif
    +        return data_at( pos );
    +    }
    +
    +    nssv_constexpr const_reference front() const { return data_at( 0 );          }
    +    nssv_constexpr const_reference back()  const { return data_at( size() - 1 ); }
    +
    +    nssv_constexpr const_pointer   data()  const nssv_noexcept { return data_; }
    +
    +    // 24.4.2.5 Modifiers:
    +
    +    nssv_constexpr14 void remove_prefix( size_type n )
    +    {
    +        assert( n <= size() );
    +        data_ += n;
    +        size_ -= n;
    +    }
    +
    +    nssv_constexpr14 void remove_suffix( size_type n )
    +    {
    +        assert( n <= size() );
    +        size_ -= n;
    +    }
    +
    +    nssv_constexpr14 void swap( basic_string_view & other ) nssv_noexcept
    +    {
    +        const basic_string_view tmp(other);
    +        other = *this;
    +        *this = tmp;
    +    }
    +
    +    // 24.4.2.6 String operations:
    +
    +    size_type copy( CharT * dest, size_type n, size_type pos = 0 ) const
    +    {
    +#if nssv_CONFIG_NO_EXCEPTIONS
    +        assert( pos <= size() );
    +#else
    +        if ( pos > size() )
    +        {
    +            throw std::out_of_range("nonstd::string_view::copy()");
    +        }
    +#endif
    +        const size_type rlen = (std::min)( n, size() - pos );
    +
    +        (void) Traits::copy( dest, data() + pos, rlen );
    +
    +        return rlen;
    +    }
    +
    +    nssv_constexpr14 basic_string_view substr( size_type pos = 0, size_type n = npos ) const
    +    {
    +#if nssv_CONFIG_NO_EXCEPTIONS
    +        assert( pos <= size() );
    +#else
    +        if ( pos > size() )
    +        {
    +            throw std::out_of_range("nonstd::string_view::substr()");
    +        }
    +#endif
    +        return basic_string_view( data() + pos, (std::min)( n, size() - pos ) );
    +    }
    +
    +    // compare(), 6x:
    +
    +    nssv_constexpr14 int compare( basic_string_view other ) const nssv_noexcept // (1)
    +    {
    +#if nssv_CPP17_OR_GREATER
    +        if ( const int result = Traits::compare( data(), other.data(), (std::min)( size(), other.size() ) ) )
    +#else
    +        if ( const int result = detail::compare( data(), other.data(), (std::min)( size(), other.size() ) ) )
    +#endif
    +        {
    +            return result;
    +        }
    +
    +        return size() == other.size() ? 0 : size() < other.size() ? -1 : 1;
    +    }
    +
    +    nssv_constexpr int compare( size_type pos1, size_type n1, basic_string_view other ) const // (2)
    +    {
    +        return substr( pos1, n1 ).compare( other );
    +    }
    +
    +    nssv_constexpr int compare( size_type pos1, size_type n1, basic_string_view other, size_type pos2, size_type n2 ) const // (3)
    +    {
    +        return substr( pos1, n1 ).compare( other.substr( pos2, n2 ) );
    +    }
    +
    +    nssv_constexpr int compare( CharT const * s ) const // (4)
    +    {
    +        return compare( basic_string_view( s ) );
    +    }
    +
    +    nssv_constexpr int compare( size_type pos1, size_type n1, CharT const * s ) const // (5)
    +    {
    +        return substr( pos1, n1 ).compare( basic_string_view( s ) );
    +    }
    +
    +    nssv_constexpr int compare( size_type pos1, size_type n1, CharT const * s, size_type n2 ) const // (6)
    +    {
    +        return substr( pos1, n1 ).compare( basic_string_view( s, n2 ) );
    +    }
    +
    +    // 24.4.2.7 Searching:
    +
    +    // starts_with(), 3x, since C++20:
    +
    +    nssv_constexpr bool starts_with( basic_string_view v ) const nssv_noexcept  // (1)
    +    {
    +        return size() >= v.size() && compare( 0, v.size(), v ) == 0;
    +    }
    +
    +    nssv_constexpr bool starts_with( CharT c ) const nssv_noexcept  // (2)
    +    {
    +        return starts_with( basic_string_view( &c, 1 ) );
    +    }
    +
    +    nssv_constexpr bool starts_with( CharT const * s ) const  // (3)
    +    {
    +        return starts_with( basic_string_view( s ) );
    +    }
    +
    +    // ends_with(), 3x, since C++20:
    +
    +    nssv_constexpr bool ends_with( basic_string_view v ) const nssv_noexcept  // (1)
    +    {
    +        return size() >= v.size() && compare( size() - v.size(), npos, v ) == 0;
    +    }
    +
    +    nssv_constexpr bool ends_with( CharT c ) const nssv_noexcept  // (2)
    +    {
    +        return ends_with( basic_string_view( &c, 1 ) );
    +    }
    +
    +    nssv_constexpr bool ends_with( CharT const * s ) const  // (3)
    +    {
    +        return ends_with( basic_string_view( s ) );
    +    }
    +
    +    // find(), 4x:
    +
    +    nssv_constexpr size_type find( basic_string_view v, size_type pos = 0 ) const nssv_noexcept  // (1)
    +    {
    +        return assert( v.size() == 0 || v.data() != nssv_nullptr )
    +            , pos >= size()
    +            ? npos : to_pos(
    +#if nssv_CPP11_OR_GREATER && ! nssv_CPP17_OR_GREATER
    +                detail::search( substr(pos), v )
    +#else
    +                std::search( cbegin() + pos, cend(), v.cbegin(), v.cend(), Traits::eq )
    +#endif
    +            );
    +    }
    +
    +    nssv_constexpr size_type find( CharT c, size_type pos = 0 ) const nssv_noexcept  // (2)
    +    {
    +        return find( basic_string_view( &c, 1 ), pos );
    +    }
    +
    +    nssv_constexpr size_type find( CharT const * s, size_type pos, size_type n ) const  // (3)
    +    {
    +        return find( basic_string_view( s, n ), pos );
    +    }
    +
    +    nssv_constexpr size_type find( CharT const * s, size_type pos = 0 ) const  // (4)
    +    {
    +        return find( basic_string_view( s ), pos );
    +    }
    +
    +    // rfind(), 4x:
    +
    +    nssv_constexpr14 size_type rfind( basic_string_view v, size_type pos = npos ) const nssv_noexcept  // (1)
    +    {
    +        if ( size() < v.size() )
    +        {
    +            return npos;
    +        }
    +
    +        if ( v.empty() )
    +        {
    +            return (std::min)( size(), pos );
    +        }
    +
    +        const_iterator last   = cbegin() + (std::min)( size() - v.size(), pos ) + v.size();
    +        const_iterator result = std::find_end( cbegin(), last, v.cbegin(), v.cend(), Traits::eq );
    +
    +        return result != last ? size_type( result - cbegin() ) : npos;
    +    }
    +
    +    nssv_constexpr14 size_type rfind( CharT c, size_type pos = npos ) const nssv_noexcept  // (2)
    +    {
    +        return rfind( basic_string_view( &c, 1 ), pos );
    +    }
    +
    +    nssv_constexpr14 size_type rfind( CharT const * s, size_type pos, size_type n ) const  // (3)
    +    {
    +        return rfind( basic_string_view( s, n ), pos );
    +    }
    +
    +    nssv_constexpr14 size_type rfind( CharT const * s, size_type pos = npos ) const  // (4)
    +    {
    +        return rfind( basic_string_view( s ), pos );
    +    }
    +
    +    // find_first_of(), 4x:
    +
    +    nssv_constexpr size_type find_first_of( basic_string_view v, size_type pos = 0 ) const nssv_noexcept  // (1)
    +    {
    +        return pos >= size()
    +            ? npos
    +            : to_pos( std::find_first_of( cbegin() + pos, cend(), v.cbegin(), v.cend(), Traits::eq ) );
    +    }
    +
    +    nssv_constexpr size_type find_first_of( CharT c, size_type pos = 0 ) const nssv_noexcept  // (2)
    +    {
    +        return find_first_of( basic_string_view( &c, 1 ), pos );
    +    }
    +
    +    nssv_constexpr size_type find_first_of( CharT const * s, size_type pos, size_type n ) const  // (3)
    +    {
    +        return find_first_of( basic_string_view( s, n ), pos );
    +    }
    +
    +    nssv_constexpr size_type find_first_of(  CharT const * s, size_type pos = 0 ) const  // (4)
    +    {
    +        return find_first_of( basic_string_view( s ), pos );
    +    }
    +
    +    // find_last_of(), 4x:
    +
    +    nssv_constexpr size_type find_last_of( basic_string_view v, size_type pos = npos ) const nssv_noexcept  // (1)
    +    {
    +        return empty()
    +            ? npos
    +            : pos >= size()
    +            ? find_last_of( v, size() - 1 )
    +            : to_pos( std::find_first_of( const_reverse_iterator( cbegin() + pos + 1 ), crend(), v.cbegin(), v.cend(), Traits::eq ) );
    +    }
    +
    +    nssv_constexpr size_type find_last_of( CharT c, size_type pos = npos ) const nssv_noexcept  // (2)
    +    {
    +        return find_last_of( basic_string_view( &c, 1 ), pos );
    +    }
    +
    +    nssv_constexpr size_type find_last_of( CharT const * s, size_type pos, size_type count ) const  // (3)
    +    {
    +        return find_last_of( basic_string_view( s, count ), pos );
    +    }
    +
    +    nssv_constexpr size_type find_last_of( CharT const * s, size_type pos = npos ) const  // (4)
    +    {
    +        return find_last_of( basic_string_view( s ), pos );
    +    }
    +
    +    // find_first_not_of(), 4x:
    +
    +    nssv_constexpr size_type find_first_not_of( basic_string_view v, size_type pos = 0 ) const nssv_noexcept  // (1)
    +    {
    +        return pos >= size()
    +            ? npos
    +            : to_pos( std::find_if( cbegin() + pos, cend(), not_in_view( v ) ) );
    +    }
    +
    +    nssv_constexpr size_type find_first_not_of( CharT c, size_type pos = 0 ) const nssv_noexcept  // (2)
    +    {
    +        return find_first_not_of( basic_string_view( &c, 1 ), pos );
    +    }
    +
    +    nssv_constexpr size_type find_first_not_of( CharT const * s, size_type pos, size_type count ) const  // (3)
    +    {
    +        return find_first_not_of( basic_string_view( s, count ), pos );
    +    }
    +
    +    nssv_constexpr size_type find_first_not_of( CharT const * s, size_type pos = 0 ) const  // (4)
    +    {
    +        return find_first_not_of( basic_string_view( s ), pos );
    +    }
    +
    +    // find_last_not_of(), 4x:
    +
    +    nssv_constexpr size_type find_last_not_of( basic_string_view v, size_type pos = npos ) const nssv_noexcept  // (1)
    +    {
    +        return empty()
    +            ? npos
    +            : pos >= size()
    +            ? find_last_not_of( v, size() - 1 )
    +            : to_pos( std::find_if( const_reverse_iterator( cbegin() + pos + 1 ), crend(), not_in_view( v ) ) );
    +    }
    +
    +    nssv_constexpr size_type find_last_not_of( CharT c, size_type pos = npos ) const nssv_noexcept  // (2)
    +    {
    +        return find_last_not_of( basic_string_view( &c, 1 ), pos );
    +    }
    +
    +    nssv_constexpr size_type find_last_not_of( CharT const * s, size_type pos, size_type count ) const  // (3)
    +    {
    +        return find_last_not_of( basic_string_view( s, count ), pos );
    +    }
    +
    +    nssv_constexpr size_type find_last_not_of( CharT const * s, size_type pos = npos ) const  // (4)
    +    {
    +        return find_last_not_of( basic_string_view( s ), pos );
    +    }
    +
    +    // Constants:
    +
    +#if nssv_CPP17_OR_GREATER
    +    static nssv_constexpr size_type npos = size_type(-1);
    +#elif nssv_CPP11_OR_GREATER
    +    enum : size_type { npos = size_type(-1) };
    +#else
    +    enum { npos = size_type(-1) };
    +#endif
    +
    +private:
    +    struct not_in_view
    +    {
    +        const basic_string_view v;
    +
    +        nssv_constexpr explicit not_in_view( basic_string_view v_ ) : v( v_ ) {}
    +
    +        nssv_constexpr bool operator()( CharT c ) const
    +        {
    +            return npos == v.find_first_of( c );
    +        }
    +    };
    +
    +    nssv_constexpr size_type to_pos( const_iterator it ) const
    +    {
    +        return it == cend() ? npos : size_type( it - cbegin() );
    +    }
    +
    +    nssv_constexpr size_type to_pos( const_reverse_iterator it ) const
    +    {
    +        return it == crend() ? npos : size_type( crend() - it - 1 );
    +    }
    +
    +    nssv_constexpr const_reference data_at( size_type pos ) const
    +    {
    +#if nssv_BETWEEN( nssv_COMPILER_GNUC_VERSION, 1, 500 )
    +        return data_[pos];
    +#else
    +        return assert( pos < size() ), data_[pos];
    +#endif
    +    }
    +
    +private:
    +    const_pointer data_;
    +    size_type     size_;
    +
    +public:
    +#if nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS
    +
    +    template< class Allocator >
    +    basic_string_view( std::basic_string const & s ) nssv_noexcept
    +        : data_( s.data() )
    +        , size_( s.size() )
    +    {}
    +
    +#if nssv_HAVE_EXPLICIT_CONVERSION
    +
    +    template< class Allocator >
    +    explicit operator std::basic_string() const
    +    {
    +        return to_string( Allocator() );
    +    }
    +
    +#endif // nssv_HAVE_EXPLICIT_CONVERSION
    +
    +#if nssv_CPP11_OR_GREATER
    +
    +    template< class Allocator = std::allocator >
    +    std::basic_string
    +    to_string( Allocator const & a = Allocator() ) const
    +    {
    +        return std::basic_string( begin(), end(), a );
    +    }
    +
    +#else
    +
    +    std::basic_string
    +    to_string() const
    +    {
    +        return std::basic_string( begin(), end() );
    +    }
    +
    +    template< class Allocator >
    +    std::basic_string
    +    to_string( Allocator const & a ) const
    +    {
    +        return std::basic_string( begin(), end(), a );
    +    }
    +
    +#endif // nssv_CPP11_OR_GREATER
    +
    +#endif // nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS
    +};
    +
    +//
    +// Non-member functions:
    +//
    +
    +// 24.4.3 Non-member comparison functions:
    +// lexicographically compare two string views (function template):
    +
    +template< class CharT, class Traits >
    +nssv_constexpr bool operator== (
    +    basic_string_view  lhs,
    +    basic_string_view  rhs ) nssv_noexcept
    +{ return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; }
    +
    +template< class CharT, class Traits >
    +nssv_constexpr bool operator!= (
    +    basic_string_view  lhs,
    +    basic_string_view  rhs ) nssv_noexcept
    +{ return !( lhs == rhs ); }
    +
    +template< class CharT, class Traits >
    +nssv_constexpr bool operator< (
    +    basic_string_view  lhs,
    +    basic_string_view  rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) < 0; }
    +
    +template< class CharT, class Traits >
    +nssv_constexpr bool operator<= (
    +    basic_string_view  lhs,
    +    basic_string_view  rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) <= 0; }
    +
    +template< class CharT, class Traits >
    +nssv_constexpr bool operator> (
    +    basic_string_view  lhs,
    +    basic_string_view  rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) > 0; }
    +
    +template< class CharT, class Traits >
    +nssv_constexpr bool operator>= (
    +    basic_string_view  lhs,
    +    basic_string_view  rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) >= 0; }
    +
    +// Let S be basic_string_view, and sv be an instance of S.
    +// Implementations shall provide sufficient additional overloads marked
    +// constexpr and noexcept so that an object t with an implicit conversion
    +// to S can be compared according to Table 67.
    +
    +#if ! nssv_CPP11_OR_GREATER || nssv_BETWEEN( nssv_COMPILER_MSVC_VERSION, 100, 141 )
    +
    +// accommodate for older compilers:
    +
    +// ==
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator==(
    +    basic_string_view lhs,
    +    CharT const * rhs ) nssv_noexcept
    +{ return lhs.size() == detail::length( rhs ) && lhs.compare( rhs ) == 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator==(
    +    CharT const * lhs,
    +    basic_string_view rhs ) nssv_noexcept
    +{ return detail::length( lhs ) == rhs.size() && rhs.compare( lhs ) == 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator==(
    +    basic_string_view lhs,
    +    std::basic_string rhs ) nssv_noexcept
    +{ return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator==(
    +    std::basic_string rhs,
    +    basic_string_view lhs ) nssv_noexcept
    +{ return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; }
    +
    +// !=
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator!=(
    +    basic_string_view lhs,
    +    CharT const * rhs ) nssv_noexcept
    +{ return !( lhs == rhs ); }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator!=(
    +    CharT const * lhs,
    +    basic_string_view rhs ) nssv_noexcept
    +{ return !( lhs == rhs ); }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator!=(
    +    basic_string_view lhs,
    +    std::basic_string rhs ) nssv_noexcept
    +{ return !( lhs == rhs ); }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator!=(
    +    std::basic_string rhs,
    +    basic_string_view lhs ) nssv_noexcept
    +{ return !( lhs == rhs ); }
    +
    +// <
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator<(
    +    basic_string_view lhs,
    +    CharT const * rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) < 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator<(
    +    CharT const * lhs,
    +    basic_string_view rhs ) nssv_noexcept
    +{ return rhs.compare( lhs ) > 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator<(
    +    basic_string_view lhs,
    +    std::basic_string rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) < 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator<(
    +    std::basic_string rhs,
    +    basic_string_view lhs ) nssv_noexcept
    +{ return rhs.compare( lhs ) > 0; }
    +
    +// <=
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator<=(
    +    basic_string_view lhs,
    +    CharT const * rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) <= 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator<=(
    +    CharT const * lhs,
    +    basic_string_view rhs ) nssv_noexcept
    +{ return rhs.compare( lhs ) >= 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator<=(
    +    basic_string_view lhs,
    +    std::basic_string rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) <= 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator<=(
    +    std::basic_string rhs,
    +    basic_string_view lhs ) nssv_noexcept
    +{ return rhs.compare( lhs ) >= 0; }
    +
    +// >
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator>(
    +    basic_string_view lhs,
    +    CharT const * rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) > 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator>(
    +    CharT const * lhs,
    +    basic_string_view rhs ) nssv_noexcept
    +{ return rhs.compare( lhs ) < 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator>(
    +    basic_string_view lhs,
    +    std::basic_string rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) > 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator>(
    +    std::basic_string rhs,
    +    basic_string_view lhs ) nssv_noexcept
    +{ return rhs.compare( lhs ) < 0; }
    +
    +// >=
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator>=(
    +    basic_string_view lhs,
    +    CharT const * rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) >= 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator>=(
    +    CharT const * lhs,
    +    basic_string_view rhs ) nssv_noexcept
    +{ return rhs.compare( lhs ) <= 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator>=(
    +    basic_string_view lhs,
    +    std::basic_string rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) >= 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator>=(
    +    std::basic_string rhs,
    +    basic_string_view lhs ) nssv_noexcept
    +{ return rhs.compare( lhs ) <= 0; }
    +
    +#else // newer compilers:
    +
    +#define nssv_BASIC_STRING_VIEW_I(T,U)  typename std::decay< basic_string_view >::type
    +
    +#if defined(_MSC_VER)       // issue 40
    +# define nssv_MSVC_ORDER(x)  , int=x
    +#else
    +# define nssv_MSVC_ORDER(x)  /*, int=x*/
    +#endif
    +
    +// ==
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(1) >
    +nssv_constexpr bool operator==(
    +         basic_string_view   lhs,
    +    nssv_BASIC_STRING_VIEW_I(CharT, Traits) rhs ) nssv_noexcept
    +{ return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; }
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(2) >
    +nssv_constexpr bool operator==(
    +    nssv_BASIC_STRING_VIEW_I(CharT, Traits) lhs,
    +         basic_string_view   rhs ) nssv_noexcept
    +{ return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; }
    +
    +// !=
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(1) >
    +nssv_constexpr bool operator!= (
    +         basic_string_view  < CharT, Traits > lhs,
    +    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
    +{ return !( lhs == rhs ); }
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(2) >
    +nssv_constexpr bool operator!= (
    +    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
    +         basic_string_view  < CharT, Traits > rhs ) nssv_noexcept
    +{ return !( lhs == rhs ); }
    +
    +// <
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(1) >
    +nssv_constexpr bool operator< (
    +         basic_string_view  < CharT, Traits > lhs,
    +    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) < 0; }
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(2) >
    +nssv_constexpr bool operator< (
    +    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
    +         basic_string_view  < CharT, Traits > rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) < 0; }
    +
    +// <=
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(1) >
    +nssv_constexpr bool operator<= (
    +         basic_string_view  < CharT, Traits > lhs,
    +    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) <= 0; }
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(2) >
    +nssv_constexpr bool operator<= (
    +    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
    +         basic_string_view  < CharT, Traits > rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) <= 0; }
    +
    +// >
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(1) >
    +nssv_constexpr bool operator> (
    +         basic_string_view  < CharT, Traits > lhs,
    +    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) > 0; }
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(2) >
    +nssv_constexpr bool operator> (
    +    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
    +         basic_string_view  < CharT, Traits > rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) > 0; }
    +
    +// >=
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(1) >
    +nssv_constexpr bool operator>= (
    +         basic_string_view  < CharT, Traits > lhs,
    +    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) >= 0; }
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(2) >
    +nssv_constexpr bool operator>= (
    +    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
    +         basic_string_view  < CharT, Traits > rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) >= 0; }
    +
    +#undef nssv_MSVC_ORDER
    +#undef nssv_BASIC_STRING_VIEW_I
    +
    +#endif // compiler-dependent approach to comparisons
    +
    +// 24.4.4 Inserters and extractors:
    +
    +#if ! nssv_CONFIG_NO_STREAM_INSERTION
    +
    +namespace detail {
    +
    +template< class Stream >
    +void write_padding( Stream & os, std::streamsize n )
    +{
    +    for ( std::streamsize i = 0; i < n; ++i )
    +        os.rdbuf()->sputc( os.fill() );
    +}
    +
    +template< class Stream, class View >
    +Stream & write_to_stream( Stream & os, View const & sv )
    +{
    +    typename Stream::sentry sentry( os );
    +
    +    if ( !sentry )
    +        return os;
    +
    +    const std::streamsize length = static_cast( sv.length() );
    +
    +    // Whether, and how, to pad:
    +    const bool      pad = ( length < os.width() );
    +    const bool left_pad = pad && ( os.flags() & std::ios_base::adjustfield ) == std::ios_base::right;
    +
    +    if ( left_pad )
    +        write_padding( os, os.width() - length );
    +
    +    // Write span characters:
    +    os.rdbuf()->sputn( sv.begin(), length );
    +
    +    if ( pad && !left_pad )
    +        write_padding( os, os.width() - length );
    +
    +    // Reset output stream width:
    +    os.width( 0 );
    +
    +    return os;
    +}
    +
    +} // namespace detail
    +
    +template< class CharT, class Traits >
    +std::basic_ostream &
    +operator<<(
    +    std::basic_ostream& os,
    +    basic_string_view  sv )
    +{
    +    return detail::write_to_stream( os, sv );
    +}
    +
    +#endif // nssv_CONFIG_NO_STREAM_INSERTION
    +
    +// Several typedefs for common character types are provided:
    +
    +typedef basic_string_view      string_view;
    +typedef basic_string_view   wstring_view;
    +#if nssv_HAVE_WCHAR16_T
    +typedef basic_string_view  u16string_view;
    +typedef basic_string_view  u32string_view;
    +#endif
    +
    +}} // namespace nonstd::sv_lite
    +
    +//
    +// 24.4.6 Suffix for basic_string_view literals:
    +//
    +
    +#if nssv_HAVE_USER_DEFINED_LITERALS
    +
    +namespace nonstd {
    +nssv_inline_ns namespace literals {
    +nssv_inline_ns namespace string_view_literals {
    +
    +#if nssv_CONFIG_STD_SV_OPERATOR && nssv_HAVE_STD_DEFINED_LITERALS
    +
    +nssv_constexpr nonstd::sv_lite::string_view operator "" sv( const char* str, size_t len ) nssv_noexcept  // (1)
    +{
    +    return nonstd::sv_lite::string_view{ str, len };
    +}
    +
    +nssv_constexpr nonstd::sv_lite::u16string_view operator "" sv( const char16_t* str, size_t len ) nssv_noexcept  // (2)
    +{
    +    return nonstd::sv_lite::u16string_view{ str, len };
    +}
    +
    +nssv_constexpr nonstd::sv_lite::u32string_view operator "" sv( const char32_t* str, size_t len ) nssv_noexcept  // (3)
    +{
    +    return nonstd::sv_lite::u32string_view{ str, len };
    +}
    +
    +nssv_constexpr nonstd::sv_lite::wstring_view operator "" sv( const wchar_t* str, size_t len ) nssv_noexcept  // (4)
    +{
    +    return nonstd::sv_lite::wstring_view{ str, len };
    +}
    +
    +#endif // nssv_CONFIG_STD_SV_OPERATOR && nssv_HAVE_STD_DEFINED_LITERALS
    +
    +#if nssv_CONFIG_USR_SV_OPERATOR
    +
    +nssv_constexpr nonstd::sv_lite::string_view operator "" _sv( const char* str, size_t len ) nssv_noexcept  // (1)
    +{
    +    return nonstd::sv_lite::string_view{ str, len };
    +}
    +
    +nssv_constexpr nonstd::sv_lite::u16string_view operator "" _sv( const char16_t* str, size_t len ) nssv_noexcept  // (2)
    +{
    +    return nonstd::sv_lite::u16string_view{ str, len };
    +}
    +
    +nssv_constexpr nonstd::sv_lite::u32string_view operator "" _sv( const char32_t* str, size_t len ) nssv_noexcept  // (3)
    +{
    +    return nonstd::sv_lite::u32string_view{ str, len };
    +}
    +
    +nssv_constexpr nonstd::sv_lite::wstring_view operator "" _sv( const wchar_t* str, size_t len ) nssv_noexcept  // (4)
    +{
    +    return nonstd::sv_lite::wstring_view{ str, len };
    +}
    +
    +#endif // nssv_CONFIG_USR_SV_OPERATOR
    +
    +}}} // namespace nonstd::literals::string_view_literals
    +
    +#endif
    +
    +//
    +// Extensions for std::string:
    +//
    +
    +#if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
    +
    +namespace nonstd {
    +namespace sv_lite {
    +
    +// Exclude MSVC 14 (19.00): it yields ambiguous to_string():
    +
    +#if nssv_CPP11_OR_GREATER && nssv_COMPILER_MSVC_VERSION != 140
    +
    +template< class CharT, class Traits, class Allocator = std::allocator >
    +std::basic_string
    +to_string( basic_string_view v, Allocator const & a = Allocator() )
    +{
    +    return std::basic_string( v.begin(), v.end(), a );
    +}
    +
    +#else
    +
    +template< class CharT, class Traits >
    +std::basic_string
    +to_string( basic_string_view v )
    +{
    +    return std::basic_string( v.begin(), v.end() );
    +}
    +
    +template< class CharT, class Traits, class Allocator >
    +std::basic_string
    +to_string( basic_string_view v, Allocator const & a )
    +{
    +    return std::basic_string( v.begin(), v.end(), a );
    +}
    +
    +#endif // nssv_CPP11_OR_GREATER
    +
    +template< class CharT, class Traits, class Allocator >
    +basic_string_view
    +to_string_view( std::basic_string const & s )
    +{
    +    return basic_string_view( s.data(), s.size() );
    +}
    +
    +}} // namespace nonstd::sv_lite
    +
    +#endif // nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
    +
    +//
    +// make types and algorithms available in namespace nonstd:
    +//
    +
    +namespace nonstd {
    +
    +using sv_lite::basic_string_view;
    +using sv_lite::string_view;
    +using sv_lite::wstring_view;
    +
    +#if nssv_HAVE_WCHAR16_T
    +using sv_lite::u16string_view;
    +#endif
    +#if nssv_HAVE_WCHAR32_T
    +using sv_lite::u32string_view;
    +#endif
    +
    +// literal "sv"
    +
    +using sv_lite::operator==;
    +using sv_lite::operator!=;
    +using sv_lite::operator<;
    +using sv_lite::operator<=;
    +using sv_lite::operator>;
    +using sv_lite::operator>=;
    +
    +#if ! nssv_CONFIG_NO_STREAM_INSERTION
    +using sv_lite::operator<<;
    +#endif
    +
    +#if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
    +using sv_lite::to_string;
    +using sv_lite::to_string_view;
    +#endif
    +
    +} // namespace nonstd
    +
    +// 24.4.5 Hash support (C++11):
    +
    +// Note: The hash value of a string view object is equal to the hash value of
    +// the corresponding string object.
    +
    +#if nssv_HAVE_STD_HASH
    +
    +#include 
    +
    +namespace std {
    +
    +template<>
    +struct hash< nonstd::string_view >
    +{
    +public:
    +    std::size_t operator()( nonstd::string_view v ) const nssv_noexcept
    +    {
    +        return std::hash()( std::string( v.data(), v.size() ) );
    +    }
    +};
    +
    +template<>
    +struct hash< nonstd::wstring_view >
    +{
    +public:
    +    std::size_t operator()( nonstd::wstring_view v ) const nssv_noexcept
    +    {
    +        return std::hash()( std::wstring( v.data(), v.size() ) );
    +    }
    +};
    +
    +template<>
    +struct hash< nonstd::u16string_view >
    +{
    +public:
    +    std::size_t operator()( nonstd::u16string_view v ) const nssv_noexcept
    +    {
    +        return std::hash()( std::u16string( v.data(), v.size() ) );
    +    }
    +};
    +
    +template<>
    +struct hash< nonstd::u32string_view >
    +{
    +public:
    +    std::size_t operator()( nonstd::u32string_view v ) const nssv_noexcept
    +    {
    +        return std::hash()( std::u32string( v.data(), v.size() ) );
    +    }
    +};
    +
    +} // namespace std
    +
    +#endif // nssv_HAVE_STD_HASH
    +
    +nssv_RESTORE_WARNINGS()
    +
    +#endif // nssv_HAVE_STD_STRING_VIEW
    +#endif // NONSTD_SV_LITE_H_INCLUDED
    +/* end file simdjson/nonstd/string_view.hpp */
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +namespace std {
    +  using string_view = nonstd::string_view;
    +}
    +#endif // SIMDJSON_HAS_STRING_VIEW
    +#undef SIMDJSON_HAS_STRING_VIEW // We are not going to need this macro anymore.
    +
    +/// If EXPR is an error, returns it.
    +#define SIMDJSON_TRY(EXPR) { auto _err = (EXPR); if (_err) { return _err; } }
    +
    +// Unless the programmer has already set SIMDJSON_DEVELOPMENT_CHECKS,
    +// we want to set it under debug builds. We detect a debug build
    +// under Visual Studio when the _DEBUG macro is set. Under the other
    +// compilers, we use the fact that they define __OPTIMIZE__ whenever
    +// they allow optimizations.
    +// It is possible that this could miss some cases where SIMDJSON_DEVELOPMENT_CHECKS
    +// is helpful, but the programmer can set the macro SIMDJSON_DEVELOPMENT_CHECKS.
    +// It could also wrongly set SIMDJSON_DEVELOPMENT_CHECKS (e.g., if the programmer
    +// sets _DEBUG in a release build under Visual Studio, or if some compiler fails to
    +// set the __OPTIMIZE__ macro).
    +#ifndef SIMDJSON_DEVELOPMENT_CHECKS
    +#ifdef _MSC_VER
    +// Visual Studio seems to set _DEBUG for debug builds.
    +#ifdef _DEBUG
    +#define SIMDJSON_DEVELOPMENT_CHECKS 1
    +#endif // _DEBUG
    +#else // _MSC_VER
    +// All other compilers appear to set __OPTIMIZE__ to a positive integer
    +// when the compiler is optimizing.
    +#ifndef __OPTIMIZE__
    +#define SIMDJSON_DEVELOPMENT_CHECKS 1
    +#endif // __OPTIMIZE__
    +#endif // _MSC_VER
    +#endif // SIMDJSON_DEVELOPMENT_CHECKS
    +
    +// The SIMDJSON_CHECK_EOF macro is a feature flag for the "don't require padding"
    +// feature.
    +
    +#if SIMDJSON_CPLUSPLUS17
    +// if we have C++, then fallthrough is a default attribute
    +# define simdjson_fallthrough [[fallthrough]]
    +// check if we have __attribute__ support
    +#elif defined(__has_attribute)
    +// check if we have the __fallthrough__ attribute
    +#if __has_attribute(__fallthrough__)
    +// we are good to go:
    +# define simdjson_fallthrough                    __attribute__((__fallthrough__))
    +#endif // __has_attribute(__fallthrough__)
    +#endif // SIMDJSON_CPLUSPLUS17
    +// on some systems, we simply do not have support for fallthrough, so use a default:
    +#ifndef simdjson_fallthrough
    +# define simdjson_fallthrough do {} while (0)  /* fallthrough */
    +#endif // simdjson_fallthrough
    +
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +#define SIMDJSON_DEVELOPMENT_ASSERT(expr) do { assert ((expr)); } while (0)
    +#else
    +#define SIMDJSON_DEVELOPMENT_ASSERT(expr) do { } while (0)
    +#endif
    +
    +#ifndef SIMDJSON_UTF8VALIDATION
    +#define SIMDJSON_UTF8VALIDATION 1
    +#endif
    +
    +#ifdef __has_include
    +// How do we detect that a compiler supports vbmi2?
    +// For sure if the following header is found, we are ok?
    +#if __has_include()
    +#define SIMDJSON_COMPILER_SUPPORTS_VBMI2 1
    +#endif
    +#endif
    +
    +#ifdef _MSC_VER
    +#if _MSC_VER >= 1920
    +// Visual Studio 2019 and up support VBMI2 under x64 even if the header
    +// avx512vbmi2intrin.h is not found.
    +#define SIMDJSON_COMPILER_SUPPORTS_VBMI2 1
    +#endif
    +#endif
    +
    +// By default, we allow AVX512.
    +#ifndef SIMDJSON_AVX512_ALLOWED
    +#define SIMDJSON_AVX512_ALLOWED 1
    +#endif
    +
    +#endif // SIMDJSON_COMMON_DEFS_H
    +/* end file simdjson/common_defs.h */
    +/* skipped duplicate #include "simdjson/compiler_check.h" */
    +/* including simdjson/error.h: #include "simdjson/error.h" */
    +/* begin file simdjson/error.h */
    +#ifndef SIMDJSON_ERROR_H
    +#define SIMDJSON_ERROR_H
    +
    +/* skipped duplicate #include "simdjson/base.h" */
    +
    +#include 
    +#include 
    +
    +namespace simdjson {
    +
    +/**
    + * All possible errors returned by simdjson. These error codes are subject to change
    + * and not all simdjson kernel returns the same error code given the same input: it is not
    + * well defined which error a given input should produce.
    + *
    + * Only SUCCESS evaluates to false as a Boolean. All other error codes will evaluate
    + * to true as a Boolean.
    + */
    +enum error_code {
    +  SUCCESS = 0,                ///< No error
    +  CAPACITY,                   ///< This parser can't support a document that big
    +  MEMALLOC,                   ///< Error allocating memory, most likely out of memory
    +  TAPE_ERROR,                 ///< Something went wrong, this is a generic error
    +  DEPTH_ERROR,                ///< Your document exceeds the user-specified depth limitation
    +  STRING_ERROR,               ///< Problem while parsing a string
    +  T_ATOM_ERROR,               ///< Problem while parsing an atom starting with the letter 't'
    +  F_ATOM_ERROR,               ///< Problem while parsing an atom starting with the letter 'f'
    +  N_ATOM_ERROR,               ///< Problem while parsing an atom starting with the letter 'n'
    +  NUMBER_ERROR,               ///< Problem while parsing a number
    +  UTF8_ERROR,                 ///< the input is not valid UTF-8
    +  UNINITIALIZED,              ///< unknown error, or uninitialized document
    +  EMPTY,                      ///< no structural element found
    +  UNESCAPED_CHARS,            ///< found unescaped characters in a string.
    +  UNCLOSED_STRING,            ///< missing quote at the end
    +  UNSUPPORTED_ARCHITECTURE,   ///< unsupported architecture
    +  INCORRECT_TYPE,             ///< JSON element has a different type than user expected
    +  NUMBER_OUT_OF_RANGE,        ///< JSON number does not fit in 64 bits
    +  INDEX_OUT_OF_BOUNDS,        ///< JSON array index too large
    +  NO_SUCH_FIELD,              ///< JSON field not found in object
    +  IO_ERROR,                   ///< Error reading a file
    +  INVALID_JSON_POINTER,       ///< Invalid JSON pointer reference
    +  INVALID_URI_FRAGMENT,       ///< Invalid URI fragment
    +  UNEXPECTED_ERROR,           ///< indicative of a bug in simdjson
    +  PARSER_IN_USE,              ///< parser is already in use.
    +  OUT_OF_ORDER_ITERATION,     ///< tried to iterate an array or object out of order (checked when SIMDJSON_DEVELOPMENT_CHECKS=1)
    +  INSUFFICIENT_PADDING,       ///< The JSON doesn't have enough padding for simdjson to safely parse it.
    +  INCOMPLETE_ARRAY_OR_OBJECT, ///< The document ends early.
    +  SCALAR_DOCUMENT_AS_VALUE,   ///< A scalar document is treated as a value.
    +  OUT_OF_BOUNDS,              ///< Attempted to access location outside of document.
    +  TRAILING_CONTENT,           ///< Unexpected trailing content in the JSON input
    +  NUM_ERROR_CODES
    +};
    +
    +/**
    + * It is the convention throughout the code that  the macro SIMDJSON_DEVELOPMENT_CHECKS determines whether
    + * we check for OUT_OF_ORDER_ITERATION. The logic behind it is that these errors only occurs when the code
    + * that was written while breaking some simdjson::ondemand requirement. They should not occur in released
    + * code after these issues were fixed.
    + */
    +
    +/**
    + * Get the error message for the given error code.
    + *
    + *   dom::parser parser;
    + *   dom::element doc;
    + *   auto error = parser.parse("foo",3).get(doc);
    + *   if (error) { printf("Error: %s\n", error_message(error)); }
    + *
    + * @return The error message.
    + */
    +inline const char *error_message(error_code error) noexcept;
    +
    +/**
    + * Write the error message to the output stream
    + */
    +inline std::ostream& operator<<(std::ostream& out, error_code error) noexcept;
    +
    +/**
    + * Exception thrown when an exception-supporting simdjson method is called
    + */
    +struct simdjson_error : public std::exception {
    +  /**
    +   * Create an exception from a simdjson error code.
    +   * @param error The error code
    +   */
    +  simdjson_error(error_code error) noexcept : _error{error} { }
    +  /** The error message */
    +  const char *what() const noexcept { return error_message(error()); }
    +  /** The error code */
    +  error_code error() const noexcept { return _error; }
    +private:
    +  /** The error code that was used */
    +  error_code _error;
    +};
    +
    +namespace internal {
    +
    +/**
    + * The result of a simdjson operation that could fail.
    + *
    + * Gives the option of reading error codes, or throwing an exception by casting to the desired result.
    + *
    + * This is a base class for implementations that want to add functions to the result type for
    + * chaining.
    + *
    + * Override like:
    + *
    + *   struct simdjson_result : public internal::simdjson_result_base {
    + *     simdjson_result() noexcept : internal::simdjson_result_base() {}
    + *     simdjson_result(error_code error) noexcept : internal::simdjson_result_base(error) {}
    + *     simdjson_result(T &&value) noexcept : internal::simdjson_result_base(std::forward(value)) {}
    + *     simdjson_result(T &&value, error_code error) noexcept : internal::simdjson_result_base(value, error) {}
    + *     // Your extra methods here
    + *   }
    + *
    + * Then any method returning simdjson_result will be chainable with your methods.
    + */
    +template
    +struct simdjson_result_base : protected std::pair {
    +
    +  /**
    +   * Create a new empty result with error = UNINITIALIZED.
    +   */
    +  simdjson_inline simdjson_result_base() noexcept;
    +
    +  /**
    +   * Create a new error result.
    +   */
    +  simdjson_inline simdjson_result_base(error_code error) noexcept;
    +
    +  /**
    +   * Create a new successful result.
    +   */
    +  simdjson_inline simdjson_result_base(T &&value) noexcept;
    +
    +  /**
    +   * Create a new result with both things (use if you don't want to branch when creating the result).
    +   */
    +  simdjson_inline simdjson_result_base(T &&value, error_code error) noexcept;
    +
    +  /**
    +   * Move the value and the error to the provided variables.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   * @param error The variable to assign the error to. Set to SUCCESS if there is no error.
    +   */
    +  simdjson_inline void tie(T &value, error_code &error) && noexcept;
    +
    +  /**
    +   * Move the value to the provided variable.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   */
    +  simdjson_inline error_code get(T &value) && noexcept;
    +
    +  /**
    +   * The error.
    +   */
    +  simdjson_inline error_code error() const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value.
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T& value() & noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& value() && noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& take_value() && noexcept(false);
    +
    +  /**
    +   * Cast to the value (will throw on error).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline operator T&&() && noexcept(false);
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline const T& value_unsafe() const& noexcept;
    +
    +  /**
    +   * Take the result value (move it). This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T&& value_unsafe() && noexcept;
    +
    +}; // struct simdjson_result_base
    +
    +} // namespace internal
    +
    +/**
    + * The result of a simdjson operation that could fail.
    + *
    + * Gives the option of reading error codes, or throwing an exception by casting to the desired result.
    + */
    +template
    +struct simdjson_result : public internal::simdjson_result_base {
    +  /**
    +   * @private Create a new empty result with error = UNINITIALIZED.
    +   */
    +  simdjson_inline simdjson_result() noexcept;
    +  /**
    +   * @private Create a new successful result.
    +   */
    +  simdjson_inline simdjson_result(T &&value) noexcept;
    +  /**
    +   * @private Create a new error result.
    +   */
    +  simdjson_inline simdjson_result(error_code error_code) noexcept;
    +  /**
    +   * @private Create a new result with both things (use if you don't want to branch when creating the result).
    +   */
    +  simdjson_inline simdjson_result(T &&value, error_code error) noexcept;
    +
    +  /**
    +   * Move the value and the error to the provided variables.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   * @param error The variable to assign the error to. Set to SUCCESS if there is no error.
    +   */
    +  simdjson_inline void tie(T &value, error_code &error) && noexcept;
    +
    +  /**
    +   * Move the value to the provided variable.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code get(T &value) && noexcept;
    +
    +  /**
    +   * The error.
    +   */
    +  simdjson_inline error_code error() const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value.
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T& value() & noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& value() && noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& take_value() && noexcept(false);
    +
    +  /**
    +   * Cast to the value (will throw on error).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline operator T&&() && noexcept(false);
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline const T& value_unsafe() const& noexcept;
    +
    +  /**
    +   * Take the result value (move it). This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T&& value_unsafe() && noexcept;
    +
    +}; // struct simdjson_result
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +template
    +inline std::ostream& operator<<(std::ostream& out, simdjson_result value) { return out << value.value(); }
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +#ifndef SIMDJSON_DISABLE_DEPRECATED_API
    +/**
    + * @deprecated This is an alias and will be removed, use error_code instead
    + */
    +using ErrorValues [[deprecated("This is an alias and will be removed, use error_code instead")]] = error_code;
    +
    +/**
    + * @deprecated Error codes should be stored and returned as `error_code`, use `error_message()` instead.
    + */
    +[[deprecated("Error codes should be stored and returned as `error_code`, use `error_message()` instead.")]]
    +inline const std::string error_message(int error) noexcept;
    +#endif // SIMDJSON_DISABLE_DEPRECATED_API
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ERROR_H
    +/* end file simdjson/error.h */
    +/* skipped duplicate #include "simdjson/portability.h" */
    +
    +/**
    + * @brief The top level simdjson namespace, containing everything the library provides.
    + */
    +namespace simdjson {
    +
    +SIMDJSON_PUSH_DISABLE_UNUSED_WARNINGS
    +
    +/** The maximum document size supported by simdjson. */
    +constexpr size_t SIMDJSON_MAXSIZE_BYTES = 0xFFFFFFFF;
    +
    +/**
    + * The amount of padding needed in a buffer to parse JSON.
    + *
    + * The input buf should be readable up to buf + SIMDJSON_PADDING
    + * this is a stopgap; there should be a better description of the
    + * main loop and its behavior that abstracts over this
    + * See https://github.com/simdjson/simdjson/issues/174
    + */
    +constexpr size_t SIMDJSON_PADDING = 64;
    +
    +/**
    + * By default, simdjson supports this many nested objects and arrays.
    + *
    + * This is the default for parser::max_depth().
    + */
    +constexpr size_t DEFAULT_MAX_DEPTH = 1024;
    +
    +SIMDJSON_POP_DISABLE_UNUSED_WARNINGS
    +
    +class implementation;
    +struct padded_string;
    +class padded_string_view;
    +enum class stage1_mode;
    +
    +namespace internal {
    +
    +template
    +class atomic_ptr;
    +class dom_parser_implementation;
    +class escape_json_string;
    +class tape_ref;
    +struct value128;
    +enum class tape_type;
    +
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_BASE_H
    +/* end file simdjson/base.h */
    +
    +#endif // SIMDJSON_SRC_BASE_H
    +/* end file base.h */
    +
    +SIMDJSON_PUSH_DISABLE_UNUSED_WARNINGS
    +
    +/* including to_chars.cpp: #include  */
    +/* begin file to_chars.cpp */
    +#ifndef SIMDJSON_SRC_TO_CHARS_CPP
    +#define SIMDJSON_SRC_TO_CHARS_CPP
    +
    +/* skipped duplicate #include  */
    +
    +#include 
    +#include 
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace internal {
    +/*!
    +implements the Grisu2 algorithm for binary to decimal floating-point
    +conversion.
    +Adapted from JSON for Modern C++
    +
    +This implementation is a slightly modified version of the reference
    +implementation which may be obtained from
    +http://florian.loitsch.com/publications (bench.tar.gz).
    +The code is distributed under the MIT license, Copyright (c) 2009 Florian
    +Loitsch. For a detailed description of the algorithm see: [1] Loitsch, "Printing
    +Floating-Point Numbers Quickly and Accurately with Integers", Proceedings of the
    +ACM SIGPLAN 2010 Conference on Programming Language Design and Implementation,
    +PLDI 2010 [2] Burger, Dybvig, "Printing Floating-Point Numbers Quickly and
    +Accurately", Proceedings of the ACM SIGPLAN 1996 Conference on Programming
    +Language Design and Implementation, PLDI 1996
    +*/
    +namespace dtoa_impl {
    +
    +template 
    +Target reinterpret_bits(const Source source) {
    +  static_assert(sizeof(Target) == sizeof(Source), "size mismatch");
    +
    +  Target target;
    +  std::memcpy(&target, &source, sizeof(Source));
    +  return target;
    +}
    +
    +struct diyfp // f * 2^e
    +{
    +  static constexpr int kPrecision = 64; // = q
    +
    +  std::uint64_t f = 0;
    +  int e = 0;
    +
    +  constexpr diyfp(std::uint64_t f_, int e_) noexcept : f(f_), e(e_) {}
    +
    +  /*!
    +  @brief returns x - y
    +  @pre x.e == y.e and x.f >= y.f
    +  */
    +  static diyfp sub(const diyfp &x, const diyfp &y) noexcept {
    +
    +    return {x.f - y.f, x.e};
    +  }
    +
    +  /*!
    +  @brief returns x * y
    +  @note The result is rounded. (Only the upper q bits are returned.)
    +  */
    +  static diyfp mul(const diyfp &x, const diyfp &y) noexcept {
    +    static_assert(kPrecision == 64, "internal error");
    +
    +    // Computes:
    +    //  f = round((x.f * y.f) / 2^q)
    +    //  e = x.e + y.e + q
    +
    +    // Emulate the 64-bit * 64-bit multiplication:
    +    //
    +    // p = u * v
    +    //   = (u_lo + 2^32 u_hi) (v_lo + 2^32 v_hi)
    +    //   = (u_lo v_lo         ) + 2^32 ((u_lo v_hi         ) + (u_hi v_lo )) +
    +    //   2^64 (u_hi v_hi         ) = (p0                ) + 2^32 ((p1 ) + (p2 ))
    +    //   + 2^64 (p3                ) = (p0_lo + 2^32 p0_hi) + 2^32 ((p1_lo +
    +    //   2^32 p1_hi) + (p2_lo + 2^32 p2_hi)) + 2^64 (p3                ) =
    +    //   (p0_lo             ) + 2^32 (p0_hi + p1_lo + p2_lo ) + 2^64 (p1_hi +
    +    //   p2_hi + p3) = (p0_lo             ) + 2^32 (Q ) + 2^64 (H ) = (p0_lo ) +
    +    //   2^32 (Q_lo + 2^32 Q_hi                           ) + 2^64 (H )
    +    //
    +    // (Since Q might be larger than 2^32 - 1)
    +    //
    +    //   = (p0_lo + 2^32 Q_lo) + 2^64 (Q_hi + H)
    +    //
    +    // (Q_hi + H does not overflow a 64-bit int)
    +    //
    +    //   = p_lo + 2^64 p_hi
    +
    +    const std::uint64_t u_lo = x.f & 0xFFFFFFFFu;
    +    const std::uint64_t u_hi = x.f >> 32u;
    +    const std::uint64_t v_lo = y.f & 0xFFFFFFFFu;
    +    const std::uint64_t v_hi = y.f >> 32u;
    +
    +    const std::uint64_t p0 = u_lo * v_lo;
    +    const std::uint64_t p1 = u_lo * v_hi;
    +    const std::uint64_t p2 = u_hi * v_lo;
    +    const std::uint64_t p3 = u_hi * v_hi;
    +
    +    const std::uint64_t p0_hi = p0 >> 32u;
    +    const std::uint64_t p1_lo = p1 & 0xFFFFFFFFu;
    +    const std::uint64_t p1_hi = p1 >> 32u;
    +    const std::uint64_t p2_lo = p2 & 0xFFFFFFFFu;
    +    const std::uint64_t p2_hi = p2 >> 32u;
    +
    +    std::uint64_t Q = p0_hi + p1_lo + p2_lo;
    +
    +    // The full product might now be computed as
    +    //
    +    // p_hi = p3 + p2_hi + p1_hi + (Q >> 32)
    +    // p_lo = p0_lo + (Q << 32)
    +    //
    +    // But in this particular case here, the full p_lo is not required.
    +    // Effectively we only need to add the highest bit in p_lo to p_hi (and
    +    // Q_hi + 1 does not overflow).
    +
    +    Q += std::uint64_t{1} << (64u - 32u - 1u); // round, ties up
    +
    +    const std::uint64_t h = p3 + p2_hi + p1_hi + (Q >> 32u);
    +
    +    return {h, x.e + y.e + 64};
    +  }
    +
    +  /*!
    +  @brief normalize x such that the significand is >= 2^(q-1)
    +  @pre x.f != 0
    +  */
    +  static diyfp normalize(diyfp x) noexcept {
    +
    +    while ((x.f >> 63u) == 0) {
    +      x.f <<= 1u;
    +      x.e--;
    +    }
    +
    +    return x;
    +  }
    +
    +  /*!
    +  @brief normalize x such that the result has the exponent E
    +  @pre e >= x.e and the upper e - x.e bits of x.f must be zero.
    +  */
    +  static diyfp normalize_to(const diyfp &x,
    +                            const int target_exponent) noexcept {
    +    const int delta = x.e - target_exponent;
    +
    +    return {x.f << delta, target_exponent};
    +  }
    +};
    +
    +struct boundaries {
    +  diyfp w;
    +  diyfp minus;
    +  diyfp plus;
    +};
    +
    +/*!
    +Compute the (normalized) diyfp representing the input number 'value' and its
    +boundaries.
    +@pre value must be finite and positive
    +*/
    +template  boundaries compute_boundaries(FloatType value) {
    +
    +  // Convert the IEEE representation into a diyfp.
    +  //
    +  // If v is denormal:
    +  //      value = 0.F * 2^(1 - bias) = (          F) * 2^(1 - bias - (p-1))
    +  // If v is normalized:
    +  //      value = 1.F * 2^(E - bias) = (2^(p-1) + F) * 2^(E - bias - (p-1))
    +
    +  static_assert(std::numeric_limits::is_iec559,
    +                "internal error: dtoa_short requires an IEEE-754 "
    +                "floating-point implementation");
    +
    +  constexpr int kPrecision =
    +      std::numeric_limits::digits; // = p (includes the hidden bit)
    +  constexpr int kBias =
    +      std::numeric_limits::max_exponent - 1 + (kPrecision - 1);
    +  constexpr int kMinExp = 1 - kBias;
    +  constexpr std::uint64_t kHiddenBit = std::uint64_t{1}
    +                                       << (kPrecision - 1); // = 2^(p-1)
    +
    +  using bits_type = typename std::conditional::type;
    +
    +  const std::uint64_t bits = reinterpret_bits(value);
    +  const std::uint64_t E = bits >> (kPrecision - 1);
    +  const std::uint64_t F = bits & (kHiddenBit - 1);
    +
    +  const bool is_denormal = E == 0;
    +  const diyfp v = is_denormal
    +                      ? diyfp(F, kMinExp)
    +                      : diyfp(F + kHiddenBit, static_cast(E) - kBias);
    +
    +  // Compute the boundaries m- and m+ of the floating-point value
    +  // v = f * 2^e.
    +  //
    +  // Determine v- and v+, the floating-point predecessor and successor if v,
    +  // respectively.
    +  //
    +  //      v- = v - 2^e        if f != 2^(p-1) or e == e_min                (A)
    +  //         = v - 2^(e-1)    if f == 2^(p-1) and e > e_min                (B)
    +  //
    +  //      v+ = v + 2^e
    +  //
    +  // Let m- = (v- + v) / 2 and m+ = (v + v+) / 2. All real numbers _strictly_
    +  // between m- and m+ round to v, regardless of how the input rounding
    +  // algorithm breaks ties.
    +  //
    +  //      ---+-------------+-------------+-------------+-------------+---  (A)
    +  //         v-            m-            v             m+            v+
    +  //
    +  //      -----------------+------+------+-------------+-------------+---  (B)
    +  //                       v-     m-     v             m+            v+
    +
    +  const bool lower_boundary_is_closer = F == 0 && E > 1;
    +  const diyfp m_plus = diyfp(2 * v.f + 1, v.e - 1);
    +  const diyfp m_minus = lower_boundary_is_closer
    +                            ? diyfp(4 * v.f - 1, v.e - 2)  // (B)
    +                            : diyfp(2 * v.f - 1, v.e - 1); // (A)
    +
    +  // Determine the normalized w+ = m+.
    +  const diyfp w_plus = diyfp::normalize(m_plus);
    +
    +  // Determine w- = m- such that e_(w-) = e_(w+).
    +  const diyfp w_minus = diyfp::normalize_to(m_minus, w_plus.e);
    +
    +  return {diyfp::normalize(v), w_minus, w_plus};
    +}
    +
    +// Given normalized diyfp w, Grisu needs to find a (normalized) cached
    +// power-of-ten c, such that the exponent of the product c * w = f * 2^e lies
    +// within a certain range [alpha, gamma] (Definition 3.2 from [1])
    +//
    +//      alpha <= e = e_c + e_w + q <= gamma
    +//
    +// or
    +//
    +//      f_c * f_w * 2^alpha <= f_c 2^(e_c) * f_w 2^(e_w) * 2^q
    +//                          <= f_c * f_w * 2^gamma
    +//
    +// Since c and w are normalized, i.e. 2^(q-1) <= f < 2^q, this implies
    +//
    +//      2^(q-1) * 2^(q-1) * 2^alpha <= c * w * 2^q < 2^q * 2^q * 2^gamma
    +//
    +// or
    +//
    +//      2^(q - 2 + alpha) <= c * w < 2^(q + gamma)
    +//
    +// The choice of (alpha,gamma) determines the size of the table and the form of
    +// the digit generation procedure. Using (alpha,gamma)=(-60,-32) works out well
    +// in practice:
    +//
    +// The idea is to cut the number c * w = f * 2^e into two parts, which can be
    +// processed independently: An integral part p1, and a fractional part p2:
    +//
    +//      f * 2^e = ( (f div 2^-e) * 2^-e + (f mod 2^-e) ) * 2^e
    +//              = (f div 2^-e) + (f mod 2^-e) * 2^e
    +//              = p1 + p2 * 2^e
    +//
    +// The conversion of p1 into decimal form requires a series of divisions and
    +// modulos by (a power of) 10. These operations are faster for 32-bit than for
    +// 64-bit integers, so p1 should ideally fit into a 32-bit integer. This can be
    +// achieved by choosing
    +//
    +//      -e >= 32   or   e <= -32 := gamma
    +//
    +// In order to convert the fractional part
    +//
    +//      p2 * 2^e = p2 / 2^-e = d[-1] / 10^1 + d[-2] / 10^2 + ...
    +//
    +// into decimal form, the fraction is repeatedly multiplied by 10 and the digits
    +// d[-i] are extracted in order:
    +//
    +//      (10 * p2) div 2^-e = d[-1]
    +//      (10 * p2) mod 2^-e = d[-2] / 10^1 + ...
    +//
    +// The multiplication by 10 must not overflow. It is sufficient to choose
    +//
    +//      10 * p2 < 16 * p2 = 2^4 * p2 <= 2^64.
    +//
    +// Since p2 = f mod 2^-e < 2^-e,
    +//
    +//      -e <= 60   or   e >= -60 := alpha
    +
    +constexpr int kAlpha = -60;
    +constexpr int kGamma = -32;
    +
    +struct cached_power // c = f * 2^e ~= 10^k
    +{
    +  std::uint64_t f;
    +  int e;
    +  int k;
    +};
    +
    +/*!
    +For a normalized diyfp w = f * 2^e, this function returns a (normalized) cached
    +power-of-ten c = f_c * 2^e_c, such that the exponent of the product w * c
    +satisfies (Definition 3.2 from [1])
    +     alpha <= e_c + e + q <= gamma.
    +*/
    +inline cached_power get_cached_power_for_binary_exponent(int e) {
    +  // Now
    +  //
    +  //      alpha <= e_c + e + q <= gamma                                    (1)
    +  //      ==> f_c * 2^alpha <= c * 2^e * 2^q
    +  //
    +  // and since the c's are normalized, 2^(q-1) <= f_c,
    +  //
    +  //      ==> 2^(q - 1 + alpha) <= c * 2^(e + q)
    +  //      ==> 2^(alpha - e - 1) <= c
    +  //
    +  // If c were an exact power of ten, i.e. c = 10^k, one may determine k as
    +  //
    +  //      k = ceil( log_10( 2^(alpha - e - 1) ) )
    +  //        = ceil( (alpha - e - 1) * log_10(2) )
    +  //
    +  // From the paper:
    +  // "In theory the result of the procedure could be wrong since c is rounded,
    +  //  and the computation itself is approximated [...]. In practice, however,
    +  //  this simple function is sufficient."
    +  //
    +  // For IEEE double precision floating-point numbers converted into
    +  // normalized diyfp's w = f * 2^e, with q = 64,
    +  //
    +  //      e >= -1022      (min IEEE exponent)
    +  //           -52        (p - 1)
    +  //           -52        (p - 1, possibly normalize denormal IEEE numbers)
    +  //           -11        (normalize the diyfp)
    +  //         = -1137
    +  //
    +  // and
    +  //
    +  //      e <= +1023      (max IEEE exponent)
    +  //           -52        (p - 1)
    +  //           -11        (normalize the diyfp)
    +  //         = 960
    +  //
    +  // This binary exponent range [-1137,960] results in a decimal exponent
    +  // range [-307,324]. One does not need to store a cached power for each
    +  // k in this range. For each such k it suffices to find a cached power
    +  // such that the exponent of the product lies in [alpha,gamma].
    +  // This implies that the difference of the decimal exponents of adjacent
    +  // table entries must be less than or equal to
    +  //
    +  //      floor( (gamma - alpha) * log_10(2) ) = 8.
    +  //
    +  // (A smaller distance gamma-alpha would require a larger table.)
    +
    +  // NB:
    +  // Actually this function returns c, such that -60 <= e_c + e + 64 <= -34.
    +
    +  constexpr int kCachedPowersMinDecExp = -300;
    +  constexpr int kCachedPowersDecStep = 8;
    +
    +  static constexpr std::array kCachedPowers = {{
    +      {0xAB70FE17C79AC6CA, -1060, -300}, {0xFF77B1FCBEBCDC4F, -1034, -292},
    +      {0xBE5691EF416BD60C, -1007, -284}, {0x8DD01FAD907FFC3C, -980, -276},
    +      {0xD3515C2831559A83, -954, -268},  {0x9D71AC8FADA6C9B5, -927, -260},
    +      {0xEA9C227723EE8BCB, -901, -252},  {0xAECC49914078536D, -874, -244},
    +      {0x823C12795DB6CE57, -847, -236},  {0xC21094364DFB5637, -821, -228},
    +      {0x9096EA6F3848984F, -794, -220},  {0xD77485CB25823AC7, -768, -212},
    +      {0xA086CFCD97BF97F4, -741, -204},  {0xEF340A98172AACE5, -715, -196},
    +      {0xB23867FB2A35B28E, -688, -188},  {0x84C8D4DFD2C63F3B, -661, -180},
    +      {0xC5DD44271AD3CDBA, -635, -172},  {0x936B9FCEBB25C996, -608, -164},
    +      {0xDBAC6C247D62A584, -582, -156},  {0xA3AB66580D5FDAF6, -555, -148},
    +      {0xF3E2F893DEC3F126, -529, -140},  {0xB5B5ADA8AAFF80B8, -502, -132},
    +      {0x87625F056C7C4A8B, -475, -124},  {0xC9BCFF6034C13053, -449, -116},
    +      {0x964E858C91BA2655, -422, -108},  {0xDFF9772470297EBD, -396, -100},
    +      {0xA6DFBD9FB8E5B88F, -369, -92},   {0xF8A95FCF88747D94, -343, -84},
    +      {0xB94470938FA89BCF, -316, -76},   {0x8A08F0F8BF0F156B, -289, -68},
    +      {0xCDB02555653131B6, -263, -60},   {0x993FE2C6D07B7FAC, -236, -52},
    +      {0xE45C10C42A2B3B06, -210, -44},   {0xAA242499697392D3, -183, -36},
    +      {0xFD87B5F28300CA0E, -157, -28},   {0xBCE5086492111AEB, -130, -20},
    +      {0x8CBCCC096F5088CC, -103, -12},   {0xD1B71758E219652C, -77, -4},
    +      {0x9C40000000000000, -50, 4},      {0xE8D4A51000000000, -24, 12},
    +      {0xAD78EBC5AC620000, 3, 20},       {0x813F3978F8940984, 30, 28},
    +      {0xC097CE7BC90715B3, 56, 36},      {0x8F7E32CE7BEA5C70, 83, 44},
    +      {0xD5D238A4ABE98068, 109, 52},     {0x9F4F2726179A2245, 136, 60},
    +      {0xED63A231D4C4FB27, 162, 68},     {0xB0DE65388CC8ADA8, 189, 76},
    +      {0x83C7088E1AAB65DB, 216, 84},     {0xC45D1DF942711D9A, 242, 92},
    +      {0x924D692CA61BE758, 269, 100},    {0xDA01EE641A708DEA, 295, 108},
    +      {0xA26DA3999AEF774A, 322, 116},    {0xF209787BB47D6B85, 348, 124},
    +      {0xB454E4A179DD1877, 375, 132},    {0x865B86925B9BC5C2, 402, 140},
    +      {0xC83553C5C8965D3D, 428, 148},    {0x952AB45CFA97A0B3, 455, 156},
    +      {0xDE469FBD99A05FE3, 481, 164},    {0xA59BC234DB398C25, 508, 172},
    +      {0xF6C69A72A3989F5C, 534, 180},    {0xB7DCBF5354E9BECE, 561, 188},
    +      {0x88FCF317F22241E2, 588, 196},    {0xCC20CE9BD35C78A5, 614, 204},
    +      {0x98165AF37B2153DF, 641, 212},    {0xE2A0B5DC971F303A, 667, 220},
    +      {0xA8D9D1535CE3B396, 694, 228},    {0xFB9B7CD9A4A7443C, 720, 236},
    +      {0xBB764C4CA7A44410, 747, 244},    {0x8BAB8EEFB6409C1A, 774, 252},
    +      {0xD01FEF10A657842C, 800, 260},    {0x9B10A4E5E9913129, 827, 268},
    +      {0xE7109BFBA19C0C9D, 853, 276},    {0xAC2820D9623BF429, 880, 284},
    +      {0x80444B5E7AA7CF85, 907, 292},    {0xBF21E44003ACDD2D, 933, 300},
    +      {0x8E679C2F5E44FF8F, 960, 308},    {0xD433179D9C8CB841, 986, 316},
    +      {0x9E19DB92B4E31BA9, 1013, 324},
    +  }};
    +
    +  // This computation gives exactly the same results for k as
    +  //      k = ceil((kAlpha - e - 1) * 0.30102999566398114)
    +  // for |e| <= 1500, but doesn't require floating-point operations.
    +  // NB: log_10(2) ~= 78913 / 2^18
    +  const int f = kAlpha - e - 1;
    +  const int k = (f * 78913) / (1 << 18) + static_cast(f > 0);
    +
    +  const int index = (-kCachedPowersMinDecExp + k + (kCachedPowersDecStep - 1)) /
    +                    kCachedPowersDecStep;
    +
    +  const cached_power cached = kCachedPowers[static_cast(index)];
    +
    +  return cached;
    +}
    +
    +/*!
    +For n != 0, returns k, such that pow10 := 10^(k-1) <= n < 10^k.
    +For n == 0, returns 1 and sets pow10 := 1.
    +*/
    +inline int find_largest_pow10(const std::uint32_t n, std::uint32_t &pow10) {
    +  // LCOV_EXCL_START
    +  if (n >= 1000000000) {
    +    pow10 = 1000000000;
    +    return 10;
    +  }
    +  // LCOV_EXCL_STOP
    +  else if (n >= 100000000) {
    +    pow10 = 100000000;
    +    return 9;
    +  } else if (n >= 10000000) {
    +    pow10 = 10000000;
    +    return 8;
    +  } else if (n >= 1000000) {
    +    pow10 = 1000000;
    +    return 7;
    +  } else if (n >= 100000) {
    +    pow10 = 100000;
    +    return 6;
    +  } else if (n >= 10000) {
    +    pow10 = 10000;
    +    return 5;
    +  } else if (n >= 1000) {
    +    pow10 = 1000;
    +    return 4;
    +  } else if (n >= 100) {
    +    pow10 = 100;
    +    return 3;
    +  } else if (n >= 10) {
    +    pow10 = 10;
    +    return 2;
    +  } else {
    +    pow10 = 1;
    +    return 1;
    +  }
    +}
    +
    +inline void grisu2_round(char *buf, int len, std::uint64_t dist,
    +                         std::uint64_t delta, std::uint64_t rest,
    +                         std::uint64_t ten_k) {
    +
    +  //               <--------------------------- delta ---->
    +  //                                  <---- dist --------->
    +  // --------------[------------------+-------------------]--------------
    +  //               M-                 w                   M+
    +  //
    +  //                                  ten_k
    +  //                                <------>
    +  //                                       <---- rest ---->
    +  // --------------[------------------+----+--------------]--------------
    +  //                                  w    V
    +  //                                       = buf * 10^k
    +  //
    +  // ten_k represents a unit-in-the-last-place in the decimal representation
    +  // stored in buf.
    +  // Decrement buf by ten_k while this takes buf closer to w.
    +
    +  // The tests are written in this order to avoid overflow in unsigned
    +  // integer arithmetic.
    +
    +  while (rest < dist && delta - rest >= ten_k &&
    +         (rest + ten_k < dist || dist - rest > rest + ten_k - dist)) {
    +    buf[len - 1]--;
    +    rest += ten_k;
    +  }
    +}
    +
    +/*!
    +Generates V = buffer * 10^decimal_exponent, such that M- <= V <= M+.
    +M- and M+ must be normalized and share the same exponent -60 <= e <= -32.
    +*/
    +inline void grisu2_digit_gen(char *buffer, int &length, int &decimal_exponent,
    +                             diyfp M_minus, diyfp w, diyfp M_plus) {
    +  static_assert(kAlpha >= -60, "internal error");
    +  static_assert(kGamma <= -32, "internal error");
    +
    +  // Generates the digits (and the exponent) of a decimal floating-point
    +  // number V = buffer * 10^decimal_exponent in the range [M-, M+]. The diyfp's
    +  // w, M- and M+ share the same exponent e, which satisfies alpha <= e <=
    +  // gamma.
    +  //
    +  //               <--------------------------- delta ---->
    +  //                                  <---- dist --------->
    +  // --------------[------------------+-------------------]--------------
    +  //               M-                 w                   M+
    +  //
    +  // Grisu2 generates the digits of M+ from left to right and stops as soon as
    +  // V is in [M-,M+].
    +
    +  std::uint64_t delta =
    +      diyfp::sub(M_plus, M_minus)
    +          .f; // (significand of (M+ - M-), implicit exponent is e)
    +  std::uint64_t dist =
    +      diyfp::sub(M_plus, w)
    +          .f; // (significand of (M+ - w ), implicit exponent is e)
    +
    +  // Split M+ = f * 2^e into two parts p1 and p2 (note: e < 0):
    +  //
    +  //      M+ = f * 2^e
    +  //         = ((f div 2^-e) * 2^-e + (f mod 2^-e)) * 2^e
    +  //         = ((p1        ) * 2^-e + (p2        )) * 2^e
    +  //         = p1 + p2 * 2^e
    +
    +  const diyfp one(std::uint64_t{1} << -M_plus.e, M_plus.e);
    +
    +  auto p1 = static_cast(
    +      M_plus.f >>
    +      -one.e); // p1 = f div 2^-e (Since -e >= 32, p1 fits into a 32-bit int.)
    +  std::uint64_t p2 = M_plus.f & (one.f - 1); // p2 = f mod 2^-e
    +
    +  // 1)
    +  //
    +  // Generate the digits of the integral part p1 = d[n-1]...d[1]d[0]
    +
    +  std::uint32_t pow10;
    +  const int k = find_largest_pow10(p1, pow10);
    +
    +  //      10^(k-1) <= p1 < 10^k, pow10 = 10^(k-1)
    +  //
    +  //      p1 = (p1 div 10^(k-1)) * 10^(k-1) + (p1 mod 10^(k-1))
    +  //         = (d[k-1]         ) * 10^(k-1) + (p1 mod 10^(k-1))
    +  //
    +  //      M+ = p1                                             + p2 * 2^e
    +  //         = d[k-1] * 10^(k-1) + (p1 mod 10^(k-1))          + p2 * 2^e
    +  //         = d[k-1] * 10^(k-1) + ((p1 mod 10^(k-1)) * 2^-e + p2) * 2^e
    +  //         = d[k-1] * 10^(k-1) + (                         rest) * 2^e
    +  //
    +  // Now generate the digits d[n] of p1 from left to right (n = k-1,...,0)
    +  //
    +  //      p1 = d[k-1]...d[n] * 10^n + d[n-1]...d[0]
    +  //
    +  // but stop as soon as
    +  //
    +  //      rest * 2^e = (d[n-1]...d[0] * 2^-e + p2) * 2^e <= delta * 2^e
    +
    +  int n = k;
    +  while (n > 0) {
    +    // Invariants:
    +    //      M+ = buffer * 10^n + (p1 + p2 * 2^e)    (buffer = 0 for n = k)
    +    //      pow10 = 10^(n-1) <= p1 < 10^n
    +    //
    +    const std::uint32_t d = p1 / pow10; // d = p1 div 10^(n-1)
    +    const std::uint32_t r = p1 % pow10; // r = p1 mod 10^(n-1)
    +    //
    +    //      M+ = buffer * 10^n + (d * 10^(n-1) + r) + p2 * 2^e
    +    //         = (buffer * 10 + d) * 10^(n-1) + (r + p2 * 2^e)
    +    //
    +    buffer[length++] = static_cast('0' + d); // buffer := buffer * 10 + d
    +    //
    +    //      M+ = buffer * 10^(n-1) + (r + p2 * 2^e)
    +    //
    +    p1 = r;
    +    n--;
    +    //
    +    //      M+ = buffer * 10^n + (p1 + p2 * 2^e)
    +    //      pow10 = 10^n
    +    //
    +
    +    // Now check if enough digits have been generated.
    +    // Compute
    +    //
    +    //      p1 + p2 * 2^e = (p1 * 2^-e + p2) * 2^e = rest * 2^e
    +    //
    +    // Note:
    +    // Since rest and delta share the same exponent e, it suffices to
    +    // compare the significands.
    +    const std::uint64_t rest = (std::uint64_t{p1} << -one.e) + p2;
    +    if (rest <= delta) {
    +      // V = buffer * 10^n, with M- <= V <= M+.
    +
    +      decimal_exponent += n;
    +
    +      // We may now just stop. But instead look if the buffer could be
    +      // decremented to bring V closer to w.
    +      //
    +      // pow10 = 10^n is now 1 ulp in the decimal representation V.
    +      // The rounding procedure works with diyfp's with an implicit
    +      // exponent of e.
    +      //
    +      //      10^n = (10^n * 2^-e) * 2^e = ulp * 2^e
    +      //
    +      const std::uint64_t ten_n = std::uint64_t{pow10} << -one.e;
    +      grisu2_round(buffer, length, dist, delta, rest, ten_n);
    +
    +      return;
    +    }
    +
    +    pow10 /= 10;
    +    //
    +    //      pow10 = 10^(n-1) <= p1 < 10^n
    +    // Invariants restored.
    +  }
    +
    +  // 2)
    +  //
    +  // The digits of the integral part have been generated:
    +  //
    +  //      M+ = d[k-1]...d[1]d[0] + p2 * 2^e
    +  //         = buffer            + p2 * 2^e
    +  //
    +  // Now generate the digits of the fractional part p2 * 2^e.
    +  //
    +  // Note:
    +  // No decimal point is generated: the exponent is adjusted instead.
    +  //
    +  // p2 actually represents the fraction
    +  //
    +  //      p2 * 2^e
    +  //          = p2 / 2^-e
    +  //          = d[-1] / 10^1 + d[-2] / 10^2 + ...
    +  //
    +  // Now generate the digits d[-m] of p1 from left to right (m = 1,2,...)
    +  //
    +  //      p2 * 2^e = d[-1]d[-2]...d[-m] * 10^-m
    +  //                      + 10^-m * (d[-m-1] / 10^1 + d[-m-2] / 10^2 + ...)
    +  //
    +  // using
    +  //
    +  //      10^m * p2 = ((10^m * p2) div 2^-e) * 2^-e + ((10^m * p2) mod 2^-e)
    +  //                = (                   d) * 2^-e + (                   r)
    +  //
    +  // or
    +  //      10^m * p2 * 2^e = d + r * 2^e
    +  //
    +  // i.e.
    +  //
    +  //      M+ = buffer + p2 * 2^e
    +  //         = buffer + 10^-m * (d + r * 2^e)
    +  //         = (buffer * 10^m + d) * 10^-m + 10^-m * r * 2^e
    +  //
    +  // and stop as soon as 10^-m * r * 2^e <= delta * 2^e
    +
    +  int m = 0;
    +  for (;;) {
    +    // Invariant:
    +    //      M+ = buffer * 10^-m + 10^-m * (d[-m-1] / 10 + d[-m-2] / 10^2 + ...)
    +    //      * 2^e
    +    //         = buffer * 10^-m + 10^-m * (p2                                 )
    +    //         * 2^e = buffer * 10^-m + 10^-m * (1/10 * (10 * p2) ) * 2^e =
    +    //         buffer * 10^-m + 10^-m * (1/10 * ((10*p2 div 2^-e) * 2^-e +
    +    //         (10*p2 mod 2^-e)) * 2^e
    +    //
    +    p2 *= 10;
    +    const std::uint64_t d = p2 >> -one.e;     // d = (10 * p2) div 2^-e
    +    const std::uint64_t r = p2 & (one.f - 1); // r = (10 * p2) mod 2^-e
    +    //
    +    //      M+ = buffer * 10^-m + 10^-m * (1/10 * (d * 2^-e + r) * 2^e
    +    //         = buffer * 10^-m + 10^-m * (1/10 * (d + r * 2^e))
    +    //         = (buffer * 10 + d) * 10^(-m-1) + 10^(-m-1) * r * 2^e
    +    //
    +    buffer[length++] = static_cast('0' + d); // buffer := buffer * 10 + d
    +    //
    +    //      M+ = buffer * 10^(-m-1) + 10^(-m-1) * r * 2^e
    +    //
    +    p2 = r;
    +    m++;
    +    //
    +    //      M+ = buffer * 10^-m + 10^-m * p2 * 2^e
    +    // Invariant restored.
    +
    +    // Check if enough digits have been generated.
    +    //
    +    //      10^-m * p2 * 2^e <= delta * 2^e
    +    //              p2 * 2^e <= 10^m * delta * 2^e
    +    //                    p2 <= 10^m * delta
    +    delta *= 10;
    +    dist *= 10;
    +    if (p2 <= delta) {
    +      break;
    +    }
    +  }
    +
    +  // V = buffer * 10^-m, with M- <= V <= M+.
    +
    +  decimal_exponent -= m;
    +
    +  // 1 ulp in the decimal representation is now 10^-m.
    +  // Since delta and dist are now scaled by 10^m, we need to do the
    +  // same with ulp in order to keep the units in sync.
    +  //
    +  //      10^m * 10^-m = 1 = 2^-e * 2^e = ten_m * 2^e
    +  //
    +  const std::uint64_t ten_m = one.f;
    +  grisu2_round(buffer, length, dist, delta, p2, ten_m);
    +
    +  // By construction this algorithm generates the shortest possible decimal
    +  // number (Loitsch, Theorem 6.2) which rounds back to w.
    +  // For an input number of precision p, at least
    +  //
    +  //      N = 1 + ceil(p * log_10(2))
    +  //
    +  // decimal digits are sufficient to identify all binary floating-point
    +  // numbers (Matula, "In-and-Out conversions").
    +  // This implies that the algorithm does not produce more than N decimal
    +  // digits.
    +  //
    +  //      N = 17 for p = 53 (IEEE double precision)
    +  //      N = 9  for p = 24 (IEEE single precision)
    +}
    +
    +/*!
    +v = buf * 10^decimal_exponent
    +len is the length of the buffer (number of decimal digits)
    +The buffer must be large enough, i.e. >= max_digits10.
    +*/
    +inline void grisu2(char *buf, int &len, int &decimal_exponent, diyfp m_minus,
    +                   diyfp v, diyfp m_plus) {
    +
    +  //  --------(-----------------------+-----------------------)--------    (A)
    +  //          m-                      v                       m+
    +  //
    +  //  --------------------(-----------+-----------------------)--------    (B)
    +  //                      m-          v                       m+
    +  //
    +  // First scale v (and m- and m+) such that the exponent is in the range
    +  // [alpha, gamma].
    +
    +  const cached_power cached = get_cached_power_for_binary_exponent(m_plus.e);
    +
    +  const diyfp c_minus_k(cached.f, cached.e); // = c ~= 10^-k
    +
    +  // The exponent of the products is = v.e + c_minus_k.e + q and is in the range
    +  // [alpha,gamma]
    +  const diyfp w = diyfp::mul(v, c_minus_k);
    +  const diyfp w_minus = diyfp::mul(m_minus, c_minus_k);
    +  const diyfp w_plus = diyfp::mul(m_plus, c_minus_k);
    +
    +  //  ----(---+---)---------------(---+---)---------------(---+---)----
    +  //          w-                      w                       w+
    +  //          = c*m-                  = c*v                   = c*m+
    +  //
    +  // diyfp::mul rounds its result and c_minus_k is approximated too. w, w- and
    +  // w+ are now off by a small amount.
    +  // In fact:
    +  //
    +  //      w - v * 10^k < 1 ulp
    +  //
    +  // To account for this inaccuracy, add resp. subtract 1 ulp.
    +  //
    +  //  --------+---[---------------(---+---)---------------]---+--------
    +  //          w-  M-                  w                   M+  w+
    +  //
    +  // Now any number in [M-, M+] (bounds included) will round to w when input,
    +  // regardless of how the input rounding algorithm breaks ties.
    +  //
    +  // And digit_gen generates the shortest possible such number in [M-, M+].
    +  // Note that this does not mean that Grisu2 always generates the shortest
    +  // possible number in the interval (m-, m+).
    +  const diyfp M_minus(w_minus.f + 1, w_minus.e);
    +  const diyfp M_plus(w_plus.f - 1, w_plus.e);
    +
    +  decimal_exponent = -cached.k; // = -(-k) = k
    +
    +  grisu2_digit_gen(buf, len, decimal_exponent, M_minus, w, M_plus);
    +}
    +
    +/*!
    +v = buf * 10^decimal_exponent
    +len is the length of the buffer (number of decimal digits)
    +The buffer must be large enough, i.e. >= max_digits10.
    +*/
    +template 
    +void grisu2(char *buf, int &len, int &decimal_exponent, FloatType value) {
    +  static_assert(diyfp::kPrecision >= std::numeric_limits::digits + 3,
    +                "internal error: not enough precision");
    +
    +  // If the neighbors (and boundaries) of 'value' are always computed for
    +  // double-precision numbers, all float's can be recovered using strtod (and
    +  // strtof). However, the resulting decimal representations are not exactly
    +  // "short".
    +  //
    +  // The documentation for 'std::to_chars'
    +  // (https://en.cppreference.com/w/cpp/utility/to_chars) says "value is
    +  // converted to a string as if by std::sprintf in the default ("C") locale"
    +  // and since sprintf promotes float's to double's, I think this is exactly
    +  // what 'std::to_chars' does. On the other hand, the documentation for
    +  // 'std::to_chars' requires that "parsing the representation using the
    +  // corresponding std::from_chars function recovers value exactly". That
    +  // indicates that single precision floating-point numbers should be recovered
    +  // using 'std::strtof'.
    +  //
    +  // NB: If the neighbors are computed for single-precision numbers, there is a
    +  // single float
    +  //     (7.0385307e-26f) which can't be recovered using strtod. The resulting
    +  //     double precision value is off by 1 ulp.
    +#if 0
    +    const boundaries w = compute_boundaries(static_cast(value));
    +#else
    +  const boundaries w = compute_boundaries(value);
    +#endif
    +
    +  grisu2(buf, len, decimal_exponent, w.minus, w.w, w.plus);
    +}
    +
    +/*!
    +@brief appends a decimal representation of e to buf
    +@return a pointer to the element following the exponent.
    +@pre -1000 < e < 1000
    +*/
    +inline char *append_exponent(char *buf, int e) {
    +
    +  if (e < 0) {
    +    e = -e;
    +    *buf++ = '-';
    +  } else {
    +    *buf++ = '+';
    +  }
    +
    +  auto k = static_cast(e);
    +  if (k < 10) {
    +    // Always print at least two digits in the exponent.
    +    // This is for compatibility with printf("%g").
    +    *buf++ = '0';
    +    *buf++ = static_cast('0' + k);
    +  } else if (k < 100) {
    +    *buf++ = static_cast('0' + k / 10);
    +    k %= 10;
    +    *buf++ = static_cast('0' + k);
    +  } else {
    +    *buf++ = static_cast('0' + k / 100);
    +    k %= 100;
    +    *buf++ = static_cast('0' + k / 10);
    +    k %= 10;
    +    *buf++ = static_cast('0' + k);
    +  }
    +
    +  return buf;
    +}
    +
    +/*!
    +@brief prettify v = buf * 10^decimal_exponent
    +If v is in the range [10^min_exp, 10^max_exp) it will be printed in fixed-point
    +notation. Otherwise it will be printed in exponential notation.
    +@pre min_exp < 0
    +@pre max_exp > 0
    +*/
    +inline char *format_buffer(char *buf, int len, int decimal_exponent,
    +                           int min_exp, int max_exp) {
    +
    +  const int k = len;
    +  const int n = len + decimal_exponent;
    +
    +  // v = buf * 10^(n-k)
    +  // k is the length of the buffer (number of decimal digits)
    +  // n is the position of the decimal point relative to the start of the buffer.
    +
    +  if (k <= n && n <= max_exp) {
    +    // digits[000]
    +    // len <= max_exp + 2
    +
    +    std::memset(buf + k, '0', static_cast(n) - static_cast(k));
    +    // Make it look like a floating-point number (#362, #378)
    +    buf[n + 0] = '.';
    +    buf[n + 1] = '0';
    +    return buf + (static_cast(n)) + 2;
    +  }
    +
    +  if (0 < n && n <= max_exp) {
    +    // dig.its
    +    // len <= max_digits10 + 1
    +    std::memmove(buf + (static_cast(n) + 1), buf + n,
    +                 static_cast(k) - static_cast(n));
    +    buf[n] = '.';
    +    return buf + (static_cast(k) + 1U);
    +  }
    +
    +  if (min_exp < n && n <= 0) {
    +    // 0.[000]digits
    +    // len <= 2 + (-min_exp - 1) + max_digits10
    +
    +    std::memmove(buf + (2 + static_cast(-n)), buf,
    +                 static_cast(k));
    +    buf[0] = '0';
    +    buf[1] = '.';
    +    std::memset(buf + 2, '0', static_cast(-n));
    +    return buf + (2U + static_cast(-n) + static_cast(k));
    +  }
    +
    +  if (k == 1) {
    +    // dE+123
    +    // len <= 1 + 5
    +
    +    buf += 1;
    +  } else {
    +    // d.igitsE+123
    +    // len <= max_digits10 + 1 + 5
    +
    +    std::memmove(buf + 2, buf + 1, static_cast(k) - 1);
    +    buf[1] = '.';
    +    buf += 1 + static_cast(k);
    +  }
    +
    +  *buf++ = 'e';
    +  return append_exponent(buf, n - 1);
    +}
    +
    +} // namespace dtoa_impl
    +
    +/*!
    +The format of the resulting decimal representation is similar to printf's %g
    +format. Returns an iterator pointing past-the-end of the decimal representation.
    +@note The input number must be finite, i.e. NaN's and Inf's are not supported.
    +@note The buffer must be large enough.
    +@note The result is NOT null-terminated.
    +*/
    +char *to_chars(char *first, const char *last, double value) {
    +  static_cast(last); // maybe unused - fix warning
    +  bool negative = std::signbit(value);
    +  if (negative) {
    +    value = -value;
    +    *first++ = '-';
    +  }
    +
    +  if (value == 0) // +-0
    +  {
    +    *first++ = '0';
    +    // Make it look like a floating-point number (#362, #378)
    +    *first++ = '.';
    +    *first++ = '0';
    +    return first;
    +  }
    +  // Compute v = buffer * 10^decimal_exponent.
    +  // The decimal digits are stored in the buffer, which needs to be interpreted
    +  // as an unsigned decimal integer.
    +  // len is the length of the buffer, i.e. the number of decimal digits.
    +  int len = 0;
    +  int decimal_exponent = 0;
    +  dtoa_impl::grisu2(first, len, decimal_exponent, value);
    +  // Format the buffer like printf("%.*g", prec, value)
    +  constexpr int kMinExp = -4;
    +  constexpr int kMaxExp = std::numeric_limits::digits10;
    +
    +  return dtoa_impl::format_buffer(first, len, decimal_exponent, kMinExp,
    +                                  kMaxExp);
    +}
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_TO_CHARS_CPP
    +/* end file to_chars.cpp */
    +/* including from_chars.cpp: #include  */
    +/* begin file from_chars.cpp */
    +#ifndef SIMDJSON_SRC_FROM_CHARS_CPP
    +#define SIMDJSON_SRC_FROM_CHARS_CPP
    +
    +/* skipped duplicate #include  */
    +
    +#include 
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace internal {
    +
    +/**
    + * The code in the internal::from_chars function is meant to handle the floating-point number parsing
    + * when we have more than 19 digits in the decimal mantissa. This should only be seen
    + * in adversarial scenarios: we do not expect production systems to even produce
    + * such floating-point numbers.
    + *
    + * The parser is based on work by Nigel Tao (at https://github.com/google/wuffs/)
    + * who credits Ken Thompson for the design (via a reference to the Go source
    + * code). See
    + * https://github.com/google/wuffs/blob/aa46859ea40c72516deffa1b146121952d6dfd3b/internal/cgen/base/floatconv-submodule-data.c
    + * https://github.com/google/wuffs/blob/46cd8105f47ca07ae2ba8e6a7818ef9c0df6c152/internal/cgen/base/floatconv-submodule-code.c
    + * It is probably not very fast but it is a fallback that should almost never be
    + * called in real life. Google Wuffs is published under APL 2.0.
    + **/
    +
    +namespace {
    +constexpr uint32_t max_digits = 768;
    +constexpr int32_t decimal_point_range = 2047;
    +} // namespace
    +
    +struct adjusted_mantissa {
    +  uint64_t mantissa;
    +  int power2;
    +  adjusted_mantissa() : mantissa(0), power2(0) {}
    +};
    +
    +struct decimal {
    +  uint32_t num_digits;
    +  int32_t decimal_point;
    +  bool negative;
    +  bool truncated;
    +  uint8_t digits[max_digits];
    +};
    +
    +template  struct binary_format {
    +  static constexpr int mantissa_explicit_bits();
    +  static constexpr int minimum_exponent();
    +  static constexpr int infinite_power();
    +  static constexpr int sign_index();
    +};
    +
    +template <> constexpr int binary_format::mantissa_explicit_bits() {
    +  return 52;
    +}
    +
    +template <> constexpr int binary_format::minimum_exponent() {
    +  return -1023;
    +}
    +template <> constexpr int binary_format::infinite_power() {
    +  return 0x7FF;
    +}
    +
    +template <> constexpr int binary_format::sign_index() { return 63; }
    +
    +bool is_integer(char c)  noexcept  { return (c >= '0' && c <= '9'); }
    +
    +// This should always succeed since it follows a call to parse_number.
    +decimal parse_decimal(const char *&p) noexcept {
    +  decimal answer;
    +  answer.num_digits = 0;
    +  answer.decimal_point = 0;
    +  answer.truncated = false;
    +  answer.negative = (*p == '-');
    +  if ((*p == '-') || (*p == '+')) {
    +    ++p;
    +  }
    +
    +  while (*p == '0') {
    +    ++p;
    +  }
    +  while (is_integer(*p)) {
    +    if (answer.num_digits < max_digits) {
    +      answer.digits[answer.num_digits] = uint8_t(*p - '0');
    +    }
    +    answer.num_digits++;
    +    ++p;
    +  }
    +  if (*p == '.') {
    +    ++p;
    +    const char *first_after_period = p;
    +    // if we have not yet encountered a zero, we have to skip it as well
    +    if (answer.num_digits == 0) {
    +      // skip zeros
    +      while (*p == '0') {
    +        ++p;
    +      }
    +    }
    +    while (is_integer(*p)) {
    +      if (answer.num_digits < max_digits) {
    +        answer.digits[answer.num_digits] = uint8_t(*p - '0');
    +      }
    +      answer.num_digits++;
    +      ++p;
    +    }
    +    answer.decimal_point = int32_t(first_after_period - p);
    +  }
    +  if(answer.num_digits > 0) {
    +    const char *preverse = p - 1;
    +    int32_t trailing_zeros = 0;
    +    while ((*preverse == '0') || (*preverse == '.')) {
    +      if(*preverse == '0') { trailing_zeros++; };
    +      --preverse;
    +    }
    +    answer.decimal_point += int32_t(answer.num_digits);
    +    answer.num_digits -= uint32_t(trailing_zeros);
    +  }
    +  if(answer.num_digits > max_digits ) {
    +    answer.num_digits = max_digits;
    +    answer.truncated = true;
    +  }
    +  if (('e' == *p) || ('E' == *p)) {
    +    ++p;
    +    bool neg_exp = false;
    +    if ('-' == *p) {
    +      neg_exp = true;
    +      ++p;
    +    } else if ('+' == *p) {
    +      ++p;
    +    }
    +    int32_t exp_number = 0; // exponential part
    +    while (is_integer(*p)) {
    +      uint8_t digit = uint8_t(*p - '0');
    +      if (exp_number < 0x10000) {
    +        exp_number = 10 * exp_number + digit;
    +      }
    +      ++p;
    +    }
    +    answer.decimal_point += (neg_exp ? -exp_number : exp_number);
    +  }
    +  return answer;
    +}
    +
    +// This should always succeed since it follows a call to parse_number.
    +// Will not read at or beyond the "end" pointer.
    +decimal parse_decimal(const char *&p, const char * end) noexcept {
    +  decimal answer;
    +  answer.num_digits = 0;
    +  answer.decimal_point = 0;
    +  answer.truncated = false;
    +  if(p == end) { return answer; } // should never happen
    +  answer.negative = (*p == '-');
    +  if ((*p == '-') || (*p == '+')) {
    +    ++p;
    +  }
    +
    +  while ((p != end) && (*p == '0')) {
    +    ++p;
    +  }
    +  while ((p != end) && is_integer(*p)) {
    +    if (answer.num_digits < max_digits) {
    +      answer.digits[answer.num_digits] = uint8_t(*p - '0');
    +    }
    +    answer.num_digits++;
    +    ++p;
    +  }
    +  if ((p != end) && (*p == '.')) {
    +    ++p;
    +    if(p == end) { return answer; } // should never happen
    +    const char *first_after_period = p;
    +    // if we have not yet encountered a zero, we have to skip it as well
    +    if (answer.num_digits == 0) {
    +      // skip zeros
    +      while (*p == '0') {
    +        ++p;
    +      }
    +    }
    +    while ((p != end) && is_integer(*p)) {
    +      if (answer.num_digits < max_digits) {
    +        answer.digits[answer.num_digits] = uint8_t(*p - '0');
    +      }
    +      answer.num_digits++;
    +      ++p;
    +    }
    +    answer.decimal_point = int32_t(first_after_period - p);
    +  }
    +  if(answer.num_digits > 0) {
    +    const char *preverse = p - 1;
    +    int32_t trailing_zeros = 0;
    +    while ((*preverse == '0') || (*preverse == '.')) {
    +      if(*preverse == '0') { trailing_zeros++; };
    +      --preverse;
    +    }
    +    answer.decimal_point += int32_t(answer.num_digits);
    +    answer.num_digits -= uint32_t(trailing_zeros);
    +  }
    +  if(answer.num_digits > max_digits ) {
    +    answer.num_digits = max_digits;
    +    answer.truncated = true;
    +  }
    +  if ((p != end) && (('e' == *p) || ('E' == *p))) {
    +    ++p;
    +    if(p == end) { return answer; } // should never happen
    +    bool neg_exp = false;
    +    if ('-' == *p) {
    +      neg_exp = true;
    +      ++p;
    +    } else if ('+' == *p) {
    +      ++p;
    +    }
    +    int32_t exp_number = 0; // exponential part
    +    while ((p != end) && is_integer(*p)) {
    +      uint8_t digit = uint8_t(*p - '0');
    +      if (exp_number < 0x10000) {
    +        exp_number = 10 * exp_number + digit;
    +      }
    +      ++p;
    +    }
    +    answer.decimal_point += (neg_exp ? -exp_number : exp_number);
    +  }
    +  return answer;
    +}
    +
    +namespace {
    +
    +// remove all final zeroes
    +inline void trim(decimal &h) {
    +  while ((h.num_digits > 0) && (h.digits[h.num_digits - 1] == 0)) {
    +    h.num_digits--;
    +  }
    +}
    +
    +uint32_t number_of_digits_decimal_left_shift(decimal &h, uint32_t shift) {
    +  shift &= 63;
    +  const static uint16_t number_of_digits_decimal_left_shift_table[65] = {
    +      0x0000, 0x0800, 0x0801, 0x0803, 0x1006, 0x1009, 0x100D, 0x1812, 0x1817,
    +      0x181D, 0x2024, 0x202B, 0x2033, 0x203C, 0x2846, 0x2850, 0x285B, 0x3067,
    +      0x3073, 0x3080, 0x388E, 0x389C, 0x38AB, 0x38BB, 0x40CC, 0x40DD, 0x40EF,
    +      0x4902, 0x4915, 0x4929, 0x513E, 0x5153, 0x5169, 0x5180, 0x5998, 0x59B0,
    +      0x59C9, 0x61E3, 0x61FD, 0x6218, 0x6A34, 0x6A50, 0x6A6D, 0x6A8B, 0x72AA,
    +      0x72C9, 0x72E9, 0x7B0A, 0x7B2B, 0x7B4D, 0x8370, 0x8393, 0x83B7, 0x83DC,
    +      0x8C02, 0x8C28, 0x8C4F, 0x9477, 0x949F, 0x94C8, 0x9CF2, 0x051C, 0x051C,
    +      0x051C, 0x051C,
    +  };
    +  uint32_t x_a = number_of_digits_decimal_left_shift_table[shift];
    +  uint32_t x_b = number_of_digits_decimal_left_shift_table[shift + 1];
    +  uint32_t num_new_digits = x_a >> 11;
    +  uint32_t pow5_a = 0x7FF & x_a;
    +  uint32_t pow5_b = 0x7FF & x_b;
    +  const static uint8_t
    +      number_of_digits_decimal_left_shift_table_powers_of_5[0x051C] = {
    +          5, 2, 5, 1, 2, 5, 6, 2, 5, 3, 1, 2, 5, 1, 5, 6, 2, 5, 7, 8, 1, 2, 5,
    +          3, 9, 0, 6, 2, 5, 1, 9, 5, 3, 1, 2, 5, 9, 7, 6, 5, 6, 2, 5, 4, 8, 8,
    +          2, 8, 1, 2, 5, 2, 4, 4, 1, 4, 0, 6, 2, 5, 1, 2, 2, 0, 7, 0, 3, 1, 2,
    +          5, 6, 1, 0, 3, 5, 1, 5, 6, 2, 5, 3, 0, 5, 1, 7, 5, 7, 8, 1, 2, 5, 1,
    +          5, 2, 5, 8, 7, 8, 9, 0, 6, 2, 5, 7, 6, 2, 9, 3, 9, 4, 5, 3, 1, 2, 5,
    +          3, 8, 1, 4, 6, 9, 7, 2, 6, 5, 6, 2, 5, 1, 9, 0, 7, 3, 4, 8, 6, 3, 2,
    +          8, 1, 2, 5, 9, 5, 3, 6, 7, 4, 3, 1, 6, 4, 0, 6, 2, 5, 4, 7, 6, 8, 3,
    +          7, 1, 5, 8, 2, 0, 3, 1, 2, 5, 2, 3, 8, 4, 1, 8, 5, 7, 9, 1, 0, 1, 5,
    +          6, 2, 5, 1, 1, 9, 2, 0, 9, 2, 8, 9, 5, 5, 0, 7, 8, 1, 2, 5, 5, 9, 6,
    +          0, 4, 6, 4, 4, 7, 7, 5, 3, 9, 0, 6, 2, 5, 2, 9, 8, 0, 2, 3, 2, 2, 3,
    +          8, 7, 6, 9, 5, 3, 1, 2, 5, 1, 4, 9, 0, 1, 1, 6, 1, 1, 9, 3, 8, 4, 7,
    +          6, 5, 6, 2, 5, 7, 4, 5, 0, 5, 8, 0, 5, 9, 6, 9, 2, 3, 8, 2, 8, 1, 2,
    +          5, 3, 7, 2, 5, 2, 9, 0, 2, 9, 8, 4, 6, 1, 9, 1, 4, 0, 6, 2, 5, 1, 8,
    +          6, 2, 6, 4, 5, 1, 4, 9, 2, 3, 0, 9, 5, 7, 0, 3, 1, 2, 5, 9, 3, 1, 3,
    +          2, 2, 5, 7, 4, 6, 1, 5, 4, 7, 8, 5, 1, 5, 6, 2, 5, 4, 6, 5, 6, 6, 1,
    +          2, 8, 7, 3, 0, 7, 7, 3, 9, 2, 5, 7, 8, 1, 2, 5, 2, 3, 2, 8, 3, 0, 6,
    +          4, 3, 6, 5, 3, 8, 6, 9, 6, 2, 8, 9, 0, 6, 2, 5, 1, 1, 6, 4, 1, 5, 3,
    +          2, 1, 8, 2, 6, 9, 3, 4, 8, 1, 4, 4, 5, 3, 1, 2, 5, 5, 8, 2, 0, 7, 6,
    +          6, 0, 9, 1, 3, 4, 6, 7, 4, 0, 7, 2, 2, 6, 5, 6, 2, 5, 2, 9, 1, 0, 3,
    +          8, 3, 0, 4, 5, 6, 7, 3, 3, 7, 0, 3, 6, 1, 3, 2, 8, 1, 2, 5, 1, 4, 5,
    +          5, 1, 9, 1, 5, 2, 2, 8, 3, 6, 6, 8, 5, 1, 8, 0, 6, 6, 4, 0, 6, 2, 5,
    +          7, 2, 7, 5, 9, 5, 7, 6, 1, 4, 1, 8, 3, 4, 2, 5, 9, 0, 3, 3, 2, 0, 3,
    +          1, 2, 5, 3, 6, 3, 7, 9, 7, 8, 8, 0, 7, 0, 9, 1, 7, 1, 2, 9, 5, 1, 6,
    +          6, 0, 1, 5, 6, 2, 5, 1, 8, 1, 8, 9, 8, 9, 4, 0, 3, 5, 4, 5, 8, 5, 6,
    +          4, 7, 5, 8, 3, 0, 0, 7, 8, 1, 2, 5, 9, 0, 9, 4, 9, 4, 7, 0, 1, 7, 7,
    +          2, 9, 2, 8, 2, 3, 7, 9, 1, 5, 0, 3, 9, 0, 6, 2, 5, 4, 5, 4, 7, 4, 7,
    +          3, 5, 0, 8, 8, 6, 4, 6, 4, 1, 1, 8, 9, 5, 7, 5, 1, 9, 5, 3, 1, 2, 5,
    +          2, 2, 7, 3, 7, 3, 6, 7, 5, 4, 4, 3, 2, 3, 2, 0, 5, 9, 4, 7, 8, 7, 5,
    +          9, 7, 6, 5, 6, 2, 5, 1, 1, 3, 6, 8, 6, 8, 3, 7, 7, 2, 1, 6, 1, 6, 0,
    +          2, 9, 7, 3, 9, 3, 7, 9, 8, 8, 2, 8, 1, 2, 5, 5, 6, 8, 4, 3, 4, 1, 8,
    +          8, 6, 0, 8, 0, 8, 0, 1, 4, 8, 6, 9, 6, 8, 9, 9, 4, 1, 4, 0, 6, 2, 5,
    +          2, 8, 4, 2, 1, 7, 0, 9, 4, 3, 0, 4, 0, 4, 0, 0, 7, 4, 3, 4, 8, 4, 4,
    +          9, 7, 0, 7, 0, 3, 1, 2, 5, 1, 4, 2, 1, 0, 8, 5, 4, 7, 1, 5, 2, 0, 2,
    +          0, 0, 3, 7, 1, 7, 4, 2, 2, 4, 8, 5, 3, 5, 1, 5, 6, 2, 5, 7, 1, 0, 5,
    +          4, 2, 7, 3, 5, 7, 6, 0, 1, 0, 0, 1, 8, 5, 8, 7, 1, 1, 2, 4, 2, 6, 7,
    +          5, 7, 8, 1, 2, 5, 3, 5, 5, 2, 7, 1, 3, 6, 7, 8, 8, 0, 0, 5, 0, 0, 9,
    +          2, 9, 3, 5, 5, 6, 2, 1, 3, 3, 7, 8, 9, 0, 6, 2, 5, 1, 7, 7, 6, 3, 5,
    +          6, 8, 3, 9, 4, 0, 0, 2, 5, 0, 4, 6, 4, 6, 7, 7, 8, 1, 0, 6, 6, 8, 9,
    +          4, 5, 3, 1, 2, 5, 8, 8, 8, 1, 7, 8, 4, 1, 9, 7, 0, 0, 1, 2, 5, 2, 3,
    +          2, 3, 3, 8, 9, 0, 5, 3, 3, 4, 4, 7, 2, 6, 5, 6, 2, 5, 4, 4, 4, 0, 8,
    +          9, 2, 0, 9, 8, 5, 0, 0, 6, 2, 6, 1, 6, 1, 6, 9, 4, 5, 2, 6, 6, 7, 2,
    +          3, 6, 3, 2, 8, 1, 2, 5, 2, 2, 2, 0, 4, 4, 6, 0, 4, 9, 2, 5, 0, 3, 1,
    +          3, 0, 8, 0, 8, 4, 7, 2, 6, 3, 3, 3, 6, 1, 8, 1, 6, 4, 0, 6, 2, 5, 1,
    +          1, 1, 0, 2, 2, 3, 0, 2, 4, 6, 2, 5, 1, 5, 6, 5, 4, 0, 4, 2, 3, 6, 3,
    +          1, 6, 6, 8, 0, 9, 0, 8, 2, 0, 3, 1, 2, 5, 5, 5, 5, 1, 1, 1, 5, 1, 2,
    +          3, 1, 2, 5, 7, 8, 2, 7, 0, 2, 1, 1, 8, 1, 5, 8, 3, 4, 0, 4, 5, 4, 1,
    +          0, 1, 5, 6, 2, 5, 2, 7, 7, 5, 5, 5, 7, 5, 6, 1, 5, 6, 2, 8, 9, 1, 3,
    +          5, 1, 0, 5, 9, 0, 7, 9, 1, 7, 0, 2, 2, 7, 0, 5, 0, 7, 8, 1, 2, 5, 1,
    +          3, 8, 7, 7, 7, 8, 7, 8, 0, 7, 8, 1, 4, 4, 5, 6, 7, 5, 5, 2, 9, 5, 3,
    +          9, 5, 8, 5, 1, 1, 3, 5, 2, 5, 3, 9, 0, 6, 2, 5, 6, 9, 3, 8, 8, 9, 3,
    +          9, 0, 3, 9, 0, 7, 2, 2, 8, 3, 7, 7, 6, 4, 7, 6, 9, 7, 9, 2, 5, 5, 6,
    +          7, 6, 2, 6, 9, 5, 3, 1, 2, 5, 3, 4, 6, 9, 4, 4, 6, 9, 5, 1, 9, 5, 3,
    +          6, 1, 4, 1, 8, 8, 8, 2, 3, 8, 4, 8, 9, 6, 2, 7, 8, 3, 8, 1, 3, 4, 7,
    +          6, 5, 6, 2, 5, 1, 7, 3, 4, 7, 2, 3, 4, 7, 5, 9, 7, 6, 8, 0, 7, 0, 9,
    +          4, 4, 1, 1, 9, 2, 4, 4, 8, 1, 3, 9, 1, 9, 0, 6, 7, 3, 8, 2, 8, 1, 2,
    +          5, 8, 6, 7, 3, 6, 1, 7, 3, 7, 9, 8, 8, 4, 0, 3, 5, 4, 7, 2, 0, 5, 9,
    +          6, 2, 2, 4, 0, 6, 9, 5, 9, 5, 3, 3, 6, 9, 1, 4, 0, 6, 2, 5,
    +      };
    +  const uint8_t *pow5 =
    +      &number_of_digits_decimal_left_shift_table_powers_of_5[pow5_a];
    +  uint32_t i = 0;
    +  uint32_t n = pow5_b - pow5_a;
    +  for (; i < n; i++) {
    +    if (i >= h.num_digits) {
    +      return num_new_digits - 1;
    +    } else if (h.digits[i] == pow5[i]) {
    +      continue;
    +    } else if (h.digits[i] < pow5[i]) {
    +      return num_new_digits - 1;
    +    } else {
    +      return num_new_digits;
    +    }
    +  }
    +  return num_new_digits;
    +}
    +
    +} // end of anonymous namespace
    +
    +uint64_t round(decimal &h) {
    +  if ((h.num_digits == 0) || (h.decimal_point < 0)) {
    +    return 0;
    +  } else if (h.decimal_point > 18) {
    +    return UINT64_MAX;
    +  }
    +  // at this point, we know that h.decimal_point >= 0
    +  uint32_t dp = uint32_t(h.decimal_point);
    +  uint64_t n = 0;
    +  for (uint32_t i = 0; i < dp; i++) {
    +    n = (10 * n) + ((i < h.num_digits) ? h.digits[i] : 0);
    +  }
    +  bool round_up = false;
    +  if (dp < h.num_digits) {
    +    round_up = h.digits[dp] >= 5; // normally, we round up
    +    // but we may need to round to even!
    +    if ((h.digits[dp] == 5) && (dp + 1 == h.num_digits)) {
    +      round_up = h.truncated || ((dp > 0) && (1 & h.digits[dp - 1]));
    +    }
    +  }
    +  if (round_up) {
    +    n++;
    +  }
    +  return n;
    +}
    +
    +// computes h * 2^-shift
    +void decimal_left_shift(decimal &h, uint32_t shift) {
    +  if (h.num_digits == 0) {
    +    return;
    +  }
    +  uint32_t num_new_digits = number_of_digits_decimal_left_shift(h, shift);
    +  int32_t read_index = int32_t(h.num_digits - 1);
    +  uint32_t write_index = h.num_digits - 1 + num_new_digits;
    +  uint64_t n = 0;
    +
    +  while (read_index >= 0) {
    +    n += uint64_t(h.digits[read_index]) << shift;
    +    uint64_t quotient = n / 10;
    +    uint64_t remainder = n - (10 * quotient);
    +    if (write_index < max_digits) {
    +      h.digits[write_index] = uint8_t(remainder);
    +    } else if (remainder > 0) {
    +      h.truncated = true;
    +    }
    +    n = quotient;
    +    write_index--;
    +    read_index--;
    +  }
    +  while (n > 0) {
    +    uint64_t quotient = n / 10;
    +    uint64_t remainder = n - (10 * quotient);
    +    if (write_index < max_digits) {
    +      h.digits[write_index] = uint8_t(remainder);
    +    } else if (remainder > 0) {
    +      h.truncated = true;
    +    }
    +    n = quotient;
    +    write_index--;
    +  }
    +  h.num_digits += num_new_digits;
    +  if (h.num_digits > max_digits) {
    +    h.num_digits = max_digits;
    +  }
    +  h.decimal_point += int32_t(num_new_digits);
    +  trim(h);
    +}
    +
    +// computes h * 2^shift
    +void decimal_right_shift(decimal &h, uint32_t shift) {
    +  uint32_t read_index = 0;
    +  uint32_t write_index = 0;
    +
    +  uint64_t n = 0;
    +
    +  while ((n >> shift) == 0) {
    +    if (read_index < h.num_digits) {
    +      n = (10 * n) + h.digits[read_index++];
    +    } else if (n == 0) {
    +      return;
    +    } else {
    +      while ((n >> shift) == 0) {
    +        n = 10 * n;
    +        read_index++;
    +      }
    +      break;
    +    }
    +  }
    +  h.decimal_point -= int32_t(read_index - 1);
    +  if (h.decimal_point < -decimal_point_range) { // it is zero
    +    h.num_digits = 0;
    +    h.decimal_point = 0;
    +    h.negative = false;
    +    h.truncated = false;
    +    return;
    +  }
    +  uint64_t mask = (uint64_t(1) << shift) - 1;
    +  while (read_index < h.num_digits) {
    +    uint8_t new_digit = uint8_t(n >> shift);
    +    n = (10 * (n & mask)) + h.digits[read_index++];
    +    h.digits[write_index++] = new_digit;
    +  }
    +  while (n > 0) {
    +    uint8_t new_digit = uint8_t(n >> shift);
    +    n = 10 * (n & mask);
    +    if (write_index < max_digits) {
    +      h.digits[write_index++] = new_digit;
    +    } else if (new_digit > 0) {
    +      h.truncated = true;
    +    }
    +  }
    +  h.num_digits = write_index;
    +  trim(h);
    +}
    +
    +template  adjusted_mantissa compute_float(decimal &d) {
    +  adjusted_mantissa answer;
    +  if (d.num_digits == 0) {
    +    // should be zero
    +    answer.power2 = 0;
    +    answer.mantissa = 0;
    +    return answer;
    +  }
    +  // At this point, going further, we can assume that d.num_digits > 0.
    +  // We want to guard against excessive decimal point values because
    +  // they can result in long running times. Indeed, we do
    +  // shifts by at most 60 bits. We have that log(10**400)/log(2**60) ~= 22
    +  // which is fine, but log(10**299995)/log(2**60) ~= 16609 which is not
    +  // fine (runs for a long time).
    +  //
    +  if(d.decimal_point < -324) {
    +    // We have something smaller than 1e-324 which is always zero
    +    // in binary64 and binary32.
    +    // It should be zero.
    +    answer.power2 = 0;
    +    answer.mantissa = 0;
    +    return answer;
    +  } else if(d.decimal_point >= 310) {
    +    // We have something at least as large as 0.1e310 which is
    +    // always infinite.
    +    answer.power2 = binary::infinite_power();
    +    answer.mantissa = 0;
    +    return answer;
    +  }
    +
    +  static const uint32_t max_shift = 60;
    +  static const uint32_t num_powers = 19;
    +  static const uint8_t powers[19] = {
    +      0,  3,  6,  9,  13, 16, 19, 23, 26, 29, //
    +      33, 36, 39, 43, 46, 49, 53, 56, 59,     //
    +  };
    +  int32_t exp2 = 0;
    +  while (d.decimal_point > 0) {
    +    uint32_t n = uint32_t(d.decimal_point);
    +    uint32_t shift = (n < num_powers) ? powers[n] : max_shift;
    +    decimal_right_shift(d, shift);
    +    if (d.decimal_point < -decimal_point_range) {
    +      // should be zero
    +      answer.power2 = 0;
    +      answer.mantissa = 0;
    +      return answer;
    +    }
    +    exp2 += int32_t(shift);
    +  }
    +  // We shift left toward [1/2 ... 1].
    +  while (d.decimal_point <= 0) {
    +    uint32_t shift;
    +    if (d.decimal_point == 0) {
    +      if (d.digits[0] >= 5) {
    +        break;
    +      }
    +      shift = (d.digits[0] < 2) ? 2 : 1;
    +    } else {
    +      uint32_t n = uint32_t(-d.decimal_point);
    +      shift = (n < num_powers) ? powers[n] : max_shift;
    +    }
    +    decimal_left_shift(d, shift);
    +    if (d.decimal_point > decimal_point_range) {
    +      // we want to get infinity:
    +      answer.power2 = 0xFF;
    +      answer.mantissa = 0;
    +      return answer;
    +    }
    +    exp2 -= int32_t(shift);
    +  }
    +  // We are now in the range [1/2 ... 1] but the binary format uses [1 ... 2].
    +  exp2--;
    +  constexpr int32_t minimum_exponent = binary::minimum_exponent();
    +  while ((minimum_exponent + 1) > exp2) {
    +    uint32_t n = uint32_t((minimum_exponent + 1) - exp2);
    +    if (n > max_shift) {
    +      n = max_shift;
    +    }
    +    decimal_right_shift(d, n);
    +    exp2 += int32_t(n);
    +  }
    +  if ((exp2 - minimum_exponent) >= binary::infinite_power()) {
    +    answer.power2 = binary::infinite_power();
    +    answer.mantissa = 0;
    +    return answer;
    +  }
    +
    +  const int mantissa_size_in_bits = binary::mantissa_explicit_bits() + 1;
    +  decimal_left_shift(d, mantissa_size_in_bits);
    +
    +  uint64_t mantissa = round(d);
    +  // It is possible that we have an overflow, in which case we need
    +  // to shift back.
    +  if (mantissa >= (uint64_t(1) << mantissa_size_in_bits)) {
    +    decimal_right_shift(d, 1);
    +    exp2 += 1;
    +    mantissa = round(d);
    +    if ((exp2 - minimum_exponent) >= binary::infinite_power()) {
    +      answer.power2 = binary::infinite_power();
    +      answer.mantissa = 0;
    +      return answer;
    +    }
    +  }
    +  answer.power2 = exp2 - binary::minimum_exponent();
    +  if (mantissa < (uint64_t(1) << binary::mantissa_explicit_bits())) {
    +    answer.power2--;
    +  }
    +  answer.mantissa =
    +      mantissa & ((uint64_t(1) << binary::mantissa_explicit_bits()) - 1);
    +  return answer;
    +}
    +
    +template 
    +adjusted_mantissa parse_long_mantissa(const char *first) {
    +  decimal d = parse_decimal(first);
    +  return compute_float(d);
    +}
    +
    +template 
    +adjusted_mantissa parse_long_mantissa(const char *first, const char *end) {
    +  decimal d = parse_decimal(first, end);
    +  return compute_float(d);
    +}
    +
    +double from_chars(const char *first) noexcept {
    +  bool negative = first[0] == '-';
    +  if (negative) {
    +    first++;
    +  }
    +  adjusted_mantissa am = parse_long_mantissa>(first);
    +  uint64_t word = am.mantissa;
    +  word |= uint64_t(am.power2)
    +          << binary_format::mantissa_explicit_bits();
    +  word = negative ? word | (uint64_t(1) << binary_format::sign_index())
    +                  : word;
    +  double value;
    +  std::memcpy(&value, &word, sizeof(double));
    +  return value;
    +}
    +
    +
    +double from_chars(const char *first, const char *end) noexcept {
    +  bool negative = first[0] == '-';
    +  if (negative) {
    +    first++;
    +  }
    +  adjusted_mantissa am = parse_long_mantissa>(first, end);
    +  uint64_t word = am.mantissa;
    +  word |= uint64_t(am.power2)
    +          << binary_format::mantissa_explicit_bits();
    +  word = negative ? word | (uint64_t(1) << binary_format::sign_index())
    +                  : word;
    +  double value;
    +  std::memcpy(&value, &word, sizeof(double));
    +  return value;
    +}
    +
    +} // internal
    +} // simdjson
    +
    +#endif // SIMDJSON_SRC_FROM_CHARS_CPP
    +/* end file from_chars.cpp */
    +/* including internal/error_tables.cpp: #include  */
    +/* begin file internal/error_tables.cpp */
    +#ifndef SIMDJSON_SRC_ERROR_TABLES_CPP
    +#define SIMDJSON_SRC_ERROR_TABLES_CPP
    +
    +/* including simdjson/internal/jsoncharutils_tables.h: #include  */
    +/* begin file simdjson/internal/jsoncharutils_tables.h */
    +#ifndef SIMDJSON_INTERNAL_JSONCHARUTILS_TABLES_H
    +#define SIMDJSON_INTERNAL_JSONCHARUTILS_TABLES_H
    +
    +/* skipped duplicate #include "simdjson/base.h" */
    +
    +#ifdef JSON_TEST_STRINGS
    +void found_string(const uint8_t *buf, const uint8_t *parsed_begin,
    +                  const uint8_t *parsed_end);
    +void found_bad_string(const uint8_t *buf);
    +#endif
    +
    +namespace simdjson {
    +namespace internal {
    +// structural chars here are
    +// they are { 0x7b } 0x7d : 0x3a [ 0x5b ] 0x5d , 0x2c (and NULL)
    +// we are also interested in the four whitespace characters
    +// space 0x20, linefeed 0x0a, horizontal tab 0x09 and carriage return 0x0d
    +
    +extern SIMDJSON_DLLIMPORTEXPORT const bool structural_or_whitespace_negated[256];
    +extern SIMDJSON_DLLIMPORTEXPORT const bool structural_or_whitespace[256];
    +extern SIMDJSON_DLLIMPORTEXPORT const uint32_t digit_to_val32[886];
    +
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_INTERNAL_JSONCHARUTILS_TABLES_H
    +/* end file simdjson/internal/jsoncharutils_tables.h */
    +/* including simdjson/error-inl.h: #include  */
    +/* begin file simdjson/error-inl.h */
    +#ifndef SIMDJSON_ERROR_INL_H
    +#define SIMDJSON_ERROR_INL_H
    +
    +/* skipped duplicate #include "simdjson/error.h" */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace internal {
    +  // We store the error code so we can validate the error message is associated with the right code
    +  struct error_code_info {
    +    error_code code;
    +    const char* message; // do not use a fancy std::string where a simple C string will do (no alloc, no destructor)
    +  };
    +  // These MUST match the codes in error_code. We check this constraint in basictests.
    +  extern SIMDJSON_DLLIMPORTEXPORT const error_code_info error_codes[];
    +} // namespace internal
    +
    +
    +inline const char *error_message(error_code error) noexcept {
    +  // If you're using error_code, we're trusting you got it from the enum.
    +  return internal::error_codes[int(error)].message;
    +}
    +
    +// deprecated function
    +#ifndef SIMDJSON_DISABLE_DEPRECATED_API
    +inline const std::string error_message(int error) noexcept {
    +  if (error < 0 || error >= error_code::NUM_ERROR_CODES) {
    +    return internal::error_codes[UNEXPECTED_ERROR].message;
    +  }
    +  return internal::error_codes[error].message;
    +}
    +#endif // SIMDJSON_DISABLE_DEPRECATED_API
    +
    +inline std::ostream& operator<<(std::ostream& out, error_code error) noexcept {
    +  return out << error_message(error);
    +}
    +
    +namespace internal {
    +
    +//
    +// internal::simdjson_result_base inline implementation
    +//
    +
    +template
    +simdjson_inline void simdjson_result_base::tie(T &value, error_code &error) && noexcept {
    +  error = this->second;
    +  if (!error) {
    +    value = std::forward>(*this).first;
    +  }
    +}
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code simdjson_result_base::get(T &value) && noexcept {
    +  error_code error;
    +  std::forward>(*this).tie(value, error);
    +  return error;
    +}
    +
    +template
    +simdjson_inline error_code simdjson_result_base::error() const noexcept {
    +  return this->second;
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline T& simdjson_result_base::value() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& simdjson_result_base::value() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +template
    +simdjson_inline T&& simdjson_result_base::take_value() && noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline simdjson_result_base::operator T&&() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline const T& simdjson_result_base::value_unsafe() const& noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& simdjson_result_base::value_unsafe() && noexcept {
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline simdjson_result_base::simdjson_result_base(T &&value, error_code error) noexcept
    +    : std::pair(std::forward(value), error) {}
    +template
    +simdjson_inline simdjson_result_base::simdjson_result_base(error_code error) noexcept
    +    : simdjson_result_base(T{}, error) {}
    +template
    +simdjson_inline simdjson_result_base::simdjson_result_base(T &&value) noexcept
    +    : simdjson_result_base(std::forward(value), SUCCESS) {}
    +template
    +simdjson_inline simdjson_result_base::simdjson_result_base() noexcept
    +    : simdjson_result_base(T{}, UNINITIALIZED) {}
    +
    +} // namespace internal
    +
    +///
    +/// simdjson_result inline implementation
    +///
    +
    +template
    +simdjson_inline void simdjson_result::tie(T &value, error_code &error) && noexcept {
    +  std::forward>(*this).tie(value, error);
    +}
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &value) && noexcept {
    +  return std::forward>(*this).get(value);
    +}
    +
    +template
    +simdjson_inline error_code simdjson_result::error() const noexcept {
    +  return internal::simdjson_result_base::error();
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline T& simdjson_result::value() & noexcept(false) {
    +  return internal::simdjson_result_base::value();
    +}
    +
    +template
    +simdjson_inline T&& simdjson_result::value() && noexcept(false) {
    +  return std::forward>(*this).value();
    +}
    +
    +template
    +simdjson_inline T&& simdjson_result::take_value() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +template
    +simdjson_inline simdjson_result::operator T&&() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline const T& simdjson_result::value_unsafe() const& noexcept {
    +  return internal::simdjson_result_base::value_unsafe();
    +}
    +
    +template
    +simdjson_inline T&& simdjson_result::value_unsafe() && noexcept {
    +  return std::forward>(*this).value_unsafe();
    +}
    +
    +template
    +simdjson_inline simdjson_result::simdjson_result(T &&value, error_code error) noexcept
    +    : internal::simdjson_result_base(std::forward(value), error) {}
    +template
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : internal::simdjson_result_base(error) {}
    +template
    +simdjson_inline simdjson_result::simdjson_result(T &&value) noexcept
    +    : internal::simdjson_result_base(std::forward(value)) {}
    +template
    +simdjson_inline simdjson_result::simdjson_result() noexcept
    +    : internal::simdjson_result_base() {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ERROR_INL_H
    +/* end file simdjson/error-inl.h */
    +
    +namespace simdjson {
    +namespace internal {
    +
    +  SIMDJSON_DLLIMPORTEXPORT const error_code_info error_codes[] {
    +    { SUCCESS, "SUCCESS: No error" },
    +    { CAPACITY, "CAPACITY: This parser can't support a document that big" },
    +    { MEMALLOC, "MEMALLOC: Error allocating memory, we're most likely out of memory" },
    +    { TAPE_ERROR, "TAPE_ERROR: The JSON document has an improper structure: missing or superfluous commas, braces, missing keys, etc." },
    +    { DEPTH_ERROR, "DEPTH_ERROR: The JSON document was too deep (too many nested objects and arrays)" },
    +    { STRING_ERROR, "STRING_ERROR: Problem while parsing a string" },
    +    { T_ATOM_ERROR, "T_ATOM_ERROR: Problem while parsing an atom starting with the letter 't'" },
    +    { F_ATOM_ERROR, "F_ATOM_ERROR: Problem while parsing an atom starting with the letter 'f'" },
    +    { N_ATOM_ERROR, "N_ATOM_ERROR: Problem while parsing an atom starting with the letter 'n'" },
    +    { NUMBER_ERROR, "NUMBER_ERROR: Problem while parsing a number" },
    +    { UTF8_ERROR, "UTF8_ERROR: The input is not valid UTF-8" },
    +    { UNINITIALIZED, "UNINITIALIZED: Uninitialized" },
    +    { EMPTY, "EMPTY: no JSON found" },
    +    { UNESCAPED_CHARS, "UNESCAPED_CHARS: Within strings, some characters must be escaped, we found unescaped characters" },
    +    { UNCLOSED_STRING, "UNCLOSED_STRING: A string is opened, but never closed." },
    +    { UNSUPPORTED_ARCHITECTURE, "UNSUPPORTED_ARCHITECTURE: simdjson does not have an implementation supported by this CPU architecture. Please report this error to the core team as it should never happen." },
    +    { INCORRECT_TYPE, "INCORRECT_TYPE: The JSON element does not have the requested type." },
    +    { NUMBER_OUT_OF_RANGE, "NUMBER_OUT_OF_RANGE: The JSON number is too large or too small to fit within the requested type." },
    +    { INDEX_OUT_OF_BOUNDS, "INDEX_OUT_OF_BOUNDS: Attempted to access an element of a JSON array that is beyond its length." },
    +    { NO_SUCH_FIELD, "NO_SUCH_FIELD: The JSON field referenced does not exist in this object." },
    +    { IO_ERROR, "IO_ERROR: Error reading the file." },
    +    { INVALID_JSON_POINTER, "INVALID_JSON_POINTER: Invalid JSON pointer syntax." },
    +    { INVALID_URI_FRAGMENT, "INVALID_URI_FRAGMENT: Invalid URI fragment syntax." },
    +    { UNEXPECTED_ERROR, "UNEXPECTED_ERROR: Unexpected error, consider reporting this problem as you may have found a bug in simdjson" },
    +    { PARSER_IN_USE, "PARSER_IN_USE: Cannot parse a new document while a document is still in use." },
    +    { OUT_OF_ORDER_ITERATION, "OUT_OF_ORDER_ITERATION: Objects and arrays can only be iterated when they are first encountered." },
    +    { INSUFFICIENT_PADDING, "INSUFFICIENT_PADDING: simdjson requires the input JSON string to have at least SIMDJSON_PADDING extra bytes allocated, beyond the string's length. Consider using the simdjson::padded_string class if needed." },
    +    { INCOMPLETE_ARRAY_OR_OBJECT, "INCOMPLETE_ARRAY_OR_OBJECT: JSON document ended early in the middle of an object or array." },
    +    { SCALAR_DOCUMENT_AS_VALUE, "SCALAR_DOCUMENT_AS_VALUE: A JSON document made of a scalar (number, Boolean, null or string) is treated as a value. Use get_bool(), get_double(), etc. on the document instead. "},
    +    { OUT_OF_BOUNDS, "OUT_OF_BOUNDS: Attempt to access location outside of document."},
    +    { TRAILING_CONTENT, "TRAILING_CONTENT: Unexpected trailing content in the JSON input."}
    +  }; // error_messages[]
    +
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_ERROR_TABLES_CPP
    +/* end file internal/error_tables.cpp */
    +/* including internal/jsoncharutils_tables.cpp: #include  */
    +/* begin file internal/jsoncharutils_tables.cpp */
    +#ifndef SIMDJSON_SRC_JSONCHARUTILS_TABLES_CPP
    +#define SIMDJSON_SRC_JSONCHARUTILS_TABLES_CPP
    +
    +/* skipped duplicate #include  */
    +
    +namespace simdjson {
    +namespace internal {
    +
    +// structural chars here are
    +// they are { 0x7b } 0x7d : 0x3a [ 0x5b ] 0x5d , 0x2c (and NULL)
    +// we are also interested in the four whitespace characters
    +// space 0x20, linefeed 0x0a, horizontal tab 0x09 and carriage return 0x0d
    +
    +SIMDJSON_DLLIMPORTEXPORT const bool structural_or_whitespace_negated[256] = {
    +    1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
    +    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    +    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1,
    +
    +    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    +    1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    +    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1,
    +
    +    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    +    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    +    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    +
    +    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    +    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    +    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
    +
    +SIMDJSON_DLLIMPORTEXPORT const bool structural_or_whitespace[256] = {
    +    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +    0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
    +    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0,
    +    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +    0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    +
    +SIMDJSON_DLLIMPORTEXPORT const uint32_t digit_to_val32[886] = {
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0x0,        0x1,        0x2,        0x3,        0x4,        0x5,
    +    0x6,        0x7,        0x8,        0x9,        0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xa,
    +    0xb,        0xc,        0xd,        0xe,        0xf,        0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xa,        0xb,        0xc,        0xd,        0xe,
    +    0xf,        0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0x0,        0x10,       0x20,       0x30,       0x40,       0x50,
    +    0x60,       0x70,       0x80,       0x90,       0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xa0,
    +    0xb0,       0xc0,       0xd0,       0xe0,       0xf0,       0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xa0,       0xb0,       0xc0,       0xd0,       0xe0,
    +    0xf0,       0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0x0,        0x100,      0x200,      0x300,      0x400,      0x500,
    +    0x600,      0x700,      0x800,      0x900,      0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xa00,
    +    0xb00,      0xc00,      0xd00,      0xe00,      0xf00,      0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xa00,      0xb00,      0xc00,      0xd00,      0xe00,
    +    0xf00,      0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0x0,        0x1000,     0x2000,     0x3000,     0x4000,     0x5000,
    +    0x6000,     0x7000,     0x8000,     0x9000,     0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xa000,
    +    0xb000,     0xc000,     0xd000,     0xe000,     0xf000,     0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xa000,     0xb000,     0xc000,     0xd000,     0xe000,
    +    0xf000,     0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    +    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF};
    +
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_JSONCHARUTILS_TABLES_CPP
    +/* end file internal/jsoncharutils_tables.cpp */
    +/* including internal/numberparsing_tables.cpp: #include  */
    +/* begin file internal/numberparsing_tables.cpp */
    +#ifndef SIMDJSON_SRC_NUMBERPARSING_TABLES_CPP
    +#define SIMDJSON_SRC_NUMBERPARSING_TABLES_CPP
    +
    +/* skipped duplicate #include  */
    +/* including simdjson/internal/numberparsing_tables.h: #include  */
    +/* begin file simdjson/internal/numberparsing_tables.h */
    +#ifndef SIMDJSON_INTERNAL_NUMBERPARSING_TABLES_H
    +#define SIMDJSON_INTERNAL_NUMBERPARSING_TABLES_H
    +
    +/* skipped duplicate #include "simdjson/base.h" */
    +
    +namespace simdjson {
    +namespace internal {
    +/**
    + * The smallest non-zero float (binary64) is 2^-1074.
    + * We take as input numbers of the form w x 10^q where w < 2^64.
    + * We have that w * 10^-343  <  2^(64-344) 5^-343 < 2^-1076.
    + * However, we have that
    + * (2^64-1) * 10^-342 =  (2^64-1) * 2^-342 * 5^-342 > 2^-1074.
    + * Thus it is possible for a number of the form w * 10^-342 where
    + * w is a 64-bit value to be a non-zero floating-point number.
    + *********
    + * Any number of form w * 10^309 where w>= 1 is going to be
    + * infinite in binary64 so we never need to worry about powers
    + * of 5 greater than 308.
    + */
    +constexpr int smallest_power = -342;
    +constexpr int largest_power = 308;
    +
    +/**
    + * Represents a 128-bit value.
    + * low: least significant 64 bits.
    + * high: most significant 64 bits.
    + */
    +struct value128 {
    +  uint64_t low;
    +  uint64_t high;
    +};
    +
    +
    +// Precomputed powers of ten from 10^0 to 10^22. These
    +// can be represented exactly using the double type.
    +extern SIMDJSON_DLLIMPORTEXPORT const double power_of_ten[];
    +
    +
    +/**
    + * When mapping numbers from decimal to binary,
    + * we go from w * 10^q to m * 2^p but we have
    + * 10^q = 5^q * 2^q, so effectively
    + * we are trying to match
    + * w * 2^q * 5^q to m * 2^p. Thus the powers of two
    + * are not a concern since they can be represented
    + * exactly using the binary notation, only the powers of five
    + * affect the binary significand.
    + */
    +
    +
    +// The truncated powers of five from 5^-342 all the way to 5^308
    +// The mantissa is truncated to 128 bits, and
    +// never rounded up. Uses about 10KB.
    +extern SIMDJSON_DLLIMPORTEXPORT const uint64_t power_of_five_128[];
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_INTERNAL_NUMBERPARSING_TABLES_H
    +/* end file simdjson/internal/numberparsing_tables.h */
    +
    +// Precomputed powers of ten from 10^0 to 10^22. These
    +// can be represented exactly using the double type.
    +SIMDJSON_DLLIMPORTEXPORT const double simdjson::internal::power_of_ten[] = {
    +    1e0,  1e1,  1e2,  1e3,  1e4,  1e5,  1e6,  1e7,  1e8,  1e9,  1e10, 1e11,
    +    1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22};
    +
    +/**
    + * When mapping numbers from decimal to binary,
    + * we go from w * 10^q to m * 2^p but we have
    + * 10^q = 5^q * 2^q, so effectively
    + * we are trying to match
    + * w * 2^q * 5^q to m * 2^p. Thus the powers of two
    + * are not a concern since they can be represented
    + * exactly using the binary notation, only the powers of five
    + * affect the binary significand.
    + */
    +
    +
    +// The truncated powers of five from 5^-342 all the way to 5^308
    +// The mantissa is truncated to 128 bits, and
    +// never rounded up. Uses about 10KB.
    +SIMDJSON_DLLIMPORTEXPORT const uint64_t simdjson::internal::power_of_five_128[]= {
    +        0xeef453d6923bd65a,0x113faa2906a13b3f,
    +        0x9558b4661b6565f8,0x4ac7ca59a424c507,
    +        0xbaaee17fa23ebf76,0x5d79bcf00d2df649,
    +        0xe95a99df8ace6f53,0xf4d82c2c107973dc,
    +        0x91d8a02bb6c10594,0x79071b9b8a4be869,
    +        0xb64ec836a47146f9,0x9748e2826cdee284,
    +        0xe3e27a444d8d98b7,0xfd1b1b2308169b25,
    +        0x8e6d8c6ab0787f72,0xfe30f0f5e50e20f7,
    +        0xb208ef855c969f4f,0xbdbd2d335e51a935,
    +        0xde8b2b66b3bc4723,0xad2c788035e61382,
    +        0x8b16fb203055ac76,0x4c3bcb5021afcc31,
    +        0xaddcb9e83c6b1793,0xdf4abe242a1bbf3d,
    +        0xd953e8624b85dd78,0xd71d6dad34a2af0d,
    +        0x87d4713d6f33aa6b,0x8672648c40e5ad68,
    +        0xa9c98d8ccb009506,0x680efdaf511f18c2,
    +        0xd43bf0effdc0ba48,0x212bd1b2566def2,
    +        0x84a57695fe98746d,0x14bb630f7604b57,
    +        0xa5ced43b7e3e9188,0x419ea3bd35385e2d,
    +        0xcf42894a5dce35ea,0x52064cac828675b9,
    +        0x818995ce7aa0e1b2,0x7343efebd1940993,
    +        0xa1ebfb4219491a1f,0x1014ebe6c5f90bf8,
    +        0xca66fa129f9b60a6,0xd41a26e077774ef6,
    +        0xfd00b897478238d0,0x8920b098955522b4,
    +        0x9e20735e8cb16382,0x55b46e5f5d5535b0,
    +        0xc5a890362fddbc62,0xeb2189f734aa831d,
    +        0xf712b443bbd52b7b,0xa5e9ec7501d523e4,
    +        0x9a6bb0aa55653b2d,0x47b233c92125366e,
    +        0xc1069cd4eabe89f8,0x999ec0bb696e840a,
    +        0xf148440a256e2c76,0xc00670ea43ca250d,
    +        0x96cd2a865764dbca,0x380406926a5e5728,
    +        0xbc807527ed3e12bc,0xc605083704f5ecf2,
    +        0xeba09271e88d976b,0xf7864a44c633682e,
    +        0x93445b8731587ea3,0x7ab3ee6afbe0211d,
    +        0xb8157268fdae9e4c,0x5960ea05bad82964,
    +        0xe61acf033d1a45df,0x6fb92487298e33bd,
    +        0x8fd0c16206306bab,0xa5d3b6d479f8e056,
    +        0xb3c4f1ba87bc8696,0x8f48a4899877186c,
    +        0xe0b62e2929aba83c,0x331acdabfe94de87,
    +        0x8c71dcd9ba0b4925,0x9ff0c08b7f1d0b14,
    +        0xaf8e5410288e1b6f,0x7ecf0ae5ee44dd9,
    +        0xdb71e91432b1a24a,0xc9e82cd9f69d6150,
    +        0x892731ac9faf056e,0xbe311c083a225cd2,
    +        0xab70fe17c79ac6ca,0x6dbd630a48aaf406,
    +        0xd64d3d9db981787d,0x92cbbccdad5b108,
    +        0x85f0468293f0eb4e,0x25bbf56008c58ea5,
    +        0xa76c582338ed2621,0xaf2af2b80af6f24e,
    +        0xd1476e2c07286faa,0x1af5af660db4aee1,
    +        0x82cca4db847945ca,0x50d98d9fc890ed4d,
    +        0xa37fce126597973c,0xe50ff107bab528a0,
    +        0xcc5fc196fefd7d0c,0x1e53ed49a96272c8,
    +        0xff77b1fcbebcdc4f,0x25e8e89c13bb0f7a,
    +        0x9faacf3df73609b1,0x77b191618c54e9ac,
    +        0xc795830d75038c1d,0xd59df5b9ef6a2417,
    +        0xf97ae3d0d2446f25,0x4b0573286b44ad1d,
    +        0x9becce62836ac577,0x4ee367f9430aec32,
    +        0xc2e801fb244576d5,0x229c41f793cda73f,
    +        0xf3a20279ed56d48a,0x6b43527578c1110f,
    +        0x9845418c345644d6,0x830a13896b78aaa9,
    +        0xbe5691ef416bd60c,0x23cc986bc656d553,
    +        0xedec366b11c6cb8f,0x2cbfbe86b7ec8aa8,
    +        0x94b3a202eb1c3f39,0x7bf7d71432f3d6a9,
    +        0xb9e08a83a5e34f07,0xdaf5ccd93fb0cc53,
    +        0xe858ad248f5c22c9,0xd1b3400f8f9cff68,
    +        0x91376c36d99995be,0x23100809b9c21fa1,
    +        0xb58547448ffffb2d,0xabd40a0c2832a78a,
    +        0xe2e69915b3fff9f9,0x16c90c8f323f516c,
    +        0x8dd01fad907ffc3b,0xae3da7d97f6792e3,
    +        0xb1442798f49ffb4a,0x99cd11cfdf41779c,
    +        0xdd95317f31c7fa1d,0x40405643d711d583,
    +        0x8a7d3eef7f1cfc52,0x482835ea666b2572,
    +        0xad1c8eab5ee43b66,0xda3243650005eecf,
    +        0xd863b256369d4a40,0x90bed43e40076a82,
    +        0x873e4f75e2224e68,0x5a7744a6e804a291,
    +        0xa90de3535aaae202,0x711515d0a205cb36,
    +        0xd3515c2831559a83,0xd5a5b44ca873e03,
    +        0x8412d9991ed58091,0xe858790afe9486c2,
    +        0xa5178fff668ae0b6,0x626e974dbe39a872,
    +        0xce5d73ff402d98e3,0xfb0a3d212dc8128f,
    +        0x80fa687f881c7f8e,0x7ce66634bc9d0b99,
    +        0xa139029f6a239f72,0x1c1fffc1ebc44e80,
    +        0xc987434744ac874e,0xa327ffb266b56220,
    +        0xfbe9141915d7a922,0x4bf1ff9f0062baa8,
    +        0x9d71ac8fada6c9b5,0x6f773fc3603db4a9,
    +        0xc4ce17b399107c22,0xcb550fb4384d21d3,
    +        0xf6019da07f549b2b,0x7e2a53a146606a48,
    +        0x99c102844f94e0fb,0x2eda7444cbfc426d,
    +        0xc0314325637a1939,0xfa911155fefb5308,
    +        0xf03d93eebc589f88,0x793555ab7eba27ca,
    +        0x96267c7535b763b5,0x4bc1558b2f3458de,
    +        0xbbb01b9283253ca2,0x9eb1aaedfb016f16,
    +        0xea9c227723ee8bcb,0x465e15a979c1cadc,
    +        0x92a1958a7675175f,0xbfacd89ec191ec9,
    +        0xb749faed14125d36,0xcef980ec671f667b,
    +        0xe51c79a85916f484,0x82b7e12780e7401a,
    +        0x8f31cc0937ae58d2,0xd1b2ecb8b0908810,
    +        0xb2fe3f0b8599ef07,0x861fa7e6dcb4aa15,
    +        0xdfbdcece67006ac9,0x67a791e093e1d49a,
    +        0x8bd6a141006042bd,0xe0c8bb2c5c6d24e0,
    +        0xaecc49914078536d,0x58fae9f773886e18,
    +        0xda7f5bf590966848,0xaf39a475506a899e,
    +        0x888f99797a5e012d,0x6d8406c952429603,
    +        0xaab37fd7d8f58178,0xc8e5087ba6d33b83,
    +        0xd5605fcdcf32e1d6,0xfb1e4a9a90880a64,
    +        0x855c3be0a17fcd26,0x5cf2eea09a55067f,
    +        0xa6b34ad8c9dfc06f,0xf42faa48c0ea481e,
    +        0xd0601d8efc57b08b,0xf13b94daf124da26,
    +        0x823c12795db6ce57,0x76c53d08d6b70858,
    +        0xa2cb1717b52481ed,0x54768c4b0c64ca6e,
    +        0xcb7ddcdda26da268,0xa9942f5dcf7dfd09,
    +        0xfe5d54150b090b02,0xd3f93b35435d7c4c,
    +        0x9efa548d26e5a6e1,0xc47bc5014a1a6daf,
    +        0xc6b8e9b0709f109a,0x359ab6419ca1091b,
    +        0xf867241c8cc6d4c0,0xc30163d203c94b62,
    +        0x9b407691d7fc44f8,0x79e0de63425dcf1d,
    +        0xc21094364dfb5636,0x985915fc12f542e4,
    +        0xf294b943e17a2bc4,0x3e6f5b7b17b2939d,
    +        0x979cf3ca6cec5b5a,0xa705992ceecf9c42,
    +        0xbd8430bd08277231,0x50c6ff782a838353,
    +        0xece53cec4a314ebd,0xa4f8bf5635246428,
    +        0x940f4613ae5ed136,0x871b7795e136be99,
    +        0xb913179899f68584,0x28e2557b59846e3f,
    +        0xe757dd7ec07426e5,0x331aeada2fe589cf,
    +        0x9096ea6f3848984f,0x3ff0d2c85def7621,
    +        0xb4bca50b065abe63,0xfed077a756b53a9,
    +        0xe1ebce4dc7f16dfb,0xd3e8495912c62894,
    +        0x8d3360f09cf6e4bd,0x64712dd7abbbd95c,
    +        0xb080392cc4349dec,0xbd8d794d96aacfb3,
    +        0xdca04777f541c567,0xecf0d7a0fc5583a0,
    +        0x89e42caaf9491b60,0xf41686c49db57244,
    +        0xac5d37d5b79b6239,0x311c2875c522ced5,
    +        0xd77485cb25823ac7,0x7d633293366b828b,
    +        0x86a8d39ef77164bc,0xae5dff9c02033197,
    +        0xa8530886b54dbdeb,0xd9f57f830283fdfc,
    +        0xd267caa862a12d66,0xd072df63c324fd7b,
    +        0x8380dea93da4bc60,0x4247cb9e59f71e6d,
    +        0xa46116538d0deb78,0x52d9be85f074e608,
    +        0xcd795be870516656,0x67902e276c921f8b,
    +        0x806bd9714632dff6,0xba1cd8a3db53b6,
    +        0xa086cfcd97bf97f3,0x80e8a40eccd228a4,
    +        0xc8a883c0fdaf7df0,0x6122cd128006b2cd,
    +        0xfad2a4b13d1b5d6c,0x796b805720085f81,
    +        0x9cc3a6eec6311a63,0xcbe3303674053bb0,
    +        0xc3f490aa77bd60fc,0xbedbfc4411068a9c,
    +        0xf4f1b4d515acb93b,0xee92fb5515482d44,
    +        0x991711052d8bf3c5,0x751bdd152d4d1c4a,
    +        0xbf5cd54678eef0b6,0xd262d45a78a0635d,
    +        0xef340a98172aace4,0x86fb897116c87c34,
    +        0x9580869f0e7aac0e,0xd45d35e6ae3d4da0,
    +        0xbae0a846d2195712,0x8974836059cca109,
    +        0xe998d258869facd7,0x2bd1a438703fc94b,
    +        0x91ff83775423cc06,0x7b6306a34627ddcf,
    +        0xb67f6455292cbf08,0x1a3bc84c17b1d542,
    +        0xe41f3d6a7377eeca,0x20caba5f1d9e4a93,
    +        0x8e938662882af53e,0x547eb47b7282ee9c,
    +        0xb23867fb2a35b28d,0xe99e619a4f23aa43,
    +        0xdec681f9f4c31f31,0x6405fa00e2ec94d4,
    +        0x8b3c113c38f9f37e,0xde83bc408dd3dd04,
    +        0xae0b158b4738705e,0x9624ab50b148d445,
    +        0xd98ddaee19068c76,0x3badd624dd9b0957,
    +        0x87f8a8d4cfa417c9,0xe54ca5d70a80e5d6,
    +        0xa9f6d30a038d1dbc,0x5e9fcf4ccd211f4c,
    +        0xd47487cc8470652b,0x7647c3200069671f,
    +        0x84c8d4dfd2c63f3b,0x29ecd9f40041e073,
    +        0xa5fb0a17c777cf09,0xf468107100525890,
    +        0xcf79cc9db955c2cc,0x7182148d4066eeb4,
    +        0x81ac1fe293d599bf,0xc6f14cd848405530,
    +        0xa21727db38cb002f,0xb8ada00e5a506a7c,
    +        0xca9cf1d206fdc03b,0xa6d90811f0e4851c,
    +        0xfd442e4688bd304a,0x908f4a166d1da663,
    +        0x9e4a9cec15763e2e,0x9a598e4e043287fe,
    +        0xc5dd44271ad3cdba,0x40eff1e1853f29fd,
    +        0xf7549530e188c128,0xd12bee59e68ef47c,
    +        0x9a94dd3e8cf578b9,0x82bb74f8301958ce,
    +        0xc13a148e3032d6e7,0xe36a52363c1faf01,
    +        0xf18899b1bc3f8ca1,0xdc44e6c3cb279ac1,
    +        0x96f5600f15a7b7e5,0x29ab103a5ef8c0b9,
    +        0xbcb2b812db11a5de,0x7415d448f6b6f0e7,
    +        0xebdf661791d60f56,0x111b495b3464ad21,
    +        0x936b9fcebb25c995,0xcab10dd900beec34,
    +        0xb84687c269ef3bfb,0x3d5d514f40eea742,
    +        0xe65829b3046b0afa,0xcb4a5a3112a5112,
    +        0x8ff71a0fe2c2e6dc,0x47f0e785eaba72ab,
    +        0xb3f4e093db73a093,0x59ed216765690f56,
    +        0xe0f218b8d25088b8,0x306869c13ec3532c,
    +        0x8c974f7383725573,0x1e414218c73a13fb,
    +        0xafbd2350644eeacf,0xe5d1929ef90898fa,
    +        0xdbac6c247d62a583,0xdf45f746b74abf39,
    +        0x894bc396ce5da772,0x6b8bba8c328eb783,
    +        0xab9eb47c81f5114f,0x66ea92f3f326564,
    +        0xd686619ba27255a2,0xc80a537b0efefebd,
    +        0x8613fd0145877585,0xbd06742ce95f5f36,
    +        0xa798fc4196e952e7,0x2c48113823b73704,
    +        0xd17f3b51fca3a7a0,0xf75a15862ca504c5,
    +        0x82ef85133de648c4,0x9a984d73dbe722fb,
    +        0xa3ab66580d5fdaf5,0xc13e60d0d2e0ebba,
    +        0xcc963fee10b7d1b3,0x318df905079926a8,
    +        0xffbbcfe994e5c61f,0xfdf17746497f7052,
    +        0x9fd561f1fd0f9bd3,0xfeb6ea8bedefa633,
    +        0xc7caba6e7c5382c8,0xfe64a52ee96b8fc0,
    +        0xf9bd690a1b68637b,0x3dfdce7aa3c673b0,
    +        0x9c1661a651213e2d,0x6bea10ca65c084e,
    +        0xc31bfa0fe5698db8,0x486e494fcff30a62,
    +        0xf3e2f893dec3f126,0x5a89dba3c3efccfa,
    +        0x986ddb5c6b3a76b7,0xf89629465a75e01c,
    +        0xbe89523386091465,0xf6bbb397f1135823,
    +        0xee2ba6c0678b597f,0x746aa07ded582e2c,
    +        0x94db483840b717ef,0xa8c2a44eb4571cdc,
    +        0xba121a4650e4ddeb,0x92f34d62616ce413,
    +        0xe896a0d7e51e1566,0x77b020baf9c81d17,
    +        0x915e2486ef32cd60,0xace1474dc1d122e,
    +        0xb5b5ada8aaff80b8,0xd819992132456ba,
    +        0xe3231912d5bf60e6,0x10e1fff697ed6c69,
    +        0x8df5efabc5979c8f,0xca8d3ffa1ef463c1,
    +        0xb1736b96b6fd83b3,0xbd308ff8a6b17cb2,
    +        0xddd0467c64bce4a0,0xac7cb3f6d05ddbde,
    +        0x8aa22c0dbef60ee4,0x6bcdf07a423aa96b,
    +        0xad4ab7112eb3929d,0x86c16c98d2c953c6,
    +        0xd89d64d57a607744,0xe871c7bf077ba8b7,
    +        0x87625f056c7c4a8b,0x11471cd764ad4972,
    +        0xa93af6c6c79b5d2d,0xd598e40d3dd89bcf,
    +        0xd389b47879823479,0x4aff1d108d4ec2c3,
    +        0x843610cb4bf160cb,0xcedf722a585139ba,
    +        0xa54394fe1eedb8fe,0xc2974eb4ee658828,
    +        0xce947a3da6a9273e,0x733d226229feea32,
    +        0x811ccc668829b887,0x806357d5a3f525f,
    +        0xa163ff802a3426a8,0xca07c2dcb0cf26f7,
    +        0xc9bcff6034c13052,0xfc89b393dd02f0b5,
    +        0xfc2c3f3841f17c67,0xbbac2078d443ace2,
    +        0x9d9ba7832936edc0,0xd54b944b84aa4c0d,
    +        0xc5029163f384a931,0xa9e795e65d4df11,
    +        0xf64335bcf065d37d,0x4d4617b5ff4a16d5,
    +        0x99ea0196163fa42e,0x504bced1bf8e4e45,
    +        0xc06481fb9bcf8d39,0xe45ec2862f71e1d6,
    +        0xf07da27a82c37088,0x5d767327bb4e5a4c,
    +        0x964e858c91ba2655,0x3a6a07f8d510f86f,
    +        0xbbe226efb628afea,0x890489f70a55368b,
    +        0xeadab0aba3b2dbe5,0x2b45ac74ccea842e,
    +        0x92c8ae6b464fc96f,0x3b0b8bc90012929d,
    +        0xb77ada0617e3bbcb,0x9ce6ebb40173744,
    +        0xe55990879ddcaabd,0xcc420a6a101d0515,
    +        0x8f57fa54c2a9eab6,0x9fa946824a12232d,
    +        0xb32df8e9f3546564,0x47939822dc96abf9,
    +        0xdff9772470297ebd,0x59787e2b93bc56f7,
    +        0x8bfbea76c619ef36,0x57eb4edb3c55b65a,
    +        0xaefae51477a06b03,0xede622920b6b23f1,
    +        0xdab99e59958885c4,0xe95fab368e45eced,
    +        0x88b402f7fd75539b,0x11dbcb0218ebb414,
    +        0xaae103b5fcd2a881,0xd652bdc29f26a119,
    +        0xd59944a37c0752a2,0x4be76d3346f0495f,
    +        0x857fcae62d8493a5,0x6f70a4400c562ddb,
    +        0xa6dfbd9fb8e5b88e,0xcb4ccd500f6bb952,
    +        0xd097ad07a71f26b2,0x7e2000a41346a7a7,
    +        0x825ecc24c873782f,0x8ed400668c0c28c8,
    +        0xa2f67f2dfa90563b,0x728900802f0f32fa,
    +        0xcbb41ef979346bca,0x4f2b40a03ad2ffb9,
    +        0xfea126b7d78186bc,0xe2f610c84987bfa8,
    +        0x9f24b832e6b0f436,0xdd9ca7d2df4d7c9,
    +        0xc6ede63fa05d3143,0x91503d1c79720dbb,
    +        0xf8a95fcf88747d94,0x75a44c6397ce912a,
    +        0x9b69dbe1b548ce7c,0xc986afbe3ee11aba,
    +        0xc24452da229b021b,0xfbe85badce996168,
    +        0xf2d56790ab41c2a2,0xfae27299423fb9c3,
    +        0x97c560ba6b0919a5,0xdccd879fc967d41a,
    +        0xbdb6b8e905cb600f,0x5400e987bbc1c920,
    +        0xed246723473e3813,0x290123e9aab23b68,
    +        0x9436c0760c86e30b,0xf9a0b6720aaf6521,
    +        0xb94470938fa89bce,0xf808e40e8d5b3e69,
    +        0xe7958cb87392c2c2,0xb60b1d1230b20e04,
    +        0x90bd77f3483bb9b9,0xb1c6f22b5e6f48c2,
    +        0xb4ecd5f01a4aa828,0x1e38aeb6360b1af3,
    +        0xe2280b6c20dd5232,0x25c6da63c38de1b0,
    +        0x8d590723948a535f,0x579c487e5a38ad0e,
    +        0xb0af48ec79ace837,0x2d835a9df0c6d851,
    +        0xdcdb1b2798182244,0xf8e431456cf88e65,
    +        0x8a08f0f8bf0f156b,0x1b8e9ecb641b58ff,
    +        0xac8b2d36eed2dac5,0xe272467e3d222f3f,
    +        0xd7adf884aa879177,0x5b0ed81dcc6abb0f,
    +        0x86ccbb52ea94baea,0x98e947129fc2b4e9,
    +        0xa87fea27a539e9a5,0x3f2398d747b36224,
    +        0xd29fe4b18e88640e,0x8eec7f0d19a03aad,
    +        0x83a3eeeef9153e89,0x1953cf68300424ac,
    +        0xa48ceaaab75a8e2b,0x5fa8c3423c052dd7,
    +        0xcdb02555653131b6,0x3792f412cb06794d,
    +        0x808e17555f3ebf11,0xe2bbd88bbee40bd0,
    +        0xa0b19d2ab70e6ed6,0x5b6aceaeae9d0ec4,
    +        0xc8de047564d20a8b,0xf245825a5a445275,
    +        0xfb158592be068d2e,0xeed6e2f0f0d56712,
    +        0x9ced737bb6c4183d,0x55464dd69685606b,
    +        0xc428d05aa4751e4c,0xaa97e14c3c26b886,
    +        0xf53304714d9265df,0xd53dd99f4b3066a8,
    +        0x993fe2c6d07b7fab,0xe546a8038efe4029,
    +        0xbf8fdb78849a5f96,0xde98520472bdd033,
    +        0xef73d256a5c0f77c,0x963e66858f6d4440,
    +        0x95a8637627989aad,0xdde7001379a44aa8,
    +        0xbb127c53b17ec159,0x5560c018580d5d52,
    +        0xe9d71b689dde71af,0xaab8f01e6e10b4a6,
    +        0x9226712162ab070d,0xcab3961304ca70e8,
    +        0xb6b00d69bb55c8d1,0x3d607b97c5fd0d22,
    +        0xe45c10c42a2b3b05,0x8cb89a7db77c506a,
    +        0x8eb98a7a9a5b04e3,0x77f3608e92adb242,
    +        0xb267ed1940f1c61c,0x55f038b237591ed3,
    +        0xdf01e85f912e37a3,0x6b6c46dec52f6688,
    +        0x8b61313bbabce2c6,0x2323ac4b3b3da015,
    +        0xae397d8aa96c1b77,0xabec975e0a0d081a,
    +        0xd9c7dced53c72255,0x96e7bd358c904a21,
    +        0x881cea14545c7575,0x7e50d64177da2e54,
    +        0xaa242499697392d2,0xdde50bd1d5d0b9e9,
    +        0xd4ad2dbfc3d07787,0x955e4ec64b44e864,
    +        0x84ec3c97da624ab4,0xbd5af13bef0b113e,
    +        0xa6274bbdd0fadd61,0xecb1ad8aeacdd58e,
    +        0xcfb11ead453994ba,0x67de18eda5814af2,
    +        0x81ceb32c4b43fcf4,0x80eacf948770ced7,
    +        0xa2425ff75e14fc31,0xa1258379a94d028d,
    +        0xcad2f7f5359a3b3e,0x96ee45813a04330,
    +        0xfd87b5f28300ca0d,0x8bca9d6e188853fc,
    +        0x9e74d1b791e07e48,0x775ea264cf55347e,
    +        0xc612062576589dda,0x95364afe032a81a0,
    +        0xf79687aed3eec551,0x3a83ddbd83f52210,
    +        0x9abe14cd44753b52,0xc4926a9672793580,
    +        0xc16d9a0095928a27,0x75b7053c0f178400,
    +        0xf1c90080baf72cb1,0x5324c68b12dd6800,
    +        0x971da05074da7bee,0xd3f6fc16ebca8000,
    +        0xbce5086492111aea,0x88f4bb1ca6bd0000,
    +        0xec1e4a7db69561a5,0x2b31e9e3d0700000,
    +        0x9392ee8e921d5d07,0x3aff322e62600000,
    +        0xb877aa3236a4b449,0x9befeb9fad487c3,
    +        0xe69594bec44de15b,0x4c2ebe687989a9b4,
    +        0x901d7cf73ab0acd9,0xf9d37014bf60a11,
    +        0xb424dc35095cd80f,0x538484c19ef38c95,
    +        0xe12e13424bb40e13,0x2865a5f206b06fba,
    +        0x8cbccc096f5088cb,0xf93f87b7442e45d4,
    +        0xafebff0bcb24aafe,0xf78f69a51539d749,
    +        0xdbe6fecebdedd5be,0xb573440e5a884d1c,
    +        0x89705f4136b4a597,0x31680a88f8953031,
    +        0xabcc77118461cefc,0xfdc20d2b36ba7c3e,
    +        0xd6bf94d5e57a42bc,0x3d32907604691b4d,
    +        0x8637bd05af6c69b5,0xa63f9a49c2c1b110,
    +        0xa7c5ac471b478423,0xfcf80dc33721d54,
    +        0xd1b71758e219652b,0xd3c36113404ea4a9,
    +        0x83126e978d4fdf3b,0x645a1cac083126ea,
    +        0xa3d70a3d70a3d70a,0x3d70a3d70a3d70a4,
    +        0xcccccccccccccccc,0xcccccccccccccccd,
    +        0x8000000000000000,0x0,
    +        0xa000000000000000,0x0,
    +        0xc800000000000000,0x0,
    +        0xfa00000000000000,0x0,
    +        0x9c40000000000000,0x0,
    +        0xc350000000000000,0x0,
    +        0xf424000000000000,0x0,
    +        0x9896800000000000,0x0,
    +        0xbebc200000000000,0x0,
    +        0xee6b280000000000,0x0,
    +        0x9502f90000000000,0x0,
    +        0xba43b74000000000,0x0,
    +        0xe8d4a51000000000,0x0,
    +        0x9184e72a00000000,0x0,
    +        0xb5e620f480000000,0x0,
    +        0xe35fa931a0000000,0x0,
    +        0x8e1bc9bf04000000,0x0,
    +        0xb1a2bc2ec5000000,0x0,
    +        0xde0b6b3a76400000,0x0,
    +        0x8ac7230489e80000,0x0,
    +        0xad78ebc5ac620000,0x0,
    +        0xd8d726b7177a8000,0x0,
    +        0x878678326eac9000,0x0,
    +        0xa968163f0a57b400,0x0,
    +        0xd3c21bcecceda100,0x0,
    +        0x84595161401484a0,0x0,
    +        0xa56fa5b99019a5c8,0x0,
    +        0xcecb8f27f4200f3a,0x0,
    +        0x813f3978f8940984,0x4000000000000000,
    +        0xa18f07d736b90be5,0x5000000000000000,
    +        0xc9f2c9cd04674ede,0xa400000000000000,
    +        0xfc6f7c4045812296,0x4d00000000000000,
    +        0x9dc5ada82b70b59d,0xf020000000000000,
    +        0xc5371912364ce305,0x6c28000000000000,
    +        0xf684df56c3e01bc6,0xc732000000000000,
    +        0x9a130b963a6c115c,0x3c7f400000000000,
    +        0xc097ce7bc90715b3,0x4b9f100000000000,
    +        0xf0bdc21abb48db20,0x1e86d40000000000,
    +        0x96769950b50d88f4,0x1314448000000000,
    +        0xbc143fa4e250eb31,0x17d955a000000000,
    +        0xeb194f8e1ae525fd,0x5dcfab0800000000,
    +        0x92efd1b8d0cf37be,0x5aa1cae500000000,
    +        0xb7abc627050305ad,0xf14a3d9e40000000,
    +        0xe596b7b0c643c719,0x6d9ccd05d0000000,
    +        0x8f7e32ce7bea5c6f,0xe4820023a2000000,
    +        0xb35dbf821ae4f38b,0xdda2802c8a800000,
    +        0xe0352f62a19e306e,0xd50b2037ad200000,
    +        0x8c213d9da502de45,0x4526f422cc340000,
    +        0xaf298d050e4395d6,0x9670b12b7f410000,
    +        0xdaf3f04651d47b4c,0x3c0cdd765f114000,
    +        0x88d8762bf324cd0f,0xa5880a69fb6ac800,
    +        0xab0e93b6efee0053,0x8eea0d047a457a00,
    +        0xd5d238a4abe98068,0x72a4904598d6d880,
    +        0x85a36366eb71f041,0x47a6da2b7f864750,
    +        0xa70c3c40a64e6c51,0x999090b65f67d924,
    +        0xd0cf4b50cfe20765,0xfff4b4e3f741cf6d,
    +        0x82818f1281ed449f,0xbff8f10e7a8921a4,
    +        0xa321f2d7226895c7,0xaff72d52192b6a0d,
    +        0xcbea6f8ceb02bb39,0x9bf4f8a69f764490,
    +        0xfee50b7025c36a08,0x2f236d04753d5b4,
    +        0x9f4f2726179a2245,0x1d762422c946590,
    +        0xc722f0ef9d80aad6,0x424d3ad2b7b97ef5,
    +        0xf8ebad2b84e0d58b,0xd2e0898765a7deb2,
    +        0x9b934c3b330c8577,0x63cc55f49f88eb2f,
    +        0xc2781f49ffcfa6d5,0x3cbf6b71c76b25fb,
    +        0xf316271c7fc3908a,0x8bef464e3945ef7a,
    +        0x97edd871cfda3a56,0x97758bf0e3cbb5ac,
    +        0xbde94e8e43d0c8ec,0x3d52eeed1cbea317,
    +        0xed63a231d4c4fb27,0x4ca7aaa863ee4bdd,
    +        0x945e455f24fb1cf8,0x8fe8caa93e74ef6a,
    +        0xb975d6b6ee39e436,0xb3e2fd538e122b44,
    +        0xe7d34c64a9c85d44,0x60dbbca87196b616,
    +        0x90e40fbeea1d3a4a,0xbc8955e946fe31cd,
    +        0xb51d13aea4a488dd,0x6babab6398bdbe41,
    +        0xe264589a4dcdab14,0xc696963c7eed2dd1,
    +        0x8d7eb76070a08aec,0xfc1e1de5cf543ca2,
    +        0xb0de65388cc8ada8,0x3b25a55f43294bcb,
    +        0xdd15fe86affad912,0x49ef0eb713f39ebe,
    +        0x8a2dbf142dfcc7ab,0x6e3569326c784337,
    +        0xacb92ed9397bf996,0x49c2c37f07965404,
    +        0xd7e77a8f87daf7fb,0xdc33745ec97be906,
    +        0x86f0ac99b4e8dafd,0x69a028bb3ded71a3,
    +        0xa8acd7c0222311bc,0xc40832ea0d68ce0c,
    +        0xd2d80db02aabd62b,0xf50a3fa490c30190,
    +        0x83c7088e1aab65db,0x792667c6da79e0fa,
    +        0xa4b8cab1a1563f52,0x577001b891185938,
    +        0xcde6fd5e09abcf26,0xed4c0226b55e6f86,
    +        0x80b05e5ac60b6178,0x544f8158315b05b4,
    +        0xa0dc75f1778e39d6,0x696361ae3db1c721,
    +        0xc913936dd571c84c,0x3bc3a19cd1e38e9,
    +        0xfb5878494ace3a5f,0x4ab48a04065c723,
    +        0x9d174b2dcec0e47b,0x62eb0d64283f9c76,
    +        0xc45d1df942711d9a,0x3ba5d0bd324f8394,
    +        0xf5746577930d6500,0xca8f44ec7ee36479,
    +        0x9968bf6abbe85f20,0x7e998b13cf4e1ecb,
    +        0xbfc2ef456ae276e8,0x9e3fedd8c321a67e,
    +        0xefb3ab16c59b14a2,0xc5cfe94ef3ea101e,
    +        0x95d04aee3b80ece5,0xbba1f1d158724a12,
    +        0xbb445da9ca61281f,0x2a8a6e45ae8edc97,
    +        0xea1575143cf97226,0xf52d09d71a3293bd,
    +        0x924d692ca61be758,0x593c2626705f9c56,
    +        0xb6e0c377cfa2e12e,0x6f8b2fb00c77836c,
    +        0xe498f455c38b997a,0xb6dfb9c0f956447,
    +        0x8edf98b59a373fec,0x4724bd4189bd5eac,
    +        0xb2977ee300c50fe7,0x58edec91ec2cb657,
    +        0xdf3d5e9bc0f653e1,0x2f2967b66737e3ed,
    +        0x8b865b215899f46c,0xbd79e0d20082ee74,
    +        0xae67f1e9aec07187,0xecd8590680a3aa11,
    +        0xda01ee641a708de9,0xe80e6f4820cc9495,
    +        0x884134fe908658b2,0x3109058d147fdcdd,
    +        0xaa51823e34a7eede,0xbd4b46f0599fd415,
    +        0xd4e5e2cdc1d1ea96,0x6c9e18ac7007c91a,
    +        0x850fadc09923329e,0x3e2cf6bc604ddb0,
    +        0xa6539930bf6bff45,0x84db8346b786151c,
    +        0xcfe87f7cef46ff16,0xe612641865679a63,
    +        0x81f14fae158c5f6e,0x4fcb7e8f3f60c07e,
    +        0xa26da3999aef7749,0xe3be5e330f38f09d,
    +        0xcb090c8001ab551c,0x5cadf5bfd3072cc5,
    +        0xfdcb4fa002162a63,0x73d9732fc7c8f7f6,
    +        0x9e9f11c4014dda7e,0x2867e7fddcdd9afa,
    +        0xc646d63501a1511d,0xb281e1fd541501b8,
    +        0xf7d88bc24209a565,0x1f225a7ca91a4226,
    +        0x9ae757596946075f,0x3375788de9b06958,
    +        0xc1a12d2fc3978937,0x52d6b1641c83ae,
    +        0xf209787bb47d6b84,0xc0678c5dbd23a49a,
    +        0x9745eb4d50ce6332,0xf840b7ba963646e0,
    +        0xbd176620a501fbff,0xb650e5a93bc3d898,
    +        0xec5d3fa8ce427aff,0xa3e51f138ab4cebe,
    +        0x93ba47c980e98cdf,0xc66f336c36b10137,
    +        0xb8a8d9bbe123f017,0xb80b0047445d4184,
    +        0xe6d3102ad96cec1d,0xa60dc059157491e5,
    +        0x9043ea1ac7e41392,0x87c89837ad68db2f,
    +        0xb454e4a179dd1877,0x29babe4598c311fb,
    +        0xe16a1dc9d8545e94,0xf4296dd6fef3d67a,
    +        0x8ce2529e2734bb1d,0x1899e4a65f58660c,
    +        0xb01ae745b101e9e4,0x5ec05dcff72e7f8f,
    +        0xdc21a1171d42645d,0x76707543f4fa1f73,
    +        0x899504ae72497eba,0x6a06494a791c53a8,
    +        0xabfa45da0edbde69,0x487db9d17636892,
    +        0xd6f8d7509292d603,0x45a9d2845d3c42b6,
    +        0x865b86925b9bc5c2,0xb8a2392ba45a9b2,
    +        0xa7f26836f282b732,0x8e6cac7768d7141e,
    +        0xd1ef0244af2364ff,0x3207d795430cd926,
    +        0x8335616aed761f1f,0x7f44e6bd49e807b8,
    +        0xa402b9c5a8d3a6e7,0x5f16206c9c6209a6,
    +        0xcd036837130890a1,0x36dba887c37a8c0f,
    +        0x802221226be55a64,0xc2494954da2c9789,
    +        0xa02aa96b06deb0fd,0xf2db9baa10b7bd6c,
    +        0xc83553c5c8965d3d,0x6f92829494e5acc7,
    +        0xfa42a8b73abbf48c,0xcb772339ba1f17f9,
    +        0x9c69a97284b578d7,0xff2a760414536efb,
    +        0xc38413cf25e2d70d,0xfef5138519684aba,
    +        0xf46518c2ef5b8cd1,0x7eb258665fc25d69,
    +        0x98bf2f79d5993802,0xef2f773ffbd97a61,
    +        0xbeeefb584aff8603,0xaafb550ffacfd8fa,
    +        0xeeaaba2e5dbf6784,0x95ba2a53f983cf38,
    +        0x952ab45cfa97a0b2,0xdd945a747bf26183,
    +        0xba756174393d88df,0x94f971119aeef9e4,
    +        0xe912b9d1478ceb17,0x7a37cd5601aab85d,
    +        0x91abb422ccb812ee,0xac62e055c10ab33a,
    +        0xb616a12b7fe617aa,0x577b986b314d6009,
    +        0xe39c49765fdf9d94,0xed5a7e85fda0b80b,
    +        0x8e41ade9fbebc27d,0x14588f13be847307,
    +        0xb1d219647ae6b31c,0x596eb2d8ae258fc8,
    +        0xde469fbd99a05fe3,0x6fca5f8ed9aef3bb,
    +        0x8aec23d680043bee,0x25de7bb9480d5854,
    +        0xada72ccc20054ae9,0xaf561aa79a10ae6a,
    +        0xd910f7ff28069da4,0x1b2ba1518094da04,
    +        0x87aa9aff79042286,0x90fb44d2f05d0842,
    +        0xa99541bf57452b28,0x353a1607ac744a53,
    +        0xd3fa922f2d1675f2,0x42889b8997915ce8,
    +        0x847c9b5d7c2e09b7,0x69956135febada11,
    +        0xa59bc234db398c25,0x43fab9837e699095,
    +        0xcf02b2c21207ef2e,0x94f967e45e03f4bb,
    +        0x8161afb94b44f57d,0x1d1be0eebac278f5,
    +        0xa1ba1ba79e1632dc,0x6462d92a69731732,
    +        0xca28a291859bbf93,0x7d7b8f7503cfdcfe,
    +        0xfcb2cb35e702af78,0x5cda735244c3d43e,
    +        0x9defbf01b061adab,0x3a0888136afa64a7,
    +        0xc56baec21c7a1916,0x88aaa1845b8fdd0,
    +        0xf6c69a72a3989f5b,0x8aad549e57273d45,
    +        0x9a3c2087a63f6399,0x36ac54e2f678864b,
    +        0xc0cb28a98fcf3c7f,0x84576a1bb416a7dd,
    +        0xf0fdf2d3f3c30b9f,0x656d44a2a11c51d5,
    +        0x969eb7c47859e743,0x9f644ae5a4b1b325,
    +        0xbc4665b596706114,0x873d5d9f0dde1fee,
    +        0xeb57ff22fc0c7959,0xa90cb506d155a7ea,
    +        0x9316ff75dd87cbd8,0x9a7f12442d588f2,
    +        0xb7dcbf5354e9bece,0xc11ed6d538aeb2f,
    +        0xe5d3ef282a242e81,0x8f1668c8a86da5fa,
    +        0x8fa475791a569d10,0xf96e017d694487bc,
    +        0xb38d92d760ec4455,0x37c981dcc395a9ac,
    +        0xe070f78d3927556a,0x85bbe253f47b1417,
    +        0x8c469ab843b89562,0x93956d7478ccec8e,
    +        0xaf58416654a6babb,0x387ac8d1970027b2,
    +        0xdb2e51bfe9d0696a,0x6997b05fcc0319e,
    +        0x88fcf317f22241e2,0x441fece3bdf81f03,
    +        0xab3c2fddeeaad25a,0xd527e81cad7626c3,
    +        0xd60b3bd56a5586f1,0x8a71e223d8d3b074,
    +        0x85c7056562757456,0xf6872d5667844e49,
    +        0xa738c6bebb12d16c,0xb428f8ac016561db,
    +        0xd106f86e69d785c7,0xe13336d701beba52,
    +        0x82a45b450226b39c,0xecc0024661173473,
    +        0xa34d721642b06084,0x27f002d7f95d0190,
    +        0xcc20ce9bd35c78a5,0x31ec038df7b441f4,
    +        0xff290242c83396ce,0x7e67047175a15271,
    +        0x9f79a169bd203e41,0xf0062c6e984d386,
    +        0xc75809c42c684dd1,0x52c07b78a3e60868,
    +        0xf92e0c3537826145,0xa7709a56ccdf8a82,
    +        0x9bbcc7a142b17ccb,0x88a66076400bb691,
    +        0xc2abf989935ddbfe,0x6acff893d00ea435,
    +        0xf356f7ebf83552fe,0x583f6b8c4124d43,
    +        0x98165af37b2153de,0xc3727a337a8b704a,
    +        0xbe1bf1b059e9a8d6,0x744f18c0592e4c5c,
    +        0xeda2ee1c7064130c,0x1162def06f79df73,
    +        0x9485d4d1c63e8be7,0x8addcb5645ac2ba8,
    +        0xb9a74a0637ce2ee1,0x6d953e2bd7173692,
    +        0xe8111c87c5c1ba99,0xc8fa8db6ccdd0437,
    +        0x910ab1d4db9914a0,0x1d9c9892400a22a2,
    +        0xb54d5e4a127f59c8,0x2503beb6d00cab4b,
    +        0xe2a0b5dc971f303a,0x2e44ae64840fd61d,
    +        0x8da471a9de737e24,0x5ceaecfed289e5d2,
    +        0xb10d8e1456105dad,0x7425a83e872c5f47,
    +        0xdd50f1996b947518,0xd12f124e28f77719,
    +        0x8a5296ffe33cc92f,0x82bd6b70d99aaa6f,
    +        0xace73cbfdc0bfb7b,0x636cc64d1001550b,
    +        0xd8210befd30efa5a,0x3c47f7e05401aa4e,
    +        0x8714a775e3e95c78,0x65acfaec34810a71,
    +        0xa8d9d1535ce3b396,0x7f1839a741a14d0d,
    +        0xd31045a8341ca07c,0x1ede48111209a050,
    +        0x83ea2b892091e44d,0x934aed0aab460432,
    +        0xa4e4b66b68b65d60,0xf81da84d5617853f,
    +        0xce1de40642e3f4b9,0x36251260ab9d668e,
    +        0x80d2ae83e9ce78f3,0xc1d72b7c6b426019,
    +        0xa1075a24e4421730,0xb24cf65b8612f81f,
    +        0xc94930ae1d529cfc,0xdee033f26797b627,
    +        0xfb9b7cd9a4a7443c,0x169840ef017da3b1,
    +        0x9d412e0806e88aa5,0x8e1f289560ee864e,
    +        0xc491798a08a2ad4e,0xf1a6f2bab92a27e2,
    +        0xf5b5d7ec8acb58a2,0xae10af696774b1db,
    +        0x9991a6f3d6bf1765,0xacca6da1e0a8ef29,
    +        0xbff610b0cc6edd3f,0x17fd090a58d32af3,
    +        0xeff394dcff8a948e,0xddfc4b4cef07f5b0,
    +        0x95f83d0a1fb69cd9,0x4abdaf101564f98e,
    +        0xbb764c4ca7a4440f,0x9d6d1ad41abe37f1,
    +        0xea53df5fd18d5513,0x84c86189216dc5ed,
    +        0x92746b9be2f8552c,0x32fd3cf5b4e49bb4,
    +        0xb7118682dbb66a77,0x3fbc8c33221dc2a1,
    +        0xe4d5e82392a40515,0xfabaf3feaa5334a,
    +        0x8f05b1163ba6832d,0x29cb4d87f2a7400e,
    +        0xb2c71d5bca9023f8,0x743e20e9ef511012,
    +        0xdf78e4b2bd342cf6,0x914da9246b255416,
    +        0x8bab8eefb6409c1a,0x1ad089b6c2f7548e,
    +        0xae9672aba3d0c320,0xa184ac2473b529b1,
    +        0xda3c0f568cc4f3e8,0xc9e5d72d90a2741e,
    +        0x8865899617fb1871,0x7e2fa67c7a658892,
    +        0xaa7eebfb9df9de8d,0xddbb901b98feeab7,
    +        0xd51ea6fa85785631,0x552a74227f3ea565,
    +        0x8533285c936b35de,0xd53a88958f87275f,
    +        0xa67ff273b8460356,0x8a892abaf368f137,
    +        0xd01fef10a657842c,0x2d2b7569b0432d85,
    +        0x8213f56a67f6b29b,0x9c3b29620e29fc73,
    +        0xa298f2c501f45f42,0x8349f3ba91b47b8f,
    +        0xcb3f2f7642717713,0x241c70a936219a73,
    +        0xfe0efb53d30dd4d7,0xed238cd383aa0110,
    +        0x9ec95d1463e8a506,0xf4363804324a40aa,
    +        0xc67bb4597ce2ce48,0xb143c6053edcd0d5,
    +        0xf81aa16fdc1b81da,0xdd94b7868e94050a,
    +        0x9b10a4e5e9913128,0xca7cf2b4191c8326,
    +        0xc1d4ce1f63f57d72,0xfd1c2f611f63a3f0,
    +        0xf24a01a73cf2dccf,0xbc633b39673c8cec,
    +        0x976e41088617ca01,0xd5be0503e085d813,
    +        0xbd49d14aa79dbc82,0x4b2d8644d8a74e18,
    +        0xec9c459d51852ba2,0xddf8e7d60ed1219e,
    +        0x93e1ab8252f33b45,0xcabb90e5c942b503,
    +        0xb8da1662e7b00a17,0x3d6a751f3b936243,
    +        0xe7109bfba19c0c9d,0xcc512670a783ad4,
    +        0x906a617d450187e2,0x27fb2b80668b24c5,
    +        0xb484f9dc9641e9da,0xb1f9f660802dedf6,
    +        0xe1a63853bbd26451,0x5e7873f8a0396973,
    +        0x8d07e33455637eb2,0xdb0b487b6423e1e8,
    +        0xb049dc016abc5e5f,0x91ce1a9a3d2cda62,
    +        0xdc5c5301c56b75f7,0x7641a140cc7810fb,
    +        0x89b9b3e11b6329ba,0xa9e904c87fcb0a9d,
    +        0xac2820d9623bf429,0x546345fa9fbdcd44,
    +        0xd732290fbacaf133,0xa97c177947ad4095,
    +        0x867f59a9d4bed6c0,0x49ed8eabcccc485d,
    +        0xa81f301449ee8c70,0x5c68f256bfff5a74,
    +        0xd226fc195c6a2f8c,0x73832eec6fff3111,
    +        0x83585d8fd9c25db7,0xc831fd53c5ff7eab,
    +        0xa42e74f3d032f525,0xba3e7ca8b77f5e55,
    +        0xcd3a1230c43fb26f,0x28ce1bd2e55f35eb,
    +        0x80444b5e7aa7cf85,0x7980d163cf5b81b3,
    +        0xa0555e361951c366,0xd7e105bcc332621f,
    +        0xc86ab5c39fa63440,0x8dd9472bf3fefaa7,
    +        0xfa856334878fc150,0xb14f98f6f0feb951,
    +        0x9c935e00d4b9d8d2,0x6ed1bf9a569f33d3,
    +        0xc3b8358109e84f07,0xa862f80ec4700c8,
    +        0xf4a642e14c6262c8,0xcd27bb612758c0fa,
    +        0x98e7e9cccfbd7dbd,0x8038d51cb897789c,
    +        0xbf21e44003acdd2c,0xe0470a63e6bd56c3,
    +        0xeeea5d5004981478,0x1858ccfce06cac74,
    +        0x95527a5202df0ccb,0xf37801e0c43ebc8,
    +        0xbaa718e68396cffd,0xd30560258f54e6ba,
    +        0xe950df20247c83fd,0x47c6b82ef32a2069,
    +        0x91d28b7416cdd27e,0x4cdc331d57fa5441,
    +        0xb6472e511c81471d,0xe0133fe4adf8e952,
    +        0xe3d8f9e563a198e5,0x58180fddd97723a6,
    +        0x8e679c2f5e44ff8f,0x570f09eaa7ea7648,};
    +
    +#endif // SIMDJSON_SRC_NUMBERPARSING_TABLES_CPP
    +/* end file internal/numberparsing_tables.cpp */
    +/* including internal/simdprune_tables.cpp: #include  */
    +/* begin file internal/simdprune_tables.cpp */
    +#ifndef SIMDJSON_SRC_SIMDPRUNE_TABLES_CPP
    +#define SIMDJSON_SRC_SIMDPRUNE_TABLES_CPP
    +
    +/* including simdjson/implementation_detection.h: #include  */
    +/* begin file simdjson/implementation_detection.h */
    +#ifndef SIMDJSON_IMPLEMENTATION_DETECTION_H
    +#define SIMDJSON_IMPLEMENTATION_DETECTION_H
    +
    +/* skipped duplicate #include "simdjson/base.h" */
    +
    +// 0 is reserved, because undefined SIMDJSON_IMPLEMENTATION equals 0 in preprocessor macros.
    +#define SIMDJSON_IMPLEMENTATION_ID_arm64 1
    +#define SIMDJSON_IMPLEMENTATION_ID_fallback 2
    +#define SIMDJSON_IMPLEMENTATION_ID_haswell 3
    +#define SIMDJSON_IMPLEMENTATION_ID_icelake 4
    +#define SIMDJSON_IMPLEMENTATION_ID_ppc64 5
    +#define SIMDJSON_IMPLEMENTATION_ID_westmere 6
    +
    +#define SIMDJSON_IMPLEMENTATION_ID_FOR(IMPL) SIMDJSON_CAT(SIMDJSON_IMPLEMENTATION_ID_, IMPL)
    +#define SIMDJSON_IMPLEMENTATION_ID SIMDJSON_IMPLEMENTATION_ID_FOR(SIMDJSON_IMPLEMENTATION)
    +
    +#define SIMDJSON_IMPLEMENTATION_IS(IMPL) SIMDJSON_IMPLEMENTATION_ID == SIMDJSON_IMPLEMENTATION_ID_FOR(IMPL)
    +
    +//
    +// First, figure out which implementations can be run. Doing it here makes it so we don't have to worry about the order
    +// in which we include them.
    +//
    +
    +#ifndef SIMDJSON_IMPLEMENTATION_ARM64
    +#define SIMDJSON_IMPLEMENTATION_ARM64 (SIMDJSON_IS_ARM64)
    +#endif
    +#define SIMDJSON_CAN_ALWAYS_RUN_ARM64 SIMDJSON_IMPLEMENTATION_ARM64 && SIMDJSON_IS_ARM64
    +
    +// Default Icelake to on if this is x86-64. Even if we're not compiled for it, it could be selected
    +// at runtime.
    +#ifndef SIMDJSON_IMPLEMENTATION_ICELAKE
    +#define SIMDJSON_IMPLEMENTATION_ICELAKE ((SIMDJSON_IS_X86_64) && (SIMDJSON_AVX512_ALLOWED) && (SIMDJSON_COMPILER_SUPPORTS_VBMI2))
    +#endif
    +
    +#ifdef _MSC_VER
    +// To see why  (__BMI__) && (__PCLMUL__) && (__LZCNT__) are not part of this next line, see
    +// https://github.com/simdjson/simdjson/issues/1247
    +#define SIMDJSON_CAN_ALWAYS_RUN_ICELAKE ((SIMDJSON_IMPLEMENTATION_ICELAKE) && (__AVX2__) && (__AVX512F__) && (__AVX512DQ__) && (__AVX512CD__) && (__AVX512BW__) && (__AVX512VL__) && (__AVX512VBMI2__))
    +#else
    +#define SIMDJSON_CAN_ALWAYS_RUN_ICELAKE ((SIMDJSON_IMPLEMENTATION_ICELAKE) && (__AVX2__) && (__BMI__) && (__PCLMUL__) && (__LZCNT__) && (__AVX512F__) && (__AVX512DQ__) && (__AVX512CD__) && (__AVX512BW__) && (__AVX512VL__) && (__AVX512VBMI2__))
    +#endif
    +
    +// Default Haswell to on if this is x86-64. Even if we're not compiled for it, it could be selected
    +// at runtime.
    +#ifndef SIMDJSON_IMPLEMENTATION_HASWELL
    +#if SIMDJSON_CAN_ALWAYS_RUN_ICELAKE
    +// if icelake is always available, never enable haswell.
    +#define SIMDJSON_IMPLEMENTATION_HASWELL 0
    +#else
    +#define SIMDJSON_IMPLEMENTATION_HASWELL SIMDJSON_IS_X86_64
    +#endif
    +#endif
    +#ifdef _MSC_VER
    +// To see why  (__BMI__) && (__PCLMUL__) && (__LZCNT__) are not part of this next line, see
    +// https://github.com/simdjson/simdjson/issues/1247
    +#define SIMDJSON_CAN_ALWAYS_RUN_HASWELL ((SIMDJSON_IMPLEMENTATION_HASWELL) && (SIMDJSON_IS_X86_64) && (__AVX2__))
    +#else
    +#define SIMDJSON_CAN_ALWAYS_RUN_HASWELL ((SIMDJSON_IMPLEMENTATION_HASWELL) && (SIMDJSON_IS_X86_64) && (__AVX2__) && (__BMI__) && (__PCLMUL__) && (__LZCNT__))
    +#endif
    +
    +// Default Westmere to on if this is x86-64.
    +#ifndef SIMDJSON_IMPLEMENTATION_WESTMERE
    +#if SIMDJSON_CAN_ALWAYS_RUN_ICELAKE || SIMDJSON_CAN_ALWAYS_RUN_HASWELL
    +// if icelake or haswell are always available, never enable westmere.
    +#define SIMDJSON_IMPLEMENTATION_WESTMERE 0
    +#else
    +#define SIMDJSON_IMPLEMENTATION_WESTMERE SIMDJSON_IS_X86_64
    +#endif
    +#endif
    +#define SIMDJSON_CAN_ALWAYS_RUN_WESTMERE (SIMDJSON_IMPLEMENTATION_WESTMERE && SIMDJSON_IS_X86_64 && __SSE4_2__ && __PCLMUL__)
    +
    +#ifndef SIMDJSON_IMPLEMENTATION_PPC64
    +#define SIMDJSON_IMPLEMENTATION_PPC64 (SIMDJSON_IS_PPC64 && SIMDJSON_IS_PPC64_VMX)
    +#endif
    +#define SIMDJSON_CAN_ALWAYS_RUN_PPC64 SIMDJSON_IMPLEMENTATION_PPC64 && SIMDJSON_IS_PPC64 && SIMDJSON_IS_PPC64_VMX
    +
    +// Default Fallback to on unless a builtin implementation has already been selected.
    +#ifndef SIMDJSON_IMPLEMENTATION_FALLBACK
    +#if SIMDJSON_CAN_ALWAYS_RUN_ARM64 || SIMDJSON_CAN_ALWAYS_RUN_ICELAKE || SIMDJSON_CAN_ALWAYS_RUN_HASWELL || SIMDJSON_CAN_ALWAYS_RUN_WESTMERE || SIMDJSON_CAN_ALWAYS_RUN_PPC64
    +// if anything at all except fallback can always run, then disable fallback.
    +#define SIMDJSON_IMPLEMENTATION_FALLBACK 0
    +#else
    +#define SIMDJSON_IMPLEMENTATION_FALLBACK 1
    +#endif
    +#endif
    +#define SIMDJSON_CAN_ALWAYS_RUN_FALLBACK SIMDJSON_IMPLEMENTATION_FALLBACK
    +
    +// Determine the best builtin implementation
    +#ifndef SIMDJSON_BUILTIN_IMPLEMENTATION
    +
    +#if SIMDJSON_CAN_ALWAYS_RUN_ICELAKE
    +#define SIMDJSON_BUILTIN_IMPLEMENTATION icelake
    +#elif SIMDJSON_CAN_ALWAYS_RUN_HASWELL
    +#define SIMDJSON_BUILTIN_IMPLEMENTATION haswell
    +#elif SIMDJSON_CAN_ALWAYS_RUN_WESTMERE
    +#define SIMDJSON_BUILTIN_IMPLEMENTATION westmere
    +#elif SIMDJSON_CAN_ALWAYS_RUN_ARM64
    +#define SIMDJSON_BUILTIN_IMPLEMENTATION arm64
    +#elif SIMDJSON_CAN_ALWAYS_RUN_PPC64
    +#define SIMDJSON_BUILTIN_IMPLEMENTATION ppc64
    +#elif SIMDJSON_CAN_ALWAYS_RUN_FALLBACK
    +#define SIMDJSON_BUILTIN_IMPLEMENTATION fallback
    +#else
    +#error "All possible implementations (including fallback) have been disabled! simdjson will not run."
    +#endif
    +
    +#endif // SIMDJSON_BUILTIN_IMPLEMENTATION
    +
    +#define SIMDJSON_BUILTIN_IMPLEMENTATION_ID SIMDJSON_IMPLEMENTATION_ID_FOR(SIMDJSON_BUILTIN_IMPLEMENTATION)
    +#define SIMDJSON_BUILTIN_IMPLEMENTATION_IS(IMPL) SIMDJSON_BUILTIN_IMPLEMENTATION_ID == SIMDJSON_IMPLEMENTATION_ID_FOR(IMPL)
    +
    +#endif // SIMDJSON_IMPLEMENTATION_DETECTION_H
    +/* end file simdjson/implementation_detection.h */
    +
    +#if SIMDJSON_IMPLEMENTATION_ARM64 || SIMDJSON_IMPLEMENTATION_ICELAKE || SIMDJSON_IMPLEMENTATION_HASWELL || SIMDJSON_IMPLEMENTATION_WESTMERE || SIMDJSON_IMPLEMENTATION_PPC64
    +
    +#include 
    +
    +namespace simdjson { // table modified and copied from
    +namespace internal { // http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetTable
    +SIMDJSON_DLLIMPORTEXPORT  const unsigned char BitsSetTable256mul2[256] = {
    +    0,  2,  2,  4,  2,  4,  4,  6,  2,  4,  4,  6,  4,  6,  6,  8,  2,  4,  4,
    +    6,  4,  6,  6,  8,  4,  6,  6,  8,  6,  8,  8,  10, 2,  4,  4,  6,  4,  6,
    +    6,  8,  4,  6,  6,  8,  6,  8,  8,  10, 4,  6,  6,  8,  6,  8,  8,  10, 6,
    +    8,  8,  10, 8,  10, 10, 12, 2,  4,  4,  6,  4,  6,  6,  8,  4,  6,  6,  8,
    +    6,  8,  8,  10, 4,  6,  6,  8,  6,  8,  8,  10, 6,  8,  8,  10, 8,  10, 10,
    +    12, 4,  6,  6,  8,  6,  8,  8,  10, 6,  8,  8,  10, 8,  10, 10, 12, 6,  8,
    +    8,  10, 8,  10, 10, 12, 8,  10, 10, 12, 10, 12, 12, 14, 2,  4,  4,  6,  4,
    +    6,  6,  8,  4,  6,  6,  8,  6,  8,  8,  10, 4,  6,  6,  8,  6,  8,  8,  10,
    +    6,  8,  8,  10, 8,  10, 10, 12, 4,  6,  6,  8,  6,  8,  8,  10, 6,  8,  8,
    +    10, 8,  10, 10, 12, 6,  8,  8,  10, 8,  10, 10, 12, 8,  10, 10, 12, 10, 12,
    +    12, 14, 4,  6,  6,  8,  6,  8,  8,  10, 6,  8,  8,  10, 8,  10, 10, 12, 6,
    +    8,  8,  10, 8,  10, 10, 12, 8,  10, 10, 12, 10, 12, 12, 14, 6,  8,  8,  10,
    +    8,  10, 10, 12, 8,  10, 10, 12, 10, 12, 12, 14, 8,  10, 10, 12, 10, 12, 12,
    +    14, 10, 12, 12, 14, 12, 14, 14, 16};
    +
    +SIMDJSON_DLLIMPORTEXPORT  const uint8_t pshufb_combine_table[272] = {
    +    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
    +    0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x08,
    +    0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0x00, 0x01, 0x02, 0x03,
    +    0x04, 0x05, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff,
    +    0x00, 0x01, 0x02, 0x03, 0x04, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
    +    0x0f, 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 0x08, 0x09, 0x0a, 0x0b,
    +    0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x08,
    +    0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff,
    +    0x00, 0x01, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff,
    +    0xff, 0xff, 0xff, 0xff, 0x00, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
    +    0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x08, 0x09, 0x0a, 0x0b,
    +    0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    +};
    +
    +// 256 * 8 bytes = 2kB, easily fits in cache.
    +SIMDJSON_DLLIMPORTEXPORT  const uint64_t thintable_epi8[256] = {
    +    0x0706050403020100, 0x0007060504030201, 0x0007060504030200,
    +    0x0000070605040302, 0x0007060504030100, 0x0000070605040301,
    +    0x0000070605040300, 0x0000000706050403, 0x0007060504020100,
    +    0x0000070605040201, 0x0000070605040200, 0x0000000706050402,
    +    0x0000070605040100, 0x0000000706050401, 0x0000000706050400,
    +    0x0000000007060504, 0x0007060503020100, 0x0000070605030201,
    +    0x0000070605030200, 0x0000000706050302, 0x0000070605030100,
    +    0x0000000706050301, 0x0000000706050300, 0x0000000007060503,
    +    0x0000070605020100, 0x0000000706050201, 0x0000000706050200,
    +    0x0000000007060502, 0x0000000706050100, 0x0000000007060501,
    +    0x0000000007060500, 0x0000000000070605, 0x0007060403020100,
    +    0x0000070604030201, 0x0000070604030200, 0x0000000706040302,
    +    0x0000070604030100, 0x0000000706040301, 0x0000000706040300,
    +    0x0000000007060403, 0x0000070604020100, 0x0000000706040201,
    +    0x0000000706040200, 0x0000000007060402, 0x0000000706040100,
    +    0x0000000007060401, 0x0000000007060400, 0x0000000000070604,
    +    0x0000070603020100, 0x0000000706030201, 0x0000000706030200,
    +    0x0000000007060302, 0x0000000706030100, 0x0000000007060301,
    +    0x0000000007060300, 0x0000000000070603, 0x0000000706020100,
    +    0x0000000007060201, 0x0000000007060200, 0x0000000000070602,
    +    0x0000000007060100, 0x0000000000070601, 0x0000000000070600,
    +    0x0000000000000706, 0x0007050403020100, 0x0000070504030201,
    +    0x0000070504030200, 0x0000000705040302, 0x0000070504030100,
    +    0x0000000705040301, 0x0000000705040300, 0x0000000007050403,
    +    0x0000070504020100, 0x0000000705040201, 0x0000000705040200,
    +    0x0000000007050402, 0x0000000705040100, 0x0000000007050401,
    +    0x0000000007050400, 0x0000000000070504, 0x0000070503020100,
    +    0x0000000705030201, 0x0000000705030200, 0x0000000007050302,
    +    0x0000000705030100, 0x0000000007050301, 0x0000000007050300,
    +    0x0000000000070503, 0x0000000705020100, 0x0000000007050201,
    +    0x0000000007050200, 0x0000000000070502, 0x0000000007050100,
    +    0x0000000000070501, 0x0000000000070500, 0x0000000000000705,
    +    0x0000070403020100, 0x0000000704030201, 0x0000000704030200,
    +    0x0000000007040302, 0x0000000704030100, 0x0000000007040301,
    +    0x0000000007040300, 0x0000000000070403, 0x0000000704020100,
    +    0x0000000007040201, 0x0000000007040200, 0x0000000000070402,
    +    0x0000000007040100, 0x0000000000070401, 0x0000000000070400,
    +    0x0000000000000704, 0x0000000703020100, 0x0000000007030201,
    +    0x0000000007030200, 0x0000000000070302, 0x0000000007030100,
    +    0x0000000000070301, 0x0000000000070300, 0x0000000000000703,
    +    0x0000000007020100, 0x0000000000070201, 0x0000000000070200,
    +    0x0000000000000702, 0x0000000000070100, 0x0000000000000701,
    +    0x0000000000000700, 0x0000000000000007, 0x0006050403020100,
    +    0x0000060504030201, 0x0000060504030200, 0x0000000605040302,
    +    0x0000060504030100, 0x0000000605040301, 0x0000000605040300,
    +    0x0000000006050403, 0x0000060504020100, 0x0000000605040201,
    +    0x0000000605040200, 0x0000000006050402, 0x0000000605040100,
    +    0x0000000006050401, 0x0000000006050400, 0x0000000000060504,
    +    0x0000060503020100, 0x0000000605030201, 0x0000000605030200,
    +    0x0000000006050302, 0x0000000605030100, 0x0000000006050301,
    +    0x0000000006050300, 0x0000000000060503, 0x0000000605020100,
    +    0x0000000006050201, 0x0000000006050200, 0x0000000000060502,
    +    0x0000000006050100, 0x0000000000060501, 0x0000000000060500,
    +    0x0000000000000605, 0x0000060403020100, 0x0000000604030201,
    +    0x0000000604030200, 0x0000000006040302, 0x0000000604030100,
    +    0x0000000006040301, 0x0000000006040300, 0x0000000000060403,
    +    0x0000000604020100, 0x0000000006040201, 0x0000000006040200,
    +    0x0000000000060402, 0x0000000006040100, 0x0000000000060401,
    +    0x0000000000060400, 0x0000000000000604, 0x0000000603020100,
    +    0x0000000006030201, 0x0000000006030200, 0x0000000000060302,
    +    0x0000000006030100, 0x0000000000060301, 0x0000000000060300,
    +    0x0000000000000603, 0x0000000006020100, 0x0000000000060201,
    +    0x0000000000060200, 0x0000000000000602, 0x0000000000060100,
    +    0x0000000000000601, 0x0000000000000600, 0x0000000000000006,
    +    0x0000050403020100, 0x0000000504030201, 0x0000000504030200,
    +    0x0000000005040302, 0x0000000504030100, 0x0000000005040301,
    +    0x0000000005040300, 0x0000000000050403, 0x0000000504020100,
    +    0x0000000005040201, 0x0000000005040200, 0x0000000000050402,
    +    0x0000000005040100, 0x0000000000050401, 0x0000000000050400,
    +    0x0000000000000504, 0x0000000503020100, 0x0000000005030201,
    +    0x0000000005030200, 0x0000000000050302, 0x0000000005030100,
    +    0x0000000000050301, 0x0000000000050300, 0x0000000000000503,
    +    0x0000000005020100, 0x0000000000050201, 0x0000000000050200,
    +    0x0000000000000502, 0x0000000000050100, 0x0000000000000501,
    +    0x0000000000000500, 0x0000000000000005, 0x0000000403020100,
    +    0x0000000004030201, 0x0000000004030200, 0x0000000000040302,
    +    0x0000000004030100, 0x0000000000040301, 0x0000000000040300,
    +    0x0000000000000403, 0x0000000004020100, 0x0000000000040201,
    +    0x0000000000040200, 0x0000000000000402, 0x0000000000040100,
    +    0x0000000000000401, 0x0000000000000400, 0x0000000000000004,
    +    0x0000000003020100, 0x0000000000030201, 0x0000000000030200,
    +    0x0000000000000302, 0x0000000000030100, 0x0000000000000301,
    +    0x0000000000000300, 0x0000000000000003, 0x0000000000020100,
    +    0x0000000000000201, 0x0000000000000200, 0x0000000000000002,
    +    0x0000000000000100, 0x0000000000000001, 0x0000000000000000,
    +    0x0000000000000000,
    +}; //static uint64_t thintable_epi8[256]
    +
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif //  SIMDJSON_IMPLEMENTATION_ARM64 || SIMDJSON_IMPLEMENTATION_ICELAKE || SIMDJSON_IMPLEMENTATION_HASWELL || SIMDJSON_IMPLEMENTATION_WESTMERE || SIMDJSON_IMPLEMENTATION_PPC64
    +
    +#endif // SIMDJSON_SRC_SIMDPRUNE_TABLES_CPP
    +/* end file internal/simdprune_tables.cpp */
    +
    +/* including simdjson/generic/dependencies.h: #include  */
    +/* begin file simdjson/generic/dependencies.h */
    +#ifdef SIMDJSON_CONDITIONAL_INCLUDE
    +#error simdjson/generic/dependencies.h must be included before defining SIMDJSON_CONDITIONAL_INCLUDE!
    +#endif
    +
    +#ifndef SIMDJSON_GENERIC_DEPENDENCIES_H
    +#define SIMDJSON_GENERIC_DEPENDENCIES_H
    +
    +// Internal headers needed for generics.
    +// All includes referencing simdjson headers *not* under simdjson/generic must be here!
    +// Otherwise, amalgamation will fail.
    +/* skipped duplicate #include "simdjson/base.h" */
    +/* including simdjson/implementation.h: #include "simdjson/implementation.h" */
    +/* begin file simdjson/implementation.h */
    +#ifndef SIMDJSON_IMPLEMENTATION_H
    +#define SIMDJSON_IMPLEMENTATION_H
    +
    +/* including simdjson/internal/atomic_ptr.h: #include "simdjson/internal/atomic_ptr.h" */
    +/* begin file simdjson/internal/atomic_ptr.h */
    +#ifndef SIMDJSON_INTERNAL_ATOMIC_PTR_H
    +#define SIMDJSON_INTERNAL_ATOMIC_PTR_H
    +
    +/* skipped duplicate #include "simdjson/base.h" */
    +#include 
    +
    +namespace simdjson {
    +namespace internal {
    +
    +template
    +class atomic_ptr {
    +public:
    +  atomic_ptr(T *_ptr) : ptr{_ptr} {}
    +
    +  operator const T*() const { return ptr.load(); }
    +  const T& operator*() const { return *ptr; }
    +  const T* operator->() const { return ptr.load(); }
    +
    +  operator T*() { return ptr.load(); }
    +  T& operator*() { return *ptr; }
    +  T* operator->() { return ptr.load(); }
    +  atomic_ptr& operator=(T *_ptr) { ptr = _ptr; return *this; }
    +
    +private:
    +  std::atomic ptr;
    +};
    +
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_INTERNAL_ATOMIC_PTR_H
    +/* end file simdjson/internal/atomic_ptr.h */
    +/* including simdjson/internal/dom_parser_implementation.h: #include "simdjson/internal/dom_parser_implementation.h" */
    +/* begin file simdjson/internal/dom_parser_implementation.h */
    +#ifndef SIMDJSON_INTERNAL_DOM_PARSER_IMPLEMENTATION_H
    +#define SIMDJSON_INTERNAL_DOM_PARSER_IMPLEMENTATION_H
    +
    +/* skipped duplicate #include "simdjson/base.h" */
    +/* skipped duplicate #include "simdjson/error.h" */
    +#include 
    +
    +namespace simdjson {
    +
    +namespace dom {
    +class document;
    +} // namespace dom
    +
    +/**
    +* This enum is used with the dom_parser_implementation::stage1 function.
    +* 1) The regular mode expects a fully formed JSON document.
    +* 2) The streaming_partial mode expects a possibly truncated
    +* input within a stream on JSON documents.
    +* 3) The stream_final mode allows us to truncate final
    +* unterminated strings. It is useful in conjunction with streaming_partial.
    +*/
    +enum class stage1_mode { regular, streaming_partial, streaming_final};
    +
    +/**
    + * Returns true if mode == streaming_partial or mode == streaming_final
    + */
    +inline bool is_streaming(stage1_mode mode) {
    +  // performance note: it is probably faster to check that mode is different
    +  // from regular than checking that it is either streaming_partial or streaming_final.
    +  return (mode != stage1_mode::regular);
    +  // return (mode == stage1_mode::streaming_partial || mode == stage1_mode::streaming_final);
    +}
    +
    +
    +namespace internal {
    +
    +
    +/**
    + * An implementation of simdjson's DOM parser for a particular CPU architecture.
    + *
    + * This class is expected to be accessed only by pointer, and never move in memory (though the
    + * pointer can move).
    + */
    +class dom_parser_implementation {
    +public:
    +
    +  /**
    +   * @private For internal implementation use
    +   *
    +   * Run a full JSON parse on a single document (stage1 + stage2).
    +   *
    +   * Guaranteed only to be called when capacity > document length.
    +   *
    +   * Overridden by each implementation.
    +   *
    +   * @param buf The json document to parse. *MUST* be allocated up to len + SIMDJSON_PADDING bytes.
    +   * @param len The length of the json document.
    +   * @return The error code, or SUCCESS if there was no error.
    +   */
    +  simdjson_warn_unused virtual error_code parse(const uint8_t *buf, size_t len, dom::document &doc) noexcept = 0;
    +
    +  /**
    +   * @private For internal implementation use
    +   *
    +   * Stage 1 of the document parser.
    +   *
    +   * Guaranteed only to be called when capacity > document length.
    +   *
    +   * Overridden by each implementation.
    +   *
    +   * @param buf The json document to parse.
    +   * @param len The length of the json document.
    +   * @param streaming Whether this is being called by parser::parse_many.
    +   * @return The error code, or SUCCESS if there was no error.
    +   */
    +  simdjson_warn_unused virtual error_code stage1(const uint8_t *buf, size_t len, stage1_mode streaming) noexcept = 0;
    +
    +  /**
    +   * @private For internal implementation use
    +   *
    +   * Stage 2 of the document parser.
    +   *
    +   * Called after stage1().
    +   *
    +   * Overridden by each implementation.
    +   *
    +   * @param doc The document to output to.
    +   * @return The error code, or SUCCESS if there was no error.
    +   */
    +  simdjson_warn_unused virtual error_code stage2(dom::document &doc) noexcept = 0;
    +
    +  /**
    +   * @private For internal implementation use
    +   *
    +   * Stage 2 of the document parser for parser::parse_many.
    +   *
    +   * Guaranteed only to be called after stage1().
    +   * Overridden by each implementation.
    +   *
    +   * @param doc The document to output to.
    +   * @return The error code, SUCCESS if there was no error, or EMPTY if all documents have been parsed.
    +   */
    +  simdjson_warn_unused virtual error_code stage2_next(dom::document &doc) noexcept = 0;
    +
    +  /**
    +   * Unescape a valid UTF-8 string from src to dst, stopping at a final unescaped quote. There
    +   * must be an unescaped quote terminating the string. It returns the final output
    +   * position as pointer. In case of error (e.g., the string has bad escaped codes),
    +   * then null_nullptrptr is returned. It is assumed that the output buffer is large
    +   * enough. E.g., if src points at 'joe"', then dst needs to have four free bytes +
    +   * SIMDJSON_PADDING bytes.
    +   *
    +   * Overridden by each implementation.
    +   *
    +   * @param str pointer to the beginning of a valid UTF-8 JSON string, must end with an unescaped quote.
    +   * @param dst pointer to a destination buffer, it must point a region in memory of sufficient size.
    +   * @param allow_replacement whether we allow a replacement character when the UTF-8 contains unmatched surrogate pairs.
    +   * @return end of the of the written region (exclusive) or nullptr in case of error.
    +   */
    +  simdjson_warn_unused virtual uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) const noexcept = 0;
    +
    +  /**
    +   * Unescape a NON-valid UTF-8 string from src to dst, stopping at a final unescaped quote. There
    +   * must be an unescaped quote terminating the string. It returns the final output
    +   * position as pointer. In case of error (e.g., the string has bad escaped codes),
    +   * then null_nullptrptr is returned. It is assumed that the output buffer is large
    +   * enough. E.g., if src points at 'joe"', then dst needs to have four free bytes +
    +   * SIMDJSON_PADDING bytes.
    +   *
    +   * Overridden by each implementation.
    +   *
    +   * @param str pointer to the beginning of a possibly invalid UTF-8 JSON string, must end with an unescaped quote.
    +   * @param dst pointer to a destination buffer, it must point a region in memory of sufficient size.
    +   * @return end of the of the written region (exclusive) or nullptr in case of error.
    +   */
    +  simdjson_warn_unused virtual uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept = 0;
    +
    +  /**
    +   * Change the capacity of this parser.
    +   *
    +   * The capacity can never exceed SIMDJSON_MAXSIZE_BYTES (e.g., 4 GB)
    +   * and an CAPACITY error is returned if it is attempted.
    +   *
    +   * Generally used for reallocation.
    +   *
    +   * @param capacity The new capacity.
    +   * @param max_depth The new max_depth.
    +   * @return The error code, or SUCCESS if there was no error.
    +   */
    +  virtual error_code set_capacity(size_t capacity) noexcept = 0;
    +
    +  /**
    +   * Change the max depth of this parser.
    +   *
    +   * Generally used for reallocation.
    +   *
    +   * @param capacity The new capacity.
    +   * @param max_depth The new max_depth.
    +   * @return The error code, or SUCCESS if there was no error.
    +   */
    +  virtual error_code set_max_depth(size_t max_depth) noexcept = 0;
    +
    +  /**
    +   * Deallocate this parser.
    +   */
    +  virtual ~dom_parser_implementation() = default;
    +
    +  /** Number of structural indices passed from stage 1 to stage 2 */
    +  uint32_t n_structural_indexes{0};
    +  /** Structural indices passed from stage 1 to stage 2 */
    +  std::unique_ptr structural_indexes{};
    +  /** Next structural index to parse */
    +  uint32_t next_structural_index{0};
    +
    +  /**
    +   * The largest document this parser can support without reallocating.
    +   *
    +   * @return Current capacity, in bytes.
    +   */
    +  simdjson_inline size_t capacity() const noexcept;
    +
    +  /**
    +   * The maximum level of nested object and arrays supported by this parser.
    +   *
    +   * @return Maximum depth, in bytes.
    +   */
    +  simdjson_inline size_t max_depth() const noexcept;
    +
    +  /**
    +   * Ensure this parser has enough memory to process JSON documents up to `capacity` bytes in length
    +   * and `max_depth` depth.
    +   *
    +   * @param capacity The new capacity.
    +   * @param max_depth The new max_depth. Defaults to DEFAULT_MAX_DEPTH.
    +   * @return The error, if there is one.
    +   */
    +  simdjson_warn_unused inline error_code allocate(size_t capacity, size_t max_depth) noexcept;
    +
    +
    +protected:
    +  /**
    +   * The maximum document length this parser supports.
    +   *
    +   * Buffers are large enough to handle any document up to this length.
    +   */
    +  size_t _capacity{0};
    +
    +  /**
    +   * The maximum depth (number of nested objects and arrays) supported by this parser.
    +   *
    +   * Defaults to DEFAULT_MAX_DEPTH.
    +   */
    +  size_t _max_depth{0};
    +
    +  // Declaring these so that subclasses can use them to implement their constructors.
    +  simdjson_inline dom_parser_implementation() noexcept;
    +  simdjson_inline dom_parser_implementation(dom_parser_implementation &&other) noexcept;
    +  simdjson_inline dom_parser_implementation &operator=(dom_parser_implementation &&other) noexcept;
    +
    +  simdjson_inline dom_parser_implementation(const dom_parser_implementation &) noexcept = delete;
    +  simdjson_inline dom_parser_implementation &operator=(const dom_parser_implementation &other) noexcept = delete;
    +}; // class dom_parser_implementation
    +
    +simdjson_inline dom_parser_implementation::dom_parser_implementation() noexcept = default;
    +simdjson_inline dom_parser_implementation::dom_parser_implementation(dom_parser_implementation &&other) noexcept = default;
    +simdjson_inline dom_parser_implementation &dom_parser_implementation::operator=(dom_parser_implementation &&other) noexcept = default;
    +
    +simdjson_inline size_t dom_parser_implementation::capacity() const noexcept {
    +  return _capacity;
    +}
    +
    +simdjson_inline size_t dom_parser_implementation::max_depth() const noexcept {
    +  return _max_depth;
    +}
    +
    +simdjson_warn_unused
    +inline error_code dom_parser_implementation::allocate(size_t capacity, size_t max_depth) noexcept {
    +  if (this->max_depth() != max_depth) {
    +    error_code err = set_max_depth(max_depth);
    +    if (err) { return err; }
    +  }
    +  if (_capacity != capacity) {
    +    error_code err = set_capacity(capacity);
    +    if (err) { return err; }
    +  }
    +  return SUCCESS;
    +}
    +
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_INTERNAL_DOM_PARSER_IMPLEMENTATION_H
    +/* end file simdjson/internal/dom_parser_implementation.h */
    +
    +#include 
    +
    +namespace simdjson {
    +
    +/**
    + * Validate the UTF-8 string.
    + *
    + * @param buf the string to validate.
    + * @param len the length of the string in bytes.
    + * @return true if the string is valid UTF-8.
    + */
    +simdjson_warn_unused bool validate_utf8(const char * buf, size_t len) noexcept;
    +/**
    + * Validate the UTF-8 string.
    + *
    + * @param sv the string_view to validate.
    + * @return true if the string is valid UTF-8.
    + */
    +simdjson_inline simdjson_warn_unused bool validate_utf8(const std::string_view sv) noexcept {
    +  return validate_utf8(sv.data(), sv.size());
    +}
    +
    +/**
    + * Validate the UTF-8 string.
    + *
    + * @param p the string to validate.
    + * @return true if the string is valid UTF-8.
    + */
    +simdjson_inline simdjson_warn_unused bool validate_utf8(const std::string& s) noexcept {
    +  return validate_utf8(s.data(), s.size());
    +}
    +
    +/**
    + * An implementation of simdjson for a particular CPU architecture.
    + *
    + * Also used to maintain the currently active implementation. The active implementation is
    + * automatically initialized on first use to the most advanced implementation supported by the host.
    + */
    +class implementation {
    +public:
    +
    +  /**
    +   * The name of this implementation.
    +   *
    +   *     const implementation *impl = simdjson::get_active_implementation();
    +   *     cout << "simdjson is optimized for " << impl->name() << "(" << impl->description() << ")" << endl;
    +   *
    +   * @return the name of the implementation, e.g. "haswell", "westmere", "arm64".
    +   */
    +  virtual const std::string &name() const { return _name; }
    +
    +  /**
    +   * The description of this implementation.
    +   *
    +   *     const implementation *impl = simdjson::get_active_implementation();
    +   *     cout << "simdjson is optimized for " << impl->name() << "(" << impl->description() << ")" << endl;
    +   *
    +   * @return the description of the implementation, e.g. "Intel/AMD AVX2", "Intel/AMD SSE4.2", "ARM NEON".
    +   */
    +  virtual const std::string &description() const { return _description; }
    +
    +  /**
    +   * The instruction sets this implementation is compiled against
    +   * and the current CPU match. This function may poll the current CPU/system
    +   * and should therefore not be called too often if performance is a concern.
    +   *
    +   * @return true if the implementation can be safely used on the current system (determined at runtime).
    +   */
    +  bool supported_by_runtime_system() const;
    +
    +  /**
    +   * @private For internal implementation use
    +   *
    +   * The instruction sets this implementation is compiled against.
    +   *
    +   * @return a mask of all required `internal::instruction_set::` values.
    +   */
    +  virtual uint32_t required_instruction_sets() const { return _required_instruction_sets; }
    +
    +  /**
    +   * @private For internal implementation use
    +   *
    +   *     const implementation *impl = simdjson::get_active_implementation();
    +   *     cout << "simdjson is optimized for " << impl->name() << "(" << impl->description() << ")" << endl;
    +   *
    +   * @param capacity The largest document that will be passed to the parser.
    +   * @param max_depth The maximum JSON object/array nesting this parser is expected to handle.
    +   * @param dst The place to put the resulting parser implementation.
    +   * @return the error code, or SUCCESS if there was no error.
    +   */
    +  virtual error_code create_dom_parser_implementation(
    +    size_t capacity,
    +    size_t max_depth,
    +    std::unique_ptr &dst
    +  ) const noexcept = 0;
    +
    +  /**
    +   * @private For internal implementation use
    +   *
    +   * Minify the input string assuming that it represents a JSON string, does not parse or validate.
    +   *
    +   * Overridden by each implementation.
    +   *
    +   * @param buf the json document to minify.
    +   * @param len the length of the json document.
    +   * @param dst the buffer to write the minified document to. *MUST* be allocated up to len + SIMDJSON_PADDING bytes.
    +   * @param dst_len the number of bytes written. Output only.
    +   * @return the error code, or SUCCESS if there was no error.
    +   */
    +  simdjson_warn_unused virtual error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept = 0;
    +
    +
    +  /**
    +   * Validate the UTF-8 string.
    +   *
    +   * Overridden by each implementation.
    +   *
    +   * @param buf the string to validate.
    +   * @param len the length of the string in bytes.
    +   * @return true if and only if the string is valid UTF-8.
    +   */
    +  simdjson_warn_unused virtual bool validate_utf8(const char *buf, size_t len) const noexcept = 0;
    +
    +protected:
    +  /** @private Construct an implementation with the given name and description. For subclasses. */
    +  simdjson_inline implementation(
    +    std::string_view name,
    +    std::string_view description,
    +    uint32_t required_instruction_sets
    +  ) :
    +    _name(name),
    +    _description(description),
    +    _required_instruction_sets(required_instruction_sets)
    +  {
    +  }
    +  virtual ~implementation()=default;
    +
    +private:
    +  /**
    +   * The name of this implementation.
    +   */
    +  const std::string _name;
    +
    +  /**
    +   * The description of this implementation.
    +   */
    +  const std::string _description;
    +
    +  /**
    +   * Instruction sets required for this implementation.
    +   */
    +  const uint32_t _required_instruction_sets;
    +};
    +
    +/** @private */
    +namespace internal {
    +
    +/**
    + * The list of available implementations compiled into simdjson.
    + */
    +class available_implementation_list {
    +public:
    +  /** Get the list of available implementations compiled into simdjson */
    +  simdjson_inline available_implementation_list() {}
    +  /** Number of implementations */
    +  size_t size() const noexcept;
    +  /** STL const begin() iterator */
    +  const implementation * const *begin() const noexcept;
    +  /** STL const end() iterator */
    +  const implementation * const *end() const noexcept;
    +
    +  /**
    +   * Get the implementation with the given name.
    +   *
    +   * Case sensitive.
    +   *
    +   *     const implementation *impl = simdjson::get_available_implementations()["westmere"];
    +   *     if (!impl) { exit(1); }
    +   *     if (!imp->supported_by_runtime_system()) { exit(1); }
    +   *     simdjson::get_active_implementation() = impl;
    +   *
    +   * @param name the implementation to find, e.g. "westmere", "haswell", "arm64"
    +   * @return the implementation, or nullptr if the parse failed.
    +   */
    +  const implementation * operator[](const std::string_view &name) const noexcept {
    +    for (const implementation * impl : *this) {
    +      if (impl->name() == name) { return impl; }
    +    }
    +    return nullptr;
    +  }
    +
    +  /**
    +   * Detect the most advanced implementation supported by the current host.
    +   *
    +   * This is used to initialize the implementation on startup.
    +   *
    +   *     const implementation *impl = simdjson::available_implementation::detect_best_supported();
    +   *     simdjson::get_active_implementation() = impl;
    +   *
    +   * @return the most advanced supported implementation for the current host, or an
    +   *         implementation that returns UNSUPPORTED_ARCHITECTURE if there is no supported
    +   *         implementation. Will never return nullptr.
    +   */
    +  const implementation *detect_best_supported() const noexcept;
    +};
    +
    +} // namespace internal
    +
    +/**
    + * The list of available implementations compiled into simdjson.
    + */
    +extern SIMDJSON_DLLIMPORTEXPORT const internal::available_implementation_list& get_available_implementations();
    +
    +/**
    +  * The active implementation.
    +  *
    +  * Automatically initialized on first use to the most advanced implementation supported by this hardware.
    +  */
    +extern SIMDJSON_DLLIMPORTEXPORT internal::atomic_ptr& get_active_implementation();
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_IMPLEMENTATION_H
    +/* end file simdjson/implementation.h */
    +/* skipped duplicate #include "simdjson/implementation_detection.h" */
    +/* including simdjson/internal/instruction_set.h: #include "simdjson/internal/instruction_set.h" */
    +/* begin file simdjson/internal/instruction_set.h */
    +/* From
    +https://github.com/endorno/pytorch/blob/master/torch/lib/TH/generic/simd/simd.h
    +Highly modified.
    +
    +Copyright (c) 2016-     Facebook, Inc            (Adam Paszke)
    +Copyright (c) 2014-     Facebook, Inc            (Soumith Chintala)
    +Copyright (c) 2011-2014 Idiap Research Institute (Ronan Collobert)
    +Copyright (c) 2012-2014 Deepmind Technologies    (Koray Kavukcuoglu)
    +Copyright (c) 2011-2012 NEC Laboratories America (Koray Kavukcuoglu)
    +Copyright (c) 2011-2013 NYU                      (Clement Farabet)
    +Copyright (c) 2006-2010 NEC Laboratories America (Ronan Collobert, Leon Bottou,
    +Iain Melvin, Jason Weston) Copyright (c) 2006      Idiap Research Institute
    +(Samy Bengio) Copyright (c) 2001-2004 Idiap Research Institute (Ronan Collobert,
    +Samy Bengio, Johnny Mariethoz)
    +
    +All rights reserved.
    +
    +Redistribution and use in source and binary forms, with or without
    +modification, are permitted provided that the following conditions are met:
    +
    +1. Redistributions of source code must retain the above copyright
    +   notice, this list of conditions and the following disclaimer.
    +
    +2. Redistributions in binary form must reproduce the above copyright
    +   notice, this list of conditions and the following disclaimer in the
    +   documentation and/or other materials provided with the distribution.
    +
    +3. Neither the names of Facebook, Deepmind Technologies, NYU, NEC Laboratories
    +America and IDIAP Research Institute nor the names of its contributors may be
    +   used to endorse or promote products derived from this software without
    +   specific prior written permission.
    +
    +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    +POSSIBILITY OF SUCH DAMAGE.
    +*/
    +
    +#ifndef SIMDJSON_INTERNAL_INSTRUCTION_SET_H
    +#define SIMDJSON_INTERNAL_INSTRUCTION_SET_H
    +
    +namespace simdjson {
    +namespace internal {
    +
    +enum instruction_set {
    +  DEFAULT = 0x0,
    +  NEON = 0x1,
    +  AVX2 = 0x4,
    +  SSE42 = 0x8,
    +  PCLMULQDQ = 0x10,
    +  BMI1 = 0x20,
    +  BMI2 = 0x40,
    +  ALTIVEC = 0x80,
    +  AVX512F = 0x100,
    +  AVX512DQ = 0x200,
    +  AVX512IFMA = 0x400,
    +  AVX512PF = 0x800,
    +  AVX512ER = 0x1000,
    +  AVX512CD = 0x2000,
    +  AVX512BW = 0x4000,
    +  AVX512VL = 0x8000,
    +  AVX512VBMI2 = 0x10000
    +};
    +
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_INTERNAL_INSTRUCTION_SET_H
    +/* end file simdjson/internal/instruction_set.h */
    +/* skipped duplicate #include "simdjson/internal/dom_parser_implementation.h" */
    +/* skipped duplicate #include "simdjson/internal/jsoncharutils_tables.h" */
    +/* skipped duplicate #include "simdjson/internal/numberparsing_tables.h" */
    +/* including simdjson/internal/simdprune_tables.h: #include "simdjson/internal/simdprune_tables.h" */
    +/* begin file simdjson/internal/simdprune_tables.h */
    +#ifndef SIMDJSON_INTERNAL_SIMDPRUNE_TABLES_H
    +#define SIMDJSON_INTERNAL_SIMDPRUNE_TABLES_H
    +
    +/* skipped duplicate #include "simdjson/base.h" */
    +
    +#include 
    +
    +namespace simdjson { // table modified and copied from
    +namespace internal { // http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetTable
    +
    +extern SIMDJSON_DLLIMPORTEXPORT const unsigned char BitsSetTable256mul2[256];
    +
    +extern SIMDJSON_DLLIMPORTEXPORT const uint8_t pshufb_combine_table[272];
    +
    +// 256 * 8 bytes = 2kB, easily fits in cache.
    +extern SIMDJSON_DLLIMPORTEXPORT const uint64_t thintable_epi8[256];
    +
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_INTERNAL_SIMDPRUNE_TABLES_H
    +/* end file simdjson/internal/simdprune_tables.h */
    +
    +#endif // SIMDJSON_GENERIC_DEPENDENCIES_H
    +/* end file simdjson/generic/dependencies.h */
    +/* including generic/dependencies.h: #include  */
    +/* begin file generic/dependencies.h */
    +#ifdef SIMDJSON_CONDITIONAL_INCLUDE
    +#error generic/dependencies.h must be included before defining SIMDJSON_CONDITIONAL_INCLUDE!
    +#endif
    +
    +#ifndef SIMDJSON_SRC_GENERIC_DEPENDENCIES_H
    +#define SIMDJSON_SRC_GENERIC_DEPENDENCIES_H
    +
    +/* skipped duplicate #include  */
    +
    +#endif // SIMDJSON_SRC_GENERIC_DEPENDENCIES_H
    +/* end file generic/dependencies.h */
    +/* including generic/stage1/dependencies.h: #include  */
    +/* begin file generic/stage1/dependencies.h */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_DEPENDENCIES_H
    +#define SIMDJSON_SRC_GENERIC_STAGE1_DEPENDENCIES_H
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_DEPENDENCIES_H
    +/* end file generic/stage1/dependencies.h */
    +/* including generic/stage2/dependencies.h: #include  */
    +/* begin file generic/stage2/dependencies.h */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_DEPENDENCIES_H
    +#define SIMDJSON_SRC_GENERIC_STAGE2_DEPENDENCIES_H
    +
    +/* including simdjson/dom/document.h: #include  */
    +/* begin file simdjson/dom/document.h */
    +#ifndef SIMDJSON_DOM_DOCUMENT_H
    +#define SIMDJSON_DOM_DOCUMENT_H
    +
    +/* including simdjson/dom/base.h: #include "simdjson/dom/base.h" */
    +/* begin file simdjson/dom/base.h */
    +#ifndef SIMDJSON_DOM_BASE_H
    +#define SIMDJSON_DOM_BASE_H
    +
    +/* skipped duplicate #include "simdjson/base.h" */
    +
    +namespace simdjson {
    +
    +/**
    + * @brief A DOM API on top of the simdjson parser.
    + */
    +namespace dom {
    +
    +/** The default batch size for parser.parse_many() and parser.load_many() */
    +static constexpr size_t DEFAULT_BATCH_SIZE = 1000000;
    +/**
    + * Some adversary might try to set the batch size to 0 or 1, which might cause problems.
    + * We set a minimum of 32B since anything else is highly likely to be an error. In practice,
    + * most users will want a much larger batch size.
    + *
    + * All non-negative MINIMAL_BATCH_SIZE values should be 'safe' except that, obviously, no JSON
    + * document can ever span 0 or 1 byte and that very large values would create memory allocation issues.
    + */
    +static constexpr size_t MINIMAL_BATCH_SIZE = 32;
    +
    +/**
    + * It is wasteful to allocate memory for tiny documents (e.g., 4 bytes).
    + */
    +static constexpr size_t MINIMAL_DOCUMENT_CAPACITY = 32;
    +
    +class array;
    +class document;
    +class document_stream;
    +class element;
    +class key_value_pair;
    +class object;
    +class parser;
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +struct stage1_worker;
    +#endif // SIMDJSON_THREADS_ENABLED
    +
    +} // namespace dom
    +
    +namespace internal {
    +
    +template
    +class string_builder;
    +class tape_ref;
    +
    +} // namespace internal
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_DOM_BASE_H
    +/* end file simdjson/dom/base.h */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace dom {
    +
    +/**
    + * A parsed JSON document.
    + *
    + * This class cannot be copied, only moved, to avoid unintended allocations.
    + */
    +class document {
    +public:
    +  /**
    +   * Create a document container with zero capacity.
    +   *
    +   * The parser will allocate capacity as needed.
    +   */
    +  document() noexcept = default;
    +  ~document() noexcept = default;
    +
    +  /**
    +   * Take another document's buffers.
    +   *
    +   * @param other The document to take. Its capacity is zeroed and it is invalidated.
    +   */
    +  document(document &&other) noexcept = default;
    +  /** @private */
    +  document(const document &) = delete; // Disallow copying
    +  /**
    +   * Take another document's buffers.
    +   *
    +   * @param other The document to take. Its capacity is zeroed.
    +   */
    +  document &operator=(document &&other) noexcept = default;
    +  /** @private */
    +  document &operator=(const document &) = delete; // Disallow copying
    +
    +  /**
    +   * Get the root element of this document as a JSON array.
    +   */
    +  element root() const noexcept;
    +
    +  /**
    +   * @private Dump the raw tape for debugging.
    +   *
    +   * @param os the stream to output to.
    +   * @return false if the tape is likely wrong (e.g., you did not parse a valid JSON).
    +   */
    +  bool dump_raw_tape(std::ostream &os) const noexcept;
    +
    +  /** @private Structural values. */
    +  std::unique_ptr tape{};
    +
    +  /** @private String values.
    +   *
    +   * Should be at least byte_capacity.
    +   */
    +  std::unique_ptr string_buf{};
    +  /** @private Allocate memory to support
    +   * input JSON documents of up to len bytes.
    +   *
    +   * When calling this function, you lose
    +   * all the data.
    +   *
    +   * The memory allocation is strict: you
    +   * can you use this function to increase
    +   * or lower the amount of allocated memory.
    +   * Passsing zero clears the memory.
    +   */
    +  error_code allocate(size_t len) noexcept;
    +  /** @private Capacity in bytes, in terms
    +   * of how many bytes of input JSON we can
    +   * support.
    +   */
    +  size_t capacity() const noexcept;
    +
    +
    +private:
    +  size_t allocated_capacity{0};
    +  friend class parser;
    +}; // class document
    +
    +} // namespace dom
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_DOM_DOCUMENT_H
    +/* end file simdjson/dom/document.h */
    +/* including simdjson/internal/tape_type.h: #include  */
    +/* begin file simdjson/internal/tape_type.h */
    +#ifndef SIMDJSON_INTERNAL_TAPE_TYPE_H
    +#define SIMDJSON_INTERNAL_TAPE_TYPE_H
    +
    +namespace simdjson {
    +namespace internal {
    +
    +/**
    + * The possible types in the tape.
    + */
    +enum class tape_type {
    +  ROOT = 'r',
    +  START_ARRAY = '[',
    +  START_OBJECT = '{',
    +  END_ARRAY = ']',
    +  END_OBJECT = '}',
    +  STRING = '"',
    +  INT64 = 'l',
    +  UINT64 = 'u',
    +  DOUBLE = 'd',
    +  TRUE_VALUE = 't',
    +  FALSE_VALUE = 'f',
    +  NULL_VALUE = 'n'
    +}; // enum class tape_type
    +
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_INTERNAL_TAPE_TYPE_H
    +/* end file simdjson/internal/tape_type.h */
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_DEPENDENCIES_H
    +/* end file generic/stage2/dependencies.h */
    +
    +/* including implementation.cpp: #include  */
    +/* begin file implementation.cpp */
    +#ifndef SIMDJSON_SRC_IMPLEMENTATION_CPP
    +#define SIMDJSON_SRC_IMPLEMENTATION_CPP
    +
    +/* skipped duplicate #include  */
    +/* skipped duplicate #include  */
    +/* skipped duplicate #include  */
    +/* including internal/isadetection.h: #include  */
    +/* begin file internal/isadetection.h */
    +/* From
    +https://github.com/endorno/pytorch/blob/master/torch/lib/TH/generic/simd/simd.h
    +Highly modified.
    +
    +Copyright (c) 2016-     Facebook, Inc            (Adam Paszke)
    +Copyright (c) 2014-     Facebook, Inc            (Soumith Chintala)
    +Copyright (c) 2011-2014 Idiap Research Institute (Ronan Collobert)
    +Copyright (c) 2012-2014 Deepmind Technologies    (Koray Kavukcuoglu)
    +Copyright (c) 2011-2012 NEC Laboratories America (Koray Kavukcuoglu)
    +Copyright (c) 2011-2013 NYU                      (Clement Farabet)
    +Copyright (c) 2006-2010 NEC Laboratories America (Ronan Collobert, Leon Bottou,
    +Iain Melvin, Jason Weston) Copyright (c) 2006      Idiap Research Institute
    +(Samy Bengio) Copyright (c) 2001-2004 Idiap Research Institute (Ronan Collobert,
    +Samy Bengio, Johnny Mariethoz)
    +
    +All rights reserved.
    +
    +Redistribution and use in source and binary forms, with or without
    +modification, are permitted provided that the following conditions are met:
    +
    +1. Redistributions of source code must retain the above copyright
    +   notice, this list of conditions and the following disclaimer.
    +
    +2. Redistributions in binary form must reproduce the above copyright
    +   notice, this list of conditions and the following disclaimer in the
    +   documentation and/or other materials provided with the distribution.
    +
    +3. Neither the names of Facebook, Deepmind Technologies, NYU, NEC Laboratories
    +America and IDIAP Research Institute nor the names of its contributors may be
    +   used to endorse or promote products derived from this software without
    +   specific prior written permission.
    +
    +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    +POSSIBILITY OF SUCH DAMAGE.
    +*/
    +
    +#ifndef SIMDJSON_INTERNAL_ISADETECTION_H
    +#define SIMDJSON_INTERNAL_ISADETECTION_H
    +
    +/* skipped duplicate #include "simdjson/internal/instruction_set.h" */
    +
    +#include 
    +#include 
    +#if defined(_MSC_VER)
    +#include 
    +#elif defined(HAVE_GCC_GET_CPUID) && defined(USE_GCC_GET_CPUID)
    +#include 
    +#endif
    +
    +namespace simdjson {
    +namespace internal {
    +
    +#if defined(__PPC64__)
    +
    +static inline uint32_t detect_supported_architectures() {
    +  return instruction_set::ALTIVEC;
    +}
    +
    +#elif defined(__aarch64__) || defined(_M_ARM64)
    +
    +static inline uint32_t detect_supported_architectures() {
    +  return instruction_set::NEON;
    +}
    +
    +#elif defined(__x86_64__) || defined(_M_AMD64) // x64
    +
    +
    +namespace {
    +// Can be found on Intel ISA Reference for CPUID
    +constexpr uint32_t cpuid_avx2_bit = 1 << 5;         ///< @private Bit 5 of EBX for EAX=0x7
    +constexpr uint32_t cpuid_bmi1_bit = 1 << 3;         ///< @private bit 3 of EBX for EAX=0x7
    +constexpr uint32_t cpuid_bmi2_bit = 1 << 8;         ///< @private bit 8 of EBX for EAX=0x7
    +constexpr uint32_t cpuid_avx512f_bit = 1 << 16;     ///< @private bit 16 of EBX for EAX=0x7
    +constexpr uint32_t cpuid_avx512dq_bit = 1 << 17;    ///< @private bit 17 of EBX for EAX=0x7
    +constexpr uint32_t cpuid_avx512ifma_bit = 1 << 21;  ///< @private bit 21 of EBX for EAX=0x7
    +constexpr uint32_t cpuid_avx512pf_bit = 1 << 26;    ///< @private bit 26 of EBX for EAX=0x7
    +constexpr uint32_t cpuid_avx512er_bit = 1 << 27;    ///< @private bit 27 of EBX for EAX=0x7
    +constexpr uint32_t cpuid_avx512cd_bit = 1 << 28;    ///< @private bit 28 of EBX for EAX=0x7
    +constexpr uint32_t cpuid_avx512bw_bit = 1 << 30;    ///< @private bit 30 of EBX for EAX=0x7
    +constexpr uint32_t cpuid_avx512vl_bit = 1U << 31;    ///< @private bit 31 of EBX for EAX=0x7
    +constexpr uint32_t cpuid_avx512vbmi2_bit = 1 << 6;  ///< @private bit 6 of ECX for EAX=0x7
    +constexpr uint64_t cpuid_avx256_saved = uint64_t(1) << 2; ///< @private bit 2 = AVX
    +constexpr uint64_t cpuid_avx512_saved = uint64_t(7) << 5; ///< @private bits 5,6,7 = opmask, ZMM_hi256, hi16_ZMM
    +constexpr uint32_t cpuid_sse42_bit = 1 << 20;       ///< @private bit 20 of ECX for EAX=0x1
    +constexpr uint32_t cpuid_osxsave = (uint32_t(1) << 26) | (uint32_t(1) << 27); ///< @private bits 26+27 of ECX for EAX=0x1
    +constexpr uint32_t cpuid_pclmulqdq_bit = 1 << 1;    ///< @private bit  1 of ECX for EAX=0x1
    +}
    +
    +
    +
    +static inline void cpuid(uint32_t *eax, uint32_t *ebx, uint32_t *ecx,
    +                         uint32_t *edx) {
    +#if defined(_MSC_VER)
    +  int cpu_info[4];
    +  __cpuidex(cpu_info, *eax, *ecx);
    +  *eax = cpu_info[0];
    +  *ebx = cpu_info[1];
    +  *ecx = cpu_info[2];
    +  *edx = cpu_info[3];
    +#elif defined(HAVE_GCC_GET_CPUID) && defined(USE_GCC_GET_CPUID)
    +  uint32_t level = *eax;
    +  __get_cpuid(level, eax, ebx, ecx, edx);
    +#else
    +  uint32_t a = *eax, b, c = *ecx, d;
    +  asm volatile("cpuid\n\t" : "+a"(a), "=b"(b), "+c"(c), "=d"(d));
    +  *eax = a;
    +  *ebx = b;
    +  *ecx = c;
    +  *edx = d;
    +#endif
    +}
    +
    +
    +static inline uint64_t xgetbv() {
    +#if defined(_MSC_VER)
    +  return _xgetbv(0);
    +#else
    +  uint32_t xcr0_lo, xcr0_hi;
    +  asm volatile("xgetbv\n\t" : "=a" (xcr0_lo), "=d" (xcr0_hi) : "c" (0));
    +  return xcr0_lo | (uint64_t(xcr0_hi) << 32);
    +#endif
    +}
    +
    +static inline uint32_t detect_supported_architectures() {
    +  uint32_t eax, ebx, ecx, edx;
    +  uint32_t host_isa = 0x0;
    +
    +  // EBX for EAX=0x1
    +  eax = 0x1;
    +  ecx = 0x0;
    +  cpuid(&eax, &ebx, &ecx, &edx);
    +
    +  if (ecx & cpuid_sse42_bit) {
    +    host_isa |= instruction_set::SSE42;
    +  } else {
    +    return host_isa; // everything after is redundant
    +  }
    +
    +  if (ecx & cpuid_pclmulqdq_bit) {
    +    host_isa |= instruction_set::PCLMULQDQ;
    +  }
    +
    +
    +  if ((ecx & cpuid_osxsave) != cpuid_osxsave) {
    +    return host_isa;
    +  }
    +
    +  // xgetbv for checking if the OS saves registers
    +  uint64_t xcr0 = xgetbv();
    +
    +  if ((xcr0 & cpuid_avx256_saved) == 0) {
    +    return host_isa;
    +  }
    +
    +  // ECX for EAX=0x7
    +  eax = 0x7;
    +  ecx = 0x0;
    +  cpuid(&eax, &ebx, &ecx, &edx);
    +  if (ebx & cpuid_avx2_bit) {
    +    host_isa |= instruction_set::AVX2;
    +  }
    +  if (ebx & cpuid_bmi1_bit) {
    +    host_isa |= instruction_set::BMI1;
    +  }
    +
    +  if (ebx & cpuid_bmi2_bit) {
    +    host_isa |= instruction_set::BMI2;
    +  }
    +
    +  if (!((xcr0 & cpuid_avx512_saved) == cpuid_avx512_saved)) {
    +     return host_isa;
    +  }
    +
    +  if (ebx & cpuid_avx512f_bit) {
    +    host_isa |= instruction_set::AVX512F;
    +  }
    +
    +  if (ebx & cpuid_avx512dq_bit) {
    +    host_isa |= instruction_set::AVX512DQ;
    +  }
    +
    +  if (ebx & cpuid_avx512ifma_bit) {
    +    host_isa |= instruction_set::AVX512IFMA;
    +  }
    +
    +  if (ebx & cpuid_avx512pf_bit) {
    +    host_isa |= instruction_set::AVX512PF;
    +  }
    +
    +  if (ebx & cpuid_avx512er_bit) {
    +    host_isa |= instruction_set::AVX512ER;
    +  }
    +
    +  if (ebx & cpuid_avx512cd_bit) {
    +    host_isa |= instruction_set::AVX512CD;
    +  }
    +
    +  if (ebx & cpuid_avx512bw_bit) {
    +    host_isa |= instruction_set::AVX512BW;
    +  }
    +
    +  if (ebx & cpuid_avx512vl_bit) {
    +    host_isa |= instruction_set::AVX512VL;
    +  }
    +
    +  if (ecx & cpuid_avx512vbmi2_bit) {
    +    host_isa |= instruction_set::AVX512VBMI2;
    +  }
    +
    +  return host_isa;
    +}
    +#else // fallback
    +
    +
    +static inline uint32_t detect_supported_architectures() {
    +  return instruction_set::DEFAULT;
    +}
    +
    +
    +#endif // end SIMD extension detection code
    +
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_INTERNAL_ISADETECTION_H
    +/* end file internal/isadetection.h */
    +
    +#include 
    +
    +namespace simdjson {
    +
    +bool implementation::supported_by_runtime_system() const {
    +  uint32_t required_instruction_sets = this->required_instruction_sets();
    +  uint32_t supported_instruction_sets = internal::detect_supported_architectures();
    +  return ((supported_instruction_sets & required_instruction_sets) == required_instruction_sets);
    +}
    +
    +} // namespace simdjson
    +
    +/* defining SIMDJSON_CONDITIONAL_INCLUDE */
    +#define SIMDJSON_CONDITIONAL_INCLUDE
    +
    +#if SIMDJSON_IMPLEMENTATION_ARM64
    +/* including simdjson/arm64/implementation.h: #include  */
    +/* begin file simdjson/arm64/implementation.h */
    +#ifndef SIMDJSON_ARM64_IMPLEMENTATION_H
    +#define SIMDJSON_ARM64_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/instruction_set.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +
    +/**
    + * @private
    + */
    +class implementation final : public simdjson::implementation {
    +public:
    +  simdjson_inline implementation() : simdjson::implementation("arm64", "ARM NEON", internal::instruction_set::NEON) {}
    +  simdjson_warn_unused error_code create_dom_parser_implementation(
    +    size_t capacity,
    +    size_t max_length,
    +    std::unique_ptr& dst
    +  ) const noexcept final;
    +  simdjson_warn_unused error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept final;
    +  simdjson_warn_unused bool validate_utf8(const char *buf, size_t len) const noexcept final;
    +};
    +
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ARM64_IMPLEMENTATION_H
    +/* end file simdjson/arm64/implementation.h */
    +namespace simdjson {
    +namespace internal {
    +static const arm64::implementation* get_arm64_singleton() {
    +  static const arm64::implementation arm64_singleton{};
    +  return &arm64_singleton;
    +}
    +} // namespace internal
    +} // namespace simdjson
    +#endif // SIMDJSON_IMPLEMENTATION_ARM64
    +
    +#if SIMDJSON_IMPLEMENTATION_FALLBACK
    +/* including simdjson/fallback/implementation.h: #include  */
    +/* begin file simdjson/fallback/implementation.h */
    +#ifndef SIMDJSON_FALLBACK_IMPLEMENTATION_H
    +#define SIMDJSON_FALLBACK_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +
    +/**
    + * @private
    + */
    +class implementation final : public simdjson::implementation {
    +public:
    +  simdjson_inline implementation() : simdjson::implementation(
    +      "fallback",
    +      "Generic fallback implementation",
    +      0
    +  ) {}
    +  simdjson_warn_unused error_code create_dom_parser_implementation(
    +    size_t capacity,
    +    size_t max_length,
    +    std::unique_ptr& dst
    +  ) const noexcept final;
    +  simdjson_warn_unused error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept final;
    +  simdjson_warn_unused bool validate_utf8(const char *buf, size_t len) const noexcept final;
    +};
    +
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_FALLBACK_IMPLEMENTATION_H
    +/* end file simdjson/fallback/implementation.h */
    +namespace simdjson {
    +namespace internal {
    +static const fallback::implementation* get_fallback_singleton() {
    +  static const fallback::implementation fallback_singleton{};
    +  return &fallback_singleton;
    +}
    +} // namespace internal
    +} // namespace simdjson
    +#endif // SIMDJSON_IMPLEMENTATION_FALLBACK
    +
    +
    +#if SIMDJSON_IMPLEMENTATION_HASWELL
    +/* including simdjson/haswell/implementation.h: #include  */
    +/* begin file simdjson/haswell/implementation.h */
    +#ifndef SIMDJSON_HASWELL_IMPLEMENTATION_H
    +#define SIMDJSON_HASWELL_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/instruction_set.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_HASWELL
    +namespace simdjson {
    +namespace haswell {
    +
    +/**
    + * @private
    + */
    +class implementation final : public simdjson::implementation {
    +public:
    +  simdjson_inline implementation() : simdjson::implementation(
    +      "haswell",
    +      "Intel/AMD AVX2",
    +      internal::instruction_set::AVX2 | internal::instruction_set::PCLMULQDQ | internal::instruction_set::BMI1 | internal::instruction_set::BMI2
    +  ) {}
    +  simdjson_warn_unused error_code create_dom_parser_implementation(
    +    size_t capacity,
    +    size_t max_length,
    +    std::unique_ptr& dst
    +  ) const noexcept final;
    +  simdjson_warn_unused error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept final;
    +  simdjson_warn_unused bool validate_utf8(const char *buf, size_t len) const noexcept final;
    +};
    +
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_HASWELL_IMPLEMENTATION_H
    +/* end file simdjson/haswell/implementation.h */
    +namespace simdjson {
    +namespace internal {
    +static const haswell::implementation* get_haswell_singleton() {
    +  static const haswell::implementation haswell_singleton{};
    +  return &haswell_singleton;
    +}
    +} // namespace internal
    +} // namespace simdjson
    +#endif
    +
    +#if SIMDJSON_IMPLEMENTATION_ICELAKE
    +/* including simdjson/icelake/implementation.h: #include  */
    +/* begin file simdjson/icelake/implementation.h */
    +#ifndef SIMDJSON_ICELAKE_IMPLEMENTATION_H
    +#define SIMDJSON_ICELAKE_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/instruction_set.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_ICELAKE
    +namespace simdjson {
    +namespace icelake {
    +
    +/**
    + * @private
    + */
    +class implementation final : public simdjson::implementation {
    +public:
    +  simdjson_inline implementation() : simdjson::implementation(
    +      "icelake",
    +      "Intel/AMD AVX512",
    +      internal::instruction_set::AVX2 | internal::instruction_set::PCLMULQDQ | internal::instruction_set::BMI1 | internal::instruction_set::BMI2 | internal::instruction_set::AVX512F | internal::instruction_set::AVX512DQ | internal::instruction_set::AVX512CD | internal::instruction_set::AVX512BW | internal::instruction_set::AVX512VL | internal::instruction_set::AVX512VBMI2
    +  ) {}
    +  simdjson_warn_unused error_code create_dom_parser_implementation(
    +    size_t capacity,
    +    size_t max_length,
    +    std::unique_ptr& dst
    +  ) const noexcept final;
    +  simdjson_warn_unused error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept final;
    +  simdjson_warn_unused bool validate_utf8(const char *buf, size_t len) const noexcept final;
    +};
    +
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ICELAKE_IMPLEMENTATION_H
    +/* end file simdjson/icelake/implementation.h */
    +namespace simdjson {
    +namespace internal {
    +static const icelake::implementation* get_icelake_singleton() {
    +  static const icelake::implementation icelake_singleton{};
    +  return &icelake_singleton;
    +}
    +} // namespace internal
    +} // namespace simdjson
    +#endif
    +
    +#if SIMDJSON_IMPLEMENTATION_PPC64
    +/* including simdjson/ppc64/implementation.h: #include  */
    +/* begin file simdjson/ppc64/implementation.h */
    +#ifndef SIMDJSON_PPC64_IMPLEMENTATION_H
    +#define SIMDJSON_PPC64_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/instruction_set.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +
    +/**
    + * Implementation for ALTIVEC (PPC64).
    + */
    +namespace ppc64 {
    +
    +/**
    + * @private
    + */
    +class implementation final : public simdjson::implementation {
    +public:
    +  simdjson_inline implementation()
    +      : simdjson::implementation("ppc64", "PPC64 ALTIVEC",
    +                                 internal::instruction_set::ALTIVEC) {}
    +
    +  simdjson_warn_unused error_code create_dom_parser_implementation(
    +      size_t capacity, size_t max_length,
    +      std::unique_ptr &dst)
    +      const noexcept final;
    +  simdjson_warn_unused error_code minify(const uint8_t *buf, size_t len,
    +                                         uint8_t *dst,
    +                                         size_t &dst_len) const noexcept final;
    +  simdjson_warn_unused bool validate_utf8(const char *buf,
    +                                          size_t len) const noexcept final;
    +};
    +
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_PPC64_IMPLEMENTATION_H
    +/* end file simdjson/ppc64/implementation.h */
    +namespace simdjson {
    +namespace internal {
    +static const ppc64::implementation* get_ppc64_singleton() {
    +  static const ppc64::implementation ppc64_singleton{};
    +  return &ppc64_singleton;
    +}
    +} // namespace internal
    +} // namespace simdjson
    +#endif // SIMDJSON_IMPLEMENTATION_PPC64
    +
    +#if SIMDJSON_IMPLEMENTATION_WESTMERE
    +/* including simdjson/westmere/implementation.h: #include  */
    +/* begin file simdjson/westmere/implementation.h */
    +#ifndef SIMDJSON_WESTMERE_IMPLEMENTATION_H
    +#define SIMDJSON_WESTMERE_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/instruction_set.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_WESTMERE
    +namespace simdjson {
    +namespace westmere {
    +
    +/**
    + * @private
    + */
    +class implementation final : public simdjson::implementation {
    +public:
    +  simdjson_inline implementation() : simdjson::implementation("westmere", "Intel/AMD SSE4.2", internal::instruction_set::SSE42 | internal::instruction_set::PCLMULQDQ) {}
    +  simdjson_warn_unused error_code create_dom_parser_implementation(
    +    size_t capacity,
    +    size_t max_length,
    +    std::unique_ptr& dst
    +  ) const noexcept final;
    +  simdjson_warn_unused error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept final;
    +  simdjson_warn_unused bool validate_utf8(const char *buf, size_t len) const noexcept final;
    +};
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_IMPLEMENTATION_H
    +/* end file simdjson/westmere/implementation.h */
    +namespace simdjson {
    +namespace internal {
    +static const simdjson::westmere::implementation* get_westmere_singleton() {
    +  static const simdjson::westmere::implementation westmere_singleton{};
    +  return &westmere_singleton;
    +}
    +} // namespace internal
    +} // namespace simdjson
    +#endif // SIMDJSON_IMPLEMENTATION_WESTMERE
    +
    +/* undefining SIMDJSON_CONDITIONAL_INCLUDE */
    +#undef SIMDJSON_CONDITIONAL_INCLUDE
    +
    +namespace simdjson {
    +namespace internal {
    +
    +// Static array of known implementations. We're hoping these get baked into the executable
    +// without requiring a static initializer.
    +
    +/**
    + * @private Detects best supported implementation on first use, and sets it
    + */
    +class detect_best_supported_implementation_on_first_use final : public implementation {
    +public:
    +  const std::string &name() const noexcept final { return set_best()->name(); }
    +  const std::string &description() const noexcept final { return set_best()->description(); }
    +  uint32_t required_instruction_sets() const noexcept final { return set_best()->required_instruction_sets(); }
    +  simdjson_warn_unused error_code create_dom_parser_implementation(
    +    size_t capacity,
    +    size_t max_length,
    +    std::unique_ptr& dst
    +  ) const noexcept final {
    +    return set_best()->create_dom_parser_implementation(capacity, max_length, dst);
    +  }
    +  simdjson_warn_unused error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept final {
    +    return set_best()->minify(buf, len, dst, dst_len);
    +  }
    +  simdjson_warn_unused bool validate_utf8(const char * buf, size_t len) const noexcept final override {
    +    return set_best()->validate_utf8(buf, len);
    +  }
    +  simdjson_inline detect_best_supported_implementation_on_first_use() noexcept : implementation("best_supported_detector", "Detects the best supported implementation and sets it", 0) {}
    +private:
    +  const implementation *set_best() const noexcept;
    +};
    +
    +static const std::initializer_list& get_available_implementation_pointers() {
    +  static const std::initializer_list available_implementation_pointers {
    +#if SIMDJSON_IMPLEMENTATION_ICELAKE
    +    get_icelake_singleton(),
    +#endif
    +#if SIMDJSON_IMPLEMENTATION_HASWELL
    +    get_haswell_singleton(),
    +#endif
    +#if SIMDJSON_IMPLEMENTATION_WESTMERE
    +    get_westmere_singleton(),
    +#endif
    +#if SIMDJSON_IMPLEMENTATION_ARM64
    +    get_arm64_singleton(),
    +#endif
    +#if SIMDJSON_IMPLEMENTATION_PPC64
    +    get_ppc64_singleton(),
    +#endif
    +#if SIMDJSON_IMPLEMENTATION_FALLBACK
    +    get_fallback_singleton(),
    +#endif
    +  }; // available_implementation_pointers
    +  return available_implementation_pointers;
    +}
    +
    +// So we can return UNSUPPORTED_ARCHITECTURE from the parser when there is no support
    +class unsupported_implementation final : public implementation {
    +public:
    +  simdjson_warn_unused error_code create_dom_parser_implementation(
    +    size_t,
    +    size_t,
    +    std::unique_ptr&
    +  ) const noexcept final {
    +    return UNSUPPORTED_ARCHITECTURE;
    +  }
    +  simdjson_warn_unused error_code minify(const uint8_t *, size_t, uint8_t *, size_t &) const noexcept final override {
    +    return UNSUPPORTED_ARCHITECTURE;
    +  }
    +  simdjson_warn_unused bool validate_utf8(const char *, size_t) const noexcept final override {
    +    return false; // Just refuse to validate. Given that we have a fallback implementation
    +    // it seems unlikely that unsupported_implementation will ever be used. If it is used,
    +    // then it will flag all strings as invalid. The alternative is to return an error_code
    +    // from which the user has to figure out whether the string is valid UTF-8... which seems
    +    // like a lot of work just to handle the very unlikely case that we have an unsupported
    +    // implementation. And, when it does happen (that we have an unsupported implementation),
    +    // what are the chances that the programmer has a fallback? Given that *we* provide the
    +    // fallback, it implies that the programmer would need a fallback for our fallback.
    +  }
    +  unsupported_implementation() : implementation("unsupported", "Unsupported CPU (no detected SIMD instructions)", 0) {}
    +};
    +
    +const unsupported_implementation* get_unsupported_singleton() {
    +    static const unsupported_implementation unsupported_singleton{};
    +    return &unsupported_singleton;
    +}
    +
    +size_t available_implementation_list::size() const noexcept {
    +  return internal::get_available_implementation_pointers().size();
    +}
    +const implementation * const *available_implementation_list::begin() const noexcept {
    +  return internal::get_available_implementation_pointers().begin();
    +}
    +const implementation * const *available_implementation_list::end() const noexcept {
    +  return internal::get_available_implementation_pointers().end();
    +}
    +const implementation *available_implementation_list::detect_best_supported() const noexcept {
    +  // They are prelisted in priority order, so we just go down the list
    +  uint32_t supported_instruction_sets = internal::detect_supported_architectures();
    +  for (const implementation *impl : internal::get_available_implementation_pointers()) {
    +    uint32_t required_instruction_sets = impl->required_instruction_sets();
    +    if ((supported_instruction_sets & required_instruction_sets) == required_instruction_sets) { return impl; }
    +  }
    +  return get_unsupported_singleton(); // this should never happen?
    +}
    +
    +const implementation *detect_best_supported_implementation_on_first_use::set_best() const noexcept {
    +  SIMDJSON_PUSH_DISABLE_WARNINGS
    +  SIMDJSON_DISABLE_DEPRECATED_WARNING // Disable CRT_SECURE warning on MSVC: manually verified this is safe
    +  char *force_implementation_name = getenv("SIMDJSON_FORCE_IMPLEMENTATION");
    +  SIMDJSON_POP_DISABLE_WARNINGS
    +
    +  if (force_implementation_name) {
    +    auto force_implementation = get_available_implementations()[force_implementation_name];
    +    if (force_implementation) {
    +      return get_active_implementation() = force_implementation;
    +    } else {
    +      // Note: abort() and stderr usage within the library is forbidden.
    +      return get_active_implementation() = get_unsupported_singleton();
    +    }
    +  }
    +  return get_active_implementation() = get_available_implementations().detect_best_supported();
    +}
    +
    +} // namespace internal
    +
    +SIMDJSON_DLLIMPORTEXPORT const internal::available_implementation_list& get_available_implementations() {
    +  static const internal::available_implementation_list available_implementations{};
    +  return available_implementations;
    +}
    +
    +SIMDJSON_DLLIMPORTEXPORT internal::atomic_ptr& get_active_implementation() {
    +    static const internal::detect_best_supported_implementation_on_first_use detect_best_supported_implementation_on_first_use_singleton;
    +    static internal::atomic_ptr active_implementation{&detect_best_supported_implementation_on_first_use_singleton};
    +    return active_implementation;
    +}
    +
    +simdjson_warn_unused error_code minify(const char *buf, size_t len, char *dst, size_t &dst_len) noexcept {
    +  return get_active_implementation()->minify(reinterpret_cast(buf), len, reinterpret_cast(dst), dst_len);
    +}
    +simdjson_warn_unused bool validate_utf8(const char *buf, size_t len) noexcept {
    +  return get_active_implementation()->validate_utf8(buf, len);
    +}
    +const implementation * builtin_implementation() {
    +  static const implementation * builtin_impl = get_available_implementations()[SIMDJSON_STRINGIFY(SIMDJSON_BUILTIN_IMPLEMENTATION)];
    +  assert(builtin_impl);
    +  return builtin_impl;
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_IMPLEMENTATION_CPP
    +/* end file implementation.cpp */
    +
    +/* defining SIMDJSON_CONDITIONAL_INCLUDE */
    +#define SIMDJSON_CONDITIONAL_INCLUDE
    +
    +#if SIMDJSON_IMPLEMENTATION_ARM64
    +/* including arm64.cpp: #include  */
    +/* begin file arm64.cpp */
    +#ifndef SIMDJSON_SRC_ARM64_CPP
    +#define SIMDJSON_SRC_ARM64_CPP
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +/* including simdjson/arm64.h: #include  */
    +/* begin file simdjson/arm64.h */
    +#ifndef SIMDJSON_ARM64_H
    +#define SIMDJSON_ARM64_H
    +
    +/* including simdjson/arm64/begin.h: #include "simdjson/arm64/begin.h" */
    +/* begin file simdjson/arm64/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "arm64" */
    +#define SIMDJSON_IMPLEMENTATION arm64
    +/* including simdjson/arm64/base.h: #include "simdjson/arm64/base.h" */
    +/* begin file simdjson/arm64/base.h */
    +#ifndef SIMDJSON_ARM64_BASE_H
    +#define SIMDJSON_ARM64_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +/**
    + * Implementation for NEON (ARMv8).
    + */
    +namespace arm64 {
    +
    +class implementation;
    +
    +namespace {
    +namespace simd {
    +template  struct simd8;
    +template  struct simd8x64;
    +} // namespace simd
    +} // unnamed namespace
    +
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ARM64_BASE_H
    +/* end file simdjson/arm64/base.h */
    +/* including simdjson/arm64/intrinsics.h: #include "simdjson/arm64/intrinsics.h" */
    +/* begin file simdjson/arm64/intrinsics.h */
    +#ifndef SIMDJSON_ARM64_INTRINSICS_H
    +#define SIMDJSON_ARM64_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This should be the correct header whether
    +// you use visual studio or other compilers.
    +#include 
    +
    +static_assert(sizeof(uint8x16_t) <= simdjson::SIMDJSON_PADDING, "insufficient padding for arm64");
    +
    +#endif //  SIMDJSON_ARM64_INTRINSICS_H
    +/* end file simdjson/arm64/intrinsics.h */
    +/* including simdjson/arm64/bitmanipulation.h: #include "simdjson/arm64/bitmanipulation.h" */
    +/* begin file simdjson/arm64/bitmanipulation.h */
    +#ifndef SIMDJSON_ARM64_BITMANIPULATION_H
    +#define SIMDJSON_ARM64_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long ret;
    +  // Search the mask data from least significant bit (LSB)
    +  // to the most significant bit (MSB) for a set bit (1).
    +  _BitScanForward64(&ret, input_num);
    +  return (int)ret;
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return input_num & (input_num-1);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long leading_zero = 0;
    +  // Search the mask data from most significant bit (MSB)
    +  // to least significant bit (LSB) for a set bit (1).
    +  if (_BitScanReverse64(&leading_zero, input_num))
    +    return (int)(63 - leading_zero);
    +  else
    +    return 64;
    +#else
    +  return __builtin_clzll(input_num);
    +#endif// SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int count_ones(uint64_t input_num) {
    +   return vaddv_u8(vcnt_u8(vcreate_u8(input_num)));
    +}
    +
    +
    +#if defined(__GNUC__) // catches clang and gcc
    +/**
    + * ARM has a fast 64-bit "bit reversal function" that is handy. However,
    + * it is not generally available as an intrinsic function under Visual
    + * Studio (though this might be changing). Even under clang/gcc, we
    + * apparently need to invoke inline assembly.
    + */
    +/*
    + * We use SIMDJSON_PREFER_REVERSE_BITS as a hint that algorithms that
    + * work well with bit reversal may use it.
    + */
    +#define SIMDJSON_PREFER_REVERSE_BITS 1
    +
    +/* reverse the bits */
    +simdjson_inline uint64_t reverse_bits(uint64_t input_num) {
    +  uint64_t rev_bits;
    +  __asm("rbit %0, %1" : "=r"(rev_bits) : "r"(input_num));
    +  return rev_bits;
    +}
    +
    +/**
    + * Flips bit at index 63 - lz. Thus if you have 'leading_zeroes' leading zeroes,
    + * then this will set to zero the leading bit. It is possible for leading_zeroes to be
    + * greating or equal to 63 in which case we trigger undefined behavior, but the output
    + * of such undefined behavior is never used.
    + **/
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +simdjson_inline uint64_t zero_leading_bit(uint64_t rev_bits, int leading_zeroes) {
    +  return rev_bits ^ (uint64_t(0x8000000000000000) >> leading_zeroes);
    +}
    +
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *result) {
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +  *result = value1 + value2;
    +  return *result < value1;
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ARM64_BITMANIPULATION_H
    +/* end file simdjson/arm64/bitmanipulation.h */
    +/* including simdjson/arm64/bitmask.h: #include "simdjson/arm64/bitmask.h" */
    +/* begin file simdjson/arm64/bitmask.h */
    +#ifndef SIMDJSON_ARM64_BITMASK_H
    +#define SIMDJSON_ARM64_BITMASK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +
    +//
    +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered.
    +//
    +// For example, prefix_xor(00100100) == 00011100
    +//
    +simdjson_inline uint64_t prefix_xor(uint64_t bitmask) {
    +  /////////////
    +  // We could do this with PMULL, but it is apparently slow.
    +  //
    +  //#ifdef __ARM_FEATURE_CRYPTO // some ARM processors lack this extension
    +  //return vmull_p64(-1ULL, bitmask);
    +  //#else
    +  // Analysis by @sebpop:
    +  // When diffing the assembly for src/stage1_find_marks.cpp I see that the eors are all spread out
    +  // in between other vector code, so effectively the extra cycles of the sequence do not matter
    +  // because the GPR units are idle otherwise and the critical path is on the FP side.
    +  // Also the PMULL requires two extra fmovs: GPR->FP (3 cycles in N1, 5 cycles in A72 )
    +  // and FP->GPR (2 cycles on N1 and 5 cycles on A72.)
    +  ///////////
    +  bitmask ^= bitmask << 1;
    +  bitmask ^= bitmask << 2;
    +  bitmask ^= bitmask << 4;
    +  bitmask ^= bitmask << 8;
    +  bitmask ^= bitmask << 16;
    +  bitmask ^= bitmask << 32;
    +  return bitmask;
    +}
    +
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif
    +/* end file simdjson/arm64/bitmask.h */
    +/* including simdjson/arm64/numberparsing_defs.h: #include "simdjson/arm64/numberparsing_defs.h" */
    +/* begin file simdjson/arm64/numberparsing_defs.h */
    +#ifndef SIMDJSON_ARM64_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_ARM64_NUMBERPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +#if _M_ARM64
    +// __umulh requires intrin.h
    +#include 
    +#endif // _M_ARM64
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace numberparsing {
    +
    +// we don't have SSE, so let us use a scalar function
    +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  uint64_t val;
    +  std::memcpy(&val, chars, sizeof(uint64_t));
    +  val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8;
    +  val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16;
    +  return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32);
    +}
    +
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif // SIMDJSON_ARM64_NUMBERPARSING_DEFS_H
    +/* end file simdjson/arm64/numberparsing_defs.h */
    +/* including simdjson/arm64/simd.h: #include "simdjson/arm64/simd.h" */
    +/* begin file simdjson/arm64/simd.h */
    +#ifndef SIMDJSON_ARM64_SIMD_H
    +#define SIMDJSON_ARM64_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +namespace simd {
    +
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +namespace {
    +// Start of private section with Visual Studio workaround
    +
    +
    +#ifndef simdjson_make_uint8x16_t
    +#define simdjson_make_uint8x16_t(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, \
    +                             x13, x14, x15, x16)                                   \
    +   ([=]() {                                                                        \
    +     uint8_t array[16] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8,                    \
    +                                 x9, x10, x11, x12, x13, x14, x15, x16};           \
    +     return vld1q_u8(array);                                                       \
    +   }())
    +#endif
    +#ifndef simdjson_make_int8x16_t
    +#define simdjson_make_int8x16_t(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, \
    +                             x13, x14, x15, x16)                                  \
    +   ([=]() {                                                                       \
    +     int8_t array[16] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8,                    \
    +                                 x9, x10, x11, x12, x13, x14, x15, x16};          \
    +     return vld1q_s8(array);                                                      \
    +   }())
    +#endif
    +
    +#ifndef simdjson_make_uint8x8_t
    +#define simdjson_make_uint8x8_t(x1, x2, x3, x4, x5, x6, x7, x8)                \
    +   ([=]() {                                                                    \
    +     uint8_t array[8] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8};                \
    +     return vld1_u8(array);                                                    \
    +   }())
    +#endif
    +#ifndef simdjson_make_int8x8_t
    +#define simdjson_make_int8x8_t(x1, x2, x3, x4, x5, x6, x7, x8)                 \
    +   ([=]() {                                                                    \
    +     int8_t array[8] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8};                 \
    +     return vld1_s8(array);                                                    \
    +   }())
    +#endif
    +#ifndef simdjson_make_uint16x8_t
    +#define simdjson_make_uint16x8_t(x1, x2, x3, x4, x5, x6, x7, x8)               \
    +   ([=]() {                                                                    \
    +     uint16_t array[8] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8};               \
    +     return vld1q_u16(array);                                                  \
    +   }())
    +#endif
    +#ifndef simdjson_make_int16x8_t
    +#define simdjson_make_int16x8_t(x1, x2, x3, x4, x5, x6, x7, x8)                \
    +   ([=]() {                                                                    \
    +     int16_t array[8] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8};                \
    +     return vld1q_s16(array);                                                  \
    +   }())
    +#endif
    +
    +// End of private section with Visual Studio workaround
    +} // namespace
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +
    +
    +  template
    +  struct simd8;
    +
    +  //
    +  // Base class of simd8 and simd8, both of which use uint8x16_t internally.
    +  //
    +  template>
    +  struct base_u8 {
    +    uint8x16_t value;
    +    static const int SIZE = sizeof(value);
    +
    +    // Conversion from/to SIMD register
    +    simdjson_inline base_u8(const uint8x16_t _value) : value(_value) {}
    +    simdjson_inline operator const uint8x16_t&() const { return this->value; }
    +    simdjson_inline operator uint8x16_t&() { return this->value; }
    +
    +    // Bit operations
    +    simdjson_inline simd8 operator|(const simd8 other) const { return vorrq_u8(*this, other); }
    +    simdjson_inline simd8 operator&(const simd8 other) const { return vandq_u8(*this, other); }
    +    simdjson_inline simd8 operator^(const simd8 other) const { return veorq_u8(*this, other); }
    +    simdjson_inline simd8 bit_andnot(const simd8 other) const { return vbicq_u8(*this, other); }
    +    simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +    simdjson_inline simd8& operator|=(const simd8 other) { auto this_cast = static_cast*>(this); *this_cast = *this_cast | other; return *this_cast; }
    +    simdjson_inline simd8& operator&=(const simd8 other) { auto this_cast = static_cast*>(this); *this_cast = *this_cast & other; return *this_cast; }
    +    simdjson_inline simd8& operator^=(const simd8 other) { auto this_cast = static_cast*>(this); *this_cast = *this_cast ^ other; return *this_cast; }
    +
    +    friend simdjson_inline Mask operator==(const simd8 lhs, const simd8 rhs) { return vceqq_u8(lhs, rhs); }
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +      return vextq_u8(prev_chunk, *this, 16 - N);
    +    }
    +  };
    +
    +  // SIMD byte mask type (returned by things like eq and gt)
    +  template<>
    +  struct simd8: base_u8 {
    +    typedef uint16_t bitmask_t;
    +    typedef uint32_t bitmask2_t;
    +
    +    static simdjson_inline simd8 splat(bool _value) { return vmovq_n_u8(uint8_t(-(!!_value))); }
    +
    +    simdjson_inline simd8(const uint8x16_t _value) : base_u8(_value) {}
    +    // False constructor
    +    simdjson_inline simd8() : simd8(vdupq_n_u8(0)) {}
    +    // Splat constructor
    +    simdjson_inline simd8(bool _value) : simd8(splat(_value)) {}
    +
    +    // We return uint32_t instead of uint16_t because that seems to be more efficient for most
    +    // purposes (cutting it down to uint16_t costs performance in some compilers).
    +    simdjson_inline uint32_t to_bitmask() const {
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +      const uint8x16_t bit_mask =  simdjson_make_uint8x16_t(0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
    +                                                   0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80);
    +#else
    +      const uint8x16_t bit_mask =  {0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
    +                                    0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80};
    +#endif
    +      auto minput = *this & bit_mask;
    +      uint8x16_t tmp = vpaddq_u8(minput, minput);
    +      tmp = vpaddq_u8(tmp, tmp);
    +      tmp = vpaddq_u8(tmp, tmp);
    +      return vgetq_lane_u16(vreinterpretq_u16_u8(tmp), 0);
    +    }
    +    simdjson_inline bool any() const { return vmaxvq_u8(*this) != 0; }
    +  };
    +
    +  // Unsigned bytes
    +  template<>
    +  struct simd8: base_u8 {
    +    static simdjson_inline uint8x16_t splat(uint8_t _value) { return vmovq_n_u8(_value); }
    +    static simdjson_inline uint8x16_t zero() { return vdupq_n_u8(0); }
    +    static simdjson_inline uint8x16_t load(const uint8_t* values) { return vld1q_u8(values); }
    +
    +    simdjson_inline simd8(const uint8x16_t _value) : base_u8(_value) {}
    +    // Zero constructor
    +    simdjson_inline simd8() : simd8(zero()) {}
    +    // Array constructor
    +    simdjson_inline simd8(const uint8_t values[16]) : simd8(load(values)) {}
    +    // Splat constructor
    +    simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +    // Member-by-member initialization
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) : simd8(simdjson_make_uint8x16_t(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +#else
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) : simd8(uint8x16_t{
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    }) {}
    +#endif
    +
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Store to array
    +    simdjson_inline void store(uint8_t dst[16]) const { return vst1q_u8(dst, *this); }
    +
    +    // Saturated math
    +    simdjson_inline simd8 saturating_add(const simd8 other) const { return vqaddq_u8(*this, other); }
    +    simdjson_inline simd8 saturating_sub(const simd8 other) const { return vqsubq_u8(*this, other); }
    +
    +    // Addition/subtraction are the same for signed and unsigned
    +    simdjson_inline simd8 operator+(const simd8 other) const { return vaddq_u8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return vsubq_u8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *this; }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *this; }
    +
    +    // Order-specific operations
    +    simdjson_inline uint8_t max_val() const { return vmaxvq_u8(*this); }
    +    simdjson_inline uint8_t min_val() const { return vminvq_u8(*this); }
    +    simdjson_inline simd8 max_val(const simd8 other) const { return vmaxq_u8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return vminq_u8(*this, other); }
    +    simdjson_inline simd8 operator<=(const simd8 other) const { return vcleq_u8(*this, other); }
    +    simdjson_inline simd8 operator>=(const simd8 other) const { return vcgeq_u8(*this, other); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return vcltq_u8(*this, other); }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return vcgtq_u8(*this, other); }
    +    // Same as >, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. For ARM, returns all 1's.
    +    simdjson_inline simd8 gt_bits(const simd8 other) const { return simd8(*this > other); }
    +    // Same as <, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. For ARM, returns all 1's.
    +    simdjson_inline simd8 lt_bits(const simd8 other) const { return simd8(*this < other); }
    +
    +    // Bit-specific operations
    +    simdjson_inline simd8 any_bits_set(simd8 bits) const { return vtstq_u8(*this, bits); }
    +    simdjson_inline bool any_bits_set_anywhere() const { return this->max_val() != 0; }
    +    simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return (*this & bits).any_bits_set_anywhere(); }
    +    template
    +    simdjson_inline simd8 shr() const { return vshrq_n_u8(*this, N); }
    +    template
    +    simdjson_inline simd8 shl() const { return vshlq_n_u8(*this, N); }
    +
    +    // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values)
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return lookup_table.apply_lookup_16_to(*this);
    +    }
    +
    +
    +    // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset).
    +    // Passing a 0 value for mask would be equivalent to writing out every byte to output.
    +    // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes
    +    // get written.
    +    // Design consideration: it seems like a function with the
    +    // signature simd8 compress(uint16_t mask) would be
    +    // sensible, but the AVX ISA makes this kind of approach difficult.
    +    template
    +    simdjson_inline void compress(uint16_t mask, L * output) const {
    +      using internal::thintable_epi8;
    +      using internal::BitsSetTable256mul2;
    +      using internal::pshufb_combine_table;
    +      // this particular implementation was inspired by work done by @animetosho
    +      // we do it in two steps, first 8 bytes and then second 8 bytes
    +      uint8_t mask1 = uint8_t(mask); // least significant 8 bits
    +      uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
    +      // next line just loads the 64-bit values thintable_epi8[mask1] and
    +      // thintable_epi8[mask2] into a 128-bit register, using only
    +      // two instructions on most compilers.
    +      uint64x2_t shufmask64 = {thintable_epi8[mask1], thintable_epi8[mask2]};
    +      uint8x16_t shufmask = vreinterpretq_u8_u64(shufmask64);
    +      // we increment by 0x08 the second half of the mask
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +      uint8x16_t inc = simdjson_make_uint8x16_t(0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08);
    +#else
    +      uint8x16_t inc = {0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08};
    +#endif
    +      shufmask = vaddq_u8(shufmask, inc);
    +      // this is the version "nearly pruned"
    +      uint8x16_t pruned = vqtbl1q_u8(*this, shufmask);
    +      // we still need to put the two halves together.
    +      // we compute the popcount of the first half:
    +      int pop1 = BitsSetTable256mul2[mask1];
    +      // then load the corresponding mask, what it does is to write
    +      // only the first pop1 bytes from the first 8 bytes, and then
    +      // it fills in with the bytes from the second 8 bytes + some filling
    +      // at the end.
    +      uint8x16_t compactmask = vld1q_u8(reinterpret_cast(pshufb_combine_table + pop1 * 8));
    +      uint8x16_t answer = vqtbl1q_u8(pruned, compactmask);
    +      vst1q_u8(reinterpret_cast(output), answer);
    +    }
    +
    +    // Copies all bytes corresponding to a 0 in the low half of the mask (interpreted as a
    +    // bitset) to output1, then those corresponding to a 0 in the high half to output2.
    +    template
    +    simdjson_inline void compress_halves(uint16_t mask, L *output1, L *output2) const {
    +      using internal::thintable_epi8;
    +      uint8_t mask1 = uint8_t(mask); // least significant 8 bits
    +      uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
    +      uint8x8_t compactmask1 = vcreate_u8(thintable_epi8[mask1]);
    +      uint8x8_t compactmask2 = vcreate_u8(thintable_epi8[mask2]);
    +      // we increment by 0x08 the second half of the mask
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +      uint8x8_t inc = simdjson_make_uint8x8_t(0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08);
    +#else
    +      uint8x8_t inc = {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08};
    +#endif
    +      compactmask2 = vadd_u8(compactmask2, inc);
    +      // store each result (with the second store possibly overlapping the first)
    +      vst1_u8((uint8_t*)output1, vqtbl1_u8(*this, compactmask1));
    +      vst1_u8((uint8_t*)output2, vqtbl1_u8(*this, compactmask2));
    +    }
    +
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +
    +    template
    +    simdjson_inline simd8 apply_lookup_16_to(const simd8 original) {
    +      return vqtbl1q_u8(*this, simd8(original));
    +    }
    +  };
    +
    +  // Signed bytes
    +  template<>
    +  struct simd8 {
    +    int8x16_t value;
    +
    +    static simdjson_inline simd8 splat(int8_t _value) { return vmovq_n_s8(_value); }
    +    static simdjson_inline simd8 zero() { return vdupq_n_s8(0); }
    +    static simdjson_inline simd8 load(const int8_t values[16]) { return vld1q_s8(values); }
    +
    +    // Conversion from/to SIMD register
    +    simdjson_inline simd8(const int8x16_t _value) : value{_value} {}
    +    simdjson_inline operator const int8x16_t&() const { return this->value; }
    +    simdjson_inline operator int8x16_t&() { return this->value; }
    +
    +    // Zero constructor
    +    simdjson_inline simd8() : simd8(zero()) {}
    +    // Splat constructor
    +    simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const int8_t* values) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3, int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) : simd8(simdjson_make_int8x16_t(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +#else
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3, int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) : simd8(int8x16_t{
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    }) {}
    +#endif
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Store to array
    +    simdjson_inline void store(int8_t dst[16]) const { return vst1q_s8(dst, *this); }
    +
    +    // Explicit conversion to/from unsigned
    +    //
    +    // Under Visual Studio/ARM64 uint8x16_t and int8x16_t are apparently the same type.
    +    // In theory, we could check this occurrence with std::same_as and std::enabled_if but it is C++14
    +    // and relatively ugly and hard to read.
    +#ifndef SIMDJSON_REGULAR_VISUAL_STUDIO
    +    simdjson_inline explicit simd8(const uint8x16_t other): simd8(vreinterpretq_s8_u8(other)) {}
    +#endif
    +    simdjson_inline explicit operator simd8() const { return vreinterpretq_u8_s8(this->value); }
    +
    +    // Math
    +    simdjson_inline simd8 operator+(const simd8 other) const { return vaddq_s8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return vsubq_s8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *this; }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *this; }
    +
    +    // Order-sensitive comparisons
    +    simdjson_inline simd8 max_val(const simd8 other) const { return vmaxq_s8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return vminq_s8(*this, other); }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return vcgtq_s8(*this, other); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return vcltq_s8(*this, other); }
    +    simdjson_inline simd8 operator==(const simd8 other) const { return vceqq_s8(*this, other); }
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +      return vextq_s8(prev_chunk, *this, 16 - N);
    +    }
    +
    +    // Perform a lookup assuming no value is larger than 16
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return lookup_table.apply_lookup_16_to(*this);
    +    }
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +
    +    template
    +    simdjson_inline simd8 apply_lookup_16_to(const simd8 original) {
    +      return vqtbl1q_s8(*this, simd8(original));
    +    }
    +  };
    +
    +  template
    +  struct simd8x64 {
    +    static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +    static_assert(NUM_CHUNKS == 4, "ARM kernel should use four registers per 64-byte block.");
    +    const simd8 chunks[NUM_CHUNKS];
    +
    +    simd8x64(const simd8x64& o) = delete; // no copy allowed
    +    simd8x64& operator=(const simd8& other) = delete; // no assignment allowed
    +    simd8x64() = delete; // no default constructor allowed
    +
    +    simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1, const simd8 chunk2, const simd8 chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {}
    +    simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8::load(ptr), simd8::load(ptr+16), simd8::load(ptr+32), simd8::load(ptr+48)} {}
    +
    +    simdjson_inline void store(T ptr[64]) const {
    +      this->chunks[0].store(ptr+sizeof(simd8)*0);
    +      this->chunks[1].store(ptr+sizeof(simd8)*1);
    +      this->chunks[2].store(ptr+sizeof(simd8)*2);
    +      this->chunks[3].store(ptr+sizeof(simd8)*3);
    +    }
    +
    +    simdjson_inline simd8 reduce_or() const {
    +      return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]);
    +    }
    +
    +
    +    simdjson_inline uint64_t compress(uint64_t mask, T * output) const {
    +      uint64_t popcounts = vget_lane_u64(vreinterpret_u64_u8(vcnt_u8(vcreate_u8(~mask))), 0);
    +      // compute the prefix sum of the popcounts of each byte
    +      uint64_t offsets = popcounts * 0x0101010101010101;
    +      this->chunks[0].compress_halves(uint16_t(mask), output, &output[popcounts & 0xFF]);
    +      this->chunks[1].compress_halves(uint16_t(mask >> 16), &output[(offsets >> 8) & 0xFF], &output[(offsets >> 16) & 0xFF]);
    +      this->chunks[2].compress_halves(uint16_t(mask >> 32), &output[(offsets >> 24) & 0xFF], &output[(offsets >> 32) & 0xFF]);
    +      this->chunks[3].compress_halves(uint16_t(mask >> 48), &output[(offsets >> 40) & 0xFF], &output[(offsets >> 48) & 0xFF]);
    +      return offsets >> 56;
    +    }
    +
    +    simdjson_inline uint64_t to_bitmask() const {
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +      const uint8x16_t bit_mask = simdjson_make_uint8x16_t(
    +        0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
    +        0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80
    +      );
    +#else
    +      const uint8x16_t bit_mask = {
    +        0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
    +        0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80
    +      };
    +#endif
    +      // Add each of the elements next to each other, successively, to stuff each 8 byte mask into one.
    +      uint8x16_t sum0 = vpaddq_u8(this->chunks[0] & bit_mask, this->chunks[1] & bit_mask);
    +      uint8x16_t sum1 = vpaddq_u8(this->chunks[2] & bit_mask, this->chunks[3] & bit_mask);
    +      sum0 = vpaddq_u8(sum0, sum1);
    +      sum0 = vpaddq_u8(sum0, sum0);
    +      return vgetq_lane_u64(vreinterpretq_u64_u8(sum0), 0);
    +    }
    +
    +    simdjson_inline uint64_t eq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] == mask,
    +        this->chunks[1] == mask,
    +        this->chunks[2] == mask,
    +        this->chunks[3] == mask
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t lteq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] <= mask,
    +        this->chunks[1] <= mask,
    +        this->chunks[2] <= mask,
    +        this->chunks[3] <= mask
    +      ).to_bitmask();
    +    }
    +  }; // struct simd8x64
    +
    +} // namespace simd
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ARM64_SIMD_H
    +/* end file simdjson/arm64/simd.h */
    +/* including simdjson/arm64/stringparsing_defs.h: #include "simdjson/arm64/stringparsing_defs.h" */
    +/* begin file simdjson/arm64/stringparsing_defs.h */
    +#ifndef SIMDJSON_ARM64_STRINGPARSING_DEFS_H
    +#define SIMDJSON_ARM64_STRINGPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/simd.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +
    +using namespace simd;
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 32;
    +  simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; }
    +  simdjson_inline bool has_backslash() { return bs_bits != 0; }
    +  simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); }
    +  simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); }
    +
    +  uint32_t bs_bits;
    +  uint32_t quote_bits;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // this can read up to 31 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes");
    +  simd8 v0(src);
    +  simd8 v1(src + sizeof(v0));
    +  v0.store(dst);
    +  v1.store(dst + sizeof(v0));
    +
    +  // Getting a 64-bit bitmask is much cheaper than multiple 16-bit bitmasks on ARM; therefore, we
    +  // smash them together into a 64-byte mask and get the bitmask from there.
    +  uint64_t bs_and_quote = simd8x64(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask();
    +  return {
    +    uint32_t(bs_and_quote),      // bs_bits
    +    uint32_t(bs_and_quote >> 32) // quote_bits
    +  };
    +}
    +
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ARM64_STRINGPARSING_DEFS_H
    +/* end file simdjson/arm64/stringparsing_defs.h */
    +
    +#define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1
    +/* end file simdjson/arm64/begin.h */
    +/* including simdjson/generic/amalgamated.h for arm64: #include "simdjson/generic/amalgamated.h" */
    +/* begin file simdjson/generic/amalgamated.h for arm64 */
    +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_DEPENDENCIES_H)
    +#error simdjson/generic/dependencies.h must be included before simdjson/generic/amalgamated.h!
    +#endif
    +
    +/* including simdjson/generic/base.h for arm64: #include "simdjson/generic/base.h" */
    +/* begin file simdjson/generic/base.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): // If we haven't got an implementation yet, we're in the editor, editing a generic file! Just */
    +/* amalgamation skipped (editor-only): // use the most advanced one we can so the most possible stuff can be tested. */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation_detection.h" */
    +/* amalgamation skipped (editor-only): #if SIMDJSON_IMPLEMENTATION_ICELAKE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_HASWELL */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_WESTMERE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_ARM64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */
    +/* amalgamation skipped (editor-only): #else */
    +/* amalgamation skipped (editor-only): #error "All possible implementations (including fallback) have been disabled! simdjson will not run." */
    +/* amalgamation skipped (editor-only): #endif */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +
    +struct open_container;
    +class dom_parser_implementation;
    +
    +/**
    + * The type of a JSON number
    + */
    +enum class number_type {
    +    floating_point_number=1, /// a binary64 number
    +    signed_integer,          /// a signed integer that fits in a 64-bit word using two's complement
    +    unsigned_integer         /// a positive integer larger or equal to 1<<63
    +};
    +
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_BASE_H
    +/* end file simdjson/generic/base.h for arm64 */
    +/* including simdjson/generic/jsoncharutils.h for arm64: #include "simdjson/generic/jsoncharutils.h" */
    +/* begin file simdjson/generic/jsoncharutils.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_JSONCHARUTILS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_JSONCHARUTILS_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/jsoncharutils_tables.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +namespace jsoncharutils {
    +
    +// return non-zero if not a structural or whitespace char
    +// zero otherwise
    +simdjson_inline uint32_t is_not_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace_negated[c];
    +}
    +
    +simdjson_inline uint32_t is_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace[c];
    +}
    +
    +// returns a value with the high 16 bits set if not valid
    +// otherwise returns the conversion of the 4 hex digits at src into the bottom
    +// 16 bits of the 32-bit return register
    +//
    +// see
    +// https://lemire.me/blog/2019/04/17/parsing-short-hexadecimal-strings-efficiently/
    +static inline uint32_t hex_to_u32_nocheck(
    +    const uint8_t *src) { // strictly speaking, static inline is a C-ism
    +  uint32_t v1 = internal::digit_to_val32[630 + src[0]];
    +  uint32_t v2 = internal::digit_to_val32[420 + src[1]];
    +  uint32_t v3 = internal::digit_to_val32[210 + src[2]];
    +  uint32_t v4 = internal::digit_to_val32[0 + src[3]];
    +  return v1 | v2 | v3 | v4;
    +}
    +
    +// given a code point cp, writes to c
    +// the utf-8 code, outputting the length in
    +// bytes, if the length is zero, the code point
    +// is invalid
    +//
    +// This can possibly be made faster using pdep
    +// and clz and table lookups, but JSON documents
    +// have few escaped code points, and the following
    +// function looks cheap.
    +//
    +// Note: we assume that surrogates are treated separately
    +//
    +simdjson_inline size_t codepoint_to_utf8(uint32_t cp, uint8_t *c) {
    +  if (cp <= 0x7F) {
    +    c[0] = uint8_t(cp);
    +    return 1; // ascii
    +  }
    +  if (cp <= 0x7FF) {
    +    c[0] = uint8_t((cp >> 6) + 192);
    +    c[1] = uint8_t((cp & 63) + 128);
    +    return 2; // universal plane
    +    //  Surrogates are treated elsewhere...
    +    //} //else if (0xd800 <= cp && cp <= 0xdfff) {
    +    //  return 0; // surrogates // could put assert here
    +  } else if (cp <= 0xFFFF) {
    +    c[0] = uint8_t((cp >> 12) + 224);
    +    c[1] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[2] = uint8_t((cp & 63) + 128);
    +    return 3;
    +  } else if (cp <= 0x10FFFF) { // if you know you have a valid code point, this
    +                               // is not needed
    +    c[0] = uint8_t((cp >> 18) + 240);
    +    c[1] = uint8_t(((cp >> 12) & 63) + 128);
    +    c[2] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[3] = uint8_t((cp & 63) + 128);
    +    return 4;
    +  }
    +  // will return 0 when the code point was too large.
    +  return 0; // bad r
    +}
    +
    +#if SIMDJSON_IS_32BITS // _umul128 for x86, arm
    +// this is a slow emulation routine for 32-bit
    +//
    +static simdjson_inline uint64_t __emulu(uint32_t x, uint32_t y) {
    +  return x * (uint64_t)y;
    +}
    +static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) {
    +  uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd);
    +  uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd);
    +  uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32));
    +  uint64_t adbc_carry = !!(adbc < ad);
    +  uint64_t lo = bd + (adbc << 32);
    +  *hi = __emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) +
    +        (adbc_carry << 32) + !!(lo < bd);
    +  return lo;
    +}
    +#endif
    +
    +} // namespace jsoncharutils
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_JSONCHARUTILS_H
    +/* end file simdjson/generic/jsoncharutils.h for arm64 */
    +/* including simdjson/generic/atomparsing.h for arm64: #include "simdjson/generic/atomparsing.h" */
    +/* begin file simdjson/generic/atomparsing.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ATOMPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ATOMPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +/// @private
    +namespace atomparsing {
    +
    +// The string_to_uint32 is exclusively used to map literal strings to 32-bit values.
    +// We use memcpy instead of a pointer cast to avoid undefined behaviors since we cannot
    +// be certain that the character pointer will be properly aligned.
    +// You might think that using memcpy makes this function expensive, but you'd be wrong.
    +// All decent optimizing compilers (GCC, clang, Visual Studio) will compile string_to_uint32("false");
    +// to the compile-time constant 1936482662.
    +simdjson_inline uint32_t string_to_uint32(const char* str) { uint32_t val; std::memcpy(&val, str, sizeof(uint32_t)); return val; }
    +
    +
    +// Again in str4ncmp we use a memcpy to avoid undefined behavior. The memcpy may appear expensive.
    +// Yet all decent optimizing compilers will compile memcpy to a single instruction, just about.
    +simdjson_warn_unused
    +simdjson_inline uint32_t str4ncmp(const uint8_t *src, const char* atom) {
    +  uint32_t srcval; // we want to avoid unaligned 32-bit loads (undefined in C/C++)
    +  static_assert(sizeof(uint32_t) <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be larger than 4 bytes");
    +  std::memcpy(&srcval, src, sizeof(uint32_t));
    +  return srcval ^ string_to_uint32(atom);
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "true") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_true_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "true"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src) {
    +  return (str4ncmp(src+1, "alse") | jsoncharutils::is_not_structural_or_whitespace(src[5])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src, size_t len) {
    +  if (len > 5) { return is_valid_false_atom(src); }
    +  else if (len == 5) { return !str4ncmp(src+1, "alse"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "null") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_null_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "null"); }
    +  else { return false; }
    +}
    +
    +} // namespace atomparsing
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ATOMPARSING_H
    +/* end file simdjson/generic/atomparsing.h for arm64 */
    +/* including simdjson/generic/dom_parser_implementation.h for arm64: #include "simdjson/generic/dom_parser_implementation.h" */
    +/* begin file simdjson/generic/dom_parser_implementation.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +
    +// expectation: sizeof(open_container) = 64/8.
    +struct open_container {
    +  uint32_t tape_index; // where, on the tape, does the scope ([,{) begins
    +  uint32_t count; // how many elements in the scope
    +}; // struct open_container
    +
    +static_assert(sizeof(open_container) == 64/8, "Open container must be 64 bits");
    +
    +class dom_parser_implementation final : public internal::dom_parser_implementation {
    +public:
    +  /** Tape location of each open { or [ */
    +  std::unique_ptr open_containers{};
    +  /** Whether each open container is a [ or { */
    +  std::unique_ptr is_array{};
    +  /** Buffer passed to stage 1 */
    +  const uint8_t *buf{};
    +  /** Length passed to stage 1 */
    +  size_t len{0};
    +  /** Document passed to stage 2 */
    +  dom::document *doc{};
    +
    +  inline dom_parser_implementation() noexcept;
    +  inline dom_parser_implementation(dom_parser_implementation &&other) noexcept;
    +  inline dom_parser_implementation &operator=(dom_parser_implementation &&other) noexcept;
    +  dom_parser_implementation(const dom_parser_implementation &) = delete;
    +  dom_parser_implementation &operator=(const dom_parser_implementation &) = delete;
    +
    +  simdjson_warn_unused error_code parse(const uint8_t *buf, size_t len, dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage1(const uint8_t *buf, size_t len, stage1_mode partial) noexcept final;
    +  simdjson_warn_unused error_code stage2(dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage2_next(dom::document &doc) noexcept final;
    +  simdjson_warn_unused uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) const noexcept final;
    +  simdjson_warn_unused uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept final;
    +  inline simdjson_warn_unused error_code set_capacity(size_t capacity) noexcept final;
    +  inline simdjson_warn_unused error_code set_max_depth(size_t max_depth) noexcept final;
    +private:
    +  simdjson_inline simdjson_warn_unused error_code set_capacity_stage1(size_t capacity);
    +
    +};
    +
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +namespace arm64 {
    +
    +inline dom_parser_implementation::dom_parser_implementation() noexcept = default;
    +inline dom_parser_implementation::dom_parser_implementation(dom_parser_implementation &&other) noexcept = default;
    +inline dom_parser_implementation &dom_parser_implementation::operator=(dom_parser_implementation &&other) noexcept = default;
    +
    +// Leaving these here so they can be inlined if so desired
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_capacity(size_t capacity) noexcept {
    +  if(capacity > SIMDJSON_MAXSIZE_BYTES) { return CAPACITY; }
    +  // Stage 1 index output
    +  size_t max_structures = SIMDJSON_ROUNDUP_N(capacity, 64) + 2 + 7;
    +  structural_indexes.reset( new (std::nothrow) uint32_t[max_structures] );
    +  if (!structural_indexes) { _capacity = 0; return MEMALLOC; }
    +  structural_indexes[0] = 0;
    +  n_structural_indexes = 0;
    +
    +  _capacity = capacity;
    +  return SUCCESS;
    +}
    +
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_max_depth(size_t max_depth) noexcept {
    +  // Stage 2 stacks
    +  open_containers.reset(new (std::nothrow) open_container[max_depth]);
    +  is_array.reset(new (std::nothrow) bool[max_depth]);
    +  if (!is_array || !open_containers) { _max_depth = 0; return MEMALLOC; }
    +
    +  _max_depth = max_depth;
    +  return SUCCESS;
    +}
    +
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +/* end file simdjson/generic/dom_parser_implementation.h for arm64 */
    +/* including simdjson/generic/implementation_simdjson_result_base.h for arm64: #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +
    +// This is a near copy of include/error.h's implementation_simdjson_result_base, except it doesn't use std::pair
    +// so we can avoid inlining errors
    +// TODO reconcile these!
    +/**
    + * The result of a simdjson operation that could fail.
    + *
    + * Gives the option of reading error codes, or throwing an exception by casting to the desired result.
    + *
    + * This is a base class for implementations that want to add functions to the result type for
    + * chaining.
    + *
    + * Override like:
    + *
    + *   struct simdjson_result : public internal::implementation_simdjson_result_base {
    + *     simdjson_result() noexcept : internal::implementation_simdjson_result_base() {}
    + *     simdjson_result(error_code error) noexcept : internal::implementation_simdjson_result_base(error) {}
    + *     simdjson_result(T &&value) noexcept : internal::implementation_simdjson_result_base(std::forward(value)) {}
    + *     simdjson_result(T &&value, error_code error) noexcept : internal::implementation_simdjson_result_base(value, error) {}
    + *     // Your extra methods here
    + *   }
    + *
    + * Then any method returning simdjson_result will be chainable with your methods.
    + */
    +template
    +struct implementation_simdjson_result_base {
    +
    +  /**
    +   * Create a new empty result with error = UNINITIALIZED.
    +   */
    +  simdjson_inline implementation_simdjson_result_base() noexcept = default;
    +
    +  /**
    +   * Create a new error result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(error_code error) noexcept;
    +
    +  /**
    +   * Create a new successful result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value) noexcept;
    +
    +  /**
    +   * Create a new result with both things (use if you don't want to branch when creating the result).
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value, error_code error) noexcept;
    +
    +  /**
    +   * Move the value and the error to the provided variables.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   * @param error The variable to assign the error to. Set to SUCCESS if there is no error.
    +   */
    +  simdjson_inline void tie(T &value, error_code &error) && noexcept;
    +
    +  /**
    +   * Move the value to the provided variable.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   */
    +  simdjson_inline error_code get(T &value) && noexcept;
    +
    +  /**
    +   * The error.
    +   */
    +  simdjson_inline error_code error() const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value.
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T& value() & noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& value() && noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& take_value() && noexcept(false);
    +
    +  /**
    +   * Cast to the value (will throw on error).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline operator T&&() && noexcept(false);
    +
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline const T& value_unsafe() const& noexcept;
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T& value_unsafe() & noexcept;
    +  /**
    +   * Take the result value (move it). This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T&& value_unsafe() && noexcept;
    +protected:
    +  /** users should never directly access first and second. **/
    +  T first{}; /** Users should never directly access 'first'. **/
    +  error_code second{UNINITIALIZED}; /** Users should never directly access 'second'. **/
    +}; // struct implementation_simdjson_result_base
    +
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +/* end file simdjson/generic/implementation_simdjson_result_base.h for arm64 */
    +/* including simdjson/generic/numberparsing.h for arm64: #include "simdjson/generic/numberparsing.h" */
    +/* begin file simdjson/generic/numberparsing.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_NUMBERPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_NUMBERPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace numberparsing {
    +
    +#ifdef JSON_TEST_NUMBERS
    +#define INVALID_NUMBER(SRC) (found_invalid_number((SRC)), NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (found_integer((VALUE), (SRC)), (WRITER).append_s64((VALUE)))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (found_unsigned_integer((VALUE), (SRC)), (WRITER).append_u64((VALUE)))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (found_float((VALUE), (SRC)), (WRITER).append_double((VALUE)))
    +#else
    +#define INVALID_NUMBER(SRC) (NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (WRITER).append_s64((VALUE))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (WRITER).append_u64((VALUE))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (WRITER).append_double((VALUE))
    +#endif
    +
    +namespace {
    +
    +// Convert a mantissa, an exponent and a sign bit into an ieee64 double.
    +// The real_exponent needs to be in [0, 2046] (technically real_exponent = 2047 would be acceptable).
    +// The mantissa should be in [0,1<<53). The bit at index (1ULL << 52) while be zeroed.
    +simdjson_inline double to_double(uint64_t mantissa, uint64_t real_exponent, bool negative) {
    +    double d;
    +    mantissa &= ~(1ULL << 52);
    +    mantissa |= real_exponent << 52;
    +    mantissa |= ((static_cast(negative)) << 63);
    +    std::memcpy(&d, &mantissa, sizeof(d));
    +    return d;
    +}
    +
    +// Attempts to compute i * 10^(power) exactly; and if "negative" is
    +// true, negate the result.
    +// This function will only work in some cases, when it does not work, success is
    +// set to false. This should work *most of the time* (like 99% of the time).
    +// We assume that power is in the [smallest_power,
    +// largest_power] interval: the caller is responsible for this check.
    +simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative, double &d) {
    +  // we start with a fast path
    +  // It was described in
    +  // Clinger WD. How to read floating point numbers accurately.
    +  // ACM SIGPLAN Notices. 1990
    +#ifndef FLT_EVAL_METHOD
    +#error "FLT_EVAL_METHOD should be defined, please include cfloat."
    +#endif
    +#if (FLT_EVAL_METHOD != 1) && (FLT_EVAL_METHOD != 0)
    +  // We cannot be certain that x/y is rounded to nearest.
    +  if (0 <= power && power <= 22 && i <= 9007199254740991)
    +#else
    +  if (-22 <= power && power <= 22 && i <= 9007199254740991)
    +#endif
    +  {
    +    // convert the integer into a double. This is lossless since
    +    // 0 <= i <= 2^53 - 1.
    +    d = double(i);
    +    //
    +    // The general idea is as follows.
    +    // If 0 <= s < 2^53 and if 10^0 <= p <= 10^22 then
    +    // 1) Both s and p can be represented exactly as 64-bit floating-point
    +    // values
    +    // (binary64).
    +    // 2) Because s and p can be represented exactly as floating-point values,
    +    // then s * p
    +    // and s / p will produce correctly rounded values.
    +    //
    +    if (power < 0) {
    +      d = d / simdjson::internal::power_of_ten[-power];
    +    } else {
    +      d = d * simdjson::internal::power_of_ten[power];
    +    }
    +    if (negative) {
    +      d = -d;
    +    }
    +    return true;
    +  }
    +  // When 22 < power && power <  22 + 16, we could
    +  // hope for another, secondary fast path.  It was
    +  // described by David M. Gay in  "Correctly rounded
    +  // binary-decimal and decimal-binary conversions." (1990)
    +  // If you need to compute i * 10^(22 + x) for x < 16,
    +  // first compute i * 10^x, if you know that result is exact
    +  // (e.g., when i * 10^x < 2^53),
    +  // then you can still proceed and do (i * 10^x) * 10^22.
    +  // Is this worth your time?
    +  // You need  22 < power *and* power <  22 + 16 *and* (i * 10^(x-22) < 2^53)
    +  // for this second fast path to work.
    +  // If you you have 22 < power *and* power <  22 + 16, and then you
    +  // optimistically compute "i * 10^(x-22)", there is still a chance that you
    +  // have wasted your time if i * 10^(x-22) >= 2^53. It makes the use cases of
    +  // this optimization maybe less common than we would like. Source:
    +  // http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/
    +  // also used in RapidJSON: https://rapidjson.org/strtod_8h_source.html
    +
    +  // The fast path has now failed, so we are failing back on the slower path.
    +
    +  // In the slow path, we need to adjust i so that it is > 1<<63 which is always
    +  // possible, except if i == 0, so we handle i == 0 separately.
    +  if(i == 0) {
    +    d = negative ? -0.0 : 0.0;
    +    return true;
    +  }
    +
    +
    +  // The exponent is 1024 + 63 + power
    +  //     + floor(log(5**power)/log(2)).
    +  // The 1024 comes from the ieee64 standard.
    +  // The 63 comes from the fact that we use a 64-bit word.
    +  //
    +  // Computing floor(log(5**power)/log(2)) could be
    +  // slow. Instead we use a fast function.
    +  //
    +  // For power in (-400,350), we have that
    +  // (((152170 + 65536) * power ) >> 16);
    +  // is equal to
    +  //  floor(log(5**power)/log(2)) + power when power >= 0
    +  // and it is equal to
    +  //  ceil(log(5**-power)/log(2)) + power when power < 0
    +  //
    +  // The 65536 is (1<<16) and corresponds to
    +  // (65536 * power) >> 16 ---> power
    +  //
    +  // ((152170 * power ) >> 16) is equal to
    +  // floor(log(5**power)/log(2))
    +  //
    +  // Note that this is not magic: 152170/(1<<16) is
    +  // approximatively equal to log(5)/log(2).
    +  // The 1<<16 value is a power of two; we could use a
    +  // larger power of 2 if we wanted to.
    +  //
    +  int64_t exponent = (((152170 + 65536) * power) >> 16) + 1024 + 63;
    +
    +
    +  // We want the most significant bit of i to be 1. Shift if needed.
    +  int lz = leading_zeroes(i);
    +  i <<= lz;
    +
    +
    +  // We are going to need to do some 64-bit arithmetic to get a precise product.
    +  // We use a table lookup approach.
    +  // It is safe because
    +  // power >= smallest_power
    +  // and power <= largest_power
    +  // We recover the mantissa of the power, it has a leading 1. It is always
    +  // rounded down.
    +  //
    +  // We want the most significant 64 bits of the product. We know
    +  // this will be non-zero because the most significant bit of i is
    +  // 1.
    +  const uint32_t index = 2 * uint32_t(power - simdjson::internal::smallest_power);
    +  // Optimization: It may be that materializing the index as a variable might confuse some compilers and prevent effective complex-addressing loads. (Done for code clarity.)
    +  //
    +  // The full_multiplication function computes the 128-bit product of two 64-bit words
    +  // with a returned value of type value128 with a "low component" corresponding to the
    +  // 64-bit least significant bits of the product and with a "high component" corresponding
    +  // to the 64-bit most significant bits of the product.
    +  simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
    +  // Both i and power_of_five_128[index] have their most significant bit set to 1 which
    +  // implies that the either the most or the second most significant bit of the product
    +  // is 1. We pack values in this manner for efficiency reasons: it maximizes the use
    +  // we make of the product. It also makes it easy to reason about the product: there
    +  // is 0 or 1 leading zero in the product.
    +
    +  // Unless the least significant 9 bits of the high (64-bit) part of the full
    +  // product are all 1s, then we know that the most significant 55 bits are
    +  // exact and no further work is needed. Having 55 bits is necessary because
    +  // we need 53 bits for the mantissa but we have to have one rounding bit and
    +  // we can waste a bit if the most significant bit of the product is zero.
    +  if((firstproduct.high & 0x1FF) == 0x1FF) {
    +    // We want to compute i * 5^q, but only care about the top 55 bits at most.
    +    // Consider the scenario where q>=0. Then 5^q may not fit in 64-bits. Doing
    +    // the full computation is wasteful. So we do what is called a "truncated
    +    // multiplication".
    +    // We take the most significant 64-bits, and we put them in
    +    // power_of_five_128[index]. Usually, that's good enough to approximate i * 5^q
    +    // to the desired approximation using one multiplication. Sometimes it does not suffice.
    +    // Then we store the next most significant 64 bits in power_of_five_128[index + 1], and
    +    // then we get a better approximation to i * 5^q.
    +    //
    +    // That's for when q>=0. The logic for q<0 is somewhat similar but it is somewhat
    +    // more complicated.
    +    //
    +    // There is an extra layer of complexity in that we need more than 55 bits of
    +    // accuracy in the round-to-even scenario.
    +    //
    +    // The full_multiplication function computes the 128-bit product of two 64-bit words
    +    // with a returned value of type value128 with a "low component" corresponding to the
    +    // 64-bit least significant bits of the product and with a "high component" corresponding
    +    // to the 64-bit most significant bits of the product.
    +    simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
    +    firstproduct.low += secondproduct.high;
    +    if(secondproduct.high > firstproduct.low) { firstproduct.high++; }
    +    // As it has been proven by Noble Mushtak and Daniel Lemire in "Fast Number Parsing Without
    +    // Fallback" (https://arxiv.org/abs/2212.06644), at this point we are sure that the product
    +    // is sufficiently accurate, and more computation is not needed.
    +  }
    +  uint64_t lower = firstproduct.low;
    +  uint64_t upper = firstproduct.high;
    +  // The final mantissa should be 53 bits with a leading 1.
    +  // We shift it so that it occupies 54 bits with a leading 1.
    +  ///////
    +  uint64_t upperbit = upper >> 63;
    +  uint64_t mantissa = upper >> (upperbit + 9);
    +  lz += int(1 ^ upperbit);
    +
    +  // Here we have mantissa < (1<<54).
    +  int64_t real_exponent = exponent - lz;
    +  if (simdjson_unlikely(real_exponent <= 0)) { // we have a subnormal?
    +    // Here have that real_exponent <= 0 so -real_exponent >= 0
    +    if(-real_exponent + 1 >= 64) { // if we have more than 64 bits below the minimum exponent, you have a zero for sure.
    +      d = negative ? -0.0 : 0.0;
    +      return true;
    +    }
    +    // next line is safe because -real_exponent + 1 < 0
    +    mantissa >>= -real_exponent + 1;
    +    // Thankfully, we can't have both "round-to-even" and subnormals because
    +    // "round-to-even" only occurs for powers close to 0.
    +    mantissa += (mantissa & 1); // round up
    +    mantissa >>= 1;
    +    // There is a weird scenario where we don't have a subnormal but just.
    +    // Suppose we start with 2.2250738585072013e-308, we end up
    +    // with 0x3fffffffffffff x 2^-1023-53 which is technically subnormal
    +    // whereas 0x40000000000000 x 2^-1023-53  is normal. Now, we need to round
    +    // up 0x3fffffffffffff x 2^-1023-53  and once we do, we are no longer
    +    // subnormal, but we can only know this after rounding.
    +    // So we only declare a subnormal if we are smaller than the threshold.
    +    real_exponent = (mantissa < (uint64_t(1) << 52)) ? 0 : 1;
    +    d = to_double(mantissa, real_exponent, negative);
    +    return true;
    +  }
    +  // We have to round to even. The "to even" part
    +  // is only a problem when we are right in between two floats
    +  // which we guard against.
    +  // If we have lots of trailing zeros, we may fall right between two
    +  // floating-point values.
    +  //
    +  // The round-to-even cases take the form of a number 2m+1 which is in (2^53,2^54]
    +  // times a power of two. That is, it is right between a number with binary significand
    +  // m and another number with binary significand m+1; and it must be the case
    +  // that it cannot be represented by a float itself.
    +  //
    +  // We must have that w * 10 ^q == (2m+1) * 2^p for some power of two 2^p.
    +  // Recall that 10^q = 5^q * 2^q.
    +  // When q >= 0, we must have that (2m+1) is divible by 5^q, so 5^q <= 2^54. We have that
    +  //  5^23 <=  2^54 and it is the last power of five to qualify, so q <= 23.
    +  // When q<0, we have  w  >=  (2m+1) x 5^{-q}.  We must have that w<2^{64} so
    +  // (2m+1) x 5^{-q} < 2^{64}. We have that 2m+1>2^{53}. Hence, we must have
    +  // 2^{53} x 5^{-q} < 2^{64}.
    +  // Hence we have 5^{-q} < 2^{11}$ or q>= -4.
    +  //
    +  // We require lower <= 1 and not lower == 0 because we could not prove that
    +  // that lower == 0 is implied; but we could prove that lower <= 1 is a necessary and sufficient test.
    +  if (simdjson_unlikely((lower <= 1) && (power >= -4) && (power <= 23) && ((mantissa & 3) == 1))) {
    +    if((mantissa  << (upperbit + 64 - 53 - 2)) ==  upper) {
    +      mantissa &= ~1;             // flip it so that we do not round up
    +    }
    +  }
    +
    +  mantissa += mantissa & 1;
    +  mantissa >>= 1;
    +
    +  // Here we have mantissa < (1<<53), unless there was an overflow
    +  if (mantissa >= (1ULL << 53)) {
    +    //////////
    +    // This will happen when parsing values such as 7.2057594037927933e+16
    +    ////////
    +    mantissa = (1ULL << 52);
    +    real_exponent++;
    +  }
    +  mantissa &= ~(1ULL << 52);
    +  // we have to check that real_exponent is in range, otherwise we bail out
    +  if (simdjson_unlikely(real_exponent > 2046)) {
    +    // We have an infinite value!!! We could actually throw an error here if we could.
    +    return false;
    +  }
    +  d = to_double(mantissa, real_exponent, negative);
    +  return true;
    +}
    +
    +// We call a fallback floating-point parser that might be slow. Note
    +// it will accept JSON numbers, but the JSON spec. is more restrictive so
    +// before you call parse_float_fallback, you need to have validated the input
    +// string with the JSON grammar.
    +// It will return an error (false) if the parsed number is infinite.
    +// The string parsing itself always succeeds. We know that there is at least
    +// one digit.
    +static bool parse_float_fallback(const uint8_t *ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +static bool parse_float_fallback(const uint8_t *ptr, const uint8_t *end_ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr), reinterpret_cast(end_ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +// check quickly whether the next 8 chars are made of digits
    +// at a glance, it looks better than Mula's
    +// http://0x80.pl/articles/swar-digits-validate.html
    +simdjson_inline bool is_made_of_eight_digits_fast(const uint8_t *chars) {
    +  uint64_t val;
    +  // this can read up to 7 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(7 <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be bigger than 7");
    +  std::memcpy(&val, chars, 8);
    +  // a branchy method might be faster:
    +  // return (( val & 0xF0F0F0F0F0F0F0F0 ) == 0x3030303030303030)
    +  //  && (( (val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0 ) ==
    +  //  0x3030303030303030);
    +  return (((val & 0xF0F0F0F0F0F0F0F0) |
    +           (((val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0) >> 4)) ==
    +          0x3333333333333333);
    +}
    +
    +template
    +SIMDJSON_NO_SANITIZE_UNDEFINED // We deliberately allow overflow here and check later
    +simdjson_inline bool parse_digit(const uint8_t c, I &i) {
    +  const uint8_t digit = static_cast(c - '0');
    +  if (digit > 9) {
    +    return false;
    +  }
    +  // PERF NOTE: multiplication by 10 is cheaper than arbitrary integer multiplication
    +  i = 10 * i + digit; // might overflow, we will handle the overflow later
    +  return true;
    +}
    +
    +simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const uint8_t *const src, const uint8_t *&p, uint64_t &i, int64_t &exponent) {
    +  // we continue with the fiction that we have an integer. If the
    +  // floating point number is representable as x * 10^z for some integer
    +  // z that fits in 53 bits, then we will be able to convert back the
    +  // the integer into a float in a lossless manner.
    +  const uint8_t *const first_after_period = p;
    +
    +#ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +#if SIMDJSON_SWAR_NUMBER_PARSING
    +  // this helps if we have lots of decimals!
    +  // this turns out to be frequent enough.
    +  if (is_made_of_eight_digits_fast(p)) {
    +    i = i * 100000000 + parse_eight_digits_unrolled(p);
    +    p += 8;
    +  }
    +#endif // SIMDJSON_SWAR_NUMBER_PARSING
    +#endif // #ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +  // Unrolling the first digit makes a small difference on some implementations (e.g. westmere)
    +  if (parse_digit(*p, i)) { ++p; }
    +  while (parse_digit(*p, i)) { p++; }
    +  exponent = first_after_period - p;
    +  // Decimal without digits (123.) is illegal
    +  if (exponent == 0) {
    +    return INVALID_NUMBER(src);
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) {
    +  // Exp Sign: -123.456e[-]78
    +  bool neg_exp = ('-' == *p);
    +  if (neg_exp || '+' == *p) { p++; } // Skip + as well
    +
    +  // Exponent: -123.456e-[78]
    +  auto start_exp = p;
    +  int64_t exp_number = 0;
    +  while (parse_digit(*p, exp_number)) { ++p; }
    +  // It is possible for parse_digit to overflow.
    +  // In particular, it could overflow to INT64_MIN, and we cannot do - INT64_MIN.
    +  // Thus we *must* check for possible overflow before we negate exp_number.
    +
    +  // Performance notes: it may seem like combining the two "simdjson_unlikely checks" below into
    +  // a single simdjson_unlikely path would be faster. The reasoning is sound, but the compiler may
    +  // not oblige and may, in fact, generate two distinct paths in any case. It might be
    +  // possible to do uint64_t(p - start_exp - 1) >= 18 but it could end up trading off
    +  // instructions for a simdjson_likely branch, an unconclusive gain.
    +
    +  // If there were no digits, it's an error.
    +  if (simdjson_unlikely(p == start_exp)) {
    +    return INVALID_NUMBER(src);
    +  }
    +  // We have a valid positive exponent in exp_number at this point, except that
    +  // it may have overflowed.
    +
    +  // If there were more than 18 digits, we may have overflowed the integer. We have to do
    +  // something!!!!
    +  if (simdjson_unlikely(p > start_exp+18)) {
    +    // Skip leading zeroes: 1e000000000000000000001 is technically valid and doesn't overflow
    +    while (*start_exp == '0') { start_exp++; }
    +    // 19 digits could overflow int64_t and is kind of absurd anyway. We don't
    +    // support exponents smaller than -999,999,999,999,999,999 and bigger
    +    // than 999,999,999,999,999,999.
    +    // We can truncate.
    +    // Note that 999999999999999999 is assuredly too large. The maximal ieee64 value before
    +    // infinity is ~1.8e308. The smallest subnormal is ~5e-324. So, actually, we could
    +    // truncate at 324.
    +    // Note that there is no reason to fail per se at this point in time.
    +    // E.g., 0e999999999999999999999 is a fine number.
    +    if (p > start_exp+18) { exp_number = 999999999999999999; }
    +  }
    +  // At this point, we know that exp_number is a sane, positive, signed integer.
    +  // It is <= 999,999,999,999,999,999. As long as 'exponent' is in
    +  // [-8223372036854775808, 8223372036854775808], we won't overflow. Because 'exponent'
    +  // is bounded in magnitude by the size of the JSON input, we are fine in this universe.
    +  // To sum it up: the next line should never overflow.
    +  exponent += (neg_exp ? -exp_number : exp_number);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline size_t significant_digits(const uint8_t * start_digits, size_t digit_count) {
    +  // It is possible that the integer had an overflow.
    +  // We have to handle the case where we have 0.0000somenumber.
    +  const uint8_t *start = start_digits;
    +  while ((*start == '0') || (*start == '.')) { ++start; }
    +  // we over-decrement by one when there is a '.'
    +  return digit_count - size_t(start - start_digits);
    +}
    +
    +} // unnamed namespace
    +
    +/** @private */
    +template
    +error_code slow_float_parsing(simdjson_unused const uint8_t * src, W writer) {
    +  double d;
    +  if (parse_float_fallback(src, &d)) {
    +    writer.append_double(d);
    +    return SUCCESS;
    +  }
    +  return INVALID_NUMBER(src);
    +}
    +
    +/** @private */
    +template
    +simdjson_inline error_code write_float(const uint8_t *const src, bool negative, uint64_t i, const uint8_t * start_digits, size_t digit_count, int64_t exponent, W &writer) {
    +  // If we frequently had to deal with long strings of digits,
    +  // we could extend our code by using a 128-bit integer instead
    +  // of a 64-bit integer. However, this is uncommon in practice.
    +  //
    +  // 9999999999999999999 < 2**64 so we can accommodate 19 digits.
    +  // If we have a decimal separator, then digit_count - 1 is the number of digits, but we
    +  // may not have a decimal separator!
    +  if (simdjson_unlikely(digit_count > 19 && significant_digits(start_digits, digit_count) > 19)) {
    +    // Ok, chances are good that we had an overflow!
    +    // this is almost never going to get called!!!
    +    // we start anew, going slowly!!!
    +    // This will happen in the following examples:
    +    // 10000000000000000000000000000000000000000000e+308
    +    // 3.1415926535897932384626433832795028841971693993751
    +    //
    +    // NOTE: This makes a *copy* of the writer and passes it to slow_float_parsing. This happens
    +    // because slow_float_parsing is a non-inlined function. If we passed our writer reference to
    +    // it, it would force it to be stored in memory, preventing the compiler from picking it apart
    +    // and putting into registers. i.e. if we pass it as reference, it gets slow.
    +    // This is what forces the skip_double, as well.
    +    error_code error = slow_float_parsing(src, writer);
    +    writer.skip_double();
    +    return error;
    +  }
    +  // NOTE: it's weird that the simdjson_unlikely() only wraps half the if, but it seems to get slower any other
    +  // way we've tried: https://github.com/simdjson/simdjson/pull/990#discussion_r448497331
    +  // To future reader: we'd love if someone found a better way, or at least could explain this result!
    +  if (simdjson_unlikely(exponent < simdjson::internal::smallest_power) || (exponent > simdjson::internal::largest_power)) {
    +    //
    +    // Important: smallest_power is such that it leads to a zero value.
    +    // Observe that 18446744073709551615e-343 == 0, i.e. (2**64 - 1) e -343 is zero
    +    // so something x 10^-343 goes to zero, but not so with  something x 10^-342.
    +    static_assert(simdjson::internal::smallest_power <= -342, "smallest_power is not small enough");
    +    //
    +    if((exponent < simdjson::internal::smallest_power) || (i == 0)) {
    +      // E.g. Parse "-0.0e-999" into the same value as "-0.0". See https://en.wikipedia.org/wiki/Signed_zero
    +      WRITE_DOUBLE(negative ? -0.0 : 0.0, src, writer);
    +      return SUCCESS;
    +    } else { // (exponent > largest_power) and (i != 0)
    +      // We have, for sure, an infinite value and simdjson refuses to parse infinite values.
    +      return INVALID_NUMBER(src);
    +    }
    +  }
    +  double d;
    +  if (!compute_float_64(exponent, i, negative, d)) {
    +    // we are almost never going to get here.
    +    if (!parse_float_fallback(src, &d)) { return INVALID_NUMBER(src); }
    +  }
    +  WRITE_DOUBLE(d, src, writer);
    +  return SUCCESS;
    +}
    +
    +// for performance analysis, it is sometimes  useful to skip parsing
    +#ifdef SIMDJSON_SKIPNUMBERPARSING
    +
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const, W &writer) {
    +  writer.append_s64(0);        // always write zero
    +  return SUCCESS;              // always succeeds
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept { return number_type::signed_integer; }
    +#else
    +
    +// parse the number at src
    +// define JSON_TEST_NUMBERS for unit testing
    +//
    +// It is assumed that the number is followed by a structural ({,},],[) character
    +// or a white space character. If that is not the case (e.g., when the JSON
    +// document is made of a single number), then it is necessary to copy the
    +// content and append a space before calling this function.
    +//
    +// Our objective is accurate parsing (ULP of 0) at high speed.
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) {
    +
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  if (digit_count == 0 || ('0' == *start_digits && digit_count > 1)) { return INVALID_NUMBER(src); }
    +
    +  //
    +  // Handle floats if there is a . or e (or both)
    +  //
    +  int64_t exponent = 0;
    +  bool is_float = false;
    +  if ('.' == *p) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_decimal_after_separator(src, p, i, exponent) );
    +    digit_count = int(p - start_digits); // used later to guard against overflows
    +  }
    +  if (('e' == *p) || ('E' == *p)) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_exponent(src, p, exponent) );
    +  }
    +  if (is_float) {
    +    const bool dirty_end = jsoncharutils::is_not_structural_or_whitespace(*p);
    +    SIMDJSON_TRY( write_float(src, negative, i, start_digits, digit_count, exponent, writer) );
    +    if (dirty_end) { return INVALID_NUMBER(src); }
    +    return SUCCESS;
    +  }
    +
    +  // The longest negative 64-bit number is 19 digits.
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  size_t longest_digit_count = negative ? 19 : 20;
    +  if (digit_count > longest_digit_count) { return INVALID_NUMBER(src); }
    +  if (digit_count == longest_digit_count) {
    +    if (negative) {
    +      // Anything negative above INT64_MAX+1 is invalid
    +      if (i > uint64_t(INT64_MAX)+1) { return INVALID_NUMBER(src);  }
    +      WRITE_INTEGER(~i+1, src, writer);
    +      if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +      return SUCCESS;
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    }  else if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INVALID_NUMBER(src); }
    +  }
    +
    +  // Write unsigned if it doesn't fit in a signed integer.
    +  if (i > uint64_t(INT64_MAX)) {
    +    WRITE_UNSIGNED(i, src, writer);
    +  } else {
    +    WRITE_INTEGER(negative ? (~i+1) : i, src, writer);
    +  }
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +  return SUCCESS;
    +}
    +
    +// Inlineable functions
    +namespace {
    +
    +// This table can be used to characterize the final character of an integer
    +// string. For JSON structural character and allowable white space characters,
    +// we return SUCCESS. For 'e', '.' and 'E', we return INCORRECT_TYPE. Otherwise
    +// we return NUMBER_ERROR.
    +// Optimization note: we could easily reduce the size of the table by half (to 128)
    +// at the cost of an extra branch.
    +// Optimization note: we want the values to use at most 8 bits (not, e.g., 32 bits):
    +static_assert(error_code(uint8_t(NUMBER_ERROR))== NUMBER_ERROR, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(SUCCESS))== SUCCESS, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(INCORRECT_TYPE))== INCORRECT_TYPE, "bad NUMBER_ERROR cast");
    +
    +const uint8_t integer_string_finisher[256] = {
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   SUCCESS,      NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, INCORRECT_TYPE,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, SUCCESS,        NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR};
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if ((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src + 1;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    // Note: we use src[1] and not src[0] because src[0] is the quote character in this
    +    // instance.
    +    if (src[1] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = src;
    +  uint64_t i = 0;
    +  while (parse_digit(*src, i)) { src++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(src - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*src)) {
    +  //  return (*src == '.' || *src == 'e' || *src == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(*src != '"') { return NUMBER_ERROR; }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept {
    +  return (*src == '-');
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) { return true; }
    +  return false;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) {
    +    // We have an integer.
    +    // If the number is negative and valid, it must be a signed integer.
    +    if(negative) { return number_type::signed_integer; }
    +    // We want values larger or equal to 9223372036854775808 to be unsigned
    +    // integers, and the other values to be signed integers.
    +    int digit_count = int(p - src);
    +    if(digit_count >= 19) {
    +      const uint8_t * smaller_big_integer = reinterpret_cast("9223372036854775808");
    +      if((digit_count >= 20) || (memcmp(src, smaller_big_integer, 19) >= 0)) {
    +        return number_type::unsigned_integer;
    +      }
    +    }
    +    return number_type::signed_integer;
    +  }
    +  // Hopefully, we have 'e' or 'E' or '.'.
    +  return number_type::floating_point_number;
    +}
    +
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src, const uint8_t * const src_end) noexcept {
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  if(p == src_end) { return NUMBER_ERROR; }
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely((p != src_end) && (*p == '.'))) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if ((p == src_end) || !parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = start_digits-src > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if ((p != src_end) && (*p == 'e' || *p == 'E')) {
    +    p++;
    +    if(p == src_end) { return NUMBER_ERROR; }
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while ((p != src_end) && parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if ((p != src_end) && jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), src_end, &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +} // unnamed namespace
    +#endif // SIMDJSON_SKIPNUMBERPARSING
    +
    +} // namespace numberparsing
    +
    +inline std::ostream& operator<<(std::ostream& out, number_type type) noexcept {
    +    switch (type) {
    +        case number_type::signed_integer: out << "integer in [-9223372036854775808,9223372036854775808)"; break;
    +        case number_type::unsigned_integer: out << "unsigned integer in [9223372036854775808,18446744073709551616)"; break;
    +        case number_type::floating_point_number: out << "floating-point number (binary64)"; break;
    +        default: SIMDJSON_UNREACHABLE();
    +    }
    +    return out;
    +}
    +
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_NUMBERPARSING_H
    +/* end file simdjson/generic/numberparsing.h for arm64 */
    +
    +/* including simdjson/generic/implementation_simdjson_result_base-inl.h for arm64: #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base-inl.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +
    +//
    +// internal::implementation_simdjson_result_base inline implementation
    +//
    +
    +template
    +simdjson_inline void implementation_simdjson_result_base::tie(T &value, error_code &error) && noexcept {
    +  error = this->second;
    +  if (!error) {
    +    value = std::forward>(*this).first;
    +  }
    +}
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::get(T &value) && noexcept {
    +  error_code error;
    +  std::forward>(*this).tie(value, error);
    +  return error;
    +}
    +
    +template
    +simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept {
    +  return this->second;
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::take_value() && noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::operator T&&() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline const T& implementation_simdjson_result_base::value_unsafe() const& noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value_unsafe() & noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value_unsafe() && noexcept {
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value, error_code error) noexcept
    +    : first{std::forward(value)}, second{error} {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(error_code error) noexcept
    +    : implementation_simdjson_result_base(T{}, error) {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value), SUCCESS) {}
    +
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +/* end file simdjson/generic/implementation_simdjson_result_base-inl.h for arm64 */
    +/* end file simdjson/generic/amalgamated.h for arm64 */
    +/* including simdjson/arm64/end.h: #include "simdjson/arm64/end.h" */
    +/* begin file simdjson/arm64/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT
    +/* undefining SIMDJSON_IMPLEMENTATION from "arm64" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/arm64/end.h */
    +
    +#endif // SIMDJSON_ARM64_H
    +/* end file simdjson/arm64.h */
    +/* including simdjson/arm64/implementation.h: #include  */
    +/* begin file simdjson/arm64/implementation.h */
    +#ifndef SIMDJSON_ARM64_IMPLEMENTATION_H
    +#define SIMDJSON_ARM64_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/instruction_set.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +
    +/**
    + * @private
    + */
    +class implementation final : public simdjson::implementation {
    +public:
    +  simdjson_inline implementation() : simdjson::implementation("arm64", "ARM NEON", internal::instruction_set::NEON) {}
    +  simdjson_warn_unused error_code create_dom_parser_implementation(
    +    size_t capacity,
    +    size_t max_length,
    +    std::unique_ptr& dst
    +  ) const noexcept final;
    +  simdjson_warn_unused error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept final;
    +  simdjson_warn_unused bool validate_utf8(const char *buf, size_t len) const noexcept final;
    +};
    +
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ARM64_IMPLEMENTATION_H
    +/* end file simdjson/arm64/implementation.h */
    +
    +/* including simdjson/arm64/begin.h: #include  */
    +/* begin file simdjson/arm64/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "arm64" */
    +#define SIMDJSON_IMPLEMENTATION arm64
    +/* including simdjson/arm64/base.h: #include "simdjson/arm64/base.h" */
    +/* begin file simdjson/arm64/base.h */
    +#ifndef SIMDJSON_ARM64_BASE_H
    +#define SIMDJSON_ARM64_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +/**
    + * Implementation for NEON (ARMv8).
    + */
    +namespace arm64 {
    +
    +class implementation;
    +
    +namespace {
    +namespace simd {
    +template  struct simd8;
    +template  struct simd8x64;
    +} // namespace simd
    +} // unnamed namespace
    +
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ARM64_BASE_H
    +/* end file simdjson/arm64/base.h */
    +/* including simdjson/arm64/intrinsics.h: #include "simdjson/arm64/intrinsics.h" */
    +/* begin file simdjson/arm64/intrinsics.h */
    +#ifndef SIMDJSON_ARM64_INTRINSICS_H
    +#define SIMDJSON_ARM64_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This should be the correct header whether
    +// you use visual studio or other compilers.
    +#include 
    +
    +static_assert(sizeof(uint8x16_t) <= simdjson::SIMDJSON_PADDING, "insufficient padding for arm64");
    +
    +#endif //  SIMDJSON_ARM64_INTRINSICS_H
    +/* end file simdjson/arm64/intrinsics.h */
    +/* including simdjson/arm64/bitmanipulation.h: #include "simdjson/arm64/bitmanipulation.h" */
    +/* begin file simdjson/arm64/bitmanipulation.h */
    +#ifndef SIMDJSON_ARM64_BITMANIPULATION_H
    +#define SIMDJSON_ARM64_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long ret;
    +  // Search the mask data from least significant bit (LSB)
    +  // to the most significant bit (MSB) for a set bit (1).
    +  _BitScanForward64(&ret, input_num);
    +  return (int)ret;
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return input_num & (input_num-1);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long leading_zero = 0;
    +  // Search the mask data from most significant bit (MSB)
    +  // to least significant bit (LSB) for a set bit (1).
    +  if (_BitScanReverse64(&leading_zero, input_num))
    +    return (int)(63 - leading_zero);
    +  else
    +    return 64;
    +#else
    +  return __builtin_clzll(input_num);
    +#endif// SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int count_ones(uint64_t input_num) {
    +   return vaddv_u8(vcnt_u8(vcreate_u8(input_num)));
    +}
    +
    +
    +#if defined(__GNUC__) // catches clang and gcc
    +/**
    + * ARM has a fast 64-bit "bit reversal function" that is handy. However,
    + * it is not generally available as an intrinsic function under Visual
    + * Studio (though this might be changing). Even under clang/gcc, we
    + * apparently need to invoke inline assembly.
    + */
    +/*
    + * We use SIMDJSON_PREFER_REVERSE_BITS as a hint that algorithms that
    + * work well with bit reversal may use it.
    + */
    +#define SIMDJSON_PREFER_REVERSE_BITS 1
    +
    +/* reverse the bits */
    +simdjson_inline uint64_t reverse_bits(uint64_t input_num) {
    +  uint64_t rev_bits;
    +  __asm("rbit %0, %1" : "=r"(rev_bits) : "r"(input_num));
    +  return rev_bits;
    +}
    +
    +/**
    + * Flips bit at index 63 - lz. Thus if you have 'leading_zeroes' leading zeroes,
    + * then this will set to zero the leading bit. It is possible for leading_zeroes to be
    + * greating or equal to 63 in which case we trigger undefined behavior, but the output
    + * of such undefined behavior is never used.
    + **/
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +simdjson_inline uint64_t zero_leading_bit(uint64_t rev_bits, int leading_zeroes) {
    +  return rev_bits ^ (uint64_t(0x8000000000000000) >> leading_zeroes);
    +}
    +
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *result) {
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +  *result = value1 + value2;
    +  return *result < value1;
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ARM64_BITMANIPULATION_H
    +/* end file simdjson/arm64/bitmanipulation.h */
    +/* including simdjson/arm64/bitmask.h: #include "simdjson/arm64/bitmask.h" */
    +/* begin file simdjson/arm64/bitmask.h */
    +#ifndef SIMDJSON_ARM64_BITMASK_H
    +#define SIMDJSON_ARM64_BITMASK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +
    +//
    +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered.
    +//
    +// For example, prefix_xor(00100100) == 00011100
    +//
    +simdjson_inline uint64_t prefix_xor(uint64_t bitmask) {
    +  /////////////
    +  // We could do this with PMULL, but it is apparently slow.
    +  //
    +  //#ifdef __ARM_FEATURE_CRYPTO // some ARM processors lack this extension
    +  //return vmull_p64(-1ULL, bitmask);
    +  //#else
    +  // Analysis by @sebpop:
    +  // When diffing the assembly for src/stage1_find_marks.cpp I see that the eors are all spread out
    +  // in between other vector code, so effectively the extra cycles of the sequence do not matter
    +  // because the GPR units are idle otherwise and the critical path is on the FP side.
    +  // Also the PMULL requires two extra fmovs: GPR->FP (3 cycles in N1, 5 cycles in A72 )
    +  // and FP->GPR (2 cycles on N1 and 5 cycles on A72.)
    +  ///////////
    +  bitmask ^= bitmask << 1;
    +  bitmask ^= bitmask << 2;
    +  bitmask ^= bitmask << 4;
    +  bitmask ^= bitmask << 8;
    +  bitmask ^= bitmask << 16;
    +  bitmask ^= bitmask << 32;
    +  return bitmask;
    +}
    +
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif
    +/* end file simdjson/arm64/bitmask.h */
    +/* including simdjson/arm64/numberparsing_defs.h: #include "simdjson/arm64/numberparsing_defs.h" */
    +/* begin file simdjson/arm64/numberparsing_defs.h */
    +#ifndef SIMDJSON_ARM64_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_ARM64_NUMBERPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +#if _M_ARM64
    +// __umulh requires intrin.h
    +#include 
    +#endif // _M_ARM64
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace numberparsing {
    +
    +// we don't have SSE, so let us use a scalar function
    +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  uint64_t val;
    +  std::memcpy(&val, chars, sizeof(uint64_t));
    +  val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8;
    +  val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16;
    +  return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32);
    +}
    +
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif // SIMDJSON_ARM64_NUMBERPARSING_DEFS_H
    +/* end file simdjson/arm64/numberparsing_defs.h */
    +/* including simdjson/arm64/simd.h: #include "simdjson/arm64/simd.h" */
    +/* begin file simdjson/arm64/simd.h */
    +#ifndef SIMDJSON_ARM64_SIMD_H
    +#define SIMDJSON_ARM64_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +namespace simd {
    +
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +namespace {
    +// Start of private section with Visual Studio workaround
    +
    +
    +#ifndef simdjson_make_uint8x16_t
    +#define simdjson_make_uint8x16_t(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, \
    +                             x13, x14, x15, x16)                                   \
    +   ([=]() {                                                                        \
    +     uint8_t array[16] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8,                    \
    +                                 x9, x10, x11, x12, x13, x14, x15, x16};           \
    +     return vld1q_u8(array);                                                       \
    +   }())
    +#endif
    +#ifndef simdjson_make_int8x16_t
    +#define simdjson_make_int8x16_t(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, \
    +                             x13, x14, x15, x16)                                  \
    +   ([=]() {                                                                       \
    +     int8_t array[16] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8,                    \
    +                                 x9, x10, x11, x12, x13, x14, x15, x16};          \
    +     return vld1q_s8(array);                                                      \
    +   }())
    +#endif
    +
    +#ifndef simdjson_make_uint8x8_t
    +#define simdjson_make_uint8x8_t(x1, x2, x3, x4, x5, x6, x7, x8)                \
    +   ([=]() {                                                                    \
    +     uint8_t array[8] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8};                \
    +     return vld1_u8(array);                                                    \
    +   }())
    +#endif
    +#ifndef simdjson_make_int8x8_t
    +#define simdjson_make_int8x8_t(x1, x2, x3, x4, x5, x6, x7, x8)                 \
    +   ([=]() {                                                                    \
    +     int8_t array[8] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8};                 \
    +     return vld1_s8(array);                                                    \
    +   }())
    +#endif
    +#ifndef simdjson_make_uint16x8_t
    +#define simdjson_make_uint16x8_t(x1, x2, x3, x4, x5, x6, x7, x8)               \
    +   ([=]() {                                                                    \
    +     uint16_t array[8] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8};               \
    +     return vld1q_u16(array);                                                  \
    +   }())
    +#endif
    +#ifndef simdjson_make_int16x8_t
    +#define simdjson_make_int16x8_t(x1, x2, x3, x4, x5, x6, x7, x8)                \
    +   ([=]() {                                                                    \
    +     int16_t array[8] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8};                \
    +     return vld1q_s16(array);                                                  \
    +   }())
    +#endif
    +
    +// End of private section with Visual Studio workaround
    +} // namespace
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +
    +
    +  template
    +  struct simd8;
    +
    +  //
    +  // Base class of simd8 and simd8, both of which use uint8x16_t internally.
    +  //
    +  template>
    +  struct base_u8 {
    +    uint8x16_t value;
    +    static const int SIZE = sizeof(value);
    +
    +    // Conversion from/to SIMD register
    +    simdjson_inline base_u8(const uint8x16_t _value) : value(_value) {}
    +    simdjson_inline operator const uint8x16_t&() const { return this->value; }
    +    simdjson_inline operator uint8x16_t&() { return this->value; }
    +
    +    // Bit operations
    +    simdjson_inline simd8 operator|(const simd8 other) const { return vorrq_u8(*this, other); }
    +    simdjson_inline simd8 operator&(const simd8 other) const { return vandq_u8(*this, other); }
    +    simdjson_inline simd8 operator^(const simd8 other) const { return veorq_u8(*this, other); }
    +    simdjson_inline simd8 bit_andnot(const simd8 other) const { return vbicq_u8(*this, other); }
    +    simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +    simdjson_inline simd8& operator|=(const simd8 other) { auto this_cast = static_cast*>(this); *this_cast = *this_cast | other; return *this_cast; }
    +    simdjson_inline simd8& operator&=(const simd8 other) { auto this_cast = static_cast*>(this); *this_cast = *this_cast & other; return *this_cast; }
    +    simdjson_inline simd8& operator^=(const simd8 other) { auto this_cast = static_cast*>(this); *this_cast = *this_cast ^ other; return *this_cast; }
    +
    +    friend simdjson_inline Mask operator==(const simd8 lhs, const simd8 rhs) { return vceqq_u8(lhs, rhs); }
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +      return vextq_u8(prev_chunk, *this, 16 - N);
    +    }
    +  };
    +
    +  // SIMD byte mask type (returned by things like eq and gt)
    +  template<>
    +  struct simd8: base_u8 {
    +    typedef uint16_t bitmask_t;
    +    typedef uint32_t bitmask2_t;
    +
    +    static simdjson_inline simd8 splat(bool _value) { return vmovq_n_u8(uint8_t(-(!!_value))); }
    +
    +    simdjson_inline simd8(const uint8x16_t _value) : base_u8(_value) {}
    +    // False constructor
    +    simdjson_inline simd8() : simd8(vdupq_n_u8(0)) {}
    +    // Splat constructor
    +    simdjson_inline simd8(bool _value) : simd8(splat(_value)) {}
    +
    +    // We return uint32_t instead of uint16_t because that seems to be more efficient for most
    +    // purposes (cutting it down to uint16_t costs performance in some compilers).
    +    simdjson_inline uint32_t to_bitmask() const {
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +      const uint8x16_t bit_mask =  simdjson_make_uint8x16_t(0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
    +                                                   0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80);
    +#else
    +      const uint8x16_t bit_mask =  {0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
    +                                    0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80};
    +#endif
    +      auto minput = *this & bit_mask;
    +      uint8x16_t tmp = vpaddq_u8(minput, minput);
    +      tmp = vpaddq_u8(tmp, tmp);
    +      tmp = vpaddq_u8(tmp, tmp);
    +      return vgetq_lane_u16(vreinterpretq_u16_u8(tmp), 0);
    +    }
    +    simdjson_inline bool any() const { return vmaxvq_u8(*this) != 0; }
    +  };
    +
    +  // Unsigned bytes
    +  template<>
    +  struct simd8: base_u8 {
    +    static simdjson_inline uint8x16_t splat(uint8_t _value) { return vmovq_n_u8(_value); }
    +    static simdjson_inline uint8x16_t zero() { return vdupq_n_u8(0); }
    +    static simdjson_inline uint8x16_t load(const uint8_t* values) { return vld1q_u8(values); }
    +
    +    simdjson_inline simd8(const uint8x16_t _value) : base_u8(_value) {}
    +    // Zero constructor
    +    simdjson_inline simd8() : simd8(zero()) {}
    +    // Array constructor
    +    simdjson_inline simd8(const uint8_t values[16]) : simd8(load(values)) {}
    +    // Splat constructor
    +    simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +    // Member-by-member initialization
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) : simd8(simdjson_make_uint8x16_t(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +#else
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) : simd8(uint8x16_t{
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    }) {}
    +#endif
    +
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Store to array
    +    simdjson_inline void store(uint8_t dst[16]) const { return vst1q_u8(dst, *this); }
    +
    +    // Saturated math
    +    simdjson_inline simd8 saturating_add(const simd8 other) const { return vqaddq_u8(*this, other); }
    +    simdjson_inline simd8 saturating_sub(const simd8 other) const { return vqsubq_u8(*this, other); }
    +
    +    // Addition/subtraction are the same for signed and unsigned
    +    simdjson_inline simd8 operator+(const simd8 other) const { return vaddq_u8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return vsubq_u8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *this; }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *this; }
    +
    +    // Order-specific operations
    +    simdjson_inline uint8_t max_val() const { return vmaxvq_u8(*this); }
    +    simdjson_inline uint8_t min_val() const { return vminvq_u8(*this); }
    +    simdjson_inline simd8 max_val(const simd8 other) const { return vmaxq_u8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return vminq_u8(*this, other); }
    +    simdjson_inline simd8 operator<=(const simd8 other) const { return vcleq_u8(*this, other); }
    +    simdjson_inline simd8 operator>=(const simd8 other) const { return vcgeq_u8(*this, other); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return vcltq_u8(*this, other); }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return vcgtq_u8(*this, other); }
    +    // Same as >, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. For ARM, returns all 1's.
    +    simdjson_inline simd8 gt_bits(const simd8 other) const { return simd8(*this > other); }
    +    // Same as <, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. For ARM, returns all 1's.
    +    simdjson_inline simd8 lt_bits(const simd8 other) const { return simd8(*this < other); }
    +
    +    // Bit-specific operations
    +    simdjson_inline simd8 any_bits_set(simd8 bits) const { return vtstq_u8(*this, bits); }
    +    simdjson_inline bool any_bits_set_anywhere() const { return this->max_val() != 0; }
    +    simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return (*this & bits).any_bits_set_anywhere(); }
    +    template
    +    simdjson_inline simd8 shr() const { return vshrq_n_u8(*this, N); }
    +    template
    +    simdjson_inline simd8 shl() const { return vshlq_n_u8(*this, N); }
    +
    +    // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values)
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return lookup_table.apply_lookup_16_to(*this);
    +    }
    +
    +
    +    // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset).
    +    // Passing a 0 value for mask would be equivalent to writing out every byte to output.
    +    // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes
    +    // get written.
    +    // Design consideration: it seems like a function with the
    +    // signature simd8 compress(uint16_t mask) would be
    +    // sensible, but the AVX ISA makes this kind of approach difficult.
    +    template
    +    simdjson_inline void compress(uint16_t mask, L * output) const {
    +      using internal::thintable_epi8;
    +      using internal::BitsSetTable256mul2;
    +      using internal::pshufb_combine_table;
    +      // this particular implementation was inspired by work done by @animetosho
    +      // we do it in two steps, first 8 bytes and then second 8 bytes
    +      uint8_t mask1 = uint8_t(mask); // least significant 8 bits
    +      uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
    +      // next line just loads the 64-bit values thintable_epi8[mask1] and
    +      // thintable_epi8[mask2] into a 128-bit register, using only
    +      // two instructions on most compilers.
    +      uint64x2_t shufmask64 = {thintable_epi8[mask1], thintable_epi8[mask2]};
    +      uint8x16_t shufmask = vreinterpretq_u8_u64(shufmask64);
    +      // we increment by 0x08 the second half of the mask
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +      uint8x16_t inc = simdjson_make_uint8x16_t(0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08);
    +#else
    +      uint8x16_t inc = {0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08};
    +#endif
    +      shufmask = vaddq_u8(shufmask, inc);
    +      // this is the version "nearly pruned"
    +      uint8x16_t pruned = vqtbl1q_u8(*this, shufmask);
    +      // we still need to put the two halves together.
    +      // we compute the popcount of the first half:
    +      int pop1 = BitsSetTable256mul2[mask1];
    +      // then load the corresponding mask, what it does is to write
    +      // only the first pop1 bytes from the first 8 bytes, and then
    +      // it fills in with the bytes from the second 8 bytes + some filling
    +      // at the end.
    +      uint8x16_t compactmask = vld1q_u8(reinterpret_cast(pshufb_combine_table + pop1 * 8));
    +      uint8x16_t answer = vqtbl1q_u8(pruned, compactmask);
    +      vst1q_u8(reinterpret_cast(output), answer);
    +    }
    +
    +    // Copies all bytes corresponding to a 0 in the low half of the mask (interpreted as a
    +    // bitset) to output1, then those corresponding to a 0 in the high half to output2.
    +    template
    +    simdjson_inline void compress_halves(uint16_t mask, L *output1, L *output2) const {
    +      using internal::thintable_epi8;
    +      uint8_t mask1 = uint8_t(mask); // least significant 8 bits
    +      uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
    +      uint8x8_t compactmask1 = vcreate_u8(thintable_epi8[mask1]);
    +      uint8x8_t compactmask2 = vcreate_u8(thintable_epi8[mask2]);
    +      // we increment by 0x08 the second half of the mask
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +      uint8x8_t inc = simdjson_make_uint8x8_t(0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08);
    +#else
    +      uint8x8_t inc = {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08};
    +#endif
    +      compactmask2 = vadd_u8(compactmask2, inc);
    +      // store each result (with the second store possibly overlapping the first)
    +      vst1_u8((uint8_t*)output1, vqtbl1_u8(*this, compactmask1));
    +      vst1_u8((uint8_t*)output2, vqtbl1_u8(*this, compactmask2));
    +    }
    +
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +
    +    template
    +    simdjson_inline simd8 apply_lookup_16_to(const simd8 original) {
    +      return vqtbl1q_u8(*this, simd8(original));
    +    }
    +  };
    +
    +  // Signed bytes
    +  template<>
    +  struct simd8 {
    +    int8x16_t value;
    +
    +    static simdjson_inline simd8 splat(int8_t _value) { return vmovq_n_s8(_value); }
    +    static simdjson_inline simd8 zero() { return vdupq_n_s8(0); }
    +    static simdjson_inline simd8 load(const int8_t values[16]) { return vld1q_s8(values); }
    +
    +    // Conversion from/to SIMD register
    +    simdjson_inline simd8(const int8x16_t _value) : value{_value} {}
    +    simdjson_inline operator const int8x16_t&() const { return this->value; }
    +    simdjson_inline operator int8x16_t&() { return this->value; }
    +
    +    // Zero constructor
    +    simdjson_inline simd8() : simd8(zero()) {}
    +    // Splat constructor
    +    simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const int8_t* values) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3, int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) : simd8(simdjson_make_int8x16_t(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +#else
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3, int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) : simd8(int8x16_t{
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    }) {}
    +#endif
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Store to array
    +    simdjson_inline void store(int8_t dst[16]) const { return vst1q_s8(dst, *this); }
    +
    +    // Explicit conversion to/from unsigned
    +    //
    +    // Under Visual Studio/ARM64 uint8x16_t and int8x16_t are apparently the same type.
    +    // In theory, we could check this occurrence with std::same_as and std::enabled_if but it is C++14
    +    // and relatively ugly and hard to read.
    +#ifndef SIMDJSON_REGULAR_VISUAL_STUDIO
    +    simdjson_inline explicit simd8(const uint8x16_t other): simd8(vreinterpretq_s8_u8(other)) {}
    +#endif
    +    simdjson_inline explicit operator simd8() const { return vreinterpretq_u8_s8(this->value); }
    +
    +    // Math
    +    simdjson_inline simd8 operator+(const simd8 other) const { return vaddq_s8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return vsubq_s8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *this; }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *this; }
    +
    +    // Order-sensitive comparisons
    +    simdjson_inline simd8 max_val(const simd8 other) const { return vmaxq_s8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return vminq_s8(*this, other); }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return vcgtq_s8(*this, other); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return vcltq_s8(*this, other); }
    +    simdjson_inline simd8 operator==(const simd8 other) const { return vceqq_s8(*this, other); }
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +      return vextq_s8(prev_chunk, *this, 16 - N);
    +    }
    +
    +    // Perform a lookup assuming no value is larger than 16
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return lookup_table.apply_lookup_16_to(*this);
    +    }
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +
    +    template
    +    simdjson_inline simd8 apply_lookup_16_to(const simd8 original) {
    +      return vqtbl1q_s8(*this, simd8(original));
    +    }
    +  };
    +
    +  template
    +  struct simd8x64 {
    +    static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +    static_assert(NUM_CHUNKS == 4, "ARM kernel should use four registers per 64-byte block.");
    +    const simd8 chunks[NUM_CHUNKS];
    +
    +    simd8x64(const simd8x64& o) = delete; // no copy allowed
    +    simd8x64& operator=(const simd8& other) = delete; // no assignment allowed
    +    simd8x64() = delete; // no default constructor allowed
    +
    +    simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1, const simd8 chunk2, const simd8 chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {}
    +    simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8::load(ptr), simd8::load(ptr+16), simd8::load(ptr+32), simd8::load(ptr+48)} {}
    +
    +    simdjson_inline void store(T ptr[64]) const {
    +      this->chunks[0].store(ptr+sizeof(simd8)*0);
    +      this->chunks[1].store(ptr+sizeof(simd8)*1);
    +      this->chunks[2].store(ptr+sizeof(simd8)*2);
    +      this->chunks[3].store(ptr+sizeof(simd8)*3);
    +    }
    +
    +    simdjson_inline simd8 reduce_or() const {
    +      return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]);
    +    }
    +
    +
    +    simdjson_inline uint64_t compress(uint64_t mask, T * output) const {
    +      uint64_t popcounts = vget_lane_u64(vreinterpret_u64_u8(vcnt_u8(vcreate_u8(~mask))), 0);
    +      // compute the prefix sum of the popcounts of each byte
    +      uint64_t offsets = popcounts * 0x0101010101010101;
    +      this->chunks[0].compress_halves(uint16_t(mask), output, &output[popcounts & 0xFF]);
    +      this->chunks[1].compress_halves(uint16_t(mask >> 16), &output[(offsets >> 8) & 0xFF], &output[(offsets >> 16) & 0xFF]);
    +      this->chunks[2].compress_halves(uint16_t(mask >> 32), &output[(offsets >> 24) & 0xFF], &output[(offsets >> 32) & 0xFF]);
    +      this->chunks[3].compress_halves(uint16_t(mask >> 48), &output[(offsets >> 40) & 0xFF], &output[(offsets >> 48) & 0xFF]);
    +      return offsets >> 56;
    +    }
    +
    +    simdjson_inline uint64_t to_bitmask() const {
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +      const uint8x16_t bit_mask = simdjson_make_uint8x16_t(
    +        0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
    +        0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80
    +      );
    +#else
    +      const uint8x16_t bit_mask = {
    +        0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
    +        0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80
    +      };
    +#endif
    +      // Add each of the elements next to each other, successively, to stuff each 8 byte mask into one.
    +      uint8x16_t sum0 = vpaddq_u8(this->chunks[0] & bit_mask, this->chunks[1] & bit_mask);
    +      uint8x16_t sum1 = vpaddq_u8(this->chunks[2] & bit_mask, this->chunks[3] & bit_mask);
    +      sum0 = vpaddq_u8(sum0, sum1);
    +      sum0 = vpaddq_u8(sum0, sum0);
    +      return vgetq_lane_u64(vreinterpretq_u64_u8(sum0), 0);
    +    }
    +
    +    simdjson_inline uint64_t eq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] == mask,
    +        this->chunks[1] == mask,
    +        this->chunks[2] == mask,
    +        this->chunks[3] == mask
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t lteq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] <= mask,
    +        this->chunks[1] <= mask,
    +        this->chunks[2] <= mask,
    +        this->chunks[3] <= mask
    +      ).to_bitmask();
    +    }
    +  }; // struct simd8x64
    +
    +} // namespace simd
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ARM64_SIMD_H
    +/* end file simdjson/arm64/simd.h */
    +/* including simdjson/arm64/stringparsing_defs.h: #include "simdjson/arm64/stringparsing_defs.h" */
    +/* begin file simdjson/arm64/stringparsing_defs.h */
    +#ifndef SIMDJSON_ARM64_STRINGPARSING_DEFS_H
    +#define SIMDJSON_ARM64_STRINGPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/simd.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +
    +using namespace simd;
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 32;
    +  simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; }
    +  simdjson_inline bool has_backslash() { return bs_bits != 0; }
    +  simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); }
    +  simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); }
    +
    +  uint32_t bs_bits;
    +  uint32_t quote_bits;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // this can read up to 31 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes");
    +  simd8 v0(src);
    +  simd8 v1(src + sizeof(v0));
    +  v0.store(dst);
    +  v1.store(dst + sizeof(v0));
    +
    +  // Getting a 64-bit bitmask is much cheaper than multiple 16-bit bitmasks on ARM; therefore, we
    +  // smash them together into a 64-byte mask and get the bitmask from there.
    +  uint64_t bs_and_quote = simd8x64(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask();
    +  return {
    +    uint32_t(bs_and_quote),      // bs_bits
    +    uint32_t(bs_and_quote >> 32) // quote_bits
    +  };
    +}
    +
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ARM64_STRINGPARSING_DEFS_H
    +/* end file simdjson/arm64/stringparsing_defs.h */
    +
    +#define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1
    +/* end file simdjson/arm64/begin.h */
    +/* including generic/amalgamated.h for arm64: #include  */
    +/* begin file generic/amalgamated.h for arm64 */
    +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_SRC_GENERIC_DEPENDENCIES_H)
    +#error generic/dependencies.h must be included before generic/amalgamated.h!
    +#endif
    +
    +/* including generic/base.h for arm64: #include  */
    +/* begin file generic/base.h for arm64 */
    +#ifndef SIMDJSON_SRC_GENERIC_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_BASE_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +
    +struct json_character_block;
    +
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_BASE_H
    +/* end file generic/base.h for arm64 */
    +/* including generic/dom_parser_implementation.h for arm64: #include  */
    +/* begin file generic/dom_parser_implementation.h for arm64 */
    +#ifndef SIMDJSON_SRC_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_DOM_PARSER_IMPLEMENTATION_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// Interface a dom parser implementation must fulfill
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +
    +simdjson_inline simd8 must_be_2_3_continuation(const simd8 prev2, const simd8 prev3);
    +simdjson_inline bool is_ascii(const simd8x64& input);
    +
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +/* end file generic/dom_parser_implementation.h for arm64 */
    +/* including generic/json_character_block.h for arm64: #include  */
    +/* begin file generic/json_character_block.h for arm64 */
    +#ifndef SIMDJSON_SRC_GENERIC_JSON_CHARACTER_BLOCK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_JSON_CHARACTER_BLOCK_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +
    +struct json_character_block {
    +  static simdjson_inline json_character_block classify(const simd::simd8x64& in);
    +
    +  simdjson_inline uint64_t whitespace() const noexcept { return _whitespace; }
    +  simdjson_inline uint64_t op() const noexcept { return _op; }
    +  simdjson_inline uint64_t scalar() const noexcept { return ~(op() | whitespace()); }
    +
    +  uint64_t _whitespace;
    +  uint64_t _op;
    +};
    +
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_JSON_CHARACTER_BLOCK_H
    +/* end file generic/json_character_block.h for arm64 */
    +/* end file generic/amalgamated.h for arm64 */
    +/* including generic/stage1/amalgamated.h for arm64: #include  */
    +/* begin file generic/stage1/amalgamated.h for arm64 */
    +// Stuff other things depend on
    +/* including generic/stage1/base.h for arm64: #include  */
    +/* begin file generic/stage1/base.h for arm64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_BASE_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +namespace stage1 {
    +
    +class bit_indexer;
    +template
    +struct buf_block_reader;
    +struct json_block;
    +class json_minifier;
    +class json_scanner;
    +struct json_string_block;
    +class json_string_scanner;
    +class json_structural_indexer;
    +
    +} // namespace stage1
    +
    +namespace utf8_validation {
    +struct utf8_checker;
    +} // namespace utf8_validation
    +
    +using utf8_validation::utf8_checker;
    +
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_BASE_H
    +/* end file generic/stage1/base.h for arm64 */
    +/* including generic/stage1/buf_block_reader.h for arm64: #include  */
    +/* begin file generic/stage1/buf_block_reader.h for arm64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_BUF_BLOCK_READER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_BUF_BLOCK_READER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +namespace stage1 {
    +
    +// Walks through a buffer in block-sized increments, loading the last part with spaces
    +template
    +struct buf_block_reader {
    +public:
    +  simdjson_inline buf_block_reader(const uint8_t *_buf, size_t _len);
    +  simdjson_inline size_t block_index();
    +  simdjson_inline bool has_full_block() const;
    +  simdjson_inline const uint8_t *full_block() const;
    +  /**
    +   * Get the last block, padded with spaces.
    +   *
    +   * There will always be a last block, with at least 1 byte, unless len == 0 (in which case this
    +   * function fills the buffer with spaces and returns 0. In particular, if len == STEP_SIZE there
    +   * will be 0 full_blocks and 1 remainder block with STEP_SIZE bytes and no spaces for padding.
    +   *
    +   * @return the number of effective characters in the last block.
    +   */
    +  simdjson_inline size_t get_remainder(uint8_t *dst) const;
    +  simdjson_inline void advance();
    +private:
    +  const uint8_t *buf;
    +  const size_t len;
    +  const size_t lenminusstep;
    +  size_t idx;
    +};
    +
    +// Routines to print masks and text for debugging bitmask operations
    +simdjson_unused static char * format_input_text_64(const uint8_t *text) {
    +  static char buf[sizeof(simd8x64) + 1];
    +  for (size_t i=0; i); i++) {
    +    buf[i] = int8_t(text[i]) < ' ' ? '_' : int8_t(text[i]);
    +  }
    +  buf[sizeof(simd8x64)] = '\0';
    +  return buf;
    +}
    +
    +// Routines to print masks and text for debugging bitmask operations
    +simdjson_unused static char * format_input_text(const simd8x64& in) {
    +  static char buf[sizeof(simd8x64) + 1];
    +  in.store(reinterpret_cast(buf));
    +  for (size_t i=0; i); i++) {
    +    if (buf[i] < ' ') { buf[i] = '_'; }
    +  }
    +  buf[sizeof(simd8x64)] = '\0';
    +  return buf;
    +}
    +
    +simdjson_unused static char * format_input_text(const simd8x64& in, uint64_t mask) {
    +  static char buf[sizeof(simd8x64) + 1];
    +  in.store(reinterpret_cast(buf));
    +  for (size_t i=0; i); i++) {
    +    if (buf[i] <= ' ') { buf[i] = '_'; }
    +    if (!(mask & (size_t(1) << i))) { buf[i] = ' '; }
    +  }
    +  buf[sizeof(simd8x64)] = '\0';
    +  return buf;
    +}
    +
    +simdjson_unused static char * format_mask(uint64_t mask) {
    +  static char buf[sizeof(simd8x64) + 1];
    +  for (size_t i=0; i<64; i++) {
    +    buf[i] = (mask & (size_t(1) << i)) ? 'X' : ' ';
    +  }
    +  buf[64] = '\0';
    +  return buf;
    +}
    +
    +template
    +simdjson_inline buf_block_reader::buf_block_reader(const uint8_t *_buf, size_t _len) : buf{_buf}, len{_len}, lenminusstep{len < STEP_SIZE ? 0 : len - STEP_SIZE}, idx{0} {}
    +
    +template
    +simdjson_inline size_t buf_block_reader::block_index() { return idx; }
    +
    +template
    +simdjson_inline bool buf_block_reader::has_full_block() const {
    +  return idx < lenminusstep;
    +}
    +
    +template
    +simdjson_inline const uint8_t *buf_block_reader::full_block() const {
    +  return &buf[idx];
    +}
    +
    +template
    +simdjson_inline size_t buf_block_reader::get_remainder(uint8_t *dst) const {
    +  if(len == idx) { return 0; } // memcpy(dst, null, 0) will trigger an error with some sanitizers
    +  std::memset(dst, 0x20, STEP_SIZE); // std::memset STEP_SIZE because it's more efficient to write out 8 or 16 bytes at once.
    +  std::memcpy(dst, buf + idx, len - idx);
    +  return len - idx;
    +}
    +
    +template
    +simdjson_inline void buf_block_reader::advance() {
    +  idx += STEP_SIZE;
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_BUF_BLOCK_READER_H
    +/* end file generic/stage1/buf_block_reader.h for arm64 */
    +/* including generic/stage1/json_escape_scanner.h for arm64: #include  */
    +/* begin file generic/stage1/json_escape_scanner.h for arm64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_ESCAPE_SCANNER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_ESCAPE_SCANNER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +namespace stage1 {
    +
    +/**
    + * Scans for escape characters in JSON, taking care with multiple backslashes (\\n vs. \n).
    + */
    +struct json_escape_scanner {
    +  /** The actual escape characters (the backslashes themselves). */
    +  uint64_t next_is_escaped = 0ULL;
    +
    +  struct escaped_and_escape {
    +    /**
    +     * Mask of escaped characters.
    +     *
    +     * ```
    +     * \n \\n \\\n \\\\n \
    +     * 0100100010100101000
    +     *  n  \   \ n  \ \
    +     * ```
    +     */
    +    uint64_t escaped;
    +    /**
    +     * Mask of escape characters.
    +     *
    +     * ```
    +     * \n \\n \\\n \\\\n \
    +     * 1001000101001010001
    +     * \  \   \ \  \ \   \
    +     * ```
    +     */
    +    uint64_t escape;
    +  };
    +
    +  /**
    +   * Get a mask of both escape and escaped characters (the characters following a backslash).
    +   *
    +   * @param potential_escape A mask of the character that can escape others (but could be
    +   *        escaped itself). e.g. block.eq('\\')
    +   */
    +  simdjson_really_inline escaped_and_escape next(uint64_t backslash) noexcept {
    +
    +#if !SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT
    +    if (!backslash) { return {next_escaped_without_backslashes(), 0}; }
    +#endif
    +
    +    // |                                | Mask (shows characters instead of 1's) | Depth | Instructions        |
    +    // |--------------------------------|----------------------------------------|-------|---------------------|
    +    // | string                         | `\\n_\\\n___\\\n___\\\\___\\\\__\\\`   |       |                     |
    +    // |                                | `    even   odd    even   odd   odd`   |       |                     |
    +    // | potential_escape               | ` \  \\\    \\\    \\\\   \\\\  \\\`   | 1     | 1 (backslash & ~first_is_escaped)
    +    // | escape_and_terminal_code       | ` \n \ \n   \ \n   \ \    \ \   \ \`   | 5     | 5 (next_escape_and_terminal_code())
    +    // | escaped                        | `\    \ n    \ n    \ \    \ \   \ ` X | 6     | 7 (escape_and_terminal_code ^ (potential_escape | first_is_escaped))
    +    // | escape                         | `    \ \    \ \    \ \    \ \   \ \`   | 6     | 8 (escape_and_terminal_code & backslash)
    +    // | first_is_escaped               | `\                                 `   | 7 (*) | 9 (escape >> 63) ()
    +    //                                                                               (*) this is not needed until the next iteration
    +    uint64_t escape_and_terminal_code = next_escape_and_terminal_code(backslash & ~this->next_is_escaped);
    +    uint64_t escaped = escape_and_terminal_code ^ (backslash | this->next_is_escaped);
    +    uint64_t escape = escape_and_terminal_code & backslash;
    +    this->next_is_escaped = escape >> 63;
    +    return {escaped, escape};
    +  }
    +
    +private:
    +  static constexpr const uint64_t ODD_BITS = 0xAAAAAAAAAAAAAAAAULL;
    +
    +  simdjson_really_inline uint64_t next_escaped_without_backslashes() noexcept {
    +    uint64_t escaped = this->next_is_escaped;
    +    this->next_is_escaped = 0;
    +    return escaped;
    +  }
    +
    +  /**
    +   * Returns a mask of the next escape characters (masking out escaped backslashes), along with
    +   * any non-backslash escape codes.
    +   *
    +   * \n \\n \\\n \\\\n returns:
    +   * \n \   \ \n \ \
    +   * 11 100 1011 10100
    +   *
    +   * You are expected to mask out the first bit yourself if the previous block had a trailing
    +   * escape.
    +   *
    +   * & the result with potential_escape to get just the escape characters.
    +   * ^ the result with (potential_escape | first_is_escaped) to get escaped characters.
    +   */
    +  static simdjson_really_inline uint64_t next_escape_and_terminal_code(uint64_t potential_escape) noexcept {
    +    // If we were to just shift and mask out any odd bits, we'd actually get a *half* right answer:
    +    // any even-aligned backslash runs would be correct! Odd-aligned backslash runs would be
    +    // inverted (\\\ would be 010 instead of 101).
    +    //
    +    // ```
    +    // string:              | ____\\\\_\\\\_____ |
    +    // maybe_escaped | ODD  |     \ \   \ \      |
    +    //               even-aligned ^^^  ^^^^ odd-aligned
    +    // ```
    +    //
    +    // Taking that into account, our basic strategy is:
    +    //
    +    // 1. Use subtraction to produce a mask with 1's for even-aligned runs and 0's for
    +    //    odd-aligned runs.
    +    // 2. XOR all odd bits, which masks out the odd bits in even-aligned runs, and brings IN the
    +    //    odd bits in odd-aligned runs.
    +    // 3. & with backslash to clean up any stray bits.
    +    // runs are set to 0, and then XORing with "odd":
    +    //
    +    // |                                | Mask (shows characters instead of 1's) | Instructions        |
    +    // |--------------------------------|----------------------------------------|---------------------|
    +    // | string                         | `\\n_\\\n___\\\n___\\\\___\\\\__\\\`   |
    +    // |                                | `    even   odd    even   odd   odd`   |
    +    // | maybe_escaped                  | `  n  \\n    \\n    \\\_   \\\_  \\` X | 1 (potential_escape << 1)
    +    // | maybe_escaped_and_odd          | ` \n_ \\n _ \\\n_ _ \\\__ _\\\_ \\\`   | 1 (maybe_escaped | odd)
    +    // | even_series_codes_and_odd      | `  n_\\\  _    n_ _\\\\ _     _    `   | 1 (maybe_escaped_and_odd - potential_escape)
    +    // | escape_and_terminal_code       | ` \n \ \n   \ \n   \ \    \ \   \ \`   | 1 (^ odd)
    +    //
    +
    +    // Escaped characters are characters following an escape.
    +    uint64_t maybe_escaped = potential_escape << 1;
    +
    +    // To distinguish odd from even escape sequences, therefore, we turn on any *starting*
    +    // escapes that are on an odd byte. (We actually bring in all odd bits, for speed.)
    +    // - Odd runs of backslashes are 0000, and the code at the end ("n" in \n or \\n) is 1.
    +    // - Odd runs of backslashes are 1111, and the code at the end ("n" in \n or \\n) is 0.
    +    // - All other odd bytes are 1, and even bytes are 0.
    +    uint64_t maybe_escaped_and_odd_bits     = maybe_escaped | ODD_BITS;
    +    uint64_t even_series_codes_and_odd_bits = maybe_escaped_and_odd_bits - potential_escape;
    +
    +    // Now we flip all odd bytes back with xor. This:
    +    // - Makes odd runs of backslashes go from 0000 to 1010
    +    // - Makes even runs of backslashes go from 1111 to 1010
    +    // - Sets actually-escaped codes to 1 (the n in \n and \\n: \n = 11, \\n = 100)
    +    // - Resets all other bytes to 0
    +    return even_series_codes_and_odd_bits ^ ODD_BITS;
    +  }
    +};
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H
    +/* end file generic/stage1/json_escape_scanner.h for arm64 */
    +/* including generic/stage1/json_string_scanner.h for arm64: #include  */
    +/* begin file generic/stage1/json_string_scanner.h for arm64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +namespace stage1 {
    +
    +struct json_string_block {
    +  // We spell out the constructors in the hope of resolving inlining issues with Visual Studio 2017
    +  simdjson_really_inline json_string_block(uint64_t escaped, uint64_t quote, uint64_t in_string) :
    +  _escaped(escaped), _quote(quote), _in_string(in_string) {}
    +
    +  // Escaped characters (characters following an escape() character)
    +  simdjson_really_inline uint64_t escaped() const { return _escaped; }
    +  // Real (non-backslashed) quotes
    +  simdjson_really_inline uint64_t quote() const { return _quote; }
    +  // Only characters inside the string (not including the quotes)
    +  simdjson_really_inline uint64_t string_content() const { return _in_string & ~_quote; }
    +  // Return a mask of whether the given characters are inside a string (only works on non-quotes)
    +  simdjson_really_inline uint64_t non_quote_inside_string(uint64_t mask) const { return mask & _in_string; }
    +  // Return a mask of whether the given characters are inside a string (only works on non-quotes)
    +  simdjson_really_inline uint64_t non_quote_outside_string(uint64_t mask) const { return mask & ~_in_string; }
    +  // Tail of string (everything except the start quote)
    +  simdjson_really_inline uint64_t string_tail() const { return _in_string ^ _quote; }
    +
    +  // escaped characters (backslashed--does not include the hex characters after \u)
    +  uint64_t _escaped;
    +  // real quotes (non-escaped ones)
    +  uint64_t _quote;
    +  // string characters (includes start quote but not end quote)
    +  uint64_t _in_string;
    +};
    +
    +// Scans blocks for string characters, storing the state necessary to do so
    +class json_string_scanner {
    +public:
    +  simdjson_really_inline json_string_block next(const simd::simd8x64& in);
    +  // Returns either UNCLOSED_STRING or SUCCESS
    +  simdjson_really_inline error_code finish();
    +
    +private:
    +  // Scans for escape characters
    +  json_escape_scanner escape_scanner{};
    +  // Whether the last iteration was still inside a string (all 1's = true, all 0's = false).
    +  uint64_t prev_in_string = 0ULL;
    +};
    +
    +//
    +// Return a mask of all string characters plus end quotes.
    +//
    +// prev_escaped is overflow saying whether the next character is escaped.
    +// prev_in_string is overflow saying whether we're still in a string.
    +//
    +// Backslash sequences outside of quotes will be detected in stage 2.
    +//
    +simdjson_really_inline json_string_block json_string_scanner::next(const simd::simd8x64& in) {
    +  const uint64_t backslash = in.eq('\\');
    +  const uint64_t escaped = escape_scanner.next(backslash).escaped;
    +  const uint64_t quote = in.eq('"') & ~escaped;
    +
    +  //
    +  // prefix_xor flips on bits inside the string (and flips off the end quote).
    +  //
    +  // Then we xor with prev_in_string: if we were in a string already, its effect is flipped
    +  // (characters inside strings are outside, and characters outside strings are inside).
    +  //
    +  const uint64_t in_string = prefix_xor(quote) ^ prev_in_string;
    +
    +  //
    +  // Check if we're still in a string at the end of the box so the next block will know
    +  //
    +  prev_in_string = uint64_t(static_cast(in_string) >> 63);
    +
    +  // Use ^ to turn the beginning quote off, and the end quote on.
    +
    +  // We are returning a function-local object so either we get a move constructor
    +  // or we get copy elision.
    +  return json_string_block(escaped, quote, in_string);
    +}
    +
    +simdjson_really_inline error_code json_string_scanner::finish() {
    +  if (prev_in_string) {
    +    return UNCLOSED_STRING;
    +  }
    +  return SUCCESS;
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H
    +/* end file generic/stage1/json_string_scanner.h for arm64 */
    +/* including generic/stage1/utf8_lookup4_algorithm.h for arm64: #include  */
    +/* begin file generic/stage1/utf8_lookup4_algorithm.h for arm64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_UTF8_LOOKUP4_ALGORITHM_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_UTF8_LOOKUP4_ALGORITHM_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +namespace utf8_validation {
    +
    +using namespace simd;
    +
    +  simdjson_inline simd8 check_special_cases(const simd8 input, const simd8 prev1) {
    +// Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII)
    +// Bit 1 = Too Long (ASCII followed by continuation)
    +// Bit 2 = Overlong 3-byte
    +// Bit 4 = Surrogate
    +// Bit 5 = Overlong 2-byte
    +// Bit 7 = Two Continuations
    +    constexpr const uint8_t TOO_SHORT   = 1<<0; // 11______ 0_______
    +                                                // 11______ 11______
    +    constexpr const uint8_t TOO_LONG    = 1<<1; // 0_______ 10______
    +    constexpr const uint8_t OVERLONG_3  = 1<<2; // 11100000 100_____
    +    constexpr const uint8_t SURROGATE   = 1<<4; // 11101101 101_____
    +    constexpr const uint8_t OVERLONG_2  = 1<<5; // 1100000_ 10______
    +    constexpr const uint8_t TWO_CONTS   = 1<<7; // 10______ 10______
    +    constexpr const uint8_t TOO_LARGE   = 1<<3; // 11110100 1001____
    +                                                // 11110100 101_____
    +                                                // 11110101 1001____
    +                                                // 11110101 101_____
    +                                                // 1111011_ 1001____
    +                                                // 1111011_ 101_____
    +                                                // 11111___ 1001____
    +                                                // 11111___ 101_____
    +    constexpr const uint8_t TOO_LARGE_1000 = 1<<6;
    +                                                // 11110101 1000____
    +                                                // 1111011_ 1000____
    +                                                // 11111___ 1000____
    +    constexpr const uint8_t OVERLONG_4  = 1<<6; // 11110000 1000____
    +
    +    const simd8 byte_1_high = prev1.shr<4>().lookup_16(
    +      // 0_______ ________ 
    +      TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG,
    +      TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG,
    +      // 10______ ________ 
    +      TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS,
    +      // 1100____ ________ 
    +      TOO_SHORT | OVERLONG_2,
    +      // 1101____ ________ 
    +      TOO_SHORT,
    +      // 1110____ ________ 
    +      TOO_SHORT | OVERLONG_3 | SURROGATE,
    +      // 1111____ ________ 
    +      TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4
    +    );
    +    constexpr const uint8_t CARRY = TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 .
    +    const simd8 byte_1_low = (prev1 & 0x0F).lookup_16(
    +      // ____0000 ________
    +      CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4,
    +      // ____0001 ________
    +      CARRY | OVERLONG_2,
    +      // ____001_ ________
    +      CARRY,
    +      CARRY,
    +
    +      // ____0100 ________
    +      CARRY | TOO_LARGE,
    +      // ____0101 ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      // ____011_ ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +
    +      // ____1___ ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      // ____1101 ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000
    +    );
    +    const simd8 byte_2_high = input.shr<4>().lookup_16(
    +      // ________ 0_______ 
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT,
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT,
    +
    +      // ________ 1000____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | OVERLONG_4,
    +      // ________ 1001____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE,
    +      // ________ 101_____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE  | TOO_LARGE,
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE  | TOO_LARGE,
    +
    +      // ________ 11______
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT
    +    );
    +    return (byte_1_high & byte_1_low & byte_2_high);
    +  }
    +  simdjson_inline simd8 check_multibyte_lengths(const simd8 input,
    +      const simd8 prev_input, const simd8 sc) {
    +    simd8 prev2 = input.prev<2>(prev_input);
    +    simd8 prev3 = input.prev<3>(prev_input);
    +    simd8 must23 = simd8(must_be_2_3_continuation(prev2, prev3));
    +    simd8 must23_80 = must23 & uint8_t(0x80);
    +    return must23_80 ^ sc;
    +  }
    +
    +  //
    +  // Return nonzero if there are incomplete multibyte characters at the end of the block:
    +  // e.g. if there is a 4-byte character, but it's 3 bytes from the end.
    +  //
    +  simdjson_inline simd8 is_incomplete(const simd8 input) {
    +    // If the previous input's last 3 bytes match this, they're too short (they ended at EOF):
    +    // ... 1111____ 111_____ 11______
    +#if SIMDJSON_IMPLEMENTATION_ICELAKE
    +    static const uint8_t max_array[64] = {
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 0xf0u-1, 0xe0u-1, 0xc0u-1
    +    };
    +#else
    +    static const uint8_t max_array[32] = {
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 0xf0u-1, 0xe0u-1, 0xc0u-1
    +    };
    +#endif
    +    const simd8 max_value(&max_array[sizeof(max_array)-sizeof(simd8)]);
    +    return input.gt_bits(max_value);
    +  }
    +
    +  struct utf8_checker {
    +    // If this is nonzero, there has been a UTF-8 error.
    +    simd8 error;
    +    // The last input we received
    +    simd8 prev_input_block;
    +    // Whether the last input we received was incomplete (used for ASCII fast path)
    +    simd8 prev_incomplete;
    +
    +    //
    +    // Check whether the current bytes are valid UTF-8.
    +    //
    +    simdjson_inline void check_utf8_bytes(const simd8 input, const simd8 prev_input) {
    +      // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ lead bytes
    +      // (2, 3, 4-byte leads become large positive numbers instead of small negative numbers)
    +      simd8 prev1 = input.prev<1>(prev_input);
    +      simd8 sc = check_special_cases(input, prev1);
    +      this->error |= check_multibyte_lengths(input, prev_input, sc);
    +    }
    +
    +    // The only problem that can happen at EOF is that a multibyte character is too short
    +    // or a byte value too large in the last bytes: check_special_cases only checks for bytes
    +    // too large in the first of two bytes.
    +    simdjson_inline void check_eof() {
    +      // If the previous block had incomplete UTF-8 characters at the end, an ASCII block can't
    +      // possibly finish them.
    +      this->error |= this->prev_incomplete;
    +    }
    +
    +    simdjson_inline void check_next_input(const simd8x64& input) {
    +      if(simdjson_likely(is_ascii(input))) {
    +        this->error |= this->prev_incomplete;
    +      } else {
    +        // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    +        static_assert((simd8x64::NUM_CHUNKS == 1)
    +                ||(simd8x64::NUM_CHUNKS == 2)
    +                || (simd8x64::NUM_CHUNKS == 4),
    +                "We support one, two or four chunks per 64-byte block.");
    +        SIMDJSON_IF_CONSTEXPR (simd8x64::NUM_CHUNKS == 1) {
    +          this->check_utf8_bytes(input.chunks[0], this->prev_input_block);
    +        } else SIMDJSON_IF_CONSTEXPR (simd8x64::NUM_CHUNKS == 2) {
    +          this->check_utf8_bytes(input.chunks[0], this->prev_input_block);
    +          this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +        } else SIMDJSON_IF_CONSTEXPR (simd8x64::NUM_CHUNKS == 4) {
    +          this->check_utf8_bytes(input.chunks[0], this->prev_input_block);
    +          this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +          this->check_utf8_bytes(input.chunks[2], input.chunks[1]);
    +          this->check_utf8_bytes(input.chunks[3], input.chunks[2]);
    +        }
    +        this->prev_incomplete = is_incomplete(input.chunks[simd8x64::NUM_CHUNKS-1]);
    +        this->prev_input_block = input.chunks[simd8x64::NUM_CHUNKS-1];
    +      }
    +    }
    +    // do not forget to call check_eof!
    +    simdjson_inline error_code errors() {
    +      return this->error.any_bits_set_anywhere() ? error_code::UTF8_ERROR : error_code::SUCCESS;
    +    }
    +
    +  }; // struct utf8_checker
    +} // namespace utf8_validation
    +
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_UTF8_LOOKUP4_ALGORITHM_H
    +/* end file generic/stage1/utf8_lookup4_algorithm.h for arm64 */
    +/* including generic/stage1/json_scanner.h for arm64: #include  */
    +/* begin file generic/stage1/json_scanner.h for arm64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_SCANNER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_SCANNER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +namespace stage1 {
    +
    +/**
    + * A block of scanned json, with information on operators and scalars.
    + *
    + * We seek to identify pseudo-structural characters. Anything that is inside
    + * a string must be omitted (hence  & ~_string.string_tail()).
    + * Otherwise, pseudo-structural characters come in two forms.
    + * 1. We have the structural characters ([,],{,},:, comma). The
    + *    term 'structural character' is from the JSON RFC.
    + * 2. We have the 'scalar pseudo-structural characters'.
    + *    Scalars are quotes, and any character except structural characters and white space.
    + *
    + * To identify the scalar pseudo-structural characters, we must look at what comes
    + * before them: it must be a space, a quote or a structural characters.
    + * Starting with simdjson v0.3, we identify them by
    + * negation: we identify everything that is followed by a non-quote scalar,
    + * and we negate that. Whatever remains must be a 'scalar pseudo-structural character'.
    + */
    +struct json_block {
    +public:
    +  // We spell out the constructors in the hope of resolving inlining issues with Visual Studio 2017
    +  simdjson_inline json_block(json_string_block&& string, json_character_block characters, uint64_t follows_potential_nonquote_scalar) :
    +  _string(std::move(string)), _characters(characters), _follows_potential_nonquote_scalar(follows_potential_nonquote_scalar) {}
    +  simdjson_inline json_block(json_string_block string, json_character_block characters, uint64_t follows_potential_nonquote_scalar) :
    +  _string(string), _characters(characters), _follows_potential_nonquote_scalar(follows_potential_nonquote_scalar) {}
    +
    +  /**
    +   * The start of structurals.
    +   * In simdjson prior to v0.3, these were called the pseudo-structural characters.
    +   **/
    +  simdjson_inline uint64_t structural_start() const noexcept { return potential_structural_start() & ~_string.string_tail(); }
    +  /** All JSON whitespace (i.e. not in a string) */
    +  simdjson_inline uint64_t whitespace() const noexcept { return non_quote_outside_string(_characters.whitespace()); }
    +
    +  // Helpers
    +
    +  /** Whether the given characters are inside a string (only works on non-quotes) */
    +  simdjson_inline uint64_t non_quote_inside_string(uint64_t mask) const noexcept { return _string.non_quote_inside_string(mask); }
    +  /** Whether the given characters are outside a string (only works on non-quotes) */
    +  simdjson_inline uint64_t non_quote_outside_string(uint64_t mask) const noexcept { return _string.non_quote_outside_string(mask); }
    +
    +  // string and escape characters
    +  json_string_block _string;
    +  // whitespace, structural characters ('operators'), scalars
    +  json_character_block _characters;
    +  // whether the previous character was a scalar
    +  uint64_t _follows_potential_nonquote_scalar;
    +private:
    +  // Potential structurals (i.e. disregarding strings)
    +
    +  /**
    +   * structural elements ([,],{,},:, comma) plus scalar starts like 123, true and "abc".
    +   * They may reside inside a string.
    +   **/
    +  simdjson_inline uint64_t potential_structural_start() const noexcept { return _characters.op() | potential_scalar_start(); }
    +  /**
    +   * The start of non-operator runs, like 123, true and "abc".
    +   * It main reside inside a string.
    +   **/
    +  simdjson_inline uint64_t potential_scalar_start() const noexcept {
    +    // The term "scalar" refers to anything except structural characters and white space
    +    // (so letters, numbers, quotes).
    +    // Whenever it is preceded by something that is not a structural element ({,},[,],:, ") nor a white-space
    +    // then we know that it is irrelevant structurally.
    +    return _characters.scalar() & ~follows_potential_scalar();
    +  }
    +  /**
    +   * Whether the given character is immediately after a non-operator like 123, true.
    +   * The characters following a quote are not included.
    +   */
    +  simdjson_inline uint64_t follows_potential_scalar() const noexcept {
    +    // _follows_potential_nonquote_scalar: is defined as marking any character that follows a character
    +    // that is not a structural element ({,},[,],:, comma) nor a quote (") and that is not a
    +    // white space.
    +    // It is understood that within quoted region, anything at all could be marked (irrelevant).
    +    return _follows_potential_nonquote_scalar;
    +  }
    +};
    +
    +/**
    + * Scans JSON for important bits: structural characters or 'operators', strings, and scalars.
    + *
    + * The scanner starts by calculating two distinct things:
    + * - string characters (taking \" into account)
    + * - structural characters or 'operators' ([]{},:, comma)
    + *   and scalars (runs of non-operators like 123, true and "abc")
    + *
    + * To minimize data dependency (a key component of the scanner's speed), it finds these in parallel:
    + * in particular, the operator/scalar bit will find plenty of things that are actually part of
    + * strings. When we're done, json_block will fuse the two together by masking out tokens that are
    + * part of a string.
    + */
    +class json_scanner {
    +public:
    +  json_scanner() = default;
    +  simdjson_inline json_block next(const simd::simd8x64& in);
    +  // Returns either UNCLOSED_STRING or SUCCESS
    +  simdjson_inline error_code finish();
    +
    +private:
    +  // Whether the last character of the previous iteration is part of a scalar token
    +  // (anything except whitespace or a structural character/'operator').
    +  uint64_t prev_scalar = 0ULL;
    +  json_string_scanner string_scanner{};
    +};
    +
    +
    +//
    +// Check if the current character immediately follows a matching character.
    +//
    +// For example, this checks for quotes with backslashes in front of them:
    +//
    +//     const uint64_t backslashed_quote = in.eq('"') & immediately_follows(in.eq('\'), prev_backslash);
    +//
    +simdjson_inline uint64_t follows(const uint64_t match, uint64_t &overflow) {
    +  const uint64_t result = match << 1 | overflow;
    +  overflow = match >> 63;
    +  return result;
    +}
    +
    +simdjson_inline json_block json_scanner::next(const simd::simd8x64& in) {
    +  json_string_block strings = string_scanner.next(in);
    +  // identifies the white-space and the structural characters
    +  json_character_block characters = json_character_block::classify(in);
    +  // The term "scalar" refers to anything except structural characters and white space
    +  // (so letters, numbers, quotes).
    +  // We want follows_scalar to mark anything that follows a non-quote scalar (so letters and numbers).
    +  //
    +  // A terminal quote should either be followed by a structural character (comma, brace, bracket, colon)
    +  // or nothing. However, we still want ' "a string"true ' to mark the 't' of 'true' as a potential
    +  // pseudo-structural character just like we would if we had  ' "a string" true '; otherwise we
    +  // may need to add an extra check when parsing strings.
    +  //
    +  // Performance: there are many ways to skin this cat.
    +  const uint64_t nonquote_scalar = characters.scalar() & ~strings.quote();
    +  uint64_t follows_nonquote_scalar = follows(nonquote_scalar, prev_scalar);
    +  // We are returning a function-local object so either we get a move constructor
    +  // or we get copy elision.
    +  return json_block(
    +    strings,// strings is a function-local object so either it moves or the copy is elided.
    +    characters,
    +    follows_nonquote_scalar
    +  );
    +}
    +
    +simdjson_inline error_code json_scanner::finish() {
    +  return string_scanner.finish();
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_SCANNER_H
    +/* end file generic/stage1/json_scanner.h for arm64 */
    +
    +// All other declarations
    +/* including generic/stage1/find_next_document_index.h for arm64: #include  */
    +/* begin file generic/stage1/find_next_document_index.h for arm64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +namespace stage1 {
    +
    +/**
    +  * This algorithm is used to quickly identify the last structural position that
    +  * makes up a complete document.
    +  *
    +  * It does this by going backwards and finding the last *document boundary* (a
    +  * place where one value follows another without a comma between them). If the
    +  * last document (the characters after the boundary) has an equal number of
    +  * start and end brackets, it is considered complete.
    +  *
    +  * Simply put, we iterate over the structural characters, starting from
    +  * the end. We consider that we found the end of a JSON document when the
    +  * first element of the pair is NOT one of these characters: '{' '[' ':' ','
    +  * and when the second element is NOT one of these characters: '}' ']' ':' ','.
    +  *
    +  * This simple comparison works most of the time, but it does not cover cases
    +  * where the batch's structural indexes contain a perfect amount of documents.
    +  * In such a case, we do not have access to the structural index which follows
    +  * the last document, therefore, we do not have access to the second element in
    +  * the pair, and that means we cannot identify the last document. To fix this
    +  * issue, we keep a count of the open and closed curly/square braces we found
    +  * while searching for the pair. When we find a pair AND the count of open and
    +  * closed curly/square braces is the same, we know that we just passed a
    +  * complete document, therefore the last json buffer location is the end of the
    +  * batch.
    +  */
    +simdjson_inline uint32_t find_next_document_index(dom_parser_implementation &parser) {
    +  // Variant: do not count separately, just figure out depth
    +  if(parser.n_structural_indexes == 0) { return 0; }
    +  auto arr_cnt = 0;
    +  auto obj_cnt = 0;
    +  for (auto i = parser.n_structural_indexes - 1; i > 0; i--) {
    +    auto idxb = parser.structural_indexes[i];
    +    switch (parser.buf[idxb]) {
    +    case ':':
    +    case ',':
    +      continue;
    +    case '}':
    +      obj_cnt--;
    +      continue;
    +    case ']':
    +      arr_cnt--;
    +      continue;
    +    case '{':
    +      obj_cnt++;
    +      break;
    +    case '[':
    +      arr_cnt++;
    +      break;
    +    }
    +    auto idxa = parser.structural_indexes[i - 1];
    +    switch (parser.buf[idxa]) {
    +    case '{':
    +    case '[':
    +    case ':':
    +    case ',':
    +      continue;
    +    }
    +    // Last document is complete, so the next document will appear after!
    +    if (!arr_cnt && !obj_cnt) {
    +      return parser.n_structural_indexes;
    +    }
    +    // Last document is incomplete; mark the document at i + 1 as the next one
    +    return i;
    +  }
    +  // If we made it to the end, we want to finish counting to see if we have a full document.
    +  switch (parser.buf[parser.structural_indexes[0]]) {
    +    case '}':
    +      obj_cnt--;
    +      break;
    +    case ']':
    +      arr_cnt--;
    +      break;
    +    case '{':
    +      obj_cnt++;
    +      break;
    +    case '[':
    +      arr_cnt++;
    +      break;
    +  }
    +  if (!arr_cnt && !obj_cnt) {
    +    // We have a complete document.
    +    return parser.n_structural_indexes;
    +  }
    +  return 0;
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H
    +/* end file generic/stage1/find_next_document_index.h for arm64 */
    +/* including generic/stage1/json_minifier.h for arm64: #include  */
    +/* begin file generic/stage1/json_minifier.h for arm64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_MINIFIER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_MINIFIER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This file contains the common code every implementation uses in stage1
    +// It is intended to be included multiple times and compiled multiple times
    +// We assume the file in which it is included already includes
    +// "simdjson/stage1.h" (this simplifies amalgation)
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +namespace stage1 {
    +
    +class json_minifier {
    +public:
    +  template
    +  static error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) noexcept;
    +
    +private:
    +  simdjson_inline json_minifier(uint8_t *_dst)
    +  : dst{_dst}
    +  {}
    +  template
    +  simdjson_inline void step(const uint8_t *block_buf, buf_block_reader &reader) noexcept;
    +  simdjson_inline void next(const simd::simd8x64& in, const json_block& block);
    +  simdjson_inline error_code finish(uint8_t *dst_start, size_t &dst_len);
    +  json_scanner scanner{};
    +  uint8_t *dst;
    +};
    +
    +simdjson_inline void json_minifier::next(const simd::simd8x64& in, const json_block& block) {
    +  uint64_t mask = block.whitespace();
    +  dst += in.compress(mask, dst);
    +}
    +
    +simdjson_inline error_code json_minifier::finish(uint8_t *dst_start, size_t &dst_len) {
    +  error_code error = scanner.finish();
    +  if (error) { dst_len = 0; return error; }
    +  dst_len = dst - dst_start;
    +  return SUCCESS;
    +}
    +
    +template<>
    +simdjson_inline void json_minifier::step<128>(const uint8_t *block_buf, buf_block_reader<128> &reader) noexcept {
    +  simd::simd8x64 in_1(block_buf);
    +  simd::simd8x64 in_2(block_buf+64);
    +  json_block block_1 = scanner.next(in_1);
    +  json_block block_2 = scanner.next(in_2);
    +  this->next(in_1, block_1);
    +  this->next(in_2, block_2);
    +  reader.advance();
    +}
    +
    +template<>
    +simdjson_inline void json_minifier::step<64>(const uint8_t *block_buf, buf_block_reader<64> &reader) noexcept {
    +  simd::simd8x64 in_1(block_buf);
    +  json_block block_1 = scanner.next(in_1);
    +  this->next(block_buf, block_1);
    +  reader.advance();
    +}
    +
    +template
    +error_code json_minifier::minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) noexcept {
    +  buf_block_reader reader(buf, len);
    +  json_minifier minifier(dst);
    +
    +  // Index the first n-1 blocks
    +  while (reader.has_full_block()) {
    +    minifier.step(reader.full_block(), reader);
    +  }
    +
    +  // Index the last (remainder) block, padded with spaces
    +  uint8_t block[STEP_SIZE];
    +  size_t remaining_bytes = reader.get_remainder(block);
    +  if (remaining_bytes > 0) {
    +    // We do not want to write directly to the output stream. Rather, we write
    +    // to a local buffer (for safety).
    +    uint8_t out_block[STEP_SIZE];
    +    uint8_t * const guarded_dst{minifier.dst};
    +    minifier.dst = out_block;
    +    minifier.step(block, reader);
    +    size_t to_write = minifier.dst - out_block;
    +    // In some cases, we could be enticed to consider the padded spaces
    +    // as part of the string. This is fine as long as we do not write more
    +    // than we consumed.
    +    if(to_write > remaining_bytes) { to_write = remaining_bytes; }
    +    memcpy(guarded_dst, out_block, to_write);
    +    minifier.dst = guarded_dst + to_write;
    +  }
    +  return minifier.finish(dst, dst_len);
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_MINIFIER_H
    +/* end file generic/stage1/json_minifier.h for arm64 */
    +/* including generic/stage1/json_structural_indexer.h for arm64: #include  */
    +/* begin file generic/stage1/json_structural_indexer.h for arm64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRUCTURAL_INDEXER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRUCTURAL_INDEXER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This file contains the common code every implementation uses in stage1
    +// It is intended to be included multiple times and compiled multiple times
    +// We assume the file in which it is included already includes
    +// "simdjson/stage1.h" (this simplifies amalgation)
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +namespace stage1 {
    +
    +class bit_indexer {
    +public:
    +  uint32_t *tail;
    +
    +  simdjson_inline bit_indexer(uint32_t *index_buf) : tail(index_buf) {}
    +
    +#if SIMDJSON_PREFER_REVERSE_BITS
    +  /**
    +    * ARM lacks a fast trailing zero instruction, but it has a fast
    +    * bit reversal instruction and a fast leading zero instruction.
    +    * Thus it may be profitable to reverse the bits (once) and then
    +    * to rely on a sequence of instructions that call the leading
    +    * zero instruction.
    +    *
    +    * Performance notes:
    +    * The chosen routine is not optimal in terms of data dependency
    +    * since zero_leading_bit might require two instructions. However,
    +    * it tends to minimize the total number of instructions which is
    +    * beneficial.
    +    */
    +  simdjson_inline void write_index(uint32_t idx, uint64_t& rev_bits, int i) {
    +    int lz = leading_zeroes(rev_bits);
    +    this->tail[i] = static_cast(idx) + lz;
    +    rev_bits = zero_leading_bit(rev_bits, lz);
    +  }
    +#else
    +  /**
    +    * Under recent x64 systems, we often have both a fast trailing zero
    +    * instruction and a fast 'clear-lower-bit' instruction so the following
    +    * algorithm can be competitive.
    +    */
    +
    +  simdjson_inline void write_index(uint32_t idx, uint64_t& bits, int i) {
    +    this->tail[i] = idx + trailing_zeroes(bits);
    +    bits = clear_lowest_bit(bits);
    +  }
    +#endif // SIMDJSON_PREFER_REVERSE_BITS
    +
    +  template 
    +  simdjson_inline int write_indexes(uint32_t idx, uint64_t& bits) {
    +    write_index(idx, bits, START);
    +    SIMDJSON_IF_CONSTEXPR (N > 1) {
    +      write_indexes<(N-1>0?START+1:START), (N-1>=0?N-1:1)>(idx, bits);
    +    }
    +    return START+N;
    +  }
    +
    +  template 
    +  simdjson_inline int write_indexes_stepped(uint32_t idx, uint64_t& bits, int cnt) {
    +    write_indexes(idx, bits);
    +    SIMDJSON_IF_CONSTEXPR ((START+STEP)  < END) {
    +      if (simdjson_unlikely((START+STEP) < cnt)) {
    +        write_indexes_stepped<(START+STEP(idx, bits, cnt);
    +      }
    +    }
    +    return ((END-START) % STEP) == 0 ? END : (END-START) - ((END-START) % STEP) + STEP;
    +  }
    +
    +  // flatten out values in 'bits' assuming that they are are to have values of idx
    +  // plus their position in the bitvector, and store these indexes at
    +  // base_ptr[base] incrementing base as we go
    +  // will potentially store extra values beyond end of valid bits, so base_ptr
    +  // needs to be large enough to handle this
    +  //
    +  // If the kernel sets SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER, then it
    +  // will provide its own version of the code.
    +#ifdef SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER
    +  simdjson_inline void write(uint32_t idx, uint64_t bits);
    +#else
    +  simdjson_inline void write(uint32_t idx, uint64_t bits) {
    +    // In some instances, the next branch is expensive because it is mispredicted.
    +    // Unfortunately, in other cases,
    +    // it helps tremendously.
    +    if (bits == 0)
    +        return;
    +
    +    int cnt = static_cast(count_ones(bits));
    +
    +#if SIMDJSON_PREFER_REVERSE_BITS
    +    bits = reverse_bits(bits);
    +#endif
    +#ifdef SIMDJSON_STRUCTURAL_INDEXER_STEP
    +    static constexpr const int STEP = SIMDJSON_STRUCTURAL_INDEXER_STEP;
    +#else
    +    static constexpr const int STEP = 4;
    +#endif
    +    static constexpr const int STEP_UNTIL = 24;
    +
    +    write_indexes_stepped<0, STEP_UNTIL, STEP>(idx, bits, cnt);
    +    SIMDJSON_IF_CONSTEXPR (STEP_UNTIL < 64) {
    +      if (simdjson_unlikely(STEP_UNTIL < cnt)) {
    +        for (int i=STEP_UNTIL; itail += cnt;
    +  }
    +#endif // SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER
    +
    +};
    +
    +class json_structural_indexer {
    +public:
    +  /**
    +   * Find the important bits of JSON in a 128-byte chunk, and add them to structural_indexes.
    +   *
    +   * @param partial Setting the partial parameter to true allows the find_structural_bits to
    +   *   tolerate unclosed strings. The caller should still ensure that the input is valid UTF-8. If
    +   *   you are processing substrings, you may want to call on a function like trimmed_length_safe_utf8.
    +   */
    +  template
    +  static error_code index(const uint8_t *buf, size_t len, dom_parser_implementation &parser, stage1_mode partial) noexcept;
    +
    +private:
    +  simdjson_inline json_structural_indexer(uint32_t *structural_indexes);
    +  template
    +  simdjson_inline void step(const uint8_t *block, buf_block_reader &reader) noexcept;
    +  simdjson_inline void next(const simd::simd8x64& in, const json_block& block, size_t idx);
    +  simdjson_inline error_code finish(dom_parser_implementation &parser, size_t idx, size_t len, stage1_mode partial);
    +
    +  json_scanner scanner{};
    +  utf8_checker checker{};
    +  bit_indexer indexer;
    +  uint64_t prev_structurals = 0;
    +  uint64_t unescaped_chars_error = 0;
    +};
    +
    +simdjson_inline json_structural_indexer::json_structural_indexer(uint32_t *structural_indexes) : indexer{structural_indexes} {}
    +
    +// Skip the last character if it is partial
    +simdjson_inline size_t trim_partial_utf8(const uint8_t *buf, size_t len) {
    +  if (simdjson_unlikely(len < 3)) {
    +    switch (len) {
    +      case 2:
    +        if (buf[len-1] >= 0xc0) { return len-1; } // 2-, 3- and 4-byte characters with only 1 byte left
    +        if (buf[len-2] >= 0xe0) { return len-2; } // 3- and 4-byte characters with only 2 bytes left
    +        return len;
    +      case 1:
    +        if (buf[len-1] >= 0xc0) { return len-1; } // 2-, 3- and 4-byte characters with only 1 byte left
    +        return len;
    +      case 0:
    +        return len;
    +    }
    +  }
    +  if (buf[len-1] >= 0xc0) { return len-1; } // 2-, 3- and 4-byte characters with only 1 byte left
    +  if (buf[len-2] >= 0xe0) { return len-2; } // 3- and 4-byte characters with only 1 byte left
    +  if (buf[len-3] >= 0xf0) { return len-3; } // 4-byte characters with only 3 bytes left
    +  return len;
    +}
    +
    +//
    +// PERF NOTES:
    +// We pipe 2 inputs through these stages:
    +// 1. Load JSON into registers. This takes a long time and is highly parallelizable, so we load
    +//    2 inputs' worth at once so that by the time step 2 is looking for them input, it's available.
    +// 2. Scan the JSON for critical data: strings, scalars and operators. This is the critical path.
    +//    The output of step 1 depends entirely on this information. These functions don't quite use
    +//    up enough CPU: the second half of the functions is highly serial, only using 1 execution core
    +//    at a time. The second input's scans has some dependency on the first ones finishing it, but
    +//    they can make a lot of progress before they need that information.
    +// 3. Step 1 doesn't use enough capacity, so we run some extra stuff while we're waiting for that
    +//    to finish: utf-8 checks and generating the output from the last iteration.
    +//
    +// The reason we run 2 inputs at a time, is steps 2 and 3 are *still* not enough to soak up all
    +// available capacity with just one input. Running 2 at a time seems to give the CPU a good enough
    +// workout.
    +//
    +template
    +error_code json_structural_indexer::index(const uint8_t *buf, size_t len, dom_parser_implementation &parser, stage1_mode partial) noexcept {
    +  if (simdjson_unlikely(len > parser.capacity())) { return CAPACITY; }
    +  // We guard the rest of the code so that we can assume that len > 0 throughout.
    +  if (len == 0) { return EMPTY; }
    +  if (is_streaming(partial)) {
    +    len = trim_partial_utf8(buf, len);
    +    // If you end up with an empty window after trimming
    +    // the partial UTF-8 bytes, then chances are good that you
    +    // have an UTF-8 formatting error.
    +    if(len == 0) { return UTF8_ERROR; }
    +  }
    +  buf_block_reader reader(buf, len);
    +  json_structural_indexer indexer(parser.structural_indexes.get());
    +
    +  // Read all but the last block
    +  while (reader.has_full_block()) {
    +    indexer.step(reader.full_block(), reader);
    +  }
    +  // Take care of the last block (will always be there unless file is empty which is
    +  // not supposed to happen.)
    +  uint8_t block[STEP_SIZE];
    +  if (simdjson_unlikely(reader.get_remainder(block) == 0)) { return UNEXPECTED_ERROR; }
    +  indexer.step(block, reader);
    +  return indexer.finish(parser, reader.block_index(), len, partial);
    +}
    +
    +template<>
    +simdjson_inline void json_structural_indexer::step<128>(const uint8_t *block, buf_block_reader<128> &reader) noexcept {
    +  simd::simd8x64 in_1(block);
    +  simd::simd8x64 in_2(block+64);
    +  json_block block_1 = scanner.next(in_1);
    +  json_block block_2 = scanner.next(in_2);
    +  this->next(in_1, block_1, reader.block_index());
    +  this->next(in_2, block_2, reader.block_index()+64);
    +  reader.advance();
    +}
    +
    +template<>
    +simdjson_inline void json_structural_indexer::step<64>(const uint8_t *block, buf_block_reader<64> &reader) noexcept {
    +  simd::simd8x64 in_1(block);
    +  json_block block_1 = scanner.next(in_1);
    +  this->next(in_1, block_1, reader.block_index());
    +  reader.advance();
    +}
    +
    +simdjson_inline void json_structural_indexer::next(const simd::simd8x64& in, const json_block& block, size_t idx) {
    +  uint64_t unescaped = in.lteq(0x1F);
    +#if SIMDJSON_UTF8VALIDATION
    +  checker.check_next_input(in);
    +#endif
    +  indexer.write(uint32_t(idx-64), prev_structurals); // Output *last* iteration's structurals to the parser
    +  prev_structurals = block.structural_start();
    +  unescaped_chars_error |= block.non_quote_inside_string(unescaped);
    +}
    +
    +simdjson_inline error_code json_structural_indexer::finish(dom_parser_implementation &parser, size_t idx, size_t len, stage1_mode partial) {
    +  // Write out the final iteration's structurals
    +  indexer.write(uint32_t(idx-64), prev_structurals);
    +  error_code error = scanner.finish();
    +  // We deliberately break down the next expression so that it is
    +  // human readable.
    +  const bool should_we_exit = is_streaming(partial) ?
    +    ((error != SUCCESS) && (error != UNCLOSED_STRING)) // when partial we tolerate UNCLOSED_STRING
    +    : (error != SUCCESS); // if partial is false, we must have SUCCESS
    +  const bool have_unclosed_string = (error == UNCLOSED_STRING);
    +  if (simdjson_unlikely(should_we_exit)) { return error; }
    +
    +  if (unescaped_chars_error) {
    +    return UNESCAPED_CHARS;
    +  }
    +  parser.n_structural_indexes = uint32_t(indexer.tail - parser.structural_indexes.get());
    +  /***
    +   * The On Demand API requires special padding.
    +   *
    +   * This is related to https://github.com/simdjson/simdjson/issues/906
    +   * Basically, we want to make sure that if the parsing continues beyond the last (valid)
    +   * structural character, it quickly stops.
    +   * Only three structural characters can be repeated without triggering an error in JSON:  [,] and }.
    +   * We repeat the padding character (at 'len'). We don't know what it is, but if the parsing
    +   * continues, then it must be [,] or }.
    +   * Suppose it is ] or }. We backtrack to the first character, what could it be that would
    +   * not trigger an error? It could be ] or } but no, because you can't start a document that way.
    +   * It can't be a comma, a colon or any simple value. So the only way we could continue is
    +   * if the repeated character is [. But if so, the document must start with [. But if the document
    +   * starts with [, it should end with ]. If we enforce that rule, then we would get
    +   * ][[ which is invalid.
    +   *
    +   * This is illustrated with the test array_iterate_unclosed_error() on the following input:
    +   * R"({ "a": [,,)"
    +   **/
    +  parser.structural_indexes[parser.n_structural_indexes] = uint32_t(len); // used later in partial == stage1_mode::streaming_final
    +  parser.structural_indexes[parser.n_structural_indexes + 1] = uint32_t(len);
    +  parser.structural_indexes[parser.n_structural_indexes + 2] = 0;
    +  parser.next_structural_index = 0;
    +  // a valid JSON file cannot have zero structural indexes - we should have found something
    +  if (simdjson_unlikely(parser.n_structural_indexes == 0u)) {
    +    return EMPTY;
    +  }
    +  if (simdjson_unlikely(parser.structural_indexes[parser.n_structural_indexes - 1] > len)) {
    +    return UNEXPECTED_ERROR;
    +  }
    +  if (partial == stage1_mode::streaming_partial) {
    +    // If we have an unclosed string, then the last structural
    +    // will be the quote and we want to make sure to omit it.
    +    if(have_unclosed_string) {
    +      parser.n_structural_indexes--;
    +      // a valid JSON file cannot have zero structural indexes - we should have found something
    +      if (simdjson_unlikely(parser.n_structural_indexes == 0u)) { return CAPACITY; }
    +    }
    +    // We truncate the input to the end of the last complete document (or zero).
    +    auto new_structural_indexes = find_next_document_index(parser);
    +    if (new_structural_indexes == 0 && parser.n_structural_indexes > 0) {
    +      if(parser.structural_indexes[0] == 0) {
    +        // If the buffer is partial and we started at index 0 but the document is
    +        // incomplete, it's too big to parse.
    +        return CAPACITY;
    +      } else {
    +        // It is possible that the document could be parsed, we just had a lot
    +        // of white space.
    +        parser.n_structural_indexes = 0;
    +        return EMPTY;
    +      }
    +    }
    +
    +    parser.n_structural_indexes = new_structural_indexes;
    +  } else if (partial == stage1_mode::streaming_final) {
    +    if(have_unclosed_string) { parser.n_structural_indexes--; }
    +    // We truncate the input to the end of the last complete document (or zero).
    +    // Because partial == stage1_mode::streaming_final, it means that we may
    +    // silently ignore trailing garbage. Though it sounds bad, we do it
    +    // deliberately because many people who have streams of JSON documents
    +    // will truncate them for processing. E.g., imagine that you are uncompressing
    +    // the data from a size file or receiving it in chunks from the network. You
    +    // may not know where exactly the last document will be. Meanwhile the
    +    // document_stream instances allow people to know the JSON documents they are
    +    // parsing (see the iterator.source() method).
    +    parser.n_structural_indexes = find_next_document_index(parser);
    +    // We store the initial n_structural_indexes so that the client can see
    +    // whether we used truncation. If initial_n_structural_indexes == parser.n_structural_indexes,
    +    // then this will query parser.structural_indexes[parser.n_structural_indexes] which is len,
    +    // otherwise, it will copy some prior index.
    +    parser.structural_indexes[parser.n_structural_indexes + 1] = parser.structural_indexes[parser.n_structural_indexes];
    +    // This next line is critical, do not change it unless you understand what you are
    +    // doing.
    +    parser.structural_indexes[parser.n_structural_indexes] = uint32_t(len);
    +    if (simdjson_unlikely(parser.n_structural_indexes == 0u)) {
    +        // We tolerate an unclosed string at the very end of the stream. Indeed, users
    +        // often load their data in bulk without being careful and they want us to ignore
    +        // the trailing garbage.
    +        return EMPTY;
    +    }
    +  }
    +  checker.check_eof();
    +  return checker.errors();
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +// Clear CUSTOM_BIT_INDEXER so other implementations can set it if they need to.
    +#undef SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRUCTURAL_INDEXER_H
    +/* end file generic/stage1/json_structural_indexer.h for arm64 */
    +/* including generic/stage1/utf8_validator.h for arm64: #include  */
    +/* begin file generic/stage1/utf8_validator.h for arm64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_UTF8_VALIDATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_UTF8_VALIDATOR_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +namespace stage1 {
    +
    +/**
    + * Validates that the string is actual UTF-8.
    + */
    +template
    +bool generic_validate_utf8(const uint8_t * input, size_t length) {
    +    checker c{};
    +    buf_block_reader<64> reader(input, length);
    +    while (reader.has_full_block()) {
    +      simd::simd8x64 in(reader.full_block());
    +      c.check_next_input(in);
    +      reader.advance();
    +    }
    +    uint8_t block[64]{};
    +    reader.get_remainder(block);
    +    simd::simd8x64 in(block);
    +    c.check_next_input(in);
    +    reader.advance();
    +    c.check_eof();
    +    return c.errors() == error_code::SUCCESS;
    +}
    +
    +bool generic_validate_utf8(const char * input, size_t length) {
    +    return generic_validate_utf8(reinterpret_cast(input),length);
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_UTF8_VALIDATOR_H
    +/* end file generic/stage1/utf8_validator.h for arm64 */
    +/* end file generic/stage1/amalgamated.h for arm64 */
    +/* including generic/stage2/amalgamated.h for arm64: #include  */
    +/* begin file generic/stage2/amalgamated.h for arm64 */
    +// Stuff other things depend on
    +/* including generic/stage2/base.h for arm64: #include  */
    +/* begin file generic/stage2/base.h for arm64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_BASE_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +namespace stage2 {
    +
    +class json_iterator;
    +class structural_iterator;
    +struct tape_builder;
    +struct tape_writer;
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_BASE_H
    +/* end file generic/stage2/base.h for arm64 */
    +/* including generic/stage2/tape_writer.h for arm64: #include  */
    +/* begin file generic/stage2/tape_writer.h for arm64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +namespace stage2 {
    +
    +struct tape_writer {
    +  /** The next place to write to tape */
    +  uint64_t *next_tape_loc;
    +
    +  /** Write a signed 64-bit value to tape. */
    +  simdjson_inline void append_s64(int64_t value) noexcept;
    +
    +  /** Write an unsigned 64-bit value to tape. */
    +  simdjson_inline void append_u64(uint64_t value) noexcept;
    +
    +  /** Write a double value to tape. */
    +  simdjson_inline void append_double(double value) noexcept;
    +
    +  /**
    +   * Append a tape entry (an 8-bit type,and 56 bits worth of value).
    +   */
    +  simdjson_inline void append(uint64_t val, internal::tape_type t) noexcept;
    +
    +  /**
    +   * Skip the current tape entry without writing.
    +   *
    +   * Used to skip the start of the container, since we'll come back later to fill it in when the
    +   * container ends.
    +   */
    +  simdjson_inline void skip() noexcept;
    +
    +  /**
    +   * Skip the number of tape entries necessary to write a large u64 or i64.
    +   */
    +  simdjson_inline void skip_large_integer() noexcept;
    +
    +  /**
    +   * Skip the number of tape entries necessary to write a double.
    +   */
    +  simdjson_inline void skip_double() noexcept;
    +
    +  /**
    +   * Write a value to a known location on tape.
    +   *
    +   * Used to go back and write out the start of a container after the container ends.
    +   */
    +  simdjson_inline static void write(uint64_t &tape_loc, uint64_t val, internal::tape_type t) noexcept;
    +
    +private:
    +  /**
    +   * Append both the tape entry, and a supplementary value following it. Used for types that need
    +   * all 64 bits, such as double and uint64_t.
    +   */
    +  template
    +  simdjson_inline void append2(uint64_t val, T val2, internal::tape_type t) noexcept;
    +}; // struct tape_writer
    +
    +simdjson_inline void tape_writer::append_s64(int64_t value) noexcept {
    +  append2(0, value, internal::tape_type::INT64);
    +}
    +
    +simdjson_inline void tape_writer::append_u64(uint64_t value) noexcept {
    +  append(0, internal::tape_type::UINT64);
    +  *next_tape_loc = value;
    +  next_tape_loc++;
    +}
    +
    +/** Write a double value to tape. */
    +simdjson_inline void tape_writer::append_double(double value) noexcept {
    +  append2(0, value, internal::tape_type::DOUBLE);
    +}
    +
    +simdjson_inline void tape_writer::skip() noexcept {
    +  next_tape_loc++;
    +}
    +
    +simdjson_inline void tape_writer::skip_large_integer() noexcept {
    +  next_tape_loc += 2;
    +}
    +
    +simdjson_inline void tape_writer::skip_double() noexcept {
    +  next_tape_loc += 2;
    +}
    +
    +simdjson_inline void tape_writer::append(uint64_t val, internal::tape_type t) noexcept {
    +  *next_tape_loc = val | ((uint64_t(char(t))) << 56);
    +  next_tape_loc++;
    +}
    +
    +template
    +simdjson_inline void tape_writer::append2(uint64_t val, T val2, internal::tape_type t) noexcept {
    +  append(val, t);
    +  static_assert(sizeof(val2) == sizeof(*next_tape_loc), "Type is not 64 bits!");
    +  memcpy(next_tape_loc, &val2, sizeof(val2));
    +  next_tape_loc++;
    +}
    +
    +simdjson_inline void tape_writer::write(uint64_t &tape_loc, uint64_t val, internal::tape_type t) noexcept {
    +  tape_loc = val | ((uint64_t(char(t))) << 56);
    +}
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H
    +/* end file generic/stage2/tape_writer.h for arm64 */
    +/* including generic/stage2/logger.h for arm64: #include  */
    +/* begin file generic/stage2/logger.h for arm64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_LOGGER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_LOGGER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +
    +// This is for an internal-only stage 2 specific logger.
    +// Set LOG_ENABLED = true to log what stage 2 is doing!
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +namespace logger {
    +
    +  static constexpr const char * DASHES = "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------";
    +
    +#if SIMDJSON_VERBOSE_LOGGING
    +  static constexpr const bool LOG_ENABLED = true;
    +#else
    +  static constexpr const bool LOG_ENABLED = false;
    +#endif
    +  static constexpr const int LOG_EVENT_LEN = 20;
    +  static constexpr const int LOG_BUFFER_LEN = 30;
    +  static constexpr const int LOG_SMALL_BUFFER_LEN = 10;
    +  static constexpr const int LOG_INDEX_LEN = 5;
    +
    +  static int log_depth; // Not threadsafe. Log only.
    +
    +  // Helper to turn unprintable or newline characters into spaces
    +  static simdjson_inline char printable_char(char c) {
    +    if (c >= 0x20) {
    +      return c;
    +    } else {
    +      return ' ';
    +    }
    +  }
    +
    +  // Print the header and set up log_start
    +  static simdjson_inline void log_start() {
    +    if (LOG_ENABLED) {
    +      log_depth = 0;
    +      printf("\n");
    +      printf("| %-*s | %-*s | %-*s | %-*s | Detail |\n", LOG_EVENT_LEN, "Event", LOG_BUFFER_LEN, "Buffer", LOG_SMALL_BUFFER_LEN, "Next", 5, "Next#");
    +      printf("|%.*s|%.*s|%.*s|%.*s|--------|\n", LOG_EVENT_LEN+2, DASHES, LOG_BUFFER_LEN+2, DASHES, LOG_SMALL_BUFFER_LEN+2, DASHES, 5+2, DASHES);
    +    }
    +  }
    +
    +  simdjson_unused static simdjson_inline void log_string(const char *message) {
    +    if (LOG_ENABLED) {
    +      printf("%s\n", message);
    +    }
    +  }
    +
    +  // Logs a single line from the stage 2 DOM parser
    +  template
    +  static simdjson_inline void log_line(S &structurals, const char *title_prefix, const char *title, const char *detail) {
    +    if (LOG_ENABLED) {
    +      printf("| %*s%s%-*s ", log_depth*2, "", title_prefix, LOG_EVENT_LEN - log_depth*2 - int(strlen(title_prefix)), title);
    +      auto current_index = structurals.at_beginning() ? nullptr : structurals.next_structural-1;
    +      auto next_index = structurals.next_structural;
    +      auto current = current_index ? &structurals.buf[*current_index] : reinterpret_cast("                                                       ");
    +      auto next = &structurals.buf[*next_index];
    +      {
    +        // Print the next N characters in the buffer.
    +        printf("| ");
    +        // Otherwise, print the characters starting from the buffer position.
    +        // Print spaces for unprintable or newline characters.
    +        for (int i=0;i */
    +/* begin file generic/stage2/json_iterator.h for arm64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +namespace stage2 {
    +
    +class json_iterator {
    +public:
    +  const uint8_t* const buf;
    +  uint32_t *next_structural;
    +  dom_parser_implementation &dom_parser;
    +  uint32_t depth{0};
    +
    +  /**
    +   * Walk the JSON document.
    +   *
    +   * The visitor receives callbacks when values are encountered. All callbacks pass the iterator as
    +   * the first parameter; some callbacks have other parameters as well:
    +   *
    +   * - visit_document_start() - at the beginning.
    +   * - visit_document_end() - at the end (if things were successful).
    +   *
    +   * - visit_array_start() - at the start `[` of a non-empty array.
    +   * - visit_array_end() - at the end `]` of a non-empty array.
    +   * - visit_empty_array() - when an empty array is encountered.
    +   *
    +   * - visit_object_end() - at the start `]` of a non-empty object.
    +   * - visit_object_start() - at the end `]` of a non-empty object.
    +   * - visit_empty_object() - when an empty object is encountered.
    +   * - visit_key(const uint8_t *key) - when a key in an object field is encountered. key is
    +   *                                   guaranteed to point at the first quote of the string (`"key"`).
    +   * - visit_primitive(const uint8_t *value) - when a value is a string, number, boolean or null.
    +   * - visit_root_primitive(iter, uint8_t *value) - when the top-level value is a string, number, boolean or null.
    +   *
    +   * - increment_count(iter) - each time a value is found in an array or object.
    +   */
    +  template
    +  simdjson_warn_unused simdjson_inline error_code walk_document(V &visitor) noexcept;
    +
    +  /**
    +   * Create an iterator capable of walking a JSON document.
    +   *
    +   * The document must have already passed through stage 1.
    +   */
    +  simdjson_inline json_iterator(dom_parser_implementation &_dom_parser, size_t start_structural_index);
    +
    +  /**
    +   * Look at the next token.
    +   *
    +   * Tokens can be strings, numbers, booleans, null, or operators (`[{]},:`)).
    +   *
    +   * They may include invalid JSON as well (such as `1.2.3` or `ture`).
    +   */
    +  simdjson_inline const uint8_t *peek() const noexcept;
    +  /**
    +   * Advance to the next token.
    +   *
    +   * Tokens can be strings, numbers, booleans, null, or operators (`[{]},:`)).
    +   *
    +   * They may include invalid JSON as well (such as `1.2.3` or `ture`).
    +   */
    +  simdjson_inline const uint8_t *advance() noexcept;
    +  /**
    +   * Get the remaining length of the document, from the start of the current token.
    +   */
    +  simdjson_inline size_t remaining_len() const noexcept;
    +  /**
    +   * Check if we are at the end of the document.
    +   *
    +   * If this is true, there are no more tokens.
    +   */
    +  simdjson_inline bool at_eof() const noexcept;
    +  /**
    +   * Check if we are at the beginning of the document.
    +   */
    +  simdjson_inline bool at_beginning() const noexcept;
    +  simdjson_inline uint8_t last_structural() const noexcept;
    +
    +  /**
    +   * Log that a value has been found.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_value(const char *type) const noexcept;
    +  /**
    +   * Log the start of a multipart value.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_start_value(const char *type) const noexcept;
    +  /**
    +   * Log the end of a multipart value.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_end_value(const char *type) const noexcept;
    +  /**
    +   * Log an error.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_error(const char *error) const noexcept;
    +
    +  template
    +  simdjson_warn_unused simdjson_inline error_code visit_root_primitive(V &visitor, const uint8_t *value) noexcept;
    +  template
    +  simdjson_warn_unused simdjson_inline error_code visit_primitive(V &visitor, const uint8_t *value) noexcept;
    +};
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code json_iterator::walk_document(V &visitor) noexcept {
    +  logger::log_start();
    +
    +  //
    +  // Start the document
    +  //
    +  if (at_eof()) { return EMPTY; }
    +  log_start_value("document");
    +  SIMDJSON_TRY( visitor.visit_document_start(*this) );
    +
    +  //
    +  // Read first value
    +  //
    +  {
    +    auto value = advance();
    +
    +    // Make sure the outer object or array is closed before continuing; otherwise, there are ways we
    +    // could get into memory corruption. See https://github.com/simdjson/simdjson/issues/906
    +    if (!STREAMING) {
    +      switch (*value) {
    +        case '{': if (last_structural() != '}') { log_value("starting brace unmatched"); return TAPE_ERROR; }; break;
    +        case '[': if (last_structural() != ']') { log_value("starting bracket unmatched"); return TAPE_ERROR; }; break;
    +      }
    +    }
    +
    +    switch (*value) {
    +      case '{': if (*peek() == '}') { advance(); log_value("empty object"); SIMDJSON_TRY( visitor.visit_empty_object(*this) ); break; } goto object_begin;
    +      case '[': if (*peek() == ']') { advance(); log_value("empty array"); SIMDJSON_TRY( visitor.visit_empty_array(*this) ); break; } goto array_begin;
    +      default: SIMDJSON_TRY( visitor.visit_root_primitive(*this, value) ); break;
    +    }
    +  }
    +  goto document_end;
    +
    +//
    +// Object parser states
    +//
    +object_begin:
    +  log_start_value("object");
    +  depth++;
    +  if (depth >= dom_parser.max_depth()) { log_error("Exceeded max depth!"); return DEPTH_ERROR; }
    +  dom_parser.is_array[depth] = false;
    +  SIMDJSON_TRY( visitor.visit_object_start(*this) );
    +
    +  {
    +    auto key = advance();
    +    if (*key != '"') { log_error("Object does not start with a key"); return TAPE_ERROR; }
    +    SIMDJSON_TRY( visitor.increment_count(*this) );
    +    SIMDJSON_TRY( visitor.visit_key(*this, key) );
    +  }
    +
    +object_field:
    +  if (simdjson_unlikely( *advance() != ':' )) { log_error("Missing colon after key in object"); return TAPE_ERROR; }
    +  {
    +    auto value = advance();
    +    switch (*value) {
    +      case '{': if (*peek() == '}') { advance(); log_value("empty object"); SIMDJSON_TRY( visitor.visit_empty_object(*this) ); break; } goto object_begin;
    +      case '[': if (*peek() == ']') { advance(); log_value("empty array"); SIMDJSON_TRY( visitor.visit_empty_array(*this) ); break; } goto array_begin;
    +      default: SIMDJSON_TRY( visitor.visit_primitive(*this, value) ); break;
    +    }
    +  }
    +
    +object_continue:
    +  switch (*advance()) {
    +    case ',':
    +      SIMDJSON_TRY( visitor.increment_count(*this) );
    +      {
    +        auto key = advance();
    +        if (simdjson_unlikely( *key != '"' )) { log_error("Key string missing at beginning of field in object"); return TAPE_ERROR; }
    +        SIMDJSON_TRY( visitor.visit_key(*this, key) );
    +      }
    +      goto object_field;
    +    case '}': log_end_value("object"); SIMDJSON_TRY( visitor.visit_object_end(*this) ); goto scope_end;
    +    default: log_error("No comma between object fields"); return TAPE_ERROR;
    +  }
    +
    +scope_end:
    +  depth--;
    +  if (depth == 0) { goto document_end; }
    +  if (dom_parser.is_array[depth]) { goto array_continue; }
    +  goto object_continue;
    +
    +//
    +// Array parser states
    +//
    +array_begin:
    +  log_start_value("array");
    +  depth++;
    +  if (depth >= dom_parser.max_depth()) { log_error("Exceeded max depth!"); return DEPTH_ERROR; }
    +  dom_parser.is_array[depth] = true;
    +  SIMDJSON_TRY( visitor.visit_array_start(*this) );
    +  SIMDJSON_TRY( visitor.increment_count(*this) );
    +
    +array_value:
    +  {
    +    auto value = advance();
    +    switch (*value) {
    +      case '{': if (*peek() == '}') { advance(); log_value("empty object"); SIMDJSON_TRY( visitor.visit_empty_object(*this) ); break; } goto object_begin;
    +      case '[': if (*peek() == ']') { advance(); log_value("empty array"); SIMDJSON_TRY( visitor.visit_empty_array(*this) ); break; } goto array_begin;
    +      default: SIMDJSON_TRY( visitor.visit_primitive(*this, value) ); break;
    +    }
    +  }
    +
    +array_continue:
    +  switch (*advance()) {
    +    case ',': SIMDJSON_TRY( visitor.increment_count(*this) ); goto array_value;
    +    case ']': log_end_value("array"); SIMDJSON_TRY( visitor.visit_array_end(*this) ); goto scope_end;
    +    default: log_error("Missing comma between array values"); return TAPE_ERROR;
    +  }
    +
    +document_end:
    +  log_end_value("document");
    +  SIMDJSON_TRY( visitor.visit_document_end(*this) );
    +
    +  dom_parser.next_structural_index = uint32_t(next_structural - &dom_parser.structural_indexes[0]);
    +
    +  // If we didn't make it to the end, it's an error
    +  if ( !STREAMING && dom_parser.next_structural_index != dom_parser.n_structural_indexes ) {
    +    log_error("More than one JSON value at the root of the document, or extra characters at the end of the JSON!");
    +    return TAPE_ERROR;
    +  }
    +
    +  return SUCCESS;
    +
    +} // walk_document()
    +
    +simdjson_inline json_iterator::json_iterator(dom_parser_implementation &_dom_parser, size_t start_structural_index)
    +  : buf{_dom_parser.buf},
    +    next_structural{&_dom_parser.structural_indexes[start_structural_index]},
    +    dom_parser{_dom_parser} {
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::peek() const noexcept {
    +  return &buf[*(next_structural)];
    +}
    +simdjson_inline const uint8_t *json_iterator::advance() noexcept {
    +  return &buf[*(next_structural++)];
    +}
    +simdjson_inline size_t json_iterator::remaining_len() const noexcept {
    +  return dom_parser.len - *(next_structural-1);
    +}
    +
    +simdjson_inline bool json_iterator::at_eof() const noexcept {
    +  return next_structural == &dom_parser.structural_indexes[dom_parser.n_structural_indexes];
    +}
    +simdjson_inline bool json_iterator::at_beginning() const noexcept {
    +  return next_structural == dom_parser.structural_indexes.get();
    +}
    +simdjson_inline uint8_t json_iterator::last_structural() const noexcept {
    +  return buf[dom_parser.structural_indexes[dom_parser.n_structural_indexes - 1]];
    +}
    +
    +simdjson_inline void json_iterator::log_value(const char *type) const noexcept {
    +  logger::log_line(*this, "", type, "");
    +}
    +
    +simdjson_inline void json_iterator::log_start_value(const char *type) const noexcept {
    +  logger::log_line(*this, "+", type, "");
    +  if (logger::LOG_ENABLED) { logger::log_depth++; }
    +}
    +
    +simdjson_inline void json_iterator::log_end_value(const char *type) const noexcept {
    +  if (logger::LOG_ENABLED) { logger::log_depth--; }
    +  logger::log_line(*this, "-", type, "");
    +}
    +
    +simdjson_inline void json_iterator::log_error(const char *error) const noexcept {
    +  logger::log_line(*this, "", "ERROR", error);
    +}
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code json_iterator::visit_root_primitive(V &visitor, const uint8_t *value) noexcept {
    +  switch (*value) {
    +    case '"': return visitor.visit_root_string(*this, value);
    +    case 't': return visitor.visit_root_true_atom(*this, value);
    +    case 'f': return visitor.visit_root_false_atom(*this, value);
    +    case 'n': return visitor.visit_root_null_atom(*this, value);
    +    case '-':
    +    case '0': case '1': case '2': case '3': case '4':
    +    case '5': case '6': case '7': case '8': case '9':
    +      return visitor.visit_root_number(*this, value);
    +    default:
    +      log_error("Document starts with a non-value character");
    +      return TAPE_ERROR;
    +  }
    +}
    +template
    +simdjson_warn_unused simdjson_inline error_code json_iterator::visit_primitive(V &visitor, const uint8_t *value) noexcept {
    +  // Use the fact that most scalars are going to be either strings or numbers.
    +  if(*value == '"') {
    +    return visitor.visit_string(*this, value);
    +  } else if (((*value - '0')  < 10) || (*value == '-')) {
    +    return visitor.visit_number(*this, value);
    +  }
    +  // true, false, null are uncommon.
    +  switch (*value) {
    +    case 't': return visitor.visit_true_atom(*this, value);
    +    case 'f': return visitor.visit_false_atom(*this, value);
    +    case 'n': return visitor.visit_null_atom(*this, value);
    +    default:
    +      log_error("Non-value found when value was expected!");
    +      return TAPE_ERROR;
    +  }
    +}
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H
    +/* end file generic/stage2/json_iterator.h for arm64 */
    +/* including generic/stage2/stringparsing.h for arm64: #include  */
    +/* begin file generic/stage2/stringparsing.h for arm64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This file contains the common code every implementation uses
    +// It is intended to be included multiple times and compiled multiple times
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +/// @private
    +namespace stringparsing {
    +
    +// begin copypasta
    +// These chars yield themselves: " \ /
    +// b -> backspace, f -> formfeed, n -> newline, r -> cr, t -> horizontal tab
    +// u not handled in this table as it's complex
    +static const uint8_t escape_map[256] = {
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0, // 0x0.
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0x22, 0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0x2f,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0, // 0x4.
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0x5c, 0, 0,    0, // 0x5.
    +    0, 0, 0x08, 0, 0,    0, 0x0c, 0, 0, 0, 0, 0, 0,    0, 0x0a, 0, // 0x6.
    +    0, 0, 0x0d, 0, 0x09, 0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0, // 0x7.
    +
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +};
    +
    +// handle a unicode codepoint
    +// write appropriate values into dest
    +// src will advance 6 bytes or 12 bytes
    +// dest will advance a variable amount (return via pointer)
    +// return true if the unicode codepoint was valid
    +// We work in little-endian then swap at write time
    +simdjson_warn_unused
    +simdjson_inline bool handle_unicode_codepoint(const uint8_t **src_ptr,
    +                                            uint8_t **dst_ptr, bool allow_replacement) {
    +  // Use the default Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD)
    +  constexpr uint32_t substitution_code_point = 0xfffd;
    +  // jsoncharutils::hex_to_u32_nocheck fills high 16 bits of the return value with 1s if the
    +  // conversion isn't valid; we defer the check for this to inside the
    +  // multilingual plane check
    +  uint32_t code_point = jsoncharutils::hex_to_u32_nocheck(*src_ptr + 2);
    +  *src_ptr += 6;
    +
    +  // If we found a high surrogate, we must
    +  // check for low surrogate for characters
    +  // outside the Basic
    +  // Multilingual Plane.
    +  if (code_point >= 0xd800 && code_point < 0xdc00) {
    +    const uint8_t *src_data = *src_ptr;
    +    /* Compiler optimizations convert this to a single 16-bit load and compare on most platforms */
    +    if (((src_data[0] << 8) | src_data[1]) != ((static_cast ('\\') << 8) | static_cast ('u'))) {
    +      if(!allow_replacement) { return false; }
    +      code_point = substitution_code_point;
    +    } else {
    +      uint32_t code_point_2 = jsoncharutils::hex_to_u32_nocheck(src_data + 2);
    +
    +      // We have already checked that the high surrogate is valid and
    +      // (code_point - 0xd800) < 1024.
    +      //
    +      // Check that code_point_2 is in the range 0xdc00..0xdfff
    +      // and that code_point_2 was parsed from valid hex.
    +      uint32_t low_bit = code_point_2 - 0xdc00;
    +      if (low_bit >> 10) {
    +        if(!allow_replacement) { return false; }
    +        code_point = substitution_code_point;
    +      } else {
    +        code_point =  (((code_point - 0xd800) << 10) | low_bit) + 0x10000;
    +        *src_ptr += 6;
    +      }
    +
    +    }
    +  } else if (code_point >= 0xdc00 && code_point <= 0xdfff) {
    +      // If we encounter a low surrogate (not preceded by a high surrogate)
    +      // then we have an error.
    +      if(!allow_replacement) { return false; }
    +      code_point = substitution_code_point;
    +  }
    +  size_t offset = jsoncharutils::codepoint_to_utf8(code_point, *dst_ptr);
    +  *dst_ptr += offset;
    +  return offset > 0;
    +}
    +
    +
    +// handle a unicode codepoint using the wobbly convention
    +// https://simonsapin.github.io/wtf-8/
    +// write appropriate values into dest
    +// src will advance 6 bytes or 12 bytes
    +// dest will advance a variable amount (return via pointer)
    +// return true if the unicode codepoint was valid
    +// We work in little-endian then swap at write time
    +simdjson_warn_unused
    +simdjson_inline bool handle_unicode_codepoint_wobbly(const uint8_t **src_ptr,
    +                                            uint8_t **dst_ptr) {
    +  // It is not ideal that this function is nearly identical to handle_unicode_codepoint.
    +  //
    +  // jsoncharutils::hex_to_u32_nocheck fills high 16 bits of the return value with 1s if the
    +  // conversion isn't valid; we defer the check for this to inside the
    +  // multilingual plane check
    +  uint32_t code_point = jsoncharutils::hex_to_u32_nocheck(*src_ptr + 2);
    +  *src_ptr += 6;
    +  // If we found a high surrogate, we must
    +  // check for low surrogate for characters
    +  // outside the Basic
    +  // Multilingual Plane.
    +  if (code_point >= 0xd800 && code_point < 0xdc00) {
    +    const uint8_t *src_data = *src_ptr;
    +    /* Compiler optimizations convert this to a single 16-bit load and compare on most platforms */
    +    if (((src_data[0] << 8) | src_data[1]) == ((static_cast ('\\') << 8) | static_cast ('u'))) {
    +      uint32_t code_point_2 = jsoncharutils::hex_to_u32_nocheck(src_data + 2);
    +      uint32_t low_bit = code_point_2 - 0xdc00;
    +      if ((low_bit >> 10) ==  0) {
    +        code_point =
    +          (((code_point - 0xd800) << 10) | low_bit) + 0x10000;
    +        *src_ptr += 6;
    +      }
    +    }
    +  }
    +
    +  size_t offset = jsoncharutils::codepoint_to_utf8(code_point, *dst_ptr);
    +  *dst_ptr += offset;
    +  return offset > 0;
    +}
    +
    +
    +/**
    + * Unescape a valid UTF-8 string from src to dst, stopping at a final unescaped quote. There
    + * must be an unescaped quote terminating the string. It returns the final output
    + * position as pointer. In case of error (e.g., the string has bad escaped codes),
    + * then null_nullptrptr is returned. It is assumed that the output buffer is large
    + * enough. E.g., if src points at 'joe"', then dst needs to have four free bytes +
    + * SIMDJSON_PADDING bytes.
    + */
    +simdjson_warn_unused simdjson_inline uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) {
    +  while (1) {
    +    // Copy the next n bytes, and find the backslash and quote in them.
    +    auto bs_quote = backslash_and_quote::copy_and_find(src, dst);
    +    // If the next thing is the end quote, copy and return
    +    if (bs_quote.has_quote_first()) {
    +      // we encountered quotes first. Move dst to point to quotes and exit
    +      return dst + bs_quote.quote_index();
    +    }
    +    if (bs_quote.has_backslash()) {
    +      /* find out where the backspace is */
    +      auto bs_dist = bs_quote.backslash_index();
    +      uint8_t escape_char = src[bs_dist + 1];
    +      /* we encountered backslash first. Handle backslash */
    +      if (escape_char == 'u') {
    +        /* move src/dst up to the start; they will be further adjusted
    +           within the unicode codepoint handling code. */
    +        src += bs_dist;
    +        dst += bs_dist;
    +        if (!handle_unicode_codepoint(&src, &dst, allow_replacement)) {
    +          return nullptr;
    +        }
    +      } else {
    +        /* simple 1:1 conversion. Will eat bs_dist+2 characters in input and
    +         * write bs_dist+1 characters to output
    +         * note this may reach beyond the part of the buffer we've actually
    +         * seen. I think this is ok */
    +        uint8_t escape_result = escape_map[escape_char];
    +        if (escape_result == 0u) {
    +          return nullptr; /* bogus escape value is an error */
    +        }
    +        dst[bs_dist] = escape_result;
    +        src += bs_dist + 2;
    +        dst += bs_dist + 1;
    +      }
    +    } else {
    +      /* they are the same. Since they can't co-occur, it means we
    +       * encountered neither. */
    +      src += backslash_and_quote::BYTES_PROCESSED;
    +      dst += backslash_and_quote::BYTES_PROCESSED;
    +    }
    +  }
    +}
    +
    +simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) {
    +  // It is not ideal that this function is nearly identical to parse_string.
    +  while (1) {
    +    // Copy the next n bytes, and find the backslash and quote in them.
    +    auto bs_quote = backslash_and_quote::copy_and_find(src, dst);
    +    // If the next thing is the end quote, copy and return
    +    if (bs_quote.has_quote_first()) {
    +      // we encountered quotes first. Move dst to point to quotes and exit
    +      return dst + bs_quote.quote_index();
    +    }
    +    if (bs_quote.has_backslash()) {
    +      /* find out where the backspace is */
    +      auto bs_dist = bs_quote.backslash_index();
    +      uint8_t escape_char = src[bs_dist + 1];
    +      /* we encountered backslash first. Handle backslash */
    +      if (escape_char == 'u') {
    +        /* move src/dst up to the start; they will be further adjusted
    +           within the unicode codepoint handling code. */
    +        src += bs_dist;
    +        dst += bs_dist;
    +        if (!handle_unicode_codepoint_wobbly(&src, &dst)) {
    +          return nullptr;
    +        }
    +      } else {
    +        /* simple 1:1 conversion. Will eat bs_dist+2 characters in input and
    +         * write bs_dist+1 characters to output
    +         * note this may reach beyond the part of the buffer we've actually
    +         * seen. I think this is ok */
    +        uint8_t escape_result = escape_map[escape_char];
    +        if (escape_result == 0u) {
    +          return nullptr; /* bogus escape value is an error */
    +        }
    +        dst[bs_dist] = escape_result;
    +        src += bs_dist + 2;
    +        dst += bs_dist + 1;
    +      }
    +    } else {
    +      /* they are the same. Since they can't co-occur, it means we
    +       * encountered neither. */
    +      src += backslash_and_quote::BYTES_PROCESSED;
    +      dst += backslash_and_quote::BYTES_PROCESSED;
    +    }
    +  }
    +}
    +
    +} // namespace stringparsing
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H
    +/* end file generic/stage2/stringparsing.h for arm64 */
    +/* including generic/stage2/structural_iterator.h for arm64: #include  */
    +/* begin file generic/stage2/structural_iterator.h for arm64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRUCTURAL_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_STRUCTURAL_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +namespace stage2 {
    +
    +class structural_iterator {
    +public:
    +  const uint8_t* const buf;
    +  uint32_t *next_structural;
    +  dom_parser_implementation &dom_parser;
    +
    +  // Start a structural
    +  simdjson_inline structural_iterator(dom_parser_implementation &_dom_parser, size_t start_structural_index)
    +    : buf{_dom_parser.buf},
    +      next_structural{&_dom_parser.structural_indexes[start_structural_index]},
    +      dom_parser{_dom_parser} {
    +  }
    +  // Get the buffer position of the current structural character
    +  simdjson_inline const uint8_t* current() {
    +    return &buf[*(next_structural-1)];
    +  }
    +  // Get the current structural character
    +  simdjson_inline char current_char() {
    +    return buf[*(next_structural-1)];
    +  }
    +  // Get the next structural character without advancing
    +  simdjson_inline char peek_next_char() {
    +    return buf[*next_structural];
    +  }
    +  simdjson_inline const uint8_t* peek() {
    +    return &buf[*next_structural];
    +  }
    +  simdjson_inline const uint8_t* advance() {
    +    return &buf[*(next_structural++)];
    +  }
    +  simdjson_inline char advance_char() {
    +    return buf[*(next_structural++)];
    +  }
    +  simdjson_inline size_t remaining_len() {
    +    return dom_parser.len - *(next_structural-1);
    +  }
    +
    +  simdjson_inline bool at_end() {
    +    return next_structural == &dom_parser.structural_indexes[dom_parser.n_structural_indexes];
    +  }
    +  simdjson_inline bool at_beginning() {
    +    return next_structural == dom_parser.structural_indexes.get();
    +  }
    +};
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_STRUCTURAL_ITERATOR_H
    +/* end file generic/stage2/structural_iterator.h for arm64 */
    +/* including generic/stage2/tape_builder.h for arm64: #include  */
    +/* begin file generic/stage2/tape_builder.h for arm64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +namespace stage2 {
    +
    +struct tape_builder {
    +  template
    +  simdjson_warn_unused static simdjson_inline error_code parse_document(
    +    dom_parser_implementation &dom_parser,
    +    dom::document &doc) noexcept;
    +
    +  /** Called when a non-empty document starts. */
    +  simdjson_warn_unused simdjson_inline error_code visit_document_start(json_iterator &iter) noexcept;
    +  /** Called when a non-empty document ends without error. */
    +  simdjson_warn_unused simdjson_inline error_code visit_document_end(json_iterator &iter) noexcept;
    +
    +  /** Called when a non-empty array starts. */
    +  simdjson_warn_unused simdjson_inline error_code visit_array_start(json_iterator &iter) noexcept;
    +  /** Called when a non-empty array ends. */
    +  simdjson_warn_unused simdjson_inline error_code visit_array_end(json_iterator &iter) noexcept;
    +  /** Called when an empty array is found. */
    +  simdjson_warn_unused simdjson_inline error_code visit_empty_array(json_iterator &iter) noexcept;
    +
    +  /** Called when a non-empty object starts. */
    +  simdjson_warn_unused simdjson_inline error_code visit_object_start(json_iterator &iter) noexcept;
    +  /**
    +   * Called when a key in a field is encountered.
    +   *
    +   * primitive, visit_object_start, visit_empty_object, visit_array_start, or visit_empty_array
    +   * will be called after this with the field value.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code visit_key(json_iterator &iter, const uint8_t *key) noexcept;
    +  /** Called when a non-empty object ends. */
    +  simdjson_warn_unused simdjson_inline error_code visit_object_end(json_iterator &iter) noexcept;
    +  /** Called when an empty object is found. */
    +  simdjson_warn_unused simdjson_inline error_code visit_empty_object(json_iterator &iter) noexcept;
    +
    +  /**
    +   * Called when a string, number, boolean or null is found.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code visit_primitive(json_iterator &iter, const uint8_t *value) noexcept;
    +  /**
    +   * Called when a string, number, boolean or null is found at the top level of a document (i.e.
    +   * when there is no array or object and the entire document is a single string, number, boolean or
    +   * null.
    +   *
    +   * This is separate from primitive() because simdjson's normal primitive parsing routines assume
    +   * there is at least one more token after the value, which is only true in an array or object.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code visit_root_primitive(json_iterator &iter, const uint8_t *value) noexcept;
    +
    +  simdjson_warn_unused simdjson_inline error_code visit_string(json_iterator &iter, const uint8_t *value, bool key = false) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_number(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_true_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_false_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_null_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +
    +  simdjson_warn_unused simdjson_inline error_code visit_root_string(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_number(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_true_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_false_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_null_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +
    +  /** Called each time a new field or element in an array or object is found. */
    +  simdjson_warn_unused simdjson_inline error_code increment_count(json_iterator &iter) noexcept;
    +
    +  /** Next location to write to tape */
    +  tape_writer tape;
    +private:
    +  /** Next write location in the string buf for stage 2 parsing */
    +  uint8_t *current_string_buf_loc;
    +
    +  simdjson_inline tape_builder(dom::document &doc) noexcept;
    +
    +  simdjson_inline uint32_t next_tape_index(json_iterator &iter) const noexcept;
    +  simdjson_inline void start_container(json_iterator &iter) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code end_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code empty_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept;
    +  simdjson_inline uint8_t *on_start_string(json_iterator &iter) noexcept;
    +  simdjson_inline void on_end_string(uint8_t *dst) noexcept;
    +}; // struct tape_builder
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code tape_builder::parse_document(
    +    dom_parser_implementation &dom_parser,
    +    dom::document &doc) noexcept {
    +  dom_parser.doc = &doc;
    +  json_iterator iter(dom_parser, STREAMING ? dom_parser.next_structural_index : 0);
    +  tape_builder builder(doc);
    +  return iter.walk_document(builder);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_primitive(json_iterator &iter, const uint8_t *value) noexcept {
    +  return iter.visit_root_primitive(*this, value);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_primitive(json_iterator &iter, const uint8_t *value) noexcept {
    +  return iter.visit_primitive(*this, value);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_empty_object(json_iterator &iter) noexcept {
    +  return empty_container(iter, internal::tape_type::START_OBJECT, internal::tape_type::END_OBJECT);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_empty_array(json_iterator &iter) noexcept {
    +  return empty_container(iter, internal::tape_type::START_ARRAY, internal::tape_type::END_ARRAY);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_document_start(json_iterator &iter) noexcept {
    +  start_container(iter);
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_object_start(json_iterator &iter) noexcept {
    +  start_container(iter);
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_array_start(json_iterator &iter) noexcept {
    +  start_container(iter);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_object_end(json_iterator &iter) noexcept {
    +  return end_container(iter, internal::tape_type::START_OBJECT, internal::tape_type::END_OBJECT);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_array_end(json_iterator &iter) noexcept {
    +  return end_container(iter, internal::tape_type::START_ARRAY, internal::tape_type::END_ARRAY);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_document_end(json_iterator &iter) noexcept {
    +  constexpr uint32_t start_tape_index = 0;
    +  tape.append(start_tape_index, internal::tape_type::ROOT);
    +  tape_writer::write(iter.dom_parser.doc->tape[start_tape_index], next_tape_index(iter), internal::tape_type::ROOT);
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_key(json_iterator &iter, const uint8_t *key) noexcept {
    +  return visit_string(iter, key, true);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::increment_count(json_iterator &iter) noexcept {
    +  iter.dom_parser.open_containers[iter.depth].count++; // we have a key value pair in the object at parser.dom_parser.depth - 1
    +  return SUCCESS;
    +}
    +
    +simdjson_inline tape_builder::tape_builder(dom::document &doc) noexcept : tape{doc.tape.get()}, current_string_buf_loc{doc.string_buf.get()} {}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_string(json_iterator &iter, const uint8_t *value, bool key) noexcept {
    +  iter.log_value(key ? "key" : "string");
    +  uint8_t *dst = on_start_string(iter);
    +  dst = stringparsing::parse_string(value+1, dst, false); // We do not allow replacement when the escape characters are invalid.
    +  if (dst == nullptr) {
    +    iter.log_error("Invalid escape in string");
    +    return STRING_ERROR;
    +  }
    +  on_end_string(dst);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_string(json_iterator &iter, const uint8_t *value) noexcept {
    +  return visit_string(iter, value);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_number(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("number");
    +  return numberparsing::parse_number(value, tape);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_number(json_iterator &iter, const uint8_t *value) noexcept {
    +  //
    +  // We need to make a copy to make sure that the string is space terminated.
    +  // This is not about padding the input, which should already padded up
    +  // to len + SIMDJSON_PADDING. However, we have no control at this stage
    +  // on how the padding was done. What if the input string was padded with nulls?
    +  // It is quite common for an input string to have an extra null character (C string).
    +  // We do not want to allow 9\0 (where \0 is the null character) inside a JSON
    +  // document, but the string "9\0" by itself is fine. So we make a copy and
    +  // pad the input with spaces when we know that there is just one input element.
    +  // This copy is relatively expensive, but it will almost never be called in
    +  // practice unless you are in the strange scenario where you have many JSON
    +  // documents made of single atoms.
    +  //
    +  std::unique_ptrcopy(new (std::nothrow) uint8_t[iter.remaining_len() + SIMDJSON_PADDING]);
    +  if (copy.get() == nullptr) { return MEMALLOC; }
    +  std::memcpy(copy.get(), value, iter.remaining_len());
    +  std::memset(copy.get() + iter.remaining_len(), ' ', SIMDJSON_PADDING);
    +  error_code error = visit_number(iter, copy.get());
    +  return error;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_true_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("true");
    +  if (!atomparsing::is_valid_true_atom(value)) { return T_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::TRUE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_true_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("true");
    +  if (!atomparsing::is_valid_true_atom(value, iter.remaining_len())) { return T_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::TRUE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_false_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("false");
    +  if (!atomparsing::is_valid_false_atom(value)) { return F_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::FALSE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_false_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("false");
    +  if (!atomparsing::is_valid_false_atom(value, iter.remaining_len())) { return F_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::FALSE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_null_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("null");
    +  if (!atomparsing::is_valid_null_atom(value)) { return N_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::NULL_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_null_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("null");
    +  if (!atomparsing::is_valid_null_atom(value, iter.remaining_len())) { return N_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::NULL_VALUE);
    +  return SUCCESS;
    +}
    +
    +// private:
    +
    +simdjson_inline uint32_t tape_builder::next_tape_index(json_iterator &iter) const noexcept {
    +  return uint32_t(tape.next_tape_loc - iter.dom_parser.doc->tape.get());
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::empty_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept {
    +  auto start_index = next_tape_index(iter);
    +  tape.append(start_index+2, start);
    +  tape.append(start_index, end);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline void tape_builder::start_container(json_iterator &iter) noexcept {
    +  iter.dom_parser.open_containers[iter.depth].tape_index = next_tape_index(iter);
    +  iter.dom_parser.open_containers[iter.depth].count = 0;
    +  tape.skip(); // We don't actually *write* the start element until the end.
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::end_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept {
    +  // Write the ending tape element, pointing at the start location
    +  const uint32_t start_tape_index = iter.dom_parser.open_containers[iter.depth].tape_index;
    +  tape.append(start_tape_index, end);
    +  // Write the start tape element, pointing at the end location (and including count)
    +  // count can overflow if it exceeds 24 bits... so we saturate
    +  // the convention being that a cnt of 0xffffff or more is undetermined in value (>=  0xffffff).
    +  const uint32_t count = iter.dom_parser.open_containers[iter.depth].count;
    +  const uint32_t cntsat = count > 0xFFFFFF ? 0xFFFFFF : count;
    +  tape_writer::write(iter.dom_parser.doc->tape[start_tape_index], next_tape_index(iter) | (uint64_t(cntsat) << 32), start);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline uint8_t *tape_builder::on_start_string(json_iterator &iter) noexcept {
    +  // we advance the point, accounting for the fact that we have a NULL termination
    +  tape.append(current_string_buf_loc - iter.dom_parser.doc->string_buf.get(), internal::tape_type::STRING);
    +  return current_string_buf_loc + sizeof(uint32_t);
    +}
    +
    +simdjson_inline void tape_builder::on_end_string(uint8_t *dst) noexcept {
    +  uint32_t str_length = uint32_t(dst - (current_string_buf_loc + sizeof(uint32_t)));
    +  // TODO check for overflow in case someone has a crazy string (>=4GB?)
    +  // But only add the overflow check when the document itself exceeds 4GB
    +  // Currently unneeded because we refuse to parse docs larger or equal to 4GB.
    +  memcpy(current_string_buf_loc, &str_length, sizeof(uint32_t));
    +  // NULL termination is still handy if you expect all your strings to
    +  // be NULL terminated? It comes at a small cost
    +  *dst = 0;
    +  current_string_buf_loc = dst + 1;
    +}
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H
    +/* end file generic/stage2/tape_builder.h for arm64 */
    +/* end file generic/stage2/amalgamated.h for arm64 */
    +
    +//
    +// Stage 1
    +//
    +namespace simdjson {
    +namespace arm64 {
    +
    +simdjson_warn_unused error_code implementation::create_dom_parser_implementation(
    +  size_t capacity,
    +  size_t max_depth,
    +  std::unique_ptr& dst
    +) const noexcept {
    +  dst.reset( new (std::nothrow) dom_parser_implementation() );
    +  if (!dst) { return MEMALLOC; }
    +  if (auto err = dst->set_capacity(capacity))
    +    return err;
    +  if (auto err = dst->set_max_depth(max_depth))
    +    return err;
    +  return SUCCESS;
    +}
    +
    +namespace {
    +
    +using namespace simd;
    +
    +simdjson_inline json_character_block json_character_block::classify(const simd::simd8x64& in) {
    +  // Functional programming causes trouble with Visual Studio.
    +  // Keeping this version in comments since it is much nicer:
    +  // auto v = in.map([&](simd8 chunk) {
    +  //  auto nib_lo = chunk & 0xf;
    +  //  auto nib_hi = chunk.shr<4>();
    +  //  auto shuf_lo = nib_lo.lookup_16(16, 0, 0, 0, 0, 0, 0, 0, 0, 8, 12, 1, 2, 9, 0, 0);
    +  //  auto shuf_hi = nib_hi.lookup_16(8, 0, 18, 4, 0, 1, 0, 1, 0, 0, 0, 3, 2, 1, 0, 0);
    +  //  return shuf_lo & shuf_hi;
    +  // });
    +  const simd8 table1(16, 0, 0, 0, 0, 0, 0, 0, 0, 8, 12, 1, 2, 9, 0, 0);
    +  const simd8 table2(8, 0, 18, 4, 0, 1, 0, 1, 0, 0, 0, 3, 2, 1, 0, 0);
    +
    +  simd8x64 v(
    +     (in.chunks[0] & 0xf).lookup_16(table1) & (in.chunks[0].shr<4>()).lookup_16(table2),
    +     (in.chunks[1] & 0xf).lookup_16(table1) & (in.chunks[1].shr<4>()).lookup_16(table2),
    +     (in.chunks[2] & 0xf).lookup_16(table1) & (in.chunks[2].shr<4>()).lookup_16(table2),
    +     (in.chunks[3] & 0xf).lookup_16(table1) & (in.chunks[3].shr<4>()).lookup_16(table2)
    +  );
    +
    +
    +  // We compute whitespace and op separately. If the code later only use one or the
    +  // other, given the fact that all functions are aggressively inlined, we can
    +  // hope that useless computations will be omitted. This is namely case when
    +  // minifying (we only need whitespace). *However* if we only need spaces,
    +  // it is likely that we will still compute 'v' above with two lookup_16: one
    +  // could do it a bit cheaper. This is in contrast with the x64 implementations
    +  // where we can, efficiently, do the white space and structural matching
    +  // separately. One reason for this difference is that on ARM NEON, the table
    +  // lookups either zero or leave unchanged the characters exceeding 0xF whereas
    +  // on x64, the equivalent instruction (pshufb) automatically applies a mask,
    +  // ignoring the 4 most significant bits. Thus the x64 implementation is
    +  // optimized differently. This being said, if you use this code strictly
    +  // just for minification (or just to identify the structural characters),
    +  // there is a small untaken optimization opportunity here. We deliberately
    +  // do not pick it up.
    +
    +  uint64_t op = simd8x64(
    +        v.chunks[0].any_bits_set(0x7),
    +        v.chunks[1].any_bits_set(0x7),
    +        v.chunks[2].any_bits_set(0x7),
    +        v.chunks[3].any_bits_set(0x7)
    +  ).to_bitmask();
    +
    +  uint64_t whitespace = simd8x64(
    +        v.chunks[0].any_bits_set(0x18),
    +        v.chunks[1].any_bits_set(0x18),
    +        v.chunks[2].any_bits_set(0x18),
    +        v.chunks[3].any_bits_set(0x18)
    +  ).to_bitmask();
    +
    +  return { whitespace, op };
    +}
    +
    +simdjson_inline bool is_ascii(const simd8x64& input) {
    +    simd8 bits = input.reduce_or();
    +    return bits.max_val() < 0x80u;
    +}
    +
    +simdjson_unused simdjson_inline simd8 must_be_continuation(const simd8 prev1, const simd8 prev2, const simd8 prev3) {
    +    simd8 is_second_byte = prev1 >= uint8_t(0xc0u);
    +    simd8 is_third_byte  = prev2 >= uint8_t(0xe0u);
    +    simd8 is_fourth_byte = prev3 >= uint8_t(0xf0u);
    +    // Use ^ instead of | for is_*_byte, because ^ is commutative, and the caller is using ^ as well.
    +    // This will work fine because we only have to report errors for cases with 0-1 lead bytes.
    +    // Multiple lead bytes implies 2 overlapping multibyte characters, and if that happens, there is
    +    // guaranteed to be at least *one* lead byte that is part of only 1 other multibyte character.
    +    // The error will be detected there.
    +    return is_second_byte ^ is_third_byte ^ is_fourth_byte;
    +}
    +
    +simdjson_inline simd8 must_be_2_3_continuation(const simd8 prev2, const simd8 prev3) {
    +    simd8 is_third_byte  = prev2 >= uint8_t(0xe0u);
    +    simd8 is_fourth_byte = prev3 >= uint8_t(0xf0u);
    +    return is_third_byte ^ is_fourth_byte;
    +}
    +
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +//
    +// Stage 2
    +//
    +
    +//
    +// Implementation-specific overrides
    +//
    +namespace simdjson {
    +namespace arm64 {
    +
    +simdjson_warn_unused error_code implementation::minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept {
    +  return arm64::stage1::json_minifier::minify<64>(buf, len, dst, dst_len);
    +}
    +
    +simdjson_warn_unused error_code dom_parser_implementation::stage1(const uint8_t *_buf, size_t _len, stage1_mode streaming) noexcept {
    +  this->buf = _buf;
    +  this->len = _len;
    +  return arm64::stage1::json_structural_indexer::index<64>(buf, len, *this, streaming);
    +}
    +
    +simdjson_warn_unused bool implementation::validate_utf8(const char *buf, size_t len) const noexcept {
    +  return arm64::stage1::generic_validate_utf8(buf,len);
    +}
    +
    +simdjson_warn_unused error_code dom_parser_implementation::stage2(dom::document &_doc) noexcept {
    +  return stage2::tape_builder::parse_document(*this, _doc);
    +}
    +
    +simdjson_warn_unused error_code dom_parser_implementation::stage2_next(dom::document &_doc) noexcept {
    +  return stage2::tape_builder::parse_document(*this, _doc);
    +}
    +
    +simdjson_warn_unused uint8_t *dom_parser_implementation::parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) const noexcept {
    +  return arm64::stringparsing::parse_string(src, dst, allow_replacement);
    +}
    +
    +simdjson_warn_unused uint8_t *dom_parser_implementation::parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept {
    +  return arm64::stringparsing::parse_wobbly_string(src, dst);
    +}
    +
    +simdjson_warn_unused error_code dom_parser_implementation::parse(const uint8_t *_buf, size_t _len, dom::document &_doc) noexcept {
    +  auto error = stage1(_buf, _len, stage1_mode::regular);
    +  if (error) { return error; }
    +  return stage2(_doc);
    +}
    +
    +} // namespace arm64
    +} // namespace simdjson
    +
    +/* including simdjson/arm64/end.h: #include  */
    +/* begin file simdjson/arm64/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT
    +/* undefining SIMDJSON_IMPLEMENTATION from "arm64" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/arm64/end.h */
    +
    +#endif // SIMDJSON_SRC_ARM64_CPP
    +/* end file arm64.cpp */
    +#endif
    +#if SIMDJSON_IMPLEMENTATION_FALLBACK
    +/* including fallback.cpp: #include  */
    +/* begin file fallback.cpp */
    +#ifndef SIMDJSON_SRC_FALLBACK_CPP
    +#define SIMDJSON_SRC_FALLBACK_CPP
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +/* including simdjson/fallback.h: #include  */
    +/* begin file simdjson/fallback.h */
    +#ifndef SIMDJSON_FALLBACK_H
    +#define SIMDJSON_FALLBACK_H
    +
    +/* including simdjson/fallback/begin.h: #include "simdjson/fallback/begin.h" */
    +/* begin file simdjson/fallback/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "fallback" */
    +#define SIMDJSON_IMPLEMENTATION fallback
    +/* including simdjson/fallback/base.h: #include "simdjson/fallback/base.h" */
    +/* begin file simdjson/fallback/base.h */
    +#ifndef SIMDJSON_FALLBACK_BASE_H
    +#define SIMDJSON_FALLBACK_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +/**
    + * Fallback implementation (runs on any machine).
    + */
    +namespace fallback {
    +
    +class implementation;
    +
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_FALLBACK_BASE_H
    +/* end file simdjson/fallback/base.h */
    +/* including simdjson/fallback/bitmanipulation.h: #include "simdjson/fallback/bitmanipulation.h" */
    +/* begin file simdjson/fallback/bitmanipulation.h */
    +#ifndef SIMDJSON_FALLBACK_BITMANIPULATION_H
    +#define SIMDJSON_FALLBACK_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace {
    +
    +#if defined(_MSC_VER) && !defined(_M_ARM64) && !defined(_M_X64)
    +static inline unsigned char _BitScanForward64(unsigned long* ret, uint64_t x) {
    +  unsigned long x0 = (unsigned long)x, top, bottom;
    +  _BitScanForward(&top, (unsigned long)(x >> 32));
    +  _BitScanForward(&bottom, x0);
    +  *ret = x0 ? bottom : 32 + top;
    +  return x != 0;
    +}
    +static unsigned char _BitScanReverse64(unsigned long* ret, uint64_t x) {
    +  unsigned long x1 = (unsigned long)(x >> 32), top, bottom;
    +  _BitScanReverse(&top, x1);
    +  _BitScanReverse(&bottom, (unsigned long)x);
    +  *ret = x1 ? top + 32 : bottom;
    +  return x != 0;
    +}
    +#endif
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +#ifdef _MSC_VER
    +  unsigned long leading_zero = 0;
    +  // Search the mask data from most significant bit (MSB)
    +  // to least significant bit (LSB) for a set bit (1).
    +  if (_BitScanReverse64(&leading_zero, input_num))
    +    return (int)(63 - leading_zero);
    +  else
    +    return 64;
    +#else
    +  return __builtin_clzll(input_num);
    +#endif// _MSC_VER
    +}
    +
    +} // unnamed namespace
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_FALLBACK_BITMANIPULATION_H
    +/* end file simdjson/fallback/bitmanipulation.h */
    +/* including simdjson/fallback/stringparsing_defs.h: #include "simdjson/fallback/stringparsing_defs.h" */
    +/* begin file simdjson/fallback/stringparsing_defs.h */
    +#ifndef SIMDJSON_FALLBACK_STRINGPARSING_DEFS_H
    +#define SIMDJSON_FALLBACK_STRINGPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace {
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 1;
    +  simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() { return c == '"'; }
    +  simdjson_inline bool has_backslash() { return c == '\\'; }
    +  simdjson_inline int quote_index() { return c == '"' ? 0 : 1; }
    +  simdjson_inline int backslash_index() { return c == '\\' ? 0 : 1; }
    +
    +  uint8_t c;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // store to dest unconditionally - we can overwrite the bits we don't like later
    +  dst[0] = src[0];
    +  return { src[0] };
    +}
    +
    +} // unnamed namespace
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_FALLBACK_STRINGPARSING_DEFS_H
    +/* end file simdjson/fallback/stringparsing_defs.h */
    +/* including simdjson/fallback/numberparsing_defs.h: #include "simdjson/fallback/numberparsing_defs.h" */
    +/* begin file simdjson/fallback/numberparsing_defs.h */
    +#ifndef SIMDJSON_FALLBACK_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_FALLBACK_NUMBERPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +#ifdef JSON_TEST_NUMBERS // for unit testing
    +void found_invalid_number(const uint8_t *buf);
    +void found_integer(int64_t result, const uint8_t *buf);
    +void found_unsigned_integer(uint64_t result, const uint8_t *buf);
    +void found_float(double result, const uint8_t *buf);
    +#endif
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace numberparsing {
    +
    +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const char *chars) {
    +  uint64_t val;
    +  memcpy(&val, chars, sizeof(uint64_t));
    +  val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8;
    +  val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16;
    +  return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32);
    +}
    +
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  return parse_eight_digits_unrolled(reinterpret_cast(chars));
    +}
    +
    +#if SIMDJSON_IS_32BITS // _umul128 for x86, arm
    +// this is a slow emulation routine for 32-bit
    +//
    +static simdjson_inline uint64_t __emulu(uint32_t x, uint32_t y) {
    +  return x * (uint64_t)y;
    +}
    +static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) {
    +  uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd);
    +  uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd);
    +  uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32));
    +  uint64_t adbc_carry = !!(adbc < ad);
    +  uint64_t lo = bd + (adbc << 32);
    +  *hi = __emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) +
    +        (adbc_carry << 32) + !!(lo < bd);
    +  return lo;
    +}
    +#endif
    +
    +/** @private */
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif // SIMDJSON_FALLBACK_NUMBERPARSING_DEFS_H
    +/* end file simdjson/fallback/numberparsing_defs.h */
    +/* end file simdjson/fallback/begin.h */
    +/* including simdjson/generic/amalgamated.h for fallback: #include "simdjson/generic/amalgamated.h" */
    +/* begin file simdjson/generic/amalgamated.h for fallback */
    +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_DEPENDENCIES_H)
    +#error simdjson/generic/dependencies.h must be included before simdjson/generic/amalgamated.h!
    +#endif
    +
    +/* including simdjson/generic/base.h for fallback: #include "simdjson/generic/base.h" */
    +/* begin file simdjson/generic/base.h for fallback */
    +#ifndef SIMDJSON_GENERIC_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): // If we haven't got an implementation yet, we're in the editor, editing a generic file! Just */
    +/* amalgamation skipped (editor-only): // use the most advanced one we can so the most possible stuff can be tested. */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation_detection.h" */
    +/* amalgamation skipped (editor-only): #if SIMDJSON_IMPLEMENTATION_ICELAKE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_HASWELL */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_WESTMERE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_ARM64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */
    +/* amalgamation skipped (editor-only): #else */
    +/* amalgamation skipped (editor-only): #error "All possible implementations (including fallback) have been disabled! simdjson will not run." */
    +/* amalgamation skipped (editor-only): #endif */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +
    +struct open_container;
    +class dom_parser_implementation;
    +
    +/**
    + * The type of a JSON number
    + */
    +enum class number_type {
    +    floating_point_number=1, /// a binary64 number
    +    signed_integer,          /// a signed integer that fits in a 64-bit word using two's complement
    +    unsigned_integer         /// a positive integer larger or equal to 1<<63
    +};
    +
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_BASE_H
    +/* end file simdjson/generic/base.h for fallback */
    +/* including simdjson/generic/jsoncharutils.h for fallback: #include "simdjson/generic/jsoncharutils.h" */
    +/* begin file simdjson/generic/jsoncharutils.h for fallback */
    +#ifndef SIMDJSON_GENERIC_JSONCHARUTILS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_JSONCHARUTILS_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/jsoncharutils_tables.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace {
    +namespace jsoncharutils {
    +
    +// return non-zero if not a structural or whitespace char
    +// zero otherwise
    +simdjson_inline uint32_t is_not_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace_negated[c];
    +}
    +
    +simdjson_inline uint32_t is_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace[c];
    +}
    +
    +// returns a value with the high 16 bits set if not valid
    +// otherwise returns the conversion of the 4 hex digits at src into the bottom
    +// 16 bits of the 32-bit return register
    +//
    +// see
    +// https://lemire.me/blog/2019/04/17/parsing-short-hexadecimal-strings-efficiently/
    +static inline uint32_t hex_to_u32_nocheck(
    +    const uint8_t *src) { // strictly speaking, static inline is a C-ism
    +  uint32_t v1 = internal::digit_to_val32[630 + src[0]];
    +  uint32_t v2 = internal::digit_to_val32[420 + src[1]];
    +  uint32_t v3 = internal::digit_to_val32[210 + src[2]];
    +  uint32_t v4 = internal::digit_to_val32[0 + src[3]];
    +  return v1 | v2 | v3 | v4;
    +}
    +
    +// given a code point cp, writes to c
    +// the utf-8 code, outputting the length in
    +// bytes, if the length is zero, the code point
    +// is invalid
    +//
    +// This can possibly be made faster using pdep
    +// and clz and table lookups, but JSON documents
    +// have few escaped code points, and the following
    +// function looks cheap.
    +//
    +// Note: we assume that surrogates are treated separately
    +//
    +simdjson_inline size_t codepoint_to_utf8(uint32_t cp, uint8_t *c) {
    +  if (cp <= 0x7F) {
    +    c[0] = uint8_t(cp);
    +    return 1; // ascii
    +  }
    +  if (cp <= 0x7FF) {
    +    c[0] = uint8_t((cp >> 6) + 192);
    +    c[1] = uint8_t((cp & 63) + 128);
    +    return 2; // universal plane
    +    //  Surrogates are treated elsewhere...
    +    //} //else if (0xd800 <= cp && cp <= 0xdfff) {
    +    //  return 0; // surrogates // could put assert here
    +  } else if (cp <= 0xFFFF) {
    +    c[0] = uint8_t((cp >> 12) + 224);
    +    c[1] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[2] = uint8_t((cp & 63) + 128);
    +    return 3;
    +  } else if (cp <= 0x10FFFF) { // if you know you have a valid code point, this
    +                               // is not needed
    +    c[0] = uint8_t((cp >> 18) + 240);
    +    c[1] = uint8_t(((cp >> 12) & 63) + 128);
    +    c[2] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[3] = uint8_t((cp & 63) + 128);
    +    return 4;
    +  }
    +  // will return 0 when the code point was too large.
    +  return 0; // bad r
    +}
    +
    +#if SIMDJSON_IS_32BITS // _umul128 for x86, arm
    +// this is a slow emulation routine for 32-bit
    +//
    +static simdjson_inline uint64_t __emulu(uint32_t x, uint32_t y) {
    +  return x * (uint64_t)y;
    +}
    +static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) {
    +  uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd);
    +  uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd);
    +  uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32));
    +  uint64_t adbc_carry = !!(adbc < ad);
    +  uint64_t lo = bd + (adbc << 32);
    +  *hi = __emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) +
    +        (adbc_carry << 32) + !!(lo < bd);
    +  return lo;
    +}
    +#endif
    +
    +} // namespace jsoncharutils
    +} // unnamed namespace
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_JSONCHARUTILS_H
    +/* end file simdjson/generic/jsoncharutils.h for fallback */
    +/* including simdjson/generic/atomparsing.h for fallback: #include "simdjson/generic/atomparsing.h" */
    +/* begin file simdjson/generic/atomparsing.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ATOMPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ATOMPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace {
    +/// @private
    +namespace atomparsing {
    +
    +// The string_to_uint32 is exclusively used to map literal strings to 32-bit values.
    +// We use memcpy instead of a pointer cast to avoid undefined behaviors since we cannot
    +// be certain that the character pointer will be properly aligned.
    +// You might think that using memcpy makes this function expensive, but you'd be wrong.
    +// All decent optimizing compilers (GCC, clang, Visual Studio) will compile string_to_uint32("false");
    +// to the compile-time constant 1936482662.
    +simdjson_inline uint32_t string_to_uint32(const char* str) { uint32_t val; std::memcpy(&val, str, sizeof(uint32_t)); return val; }
    +
    +
    +// Again in str4ncmp we use a memcpy to avoid undefined behavior. The memcpy may appear expensive.
    +// Yet all decent optimizing compilers will compile memcpy to a single instruction, just about.
    +simdjson_warn_unused
    +simdjson_inline uint32_t str4ncmp(const uint8_t *src, const char* atom) {
    +  uint32_t srcval; // we want to avoid unaligned 32-bit loads (undefined in C/C++)
    +  static_assert(sizeof(uint32_t) <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be larger than 4 bytes");
    +  std::memcpy(&srcval, src, sizeof(uint32_t));
    +  return srcval ^ string_to_uint32(atom);
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "true") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_true_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "true"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src) {
    +  return (str4ncmp(src+1, "alse") | jsoncharutils::is_not_structural_or_whitespace(src[5])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src, size_t len) {
    +  if (len > 5) { return is_valid_false_atom(src); }
    +  else if (len == 5) { return !str4ncmp(src+1, "alse"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "null") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_null_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "null"); }
    +  else { return false; }
    +}
    +
    +} // namespace atomparsing
    +} // unnamed namespace
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ATOMPARSING_H
    +/* end file simdjson/generic/atomparsing.h for fallback */
    +/* including simdjson/generic/dom_parser_implementation.h for fallback: #include "simdjson/generic/dom_parser_implementation.h" */
    +/* begin file simdjson/generic/dom_parser_implementation.h for fallback */
    +#ifndef SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +
    +// expectation: sizeof(open_container) = 64/8.
    +struct open_container {
    +  uint32_t tape_index; // where, on the tape, does the scope ([,{) begins
    +  uint32_t count; // how many elements in the scope
    +}; // struct open_container
    +
    +static_assert(sizeof(open_container) == 64/8, "Open container must be 64 bits");
    +
    +class dom_parser_implementation final : public internal::dom_parser_implementation {
    +public:
    +  /** Tape location of each open { or [ */
    +  std::unique_ptr open_containers{};
    +  /** Whether each open container is a [ or { */
    +  std::unique_ptr is_array{};
    +  /** Buffer passed to stage 1 */
    +  const uint8_t *buf{};
    +  /** Length passed to stage 1 */
    +  size_t len{0};
    +  /** Document passed to stage 2 */
    +  dom::document *doc{};
    +
    +  inline dom_parser_implementation() noexcept;
    +  inline dom_parser_implementation(dom_parser_implementation &&other) noexcept;
    +  inline dom_parser_implementation &operator=(dom_parser_implementation &&other) noexcept;
    +  dom_parser_implementation(const dom_parser_implementation &) = delete;
    +  dom_parser_implementation &operator=(const dom_parser_implementation &) = delete;
    +
    +  simdjson_warn_unused error_code parse(const uint8_t *buf, size_t len, dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage1(const uint8_t *buf, size_t len, stage1_mode partial) noexcept final;
    +  simdjson_warn_unused error_code stage2(dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage2_next(dom::document &doc) noexcept final;
    +  simdjson_warn_unused uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) const noexcept final;
    +  simdjson_warn_unused uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept final;
    +  inline simdjson_warn_unused error_code set_capacity(size_t capacity) noexcept final;
    +  inline simdjson_warn_unused error_code set_max_depth(size_t max_depth) noexcept final;
    +private:
    +  simdjson_inline simdjson_warn_unused error_code set_capacity_stage1(size_t capacity);
    +
    +};
    +
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +namespace fallback {
    +
    +inline dom_parser_implementation::dom_parser_implementation() noexcept = default;
    +inline dom_parser_implementation::dom_parser_implementation(dom_parser_implementation &&other) noexcept = default;
    +inline dom_parser_implementation &dom_parser_implementation::operator=(dom_parser_implementation &&other) noexcept = default;
    +
    +// Leaving these here so they can be inlined if so desired
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_capacity(size_t capacity) noexcept {
    +  if(capacity > SIMDJSON_MAXSIZE_BYTES) { return CAPACITY; }
    +  // Stage 1 index output
    +  size_t max_structures = SIMDJSON_ROUNDUP_N(capacity, 64) + 2 + 7;
    +  structural_indexes.reset( new (std::nothrow) uint32_t[max_structures] );
    +  if (!structural_indexes) { _capacity = 0; return MEMALLOC; }
    +  structural_indexes[0] = 0;
    +  n_structural_indexes = 0;
    +
    +  _capacity = capacity;
    +  return SUCCESS;
    +}
    +
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_max_depth(size_t max_depth) noexcept {
    +  // Stage 2 stacks
    +  open_containers.reset(new (std::nothrow) open_container[max_depth]);
    +  is_array.reset(new (std::nothrow) bool[max_depth]);
    +  if (!is_array || !open_containers) { _max_depth = 0; return MEMALLOC; }
    +
    +  _max_depth = max_depth;
    +  return SUCCESS;
    +}
    +
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +/* end file simdjson/generic/dom_parser_implementation.h for fallback */
    +/* including simdjson/generic/implementation_simdjson_result_base.h for fallback: #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base.h for fallback */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +
    +// This is a near copy of include/error.h's implementation_simdjson_result_base, except it doesn't use std::pair
    +// so we can avoid inlining errors
    +// TODO reconcile these!
    +/**
    + * The result of a simdjson operation that could fail.
    + *
    + * Gives the option of reading error codes, or throwing an exception by casting to the desired result.
    + *
    + * This is a base class for implementations that want to add functions to the result type for
    + * chaining.
    + *
    + * Override like:
    + *
    + *   struct simdjson_result : public internal::implementation_simdjson_result_base {
    + *     simdjson_result() noexcept : internal::implementation_simdjson_result_base() {}
    + *     simdjson_result(error_code error) noexcept : internal::implementation_simdjson_result_base(error) {}
    + *     simdjson_result(T &&value) noexcept : internal::implementation_simdjson_result_base(std::forward(value)) {}
    + *     simdjson_result(T &&value, error_code error) noexcept : internal::implementation_simdjson_result_base(value, error) {}
    + *     // Your extra methods here
    + *   }
    + *
    + * Then any method returning simdjson_result will be chainable with your methods.
    + */
    +template
    +struct implementation_simdjson_result_base {
    +
    +  /**
    +   * Create a new empty result with error = UNINITIALIZED.
    +   */
    +  simdjson_inline implementation_simdjson_result_base() noexcept = default;
    +
    +  /**
    +   * Create a new error result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(error_code error) noexcept;
    +
    +  /**
    +   * Create a new successful result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value) noexcept;
    +
    +  /**
    +   * Create a new result with both things (use if you don't want to branch when creating the result).
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value, error_code error) noexcept;
    +
    +  /**
    +   * Move the value and the error to the provided variables.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   * @param error The variable to assign the error to. Set to SUCCESS if there is no error.
    +   */
    +  simdjson_inline void tie(T &value, error_code &error) && noexcept;
    +
    +  /**
    +   * Move the value to the provided variable.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   */
    +  simdjson_inline error_code get(T &value) && noexcept;
    +
    +  /**
    +   * The error.
    +   */
    +  simdjson_inline error_code error() const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value.
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T& value() & noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& value() && noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& take_value() && noexcept(false);
    +
    +  /**
    +   * Cast to the value (will throw on error).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline operator T&&() && noexcept(false);
    +
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline const T& value_unsafe() const& noexcept;
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T& value_unsafe() & noexcept;
    +  /**
    +   * Take the result value (move it). This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T&& value_unsafe() && noexcept;
    +protected:
    +  /** users should never directly access first and second. **/
    +  T first{}; /** Users should never directly access 'first'. **/
    +  error_code second{UNINITIALIZED}; /** Users should never directly access 'second'. **/
    +}; // struct implementation_simdjson_result_base
    +
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +/* end file simdjson/generic/implementation_simdjson_result_base.h for fallback */
    +/* including simdjson/generic/numberparsing.h for fallback: #include "simdjson/generic/numberparsing.h" */
    +/* begin file simdjson/generic/numberparsing.h for fallback */
    +#ifndef SIMDJSON_GENERIC_NUMBERPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_NUMBERPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace numberparsing {
    +
    +#ifdef JSON_TEST_NUMBERS
    +#define INVALID_NUMBER(SRC) (found_invalid_number((SRC)), NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (found_integer((VALUE), (SRC)), (WRITER).append_s64((VALUE)))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (found_unsigned_integer((VALUE), (SRC)), (WRITER).append_u64((VALUE)))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (found_float((VALUE), (SRC)), (WRITER).append_double((VALUE)))
    +#else
    +#define INVALID_NUMBER(SRC) (NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (WRITER).append_s64((VALUE))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (WRITER).append_u64((VALUE))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (WRITER).append_double((VALUE))
    +#endif
    +
    +namespace {
    +
    +// Convert a mantissa, an exponent and a sign bit into an ieee64 double.
    +// The real_exponent needs to be in [0, 2046] (technically real_exponent = 2047 would be acceptable).
    +// The mantissa should be in [0,1<<53). The bit at index (1ULL << 52) while be zeroed.
    +simdjson_inline double to_double(uint64_t mantissa, uint64_t real_exponent, bool negative) {
    +    double d;
    +    mantissa &= ~(1ULL << 52);
    +    mantissa |= real_exponent << 52;
    +    mantissa |= ((static_cast(negative)) << 63);
    +    std::memcpy(&d, &mantissa, sizeof(d));
    +    return d;
    +}
    +
    +// Attempts to compute i * 10^(power) exactly; and if "negative" is
    +// true, negate the result.
    +// This function will only work in some cases, when it does not work, success is
    +// set to false. This should work *most of the time* (like 99% of the time).
    +// We assume that power is in the [smallest_power,
    +// largest_power] interval: the caller is responsible for this check.
    +simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative, double &d) {
    +  // we start with a fast path
    +  // It was described in
    +  // Clinger WD. How to read floating point numbers accurately.
    +  // ACM SIGPLAN Notices. 1990
    +#ifndef FLT_EVAL_METHOD
    +#error "FLT_EVAL_METHOD should be defined, please include cfloat."
    +#endif
    +#if (FLT_EVAL_METHOD != 1) && (FLT_EVAL_METHOD != 0)
    +  // We cannot be certain that x/y is rounded to nearest.
    +  if (0 <= power && power <= 22 && i <= 9007199254740991)
    +#else
    +  if (-22 <= power && power <= 22 && i <= 9007199254740991)
    +#endif
    +  {
    +    // convert the integer into a double. This is lossless since
    +    // 0 <= i <= 2^53 - 1.
    +    d = double(i);
    +    //
    +    // The general idea is as follows.
    +    // If 0 <= s < 2^53 and if 10^0 <= p <= 10^22 then
    +    // 1) Both s and p can be represented exactly as 64-bit floating-point
    +    // values
    +    // (binary64).
    +    // 2) Because s and p can be represented exactly as floating-point values,
    +    // then s * p
    +    // and s / p will produce correctly rounded values.
    +    //
    +    if (power < 0) {
    +      d = d / simdjson::internal::power_of_ten[-power];
    +    } else {
    +      d = d * simdjson::internal::power_of_ten[power];
    +    }
    +    if (negative) {
    +      d = -d;
    +    }
    +    return true;
    +  }
    +  // When 22 < power && power <  22 + 16, we could
    +  // hope for another, secondary fast path.  It was
    +  // described by David M. Gay in  "Correctly rounded
    +  // binary-decimal and decimal-binary conversions." (1990)
    +  // If you need to compute i * 10^(22 + x) for x < 16,
    +  // first compute i * 10^x, if you know that result is exact
    +  // (e.g., when i * 10^x < 2^53),
    +  // then you can still proceed and do (i * 10^x) * 10^22.
    +  // Is this worth your time?
    +  // You need  22 < power *and* power <  22 + 16 *and* (i * 10^(x-22) < 2^53)
    +  // for this second fast path to work.
    +  // If you you have 22 < power *and* power <  22 + 16, and then you
    +  // optimistically compute "i * 10^(x-22)", there is still a chance that you
    +  // have wasted your time if i * 10^(x-22) >= 2^53. It makes the use cases of
    +  // this optimization maybe less common than we would like. Source:
    +  // http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/
    +  // also used in RapidJSON: https://rapidjson.org/strtod_8h_source.html
    +
    +  // The fast path has now failed, so we are failing back on the slower path.
    +
    +  // In the slow path, we need to adjust i so that it is > 1<<63 which is always
    +  // possible, except if i == 0, so we handle i == 0 separately.
    +  if(i == 0) {
    +    d = negative ? -0.0 : 0.0;
    +    return true;
    +  }
    +
    +
    +  // The exponent is 1024 + 63 + power
    +  //     + floor(log(5**power)/log(2)).
    +  // The 1024 comes from the ieee64 standard.
    +  // The 63 comes from the fact that we use a 64-bit word.
    +  //
    +  // Computing floor(log(5**power)/log(2)) could be
    +  // slow. Instead we use a fast function.
    +  //
    +  // For power in (-400,350), we have that
    +  // (((152170 + 65536) * power ) >> 16);
    +  // is equal to
    +  //  floor(log(5**power)/log(2)) + power when power >= 0
    +  // and it is equal to
    +  //  ceil(log(5**-power)/log(2)) + power when power < 0
    +  //
    +  // The 65536 is (1<<16) and corresponds to
    +  // (65536 * power) >> 16 ---> power
    +  //
    +  // ((152170 * power ) >> 16) is equal to
    +  // floor(log(5**power)/log(2))
    +  //
    +  // Note that this is not magic: 152170/(1<<16) is
    +  // approximatively equal to log(5)/log(2).
    +  // The 1<<16 value is a power of two; we could use a
    +  // larger power of 2 if we wanted to.
    +  //
    +  int64_t exponent = (((152170 + 65536) * power) >> 16) + 1024 + 63;
    +
    +
    +  // We want the most significant bit of i to be 1. Shift if needed.
    +  int lz = leading_zeroes(i);
    +  i <<= lz;
    +
    +
    +  // We are going to need to do some 64-bit arithmetic to get a precise product.
    +  // We use a table lookup approach.
    +  // It is safe because
    +  // power >= smallest_power
    +  // and power <= largest_power
    +  // We recover the mantissa of the power, it has a leading 1. It is always
    +  // rounded down.
    +  //
    +  // We want the most significant 64 bits of the product. We know
    +  // this will be non-zero because the most significant bit of i is
    +  // 1.
    +  const uint32_t index = 2 * uint32_t(power - simdjson::internal::smallest_power);
    +  // Optimization: It may be that materializing the index as a variable might confuse some compilers and prevent effective complex-addressing loads. (Done for code clarity.)
    +  //
    +  // The full_multiplication function computes the 128-bit product of two 64-bit words
    +  // with a returned value of type value128 with a "low component" corresponding to the
    +  // 64-bit least significant bits of the product and with a "high component" corresponding
    +  // to the 64-bit most significant bits of the product.
    +  simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
    +  // Both i and power_of_five_128[index] have their most significant bit set to 1 which
    +  // implies that the either the most or the second most significant bit of the product
    +  // is 1. We pack values in this manner for efficiency reasons: it maximizes the use
    +  // we make of the product. It also makes it easy to reason about the product: there
    +  // is 0 or 1 leading zero in the product.
    +
    +  // Unless the least significant 9 bits of the high (64-bit) part of the full
    +  // product are all 1s, then we know that the most significant 55 bits are
    +  // exact and no further work is needed. Having 55 bits is necessary because
    +  // we need 53 bits for the mantissa but we have to have one rounding bit and
    +  // we can waste a bit if the most significant bit of the product is zero.
    +  if((firstproduct.high & 0x1FF) == 0x1FF) {
    +    // We want to compute i * 5^q, but only care about the top 55 bits at most.
    +    // Consider the scenario where q>=0. Then 5^q may not fit in 64-bits. Doing
    +    // the full computation is wasteful. So we do what is called a "truncated
    +    // multiplication".
    +    // We take the most significant 64-bits, and we put them in
    +    // power_of_five_128[index]. Usually, that's good enough to approximate i * 5^q
    +    // to the desired approximation using one multiplication. Sometimes it does not suffice.
    +    // Then we store the next most significant 64 bits in power_of_five_128[index + 1], and
    +    // then we get a better approximation to i * 5^q.
    +    //
    +    // That's for when q>=0. The logic for q<0 is somewhat similar but it is somewhat
    +    // more complicated.
    +    //
    +    // There is an extra layer of complexity in that we need more than 55 bits of
    +    // accuracy in the round-to-even scenario.
    +    //
    +    // The full_multiplication function computes the 128-bit product of two 64-bit words
    +    // with a returned value of type value128 with a "low component" corresponding to the
    +    // 64-bit least significant bits of the product and with a "high component" corresponding
    +    // to the 64-bit most significant bits of the product.
    +    simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
    +    firstproduct.low += secondproduct.high;
    +    if(secondproduct.high > firstproduct.low) { firstproduct.high++; }
    +    // As it has been proven by Noble Mushtak and Daniel Lemire in "Fast Number Parsing Without
    +    // Fallback" (https://arxiv.org/abs/2212.06644), at this point we are sure that the product
    +    // is sufficiently accurate, and more computation is not needed.
    +  }
    +  uint64_t lower = firstproduct.low;
    +  uint64_t upper = firstproduct.high;
    +  // The final mantissa should be 53 bits with a leading 1.
    +  // We shift it so that it occupies 54 bits with a leading 1.
    +  ///////
    +  uint64_t upperbit = upper >> 63;
    +  uint64_t mantissa = upper >> (upperbit + 9);
    +  lz += int(1 ^ upperbit);
    +
    +  // Here we have mantissa < (1<<54).
    +  int64_t real_exponent = exponent - lz;
    +  if (simdjson_unlikely(real_exponent <= 0)) { // we have a subnormal?
    +    // Here have that real_exponent <= 0 so -real_exponent >= 0
    +    if(-real_exponent + 1 >= 64) { // if we have more than 64 bits below the minimum exponent, you have a zero for sure.
    +      d = negative ? -0.0 : 0.0;
    +      return true;
    +    }
    +    // next line is safe because -real_exponent + 1 < 0
    +    mantissa >>= -real_exponent + 1;
    +    // Thankfully, we can't have both "round-to-even" and subnormals because
    +    // "round-to-even" only occurs for powers close to 0.
    +    mantissa += (mantissa & 1); // round up
    +    mantissa >>= 1;
    +    // There is a weird scenario where we don't have a subnormal but just.
    +    // Suppose we start with 2.2250738585072013e-308, we end up
    +    // with 0x3fffffffffffff x 2^-1023-53 which is technically subnormal
    +    // whereas 0x40000000000000 x 2^-1023-53  is normal. Now, we need to round
    +    // up 0x3fffffffffffff x 2^-1023-53  and once we do, we are no longer
    +    // subnormal, but we can only know this after rounding.
    +    // So we only declare a subnormal if we are smaller than the threshold.
    +    real_exponent = (mantissa < (uint64_t(1) << 52)) ? 0 : 1;
    +    d = to_double(mantissa, real_exponent, negative);
    +    return true;
    +  }
    +  // We have to round to even. The "to even" part
    +  // is only a problem when we are right in between two floats
    +  // which we guard against.
    +  // If we have lots of trailing zeros, we may fall right between two
    +  // floating-point values.
    +  //
    +  // The round-to-even cases take the form of a number 2m+1 which is in (2^53,2^54]
    +  // times a power of two. That is, it is right between a number with binary significand
    +  // m and another number with binary significand m+1; and it must be the case
    +  // that it cannot be represented by a float itself.
    +  //
    +  // We must have that w * 10 ^q == (2m+1) * 2^p for some power of two 2^p.
    +  // Recall that 10^q = 5^q * 2^q.
    +  // When q >= 0, we must have that (2m+1) is divible by 5^q, so 5^q <= 2^54. We have that
    +  //  5^23 <=  2^54 and it is the last power of five to qualify, so q <= 23.
    +  // When q<0, we have  w  >=  (2m+1) x 5^{-q}.  We must have that w<2^{64} so
    +  // (2m+1) x 5^{-q} < 2^{64}. We have that 2m+1>2^{53}. Hence, we must have
    +  // 2^{53} x 5^{-q} < 2^{64}.
    +  // Hence we have 5^{-q} < 2^{11}$ or q>= -4.
    +  //
    +  // We require lower <= 1 and not lower == 0 because we could not prove that
    +  // that lower == 0 is implied; but we could prove that lower <= 1 is a necessary and sufficient test.
    +  if (simdjson_unlikely((lower <= 1) && (power >= -4) && (power <= 23) && ((mantissa & 3) == 1))) {
    +    if((mantissa  << (upperbit + 64 - 53 - 2)) ==  upper) {
    +      mantissa &= ~1;             // flip it so that we do not round up
    +    }
    +  }
    +
    +  mantissa += mantissa & 1;
    +  mantissa >>= 1;
    +
    +  // Here we have mantissa < (1<<53), unless there was an overflow
    +  if (mantissa >= (1ULL << 53)) {
    +    //////////
    +    // This will happen when parsing values such as 7.2057594037927933e+16
    +    ////////
    +    mantissa = (1ULL << 52);
    +    real_exponent++;
    +  }
    +  mantissa &= ~(1ULL << 52);
    +  // we have to check that real_exponent is in range, otherwise we bail out
    +  if (simdjson_unlikely(real_exponent > 2046)) {
    +    // We have an infinite value!!! We could actually throw an error here if we could.
    +    return false;
    +  }
    +  d = to_double(mantissa, real_exponent, negative);
    +  return true;
    +}
    +
    +// We call a fallback floating-point parser that might be slow. Note
    +// it will accept JSON numbers, but the JSON spec. is more restrictive so
    +// before you call parse_float_fallback, you need to have validated the input
    +// string with the JSON grammar.
    +// It will return an error (false) if the parsed number is infinite.
    +// The string parsing itself always succeeds. We know that there is at least
    +// one digit.
    +static bool parse_float_fallback(const uint8_t *ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +static bool parse_float_fallback(const uint8_t *ptr, const uint8_t *end_ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr), reinterpret_cast(end_ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +// check quickly whether the next 8 chars are made of digits
    +// at a glance, it looks better than Mula's
    +// http://0x80.pl/articles/swar-digits-validate.html
    +simdjson_inline bool is_made_of_eight_digits_fast(const uint8_t *chars) {
    +  uint64_t val;
    +  // this can read up to 7 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(7 <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be bigger than 7");
    +  std::memcpy(&val, chars, 8);
    +  // a branchy method might be faster:
    +  // return (( val & 0xF0F0F0F0F0F0F0F0 ) == 0x3030303030303030)
    +  //  && (( (val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0 ) ==
    +  //  0x3030303030303030);
    +  return (((val & 0xF0F0F0F0F0F0F0F0) |
    +           (((val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0) >> 4)) ==
    +          0x3333333333333333);
    +}
    +
    +template
    +SIMDJSON_NO_SANITIZE_UNDEFINED // We deliberately allow overflow here and check later
    +simdjson_inline bool parse_digit(const uint8_t c, I &i) {
    +  const uint8_t digit = static_cast(c - '0');
    +  if (digit > 9) {
    +    return false;
    +  }
    +  // PERF NOTE: multiplication by 10 is cheaper than arbitrary integer multiplication
    +  i = 10 * i + digit; // might overflow, we will handle the overflow later
    +  return true;
    +}
    +
    +simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const uint8_t *const src, const uint8_t *&p, uint64_t &i, int64_t &exponent) {
    +  // we continue with the fiction that we have an integer. If the
    +  // floating point number is representable as x * 10^z for some integer
    +  // z that fits in 53 bits, then we will be able to convert back the
    +  // the integer into a float in a lossless manner.
    +  const uint8_t *const first_after_period = p;
    +
    +#ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +#if SIMDJSON_SWAR_NUMBER_PARSING
    +  // this helps if we have lots of decimals!
    +  // this turns out to be frequent enough.
    +  if (is_made_of_eight_digits_fast(p)) {
    +    i = i * 100000000 + parse_eight_digits_unrolled(p);
    +    p += 8;
    +  }
    +#endif // SIMDJSON_SWAR_NUMBER_PARSING
    +#endif // #ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +  // Unrolling the first digit makes a small difference on some implementations (e.g. westmere)
    +  if (parse_digit(*p, i)) { ++p; }
    +  while (parse_digit(*p, i)) { p++; }
    +  exponent = first_after_period - p;
    +  // Decimal without digits (123.) is illegal
    +  if (exponent == 0) {
    +    return INVALID_NUMBER(src);
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) {
    +  // Exp Sign: -123.456e[-]78
    +  bool neg_exp = ('-' == *p);
    +  if (neg_exp || '+' == *p) { p++; } // Skip + as well
    +
    +  // Exponent: -123.456e-[78]
    +  auto start_exp = p;
    +  int64_t exp_number = 0;
    +  while (parse_digit(*p, exp_number)) { ++p; }
    +  // It is possible for parse_digit to overflow.
    +  // In particular, it could overflow to INT64_MIN, and we cannot do - INT64_MIN.
    +  // Thus we *must* check for possible overflow before we negate exp_number.
    +
    +  // Performance notes: it may seem like combining the two "simdjson_unlikely checks" below into
    +  // a single simdjson_unlikely path would be faster. The reasoning is sound, but the compiler may
    +  // not oblige and may, in fact, generate two distinct paths in any case. It might be
    +  // possible to do uint64_t(p - start_exp - 1) >= 18 but it could end up trading off
    +  // instructions for a simdjson_likely branch, an unconclusive gain.
    +
    +  // If there were no digits, it's an error.
    +  if (simdjson_unlikely(p == start_exp)) {
    +    return INVALID_NUMBER(src);
    +  }
    +  // We have a valid positive exponent in exp_number at this point, except that
    +  // it may have overflowed.
    +
    +  // If there were more than 18 digits, we may have overflowed the integer. We have to do
    +  // something!!!!
    +  if (simdjson_unlikely(p > start_exp+18)) {
    +    // Skip leading zeroes: 1e000000000000000000001 is technically valid and doesn't overflow
    +    while (*start_exp == '0') { start_exp++; }
    +    // 19 digits could overflow int64_t and is kind of absurd anyway. We don't
    +    // support exponents smaller than -999,999,999,999,999,999 and bigger
    +    // than 999,999,999,999,999,999.
    +    // We can truncate.
    +    // Note that 999999999999999999 is assuredly too large. The maximal ieee64 value before
    +    // infinity is ~1.8e308. The smallest subnormal is ~5e-324. So, actually, we could
    +    // truncate at 324.
    +    // Note that there is no reason to fail per se at this point in time.
    +    // E.g., 0e999999999999999999999 is a fine number.
    +    if (p > start_exp+18) { exp_number = 999999999999999999; }
    +  }
    +  // At this point, we know that exp_number is a sane, positive, signed integer.
    +  // It is <= 999,999,999,999,999,999. As long as 'exponent' is in
    +  // [-8223372036854775808, 8223372036854775808], we won't overflow. Because 'exponent'
    +  // is bounded in magnitude by the size of the JSON input, we are fine in this universe.
    +  // To sum it up: the next line should never overflow.
    +  exponent += (neg_exp ? -exp_number : exp_number);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline size_t significant_digits(const uint8_t * start_digits, size_t digit_count) {
    +  // It is possible that the integer had an overflow.
    +  // We have to handle the case where we have 0.0000somenumber.
    +  const uint8_t *start = start_digits;
    +  while ((*start == '0') || (*start == '.')) { ++start; }
    +  // we over-decrement by one when there is a '.'
    +  return digit_count - size_t(start - start_digits);
    +}
    +
    +} // unnamed namespace
    +
    +/** @private */
    +template
    +error_code slow_float_parsing(simdjson_unused const uint8_t * src, W writer) {
    +  double d;
    +  if (parse_float_fallback(src, &d)) {
    +    writer.append_double(d);
    +    return SUCCESS;
    +  }
    +  return INVALID_NUMBER(src);
    +}
    +
    +/** @private */
    +template
    +simdjson_inline error_code write_float(const uint8_t *const src, bool negative, uint64_t i, const uint8_t * start_digits, size_t digit_count, int64_t exponent, W &writer) {
    +  // If we frequently had to deal with long strings of digits,
    +  // we could extend our code by using a 128-bit integer instead
    +  // of a 64-bit integer. However, this is uncommon in practice.
    +  //
    +  // 9999999999999999999 < 2**64 so we can accommodate 19 digits.
    +  // If we have a decimal separator, then digit_count - 1 is the number of digits, but we
    +  // may not have a decimal separator!
    +  if (simdjson_unlikely(digit_count > 19 && significant_digits(start_digits, digit_count) > 19)) {
    +    // Ok, chances are good that we had an overflow!
    +    // this is almost never going to get called!!!
    +    // we start anew, going slowly!!!
    +    // This will happen in the following examples:
    +    // 10000000000000000000000000000000000000000000e+308
    +    // 3.1415926535897932384626433832795028841971693993751
    +    //
    +    // NOTE: This makes a *copy* of the writer and passes it to slow_float_parsing. This happens
    +    // because slow_float_parsing is a non-inlined function. If we passed our writer reference to
    +    // it, it would force it to be stored in memory, preventing the compiler from picking it apart
    +    // and putting into registers. i.e. if we pass it as reference, it gets slow.
    +    // This is what forces the skip_double, as well.
    +    error_code error = slow_float_parsing(src, writer);
    +    writer.skip_double();
    +    return error;
    +  }
    +  // NOTE: it's weird that the simdjson_unlikely() only wraps half the if, but it seems to get slower any other
    +  // way we've tried: https://github.com/simdjson/simdjson/pull/990#discussion_r448497331
    +  // To future reader: we'd love if someone found a better way, or at least could explain this result!
    +  if (simdjson_unlikely(exponent < simdjson::internal::smallest_power) || (exponent > simdjson::internal::largest_power)) {
    +    //
    +    // Important: smallest_power is such that it leads to a zero value.
    +    // Observe that 18446744073709551615e-343 == 0, i.e. (2**64 - 1) e -343 is zero
    +    // so something x 10^-343 goes to zero, but not so with  something x 10^-342.
    +    static_assert(simdjson::internal::smallest_power <= -342, "smallest_power is not small enough");
    +    //
    +    if((exponent < simdjson::internal::smallest_power) || (i == 0)) {
    +      // E.g. Parse "-0.0e-999" into the same value as "-0.0". See https://en.wikipedia.org/wiki/Signed_zero
    +      WRITE_DOUBLE(negative ? -0.0 : 0.0, src, writer);
    +      return SUCCESS;
    +    } else { // (exponent > largest_power) and (i != 0)
    +      // We have, for sure, an infinite value and simdjson refuses to parse infinite values.
    +      return INVALID_NUMBER(src);
    +    }
    +  }
    +  double d;
    +  if (!compute_float_64(exponent, i, negative, d)) {
    +    // we are almost never going to get here.
    +    if (!parse_float_fallback(src, &d)) { return INVALID_NUMBER(src); }
    +  }
    +  WRITE_DOUBLE(d, src, writer);
    +  return SUCCESS;
    +}
    +
    +// for performance analysis, it is sometimes  useful to skip parsing
    +#ifdef SIMDJSON_SKIPNUMBERPARSING
    +
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const, W &writer) {
    +  writer.append_s64(0);        // always write zero
    +  return SUCCESS;              // always succeeds
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept { return number_type::signed_integer; }
    +#else
    +
    +// parse the number at src
    +// define JSON_TEST_NUMBERS for unit testing
    +//
    +// It is assumed that the number is followed by a structural ({,},],[) character
    +// or a white space character. If that is not the case (e.g., when the JSON
    +// document is made of a single number), then it is necessary to copy the
    +// content and append a space before calling this function.
    +//
    +// Our objective is accurate parsing (ULP of 0) at high speed.
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) {
    +
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  if (digit_count == 0 || ('0' == *start_digits && digit_count > 1)) { return INVALID_NUMBER(src); }
    +
    +  //
    +  // Handle floats if there is a . or e (or both)
    +  //
    +  int64_t exponent = 0;
    +  bool is_float = false;
    +  if ('.' == *p) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_decimal_after_separator(src, p, i, exponent) );
    +    digit_count = int(p - start_digits); // used later to guard against overflows
    +  }
    +  if (('e' == *p) || ('E' == *p)) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_exponent(src, p, exponent) );
    +  }
    +  if (is_float) {
    +    const bool dirty_end = jsoncharutils::is_not_structural_or_whitespace(*p);
    +    SIMDJSON_TRY( write_float(src, negative, i, start_digits, digit_count, exponent, writer) );
    +    if (dirty_end) { return INVALID_NUMBER(src); }
    +    return SUCCESS;
    +  }
    +
    +  // The longest negative 64-bit number is 19 digits.
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  size_t longest_digit_count = negative ? 19 : 20;
    +  if (digit_count > longest_digit_count) { return INVALID_NUMBER(src); }
    +  if (digit_count == longest_digit_count) {
    +    if (negative) {
    +      // Anything negative above INT64_MAX+1 is invalid
    +      if (i > uint64_t(INT64_MAX)+1) { return INVALID_NUMBER(src);  }
    +      WRITE_INTEGER(~i+1, src, writer);
    +      if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +      return SUCCESS;
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    }  else if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INVALID_NUMBER(src); }
    +  }
    +
    +  // Write unsigned if it doesn't fit in a signed integer.
    +  if (i > uint64_t(INT64_MAX)) {
    +    WRITE_UNSIGNED(i, src, writer);
    +  } else {
    +    WRITE_INTEGER(negative ? (~i+1) : i, src, writer);
    +  }
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +  return SUCCESS;
    +}
    +
    +// Inlineable functions
    +namespace {
    +
    +// This table can be used to characterize the final character of an integer
    +// string. For JSON structural character and allowable white space characters,
    +// we return SUCCESS. For 'e', '.' and 'E', we return INCORRECT_TYPE. Otherwise
    +// we return NUMBER_ERROR.
    +// Optimization note: we could easily reduce the size of the table by half (to 128)
    +// at the cost of an extra branch.
    +// Optimization note: we want the values to use at most 8 bits (not, e.g., 32 bits):
    +static_assert(error_code(uint8_t(NUMBER_ERROR))== NUMBER_ERROR, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(SUCCESS))== SUCCESS, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(INCORRECT_TYPE))== INCORRECT_TYPE, "bad NUMBER_ERROR cast");
    +
    +const uint8_t integer_string_finisher[256] = {
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   SUCCESS,      NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, INCORRECT_TYPE,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, SUCCESS,        NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR};
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if ((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src + 1;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    // Note: we use src[1] and not src[0] because src[0] is the quote character in this
    +    // instance.
    +    if (src[1] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = src;
    +  uint64_t i = 0;
    +  while (parse_digit(*src, i)) { src++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(src - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*src)) {
    +  //  return (*src == '.' || *src == 'e' || *src == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(*src != '"') { return NUMBER_ERROR; }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept {
    +  return (*src == '-');
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) { return true; }
    +  return false;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) {
    +    // We have an integer.
    +    // If the number is negative and valid, it must be a signed integer.
    +    if(negative) { return number_type::signed_integer; }
    +    // We want values larger or equal to 9223372036854775808 to be unsigned
    +    // integers, and the other values to be signed integers.
    +    int digit_count = int(p - src);
    +    if(digit_count >= 19) {
    +      const uint8_t * smaller_big_integer = reinterpret_cast("9223372036854775808");
    +      if((digit_count >= 20) || (memcmp(src, smaller_big_integer, 19) >= 0)) {
    +        return number_type::unsigned_integer;
    +      }
    +    }
    +    return number_type::signed_integer;
    +  }
    +  // Hopefully, we have 'e' or 'E' or '.'.
    +  return number_type::floating_point_number;
    +}
    +
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src, const uint8_t * const src_end) noexcept {
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  if(p == src_end) { return NUMBER_ERROR; }
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely((p != src_end) && (*p == '.'))) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if ((p == src_end) || !parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = start_digits-src > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if ((p != src_end) && (*p == 'e' || *p == 'E')) {
    +    p++;
    +    if(p == src_end) { return NUMBER_ERROR; }
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while ((p != src_end) && parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if ((p != src_end) && jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), src_end, &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +} // unnamed namespace
    +#endif // SIMDJSON_SKIPNUMBERPARSING
    +
    +} // namespace numberparsing
    +
    +inline std::ostream& operator<<(std::ostream& out, number_type type) noexcept {
    +    switch (type) {
    +        case number_type::signed_integer: out << "integer in [-9223372036854775808,9223372036854775808)"; break;
    +        case number_type::unsigned_integer: out << "unsigned integer in [9223372036854775808,18446744073709551616)"; break;
    +        case number_type::floating_point_number: out << "floating-point number (binary64)"; break;
    +        default: SIMDJSON_UNREACHABLE();
    +    }
    +    return out;
    +}
    +
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_NUMBERPARSING_H
    +/* end file simdjson/generic/numberparsing.h for fallback */
    +
    +/* including simdjson/generic/implementation_simdjson_result_base-inl.h for fallback: #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base-inl.h for fallback */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +
    +//
    +// internal::implementation_simdjson_result_base inline implementation
    +//
    +
    +template
    +simdjson_inline void implementation_simdjson_result_base::tie(T &value, error_code &error) && noexcept {
    +  error = this->second;
    +  if (!error) {
    +    value = std::forward>(*this).first;
    +  }
    +}
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::get(T &value) && noexcept {
    +  error_code error;
    +  std::forward>(*this).tie(value, error);
    +  return error;
    +}
    +
    +template
    +simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept {
    +  return this->second;
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::take_value() && noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::operator T&&() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline const T& implementation_simdjson_result_base::value_unsafe() const& noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value_unsafe() & noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value_unsafe() && noexcept {
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value, error_code error) noexcept
    +    : first{std::forward(value)}, second{error} {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(error_code error) noexcept
    +    : implementation_simdjson_result_base(T{}, error) {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value), SUCCESS) {}
    +
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +/* end file simdjson/generic/implementation_simdjson_result_base-inl.h for fallback */
    +/* end file simdjson/generic/amalgamated.h for fallback */
    +/* including simdjson/fallback/end.h: #include "simdjson/fallback/end.h" */
    +/* begin file simdjson/fallback/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +/* undefining SIMDJSON_IMPLEMENTATION from "fallback" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/fallback/end.h */
    +
    +#endif // SIMDJSON_FALLBACK_H
    +/* end file simdjson/fallback.h */
    +/* including simdjson/fallback/implementation.h: #include  */
    +/* begin file simdjson/fallback/implementation.h */
    +#ifndef SIMDJSON_FALLBACK_IMPLEMENTATION_H
    +#define SIMDJSON_FALLBACK_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +
    +/**
    + * @private
    + */
    +class implementation final : public simdjson::implementation {
    +public:
    +  simdjson_inline implementation() : simdjson::implementation(
    +      "fallback",
    +      "Generic fallback implementation",
    +      0
    +  ) {}
    +  simdjson_warn_unused error_code create_dom_parser_implementation(
    +    size_t capacity,
    +    size_t max_length,
    +    std::unique_ptr& dst
    +  ) const noexcept final;
    +  simdjson_warn_unused error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept final;
    +  simdjson_warn_unused bool validate_utf8(const char *buf, size_t len) const noexcept final;
    +};
    +
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_FALLBACK_IMPLEMENTATION_H
    +/* end file simdjson/fallback/implementation.h */
    +
    +/* including simdjson/fallback/begin.h: #include  */
    +/* begin file simdjson/fallback/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "fallback" */
    +#define SIMDJSON_IMPLEMENTATION fallback
    +/* including simdjson/fallback/base.h: #include "simdjson/fallback/base.h" */
    +/* begin file simdjson/fallback/base.h */
    +#ifndef SIMDJSON_FALLBACK_BASE_H
    +#define SIMDJSON_FALLBACK_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +/**
    + * Fallback implementation (runs on any machine).
    + */
    +namespace fallback {
    +
    +class implementation;
    +
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_FALLBACK_BASE_H
    +/* end file simdjson/fallback/base.h */
    +/* including simdjson/fallback/bitmanipulation.h: #include "simdjson/fallback/bitmanipulation.h" */
    +/* begin file simdjson/fallback/bitmanipulation.h */
    +#ifndef SIMDJSON_FALLBACK_BITMANIPULATION_H
    +#define SIMDJSON_FALLBACK_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace {
    +
    +#if defined(_MSC_VER) && !defined(_M_ARM64) && !defined(_M_X64)
    +static inline unsigned char _BitScanForward64(unsigned long* ret, uint64_t x) {
    +  unsigned long x0 = (unsigned long)x, top, bottom;
    +  _BitScanForward(&top, (unsigned long)(x >> 32));
    +  _BitScanForward(&bottom, x0);
    +  *ret = x0 ? bottom : 32 + top;
    +  return x != 0;
    +}
    +static unsigned char _BitScanReverse64(unsigned long* ret, uint64_t x) {
    +  unsigned long x1 = (unsigned long)(x >> 32), top, bottom;
    +  _BitScanReverse(&top, x1);
    +  _BitScanReverse(&bottom, (unsigned long)x);
    +  *ret = x1 ? top + 32 : bottom;
    +  return x != 0;
    +}
    +#endif
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +#ifdef _MSC_VER
    +  unsigned long leading_zero = 0;
    +  // Search the mask data from most significant bit (MSB)
    +  // to least significant bit (LSB) for a set bit (1).
    +  if (_BitScanReverse64(&leading_zero, input_num))
    +    return (int)(63 - leading_zero);
    +  else
    +    return 64;
    +#else
    +  return __builtin_clzll(input_num);
    +#endif// _MSC_VER
    +}
    +
    +} // unnamed namespace
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_FALLBACK_BITMANIPULATION_H
    +/* end file simdjson/fallback/bitmanipulation.h */
    +/* including simdjson/fallback/stringparsing_defs.h: #include "simdjson/fallback/stringparsing_defs.h" */
    +/* begin file simdjson/fallback/stringparsing_defs.h */
    +#ifndef SIMDJSON_FALLBACK_STRINGPARSING_DEFS_H
    +#define SIMDJSON_FALLBACK_STRINGPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace {
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 1;
    +  simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() { return c == '"'; }
    +  simdjson_inline bool has_backslash() { return c == '\\'; }
    +  simdjson_inline int quote_index() { return c == '"' ? 0 : 1; }
    +  simdjson_inline int backslash_index() { return c == '\\' ? 0 : 1; }
    +
    +  uint8_t c;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // store to dest unconditionally - we can overwrite the bits we don't like later
    +  dst[0] = src[0];
    +  return { src[0] };
    +}
    +
    +} // unnamed namespace
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_FALLBACK_STRINGPARSING_DEFS_H
    +/* end file simdjson/fallback/stringparsing_defs.h */
    +/* including simdjson/fallback/numberparsing_defs.h: #include "simdjson/fallback/numberparsing_defs.h" */
    +/* begin file simdjson/fallback/numberparsing_defs.h */
    +#ifndef SIMDJSON_FALLBACK_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_FALLBACK_NUMBERPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +#ifdef JSON_TEST_NUMBERS // for unit testing
    +void found_invalid_number(const uint8_t *buf);
    +void found_integer(int64_t result, const uint8_t *buf);
    +void found_unsigned_integer(uint64_t result, const uint8_t *buf);
    +void found_float(double result, const uint8_t *buf);
    +#endif
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace numberparsing {
    +
    +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const char *chars) {
    +  uint64_t val;
    +  memcpy(&val, chars, sizeof(uint64_t));
    +  val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8;
    +  val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16;
    +  return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32);
    +}
    +
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  return parse_eight_digits_unrolled(reinterpret_cast(chars));
    +}
    +
    +#if SIMDJSON_IS_32BITS // _umul128 for x86, arm
    +// this is a slow emulation routine for 32-bit
    +//
    +static simdjson_inline uint64_t __emulu(uint32_t x, uint32_t y) {
    +  return x * (uint64_t)y;
    +}
    +static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) {
    +  uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd);
    +  uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd);
    +  uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32));
    +  uint64_t adbc_carry = !!(adbc < ad);
    +  uint64_t lo = bd + (adbc << 32);
    +  *hi = __emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) +
    +        (adbc_carry << 32) + !!(lo < bd);
    +  return lo;
    +}
    +#endif
    +
    +/** @private */
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif // SIMDJSON_FALLBACK_NUMBERPARSING_DEFS_H
    +/* end file simdjson/fallback/numberparsing_defs.h */
    +/* end file simdjson/fallback/begin.h */
    +/* including generic/stage1/find_next_document_index.h for fallback: #include  */
    +/* begin file generic/stage1/find_next_document_index.h for fallback */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace {
    +namespace stage1 {
    +
    +/**
    +  * This algorithm is used to quickly identify the last structural position that
    +  * makes up a complete document.
    +  *
    +  * It does this by going backwards and finding the last *document boundary* (a
    +  * place where one value follows another without a comma between them). If the
    +  * last document (the characters after the boundary) has an equal number of
    +  * start and end brackets, it is considered complete.
    +  *
    +  * Simply put, we iterate over the structural characters, starting from
    +  * the end. We consider that we found the end of a JSON document when the
    +  * first element of the pair is NOT one of these characters: '{' '[' ':' ','
    +  * and when the second element is NOT one of these characters: '}' ']' ':' ','.
    +  *
    +  * This simple comparison works most of the time, but it does not cover cases
    +  * where the batch's structural indexes contain a perfect amount of documents.
    +  * In such a case, we do not have access to the structural index which follows
    +  * the last document, therefore, we do not have access to the second element in
    +  * the pair, and that means we cannot identify the last document. To fix this
    +  * issue, we keep a count of the open and closed curly/square braces we found
    +  * while searching for the pair. When we find a pair AND the count of open and
    +  * closed curly/square braces is the same, we know that we just passed a
    +  * complete document, therefore the last json buffer location is the end of the
    +  * batch.
    +  */
    +simdjson_inline uint32_t find_next_document_index(dom_parser_implementation &parser) {
    +  // Variant: do not count separately, just figure out depth
    +  if(parser.n_structural_indexes == 0) { return 0; }
    +  auto arr_cnt = 0;
    +  auto obj_cnt = 0;
    +  for (auto i = parser.n_structural_indexes - 1; i > 0; i--) {
    +    auto idxb = parser.structural_indexes[i];
    +    switch (parser.buf[idxb]) {
    +    case ':':
    +    case ',':
    +      continue;
    +    case '}':
    +      obj_cnt--;
    +      continue;
    +    case ']':
    +      arr_cnt--;
    +      continue;
    +    case '{':
    +      obj_cnt++;
    +      break;
    +    case '[':
    +      arr_cnt++;
    +      break;
    +    }
    +    auto idxa = parser.structural_indexes[i - 1];
    +    switch (parser.buf[idxa]) {
    +    case '{':
    +    case '[':
    +    case ':':
    +    case ',':
    +      continue;
    +    }
    +    // Last document is complete, so the next document will appear after!
    +    if (!arr_cnt && !obj_cnt) {
    +      return parser.n_structural_indexes;
    +    }
    +    // Last document is incomplete; mark the document at i + 1 as the next one
    +    return i;
    +  }
    +  // If we made it to the end, we want to finish counting to see if we have a full document.
    +  switch (parser.buf[parser.structural_indexes[0]]) {
    +    case '}':
    +      obj_cnt--;
    +      break;
    +    case ']':
    +      arr_cnt--;
    +      break;
    +    case '{':
    +      obj_cnt++;
    +      break;
    +    case '[':
    +      arr_cnt++;
    +      break;
    +  }
    +  if (!arr_cnt && !obj_cnt) {
    +    // We have a complete document.
    +    return parser.n_structural_indexes;
    +  }
    +  return 0;
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H
    +/* end file generic/stage1/find_next_document_index.h for fallback */
    +/* including generic/stage2/stringparsing.h for fallback: #include  */
    +/* begin file generic/stage2/stringparsing.h for fallback */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This file contains the common code every implementation uses
    +// It is intended to be included multiple times and compiled multiple times
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace {
    +/// @private
    +namespace stringparsing {
    +
    +// begin copypasta
    +// These chars yield themselves: " \ /
    +// b -> backspace, f -> formfeed, n -> newline, r -> cr, t -> horizontal tab
    +// u not handled in this table as it's complex
    +static const uint8_t escape_map[256] = {
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0, // 0x0.
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0x22, 0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0x2f,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0, // 0x4.
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0x5c, 0, 0,    0, // 0x5.
    +    0, 0, 0x08, 0, 0,    0, 0x0c, 0, 0, 0, 0, 0, 0,    0, 0x0a, 0, // 0x6.
    +    0, 0, 0x0d, 0, 0x09, 0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0, // 0x7.
    +
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +};
    +
    +// handle a unicode codepoint
    +// write appropriate values into dest
    +// src will advance 6 bytes or 12 bytes
    +// dest will advance a variable amount (return via pointer)
    +// return true if the unicode codepoint was valid
    +// We work in little-endian then swap at write time
    +simdjson_warn_unused
    +simdjson_inline bool handle_unicode_codepoint(const uint8_t **src_ptr,
    +                                            uint8_t **dst_ptr, bool allow_replacement) {
    +  // Use the default Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD)
    +  constexpr uint32_t substitution_code_point = 0xfffd;
    +  // jsoncharutils::hex_to_u32_nocheck fills high 16 bits of the return value with 1s if the
    +  // conversion isn't valid; we defer the check for this to inside the
    +  // multilingual plane check
    +  uint32_t code_point = jsoncharutils::hex_to_u32_nocheck(*src_ptr + 2);
    +  *src_ptr += 6;
    +
    +  // If we found a high surrogate, we must
    +  // check for low surrogate for characters
    +  // outside the Basic
    +  // Multilingual Plane.
    +  if (code_point >= 0xd800 && code_point < 0xdc00) {
    +    const uint8_t *src_data = *src_ptr;
    +    /* Compiler optimizations convert this to a single 16-bit load and compare on most platforms */
    +    if (((src_data[0] << 8) | src_data[1]) != ((static_cast ('\\') << 8) | static_cast ('u'))) {
    +      if(!allow_replacement) { return false; }
    +      code_point = substitution_code_point;
    +    } else {
    +      uint32_t code_point_2 = jsoncharutils::hex_to_u32_nocheck(src_data + 2);
    +
    +      // We have already checked that the high surrogate is valid and
    +      // (code_point - 0xd800) < 1024.
    +      //
    +      // Check that code_point_2 is in the range 0xdc00..0xdfff
    +      // and that code_point_2 was parsed from valid hex.
    +      uint32_t low_bit = code_point_2 - 0xdc00;
    +      if (low_bit >> 10) {
    +        if(!allow_replacement) { return false; }
    +        code_point = substitution_code_point;
    +      } else {
    +        code_point =  (((code_point - 0xd800) << 10) | low_bit) + 0x10000;
    +        *src_ptr += 6;
    +      }
    +
    +    }
    +  } else if (code_point >= 0xdc00 && code_point <= 0xdfff) {
    +      // If we encounter a low surrogate (not preceded by a high surrogate)
    +      // then we have an error.
    +      if(!allow_replacement) { return false; }
    +      code_point = substitution_code_point;
    +  }
    +  size_t offset = jsoncharutils::codepoint_to_utf8(code_point, *dst_ptr);
    +  *dst_ptr += offset;
    +  return offset > 0;
    +}
    +
    +
    +// handle a unicode codepoint using the wobbly convention
    +// https://simonsapin.github.io/wtf-8/
    +// write appropriate values into dest
    +// src will advance 6 bytes or 12 bytes
    +// dest will advance a variable amount (return via pointer)
    +// return true if the unicode codepoint was valid
    +// We work in little-endian then swap at write time
    +simdjson_warn_unused
    +simdjson_inline bool handle_unicode_codepoint_wobbly(const uint8_t **src_ptr,
    +                                            uint8_t **dst_ptr) {
    +  // It is not ideal that this function is nearly identical to handle_unicode_codepoint.
    +  //
    +  // jsoncharutils::hex_to_u32_nocheck fills high 16 bits of the return value with 1s if the
    +  // conversion isn't valid; we defer the check for this to inside the
    +  // multilingual plane check
    +  uint32_t code_point = jsoncharutils::hex_to_u32_nocheck(*src_ptr + 2);
    +  *src_ptr += 6;
    +  // If we found a high surrogate, we must
    +  // check for low surrogate for characters
    +  // outside the Basic
    +  // Multilingual Plane.
    +  if (code_point >= 0xd800 && code_point < 0xdc00) {
    +    const uint8_t *src_data = *src_ptr;
    +    /* Compiler optimizations convert this to a single 16-bit load and compare on most platforms */
    +    if (((src_data[0] << 8) | src_data[1]) == ((static_cast ('\\') << 8) | static_cast ('u'))) {
    +      uint32_t code_point_2 = jsoncharutils::hex_to_u32_nocheck(src_data + 2);
    +      uint32_t low_bit = code_point_2 - 0xdc00;
    +      if ((low_bit >> 10) ==  0) {
    +        code_point =
    +          (((code_point - 0xd800) << 10) | low_bit) + 0x10000;
    +        *src_ptr += 6;
    +      }
    +    }
    +  }
    +
    +  size_t offset = jsoncharutils::codepoint_to_utf8(code_point, *dst_ptr);
    +  *dst_ptr += offset;
    +  return offset > 0;
    +}
    +
    +
    +/**
    + * Unescape a valid UTF-8 string from src to dst, stopping at a final unescaped quote. There
    + * must be an unescaped quote terminating the string. It returns the final output
    + * position as pointer. In case of error (e.g., the string has bad escaped codes),
    + * then null_nullptrptr is returned. It is assumed that the output buffer is large
    + * enough. E.g., if src points at 'joe"', then dst needs to have four free bytes +
    + * SIMDJSON_PADDING bytes.
    + */
    +simdjson_warn_unused simdjson_inline uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) {
    +  while (1) {
    +    // Copy the next n bytes, and find the backslash and quote in them.
    +    auto bs_quote = backslash_and_quote::copy_and_find(src, dst);
    +    // If the next thing is the end quote, copy and return
    +    if (bs_quote.has_quote_first()) {
    +      // we encountered quotes first. Move dst to point to quotes and exit
    +      return dst + bs_quote.quote_index();
    +    }
    +    if (bs_quote.has_backslash()) {
    +      /* find out where the backspace is */
    +      auto bs_dist = bs_quote.backslash_index();
    +      uint8_t escape_char = src[bs_dist + 1];
    +      /* we encountered backslash first. Handle backslash */
    +      if (escape_char == 'u') {
    +        /* move src/dst up to the start; they will be further adjusted
    +           within the unicode codepoint handling code. */
    +        src += bs_dist;
    +        dst += bs_dist;
    +        if (!handle_unicode_codepoint(&src, &dst, allow_replacement)) {
    +          return nullptr;
    +        }
    +      } else {
    +        /* simple 1:1 conversion. Will eat bs_dist+2 characters in input and
    +         * write bs_dist+1 characters to output
    +         * note this may reach beyond the part of the buffer we've actually
    +         * seen. I think this is ok */
    +        uint8_t escape_result = escape_map[escape_char];
    +        if (escape_result == 0u) {
    +          return nullptr; /* bogus escape value is an error */
    +        }
    +        dst[bs_dist] = escape_result;
    +        src += bs_dist + 2;
    +        dst += bs_dist + 1;
    +      }
    +    } else {
    +      /* they are the same. Since they can't co-occur, it means we
    +       * encountered neither. */
    +      src += backslash_and_quote::BYTES_PROCESSED;
    +      dst += backslash_and_quote::BYTES_PROCESSED;
    +    }
    +  }
    +}
    +
    +simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) {
    +  // It is not ideal that this function is nearly identical to parse_string.
    +  while (1) {
    +    // Copy the next n bytes, and find the backslash and quote in them.
    +    auto bs_quote = backslash_and_quote::copy_and_find(src, dst);
    +    // If the next thing is the end quote, copy and return
    +    if (bs_quote.has_quote_first()) {
    +      // we encountered quotes first. Move dst to point to quotes and exit
    +      return dst + bs_quote.quote_index();
    +    }
    +    if (bs_quote.has_backslash()) {
    +      /* find out where the backspace is */
    +      auto bs_dist = bs_quote.backslash_index();
    +      uint8_t escape_char = src[bs_dist + 1];
    +      /* we encountered backslash first. Handle backslash */
    +      if (escape_char == 'u') {
    +        /* move src/dst up to the start; they will be further adjusted
    +           within the unicode codepoint handling code. */
    +        src += bs_dist;
    +        dst += bs_dist;
    +        if (!handle_unicode_codepoint_wobbly(&src, &dst)) {
    +          return nullptr;
    +        }
    +      } else {
    +        /* simple 1:1 conversion. Will eat bs_dist+2 characters in input and
    +         * write bs_dist+1 characters to output
    +         * note this may reach beyond the part of the buffer we've actually
    +         * seen. I think this is ok */
    +        uint8_t escape_result = escape_map[escape_char];
    +        if (escape_result == 0u) {
    +          return nullptr; /* bogus escape value is an error */
    +        }
    +        dst[bs_dist] = escape_result;
    +        src += bs_dist + 2;
    +        dst += bs_dist + 1;
    +      }
    +    } else {
    +      /* they are the same. Since they can't co-occur, it means we
    +       * encountered neither. */
    +      src += backslash_and_quote::BYTES_PROCESSED;
    +      dst += backslash_and_quote::BYTES_PROCESSED;
    +    }
    +  }
    +}
    +
    +} // namespace stringparsing
    +} // unnamed namespace
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H
    +/* end file generic/stage2/stringparsing.h for fallback */
    +/* including generic/stage2/logger.h for fallback: #include  */
    +/* begin file generic/stage2/logger.h for fallback */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_LOGGER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_LOGGER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +
    +// This is for an internal-only stage 2 specific logger.
    +// Set LOG_ENABLED = true to log what stage 2 is doing!
    +namespace simdjson {
    +namespace fallback {
    +namespace {
    +namespace logger {
    +
    +  static constexpr const char * DASHES = "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------";
    +
    +#if SIMDJSON_VERBOSE_LOGGING
    +  static constexpr const bool LOG_ENABLED = true;
    +#else
    +  static constexpr const bool LOG_ENABLED = false;
    +#endif
    +  static constexpr const int LOG_EVENT_LEN = 20;
    +  static constexpr const int LOG_BUFFER_LEN = 30;
    +  static constexpr const int LOG_SMALL_BUFFER_LEN = 10;
    +  static constexpr const int LOG_INDEX_LEN = 5;
    +
    +  static int log_depth; // Not threadsafe. Log only.
    +
    +  // Helper to turn unprintable or newline characters into spaces
    +  static simdjson_inline char printable_char(char c) {
    +    if (c >= 0x20) {
    +      return c;
    +    } else {
    +      return ' ';
    +    }
    +  }
    +
    +  // Print the header and set up log_start
    +  static simdjson_inline void log_start() {
    +    if (LOG_ENABLED) {
    +      log_depth = 0;
    +      printf("\n");
    +      printf("| %-*s | %-*s | %-*s | %-*s | Detail |\n", LOG_EVENT_LEN, "Event", LOG_BUFFER_LEN, "Buffer", LOG_SMALL_BUFFER_LEN, "Next", 5, "Next#");
    +      printf("|%.*s|%.*s|%.*s|%.*s|--------|\n", LOG_EVENT_LEN+2, DASHES, LOG_BUFFER_LEN+2, DASHES, LOG_SMALL_BUFFER_LEN+2, DASHES, 5+2, DASHES);
    +    }
    +  }
    +
    +  simdjson_unused static simdjson_inline void log_string(const char *message) {
    +    if (LOG_ENABLED) {
    +      printf("%s\n", message);
    +    }
    +  }
    +
    +  // Logs a single line from the stage 2 DOM parser
    +  template
    +  static simdjson_inline void log_line(S &structurals, const char *title_prefix, const char *title, const char *detail) {
    +    if (LOG_ENABLED) {
    +      printf("| %*s%s%-*s ", log_depth*2, "", title_prefix, LOG_EVENT_LEN - log_depth*2 - int(strlen(title_prefix)), title);
    +      auto current_index = structurals.at_beginning() ? nullptr : structurals.next_structural-1;
    +      auto next_index = structurals.next_structural;
    +      auto current = current_index ? &structurals.buf[*current_index] : reinterpret_cast("                                                       ");
    +      auto next = &structurals.buf[*next_index];
    +      {
    +        // Print the next N characters in the buffer.
    +        printf("| ");
    +        // Otherwise, print the characters starting from the buffer position.
    +        // Print spaces for unprintable or newline characters.
    +        for (int i=0;i */
    +/* begin file generic/stage2/json_iterator.h for fallback */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace {
    +namespace stage2 {
    +
    +class json_iterator {
    +public:
    +  const uint8_t* const buf;
    +  uint32_t *next_structural;
    +  dom_parser_implementation &dom_parser;
    +  uint32_t depth{0};
    +
    +  /**
    +   * Walk the JSON document.
    +   *
    +   * The visitor receives callbacks when values are encountered. All callbacks pass the iterator as
    +   * the first parameter; some callbacks have other parameters as well:
    +   *
    +   * - visit_document_start() - at the beginning.
    +   * - visit_document_end() - at the end (if things were successful).
    +   *
    +   * - visit_array_start() - at the start `[` of a non-empty array.
    +   * - visit_array_end() - at the end `]` of a non-empty array.
    +   * - visit_empty_array() - when an empty array is encountered.
    +   *
    +   * - visit_object_end() - at the start `]` of a non-empty object.
    +   * - visit_object_start() - at the end `]` of a non-empty object.
    +   * - visit_empty_object() - when an empty object is encountered.
    +   * - visit_key(const uint8_t *key) - when a key in an object field is encountered. key is
    +   *                                   guaranteed to point at the first quote of the string (`"key"`).
    +   * - visit_primitive(const uint8_t *value) - when a value is a string, number, boolean or null.
    +   * - visit_root_primitive(iter, uint8_t *value) - when the top-level value is a string, number, boolean or null.
    +   *
    +   * - increment_count(iter) - each time a value is found in an array or object.
    +   */
    +  template
    +  simdjson_warn_unused simdjson_inline error_code walk_document(V &visitor) noexcept;
    +
    +  /**
    +   * Create an iterator capable of walking a JSON document.
    +   *
    +   * The document must have already passed through stage 1.
    +   */
    +  simdjson_inline json_iterator(dom_parser_implementation &_dom_parser, size_t start_structural_index);
    +
    +  /**
    +   * Look at the next token.
    +   *
    +   * Tokens can be strings, numbers, booleans, null, or operators (`[{]},:`)).
    +   *
    +   * They may include invalid JSON as well (such as `1.2.3` or `ture`).
    +   */
    +  simdjson_inline const uint8_t *peek() const noexcept;
    +  /**
    +   * Advance to the next token.
    +   *
    +   * Tokens can be strings, numbers, booleans, null, or operators (`[{]},:`)).
    +   *
    +   * They may include invalid JSON as well (such as `1.2.3` or `ture`).
    +   */
    +  simdjson_inline const uint8_t *advance() noexcept;
    +  /**
    +   * Get the remaining length of the document, from the start of the current token.
    +   */
    +  simdjson_inline size_t remaining_len() const noexcept;
    +  /**
    +   * Check if we are at the end of the document.
    +   *
    +   * If this is true, there are no more tokens.
    +   */
    +  simdjson_inline bool at_eof() const noexcept;
    +  /**
    +   * Check if we are at the beginning of the document.
    +   */
    +  simdjson_inline bool at_beginning() const noexcept;
    +  simdjson_inline uint8_t last_structural() const noexcept;
    +
    +  /**
    +   * Log that a value has been found.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_value(const char *type) const noexcept;
    +  /**
    +   * Log the start of a multipart value.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_start_value(const char *type) const noexcept;
    +  /**
    +   * Log the end of a multipart value.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_end_value(const char *type) const noexcept;
    +  /**
    +   * Log an error.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_error(const char *error) const noexcept;
    +
    +  template
    +  simdjson_warn_unused simdjson_inline error_code visit_root_primitive(V &visitor, const uint8_t *value) noexcept;
    +  template
    +  simdjson_warn_unused simdjson_inline error_code visit_primitive(V &visitor, const uint8_t *value) noexcept;
    +};
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code json_iterator::walk_document(V &visitor) noexcept {
    +  logger::log_start();
    +
    +  //
    +  // Start the document
    +  //
    +  if (at_eof()) { return EMPTY; }
    +  log_start_value("document");
    +  SIMDJSON_TRY( visitor.visit_document_start(*this) );
    +
    +  //
    +  // Read first value
    +  //
    +  {
    +    auto value = advance();
    +
    +    // Make sure the outer object or array is closed before continuing; otherwise, there are ways we
    +    // could get into memory corruption. See https://github.com/simdjson/simdjson/issues/906
    +    if (!STREAMING) {
    +      switch (*value) {
    +        case '{': if (last_structural() != '}') { log_value("starting brace unmatched"); return TAPE_ERROR; }; break;
    +        case '[': if (last_structural() != ']') { log_value("starting bracket unmatched"); return TAPE_ERROR; }; break;
    +      }
    +    }
    +
    +    switch (*value) {
    +      case '{': if (*peek() == '}') { advance(); log_value("empty object"); SIMDJSON_TRY( visitor.visit_empty_object(*this) ); break; } goto object_begin;
    +      case '[': if (*peek() == ']') { advance(); log_value("empty array"); SIMDJSON_TRY( visitor.visit_empty_array(*this) ); break; } goto array_begin;
    +      default: SIMDJSON_TRY( visitor.visit_root_primitive(*this, value) ); break;
    +    }
    +  }
    +  goto document_end;
    +
    +//
    +// Object parser states
    +//
    +object_begin:
    +  log_start_value("object");
    +  depth++;
    +  if (depth >= dom_parser.max_depth()) { log_error("Exceeded max depth!"); return DEPTH_ERROR; }
    +  dom_parser.is_array[depth] = false;
    +  SIMDJSON_TRY( visitor.visit_object_start(*this) );
    +
    +  {
    +    auto key = advance();
    +    if (*key != '"') { log_error("Object does not start with a key"); return TAPE_ERROR; }
    +    SIMDJSON_TRY( visitor.increment_count(*this) );
    +    SIMDJSON_TRY( visitor.visit_key(*this, key) );
    +  }
    +
    +object_field:
    +  if (simdjson_unlikely( *advance() != ':' )) { log_error("Missing colon after key in object"); return TAPE_ERROR; }
    +  {
    +    auto value = advance();
    +    switch (*value) {
    +      case '{': if (*peek() == '}') { advance(); log_value("empty object"); SIMDJSON_TRY( visitor.visit_empty_object(*this) ); break; } goto object_begin;
    +      case '[': if (*peek() == ']') { advance(); log_value("empty array"); SIMDJSON_TRY( visitor.visit_empty_array(*this) ); break; } goto array_begin;
    +      default: SIMDJSON_TRY( visitor.visit_primitive(*this, value) ); break;
    +    }
    +  }
    +
    +object_continue:
    +  switch (*advance()) {
    +    case ',':
    +      SIMDJSON_TRY( visitor.increment_count(*this) );
    +      {
    +        auto key = advance();
    +        if (simdjson_unlikely( *key != '"' )) { log_error("Key string missing at beginning of field in object"); return TAPE_ERROR; }
    +        SIMDJSON_TRY( visitor.visit_key(*this, key) );
    +      }
    +      goto object_field;
    +    case '}': log_end_value("object"); SIMDJSON_TRY( visitor.visit_object_end(*this) ); goto scope_end;
    +    default: log_error("No comma between object fields"); return TAPE_ERROR;
    +  }
    +
    +scope_end:
    +  depth--;
    +  if (depth == 0) { goto document_end; }
    +  if (dom_parser.is_array[depth]) { goto array_continue; }
    +  goto object_continue;
    +
    +//
    +// Array parser states
    +//
    +array_begin:
    +  log_start_value("array");
    +  depth++;
    +  if (depth >= dom_parser.max_depth()) { log_error("Exceeded max depth!"); return DEPTH_ERROR; }
    +  dom_parser.is_array[depth] = true;
    +  SIMDJSON_TRY( visitor.visit_array_start(*this) );
    +  SIMDJSON_TRY( visitor.increment_count(*this) );
    +
    +array_value:
    +  {
    +    auto value = advance();
    +    switch (*value) {
    +      case '{': if (*peek() == '}') { advance(); log_value("empty object"); SIMDJSON_TRY( visitor.visit_empty_object(*this) ); break; } goto object_begin;
    +      case '[': if (*peek() == ']') { advance(); log_value("empty array"); SIMDJSON_TRY( visitor.visit_empty_array(*this) ); break; } goto array_begin;
    +      default: SIMDJSON_TRY( visitor.visit_primitive(*this, value) ); break;
    +    }
    +  }
    +
    +array_continue:
    +  switch (*advance()) {
    +    case ',': SIMDJSON_TRY( visitor.increment_count(*this) ); goto array_value;
    +    case ']': log_end_value("array"); SIMDJSON_TRY( visitor.visit_array_end(*this) ); goto scope_end;
    +    default: log_error("Missing comma between array values"); return TAPE_ERROR;
    +  }
    +
    +document_end:
    +  log_end_value("document");
    +  SIMDJSON_TRY( visitor.visit_document_end(*this) );
    +
    +  dom_parser.next_structural_index = uint32_t(next_structural - &dom_parser.structural_indexes[0]);
    +
    +  // If we didn't make it to the end, it's an error
    +  if ( !STREAMING && dom_parser.next_structural_index != dom_parser.n_structural_indexes ) {
    +    log_error("More than one JSON value at the root of the document, or extra characters at the end of the JSON!");
    +    return TAPE_ERROR;
    +  }
    +
    +  return SUCCESS;
    +
    +} // walk_document()
    +
    +simdjson_inline json_iterator::json_iterator(dom_parser_implementation &_dom_parser, size_t start_structural_index)
    +  : buf{_dom_parser.buf},
    +    next_structural{&_dom_parser.structural_indexes[start_structural_index]},
    +    dom_parser{_dom_parser} {
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::peek() const noexcept {
    +  return &buf[*(next_structural)];
    +}
    +simdjson_inline const uint8_t *json_iterator::advance() noexcept {
    +  return &buf[*(next_structural++)];
    +}
    +simdjson_inline size_t json_iterator::remaining_len() const noexcept {
    +  return dom_parser.len - *(next_structural-1);
    +}
    +
    +simdjson_inline bool json_iterator::at_eof() const noexcept {
    +  return next_structural == &dom_parser.structural_indexes[dom_parser.n_structural_indexes];
    +}
    +simdjson_inline bool json_iterator::at_beginning() const noexcept {
    +  return next_structural == dom_parser.structural_indexes.get();
    +}
    +simdjson_inline uint8_t json_iterator::last_structural() const noexcept {
    +  return buf[dom_parser.structural_indexes[dom_parser.n_structural_indexes - 1]];
    +}
    +
    +simdjson_inline void json_iterator::log_value(const char *type) const noexcept {
    +  logger::log_line(*this, "", type, "");
    +}
    +
    +simdjson_inline void json_iterator::log_start_value(const char *type) const noexcept {
    +  logger::log_line(*this, "+", type, "");
    +  if (logger::LOG_ENABLED) { logger::log_depth++; }
    +}
    +
    +simdjson_inline void json_iterator::log_end_value(const char *type) const noexcept {
    +  if (logger::LOG_ENABLED) { logger::log_depth--; }
    +  logger::log_line(*this, "-", type, "");
    +}
    +
    +simdjson_inline void json_iterator::log_error(const char *error) const noexcept {
    +  logger::log_line(*this, "", "ERROR", error);
    +}
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code json_iterator::visit_root_primitive(V &visitor, const uint8_t *value) noexcept {
    +  switch (*value) {
    +    case '"': return visitor.visit_root_string(*this, value);
    +    case 't': return visitor.visit_root_true_atom(*this, value);
    +    case 'f': return visitor.visit_root_false_atom(*this, value);
    +    case 'n': return visitor.visit_root_null_atom(*this, value);
    +    case '-':
    +    case '0': case '1': case '2': case '3': case '4':
    +    case '5': case '6': case '7': case '8': case '9':
    +      return visitor.visit_root_number(*this, value);
    +    default:
    +      log_error("Document starts with a non-value character");
    +      return TAPE_ERROR;
    +  }
    +}
    +template
    +simdjson_warn_unused simdjson_inline error_code json_iterator::visit_primitive(V &visitor, const uint8_t *value) noexcept {
    +  // Use the fact that most scalars are going to be either strings or numbers.
    +  if(*value == '"') {
    +    return visitor.visit_string(*this, value);
    +  } else if (((*value - '0')  < 10) || (*value == '-')) {
    +    return visitor.visit_number(*this, value);
    +  }
    +  // true, false, null are uncommon.
    +  switch (*value) {
    +    case 't': return visitor.visit_true_atom(*this, value);
    +    case 'f': return visitor.visit_false_atom(*this, value);
    +    case 'n': return visitor.visit_null_atom(*this, value);
    +    default:
    +      log_error("Non-value found when value was expected!");
    +      return TAPE_ERROR;
    +  }
    +}
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H
    +/* end file generic/stage2/json_iterator.h for fallback */
    +/* including generic/stage2/tape_writer.h for fallback: #include  */
    +/* begin file generic/stage2/tape_writer.h for fallback */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace {
    +namespace stage2 {
    +
    +struct tape_writer {
    +  /** The next place to write to tape */
    +  uint64_t *next_tape_loc;
    +
    +  /** Write a signed 64-bit value to tape. */
    +  simdjson_inline void append_s64(int64_t value) noexcept;
    +
    +  /** Write an unsigned 64-bit value to tape. */
    +  simdjson_inline void append_u64(uint64_t value) noexcept;
    +
    +  /** Write a double value to tape. */
    +  simdjson_inline void append_double(double value) noexcept;
    +
    +  /**
    +   * Append a tape entry (an 8-bit type,and 56 bits worth of value).
    +   */
    +  simdjson_inline void append(uint64_t val, internal::tape_type t) noexcept;
    +
    +  /**
    +   * Skip the current tape entry without writing.
    +   *
    +   * Used to skip the start of the container, since we'll come back later to fill it in when the
    +   * container ends.
    +   */
    +  simdjson_inline void skip() noexcept;
    +
    +  /**
    +   * Skip the number of tape entries necessary to write a large u64 or i64.
    +   */
    +  simdjson_inline void skip_large_integer() noexcept;
    +
    +  /**
    +   * Skip the number of tape entries necessary to write a double.
    +   */
    +  simdjson_inline void skip_double() noexcept;
    +
    +  /**
    +   * Write a value to a known location on tape.
    +   *
    +   * Used to go back and write out the start of a container after the container ends.
    +   */
    +  simdjson_inline static void write(uint64_t &tape_loc, uint64_t val, internal::tape_type t) noexcept;
    +
    +private:
    +  /**
    +   * Append both the tape entry, and a supplementary value following it. Used for types that need
    +   * all 64 bits, such as double and uint64_t.
    +   */
    +  template
    +  simdjson_inline void append2(uint64_t val, T val2, internal::tape_type t) noexcept;
    +}; // struct tape_writer
    +
    +simdjson_inline void tape_writer::append_s64(int64_t value) noexcept {
    +  append2(0, value, internal::tape_type::INT64);
    +}
    +
    +simdjson_inline void tape_writer::append_u64(uint64_t value) noexcept {
    +  append(0, internal::tape_type::UINT64);
    +  *next_tape_loc = value;
    +  next_tape_loc++;
    +}
    +
    +/** Write a double value to tape. */
    +simdjson_inline void tape_writer::append_double(double value) noexcept {
    +  append2(0, value, internal::tape_type::DOUBLE);
    +}
    +
    +simdjson_inline void tape_writer::skip() noexcept {
    +  next_tape_loc++;
    +}
    +
    +simdjson_inline void tape_writer::skip_large_integer() noexcept {
    +  next_tape_loc += 2;
    +}
    +
    +simdjson_inline void tape_writer::skip_double() noexcept {
    +  next_tape_loc += 2;
    +}
    +
    +simdjson_inline void tape_writer::append(uint64_t val, internal::tape_type t) noexcept {
    +  *next_tape_loc = val | ((uint64_t(char(t))) << 56);
    +  next_tape_loc++;
    +}
    +
    +template
    +simdjson_inline void tape_writer::append2(uint64_t val, T val2, internal::tape_type t) noexcept {
    +  append(val, t);
    +  static_assert(sizeof(val2) == sizeof(*next_tape_loc), "Type is not 64 bits!");
    +  memcpy(next_tape_loc, &val2, sizeof(val2));
    +  next_tape_loc++;
    +}
    +
    +simdjson_inline void tape_writer::write(uint64_t &tape_loc, uint64_t val, internal::tape_type t) noexcept {
    +  tape_loc = val | ((uint64_t(char(t))) << 56);
    +}
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H
    +/* end file generic/stage2/tape_writer.h for fallback */
    +/* including generic/stage2/tape_builder.h for fallback: #include  */
    +/* begin file generic/stage2/tape_builder.h for fallback */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace {
    +namespace stage2 {
    +
    +struct tape_builder {
    +  template
    +  simdjson_warn_unused static simdjson_inline error_code parse_document(
    +    dom_parser_implementation &dom_parser,
    +    dom::document &doc) noexcept;
    +
    +  /** Called when a non-empty document starts. */
    +  simdjson_warn_unused simdjson_inline error_code visit_document_start(json_iterator &iter) noexcept;
    +  /** Called when a non-empty document ends without error. */
    +  simdjson_warn_unused simdjson_inline error_code visit_document_end(json_iterator &iter) noexcept;
    +
    +  /** Called when a non-empty array starts. */
    +  simdjson_warn_unused simdjson_inline error_code visit_array_start(json_iterator &iter) noexcept;
    +  /** Called when a non-empty array ends. */
    +  simdjson_warn_unused simdjson_inline error_code visit_array_end(json_iterator &iter) noexcept;
    +  /** Called when an empty array is found. */
    +  simdjson_warn_unused simdjson_inline error_code visit_empty_array(json_iterator &iter) noexcept;
    +
    +  /** Called when a non-empty object starts. */
    +  simdjson_warn_unused simdjson_inline error_code visit_object_start(json_iterator &iter) noexcept;
    +  /**
    +   * Called when a key in a field is encountered.
    +   *
    +   * primitive, visit_object_start, visit_empty_object, visit_array_start, or visit_empty_array
    +   * will be called after this with the field value.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code visit_key(json_iterator &iter, const uint8_t *key) noexcept;
    +  /** Called when a non-empty object ends. */
    +  simdjson_warn_unused simdjson_inline error_code visit_object_end(json_iterator &iter) noexcept;
    +  /** Called when an empty object is found. */
    +  simdjson_warn_unused simdjson_inline error_code visit_empty_object(json_iterator &iter) noexcept;
    +
    +  /**
    +   * Called when a string, number, boolean or null is found.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code visit_primitive(json_iterator &iter, const uint8_t *value) noexcept;
    +  /**
    +   * Called when a string, number, boolean or null is found at the top level of a document (i.e.
    +   * when there is no array or object and the entire document is a single string, number, boolean or
    +   * null.
    +   *
    +   * This is separate from primitive() because simdjson's normal primitive parsing routines assume
    +   * there is at least one more token after the value, which is only true in an array or object.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code visit_root_primitive(json_iterator &iter, const uint8_t *value) noexcept;
    +
    +  simdjson_warn_unused simdjson_inline error_code visit_string(json_iterator &iter, const uint8_t *value, bool key = false) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_number(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_true_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_false_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_null_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +
    +  simdjson_warn_unused simdjson_inline error_code visit_root_string(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_number(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_true_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_false_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_null_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +
    +  /** Called each time a new field or element in an array or object is found. */
    +  simdjson_warn_unused simdjson_inline error_code increment_count(json_iterator &iter) noexcept;
    +
    +  /** Next location to write to tape */
    +  tape_writer tape;
    +private:
    +  /** Next write location in the string buf for stage 2 parsing */
    +  uint8_t *current_string_buf_loc;
    +
    +  simdjson_inline tape_builder(dom::document &doc) noexcept;
    +
    +  simdjson_inline uint32_t next_tape_index(json_iterator &iter) const noexcept;
    +  simdjson_inline void start_container(json_iterator &iter) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code end_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code empty_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept;
    +  simdjson_inline uint8_t *on_start_string(json_iterator &iter) noexcept;
    +  simdjson_inline void on_end_string(uint8_t *dst) noexcept;
    +}; // struct tape_builder
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code tape_builder::parse_document(
    +    dom_parser_implementation &dom_parser,
    +    dom::document &doc) noexcept {
    +  dom_parser.doc = &doc;
    +  json_iterator iter(dom_parser, STREAMING ? dom_parser.next_structural_index : 0);
    +  tape_builder builder(doc);
    +  return iter.walk_document(builder);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_primitive(json_iterator &iter, const uint8_t *value) noexcept {
    +  return iter.visit_root_primitive(*this, value);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_primitive(json_iterator &iter, const uint8_t *value) noexcept {
    +  return iter.visit_primitive(*this, value);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_empty_object(json_iterator &iter) noexcept {
    +  return empty_container(iter, internal::tape_type::START_OBJECT, internal::tape_type::END_OBJECT);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_empty_array(json_iterator &iter) noexcept {
    +  return empty_container(iter, internal::tape_type::START_ARRAY, internal::tape_type::END_ARRAY);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_document_start(json_iterator &iter) noexcept {
    +  start_container(iter);
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_object_start(json_iterator &iter) noexcept {
    +  start_container(iter);
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_array_start(json_iterator &iter) noexcept {
    +  start_container(iter);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_object_end(json_iterator &iter) noexcept {
    +  return end_container(iter, internal::tape_type::START_OBJECT, internal::tape_type::END_OBJECT);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_array_end(json_iterator &iter) noexcept {
    +  return end_container(iter, internal::tape_type::START_ARRAY, internal::tape_type::END_ARRAY);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_document_end(json_iterator &iter) noexcept {
    +  constexpr uint32_t start_tape_index = 0;
    +  tape.append(start_tape_index, internal::tape_type::ROOT);
    +  tape_writer::write(iter.dom_parser.doc->tape[start_tape_index], next_tape_index(iter), internal::tape_type::ROOT);
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_key(json_iterator &iter, const uint8_t *key) noexcept {
    +  return visit_string(iter, key, true);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::increment_count(json_iterator &iter) noexcept {
    +  iter.dom_parser.open_containers[iter.depth].count++; // we have a key value pair in the object at parser.dom_parser.depth - 1
    +  return SUCCESS;
    +}
    +
    +simdjson_inline tape_builder::tape_builder(dom::document &doc) noexcept : tape{doc.tape.get()}, current_string_buf_loc{doc.string_buf.get()} {}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_string(json_iterator &iter, const uint8_t *value, bool key) noexcept {
    +  iter.log_value(key ? "key" : "string");
    +  uint8_t *dst = on_start_string(iter);
    +  dst = stringparsing::parse_string(value+1, dst, false); // We do not allow replacement when the escape characters are invalid.
    +  if (dst == nullptr) {
    +    iter.log_error("Invalid escape in string");
    +    return STRING_ERROR;
    +  }
    +  on_end_string(dst);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_string(json_iterator &iter, const uint8_t *value) noexcept {
    +  return visit_string(iter, value);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_number(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("number");
    +  return numberparsing::parse_number(value, tape);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_number(json_iterator &iter, const uint8_t *value) noexcept {
    +  //
    +  // We need to make a copy to make sure that the string is space terminated.
    +  // This is not about padding the input, which should already padded up
    +  // to len + SIMDJSON_PADDING. However, we have no control at this stage
    +  // on how the padding was done. What if the input string was padded with nulls?
    +  // It is quite common for an input string to have an extra null character (C string).
    +  // We do not want to allow 9\0 (where \0 is the null character) inside a JSON
    +  // document, but the string "9\0" by itself is fine. So we make a copy and
    +  // pad the input with spaces when we know that there is just one input element.
    +  // This copy is relatively expensive, but it will almost never be called in
    +  // practice unless you are in the strange scenario where you have many JSON
    +  // documents made of single atoms.
    +  //
    +  std::unique_ptrcopy(new (std::nothrow) uint8_t[iter.remaining_len() + SIMDJSON_PADDING]);
    +  if (copy.get() == nullptr) { return MEMALLOC; }
    +  std::memcpy(copy.get(), value, iter.remaining_len());
    +  std::memset(copy.get() + iter.remaining_len(), ' ', SIMDJSON_PADDING);
    +  error_code error = visit_number(iter, copy.get());
    +  return error;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_true_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("true");
    +  if (!atomparsing::is_valid_true_atom(value)) { return T_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::TRUE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_true_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("true");
    +  if (!atomparsing::is_valid_true_atom(value, iter.remaining_len())) { return T_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::TRUE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_false_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("false");
    +  if (!atomparsing::is_valid_false_atom(value)) { return F_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::FALSE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_false_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("false");
    +  if (!atomparsing::is_valid_false_atom(value, iter.remaining_len())) { return F_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::FALSE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_null_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("null");
    +  if (!atomparsing::is_valid_null_atom(value)) { return N_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::NULL_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_null_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("null");
    +  if (!atomparsing::is_valid_null_atom(value, iter.remaining_len())) { return N_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::NULL_VALUE);
    +  return SUCCESS;
    +}
    +
    +// private:
    +
    +simdjson_inline uint32_t tape_builder::next_tape_index(json_iterator &iter) const noexcept {
    +  return uint32_t(tape.next_tape_loc - iter.dom_parser.doc->tape.get());
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::empty_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept {
    +  auto start_index = next_tape_index(iter);
    +  tape.append(start_index+2, start);
    +  tape.append(start_index, end);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline void tape_builder::start_container(json_iterator &iter) noexcept {
    +  iter.dom_parser.open_containers[iter.depth].tape_index = next_tape_index(iter);
    +  iter.dom_parser.open_containers[iter.depth].count = 0;
    +  tape.skip(); // We don't actually *write* the start element until the end.
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::end_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept {
    +  // Write the ending tape element, pointing at the start location
    +  const uint32_t start_tape_index = iter.dom_parser.open_containers[iter.depth].tape_index;
    +  tape.append(start_tape_index, end);
    +  // Write the start tape element, pointing at the end location (and including count)
    +  // count can overflow if it exceeds 24 bits... so we saturate
    +  // the convention being that a cnt of 0xffffff or more is undetermined in value (>=  0xffffff).
    +  const uint32_t count = iter.dom_parser.open_containers[iter.depth].count;
    +  const uint32_t cntsat = count > 0xFFFFFF ? 0xFFFFFF : count;
    +  tape_writer::write(iter.dom_parser.doc->tape[start_tape_index], next_tape_index(iter) | (uint64_t(cntsat) << 32), start);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline uint8_t *tape_builder::on_start_string(json_iterator &iter) noexcept {
    +  // we advance the point, accounting for the fact that we have a NULL termination
    +  tape.append(current_string_buf_loc - iter.dom_parser.doc->string_buf.get(), internal::tape_type::STRING);
    +  return current_string_buf_loc + sizeof(uint32_t);
    +}
    +
    +simdjson_inline void tape_builder::on_end_string(uint8_t *dst) noexcept {
    +  uint32_t str_length = uint32_t(dst - (current_string_buf_loc + sizeof(uint32_t)));
    +  // TODO check for overflow in case someone has a crazy string (>=4GB?)
    +  // But only add the overflow check when the document itself exceeds 4GB
    +  // Currently unneeded because we refuse to parse docs larger or equal to 4GB.
    +  memcpy(current_string_buf_loc, &str_length, sizeof(uint32_t));
    +  // NULL termination is still handy if you expect all your strings to
    +  // be NULL terminated? It comes at a small cost
    +  *dst = 0;
    +  current_string_buf_loc = dst + 1;
    +}
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H
    +/* end file generic/stage2/tape_builder.h for fallback */
    +
    +//
    +// Stage 1
    +//
    +
    +namespace simdjson {
    +namespace fallback {
    +
    +simdjson_warn_unused error_code implementation::create_dom_parser_implementation(
    +  size_t capacity,
    +  size_t max_depth,
    +  std::unique_ptr& dst
    +) const noexcept {
    +  dst.reset( new (std::nothrow) fallback::dom_parser_implementation() );
    +  if (!dst) { return MEMALLOC; }
    +  if (auto err = dst->set_capacity(capacity))
    +    return err;
    +  if (auto err = dst->set_max_depth(max_depth))
    +    return err;
    +  return SUCCESS;
    +}
    +
    +namespace {
    +namespace stage1 {
    +
    +class structural_scanner {
    +public:
    +
    +simdjson_inline structural_scanner(dom_parser_implementation &_parser, stage1_mode _partial)
    +  : buf{_parser.buf},
    +    next_structural_index{_parser.structural_indexes.get()},
    +    parser{_parser},
    +    len{static_cast(_parser.len)},
    +    partial{_partial} {
    +}
    +
    +simdjson_inline void add_structural() {
    +  *next_structural_index = idx;
    +  next_structural_index++;
    +}
    +
    +simdjson_inline bool is_continuation(uint8_t c) {
    +  return (c & 0xc0) == 0x80;
    +}
    +
    +simdjson_inline void validate_utf8_character() {
    +  // Continuation
    +  if (simdjson_unlikely((buf[idx] & 0x40) == 0)) {
    +    // extra continuation
    +    error = UTF8_ERROR;
    +    idx++;
    +    return;
    +  }
    +
    +  // 2-byte
    +  if ((buf[idx] & 0x20) == 0) {
    +    // missing continuation
    +    if (simdjson_unlikely(idx+1 > len || !is_continuation(buf[idx+1]))) {
    +      if (idx+1 > len && is_streaming(partial)) { idx = len; return; }
    +      error = UTF8_ERROR;
    +      idx++;
    +      return;
    +    }
    +    // overlong: 1100000_ 10______
    +    if (buf[idx] <= 0xc1) { error = UTF8_ERROR; }
    +    idx += 2;
    +    return;
    +  }
    +
    +  // 3-byte
    +  if ((buf[idx] & 0x10) == 0) {
    +    // missing continuation
    +    if (simdjson_unlikely(idx+2 > len || !is_continuation(buf[idx+1]) || !is_continuation(buf[idx+2]))) {
    +      if (idx+2 > len && is_streaming(partial)) { idx = len; return; }
    +      error = UTF8_ERROR;
    +      idx++;
    +      return;
    +    }
    +    // overlong: 11100000 100_____ ________
    +    if (buf[idx] == 0xe0 && buf[idx+1] <= 0x9f) { error = UTF8_ERROR; }
    +    // surrogates: U+D800-U+DFFF 11101101 101_____
    +    if (buf[idx] == 0xed && buf[idx+1] >= 0xa0) { error = UTF8_ERROR; }
    +    idx += 3;
    +    return;
    +  }
    +
    +  // 4-byte
    +  // missing continuation
    +  if (simdjson_unlikely(idx+3 > len || !is_continuation(buf[idx+1]) || !is_continuation(buf[idx+2]) || !is_continuation(buf[idx+3]))) {
    +    if (idx+2 > len && is_streaming(partial)) { idx = len; return; }
    +    error = UTF8_ERROR;
    +    idx++;
    +    return;
    +  }
    +  // overlong: 11110000 1000____ ________ ________
    +  if (buf[idx] == 0xf0 && buf[idx+1] <= 0x8f) { error = UTF8_ERROR; }
    +  // too large: > U+10FFFF:
    +  // 11110100 (1001|101_)____
    +  // 1111(1___|011_|0101) 10______
    +  // also includes 5, 6, 7 and 8 byte characters:
    +  // 11111___
    +  if (buf[idx] == 0xf4 && buf[idx+1] >= 0x90) { error = UTF8_ERROR; }
    +  if (buf[idx] >= 0xf5) { error = UTF8_ERROR; }
    +  idx += 4;
    +}
    +
    +// Returns true if the string is unclosed.
    +simdjson_inline bool validate_string() {
    +  idx++; // skip first quote
    +  while (idx < len && buf[idx] != '"') {
    +    if (buf[idx] == '\\') {
    +      idx += 2;
    +    } else if (simdjson_unlikely(buf[idx] & 0x80)) {
    +      validate_utf8_character();
    +    } else {
    +      if (buf[idx] < 0x20) { error = UNESCAPED_CHARS; }
    +      idx++;
    +    }
    +  }
    +  if (idx >= len) { return true; }
    +  return false;
    +}
    +
    +simdjson_inline bool is_whitespace_or_operator(uint8_t c) {
    +  switch (c) {
    +    case '{': case '}': case '[': case ']': case ',': case ':':
    +    case ' ': case '\r': case '\n': case '\t':
    +      return true;
    +    default:
    +      return false;
    +  }
    +}
    +
    +//
    +// Parse the entire input in STEP_SIZE-byte chunks.
    +//
    +simdjson_inline error_code scan() {
    +  bool unclosed_string = false;
    +  for (;idx 0) {
    +      if(parser.structural_indexes[0] == 0) {
    +        // If the buffer is partial and we started at index 0 but the document is
    +        // incomplete, it's too big to parse.
    +        return CAPACITY;
    +      } else {
    +        // It is possible that the document could be parsed, we just had a lot
    +        // of white space.
    +        parser.n_structural_indexes = 0;
    +        return EMPTY;
    +      }
    +    }
    +    parser.n_structural_indexes = new_structural_indexes;
    +  } else if(partial == stage1_mode::streaming_final) {
    +    if(unclosed_string) { parser.n_structural_indexes--; }
    +    // We truncate the input to the end of the last complete document (or zero).
    +    // Because partial == stage1_mode::streaming_final, it means that we may
    +    // silently ignore trailing garbage. Though it sounds bad, we do it
    +    // deliberately because many people who have streams of JSON documents
    +    // will truncate them for processing. E.g., imagine that you are uncompressing
    +    // the data from a size file or receiving it in chunks from the network. You
    +    // may not know where exactly the last document will be. Meanwhile the
    +    // document_stream instances allow people to know the JSON documents they are
    +    // parsing (see the iterator.source() method).
    +    parser.n_structural_indexes = find_next_document_index(parser);
    +    // We store the initial n_structural_indexes so that the client can see
    +    // whether we used truncation. If initial_n_structural_indexes == parser.n_structural_indexes,
    +    // then this will query parser.structural_indexes[parser.n_structural_indexes] which is len,
    +    // otherwise, it will copy some prior index.
    +    parser.structural_indexes[parser.n_structural_indexes + 1] = parser.structural_indexes[parser.n_structural_indexes];
    +    // This next line is critical, do not change it unless you understand what you are
    +    // doing.
    +    parser.structural_indexes[parser.n_structural_indexes] = uint32_t(len);
    +    if (parser.n_structural_indexes == 0) { return EMPTY; }
    +  } else if(unclosed_string) { error = UNCLOSED_STRING; }
    +  return error;
    +}
    +
    +private:
    +  const uint8_t *buf;
    +  uint32_t *next_structural_index;
    +  dom_parser_implementation &parser;
    +  uint32_t len;
    +  uint32_t idx{0};
    +  error_code error{SUCCESS};
    +  stage1_mode partial;
    +}; // structural_scanner
    +
    +} // namespace stage1
    +} // unnamed namespace
    +
    +simdjson_warn_unused error_code dom_parser_implementation::stage1(const uint8_t *_buf, size_t _len, stage1_mode partial) noexcept {
    +  this->buf = _buf;
    +  this->len = _len;
    +  stage1::structural_scanner scanner(*this, partial);
    +  return scanner.scan();
    +}
    +
    +// big table for the minifier
    +static uint8_t jump_table[256 * 3] = {
    +    0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0,
    +    1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1,
    +    1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
    +    0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0,
    +    1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1,
    +    1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
    +    0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0,
    +    1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1,
    +    1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
    +    0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0,
    +    1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1,
    +    1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
    +    0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0,
    +    1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1,
    +    1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
    +    0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0,
    +    1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1,
    +    1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
    +    0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0,
    +    1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1,
    +    1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
    +    0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0,
    +    1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1,
    +    1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
    +    0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0,
    +    1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1,
    +    1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
    +    0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0,
    +    1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1,
    +    1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
    +    0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1,
    +};
    +
    +simdjson_warn_unused error_code implementation::minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept {
    +  size_t i = 0, pos = 0;
    +  uint8_t quote = 0;
    +  uint8_t nonescape = 1;
    +
    +  while (i < len) {
    +    unsigned char c = buf[i];
    +    uint8_t *meta = jump_table + 3 * c;
    +
    +    quote = quote ^ (meta[0] & nonescape);
    +    dst[pos] = c;
    +    pos += meta[2] | quote;
    +
    +    i += 1;
    +    nonescape = uint8_t(~nonescape) | (meta[1]);
    +  }
    +  dst_len = pos; // we intentionally do not work with a reference
    +  // for fear of aliasing
    +  return quote ? UNCLOSED_STRING : SUCCESS;
    +}
    +
    +// credit: based on code from Google Fuchsia (Apache Licensed)
    +simdjson_warn_unused bool implementation::validate_utf8(const char *buf, size_t len) const noexcept {
    +  const uint8_t *data = reinterpret_cast(buf);
    +  uint64_t pos = 0;
    +  uint32_t code_point = 0;
    +  while (pos < len) {
    +    // check of the next 8 bytes are ascii.
    +    uint64_t next_pos = pos + 16;
    +    if (next_pos <= len) { // if it is safe to read 8 more bytes, check that they are ascii
    +      uint64_t v1;
    +      memcpy(&v1, data + pos, sizeof(uint64_t));
    +      uint64_t v2;
    +      memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t));
    +      uint64_t v{v1 | v2};
    +      if ((v & 0x8080808080808080) == 0) {
    +        pos = next_pos;
    +        continue;
    +      }
    +    }
    +    unsigned char byte = data[pos];
    +    if (byte < 0x80) {
    +      pos++;
    +      continue;
    +    } else if ((byte & 0xe0) == 0xc0) {
    +      next_pos = pos + 2;
    +      if (next_pos > len) { return false; }
    +      if ((data[pos + 1] & 0xc0) != 0x80) { return false; }
    +      // range check
    +      code_point = (byte & 0x1f) << 6 | (data[pos + 1] & 0x3f);
    +      if (code_point < 0x80 || 0x7ff < code_point) { return false; }
    +    } else if ((byte & 0xf0) == 0xe0) {
    +      next_pos = pos + 3;
    +      if (next_pos > len) { return false; }
    +      if ((data[pos + 1] & 0xc0) != 0x80) { return false; }
    +      if ((data[pos + 2] & 0xc0) != 0x80) { return false; }
    +      // range check
    +      code_point = (byte & 0x0f) << 12 |
    +                   (data[pos + 1] & 0x3f) << 6 |
    +                   (data[pos + 2] & 0x3f);
    +      if (code_point < 0x800 || 0xffff < code_point ||
    +          (0xd7ff < code_point && code_point < 0xe000)) {
    +        return false;
    +      }
    +    } else if ((byte & 0xf8) == 0xf0) { // 0b11110000
    +      next_pos = pos + 4;
    +      if (next_pos > len) { return false; }
    +      if ((data[pos + 1] & 0xc0) != 0x80) { return false; }
    +      if ((data[pos + 2] & 0xc0) != 0x80) { return false; }
    +      if ((data[pos + 3] & 0xc0) != 0x80) { return false; }
    +      // range check
    +      code_point =
    +          (byte & 0x07) << 18 | (data[pos + 1] & 0x3f) << 12 |
    +          (data[pos + 2] & 0x3f) << 6 | (data[pos + 3] & 0x3f);
    +      if (code_point <= 0xffff || 0x10ffff < code_point) { return false; }
    +    } else {
    +      // we may have a continuation
    +      return false;
    +    }
    +    pos = next_pos;
    +  }
    +  return true;
    +}
    +
    +} // namespace fallback
    +} // namespace simdjson
    +
    +//
    +// Stage 2
    +//
    +
    +namespace simdjson {
    +namespace fallback {
    +
    +simdjson_warn_unused error_code dom_parser_implementation::stage2(dom::document &_doc) noexcept {
    +  return stage2::tape_builder::parse_document(*this, _doc);
    +}
    +
    +simdjson_warn_unused error_code dom_parser_implementation::stage2_next(dom::document &_doc) noexcept {
    +  return stage2::tape_builder::parse_document(*this, _doc);
    +}
    +
    +simdjson_warn_unused uint8_t *dom_parser_implementation::parse_string(const uint8_t *src, uint8_t *dst, bool replacement_char) const noexcept {
    +  return fallback::stringparsing::parse_string(src, dst, replacement_char);
    +}
    +
    +simdjson_warn_unused uint8_t *dom_parser_implementation::parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept {
    +  return fallback::stringparsing::parse_wobbly_string(src, dst);
    +}
    +
    +simdjson_warn_unused error_code dom_parser_implementation::parse(const uint8_t *_buf, size_t _len, dom::document &_doc) noexcept {
    +  auto error = stage1(_buf, _len, stage1_mode::regular);
    +  if (error) { return error; }
    +  return stage2(_doc);
    +}
    +
    +} // namespace fallback
    +} // namespace simdjson
    +
    +/* including simdjson/fallback/end.h: #include  */
    +/* begin file simdjson/fallback/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +/* undefining SIMDJSON_IMPLEMENTATION from "fallback" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/fallback/end.h */
    +
    +#endif // SIMDJSON_SRC_FALLBACK_CPP
    +/* end file fallback.cpp */
    +#endif
    +#if SIMDJSON_IMPLEMENTATION_HASWELL
    +/* including haswell.cpp: #include  */
    +/* begin file haswell.cpp */
    +#ifndef SIMDJSON_SRC_HASWELL_CPP
    +#define SIMDJSON_SRC_HASWELL_CPP
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +/* including simdjson/haswell.h: #include  */
    +/* begin file simdjson/haswell.h */
    +#ifndef SIMDJSON_HASWELL_H
    +#define SIMDJSON_HASWELL_H
    +
    +/* including simdjson/haswell/begin.h: #include "simdjson/haswell/begin.h" */
    +/* begin file simdjson/haswell/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "haswell" */
    +#define SIMDJSON_IMPLEMENTATION haswell
    +
    +/* including simdjson/haswell/base.h: #include "simdjson/haswell/base.h" */
    +/* begin file simdjson/haswell/base.h */
    +#ifndef SIMDJSON_HASWELL_BASE_H
    +#define SIMDJSON_HASWELL_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_HASWELL
    +namespace simdjson {
    +/**
    + * Implementation for Haswell (Intel AVX2).
    + */
    +namespace haswell {
    +
    +class implementation;
    +
    +namespace {
    +namespace simd {
    +template  struct simd8;
    +template  struct simd8x64;
    +} // namespace simd
    +} // unnamed namespace
    +
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_HASWELL_BASE_H
    +/* end file simdjson/haswell/base.h */
    +/* including simdjson/haswell/intrinsics.h: #include "simdjson/haswell/intrinsics.h" */
    +/* begin file simdjson/haswell/intrinsics.h */
    +#ifndef SIMDJSON_HASWELL_INTRINSICS_H
    +#define SIMDJSON_HASWELL_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if SIMDJSON_VISUAL_STUDIO
    +// under clang within visual studio, this will include 
    +#include   // visual studio or clang
    +#else
    +#include  // elsewhere
    +#endif // SIMDJSON_VISUAL_STUDIO
    +
    +#if SIMDJSON_CLANG_VISUAL_STUDIO
    +/**
    + * You are not supposed, normally, to include these
    + * headers directly. Instead you should either include intrin.h
    + * or x86intrin.h. However, when compiling with clang
    + * under Windows (i.e., when _MSC_VER is set), these headers
    + * only get included *if* the corresponding features are detected
    + * from macros:
    + * e.g., if __AVX2__ is set... in turn,  we normally set these
    + * macros by compiling against the corresponding architecture
    + * (e.g., arch:AVX2, -mavx2, etc.) which compiles the whole
    + * software with these advanced instructions. In simdjson, we
    + * want to compile the whole program for a generic target,
    + * and only target our specific kernels. As a workaround,
    + * we directly include the needed headers. These headers would
    + * normally guard against such usage, but we carefully included
    + *   (or ) before, so the headers
    + * are fooled.
    + */
    +#include    // for _blsr_u64
    +#include  // for  __lzcnt64
    +#include    // for most things (AVX2, AVX512, _popcnt64)
    +#include 
    +#include 
    +#include 
    +#include 
    +#include    // for  _mm_clmulepi64_si128
    +// unfortunately, we may not get _blsr_u64, but, thankfully, clang
    +// has it as a macro.
    +#ifndef _blsr_u64
    +// we roll our own
    +#define _blsr_u64(n) ((n - 1) & n)
    +#endif //  _blsr_u64
    +#endif // SIMDJSON_CLANG_VISUAL_STUDIO
    +
    +static_assert(sizeof(__m256i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for haswell kernel.");
    +
    +#endif // SIMDJSON_HASWELL_INTRINSICS_H
    +/* end file simdjson/haswell/intrinsics.h */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_HASWELL
    +SIMDJSON_TARGET_REGION("avx2,bmi,pclmul,lzcnt,popcnt")
    +#endif
    +
    +/* including simdjson/haswell/bitmanipulation.h: #include "simdjson/haswell/bitmanipulation.h" */
    +/* begin file simdjson/haswell/bitmanipulation.h */
    +#ifndef SIMDJSON_HASWELL_BITMANIPULATION_H
    +#define SIMDJSON_HASWELL_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/bitmask.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return (int)_tzcnt_u64(input_num);
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  ////////
    +  // You might expect the next line to be equivalent to
    +  // return (int)_tzcnt_u64(input_num);
    +  // but the generated code differs and might be less efficient?
    +  ////////
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return _blsr_u64(input_num);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +  return int(_lzcnt_u64(input_num));
    +}
    +
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +simdjson_inline unsigned __int64 count_ones(uint64_t input_num) {
    +  // note: we do not support legacy 32-bit Windows in this kernel
    +  return __popcnt64(input_num);// Visual Studio wants two underscores
    +}
    +#else
    +simdjson_inline long long int count_ones(uint64_t input_num) {
    +  return _popcnt64(input_num);
    +}
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2,
    +                                uint64_t *result) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return _addcarry_u64(0, value1, value2,
    +                       reinterpret_cast(result));
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_HASWELL_BITMANIPULATION_H
    +/* end file simdjson/haswell/bitmanipulation.h */
    +/* including simdjson/haswell/bitmask.h: #include "simdjson/haswell/bitmask.h" */
    +/* begin file simdjson/haswell/bitmask.h */
    +#ifndef SIMDJSON_HASWELL_BITMASK_H
    +#define SIMDJSON_HASWELL_BITMASK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +
    +//
    +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered.
    +//
    +// For example, prefix_xor(00100100) == 00011100
    +//
    +simdjson_inline uint64_t prefix_xor(const uint64_t bitmask) {
    +  // There should be no such thing with a processor supporting avx2
    +  // but not clmul.
    +  __m128i all_ones = _mm_set1_epi8('\xFF');
    +  __m128i result = _mm_clmulepi64_si128(_mm_set_epi64x(0ULL, bitmask), all_ones, 0);
    +  return _mm_cvtsi128_si64(result);
    +}
    +
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_HASWELL_BITMASK_H
    +/* end file simdjson/haswell/bitmask.h */
    +/* including simdjson/haswell/numberparsing_defs.h: #include "simdjson/haswell/numberparsing_defs.h" */
    +/* begin file simdjson/haswell/numberparsing_defs.h */
    +#ifndef SIMDJSON_HASWELL_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_HASWELL_NUMBERPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace numberparsing {
    +
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  // this actually computes *16* values so we are being wasteful.
    +  const __m128i ascii0 = _mm_set1_epi8('0');
    +  const __m128i mul_1_10 =
    +      _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1);
    +  const __m128i mul_1_100 = _mm_setr_epi16(100, 1, 100, 1, 100, 1, 100, 1);
    +  const __m128i mul_1_10000 =
    +      _mm_setr_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1);
    +  const __m128i input = _mm_sub_epi8(
    +      _mm_loadu_si128(reinterpret_cast(chars)), ascii0);
    +  const __m128i t1 = _mm_maddubs_epi16(input, mul_1_10);
    +  const __m128i t2 = _mm_madd_epi16(t1, mul_1_100);
    +  const __m128i t3 = _mm_packus_epi32(t2, t2);
    +  const __m128i t4 = _mm_madd_epi16(t3, mul_1_10000);
    +  return _mm_cvtsi128_si32(
    +      t4); // only captures the sum of the first 8 digits, drop the rest
    +}
    +
    +/** @private */
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif // SIMDJSON_HASWELL_NUMBERPARSING_DEFS_H
    +/* end file simdjson/haswell/numberparsing_defs.h */
    +/* including simdjson/haswell/simd.h: #include "simdjson/haswell/simd.h" */
    +/* begin file simdjson/haswell/simd.h */
    +#ifndef SIMDJSON_HASWELL_SIMD_H
    +#define SIMDJSON_HASWELL_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +namespace simd {
    +
    +  // Forward-declared so they can be used by splat and friends.
    +  template
    +  struct base {
    +    __m256i value;
    +
    +    // Zero constructor
    +    simdjson_inline base() : value{__m256i()} {}
    +
    +    // Conversion from SIMD register
    +    simdjson_inline base(const __m256i _value) : value(_value) {}
    +
    +    // Conversion to SIMD register
    +    simdjson_inline operator const __m256i&() const { return this->value; }
    +    simdjson_inline operator __m256i&() { return this->value; }
    +
    +    // Bit operations
    +    simdjson_inline Child operator|(const Child other) const { return _mm256_or_si256(*this, other); }
    +    simdjson_inline Child operator&(const Child other) const { return _mm256_and_si256(*this, other); }
    +    simdjson_inline Child operator^(const Child other) const { return _mm256_xor_si256(*this, other); }
    +    simdjson_inline Child bit_andnot(const Child other) const { return _mm256_andnot_si256(other, *this); }
    +    simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast | other; return *this_cast; }
    +    simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast & other; return *this_cast; }
    +    simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast ^ other; return *this_cast; }
    +  };
    +
    +  // Forward-declared so they can be used by splat and friends.
    +  template
    +  struct simd8;
    +
    +  template>
    +  struct base8: base> {
    +    typedef uint32_t bitmask_t;
    +    typedef uint64_t bitmask2_t;
    +
    +    simdjson_inline base8() : base>() {}
    +    simdjson_inline base8(const __m256i _value) : base>(_value) {}
    +
    +    friend simdjson_really_inline Mask operator==(const simd8 lhs, const simd8 rhs) { return _mm256_cmpeq_epi8(lhs, rhs); }
    +
    +    static const int SIZE = sizeof(base::value);
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +      return _mm256_alignr_epi8(*this, _mm256_permute2x128_si256(prev_chunk, *this, 0x21), 16 - N);
    +    }
    +  };
    +
    +  // SIMD byte mask type (returned by things like eq and gt)
    +  template<>
    +  struct simd8: base8 {
    +    static simdjson_inline simd8 splat(bool _value) { return _mm256_set1_epi8(uint8_t(-(!!_value))); }
    +
    +    simdjson_inline simd8() : base8() {}
    +    simdjson_inline simd8(const __m256i _value) : base8(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(bool _value) : base8(splat(_value)) {}
    +
    +    simdjson_inline int to_bitmask() const { return _mm256_movemask_epi8(*this); }
    +    simdjson_inline bool any() const { return !_mm256_testz_si256(*this, *this); }
    +    simdjson_inline simd8 operator~() const { return *this ^ true; }
    +  };
    +
    +  template
    +  struct base8_numeric: base8 {
    +    static simdjson_inline simd8 splat(T _value) { return _mm256_set1_epi8(_value); }
    +    static simdjson_inline simd8 zero() { return _mm256_setzero_si256(); }
    +    static simdjson_inline simd8 load(const T values[32]) {
    +      return _mm256_loadu_si256(reinterpret_cast(values));
    +    }
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    static simdjson_inline simd8 repeat_16(
    +      T v0,  T v1,  T v2,  T v3,  T v4,  T v5,  T v6,  T v7,
    +      T v8,  T v9,  T v10, T v11, T v12, T v13, T v14, T v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    simdjson_inline base8_numeric() : base8() {}
    +    simdjson_inline base8_numeric(const __m256i _value) : base8(_value) {}
    +
    +    // Store to array
    +    simdjson_inline void store(T dst[32]) const { return _mm256_storeu_si256(reinterpret_cast<__m256i *>(dst), *this); }
    +
    +    // Addition/subtraction are the same for signed and unsigned
    +    simdjson_inline simd8 operator+(const simd8 other) const { return _mm256_add_epi8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return _mm256_sub_epi8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *static_cast*>(this); }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *static_cast*>(this); }
    +
    +    // Override to distinguish from bool version
    +    simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +
    +    // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values)
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return _mm256_shuffle_epi8(lookup_table, *this);
    +    }
    +
    +    // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset).
    +    // Passing a 0 value for mask would be equivalent to writing out every byte to output.
    +    // Only the first 32 - count_ones(mask) bytes of the result are significant but 32 bytes
    +    // get written.
    +    // Design consideration: it seems like a function with the
    +    // signature simd8 compress(uint32_t mask) would be
    +    // sensible, but the AVX ISA makes this kind of approach difficult.
    +    template
    +    simdjson_inline void compress(uint32_t mask, L * output) const {
    +      using internal::thintable_epi8;
    +      using internal::BitsSetTable256mul2;
    +      using internal::pshufb_combine_table;
    +      // this particular implementation was inspired by work done by @animetosho
    +      // we do it in four steps, first 8 bytes and then second 8 bytes...
    +      uint8_t mask1 = uint8_t(mask); // least significant 8 bits
    +      uint8_t mask2 = uint8_t(mask >> 8); // second least significant 8 bits
    +      uint8_t mask3 = uint8_t(mask >> 16); // ...
    +      uint8_t mask4 = uint8_t(mask >> 24); // ...
    +      // next line just loads the 64-bit values thintable_epi8[mask1] and
    +      // thintable_epi8[mask2] into a 128-bit register, using only
    +      // two instructions on most compilers.
    +      __m256i shufmask =  _mm256_set_epi64x(thintable_epi8[mask4], thintable_epi8[mask3],
    +        thintable_epi8[mask2], thintable_epi8[mask1]);
    +      // we increment by 0x08 the second half of the mask and so forth
    +      shufmask =
    +      _mm256_add_epi8(shufmask, _mm256_set_epi32(0x18181818, 0x18181818,
    +         0x10101010, 0x10101010, 0x08080808, 0x08080808, 0, 0));
    +      // this is the version "nearly pruned"
    +      __m256i pruned = _mm256_shuffle_epi8(*this, shufmask);
    +      // we still need to put the  pieces back together.
    +      // we compute the popcount of the first words:
    +      int pop1 = BitsSetTable256mul2[mask1];
    +      int pop3 = BitsSetTable256mul2[mask3];
    +
    +      // then load the corresponding mask
    +      // could be done with _mm256_loadu2_m128i but many standard libraries omit this intrinsic.
    +      __m256i v256 = _mm256_castsi128_si256(
    +        _mm_loadu_si128(reinterpret_cast(pshufb_combine_table + pop1 * 8)));
    +      __m256i compactmask = _mm256_insertf128_si256(v256,
    +         _mm_loadu_si128(reinterpret_cast(pshufb_combine_table + pop3 * 8)), 1);
    +      __m256i almostthere =  _mm256_shuffle_epi8(pruned, compactmask);
    +      // We just need to write out the result.
    +      // This is the tricky bit that is hard to do
    +      // if we want to return a SIMD register, since there
    +      // is no single-instruction approach to recombine
    +      // the two 128-bit lanes with an offset.
    +      __m128i v128;
    +      v128 = _mm256_castsi256_si128(almostthere);
    +      _mm_storeu_si128( reinterpret_cast<__m128i *>(output), v128);
    +      v128 = _mm256_extractf128_si256(almostthere, 1);
    +      _mm_storeu_si128( reinterpret_cast<__m128i *>(output + 16 - count_ones(mask & 0xFFFF)), v128);
    +    }
    +
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +  };
    +
    +  // Signed bytes
    +  template<>
    +  struct simd8 : base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m256i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const int8_t values[32]) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15,
    +      int8_t v16, int8_t v17, int8_t v18, int8_t v19, int8_t v20, int8_t v21, int8_t v22, int8_t v23,
    +      int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, int8_t v30, int8_t v31
    +    ) : simd8(_mm256_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15,
    +      v16,v17,v18,v19,v20,v21,v22,v23,
    +      v24,v25,v26,v27,v28,v29,v30,v31
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Order-sensitive comparisons
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm256_max_epi8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm256_min_epi8(*this, other); }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return _mm256_cmpgt_epi8(*this, other); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return _mm256_cmpgt_epi8(other, *this); }
    +  };
    +
    +  // Unsigned bytes
    +  template<>
    +  struct simd8: base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m256i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const uint8_t values[32]) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15,
    +      uint8_t v16, uint8_t v17, uint8_t v18, uint8_t v19, uint8_t v20, uint8_t v21, uint8_t v22, uint8_t v23,
    +      uint8_t v24, uint8_t v25, uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, uint8_t v31
    +    ) : simd8(_mm256_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15,
    +      v16,v17,v18,v19,v20,v21,v22,v23,
    +      v24,v25,v26,v27,v28,v29,v30,v31
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Saturated math
    +    simdjson_inline simd8 saturating_add(const simd8 other) const { return _mm256_adds_epu8(*this, other); }
    +    simdjson_inline simd8 saturating_sub(const simd8 other) const { return _mm256_subs_epu8(*this, other); }
    +
    +    // Order-specific operations
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm256_max_epu8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm256_min_epu8(other, *this); }
    +    // Same as >, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 gt_bits(const simd8 other) const { return this->saturating_sub(other); }
    +    // Same as <, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 lt_bits(const simd8 other) const { return other.saturating_sub(*this); }
    +    simdjson_inline simd8 operator<=(const simd8 other) const { return other.max_val(*this) == other; }
    +    simdjson_inline simd8 operator>=(const simd8 other) const { return other.min_val(*this) == other; }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return this->lt_bits(other).any_bits_set(); }
    +
    +    // Bit-specific operations
    +    simdjson_inline simd8 bits_not_set() const { return *this == uint8_t(0); }
    +    simdjson_inline simd8 bits_not_set(simd8 bits) const { return (*this & bits).bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set() const { return ~this->bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set(simd8 bits) const { return ~this->bits_not_set(bits); }
    +    simdjson_inline bool is_ascii() const { return _mm256_movemask_epi8(*this) == 0; }
    +    simdjson_inline bool bits_not_set_anywhere() const { return _mm256_testz_si256(*this, *this); }
    +    simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); }
    +    simdjson_inline bool bits_not_set_anywhere(simd8 bits) const { return _mm256_testz_si256(*this, bits); }
    +    simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return !bits_not_set_anywhere(bits); }
    +    template
    +    simdjson_inline simd8 shr() const { return simd8(_mm256_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); }
    +    template
    +    simdjson_inline simd8 shl() const { return simd8(_mm256_slli_epi16(*this, N)) & uint8_t(0xFFu << N); }
    +    // Get one of the bits and make a bitmask out of it.
    +    // e.g. value.get_bit<7>() gets the high bit
    +    template
    +    simdjson_inline int get_bit() const { return _mm256_movemask_epi8(_mm256_slli_epi16(*this, 7-N)); }
    +  };
    +
    +  template
    +  struct simd8x64 {
    +    static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +    static_assert(NUM_CHUNKS == 2, "Haswell kernel should use two registers per 64-byte block.");
    +    const simd8 chunks[NUM_CHUNKS];
    +
    +    simd8x64(const simd8x64& o) = delete; // no copy allowed
    +    simd8x64& operator=(const simd8& other) = delete; // no assignment allowed
    +    simd8x64() = delete; // no default constructor allowed
    +
    +    simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1) : chunks{chunk0, chunk1} {}
    +    simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8::load(ptr), simd8::load(ptr+32)} {}
    +
    +    simdjson_inline uint64_t compress(uint64_t mask, T * output) const {
    +      uint32_t mask1 = uint32_t(mask);
    +      uint32_t mask2 = uint32_t(mask >> 32);
    +      this->chunks[0].compress(mask1, output);
    +      this->chunks[1].compress(mask2, output + 32 - count_ones(mask1));
    +      return 64 - count_ones(mask);
    +    }
    +
    +    simdjson_inline void store(T ptr[64]) const {
    +      this->chunks[0].store(ptr+sizeof(simd8)*0);
    +      this->chunks[1].store(ptr+sizeof(simd8)*1);
    +    }
    +
    +    simdjson_inline uint64_t to_bitmask() const {
    +      uint64_t r_lo = uint32_t(this->chunks[0].to_bitmask());
    +      uint64_t r_hi =                       this->chunks[1].to_bitmask();
    +      return r_lo | (r_hi << 32);
    +    }
    +
    +    simdjson_inline simd8 reduce_or() const {
    +      return this->chunks[0] | this->chunks[1];
    +    }
    +
    +    simdjson_inline simd8x64 bit_or(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return simd8x64(
    +        this->chunks[0] | mask,
    +        this->chunks[1] | mask
    +      );
    +    }
    +
    +    simdjson_inline uint64_t eq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] == mask,
    +        this->chunks[1] == mask
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t eq(const simd8x64 &other) const {
    +      return  simd8x64(
    +        this->chunks[0] == other.chunks[0],
    +        this->chunks[1] == other.chunks[1]
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t lteq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] <= mask,
    +        this->chunks[1] <= mask
    +      ).to_bitmask();
    +    }
    +  }; // struct simd8x64
    +
    +} // namespace simd
    +
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_HASWELL_SIMD_H
    +/* end file simdjson/haswell/simd.h */
    +/* including simdjson/haswell/stringparsing_defs.h: #include "simdjson/haswell/stringparsing_defs.h" */
    +/* begin file simdjson/haswell/stringparsing_defs.h */
    +#ifndef SIMDJSON_HASWELL_STRINGPARSING_DEFS_H
    +#define SIMDJSON_HASWELL_STRINGPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/simd.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +
    +using namespace simd;
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 32;
    +  simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; }
    +  simdjson_inline bool has_backslash() { return ((quote_bits - 1) & bs_bits) != 0; }
    +  simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); }
    +  simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); }
    +
    +  uint32_t bs_bits;
    +  uint32_t quote_bits;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // this can read up to 15 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes");
    +  simd8 v(src);
    +  // store to dest unconditionally - we can overwrite the bits we don't like later
    +  v.store(dst);
    +  return {
    +      static_cast((v == '\\').to_bitmask()),     // bs_bits
    +      static_cast((v == '"').to_bitmask()), // quote_bits
    +  };
    +}
    +
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_HASWELL_STRINGPARSING_DEFS_H
    +/* end file simdjson/haswell/stringparsing_defs.h */
    +/* end file simdjson/haswell/begin.h */
    +/* including simdjson/generic/amalgamated.h for haswell: #include "simdjson/generic/amalgamated.h" */
    +/* begin file simdjson/generic/amalgamated.h for haswell */
    +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_DEPENDENCIES_H)
    +#error simdjson/generic/dependencies.h must be included before simdjson/generic/amalgamated.h!
    +#endif
    +
    +/* including simdjson/generic/base.h for haswell: #include "simdjson/generic/base.h" */
    +/* begin file simdjson/generic/base.h for haswell */
    +#ifndef SIMDJSON_GENERIC_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): // If we haven't got an implementation yet, we're in the editor, editing a generic file! Just */
    +/* amalgamation skipped (editor-only): // use the most advanced one we can so the most possible stuff can be tested. */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation_detection.h" */
    +/* amalgamation skipped (editor-only): #if SIMDJSON_IMPLEMENTATION_ICELAKE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_HASWELL */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_WESTMERE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_ARM64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */
    +/* amalgamation skipped (editor-only): #else */
    +/* amalgamation skipped (editor-only): #error "All possible implementations (including fallback) have been disabled! simdjson will not run." */
    +/* amalgamation skipped (editor-only): #endif */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +
    +struct open_container;
    +class dom_parser_implementation;
    +
    +/**
    + * The type of a JSON number
    + */
    +enum class number_type {
    +    floating_point_number=1, /// a binary64 number
    +    signed_integer,          /// a signed integer that fits in a 64-bit word using two's complement
    +    unsigned_integer         /// a positive integer larger or equal to 1<<63
    +};
    +
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_BASE_H
    +/* end file simdjson/generic/base.h for haswell */
    +/* including simdjson/generic/jsoncharutils.h for haswell: #include "simdjson/generic/jsoncharutils.h" */
    +/* begin file simdjson/generic/jsoncharutils.h for haswell */
    +#ifndef SIMDJSON_GENERIC_JSONCHARUTILS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_JSONCHARUTILS_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/jsoncharutils_tables.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +namespace jsoncharutils {
    +
    +// return non-zero if not a structural or whitespace char
    +// zero otherwise
    +simdjson_inline uint32_t is_not_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace_negated[c];
    +}
    +
    +simdjson_inline uint32_t is_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace[c];
    +}
    +
    +// returns a value with the high 16 bits set if not valid
    +// otherwise returns the conversion of the 4 hex digits at src into the bottom
    +// 16 bits of the 32-bit return register
    +//
    +// see
    +// https://lemire.me/blog/2019/04/17/parsing-short-hexadecimal-strings-efficiently/
    +static inline uint32_t hex_to_u32_nocheck(
    +    const uint8_t *src) { // strictly speaking, static inline is a C-ism
    +  uint32_t v1 = internal::digit_to_val32[630 + src[0]];
    +  uint32_t v2 = internal::digit_to_val32[420 + src[1]];
    +  uint32_t v3 = internal::digit_to_val32[210 + src[2]];
    +  uint32_t v4 = internal::digit_to_val32[0 + src[3]];
    +  return v1 | v2 | v3 | v4;
    +}
    +
    +// given a code point cp, writes to c
    +// the utf-8 code, outputting the length in
    +// bytes, if the length is zero, the code point
    +// is invalid
    +//
    +// This can possibly be made faster using pdep
    +// and clz and table lookups, but JSON documents
    +// have few escaped code points, and the following
    +// function looks cheap.
    +//
    +// Note: we assume that surrogates are treated separately
    +//
    +simdjson_inline size_t codepoint_to_utf8(uint32_t cp, uint8_t *c) {
    +  if (cp <= 0x7F) {
    +    c[0] = uint8_t(cp);
    +    return 1; // ascii
    +  }
    +  if (cp <= 0x7FF) {
    +    c[0] = uint8_t((cp >> 6) + 192);
    +    c[1] = uint8_t((cp & 63) + 128);
    +    return 2; // universal plane
    +    //  Surrogates are treated elsewhere...
    +    //} //else if (0xd800 <= cp && cp <= 0xdfff) {
    +    //  return 0; // surrogates // could put assert here
    +  } else if (cp <= 0xFFFF) {
    +    c[0] = uint8_t((cp >> 12) + 224);
    +    c[1] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[2] = uint8_t((cp & 63) + 128);
    +    return 3;
    +  } else if (cp <= 0x10FFFF) { // if you know you have a valid code point, this
    +                               // is not needed
    +    c[0] = uint8_t((cp >> 18) + 240);
    +    c[1] = uint8_t(((cp >> 12) & 63) + 128);
    +    c[2] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[3] = uint8_t((cp & 63) + 128);
    +    return 4;
    +  }
    +  // will return 0 when the code point was too large.
    +  return 0; // bad r
    +}
    +
    +#if SIMDJSON_IS_32BITS // _umul128 for x86, arm
    +// this is a slow emulation routine for 32-bit
    +//
    +static simdjson_inline uint64_t __emulu(uint32_t x, uint32_t y) {
    +  return x * (uint64_t)y;
    +}
    +static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) {
    +  uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd);
    +  uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd);
    +  uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32));
    +  uint64_t adbc_carry = !!(adbc < ad);
    +  uint64_t lo = bd + (adbc << 32);
    +  *hi = __emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) +
    +        (adbc_carry << 32) + !!(lo < bd);
    +  return lo;
    +}
    +#endif
    +
    +} // namespace jsoncharutils
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_JSONCHARUTILS_H
    +/* end file simdjson/generic/jsoncharutils.h for haswell */
    +/* including simdjson/generic/atomparsing.h for haswell: #include "simdjson/generic/atomparsing.h" */
    +/* begin file simdjson/generic/atomparsing.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ATOMPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ATOMPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +/// @private
    +namespace atomparsing {
    +
    +// The string_to_uint32 is exclusively used to map literal strings to 32-bit values.
    +// We use memcpy instead of a pointer cast to avoid undefined behaviors since we cannot
    +// be certain that the character pointer will be properly aligned.
    +// You might think that using memcpy makes this function expensive, but you'd be wrong.
    +// All decent optimizing compilers (GCC, clang, Visual Studio) will compile string_to_uint32("false");
    +// to the compile-time constant 1936482662.
    +simdjson_inline uint32_t string_to_uint32(const char* str) { uint32_t val; std::memcpy(&val, str, sizeof(uint32_t)); return val; }
    +
    +
    +// Again in str4ncmp we use a memcpy to avoid undefined behavior. The memcpy may appear expensive.
    +// Yet all decent optimizing compilers will compile memcpy to a single instruction, just about.
    +simdjson_warn_unused
    +simdjson_inline uint32_t str4ncmp(const uint8_t *src, const char* atom) {
    +  uint32_t srcval; // we want to avoid unaligned 32-bit loads (undefined in C/C++)
    +  static_assert(sizeof(uint32_t) <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be larger than 4 bytes");
    +  std::memcpy(&srcval, src, sizeof(uint32_t));
    +  return srcval ^ string_to_uint32(atom);
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "true") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_true_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "true"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src) {
    +  return (str4ncmp(src+1, "alse") | jsoncharutils::is_not_structural_or_whitespace(src[5])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src, size_t len) {
    +  if (len > 5) { return is_valid_false_atom(src); }
    +  else if (len == 5) { return !str4ncmp(src+1, "alse"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "null") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_null_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "null"); }
    +  else { return false; }
    +}
    +
    +} // namespace atomparsing
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ATOMPARSING_H
    +/* end file simdjson/generic/atomparsing.h for haswell */
    +/* including simdjson/generic/dom_parser_implementation.h for haswell: #include "simdjson/generic/dom_parser_implementation.h" */
    +/* begin file simdjson/generic/dom_parser_implementation.h for haswell */
    +#ifndef SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +
    +// expectation: sizeof(open_container) = 64/8.
    +struct open_container {
    +  uint32_t tape_index; // where, on the tape, does the scope ([,{) begins
    +  uint32_t count; // how many elements in the scope
    +}; // struct open_container
    +
    +static_assert(sizeof(open_container) == 64/8, "Open container must be 64 bits");
    +
    +class dom_parser_implementation final : public internal::dom_parser_implementation {
    +public:
    +  /** Tape location of each open { or [ */
    +  std::unique_ptr open_containers{};
    +  /** Whether each open container is a [ or { */
    +  std::unique_ptr is_array{};
    +  /** Buffer passed to stage 1 */
    +  const uint8_t *buf{};
    +  /** Length passed to stage 1 */
    +  size_t len{0};
    +  /** Document passed to stage 2 */
    +  dom::document *doc{};
    +
    +  inline dom_parser_implementation() noexcept;
    +  inline dom_parser_implementation(dom_parser_implementation &&other) noexcept;
    +  inline dom_parser_implementation &operator=(dom_parser_implementation &&other) noexcept;
    +  dom_parser_implementation(const dom_parser_implementation &) = delete;
    +  dom_parser_implementation &operator=(const dom_parser_implementation &) = delete;
    +
    +  simdjson_warn_unused error_code parse(const uint8_t *buf, size_t len, dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage1(const uint8_t *buf, size_t len, stage1_mode partial) noexcept final;
    +  simdjson_warn_unused error_code stage2(dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage2_next(dom::document &doc) noexcept final;
    +  simdjson_warn_unused uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) const noexcept final;
    +  simdjson_warn_unused uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept final;
    +  inline simdjson_warn_unused error_code set_capacity(size_t capacity) noexcept final;
    +  inline simdjson_warn_unused error_code set_max_depth(size_t max_depth) noexcept final;
    +private:
    +  simdjson_inline simdjson_warn_unused error_code set_capacity_stage1(size_t capacity);
    +
    +};
    +
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +namespace haswell {
    +
    +inline dom_parser_implementation::dom_parser_implementation() noexcept = default;
    +inline dom_parser_implementation::dom_parser_implementation(dom_parser_implementation &&other) noexcept = default;
    +inline dom_parser_implementation &dom_parser_implementation::operator=(dom_parser_implementation &&other) noexcept = default;
    +
    +// Leaving these here so they can be inlined if so desired
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_capacity(size_t capacity) noexcept {
    +  if(capacity > SIMDJSON_MAXSIZE_BYTES) { return CAPACITY; }
    +  // Stage 1 index output
    +  size_t max_structures = SIMDJSON_ROUNDUP_N(capacity, 64) + 2 + 7;
    +  structural_indexes.reset( new (std::nothrow) uint32_t[max_structures] );
    +  if (!structural_indexes) { _capacity = 0; return MEMALLOC; }
    +  structural_indexes[0] = 0;
    +  n_structural_indexes = 0;
    +
    +  _capacity = capacity;
    +  return SUCCESS;
    +}
    +
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_max_depth(size_t max_depth) noexcept {
    +  // Stage 2 stacks
    +  open_containers.reset(new (std::nothrow) open_container[max_depth]);
    +  is_array.reset(new (std::nothrow) bool[max_depth]);
    +  if (!is_array || !open_containers) { _max_depth = 0; return MEMALLOC; }
    +
    +  _max_depth = max_depth;
    +  return SUCCESS;
    +}
    +
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +/* end file simdjson/generic/dom_parser_implementation.h for haswell */
    +/* including simdjson/generic/implementation_simdjson_result_base.h for haswell: #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base.h for haswell */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +
    +// This is a near copy of include/error.h's implementation_simdjson_result_base, except it doesn't use std::pair
    +// so we can avoid inlining errors
    +// TODO reconcile these!
    +/**
    + * The result of a simdjson operation that could fail.
    + *
    + * Gives the option of reading error codes, or throwing an exception by casting to the desired result.
    + *
    + * This is a base class for implementations that want to add functions to the result type for
    + * chaining.
    + *
    + * Override like:
    + *
    + *   struct simdjson_result : public internal::implementation_simdjson_result_base {
    + *     simdjson_result() noexcept : internal::implementation_simdjson_result_base() {}
    + *     simdjson_result(error_code error) noexcept : internal::implementation_simdjson_result_base(error) {}
    + *     simdjson_result(T &&value) noexcept : internal::implementation_simdjson_result_base(std::forward(value)) {}
    + *     simdjson_result(T &&value, error_code error) noexcept : internal::implementation_simdjson_result_base(value, error) {}
    + *     // Your extra methods here
    + *   }
    + *
    + * Then any method returning simdjson_result will be chainable with your methods.
    + */
    +template
    +struct implementation_simdjson_result_base {
    +
    +  /**
    +   * Create a new empty result with error = UNINITIALIZED.
    +   */
    +  simdjson_inline implementation_simdjson_result_base() noexcept = default;
    +
    +  /**
    +   * Create a new error result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(error_code error) noexcept;
    +
    +  /**
    +   * Create a new successful result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value) noexcept;
    +
    +  /**
    +   * Create a new result with both things (use if you don't want to branch when creating the result).
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value, error_code error) noexcept;
    +
    +  /**
    +   * Move the value and the error to the provided variables.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   * @param error The variable to assign the error to. Set to SUCCESS if there is no error.
    +   */
    +  simdjson_inline void tie(T &value, error_code &error) && noexcept;
    +
    +  /**
    +   * Move the value to the provided variable.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   */
    +  simdjson_inline error_code get(T &value) && noexcept;
    +
    +  /**
    +   * The error.
    +   */
    +  simdjson_inline error_code error() const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value.
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T& value() & noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& value() && noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& take_value() && noexcept(false);
    +
    +  /**
    +   * Cast to the value (will throw on error).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline operator T&&() && noexcept(false);
    +
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline const T& value_unsafe() const& noexcept;
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T& value_unsafe() & noexcept;
    +  /**
    +   * Take the result value (move it). This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T&& value_unsafe() && noexcept;
    +protected:
    +  /** users should never directly access first and second. **/
    +  T first{}; /** Users should never directly access 'first'. **/
    +  error_code second{UNINITIALIZED}; /** Users should never directly access 'second'. **/
    +}; // struct implementation_simdjson_result_base
    +
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +/* end file simdjson/generic/implementation_simdjson_result_base.h for haswell */
    +/* including simdjson/generic/numberparsing.h for haswell: #include "simdjson/generic/numberparsing.h" */
    +/* begin file simdjson/generic/numberparsing.h for haswell */
    +#ifndef SIMDJSON_GENERIC_NUMBERPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_NUMBERPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace numberparsing {
    +
    +#ifdef JSON_TEST_NUMBERS
    +#define INVALID_NUMBER(SRC) (found_invalid_number((SRC)), NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (found_integer((VALUE), (SRC)), (WRITER).append_s64((VALUE)))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (found_unsigned_integer((VALUE), (SRC)), (WRITER).append_u64((VALUE)))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (found_float((VALUE), (SRC)), (WRITER).append_double((VALUE)))
    +#else
    +#define INVALID_NUMBER(SRC) (NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (WRITER).append_s64((VALUE))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (WRITER).append_u64((VALUE))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (WRITER).append_double((VALUE))
    +#endif
    +
    +namespace {
    +
    +// Convert a mantissa, an exponent and a sign bit into an ieee64 double.
    +// The real_exponent needs to be in [0, 2046] (technically real_exponent = 2047 would be acceptable).
    +// The mantissa should be in [0,1<<53). The bit at index (1ULL << 52) while be zeroed.
    +simdjson_inline double to_double(uint64_t mantissa, uint64_t real_exponent, bool negative) {
    +    double d;
    +    mantissa &= ~(1ULL << 52);
    +    mantissa |= real_exponent << 52;
    +    mantissa |= ((static_cast(negative)) << 63);
    +    std::memcpy(&d, &mantissa, sizeof(d));
    +    return d;
    +}
    +
    +// Attempts to compute i * 10^(power) exactly; and if "negative" is
    +// true, negate the result.
    +// This function will only work in some cases, when it does not work, success is
    +// set to false. This should work *most of the time* (like 99% of the time).
    +// We assume that power is in the [smallest_power,
    +// largest_power] interval: the caller is responsible for this check.
    +simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative, double &d) {
    +  // we start with a fast path
    +  // It was described in
    +  // Clinger WD. How to read floating point numbers accurately.
    +  // ACM SIGPLAN Notices. 1990
    +#ifndef FLT_EVAL_METHOD
    +#error "FLT_EVAL_METHOD should be defined, please include cfloat."
    +#endif
    +#if (FLT_EVAL_METHOD != 1) && (FLT_EVAL_METHOD != 0)
    +  // We cannot be certain that x/y is rounded to nearest.
    +  if (0 <= power && power <= 22 && i <= 9007199254740991)
    +#else
    +  if (-22 <= power && power <= 22 && i <= 9007199254740991)
    +#endif
    +  {
    +    // convert the integer into a double. This is lossless since
    +    // 0 <= i <= 2^53 - 1.
    +    d = double(i);
    +    //
    +    // The general idea is as follows.
    +    // If 0 <= s < 2^53 and if 10^0 <= p <= 10^22 then
    +    // 1) Both s and p can be represented exactly as 64-bit floating-point
    +    // values
    +    // (binary64).
    +    // 2) Because s and p can be represented exactly as floating-point values,
    +    // then s * p
    +    // and s / p will produce correctly rounded values.
    +    //
    +    if (power < 0) {
    +      d = d / simdjson::internal::power_of_ten[-power];
    +    } else {
    +      d = d * simdjson::internal::power_of_ten[power];
    +    }
    +    if (negative) {
    +      d = -d;
    +    }
    +    return true;
    +  }
    +  // When 22 < power && power <  22 + 16, we could
    +  // hope for another, secondary fast path.  It was
    +  // described by David M. Gay in  "Correctly rounded
    +  // binary-decimal and decimal-binary conversions." (1990)
    +  // If you need to compute i * 10^(22 + x) for x < 16,
    +  // first compute i * 10^x, if you know that result is exact
    +  // (e.g., when i * 10^x < 2^53),
    +  // then you can still proceed and do (i * 10^x) * 10^22.
    +  // Is this worth your time?
    +  // You need  22 < power *and* power <  22 + 16 *and* (i * 10^(x-22) < 2^53)
    +  // for this second fast path to work.
    +  // If you you have 22 < power *and* power <  22 + 16, and then you
    +  // optimistically compute "i * 10^(x-22)", there is still a chance that you
    +  // have wasted your time if i * 10^(x-22) >= 2^53. It makes the use cases of
    +  // this optimization maybe less common than we would like. Source:
    +  // http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/
    +  // also used in RapidJSON: https://rapidjson.org/strtod_8h_source.html
    +
    +  // The fast path has now failed, so we are failing back on the slower path.
    +
    +  // In the slow path, we need to adjust i so that it is > 1<<63 which is always
    +  // possible, except if i == 0, so we handle i == 0 separately.
    +  if(i == 0) {
    +    d = negative ? -0.0 : 0.0;
    +    return true;
    +  }
    +
    +
    +  // The exponent is 1024 + 63 + power
    +  //     + floor(log(5**power)/log(2)).
    +  // The 1024 comes from the ieee64 standard.
    +  // The 63 comes from the fact that we use a 64-bit word.
    +  //
    +  // Computing floor(log(5**power)/log(2)) could be
    +  // slow. Instead we use a fast function.
    +  //
    +  // For power in (-400,350), we have that
    +  // (((152170 + 65536) * power ) >> 16);
    +  // is equal to
    +  //  floor(log(5**power)/log(2)) + power when power >= 0
    +  // and it is equal to
    +  //  ceil(log(5**-power)/log(2)) + power when power < 0
    +  //
    +  // The 65536 is (1<<16) and corresponds to
    +  // (65536 * power) >> 16 ---> power
    +  //
    +  // ((152170 * power ) >> 16) is equal to
    +  // floor(log(5**power)/log(2))
    +  //
    +  // Note that this is not magic: 152170/(1<<16) is
    +  // approximatively equal to log(5)/log(2).
    +  // The 1<<16 value is a power of two; we could use a
    +  // larger power of 2 if we wanted to.
    +  //
    +  int64_t exponent = (((152170 + 65536) * power) >> 16) + 1024 + 63;
    +
    +
    +  // We want the most significant bit of i to be 1. Shift if needed.
    +  int lz = leading_zeroes(i);
    +  i <<= lz;
    +
    +
    +  // We are going to need to do some 64-bit arithmetic to get a precise product.
    +  // We use a table lookup approach.
    +  // It is safe because
    +  // power >= smallest_power
    +  // and power <= largest_power
    +  // We recover the mantissa of the power, it has a leading 1. It is always
    +  // rounded down.
    +  //
    +  // We want the most significant 64 bits of the product. We know
    +  // this will be non-zero because the most significant bit of i is
    +  // 1.
    +  const uint32_t index = 2 * uint32_t(power - simdjson::internal::smallest_power);
    +  // Optimization: It may be that materializing the index as a variable might confuse some compilers and prevent effective complex-addressing loads. (Done for code clarity.)
    +  //
    +  // The full_multiplication function computes the 128-bit product of two 64-bit words
    +  // with a returned value of type value128 with a "low component" corresponding to the
    +  // 64-bit least significant bits of the product and with a "high component" corresponding
    +  // to the 64-bit most significant bits of the product.
    +  simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
    +  // Both i and power_of_five_128[index] have their most significant bit set to 1 which
    +  // implies that the either the most or the second most significant bit of the product
    +  // is 1. We pack values in this manner for efficiency reasons: it maximizes the use
    +  // we make of the product. It also makes it easy to reason about the product: there
    +  // is 0 or 1 leading zero in the product.
    +
    +  // Unless the least significant 9 bits of the high (64-bit) part of the full
    +  // product are all 1s, then we know that the most significant 55 bits are
    +  // exact and no further work is needed. Having 55 bits is necessary because
    +  // we need 53 bits for the mantissa but we have to have one rounding bit and
    +  // we can waste a bit if the most significant bit of the product is zero.
    +  if((firstproduct.high & 0x1FF) == 0x1FF) {
    +    // We want to compute i * 5^q, but only care about the top 55 bits at most.
    +    // Consider the scenario where q>=0. Then 5^q may not fit in 64-bits. Doing
    +    // the full computation is wasteful. So we do what is called a "truncated
    +    // multiplication".
    +    // We take the most significant 64-bits, and we put them in
    +    // power_of_five_128[index]. Usually, that's good enough to approximate i * 5^q
    +    // to the desired approximation using one multiplication. Sometimes it does not suffice.
    +    // Then we store the next most significant 64 bits in power_of_five_128[index + 1], and
    +    // then we get a better approximation to i * 5^q.
    +    //
    +    // That's for when q>=0. The logic for q<0 is somewhat similar but it is somewhat
    +    // more complicated.
    +    //
    +    // There is an extra layer of complexity in that we need more than 55 bits of
    +    // accuracy in the round-to-even scenario.
    +    //
    +    // The full_multiplication function computes the 128-bit product of two 64-bit words
    +    // with a returned value of type value128 with a "low component" corresponding to the
    +    // 64-bit least significant bits of the product and with a "high component" corresponding
    +    // to the 64-bit most significant bits of the product.
    +    simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
    +    firstproduct.low += secondproduct.high;
    +    if(secondproduct.high > firstproduct.low) { firstproduct.high++; }
    +    // As it has been proven by Noble Mushtak and Daniel Lemire in "Fast Number Parsing Without
    +    // Fallback" (https://arxiv.org/abs/2212.06644), at this point we are sure that the product
    +    // is sufficiently accurate, and more computation is not needed.
    +  }
    +  uint64_t lower = firstproduct.low;
    +  uint64_t upper = firstproduct.high;
    +  // The final mantissa should be 53 bits with a leading 1.
    +  // We shift it so that it occupies 54 bits with a leading 1.
    +  ///////
    +  uint64_t upperbit = upper >> 63;
    +  uint64_t mantissa = upper >> (upperbit + 9);
    +  lz += int(1 ^ upperbit);
    +
    +  // Here we have mantissa < (1<<54).
    +  int64_t real_exponent = exponent - lz;
    +  if (simdjson_unlikely(real_exponent <= 0)) { // we have a subnormal?
    +    // Here have that real_exponent <= 0 so -real_exponent >= 0
    +    if(-real_exponent + 1 >= 64) { // if we have more than 64 bits below the minimum exponent, you have a zero for sure.
    +      d = negative ? -0.0 : 0.0;
    +      return true;
    +    }
    +    // next line is safe because -real_exponent + 1 < 0
    +    mantissa >>= -real_exponent + 1;
    +    // Thankfully, we can't have both "round-to-even" and subnormals because
    +    // "round-to-even" only occurs for powers close to 0.
    +    mantissa += (mantissa & 1); // round up
    +    mantissa >>= 1;
    +    // There is a weird scenario where we don't have a subnormal but just.
    +    // Suppose we start with 2.2250738585072013e-308, we end up
    +    // with 0x3fffffffffffff x 2^-1023-53 which is technically subnormal
    +    // whereas 0x40000000000000 x 2^-1023-53  is normal. Now, we need to round
    +    // up 0x3fffffffffffff x 2^-1023-53  and once we do, we are no longer
    +    // subnormal, but we can only know this after rounding.
    +    // So we only declare a subnormal if we are smaller than the threshold.
    +    real_exponent = (mantissa < (uint64_t(1) << 52)) ? 0 : 1;
    +    d = to_double(mantissa, real_exponent, negative);
    +    return true;
    +  }
    +  // We have to round to even. The "to even" part
    +  // is only a problem when we are right in between two floats
    +  // which we guard against.
    +  // If we have lots of trailing zeros, we may fall right between two
    +  // floating-point values.
    +  //
    +  // The round-to-even cases take the form of a number 2m+1 which is in (2^53,2^54]
    +  // times a power of two. That is, it is right between a number with binary significand
    +  // m and another number with binary significand m+1; and it must be the case
    +  // that it cannot be represented by a float itself.
    +  //
    +  // We must have that w * 10 ^q == (2m+1) * 2^p for some power of two 2^p.
    +  // Recall that 10^q = 5^q * 2^q.
    +  // When q >= 0, we must have that (2m+1) is divible by 5^q, so 5^q <= 2^54. We have that
    +  //  5^23 <=  2^54 and it is the last power of five to qualify, so q <= 23.
    +  // When q<0, we have  w  >=  (2m+1) x 5^{-q}.  We must have that w<2^{64} so
    +  // (2m+1) x 5^{-q} < 2^{64}. We have that 2m+1>2^{53}. Hence, we must have
    +  // 2^{53} x 5^{-q} < 2^{64}.
    +  // Hence we have 5^{-q} < 2^{11}$ or q>= -4.
    +  //
    +  // We require lower <= 1 and not lower == 0 because we could not prove that
    +  // that lower == 0 is implied; but we could prove that lower <= 1 is a necessary and sufficient test.
    +  if (simdjson_unlikely((lower <= 1) && (power >= -4) && (power <= 23) && ((mantissa & 3) == 1))) {
    +    if((mantissa  << (upperbit + 64 - 53 - 2)) ==  upper) {
    +      mantissa &= ~1;             // flip it so that we do not round up
    +    }
    +  }
    +
    +  mantissa += mantissa & 1;
    +  mantissa >>= 1;
    +
    +  // Here we have mantissa < (1<<53), unless there was an overflow
    +  if (mantissa >= (1ULL << 53)) {
    +    //////////
    +    // This will happen when parsing values such as 7.2057594037927933e+16
    +    ////////
    +    mantissa = (1ULL << 52);
    +    real_exponent++;
    +  }
    +  mantissa &= ~(1ULL << 52);
    +  // we have to check that real_exponent is in range, otherwise we bail out
    +  if (simdjson_unlikely(real_exponent > 2046)) {
    +    // We have an infinite value!!! We could actually throw an error here if we could.
    +    return false;
    +  }
    +  d = to_double(mantissa, real_exponent, negative);
    +  return true;
    +}
    +
    +// We call a fallback floating-point parser that might be slow. Note
    +// it will accept JSON numbers, but the JSON spec. is more restrictive so
    +// before you call parse_float_fallback, you need to have validated the input
    +// string with the JSON grammar.
    +// It will return an error (false) if the parsed number is infinite.
    +// The string parsing itself always succeeds. We know that there is at least
    +// one digit.
    +static bool parse_float_fallback(const uint8_t *ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +static bool parse_float_fallback(const uint8_t *ptr, const uint8_t *end_ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr), reinterpret_cast(end_ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +// check quickly whether the next 8 chars are made of digits
    +// at a glance, it looks better than Mula's
    +// http://0x80.pl/articles/swar-digits-validate.html
    +simdjson_inline bool is_made_of_eight_digits_fast(const uint8_t *chars) {
    +  uint64_t val;
    +  // this can read up to 7 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(7 <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be bigger than 7");
    +  std::memcpy(&val, chars, 8);
    +  // a branchy method might be faster:
    +  // return (( val & 0xF0F0F0F0F0F0F0F0 ) == 0x3030303030303030)
    +  //  && (( (val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0 ) ==
    +  //  0x3030303030303030);
    +  return (((val & 0xF0F0F0F0F0F0F0F0) |
    +           (((val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0) >> 4)) ==
    +          0x3333333333333333);
    +}
    +
    +template
    +SIMDJSON_NO_SANITIZE_UNDEFINED // We deliberately allow overflow here and check later
    +simdjson_inline bool parse_digit(const uint8_t c, I &i) {
    +  const uint8_t digit = static_cast(c - '0');
    +  if (digit > 9) {
    +    return false;
    +  }
    +  // PERF NOTE: multiplication by 10 is cheaper than arbitrary integer multiplication
    +  i = 10 * i + digit; // might overflow, we will handle the overflow later
    +  return true;
    +}
    +
    +simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const uint8_t *const src, const uint8_t *&p, uint64_t &i, int64_t &exponent) {
    +  // we continue with the fiction that we have an integer. If the
    +  // floating point number is representable as x * 10^z for some integer
    +  // z that fits in 53 bits, then we will be able to convert back the
    +  // the integer into a float in a lossless manner.
    +  const uint8_t *const first_after_period = p;
    +
    +#ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +#if SIMDJSON_SWAR_NUMBER_PARSING
    +  // this helps if we have lots of decimals!
    +  // this turns out to be frequent enough.
    +  if (is_made_of_eight_digits_fast(p)) {
    +    i = i * 100000000 + parse_eight_digits_unrolled(p);
    +    p += 8;
    +  }
    +#endif // SIMDJSON_SWAR_NUMBER_PARSING
    +#endif // #ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +  // Unrolling the first digit makes a small difference on some implementations (e.g. westmere)
    +  if (parse_digit(*p, i)) { ++p; }
    +  while (parse_digit(*p, i)) { p++; }
    +  exponent = first_after_period - p;
    +  // Decimal without digits (123.) is illegal
    +  if (exponent == 0) {
    +    return INVALID_NUMBER(src);
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) {
    +  // Exp Sign: -123.456e[-]78
    +  bool neg_exp = ('-' == *p);
    +  if (neg_exp || '+' == *p) { p++; } // Skip + as well
    +
    +  // Exponent: -123.456e-[78]
    +  auto start_exp = p;
    +  int64_t exp_number = 0;
    +  while (parse_digit(*p, exp_number)) { ++p; }
    +  // It is possible for parse_digit to overflow.
    +  // In particular, it could overflow to INT64_MIN, and we cannot do - INT64_MIN.
    +  // Thus we *must* check for possible overflow before we negate exp_number.
    +
    +  // Performance notes: it may seem like combining the two "simdjson_unlikely checks" below into
    +  // a single simdjson_unlikely path would be faster. The reasoning is sound, but the compiler may
    +  // not oblige and may, in fact, generate two distinct paths in any case. It might be
    +  // possible to do uint64_t(p - start_exp - 1) >= 18 but it could end up trading off
    +  // instructions for a simdjson_likely branch, an unconclusive gain.
    +
    +  // If there were no digits, it's an error.
    +  if (simdjson_unlikely(p == start_exp)) {
    +    return INVALID_NUMBER(src);
    +  }
    +  // We have a valid positive exponent in exp_number at this point, except that
    +  // it may have overflowed.
    +
    +  // If there were more than 18 digits, we may have overflowed the integer. We have to do
    +  // something!!!!
    +  if (simdjson_unlikely(p > start_exp+18)) {
    +    // Skip leading zeroes: 1e000000000000000000001 is technically valid and doesn't overflow
    +    while (*start_exp == '0') { start_exp++; }
    +    // 19 digits could overflow int64_t and is kind of absurd anyway. We don't
    +    // support exponents smaller than -999,999,999,999,999,999 and bigger
    +    // than 999,999,999,999,999,999.
    +    // We can truncate.
    +    // Note that 999999999999999999 is assuredly too large. The maximal ieee64 value before
    +    // infinity is ~1.8e308. The smallest subnormal is ~5e-324. So, actually, we could
    +    // truncate at 324.
    +    // Note that there is no reason to fail per se at this point in time.
    +    // E.g., 0e999999999999999999999 is a fine number.
    +    if (p > start_exp+18) { exp_number = 999999999999999999; }
    +  }
    +  // At this point, we know that exp_number is a sane, positive, signed integer.
    +  // It is <= 999,999,999,999,999,999. As long as 'exponent' is in
    +  // [-8223372036854775808, 8223372036854775808], we won't overflow. Because 'exponent'
    +  // is bounded in magnitude by the size of the JSON input, we are fine in this universe.
    +  // To sum it up: the next line should never overflow.
    +  exponent += (neg_exp ? -exp_number : exp_number);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline size_t significant_digits(const uint8_t * start_digits, size_t digit_count) {
    +  // It is possible that the integer had an overflow.
    +  // We have to handle the case where we have 0.0000somenumber.
    +  const uint8_t *start = start_digits;
    +  while ((*start == '0') || (*start == '.')) { ++start; }
    +  // we over-decrement by one when there is a '.'
    +  return digit_count - size_t(start - start_digits);
    +}
    +
    +} // unnamed namespace
    +
    +/** @private */
    +template
    +error_code slow_float_parsing(simdjson_unused const uint8_t * src, W writer) {
    +  double d;
    +  if (parse_float_fallback(src, &d)) {
    +    writer.append_double(d);
    +    return SUCCESS;
    +  }
    +  return INVALID_NUMBER(src);
    +}
    +
    +/** @private */
    +template
    +simdjson_inline error_code write_float(const uint8_t *const src, bool negative, uint64_t i, const uint8_t * start_digits, size_t digit_count, int64_t exponent, W &writer) {
    +  // If we frequently had to deal with long strings of digits,
    +  // we could extend our code by using a 128-bit integer instead
    +  // of a 64-bit integer. However, this is uncommon in practice.
    +  //
    +  // 9999999999999999999 < 2**64 so we can accommodate 19 digits.
    +  // If we have a decimal separator, then digit_count - 1 is the number of digits, but we
    +  // may not have a decimal separator!
    +  if (simdjson_unlikely(digit_count > 19 && significant_digits(start_digits, digit_count) > 19)) {
    +    // Ok, chances are good that we had an overflow!
    +    // this is almost never going to get called!!!
    +    // we start anew, going slowly!!!
    +    // This will happen in the following examples:
    +    // 10000000000000000000000000000000000000000000e+308
    +    // 3.1415926535897932384626433832795028841971693993751
    +    //
    +    // NOTE: This makes a *copy* of the writer and passes it to slow_float_parsing. This happens
    +    // because slow_float_parsing is a non-inlined function. If we passed our writer reference to
    +    // it, it would force it to be stored in memory, preventing the compiler from picking it apart
    +    // and putting into registers. i.e. if we pass it as reference, it gets slow.
    +    // This is what forces the skip_double, as well.
    +    error_code error = slow_float_parsing(src, writer);
    +    writer.skip_double();
    +    return error;
    +  }
    +  // NOTE: it's weird that the simdjson_unlikely() only wraps half the if, but it seems to get slower any other
    +  // way we've tried: https://github.com/simdjson/simdjson/pull/990#discussion_r448497331
    +  // To future reader: we'd love if someone found a better way, or at least could explain this result!
    +  if (simdjson_unlikely(exponent < simdjson::internal::smallest_power) || (exponent > simdjson::internal::largest_power)) {
    +    //
    +    // Important: smallest_power is such that it leads to a zero value.
    +    // Observe that 18446744073709551615e-343 == 0, i.e. (2**64 - 1) e -343 is zero
    +    // so something x 10^-343 goes to zero, but not so with  something x 10^-342.
    +    static_assert(simdjson::internal::smallest_power <= -342, "smallest_power is not small enough");
    +    //
    +    if((exponent < simdjson::internal::smallest_power) || (i == 0)) {
    +      // E.g. Parse "-0.0e-999" into the same value as "-0.0". See https://en.wikipedia.org/wiki/Signed_zero
    +      WRITE_DOUBLE(negative ? -0.0 : 0.0, src, writer);
    +      return SUCCESS;
    +    } else { // (exponent > largest_power) and (i != 0)
    +      // We have, for sure, an infinite value and simdjson refuses to parse infinite values.
    +      return INVALID_NUMBER(src);
    +    }
    +  }
    +  double d;
    +  if (!compute_float_64(exponent, i, negative, d)) {
    +    // we are almost never going to get here.
    +    if (!parse_float_fallback(src, &d)) { return INVALID_NUMBER(src); }
    +  }
    +  WRITE_DOUBLE(d, src, writer);
    +  return SUCCESS;
    +}
    +
    +// for performance analysis, it is sometimes  useful to skip parsing
    +#ifdef SIMDJSON_SKIPNUMBERPARSING
    +
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const, W &writer) {
    +  writer.append_s64(0);        // always write zero
    +  return SUCCESS;              // always succeeds
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept { return number_type::signed_integer; }
    +#else
    +
    +// parse the number at src
    +// define JSON_TEST_NUMBERS for unit testing
    +//
    +// It is assumed that the number is followed by a structural ({,},],[) character
    +// or a white space character. If that is not the case (e.g., when the JSON
    +// document is made of a single number), then it is necessary to copy the
    +// content and append a space before calling this function.
    +//
    +// Our objective is accurate parsing (ULP of 0) at high speed.
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) {
    +
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  if (digit_count == 0 || ('0' == *start_digits && digit_count > 1)) { return INVALID_NUMBER(src); }
    +
    +  //
    +  // Handle floats if there is a . or e (or both)
    +  //
    +  int64_t exponent = 0;
    +  bool is_float = false;
    +  if ('.' == *p) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_decimal_after_separator(src, p, i, exponent) );
    +    digit_count = int(p - start_digits); // used later to guard against overflows
    +  }
    +  if (('e' == *p) || ('E' == *p)) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_exponent(src, p, exponent) );
    +  }
    +  if (is_float) {
    +    const bool dirty_end = jsoncharutils::is_not_structural_or_whitespace(*p);
    +    SIMDJSON_TRY( write_float(src, negative, i, start_digits, digit_count, exponent, writer) );
    +    if (dirty_end) { return INVALID_NUMBER(src); }
    +    return SUCCESS;
    +  }
    +
    +  // The longest negative 64-bit number is 19 digits.
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  size_t longest_digit_count = negative ? 19 : 20;
    +  if (digit_count > longest_digit_count) { return INVALID_NUMBER(src); }
    +  if (digit_count == longest_digit_count) {
    +    if (negative) {
    +      // Anything negative above INT64_MAX+1 is invalid
    +      if (i > uint64_t(INT64_MAX)+1) { return INVALID_NUMBER(src);  }
    +      WRITE_INTEGER(~i+1, src, writer);
    +      if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +      return SUCCESS;
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    }  else if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INVALID_NUMBER(src); }
    +  }
    +
    +  // Write unsigned if it doesn't fit in a signed integer.
    +  if (i > uint64_t(INT64_MAX)) {
    +    WRITE_UNSIGNED(i, src, writer);
    +  } else {
    +    WRITE_INTEGER(negative ? (~i+1) : i, src, writer);
    +  }
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +  return SUCCESS;
    +}
    +
    +// Inlineable functions
    +namespace {
    +
    +// This table can be used to characterize the final character of an integer
    +// string. For JSON structural character and allowable white space characters,
    +// we return SUCCESS. For 'e', '.' and 'E', we return INCORRECT_TYPE. Otherwise
    +// we return NUMBER_ERROR.
    +// Optimization note: we could easily reduce the size of the table by half (to 128)
    +// at the cost of an extra branch.
    +// Optimization note: we want the values to use at most 8 bits (not, e.g., 32 bits):
    +static_assert(error_code(uint8_t(NUMBER_ERROR))== NUMBER_ERROR, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(SUCCESS))== SUCCESS, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(INCORRECT_TYPE))== INCORRECT_TYPE, "bad NUMBER_ERROR cast");
    +
    +const uint8_t integer_string_finisher[256] = {
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   SUCCESS,      NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, INCORRECT_TYPE,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, SUCCESS,        NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR};
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if ((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src + 1;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    // Note: we use src[1] and not src[0] because src[0] is the quote character in this
    +    // instance.
    +    if (src[1] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = src;
    +  uint64_t i = 0;
    +  while (parse_digit(*src, i)) { src++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(src - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*src)) {
    +  //  return (*src == '.' || *src == 'e' || *src == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(*src != '"') { return NUMBER_ERROR; }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept {
    +  return (*src == '-');
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) { return true; }
    +  return false;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) {
    +    // We have an integer.
    +    // If the number is negative and valid, it must be a signed integer.
    +    if(negative) { return number_type::signed_integer; }
    +    // We want values larger or equal to 9223372036854775808 to be unsigned
    +    // integers, and the other values to be signed integers.
    +    int digit_count = int(p - src);
    +    if(digit_count >= 19) {
    +      const uint8_t * smaller_big_integer = reinterpret_cast("9223372036854775808");
    +      if((digit_count >= 20) || (memcmp(src, smaller_big_integer, 19) >= 0)) {
    +        return number_type::unsigned_integer;
    +      }
    +    }
    +    return number_type::signed_integer;
    +  }
    +  // Hopefully, we have 'e' or 'E' or '.'.
    +  return number_type::floating_point_number;
    +}
    +
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src, const uint8_t * const src_end) noexcept {
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  if(p == src_end) { return NUMBER_ERROR; }
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely((p != src_end) && (*p == '.'))) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if ((p == src_end) || !parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = start_digits-src > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if ((p != src_end) && (*p == 'e' || *p == 'E')) {
    +    p++;
    +    if(p == src_end) { return NUMBER_ERROR; }
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while ((p != src_end) && parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if ((p != src_end) && jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), src_end, &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +} // unnamed namespace
    +#endif // SIMDJSON_SKIPNUMBERPARSING
    +
    +} // namespace numberparsing
    +
    +inline std::ostream& operator<<(std::ostream& out, number_type type) noexcept {
    +    switch (type) {
    +        case number_type::signed_integer: out << "integer in [-9223372036854775808,9223372036854775808)"; break;
    +        case number_type::unsigned_integer: out << "unsigned integer in [9223372036854775808,18446744073709551616)"; break;
    +        case number_type::floating_point_number: out << "floating-point number (binary64)"; break;
    +        default: SIMDJSON_UNREACHABLE();
    +    }
    +    return out;
    +}
    +
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_NUMBERPARSING_H
    +/* end file simdjson/generic/numberparsing.h for haswell */
    +
    +/* including simdjson/generic/implementation_simdjson_result_base-inl.h for haswell: #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base-inl.h for haswell */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +
    +//
    +// internal::implementation_simdjson_result_base inline implementation
    +//
    +
    +template
    +simdjson_inline void implementation_simdjson_result_base::tie(T &value, error_code &error) && noexcept {
    +  error = this->second;
    +  if (!error) {
    +    value = std::forward>(*this).first;
    +  }
    +}
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::get(T &value) && noexcept {
    +  error_code error;
    +  std::forward>(*this).tie(value, error);
    +  return error;
    +}
    +
    +template
    +simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept {
    +  return this->second;
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::take_value() && noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::operator T&&() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline const T& implementation_simdjson_result_base::value_unsafe() const& noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value_unsafe() & noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value_unsafe() && noexcept {
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value, error_code error) noexcept
    +    : first{std::forward(value)}, second{error} {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(error_code error) noexcept
    +    : implementation_simdjson_result_base(T{}, error) {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value), SUCCESS) {}
    +
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +/* end file simdjson/generic/implementation_simdjson_result_base-inl.h for haswell */
    +/* end file simdjson/generic/amalgamated.h for haswell */
    +/* including simdjson/haswell/end.h: #include "simdjson/haswell/end.h" */
    +/* begin file simdjson/haswell/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_HASWELL
    +SIMDJSON_UNTARGET_REGION
    +#endif
    +
    +/* undefining SIMDJSON_IMPLEMENTATION from "haswell" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/haswell/end.h */
    +
    +#endif // SIMDJSON_HASWELL_H
    +/* end file simdjson/haswell.h */
    +/* including simdjson/haswell/implementation.h: #include  */
    +/* begin file simdjson/haswell/implementation.h */
    +#ifndef SIMDJSON_HASWELL_IMPLEMENTATION_H
    +#define SIMDJSON_HASWELL_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/instruction_set.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_HASWELL
    +namespace simdjson {
    +namespace haswell {
    +
    +/**
    + * @private
    + */
    +class implementation final : public simdjson::implementation {
    +public:
    +  simdjson_inline implementation() : simdjson::implementation(
    +      "haswell",
    +      "Intel/AMD AVX2",
    +      internal::instruction_set::AVX2 | internal::instruction_set::PCLMULQDQ | internal::instruction_set::BMI1 | internal::instruction_set::BMI2
    +  ) {}
    +  simdjson_warn_unused error_code create_dom_parser_implementation(
    +    size_t capacity,
    +    size_t max_length,
    +    std::unique_ptr& dst
    +  ) const noexcept final;
    +  simdjson_warn_unused error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept final;
    +  simdjson_warn_unused bool validate_utf8(const char *buf, size_t len) const noexcept final;
    +};
    +
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_HASWELL_IMPLEMENTATION_H
    +/* end file simdjson/haswell/implementation.h */
    +
    +/* including simdjson/haswell/begin.h: #include  */
    +/* begin file simdjson/haswell/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "haswell" */
    +#define SIMDJSON_IMPLEMENTATION haswell
    +
    +/* including simdjson/haswell/base.h: #include "simdjson/haswell/base.h" */
    +/* begin file simdjson/haswell/base.h */
    +#ifndef SIMDJSON_HASWELL_BASE_H
    +#define SIMDJSON_HASWELL_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_HASWELL
    +namespace simdjson {
    +/**
    + * Implementation for Haswell (Intel AVX2).
    + */
    +namespace haswell {
    +
    +class implementation;
    +
    +namespace {
    +namespace simd {
    +template  struct simd8;
    +template  struct simd8x64;
    +} // namespace simd
    +} // unnamed namespace
    +
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_HASWELL_BASE_H
    +/* end file simdjson/haswell/base.h */
    +/* including simdjson/haswell/intrinsics.h: #include "simdjson/haswell/intrinsics.h" */
    +/* begin file simdjson/haswell/intrinsics.h */
    +#ifndef SIMDJSON_HASWELL_INTRINSICS_H
    +#define SIMDJSON_HASWELL_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if SIMDJSON_VISUAL_STUDIO
    +// under clang within visual studio, this will include 
    +#include   // visual studio or clang
    +#else
    +#include  // elsewhere
    +#endif // SIMDJSON_VISUAL_STUDIO
    +
    +#if SIMDJSON_CLANG_VISUAL_STUDIO
    +/**
    + * You are not supposed, normally, to include these
    + * headers directly. Instead you should either include intrin.h
    + * or x86intrin.h. However, when compiling with clang
    + * under Windows (i.e., when _MSC_VER is set), these headers
    + * only get included *if* the corresponding features are detected
    + * from macros:
    + * e.g., if __AVX2__ is set... in turn,  we normally set these
    + * macros by compiling against the corresponding architecture
    + * (e.g., arch:AVX2, -mavx2, etc.) which compiles the whole
    + * software with these advanced instructions. In simdjson, we
    + * want to compile the whole program for a generic target,
    + * and only target our specific kernels. As a workaround,
    + * we directly include the needed headers. These headers would
    + * normally guard against such usage, but we carefully included
    + *   (or ) before, so the headers
    + * are fooled.
    + */
    +#include    // for _blsr_u64
    +#include  // for  __lzcnt64
    +#include    // for most things (AVX2, AVX512, _popcnt64)
    +#include 
    +#include 
    +#include 
    +#include 
    +#include    // for  _mm_clmulepi64_si128
    +// unfortunately, we may not get _blsr_u64, but, thankfully, clang
    +// has it as a macro.
    +#ifndef _blsr_u64
    +// we roll our own
    +#define _blsr_u64(n) ((n - 1) & n)
    +#endif //  _blsr_u64
    +#endif // SIMDJSON_CLANG_VISUAL_STUDIO
    +
    +static_assert(sizeof(__m256i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for haswell kernel.");
    +
    +#endif // SIMDJSON_HASWELL_INTRINSICS_H
    +/* end file simdjson/haswell/intrinsics.h */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_HASWELL
    +SIMDJSON_TARGET_REGION("avx2,bmi,pclmul,lzcnt,popcnt")
    +#endif
    +
    +/* including simdjson/haswell/bitmanipulation.h: #include "simdjson/haswell/bitmanipulation.h" */
    +/* begin file simdjson/haswell/bitmanipulation.h */
    +#ifndef SIMDJSON_HASWELL_BITMANIPULATION_H
    +#define SIMDJSON_HASWELL_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/bitmask.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return (int)_tzcnt_u64(input_num);
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  ////////
    +  // You might expect the next line to be equivalent to
    +  // return (int)_tzcnt_u64(input_num);
    +  // but the generated code differs and might be less efficient?
    +  ////////
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return _blsr_u64(input_num);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +  return int(_lzcnt_u64(input_num));
    +}
    +
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +simdjson_inline unsigned __int64 count_ones(uint64_t input_num) {
    +  // note: we do not support legacy 32-bit Windows in this kernel
    +  return __popcnt64(input_num);// Visual Studio wants two underscores
    +}
    +#else
    +simdjson_inline long long int count_ones(uint64_t input_num) {
    +  return _popcnt64(input_num);
    +}
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2,
    +                                uint64_t *result) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return _addcarry_u64(0, value1, value2,
    +                       reinterpret_cast(result));
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_HASWELL_BITMANIPULATION_H
    +/* end file simdjson/haswell/bitmanipulation.h */
    +/* including simdjson/haswell/bitmask.h: #include "simdjson/haswell/bitmask.h" */
    +/* begin file simdjson/haswell/bitmask.h */
    +#ifndef SIMDJSON_HASWELL_BITMASK_H
    +#define SIMDJSON_HASWELL_BITMASK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +
    +//
    +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered.
    +//
    +// For example, prefix_xor(00100100) == 00011100
    +//
    +simdjson_inline uint64_t prefix_xor(const uint64_t bitmask) {
    +  // There should be no such thing with a processor supporting avx2
    +  // but not clmul.
    +  __m128i all_ones = _mm_set1_epi8('\xFF');
    +  __m128i result = _mm_clmulepi64_si128(_mm_set_epi64x(0ULL, bitmask), all_ones, 0);
    +  return _mm_cvtsi128_si64(result);
    +}
    +
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_HASWELL_BITMASK_H
    +/* end file simdjson/haswell/bitmask.h */
    +/* including simdjson/haswell/numberparsing_defs.h: #include "simdjson/haswell/numberparsing_defs.h" */
    +/* begin file simdjson/haswell/numberparsing_defs.h */
    +#ifndef SIMDJSON_HASWELL_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_HASWELL_NUMBERPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace numberparsing {
    +
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  // this actually computes *16* values so we are being wasteful.
    +  const __m128i ascii0 = _mm_set1_epi8('0');
    +  const __m128i mul_1_10 =
    +      _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1);
    +  const __m128i mul_1_100 = _mm_setr_epi16(100, 1, 100, 1, 100, 1, 100, 1);
    +  const __m128i mul_1_10000 =
    +      _mm_setr_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1);
    +  const __m128i input = _mm_sub_epi8(
    +      _mm_loadu_si128(reinterpret_cast(chars)), ascii0);
    +  const __m128i t1 = _mm_maddubs_epi16(input, mul_1_10);
    +  const __m128i t2 = _mm_madd_epi16(t1, mul_1_100);
    +  const __m128i t3 = _mm_packus_epi32(t2, t2);
    +  const __m128i t4 = _mm_madd_epi16(t3, mul_1_10000);
    +  return _mm_cvtsi128_si32(
    +      t4); // only captures the sum of the first 8 digits, drop the rest
    +}
    +
    +/** @private */
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif // SIMDJSON_HASWELL_NUMBERPARSING_DEFS_H
    +/* end file simdjson/haswell/numberparsing_defs.h */
    +/* including simdjson/haswell/simd.h: #include "simdjson/haswell/simd.h" */
    +/* begin file simdjson/haswell/simd.h */
    +#ifndef SIMDJSON_HASWELL_SIMD_H
    +#define SIMDJSON_HASWELL_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +namespace simd {
    +
    +  // Forward-declared so they can be used by splat and friends.
    +  template
    +  struct base {
    +    __m256i value;
    +
    +    // Zero constructor
    +    simdjson_inline base() : value{__m256i()} {}
    +
    +    // Conversion from SIMD register
    +    simdjson_inline base(const __m256i _value) : value(_value) {}
    +
    +    // Conversion to SIMD register
    +    simdjson_inline operator const __m256i&() const { return this->value; }
    +    simdjson_inline operator __m256i&() { return this->value; }
    +
    +    // Bit operations
    +    simdjson_inline Child operator|(const Child other) const { return _mm256_or_si256(*this, other); }
    +    simdjson_inline Child operator&(const Child other) const { return _mm256_and_si256(*this, other); }
    +    simdjson_inline Child operator^(const Child other) const { return _mm256_xor_si256(*this, other); }
    +    simdjson_inline Child bit_andnot(const Child other) const { return _mm256_andnot_si256(other, *this); }
    +    simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast | other; return *this_cast; }
    +    simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast & other; return *this_cast; }
    +    simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast ^ other; return *this_cast; }
    +  };
    +
    +  // Forward-declared so they can be used by splat and friends.
    +  template
    +  struct simd8;
    +
    +  template>
    +  struct base8: base> {
    +    typedef uint32_t bitmask_t;
    +    typedef uint64_t bitmask2_t;
    +
    +    simdjson_inline base8() : base>() {}
    +    simdjson_inline base8(const __m256i _value) : base>(_value) {}
    +
    +    friend simdjson_really_inline Mask operator==(const simd8 lhs, const simd8 rhs) { return _mm256_cmpeq_epi8(lhs, rhs); }
    +
    +    static const int SIZE = sizeof(base::value);
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +      return _mm256_alignr_epi8(*this, _mm256_permute2x128_si256(prev_chunk, *this, 0x21), 16 - N);
    +    }
    +  };
    +
    +  // SIMD byte mask type (returned by things like eq and gt)
    +  template<>
    +  struct simd8: base8 {
    +    static simdjson_inline simd8 splat(bool _value) { return _mm256_set1_epi8(uint8_t(-(!!_value))); }
    +
    +    simdjson_inline simd8() : base8() {}
    +    simdjson_inline simd8(const __m256i _value) : base8(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(bool _value) : base8(splat(_value)) {}
    +
    +    simdjson_inline int to_bitmask() const { return _mm256_movemask_epi8(*this); }
    +    simdjson_inline bool any() const { return !_mm256_testz_si256(*this, *this); }
    +    simdjson_inline simd8 operator~() const { return *this ^ true; }
    +  };
    +
    +  template
    +  struct base8_numeric: base8 {
    +    static simdjson_inline simd8 splat(T _value) { return _mm256_set1_epi8(_value); }
    +    static simdjson_inline simd8 zero() { return _mm256_setzero_si256(); }
    +    static simdjson_inline simd8 load(const T values[32]) {
    +      return _mm256_loadu_si256(reinterpret_cast(values));
    +    }
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    static simdjson_inline simd8 repeat_16(
    +      T v0,  T v1,  T v2,  T v3,  T v4,  T v5,  T v6,  T v7,
    +      T v8,  T v9,  T v10, T v11, T v12, T v13, T v14, T v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    simdjson_inline base8_numeric() : base8() {}
    +    simdjson_inline base8_numeric(const __m256i _value) : base8(_value) {}
    +
    +    // Store to array
    +    simdjson_inline void store(T dst[32]) const { return _mm256_storeu_si256(reinterpret_cast<__m256i *>(dst), *this); }
    +
    +    // Addition/subtraction are the same for signed and unsigned
    +    simdjson_inline simd8 operator+(const simd8 other) const { return _mm256_add_epi8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return _mm256_sub_epi8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *static_cast*>(this); }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *static_cast*>(this); }
    +
    +    // Override to distinguish from bool version
    +    simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +
    +    // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values)
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return _mm256_shuffle_epi8(lookup_table, *this);
    +    }
    +
    +    // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset).
    +    // Passing a 0 value for mask would be equivalent to writing out every byte to output.
    +    // Only the first 32 - count_ones(mask) bytes of the result are significant but 32 bytes
    +    // get written.
    +    // Design consideration: it seems like a function with the
    +    // signature simd8 compress(uint32_t mask) would be
    +    // sensible, but the AVX ISA makes this kind of approach difficult.
    +    template
    +    simdjson_inline void compress(uint32_t mask, L * output) const {
    +      using internal::thintable_epi8;
    +      using internal::BitsSetTable256mul2;
    +      using internal::pshufb_combine_table;
    +      // this particular implementation was inspired by work done by @animetosho
    +      // we do it in four steps, first 8 bytes and then second 8 bytes...
    +      uint8_t mask1 = uint8_t(mask); // least significant 8 bits
    +      uint8_t mask2 = uint8_t(mask >> 8); // second least significant 8 bits
    +      uint8_t mask3 = uint8_t(mask >> 16); // ...
    +      uint8_t mask4 = uint8_t(mask >> 24); // ...
    +      // next line just loads the 64-bit values thintable_epi8[mask1] and
    +      // thintable_epi8[mask2] into a 128-bit register, using only
    +      // two instructions on most compilers.
    +      __m256i shufmask =  _mm256_set_epi64x(thintable_epi8[mask4], thintable_epi8[mask3],
    +        thintable_epi8[mask2], thintable_epi8[mask1]);
    +      // we increment by 0x08 the second half of the mask and so forth
    +      shufmask =
    +      _mm256_add_epi8(shufmask, _mm256_set_epi32(0x18181818, 0x18181818,
    +         0x10101010, 0x10101010, 0x08080808, 0x08080808, 0, 0));
    +      // this is the version "nearly pruned"
    +      __m256i pruned = _mm256_shuffle_epi8(*this, shufmask);
    +      // we still need to put the  pieces back together.
    +      // we compute the popcount of the first words:
    +      int pop1 = BitsSetTable256mul2[mask1];
    +      int pop3 = BitsSetTable256mul2[mask3];
    +
    +      // then load the corresponding mask
    +      // could be done with _mm256_loadu2_m128i but many standard libraries omit this intrinsic.
    +      __m256i v256 = _mm256_castsi128_si256(
    +        _mm_loadu_si128(reinterpret_cast(pshufb_combine_table + pop1 * 8)));
    +      __m256i compactmask = _mm256_insertf128_si256(v256,
    +         _mm_loadu_si128(reinterpret_cast(pshufb_combine_table + pop3 * 8)), 1);
    +      __m256i almostthere =  _mm256_shuffle_epi8(pruned, compactmask);
    +      // We just need to write out the result.
    +      // This is the tricky bit that is hard to do
    +      // if we want to return a SIMD register, since there
    +      // is no single-instruction approach to recombine
    +      // the two 128-bit lanes with an offset.
    +      __m128i v128;
    +      v128 = _mm256_castsi256_si128(almostthere);
    +      _mm_storeu_si128( reinterpret_cast<__m128i *>(output), v128);
    +      v128 = _mm256_extractf128_si256(almostthere, 1);
    +      _mm_storeu_si128( reinterpret_cast<__m128i *>(output + 16 - count_ones(mask & 0xFFFF)), v128);
    +    }
    +
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +  };
    +
    +  // Signed bytes
    +  template<>
    +  struct simd8 : base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m256i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const int8_t values[32]) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15,
    +      int8_t v16, int8_t v17, int8_t v18, int8_t v19, int8_t v20, int8_t v21, int8_t v22, int8_t v23,
    +      int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, int8_t v30, int8_t v31
    +    ) : simd8(_mm256_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15,
    +      v16,v17,v18,v19,v20,v21,v22,v23,
    +      v24,v25,v26,v27,v28,v29,v30,v31
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Order-sensitive comparisons
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm256_max_epi8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm256_min_epi8(*this, other); }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return _mm256_cmpgt_epi8(*this, other); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return _mm256_cmpgt_epi8(other, *this); }
    +  };
    +
    +  // Unsigned bytes
    +  template<>
    +  struct simd8: base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m256i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const uint8_t values[32]) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15,
    +      uint8_t v16, uint8_t v17, uint8_t v18, uint8_t v19, uint8_t v20, uint8_t v21, uint8_t v22, uint8_t v23,
    +      uint8_t v24, uint8_t v25, uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, uint8_t v31
    +    ) : simd8(_mm256_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15,
    +      v16,v17,v18,v19,v20,v21,v22,v23,
    +      v24,v25,v26,v27,v28,v29,v30,v31
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Saturated math
    +    simdjson_inline simd8 saturating_add(const simd8 other) const { return _mm256_adds_epu8(*this, other); }
    +    simdjson_inline simd8 saturating_sub(const simd8 other) const { return _mm256_subs_epu8(*this, other); }
    +
    +    // Order-specific operations
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm256_max_epu8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm256_min_epu8(other, *this); }
    +    // Same as >, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 gt_bits(const simd8 other) const { return this->saturating_sub(other); }
    +    // Same as <, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 lt_bits(const simd8 other) const { return other.saturating_sub(*this); }
    +    simdjson_inline simd8 operator<=(const simd8 other) const { return other.max_val(*this) == other; }
    +    simdjson_inline simd8 operator>=(const simd8 other) const { return other.min_val(*this) == other; }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return this->lt_bits(other).any_bits_set(); }
    +
    +    // Bit-specific operations
    +    simdjson_inline simd8 bits_not_set() const { return *this == uint8_t(0); }
    +    simdjson_inline simd8 bits_not_set(simd8 bits) const { return (*this & bits).bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set() const { return ~this->bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set(simd8 bits) const { return ~this->bits_not_set(bits); }
    +    simdjson_inline bool is_ascii() const { return _mm256_movemask_epi8(*this) == 0; }
    +    simdjson_inline bool bits_not_set_anywhere() const { return _mm256_testz_si256(*this, *this); }
    +    simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); }
    +    simdjson_inline bool bits_not_set_anywhere(simd8 bits) const { return _mm256_testz_si256(*this, bits); }
    +    simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return !bits_not_set_anywhere(bits); }
    +    template
    +    simdjson_inline simd8 shr() const { return simd8(_mm256_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); }
    +    template
    +    simdjson_inline simd8 shl() const { return simd8(_mm256_slli_epi16(*this, N)) & uint8_t(0xFFu << N); }
    +    // Get one of the bits and make a bitmask out of it.
    +    // e.g. value.get_bit<7>() gets the high bit
    +    template
    +    simdjson_inline int get_bit() const { return _mm256_movemask_epi8(_mm256_slli_epi16(*this, 7-N)); }
    +  };
    +
    +  template
    +  struct simd8x64 {
    +    static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +    static_assert(NUM_CHUNKS == 2, "Haswell kernel should use two registers per 64-byte block.");
    +    const simd8 chunks[NUM_CHUNKS];
    +
    +    simd8x64(const simd8x64& o) = delete; // no copy allowed
    +    simd8x64& operator=(const simd8& other) = delete; // no assignment allowed
    +    simd8x64() = delete; // no default constructor allowed
    +
    +    simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1) : chunks{chunk0, chunk1} {}
    +    simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8::load(ptr), simd8::load(ptr+32)} {}
    +
    +    simdjson_inline uint64_t compress(uint64_t mask, T * output) const {
    +      uint32_t mask1 = uint32_t(mask);
    +      uint32_t mask2 = uint32_t(mask >> 32);
    +      this->chunks[0].compress(mask1, output);
    +      this->chunks[1].compress(mask2, output + 32 - count_ones(mask1));
    +      return 64 - count_ones(mask);
    +    }
    +
    +    simdjson_inline void store(T ptr[64]) const {
    +      this->chunks[0].store(ptr+sizeof(simd8)*0);
    +      this->chunks[1].store(ptr+sizeof(simd8)*1);
    +    }
    +
    +    simdjson_inline uint64_t to_bitmask() const {
    +      uint64_t r_lo = uint32_t(this->chunks[0].to_bitmask());
    +      uint64_t r_hi =                       this->chunks[1].to_bitmask();
    +      return r_lo | (r_hi << 32);
    +    }
    +
    +    simdjson_inline simd8 reduce_or() const {
    +      return this->chunks[0] | this->chunks[1];
    +    }
    +
    +    simdjson_inline simd8x64 bit_or(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return simd8x64(
    +        this->chunks[0] | mask,
    +        this->chunks[1] | mask
    +      );
    +    }
    +
    +    simdjson_inline uint64_t eq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] == mask,
    +        this->chunks[1] == mask
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t eq(const simd8x64 &other) const {
    +      return  simd8x64(
    +        this->chunks[0] == other.chunks[0],
    +        this->chunks[1] == other.chunks[1]
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t lteq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] <= mask,
    +        this->chunks[1] <= mask
    +      ).to_bitmask();
    +    }
    +  }; // struct simd8x64
    +
    +} // namespace simd
    +
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_HASWELL_SIMD_H
    +/* end file simdjson/haswell/simd.h */
    +/* including simdjson/haswell/stringparsing_defs.h: #include "simdjson/haswell/stringparsing_defs.h" */
    +/* begin file simdjson/haswell/stringparsing_defs.h */
    +#ifndef SIMDJSON_HASWELL_STRINGPARSING_DEFS_H
    +#define SIMDJSON_HASWELL_STRINGPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/simd.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +
    +using namespace simd;
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 32;
    +  simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; }
    +  simdjson_inline bool has_backslash() { return ((quote_bits - 1) & bs_bits) != 0; }
    +  simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); }
    +  simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); }
    +
    +  uint32_t bs_bits;
    +  uint32_t quote_bits;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // this can read up to 15 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes");
    +  simd8 v(src);
    +  // store to dest unconditionally - we can overwrite the bits we don't like later
    +  v.store(dst);
    +  return {
    +      static_cast((v == '\\').to_bitmask()),     // bs_bits
    +      static_cast((v == '"').to_bitmask()), // quote_bits
    +  };
    +}
    +
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_HASWELL_STRINGPARSING_DEFS_H
    +/* end file simdjson/haswell/stringparsing_defs.h */
    +/* end file simdjson/haswell/begin.h */
    +/* including generic/amalgamated.h for haswell: #include  */
    +/* begin file generic/amalgamated.h for haswell */
    +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_SRC_GENERIC_DEPENDENCIES_H)
    +#error generic/dependencies.h must be included before generic/amalgamated.h!
    +#endif
    +
    +/* including generic/base.h for haswell: #include  */
    +/* begin file generic/base.h for haswell */
    +#ifndef SIMDJSON_SRC_GENERIC_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_BASE_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +
    +struct json_character_block;
    +
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_BASE_H
    +/* end file generic/base.h for haswell */
    +/* including generic/dom_parser_implementation.h for haswell: #include  */
    +/* begin file generic/dom_parser_implementation.h for haswell */
    +#ifndef SIMDJSON_SRC_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_DOM_PARSER_IMPLEMENTATION_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// Interface a dom parser implementation must fulfill
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +
    +simdjson_inline simd8 must_be_2_3_continuation(const simd8 prev2, const simd8 prev3);
    +simdjson_inline bool is_ascii(const simd8x64& input);
    +
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +/* end file generic/dom_parser_implementation.h for haswell */
    +/* including generic/json_character_block.h for haswell: #include  */
    +/* begin file generic/json_character_block.h for haswell */
    +#ifndef SIMDJSON_SRC_GENERIC_JSON_CHARACTER_BLOCK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_JSON_CHARACTER_BLOCK_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +
    +struct json_character_block {
    +  static simdjson_inline json_character_block classify(const simd::simd8x64& in);
    +
    +  simdjson_inline uint64_t whitespace() const noexcept { return _whitespace; }
    +  simdjson_inline uint64_t op() const noexcept { return _op; }
    +  simdjson_inline uint64_t scalar() const noexcept { return ~(op() | whitespace()); }
    +
    +  uint64_t _whitespace;
    +  uint64_t _op;
    +};
    +
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_JSON_CHARACTER_BLOCK_H
    +/* end file generic/json_character_block.h for haswell */
    +/* end file generic/amalgamated.h for haswell */
    +/* including generic/stage1/amalgamated.h for haswell: #include  */
    +/* begin file generic/stage1/amalgamated.h for haswell */
    +// Stuff other things depend on
    +/* including generic/stage1/base.h for haswell: #include  */
    +/* begin file generic/stage1/base.h for haswell */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_BASE_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +namespace stage1 {
    +
    +class bit_indexer;
    +template
    +struct buf_block_reader;
    +struct json_block;
    +class json_minifier;
    +class json_scanner;
    +struct json_string_block;
    +class json_string_scanner;
    +class json_structural_indexer;
    +
    +} // namespace stage1
    +
    +namespace utf8_validation {
    +struct utf8_checker;
    +} // namespace utf8_validation
    +
    +using utf8_validation::utf8_checker;
    +
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_BASE_H
    +/* end file generic/stage1/base.h for haswell */
    +/* including generic/stage1/buf_block_reader.h for haswell: #include  */
    +/* begin file generic/stage1/buf_block_reader.h for haswell */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_BUF_BLOCK_READER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_BUF_BLOCK_READER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +namespace stage1 {
    +
    +// Walks through a buffer in block-sized increments, loading the last part with spaces
    +template
    +struct buf_block_reader {
    +public:
    +  simdjson_inline buf_block_reader(const uint8_t *_buf, size_t _len);
    +  simdjson_inline size_t block_index();
    +  simdjson_inline bool has_full_block() const;
    +  simdjson_inline const uint8_t *full_block() const;
    +  /**
    +   * Get the last block, padded with spaces.
    +   *
    +   * There will always be a last block, with at least 1 byte, unless len == 0 (in which case this
    +   * function fills the buffer with spaces and returns 0. In particular, if len == STEP_SIZE there
    +   * will be 0 full_blocks and 1 remainder block with STEP_SIZE bytes and no spaces for padding.
    +   *
    +   * @return the number of effective characters in the last block.
    +   */
    +  simdjson_inline size_t get_remainder(uint8_t *dst) const;
    +  simdjson_inline void advance();
    +private:
    +  const uint8_t *buf;
    +  const size_t len;
    +  const size_t lenminusstep;
    +  size_t idx;
    +};
    +
    +// Routines to print masks and text for debugging bitmask operations
    +simdjson_unused static char * format_input_text_64(const uint8_t *text) {
    +  static char buf[sizeof(simd8x64) + 1];
    +  for (size_t i=0; i); i++) {
    +    buf[i] = int8_t(text[i]) < ' ' ? '_' : int8_t(text[i]);
    +  }
    +  buf[sizeof(simd8x64)] = '\0';
    +  return buf;
    +}
    +
    +// Routines to print masks and text for debugging bitmask operations
    +simdjson_unused static char * format_input_text(const simd8x64& in) {
    +  static char buf[sizeof(simd8x64) + 1];
    +  in.store(reinterpret_cast(buf));
    +  for (size_t i=0; i); i++) {
    +    if (buf[i] < ' ') { buf[i] = '_'; }
    +  }
    +  buf[sizeof(simd8x64)] = '\0';
    +  return buf;
    +}
    +
    +simdjson_unused static char * format_input_text(const simd8x64& in, uint64_t mask) {
    +  static char buf[sizeof(simd8x64) + 1];
    +  in.store(reinterpret_cast(buf));
    +  for (size_t i=0; i); i++) {
    +    if (buf[i] <= ' ') { buf[i] = '_'; }
    +    if (!(mask & (size_t(1) << i))) { buf[i] = ' '; }
    +  }
    +  buf[sizeof(simd8x64)] = '\0';
    +  return buf;
    +}
    +
    +simdjson_unused static char * format_mask(uint64_t mask) {
    +  static char buf[sizeof(simd8x64) + 1];
    +  for (size_t i=0; i<64; i++) {
    +    buf[i] = (mask & (size_t(1) << i)) ? 'X' : ' ';
    +  }
    +  buf[64] = '\0';
    +  return buf;
    +}
    +
    +template
    +simdjson_inline buf_block_reader::buf_block_reader(const uint8_t *_buf, size_t _len) : buf{_buf}, len{_len}, lenminusstep{len < STEP_SIZE ? 0 : len - STEP_SIZE}, idx{0} {}
    +
    +template
    +simdjson_inline size_t buf_block_reader::block_index() { return idx; }
    +
    +template
    +simdjson_inline bool buf_block_reader::has_full_block() const {
    +  return idx < lenminusstep;
    +}
    +
    +template
    +simdjson_inline const uint8_t *buf_block_reader::full_block() const {
    +  return &buf[idx];
    +}
    +
    +template
    +simdjson_inline size_t buf_block_reader::get_remainder(uint8_t *dst) const {
    +  if(len == idx) { return 0; } // memcpy(dst, null, 0) will trigger an error with some sanitizers
    +  std::memset(dst, 0x20, STEP_SIZE); // std::memset STEP_SIZE because it's more efficient to write out 8 or 16 bytes at once.
    +  std::memcpy(dst, buf + idx, len - idx);
    +  return len - idx;
    +}
    +
    +template
    +simdjson_inline void buf_block_reader::advance() {
    +  idx += STEP_SIZE;
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_BUF_BLOCK_READER_H
    +/* end file generic/stage1/buf_block_reader.h for haswell */
    +/* including generic/stage1/json_escape_scanner.h for haswell: #include  */
    +/* begin file generic/stage1/json_escape_scanner.h for haswell */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_ESCAPE_SCANNER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_ESCAPE_SCANNER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +namespace stage1 {
    +
    +/**
    + * Scans for escape characters in JSON, taking care with multiple backslashes (\\n vs. \n).
    + */
    +struct json_escape_scanner {
    +  /** The actual escape characters (the backslashes themselves). */
    +  uint64_t next_is_escaped = 0ULL;
    +
    +  struct escaped_and_escape {
    +    /**
    +     * Mask of escaped characters.
    +     *
    +     * ```
    +     * \n \\n \\\n \\\\n \
    +     * 0100100010100101000
    +     *  n  \   \ n  \ \
    +     * ```
    +     */
    +    uint64_t escaped;
    +    /**
    +     * Mask of escape characters.
    +     *
    +     * ```
    +     * \n \\n \\\n \\\\n \
    +     * 1001000101001010001
    +     * \  \   \ \  \ \   \
    +     * ```
    +     */
    +    uint64_t escape;
    +  };
    +
    +  /**
    +   * Get a mask of both escape and escaped characters (the characters following a backslash).
    +   *
    +   * @param potential_escape A mask of the character that can escape others (but could be
    +   *        escaped itself). e.g. block.eq('\\')
    +   */
    +  simdjson_really_inline escaped_and_escape next(uint64_t backslash) noexcept {
    +
    +#if !SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT
    +    if (!backslash) { return {next_escaped_without_backslashes(), 0}; }
    +#endif
    +
    +    // |                                | Mask (shows characters instead of 1's) | Depth | Instructions        |
    +    // |--------------------------------|----------------------------------------|-------|---------------------|
    +    // | string                         | `\\n_\\\n___\\\n___\\\\___\\\\__\\\`   |       |                     |
    +    // |                                | `    even   odd    even   odd   odd`   |       |                     |
    +    // | potential_escape               | ` \  \\\    \\\    \\\\   \\\\  \\\`   | 1     | 1 (backslash & ~first_is_escaped)
    +    // | escape_and_terminal_code       | ` \n \ \n   \ \n   \ \    \ \   \ \`   | 5     | 5 (next_escape_and_terminal_code())
    +    // | escaped                        | `\    \ n    \ n    \ \    \ \   \ ` X | 6     | 7 (escape_and_terminal_code ^ (potential_escape | first_is_escaped))
    +    // | escape                         | `    \ \    \ \    \ \    \ \   \ \`   | 6     | 8 (escape_and_terminal_code & backslash)
    +    // | first_is_escaped               | `\                                 `   | 7 (*) | 9 (escape >> 63) ()
    +    //                                                                               (*) this is not needed until the next iteration
    +    uint64_t escape_and_terminal_code = next_escape_and_terminal_code(backslash & ~this->next_is_escaped);
    +    uint64_t escaped = escape_and_terminal_code ^ (backslash | this->next_is_escaped);
    +    uint64_t escape = escape_and_terminal_code & backslash;
    +    this->next_is_escaped = escape >> 63;
    +    return {escaped, escape};
    +  }
    +
    +private:
    +  static constexpr const uint64_t ODD_BITS = 0xAAAAAAAAAAAAAAAAULL;
    +
    +  simdjson_really_inline uint64_t next_escaped_without_backslashes() noexcept {
    +    uint64_t escaped = this->next_is_escaped;
    +    this->next_is_escaped = 0;
    +    return escaped;
    +  }
    +
    +  /**
    +   * Returns a mask of the next escape characters (masking out escaped backslashes), along with
    +   * any non-backslash escape codes.
    +   *
    +   * \n \\n \\\n \\\\n returns:
    +   * \n \   \ \n \ \
    +   * 11 100 1011 10100
    +   *
    +   * You are expected to mask out the first bit yourself if the previous block had a trailing
    +   * escape.
    +   *
    +   * & the result with potential_escape to get just the escape characters.
    +   * ^ the result with (potential_escape | first_is_escaped) to get escaped characters.
    +   */
    +  static simdjson_really_inline uint64_t next_escape_and_terminal_code(uint64_t potential_escape) noexcept {
    +    // If we were to just shift and mask out any odd bits, we'd actually get a *half* right answer:
    +    // any even-aligned backslash runs would be correct! Odd-aligned backslash runs would be
    +    // inverted (\\\ would be 010 instead of 101).
    +    //
    +    // ```
    +    // string:              | ____\\\\_\\\\_____ |
    +    // maybe_escaped | ODD  |     \ \   \ \      |
    +    //               even-aligned ^^^  ^^^^ odd-aligned
    +    // ```
    +    //
    +    // Taking that into account, our basic strategy is:
    +    //
    +    // 1. Use subtraction to produce a mask with 1's for even-aligned runs and 0's for
    +    //    odd-aligned runs.
    +    // 2. XOR all odd bits, which masks out the odd bits in even-aligned runs, and brings IN the
    +    //    odd bits in odd-aligned runs.
    +    // 3. & with backslash to clean up any stray bits.
    +    // runs are set to 0, and then XORing with "odd":
    +    //
    +    // |                                | Mask (shows characters instead of 1's) | Instructions        |
    +    // |--------------------------------|----------------------------------------|---------------------|
    +    // | string                         | `\\n_\\\n___\\\n___\\\\___\\\\__\\\`   |
    +    // |                                | `    even   odd    even   odd   odd`   |
    +    // | maybe_escaped                  | `  n  \\n    \\n    \\\_   \\\_  \\` X | 1 (potential_escape << 1)
    +    // | maybe_escaped_and_odd          | ` \n_ \\n _ \\\n_ _ \\\__ _\\\_ \\\`   | 1 (maybe_escaped | odd)
    +    // | even_series_codes_and_odd      | `  n_\\\  _    n_ _\\\\ _     _    `   | 1 (maybe_escaped_and_odd - potential_escape)
    +    // | escape_and_terminal_code       | ` \n \ \n   \ \n   \ \    \ \   \ \`   | 1 (^ odd)
    +    //
    +
    +    // Escaped characters are characters following an escape.
    +    uint64_t maybe_escaped = potential_escape << 1;
    +
    +    // To distinguish odd from even escape sequences, therefore, we turn on any *starting*
    +    // escapes that are on an odd byte. (We actually bring in all odd bits, for speed.)
    +    // - Odd runs of backslashes are 0000, and the code at the end ("n" in \n or \\n) is 1.
    +    // - Odd runs of backslashes are 1111, and the code at the end ("n" in \n or \\n) is 0.
    +    // - All other odd bytes are 1, and even bytes are 0.
    +    uint64_t maybe_escaped_and_odd_bits     = maybe_escaped | ODD_BITS;
    +    uint64_t even_series_codes_and_odd_bits = maybe_escaped_and_odd_bits - potential_escape;
    +
    +    // Now we flip all odd bytes back with xor. This:
    +    // - Makes odd runs of backslashes go from 0000 to 1010
    +    // - Makes even runs of backslashes go from 1111 to 1010
    +    // - Sets actually-escaped codes to 1 (the n in \n and \\n: \n = 11, \\n = 100)
    +    // - Resets all other bytes to 0
    +    return even_series_codes_and_odd_bits ^ ODD_BITS;
    +  }
    +};
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H
    +/* end file generic/stage1/json_escape_scanner.h for haswell */
    +/* including generic/stage1/json_string_scanner.h for haswell: #include  */
    +/* begin file generic/stage1/json_string_scanner.h for haswell */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +namespace stage1 {
    +
    +struct json_string_block {
    +  // We spell out the constructors in the hope of resolving inlining issues with Visual Studio 2017
    +  simdjson_really_inline json_string_block(uint64_t escaped, uint64_t quote, uint64_t in_string) :
    +  _escaped(escaped), _quote(quote), _in_string(in_string) {}
    +
    +  // Escaped characters (characters following an escape() character)
    +  simdjson_really_inline uint64_t escaped() const { return _escaped; }
    +  // Real (non-backslashed) quotes
    +  simdjson_really_inline uint64_t quote() const { return _quote; }
    +  // Only characters inside the string (not including the quotes)
    +  simdjson_really_inline uint64_t string_content() const { return _in_string & ~_quote; }
    +  // Return a mask of whether the given characters are inside a string (only works on non-quotes)
    +  simdjson_really_inline uint64_t non_quote_inside_string(uint64_t mask) const { return mask & _in_string; }
    +  // Return a mask of whether the given characters are inside a string (only works on non-quotes)
    +  simdjson_really_inline uint64_t non_quote_outside_string(uint64_t mask) const { return mask & ~_in_string; }
    +  // Tail of string (everything except the start quote)
    +  simdjson_really_inline uint64_t string_tail() const { return _in_string ^ _quote; }
    +
    +  // escaped characters (backslashed--does not include the hex characters after \u)
    +  uint64_t _escaped;
    +  // real quotes (non-escaped ones)
    +  uint64_t _quote;
    +  // string characters (includes start quote but not end quote)
    +  uint64_t _in_string;
    +};
    +
    +// Scans blocks for string characters, storing the state necessary to do so
    +class json_string_scanner {
    +public:
    +  simdjson_really_inline json_string_block next(const simd::simd8x64& in);
    +  // Returns either UNCLOSED_STRING or SUCCESS
    +  simdjson_really_inline error_code finish();
    +
    +private:
    +  // Scans for escape characters
    +  json_escape_scanner escape_scanner{};
    +  // Whether the last iteration was still inside a string (all 1's = true, all 0's = false).
    +  uint64_t prev_in_string = 0ULL;
    +};
    +
    +//
    +// Return a mask of all string characters plus end quotes.
    +//
    +// prev_escaped is overflow saying whether the next character is escaped.
    +// prev_in_string is overflow saying whether we're still in a string.
    +//
    +// Backslash sequences outside of quotes will be detected in stage 2.
    +//
    +simdjson_really_inline json_string_block json_string_scanner::next(const simd::simd8x64& in) {
    +  const uint64_t backslash = in.eq('\\');
    +  const uint64_t escaped = escape_scanner.next(backslash).escaped;
    +  const uint64_t quote = in.eq('"') & ~escaped;
    +
    +  //
    +  // prefix_xor flips on bits inside the string (and flips off the end quote).
    +  //
    +  // Then we xor with prev_in_string: if we were in a string already, its effect is flipped
    +  // (characters inside strings are outside, and characters outside strings are inside).
    +  //
    +  const uint64_t in_string = prefix_xor(quote) ^ prev_in_string;
    +
    +  //
    +  // Check if we're still in a string at the end of the box so the next block will know
    +  //
    +  prev_in_string = uint64_t(static_cast(in_string) >> 63);
    +
    +  // Use ^ to turn the beginning quote off, and the end quote on.
    +
    +  // We are returning a function-local object so either we get a move constructor
    +  // or we get copy elision.
    +  return json_string_block(escaped, quote, in_string);
    +}
    +
    +simdjson_really_inline error_code json_string_scanner::finish() {
    +  if (prev_in_string) {
    +    return UNCLOSED_STRING;
    +  }
    +  return SUCCESS;
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H
    +/* end file generic/stage1/json_string_scanner.h for haswell */
    +/* including generic/stage1/utf8_lookup4_algorithm.h for haswell: #include  */
    +/* begin file generic/stage1/utf8_lookup4_algorithm.h for haswell */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_UTF8_LOOKUP4_ALGORITHM_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_UTF8_LOOKUP4_ALGORITHM_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +namespace utf8_validation {
    +
    +using namespace simd;
    +
    +  simdjson_inline simd8 check_special_cases(const simd8 input, const simd8 prev1) {
    +// Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII)
    +// Bit 1 = Too Long (ASCII followed by continuation)
    +// Bit 2 = Overlong 3-byte
    +// Bit 4 = Surrogate
    +// Bit 5 = Overlong 2-byte
    +// Bit 7 = Two Continuations
    +    constexpr const uint8_t TOO_SHORT   = 1<<0; // 11______ 0_______
    +                                                // 11______ 11______
    +    constexpr const uint8_t TOO_LONG    = 1<<1; // 0_______ 10______
    +    constexpr const uint8_t OVERLONG_3  = 1<<2; // 11100000 100_____
    +    constexpr const uint8_t SURROGATE   = 1<<4; // 11101101 101_____
    +    constexpr const uint8_t OVERLONG_2  = 1<<5; // 1100000_ 10______
    +    constexpr const uint8_t TWO_CONTS   = 1<<7; // 10______ 10______
    +    constexpr const uint8_t TOO_LARGE   = 1<<3; // 11110100 1001____
    +                                                // 11110100 101_____
    +                                                // 11110101 1001____
    +                                                // 11110101 101_____
    +                                                // 1111011_ 1001____
    +                                                // 1111011_ 101_____
    +                                                // 11111___ 1001____
    +                                                // 11111___ 101_____
    +    constexpr const uint8_t TOO_LARGE_1000 = 1<<6;
    +                                                // 11110101 1000____
    +                                                // 1111011_ 1000____
    +                                                // 11111___ 1000____
    +    constexpr const uint8_t OVERLONG_4  = 1<<6; // 11110000 1000____
    +
    +    const simd8 byte_1_high = prev1.shr<4>().lookup_16(
    +      // 0_______ ________ 
    +      TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG,
    +      TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG,
    +      // 10______ ________ 
    +      TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS,
    +      // 1100____ ________ 
    +      TOO_SHORT | OVERLONG_2,
    +      // 1101____ ________ 
    +      TOO_SHORT,
    +      // 1110____ ________ 
    +      TOO_SHORT | OVERLONG_3 | SURROGATE,
    +      // 1111____ ________ 
    +      TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4
    +    );
    +    constexpr const uint8_t CARRY = TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 .
    +    const simd8 byte_1_low = (prev1 & 0x0F).lookup_16(
    +      // ____0000 ________
    +      CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4,
    +      // ____0001 ________
    +      CARRY | OVERLONG_2,
    +      // ____001_ ________
    +      CARRY,
    +      CARRY,
    +
    +      // ____0100 ________
    +      CARRY | TOO_LARGE,
    +      // ____0101 ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      // ____011_ ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +
    +      // ____1___ ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      // ____1101 ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000
    +    );
    +    const simd8 byte_2_high = input.shr<4>().lookup_16(
    +      // ________ 0_______ 
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT,
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT,
    +
    +      // ________ 1000____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | OVERLONG_4,
    +      // ________ 1001____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE,
    +      // ________ 101_____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE  | TOO_LARGE,
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE  | TOO_LARGE,
    +
    +      // ________ 11______
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT
    +    );
    +    return (byte_1_high & byte_1_low & byte_2_high);
    +  }
    +  simdjson_inline simd8 check_multibyte_lengths(const simd8 input,
    +      const simd8 prev_input, const simd8 sc) {
    +    simd8 prev2 = input.prev<2>(prev_input);
    +    simd8 prev3 = input.prev<3>(prev_input);
    +    simd8 must23 = simd8(must_be_2_3_continuation(prev2, prev3));
    +    simd8 must23_80 = must23 & uint8_t(0x80);
    +    return must23_80 ^ sc;
    +  }
    +
    +  //
    +  // Return nonzero if there are incomplete multibyte characters at the end of the block:
    +  // e.g. if there is a 4-byte character, but it's 3 bytes from the end.
    +  //
    +  simdjson_inline simd8 is_incomplete(const simd8 input) {
    +    // If the previous input's last 3 bytes match this, they're too short (they ended at EOF):
    +    // ... 1111____ 111_____ 11______
    +#if SIMDJSON_IMPLEMENTATION_ICELAKE
    +    static const uint8_t max_array[64] = {
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 0xf0u-1, 0xe0u-1, 0xc0u-1
    +    };
    +#else
    +    static const uint8_t max_array[32] = {
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 0xf0u-1, 0xe0u-1, 0xc0u-1
    +    };
    +#endif
    +    const simd8 max_value(&max_array[sizeof(max_array)-sizeof(simd8)]);
    +    return input.gt_bits(max_value);
    +  }
    +
    +  struct utf8_checker {
    +    // If this is nonzero, there has been a UTF-8 error.
    +    simd8 error;
    +    // The last input we received
    +    simd8 prev_input_block;
    +    // Whether the last input we received was incomplete (used for ASCII fast path)
    +    simd8 prev_incomplete;
    +
    +    //
    +    // Check whether the current bytes are valid UTF-8.
    +    //
    +    simdjson_inline void check_utf8_bytes(const simd8 input, const simd8 prev_input) {
    +      // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ lead bytes
    +      // (2, 3, 4-byte leads become large positive numbers instead of small negative numbers)
    +      simd8 prev1 = input.prev<1>(prev_input);
    +      simd8 sc = check_special_cases(input, prev1);
    +      this->error |= check_multibyte_lengths(input, prev_input, sc);
    +    }
    +
    +    // The only problem that can happen at EOF is that a multibyte character is too short
    +    // or a byte value too large in the last bytes: check_special_cases only checks for bytes
    +    // too large in the first of two bytes.
    +    simdjson_inline void check_eof() {
    +      // If the previous block had incomplete UTF-8 characters at the end, an ASCII block can't
    +      // possibly finish them.
    +      this->error |= this->prev_incomplete;
    +    }
    +
    +    simdjson_inline void check_next_input(const simd8x64& input) {
    +      if(simdjson_likely(is_ascii(input))) {
    +        this->error |= this->prev_incomplete;
    +      } else {
    +        // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    +        static_assert((simd8x64::NUM_CHUNKS == 1)
    +                ||(simd8x64::NUM_CHUNKS == 2)
    +                || (simd8x64::NUM_CHUNKS == 4),
    +                "We support one, two or four chunks per 64-byte block.");
    +        SIMDJSON_IF_CONSTEXPR (simd8x64::NUM_CHUNKS == 1) {
    +          this->check_utf8_bytes(input.chunks[0], this->prev_input_block);
    +        } else SIMDJSON_IF_CONSTEXPR (simd8x64::NUM_CHUNKS == 2) {
    +          this->check_utf8_bytes(input.chunks[0], this->prev_input_block);
    +          this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +        } else SIMDJSON_IF_CONSTEXPR (simd8x64::NUM_CHUNKS == 4) {
    +          this->check_utf8_bytes(input.chunks[0], this->prev_input_block);
    +          this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +          this->check_utf8_bytes(input.chunks[2], input.chunks[1]);
    +          this->check_utf8_bytes(input.chunks[3], input.chunks[2]);
    +        }
    +        this->prev_incomplete = is_incomplete(input.chunks[simd8x64::NUM_CHUNKS-1]);
    +        this->prev_input_block = input.chunks[simd8x64::NUM_CHUNKS-1];
    +      }
    +    }
    +    // do not forget to call check_eof!
    +    simdjson_inline error_code errors() {
    +      return this->error.any_bits_set_anywhere() ? error_code::UTF8_ERROR : error_code::SUCCESS;
    +    }
    +
    +  }; // struct utf8_checker
    +} // namespace utf8_validation
    +
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_UTF8_LOOKUP4_ALGORITHM_H
    +/* end file generic/stage1/utf8_lookup4_algorithm.h for haswell */
    +/* including generic/stage1/json_scanner.h for haswell: #include  */
    +/* begin file generic/stage1/json_scanner.h for haswell */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_SCANNER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_SCANNER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +namespace stage1 {
    +
    +/**
    + * A block of scanned json, with information on operators and scalars.
    + *
    + * We seek to identify pseudo-structural characters. Anything that is inside
    + * a string must be omitted (hence  & ~_string.string_tail()).
    + * Otherwise, pseudo-structural characters come in two forms.
    + * 1. We have the structural characters ([,],{,},:, comma). The
    + *    term 'structural character' is from the JSON RFC.
    + * 2. We have the 'scalar pseudo-structural characters'.
    + *    Scalars are quotes, and any character except structural characters and white space.
    + *
    + * To identify the scalar pseudo-structural characters, we must look at what comes
    + * before them: it must be a space, a quote or a structural characters.
    + * Starting with simdjson v0.3, we identify them by
    + * negation: we identify everything that is followed by a non-quote scalar,
    + * and we negate that. Whatever remains must be a 'scalar pseudo-structural character'.
    + */
    +struct json_block {
    +public:
    +  // We spell out the constructors in the hope of resolving inlining issues with Visual Studio 2017
    +  simdjson_inline json_block(json_string_block&& string, json_character_block characters, uint64_t follows_potential_nonquote_scalar) :
    +  _string(std::move(string)), _characters(characters), _follows_potential_nonquote_scalar(follows_potential_nonquote_scalar) {}
    +  simdjson_inline json_block(json_string_block string, json_character_block characters, uint64_t follows_potential_nonquote_scalar) :
    +  _string(string), _characters(characters), _follows_potential_nonquote_scalar(follows_potential_nonquote_scalar) {}
    +
    +  /**
    +   * The start of structurals.
    +   * In simdjson prior to v0.3, these were called the pseudo-structural characters.
    +   **/
    +  simdjson_inline uint64_t structural_start() const noexcept { return potential_structural_start() & ~_string.string_tail(); }
    +  /** All JSON whitespace (i.e. not in a string) */
    +  simdjson_inline uint64_t whitespace() const noexcept { return non_quote_outside_string(_characters.whitespace()); }
    +
    +  // Helpers
    +
    +  /** Whether the given characters are inside a string (only works on non-quotes) */
    +  simdjson_inline uint64_t non_quote_inside_string(uint64_t mask) const noexcept { return _string.non_quote_inside_string(mask); }
    +  /** Whether the given characters are outside a string (only works on non-quotes) */
    +  simdjson_inline uint64_t non_quote_outside_string(uint64_t mask) const noexcept { return _string.non_quote_outside_string(mask); }
    +
    +  // string and escape characters
    +  json_string_block _string;
    +  // whitespace, structural characters ('operators'), scalars
    +  json_character_block _characters;
    +  // whether the previous character was a scalar
    +  uint64_t _follows_potential_nonquote_scalar;
    +private:
    +  // Potential structurals (i.e. disregarding strings)
    +
    +  /**
    +   * structural elements ([,],{,},:, comma) plus scalar starts like 123, true and "abc".
    +   * They may reside inside a string.
    +   **/
    +  simdjson_inline uint64_t potential_structural_start() const noexcept { return _characters.op() | potential_scalar_start(); }
    +  /**
    +   * The start of non-operator runs, like 123, true and "abc".
    +   * It main reside inside a string.
    +   **/
    +  simdjson_inline uint64_t potential_scalar_start() const noexcept {
    +    // The term "scalar" refers to anything except structural characters and white space
    +    // (so letters, numbers, quotes).
    +    // Whenever it is preceded by something that is not a structural element ({,},[,],:, ") nor a white-space
    +    // then we know that it is irrelevant structurally.
    +    return _characters.scalar() & ~follows_potential_scalar();
    +  }
    +  /**
    +   * Whether the given character is immediately after a non-operator like 123, true.
    +   * The characters following a quote are not included.
    +   */
    +  simdjson_inline uint64_t follows_potential_scalar() const noexcept {
    +    // _follows_potential_nonquote_scalar: is defined as marking any character that follows a character
    +    // that is not a structural element ({,},[,],:, comma) nor a quote (") and that is not a
    +    // white space.
    +    // It is understood that within quoted region, anything at all could be marked (irrelevant).
    +    return _follows_potential_nonquote_scalar;
    +  }
    +};
    +
    +/**
    + * Scans JSON for important bits: structural characters or 'operators', strings, and scalars.
    + *
    + * The scanner starts by calculating two distinct things:
    + * - string characters (taking \" into account)
    + * - structural characters or 'operators' ([]{},:, comma)
    + *   and scalars (runs of non-operators like 123, true and "abc")
    + *
    + * To minimize data dependency (a key component of the scanner's speed), it finds these in parallel:
    + * in particular, the operator/scalar bit will find plenty of things that are actually part of
    + * strings. When we're done, json_block will fuse the two together by masking out tokens that are
    + * part of a string.
    + */
    +class json_scanner {
    +public:
    +  json_scanner() = default;
    +  simdjson_inline json_block next(const simd::simd8x64& in);
    +  // Returns either UNCLOSED_STRING or SUCCESS
    +  simdjson_inline error_code finish();
    +
    +private:
    +  // Whether the last character of the previous iteration is part of a scalar token
    +  // (anything except whitespace or a structural character/'operator').
    +  uint64_t prev_scalar = 0ULL;
    +  json_string_scanner string_scanner{};
    +};
    +
    +
    +//
    +// Check if the current character immediately follows a matching character.
    +//
    +// For example, this checks for quotes with backslashes in front of them:
    +//
    +//     const uint64_t backslashed_quote = in.eq('"') & immediately_follows(in.eq('\'), prev_backslash);
    +//
    +simdjson_inline uint64_t follows(const uint64_t match, uint64_t &overflow) {
    +  const uint64_t result = match << 1 | overflow;
    +  overflow = match >> 63;
    +  return result;
    +}
    +
    +simdjson_inline json_block json_scanner::next(const simd::simd8x64& in) {
    +  json_string_block strings = string_scanner.next(in);
    +  // identifies the white-space and the structural characters
    +  json_character_block characters = json_character_block::classify(in);
    +  // The term "scalar" refers to anything except structural characters and white space
    +  // (so letters, numbers, quotes).
    +  // We want follows_scalar to mark anything that follows a non-quote scalar (so letters and numbers).
    +  //
    +  // A terminal quote should either be followed by a structural character (comma, brace, bracket, colon)
    +  // or nothing. However, we still want ' "a string"true ' to mark the 't' of 'true' as a potential
    +  // pseudo-structural character just like we would if we had  ' "a string" true '; otherwise we
    +  // may need to add an extra check when parsing strings.
    +  //
    +  // Performance: there are many ways to skin this cat.
    +  const uint64_t nonquote_scalar = characters.scalar() & ~strings.quote();
    +  uint64_t follows_nonquote_scalar = follows(nonquote_scalar, prev_scalar);
    +  // We are returning a function-local object so either we get a move constructor
    +  // or we get copy elision.
    +  return json_block(
    +    strings,// strings is a function-local object so either it moves or the copy is elided.
    +    characters,
    +    follows_nonquote_scalar
    +  );
    +}
    +
    +simdjson_inline error_code json_scanner::finish() {
    +  return string_scanner.finish();
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_SCANNER_H
    +/* end file generic/stage1/json_scanner.h for haswell */
    +
    +// All other declarations
    +/* including generic/stage1/find_next_document_index.h for haswell: #include  */
    +/* begin file generic/stage1/find_next_document_index.h for haswell */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +namespace stage1 {
    +
    +/**
    +  * This algorithm is used to quickly identify the last structural position that
    +  * makes up a complete document.
    +  *
    +  * It does this by going backwards and finding the last *document boundary* (a
    +  * place where one value follows another without a comma between them). If the
    +  * last document (the characters after the boundary) has an equal number of
    +  * start and end brackets, it is considered complete.
    +  *
    +  * Simply put, we iterate over the structural characters, starting from
    +  * the end. We consider that we found the end of a JSON document when the
    +  * first element of the pair is NOT one of these characters: '{' '[' ':' ','
    +  * and when the second element is NOT one of these characters: '}' ']' ':' ','.
    +  *
    +  * This simple comparison works most of the time, but it does not cover cases
    +  * where the batch's structural indexes contain a perfect amount of documents.
    +  * In such a case, we do not have access to the structural index which follows
    +  * the last document, therefore, we do not have access to the second element in
    +  * the pair, and that means we cannot identify the last document. To fix this
    +  * issue, we keep a count of the open and closed curly/square braces we found
    +  * while searching for the pair. When we find a pair AND the count of open and
    +  * closed curly/square braces is the same, we know that we just passed a
    +  * complete document, therefore the last json buffer location is the end of the
    +  * batch.
    +  */
    +simdjson_inline uint32_t find_next_document_index(dom_parser_implementation &parser) {
    +  // Variant: do not count separately, just figure out depth
    +  if(parser.n_structural_indexes == 0) { return 0; }
    +  auto arr_cnt = 0;
    +  auto obj_cnt = 0;
    +  for (auto i = parser.n_structural_indexes - 1; i > 0; i--) {
    +    auto idxb = parser.structural_indexes[i];
    +    switch (parser.buf[idxb]) {
    +    case ':':
    +    case ',':
    +      continue;
    +    case '}':
    +      obj_cnt--;
    +      continue;
    +    case ']':
    +      arr_cnt--;
    +      continue;
    +    case '{':
    +      obj_cnt++;
    +      break;
    +    case '[':
    +      arr_cnt++;
    +      break;
    +    }
    +    auto idxa = parser.structural_indexes[i - 1];
    +    switch (parser.buf[idxa]) {
    +    case '{':
    +    case '[':
    +    case ':':
    +    case ',':
    +      continue;
    +    }
    +    // Last document is complete, so the next document will appear after!
    +    if (!arr_cnt && !obj_cnt) {
    +      return parser.n_structural_indexes;
    +    }
    +    // Last document is incomplete; mark the document at i + 1 as the next one
    +    return i;
    +  }
    +  // If we made it to the end, we want to finish counting to see if we have a full document.
    +  switch (parser.buf[parser.structural_indexes[0]]) {
    +    case '}':
    +      obj_cnt--;
    +      break;
    +    case ']':
    +      arr_cnt--;
    +      break;
    +    case '{':
    +      obj_cnt++;
    +      break;
    +    case '[':
    +      arr_cnt++;
    +      break;
    +  }
    +  if (!arr_cnt && !obj_cnt) {
    +    // We have a complete document.
    +    return parser.n_structural_indexes;
    +  }
    +  return 0;
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H
    +/* end file generic/stage1/find_next_document_index.h for haswell */
    +/* including generic/stage1/json_minifier.h for haswell: #include  */
    +/* begin file generic/stage1/json_minifier.h for haswell */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_MINIFIER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_MINIFIER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This file contains the common code every implementation uses in stage1
    +// It is intended to be included multiple times and compiled multiple times
    +// We assume the file in which it is included already includes
    +// "simdjson/stage1.h" (this simplifies amalgation)
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +namespace stage1 {
    +
    +class json_minifier {
    +public:
    +  template
    +  static error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) noexcept;
    +
    +private:
    +  simdjson_inline json_minifier(uint8_t *_dst)
    +  : dst{_dst}
    +  {}
    +  template
    +  simdjson_inline void step(const uint8_t *block_buf, buf_block_reader &reader) noexcept;
    +  simdjson_inline void next(const simd::simd8x64& in, const json_block& block);
    +  simdjson_inline error_code finish(uint8_t *dst_start, size_t &dst_len);
    +  json_scanner scanner{};
    +  uint8_t *dst;
    +};
    +
    +simdjson_inline void json_minifier::next(const simd::simd8x64& in, const json_block& block) {
    +  uint64_t mask = block.whitespace();
    +  dst += in.compress(mask, dst);
    +}
    +
    +simdjson_inline error_code json_minifier::finish(uint8_t *dst_start, size_t &dst_len) {
    +  error_code error = scanner.finish();
    +  if (error) { dst_len = 0; return error; }
    +  dst_len = dst - dst_start;
    +  return SUCCESS;
    +}
    +
    +template<>
    +simdjson_inline void json_minifier::step<128>(const uint8_t *block_buf, buf_block_reader<128> &reader) noexcept {
    +  simd::simd8x64 in_1(block_buf);
    +  simd::simd8x64 in_2(block_buf+64);
    +  json_block block_1 = scanner.next(in_1);
    +  json_block block_2 = scanner.next(in_2);
    +  this->next(in_1, block_1);
    +  this->next(in_2, block_2);
    +  reader.advance();
    +}
    +
    +template<>
    +simdjson_inline void json_minifier::step<64>(const uint8_t *block_buf, buf_block_reader<64> &reader) noexcept {
    +  simd::simd8x64 in_1(block_buf);
    +  json_block block_1 = scanner.next(in_1);
    +  this->next(block_buf, block_1);
    +  reader.advance();
    +}
    +
    +template
    +error_code json_minifier::minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) noexcept {
    +  buf_block_reader reader(buf, len);
    +  json_minifier minifier(dst);
    +
    +  // Index the first n-1 blocks
    +  while (reader.has_full_block()) {
    +    minifier.step(reader.full_block(), reader);
    +  }
    +
    +  // Index the last (remainder) block, padded with spaces
    +  uint8_t block[STEP_SIZE];
    +  size_t remaining_bytes = reader.get_remainder(block);
    +  if (remaining_bytes > 0) {
    +    // We do not want to write directly to the output stream. Rather, we write
    +    // to a local buffer (for safety).
    +    uint8_t out_block[STEP_SIZE];
    +    uint8_t * const guarded_dst{minifier.dst};
    +    minifier.dst = out_block;
    +    minifier.step(block, reader);
    +    size_t to_write = minifier.dst - out_block;
    +    // In some cases, we could be enticed to consider the padded spaces
    +    // as part of the string. This is fine as long as we do not write more
    +    // than we consumed.
    +    if(to_write > remaining_bytes) { to_write = remaining_bytes; }
    +    memcpy(guarded_dst, out_block, to_write);
    +    minifier.dst = guarded_dst + to_write;
    +  }
    +  return minifier.finish(dst, dst_len);
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_MINIFIER_H
    +/* end file generic/stage1/json_minifier.h for haswell */
    +/* including generic/stage1/json_structural_indexer.h for haswell: #include  */
    +/* begin file generic/stage1/json_structural_indexer.h for haswell */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRUCTURAL_INDEXER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRUCTURAL_INDEXER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This file contains the common code every implementation uses in stage1
    +// It is intended to be included multiple times and compiled multiple times
    +// We assume the file in which it is included already includes
    +// "simdjson/stage1.h" (this simplifies amalgation)
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +namespace stage1 {
    +
    +class bit_indexer {
    +public:
    +  uint32_t *tail;
    +
    +  simdjson_inline bit_indexer(uint32_t *index_buf) : tail(index_buf) {}
    +
    +#if SIMDJSON_PREFER_REVERSE_BITS
    +  /**
    +    * ARM lacks a fast trailing zero instruction, but it has a fast
    +    * bit reversal instruction and a fast leading zero instruction.
    +    * Thus it may be profitable to reverse the bits (once) and then
    +    * to rely on a sequence of instructions that call the leading
    +    * zero instruction.
    +    *
    +    * Performance notes:
    +    * The chosen routine is not optimal in terms of data dependency
    +    * since zero_leading_bit might require two instructions. However,
    +    * it tends to minimize the total number of instructions which is
    +    * beneficial.
    +    */
    +  simdjson_inline void write_index(uint32_t idx, uint64_t& rev_bits, int i) {
    +    int lz = leading_zeroes(rev_bits);
    +    this->tail[i] = static_cast(idx) + lz;
    +    rev_bits = zero_leading_bit(rev_bits, lz);
    +  }
    +#else
    +  /**
    +    * Under recent x64 systems, we often have both a fast trailing zero
    +    * instruction and a fast 'clear-lower-bit' instruction so the following
    +    * algorithm can be competitive.
    +    */
    +
    +  simdjson_inline void write_index(uint32_t idx, uint64_t& bits, int i) {
    +    this->tail[i] = idx + trailing_zeroes(bits);
    +    bits = clear_lowest_bit(bits);
    +  }
    +#endif // SIMDJSON_PREFER_REVERSE_BITS
    +
    +  template 
    +  simdjson_inline int write_indexes(uint32_t idx, uint64_t& bits) {
    +    write_index(idx, bits, START);
    +    SIMDJSON_IF_CONSTEXPR (N > 1) {
    +      write_indexes<(N-1>0?START+1:START), (N-1>=0?N-1:1)>(idx, bits);
    +    }
    +    return START+N;
    +  }
    +
    +  template 
    +  simdjson_inline int write_indexes_stepped(uint32_t idx, uint64_t& bits, int cnt) {
    +    write_indexes(idx, bits);
    +    SIMDJSON_IF_CONSTEXPR ((START+STEP)  < END) {
    +      if (simdjson_unlikely((START+STEP) < cnt)) {
    +        write_indexes_stepped<(START+STEP(idx, bits, cnt);
    +      }
    +    }
    +    return ((END-START) % STEP) == 0 ? END : (END-START) - ((END-START) % STEP) + STEP;
    +  }
    +
    +  // flatten out values in 'bits' assuming that they are are to have values of idx
    +  // plus their position in the bitvector, and store these indexes at
    +  // base_ptr[base] incrementing base as we go
    +  // will potentially store extra values beyond end of valid bits, so base_ptr
    +  // needs to be large enough to handle this
    +  //
    +  // If the kernel sets SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER, then it
    +  // will provide its own version of the code.
    +#ifdef SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER
    +  simdjson_inline void write(uint32_t idx, uint64_t bits);
    +#else
    +  simdjson_inline void write(uint32_t idx, uint64_t bits) {
    +    // In some instances, the next branch is expensive because it is mispredicted.
    +    // Unfortunately, in other cases,
    +    // it helps tremendously.
    +    if (bits == 0)
    +        return;
    +
    +    int cnt = static_cast(count_ones(bits));
    +
    +#if SIMDJSON_PREFER_REVERSE_BITS
    +    bits = reverse_bits(bits);
    +#endif
    +#ifdef SIMDJSON_STRUCTURAL_INDEXER_STEP
    +    static constexpr const int STEP = SIMDJSON_STRUCTURAL_INDEXER_STEP;
    +#else
    +    static constexpr const int STEP = 4;
    +#endif
    +    static constexpr const int STEP_UNTIL = 24;
    +
    +    write_indexes_stepped<0, STEP_UNTIL, STEP>(idx, bits, cnt);
    +    SIMDJSON_IF_CONSTEXPR (STEP_UNTIL < 64) {
    +      if (simdjson_unlikely(STEP_UNTIL < cnt)) {
    +        for (int i=STEP_UNTIL; itail += cnt;
    +  }
    +#endif // SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER
    +
    +};
    +
    +class json_structural_indexer {
    +public:
    +  /**
    +   * Find the important bits of JSON in a 128-byte chunk, and add them to structural_indexes.
    +   *
    +   * @param partial Setting the partial parameter to true allows the find_structural_bits to
    +   *   tolerate unclosed strings. The caller should still ensure that the input is valid UTF-8. If
    +   *   you are processing substrings, you may want to call on a function like trimmed_length_safe_utf8.
    +   */
    +  template
    +  static error_code index(const uint8_t *buf, size_t len, dom_parser_implementation &parser, stage1_mode partial) noexcept;
    +
    +private:
    +  simdjson_inline json_structural_indexer(uint32_t *structural_indexes);
    +  template
    +  simdjson_inline void step(const uint8_t *block, buf_block_reader &reader) noexcept;
    +  simdjson_inline void next(const simd::simd8x64& in, const json_block& block, size_t idx);
    +  simdjson_inline error_code finish(dom_parser_implementation &parser, size_t idx, size_t len, stage1_mode partial);
    +
    +  json_scanner scanner{};
    +  utf8_checker checker{};
    +  bit_indexer indexer;
    +  uint64_t prev_structurals = 0;
    +  uint64_t unescaped_chars_error = 0;
    +};
    +
    +simdjson_inline json_structural_indexer::json_structural_indexer(uint32_t *structural_indexes) : indexer{structural_indexes} {}
    +
    +// Skip the last character if it is partial
    +simdjson_inline size_t trim_partial_utf8(const uint8_t *buf, size_t len) {
    +  if (simdjson_unlikely(len < 3)) {
    +    switch (len) {
    +      case 2:
    +        if (buf[len-1] >= 0xc0) { return len-1; } // 2-, 3- and 4-byte characters with only 1 byte left
    +        if (buf[len-2] >= 0xe0) { return len-2; } // 3- and 4-byte characters with only 2 bytes left
    +        return len;
    +      case 1:
    +        if (buf[len-1] >= 0xc0) { return len-1; } // 2-, 3- and 4-byte characters with only 1 byte left
    +        return len;
    +      case 0:
    +        return len;
    +    }
    +  }
    +  if (buf[len-1] >= 0xc0) { return len-1; } // 2-, 3- and 4-byte characters with only 1 byte left
    +  if (buf[len-2] >= 0xe0) { return len-2; } // 3- and 4-byte characters with only 1 byte left
    +  if (buf[len-3] >= 0xf0) { return len-3; } // 4-byte characters with only 3 bytes left
    +  return len;
    +}
    +
    +//
    +// PERF NOTES:
    +// We pipe 2 inputs through these stages:
    +// 1. Load JSON into registers. This takes a long time and is highly parallelizable, so we load
    +//    2 inputs' worth at once so that by the time step 2 is looking for them input, it's available.
    +// 2. Scan the JSON for critical data: strings, scalars and operators. This is the critical path.
    +//    The output of step 1 depends entirely on this information. These functions don't quite use
    +//    up enough CPU: the second half of the functions is highly serial, only using 1 execution core
    +//    at a time. The second input's scans has some dependency on the first ones finishing it, but
    +//    they can make a lot of progress before they need that information.
    +// 3. Step 1 doesn't use enough capacity, so we run some extra stuff while we're waiting for that
    +//    to finish: utf-8 checks and generating the output from the last iteration.
    +//
    +// The reason we run 2 inputs at a time, is steps 2 and 3 are *still* not enough to soak up all
    +// available capacity with just one input. Running 2 at a time seems to give the CPU a good enough
    +// workout.
    +//
    +template
    +error_code json_structural_indexer::index(const uint8_t *buf, size_t len, dom_parser_implementation &parser, stage1_mode partial) noexcept {
    +  if (simdjson_unlikely(len > parser.capacity())) { return CAPACITY; }
    +  // We guard the rest of the code so that we can assume that len > 0 throughout.
    +  if (len == 0) { return EMPTY; }
    +  if (is_streaming(partial)) {
    +    len = trim_partial_utf8(buf, len);
    +    // If you end up with an empty window after trimming
    +    // the partial UTF-8 bytes, then chances are good that you
    +    // have an UTF-8 formatting error.
    +    if(len == 0) { return UTF8_ERROR; }
    +  }
    +  buf_block_reader reader(buf, len);
    +  json_structural_indexer indexer(parser.structural_indexes.get());
    +
    +  // Read all but the last block
    +  while (reader.has_full_block()) {
    +    indexer.step(reader.full_block(), reader);
    +  }
    +  // Take care of the last block (will always be there unless file is empty which is
    +  // not supposed to happen.)
    +  uint8_t block[STEP_SIZE];
    +  if (simdjson_unlikely(reader.get_remainder(block) == 0)) { return UNEXPECTED_ERROR; }
    +  indexer.step(block, reader);
    +  return indexer.finish(parser, reader.block_index(), len, partial);
    +}
    +
    +template<>
    +simdjson_inline void json_structural_indexer::step<128>(const uint8_t *block, buf_block_reader<128> &reader) noexcept {
    +  simd::simd8x64 in_1(block);
    +  simd::simd8x64 in_2(block+64);
    +  json_block block_1 = scanner.next(in_1);
    +  json_block block_2 = scanner.next(in_2);
    +  this->next(in_1, block_1, reader.block_index());
    +  this->next(in_2, block_2, reader.block_index()+64);
    +  reader.advance();
    +}
    +
    +template<>
    +simdjson_inline void json_structural_indexer::step<64>(const uint8_t *block, buf_block_reader<64> &reader) noexcept {
    +  simd::simd8x64 in_1(block);
    +  json_block block_1 = scanner.next(in_1);
    +  this->next(in_1, block_1, reader.block_index());
    +  reader.advance();
    +}
    +
    +simdjson_inline void json_structural_indexer::next(const simd::simd8x64& in, const json_block& block, size_t idx) {
    +  uint64_t unescaped = in.lteq(0x1F);
    +#if SIMDJSON_UTF8VALIDATION
    +  checker.check_next_input(in);
    +#endif
    +  indexer.write(uint32_t(idx-64), prev_structurals); // Output *last* iteration's structurals to the parser
    +  prev_structurals = block.structural_start();
    +  unescaped_chars_error |= block.non_quote_inside_string(unescaped);
    +}
    +
    +simdjson_inline error_code json_structural_indexer::finish(dom_parser_implementation &parser, size_t idx, size_t len, stage1_mode partial) {
    +  // Write out the final iteration's structurals
    +  indexer.write(uint32_t(idx-64), prev_structurals);
    +  error_code error = scanner.finish();
    +  // We deliberately break down the next expression so that it is
    +  // human readable.
    +  const bool should_we_exit = is_streaming(partial) ?
    +    ((error != SUCCESS) && (error != UNCLOSED_STRING)) // when partial we tolerate UNCLOSED_STRING
    +    : (error != SUCCESS); // if partial is false, we must have SUCCESS
    +  const bool have_unclosed_string = (error == UNCLOSED_STRING);
    +  if (simdjson_unlikely(should_we_exit)) { return error; }
    +
    +  if (unescaped_chars_error) {
    +    return UNESCAPED_CHARS;
    +  }
    +  parser.n_structural_indexes = uint32_t(indexer.tail - parser.structural_indexes.get());
    +  /***
    +   * The On Demand API requires special padding.
    +   *
    +   * This is related to https://github.com/simdjson/simdjson/issues/906
    +   * Basically, we want to make sure that if the parsing continues beyond the last (valid)
    +   * structural character, it quickly stops.
    +   * Only three structural characters can be repeated without triggering an error in JSON:  [,] and }.
    +   * We repeat the padding character (at 'len'). We don't know what it is, but if the parsing
    +   * continues, then it must be [,] or }.
    +   * Suppose it is ] or }. We backtrack to the first character, what could it be that would
    +   * not trigger an error? It could be ] or } but no, because you can't start a document that way.
    +   * It can't be a comma, a colon or any simple value. So the only way we could continue is
    +   * if the repeated character is [. But if so, the document must start with [. But if the document
    +   * starts with [, it should end with ]. If we enforce that rule, then we would get
    +   * ][[ which is invalid.
    +   *
    +   * This is illustrated with the test array_iterate_unclosed_error() on the following input:
    +   * R"({ "a": [,,)"
    +   **/
    +  parser.structural_indexes[parser.n_structural_indexes] = uint32_t(len); // used later in partial == stage1_mode::streaming_final
    +  parser.structural_indexes[parser.n_structural_indexes + 1] = uint32_t(len);
    +  parser.structural_indexes[parser.n_structural_indexes + 2] = 0;
    +  parser.next_structural_index = 0;
    +  // a valid JSON file cannot have zero structural indexes - we should have found something
    +  if (simdjson_unlikely(parser.n_structural_indexes == 0u)) {
    +    return EMPTY;
    +  }
    +  if (simdjson_unlikely(parser.structural_indexes[parser.n_structural_indexes - 1] > len)) {
    +    return UNEXPECTED_ERROR;
    +  }
    +  if (partial == stage1_mode::streaming_partial) {
    +    // If we have an unclosed string, then the last structural
    +    // will be the quote and we want to make sure to omit it.
    +    if(have_unclosed_string) {
    +      parser.n_structural_indexes--;
    +      // a valid JSON file cannot have zero structural indexes - we should have found something
    +      if (simdjson_unlikely(parser.n_structural_indexes == 0u)) { return CAPACITY; }
    +    }
    +    // We truncate the input to the end of the last complete document (or zero).
    +    auto new_structural_indexes = find_next_document_index(parser);
    +    if (new_structural_indexes == 0 && parser.n_structural_indexes > 0) {
    +      if(parser.structural_indexes[0] == 0) {
    +        // If the buffer is partial and we started at index 0 but the document is
    +        // incomplete, it's too big to parse.
    +        return CAPACITY;
    +      } else {
    +        // It is possible that the document could be parsed, we just had a lot
    +        // of white space.
    +        parser.n_structural_indexes = 0;
    +        return EMPTY;
    +      }
    +    }
    +
    +    parser.n_structural_indexes = new_structural_indexes;
    +  } else if (partial == stage1_mode::streaming_final) {
    +    if(have_unclosed_string) { parser.n_structural_indexes--; }
    +    // We truncate the input to the end of the last complete document (or zero).
    +    // Because partial == stage1_mode::streaming_final, it means that we may
    +    // silently ignore trailing garbage. Though it sounds bad, we do it
    +    // deliberately because many people who have streams of JSON documents
    +    // will truncate them for processing. E.g., imagine that you are uncompressing
    +    // the data from a size file or receiving it in chunks from the network. You
    +    // may not know where exactly the last document will be. Meanwhile the
    +    // document_stream instances allow people to know the JSON documents they are
    +    // parsing (see the iterator.source() method).
    +    parser.n_structural_indexes = find_next_document_index(parser);
    +    // We store the initial n_structural_indexes so that the client can see
    +    // whether we used truncation. If initial_n_structural_indexes == parser.n_structural_indexes,
    +    // then this will query parser.structural_indexes[parser.n_structural_indexes] which is len,
    +    // otherwise, it will copy some prior index.
    +    parser.structural_indexes[parser.n_structural_indexes + 1] = parser.structural_indexes[parser.n_structural_indexes];
    +    // This next line is critical, do not change it unless you understand what you are
    +    // doing.
    +    parser.structural_indexes[parser.n_structural_indexes] = uint32_t(len);
    +    if (simdjson_unlikely(parser.n_structural_indexes == 0u)) {
    +        // We tolerate an unclosed string at the very end of the stream. Indeed, users
    +        // often load their data in bulk without being careful and they want us to ignore
    +        // the trailing garbage.
    +        return EMPTY;
    +    }
    +  }
    +  checker.check_eof();
    +  return checker.errors();
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +// Clear CUSTOM_BIT_INDEXER so other implementations can set it if they need to.
    +#undef SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRUCTURAL_INDEXER_H
    +/* end file generic/stage1/json_structural_indexer.h for haswell */
    +/* including generic/stage1/utf8_validator.h for haswell: #include  */
    +/* begin file generic/stage1/utf8_validator.h for haswell */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_UTF8_VALIDATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_UTF8_VALIDATOR_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +namespace stage1 {
    +
    +/**
    + * Validates that the string is actual UTF-8.
    + */
    +template
    +bool generic_validate_utf8(const uint8_t * input, size_t length) {
    +    checker c{};
    +    buf_block_reader<64> reader(input, length);
    +    while (reader.has_full_block()) {
    +      simd::simd8x64 in(reader.full_block());
    +      c.check_next_input(in);
    +      reader.advance();
    +    }
    +    uint8_t block[64]{};
    +    reader.get_remainder(block);
    +    simd::simd8x64 in(block);
    +    c.check_next_input(in);
    +    reader.advance();
    +    c.check_eof();
    +    return c.errors() == error_code::SUCCESS;
    +}
    +
    +bool generic_validate_utf8(const char * input, size_t length) {
    +    return generic_validate_utf8(reinterpret_cast(input),length);
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_UTF8_VALIDATOR_H
    +/* end file generic/stage1/utf8_validator.h for haswell */
    +/* end file generic/stage1/amalgamated.h for haswell */
    +/* including generic/stage2/amalgamated.h for haswell: #include  */
    +/* begin file generic/stage2/amalgamated.h for haswell */
    +// Stuff other things depend on
    +/* including generic/stage2/base.h for haswell: #include  */
    +/* begin file generic/stage2/base.h for haswell */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_BASE_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +namespace stage2 {
    +
    +class json_iterator;
    +class structural_iterator;
    +struct tape_builder;
    +struct tape_writer;
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_BASE_H
    +/* end file generic/stage2/base.h for haswell */
    +/* including generic/stage2/tape_writer.h for haswell: #include  */
    +/* begin file generic/stage2/tape_writer.h for haswell */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +namespace stage2 {
    +
    +struct tape_writer {
    +  /** The next place to write to tape */
    +  uint64_t *next_tape_loc;
    +
    +  /** Write a signed 64-bit value to tape. */
    +  simdjson_inline void append_s64(int64_t value) noexcept;
    +
    +  /** Write an unsigned 64-bit value to tape. */
    +  simdjson_inline void append_u64(uint64_t value) noexcept;
    +
    +  /** Write a double value to tape. */
    +  simdjson_inline void append_double(double value) noexcept;
    +
    +  /**
    +   * Append a tape entry (an 8-bit type,and 56 bits worth of value).
    +   */
    +  simdjson_inline void append(uint64_t val, internal::tape_type t) noexcept;
    +
    +  /**
    +   * Skip the current tape entry without writing.
    +   *
    +   * Used to skip the start of the container, since we'll come back later to fill it in when the
    +   * container ends.
    +   */
    +  simdjson_inline void skip() noexcept;
    +
    +  /**
    +   * Skip the number of tape entries necessary to write a large u64 or i64.
    +   */
    +  simdjson_inline void skip_large_integer() noexcept;
    +
    +  /**
    +   * Skip the number of tape entries necessary to write a double.
    +   */
    +  simdjson_inline void skip_double() noexcept;
    +
    +  /**
    +   * Write a value to a known location on tape.
    +   *
    +   * Used to go back and write out the start of a container after the container ends.
    +   */
    +  simdjson_inline static void write(uint64_t &tape_loc, uint64_t val, internal::tape_type t) noexcept;
    +
    +private:
    +  /**
    +   * Append both the tape entry, and a supplementary value following it. Used for types that need
    +   * all 64 bits, such as double and uint64_t.
    +   */
    +  template
    +  simdjson_inline void append2(uint64_t val, T val2, internal::tape_type t) noexcept;
    +}; // struct tape_writer
    +
    +simdjson_inline void tape_writer::append_s64(int64_t value) noexcept {
    +  append2(0, value, internal::tape_type::INT64);
    +}
    +
    +simdjson_inline void tape_writer::append_u64(uint64_t value) noexcept {
    +  append(0, internal::tape_type::UINT64);
    +  *next_tape_loc = value;
    +  next_tape_loc++;
    +}
    +
    +/** Write a double value to tape. */
    +simdjson_inline void tape_writer::append_double(double value) noexcept {
    +  append2(0, value, internal::tape_type::DOUBLE);
    +}
    +
    +simdjson_inline void tape_writer::skip() noexcept {
    +  next_tape_loc++;
    +}
    +
    +simdjson_inline void tape_writer::skip_large_integer() noexcept {
    +  next_tape_loc += 2;
    +}
    +
    +simdjson_inline void tape_writer::skip_double() noexcept {
    +  next_tape_loc += 2;
    +}
    +
    +simdjson_inline void tape_writer::append(uint64_t val, internal::tape_type t) noexcept {
    +  *next_tape_loc = val | ((uint64_t(char(t))) << 56);
    +  next_tape_loc++;
    +}
    +
    +template
    +simdjson_inline void tape_writer::append2(uint64_t val, T val2, internal::tape_type t) noexcept {
    +  append(val, t);
    +  static_assert(sizeof(val2) == sizeof(*next_tape_loc), "Type is not 64 bits!");
    +  memcpy(next_tape_loc, &val2, sizeof(val2));
    +  next_tape_loc++;
    +}
    +
    +simdjson_inline void tape_writer::write(uint64_t &tape_loc, uint64_t val, internal::tape_type t) noexcept {
    +  tape_loc = val | ((uint64_t(char(t))) << 56);
    +}
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H
    +/* end file generic/stage2/tape_writer.h for haswell */
    +/* including generic/stage2/logger.h for haswell: #include  */
    +/* begin file generic/stage2/logger.h for haswell */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_LOGGER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_LOGGER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +
    +// This is for an internal-only stage 2 specific logger.
    +// Set LOG_ENABLED = true to log what stage 2 is doing!
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +namespace logger {
    +
    +  static constexpr const char * DASHES = "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------";
    +
    +#if SIMDJSON_VERBOSE_LOGGING
    +  static constexpr const bool LOG_ENABLED = true;
    +#else
    +  static constexpr const bool LOG_ENABLED = false;
    +#endif
    +  static constexpr const int LOG_EVENT_LEN = 20;
    +  static constexpr const int LOG_BUFFER_LEN = 30;
    +  static constexpr const int LOG_SMALL_BUFFER_LEN = 10;
    +  static constexpr const int LOG_INDEX_LEN = 5;
    +
    +  static int log_depth; // Not threadsafe. Log only.
    +
    +  // Helper to turn unprintable or newline characters into spaces
    +  static simdjson_inline char printable_char(char c) {
    +    if (c >= 0x20) {
    +      return c;
    +    } else {
    +      return ' ';
    +    }
    +  }
    +
    +  // Print the header and set up log_start
    +  static simdjson_inline void log_start() {
    +    if (LOG_ENABLED) {
    +      log_depth = 0;
    +      printf("\n");
    +      printf("| %-*s | %-*s | %-*s | %-*s | Detail |\n", LOG_EVENT_LEN, "Event", LOG_BUFFER_LEN, "Buffer", LOG_SMALL_BUFFER_LEN, "Next", 5, "Next#");
    +      printf("|%.*s|%.*s|%.*s|%.*s|--------|\n", LOG_EVENT_LEN+2, DASHES, LOG_BUFFER_LEN+2, DASHES, LOG_SMALL_BUFFER_LEN+2, DASHES, 5+2, DASHES);
    +    }
    +  }
    +
    +  simdjson_unused static simdjson_inline void log_string(const char *message) {
    +    if (LOG_ENABLED) {
    +      printf("%s\n", message);
    +    }
    +  }
    +
    +  // Logs a single line from the stage 2 DOM parser
    +  template
    +  static simdjson_inline void log_line(S &structurals, const char *title_prefix, const char *title, const char *detail) {
    +    if (LOG_ENABLED) {
    +      printf("| %*s%s%-*s ", log_depth*2, "", title_prefix, LOG_EVENT_LEN - log_depth*2 - int(strlen(title_prefix)), title);
    +      auto current_index = structurals.at_beginning() ? nullptr : structurals.next_structural-1;
    +      auto next_index = structurals.next_structural;
    +      auto current = current_index ? &structurals.buf[*current_index] : reinterpret_cast("                                                       ");
    +      auto next = &structurals.buf[*next_index];
    +      {
    +        // Print the next N characters in the buffer.
    +        printf("| ");
    +        // Otherwise, print the characters starting from the buffer position.
    +        // Print spaces for unprintable or newline characters.
    +        for (int i=0;i */
    +/* begin file generic/stage2/json_iterator.h for haswell */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +namespace stage2 {
    +
    +class json_iterator {
    +public:
    +  const uint8_t* const buf;
    +  uint32_t *next_structural;
    +  dom_parser_implementation &dom_parser;
    +  uint32_t depth{0};
    +
    +  /**
    +   * Walk the JSON document.
    +   *
    +   * The visitor receives callbacks when values are encountered. All callbacks pass the iterator as
    +   * the first parameter; some callbacks have other parameters as well:
    +   *
    +   * - visit_document_start() - at the beginning.
    +   * - visit_document_end() - at the end (if things were successful).
    +   *
    +   * - visit_array_start() - at the start `[` of a non-empty array.
    +   * - visit_array_end() - at the end `]` of a non-empty array.
    +   * - visit_empty_array() - when an empty array is encountered.
    +   *
    +   * - visit_object_end() - at the start `]` of a non-empty object.
    +   * - visit_object_start() - at the end `]` of a non-empty object.
    +   * - visit_empty_object() - when an empty object is encountered.
    +   * - visit_key(const uint8_t *key) - when a key in an object field is encountered. key is
    +   *                                   guaranteed to point at the first quote of the string (`"key"`).
    +   * - visit_primitive(const uint8_t *value) - when a value is a string, number, boolean or null.
    +   * - visit_root_primitive(iter, uint8_t *value) - when the top-level value is a string, number, boolean or null.
    +   *
    +   * - increment_count(iter) - each time a value is found in an array or object.
    +   */
    +  template
    +  simdjson_warn_unused simdjson_inline error_code walk_document(V &visitor) noexcept;
    +
    +  /**
    +   * Create an iterator capable of walking a JSON document.
    +   *
    +   * The document must have already passed through stage 1.
    +   */
    +  simdjson_inline json_iterator(dom_parser_implementation &_dom_parser, size_t start_structural_index);
    +
    +  /**
    +   * Look at the next token.
    +   *
    +   * Tokens can be strings, numbers, booleans, null, or operators (`[{]},:`)).
    +   *
    +   * They may include invalid JSON as well (such as `1.2.3` or `ture`).
    +   */
    +  simdjson_inline const uint8_t *peek() const noexcept;
    +  /**
    +   * Advance to the next token.
    +   *
    +   * Tokens can be strings, numbers, booleans, null, or operators (`[{]},:`)).
    +   *
    +   * They may include invalid JSON as well (such as `1.2.3` or `ture`).
    +   */
    +  simdjson_inline const uint8_t *advance() noexcept;
    +  /**
    +   * Get the remaining length of the document, from the start of the current token.
    +   */
    +  simdjson_inline size_t remaining_len() const noexcept;
    +  /**
    +   * Check if we are at the end of the document.
    +   *
    +   * If this is true, there are no more tokens.
    +   */
    +  simdjson_inline bool at_eof() const noexcept;
    +  /**
    +   * Check if we are at the beginning of the document.
    +   */
    +  simdjson_inline bool at_beginning() const noexcept;
    +  simdjson_inline uint8_t last_structural() const noexcept;
    +
    +  /**
    +   * Log that a value has been found.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_value(const char *type) const noexcept;
    +  /**
    +   * Log the start of a multipart value.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_start_value(const char *type) const noexcept;
    +  /**
    +   * Log the end of a multipart value.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_end_value(const char *type) const noexcept;
    +  /**
    +   * Log an error.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_error(const char *error) const noexcept;
    +
    +  template
    +  simdjson_warn_unused simdjson_inline error_code visit_root_primitive(V &visitor, const uint8_t *value) noexcept;
    +  template
    +  simdjson_warn_unused simdjson_inline error_code visit_primitive(V &visitor, const uint8_t *value) noexcept;
    +};
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code json_iterator::walk_document(V &visitor) noexcept {
    +  logger::log_start();
    +
    +  //
    +  // Start the document
    +  //
    +  if (at_eof()) { return EMPTY; }
    +  log_start_value("document");
    +  SIMDJSON_TRY( visitor.visit_document_start(*this) );
    +
    +  //
    +  // Read first value
    +  //
    +  {
    +    auto value = advance();
    +
    +    // Make sure the outer object or array is closed before continuing; otherwise, there are ways we
    +    // could get into memory corruption. See https://github.com/simdjson/simdjson/issues/906
    +    if (!STREAMING) {
    +      switch (*value) {
    +        case '{': if (last_structural() != '}') { log_value("starting brace unmatched"); return TAPE_ERROR; }; break;
    +        case '[': if (last_structural() != ']') { log_value("starting bracket unmatched"); return TAPE_ERROR; }; break;
    +      }
    +    }
    +
    +    switch (*value) {
    +      case '{': if (*peek() == '}') { advance(); log_value("empty object"); SIMDJSON_TRY( visitor.visit_empty_object(*this) ); break; } goto object_begin;
    +      case '[': if (*peek() == ']') { advance(); log_value("empty array"); SIMDJSON_TRY( visitor.visit_empty_array(*this) ); break; } goto array_begin;
    +      default: SIMDJSON_TRY( visitor.visit_root_primitive(*this, value) ); break;
    +    }
    +  }
    +  goto document_end;
    +
    +//
    +// Object parser states
    +//
    +object_begin:
    +  log_start_value("object");
    +  depth++;
    +  if (depth >= dom_parser.max_depth()) { log_error("Exceeded max depth!"); return DEPTH_ERROR; }
    +  dom_parser.is_array[depth] = false;
    +  SIMDJSON_TRY( visitor.visit_object_start(*this) );
    +
    +  {
    +    auto key = advance();
    +    if (*key != '"') { log_error("Object does not start with a key"); return TAPE_ERROR; }
    +    SIMDJSON_TRY( visitor.increment_count(*this) );
    +    SIMDJSON_TRY( visitor.visit_key(*this, key) );
    +  }
    +
    +object_field:
    +  if (simdjson_unlikely( *advance() != ':' )) { log_error("Missing colon after key in object"); return TAPE_ERROR; }
    +  {
    +    auto value = advance();
    +    switch (*value) {
    +      case '{': if (*peek() == '}') { advance(); log_value("empty object"); SIMDJSON_TRY( visitor.visit_empty_object(*this) ); break; } goto object_begin;
    +      case '[': if (*peek() == ']') { advance(); log_value("empty array"); SIMDJSON_TRY( visitor.visit_empty_array(*this) ); break; } goto array_begin;
    +      default: SIMDJSON_TRY( visitor.visit_primitive(*this, value) ); break;
    +    }
    +  }
    +
    +object_continue:
    +  switch (*advance()) {
    +    case ',':
    +      SIMDJSON_TRY( visitor.increment_count(*this) );
    +      {
    +        auto key = advance();
    +        if (simdjson_unlikely( *key != '"' )) { log_error("Key string missing at beginning of field in object"); return TAPE_ERROR; }
    +        SIMDJSON_TRY( visitor.visit_key(*this, key) );
    +      }
    +      goto object_field;
    +    case '}': log_end_value("object"); SIMDJSON_TRY( visitor.visit_object_end(*this) ); goto scope_end;
    +    default: log_error("No comma between object fields"); return TAPE_ERROR;
    +  }
    +
    +scope_end:
    +  depth--;
    +  if (depth == 0) { goto document_end; }
    +  if (dom_parser.is_array[depth]) { goto array_continue; }
    +  goto object_continue;
    +
    +//
    +// Array parser states
    +//
    +array_begin:
    +  log_start_value("array");
    +  depth++;
    +  if (depth >= dom_parser.max_depth()) { log_error("Exceeded max depth!"); return DEPTH_ERROR; }
    +  dom_parser.is_array[depth] = true;
    +  SIMDJSON_TRY( visitor.visit_array_start(*this) );
    +  SIMDJSON_TRY( visitor.increment_count(*this) );
    +
    +array_value:
    +  {
    +    auto value = advance();
    +    switch (*value) {
    +      case '{': if (*peek() == '}') { advance(); log_value("empty object"); SIMDJSON_TRY( visitor.visit_empty_object(*this) ); break; } goto object_begin;
    +      case '[': if (*peek() == ']') { advance(); log_value("empty array"); SIMDJSON_TRY( visitor.visit_empty_array(*this) ); break; } goto array_begin;
    +      default: SIMDJSON_TRY( visitor.visit_primitive(*this, value) ); break;
    +    }
    +  }
    +
    +array_continue:
    +  switch (*advance()) {
    +    case ',': SIMDJSON_TRY( visitor.increment_count(*this) ); goto array_value;
    +    case ']': log_end_value("array"); SIMDJSON_TRY( visitor.visit_array_end(*this) ); goto scope_end;
    +    default: log_error("Missing comma between array values"); return TAPE_ERROR;
    +  }
    +
    +document_end:
    +  log_end_value("document");
    +  SIMDJSON_TRY( visitor.visit_document_end(*this) );
    +
    +  dom_parser.next_structural_index = uint32_t(next_structural - &dom_parser.structural_indexes[0]);
    +
    +  // If we didn't make it to the end, it's an error
    +  if ( !STREAMING && dom_parser.next_structural_index != dom_parser.n_structural_indexes ) {
    +    log_error("More than one JSON value at the root of the document, or extra characters at the end of the JSON!");
    +    return TAPE_ERROR;
    +  }
    +
    +  return SUCCESS;
    +
    +} // walk_document()
    +
    +simdjson_inline json_iterator::json_iterator(dom_parser_implementation &_dom_parser, size_t start_structural_index)
    +  : buf{_dom_parser.buf},
    +    next_structural{&_dom_parser.structural_indexes[start_structural_index]},
    +    dom_parser{_dom_parser} {
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::peek() const noexcept {
    +  return &buf[*(next_structural)];
    +}
    +simdjson_inline const uint8_t *json_iterator::advance() noexcept {
    +  return &buf[*(next_structural++)];
    +}
    +simdjson_inline size_t json_iterator::remaining_len() const noexcept {
    +  return dom_parser.len - *(next_structural-1);
    +}
    +
    +simdjson_inline bool json_iterator::at_eof() const noexcept {
    +  return next_structural == &dom_parser.structural_indexes[dom_parser.n_structural_indexes];
    +}
    +simdjson_inline bool json_iterator::at_beginning() const noexcept {
    +  return next_structural == dom_parser.structural_indexes.get();
    +}
    +simdjson_inline uint8_t json_iterator::last_structural() const noexcept {
    +  return buf[dom_parser.structural_indexes[dom_parser.n_structural_indexes - 1]];
    +}
    +
    +simdjson_inline void json_iterator::log_value(const char *type) const noexcept {
    +  logger::log_line(*this, "", type, "");
    +}
    +
    +simdjson_inline void json_iterator::log_start_value(const char *type) const noexcept {
    +  logger::log_line(*this, "+", type, "");
    +  if (logger::LOG_ENABLED) { logger::log_depth++; }
    +}
    +
    +simdjson_inline void json_iterator::log_end_value(const char *type) const noexcept {
    +  if (logger::LOG_ENABLED) { logger::log_depth--; }
    +  logger::log_line(*this, "-", type, "");
    +}
    +
    +simdjson_inline void json_iterator::log_error(const char *error) const noexcept {
    +  logger::log_line(*this, "", "ERROR", error);
    +}
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code json_iterator::visit_root_primitive(V &visitor, const uint8_t *value) noexcept {
    +  switch (*value) {
    +    case '"': return visitor.visit_root_string(*this, value);
    +    case 't': return visitor.visit_root_true_atom(*this, value);
    +    case 'f': return visitor.visit_root_false_atom(*this, value);
    +    case 'n': return visitor.visit_root_null_atom(*this, value);
    +    case '-':
    +    case '0': case '1': case '2': case '3': case '4':
    +    case '5': case '6': case '7': case '8': case '9':
    +      return visitor.visit_root_number(*this, value);
    +    default:
    +      log_error("Document starts with a non-value character");
    +      return TAPE_ERROR;
    +  }
    +}
    +template
    +simdjson_warn_unused simdjson_inline error_code json_iterator::visit_primitive(V &visitor, const uint8_t *value) noexcept {
    +  // Use the fact that most scalars are going to be either strings or numbers.
    +  if(*value == '"') {
    +    return visitor.visit_string(*this, value);
    +  } else if (((*value - '0')  < 10) || (*value == '-')) {
    +    return visitor.visit_number(*this, value);
    +  }
    +  // true, false, null are uncommon.
    +  switch (*value) {
    +    case 't': return visitor.visit_true_atom(*this, value);
    +    case 'f': return visitor.visit_false_atom(*this, value);
    +    case 'n': return visitor.visit_null_atom(*this, value);
    +    default:
    +      log_error("Non-value found when value was expected!");
    +      return TAPE_ERROR;
    +  }
    +}
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H
    +/* end file generic/stage2/json_iterator.h for haswell */
    +/* including generic/stage2/stringparsing.h for haswell: #include  */
    +/* begin file generic/stage2/stringparsing.h for haswell */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This file contains the common code every implementation uses
    +// It is intended to be included multiple times and compiled multiple times
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +/// @private
    +namespace stringparsing {
    +
    +// begin copypasta
    +// These chars yield themselves: " \ /
    +// b -> backspace, f -> formfeed, n -> newline, r -> cr, t -> horizontal tab
    +// u not handled in this table as it's complex
    +static const uint8_t escape_map[256] = {
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0, // 0x0.
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0x22, 0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0x2f,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0, // 0x4.
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0x5c, 0, 0,    0, // 0x5.
    +    0, 0, 0x08, 0, 0,    0, 0x0c, 0, 0, 0, 0, 0, 0,    0, 0x0a, 0, // 0x6.
    +    0, 0, 0x0d, 0, 0x09, 0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0, // 0x7.
    +
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +};
    +
    +// handle a unicode codepoint
    +// write appropriate values into dest
    +// src will advance 6 bytes or 12 bytes
    +// dest will advance a variable amount (return via pointer)
    +// return true if the unicode codepoint was valid
    +// We work in little-endian then swap at write time
    +simdjson_warn_unused
    +simdjson_inline bool handle_unicode_codepoint(const uint8_t **src_ptr,
    +                                            uint8_t **dst_ptr, bool allow_replacement) {
    +  // Use the default Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD)
    +  constexpr uint32_t substitution_code_point = 0xfffd;
    +  // jsoncharutils::hex_to_u32_nocheck fills high 16 bits of the return value with 1s if the
    +  // conversion isn't valid; we defer the check for this to inside the
    +  // multilingual plane check
    +  uint32_t code_point = jsoncharutils::hex_to_u32_nocheck(*src_ptr + 2);
    +  *src_ptr += 6;
    +
    +  // If we found a high surrogate, we must
    +  // check for low surrogate for characters
    +  // outside the Basic
    +  // Multilingual Plane.
    +  if (code_point >= 0xd800 && code_point < 0xdc00) {
    +    const uint8_t *src_data = *src_ptr;
    +    /* Compiler optimizations convert this to a single 16-bit load and compare on most platforms */
    +    if (((src_data[0] << 8) | src_data[1]) != ((static_cast ('\\') << 8) | static_cast ('u'))) {
    +      if(!allow_replacement) { return false; }
    +      code_point = substitution_code_point;
    +    } else {
    +      uint32_t code_point_2 = jsoncharutils::hex_to_u32_nocheck(src_data + 2);
    +
    +      // We have already checked that the high surrogate is valid and
    +      // (code_point - 0xd800) < 1024.
    +      //
    +      // Check that code_point_2 is in the range 0xdc00..0xdfff
    +      // and that code_point_2 was parsed from valid hex.
    +      uint32_t low_bit = code_point_2 - 0xdc00;
    +      if (low_bit >> 10) {
    +        if(!allow_replacement) { return false; }
    +        code_point = substitution_code_point;
    +      } else {
    +        code_point =  (((code_point - 0xd800) << 10) | low_bit) + 0x10000;
    +        *src_ptr += 6;
    +      }
    +
    +    }
    +  } else if (code_point >= 0xdc00 && code_point <= 0xdfff) {
    +      // If we encounter a low surrogate (not preceded by a high surrogate)
    +      // then we have an error.
    +      if(!allow_replacement) { return false; }
    +      code_point = substitution_code_point;
    +  }
    +  size_t offset = jsoncharutils::codepoint_to_utf8(code_point, *dst_ptr);
    +  *dst_ptr += offset;
    +  return offset > 0;
    +}
    +
    +
    +// handle a unicode codepoint using the wobbly convention
    +// https://simonsapin.github.io/wtf-8/
    +// write appropriate values into dest
    +// src will advance 6 bytes or 12 bytes
    +// dest will advance a variable amount (return via pointer)
    +// return true if the unicode codepoint was valid
    +// We work in little-endian then swap at write time
    +simdjson_warn_unused
    +simdjson_inline bool handle_unicode_codepoint_wobbly(const uint8_t **src_ptr,
    +                                            uint8_t **dst_ptr) {
    +  // It is not ideal that this function is nearly identical to handle_unicode_codepoint.
    +  //
    +  // jsoncharutils::hex_to_u32_nocheck fills high 16 bits of the return value with 1s if the
    +  // conversion isn't valid; we defer the check for this to inside the
    +  // multilingual plane check
    +  uint32_t code_point = jsoncharutils::hex_to_u32_nocheck(*src_ptr + 2);
    +  *src_ptr += 6;
    +  // If we found a high surrogate, we must
    +  // check for low surrogate for characters
    +  // outside the Basic
    +  // Multilingual Plane.
    +  if (code_point >= 0xd800 && code_point < 0xdc00) {
    +    const uint8_t *src_data = *src_ptr;
    +    /* Compiler optimizations convert this to a single 16-bit load and compare on most platforms */
    +    if (((src_data[0] << 8) | src_data[1]) == ((static_cast ('\\') << 8) | static_cast ('u'))) {
    +      uint32_t code_point_2 = jsoncharutils::hex_to_u32_nocheck(src_data + 2);
    +      uint32_t low_bit = code_point_2 - 0xdc00;
    +      if ((low_bit >> 10) ==  0) {
    +        code_point =
    +          (((code_point - 0xd800) << 10) | low_bit) + 0x10000;
    +        *src_ptr += 6;
    +      }
    +    }
    +  }
    +
    +  size_t offset = jsoncharutils::codepoint_to_utf8(code_point, *dst_ptr);
    +  *dst_ptr += offset;
    +  return offset > 0;
    +}
    +
    +
    +/**
    + * Unescape a valid UTF-8 string from src to dst, stopping at a final unescaped quote. There
    + * must be an unescaped quote terminating the string. It returns the final output
    + * position as pointer. In case of error (e.g., the string has bad escaped codes),
    + * then null_nullptrptr is returned. It is assumed that the output buffer is large
    + * enough. E.g., if src points at 'joe"', then dst needs to have four free bytes +
    + * SIMDJSON_PADDING bytes.
    + */
    +simdjson_warn_unused simdjson_inline uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) {
    +  while (1) {
    +    // Copy the next n bytes, and find the backslash and quote in them.
    +    auto bs_quote = backslash_and_quote::copy_and_find(src, dst);
    +    // If the next thing is the end quote, copy and return
    +    if (bs_quote.has_quote_first()) {
    +      // we encountered quotes first. Move dst to point to quotes and exit
    +      return dst + bs_quote.quote_index();
    +    }
    +    if (bs_quote.has_backslash()) {
    +      /* find out where the backspace is */
    +      auto bs_dist = bs_quote.backslash_index();
    +      uint8_t escape_char = src[bs_dist + 1];
    +      /* we encountered backslash first. Handle backslash */
    +      if (escape_char == 'u') {
    +        /* move src/dst up to the start; they will be further adjusted
    +           within the unicode codepoint handling code. */
    +        src += bs_dist;
    +        dst += bs_dist;
    +        if (!handle_unicode_codepoint(&src, &dst, allow_replacement)) {
    +          return nullptr;
    +        }
    +      } else {
    +        /* simple 1:1 conversion. Will eat bs_dist+2 characters in input and
    +         * write bs_dist+1 characters to output
    +         * note this may reach beyond the part of the buffer we've actually
    +         * seen. I think this is ok */
    +        uint8_t escape_result = escape_map[escape_char];
    +        if (escape_result == 0u) {
    +          return nullptr; /* bogus escape value is an error */
    +        }
    +        dst[bs_dist] = escape_result;
    +        src += bs_dist + 2;
    +        dst += bs_dist + 1;
    +      }
    +    } else {
    +      /* they are the same. Since they can't co-occur, it means we
    +       * encountered neither. */
    +      src += backslash_and_quote::BYTES_PROCESSED;
    +      dst += backslash_and_quote::BYTES_PROCESSED;
    +    }
    +  }
    +}
    +
    +simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) {
    +  // It is not ideal that this function is nearly identical to parse_string.
    +  while (1) {
    +    // Copy the next n bytes, and find the backslash and quote in them.
    +    auto bs_quote = backslash_and_quote::copy_and_find(src, dst);
    +    // If the next thing is the end quote, copy and return
    +    if (bs_quote.has_quote_first()) {
    +      // we encountered quotes first. Move dst to point to quotes and exit
    +      return dst + bs_quote.quote_index();
    +    }
    +    if (bs_quote.has_backslash()) {
    +      /* find out where the backspace is */
    +      auto bs_dist = bs_quote.backslash_index();
    +      uint8_t escape_char = src[bs_dist + 1];
    +      /* we encountered backslash first. Handle backslash */
    +      if (escape_char == 'u') {
    +        /* move src/dst up to the start; they will be further adjusted
    +           within the unicode codepoint handling code. */
    +        src += bs_dist;
    +        dst += bs_dist;
    +        if (!handle_unicode_codepoint_wobbly(&src, &dst)) {
    +          return nullptr;
    +        }
    +      } else {
    +        /* simple 1:1 conversion. Will eat bs_dist+2 characters in input and
    +         * write bs_dist+1 characters to output
    +         * note this may reach beyond the part of the buffer we've actually
    +         * seen. I think this is ok */
    +        uint8_t escape_result = escape_map[escape_char];
    +        if (escape_result == 0u) {
    +          return nullptr; /* bogus escape value is an error */
    +        }
    +        dst[bs_dist] = escape_result;
    +        src += bs_dist + 2;
    +        dst += bs_dist + 1;
    +      }
    +    } else {
    +      /* they are the same. Since they can't co-occur, it means we
    +       * encountered neither. */
    +      src += backslash_and_quote::BYTES_PROCESSED;
    +      dst += backslash_and_quote::BYTES_PROCESSED;
    +    }
    +  }
    +}
    +
    +} // namespace stringparsing
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H
    +/* end file generic/stage2/stringparsing.h for haswell */
    +/* including generic/stage2/structural_iterator.h for haswell: #include  */
    +/* begin file generic/stage2/structural_iterator.h for haswell */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRUCTURAL_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_STRUCTURAL_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +namespace stage2 {
    +
    +class structural_iterator {
    +public:
    +  const uint8_t* const buf;
    +  uint32_t *next_structural;
    +  dom_parser_implementation &dom_parser;
    +
    +  // Start a structural
    +  simdjson_inline structural_iterator(dom_parser_implementation &_dom_parser, size_t start_structural_index)
    +    : buf{_dom_parser.buf},
    +      next_structural{&_dom_parser.structural_indexes[start_structural_index]},
    +      dom_parser{_dom_parser} {
    +  }
    +  // Get the buffer position of the current structural character
    +  simdjson_inline const uint8_t* current() {
    +    return &buf[*(next_structural-1)];
    +  }
    +  // Get the current structural character
    +  simdjson_inline char current_char() {
    +    return buf[*(next_structural-1)];
    +  }
    +  // Get the next structural character without advancing
    +  simdjson_inline char peek_next_char() {
    +    return buf[*next_structural];
    +  }
    +  simdjson_inline const uint8_t* peek() {
    +    return &buf[*next_structural];
    +  }
    +  simdjson_inline const uint8_t* advance() {
    +    return &buf[*(next_structural++)];
    +  }
    +  simdjson_inline char advance_char() {
    +    return buf[*(next_structural++)];
    +  }
    +  simdjson_inline size_t remaining_len() {
    +    return dom_parser.len - *(next_structural-1);
    +  }
    +
    +  simdjson_inline bool at_end() {
    +    return next_structural == &dom_parser.structural_indexes[dom_parser.n_structural_indexes];
    +  }
    +  simdjson_inline bool at_beginning() {
    +    return next_structural == dom_parser.structural_indexes.get();
    +  }
    +};
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_STRUCTURAL_ITERATOR_H
    +/* end file generic/stage2/structural_iterator.h for haswell */
    +/* including generic/stage2/tape_builder.h for haswell: #include  */
    +/* begin file generic/stage2/tape_builder.h for haswell */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +namespace stage2 {
    +
    +struct tape_builder {
    +  template
    +  simdjson_warn_unused static simdjson_inline error_code parse_document(
    +    dom_parser_implementation &dom_parser,
    +    dom::document &doc) noexcept;
    +
    +  /** Called when a non-empty document starts. */
    +  simdjson_warn_unused simdjson_inline error_code visit_document_start(json_iterator &iter) noexcept;
    +  /** Called when a non-empty document ends without error. */
    +  simdjson_warn_unused simdjson_inline error_code visit_document_end(json_iterator &iter) noexcept;
    +
    +  /** Called when a non-empty array starts. */
    +  simdjson_warn_unused simdjson_inline error_code visit_array_start(json_iterator &iter) noexcept;
    +  /** Called when a non-empty array ends. */
    +  simdjson_warn_unused simdjson_inline error_code visit_array_end(json_iterator &iter) noexcept;
    +  /** Called when an empty array is found. */
    +  simdjson_warn_unused simdjson_inline error_code visit_empty_array(json_iterator &iter) noexcept;
    +
    +  /** Called when a non-empty object starts. */
    +  simdjson_warn_unused simdjson_inline error_code visit_object_start(json_iterator &iter) noexcept;
    +  /**
    +   * Called when a key in a field is encountered.
    +   *
    +   * primitive, visit_object_start, visit_empty_object, visit_array_start, or visit_empty_array
    +   * will be called after this with the field value.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code visit_key(json_iterator &iter, const uint8_t *key) noexcept;
    +  /** Called when a non-empty object ends. */
    +  simdjson_warn_unused simdjson_inline error_code visit_object_end(json_iterator &iter) noexcept;
    +  /** Called when an empty object is found. */
    +  simdjson_warn_unused simdjson_inline error_code visit_empty_object(json_iterator &iter) noexcept;
    +
    +  /**
    +   * Called when a string, number, boolean or null is found.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code visit_primitive(json_iterator &iter, const uint8_t *value) noexcept;
    +  /**
    +   * Called when a string, number, boolean or null is found at the top level of a document (i.e.
    +   * when there is no array or object and the entire document is a single string, number, boolean or
    +   * null.
    +   *
    +   * This is separate from primitive() because simdjson's normal primitive parsing routines assume
    +   * there is at least one more token after the value, which is only true in an array or object.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code visit_root_primitive(json_iterator &iter, const uint8_t *value) noexcept;
    +
    +  simdjson_warn_unused simdjson_inline error_code visit_string(json_iterator &iter, const uint8_t *value, bool key = false) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_number(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_true_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_false_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_null_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +
    +  simdjson_warn_unused simdjson_inline error_code visit_root_string(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_number(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_true_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_false_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_null_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +
    +  /** Called each time a new field or element in an array or object is found. */
    +  simdjson_warn_unused simdjson_inline error_code increment_count(json_iterator &iter) noexcept;
    +
    +  /** Next location to write to tape */
    +  tape_writer tape;
    +private:
    +  /** Next write location in the string buf for stage 2 parsing */
    +  uint8_t *current_string_buf_loc;
    +
    +  simdjson_inline tape_builder(dom::document &doc) noexcept;
    +
    +  simdjson_inline uint32_t next_tape_index(json_iterator &iter) const noexcept;
    +  simdjson_inline void start_container(json_iterator &iter) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code end_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code empty_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept;
    +  simdjson_inline uint8_t *on_start_string(json_iterator &iter) noexcept;
    +  simdjson_inline void on_end_string(uint8_t *dst) noexcept;
    +}; // struct tape_builder
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code tape_builder::parse_document(
    +    dom_parser_implementation &dom_parser,
    +    dom::document &doc) noexcept {
    +  dom_parser.doc = &doc;
    +  json_iterator iter(dom_parser, STREAMING ? dom_parser.next_structural_index : 0);
    +  tape_builder builder(doc);
    +  return iter.walk_document(builder);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_primitive(json_iterator &iter, const uint8_t *value) noexcept {
    +  return iter.visit_root_primitive(*this, value);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_primitive(json_iterator &iter, const uint8_t *value) noexcept {
    +  return iter.visit_primitive(*this, value);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_empty_object(json_iterator &iter) noexcept {
    +  return empty_container(iter, internal::tape_type::START_OBJECT, internal::tape_type::END_OBJECT);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_empty_array(json_iterator &iter) noexcept {
    +  return empty_container(iter, internal::tape_type::START_ARRAY, internal::tape_type::END_ARRAY);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_document_start(json_iterator &iter) noexcept {
    +  start_container(iter);
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_object_start(json_iterator &iter) noexcept {
    +  start_container(iter);
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_array_start(json_iterator &iter) noexcept {
    +  start_container(iter);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_object_end(json_iterator &iter) noexcept {
    +  return end_container(iter, internal::tape_type::START_OBJECT, internal::tape_type::END_OBJECT);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_array_end(json_iterator &iter) noexcept {
    +  return end_container(iter, internal::tape_type::START_ARRAY, internal::tape_type::END_ARRAY);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_document_end(json_iterator &iter) noexcept {
    +  constexpr uint32_t start_tape_index = 0;
    +  tape.append(start_tape_index, internal::tape_type::ROOT);
    +  tape_writer::write(iter.dom_parser.doc->tape[start_tape_index], next_tape_index(iter), internal::tape_type::ROOT);
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_key(json_iterator &iter, const uint8_t *key) noexcept {
    +  return visit_string(iter, key, true);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::increment_count(json_iterator &iter) noexcept {
    +  iter.dom_parser.open_containers[iter.depth].count++; // we have a key value pair in the object at parser.dom_parser.depth - 1
    +  return SUCCESS;
    +}
    +
    +simdjson_inline tape_builder::tape_builder(dom::document &doc) noexcept : tape{doc.tape.get()}, current_string_buf_loc{doc.string_buf.get()} {}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_string(json_iterator &iter, const uint8_t *value, bool key) noexcept {
    +  iter.log_value(key ? "key" : "string");
    +  uint8_t *dst = on_start_string(iter);
    +  dst = stringparsing::parse_string(value+1, dst, false); // We do not allow replacement when the escape characters are invalid.
    +  if (dst == nullptr) {
    +    iter.log_error("Invalid escape in string");
    +    return STRING_ERROR;
    +  }
    +  on_end_string(dst);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_string(json_iterator &iter, const uint8_t *value) noexcept {
    +  return visit_string(iter, value);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_number(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("number");
    +  return numberparsing::parse_number(value, tape);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_number(json_iterator &iter, const uint8_t *value) noexcept {
    +  //
    +  // We need to make a copy to make sure that the string is space terminated.
    +  // This is not about padding the input, which should already padded up
    +  // to len + SIMDJSON_PADDING. However, we have no control at this stage
    +  // on how the padding was done. What if the input string was padded with nulls?
    +  // It is quite common for an input string to have an extra null character (C string).
    +  // We do not want to allow 9\0 (where \0 is the null character) inside a JSON
    +  // document, but the string "9\0" by itself is fine. So we make a copy and
    +  // pad the input with spaces when we know that there is just one input element.
    +  // This copy is relatively expensive, but it will almost never be called in
    +  // practice unless you are in the strange scenario where you have many JSON
    +  // documents made of single atoms.
    +  //
    +  std::unique_ptrcopy(new (std::nothrow) uint8_t[iter.remaining_len() + SIMDJSON_PADDING]);
    +  if (copy.get() == nullptr) { return MEMALLOC; }
    +  std::memcpy(copy.get(), value, iter.remaining_len());
    +  std::memset(copy.get() + iter.remaining_len(), ' ', SIMDJSON_PADDING);
    +  error_code error = visit_number(iter, copy.get());
    +  return error;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_true_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("true");
    +  if (!atomparsing::is_valid_true_atom(value)) { return T_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::TRUE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_true_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("true");
    +  if (!atomparsing::is_valid_true_atom(value, iter.remaining_len())) { return T_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::TRUE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_false_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("false");
    +  if (!atomparsing::is_valid_false_atom(value)) { return F_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::FALSE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_false_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("false");
    +  if (!atomparsing::is_valid_false_atom(value, iter.remaining_len())) { return F_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::FALSE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_null_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("null");
    +  if (!atomparsing::is_valid_null_atom(value)) { return N_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::NULL_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_null_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("null");
    +  if (!atomparsing::is_valid_null_atom(value, iter.remaining_len())) { return N_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::NULL_VALUE);
    +  return SUCCESS;
    +}
    +
    +// private:
    +
    +simdjson_inline uint32_t tape_builder::next_tape_index(json_iterator &iter) const noexcept {
    +  return uint32_t(tape.next_tape_loc - iter.dom_parser.doc->tape.get());
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::empty_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept {
    +  auto start_index = next_tape_index(iter);
    +  tape.append(start_index+2, start);
    +  tape.append(start_index, end);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline void tape_builder::start_container(json_iterator &iter) noexcept {
    +  iter.dom_parser.open_containers[iter.depth].tape_index = next_tape_index(iter);
    +  iter.dom_parser.open_containers[iter.depth].count = 0;
    +  tape.skip(); // We don't actually *write* the start element until the end.
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::end_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept {
    +  // Write the ending tape element, pointing at the start location
    +  const uint32_t start_tape_index = iter.dom_parser.open_containers[iter.depth].tape_index;
    +  tape.append(start_tape_index, end);
    +  // Write the start tape element, pointing at the end location (and including count)
    +  // count can overflow if it exceeds 24 bits... so we saturate
    +  // the convention being that a cnt of 0xffffff or more is undetermined in value (>=  0xffffff).
    +  const uint32_t count = iter.dom_parser.open_containers[iter.depth].count;
    +  const uint32_t cntsat = count > 0xFFFFFF ? 0xFFFFFF : count;
    +  tape_writer::write(iter.dom_parser.doc->tape[start_tape_index], next_tape_index(iter) | (uint64_t(cntsat) << 32), start);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline uint8_t *tape_builder::on_start_string(json_iterator &iter) noexcept {
    +  // we advance the point, accounting for the fact that we have a NULL termination
    +  tape.append(current_string_buf_loc - iter.dom_parser.doc->string_buf.get(), internal::tape_type::STRING);
    +  return current_string_buf_loc + sizeof(uint32_t);
    +}
    +
    +simdjson_inline void tape_builder::on_end_string(uint8_t *dst) noexcept {
    +  uint32_t str_length = uint32_t(dst - (current_string_buf_loc + sizeof(uint32_t)));
    +  // TODO check for overflow in case someone has a crazy string (>=4GB?)
    +  // But only add the overflow check when the document itself exceeds 4GB
    +  // Currently unneeded because we refuse to parse docs larger or equal to 4GB.
    +  memcpy(current_string_buf_loc, &str_length, sizeof(uint32_t));
    +  // NULL termination is still handy if you expect all your strings to
    +  // be NULL terminated? It comes at a small cost
    +  *dst = 0;
    +  current_string_buf_loc = dst + 1;
    +}
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H
    +/* end file generic/stage2/tape_builder.h for haswell */
    +/* end file generic/stage2/amalgamated.h for haswell */
    +
    +//
    +// Stage 1
    +//
    +
    +namespace simdjson {
    +namespace haswell {
    +
    +simdjson_warn_unused error_code implementation::create_dom_parser_implementation(
    +  size_t capacity,
    +  size_t max_depth,
    +  std::unique_ptr& dst
    +) const noexcept {
    +  dst.reset( new (std::nothrow) dom_parser_implementation() );
    +  if (!dst) { return MEMALLOC; }
    +  if (auto err = dst->set_capacity(capacity))
    +    return err;
    +  if (auto err = dst->set_max_depth(max_depth))
    +    return err;
    +  return SUCCESS;
    +}
    +
    +namespace {
    +
    +using namespace simd;
    +
    +// This identifies structural characters (comma, colon, braces, brackets),
    +// and ASCII white-space ('\r','\n','\t',' ').
    +simdjson_inline json_character_block json_character_block::classify(const simd::simd8x64& in) {
    +  // These lookups rely on the fact that anything < 127 will match the lower 4 bits, which is why
    +  // we can't use the generic lookup_16.
    +  const auto whitespace_table = simd8::repeat_16(' ', 100, 100, 100, 17, 100, 113, 2, 100, '\t', '\n', 112, 100, '\r', 100, 100);
    +
    +  // The 6 operators (:,[]{}) have these values:
    +  //
    +  // , 2C
    +  // : 3A
    +  // [ 5B
    +  // { 7B
    +  // ] 5D
    +  // } 7D
    +  //
    +  // If you use | 0x20 to turn [ and ] into { and }, the lower 4 bits of each character is unique.
    +  // We exploit this, using a simd 4-bit lookup to tell us which character match against, and then
    +  // match it (against | 0x20).
    +  //
    +  // To prevent recognizing other characters, everything else gets compared with 0, which cannot
    +  // match due to the | 0x20.
    +  //
    +  // NOTE: Due to the | 0x20, this ALSO treats  and  (control characters 0C and 1A) like ,
    +  // and :. This gets caught in stage 2, which checks the actual character to ensure the right
    +  // operators are in the right places.
    +  const auto op_table = simd8::repeat_16(
    +    0, 0, 0, 0,
    +    0, 0, 0, 0,
    +    0, 0, ':', '{', // : = 3A, [ = 5B, { = 7B
    +    ',', '}', 0, 0  // , = 2C, ] = 5D, } = 7D
    +  );
    +
    +  // We compute whitespace and op separately. If later code only uses one or the
    +  // other, given the fact that all functions are aggressively inlined, we can
    +  // hope that useless computations will be omitted. This is namely case when
    +  // minifying (we only need whitespace).
    +
    +  const uint64_t whitespace = in.eq({
    +    _mm256_shuffle_epi8(whitespace_table, in.chunks[0]),
    +    _mm256_shuffle_epi8(whitespace_table, in.chunks[1])
    +  });
    +  // Turn [ and ] into { and }
    +  const simd8x64 curlified{
    +    in.chunks[0] | 0x20,
    +    in.chunks[1] | 0x20
    +  };
    +  const uint64_t op = curlified.eq({
    +    _mm256_shuffle_epi8(op_table, in.chunks[0]),
    +    _mm256_shuffle_epi8(op_table, in.chunks[1])
    +  });
    +
    +  return { whitespace, op };
    +}
    +
    +simdjson_inline bool is_ascii(const simd8x64& input) {
    +  return input.reduce_or().is_ascii();
    +}
    +
    +simdjson_unused simdjson_inline simd8 must_be_continuation(const simd8 prev1, const simd8 prev2, const simd8 prev3) {
    +  simd8 is_second_byte = prev1.saturating_sub(0xc0u-1); // Only 11______ will be > 0
    +  simd8 is_third_byte  = prev2.saturating_sub(0xe0u-1); // Only 111_____ will be > 0
    +  simd8 is_fourth_byte = prev3.saturating_sub(0xf0u-1); // Only 1111____ will be > 0
    +  // Caller requires a bool (all 1's). All values resulting from the subtraction will be <= 64, so signed comparison is fine.
    +  return simd8(is_second_byte | is_third_byte | is_fourth_byte) > int8_t(0);
    +}
    +
    +simdjson_inline simd8 must_be_2_3_continuation(const simd8 prev2, const simd8 prev3) {
    +  simd8 is_third_byte  = prev2.saturating_sub(0xe0u-1); // Only 111_____ will be > 0
    +  simd8 is_fourth_byte = prev3.saturating_sub(0xf0u-1); // Only 1111____ will be > 0
    +  // Caller requires a bool (all 1's). All values resulting from the subtraction will be <= 64, so signed comparison is fine.
    +  return simd8(is_third_byte | is_fourth_byte) > int8_t(0);
    +}
    +
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +//
    +// Stage 2
    +//
    +
    +//
    +// Implementation-specific overrides
    +//
    +namespace simdjson {
    +namespace haswell {
    +
    +simdjson_warn_unused error_code implementation::minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept {
    +  return haswell::stage1::json_minifier::minify<128>(buf, len, dst, dst_len);
    +}
    +
    +simdjson_warn_unused error_code dom_parser_implementation::stage1(const uint8_t *_buf, size_t _len, stage1_mode streaming) noexcept {
    +  this->buf = _buf;
    +  this->len = _len;
    +  return haswell::stage1::json_structural_indexer::index<128>(_buf, _len, *this, streaming);
    +}
    +
    +simdjson_warn_unused bool implementation::validate_utf8(const char *buf, size_t len) const noexcept {
    +  return haswell::stage1::generic_validate_utf8(buf,len);
    +}
    +
    +simdjson_warn_unused error_code dom_parser_implementation::stage2(dom::document &_doc) noexcept {
    +  return stage2::tape_builder::parse_document(*this, _doc);
    +}
    +
    +simdjson_warn_unused error_code dom_parser_implementation::stage2_next(dom::document &_doc) noexcept {
    +  return stage2::tape_builder::parse_document(*this, _doc);
    +}
    +
    +simdjson_warn_unused uint8_t *dom_parser_implementation::parse_string(const uint8_t *src, uint8_t *dst, bool replacement_char) const noexcept {
    +  return haswell::stringparsing::parse_string(src, dst, replacement_char);
    +}
    +
    +simdjson_warn_unused uint8_t *dom_parser_implementation::parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept {
    +  return haswell::stringparsing::parse_wobbly_string(src, dst);
    +}
    +
    +simdjson_warn_unused error_code dom_parser_implementation::parse(const uint8_t *_buf, size_t _len, dom::document &_doc) noexcept {
    +  auto error = stage1(_buf, _len, stage1_mode::regular);
    +  if (error) { return error; }
    +  return stage2(_doc);
    +}
    +
    +} // namespace haswell
    +} // namespace simdjson
    +
    +/* including simdjson/haswell/end.h: #include  */
    +/* begin file simdjson/haswell/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_HASWELL
    +SIMDJSON_UNTARGET_REGION
    +#endif
    +
    +/* undefining SIMDJSON_IMPLEMENTATION from "haswell" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/haswell/end.h */
    +
    +#endif // SIMDJSON_SRC_HASWELL_CPP
    +/* end file haswell.cpp */
    +#endif
    +#if SIMDJSON_IMPLEMENTATION_ICELAKE
    +/* including icelake.cpp: #include  */
    +/* begin file icelake.cpp */
    +#ifndef SIMDJSON_SRC_ICELAKE_CPP
    +#define SIMDJSON_SRC_ICELAKE_CPP
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +/* including simdjson/icelake.h: #include  */
    +/* begin file simdjson/icelake.h */
    +#ifndef SIMDJSON_ICELAKE_H
    +#define SIMDJSON_ICELAKE_H
    +
    +/* including simdjson/icelake/begin.h: #include "simdjson/icelake/begin.h" */
    +/* begin file simdjson/icelake/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "icelake" */
    +#define SIMDJSON_IMPLEMENTATION icelake
    +/* including simdjson/icelake/base.h: #include "simdjson/icelake/base.h" */
    +/* begin file simdjson/icelake/base.h */
    +#ifndef SIMDJSON_ICELAKE_BASE_H
    +#define SIMDJSON_ICELAKE_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_ICELAKE
    +namespace simdjson {
    +/**
    + * Implementation for Icelake (Intel AVX512).
    + */
    +namespace icelake {
    +
    +class implementation;
    +
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ICELAKE_BASE_H
    +/* end file simdjson/icelake/base.h */
    +/* including simdjson/icelake/intrinsics.h: #include "simdjson/icelake/intrinsics.h" */
    +/* begin file simdjson/icelake/intrinsics.h */
    +#ifndef SIMDJSON_ICELAKE_INTRINSICS_H
    +#define SIMDJSON_ICELAKE_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if SIMDJSON_VISUAL_STUDIO
    +// under clang within visual studio, this will include 
    +#include   // visual studio or clang
    +#else
    +#include  // elsewhere
    +#endif // SIMDJSON_VISUAL_STUDIO
    +
    +#if SIMDJSON_CLANG_VISUAL_STUDIO
    +/**
    + * You are not supposed, normally, to include these
    + * headers directly. Instead you should either include intrin.h
    + * or x86intrin.h. However, when compiling with clang
    + * under Windows (i.e., when _MSC_VER is set), these headers
    + * only get included *if* the corresponding features are detected
    + * from macros:
    + * e.g., if __AVX2__ is set... in turn,  we normally set these
    + * macros by compiling against the corresponding architecture
    + * (e.g., arch:AVX2, -mavx2, etc.) which compiles the whole
    + * software with these advanced instructions. In simdjson, we
    + * want to compile the whole program for a generic target,
    + * and only target our specific kernels. As a workaround,
    + * we directly include the needed headers. These headers would
    + * normally guard against such usage, but we carefully included
    + *   (or ) before, so the headers
    + * are fooled.
    + */
    +#include    // for _blsr_u64
    +#include  // for  __lzcnt64
    +#include    // for most things (AVX2, AVX512, _popcnt64)
    +#include 
    +#include 
    +#include 
    +#include 
    +#include    // for  _mm_clmulepi64_si128
    +// Important: we need the AVX-512 headers:
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +// unfortunately, we may not get _blsr_u64, but, thankfully, clang
    +// has it as a macro.
    +#ifndef _blsr_u64
    +// we roll our own
    +#define _blsr_u64(n) ((n - 1) & n)
    +#endif //  _blsr_u64
    +#endif // SIMDJSON_CLANG_VISUAL_STUDIO
    +
    +static_assert(sizeof(__m512i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for icelake");
    +
    +#endif // SIMDJSON_ICELAKE_INTRINSICS_H
    +/* end file simdjson/icelake/intrinsics.h */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_ICELAKE
    +SIMDJSON_TARGET_REGION("avx512f,avx512dq,avx512cd,avx512bw,avx512vbmi,avx512vbmi2,avx512vl,avx2,bmi,pclmul,lzcnt,popcnt")
    +#endif
    +
    +/* including simdjson/icelake/bitmanipulation.h: #include "simdjson/icelake/bitmanipulation.h" */
    +/* begin file simdjson/icelake/bitmanipulation.h */
    +#ifndef SIMDJSON_ICELAKE_BITMANIPULATION_H
    +#define SIMDJSON_ICELAKE_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return (int)_tzcnt_u64(input_num);
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  ////////
    +  // You might expect the next line to be equivalent to
    +  // return (int)_tzcnt_u64(input_num);
    +  // but the generated code differs and might be less efficient?
    +  ////////
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return _blsr_u64(input_num);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +  return int(_lzcnt_u64(input_num));
    +}
    +
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +simdjson_inline unsigned __int64 count_ones(uint64_t input_num) {
    +  // note: we do not support legacy 32-bit Windows
    +  return __popcnt64(input_num);// Visual Studio wants two underscores
    +}
    +#else
    +simdjson_inline long long int count_ones(uint64_t input_num) {
    +  return _popcnt64(input_num);
    +}
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2,
    +                                uint64_t *result) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return _addcarry_u64(0, value1, value2,
    +                       reinterpret_cast(result));
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ICELAKE_BITMANIPULATION_H
    +/* end file simdjson/icelake/bitmanipulation.h */
    +/* including simdjson/icelake/bitmask.h: #include "simdjson/icelake/bitmask.h" */
    +/* begin file simdjson/icelake/bitmask.h */
    +#ifndef SIMDJSON_ICELAKE_BITMASK_H
    +#define SIMDJSON_ICELAKE_BITMASK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +
    +//
    +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered.
    +//
    +// For example, prefix_xor(00100100) == 00011100
    +//
    +simdjson_inline uint64_t prefix_xor(const uint64_t bitmask) {
    +  // There should be no such thing with a processor supporting avx2
    +  // but not clmul.
    +  __m128i all_ones = _mm_set1_epi8('\xFF');
    +  __m128i result = _mm_clmulepi64_si128(_mm_set_epi64x(0ULL, bitmask), all_ones, 0);
    +  return _mm_cvtsi128_si64(result);
    +}
    +
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ICELAKE_BITMASK_H
    +/* end file simdjson/icelake/bitmask.h */
    +/* including simdjson/icelake/simd.h: #include "simdjson/icelake/simd.h" */
    +/* begin file simdjson/icelake/simd.h */
    +#ifndef SIMDJSON_ICELAKE_SIMD_H
    +#define SIMDJSON_ICELAKE_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if defined(__GNUC__) && !defined(__clang__)
    +#if __GNUC__ == 8
    +#define SIMDJSON_GCC8 1
    +#endif //  __GNUC__ == 8
    +#endif // defined(__GNUC__) && !defined(__clang__)
    +
    +#if SIMDJSON_GCC8
    +/**
    + * GCC 8 fails to provide _mm512_set_epi8. We roll our own.
    + */
    +inline __m512i _mm512_set_epi8(uint8_t a0, uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4, uint8_t a5, uint8_t a6, uint8_t a7, uint8_t a8, uint8_t a9, uint8_t a10, uint8_t a11, uint8_t a12, uint8_t a13, uint8_t a14, uint8_t a15, uint8_t a16, uint8_t a17, uint8_t a18, uint8_t a19, uint8_t a20, uint8_t a21, uint8_t a22, uint8_t a23, uint8_t a24, uint8_t a25, uint8_t a26, uint8_t a27, uint8_t a28, uint8_t a29, uint8_t a30, uint8_t a31, uint8_t a32, uint8_t a33, uint8_t a34, uint8_t a35, uint8_t a36, uint8_t a37, uint8_t a38, uint8_t a39, uint8_t a40, uint8_t a41, uint8_t a42, uint8_t a43, uint8_t a44, uint8_t a45, uint8_t a46, uint8_t a47, uint8_t a48, uint8_t a49, uint8_t a50, uint8_t a51, uint8_t a52, uint8_t a53, uint8_t a54, uint8_t a55, uint8_t a56, uint8_t a57, uint8_t a58, uint8_t a59, uint8_t a60, uint8_t a61, uint8_t a62, uint8_t a63) {
    +  return _mm512_set_epi64(uint64_t(a7) + (uint64_t(a6) << 8) + (uint64_t(a5) << 16) + (uint64_t(a4) << 24) + (uint64_t(a3) << 32) + (uint64_t(a2) << 40) + (uint64_t(a1) << 48) + (uint64_t(a0) << 56),
    +                          uint64_t(a15) + (uint64_t(a14) << 8) + (uint64_t(a13) << 16) + (uint64_t(a12) << 24) + (uint64_t(a11) << 32) + (uint64_t(a10) << 40) + (uint64_t(a9) << 48) + (uint64_t(a8) << 56),
    +                          uint64_t(a23) + (uint64_t(a22) << 8) + (uint64_t(a21) << 16) + (uint64_t(a20) << 24) + (uint64_t(a19) << 32) + (uint64_t(a18) << 40) + (uint64_t(a17) << 48) + (uint64_t(a16) << 56),
    +                          uint64_t(a31) + (uint64_t(a30) << 8) + (uint64_t(a29) << 16) + (uint64_t(a28) << 24) + (uint64_t(a27) << 32) + (uint64_t(a26) << 40) + (uint64_t(a25) << 48) + (uint64_t(a24) << 56),
    +                          uint64_t(a39) + (uint64_t(a38) << 8) + (uint64_t(a37) << 16) + (uint64_t(a36) << 24) + (uint64_t(a35) << 32) + (uint64_t(a34) << 40) + (uint64_t(a33) << 48) + (uint64_t(a32) << 56),
    +                          uint64_t(a47) + (uint64_t(a46) << 8) + (uint64_t(a45) << 16) + (uint64_t(a44) << 24) + (uint64_t(a43) << 32) + (uint64_t(a42) << 40) + (uint64_t(a41) << 48) + (uint64_t(a40) << 56),
    +                          uint64_t(a55) + (uint64_t(a54) << 8) + (uint64_t(a53) << 16) + (uint64_t(a52) << 24) + (uint64_t(a51) << 32) + (uint64_t(a50) << 40) + (uint64_t(a49) << 48) + (uint64_t(a48) << 56),
    +                          uint64_t(a63) + (uint64_t(a62) << 8) + (uint64_t(a61) << 16) + (uint64_t(a60) << 24) + (uint64_t(a59) << 32) + (uint64_t(a58) << 40) + (uint64_t(a57) << 48) + (uint64_t(a56) << 56));
    +}
    +#endif // SIMDJSON_GCC8
    +
    +
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +namespace simd {
    +
    +  // Forward-declared so they can be used by splat and friends.
    +  template
    +  struct base {
    +    __m512i value;
    +
    +    // Zero constructor
    +    simdjson_inline base() : value{__m512i()} {}
    +
    +    // Conversion from SIMD register
    +    simdjson_inline base(const __m512i _value) : value(_value) {}
    +
    +    // Conversion to SIMD register
    +    simdjson_inline operator const __m512i&() const { return this->value; }
    +    simdjson_inline operator __m512i&() { return this->value; }
    +
    +    // Bit operations
    +    simdjson_inline Child operator|(const Child other) const { return _mm512_or_si512(*this, other); }
    +    simdjson_inline Child operator&(const Child other) const { return _mm512_and_si512(*this, other); }
    +    simdjson_inline Child operator^(const Child other) const { return _mm512_xor_si512(*this, other); }
    +    simdjson_inline Child bit_andnot(const Child other) const { return _mm512_andnot_si512(other, *this); }
    +    simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast | other; return *this_cast; }
    +    simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast & other; return *this_cast; }
    +    simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast ^ other; return *this_cast; }
    +  };
    +
    +  // Forward-declared so they can be used by splat and friends.
    +  template
    +  struct simd8;
    +
    +  template>
    +  struct base8: base> {
    +    typedef uint32_t bitmask_t;
    +    typedef uint64_t bitmask2_t;
    +
    +    simdjson_inline base8() : base>() {}
    +    simdjson_inline base8(const __m512i _value) : base>(_value) {}
    +
    +    friend simdjson_really_inline uint64_t operator==(const simd8 lhs, const simd8 rhs) {
    +      return _mm512_cmpeq_epi8_mask(lhs, rhs);
    +    }
    +
    +    static const int SIZE = sizeof(base::value);
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +     // workaround for compilers unable to figure out that 16 - N is a constant (GCC 8)
    +      constexpr int shift = 16 - N;
    +      return _mm512_alignr_epi8(*this, _mm512_permutex2var_epi64(prev_chunk, _mm512_set_epi64(13, 12, 11, 10, 9, 8, 7, 6), *this), shift);
    +    }
    +  };
    +
    +  // SIMD byte mask type (returned by things like eq and gt)
    +  template<>
    +  struct simd8: base8 {
    +    static simdjson_inline simd8 splat(bool _value) { return _mm512_set1_epi8(uint8_t(-(!!_value))); }
    +
    +    simdjson_inline simd8() : base8() {}
    +    simdjson_inline simd8(const __m512i _value) : base8(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(bool _value) : base8(splat(_value)) {}
    +    simdjson_inline bool any() const { return !!_mm512_test_epi8_mask (*this, *this); }
    +    simdjson_inline simd8 operator~() const { return *this ^ true; }
    +  };
    +
    +  template
    +  struct base8_numeric: base8 {
    +    static simdjson_inline simd8 splat(T _value) { return _mm512_set1_epi8(_value); }
    +    static simdjson_inline simd8 zero() { return _mm512_setzero_si512(); }
    +    static simdjson_inline simd8 load(const T values[64]) {
    +      return _mm512_loadu_si512(reinterpret_cast(values));
    +    }
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    static simdjson_inline simd8 repeat_16(
    +      T v0,  T v1,  T v2,  T v3,  T v4,  T v5,  T v6,  T v7,
    +      T v8,  T v9,  T v10, T v11, T v12, T v13, T v14, T v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    simdjson_inline base8_numeric() : base8() {}
    +    simdjson_inline base8_numeric(const __m512i _value) : base8(_value) {}
    +
    +    // Store to array
    +    simdjson_inline void store(T dst[64]) const { return _mm512_storeu_si512(reinterpret_cast<__m512i *>(dst), *this); }
    +
    +    // Addition/subtraction are the same for signed and unsigned
    +    simdjson_inline simd8 operator+(const simd8 other) const { return _mm512_add_epi8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return _mm512_sub_epi8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *static_cast*>(this); }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *static_cast*>(this); }
    +
    +    // Override to distinguish from bool version
    +    simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +
    +    // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values)
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return _mm512_shuffle_epi8(lookup_table, *this);
    +    }
    +
    +    // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset).
    +    // Passing a 0 value for mask would be equivalent to writing out every byte to output.
    +    // Only the first 32 - count_ones(mask) bytes of the result are significant but 32 bytes
    +    // get written.
    +    // Design consideration: it seems like a function with the
    +    // signature simd8 compress(uint32_t mask) would be
    +    // sensible, but the AVX ISA makes this kind of approach difficult.
    +    template
    +    simdjson_inline void compress(uint64_t mask, L * output) const {
    +      _mm512_mask_compressstoreu_epi8 (output,~mask,*this);
    +    }
    +
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +  };
    +
    +  // Signed bytes
    +  template<>
    +  struct simd8 : base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m512i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const int8_t values[64]) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15,
    +      int8_t v16, int8_t v17, int8_t v18, int8_t v19, int8_t v20, int8_t v21, int8_t v22, int8_t v23,
    +      int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, int8_t v30, int8_t v31,
    +      int8_t v32, int8_t v33, int8_t v34, int8_t v35, int8_t v36, int8_t v37, int8_t v38, int8_t v39,
    +      int8_t v40, int8_t v41, int8_t v42, int8_t v43, int8_t v44, int8_t v45, int8_t v46, int8_t v47,
    +      int8_t v48, int8_t v49, int8_t v50, int8_t v51, int8_t v52, int8_t v53, int8_t v54, int8_t v55,
    +      int8_t v56, int8_t v57, int8_t v58, int8_t v59, int8_t v60, int8_t v61, int8_t v62, int8_t v63
    +    ) : simd8(_mm512_set_epi8(
    +      v63, v62, v61, v60, v59, v58, v57, v56,
    +      v55, v54, v53, v52, v51, v50, v49, v48,
    +      v47, v46, v45, v44, v43, v42, v41, v40,
    +      v39, v38, v37, v36, v35, v34, v33, v32,
    +      v31, v30, v29, v28, v27, v26, v25, v24,
    +      v23, v22, v21, v20, v19, v18, v17, v16,
    +      v15, v14, v13, v12, v11, v10,  v9,  v8,
    +       v7,  v6,  v5,  v4,  v3,  v2,  v1,  v0
    +    )) {}
    +
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Order-sensitive comparisons
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm512_max_epi8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm512_min_epi8(*this, other); }
    +
    +    simdjson_inline simd8 operator>(const simd8 other) const { return _mm512_maskz_abs_epi8(_mm512_cmpgt_epi8_mask(*this, other),_mm512_set1_epi8(uint8_t(0x80))); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return _mm512_maskz_abs_epi8(_mm512_cmpgt_epi8_mask(other, *this),_mm512_set1_epi8(uint8_t(0x80))); }
    +  };
    +
    +  // Unsigned bytes
    +  template<>
    +  struct simd8: base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m512i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const uint8_t values[64]) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15,
    +      uint8_t v16, uint8_t v17, uint8_t v18, uint8_t v19, uint8_t v20, uint8_t v21, uint8_t v22, uint8_t v23,
    +      uint8_t v24, uint8_t v25, uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, uint8_t v31,
    +      uint8_t v32, uint8_t v33, uint8_t v34, uint8_t v35, uint8_t v36, uint8_t v37, uint8_t v38, uint8_t v39,
    +      uint8_t v40, uint8_t v41, uint8_t v42, uint8_t v43, uint8_t v44, uint8_t v45, uint8_t v46, uint8_t v47,
    +      uint8_t v48, uint8_t v49, uint8_t v50, uint8_t v51, uint8_t v52, uint8_t v53, uint8_t v54, uint8_t v55,
    +      uint8_t v56, uint8_t v57, uint8_t v58, uint8_t v59, uint8_t v60, uint8_t v61, uint8_t v62, uint8_t v63
    +    ) : simd8(_mm512_set_epi8(
    +      v63, v62, v61, v60, v59, v58, v57, v56,
    +      v55, v54, v53, v52, v51, v50, v49, v48,
    +      v47, v46, v45, v44, v43, v42, v41, v40,
    +      v39, v38, v37, v36, v35, v34, v33, v32,
    +      v31, v30, v29, v28, v27, v26, v25, v24,
    +      v23, v22, v21, v20, v19, v18, v17, v16,
    +      v15, v14, v13, v12, v11, v10,  v9,  v8,
    +       v7,  v6,  v5,  v4,  v3,  v2,  v1,  v0
    +    )) {}
    +
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Saturated math
    +    simdjson_inline simd8 saturating_add(const simd8 other) const { return _mm512_adds_epu8(*this, other); }
    +    simdjson_inline simd8 saturating_sub(const simd8 other) const { return _mm512_subs_epu8(*this, other); }
    +
    +    // Order-specific operations
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm512_max_epu8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm512_min_epu8(other, *this); }
    +    // Same as >, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 gt_bits(const simd8 other) const { return this->saturating_sub(other); }
    +    // Same as <, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 lt_bits(const simd8 other) const { return other.saturating_sub(*this); }
    +    simdjson_inline uint64_t operator<=(const simd8 other) const { return other.max_val(*this) == other; }
    +    simdjson_inline uint64_t operator>=(const simd8 other) const { return other.min_val(*this) == other; }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return this->lt_bits(other).any_bits_set(); }
    +
    +    // Bit-specific operations
    +    simdjson_inline simd8 bits_not_set() const { return _mm512_mask_blend_epi8(*this == uint8_t(0), _mm512_set1_epi8(0), _mm512_set1_epi8(-1)); }
    +    simdjson_inline simd8 bits_not_set(simd8 bits) const { return (*this & bits).bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set() const { return ~this->bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set(simd8 bits) const { return ~this->bits_not_set(bits); }
    +
    +    simdjson_inline bool is_ascii() const { return _mm512_movepi8_mask(*this) == 0; }
    +    simdjson_inline bool bits_not_set_anywhere() const {
    +      return !_mm512_test_epi8_mask(*this, *this);
    +    }
    +    simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); }
    +    simdjson_inline bool bits_not_set_anywhere(simd8 bits) const { return !_mm512_test_epi8_mask(*this, bits); }
    +    simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return !bits_not_set_anywhere(bits); }
    +    template
    +    simdjson_inline simd8 shr() const { return simd8(_mm512_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); }
    +    template
    +    simdjson_inline simd8 shl() const { return simd8(_mm512_slli_epi16(*this, N)) & uint8_t(0xFFu << N); }
    +    // Get one of the bits and make a bitmask out of it.
    +    // e.g. value.get_bit<7>() gets the high bit
    +    template
    +    simdjson_inline uint64_t get_bit() const { return _mm512_movepi8_mask(_mm512_slli_epi16(*this, 7-N)); }
    +  };
    +
    +  template
    +  struct simd8x64 {
    +    static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +    static_assert(NUM_CHUNKS == 1, "Icelake kernel should use one register per 64-byte block.");
    +    const simd8 chunks[NUM_CHUNKS];
    +
    +    simd8x64(const simd8x64& o) = delete; // no copy allowed
    +    simd8x64& operator=(const simd8& other) = delete; // no assignment allowed
    +    simd8x64() = delete; // no default constructor allowed
    +
    +    simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1) : chunks{chunk0, chunk1} {}
    +    simdjson_inline simd8x64(const simd8 chunk0) : chunks{chunk0} {}
    +    simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8::load(ptr)} {}
    +
    +    simdjson_inline uint64_t compress(uint64_t mask, T * output) const {
    +      this->chunks[0].compress(mask, output);
    +      return 64 - count_ones(mask);
    +    }
    +
    +    simdjson_inline void store(T ptr[64]) const {
    +      this->chunks[0].store(ptr+sizeof(simd8)*0);
    +    }
    +
    +    simdjson_inline simd8 reduce_or() const {
    +      return this->chunks[0];
    +    }
    +
    +    simdjson_inline simd8x64 bit_or(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return simd8x64(
    +        this->chunks[0] | mask
    +      );
    +    }
    +
    +    simdjson_inline uint64_t eq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return this->chunks[0] == mask;
    +    }
    +
    +    simdjson_inline uint64_t eq(const simd8x64 &other) const {
    +      return this->chunks[0] == other.chunks[0];
    +    }
    +
    +    simdjson_inline uint64_t lteq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return this->chunks[0] <= mask;
    +    }
    +  }; // struct simd8x64
    +
    +} // namespace simd
    +
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ICELAKE_SIMD_H
    +/* end file simdjson/icelake/simd.h */
    +/* including simdjson/icelake/stringparsing_defs.h: #include "simdjson/icelake/stringparsing_defs.h" */
    +/* begin file simdjson/icelake/stringparsing_defs.h */
    +#ifndef SIMDJSON_ICELAKE_STRINGPARSING_DEFS_H
    +#define SIMDJSON_ICELAKE_STRINGPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/simd.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +
    +using namespace simd;
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 64;
    +  simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; }
    +  simdjson_inline bool has_backslash() { return ((quote_bits - 1) & bs_bits) != 0; }
    +  simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); }
    +  simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); }
    +
    +  uint64_t bs_bits;
    +  uint64_t quote_bits;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // this can read up to 15 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes");
    +  simd8 v(src);
    +  // store to dest unconditionally - we can overwrite the bits we don't like later
    +  v.store(dst);
    +  return {
    +      static_cast(v == '\\'), // bs_bits
    +      static_cast(v == '"'), // quote_bits
    +  };
    +}
    +
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ICELAKE_STRINGPARSING_DEFS_H
    +/* end file simdjson/icelake/stringparsing_defs.h */
    +/* including simdjson/icelake/numberparsing_defs.h: #include "simdjson/icelake/numberparsing_defs.h" */
    +/* begin file simdjson/icelake/numberparsing_defs.h */
    +#ifndef SIMDJSON_ICELAKE_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_ICELAKE_NUMBERPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace numberparsing {
    +
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  // this actually computes *16* values so we are being wasteful.
    +  const __m128i ascii0 = _mm_set1_epi8('0');
    +  const __m128i mul_1_10 =
    +      _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1);
    +  const __m128i mul_1_100 = _mm_setr_epi16(100, 1, 100, 1, 100, 1, 100, 1);
    +  const __m128i mul_1_10000 =
    +      _mm_setr_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1);
    +  const __m128i input = _mm_sub_epi8(
    +      _mm_loadu_si128(reinterpret_cast(chars)), ascii0);
    +  const __m128i t1 = _mm_maddubs_epi16(input, mul_1_10);
    +  const __m128i t2 = _mm_madd_epi16(t1, mul_1_100);
    +  const __m128i t3 = _mm_packus_epi32(t2, t2);
    +  const __m128i t4 = _mm_madd_epi16(t3, mul_1_10000);
    +  return _mm_cvtsi128_si32(
    +      t4); // only captures the sum of the first 8 digits, drop the rest
    +}
    +
    +/** @private */
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif // SIMDJSON_ICELAKE_NUMBERPARSING_DEFS_H
    +/* end file simdjson/icelake/numberparsing_defs.h */
    +/* end file simdjson/icelake/begin.h */
    +/* including simdjson/generic/amalgamated.h for icelake: #include "simdjson/generic/amalgamated.h" */
    +/* begin file simdjson/generic/amalgamated.h for icelake */
    +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_DEPENDENCIES_H)
    +#error simdjson/generic/dependencies.h must be included before simdjson/generic/amalgamated.h!
    +#endif
    +
    +/* including simdjson/generic/base.h for icelake: #include "simdjson/generic/base.h" */
    +/* begin file simdjson/generic/base.h for icelake */
    +#ifndef SIMDJSON_GENERIC_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): // If we haven't got an implementation yet, we're in the editor, editing a generic file! Just */
    +/* amalgamation skipped (editor-only): // use the most advanced one we can so the most possible stuff can be tested. */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation_detection.h" */
    +/* amalgamation skipped (editor-only): #if SIMDJSON_IMPLEMENTATION_ICELAKE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_HASWELL */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_WESTMERE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_ARM64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */
    +/* amalgamation skipped (editor-only): #else */
    +/* amalgamation skipped (editor-only): #error "All possible implementations (including fallback) have been disabled! simdjson will not run." */
    +/* amalgamation skipped (editor-only): #endif */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +
    +struct open_container;
    +class dom_parser_implementation;
    +
    +/**
    + * The type of a JSON number
    + */
    +enum class number_type {
    +    floating_point_number=1, /// a binary64 number
    +    signed_integer,          /// a signed integer that fits in a 64-bit word using two's complement
    +    unsigned_integer         /// a positive integer larger or equal to 1<<63
    +};
    +
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_BASE_H
    +/* end file simdjson/generic/base.h for icelake */
    +/* including simdjson/generic/jsoncharutils.h for icelake: #include "simdjson/generic/jsoncharutils.h" */
    +/* begin file simdjson/generic/jsoncharutils.h for icelake */
    +#ifndef SIMDJSON_GENERIC_JSONCHARUTILS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_JSONCHARUTILS_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/jsoncharutils_tables.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +namespace jsoncharutils {
    +
    +// return non-zero if not a structural or whitespace char
    +// zero otherwise
    +simdjson_inline uint32_t is_not_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace_negated[c];
    +}
    +
    +simdjson_inline uint32_t is_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace[c];
    +}
    +
    +// returns a value with the high 16 bits set if not valid
    +// otherwise returns the conversion of the 4 hex digits at src into the bottom
    +// 16 bits of the 32-bit return register
    +//
    +// see
    +// https://lemire.me/blog/2019/04/17/parsing-short-hexadecimal-strings-efficiently/
    +static inline uint32_t hex_to_u32_nocheck(
    +    const uint8_t *src) { // strictly speaking, static inline is a C-ism
    +  uint32_t v1 = internal::digit_to_val32[630 + src[0]];
    +  uint32_t v2 = internal::digit_to_val32[420 + src[1]];
    +  uint32_t v3 = internal::digit_to_val32[210 + src[2]];
    +  uint32_t v4 = internal::digit_to_val32[0 + src[3]];
    +  return v1 | v2 | v3 | v4;
    +}
    +
    +// given a code point cp, writes to c
    +// the utf-8 code, outputting the length in
    +// bytes, if the length is zero, the code point
    +// is invalid
    +//
    +// This can possibly be made faster using pdep
    +// and clz and table lookups, but JSON documents
    +// have few escaped code points, and the following
    +// function looks cheap.
    +//
    +// Note: we assume that surrogates are treated separately
    +//
    +simdjson_inline size_t codepoint_to_utf8(uint32_t cp, uint8_t *c) {
    +  if (cp <= 0x7F) {
    +    c[0] = uint8_t(cp);
    +    return 1; // ascii
    +  }
    +  if (cp <= 0x7FF) {
    +    c[0] = uint8_t((cp >> 6) + 192);
    +    c[1] = uint8_t((cp & 63) + 128);
    +    return 2; // universal plane
    +    //  Surrogates are treated elsewhere...
    +    //} //else if (0xd800 <= cp && cp <= 0xdfff) {
    +    //  return 0; // surrogates // could put assert here
    +  } else if (cp <= 0xFFFF) {
    +    c[0] = uint8_t((cp >> 12) + 224);
    +    c[1] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[2] = uint8_t((cp & 63) + 128);
    +    return 3;
    +  } else if (cp <= 0x10FFFF) { // if you know you have a valid code point, this
    +                               // is not needed
    +    c[0] = uint8_t((cp >> 18) + 240);
    +    c[1] = uint8_t(((cp >> 12) & 63) + 128);
    +    c[2] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[3] = uint8_t((cp & 63) + 128);
    +    return 4;
    +  }
    +  // will return 0 when the code point was too large.
    +  return 0; // bad r
    +}
    +
    +#if SIMDJSON_IS_32BITS // _umul128 for x86, arm
    +// this is a slow emulation routine for 32-bit
    +//
    +static simdjson_inline uint64_t __emulu(uint32_t x, uint32_t y) {
    +  return x * (uint64_t)y;
    +}
    +static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) {
    +  uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd);
    +  uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd);
    +  uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32));
    +  uint64_t adbc_carry = !!(adbc < ad);
    +  uint64_t lo = bd + (adbc << 32);
    +  *hi = __emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) +
    +        (adbc_carry << 32) + !!(lo < bd);
    +  return lo;
    +}
    +#endif
    +
    +} // namespace jsoncharutils
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_JSONCHARUTILS_H
    +/* end file simdjson/generic/jsoncharutils.h for icelake */
    +/* including simdjson/generic/atomparsing.h for icelake: #include "simdjson/generic/atomparsing.h" */
    +/* begin file simdjson/generic/atomparsing.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ATOMPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ATOMPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +/// @private
    +namespace atomparsing {
    +
    +// The string_to_uint32 is exclusively used to map literal strings to 32-bit values.
    +// We use memcpy instead of a pointer cast to avoid undefined behaviors since we cannot
    +// be certain that the character pointer will be properly aligned.
    +// You might think that using memcpy makes this function expensive, but you'd be wrong.
    +// All decent optimizing compilers (GCC, clang, Visual Studio) will compile string_to_uint32("false");
    +// to the compile-time constant 1936482662.
    +simdjson_inline uint32_t string_to_uint32(const char* str) { uint32_t val; std::memcpy(&val, str, sizeof(uint32_t)); return val; }
    +
    +
    +// Again in str4ncmp we use a memcpy to avoid undefined behavior. The memcpy may appear expensive.
    +// Yet all decent optimizing compilers will compile memcpy to a single instruction, just about.
    +simdjson_warn_unused
    +simdjson_inline uint32_t str4ncmp(const uint8_t *src, const char* atom) {
    +  uint32_t srcval; // we want to avoid unaligned 32-bit loads (undefined in C/C++)
    +  static_assert(sizeof(uint32_t) <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be larger than 4 bytes");
    +  std::memcpy(&srcval, src, sizeof(uint32_t));
    +  return srcval ^ string_to_uint32(atom);
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "true") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_true_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "true"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src) {
    +  return (str4ncmp(src+1, "alse") | jsoncharutils::is_not_structural_or_whitespace(src[5])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src, size_t len) {
    +  if (len > 5) { return is_valid_false_atom(src); }
    +  else if (len == 5) { return !str4ncmp(src+1, "alse"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "null") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_null_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "null"); }
    +  else { return false; }
    +}
    +
    +} // namespace atomparsing
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ATOMPARSING_H
    +/* end file simdjson/generic/atomparsing.h for icelake */
    +/* including simdjson/generic/dom_parser_implementation.h for icelake: #include "simdjson/generic/dom_parser_implementation.h" */
    +/* begin file simdjson/generic/dom_parser_implementation.h for icelake */
    +#ifndef SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +
    +// expectation: sizeof(open_container) = 64/8.
    +struct open_container {
    +  uint32_t tape_index; // where, on the tape, does the scope ([,{) begins
    +  uint32_t count; // how many elements in the scope
    +}; // struct open_container
    +
    +static_assert(sizeof(open_container) == 64/8, "Open container must be 64 bits");
    +
    +class dom_parser_implementation final : public internal::dom_parser_implementation {
    +public:
    +  /** Tape location of each open { or [ */
    +  std::unique_ptr open_containers{};
    +  /** Whether each open container is a [ or { */
    +  std::unique_ptr is_array{};
    +  /** Buffer passed to stage 1 */
    +  const uint8_t *buf{};
    +  /** Length passed to stage 1 */
    +  size_t len{0};
    +  /** Document passed to stage 2 */
    +  dom::document *doc{};
    +
    +  inline dom_parser_implementation() noexcept;
    +  inline dom_parser_implementation(dom_parser_implementation &&other) noexcept;
    +  inline dom_parser_implementation &operator=(dom_parser_implementation &&other) noexcept;
    +  dom_parser_implementation(const dom_parser_implementation &) = delete;
    +  dom_parser_implementation &operator=(const dom_parser_implementation &) = delete;
    +
    +  simdjson_warn_unused error_code parse(const uint8_t *buf, size_t len, dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage1(const uint8_t *buf, size_t len, stage1_mode partial) noexcept final;
    +  simdjson_warn_unused error_code stage2(dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage2_next(dom::document &doc) noexcept final;
    +  simdjson_warn_unused uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) const noexcept final;
    +  simdjson_warn_unused uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept final;
    +  inline simdjson_warn_unused error_code set_capacity(size_t capacity) noexcept final;
    +  inline simdjson_warn_unused error_code set_max_depth(size_t max_depth) noexcept final;
    +private:
    +  simdjson_inline simdjson_warn_unused error_code set_capacity_stage1(size_t capacity);
    +
    +};
    +
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +namespace icelake {
    +
    +inline dom_parser_implementation::dom_parser_implementation() noexcept = default;
    +inline dom_parser_implementation::dom_parser_implementation(dom_parser_implementation &&other) noexcept = default;
    +inline dom_parser_implementation &dom_parser_implementation::operator=(dom_parser_implementation &&other) noexcept = default;
    +
    +// Leaving these here so they can be inlined if so desired
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_capacity(size_t capacity) noexcept {
    +  if(capacity > SIMDJSON_MAXSIZE_BYTES) { return CAPACITY; }
    +  // Stage 1 index output
    +  size_t max_structures = SIMDJSON_ROUNDUP_N(capacity, 64) + 2 + 7;
    +  structural_indexes.reset( new (std::nothrow) uint32_t[max_structures] );
    +  if (!structural_indexes) { _capacity = 0; return MEMALLOC; }
    +  structural_indexes[0] = 0;
    +  n_structural_indexes = 0;
    +
    +  _capacity = capacity;
    +  return SUCCESS;
    +}
    +
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_max_depth(size_t max_depth) noexcept {
    +  // Stage 2 stacks
    +  open_containers.reset(new (std::nothrow) open_container[max_depth]);
    +  is_array.reset(new (std::nothrow) bool[max_depth]);
    +  if (!is_array || !open_containers) { _max_depth = 0; return MEMALLOC; }
    +
    +  _max_depth = max_depth;
    +  return SUCCESS;
    +}
    +
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +/* end file simdjson/generic/dom_parser_implementation.h for icelake */
    +/* including simdjson/generic/implementation_simdjson_result_base.h for icelake: #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base.h for icelake */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +
    +// This is a near copy of include/error.h's implementation_simdjson_result_base, except it doesn't use std::pair
    +// so we can avoid inlining errors
    +// TODO reconcile these!
    +/**
    + * The result of a simdjson operation that could fail.
    + *
    + * Gives the option of reading error codes, or throwing an exception by casting to the desired result.
    + *
    + * This is a base class for implementations that want to add functions to the result type for
    + * chaining.
    + *
    + * Override like:
    + *
    + *   struct simdjson_result : public internal::implementation_simdjson_result_base {
    + *     simdjson_result() noexcept : internal::implementation_simdjson_result_base() {}
    + *     simdjson_result(error_code error) noexcept : internal::implementation_simdjson_result_base(error) {}
    + *     simdjson_result(T &&value) noexcept : internal::implementation_simdjson_result_base(std::forward(value)) {}
    + *     simdjson_result(T &&value, error_code error) noexcept : internal::implementation_simdjson_result_base(value, error) {}
    + *     // Your extra methods here
    + *   }
    + *
    + * Then any method returning simdjson_result will be chainable with your methods.
    + */
    +template
    +struct implementation_simdjson_result_base {
    +
    +  /**
    +   * Create a new empty result with error = UNINITIALIZED.
    +   */
    +  simdjson_inline implementation_simdjson_result_base() noexcept = default;
    +
    +  /**
    +   * Create a new error result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(error_code error) noexcept;
    +
    +  /**
    +   * Create a new successful result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value) noexcept;
    +
    +  /**
    +   * Create a new result with both things (use if you don't want to branch when creating the result).
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value, error_code error) noexcept;
    +
    +  /**
    +   * Move the value and the error to the provided variables.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   * @param error The variable to assign the error to. Set to SUCCESS if there is no error.
    +   */
    +  simdjson_inline void tie(T &value, error_code &error) && noexcept;
    +
    +  /**
    +   * Move the value to the provided variable.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   */
    +  simdjson_inline error_code get(T &value) && noexcept;
    +
    +  /**
    +   * The error.
    +   */
    +  simdjson_inline error_code error() const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value.
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T& value() & noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& value() && noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& take_value() && noexcept(false);
    +
    +  /**
    +   * Cast to the value (will throw on error).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline operator T&&() && noexcept(false);
    +
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline const T& value_unsafe() const& noexcept;
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T& value_unsafe() & noexcept;
    +  /**
    +   * Take the result value (move it). This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T&& value_unsafe() && noexcept;
    +protected:
    +  /** users should never directly access first and second. **/
    +  T first{}; /** Users should never directly access 'first'. **/
    +  error_code second{UNINITIALIZED}; /** Users should never directly access 'second'. **/
    +}; // struct implementation_simdjson_result_base
    +
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +/* end file simdjson/generic/implementation_simdjson_result_base.h for icelake */
    +/* including simdjson/generic/numberparsing.h for icelake: #include "simdjson/generic/numberparsing.h" */
    +/* begin file simdjson/generic/numberparsing.h for icelake */
    +#ifndef SIMDJSON_GENERIC_NUMBERPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_NUMBERPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace numberparsing {
    +
    +#ifdef JSON_TEST_NUMBERS
    +#define INVALID_NUMBER(SRC) (found_invalid_number((SRC)), NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (found_integer((VALUE), (SRC)), (WRITER).append_s64((VALUE)))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (found_unsigned_integer((VALUE), (SRC)), (WRITER).append_u64((VALUE)))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (found_float((VALUE), (SRC)), (WRITER).append_double((VALUE)))
    +#else
    +#define INVALID_NUMBER(SRC) (NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (WRITER).append_s64((VALUE))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (WRITER).append_u64((VALUE))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (WRITER).append_double((VALUE))
    +#endif
    +
    +namespace {
    +
    +// Convert a mantissa, an exponent and a sign bit into an ieee64 double.
    +// The real_exponent needs to be in [0, 2046] (technically real_exponent = 2047 would be acceptable).
    +// The mantissa should be in [0,1<<53). The bit at index (1ULL << 52) while be zeroed.
    +simdjson_inline double to_double(uint64_t mantissa, uint64_t real_exponent, bool negative) {
    +    double d;
    +    mantissa &= ~(1ULL << 52);
    +    mantissa |= real_exponent << 52;
    +    mantissa |= ((static_cast(negative)) << 63);
    +    std::memcpy(&d, &mantissa, sizeof(d));
    +    return d;
    +}
    +
    +// Attempts to compute i * 10^(power) exactly; and if "negative" is
    +// true, negate the result.
    +// This function will only work in some cases, when it does not work, success is
    +// set to false. This should work *most of the time* (like 99% of the time).
    +// We assume that power is in the [smallest_power,
    +// largest_power] interval: the caller is responsible for this check.
    +simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative, double &d) {
    +  // we start with a fast path
    +  // It was described in
    +  // Clinger WD. How to read floating point numbers accurately.
    +  // ACM SIGPLAN Notices. 1990
    +#ifndef FLT_EVAL_METHOD
    +#error "FLT_EVAL_METHOD should be defined, please include cfloat."
    +#endif
    +#if (FLT_EVAL_METHOD != 1) && (FLT_EVAL_METHOD != 0)
    +  // We cannot be certain that x/y is rounded to nearest.
    +  if (0 <= power && power <= 22 && i <= 9007199254740991)
    +#else
    +  if (-22 <= power && power <= 22 && i <= 9007199254740991)
    +#endif
    +  {
    +    // convert the integer into a double. This is lossless since
    +    // 0 <= i <= 2^53 - 1.
    +    d = double(i);
    +    //
    +    // The general idea is as follows.
    +    // If 0 <= s < 2^53 and if 10^0 <= p <= 10^22 then
    +    // 1) Both s and p can be represented exactly as 64-bit floating-point
    +    // values
    +    // (binary64).
    +    // 2) Because s and p can be represented exactly as floating-point values,
    +    // then s * p
    +    // and s / p will produce correctly rounded values.
    +    //
    +    if (power < 0) {
    +      d = d / simdjson::internal::power_of_ten[-power];
    +    } else {
    +      d = d * simdjson::internal::power_of_ten[power];
    +    }
    +    if (negative) {
    +      d = -d;
    +    }
    +    return true;
    +  }
    +  // When 22 < power && power <  22 + 16, we could
    +  // hope for another, secondary fast path.  It was
    +  // described by David M. Gay in  "Correctly rounded
    +  // binary-decimal and decimal-binary conversions." (1990)
    +  // If you need to compute i * 10^(22 + x) for x < 16,
    +  // first compute i * 10^x, if you know that result is exact
    +  // (e.g., when i * 10^x < 2^53),
    +  // then you can still proceed and do (i * 10^x) * 10^22.
    +  // Is this worth your time?
    +  // You need  22 < power *and* power <  22 + 16 *and* (i * 10^(x-22) < 2^53)
    +  // for this second fast path to work.
    +  // If you you have 22 < power *and* power <  22 + 16, and then you
    +  // optimistically compute "i * 10^(x-22)", there is still a chance that you
    +  // have wasted your time if i * 10^(x-22) >= 2^53. It makes the use cases of
    +  // this optimization maybe less common than we would like. Source:
    +  // http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/
    +  // also used in RapidJSON: https://rapidjson.org/strtod_8h_source.html
    +
    +  // The fast path has now failed, so we are failing back on the slower path.
    +
    +  // In the slow path, we need to adjust i so that it is > 1<<63 which is always
    +  // possible, except if i == 0, so we handle i == 0 separately.
    +  if(i == 0) {
    +    d = negative ? -0.0 : 0.0;
    +    return true;
    +  }
    +
    +
    +  // The exponent is 1024 + 63 + power
    +  //     + floor(log(5**power)/log(2)).
    +  // The 1024 comes from the ieee64 standard.
    +  // The 63 comes from the fact that we use a 64-bit word.
    +  //
    +  // Computing floor(log(5**power)/log(2)) could be
    +  // slow. Instead we use a fast function.
    +  //
    +  // For power in (-400,350), we have that
    +  // (((152170 + 65536) * power ) >> 16);
    +  // is equal to
    +  //  floor(log(5**power)/log(2)) + power when power >= 0
    +  // and it is equal to
    +  //  ceil(log(5**-power)/log(2)) + power when power < 0
    +  //
    +  // The 65536 is (1<<16) and corresponds to
    +  // (65536 * power) >> 16 ---> power
    +  //
    +  // ((152170 * power ) >> 16) is equal to
    +  // floor(log(5**power)/log(2))
    +  //
    +  // Note that this is not magic: 152170/(1<<16) is
    +  // approximatively equal to log(5)/log(2).
    +  // The 1<<16 value is a power of two; we could use a
    +  // larger power of 2 if we wanted to.
    +  //
    +  int64_t exponent = (((152170 + 65536) * power) >> 16) + 1024 + 63;
    +
    +
    +  // We want the most significant bit of i to be 1. Shift if needed.
    +  int lz = leading_zeroes(i);
    +  i <<= lz;
    +
    +
    +  // We are going to need to do some 64-bit arithmetic to get a precise product.
    +  // We use a table lookup approach.
    +  // It is safe because
    +  // power >= smallest_power
    +  // and power <= largest_power
    +  // We recover the mantissa of the power, it has a leading 1. It is always
    +  // rounded down.
    +  //
    +  // We want the most significant 64 bits of the product. We know
    +  // this will be non-zero because the most significant bit of i is
    +  // 1.
    +  const uint32_t index = 2 * uint32_t(power - simdjson::internal::smallest_power);
    +  // Optimization: It may be that materializing the index as a variable might confuse some compilers and prevent effective complex-addressing loads. (Done for code clarity.)
    +  //
    +  // The full_multiplication function computes the 128-bit product of two 64-bit words
    +  // with a returned value of type value128 with a "low component" corresponding to the
    +  // 64-bit least significant bits of the product and with a "high component" corresponding
    +  // to the 64-bit most significant bits of the product.
    +  simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
    +  // Both i and power_of_five_128[index] have their most significant bit set to 1 which
    +  // implies that the either the most or the second most significant bit of the product
    +  // is 1. We pack values in this manner for efficiency reasons: it maximizes the use
    +  // we make of the product. It also makes it easy to reason about the product: there
    +  // is 0 or 1 leading zero in the product.
    +
    +  // Unless the least significant 9 bits of the high (64-bit) part of the full
    +  // product are all 1s, then we know that the most significant 55 bits are
    +  // exact and no further work is needed. Having 55 bits is necessary because
    +  // we need 53 bits for the mantissa but we have to have one rounding bit and
    +  // we can waste a bit if the most significant bit of the product is zero.
    +  if((firstproduct.high & 0x1FF) == 0x1FF) {
    +    // We want to compute i * 5^q, but only care about the top 55 bits at most.
    +    // Consider the scenario where q>=0. Then 5^q may not fit in 64-bits. Doing
    +    // the full computation is wasteful. So we do what is called a "truncated
    +    // multiplication".
    +    // We take the most significant 64-bits, and we put them in
    +    // power_of_five_128[index]. Usually, that's good enough to approximate i * 5^q
    +    // to the desired approximation using one multiplication. Sometimes it does not suffice.
    +    // Then we store the next most significant 64 bits in power_of_five_128[index + 1], and
    +    // then we get a better approximation to i * 5^q.
    +    //
    +    // That's for when q>=0. The logic for q<0 is somewhat similar but it is somewhat
    +    // more complicated.
    +    //
    +    // There is an extra layer of complexity in that we need more than 55 bits of
    +    // accuracy in the round-to-even scenario.
    +    //
    +    // The full_multiplication function computes the 128-bit product of two 64-bit words
    +    // with a returned value of type value128 with a "low component" corresponding to the
    +    // 64-bit least significant bits of the product and with a "high component" corresponding
    +    // to the 64-bit most significant bits of the product.
    +    simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
    +    firstproduct.low += secondproduct.high;
    +    if(secondproduct.high > firstproduct.low) { firstproduct.high++; }
    +    // As it has been proven by Noble Mushtak and Daniel Lemire in "Fast Number Parsing Without
    +    // Fallback" (https://arxiv.org/abs/2212.06644), at this point we are sure that the product
    +    // is sufficiently accurate, and more computation is not needed.
    +  }
    +  uint64_t lower = firstproduct.low;
    +  uint64_t upper = firstproduct.high;
    +  // The final mantissa should be 53 bits with a leading 1.
    +  // We shift it so that it occupies 54 bits with a leading 1.
    +  ///////
    +  uint64_t upperbit = upper >> 63;
    +  uint64_t mantissa = upper >> (upperbit + 9);
    +  lz += int(1 ^ upperbit);
    +
    +  // Here we have mantissa < (1<<54).
    +  int64_t real_exponent = exponent - lz;
    +  if (simdjson_unlikely(real_exponent <= 0)) { // we have a subnormal?
    +    // Here have that real_exponent <= 0 so -real_exponent >= 0
    +    if(-real_exponent + 1 >= 64) { // if we have more than 64 bits below the minimum exponent, you have a zero for sure.
    +      d = negative ? -0.0 : 0.0;
    +      return true;
    +    }
    +    // next line is safe because -real_exponent + 1 < 0
    +    mantissa >>= -real_exponent + 1;
    +    // Thankfully, we can't have both "round-to-even" and subnormals because
    +    // "round-to-even" only occurs for powers close to 0.
    +    mantissa += (mantissa & 1); // round up
    +    mantissa >>= 1;
    +    // There is a weird scenario where we don't have a subnormal but just.
    +    // Suppose we start with 2.2250738585072013e-308, we end up
    +    // with 0x3fffffffffffff x 2^-1023-53 which is technically subnormal
    +    // whereas 0x40000000000000 x 2^-1023-53  is normal. Now, we need to round
    +    // up 0x3fffffffffffff x 2^-1023-53  and once we do, we are no longer
    +    // subnormal, but we can only know this after rounding.
    +    // So we only declare a subnormal if we are smaller than the threshold.
    +    real_exponent = (mantissa < (uint64_t(1) << 52)) ? 0 : 1;
    +    d = to_double(mantissa, real_exponent, negative);
    +    return true;
    +  }
    +  // We have to round to even. The "to even" part
    +  // is only a problem when we are right in between two floats
    +  // which we guard against.
    +  // If we have lots of trailing zeros, we may fall right between two
    +  // floating-point values.
    +  //
    +  // The round-to-even cases take the form of a number 2m+1 which is in (2^53,2^54]
    +  // times a power of two. That is, it is right between a number with binary significand
    +  // m and another number with binary significand m+1; and it must be the case
    +  // that it cannot be represented by a float itself.
    +  //
    +  // We must have that w * 10 ^q == (2m+1) * 2^p for some power of two 2^p.
    +  // Recall that 10^q = 5^q * 2^q.
    +  // When q >= 0, we must have that (2m+1) is divible by 5^q, so 5^q <= 2^54. We have that
    +  //  5^23 <=  2^54 and it is the last power of five to qualify, so q <= 23.
    +  // When q<0, we have  w  >=  (2m+1) x 5^{-q}.  We must have that w<2^{64} so
    +  // (2m+1) x 5^{-q} < 2^{64}. We have that 2m+1>2^{53}. Hence, we must have
    +  // 2^{53} x 5^{-q} < 2^{64}.
    +  // Hence we have 5^{-q} < 2^{11}$ or q>= -4.
    +  //
    +  // We require lower <= 1 and not lower == 0 because we could not prove that
    +  // that lower == 0 is implied; but we could prove that lower <= 1 is a necessary and sufficient test.
    +  if (simdjson_unlikely((lower <= 1) && (power >= -4) && (power <= 23) && ((mantissa & 3) == 1))) {
    +    if((mantissa  << (upperbit + 64 - 53 - 2)) ==  upper) {
    +      mantissa &= ~1;             // flip it so that we do not round up
    +    }
    +  }
    +
    +  mantissa += mantissa & 1;
    +  mantissa >>= 1;
    +
    +  // Here we have mantissa < (1<<53), unless there was an overflow
    +  if (mantissa >= (1ULL << 53)) {
    +    //////////
    +    // This will happen when parsing values such as 7.2057594037927933e+16
    +    ////////
    +    mantissa = (1ULL << 52);
    +    real_exponent++;
    +  }
    +  mantissa &= ~(1ULL << 52);
    +  // we have to check that real_exponent is in range, otherwise we bail out
    +  if (simdjson_unlikely(real_exponent > 2046)) {
    +    // We have an infinite value!!! We could actually throw an error here if we could.
    +    return false;
    +  }
    +  d = to_double(mantissa, real_exponent, negative);
    +  return true;
    +}
    +
    +// We call a fallback floating-point parser that might be slow. Note
    +// it will accept JSON numbers, but the JSON spec. is more restrictive so
    +// before you call parse_float_fallback, you need to have validated the input
    +// string with the JSON grammar.
    +// It will return an error (false) if the parsed number is infinite.
    +// The string parsing itself always succeeds. We know that there is at least
    +// one digit.
    +static bool parse_float_fallback(const uint8_t *ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +static bool parse_float_fallback(const uint8_t *ptr, const uint8_t *end_ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr), reinterpret_cast(end_ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +// check quickly whether the next 8 chars are made of digits
    +// at a glance, it looks better than Mula's
    +// http://0x80.pl/articles/swar-digits-validate.html
    +simdjson_inline bool is_made_of_eight_digits_fast(const uint8_t *chars) {
    +  uint64_t val;
    +  // this can read up to 7 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(7 <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be bigger than 7");
    +  std::memcpy(&val, chars, 8);
    +  // a branchy method might be faster:
    +  // return (( val & 0xF0F0F0F0F0F0F0F0 ) == 0x3030303030303030)
    +  //  && (( (val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0 ) ==
    +  //  0x3030303030303030);
    +  return (((val & 0xF0F0F0F0F0F0F0F0) |
    +           (((val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0) >> 4)) ==
    +          0x3333333333333333);
    +}
    +
    +template
    +SIMDJSON_NO_SANITIZE_UNDEFINED // We deliberately allow overflow here and check later
    +simdjson_inline bool parse_digit(const uint8_t c, I &i) {
    +  const uint8_t digit = static_cast(c - '0');
    +  if (digit > 9) {
    +    return false;
    +  }
    +  // PERF NOTE: multiplication by 10 is cheaper than arbitrary integer multiplication
    +  i = 10 * i + digit; // might overflow, we will handle the overflow later
    +  return true;
    +}
    +
    +simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const uint8_t *const src, const uint8_t *&p, uint64_t &i, int64_t &exponent) {
    +  // we continue with the fiction that we have an integer. If the
    +  // floating point number is representable as x * 10^z for some integer
    +  // z that fits in 53 bits, then we will be able to convert back the
    +  // the integer into a float in a lossless manner.
    +  const uint8_t *const first_after_period = p;
    +
    +#ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +#if SIMDJSON_SWAR_NUMBER_PARSING
    +  // this helps if we have lots of decimals!
    +  // this turns out to be frequent enough.
    +  if (is_made_of_eight_digits_fast(p)) {
    +    i = i * 100000000 + parse_eight_digits_unrolled(p);
    +    p += 8;
    +  }
    +#endif // SIMDJSON_SWAR_NUMBER_PARSING
    +#endif // #ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +  // Unrolling the first digit makes a small difference on some implementations (e.g. westmere)
    +  if (parse_digit(*p, i)) { ++p; }
    +  while (parse_digit(*p, i)) { p++; }
    +  exponent = first_after_period - p;
    +  // Decimal without digits (123.) is illegal
    +  if (exponent == 0) {
    +    return INVALID_NUMBER(src);
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) {
    +  // Exp Sign: -123.456e[-]78
    +  bool neg_exp = ('-' == *p);
    +  if (neg_exp || '+' == *p) { p++; } // Skip + as well
    +
    +  // Exponent: -123.456e-[78]
    +  auto start_exp = p;
    +  int64_t exp_number = 0;
    +  while (parse_digit(*p, exp_number)) { ++p; }
    +  // It is possible for parse_digit to overflow.
    +  // In particular, it could overflow to INT64_MIN, and we cannot do - INT64_MIN.
    +  // Thus we *must* check for possible overflow before we negate exp_number.
    +
    +  // Performance notes: it may seem like combining the two "simdjson_unlikely checks" below into
    +  // a single simdjson_unlikely path would be faster. The reasoning is sound, but the compiler may
    +  // not oblige and may, in fact, generate two distinct paths in any case. It might be
    +  // possible to do uint64_t(p - start_exp - 1) >= 18 but it could end up trading off
    +  // instructions for a simdjson_likely branch, an unconclusive gain.
    +
    +  // If there were no digits, it's an error.
    +  if (simdjson_unlikely(p == start_exp)) {
    +    return INVALID_NUMBER(src);
    +  }
    +  // We have a valid positive exponent in exp_number at this point, except that
    +  // it may have overflowed.
    +
    +  // If there were more than 18 digits, we may have overflowed the integer. We have to do
    +  // something!!!!
    +  if (simdjson_unlikely(p > start_exp+18)) {
    +    // Skip leading zeroes: 1e000000000000000000001 is technically valid and doesn't overflow
    +    while (*start_exp == '0') { start_exp++; }
    +    // 19 digits could overflow int64_t and is kind of absurd anyway. We don't
    +    // support exponents smaller than -999,999,999,999,999,999 and bigger
    +    // than 999,999,999,999,999,999.
    +    // We can truncate.
    +    // Note that 999999999999999999 is assuredly too large. The maximal ieee64 value before
    +    // infinity is ~1.8e308. The smallest subnormal is ~5e-324. So, actually, we could
    +    // truncate at 324.
    +    // Note that there is no reason to fail per se at this point in time.
    +    // E.g., 0e999999999999999999999 is a fine number.
    +    if (p > start_exp+18) { exp_number = 999999999999999999; }
    +  }
    +  // At this point, we know that exp_number is a sane, positive, signed integer.
    +  // It is <= 999,999,999,999,999,999. As long as 'exponent' is in
    +  // [-8223372036854775808, 8223372036854775808], we won't overflow. Because 'exponent'
    +  // is bounded in magnitude by the size of the JSON input, we are fine in this universe.
    +  // To sum it up: the next line should never overflow.
    +  exponent += (neg_exp ? -exp_number : exp_number);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline size_t significant_digits(const uint8_t * start_digits, size_t digit_count) {
    +  // It is possible that the integer had an overflow.
    +  // We have to handle the case where we have 0.0000somenumber.
    +  const uint8_t *start = start_digits;
    +  while ((*start == '0') || (*start == '.')) { ++start; }
    +  // we over-decrement by one when there is a '.'
    +  return digit_count - size_t(start - start_digits);
    +}
    +
    +} // unnamed namespace
    +
    +/** @private */
    +template
    +error_code slow_float_parsing(simdjson_unused const uint8_t * src, W writer) {
    +  double d;
    +  if (parse_float_fallback(src, &d)) {
    +    writer.append_double(d);
    +    return SUCCESS;
    +  }
    +  return INVALID_NUMBER(src);
    +}
    +
    +/** @private */
    +template
    +simdjson_inline error_code write_float(const uint8_t *const src, bool negative, uint64_t i, const uint8_t * start_digits, size_t digit_count, int64_t exponent, W &writer) {
    +  // If we frequently had to deal with long strings of digits,
    +  // we could extend our code by using a 128-bit integer instead
    +  // of a 64-bit integer. However, this is uncommon in practice.
    +  //
    +  // 9999999999999999999 < 2**64 so we can accommodate 19 digits.
    +  // If we have a decimal separator, then digit_count - 1 is the number of digits, but we
    +  // may not have a decimal separator!
    +  if (simdjson_unlikely(digit_count > 19 && significant_digits(start_digits, digit_count) > 19)) {
    +    // Ok, chances are good that we had an overflow!
    +    // this is almost never going to get called!!!
    +    // we start anew, going slowly!!!
    +    // This will happen in the following examples:
    +    // 10000000000000000000000000000000000000000000e+308
    +    // 3.1415926535897932384626433832795028841971693993751
    +    //
    +    // NOTE: This makes a *copy* of the writer and passes it to slow_float_parsing. This happens
    +    // because slow_float_parsing is a non-inlined function. If we passed our writer reference to
    +    // it, it would force it to be stored in memory, preventing the compiler from picking it apart
    +    // and putting into registers. i.e. if we pass it as reference, it gets slow.
    +    // This is what forces the skip_double, as well.
    +    error_code error = slow_float_parsing(src, writer);
    +    writer.skip_double();
    +    return error;
    +  }
    +  // NOTE: it's weird that the simdjson_unlikely() only wraps half the if, but it seems to get slower any other
    +  // way we've tried: https://github.com/simdjson/simdjson/pull/990#discussion_r448497331
    +  // To future reader: we'd love if someone found a better way, or at least could explain this result!
    +  if (simdjson_unlikely(exponent < simdjson::internal::smallest_power) || (exponent > simdjson::internal::largest_power)) {
    +    //
    +    // Important: smallest_power is such that it leads to a zero value.
    +    // Observe that 18446744073709551615e-343 == 0, i.e. (2**64 - 1) e -343 is zero
    +    // so something x 10^-343 goes to zero, but not so with  something x 10^-342.
    +    static_assert(simdjson::internal::smallest_power <= -342, "smallest_power is not small enough");
    +    //
    +    if((exponent < simdjson::internal::smallest_power) || (i == 0)) {
    +      // E.g. Parse "-0.0e-999" into the same value as "-0.0". See https://en.wikipedia.org/wiki/Signed_zero
    +      WRITE_DOUBLE(negative ? -0.0 : 0.0, src, writer);
    +      return SUCCESS;
    +    } else { // (exponent > largest_power) and (i != 0)
    +      // We have, for sure, an infinite value and simdjson refuses to parse infinite values.
    +      return INVALID_NUMBER(src);
    +    }
    +  }
    +  double d;
    +  if (!compute_float_64(exponent, i, negative, d)) {
    +    // we are almost never going to get here.
    +    if (!parse_float_fallback(src, &d)) { return INVALID_NUMBER(src); }
    +  }
    +  WRITE_DOUBLE(d, src, writer);
    +  return SUCCESS;
    +}
    +
    +// for performance analysis, it is sometimes  useful to skip parsing
    +#ifdef SIMDJSON_SKIPNUMBERPARSING
    +
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const, W &writer) {
    +  writer.append_s64(0);        // always write zero
    +  return SUCCESS;              // always succeeds
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept { return number_type::signed_integer; }
    +#else
    +
    +// parse the number at src
    +// define JSON_TEST_NUMBERS for unit testing
    +//
    +// It is assumed that the number is followed by a structural ({,},],[) character
    +// or a white space character. If that is not the case (e.g., when the JSON
    +// document is made of a single number), then it is necessary to copy the
    +// content and append a space before calling this function.
    +//
    +// Our objective is accurate parsing (ULP of 0) at high speed.
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) {
    +
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  if (digit_count == 0 || ('0' == *start_digits && digit_count > 1)) { return INVALID_NUMBER(src); }
    +
    +  //
    +  // Handle floats if there is a . or e (or both)
    +  //
    +  int64_t exponent = 0;
    +  bool is_float = false;
    +  if ('.' == *p) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_decimal_after_separator(src, p, i, exponent) );
    +    digit_count = int(p - start_digits); // used later to guard against overflows
    +  }
    +  if (('e' == *p) || ('E' == *p)) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_exponent(src, p, exponent) );
    +  }
    +  if (is_float) {
    +    const bool dirty_end = jsoncharutils::is_not_structural_or_whitespace(*p);
    +    SIMDJSON_TRY( write_float(src, negative, i, start_digits, digit_count, exponent, writer) );
    +    if (dirty_end) { return INVALID_NUMBER(src); }
    +    return SUCCESS;
    +  }
    +
    +  // The longest negative 64-bit number is 19 digits.
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  size_t longest_digit_count = negative ? 19 : 20;
    +  if (digit_count > longest_digit_count) { return INVALID_NUMBER(src); }
    +  if (digit_count == longest_digit_count) {
    +    if (negative) {
    +      // Anything negative above INT64_MAX+1 is invalid
    +      if (i > uint64_t(INT64_MAX)+1) { return INVALID_NUMBER(src);  }
    +      WRITE_INTEGER(~i+1, src, writer);
    +      if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +      return SUCCESS;
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    }  else if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INVALID_NUMBER(src); }
    +  }
    +
    +  // Write unsigned if it doesn't fit in a signed integer.
    +  if (i > uint64_t(INT64_MAX)) {
    +    WRITE_UNSIGNED(i, src, writer);
    +  } else {
    +    WRITE_INTEGER(negative ? (~i+1) : i, src, writer);
    +  }
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +  return SUCCESS;
    +}
    +
    +// Inlineable functions
    +namespace {
    +
    +// This table can be used to characterize the final character of an integer
    +// string. For JSON structural character and allowable white space characters,
    +// we return SUCCESS. For 'e', '.' and 'E', we return INCORRECT_TYPE. Otherwise
    +// we return NUMBER_ERROR.
    +// Optimization note: we could easily reduce the size of the table by half (to 128)
    +// at the cost of an extra branch.
    +// Optimization note: we want the values to use at most 8 bits (not, e.g., 32 bits):
    +static_assert(error_code(uint8_t(NUMBER_ERROR))== NUMBER_ERROR, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(SUCCESS))== SUCCESS, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(INCORRECT_TYPE))== INCORRECT_TYPE, "bad NUMBER_ERROR cast");
    +
    +const uint8_t integer_string_finisher[256] = {
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   SUCCESS,      NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, INCORRECT_TYPE,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, SUCCESS,        NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR};
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if ((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src + 1;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    // Note: we use src[1] and not src[0] because src[0] is the quote character in this
    +    // instance.
    +    if (src[1] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = src;
    +  uint64_t i = 0;
    +  while (parse_digit(*src, i)) { src++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(src - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*src)) {
    +  //  return (*src == '.' || *src == 'e' || *src == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(*src != '"') { return NUMBER_ERROR; }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept {
    +  return (*src == '-');
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) { return true; }
    +  return false;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) {
    +    // We have an integer.
    +    // If the number is negative and valid, it must be a signed integer.
    +    if(negative) { return number_type::signed_integer; }
    +    // We want values larger or equal to 9223372036854775808 to be unsigned
    +    // integers, and the other values to be signed integers.
    +    int digit_count = int(p - src);
    +    if(digit_count >= 19) {
    +      const uint8_t * smaller_big_integer = reinterpret_cast("9223372036854775808");
    +      if((digit_count >= 20) || (memcmp(src, smaller_big_integer, 19) >= 0)) {
    +        return number_type::unsigned_integer;
    +      }
    +    }
    +    return number_type::signed_integer;
    +  }
    +  // Hopefully, we have 'e' or 'E' or '.'.
    +  return number_type::floating_point_number;
    +}
    +
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src, const uint8_t * const src_end) noexcept {
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  if(p == src_end) { return NUMBER_ERROR; }
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely((p != src_end) && (*p == '.'))) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if ((p == src_end) || !parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = start_digits-src > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if ((p != src_end) && (*p == 'e' || *p == 'E')) {
    +    p++;
    +    if(p == src_end) { return NUMBER_ERROR; }
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while ((p != src_end) && parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if ((p != src_end) && jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), src_end, &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +} // unnamed namespace
    +#endif // SIMDJSON_SKIPNUMBERPARSING
    +
    +} // namespace numberparsing
    +
    +inline std::ostream& operator<<(std::ostream& out, number_type type) noexcept {
    +    switch (type) {
    +        case number_type::signed_integer: out << "integer in [-9223372036854775808,9223372036854775808)"; break;
    +        case number_type::unsigned_integer: out << "unsigned integer in [9223372036854775808,18446744073709551616)"; break;
    +        case number_type::floating_point_number: out << "floating-point number (binary64)"; break;
    +        default: SIMDJSON_UNREACHABLE();
    +    }
    +    return out;
    +}
    +
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_NUMBERPARSING_H
    +/* end file simdjson/generic/numberparsing.h for icelake */
    +
    +/* including simdjson/generic/implementation_simdjson_result_base-inl.h for icelake: #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base-inl.h for icelake */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +
    +//
    +// internal::implementation_simdjson_result_base inline implementation
    +//
    +
    +template
    +simdjson_inline void implementation_simdjson_result_base::tie(T &value, error_code &error) && noexcept {
    +  error = this->second;
    +  if (!error) {
    +    value = std::forward>(*this).first;
    +  }
    +}
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::get(T &value) && noexcept {
    +  error_code error;
    +  std::forward>(*this).tie(value, error);
    +  return error;
    +}
    +
    +template
    +simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept {
    +  return this->second;
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::take_value() && noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::operator T&&() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline const T& implementation_simdjson_result_base::value_unsafe() const& noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value_unsafe() & noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value_unsafe() && noexcept {
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value, error_code error) noexcept
    +    : first{std::forward(value)}, second{error} {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(error_code error) noexcept
    +    : implementation_simdjson_result_base(T{}, error) {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value), SUCCESS) {}
    +
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +/* end file simdjson/generic/implementation_simdjson_result_base-inl.h for icelake */
    +/* end file simdjson/generic/amalgamated.h for icelake */
    +/* including simdjson/icelake/end.h: #include "simdjson/icelake/end.h" */
    +/* begin file simdjson/icelake/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_ICELAKE
    +SIMDJSON_UNTARGET_REGION
    +#endif
    +
    +/* undefining SIMDJSON_IMPLEMENTATION from "icelake" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/icelake/end.h */
    +
    +#endif // SIMDJSON_ICELAKE_H
    +/* end file simdjson/icelake.h */
    +/* including simdjson/icelake/implementation.h: #include  */
    +/* begin file simdjson/icelake/implementation.h */
    +#ifndef SIMDJSON_ICELAKE_IMPLEMENTATION_H
    +#define SIMDJSON_ICELAKE_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/instruction_set.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_ICELAKE
    +namespace simdjson {
    +namespace icelake {
    +
    +/**
    + * @private
    + */
    +class implementation final : public simdjson::implementation {
    +public:
    +  simdjson_inline implementation() : simdjson::implementation(
    +      "icelake",
    +      "Intel/AMD AVX512",
    +      internal::instruction_set::AVX2 | internal::instruction_set::PCLMULQDQ | internal::instruction_set::BMI1 | internal::instruction_set::BMI2 | internal::instruction_set::AVX512F | internal::instruction_set::AVX512DQ | internal::instruction_set::AVX512CD | internal::instruction_set::AVX512BW | internal::instruction_set::AVX512VL | internal::instruction_set::AVX512VBMI2
    +  ) {}
    +  simdjson_warn_unused error_code create_dom_parser_implementation(
    +    size_t capacity,
    +    size_t max_length,
    +    std::unique_ptr& dst
    +  ) const noexcept final;
    +  simdjson_warn_unused error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept final;
    +  simdjson_warn_unused bool validate_utf8(const char *buf, size_t len) const noexcept final;
    +};
    +
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ICELAKE_IMPLEMENTATION_H
    +/* end file simdjson/icelake/implementation.h */
    +
    +// defining SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER allows us to provide our own bit_indexer::write
    +#define SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER
    +
    +/* including simdjson/icelake/begin.h: #include  */
    +/* begin file simdjson/icelake/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "icelake" */
    +#define SIMDJSON_IMPLEMENTATION icelake
    +/* including simdjson/icelake/base.h: #include "simdjson/icelake/base.h" */
    +/* begin file simdjson/icelake/base.h */
    +#ifndef SIMDJSON_ICELAKE_BASE_H
    +#define SIMDJSON_ICELAKE_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_ICELAKE
    +namespace simdjson {
    +/**
    + * Implementation for Icelake (Intel AVX512).
    + */
    +namespace icelake {
    +
    +class implementation;
    +
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ICELAKE_BASE_H
    +/* end file simdjson/icelake/base.h */
    +/* including simdjson/icelake/intrinsics.h: #include "simdjson/icelake/intrinsics.h" */
    +/* begin file simdjson/icelake/intrinsics.h */
    +#ifndef SIMDJSON_ICELAKE_INTRINSICS_H
    +#define SIMDJSON_ICELAKE_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if SIMDJSON_VISUAL_STUDIO
    +// under clang within visual studio, this will include 
    +#include   // visual studio or clang
    +#else
    +#include  // elsewhere
    +#endif // SIMDJSON_VISUAL_STUDIO
    +
    +#if SIMDJSON_CLANG_VISUAL_STUDIO
    +/**
    + * You are not supposed, normally, to include these
    + * headers directly. Instead you should either include intrin.h
    + * or x86intrin.h. However, when compiling with clang
    + * under Windows (i.e., when _MSC_VER is set), these headers
    + * only get included *if* the corresponding features are detected
    + * from macros:
    + * e.g., if __AVX2__ is set... in turn,  we normally set these
    + * macros by compiling against the corresponding architecture
    + * (e.g., arch:AVX2, -mavx2, etc.) which compiles the whole
    + * software with these advanced instructions. In simdjson, we
    + * want to compile the whole program for a generic target,
    + * and only target our specific kernels. As a workaround,
    + * we directly include the needed headers. These headers would
    + * normally guard against such usage, but we carefully included
    + *   (or ) before, so the headers
    + * are fooled.
    + */
    +#include    // for _blsr_u64
    +#include  // for  __lzcnt64
    +#include    // for most things (AVX2, AVX512, _popcnt64)
    +#include 
    +#include 
    +#include 
    +#include 
    +#include    // for  _mm_clmulepi64_si128
    +// Important: we need the AVX-512 headers:
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +// unfortunately, we may not get _blsr_u64, but, thankfully, clang
    +// has it as a macro.
    +#ifndef _blsr_u64
    +// we roll our own
    +#define _blsr_u64(n) ((n - 1) & n)
    +#endif //  _blsr_u64
    +#endif // SIMDJSON_CLANG_VISUAL_STUDIO
    +
    +static_assert(sizeof(__m512i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for icelake");
    +
    +#endif // SIMDJSON_ICELAKE_INTRINSICS_H
    +/* end file simdjson/icelake/intrinsics.h */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_ICELAKE
    +SIMDJSON_TARGET_REGION("avx512f,avx512dq,avx512cd,avx512bw,avx512vbmi,avx512vbmi2,avx512vl,avx2,bmi,pclmul,lzcnt,popcnt")
    +#endif
    +
    +/* including simdjson/icelake/bitmanipulation.h: #include "simdjson/icelake/bitmanipulation.h" */
    +/* begin file simdjson/icelake/bitmanipulation.h */
    +#ifndef SIMDJSON_ICELAKE_BITMANIPULATION_H
    +#define SIMDJSON_ICELAKE_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return (int)_tzcnt_u64(input_num);
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  ////////
    +  // You might expect the next line to be equivalent to
    +  // return (int)_tzcnt_u64(input_num);
    +  // but the generated code differs and might be less efficient?
    +  ////////
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return _blsr_u64(input_num);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +  return int(_lzcnt_u64(input_num));
    +}
    +
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +simdjson_inline unsigned __int64 count_ones(uint64_t input_num) {
    +  // note: we do not support legacy 32-bit Windows
    +  return __popcnt64(input_num);// Visual Studio wants two underscores
    +}
    +#else
    +simdjson_inline long long int count_ones(uint64_t input_num) {
    +  return _popcnt64(input_num);
    +}
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2,
    +                                uint64_t *result) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return _addcarry_u64(0, value1, value2,
    +                       reinterpret_cast(result));
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ICELAKE_BITMANIPULATION_H
    +/* end file simdjson/icelake/bitmanipulation.h */
    +/* including simdjson/icelake/bitmask.h: #include "simdjson/icelake/bitmask.h" */
    +/* begin file simdjson/icelake/bitmask.h */
    +#ifndef SIMDJSON_ICELAKE_BITMASK_H
    +#define SIMDJSON_ICELAKE_BITMASK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +
    +//
    +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered.
    +//
    +// For example, prefix_xor(00100100) == 00011100
    +//
    +simdjson_inline uint64_t prefix_xor(const uint64_t bitmask) {
    +  // There should be no such thing with a processor supporting avx2
    +  // but not clmul.
    +  __m128i all_ones = _mm_set1_epi8('\xFF');
    +  __m128i result = _mm_clmulepi64_si128(_mm_set_epi64x(0ULL, bitmask), all_ones, 0);
    +  return _mm_cvtsi128_si64(result);
    +}
    +
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ICELAKE_BITMASK_H
    +/* end file simdjson/icelake/bitmask.h */
    +/* including simdjson/icelake/simd.h: #include "simdjson/icelake/simd.h" */
    +/* begin file simdjson/icelake/simd.h */
    +#ifndef SIMDJSON_ICELAKE_SIMD_H
    +#define SIMDJSON_ICELAKE_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if defined(__GNUC__) && !defined(__clang__)
    +#if __GNUC__ == 8
    +#define SIMDJSON_GCC8 1
    +#endif //  __GNUC__ == 8
    +#endif // defined(__GNUC__) && !defined(__clang__)
    +
    +#if SIMDJSON_GCC8
    +/**
    + * GCC 8 fails to provide _mm512_set_epi8. We roll our own.
    + */
    +inline __m512i _mm512_set_epi8(uint8_t a0, uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4, uint8_t a5, uint8_t a6, uint8_t a7, uint8_t a8, uint8_t a9, uint8_t a10, uint8_t a11, uint8_t a12, uint8_t a13, uint8_t a14, uint8_t a15, uint8_t a16, uint8_t a17, uint8_t a18, uint8_t a19, uint8_t a20, uint8_t a21, uint8_t a22, uint8_t a23, uint8_t a24, uint8_t a25, uint8_t a26, uint8_t a27, uint8_t a28, uint8_t a29, uint8_t a30, uint8_t a31, uint8_t a32, uint8_t a33, uint8_t a34, uint8_t a35, uint8_t a36, uint8_t a37, uint8_t a38, uint8_t a39, uint8_t a40, uint8_t a41, uint8_t a42, uint8_t a43, uint8_t a44, uint8_t a45, uint8_t a46, uint8_t a47, uint8_t a48, uint8_t a49, uint8_t a50, uint8_t a51, uint8_t a52, uint8_t a53, uint8_t a54, uint8_t a55, uint8_t a56, uint8_t a57, uint8_t a58, uint8_t a59, uint8_t a60, uint8_t a61, uint8_t a62, uint8_t a63) {
    +  return _mm512_set_epi64(uint64_t(a7) + (uint64_t(a6) << 8) + (uint64_t(a5) << 16) + (uint64_t(a4) << 24) + (uint64_t(a3) << 32) + (uint64_t(a2) << 40) + (uint64_t(a1) << 48) + (uint64_t(a0) << 56),
    +                          uint64_t(a15) + (uint64_t(a14) << 8) + (uint64_t(a13) << 16) + (uint64_t(a12) << 24) + (uint64_t(a11) << 32) + (uint64_t(a10) << 40) + (uint64_t(a9) << 48) + (uint64_t(a8) << 56),
    +                          uint64_t(a23) + (uint64_t(a22) << 8) + (uint64_t(a21) << 16) + (uint64_t(a20) << 24) + (uint64_t(a19) << 32) + (uint64_t(a18) << 40) + (uint64_t(a17) << 48) + (uint64_t(a16) << 56),
    +                          uint64_t(a31) + (uint64_t(a30) << 8) + (uint64_t(a29) << 16) + (uint64_t(a28) << 24) + (uint64_t(a27) << 32) + (uint64_t(a26) << 40) + (uint64_t(a25) << 48) + (uint64_t(a24) << 56),
    +                          uint64_t(a39) + (uint64_t(a38) << 8) + (uint64_t(a37) << 16) + (uint64_t(a36) << 24) + (uint64_t(a35) << 32) + (uint64_t(a34) << 40) + (uint64_t(a33) << 48) + (uint64_t(a32) << 56),
    +                          uint64_t(a47) + (uint64_t(a46) << 8) + (uint64_t(a45) << 16) + (uint64_t(a44) << 24) + (uint64_t(a43) << 32) + (uint64_t(a42) << 40) + (uint64_t(a41) << 48) + (uint64_t(a40) << 56),
    +                          uint64_t(a55) + (uint64_t(a54) << 8) + (uint64_t(a53) << 16) + (uint64_t(a52) << 24) + (uint64_t(a51) << 32) + (uint64_t(a50) << 40) + (uint64_t(a49) << 48) + (uint64_t(a48) << 56),
    +                          uint64_t(a63) + (uint64_t(a62) << 8) + (uint64_t(a61) << 16) + (uint64_t(a60) << 24) + (uint64_t(a59) << 32) + (uint64_t(a58) << 40) + (uint64_t(a57) << 48) + (uint64_t(a56) << 56));
    +}
    +#endif // SIMDJSON_GCC8
    +
    +
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +namespace simd {
    +
    +  // Forward-declared so they can be used by splat and friends.
    +  template
    +  struct base {
    +    __m512i value;
    +
    +    // Zero constructor
    +    simdjson_inline base() : value{__m512i()} {}
    +
    +    // Conversion from SIMD register
    +    simdjson_inline base(const __m512i _value) : value(_value) {}
    +
    +    // Conversion to SIMD register
    +    simdjson_inline operator const __m512i&() const { return this->value; }
    +    simdjson_inline operator __m512i&() { return this->value; }
    +
    +    // Bit operations
    +    simdjson_inline Child operator|(const Child other) const { return _mm512_or_si512(*this, other); }
    +    simdjson_inline Child operator&(const Child other) const { return _mm512_and_si512(*this, other); }
    +    simdjson_inline Child operator^(const Child other) const { return _mm512_xor_si512(*this, other); }
    +    simdjson_inline Child bit_andnot(const Child other) const { return _mm512_andnot_si512(other, *this); }
    +    simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast | other; return *this_cast; }
    +    simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast & other; return *this_cast; }
    +    simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast ^ other; return *this_cast; }
    +  };
    +
    +  // Forward-declared so they can be used by splat and friends.
    +  template
    +  struct simd8;
    +
    +  template>
    +  struct base8: base> {
    +    typedef uint32_t bitmask_t;
    +    typedef uint64_t bitmask2_t;
    +
    +    simdjson_inline base8() : base>() {}
    +    simdjson_inline base8(const __m512i _value) : base>(_value) {}
    +
    +    friend simdjson_really_inline uint64_t operator==(const simd8 lhs, const simd8 rhs) {
    +      return _mm512_cmpeq_epi8_mask(lhs, rhs);
    +    }
    +
    +    static const int SIZE = sizeof(base::value);
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +     // workaround for compilers unable to figure out that 16 - N is a constant (GCC 8)
    +      constexpr int shift = 16 - N;
    +      return _mm512_alignr_epi8(*this, _mm512_permutex2var_epi64(prev_chunk, _mm512_set_epi64(13, 12, 11, 10, 9, 8, 7, 6), *this), shift);
    +    }
    +  };
    +
    +  // SIMD byte mask type (returned by things like eq and gt)
    +  template<>
    +  struct simd8: base8 {
    +    static simdjson_inline simd8 splat(bool _value) { return _mm512_set1_epi8(uint8_t(-(!!_value))); }
    +
    +    simdjson_inline simd8() : base8() {}
    +    simdjson_inline simd8(const __m512i _value) : base8(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(bool _value) : base8(splat(_value)) {}
    +    simdjson_inline bool any() const { return !!_mm512_test_epi8_mask (*this, *this); }
    +    simdjson_inline simd8 operator~() const { return *this ^ true; }
    +  };
    +
    +  template
    +  struct base8_numeric: base8 {
    +    static simdjson_inline simd8 splat(T _value) { return _mm512_set1_epi8(_value); }
    +    static simdjson_inline simd8 zero() { return _mm512_setzero_si512(); }
    +    static simdjson_inline simd8 load(const T values[64]) {
    +      return _mm512_loadu_si512(reinterpret_cast(values));
    +    }
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    static simdjson_inline simd8 repeat_16(
    +      T v0,  T v1,  T v2,  T v3,  T v4,  T v5,  T v6,  T v7,
    +      T v8,  T v9,  T v10, T v11, T v12, T v13, T v14, T v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    simdjson_inline base8_numeric() : base8() {}
    +    simdjson_inline base8_numeric(const __m512i _value) : base8(_value) {}
    +
    +    // Store to array
    +    simdjson_inline void store(T dst[64]) const { return _mm512_storeu_si512(reinterpret_cast<__m512i *>(dst), *this); }
    +
    +    // Addition/subtraction are the same for signed and unsigned
    +    simdjson_inline simd8 operator+(const simd8 other) const { return _mm512_add_epi8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return _mm512_sub_epi8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *static_cast*>(this); }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *static_cast*>(this); }
    +
    +    // Override to distinguish from bool version
    +    simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +
    +    // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values)
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return _mm512_shuffle_epi8(lookup_table, *this);
    +    }
    +
    +    // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset).
    +    // Passing a 0 value for mask would be equivalent to writing out every byte to output.
    +    // Only the first 32 - count_ones(mask) bytes of the result are significant but 32 bytes
    +    // get written.
    +    // Design consideration: it seems like a function with the
    +    // signature simd8 compress(uint32_t mask) would be
    +    // sensible, but the AVX ISA makes this kind of approach difficult.
    +    template
    +    simdjson_inline void compress(uint64_t mask, L * output) const {
    +      _mm512_mask_compressstoreu_epi8 (output,~mask,*this);
    +    }
    +
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +  };
    +
    +  // Signed bytes
    +  template<>
    +  struct simd8 : base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m512i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const int8_t values[64]) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15,
    +      int8_t v16, int8_t v17, int8_t v18, int8_t v19, int8_t v20, int8_t v21, int8_t v22, int8_t v23,
    +      int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, int8_t v30, int8_t v31,
    +      int8_t v32, int8_t v33, int8_t v34, int8_t v35, int8_t v36, int8_t v37, int8_t v38, int8_t v39,
    +      int8_t v40, int8_t v41, int8_t v42, int8_t v43, int8_t v44, int8_t v45, int8_t v46, int8_t v47,
    +      int8_t v48, int8_t v49, int8_t v50, int8_t v51, int8_t v52, int8_t v53, int8_t v54, int8_t v55,
    +      int8_t v56, int8_t v57, int8_t v58, int8_t v59, int8_t v60, int8_t v61, int8_t v62, int8_t v63
    +    ) : simd8(_mm512_set_epi8(
    +      v63, v62, v61, v60, v59, v58, v57, v56,
    +      v55, v54, v53, v52, v51, v50, v49, v48,
    +      v47, v46, v45, v44, v43, v42, v41, v40,
    +      v39, v38, v37, v36, v35, v34, v33, v32,
    +      v31, v30, v29, v28, v27, v26, v25, v24,
    +      v23, v22, v21, v20, v19, v18, v17, v16,
    +      v15, v14, v13, v12, v11, v10,  v9,  v8,
    +       v7,  v6,  v5,  v4,  v3,  v2,  v1,  v0
    +    )) {}
    +
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Order-sensitive comparisons
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm512_max_epi8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm512_min_epi8(*this, other); }
    +
    +    simdjson_inline simd8 operator>(const simd8 other) const { return _mm512_maskz_abs_epi8(_mm512_cmpgt_epi8_mask(*this, other),_mm512_set1_epi8(uint8_t(0x80))); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return _mm512_maskz_abs_epi8(_mm512_cmpgt_epi8_mask(other, *this),_mm512_set1_epi8(uint8_t(0x80))); }
    +  };
    +
    +  // Unsigned bytes
    +  template<>
    +  struct simd8: base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m512i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const uint8_t values[64]) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15,
    +      uint8_t v16, uint8_t v17, uint8_t v18, uint8_t v19, uint8_t v20, uint8_t v21, uint8_t v22, uint8_t v23,
    +      uint8_t v24, uint8_t v25, uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, uint8_t v31,
    +      uint8_t v32, uint8_t v33, uint8_t v34, uint8_t v35, uint8_t v36, uint8_t v37, uint8_t v38, uint8_t v39,
    +      uint8_t v40, uint8_t v41, uint8_t v42, uint8_t v43, uint8_t v44, uint8_t v45, uint8_t v46, uint8_t v47,
    +      uint8_t v48, uint8_t v49, uint8_t v50, uint8_t v51, uint8_t v52, uint8_t v53, uint8_t v54, uint8_t v55,
    +      uint8_t v56, uint8_t v57, uint8_t v58, uint8_t v59, uint8_t v60, uint8_t v61, uint8_t v62, uint8_t v63
    +    ) : simd8(_mm512_set_epi8(
    +      v63, v62, v61, v60, v59, v58, v57, v56,
    +      v55, v54, v53, v52, v51, v50, v49, v48,
    +      v47, v46, v45, v44, v43, v42, v41, v40,
    +      v39, v38, v37, v36, v35, v34, v33, v32,
    +      v31, v30, v29, v28, v27, v26, v25, v24,
    +      v23, v22, v21, v20, v19, v18, v17, v16,
    +      v15, v14, v13, v12, v11, v10,  v9,  v8,
    +       v7,  v6,  v5,  v4,  v3,  v2,  v1,  v0
    +    )) {}
    +
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Saturated math
    +    simdjson_inline simd8 saturating_add(const simd8 other) const { return _mm512_adds_epu8(*this, other); }
    +    simdjson_inline simd8 saturating_sub(const simd8 other) const { return _mm512_subs_epu8(*this, other); }
    +
    +    // Order-specific operations
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm512_max_epu8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm512_min_epu8(other, *this); }
    +    // Same as >, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 gt_bits(const simd8 other) const { return this->saturating_sub(other); }
    +    // Same as <, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 lt_bits(const simd8 other) const { return other.saturating_sub(*this); }
    +    simdjson_inline uint64_t operator<=(const simd8 other) const { return other.max_val(*this) == other; }
    +    simdjson_inline uint64_t operator>=(const simd8 other) const { return other.min_val(*this) == other; }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return this->lt_bits(other).any_bits_set(); }
    +
    +    // Bit-specific operations
    +    simdjson_inline simd8 bits_not_set() const { return _mm512_mask_blend_epi8(*this == uint8_t(0), _mm512_set1_epi8(0), _mm512_set1_epi8(-1)); }
    +    simdjson_inline simd8 bits_not_set(simd8 bits) const { return (*this & bits).bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set() const { return ~this->bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set(simd8 bits) const { return ~this->bits_not_set(bits); }
    +
    +    simdjson_inline bool is_ascii() const { return _mm512_movepi8_mask(*this) == 0; }
    +    simdjson_inline bool bits_not_set_anywhere() const {
    +      return !_mm512_test_epi8_mask(*this, *this);
    +    }
    +    simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); }
    +    simdjson_inline bool bits_not_set_anywhere(simd8 bits) const { return !_mm512_test_epi8_mask(*this, bits); }
    +    simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return !bits_not_set_anywhere(bits); }
    +    template
    +    simdjson_inline simd8 shr() const { return simd8(_mm512_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); }
    +    template
    +    simdjson_inline simd8 shl() const { return simd8(_mm512_slli_epi16(*this, N)) & uint8_t(0xFFu << N); }
    +    // Get one of the bits and make a bitmask out of it.
    +    // e.g. value.get_bit<7>() gets the high bit
    +    template
    +    simdjson_inline uint64_t get_bit() const { return _mm512_movepi8_mask(_mm512_slli_epi16(*this, 7-N)); }
    +  };
    +
    +  template
    +  struct simd8x64 {
    +    static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +    static_assert(NUM_CHUNKS == 1, "Icelake kernel should use one register per 64-byte block.");
    +    const simd8 chunks[NUM_CHUNKS];
    +
    +    simd8x64(const simd8x64& o) = delete; // no copy allowed
    +    simd8x64& operator=(const simd8& other) = delete; // no assignment allowed
    +    simd8x64() = delete; // no default constructor allowed
    +
    +    simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1) : chunks{chunk0, chunk1} {}
    +    simdjson_inline simd8x64(const simd8 chunk0) : chunks{chunk0} {}
    +    simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8::load(ptr)} {}
    +
    +    simdjson_inline uint64_t compress(uint64_t mask, T * output) const {
    +      this->chunks[0].compress(mask, output);
    +      return 64 - count_ones(mask);
    +    }
    +
    +    simdjson_inline void store(T ptr[64]) const {
    +      this->chunks[0].store(ptr+sizeof(simd8)*0);
    +    }
    +
    +    simdjson_inline simd8 reduce_or() const {
    +      return this->chunks[0];
    +    }
    +
    +    simdjson_inline simd8x64 bit_or(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return simd8x64(
    +        this->chunks[0] | mask
    +      );
    +    }
    +
    +    simdjson_inline uint64_t eq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return this->chunks[0] == mask;
    +    }
    +
    +    simdjson_inline uint64_t eq(const simd8x64 &other) const {
    +      return this->chunks[0] == other.chunks[0];
    +    }
    +
    +    simdjson_inline uint64_t lteq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return this->chunks[0] <= mask;
    +    }
    +  }; // struct simd8x64
    +
    +} // namespace simd
    +
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ICELAKE_SIMD_H
    +/* end file simdjson/icelake/simd.h */
    +/* including simdjson/icelake/stringparsing_defs.h: #include "simdjson/icelake/stringparsing_defs.h" */
    +/* begin file simdjson/icelake/stringparsing_defs.h */
    +#ifndef SIMDJSON_ICELAKE_STRINGPARSING_DEFS_H
    +#define SIMDJSON_ICELAKE_STRINGPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/simd.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +
    +using namespace simd;
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 64;
    +  simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; }
    +  simdjson_inline bool has_backslash() { return ((quote_bits - 1) & bs_bits) != 0; }
    +  simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); }
    +  simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); }
    +
    +  uint64_t bs_bits;
    +  uint64_t quote_bits;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // this can read up to 15 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes");
    +  simd8 v(src);
    +  // store to dest unconditionally - we can overwrite the bits we don't like later
    +  v.store(dst);
    +  return {
    +      static_cast(v == '\\'), // bs_bits
    +      static_cast(v == '"'), // quote_bits
    +  };
    +}
    +
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ICELAKE_STRINGPARSING_DEFS_H
    +/* end file simdjson/icelake/stringparsing_defs.h */
    +/* including simdjson/icelake/numberparsing_defs.h: #include "simdjson/icelake/numberparsing_defs.h" */
    +/* begin file simdjson/icelake/numberparsing_defs.h */
    +#ifndef SIMDJSON_ICELAKE_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_ICELAKE_NUMBERPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace numberparsing {
    +
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  // this actually computes *16* values so we are being wasteful.
    +  const __m128i ascii0 = _mm_set1_epi8('0');
    +  const __m128i mul_1_10 =
    +      _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1);
    +  const __m128i mul_1_100 = _mm_setr_epi16(100, 1, 100, 1, 100, 1, 100, 1);
    +  const __m128i mul_1_10000 =
    +      _mm_setr_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1);
    +  const __m128i input = _mm_sub_epi8(
    +      _mm_loadu_si128(reinterpret_cast(chars)), ascii0);
    +  const __m128i t1 = _mm_maddubs_epi16(input, mul_1_10);
    +  const __m128i t2 = _mm_madd_epi16(t1, mul_1_100);
    +  const __m128i t3 = _mm_packus_epi32(t2, t2);
    +  const __m128i t4 = _mm_madd_epi16(t3, mul_1_10000);
    +  return _mm_cvtsi128_si32(
    +      t4); // only captures the sum of the first 8 digits, drop the rest
    +}
    +
    +/** @private */
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif // SIMDJSON_ICELAKE_NUMBERPARSING_DEFS_H
    +/* end file simdjson/icelake/numberparsing_defs.h */
    +/* end file simdjson/icelake/begin.h */
    +/* including generic/amalgamated.h for icelake: #include  */
    +/* begin file generic/amalgamated.h for icelake */
    +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_SRC_GENERIC_DEPENDENCIES_H)
    +#error generic/dependencies.h must be included before generic/amalgamated.h!
    +#endif
    +
    +/* including generic/base.h for icelake: #include  */
    +/* begin file generic/base.h for icelake */
    +#ifndef SIMDJSON_SRC_GENERIC_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_BASE_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +
    +struct json_character_block;
    +
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_BASE_H
    +/* end file generic/base.h for icelake */
    +/* including generic/dom_parser_implementation.h for icelake: #include  */
    +/* begin file generic/dom_parser_implementation.h for icelake */
    +#ifndef SIMDJSON_SRC_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_DOM_PARSER_IMPLEMENTATION_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// Interface a dom parser implementation must fulfill
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +
    +simdjson_inline simd8 must_be_2_3_continuation(const simd8 prev2, const simd8 prev3);
    +simdjson_inline bool is_ascii(const simd8x64& input);
    +
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +/* end file generic/dom_parser_implementation.h for icelake */
    +/* including generic/json_character_block.h for icelake: #include  */
    +/* begin file generic/json_character_block.h for icelake */
    +#ifndef SIMDJSON_SRC_GENERIC_JSON_CHARACTER_BLOCK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_JSON_CHARACTER_BLOCK_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +
    +struct json_character_block {
    +  static simdjson_inline json_character_block classify(const simd::simd8x64& in);
    +
    +  simdjson_inline uint64_t whitespace() const noexcept { return _whitespace; }
    +  simdjson_inline uint64_t op() const noexcept { return _op; }
    +  simdjson_inline uint64_t scalar() const noexcept { return ~(op() | whitespace()); }
    +
    +  uint64_t _whitespace;
    +  uint64_t _op;
    +};
    +
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_JSON_CHARACTER_BLOCK_H
    +/* end file generic/json_character_block.h for icelake */
    +/* end file generic/amalgamated.h for icelake */
    +/* including generic/stage1/amalgamated.h for icelake: #include  */
    +/* begin file generic/stage1/amalgamated.h for icelake */
    +// Stuff other things depend on
    +/* including generic/stage1/base.h for icelake: #include  */
    +/* begin file generic/stage1/base.h for icelake */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_BASE_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +namespace stage1 {
    +
    +class bit_indexer;
    +template
    +struct buf_block_reader;
    +struct json_block;
    +class json_minifier;
    +class json_scanner;
    +struct json_string_block;
    +class json_string_scanner;
    +class json_structural_indexer;
    +
    +} // namespace stage1
    +
    +namespace utf8_validation {
    +struct utf8_checker;
    +} // namespace utf8_validation
    +
    +using utf8_validation::utf8_checker;
    +
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_BASE_H
    +/* end file generic/stage1/base.h for icelake */
    +/* including generic/stage1/buf_block_reader.h for icelake: #include  */
    +/* begin file generic/stage1/buf_block_reader.h for icelake */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_BUF_BLOCK_READER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_BUF_BLOCK_READER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +namespace stage1 {
    +
    +// Walks through a buffer in block-sized increments, loading the last part with spaces
    +template
    +struct buf_block_reader {
    +public:
    +  simdjson_inline buf_block_reader(const uint8_t *_buf, size_t _len);
    +  simdjson_inline size_t block_index();
    +  simdjson_inline bool has_full_block() const;
    +  simdjson_inline const uint8_t *full_block() const;
    +  /**
    +   * Get the last block, padded with spaces.
    +   *
    +   * There will always be a last block, with at least 1 byte, unless len == 0 (in which case this
    +   * function fills the buffer with spaces and returns 0. In particular, if len == STEP_SIZE there
    +   * will be 0 full_blocks and 1 remainder block with STEP_SIZE bytes and no spaces for padding.
    +   *
    +   * @return the number of effective characters in the last block.
    +   */
    +  simdjson_inline size_t get_remainder(uint8_t *dst) const;
    +  simdjson_inline void advance();
    +private:
    +  const uint8_t *buf;
    +  const size_t len;
    +  const size_t lenminusstep;
    +  size_t idx;
    +};
    +
    +// Routines to print masks and text for debugging bitmask operations
    +simdjson_unused static char * format_input_text_64(const uint8_t *text) {
    +  static char buf[sizeof(simd8x64) + 1];
    +  for (size_t i=0; i); i++) {
    +    buf[i] = int8_t(text[i]) < ' ' ? '_' : int8_t(text[i]);
    +  }
    +  buf[sizeof(simd8x64)] = '\0';
    +  return buf;
    +}
    +
    +// Routines to print masks and text for debugging bitmask operations
    +simdjson_unused static char * format_input_text(const simd8x64& in) {
    +  static char buf[sizeof(simd8x64) + 1];
    +  in.store(reinterpret_cast(buf));
    +  for (size_t i=0; i); i++) {
    +    if (buf[i] < ' ') { buf[i] = '_'; }
    +  }
    +  buf[sizeof(simd8x64)] = '\0';
    +  return buf;
    +}
    +
    +simdjson_unused static char * format_input_text(const simd8x64& in, uint64_t mask) {
    +  static char buf[sizeof(simd8x64) + 1];
    +  in.store(reinterpret_cast(buf));
    +  for (size_t i=0; i); i++) {
    +    if (buf[i] <= ' ') { buf[i] = '_'; }
    +    if (!(mask & (size_t(1) << i))) { buf[i] = ' '; }
    +  }
    +  buf[sizeof(simd8x64)] = '\0';
    +  return buf;
    +}
    +
    +simdjson_unused static char * format_mask(uint64_t mask) {
    +  static char buf[sizeof(simd8x64) + 1];
    +  for (size_t i=0; i<64; i++) {
    +    buf[i] = (mask & (size_t(1) << i)) ? 'X' : ' ';
    +  }
    +  buf[64] = '\0';
    +  return buf;
    +}
    +
    +template
    +simdjson_inline buf_block_reader::buf_block_reader(const uint8_t *_buf, size_t _len) : buf{_buf}, len{_len}, lenminusstep{len < STEP_SIZE ? 0 : len - STEP_SIZE}, idx{0} {}
    +
    +template
    +simdjson_inline size_t buf_block_reader::block_index() { return idx; }
    +
    +template
    +simdjson_inline bool buf_block_reader::has_full_block() const {
    +  return idx < lenminusstep;
    +}
    +
    +template
    +simdjson_inline const uint8_t *buf_block_reader::full_block() const {
    +  return &buf[idx];
    +}
    +
    +template
    +simdjson_inline size_t buf_block_reader::get_remainder(uint8_t *dst) const {
    +  if(len == idx) { return 0; } // memcpy(dst, null, 0) will trigger an error with some sanitizers
    +  std::memset(dst, 0x20, STEP_SIZE); // std::memset STEP_SIZE because it's more efficient to write out 8 or 16 bytes at once.
    +  std::memcpy(dst, buf + idx, len - idx);
    +  return len - idx;
    +}
    +
    +template
    +simdjson_inline void buf_block_reader::advance() {
    +  idx += STEP_SIZE;
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_BUF_BLOCK_READER_H
    +/* end file generic/stage1/buf_block_reader.h for icelake */
    +/* including generic/stage1/json_escape_scanner.h for icelake: #include  */
    +/* begin file generic/stage1/json_escape_scanner.h for icelake */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_ESCAPE_SCANNER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_ESCAPE_SCANNER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +namespace stage1 {
    +
    +/**
    + * Scans for escape characters in JSON, taking care with multiple backslashes (\\n vs. \n).
    + */
    +struct json_escape_scanner {
    +  /** The actual escape characters (the backslashes themselves). */
    +  uint64_t next_is_escaped = 0ULL;
    +
    +  struct escaped_and_escape {
    +    /**
    +     * Mask of escaped characters.
    +     *
    +     * ```
    +     * \n \\n \\\n \\\\n \
    +     * 0100100010100101000
    +     *  n  \   \ n  \ \
    +     * ```
    +     */
    +    uint64_t escaped;
    +    /**
    +     * Mask of escape characters.
    +     *
    +     * ```
    +     * \n \\n \\\n \\\\n \
    +     * 1001000101001010001
    +     * \  \   \ \  \ \   \
    +     * ```
    +     */
    +    uint64_t escape;
    +  };
    +
    +  /**
    +   * Get a mask of both escape and escaped characters (the characters following a backslash).
    +   *
    +   * @param potential_escape A mask of the character that can escape others (but could be
    +   *        escaped itself). e.g. block.eq('\\')
    +   */
    +  simdjson_really_inline escaped_and_escape next(uint64_t backslash) noexcept {
    +
    +#if !SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT
    +    if (!backslash) { return {next_escaped_without_backslashes(), 0}; }
    +#endif
    +
    +    // |                                | Mask (shows characters instead of 1's) | Depth | Instructions        |
    +    // |--------------------------------|----------------------------------------|-------|---------------------|
    +    // | string                         | `\\n_\\\n___\\\n___\\\\___\\\\__\\\`   |       |                     |
    +    // |                                | `    even   odd    even   odd   odd`   |       |                     |
    +    // | potential_escape               | ` \  \\\    \\\    \\\\   \\\\  \\\`   | 1     | 1 (backslash & ~first_is_escaped)
    +    // | escape_and_terminal_code       | ` \n \ \n   \ \n   \ \    \ \   \ \`   | 5     | 5 (next_escape_and_terminal_code())
    +    // | escaped                        | `\    \ n    \ n    \ \    \ \   \ ` X | 6     | 7 (escape_and_terminal_code ^ (potential_escape | first_is_escaped))
    +    // | escape                         | `    \ \    \ \    \ \    \ \   \ \`   | 6     | 8 (escape_and_terminal_code & backslash)
    +    // | first_is_escaped               | `\                                 `   | 7 (*) | 9 (escape >> 63) ()
    +    //                                                                               (*) this is not needed until the next iteration
    +    uint64_t escape_and_terminal_code = next_escape_and_terminal_code(backslash & ~this->next_is_escaped);
    +    uint64_t escaped = escape_and_terminal_code ^ (backslash | this->next_is_escaped);
    +    uint64_t escape = escape_and_terminal_code & backslash;
    +    this->next_is_escaped = escape >> 63;
    +    return {escaped, escape};
    +  }
    +
    +private:
    +  static constexpr const uint64_t ODD_BITS = 0xAAAAAAAAAAAAAAAAULL;
    +
    +  simdjson_really_inline uint64_t next_escaped_without_backslashes() noexcept {
    +    uint64_t escaped = this->next_is_escaped;
    +    this->next_is_escaped = 0;
    +    return escaped;
    +  }
    +
    +  /**
    +   * Returns a mask of the next escape characters (masking out escaped backslashes), along with
    +   * any non-backslash escape codes.
    +   *
    +   * \n \\n \\\n \\\\n returns:
    +   * \n \   \ \n \ \
    +   * 11 100 1011 10100
    +   *
    +   * You are expected to mask out the first bit yourself if the previous block had a trailing
    +   * escape.
    +   *
    +   * & the result with potential_escape to get just the escape characters.
    +   * ^ the result with (potential_escape | first_is_escaped) to get escaped characters.
    +   */
    +  static simdjson_really_inline uint64_t next_escape_and_terminal_code(uint64_t potential_escape) noexcept {
    +    // If we were to just shift and mask out any odd bits, we'd actually get a *half* right answer:
    +    // any even-aligned backslash runs would be correct! Odd-aligned backslash runs would be
    +    // inverted (\\\ would be 010 instead of 101).
    +    //
    +    // ```
    +    // string:              | ____\\\\_\\\\_____ |
    +    // maybe_escaped | ODD  |     \ \   \ \      |
    +    //               even-aligned ^^^  ^^^^ odd-aligned
    +    // ```
    +    //
    +    // Taking that into account, our basic strategy is:
    +    //
    +    // 1. Use subtraction to produce a mask with 1's for even-aligned runs and 0's for
    +    //    odd-aligned runs.
    +    // 2. XOR all odd bits, which masks out the odd bits in even-aligned runs, and brings IN the
    +    //    odd bits in odd-aligned runs.
    +    // 3. & with backslash to clean up any stray bits.
    +    // runs are set to 0, and then XORing with "odd":
    +    //
    +    // |                                | Mask (shows characters instead of 1's) | Instructions        |
    +    // |--------------------------------|----------------------------------------|---------------------|
    +    // | string                         | `\\n_\\\n___\\\n___\\\\___\\\\__\\\`   |
    +    // |                                | `    even   odd    even   odd   odd`   |
    +    // | maybe_escaped                  | `  n  \\n    \\n    \\\_   \\\_  \\` X | 1 (potential_escape << 1)
    +    // | maybe_escaped_and_odd          | ` \n_ \\n _ \\\n_ _ \\\__ _\\\_ \\\`   | 1 (maybe_escaped | odd)
    +    // | even_series_codes_and_odd      | `  n_\\\  _    n_ _\\\\ _     _    `   | 1 (maybe_escaped_and_odd - potential_escape)
    +    // | escape_and_terminal_code       | ` \n \ \n   \ \n   \ \    \ \   \ \`   | 1 (^ odd)
    +    //
    +
    +    // Escaped characters are characters following an escape.
    +    uint64_t maybe_escaped = potential_escape << 1;
    +
    +    // To distinguish odd from even escape sequences, therefore, we turn on any *starting*
    +    // escapes that are on an odd byte. (We actually bring in all odd bits, for speed.)
    +    // - Odd runs of backslashes are 0000, and the code at the end ("n" in \n or \\n) is 1.
    +    // - Odd runs of backslashes are 1111, and the code at the end ("n" in \n or \\n) is 0.
    +    // - All other odd bytes are 1, and even bytes are 0.
    +    uint64_t maybe_escaped_and_odd_bits     = maybe_escaped | ODD_BITS;
    +    uint64_t even_series_codes_and_odd_bits = maybe_escaped_and_odd_bits - potential_escape;
    +
    +    // Now we flip all odd bytes back with xor. This:
    +    // - Makes odd runs of backslashes go from 0000 to 1010
    +    // - Makes even runs of backslashes go from 1111 to 1010
    +    // - Sets actually-escaped codes to 1 (the n in \n and \\n: \n = 11, \\n = 100)
    +    // - Resets all other bytes to 0
    +    return even_series_codes_and_odd_bits ^ ODD_BITS;
    +  }
    +};
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H
    +/* end file generic/stage1/json_escape_scanner.h for icelake */
    +/* including generic/stage1/json_string_scanner.h for icelake: #include  */
    +/* begin file generic/stage1/json_string_scanner.h for icelake */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +namespace stage1 {
    +
    +struct json_string_block {
    +  // We spell out the constructors in the hope of resolving inlining issues with Visual Studio 2017
    +  simdjson_really_inline json_string_block(uint64_t escaped, uint64_t quote, uint64_t in_string) :
    +  _escaped(escaped), _quote(quote), _in_string(in_string) {}
    +
    +  // Escaped characters (characters following an escape() character)
    +  simdjson_really_inline uint64_t escaped() const { return _escaped; }
    +  // Real (non-backslashed) quotes
    +  simdjson_really_inline uint64_t quote() const { return _quote; }
    +  // Only characters inside the string (not including the quotes)
    +  simdjson_really_inline uint64_t string_content() const { return _in_string & ~_quote; }
    +  // Return a mask of whether the given characters are inside a string (only works on non-quotes)
    +  simdjson_really_inline uint64_t non_quote_inside_string(uint64_t mask) const { return mask & _in_string; }
    +  // Return a mask of whether the given characters are inside a string (only works on non-quotes)
    +  simdjson_really_inline uint64_t non_quote_outside_string(uint64_t mask) const { return mask & ~_in_string; }
    +  // Tail of string (everything except the start quote)
    +  simdjson_really_inline uint64_t string_tail() const { return _in_string ^ _quote; }
    +
    +  // escaped characters (backslashed--does not include the hex characters after \u)
    +  uint64_t _escaped;
    +  // real quotes (non-escaped ones)
    +  uint64_t _quote;
    +  // string characters (includes start quote but not end quote)
    +  uint64_t _in_string;
    +};
    +
    +// Scans blocks for string characters, storing the state necessary to do so
    +class json_string_scanner {
    +public:
    +  simdjson_really_inline json_string_block next(const simd::simd8x64& in);
    +  // Returns either UNCLOSED_STRING or SUCCESS
    +  simdjson_really_inline error_code finish();
    +
    +private:
    +  // Scans for escape characters
    +  json_escape_scanner escape_scanner{};
    +  // Whether the last iteration was still inside a string (all 1's = true, all 0's = false).
    +  uint64_t prev_in_string = 0ULL;
    +};
    +
    +//
    +// Return a mask of all string characters plus end quotes.
    +//
    +// prev_escaped is overflow saying whether the next character is escaped.
    +// prev_in_string is overflow saying whether we're still in a string.
    +//
    +// Backslash sequences outside of quotes will be detected in stage 2.
    +//
    +simdjson_really_inline json_string_block json_string_scanner::next(const simd::simd8x64& in) {
    +  const uint64_t backslash = in.eq('\\');
    +  const uint64_t escaped = escape_scanner.next(backslash).escaped;
    +  const uint64_t quote = in.eq('"') & ~escaped;
    +
    +  //
    +  // prefix_xor flips on bits inside the string (and flips off the end quote).
    +  //
    +  // Then we xor with prev_in_string: if we were in a string already, its effect is flipped
    +  // (characters inside strings are outside, and characters outside strings are inside).
    +  //
    +  const uint64_t in_string = prefix_xor(quote) ^ prev_in_string;
    +
    +  //
    +  // Check if we're still in a string at the end of the box so the next block will know
    +  //
    +  prev_in_string = uint64_t(static_cast(in_string) >> 63);
    +
    +  // Use ^ to turn the beginning quote off, and the end quote on.
    +
    +  // We are returning a function-local object so either we get a move constructor
    +  // or we get copy elision.
    +  return json_string_block(escaped, quote, in_string);
    +}
    +
    +simdjson_really_inline error_code json_string_scanner::finish() {
    +  if (prev_in_string) {
    +    return UNCLOSED_STRING;
    +  }
    +  return SUCCESS;
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H
    +/* end file generic/stage1/json_string_scanner.h for icelake */
    +/* including generic/stage1/utf8_lookup4_algorithm.h for icelake: #include  */
    +/* begin file generic/stage1/utf8_lookup4_algorithm.h for icelake */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_UTF8_LOOKUP4_ALGORITHM_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_UTF8_LOOKUP4_ALGORITHM_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +namespace utf8_validation {
    +
    +using namespace simd;
    +
    +  simdjson_inline simd8 check_special_cases(const simd8 input, const simd8 prev1) {
    +// Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII)
    +// Bit 1 = Too Long (ASCII followed by continuation)
    +// Bit 2 = Overlong 3-byte
    +// Bit 4 = Surrogate
    +// Bit 5 = Overlong 2-byte
    +// Bit 7 = Two Continuations
    +    constexpr const uint8_t TOO_SHORT   = 1<<0; // 11______ 0_______
    +                                                // 11______ 11______
    +    constexpr const uint8_t TOO_LONG    = 1<<1; // 0_______ 10______
    +    constexpr const uint8_t OVERLONG_3  = 1<<2; // 11100000 100_____
    +    constexpr const uint8_t SURROGATE   = 1<<4; // 11101101 101_____
    +    constexpr const uint8_t OVERLONG_2  = 1<<5; // 1100000_ 10______
    +    constexpr const uint8_t TWO_CONTS   = 1<<7; // 10______ 10______
    +    constexpr const uint8_t TOO_LARGE   = 1<<3; // 11110100 1001____
    +                                                // 11110100 101_____
    +                                                // 11110101 1001____
    +                                                // 11110101 101_____
    +                                                // 1111011_ 1001____
    +                                                // 1111011_ 101_____
    +                                                // 11111___ 1001____
    +                                                // 11111___ 101_____
    +    constexpr const uint8_t TOO_LARGE_1000 = 1<<6;
    +                                                // 11110101 1000____
    +                                                // 1111011_ 1000____
    +                                                // 11111___ 1000____
    +    constexpr const uint8_t OVERLONG_4  = 1<<6; // 11110000 1000____
    +
    +    const simd8 byte_1_high = prev1.shr<4>().lookup_16(
    +      // 0_______ ________ 
    +      TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG,
    +      TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG,
    +      // 10______ ________ 
    +      TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS,
    +      // 1100____ ________ 
    +      TOO_SHORT | OVERLONG_2,
    +      // 1101____ ________ 
    +      TOO_SHORT,
    +      // 1110____ ________ 
    +      TOO_SHORT | OVERLONG_3 | SURROGATE,
    +      // 1111____ ________ 
    +      TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4
    +    );
    +    constexpr const uint8_t CARRY = TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 .
    +    const simd8 byte_1_low = (prev1 & 0x0F).lookup_16(
    +      // ____0000 ________
    +      CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4,
    +      // ____0001 ________
    +      CARRY | OVERLONG_2,
    +      // ____001_ ________
    +      CARRY,
    +      CARRY,
    +
    +      // ____0100 ________
    +      CARRY | TOO_LARGE,
    +      // ____0101 ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      // ____011_ ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +
    +      // ____1___ ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      // ____1101 ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000
    +    );
    +    const simd8 byte_2_high = input.shr<4>().lookup_16(
    +      // ________ 0_______ 
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT,
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT,
    +
    +      // ________ 1000____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | OVERLONG_4,
    +      // ________ 1001____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE,
    +      // ________ 101_____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE  | TOO_LARGE,
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE  | TOO_LARGE,
    +
    +      // ________ 11______
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT
    +    );
    +    return (byte_1_high & byte_1_low & byte_2_high);
    +  }
    +  simdjson_inline simd8 check_multibyte_lengths(const simd8 input,
    +      const simd8 prev_input, const simd8 sc) {
    +    simd8 prev2 = input.prev<2>(prev_input);
    +    simd8 prev3 = input.prev<3>(prev_input);
    +    simd8 must23 = simd8(must_be_2_3_continuation(prev2, prev3));
    +    simd8 must23_80 = must23 & uint8_t(0x80);
    +    return must23_80 ^ sc;
    +  }
    +
    +  //
    +  // Return nonzero if there are incomplete multibyte characters at the end of the block:
    +  // e.g. if there is a 4-byte character, but it's 3 bytes from the end.
    +  //
    +  simdjson_inline simd8 is_incomplete(const simd8 input) {
    +    // If the previous input's last 3 bytes match this, they're too short (they ended at EOF):
    +    // ... 1111____ 111_____ 11______
    +#if SIMDJSON_IMPLEMENTATION_ICELAKE
    +    static const uint8_t max_array[64] = {
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 0xf0u-1, 0xe0u-1, 0xc0u-1
    +    };
    +#else
    +    static const uint8_t max_array[32] = {
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 0xf0u-1, 0xe0u-1, 0xc0u-1
    +    };
    +#endif
    +    const simd8 max_value(&max_array[sizeof(max_array)-sizeof(simd8)]);
    +    return input.gt_bits(max_value);
    +  }
    +
    +  struct utf8_checker {
    +    // If this is nonzero, there has been a UTF-8 error.
    +    simd8 error;
    +    // The last input we received
    +    simd8 prev_input_block;
    +    // Whether the last input we received was incomplete (used for ASCII fast path)
    +    simd8 prev_incomplete;
    +
    +    //
    +    // Check whether the current bytes are valid UTF-8.
    +    //
    +    simdjson_inline void check_utf8_bytes(const simd8 input, const simd8 prev_input) {
    +      // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ lead bytes
    +      // (2, 3, 4-byte leads become large positive numbers instead of small negative numbers)
    +      simd8 prev1 = input.prev<1>(prev_input);
    +      simd8 sc = check_special_cases(input, prev1);
    +      this->error |= check_multibyte_lengths(input, prev_input, sc);
    +    }
    +
    +    // The only problem that can happen at EOF is that a multibyte character is too short
    +    // or a byte value too large in the last bytes: check_special_cases only checks for bytes
    +    // too large in the first of two bytes.
    +    simdjson_inline void check_eof() {
    +      // If the previous block had incomplete UTF-8 characters at the end, an ASCII block can't
    +      // possibly finish them.
    +      this->error |= this->prev_incomplete;
    +    }
    +
    +    simdjson_inline void check_next_input(const simd8x64& input) {
    +      if(simdjson_likely(is_ascii(input))) {
    +        this->error |= this->prev_incomplete;
    +      } else {
    +        // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    +        static_assert((simd8x64::NUM_CHUNKS == 1)
    +                ||(simd8x64::NUM_CHUNKS == 2)
    +                || (simd8x64::NUM_CHUNKS == 4),
    +                "We support one, two or four chunks per 64-byte block.");
    +        SIMDJSON_IF_CONSTEXPR (simd8x64::NUM_CHUNKS == 1) {
    +          this->check_utf8_bytes(input.chunks[0], this->prev_input_block);
    +        } else SIMDJSON_IF_CONSTEXPR (simd8x64::NUM_CHUNKS == 2) {
    +          this->check_utf8_bytes(input.chunks[0], this->prev_input_block);
    +          this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +        } else SIMDJSON_IF_CONSTEXPR (simd8x64::NUM_CHUNKS == 4) {
    +          this->check_utf8_bytes(input.chunks[0], this->prev_input_block);
    +          this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +          this->check_utf8_bytes(input.chunks[2], input.chunks[1]);
    +          this->check_utf8_bytes(input.chunks[3], input.chunks[2]);
    +        }
    +        this->prev_incomplete = is_incomplete(input.chunks[simd8x64::NUM_CHUNKS-1]);
    +        this->prev_input_block = input.chunks[simd8x64::NUM_CHUNKS-1];
    +      }
    +    }
    +    // do not forget to call check_eof!
    +    simdjson_inline error_code errors() {
    +      return this->error.any_bits_set_anywhere() ? error_code::UTF8_ERROR : error_code::SUCCESS;
    +    }
    +
    +  }; // struct utf8_checker
    +} // namespace utf8_validation
    +
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_UTF8_LOOKUP4_ALGORITHM_H
    +/* end file generic/stage1/utf8_lookup4_algorithm.h for icelake */
    +/* including generic/stage1/json_scanner.h for icelake: #include  */
    +/* begin file generic/stage1/json_scanner.h for icelake */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_SCANNER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_SCANNER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +namespace stage1 {
    +
    +/**
    + * A block of scanned json, with information on operators and scalars.
    + *
    + * We seek to identify pseudo-structural characters. Anything that is inside
    + * a string must be omitted (hence  & ~_string.string_tail()).
    + * Otherwise, pseudo-structural characters come in two forms.
    + * 1. We have the structural characters ([,],{,},:, comma). The
    + *    term 'structural character' is from the JSON RFC.
    + * 2. We have the 'scalar pseudo-structural characters'.
    + *    Scalars are quotes, and any character except structural characters and white space.
    + *
    + * To identify the scalar pseudo-structural characters, we must look at what comes
    + * before them: it must be a space, a quote or a structural characters.
    + * Starting with simdjson v0.3, we identify them by
    + * negation: we identify everything that is followed by a non-quote scalar,
    + * and we negate that. Whatever remains must be a 'scalar pseudo-structural character'.
    + */
    +struct json_block {
    +public:
    +  // We spell out the constructors in the hope of resolving inlining issues with Visual Studio 2017
    +  simdjson_inline json_block(json_string_block&& string, json_character_block characters, uint64_t follows_potential_nonquote_scalar) :
    +  _string(std::move(string)), _characters(characters), _follows_potential_nonquote_scalar(follows_potential_nonquote_scalar) {}
    +  simdjson_inline json_block(json_string_block string, json_character_block characters, uint64_t follows_potential_nonquote_scalar) :
    +  _string(string), _characters(characters), _follows_potential_nonquote_scalar(follows_potential_nonquote_scalar) {}
    +
    +  /**
    +   * The start of structurals.
    +   * In simdjson prior to v0.3, these were called the pseudo-structural characters.
    +   **/
    +  simdjson_inline uint64_t structural_start() const noexcept { return potential_structural_start() & ~_string.string_tail(); }
    +  /** All JSON whitespace (i.e. not in a string) */
    +  simdjson_inline uint64_t whitespace() const noexcept { return non_quote_outside_string(_characters.whitespace()); }
    +
    +  // Helpers
    +
    +  /** Whether the given characters are inside a string (only works on non-quotes) */
    +  simdjson_inline uint64_t non_quote_inside_string(uint64_t mask) const noexcept { return _string.non_quote_inside_string(mask); }
    +  /** Whether the given characters are outside a string (only works on non-quotes) */
    +  simdjson_inline uint64_t non_quote_outside_string(uint64_t mask) const noexcept { return _string.non_quote_outside_string(mask); }
    +
    +  // string and escape characters
    +  json_string_block _string;
    +  // whitespace, structural characters ('operators'), scalars
    +  json_character_block _characters;
    +  // whether the previous character was a scalar
    +  uint64_t _follows_potential_nonquote_scalar;
    +private:
    +  // Potential structurals (i.e. disregarding strings)
    +
    +  /**
    +   * structural elements ([,],{,},:, comma) plus scalar starts like 123, true and "abc".
    +   * They may reside inside a string.
    +   **/
    +  simdjson_inline uint64_t potential_structural_start() const noexcept { return _characters.op() | potential_scalar_start(); }
    +  /**
    +   * The start of non-operator runs, like 123, true and "abc".
    +   * It main reside inside a string.
    +   **/
    +  simdjson_inline uint64_t potential_scalar_start() const noexcept {
    +    // The term "scalar" refers to anything except structural characters and white space
    +    // (so letters, numbers, quotes).
    +    // Whenever it is preceded by something that is not a structural element ({,},[,],:, ") nor a white-space
    +    // then we know that it is irrelevant structurally.
    +    return _characters.scalar() & ~follows_potential_scalar();
    +  }
    +  /**
    +   * Whether the given character is immediately after a non-operator like 123, true.
    +   * The characters following a quote are not included.
    +   */
    +  simdjson_inline uint64_t follows_potential_scalar() const noexcept {
    +    // _follows_potential_nonquote_scalar: is defined as marking any character that follows a character
    +    // that is not a structural element ({,},[,],:, comma) nor a quote (") and that is not a
    +    // white space.
    +    // It is understood that within quoted region, anything at all could be marked (irrelevant).
    +    return _follows_potential_nonquote_scalar;
    +  }
    +};
    +
    +/**
    + * Scans JSON for important bits: structural characters or 'operators', strings, and scalars.
    + *
    + * The scanner starts by calculating two distinct things:
    + * - string characters (taking \" into account)
    + * - structural characters or 'operators' ([]{},:, comma)
    + *   and scalars (runs of non-operators like 123, true and "abc")
    + *
    + * To minimize data dependency (a key component of the scanner's speed), it finds these in parallel:
    + * in particular, the operator/scalar bit will find plenty of things that are actually part of
    + * strings. When we're done, json_block will fuse the two together by masking out tokens that are
    + * part of a string.
    + */
    +class json_scanner {
    +public:
    +  json_scanner() = default;
    +  simdjson_inline json_block next(const simd::simd8x64& in);
    +  // Returns either UNCLOSED_STRING or SUCCESS
    +  simdjson_inline error_code finish();
    +
    +private:
    +  // Whether the last character of the previous iteration is part of a scalar token
    +  // (anything except whitespace or a structural character/'operator').
    +  uint64_t prev_scalar = 0ULL;
    +  json_string_scanner string_scanner{};
    +};
    +
    +
    +//
    +// Check if the current character immediately follows a matching character.
    +//
    +// For example, this checks for quotes with backslashes in front of them:
    +//
    +//     const uint64_t backslashed_quote = in.eq('"') & immediately_follows(in.eq('\'), prev_backslash);
    +//
    +simdjson_inline uint64_t follows(const uint64_t match, uint64_t &overflow) {
    +  const uint64_t result = match << 1 | overflow;
    +  overflow = match >> 63;
    +  return result;
    +}
    +
    +simdjson_inline json_block json_scanner::next(const simd::simd8x64& in) {
    +  json_string_block strings = string_scanner.next(in);
    +  // identifies the white-space and the structural characters
    +  json_character_block characters = json_character_block::classify(in);
    +  // The term "scalar" refers to anything except structural characters and white space
    +  // (so letters, numbers, quotes).
    +  // We want follows_scalar to mark anything that follows a non-quote scalar (so letters and numbers).
    +  //
    +  // A terminal quote should either be followed by a structural character (comma, brace, bracket, colon)
    +  // or nothing. However, we still want ' "a string"true ' to mark the 't' of 'true' as a potential
    +  // pseudo-structural character just like we would if we had  ' "a string" true '; otherwise we
    +  // may need to add an extra check when parsing strings.
    +  //
    +  // Performance: there are many ways to skin this cat.
    +  const uint64_t nonquote_scalar = characters.scalar() & ~strings.quote();
    +  uint64_t follows_nonquote_scalar = follows(nonquote_scalar, prev_scalar);
    +  // We are returning a function-local object so either we get a move constructor
    +  // or we get copy elision.
    +  return json_block(
    +    strings,// strings is a function-local object so either it moves or the copy is elided.
    +    characters,
    +    follows_nonquote_scalar
    +  );
    +}
    +
    +simdjson_inline error_code json_scanner::finish() {
    +  return string_scanner.finish();
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_SCANNER_H
    +/* end file generic/stage1/json_scanner.h for icelake */
    +
    +// All other declarations
    +/* including generic/stage1/find_next_document_index.h for icelake: #include  */
    +/* begin file generic/stage1/find_next_document_index.h for icelake */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +namespace stage1 {
    +
    +/**
    +  * This algorithm is used to quickly identify the last structural position that
    +  * makes up a complete document.
    +  *
    +  * It does this by going backwards and finding the last *document boundary* (a
    +  * place where one value follows another without a comma between them). If the
    +  * last document (the characters after the boundary) has an equal number of
    +  * start and end brackets, it is considered complete.
    +  *
    +  * Simply put, we iterate over the structural characters, starting from
    +  * the end. We consider that we found the end of a JSON document when the
    +  * first element of the pair is NOT one of these characters: '{' '[' ':' ','
    +  * and when the second element is NOT one of these characters: '}' ']' ':' ','.
    +  *
    +  * This simple comparison works most of the time, but it does not cover cases
    +  * where the batch's structural indexes contain a perfect amount of documents.
    +  * In such a case, we do not have access to the structural index which follows
    +  * the last document, therefore, we do not have access to the second element in
    +  * the pair, and that means we cannot identify the last document. To fix this
    +  * issue, we keep a count of the open and closed curly/square braces we found
    +  * while searching for the pair. When we find a pair AND the count of open and
    +  * closed curly/square braces is the same, we know that we just passed a
    +  * complete document, therefore the last json buffer location is the end of the
    +  * batch.
    +  */
    +simdjson_inline uint32_t find_next_document_index(dom_parser_implementation &parser) {
    +  // Variant: do not count separately, just figure out depth
    +  if(parser.n_structural_indexes == 0) { return 0; }
    +  auto arr_cnt = 0;
    +  auto obj_cnt = 0;
    +  for (auto i = parser.n_structural_indexes - 1; i > 0; i--) {
    +    auto idxb = parser.structural_indexes[i];
    +    switch (parser.buf[idxb]) {
    +    case ':':
    +    case ',':
    +      continue;
    +    case '}':
    +      obj_cnt--;
    +      continue;
    +    case ']':
    +      arr_cnt--;
    +      continue;
    +    case '{':
    +      obj_cnt++;
    +      break;
    +    case '[':
    +      arr_cnt++;
    +      break;
    +    }
    +    auto idxa = parser.structural_indexes[i - 1];
    +    switch (parser.buf[idxa]) {
    +    case '{':
    +    case '[':
    +    case ':':
    +    case ',':
    +      continue;
    +    }
    +    // Last document is complete, so the next document will appear after!
    +    if (!arr_cnt && !obj_cnt) {
    +      return parser.n_structural_indexes;
    +    }
    +    // Last document is incomplete; mark the document at i + 1 as the next one
    +    return i;
    +  }
    +  // If we made it to the end, we want to finish counting to see if we have a full document.
    +  switch (parser.buf[parser.structural_indexes[0]]) {
    +    case '}':
    +      obj_cnt--;
    +      break;
    +    case ']':
    +      arr_cnt--;
    +      break;
    +    case '{':
    +      obj_cnt++;
    +      break;
    +    case '[':
    +      arr_cnt++;
    +      break;
    +  }
    +  if (!arr_cnt && !obj_cnt) {
    +    // We have a complete document.
    +    return parser.n_structural_indexes;
    +  }
    +  return 0;
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H
    +/* end file generic/stage1/find_next_document_index.h for icelake */
    +/* including generic/stage1/json_minifier.h for icelake: #include  */
    +/* begin file generic/stage1/json_minifier.h for icelake */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_MINIFIER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_MINIFIER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This file contains the common code every implementation uses in stage1
    +// It is intended to be included multiple times and compiled multiple times
    +// We assume the file in which it is included already includes
    +// "simdjson/stage1.h" (this simplifies amalgation)
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +namespace stage1 {
    +
    +class json_minifier {
    +public:
    +  template
    +  static error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) noexcept;
    +
    +private:
    +  simdjson_inline json_minifier(uint8_t *_dst)
    +  : dst{_dst}
    +  {}
    +  template
    +  simdjson_inline void step(const uint8_t *block_buf, buf_block_reader &reader) noexcept;
    +  simdjson_inline void next(const simd::simd8x64& in, const json_block& block);
    +  simdjson_inline error_code finish(uint8_t *dst_start, size_t &dst_len);
    +  json_scanner scanner{};
    +  uint8_t *dst;
    +};
    +
    +simdjson_inline void json_minifier::next(const simd::simd8x64& in, const json_block& block) {
    +  uint64_t mask = block.whitespace();
    +  dst += in.compress(mask, dst);
    +}
    +
    +simdjson_inline error_code json_minifier::finish(uint8_t *dst_start, size_t &dst_len) {
    +  error_code error = scanner.finish();
    +  if (error) { dst_len = 0; return error; }
    +  dst_len = dst - dst_start;
    +  return SUCCESS;
    +}
    +
    +template<>
    +simdjson_inline void json_minifier::step<128>(const uint8_t *block_buf, buf_block_reader<128> &reader) noexcept {
    +  simd::simd8x64 in_1(block_buf);
    +  simd::simd8x64 in_2(block_buf+64);
    +  json_block block_1 = scanner.next(in_1);
    +  json_block block_2 = scanner.next(in_2);
    +  this->next(in_1, block_1);
    +  this->next(in_2, block_2);
    +  reader.advance();
    +}
    +
    +template<>
    +simdjson_inline void json_minifier::step<64>(const uint8_t *block_buf, buf_block_reader<64> &reader) noexcept {
    +  simd::simd8x64 in_1(block_buf);
    +  json_block block_1 = scanner.next(in_1);
    +  this->next(block_buf, block_1);
    +  reader.advance();
    +}
    +
    +template
    +error_code json_minifier::minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) noexcept {
    +  buf_block_reader reader(buf, len);
    +  json_minifier minifier(dst);
    +
    +  // Index the first n-1 blocks
    +  while (reader.has_full_block()) {
    +    minifier.step(reader.full_block(), reader);
    +  }
    +
    +  // Index the last (remainder) block, padded with spaces
    +  uint8_t block[STEP_SIZE];
    +  size_t remaining_bytes = reader.get_remainder(block);
    +  if (remaining_bytes > 0) {
    +    // We do not want to write directly to the output stream. Rather, we write
    +    // to a local buffer (for safety).
    +    uint8_t out_block[STEP_SIZE];
    +    uint8_t * const guarded_dst{minifier.dst};
    +    minifier.dst = out_block;
    +    minifier.step(block, reader);
    +    size_t to_write = minifier.dst - out_block;
    +    // In some cases, we could be enticed to consider the padded spaces
    +    // as part of the string. This is fine as long as we do not write more
    +    // than we consumed.
    +    if(to_write > remaining_bytes) { to_write = remaining_bytes; }
    +    memcpy(guarded_dst, out_block, to_write);
    +    minifier.dst = guarded_dst + to_write;
    +  }
    +  return minifier.finish(dst, dst_len);
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_MINIFIER_H
    +/* end file generic/stage1/json_minifier.h for icelake */
    +/* including generic/stage1/json_structural_indexer.h for icelake: #include  */
    +/* begin file generic/stage1/json_structural_indexer.h for icelake */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRUCTURAL_INDEXER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRUCTURAL_INDEXER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This file contains the common code every implementation uses in stage1
    +// It is intended to be included multiple times and compiled multiple times
    +// We assume the file in which it is included already includes
    +// "simdjson/stage1.h" (this simplifies amalgation)
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +namespace stage1 {
    +
    +class bit_indexer {
    +public:
    +  uint32_t *tail;
    +
    +  simdjson_inline bit_indexer(uint32_t *index_buf) : tail(index_buf) {}
    +
    +#if SIMDJSON_PREFER_REVERSE_BITS
    +  /**
    +    * ARM lacks a fast trailing zero instruction, but it has a fast
    +    * bit reversal instruction and a fast leading zero instruction.
    +    * Thus it may be profitable to reverse the bits (once) and then
    +    * to rely on a sequence of instructions that call the leading
    +    * zero instruction.
    +    *
    +    * Performance notes:
    +    * The chosen routine is not optimal in terms of data dependency
    +    * since zero_leading_bit might require two instructions. However,
    +    * it tends to minimize the total number of instructions which is
    +    * beneficial.
    +    */
    +  simdjson_inline void write_index(uint32_t idx, uint64_t& rev_bits, int i) {
    +    int lz = leading_zeroes(rev_bits);
    +    this->tail[i] = static_cast(idx) + lz;
    +    rev_bits = zero_leading_bit(rev_bits, lz);
    +  }
    +#else
    +  /**
    +    * Under recent x64 systems, we often have both a fast trailing zero
    +    * instruction and a fast 'clear-lower-bit' instruction so the following
    +    * algorithm can be competitive.
    +    */
    +
    +  simdjson_inline void write_index(uint32_t idx, uint64_t& bits, int i) {
    +    this->tail[i] = idx + trailing_zeroes(bits);
    +    bits = clear_lowest_bit(bits);
    +  }
    +#endif // SIMDJSON_PREFER_REVERSE_BITS
    +
    +  template 
    +  simdjson_inline int write_indexes(uint32_t idx, uint64_t& bits) {
    +    write_index(idx, bits, START);
    +    SIMDJSON_IF_CONSTEXPR (N > 1) {
    +      write_indexes<(N-1>0?START+1:START), (N-1>=0?N-1:1)>(idx, bits);
    +    }
    +    return START+N;
    +  }
    +
    +  template 
    +  simdjson_inline int write_indexes_stepped(uint32_t idx, uint64_t& bits, int cnt) {
    +    write_indexes(idx, bits);
    +    SIMDJSON_IF_CONSTEXPR ((START+STEP)  < END) {
    +      if (simdjson_unlikely((START+STEP) < cnt)) {
    +        write_indexes_stepped<(START+STEP(idx, bits, cnt);
    +      }
    +    }
    +    return ((END-START) % STEP) == 0 ? END : (END-START) - ((END-START) % STEP) + STEP;
    +  }
    +
    +  // flatten out values in 'bits' assuming that they are are to have values of idx
    +  // plus their position in the bitvector, and store these indexes at
    +  // base_ptr[base] incrementing base as we go
    +  // will potentially store extra values beyond end of valid bits, so base_ptr
    +  // needs to be large enough to handle this
    +  //
    +  // If the kernel sets SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER, then it
    +  // will provide its own version of the code.
    +#ifdef SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER
    +  simdjson_inline void write(uint32_t idx, uint64_t bits);
    +#else
    +  simdjson_inline void write(uint32_t idx, uint64_t bits) {
    +    // In some instances, the next branch is expensive because it is mispredicted.
    +    // Unfortunately, in other cases,
    +    // it helps tremendously.
    +    if (bits == 0)
    +        return;
    +
    +    int cnt = static_cast(count_ones(bits));
    +
    +#if SIMDJSON_PREFER_REVERSE_BITS
    +    bits = reverse_bits(bits);
    +#endif
    +#ifdef SIMDJSON_STRUCTURAL_INDEXER_STEP
    +    static constexpr const int STEP = SIMDJSON_STRUCTURAL_INDEXER_STEP;
    +#else
    +    static constexpr const int STEP = 4;
    +#endif
    +    static constexpr const int STEP_UNTIL = 24;
    +
    +    write_indexes_stepped<0, STEP_UNTIL, STEP>(idx, bits, cnt);
    +    SIMDJSON_IF_CONSTEXPR (STEP_UNTIL < 64) {
    +      if (simdjson_unlikely(STEP_UNTIL < cnt)) {
    +        for (int i=STEP_UNTIL; itail += cnt;
    +  }
    +#endif // SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER
    +
    +};
    +
    +class json_structural_indexer {
    +public:
    +  /**
    +   * Find the important bits of JSON in a 128-byte chunk, and add them to structural_indexes.
    +   *
    +   * @param partial Setting the partial parameter to true allows the find_structural_bits to
    +   *   tolerate unclosed strings. The caller should still ensure that the input is valid UTF-8. If
    +   *   you are processing substrings, you may want to call on a function like trimmed_length_safe_utf8.
    +   */
    +  template
    +  static error_code index(const uint8_t *buf, size_t len, dom_parser_implementation &parser, stage1_mode partial) noexcept;
    +
    +private:
    +  simdjson_inline json_structural_indexer(uint32_t *structural_indexes);
    +  template
    +  simdjson_inline void step(const uint8_t *block, buf_block_reader &reader) noexcept;
    +  simdjson_inline void next(const simd::simd8x64& in, const json_block& block, size_t idx);
    +  simdjson_inline error_code finish(dom_parser_implementation &parser, size_t idx, size_t len, stage1_mode partial);
    +
    +  json_scanner scanner{};
    +  utf8_checker checker{};
    +  bit_indexer indexer;
    +  uint64_t prev_structurals = 0;
    +  uint64_t unescaped_chars_error = 0;
    +};
    +
    +simdjson_inline json_structural_indexer::json_structural_indexer(uint32_t *structural_indexes) : indexer{structural_indexes} {}
    +
    +// Skip the last character if it is partial
    +simdjson_inline size_t trim_partial_utf8(const uint8_t *buf, size_t len) {
    +  if (simdjson_unlikely(len < 3)) {
    +    switch (len) {
    +      case 2:
    +        if (buf[len-1] >= 0xc0) { return len-1; } // 2-, 3- and 4-byte characters with only 1 byte left
    +        if (buf[len-2] >= 0xe0) { return len-2; } // 3- and 4-byte characters with only 2 bytes left
    +        return len;
    +      case 1:
    +        if (buf[len-1] >= 0xc0) { return len-1; } // 2-, 3- and 4-byte characters with only 1 byte left
    +        return len;
    +      case 0:
    +        return len;
    +    }
    +  }
    +  if (buf[len-1] >= 0xc0) { return len-1; } // 2-, 3- and 4-byte characters with only 1 byte left
    +  if (buf[len-2] >= 0xe0) { return len-2; } // 3- and 4-byte characters with only 1 byte left
    +  if (buf[len-3] >= 0xf0) { return len-3; } // 4-byte characters with only 3 bytes left
    +  return len;
    +}
    +
    +//
    +// PERF NOTES:
    +// We pipe 2 inputs through these stages:
    +// 1. Load JSON into registers. This takes a long time and is highly parallelizable, so we load
    +//    2 inputs' worth at once so that by the time step 2 is looking for them input, it's available.
    +// 2. Scan the JSON for critical data: strings, scalars and operators. This is the critical path.
    +//    The output of step 1 depends entirely on this information. These functions don't quite use
    +//    up enough CPU: the second half of the functions is highly serial, only using 1 execution core
    +//    at a time. The second input's scans has some dependency on the first ones finishing it, but
    +//    they can make a lot of progress before they need that information.
    +// 3. Step 1 doesn't use enough capacity, so we run some extra stuff while we're waiting for that
    +//    to finish: utf-8 checks and generating the output from the last iteration.
    +//
    +// The reason we run 2 inputs at a time, is steps 2 and 3 are *still* not enough to soak up all
    +// available capacity with just one input. Running 2 at a time seems to give the CPU a good enough
    +// workout.
    +//
    +template
    +error_code json_structural_indexer::index(const uint8_t *buf, size_t len, dom_parser_implementation &parser, stage1_mode partial) noexcept {
    +  if (simdjson_unlikely(len > parser.capacity())) { return CAPACITY; }
    +  // We guard the rest of the code so that we can assume that len > 0 throughout.
    +  if (len == 0) { return EMPTY; }
    +  if (is_streaming(partial)) {
    +    len = trim_partial_utf8(buf, len);
    +    // If you end up with an empty window after trimming
    +    // the partial UTF-8 bytes, then chances are good that you
    +    // have an UTF-8 formatting error.
    +    if(len == 0) { return UTF8_ERROR; }
    +  }
    +  buf_block_reader reader(buf, len);
    +  json_structural_indexer indexer(parser.structural_indexes.get());
    +
    +  // Read all but the last block
    +  while (reader.has_full_block()) {
    +    indexer.step(reader.full_block(), reader);
    +  }
    +  // Take care of the last block (will always be there unless file is empty which is
    +  // not supposed to happen.)
    +  uint8_t block[STEP_SIZE];
    +  if (simdjson_unlikely(reader.get_remainder(block) == 0)) { return UNEXPECTED_ERROR; }
    +  indexer.step(block, reader);
    +  return indexer.finish(parser, reader.block_index(), len, partial);
    +}
    +
    +template<>
    +simdjson_inline void json_structural_indexer::step<128>(const uint8_t *block, buf_block_reader<128> &reader) noexcept {
    +  simd::simd8x64 in_1(block);
    +  simd::simd8x64 in_2(block+64);
    +  json_block block_1 = scanner.next(in_1);
    +  json_block block_2 = scanner.next(in_2);
    +  this->next(in_1, block_1, reader.block_index());
    +  this->next(in_2, block_2, reader.block_index()+64);
    +  reader.advance();
    +}
    +
    +template<>
    +simdjson_inline void json_structural_indexer::step<64>(const uint8_t *block, buf_block_reader<64> &reader) noexcept {
    +  simd::simd8x64 in_1(block);
    +  json_block block_1 = scanner.next(in_1);
    +  this->next(in_1, block_1, reader.block_index());
    +  reader.advance();
    +}
    +
    +simdjson_inline void json_structural_indexer::next(const simd::simd8x64& in, const json_block& block, size_t idx) {
    +  uint64_t unescaped = in.lteq(0x1F);
    +#if SIMDJSON_UTF8VALIDATION
    +  checker.check_next_input(in);
    +#endif
    +  indexer.write(uint32_t(idx-64), prev_structurals); // Output *last* iteration's structurals to the parser
    +  prev_structurals = block.structural_start();
    +  unescaped_chars_error |= block.non_quote_inside_string(unescaped);
    +}
    +
    +simdjson_inline error_code json_structural_indexer::finish(dom_parser_implementation &parser, size_t idx, size_t len, stage1_mode partial) {
    +  // Write out the final iteration's structurals
    +  indexer.write(uint32_t(idx-64), prev_structurals);
    +  error_code error = scanner.finish();
    +  // We deliberately break down the next expression so that it is
    +  // human readable.
    +  const bool should_we_exit = is_streaming(partial) ?
    +    ((error != SUCCESS) && (error != UNCLOSED_STRING)) // when partial we tolerate UNCLOSED_STRING
    +    : (error != SUCCESS); // if partial is false, we must have SUCCESS
    +  const bool have_unclosed_string = (error == UNCLOSED_STRING);
    +  if (simdjson_unlikely(should_we_exit)) { return error; }
    +
    +  if (unescaped_chars_error) {
    +    return UNESCAPED_CHARS;
    +  }
    +  parser.n_structural_indexes = uint32_t(indexer.tail - parser.structural_indexes.get());
    +  /***
    +   * The On Demand API requires special padding.
    +   *
    +   * This is related to https://github.com/simdjson/simdjson/issues/906
    +   * Basically, we want to make sure that if the parsing continues beyond the last (valid)
    +   * structural character, it quickly stops.
    +   * Only three structural characters can be repeated without triggering an error in JSON:  [,] and }.
    +   * We repeat the padding character (at 'len'). We don't know what it is, but if the parsing
    +   * continues, then it must be [,] or }.
    +   * Suppose it is ] or }. We backtrack to the first character, what could it be that would
    +   * not trigger an error? It could be ] or } but no, because you can't start a document that way.
    +   * It can't be a comma, a colon or any simple value. So the only way we could continue is
    +   * if the repeated character is [. But if so, the document must start with [. But if the document
    +   * starts with [, it should end with ]. If we enforce that rule, then we would get
    +   * ][[ which is invalid.
    +   *
    +   * This is illustrated with the test array_iterate_unclosed_error() on the following input:
    +   * R"({ "a": [,,)"
    +   **/
    +  parser.structural_indexes[parser.n_structural_indexes] = uint32_t(len); // used later in partial == stage1_mode::streaming_final
    +  parser.structural_indexes[parser.n_structural_indexes + 1] = uint32_t(len);
    +  parser.structural_indexes[parser.n_structural_indexes + 2] = 0;
    +  parser.next_structural_index = 0;
    +  // a valid JSON file cannot have zero structural indexes - we should have found something
    +  if (simdjson_unlikely(parser.n_structural_indexes == 0u)) {
    +    return EMPTY;
    +  }
    +  if (simdjson_unlikely(parser.structural_indexes[parser.n_structural_indexes - 1] > len)) {
    +    return UNEXPECTED_ERROR;
    +  }
    +  if (partial == stage1_mode::streaming_partial) {
    +    // If we have an unclosed string, then the last structural
    +    // will be the quote and we want to make sure to omit it.
    +    if(have_unclosed_string) {
    +      parser.n_structural_indexes--;
    +      // a valid JSON file cannot have zero structural indexes - we should have found something
    +      if (simdjson_unlikely(parser.n_structural_indexes == 0u)) { return CAPACITY; }
    +    }
    +    // We truncate the input to the end of the last complete document (or zero).
    +    auto new_structural_indexes = find_next_document_index(parser);
    +    if (new_structural_indexes == 0 && parser.n_structural_indexes > 0) {
    +      if(parser.structural_indexes[0] == 0) {
    +        // If the buffer is partial and we started at index 0 but the document is
    +        // incomplete, it's too big to parse.
    +        return CAPACITY;
    +      } else {
    +        // It is possible that the document could be parsed, we just had a lot
    +        // of white space.
    +        parser.n_structural_indexes = 0;
    +        return EMPTY;
    +      }
    +    }
    +
    +    parser.n_structural_indexes = new_structural_indexes;
    +  } else if (partial == stage1_mode::streaming_final) {
    +    if(have_unclosed_string) { parser.n_structural_indexes--; }
    +    // We truncate the input to the end of the last complete document (or zero).
    +    // Because partial == stage1_mode::streaming_final, it means that we may
    +    // silently ignore trailing garbage. Though it sounds bad, we do it
    +    // deliberately because many people who have streams of JSON documents
    +    // will truncate them for processing. E.g., imagine that you are uncompressing
    +    // the data from a size file or receiving it in chunks from the network. You
    +    // may not know where exactly the last document will be. Meanwhile the
    +    // document_stream instances allow people to know the JSON documents they are
    +    // parsing (see the iterator.source() method).
    +    parser.n_structural_indexes = find_next_document_index(parser);
    +    // We store the initial n_structural_indexes so that the client can see
    +    // whether we used truncation. If initial_n_structural_indexes == parser.n_structural_indexes,
    +    // then this will query parser.structural_indexes[parser.n_structural_indexes] which is len,
    +    // otherwise, it will copy some prior index.
    +    parser.structural_indexes[parser.n_structural_indexes + 1] = parser.structural_indexes[parser.n_structural_indexes];
    +    // This next line is critical, do not change it unless you understand what you are
    +    // doing.
    +    parser.structural_indexes[parser.n_structural_indexes] = uint32_t(len);
    +    if (simdjson_unlikely(parser.n_structural_indexes == 0u)) {
    +        // We tolerate an unclosed string at the very end of the stream. Indeed, users
    +        // often load their data in bulk without being careful and they want us to ignore
    +        // the trailing garbage.
    +        return EMPTY;
    +    }
    +  }
    +  checker.check_eof();
    +  return checker.errors();
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +// Clear CUSTOM_BIT_INDEXER so other implementations can set it if they need to.
    +#undef SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRUCTURAL_INDEXER_H
    +/* end file generic/stage1/json_structural_indexer.h for icelake */
    +/* including generic/stage1/utf8_validator.h for icelake: #include  */
    +/* begin file generic/stage1/utf8_validator.h for icelake */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_UTF8_VALIDATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_UTF8_VALIDATOR_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +namespace stage1 {
    +
    +/**
    + * Validates that the string is actual UTF-8.
    + */
    +template
    +bool generic_validate_utf8(const uint8_t * input, size_t length) {
    +    checker c{};
    +    buf_block_reader<64> reader(input, length);
    +    while (reader.has_full_block()) {
    +      simd::simd8x64 in(reader.full_block());
    +      c.check_next_input(in);
    +      reader.advance();
    +    }
    +    uint8_t block[64]{};
    +    reader.get_remainder(block);
    +    simd::simd8x64 in(block);
    +    c.check_next_input(in);
    +    reader.advance();
    +    c.check_eof();
    +    return c.errors() == error_code::SUCCESS;
    +}
    +
    +bool generic_validate_utf8(const char * input, size_t length) {
    +    return generic_validate_utf8(reinterpret_cast(input),length);
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_UTF8_VALIDATOR_H
    +/* end file generic/stage1/utf8_validator.h for icelake */
    +/* end file generic/stage1/amalgamated.h for icelake */
    +/* including generic/stage2/amalgamated.h for icelake: #include  */
    +/* begin file generic/stage2/amalgamated.h for icelake */
    +// Stuff other things depend on
    +/* including generic/stage2/base.h for icelake: #include  */
    +/* begin file generic/stage2/base.h for icelake */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_BASE_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +namespace stage2 {
    +
    +class json_iterator;
    +class structural_iterator;
    +struct tape_builder;
    +struct tape_writer;
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_BASE_H
    +/* end file generic/stage2/base.h for icelake */
    +/* including generic/stage2/tape_writer.h for icelake: #include  */
    +/* begin file generic/stage2/tape_writer.h for icelake */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +namespace stage2 {
    +
    +struct tape_writer {
    +  /** The next place to write to tape */
    +  uint64_t *next_tape_loc;
    +
    +  /** Write a signed 64-bit value to tape. */
    +  simdjson_inline void append_s64(int64_t value) noexcept;
    +
    +  /** Write an unsigned 64-bit value to tape. */
    +  simdjson_inline void append_u64(uint64_t value) noexcept;
    +
    +  /** Write a double value to tape. */
    +  simdjson_inline void append_double(double value) noexcept;
    +
    +  /**
    +   * Append a tape entry (an 8-bit type,and 56 bits worth of value).
    +   */
    +  simdjson_inline void append(uint64_t val, internal::tape_type t) noexcept;
    +
    +  /**
    +   * Skip the current tape entry without writing.
    +   *
    +   * Used to skip the start of the container, since we'll come back later to fill it in when the
    +   * container ends.
    +   */
    +  simdjson_inline void skip() noexcept;
    +
    +  /**
    +   * Skip the number of tape entries necessary to write a large u64 or i64.
    +   */
    +  simdjson_inline void skip_large_integer() noexcept;
    +
    +  /**
    +   * Skip the number of tape entries necessary to write a double.
    +   */
    +  simdjson_inline void skip_double() noexcept;
    +
    +  /**
    +   * Write a value to a known location on tape.
    +   *
    +   * Used to go back and write out the start of a container after the container ends.
    +   */
    +  simdjson_inline static void write(uint64_t &tape_loc, uint64_t val, internal::tape_type t) noexcept;
    +
    +private:
    +  /**
    +   * Append both the tape entry, and a supplementary value following it. Used for types that need
    +   * all 64 bits, such as double and uint64_t.
    +   */
    +  template
    +  simdjson_inline void append2(uint64_t val, T val2, internal::tape_type t) noexcept;
    +}; // struct tape_writer
    +
    +simdjson_inline void tape_writer::append_s64(int64_t value) noexcept {
    +  append2(0, value, internal::tape_type::INT64);
    +}
    +
    +simdjson_inline void tape_writer::append_u64(uint64_t value) noexcept {
    +  append(0, internal::tape_type::UINT64);
    +  *next_tape_loc = value;
    +  next_tape_loc++;
    +}
    +
    +/** Write a double value to tape. */
    +simdjson_inline void tape_writer::append_double(double value) noexcept {
    +  append2(0, value, internal::tape_type::DOUBLE);
    +}
    +
    +simdjson_inline void tape_writer::skip() noexcept {
    +  next_tape_loc++;
    +}
    +
    +simdjson_inline void tape_writer::skip_large_integer() noexcept {
    +  next_tape_loc += 2;
    +}
    +
    +simdjson_inline void tape_writer::skip_double() noexcept {
    +  next_tape_loc += 2;
    +}
    +
    +simdjson_inline void tape_writer::append(uint64_t val, internal::tape_type t) noexcept {
    +  *next_tape_loc = val | ((uint64_t(char(t))) << 56);
    +  next_tape_loc++;
    +}
    +
    +template
    +simdjson_inline void tape_writer::append2(uint64_t val, T val2, internal::tape_type t) noexcept {
    +  append(val, t);
    +  static_assert(sizeof(val2) == sizeof(*next_tape_loc), "Type is not 64 bits!");
    +  memcpy(next_tape_loc, &val2, sizeof(val2));
    +  next_tape_loc++;
    +}
    +
    +simdjson_inline void tape_writer::write(uint64_t &tape_loc, uint64_t val, internal::tape_type t) noexcept {
    +  tape_loc = val | ((uint64_t(char(t))) << 56);
    +}
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H
    +/* end file generic/stage2/tape_writer.h for icelake */
    +/* including generic/stage2/logger.h for icelake: #include  */
    +/* begin file generic/stage2/logger.h for icelake */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_LOGGER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_LOGGER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +
    +// This is for an internal-only stage 2 specific logger.
    +// Set LOG_ENABLED = true to log what stage 2 is doing!
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +namespace logger {
    +
    +  static constexpr const char * DASHES = "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------";
    +
    +#if SIMDJSON_VERBOSE_LOGGING
    +  static constexpr const bool LOG_ENABLED = true;
    +#else
    +  static constexpr const bool LOG_ENABLED = false;
    +#endif
    +  static constexpr const int LOG_EVENT_LEN = 20;
    +  static constexpr const int LOG_BUFFER_LEN = 30;
    +  static constexpr const int LOG_SMALL_BUFFER_LEN = 10;
    +  static constexpr const int LOG_INDEX_LEN = 5;
    +
    +  static int log_depth; // Not threadsafe. Log only.
    +
    +  // Helper to turn unprintable or newline characters into spaces
    +  static simdjson_inline char printable_char(char c) {
    +    if (c >= 0x20) {
    +      return c;
    +    } else {
    +      return ' ';
    +    }
    +  }
    +
    +  // Print the header and set up log_start
    +  static simdjson_inline void log_start() {
    +    if (LOG_ENABLED) {
    +      log_depth = 0;
    +      printf("\n");
    +      printf("| %-*s | %-*s | %-*s | %-*s | Detail |\n", LOG_EVENT_LEN, "Event", LOG_BUFFER_LEN, "Buffer", LOG_SMALL_BUFFER_LEN, "Next", 5, "Next#");
    +      printf("|%.*s|%.*s|%.*s|%.*s|--------|\n", LOG_EVENT_LEN+2, DASHES, LOG_BUFFER_LEN+2, DASHES, LOG_SMALL_BUFFER_LEN+2, DASHES, 5+2, DASHES);
    +    }
    +  }
    +
    +  simdjson_unused static simdjson_inline void log_string(const char *message) {
    +    if (LOG_ENABLED) {
    +      printf("%s\n", message);
    +    }
    +  }
    +
    +  // Logs a single line from the stage 2 DOM parser
    +  template
    +  static simdjson_inline void log_line(S &structurals, const char *title_prefix, const char *title, const char *detail) {
    +    if (LOG_ENABLED) {
    +      printf("| %*s%s%-*s ", log_depth*2, "", title_prefix, LOG_EVENT_LEN - log_depth*2 - int(strlen(title_prefix)), title);
    +      auto current_index = structurals.at_beginning() ? nullptr : structurals.next_structural-1;
    +      auto next_index = structurals.next_structural;
    +      auto current = current_index ? &structurals.buf[*current_index] : reinterpret_cast("                                                       ");
    +      auto next = &structurals.buf[*next_index];
    +      {
    +        // Print the next N characters in the buffer.
    +        printf("| ");
    +        // Otherwise, print the characters starting from the buffer position.
    +        // Print spaces for unprintable or newline characters.
    +        for (int i=0;i */
    +/* begin file generic/stage2/json_iterator.h for icelake */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +namespace stage2 {
    +
    +class json_iterator {
    +public:
    +  const uint8_t* const buf;
    +  uint32_t *next_structural;
    +  dom_parser_implementation &dom_parser;
    +  uint32_t depth{0};
    +
    +  /**
    +   * Walk the JSON document.
    +   *
    +   * The visitor receives callbacks when values are encountered. All callbacks pass the iterator as
    +   * the first parameter; some callbacks have other parameters as well:
    +   *
    +   * - visit_document_start() - at the beginning.
    +   * - visit_document_end() - at the end (if things were successful).
    +   *
    +   * - visit_array_start() - at the start `[` of a non-empty array.
    +   * - visit_array_end() - at the end `]` of a non-empty array.
    +   * - visit_empty_array() - when an empty array is encountered.
    +   *
    +   * - visit_object_end() - at the start `]` of a non-empty object.
    +   * - visit_object_start() - at the end `]` of a non-empty object.
    +   * - visit_empty_object() - when an empty object is encountered.
    +   * - visit_key(const uint8_t *key) - when a key in an object field is encountered. key is
    +   *                                   guaranteed to point at the first quote of the string (`"key"`).
    +   * - visit_primitive(const uint8_t *value) - when a value is a string, number, boolean or null.
    +   * - visit_root_primitive(iter, uint8_t *value) - when the top-level value is a string, number, boolean or null.
    +   *
    +   * - increment_count(iter) - each time a value is found in an array or object.
    +   */
    +  template
    +  simdjson_warn_unused simdjson_inline error_code walk_document(V &visitor) noexcept;
    +
    +  /**
    +   * Create an iterator capable of walking a JSON document.
    +   *
    +   * The document must have already passed through stage 1.
    +   */
    +  simdjson_inline json_iterator(dom_parser_implementation &_dom_parser, size_t start_structural_index);
    +
    +  /**
    +   * Look at the next token.
    +   *
    +   * Tokens can be strings, numbers, booleans, null, or operators (`[{]},:`)).
    +   *
    +   * They may include invalid JSON as well (such as `1.2.3` or `ture`).
    +   */
    +  simdjson_inline const uint8_t *peek() const noexcept;
    +  /**
    +   * Advance to the next token.
    +   *
    +   * Tokens can be strings, numbers, booleans, null, or operators (`[{]},:`)).
    +   *
    +   * They may include invalid JSON as well (such as `1.2.3` or `ture`).
    +   */
    +  simdjson_inline const uint8_t *advance() noexcept;
    +  /**
    +   * Get the remaining length of the document, from the start of the current token.
    +   */
    +  simdjson_inline size_t remaining_len() const noexcept;
    +  /**
    +   * Check if we are at the end of the document.
    +   *
    +   * If this is true, there are no more tokens.
    +   */
    +  simdjson_inline bool at_eof() const noexcept;
    +  /**
    +   * Check if we are at the beginning of the document.
    +   */
    +  simdjson_inline bool at_beginning() const noexcept;
    +  simdjson_inline uint8_t last_structural() const noexcept;
    +
    +  /**
    +   * Log that a value has been found.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_value(const char *type) const noexcept;
    +  /**
    +   * Log the start of a multipart value.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_start_value(const char *type) const noexcept;
    +  /**
    +   * Log the end of a multipart value.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_end_value(const char *type) const noexcept;
    +  /**
    +   * Log an error.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_error(const char *error) const noexcept;
    +
    +  template
    +  simdjson_warn_unused simdjson_inline error_code visit_root_primitive(V &visitor, const uint8_t *value) noexcept;
    +  template
    +  simdjson_warn_unused simdjson_inline error_code visit_primitive(V &visitor, const uint8_t *value) noexcept;
    +};
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code json_iterator::walk_document(V &visitor) noexcept {
    +  logger::log_start();
    +
    +  //
    +  // Start the document
    +  //
    +  if (at_eof()) { return EMPTY; }
    +  log_start_value("document");
    +  SIMDJSON_TRY( visitor.visit_document_start(*this) );
    +
    +  //
    +  // Read first value
    +  //
    +  {
    +    auto value = advance();
    +
    +    // Make sure the outer object or array is closed before continuing; otherwise, there are ways we
    +    // could get into memory corruption. See https://github.com/simdjson/simdjson/issues/906
    +    if (!STREAMING) {
    +      switch (*value) {
    +        case '{': if (last_structural() != '}') { log_value("starting brace unmatched"); return TAPE_ERROR; }; break;
    +        case '[': if (last_structural() != ']') { log_value("starting bracket unmatched"); return TAPE_ERROR; }; break;
    +      }
    +    }
    +
    +    switch (*value) {
    +      case '{': if (*peek() == '}') { advance(); log_value("empty object"); SIMDJSON_TRY( visitor.visit_empty_object(*this) ); break; } goto object_begin;
    +      case '[': if (*peek() == ']') { advance(); log_value("empty array"); SIMDJSON_TRY( visitor.visit_empty_array(*this) ); break; } goto array_begin;
    +      default: SIMDJSON_TRY( visitor.visit_root_primitive(*this, value) ); break;
    +    }
    +  }
    +  goto document_end;
    +
    +//
    +// Object parser states
    +//
    +object_begin:
    +  log_start_value("object");
    +  depth++;
    +  if (depth >= dom_parser.max_depth()) { log_error("Exceeded max depth!"); return DEPTH_ERROR; }
    +  dom_parser.is_array[depth] = false;
    +  SIMDJSON_TRY( visitor.visit_object_start(*this) );
    +
    +  {
    +    auto key = advance();
    +    if (*key != '"') { log_error("Object does not start with a key"); return TAPE_ERROR; }
    +    SIMDJSON_TRY( visitor.increment_count(*this) );
    +    SIMDJSON_TRY( visitor.visit_key(*this, key) );
    +  }
    +
    +object_field:
    +  if (simdjson_unlikely( *advance() != ':' )) { log_error("Missing colon after key in object"); return TAPE_ERROR; }
    +  {
    +    auto value = advance();
    +    switch (*value) {
    +      case '{': if (*peek() == '}') { advance(); log_value("empty object"); SIMDJSON_TRY( visitor.visit_empty_object(*this) ); break; } goto object_begin;
    +      case '[': if (*peek() == ']') { advance(); log_value("empty array"); SIMDJSON_TRY( visitor.visit_empty_array(*this) ); break; } goto array_begin;
    +      default: SIMDJSON_TRY( visitor.visit_primitive(*this, value) ); break;
    +    }
    +  }
    +
    +object_continue:
    +  switch (*advance()) {
    +    case ',':
    +      SIMDJSON_TRY( visitor.increment_count(*this) );
    +      {
    +        auto key = advance();
    +        if (simdjson_unlikely( *key != '"' )) { log_error("Key string missing at beginning of field in object"); return TAPE_ERROR; }
    +        SIMDJSON_TRY( visitor.visit_key(*this, key) );
    +      }
    +      goto object_field;
    +    case '}': log_end_value("object"); SIMDJSON_TRY( visitor.visit_object_end(*this) ); goto scope_end;
    +    default: log_error("No comma between object fields"); return TAPE_ERROR;
    +  }
    +
    +scope_end:
    +  depth--;
    +  if (depth == 0) { goto document_end; }
    +  if (dom_parser.is_array[depth]) { goto array_continue; }
    +  goto object_continue;
    +
    +//
    +// Array parser states
    +//
    +array_begin:
    +  log_start_value("array");
    +  depth++;
    +  if (depth >= dom_parser.max_depth()) { log_error("Exceeded max depth!"); return DEPTH_ERROR; }
    +  dom_parser.is_array[depth] = true;
    +  SIMDJSON_TRY( visitor.visit_array_start(*this) );
    +  SIMDJSON_TRY( visitor.increment_count(*this) );
    +
    +array_value:
    +  {
    +    auto value = advance();
    +    switch (*value) {
    +      case '{': if (*peek() == '}') { advance(); log_value("empty object"); SIMDJSON_TRY( visitor.visit_empty_object(*this) ); break; } goto object_begin;
    +      case '[': if (*peek() == ']') { advance(); log_value("empty array"); SIMDJSON_TRY( visitor.visit_empty_array(*this) ); break; } goto array_begin;
    +      default: SIMDJSON_TRY( visitor.visit_primitive(*this, value) ); break;
    +    }
    +  }
    +
    +array_continue:
    +  switch (*advance()) {
    +    case ',': SIMDJSON_TRY( visitor.increment_count(*this) ); goto array_value;
    +    case ']': log_end_value("array"); SIMDJSON_TRY( visitor.visit_array_end(*this) ); goto scope_end;
    +    default: log_error("Missing comma between array values"); return TAPE_ERROR;
    +  }
    +
    +document_end:
    +  log_end_value("document");
    +  SIMDJSON_TRY( visitor.visit_document_end(*this) );
    +
    +  dom_parser.next_structural_index = uint32_t(next_structural - &dom_parser.structural_indexes[0]);
    +
    +  // If we didn't make it to the end, it's an error
    +  if ( !STREAMING && dom_parser.next_structural_index != dom_parser.n_structural_indexes ) {
    +    log_error("More than one JSON value at the root of the document, or extra characters at the end of the JSON!");
    +    return TAPE_ERROR;
    +  }
    +
    +  return SUCCESS;
    +
    +} // walk_document()
    +
    +simdjson_inline json_iterator::json_iterator(dom_parser_implementation &_dom_parser, size_t start_structural_index)
    +  : buf{_dom_parser.buf},
    +    next_structural{&_dom_parser.structural_indexes[start_structural_index]},
    +    dom_parser{_dom_parser} {
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::peek() const noexcept {
    +  return &buf[*(next_structural)];
    +}
    +simdjson_inline const uint8_t *json_iterator::advance() noexcept {
    +  return &buf[*(next_structural++)];
    +}
    +simdjson_inline size_t json_iterator::remaining_len() const noexcept {
    +  return dom_parser.len - *(next_structural-1);
    +}
    +
    +simdjson_inline bool json_iterator::at_eof() const noexcept {
    +  return next_structural == &dom_parser.structural_indexes[dom_parser.n_structural_indexes];
    +}
    +simdjson_inline bool json_iterator::at_beginning() const noexcept {
    +  return next_structural == dom_parser.structural_indexes.get();
    +}
    +simdjson_inline uint8_t json_iterator::last_structural() const noexcept {
    +  return buf[dom_parser.structural_indexes[dom_parser.n_structural_indexes - 1]];
    +}
    +
    +simdjson_inline void json_iterator::log_value(const char *type) const noexcept {
    +  logger::log_line(*this, "", type, "");
    +}
    +
    +simdjson_inline void json_iterator::log_start_value(const char *type) const noexcept {
    +  logger::log_line(*this, "+", type, "");
    +  if (logger::LOG_ENABLED) { logger::log_depth++; }
    +}
    +
    +simdjson_inline void json_iterator::log_end_value(const char *type) const noexcept {
    +  if (logger::LOG_ENABLED) { logger::log_depth--; }
    +  logger::log_line(*this, "-", type, "");
    +}
    +
    +simdjson_inline void json_iterator::log_error(const char *error) const noexcept {
    +  logger::log_line(*this, "", "ERROR", error);
    +}
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code json_iterator::visit_root_primitive(V &visitor, const uint8_t *value) noexcept {
    +  switch (*value) {
    +    case '"': return visitor.visit_root_string(*this, value);
    +    case 't': return visitor.visit_root_true_atom(*this, value);
    +    case 'f': return visitor.visit_root_false_atom(*this, value);
    +    case 'n': return visitor.visit_root_null_atom(*this, value);
    +    case '-':
    +    case '0': case '1': case '2': case '3': case '4':
    +    case '5': case '6': case '7': case '8': case '9':
    +      return visitor.visit_root_number(*this, value);
    +    default:
    +      log_error("Document starts with a non-value character");
    +      return TAPE_ERROR;
    +  }
    +}
    +template
    +simdjson_warn_unused simdjson_inline error_code json_iterator::visit_primitive(V &visitor, const uint8_t *value) noexcept {
    +  // Use the fact that most scalars are going to be either strings or numbers.
    +  if(*value == '"') {
    +    return visitor.visit_string(*this, value);
    +  } else if (((*value - '0')  < 10) || (*value == '-')) {
    +    return visitor.visit_number(*this, value);
    +  }
    +  // true, false, null are uncommon.
    +  switch (*value) {
    +    case 't': return visitor.visit_true_atom(*this, value);
    +    case 'f': return visitor.visit_false_atom(*this, value);
    +    case 'n': return visitor.visit_null_atom(*this, value);
    +    default:
    +      log_error("Non-value found when value was expected!");
    +      return TAPE_ERROR;
    +  }
    +}
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H
    +/* end file generic/stage2/json_iterator.h for icelake */
    +/* including generic/stage2/stringparsing.h for icelake: #include  */
    +/* begin file generic/stage2/stringparsing.h for icelake */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This file contains the common code every implementation uses
    +// It is intended to be included multiple times and compiled multiple times
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +/// @private
    +namespace stringparsing {
    +
    +// begin copypasta
    +// These chars yield themselves: " \ /
    +// b -> backspace, f -> formfeed, n -> newline, r -> cr, t -> horizontal tab
    +// u not handled in this table as it's complex
    +static const uint8_t escape_map[256] = {
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0, // 0x0.
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0x22, 0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0x2f,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0, // 0x4.
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0x5c, 0, 0,    0, // 0x5.
    +    0, 0, 0x08, 0, 0,    0, 0x0c, 0, 0, 0, 0, 0, 0,    0, 0x0a, 0, // 0x6.
    +    0, 0, 0x0d, 0, 0x09, 0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0, // 0x7.
    +
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +};
    +
    +// handle a unicode codepoint
    +// write appropriate values into dest
    +// src will advance 6 bytes or 12 bytes
    +// dest will advance a variable amount (return via pointer)
    +// return true if the unicode codepoint was valid
    +// We work in little-endian then swap at write time
    +simdjson_warn_unused
    +simdjson_inline bool handle_unicode_codepoint(const uint8_t **src_ptr,
    +                                            uint8_t **dst_ptr, bool allow_replacement) {
    +  // Use the default Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD)
    +  constexpr uint32_t substitution_code_point = 0xfffd;
    +  // jsoncharutils::hex_to_u32_nocheck fills high 16 bits of the return value with 1s if the
    +  // conversion isn't valid; we defer the check for this to inside the
    +  // multilingual plane check
    +  uint32_t code_point = jsoncharutils::hex_to_u32_nocheck(*src_ptr + 2);
    +  *src_ptr += 6;
    +
    +  // If we found a high surrogate, we must
    +  // check for low surrogate for characters
    +  // outside the Basic
    +  // Multilingual Plane.
    +  if (code_point >= 0xd800 && code_point < 0xdc00) {
    +    const uint8_t *src_data = *src_ptr;
    +    /* Compiler optimizations convert this to a single 16-bit load and compare on most platforms */
    +    if (((src_data[0] << 8) | src_data[1]) != ((static_cast ('\\') << 8) | static_cast ('u'))) {
    +      if(!allow_replacement) { return false; }
    +      code_point = substitution_code_point;
    +    } else {
    +      uint32_t code_point_2 = jsoncharutils::hex_to_u32_nocheck(src_data + 2);
    +
    +      // We have already checked that the high surrogate is valid and
    +      // (code_point - 0xd800) < 1024.
    +      //
    +      // Check that code_point_2 is in the range 0xdc00..0xdfff
    +      // and that code_point_2 was parsed from valid hex.
    +      uint32_t low_bit = code_point_2 - 0xdc00;
    +      if (low_bit >> 10) {
    +        if(!allow_replacement) { return false; }
    +        code_point = substitution_code_point;
    +      } else {
    +        code_point =  (((code_point - 0xd800) << 10) | low_bit) + 0x10000;
    +        *src_ptr += 6;
    +      }
    +
    +    }
    +  } else if (code_point >= 0xdc00 && code_point <= 0xdfff) {
    +      // If we encounter a low surrogate (not preceded by a high surrogate)
    +      // then we have an error.
    +      if(!allow_replacement) { return false; }
    +      code_point = substitution_code_point;
    +  }
    +  size_t offset = jsoncharutils::codepoint_to_utf8(code_point, *dst_ptr);
    +  *dst_ptr += offset;
    +  return offset > 0;
    +}
    +
    +
    +// handle a unicode codepoint using the wobbly convention
    +// https://simonsapin.github.io/wtf-8/
    +// write appropriate values into dest
    +// src will advance 6 bytes or 12 bytes
    +// dest will advance a variable amount (return via pointer)
    +// return true if the unicode codepoint was valid
    +// We work in little-endian then swap at write time
    +simdjson_warn_unused
    +simdjson_inline bool handle_unicode_codepoint_wobbly(const uint8_t **src_ptr,
    +                                            uint8_t **dst_ptr) {
    +  // It is not ideal that this function is nearly identical to handle_unicode_codepoint.
    +  //
    +  // jsoncharutils::hex_to_u32_nocheck fills high 16 bits of the return value with 1s if the
    +  // conversion isn't valid; we defer the check for this to inside the
    +  // multilingual plane check
    +  uint32_t code_point = jsoncharutils::hex_to_u32_nocheck(*src_ptr + 2);
    +  *src_ptr += 6;
    +  // If we found a high surrogate, we must
    +  // check for low surrogate for characters
    +  // outside the Basic
    +  // Multilingual Plane.
    +  if (code_point >= 0xd800 && code_point < 0xdc00) {
    +    const uint8_t *src_data = *src_ptr;
    +    /* Compiler optimizations convert this to a single 16-bit load and compare on most platforms */
    +    if (((src_data[0] << 8) | src_data[1]) == ((static_cast ('\\') << 8) | static_cast ('u'))) {
    +      uint32_t code_point_2 = jsoncharutils::hex_to_u32_nocheck(src_data + 2);
    +      uint32_t low_bit = code_point_2 - 0xdc00;
    +      if ((low_bit >> 10) ==  0) {
    +        code_point =
    +          (((code_point - 0xd800) << 10) | low_bit) + 0x10000;
    +        *src_ptr += 6;
    +      }
    +    }
    +  }
    +
    +  size_t offset = jsoncharutils::codepoint_to_utf8(code_point, *dst_ptr);
    +  *dst_ptr += offset;
    +  return offset > 0;
    +}
    +
    +
    +/**
    + * Unescape a valid UTF-8 string from src to dst, stopping at a final unescaped quote. There
    + * must be an unescaped quote terminating the string. It returns the final output
    + * position as pointer. In case of error (e.g., the string has bad escaped codes),
    + * then null_nullptrptr is returned. It is assumed that the output buffer is large
    + * enough. E.g., if src points at 'joe"', then dst needs to have four free bytes +
    + * SIMDJSON_PADDING bytes.
    + */
    +simdjson_warn_unused simdjson_inline uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) {
    +  while (1) {
    +    // Copy the next n bytes, and find the backslash and quote in them.
    +    auto bs_quote = backslash_and_quote::copy_and_find(src, dst);
    +    // If the next thing is the end quote, copy and return
    +    if (bs_quote.has_quote_first()) {
    +      // we encountered quotes first. Move dst to point to quotes and exit
    +      return dst + bs_quote.quote_index();
    +    }
    +    if (bs_quote.has_backslash()) {
    +      /* find out where the backspace is */
    +      auto bs_dist = bs_quote.backslash_index();
    +      uint8_t escape_char = src[bs_dist + 1];
    +      /* we encountered backslash first. Handle backslash */
    +      if (escape_char == 'u') {
    +        /* move src/dst up to the start; they will be further adjusted
    +           within the unicode codepoint handling code. */
    +        src += bs_dist;
    +        dst += bs_dist;
    +        if (!handle_unicode_codepoint(&src, &dst, allow_replacement)) {
    +          return nullptr;
    +        }
    +      } else {
    +        /* simple 1:1 conversion. Will eat bs_dist+2 characters in input and
    +         * write bs_dist+1 characters to output
    +         * note this may reach beyond the part of the buffer we've actually
    +         * seen. I think this is ok */
    +        uint8_t escape_result = escape_map[escape_char];
    +        if (escape_result == 0u) {
    +          return nullptr; /* bogus escape value is an error */
    +        }
    +        dst[bs_dist] = escape_result;
    +        src += bs_dist + 2;
    +        dst += bs_dist + 1;
    +      }
    +    } else {
    +      /* they are the same. Since they can't co-occur, it means we
    +       * encountered neither. */
    +      src += backslash_and_quote::BYTES_PROCESSED;
    +      dst += backslash_and_quote::BYTES_PROCESSED;
    +    }
    +  }
    +}
    +
    +simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) {
    +  // It is not ideal that this function is nearly identical to parse_string.
    +  while (1) {
    +    // Copy the next n bytes, and find the backslash and quote in them.
    +    auto bs_quote = backslash_and_quote::copy_and_find(src, dst);
    +    // If the next thing is the end quote, copy and return
    +    if (bs_quote.has_quote_first()) {
    +      // we encountered quotes first. Move dst to point to quotes and exit
    +      return dst + bs_quote.quote_index();
    +    }
    +    if (bs_quote.has_backslash()) {
    +      /* find out where the backspace is */
    +      auto bs_dist = bs_quote.backslash_index();
    +      uint8_t escape_char = src[bs_dist + 1];
    +      /* we encountered backslash first. Handle backslash */
    +      if (escape_char == 'u') {
    +        /* move src/dst up to the start; they will be further adjusted
    +           within the unicode codepoint handling code. */
    +        src += bs_dist;
    +        dst += bs_dist;
    +        if (!handle_unicode_codepoint_wobbly(&src, &dst)) {
    +          return nullptr;
    +        }
    +      } else {
    +        /* simple 1:1 conversion. Will eat bs_dist+2 characters in input and
    +         * write bs_dist+1 characters to output
    +         * note this may reach beyond the part of the buffer we've actually
    +         * seen. I think this is ok */
    +        uint8_t escape_result = escape_map[escape_char];
    +        if (escape_result == 0u) {
    +          return nullptr; /* bogus escape value is an error */
    +        }
    +        dst[bs_dist] = escape_result;
    +        src += bs_dist + 2;
    +        dst += bs_dist + 1;
    +      }
    +    } else {
    +      /* they are the same. Since they can't co-occur, it means we
    +       * encountered neither. */
    +      src += backslash_and_quote::BYTES_PROCESSED;
    +      dst += backslash_and_quote::BYTES_PROCESSED;
    +    }
    +  }
    +}
    +
    +} // namespace stringparsing
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H
    +/* end file generic/stage2/stringparsing.h for icelake */
    +/* including generic/stage2/structural_iterator.h for icelake: #include  */
    +/* begin file generic/stage2/structural_iterator.h for icelake */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRUCTURAL_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_STRUCTURAL_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +namespace stage2 {
    +
    +class structural_iterator {
    +public:
    +  const uint8_t* const buf;
    +  uint32_t *next_structural;
    +  dom_parser_implementation &dom_parser;
    +
    +  // Start a structural
    +  simdjson_inline structural_iterator(dom_parser_implementation &_dom_parser, size_t start_structural_index)
    +    : buf{_dom_parser.buf},
    +      next_structural{&_dom_parser.structural_indexes[start_structural_index]},
    +      dom_parser{_dom_parser} {
    +  }
    +  // Get the buffer position of the current structural character
    +  simdjson_inline const uint8_t* current() {
    +    return &buf[*(next_structural-1)];
    +  }
    +  // Get the current structural character
    +  simdjson_inline char current_char() {
    +    return buf[*(next_structural-1)];
    +  }
    +  // Get the next structural character without advancing
    +  simdjson_inline char peek_next_char() {
    +    return buf[*next_structural];
    +  }
    +  simdjson_inline const uint8_t* peek() {
    +    return &buf[*next_structural];
    +  }
    +  simdjson_inline const uint8_t* advance() {
    +    return &buf[*(next_structural++)];
    +  }
    +  simdjson_inline char advance_char() {
    +    return buf[*(next_structural++)];
    +  }
    +  simdjson_inline size_t remaining_len() {
    +    return dom_parser.len - *(next_structural-1);
    +  }
    +
    +  simdjson_inline bool at_end() {
    +    return next_structural == &dom_parser.structural_indexes[dom_parser.n_structural_indexes];
    +  }
    +  simdjson_inline bool at_beginning() {
    +    return next_structural == dom_parser.structural_indexes.get();
    +  }
    +};
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_STRUCTURAL_ITERATOR_H
    +/* end file generic/stage2/structural_iterator.h for icelake */
    +/* including generic/stage2/tape_builder.h for icelake: #include  */
    +/* begin file generic/stage2/tape_builder.h for icelake */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +namespace stage2 {
    +
    +struct tape_builder {
    +  template
    +  simdjson_warn_unused static simdjson_inline error_code parse_document(
    +    dom_parser_implementation &dom_parser,
    +    dom::document &doc) noexcept;
    +
    +  /** Called when a non-empty document starts. */
    +  simdjson_warn_unused simdjson_inline error_code visit_document_start(json_iterator &iter) noexcept;
    +  /** Called when a non-empty document ends without error. */
    +  simdjson_warn_unused simdjson_inline error_code visit_document_end(json_iterator &iter) noexcept;
    +
    +  /** Called when a non-empty array starts. */
    +  simdjson_warn_unused simdjson_inline error_code visit_array_start(json_iterator &iter) noexcept;
    +  /** Called when a non-empty array ends. */
    +  simdjson_warn_unused simdjson_inline error_code visit_array_end(json_iterator &iter) noexcept;
    +  /** Called when an empty array is found. */
    +  simdjson_warn_unused simdjson_inline error_code visit_empty_array(json_iterator &iter) noexcept;
    +
    +  /** Called when a non-empty object starts. */
    +  simdjson_warn_unused simdjson_inline error_code visit_object_start(json_iterator &iter) noexcept;
    +  /**
    +   * Called when a key in a field is encountered.
    +   *
    +   * primitive, visit_object_start, visit_empty_object, visit_array_start, or visit_empty_array
    +   * will be called after this with the field value.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code visit_key(json_iterator &iter, const uint8_t *key) noexcept;
    +  /** Called when a non-empty object ends. */
    +  simdjson_warn_unused simdjson_inline error_code visit_object_end(json_iterator &iter) noexcept;
    +  /** Called when an empty object is found. */
    +  simdjson_warn_unused simdjson_inline error_code visit_empty_object(json_iterator &iter) noexcept;
    +
    +  /**
    +   * Called when a string, number, boolean or null is found.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code visit_primitive(json_iterator &iter, const uint8_t *value) noexcept;
    +  /**
    +   * Called when a string, number, boolean or null is found at the top level of a document (i.e.
    +   * when there is no array or object and the entire document is a single string, number, boolean or
    +   * null.
    +   *
    +   * This is separate from primitive() because simdjson's normal primitive parsing routines assume
    +   * there is at least one more token after the value, which is only true in an array or object.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code visit_root_primitive(json_iterator &iter, const uint8_t *value) noexcept;
    +
    +  simdjson_warn_unused simdjson_inline error_code visit_string(json_iterator &iter, const uint8_t *value, bool key = false) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_number(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_true_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_false_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_null_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +
    +  simdjson_warn_unused simdjson_inline error_code visit_root_string(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_number(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_true_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_false_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_null_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +
    +  /** Called each time a new field or element in an array or object is found. */
    +  simdjson_warn_unused simdjson_inline error_code increment_count(json_iterator &iter) noexcept;
    +
    +  /** Next location to write to tape */
    +  tape_writer tape;
    +private:
    +  /** Next write location in the string buf for stage 2 parsing */
    +  uint8_t *current_string_buf_loc;
    +
    +  simdjson_inline tape_builder(dom::document &doc) noexcept;
    +
    +  simdjson_inline uint32_t next_tape_index(json_iterator &iter) const noexcept;
    +  simdjson_inline void start_container(json_iterator &iter) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code end_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code empty_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept;
    +  simdjson_inline uint8_t *on_start_string(json_iterator &iter) noexcept;
    +  simdjson_inline void on_end_string(uint8_t *dst) noexcept;
    +}; // struct tape_builder
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code tape_builder::parse_document(
    +    dom_parser_implementation &dom_parser,
    +    dom::document &doc) noexcept {
    +  dom_parser.doc = &doc;
    +  json_iterator iter(dom_parser, STREAMING ? dom_parser.next_structural_index : 0);
    +  tape_builder builder(doc);
    +  return iter.walk_document(builder);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_primitive(json_iterator &iter, const uint8_t *value) noexcept {
    +  return iter.visit_root_primitive(*this, value);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_primitive(json_iterator &iter, const uint8_t *value) noexcept {
    +  return iter.visit_primitive(*this, value);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_empty_object(json_iterator &iter) noexcept {
    +  return empty_container(iter, internal::tape_type::START_OBJECT, internal::tape_type::END_OBJECT);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_empty_array(json_iterator &iter) noexcept {
    +  return empty_container(iter, internal::tape_type::START_ARRAY, internal::tape_type::END_ARRAY);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_document_start(json_iterator &iter) noexcept {
    +  start_container(iter);
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_object_start(json_iterator &iter) noexcept {
    +  start_container(iter);
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_array_start(json_iterator &iter) noexcept {
    +  start_container(iter);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_object_end(json_iterator &iter) noexcept {
    +  return end_container(iter, internal::tape_type::START_OBJECT, internal::tape_type::END_OBJECT);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_array_end(json_iterator &iter) noexcept {
    +  return end_container(iter, internal::tape_type::START_ARRAY, internal::tape_type::END_ARRAY);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_document_end(json_iterator &iter) noexcept {
    +  constexpr uint32_t start_tape_index = 0;
    +  tape.append(start_tape_index, internal::tape_type::ROOT);
    +  tape_writer::write(iter.dom_parser.doc->tape[start_tape_index], next_tape_index(iter), internal::tape_type::ROOT);
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_key(json_iterator &iter, const uint8_t *key) noexcept {
    +  return visit_string(iter, key, true);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::increment_count(json_iterator &iter) noexcept {
    +  iter.dom_parser.open_containers[iter.depth].count++; // we have a key value pair in the object at parser.dom_parser.depth - 1
    +  return SUCCESS;
    +}
    +
    +simdjson_inline tape_builder::tape_builder(dom::document &doc) noexcept : tape{doc.tape.get()}, current_string_buf_loc{doc.string_buf.get()} {}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_string(json_iterator &iter, const uint8_t *value, bool key) noexcept {
    +  iter.log_value(key ? "key" : "string");
    +  uint8_t *dst = on_start_string(iter);
    +  dst = stringparsing::parse_string(value+1, dst, false); // We do not allow replacement when the escape characters are invalid.
    +  if (dst == nullptr) {
    +    iter.log_error("Invalid escape in string");
    +    return STRING_ERROR;
    +  }
    +  on_end_string(dst);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_string(json_iterator &iter, const uint8_t *value) noexcept {
    +  return visit_string(iter, value);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_number(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("number");
    +  return numberparsing::parse_number(value, tape);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_number(json_iterator &iter, const uint8_t *value) noexcept {
    +  //
    +  // We need to make a copy to make sure that the string is space terminated.
    +  // This is not about padding the input, which should already padded up
    +  // to len + SIMDJSON_PADDING. However, we have no control at this stage
    +  // on how the padding was done. What if the input string was padded with nulls?
    +  // It is quite common for an input string to have an extra null character (C string).
    +  // We do not want to allow 9\0 (where \0 is the null character) inside a JSON
    +  // document, but the string "9\0" by itself is fine. So we make a copy and
    +  // pad the input with spaces when we know that there is just one input element.
    +  // This copy is relatively expensive, but it will almost never be called in
    +  // practice unless you are in the strange scenario where you have many JSON
    +  // documents made of single atoms.
    +  //
    +  std::unique_ptrcopy(new (std::nothrow) uint8_t[iter.remaining_len() + SIMDJSON_PADDING]);
    +  if (copy.get() == nullptr) { return MEMALLOC; }
    +  std::memcpy(copy.get(), value, iter.remaining_len());
    +  std::memset(copy.get() + iter.remaining_len(), ' ', SIMDJSON_PADDING);
    +  error_code error = visit_number(iter, copy.get());
    +  return error;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_true_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("true");
    +  if (!atomparsing::is_valid_true_atom(value)) { return T_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::TRUE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_true_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("true");
    +  if (!atomparsing::is_valid_true_atom(value, iter.remaining_len())) { return T_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::TRUE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_false_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("false");
    +  if (!atomparsing::is_valid_false_atom(value)) { return F_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::FALSE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_false_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("false");
    +  if (!atomparsing::is_valid_false_atom(value, iter.remaining_len())) { return F_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::FALSE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_null_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("null");
    +  if (!atomparsing::is_valid_null_atom(value)) { return N_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::NULL_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_null_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("null");
    +  if (!atomparsing::is_valid_null_atom(value, iter.remaining_len())) { return N_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::NULL_VALUE);
    +  return SUCCESS;
    +}
    +
    +// private:
    +
    +simdjson_inline uint32_t tape_builder::next_tape_index(json_iterator &iter) const noexcept {
    +  return uint32_t(tape.next_tape_loc - iter.dom_parser.doc->tape.get());
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::empty_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept {
    +  auto start_index = next_tape_index(iter);
    +  tape.append(start_index+2, start);
    +  tape.append(start_index, end);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline void tape_builder::start_container(json_iterator &iter) noexcept {
    +  iter.dom_parser.open_containers[iter.depth].tape_index = next_tape_index(iter);
    +  iter.dom_parser.open_containers[iter.depth].count = 0;
    +  tape.skip(); // We don't actually *write* the start element until the end.
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::end_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept {
    +  // Write the ending tape element, pointing at the start location
    +  const uint32_t start_tape_index = iter.dom_parser.open_containers[iter.depth].tape_index;
    +  tape.append(start_tape_index, end);
    +  // Write the start tape element, pointing at the end location (and including count)
    +  // count can overflow if it exceeds 24 bits... so we saturate
    +  // the convention being that a cnt of 0xffffff or more is undetermined in value (>=  0xffffff).
    +  const uint32_t count = iter.dom_parser.open_containers[iter.depth].count;
    +  const uint32_t cntsat = count > 0xFFFFFF ? 0xFFFFFF : count;
    +  tape_writer::write(iter.dom_parser.doc->tape[start_tape_index], next_tape_index(iter) | (uint64_t(cntsat) << 32), start);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline uint8_t *tape_builder::on_start_string(json_iterator &iter) noexcept {
    +  // we advance the point, accounting for the fact that we have a NULL termination
    +  tape.append(current_string_buf_loc - iter.dom_parser.doc->string_buf.get(), internal::tape_type::STRING);
    +  return current_string_buf_loc + sizeof(uint32_t);
    +}
    +
    +simdjson_inline void tape_builder::on_end_string(uint8_t *dst) noexcept {
    +  uint32_t str_length = uint32_t(dst - (current_string_buf_loc + sizeof(uint32_t)));
    +  // TODO check for overflow in case someone has a crazy string (>=4GB?)
    +  // But only add the overflow check when the document itself exceeds 4GB
    +  // Currently unneeded because we refuse to parse docs larger or equal to 4GB.
    +  memcpy(current_string_buf_loc, &str_length, sizeof(uint32_t));
    +  // NULL termination is still handy if you expect all your strings to
    +  // be NULL terminated? It comes at a small cost
    +  *dst = 0;
    +  current_string_buf_loc = dst + 1;
    +}
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H
    +/* end file generic/stage2/tape_builder.h for icelake */
    +/* end file generic/stage2/amalgamated.h for icelake */
    +
    +#undef SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER
    +
    +//
    +// Stage 1
    +//
    +
    +namespace simdjson {
    +namespace icelake {
    +
    +simdjson_warn_unused error_code implementation::create_dom_parser_implementation(
    +  size_t capacity,
    +  size_t max_depth,
    +  std::unique_ptr& dst
    +) const noexcept {
    +  dst.reset( new (std::nothrow) dom_parser_implementation() );
    +  if (!dst) { return MEMALLOC; }
    +  if (auto err = dst->set_capacity(capacity))
    +    return err;
    +  if (auto err = dst->set_max_depth(max_depth))
    +    return err;
    +  return SUCCESS;
    +}
    +
    +namespace {
    +
    +using namespace simd;
    +
    +// This identifies structural characters (comma, colon, braces, brackets),
    +// and ASCII white-space ('\r','\n','\t',' ').
    +simdjson_inline json_character_block json_character_block::classify(const simd::simd8x64& in) {
    +  // These lookups rely on the fact that anything < 127 will match the lower 4 bits, which is why
    +  // we can't use the generic lookup_16.
    +  const auto whitespace_table = simd8::repeat_16(' ', 100, 100, 100, 17, 100, 113, 2, 100, '\t', '\n', 112, 100, '\r', 100, 100);
    +
    +  // The 6 operators (:,[]{}) have these values:
    +  //
    +  // , 2C
    +  // : 3A
    +  // [ 5B
    +  // { 7B
    +  // ] 5D
    +  // } 7D
    +  //
    +  // If you use | 0x20 to turn [ and ] into { and }, the lower 4 bits of each character is unique.
    +  // We exploit this, using a simd 4-bit lookup to tell us which character match against, and then
    +  // match it (against | 0x20).
    +  //
    +  // To prevent recognizing other characters, everything else gets compared with 0, which cannot
    +  // match due to the | 0x20.
    +  //
    +  // NOTE: Due to the | 0x20, this ALSO treats  and  (control characters 0C and 1A) like ,
    +  // and :. This gets caught in stage 2, which checks the actual character to ensure the right
    +  // operators are in the right places.
    +  const auto op_table = simd8::repeat_16(
    +    0, 0, 0, 0,
    +    0, 0, 0, 0,
    +    0, 0, ':', '{', // : = 3A, [ = 5B, { = 7B
    +    ',', '}', 0, 0  // , = 2C, ] = 5D, } = 7D
    +  );
    +
    +  // We compute whitespace and op separately. If later code only uses one or the
    +  // other, given the fact that all functions are aggressively inlined, we can
    +  // hope that useless computations will be omitted. This is namely case when
    +  // minifying (we only need whitespace).
    +
    +  const uint64_t whitespace = in.eq({
    +    _mm512_shuffle_epi8(whitespace_table, in.chunks[0])
    +  });
    +  // Turn [ and ] into { and }
    +  const simd8x64 curlified{
    +    in.chunks[0] | 0x20
    +  };
    +  const uint64_t op = curlified.eq({
    +    _mm512_shuffle_epi8(op_table, in.chunks[0])
    +  });
    +
    +  return { whitespace, op };
    +}
    +
    +simdjson_inline bool is_ascii(const simd8x64& input) {
    +  return input.reduce_or().is_ascii();
    +}
    +
    +simdjson_unused simdjson_inline simd8 must_be_continuation(const simd8 prev1, const simd8 prev2, const simd8 prev3) {
    +  simd8 is_second_byte = prev1.saturating_sub(0xc0u-1); // Only 11______ will be > 0
    +  simd8 is_third_byte  = prev2.saturating_sub(0xe0u-1); // Only 111_____ will be > 0
    +  simd8 is_fourth_byte = prev3.saturating_sub(0xf0u-1); // Only 1111____ will be > 0
    +  // Caller requires a bool (all 1's). All values resulting from the subtraction will be <= 64, so signed comparison is fine.
    +  return simd8(is_second_byte | is_third_byte | is_fourth_byte) > int8_t(0);
    +}
    +
    +simdjson_inline simd8 must_be_2_3_continuation(const simd8 prev2, const simd8 prev3) {
    +  simd8 is_third_byte  = prev2.saturating_sub(0xe0u-1); // Only 111_____ will be > 0
    +  simd8 is_fourth_byte = prev3.saturating_sub(0xf0u-1); // Only 1111____ will be > 0
    +  // Caller requires a bool (all 1's). All values resulting from the subtraction will be <= 64, so signed comparison is fine.
    +  return simd8(is_third_byte | is_fourth_byte) > int8_t(0);
    +}
    +
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +/**
    + * We provide a custom version of bit_indexer::write using
    + * naked intrinsics.
    + * TODO: make this code more elegant.
    + */
    +// Under GCC 12, the intrinsic _mm512_extracti32x4_epi32 may generate 'maybe uninitialized'.
    +// as a workaround, we disable warnings within the following function.
    +SIMDJSON_PUSH_DISABLE_ALL_WARNINGS
    +namespace simdjson { namespace icelake { namespace { namespace stage1 {
    +simdjson_inline void bit_indexer::write(uint32_t idx, uint64_t bits) {
    +    // In some instances, the next branch is expensive because it is mispredicted.
    +    // Unfortunately, in other cases,
    +    // it helps tremendously.
    +    if (bits == 0) { return; }
    +
    +    const __m512i indexes = _mm512_maskz_compress_epi8(bits, _mm512_set_epi32(
    +      0x3f3e3d3c, 0x3b3a3938, 0x37363534, 0x33323130,
    +      0x2f2e2d2c, 0x2b2a2928, 0x27262524, 0x23222120,
    +      0x1f1e1d1c, 0x1b1a1918, 0x17161514, 0x13121110,
    +      0x0f0e0d0c, 0x0b0a0908, 0x07060504, 0x03020100
    +    ));
    +    const __m512i start_index = _mm512_set1_epi32(idx);
    +
    +    const auto count = count_ones(bits);
    +    __m512i t0 = _mm512_cvtepu8_epi32(_mm512_castsi512_si128(indexes));
    +    _mm512_storeu_si512(this->tail, _mm512_add_epi32(t0, start_index));
    +
    +    if(count > 16) {
    +      const __m512i t1 = _mm512_cvtepu8_epi32(_mm512_extracti32x4_epi32(indexes, 1));
    +      _mm512_storeu_si512(this->tail + 16, _mm512_add_epi32(t1, start_index));
    +      if(count > 32) {
    +        const __m512i t2 = _mm512_cvtepu8_epi32(_mm512_extracti32x4_epi32(indexes, 2));
    +        _mm512_storeu_si512(this->tail + 32, _mm512_add_epi32(t2, start_index));
    +        if(count > 48) {
    +          const __m512i t3 = _mm512_cvtepu8_epi32(_mm512_extracti32x4_epi32(indexes, 3));
    +          _mm512_storeu_si512(this->tail + 48, _mm512_add_epi32(t3, start_index));
    +        }
    +      }
    +    }
    +    this->tail += count;
    +}
    +}}}}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +//
    +// Stage 2
    +//
    +
    +//
    +// Implementation-specific overrides
    +//
    +namespace simdjson {
    +namespace icelake {
    +
    +simdjson_warn_unused error_code implementation::minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept {
    +  return icelake::stage1::json_minifier::minify<128>(buf, len, dst, dst_len);
    +}
    +
    +simdjson_warn_unused error_code dom_parser_implementation::stage1(const uint8_t *_buf, size_t _len, stage1_mode streaming) noexcept {
    +  this->buf = _buf;
    +  this->len = _len;
    +  return icelake::stage1::json_structural_indexer::index<128>(_buf, _len, *this, streaming);
    +}
    +
    +simdjson_warn_unused bool implementation::validate_utf8(const char *buf, size_t len) const noexcept {
    +  return icelake::stage1::generic_validate_utf8(buf,len);
    +}
    +
    +simdjson_warn_unused error_code dom_parser_implementation::stage2(dom::document &_doc) noexcept {
    +  return stage2::tape_builder::parse_document(*this, _doc);
    +}
    +
    +simdjson_warn_unused error_code dom_parser_implementation::stage2_next(dom::document &_doc) noexcept {
    +  return stage2::tape_builder::parse_document(*this, _doc);
    +}
    +
    +simdjson_warn_unused uint8_t *dom_parser_implementation::parse_string(const uint8_t *src, uint8_t *dst, bool replacement_char) const noexcept {
    +  return icelake::stringparsing::parse_string(src, dst, replacement_char);
    +}
    +
    +simdjson_warn_unused uint8_t *dom_parser_implementation::parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept {
    +  return icelake::stringparsing::parse_wobbly_string(src, dst);
    +}
    +
    +simdjson_warn_unused error_code dom_parser_implementation::parse(const uint8_t *_buf, size_t _len, dom::document &_doc) noexcept {
    +  auto error = stage1(_buf, _len, stage1_mode::regular);
    +  if (error) { return error; }
    +  return stage2(_doc);
    +}
    +
    +} // namespace icelake
    +} // namespace simdjson
    +
    +/* including simdjson/icelake/end.h: #include  */
    +/* begin file simdjson/icelake/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_ICELAKE
    +SIMDJSON_UNTARGET_REGION
    +#endif
    +
    +/* undefining SIMDJSON_IMPLEMENTATION from "icelake" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/icelake/end.h */
    +
    +#endif // SIMDJSON_SRC_ICELAKE_CPP
    +/* end file icelake.cpp */
    +#endif
    +#if SIMDJSON_IMPLEMENTATION_PPC64
    +/* including ppc64.cpp: #include  */
    +/* begin file ppc64.cpp */
    +#ifndef SIMDJSON_SRC_PPC64_CPP
    +#define SIMDJSON_SRC_PPC64_CPP
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +/* including simdjson/ppc64.h: #include  */
    +/* begin file simdjson/ppc64.h */
    +#ifndef SIMDJSON_PPC64_H
    +#define SIMDJSON_PPC64_H
    +
    +/* including simdjson/ppc64/begin.h: #include "simdjson/ppc64/begin.h" */
    +/* begin file simdjson/ppc64/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "ppc64" */
    +#define SIMDJSON_IMPLEMENTATION ppc64
    +/* including simdjson/ppc64/base.h: #include "simdjson/ppc64/base.h" */
    +/* begin file simdjson/ppc64/base.h */
    +#ifndef SIMDJSON_PPC64_BASE_H
    +#define SIMDJSON_PPC64_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +/**
    + * Implementation for ALTIVEC (PPC64).
    + */
    +namespace ppc64 {
    +
    +class implementation;
    +
    +namespace {
    +namespace simd {
    +template  struct simd8;
    +template  struct simd8x64;
    +} // namespace simd
    +} // unnamed namespace
    +
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_PPC64_BASE_H
    +/* end file simdjson/ppc64/base.h */
    +/* including simdjson/ppc64/intrinsics.h: #include "simdjson/ppc64/intrinsics.h" */
    +/* begin file simdjson/ppc64/intrinsics.h */
    +#ifndef SIMDJSON_PPC64_INTRINSICS_H
    +#define SIMDJSON_PPC64_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This should be the correct header whether
    +// you use visual studio or other compilers.
    +#include 
    +
    +// These are defined by altivec.h in GCC toolchain, it is safe to undef them.
    +#ifdef bool
    +#undef bool
    +#endif
    +
    +#ifdef vector
    +#undef vector
    +#endif
    +
    +static_assert(sizeof(__vector unsigned char) <= simdjson::SIMDJSON_PADDING, "insufficient padding for ppc64");
    +
    +#endif //  SIMDJSON_PPC64_INTRINSICS_H
    +/* end file simdjson/ppc64/intrinsics.h */
    +/* including simdjson/ppc64/bitmanipulation.h: #include "simdjson/ppc64/bitmanipulation.h" */
    +/* begin file simdjson/ppc64/bitmanipulation.h */
    +#ifndef SIMDJSON_PPC64_BITMANIPULATION_H
    +#define SIMDJSON_PPC64_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long ret;
    +  // Search the mask data from least significant bit (LSB)
    +  // to the most significant bit (MSB) for a set bit (1).
    +  _BitScanForward64(&ret, input_num);
    +  return (int)ret;
    +#else  // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return input_num & (input_num - 1);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long leading_zero = 0;
    +  // Search the mask data from most significant bit (MSB)
    +  // to least significant bit (LSB) for a set bit (1).
    +  if (_BitScanReverse64(&leading_zero, input_num))
    +    return (int)(63 - leading_zero);
    +  else
    +    return 64;
    +#else
    +  return __builtin_clzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +simdjson_inline int count_ones(uint64_t input_num) {
    +  // note: we do not support legacy 32-bit Windows in this kernel
    +  return __popcnt64(input_num); // Visual Studio wants two underscores
    +}
    +#else
    +simdjson_inline int count_ones(uint64_t input_num) {
    +  return __builtin_popcountll(input_num);
    +}
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2,
    +                                         uint64_t *result) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  *result = value1 + value2;
    +  return *result < value1;
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_PPC64_BITMANIPULATION_H
    +/* end file simdjson/ppc64/bitmanipulation.h */
    +/* including simdjson/ppc64/bitmask.h: #include "simdjson/ppc64/bitmask.h" */
    +/* begin file simdjson/ppc64/bitmask.h */
    +#ifndef SIMDJSON_PPC64_BITMASK_H
    +#define SIMDJSON_PPC64_BITMASK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +
    +//
    +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is
    +// encountered.
    +//
    +// For example, prefix_xor(00100100) == 00011100
    +//
    +simdjson_inline uint64_t prefix_xor(uint64_t bitmask) {
    +  // You can use the version below, however gcc sometimes miscompiles
    +  // vec_pmsum_be, it happens somewhere around between 8 and 9th version.
    +  // The performance boost was not noticeable, falling back to a usual
    +  // implementation.
    +  //   __vector unsigned long long all_ones = {~0ull, ~0ull};
    +  //   __vector unsigned long long mask = {bitmask, 0};
    +  //   // Clang and GCC return different values for pmsum for ull so cast it to one.
    +  //   // Generally it is not specified by ALTIVEC ISA what is returned by
    +  //   // vec_pmsum_be.
    +  // #if defined(__LITTLE_ENDIAN__)
    +  //   return (uint64_t)(((__vector unsigned long long)vec_pmsum_be(all_ones, mask))[0]);
    +  // #else
    +  //   return (uint64_t)(((__vector unsigned long long)vec_pmsum_be(all_ones, mask))[1]);
    +  // #endif
    +  bitmask ^= bitmask << 1;
    +  bitmask ^= bitmask << 2;
    +  bitmask ^= bitmask << 4;
    +  bitmask ^= bitmask << 8;
    +  bitmask ^= bitmask << 16;
    +  bitmask ^= bitmask << 32;
    +  return bitmask;
    +}
    +
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif
    +/* end file simdjson/ppc64/bitmask.h */
    +/* including simdjson/ppc64/numberparsing_defs.h: #include "simdjson/ppc64/numberparsing_defs.h" */
    +/* begin file simdjson/ppc64/numberparsing_defs.h */
    +#ifndef SIMDJSON_PPC64_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_PPC64_NUMBERPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +#if defined(__linux__)
    +#include 
    +#elif defined(__FreeBSD__)
    +#include 
    +#endif
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace numberparsing {
    +
    +// we don't have appropriate instructions, so let us use a scalar function
    +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  uint64_t val;
    +  std::memcpy(&val, chars, sizeof(uint64_t));
    +#ifdef __BIG_ENDIAN__
    +#if defined(__linux__)
    +  val = bswap_64(val);
    +#elif defined(__FreeBSD__)
    +  val = bswap64(val);
    +#endif
    +#endif
    +  val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8;
    +  val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16;
    +  return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32);
    +}
    +
    +/** @private */
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif // SIMDJSON_PPC64_NUMBERPARSING_DEFS_H
    +/* end file simdjson/ppc64/numberparsing_defs.h */
    +/* including simdjson/ppc64/simd.h: #include "simdjson/ppc64/simd.h" */
    +/* begin file simdjson/ppc64/simd.h */
    +#ifndef SIMDJSON_PPC64_SIMD_H
    +#define SIMDJSON_PPC64_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +namespace simd {
    +
    +using __m128i = __vector unsigned char;
    +
    +template  struct base {
    +  __m128i value;
    +
    +  // Zero constructor
    +  simdjson_inline base() : value{__m128i()} {}
    +
    +  // Conversion from SIMD register
    +  simdjson_inline base(const __m128i _value) : value(_value) {}
    +
    +  // Conversion to SIMD register
    +  simdjson_inline operator const __m128i &() const {
    +    return this->value;
    +  }
    +  simdjson_inline operator __m128i &() { return this->value; }
    +
    +  // Bit operations
    +  simdjson_inline Child operator|(const Child other) const {
    +    return vec_or(this->value, (__m128i)other);
    +  }
    +  simdjson_inline Child operator&(const Child other) const {
    +    return vec_and(this->value, (__m128i)other);
    +  }
    +  simdjson_inline Child operator^(const Child other) const {
    +    return vec_xor(this->value, (__m128i)other);
    +  }
    +  simdjson_inline Child bit_andnot(const Child other) const {
    +    return vec_andc(this->value, (__m128i)other);
    +  }
    +  simdjson_inline Child &operator|=(const Child other) {
    +    auto this_cast = static_cast(this);
    +    *this_cast = *this_cast | other;
    +    return *this_cast;
    +  }
    +  simdjson_inline Child &operator&=(const Child other) {
    +    auto this_cast = static_cast(this);
    +    *this_cast = *this_cast & other;
    +    return *this_cast;
    +  }
    +  simdjson_inline Child &operator^=(const Child other) {
    +    auto this_cast = static_cast(this);
    +    *this_cast = *this_cast ^ other;
    +    return *this_cast;
    +  }
    +};
    +
    +template >
    +struct base8 : base> {
    +  typedef uint16_t bitmask_t;
    +  typedef uint32_t bitmask2_t;
    +
    +  simdjson_inline base8() : base>() {}
    +  simdjson_inline base8(const __m128i _value) : base>(_value) {}
    +
    +  friend simdjson_inline Mask operator==(const simd8 lhs, const simd8 rhs) {
    +    return (__m128i)vec_cmpeq(lhs.value, (__m128i)rhs);
    +  }
    +
    +  static const int SIZE = sizeof(base>::value);
    +
    +  template 
    +  simdjson_inline simd8 prev(simd8 prev_chunk) const {
    +    __m128i chunk = this->value;
    +#ifdef __LITTLE_ENDIAN__
    +    chunk = (__m128i)vec_reve(this->value);
    +    prev_chunk = (__m128i)vec_reve((__m128i)prev_chunk);
    +#endif
    +    chunk = (__m128i)vec_sld((__m128i)prev_chunk, (__m128i)chunk, 16 - N);
    +#ifdef __LITTLE_ENDIAN__
    +    chunk = (__m128i)vec_reve((__m128i)chunk);
    +#endif
    +    return chunk;
    +  }
    +};
    +
    +// SIMD byte mask type (returned by things like eq and gt)
    +template <> struct simd8 : base8 {
    +  static simdjson_inline simd8 splat(bool _value) {
    +    return (__m128i)vec_splats((unsigned char)(-(!!_value)));
    +  }
    +
    +  simdjson_inline simd8() : base8() {}
    +  simdjson_inline simd8(const __m128i _value)
    +      : base8(_value) {}
    +  // Splat constructor
    +  simdjson_inline simd8(bool _value)
    +      : base8(splat(_value)) {}
    +
    +  simdjson_inline int to_bitmask() const {
    +    __vector unsigned long long result;
    +    const __m128i perm_mask = {0x78, 0x70, 0x68, 0x60, 0x58, 0x50, 0x48, 0x40,
    +                               0x38, 0x30, 0x28, 0x20, 0x18, 0x10, 0x08, 0x00};
    +
    +    result = ((__vector unsigned long long)vec_vbpermq((__m128i)this->value,
    +                                                       (__m128i)perm_mask));
    +#ifdef __LITTLE_ENDIAN__
    +    return static_cast(result[1]);
    +#else
    +    return static_cast(result[0]);
    +#endif
    +  }
    +  simdjson_inline bool any() const {
    +    return !vec_all_eq(this->value, (__m128i)vec_splats(0));
    +  }
    +  simdjson_inline simd8 operator~() const {
    +    return this->value ^ (__m128i)splat(true);
    +  }
    +};
    +
    +template  struct base8_numeric : base8 {
    +  static simdjson_inline simd8 splat(T value) {
    +    (void)value;
    +    return (__m128i)vec_splats(value);
    +  }
    +  static simdjson_inline simd8 zero() { return splat(0); }
    +  static simdjson_inline simd8 load(const T values[16]) {
    +    return (__m128i)(vec_vsx_ld(0, reinterpret_cast(values)));
    +  }
    +  // Repeat 16 values as many times as necessary (usually for lookup tables)
    +  static simdjson_inline simd8 repeat_16(T v0, T v1, T v2, T v3, T v4,
    +                                                   T v5, T v6, T v7, T v8, T v9,
    +                                                   T v10, T v11, T v12, T v13,
    +                                                   T v14, T v15) {
    +    return simd8(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
    +                    v14, v15);
    +  }
    +
    +  simdjson_inline base8_numeric() : base8() {}
    +  simdjson_inline base8_numeric(const __m128i _value)
    +      : base8(_value) {}
    +
    +  // Store to array
    +  simdjson_inline void store(T dst[16]) const {
    +    vec_vsx_st(this->value, 0, reinterpret_cast<__m128i *>(dst));
    +  }
    +
    +  // Override to distinguish from bool version
    +  simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +
    +  // Addition/subtraction are the same for signed and unsigned
    +  simdjson_inline simd8 operator+(const simd8 other) const {
    +    return (__m128i)((__m128i)this->value + (__m128i)other);
    +  }
    +  simdjson_inline simd8 operator-(const simd8 other) const {
    +    return (__m128i)((__m128i)this->value - (__m128i)other);
    +  }
    +  simdjson_inline simd8 &operator+=(const simd8 other) {
    +    *this = *this + other;
    +    return *static_cast *>(this);
    +  }
    +  simdjson_inline simd8 &operator-=(const simd8 other) {
    +    *this = *this - other;
    +    return *static_cast *>(this);
    +  }
    +
    +  // Perform a lookup assuming the value is between 0 and 16 (undefined behavior
    +  // for out of range values)
    +  template 
    +  simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +    return (__m128i)vec_perm((__m128i)lookup_table, (__m128i)lookup_table, this->value);
    +  }
    +
    +  // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted
    +  // as a bitset). Passing a 0 value for mask would be equivalent to writing out
    +  // every byte to output. Only the first 16 - count_ones(mask) bytes of the
    +  // result are significant but 16 bytes get written. Design consideration: it
    +  // seems like a function with the signature simd8 compress(uint32_t mask)
    +  // would be sensible, but the AVX ISA makes this kind of approach difficult.
    +  template 
    +  simdjson_inline void compress(uint16_t mask, L *output) const {
    +    using internal::BitsSetTable256mul2;
    +    using internal::pshufb_combine_table;
    +    using internal::thintable_epi8;
    +    // this particular implementation was inspired by work done by @animetosho
    +    // we do it in two steps, first 8 bytes and then second 8 bytes
    +    uint8_t mask1 = uint8_t(mask);      // least significant 8 bits
    +    uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
    +    // next line just loads the 64-bit values thintable_epi8[mask1] and
    +    // thintable_epi8[mask2] into a 128-bit register, using only
    +    // two instructions on most compilers.
    +#ifdef __LITTLE_ENDIAN__
    +    __m128i shufmask = (__m128i)(__vector unsigned long long){
    +        thintable_epi8[mask1], thintable_epi8[mask2]};
    +#else
    +    __m128i shufmask = (__m128i)(__vector unsigned long long){
    +        thintable_epi8[mask2], thintable_epi8[mask1]};
    +    shufmask = (__m128i)vec_reve((__m128i)shufmask);
    +#endif
    +    // we increment by 0x08 the second half of the mask
    +    shufmask = ((__m128i)shufmask) +
    +               ((__m128i)(__vector int){0, 0, 0x08080808, 0x08080808});
    +
    +    // this is the version "nearly pruned"
    +    __m128i pruned = vec_perm(this->value, this->value, shufmask);
    +    // we still need to put the two halves together.
    +    // we compute the popcount of the first half:
    +    int pop1 = BitsSetTable256mul2[mask1];
    +    // then load the corresponding mask, what it does is to write
    +    // only the first pop1 bytes from the first 8 bytes, and then
    +    // it fills in with the bytes from the second 8 bytes + some filling
    +    // at the end.
    +    __m128i compactmask =
    +        vec_vsx_ld(0, reinterpret_cast(pshufb_combine_table + pop1 * 8));
    +    __m128i answer = vec_perm(pruned, (__m128i)vec_splats(0), compactmask);
    +    vec_vsx_st(answer, 0, reinterpret_cast<__m128i *>(output));
    +  }
    +
    +  template 
    +  simdjson_inline simd8
    +  lookup_16(L replace0, L replace1, L replace2, L replace3, L replace4,
    +            L replace5, L replace6, L replace7, L replace8, L replace9,
    +            L replace10, L replace11, L replace12, L replace13, L replace14,
    +            L replace15) const {
    +    return lookup_16(simd8::repeat_16(
    +        replace0, replace1, replace2, replace3, replace4, replace5, replace6,
    +        replace7, replace8, replace9, replace10, replace11, replace12,
    +        replace13, replace14, replace15));
    +  }
    +};
    +
    +// Signed bytes
    +template <> struct simd8 : base8_numeric {
    +  simdjson_inline simd8() : base8_numeric() {}
    +  simdjson_inline simd8(const __m128i _value)
    +      : base8_numeric(_value) {}
    +  // Splat constructor
    +  simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +  // Array constructor
    +  simdjson_inline simd8(const int8_t *values) : simd8(load(values)) {}
    +  // Member-by-member initialization
    +  simdjson_inline simd8(int8_t v0, int8_t v1, int8_t v2, int8_t v3,
    +                               int8_t v4, int8_t v5, int8_t v6, int8_t v7,
    +                               int8_t v8, int8_t v9, int8_t v10, int8_t v11,
    +                               int8_t v12, int8_t v13, int8_t v14, int8_t v15)
    +      : simd8((__m128i)(__vector signed char){v0, v1, v2, v3, v4, v5, v6, v7,
    +                                              v8, v9, v10, v11, v12, v13, v14,
    +                                              v15}) {}
    +  // Repeat 16 values as many times as necessary (usually for lookup tables)
    +  simdjson_inline static simd8
    +  repeat_16(int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5,
    +            int8_t v6, int8_t v7, int8_t v8, int8_t v9, int8_t v10, int8_t v11,
    +            int8_t v12, int8_t v13, int8_t v14, int8_t v15) {
    +    return simd8(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
    +                         v13, v14, v15);
    +  }
    +
    +  // Order-sensitive comparisons
    +  simdjson_inline simd8
    +  max_val(const simd8 other) const {
    +    return (__m128i)vec_max((__vector signed char)this->value,
    +                            (__vector signed char)(__m128i)other);
    +  }
    +  simdjson_inline simd8
    +  min_val(const simd8 other) const {
    +    return (__m128i)vec_min((__vector signed char)this->value,
    +                            (__vector signed char)(__m128i)other);
    +  }
    +  simdjson_inline simd8
    +  operator>(const simd8 other) const {
    +    return (__m128i)vec_cmpgt((__vector signed char)this->value,
    +                              (__vector signed char)(__m128i)other);
    +  }
    +  simdjson_inline simd8
    +  operator<(const simd8 other) const {
    +    return (__m128i)vec_cmplt((__vector signed char)this->value,
    +                              (__vector signed char)(__m128i)other);
    +  }
    +};
    +
    +// Unsigned bytes
    +template <> struct simd8 : base8_numeric {
    +  simdjson_inline simd8() : base8_numeric() {}
    +  simdjson_inline simd8(const __m128i _value)
    +      : base8_numeric(_value) {}
    +  // Splat constructor
    +  simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +  // Array constructor
    +  simdjson_inline simd8(const uint8_t *values) : simd8(load(values)) {}
    +  // Member-by-member initialization
    +  simdjson_inline
    +  simd8(uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5,
    +        uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9, uint8_t v10,
    +        uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15)
    +      : simd8((__m128i){v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
    +                        v13, v14, v15}) {}
    +  // Repeat 16 values as many times as necessary (usually for lookup tables)
    +  simdjson_inline static simd8
    +  repeat_16(uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4,
    +            uint8_t v5, uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9,
    +            uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14,
    +            uint8_t v15) {
    +    return simd8(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
    +                          v13, v14, v15);
    +  }
    +
    +  // Saturated math
    +  simdjson_inline simd8
    +  saturating_add(const simd8 other) const {
    +    return (__m128i)vec_adds(this->value, (__m128i)other);
    +  }
    +  simdjson_inline simd8
    +  saturating_sub(const simd8 other) const {
    +    return (__m128i)vec_subs(this->value, (__m128i)other);
    +  }
    +
    +  // Order-specific operations
    +  simdjson_inline simd8
    +  max_val(const simd8 other) const {
    +    return (__m128i)vec_max(this->value, (__m128i)other);
    +  }
    +  simdjson_inline simd8
    +  min_val(const simd8 other) const {
    +    return (__m128i)vec_min(this->value, (__m128i)other);
    +  }
    +  // Same as >, but only guarantees true is nonzero (< guarantees true = -1)
    +  simdjson_inline simd8
    +  gt_bits(const simd8 other) const {
    +    return this->saturating_sub(other);
    +  }
    +  // Same as <, but only guarantees true is nonzero (< guarantees true = -1)
    +  simdjson_inline simd8
    +  lt_bits(const simd8 other) const {
    +    return other.saturating_sub(*this);
    +  }
    +  simdjson_inline simd8
    +  operator<=(const simd8 other) const {
    +    return other.max_val(*this) == other;
    +  }
    +  simdjson_inline simd8
    +  operator>=(const simd8 other) const {
    +    return other.min_val(*this) == other;
    +  }
    +  simdjson_inline simd8
    +  operator>(const simd8 other) const {
    +    return this->gt_bits(other).any_bits_set();
    +  }
    +  simdjson_inline simd8
    +  operator<(const simd8 other) const {
    +    return this->gt_bits(other).any_bits_set();
    +  }
    +
    +  // Bit-specific operations
    +  simdjson_inline simd8 bits_not_set() const {
    +    return (__m128i)vec_cmpeq(this->value, (__m128i)vec_splats(uint8_t(0)));
    +  }
    +  simdjson_inline simd8 bits_not_set(simd8 bits) const {
    +    return (*this & bits).bits_not_set();
    +  }
    +  simdjson_inline simd8 any_bits_set() const {
    +    return ~this->bits_not_set();
    +  }
    +  simdjson_inline simd8 any_bits_set(simd8 bits) const {
    +    return ~this->bits_not_set(bits);
    +  }
    +  simdjson_inline bool bits_not_set_anywhere() const {
    +    return vec_all_eq(this->value, (__m128i)vec_splats(0));
    +  }
    +  simdjson_inline bool any_bits_set_anywhere() const {
    +    return !bits_not_set_anywhere();
    +  }
    +  simdjson_inline bool bits_not_set_anywhere(simd8 bits) const {
    +    return vec_all_eq(vec_and(this->value, (__m128i)bits),
    +                      (__m128i)vec_splats(0));
    +  }
    +  simdjson_inline bool any_bits_set_anywhere(simd8 bits) const {
    +    return !bits_not_set_anywhere(bits);
    +  }
    +  template  simdjson_inline simd8 shr() const {
    +    return simd8(
    +        (__m128i)vec_sr(this->value, (__m128i)vec_splat_u8(N)));
    +  }
    +  template  simdjson_inline simd8 shl() const {
    +    return simd8(
    +        (__m128i)vec_sl(this->value, (__m128i)vec_splat_u8(N)));
    +  }
    +};
    +
    +template  struct simd8x64 {
    +  static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +  static_assert(NUM_CHUNKS == 4,
    +                "PPC64 kernel should use four registers per 64-byte block.");
    +  const simd8 chunks[NUM_CHUNKS];
    +
    +  simd8x64(const simd8x64 &o) = delete; // no copy allowed
    +  simd8x64 &
    +  operator=(const simd8& other) = delete; // no assignment allowed
    +  simd8x64() = delete;                      // no default constructor allowed
    +
    +  simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1,
    +                                  const simd8 chunk2, const simd8 chunk3)
    +      : chunks{chunk0, chunk1, chunk2, chunk3} {}
    +  simdjson_inline simd8x64(const T ptr[64])
    +      : chunks{simd8::load(ptr), simd8::load(ptr + 16),
    +               simd8::load(ptr + 32), simd8::load(ptr + 48)} {}
    +
    +  simdjson_inline void store(T ptr[64]) const {
    +    this->chunks[0].store(ptr + sizeof(simd8) * 0);
    +    this->chunks[1].store(ptr + sizeof(simd8) * 1);
    +    this->chunks[2].store(ptr + sizeof(simd8) * 2);
    +    this->chunks[3].store(ptr + sizeof(simd8) * 3);
    +  }
    +
    +  simdjson_inline simd8 reduce_or() const {
    +    return (this->chunks[0] | this->chunks[1]) |
    +           (this->chunks[2] | this->chunks[3]);
    +  }
    +
    +  simdjson_inline uint64_t compress(uint64_t mask, T *output) const {
    +    this->chunks[0].compress(uint16_t(mask), output);
    +    this->chunks[1].compress(uint16_t(mask >> 16),
    +                             output + 16 - count_ones(mask & 0xFFFF));
    +    this->chunks[2].compress(uint16_t(mask >> 32),
    +                             output + 32 - count_ones(mask & 0xFFFFFFFF));
    +    this->chunks[3].compress(uint16_t(mask >> 48),
    +                             output + 48 - count_ones(mask & 0xFFFFFFFFFFFF));
    +    return 64 - count_ones(mask);
    +  }
    +
    +  simdjson_inline uint64_t to_bitmask() const {
    +    uint64_t r0 = uint32_t(this->chunks[0].to_bitmask());
    +    uint64_t r1 = this->chunks[1].to_bitmask();
    +    uint64_t r2 = this->chunks[2].to_bitmask();
    +    uint64_t r3 = this->chunks[3].to_bitmask();
    +    return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48);
    +  }
    +
    +  simdjson_inline uint64_t eq(const T m) const {
    +    const simd8 mask = simd8::splat(m);
    +    return simd8x64(this->chunks[0] == mask, this->chunks[1] == mask,
    +                          this->chunks[2] == mask, this->chunks[3] == mask)
    +        .to_bitmask();
    +  }
    +
    +  simdjson_inline uint64_t eq(const simd8x64 &other) const {
    +    return simd8x64(this->chunks[0] == other.chunks[0],
    +                          this->chunks[1] == other.chunks[1],
    +                          this->chunks[2] == other.chunks[2],
    +                          this->chunks[3] == other.chunks[3])
    +        .to_bitmask();
    +  }
    +
    +  simdjson_inline uint64_t lteq(const T m) const {
    +    const simd8 mask = simd8::splat(m);
    +    return simd8x64(this->chunks[0] <= mask, this->chunks[1] <= mask,
    +                          this->chunks[2] <= mask, this->chunks[3] <= mask)
    +        .to_bitmask();
    +  }
    +}; // struct simd8x64
    +
    +} // namespace simd
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_PPC64_SIMD_INPUT_H
    +/* end file simdjson/ppc64/simd.h */
    +/* including simdjson/ppc64/stringparsing_defs.h: #include "simdjson/ppc64/stringparsing_defs.h" */
    +/* begin file simdjson/ppc64/stringparsing_defs.h */
    +#ifndef SIMDJSON_PPC64_STRINGPARSING_DEFS_H
    +#define SIMDJSON_PPC64_STRINGPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/simd.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +
    +using namespace simd;
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 32;
    +  simdjson_inline static backslash_and_quote
    +  copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() {
    +    return ((bs_bits - 1) & quote_bits) != 0;
    +  }
    +  simdjson_inline bool has_backslash() { return bs_bits != 0; }
    +  simdjson_inline int quote_index() {
    +    return trailing_zeroes(quote_bits);
    +  }
    +  simdjson_inline int backslash_index() {
    +    return trailing_zeroes(bs_bits);
    +  }
    +
    +  uint32_t bs_bits;
    +  uint32_t quote_bits;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote
    +backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // this can read up to 31 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1),
    +                "backslash and quote finder must process fewer than "
    +                "SIMDJSON_PADDING bytes");
    +  simd8 v0(src);
    +  simd8 v1(src + sizeof(v0));
    +  v0.store(dst);
    +  v1.store(dst + sizeof(v0));
    +
    +  // Getting a 64-bit bitmask is much cheaper than multiple 16-bit bitmasks on
    +  // PPC; therefore, we smash them together into a 64-byte mask and get the
    +  // bitmask from there.
    +  uint64_t bs_and_quote =
    +      simd8x64(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask();
    +  return {
    +      uint32_t(bs_and_quote),      // bs_bits
    +      uint32_t(bs_and_quote >> 32) // quote_bits
    +  };
    +}
    +
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_PPC64_STRINGPARSING_DEFS_H
    +/* end file simdjson/ppc64/stringparsing_defs.h */
    +
    +#define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1
    +/* end file simdjson/ppc64/begin.h */
    +/* including simdjson/generic/amalgamated.h for ppc64: #include "simdjson/generic/amalgamated.h" */
    +/* begin file simdjson/generic/amalgamated.h for ppc64 */
    +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_DEPENDENCIES_H)
    +#error simdjson/generic/dependencies.h must be included before simdjson/generic/amalgamated.h!
    +#endif
    +
    +/* including simdjson/generic/base.h for ppc64: #include "simdjson/generic/base.h" */
    +/* begin file simdjson/generic/base.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): // If we haven't got an implementation yet, we're in the editor, editing a generic file! Just */
    +/* amalgamation skipped (editor-only): // use the most advanced one we can so the most possible stuff can be tested. */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation_detection.h" */
    +/* amalgamation skipped (editor-only): #if SIMDJSON_IMPLEMENTATION_ICELAKE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_HASWELL */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_WESTMERE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_ARM64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */
    +/* amalgamation skipped (editor-only): #else */
    +/* amalgamation skipped (editor-only): #error "All possible implementations (including fallback) have been disabled! simdjson will not run." */
    +/* amalgamation skipped (editor-only): #endif */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +
    +struct open_container;
    +class dom_parser_implementation;
    +
    +/**
    + * The type of a JSON number
    + */
    +enum class number_type {
    +    floating_point_number=1, /// a binary64 number
    +    signed_integer,          /// a signed integer that fits in a 64-bit word using two's complement
    +    unsigned_integer         /// a positive integer larger or equal to 1<<63
    +};
    +
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_BASE_H
    +/* end file simdjson/generic/base.h for ppc64 */
    +/* including simdjson/generic/jsoncharutils.h for ppc64: #include "simdjson/generic/jsoncharutils.h" */
    +/* begin file simdjson/generic/jsoncharutils.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_JSONCHARUTILS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_JSONCHARUTILS_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/jsoncharutils_tables.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +namespace jsoncharutils {
    +
    +// return non-zero if not a structural or whitespace char
    +// zero otherwise
    +simdjson_inline uint32_t is_not_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace_negated[c];
    +}
    +
    +simdjson_inline uint32_t is_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace[c];
    +}
    +
    +// returns a value with the high 16 bits set if not valid
    +// otherwise returns the conversion of the 4 hex digits at src into the bottom
    +// 16 bits of the 32-bit return register
    +//
    +// see
    +// https://lemire.me/blog/2019/04/17/parsing-short-hexadecimal-strings-efficiently/
    +static inline uint32_t hex_to_u32_nocheck(
    +    const uint8_t *src) { // strictly speaking, static inline is a C-ism
    +  uint32_t v1 = internal::digit_to_val32[630 + src[0]];
    +  uint32_t v2 = internal::digit_to_val32[420 + src[1]];
    +  uint32_t v3 = internal::digit_to_val32[210 + src[2]];
    +  uint32_t v4 = internal::digit_to_val32[0 + src[3]];
    +  return v1 | v2 | v3 | v4;
    +}
    +
    +// given a code point cp, writes to c
    +// the utf-8 code, outputting the length in
    +// bytes, if the length is zero, the code point
    +// is invalid
    +//
    +// This can possibly be made faster using pdep
    +// and clz and table lookups, but JSON documents
    +// have few escaped code points, and the following
    +// function looks cheap.
    +//
    +// Note: we assume that surrogates are treated separately
    +//
    +simdjson_inline size_t codepoint_to_utf8(uint32_t cp, uint8_t *c) {
    +  if (cp <= 0x7F) {
    +    c[0] = uint8_t(cp);
    +    return 1; // ascii
    +  }
    +  if (cp <= 0x7FF) {
    +    c[0] = uint8_t((cp >> 6) + 192);
    +    c[1] = uint8_t((cp & 63) + 128);
    +    return 2; // universal plane
    +    //  Surrogates are treated elsewhere...
    +    //} //else if (0xd800 <= cp && cp <= 0xdfff) {
    +    //  return 0; // surrogates // could put assert here
    +  } else if (cp <= 0xFFFF) {
    +    c[0] = uint8_t((cp >> 12) + 224);
    +    c[1] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[2] = uint8_t((cp & 63) + 128);
    +    return 3;
    +  } else if (cp <= 0x10FFFF) { // if you know you have a valid code point, this
    +                               // is not needed
    +    c[0] = uint8_t((cp >> 18) + 240);
    +    c[1] = uint8_t(((cp >> 12) & 63) + 128);
    +    c[2] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[3] = uint8_t((cp & 63) + 128);
    +    return 4;
    +  }
    +  // will return 0 when the code point was too large.
    +  return 0; // bad r
    +}
    +
    +#if SIMDJSON_IS_32BITS // _umul128 for x86, arm
    +// this is a slow emulation routine for 32-bit
    +//
    +static simdjson_inline uint64_t __emulu(uint32_t x, uint32_t y) {
    +  return x * (uint64_t)y;
    +}
    +static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) {
    +  uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd);
    +  uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd);
    +  uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32));
    +  uint64_t adbc_carry = !!(adbc < ad);
    +  uint64_t lo = bd + (adbc << 32);
    +  *hi = __emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) +
    +        (adbc_carry << 32) + !!(lo < bd);
    +  return lo;
    +}
    +#endif
    +
    +} // namespace jsoncharutils
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_JSONCHARUTILS_H
    +/* end file simdjson/generic/jsoncharutils.h for ppc64 */
    +/* including simdjson/generic/atomparsing.h for ppc64: #include "simdjson/generic/atomparsing.h" */
    +/* begin file simdjson/generic/atomparsing.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ATOMPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ATOMPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +/// @private
    +namespace atomparsing {
    +
    +// The string_to_uint32 is exclusively used to map literal strings to 32-bit values.
    +// We use memcpy instead of a pointer cast to avoid undefined behaviors since we cannot
    +// be certain that the character pointer will be properly aligned.
    +// You might think that using memcpy makes this function expensive, but you'd be wrong.
    +// All decent optimizing compilers (GCC, clang, Visual Studio) will compile string_to_uint32("false");
    +// to the compile-time constant 1936482662.
    +simdjson_inline uint32_t string_to_uint32(const char* str) { uint32_t val; std::memcpy(&val, str, sizeof(uint32_t)); return val; }
    +
    +
    +// Again in str4ncmp we use a memcpy to avoid undefined behavior. The memcpy may appear expensive.
    +// Yet all decent optimizing compilers will compile memcpy to a single instruction, just about.
    +simdjson_warn_unused
    +simdjson_inline uint32_t str4ncmp(const uint8_t *src, const char* atom) {
    +  uint32_t srcval; // we want to avoid unaligned 32-bit loads (undefined in C/C++)
    +  static_assert(sizeof(uint32_t) <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be larger than 4 bytes");
    +  std::memcpy(&srcval, src, sizeof(uint32_t));
    +  return srcval ^ string_to_uint32(atom);
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "true") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_true_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "true"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src) {
    +  return (str4ncmp(src+1, "alse") | jsoncharutils::is_not_structural_or_whitespace(src[5])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src, size_t len) {
    +  if (len > 5) { return is_valid_false_atom(src); }
    +  else if (len == 5) { return !str4ncmp(src+1, "alse"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "null") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_null_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "null"); }
    +  else { return false; }
    +}
    +
    +} // namespace atomparsing
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ATOMPARSING_H
    +/* end file simdjson/generic/atomparsing.h for ppc64 */
    +/* including simdjson/generic/dom_parser_implementation.h for ppc64: #include "simdjson/generic/dom_parser_implementation.h" */
    +/* begin file simdjson/generic/dom_parser_implementation.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +
    +// expectation: sizeof(open_container) = 64/8.
    +struct open_container {
    +  uint32_t tape_index; // where, on the tape, does the scope ([,{) begins
    +  uint32_t count; // how many elements in the scope
    +}; // struct open_container
    +
    +static_assert(sizeof(open_container) == 64/8, "Open container must be 64 bits");
    +
    +class dom_parser_implementation final : public internal::dom_parser_implementation {
    +public:
    +  /** Tape location of each open { or [ */
    +  std::unique_ptr open_containers{};
    +  /** Whether each open container is a [ or { */
    +  std::unique_ptr is_array{};
    +  /** Buffer passed to stage 1 */
    +  const uint8_t *buf{};
    +  /** Length passed to stage 1 */
    +  size_t len{0};
    +  /** Document passed to stage 2 */
    +  dom::document *doc{};
    +
    +  inline dom_parser_implementation() noexcept;
    +  inline dom_parser_implementation(dom_parser_implementation &&other) noexcept;
    +  inline dom_parser_implementation &operator=(dom_parser_implementation &&other) noexcept;
    +  dom_parser_implementation(const dom_parser_implementation &) = delete;
    +  dom_parser_implementation &operator=(const dom_parser_implementation &) = delete;
    +
    +  simdjson_warn_unused error_code parse(const uint8_t *buf, size_t len, dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage1(const uint8_t *buf, size_t len, stage1_mode partial) noexcept final;
    +  simdjson_warn_unused error_code stage2(dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage2_next(dom::document &doc) noexcept final;
    +  simdjson_warn_unused uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) const noexcept final;
    +  simdjson_warn_unused uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept final;
    +  inline simdjson_warn_unused error_code set_capacity(size_t capacity) noexcept final;
    +  inline simdjson_warn_unused error_code set_max_depth(size_t max_depth) noexcept final;
    +private:
    +  simdjson_inline simdjson_warn_unused error_code set_capacity_stage1(size_t capacity);
    +
    +};
    +
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +namespace ppc64 {
    +
    +inline dom_parser_implementation::dom_parser_implementation() noexcept = default;
    +inline dom_parser_implementation::dom_parser_implementation(dom_parser_implementation &&other) noexcept = default;
    +inline dom_parser_implementation &dom_parser_implementation::operator=(dom_parser_implementation &&other) noexcept = default;
    +
    +// Leaving these here so they can be inlined if so desired
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_capacity(size_t capacity) noexcept {
    +  if(capacity > SIMDJSON_MAXSIZE_BYTES) { return CAPACITY; }
    +  // Stage 1 index output
    +  size_t max_structures = SIMDJSON_ROUNDUP_N(capacity, 64) + 2 + 7;
    +  structural_indexes.reset( new (std::nothrow) uint32_t[max_structures] );
    +  if (!structural_indexes) { _capacity = 0; return MEMALLOC; }
    +  structural_indexes[0] = 0;
    +  n_structural_indexes = 0;
    +
    +  _capacity = capacity;
    +  return SUCCESS;
    +}
    +
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_max_depth(size_t max_depth) noexcept {
    +  // Stage 2 stacks
    +  open_containers.reset(new (std::nothrow) open_container[max_depth]);
    +  is_array.reset(new (std::nothrow) bool[max_depth]);
    +  if (!is_array || !open_containers) { _max_depth = 0; return MEMALLOC; }
    +
    +  _max_depth = max_depth;
    +  return SUCCESS;
    +}
    +
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +/* end file simdjson/generic/dom_parser_implementation.h for ppc64 */
    +/* including simdjson/generic/implementation_simdjson_result_base.h for ppc64: #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +
    +// This is a near copy of include/error.h's implementation_simdjson_result_base, except it doesn't use std::pair
    +// so we can avoid inlining errors
    +// TODO reconcile these!
    +/**
    + * The result of a simdjson operation that could fail.
    + *
    + * Gives the option of reading error codes, or throwing an exception by casting to the desired result.
    + *
    + * This is a base class for implementations that want to add functions to the result type for
    + * chaining.
    + *
    + * Override like:
    + *
    + *   struct simdjson_result : public internal::implementation_simdjson_result_base {
    + *     simdjson_result() noexcept : internal::implementation_simdjson_result_base() {}
    + *     simdjson_result(error_code error) noexcept : internal::implementation_simdjson_result_base(error) {}
    + *     simdjson_result(T &&value) noexcept : internal::implementation_simdjson_result_base(std::forward(value)) {}
    + *     simdjson_result(T &&value, error_code error) noexcept : internal::implementation_simdjson_result_base(value, error) {}
    + *     // Your extra methods here
    + *   }
    + *
    + * Then any method returning simdjson_result will be chainable with your methods.
    + */
    +template
    +struct implementation_simdjson_result_base {
    +
    +  /**
    +   * Create a new empty result with error = UNINITIALIZED.
    +   */
    +  simdjson_inline implementation_simdjson_result_base() noexcept = default;
    +
    +  /**
    +   * Create a new error result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(error_code error) noexcept;
    +
    +  /**
    +   * Create a new successful result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value) noexcept;
    +
    +  /**
    +   * Create a new result with both things (use if you don't want to branch when creating the result).
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value, error_code error) noexcept;
    +
    +  /**
    +   * Move the value and the error to the provided variables.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   * @param error The variable to assign the error to. Set to SUCCESS if there is no error.
    +   */
    +  simdjson_inline void tie(T &value, error_code &error) && noexcept;
    +
    +  /**
    +   * Move the value to the provided variable.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   */
    +  simdjson_inline error_code get(T &value) && noexcept;
    +
    +  /**
    +   * The error.
    +   */
    +  simdjson_inline error_code error() const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value.
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T& value() & noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& value() && noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& take_value() && noexcept(false);
    +
    +  /**
    +   * Cast to the value (will throw on error).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline operator T&&() && noexcept(false);
    +
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline const T& value_unsafe() const& noexcept;
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T& value_unsafe() & noexcept;
    +  /**
    +   * Take the result value (move it). This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T&& value_unsafe() && noexcept;
    +protected:
    +  /** users should never directly access first and second. **/
    +  T first{}; /** Users should never directly access 'first'. **/
    +  error_code second{UNINITIALIZED}; /** Users should never directly access 'second'. **/
    +}; // struct implementation_simdjson_result_base
    +
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +/* end file simdjson/generic/implementation_simdjson_result_base.h for ppc64 */
    +/* including simdjson/generic/numberparsing.h for ppc64: #include "simdjson/generic/numberparsing.h" */
    +/* begin file simdjson/generic/numberparsing.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_NUMBERPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_NUMBERPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace numberparsing {
    +
    +#ifdef JSON_TEST_NUMBERS
    +#define INVALID_NUMBER(SRC) (found_invalid_number((SRC)), NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (found_integer((VALUE), (SRC)), (WRITER).append_s64((VALUE)))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (found_unsigned_integer((VALUE), (SRC)), (WRITER).append_u64((VALUE)))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (found_float((VALUE), (SRC)), (WRITER).append_double((VALUE)))
    +#else
    +#define INVALID_NUMBER(SRC) (NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (WRITER).append_s64((VALUE))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (WRITER).append_u64((VALUE))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (WRITER).append_double((VALUE))
    +#endif
    +
    +namespace {
    +
    +// Convert a mantissa, an exponent and a sign bit into an ieee64 double.
    +// The real_exponent needs to be in [0, 2046] (technically real_exponent = 2047 would be acceptable).
    +// The mantissa should be in [0,1<<53). The bit at index (1ULL << 52) while be zeroed.
    +simdjson_inline double to_double(uint64_t mantissa, uint64_t real_exponent, bool negative) {
    +    double d;
    +    mantissa &= ~(1ULL << 52);
    +    mantissa |= real_exponent << 52;
    +    mantissa |= ((static_cast(negative)) << 63);
    +    std::memcpy(&d, &mantissa, sizeof(d));
    +    return d;
    +}
    +
    +// Attempts to compute i * 10^(power) exactly; and if "negative" is
    +// true, negate the result.
    +// This function will only work in some cases, when it does not work, success is
    +// set to false. This should work *most of the time* (like 99% of the time).
    +// We assume that power is in the [smallest_power,
    +// largest_power] interval: the caller is responsible for this check.
    +simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative, double &d) {
    +  // we start with a fast path
    +  // It was described in
    +  // Clinger WD. How to read floating point numbers accurately.
    +  // ACM SIGPLAN Notices. 1990
    +#ifndef FLT_EVAL_METHOD
    +#error "FLT_EVAL_METHOD should be defined, please include cfloat."
    +#endif
    +#if (FLT_EVAL_METHOD != 1) && (FLT_EVAL_METHOD != 0)
    +  // We cannot be certain that x/y is rounded to nearest.
    +  if (0 <= power && power <= 22 && i <= 9007199254740991)
    +#else
    +  if (-22 <= power && power <= 22 && i <= 9007199254740991)
    +#endif
    +  {
    +    // convert the integer into a double. This is lossless since
    +    // 0 <= i <= 2^53 - 1.
    +    d = double(i);
    +    //
    +    // The general idea is as follows.
    +    // If 0 <= s < 2^53 and if 10^0 <= p <= 10^22 then
    +    // 1) Both s and p can be represented exactly as 64-bit floating-point
    +    // values
    +    // (binary64).
    +    // 2) Because s and p can be represented exactly as floating-point values,
    +    // then s * p
    +    // and s / p will produce correctly rounded values.
    +    //
    +    if (power < 0) {
    +      d = d / simdjson::internal::power_of_ten[-power];
    +    } else {
    +      d = d * simdjson::internal::power_of_ten[power];
    +    }
    +    if (negative) {
    +      d = -d;
    +    }
    +    return true;
    +  }
    +  // When 22 < power && power <  22 + 16, we could
    +  // hope for another, secondary fast path.  It was
    +  // described by David M. Gay in  "Correctly rounded
    +  // binary-decimal and decimal-binary conversions." (1990)
    +  // If you need to compute i * 10^(22 + x) for x < 16,
    +  // first compute i * 10^x, if you know that result is exact
    +  // (e.g., when i * 10^x < 2^53),
    +  // then you can still proceed and do (i * 10^x) * 10^22.
    +  // Is this worth your time?
    +  // You need  22 < power *and* power <  22 + 16 *and* (i * 10^(x-22) < 2^53)
    +  // for this second fast path to work.
    +  // If you you have 22 < power *and* power <  22 + 16, and then you
    +  // optimistically compute "i * 10^(x-22)", there is still a chance that you
    +  // have wasted your time if i * 10^(x-22) >= 2^53. It makes the use cases of
    +  // this optimization maybe less common than we would like. Source:
    +  // http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/
    +  // also used in RapidJSON: https://rapidjson.org/strtod_8h_source.html
    +
    +  // The fast path has now failed, so we are failing back on the slower path.
    +
    +  // In the slow path, we need to adjust i so that it is > 1<<63 which is always
    +  // possible, except if i == 0, so we handle i == 0 separately.
    +  if(i == 0) {
    +    d = negative ? -0.0 : 0.0;
    +    return true;
    +  }
    +
    +
    +  // The exponent is 1024 + 63 + power
    +  //     + floor(log(5**power)/log(2)).
    +  // The 1024 comes from the ieee64 standard.
    +  // The 63 comes from the fact that we use a 64-bit word.
    +  //
    +  // Computing floor(log(5**power)/log(2)) could be
    +  // slow. Instead we use a fast function.
    +  //
    +  // For power in (-400,350), we have that
    +  // (((152170 + 65536) * power ) >> 16);
    +  // is equal to
    +  //  floor(log(5**power)/log(2)) + power when power >= 0
    +  // and it is equal to
    +  //  ceil(log(5**-power)/log(2)) + power when power < 0
    +  //
    +  // The 65536 is (1<<16) and corresponds to
    +  // (65536 * power) >> 16 ---> power
    +  //
    +  // ((152170 * power ) >> 16) is equal to
    +  // floor(log(5**power)/log(2))
    +  //
    +  // Note that this is not magic: 152170/(1<<16) is
    +  // approximatively equal to log(5)/log(2).
    +  // The 1<<16 value is a power of two; we could use a
    +  // larger power of 2 if we wanted to.
    +  //
    +  int64_t exponent = (((152170 + 65536) * power) >> 16) + 1024 + 63;
    +
    +
    +  // We want the most significant bit of i to be 1. Shift if needed.
    +  int lz = leading_zeroes(i);
    +  i <<= lz;
    +
    +
    +  // We are going to need to do some 64-bit arithmetic to get a precise product.
    +  // We use a table lookup approach.
    +  // It is safe because
    +  // power >= smallest_power
    +  // and power <= largest_power
    +  // We recover the mantissa of the power, it has a leading 1. It is always
    +  // rounded down.
    +  //
    +  // We want the most significant 64 bits of the product. We know
    +  // this will be non-zero because the most significant bit of i is
    +  // 1.
    +  const uint32_t index = 2 * uint32_t(power - simdjson::internal::smallest_power);
    +  // Optimization: It may be that materializing the index as a variable might confuse some compilers and prevent effective complex-addressing loads. (Done for code clarity.)
    +  //
    +  // The full_multiplication function computes the 128-bit product of two 64-bit words
    +  // with a returned value of type value128 with a "low component" corresponding to the
    +  // 64-bit least significant bits of the product and with a "high component" corresponding
    +  // to the 64-bit most significant bits of the product.
    +  simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
    +  // Both i and power_of_five_128[index] have their most significant bit set to 1 which
    +  // implies that the either the most or the second most significant bit of the product
    +  // is 1. We pack values in this manner for efficiency reasons: it maximizes the use
    +  // we make of the product. It also makes it easy to reason about the product: there
    +  // is 0 or 1 leading zero in the product.
    +
    +  // Unless the least significant 9 bits of the high (64-bit) part of the full
    +  // product are all 1s, then we know that the most significant 55 bits are
    +  // exact and no further work is needed. Having 55 bits is necessary because
    +  // we need 53 bits for the mantissa but we have to have one rounding bit and
    +  // we can waste a bit if the most significant bit of the product is zero.
    +  if((firstproduct.high & 0x1FF) == 0x1FF) {
    +    // We want to compute i * 5^q, but only care about the top 55 bits at most.
    +    // Consider the scenario where q>=0. Then 5^q may not fit in 64-bits. Doing
    +    // the full computation is wasteful. So we do what is called a "truncated
    +    // multiplication".
    +    // We take the most significant 64-bits, and we put them in
    +    // power_of_five_128[index]. Usually, that's good enough to approximate i * 5^q
    +    // to the desired approximation using one multiplication. Sometimes it does not suffice.
    +    // Then we store the next most significant 64 bits in power_of_five_128[index + 1], and
    +    // then we get a better approximation to i * 5^q.
    +    //
    +    // That's for when q>=0. The logic for q<0 is somewhat similar but it is somewhat
    +    // more complicated.
    +    //
    +    // There is an extra layer of complexity in that we need more than 55 bits of
    +    // accuracy in the round-to-even scenario.
    +    //
    +    // The full_multiplication function computes the 128-bit product of two 64-bit words
    +    // with a returned value of type value128 with a "low component" corresponding to the
    +    // 64-bit least significant bits of the product and with a "high component" corresponding
    +    // to the 64-bit most significant bits of the product.
    +    simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
    +    firstproduct.low += secondproduct.high;
    +    if(secondproduct.high > firstproduct.low) { firstproduct.high++; }
    +    // As it has been proven by Noble Mushtak and Daniel Lemire in "Fast Number Parsing Without
    +    // Fallback" (https://arxiv.org/abs/2212.06644), at this point we are sure that the product
    +    // is sufficiently accurate, and more computation is not needed.
    +  }
    +  uint64_t lower = firstproduct.low;
    +  uint64_t upper = firstproduct.high;
    +  // The final mantissa should be 53 bits with a leading 1.
    +  // We shift it so that it occupies 54 bits with a leading 1.
    +  ///////
    +  uint64_t upperbit = upper >> 63;
    +  uint64_t mantissa = upper >> (upperbit + 9);
    +  lz += int(1 ^ upperbit);
    +
    +  // Here we have mantissa < (1<<54).
    +  int64_t real_exponent = exponent - lz;
    +  if (simdjson_unlikely(real_exponent <= 0)) { // we have a subnormal?
    +    // Here have that real_exponent <= 0 so -real_exponent >= 0
    +    if(-real_exponent + 1 >= 64) { // if we have more than 64 bits below the minimum exponent, you have a zero for sure.
    +      d = negative ? -0.0 : 0.0;
    +      return true;
    +    }
    +    // next line is safe because -real_exponent + 1 < 0
    +    mantissa >>= -real_exponent + 1;
    +    // Thankfully, we can't have both "round-to-even" and subnormals because
    +    // "round-to-even" only occurs for powers close to 0.
    +    mantissa += (mantissa & 1); // round up
    +    mantissa >>= 1;
    +    // There is a weird scenario where we don't have a subnormal but just.
    +    // Suppose we start with 2.2250738585072013e-308, we end up
    +    // with 0x3fffffffffffff x 2^-1023-53 which is technically subnormal
    +    // whereas 0x40000000000000 x 2^-1023-53  is normal. Now, we need to round
    +    // up 0x3fffffffffffff x 2^-1023-53  and once we do, we are no longer
    +    // subnormal, but we can only know this after rounding.
    +    // So we only declare a subnormal if we are smaller than the threshold.
    +    real_exponent = (mantissa < (uint64_t(1) << 52)) ? 0 : 1;
    +    d = to_double(mantissa, real_exponent, negative);
    +    return true;
    +  }
    +  // We have to round to even. The "to even" part
    +  // is only a problem when we are right in between two floats
    +  // which we guard against.
    +  // If we have lots of trailing zeros, we may fall right between two
    +  // floating-point values.
    +  //
    +  // The round-to-even cases take the form of a number 2m+1 which is in (2^53,2^54]
    +  // times a power of two. That is, it is right between a number with binary significand
    +  // m and another number with binary significand m+1; and it must be the case
    +  // that it cannot be represented by a float itself.
    +  //
    +  // We must have that w * 10 ^q == (2m+1) * 2^p for some power of two 2^p.
    +  // Recall that 10^q = 5^q * 2^q.
    +  // When q >= 0, we must have that (2m+1) is divible by 5^q, so 5^q <= 2^54. We have that
    +  //  5^23 <=  2^54 and it is the last power of five to qualify, so q <= 23.
    +  // When q<0, we have  w  >=  (2m+1) x 5^{-q}.  We must have that w<2^{64} so
    +  // (2m+1) x 5^{-q} < 2^{64}. We have that 2m+1>2^{53}. Hence, we must have
    +  // 2^{53} x 5^{-q} < 2^{64}.
    +  // Hence we have 5^{-q} < 2^{11}$ or q>= -4.
    +  //
    +  // We require lower <= 1 and not lower == 0 because we could not prove that
    +  // that lower == 0 is implied; but we could prove that lower <= 1 is a necessary and sufficient test.
    +  if (simdjson_unlikely((lower <= 1) && (power >= -4) && (power <= 23) && ((mantissa & 3) == 1))) {
    +    if((mantissa  << (upperbit + 64 - 53 - 2)) ==  upper) {
    +      mantissa &= ~1;             // flip it so that we do not round up
    +    }
    +  }
    +
    +  mantissa += mantissa & 1;
    +  mantissa >>= 1;
    +
    +  // Here we have mantissa < (1<<53), unless there was an overflow
    +  if (mantissa >= (1ULL << 53)) {
    +    //////////
    +    // This will happen when parsing values such as 7.2057594037927933e+16
    +    ////////
    +    mantissa = (1ULL << 52);
    +    real_exponent++;
    +  }
    +  mantissa &= ~(1ULL << 52);
    +  // we have to check that real_exponent is in range, otherwise we bail out
    +  if (simdjson_unlikely(real_exponent > 2046)) {
    +    // We have an infinite value!!! We could actually throw an error here if we could.
    +    return false;
    +  }
    +  d = to_double(mantissa, real_exponent, negative);
    +  return true;
    +}
    +
    +// We call a fallback floating-point parser that might be slow. Note
    +// it will accept JSON numbers, but the JSON spec. is more restrictive so
    +// before you call parse_float_fallback, you need to have validated the input
    +// string with the JSON grammar.
    +// It will return an error (false) if the parsed number is infinite.
    +// The string parsing itself always succeeds. We know that there is at least
    +// one digit.
    +static bool parse_float_fallback(const uint8_t *ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +static bool parse_float_fallback(const uint8_t *ptr, const uint8_t *end_ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr), reinterpret_cast(end_ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +// check quickly whether the next 8 chars are made of digits
    +// at a glance, it looks better than Mula's
    +// http://0x80.pl/articles/swar-digits-validate.html
    +simdjson_inline bool is_made_of_eight_digits_fast(const uint8_t *chars) {
    +  uint64_t val;
    +  // this can read up to 7 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(7 <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be bigger than 7");
    +  std::memcpy(&val, chars, 8);
    +  // a branchy method might be faster:
    +  // return (( val & 0xF0F0F0F0F0F0F0F0 ) == 0x3030303030303030)
    +  //  && (( (val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0 ) ==
    +  //  0x3030303030303030);
    +  return (((val & 0xF0F0F0F0F0F0F0F0) |
    +           (((val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0) >> 4)) ==
    +          0x3333333333333333);
    +}
    +
    +template
    +SIMDJSON_NO_SANITIZE_UNDEFINED // We deliberately allow overflow here and check later
    +simdjson_inline bool parse_digit(const uint8_t c, I &i) {
    +  const uint8_t digit = static_cast(c - '0');
    +  if (digit > 9) {
    +    return false;
    +  }
    +  // PERF NOTE: multiplication by 10 is cheaper than arbitrary integer multiplication
    +  i = 10 * i + digit; // might overflow, we will handle the overflow later
    +  return true;
    +}
    +
    +simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const uint8_t *const src, const uint8_t *&p, uint64_t &i, int64_t &exponent) {
    +  // we continue with the fiction that we have an integer. If the
    +  // floating point number is representable as x * 10^z for some integer
    +  // z that fits in 53 bits, then we will be able to convert back the
    +  // the integer into a float in a lossless manner.
    +  const uint8_t *const first_after_period = p;
    +
    +#ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +#if SIMDJSON_SWAR_NUMBER_PARSING
    +  // this helps if we have lots of decimals!
    +  // this turns out to be frequent enough.
    +  if (is_made_of_eight_digits_fast(p)) {
    +    i = i * 100000000 + parse_eight_digits_unrolled(p);
    +    p += 8;
    +  }
    +#endif // SIMDJSON_SWAR_NUMBER_PARSING
    +#endif // #ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +  // Unrolling the first digit makes a small difference on some implementations (e.g. westmere)
    +  if (parse_digit(*p, i)) { ++p; }
    +  while (parse_digit(*p, i)) { p++; }
    +  exponent = first_after_period - p;
    +  // Decimal without digits (123.) is illegal
    +  if (exponent == 0) {
    +    return INVALID_NUMBER(src);
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) {
    +  // Exp Sign: -123.456e[-]78
    +  bool neg_exp = ('-' == *p);
    +  if (neg_exp || '+' == *p) { p++; } // Skip + as well
    +
    +  // Exponent: -123.456e-[78]
    +  auto start_exp = p;
    +  int64_t exp_number = 0;
    +  while (parse_digit(*p, exp_number)) { ++p; }
    +  // It is possible for parse_digit to overflow.
    +  // In particular, it could overflow to INT64_MIN, and we cannot do - INT64_MIN.
    +  // Thus we *must* check for possible overflow before we negate exp_number.
    +
    +  // Performance notes: it may seem like combining the two "simdjson_unlikely checks" below into
    +  // a single simdjson_unlikely path would be faster. The reasoning is sound, but the compiler may
    +  // not oblige and may, in fact, generate two distinct paths in any case. It might be
    +  // possible to do uint64_t(p - start_exp - 1) >= 18 but it could end up trading off
    +  // instructions for a simdjson_likely branch, an unconclusive gain.
    +
    +  // If there were no digits, it's an error.
    +  if (simdjson_unlikely(p == start_exp)) {
    +    return INVALID_NUMBER(src);
    +  }
    +  // We have a valid positive exponent in exp_number at this point, except that
    +  // it may have overflowed.
    +
    +  // If there were more than 18 digits, we may have overflowed the integer. We have to do
    +  // something!!!!
    +  if (simdjson_unlikely(p > start_exp+18)) {
    +    // Skip leading zeroes: 1e000000000000000000001 is technically valid and doesn't overflow
    +    while (*start_exp == '0') { start_exp++; }
    +    // 19 digits could overflow int64_t and is kind of absurd anyway. We don't
    +    // support exponents smaller than -999,999,999,999,999,999 and bigger
    +    // than 999,999,999,999,999,999.
    +    // We can truncate.
    +    // Note that 999999999999999999 is assuredly too large. The maximal ieee64 value before
    +    // infinity is ~1.8e308. The smallest subnormal is ~5e-324. So, actually, we could
    +    // truncate at 324.
    +    // Note that there is no reason to fail per se at this point in time.
    +    // E.g., 0e999999999999999999999 is a fine number.
    +    if (p > start_exp+18) { exp_number = 999999999999999999; }
    +  }
    +  // At this point, we know that exp_number is a sane, positive, signed integer.
    +  // It is <= 999,999,999,999,999,999. As long as 'exponent' is in
    +  // [-8223372036854775808, 8223372036854775808], we won't overflow. Because 'exponent'
    +  // is bounded in magnitude by the size of the JSON input, we are fine in this universe.
    +  // To sum it up: the next line should never overflow.
    +  exponent += (neg_exp ? -exp_number : exp_number);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline size_t significant_digits(const uint8_t * start_digits, size_t digit_count) {
    +  // It is possible that the integer had an overflow.
    +  // We have to handle the case where we have 0.0000somenumber.
    +  const uint8_t *start = start_digits;
    +  while ((*start == '0') || (*start == '.')) { ++start; }
    +  // we over-decrement by one when there is a '.'
    +  return digit_count - size_t(start - start_digits);
    +}
    +
    +} // unnamed namespace
    +
    +/** @private */
    +template
    +error_code slow_float_parsing(simdjson_unused const uint8_t * src, W writer) {
    +  double d;
    +  if (parse_float_fallback(src, &d)) {
    +    writer.append_double(d);
    +    return SUCCESS;
    +  }
    +  return INVALID_NUMBER(src);
    +}
    +
    +/** @private */
    +template
    +simdjson_inline error_code write_float(const uint8_t *const src, bool negative, uint64_t i, const uint8_t * start_digits, size_t digit_count, int64_t exponent, W &writer) {
    +  // If we frequently had to deal with long strings of digits,
    +  // we could extend our code by using a 128-bit integer instead
    +  // of a 64-bit integer. However, this is uncommon in practice.
    +  //
    +  // 9999999999999999999 < 2**64 so we can accommodate 19 digits.
    +  // If we have a decimal separator, then digit_count - 1 is the number of digits, but we
    +  // may not have a decimal separator!
    +  if (simdjson_unlikely(digit_count > 19 && significant_digits(start_digits, digit_count) > 19)) {
    +    // Ok, chances are good that we had an overflow!
    +    // this is almost never going to get called!!!
    +    // we start anew, going slowly!!!
    +    // This will happen in the following examples:
    +    // 10000000000000000000000000000000000000000000e+308
    +    // 3.1415926535897932384626433832795028841971693993751
    +    //
    +    // NOTE: This makes a *copy* of the writer and passes it to slow_float_parsing. This happens
    +    // because slow_float_parsing is a non-inlined function. If we passed our writer reference to
    +    // it, it would force it to be stored in memory, preventing the compiler from picking it apart
    +    // and putting into registers. i.e. if we pass it as reference, it gets slow.
    +    // This is what forces the skip_double, as well.
    +    error_code error = slow_float_parsing(src, writer);
    +    writer.skip_double();
    +    return error;
    +  }
    +  // NOTE: it's weird that the simdjson_unlikely() only wraps half the if, but it seems to get slower any other
    +  // way we've tried: https://github.com/simdjson/simdjson/pull/990#discussion_r448497331
    +  // To future reader: we'd love if someone found a better way, or at least could explain this result!
    +  if (simdjson_unlikely(exponent < simdjson::internal::smallest_power) || (exponent > simdjson::internal::largest_power)) {
    +    //
    +    // Important: smallest_power is such that it leads to a zero value.
    +    // Observe that 18446744073709551615e-343 == 0, i.e. (2**64 - 1) e -343 is zero
    +    // so something x 10^-343 goes to zero, but not so with  something x 10^-342.
    +    static_assert(simdjson::internal::smallest_power <= -342, "smallest_power is not small enough");
    +    //
    +    if((exponent < simdjson::internal::smallest_power) || (i == 0)) {
    +      // E.g. Parse "-0.0e-999" into the same value as "-0.0". See https://en.wikipedia.org/wiki/Signed_zero
    +      WRITE_DOUBLE(negative ? -0.0 : 0.0, src, writer);
    +      return SUCCESS;
    +    } else { // (exponent > largest_power) and (i != 0)
    +      // We have, for sure, an infinite value and simdjson refuses to parse infinite values.
    +      return INVALID_NUMBER(src);
    +    }
    +  }
    +  double d;
    +  if (!compute_float_64(exponent, i, negative, d)) {
    +    // we are almost never going to get here.
    +    if (!parse_float_fallback(src, &d)) { return INVALID_NUMBER(src); }
    +  }
    +  WRITE_DOUBLE(d, src, writer);
    +  return SUCCESS;
    +}
    +
    +// for performance analysis, it is sometimes  useful to skip parsing
    +#ifdef SIMDJSON_SKIPNUMBERPARSING
    +
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const, W &writer) {
    +  writer.append_s64(0);        // always write zero
    +  return SUCCESS;              // always succeeds
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept { return number_type::signed_integer; }
    +#else
    +
    +// parse the number at src
    +// define JSON_TEST_NUMBERS for unit testing
    +//
    +// It is assumed that the number is followed by a structural ({,},],[) character
    +// or a white space character. If that is not the case (e.g., when the JSON
    +// document is made of a single number), then it is necessary to copy the
    +// content and append a space before calling this function.
    +//
    +// Our objective is accurate parsing (ULP of 0) at high speed.
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) {
    +
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  if (digit_count == 0 || ('0' == *start_digits && digit_count > 1)) { return INVALID_NUMBER(src); }
    +
    +  //
    +  // Handle floats if there is a . or e (or both)
    +  //
    +  int64_t exponent = 0;
    +  bool is_float = false;
    +  if ('.' == *p) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_decimal_after_separator(src, p, i, exponent) );
    +    digit_count = int(p - start_digits); // used later to guard against overflows
    +  }
    +  if (('e' == *p) || ('E' == *p)) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_exponent(src, p, exponent) );
    +  }
    +  if (is_float) {
    +    const bool dirty_end = jsoncharutils::is_not_structural_or_whitespace(*p);
    +    SIMDJSON_TRY( write_float(src, negative, i, start_digits, digit_count, exponent, writer) );
    +    if (dirty_end) { return INVALID_NUMBER(src); }
    +    return SUCCESS;
    +  }
    +
    +  // The longest negative 64-bit number is 19 digits.
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  size_t longest_digit_count = negative ? 19 : 20;
    +  if (digit_count > longest_digit_count) { return INVALID_NUMBER(src); }
    +  if (digit_count == longest_digit_count) {
    +    if (negative) {
    +      // Anything negative above INT64_MAX+1 is invalid
    +      if (i > uint64_t(INT64_MAX)+1) { return INVALID_NUMBER(src);  }
    +      WRITE_INTEGER(~i+1, src, writer);
    +      if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +      return SUCCESS;
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    }  else if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INVALID_NUMBER(src); }
    +  }
    +
    +  // Write unsigned if it doesn't fit in a signed integer.
    +  if (i > uint64_t(INT64_MAX)) {
    +    WRITE_UNSIGNED(i, src, writer);
    +  } else {
    +    WRITE_INTEGER(negative ? (~i+1) : i, src, writer);
    +  }
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +  return SUCCESS;
    +}
    +
    +// Inlineable functions
    +namespace {
    +
    +// This table can be used to characterize the final character of an integer
    +// string. For JSON structural character and allowable white space characters,
    +// we return SUCCESS. For 'e', '.' and 'E', we return INCORRECT_TYPE. Otherwise
    +// we return NUMBER_ERROR.
    +// Optimization note: we could easily reduce the size of the table by half (to 128)
    +// at the cost of an extra branch.
    +// Optimization note: we want the values to use at most 8 bits (not, e.g., 32 bits):
    +static_assert(error_code(uint8_t(NUMBER_ERROR))== NUMBER_ERROR, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(SUCCESS))== SUCCESS, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(INCORRECT_TYPE))== INCORRECT_TYPE, "bad NUMBER_ERROR cast");
    +
    +const uint8_t integer_string_finisher[256] = {
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   SUCCESS,      NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, INCORRECT_TYPE,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, SUCCESS,        NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR};
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if ((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src + 1;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    // Note: we use src[1] and not src[0] because src[0] is the quote character in this
    +    // instance.
    +    if (src[1] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = src;
    +  uint64_t i = 0;
    +  while (parse_digit(*src, i)) { src++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(src - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*src)) {
    +  //  return (*src == '.' || *src == 'e' || *src == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(*src != '"') { return NUMBER_ERROR; }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept {
    +  return (*src == '-');
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) { return true; }
    +  return false;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) {
    +    // We have an integer.
    +    // If the number is negative and valid, it must be a signed integer.
    +    if(negative) { return number_type::signed_integer; }
    +    // We want values larger or equal to 9223372036854775808 to be unsigned
    +    // integers, and the other values to be signed integers.
    +    int digit_count = int(p - src);
    +    if(digit_count >= 19) {
    +      const uint8_t * smaller_big_integer = reinterpret_cast("9223372036854775808");
    +      if((digit_count >= 20) || (memcmp(src, smaller_big_integer, 19) >= 0)) {
    +        return number_type::unsigned_integer;
    +      }
    +    }
    +    return number_type::signed_integer;
    +  }
    +  // Hopefully, we have 'e' or 'E' or '.'.
    +  return number_type::floating_point_number;
    +}
    +
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src, const uint8_t * const src_end) noexcept {
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  if(p == src_end) { return NUMBER_ERROR; }
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely((p != src_end) && (*p == '.'))) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if ((p == src_end) || !parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = start_digits-src > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if ((p != src_end) && (*p == 'e' || *p == 'E')) {
    +    p++;
    +    if(p == src_end) { return NUMBER_ERROR; }
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while ((p != src_end) && parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if ((p != src_end) && jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), src_end, &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +} // unnamed namespace
    +#endif // SIMDJSON_SKIPNUMBERPARSING
    +
    +} // namespace numberparsing
    +
    +inline std::ostream& operator<<(std::ostream& out, number_type type) noexcept {
    +    switch (type) {
    +        case number_type::signed_integer: out << "integer in [-9223372036854775808,9223372036854775808)"; break;
    +        case number_type::unsigned_integer: out << "unsigned integer in [9223372036854775808,18446744073709551616)"; break;
    +        case number_type::floating_point_number: out << "floating-point number (binary64)"; break;
    +        default: SIMDJSON_UNREACHABLE();
    +    }
    +    return out;
    +}
    +
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_NUMBERPARSING_H
    +/* end file simdjson/generic/numberparsing.h for ppc64 */
    +
    +/* including simdjson/generic/implementation_simdjson_result_base-inl.h for ppc64: #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base-inl.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +
    +//
    +// internal::implementation_simdjson_result_base inline implementation
    +//
    +
    +template
    +simdjson_inline void implementation_simdjson_result_base::tie(T &value, error_code &error) && noexcept {
    +  error = this->second;
    +  if (!error) {
    +    value = std::forward>(*this).first;
    +  }
    +}
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::get(T &value) && noexcept {
    +  error_code error;
    +  std::forward>(*this).tie(value, error);
    +  return error;
    +}
    +
    +template
    +simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept {
    +  return this->second;
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::take_value() && noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::operator T&&() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline const T& implementation_simdjson_result_base::value_unsafe() const& noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value_unsafe() & noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value_unsafe() && noexcept {
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value, error_code error) noexcept
    +    : first{std::forward(value)}, second{error} {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(error_code error) noexcept
    +    : implementation_simdjson_result_base(T{}, error) {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value), SUCCESS) {}
    +
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +/* end file simdjson/generic/implementation_simdjson_result_base-inl.h for ppc64 */
    +/* end file simdjson/generic/amalgamated.h for ppc64 */
    +/* including simdjson/ppc64/end.h: #include "simdjson/ppc64/end.h" */
    +/* begin file simdjson/ppc64/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT
    +/* undefining SIMDJSON_IMPLEMENTATION from "ppc64" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/ppc64/end.h */
    +
    +#endif // SIMDJSON_PPC64_H
    +/* end file simdjson/ppc64.h */
    +/* including simdjson/ppc64/implementation.h: #include  */
    +/* begin file simdjson/ppc64/implementation.h */
    +#ifndef SIMDJSON_PPC64_IMPLEMENTATION_H
    +#define SIMDJSON_PPC64_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/instruction_set.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +
    +/**
    + * Implementation for ALTIVEC (PPC64).
    + */
    +namespace ppc64 {
    +
    +/**
    + * @private
    + */
    +class implementation final : public simdjson::implementation {
    +public:
    +  simdjson_inline implementation()
    +      : simdjson::implementation("ppc64", "PPC64 ALTIVEC",
    +                                 internal::instruction_set::ALTIVEC) {}
    +
    +  simdjson_warn_unused error_code create_dom_parser_implementation(
    +      size_t capacity, size_t max_length,
    +      std::unique_ptr &dst)
    +      const noexcept final;
    +  simdjson_warn_unused error_code minify(const uint8_t *buf, size_t len,
    +                                         uint8_t *dst,
    +                                         size_t &dst_len) const noexcept final;
    +  simdjson_warn_unused bool validate_utf8(const char *buf,
    +                                          size_t len) const noexcept final;
    +};
    +
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_PPC64_IMPLEMENTATION_H
    +/* end file simdjson/ppc64/implementation.h */
    +
    +/* including simdjson/ppc64/begin.h: #include  */
    +/* begin file simdjson/ppc64/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "ppc64" */
    +#define SIMDJSON_IMPLEMENTATION ppc64
    +/* including simdjson/ppc64/base.h: #include "simdjson/ppc64/base.h" */
    +/* begin file simdjson/ppc64/base.h */
    +#ifndef SIMDJSON_PPC64_BASE_H
    +#define SIMDJSON_PPC64_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +/**
    + * Implementation for ALTIVEC (PPC64).
    + */
    +namespace ppc64 {
    +
    +class implementation;
    +
    +namespace {
    +namespace simd {
    +template  struct simd8;
    +template  struct simd8x64;
    +} // namespace simd
    +} // unnamed namespace
    +
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_PPC64_BASE_H
    +/* end file simdjson/ppc64/base.h */
    +/* including simdjson/ppc64/intrinsics.h: #include "simdjson/ppc64/intrinsics.h" */
    +/* begin file simdjson/ppc64/intrinsics.h */
    +#ifndef SIMDJSON_PPC64_INTRINSICS_H
    +#define SIMDJSON_PPC64_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This should be the correct header whether
    +// you use visual studio or other compilers.
    +#include 
    +
    +// These are defined by altivec.h in GCC toolchain, it is safe to undef them.
    +#ifdef bool
    +#undef bool
    +#endif
    +
    +#ifdef vector
    +#undef vector
    +#endif
    +
    +static_assert(sizeof(__vector unsigned char) <= simdjson::SIMDJSON_PADDING, "insufficient padding for ppc64");
    +
    +#endif //  SIMDJSON_PPC64_INTRINSICS_H
    +/* end file simdjson/ppc64/intrinsics.h */
    +/* including simdjson/ppc64/bitmanipulation.h: #include "simdjson/ppc64/bitmanipulation.h" */
    +/* begin file simdjson/ppc64/bitmanipulation.h */
    +#ifndef SIMDJSON_PPC64_BITMANIPULATION_H
    +#define SIMDJSON_PPC64_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long ret;
    +  // Search the mask data from least significant bit (LSB)
    +  // to the most significant bit (MSB) for a set bit (1).
    +  _BitScanForward64(&ret, input_num);
    +  return (int)ret;
    +#else  // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return input_num & (input_num - 1);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long leading_zero = 0;
    +  // Search the mask data from most significant bit (MSB)
    +  // to least significant bit (LSB) for a set bit (1).
    +  if (_BitScanReverse64(&leading_zero, input_num))
    +    return (int)(63 - leading_zero);
    +  else
    +    return 64;
    +#else
    +  return __builtin_clzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +simdjson_inline int count_ones(uint64_t input_num) {
    +  // note: we do not support legacy 32-bit Windows in this kernel
    +  return __popcnt64(input_num); // Visual Studio wants two underscores
    +}
    +#else
    +simdjson_inline int count_ones(uint64_t input_num) {
    +  return __builtin_popcountll(input_num);
    +}
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2,
    +                                         uint64_t *result) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  *result = value1 + value2;
    +  return *result < value1;
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_PPC64_BITMANIPULATION_H
    +/* end file simdjson/ppc64/bitmanipulation.h */
    +/* including simdjson/ppc64/bitmask.h: #include "simdjson/ppc64/bitmask.h" */
    +/* begin file simdjson/ppc64/bitmask.h */
    +#ifndef SIMDJSON_PPC64_BITMASK_H
    +#define SIMDJSON_PPC64_BITMASK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +
    +//
    +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is
    +// encountered.
    +//
    +// For example, prefix_xor(00100100) == 00011100
    +//
    +simdjson_inline uint64_t prefix_xor(uint64_t bitmask) {
    +  // You can use the version below, however gcc sometimes miscompiles
    +  // vec_pmsum_be, it happens somewhere around between 8 and 9th version.
    +  // The performance boost was not noticeable, falling back to a usual
    +  // implementation.
    +  //   __vector unsigned long long all_ones = {~0ull, ~0ull};
    +  //   __vector unsigned long long mask = {bitmask, 0};
    +  //   // Clang and GCC return different values for pmsum for ull so cast it to one.
    +  //   // Generally it is not specified by ALTIVEC ISA what is returned by
    +  //   // vec_pmsum_be.
    +  // #if defined(__LITTLE_ENDIAN__)
    +  //   return (uint64_t)(((__vector unsigned long long)vec_pmsum_be(all_ones, mask))[0]);
    +  // #else
    +  //   return (uint64_t)(((__vector unsigned long long)vec_pmsum_be(all_ones, mask))[1]);
    +  // #endif
    +  bitmask ^= bitmask << 1;
    +  bitmask ^= bitmask << 2;
    +  bitmask ^= bitmask << 4;
    +  bitmask ^= bitmask << 8;
    +  bitmask ^= bitmask << 16;
    +  bitmask ^= bitmask << 32;
    +  return bitmask;
    +}
    +
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif
    +/* end file simdjson/ppc64/bitmask.h */
    +/* including simdjson/ppc64/numberparsing_defs.h: #include "simdjson/ppc64/numberparsing_defs.h" */
    +/* begin file simdjson/ppc64/numberparsing_defs.h */
    +#ifndef SIMDJSON_PPC64_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_PPC64_NUMBERPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +#if defined(__linux__)
    +#include 
    +#elif defined(__FreeBSD__)
    +#include 
    +#endif
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace numberparsing {
    +
    +// we don't have appropriate instructions, so let us use a scalar function
    +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  uint64_t val;
    +  std::memcpy(&val, chars, sizeof(uint64_t));
    +#ifdef __BIG_ENDIAN__
    +#if defined(__linux__)
    +  val = bswap_64(val);
    +#elif defined(__FreeBSD__)
    +  val = bswap64(val);
    +#endif
    +#endif
    +  val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8;
    +  val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16;
    +  return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32);
    +}
    +
    +/** @private */
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif // SIMDJSON_PPC64_NUMBERPARSING_DEFS_H
    +/* end file simdjson/ppc64/numberparsing_defs.h */
    +/* including simdjson/ppc64/simd.h: #include "simdjson/ppc64/simd.h" */
    +/* begin file simdjson/ppc64/simd.h */
    +#ifndef SIMDJSON_PPC64_SIMD_H
    +#define SIMDJSON_PPC64_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +namespace simd {
    +
    +using __m128i = __vector unsigned char;
    +
    +template  struct base {
    +  __m128i value;
    +
    +  // Zero constructor
    +  simdjson_inline base() : value{__m128i()} {}
    +
    +  // Conversion from SIMD register
    +  simdjson_inline base(const __m128i _value) : value(_value) {}
    +
    +  // Conversion to SIMD register
    +  simdjson_inline operator const __m128i &() const {
    +    return this->value;
    +  }
    +  simdjson_inline operator __m128i &() { return this->value; }
    +
    +  // Bit operations
    +  simdjson_inline Child operator|(const Child other) const {
    +    return vec_or(this->value, (__m128i)other);
    +  }
    +  simdjson_inline Child operator&(const Child other) const {
    +    return vec_and(this->value, (__m128i)other);
    +  }
    +  simdjson_inline Child operator^(const Child other) const {
    +    return vec_xor(this->value, (__m128i)other);
    +  }
    +  simdjson_inline Child bit_andnot(const Child other) const {
    +    return vec_andc(this->value, (__m128i)other);
    +  }
    +  simdjson_inline Child &operator|=(const Child other) {
    +    auto this_cast = static_cast(this);
    +    *this_cast = *this_cast | other;
    +    return *this_cast;
    +  }
    +  simdjson_inline Child &operator&=(const Child other) {
    +    auto this_cast = static_cast(this);
    +    *this_cast = *this_cast & other;
    +    return *this_cast;
    +  }
    +  simdjson_inline Child &operator^=(const Child other) {
    +    auto this_cast = static_cast(this);
    +    *this_cast = *this_cast ^ other;
    +    return *this_cast;
    +  }
    +};
    +
    +template >
    +struct base8 : base> {
    +  typedef uint16_t bitmask_t;
    +  typedef uint32_t bitmask2_t;
    +
    +  simdjson_inline base8() : base>() {}
    +  simdjson_inline base8(const __m128i _value) : base>(_value) {}
    +
    +  friend simdjson_inline Mask operator==(const simd8 lhs, const simd8 rhs) {
    +    return (__m128i)vec_cmpeq(lhs.value, (__m128i)rhs);
    +  }
    +
    +  static const int SIZE = sizeof(base>::value);
    +
    +  template 
    +  simdjson_inline simd8 prev(simd8 prev_chunk) const {
    +    __m128i chunk = this->value;
    +#ifdef __LITTLE_ENDIAN__
    +    chunk = (__m128i)vec_reve(this->value);
    +    prev_chunk = (__m128i)vec_reve((__m128i)prev_chunk);
    +#endif
    +    chunk = (__m128i)vec_sld((__m128i)prev_chunk, (__m128i)chunk, 16 - N);
    +#ifdef __LITTLE_ENDIAN__
    +    chunk = (__m128i)vec_reve((__m128i)chunk);
    +#endif
    +    return chunk;
    +  }
    +};
    +
    +// SIMD byte mask type (returned by things like eq and gt)
    +template <> struct simd8 : base8 {
    +  static simdjson_inline simd8 splat(bool _value) {
    +    return (__m128i)vec_splats((unsigned char)(-(!!_value)));
    +  }
    +
    +  simdjson_inline simd8() : base8() {}
    +  simdjson_inline simd8(const __m128i _value)
    +      : base8(_value) {}
    +  // Splat constructor
    +  simdjson_inline simd8(bool _value)
    +      : base8(splat(_value)) {}
    +
    +  simdjson_inline int to_bitmask() const {
    +    __vector unsigned long long result;
    +    const __m128i perm_mask = {0x78, 0x70, 0x68, 0x60, 0x58, 0x50, 0x48, 0x40,
    +                               0x38, 0x30, 0x28, 0x20, 0x18, 0x10, 0x08, 0x00};
    +
    +    result = ((__vector unsigned long long)vec_vbpermq((__m128i)this->value,
    +                                                       (__m128i)perm_mask));
    +#ifdef __LITTLE_ENDIAN__
    +    return static_cast(result[1]);
    +#else
    +    return static_cast(result[0]);
    +#endif
    +  }
    +  simdjson_inline bool any() const {
    +    return !vec_all_eq(this->value, (__m128i)vec_splats(0));
    +  }
    +  simdjson_inline simd8 operator~() const {
    +    return this->value ^ (__m128i)splat(true);
    +  }
    +};
    +
    +template  struct base8_numeric : base8 {
    +  static simdjson_inline simd8 splat(T value) {
    +    (void)value;
    +    return (__m128i)vec_splats(value);
    +  }
    +  static simdjson_inline simd8 zero() { return splat(0); }
    +  static simdjson_inline simd8 load(const T values[16]) {
    +    return (__m128i)(vec_vsx_ld(0, reinterpret_cast(values)));
    +  }
    +  // Repeat 16 values as many times as necessary (usually for lookup tables)
    +  static simdjson_inline simd8 repeat_16(T v0, T v1, T v2, T v3, T v4,
    +                                                   T v5, T v6, T v7, T v8, T v9,
    +                                                   T v10, T v11, T v12, T v13,
    +                                                   T v14, T v15) {
    +    return simd8(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
    +                    v14, v15);
    +  }
    +
    +  simdjson_inline base8_numeric() : base8() {}
    +  simdjson_inline base8_numeric(const __m128i _value)
    +      : base8(_value) {}
    +
    +  // Store to array
    +  simdjson_inline void store(T dst[16]) const {
    +    vec_vsx_st(this->value, 0, reinterpret_cast<__m128i *>(dst));
    +  }
    +
    +  // Override to distinguish from bool version
    +  simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +
    +  // Addition/subtraction are the same for signed and unsigned
    +  simdjson_inline simd8 operator+(const simd8 other) const {
    +    return (__m128i)((__m128i)this->value + (__m128i)other);
    +  }
    +  simdjson_inline simd8 operator-(const simd8 other) const {
    +    return (__m128i)((__m128i)this->value - (__m128i)other);
    +  }
    +  simdjson_inline simd8 &operator+=(const simd8 other) {
    +    *this = *this + other;
    +    return *static_cast *>(this);
    +  }
    +  simdjson_inline simd8 &operator-=(const simd8 other) {
    +    *this = *this - other;
    +    return *static_cast *>(this);
    +  }
    +
    +  // Perform a lookup assuming the value is between 0 and 16 (undefined behavior
    +  // for out of range values)
    +  template 
    +  simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +    return (__m128i)vec_perm((__m128i)lookup_table, (__m128i)lookup_table, this->value);
    +  }
    +
    +  // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted
    +  // as a bitset). Passing a 0 value for mask would be equivalent to writing out
    +  // every byte to output. Only the first 16 - count_ones(mask) bytes of the
    +  // result are significant but 16 bytes get written. Design consideration: it
    +  // seems like a function with the signature simd8 compress(uint32_t mask)
    +  // would be sensible, but the AVX ISA makes this kind of approach difficult.
    +  template 
    +  simdjson_inline void compress(uint16_t mask, L *output) const {
    +    using internal::BitsSetTable256mul2;
    +    using internal::pshufb_combine_table;
    +    using internal::thintable_epi8;
    +    // this particular implementation was inspired by work done by @animetosho
    +    // we do it in two steps, first 8 bytes and then second 8 bytes
    +    uint8_t mask1 = uint8_t(mask);      // least significant 8 bits
    +    uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
    +    // next line just loads the 64-bit values thintable_epi8[mask1] and
    +    // thintable_epi8[mask2] into a 128-bit register, using only
    +    // two instructions on most compilers.
    +#ifdef __LITTLE_ENDIAN__
    +    __m128i shufmask = (__m128i)(__vector unsigned long long){
    +        thintable_epi8[mask1], thintable_epi8[mask2]};
    +#else
    +    __m128i shufmask = (__m128i)(__vector unsigned long long){
    +        thintable_epi8[mask2], thintable_epi8[mask1]};
    +    shufmask = (__m128i)vec_reve((__m128i)shufmask);
    +#endif
    +    // we increment by 0x08 the second half of the mask
    +    shufmask = ((__m128i)shufmask) +
    +               ((__m128i)(__vector int){0, 0, 0x08080808, 0x08080808});
    +
    +    // this is the version "nearly pruned"
    +    __m128i pruned = vec_perm(this->value, this->value, shufmask);
    +    // we still need to put the two halves together.
    +    // we compute the popcount of the first half:
    +    int pop1 = BitsSetTable256mul2[mask1];
    +    // then load the corresponding mask, what it does is to write
    +    // only the first pop1 bytes from the first 8 bytes, and then
    +    // it fills in with the bytes from the second 8 bytes + some filling
    +    // at the end.
    +    __m128i compactmask =
    +        vec_vsx_ld(0, reinterpret_cast(pshufb_combine_table + pop1 * 8));
    +    __m128i answer = vec_perm(pruned, (__m128i)vec_splats(0), compactmask);
    +    vec_vsx_st(answer, 0, reinterpret_cast<__m128i *>(output));
    +  }
    +
    +  template 
    +  simdjson_inline simd8
    +  lookup_16(L replace0, L replace1, L replace2, L replace3, L replace4,
    +            L replace5, L replace6, L replace7, L replace8, L replace9,
    +            L replace10, L replace11, L replace12, L replace13, L replace14,
    +            L replace15) const {
    +    return lookup_16(simd8::repeat_16(
    +        replace0, replace1, replace2, replace3, replace4, replace5, replace6,
    +        replace7, replace8, replace9, replace10, replace11, replace12,
    +        replace13, replace14, replace15));
    +  }
    +};
    +
    +// Signed bytes
    +template <> struct simd8 : base8_numeric {
    +  simdjson_inline simd8() : base8_numeric() {}
    +  simdjson_inline simd8(const __m128i _value)
    +      : base8_numeric(_value) {}
    +  // Splat constructor
    +  simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +  // Array constructor
    +  simdjson_inline simd8(const int8_t *values) : simd8(load(values)) {}
    +  // Member-by-member initialization
    +  simdjson_inline simd8(int8_t v0, int8_t v1, int8_t v2, int8_t v3,
    +                               int8_t v4, int8_t v5, int8_t v6, int8_t v7,
    +                               int8_t v8, int8_t v9, int8_t v10, int8_t v11,
    +                               int8_t v12, int8_t v13, int8_t v14, int8_t v15)
    +      : simd8((__m128i)(__vector signed char){v0, v1, v2, v3, v4, v5, v6, v7,
    +                                              v8, v9, v10, v11, v12, v13, v14,
    +                                              v15}) {}
    +  // Repeat 16 values as many times as necessary (usually for lookup tables)
    +  simdjson_inline static simd8
    +  repeat_16(int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5,
    +            int8_t v6, int8_t v7, int8_t v8, int8_t v9, int8_t v10, int8_t v11,
    +            int8_t v12, int8_t v13, int8_t v14, int8_t v15) {
    +    return simd8(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
    +                         v13, v14, v15);
    +  }
    +
    +  // Order-sensitive comparisons
    +  simdjson_inline simd8
    +  max_val(const simd8 other) const {
    +    return (__m128i)vec_max((__vector signed char)this->value,
    +                            (__vector signed char)(__m128i)other);
    +  }
    +  simdjson_inline simd8
    +  min_val(const simd8 other) const {
    +    return (__m128i)vec_min((__vector signed char)this->value,
    +                            (__vector signed char)(__m128i)other);
    +  }
    +  simdjson_inline simd8
    +  operator>(const simd8 other) const {
    +    return (__m128i)vec_cmpgt((__vector signed char)this->value,
    +                              (__vector signed char)(__m128i)other);
    +  }
    +  simdjson_inline simd8
    +  operator<(const simd8 other) const {
    +    return (__m128i)vec_cmplt((__vector signed char)this->value,
    +                              (__vector signed char)(__m128i)other);
    +  }
    +};
    +
    +// Unsigned bytes
    +template <> struct simd8 : base8_numeric {
    +  simdjson_inline simd8() : base8_numeric() {}
    +  simdjson_inline simd8(const __m128i _value)
    +      : base8_numeric(_value) {}
    +  // Splat constructor
    +  simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +  // Array constructor
    +  simdjson_inline simd8(const uint8_t *values) : simd8(load(values)) {}
    +  // Member-by-member initialization
    +  simdjson_inline
    +  simd8(uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5,
    +        uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9, uint8_t v10,
    +        uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15)
    +      : simd8((__m128i){v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
    +                        v13, v14, v15}) {}
    +  // Repeat 16 values as many times as necessary (usually for lookup tables)
    +  simdjson_inline static simd8
    +  repeat_16(uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4,
    +            uint8_t v5, uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9,
    +            uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14,
    +            uint8_t v15) {
    +    return simd8(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
    +                          v13, v14, v15);
    +  }
    +
    +  // Saturated math
    +  simdjson_inline simd8
    +  saturating_add(const simd8 other) const {
    +    return (__m128i)vec_adds(this->value, (__m128i)other);
    +  }
    +  simdjson_inline simd8
    +  saturating_sub(const simd8 other) const {
    +    return (__m128i)vec_subs(this->value, (__m128i)other);
    +  }
    +
    +  // Order-specific operations
    +  simdjson_inline simd8
    +  max_val(const simd8 other) const {
    +    return (__m128i)vec_max(this->value, (__m128i)other);
    +  }
    +  simdjson_inline simd8
    +  min_val(const simd8 other) const {
    +    return (__m128i)vec_min(this->value, (__m128i)other);
    +  }
    +  // Same as >, but only guarantees true is nonzero (< guarantees true = -1)
    +  simdjson_inline simd8
    +  gt_bits(const simd8 other) const {
    +    return this->saturating_sub(other);
    +  }
    +  // Same as <, but only guarantees true is nonzero (< guarantees true = -1)
    +  simdjson_inline simd8
    +  lt_bits(const simd8 other) const {
    +    return other.saturating_sub(*this);
    +  }
    +  simdjson_inline simd8
    +  operator<=(const simd8 other) const {
    +    return other.max_val(*this) == other;
    +  }
    +  simdjson_inline simd8
    +  operator>=(const simd8 other) const {
    +    return other.min_val(*this) == other;
    +  }
    +  simdjson_inline simd8
    +  operator>(const simd8 other) const {
    +    return this->gt_bits(other).any_bits_set();
    +  }
    +  simdjson_inline simd8
    +  operator<(const simd8 other) const {
    +    return this->gt_bits(other).any_bits_set();
    +  }
    +
    +  // Bit-specific operations
    +  simdjson_inline simd8 bits_not_set() const {
    +    return (__m128i)vec_cmpeq(this->value, (__m128i)vec_splats(uint8_t(0)));
    +  }
    +  simdjson_inline simd8 bits_not_set(simd8 bits) const {
    +    return (*this & bits).bits_not_set();
    +  }
    +  simdjson_inline simd8 any_bits_set() const {
    +    return ~this->bits_not_set();
    +  }
    +  simdjson_inline simd8 any_bits_set(simd8 bits) const {
    +    return ~this->bits_not_set(bits);
    +  }
    +  simdjson_inline bool bits_not_set_anywhere() const {
    +    return vec_all_eq(this->value, (__m128i)vec_splats(0));
    +  }
    +  simdjson_inline bool any_bits_set_anywhere() const {
    +    return !bits_not_set_anywhere();
    +  }
    +  simdjson_inline bool bits_not_set_anywhere(simd8 bits) const {
    +    return vec_all_eq(vec_and(this->value, (__m128i)bits),
    +                      (__m128i)vec_splats(0));
    +  }
    +  simdjson_inline bool any_bits_set_anywhere(simd8 bits) const {
    +    return !bits_not_set_anywhere(bits);
    +  }
    +  template  simdjson_inline simd8 shr() const {
    +    return simd8(
    +        (__m128i)vec_sr(this->value, (__m128i)vec_splat_u8(N)));
    +  }
    +  template  simdjson_inline simd8 shl() const {
    +    return simd8(
    +        (__m128i)vec_sl(this->value, (__m128i)vec_splat_u8(N)));
    +  }
    +};
    +
    +template  struct simd8x64 {
    +  static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +  static_assert(NUM_CHUNKS == 4,
    +                "PPC64 kernel should use four registers per 64-byte block.");
    +  const simd8 chunks[NUM_CHUNKS];
    +
    +  simd8x64(const simd8x64 &o) = delete; // no copy allowed
    +  simd8x64 &
    +  operator=(const simd8& other) = delete; // no assignment allowed
    +  simd8x64() = delete;                      // no default constructor allowed
    +
    +  simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1,
    +                                  const simd8 chunk2, const simd8 chunk3)
    +      : chunks{chunk0, chunk1, chunk2, chunk3} {}
    +  simdjson_inline simd8x64(const T ptr[64])
    +      : chunks{simd8::load(ptr), simd8::load(ptr + 16),
    +               simd8::load(ptr + 32), simd8::load(ptr + 48)} {}
    +
    +  simdjson_inline void store(T ptr[64]) const {
    +    this->chunks[0].store(ptr + sizeof(simd8) * 0);
    +    this->chunks[1].store(ptr + sizeof(simd8) * 1);
    +    this->chunks[2].store(ptr + sizeof(simd8) * 2);
    +    this->chunks[3].store(ptr + sizeof(simd8) * 3);
    +  }
    +
    +  simdjson_inline simd8 reduce_or() const {
    +    return (this->chunks[0] | this->chunks[1]) |
    +           (this->chunks[2] | this->chunks[3]);
    +  }
    +
    +  simdjson_inline uint64_t compress(uint64_t mask, T *output) const {
    +    this->chunks[0].compress(uint16_t(mask), output);
    +    this->chunks[1].compress(uint16_t(mask >> 16),
    +                             output + 16 - count_ones(mask & 0xFFFF));
    +    this->chunks[2].compress(uint16_t(mask >> 32),
    +                             output + 32 - count_ones(mask & 0xFFFFFFFF));
    +    this->chunks[3].compress(uint16_t(mask >> 48),
    +                             output + 48 - count_ones(mask & 0xFFFFFFFFFFFF));
    +    return 64 - count_ones(mask);
    +  }
    +
    +  simdjson_inline uint64_t to_bitmask() const {
    +    uint64_t r0 = uint32_t(this->chunks[0].to_bitmask());
    +    uint64_t r1 = this->chunks[1].to_bitmask();
    +    uint64_t r2 = this->chunks[2].to_bitmask();
    +    uint64_t r3 = this->chunks[3].to_bitmask();
    +    return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48);
    +  }
    +
    +  simdjson_inline uint64_t eq(const T m) const {
    +    const simd8 mask = simd8::splat(m);
    +    return simd8x64(this->chunks[0] == mask, this->chunks[1] == mask,
    +                          this->chunks[2] == mask, this->chunks[3] == mask)
    +        .to_bitmask();
    +  }
    +
    +  simdjson_inline uint64_t eq(const simd8x64 &other) const {
    +    return simd8x64(this->chunks[0] == other.chunks[0],
    +                          this->chunks[1] == other.chunks[1],
    +                          this->chunks[2] == other.chunks[2],
    +                          this->chunks[3] == other.chunks[3])
    +        .to_bitmask();
    +  }
    +
    +  simdjson_inline uint64_t lteq(const T m) const {
    +    const simd8 mask = simd8::splat(m);
    +    return simd8x64(this->chunks[0] <= mask, this->chunks[1] <= mask,
    +                          this->chunks[2] <= mask, this->chunks[3] <= mask)
    +        .to_bitmask();
    +  }
    +}; // struct simd8x64
    +
    +} // namespace simd
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_PPC64_SIMD_INPUT_H
    +/* end file simdjson/ppc64/simd.h */
    +/* including simdjson/ppc64/stringparsing_defs.h: #include "simdjson/ppc64/stringparsing_defs.h" */
    +/* begin file simdjson/ppc64/stringparsing_defs.h */
    +#ifndef SIMDJSON_PPC64_STRINGPARSING_DEFS_H
    +#define SIMDJSON_PPC64_STRINGPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/simd.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +
    +using namespace simd;
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 32;
    +  simdjson_inline static backslash_and_quote
    +  copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() {
    +    return ((bs_bits - 1) & quote_bits) != 0;
    +  }
    +  simdjson_inline bool has_backslash() { return bs_bits != 0; }
    +  simdjson_inline int quote_index() {
    +    return trailing_zeroes(quote_bits);
    +  }
    +  simdjson_inline int backslash_index() {
    +    return trailing_zeroes(bs_bits);
    +  }
    +
    +  uint32_t bs_bits;
    +  uint32_t quote_bits;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote
    +backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // this can read up to 31 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1),
    +                "backslash and quote finder must process fewer than "
    +                "SIMDJSON_PADDING bytes");
    +  simd8 v0(src);
    +  simd8 v1(src + sizeof(v0));
    +  v0.store(dst);
    +  v1.store(dst + sizeof(v0));
    +
    +  // Getting a 64-bit bitmask is much cheaper than multiple 16-bit bitmasks on
    +  // PPC; therefore, we smash them together into a 64-byte mask and get the
    +  // bitmask from there.
    +  uint64_t bs_and_quote =
    +      simd8x64(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask();
    +  return {
    +      uint32_t(bs_and_quote),      // bs_bits
    +      uint32_t(bs_and_quote >> 32) // quote_bits
    +  };
    +}
    +
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_PPC64_STRINGPARSING_DEFS_H
    +/* end file simdjson/ppc64/stringparsing_defs.h */
    +
    +#define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1
    +/* end file simdjson/ppc64/begin.h */
    +/* including generic/amalgamated.h for ppc64: #include  */
    +/* begin file generic/amalgamated.h for ppc64 */
    +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_SRC_GENERIC_DEPENDENCIES_H)
    +#error generic/dependencies.h must be included before generic/amalgamated.h!
    +#endif
    +
    +/* including generic/base.h for ppc64: #include  */
    +/* begin file generic/base.h for ppc64 */
    +#ifndef SIMDJSON_SRC_GENERIC_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_BASE_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +
    +struct json_character_block;
    +
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_BASE_H
    +/* end file generic/base.h for ppc64 */
    +/* including generic/dom_parser_implementation.h for ppc64: #include  */
    +/* begin file generic/dom_parser_implementation.h for ppc64 */
    +#ifndef SIMDJSON_SRC_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_DOM_PARSER_IMPLEMENTATION_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// Interface a dom parser implementation must fulfill
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +
    +simdjson_inline simd8 must_be_2_3_continuation(const simd8 prev2, const simd8 prev3);
    +simdjson_inline bool is_ascii(const simd8x64& input);
    +
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +/* end file generic/dom_parser_implementation.h for ppc64 */
    +/* including generic/json_character_block.h for ppc64: #include  */
    +/* begin file generic/json_character_block.h for ppc64 */
    +#ifndef SIMDJSON_SRC_GENERIC_JSON_CHARACTER_BLOCK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_JSON_CHARACTER_BLOCK_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +
    +struct json_character_block {
    +  static simdjson_inline json_character_block classify(const simd::simd8x64& in);
    +
    +  simdjson_inline uint64_t whitespace() const noexcept { return _whitespace; }
    +  simdjson_inline uint64_t op() const noexcept { return _op; }
    +  simdjson_inline uint64_t scalar() const noexcept { return ~(op() | whitespace()); }
    +
    +  uint64_t _whitespace;
    +  uint64_t _op;
    +};
    +
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_JSON_CHARACTER_BLOCK_H
    +/* end file generic/json_character_block.h for ppc64 */
    +/* end file generic/amalgamated.h for ppc64 */
    +/* including generic/stage1/amalgamated.h for ppc64: #include  */
    +/* begin file generic/stage1/amalgamated.h for ppc64 */
    +// Stuff other things depend on
    +/* including generic/stage1/base.h for ppc64: #include  */
    +/* begin file generic/stage1/base.h for ppc64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_BASE_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +namespace stage1 {
    +
    +class bit_indexer;
    +template
    +struct buf_block_reader;
    +struct json_block;
    +class json_minifier;
    +class json_scanner;
    +struct json_string_block;
    +class json_string_scanner;
    +class json_structural_indexer;
    +
    +} // namespace stage1
    +
    +namespace utf8_validation {
    +struct utf8_checker;
    +} // namespace utf8_validation
    +
    +using utf8_validation::utf8_checker;
    +
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_BASE_H
    +/* end file generic/stage1/base.h for ppc64 */
    +/* including generic/stage1/buf_block_reader.h for ppc64: #include  */
    +/* begin file generic/stage1/buf_block_reader.h for ppc64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_BUF_BLOCK_READER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_BUF_BLOCK_READER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +namespace stage1 {
    +
    +// Walks through a buffer in block-sized increments, loading the last part with spaces
    +template
    +struct buf_block_reader {
    +public:
    +  simdjson_inline buf_block_reader(const uint8_t *_buf, size_t _len);
    +  simdjson_inline size_t block_index();
    +  simdjson_inline bool has_full_block() const;
    +  simdjson_inline const uint8_t *full_block() const;
    +  /**
    +   * Get the last block, padded with spaces.
    +   *
    +   * There will always be a last block, with at least 1 byte, unless len == 0 (in which case this
    +   * function fills the buffer with spaces and returns 0. In particular, if len == STEP_SIZE there
    +   * will be 0 full_blocks and 1 remainder block with STEP_SIZE bytes and no spaces for padding.
    +   *
    +   * @return the number of effective characters in the last block.
    +   */
    +  simdjson_inline size_t get_remainder(uint8_t *dst) const;
    +  simdjson_inline void advance();
    +private:
    +  const uint8_t *buf;
    +  const size_t len;
    +  const size_t lenminusstep;
    +  size_t idx;
    +};
    +
    +// Routines to print masks and text for debugging bitmask operations
    +simdjson_unused static char * format_input_text_64(const uint8_t *text) {
    +  static char buf[sizeof(simd8x64) + 1];
    +  for (size_t i=0; i); i++) {
    +    buf[i] = int8_t(text[i]) < ' ' ? '_' : int8_t(text[i]);
    +  }
    +  buf[sizeof(simd8x64)] = '\0';
    +  return buf;
    +}
    +
    +// Routines to print masks and text for debugging bitmask operations
    +simdjson_unused static char * format_input_text(const simd8x64& in) {
    +  static char buf[sizeof(simd8x64) + 1];
    +  in.store(reinterpret_cast(buf));
    +  for (size_t i=0; i); i++) {
    +    if (buf[i] < ' ') { buf[i] = '_'; }
    +  }
    +  buf[sizeof(simd8x64)] = '\0';
    +  return buf;
    +}
    +
    +simdjson_unused static char * format_input_text(const simd8x64& in, uint64_t mask) {
    +  static char buf[sizeof(simd8x64) + 1];
    +  in.store(reinterpret_cast(buf));
    +  for (size_t i=0; i); i++) {
    +    if (buf[i] <= ' ') { buf[i] = '_'; }
    +    if (!(mask & (size_t(1) << i))) { buf[i] = ' '; }
    +  }
    +  buf[sizeof(simd8x64)] = '\0';
    +  return buf;
    +}
    +
    +simdjson_unused static char * format_mask(uint64_t mask) {
    +  static char buf[sizeof(simd8x64) + 1];
    +  for (size_t i=0; i<64; i++) {
    +    buf[i] = (mask & (size_t(1) << i)) ? 'X' : ' ';
    +  }
    +  buf[64] = '\0';
    +  return buf;
    +}
    +
    +template
    +simdjson_inline buf_block_reader::buf_block_reader(const uint8_t *_buf, size_t _len) : buf{_buf}, len{_len}, lenminusstep{len < STEP_SIZE ? 0 : len - STEP_SIZE}, idx{0} {}
    +
    +template
    +simdjson_inline size_t buf_block_reader::block_index() { return idx; }
    +
    +template
    +simdjson_inline bool buf_block_reader::has_full_block() const {
    +  return idx < lenminusstep;
    +}
    +
    +template
    +simdjson_inline const uint8_t *buf_block_reader::full_block() const {
    +  return &buf[idx];
    +}
    +
    +template
    +simdjson_inline size_t buf_block_reader::get_remainder(uint8_t *dst) const {
    +  if(len == idx) { return 0; } // memcpy(dst, null, 0) will trigger an error with some sanitizers
    +  std::memset(dst, 0x20, STEP_SIZE); // std::memset STEP_SIZE because it's more efficient to write out 8 or 16 bytes at once.
    +  std::memcpy(dst, buf + idx, len - idx);
    +  return len - idx;
    +}
    +
    +template
    +simdjson_inline void buf_block_reader::advance() {
    +  idx += STEP_SIZE;
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_BUF_BLOCK_READER_H
    +/* end file generic/stage1/buf_block_reader.h for ppc64 */
    +/* including generic/stage1/json_escape_scanner.h for ppc64: #include  */
    +/* begin file generic/stage1/json_escape_scanner.h for ppc64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_ESCAPE_SCANNER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_ESCAPE_SCANNER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +namespace stage1 {
    +
    +/**
    + * Scans for escape characters in JSON, taking care with multiple backslashes (\\n vs. \n).
    + */
    +struct json_escape_scanner {
    +  /** The actual escape characters (the backslashes themselves). */
    +  uint64_t next_is_escaped = 0ULL;
    +
    +  struct escaped_and_escape {
    +    /**
    +     * Mask of escaped characters.
    +     *
    +     * ```
    +     * \n \\n \\\n \\\\n \
    +     * 0100100010100101000
    +     *  n  \   \ n  \ \
    +     * ```
    +     */
    +    uint64_t escaped;
    +    /**
    +     * Mask of escape characters.
    +     *
    +     * ```
    +     * \n \\n \\\n \\\\n \
    +     * 1001000101001010001
    +     * \  \   \ \  \ \   \
    +     * ```
    +     */
    +    uint64_t escape;
    +  };
    +
    +  /**
    +   * Get a mask of both escape and escaped characters (the characters following a backslash).
    +   *
    +   * @param potential_escape A mask of the character that can escape others (but could be
    +   *        escaped itself). e.g. block.eq('\\')
    +   */
    +  simdjson_really_inline escaped_and_escape next(uint64_t backslash) noexcept {
    +
    +#if !SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT
    +    if (!backslash) { return {next_escaped_without_backslashes(), 0}; }
    +#endif
    +
    +    // |                                | Mask (shows characters instead of 1's) | Depth | Instructions        |
    +    // |--------------------------------|----------------------------------------|-------|---------------------|
    +    // | string                         | `\\n_\\\n___\\\n___\\\\___\\\\__\\\`   |       |                     |
    +    // |                                | `    even   odd    even   odd   odd`   |       |                     |
    +    // | potential_escape               | ` \  \\\    \\\    \\\\   \\\\  \\\`   | 1     | 1 (backslash & ~first_is_escaped)
    +    // | escape_and_terminal_code       | ` \n \ \n   \ \n   \ \    \ \   \ \`   | 5     | 5 (next_escape_and_terminal_code())
    +    // | escaped                        | `\    \ n    \ n    \ \    \ \   \ ` X | 6     | 7 (escape_and_terminal_code ^ (potential_escape | first_is_escaped))
    +    // | escape                         | `    \ \    \ \    \ \    \ \   \ \`   | 6     | 8 (escape_and_terminal_code & backslash)
    +    // | first_is_escaped               | `\                                 `   | 7 (*) | 9 (escape >> 63) ()
    +    //                                                                               (*) this is not needed until the next iteration
    +    uint64_t escape_and_terminal_code = next_escape_and_terminal_code(backslash & ~this->next_is_escaped);
    +    uint64_t escaped = escape_and_terminal_code ^ (backslash | this->next_is_escaped);
    +    uint64_t escape = escape_and_terminal_code & backslash;
    +    this->next_is_escaped = escape >> 63;
    +    return {escaped, escape};
    +  }
    +
    +private:
    +  static constexpr const uint64_t ODD_BITS = 0xAAAAAAAAAAAAAAAAULL;
    +
    +  simdjson_really_inline uint64_t next_escaped_without_backslashes() noexcept {
    +    uint64_t escaped = this->next_is_escaped;
    +    this->next_is_escaped = 0;
    +    return escaped;
    +  }
    +
    +  /**
    +   * Returns a mask of the next escape characters (masking out escaped backslashes), along with
    +   * any non-backslash escape codes.
    +   *
    +   * \n \\n \\\n \\\\n returns:
    +   * \n \   \ \n \ \
    +   * 11 100 1011 10100
    +   *
    +   * You are expected to mask out the first bit yourself if the previous block had a trailing
    +   * escape.
    +   *
    +   * & the result with potential_escape to get just the escape characters.
    +   * ^ the result with (potential_escape | first_is_escaped) to get escaped characters.
    +   */
    +  static simdjson_really_inline uint64_t next_escape_and_terminal_code(uint64_t potential_escape) noexcept {
    +    // If we were to just shift and mask out any odd bits, we'd actually get a *half* right answer:
    +    // any even-aligned backslash runs would be correct! Odd-aligned backslash runs would be
    +    // inverted (\\\ would be 010 instead of 101).
    +    //
    +    // ```
    +    // string:              | ____\\\\_\\\\_____ |
    +    // maybe_escaped | ODD  |     \ \   \ \      |
    +    //               even-aligned ^^^  ^^^^ odd-aligned
    +    // ```
    +    //
    +    // Taking that into account, our basic strategy is:
    +    //
    +    // 1. Use subtraction to produce a mask with 1's for even-aligned runs and 0's for
    +    //    odd-aligned runs.
    +    // 2. XOR all odd bits, which masks out the odd bits in even-aligned runs, and brings IN the
    +    //    odd bits in odd-aligned runs.
    +    // 3. & with backslash to clean up any stray bits.
    +    // runs are set to 0, and then XORing with "odd":
    +    //
    +    // |                                | Mask (shows characters instead of 1's) | Instructions        |
    +    // |--------------------------------|----------------------------------------|---------------------|
    +    // | string                         | `\\n_\\\n___\\\n___\\\\___\\\\__\\\`   |
    +    // |                                | `    even   odd    even   odd   odd`   |
    +    // | maybe_escaped                  | `  n  \\n    \\n    \\\_   \\\_  \\` X | 1 (potential_escape << 1)
    +    // | maybe_escaped_and_odd          | ` \n_ \\n _ \\\n_ _ \\\__ _\\\_ \\\`   | 1 (maybe_escaped | odd)
    +    // | even_series_codes_and_odd      | `  n_\\\  _    n_ _\\\\ _     _    `   | 1 (maybe_escaped_and_odd - potential_escape)
    +    // | escape_and_terminal_code       | ` \n \ \n   \ \n   \ \    \ \   \ \`   | 1 (^ odd)
    +    //
    +
    +    // Escaped characters are characters following an escape.
    +    uint64_t maybe_escaped = potential_escape << 1;
    +
    +    // To distinguish odd from even escape sequences, therefore, we turn on any *starting*
    +    // escapes that are on an odd byte. (We actually bring in all odd bits, for speed.)
    +    // - Odd runs of backslashes are 0000, and the code at the end ("n" in \n or \\n) is 1.
    +    // - Odd runs of backslashes are 1111, and the code at the end ("n" in \n or \\n) is 0.
    +    // - All other odd bytes are 1, and even bytes are 0.
    +    uint64_t maybe_escaped_and_odd_bits     = maybe_escaped | ODD_BITS;
    +    uint64_t even_series_codes_and_odd_bits = maybe_escaped_and_odd_bits - potential_escape;
    +
    +    // Now we flip all odd bytes back with xor. This:
    +    // - Makes odd runs of backslashes go from 0000 to 1010
    +    // - Makes even runs of backslashes go from 1111 to 1010
    +    // - Sets actually-escaped codes to 1 (the n in \n and \\n: \n = 11, \\n = 100)
    +    // - Resets all other bytes to 0
    +    return even_series_codes_and_odd_bits ^ ODD_BITS;
    +  }
    +};
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H
    +/* end file generic/stage1/json_escape_scanner.h for ppc64 */
    +/* including generic/stage1/json_string_scanner.h for ppc64: #include  */
    +/* begin file generic/stage1/json_string_scanner.h for ppc64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +namespace stage1 {
    +
    +struct json_string_block {
    +  // We spell out the constructors in the hope of resolving inlining issues with Visual Studio 2017
    +  simdjson_really_inline json_string_block(uint64_t escaped, uint64_t quote, uint64_t in_string) :
    +  _escaped(escaped), _quote(quote), _in_string(in_string) {}
    +
    +  // Escaped characters (characters following an escape() character)
    +  simdjson_really_inline uint64_t escaped() const { return _escaped; }
    +  // Real (non-backslashed) quotes
    +  simdjson_really_inline uint64_t quote() const { return _quote; }
    +  // Only characters inside the string (not including the quotes)
    +  simdjson_really_inline uint64_t string_content() const { return _in_string & ~_quote; }
    +  // Return a mask of whether the given characters are inside a string (only works on non-quotes)
    +  simdjson_really_inline uint64_t non_quote_inside_string(uint64_t mask) const { return mask & _in_string; }
    +  // Return a mask of whether the given characters are inside a string (only works on non-quotes)
    +  simdjson_really_inline uint64_t non_quote_outside_string(uint64_t mask) const { return mask & ~_in_string; }
    +  // Tail of string (everything except the start quote)
    +  simdjson_really_inline uint64_t string_tail() const { return _in_string ^ _quote; }
    +
    +  // escaped characters (backslashed--does not include the hex characters after \u)
    +  uint64_t _escaped;
    +  // real quotes (non-escaped ones)
    +  uint64_t _quote;
    +  // string characters (includes start quote but not end quote)
    +  uint64_t _in_string;
    +};
    +
    +// Scans blocks for string characters, storing the state necessary to do so
    +class json_string_scanner {
    +public:
    +  simdjson_really_inline json_string_block next(const simd::simd8x64& in);
    +  // Returns either UNCLOSED_STRING or SUCCESS
    +  simdjson_really_inline error_code finish();
    +
    +private:
    +  // Scans for escape characters
    +  json_escape_scanner escape_scanner{};
    +  // Whether the last iteration was still inside a string (all 1's = true, all 0's = false).
    +  uint64_t prev_in_string = 0ULL;
    +};
    +
    +//
    +// Return a mask of all string characters plus end quotes.
    +//
    +// prev_escaped is overflow saying whether the next character is escaped.
    +// prev_in_string is overflow saying whether we're still in a string.
    +//
    +// Backslash sequences outside of quotes will be detected in stage 2.
    +//
    +simdjson_really_inline json_string_block json_string_scanner::next(const simd::simd8x64& in) {
    +  const uint64_t backslash = in.eq('\\');
    +  const uint64_t escaped = escape_scanner.next(backslash).escaped;
    +  const uint64_t quote = in.eq('"') & ~escaped;
    +
    +  //
    +  // prefix_xor flips on bits inside the string (and flips off the end quote).
    +  //
    +  // Then we xor with prev_in_string: if we were in a string already, its effect is flipped
    +  // (characters inside strings are outside, and characters outside strings are inside).
    +  //
    +  const uint64_t in_string = prefix_xor(quote) ^ prev_in_string;
    +
    +  //
    +  // Check if we're still in a string at the end of the box so the next block will know
    +  //
    +  prev_in_string = uint64_t(static_cast(in_string) >> 63);
    +
    +  // Use ^ to turn the beginning quote off, and the end quote on.
    +
    +  // We are returning a function-local object so either we get a move constructor
    +  // or we get copy elision.
    +  return json_string_block(escaped, quote, in_string);
    +}
    +
    +simdjson_really_inline error_code json_string_scanner::finish() {
    +  if (prev_in_string) {
    +    return UNCLOSED_STRING;
    +  }
    +  return SUCCESS;
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H
    +/* end file generic/stage1/json_string_scanner.h for ppc64 */
    +/* including generic/stage1/utf8_lookup4_algorithm.h for ppc64: #include  */
    +/* begin file generic/stage1/utf8_lookup4_algorithm.h for ppc64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_UTF8_LOOKUP4_ALGORITHM_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_UTF8_LOOKUP4_ALGORITHM_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +namespace utf8_validation {
    +
    +using namespace simd;
    +
    +  simdjson_inline simd8 check_special_cases(const simd8 input, const simd8 prev1) {
    +// Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII)
    +// Bit 1 = Too Long (ASCII followed by continuation)
    +// Bit 2 = Overlong 3-byte
    +// Bit 4 = Surrogate
    +// Bit 5 = Overlong 2-byte
    +// Bit 7 = Two Continuations
    +    constexpr const uint8_t TOO_SHORT   = 1<<0; // 11______ 0_______
    +                                                // 11______ 11______
    +    constexpr const uint8_t TOO_LONG    = 1<<1; // 0_______ 10______
    +    constexpr const uint8_t OVERLONG_3  = 1<<2; // 11100000 100_____
    +    constexpr const uint8_t SURROGATE   = 1<<4; // 11101101 101_____
    +    constexpr const uint8_t OVERLONG_2  = 1<<5; // 1100000_ 10______
    +    constexpr const uint8_t TWO_CONTS   = 1<<7; // 10______ 10______
    +    constexpr const uint8_t TOO_LARGE   = 1<<3; // 11110100 1001____
    +                                                // 11110100 101_____
    +                                                // 11110101 1001____
    +                                                // 11110101 101_____
    +                                                // 1111011_ 1001____
    +                                                // 1111011_ 101_____
    +                                                // 11111___ 1001____
    +                                                // 11111___ 101_____
    +    constexpr const uint8_t TOO_LARGE_1000 = 1<<6;
    +                                                // 11110101 1000____
    +                                                // 1111011_ 1000____
    +                                                // 11111___ 1000____
    +    constexpr const uint8_t OVERLONG_4  = 1<<6; // 11110000 1000____
    +
    +    const simd8 byte_1_high = prev1.shr<4>().lookup_16(
    +      // 0_______ ________ 
    +      TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG,
    +      TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG,
    +      // 10______ ________ 
    +      TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS,
    +      // 1100____ ________ 
    +      TOO_SHORT | OVERLONG_2,
    +      // 1101____ ________ 
    +      TOO_SHORT,
    +      // 1110____ ________ 
    +      TOO_SHORT | OVERLONG_3 | SURROGATE,
    +      // 1111____ ________ 
    +      TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4
    +    );
    +    constexpr const uint8_t CARRY = TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 .
    +    const simd8 byte_1_low = (prev1 & 0x0F).lookup_16(
    +      // ____0000 ________
    +      CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4,
    +      // ____0001 ________
    +      CARRY | OVERLONG_2,
    +      // ____001_ ________
    +      CARRY,
    +      CARRY,
    +
    +      // ____0100 ________
    +      CARRY | TOO_LARGE,
    +      // ____0101 ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      // ____011_ ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +
    +      // ____1___ ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      // ____1101 ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000
    +    );
    +    const simd8 byte_2_high = input.shr<4>().lookup_16(
    +      // ________ 0_______ 
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT,
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT,
    +
    +      // ________ 1000____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | OVERLONG_4,
    +      // ________ 1001____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE,
    +      // ________ 101_____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE  | TOO_LARGE,
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE  | TOO_LARGE,
    +
    +      // ________ 11______
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT
    +    );
    +    return (byte_1_high & byte_1_low & byte_2_high);
    +  }
    +  simdjson_inline simd8 check_multibyte_lengths(const simd8 input,
    +      const simd8 prev_input, const simd8 sc) {
    +    simd8 prev2 = input.prev<2>(prev_input);
    +    simd8 prev3 = input.prev<3>(prev_input);
    +    simd8 must23 = simd8(must_be_2_3_continuation(prev2, prev3));
    +    simd8 must23_80 = must23 & uint8_t(0x80);
    +    return must23_80 ^ sc;
    +  }
    +
    +  //
    +  // Return nonzero if there are incomplete multibyte characters at the end of the block:
    +  // e.g. if there is a 4-byte character, but it's 3 bytes from the end.
    +  //
    +  simdjson_inline simd8 is_incomplete(const simd8 input) {
    +    // If the previous input's last 3 bytes match this, they're too short (they ended at EOF):
    +    // ... 1111____ 111_____ 11______
    +#if SIMDJSON_IMPLEMENTATION_ICELAKE
    +    static const uint8_t max_array[64] = {
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 0xf0u-1, 0xe0u-1, 0xc0u-1
    +    };
    +#else
    +    static const uint8_t max_array[32] = {
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 0xf0u-1, 0xe0u-1, 0xc0u-1
    +    };
    +#endif
    +    const simd8 max_value(&max_array[sizeof(max_array)-sizeof(simd8)]);
    +    return input.gt_bits(max_value);
    +  }
    +
    +  struct utf8_checker {
    +    // If this is nonzero, there has been a UTF-8 error.
    +    simd8 error;
    +    // The last input we received
    +    simd8 prev_input_block;
    +    // Whether the last input we received was incomplete (used for ASCII fast path)
    +    simd8 prev_incomplete;
    +
    +    //
    +    // Check whether the current bytes are valid UTF-8.
    +    //
    +    simdjson_inline void check_utf8_bytes(const simd8 input, const simd8 prev_input) {
    +      // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ lead bytes
    +      // (2, 3, 4-byte leads become large positive numbers instead of small negative numbers)
    +      simd8 prev1 = input.prev<1>(prev_input);
    +      simd8 sc = check_special_cases(input, prev1);
    +      this->error |= check_multibyte_lengths(input, prev_input, sc);
    +    }
    +
    +    // The only problem that can happen at EOF is that a multibyte character is too short
    +    // or a byte value too large in the last bytes: check_special_cases only checks for bytes
    +    // too large in the first of two bytes.
    +    simdjson_inline void check_eof() {
    +      // If the previous block had incomplete UTF-8 characters at the end, an ASCII block can't
    +      // possibly finish them.
    +      this->error |= this->prev_incomplete;
    +    }
    +
    +    simdjson_inline void check_next_input(const simd8x64& input) {
    +      if(simdjson_likely(is_ascii(input))) {
    +        this->error |= this->prev_incomplete;
    +      } else {
    +        // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    +        static_assert((simd8x64::NUM_CHUNKS == 1)
    +                ||(simd8x64::NUM_CHUNKS == 2)
    +                || (simd8x64::NUM_CHUNKS == 4),
    +                "We support one, two or four chunks per 64-byte block.");
    +        SIMDJSON_IF_CONSTEXPR (simd8x64::NUM_CHUNKS == 1) {
    +          this->check_utf8_bytes(input.chunks[0], this->prev_input_block);
    +        } else SIMDJSON_IF_CONSTEXPR (simd8x64::NUM_CHUNKS == 2) {
    +          this->check_utf8_bytes(input.chunks[0], this->prev_input_block);
    +          this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +        } else SIMDJSON_IF_CONSTEXPR (simd8x64::NUM_CHUNKS == 4) {
    +          this->check_utf8_bytes(input.chunks[0], this->prev_input_block);
    +          this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +          this->check_utf8_bytes(input.chunks[2], input.chunks[1]);
    +          this->check_utf8_bytes(input.chunks[3], input.chunks[2]);
    +        }
    +        this->prev_incomplete = is_incomplete(input.chunks[simd8x64::NUM_CHUNKS-1]);
    +        this->prev_input_block = input.chunks[simd8x64::NUM_CHUNKS-1];
    +      }
    +    }
    +    // do not forget to call check_eof!
    +    simdjson_inline error_code errors() {
    +      return this->error.any_bits_set_anywhere() ? error_code::UTF8_ERROR : error_code::SUCCESS;
    +    }
    +
    +  }; // struct utf8_checker
    +} // namespace utf8_validation
    +
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_UTF8_LOOKUP4_ALGORITHM_H
    +/* end file generic/stage1/utf8_lookup4_algorithm.h for ppc64 */
    +/* including generic/stage1/json_scanner.h for ppc64: #include  */
    +/* begin file generic/stage1/json_scanner.h for ppc64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_SCANNER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_SCANNER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +namespace stage1 {
    +
    +/**
    + * A block of scanned json, with information on operators and scalars.
    + *
    + * We seek to identify pseudo-structural characters. Anything that is inside
    + * a string must be omitted (hence  & ~_string.string_tail()).
    + * Otherwise, pseudo-structural characters come in two forms.
    + * 1. We have the structural characters ([,],{,},:, comma). The
    + *    term 'structural character' is from the JSON RFC.
    + * 2. We have the 'scalar pseudo-structural characters'.
    + *    Scalars are quotes, and any character except structural characters and white space.
    + *
    + * To identify the scalar pseudo-structural characters, we must look at what comes
    + * before them: it must be a space, a quote or a structural characters.
    + * Starting with simdjson v0.3, we identify them by
    + * negation: we identify everything that is followed by a non-quote scalar,
    + * and we negate that. Whatever remains must be a 'scalar pseudo-structural character'.
    + */
    +struct json_block {
    +public:
    +  // We spell out the constructors in the hope of resolving inlining issues with Visual Studio 2017
    +  simdjson_inline json_block(json_string_block&& string, json_character_block characters, uint64_t follows_potential_nonquote_scalar) :
    +  _string(std::move(string)), _characters(characters), _follows_potential_nonquote_scalar(follows_potential_nonquote_scalar) {}
    +  simdjson_inline json_block(json_string_block string, json_character_block characters, uint64_t follows_potential_nonquote_scalar) :
    +  _string(string), _characters(characters), _follows_potential_nonquote_scalar(follows_potential_nonquote_scalar) {}
    +
    +  /**
    +   * The start of structurals.
    +   * In simdjson prior to v0.3, these were called the pseudo-structural characters.
    +   **/
    +  simdjson_inline uint64_t structural_start() const noexcept { return potential_structural_start() & ~_string.string_tail(); }
    +  /** All JSON whitespace (i.e. not in a string) */
    +  simdjson_inline uint64_t whitespace() const noexcept { return non_quote_outside_string(_characters.whitespace()); }
    +
    +  // Helpers
    +
    +  /** Whether the given characters are inside a string (only works on non-quotes) */
    +  simdjson_inline uint64_t non_quote_inside_string(uint64_t mask) const noexcept { return _string.non_quote_inside_string(mask); }
    +  /** Whether the given characters are outside a string (only works on non-quotes) */
    +  simdjson_inline uint64_t non_quote_outside_string(uint64_t mask) const noexcept { return _string.non_quote_outside_string(mask); }
    +
    +  // string and escape characters
    +  json_string_block _string;
    +  // whitespace, structural characters ('operators'), scalars
    +  json_character_block _characters;
    +  // whether the previous character was a scalar
    +  uint64_t _follows_potential_nonquote_scalar;
    +private:
    +  // Potential structurals (i.e. disregarding strings)
    +
    +  /**
    +   * structural elements ([,],{,},:, comma) plus scalar starts like 123, true and "abc".
    +   * They may reside inside a string.
    +   **/
    +  simdjson_inline uint64_t potential_structural_start() const noexcept { return _characters.op() | potential_scalar_start(); }
    +  /**
    +   * The start of non-operator runs, like 123, true and "abc".
    +   * It main reside inside a string.
    +   **/
    +  simdjson_inline uint64_t potential_scalar_start() const noexcept {
    +    // The term "scalar" refers to anything except structural characters and white space
    +    // (so letters, numbers, quotes).
    +    // Whenever it is preceded by something that is not a structural element ({,},[,],:, ") nor a white-space
    +    // then we know that it is irrelevant structurally.
    +    return _characters.scalar() & ~follows_potential_scalar();
    +  }
    +  /**
    +   * Whether the given character is immediately after a non-operator like 123, true.
    +   * The characters following a quote are not included.
    +   */
    +  simdjson_inline uint64_t follows_potential_scalar() const noexcept {
    +    // _follows_potential_nonquote_scalar: is defined as marking any character that follows a character
    +    // that is not a structural element ({,},[,],:, comma) nor a quote (") and that is not a
    +    // white space.
    +    // It is understood that within quoted region, anything at all could be marked (irrelevant).
    +    return _follows_potential_nonquote_scalar;
    +  }
    +};
    +
    +/**
    + * Scans JSON for important bits: structural characters or 'operators', strings, and scalars.
    + *
    + * The scanner starts by calculating two distinct things:
    + * - string characters (taking \" into account)
    + * - structural characters or 'operators' ([]{},:, comma)
    + *   and scalars (runs of non-operators like 123, true and "abc")
    + *
    + * To minimize data dependency (a key component of the scanner's speed), it finds these in parallel:
    + * in particular, the operator/scalar bit will find plenty of things that are actually part of
    + * strings. When we're done, json_block will fuse the two together by masking out tokens that are
    + * part of a string.
    + */
    +class json_scanner {
    +public:
    +  json_scanner() = default;
    +  simdjson_inline json_block next(const simd::simd8x64& in);
    +  // Returns either UNCLOSED_STRING or SUCCESS
    +  simdjson_inline error_code finish();
    +
    +private:
    +  // Whether the last character of the previous iteration is part of a scalar token
    +  // (anything except whitespace or a structural character/'operator').
    +  uint64_t prev_scalar = 0ULL;
    +  json_string_scanner string_scanner{};
    +};
    +
    +
    +//
    +// Check if the current character immediately follows a matching character.
    +//
    +// For example, this checks for quotes with backslashes in front of them:
    +//
    +//     const uint64_t backslashed_quote = in.eq('"') & immediately_follows(in.eq('\'), prev_backslash);
    +//
    +simdjson_inline uint64_t follows(const uint64_t match, uint64_t &overflow) {
    +  const uint64_t result = match << 1 | overflow;
    +  overflow = match >> 63;
    +  return result;
    +}
    +
    +simdjson_inline json_block json_scanner::next(const simd::simd8x64& in) {
    +  json_string_block strings = string_scanner.next(in);
    +  // identifies the white-space and the structural characters
    +  json_character_block characters = json_character_block::classify(in);
    +  // The term "scalar" refers to anything except structural characters and white space
    +  // (so letters, numbers, quotes).
    +  // We want follows_scalar to mark anything that follows a non-quote scalar (so letters and numbers).
    +  //
    +  // A terminal quote should either be followed by a structural character (comma, brace, bracket, colon)
    +  // or nothing. However, we still want ' "a string"true ' to mark the 't' of 'true' as a potential
    +  // pseudo-structural character just like we would if we had  ' "a string" true '; otherwise we
    +  // may need to add an extra check when parsing strings.
    +  //
    +  // Performance: there are many ways to skin this cat.
    +  const uint64_t nonquote_scalar = characters.scalar() & ~strings.quote();
    +  uint64_t follows_nonquote_scalar = follows(nonquote_scalar, prev_scalar);
    +  // We are returning a function-local object so either we get a move constructor
    +  // or we get copy elision.
    +  return json_block(
    +    strings,// strings is a function-local object so either it moves or the copy is elided.
    +    characters,
    +    follows_nonquote_scalar
    +  );
    +}
    +
    +simdjson_inline error_code json_scanner::finish() {
    +  return string_scanner.finish();
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_SCANNER_H
    +/* end file generic/stage1/json_scanner.h for ppc64 */
    +
    +// All other declarations
    +/* including generic/stage1/find_next_document_index.h for ppc64: #include  */
    +/* begin file generic/stage1/find_next_document_index.h for ppc64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +namespace stage1 {
    +
    +/**
    +  * This algorithm is used to quickly identify the last structural position that
    +  * makes up a complete document.
    +  *
    +  * It does this by going backwards and finding the last *document boundary* (a
    +  * place where one value follows another without a comma between them). If the
    +  * last document (the characters after the boundary) has an equal number of
    +  * start and end brackets, it is considered complete.
    +  *
    +  * Simply put, we iterate over the structural characters, starting from
    +  * the end. We consider that we found the end of a JSON document when the
    +  * first element of the pair is NOT one of these characters: '{' '[' ':' ','
    +  * and when the second element is NOT one of these characters: '}' ']' ':' ','.
    +  *
    +  * This simple comparison works most of the time, but it does not cover cases
    +  * where the batch's structural indexes contain a perfect amount of documents.
    +  * In such a case, we do not have access to the structural index which follows
    +  * the last document, therefore, we do not have access to the second element in
    +  * the pair, and that means we cannot identify the last document. To fix this
    +  * issue, we keep a count of the open and closed curly/square braces we found
    +  * while searching for the pair. When we find a pair AND the count of open and
    +  * closed curly/square braces is the same, we know that we just passed a
    +  * complete document, therefore the last json buffer location is the end of the
    +  * batch.
    +  */
    +simdjson_inline uint32_t find_next_document_index(dom_parser_implementation &parser) {
    +  // Variant: do not count separately, just figure out depth
    +  if(parser.n_structural_indexes == 0) { return 0; }
    +  auto arr_cnt = 0;
    +  auto obj_cnt = 0;
    +  for (auto i = parser.n_structural_indexes - 1; i > 0; i--) {
    +    auto idxb = parser.structural_indexes[i];
    +    switch (parser.buf[idxb]) {
    +    case ':':
    +    case ',':
    +      continue;
    +    case '}':
    +      obj_cnt--;
    +      continue;
    +    case ']':
    +      arr_cnt--;
    +      continue;
    +    case '{':
    +      obj_cnt++;
    +      break;
    +    case '[':
    +      arr_cnt++;
    +      break;
    +    }
    +    auto idxa = parser.structural_indexes[i - 1];
    +    switch (parser.buf[idxa]) {
    +    case '{':
    +    case '[':
    +    case ':':
    +    case ',':
    +      continue;
    +    }
    +    // Last document is complete, so the next document will appear after!
    +    if (!arr_cnt && !obj_cnt) {
    +      return parser.n_structural_indexes;
    +    }
    +    // Last document is incomplete; mark the document at i + 1 as the next one
    +    return i;
    +  }
    +  // If we made it to the end, we want to finish counting to see if we have a full document.
    +  switch (parser.buf[parser.structural_indexes[0]]) {
    +    case '}':
    +      obj_cnt--;
    +      break;
    +    case ']':
    +      arr_cnt--;
    +      break;
    +    case '{':
    +      obj_cnt++;
    +      break;
    +    case '[':
    +      arr_cnt++;
    +      break;
    +  }
    +  if (!arr_cnt && !obj_cnt) {
    +    // We have a complete document.
    +    return parser.n_structural_indexes;
    +  }
    +  return 0;
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H
    +/* end file generic/stage1/find_next_document_index.h for ppc64 */
    +/* including generic/stage1/json_minifier.h for ppc64: #include  */
    +/* begin file generic/stage1/json_minifier.h for ppc64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_MINIFIER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_MINIFIER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This file contains the common code every implementation uses in stage1
    +// It is intended to be included multiple times and compiled multiple times
    +// We assume the file in which it is included already includes
    +// "simdjson/stage1.h" (this simplifies amalgation)
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +namespace stage1 {
    +
    +class json_minifier {
    +public:
    +  template
    +  static error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) noexcept;
    +
    +private:
    +  simdjson_inline json_minifier(uint8_t *_dst)
    +  : dst{_dst}
    +  {}
    +  template
    +  simdjson_inline void step(const uint8_t *block_buf, buf_block_reader &reader) noexcept;
    +  simdjson_inline void next(const simd::simd8x64& in, const json_block& block);
    +  simdjson_inline error_code finish(uint8_t *dst_start, size_t &dst_len);
    +  json_scanner scanner{};
    +  uint8_t *dst;
    +};
    +
    +simdjson_inline void json_minifier::next(const simd::simd8x64& in, const json_block& block) {
    +  uint64_t mask = block.whitespace();
    +  dst += in.compress(mask, dst);
    +}
    +
    +simdjson_inline error_code json_minifier::finish(uint8_t *dst_start, size_t &dst_len) {
    +  error_code error = scanner.finish();
    +  if (error) { dst_len = 0; return error; }
    +  dst_len = dst - dst_start;
    +  return SUCCESS;
    +}
    +
    +template<>
    +simdjson_inline void json_minifier::step<128>(const uint8_t *block_buf, buf_block_reader<128> &reader) noexcept {
    +  simd::simd8x64 in_1(block_buf);
    +  simd::simd8x64 in_2(block_buf+64);
    +  json_block block_1 = scanner.next(in_1);
    +  json_block block_2 = scanner.next(in_2);
    +  this->next(in_1, block_1);
    +  this->next(in_2, block_2);
    +  reader.advance();
    +}
    +
    +template<>
    +simdjson_inline void json_minifier::step<64>(const uint8_t *block_buf, buf_block_reader<64> &reader) noexcept {
    +  simd::simd8x64 in_1(block_buf);
    +  json_block block_1 = scanner.next(in_1);
    +  this->next(block_buf, block_1);
    +  reader.advance();
    +}
    +
    +template
    +error_code json_minifier::minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) noexcept {
    +  buf_block_reader reader(buf, len);
    +  json_minifier minifier(dst);
    +
    +  // Index the first n-1 blocks
    +  while (reader.has_full_block()) {
    +    minifier.step(reader.full_block(), reader);
    +  }
    +
    +  // Index the last (remainder) block, padded with spaces
    +  uint8_t block[STEP_SIZE];
    +  size_t remaining_bytes = reader.get_remainder(block);
    +  if (remaining_bytes > 0) {
    +    // We do not want to write directly to the output stream. Rather, we write
    +    // to a local buffer (for safety).
    +    uint8_t out_block[STEP_SIZE];
    +    uint8_t * const guarded_dst{minifier.dst};
    +    minifier.dst = out_block;
    +    minifier.step(block, reader);
    +    size_t to_write = minifier.dst - out_block;
    +    // In some cases, we could be enticed to consider the padded spaces
    +    // as part of the string. This is fine as long as we do not write more
    +    // than we consumed.
    +    if(to_write > remaining_bytes) { to_write = remaining_bytes; }
    +    memcpy(guarded_dst, out_block, to_write);
    +    minifier.dst = guarded_dst + to_write;
    +  }
    +  return minifier.finish(dst, dst_len);
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_MINIFIER_H
    +/* end file generic/stage1/json_minifier.h for ppc64 */
    +/* including generic/stage1/json_structural_indexer.h for ppc64: #include  */
    +/* begin file generic/stage1/json_structural_indexer.h for ppc64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRUCTURAL_INDEXER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRUCTURAL_INDEXER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This file contains the common code every implementation uses in stage1
    +// It is intended to be included multiple times and compiled multiple times
    +// We assume the file in which it is included already includes
    +// "simdjson/stage1.h" (this simplifies amalgation)
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +namespace stage1 {
    +
    +class bit_indexer {
    +public:
    +  uint32_t *tail;
    +
    +  simdjson_inline bit_indexer(uint32_t *index_buf) : tail(index_buf) {}
    +
    +#if SIMDJSON_PREFER_REVERSE_BITS
    +  /**
    +    * ARM lacks a fast trailing zero instruction, but it has a fast
    +    * bit reversal instruction and a fast leading zero instruction.
    +    * Thus it may be profitable to reverse the bits (once) and then
    +    * to rely on a sequence of instructions that call the leading
    +    * zero instruction.
    +    *
    +    * Performance notes:
    +    * The chosen routine is not optimal in terms of data dependency
    +    * since zero_leading_bit might require two instructions. However,
    +    * it tends to minimize the total number of instructions which is
    +    * beneficial.
    +    */
    +  simdjson_inline void write_index(uint32_t idx, uint64_t& rev_bits, int i) {
    +    int lz = leading_zeroes(rev_bits);
    +    this->tail[i] = static_cast(idx) + lz;
    +    rev_bits = zero_leading_bit(rev_bits, lz);
    +  }
    +#else
    +  /**
    +    * Under recent x64 systems, we often have both a fast trailing zero
    +    * instruction and a fast 'clear-lower-bit' instruction so the following
    +    * algorithm can be competitive.
    +    */
    +
    +  simdjson_inline void write_index(uint32_t idx, uint64_t& bits, int i) {
    +    this->tail[i] = idx + trailing_zeroes(bits);
    +    bits = clear_lowest_bit(bits);
    +  }
    +#endif // SIMDJSON_PREFER_REVERSE_BITS
    +
    +  template 
    +  simdjson_inline int write_indexes(uint32_t idx, uint64_t& bits) {
    +    write_index(idx, bits, START);
    +    SIMDJSON_IF_CONSTEXPR (N > 1) {
    +      write_indexes<(N-1>0?START+1:START), (N-1>=0?N-1:1)>(idx, bits);
    +    }
    +    return START+N;
    +  }
    +
    +  template 
    +  simdjson_inline int write_indexes_stepped(uint32_t idx, uint64_t& bits, int cnt) {
    +    write_indexes(idx, bits);
    +    SIMDJSON_IF_CONSTEXPR ((START+STEP)  < END) {
    +      if (simdjson_unlikely((START+STEP) < cnt)) {
    +        write_indexes_stepped<(START+STEP(idx, bits, cnt);
    +      }
    +    }
    +    return ((END-START) % STEP) == 0 ? END : (END-START) - ((END-START) % STEP) + STEP;
    +  }
    +
    +  // flatten out values in 'bits' assuming that they are are to have values of idx
    +  // plus their position in the bitvector, and store these indexes at
    +  // base_ptr[base] incrementing base as we go
    +  // will potentially store extra values beyond end of valid bits, so base_ptr
    +  // needs to be large enough to handle this
    +  //
    +  // If the kernel sets SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER, then it
    +  // will provide its own version of the code.
    +#ifdef SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER
    +  simdjson_inline void write(uint32_t idx, uint64_t bits);
    +#else
    +  simdjson_inline void write(uint32_t idx, uint64_t bits) {
    +    // In some instances, the next branch is expensive because it is mispredicted.
    +    // Unfortunately, in other cases,
    +    // it helps tremendously.
    +    if (bits == 0)
    +        return;
    +
    +    int cnt = static_cast(count_ones(bits));
    +
    +#if SIMDJSON_PREFER_REVERSE_BITS
    +    bits = reverse_bits(bits);
    +#endif
    +#ifdef SIMDJSON_STRUCTURAL_INDEXER_STEP
    +    static constexpr const int STEP = SIMDJSON_STRUCTURAL_INDEXER_STEP;
    +#else
    +    static constexpr const int STEP = 4;
    +#endif
    +    static constexpr const int STEP_UNTIL = 24;
    +
    +    write_indexes_stepped<0, STEP_UNTIL, STEP>(idx, bits, cnt);
    +    SIMDJSON_IF_CONSTEXPR (STEP_UNTIL < 64) {
    +      if (simdjson_unlikely(STEP_UNTIL < cnt)) {
    +        for (int i=STEP_UNTIL; itail += cnt;
    +  }
    +#endif // SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER
    +
    +};
    +
    +class json_structural_indexer {
    +public:
    +  /**
    +   * Find the important bits of JSON in a 128-byte chunk, and add them to structural_indexes.
    +   *
    +   * @param partial Setting the partial parameter to true allows the find_structural_bits to
    +   *   tolerate unclosed strings. The caller should still ensure that the input is valid UTF-8. If
    +   *   you are processing substrings, you may want to call on a function like trimmed_length_safe_utf8.
    +   */
    +  template
    +  static error_code index(const uint8_t *buf, size_t len, dom_parser_implementation &parser, stage1_mode partial) noexcept;
    +
    +private:
    +  simdjson_inline json_structural_indexer(uint32_t *structural_indexes);
    +  template
    +  simdjson_inline void step(const uint8_t *block, buf_block_reader &reader) noexcept;
    +  simdjson_inline void next(const simd::simd8x64& in, const json_block& block, size_t idx);
    +  simdjson_inline error_code finish(dom_parser_implementation &parser, size_t idx, size_t len, stage1_mode partial);
    +
    +  json_scanner scanner{};
    +  utf8_checker checker{};
    +  bit_indexer indexer;
    +  uint64_t prev_structurals = 0;
    +  uint64_t unescaped_chars_error = 0;
    +};
    +
    +simdjson_inline json_structural_indexer::json_structural_indexer(uint32_t *structural_indexes) : indexer{structural_indexes} {}
    +
    +// Skip the last character if it is partial
    +simdjson_inline size_t trim_partial_utf8(const uint8_t *buf, size_t len) {
    +  if (simdjson_unlikely(len < 3)) {
    +    switch (len) {
    +      case 2:
    +        if (buf[len-1] >= 0xc0) { return len-1; } // 2-, 3- and 4-byte characters with only 1 byte left
    +        if (buf[len-2] >= 0xe0) { return len-2; } // 3- and 4-byte characters with only 2 bytes left
    +        return len;
    +      case 1:
    +        if (buf[len-1] >= 0xc0) { return len-1; } // 2-, 3- and 4-byte characters with only 1 byte left
    +        return len;
    +      case 0:
    +        return len;
    +    }
    +  }
    +  if (buf[len-1] >= 0xc0) { return len-1; } // 2-, 3- and 4-byte characters with only 1 byte left
    +  if (buf[len-2] >= 0xe0) { return len-2; } // 3- and 4-byte characters with only 1 byte left
    +  if (buf[len-3] >= 0xf0) { return len-3; } // 4-byte characters with only 3 bytes left
    +  return len;
    +}
    +
    +//
    +// PERF NOTES:
    +// We pipe 2 inputs through these stages:
    +// 1. Load JSON into registers. This takes a long time and is highly parallelizable, so we load
    +//    2 inputs' worth at once so that by the time step 2 is looking for them input, it's available.
    +// 2. Scan the JSON for critical data: strings, scalars and operators. This is the critical path.
    +//    The output of step 1 depends entirely on this information. These functions don't quite use
    +//    up enough CPU: the second half of the functions is highly serial, only using 1 execution core
    +//    at a time. The second input's scans has some dependency on the first ones finishing it, but
    +//    they can make a lot of progress before they need that information.
    +// 3. Step 1 doesn't use enough capacity, so we run some extra stuff while we're waiting for that
    +//    to finish: utf-8 checks and generating the output from the last iteration.
    +//
    +// The reason we run 2 inputs at a time, is steps 2 and 3 are *still* not enough to soak up all
    +// available capacity with just one input. Running 2 at a time seems to give the CPU a good enough
    +// workout.
    +//
    +template
    +error_code json_structural_indexer::index(const uint8_t *buf, size_t len, dom_parser_implementation &parser, stage1_mode partial) noexcept {
    +  if (simdjson_unlikely(len > parser.capacity())) { return CAPACITY; }
    +  // We guard the rest of the code so that we can assume that len > 0 throughout.
    +  if (len == 0) { return EMPTY; }
    +  if (is_streaming(partial)) {
    +    len = trim_partial_utf8(buf, len);
    +    // If you end up with an empty window after trimming
    +    // the partial UTF-8 bytes, then chances are good that you
    +    // have an UTF-8 formatting error.
    +    if(len == 0) { return UTF8_ERROR; }
    +  }
    +  buf_block_reader reader(buf, len);
    +  json_structural_indexer indexer(parser.structural_indexes.get());
    +
    +  // Read all but the last block
    +  while (reader.has_full_block()) {
    +    indexer.step(reader.full_block(), reader);
    +  }
    +  // Take care of the last block (will always be there unless file is empty which is
    +  // not supposed to happen.)
    +  uint8_t block[STEP_SIZE];
    +  if (simdjson_unlikely(reader.get_remainder(block) == 0)) { return UNEXPECTED_ERROR; }
    +  indexer.step(block, reader);
    +  return indexer.finish(parser, reader.block_index(), len, partial);
    +}
    +
    +template<>
    +simdjson_inline void json_structural_indexer::step<128>(const uint8_t *block, buf_block_reader<128> &reader) noexcept {
    +  simd::simd8x64 in_1(block);
    +  simd::simd8x64 in_2(block+64);
    +  json_block block_1 = scanner.next(in_1);
    +  json_block block_2 = scanner.next(in_2);
    +  this->next(in_1, block_1, reader.block_index());
    +  this->next(in_2, block_2, reader.block_index()+64);
    +  reader.advance();
    +}
    +
    +template<>
    +simdjson_inline void json_structural_indexer::step<64>(const uint8_t *block, buf_block_reader<64> &reader) noexcept {
    +  simd::simd8x64 in_1(block);
    +  json_block block_1 = scanner.next(in_1);
    +  this->next(in_1, block_1, reader.block_index());
    +  reader.advance();
    +}
    +
    +simdjson_inline void json_structural_indexer::next(const simd::simd8x64& in, const json_block& block, size_t idx) {
    +  uint64_t unescaped = in.lteq(0x1F);
    +#if SIMDJSON_UTF8VALIDATION
    +  checker.check_next_input(in);
    +#endif
    +  indexer.write(uint32_t(idx-64), prev_structurals); // Output *last* iteration's structurals to the parser
    +  prev_structurals = block.structural_start();
    +  unescaped_chars_error |= block.non_quote_inside_string(unescaped);
    +}
    +
    +simdjson_inline error_code json_structural_indexer::finish(dom_parser_implementation &parser, size_t idx, size_t len, stage1_mode partial) {
    +  // Write out the final iteration's structurals
    +  indexer.write(uint32_t(idx-64), prev_structurals);
    +  error_code error = scanner.finish();
    +  // We deliberately break down the next expression so that it is
    +  // human readable.
    +  const bool should_we_exit = is_streaming(partial) ?
    +    ((error != SUCCESS) && (error != UNCLOSED_STRING)) // when partial we tolerate UNCLOSED_STRING
    +    : (error != SUCCESS); // if partial is false, we must have SUCCESS
    +  const bool have_unclosed_string = (error == UNCLOSED_STRING);
    +  if (simdjson_unlikely(should_we_exit)) { return error; }
    +
    +  if (unescaped_chars_error) {
    +    return UNESCAPED_CHARS;
    +  }
    +  parser.n_structural_indexes = uint32_t(indexer.tail - parser.structural_indexes.get());
    +  /***
    +   * The On Demand API requires special padding.
    +   *
    +   * This is related to https://github.com/simdjson/simdjson/issues/906
    +   * Basically, we want to make sure that if the parsing continues beyond the last (valid)
    +   * structural character, it quickly stops.
    +   * Only three structural characters can be repeated without triggering an error in JSON:  [,] and }.
    +   * We repeat the padding character (at 'len'). We don't know what it is, but if the parsing
    +   * continues, then it must be [,] or }.
    +   * Suppose it is ] or }. We backtrack to the first character, what could it be that would
    +   * not trigger an error? It could be ] or } but no, because you can't start a document that way.
    +   * It can't be a comma, a colon or any simple value. So the only way we could continue is
    +   * if the repeated character is [. But if so, the document must start with [. But if the document
    +   * starts with [, it should end with ]. If we enforce that rule, then we would get
    +   * ][[ which is invalid.
    +   *
    +   * This is illustrated with the test array_iterate_unclosed_error() on the following input:
    +   * R"({ "a": [,,)"
    +   **/
    +  parser.structural_indexes[parser.n_structural_indexes] = uint32_t(len); // used later in partial == stage1_mode::streaming_final
    +  parser.structural_indexes[parser.n_structural_indexes + 1] = uint32_t(len);
    +  parser.structural_indexes[parser.n_structural_indexes + 2] = 0;
    +  parser.next_structural_index = 0;
    +  // a valid JSON file cannot have zero structural indexes - we should have found something
    +  if (simdjson_unlikely(parser.n_structural_indexes == 0u)) {
    +    return EMPTY;
    +  }
    +  if (simdjson_unlikely(parser.structural_indexes[parser.n_structural_indexes - 1] > len)) {
    +    return UNEXPECTED_ERROR;
    +  }
    +  if (partial == stage1_mode::streaming_partial) {
    +    // If we have an unclosed string, then the last structural
    +    // will be the quote and we want to make sure to omit it.
    +    if(have_unclosed_string) {
    +      parser.n_structural_indexes--;
    +      // a valid JSON file cannot have zero structural indexes - we should have found something
    +      if (simdjson_unlikely(parser.n_structural_indexes == 0u)) { return CAPACITY; }
    +    }
    +    // We truncate the input to the end of the last complete document (or zero).
    +    auto new_structural_indexes = find_next_document_index(parser);
    +    if (new_structural_indexes == 0 && parser.n_structural_indexes > 0) {
    +      if(parser.structural_indexes[0] == 0) {
    +        // If the buffer is partial and we started at index 0 but the document is
    +        // incomplete, it's too big to parse.
    +        return CAPACITY;
    +      } else {
    +        // It is possible that the document could be parsed, we just had a lot
    +        // of white space.
    +        parser.n_structural_indexes = 0;
    +        return EMPTY;
    +      }
    +    }
    +
    +    parser.n_structural_indexes = new_structural_indexes;
    +  } else if (partial == stage1_mode::streaming_final) {
    +    if(have_unclosed_string) { parser.n_structural_indexes--; }
    +    // We truncate the input to the end of the last complete document (or zero).
    +    // Because partial == stage1_mode::streaming_final, it means that we may
    +    // silently ignore trailing garbage. Though it sounds bad, we do it
    +    // deliberately because many people who have streams of JSON documents
    +    // will truncate them for processing. E.g., imagine that you are uncompressing
    +    // the data from a size file or receiving it in chunks from the network. You
    +    // may not know where exactly the last document will be. Meanwhile the
    +    // document_stream instances allow people to know the JSON documents they are
    +    // parsing (see the iterator.source() method).
    +    parser.n_structural_indexes = find_next_document_index(parser);
    +    // We store the initial n_structural_indexes so that the client can see
    +    // whether we used truncation. If initial_n_structural_indexes == parser.n_structural_indexes,
    +    // then this will query parser.structural_indexes[parser.n_structural_indexes] which is len,
    +    // otherwise, it will copy some prior index.
    +    parser.structural_indexes[parser.n_structural_indexes + 1] = parser.structural_indexes[parser.n_structural_indexes];
    +    // This next line is critical, do not change it unless you understand what you are
    +    // doing.
    +    parser.structural_indexes[parser.n_structural_indexes] = uint32_t(len);
    +    if (simdjson_unlikely(parser.n_structural_indexes == 0u)) {
    +        // We tolerate an unclosed string at the very end of the stream. Indeed, users
    +        // often load their data in bulk without being careful and they want us to ignore
    +        // the trailing garbage.
    +        return EMPTY;
    +    }
    +  }
    +  checker.check_eof();
    +  return checker.errors();
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +// Clear CUSTOM_BIT_INDEXER so other implementations can set it if they need to.
    +#undef SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRUCTURAL_INDEXER_H
    +/* end file generic/stage1/json_structural_indexer.h for ppc64 */
    +/* including generic/stage1/utf8_validator.h for ppc64: #include  */
    +/* begin file generic/stage1/utf8_validator.h for ppc64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_UTF8_VALIDATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_UTF8_VALIDATOR_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +namespace stage1 {
    +
    +/**
    + * Validates that the string is actual UTF-8.
    + */
    +template
    +bool generic_validate_utf8(const uint8_t * input, size_t length) {
    +    checker c{};
    +    buf_block_reader<64> reader(input, length);
    +    while (reader.has_full_block()) {
    +      simd::simd8x64 in(reader.full_block());
    +      c.check_next_input(in);
    +      reader.advance();
    +    }
    +    uint8_t block[64]{};
    +    reader.get_remainder(block);
    +    simd::simd8x64 in(block);
    +    c.check_next_input(in);
    +    reader.advance();
    +    c.check_eof();
    +    return c.errors() == error_code::SUCCESS;
    +}
    +
    +bool generic_validate_utf8(const char * input, size_t length) {
    +    return generic_validate_utf8(reinterpret_cast(input),length);
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_UTF8_VALIDATOR_H
    +/* end file generic/stage1/utf8_validator.h for ppc64 */
    +/* end file generic/stage1/amalgamated.h for ppc64 */
    +/* including generic/stage2/amalgamated.h for ppc64: #include  */
    +/* begin file generic/stage2/amalgamated.h for ppc64 */
    +// Stuff other things depend on
    +/* including generic/stage2/base.h for ppc64: #include  */
    +/* begin file generic/stage2/base.h for ppc64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_BASE_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +namespace stage2 {
    +
    +class json_iterator;
    +class structural_iterator;
    +struct tape_builder;
    +struct tape_writer;
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_BASE_H
    +/* end file generic/stage2/base.h for ppc64 */
    +/* including generic/stage2/tape_writer.h for ppc64: #include  */
    +/* begin file generic/stage2/tape_writer.h for ppc64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +namespace stage2 {
    +
    +struct tape_writer {
    +  /** The next place to write to tape */
    +  uint64_t *next_tape_loc;
    +
    +  /** Write a signed 64-bit value to tape. */
    +  simdjson_inline void append_s64(int64_t value) noexcept;
    +
    +  /** Write an unsigned 64-bit value to tape. */
    +  simdjson_inline void append_u64(uint64_t value) noexcept;
    +
    +  /** Write a double value to tape. */
    +  simdjson_inline void append_double(double value) noexcept;
    +
    +  /**
    +   * Append a tape entry (an 8-bit type,and 56 bits worth of value).
    +   */
    +  simdjson_inline void append(uint64_t val, internal::tape_type t) noexcept;
    +
    +  /**
    +   * Skip the current tape entry without writing.
    +   *
    +   * Used to skip the start of the container, since we'll come back later to fill it in when the
    +   * container ends.
    +   */
    +  simdjson_inline void skip() noexcept;
    +
    +  /**
    +   * Skip the number of tape entries necessary to write a large u64 or i64.
    +   */
    +  simdjson_inline void skip_large_integer() noexcept;
    +
    +  /**
    +   * Skip the number of tape entries necessary to write a double.
    +   */
    +  simdjson_inline void skip_double() noexcept;
    +
    +  /**
    +   * Write a value to a known location on tape.
    +   *
    +   * Used to go back and write out the start of a container after the container ends.
    +   */
    +  simdjson_inline static void write(uint64_t &tape_loc, uint64_t val, internal::tape_type t) noexcept;
    +
    +private:
    +  /**
    +   * Append both the tape entry, and a supplementary value following it. Used for types that need
    +   * all 64 bits, such as double and uint64_t.
    +   */
    +  template
    +  simdjson_inline void append2(uint64_t val, T val2, internal::tape_type t) noexcept;
    +}; // struct tape_writer
    +
    +simdjson_inline void tape_writer::append_s64(int64_t value) noexcept {
    +  append2(0, value, internal::tape_type::INT64);
    +}
    +
    +simdjson_inline void tape_writer::append_u64(uint64_t value) noexcept {
    +  append(0, internal::tape_type::UINT64);
    +  *next_tape_loc = value;
    +  next_tape_loc++;
    +}
    +
    +/** Write a double value to tape. */
    +simdjson_inline void tape_writer::append_double(double value) noexcept {
    +  append2(0, value, internal::tape_type::DOUBLE);
    +}
    +
    +simdjson_inline void tape_writer::skip() noexcept {
    +  next_tape_loc++;
    +}
    +
    +simdjson_inline void tape_writer::skip_large_integer() noexcept {
    +  next_tape_loc += 2;
    +}
    +
    +simdjson_inline void tape_writer::skip_double() noexcept {
    +  next_tape_loc += 2;
    +}
    +
    +simdjson_inline void tape_writer::append(uint64_t val, internal::tape_type t) noexcept {
    +  *next_tape_loc = val | ((uint64_t(char(t))) << 56);
    +  next_tape_loc++;
    +}
    +
    +template
    +simdjson_inline void tape_writer::append2(uint64_t val, T val2, internal::tape_type t) noexcept {
    +  append(val, t);
    +  static_assert(sizeof(val2) == sizeof(*next_tape_loc), "Type is not 64 bits!");
    +  memcpy(next_tape_loc, &val2, sizeof(val2));
    +  next_tape_loc++;
    +}
    +
    +simdjson_inline void tape_writer::write(uint64_t &tape_loc, uint64_t val, internal::tape_type t) noexcept {
    +  tape_loc = val | ((uint64_t(char(t))) << 56);
    +}
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H
    +/* end file generic/stage2/tape_writer.h for ppc64 */
    +/* including generic/stage2/logger.h for ppc64: #include  */
    +/* begin file generic/stage2/logger.h for ppc64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_LOGGER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_LOGGER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +
    +// This is for an internal-only stage 2 specific logger.
    +// Set LOG_ENABLED = true to log what stage 2 is doing!
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +namespace logger {
    +
    +  static constexpr const char * DASHES = "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------";
    +
    +#if SIMDJSON_VERBOSE_LOGGING
    +  static constexpr const bool LOG_ENABLED = true;
    +#else
    +  static constexpr const bool LOG_ENABLED = false;
    +#endif
    +  static constexpr const int LOG_EVENT_LEN = 20;
    +  static constexpr const int LOG_BUFFER_LEN = 30;
    +  static constexpr const int LOG_SMALL_BUFFER_LEN = 10;
    +  static constexpr const int LOG_INDEX_LEN = 5;
    +
    +  static int log_depth; // Not threadsafe. Log only.
    +
    +  // Helper to turn unprintable or newline characters into spaces
    +  static simdjson_inline char printable_char(char c) {
    +    if (c >= 0x20) {
    +      return c;
    +    } else {
    +      return ' ';
    +    }
    +  }
    +
    +  // Print the header and set up log_start
    +  static simdjson_inline void log_start() {
    +    if (LOG_ENABLED) {
    +      log_depth = 0;
    +      printf("\n");
    +      printf("| %-*s | %-*s | %-*s | %-*s | Detail |\n", LOG_EVENT_LEN, "Event", LOG_BUFFER_LEN, "Buffer", LOG_SMALL_BUFFER_LEN, "Next", 5, "Next#");
    +      printf("|%.*s|%.*s|%.*s|%.*s|--------|\n", LOG_EVENT_LEN+2, DASHES, LOG_BUFFER_LEN+2, DASHES, LOG_SMALL_BUFFER_LEN+2, DASHES, 5+2, DASHES);
    +    }
    +  }
    +
    +  simdjson_unused static simdjson_inline void log_string(const char *message) {
    +    if (LOG_ENABLED) {
    +      printf("%s\n", message);
    +    }
    +  }
    +
    +  // Logs a single line from the stage 2 DOM parser
    +  template
    +  static simdjson_inline void log_line(S &structurals, const char *title_prefix, const char *title, const char *detail) {
    +    if (LOG_ENABLED) {
    +      printf("| %*s%s%-*s ", log_depth*2, "", title_prefix, LOG_EVENT_LEN - log_depth*2 - int(strlen(title_prefix)), title);
    +      auto current_index = structurals.at_beginning() ? nullptr : structurals.next_structural-1;
    +      auto next_index = structurals.next_structural;
    +      auto current = current_index ? &structurals.buf[*current_index] : reinterpret_cast("                                                       ");
    +      auto next = &structurals.buf[*next_index];
    +      {
    +        // Print the next N characters in the buffer.
    +        printf("| ");
    +        // Otherwise, print the characters starting from the buffer position.
    +        // Print spaces for unprintable or newline characters.
    +        for (int i=0;i */
    +/* begin file generic/stage2/json_iterator.h for ppc64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +namespace stage2 {
    +
    +class json_iterator {
    +public:
    +  const uint8_t* const buf;
    +  uint32_t *next_structural;
    +  dom_parser_implementation &dom_parser;
    +  uint32_t depth{0};
    +
    +  /**
    +   * Walk the JSON document.
    +   *
    +   * The visitor receives callbacks when values are encountered. All callbacks pass the iterator as
    +   * the first parameter; some callbacks have other parameters as well:
    +   *
    +   * - visit_document_start() - at the beginning.
    +   * - visit_document_end() - at the end (if things were successful).
    +   *
    +   * - visit_array_start() - at the start `[` of a non-empty array.
    +   * - visit_array_end() - at the end `]` of a non-empty array.
    +   * - visit_empty_array() - when an empty array is encountered.
    +   *
    +   * - visit_object_end() - at the start `]` of a non-empty object.
    +   * - visit_object_start() - at the end `]` of a non-empty object.
    +   * - visit_empty_object() - when an empty object is encountered.
    +   * - visit_key(const uint8_t *key) - when a key in an object field is encountered. key is
    +   *                                   guaranteed to point at the first quote of the string (`"key"`).
    +   * - visit_primitive(const uint8_t *value) - when a value is a string, number, boolean or null.
    +   * - visit_root_primitive(iter, uint8_t *value) - when the top-level value is a string, number, boolean or null.
    +   *
    +   * - increment_count(iter) - each time a value is found in an array or object.
    +   */
    +  template
    +  simdjson_warn_unused simdjson_inline error_code walk_document(V &visitor) noexcept;
    +
    +  /**
    +   * Create an iterator capable of walking a JSON document.
    +   *
    +   * The document must have already passed through stage 1.
    +   */
    +  simdjson_inline json_iterator(dom_parser_implementation &_dom_parser, size_t start_structural_index);
    +
    +  /**
    +   * Look at the next token.
    +   *
    +   * Tokens can be strings, numbers, booleans, null, or operators (`[{]},:`)).
    +   *
    +   * They may include invalid JSON as well (such as `1.2.3` or `ture`).
    +   */
    +  simdjson_inline const uint8_t *peek() const noexcept;
    +  /**
    +   * Advance to the next token.
    +   *
    +   * Tokens can be strings, numbers, booleans, null, or operators (`[{]},:`)).
    +   *
    +   * They may include invalid JSON as well (such as `1.2.3` or `ture`).
    +   */
    +  simdjson_inline const uint8_t *advance() noexcept;
    +  /**
    +   * Get the remaining length of the document, from the start of the current token.
    +   */
    +  simdjson_inline size_t remaining_len() const noexcept;
    +  /**
    +   * Check if we are at the end of the document.
    +   *
    +   * If this is true, there are no more tokens.
    +   */
    +  simdjson_inline bool at_eof() const noexcept;
    +  /**
    +   * Check if we are at the beginning of the document.
    +   */
    +  simdjson_inline bool at_beginning() const noexcept;
    +  simdjson_inline uint8_t last_structural() const noexcept;
    +
    +  /**
    +   * Log that a value has been found.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_value(const char *type) const noexcept;
    +  /**
    +   * Log the start of a multipart value.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_start_value(const char *type) const noexcept;
    +  /**
    +   * Log the end of a multipart value.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_end_value(const char *type) const noexcept;
    +  /**
    +   * Log an error.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_error(const char *error) const noexcept;
    +
    +  template
    +  simdjson_warn_unused simdjson_inline error_code visit_root_primitive(V &visitor, const uint8_t *value) noexcept;
    +  template
    +  simdjson_warn_unused simdjson_inline error_code visit_primitive(V &visitor, const uint8_t *value) noexcept;
    +};
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code json_iterator::walk_document(V &visitor) noexcept {
    +  logger::log_start();
    +
    +  //
    +  // Start the document
    +  //
    +  if (at_eof()) { return EMPTY; }
    +  log_start_value("document");
    +  SIMDJSON_TRY( visitor.visit_document_start(*this) );
    +
    +  //
    +  // Read first value
    +  //
    +  {
    +    auto value = advance();
    +
    +    // Make sure the outer object or array is closed before continuing; otherwise, there are ways we
    +    // could get into memory corruption. See https://github.com/simdjson/simdjson/issues/906
    +    if (!STREAMING) {
    +      switch (*value) {
    +        case '{': if (last_structural() != '}') { log_value("starting brace unmatched"); return TAPE_ERROR; }; break;
    +        case '[': if (last_structural() != ']') { log_value("starting bracket unmatched"); return TAPE_ERROR; }; break;
    +      }
    +    }
    +
    +    switch (*value) {
    +      case '{': if (*peek() == '}') { advance(); log_value("empty object"); SIMDJSON_TRY( visitor.visit_empty_object(*this) ); break; } goto object_begin;
    +      case '[': if (*peek() == ']') { advance(); log_value("empty array"); SIMDJSON_TRY( visitor.visit_empty_array(*this) ); break; } goto array_begin;
    +      default: SIMDJSON_TRY( visitor.visit_root_primitive(*this, value) ); break;
    +    }
    +  }
    +  goto document_end;
    +
    +//
    +// Object parser states
    +//
    +object_begin:
    +  log_start_value("object");
    +  depth++;
    +  if (depth >= dom_parser.max_depth()) { log_error("Exceeded max depth!"); return DEPTH_ERROR; }
    +  dom_parser.is_array[depth] = false;
    +  SIMDJSON_TRY( visitor.visit_object_start(*this) );
    +
    +  {
    +    auto key = advance();
    +    if (*key != '"') { log_error("Object does not start with a key"); return TAPE_ERROR; }
    +    SIMDJSON_TRY( visitor.increment_count(*this) );
    +    SIMDJSON_TRY( visitor.visit_key(*this, key) );
    +  }
    +
    +object_field:
    +  if (simdjson_unlikely( *advance() != ':' )) { log_error("Missing colon after key in object"); return TAPE_ERROR; }
    +  {
    +    auto value = advance();
    +    switch (*value) {
    +      case '{': if (*peek() == '}') { advance(); log_value("empty object"); SIMDJSON_TRY( visitor.visit_empty_object(*this) ); break; } goto object_begin;
    +      case '[': if (*peek() == ']') { advance(); log_value("empty array"); SIMDJSON_TRY( visitor.visit_empty_array(*this) ); break; } goto array_begin;
    +      default: SIMDJSON_TRY( visitor.visit_primitive(*this, value) ); break;
    +    }
    +  }
    +
    +object_continue:
    +  switch (*advance()) {
    +    case ',':
    +      SIMDJSON_TRY( visitor.increment_count(*this) );
    +      {
    +        auto key = advance();
    +        if (simdjson_unlikely( *key != '"' )) { log_error("Key string missing at beginning of field in object"); return TAPE_ERROR; }
    +        SIMDJSON_TRY( visitor.visit_key(*this, key) );
    +      }
    +      goto object_field;
    +    case '}': log_end_value("object"); SIMDJSON_TRY( visitor.visit_object_end(*this) ); goto scope_end;
    +    default: log_error("No comma between object fields"); return TAPE_ERROR;
    +  }
    +
    +scope_end:
    +  depth--;
    +  if (depth == 0) { goto document_end; }
    +  if (dom_parser.is_array[depth]) { goto array_continue; }
    +  goto object_continue;
    +
    +//
    +// Array parser states
    +//
    +array_begin:
    +  log_start_value("array");
    +  depth++;
    +  if (depth >= dom_parser.max_depth()) { log_error("Exceeded max depth!"); return DEPTH_ERROR; }
    +  dom_parser.is_array[depth] = true;
    +  SIMDJSON_TRY( visitor.visit_array_start(*this) );
    +  SIMDJSON_TRY( visitor.increment_count(*this) );
    +
    +array_value:
    +  {
    +    auto value = advance();
    +    switch (*value) {
    +      case '{': if (*peek() == '}') { advance(); log_value("empty object"); SIMDJSON_TRY( visitor.visit_empty_object(*this) ); break; } goto object_begin;
    +      case '[': if (*peek() == ']') { advance(); log_value("empty array"); SIMDJSON_TRY( visitor.visit_empty_array(*this) ); break; } goto array_begin;
    +      default: SIMDJSON_TRY( visitor.visit_primitive(*this, value) ); break;
    +    }
    +  }
    +
    +array_continue:
    +  switch (*advance()) {
    +    case ',': SIMDJSON_TRY( visitor.increment_count(*this) ); goto array_value;
    +    case ']': log_end_value("array"); SIMDJSON_TRY( visitor.visit_array_end(*this) ); goto scope_end;
    +    default: log_error("Missing comma between array values"); return TAPE_ERROR;
    +  }
    +
    +document_end:
    +  log_end_value("document");
    +  SIMDJSON_TRY( visitor.visit_document_end(*this) );
    +
    +  dom_parser.next_structural_index = uint32_t(next_structural - &dom_parser.structural_indexes[0]);
    +
    +  // If we didn't make it to the end, it's an error
    +  if ( !STREAMING && dom_parser.next_structural_index != dom_parser.n_structural_indexes ) {
    +    log_error("More than one JSON value at the root of the document, or extra characters at the end of the JSON!");
    +    return TAPE_ERROR;
    +  }
    +
    +  return SUCCESS;
    +
    +} // walk_document()
    +
    +simdjson_inline json_iterator::json_iterator(dom_parser_implementation &_dom_parser, size_t start_structural_index)
    +  : buf{_dom_parser.buf},
    +    next_structural{&_dom_parser.structural_indexes[start_structural_index]},
    +    dom_parser{_dom_parser} {
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::peek() const noexcept {
    +  return &buf[*(next_structural)];
    +}
    +simdjson_inline const uint8_t *json_iterator::advance() noexcept {
    +  return &buf[*(next_structural++)];
    +}
    +simdjson_inline size_t json_iterator::remaining_len() const noexcept {
    +  return dom_parser.len - *(next_structural-1);
    +}
    +
    +simdjson_inline bool json_iterator::at_eof() const noexcept {
    +  return next_structural == &dom_parser.structural_indexes[dom_parser.n_structural_indexes];
    +}
    +simdjson_inline bool json_iterator::at_beginning() const noexcept {
    +  return next_structural == dom_parser.structural_indexes.get();
    +}
    +simdjson_inline uint8_t json_iterator::last_structural() const noexcept {
    +  return buf[dom_parser.structural_indexes[dom_parser.n_structural_indexes - 1]];
    +}
    +
    +simdjson_inline void json_iterator::log_value(const char *type) const noexcept {
    +  logger::log_line(*this, "", type, "");
    +}
    +
    +simdjson_inline void json_iterator::log_start_value(const char *type) const noexcept {
    +  logger::log_line(*this, "+", type, "");
    +  if (logger::LOG_ENABLED) { logger::log_depth++; }
    +}
    +
    +simdjson_inline void json_iterator::log_end_value(const char *type) const noexcept {
    +  if (logger::LOG_ENABLED) { logger::log_depth--; }
    +  logger::log_line(*this, "-", type, "");
    +}
    +
    +simdjson_inline void json_iterator::log_error(const char *error) const noexcept {
    +  logger::log_line(*this, "", "ERROR", error);
    +}
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code json_iterator::visit_root_primitive(V &visitor, const uint8_t *value) noexcept {
    +  switch (*value) {
    +    case '"': return visitor.visit_root_string(*this, value);
    +    case 't': return visitor.visit_root_true_atom(*this, value);
    +    case 'f': return visitor.visit_root_false_atom(*this, value);
    +    case 'n': return visitor.visit_root_null_atom(*this, value);
    +    case '-':
    +    case '0': case '1': case '2': case '3': case '4':
    +    case '5': case '6': case '7': case '8': case '9':
    +      return visitor.visit_root_number(*this, value);
    +    default:
    +      log_error("Document starts with a non-value character");
    +      return TAPE_ERROR;
    +  }
    +}
    +template
    +simdjson_warn_unused simdjson_inline error_code json_iterator::visit_primitive(V &visitor, const uint8_t *value) noexcept {
    +  // Use the fact that most scalars are going to be either strings or numbers.
    +  if(*value == '"') {
    +    return visitor.visit_string(*this, value);
    +  } else if (((*value - '0')  < 10) || (*value == '-')) {
    +    return visitor.visit_number(*this, value);
    +  }
    +  // true, false, null are uncommon.
    +  switch (*value) {
    +    case 't': return visitor.visit_true_atom(*this, value);
    +    case 'f': return visitor.visit_false_atom(*this, value);
    +    case 'n': return visitor.visit_null_atom(*this, value);
    +    default:
    +      log_error("Non-value found when value was expected!");
    +      return TAPE_ERROR;
    +  }
    +}
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H
    +/* end file generic/stage2/json_iterator.h for ppc64 */
    +/* including generic/stage2/stringparsing.h for ppc64: #include  */
    +/* begin file generic/stage2/stringparsing.h for ppc64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This file contains the common code every implementation uses
    +// It is intended to be included multiple times and compiled multiple times
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +/// @private
    +namespace stringparsing {
    +
    +// begin copypasta
    +// These chars yield themselves: " \ /
    +// b -> backspace, f -> formfeed, n -> newline, r -> cr, t -> horizontal tab
    +// u not handled in this table as it's complex
    +static const uint8_t escape_map[256] = {
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0, // 0x0.
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0x22, 0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0x2f,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0, // 0x4.
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0x5c, 0, 0,    0, // 0x5.
    +    0, 0, 0x08, 0, 0,    0, 0x0c, 0, 0, 0, 0, 0, 0,    0, 0x0a, 0, // 0x6.
    +    0, 0, 0x0d, 0, 0x09, 0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0, // 0x7.
    +
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +};
    +
    +// handle a unicode codepoint
    +// write appropriate values into dest
    +// src will advance 6 bytes or 12 bytes
    +// dest will advance a variable amount (return via pointer)
    +// return true if the unicode codepoint was valid
    +// We work in little-endian then swap at write time
    +simdjson_warn_unused
    +simdjson_inline bool handle_unicode_codepoint(const uint8_t **src_ptr,
    +                                            uint8_t **dst_ptr, bool allow_replacement) {
    +  // Use the default Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD)
    +  constexpr uint32_t substitution_code_point = 0xfffd;
    +  // jsoncharutils::hex_to_u32_nocheck fills high 16 bits of the return value with 1s if the
    +  // conversion isn't valid; we defer the check for this to inside the
    +  // multilingual plane check
    +  uint32_t code_point = jsoncharutils::hex_to_u32_nocheck(*src_ptr + 2);
    +  *src_ptr += 6;
    +
    +  // If we found a high surrogate, we must
    +  // check for low surrogate for characters
    +  // outside the Basic
    +  // Multilingual Plane.
    +  if (code_point >= 0xd800 && code_point < 0xdc00) {
    +    const uint8_t *src_data = *src_ptr;
    +    /* Compiler optimizations convert this to a single 16-bit load and compare on most platforms */
    +    if (((src_data[0] << 8) | src_data[1]) != ((static_cast ('\\') << 8) | static_cast ('u'))) {
    +      if(!allow_replacement) { return false; }
    +      code_point = substitution_code_point;
    +    } else {
    +      uint32_t code_point_2 = jsoncharutils::hex_to_u32_nocheck(src_data + 2);
    +
    +      // We have already checked that the high surrogate is valid and
    +      // (code_point - 0xd800) < 1024.
    +      //
    +      // Check that code_point_2 is in the range 0xdc00..0xdfff
    +      // and that code_point_2 was parsed from valid hex.
    +      uint32_t low_bit = code_point_2 - 0xdc00;
    +      if (low_bit >> 10) {
    +        if(!allow_replacement) { return false; }
    +        code_point = substitution_code_point;
    +      } else {
    +        code_point =  (((code_point - 0xd800) << 10) | low_bit) + 0x10000;
    +        *src_ptr += 6;
    +      }
    +
    +    }
    +  } else if (code_point >= 0xdc00 && code_point <= 0xdfff) {
    +      // If we encounter a low surrogate (not preceded by a high surrogate)
    +      // then we have an error.
    +      if(!allow_replacement) { return false; }
    +      code_point = substitution_code_point;
    +  }
    +  size_t offset = jsoncharutils::codepoint_to_utf8(code_point, *dst_ptr);
    +  *dst_ptr += offset;
    +  return offset > 0;
    +}
    +
    +
    +// handle a unicode codepoint using the wobbly convention
    +// https://simonsapin.github.io/wtf-8/
    +// write appropriate values into dest
    +// src will advance 6 bytes or 12 bytes
    +// dest will advance a variable amount (return via pointer)
    +// return true if the unicode codepoint was valid
    +// We work in little-endian then swap at write time
    +simdjson_warn_unused
    +simdjson_inline bool handle_unicode_codepoint_wobbly(const uint8_t **src_ptr,
    +                                            uint8_t **dst_ptr) {
    +  // It is not ideal that this function is nearly identical to handle_unicode_codepoint.
    +  //
    +  // jsoncharutils::hex_to_u32_nocheck fills high 16 bits of the return value with 1s if the
    +  // conversion isn't valid; we defer the check for this to inside the
    +  // multilingual plane check
    +  uint32_t code_point = jsoncharutils::hex_to_u32_nocheck(*src_ptr + 2);
    +  *src_ptr += 6;
    +  // If we found a high surrogate, we must
    +  // check for low surrogate for characters
    +  // outside the Basic
    +  // Multilingual Plane.
    +  if (code_point >= 0xd800 && code_point < 0xdc00) {
    +    const uint8_t *src_data = *src_ptr;
    +    /* Compiler optimizations convert this to a single 16-bit load and compare on most platforms */
    +    if (((src_data[0] << 8) | src_data[1]) == ((static_cast ('\\') << 8) | static_cast ('u'))) {
    +      uint32_t code_point_2 = jsoncharutils::hex_to_u32_nocheck(src_data + 2);
    +      uint32_t low_bit = code_point_2 - 0xdc00;
    +      if ((low_bit >> 10) ==  0) {
    +        code_point =
    +          (((code_point - 0xd800) << 10) | low_bit) + 0x10000;
    +        *src_ptr += 6;
    +      }
    +    }
    +  }
    +
    +  size_t offset = jsoncharutils::codepoint_to_utf8(code_point, *dst_ptr);
    +  *dst_ptr += offset;
    +  return offset > 0;
    +}
    +
    +
    +/**
    + * Unescape a valid UTF-8 string from src to dst, stopping at a final unescaped quote. There
    + * must be an unescaped quote terminating the string. It returns the final output
    + * position as pointer. In case of error (e.g., the string has bad escaped codes),
    + * then null_nullptrptr is returned. It is assumed that the output buffer is large
    + * enough. E.g., if src points at 'joe"', then dst needs to have four free bytes +
    + * SIMDJSON_PADDING bytes.
    + */
    +simdjson_warn_unused simdjson_inline uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) {
    +  while (1) {
    +    // Copy the next n bytes, and find the backslash and quote in them.
    +    auto bs_quote = backslash_and_quote::copy_and_find(src, dst);
    +    // If the next thing is the end quote, copy and return
    +    if (bs_quote.has_quote_first()) {
    +      // we encountered quotes first. Move dst to point to quotes and exit
    +      return dst + bs_quote.quote_index();
    +    }
    +    if (bs_quote.has_backslash()) {
    +      /* find out where the backspace is */
    +      auto bs_dist = bs_quote.backslash_index();
    +      uint8_t escape_char = src[bs_dist + 1];
    +      /* we encountered backslash first. Handle backslash */
    +      if (escape_char == 'u') {
    +        /* move src/dst up to the start; they will be further adjusted
    +           within the unicode codepoint handling code. */
    +        src += bs_dist;
    +        dst += bs_dist;
    +        if (!handle_unicode_codepoint(&src, &dst, allow_replacement)) {
    +          return nullptr;
    +        }
    +      } else {
    +        /* simple 1:1 conversion. Will eat bs_dist+2 characters in input and
    +         * write bs_dist+1 characters to output
    +         * note this may reach beyond the part of the buffer we've actually
    +         * seen. I think this is ok */
    +        uint8_t escape_result = escape_map[escape_char];
    +        if (escape_result == 0u) {
    +          return nullptr; /* bogus escape value is an error */
    +        }
    +        dst[bs_dist] = escape_result;
    +        src += bs_dist + 2;
    +        dst += bs_dist + 1;
    +      }
    +    } else {
    +      /* they are the same. Since they can't co-occur, it means we
    +       * encountered neither. */
    +      src += backslash_and_quote::BYTES_PROCESSED;
    +      dst += backslash_and_quote::BYTES_PROCESSED;
    +    }
    +  }
    +}
    +
    +simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) {
    +  // It is not ideal that this function is nearly identical to parse_string.
    +  while (1) {
    +    // Copy the next n bytes, and find the backslash and quote in them.
    +    auto bs_quote = backslash_and_quote::copy_and_find(src, dst);
    +    // If the next thing is the end quote, copy and return
    +    if (bs_quote.has_quote_first()) {
    +      // we encountered quotes first. Move dst to point to quotes and exit
    +      return dst + bs_quote.quote_index();
    +    }
    +    if (bs_quote.has_backslash()) {
    +      /* find out where the backspace is */
    +      auto bs_dist = bs_quote.backslash_index();
    +      uint8_t escape_char = src[bs_dist + 1];
    +      /* we encountered backslash first. Handle backslash */
    +      if (escape_char == 'u') {
    +        /* move src/dst up to the start; they will be further adjusted
    +           within the unicode codepoint handling code. */
    +        src += bs_dist;
    +        dst += bs_dist;
    +        if (!handle_unicode_codepoint_wobbly(&src, &dst)) {
    +          return nullptr;
    +        }
    +      } else {
    +        /* simple 1:1 conversion. Will eat bs_dist+2 characters in input and
    +         * write bs_dist+1 characters to output
    +         * note this may reach beyond the part of the buffer we've actually
    +         * seen. I think this is ok */
    +        uint8_t escape_result = escape_map[escape_char];
    +        if (escape_result == 0u) {
    +          return nullptr; /* bogus escape value is an error */
    +        }
    +        dst[bs_dist] = escape_result;
    +        src += bs_dist + 2;
    +        dst += bs_dist + 1;
    +      }
    +    } else {
    +      /* they are the same. Since they can't co-occur, it means we
    +       * encountered neither. */
    +      src += backslash_and_quote::BYTES_PROCESSED;
    +      dst += backslash_and_quote::BYTES_PROCESSED;
    +    }
    +  }
    +}
    +
    +} // namespace stringparsing
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H
    +/* end file generic/stage2/stringparsing.h for ppc64 */
    +/* including generic/stage2/structural_iterator.h for ppc64: #include  */
    +/* begin file generic/stage2/structural_iterator.h for ppc64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRUCTURAL_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_STRUCTURAL_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +namespace stage2 {
    +
    +class structural_iterator {
    +public:
    +  const uint8_t* const buf;
    +  uint32_t *next_structural;
    +  dom_parser_implementation &dom_parser;
    +
    +  // Start a structural
    +  simdjson_inline structural_iterator(dom_parser_implementation &_dom_parser, size_t start_structural_index)
    +    : buf{_dom_parser.buf},
    +      next_structural{&_dom_parser.structural_indexes[start_structural_index]},
    +      dom_parser{_dom_parser} {
    +  }
    +  // Get the buffer position of the current structural character
    +  simdjson_inline const uint8_t* current() {
    +    return &buf[*(next_structural-1)];
    +  }
    +  // Get the current structural character
    +  simdjson_inline char current_char() {
    +    return buf[*(next_structural-1)];
    +  }
    +  // Get the next structural character without advancing
    +  simdjson_inline char peek_next_char() {
    +    return buf[*next_structural];
    +  }
    +  simdjson_inline const uint8_t* peek() {
    +    return &buf[*next_structural];
    +  }
    +  simdjson_inline const uint8_t* advance() {
    +    return &buf[*(next_structural++)];
    +  }
    +  simdjson_inline char advance_char() {
    +    return buf[*(next_structural++)];
    +  }
    +  simdjson_inline size_t remaining_len() {
    +    return dom_parser.len - *(next_structural-1);
    +  }
    +
    +  simdjson_inline bool at_end() {
    +    return next_structural == &dom_parser.structural_indexes[dom_parser.n_structural_indexes];
    +  }
    +  simdjson_inline bool at_beginning() {
    +    return next_structural == dom_parser.structural_indexes.get();
    +  }
    +};
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_STRUCTURAL_ITERATOR_H
    +/* end file generic/stage2/structural_iterator.h for ppc64 */
    +/* including generic/stage2/tape_builder.h for ppc64: #include  */
    +/* begin file generic/stage2/tape_builder.h for ppc64 */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +namespace stage2 {
    +
    +struct tape_builder {
    +  template
    +  simdjson_warn_unused static simdjson_inline error_code parse_document(
    +    dom_parser_implementation &dom_parser,
    +    dom::document &doc) noexcept;
    +
    +  /** Called when a non-empty document starts. */
    +  simdjson_warn_unused simdjson_inline error_code visit_document_start(json_iterator &iter) noexcept;
    +  /** Called when a non-empty document ends without error. */
    +  simdjson_warn_unused simdjson_inline error_code visit_document_end(json_iterator &iter) noexcept;
    +
    +  /** Called when a non-empty array starts. */
    +  simdjson_warn_unused simdjson_inline error_code visit_array_start(json_iterator &iter) noexcept;
    +  /** Called when a non-empty array ends. */
    +  simdjson_warn_unused simdjson_inline error_code visit_array_end(json_iterator &iter) noexcept;
    +  /** Called when an empty array is found. */
    +  simdjson_warn_unused simdjson_inline error_code visit_empty_array(json_iterator &iter) noexcept;
    +
    +  /** Called when a non-empty object starts. */
    +  simdjson_warn_unused simdjson_inline error_code visit_object_start(json_iterator &iter) noexcept;
    +  /**
    +   * Called when a key in a field is encountered.
    +   *
    +   * primitive, visit_object_start, visit_empty_object, visit_array_start, or visit_empty_array
    +   * will be called after this with the field value.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code visit_key(json_iterator &iter, const uint8_t *key) noexcept;
    +  /** Called when a non-empty object ends. */
    +  simdjson_warn_unused simdjson_inline error_code visit_object_end(json_iterator &iter) noexcept;
    +  /** Called when an empty object is found. */
    +  simdjson_warn_unused simdjson_inline error_code visit_empty_object(json_iterator &iter) noexcept;
    +
    +  /**
    +   * Called when a string, number, boolean or null is found.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code visit_primitive(json_iterator &iter, const uint8_t *value) noexcept;
    +  /**
    +   * Called when a string, number, boolean or null is found at the top level of a document (i.e.
    +   * when there is no array or object and the entire document is a single string, number, boolean or
    +   * null.
    +   *
    +   * This is separate from primitive() because simdjson's normal primitive parsing routines assume
    +   * there is at least one more token after the value, which is only true in an array or object.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code visit_root_primitive(json_iterator &iter, const uint8_t *value) noexcept;
    +
    +  simdjson_warn_unused simdjson_inline error_code visit_string(json_iterator &iter, const uint8_t *value, bool key = false) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_number(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_true_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_false_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_null_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +
    +  simdjson_warn_unused simdjson_inline error_code visit_root_string(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_number(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_true_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_false_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_null_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +
    +  /** Called each time a new field or element in an array or object is found. */
    +  simdjson_warn_unused simdjson_inline error_code increment_count(json_iterator &iter) noexcept;
    +
    +  /** Next location to write to tape */
    +  tape_writer tape;
    +private:
    +  /** Next write location in the string buf for stage 2 parsing */
    +  uint8_t *current_string_buf_loc;
    +
    +  simdjson_inline tape_builder(dom::document &doc) noexcept;
    +
    +  simdjson_inline uint32_t next_tape_index(json_iterator &iter) const noexcept;
    +  simdjson_inline void start_container(json_iterator &iter) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code end_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code empty_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept;
    +  simdjson_inline uint8_t *on_start_string(json_iterator &iter) noexcept;
    +  simdjson_inline void on_end_string(uint8_t *dst) noexcept;
    +}; // struct tape_builder
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code tape_builder::parse_document(
    +    dom_parser_implementation &dom_parser,
    +    dom::document &doc) noexcept {
    +  dom_parser.doc = &doc;
    +  json_iterator iter(dom_parser, STREAMING ? dom_parser.next_structural_index : 0);
    +  tape_builder builder(doc);
    +  return iter.walk_document(builder);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_primitive(json_iterator &iter, const uint8_t *value) noexcept {
    +  return iter.visit_root_primitive(*this, value);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_primitive(json_iterator &iter, const uint8_t *value) noexcept {
    +  return iter.visit_primitive(*this, value);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_empty_object(json_iterator &iter) noexcept {
    +  return empty_container(iter, internal::tape_type::START_OBJECT, internal::tape_type::END_OBJECT);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_empty_array(json_iterator &iter) noexcept {
    +  return empty_container(iter, internal::tape_type::START_ARRAY, internal::tape_type::END_ARRAY);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_document_start(json_iterator &iter) noexcept {
    +  start_container(iter);
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_object_start(json_iterator &iter) noexcept {
    +  start_container(iter);
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_array_start(json_iterator &iter) noexcept {
    +  start_container(iter);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_object_end(json_iterator &iter) noexcept {
    +  return end_container(iter, internal::tape_type::START_OBJECT, internal::tape_type::END_OBJECT);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_array_end(json_iterator &iter) noexcept {
    +  return end_container(iter, internal::tape_type::START_ARRAY, internal::tape_type::END_ARRAY);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_document_end(json_iterator &iter) noexcept {
    +  constexpr uint32_t start_tape_index = 0;
    +  tape.append(start_tape_index, internal::tape_type::ROOT);
    +  tape_writer::write(iter.dom_parser.doc->tape[start_tape_index], next_tape_index(iter), internal::tape_type::ROOT);
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_key(json_iterator &iter, const uint8_t *key) noexcept {
    +  return visit_string(iter, key, true);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::increment_count(json_iterator &iter) noexcept {
    +  iter.dom_parser.open_containers[iter.depth].count++; // we have a key value pair in the object at parser.dom_parser.depth - 1
    +  return SUCCESS;
    +}
    +
    +simdjson_inline tape_builder::tape_builder(dom::document &doc) noexcept : tape{doc.tape.get()}, current_string_buf_loc{doc.string_buf.get()} {}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_string(json_iterator &iter, const uint8_t *value, bool key) noexcept {
    +  iter.log_value(key ? "key" : "string");
    +  uint8_t *dst = on_start_string(iter);
    +  dst = stringparsing::parse_string(value+1, dst, false); // We do not allow replacement when the escape characters are invalid.
    +  if (dst == nullptr) {
    +    iter.log_error("Invalid escape in string");
    +    return STRING_ERROR;
    +  }
    +  on_end_string(dst);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_string(json_iterator &iter, const uint8_t *value) noexcept {
    +  return visit_string(iter, value);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_number(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("number");
    +  return numberparsing::parse_number(value, tape);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_number(json_iterator &iter, const uint8_t *value) noexcept {
    +  //
    +  // We need to make a copy to make sure that the string is space terminated.
    +  // This is not about padding the input, which should already padded up
    +  // to len + SIMDJSON_PADDING. However, we have no control at this stage
    +  // on how the padding was done. What if the input string was padded with nulls?
    +  // It is quite common for an input string to have an extra null character (C string).
    +  // We do not want to allow 9\0 (where \0 is the null character) inside a JSON
    +  // document, but the string "9\0" by itself is fine. So we make a copy and
    +  // pad the input with spaces when we know that there is just one input element.
    +  // This copy is relatively expensive, but it will almost never be called in
    +  // practice unless you are in the strange scenario where you have many JSON
    +  // documents made of single atoms.
    +  //
    +  std::unique_ptrcopy(new (std::nothrow) uint8_t[iter.remaining_len() + SIMDJSON_PADDING]);
    +  if (copy.get() == nullptr) { return MEMALLOC; }
    +  std::memcpy(copy.get(), value, iter.remaining_len());
    +  std::memset(copy.get() + iter.remaining_len(), ' ', SIMDJSON_PADDING);
    +  error_code error = visit_number(iter, copy.get());
    +  return error;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_true_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("true");
    +  if (!atomparsing::is_valid_true_atom(value)) { return T_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::TRUE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_true_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("true");
    +  if (!atomparsing::is_valid_true_atom(value, iter.remaining_len())) { return T_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::TRUE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_false_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("false");
    +  if (!atomparsing::is_valid_false_atom(value)) { return F_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::FALSE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_false_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("false");
    +  if (!atomparsing::is_valid_false_atom(value, iter.remaining_len())) { return F_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::FALSE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_null_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("null");
    +  if (!atomparsing::is_valid_null_atom(value)) { return N_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::NULL_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_null_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("null");
    +  if (!atomparsing::is_valid_null_atom(value, iter.remaining_len())) { return N_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::NULL_VALUE);
    +  return SUCCESS;
    +}
    +
    +// private:
    +
    +simdjson_inline uint32_t tape_builder::next_tape_index(json_iterator &iter) const noexcept {
    +  return uint32_t(tape.next_tape_loc - iter.dom_parser.doc->tape.get());
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::empty_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept {
    +  auto start_index = next_tape_index(iter);
    +  tape.append(start_index+2, start);
    +  tape.append(start_index, end);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline void tape_builder::start_container(json_iterator &iter) noexcept {
    +  iter.dom_parser.open_containers[iter.depth].tape_index = next_tape_index(iter);
    +  iter.dom_parser.open_containers[iter.depth].count = 0;
    +  tape.skip(); // We don't actually *write* the start element until the end.
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::end_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept {
    +  // Write the ending tape element, pointing at the start location
    +  const uint32_t start_tape_index = iter.dom_parser.open_containers[iter.depth].tape_index;
    +  tape.append(start_tape_index, end);
    +  // Write the start tape element, pointing at the end location (and including count)
    +  // count can overflow if it exceeds 24 bits... so we saturate
    +  // the convention being that a cnt of 0xffffff or more is undetermined in value (>=  0xffffff).
    +  const uint32_t count = iter.dom_parser.open_containers[iter.depth].count;
    +  const uint32_t cntsat = count > 0xFFFFFF ? 0xFFFFFF : count;
    +  tape_writer::write(iter.dom_parser.doc->tape[start_tape_index], next_tape_index(iter) | (uint64_t(cntsat) << 32), start);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline uint8_t *tape_builder::on_start_string(json_iterator &iter) noexcept {
    +  // we advance the point, accounting for the fact that we have a NULL termination
    +  tape.append(current_string_buf_loc - iter.dom_parser.doc->string_buf.get(), internal::tape_type::STRING);
    +  return current_string_buf_loc + sizeof(uint32_t);
    +}
    +
    +simdjson_inline void tape_builder::on_end_string(uint8_t *dst) noexcept {
    +  uint32_t str_length = uint32_t(dst - (current_string_buf_loc + sizeof(uint32_t)));
    +  // TODO check for overflow in case someone has a crazy string (>=4GB?)
    +  // But only add the overflow check when the document itself exceeds 4GB
    +  // Currently unneeded because we refuse to parse docs larger or equal to 4GB.
    +  memcpy(current_string_buf_loc, &str_length, sizeof(uint32_t));
    +  // NULL termination is still handy if you expect all your strings to
    +  // be NULL terminated? It comes at a small cost
    +  *dst = 0;
    +  current_string_buf_loc = dst + 1;
    +}
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H
    +/* end file generic/stage2/tape_builder.h for ppc64 */
    +/* end file generic/stage2/amalgamated.h for ppc64 */
    +
    +//
    +// Stage 1
    +//
    +namespace simdjson {
    +namespace ppc64 {
    +
    +simdjson_warn_unused error_code implementation::create_dom_parser_implementation(
    +  size_t capacity,
    +  size_t max_depth,
    +  std::unique_ptr& dst
    +) const noexcept {
    +  dst.reset( new (std::nothrow) dom_parser_implementation() );
    +  if (!dst) { return MEMALLOC; }
    +  if (auto err = dst->set_capacity(capacity))
    +    return err;
    +  if (auto err = dst->set_max_depth(max_depth))
    +    return err;
    +  return SUCCESS;
    +}
    +
    +namespace {
    +
    +using namespace simd;
    +
    +simdjson_inline json_character_block json_character_block::classify(const simd::simd8x64& in) {
    +  const simd8 table1(16, 0, 0, 0, 0, 0, 0, 0, 0, 8, 12, 1, 2, 9, 0, 0);
    +  const simd8 table2(8, 0, 18, 4, 0, 1, 0, 1, 0, 0, 0, 3, 2, 1, 0, 0);
    +
    +  simd8x64 v(
    +     (in.chunks[0] & 0xf).lookup_16(table1) & (in.chunks[0].shr<4>()).lookup_16(table2),
    +     (in.chunks[1] & 0xf).lookup_16(table1) & (in.chunks[1].shr<4>()).lookup_16(table2),
    +     (in.chunks[2] & 0xf).lookup_16(table1) & (in.chunks[2].shr<4>()).lookup_16(table2),
    +     (in.chunks[3] & 0xf).lookup_16(table1) & (in.chunks[3].shr<4>()).lookup_16(table2)
    +  );
    +
    +  uint64_t op = simd8x64(
    +        v.chunks[0].any_bits_set(0x7),
    +        v.chunks[1].any_bits_set(0x7),
    +        v.chunks[2].any_bits_set(0x7),
    +        v.chunks[3].any_bits_set(0x7)
    +  ).to_bitmask();
    +
    +  uint64_t whitespace = simd8x64(
    +        v.chunks[0].any_bits_set(0x18),
    +        v.chunks[1].any_bits_set(0x18),
    +        v.chunks[2].any_bits_set(0x18),
    +        v.chunks[3].any_bits_set(0x18)
    +  ).to_bitmask();
    +
    +  return { whitespace, op };
    +}
    +
    +simdjson_inline bool is_ascii(const simd8x64& input) {
    +  // careful: 0x80 is not ascii.
    +  return input.reduce_or().saturating_sub(0x7fu).bits_not_set_anywhere();
    +}
    +
    +simdjson_unused simdjson_inline simd8 must_be_continuation(const simd8 prev1, const simd8 prev2, const simd8 prev3) {
    +  simd8 is_second_byte = prev1.saturating_sub(0xc0u-1); // Only 11______ will be > 0
    +  simd8 is_third_byte  = prev2.saturating_sub(0xe0u-1); // Only 111_____ will be > 0
    +  simd8 is_fourth_byte = prev3.saturating_sub(0xf0u-1); // Only 1111____ will be > 0
    +  // Caller requires a bool (all 1's). All values resulting from the subtraction will be <= 64, so signed comparison is fine.
    +  return simd8(is_second_byte | is_third_byte | is_fourth_byte) > int8_t(0);
    +}
    +
    +simdjson_inline simd8 must_be_2_3_continuation(const simd8 prev2, const simd8 prev3) {
    +  simd8 is_third_byte  = prev2.saturating_sub(0xe0u-1); // Only 111_____ will be > 0
    +  simd8 is_fourth_byte = prev3.saturating_sub(0xf0u-1); // Only 1111____ will be > 0
    +  // Caller requires a bool (all 1's). All values resulting from the subtraction will be <= 64, so signed comparison is fine.
    +  return simd8(is_third_byte | is_fourth_byte) > int8_t(0);
    +}
    +
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +//
    +// Stage 2
    +//
    +
    +//
    +// Implementation-specific overrides
    +//
    +namespace simdjson {
    +namespace ppc64 {
    +
    +simdjson_warn_unused error_code implementation::minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept {
    +  return ppc64::stage1::json_minifier::minify<64>(buf, len, dst, dst_len);
    +}
    +
    +simdjson_warn_unused error_code dom_parser_implementation::stage1(const uint8_t *_buf, size_t _len, stage1_mode streaming) noexcept {
    +  this->buf = _buf;
    +  this->len = _len;
    +  return ppc64::stage1::json_structural_indexer::index<64>(buf, len, *this, streaming);
    +}
    +
    +simdjson_warn_unused bool implementation::validate_utf8(const char *buf, size_t len) const noexcept {
    +  return ppc64::stage1::generic_validate_utf8(buf,len);
    +}
    +
    +simdjson_warn_unused error_code dom_parser_implementation::stage2(dom::document &_doc) noexcept {
    +  return stage2::tape_builder::parse_document(*this, _doc);
    +}
    +
    +simdjson_warn_unused error_code dom_parser_implementation::stage2_next(dom::document &_doc) noexcept {
    +  return stage2::tape_builder::parse_document(*this, _doc);
    +}
    +
    +simdjson_warn_unused uint8_t *dom_parser_implementation::parse_string(const uint8_t *src, uint8_t *dst, bool replacement_char) const noexcept {
    +  return ppc64::stringparsing::parse_string(src, dst, replacement_char);
    +}
    +
    +simdjson_warn_unused uint8_t *dom_parser_implementation::parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept {
    +  return ppc64::stringparsing::parse_wobbly_string(src, dst);
    +}
    +
    +simdjson_warn_unused error_code dom_parser_implementation::parse(const uint8_t *_buf, size_t _len, dom::document &_doc) noexcept {
    +  auto error = stage1(_buf, _len, stage1_mode::regular);
    +  if (error) { return error; }
    +  return stage2(_doc);
    +}
    +
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +/* including simdjson/ppc64/end.h: #include  */
    +/* begin file simdjson/ppc64/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT
    +/* undefining SIMDJSON_IMPLEMENTATION from "ppc64" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/ppc64/end.h */
    +
    +#endif // SIMDJSON_SRC_PPC64_CPP
    +/* end file ppc64.cpp */
    +#endif
    +#if SIMDJSON_IMPLEMENTATION_WESTMERE
    +/* including westmere.cpp: #include  */
    +/* begin file westmere.cpp */
    +#ifndef SIMDJSON_SRC_WESTMERE_CPP
    +#define SIMDJSON_SRC_WESTMERE_CPP
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +/* including simdjson/westmere.h: #include  */
    +/* begin file simdjson/westmere.h */
    +#ifndef SIMDJSON_WESTMERE_H
    +#define SIMDJSON_WESTMERE_H
    +
    +/* including simdjson/westmere/begin.h: #include "simdjson/westmere/begin.h" */
    +/* begin file simdjson/westmere/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "westmere" */
    +#define SIMDJSON_IMPLEMENTATION westmere
    +/* including simdjson/westmere/base.h: #include "simdjson/westmere/base.h" */
    +/* begin file simdjson/westmere/base.h */
    +#ifndef SIMDJSON_WESTMERE_BASE_H
    +#define SIMDJSON_WESTMERE_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_WESTMERE
    +namespace simdjson {
    +/**
    + * Implementation for Westmere (Intel SSE4.2).
    + */
    +namespace westmere {
    +
    +class implementation;
    +
    +namespace {
    +namespace simd {
    +
    +template  struct simd8;
    +template  struct simd8x64;
    +
    +} // namespace simd
    +} // unnamed namespace
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_BASE_H
    +/* end file simdjson/westmere/base.h */
    +/* including simdjson/westmere/intrinsics.h: #include "simdjson/westmere/intrinsics.h" */
    +/* begin file simdjson/westmere/intrinsics.h */
    +#ifndef SIMDJSON_WESTMERE_INTRINSICS_H
    +#define SIMDJSON_WESTMERE_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if SIMDJSON_VISUAL_STUDIO
    +// under clang within visual studio, this will include 
    +#include  // visual studio or clang
    +#else
    +#include  // elsewhere
    +#endif // SIMDJSON_VISUAL_STUDIO
    +
    +
    +#if SIMDJSON_CLANG_VISUAL_STUDIO
    +/**
    + * You are not supposed, normally, to include these
    + * headers directly. Instead you should either include intrin.h
    + * or x86intrin.h. However, when compiling with clang
    + * under Windows (i.e., when _MSC_VER is set), these headers
    + * only get included *if* the corresponding features are detected
    + * from macros:
    + */
    +#include   // for _mm_alignr_epi8
    +#include   // for  _mm_clmulepi64_si128
    +#endif
    +
    +static_assert(sizeof(__m128i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for westmere");
    +
    +#endif // SIMDJSON_WESTMERE_INTRINSICS_H
    +/* end file simdjson/westmere/intrinsics.h */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_WESTMERE
    +SIMDJSON_TARGET_REGION("sse4.2,pclmul,popcnt")
    +#endif
    +
    +/* including simdjson/westmere/bitmanipulation.h: #include "simdjson/westmere/bitmanipulation.h" */
    +/* begin file simdjson/westmere/bitmanipulation.h */
    +#ifndef SIMDJSON_WESTMERE_BITMANIPULATION_H
    +#define SIMDJSON_WESTMERE_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long ret;
    +  // Search the mask data from least significant bit (LSB)
    +  // to the most significant bit (MSB) for a set bit (1).
    +  _BitScanForward64(&ret, input_num);
    +  return (int)ret;
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return input_num & (input_num-1);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long leading_zero = 0;
    +  // Search the mask data from most significant bit (MSB)
    +  // to least significant bit (LSB) for a set bit (1).
    +  if (_BitScanReverse64(&leading_zero, input_num))
    +    return (int)(63 - leading_zero);
    +  else
    +    return 64;
    +#else
    +  return __builtin_clzll(input_num);
    +#endif// SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +simdjson_inline unsigned __int64 count_ones(uint64_t input_num) {
    +  // note: we do not support legacy 32-bit Windows in this kernel
    +  return __popcnt64(input_num);// Visual Studio wants two underscores
    +}
    +#else
    +simdjson_inline long long int count_ones(uint64_t input_num) {
    +  return _popcnt64(input_num);
    +}
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2,
    +                                uint64_t *result) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return _addcarry_u64(0, value1, value2,
    +                       reinterpret_cast(result));
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_BITMANIPULATION_H
    +/* end file simdjson/westmere/bitmanipulation.h */
    +/* including simdjson/westmere/bitmask.h: #include "simdjson/westmere/bitmask.h" */
    +/* begin file simdjson/westmere/bitmask.h */
    +#ifndef SIMDJSON_WESTMERE_BITMASK_H
    +#define SIMDJSON_WESTMERE_BITMASK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +
    +//
    +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered.
    +//
    +// For example, prefix_xor(00100100) == 00011100
    +//
    +simdjson_inline uint64_t prefix_xor(const uint64_t bitmask) {
    +  // There should be no such thing with a processing supporting avx2
    +  // but not clmul.
    +  __m128i all_ones = _mm_set1_epi8('\xFF');
    +  __m128i result = _mm_clmulepi64_si128(_mm_set_epi64x(0ULL, bitmask), all_ones, 0);
    +  return _mm_cvtsi128_si64(result);
    +}
    +
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_BITMASK_H
    +/* end file simdjson/westmere/bitmask.h */
    +/* including simdjson/westmere/numberparsing_defs.h: #include "simdjson/westmere/numberparsing_defs.h" */
    +/* begin file simdjson/westmere/numberparsing_defs.h */
    +#ifndef SIMDJSON_WESTMERE_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_WESTMERE_NUMBERPARSING_DEFS_H
    +
    +/* including simdjson/westmere/base.h: #include "simdjson/westmere/base.h" */
    +/* begin file simdjson/westmere/base.h */
    +#ifndef SIMDJSON_WESTMERE_BASE_H
    +#define SIMDJSON_WESTMERE_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_WESTMERE
    +namespace simdjson {
    +/**
    + * Implementation for Westmere (Intel SSE4.2).
    + */
    +namespace westmere {
    +
    +class implementation;
    +
    +namespace {
    +namespace simd {
    +
    +template  struct simd8;
    +template  struct simd8x64;
    +
    +} // namespace simd
    +} // unnamed namespace
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_BASE_H
    +/* end file simdjson/westmere/base.h */
    +/* including simdjson/westmere/intrinsics.h: #include "simdjson/westmere/intrinsics.h" */
    +/* begin file simdjson/westmere/intrinsics.h */
    +#ifndef SIMDJSON_WESTMERE_INTRINSICS_H
    +#define SIMDJSON_WESTMERE_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if SIMDJSON_VISUAL_STUDIO
    +// under clang within visual studio, this will include 
    +#include  // visual studio or clang
    +#else
    +#include  // elsewhere
    +#endif // SIMDJSON_VISUAL_STUDIO
    +
    +
    +#if SIMDJSON_CLANG_VISUAL_STUDIO
    +/**
    + * You are not supposed, normally, to include these
    + * headers directly. Instead you should either include intrin.h
    + * or x86intrin.h. However, when compiling with clang
    + * under Windows (i.e., when _MSC_VER is set), these headers
    + * only get included *if* the corresponding features are detected
    + * from macros:
    + */
    +#include   // for _mm_alignr_epi8
    +#include   // for  _mm_clmulepi64_si128
    +#endif
    +
    +static_assert(sizeof(__m128i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for westmere");
    +
    +#endif // SIMDJSON_WESTMERE_INTRINSICS_H
    +/* end file simdjson/westmere/intrinsics.h */
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace numberparsing {
    +
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  // this actually computes *16* values so we are being wasteful.
    +  const __m128i ascii0 = _mm_set1_epi8('0');
    +  const __m128i mul_1_10 =
    +      _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1);
    +  const __m128i mul_1_100 = _mm_setr_epi16(100, 1, 100, 1, 100, 1, 100, 1);
    +  const __m128i mul_1_10000 =
    +      _mm_setr_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1);
    +  const __m128i input = _mm_sub_epi8(
    +      _mm_loadu_si128(reinterpret_cast(chars)), ascii0);
    +  const __m128i t1 = _mm_maddubs_epi16(input, mul_1_10);
    +  const __m128i t2 = _mm_madd_epi16(t1, mul_1_100);
    +  const __m128i t3 = _mm_packus_epi32(t2, t2);
    +  const __m128i t4 = _mm_madd_epi16(t3, mul_1_10000);
    +  return _mm_cvtsi128_si32(
    +      t4); // only captures the sum of the first 8 digits, drop the rest
    +}
    +
    +/** @private */
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif //  SIMDJSON_WESTMERE_NUMBERPARSING_DEFS_H
    +/* end file simdjson/westmere/numberparsing_defs.h */
    +/* including simdjson/westmere/simd.h: #include "simdjson/westmere/simd.h" */
    +/* begin file simdjson/westmere/simd.h */
    +#ifndef SIMDJSON_WESTMERE_SIMD_H
    +#define SIMDJSON_WESTMERE_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace simd {
    +
    +  template
    +  struct base {
    +    __m128i value;
    +
    +    // Zero constructor
    +    simdjson_inline base() : value{__m128i()} {}
    +
    +    // Conversion from SIMD register
    +    simdjson_inline base(const __m128i _value) : value(_value) {}
    +
    +    // Conversion to SIMD register
    +    simdjson_inline operator const __m128i&() const { return this->value; }
    +    simdjson_inline operator __m128i&() { return this->value; }
    +
    +    // Bit operations
    +    simdjson_inline Child operator|(const Child other) const { return _mm_or_si128(*this, other); }
    +    simdjson_inline Child operator&(const Child other) const { return _mm_and_si128(*this, other); }
    +    simdjson_inline Child operator^(const Child other) const { return _mm_xor_si128(*this, other); }
    +    simdjson_inline Child bit_andnot(const Child other) const { return _mm_andnot_si128(other, *this); }
    +    simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast | other; return *this_cast; }
    +    simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast & other; return *this_cast; }
    +    simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast ^ other; return *this_cast; }
    +  };
    +
    +  template>
    +  struct base8: base> {
    +    typedef uint16_t bitmask_t;
    +    typedef uint32_t bitmask2_t;
    +
    +    simdjson_inline base8() : base>() {}
    +    simdjson_inline base8(const __m128i _value) : base>(_value) {}
    +
    +    friend simdjson_inline Mask operator==(const simd8 lhs, const simd8 rhs) { return _mm_cmpeq_epi8(lhs, rhs); }
    +
    +    static const int SIZE = sizeof(base>::value);
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +      return _mm_alignr_epi8(*this, prev_chunk, 16 - N);
    +    }
    +  };
    +
    +  // SIMD byte mask type (returned by things like eq and gt)
    +  template<>
    +  struct simd8: base8 {
    +    static simdjson_inline simd8 splat(bool _value) { return _mm_set1_epi8(uint8_t(-(!!_value))); }
    +
    +    simdjson_inline simd8() : base8() {}
    +    simdjson_inline simd8(const __m128i _value) : base8(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(bool _value) : base8(splat(_value)) {}
    +
    +    simdjson_inline int to_bitmask() const { return _mm_movemask_epi8(*this); }
    +    simdjson_inline bool any() const { return !_mm_testz_si128(*this, *this); }
    +    simdjson_inline simd8 operator~() const { return *this ^ true; }
    +  };
    +
    +  template
    +  struct base8_numeric: base8 {
    +    static simdjson_inline simd8 splat(T _value) { return _mm_set1_epi8(_value); }
    +    static simdjson_inline simd8 zero() { return _mm_setzero_si128(); }
    +    static simdjson_inline simd8 load(const T values[16]) {
    +      return _mm_loadu_si128(reinterpret_cast(values));
    +    }
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    static simdjson_inline simd8 repeat_16(
    +      T v0,  T v1,  T v2,  T v3,  T v4,  T v5,  T v6,  T v7,
    +      T v8,  T v9,  T v10, T v11, T v12, T v13, T v14, T v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    simdjson_inline base8_numeric() : base8() {}
    +    simdjson_inline base8_numeric(const __m128i _value) : base8(_value) {}
    +
    +    // Store to array
    +    simdjson_inline void store(T dst[16]) const { return _mm_storeu_si128(reinterpret_cast<__m128i *>(dst), *this); }
    +
    +    // Override to distinguish from bool version
    +    simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +
    +    // Addition/subtraction are the same for signed and unsigned
    +    simdjson_inline simd8 operator+(const simd8 other) const { return _mm_add_epi8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return _mm_sub_epi8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *static_cast*>(this); }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *static_cast*>(this); }
    +
    +    // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values)
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return _mm_shuffle_epi8(lookup_table, *this);
    +    }
    +
    +    // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset).
    +    // Passing a 0 value for mask would be equivalent to writing out every byte to output.
    +    // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes
    +    // get written.
    +    // Design consideration: it seems like a function with the
    +    // signature simd8 compress(uint32_t mask) would be
    +    // sensible, but the AVX ISA makes this kind of approach difficult.
    +    template
    +    simdjson_inline void compress(uint16_t mask, L * output) const {
    +      using internal::thintable_epi8;
    +      using internal::BitsSetTable256mul2;
    +      using internal::pshufb_combine_table;
    +      // this particular implementation was inspired by work done by @animetosho
    +      // we do it in two steps, first 8 bytes and then second 8 bytes
    +      uint8_t mask1 = uint8_t(mask); // least significant 8 bits
    +      uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
    +      // next line just loads the 64-bit values thintable_epi8[mask1] and
    +      // thintable_epi8[mask2] into a 128-bit register, using only
    +      // two instructions on most compilers.
    +      __m128i shufmask =  _mm_set_epi64x(thintable_epi8[mask2], thintable_epi8[mask1]);
    +      // we increment by 0x08 the second half of the mask
    +      shufmask =
    +      _mm_add_epi8(shufmask, _mm_set_epi32(0x08080808, 0x08080808, 0, 0));
    +      // this is the version "nearly pruned"
    +      __m128i pruned = _mm_shuffle_epi8(*this, shufmask);
    +      // we still need to put the two halves together.
    +      // we compute the popcount of the first half:
    +      int pop1 = BitsSetTable256mul2[mask1];
    +      // then load the corresponding mask, what it does is to write
    +      // only the first pop1 bytes from the first 8 bytes, and then
    +      // it fills in with the bytes from the second 8 bytes + some filling
    +      // at the end.
    +      __m128i compactmask =
    +      _mm_loadu_si128(reinterpret_cast(pshufb_combine_table + pop1 * 8));
    +      __m128i answer = _mm_shuffle_epi8(pruned, compactmask);
    +      _mm_storeu_si128(reinterpret_cast<__m128i *>(output), answer);
    +    }
    +
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +  };
    +
    +  // Signed bytes
    +  template<>
    +  struct simd8 : base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m128i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const int8_t* values) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) : simd8(_mm_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Order-sensitive comparisons
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm_max_epi8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm_min_epi8(*this, other); }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return _mm_cmpgt_epi8(*this, other); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return _mm_cmpgt_epi8(other, *this); }
    +  };
    +
    +  // Unsigned bytes
    +  template<>
    +  struct simd8: base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m128i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const uint8_t* values) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) : simd8(_mm_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Saturated math
    +    simdjson_inline simd8 saturating_add(const simd8 other) const { return _mm_adds_epu8(*this, other); }
    +    simdjson_inline simd8 saturating_sub(const simd8 other) const { return _mm_subs_epu8(*this, other); }
    +
    +    // Order-specific operations
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm_max_epu8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm_min_epu8(*this, other); }
    +    // Same as >, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 gt_bits(const simd8 other) const { return this->saturating_sub(other); }
    +    // Same as <, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 lt_bits(const simd8 other) const { return other.saturating_sub(*this); }
    +    simdjson_inline simd8 operator<=(const simd8 other) const { return other.max_val(*this) == other; }
    +    simdjson_inline simd8 operator>=(const simd8 other) const { return other.min_val(*this) == other; }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +
    +    // Bit-specific operations
    +    simdjson_inline simd8 bits_not_set() const { return *this == uint8_t(0); }
    +    simdjson_inline simd8 bits_not_set(simd8 bits) const { return (*this & bits).bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set() const { return ~this->bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set(simd8 bits) const { return ~this->bits_not_set(bits); }
    +    simdjson_inline bool is_ascii() const { return _mm_movemask_epi8(*this) == 0; }
    +    simdjson_inline bool bits_not_set_anywhere() const { return _mm_testz_si128(*this, *this); }
    +    simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); }
    +    simdjson_inline bool bits_not_set_anywhere(simd8 bits) const { return _mm_testz_si128(*this, bits); }
    +    simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return !bits_not_set_anywhere(bits); }
    +    template
    +    simdjson_inline simd8 shr() const { return simd8(_mm_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); }
    +    template
    +    simdjson_inline simd8 shl() const { return simd8(_mm_slli_epi16(*this, N)) & uint8_t(0xFFu << N); }
    +    // Get one of the bits and make a bitmask out of it.
    +    // e.g. value.get_bit<7>() gets the high bit
    +    template
    +    simdjson_inline int get_bit() const { return _mm_movemask_epi8(_mm_slli_epi16(*this, 7-N)); }
    +  };
    +
    +  template
    +  struct simd8x64 {
    +    static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +    static_assert(NUM_CHUNKS == 4, "Westmere kernel should use four registers per 64-byte block.");
    +    const simd8 chunks[NUM_CHUNKS];
    +
    +    simd8x64(const simd8x64& o) = delete; // no copy allowed
    +    simd8x64& operator=(const simd8& other) = delete; // no assignment allowed
    +    simd8x64() = delete; // no default constructor allowed
    +
    +    simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1, const simd8 chunk2, const simd8 chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {}
    +    simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8::load(ptr), simd8::load(ptr+16), simd8::load(ptr+32), simd8::load(ptr+48)} {}
    +
    +    simdjson_inline void store(T ptr[64]) const {
    +      this->chunks[0].store(ptr+sizeof(simd8)*0);
    +      this->chunks[1].store(ptr+sizeof(simd8)*1);
    +      this->chunks[2].store(ptr+sizeof(simd8)*2);
    +      this->chunks[3].store(ptr+sizeof(simd8)*3);
    +    }
    +
    +    simdjson_inline simd8 reduce_or() const {
    +      return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]);
    +    }
    +
    +    simdjson_inline uint64_t compress(uint64_t mask, T * output) const {
    +      this->chunks[0].compress(uint16_t(mask), output);
    +      this->chunks[1].compress(uint16_t(mask >> 16), output + 16 - count_ones(mask & 0xFFFF));
    +      this->chunks[2].compress(uint16_t(mask >> 32), output + 32 - count_ones(mask & 0xFFFFFFFF));
    +      this->chunks[3].compress(uint16_t(mask >> 48), output + 48 - count_ones(mask & 0xFFFFFFFFFFFF));
    +      return 64 - count_ones(mask);
    +    }
    +
    +    simdjson_inline uint64_t to_bitmask() const {
    +      uint64_t r0 = uint32_t(this->chunks[0].to_bitmask() );
    +      uint64_t r1 =          this->chunks[1].to_bitmask() ;
    +      uint64_t r2 =          this->chunks[2].to_bitmask() ;
    +      uint64_t r3 =          this->chunks[3].to_bitmask() ;
    +      return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48);
    +    }
    +
    +    simdjson_inline uint64_t eq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] == mask,
    +        this->chunks[1] == mask,
    +        this->chunks[2] == mask,
    +        this->chunks[3] == mask
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t eq(const simd8x64 &other) const {
    +      return  simd8x64(
    +        this->chunks[0] == other.chunks[0],
    +        this->chunks[1] == other.chunks[1],
    +        this->chunks[2] == other.chunks[2],
    +        this->chunks[3] == other.chunks[3]
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t lteq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] <= mask,
    +        this->chunks[1] <= mask,
    +        this->chunks[2] <= mask,
    +        this->chunks[3] <= mask
    +      ).to_bitmask();
    +    }
    +  }; // struct simd8x64
    +
    +} // namespace simd
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_SIMD_INPUT_H
    +/* end file simdjson/westmere/simd.h */
    +/* including simdjson/westmere/stringparsing_defs.h: #include "simdjson/westmere/stringparsing_defs.h" */
    +/* begin file simdjson/westmere/stringparsing_defs.h */
    +#ifndef SIMDJSON_WESTMERE_STRINGPARSING_DEFS_H
    +#define SIMDJSON_WESTMERE_STRINGPARSING_DEFS_H
    +
    +/* including simdjson/westmere/bitmanipulation.h: #include "simdjson/westmere/bitmanipulation.h" */
    +/* begin file simdjson/westmere/bitmanipulation.h */
    +#ifndef SIMDJSON_WESTMERE_BITMANIPULATION_H
    +#define SIMDJSON_WESTMERE_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long ret;
    +  // Search the mask data from least significant bit (LSB)
    +  // to the most significant bit (MSB) for a set bit (1).
    +  _BitScanForward64(&ret, input_num);
    +  return (int)ret;
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return input_num & (input_num-1);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long leading_zero = 0;
    +  // Search the mask data from most significant bit (MSB)
    +  // to least significant bit (LSB) for a set bit (1).
    +  if (_BitScanReverse64(&leading_zero, input_num))
    +    return (int)(63 - leading_zero);
    +  else
    +    return 64;
    +#else
    +  return __builtin_clzll(input_num);
    +#endif// SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +simdjson_inline unsigned __int64 count_ones(uint64_t input_num) {
    +  // note: we do not support legacy 32-bit Windows in this kernel
    +  return __popcnt64(input_num);// Visual Studio wants two underscores
    +}
    +#else
    +simdjson_inline long long int count_ones(uint64_t input_num) {
    +  return _popcnt64(input_num);
    +}
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2,
    +                                uint64_t *result) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return _addcarry_u64(0, value1, value2,
    +                       reinterpret_cast(result));
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_BITMANIPULATION_H
    +/* end file simdjson/westmere/bitmanipulation.h */
    +/* including simdjson/westmere/simd.h: #include "simdjson/westmere/simd.h" */
    +/* begin file simdjson/westmere/simd.h */
    +#ifndef SIMDJSON_WESTMERE_SIMD_H
    +#define SIMDJSON_WESTMERE_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace simd {
    +
    +  template
    +  struct base {
    +    __m128i value;
    +
    +    // Zero constructor
    +    simdjson_inline base() : value{__m128i()} {}
    +
    +    // Conversion from SIMD register
    +    simdjson_inline base(const __m128i _value) : value(_value) {}
    +
    +    // Conversion to SIMD register
    +    simdjson_inline operator const __m128i&() const { return this->value; }
    +    simdjson_inline operator __m128i&() { return this->value; }
    +
    +    // Bit operations
    +    simdjson_inline Child operator|(const Child other) const { return _mm_or_si128(*this, other); }
    +    simdjson_inline Child operator&(const Child other) const { return _mm_and_si128(*this, other); }
    +    simdjson_inline Child operator^(const Child other) const { return _mm_xor_si128(*this, other); }
    +    simdjson_inline Child bit_andnot(const Child other) const { return _mm_andnot_si128(other, *this); }
    +    simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast | other; return *this_cast; }
    +    simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast & other; return *this_cast; }
    +    simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast ^ other; return *this_cast; }
    +  };
    +
    +  template>
    +  struct base8: base> {
    +    typedef uint16_t bitmask_t;
    +    typedef uint32_t bitmask2_t;
    +
    +    simdjson_inline base8() : base>() {}
    +    simdjson_inline base8(const __m128i _value) : base>(_value) {}
    +
    +    friend simdjson_inline Mask operator==(const simd8 lhs, const simd8 rhs) { return _mm_cmpeq_epi8(lhs, rhs); }
    +
    +    static const int SIZE = sizeof(base>::value);
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +      return _mm_alignr_epi8(*this, prev_chunk, 16 - N);
    +    }
    +  };
    +
    +  // SIMD byte mask type (returned by things like eq and gt)
    +  template<>
    +  struct simd8: base8 {
    +    static simdjson_inline simd8 splat(bool _value) { return _mm_set1_epi8(uint8_t(-(!!_value))); }
    +
    +    simdjson_inline simd8() : base8() {}
    +    simdjson_inline simd8(const __m128i _value) : base8(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(bool _value) : base8(splat(_value)) {}
    +
    +    simdjson_inline int to_bitmask() const { return _mm_movemask_epi8(*this); }
    +    simdjson_inline bool any() const { return !_mm_testz_si128(*this, *this); }
    +    simdjson_inline simd8 operator~() const { return *this ^ true; }
    +  };
    +
    +  template
    +  struct base8_numeric: base8 {
    +    static simdjson_inline simd8 splat(T _value) { return _mm_set1_epi8(_value); }
    +    static simdjson_inline simd8 zero() { return _mm_setzero_si128(); }
    +    static simdjson_inline simd8 load(const T values[16]) {
    +      return _mm_loadu_si128(reinterpret_cast(values));
    +    }
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    static simdjson_inline simd8 repeat_16(
    +      T v0,  T v1,  T v2,  T v3,  T v4,  T v5,  T v6,  T v7,
    +      T v8,  T v9,  T v10, T v11, T v12, T v13, T v14, T v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    simdjson_inline base8_numeric() : base8() {}
    +    simdjson_inline base8_numeric(const __m128i _value) : base8(_value) {}
    +
    +    // Store to array
    +    simdjson_inline void store(T dst[16]) const { return _mm_storeu_si128(reinterpret_cast<__m128i *>(dst), *this); }
    +
    +    // Override to distinguish from bool version
    +    simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +
    +    // Addition/subtraction are the same for signed and unsigned
    +    simdjson_inline simd8 operator+(const simd8 other) const { return _mm_add_epi8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return _mm_sub_epi8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *static_cast*>(this); }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *static_cast*>(this); }
    +
    +    // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values)
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return _mm_shuffle_epi8(lookup_table, *this);
    +    }
    +
    +    // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset).
    +    // Passing a 0 value for mask would be equivalent to writing out every byte to output.
    +    // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes
    +    // get written.
    +    // Design consideration: it seems like a function with the
    +    // signature simd8 compress(uint32_t mask) would be
    +    // sensible, but the AVX ISA makes this kind of approach difficult.
    +    template
    +    simdjson_inline void compress(uint16_t mask, L * output) const {
    +      using internal::thintable_epi8;
    +      using internal::BitsSetTable256mul2;
    +      using internal::pshufb_combine_table;
    +      // this particular implementation was inspired by work done by @animetosho
    +      // we do it in two steps, first 8 bytes and then second 8 bytes
    +      uint8_t mask1 = uint8_t(mask); // least significant 8 bits
    +      uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
    +      // next line just loads the 64-bit values thintable_epi8[mask1] and
    +      // thintable_epi8[mask2] into a 128-bit register, using only
    +      // two instructions on most compilers.
    +      __m128i shufmask =  _mm_set_epi64x(thintable_epi8[mask2], thintable_epi8[mask1]);
    +      // we increment by 0x08 the second half of the mask
    +      shufmask =
    +      _mm_add_epi8(shufmask, _mm_set_epi32(0x08080808, 0x08080808, 0, 0));
    +      // this is the version "nearly pruned"
    +      __m128i pruned = _mm_shuffle_epi8(*this, shufmask);
    +      // we still need to put the two halves together.
    +      // we compute the popcount of the first half:
    +      int pop1 = BitsSetTable256mul2[mask1];
    +      // then load the corresponding mask, what it does is to write
    +      // only the first pop1 bytes from the first 8 bytes, and then
    +      // it fills in with the bytes from the second 8 bytes + some filling
    +      // at the end.
    +      __m128i compactmask =
    +      _mm_loadu_si128(reinterpret_cast(pshufb_combine_table + pop1 * 8));
    +      __m128i answer = _mm_shuffle_epi8(pruned, compactmask);
    +      _mm_storeu_si128(reinterpret_cast<__m128i *>(output), answer);
    +    }
    +
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +  };
    +
    +  // Signed bytes
    +  template<>
    +  struct simd8 : base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m128i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const int8_t* values) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) : simd8(_mm_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Order-sensitive comparisons
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm_max_epi8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm_min_epi8(*this, other); }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return _mm_cmpgt_epi8(*this, other); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return _mm_cmpgt_epi8(other, *this); }
    +  };
    +
    +  // Unsigned bytes
    +  template<>
    +  struct simd8: base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m128i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const uint8_t* values) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) : simd8(_mm_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Saturated math
    +    simdjson_inline simd8 saturating_add(const simd8 other) const { return _mm_adds_epu8(*this, other); }
    +    simdjson_inline simd8 saturating_sub(const simd8 other) const { return _mm_subs_epu8(*this, other); }
    +
    +    // Order-specific operations
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm_max_epu8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm_min_epu8(*this, other); }
    +    // Same as >, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 gt_bits(const simd8 other) const { return this->saturating_sub(other); }
    +    // Same as <, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 lt_bits(const simd8 other) const { return other.saturating_sub(*this); }
    +    simdjson_inline simd8 operator<=(const simd8 other) const { return other.max_val(*this) == other; }
    +    simdjson_inline simd8 operator>=(const simd8 other) const { return other.min_val(*this) == other; }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +
    +    // Bit-specific operations
    +    simdjson_inline simd8 bits_not_set() const { return *this == uint8_t(0); }
    +    simdjson_inline simd8 bits_not_set(simd8 bits) const { return (*this & bits).bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set() const { return ~this->bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set(simd8 bits) const { return ~this->bits_not_set(bits); }
    +    simdjson_inline bool is_ascii() const { return _mm_movemask_epi8(*this) == 0; }
    +    simdjson_inline bool bits_not_set_anywhere() const { return _mm_testz_si128(*this, *this); }
    +    simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); }
    +    simdjson_inline bool bits_not_set_anywhere(simd8 bits) const { return _mm_testz_si128(*this, bits); }
    +    simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return !bits_not_set_anywhere(bits); }
    +    template
    +    simdjson_inline simd8 shr() const { return simd8(_mm_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); }
    +    template
    +    simdjson_inline simd8 shl() const { return simd8(_mm_slli_epi16(*this, N)) & uint8_t(0xFFu << N); }
    +    // Get one of the bits and make a bitmask out of it.
    +    // e.g. value.get_bit<7>() gets the high bit
    +    template
    +    simdjson_inline int get_bit() const { return _mm_movemask_epi8(_mm_slli_epi16(*this, 7-N)); }
    +  };
    +
    +  template
    +  struct simd8x64 {
    +    static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +    static_assert(NUM_CHUNKS == 4, "Westmere kernel should use four registers per 64-byte block.");
    +    const simd8 chunks[NUM_CHUNKS];
    +
    +    simd8x64(const simd8x64& o) = delete; // no copy allowed
    +    simd8x64& operator=(const simd8& other) = delete; // no assignment allowed
    +    simd8x64() = delete; // no default constructor allowed
    +
    +    simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1, const simd8 chunk2, const simd8 chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {}
    +    simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8::load(ptr), simd8::load(ptr+16), simd8::load(ptr+32), simd8::load(ptr+48)} {}
    +
    +    simdjson_inline void store(T ptr[64]) const {
    +      this->chunks[0].store(ptr+sizeof(simd8)*0);
    +      this->chunks[1].store(ptr+sizeof(simd8)*1);
    +      this->chunks[2].store(ptr+sizeof(simd8)*2);
    +      this->chunks[3].store(ptr+sizeof(simd8)*3);
    +    }
    +
    +    simdjson_inline simd8 reduce_or() const {
    +      return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]);
    +    }
    +
    +    simdjson_inline uint64_t compress(uint64_t mask, T * output) const {
    +      this->chunks[0].compress(uint16_t(mask), output);
    +      this->chunks[1].compress(uint16_t(mask >> 16), output + 16 - count_ones(mask & 0xFFFF));
    +      this->chunks[2].compress(uint16_t(mask >> 32), output + 32 - count_ones(mask & 0xFFFFFFFF));
    +      this->chunks[3].compress(uint16_t(mask >> 48), output + 48 - count_ones(mask & 0xFFFFFFFFFFFF));
    +      return 64 - count_ones(mask);
    +    }
    +
    +    simdjson_inline uint64_t to_bitmask() const {
    +      uint64_t r0 = uint32_t(this->chunks[0].to_bitmask() );
    +      uint64_t r1 =          this->chunks[1].to_bitmask() ;
    +      uint64_t r2 =          this->chunks[2].to_bitmask() ;
    +      uint64_t r3 =          this->chunks[3].to_bitmask() ;
    +      return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48);
    +    }
    +
    +    simdjson_inline uint64_t eq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] == mask,
    +        this->chunks[1] == mask,
    +        this->chunks[2] == mask,
    +        this->chunks[3] == mask
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t eq(const simd8x64 &other) const {
    +      return  simd8x64(
    +        this->chunks[0] == other.chunks[0],
    +        this->chunks[1] == other.chunks[1],
    +        this->chunks[2] == other.chunks[2],
    +        this->chunks[3] == other.chunks[3]
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t lteq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] <= mask,
    +        this->chunks[1] <= mask,
    +        this->chunks[2] <= mask,
    +        this->chunks[3] <= mask
    +      ).to_bitmask();
    +    }
    +  }; // struct simd8x64
    +
    +} // namespace simd
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_SIMD_INPUT_H
    +/* end file simdjson/westmere/simd.h */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +
    +using namespace simd;
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 32;
    +  simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; }
    +  simdjson_inline bool has_backslash() { return bs_bits != 0; }
    +  simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); }
    +  simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); }
    +
    +  uint32_t bs_bits;
    +  uint32_t quote_bits;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // this can read up to 31 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes");
    +  simd8 v0(src);
    +  simd8 v1(src + 16);
    +  v0.store(dst);
    +  v1.store(dst + 16);
    +  uint64_t bs_and_quote = simd8x64(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask();
    +  return {
    +    uint32_t(bs_and_quote),      // bs_bits
    +    uint32_t(bs_and_quote >> 32) // quote_bits
    +  };
    +}
    +
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_STRINGPARSING_DEFS_H
    +/* end file simdjson/westmere/stringparsing_defs.h */
    +/* end file simdjson/westmere/begin.h */
    +/* including simdjson/generic/amalgamated.h for westmere: #include "simdjson/generic/amalgamated.h" */
    +/* begin file simdjson/generic/amalgamated.h for westmere */
    +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_DEPENDENCIES_H)
    +#error simdjson/generic/dependencies.h must be included before simdjson/generic/amalgamated.h!
    +#endif
    +
    +/* including simdjson/generic/base.h for westmere: #include "simdjson/generic/base.h" */
    +/* begin file simdjson/generic/base.h for westmere */
    +#ifndef SIMDJSON_GENERIC_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): // If we haven't got an implementation yet, we're in the editor, editing a generic file! Just */
    +/* amalgamation skipped (editor-only): // use the most advanced one we can so the most possible stuff can be tested. */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation_detection.h" */
    +/* amalgamation skipped (editor-only): #if SIMDJSON_IMPLEMENTATION_ICELAKE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_HASWELL */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_WESTMERE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_ARM64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */
    +/* amalgamation skipped (editor-only): #else */
    +/* amalgamation skipped (editor-only): #error "All possible implementations (including fallback) have been disabled! simdjson will not run." */
    +/* amalgamation skipped (editor-only): #endif */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +
    +struct open_container;
    +class dom_parser_implementation;
    +
    +/**
    + * The type of a JSON number
    + */
    +enum class number_type {
    +    floating_point_number=1, /// a binary64 number
    +    signed_integer,          /// a signed integer that fits in a 64-bit word using two's complement
    +    unsigned_integer         /// a positive integer larger or equal to 1<<63
    +};
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_BASE_H
    +/* end file simdjson/generic/base.h for westmere */
    +/* including simdjson/generic/jsoncharutils.h for westmere: #include "simdjson/generic/jsoncharutils.h" */
    +/* begin file simdjson/generic/jsoncharutils.h for westmere */
    +#ifndef SIMDJSON_GENERIC_JSONCHARUTILS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_JSONCHARUTILS_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/jsoncharutils_tables.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace jsoncharutils {
    +
    +// return non-zero if not a structural or whitespace char
    +// zero otherwise
    +simdjson_inline uint32_t is_not_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace_negated[c];
    +}
    +
    +simdjson_inline uint32_t is_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace[c];
    +}
    +
    +// returns a value with the high 16 bits set if not valid
    +// otherwise returns the conversion of the 4 hex digits at src into the bottom
    +// 16 bits of the 32-bit return register
    +//
    +// see
    +// https://lemire.me/blog/2019/04/17/parsing-short-hexadecimal-strings-efficiently/
    +static inline uint32_t hex_to_u32_nocheck(
    +    const uint8_t *src) { // strictly speaking, static inline is a C-ism
    +  uint32_t v1 = internal::digit_to_val32[630 + src[0]];
    +  uint32_t v2 = internal::digit_to_val32[420 + src[1]];
    +  uint32_t v3 = internal::digit_to_val32[210 + src[2]];
    +  uint32_t v4 = internal::digit_to_val32[0 + src[3]];
    +  return v1 | v2 | v3 | v4;
    +}
    +
    +// given a code point cp, writes to c
    +// the utf-8 code, outputting the length in
    +// bytes, if the length is zero, the code point
    +// is invalid
    +//
    +// This can possibly be made faster using pdep
    +// and clz and table lookups, but JSON documents
    +// have few escaped code points, and the following
    +// function looks cheap.
    +//
    +// Note: we assume that surrogates are treated separately
    +//
    +simdjson_inline size_t codepoint_to_utf8(uint32_t cp, uint8_t *c) {
    +  if (cp <= 0x7F) {
    +    c[0] = uint8_t(cp);
    +    return 1; // ascii
    +  }
    +  if (cp <= 0x7FF) {
    +    c[0] = uint8_t((cp >> 6) + 192);
    +    c[1] = uint8_t((cp & 63) + 128);
    +    return 2; // universal plane
    +    //  Surrogates are treated elsewhere...
    +    //} //else if (0xd800 <= cp && cp <= 0xdfff) {
    +    //  return 0; // surrogates // could put assert here
    +  } else if (cp <= 0xFFFF) {
    +    c[0] = uint8_t((cp >> 12) + 224);
    +    c[1] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[2] = uint8_t((cp & 63) + 128);
    +    return 3;
    +  } else if (cp <= 0x10FFFF) { // if you know you have a valid code point, this
    +                               // is not needed
    +    c[0] = uint8_t((cp >> 18) + 240);
    +    c[1] = uint8_t(((cp >> 12) & 63) + 128);
    +    c[2] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[3] = uint8_t((cp & 63) + 128);
    +    return 4;
    +  }
    +  // will return 0 when the code point was too large.
    +  return 0; // bad r
    +}
    +
    +#if SIMDJSON_IS_32BITS // _umul128 for x86, arm
    +// this is a slow emulation routine for 32-bit
    +//
    +static simdjson_inline uint64_t __emulu(uint32_t x, uint32_t y) {
    +  return x * (uint64_t)y;
    +}
    +static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) {
    +  uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd);
    +  uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd);
    +  uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32));
    +  uint64_t adbc_carry = !!(adbc < ad);
    +  uint64_t lo = bd + (adbc << 32);
    +  *hi = __emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) +
    +        (adbc_carry << 32) + !!(lo < bd);
    +  return lo;
    +}
    +#endif
    +
    +} // namespace jsoncharutils
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_JSONCHARUTILS_H
    +/* end file simdjson/generic/jsoncharutils.h for westmere */
    +/* including simdjson/generic/atomparsing.h for westmere: #include "simdjson/generic/atomparsing.h" */
    +/* begin file simdjson/generic/atomparsing.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ATOMPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ATOMPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +/// @private
    +namespace atomparsing {
    +
    +// The string_to_uint32 is exclusively used to map literal strings to 32-bit values.
    +// We use memcpy instead of a pointer cast to avoid undefined behaviors since we cannot
    +// be certain that the character pointer will be properly aligned.
    +// You might think that using memcpy makes this function expensive, but you'd be wrong.
    +// All decent optimizing compilers (GCC, clang, Visual Studio) will compile string_to_uint32("false");
    +// to the compile-time constant 1936482662.
    +simdjson_inline uint32_t string_to_uint32(const char* str) { uint32_t val; std::memcpy(&val, str, sizeof(uint32_t)); return val; }
    +
    +
    +// Again in str4ncmp we use a memcpy to avoid undefined behavior. The memcpy may appear expensive.
    +// Yet all decent optimizing compilers will compile memcpy to a single instruction, just about.
    +simdjson_warn_unused
    +simdjson_inline uint32_t str4ncmp(const uint8_t *src, const char* atom) {
    +  uint32_t srcval; // we want to avoid unaligned 32-bit loads (undefined in C/C++)
    +  static_assert(sizeof(uint32_t) <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be larger than 4 bytes");
    +  std::memcpy(&srcval, src, sizeof(uint32_t));
    +  return srcval ^ string_to_uint32(atom);
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "true") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_true_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "true"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src) {
    +  return (str4ncmp(src+1, "alse") | jsoncharutils::is_not_structural_or_whitespace(src[5])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src, size_t len) {
    +  if (len > 5) { return is_valid_false_atom(src); }
    +  else if (len == 5) { return !str4ncmp(src+1, "alse"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "null") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_null_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "null"); }
    +  else { return false; }
    +}
    +
    +} // namespace atomparsing
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ATOMPARSING_H
    +/* end file simdjson/generic/atomparsing.h for westmere */
    +/* including simdjson/generic/dom_parser_implementation.h for westmere: #include "simdjson/generic/dom_parser_implementation.h" */
    +/* begin file simdjson/generic/dom_parser_implementation.h for westmere */
    +#ifndef SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +
    +// expectation: sizeof(open_container) = 64/8.
    +struct open_container {
    +  uint32_t tape_index; // where, on the tape, does the scope ([,{) begins
    +  uint32_t count; // how many elements in the scope
    +}; // struct open_container
    +
    +static_assert(sizeof(open_container) == 64/8, "Open container must be 64 bits");
    +
    +class dom_parser_implementation final : public internal::dom_parser_implementation {
    +public:
    +  /** Tape location of each open { or [ */
    +  std::unique_ptr open_containers{};
    +  /** Whether each open container is a [ or { */
    +  std::unique_ptr is_array{};
    +  /** Buffer passed to stage 1 */
    +  const uint8_t *buf{};
    +  /** Length passed to stage 1 */
    +  size_t len{0};
    +  /** Document passed to stage 2 */
    +  dom::document *doc{};
    +
    +  inline dom_parser_implementation() noexcept;
    +  inline dom_parser_implementation(dom_parser_implementation &&other) noexcept;
    +  inline dom_parser_implementation &operator=(dom_parser_implementation &&other) noexcept;
    +  dom_parser_implementation(const dom_parser_implementation &) = delete;
    +  dom_parser_implementation &operator=(const dom_parser_implementation &) = delete;
    +
    +  simdjson_warn_unused error_code parse(const uint8_t *buf, size_t len, dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage1(const uint8_t *buf, size_t len, stage1_mode partial) noexcept final;
    +  simdjson_warn_unused error_code stage2(dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage2_next(dom::document &doc) noexcept final;
    +  simdjson_warn_unused uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) const noexcept final;
    +  simdjson_warn_unused uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept final;
    +  inline simdjson_warn_unused error_code set_capacity(size_t capacity) noexcept final;
    +  inline simdjson_warn_unused error_code set_max_depth(size_t max_depth) noexcept final;
    +private:
    +  simdjson_inline simdjson_warn_unused error_code set_capacity_stage1(size_t capacity);
    +
    +};
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +namespace westmere {
    +
    +inline dom_parser_implementation::dom_parser_implementation() noexcept = default;
    +inline dom_parser_implementation::dom_parser_implementation(dom_parser_implementation &&other) noexcept = default;
    +inline dom_parser_implementation &dom_parser_implementation::operator=(dom_parser_implementation &&other) noexcept = default;
    +
    +// Leaving these here so they can be inlined if so desired
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_capacity(size_t capacity) noexcept {
    +  if(capacity > SIMDJSON_MAXSIZE_BYTES) { return CAPACITY; }
    +  // Stage 1 index output
    +  size_t max_structures = SIMDJSON_ROUNDUP_N(capacity, 64) + 2 + 7;
    +  structural_indexes.reset( new (std::nothrow) uint32_t[max_structures] );
    +  if (!structural_indexes) { _capacity = 0; return MEMALLOC; }
    +  structural_indexes[0] = 0;
    +  n_structural_indexes = 0;
    +
    +  _capacity = capacity;
    +  return SUCCESS;
    +}
    +
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_max_depth(size_t max_depth) noexcept {
    +  // Stage 2 stacks
    +  open_containers.reset(new (std::nothrow) open_container[max_depth]);
    +  is_array.reset(new (std::nothrow) bool[max_depth]);
    +  if (!is_array || !open_containers) { _max_depth = 0; return MEMALLOC; }
    +
    +  _max_depth = max_depth;
    +  return SUCCESS;
    +}
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +/* end file simdjson/generic/dom_parser_implementation.h for westmere */
    +/* including simdjson/generic/implementation_simdjson_result_base.h for westmere: #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base.h for westmere */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +
    +// This is a near copy of include/error.h's implementation_simdjson_result_base, except it doesn't use std::pair
    +// so we can avoid inlining errors
    +// TODO reconcile these!
    +/**
    + * The result of a simdjson operation that could fail.
    + *
    + * Gives the option of reading error codes, or throwing an exception by casting to the desired result.
    + *
    + * This is a base class for implementations that want to add functions to the result type for
    + * chaining.
    + *
    + * Override like:
    + *
    + *   struct simdjson_result : public internal::implementation_simdjson_result_base {
    + *     simdjson_result() noexcept : internal::implementation_simdjson_result_base() {}
    + *     simdjson_result(error_code error) noexcept : internal::implementation_simdjson_result_base(error) {}
    + *     simdjson_result(T &&value) noexcept : internal::implementation_simdjson_result_base(std::forward(value)) {}
    + *     simdjson_result(T &&value, error_code error) noexcept : internal::implementation_simdjson_result_base(value, error) {}
    + *     // Your extra methods here
    + *   }
    + *
    + * Then any method returning simdjson_result will be chainable with your methods.
    + */
    +template
    +struct implementation_simdjson_result_base {
    +
    +  /**
    +   * Create a new empty result with error = UNINITIALIZED.
    +   */
    +  simdjson_inline implementation_simdjson_result_base() noexcept = default;
    +
    +  /**
    +   * Create a new error result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(error_code error) noexcept;
    +
    +  /**
    +   * Create a new successful result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value) noexcept;
    +
    +  /**
    +   * Create a new result with both things (use if you don't want to branch when creating the result).
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value, error_code error) noexcept;
    +
    +  /**
    +   * Move the value and the error to the provided variables.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   * @param error The variable to assign the error to. Set to SUCCESS if there is no error.
    +   */
    +  simdjson_inline void tie(T &value, error_code &error) && noexcept;
    +
    +  /**
    +   * Move the value to the provided variable.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   */
    +  simdjson_inline error_code get(T &value) && noexcept;
    +
    +  /**
    +   * The error.
    +   */
    +  simdjson_inline error_code error() const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value.
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T& value() & noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& value() && noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& take_value() && noexcept(false);
    +
    +  /**
    +   * Cast to the value (will throw on error).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline operator T&&() && noexcept(false);
    +
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline const T& value_unsafe() const& noexcept;
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T& value_unsafe() & noexcept;
    +  /**
    +   * Take the result value (move it). This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T&& value_unsafe() && noexcept;
    +protected:
    +  /** users should never directly access first and second. **/
    +  T first{}; /** Users should never directly access 'first'. **/
    +  error_code second{UNINITIALIZED}; /** Users should never directly access 'second'. **/
    +}; // struct implementation_simdjson_result_base
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +/* end file simdjson/generic/implementation_simdjson_result_base.h for westmere */
    +/* including simdjson/generic/numberparsing.h for westmere: #include "simdjson/generic/numberparsing.h" */
    +/* begin file simdjson/generic/numberparsing.h for westmere */
    +#ifndef SIMDJSON_GENERIC_NUMBERPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_NUMBERPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace numberparsing {
    +
    +#ifdef JSON_TEST_NUMBERS
    +#define INVALID_NUMBER(SRC) (found_invalid_number((SRC)), NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (found_integer((VALUE), (SRC)), (WRITER).append_s64((VALUE)))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (found_unsigned_integer((VALUE), (SRC)), (WRITER).append_u64((VALUE)))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (found_float((VALUE), (SRC)), (WRITER).append_double((VALUE)))
    +#else
    +#define INVALID_NUMBER(SRC) (NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (WRITER).append_s64((VALUE))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (WRITER).append_u64((VALUE))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (WRITER).append_double((VALUE))
    +#endif
    +
    +namespace {
    +
    +// Convert a mantissa, an exponent and a sign bit into an ieee64 double.
    +// The real_exponent needs to be in [0, 2046] (technically real_exponent = 2047 would be acceptable).
    +// The mantissa should be in [0,1<<53). The bit at index (1ULL << 52) while be zeroed.
    +simdjson_inline double to_double(uint64_t mantissa, uint64_t real_exponent, bool negative) {
    +    double d;
    +    mantissa &= ~(1ULL << 52);
    +    mantissa |= real_exponent << 52;
    +    mantissa |= ((static_cast(negative)) << 63);
    +    std::memcpy(&d, &mantissa, sizeof(d));
    +    return d;
    +}
    +
    +// Attempts to compute i * 10^(power) exactly; and if "negative" is
    +// true, negate the result.
    +// This function will only work in some cases, when it does not work, success is
    +// set to false. This should work *most of the time* (like 99% of the time).
    +// We assume that power is in the [smallest_power,
    +// largest_power] interval: the caller is responsible for this check.
    +simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative, double &d) {
    +  // we start with a fast path
    +  // It was described in
    +  // Clinger WD. How to read floating point numbers accurately.
    +  // ACM SIGPLAN Notices. 1990
    +#ifndef FLT_EVAL_METHOD
    +#error "FLT_EVAL_METHOD should be defined, please include cfloat."
    +#endif
    +#if (FLT_EVAL_METHOD != 1) && (FLT_EVAL_METHOD != 0)
    +  // We cannot be certain that x/y is rounded to nearest.
    +  if (0 <= power && power <= 22 && i <= 9007199254740991)
    +#else
    +  if (-22 <= power && power <= 22 && i <= 9007199254740991)
    +#endif
    +  {
    +    // convert the integer into a double. This is lossless since
    +    // 0 <= i <= 2^53 - 1.
    +    d = double(i);
    +    //
    +    // The general idea is as follows.
    +    // If 0 <= s < 2^53 and if 10^0 <= p <= 10^22 then
    +    // 1) Both s and p can be represented exactly as 64-bit floating-point
    +    // values
    +    // (binary64).
    +    // 2) Because s and p can be represented exactly as floating-point values,
    +    // then s * p
    +    // and s / p will produce correctly rounded values.
    +    //
    +    if (power < 0) {
    +      d = d / simdjson::internal::power_of_ten[-power];
    +    } else {
    +      d = d * simdjson::internal::power_of_ten[power];
    +    }
    +    if (negative) {
    +      d = -d;
    +    }
    +    return true;
    +  }
    +  // When 22 < power && power <  22 + 16, we could
    +  // hope for another, secondary fast path.  It was
    +  // described by David M. Gay in  "Correctly rounded
    +  // binary-decimal and decimal-binary conversions." (1990)
    +  // If you need to compute i * 10^(22 + x) for x < 16,
    +  // first compute i * 10^x, if you know that result is exact
    +  // (e.g., when i * 10^x < 2^53),
    +  // then you can still proceed and do (i * 10^x) * 10^22.
    +  // Is this worth your time?
    +  // You need  22 < power *and* power <  22 + 16 *and* (i * 10^(x-22) < 2^53)
    +  // for this second fast path to work.
    +  // If you you have 22 < power *and* power <  22 + 16, and then you
    +  // optimistically compute "i * 10^(x-22)", there is still a chance that you
    +  // have wasted your time if i * 10^(x-22) >= 2^53. It makes the use cases of
    +  // this optimization maybe less common than we would like. Source:
    +  // http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/
    +  // also used in RapidJSON: https://rapidjson.org/strtod_8h_source.html
    +
    +  // The fast path has now failed, so we are failing back on the slower path.
    +
    +  // In the slow path, we need to adjust i so that it is > 1<<63 which is always
    +  // possible, except if i == 0, so we handle i == 0 separately.
    +  if(i == 0) {
    +    d = negative ? -0.0 : 0.0;
    +    return true;
    +  }
    +
    +
    +  // The exponent is 1024 + 63 + power
    +  //     + floor(log(5**power)/log(2)).
    +  // The 1024 comes from the ieee64 standard.
    +  // The 63 comes from the fact that we use a 64-bit word.
    +  //
    +  // Computing floor(log(5**power)/log(2)) could be
    +  // slow. Instead we use a fast function.
    +  //
    +  // For power in (-400,350), we have that
    +  // (((152170 + 65536) * power ) >> 16);
    +  // is equal to
    +  //  floor(log(5**power)/log(2)) + power when power >= 0
    +  // and it is equal to
    +  //  ceil(log(5**-power)/log(2)) + power when power < 0
    +  //
    +  // The 65536 is (1<<16) and corresponds to
    +  // (65536 * power) >> 16 ---> power
    +  //
    +  // ((152170 * power ) >> 16) is equal to
    +  // floor(log(5**power)/log(2))
    +  //
    +  // Note that this is not magic: 152170/(1<<16) is
    +  // approximatively equal to log(5)/log(2).
    +  // The 1<<16 value is a power of two; we could use a
    +  // larger power of 2 if we wanted to.
    +  //
    +  int64_t exponent = (((152170 + 65536) * power) >> 16) + 1024 + 63;
    +
    +
    +  // We want the most significant bit of i to be 1. Shift if needed.
    +  int lz = leading_zeroes(i);
    +  i <<= lz;
    +
    +
    +  // We are going to need to do some 64-bit arithmetic to get a precise product.
    +  // We use a table lookup approach.
    +  // It is safe because
    +  // power >= smallest_power
    +  // and power <= largest_power
    +  // We recover the mantissa of the power, it has a leading 1. It is always
    +  // rounded down.
    +  //
    +  // We want the most significant 64 bits of the product. We know
    +  // this will be non-zero because the most significant bit of i is
    +  // 1.
    +  const uint32_t index = 2 * uint32_t(power - simdjson::internal::smallest_power);
    +  // Optimization: It may be that materializing the index as a variable might confuse some compilers and prevent effective complex-addressing loads. (Done for code clarity.)
    +  //
    +  // The full_multiplication function computes the 128-bit product of two 64-bit words
    +  // with a returned value of type value128 with a "low component" corresponding to the
    +  // 64-bit least significant bits of the product and with a "high component" corresponding
    +  // to the 64-bit most significant bits of the product.
    +  simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
    +  // Both i and power_of_five_128[index] have their most significant bit set to 1 which
    +  // implies that the either the most or the second most significant bit of the product
    +  // is 1. We pack values in this manner for efficiency reasons: it maximizes the use
    +  // we make of the product. It also makes it easy to reason about the product: there
    +  // is 0 or 1 leading zero in the product.
    +
    +  // Unless the least significant 9 bits of the high (64-bit) part of the full
    +  // product are all 1s, then we know that the most significant 55 bits are
    +  // exact and no further work is needed. Having 55 bits is necessary because
    +  // we need 53 bits for the mantissa but we have to have one rounding bit and
    +  // we can waste a bit if the most significant bit of the product is zero.
    +  if((firstproduct.high & 0x1FF) == 0x1FF) {
    +    // We want to compute i * 5^q, but only care about the top 55 bits at most.
    +    // Consider the scenario where q>=0. Then 5^q may not fit in 64-bits. Doing
    +    // the full computation is wasteful. So we do what is called a "truncated
    +    // multiplication".
    +    // We take the most significant 64-bits, and we put them in
    +    // power_of_five_128[index]. Usually, that's good enough to approximate i * 5^q
    +    // to the desired approximation using one multiplication. Sometimes it does not suffice.
    +    // Then we store the next most significant 64 bits in power_of_five_128[index + 1], and
    +    // then we get a better approximation to i * 5^q.
    +    //
    +    // That's for when q>=0. The logic for q<0 is somewhat similar but it is somewhat
    +    // more complicated.
    +    //
    +    // There is an extra layer of complexity in that we need more than 55 bits of
    +    // accuracy in the round-to-even scenario.
    +    //
    +    // The full_multiplication function computes the 128-bit product of two 64-bit words
    +    // with a returned value of type value128 with a "low component" corresponding to the
    +    // 64-bit least significant bits of the product and with a "high component" corresponding
    +    // to the 64-bit most significant bits of the product.
    +    simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
    +    firstproduct.low += secondproduct.high;
    +    if(secondproduct.high > firstproduct.low) { firstproduct.high++; }
    +    // As it has been proven by Noble Mushtak and Daniel Lemire in "Fast Number Parsing Without
    +    // Fallback" (https://arxiv.org/abs/2212.06644), at this point we are sure that the product
    +    // is sufficiently accurate, and more computation is not needed.
    +  }
    +  uint64_t lower = firstproduct.low;
    +  uint64_t upper = firstproduct.high;
    +  // The final mantissa should be 53 bits with a leading 1.
    +  // We shift it so that it occupies 54 bits with a leading 1.
    +  ///////
    +  uint64_t upperbit = upper >> 63;
    +  uint64_t mantissa = upper >> (upperbit + 9);
    +  lz += int(1 ^ upperbit);
    +
    +  // Here we have mantissa < (1<<54).
    +  int64_t real_exponent = exponent - lz;
    +  if (simdjson_unlikely(real_exponent <= 0)) { // we have a subnormal?
    +    // Here have that real_exponent <= 0 so -real_exponent >= 0
    +    if(-real_exponent + 1 >= 64) { // if we have more than 64 bits below the minimum exponent, you have a zero for sure.
    +      d = negative ? -0.0 : 0.0;
    +      return true;
    +    }
    +    // next line is safe because -real_exponent + 1 < 0
    +    mantissa >>= -real_exponent + 1;
    +    // Thankfully, we can't have both "round-to-even" and subnormals because
    +    // "round-to-even" only occurs for powers close to 0.
    +    mantissa += (mantissa & 1); // round up
    +    mantissa >>= 1;
    +    // There is a weird scenario where we don't have a subnormal but just.
    +    // Suppose we start with 2.2250738585072013e-308, we end up
    +    // with 0x3fffffffffffff x 2^-1023-53 which is technically subnormal
    +    // whereas 0x40000000000000 x 2^-1023-53  is normal. Now, we need to round
    +    // up 0x3fffffffffffff x 2^-1023-53  and once we do, we are no longer
    +    // subnormal, but we can only know this after rounding.
    +    // So we only declare a subnormal if we are smaller than the threshold.
    +    real_exponent = (mantissa < (uint64_t(1) << 52)) ? 0 : 1;
    +    d = to_double(mantissa, real_exponent, negative);
    +    return true;
    +  }
    +  // We have to round to even. The "to even" part
    +  // is only a problem when we are right in between two floats
    +  // which we guard against.
    +  // If we have lots of trailing zeros, we may fall right between two
    +  // floating-point values.
    +  //
    +  // The round-to-even cases take the form of a number 2m+1 which is in (2^53,2^54]
    +  // times a power of two. That is, it is right between a number with binary significand
    +  // m and another number with binary significand m+1; and it must be the case
    +  // that it cannot be represented by a float itself.
    +  //
    +  // We must have that w * 10 ^q == (2m+1) * 2^p for some power of two 2^p.
    +  // Recall that 10^q = 5^q * 2^q.
    +  // When q >= 0, we must have that (2m+1) is divible by 5^q, so 5^q <= 2^54. We have that
    +  //  5^23 <=  2^54 and it is the last power of five to qualify, so q <= 23.
    +  // When q<0, we have  w  >=  (2m+1) x 5^{-q}.  We must have that w<2^{64} so
    +  // (2m+1) x 5^{-q} < 2^{64}. We have that 2m+1>2^{53}. Hence, we must have
    +  // 2^{53} x 5^{-q} < 2^{64}.
    +  // Hence we have 5^{-q} < 2^{11}$ or q>= -4.
    +  //
    +  // We require lower <= 1 and not lower == 0 because we could not prove that
    +  // that lower == 0 is implied; but we could prove that lower <= 1 is a necessary and sufficient test.
    +  if (simdjson_unlikely((lower <= 1) && (power >= -4) && (power <= 23) && ((mantissa & 3) == 1))) {
    +    if((mantissa  << (upperbit + 64 - 53 - 2)) ==  upper) {
    +      mantissa &= ~1;             // flip it so that we do not round up
    +    }
    +  }
    +
    +  mantissa += mantissa & 1;
    +  mantissa >>= 1;
    +
    +  // Here we have mantissa < (1<<53), unless there was an overflow
    +  if (mantissa >= (1ULL << 53)) {
    +    //////////
    +    // This will happen when parsing values such as 7.2057594037927933e+16
    +    ////////
    +    mantissa = (1ULL << 52);
    +    real_exponent++;
    +  }
    +  mantissa &= ~(1ULL << 52);
    +  // we have to check that real_exponent is in range, otherwise we bail out
    +  if (simdjson_unlikely(real_exponent > 2046)) {
    +    // We have an infinite value!!! We could actually throw an error here if we could.
    +    return false;
    +  }
    +  d = to_double(mantissa, real_exponent, negative);
    +  return true;
    +}
    +
    +// We call a fallback floating-point parser that might be slow. Note
    +// it will accept JSON numbers, but the JSON spec. is more restrictive so
    +// before you call parse_float_fallback, you need to have validated the input
    +// string with the JSON grammar.
    +// It will return an error (false) if the parsed number is infinite.
    +// The string parsing itself always succeeds. We know that there is at least
    +// one digit.
    +static bool parse_float_fallback(const uint8_t *ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +static bool parse_float_fallback(const uint8_t *ptr, const uint8_t *end_ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr), reinterpret_cast(end_ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +// check quickly whether the next 8 chars are made of digits
    +// at a glance, it looks better than Mula's
    +// http://0x80.pl/articles/swar-digits-validate.html
    +simdjson_inline bool is_made_of_eight_digits_fast(const uint8_t *chars) {
    +  uint64_t val;
    +  // this can read up to 7 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(7 <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be bigger than 7");
    +  std::memcpy(&val, chars, 8);
    +  // a branchy method might be faster:
    +  // return (( val & 0xF0F0F0F0F0F0F0F0 ) == 0x3030303030303030)
    +  //  && (( (val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0 ) ==
    +  //  0x3030303030303030);
    +  return (((val & 0xF0F0F0F0F0F0F0F0) |
    +           (((val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0) >> 4)) ==
    +          0x3333333333333333);
    +}
    +
    +template
    +SIMDJSON_NO_SANITIZE_UNDEFINED // We deliberately allow overflow here and check later
    +simdjson_inline bool parse_digit(const uint8_t c, I &i) {
    +  const uint8_t digit = static_cast(c - '0');
    +  if (digit > 9) {
    +    return false;
    +  }
    +  // PERF NOTE: multiplication by 10 is cheaper than arbitrary integer multiplication
    +  i = 10 * i + digit; // might overflow, we will handle the overflow later
    +  return true;
    +}
    +
    +simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const uint8_t *const src, const uint8_t *&p, uint64_t &i, int64_t &exponent) {
    +  // we continue with the fiction that we have an integer. If the
    +  // floating point number is representable as x * 10^z for some integer
    +  // z that fits in 53 bits, then we will be able to convert back the
    +  // the integer into a float in a lossless manner.
    +  const uint8_t *const first_after_period = p;
    +
    +#ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +#if SIMDJSON_SWAR_NUMBER_PARSING
    +  // this helps if we have lots of decimals!
    +  // this turns out to be frequent enough.
    +  if (is_made_of_eight_digits_fast(p)) {
    +    i = i * 100000000 + parse_eight_digits_unrolled(p);
    +    p += 8;
    +  }
    +#endif // SIMDJSON_SWAR_NUMBER_PARSING
    +#endif // #ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +  // Unrolling the first digit makes a small difference on some implementations (e.g. westmere)
    +  if (parse_digit(*p, i)) { ++p; }
    +  while (parse_digit(*p, i)) { p++; }
    +  exponent = first_after_period - p;
    +  // Decimal without digits (123.) is illegal
    +  if (exponent == 0) {
    +    return INVALID_NUMBER(src);
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) {
    +  // Exp Sign: -123.456e[-]78
    +  bool neg_exp = ('-' == *p);
    +  if (neg_exp || '+' == *p) { p++; } // Skip + as well
    +
    +  // Exponent: -123.456e-[78]
    +  auto start_exp = p;
    +  int64_t exp_number = 0;
    +  while (parse_digit(*p, exp_number)) { ++p; }
    +  // It is possible for parse_digit to overflow.
    +  // In particular, it could overflow to INT64_MIN, and we cannot do - INT64_MIN.
    +  // Thus we *must* check for possible overflow before we negate exp_number.
    +
    +  // Performance notes: it may seem like combining the two "simdjson_unlikely checks" below into
    +  // a single simdjson_unlikely path would be faster. The reasoning is sound, but the compiler may
    +  // not oblige and may, in fact, generate two distinct paths in any case. It might be
    +  // possible to do uint64_t(p - start_exp - 1) >= 18 but it could end up trading off
    +  // instructions for a simdjson_likely branch, an unconclusive gain.
    +
    +  // If there were no digits, it's an error.
    +  if (simdjson_unlikely(p == start_exp)) {
    +    return INVALID_NUMBER(src);
    +  }
    +  // We have a valid positive exponent in exp_number at this point, except that
    +  // it may have overflowed.
    +
    +  // If there were more than 18 digits, we may have overflowed the integer. We have to do
    +  // something!!!!
    +  if (simdjson_unlikely(p > start_exp+18)) {
    +    // Skip leading zeroes: 1e000000000000000000001 is technically valid and doesn't overflow
    +    while (*start_exp == '0') { start_exp++; }
    +    // 19 digits could overflow int64_t and is kind of absurd anyway. We don't
    +    // support exponents smaller than -999,999,999,999,999,999 and bigger
    +    // than 999,999,999,999,999,999.
    +    // We can truncate.
    +    // Note that 999999999999999999 is assuredly too large. The maximal ieee64 value before
    +    // infinity is ~1.8e308. The smallest subnormal is ~5e-324. So, actually, we could
    +    // truncate at 324.
    +    // Note that there is no reason to fail per se at this point in time.
    +    // E.g., 0e999999999999999999999 is a fine number.
    +    if (p > start_exp+18) { exp_number = 999999999999999999; }
    +  }
    +  // At this point, we know that exp_number is a sane, positive, signed integer.
    +  // It is <= 999,999,999,999,999,999. As long as 'exponent' is in
    +  // [-8223372036854775808, 8223372036854775808], we won't overflow. Because 'exponent'
    +  // is bounded in magnitude by the size of the JSON input, we are fine in this universe.
    +  // To sum it up: the next line should never overflow.
    +  exponent += (neg_exp ? -exp_number : exp_number);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline size_t significant_digits(const uint8_t * start_digits, size_t digit_count) {
    +  // It is possible that the integer had an overflow.
    +  // We have to handle the case where we have 0.0000somenumber.
    +  const uint8_t *start = start_digits;
    +  while ((*start == '0') || (*start == '.')) { ++start; }
    +  // we over-decrement by one when there is a '.'
    +  return digit_count - size_t(start - start_digits);
    +}
    +
    +} // unnamed namespace
    +
    +/** @private */
    +template
    +error_code slow_float_parsing(simdjson_unused const uint8_t * src, W writer) {
    +  double d;
    +  if (parse_float_fallback(src, &d)) {
    +    writer.append_double(d);
    +    return SUCCESS;
    +  }
    +  return INVALID_NUMBER(src);
    +}
    +
    +/** @private */
    +template
    +simdjson_inline error_code write_float(const uint8_t *const src, bool negative, uint64_t i, const uint8_t * start_digits, size_t digit_count, int64_t exponent, W &writer) {
    +  // If we frequently had to deal with long strings of digits,
    +  // we could extend our code by using a 128-bit integer instead
    +  // of a 64-bit integer. However, this is uncommon in practice.
    +  //
    +  // 9999999999999999999 < 2**64 so we can accommodate 19 digits.
    +  // If we have a decimal separator, then digit_count - 1 is the number of digits, but we
    +  // may not have a decimal separator!
    +  if (simdjson_unlikely(digit_count > 19 && significant_digits(start_digits, digit_count) > 19)) {
    +    // Ok, chances are good that we had an overflow!
    +    // this is almost never going to get called!!!
    +    // we start anew, going slowly!!!
    +    // This will happen in the following examples:
    +    // 10000000000000000000000000000000000000000000e+308
    +    // 3.1415926535897932384626433832795028841971693993751
    +    //
    +    // NOTE: This makes a *copy* of the writer and passes it to slow_float_parsing. This happens
    +    // because slow_float_parsing is a non-inlined function. If we passed our writer reference to
    +    // it, it would force it to be stored in memory, preventing the compiler from picking it apart
    +    // and putting into registers. i.e. if we pass it as reference, it gets slow.
    +    // This is what forces the skip_double, as well.
    +    error_code error = slow_float_parsing(src, writer);
    +    writer.skip_double();
    +    return error;
    +  }
    +  // NOTE: it's weird that the simdjson_unlikely() only wraps half the if, but it seems to get slower any other
    +  // way we've tried: https://github.com/simdjson/simdjson/pull/990#discussion_r448497331
    +  // To future reader: we'd love if someone found a better way, or at least could explain this result!
    +  if (simdjson_unlikely(exponent < simdjson::internal::smallest_power) || (exponent > simdjson::internal::largest_power)) {
    +    //
    +    // Important: smallest_power is such that it leads to a zero value.
    +    // Observe that 18446744073709551615e-343 == 0, i.e. (2**64 - 1) e -343 is zero
    +    // so something x 10^-343 goes to zero, but not so with  something x 10^-342.
    +    static_assert(simdjson::internal::smallest_power <= -342, "smallest_power is not small enough");
    +    //
    +    if((exponent < simdjson::internal::smallest_power) || (i == 0)) {
    +      // E.g. Parse "-0.0e-999" into the same value as "-0.0". See https://en.wikipedia.org/wiki/Signed_zero
    +      WRITE_DOUBLE(negative ? -0.0 : 0.0, src, writer);
    +      return SUCCESS;
    +    } else { // (exponent > largest_power) and (i != 0)
    +      // We have, for sure, an infinite value and simdjson refuses to parse infinite values.
    +      return INVALID_NUMBER(src);
    +    }
    +  }
    +  double d;
    +  if (!compute_float_64(exponent, i, negative, d)) {
    +    // we are almost never going to get here.
    +    if (!parse_float_fallback(src, &d)) { return INVALID_NUMBER(src); }
    +  }
    +  WRITE_DOUBLE(d, src, writer);
    +  return SUCCESS;
    +}
    +
    +// for performance analysis, it is sometimes  useful to skip parsing
    +#ifdef SIMDJSON_SKIPNUMBERPARSING
    +
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const, W &writer) {
    +  writer.append_s64(0);        // always write zero
    +  return SUCCESS;              // always succeeds
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept { return number_type::signed_integer; }
    +#else
    +
    +// parse the number at src
    +// define JSON_TEST_NUMBERS for unit testing
    +//
    +// It is assumed that the number is followed by a structural ({,},],[) character
    +// or a white space character. If that is not the case (e.g., when the JSON
    +// document is made of a single number), then it is necessary to copy the
    +// content and append a space before calling this function.
    +//
    +// Our objective is accurate parsing (ULP of 0) at high speed.
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) {
    +
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  if (digit_count == 0 || ('0' == *start_digits && digit_count > 1)) { return INVALID_NUMBER(src); }
    +
    +  //
    +  // Handle floats if there is a . or e (or both)
    +  //
    +  int64_t exponent = 0;
    +  bool is_float = false;
    +  if ('.' == *p) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_decimal_after_separator(src, p, i, exponent) );
    +    digit_count = int(p - start_digits); // used later to guard against overflows
    +  }
    +  if (('e' == *p) || ('E' == *p)) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_exponent(src, p, exponent) );
    +  }
    +  if (is_float) {
    +    const bool dirty_end = jsoncharutils::is_not_structural_or_whitespace(*p);
    +    SIMDJSON_TRY( write_float(src, negative, i, start_digits, digit_count, exponent, writer) );
    +    if (dirty_end) { return INVALID_NUMBER(src); }
    +    return SUCCESS;
    +  }
    +
    +  // The longest negative 64-bit number is 19 digits.
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  size_t longest_digit_count = negative ? 19 : 20;
    +  if (digit_count > longest_digit_count) { return INVALID_NUMBER(src); }
    +  if (digit_count == longest_digit_count) {
    +    if (negative) {
    +      // Anything negative above INT64_MAX+1 is invalid
    +      if (i > uint64_t(INT64_MAX)+1) { return INVALID_NUMBER(src);  }
    +      WRITE_INTEGER(~i+1, src, writer);
    +      if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +      return SUCCESS;
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    }  else if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INVALID_NUMBER(src); }
    +  }
    +
    +  // Write unsigned if it doesn't fit in a signed integer.
    +  if (i > uint64_t(INT64_MAX)) {
    +    WRITE_UNSIGNED(i, src, writer);
    +  } else {
    +    WRITE_INTEGER(negative ? (~i+1) : i, src, writer);
    +  }
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +  return SUCCESS;
    +}
    +
    +// Inlineable functions
    +namespace {
    +
    +// This table can be used to characterize the final character of an integer
    +// string. For JSON structural character and allowable white space characters,
    +// we return SUCCESS. For 'e', '.' and 'E', we return INCORRECT_TYPE. Otherwise
    +// we return NUMBER_ERROR.
    +// Optimization note: we could easily reduce the size of the table by half (to 128)
    +// at the cost of an extra branch.
    +// Optimization note: we want the values to use at most 8 bits (not, e.g., 32 bits):
    +static_assert(error_code(uint8_t(NUMBER_ERROR))== NUMBER_ERROR, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(SUCCESS))== SUCCESS, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(INCORRECT_TYPE))== INCORRECT_TYPE, "bad NUMBER_ERROR cast");
    +
    +const uint8_t integer_string_finisher[256] = {
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   SUCCESS,      NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, INCORRECT_TYPE,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, SUCCESS,        NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR};
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if ((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src + 1;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    // Note: we use src[1] and not src[0] because src[0] is the quote character in this
    +    // instance.
    +    if (src[1] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = src;
    +  uint64_t i = 0;
    +  while (parse_digit(*src, i)) { src++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(src - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*src)) {
    +  //  return (*src == '.' || *src == 'e' || *src == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(*src != '"') { return NUMBER_ERROR; }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept {
    +  return (*src == '-');
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) { return true; }
    +  return false;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) {
    +    // We have an integer.
    +    // If the number is negative and valid, it must be a signed integer.
    +    if(negative) { return number_type::signed_integer; }
    +    // We want values larger or equal to 9223372036854775808 to be unsigned
    +    // integers, and the other values to be signed integers.
    +    int digit_count = int(p - src);
    +    if(digit_count >= 19) {
    +      const uint8_t * smaller_big_integer = reinterpret_cast("9223372036854775808");
    +      if((digit_count >= 20) || (memcmp(src, smaller_big_integer, 19) >= 0)) {
    +        return number_type::unsigned_integer;
    +      }
    +    }
    +    return number_type::signed_integer;
    +  }
    +  // Hopefully, we have 'e' or 'E' or '.'.
    +  return number_type::floating_point_number;
    +}
    +
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src, const uint8_t * const src_end) noexcept {
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  if(p == src_end) { return NUMBER_ERROR; }
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely((p != src_end) && (*p == '.'))) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if ((p == src_end) || !parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = start_digits-src > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if ((p != src_end) && (*p == 'e' || *p == 'E')) {
    +    p++;
    +    if(p == src_end) { return NUMBER_ERROR; }
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while ((p != src_end) && parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if ((p != src_end) && jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), src_end, &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +} // unnamed namespace
    +#endif // SIMDJSON_SKIPNUMBERPARSING
    +
    +} // namespace numberparsing
    +
    +inline std::ostream& operator<<(std::ostream& out, number_type type) noexcept {
    +    switch (type) {
    +        case number_type::signed_integer: out << "integer in [-9223372036854775808,9223372036854775808)"; break;
    +        case number_type::unsigned_integer: out << "unsigned integer in [9223372036854775808,18446744073709551616)"; break;
    +        case number_type::floating_point_number: out << "floating-point number (binary64)"; break;
    +        default: SIMDJSON_UNREACHABLE();
    +    }
    +    return out;
    +}
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_NUMBERPARSING_H
    +/* end file simdjson/generic/numberparsing.h for westmere */
    +
    +/* including simdjson/generic/implementation_simdjson_result_base-inl.h for westmere: #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base-inl.h for westmere */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +
    +//
    +// internal::implementation_simdjson_result_base inline implementation
    +//
    +
    +template
    +simdjson_inline void implementation_simdjson_result_base::tie(T &value, error_code &error) && noexcept {
    +  error = this->second;
    +  if (!error) {
    +    value = std::forward>(*this).first;
    +  }
    +}
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::get(T &value) && noexcept {
    +  error_code error;
    +  std::forward>(*this).tie(value, error);
    +  return error;
    +}
    +
    +template
    +simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept {
    +  return this->second;
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::take_value() && noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::operator T&&() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline const T& implementation_simdjson_result_base::value_unsafe() const& noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value_unsafe() & noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value_unsafe() && noexcept {
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value, error_code error) noexcept
    +    : first{std::forward(value)}, second{error} {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(error_code error) noexcept
    +    : implementation_simdjson_result_base(T{}, error) {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value), SUCCESS) {}
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +/* end file simdjson/generic/implementation_simdjson_result_base-inl.h for westmere */
    +/* end file simdjson/generic/amalgamated.h for westmere */
    +/* including simdjson/westmere/end.h: #include "simdjson/westmere/end.h" */
    +/* begin file simdjson/westmere/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_WESTMERE
    +SIMDJSON_UNTARGET_REGION
    +#endif
    +
    +/* undefining SIMDJSON_IMPLEMENTATION from "westmere" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/westmere/end.h */
    +
    +#endif // SIMDJSON_WESTMERE_H
    +/* end file simdjson/westmere.h */
    +/* including simdjson/westmere/implementation.h: #include  */
    +/* begin file simdjson/westmere/implementation.h */
    +#ifndef SIMDJSON_WESTMERE_IMPLEMENTATION_H
    +#define SIMDJSON_WESTMERE_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/instruction_set.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_WESTMERE
    +namespace simdjson {
    +namespace westmere {
    +
    +/**
    + * @private
    + */
    +class implementation final : public simdjson::implementation {
    +public:
    +  simdjson_inline implementation() : simdjson::implementation("westmere", "Intel/AMD SSE4.2", internal::instruction_set::SSE42 | internal::instruction_set::PCLMULQDQ) {}
    +  simdjson_warn_unused error_code create_dom_parser_implementation(
    +    size_t capacity,
    +    size_t max_length,
    +    std::unique_ptr& dst
    +  ) const noexcept final;
    +  simdjson_warn_unused error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept final;
    +  simdjson_warn_unused bool validate_utf8(const char *buf, size_t len) const noexcept final;
    +};
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_IMPLEMENTATION_H
    +/* end file simdjson/westmere/implementation.h */
    +
    +/* including simdjson/westmere/begin.h: #include  */
    +/* begin file simdjson/westmere/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "westmere" */
    +#define SIMDJSON_IMPLEMENTATION westmere
    +/* including simdjson/westmere/base.h: #include "simdjson/westmere/base.h" */
    +/* begin file simdjson/westmere/base.h */
    +#ifndef SIMDJSON_WESTMERE_BASE_H
    +#define SIMDJSON_WESTMERE_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_WESTMERE
    +namespace simdjson {
    +/**
    + * Implementation for Westmere (Intel SSE4.2).
    + */
    +namespace westmere {
    +
    +class implementation;
    +
    +namespace {
    +namespace simd {
    +
    +template  struct simd8;
    +template  struct simd8x64;
    +
    +} // namespace simd
    +} // unnamed namespace
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_BASE_H
    +/* end file simdjson/westmere/base.h */
    +/* including simdjson/westmere/intrinsics.h: #include "simdjson/westmere/intrinsics.h" */
    +/* begin file simdjson/westmere/intrinsics.h */
    +#ifndef SIMDJSON_WESTMERE_INTRINSICS_H
    +#define SIMDJSON_WESTMERE_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if SIMDJSON_VISUAL_STUDIO
    +// under clang within visual studio, this will include 
    +#include  // visual studio or clang
    +#else
    +#include  // elsewhere
    +#endif // SIMDJSON_VISUAL_STUDIO
    +
    +
    +#if SIMDJSON_CLANG_VISUAL_STUDIO
    +/**
    + * You are not supposed, normally, to include these
    + * headers directly. Instead you should either include intrin.h
    + * or x86intrin.h. However, when compiling with clang
    + * under Windows (i.e., when _MSC_VER is set), these headers
    + * only get included *if* the corresponding features are detected
    + * from macros:
    + */
    +#include   // for _mm_alignr_epi8
    +#include   // for  _mm_clmulepi64_si128
    +#endif
    +
    +static_assert(sizeof(__m128i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for westmere");
    +
    +#endif // SIMDJSON_WESTMERE_INTRINSICS_H
    +/* end file simdjson/westmere/intrinsics.h */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_WESTMERE
    +SIMDJSON_TARGET_REGION("sse4.2,pclmul,popcnt")
    +#endif
    +
    +/* including simdjson/westmere/bitmanipulation.h: #include "simdjson/westmere/bitmanipulation.h" */
    +/* begin file simdjson/westmere/bitmanipulation.h */
    +#ifndef SIMDJSON_WESTMERE_BITMANIPULATION_H
    +#define SIMDJSON_WESTMERE_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long ret;
    +  // Search the mask data from least significant bit (LSB)
    +  // to the most significant bit (MSB) for a set bit (1).
    +  _BitScanForward64(&ret, input_num);
    +  return (int)ret;
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return input_num & (input_num-1);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long leading_zero = 0;
    +  // Search the mask data from most significant bit (MSB)
    +  // to least significant bit (LSB) for a set bit (1).
    +  if (_BitScanReverse64(&leading_zero, input_num))
    +    return (int)(63 - leading_zero);
    +  else
    +    return 64;
    +#else
    +  return __builtin_clzll(input_num);
    +#endif// SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +simdjson_inline unsigned __int64 count_ones(uint64_t input_num) {
    +  // note: we do not support legacy 32-bit Windows in this kernel
    +  return __popcnt64(input_num);// Visual Studio wants two underscores
    +}
    +#else
    +simdjson_inline long long int count_ones(uint64_t input_num) {
    +  return _popcnt64(input_num);
    +}
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2,
    +                                uint64_t *result) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return _addcarry_u64(0, value1, value2,
    +                       reinterpret_cast(result));
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_BITMANIPULATION_H
    +/* end file simdjson/westmere/bitmanipulation.h */
    +/* including simdjson/westmere/bitmask.h: #include "simdjson/westmere/bitmask.h" */
    +/* begin file simdjson/westmere/bitmask.h */
    +#ifndef SIMDJSON_WESTMERE_BITMASK_H
    +#define SIMDJSON_WESTMERE_BITMASK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +
    +//
    +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered.
    +//
    +// For example, prefix_xor(00100100) == 00011100
    +//
    +simdjson_inline uint64_t prefix_xor(const uint64_t bitmask) {
    +  // There should be no such thing with a processing supporting avx2
    +  // but not clmul.
    +  __m128i all_ones = _mm_set1_epi8('\xFF');
    +  __m128i result = _mm_clmulepi64_si128(_mm_set_epi64x(0ULL, bitmask), all_ones, 0);
    +  return _mm_cvtsi128_si64(result);
    +}
    +
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_BITMASK_H
    +/* end file simdjson/westmere/bitmask.h */
    +/* including simdjson/westmere/numberparsing_defs.h: #include "simdjson/westmere/numberparsing_defs.h" */
    +/* begin file simdjson/westmere/numberparsing_defs.h */
    +#ifndef SIMDJSON_WESTMERE_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_WESTMERE_NUMBERPARSING_DEFS_H
    +
    +/* including simdjson/westmere/base.h: #include "simdjson/westmere/base.h" */
    +/* begin file simdjson/westmere/base.h */
    +#ifndef SIMDJSON_WESTMERE_BASE_H
    +#define SIMDJSON_WESTMERE_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_WESTMERE
    +namespace simdjson {
    +/**
    + * Implementation for Westmere (Intel SSE4.2).
    + */
    +namespace westmere {
    +
    +class implementation;
    +
    +namespace {
    +namespace simd {
    +
    +template  struct simd8;
    +template  struct simd8x64;
    +
    +} // namespace simd
    +} // unnamed namespace
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_BASE_H
    +/* end file simdjson/westmere/base.h */
    +/* including simdjson/westmere/intrinsics.h: #include "simdjson/westmere/intrinsics.h" */
    +/* begin file simdjson/westmere/intrinsics.h */
    +#ifndef SIMDJSON_WESTMERE_INTRINSICS_H
    +#define SIMDJSON_WESTMERE_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if SIMDJSON_VISUAL_STUDIO
    +// under clang within visual studio, this will include 
    +#include  // visual studio or clang
    +#else
    +#include  // elsewhere
    +#endif // SIMDJSON_VISUAL_STUDIO
    +
    +
    +#if SIMDJSON_CLANG_VISUAL_STUDIO
    +/**
    + * You are not supposed, normally, to include these
    + * headers directly. Instead you should either include intrin.h
    + * or x86intrin.h. However, when compiling with clang
    + * under Windows (i.e., when _MSC_VER is set), these headers
    + * only get included *if* the corresponding features are detected
    + * from macros:
    + */
    +#include   // for _mm_alignr_epi8
    +#include   // for  _mm_clmulepi64_si128
    +#endif
    +
    +static_assert(sizeof(__m128i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for westmere");
    +
    +#endif // SIMDJSON_WESTMERE_INTRINSICS_H
    +/* end file simdjson/westmere/intrinsics.h */
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace numberparsing {
    +
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  // this actually computes *16* values so we are being wasteful.
    +  const __m128i ascii0 = _mm_set1_epi8('0');
    +  const __m128i mul_1_10 =
    +      _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1);
    +  const __m128i mul_1_100 = _mm_setr_epi16(100, 1, 100, 1, 100, 1, 100, 1);
    +  const __m128i mul_1_10000 =
    +      _mm_setr_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1);
    +  const __m128i input = _mm_sub_epi8(
    +      _mm_loadu_si128(reinterpret_cast(chars)), ascii0);
    +  const __m128i t1 = _mm_maddubs_epi16(input, mul_1_10);
    +  const __m128i t2 = _mm_madd_epi16(t1, mul_1_100);
    +  const __m128i t3 = _mm_packus_epi32(t2, t2);
    +  const __m128i t4 = _mm_madd_epi16(t3, mul_1_10000);
    +  return _mm_cvtsi128_si32(
    +      t4); // only captures the sum of the first 8 digits, drop the rest
    +}
    +
    +/** @private */
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif //  SIMDJSON_WESTMERE_NUMBERPARSING_DEFS_H
    +/* end file simdjson/westmere/numberparsing_defs.h */
    +/* including simdjson/westmere/simd.h: #include "simdjson/westmere/simd.h" */
    +/* begin file simdjson/westmere/simd.h */
    +#ifndef SIMDJSON_WESTMERE_SIMD_H
    +#define SIMDJSON_WESTMERE_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace simd {
    +
    +  template
    +  struct base {
    +    __m128i value;
    +
    +    // Zero constructor
    +    simdjson_inline base() : value{__m128i()} {}
    +
    +    // Conversion from SIMD register
    +    simdjson_inline base(const __m128i _value) : value(_value) {}
    +
    +    // Conversion to SIMD register
    +    simdjson_inline operator const __m128i&() const { return this->value; }
    +    simdjson_inline operator __m128i&() { return this->value; }
    +
    +    // Bit operations
    +    simdjson_inline Child operator|(const Child other) const { return _mm_or_si128(*this, other); }
    +    simdjson_inline Child operator&(const Child other) const { return _mm_and_si128(*this, other); }
    +    simdjson_inline Child operator^(const Child other) const { return _mm_xor_si128(*this, other); }
    +    simdjson_inline Child bit_andnot(const Child other) const { return _mm_andnot_si128(other, *this); }
    +    simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast | other; return *this_cast; }
    +    simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast & other; return *this_cast; }
    +    simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast ^ other; return *this_cast; }
    +  };
    +
    +  template>
    +  struct base8: base> {
    +    typedef uint16_t bitmask_t;
    +    typedef uint32_t bitmask2_t;
    +
    +    simdjson_inline base8() : base>() {}
    +    simdjson_inline base8(const __m128i _value) : base>(_value) {}
    +
    +    friend simdjson_inline Mask operator==(const simd8 lhs, const simd8 rhs) { return _mm_cmpeq_epi8(lhs, rhs); }
    +
    +    static const int SIZE = sizeof(base>::value);
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +      return _mm_alignr_epi8(*this, prev_chunk, 16 - N);
    +    }
    +  };
    +
    +  // SIMD byte mask type (returned by things like eq and gt)
    +  template<>
    +  struct simd8: base8 {
    +    static simdjson_inline simd8 splat(bool _value) { return _mm_set1_epi8(uint8_t(-(!!_value))); }
    +
    +    simdjson_inline simd8() : base8() {}
    +    simdjson_inline simd8(const __m128i _value) : base8(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(bool _value) : base8(splat(_value)) {}
    +
    +    simdjson_inline int to_bitmask() const { return _mm_movemask_epi8(*this); }
    +    simdjson_inline bool any() const { return !_mm_testz_si128(*this, *this); }
    +    simdjson_inline simd8 operator~() const { return *this ^ true; }
    +  };
    +
    +  template
    +  struct base8_numeric: base8 {
    +    static simdjson_inline simd8 splat(T _value) { return _mm_set1_epi8(_value); }
    +    static simdjson_inline simd8 zero() { return _mm_setzero_si128(); }
    +    static simdjson_inline simd8 load(const T values[16]) {
    +      return _mm_loadu_si128(reinterpret_cast(values));
    +    }
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    static simdjson_inline simd8 repeat_16(
    +      T v0,  T v1,  T v2,  T v3,  T v4,  T v5,  T v6,  T v7,
    +      T v8,  T v9,  T v10, T v11, T v12, T v13, T v14, T v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    simdjson_inline base8_numeric() : base8() {}
    +    simdjson_inline base8_numeric(const __m128i _value) : base8(_value) {}
    +
    +    // Store to array
    +    simdjson_inline void store(T dst[16]) const { return _mm_storeu_si128(reinterpret_cast<__m128i *>(dst), *this); }
    +
    +    // Override to distinguish from bool version
    +    simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +
    +    // Addition/subtraction are the same for signed and unsigned
    +    simdjson_inline simd8 operator+(const simd8 other) const { return _mm_add_epi8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return _mm_sub_epi8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *static_cast*>(this); }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *static_cast*>(this); }
    +
    +    // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values)
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return _mm_shuffle_epi8(lookup_table, *this);
    +    }
    +
    +    // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset).
    +    // Passing a 0 value for mask would be equivalent to writing out every byte to output.
    +    // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes
    +    // get written.
    +    // Design consideration: it seems like a function with the
    +    // signature simd8 compress(uint32_t mask) would be
    +    // sensible, but the AVX ISA makes this kind of approach difficult.
    +    template
    +    simdjson_inline void compress(uint16_t mask, L * output) const {
    +      using internal::thintable_epi8;
    +      using internal::BitsSetTable256mul2;
    +      using internal::pshufb_combine_table;
    +      // this particular implementation was inspired by work done by @animetosho
    +      // we do it in two steps, first 8 bytes and then second 8 bytes
    +      uint8_t mask1 = uint8_t(mask); // least significant 8 bits
    +      uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
    +      // next line just loads the 64-bit values thintable_epi8[mask1] and
    +      // thintable_epi8[mask2] into a 128-bit register, using only
    +      // two instructions on most compilers.
    +      __m128i shufmask =  _mm_set_epi64x(thintable_epi8[mask2], thintable_epi8[mask1]);
    +      // we increment by 0x08 the second half of the mask
    +      shufmask =
    +      _mm_add_epi8(shufmask, _mm_set_epi32(0x08080808, 0x08080808, 0, 0));
    +      // this is the version "nearly pruned"
    +      __m128i pruned = _mm_shuffle_epi8(*this, shufmask);
    +      // we still need to put the two halves together.
    +      // we compute the popcount of the first half:
    +      int pop1 = BitsSetTable256mul2[mask1];
    +      // then load the corresponding mask, what it does is to write
    +      // only the first pop1 bytes from the first 8 bytes, and then
    +      // it fills in with the bytes from the second 8 bytes + some filling
    +      // at the end.
    +      __m128i compactmask =
    +      _mm_loadu_si128(reinterpret_cast(pshufb_combine_table + pop1 * 8));
    +      __m128i answer = _mm_shuffle_epi8(pruned, compactmask);
    +      _mm_storeu_si128(reinterpret_cast<__m128i *>(output), answer);
    +    }
    +
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +  };
    +
    +  // Signed bytes
    +  template<>
    +  struct simd8 : base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m128i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const int8_t* values) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) : simd8(_mm_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Order-sensitive comparisons
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm_max_epi8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm_min_epi8(*this, other); }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return _mm_cmpgt_epi8(*this, other); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return _mm_cmpgt_epi8(other, *this); }
    +  };
    +
    +  // Unsigned bytes
    +  template<>
    +  struct simd8: base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m128i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const uint8_t* values) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) : simd8(_mm_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Saturated math
    +    simdjson_inline simd8 saturating_add(const simd8 other) const { return _mm_adds_epu8(*this, other); }
    +    simdjson_inline simd8 saturating_sub(const simd8 other) const { return _mm_subs_epu8(*this, other); }
    +
    +    // Order-specific operations
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm_max_epu8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm_min_epu8(*this, other); }
    +    // Same as >, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 gt_bits(const simd8 other) const { return this->saturating_sub(other); }
    +    // Same as <, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 lt_bits(const simd8 other) const { return other.saturating_sub(*this); }
    +    simdjson_inline simd8 operator<=(const simd8 other) const { return other.max_val(*this) == other; }
    +    simdjson_inline simd8 operator>=(const simd8 other) const { return other.min_val(*this) == other; }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +
    +    // Bit-specific operations
    +    simdjson_inline simd8 bits_not_set() const { return *this == uint8_t(0); }
    +    simdjson_inline simd8 bits_not_set(simd8 bits) const { return (*this & bits).bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set() const { return ~this->bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set(simd8 bits) const { return ~this->bits_not_set(bits); }
    +    simdjson_inline bool is_ascii() const { return _mm_movemask_epi8(*this) == 0; }
    +    simdjson_inline bool bits_not_set_anywhere() const { return _mm_testz_si128(*this, *this); }
    +    simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); }
    +    simdjson_inline bool bits_not_set_anywhere(simd8 bits) const { return _mm_testz_si128(*this, bits); }
    +    simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return !bits_not_set_anywhere(bits); }
    +    template
    +    simdjson_inline simd8 shr() const { return simd8(_mm_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); }
    +    template
    +    simdjson_inline simd8 shl() const { return simd8(_mm_slli_epi16(*this, N)) & uint8_t(0xFFu << N); }
    +    // Get one of the bits and make a bitmask out of it.
    +    // e.g. value.get_bit<7>() gets the high bit
    +    template
    +    simdjson_inline int get_bit() const { return _mm_movemask_epi8(_mm_slli_epi16(*this, 7-N)); }
    +  };
    +
    +  template
    +  struct simd8x64 {
    +    static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +    static_assert(NUM_CHUNKS == 4, "Westmere kernel should use four registers per 64-byte block.");
    +    const simd8 chunks[NUM_CHUNKS];
    +
    +    simd8x64(const simd8x64& o) = delete; // no copy allowed
    +    simd8x64& operator=(const simd8& other) = delete; // no assignment allowed
    +    simd8x64() = delete; // no default constructor allowed
    +
    +    simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1, const simd8 chunk2, const simd8 chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {}
    +    simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8::load(ptr), simd8::load(ptr+16), simd8::load(ptr+32), simd8::load(ptr+48)} {}
    +
    +    simdjson_inline void store(T ptr[64]) const {
    +      this->chunks[0].store(ptr+sizeof(simd8)*0);
    +      this->chunks[1].store(ptr+sizeof(simd8)*1);
    +      this->chunks[2].store(ptr+sizeof(simd8)*2);
    +      this->chunks[3].store(ptr+sizeof(simd8)*3);
    +    }
    +
    +    simdjson_inline simd8 reduce_or() const {
    +      return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]);
    +    }
    +
    +    simdjson_inline uint64_t compress(uint64_t mask, T * output) const {
    +      this->chunks[0].compress(uint16_t(mask), output);
    +      this->chunks[1].compress(uint16_t(mask >> 16), output + 16 - count_ones(mask & 0xFFFF));
    +      this->chunks[2].compress(uint16_t(mask >> 32), output + 32 - count_ones(mask & 0xFFFFFFFF));
    +      this->chunks[3].compress(uint16_t(mask >> 48), output + 48 - count_ones(mask & 0xFFFFFFFFFFFF));
    +      return 64 - count_ones(mask);
    +    }
    +
    +    simdjson_inline uint64_t to_bitmask() const {
    +      uint64_t r0 = uint32_t(this->chunks[0].to_bitmask() );
    +      uint64_t r1 =          this->chunks[1].to_bitmask() ;
    +      uint64_t r2 =          this->chunks[2].to_bitmask() ;
    +      uint64_t r3 =          this->chunks[3].to_bitmask() ;
    +      return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48);
    +    }
    +
    +    simdjson_inline uint64_t eq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] == mask,
    +        this->chunks[1] == mask,
    +        this->chunks[2] == mask,
    +        this->chunks[3] == mask
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t eq(const simd8x64 &other) const {
    +      return  simd8x64(
    +        this->chunks[0] == other.chunks[0],
    +        this->chunks[1] == other.chunks[1],
    +        this->chunks[2] == other.chunks[2],
    +        this->chunks[3] == other.chunks[3]
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t lteq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] <= mask,
    +        this->chunks[1] <= mask,
    +        this->chunks[2] <= mask,
    +        this->chunks[3] <= mask
    +      ).to_bitmask();
    +    }
    +  }; // struct simd8x64
    +
    +} // namespace simd
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_SIMD_INPUT_H
    +/* end file simdjson/westmere/simd.h */
    +/* including simdjson/westmere/stringparsing_defs.h: #include "simdjson/westmere/stringparsing_defs.h" */
    +/* begin file simdjson/westmere/stringparsing_defs.h */
    +#ifndef SIMDJSON_WESTMERE_STRINGPARSING_DEFS_H
    +#define SIMDJSON_WESTMERE_STRINGPARSING_DEFS_H
    +
    +/* including simdjson/westmere/bitmanipulation.h: #include "simdjson/westmere/bitmanipulation.h" */
    +/* begin file simdjson/westmere/bitmanipulation.h */
    +#ifndef SIMDJSON_WESTMERE_BITMANIPULATION_H
    +#define SIMDJSON_WESTMERE_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long ret;
    +  // Search the mask data from least significant bit (LSB)
    +  // to the most significant bit (MSB) for a set bit (1).
    +  _BitScanForward64(&ret, input_num);
    +  return (int)ret;
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return input_num & (input_num-1);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long leading_zero = 0;
    +  // Search the mask data from most significant bit (MSB)
    +  // to least significant bit (LSB) for a set bit (1).
    +  if (_BitScanReverse64(&leading_zero, input_num))
    +    return (int)(63 - leading_zero);
    +  else
    +    return 64;
    +#else
    +  return __builtin_clzll(input_num);
    +#endif// SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +simdjson_inline unsigned __int64 count_ones(uint64_t input_num) {
    +  // note: we do not support legacy 32-bit Windows in this kernel
    +  return __popcnt64(input_num);// Visual Studio wants two underscores
    +}
    +#else
    +simdjson_inline long long int count_ones(uint64_t input_num) {
    +  return _popcnt64(input_num);
    +}
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2,
    +                                uint64_t *result) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return _addcarry_u64(0, value1, value2,
    +                       reinterpret_cast(result));
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_BITMANIPULATION_H
    +/* end file simdjson/westmere/bitmanipulation.h */
    +/* including simdjson/westmere/simd.h: #include "simdjson/westmere/simd.h" */
    +/* begin file simdjson/westmere/simd.h */
    +#ifndef SIMDJSON_WESTMERE_SIMD_H
    +#define SIMDJSON_WESTMERE_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace simd {
    +
    +  template
    +  struct base {
    +    __m128i value;
    +
    +    // Zero constructor
    +    simdjson_inline base() : value{__m128i()} {}
    +
    +    // Conversion from SIMD register
    +    simdjson_inline base(const __m128i _value) : value(_value) {}
    +
    +    // Conversion to SIMD register
    +    simdjson_inline operator const __m128i&() const { return this->value; }
    +    simdjson_inline operator __m128i&() { return this->value; }
    +
    +    // Bit operations
    +    simdjson_inline Child operator|(const Child other) const { return _mm_or_si128(*this, other); }
    +    simdjson_inline Child operator&(const Child other) const { return _mm_and_si128(*this, other); }
    +    simdjson_inline Child operator^(const Child other) const { return _mm_xor_si128(*this, other); }
    +    simdjson_inline Child bit_andnot(const Child other) const { return _mm_andnot_si128(other, *this); }
    +    simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast | other; return *this_cast; }
    +    simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast & other; return *this_cast; }
    +    simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast ^ other; return *this_cast; }
    +  };
    +
    +  template>
    +  struct base8: base> {
    +    typedef uint16_t bitmask_t;
    +    typedef uint32_t bitmask2_t;
    +
    +    simdjson_inline base8() : base>() {}
    +    simdjson_inline base8(const __m128i _value) : base>(_value) {}
    +
    +    friend simdjson_inline Mask operator==(const simd8 lhs, const simd8 rhs) { return _mm_cmpeq_epi8(lhs, rhs); }
    +
    +    static const int SIZE = sizeof(base>::value);
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +      return _mm_alignr_epi8(*this, prev_chunk, 16 - N);
    +    }
    +  };
    +
    +  // SIMD byte mask type (returned by things like eq and gt)
    +  template<>
    +  struct simd8: base8 {
    +    static simdjson_inline simd8 splat(bool _value) { return _mm_set1_epi8(uint8_t(-(!!_value))); }
    +
    +    simdjson_inline simd8() : base8() {}
    +    simdjson_inline simd8(const __m128i _value) : base8(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(bool _value) : base8(splat(_value)) {}
    +
    +    simdjson_inline int to_bitmask() const { return _mm_movemask_epi8(*this); }
    +    simdjson_inline bool any() const { return !_mm_testz_si128(*this, *this); }
    +    simdjson_inline simd8 operator~() const { return *this ^ true; }
    +  };
    +
    +  template
    +  struct base8_numeric: base8 {
    +    static simdjson_inline simd8 splat(T _value) { return _mm_set1_epi8(_value); }
    +    static simdjson_inline simd8 zero() { return _mm_setzero_si128(); }
    +    static simdjson_inline simd8 load(const T values[16]) {
    +      return _mm_loadu_si128(reinterpret_cast(values));
    +    }
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    static simdjson_inline simd8 repeat_16(
    +      T v0,  T v1,  T v2,  T v3,  T v4,  T v5,  T v6,  T v7,
    +      T v8,  T v9,  T v10, T v11, T v12, T v13, T v14, T v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    simdjson_inline base8_numeric() : base8() {}
    +    simdjson_inline base8_numeric(const __m128i _value) : base8(_value) {}
    +
    +    // Store to array
    +    simdjson_inline void store(T dst[16]) const { return _mm_storeu_si128(reinterpret_cast<__m128i *>(dst), *this); }
    +
    +    // Override to distinguish from bool version
    +    simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +
    +    // Addition/subtraction are the same for signed and unsigned
    +    simdjson_inline simd8 operator+(const simd8 other) const { return _mm_add_epi8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return _mm_sub_epi8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *static_cast*>(this); }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *static_cast*>(this); }
    +
    +    // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values)
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return _mm_shuffle_epi8(lookup_table, *this);
    +    }
    +
    +    // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset).
    +    // Passing a 0 value for mask would be equivalent to writing out every byte to output.
    +    // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes
    +    // get written.
    +    // Design consideration: it seems like a function with the
    +    // signature simd8 compress(uint32_t mask) would be
    +    // sensible, but the AVX ISA makes this kind of approach difficult.
    +    template
    +    simdjson_inline void compress(uint16_t mask, L * output) const {
    +      using internal::thintable_epi8;
    +      using internal::BitsSetTable256mul2;
    +      using internal::pshufb_combine_table;
    +      // this particular implementation was inspired by work done by @animetosho
    +      // we do it in two steps, first 8 bytes and then second 8 bytes
    +      uint8_t mask1 = uint8_t(mask); // least significant 8 bits
    +      uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
    +      // next line just loads the 64-bit values thintable_epi8[mask1] and
    +      // thintable_epi8[mask2] into a 128-bit register, using only
    +      // two instructions on most compilers.
    +      __m128i shufmask =  _mm_set_epi64x(thintable_epi8[mask2], thintable_epi8[mask1]);
    +      // we increment by 0x08 the second half of the mask
    +      shufmask =
    +      _mm_add_epi8(shufmask, _mm_set_epi32(0x08080808, 0x08080808, 0, 0));
    +      // this is the version "nearly pruned"
    +      __m128i pruned = _mm_shuffle_epi8(*this, shufmask);
    +      // we still need to put the two halves together.
    +      // we compute the popcount of the first half:
    +      int pop1 = BitsSetTable256mul2[mask1];
    +      // then load the corresponding mask, what it does is to write
    +      // only the first pop1 bytes from the first 8 bytes, and then
    +      // it fills in with the bytes from the second 8 bytes + some filling
    +      // at the end.
    +      __m128i compactmask =
    +      _mm_loadu_si128(reinterpret_cast(pshufb_combine_table + pop1 * 8));
    +      __m128i answer = _mm_shuffle_epi8(pruned, compactmask);
    +      _mm_storeu_si128(reinterpret_cast<__m128i *>(output), answer);
    +    }
    +
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +  };
    +
    +  // Signed bytes
    +  template<>
    +  struct simd8 : base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m128i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const int8_t* values) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) : simd8(_mm_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Order-sensitive comparisons
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm_max_epi8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm_min_epi8(*this, other); }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return _mm_cmpgt_epi8(*this, other); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return _mm_cmpgt_epi8(other, *this); }
    +  };
    +
    +  // Unsigned bytes
    +  template<>
    +  struct simd8: base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m128i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const uint8_t* values) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) : simd8(_mm_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Saturated math
    +    simdjson_inline simd8 saturating_add(const simd8 other) const { return _mm_adds_epu8(*this, other); }
    +    simdjson_inline simd8 saturating_sub(const simd8 other) const { return _mm_subs_epu8(*this, other); }
    +
    +    // Order-specific operations
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm_max_epu8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm_min_epu8(*this, other); }
    +    // Same as >, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 gt_bits(const simd8 other) const { return this->saturating_sub(other); }
    +    // Same as <, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 lt_bits(const simd8 other) const { return other.saturating_sub(*this); }
    +    simdjson_inline simd8 operator<=(const simd8 other) const { return other.max_val(*this) == other; }
    +    simdjson_inline simd8 operator>=(const simd8 other) const { return other.min_val(*this) == other; }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +
    +    // Bit-specific operations
    +    simdjson_inline simd8 bits_not_set() const { return *this == uint8_t(0); }
    +    simdjson_inline simd8 bits_not_set(simd8 bits) const { return (*this & bits).bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set() const { return ~this->bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set(simd8 bits) const { return ~this->bits_not_set(bits); }
    +    simdjson_inline bool is_ascii() const { return _mm_movemask_epi8(*this) == 0; }
    +    simdjson_inline bool bits_not_set_anywhere() const { return _mm_testz_si128(*this, *this); }
    +    simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); }
    +    simdjson_inline bool bits_not_set_anywhere(simd8 bits) const { return _mm_testz_si128(*this, bits); }
    +    simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return !bits_not_set_anywhere(bits); }
    +    template
    +    simdjson_inline simd8 shr() const { return simd8(_mm_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); }
    +    template
    +    simdjson_inline simd8 shl() const { return simd8(_mm_slli_epi16(*this, N)) & uint8_t(0xFFu << N); }
    +    // Get one of the bits and make a bitmask out of it.
    +    // e.g. value.get_bit<7>() gets the high bit
    +    template
    +    simdjson_inline int get_bit() const { return _mm_movemask_epi8(_mm_slli_epi16(*this, 7-N)); }
    +  };
    +
    +  template
    +  struct simd8x64 {
    +    static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +    static_assert(NUM_CHUNKS == 4, "Westmere kernel should use four registers per 64-byte block.");
    +    const simd8 chunks[NUM_CHUNKS];
    +
    +    simd8x64(const simd8x64& o) = delete; // no copy allowed
    +    simd8x64& operator=(const simd8& other) = delete; // no assignment allowed
    +    simd8x64() = delete; // no default constructor allowed
    +
    +    simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1, const simd8 chunk2, const simd8 chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {}
    +    simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8::load(ptr), simd8::load(ptr+16), simd8::load(ptr+32), simd8::load(ptr+48)} {}
    +
    +    simdjson_inline void store(T ptr[64]) const {
    +      this->chunks[0].store(ptr+sizeof(simd8)*0);
    +      this->chunks[1].store(ptr+sizeof(simd8)*1);
    +      this->chunks[2].store(ptr+sizeof(simd8)*2);
    +      this->chunks[3].store(ptr+sizeof(simd8)*3);
    +    }
    +
    +    simdjson_inline simd8 reduce_or() const {
    +      return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]);
    +    }
    +
    +    simdjson_inline uint64_t compress(uint64_t mask, T * output) const {
    +      this->chunks[0].compress(uint16_t(mask), output);
    +      this->chunks[1].compress(uint16_t(mask >> 16), output + 16 - count_ones(mask & 0xFFFF));
    +      this->chunks[2].compress(uint16_t(mask >> 32), output + 32 - count_ones(mask & 0xFFFFFFFF));
    +      this->chunks[3].compress(uint16_t(mask >> 48), output + 48 - count_ones(mask & 0xFFFFFFFFFFFF));
    +      return 64 - count_ones(mask);
    +    }
    +
    +    simdjson_inline uint64_t to_bitmask() const {
    +      uint64_t r0 = uint32_t(this->chunks[0].to_bitmask() );
    +      uint64_t r1 =          this->chunks[1].to_bitmask() ;
    +      uint64_t r2 =          this->chunks[2].to_bitmask() ;
    +      uint64_t r3 =          this->chunks[3].to_bitmask() ;
    +      return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48);
    +    }
    +
    +    simdjson_inline uint64_t eq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] == mask,
    +        this->chunks[1] == mask,
    +        this->chunks[2] == mask,
    +        this->chunks[3] == mask
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t eq(const simd8x64 &other) const {
    +      return  simd8x64(
    +        this->chunks[0] == other.chunks[0],
    +        this->chunks[1] == other.chunks[1],
    +        this->chunks[2] == other.chunks[2],
    +        this->chunks[3] == other.chunks[3]
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t lteq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] <= mask,
    +        this->chunks[1] <= mask,
    +        this->chunks[2] <= mask,
    +        this->chunks[3] <= mask
    +      ).to_bitmask();
    +    }
    +  }; // struct simd8x64
    +
    +} // namespace simd
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_SIMD_INPUT_H
    +/* end file simdjson/westmere/simd.h */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +
    +using namespace simd;
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 32;
    +  simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; }
    +  simdjson_inline bool has_backslash() { return bs_bits != 0; }
    +  simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); }
    +  simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); }
    +
    +  uint32_t bs_bits;
    +  uint32_t quote_bits;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // this can read up to 31 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes");
    +  simd8 v0(src);
    +  simd8 v1(src + 16);
    +  v0.store(dst);
    +  v1.store(dst + 16);
    +  uint64_t bs_and_quote = simd8x64(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask();
    +  return {
    +    uint32_t(bs_and_quote),      // bs_bits
    +    uint32_t(bs_and_quote >> 32) // quote_bits
    +  };
    +}
    +
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_STRINGPARSING_DEFS_H
    +/* end file simdjson/westmere/stringparsing_defs.h */
    +/* end file simdjson/westmere/begin.h */
    +/* including generic/amalgamated.h for westmere: #include  */
    +/* begin file generic/amalgamated.h for westmere */
    +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_SRC_GENERIC_DEPENDENCIES_H)
    +#error generic/dependencies.h must be included before generic/amalgamated.h!
    +#endif
    +
    +/* including generic/base.h for westmere: #include  */
    +/* begin file generic/base.h for westmere */
    +#ifndef SIMDJSON_SRC_GENERIC_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_BASE_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +
    +struct json_character_block;
    +
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_BASE_H
    +/* end file generic/base.h for westmere */
    +/* including generic/dom_parser_implementation.h for westmere: #include  */
    +/* begin file generic/dom_parser_implementation.h for westmere */
    +#ifndef SIMDJSON_SRC_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_DOM_PARSER_IMPLEMENTATION_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// Interface a dom parser implementation must fulfill
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +
    +simdjson_inline simd8 must_be_2_3_continuation(const simd8 prev2, const simd8 prev3);
    +simdjson_inline bool is_ascii(const simd8x64& input);
    +
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +/* end file generic/dom_parser_implementation.h for westmere */
    +/* including generic/json_character_block.h for westmere: #include  */
    +/* begin file generic/json_character_block.h for westmere */
    +#ifndef SIMDJSON_SRC_GENERIC_JSON_CHARACTER_BLOCK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_JSON_CHARACTER_BLOCK_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +
    +struct json_character_block {
    +  static simdjson_inline json_character_block classify(const simd::simd8x64& in);
    +
    +  simdjson_inline uint64_t whitespace() const noexcept { return _whitespace; }
    +  simdjson_inline uint64_t op() const noexcept { return _op; }
    +  simdjson_inline uint64_t scalar() const noexcept { return ~(op() | whitespace()); }
    +
    +  uint64_t _whitespace;
    +  uint64_t _op;
    +};
    +
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_JSON_CHARACTER_BLOCK_H
    +/* end file generic/json_character_block.h for westmere */
    +/* end file generic/amalgamated.h for westmere */
    +/* including generic/stage1/amalgamated.h for westmere: #include  */
    +/* begin file generic/stage1/amalgamated.h for westmere */
    +// Stuff other things depend on
    +/* including generic/stage1/base.h for westmere: #include  */
    +/* begin file generic/stage1/base.h for westmere */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_BASE_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace stage1 {
    +
    +class bit_indexer;
    +template
    +struct buf_block_reader;
    +struct json_block;
    +class json_minifier;
    +class json_scanner;
    +struct json_string_block;
    +class json_string_scanner;
    +class json_structural_indexer;
    +
    +} // namespace stage1
    +
    +namespace utf8_validation {
    +struct utf8_checker;
    +} // namespace utf8_validation
    +
    +using utf8_validation::utf8_checker;
    +
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_BASE_H
    +/* end file generic/stage1/base.h for westmere */
    +/* including generic/stage1/buf_block_reader.h for westmere: #include  */
    +/* begin file generic/stage1/buf_block_reader.h for westmere */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_BUF_BLOCK_READER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_BUF_BLOCK_READER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace stage1 {
    +
    +// Walks through a buffer in block-sized increments, loading the last part with spaces
    +template
    +struct buf_block_reader {
    +public:
    +  simdjson_inline buf_block_reader(const uint8_t *_buf, size_t _len);
    +  simdjson_inline size_t block_index();
    +  simdjson_inline bool has_full_block() const;
    +  simdjson_inline const uint8_t *full_block() const;
    +  /**
    +   * Get the last block, padded with spaces.
    +   *
    +   * There will always be a last block, with at least 1 byte, unless len == 0 (in which case this
    +   * function fills the buffer with spaces and returns 0. In particular, if len == STEP_SIZE there
    +   * will be 0 full_blocks and 1 remainder block with STEP_SIZE bytes and no spaces for padding.
    +   *
    +   * @return the number of effective characters in the last block.
    +   */
    +  simdjson_inline size_t get_remainder(uint8_t *dst) const;
    +  simdjson_inline void advance();
    +private:
    +  const uint8_t *buf;
    +  const size_t len;
    +  const size_t lenminusstep;
    +  size_t idx;
    +};
    +
    +// Routines to print masks and text for debugging bitmask operations
    +simdjson_unused static char * format_input_text_64(const uint8_t *text) {
    +  static char buf[sizeof(simd8x64) + 1];
    +  for (size_t i=0; i); i++) {
    +    buf[i] = int8_t(text[i]) < ' ' ? '_' : int8_t(text[i]);
    +  }
    +  buf[sizeof(simd8x64)] = '\0';
    +  return buf;
    +}
    +
    +// Routines to print masks and text for debugging bitmask operations
    +simdjson_unused static char * format_input_text(const simd8x64& in) {
    +  static char buf[sizeof(simd8x64) + 1];
    +  in.store(reinterpret_cast(buf));
    +  for (size_t i=0; i); i++) {
    +    if (buf[i] < ' ') { buf[i] = '_'; }
    +  }
    +  buf[sizeof(simd8x64)] = '\0';
    +  return buf;
    +}
    +
    +simdjson_unused static char * format_input_text(const simd8x64& in, uint64_t mask) {
    +  static char buf[sizeof(simd8x64) + 1];
    +  in.store(reinterpret_cast(buf));
    +  for (size_t i=0; i); i++) {
    +    if (buf[i] <= ' ') { buf[i] = '_'; }
    +    if (!(mask & (size_t(1) << i))) { buf[i] = ' '; }
    +  }
    +  buf[sizeof(simd8x64)] = '\0';
    +  return buf;
    +}
    +
    +simdjson_unused static char * format_mask(uint64_t mask) {
    +  static char buf[sizeof(simd8x64) + 1];
    +  for (size_t i=0; i<64; i++) {
    +    buf[i] = (mask & (size_t(1) << i)) ? 'X' : ' ';
    +  }
    +  buf[64] = '\0';
    +  return buf;
    +}
    +
    +template
    +simdjson_inline buf_block_reader::buf_block_reader(const uint8_t *_buf, size_t _len) : buf{_buf}, len{_len}, lenminusstep{len < STEP_SIZE ? 0 : len - STEP_SIZE}, idx{0} {}
    +
    +template
    +simdjson_inline size_t buf_block_reader::block_index() { return idx; }
    +
    +template
    +simdjson_inline bool buf_block_reader::has_full_block() const {
    +  return idx < lenminusstep;
    +}
    +
    +template
    +simdjson_inline const uint8_t *buf_block_reader::full_block() const {
    +  return &buf[idx];
    +}
    +
    +template
    +simdjson_inline size_t buf_block_reader::get_remainder(uint8_t *dst) const {
    +  if(len == idx) { return 0; } // memcpy(dst, null, 0) will trigger an error with some sanitizers
    +  std::memset(dst, 0x20, STEP_SIZE); // std::memset STEP_SIZE because it's more efficient to write out 8 or 16 bytes at once.
    +  std::memcpy(dst, buf + idx, len - idx);
    +  return len - idx;
    +}
    +
    +template
    +simdjson_inline void buf_block_reader::advance() {
    +  idx += STEP_SIZE;
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_BUF_BLOCK_READER_H
    +/* end file generic/stage1/buf_block_reader.h for westmere */
    +/* including generic/stage1/json_escape_scanner.h for westmere: #include  */
    +/* begin file generic/stage1/json_escape_scanner.h for westmere */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_ESCAPE_SCANNER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_ESCAPE_SCANNER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace stage1 {
    +
    +/**
    + * Scans for escape characters in JSON, taking care with multiple backslashes (\\n vs. \n).
    + */
    +struct json_escape_scanner {
    +  /** The actual escape characters (the backslashes themselves). */
    +  uint64_t next_is_escaped = 0ULL;
    +
    +  struct escaped_and_escape {
    +    /**
    +     * Mask of escaped characters.
    +     *
    +     * ```
    +     * \n \\n \\\n \\\\n \
    +     * 0100100010100101000
    +     *  n  \   \ n  \ \
    +     * ```
    +     */
    +    uint64_t escaped;
    +    /**
    +     * Mask of escape characters.
    +     *
    +     * ```
    +     * \n \\n \\\n \\\\n \
    +     * 1001000101001010001
    +     * \  \   \ \  \ \   \
    +     * ```
    +     */
    +    uint64_t escape;
    +  };
    +
    +  /**
    +   * Get a mask of both escape and escaped characters (the characters following a backslash).
    +   *
    +   * @param potential_escape A mask of the character that can escape others (but could be
    +   *        escaped itself). e.g. block.eq('\\')
    +   */
    +  simdjson_really_inline escaped_and_escape next(uint64_t backslash) noexcept {
    +
    +#if !SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT
    +    if (!backslash) { return {next_escaped_without_backslashes(), 0}; }
    +#endif
    +
    +    // |                                | Mask (shows characters instead of 1's) | Depth | Instructions        |
    +    // |--------------------------------|----------------------------------------|-------|---------------------|
    +    // | string                         | `\\n_\\\n___\\\n___\\\\___\\\\__\\\`   |       |                     |
    +    // |                                | `    even   odd    even   odd   odd`   |       |                     |
    +    // | potential_escape               | ` \  \\\    \\\    \\\\   \\\\  \\\`   | 1     | 1 (backslash & ~first_is_escaped)
    +    // | escape_and_terminal_code       | ` \n \ \n   \ \n   \ \    \ \   \ \`   | 5     | 5 (next_escape_and_terminal_code())
    +    // | escaped                        | `\    \ n    \ n    \ \    \ \   \ ` X | 6     | 7 (escape_and_terminal_code ^ (potential_escape | first_is_escaped))
    +    // | escape                         | `    \ \    \ \    \ \    \ \   \ \`   | 6     | 8 (escape_and_terminal_code & backslash)
    +    // | first_is_escaped               | `\                                 `   | 7 (*) | 9 (escape >> 63) ()
    +    //                                                                               (*) this is not needed until the next iteration
    +    uint64_t escape_and_terminal_code = next_escape_and_terminal_code(backslash & ~this->next_is_escaped);
    +    uint64_t escaped = escape_and_terminal_code ^ (backslash | this->next_is_escaped);
    +    uint64_t escape = escape_and_terminal_code & backslash;
    +    this->next_is_escaped = escape >> 63;
    +    return {escaped, escape};
    +  }
    +
    +private:
    +  static constexpr const uint64_t ODD_BITS = 0xAAAAAAAAAAAAAAAAULL;
    +
    +  simdjson_really_inline uint64_t next_escaped_without_backslashes() noexcept {
    +    uint64_t escaped = this->next_is_escaped;
    +    this->next_is_escaped = 0;
    +    return escaped;
    +  }
    +
    +  /**
    +   * Returns a mask of the next escape characters (masking out escaped backslashes), along with
    +   * any non-backslash escape codes.
    +   *
    +   * \n \\n \\\n \\\\n returns:
    +   * \n \   \ \n \ \
    +   * 11 100 1011 10100
    +   *
    +   * You are expected to mask out the first bit yourself if the previous block had a trailing
    +   * escape.
    +   *
    +   * & the result with potential_escape to get just the escape characters.
    +   * ^ the result with (potential_escape | first_is_escaped) to get escaped characters.
    +   */
    +  static simdjson_really_inline uint64_t next_escape_and_terminal_code(uint64_t potential_escape) noexcept {
    +    // If we were to just shift and mask out any odd bits, we'd actually get a *half* right answer:
    +    // any even-aligned backslash runs would be correct! Odd-aligned backslash runs would be
    +    // inverted (\\\ would be 010 instead of 101).
    +    //
    +    // ```
    +    // string:              | ____\\\\_\\\\_____ |
    +    // maybe_escaped | ODD  |     \ \   \ \      |
    +    //               even-aligned ^^^  ^^^^ odd-aligned
    +    // ```
    +    //
    +    // Taking that into account, our basic strategy is:
    +    //
    +    // 1. Use subtraction to produce a mask with 1's for even-aligned runs and 0's for
    +    //    odd-aligned runs.
    +    // 2. XOR all odd bits, which masks out the odd bits in even-aligned runs, and brings IN the
    +    //    odd bits in odd-aligned runs.
    +    // 3. & with backslash to clean up any stray bits.
    +    // runs are set to 0, and then XORing with "odd":
    +    //
    +    // |                                | Mask (shows characters instead of 1's) | Instructions        |
    +    // |--------------------------------|----------------------------------------|---------------------|
    +    // | string                         | `\\n_\\\n___\\\n___\\\\___\\\\__\\\`   |
    +    // |                                | `    even   odd    even   odd   odd`   |
    +    // | maybe_escaped                  | `  n  \\n    \\n    \\\_   \\\_  \\` X | 1 (potential_escape << 1)
    +    // | maybe_escaped_and_odd          | ` \n_ \\n _ \\\n_ _ \\\__ _\\\_ \\\`   | 1 (maybe_escaped | odd)
    +    // | even_series_codes_and_odd      | `  n_\\\  _    n_ _\\\\ _     _    `   | 1 (maybe_escaped_and_odd - potential_escape)
    +    // | escape_and_terminal_code       | ` \n \ \n   \ \n   \ \    \ \   \ \`   | 1 (^ odd)
    +    //
    +
    +    // Escaped characters are characters following an escape.
    +    uint64_t maybe_escaped = potential_escape << 1;
    +
    +    // To distinguish odd from even escape sequences, therefore, we turn on any *starting*
    +    // escapes that are on an odd byte. (We actually bring in all odd bits, for speed.)
    +    // - Odd runs of backslashes are 0000, and the code at the end ("n" in \n or \\n) is 1.
    +    // - Odd runs of backslashes are 1111, and the code at the end ("n" in \n or \\n) is 0.
    +    // - All other odd bytes are 1, and even bytes are 0.
    +    uint64_t maybe_escaped_and_odd_bits     = maybe_escaped | ODD_BITS;
    +    uint64_t even_series_codes_and_odd_bits = maybe_escaped_and_odd_bits - potential_escape;
    +
    +    // Now we flip all odd bytes back with xor. This:
    +    // - Makes odd runs of backslashes go from 0000 to 1010
    +    // - Makes even runs of backslashes go from 1111 to 1010
    +    // - Sets actually-escaped codes to 1 (the n in \n and \\n: \n = 11, \\n = 100)
    +    // - Resets all other bytes to 0
    +    return even_series_codes_and_odd_bits ^ ODD_BITS;
    +  }
    +};
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H
    +/* end file generic/stage1/json_escape_scanner.h for westmere */
    +/* including generic/stage1/json_string_scanner.h for westmere: #include  */
    +/* begin file generic/stage1/json_string_scanner.h for westmere */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace stage1 {
    +
    +struct json_string_block {
    +  // We spell out the constructors in the hope of resolving inlining issues with Visual Studio 2017
    +  simdjson_really_inline json_string_block(uint64_t escaped, uint64_t quote, uint64_t in_string) :
    +  _escaped(escaped), _quote(quote), _in_string(in_string) {}
    +
    +  // Escaped characters (characters following an escape() character)
    +  simdjson_really_inline uint64_t escaped() const { return _escaped; }
    +  // Real (non-backslashed) quotes
    +  simdjson_really_inline uint64_t quote() const { return _quote; }
    +  // Only characters inside the string (not including the quotes)
    +  simdjson_really_inline uint64_t string_content() const { return _in_string & ~_quote; }
    +  // Return a mask of whether the given characters are inside a string (only works on non-quotes)
    +  simdjson_really_inline uint64_t non_quote_inside_string(uint64_t mask) const { return mask & _in_string; }
    +  // Return a mask of whether the given characters are inside a string (only works on non-quotes)
    +  simdjson_really_inline uint64_t non_quote_outside_string(uint64_t mask) const { return mask & ~_in_string; }
    +  // Tail of string (everything except the start quote)
    +  simdjson_really_inline uint64_t string_tail() const { return _in_string ^ _quote; }
    +
    +  // escaped characters (backslashed--does not include the hex characters after \u)
    +  uint64_t _escaped;
    +  // real quotes (non-escaped ones)
    +  uint64_t _quote;
    +  // string characters (includes start quote but not end quote)
    +  uint64_t _in_string;
    +};
    +
    +// Scans blocks for string characters, storing the state necessary to do so
    +class json_string_scanner {
    +public:
    +  simdjson_really_inline json_string_block next(const simd::simd8x64& in);
    +  // Returns either UNCLOSED_STRING or SUCCESS
    +  simdjson_really_inline error_code finish();
    +
    +private:
    +  // Scans for escape characters
    +  json_escape_scanner escape_scanner{};
    +  // Whether the last iteration was still inside a string (all 1's = true, all 0's = false).
    +  uint64_t prev_in_string = 0ULL;
    +};
    +
    +//
    +// Return a mask of all string characters plus end quotes.
    +//
    +// prev_escaped is overflow saying whether the next character is escaped.
    +// prev_in_string is overflow saying whether we're still in a string.
    +//
    +// Backslash sequences outside of quotes will be detected in stage 2.
    +//
    +simdjson_really_inline json_string_block json_string_scanner::next(const simd::simd8x64& in) {
    +  const uint64_t backslash = in.eq('\\');
    +  const uint64_t escaped = escape_scanner.next(backslash).escaped;
    +  const uint64_t quote = in.eq('"') & ~escaped;
    +
    +  //
    +  // prefix_xor flips on bits inside the string (and flips off the end quote).
    +  //
    +  // Then we xor with prev_in_string: if we were in a string already, its effect is flipped
    +  // (characters inside strings are outside, and characters outside strings are inside).
    +  //
    +  const uint64_t in_string = prefix_xor(quote) ^ prev_in_string;
    +
    +  //
    +  // Check if we're still in a string at the end of the box so the next block will know
    +  //
    +  prev_in_string = uint64_t(static_cast(in_string) >> 63);
    +
    +  // Use ^ to turn the beginning quote off, and the end quote on.
    +
    +  // We are returning a function-local object so either we get a move constructor
    +  // or we get copy elision.
    +  return json_string_block(escaped, quote, in_string);
    +}
    +
    +simdjson_really_inline error_code json_string_scanner::finish() {
    +  if (prev_in_string) {
    +    return UNCLOSED_STRING;
    +  }
    +  return SUCCESS;
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRING_SCANNER_H
    +/* end file generic/stage1/json_string_scanner.h for westmere */
    +/* including generic/stage1/utf8_lookup4_algorithm.h for westmere: #include  */
    +/* begin file generic/stage1/utf8_lookup4_algorithm.h for westmere */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_UTF8_LOOKUP4_ALGORITHM_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_UTF8_LOOKUP4_ALGORITHM_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace utf8_validation {
    +
    +using namespace simd;
    +
    +  simdjson_inline simd8 check_special_cases(const simd8 input, const simd8 prev1) {
    +// Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII)
    +// Bit 1 = Too Long (ASCII followed by continuation)
    +// Bit 2 = Overlong 3-byte
    +// Bit 4 = Surrogate
    +// Bit 5 = Overlong 2-byte
    +// Bit 7 = Two Continuations
    +    constexpr const uint8_t TOO_SHORT   = 1<<0; // 11______ 0_______
    +                                                // 11______ 11______
    +    constexpr const uint8_t TOO_LONG    = 1<<1; // 0_______ 10______
    +    constexpr const uint8_t OVERLONG_3  = 1<<2; // 11100000 100_____
    +    constexpr const uint8_t SURROGATE   = 1<<4; // 11101101 101_____
    +    constexpr const uint8_t OVERLONG_2  = 1<<5; // 1100000_ 10______
    +    constexpr const uint8_t TWO_CONTS   = 1<<7; // 10______ 10______
    +    constexpr const uint8_t TOO_LARGE   = 1<<3; // 11110100 1001____
    +                                                // 11110100 101_____
    +                                                // 11110101 1001____
    +                                                // 11110101 101_____
    +                                                // 1111011_ 1001____
    +                                                // 1111011_ 101_____
    +                                                // 11111___ 1001____
    +                                                // 11111___ 101_____
    +    constexpr const uint8_t TOO_LARGE_1000 = 1<<6;
    +                                                // 11110101 1000____
    +                                                // 1111011_ 1000____
    +                                                // 11111___ 1000____
    +    constexpr const uint8_t OVERLONG_4  = 1<<6; // 11110000 1000____
    +
    +    const simd8 byte_1_high = prev1.shr<4>().lookup_16(
    +      // 0_______ ________ 
    +      TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG,
    +      TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG,
    +      // 10______ ________ 
    +      TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS,
    +      // 1100____ ________ 
    +      TOO_SHORT | OVERLONG_2,
    +      // 1101____ ________ 
    +      TOO_SHORT,
    +      // 1110____ ________ 
    +      TOO_SHORT | OVERLONG_3 | SURROGATE,
    +      // 1111____ ________ 
    +      TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4
    +    );
    +    constexpr const uint8_t CARRY = TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 .
    +    const simd8 byte_1_low = (prev1 & 0x0F).lookup_16(
    +      // ____0000 ________
    +      CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4,
    +      // ____0001 ________
    +      CARRY | OVERLONG_2,
    +      // ____001_ ________
    +      CARRY,
    +      CARRY,
    +
    +      // ____0100 ________
    +      CARRY | TOO_LARGE,
    +      // ____0101 ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      // ____011_ ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +
    +      // ____1___ ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      // ____1101 ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000
    +    );
    +    const simd8 byte_2_high = input.shr<4>().lookup_16(
    +      // ________ 0_______ 
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT,
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT,
    +
    +      // ________ 1000____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | OVERLONG_4,
    +      // ________ 1001____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE,
    +      // ________ 101_____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE  | TOO_LARGE,
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE  | TOO_LARGE,
    +
    +      // ________ 11______
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT
    +    );
    +    return (byte_1_high & byte_1_low & byte_2_high);
    +  }
    +  simdjson_inline simd8 check_multibyte_lengths(const simd8 input,
    +      const simd8 prev_input, const simd8 sc) {
    +    simd8 prev2 = input.prev<2>(prev_input);
    +    simd8 prev3 = input.prev<3>(prev_input);
    +    simd8 must23 = simd8(must_be_2_3_continuation(prev2, prev3));
    +    simd8 must23_80 = must23 & uint8_t(0x80);
    +    return must23_80 ^ sc;
    +  }
    +
    +  //
    +  // Return nonzero if there are incomplete multibyte characters at the end of the block:
    +  // e.g. if there is a 4-byte character, but it's 3 bytes from the end.
    +  //
    +  simdjson_inline simd8 is_incomplete(const simd8 input) {
    +    // If the previous input's last 3 bytes match this, they're too short (they ended at EOF):
    +    // ... 1111____ 111_____ 11______
    +#if SIMDJSON_IMPLEMENTATION_ICELAKE
    +    static const uint8_t max_array[64] = {
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 0xf0u-1, 0xe0u-1, 0xc0u-1
    +    };
    +#else
    +    static const uint8_t max_array[32] = {
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 0xf0u-1, 0xe0u-1, 0xc0u-1
    +    };
    +#endif
    +    const simd8 max_value(&max_array[sizeof(max_array)-sizeof(simd8)]);
    +    return input.gt_bits(max_value);
    +  }
    +
    +  struct utf8_checker {
    +    // If this is nonzero, there has been a UTF-8 error.
    +    simd8 error;
    +    // The last input we received
    +    simd8 prev_input_block;
    +    // Whether the last input we received was incomplete (used for ASCII fast path)
    +    simd8 prev_incomplete;
    +
    +    //
    +    // Check whether the current bytes are valid UTF-8.
    +    //
    +    simdjson_inline void check_utf8_bytes(const simd8 input, const simd8 prev_input) {
    +      // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ lead bytes
    +      // (2, 3, 4-byte leads become large positive numbers instead of small negative numbers)
    +      simd8 prev1 = input.prev<1>(prev_input);
    +      simd8 sc = check_special_cases(input, prev1);
    +      this->error |= check_multibyte_lengths(input, prev_input, sc);
    +    }
    +
    +    // The only problem that can happen at EOF is that a multibyte character is too short
    +    // or a byte value too large in the last bytes: check_special_cases only checks for bytes
    +    // too large in the first of two bytes.
    +    simdjson_inline void check_eof() {
    +      // If the previous block had incomplete UTF-8 characters at the end, an ASCII block can't
    +      // possibly finish them.
    +      this->error |= this->prev_incomplete;
    +    }
    +
    +    simdjson_inline void check_next_input(const simd8x64& input) {
    +      if(simdjson_likely(is_ascii(input))) {
    +        this->error |= this->prev_incomplete;
    +      } else {
    +        // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    +        static_assert((simd8x64::NUM_CHUNKS == 1)
    +                ||(simd8x64::NUM_CHUNKS == 2)
    +                || (simd8x64::NUM_CHUNKS == 4),
    +                "We support one, two or four chunks per 64-byte block.");
    +        SIMDJSON_IF_CONSTEXPR (simd8x64::NUM_CHUNKS == 1) {
    +          this->check_utf8_bytes(input.chunks[0], this->prev_input_block);
    +        } else SIMDJSON_IF_CONSTEXPR (simd8x64::NUM_CHUNKS == 2) {
    +          this->check_utf8_bytes(input.chunks[0], this->prev_input_block);
    +          this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +        } else SIMDJSON_IF_CONSTEXPR (simd8x64::NUM_CHUNKS == 4) {
    +          this->check_utf8_bytes(input.chunks[0], this->prev_input_block);
    +          this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +          this->check_utf8_bytes(input.chunks[2], input.chunks[1]);
    +          this->check_utf8_bytes(input.chunks[3], input.chunks[2]);
    +        }
    +        this->prev_incomplete = is_incomplete(input.chunks[simd8x64::NUM_CHUNKS-1]);
    +        this->prev_input_block = input.chunks[simd8x64::NUM_CHUNKS-1];
    +      }
    +    }
    +    // do not forget to call check_eof!
    +    simdjson_inline error_code errors() {
    +      return this->error.any_bits_set_anywhere() ? error_code::UTF8_ERROR : error_code::SUCCESS;
    +    }
    +
    +  }; // struct utf8_checker
    +} // namespace utf8_validation
    +
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_UTF8_LOOKUP4_ALGORITHM_H
    +/* end file generic/stage1/utf8_lookup4_algorithm.h for westmere */
    +/* including generic/stage1/json_scanner.h for westmere: #include  */
    +/* begin file generic/stage1/json_scanner.h for westmere */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_SCANNER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_SCANNER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace stage1 {
    +
    +/**
    + * A block of scanned json, with information on operators and scalars.
    + *
    + * We seek to identify pseudo-structural characters. Anything that is inside
    + * a string must be omitted (hence  & ~_string.string_tail()).
    + * Otherwise, pseudo-structural characters come in two forms.
    + * 1. We have the structural characters ([,],{,},:, comma). The
    + *    term 'structural character' is from the JSON RFC.
    + * 2. We have the 'scalar pseudo-structural characters'.
    + *    Scalars are quotes, and any character except structural characters and white space.
    + *
    + * To identify the scalar pseudo-structural characters, we must look at what comes
    + * before them: it must be a space, a quote or a structural characters.
    + * Starting with simdjson v0.3, we identify them by
    + * negation: we identify everything that is followed by a non-quote scalar,
    + * and we negate that. Whatever remains must be a 'scalar pseudo-structural character'.
    + */
    +struct json_block {
    +public:
    +  // We spell out the constructors in the hope of resolving inlining issues with Visual Studio 2017
    +  simdjson_inline json_block(json_string_block&& string, json_character_block characters, uint64_t follows_potential_nonquote_scalar) :
    +  _string(std::move(string)), _characters(characters), _follows_potential_nonquote_scalar(follows_potential_nonquote_scalar) {}
    +  simdjson_inline json_block(json_string_block string, json_character_block characters, uint64_t follows_potential_nonquote_scalar) :
    +  _string(string), _characters(characters), _follows_potential_nonquote_scalar(follows_potential_nonquote_scalar) {}
    +
    +  /**
    +   * The start of structurals.
    +   * In simdjson prior to v0.3, these were called the pseudo-structural characters.
    +   **/
    +  simdjson_inline uint64_t structural_start() const noexcept { return potential_structural_start() & ~_string.string_tail(); }
    +  /** All JSON whitespace (i.e. not in a string) */
    +  simdjson_inline uint64_t whitespace() const noexcept { return non_quote_outside_string(_characters.whitespace()); }
    +
    +  // Helpers
    +
    +  /** Whether the given characters are inside a string (only works on non-quotes) */
    +  simdjson_inline uint64_t non_quote_inside_string(uint64_t mask) const noexcept { return _string.non_quote_inside_string(mask); }
    +  /** Whether the given characters are outside a string (only works on non-quotes) */
    +  simdjson_inline uint64_t non_quote_outside_string(uint64_t mask) const noexcept { return _string.non_quote_outside_string(mask); }
    +
    +  // string and escape characters
    +  json_string_block _string;
    +  // whitespace, structural characters ('operators'), scalars
    +  json_character_block _characters;
    +  // whether the previous character was a scalar
    +  uint64_t _follows_potential_nonquote_scalar;
    +private:
    +  // Potential structurals (i.e. disregarding strings)
    +
    +  /**
    +   * structural elements ([,],{,},:, comma) plus scalar starts like 123, true and "abc".
    +   * They may reside inside a string.
    +   **/
    +  simdjson_inline uint64_t potential_structural_start() const noexcept { return _characters.op() | potential_scalar_start(); }
    +  /**
    +   * The start of non-operator runs, like 123, true and "abc".
    +   * It main reside inside a string.
    +   **/
    +  simdjson_inline uint64_t potential_scalar_start() const noexcept {
    +    // The term "scalar" refers to anything except structural characters and white space
    +    // (so letters, numbers, quotes).
    +    // Whenever it is preceded by something that is not a structural element ({,},[,],:, ") nor a white-space
    +    // then we know that it is irrelevant structurally.
    +    return _characters.scalar() & ~follows_potential_scalar();
    +  }
    +  /**
    +   * Whether the given character is immediately after a non-operator like 123, true.
    +   * The characters following a quote are not included.
    +   */
    +  simdjson_inline uint64_t follows_potential_scalar() const noexcept {
    +    // _follows_potential_nonquote_scalar: is defined as marking any character that follows a character
    +    // that is not a structural element ({,},[,],:, comma) nor a quote (") and that is not a
    +    // white space.
    +    // It is understood that within quoted region, anything at all could be marked (irrelevant).
    +    return _follows_potential_nonquote_scalar;
    +  }
    +};
    +
    +/**
    + * Scans JSON for important bits: structural characters or 'operators', strings, and scalars.
    + *
    + * The scanner starts by calculating two distinct things:
    + * - string characters (taking \" into account)
    + * - structural characters or 'operators' ([]{},:, comma)
    + *   and scalars (runs of non-operators like 123, true and "abc")
    + *
    + * To minimize data dependency (a key component of the scanner's speed), it finds these in parallel:
    + * in particular, the operator/scalar bit will find plenty of things that are actually part of
    + * strings. When we're done, json_block will fuse the two together by masking out tokens that are
    + * part of a string.
    + */
    +class json_scanner {
    +public:
    +  json_scanner() = default;
    +  simdjson_inline json_block next(const simd::simd8x64& in);
    +  // Returns either UNCLOSED_STRING or SUCCESS
    +  simdjson_inline error_code finish();
    +
    +private:
    +  // Whether the last character of the previous iteration is part of a scalar token
    +  // (anything except whitespace or a structural character/'operator').
    +  uint64_t prev_scalar = 0ULL;
    +  json_string_scanner string_scanner{};
    +};
    +
    +
    +//
    +// Check if the current character immediately follows a matching character.
    +//
    +// For example, this checks for quotes with backslashes in front of them:
    +//
    +//     const uint64_t backslashed_quote = in.eq('"') & immediately_follows(in.eq('\'), prev_backslash);
    +//
    +simdjson_inline uint64_t follows(const uint64_t match, uint64_t &overflow) {
    +  const uint64_t result = match << 1 | overflow;
    +  overflow = match >> 63;
    +  return result;
    +}
    +
    +simdjson_inline json_block json_scanner::next(const simd::simd8x64& in) {
    +  json_string_block strings = string_scanner.next(in);
    +  // identifies the white-space and the structural characters
    +  json_character_block characters = json_character_block::classify(in);
    +  // The term "scalar" refers to anything except structural characters and white space
    +  // (so letters, numbers, quotes).
    +  // We want follows_scalar to mark anything that follows a non-quote scalar (so letters and numbers).
    +  //
    +  // A terminal quote should either be followed by a structural character (comma, brace, bracket, colon)
    +  // or nothing. However, we still want ' "a string"true ' to mark the 't' of 'true' as a potential
    +  // pseudo-structural character just like we would if we had  ' "a string" true '; otherwise we
    +  // may need to add an extra check when parsing strings.
    +  //
    +  // Performance: there are many ways to skin this cat.
    +  const uint64_t nonquote_scalar = characters.scalar() & ~strings.quote();
    +  uint64_t follows_nonquote_scalar = follows(nonquote_scalar, prev_scalar);
    +  // We are returning a function-local object so either we get a move constructor
    +  // or we get copy elision.
    +  return json_block(
    +    strings,// strings is a function-local object so either it moves or the copy is elided.
    +    characters,
    +    follows_nonquote_scalar
    +  );
    +}
    +
    +simdjson_inline error_code json_scanner::finish() {
    +  return string_scanner.finish();
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_SCANNER_H
    +/* end file generic/stage1/json_scanner.h for westmere */
    +
    +// All other declarations
    +/* including generic/stage1/find_next_document_index.h for westmere: #include  */
    +/* begin file generic/stage1/find_next_document_index.h for westmere */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace stage1 {
    +
    +/**
    +  * This algorithm is used to quickly identify the last structural position that
    +  * makes up a complete document.
    +  *
    +  * It does this by going backwards and finding the last *document boundary* (a
    +  * place where one value follows another without a comma between them). If the
    +  * last document (the characters after the boundary) has an equal number of
    +  * start and end brackets, it is considered complete.
    +  *
    +  * Simply put, we iterate over the structural characters, starting from
    +  * the end. We consider that we found the end of a JSON document when the
    +  * first element of the pair is NOT one of these characters: '{' '[' ':' ','
    +  * and when the second element is NOT one of these characters: '}' ']' ':' ','.
    +  *
    +  * This simple comparison works most of the time, but it does not cover cases
    +  * where the batch's structural indexes contain a perfect amount of documents.
    +  * In such a case, we do not have access to the structural index which follows
    +  * the last document, therefore, we do not have access to the second element in
    +  * the pair, and that means we cannot identify the last document. To fix this
    +  * issue, we keep a count of the open and closed curly/square braces we found
    +  * while searching for the pair. When we find a pair AND the count of open and
    +  * closed curly/square braces is the same, we know that we just passed a
    +  * complete document, therefore the last json buffer location is the end of the
    +  * batch.
    +  */
    +simdjson_inline uint32_t find_next_document_index(dom_parser_implementation &parser) {
    +  // Variant: do not count separately, just figure out depth
    +  if(parser.n_structural_indexes == 0) { return 0; }
    +  auto arr_cnt = 0;
    +  auto obj_cnt = 0;
    +  for (auto i = parser.n_structural_indexes - 1; i > 0; i--) {
    +    auto idxb = parser.structural_indexes[i];
    +    switch (parser.buf[idxb]) {
    +    case ':':
    +    case ',':
    +      continue;
    +    case '}':
    +      obj_cnt--;
    +      continue;
    +    case ']':
    +      arr_cnt--;
    +      continue;
    +    case '{':
    +      obj_cnt++;
    +      break;
    +    case '[':
    +      arr_cnt++;
    +      break;
    +    }
    +    auto idxa = parser.structural_indexes[i - 1];
    +    switch (parser.buf[idxa]) {
    +    case '{':
    +    case '[':
    +    case ':':
    +    case ',':
    +      continue;
    +    }
    +    // Last document is complete, so the next document will appear after!
    +    if (!arr_cnt && !obj_cnt) {
    +      return parser.n_structural_indexes;
    +    }
    +    // Last document is incomplete; mark the document at i + 1 as the next one
    +    return i;
    +  }
    +  // If we made it to the end, we want to finish counting to see if we have a full document.
    +  switch (parser.buf[parser.structural_indexes[0]]) {
    +    case '}':
    +      obj_cnt--;
    +      break;
    +    case ']':
    +      arr_cnt--;
    +      break;
    +    case '{':
    +      obj_cnt++;
    +      break;
    +    case '[':
    +      arr_cnt++;
    +      break;
    +  }
    +  if (!arr_cnt && !obj_cnt) {
    +    // We have a complete document.
    +    return parser.n_structural_indexes;
    +  }
    +  return 0;
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_FIND_NEXT_DOCUMENT_INDEX_H
    +/* end file generic/stage1/find_next_document_index.h for westmere */
    +/* including generic/stage1/json_minifier.h for westmere: #include  */
    +/* begin file generic/stage1/json_minifier.h for westmere */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_MINIFIER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_MINIFIER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This file contains the common code every implementation uses in stage1
    +// It is intended to be included multiple times and compiled multiple times
    +// We assume the file in which it is included already includes
    +// "simdjson/stage1.h" (this simplifies amalgation)
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace stage1 {
    +
    +class json_minifier {
    +public:
    +  template
    +  static error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) noexcept;
    +
    +private:
    +  simdjson_inline json_minifier(uint8_t *_dst)
    +  : dst{_dst}
    +  {}
    +  template
    +  simdjson_inline void step(const uint8_t *block_buf, buf_block_reader &reader) noexcept;
    +  simdjson_inline void next(const simd::simd8x64& in, const json_block& block);
    +  simdjson_inline error_code finish(uint8_t *dst_start, size_t &dst_len);
    +  json_scanner scanner{};
    +  uint8_t *dst;
    +};
    +
    +simdjson_inline void json_minifier::next(const simd::simd8x64& in, const json_block& block) {
    +  uint64_t mask = block.whitespace();
    +  dst += in.compress(mask, dst);
    +}
    +
    +simdjson_inline error_code json_minifier::finish(uint8_t *dst_start, size_t &dst_len) {
    +  error_code error = scanner.finish();
    +  if (error) { dst_len = 0; return error; }
    +  dst_len = dst - dst_start;
    +  return SUCCESS;
    +}
    +
    +template<>
    +simdjson_inline void json_minifier::step<128>(const uint8_t *block_buf, buf_block_reader<128> &reader) noexcept {
    +  simd::simd8x64 in_1(block_buf);
    +  simd::simd8x64 in_2(block_buf+64);
    +  json_block block_1 = scanner.next(in_1);
    +  json_block block_2 = scanner.next(in_2);
    +  this->next(in_1, block_1);
    +  this->next(in_2, block_2);
    +  reader.advance();
    +}
    +
    +template<>
    +simdjson_inline void json_minifier::step<64>(const uint8_t *block_buf, buf_block_reader<64> &reader) noexcept {
    +  simd::simd8x64 in_1(block_buf);
    +  json_block block_1 = scanner.next(in_1);
    +  this->next(block_buf, block_1);
    +  reader.advance();
    +}
    +
    +template
    +error_code json_minifier::minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) noexcept {
    +  buf_block_reader reader(buf, len);
    +  json_minifier minifier(dst);
    +
    +  // Index the first n-1 blocks
    +  while (reader.has_full_block()) {
    +    minifier.step(reader.full_block(), reader);
    +  }
    +
    +  // Index the last (remainder) block, padded with spaces
    +  uint8_t block[STEP_SIZE];
    +  size_t remaining_bytes = reader.get_remainder(block);
    +  if (remaining_bytes > 0) {
    +    // We do not want to write directly to the output stream. Rather, we write
    +    // to a local buffer (for safety).
    +    uint8_t out_block[STEP_SIZE];
    +    uint8_t * const guarded_dst{minifier.dst};
    +    minifier.dst = out_block;
    +    minifier.step(block, reader);
    +    size_t to_write = minifier.dst - out_block;
    +    // In some cases, we could be enticed to consider the padded spaces
    +    // as part of the string. This is fine as long as we do not write more
    +    // than we consumed.
    +    if(to_write > remaining_bytes) { to_write = remaining_bytes; }
    +    memcpy(guarded_dst, out_block, to_write);
    +    minifier.dst = guarded_dst + to_write;
    +  }
    +  return minifier.finish(dst, dst_len);
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_MINIFIER_H
    +/* end file generic/stage1/json_minifier.h for westmere */
    +/* including generic/stage1/json_structural_indexer.h for westmere: #include  */
    +/* begin file generic/stage1/json_structural_indexer.h for westmere */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRUCTURAL_INDEXER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRUCTURAL_INDEXER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This file contains the common code every implementation uses in stage1
    +// It is intended to be included multiple times and compiled multiple times
    +// We assume the file in which it is included already includes
    +// "simdjson/stage1.h" (this simplifies amalgation)
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace stage1 {
    +
    +class bit_indexer {
    +public:
    +  uint32_t *tail;
    +
    +  simdjson_inline bit_indexer(uint32_t *index_buf) : tail(index_buf) {}
    +
    +#if SIMDJSON_PREFER_REVERSE_BITS
    +  /**
    +    * ARM lacks a fast trailing zero instruction, but it has a fast
    +    * bit reversal instruction and a fast leading zero instruction.
    +    * Thus it may be profitable to reverse the bits (once) and then
    +    * to rely on a sequence of instructions that call the leading
    +    * zero instruction.
    +    *
    +    * Performance notes:
    +    * The chosen routine is not optimal in terms of data dependency
    +    * since zero_leading_bit might require two instructions. However,
    +    * it tends to minimize the total number of instructions which is
    +    * beneficial.
    +    */
    +  simdjson_inline void write_index(uint32_t idx, uint64_t& rev_bits, int i) {
    +    int lz = leading_zeroes(rev_bits);
    +    this->tail[i] = static_cast(idx) + lz;
    +    rev_bits = zero_leading_bit(rev_bits, lz);
    +  }
    +#else
    +  /**
    +    * Under recent x64 systems, we often have both a fast trailing zero
    +    * instruction and a fast 'clear-lower-bit' instruction so the following
    +    * algorithm can be competitive.
    +    */
    +
    +  simdjson_inline void write_index(uint32_t idx, uint64_t& bits, int i) {
    +    this->tail[i] = idx + trailing_zeroes(bits);
    +    bits = clear_lowest_bit(bits);
    +  }
    +#endif // SIMDJSON_PREFER_REVERSE_BITS
    +
    +  template 
    +  simdjson_inline int write_indexes(uint32_t idx, uint64_t& bits) {
    +    write_index(idx, bits, START);
    +    SIMDJSON_IF_CONSTEXPR (N > 1) {
    +      write_indexes<(N-1>0?START+1:START), (N-1>=0?N-1:1)>(idx, bits);
    +    }
    +    return START+N;
    +  }
    +
    +  template 
    +  simdjson_inline int write_indexes_stepped(uint32_t idx, uint64_t& bits, int cnt) {
    +    write_indexes(idx, bits);
    +    SIMDJSON_IF_CONSTEXPR ((START+STEP)  < END) {
    +      if (simdjson_unlikely((START+STEP) < cnt)) {
    +        write_indexes_stepped<(START+STEP(idx, bits, cnt);
    +      }
    +    }
    +    return ((END-START) % STEP) == 0 ? END : (END-START) - ((END-START) % STEP) + STEP;
    +  }
    +
    +  // flatten out values in 'bits' assuming that they are are to have values of idx
    +  // plus their position in the bitvector, and store these indexes at
    +  // base_ptr[base] incrementing base as we go
    +  // will potentially store extra values beyond end of valid bits, so base_ptr
    +  // needs to be large enough to handle this
    +  //
    +  // If the kernel sets SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER, then it
    +  // will provide its own version of the code.
    +#ifdef SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER
    +  simdjson_inline void write(uint32_t idx, uint64_t bits);
    +#else
    +  simdjson_inline void write(uint32_t idx, uint64_t bits) {
    +    // In some instances, the next branch is expensive because it is mispredicted.
    +    // Unfortunately, in other cases,
    +    // it helps tremendously.
    +    if (bits == 0)
    +        return;
    +
    +    int cnt = static_cast(count_ones(bits));
    +
    +#if SIMDJSON_PREFER_REVERSE_BITS
    +    bits = reverse_bits(bits);
    +#endif
    +#ifdef SIMDJSON_STRUCTURAL_INDEXER_STEP
    +    static constexpr const int STEP = SIMDJSON_STRUCTURAL_INDEXER_STEP;
    +#else
    +    static constexpr const int STEP = 4;
    +#endif
    +    static constexpr const int STEP_UNTIL = 24;
    +
    +    write_indexes_stepped<0, STEP_UNTIL, STEP>(idx, bits, cnt);
    +    SIMDJSON_IF_CONSTEXPR (STEP_UNTIL < 64) {
    +      if (simdjson_unlikely(STEP_UNTIL < cnt)) {
    +        for (int i=STEP_UNTIL; itail += cnt;
    +  }
    +#endif // SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER
    +
    +};
    +
    +class json_structural_indexer {
    +public:
    +  /**
    +   * Find the important bits of JSON in a 128-byte chunk, and add them to structural_indexes.
    +   *
    +   * @param partial Setting the partial parameter to true allows the find_structural_bits to
    +   *   tolerate unclosed strings. The caller should still ensure that the input is valid UTF-8. If
    +   *   you are processing substrings, you may want to call on a function like trimmed_length_safe_utf8.
    +   */
    +  template
    +  static error_code index(const uint8_t *buf, size_t len, dom_parser_implementation &parser, stage1_mode partial) noexcept;
    +
    +private:
    +  simdjson_inline json_structural_indexer(uint32_t *structural_indexes);
    +  template
    +  simdjson_inline void step(const uint8_t *block, buf_block_reader &reader) noexcept;
    +  simdjson_inline void next(const simd::simd8x64& in, const json_block& block, size_t idx);
    +  simdjson_inline error_code finish(dom_parser_implementation &parser, size_t idx, size_t len, stage1_mode partial);
    +
    +  json_scanner scanner{};
    +  utf8_checker checker{};
    +  bit_indexer indexer;
    +  uint64_t prev_structurals = 0;
    +  uint64_t unescaped_chars_error = 0;
    +};
    +
    +simdjson_inline json_structural_indexer::json_structural_indexer(uint32_t *structural_indexes) : indexer{structural_indexes} {}
    +
    +// Skip the last character if it is partial
    +simdjson_inline size_t trim_partial_utf8(const uint8_t *buf, size_t len) {
    +  if (simdjson_unlikely(len < 3)) {
    +    switch (len) {
    +      case 2:
    +        if (buf[len-1] >= 0xc0) { return len-1; } // 2-, 3- and 4-byte characters with only 1 byte left
    +        if (buf[len-2] >= 0xe0) { return len-2; } // 3- and 4-byte characters with only 2 bytes left
    +        return len;
    +      case 1:
    +        if (buf[len-1] >= 0xc0) { return len-1; } // 2-, 3- and 4-byte characters with only 1 byte left
    +        return len;
    +      case 0:
    +        return len;
    +    }
    +  }
    +  if (buf[len-1] >= 0xc0) { return len-1; } // 2-, 3- and 4-byte characters with only 1 byte left
    +  if (buf[len-2] >= 0xe0) { return len-2; } // 3- and 4-byte characters with only 1 byte left
    +  if (buf[len-3] >= 0xf0) { return len-3; } // 4-byte characters with only 3 bytes left
    +  return len;
    +}
    +
    +//
    +// PERF NOTES:
    +// We pipe 2 inputs through these stages:
    +// 1. Load JSON into registers. This takes a long time and is highly parallelizable, so we load
    +//    2 inputs' worth at once so that by the time step 2 is looking for them input, it's available.
    +// 2. Scan the JSON for critical data: strings, scalars and operators. This is the critical path.
    +//    The output of step 1 depends entirely on this information. These functions don't quite use
    +//    up enough CPU: the second half of the functions is highly serial, only using 1 execution core
    +//    at a time. The second input's scans has some dependency on the first ones finishing it, but
    +//    they can make a lot of progress before they need that information.
    +// 3. Step 1 doesn't use enough capacity, so we run some extra stuff while we're waiting for that
    +//    to finish: utf-8 checks and generating the output from the last iteration.
    +//
    +// The reason we run 2 inputs at a time, is steps 2 and 3 are *still* not enough to soak up all
    +// available capacity with just one input. Running 2 at a time seems to give the CPU a good enough
    +// workout.
    +//
    +template
    +error_code json_structural_indexer::index(const uint8_t *buf, size_t len, dom_parser_implementation &parser, stage1_mode partial) noexcept {
    +  if (simdjson_unlikely(len > parser.capacity())) { return CAPACITY; }
    +  // We guard the rest of the code so that we can assume that len > 0 throughout.
    +  if (len == 0) { return EMPTY; }
    +  if (is_streaming(partial)) {
    +    len = trim_partial_utf8(buf, len);
    +    // If you end up with an empty window after trimming
    +    // the partial UTF-8 bytes, then chances are good that you
    +    // have an UTF-8 formatting error.
    +    if(len == 0) { return UTF8_ERROR; }
    +  }
    +  buf_block_reader reader(buf, len);
    +  json_structural_indexer indexer(parser.structural_indexes.get());
    +
    +  // Read all but the last block
    +  while (reader.has_full_block()) {
    +    indexer.step(reader.full_block(), reader);
    +  }
    +  // Take care of the last block (will always be there unless file is empty which is
    +  // not supposed to happen.)
    +  uint8_t block[STEP_SIZE];
    +  if (simdjson_unlikely(reader.get_remainder(block) == 0)) { return UNEXPECTED_ERROR; }
    +  indexer.step(block, reader);
    +  return indexer.finish(parser, reader.block_index(), len, partial);
    +}
    +
    +template<>
    +simdjson_inline void json_structural_indexer::step<128>(const uint8_t *block, buf_block_reader<128> &reader) noexcept {
    +  simd::simd8x64 in_1(block);
    +  simd::simd8x64 in_2(block+64);
    +  json_block block_1 = scanner.next(in_1);
    +  json_block block_2 = scanner.next(in_2);
    +  this->next(in_1, block_1, reader.block_index());
    +  this->next(in_2, block_2, reader.block_index()+64);
    +  reader.advance();
    +}
    +
    +template<>
    +simdjson_inline void json_structural_indexer::step<64>(const uint8_t *block, buf_block_reader<64> &reader) noexcept {
    +  simd::simd8x64 in_1(block);
    +  json_block block_1 = scanner.next(in_1);
    +  this->next(in_1, block_1, reader.block_index());
    +  reader.advance();
    +}
    +
    +simdjson_inline void json_structural_indexer::next(const simd::simd8x64& in, const json_block& block, size_t idx) {
    +  uint64_t unescaped = in.lteq(0x1F);
    +#if SIMDJSON_UTF8VALIDATION
    +  checker.check_next_input(in);
    +#endif
    +  indexer.write(uint32_t(idx-64), prev_structurals); // Output *last* iteration's structurals to the parser
    +  prev_structurals = block.structural_start();
    +  unescaped_chars_error |= block.non_quote_inside_string(unescaped);
    +}
    +
    +simdjson_inline error_code json_structural_indexer::finish(dom_parser_implementation &parser, size_t idx, size_t len, stage1_mode partial) {
    +  // Write out the final iteration's structurals
    +  indexer.write(uint32_t(idx-64), prev_structurals);
    +  error_code error = scanner.finish();
    +  // We deliberately break down the next expression so that it is
    +  // human readable.
    +  const bool should_we_exit = is_streaming(partial) ?
    +    ((error != SUCCESS) && (error != UNCLOSED_STRING)) // when partial we tolerate UNCLOSED_STRING
    +    : (error != SUCCESS); // if partial is false, we must have SUCCESS
    +  const bool have_unclosed_string = (error == UNCLOSED_STRING);
    +  if (simdjson_unlikely(should_we_exit)) { return error; }
    +
    +  if (unescaped_chars_error) {
    +    return UNESCAPED_CHARS;
    +  }
    +  parser.n_structural_indexes = uint32_t(indexer.tail - parser.structural_indexes.get());
    +  /***
    +   * The On Demand API requires special padding.
    +   *
    +   * This is related to https://github.com/simdjson/simdjson/issues/906
    +   * Basically, we want to make sure that if the parsing continues beyond the last (valid)
    +   * structural character, it quickly stops.
    +   * Only three structural characters can be repeated without triggering an error in JSON:  [,] and }.
    +   * We repeat the padding character (at 'len'). We don't know what it is, but if the parsing
    +   * continues, then it must be [,] or }.
    +   * Suppose it is ] or }. We backtrack to the first character, what could it be that would
    +   * not trigger an error? It could be ] or } but no, because you can't start a document that way.
    +   * It can't be a comma, a colon or any simple value. So the only way we could continue is
    +   * if the repeated character is [. But if so, the document must start with [. But if the document
    +   * starts with [, it should end with ]. If we enforce that rule, then we would get
    +   * ][[ which is invalid.
    +   *
    +   * This is illustrated with the test array_iterate_unclosed_error() on the following input:
    +   * R"({ "a": [,,)"
    +   **/
    +  parser.structural_indexes[parser.n_structural_indexes] = uint32_t(len); // used later in partial == stage1_mode::streaming_final
    +  parser.structural_indexes[parser.n_structural_indexes + 1] = uint32_t(len);
    +  parser.structural_indexes[parser.n_structural_indexes + 2] = 0;
    +  parser.next_structural_index = 0;
    +  // a valid JSON file cannot have zero structural indexes - we should have found something
    +  if (simdjson_unlikely(parser.n_structural_indexes == 0u)) {
    +    return EMPTY;
    +  }
    +  if (simdjson_unlikely(parser.structural_indexes[parser.n_structural_indexes - 1] > len)) {
    +    return UNEXPECTED_ERROR;
    +  }
    +  if (partial == stage1_mode::streaming_partial) {
    +    // If we have an unclosed string, then the last structural
    +    // will be the quote and we want to make sure to omit it.
    +    if(have_unclosed_string) {
    +      parser.n_structural_indexes--;
    +      // a valid JSON file cannot have zero structural indexes - we should have found something
    +      if (simdjson_unlikely(parser.n_structural_indexes == 0u)) { return CAPACITY; }
    +    }
    +    // We truncate the input to the end of the last complete document (or zero).
    +    auto new_structural_indexes = find_next_document_index(parser);
    +    if (new_structural_indexes == 0 && parser.n_structural_indexes > 0) {
    +      if(parser.structural_indexes[0] == 0) {
    +        // If the buffer is partial and we started at index 0 but the document is
    +        // incomplete, it's too big to parse.
    +        return CAPACITY;
    +      } else {
    +        // It is possible that the document could be parsed, we just had a lot
    +        // of white space.
    +        parser.n_structural_indexes = 0;
    +        return EMPTY;
    +      }
    +    }
    +
    +    parser.n_structural_indexes = new_structural_indexes;
    +  } else if (partial == stage1_mode::streaming_final) {
    +    if(have_unclosed_string) { parser.n_structural_indexes--; }
    +    // We truncate the input to the end of the last complete document (or zero).
    +    // Because partial == stage1_mode::streaming_final, it means that we may
    +    // silently ignore trailing garbage. Though it sounds bad, we do it
    +    // deliberately because many people who have streams of JSON documents
    +    // will truncate them for processing. E.g., imagine that you are uncompressing
    +    // the data from a size file or receiving it in chunks from the network. You
    +    // may not know where exactly the last document will be. Meanwhile the
    +    // document_stream instances allow people to know the JSON documents they are
    +    // parsing (see the iterator.source() method).
    +    parser.n_structural_indexes = find_next_document_index(parser);
    +    // We store the initial n_structural_indexes so that the client can see
    +    // whether we used truncation. If initial_n_structural_indexes == parser.n_structural_indexes,
    +    // then this will query parser.structural_indexes[parser.n_structural_indexes] which is len,
    +    // otherwise, it will copy some prior index.
    +    parser.structural_indexes[parser.n_structural_indexes + 1] = parser.structural_indexes[parser.n_structural_indexes];
    +    // This next line is critical, do not change it unless you understand what you are
    +    // doing.
    +    parser.structural_indexes[parser.n_structural_indexes] = uint32_t(len);
    +    if (simdjson_unlikely(parser.n_structural_indexes == 0u)) {
    +        // We tolerate an unclosed string at the very end of the stream. Indeed, users
    +        // often load their data in bulk without being careful and they want us to ignore
    +        // the trailing garbage.
    +        return EMPTY;
    +    }
    +  }
    +  checker.check_eof();
    +  return checker.errors();
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +// Clear CUSTOM_BIT_INDEXER so other implementations can set it if they need to.
    +#undef SIMDJSON_GENERIC_JSON_STRUCTURAL_INDEXER_CUSTOM_BIT_INDEXER
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_JSON_STRUCTURAL_INDEXER_H
    +/* end file generic/stage1/json_structural_indexer.h for westmere */
    +/* including generic/stage1/utf8_validator.h for westmere: #include  */
    +/* begin file generic/stage1/utf8_validator.h for westmere */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE1_UTF8_VALIDATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE1_UTF8_VALIDATOR_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace stage1 {
    +
    +/**
    + * Validates that the string is actual UTF-8.
    + */
    +template
    +bool generic_validate_utf8(const uint8_t * input, size_t length) {
    +    checker c{};
    +    buf_block_reader<64> reader(input, length);
    +    while (reader.has_full_block()) {
    +      simd::simd8x64 in(reader.full_block());
    +      c.check_next_input(in);
    +      reader.advance();
    +    }
    +    uint8_t block[64]{};
    +    reader.get_remainder(block);
    +    simd::simd8x64 in(block);
    +    c.check_next_input(in);
    +    reader.advance();
    +    c.check_eof();
    +    return c.errors() == error_code::SUCCESS;
    +}
    +
    +bool generic_validate_utf8(const char * input, size_t length) {
    +    return generic_validate_utf8(reinterpret_cast(input),length);
    +}
    +
    +} // namespace stage1
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE1_UTF8_VALIDATOR_H
    +/* end file generic/stage1/utf8_validator.h for westmere */
    +/* end file generic/stage1/amalgamated.h for westmere */
    +/* including generic/stage2/amalgamated.h for westmere: #include  */
    +/* begin file generic/stage2/amalgamated.h for westmere */
    +// Stuff other things depend on
    +/* including generic/stage2/base.h for westmere: #include  */
    +/* begin file generic/stage2/base.h for westmere */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_BASE_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace stage2 {
    +
    +class json_iterator;
    +class structural_iterator;
    +struct tape_builder;
    +struct tape_writer;
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_BASE_H
    +/* end file generic/stage2/base.h for westmere */
    +/* including generic/stage2/tape_writer.h for westmere: #include  */
    +/* begin file generic/stage2/tape_writer.h for westmere */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace stage2 {
    +
    +struct tape_writer {
    +  /** The next place to write to tape */
    +  uint64_t *next_tape_loc;
    +
    +  /** Write a signed 64-bit value to tape. */
    +  simdjson_inline void append_s64(int64_t value) noexcept;
    +
    +  /** Write an unsigned 64-bit value to tape. */
    +  simdjson_inline void append_u64(uint64_t value) noexcept;
    +
    +  /** Write a double value to tape. */
    +  simdjson_inline void append_double(double value) noexcept;
    +
    +  /**
    +   * Append a tape entry (an 8-bit type,and 56 bits worth of value).
    +   */
    +  simdjson_inline void append(uint64_t val, internal::tape_type t) noexcept;
    +
    +  /**
    +   * Skip the current tape entry without writing.
    +   *
    +   * Used to skip the start of the container, since we'll come back later to fill it in when the
    +   * container ends.
    +   */
    +  simdjson_inline void skip() noexcept;
    +
    +  /**
    +   * Skip the number of tape entries necessary to write a large u64 or i64.
    +   */
    +  simdjson_inline void skip_large_integer() noexcept;
    +
    +  /**
    +   * Skip the number of tape entries necessary to write a double.
    +   */
    +  simdjson_inline void skip_double() noexcept;
    +
    +  /**
    +   * Write a value to a known location on tape.
    +   *
    +   * Used to go back and write out the start of a container after the container ends.
    +   */
    +  simdjson_inline static void write(uint64_t &tape_loc, uint64_t val, internal::tape_type t) noexcept;
    +
    +private:
    +  /**
    +   * Append both the tape entry, and a supplementary value following it. Used for types that need
    +   * all 64 bits, such as double and uint64_t.
    +   */
    +  template
    +  simdjson_inline void append2(uint64_t val, T val2, internal::tape_type t) noexcept;
    +}; // struct tape_writer
    +
    +simdjson_inline void tape_writer::append_s64(int64_t value) noexcept {
    +  append2(0, value, internal::tape_type::INT64);
    +}
    +
    +simdjson_inline void tape_writer::append_u64(uint64_t value) noexcept {
    +  append(0, internal::tape_type::UINT64);
    +  *next_tape_loc = value;
    +  next_tape_loc++;
    +}
    +
    +/** Write a double value to tape. */
    +simdjson_inline void tape_writer::append_double(double value) noexcept {
    +  append2(0, value, internal::tape_type::DOUBLE);
    +}
    +
    +simdjson_inline void tape_writer::skip() noexcept {
    +  next_tape_loc++;
    +}
    +
    +simdjson_inline void tape_writer::skip_large_integer() noexcept {
    +  next_tape_loc += 2;
    +}
    +
    +simdjson_inline void tape_writer::skip_double() noexcept {
    +  next_tape_loc += 2;
    +}
    +
    +simdjson_inline void tape_writer::append(uint64_t val, internal::tape_type t) noexcept {
    +  *next_tape_loc = val | ((uint64_t(char(t))) << 56);
    +  next_tape_loc++;
    +}
    +
    +template
    +simdjson_inline void tape_writer::append2(uint64_t val, T val2, internal::tape_type t) noexcept {
    +  append(val, t);
    +  static_assert(sizeof(val2) == sizeof(*next_tape_loc), "Type is not 64 bits!");
    +  memcpy(next_tape_loc, &val2, sizeof(val2));
    +  next_tape_loc++;
    +}
    +
    +simdjson_inline void tape_writer::write(uint64_t &tape_loc, uint64_t val, internal::tape_type t) noexcept {
    +  tape_loc = val | ((uint64_t(char(t))) << 56);
    +}
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_TAPE_WRITER_H
    +/* end file generic/stage2/tape_writer.h for westmere */
    +/* including generic/stage2/logger.h for westmere: #include  */
    +/* begin file generic/stage2/logger.h for westmere */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_LOGGER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_LOGGER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +
    +// This is for an internal-only stage 2 specific logger.
    +// Set LOG_ENABLED = true to log what stage 2 is doing!
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace logger {
    +
    +  static constexpr const char * DASHES = "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------";
    +
    +#if SIMDJSON_VERBOSE_LOGGING
    +  static constexpr const bool LOG_ENABLED = true;
    +#else
    +  static constexpr const bool LOG_ENABLED = false;
    +#endif
    +  static constexpr const int LOG_EVENT_LEN = 20;
    +  static constexpr const int LOG_BUFFER_LEN = 30;
    +  static constexpr const int LOG_SMALL_BUFFER_LEN = 10;
    +  static constexpr const int LOG_INDEX_LEN = 5;
    +
    +  static int log_depth; // Not threadsafe. Log only.
    +
    +  // Helper to turn unprintable or newline characters into spaces
    +  static simdjson_inline char printable_char(char c) {
    +    if (c >= 0x20) {
    +      return c;
    +    } else {
    +      return ' ';
    +    }
    +  }
    +
    +  // Print the header and set up log_start
    +  static simdjson_inline void log_start() {
    +    if (LOG_ENABLED) {
    +      log_depth = 0;
    +      printf("\n");
    +      printf("| %-*s | %-*s | %-*s | %-*s | Detail |\n", LOG_EVENT_LEN, "Event", LOG_BUFFER_LEN, "Buffer", LOG_SMALL_BUFFER_LEN, "Next", 5, "Next#");
    +      printf("|%.*s|%.*s|%.*s|%.*s|--------|\n", LOG_EVENT_LEN+2, DASHES, LOG_BUFFER_LEN+2, DASHES, LOG_SMALL_BUFFER_LEN+2, DASHES, 5+2, DASHES);
    +    }
    +  }
    +
    +  simdjson_unused static simdjson_inline void log_string(const char *message) {
    +    if (LOG_ENABLED) {
    +      printf("%s\n", message);
    +    }
    +  }
    +
    +  // Logs a single line from the stage 2 DOM parser
    +  template
    +  static simdjson_inline void log_line(S &structurals, const char *title_prefix, const char *title, const char *detail) {
    +    if (LOG_ENABLED) {
    +      printf("| %*s%s%-*s ", log_depth*2, "", title_prefix, LOG_EVENT_LEN - log_depth*2 - int(strlen(title_prefix)), title);
    +      auto current_index = structurals.at_beginning() ? nullptr : structurals.next_structural-1;
    +      auto next_index = structurals.next_structural;
    +      auto current = current_index ? &structurals.buf[*current_index] : reinterpret_cast("                                                       ");
    +      auto next = &structurals.buf[*next_index];
    +      {
    +        // Print the next N characters in the buffer.
    +        printf("| ");
    +        // Otherwise, print the characters starting from the buffer position.
    +        // Print spaces for unprintable or newline characters.
    +        for (int i=0;i */
    +/* begin file generic/stage2/json_iterator.h for westmere */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace stage2 {
    +
    +class json_iterator {
    +public:
    +  const uint8_t* const buf;
    +  uint32_t *next_structural;
    +  dom_parser_implementation &dom_parser;
    +  uint32_t depth{0};
    +
    +  /**
    +   * Walk the JSON document.
    +   *
    +   * The visitor receives callbacks when values are encountered. All callbacks pass the iterator as
    +   * the first parameter; some callbacks have other parameters as well:
    +   *
    +   * - visit_document_start() - at the beginning.
    +   * - visit_document_end() - at the end (if things were successful).
    +   *
    +   * - visit_array_start() - at the start `[` of a non-empty array.
    +   * - visit_array_end() - at the end `]` of a non-empty array.
    +   * - visit_empty_array() - when an empty array is encountered.
    +   *
    +   * - visit_object_end() - at the start `]` of a non-empty object.
    +   * - visit_object_start() - at the end `]` of a non-empty object.
    +   * - visit_empty_object() - when an empty object is encountered.
    +   * - visit_key(const uint8_t *key) - when a key in an object field is encountered. key is
    +   *                                   guaranteed to point at the first quote of the string (`"key"`).
    +   * - visit_primitive(const uint8_t *value) - when a value is a string, number, boolean or null.
    +   * - visit_root_primitive(iter, uint8_t *value) - when the top-level value is a string, number, boolean or null.
    +   *
    +   * - increment_count(iter) - each time a value is found in an array or object.
    +   */
    +  template
    +  simdjson_warn_unused simdjson_inline error_code walk_document(V &visitor) noexcept;
    +
    +  /**
    +   * Create an iterator capable of walking a JSON document.
    +   *
    +   * The document must have already passed through stage 1.
    +   */
    +  simdjson_inline json_iterator(dom_parser_implementation &_dom_parser, size_t start_structural_index);
    +
    +  /**
    +   * Look at the next token.
    +   *
    +   * Tokens can be strings, numbers, booleans, null, or operators (`[{]},:`)).
    +   *
    +   * They may include invalid JSON as well (such as `1.2.3` or `ture`).
    +   */
    +  simdjson_inline const uint8_t *peek() const noexcept;
    +  /**
    +   * Advance to the next token.
    +   *
    +   * Tokens can be strings, numbers, booleans, null, or operators (`[{]},:`)).
    +   *
    +   * They may include invalid JSON as well (such as `1.2.3` or `ture`).
    +   */
    +  simdjson_inline const uint8_t *advance() noexcept;
    +  /**
    +   * Get the remaining length of the document, from the start of the current token.
    +   */
    +  simdjson_inline size_t remaining_len() const noexcept;
    +  /**
    +   * Check if we are at the end of the document.
    +   *
    +   * If this is true, there are no more tokens.
    +   */
    +  simdjson_inline bool at_eof() const noexcept;
    +  /**
    +   * Check if we are at the beginning of the document.
    +   */
    +  simdjson_inline bool at_beginning() const noexcept;
    +  simdjson_inline uint8_t last_structural() const noexcept;
    +
    +  /**
    +   * Log that a value has been found.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_value(const char *type) const noexcept;
    +  /**
    +   * Log the start of a multipart value.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_start_value(const char *type) const noexcept;
    +  /**
    +   * Log the end of a multipart value.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_end_value(const char *type) const noexcept;
    +  /**
    +   * Log an error.
    +   *
    +   * Set LOG_ENABLED=true in logger.h to see logging.
    +   */
    +  simdjson_inline void log_error(const char *error) const noexcept;
    +
    +  template
    +  simdjson_warn_unused simdjson_inline error_code visit_root_primitive(V &visitor, const uint8_t *value) noexcept;
    +  template
    +  simdjson_warn_unused simdjson_inline error_code visit_primitive(V &visitor, const uint8_t *value) noexcept;
    +};
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code json_iterator::walk_document(V &visitor) noexcept {
    +  logger::log_start();
    +
    +  //
    +  // Start the document
    +  //
    +  if (at_eof()) { return EMPTY; }
    +  log_start_value("document");
    +  SIMDJSON_TRY( visitor.visit_document_start(*this) );
    +
    +  //
    +  // Read first value
    +  //
    +  {
    +    auto value = advance();
    +
    +    // Make sure the outer object or array is closed before continuing; otherwise, there are ways we
    +    // could get into memory corruption. See https://github.com/simdjson/simdjson/issues/906
    +    if (!STREAMING) {
    +      switch (*value) {
    +        case '{': if (last_structural() != '}') { log_value("starting brace unmatched"); return TAPE_ERROR; }; break;
    +        case '[': if (last_structural() != ']') { log_value("starting bracket unmatched"); return TAPE_ERROR; }; break;
    +      }
    +    }
    +
    +    switch (*value) {
    +      case '{': if (*peek() == '}') { advance(); log_value("empty object"); SIMDJSON_TRY( visitor.visit_empty_object(*this) ); break; } goto object_begin;
    +      case '[': if (*peek() == ']') { advance(); log_value("empty array"); SIMDJSON_TRY( visitor.visit_empty_array(*this) ); break; } goto array_begin;
    +      default: SIMDJSON_TRY( visitor.visit_root_primitive(*this, value) ); break;
    +    }
    +  }
    +  goto document_end;
    +
    +//
    +// Object parser states
    +//
    +object_begin:
    +  log_start_value("object");
    +  depth++;
    +  if (depth >= dom_parser.max_depth()) { log_error("Exceeded max depth!"); return DEPTH_ERROR; }
    +  dom_parser.is_array[depth] = false;
    +  SIMDJSON_TRY( visitor.visit_object_start(*this) );
    +
    +  {
    +    auto key = advance();
    +    if (*key != '"') { log_error("Object does not start with a key"); return TAPE_ERROR; }
    +    SIMDJSON_TRY( visitor.increment_count(*this) );
    +    SIMDJSON_TRY( visitor.visit_key(*this, key) );
    +  }
    +
    +object_field:
    +  if (simdjson_unlikely( *advance() != ':' )) { log_error("Missing colon after key in object"); return TAPE_ERROR; }
    +  {
    +    auto value = advance();
    +    switch (*value) {
    +      case '{': if (*peek() == '}') { advance(); log_value("empty object"); SIMDJSON_TRY( visitor.visit_empty_object(*this) ); break; } goto object_begin;
    +      case '[': if (*peek() == ']') { advance(); log_value("empty array"); SIMDJSON_TRY( visitor.visit_empty_array(*this) ); break; } goto array_begin;
    +      default: SIMDJSON_TRY( visitor.visit_primitive(*this, value) ); break;
    +    }
    +  }
    +
    +object_continue:
    +  switch (*advance()) {
    +    case ',':
    +      SIMDJSON_TRY( visitor.increment_count(*this) );
    +      {
    +        auto key = advance();
    +        if (simdjson_unlikely( *key != '"' )) { log_error("Key string missing at beginning of field in object"); return TAPE_ERROR; }
    +        SIMDJSON_TRY( visitor.visit_key(*this, key) );
    +      }
    +      goto object_field;
    +    case '}': log_end_value("object"); SIMDJSON_TRY( visitor.visit_object_end(*this) ); goto scope_end;
    +    default: log_error("No comma between object fields"); return TAPE_ERROR;
    +  }
    +
    +scope_end:
    +  depth--;
    +  if (depth == 0) { goto document_end; }
    +  if (dom_parser.is_array[depth]) { goto array_continue; }
    +  goto object_continue;
    +
    +//
    +// Array parser states
    +//
    +array_begin:
    +  log_start_value("array");
    +  depth++;
    +  if (depth >= dom_parser.max_depth()) { log_error("Exceeded max depth!"); return DEPTH_ERROR; }
    +  dom_parser.is_array[depth] = true;
    +  SIMDJSON_TRY( visitor.visit_array_start(*this) );
    +  SIMDJSON_TRY( visitor.increment_count(*this) );
    +
    +array_value:
    +  {
    +    auto value = advance();
    +    switch (*value) {
    +      case '{': if (*peek() == '}') { advance(); log_value("empty object"); SIMDJSON_TRY( visitor.visit_empty_object(*this) ); break; } goto object_begin;
    +      case '[': if (*peek() == ']') { advance(); log_value("empty array"); SIMDJSON_TRY( visitor.visit_empty_array(*this) ); break; } goto array_begin;
    +      default: SIMDJSON_TRY( visitor.visit_primitive(*this, value) ); break;
    +    }
    +  }
    +
    +array_continue:
    +  switch (*advance()) {
    +    case ',': SIMDJSON_TRY( visitor.increment_count(*this) ); goto array_value;
    +    case ']': log_end_value("array"); SIMDJSON_TRY( visitor.visit_array_end(*this) ); goto scope_end;
    +    default: log_error("Missing comma between array values"); return TAPE_ERROR;
    +  }
    +
    +document_end:
    +  log_end_value("document");
    +  SIMDJSON_TRY( visitor.visit_document_end(*this) );
    +
    +  dom_parser.next_structural_index = uint32_t(next_structural - &dom_parser.structural_indexes[0]);
    +
    +  // If we didn't make it to the end, it's an error
    +  if ( !STREAMING && dom_parser.next_structural_index != dom_parser.n_structural_indexes ) {
    +    log_error("More than one JSON value at the root of the document, or extra characters at the end of the JSON!");
    +    return TAPE_ERROR;
    +  }
    +
    +  return SUCCESS;
    +
    +} // walk_document()
    +
    +simdjson_inline json_iterator::json_iterator(dom_parser_implementation &_dom_parser, size_t start_structural_index)
    +  : buf{_dom_parser.buf},
    +    next_structural{&_dom_parser.structural_indexes[start_structural_index]},
    +    dom_parser{_dom_parser} {
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::peek() const noexcept {
    +  return &buf[*(next_structural)];
    +}
    +simdjson_inline const uint8_t *json_iterator::advance() noexcept {
    +  return &buf[*(next_structural++)];
    +}
    +simdjson_inline size_t json_iterator::remaining_len() const noexcept {
    +  return dom_parser.len - *(next_structural-1);
    +}
    +
    +simdjson_inline bool json_iterator::at_eof() const noexcept {
    +  return next_structural == &dom_parser.structural_indexes[dom_parser.n_structural_indexes];
    +}
    +simdjson_inline bool json_iterator::at_beginning() const noexcept {
    +  return next_structural == dom_parser.structural_indexes.get();
    +}
    +simdjson_inline uint8_t json_iterator::last_structural() const noexcept {
    +  return buf[dom_parser.structural_indexes[dom_parser.n_structural_indexes - 1]];
    +}
    +
    +simdjson_inline void json_iterator::log_value(const char *type) const noexcept {
    +  logger::log_line(*this, "", type, "");
    +}
    +
    +simdjson_inline void json_iterator::log_start_value(const char *type) const noexcept {
    +  logger::log_line(*this, "+", type, "");
    +  if (logger::LOG_ENABLED) { logger::log_depth++; }
    +}
    +
    +simdjson_inline void json_iterator::log_end_value(const char *type) const noexcept {
    +  if (logger::LOG_ENABLED) { logger::log_depth--; }
    +  logger::log_line(*this, "-", type, "");
    +}
    +
    +simdjson_inline void json_iterator::log_error(const char *error) const noexcept {
    +  logger::log_line(*this, "", "ERROR", error);
    +}
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code json_iterator::visit_root_primitive(V &visitor, const uint8_t *value) noexcept {
    +  switch (*value) {
    +    case '"': return visitor.visit_root_string(*this, value);
    +    case 't': return visitor.visit_root_true_atom(*this, value);
    +    case 'f': return visitor.visit_root_false_atom(*this, value);
    +    case 'n': return visitor.visit_root_null_atom(*this, value);
    +    case '-':
    +    case '0': case '1': case '2': case '3': case '4':
    +    case '5': case '6': case '7': case '8': case '9':
    +      return visitor.visit_root_number(*this, value);
    +    default:
    +      log_error("Document starts with a non-value character");
    +      return TAPE_ERROR;
    +  }
    +}
    +template
    +simdjson_warn_unused simdjson_inline error_code json_iterator::visit_primitive(V &visitor, const uint8_t *value) noexcept {
    +  // Use the fact that most scalars are going to be either strings or numbers.
    +  if(*value == '"') {
    +    return visitor.visit_string(*this, value);
    +  } else if (((*value - '0')  < 10) || (*value == '-')) {
    +    return visitor.visit_number(*this, value);
    +  }
    +  // true, false, null are uncommon.
    +  switch (*value) {
    +    case 't': return visitor.visit_true_atom(*this, value);
    +    case 'f': return visitor.visit_false_atom(*this, value);
    +    case 'n': return visitor.visit_null_atom(*this, value);
    +    default:
    +      log_error("Non-value found when value was expected!");
    +      return TAPE_ERROR;
    +  }
    +}
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_JSON_ITERATOR_H
    +/* end file generic/stage2/json_iterator.h for westmere */
    +/* including generic/stage2/stringparsing.h for westmere: #include  */
    +/* begin file generic/stage2/stringparsing.h for westmere */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This file contains the common code every implementation uses
    +// It is intended to be included multiple times and compiled multiple times
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +/// @private
    +namespace stringparsing {
    +
    +// begin copypasta
    +// These chars yield themselves: " \ /
    +// b -> backspace, f -> formfeed, n -> newline, r -> cr, t -> horizontal tab
    +// u not handled in this table as it's complex
    +static const uint8_t escape_map[256] = {
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0, // 0x0.
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0x22, 0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0x2f,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0, // 0x4.
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0x5c, 0, 0,    0, // 0x5.
    +    0, 0, 0x08, 0, 0,    0, 0x0c, 0, 0, 0, 0, 0, 0,    0, 0x0a, 0, // 0x6.
    +    0, 0, 0x0d, 0, 0x09, 0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0, // 0x7.
    +
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +    0, 0, 0,    0, 0,    0, 0,    0, 0, 0, 0, 0, 0,    0, 0,    0,
    +};
    +
    +// handle a unicode codepoint
    +// write appropriate values into dest
    +// src will advance 6 bytes or 12 bytes
    +// dest will advance a variable amount (return via pointer)
    +// return true if the unicode codepoint was valid
    +// We work in little-endian then swap at write time
    +simdjson_warn_unused
    +simdjson_inline bool handle_unicode_codepoint(const uint8_t **src_ptr,
    +                                            uint8_t **dst_ptr, bool allow_replacement) {
    +  // Use the default Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD)
    +  constexpr uint32_t substitution_code_point = 0xfffd;
    +  // jsoncharutils::hex_to_u32_nocheck fills high 16 bits of the return value with 1s if the
    +  // conversion isn't valid; we defer the check for this to inside the
    +  // multilingual plane check
    +  uint32_t code_point = jsoncharutils::hex_to_u32_nocheck(*src_ptr + 2);
    +  *src_ptr += 6;
    +
    +  // If we found a high surrogate, we must
    +  // check for low surrogate for characters
    +  // outside the Basic
    +  // Multilingual Plane.
    +  if (code_point >= 0xd800 && code_point < 0xdc00) {
    +    const uint8_t *src_data = *src_ptr;
    +    /* Compiler optimizations convert this to a single 16-bit load and compare on most platforms */
    +    if (((src_data[0] << 8) | src_data[1]) != ((static_cast ('\\') << 8) | static_cast ('u'))) {
    +      if(!allow_replacement) { return false; }
    +      code_point = substitution_code_point;
    +    } else {
    +      uint32_t code_point_2 = jsoncharutils::hex_to_u32_nocheck(src_data + 2);
    +
    +      // We have already checked that the high surrogate is valid and
    +      // (code_point - 0xd800) < 1024.
    +      //
    +      // Check that code_point_2 is in the range 0xdc00..0xdfff
    +      // and that code_point_2 was parsed from valid hex.
    +      uint32_t low_bit = code_point_2 - 0xdc00;
    +      if (low_bit >> 10) {
    +        if(!allow_replacement) { return false; }
    +        code_point = substitution_code_point;
    +      } else {
    +        code_point =  (((code_point - 0xd800) << 10) | low_bit) + 0x10000;
    +        *src_ptr += 6;
    +      }
    +
    +    }
    +  } else if (code_point >= 0xdc00 && code_point <= 0xdfff) {
    +      // If we encounter a low surrogate (not preceded by a high surrogate)
    +      // then we have an error.
    +      if(!allow_replacement) { return false; }
    +      code_point = substitution_code_point;
    +  }
    +  size_t offset = jsoncharutils::codepoint_to_utf8(code_point, *dst_ptr);
    +  *dst_ptr += offset;
    +  return offset > 0;
    +}
    +
    +
    +// handle a unicode codepoint using the wobbly convention
    +// https://simonsapin.github.io/wtf-8/
    +// write appropriate values into dest
    +// src will advance 6 bytes or 12 bytes
    +// dest will advance a variable amount (return via pointer)
    +// return true if the unicode codepoint was valid
    +// We work in little-endian then swap at write time
    +simdjson_warn_unused
    +simdjson_inline bool handle_unicode_codepoint_wobbly(const uint8_t **src_ptr,
    +                                            uint8_t **dst_ptr) {
    +  // It is not ideal that this function is nearly identical to handle_unicode_codepoint.
    +  //
    +  // jsoncharutils::hex_to_u32_nocheck fills high 16 bits of the return value with 1s if the
    +  // conversion isn't valid; we defer the check for this to inside the
    +  // multilingual plane check
    +  uint32_t code_point = jsoncharutils::hex_to_u32_nocheck(*src_ptr + 2);
    +  *src_ptr += 6;
    +  // If we found a high surrogate, we must
    +  // check for low surrogate for characters
    +  // outside the Basic
    +  // Multilingual Plane.
    +  if (code_point >= 0xd800 && code_point < 0xdc00) {
    +    const uint8_t *src_data = *src_ptr;
    +    /* Compiler optimizations convert this to a single 16-bit load and compare on most platforms */
    +    if (((src_data[0] << 8) | src_data[1]) == ((static_cast ('\\') << 8) | static_cast ('u'))) {
    +      uint32_t code_point_2 = jsoncharutils::hex_to_u32_nocheck(src_data + 2);
    +      uint32_t low_bit = code_point_2 - 0xdc00;
    +      if ((low_bit >> 10) ==  0) {
    +        code_point =
    +          (((code_point - 0xd800) << 10) | low_bit) + 0x10000;
    +        *src_ptr += 6;
    +      }
    +    }
    +  }
    +
    +  size_t offset = jsoncharutils::codepoint_to_utf8(code_point, *dst_ptr);
    +  *dst_ptr += offset;
    +  return offset > 0;
    +}
    +
    +
    +/**
    + * Unescape a valid UTF-8 string from src to dst, stopping at a final unescaped quote. There
    + * must be an unescaped quote terminating the string. It returns the final output
    + * position as pointer. In case of error (e.g., the string has bad escaped codes),
    + * then null_nullptrptr is returned. It is assumed that the output buffer is large
    + * enough. E.g., if src points at 'joe"', then dst needs to have four free bytes +
    + * SIMDJSON_PADDING bytes.
    + */
    +simdjson_warn_unused simdjson_inline uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) {
    +  while (1) {
    +    // Copy the next n bytes, and find the backslash and quote in them.
    +    auto bs_quote = backslash_and_quote::copy_and_find(src, dst);
    +    // If the next thing is the end quote, copy and return
    +    if (bs_quote.has_quote_first()) {
    +      // we encountered quotes first. Move dst to point to quotes and exit
    +      return dst + bs_quote.quote_index();
    +    }
    +    if (bs_quote.has_backslash()) {
    +      /* find out where the backspace is */
    +      auto bs_dist = bs_quote.backslash_index();
    +      uint8_t escape_char = src[bs_dist + 1];
    +      /* we encountered backslash first. Handle backslash */
    +      if (escape_char == 'u') {
    +        /* move src/dst up to the start; they will be further adjusted
    +           within the unicode codepoint handling code. */
    +        src += bs_dist;
    +        dst += bs_dist;
    +        if (!handle_unicode_codepoint(&src, &dst, allow_replacement)) {
    +          return nullptr;
    +        }
    +      } else {
    +        /* simple 1:1 conversion. Will eat bs_dist+2 characters in input and
    +         * write bs_dist+1 characters to output
    +         * note this may reach beyond the part of the buffer we've actually
    +         * seen. I think this is ok */
    +        uint8_t escape_result = escape_map[escape_char];
    +        if (escape_result == 0u) {
    +          return nullptr; /* bogus escape value is an error */
    +        }
    +        dst[bs_dist] = escape_result;
    +        src += bs_dist + 2;
    +        dst += bs_dist + 1;
    +      }
    +    } else {
    +      /* they are the same. Since they can't co-occur, it means we
    +       * encountered neither. */
    +      src += backslash_and_quote::BYTES_PROCESSED;
    +      dst += backslash_and_quote::BYTES_PROCESSED;
    +    }
    +  }
    +}
    +
    +simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) {
    +  // It is not ideal that this function is nearly identical to parse_string.
    +  while (1) {
    +    // Copy the next n bytes, and find the backslash and quote in them.
    +    auto bs_quote = backslash_and_quote::copy_and_find(src, dst);
    +    // If the next thing is the end quote, copy and return
    +    if (bs_quote.has_quote_first()) {
    +      // we encountered quotes first. Move dst to point to quotes and exit
    +      return dst + bs_quote.quote_index();
    +    }
    +    if (bs_quote.has_backslash()) {
    +      /* find out where the backspace is */
    +      auto bs_dist = bs_quote.backslash_index();
    +      uint8_t escape_char = src[bs_dist + 1];
    +      /* we encountered backslash first. Handle backslash */
    +      if (escape_char == 'u') {
    +        /* move src/dst up to the start; they will be further adjusted
    +           within the unicode codepoint handling code. */
    +        src += bs_dist;
    +        dst += bs_dist;
    +        if (!handle_unicode_codepoint_wobbly(&src, &dst)) {
    +          return nullptr;
    +        }
    +      } else {
    +        /* simple 1:1 conversion. Will eat bs_dist+2 characters in input and
    +         * write bs_dist+1 characters to output
    +         * note this may reach beyond the part of the buffer we've actually
    +         * seen. I think this is ok */
    +        uint8_t escape_result = escape_map[escape_char];
    +        if (escape_result == 0u) {
    +          return nullptr; /* bogus escape value is an error */
    +        }
    +        dst[bs_dist] = escape_result;
    +        src += bs_dist + 2;
    +        dst += bs_dist + 1;
    +      }
    +    } else {
    +      /* they are the same. Since they can't co-occur, it means we
    +       * encountered neither. */
    +      src += backslash_and_quote::BYTES_PROCESSED;
    +      dst += backslash_and_quote::BYTES_PROCESSED;
    +    }
    +  }
    +}
    +
    +} // namespace stringparsing
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H
    +/* end file generic/stage2/stringparsing.h for westmere */
    +/* including generic/stage2/structural_iterator.h for westmere: #include  */
    +/* begin file generic/stage2/structural_iterator.h for westmere */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRUCTURAL_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_STRUCTURAL_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace stage2 {
    +
    +class structural_iterator {
    +public:
    +  const uint8_t* const buf;
    +  uint32_t *next_structural;
    +  dom_parser_implementation &dom_parser;
    +
    +  // Start a structural
    +  simdjson_inline structural_iterator(dom_parser_implementation &_dom_parser, size_t start_structural_index)
    +    : buf{_dom_parser.buf},
    +      next_structural{&_dom_parser.structural_indexes[start_structural_index]},
    +      dom_parser{_dom_parser} {
    +  }
    +  // Get the buffer position of the current structural character
    +  simdjson_inline const uint8_t* current() {
    +    return &buf[*(next_structural-1)];
    +  }
    +  // Get the current structural character
    +  simdjson_inline char current_char() {
    +    return buf[*(next_structural-1)];
    +  }
    +  // Get the next structural character without advancing
    +  simdjson_inline char peek_next_char() {
    +    return buf[*next_structural];
    +  }
    +  simdjson_inline const uint8_t* peek() {
    +    return &buf[*next_structural];
    +  }
    +  simdjson_inline const uint8_t* advance() {
    +    return &buf[*(next_structural++)];
    +  }
    +  simdjson_inline char advance_char() {
    +    return buf[*(next_structural++)];
    +  }
    +  simdjson_inline size_t remaining_len() {
    +    return dom_parser.len - *(next_structural-1);
    +  }
    +
    +  simdjson_inline bool at_end() {
    +    return next_structural == &dom_parser.structural_indexes[dom_parser.n_structural_indexes];
    +  }
    +  simdjson_inline bool at_beginning() {
    +    return next_structural == dom_parser.structural_indexes.get();
    +  }
    +};
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_STRUCTURAL_ITERATOR_H
    +/* end file generic/stage2/structural_iterator.h for westmere */
    +/* including generic/stage2/tape_builder.h for westmere: #include  */
    +/* begin file generic/stage2/tape_builder.h for westmere */
    +#ifndef SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #include  */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace stage2 {
    +
    +struct tape_builder {
    +  template
    +  simdjson_warn_unused static simdjson_inline error_code parse_document(
    +    dom_parser_implementation &dom_parser,
    +    dom::document &doc) noexcept;
    +
    +  /** Called when a non-empty document starts. */
    +  simdjson_warn_unused simdjson_inline error_code visit_document_start(json_iterator &iter) noexcept;
    +  /** Called when a non-empty document ends without error. */
    +  simdjson_warn_unused simdjson_inline error_code visit_document_end(json_iterator &iter) noexcept;
    +
    +  /** Called when a non-empty array starts. */
    +  simdjson_warn_unused simdjson_inline error_code visit_array_start(json_iterator &iter) noexcept;
    +  /** Called when a non-empty array ends. */
    +  simdjson_warn_unused simdjson_inline error_code visit_array_end(json_iterator &iter) noexcept;
    +  /** Called when an empty array is found. */
    +  simdjson_warn_unused simdjson_inline error_code visit_empty_array(json_iterator &iter) noexcept;
    +
    +  /** Called when a non-empty object starts. */
    +  simdjson_warn_unused simdjson_inline error_code visit_object_start(json_iterator &iter) noexcept;
    +  /**
    +   * Called when a key in a field is encountered.
    +   *
    +   * primitive, visit_object_start, visit_empty_object, visit_array_start, or visit_empty_array
    +   * will be called after this with the field value.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code visit_key(json_iterator &iter, const uint8_t *key) noexcept;
    +  /** Called when a non-empty object ends. */
    +  simdjson_warn_unused simdjson_inline error_code visit_object_end(json_iterator &iter) noexcept;
    +  /** Called when an empty object is found. */
    +  simdjson_warn_unused simdjson_inline error_code visit_empty_object(json_iterator &iter) noexcept;
    +
    +  /**
    +   * Called when a string, number, boolean or null is found.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code visit_primitive(json_iterator &iter, const uint8_t *value) noexcept;
    +  /**
    +   * Called when a string, number, boolean or null is found at the top level of a document (i.e.
    +   * when there is no array or object and the entire document is a single string, number, boolean or
    +   * null.
    +   *
    +   * This is separate from primitive() because simdjson's normal primitive parsing routines assume
    +   * there is at least one more token after the value, which is only true in an array or object.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code visit_root_primitive(json_iterator &iter, const uint8_t *value) noexcept;
    +
    +  simdjson_warn_unused simdjson_inline error_code visit_string(json_iterator &iter, const uint8_t *value, bool key = false) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_number(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_true_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_false_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_null_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +
    +  simdjson_warn_unused simdjson_inline error_code visit_root_string(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_number(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_true_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_false_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code visit_root_null_atom(json_iterator &iter, const uint8_t *value) noexcept;
    +
    +  /** Called each time a new field or element in an array or object is found. */
    +  simdjson_warn_unused simdjson_inline error_code increment_count(json_iterator &iter) noexcept;
    +
    +  /** Next location to write to tape */
    +  tape_writer tape;
    +private:
    +  /** Next write location in the string buf for stage 2 parsing */
    +  uint8_t *current_string_buf_loc;
    +
    +  simdjson_inline tape_builder(dom::document &doc) noexcept;
    +
    +  simdjson_inline uint32_t next_tape_index(json_iterator &iter) const noexcept;
    +  simdjson_inline void start_container(json_iterator &iter) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code end_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept;
    +  simdjson_warn_unused simdjson_inline error_code empty_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept;
    +  simdjson_inline uint8_t *on_start_string(json_iterator &iter) noexcept;
    +  simdjson_inline void on_end_string(uint8_t *dst) noexcept;
    +}; // struct tape_builder
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code tape_builder::parse_document(
    +    dom_parser_implementation &dom_parser,
    +    dom::document &doc) noexcept {
    +  dom_parser.doc = &doc;
    +  json_iterator iter(dom_parser, STREAMING ? dom_parser.next_structural_index : 0);
    +  tape_builder builder(doc);
    +  return iter.walk_document(builder);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_primitive(json_iterator &iter, const uint8_t *value) noexcept {
    +  return iter.visit_root_primitive(*this, value);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_primitive(json_iterator &iter, const uint8_t *value) noexcept {
    +  return iter.visit_primitive(*this, value);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_empty_object(json_iterator &iter) noexcept {
    +  return empty_container(iter, internal::tape_type::START_OBJECT, internal::tape_type::END_OBJECT);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_empty_array(json_iterator &iter) noexcept {
    +  return empty_container(iter, internal::tape_type::START_ARRAY, internal::tape_type::END_ARRAY);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_document_start(json_iterator &iter) noexcept {
    +  start_container(iter);
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_object_start(json_iterator &iter) noexcept {
    +  start_container(iter);
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_array_start(json_iterator &iter) noexcept {
    +  start_container(iter);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_object_end(json_iterator &iter) noexcept {
    +  return end_container(iter, internal::tape_type::START_OBJECT, internal::tape_type::END_OBJECT);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_array_end(json_iterator &iter) noexcept {
    +  return end_container(iter, internal::tape_type::START_ARRAY, internal::tape_type::END_ARRAY);
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_document_end(json_iterator &iter) noexcept {
    +  constexpr uint32_t start_tape_index = 0;
    +  tape.append(start_tape_index, internal::tape_type::ROOT);
    +  tape_writer::write(iter.dom_parser.doc->tape[start_tape_index], next_tape_index(iter), internal::tape_type::ROOT);
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_key(json_iterator &iter, const uint8_t *key) noexcept {
    +  return visit_string(iter, key, true);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::increment_count(json_iterator &iter) noexcept {
    +  iter.dom_parser.open_containers[iter.depth].count++; // we have a key value pair in the object at parser.dom_parser.depth - 1
    +  return SUCCESS;
    +}
    +
    +simdjson_inline tape_builder::tape_builder(dom::document &doc) noexcept : tape{doc.tape.get()}, current_string_buf_loc{doc.string_buf.get()} {}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_string(json_iterator &iter, const uint8_t *value, bool key) noexcept {
    +  iter.log_value(key ? "key" : "string");
    +  uint8_t *dst = on_start_string(iter);
    +  dst = stringparsing::parse_string(value+1, dst, false); // We do not allow replacement when the escape characters are invalid.
    +  if (dst == nullptr) {
    +    iter.log_error("Invalid escape in string");
    +    return STRING_ERROR;
    +  }
    +  on_end_string(dst);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_string(json_iterator &iter, const uint8_t *value) noexcept {
    +  return visit_string(iter, value);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_number(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("number");
    +  return numberparsing::parse_number(value, tape);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_number(json_iterator &iter, const uint8_t *value) noexcept {
    +  //
    +  // We need to make a copy to make sure that the string is space terminated.
    +  // This is not about padding the input, which should already padded up
    +  // to len + SIMDJSON_PADDING. However, we have no control at this stage
    +  // on how the padding was done. What if the input string was padded with nulls?
    +  // It is quite common for an input string to have an extra null character (C string).
    +  // We do not want to allow 9\0 (where \0 is the null character) inside a JSON
    +  // document, but the string "9\0" by itself is fine. So we make a copy and
    +  // pad the input with spaces when we know that there is just one input element.
    +  // This copy is relatively expensive, but it will almost never be called in
    +  // practice unless you are in the strange scenario where you have many JSON
    +  // documents made of single atoms.
    +  //
    +  std::unique_ptrcopy(new (std::nothrow) uint8_t[iter.remaining_len() + SIMDJSON_PADDING]);
    +  if (copy.get() == nullptr) { return MEMALLOC; }
    +  std::memcpy(copy.get(), value, iter.remaining_len());
    +  std::memset(copy.get() + iter.remaining_len(), ' ', SIMDJSON_PADDING);
    +  error_code error = visit_number(iter, copy.get());
    +  return error;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_true_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("true");
    +  if (!atomparsing::is_valid_true_atom(value)) { return T_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::TRUE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_true_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("true");
    +  if (!atomparsing::is_valid_true_atom(value, iter.remaining_len())) { return T_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::TRUE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_false_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("false");
    +  if (!atomparsing::is_valid_false_atom(value)) { return F_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::FALSE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_false_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("false");
    +  if (!atomparsing::is_valid_false_atom(value, iter.remaining_len())) { return F_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::FALSE_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_null_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("null");
    +  if (!atomparsing::is_valid_null_atom(value)) { return N_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::NULL_VALUE);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::visit_root_null_atom(json_iterator &iter, const uint8_t *value) noexcept {
    +  iter.log_value("null");
    +  if (!atomparsing::is_valid_null_atom(value, iter.remaining_len())) { return N_ATOM_ERROR; }
    +  tape.append(0, internal::tape_type::NULL_VALUE);
    +  return SUCCESS;
    +}
    +
    +// private:
    +
    +simdjson_inline uint32_t tape_builder::next_tape_index(json_iterator &iter) const noexcept {
    +  return uint32_t(tape.next_tape_loc - iter.dom_parser.doc->tape.get());
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::empty_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept {
    +  auto start_index = next_tape_index(iter);
    +  tape.append(start_index+2, start);
    +  tape.append(start_index, end);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline void tape_builder::start_container(json_iterator &iter) noexcept {
    +  iter.dom_parser.open_containers[iter.depth].tape_index = next_tape_index(iter);
    +  iter.dom_parser.open_containers[iter.depth].count = 0;
    +  tape.skip(); // We don't actually *write* the start element until the end.
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code tape_builder::end_container(json_iterator &iter, internal::tape_type start, internal::tape_type end) noexcept {
    +  // Write the ending tape element, pointing at the start location
    +  const uint32_t start_tape_index = iter.dom_parser.open_containers[iter.depth].tape_index;
    +  tape.append(start_tape_index, end);
    +  // Write the start tape element, pointing at the end location (and including count)
    +  // count can overflow if it exceeds 24 bits... so we saturate
    +  // the convention being that a cnt of 0xffffff or more is undetermined in value (>=  0xffffff).
    +  const uint32_t count = iter.dom_parser.open_containers[iter.depth].count;
    +  const uint32_t cntsat = count > 0xFFFFFF ? 0xFFFFFF : count;
    +  tape_writer::write(iter.dom_parser.doc->tape[start_tape_index], next_tape_index(iter) | (uint64_t(cntsat) << 32), start);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline uint8_t *tape_builder::on_start_string(json_iterator &iter) noexcept {
    +  // we advance the point, accounting for the fact that we have a NULL termination
    +  tape.append(current_string_buf_loc - iter.dom_parser.doc->string_buf.get(), internal::tape_type::STRING);
    +  return current_string_buf_loc + sizeof(uint32_t);
    +}
    +
    +simdjson_inline void tape_builder::on_end_string(uint8_t *dst) noexcept {
    +  uint32_t str_length = uint32_t(dst - (current_string_buf_loc + sizeof(uint32_t)));
    +  // TODO check for overflow in case someone has a crazy string (>=4GB?)
    +  // But only add the overflow check when the document itself exceeds 4GB
    +  // Currently unneeded because we refuse to parse docs larger or equal to 4GB.
    +  memcpy(current_string_buf_loc, &str_length, sizeof(uint32_t));
    +  // NULL termination is still handy if you expect all your strings to
    +  // be NULL terminated? It comes at a small cost
    +  *dst = 0;
    +  current_string_buf_loc = dst + 1;
    +}
    +
    +} // namespace stage2
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SRC_GENERIC_STAGE2_TAPE_BUILDER_H
    +/* end file generic/stage2/tape_builder.h for westmere */
    +/* end file generic/stage2/amalgamated.h for westmere */
    +
    +//
    +// Stage 1
    +//
    +
    +namespace simdjson {
    +namespace westmere {
    +
    +simdjson_warn_unused error_code implementation::create_dom_parser_implementation(
    +  size_t capacity,
    +  size_t max_depth,
    +  std::unique_ptr& dst
    +) const noexcept {
    +  dst.reset( new (std::nothrow) dom_parser_implementation() );
    +  if (!dst) { return MEMALLOC; }
    +  if (auto err = dst->set_capacity(capacity))
    +    return err;
    +  if (auto err = dst->set_max_depth(max_depth))
    +    return err;
    +  return SUCCESS;
    +}
    +
    +namespace {
    +
    +using namespace simd;
    +
    +simdjson_inline json_character_block json_character_block::classify(const simd::simd8x64& in) {
    +  // These lookups rely on the fact that anything < 127 will match the lower 4 bits, which is why
    +  // we can't use the generic lookup_16.
    +  auto whitespace_table = simd8::repeat_16(' ', 100, 100, 100, 17, 100, 113, 2, 100, '\t', '\n', 112, 100, '\r', 100, 100);
    +
    +  // The 6 operators (:,[]{}) have these values:
    +  //
    +  // , 2C
    +  // : 3A
    +  // [ 5B
    +  // { 7B
    +  // ] 5D
    +  // } 7D
    +  //
    +  // If you use | 0x20 to turn [ and ] into { and }, the lower 4 bits of each character is unique.
    +  // We exploit this, using a simd 4-bit lookup to tell us which character match against, and then
    +  // match it (against | 0x20).
    +  //
    +  // To prevent recognizing other characters, everything else gets compared with 0, which cannot
    +  // match due to the | 0x20.
    +  //
    +  // NOTE: Due to the | 0x20, this ALSO treats  and  (control characters 0C and 1A) like ,
    +  // and :. This gets caught in stage 2, which checks the actual character to ensure the right
    +  // operators are in the right places.
    +  const auto op_table = simd8::repeat_16(
    +    0, 0, 0, 0,
    +    0, 0, 0, 0,
    +    0, 0, ':', '{', // : = 3A, [ = 5B, { = 7B
    +    ',', '}', 0, 0  // , = 2C, ] = 5D, } = 7D
    +  );
    +
    +  // We compute whitespace and op separately. If the code later only use one or the
    +  // other, given the fact that all functions are aggressively inlined, we can
    +  // hope that useless computations will be omitted. This is namely case when
    +  // minifying (we only need whitespace).
    +
    +
    +  const uint64_t whitespace = in.eq({
    +    _mm_shuffle_epi8(whitespace_table, in.chunks[0]),
    +    _mm_shuffle_epi8(whitespace_table, in.chunks[1]),
    +    _mm_shuffle_epi8(whitespace_table, in.chunks[2]),
    +    _mm_shuffle_epi8(whitespace_table, in.chunks[3])
    +  });
    +  // Turn [ and ] into { and }
    +  const simd8x64 curlified{
    +    in.chunks[0] | 0x20,
    +    in.chunks[1] | 0x20,
    +    in.chunks[2] | 0x20,
    +    in.chunks[3] | 0x20
    +  };
    +  const uint64_t op = curlified.eq({
    +    _mm_shuffle_epi8(op_table, in.chunks[0]),
    +    _mm_shuffle_epi8(op_table, in.chunks[1]),
    +    _mm_shuffle_epi8(op_table, in.chunks[2]),
    +    _mm_shuffle_epi8(op_table, in.chunks[3])
    +  });
    +    return { whitespace, op };
    +}
    +
    +simdjson_inline bool is_ascii(const simd8x64& input) {
    +  return input.reduce_or().is_ascii();
    +}
    +
    +simdjson_unused simdjson_inline simd8 must_be_continuation(const simd8 prev1, const simd8 prev2, const simd8 prev3) {
    +  simd8 is_second_byte = prev1.saturating_sub(0xc0u-1); // Only 11______ will be > 0
    +  simd8 is_third_byte  = prev2.saturating_sub(0xe0u-1); // Only 111_____ will be > 0
    +  simd8 is_fourth_byte = prev3.saturating_sub(0xf0u-1); // Only 1111____ will be > 0
    +  // Caller requires a bool (all 1's). All values resulting from the subtraction will be <= 64, so signed comparison is fine.
    +  return simd8(is_second_byte | is_third_byte | is_fourth_byte) > int8_t(0);
    +}
    +
    +simdjson_inline simd8 must_be_2_3_continuation(const simd8 prev2, const simd8 prev3) {
    +  simd8 is_third_byte  = prev2.saturating_sub(0xe0u-1); // Only 111_____ will be > 0
    +  simd8 is_fourth_byte = prev3.saturating_sub(0xf0u-1); // Only 1111____ will be > 0
    +  // Caller requires a bool (all 1's). All values resulting from the subtraction will be <= 64, so signed comparison is fine.
    +  return simd8(is_third_byte | is_fourth_byte) > int8_t(0);
    +}
    +
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +//
    +// Stage 2
    +//
    +
    +//
    +// Implementation-specific overrides
    +//
    +
    +namespace simdjson {
    +namespace westmere {
    +
    +simdjson_warn_unused error_code implementation::minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept {
    +  return westmere::stage1::json_minifier::minify<64>(buf, len, dst, dst_len);
    +}
    +
    +simdjson_warn_unused error_code dom_parser_implementation::stage1(const uint8_t *_buf, size_t _len, stage1_mode streaming) noexcept {
    +  this->buf = _buf;
    +  this->len = _len;
    +  return westmere::stage1::json_structural_indexer::index<64>(_buf, _len, *this, streaming);
    +}
    +
    +simdjson_warn_unused bool implementation::validate_utf8(const char *buf, size_t len) const noexcept {
    +  return westmere::stage1::generic_validate_utf8(buf,len);
    +}
    +
    +simdjson_warn_unused error_code dom_parser_implementation::stage2(dom::document &_doc) noexcept {
    +  return stage2::tape_builder::parse_document(*this, _doc);
    +}
    +
    +simdjson_warn_unused error_code dom_parser_implementation::stage2_next(dom::document &_doc) noexcept {
    +  return stage2::tape_builder::parse_document(*this, _doc);
    +}
    +
    +simdjson_warn_unused uint8_t *dom_parser_implementation::parse_string(const uint8_t *src, uint8_t *dst, bool replacement_char) const noexcept {
    +  return westmere::stringparsing::parse_string(src, dst, replacement_char);
    +}
    +
    +simdjson_warn_unused uint8_t *dom_parser_implementation::parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept {
    +  return westmere::stringparsing::parse_wobbly_string(src, dst);
    +}
    +
    +simdjson_warn_unused error_code dom_parser_implementation::parse(const uint8_t *_buf, size_t _len, dom::document &_doc) noexcept {
    +  auto error = stage1(_buf, _len, stage1_mode::regular);
    +  if (error) { return error; }
    +  return stage2(_doc);
    +}
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +/* including simdjson/westmere/end.h: #include  */
    +/* begin file simdjson/westmere/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_WESTMERE
    +SIMDJSON_UNTARGET_REGION
    +#endif
    +
    +/* undefining SIMDJSON_IMPLEMENTATION from "westmere" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/westmere/end.h */
    +
    +#endif // SIMDJSON_SRC_WESTMERE_CPP
    +/* end file westmere.cpp */
    +#endif
    +
    +/* undefining SIMDJSON_CONDITIONAL_INCLUDE */
    +#undef SIMDJSON_CONDITIONAL_INCLUDE
    +
    +SIMDJSON_POP_DISABLE_UNUSED_WARNINGS
    +
    +/* end file simdjson.cpp */
    diff --git a/deps/simdjson/simdjson.gyp b/deps/simdjson/simdjson.gyp
    new file mode 100644
    index 00000000000000..5c5707a7de2899
    --- /dev/null
    +++ b/deps/simdjson/simdjson.gyp
    @@ -0,0 +1,20 @@
    +{
    +  'variables': {
    +    'simdjson_sources': [
    +      'simdjson.cpp',
    +    ]
    +  },
    +  'targets': [
    +     {
    +       'target_name': 'simdjson',
    +       'type': 'static_library',
    +       'include_dirs': ['.'],
    +       'direct_dependent_settings': {
    +         'include_dirs': ['.'],
    +       },
    +       'sources': [
    +         '<@(simdjson_sources)',
    +       ],
    +     },
    +  ]
    +}
    diff --git a/deps/simdjson/simdjson.h b/deps/simdjson/simdjson.h
    new file mode 100644
    index 00000000000000..bfe8640f28667d
    --- /dev/null
    +++ b/deps/simdjson/simdjson.h
    @@ -0,0 +1,88552 @@
    +/* auto-generated on 2023-12-07 12:42:28 -0500. Do not edit! */
    +/* including simdjson.h:  */
    +/* begin file simdjson.h */
    +#ifndef SIMDJSON_H
    +#define SIMDJSON_H
    +
    +/**
    + * @mainpage
    + *
    + * Check the [README.md](https://github.com/simdjson/simdjson/blob/master/README.md#simdjson--parsing-gigabytes-of-json-per-second).
    + *
    + * Sample code. See https://github.com/simdjson/simdjson/blob/master/doc/basics.md for more examples.
    +
    +    #include "simdjson.h"
    +
    +    int main(void) {
    +      // load from `twitter.json` file:
    +      simdjson::dom::parser parser;
    +      simdjson::dom::element tweets = parser.load("twitter.json");
    +      std::cout << tweets["search_metadata"]["count"] << " results." << std::endl;
    +
    +      // Parse and iterate through an array of objects
    +      auto abstract_json = R"( [
    +        {  "12345" : {"a":12.34, "b":56.78, "c": 9998877}   },
    +        {  "12545" : {"a":11.44, "b":12.78, "c": 11111111}  }
    +        ] )"_padded;
    +
    +      for (simdjson::dom::object obj : parser.parse(abstract_json)) {
    +        for(const auto key_value : obj) {
    +          cout << "key: " << key_value.key << " : ";
    +          simdjson::dom::object innerobj = key_value.value;
    +          cout << "a: " << double(innerobj["a"]) << ", ";
    +          cout << "b: " << double(innerobj["b"]) << ", ";
    +          cout << "c: " << int64_t(innerobj["c"]) << endl;
    +        }
    +      }
    +    }
    + */
    +
    +/* including simdjson/common_defs.h: #include "simdjson/common_defs.h" */
    +/* begin file simdjson/common_defs.h */
    +#ifndef SIMDJSON_COMMON_DEFS_H
    +#define SIMDJSON_COMMON_DEFS_H
    +
    +#include 
    +/* including simdjson/compiler_check.h: #include "simdjson/compiler_check.h" */
    +/* begin file simdjson/compiler_check.h */
    +#ifndef SIMDJSON_COMPILER_CHECK_H
    +#define SIMDJSON_COMPILER_CHECK_H
    +
    +#ifndef __cplusplus
    +#error simdjson requires a C++ compiler
    +#endif
    +
    +#ifndef SIMDJSON_CPLUSPLUS
    +#if defined(_MSVC_LANG) && !defined(__clang__)
    +#define SIMDJSON_CPLUSPLUS (_MSC_VER == 1900 ? 201103L : _MSVC_LANG)
    +#else
    +#define SIMDJSON_CPLUSPLUS __cplusplus
    +#endif
    +#endif
    +
    +// C++ 17
    +#if !defined(SIMDJSON_CPLUSPLUS17) && (SIMDJSON_CPLUSPLUS >= 201703L)
    +#define SIMDJSON_CPLUSPLUS17 1
    +#endif
    +
    +// C++ 14
    +#if !defined(SIMDJSON_CPLUSPLUS14) && (SIMDJSON_CPLUSPLUS >= 201402L)
    +#define SIMDJSON_CPLUSPLUS14 1
    +#endif
    +
    +// C++ 11
    +#if !defined(SIMDJSON_CPLUSPLUS11) && (SIMDJSON_CPLUSPLUS >= 201103L)
    +#define SIMDJSON_CPLUSPLUS11 1
    +#endif
    +
    +#ifndef SIMDJSON_CPLUSPLUS11
    +#error simdjson requires a compiler compliant with the C++11 standard
    +#endif
    +
    +#ifndef SIMDJSON_IF_CONSTEXPR
    +#if SIMDJSON_CPLUSPLUS17
    +#define SIMDJSON_IF_CONSTEXPR if constexpr
    +#else
    +#define SIMDJSON_IF_CONSTEXPR if
    +#endif
    +#endif
    +
    +#endif // SIMDJSON_COMPILER_CHECK_H
    +/* end file simdjson/compiler_check.h */
    +/* including simdjson/portability.h: #include "simdjson/portability.h" */
    +/* begin file simdjson/portability.h */
    +#ifndef SIMDJSON_PORTABILITY_H
    +#define SIMDJSON_PORTABILITY_H
    +
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#ifndef _WIN32
    +// strcasecmp, strncasecmp
    +#include 
    +#endif
    +
    +#ifdef _MSC_VER
    +#define SIMDJSON_VISUAL_STUDIO 1
    +/**
    + * We want to differentiate carefully between
    + * clang under visual studio and regular visual
    + * studio.
    + *
    + * Under clang for Windows, we enable:
    + *  * target pragmas so that part and only part of the
    + *     code gets compiled for advanced instructions.
    + *
    + */
    +#ifdef __clang__
    +// clang under visual studio
    +#define SIMDJSON_CLANG_VISUAL_STUDIO 1
    +#else
    +// just regular visual studio (best guess)
    +#define SIMDJSON_REGULAR_VISUAL_STUDIO 1
    +#endif // __clang__
    +#endif // _MSC_VER
    +
    +#if defined(__x86_64__) || defined(_M_AMD64)
    +#define SIMDJSON_IS_X86_64 1
    +#elif defined(__aarch64__) || defined(_M_ARM64)
    +#define SIMDJSON_IS_ARM64 1
    +#elif defined(__riscv) && __riscv_xlen == 64
    +#define SIMDJSON_IS_RISCV64 1
    +#elif defined(__PPC64__) || defined(_M_PPC64)
    +#if defined(__ALTIVEC__)
    +#define SIMDJSON_IS_PPC64_VMX 1
    +#endif // defined(__ALTIVEC__)
    +#else
    +#define SIMDJSON_IS_32BITS 1
    +
    +#if defined(_M_IX86) || defined(__i386__)
    +#define SIMDJSON_IS_X86_32BITS 1
    +#elif defined(__arm__) || defined(_M_ARM)
    +#define SIMDJSON_IS_ARM_32BITS 1
    +#elif defined(__PPC__) || defined(_M_PPC)
    +#define SIMDJSON_IS_PPC_32BITS 1
    +#endif
    +
    +#endif // defined(__x86_64__) || defined(_M_AMD64)
    +#ifndef SIMDJSON_IS_32BITS
    +#define SIMDJSON_IS_32BITS 0
    +#endif
    +
    +#if SIMDJSON_IS_32BITS
    +#ifndef SIMDJSON_NO_PORTABILITY_WARNING
    +// In the future, we should allow programmers
    +// to get warning.
    +#endif // SIMDJSON_NO_PORTABILITY_WARNING
    +#endif // SIMDJSON_IS_32BITS
    +
    +#define SIMDJSON_CAT_IMPLEMENTATION_(a,...) a ## __VA_ARGS__
    +#define SIMDJSON_CAT(a,...) SIMDJSON_CAT_IMPLEMENTATION_(a, __VA_ARGS__)
    +
    +#define SIMDJSON_STRINGIFY_IMPLEMENTATION_(a,...) #a SIMDJSON_STRINGIFY(__VA_ARGS__)
    +#define SIMDJSON_STRINGIFY(a,...) SIMDJSON_CAT_IMPLEMENTATION_(a, __VA_ARGS__)
    +
    +// this is almost standard?
    +#undef SIMDJSON_STRINGIFY_IMPLEMENTATION_
    +#undef SIMDJSON_STRINGIFY
    +#define SIMDJSON_STRINGIFY_IMPLEMENTATION_(a) #a
    +#define SIMDJSON_STRINGIFY(a) SIMDJSON_STRINGIFY_IMPLEMENTATION_(a)
    +
    +// Our fast kernels require 64-bit systems.
    +//
    +// On 32-bit x86, we lack 64-bit popcnt, lzcnt, blsr instructions.
    +// Furthermore, the number of SIMD registers is reduced.
    +//
    +// On 32-bit ARM, we would have smaller registers.
    +//
    +// The simdjson users should still have the fallback kernel. It is
    +// slower, but it should run everywhere.
    +
    +//
    +// Enable valid runtime implementations, and select SIMDJSON_BUILTIN_IMPLEMENTATION
    +//
    +
    +// We are going to use runtime dispatch.
    +#if SIMDJSON_IS_X86_64
    +#ifdef __clang__
    +// clang does not have GCC push pop
    +// warning: clang attribute push can't be used within a namespace in clang up
    +// til 8.0 so SIMDJSON_TARGET_REGION and SIMDJSON_UNTARGET_REGION must be *outside* of a
    +// namespace.
    +#define SIMDJSON_TARGET_REGION(T)                                                       \
    +  _Pragma(SIMDJSON_STRINGIFY(                                                           \
    +      clang attribute push(__attribute__((target(T))), apply_to = function)))
    +#define SIMDJSON_UNTARGET_REGION _Pragma("clang attribute pop")
    +#elif defined(__GNUC__)
    +// GCC is easier
    +#define SIMDJSON_TARGET_REGION(T)                                                       \
    +  _Pragma("GCC push_options") _Pragma(SIMDJSON_STRINGIFY(GCC target(T)))
    +#define SIMDJSON_UNTARGET_REGION _Pragma("GCC pop_options")
    +#endif // clang then gcc
    +
    +#endif // x86
    +
    +// Default target region macros don't do anything.
    +#ifndef SIMDJSON_TARGET_REGION
    +#define SIMDJSON_TARGET_REGION(T)
    +#define SIMDJSON_UNTARGET_REGION
    +#endif
    +
    +// Is threading enabled?
    +#if defined(_REENTRANT) || defined(_MT)
    +#ifndef SIMDJSON_THREADS_ENABLED
    +#define SIMDJSON_THREADS_ENABLED
    +#endif
    +#endif
    +
    +// workaround for large stack sizes under -O0.
    +// https://github.com/simdjson/simdjson/issues/691
    +#ifdef __APPLE__
    +#ifndef __OPTIMIZE__
    +// Apple systems have small stack sizes in secondary threads.
    +// Lack of compiler optimization may generate high stack usage.
    +// Users may want to disable threads for safety, but only when
    +// in debug mode which we detect by the fact that the __OPTIMIZE__
    +// macro is not defined.
    +#undef SIMDJSON_THREADS_ENABLED
    +#endif
    +#endif
    +
    +
    +#if defined(__clang__)
    +#define SIMDJSON_NO_SANITIZE_UNDEFINED __attribute__((no_sanitize("undefined")))
    +#elif defined(__GNUC__)
    +#define SIMDJSON_NO_SANITIZE_UNDEFINED __attribute__((no_sanitize_undefined))
    +#else
    +#define SIMDJSON_NO_SANITIZE_UNDEFINED
    +#endif
    +
    +
    +#if defined(__clang__) || defined(__GNUC__)
    +#if defined(__has_feature)
    +#  if __has_feature(memory_sanitizer)
    +#define SIMDJSON_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory")))
    +#  endif // if __has_feature(memory_sanitizer)
    +#endif // defined(__has_feature)
    +#endif
    +// make sure it is defined as 'nothing' if it is unapplicable.
    +#ifndef SIMDJSON_NO_SANITIZE_MEMORY
    +#define SIMDJSON_NO_SANITIZE_MEMORY
    +#endif
    +
    +#if SIMDJSON_VISUAL_STUDIO
    +// This is one case where we do not distinguish between
    +// regular visual studio and clang under visual studio.
    +// clang under Windows has _stricmp (like visual studio) but not strcasecmp (as clang normally has)
    +#define simdjson_strcasecmp _stricmp
    +#define simdjson_strncasecmp _strnicmp
    +#else
    +// The strcasecmp, strncasecmp, and strcasestr functions do not work with multibyte strings (e.g. UTF-8).
    +// So they are only useful for ASCII in our context.
    +// https://www.gnu.org/software/libunistring/manual/libunistring.html#char-_002a-strings
    +#define simdjson_strcasecmp strcasecmp
    +#define simdjson_strncasecmp strncasecmp
    +#endif
    +
    +#if defined(NDEBUG) || defined(__OPTIMIZE__) || (defined(_MSC_VER) && !defined(_DEBUG))
    +// If NDEBUG is set, or __OPTIMIZE__ is set, or we are under MSVC in release mode,
    +// then do away with asserts and use __assume.
    +#if SIMDJSON_VISUAL_STUDIO
    +#define SIMDJSON_UNREACHABLE() __assume(0)
    +#define SIMDJSON_ASSUME(COND) __assume(COND)
    +#else
    +#define SIMDJSON_UNREACHABLE() __builtin_unreachable();
    +#define SIMDJSON_ASSUME(COND) do { if (!(COND)) __builtin_unreachable(); } while (0)
    +#endif
    +
    +#else // defined(NDEBUG) || defined(__OPTIMIZE__) || (defined(_MSC_VER) && !defined(_DEBUG))
    +// This should only ever be enabled in debug mode.
    +#define SIMDJSON_UNREACHABLE() assert(0);
    +#define SIMDJSON_ASSUME(COND) assert(COND)
    +
    +#endif
    +
    +#endif // SIMDJSON_PORTABILITY_H
    +/* end file simdjson/portability.h */
    +
    +namespace simdjson {
    +namespace internal {
    +/**
    + * @private
    + * Our own implementation of the C++17 to_chars function.
    + * Defined in src/to_chars
    + */
    +char *to_chars(char *first, const char *last, double value);
    +/**
    + * @private
    + * A number parsing routine.
    + * Defined in src/from_chars
    + */
    +double from_chars(const char *first) noexcept;
    +double from_chars(const char *first, const char* end) noexcept;
    +}
    +
    +#ifndef SIMDJSON_EXCEPTIONS
    +#if __cpp_exceptions
    +#define SIMDJSON_EXCEPTIONS 1
    +#else
    +#define SIMDJSON_EXCEPTIONS 0
    +#endif
    +#endif
    +
    +} // namespace simdjson
    +
    +#if defined(__GNUC__)
    +  // Marks a block with a name so that MCA analysis can see it.
    +  #define SIMDJSON_BEGIN_DEBUG_BLOCK(name) __asm volatile("# LLVM-MCA-BEGIN " #name);
    +  #define SIMDJSON_END_DEBUG_BLOCK(name) __asm volatile("# LLVM-MCA-END " #name);
    +  #define SIMDJSON_DEBUG_BLOCK(name, block) BEGIN_DEBUG_BLOCK(name); block; END_DEBUG_BLOCK(name);
    +#else
    +  #define SIMDJSON_BEGIN_DEBUG_BLOCK(name)
    +  #define SIMDJSON_END_DEBUG_BLOCK(name)
    +  #define SIMDJSON_DEBUG_BLOCK(name, block)
    +#endif
    +
    +// Align to N-byte boundary
    +#define SIMDJSON_ROUNDUP_N(a, n) (((a) + ((n)-1)) & ~((n)-1))
    +#define SIMDJSON_ROUNDDOWN_N(a, n) ((a) & ~((n)-1))
    +
    +#define SIMDJSON_ISALIGNED_N(ptr, n) (((uintptr_t)(ptr) & ((n)-1)) == 0)
    +
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +
    +  #define simdjson_really_inline __forceinline
    +  #define simdjson_never_inline __declspec(noinline)
    +
    +  #define simdjson_unused
    +  #define simdjson_warn_unused
    +
    +  #ifndef simdjson_likely
    +  #define simdjson_likely(x) x
    +  #endif
    +  #ifndef simdjson_unlikely
    +  #define simdjson_unlikely(x) x
    +  #endif
    +
    +  #define SIMDJSON_PUSH_DISABLE_WARNINGS __pragma(warning( push ))
    +  #define SIMDJSON_PUSH_DISABLE_ALL_WARNINGS __pragma(warning( push, 0 ))
    +  #define SIMDJSON_DISABLE_VS_WARNING(WARNING_NUMBER) __pragma(warning( disable : WARNING_NUMBER ))
    +  // Get rid of Intellisense-only warnings (Code Analysis)
    +  // Though __has_include is C++17, it is supported in Visual Studio 2017 or better (_MSC_VER>=1910).
    +  #ifdef __has_include
    +  #if __has_include()
    +  #include 
    +  #define SIMDJSON_DISABLE_UNDESIRED_WARNINGS SIMDJSON_DISABLE_VS_WARNING(ALL_CPPCORECHECK_WARNINGS)
    +  #endif
    +  #endif
    +
    +  #ifndef SIMDJSON_DISABLE_UNDESIRED_WARNINGS
    +  #define SIMDJSON_DISABLE_UNDESIRED_WARNINGS
    +  #endif
    +
    +  #define SIMDJSON_DISABLE_DEPRECATED_WARNING SIMDJSON_DISABLE_VS_WARNING(4996)
    +  #define SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +  #define SIMDJSON_POP_DISABLE_WARNINGS __pragma(warning( pop ))
    +
    +  #define SIMDJSON_PUSH_DISABLE_UNUSED_WARNINGS
    +  #define SIMDJSON_POP_DISABLE_UNUSED_WARNINGS
    +
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO
    +
    +  #define simdjson_really_inline inline __attribute__((always_inline))
    +  #define simdjson_never_inline inline __attribute__((noinline))
    +
    +  #define simdjson_unused __attribute__((unused))
    +  #define simdjson_warn_unused __attribute__((warn_unused_result))
    +
    +  #ifndef simdjson_likely
    +  #define simdjson_likely(x) __builtin_expect(!!(x), 1)
    +  #endif
    +  #ifndef simdjson_unlikely
    +  #define simdjson_unlikely(x) __builtin_expect(!!(x), 0)
    +  #endif
    +
    +  #define SIMDJSON_PUSH_DISABLE_WARNINGS _Pragma("GCC diagnostic push")
    +  // gcc doesn't seem to disable all warnings with all and extra, add warnings here as necessary
    +  // We do it separately for clang since it has different warnings.
    +  #ifdef __clang__
    +  // clang is missing -Wmaybe-uninitialized.
    +  #define SIMDJSON_PUSH_DISABLE_ALL_WARNINGS SIMDJSON_PUSH_DISABLE_WARNINGS \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Weffc++) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wall) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wconversion) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wextra) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wattributes) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wimplicit-fallthrough) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wnon-virtual-dtor) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wreturn-type) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wshadow) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wunused-parameter) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wunused-variable)
    +  #else // __clang__
    +  #define SIMDJSON_PUSH_DISABLE_ALL_WARNINGS SIMDJSON_PUSH_DISABLE_WARNINGS \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Weffc++) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wall) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wconversion) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wextra) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wattributes) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wimplicit-fallthrough) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wnon-virtual-dtor) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wreturn-type) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wshadow) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wunused-parameter) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wunused-variable) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wmaybe-uninitialized) \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wformat-security)
    +  #endif // __clang__
    +
    +  #define SIMDJSON_PRAGMA(P) _Pragma(#P)
    +  #define SIMDJSON_DISABLE_GCC_WARNING(WARNING) SIMDJSON_PRAGMA(GCC diagnostic ignored #WARNING)
    +  #if SIMDJSON_CLANG_VISUAL_STUDIO
    +  #define SIMDJSON_DISABLE_UNDESIRED_WARNINGS SIMDJSON_DISABLE_GCC_WARNING(-Wmicrosoft-include)
    +  #else
    +  #define SIMDJSON_DISABLE_UNDESIRED_WARNINGS
    +  #endif
    +  #define SIMDJSON_DISABLE_DEPRECATED_WARNING SIMDJSON_DISABLE_GCC_WARNING(-Wdeprecated-declarations)
    +  #define SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING SIMDJSON_DISABLE_GCC_WARNING(-Wstrict-overflow)
    +  #define SIMDJSON_POP_DISABLE_WARNINGS _Pragma("GCC diagnostic pop")
    +
    +  #define SIMDJSON_PUSH_DISABLE_UNUSED_WARNINGS SIMDJSON_PUSH_DISABLE_WARNINGS \
    +    SIMDJSON_DISABLE_GCC_WARNING(-Wunused)
    +  #define SIMDJSON_POP_DISABLE_UNUSED_WARNINGS SIMDJSON_POP_DISABLE_WARNINGS
    +
    +
    +
    +#endif // MSC_VER
    +
    +#if defined(simdjson_inline)
    +  // Prefer the user's definition of simdjson_inline; don't define it ourselves.
    +#elif defined(__GNUC__) && !defined(__OPTIMIZE__)
    +  // If optimizations are disabled, forcing inlining can lead to significant
    +  // code bloat and high compile times. Don't use simdjson_really_inline for
    +  // unoptimized builds.
    +  #define simdjson_inline inline
    +#else
    +  // Force inlining for most simdjson functions.
    +  #define simdjson_inline simdjson_really_inline
    +#endif
    +
    +#if SIMDJSON_VISUAL_STUDIO
    +    /**
    +     * Windows users need to do some extra work when building
    +     * or using a dynamic library (DLL). When building, we need
    +     * to set SIMDJSON_DLLIMPORTEXPORT to __declspec(dllexport).
    +     * When *using* the DLL, the user needs to set
    +     * SIMDJSON_DLLIMPORTEXPORT __declspec(dllimport).
    +     *
    +     * Static libraries not need require such work.
    +     *
    +     * It does not matter here whether you are using
    +     * the regular visual studio or clang under visual
    +     * studio, you still need to handle these issues.
    +     *
    +     * Non-Windows systems do not have this complexity.
    +     */
    +    #if SIMDJSON_BUILDING_WINDOWS_DYNAMIC_LIBRARY
    +    // We set SIMDJSON_BUILDING_WINDOWS_DYNAMIC_LIBRARY when we build a DLL under Windows.
    +    // It should never happen that both SIMDJSON_BUILDING_WINDOWS_DYNAMIC_LIBRARY and
    +    // SIMDJSON_USING_WINDOWS_DYNAMIC_LIBRARY are set.
    +    #define SIMDJSON_DLLIMPORTEXPORT __declspec(dllexport)
    +    #elif SIMDJSON_USING_WINDOWS_DYNAMIC_LIBRARY
    +    // Windows user who call a dynamic library should set SIMDJSON_USING_WINDOWS_DYNAMIC_LIBRARY to 1.
    +    #define SIMDJSON_DLLIMPORTEXPORT __declspec(dllimport)
    +    #else
    +    // We assume by default static linkage
    +    #define SIMDJSON_DLLIMPORTEXPORT
    +    #endif
    +
    +/**
    + * Workaround for the vcpkg package manager. Only vcpkg should
    + * ever touch the next line. The SIMDJSON_USING_LIBRARY macro is otherwise unused.
    + */
    +#if SIMDJSON_USING_LIBRARY
    +#define SIMDJSON_DLLIMPORTEXPORT __declspec(dllimport)
    +#endif
    +/**
    + * End of workaround for the vcpkg package manager.
    + */
    +#else
    +    #define SIMDJSON_DLLIMPORTEXPORT
    +#endif
    +
    +// C++17 requires string_view.
    +#if SIMDJSON_CPLUSPLUS17
    +#define SIMDJSON_HAS_STRING_VIEW
    +#include  // by the standard, this has to be safe.
    +#endif
    +
    +// This macro (__cpp_lib_string_view) has to be defined
    +// for C++17 and better, but if it is otherwise defined,
    +// we are going to assume that string_view is available
    +// even if we do not have C++17 support.
    +#ifdef __cpp_lib_string_view
    +#define SIMDJSON_HAS_STRING_VIEW
    +#endif
    +
    +// Some systems have string_view even if we do not have C++17 support,
    +// and even if __cpp_lib_string_view is undefined, it is the case
    +// with Apple clang version 11.
    +// We must handle it. *This is important.*
    +#ifndef SIMDJSON_HAS_STRING_VIEW
    +#if defined __has_include
    +// do not combine the next #if with the previous one (unsafe)
    +#if __has_include ()
    +// now it is safe to trigger the include
    +#include  // though the file is there, it does not follow that we got the implementation
    +#if defined(_LIBCPP_STRING_VIEW)
    +// Ah! So we under libc++ which under its Library Fundamentals Technical Specification, which preceded C++17,
    +// included string_view.
    +// This means that we have string_view *even though* we may not have C++17.
    +#define SIMDJSON_HAS_STRING_VIEW
    +#endif // _LIBCPP_STRING_VIEW
    +#endif // __has_include ()
    +#endif // defined __has_include
    +#endif // def SIMDJSON_HAS_STRING_VIEW
    +// end of complicated but important routine to try to detect string_view.
    +
    +//
    +// Backfill std::string_view using nonstd::string_view on systems where
    +// we expect that string_view is missing. Important: if we get this wrong,
    +// we will end up with two string_view definitions and potential trouble.
    +// That is why we work so hard above to avoid it.
    +//
    +#ifndef SIMDJSON_HAS_STRING_VIEW
    +SIMDJSON_PUSH_DISABLE_ALL_WARNINGS
    +/* including simdjson/nonstd/string_view.hpp: #include "simdjson/nonstd/string_view.hpp" */
    +/* begin file simdjson/nonstd/string_view.hpp */
    +// Copyright 2017-2020 by Martin Moene
    +//
    +// string-view lite, a C++17-like string_view for C++98 and later.
    +// For more information see https://github.com/martinmoene/string-view-lite
    +//
    +// Distributed under the Boost Software License, Version 1.0.
    +// (See accompanying file LICENSE.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
    +
    +#pragma once
    +
    +#ifndef NONSTD_SV_LITE_H_INCLUDED
    +#define NONSTD_SV_LITE_H_INCLUDED
    +
    +#define string_view_lite_MAJOR  1
    +#define string_view_lite_MINOR  7
    +#define string_view_lite_PATCH  0
    +
    +#define string_view_lite_VERSION  nssv_STRINGIFY(string_view_lite_MAJOR) "." nssv_STRINGIFY(string_view_lite_MINOR) "." nssv_STRINGIFY(string_view_lite_PATCH)
    +
    +#define nssv_STRINGIFY(  x )  nssv_STRINGIFY_( x )
    +#define nssv_STRINGIFY_( x )  #x
    +
    +// string-view lite configuration:
    +
    +#define nssv_STRING_VIEW_DEFAULT  0
    +#define nssv_STRING_VIEW_NONSTD   1
    +#define nssv_STRING_VIEW_STD      2
    +
    +// tweak header support:
    +
    +#ifdef __has_include
    +# if __has_include()
    +#  include 
    +# endif
    +#define nssv_HAVE_TWEAK_HEADER  1
    +#else
    +#define nssv_HAVE_TWEAK_HEADER  0
    +//# pragma message("string_view.hpp: Note: Tweak header not supported.")
    +#endif
    +
    +// string_view selection and configuration:
    +
    +#if !defined( nssv_CONFIG_SELECT_STRING_VIEW )
    +# define nssv_CONFIG_SELECT_STRING_VIEW  ( nssv_HAVE_STD_STRING_VIEW ? nssv_STRING_VIEW_STD : nssv_STRING_VIEW_NONSTD )
    +#endif
    +
    +#ifndef  nssv_CONFIG_STD_SV_OPERATOR
    +# define nssv_CONFIG_STD_SV_OPERATOR  0
    +#endif
    +
    +#ifndef  nssv_CONFIG_USR_SV_OPERATOR
    +# define nssv_CONFIG_USR_SV_OPERATOR  1
    +#endif
    +
    +#ifdef   nssv_CONFIG_CONVERSION_STD_STRING
    +# define nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS   nssv_CONFIG_CONVERSION_STD_STRING
    +# define nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS  nssv_CONFIG_CONVERSION_STD_STRING
    +#endif
    +
    +#ifndef  nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS
    +# define nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS  1
    +#endif
    +
    +#ifndef  nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
    +# define nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS  1
    +#endif
    +
    +#ifndef  nssv_CONFIG_NO_STREAM_INSERTION
    +# define nssv_CONFIG_NO_STREAM_INSERTION  0
    +#endif
    +
    +// Control presence of exception handling (try and auto discover):
    +
    +#ifndef nssv_CONFIG_NO_EXCEPTIONS
    +# if defined(_MSC_VER)
    +#  include     // for _HAS_EXCEPTIONS
    +# endif
    +# if defined(__cpp_exceptions) || defined(__EXCEPTIONS) || (_HAS_EXCEPTIONS)
    +#  define nssv_CONFIG_NO_EXCEPTIONS  0
    +# else
    +#  define nssv_CONFIG_NO_EXCEPTIONS  1
    +# endif
    +#endif
    +
    +// C++ language version detection (C++23 is speculative):
    +// Note: VC14.0/1900 (VS2015) lacks too much from C++14.
    +
    +#ifndef   nssv_CPLUSPLUS
    +# if defined(_MSVC_LANG ) && !defined(__clang__)
    +#  define nssv_CPLUSPLUS  (_MSC_VER == 1900 ? 201103L : _MSVC_LANG )
    +# else
    +#  define nssv_CPLUSPLUS  __cplusplus
    +# endif
    +#endif
    +
    +#define nssv_CPP98_OR_GREATER  ( nssv_CPLUSPLUS >= 199711L )
    +#define nssv_CPP11_OR_GREATER  ( nssv_CPLUSPLUS >= 201103L )
    +#define nssv_CPP11_OR_GREATER_ ( nssv_CPLUSPLUS >= 201103L )
    +#define nssv_CPP14_OR_GREATER  ( nssv_CPLUSPLUS >= 201402L )
    +#define nssv_CPP17_OR_GREATER  ( nssv_CPLUSPLUS >= 201703L )
    +#define nssv_CPP20_OR_GREATER  ( nssv_CPLUSPLUS >= 202002L )
    +#define nssv_CPP23_OR_GREATER  ( nssv_CPLUSPLUS >= 202300L )
    +
    +// use C++17 std::string_view if available and requested:
    +
    +#if nssv_CPP17_OR_GREATER && defined(__has_include )
    +# if __has_include(  )
    +#  define nssv_HAVE_STD_STRING_VIEW  1
    +# else
    +#  define nssv_HAVE_STD_STRING_VIEW  0
    +# endif
    +#else
    +# define  nssv_HAVE_STD_STRING_VIEW  0
    +#endif
    +
    +#define  nssv_USES_STD_STRING_VIEW  ( (nssv_CONFIG_SELECT_STRING_VIEW == nssv_STRING_VIEW_STD) || ((nssv_CONFIG_SELECT_STRING_VIEW == nssv_STRING_VIEW_DEFAULT) && nssv_HAVE_STD_STRING_VIEW) )
    +
    +#define nssv_HAVE_STARTS_WITH ( nssv_CPP20_OR_GREATER || !nssv_USES_STD_STRING_VIEW )
    +#define nssv_HAVE_ENDS_WITH     nssv_HAVE_STARTS_WITH
    +
    +//
    +// Use C++17 std::string_view:
    +//
    +
    +#if nssv_USES_STD_STRING_VIEW
    +
    +#include 
    +
    +// Extensions for std::string:
    +
    +#if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
    +
    +namespace nonstd {
    +
    +template< class CharT, class Traits, class Allocator = std::allocator >
    +std::basic_string
    +to_string( std::basic_string_view v, Allocator const & a = Allocator() )
    +{
    +    return std::basic_string( v.begin(), v.end(), a );
    +}
    +
    +template< class CharT, class Traits, class Allocator >
    +std::basic_string_view
    +to_string_view( std::basic_string const & s )
    +{
    +    return std::basic_string_view( s.data(), s.size() );
    +}
    +
    +// Literal operators sv and _sv:
    +
    +#if nssv_CONFIG_STD_SV_OPERATOR
    +
    +using namespace std::literals::string_view_literals;
    +
    +#endif
    +
    +#if nssv_CONFIG_USR_SV_OPERATOR
    +
    +inline namespace literals {
    +inline namespace string_view_literals {
    +
    +
    +constexpr std::string_view operator "" _sv( const char* str, size_t len ) noexcept  // (1)
    +{
    +    return std::string_view{ str, len };
    +}
    +
    +constexpr std::u16string_view operator "" _sv( const char16_t* str, size_t len ) noexcept  // (2)
    +{
    +    return std::u16string_view{ str, len };
    +}
    +
    +constexpr std::u32string_view operator "" _sv( const char32_t* str, size_t len ) noexcept  // (3)
    +{
    +    return std::u32string_view{ str, len };
    +}
    +
    +constexpr std::wstring_view operator "" _sv( const wchar_t* str, size_t len ) noexcept  // (4)
    +{
    +    return std::wstring_view{ str, len };
    +}
    +
    +}} // namespace literals::string_view_literals
    +
    +#endif // nssv_CONFIG_USR_SV_OPERATOR
    +
    +} // namespace nonstd
    +
    +#endif // nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
    +
    +namespace nonstd {
    +
    +using std::string_view;
    +using std::wstring_view;
    +using std::u16string_view;
    +using std::u32string_view;
    +using std::basic_string_view;
    +
    +// literal "sv" and "_sv", see above
    +
    +using std::operator==;
    +using std::operator!=;
    +using std::operator<;
    +using std::operator<=;
    +using std::operator>;
    +using std::operator>=;
    +
    +using std::operator<<;
    +
    +} // namespace nonstd
    +
    +#else // nssv_HAVE_STD_STRING_VIEW
    +
    +//
    +// Before C++17: use string_view lite:
    +//
    +
    +// Compiler versions:
    +//
    +// MSVC++  6.0  _MSC_VER == 1200  nssv_COMPILER_MSVC_VERSION ==  60  (Visual Studio 6.0)
    +// MSVC++  7.0  _MSC_VER == 1300  nssv_COMPILER_MSVC_VERSION ==  70  (Visual Studio .NET 2002)
    +// MSVC++  7.1  _MSC_VER == 1310  nssv_COMPILER_MSVC_VERSION ==  71  (Visual Studio .NET 2003)
    +// MSVC++  8.0  _MSC_VER == 1400  nssv_COMPILER_MSVC_VERSION ==  80  (Visual Studio 2005)
    +// MSVC++  9.0  _MSC_VER == 1500  nssv_COMPILER_MSVC_VERSION ==  90  (Visual Studio 2008)
    +// MSVC++ 10.0  _MSC_VER == 1600  nssv_COMPILER_MSVC_VERSION == 100  (Visual Studio 2010)
    +// MSVC++ 11.0  _MSC_VER == 1700  nssv_COMPILER_MSVC_VERSION == 110  (Visual Studio 2012)
    +// MSVC++ 12.0  _MSC_VER == 1800  nssv_COMPILER_MSVC_VERSION == 120  (Visual Studio 2013)
    +// MSVC++ 14.0  _MSC_VER == 1900  nssv_COMPILER_MSVC_VERSION == 140  (Visual Studio 2015)
    +// MSVC++ 14.1  _MSC_VER >= 1910  nssv_COMPILER_MSVC_VERSION == 141  (Visual Studio 2017)
    +// MSVC++ 14.2  _MSC_VER >= 1920  nssv_COMPILER_MSVC_VERSION == 142  (Visual Studio 2019)
    +
    +#if defined(_MSC_VER ) && !defined(__clang__)
    +# define nssv_COMPILER_MSVC_VER      (_MSC_VER )
    +# define nssv_COMPILER_MSVC_VERSION  (_MSC_VER / 10 - 10 * ( 5 + (_MSC_VER < 1900 ) ) )
    +#else
    +# define nssv_COMPILER_MSVC_VER      0
    +# define nssv_COMPILER_MSVC_VERSION  0
    +#endif
    +
    +#define nssv_COMPILER_VERSION( major, minor, patch )  ( 10 * ( 10 * (major) + (minor) ) + (patch) )
    +
    +#if defined( __apple_build_version__ )
    +# define nssv_COMPILER_APPLECLANG_VERSION  nssv_COMPILER_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__)
    +# define nssv_COMPILER_CLANG_VERSION       0
    +#elif defined( __clang__ )
    +# define nssv_COMPILER_APPLECLANG_VERSION  0
    +# define nssv_COMPILER_CLANG_VERSION       nssv_COMPILER_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__)
    +#else
    +# define nssv_COMPILER_APPLECLANG_VERSION  0
    +# define nssv_COMPILER_CLANG_VERSION       0
    +#endif
    +
    +#if defined(__GNUC__) && !defined(__clang__)
    +# define nssv_COMPILER_GNUC_VERSION  nssv_COMPILER_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
    +#else
    +# define nssv_COMPILER_GNUC_VERSION  0
    +#endif
    +
    +// half-open range [lo..hi):
    +#define nssv_BETWEEN( v, lo, hi ) ( (lo) <= (v) && (v) < (hi) )
    +
    +// Presence of language and library features:
    +
    +#ifdef _HAS_CPP0X
    +# define nssv_HAS_CPP0X  _HAS_CPP0X
    +#else
    +# define nssv_HAS_CPP0X  0
    +#endif
    +
    +// Unless defined otherwise below, consider VC14 as C++11 for variant-lite:
    +
    +#if nssv_COMPILER_MSVC_VER >= 1900
    +# undef  nssv_CPP11_OR_GREATER
    +# define nssv_CPP11_OR_GREATER  1
    +#endif
    +
    +#define nssv_CPP11_90   (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1500)
    +#define nssv_CPP11_100  (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1600)
    +#define nssv_CPP11_110  (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1700)
    +#define nssv_CPP11_120  (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1800)
    +#define nssv_CPP11_140  (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1900)
    +#define nssv_CPP11_141  (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1910)
    +
    +#define nssv_CPP14_000  (nssv_CPP14_OR_GREATER)
    +#define nssv_CPP17_000  (nssv_CPP17_OR_GREATER)
    +
    +// Presence of C++11 language features:
    +
    +#define nssv_HAVE_CONSTEXPR_11          nssv_CPP11_140
    +#define nssv_HAVE_EXPLICIT_CONVERSION   nssv_CPP11_140
    +#define nssv_HAVE_INLINE_NAMESPACE      nssv_CPP11_140
    +#define nssv_HAVE_IS_DEFAULT            nssv_CPP11_140
    +#define nssv_HAVE_IS_DELETE             nssv_CPP11_140
    +#define nssv_HAVE_NOEXCEPT              nssv_CPP11_140
    +#define nssv_HAVE_NULLPTR               nssv_CPP11_100
    +#define nssv_HAVE_REF_QUALIFIER         nssv_CPP11_140
    +#define nssv_HAVE_UNICODE_LITERALS      nssv_CPP11_140
    +#define nssv_HAVE_USER_DEFINED_LITERALS nssv_CPP11_140
    +#define nssv_HAVE_WCHAR16_T             nssv_CPP11_100
    +#define nssv_HAVE_WCHAR32_T             nssv_CPP11_100
    +
    +#if ! ( ( nssv_CPP11_OR_GREATER && nssv_COMPILER_CLANG_VERSION ) || nssv_BETWEEN( nssv_COMPILER_CLANG_VERSION, 300, 400 ) )
    +# define nssv_HAVE_STD_DEFINED_LITERALS  nssv_CPP11_140
    +#else
    +# define nssv_HAVE_STD_DEFINED_LITERALS  0
    +#endif
    +
    +// Presence of C++14 language features:
    +
    +#define nssv_HAVE_CONSTEXPR_14          nssv_CPP14_000
    +
    +// Presence of C++17 language features:
    +
    +#define nssv_HAVE_NODISCARD             nssv_CPP17_000
    +
    +// Presence of C++ library features:
    +
    +#define nssv_HAVE_STD_HASH              nssv_CPP11_120
    +
    +// Presence of compiler intrinsics:
    +
    +// Providing char-type specializations for compare() and length() that
    +// use compiler intrinsics can improve compile- and run-time performance.
    +//
    +// The challenge is in using the right combinations of builtin availability
    +// and its constexpr-ness.
    +//
    +// | compiler | __builtin_memcmp (constexpr) | memcmp  (constexpr) |
    +// |----------|------------------------------|---------------------|
    +// | clang    | 4.0              (>= 4.0   ) | any     (?        ) |
    +// | clang-a  | 9.0              (>= 9.0   ) | any     (?        ) |
    +// | gcc      | any              (constexpr) | any     (?        ) |
    +// | msvc     | >= 14.2 C++17    (>= 14.2  ) | any     (?        ) |
    +
    +#define nssv_HAVE_BUILTIN_VER     ( (nssv_CPP17_000 && nssv_COMPILER_MSVC_VERSION >= 142) || nssv_COMPILER_GNUC_VERSION > 0 || nssv_COMPILER_CLANG_VERSION >= 400 || nssv_COMPILER_APPLECLANG_VERSION >= 900 )
    +#define nssv_HAVE_BUILTIN_CE      (  nssv_HAVE_BUILTIN_VER )
    +
    +#define nssv_HAVE_BUILTIN_MEMCMP  ( (nssv_HAVE_CONSTEXPR_14 && nssv_HAVE_BUILTIN_CE) || !nssv_HAVE_CONSTEXPR_14 )
    +#define nssv_HAVE_BUILTIN_STRLEN  ( (nssv_HAVE_CONSTEXPR_11 && nssv_HAVE_BUILTIN_CE) || !nssv_HAVE_CONSTEXPR_11 )
    +
    +#ifdef __has_builtin
    +# define nssv_HAVE_BUILTIN( x )  __has_builtin( x )
    +#else
    +# define nssv_HAVE_BUILTIN( x )  0
    +#endif
    +
    +#if nssv_HAVE_BUILTIN(__builtin_memcmp) || nssv_HAVE_BUILTIN_VER
    +# define nssv_BUILTIN_MEMCMP  __builtin_memcmp
    +#else
    +# define nssv_BUILTIN_MEMCMP  memcmp
    +#endif
    +
    +#if nssv_HAVE_BUILTIN(__builtin_strlen) || nssv_HAVE_BUILTIN_VER
    +# define nssv_BUILTIN_STRLEN  __builtin_strlen
    +#else
    +# define nssv_BUILTIN_STRLEN  strlen
    +#endif
    +
    +// C++ feature usage:
    +
    +#if nssv_HAVE_CONSTEXPR_11
    +# define nssv_constexpr  constexpr
    +#else
    +# define nssv_constexpr  /*constexpr*/
    +#endif
    +
    +#if  nssv_HAVE_CONSTEXPR_14
    +# define nssv_constexpr14  constexpr
    +#else
    +# define nssv_constexpr14  /*constexpr*/
    +#endif
    +
    +#if nssv_HAVE_EXPLICIT_CONVERSION
    +# define nssv_explicit  explicit
    +#else
    +# define nssv_explicit  /*explicit*/
    +#endif
    +
    +#if nssv_HAVE_INLINE_NAMESPACE
    +# define nssv_inline_ns  inline
    +#else
    +# define nssv_inline_ns  /*inline*/
    +#endif
    +
    +#if nssv_HAVE_NOEXCEPT
    +# define nssv_noexcept  noexcept
    +#else
    +# define nssv_noexcept  /*noexcept*/
    +#endif
    +
    +//#if nssv_HAVE_REF_QUALIFIER
    +//# define nssv_ref_qual  &
    +//# define nssv_refref_qual  &&
    +//#else
    +//# define nssv_ref_qual  /*&*/
    +//# define nssv_refref_qual  /*&&*/
    +//#endif
    +
    +#if nssv_HAVE_NULLPTR
    +# define nssv_nullptr  nullptr
    +#else
    +# define nssv_nullptr  NULL
    +#endif
    +
    +#if nssv_HAVE_NODISCARD
    +# define nssv_nodiscard  [[nodiscard]]
    +#else
    +# define nssv_nodiscard  /*[[nodiscard]]*/
    +#endif
    +
    +// Additional includes:
    +
    +#include 
    +#include 
    +#include 
    +#include 
    +#include    // std::char_traits<>
    +
    +#if ! nssv_CONFIG_NO_STREAM_INSERTION
    +# include 
    +#endif
    +
    +#if ! nssv_CONFIG_NO_EXCEPTIONS
    +# include 
    +#endif
    +
    +#if nssv_CPP11_OR_GREATER
    +# include 
    +#endif
    +
    +// Clang, GNUC, MSVC warning suppression macros:
    +
    +#if defined(__clang__)
    +# pragma clang diagnostic ignored "-Wreserved-user-defined-literal"
    +# pragma clang diagnostic push
    +# pragma clang diagnostic ignored "-Wuser-defined-literals"
    +#elif defined(__GNUC__)
    +# pragma  GCC  diagnostic push
    +# pragma  GCC  diagnostic ignored "-Wliteral-suffix"
    +#endif // __clang__
    +
    +#if nssv_COMPILER_MSVC_VERSION >= 140
    +# define nssv_SUPPRESS_MSGSL_WARNING(expr)        [[gsl::suppress(expr)]]
    +# define nssv_SUPPRESS_MSVC_WARNING(code, descr)  __pragma(warning(suppress: code) )
    +# define nssv_DISABLE_MSVC_WARNINGS(codes)        __pragma(warning(push))  __pragma(warning(disable: codes))
    +#else
    +# define nssv_SUPPRESS_MSGSL_WARNING(expr)
    +# define nssv_SUPPRESS_MSVC_WARNING(code, descr)
    +# define nssv_DISABLE_MSVC_WARNINGS(codes)
    +#endif
    +
    +#if defined(__clang__)
    +# define nssv_RESTORE_WARNINGS()  _Pragma("clang diagnostic pop")
    +#elif defined(__GNUC__)
    +# define nssv_RESTORE_WARNINGS()  _Pragma("GCC diagnostic pop")
    +#elif nssv_COMPILER_MSVC_VERSION >= 140
    +# define nssv_RESTORE_WARNINGS()  __pragma(warning(pop ))
    +#else
    +# define nssv_RESTORE_WARNINGS()
    +#endif
    +
    +// Suppress the following MSVC (GSL) warnings:
    +// - C4455, non-gsl   : 'operator ""sv': literal suffix identifiers that do not
    +//                      start with an underscore are reserved
    +// - C26472, gsl::t.1 : don't use a static_cast for arithmetic conversions;
    +//                      use brace initialization, gsl::narrow_cast or gsl::narow
    +// - C26481: gsl::b.1 : don't use pointer arithmetic. Use span instead
    +
    +nssv_DISABLE_MSVC_WARNINGS( 4455 26481 26472 )
    +//nssv_DISABLE_CLANG_WARNINGS( "-Wuser-defined-literals" )
    +//nssv_DISABLE_GNUC_WARNINGS( -Wliteral-suffix )
    +
    +namespace nonstd { namespace sv_lite {
    +
    +//
    +// basic_string_view declaration:
    +//
    +
    +template
    +<
    +    class CharT,
    +    class Traits = std::char_traits
    +>
    +class basic_string_view;
    +
    +namespace detail {
    +
    +// support constexpr comparison in C++14;
    +// for C++17 and later, use provided traits:
    +
    +template< typename CharT >
    +inline nssv_constexpr14 int compare( CharT const * s1, CharT const * s2, std::size_t count )
    +{
    +    while ( count-- != 0 )
    +    {
    +        if ( *s1 < *s2 ) return -1;
    +        if ( *s1 > *s2 ) return +1;
    +        ++s1; ++s2;
    +    }
    +    return 0;
    +}
    +
    +#if nssv_HAVE_BUILTIN_MEMCMP
    +
    +// specialization of compare() for char, see also generic compare() above:
    +
    +inline nssv_constexpr14 int compare( char const * s1, char const * s2, std::size_t count )
    +{
    +    return nssv_BUILTIN_MEMCMP( s1, s2, count );
    +}
    +
    +#endif
    +
    +#if nssv_HAVE_BUILTIN_STRLEN
    +
    +// specialization of length() for char, see also generic length() further below:
    +
    +inline nssv_constexpr std::size_t length( char const * s )
    +{
    +    return nssv_BUILTIN_STRLEN( s );
    +}
    +
    +#endif
    +
    +#if defined(__OPTIMIZE__)
    +
    +// gcc, clang provide __OPTIMIZE__
    +// Expect tail call optimization to make length() non-recursive:
    +
    +template< typename CharT >
    +inline nssv_constexpr std::size_t length( CharT * s, std::size_t result = 0 )
    +{
    +    return *s == '\0' ? result : length( s + 1, result + 1 );
    +}
    +
    +#else // OPTIMIZE
    +
    +// non-recursive:
    +
    +template< typename CharT >
    +inline nssv_constexpr14 std::size_t length( CharT * s )
    +{
    +    std::size_t result = 0;
    +    while ( *s++ != '\0' )
    +    {
    +       ++result;
    +    }
    +    return result;
    +}
    +
    +#endif // OPTIMIZE
    +
    +#if nssv_CPP11_OR_GREATER && ! nssv_CPP17_OR_GREATER
    +#if defined(__OPTIMIZE__)
    +
    +// gcc, clang provide __OPTIMIZE__
    +// Expect tail call optimization to make search() non-recursive:
    +
    +template< class CharT, class Traits = std::char_traits >
    +constexpr const CharT* search( basic_string_view haystack, basic_string_view needle )
    +{
    +    return haystack.starts_with( needle ) ? haystack.begin() :
    +        haystack.empty() ? haystack.end() : search( haystack.substr(1), needle );
    +}
    +
    +#else // OPTIMIZE
    +
    +// non-recursive:
    +
    +template< class CharT, class Traits = std::char_traits >
    +constexpr const CharT* search( basic_string_view haystack, basic_string_view needle )
    +{
    +    return std::search( haystack.begin(), haystack.end(), needle.begin(), needle.end() );
    +}
    +
    +#endif // OPTIMIZE
    +#endif // nssv_CPP11_OR_GREATER && ! nssv_CPP17_OR_GREATER
    +
    +} // namespace detail
    +
    +//
    +// basic_string_view:
    +//
    +
    +template
    +<
    +    class CharT,
    +    class Traits /* = std::char_traits */
    +>
    +class basic_string_view
    +{
    +public:
    +    // Member types:
    +
    +    typedef Traits traits_type;
    +    typedef CharT  value_type;
    +
    +    typedef CharT       * pointer;
    +    typedef CharT const * const_pointer;
    +    typedef CharT       & reference;
    +    typedef CharT const & const_reference;
    +
    +    typedef const_pointer iterator;
    +    typedef const_pointer const_iterator;
    +    typedef std::reverse_iterator< const_iterator > reverse_iterator;
    +    typedef std::reverse_iterator< const_iterator > const_reverse_iterator;
    +
    +    typedef std::size_t     size_type;
    +    typedef std::ptrdiff_t  difference_type;
    +
    +    // 24.4.2.1 Construction and assignment:
    +
    +    nssv_constexpr basic_string_view() nssv_noexcept
    +        : data_( nssv_nullptr )
    +        , size_( 0 )
    +    {}
    +
    +#if nssv_CPP11_OR_GREATER
    +    nssv_constexpr basic_string_view( basic_string_view const & other ) nssv_noexcept = default;
    +#else
    +    nssv_constexpr basic_string_view( basic_string_view const & other ) nssv_noexcept
    +        : data_( other.data_)
    +        , size_( other.size_)
    +    {}
    +#endif
    +
    +    nssv_constexpr basic_string_view( CharT const * s, size_type count ) nssv_noexcept // non-standard noexcept
    +        : data_( s )
    +        , size_( count )
    +    {}
    +
    +    nssv_constexpr basic_string_view( CharT const * s) nssv_noexcept // non-standard noexcept
    +        : data_( s )
    +#if nssv_CPP17_OR_GREATER
    +        , size_( Traits::length(s) )
    +#elif nssv_CPP11_OR_GREATER
    +        , size_( detail::length(s) )
    +#else
    +        , size_( Traits::length(s) )
    +#endif
    +    {}
    +
    +#if  nssv_HAVE_NULLPTR
    +# if nssv_HAVE_IS_DELETE
    +    nssv_constexpr basic_string_view( std::nullptr_t ) nssv_noexcept = delete;
    +# else
    +    private: nssv_constexpr basic_string_view( std::nullptr_t ) nssv_noexcept; public:
    +# endif
    +#endif
    +
    +    // Assignment:
    +
    +#if nssv_CPP11_OR_GREATER
    +    nssv_constexpr14 basic_string_view & operator=( basic_string_view const & other ) nssv_noexcept = default;
    +#else
    +    nssv_constexpr14 basic_string_view & operator=( basic_string_view const & other ) nssv_noexcept
    +    {
    +        data_ = other.data_;
    +        size_ = other.size_;
    +        return *this;
    +    }
    +#endif
    +
    +    // 24.4.2.2 Iterator support:
    +
    +    nssv_constexpr const_iterator begin()  const nssv_noexcept { return data_;         }
    +    nssv_constexpr const_iterator end()    const nssv_noexcept { return data_ + size_; }
    +
    +    nssv_constexpr const_iterator cbegin() const nssv_noexcept { return begin(); }
    +    nssv_constexpr const_iterator cend()   const nssv_noexcept { return end();   }
    +
    +    nssv_constexpr const_reverse_iterator rbegin()  const nssv_noexcept { return const_reverse_iterator( end() );   }
    +    nssv_constexpr const_reverse_iterator rend()    const nssv_noexcept { return const_reverse_iterator( begin() ); }
    +
    +    nssv_constexpr const_reverse_iterator crbegin() const nssv_noexcept { return rbegin(); }
    +    nssv_constexpr const_reverse_iterator crend()   const nssv_noexcept { return rend();   }
    +
    +    // 24.4.2.3 Capacity:
    +
    +    nssv_constexpr size_type size()     const nssv_noexcept { return size_; }
    +    nssv_constexpr size_type length()   const nssv_noexcept { return size_; }
    +    nssv_constexpr size_type max_size() const nssv_noexcept { return (std::numeric_limits< size_type >::max)(); }
    +
    +    // since C++20
    +    nssv_nodiscard nssv_constexpr bool empty() const nssv_noexcept
    +    {
    +        return 0 == size_;
    +    }
    +
    +    // 24.4.2.4 Element access:
    +
    +    nssv_constexpr const_reference operator[]( size_type pos ) const
    +    {
    +        return data_at( pos );
    +    }
    +
    +    nssv_constexpr14 const_reference at( size_type pos ) const
    +    {
    +#if nssv_CONFIG_NO_EXCEPTIONS
    +        assert( pos < size() );
    +#else
    +        if ( pos >= size() )
    +        {
    +            throw std::out_of_range("nonstd::string_view::at()");
    +        }
    +#endif
    +        return data_at( pos );
    +    }
    +
    +    nssv_constexpr const_reference front() const { return data_at( 0 );          }
    +    nssv_constexpr const_reference back()  const { return data_at( size() - 1 ); }
    +
    +    nssv_constexpr const_pointer   data()  const nssv_noexcept { return data_; }
    +
    +    // 24.4.2.5 Modifiers:
    +
    +    nssv_constexpr14 void remove_prefix( size_type n )
    +    {
    +        assert( n <= size() );
    +        data_ += n;
    +        size_ -= n;
    +    }
    +
    +    nssv_constexpr14 void remove_suffix( size_type n )
    +    {
    +        assert( n <= size() );
    +        size_ -= n;
    +    }
    +
    +    nssv_constexpr14 void swap( basic_string_view & other ) nssv_noexcept
    +    {
    +        const basic_string_view tmp(other);
    +        other = *this;
    +        *this = tmp;
    +    }
    +
    +    // 24.4.2.6 String operations:
    +
    +    size_type copy( CharT * dest, size_type n, size_type pos = 0 ) const
    +    {
    +#if nssv_CONFIG_NO_EXCEPTIONS
    +        assert( pos <= size() );
    +#else
    +        if ( pos > size() )
    +        {
    +            throw std::out_of_range("nonstd::string_view::copy()");
    +        }
    +#endif
    +        const size_type rlen = (std::min)( n, size() - pos );
    +
    +        (void) Traits::copy( dest, data() + pos, rlen );
    +
    +        return rlen;
    +    }
    +
    +    nssv_constexpr14 basic_string_view substr( size_type pos = 0, size_type n = npos ) const
    +    {
    +#if nssv_CONFIG_NO_EXCEPTIONS
    +        assert( pos <= size() );
    +#else
    +        if ( pos > size() )
    +        {
    +            throw std::out_of_range("nonstd::string_view::substr()");
    +        }
    +#endif
    +        return basic_string_view( data() + pos, (std::min)( n, size() - pos ) );
    +    }
    +
    +    // compare(), 6x:
    +
    +    nssv_constexpr14 int compare( basic_string_view other ) const nssv_noexcept // (1)
    +    {
    +#if nssv_CPP17_OR_GREATER
    +        if ( const int result = Traits::compare( data(), other.data(), (std::min)( size(), other.size() ) ) )
    +#else
    +        if ( const int result = detail::compare( data(), other.data(), (std::min)( size(), other.size() ) ) )
    +#endif
    +        {
    +            return result;
    +        }
    +
    +        return size() == other.size() ? 0 : size() < other.size() ? -1 : 1;
    +    }
    +
    +    nssv_constexpr int compare( size_type pos1, size_type n1, basic_string_view other ) const // (2)
    +    {
    +        return substr( pos1, n1 ).compare( other );
    +    }
    +
    +    nssv_constexpr int compare( size_type pos1, size_type n1, basic_string_view other, size_type pos2, size_type n2 ) const // (3)
    +    {
    +        return substr( pos1, n1 ).compare( other.substr( pos2, n2 ) );
    +    }
    +
    +    nssv_constexpr int compare( CharT const * s ) const // (4)
    +    {
    +        return compare( basic_string_view( s ) );
    +    }
    +
    +    nssv_constexpr int compare( size_type pos1, size_type n1, CharT const * s ) const // (5)
    +    {
    +        return substr( pos1, n1 ).compare( basic_string_view( s ) );
    +    }
    +
    +    nssv_constexpr int compare( size_type pos1, size_type n1, CharT const * s, size_type n2 ) const // (6)
    +    {
    +        return substr( pos1, n1 ).compare( basic_string_view( s, n2 ) );
    +    }
    +
    +    // 24.4.2.7 Searching:
    +
    +    // starts_with(), 3x, since C++20:
    +
    +    nssv_constexpr bool starts_with( basic_string_view v ) const nssv_noexcept  // (1)
    +    {
    +        return size() >= v.size() && compare( 0, v.size(), v ) == 0;
    +    }
    +
    +    nssv_constexpr bool starts_with( CharT c ) const nssv_noexcept  // (2)
    +    {
    +        return starts_with( basic_string_view( &c, 1 ) );
    +    }
    +
    +    nssv_constexpr bool starts_with( CharT const * s ) const  // (3)
    +    {
    +        return starts_with( basic_string_view( s ) );
    +    }
    +
    +    // ends_with(), 3x, since C++20:
    +
    +    nssv_constexpr bool ends_with( basic_string_view v ) const nssv_noexcept  // (1)
    +    {
    +        return size() >= v.size() && compare( size() - v.size(), npos, v ) == 0;
    +    }
    +
    +    nssv_constexpr bool ends_with( CharT c ) const nssv_noexcept  // (2)
    +    {
    +        return ends_with( basic_string_view( &c, 1 ) );
    +    }
    +
    +    nssv_constexpr bool ends_with( CharT const * s ) const  // (3)
    +    {
    +        return ends_with( basic_string_view( s ) );
    +    }
    +
    +    // find(), 4x:
    +
    +    nssv_constexpr size_type find( basic_string_view v, size_type pos = 0 ) const nssv_noexcept  // (1)
    +    {
    +        return assert( v.size() == 0 || v.data() != nssv_nullptr )
    +            , pos >= size()
    +            ? npos : to_pos(
    +#if nssv_CPP11_OR_GREATER && ! nssv_CPP17_OR_GREATER
    +                detail::search( substr(pos), v )
    +#else
    +                std::search( cbegin() + pos, cend(), v.cbegin(), v.cend(), Traits::eq )
    +#endif
    +            );
    +    }
    +
    +    nssv_constexpr size_type find( CharT c, size_type pos = 0 ) const nssv_noexcept  // (2)
    +    {
    +        return find( basic_string_view( &c, 1 ), pos );
    +    }
    +
    +    nssv_constexpr size_type find( CharT const * s, size_type pos, size_type n ) const  // (3)
    +    {
    +        return find( basic_string_view( s, n ), pos );
    +    }
    +
    +    nssv_constexpr size_type find( CharT const * s, size_type pos = 0 ) const  // (4)
    +    {
    +        return find( basic_string_view( s ), pos );
    +    }
    +
    +    // rfind(), 4x:
    +
    +    nssv_constexpr14 size_type rfind( basic_string_view v, size_type pos = npos ) const nssv_noexcept  // (1)
    +    {
    +        if ( size() < v.size() )
    +        {
    +            return npos;
    +        }
    +
    +        if ( v.empty() )
    +        {
    +            return (std::min)( size(), pos );
    +        }
    +
    +        const_iterator last   = cbegin() + (std::min)( size() - v.size(), pos ) + v.size();
    +        const_iterator result = std::find_end( cbegin(), last, v.cbegin(), v.cend(), Traits::eq );
    +
    +        return result != last ? size_type( result - cbegin() ) : npos;
    +    }
    +
    +    nssv_constexpr14 size_type rfind( CharT c, size_type pos = npos ) const nssv_noexcept  // (2)
    +    {
    +        return rfind( basic_string_view( &c, 1 ), pos );
    +    }
    +
    +    nssv_constexpr14 size_type rfind( CharT const * s, size_type pos, size_type n ) const  // (3)
    +    {
    +        return rfind( basic_string_view( s, n ), pos );
    +    }
    +
    +    nssv_constexpr14 size_type rfind( CharT const * s, size_type pos = npos ) const  // (4)
    +    {
    +        return rfind( basic_string_view( s ), pos );
    +    }
    +
    +    // find_first_of(), 4x:
    +
    +    nssv_constexpr size_type find_first_of( basic_string_view v, size_type pos = 0 ) const nssv_noexcept  // (1)
    +    {
    +        return pos >= size()
    +            ? npos
    +            : to_pos( std::find_first_of( cbegin() + pos, cend(), v.cbegin(), v.cend(), Traits::eq ) );
    +    }
    +
    +    nssv_constexpr size_type find_first_of( CharT c, size_type pos = 0 ) const nssv_noexcept  // (2)
    +    {
    +        return find_first_of( basic_string_view( &c, 1 ), pos );
    +    }
    +
    +    nssv_constexpr size_type find_first_of( CharT const * s, size_type pos, size_type n ) const  // (3)
    +    {
    +        return find_first_of( basic_string_view( s, n ), pos );
    +    }
    +
    +    nssv_constexpr size_type find_first_of(  CharT const * s, size_type pos = 0 ) const  // (4)
    +    {
    +        return find_first_of( basic_string_view( s ), pos );
    +    }
    +
    +    // find_last_of(), 4x:
    +
    +    nssv_constexpr size_type find_last_of( basic_string_view v, size_type pos = npos ) const nssv_noexcept  // (1)
    +    {
    +        return empty()
    +            ? npos
    +            : pos >= size()
    +            ? find_last_of( v, size() - 1 )
    +            : to_pos( std::find_first_of( const_reverse_iterator( cbegin() + pos + 1 ), crend(), v.cbegin(), v.cend(), Traits::eq ) );
    +    }
    +
    +    nssv_constexpr size_type find_last_of( CharT c, size_type pos = npos ) const nssv_noexcept  // (2)
    +    {
    +        return find_last_of( basic_string_view( &c, 1 ), pos );
    +    }
    +
    +    nssv_constexpr size_type find_last_of( CharT const * s, size_type pos, size_type count ) const  // (3)
    +    {
    +        return find_last_of( basic_string_view( s, count ), pos );
    +    }
    +
    +    nssv_constexpr size_type find_last_of( CharT const * s, size_type pos = npos ) const  // (4)
    +    {
    +        return find_last_of( basic_string_view( s ), pos );
    +    }
    +
    +    // find_first_not_of(), 4x:
    +
    +    nssv_constexpr size_type find_first_not_of( basic_string_view v, size_type pos = 0 ) const nssv_noexcept  // (1)
    +    {
    +        return pos >= size()
    +            ? npos
    +            : to_pos( std::find_if( cbegin() + pos, cend(), not_in_view( v ) ) );
    +    }
    +
    +    nssv_constexpr size_type find_first_not_of( CharT c, size_type pos = 0 ) const nssv_noexcept  // (2)
    +    {
    +        return find_first_not_of( basic_string_view( &c, 1 ), pos );
    +    }
    +
    +    nssv_constexpr size_type find_first_not_of( CharT const * s, size_type pos, size_type count ) const  // (3)
    +    {
    +        return find_first_not_of( basic_string_view( s, count ), pos );
    +    }
    +
    +    nssv_constexpr size_type find_first_not_of( CharT const * s, size_type pos = 0 ) const  // (4)
    +    {
    +        return find_first_not_of( basic_string_view( s ), pos );
    +    }
    +
    +    // find_last_not_of(), 4x:
    +
    +    nssv_constexpr size_type find_last_not_of( basic_string_view v, size_type pos = npos ) const nssv_noexcept  // (1)
    +    {
    +        return empty()
    +            ? npos
    +            : pos >= size()
    +            ? find_last_not_of( v, size() - 1 )
    +            : to_pos( std::find_if( const_reverse_iterator( cbegin() + pos + 1 ), crend(), not_in_view( v ) ) );
    +    }
    +
    +    nssv_constexpr size_type find_last_not_of( CharT c, size_type pos = npos ) const nssv_noexcept  // (2)
    +    {
    +        return find_last_not_of( basic_string_view( &c, 1 ), pos );
    +    }
    +
    +    nssv_constexpr size_type find_last_not_of( CharT const * s, size_type pos, size_type count ) const  // (3)
    +    {
    +        return find_last_not_of( basic_string_view( s, count ), pos );
    +    }
    +
    +    nssv_constexpr size_type find_last_not_of( CharT const * s, size_type pos = npos ) const  // (4)
    +    {
    +        return find_last_not_of( basic_string_view( s ), pos );
    +    }
    +
    +    // Constants:
    +
    +#if nssv_CPP17_OR_GREATER
    +    static nssv_constexpr size_type npos = size_type(-1);
    +#elif nssv_CPP11_OR_GREATER
    +    enum : size_type { npos = size_type(-1) };
    +#else
    +    enum { npos = size_type(-1) };
    +#endif
    +
    +private:
    +    struct not_in_view
    +    {
    +        const basic_string_view v;
    +
    +        nssv_constexpr explicit not_in_view( basic_string_view v_ ) : v( v_ ) {}
    +
    +        nssv_constexpr bool operator()( CharT c ) const
    +        {
    +            return npos == v.find_first_of( c );
    +        }
    +    };
    +
    +    nssv_constexpr size_type to_pos( const_iterator it ) const
    +    {
    +        return it == cend() ? npos : size_type( it - cbegin() );
    +    }
    +
    +    nssv_constexpr size_type to_pos( const_reverse_iterator it ) const
    +    {
    +        return it == crend() ? npos : size_type( crend() - it - 1 );
    +    }
    +
    +    nssv_constexpr const_reference data_at( size_type pos ) const
    +    {
    +#if nssv_BETWEEN( nssv_COMPILER_GNUC_VERSION, 1, 500 )
    +        return data_[pos];
    +#else
    +        return assert( pos < size() ), data_[pos];
    +#endif
    +    }
    +
    +private:
    +    const_pointer data_;
    +    size_type     size_;
    +
    +public:
    +#if nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS
    +
    +    template< class Allocator >
    +    basic_string_view( std::basic_string const & s ) nssv_noexcept
    +        : data_( s.data() )
    +        , size_( s.size() )
    +    {}
    +
    +#if nssv_HAVE_EXPLICIT_CONVERSION
    +
    +    template< class Allocator >
    +    explicit operator std::basic_string() const
    +    {
    +        return to_string( Allocator() );
    +    }
    +
    +#endif // nssv_HAVE_EXPLICIT_CONVERSION
    +
    +#if nssv_CPP11_OR_GREATER
    +
    +    template< class Allocator = std::allocator >
    +    std::basic_string
    +    to_string( Allocator const & a = Allocator() ) const
    +    {
    +        return std::basic_string( begin(), end(), a );
    +    }
    +
    +#else
    +
    +    std::basic_string
    +    to_string() const
    +    {
    +        return std::basic_string( begin(), end() );
    +    }
    +
    +    template< class Allocator >
    +    std::basic_string
    +    to_string( Allocator const & a ) const
    +    {
    +        return std::basic_string( begin(), end(), a );
    +    }
    +
    +#endif // nssv_CPP11_OR_GREATER
    +
    +#endif // nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS
    +};
    +
    +//
    +// Non-member functions:
    +//
    +
    +// 24.4.3 Non-member comparison functions:
    +// lexicographically compare two string views (function template):
    +
    +template< class CharT, class Traits >
    +nssv_constexpr bool operator== (
    +    basic_string_view  lhs,
    +    basic_string_view  rhs ) nssv_noexcept
    +{ return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; }
    +
    +template< class CharT, class Traits >
    +nssv_constexpr bool operator!= (
    +    basic_string_view  lhs,
    +    basic_string_view  rhs ) nssv_noexcept
    +{ return !( lhs == rhs ); }
    +
    +template< class CharT, class Traits >
    +nssv_constexpr bool operator< (
    +    basic_string_view  lhs,
    +    basic_string_view  rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) < 0; }
    +
    +template< class CharT, class Traits >
    +nssv_constexpr bool operator<= (
    +    basic_string_view  lhs,
    +    basic_string_view  rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) <= 0; }
    +
    +template< class CharT, class Traits >
    +nssv_constexpr bool operator> (
    +    basic_string_view  lhs,
    +    basic_string_view  rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) > 0; }
    +
    +template< class CharT, class Traits >
    +nssv_constexpr bool operator>= (
    +    basic_string_view  lhs,
    +    basic_string_view  rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) >= 0; }
    +
    +// Let S be basic_string_view, and sv be an instance of S.
    +// Implementations shall provide sufficient additional overloads marked
    +// constexpr and noexcept so that an object t with an implicit conversion
    +// to S can be compared according to Table 67.
    +
    +#if ! nssv_CPP11_OR_GREATER || nssv_BETWEEN( nssv_COMPILER_MSVC_VERSION, 100, 141 )
    +
    +// accommodate for older compilers:
    +
    +// ==
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator==(
    +    basic_string_view lhs,
    +    CharT const * rhs ) nssv_noexcept
    +{ return lhs.size() == detail::length( rhs ) && lhs.compare( rhs ) == 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator==(
    +    CharT const * lhs,
    +    basic_string_view rhs ) nssv_noexcept
    +{ return detail::length( lhs ) == rhs.size() && rhs.compare( lhs ) == 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator==(
    +    basic_string_view lhs,
    +    std::basic_string rhs ) nssv_noexcept
    +{ return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator==(
    +    std::basic_string rhs,
    +    basic_string_view lhs ) nssv_noexcept
    +{ return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; }
    +
    +// !=
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator!=(
    +    basic_string_view lhs,
    +    CharT const * rhs ) nssv_noexcept
    +{ return !( lhs == rhs ); }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator!=(
    +    CharT const * lhs,
    +    basic_string_view rhs ) nssv_noexcept
    +{ return !( lhs == rhs ); }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator!=(
    +    basic_string_view lhs,
    +    std::basic_string rhs ) nssv_noexcept
    +{ return !( lhs == rhs ); }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator!=(
    +    std::basic_string rhs,
    +    basic_string_view lhs ) nssv_noexcept
    +{ return !( lhs == rhs ); }
    +
    +// <
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator<(
    +    basic_string_view lhs,
    +    CharT const * rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) < 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator<(
    +    CharT const * lhs,
    +    basic_string_view rhs ) nssv_noexcept
    +{ return rhs.compare( lhs ) > 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator<(
    +    basic_string_view lhs,
    +    std::basic_string rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) < 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator<(
    +    std::basic_string rhs,
    +    basic_string_view lhs ) nssv_noexcept
    +{ return rhs.compare( lhs ) > 0; }
    +
    +// <=
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator<=(
    +    basic_string_view lhs,
    +    CharT const * rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) <= 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator<=(
    +    CharT const * lhs,
    +    basic_string_view rhs ) nssv_noexcept
    +{ return rhs.compare( lhs ) >= 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator<=(
    +    basic_string_view lhs,
    +    std::basic_string rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) <= 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator<=(
    +    std::basic_string rhs,
    +    basic_string_view lhs ) nssv_noexcept
    +{ return rhs.compare( lhs ) >= 0; }
    +
    +// >
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator>(
    +    basic_string_view lhs,
    +    CharT const * rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) > 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator>(
    +    CharT const * lhs,
    +    basic_string_view rhs ) nssv_noexcept
    +{ return rhs.compare( lhs ) < 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator>(
    +    basic_string_view lhs,
    +    std::basic_string rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) > 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator>(
    +    std::basic_string rhs,
    +    basic_string_view lhs ) nssv_noexcept
    +{ return rhs.compare( lhs ) < 0; }
    +
    +// >=
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator>=(
    +    basic_string_view lhs,
    +    CharT const * rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) >= 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator>=(
    +    CharT const * lhs,
    +    basic_string_view rhs ) nssv_noexcept
    +{ return rhs.compare( lhs ) <= 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator>=(
    +    basic_string_view lhs,
    +    std::basic_string rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) >= 0; }
    +
    +template< class CharT, class Traits>
    +nssv_constexpr bool operator>=(
    +    std::basic_string rhs,
    +    basic_string_view lhs ) nssv_noexcept
    +{ return rhs.compare( lhs ) <= 0; }
    +
    +#else // newer compilers:
    +
    +#define nssv_BASIC_STRING_VIEW_I(T,U)  typename std::decay< basic_string_view >::type
    +
    +#if defined(_MSC_VER)       // issue 40
    +# define nssv_MSVC_ORDER(x)  , int=x
    +#else
    +# define nssv_MSVC_ORDER(x)  /*, int=x*/
    +#endif
    +
    +// ==
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(1) >
    +nssv_constexpr bool operator==(
    +         basic_string_view   lhs,
    +    nssv_BASIC_STRING_VIEW_I(CharT, Traits) rhs ) nssv_noexcept
    +{ return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; }
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(2) >
    +nssv_constexpr bool operator==(
    +    nssv_BASIC_STRING_VIEW_I(CharT, Traits) lhs,
    +         basic_string_view   rhs ) nssv_noexcept
    +{ return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; }
    +
    +// !=
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(1) >
    +nssv_constexpr bool operator!= (
    +         basic_string_view  < CharT, Traits > lhs,
    +    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
    +{ return !( lhs == rhs ); }
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(2) >
    +nssv_constexpr bool operator!= (
    +    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
    +         basic_string_view  < CharT, Traits > rhs ) nssv_noexcept
    +{ return !( lhs == rhs ); }
    +
    +// <
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(1) >
    +nssv_constexpr bool operator< (
    +         basic_string_view  < CharT, Traits > lhs,
    +    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) < 0; }
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(2) >
    +nssv_constexpr bool operator< (
    +    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
    +         basic_string_view  < CharT, Traits > rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) < 0; }
    +
    +// <=
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(1) >
    +nssv_constexpr bool operator<= (
    +         basic_string_view  < CharT, Traits > lhs,
    +    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) <= 0; }
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(2) >
    +nssv_constexpr bool operator<= (
    +    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
    +         basic_string_view  < CharT, Traits > rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) <= 0; }
    +
    +// >
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(1) >
    +nssv_constexpr bool operator> (
    +         basic_string_view  < CharT, Traits > lhs,
    +    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) > 0; }
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(2) >
    +nssv_constexpr bool operator> (
    +    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
    +         basic_string_view  < CharT, Traits > rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) > 0; }
    +
    +// >=
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(1) >
    +nssv_constexpr bool operator>= (
    +         basic_string_view  < CharT, Traits > lhs,
    +    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) >= 0; }
    +
    +template< class CharT, class Traits  nssv_MSVC_ORDER(2) >
    +nssv_constexpr bool operator>= (
    +    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
    +         basic_string_view  < CharT, Traits > rhs ) nssv_noexcept
    +{ return lhs.compare( rhs ) >= 0; }
    +
    +#undef nssv_MSVC_ORDER
    +#undef nssv_BASIC_STRING_VIEW_I
    +
    +#endif // compiler-dependent approach to comparisons
    +
    +// 24.4.4 Inserters and extractors:
    +
    +#if ! nssv_CONFIG_NO_STREAM_INSERTION
    +
    +namespace detail {
    +
    +template< class Stream >
    +void write_padding( Stream & os, std::streamsize n )
    +{
    +    for ( std::streamsize i = 0; i < n; ++i )
    +        os.rdbuf()->sputc( os.fill() );
    +}
    +
    +template< class Stream, class View >
    +Stream & write_to_stream( Stream & os, View const & sv )
    +{
    +    typename Stream::sentry sentry( os );
    +
    +    if ( !sentry )
    +        return os;
    +
    +    const std::streamsize length = static_cast( sv.length() );
    +
    +    // Whether, and how, to pad:
    +    const bool      pad = ( length < os.width() );
    +    const bool left_pad = pad && ( os.flags() & std::ios_base::adjustfield ) == std::ios_base::right;
    +
    +    if ( left_pad )
    +        write_padding( os, os.width() - length );
    +
    +    // Write span characters:
    +    os.rdbuf()->sputn( sv.begin(), length );
    +
    +    if ( pad && !left_pad )
    +        write_padding( os, os.width() - length );
    +
    +    // Reset output stream width:
    +    os.width( 0 );
    +
    +    return os;
    +}
    +
    +} // namespace detail
    +
    +template< class CharT, class Traits >
    +std::basic_ostream &
    +operator<<(
    +    std::basic_ostream& os,
    +    basic_string_view  sv )
    +{
    +    return detail::write_to_stream( os, sv );
    +}
    +
    +#endif // nssv_CONFIG_NO_STREAM_INSERTION
    +
    +// Several typedefs for common character types are provided:
    +
    +typedef basic_string_view      string_view;
    +typedef basic_string_view   wstring_view;
    +#if nssv_HAVE_WCHAR16_T
    +typedef basic_string_view  u16string_view;
    +typedef basic_string_view  u32string_view;
    +#endif
    +
    +}} // namespace nonstd::sv_lite
    +
    +//
    +// 24.4.6 Suffix for basic_string_view literals:
    +//
    +
    +#if nssv_HAVE_USER_DEFINED_LITERALS
    +
    +namespace nonstd {
    +nssv_inline_ns namespace literals {
    +nssv_inline_ns namespace string_view_literals {
    +
    +#if nssv_CONFIG_STD_SV_OPERATOR && nssv_HAVE_STD_DEFINED_LITERALS
    +
    +nssv_constexpr nonstd::sv_lite::string_view operator "" sv( const char* str, size_t len ) nssv_noexcept  // (1)
    +{
    +    return nonstd::sv_lite::string_view{ str, len };
    +}
    +
    +nssv_constexpr nonstd::sv_lite::u16string_view operator "" sv( const char16_t* str, size_t len ) nssv_noexcept  // (2)
    +{
    +    return nonstd::sv_lite::u16string_view{ str, len };
    +}
    +
    +nssv_constexpr nonstd::sv_lite::u32string_view operator "" sv( const char32_t* str, size_t len ) nssv_noexcept  // (3)
    +{
    +    return nonstd::sv_lite::u32string_view{ str, len };
    +}
    +
    +nssv_constexpr nonstd::sv_lite::wstring_view operator "" sv( const wchar_t* str, size_t len ) nssv_noexcept  // (4)
    +{
    +    return nonstd::sv_lite::wstring_view{ str, len };
    +}
    +
    +#endif // nssv_CONFIG_STD_SV_OPERATOR && nssv_HAVE_STD_DEFINED_LITERALS
    +
    +#if nssv_CONFIG_USR_SV_OPERATOR
    +
    +nssv_constexpr nonstd::sv_lite::string_view operator "" _sv( const char* str, size_t len ) nssv_noexcept  // (1)
    +{
    +    return nonstd::sv_lite::string_view{ str, len };
    +}
    +
    +nssv_constexpr nonstd::sv_lite::u16string_view operator "" _sv( const char16_t* str, size_t len ) nssv_noexcept  // (2)
    +{
    +    return nonstd::sv_lite::u16string_view{ str, len };
    +}
    +
    +nssv_constexpr nonstd::sv_lite::u32string_view operator "" _sv( const char32_t* str, size_t len ) nssv_noexcept  // (3)
    +{
    +    return nonstd::sv_lite::u32string_view{ str, len };
    +}
    +
    +nssv_constexpr nonstd::sv_lite::wstring_view operator "" _sv( const wchar_t* str, size_t len ) nssv_noexcept  // (4)
    +{
    +    return nonstd::sv_lite::wstring_view{ str, len };
    +}
    +
    +#endif // nssv_CONFIG_USR_SV_OPERATOR
    +
    +}}} // namespace nonstd::literals::string_view_literals
    +
    +#endif
    +
    +//
    +// Extensions for std::string:
    +//
    +
    +#if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
    +
    +namespace nonstd {
    +namespace sv_lite {
    +
    +// Exclude MSVC 14 (19.00): it yields ambiguous to_string():
    +
    +#if nssv_CPP11_OR_GREATER && nssv_COMPILER_MSVC_VERSION != 140
    +
    +template< class CharT, class Traits, class Allocator = std::allocator >
    +std::basic_string
    +to_string( basic_string_view v, Allocator const & a = Allocator() )
    +{
    +    return std::basic_string( v.begin(), v.end(), a );
    +}
    +
    +#else
    +
    +template< class CharT, class Traits >
    +std::basic_string
    +to_string( basic_string_view v )
    +{
    +    return std::basic_string( v.begin(), v.end() );
    +}
    +
    +template< class CharT, class Traits, class Allocator >
    +std::basic_string
    +to_string( basic_string_view v, Allocator const & a )
    +{
    +    return std::basic_string( v.begin(), v.end(), a );
    +}
    +
    +#endif // nssv_CPP11_OR_GREATER
    +
    +template< class CharT, class Traits, class Allocator >
    +basic_string_view
    +to_string_view( std::basic_string const & s )
    +{
    +    return basic_string_view( s.data(), s.size() );
    +}
    +
    +}} // namespace nonstd::sv_lite
    +
    +#endif // nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
    +
    +//
    +// make types and algorithms available in namespace nonstd:
    +//
    +
    +namespace nonstd {
    +
    +using sv_lite::basic_string_view;
    +using sv_lite::string_view;
    +using sv_lite::wstring_view;
    +
    +#if nssv_HAVE_WCHAR16_T
    +using sv_lite::u16string_view;
    +#endif
    +#if nssv_HAVE_WCHAR32_T
    +using sv_lite::u32string_view;
    +#endif
    +
    +// literal "sv"
    +
    +using sv_lite::operator==;
    +using sv_lite::operator!=;
    +using sv_lite::operator<;
    +using sv_lite::operator<=;
    +using sv_lite::operator>;
    +using sv_lite::operator>=;
    +
    +#if ! nssv_CONFIG_NO_STREAM_INSERTION
    +using sv_lite::operator<<;
    +#endif
    +
    +#if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
    +using sv_lite::to_string;
    +using sv_lite::to_string_view;
    +#endif
    +
    +} // namespace nonstd
    +
    +// 24.4.5 Hash support (C++11):
    +
    +// Note: The hash value of a string view object is equal to the hash value of
    +// the corresponding string object.
    +
    +#if nssv_HAVE_STD_HASH
    +
    +#include 
    +
    +namespace std {
    +
    +template<>
    +struct hash< nonstd::string_view >
    +{
    +public:
    +    std::size_t operator()( nonstd::string_view v ) const nssv_noexcept
    +    {
    +        return std::hash()( std::string( v.data(), v.size() ) );
    +    }
    +};
    +
    +template<>
    +struct hash< nonstd::wstring_view >
    +{
    +public:
    +    std::size_t operator()( nonstd::wstring_view v ) const nssv_noexcept
    +    {
    +        return std::hash()( std::wstring( v.data(), v.size() ) );
    +    }
    +};
    +
    +template<>
    +struct hash< nonstd::u16string_view >
    +{
    +public:
    +    std::size_t operator()( nonstd::u16string_view v ) const nssv_noexcept
    +    {
    +        return std::hash()( std::u16string( v.data(), v.size() ) );
    +    }
    +};
    +
    +template<>
    +struct hash< nonstd::u32string_view >
    +{
    +public:
    +    std::size_t operator()( nonstd::u32string_view v ) const nssv_noexcept
    +    {
    +        return std::hash()( std::u32string( v.data(), v.size() ) );
    +    }
    +};
    +
    +} // namespace std
    +
    +#endif // nssv_HAVE_STD_HASH
    +
    +nssv_RESTORE_WARNINGS()
    +
    +#endif // nssv_HAVE_STD_STRING_VIEW
    +#endif // NONSTD_SV_LITE_H_INCLUDED
    +/* end file simdjson/nonstd/string_view.hpp */
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +namespace std {
    +  using string_view = nonstd::string_view;
    +}
    +#endif // SIMDJSON_HAS_STRING_VIEW
    +#undef SIMDJSON_HAS_STRING_VIEW // We are not going to need this macro anymore.
    +
    +/// If EXPR is an error, returns it.
    +#define SIMDJSON_TRY(EXPR) { auto _err = (EXPR); if (_err) { return _err; } }
    +
    +// Unless the programmer has already set SIMDJSON_DEVELOPMENT_CHECKS,
    +// we want to set it under debug builds. We detect a debug build
    +// under Visual Studio when the _DEBUG macro is set. Under the other
    +// compilers, we use the fact that they define __OPTIMIZE__ whenever
    +// they allow optimizations.
    +// It is possible that this could miss some cases where SIMDJSON_DEVELOPMENT_CHECKS
    +// is helpful, but the programmer can set the macro SIMDJSON_DEVELOPMENT_CHECKS.
    +// It could also wrongly set SIMDJSON_DEVELOPMENT_CHECKS (e.g., if the programmer
    +// sets _DEBUG in a release build under Visual Studio, or if some compiler fails to
    +// set the __OPTIMIZE__ macro).
    +#ifndef SIMDJSON_DEVELOPMENT_CHECKS
    +#ifdef _MSC_VER
    +// Visual Studio seems to set _DEBUG for debug builds.
    +#ifdef _DEBUG
    +#define SIMDJSON_DEVELOPMENT_CHECKS 1
    +#endif // _DEBUG
    +#else // _MSC_VER
    +// All other compilers appear to set __OPTIMIZE__ to a positive integer
    +// when the compiler is optimizing.
    +#ifndef __OPTIMIZE__
    +#define SIMDJSON_DEVELOPMENT_CHECKS 1
    +#endif // __OPTIMIZE__
    +#endif // _MSC_VER
    +#endif // SIMDJSON_DEVELOPMENT_CHECKS
    +
    +// The SIMDJSON_CHECK_EOF macro is a feature flag for the "don't require padding"
    +// feature.
    +
    +#if SIMDJSON_CPLUSPLUS17
    +// if we have C++, then fallthrough is a default attribute
    +# define simdjson_fallthrough [[fallthrough]]
    +// check if we have __attribute__ support
    +#elif defined(__has_attribute)
    +// check if we have the __fallthrough__ attribute
    +#if __has_attribute(__fallthrough__)
    +// we are good to go:
    +# define simdjson_fallthrough                    __attribute__((__fallthrough__))
    +#endif // __has_attribute(__fallthrough__)
    +#endif // SIMDJSON_CPLUSPLUS17
    +// on some systems, we simply do not have support for fallthrough, so use a default:
    +#ifndef simdjson_fallthrough
    +# define simdjson_fallthrough do {} while (0)  /* fallthrough */
    +#endif // simdjson_fallthrough
    +
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +#define SIMDJSON_DEVELOPMENT_ASSERT(expr) do { assert ((expr)); } while (0)
    +#else
    +#define SIMDJSON_DEVELOPMENT_ASSERT(expr) do { } while (0)
    +#endif
    +
    +#ifndef SIMDJSON_UTF8VALIDATION
    +#define SIMDJSON_UTF8VALIDATION 1
    +#endif
    +
    +#ifdef __has_include
    +// How do we detect that a compiler supports vbmi2?
    +// For sure if the following header is found, we are ok?
    +#if __has_include()
    +#define SIMDJSON_COMPILER_SUPPORTS_VBMI2 1
    +#endif
    +#endif
    +
    +#ifdef _MSC_VER
    +#if _MSC_VER >= 1920
    +// Visual Studio 2019 and up support VBMI2 under x64 even if the header
    +// avx512vbmi2intrin.h is not found.
    +#define SIMDJSON_COMPILER_SUPPORTS_VBMI2 1
    +#endif
    +#endif
    +
    +// By default, we allow AVX512.
    +#ifndef SIMDJSON_AVX512_ALLOWED
    +#define SIMDJSON_AVX512_ALLOWED 1
    +#endif
    +
    +#endif // SIMDJSON_COMMON_DEFS_H
    +/* end file simdjson/common_defs.h */
    +
    +// This provides the public API for simdjson.
    +// DOM and ondemand are amalgamated separately, in simdjson.h
    +/* including simdjson/simdjson_version.h: #include "simdjson/simdjson_version.h" */
    +/* begin file simdjson/simdjson_version.h */
    +// /include/simdjson/simdjson_version.h automatically generated by release.py,
    +// do not change by hand
    +#ifndef SIMDJSON_SIMDJSON_VERSION_H
    +#define SIMDJSON_SIMDJSON_VERSION_H
    +
    +/** The version of simdjson being used (major.minor.revision) */
    +#define SIMDJSON_VERSION "3.6.3"
    +
    +namespace simdjson {
    +enum {
    +  /**
    +   * The major version (MAJOR.minor.revision) of simdjson being used.
    +   */
    +  SIMDJSON_VERSION_MAJOR = 3,
    +  /**
    +   * The minor version (major.MINOR.revision) of simdjson being used.
    +   */
    +  SIMDJSON_VERSION_MINOR = 6,
    +  /**
    +   * The revision (major.minor.REVISION) of simdjson being used.
    +   */
    +  SIMDJSON_VERSION_REVISION = 3
    +};
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_SIMDJSON_VERSION_H
    +/* end file simdjson/simdjson_version.h */
    +
    +/* including simdjson/base.h: #include "simdjson/base.h" */
    +/* begin file simdjson/base.h */
    +/**
    + * @file Base declarations for all simdjson headers
    + * @private
    + */
    +#ifndef SIMDJSON_BASE_H
    +#define SIMDJSON_BASE_H
    +
    +/* skipped duplicate #include "simdjson/common_defs.h" */
    +/* skipped duplicate #include "simdjson/compiler_check.h" */
    +/* including simdjson/error.h: #include "simdjson/error.h" */
    +/* begin file simdjson/error.h */
    +#ifndef SIMDJSON_ERROR_H
    +#define SIMDJSON_ERROR_H
    +
    +/* skipped duplicate #include "simdjson/base.h" */
    +
    +#include 
    +#include 
    +
    +namespace simdjson {
    +
    +/**
    + * All possible errors returned by simdjson. These error codes are subject to change
    + * and not all simdjson kernel returns the same error code given the same input: it is not
    + * well defined which error a given input should produce.
    + *
    + * Only SUCCESS evaluates to false as a Boolean. All other error codes will evaluate
    + * to true as a Boolean.
    + */
    +enum error_code {
    +  SUCCESS = 0,                ///< No error
    +  CAPACITY,                   ///< This parser can't support a document that big
    +  MEMALLOC,                   ///< Error allocating memory, most likely out of memory
    +  TAPE_ERROR,                 ///< Something went wrong, this is a generic error
    +  DEPTH_ERROR,                ///< Your document exceeds the user-specified depth limitation
    +  STRING_ERROR,               ///< Problem while parsing a string
    +  T_ATOM_ERROR,               ///< Problem while parsing an atom starting with the letter 't'
    +  F_ATOM_ERROR,               ///< Problem while parsing an atom starting with the letter 'f'
    +  N_ATOM_ERROR,               ///< Problem while parsing an atom starting with the letter 'n'
    +  NUMBER_ERROR,               ///< Problem while parsing a number
    +  UTF8_ERROR,                 ///< the input is not valid UTF-8
    +  UNINITIALIZED,              ///< unknown error, or uninitialized document
    +  EMPTY,                      ///< no structural element found
    +  UNESCAPED_CHARS,            ///< found unescaped characters in a string.
    +  UNCLOSED_STRING,            ///< missing quote at the end
    +  UNSUPPORTED_ARCHITECTURE,   ///< unsupported architecture
    +  INCORRECT_TYPE,             ///< JSON element has a different type than user expected
    +  NUMBER_OUT_OF_RANGE,        ///< JSON number does not fit in 64 bits
    +  INDEX_OUT_OF_BOUNDS,        ///< JSON array index too large
    +  NO_SUCH_FIELD,              ///< JSON field not found in object
    +  IO_ERROR,                   ///< Error reading a file
    +  INVALID_JSON_POINTER,       ///< Invalid JSON pointer reference
    +  INVALID_URI_FRAGMENT,       ///< Invalid URI fragment
    +  UNEXPECTED_ERROR,           ///< indicative of a bug in simdjson
    +  PARSER_IN_USE,              ///< parser is already in use.
    +  OUT_OF_ORDER_ITERATION,     ///< tried to iterate an array or object out of order (checked when SIMDJSON_DEVELOPMENT_CHECKS=1)
    +  INSUFFICIENT_PADDING,       ///< The JSON doesn't have enough padding for simdjson to safely parse it.
    +  INCOMPLETE_ARRAY_OR_OBJECT, ///< The document ends early.
    +  SCALAR_DOCUMENT_AS_VALUE,   ///< A scalar document is treated as a value.
    +  OUT_OF_BOUNDS,              ///< Attempted to access location outside of document.
    +  TRAILING_CONTENT,           ///< Unexpected trailing content in the JSON input
    +  NUM_ERROR_CODES
    +};
    +
    +/**
    + * It is the convention throughout the code that  the macro SIMDJSON_DEVELOPMENT_CHECKS determines whether
    + * we check for OUT_OF_ORDER_ITERATION. The logic behind it is that these errors only occurs when the code
    + * that was written while breaking some simdjson::ondemand requirement. They should not occur in released
    + * code after these issues were fixed.
    + */
    +
    +/**
    + * Get the error message for the given error code.
    + *
    + *   dom::parser parser;
    + *   dom::element doc;
    + *   auto error = parser.parse("foo",3).get(doc);
    + *   if (error) { printf("Error: %s\n", error_message(error)); }
    + *
    + * @return The error message.
    + */
    +inline const char *error_message(error_code error) noexcept;
    +
    +/**
    + * Write the error message to the output stream
    + */
    +inline std::ostream& operator<<(std::ostream& out, error_code error) noexcept;
    +
    +/**
    + * Exception thrown when an exception-supporting simdjson method is called
    + */
    +struct simdjson_error : public std::exception {
    +  /**
    +   * Create an exception from a simdjson error code.
    +   * @param error The error code
    +   */
    +  simdjson_error(error_code error) noexcept : _error{error} { }
    +  /** The error message */
    +  const char *what() const noexcept { return error_message(error()); }
    +  /** The error code */
    +  error_code error() const noexcept { return _error; }
    +private:
    +  /** The error code that was used */
    +  error_code _error;
    +};
    +
    +namespace internal {
    +
    +/**
    + * The result of a simdjson operation that could fail.
    + *
    + * Gives the option of reading error codes, or throwing an exception by casting to the desired result.
    + *
    + * This is a base class for implementations that want to add functions to the result type for
    + * chaining.
    + *
    + * Override like:
    + *
    + *   struct simdjson_result : public internal::simdjson_result_base {
    + *     simdjson_result() noexcept : internal::simdjson_result_base() {}
    + *     simdjson_result(error_code error) noexcept : internal::simdjson_result_base(error) {}
    + *     simdjson_result(T &&value) noexcept : internal::simdjson_result_base(std::forward(value)) {}
    + *     simdjson_result(T &&value, error_code error) noexcept : internal::simdjson_result_base(value, error) {}
    + *     // Your extra methods here
    + *   }
    + *
    + * Then any method returning simdjson_result will be chainable with your methods.
    + */
    +template
    +struct simdjson_result_base : protected std::pair {
    +
    +  /**
    +   * Create a new empty result with error = UNINITIALIZED.
    +   */
    +  simdjson_inline simdjson_result_base() noexcept;
    +
    +  /**
    +   * Create a new error result.
    +   */
    +  simdjson_inline simdjson_result_base(error_code error) noexcept;
    +
    +  /**
    +   * Create a new successful result.
    +   */
    +  simdjson_inline simdjson_result_base(T &&value) noexcept;
    +
    +  /**
    +   * Create a new result with both things (use if you don't want to branch when creating the result).
    +   */
    +  simdjson_inline simdjson_result_base(T &&value, error_code error) noexcept;
    +
    +  /**
    +   * Move the value and the error to the provided variables.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   * @param error The variable to assign the error to. Set to SUCCESS if there is no error.
    +   */
    +  simdjson_inline void tie(T &value, error_code &error) && noexcept;
    +
    +  /**
    +   * Move the value to the provided variable.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   */
    +  simdjson_inline error_code get(T &value) && noexcept;
    +
    +  /**
    +   * The error.
    +   */
    +  simdjson_inline error_code error() const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value.
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T& value() & noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& value() && noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& take_value() && noexcept(false);
    +
    +  /**
    +   * Cast to the value (will throw on error).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline operator T&&() && noexcept(false);
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline const T& value_unsafe() const& noexcept;
    +
    +  /**
    +   * Take the result value (move it). This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T&& value_unsafe() && noexcept;
    +
    +}; // struct simdjson_result_base
    +
    +} // namespace internal
    +
    +/**
    + * The result of a simdjson operation that could fail.
    + *
    + * Gives the option of reading error codes, or throwing an exception by casting to the desired result.
    + */
    +template
    +struct simdjson_result : public internal::simdjson_result_base {
    +  /**
    +   * @private Create a new empty result with error = UNINITIALIZED.
    +   */
    +  simdjson_inline simdjson_result() noexcept;
    +  /**
    +   * @private Create a new successful result.
    +   */
    +  simdjson_inline simdjson_result(T &&value) noexcept;
    +  /**
    +   * @private Create a new error result.
    +   */
    +  simdjson_inline simdjson_result(error_code error_code) noexcept;
    +  /**
    +   * @private Create a new result with both things (use if you don't want to branch when creating the result).
    +   */
    +  simdjson_inline simdjson_result(T &&value, error_code error) noexcept;
    +
    +  /**
    +   * Move the value and the error to the provided variables.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   * @param error The variable to assign the error to. Set to SUCCESS if there is no error.
    +   */
    +  simdjson_inline void tie(T &value, error_code &error) && noexcept;
    +
    +  /**
    +   * Move the value to the provided variable.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code get(T &value) && noexcept;
    +
    +  /**
    +   * The error.
    +   */
    +  simdjson_inline error_code error() const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value.
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T& value() & noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& value() && noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& take_value() && noexcept(false);
    +
    +  /**
    +   * Cast to the value (will throw on error).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline operator T&&() && noexcept(false);
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline const T& value_unsafe() const& noexcept;
    +
    +  /**
    +   * Take the result value (move it). This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T&& value_unsafe() && noexcept;
    +
    +}; // struct simdjson_result
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +template
    +inline std::ostream& operator<<(std::ostream& out, simdjson_result value) { return out << value.value(); }
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +#ifndef SIMDJSON_DISABLE_DEPRECATED_API
    +/**
    + * @deprecated This is an alias and will be removed, use error_code instead
    + */
    +using ErrorValues [[deprecated("This is an alias and will be removed, use error_code instead")]] = error_code;
    +
    +/**
    + * @deprecated Error codes should be stored and returned as `error_code`, use `error_message()` instead.
    + */
    +[[deprecated("Error codes should be stored and returned as `error_code`, use `error_message()` instead.")]]
    +inline const std::string error_message(int error) noexcept;
    +#endif // SIMDJSON_DISABLE_DEPRECATED_API
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ERROR_H
    +/* end file simdjson/error.h */
    +/* skipped duplicate #include "simdjson/portability.h" */
    +
    +/**
    + * @brief The top level simdjson namespace, containing everything the library provides.
    + */
    +namespace simdjson {
    +
    +SIMDJSON_PUSH_DISABLE_UNUSED_WARNINGS
    +
    +/** The maximum document size supported by simdjson. */
    +constexpr size_t SIMDJSON_MAXSIZE_BYTES = 0xFFFFFFFF;
    +
    +/**
    + * The amount of padding needed in a buffer to parse JSON.
    + *
    + * The input buf should be readable up to buf + SIMDJSON_PADDING
    + * this is a stopgap; there should be a better description of the
    + * main loop and its behavior that abstracts over this
    + * See https://github.com/simdjson/simdjson/issues/174
    + */
    +constexpr size_t SIMDJSON_PADDING = 64;
    +
    +/**
    + * By default, simdjson supports this many nested objects and arrays.
    + *
    + * This is the default for parser::max_depth().
    + */
    +constexpr size_t DEFAULT_MAX_DEPTH = 1024;
    +
    +SIMDJSON_POP_DISABLE_UNUSED_WARNINGS
    +
    +class implementation;
    +struct padded_string;
    +class padded_string_view;
    +enum class stage1_mode;
    +
    +namespace internal {
    +
    +template
    +class atomic_ptr;
    +class dom_parser_implementation;
    +class escape_json_string;
    +class tape_ref;
    +struct value128;
    +enum class tape_type;
    +
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_BASE_H
    +/* end file simdjson/base.h */
    +
    +/* skipped duplicate #include "simdjson/error.h" */
    +/* including simdjson/error-inl.h: #include "simdjson/error-inl.h" */
    +/* begin file simdjson/error-inl.h */
    +#ifndef SIMDJSON_ERROR_INL_H
    +#define SIMDJSON_ERROR_INL_H
    +
    +/* skipped duplicate #include "simdjson/error.h" */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace internal {
    +  // We store the error code so we can validate the error message is associated with the right code
    +  struct error_code_info {
    +    error_code code;
    +    const char* message; // do not use a fancy std::string where a simple C string will do (no alloc, no destructor)
    +  };
    +  // These MUST match the codes in error_code. We check this constraint in basictests.
    +  extern SIMDJSON_DLLIMPORTEXPORT const error_code_info error_codes[];
    +} // namespace internal
    +
    +
    +inline const char *error_message(error_code error) noexcept {
    +  // If you're using error_code, we're trusting you got it from the enum.
    +  return internal::error_codes[int(error)].message;
    +}
    +
    +// deprecated function
    +#ifndef SIMDJSON_DISABLE_DEPRECATED_API
    +inline const std::string error_message(int error) noexcept {
    +  if (error < 0 || error >= error_code::NUM_ERROR_CODES) {
    +    return internal::error_codes[UNEXPECTED_ERROR].message;
    +  }
    +  return internal::error_codes[error].message;
    +}
    +#endif // SIMDJSON_DISABLE_DEPRECATED_API
    +
    +inline std::ostream& operator<<(std::ostream& out, error_code error) noexcept {
    +  return out << error_message(error);
    +}
    +
    +namespace internal {
    +
    +//
    +// internal::simdjson_result_base inline implementation
    +//
    +
    +template
    +simdjson_inline void simdjson_result_base::tie(T &value, error_code &error) && noexcept {
    +  error = this->second;
    +  if (!error) {
    +    value = std::forward>(*this).first;
    +  }
    +}
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code simdjson_result_base::get(T &value) && noexcept {
    +  error_code error;
    +  std::forward>(*this).tie(value, error);
    +  return error;
    +}
    +
    +template
    +simdjson_inline error_code simdjson_result_base::error() const noexcept {
    +  return this->second;
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline T& simdjson_result_base::value() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& simdjson_result_base::value() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +template
    +simdjson_inline T&& simdjson_result_base::take_value() && noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline simdjson_result_base::operator T&&() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline const T& simdjson_result_base::value_unsafe() const& noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& simdjson_result_base::value_unsafe() && noexcept {
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline simdjson_result_base::simdjson_result_base(T &&value, error_code error) noexcept
    +    : std::pair(std::forward(value), error) {}
    +template
    +simdjson_inline simdjson_result_base::simdjson_result_base(error_code error) noexcept
    +    : simdjson_result_base(T{}, error) {}
    +template
    +simdjson_inline simdjson_result_base::simdjson_result_base(T &&value) noexcept
    +    : simdjson_result_base(std::forward(value), SUCCESS) {}
    +template
    +simdjson_inline simdjson_result_base::simdjson_result_base() noexcept
    +    : simdjson_result_base(T{}, UNINITIALIZED) {}
    +
    +} // namespace internal
    +
    +///
    +/// simdjson_result inline implementation
    +///
    +
    +template
    +simdjson_inline void simdjson_result::tie(T &value, error_code &error) && noexcept {
    +  std::forward>(*this).tie(value, error);
    +}
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &value) && noexcept {
    +  return std::forward>(*this).get(value);
    +}
    +
    +template
    +simdjson_inline error_code simdjson_result::error() const noexcept {
    +  return internal::simdjson_result_base::error();
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline T& simdjson_result::value() & noexcept(false) {
    +  return internal::simdjson_result_base::value();
    +}
    +
    +template
    +simdjson_inline T&& simdjson_result::value() && noexcept(false) {
    +  return std::forward>(*this).value();
    +}
    +
    +template
    +simdjson_inline T&& simdjson_result::take_value() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +template
    +simdjson_inline simdjson_result::operator T&&() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline const T& simdjson_result::value_unsafe() const& noexcept {
    +  return internal::simdjson_result_base::value_unsafe();
    +}
    +
    +template
    +simdjson_inline T&& simdjson_result::value_unsafe() && noexcept {
    +  return std::forward>(*this).value_unsafe();
    +}
    +
    +template
    +simdjson_inline simdjson_result::simdjson_result(T &&value, error_code error) noexcept
    +    : internal::simdjson_result_base(std::forward(value), error) {}
    +template
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : internal::simdjson_result_base(error) {}
    +template
    +simdjson_inline simdjson_result::simdjson_result(T &&value) noexcept
    +    : internal::simdjson_result_base(std::forward(value)) {}
    +template
    +simdjson_inline simdjson_result::simdjson_result() noexcept
    +    : internal::simdjson_result_base() {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ERROR_INL_H
    +/* end file simdjson/error-inl.h */
    +/* including simdjson/implementation.h: #include "simdjson/implementation.h" */
    +/* begin file simdjson/implementation.h */
    +#ifndef SIMDJSON_IMPLEMENTATION_H
    +#define SIMDJSON_IMPLEMENTATION_H
    +
    +/* including simdjson/internal/atomic_ptr.h: #include "simdjson/internal/atomic_ptr.h" */
    +/* begin file simdjson/internal/atomic_ptr.h */
    +#ifndef SIMDJSON_INTERNAL_ATOMIC_PTR_H
    +#define SIMDJSON_INTERNAL_ATOMIC_PTR_H
    +
    +/* skipped duplicate #include "simdjson/base.h" */
    +#include 
    +
    +namespace simdjson {
    +namespace internal {
    +
    +template
    +class atomic_ptr {
    +public:
    +  atomic_ptr(T *_ptr) : ptr{_ptr} {}
    +
    +  operator const T*() const { return ptr.load(); }
    +  const T& operator*() const { return *ptr; }
    +  const T* operator->() const { return ptr.load(); }
    +
    +  operator T*() { return ptr.load(); }
    +  T& operator*() { return *ptr; }
    +  T* operator->() { return ptr.load(); }
    +  atomic_ptr& operator=(T *_ptr) { ptr = _ptr; return *this; }
    +
    +private:
    +  std::atomic ptr;
    +};
    +
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_INTERNAL_ATOMIC_PTR_H
    +/* end file simdjson/internal/atomic_ptr.h */
    +/* including simdjson/internal/dom_parser_implementation.h: #include "simdjson/internal/dom_parser_implementation.h" */
    +/* begin file simdjson/internal/dom_parser_implementation.h */
    +#ifndef SIMDJSON_INTERNAL_DOM_PARSER_IMPLEMENTATION_H
    +#define SIMDJSON_INTERNAL_DOM_PARSER_IMPLEMENTATION_H
    +
    +/* skipped duplicate #include "simdjson/base.h" */
    +/* skipped duplicate #include "simdjson/error.h" */
    +#include 
    +
    +namespace simdjson {
    +
    +namespace dom {
    +class document;
    +} // namespace dom
    +
    +/**
    +* This enum is used with the dom_parser_implementation::stage1 function.
    +* 1) The regular mode expects a fully formed JSON document.
    +* 2) The streaming_partial mode expects a possibly truncated
    +* input within a stream on JSON documents.
    +* 3) The stream_final mode allows us to truncate final
    +* unterminated strings. It is useful in conjunction with streaming_partial.
    +*/
    +enum class stage1_mode { regular, streaming_partial, streaming_final};
    +
    +/**
    + * Returns true if mode == streaming_partial or mode == streaming_final
    + */
    +inline bool is_streaming(stage1_mode mode) {
    +  // performance note: it is probably faster to check that mode is different
    +  // from regular than checking that it is either streaming_partial or streaming_final.
    +  return (mode != stage1_mode::regular);
    +  // return (mode == stage1_mode::streaming_partial || mode == stage1_mode::streaming_final);
    +}
    +
    +
    +namespace internal {
    +
    +
    +/**
    + * An implementation of simdjson's DOM parser for a particular CPU architecture.
    + *
    + * This class is expected to be accessed only by pointer, and never move in memory (though the
    + * pointer can move).
    + */
    +class dom_parser_implementation {
    +public:
    +
    +  /**
    +   * @private For internal implementation use
    +   *
    +   * Run a full JSON parse on a single document (stage1 + stage2).
    +   *
    +   * Guaranteed only to be called when capacity > document length.
    +   *
    +   * Overridden by each implementation.
    +   *
    +   * @param buf The json document to parse. *MUST* be allocated up to len + SIMDJSON_PADDING bytes.
    +   * @param len The length of the json document.
    +   * @return The error code, or SUCCESS if there was no error.
    +   */
    +  simdjson_warn_unused virtual error_code parse(const uint8_t *buf, size_t len, dom::document &doc) noexcept = 0;
    +
    +  /**
    +   * @private For internal implementation use
    +   *
    +   * Stage 1 of the document parser.
    +   *
    +   * Guaranteed only to be called when capacity > document length.
    +   *
    +   * Overridden by each implementation.
    +   *
    +   * @param buf The json document to parse.
    +   * @param len The length of the json document.
    +   * @param streaming Whether this is being called by parser::parse_many.
    +   * @return The error code, or SUCCESS if there was no error.
    +   */
    +  simdjson_warn_unused virtual error_code stage1(const uint8_t *buf, size_t len, stage1_mode streaming) noexcept = 0;
    +
    +  /**
    +   * @private For internal implementation use
    +   *
    +   * Stage 2 of the document parser.
    +   *
    +   * Called after stage1().
    +   *
    +   * Overridden by each implementation.
    +   *
    +   * @param doc The document to output to.
    +   * @return The error code, or SUCCESS if there was no error.
    +   */
    +  simdjson_warn_unused virtual error_code stage2(dom::document &doc) noexcept = 0;
    +
    +  /**
    +   * @private For internal implementation use
    +   *
    +   * Stage 2 of the document parser for parser::parse_many.
    +   *
    +   * Guaranteed only to be called after stage1().
    +   * Overridden by each implementation.
    +   *
    +   * @param doc The document to output to.
    +   * @return The error code, SUCCESS if there was no error, or EMPTY if all documents have been parsed.
    +   */
    +  simdjson_warn_unused virtual error_code stage2_next(dom::document &doc) noexcept = 0;
    +
    +  /**
    +   * Unescape a valid UTF-8 string from src to dst, stopping at a final unescaped quote. There
    +   * must be an unescaped quote terminating the string. It returns the final output
    +   * position as pointer. In case of error (e.g., the string has bad escaped codes),
    +   * then null_nullptrptr is returned. It is assumed that the output buffer is large
    +   * enough. E.g., if src points at 'joe"', then dst needs to have four free bytes +
    +   * SIMDJSON_PADDING bytes.
    +   *
    +   * Overridden by each implementation.
    +   *
    +   * @param str pointer to the beginning of a valid UTF-8 JSON string, must end with an unescaped quote.
    +   * @param dst pointer to a destination buffer, it must point a region in memory of sufficient size.
    +   * @param allow_replacement whether we allow a replacement character when the UTF-8 contains unmatched surrogate pairs.
    +   * @return end of the of the written region (exclusive) or nullptr in case of error.
    +   */
    +  simdjson_warn_unused virtual uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) const noexcept = 0;
    +
    +  /**
    +   * Unescape a NON-valid UTF-8 string from src to dst, stopping at a final unescaped quote. There
    +   * must be an unescaped quote terminating the string. It returns the final output
    +   * position as pointer. In case of error (e.g., the string has bad escaped codes),
    +   * then null_nullptrptr is returned. It is assumed that the output buffer is large
    +   * enough. E.g., if src points at 'joe"', then dst needs to have four free bytes +
    +   * SIMDJSON_PADDING bytes.
    +   *
    +   * Overridden by each implementation.
    +   *
    +   * @param str pointer to the beginning of a possibly invalid UTF-8 JSON string, must end with an unescaped quote.
    +   * @param dst pointer to a destination buffer, it must point a region in memory of sufficient size.
    +   * @return end of the of the written region (exclusive) or nullptr in case of error.
    +   */
    +  simdjson_warn_unused virtual uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept = 0;
    +
    +  /**
    +   * Change the capacity of this parser.
    +   *
    +   * The capacity can never exceed SIMDJSON_MAXSIZE_BYTES (e.g., 4 GB)
    +   * and an CAPACITY error is returned if it is attempted.
    +   *
    +   * Generally used for reallocation.
    +   *
    +   * @param capacity The new capacity.
    +   * @param max_depth The new max_depth.
    +   * @return The error code, or SUCCESS if there was no error.
    +   */
    +  virtual error_code set_capacity(size_t capacity) noexcept = 0;
    +
    +  /**
    +   * Change the max depth of this parser.
    +   *
    +   * Generally used for reallocation.
    +   *
    +   * @param capacity The new capacity.
    +   * @param max_depth The new max_depth.
    +   * @return The error code, or SUCCESS if there was no error.
    +   */
    +  virtual error_code set_max_depth(size_t max_depth) noexcept = 0;
    +
    +  /**
    +   * Deallocate this parser.
    +   */
    +  virtual ~dom_parser_implementation() = default;
    +
    +  /** Number of structural indices passed from stage 1 to stage 2 */
    +  uint32_t n_structural_indexes{0};
    +  /** Structural indices passed from stage 1 to stage 2 */
    +  std::unique_ptr structural_indexes{};
    +  /** Next structural index to parse */
    +  uint32_t next_structural_index{0};
    +
    +  /**
    +   * The largest document this parser can support without reallocating.
    +   *
    +   * @return Current capacity, in bytes.
    +   */
    +  simdjson_inline size_t capacity() const noexcept;
    +
    +  /**
    +   * The maximum level of nested object and arrays supported by this parser.
    +   *
    +   * @return Maximum depth, in bytes.
    +   */
    +  simdjson_inline size_t max_depth() const noexcept;
    +
    +  /**
    +   * Ensure this parser has enough memory to process JSON documents up to `capacity` bytes in length
    +   * and `max_depth` depth.
    +   *
    +   * @param capacity The new capacity.
    +   * @param max_depth The new max_depth. Defaults to DEFAULT_MAX_DEPTH.
    +   * @return The error, if there is one.
    +   */
    +  simdjson_warn_unused inline error_code allocate(size_t capacity, size_t max_depth) noexcept;
    +
    +
    +protected:
    +  /**
    +   * The maximum document length this parser supports.
    +   *
    +   * Buffers are large enough to handle any document up to this length.
    +   */
    +  size_t _capacity{0};
    +
    +  /**
    +   * The maximum depth (number of nested objects and arrays) supported by this parser.
    +   *
    +   * Defaults to DEFAULT_MAX_DEPTH.
    +   */
    +  size_t _max_depth{0};
    +
    +  // Declaring these so that subclasses can use them to implement their constructors.
    +  simdjson_inline dom_parser_implementation() noexcept;
    +  simdjson_inline dom_parser_implementation(dom_parser_implementation &&other) noexcept;
    +  simdjson_inline dom_parser_implementation &operator=(dom_parser_implementation &&other) noexcept;
    +
    +  simdjson_inline dom_parser_implementation(const dom_parser_implementation &) noexcept = delete;
    +  simdjson_inline dom_parser_implementation &operator=(const dom_parser_implementation &other) noexcept = delete;
    +}; // class dom_parser_implementation
    +
    +simdjson_inline dom_parser_implementation::dom_parser_implementation() noexcept = default;
    +simdjson_inline dom_parser_implementation::dom_parser_implementation(dom_parser_implementation &&other) noexcept = default;
    +simdjson_inline dom_parser_implementation &dom_parser_implementation::operator=(dom_parser_implementation &&other) noexcept = default;
    +
    +simdjson_inline size_t dom_parser_implementation::capacity() const noexcept {
    +  return _capacity;
    +}
    +
    +simdjson_inline size_t dom_parser_implementation::max_depth() const noexcept {
    +  return _max_depth;
    +}
    +
    +simdjson_warn_unused
    +inline error_code dom_parser_implementation::allocate(size_t capacity, size_t max_depth) noexcept {
    +  if (this->max_depth() != max_depth) {
    +    error_code err = set_max_depth(max_depth);
    +    if (err) { return err; }
    +  }
    +  if (_capacity != capacity) {
    +    error_code err = set_capacity(capacity);
    +    if (err) { return err; }
    +  }
    +  return SUCCESS;
    +}
    +
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_INTERNAL_DOM_PARSER_IMPLEMENTATION_H
    +/* end file simdjson/internal/dom_parser_implementation.h */
    +
    +#include 
    +
    +namespace simdjson {
    +
    +/**
    + * Validate the UTF-8 string.
    + *
    + * @param buf the string to validate.
    + * @param len the length of the string in bytes.
    + * @return true if the string is valid UTF-8.
    + */
    +simdjson_warn_unused bool validate_utf8(const char * buf, size_t len) noexcept;
    +/**
    + * Validate the UTF-8 string.
    + *
    + * @param sv the string_view to validate.
    + * @return true if the string is valid UTF-8.
    + */
    +simdjson_inline simdjson_warn_unused bool validate_utf8(const std::string_view sv) noexcept {
    +  return validate_utf8(sv.data(), sv.size());
    +}
    +
    +/**
    + * Validate the UTF-8 string.
    + *
    + * @param p the string to validate.
    + * @return true if the string is valid UTF-8.
    + */
    +simdjson_inline simdjson_warn_unused bool validate_utf8(const std::string& s) noexcept {
    +  return validate_utf8(s.data(), s.size());
    +}
    +
    +/**
    + * An implementation of simdjson for a particular CPU architecture.
    + *
    + * Also used to maintain the currently active implementation. The active implementation is
    + * automatically initialized on first use to the most advanced implementation supported by the host.
    + */
    +class implementation {
    +public:
    +
    +  /**
    +   * The name of this implementation.
    +   *
    +   *     const implementation *impl = simdjson::get_active_implementation();
    +   *     cout << "simdjson is optimized for " << impl->name() << "(" << impl->description() << ")" << endl;
    +   *
    +   * @return the name of the implementation, e.g. "haswell", "westmere", "arm64".
    +   */
    +  virtual const std::string &name() const { return _name; }
    +
    +  /**
    +   * The description of this implementation.
    +   *
    +   *     const implementation *impl = simdjson::get_active_implementation();
    +   *     cout << "simdjson is optimized for " << impl->name() << "(" << impl->description() << ")" << endl;
    +   *
    +   * @return the description of the implementation, e.g. "Intel/AMD AVX2", "Intel/AMD SSE4.2", "ARM NEON".
    +   */
    +  virtual const std::string &description() const { return _description; }
    +
    +  /**
    +   * The instruction sets this implementation is compiled against
    +   * and the current CPU match. This function may poll the current CPU/system
    +   * and should therefore not be called too often if performance is a concern.
    +   *
    +   * @return true if the implementation can be safely used on the current system (determined at runtime).
    +   */
    +  bool supported_by_runtime_system() const;
    +
    +  /**
    +   * @private For internal implementation use
    +   *
    +   * The instruction sets this implementation is compiled against.
    +   *
    +   * @return a mask of all required `internal::instruction_set::` values.
    +   */
    +  virtual uint32_t required_instruction_sets() const { return _required_instruction_sets; }
    +
    +  /**
    +   * @private For internal implementation use
    +   *
    +   *     const implementation *impl = simdjson::get_active_implementation();
    +   *     cout << "simdjson is optimized for " << impl->name() << "(" << impl->description() << ")" << endl;
    +   *
    +   * @param capacity The largest document that will be passed to the parser.
    +   * @param max_depth The maximum JSON object/array nesting this parser is expected to handle.
    +   * @param dst The place to put the resulting parser implementation.
    +   * @return the error code, or SUCCESS if there was no error.
    +   */
    +  virtual error_code create_dom_parser_implementation(
    +    size_t capacity,
    +    size_t max_depth,
    +    std::unique_ptr &dst
    +  ) const noexcept = 0;
    +
    +  /**
    +   * @private For internal implementation use
    +   *
    +   * Minify the input string assuming that it represents a JSON string, does not parse or validate.
    +   *
    +   * Overridden by each implementation.
    +   *
    +   * @param buf the json document to minify.
    +   * @param len the length of the json document.
    +   * @param dst the buffer to write the minified document to. *MUST* be allocated up to len + SIMDJSON_PADDING bytes.
    +   * @param dst_len the number of bytes written. Output only.
    +   * @return the error code, or SUCCESS if there was no error.
    +   */
    +  simdjson_warn_unused virtual error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept = 0;
    +
    +
    +  /**
    +   * Validate the UTF-8 string.
    +   *
    +   * Overridden by each implementation.
    +   *
    +   * @param buf the string to validate.
    +   * @param len the length of the string in bytes.
    +   * @return true if and only if the string is valid UTF-8.
    +   */
    +  simdjson_warn_unused virtual bool validate_utf8(const char *buf, size_t len) const noexcept = 0;
    +
    +protected:
    +  /** @private Construct an implementation with the given name and description. For subclasses. */
    +  simdjson_inline implementation(
    +    std::string_view name,
    +    std::string_view description,
    +    uint32_t required_instruction_sets
    +  ) :
    +    _name(name),
    +    _description(description),
    +    _required_instruction_sets(required_instruction_sets)
    +  {
    +  }
    +  virtual ~implementation()=default;
    +
    +private:
    +  /**
    +   * The name of this implementation.
    +   */
    +  const std::string _name;
    +
    +  /**
    +   * The description of this implementation.
    +   */
    +  const std::string _description;
    +
    +  /**
    +   * Instruction sets required for this implementation.
    +   */
    +  const uint32_t _required_instruction_sets;
    +};
    +
    +/** @private */
    +namespace internal {
    +
    +/**
    + * The list of available implementations compiled into simdjson.
    + */
    +class available_implementation_list {
    +public:
    +  /** Get the list of available implementations compiled into simdjson */
    +  simdjson_inline available_implementation_list() {}
    +  /** Number of implementations */
    +  size_t size() const noexcept;
    +  /** STL const begin() iterator */
    +  const implementation * const *begin() const noexcept;
    +  /** STL const end() iterator */
    +  const implementation * const *end() const noexcept;
    +
    +  /**
    +   * Get the implementation with the given name.
    +   *
    +   * Case sensitive.
    +   *
    +   *     const implementation *impl = simdjson::get_available_implementations()["westmere"];
    +   *     if (!impl) { exit(1); }
    +   *     if (!imp->supported_by_runtime_system()) { exit(1); }
    +   *     simdjson::get_active_implementation() = impl;
    +   *
    +   * @param name the implementation to find, e.g. "westmere", "haswell", "arm64"
    +   * @return the implementation, or nullptr if the parse failed.
    +   */
    +  const implementation * operator[](const std::string_view &name) const noexcept {
    +    for (const implementation * impl : *this) {
    +      if (impl->name() == name) { return impl; }
    +    }
    +    return nullptr;
    +  }
    +
    +  /**
    +   * Detect the most advanced implementation supported by the current host.
    +   *
    +   * This is used to initialize the implementation on startup.
    +   *
    +   *     const implementation *impl = simdjson::available_implementation::detect_best_supported();
    +   *     simdjson::get_active_implementation() = impl;
    +   *
    +   * @return the most advanced supported implementation for the current host, or an
    +   *         implementation that returns UNSUPPORTED_ARCHITECTURE if there is no supported
    +   *         implementation. Will never return nullptr.
    +   */
    +  const implementation *detect_best_supported() const noexcept;
    +};
    +
    +} // namespace internal
    +
    +/**
    + * The list of available implementations compiled into simdjson.
    + */
    +extern SIMDJSON_DLLIMPORTEXPORT const internal::available_implementation_list& get_available_implementations();
    +
    +/**
    +  * The active implementation.
    +  *
    +  * Automatically initialized on first use to the most advanced implementation supported by this hardware.
    +  */
    +extern SIMDJSON_DLLIMPORTEXPORT internal::atomic_ptr& get_active_implementation();
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_IMPLEMENTATION_H
    +/* end file simdjson/implementation.h */
    +/* including simdjson/minify.h: #include "simdjson/minify.h" */
    +/* begin file simdjson/minify.h */
    +#ifndef SIMDJSON_MINIFY_H
    +#define SIMDJSON_MINIFY_H
    +
    +/* skipped duplicate #include "simdjson/base.h" */
    +/* including simdjson/padded_string.h: #include "simdjson/padded_string.h" */
    +/* begin file simdjson/padded_string.h */
    +#ifndef SIMDJSON_PADDED_STRING_H
    +#define SIMDJSON_PADDED_STRING_H
    +
    +/* skipped duplicate #include "simdjson/base.h" */
    +/* skipped duplicate #include "simdjson/error.h" */
    +
    +/* skipped duplicate #include "simdjson/error-inl.h" */
    +
    +#include 
    +#include 
    +#include 
    +#include 
    +
    +namespace simdjson {
    +
    +class padded_string_view;
    +
    +/**
    + * String with extra allocation for ease of use with parser::parse()
    + *
    + * This is a move-only class, it cannot be copied.
    + */
    +struct padded_string final {
    +
    +  /**
    +   * Create a new, empty padded string.
    +   */
    +  explicit inline padded_string() noexcept;
    +  /**
    +   * Create a new padded string buffer.
    +   *
    +   * @param length the size of the string.
    +   */
    +  explicit inline padded_string(size_t length) noexcept;
    +  /**
    +   * Create a new padded string by copying the given input.
    +   *
    +   * @param data the buffer to copy
    +   * @param length the number of bytes to copy
    +   */
    +  explicit inline padded_string(const char *data, size_t length) noexcept;
    +  /**
    +   * Create a new padded string by copying the given input.
    +   *
    +   * @param str_ the string to copy
    +   */
    +  inline padded_string(const std::string & str_ ) noexcept;
    +  /**
    +   * Create a new padded string by copying the given input.
    +   *
    +   * @param sv_ the string to copy
    +   */
    +  inline padded_string(std::string_view sv_) noexcept;
    +  /**
    +   * Move one padded string into another.
    +   *
    +   * The original padded string will be reduced to zero capacity.
    +   *
    +   * @param o the string to move.
    +   */
    +  inline padded_string(padded_string &&o) noexcept;
    +  /**
    +   * Move one padded string into another.
    +   *
    +   * The original padded string will be reduced to zero capacity.
    +   *
    +   * @param o the string to move.
    +   */
    +  inline padded_string &operator=(padded_string &&o) noexcept;
    +  inline void swap(padded_string &o) noexcept;
    +  ~padded_string() noexcept;
    +
    +  /**
    +   * The length of the string.
    +   *
    +   * Does not include padding.
    +   */
    +  size_t size() const noexcept;
    +
    +  /**
    +   * The length of the string.
    +   *
    +   * Does not include padding.
    +   */
    +  size_t length() const noexcept;
    +
    +  /**
    +   * The string data.
    +   **/
    +  const char *data() const noexcept;
    +  const uint8_t *u8data() const noexcept { return static_cast(static_cast(data_ptr));}
    +
    +  /**
    +   * The string data.
    +   **/
    +  char *data() noexcept;
    +
    +  /**
    +   * Create a std::string_view with the same content.
    +   */
    +  operator std::string_view() const;
    +
    +  /**
    +   * Create a padded_string_view with the same content.
    +   */
    +  operator padded_string_view() const noexcept;
    +
    +  /**
    +   * Load this padded string from a file.
    +   *
    +   * @return IO_ERROR on error. Be mindful that on some 32-bit systems,
    +   * the file size might be limited to 2 GB.
    +   *
    +   * @param path the path to the file.
    +   **/
    +  inline static simdjson_result load(std::string_view path) noexcept;
    +
    +private:
    +  padded_string &operator=(const padded_string &o) = delete;
    +  padded_string(const padded_string &o) = delete;
    +
    +  size_t viable_size{0};
    +  char *data_ptr{nullptr};
    +
    +}; // padded_string
    +
    +/**
    + * Send padded_string instance to an output stream.
    + *
    + * @param out The output stream.
    + * @param s The padded_string instance.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, const padded_string& s) { return out << s.data(); }
    +
    +#if SIMDJSON_EXCEPTIONS
    +/**
    + * Send padded_string instance to an output stream.
    + *
    + * @param out The output stream.
    + * @param s The padded_string instance.
    +  * @throw simdjson_error if the result being printed has an error. If there is an error with the
    + *        underlying output stream, that error will be propagated (simdjson_error will not be
    + *        thrown).
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson_result &s) noexcept(false) { return out << s.value(); }
    +#endif
    +
    +} // namespace simdjson
    +
    +// This is deliberately outside of simdjson so that people get it without having to use the namespace
    +inline simdjson::padded_string operator "" _padded(const char *str, size_t len);
    +
    +namespace simdjson {
    +namespace internal {
    +
    +// The allocate_padded_buffer function is a low-level function to allocate memory
    +// with padding so we can read past the "length" bytes safely. It is used by
    +// the padded_string class automatically. It returns nullptr in case
    +// of error: the caller should check for a null pointer.
    +// The length parameter is the maximum size in bytes of the string.
    +// The caller is responsible to free the memory (e.g., delete[] (...)).
    +inline char *allocate_padded_buffer(size_t length) noexcept;
    +
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_PADDED_STRING_H
    +/* end file simdjson/padded_string.h */
    +#include 
    +#include 
    +#include 
    +
    +namespace simdjson {
    +
    +/**
    + *
    + * Minify the input string assuming that it represents a JSON string, does not parse or validate.
    + * This function is much faster than parsing a JSON string and then writing a minified version of it.
    + * However, it does not validate the input. It will merely return an error in simple cases (e.g., if
    + * there is a string that was never terminated).
    + *
    + *
    + * @param buf the json document to minify.
    + * @param len the length of the json document.
    + * @param dst the buffer to write the minified document to. *MUST* be allocated up to len bytes.
    + * @param dst_len the number of bytes written. Output only.
    + * @return the error code, or SUCCESS if there was no error.
    + */
    +simdjson_warn_unused error_code minify(const char *buf, size_t len, char *dst, size_t &dst_len) noexcept;
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_MINIFY_H
    +/* end file simdjson/minify.h */
    +/* skipped duplicate #include "simdjson/padded_string.h" */
    +/* including simdjson/padded_string-inl.h: #include "simdjson/padded_string-inl.h" */
    +/* begin file simdjson/padded_string-inl.h */
    +#ifndef SIMDJSON_PADDED_STRING_INL_H
    +#define SIMDJSON_PADDED_STRING_INL_H
    +
    +/* skipped duplicate #include "simdjson/padded_string.h" */
    +/* including simdjson/padded_string_view.h: #include "simdjson/padded_string_view.h" */
    +/* begin file simdjson/padded_string_view.h */
    +#ifndef SIMDJSON_PADDED_STRING_VIEW_H
    +#define SIMDJSON_PADDED_STRING_VIEW_H
    +
    +/* skipped duplicate #include "simdjson/portability.h" */
    +/* skipped duplicate #include "simdjson/base.h" // for SIMDJSON_PADDING */
    +/* skipped duplicate #include "simdjson/error.h" */
    +
    +#include 
    +#include 
    +#include 
    +#include 
    +
    +namespace simdjson {
    +
    +/**
    + * User-provided string that promises it has extra padded bytes at the end for use with parser::parse().
    + */
    +class padded_string_view : public std::string_view {
    +private:
    +  size_t _capacity;
    +
    +public:
    +  /** Create an empty padded_string_view. */
    +  inline padded_string_view() noexcept = default;
    +
    +  /**
    +   * Promise the given buffer has at least SIMDJSON_PADDING extra bytes allocated to it.
    +   *
    +   * @param s The string.
    +   * @param len The length of the string (not including padding).
    +   * @param capacity The allocated length of the string, including padding.
    +   */
    +  explicit inline padded_string_view(const char* s, size_t len, size_t capacity) noexcept;
    +  /** overload explicit inline padded_string_view(const char* s, size_t len) noexcept */
    +  explicit inline padded_string_view(const uint8_t* s, size_t len, size_t capacity) noexcept;
    +
    +  /**
    +   * Promise the given string has at least SIMDJSON_PADDING extra bytes allocated to it.
    +   *
    +   * The capacity of the string will be used to determine its padding.
    +   *
    +   * @param s The string.
    +   */
    +  explicit inline padded_string_view(const std::string &s) noexcept;
    +
    +  /**
    +   * Promise the given string_view has at least SIMDJSON_PADDING extra bytes allocated to it.
    +   *
    +   * @param s The string.
    +   * @param capacity The allocated length of the string, including padding.
    +   */
    +  explicit inline padded_string_view(std::string_view s, size_t capacity) noexcept;
    +
    +  /** The number of allocated bytes. */
    +  inline size_t capacity() const noexcept;
    +
    +  /**
    +   * Remove the UTF-8 Byte Order Mark (BOM) if it exists.
    +   *
    +   * @return whether a BOM was found and removed
    +   */
    +  inline bool remove_utf8_bom() noexcept;
    +
    +  /** The amount of padding on the string (capacity() - length()) */
    +  inline size_t padding() const noexcept;
    +
    +}; // padded_string_view
    +
    +#if SIMDJSON_EXCEPTIONS
    +/**
    + * Send padded_string instance to an output stream.
    + *
    + * @param out The output stream.
    + * @param s The padded_string_view.
    + * @throw simdjson_error if the result being printed has an error. If there is an error with the
    + *        underlying output stream, that error will be propagated (simdjson_error will not be
    + *        thrown).
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson_result &s) noexcept(false);
    +#endif
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_PADDED_STRING_VIEW_H
    +/* end file simdjson/padded_string_view.h */
    +
    +/* skipped duplicate #include "simdjson/error-inl.h" */
    +/* including simdjson/padded_string_view-inl.h: #include "simdjson/padded_string_view-inl.h" */
    +/* begin file simdjson/padded_string_view-inl.h */
    +#ifndef SIMDJSON_PADDED_STRING_VIEW_INL_H
    +#define SIMDJSON_PADDED_STRING_VIEW_INL_H
    +
    +/* skipped duplicate #include "simdjson/padded_string_view.h" */
    +/* skipped duplicate #include "simdjson/error-inl.h" */
    +
    +#include  /* memcmp */
    +
    +namespace simdjson {
    +
    +inline padded_string_view::padded_string_view(const char* s, size_t len, size_t capacity) noexcept
    +  : std::string_view(s, len), _capacity(capacity)
    +{
    +}
    +
    +inline padded_string_view::padded_string_view(const uint8_t* s, size_t len, size_t capacity) noexcept
    +  : padded_string_view(reinterpret_cast(s), len, capacity)
    +{
    +}
    +
    +inline padded_string_view::padded_string_view(const std::string &s) noexcept
    +  : std::string_view(s), _capacity(s.capacity())
    +{
    +}
    +
    +inline padded_string_view::padded_string_view(std::string_view s, size_t capacity) noexcept
    +  : std::string_view(s), _capacity(capacity)
    +{
    +}
    +
    +inline size_t padded_string_view::capacity() const noexcept { return _capacity; }
    +
    +inline size_t padded_string_view::padding() const noexcept { return capacity() - length(); }
    +
    +inline bool padded_string_view::remove_utf8_bom() noexcept {
    +  if(length() < 3) { return false; }
    +  if (std::memcmp(data(), "\xEF\xBB\xBF", 3) == 0) {
    +    remove_prefix(3);
    +    _capacity -= 3;
    +    return true;
    +  }
    +  return false;
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson_result &s) noexcept(false) { return out << s.value(); }
    +#endif
    +
    +} // namespace simdjson
    +
    +
    +#endif // SIMDJSON_PADDED_STRING_VIEW_INL_H
    +/* end file simdjson/padded_string_view-inl.h */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace internal {
    +
    +// The allocate_padded_buffer function is a low-level function to allocate memory
    +// with padding so we can read past the "length" bytes safely. It is used by
    +// the padded_string class automatically. It returns nullptr in case
    +// of error: the caller should check for a null pointer.
    +// The length parameter is the maximum size in bytes of the string.
    +// The caller is responsible to free the memory (e.g., delete[] (...)).
    +inline char *allocate_padded_buffer(size_t length) noexcept {
    +  const size_t totalpaddedlength = length + SIMDJSON_PADDING;
    +  if(totalpaddedlength(1UL<<20)) {
    +    return nullptr;
    +  }
    +#endif
    +
    +  char *padded_buffer = new (std::nothrow) char[totalpaddedlength];
    +  if (padded_buffer == nullptr) {
    +    return nullptr;
    +  }
    +  // We write nulls in the padded region to avoid having uninitialized
    +  // content which may trigger warning for some sanitizers
    +  std::memset(padded_buffer + length, 0, totalpaddedlength - length);
    +  return padded_buffer;
    +} // allocate_padded_buffer()
    +
    +} // namespace internal
    +
    +
    +inline padded_string::padded_string() noexcept = default;
    +inline padded_string::padded_string(size_t length) noexcept
    +    : viable_size(length), data_ptr(internal::allocate_padded_buffer(length)) {
    +}
    +inline padded_string::padded_string(const char *data, size_t length) noexcept
    +    : viable_size(length), data_ptr(internal::allocate_padded_buffer(length)) {
    +  if ((data != nullptr) && (data_ptr != nullptr)) {
    +    std::memcpy(data_ptr, data, length);
    +  }
    +}
    +// note: do not pass std::string arguments by value
    +inline padded_string::padded_string(const std::string & str_ ) noexcept
    +    : viable_size(str_.size()), data_ptr(internal::allocate_padded_buffer(str_.size())) {
    +  if (data_ptr != nullptr) {
    +    std::memcpy(data_ptr, str_.data(), str_.size());
    +  }
    +}
    +// note: do pass std::string_view arguments by value
    +inline padded_string::padded_string(std::string_view sv_) noexcept
    +    : viable_size(sv_.size()), data_ptr(internal::allocate_padded_buffer(sv_.size())) {
    +  if(simdjson_unlikely(!data_ptr)) {
    +    //allocation failed or zero size
    +    viable_size = 0;
    +    return;
    +  }
    +  if (sv_.size()) {
    +    std::memcpy(data_ptr, sv_.data(), sv_.size());
    +  }
    +}
    +inline padded_string::padded_string(padded_string &&o) noexcept
    +    : viable_size(o.viable_size), data_ptr(o.data_ptr) {
    +  o.data_ptr = nullptr; // we take ownership
    +}
    +
    +inline padded_string &padded_string::operator=(padded_string &&o) noexcept {
    +  delete[] data_ptr;
    +  data_ptr = o.data_ptr;
    +  viable_size = o.viable_size;
    +  o.data_ptr = nullptr; // we take ownership
    +  o.viable_size = 0;
    +  return *this;
    +}
    +
    +inline void padded_string::swap(padded_string &o) noexcept {
    +  size_t tmp_viable_size = viable_size;
    +  char *tmp_data_ptr = data_ptr;
    +  viable_size = o.viable_size;
    +  data_ptr = o.data_ptr;
    +  o.data_ptr = tmp_data_ptr;
    +  o.viable_size = tmp_viable_size;
    +}
    +
    +inline padded_string::~padded_string() noexcept {
    +  delete[] data_ptr;
    +}
    +
    +inline size_t padded_string::size() const noexcept { return viable_size; }
    +
    +inline size_t padded_string::length() const noexcept { return viable_size; }
    +
    +inline const char *padded_string::data() const noexcept { return data_ptr; }
    +
    +inline char *padded_string::data() noexcept { return data_ptr; }
    +
    +inline padded_string::operator std::string_view() const { return std::string_view(data(), length()); }
    +
    +inline padded_string::operator padded_string_view() const noexcept {
    +  return padded_string_view(data(), length(), length() + SIMDJSON_PADDING);
    +}
    +
    +inline simdjson_result padded_string::load(std::string_view filename) noexcept {
    +  // Open the file
    +  SIMDJSON_PUSH_DISABLE_WARNINGS
    +  SIMDJSON_DISABLE_DEPRECATED_WARNING // Disable CRT_SECURE warning on MSVC: manually verified this is safe
    +  std::FILE *fp = std::fopen(filename.data(), "rb");
    +  SIMDJSON_POP_DISABLE_WARNINGS
    +
    +  if (fp == nullptr) {
    +    return IO_ERROR;
    +  }
    +
    +  // Get the file size
    +  int ret;
    +#if SIMDJSON_VISUAL_STUDIO && !SIMDJSON_IS_32BITS
    +  ret = _fseeki64(fp, 0, SEEK_END);
    +#else
    +  ret = std::fseek(fp, 0, SEEK_END);
    +#endif // _WIN64
    +  if(ret < 0) {
    +    std::fclose(fp);
    +    return IO_ERROR;
    +  }
    +#if SIMDJSON_VISUAL_STUDIO && !SIMDJSON_IS_32BITS
    +  __int64 llen = _ftelli64(fp);
    +  if(llen == -1L) {
    +    std::fclose(fp);
    +    return IO_ERROR;
    +  }
    +#else
    +  long llen = std::ftell(fp);
    +  if((llen < 0) || (llen == LONG_MAX)) {
    +    std::fclose(fp);
    +    return IO_ERROR;
    +  }
    +#endif
    +
    +  // Allocate the padded_string
    +  size_t len = static_cast(llen);
    +  padded_string s(len);
    +  if (s.data() == nullptr) {
    +    std::fclose(fp);
    +    return MEMALLOC;
    +  }
    +
    +  // Read the padded_string
    +  std::rewind(fp);
    +  size_t bytes_read = std::fread(s.data(), 1, len, fp);
    +  if (std::fclose(fp) != 0 || bytes_read != len) {
    +    return IO_ERROR;
    +  }
    +
    +  return s;
    +}
    +
    +} // namespace simdjson
    +
    +inline simdjson::padded_string operator "" _padded(const char *str, size_t len) {
    +  return simdjson::padded_string(str, len);
    +}
    +
    +#endif // SIMDJSON_PADDED_STRING_INL_H
    +/* end file simdjson/padded_string-inl.h */
    +/* skipped duplicate #include "simdjson/padded_string_view.h" */
    +/* skipped duplicate #include "simdjson/padded_string_view-inl.h" */
    +
    +/* including simdjson/dom.h: #include "simdjson/dom.h" */
    +/* begin file simdjson/dom.h */
    +#ifndef SIMDJSON_DOM_H
    +#define SIMDJSON_DOM_H
    +
    +/* including simdjson/dom/base.h: #include "simdjson/dom/base.h" */
    +/* begin file simdjson/dom/base.h */
    +#ifndef SIMDJSON_DOM_BASE_H
    +#define SIMDJSON_DOM_BASE_H
    +
    +/* skipped duplicate #include "simdjson/base.h" */
    +
    +namespace simdjson {
    +
    +/**
    + * @brief A DOM API on top of the simdjson parser.
    + */
    +namespace dom {
    +
    +/** The default batch size for parser.parse_many() and parser.load_many() */
    +static constexpr size_t DEFAULT_BATCH_SIZE = 1000000;
    +/**
    + * Some adversary might try to set the batch size to 0 or 1, which might cause problems.
    + * We set a minimum of 32B since anything else is highly likely to be an error. In practice,
    + * most users will want a much larger batch size.
    + *
    + * All non-negative MINIMAL_BATCH_SIZE values should be 'safe' except that, obviously, no JSON
    + * document can ever span 0 or 1 byte and that very large values would create memory allocation issues.
    + */
    +static constexpr size_t MINIMAL_BATCH_SIZE = 32;
    +
    +/**
    + * It is wasteful to allocate memory for tiny documents (e.g., 4 bytes).
    + */
    +static constexpr size_t MINIMAL_DOCUMENT_CAPACITY = 32;
    +
    +class array;
    +class document;
    +class document_stream;
    +class element;
    +class key_value_pair;
    +class object;
    +class parser;
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +struct stage1_worker;
    +#endif // SIMDJSON_THREADS_ENABLED
    +
    +} // namespace dom
    +
    +namespace internal {
    +
    +template
    +class string_builder;
    +class tape_ref;
    +
    +} // namespace internal
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_DOM_BASE_H
    +/* end file simdjson/dom/base.h */
    +/* including simdjson/dom/array.h: #include "simdjson/dom/array.h" */
    +/* begin file simdjson/dom/array.h */
    +#ifndef SIMDJSON_DOM_ARRAY_H
    +#define SIMDJSON_DOM_ARRAY_H
    +
    +/* skipped duplicate #include "simdjson/dom/base.h" */
    +/* including simdjson/internal/tape_ref.h: #include "simdjson/internal/tape_ref.h" */
    +/* begin file simdjson/internal/tape_ref.h */
    +#ifndef SIMDJSON_INTERNAL_TAPE_REF_H
    +#define SIMDJSON_INTERNAL_TAPE_REF_H
    +
    +/* skipped duplicate #include "simdjson/base.h" */
    +
    +namespace simdjson {
    +namespace dom {
    +class document;
    +} // namespace dom
    +
    +namespace internal {
    +
    +/**
    + * A reference to an element on the tape. Internal only.
    + */
    +class tape_ref {
    +public:
    +  simdjson_inline tape_ref() noexcept;
    +  simdjson_inline tape_ref(const dom::document *doc, size_t json_index) noexcept;
    +  inline size_t after_element() const noexcept;
    +  simdjson_inline tape_type tape_ref_type() const noexcept;
    +  simdjson_inline uint64_t tape_value() const noexcept;
    +  simdjson_inline bool is_double() const noexcept;
    +  simdjson_inline bool is_int64() const noexcept;
    +  simdjson_inline bool is_uint64() const noexcept;
    +  simdjson_inline bool is_false() const noexcept;
    +  simdjson_inline bool is_true() const noexcept;
    +  simdjson_inline bool is_null_on_tape() const noexcept;// different name to avoid clash with is_null.
    +  simdjson_inline uint32_t matching_brace_index() const noexcept;
    +  simdjson_inline uint32_t scope_count() const noexcept;
    +  template
    +  simdjson_inline T next_tape_value() const noexcept;
    +  simdjson_inline uint32_t get_string_length() const noexcept;
    +  simdjson_inline const char * get_c_str() const noexcept;
    +  inline std::string_view get_string_view() const noexcept;
    +  simdjson_inline bool is_document_root() const noexcept;
    +  simdjson_inline bool usable() const noexcept;
    +
    +  /** The document this element references. */
    +  const dom::document *doc;
    +
    +  /** The index of this element on `doc.tape[]` */
    +  size_t json_index;
    +};
    +
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_INTERNAL_TAPE_REF_H
    +/* end file simdjson/internal/tape_ref.h */
    +
    +namespace simdjson {
    +namespace dom {
    +
    +/**
    + * JSON array.
    + */
    +class array {
    +public:
    +  /** Create a new, invalid array */
    +  simdjson_inline array() noexcept;
    +
    +  class iterator {
    +  public:
    +    using value_type = element;
    +    using difference_type = std::ptrdiff_t;
    +
    +    /**
    +     * Get the actual value
    +     */
    +    inline value_type operator*() const noexcept;
    +    /**
    +     * Get the next value.
    +     *
    +     * Part of the std::iterator interface.
    +     */
    +    inline iterator& operator++() noexcept;
    +    /**
    +     * Get the next value.
    +     *
    +     * Part of the  std::iterator interface.
    +     */
    +    inline iterator operator++(int) noexcept;
    +    /**
    +     * Check if these values come from the same place in the JSON.
    +     *
    +     * Part of the std::iterator interface.
    +     */
    +    inline bool operator!=(const iterator& other) const noexcept;
    +    inline bool operator==(const iterator& other) const noexcept;
    +
    +    inline bool operator<(const iterator& other) const noexcept;
    +    inline bool operator<=(const iterator& other) const noexcept;
    +    inline bool operator>=(const iterator& other) const noexcept;
    +    inline bool operator>(const iterator& other) const noexcept;
    +
    +    iterator() noexcept = default;
    +    iterator(const iterator&) noexcept = default;
    +    iterator& operator=(const iterator&) noexcept = default;
    +  private:
    +    simdjson_inline iterator(const internal::tape_ref &tape) noexcept;
    +    internal::tape_ref tape;
    +    friend class array;
    +  };
    +
    +  /**
    +   * Return the first array element.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  inline iterator begin() const noexcept;
    +  /**
    +   * One past the last array element.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  inline iterator end() const noexcept;
    +  /**
    +   * Get the size of the array (number of immediate children).
    +   * It is a saturated value with a maximum of 0xFFFFFF: if the value
    +   * is 0xFFFFFF then the size is 0xFFFFFF or greater.
    +   */
    +  inline size_t size() const noexcept;
    +  /**
    +   * Get the total number of slots used by this array on the tape.
    +   *
    +   * Note that this is not the same thing as `size()`, which reports the
    +   * number of actual elements within an array (not counting its children).
    +   *
    +   * Since an element can use 1 or 2 slots on the tape, you can only use this
    +   * to figure out the total size of an array (including its children,
    +   * recursively) if you know its structure ahead of time.
    +   **/
    +  inline size_t number_of_slots() const noexcept;
    +  /**
    +   * Get the value associated with the given JSON pointer.  We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard, interpreting the current node
    +   * as the root of its own JSON document.
    +   *
    +   *   dom::parser parser;
    +   *   array a = parser.parse(R"([ { "foo": { "a": [ 10, 20, 30 ] }} ])"_padded);
    +   *   a.at_pointer("/0/foo/a/1") == 20
    +   *   a.at_pointer("0")["foo"]["a"].at(1) == 20
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   */
    +  inline simdjson_result at_pointer(std::string_view json_pointer) const noexcept;
    +
    +  /**
    +   * Get the value at the given index. This function has linear-time complexity and
    +   * is equivalent to the following:
    +   *
    +   *    size_t i=0;
    +   *    for (auto element : *this) {
    +   *      if (i == index) { return element; }
    +   *      i++;
    +   *    }
    +   *    return INDEX_OUT_OF_BOUNDS;
    +   *
    +   * Avoid calling the at() function repeatedly.
    +   *
    +   * @return The value at the given index, or:
    +   *         - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
    +   */
    +  inline simdjson_result at(size_t index) const noexcept;
    +
    +private:
    +  simdjson_inline array(const internal::tape_ref &tape) noexcept;
    +  internal::tape_ref tape;
    +  friend class element;
    +  friend struct simdjson_result;
    +  template
    +  friend class simdjson::internal::string_builder;
    +};
    +
    +
    +} // namespace dom
    +
    +/** The result of a JSON conversion that may fail. */
    +template<>
    +struct simdjson_result : public internal::simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result() noexcept; ///< @private
    +  simdjson_inline simdjson_result(dom::array value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +
    +  inline simdjson_result at_pointer(std::string_view json_pointer) const noexcept;
    +  inline simdjson_result at(size_t index) const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  inline dom::array::iterator begin() const noexcept(false);
    +  inline dom::array::iterator end() const noexcept(false);
    +  inline size_t size() const noexcept(false);
    +#endif // SIMDJSON_EXCEPTIONS
    +};
    +
    +
    +
    +} // namespace simdjson
    +
    +#if defined(__cpp_lib_ranges)
    +#include 
    +
    +namespace std {
    +namespace ranges {
    +template<>
    +inline constexpr bool enable_view = true;
    +#if SIMDJSON_EXCEPTIONS
    +template<>
    +inline constexpr bool enable_view> = true;
    +#endif // SIMDJSON_EXCEPTIONS
    +} // namespace ranges
    +} // namespace std
    +#endif // defined(__cpp_lib_ranges)
    +
    +#endif // SIMDJSON_DOM_ARRAY_H
    +/* end file simdjson/dom/array.h */
    +/* including simdjson/dom/document_stream.h: #include "simdjson/dom/document_stream.h" */
    +/* begin file simdjson/dom/document_stream.h */
    +#ifndef SIMDJSON_DOCUMENT_STREAM_H
    +#define SIMDJSON_DOCUMENT_STREAM_H
    +
    +/* skipped duplicate #include "simdjson/dom/base.h" */
    +/* including simdjson/dom/parser.h: #include "simdjson/dom/parser.h" */
    +/* begin file simdjson/dom/parser.h */
    +#ifndef SIMDJSON_DOM_PARSER_H
    +#define SIMDJSON_DOM_PARSER_H
    +
    +/* skipped duplicate #include "simdjson/dom/base.h" */
    +/* including simdjson/dom/document.h: #include "simdjson/dom/document.h" */
    +/* begin file simdjson/dom/document.h */
    +#ifndef SIMDJSON_DOM_DOCUMENT_H
    +#define SIMDJSON_DOM_DOCUMENT_H
    +
    +/* skipped duplicate #include "simdjson/dom/base.h" */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace dom {
    +
    +/**
    + * A parsed JSON document.
    + *
    + * This class cannot be copied, only moved, to avoid unintended allocations.
    + */
    +class document {
    +public:
    +  /**
    +   * Create a document container with zero capacity.
    +   *
    +   * The parser will allocate capacity as needed.
    +   */
    +  document() noexcept = default;
    +  ~document() noexcept = default;
    +
    +  /**
    +   * Take another document's buffers.
    +   *
    +   * @param other The document to take. Its capacity is zeroed and it is invalidated.
    +   */
    +  document(document &&other) noexcept = default;
    +  /** @private */
    +  document(const document &) = delete; // Disallow copying
    +  /**
    +   * Take another document's buffers.
    +   *
    +   * @param other The document to take. Its capacity is zeroed.
    +   */
    +  document &operator=(document &&other) noexcept = default;
    +  /** @private */
    +  document &operator=(const document &) = delete; // Disallow copying
    +
    +  /**
    +   * Get the root element of this document as a JSON array.
    +   */
    +  element root() const noexcept;
    +
    +  /**
    +   * @private Dump the raw tape for debugging.
    +   *
    +   * @param os the stream to output to.
    +   * @return false if the tape is likely wrong (e.g., you did not parse a valid JSON).
    +   */
    +  bool dump_raw_tape(std::ostream &os) const noexcept;
    +
    +  /** @private Structural values. */
    +  std::unique_ptr tape{};
    +
    +  /** @private String values.
    +   *
    +   * Should be at least byte_capacity.
    +   */
    +  std::unique_ptr string_buf{};
    +  /** @private Allocate memory to support
    +   * input JSON documents of up to len bytes.
    +   *
    +   * When calling this function, you lose
    +   * all the data.
    +   *
    +   * The memory allocation is strict: you
    +   * can you use this function to increase
    +   * or lower the amount of allocated memory.
    +   * Passsing zero clears the memory.
    +   */
    +  error_code allocate(size_t len) noexcept;
    +  /** @private Capacity in bytes, in terms
    +   * of how many bytes of input JSON we can
    +   * support.
    +   */
    +  size_t capacity() const noexcept;
    +
    +
    +private:
    +  size_t allocated_capacity{0};
    +  friend class parser;
    +}; // class document
    +
    +} // namespace dom
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_DOM_DOCUMENT_H
    +/* end file simdjson/dom/document.h */
    +
    +namespace simdjson {
    +
    +namespace dom {
    +
    +/**
    + * A persistent document parser.
    + *
    + * The parser is designed to be reused, holding the internal buffers necessary to do parsing,
    + * as well as memory for a single document. The parsed document is overwritten on each parse.
    + *
    + * This class cannot be copied, only moved, to avoid unintended allocations.
    + *
    + * @note Moving a parser instance may invalidate "dom::element" instances. If you need to
    + * preserve both the "dom::element" instances and the parser, consider wrapping the parser
    + * instance in a std::unique_ptr instance:
    + *
    + *   std::unique_ptr parser(new dom::parser{});
    + *   auto error = parser->load(f).get(root);
    + *
    + * You can then move std::unique_ptr safely.
    + *
    + * @note This is not thread safe: one parser cannot produce two documents at the same time!
    + */
    +class parser {
    +public:
    +  /**
    +   * Create a JSON parser.
    +   *
    +   * The new parser will have zero capacity.
    +   *
    +   * @param max_capacity The maximum document length the parser can automatically handle. The parser
    +   *    will allocate more capacity on an as needed basis (when it sees documents too big to handle)
    +   *    up to this amount. The parser still starts with zero capacity no matter what this number is:
    +   *    to allocate an initial capacity, call allocate() after constructing the parser.
    +   *    Defaults to SIMDJSON_MAXSIZE_BYTES (the largest single document simdjson can process).
    +   */
    +  simdjson_inline explicit parser(size_t max_capacity = SIMDJSON_MAXSIZE_BYTES) noexcept;
    +  /**
    +   * Take another parser's buffers and state.
    +   *
    +   * @param other The parser to take. Its capacity is zeroed.
    +   */
    +  simdjson_inline parser(parser &&other) noexcept;
    +  parser(const parser &) = delete; ///< @private Disallow copying
    +  /**
    +   * Take another parser's buffers and state.
    +   *
    +   * @param other The parser to take. Its capacity is zeroed.
    +   */
    +  simdjson_inline parser &operator=(parser &&other) noexcept;
    +  parser &operator=(const parser &) = delete; ///< @private Disallow copying
    +
    +  /** Deallocate the JSON parser. */
    +  ~parser()=default;
    +
    +  /**
    +   * Load a JSON document from a file and return a reference to it.
    +   *
    +   *   dom::parser parser;
    +   *   const element doc = parser.load("jsonexamples/twitter.json");
    +   *
    +   * The function is eager: the file's content is loaded in memory inside the parser instance
    +   * and immediately parsed. The file can be deleted after the  `parser.load` call.
    +   *
    +   * ### IMPORTANT: Document Lifetime
    +   *
    +   * The JSON document still lives in the parser: this is the most efficient way to parse JSON
    +   * documents because it reuses the same buffers, but you *must* use the document before you
    +   * destroy the parser or call parse() again.
    +   *
    +   * Moving the parser instance is safe, but it invalidates the element instances. You may store
    +   * the parser instance without moving it by wrapping it inside an `unique_ptr` instance like
    +   * so: `std::unique_ptr parser(new dom::parser{});`.
    +   *
    +   * ### Parser Capacity
    +   *
    +   * If the parser's current capacity is less than the file length, it will allocate enough capacity
    +   * to handle it (up to max_capacity).
    +   *
    +   * @param path The path to load.
    +   * @return The document, or an error:
    +   *         - IO_ERROR if there was an error opening or reading the file.
    +   *           Be mindful that on some 32-bit systems,
    +   *           the file size might be limited to 2 GB.
    +   *         - MEMALLOC if the parser does not have enough capacity and memory allocation fails.
    +   *         - CAPACITY if the parser does not have enough capacity and len > max_capacity.
    +   *         - other json errors if parsing fails. You should not rely on these errors to always the same for the
    +   *           same document: they may vary under runtime dispatch (so they may vary depending on your system and hardware).
    +   */
    +  inline simdjson_result load(const std::string &path) & noexcept;
    +  inline simdjson_result load(const std::string &path) &&  = delete ;
    +  /**
    +   * Parse a JSON document and return a temporary reference to it.
    +   *
    +   *   dom::parser parser;
    +   *   element doc_root = parser.parse(buf, len);
    +   *
    +   * The function eagerly parses the input: the input can be modified and discarded after
    +   * the `parser.parse(buf, len)` call has completed.
    +   *
    +   * ### IMPORTANT: Document Lifetime
    +   *
    +   * The JSON document still lives in the parser: this is the most efficient way to parse JSON
    +   * documents because it reuses the same buffers, but you *must* use the document before you
    +   * destroy the parser or call parse() again.
    +   *
    +   * Moving the parser instance is safe, but it invalidates the element instances. You may store
    +   * the parser instance without moving it by wrapping it inside an `unique_ptr` instance like
    +   * so: `std::unique_ptr parser(new dom::parser{});`.
    +   *
    +   * ### REQUIRED: Buffer Padding
    +   *
    +   * The buffer must have at least SIMDJSON_PADDING extra allocated bytes. It does not matter what
    +   * those bytes are initialized to, as long as they are allocated. These bytes will be read: if you
    +   * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the
    +   * SIMDJSON_PADDING bytes to avoid runtime warnings.
    +   *
    +   * If realloc_if_needed is true (the default), it is assumed that the buffer does *not* have enough padding,
    +   * and it is copied into an enlarged temporary buffer before parsing. Thus the following is safe:
    +   *
    +   *   const char *json      = R"({"key":"value"})";
    +   *   const size_t json_len = std::strlen(json);
    +   *   simdjson::dom::parser parser;
    +   *   simdjson::dom::element element = parser.parse(json, json_len);
    +   *
    +   * If you set realloc_if_needed to false (e.g., parser.parse(json, json_len, false)),
    +   * you must provide a buffer with at least SIMDJSON_PADDING extra bytes at the end.
    +   * The benefit of setting realloc_if_needed to false is that you avoid a temporary
    +   * memory allocation and a copy.
    +   *
    +   * The padded bytes may be read. It is not important how you initialize
    +   * these bytes though we recommend a sensible default like null character values or spaces.
    +   * For example, the following low-level code is safe:
    +   *
    +   *   const char *json      = R"({"key":"value"})";
    +   *   const size_t json_len = std::strlen(json);
    +   *   std::unique_ptr padded_json_copy{new char[json_len + SIMDJSON_PADDING]};
    +   *   std::memcpy(padded_json_copy.get(), json, json_len);
    +   *   std::memset(padded_json_copy.get() + json_len, '\0', SIMDJSON_PADDING);
    +   *   simdjson::dom::parser parser;
    +   *   simdjson::dom::element element = parser.parse(padded_json_copy.get(), json_len, false);
    +   *
    +   * ### Parser Capacity
    +   *
    +   * If the parser's current capacity is less than len, it will allocate enough capacity
    +   * to handle it (up to max_capacity).
    +   *
    +   * @param buf The JSON to parse. Must have at least len + SIMDJSON_PADDING allocated bytes, unless
    +   *            realloc_if_needed is true.
    +   * @param len The length of the JSON.
    +   * @param realloc_if_needed Whether to reallocate and enlarge the JSON buffer to add padding.
    +   * @return An element pointing at the root of the document, or an error:
    +   *         - MEMALLOC if realloc_if_needed is true or the parser does not have enough capacity,
    +   *           and memory allocation fails.
    +   *         - CAPACITY if the parser does not have enough capacity and len > max_capacity.
    +   *         - other json errors if parsing fails. You should not rely on these errors to always the same for the
    +   *           same document: they may vary under runtime dispatch (so they may vary depending on your system and hardware).
    +   */
    +  inline simdjson_result parse(const uint8_t *buf, size_t len, bool realloc_if_needed = true) & noexcept;
    +  inline simdjson_result parse(const uint8_t *buf, size_t len, bool realloc_if_needed = true) && =delete;
    +  /** @overload parse(const uint8_t *buf, size_t len, bool realloc_if_needed) */
    +  simdjson_inline simdjson_result parse(const char *buf, size_t len, bool realloc_if_needed = true) & noexcept;
    +  simdjson_inline simdjson_result parse(const char *buf, size_t len, bool realloc_if_needed = true) && =delete;
    +  /** @overload parse(const uint8_t *buf, size_t len, bool realloc_if_needed) */
    +  simdjson_inline simdjson_result parse(const std::string &s) & noexcept;
    +  simdjson_inline simdjson_result parse(const std::string &s) && =delete;
    +  /** @overload parse(const uint8_t *buf, size_t len, bool realloc_if_needed) */
    +  simdjson_inline simdjson_result parse(const padded_string &s) & noexcept;
    +  simdjson_inline simdjson_result parse(const padded_string &s) && =delete;
    +  /** @overload parse(const uint8_t *buf, size_t len, bool realloc_if_needed) */
    +  simdjson_inline simdjson_result parse(const padded_string_view &v) & noexcept;
    +  simdjson_inline simdjson_result parse(const padded_string_view &v) && =delete;
    +
    +  /** @private We do not want to allow implicit conversion from C string to std::string. */
    +  simdjson_inline simdjson_result parse(const char *buf) noexcept = delete;
    +
    +  /**
    +   * Parse a JSON document into a provide document instance and return a temporary reference to it.
    +   * It is similar to the function `parse` except that instead of parsing into the internal
    +   * `document` instance associated with the parser, it allows the user to provide a document
    +   * instance.
    +   *
    +   *   dom::parser parser;
    +   *   dom::document doc;
    +   *   element doc_root = parser.parse_into_document(doc, buf, len);
    +   *
    +   * The function eagerly parses the input: the input can be modified and discarded after
    +   * the `parser.parse(buf, len)` call has completed.
    +   *
    +   * ### IMPORTANT: Document Lifetime
    +   *
    +   * After the call to parse_into_document, the parser is no longer needed.
    +   *
    +   * The JSON document lives in the document instance: you must keep the document
    +   * instance alive while you navigate through it (i.e., used the returned value from
    +   * parse_into_document). You are encourage to reuse the document instance
    +   * many times with new data to avoid reallocations:
    +   *
    +   *   dom::document doc;
    +   *   element doc_root1 = parser.parse_into_document(doc, buf1, len);
    +   *   //... doc_root1 is a pointer inside doc
    +   *   element doc_root2 = parser.parse_into_document(doc, buf1, len);
    +   *   //... doc_root2 is a pointer inside doc
    +   *   // at this point doc_root1 is no longer safe
    +   *
    +   * Moving the document instance is safe, but it invalidates the element instances. After
    +   * moving a document, you can recover safe access to the document root with its `root()` method.
    +   *
    +   * @param doc The document instance where the parsed data will be stored (on success).
    +   * @param buf The JSON to parse. Must have at least len + SIMDJSON_PADDING allocated bytes, unless
    +   *            realloc_if_needed is true.
    +   * @param len The length of the JSON.
    +   * @param realloc_if_needed Whether to reallocate and enlarge the JSON buffer to add padding.
    +   * @return An element pointing at the root of document, or an error:
    +   *         - MEMALLOC if realloc_if_needed is true or the parser does not have enough capacity,
    +   *           and memory allocation fails.
    +   *         - CAPACITY if the parser does not have enough capacity and len > max_capacity.
    +   *         - other json errors if parsing fails. You should not rely on these errors to always the same for the
    +   *           same document: they may vary under runtime dispatch (so they may vary depending on your system and hardware).
    +   */
    +  inline simdjson_result parse_into_document(document& doc, const uint8_t *buf, size_t len, bool realloc_if_needed = true) & noexcept;
    +  inline simdjson_result parse_into_document(document& doc, const uint8_t *buf, size_t len, bool realloc_if_needed = true) && =delete;
    +  /** @overload parse_into_document(const uint8_t *buf, size_t len, bool realloc_if_needed) */
    +  simdjson_inline simdjson_result parse_into_document(document& doc, const char *buf, size_t len, bool realloc_if_needed = true) & noexcept;
    +  simdjson_inline simdjson_result parse_into_document(document& doc, const char *buf, size_t len, bool realloc_if_needed = true) && =delete;
    +  /** @overload parse_into_document(const uint8_t *buf, size_t len, bool realloc_if_needed) */
    +  simdjson_inline simdjson_result parse_into_document(document& doc, const std::string &s) & noexcept;
    +  simdjson_inline simdjson_result parse_into_document(document& doc, const std::string &s) && =delete;
    +  /** @overload parse_into_document(const uint8_t *buf, size_t len, bool realloc_if_needed) */
    +  simdjson_inline simdjson_result parse_into_document(document& doc, const padded_string &s) & noexcept;
    +  simdjson_inline simdjson_result parse_into_document(document& doc, const padded_string &s) && =delete;
    +
    +  /** @private We do not want to allow implicit conversion from C string to std::string. */
    +  simdjson_inline simdjson_result parse_into_document(document& doc, const char *buf) noexcept = delete;
    +
    +  /**
    +   * Load a file containing many JSON documents.
    +   *
    +   *   dom::parser parser;
    +   *   for (const element doc : parser.load_many(path)) {
    +   *     cout << std::string(doc["title"]) << endl;
    +   *   }
    +   *
    +   * The file is loaded in memory and can be safely deleted after the `parser.load_many(path)`
    +   * function has returned. The memory is held by the `parser` instance.
    +   *
    +   * The function is lazy: it may be that no more than one JSON document at a time is parsed.
    +   * And, possibly, no document many have been parsed when the `parser.load_many(path)` function
    +   * returned.
    +   *
    +   * If there is a UTF-8 BOM, the parser skips it.
    +   *
    +   * ### Format
    +   *
    +   * The file must contain a series of one or more JSON documents, concatenated into a single
    +   * buffer, separated by whitespace. It effectively parses until it has a fully valid document,
    +   * then starts parsing the next document at that point. (It does this with more parallelism and
    +   * lookahead than you might think, though.)
    +   *
    +   * Documents that consist of an object or array may omit the whitespace between them, concatenating
    +   * with no separator. documents that consist of a single primitive (i.e. documents that are not
    +   * arrays or objects) MUST be separated with whitespace.
    +   *
    +   * The documents must not exceed batch_size bytes (by default 1MB) or they will fail to parse.
    +   * Setting batch_size to excessively large or excesively small values may impact negatively the
    +   * performance.
    +   *
    +   * ### Error Handling
    +   *
    +   * All errors are returned during iteration: if there is a global error such as memory allocation,
    +   * it will be yielded as the first result. Iteration always stops after the first error.
    +   *
    +   * As with all other simdjson methods, non-exception error handling is readily available through
    +   * the same interface, requiring you to check the error before using the document:
    +   *
    +   *   dom::parser parser;
    +   *   dom::document_stream docs;
    +   *   auto error = parser.load_many(path).get(docs);
    +   *   if (error) { cerr << error << endl; exit(1); }
    +   *   for (auto doc : docs) {
    +   *     std::string_view title;
    +   *     if ((error = doc["title"].get(title)) { cerr << error << endl; exit(1); }
    +   *     cout << title << endl;
    +   *   }
    +   *
    +   * ### Threads
    +   *
    +   * When compiled with SIMDJSON_THREADS_ENABLED, this method will use a single thread under the
    +   * hood to do some lookahead.
    +   *
    +   * ### Parser Capacity
    +   *
    +   * If the parser's current capacity is less than batch_size, it will allocate enough capacity
    +   * to handle it (up to max_capacity).
    +   *
    +   * @param path File name pointing at the concatenated JSON to parse.
    +   * @param batch_size The batch size to use. MUST be larger than the largest document. The sweet
    +   *                   spot is cache-related: small enough to fit in cache, yet big enough to
    +   *                   parse as many documents as possible in one tight loop.
    +   *                   Defaults to 1MB (as simdjson::dom::DEFAULT_BATCH_SIZE), which has been a reasonable sweet
    +   *                   spot in our tests.
    +   *                   If you set the batch_size to a value smaller than simdjson::dom::MINIMAL_BATCH_SIZE
    +   *                   (currently 32B), it will be replaced by simdjson::dom::MINIMAL_BATCH_SIZE.
    +   * @return The stream, or an error. An empty input will yield 0 documents rather than an EMPTY error. Errors:
    +   *         - IO_ERROR if there was an error opening or reading the file.
    +   *         - MEMALLOC if the parser does not have enough capacity and memory allocation fails.
    +   *         - CAPACITY if the parser does not have enough capacity and batch_size > max_capacity.
    +   *         - other json errors if parsing fails. You should not rely on these errors to always the same for the
    +   *           same document: they may vary under runtime dispatch (so they may vary depending on your system and hardware).
    +   */
    +  inline simdjson_result load_many(const std::string &path, size_t batch_size = dom::DEFAULT_BATCH_SIZE) noexcept;
    +
    +  /**
    +   * Parse a buffer containing many JSON documents.
    +   *
    +   *   dom::parser parser;
    +   *   for (element doc : parser.parse_many(buf, len)) {
    +   *     cout << std::string(doc["title"]) << endl;
    +   *   }
    +   *
    +   * No copy of the input buffer is made.
    +   *
    +   * The function is lazy: it may be that no more than one JSON document at a time is parsed.
    +   * And, possibly, no document many have been parsed when the `parser.load_many(path)` function
    +   * returned.
    +   *
    +   * The caller is responsabile to ensure that the input string data remains unchanged and is
    +   * not deleted during the loop. In particular, the following is unsafe and will not compile:
    +   *
    +   *   auto docs = parser.parse_many("[\"temporary data\"]"_padded);
    +   *   // here the string "[\"temporary data\"]" may no longer exist in memory
    +   *   // the parser instance may not have even accessed the input yet
    +   *   for (element doc : docs) {
    +   *     cout << std::string(doc["title"]) << endl;
    +   *   }
    +   *
    +   * The following is safe:
    +   *
    +   *   auto json = "[\"temporary data\"]"_padded;
    +   *   auto docs = parser.parse_many(json);
    +   *   for (element doc : docs) {
    +   *     cout << std::string(doc["title"]) << endl;
    +   *   }
    +   *
    +   * If there is a UTF-8 BOM, the parser skips it.
    +   *
    +   * ### Format
    +   *
    +   * The buffer must contain a series of one or more JSON documents, concatenated into a single
    +   * buffer, separated by whitespace. It effectively parses until it has a fully valid document,
    +   * then starts parsing the next document at that point. (It does this with more parallelism and
    +   * lookahead than you might think, though.)
    +   *
    +   * documents that consist of an object or array may omit the whitespace between them, concatenating
    +   * with no separator. documents that consist of a single primitive (i.e. documents that are not
    +   * arrays or objects) MUST be separated with whitespace.
    +   *
    +   * The documents must not exceed batch_size bytes (by default 1MB) or they will fail to parse.
    +   * Setting batch_size to excessively large or excesively small values may impact negatively the
    +   * performance.
    +   *
    +   * ### Error Handling
    +   *
    +   * All errors are returned during iteration: if there is a global error such as memory allocation,
    +   * it will be yielded as the first result. Iteration always stops after the first error.
    +   *
    +   * As with all other simdjson methods, non-exception error handling is readily available through
    +   * the same interface, requiring you to check the error before using the document:
    +   *
    +   *   dom::parser parser;
    +   *   dom::document_stream docs;
    +   *   auto error = parser.load_many(path).get(docs);
    +   *   if (error) { cerr << error << endl; exit(1); }
    +   *   for (auto doc : docs) {
    +   *     std::string_view title;
    +   *     if ((error = doc["title"].get(title)) { cerr << error << endl; exit(1); }
    +   *     cout << title << endl;
    +   *   }
    +   *
    +   * ### REQUIRED: Buffer Padding
    +   *
    +   * The buffer must have at least SIMDJSON_PADDING extra allocated bytes. It does not matter what
    +   * those bytes are initialized to, as long as they are allocated. These bytes will be read: if you
    +   * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the
    +   * SIMDJSON_PADDING bytes to avoid runtime warnings.
    +   *
    +   * ### Threads
    +   *
    +   * When compiled with SIMDJSON_THREADS_ENABLED, this method will use a single thread under the
    +   * hood to do some lookahead.
    +   *
    +   * ### Parser Capacity
    +   *
    +   * If the parser's current capacity is less than batch_size, it will allocate enough capacity
    +   * to handle it (up to max_capacity).
    +   *
    +   * @param buf The concatenated JSON to parse. Must have at least len + SIMDJSON_PADDING allocated bytes.
    +   * @param len The length of the concatenated JSON.
    +   * @param batch_size The batch size to use. MUST be larger than the largest document. The sweet
    +   *                   spot is cache-related: small enough to fit in cache, yet big enough to
    +   *                   parse as many documents as possible in one tight loop.
    +   *                   Defaults to 10MB, which has been a reasonable sweet spot in our tests.
    +   * @return The stream, or an error. An empty input will yield 0 documents rather than an EMPTY error. Errors:
    +   *         - MEMALLOC if the parser does not have enough capacity and memory allocation fails
    +   *         - CAPACITY if the parser does not have enough capacity and batch_size > max_capacity.
    +   *         - other json errors if parsing fails. You should not rely on these errors to always the same for the
    +   *           same document: they may vary under runtime dispatch (so they may vary depending on your system and hardware).
    +   */
    +  inline simdjson_result parse_many(const uint8_t *buf, size_t len, size_t batch_size = dom::DEFAULT_BATCH_SIZE) noexcept;
    +  /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */
    +  inline simdjson_result parse_many(const char *buf, size_t len, size_t batch_size = dom::DEFAULT_BATCH_SIZE) noexcept;
    +  /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */
    +  inline simdjson_result parse_many(const std::string &s, size_t batch_size = dom::DEFAULT_BATCH_SIZE) noexcept;
    +  inline simdjson_result parse_many(const std::string &&s, size_t batch_size) = delete;// unsafe
    +  /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */
    +  inline simdjson_result parse_many(const padded_string &s, size_t batch_size = dom::DEFAULT_BATCH_SIZE) noexcept;
    +  inline simdjson_result parse_many(const padded_string &&s, size_t batch_size) = delete;// unsafe
    +
    +  /** @private We do not want to allow implicit conversion from C string to std::string. */
    +  simdjson_result parse_many(const char *buf, size_t batch_size = dom::DEFAULT_BATCH_SIZE) noexcept = delete;
    +
    +  /**
    +   * Ensure this parser has enough memory to process JSON documents up to `capacity` bytes in length
    +   * and `max_depth` depth.
    +   *
    +   * @param capacity The new capacity.
    +   * @param max_depth The new max_depth. Defaults to DEFAULT_MAX_DEPTH.
    +   * @return The error, if there is one.
    +   */
    +  simdjson_warn_unused inline error_code allocate(size_t capacity, size_t max_depth = DEFAULT_MAX_DEPTH) noexcept;
    +
    +#ifndef SIMDJSON_DISABLE_DEPRECATED_API
    +  /**
    +   * @private deprecated because it returns bool instead of error_code, which is our standard for
    +   * failures. Use allocate() instead.
    +   *
    +   * Ensure this parser has enough memory to process JSON documents up to `capacity` bytes in length
    +   * and `max_depth` depth.
    +   *
    +   * @param capacity The new capacity.
    +   * @param max_depth The new max_depth. Defaults to DEFAULT_MAX_DEPTH.
    +   * @return true if successful, false if allocation failed.
    +   */
    +  [[deprecated("Use allocate() instead.")]]
    +  simdjson_warn_unused inline bool allocate_capacity(size_t capacity, size_t max_depth = DEFAULT_MAX_DEPTH) noexcept;
    +#endif // SIMDJSON_DISABLE_DEPRECATED_API
    +  /**
    +   * The largest document this parser can support without reallocating.
    +   *
    +   * @return Current capacity, in bytes.
    +   */
    +  simdjson_inline size_t capacity() const noexcept;
    +
    +  /**
    +   * The largest document this parser can automatically support.
    +   *
    +   * The parser may reallocate internal buffers as needed up to this amount.
    +   *
    +   * @return Maximum capacity, in bytes.
    +   */
    +  simdjson_inline size_t max_capacity() const noexcept;
    +
    +  /**
    +   * The maximum level of nested object and arrays supported by this parser.
    +   *
    +   * @return Maximum depth, in bytes.
    +   */
    +  simdjson_inline size_t max_depth() const noexcept;
    +
    +  /**
    +   * Set max_capacity. This is the largest document this parser can automatically support.
    +   *
    +   * The parser may reallocate internal buffers as needed up to this amount as documents are passed
    +   * to it.
    +   *
    +   * Note: To avoid limiting the memory to an absurd value, such as zero or two bytes,
    +   * iff you try to set max_capacity to a value lower than MINIMAL_DOCUMENT_CAPACITY,
    +   * then the maximal capacity is set to MINIMAL_DOCUMENT_CAPACITY.
    +   *
    +   * This call will not allocate or deallocate, even if capacity is currently above max_capacity.
    +   *
    +   * @param max_capacity The new maximum capacity, in bytes.
    +   */
    +  simdjson_inline void set_max_capacity(size_t max_capacity) noexcept;
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +  /**
    +   * The parser instance can use threads when they are available to speed up some
    +   * operations. It is enabled by default. Changing this attribute will change the
    +   * behavior of the parser for future operations.
    +   */
    +  bool threaded{true};
    +#endif
    +  /** @private Use the new DOM API instead */
    +  class Iterator;
    +  /** @private Use simdjson_error instead */
    +  using InvalidJSON [[deprecated("Use simdjson_error instead")]] = simdjson_error;
    +
    +  /** @private [for benchmarking access] The implementation to use */
    +  std::unique_ptr implementation{};
    +
    +  /** @private Use `if (parser.parse(...).error())` instead */
    +  bool valid{false};
    +  /** @private Use `parser.parse(...).error()` instead */
    +  error_code error{UNINITIALIZED};
    +
    +  /** @private Use `parser.parse(...).value()` instead */
    +  document doc{};
    +
    +  /** @private returns true if the document parsed was valid */
    +  [[deprecated("Use the result of parser.parse() instead")]]
    +  inline bool is_valid() const noexcept;
    +
    +  /**
    +   * @private return an error code corresponding to the last parsing attempt, see
    +   * simdjson.h will return UNINITIALIZED if no parsing was attempted
    +   */
    +  [[deprecated("Use the result of parser.parse() instead")]]
    +  inline int get_error_code() const noexcept;
    +
    +  /** @private return the string equivalent of "get_error_code" */
    +  [[deprecated("Use error_message() on the result of parser.parse() instead, or cout << error")]]
    +  inline std::string get_error_message() const noexcept;
    +
    +  /** @private */
    +  [[deprecated("Use cout << on the result of parser.parse() instead")]]
    +  inline bool print_json(std::ostream &os) const noexcept;
    +
    +  /** @private Private and deprecated: use `parser.parse(...).doc.dump_raw_tape()` instead */
    +  inline bool dump_raw_tape(std::ostream &os) const noexcept;
    +
    +
    +private:
    +  /**
    +   * The maximum document length this parser will automatically support.
    +   *
    +   * The parser will not be automatically allocated above this amount.
    +   */
    +  size_t _max_capacity;
    +
    +  /**
    +   * The loaded buffer (reused each time load() is called)
    +   */
    +  std::unique_ptr loaded_bytes;
    +
    +  /** Capacity of loaded_bytes buffer. */
    +  size_t _loaded_bytes_capacity{0};
    +
    +  // all nodes are stored on the doc.tape using a 64-bit word.
    +  //
    +  // strings, double and ints are stored as
    +  //  a 64-bit word with a pointer to the actual value
    +  //
    +  //
    +  //
    +  // for objects or arrays, store [ or {  at the beginning and } and ] at the
    +  // end. For the openings ([ or {), we annotate them with a reference to the
    +  // location on the doc.tape of the end, and for then closings (} and ]), we
    +  // annotate them with a reference to the location of the opening
    +  //
    +  //
    +
    +  /**
    +   * Ensure we have enough capacity to handle at least desired_capacity bytes,
    +   * and auto-allocate if not. This also allocates memory if needed in the
    +   * internal document.
    +   */
    +  inline error_code ensure_capacity(size_t desired_capacity) noexcept;
    +  /**
    +   * Ensure we have enough capacity to handle at least desired_capacity bytes,
    +   * and auto-allocate if not. This also allocates memory if needed in the
    +   * provided document.
    +   */
    +  inline error_code ensure_capacity(document& doc, size_t desired_capacity) noexcept;
    +
    +  /** Read the file into loaded_bytes */
    +  inline simdjson_result read_file(const std::string &path) noexcept;
    +
    +  friend class parser::Iterator;
    +  friend class document_stream;
    +
    +
    +}; // class parser
    +
    +} // namespace dom
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_DOM_PARSER_H
    +/* end file simdjson/dom/parser.h */
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +#include 
    +#include 
    +#include 
    +#endif
    +
    +namespace simdjson {
    +namespace dom {
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +/** @private Custom worker class **/
    +struct stage1_worker {
    +  stage1_worker() noexcept = default;
    +  stage1_worker(const stage1_worker&) = delete;
    +  stage1_worker(stage1_worker&&) = delete;
    +  stage1_worker operator=(const stage1_worker&) = delete;
    +  ~stage1_worker();
    +  /**
    +   * We only start the thread when it is needed, not at object construction, this may throw.
    +   * You should only call this once.
    +   **/
    +  void start_thread();
    +  /**
    +   * Start a stage 1 job. You should first call 'run', then 'finish'.
    +   * You must call start_thread once before.
    +   */
    +  void run(document_stream * ds, dom::parser * stage1, size_t next_batch_start);
    +  /** Wait for the run to finish (blocking). You should first call 'run', then 'finish'. **/
    +  void finish();
    +
    +private:
    +
    +  /**
    +   * Normally, we would never stop the thread. But we do in the destructor.
    +   * This function is only safe assuming that you are not waiting for results. You
    +   * should have called run, then finish, and be done.
    +   **/
    +  void stop_thread();
    +
    +  std::thread thread{};
    +  /** These three variables define the work done by the thread. **/
    +  dom::parser * stage1_thread_parser{};
    +  size_t _next_batch_start{};
    +  document_stream * owner{};
    +  /**
    +   * We have two state variables. This could be streamlined to one variable in the future but
    +   * we use two for clarity.
    +   */
    +  bool has_work{false};
    +  bool can_work{true};
    +
    +  /**
    +   * We lock using a mutex.
    +   */
    +  std::mutex locking_mutex{};
    +  std::condition_variable cond_var{};
    +};
    +#endif
    +
    +/**
    + * A forward-only stream of documents.
    + *
    + * Produced by parser::parse_many.
    + *
    + */
    +class document_stream {
    +public:
    +  /**
    +   * Construct an uninitialized document_stream.
    +   *
    +   *  ```c++
    +   *  document_stream docs;
    +   *  error = parser.parse_many(json).get(docs);
    +   *  ```
    +   */
    +  simdjson_inline document_stream() noexcept;
    +  /** Move one document_stream to another. */
    +  simdjson_inline document_stream(document_stream &&other) noexcept = default;
    +  /** Move one document_stream to another. */
    +  simdjson_inline document_stream &operator=(document_stream &&other) noexcept = default;
    +
    +  simdjson_inline ~document_stream() noexcept;
    +  /**
    +   * Returns the input size in bytes.
    +   */
    +  inline size_t size_in_bytes() const noexcept;
    +  /**
    +   * After iterating through the stream, this method
    +   * returns the number of bytes that were not parsed at the end
    +   * of the stream. If truncated_bytes() differs from zero,
    +   * then the input was truncated maybe because incomplete JSON
    +   * documents were found at the end of the stream. You
    +   * may need to process the bytes in the interval [size_in_bytes()-truncated_bytes(), size_in_bytes()).
    +   *
    +   * You should only call truncated_bytes() after streaming through all
    +   * documents, like so:
    +   *
    +   *   document_stream stream = parser.parse_many(json,window);
    +   *   for(auto doc : stream) {
    +   *      // do something with doc
    +   *   }
    +   *   size_t truncated = stream.truncated_bytes();
    +   *
    +   */
    +  inline size_t truncated_bytes() const noexcept;
    +  /**
    +   * An iterator through a forward-only stream of documents.
    +   */
    +  class iterator {
    +  public:
    +    using value_type = simdjson_result;
    +    using reference  = value_type;
    +
    +    using difference_type   = std::ptrdiff_t;
    +
    +    using iterator_category = std::input_iterator_tag;
    +
    +    /**
    +     * Default constructor.
    +     */
    +    simdjson_inline iterator() noexcept;
    +    /**
    +     * Get the current document (or error).
    +     */
    +    simdjson_inline reference operator*() noexcept;
    +    /**
    +     * Advance to the next document (prefix).
    +     */
    +    inline iterator& operator++() noexcept;
    +    /**
    +     * Check if we're at the end yet.
    +     * @param other the end iterator to compare to.
    +     */
    +    simdjson_inline bool operator!=(const iterator &other) const noexcept;
    +    /**
    +     * @private
    +     *
    +     * Gives the current index in the input document in bytes.
    +     *
    +     *   document_stream stream = parser.parse_many(json,window);
    +     *   for(auto i = stream.begin(); i != stream.end(); ++i) {
    +     *      auto doc = *i;
    +     *      size_t index = i.current_index();
    +     *   }
    +     *
    +     * This function (current_index()) is experimental and the usage
    +     * may change in future versions of simdjson: we find the API somewhat
    +     * awkward and we would like to offer something friendlier.
    +     */
    +     simdjson_inline size_t current_index() const noexcept;
    +    /**
    +     * @private
    +     *
    +     * Gives a view of the current document.
    +     *
    +     *   document_stream stream = parser.parse_many(json,window);
    +     *   for(auto i = stream.begin(); i != stream.end(); ++i) {
    +     *      auto doc = *i;
    +     *      std::string_view v = i->source();
    +     *   }
    +     *
    +     * The returned string_view instance is simply a map to the (unparsed)
    +     * source string: it may thus include white-space characters and all manner
    +     * of padding.
    +     *
    +     * This function (source()) is experimental and the usage
    +     * may change in future versions of simdjson: we find the API somewhat
    +     * awkward and we would like to offer something friendlier.
    +     */
    +     simdjson_inline std::string_view source() const noexcept;
    +
    +  private:
    +    simdjson_inline iterator(document_stream *s, bool finished) noexcept;
    +    /** The document_stream we're iterating through. */
    +    document_stream* stream;
    +    /** Whether we're finished or not. */
    +    bool finished;
    +    friend class document_stream;
    +  };
    +
    +  /**
    +   * Start iterating the documents in the stream.
    +   */
    +  simdjson_inline iterator begin() noexcept;
    +  /**
    +   * The end of the stream, for iterator comparison purposes.
    +   */
    +  simdjson_inline iterator end() noexcept;
    +
    +private:
    +
    +  document_stream &operator=(const document_stream &) = delete; // Disallow copying
    +  document_stream(const document_stream &other) = delete; // Disallow copying
    +
    +  /**
    +   * Construct a document_stream. Does not allocate or parse anything until the iterator is
    +   * used.
    +   *
    +   * @param parser is a reference to the parser instance used to generate this document_stream
    +   * @param buf is the raw byte buffer we need to process
    +   * @param len is the length of the raw byte buffer in bytes
    +   * @param batch_size is the size of the windows (must be strictly greater or equal to the largest JSON document)
    +   */
    +  simdjson_inline document_stream(
    +    dom::parser &parser,
    +    const uint8_t *buf,
    +    size_t len,
    +    size_t batch_size
    +  ) noexcept;
    +
    +  /**
    +   * Parse the first document in the buffer. Used by begin(), to handle allocation and
    +   * initialization.
    +   */
    +  inline void start() noexcept;
    +
    +  /**
    +   * Parse the next document found in the buffer previously given to document_stream.
    +   *
    +   * The content should be a valid JSON document encoded as UTF-8. If there is a
    +   * UTF-8 BOM, the parser skips it.
    +   *
    +   * You do NOT need to pre-allocate a parser.  This function takes care of
    +   * pre-allocating a capacity defined by the batch_size defined when creating the
    +   * document_stream object.
    +   *
    +   * The function returns simdjson::EMPTY if there is no more data to be parsed.
    +   *
    +   * The function returns simdjson::SUCCESS (as integer = 0) in case of success
    +   * and indicates that the buffer has successfully been parsed to the end.
    +   * Every document it contained has been parsed without error.
    +   *
    +   * The function returns an error code from simdjson/simdjson.h in case of failure
    +   * such as simdjson::CAPACITY, simdjson::MEMALLOC, simdjson::DEPTH_ERROR and so forth;
    +   * the simdjson::error_message function converts these error codes into a string).
    +   *
    +   * You can also check validity by calling parser.is_valid(). The same parser can
    +   * and should be reused for the other documents in the buffer.
    +   */
    +  inline void next() noexcept;
    +
    +  /**
    +   * Pass the next batch through stage 1 and return when finished.
    +   * When threads are enabled, this may wait for the stage 1 thread to finish.
    +   */
    +  inline void load_batch() noexcept;
    +
    +  /** Get the next document index. */
    +  inline size_t next_batch_start() const noexcept;
    +
    +  /** Pass the next batch through stage 1 with the given parser. */
    +  inline error_code run_stage1(dom::parser &p, size_t batch_start) noexcept;
    +
    +  dom::parser *parser;
    +  const uint8_t *buf;
    +  size_t len;
    +  size_t batch_size;
    +  /** The error (or lack thereof) from the current document. */
    +  error_code error;
    +  size_t batch_start{0};
    +  size_t doc_index{};
    +#ifdef SIMDJSON_THREADS_ENABLED
    +  /** Indicates whether we use threads. Note that this needs to be a constant during the execution of the parsing. */
    +  bool use_thread;
    +
    +  inline void load_from_stage1_thread() noexcept;
    +
    +  /** Start a thread to run stage 1 on the next batch. */
    +  inline void start_stage1_thread() noexcept;
    +
    +  /** Wait for the stage 1 thread to finish and capture the results. */
    +  inline void finish_stage1_thread() noexcept;
    +
    +  /** The error returned from the stage 1 thread. */
    +  error_code stage1_thread_error{UNINITIALIZED};
    +  /** The thread used to run stage 1 against the next batch in the background. */
    +  friend struct stage1_worker;
    +  std::unique_ptr worker{new(std::nothrow) stage1_worker()};
    +  /**
    +   * The parser used to run stage 1 in the background. Will be swapped
    +   * with the regular parser when finished.
    +   */
    +  dom::parser stage1_thread_parser{};
    +#endif // SIMDJSON_THREADS_ENABLED
    +
    +  friend class dom::parser;
    +  friend struct simdjson_result;
    +  friend struct internal::simdjson_result_base;
    +
    +}; // class document_stream
    +
    +} // namespace dom
    +
    +template<>
    +struct simdjson_result : public internal::simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result() noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result(dom::document_stream &&value) noexcept; ///< @private
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline dom::document_stream::iterator begin() noexcept(false);
    +  simdjson_inline dom::document_stream::iterator end() noexcept(false);
    +#else // SIMDJSON_EXCEPTIONS
    +#ifndef SIMDJSON_DISABLE_DEPRECATED_API
    +  [[deprecated("parse_many() and load_many() may return errors. Use document_stream stream; error = parser.parse_many().get(doc); instead.")]]
    +  simdjson_inline dom::document_stream::iterator begin() noexcept;
    +  [[deprecated("parse_many() and load_many() may return errors. Use document_stream stream; error = parser.parse_many().get(doc); instead.")]]
    +  simdjson_inline dom::document_stream::iterator end() noexcept;
    +#endif // SIMDJSON_DISABLE_DEPRECATED_API
    +#endif // SIMDJSON_EXCEPTIONS
    +}; // struct simdjson_result
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_DOCUMENT_STREAM_H
    +/* end file simdjson/dom/document_stream.h */
    +/* skipped duplicate #include "simdjson/dom/document.h" */
    +/* including simdjson/dom/element.h: #include "simdjson/dom/element.h" */
    +/* begin file simdjson/dom/element.h */
    +#ifndef SIMDJSON_DOM_ELEMENT_H
    +#define SIMDJSON_DOM_ELEMENT_H
    +
    +/* skipped duplicate #include "simdjson/dom/base.h" */
    +/* skipped duplicate #include "simdjson/dom/array.h" */
    +
    +namespace simdjson {
    +namespace dom {
    +
    +/**
    + * The actual concrete type of a JSON element
    + * This is the type it is most easily cast to with get<>.
    + */
    +enum class element_type {
    +  ARRAY = '[',     ///< dom::array
    +  OBJECT = '{',    ///< dom::object
    +  INT64 = 'l',     ///< int64_t
    +  UINT64 = 'u',    ///< uint64_t: any integer that fits in uint64_t but *not* int64_t
    +  DOUBLE = 'd',    ///< double: Any number with a "." or "e" that fits in double.
    +  STRING = '"',    ///< std::string_view
    +  BOOL = 't',      ///< bool
    +  NULL_VALUE = 'n' ///< null
    +};
    +
    +/**
    + * A JSON element.
    + *
    + * References an element in a JSON document, representing a JSON null, boolean, string, number,
    + * array or object.
    + */
    +class element {
    +public:
    +  /** Create a new, invalid element. */
    +  simdjson_inline element() noexcept;
    +
    +  /** The type of this element. */
    +  simdjson_inline element_type type() const noexcept;
    +
    +  /**
    +   * Cast this element to an array.
    +   *
    +   * @returns An object that can be used to iterate the array, or:
    +   *          INCORRECT_TYPE if the JSON element is not an array.
    +   */
    +  inline simdjson_result get_array() const noexcept;
    +  /**
    +   * Cast this element to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate the object's fields, or:
    +   *          INCORRECT_TYPE if the JSON element is not an object.
    +   */
    +  inline simdjson_result get_object() const noexcept;
    +  /**
    +   * Cast this element to a null-terminated C string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * The length of the string is given by get_string_length(). Because JSON strings
    +   * may contain null characters, it may be incorrect to use strlen to determine the
    +   * string length.
    +   *
    +   * It is possible to get a single string_view instance which represents both the string
    +   * content and its length: see get_string().
    +   *
    +   * @returns A pointer to a null-terminated UTF-8 string. This string is stored in the parser and will
    +   *          be invalidated the next time it parses a document or when it is destroyed.
    +   *          Returns INCORRECT_TYPE if the JSON element is not a string.
    +   */
    +  inline simdjson_result get_c_str() const noexcept;
    +  /**
    +   * Gives the length in bytes of the string.
    +   *
    +   * It is possible to get a single string_view instance which represents both the string
    +   * content and its length: see get_string().
    +   *
    +   * @returns A string length in bytes.
    +   *          Returns INCORRECT_TYPE if the JSON element is not a string.
    +   */
    +  inline simdjson_result get_string_length() const noexcept;
    +  /**
    +   * Cast this element to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next time it
    +   *          parses a document or when it is destroyed.
    +   *          Returns INCORRECT_TYPE if the JSON element is not a string.
    +   */
    +  inline simdjson_result get_string() const noexcept;
    +  /**
    +   * Cast this element to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   *          Returns INCORRECT_TYPE if the JSON element is not an integer, or NUMBER_OUT_OF_RANGE
    +   *          if it is negative.
    +   */
    +  inline simdjson_result get_int64() const noexcept;
    +  /**
    +   * Cast this element to an unsigned integer.
    +   *
    +   * @returns An unsigned 64-bit integer.
    +   *          Returns INCORRECT_TYPE if the JSON element is not an integer, or NUMBER_OUT_OF_RANGE
    +   *          if it is too large.
    +   */
    +  inline simdjson_result get_uint64() const noexcept;
    +  /**
    +   * Cast this element to a double floating-point.
    +   *
    +   * @returns A double value.
    +   *          Returns INCORRECT_TYPE if the JSON element is not a number.
    +   */
    +  inline simdjson_result get_double() const noexcept;
    +  /**
    +   * Cast this element to a bool.
    +   *
    +   * @returns A bool value.
    +   *          Returns INCORRECT_TYPE if the JSON element is not a boolean.
    +   */
    +  inline simdjson_result get_bool() const noexcept;
    +
    +  /**
    +   * Whether this element is a json array.
    +   *
    +   * Equivalent to is().
    +   */
    +  inline bool is_array() const noexcept;
    +  /**
    +   * Whether this element is a json object.
    +   *
    +   * Equivalent to is().
    +   */
    +  inline bool is_object() const noexcept;
    +  /**
    +   * Whether this element is a json string.
    +   *
    +   * Equivalent to is() or is().
    +   */
    +  inline bool is_string() const noexcept;
    +  /**
    +   * Whether this element is a json number that fits in a signed 64-bit integer.
    +   *
    +   * Equivalent to is().
    +   */
    +  inline bool is_int64() const noexcept;
    +  /**
    +   * Whether this element is a json number that fits in an unsigned 64-bit integer.
    +   *
    +   * Equivalent to is().
    +   */
    +  inline bool is_uint64() const noexcept;
    +  /**
    +   * Whether this element is a json number that fits in a double.
    +   *
    +   * Equivalent to is().
    +   */
    +  inline bool is_double() const noexcept;
    +
    +  /**
    +   * Whether this element is a json number.
    +   *
    +   * Both integers and floating points will return true.
    +   */
    +  inline bool is_number() const noexcept;
    +
    +  /**
    +   * Whether this element is a json `true` or `false`.
    +   *
    +   * Equivalent to is().
    +   */
    +  inline bool is_bool() const noexcept;
    +  /**
    +   * Whether this element is a json `null`.
    +   */
    +  inline bool is_null() const noexcept;
    +
    +  /**
    +   * Tell whether the value can be cast to provided type (T).
    +   *
    +   * Supported types:
    +   * - Boolean: bool
    +   * - Number: double, uint64_t, int64_t
    +   * - String: std::string_view, const char *
    +   * - Array: dom::array
    +   * - Object: dom::object
    +   *
    +   * @tparam T bool, double, uint64_t, int64_t, std::string_view, const char *, dom::array, dom::object
    +   */
    +  template
    +  simdjson_inline bool is() const noexcept;
    +
    +  /**
    +   * Get the value as the provided type (T).
    +   *
    +   * Supported types:
    +   * - Boolean: bool
    +   * - Number: double, uint64_t, int64_t
    +   * - String: std::string_view, const char *
    +   * - Array: dom::array
    +   * - Object: dom::object
    +   *
    +   * You may use get_double(), get_bool(), get_uint64(), get_int64(),
    +   * get_object(), get_array() or get_string() instead.
    +   *
    +   * @tparam T bool, double, uint64_t, int64_t, std::string_view, const char *, dom::array, dom::object
    +   *
    +   * @returns The value cast to the given type, or:
    +   *          INCORRECT_TYPE if the value cannot be cast to the given type.
    +   */
    +
    +  template
    +  inline simdjson_result get() const noexcept {
    +    // Unless the simdjson library provides an inline implementation, calling this method should
    +    // immediately fail.
    +    static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. "
    +      "The supported types are Boolean (bool), numbers (double, uint64_t, int64_t), "
    +      "strings (std::string_view, const char *), arrays (dom::array) and objects (dom::object). "
    +      "We recommand you use get_double(), get_bool(), get_uint64(), get_int64(), "
    +      "get_object(), get_array() or get_string() instead of the get template.");
    +  }
    +
    +  /**
    +   * Get the value as the provided type (T).
    +   *
    +   * Supported types:
    +   * - Boolean: bool
    +   * - Number: double, uint64_t, int64_t
    +   * - String: std::string_view, const char *
    +   * - Array: dom::array
    +   * - Object: dom::object
    +   *
    +   * @tparam T bool, double, uint64_t, int64_t, std::string_view, const char *, dom::array, dom::object
    +   *
    +   * @param value The variable to set to the value. May not be set if there is an error.
    +   *
    +   * @returns The error that occurred, or SUCCESS if there was no error.
    +   */
    +  template
    +  simdjson_warn_unused simdjson_inline error_code get(T &value) const noexcept;
    +
    +  /**
    +   * Get the value as the provided type (T), setting error if it's not the given type.
    +   *
    +   * Supported types:
    +   * - Boolean: bool
    +   * - Number: double, uint64_t, int64_t
    +   * - String: std::string_view, const char *
    +   * - Array: dom::array
    +   * - Object: dom::object
    +   *
    +   * @tparam T bool, double, uint64_t, int64_t, std::string_view, const char *, dom::array, dom::object
    +   *
    +   * @param value The variable to set to the given type. value is undefined if there is an error.
    +   * @param error The variable to store the error. error is set to error_code::SUCCEED if there is an error.
    +   */
    +  template
    +  inline void tie(T &value, error_code &error) && noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  /**
    +   * Read this element as a boolean.
    +   *
    +   * @return The boolean value
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON element is not a boolean.
    +   */
    +  inline operator bool() const noexcept(false);
    +
    +  /**
    +   * Read this element as a null-terminated UTF-8 string.
    +   *
    +   * Be mindful that JSON allows strings to contain null characters.
    +   *
    +   * Does *not* convert other types to a string; requires that the JSON type of the element was
    +   * an actual string.
    +   *
    +   * @return The string value.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON element is not a string.
    +   */
    +  inline explicit operator const char*() const noexcept(false);
    +
    +  /**
    +   * Read this element as a null-terminated UTF-8 string.
    +   *
    +   * Does *not* convert other types to a string; requires that the JSON type of the element was
    +   * an actual string.
    +   *
    +   * @return The string value.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON element is not a string.
    +   */
    +  inline operator std::string_view() const noexcept(false);
    +
    +  /**
    +   * Read this element as an unsigned integer.
    +   *
    +   * @return The integer value.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON element is not an integer
    +   * @exception simdjson_error(NUMBER_OUT_OF_RANGE) if the integer doesn't fit in 64 bits or is negative
    +   */
    +  inline operator uint64_t() const noexcept(false);
    +  /**
    +   * Read this element as an signed integer.
    +   *
    +   * @return The integer value.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON element is not an integer
    +   * @exception simdjson_error(NUMBER_OUT_OF_RANGE) if the integer doesn't fit in 64 bits
    +   */
    +  inline operator int64_t() const noexcept(false);
    +  /**
    +   * Read this element as an double.
    +   *
    +   * @return The double value.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON element is not a number
    +   * @exception simdjson_error(NUMBER_OUT_OF_RANGE) if the integer doesn't fit in 64 bits or is negative
    +   */
    +  inline operator double() const noexcept(false);
    +  /**
    +   * Read this element as a JSON array.
    +   *
    +   * @return The JSON array.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON element is not an array
    +   */
    +  inline operator array() const noexcept(false);
    +  /**
    +   * Read this element as a JSON object (key/value pairs).
    +   *
    +   * @return The JSON object.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON element is not an object
    +   */
    +  inline operator object() const noexcept(false);
    +
    +  /**
    +   * Iterate over each element in this array.
    +   *
    +   * @return The beginning of the iteration.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON element is not an array
    +   */
    +  inline dom::array::iterator begin() const noexcept(false);
    +
    +  /**
    +   * Iterate over each element in this array.
    +   *
    +   * @return The end of the iteration.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON element is not an array
    +   */
    +  inline dom::array::iterator end() const noexcept(false);
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the value associated with the given key.
    +   *
    +   * The key will be matched against **unescaped** JSON:
    +   *
    +   *   dom::parser parser;
    +   *   int64_t(parser.parse(R"({ "a\n": 1 })"_padded)["a\n"]) == 1
    +   *   parser.parse(R"({ "a\n": 1 })"_padded)["a\\n"].get_uint64().error() == NO_SUCH_FIELD
    +   *
    +   * @return The value associated with this field, or:
    +   *         - NO_SUCH_FIELD if the field does not exist in the object
    +   *         - INCORRECT_TYPE if this is not an object
    +   */
    +  inline simdjson_result operator[](std::string_view key) const noexcept;
    +
    +  /**
    +   * Get the value associated with the given key.
    +   *
    +   * The key will be matched against **unescaped** JSON:
    +   *
    +   *   dom::parser parser;
    +   *   int64_t(parser.parse(R"({ "a\n": 1 })"_padded)["a\n"]) == 1
    +   *   parser.parse(R"({ "a\n": 1 })"_padded)["a\\n"].get_uint64().error() == NO_SUCH_FIELD
    +   *
    +   * @return The value associated with this field, or:
    +   *         - NO_SUCH_FIELD if the field does not exist in the object
    +   *         - INCORRECT_TYPE if this is not an object
    +   */
    +  inline simdjson_result operator[](const char *key) const noexcept;
    +
    +  /**
    +   * Get the value associated with the given JSON pointer.  We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard.
    +   *
    +   *   dom::parser parser;
    +   *   element doc = parser.parse(R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded);
    +   *   doc.at_pointer("/foo/a/1") == 20
    +   *   doc.at_pointer("/foo")["a"].at(1) == 20
    +   *   doc.at_pointer("")["foo"]["a"].at(1) == 20
    +   *
    +   * It is allowed for a key to be the empty string:
    +   *
    +   *   dom::parser parser;
    +   *   object obj = parser.parse(R"({ "": { "a": [ 10, 20, 30 ] }})"_padded);
    +   *   obj.at_pointer("//a/1") == 20
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   */
    +  inline simdjson_result at_pointer(const std::string_view json_pointer) const noexcept;
    +
    +#ifndef SIMDJSON_DISABLE_DEPRECATED_API
    +  /**
    +   *
    +   * Version 0.4 of simdjson used an incorrect interpretation of the JSON Pointer standard
    +   * and allowed the following :
    +   *
    +   *   dom::parser parser;
    +   *   element doc = parser.parse(R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded);
    +   *   doc.at("foo/a/1") == 20
    +   *
    +   * Though it is intuitive, it is not compliant with RFC 6901
    +   * https://tools.ietf.org/html/rfc6901
    +   *
    +   * For standard compliance, use the at_pointer function instead.
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   */
    +  [[deprecated("For standard compliance, use at_pointer instead, and prefix your pointers with a slash '/', see RFC6901 ")]]
    +  inline simdjson_result at(const std::string_view json_pointer) const noexcept;
    +#endif // SIMDJSON_DISABLE_DEPRECATED_API
    +
    +  /**
    +   * Get the value at the given index.
    +   *
    +   * @return The value at the given index, or:
    +   *         - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
    +   */
    +  inline simdjson_result at(size_t index) const noexcept;
    +
    +  /**
    +   * Get the value associated with the given key.
    +   *
    +   * The key will be matched against **unescaped** JSON:
    +   *
    +   *   dom::parser parser;
    +   *   int64_t(parser.parse(R"({ "a\n": 1 })"_padded)["a\n"]) == 1
    +   *   parser.parse(R"({ "a\n": 1 })"_padded)["a\\n"].get_uint64().error() == NO_SUCH_FIELD
    +   *
    +   * @return The value associated with this field, or:
    +   *         - NO_SUCH_FIELD if the field does not exist in the object
    +   */
    +  inline simdjson_result at_key(std::string_view key) const noexcept;
    +
    +  /**
    +   * Get the value associated with the given key in a case-insensitive manner.
    +   *
    +   * Note: The key will be matched against **unescaped** JSON.
    +   *
    +   * @return The value associated with this field, or:
    +   *         - NO_SUCH_FIELD if the field does not exist in the object
    +   */
    +  inline simdjson_result at_key_case_insensitive(std::string_view key) const noexcept;
    +
    +  /**
    +   * operator< defines a total order for element allowing to use them in
    +   * ordered C++ STL containers
    +   *
    +   * @return TRUE if the key appears before the other one in the tape
    +   */
    +  inline bool operator<(const element &other) const noexcept;
    +
    +  /**
    +   * operator== allows to verify if two element values reference the
    +   * same JSON item
    +   *
    +   * @return TRUE if the two values references the same JSON element
    +   */
    +  inline bool operator==(const element &other) const noexcept;
    +
    +  /** @private for debugging. Prints out the root element. */
    +  inline bool dump_raw_tape(std::ostream &out) const noexcept;
    +
    +private:
    +  simdjson_inline element(const internal::tape_ref &tape) noexcept;
    +  internal::tape_ref tape;
    +  friend class document;
    +  friend class object;
    +  friend class array;
    +  friend struct simdjson_result;
    +  template
    +  friend class simdjson::internal::string_builder;
    +
    +};
    +
    +} // namespace dom
    +
    +/** The result of a JSON navigation that may fail. */
    +template<>
    +struct simdjson_result : public internal::simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result() noexcept; ///< @private
    +  simdjson_inline simdjson_result(dom::element &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +
    +  simdjson_inline simdjson_result type() const noexcept;
    +  template
    +  simdjson_inline bool is() const noexcept;
    +  template
    +  simdjson_inline simdjson_result get() const noexcept;
    +  template
    +  simdjson_warn_unused simdjson_inline error_code get(T &value) const noexcept;
    +
    +  simdjson_inline simdjson_result get_array() const noexcept;
    +  simdjson_inline simdjson_result get_object() const noexcept;
    +  simdjson_inline simdjson_result get_c_str() const noexcept;
    +  simdjson_inline simdjson_result get_string_length() const noexcept;
    +  simdjson_inline simdjson_result get_string() const noexcept;
    +  simdjson_inline simdjson_result get_int64() const noexcept;
    +  simdjson_inline simdjson_result get_uint64() const noexcept;
    +  simdjson_inline simdjson_result get_double() const noexcept;
    +  simdjson_inline simdjson_result get_bool() const noexcept;
    +
    +  simdjson_inline bool is_array() const noexcept;
    +  simdjson_inline bool is_object() const noexcept;
    +  simdjson_inline bool is_string() const noexcept;
    +  simdjson_inline bool is_int64() const noexcept;
    +  simdjson_inline bool is_uint64() const noexcept;
    +  simdjson_inline bool is_double() const noexcept;
    +  simdjson_inline bool is_number() const noexcept;
    +  simdjson_inline bool is_bool() const noexcept;
    +  simdjson_inline bool is_null() const noexcept;
    +
    +  simdjson_inline simdjson_result operator[](std::string_view key) const noexcept;
    +  simdjson_inline simdjson_result operator[](const char *key) const noexcept;
    +  simdjson_inline simdjson_result at_pointer(const std::string_view json_pointer) const noexcept;
    +  [[deprecated("For standard compliance, use at_pointer instead, and prefix your pointers with a slash '/', see RFC6901 ")]]
    +  simdjson_inline simdjson_result at(const std::string_view json_pointer) const noexcept;
    +  simdjson_inline simdjson_result at(size_t index) const noexcept;
    +  simdjson_inline simdjson_result at_key(std::string_view key) const noexcept;
    +  simdjson_inline simdjson_result at_key_case_insensitive(std::string_view key) const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator bool() const noexcept(false);
    +  simdjson_inline explicit operator const char*() const noexcept(false);
    +  simdjson_inline operator std::string_view() const noexcept(false);
    +  simdjson_inline operator uint64_t() const noexcept(false);
    +  simdjson_inline operator int64_t() const noexcept(false);
    +  simdjson_inline operator double() const noexcept(false);
    +  simdjson_inline operator dom::array() const noexcept(false);
    +  simdjson_inline operator dom::object() const noexcept(false);
    +
    +  simdjson_inline dom::array::iterator begin() const noexcept(false);
    +  simdjson_inline dom::array::iterator end() const noexcept(false);
    +#endif // SIMDJSON_EXCEPTIONS
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_DOM_DOCUMENT_H
    +/* end file simdjson/dom/element.h */
    +/* including simdjson/dom/object.h: #include "simdjson/dom/object.h" */
    +/* begin file simdjson/dom/object.h */
    +#ifndef SIMDJSON_DOM_OBJECT_H
    +#define SIMDJSON_DOM_OBJECT_H
    +
    +/* skipped duplicate #include "simdjson/dom/base.h" */
    +/* skipped duplicate #include "simdjson/dom/element.h" */
    +/* skipped duplicate #include "simdjson/internal/tape_ref.h" */
    +
    +namespace simdjson {
    +namespace dom {
    +
    +/**
    + * JSON object.
    + */
    +class object {
    +public:
    +  /** Create a new, invalid object */
    +  simdjson_inline object() noexcept;
    +
    +  class iterator {
    +  public:
    +    using value_type = key_value_pair;
    +    using difference_type = std::ptrdiff_t;
    +
    +    /**
    +     * Get the actual key/value pair
    +     */
    +    inline const value_type operator*() const noexcept;
    +    /**
    +     * Get the next key/value pair.
    +     *
    +     * Part of the std::iterator interface.
    +     *
    +     */
    +    inline iterator& operator++() noexcept;
    +    /**
    +     * Get the next key/value pair.
    +     *
    +     * Part of the std::iterator interface.
    +     *
    +     */
    +    inline iterator operator++(int) noexcept;
    +    /**
    +     * Check if these values come from the same place in the JSON.
    +     *
    +     * Part of the std::iterator interface.
    +     */
    +    inline bool operator!=(const iterator& other) const noexcept;
    +    inline bool operator==(const iterator& other) const noexcept;
    +
    +    inline bool operator<(const iterator& other) const noexcept;
    +    inline bool operator<=(const iterator& other) const noexcept;
    +    inline bool operator>=(const iterator& other) const noexcept;
    +    inline bool operator>(const iterator& other) const noexcept;
    +    /**
    +     * Get the key of this key/value pair.
    +     */
    +    inline std::string_view key() const noexcept;
    +    /**
    +     * Get the length (in bytes) of the key in this key/value pair.
    +     * You should expect this function to be faster than key().size().
    +     */
    +    inline uint32_t key_length() const noexcept;
    +    /**
    +     * Returns true if the key in this key/value pair is equal
    +     * to the provided string_view.
    +     */
    +    inline bool key_equals(std::string_view o) const noexcept;
    +    /**
    +     * Returns true if the key in this key/value pair is equal
    +     * to the provided string_view in a case-insensitive manner.
    +     * Case comparisons may only be handled correctly for ASCII strings.
    +     */
    +    inline bool key_equals_case_insensitive(std::string_view o) const noexcept;
    +    /**
    +     * Get the key of this key/value pair.
    +     */
    +    inline const char *key_c_str() const noexcept;
    +    /**
    +     * Get the value of this key/value pair.
    +     */
    +    inline element value() const noexcept;
    +
    +    iterator() noexcept = default;
    +    iterator(const iterator&) noexcept = default;
    +    iterator& operator=(const iterator&) noexcept = default;
    +  private:
    +    simdjson_inline iterator(const internal::tape_ref &tape) noexcept;
    +
    +    internal::tape_ref tape;
    +
    +    friend class object;
    +  };
    +
    +  /**
    +   * Return the first key/value pair.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  inline iterator begin() const noexcept;
    +  /**
    +   * One past the last key/value pair.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  inline iterator end() const noexcept;
    +  /**
    +   * Get the size of the object (number of keys).
    +   * It is a saturated value with a maximum of 0xFFFFFF: if the value
    +   * is 0xFFFFFF then the size is 0xFFFFFF or greater.
    +   */
    +  inline size_t size() const noexcept;
    +  /**
    +   * Get the value associated with the given key.
    +   *
    +   * The key will be matched against **unescaped** JSON:
    +   *
    +   *   dom::parser parser;
    +   *   int64_t(parser.parse(R"({ "a\n": 1 })"_padded)["a\n"]) == 1
    +   *   parser.parse(R"({ "a\n": 1 })"_padded)["a\\n"].get_uint64().error() == NO_SUCH_FIELD
    +   *
    +   * This function has linear-time complexity: the keys are checked one by one.
    +   *
    +   * @return The value associated with this field, or:
    +   *         - NO_SUCH_FIELD if the field does not exist in the object
    +   *         - INCORRECT_TYPE if this is not an object
    +   */
    +  inline simdjson_result operator[](std::string_view key) const noexcept;
    +
    +  /**
    +   * Get the value associated with the given key.
    +   *
    +   * The key will be matched against **unescaped** JSON:
    +   *
    +   *   dom::parser parser;
    +   *   int64_t(parser.parse(R"({ "a\n": 1 })"_padded)["a\n"]) == 1
    +   *   parser.parse(R"({ "a\n": 1 })"_padded)["a\\n"].get_uint64().error() == NO_SUCH_FIELD
    +   *
    +   * This function has linear-time complexity: the keys are checked one by one.
    +   *
    +   * @return The value associated with this field, or:
    +   *         - NO_SUCH_FIELD if the field does not exist in the object
    +   *         - INCORRECT_TYPE if this is not an object
    +   */
    +  inline simdjson_result operator[](const char *key) const noexcept;
    +
    +  /**
    +   * Get the value associated with the given JSON pointer. We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard, interpreting the current node
    +   * as the root of its own JSON document.
    +   *
    +   *   dom::parser parser;
    +   *   object obj = parser.parse(R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded);
    +   *   obj.at_pointer("/foo/a/1") == 20
    +   *   obj.at_pointer("/foo")["a"].at(1) == 20
    +   *
    +   * It is allowed for a key to be the empty string:
    +   *
    +   *   dom::parser parser;
    +   *   object obj = parser.parse(R"({ "": { "a": [ 10, 20, 30 ] }})"_padded);
    +   *   obj.at_pointer("//a/1") == 20
    +   *   obj.at_pointer("/")["a"].at(1) == 20
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   */
    +  inline simdjson_result at_pointer(std::string_view json_pointer) const noexcept;
    +
    +  /**
    +   * Get the value associated with the given key.
    +   *
    +   * The key will be matched against **unescaped** JSON:
    +   *
    +   *   dom::parser parser;
    +   *   int64_t(parser.parse(R"({ "a\n": 1 })"_padded)["a\n"]) == 1
    +   *   parser.parse(R"({ "a\n": 1 })"_padded)["a\\n"].get_uint64().error() == NO_SUCH_FIELD
    +   *
    +   * This function has linear-time complexity: the keys are checked one by one.
    +   *
    +   * @return The value associated with this field, or:
    +   *         - NO_SUCH_FIELD if the field does not exist in the object
    +   */
    +  inline simdjson_result at_key(std::string_view key) const noexcept;
    +
    +  /**
    +   * Get the value associated with the given key in a case-insensitive manner.
    +   * It is only guaranteed to work over ASCII inputs.
    +   *
    +   * Note: The key will be matched against **unescaped** JSON.
    +   *
    +   * This function has linear-time complexity: the keys are checked one by one.
    +   *
    +   * @return The value associated with this field, or:
    +   *         - NO_SUCH_FIELD if the field does not exist in the object
    +   */
    +  inline simdjson_result at_key_case_insensitive(std::string_view key) const noexcept;
    +
    +private:
    +  simdjson_inline object(const internal::tape_ref &tape) noexcept;
    +
    +  internal::tape_ref tape;
    +
    +  friend class element;
    +  friend struct simdjson_result;
    +  template
    +  friend class simdjson::internal::string_builder;
    +};
    +
    +/**
    + * Key/value pair in an object.
    + */
    +class key_value_pair {
    +public:
    +  /** key in the key-value pair **/
    +  std::string_view key;
    +  /** value in the key-value pair **/
    +  element value;
    +
    +private:
    +  simdjson_inline key_value_pair(std::string_view _key, element _value) noexcept;
    +  friend class object;
    +};
    +
    +} // namespace dom
    +
    +/** The result of a JSON conversion that may fail. */
    +template<>
    +struct simdjson_result : public internal::simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result() noexcept; ///< @private
    +  simdjson_inline simdjson_result(dom::object value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +
    +  inline simdjson_result operator[](std::string_view key) const noexcept;
    +  inline simdjson_result operator[](const char *key) const noexcept;
    +  inline simdjson_result at_pointer(std::string_view json_pointer) const noexcept;
    +  inline simdjson_result at_key(std::string_view key) const noexcept;
    +  inline simdjson_result at_key_case_insensitive(std::string_view key) const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  inline dom::object::iterator begin() const noexcept(false);
    +  inline dom::object::iterator end() const noexcept(false);
    +  inline size_t size() const noexcept(false);
    +#endif // SIMDJSON_EXCEPTIONS
    +};
    +
    +} // namespace simdjson
    +
    +#if defined(__cpp_lib_ranges)
    +#include 
    +
    +namespace std {
    +namespace ranges {
    +template<>
    +inline constexpr bool enable_view = true;
    +#if SIMDJSON_EXCEPTIONS
    +template<>
    +inline constexpr bool enable_view> = true;
    +#endif // SIMDJSON_EXCEPTIONS
    +} // namespace ranges
    +} // namespace std
    +#endif // defined(__cpp_lib_ranges)
    +
    +#endif // SIMDJSON_DOM_OBJECT_H
    +/* end file simdjson/dom/object.h */
    +/* skipped duplicate #include "simdjson/dom/parser.h" */
    +/* including simdjson/dom/serialization.h: #include "simdjson/dom/serialization.h" */
    +/* begin file simdjson/dom/serialization.h */
    +#ifndef SIMDJSON_SERIALIZATION_H
    +#define SIMDJSON_SERIALIZATION_H
    +
    +/* skipped duplicate #include "simdjson/dom/base.h" */
    +/* skipped duplicate #include "simdjson/dom/element.h" */
    +/* skipped duplicate #include "simdjson/dom/object.h" */
    +
    +#include 
    +
    +namespace simdjson {
    +
    +/**
    + * The string_builder template and mini_formatter class
    + * are not part of  our public API and are subject to change
    + * at any time!
    + */
    +namespace internal {
    +
    +template
    +class base_formatter {
    +public:
    +  /** Add a comma **/
    +  simdjson_inline void comma();
    +  /** Start an array, prints [ **/
    +  simdjson_inline void start_array();
    +  /** End an array, prints ] **/
    +  simdjson_inline void end_array();
    +  /** Start an array, prints { **/
    +  simdjson_inline void start_object();
    +  /** Start an array, prints } **/
    +  simdjson_inline void end_object();
    +  /** Prints a true **/
    +  simdjson_inline void true_atom();
    +  /** Prints a false **/
    +  simdjson_inline void false_atom();
    +  /** Prints a null **/
    +  simdjson_inline void null_atom();
    +  /** Prints a number **/
    +  simdjson_inline void number(int64_t x);
    +  /** Prints a number **/
    +  simdjson_inline void number(uint64_t x);
    +  /** Prints a number **/
    +  simdjson_inline void number(double x);
    +  /** Prints a key (string + colon) **/
    +  simdjson_inline void key(std::string_view unescaped);
    +  /** Prints a string. The string is escaped as needed. **/
    +  simdjson_inline void string(std::string_view unescaped);
    +  /** Clears out the content. **/
    +  simdjson_inline void clear();
    +  /**
    +   * Get access to the buffer, it is owned by the instance, but
    +   * the user can make a copy.
    +   **/
    +  simdjson_inline std::string_view str() const;
    +
    +  /** Prints one character **/
    +  simdjson_inline void one_char(char c);
    +
    +  simdjson_inline void call_print_newline() {
    +      this->print_newline();
    +  }
    +
    +  simdjson_inline void call_print_indents(size_t depth) {
    +      this->print_indents(depth);
    +  }
    +
    +  simdjson_inline void call_print_space() {
    +      this->print_space();
    +  }
    +
    +protected:
    +  // implementation details (subject to change)
    +  /** Backing buffer **/
    +  std::vector buffer{}; // not ideal!
    +};
    +
    +
    +/**
    + * @private This is the class that we expect to use with the string_builder
    + * template. It tries to produce a compact version of the JSON element
    + * as quickly as possible.
    + */
    +class mini_formatter : public base_formatter {
    +public:
    +  simdjson_inline void print_newline();
    +
    +  simdjson_inline void print_indents(size_t depth);
    +
    +  simdjson_inline void print_space();
    +};
    +
    +class pretty_formatter : public base_formatter {
    +public:
    +  simdjson_inline void print_newline();
    +
    +  simdjson_inline void print_indents(size_t depth);
    +
    +  simdjson_inline void print_space();
    +
    +protected:
    +  int indent_step = 4;
    +};
    +
    +/**
    + * @private The string_builder template allows us to construct
    + * a string from a document element. It is parametrized
    + * by a "formatter" which handles the details. Thus
    + * the string_builder template could support both minification
    + * and prettification, and various other tradeoffs.
    + */
    +template 
    +class string_builder {
    +public:
    +  /** Construct an initially empty builder, would print the empty string **/
    +  string_builder() = default;
    +  /** Append an element to the builder (to be printed) **/
    +  inline void append(simdjson::dom::element value);
    +  /** Append an array to the builder (to be printed) **/
    +  inline void append(simdjson::dom::array value);
    +  /** Append an object to the builder (to be printed) **/
    +  inline void append(simdjson::dom::object value);
    +  /** Reset the builder (so that it would print the empty string) **/
    +  simdjson_inline void clear();
    +  /**
    +   * Get access to the string. The string_view is owned by the builder
    +   * and it is invalid to use it after the string_builder has been
    +   * destroyed.
    +   * However you can make a copy of the string_view on memory that you
    +   * own.
    +   */
    +  simdjson_inline std::string_view str() const;
    +  /** Append a key_value_pair to the builder (to be printed) **/
    +  simdjson_inline void append(simdjson::dom::key_value_pair value);
    +private:
    +  formatter format{};
    +};
    +
    +} // internal
    +
    +namespace dom {
    +
    +/**
    + * Print JSON to an output stream.
    + *
    + * @param out The output stream.
    + * @param value The element.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::dom::element value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x);
    +#endif
    +/**
    + * Print JSON to an output stream.
    + *
    + * @param out The output stream.
    + * @param value The array.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::dom::array value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x);
    +#endif
    +/**
    + * Print JSON to an output stream.
    + *
    + * @param out The output stream.
    + * @param value The object.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::dom::object value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out,  simdjson::simdjson_result x);
    +#endif
    +} // namespace dom
    +
    +/**
    + * Converts JSON to a string.
    + *
    + *   dom::parser parser;
    + *   element doc = parser.parse("   [ 1 , 2 , 3 ] "_padded);
    + *   cout << to_string(doc) << endl; // prints [1,2,3]
    + *
    + */
    +template 
    +std::string to_string(T x)   {
    +    // in C++, to_string is standard: http://www.cplusplus.com/reference/string/to_string/
    +    // Currently minify and to_string are identical but in the future, they may
    +    // differ.
    +    simdjson::internal::string_builder<> sb;
    +    sb.append(x);
    +    std::string_view answer = sb.str();
    +    return std::string(answer.data(), answer.size());
    +}
    +#if SIMDJSON_EXCEPTIONS
    +template 
    +std::string to_string(simdjson_result x) {
    +    if (x.error()) { throw simdjson_error(x.error()); }
    +    return to_string(x.value());
    +}
    +#endif
    +
    +/**
    + * Minifies a JSON element or document, printing the smallest possible valid JSON.
    + *
    + *   dom::parser parser;
    + *   element doc = parser.parse("   [ 1 , 2 , 3 ] "_padded);
    + *   cout << minify(doc) << endl; // prints [1,2,3]
    + *
    + */
    +template 
    +std::string minify(T x)  {
    +  return to_string(x);
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +template 
    +std::string minify(simdjson_result x) {
    +    if (x.error()) { throw simdjson_error(x.error()); }
    +    return to_string(x.value());
    +}
    +#endif
    +
    +/**
    + * Prettifies a JSON element or document, printing the valid JSON with indentation.
    + *
    + *   dom::parser parser;
    + *   element doc = parser.parse("   [ 1 , 2 , 3 ] "_padded);
    + *
    + *   // Prints:
    + *   // {
    + *   //     [
    + *   //         1,
    + *   //         2,
    + *   //         3
    + *   //     ]
    + *   // }
    + *   cout << prettify(doc) << endl;
    + *
    + */
    +template 
    +std::string prettify(T x)  {
    +    simdjson::internal::string_builder sb;
    +    sb.append(x);
    +    std::string_view answer = sb.str();
    +    return std::string(answer.data(), answer.size());
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +template 
    +std::string prettify(simdjson_result x) {
    +    if (x.error()) { throw simdjson_error(x.error()); }
    +    return to_string(x.value());
    +}
    +#endif
    +
    +} // namespace simdjson
    +
    +
    +#endif
    +/* end file simdjson/dom/serialization.h */
    +
    +// Deprecated API
    +/* including simdjson/dom/jsonparser.h: #include "simdjson/dom/jsonparser.h" */
    +/* begin file simdjson/dom/jsonparser.h */
    +// TODO Remove this -- deprecated API and files
    +
    +#ifndef SIMDJSON_DOM_JSONPARSER_H
    +#define SIMDJSON_DOM_JSONPARSER_H
    +
    +/* skipped duplicate #include "simdjson/dom/base.h" */
    +/* skipped duplicate #include "simdjson/dom/parser.h" */
    +/* skipped duplicate #include "simdjson/dom/element.h" */
    +
    +/* including simdjson/dom/parser-inl.h: #include "simdjson/dom/parser-inl.h" */
    +/* begin file simdjson/dom/parser-inl.h */
    +#ifndef SIMDJSON_PARSER_INL_H
    +#define SIMDJSON_PARSER_INL_H
    +
    +/* skipped duplicate #include "simdjson/dom/base.h" */
    +/* skipped duplicate #include "simdjson/dom/document_stream.h" */
    +/* skipped duplicate #include "simdjson/implementation.h" */
    +/* skipped duplicate #include "simdjson/internal/dom_parser_implementation.h" */
    +
    +/* skipped duplicate #include "simdjson/error-inl.h" */
    +/* skipped duplicate #include "simdjson/padded_string-inl.h" */
    +/* including simdjson/dom/document_stream-inl.h: #include "simdjson/dom/document_stream-inl.h" */
    +/* begin file simdjson/dom/document_stream-inl.h */
    +#ifndef SIMDJSON_DOCUMENT_STREAM_INL_H
    +#define SIMDJSON_DOCUMENT_STREAM_INL_H
    +
    +/* skipped duplicate #include "simdjson/dom/base.h" */
    +/* skipped duplicate #include "simdjson/dom/document_stream.h" */
    +/* including simdjson/dom/element-inl.h: #include "simdjson/dom/element-inl.h" */
    +/* begin file simdjson/dom/element-inl.h */
    +#ifndef SIMDJSON_ELEMENT_INL_H
    +#define SIMDJSON_ELEMENT_INL_H
    +
    +/* skipped duplicate #include "simdjson/dom/base.h" */
    +/* skipped duplicate #include "simdjson/dom/element.h" */
    +/* skipped duplicate #include "simdjson/dom/document.h" */
    +/* skipped duplicate #include "simdjson/dom/object.h" */
    +/* including simdjson/internal/tape_type.h: #include "simdjson/internal/tape_type.h" */
    +/* begin file simdjson/internal/tape_type.h */
    +#ifndef SIMDJSON_INTERNAL_TAPE_TYPE_H
    +#define SIMDJSON_INTERNAL_TAPE_TYPE_H
    +
    +namespace simdjson {
    +namespace internal {
    +
    +/**
    + * The possible types in the tape.
    + */
    +enum class tape_type {
    +  ROOT = 'r',
    +  START_ARRAY = '[',
    +  START_OBJECT = '{',
    +  END_ARRAY = ']',
    +  END_OBJECT = '}',
    +  STRING = '"',
    +  INT64 = 'l',
    +  UINT64 = 'u',
    +  DOUBLE = 'd',
    +  TRUE_VALUE = 't',
    +  FALSE_VALUE = 'f',
    +  NULL_VALUE = 'n'
    +}; // enum class tape_type
    +
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_INTERNAL_TAPE_TYPE_H
    +/* end file simdjson/internal/tape_type.h */
    +
    +/* including simdjson/dom/object-inl.h: #include "simdjson/dom/object-inl.h" */
    +/* begin file simdjson/dom/object-inl.h */
    +#ifndef SIMDJSON_OBJECT_INL_H
    +#define SIMDJSON_OBJECT_INL_H
    +
    +/* skipped duplicate #include "simdjson/dom/base.h" */
    +/* skipped duplicate #include "simdjson/dom/object.h" */
    +/* skipped duplicate #include "simdjson/dom/document.h" */
    +
    +/* skipped duplicate #include "simdjson/dom/element-inl.h" */
    +/* skipped duplicate #include "simdjson/error-inl.h" */
    +
    +#include 
    +
    +namespace simdjson {
    +
    +//
    +// simdjson_result inline implementation
    +//
    +simdjson_inline simdjson_result::simdjson_result() noexcept
    +    : internal::simdjson_result_base() {}
    +simdjson_inline simdjson_result::simdjson_result(dom::object value) noexcept
    +    : internal::simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : internal::simdjson_result_base(error) {}
    +
    +inline simdjson_result simdjson_result::operator[](std::string_view key) const noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +inline simdjson_result simdjson_result::operator[](const char *key) const noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) const noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +inline simdjson_result simdjson_result::at_key(std::string_view key) const noexcept {
    +  if (error()) { return error(); }
    +  return first.at_key(key);
    +}
    +inline simdjson_result simdjson_result::at_key_case_insensitive(std::string_view key) const noexcept {
    +  if (error()) { return error(); }
    +  return first.at_key_case_insensitive(key);
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +inline dom::object::iterator simdjson_result::begin() const noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first.begin();
    +}
    +inline dom::object::iterator simdjson_result::end() const noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first.end();
    +}
    +inline size_t simdjson_result::size() const noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first.size();
    +}
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +namespace dom {
    +
    +//
    +// object inline implementation
    +//
    +simdjson_inline object::object() noexcept : tape{} {}
    +simdjson_inline object::object(const internal::tape_ref &_tape) noexcept : tape{_tape} { }
    +inline object::iterator object::begin() const noexcept {
    +  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
    +  return internal::tape_ref(tape.doc, tape.json_index + 1);
    +}
    +inline object::iterator object::end() const noexcept {
    +  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
    +  return internal::tape_ref(tape.doc, tape.after_element() - 1);
    +}
    +inline size_t object::size() const noexcept {
    +  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
    +  return tape.scope_count();
    +}
    +
    +inline simdjson_result object::operator[](std::string_view key) const noexcept {
    +  return at_key(key);
    +}
    +inline simdjson_result object::operator[](const char *key) const noexcept {
    +  return at_key(key);
    +}
    +inline simdjson_result object::at_pointer(std::string_view json_pointer) const noexcept {
    +  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
    +  if(json_pointer.empty()) { // an empty string means that we return the current node
    +      return element(this->tape); // copy the current node
    +  } else if(json_pointer[0] != '/') { // otherwise there is an error
    +      return INVALID_JSON_POINTER;
    +  }
    +  json_pointer = json_pointer.substr(1);
    +  size_t slash = json_pointer.find('/');
    +  std::string_view key = json_pointer.substr(0, slash);
    +  // Grab the child with the given key
    +  simdjson_result child;
    +
    +  // If there is an escape character in the key, unescape it and then get the child.
    +  size_t escape = key.find('~');
    +  if (escape != std::string_view::npos) {
    +    // Unescape the key
    +    std::string unescaped(key);
    +    do {
    +      switch (unescaped[escape+1]) {
    +        case '0':
    +          unescaped.replace(escape, 2, "~");
    +          break;
    +        case '1':
    +          unescaped.replace(escape, 2, "/");
    +          break;
    +        default:
    +          return INVALID_JSON_POINTER; // "Unexpected ~ escape character in JSON pointer");
    +      }
    +      escape = unescaped.find('~', escape+1);
    +    } while (escape != std::string::npos);
    +    child = at_key(unescaped);
    +  } else {
    +    child = at_key(key);
    +  }
    +  if(child.error()) {
    +    return child; // we do not continue if there was an error
    +  }
    +  // If there is a /, we have to recurse and look up more of the path
    +  if (slash != std::string_view::npos) {
    +    child = child.at_pointer(json_pointer.substr(slash));
    +  }
    +  return child;
    +}
    +
    +inline simdjson_result object::at_key(std::string_view key) const noexcept {
    +  iterator end_field = end();
    +  for (iterator field = begin(); field != end_field; ++field) {
    +    if (field.key_equals(key)) {
    +      return field.value();
    +    }
    +  }
    +  return NO_SUCH_FIELD;
    +}
    +// In case you wonder why we need this, please see
    +// https://github.com/simdjson/simdjson/issues/323
    +// People do seek keys in a case-insensitive manner.
    +inline simdjson_result object::at_key_case_insensitive(std::string_view key) const noexcept {
    +  iterator end_field = end();
    +  for (iterator field = begin(); field != end_field; ++field) {
    +    if (field.key_equals_case_insensitive(key)) {
    +      return field.value();
    +    }
    +  }
    +  return NO_SUCH_FIELD;
    +}
    +
    +//
    +// object::iterator inline implementation
    +//
    +simdjson_inline object::iterator::iterator(const internal::tape_ref &_tape) noexcept : tape{_tape} { }
    +inline const key_value_pair object::iterator::operator*() const noexcept {
    +  return key_value_pair(key(), value());
    +}
    +inline bool object::iterator::operator!=(const object::iterator& other) const noexcept {
    +  return tape.json_index != other.tape.json_index;
    +}
    +inline bool object::iterator::operator==(const object::iterator& other) const noexcept {
    +  return tape.json_index == other.tape.json_index;
    +}
    +inline bool object::iterator::operator<(const object::iterator& other) const noexcept {
    +  return tape.json_index < other.tape.json_index;
    +}
    +inline bool object::iterator::operator<=(const object::iterator& other) const noexcept {
    +  return tape.json_index <= other.tape.json_index;
    +}
    +inline bool object::iterator::operator>=(const object::iterator& other) const noexcept {
    +  return tape.json_index >= other.tape.json_index;
    +}
    +inline bool object::iterator::operator>(const object::iterator& other) const noexcept {
    +  return tape.json_index > other.tape.json_index;
    +}
    +inline object::iterator& object::iterator::operator++() noexcept {
    +  tape.json_index++;
    +  tape.json_index = tape.after_element();
    +  return *this;
    +}
    +inline object::iterator object::iterator::operator++(int) noexcept {
    +  object::iterator out = *this;
    +  ++*this;
    +  return out;
    +}
    +inline std::string_view object::iterator::key() const noexcept {
    +  return tape.get_string_view();
    +}
    +inline uint32_t object::iterator::key_length() const noexcept {
    +  return tape.get_string_length();
    +}
    +inline const char* object::iterator::key_c_str() const noexcept {
    +  return reinterpret_cast(&tape.doc->string_buf[size_t(tape.tape_value()) + sizeof(uint32_t)]);
    +}
    +inline element object::iterator::value() const noexcept {
    +  return element(internal::tape_ref(tape.doc, tape.json_index + 1));
    +}
    +
    +/**
    + * Design notes:
    + * Instead of constructing a string_view and then comparing it with a
    + * user-provided strings, it is probably more performant to have dedicated
    + * functions taking as a parameter the string we want to compare against
    + * and return true when they are equal. That avoids the creation of a temporary
    + * std::string_view. Though it is possible for the compiler to avoid entirely
    + * any overhead due to string_view, relying too much on compiler magic is
    + * problematic: compiler magic sometimes fail, and then what do you do?
    + * Also, enticing users to rely on high-performance function is probably better
    + * on the long run.
    + */
    +
    +inline bool object::iterator::key_equals(std::string_view o) const noexcept {
    +  // We use the fact that the key length can be computed quickly
    +  // without access to the string buffer.
    +  const uint32_t len = key_length();
    +  if(o.size() == len) {
    +    // We avoid construction of a temporary string_view instance.
    +    return (memcmp(o.data(), key_c_str(), len) == 0);
    +  }
    +  return false;
    +}
    +
    +inline bool object::iterator::key_equals_case_insensitive(std::string_view o) const noexcept {
    +  // We use the fact that the key length can be computed quickly
    +  // without access to the string buffer.
    +  const uint32_t len = key_length();
    +  if(o.size() == len) {
    +      // See For case-insensitive string comparisons, avoid char-by-char functions
    +      // https://lemire.me/blog/2020/04/30/for-case-insensitive-string-comparisons-avoid-char-by-char-functions/
    +      // Note that it might be worth rolling our own strncasecmp function, with vectorization.
    +      return (simdjson_strncasecmp(o.data(), key_c_str(), len) == 0);
    +  }
    +  return false;
    +}
    +//
    +// key_value_pair inline implementation
    +//
    +inline key_value_pair::key_value_pair(std::string_view _key, element _value) noexcept :
    +  key(_key), value(_value) {}
    +
    +} // namespace dom
    +
    +} // namespace simdjson
    +
    +#if defined(__cpp_lib_ranges)
    +static_assert(std::ranges::view);
    +static_assert(std::ranges::sized_range);
    +#if SIMDJSON_EXCEPTIONS
    +static_assert(std::ranges::view>);
    +static_assert(std::ranges::sized_range>);
    +#endif // SIMDJSON_EXCEPTIONS
    +#endif // defined(__cpp_lib_ranges)
    +
    +#endif // SIMDJSON_OBJECT_INL_H
    +/* end file simdjson/dom/object-inl.h */
    +/* skipped duplicate #include "simdjson/error-inl.h" */
    +
    +#include 
    +#include 
    +
    +namespace simdjson {
    +
    +//
    +// simdjson_result inline implementation
    +//
    +simdjson_inline simdjson_result::simdjson_result() noexcept
    +    : internal::simdjson_result_base() {}
    +simdjson_inline simdjson_result::simdjson_result(dom::element &&value) noexcept
    +    : internal::simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : internal::simdjson_result_base(error) {}
    +inline simdjson_result simdjson_result::type() const noexcept {
    +  if (error()) { return error(); }
    +  return first.type();
    +}
    +
    +template
    +simdjson_inline bool simdjson_result::is() const noexcept {
    +  return !error() && first.is();
    +}
    +template
    +simdjson_inline simdjson_result simdjson_result::get() const noexcept {
    +  if (error()) { return error(); }
    +  return first.get();
    +}
    +template
    +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &value) const noexcept {
    +  if (error()) { return error(); }
    +  return first.get(value);
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::get_array() const noexcept {
    +  if (error()) { return error(); }
    +  return first.get_array();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_object() const noexcept {
    +  if (error()) { return error(); }
    +  return first.get_object();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_c_str() const noexcept {
    +  if (error()) { return error(); }
    +  return first.get_c_str();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_string_length() const noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string_length();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_string() const noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64() const noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64() const noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double() const noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_bool() const noexcept {
    +  if (error()) { return error(); }
    +  return first.get_bool();
    +}
    +
    +simdjson_inline bool simdjson_result::is_array() const noexcept {
    +  return !error() && first.is_array();
    +}
    +simdjson_inline bool simdjson_result::is_object() const noexcept {
    +  return !error() && first.is_object();
    +}
    +simdjson_inline bool simdjson_result::is_string() const noexcept {
    +  return !error() && first.is_string();
    +}
    +simdjson_inline bool simdjson_result::is_int64() const noexcept {
    +  return !error() && first.is_int64();
    +}
    +simdjson_inline bool simdjson_result::is_uint64() const noexcept {
    +  return !error() && first.is_uint64();
    +}
    +simdjson_inline bool simdjson_result::is_double() const noexcept {
    +  return !error() && first.is_double();
    +}
    +simdjson_inline bool simdjson_result::is_number() const noexcept {
    +  return !error() && first.is_number();
    +}
    +simdjson_inline bool simdjson_result::is_bool() const noexcept {
    +  return !error() && first.is_bool();
    +}
    +
    +simdjson_inline bool simdjson_result::is_null() const noexcept {
    +  return !error() && first.is_null();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) const noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) const noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::at_pointer(const std::string_view json_pointer) const noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +#ifndef SIMDJSON_DISABLE_DEPRECATED_API
    +[[deprecated("For standard compliance, use at_pointer instead, and prefix your pointers with a slash '/', see RFC6901 ")]]
    +simdjson_inline simdjson_result simdjson_result::at(const std::string_view json_pointer) const noexcept {
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_DEPRECATED_WARNING
    +  if (error()) { return error(); }
    +  return first.at(json_pointer);
    +SIMDJSON_POP_DISABLE_WARNINGS
    +}
    +#endif // SIMDJSON_DISABLE_DEPRECATED_API
    +simdjson_inline simdjson_result simdjson_result::at(size_t index) const noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline simdjson_result simdjson_result::at_key(std::string_view key) const noexcept {
    +  if (error()) { return error(); }
    +  return first.at_key(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::at_key_case_insensitive(std::string_view key) const noexcept {
    +  if (error()) { return error(); }
    +  return first.at_key_case_insensitive(key);
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +simdjson_inline simdjson_result::operator bool() const noexcept(false) {
    +  return get();
    +}
    +simdjson_inline simdjson_result::operator const char *() const noexcept(false) {
    +  return get();
    +}
    +simdjson_inline simdjson_result::operator std::string_view() const noexcept(false) {
    +  return get();
    +}
    +simdjson_inline simdjson_result::operator uint64_t() const noexcept(false) {
    +  return get();
    +}
    +simdjson_inline simdjson_result::operator int64_t() const noexcept(false) {
    +  return get();
    +}
    +simdjson_inline simdjson_result::operator double() const noexcept(false) {
    +  return get();
    +}
    +simdjson_inline simdjson_result::operator dom::array() const noexcept(false) {
    +  return get();
    +}
    +simdjson_inline simdjson_result::operator dom::object() const noexcept(false) {
    +  return get();
    +}
    +
    +simdjson_inline dom::array::iterator simdjson_result::begin() const noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first.begin();
    +}
    +simdjson_inline dom::array::iterator simdjson_result::end() const noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first.end();
    +}
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +namespace dom {
    +
    +//
    +// element inline implementation
    +//
    +simdjson_inline element::element() noexcept : tape{} {}
    +simdjson_inline element::element(const internal::tape_ref &_tape) noexcept : tape{_tape} { }
    +
    +inline element_type element::type() const noexcept {
    +  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
    +  auto tape_type = tape.tape_ref_type();
    +  return tape_type == internal::tape_type::FALSE_VALUE ? element_type::BOOL : static_cast(tape_type);
    +}
    +
    +inline simdjson_result element::get_bool() const noexcept {
    +  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
    +  if(tape.is_true()) {
    +    return true;
    +  } else if(tape.is_false()) {
    +    return false;
    +  }
    +  return INCORRECT_TYPE;
    +}
    +inline simdjson_result element::get_c_str() const noexcept {
    +  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
    +  switch (tape.tape_ref_type()) {
    +    case internal::tape_type::STRING: {
    +      return tape.get_c_str();
    +    }
    +    default:
    +      return INCORRECT_TYPE;
    +  }
    +}
    +inline simdjson_result element::get_string_length() const noexcept {
    +  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
    +  switch (tape.tape_ref_type()) {
    +    case internal::tape_type::STRING: {
    +      return tape.get_string_length();
    +    }
    +    default:
    +      return INCORRECT_TYPE;
    +  }
    +}
    +inline simdjson_result element::get_string() const noexcept {
    +  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
    +  switch (tape.tape_ref_type()) {
    +    case internal::tape_type::STRING:
    +      return tape.get_string_view();
    +    default:
    +      return INCORRECT_TYPE;
    +  }
    +}
    +inline simdjson_result element::get_uint64() const noexcept {
    +  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
    +  if(simdjson_unlikely(!tape.is_uint64())) { // branch rarely taken
    +    if(tape.is_int64()) {
    +      int64_t result = tape.next_tape_value();
    +      if (result < 0) {
    +        return NUMBER_OUT_OF_RANGE;
    +      }
    +      return uint64_t(result);
    +    }
    +    return INCORRECT_TYPE;
    +  }
    +  return tape.next_tape_value();
    +}
    +inline simdjson_result element::get_int64() const noexcept {
    +  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
    +  if(simdjson_unlikely(!tape.is_int64())) { // branch rarely taken
    +    if(tape.is_uint64()) {
    +      uint64_t result = tape.next_tape_value();
    +      // Wrapping max in parens to handle Windows issue: https://stackoverflow.com/questions/11544073/how-do-i-deal-with-the-max-macro-in-windows-h-colliding-with-max-in-std
    +      if (result > uint64_t((std::numeric_limits::max)())) {
    +        return NUMBER_OUT_OF_RANGE;
    +      }
    +      return static_cast(result);
    +    }
    +    return INCORRECT_TYPE;
    +  }
    +  return tape.next_tape_value();
    +}
    +inline simdjson_result element::get_double() const noexcept {
    +  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
    +  // Performance considerations:
    +  // 1. Querying tape_ref_type() implies doing a shift, it is fast to just do a straight
    +  //   comparison.
    +  // 2. Using a switch-case relies on the compiler guessing what kind of code generation
    +  //    we want... But the compiler cannot know that we expect the type to be "double"
    +  //    most of the time.
    +  // We can expect get to refer to a double type almost all the time.
    +  // It is important to craft the code accordingly so that the compiler can use this
    +  // information. (This could also be solved with profile-guided optimization.)
    +  if(simdjson_unlikely(!tape.is_double())) { // branch rarely taken
    +    if(tape.is_uint64()) {
    +      return double(tape.next_tape_value());
    +    } else if(tape.is_int64()) {
    +      return double(tape.next_tape_value());
    +    }
    +    return INCORRECT_TYPE;
    +  }
    +  // this is common:
    +  return tape.next_tape_value();
    +}
    +inline simdjson_result element::get_array() const noexcept {
    +  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
    +  switch (tape.tape_ref_type()) {
    +    case internal::tape_type::START_ARRAY:
    +      return array(tape);
    +    default:
    +      return INCORRECT_TYPE;
    +  }
    +}
    +inline simdjson_result element::get_object() const noexcept {
    +  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
    +  switch (tape.tape_ref_type()) {
    +    case internal::tape_type::START_OBJECT:
    +      return object(tape);
    +    default:
    +      return INCORRECT_TYPE;
    +  }
    +}
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code element::get(T &value) const noexcept {
    +  return get().get(value);
    +}
    +// An element-specific version prevents recursion with simdjson_result::get(value)
    +template<>
    +simdjson_warn_unused simdjson_inline error_code element::get(element &value) const noexcept {
    +  value = element(tape);
    +  return SUCCESS;
    +}
    +template
    +inline void element::tie(T &value, error_code &error) && noexcept {
    +  error = get(value);
    +}
    +
    +template
    +simdjson_inline bool element::is() const noexcept {
    +  auto result = get();
    +  return !result.error();
    +}
    +
    +template<> inline simdjson_result element::get() const noexcept { return get_array(); }
    +template<> inline simdjson_result element::get() const noexcept { return get_object(); }
    +template<> inline simdjson_result element::get() const noexcept { return get_c_str(); }
    +template<> inline simdjson_result element::get() const noexcept { return get_string(); }
    +template<> inline simdjson_result element::get() const noexcept { return get_int64(); }
    +template<> inline simdjson_result element::get() const noexcept { return get_uint64(); }
    +template<> inline simdjson_result element::get() const noexcept { return get_double(); }
    +template<> inline simdjson_result element::get() const noexcept { return get_bool(); }
    +
    +inline bool element::is_array() const noexcept { return is(); }
    +inline bool element::is_object() const noexcept { return is(); }
    +inline bool element::is_string() const noexcept { return is(); }
    +inline bool element::is_int64() const noexcept { return is(); }
    +inline bool element::is_uint64() const noexcept { return is(); }
    +inline bool element::is_double() const noexcept { return is(); }
    +inline bool element::is_bool() const noexcept { return is(); }
    +inline bool element::is_number() const noexcept { return is_int64() || is_uint64() || is_double(); }
    +
    +inline bool element::is_null() const noexcept {
    +  return tape.is_null_on_tape();
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +inline element::operator bool() const noexcept(false) { return get(); }
    +inline element::operator const char*() const noexcept(false) { return get(); }
    +inline element::operator std::string_view() const noexcept(false) { return get(); }
    +inline element::operator uint64_t() const noexcept(false) { return get(); }
    +inline element::operator int64_t() const noexcept(false) { return get(); }
    +inline element::operator double() const noexcept(false) { return get(); }
    +inline element::operator array() const noexcept(false) { return get(); }
    +inline element::operator object() const noexcept(false) { return get(); }
    +
    +inline array::iterator element::begin() const noexcept(false) {
    +  return get().begin();
    +}
    +inline array::iterator element::end() const noexcept(false) {
    +  return get().end();
    +}
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +inline simdjson_result element::operator[](std::string_view key) const noexcept {
    +  return at_key(key);
    +}
    +inline simdjson_result element::operator[](const char *key) const noexcept {
    +  return at_key(key);
    +}
    +
    +inline simdjson_result element::at_pointer(std::string_view json_pointer) const noexcept {
    +  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
    +  switch (tape.tape_ref_type()) {
    +    case internal::tape_type::START_OBJECT:
    +      return object(tape).at_pointer(json_pointer);
    +    case internal::tape_type::START_ARRAY:
    +      return array(tape).at_pointer(json_pointer);
    +    default: {
    +      if(!json_pointer.empty()) { // a non-empty string is invalid on an atom
    +        return INVALID_JSON_POINTER;
    +      }
    +      // an empty string means that we return the current node
    +      dom::element copy(*this);
    +      return simdjson_result(std::move(copy));
    +    }
    +  }
    +}
    +#ifndef SIMDJSON_DISABLE_DEPRECATED_API
    +[[deprecated("For standard compliance, use at_pointer instead, and prefix your pointers with a slash '/', see RFC6901 ")]]
    +inline simdjson_result element::at(std::string_view json_pointer) const noexcept {
    +  // version 0.4 of simdjson allowed non-compliant pointers
    +  auto std_pointer = (json_pointer.empty() ? "" : "/") + std::string(json_pointer.begin(), json_pointer.end());
    +  return at_pointer(std_pointer);
    +}
    +#endif // SIMDJSON_DISABLE_DEPRECATED_API
    +
    +inline simdjson_result element::at(size_t index) const noexcept {
    +  return get().at(index);
    +}
    +inline simdjson_result element::at_key(std::string_view key) const noexcept {
    +  return get().at_key(key);
    +}
    +inline simdjson_result element::at_key_case_insensitive(std::string_view key) const noexcept {
    +  return get().at_key_case_insensitive(key);
    +}
    +inline bool element::operator<(const element &other) const noexcept {
    +  return tape.json_index < other.tape.json_index;
    +}
    +inline bool element::operator==(const element &other) const noexcept {
    +  return tape.json_index == other.tape.json_index;
    +}
    +
    +inline bool element::dump_raw_tape(std::ostream &out) const noexcept {
    +  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
    +  return tape.doc->dump_raw_tape(out);
    +}
    +
    +
    +inline std::ostream& operator<<(std::ostream& out, element_type type) {
    +  switch (type) {
    +    case element_type::ARRAY:
    +      return out << "array";
    +    case element_type::OBJECT:
    +      return out << "object";
    +    case element_type::INT64:
    +      return out << "int64_t";
    +    case element_type::UINT64:
    +      return out << "uint64_t";
    +    case element_type::DOUBLE:
    +      return out << "double";
    +    case element_type::STRING:
    +      return out << "string";
    +    case element_type::BOOL:
    +      return out << "bool";
    +    case element_type::NULL_VALUE:
    +      return out << "null";
    +    default:
    +      return out << "unexpected content!!!"; // abort() usage is forbidden in the library
    +  }
    +}
    +
    +} // namespace dom
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ELEMENT_INL_H
    +/* end file simdjson/dom/element-inl.h */
    +/* skipped duplicate #include "simdjson/dom/parser-inl.h" */
    +/* skipped duplicate #include "simdjson/error-inl.h" */
    +/* skipped duplicate #include "simdjson/internal/dom_parser_implementation.h" */
    +
    +namespace simdjson {
    +namespace dom {
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +
    +inline void stage1_worker::finish() {
    +  // After calling "run" someone would call finish() to wait
    +  // for the end of the processing.
    +  // This function will wait until either the thread has done
    +  // the processing or, else, the destructor has been called.
    +  std::unique_lock lock(locking_mutex);
    +  cond_var.wait(lock, [this]{return has_work == false;});
    +}
    +
    +inline stage1_worker::~stage1_worker() {
    +  // The thread may never outlive the stage1_worker instance
    +  // and will always be stopped/joined before the stage1_worker
    +  // instance is gone.
    +  stop_thread();
    +}
    +
    +inline void stage1_worker::start_thread() {
    +  std::unique_lock lock(locking_mutex);
    +  if(thread.joinable()) {
    +    return; // This should never happen but we never want to create more than one thread.
    +  }
    +  thread = std::thread([this]{
    +      while(true) {
    +        std::unique_lock thread_lock(locking_mutex);
    +        // We wait for either "run" or "stop_thread" to be called.
    +        cond_var.wait(thread_lock, [this]{return has_work || !can_work;});
    +        // If, for some reason, the stop_thread() method was called (i.e., the
    +        // destructor of stage1_worker is called, then we want to immediately destroy
    +        // the thread (and not do any more processing).
    +        if(!can_work) {
    +          break;
    +        }
    +        this->owner->stage1_thread_error = this->owner->run_stage1(*this->stage1_thread_parser,
    +              this->_next_batch_start);
    +        this->has_work = false;
    +        // The condition variable call should be moved after thread_lock.unlock() for performance
    +        // reasons but thread sanitizers may report it as a data race if we do.
    +        // See https://stackoverflow.com/questions/35775501/c-should-condition-variable-be-notified-under-lock
    +        cond_var.notify_one(); // will notify "finish"
    +        thread_lock.unlock();
    +      }
    +    }
    +  );
    +}
    +
    +
    +inline void stage1_worker::stop_thread() {
    +  std::unique_lock lock(locking_mutex);
    +  // We have to make sure that all locks can be released.
    +  can_work = false;
    +  has_work = false;
    +  cond_var.notify_all();
    +  lock.unlock();
    +  if(thread.joinable()) {
    +    thread.join();
    +  }
    +}
    +
    +inline void stage1_worker::run(document_stream * ds, dom::parser * stage1, size_t next_batch_start) {
    +  std::unique_lock lock(locking_mutex);
    +  owner = ds;
    +  _next_batch_start = next_batch_start;
    +  stage1_thread_parser = stage1;
    +  has_work = true;
    +  // The condition variable call should be moved after thread_lock.unlock() for performance
    +  // reasons but thread sanitizers may report it as a data race if we do.
    +  // See https://stackoverflow.com/questions/35775501/c-should-condition-variable-be-notified-under-lock
    +  cond_var.notify_one(); // will notify the thread lock that we have work
    +  lock.unlock();
    +}
    +#endif
    +
    +simdjson_inline document_stream::document_stream(
    +  dom::parser &_parser,
    +  const uint8_t *_buf,
    +  size_t _len,
    +  size_t _batch_size
    +) noexcept
    +  : parser{&_parser},
    +    buf{_buf},
    +    len{_len},
    +    batch_size{_batch_size <= MINIMAL_BATCH_SIZE ? MINIMAL_BATCH_SIZE : _batch_size},
    +    error{SUCCESS}
    +#ifdef SIMDJSON_THREADS_ENABLED
    +    , use_thread(_parser.threaded) // we need to make a copy because _parser.threaded can change
    +#endif
    +{
    +#ifdef SIMDJSON_THREADS_ENABLED
    +  if(worker.get() == nullptr) {
    +    error = MEMALLOC;
    +  }
    +#endif
    +}
    +
    +simdjson_inline document_stream::document_stream() noexcept
    +  : parser{nullptr},
    +    buf{nullptr},
    +    len{0},
    +    batch_size{0},
    +    error{UNINITIALIZED}
    +#ifdef SIMDJSON_THREADS_ENABLED
    +    , use_thread(false)
    +#endif
    +{
    +}
    +
    +simdjson_inline document_stream::~document_stream() noexcept {
    +#ifdef SIMDJSON_THREADS_ENABLED
    +  worker.reset();
    +#endif
    +}
    +
    +simdjson_inline document_stream::iterator::iterator() noexcept
    +  : stream{nullptr}, finished{true} {
    +}
    +
    +simdjson_inline document_stream::iterator document_stream::begin() noexcept {
    +  start();
    +  // If there are no documents, we're finished.
    +  return iterator(this, error == EMPTY);
    +}
    +
    +simdjson_inline document_stream::iterator document_stream::end() noexcept {
    +  return iterator(this, true);
    +}
    +
    +simdjson_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept
    +  : stream{_stream}, finished{is_end} {
    +}
    +
    +simdjson_inline document_stream::iterator::reference document_stream::iterator::operator*() noexcept {
    +  // Note that in case of error, we do not yet mark
    +  // the iterator as "finished": this detection is done
    +  // in the operator++ function since it is possible
    +  // to call operator++ repeatedly while omitting
    +  // calls to operator*.
    +  if (stream->error) { return stream->error; }
    +  return stream->parser->doc.root();
    +}
    +
    +simdjson_inline document_stream::iterator& document_stream::iterator::operator++() noexcept {
    +  // If there is an error, then we want the iterator
    +  // to be finished, no matter what. (E.g., we do not
    +  // keep generating documents with errors, or go beyond
    +  // a document with errors.)
    +  //
    +  // Users do not have to call "operator*()" when they use operator++,
    +  // so we need to end the stream in the operator++ function.
    +  //
    +  // Note that setting finished = true is essential otherwise
    +  // we would enter an infinite loop.
    +  if (stream->error) { finished = true; }
    +  // Note that stream->error() is guarded against error conditions
    +  // (it will immediately return if stream->error casts to false).
    +  // In effect, this next function does nothing when (stream->error)
    +  // is true (hence the risk of an infinite loop).
    +  stream->next();
    +  // If that was the last document, we're finished.
    +  // It is the only type of error we do not want to appear
    +  // in operator*.
    +  if (stream->error == EMPTY) { finished = true; }
    +  // If we had any other kind of error (not EMPTY) then we want
    +  // to pass it along to the operator* and we cannot mark the result
    +  // as "finished" just yet.
    +  return *this;
    +}
    +
    +simdjson_inline bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept {
    +  return finished != other.finished;
    +}
    +
    +inline void document_stream::start() noexcept {
    +  if (error) { return; }
    +  error = parser->ensure_capacity(batch_size);
    +  if (error) { return; }
    +  // Always run the first stage 1 parse immediately
    +  batch_start = 0;
    +  error = run_stage1(*parser, batch_start);
    +  while(error == EMPTY) {
    +    // In exceptional cases, we may start with an empty block
    +    batch_start = next_batch_start();
    +    if (batch_start >= len) { return; }
    +    error = run_stage1(*parser, batch_start);
    +  }
    +  if (error) { return; }
    +#ifdef SIMDJSON_THREADS_ENABLED
    +  if (use_thread && next_batch_start() < len) {
    +    // Kick off the first thread if needed
    +    error = stage1_thread_parser.ensure_capacity(batch_size);
    +    if (error) { return; }
    +    worker->start_thread();
    +    start_stage1_thread();
    +    if (error) { return; }
    +  }
    +#endif // SIMDJSON_THREADS_ENABLED
    +  next();
    +}
    +
    +simdjson_inline size_t document_stream::iterator::current_index() const noexcept {
    +  return stream->doc_index;
    +}
    +
    +simdjson_inline std::string_view document_stream::iterator::source() const noexcept {
    +  const char* start = reinterpret_cast(stream->buf) + current_index();
    +  bool object_or_array = ((*start == '[') || (*start == '{'));
    +  if(object_or_array) {
    +    size_t next_doc_index = stream->batch_start + stream->parser->implementation->structural_indexes[stream->parser->implementation->next_structural_index - 1];
    +    return std::string_view(start, next_doc_index - current_index() + 1);
    +  } else {
    +    size_t next_doc_index = stream->batch_start + stream->parser->implementation->structural_indexes[stream->parser->implementation->next_structural_index];
    +    return std::string_view(reinterpret_cast(stream->buf) + current_index(), next_doc_index - current_index() - 1);
    +  }
    +}
    +
    +
    +inline void document_stream::next() noexcept {
    +  // We always exit at once, once in an error condition.
    +  if (error) { return; }
    +
    +  // Load the next document from the batch
    +  doc_index = batch_start + parser->implementation->structural_indexes[parser->implementation->next_structural_index];
    +  error = parser->implementation->stage2_next(parser->doc);
    +  // If that was the last document in the batch, load another batch (if available)
    +  while (error == EMPTY) {
    +    batch_start = next_batch_start();
    +    if (batch_start >= len) { break; }
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +    if(use_thread) {
    +      load_from_stage1_thread();
    +    } else {
    +      error = run_stage1(*parser, batch_start);
    +    }
    +#else
    +    error = run_stage1(*parser, batch_start);
    +#endif
    +    if (error) { continue; } // If the error was EMPTY, we may want to load another batch.
    +    // Run stage 2 on the first document in the batch
    +    doc_index = batch_start + parser->implementation->structural_indexes[parser->implementation->next_structural_index];
    +    error = parser->implementation->stage2_next(parser->doc);
    +  }
    +}
    +inline size_t document_stream::size_in_bytes() const noexcept {
    +  return len;
    +}
    +
    +inline size_t document_stream::truncated_bytes() const noexcept {
    +  if(error == CAPACITY) { return len - batch_start; }
    +  return parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] - parser->implementation->structural_indexes[parser->implementation->n_structural_indexes + 1];
    +}
    +
    +inline size_t document_stream::next_batch_start() const noexcept {
    +  return batch_start + parser->implementation->structural_indexes[parser->implementation->n_structural_indexes];
    +}
    +
    +inline error_code document_stream::run_stage1(dom::parser &p, size_t _batch_start) noexcept {
    +  size_t remaining = len - _batch_start;
    +  if (remaining <= batch_size) {
    +    return p.implementation->stage1(&buf[_batch_start], remaining, stage1_mode::streaming_final);
    +  } else {
    +    return p.implementation->stage1(&buf[_batch_start], batch_size, stage1_mode::streaming_partial);
    +  }
    +}
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +
    +inline void document_stream::load_from_stage1_thread() noexcept {
    +  worker->finish();
    +  // Swap to the parser that was loaded up in the thread. Make sure the parser has
    +  // enough memory to swap to, as well.
    +  std::swap(*parser, stage1_thread_parser);
    +  error = stage1_thread_error;
    +  if (error) { return; }
    +
    +  // If there's anything left, start the stage 1 thread!
    +  if (next_batch_start() < len) {
    +    start_stage1_thread();
    +  }
    +}
    +
    +inline void document_stream::start_stage1_thread() noexcept {
    +  // we call the thread on a lambda that will update
    +  // this->stage1_thread_error
    +  // there is only one thread that may write to this value
    +  // TODO this is NOT exception-safe.
    +  this->stage1_thread_error = UNINITIALIZED; // In case something goes wrong, make sure it's an error
    +  size_t _next_batch_start = this->next_batch_start();
    +
    +  worker->run(this, & this->stage1_thread_parser, _next_batch_start);
    +}
    +
    +#endif // SIMDJSON_THREADS_ENABLED
    +
    +} // namespace dom
    +
    +simdjson_inline simdjson_result::simdjson_result() noexcept
    +  : simdjson_result_base() {
    +}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +  : simdjson_result_base(error) {
    +}
    +simdjson_inline simdjson_result::simdjson_result(dom::document_stream &&value) noexcept
    +  : simdjson_result_base(std::forward(value)) {
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline dom::document_stream::iterator simdjson_result::begin() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first.begin();
    +}
    +simdjson_inline dom::document_stream::iterator simdjson_result::end() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first.end();
    +}
    +#else // SIMDJSON_EXCEPTIONS
    +#ifndef SIMDJSON_DISABLE_DEPRECATED_API
    +simdjson_inline dom::document_stream::iterator simdjson_result::begin() noexcept {
    +  first.error = error();
    +  return first.begin();
    +}
    +simdjson_inline dom::document_stream::iterator simdjson_result::end() noexcept {
    +  first.error = error();
    +  return first.end();
    +}
    +#endif // SIMDJSON_DISABLE_DEPRECATED_API
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +} // namespace simdjson
    +#endif // SIMDJSON_DOCUMENT_STREAM_INL_H
    +/* end file simdjson/dom/document_stream-inl.h */
    +/* skipped duplicate #include "simdjson/dom/element-inl.h" */
    +
    +#include 
    +#include  /* memcmp */
    +
    +namespace simdjson {
    +namespace dom {
    +
    +//
    +// parser inline implementation
    +//
    +simdjson_inline parser::parser(size_t max_capacity) noexcept
    +  : _max_capacity{max_capacity},
    +    loaded_bytes(nullptr) {
    +}
    +simdjson_inline parser::parser(parser &&other) noexcept = default;
    +simdjson_inline parser &parser::operator=(parser &&other) noexcept = default;
    +
    +inline bool parser::is_valid() const noexcept { return valid; }
    +inline int parser::get_error_code() const noexcept { return error; }
    +inline std::string parser::get_error_message() const noexcept { return error_message(error); }
    +
    +inline bool parser::dump_raw_tape(std::ostream &os) const noexcept {
    +  return valid ? doc.dump_raw_tape(os) : false;
    +}
    +
    +inline simdjson_result parser::read_file(const std::string &path) noexcept {
    +  // Open the file
    +  SIMDJSON_PUSH_DISABLE_WARNINGS
    +  SIMDJSON_DISABLE_DEPRECATED_WARNING // Disable CRT_SECURE warning on MSVC: manually verified this is safe
    +  std::FILE *fp = std::fopen(path.c_str(), "rb");
    +  SIMDJSON_POP_DISABLE_WARNINGS
    +
    +  if (fp == nullptr) {
    +    return IO_ERROR;
    +  }
    +
    +  // Get the file size
    +  int ret;
    +#if SIMDJSON_VISUAL_STUDIO && !SIMDJSON_IS_32BITS
    +  ret = _fseeki64(fp, 0, SEEK_END);
    +#else
    +  ret = std::fseek(fp, 0, SEEK_END);
    +#endif // _WIN64
    +  if(ret < 0) {
    +    std::fclose(fp);
    +    return IO_ERROR;
    +  }
    +#if SIMDJSON_VISUAL_STUDIO && !SIMDJSON_IS_32BITS
    +  __int64 len = _ftelli64(fp);
    +  if(len == -1L) {
    +    std::fclose(fp);
    +    return IO_ERROR;
    +  }
    +#else
    +  long len = std::ftell(fp);
    +  if((len < 0) || (len == LONG_MAX)) {
    +    std::fclose(fp);
    +    return IO_ERROR;
    +  }
    +#endif
    +
    +  // Make sure we have enough capacity to load the file
    +  if (_loaded_bytes_capacity < size_t(len)) {
    +    loaded_bytes.reset( internal::allocate_padded_buffer(len) );
    +    if (!loaded_bytes) {
    +      std::fclose(fp);
    +      return MEMALLOC;
    +    }
    +    _loaded_bytes_capacity = len;
    +  }
    +
    +  // Read the string
    +  std::rewind(fp);
    +  size_t bytes_read = std::fread(loaded_bytes.get(), 1, len, fp);
    +  if (std::fclose(fp) != 0 || bytes_read != size_t(len)) {
    +    return IO_ERROR;
    +  }
    +
    +  return bytes_read;
    +}
    +
    +inline simdjson_result parser::load(const std::string &path) & noexcept {
    +  size_t len;
    +  auto _error = read_file(path).get(len);
    +  if (_error) { return _error; }
    +  return parse(loaded_bytes.get(), len, false);
    +}
    +
    +inline simdjson_result parser::load_many(const std::string &path, size_t batch_size) noexcept {
    +  size_t len;
    +  auto _error = read_file(path).get(len);
    +  if (_error) { return _error; }
    +  if(batch_size < MINIMAL_BATCH_SIZE) { batch_size = MINIMAL_BATCH_SIZE; }
    +  return document_stream(*this, reinterpret_cast(loaded_bytes.get()), len, batch_size);
    +}
    +
    +inline simdjson_result parser::parse_into_document(document& provided_doc, const uint8_t *buf, size_t len, bool realloc_if_needed) & noexcept {
    +  // Important: we need to ensure that document has enough capacity.
    +  // Important: It is possible that provided_doc is actually the internal 'doc' within the parser!!!
    +  error_code _error = ensure_capacity(provided_doc, len);
    +  if (_error) { return _error; }
    +  if (realloc_if_needed) {
    +    // Make sure we have enough capacity to copy len bytes
    +    if (!loaded_bytes || _loaded_bytes_capacity < len) {
    +      loaded_bytes.reset( internal::allocate_padded_buffer(len) );
    +      if (!loaded_bytes) {
    +        return MEMALLOC;
    +      }
    +      _loaded_bytes_capacity = len;
    +    }
    +    std::memcpy(static_cast(loaded_bytes.get()), buf, len);
    +    buf = reinterpret_cast(loaded_bytes.get());
    +  }
    +
    +  if((len >= 3) && (std::memcmp(buf, "\xEF\xBB\xBF", 3) == 0)) {
    +    buf += 3;
    +    len -= 3;
    +  }
    +  _error = implementation->parse(buf, len, provided_doc);
    +
    +  if (_error) { return _error; }
    +
    +  return provided_doc.root();
    +}
    +
    +simdjson_inline simdjson_result parser::parse_into_document(document& provided_doc, const char *buf, size_t len, bool realloc_if_needed) & noexcept {
    +  return parse_into_document(provided_doc, reinterpret_cast(buf), len, realloc_if_needed);
    +}
    +simdjson_inline simdjson_result parser::parse_into_document(document& provided_doc, const std::string &s) & noexcept {
    +  return parse_into_document(provided_doc, s.data(), s.length(), s.capacity() - s.length() < SIMDJSON_PADDING);
    +}
    +simdjson_inline simdjson_result parser::parse_into_document(document& provided_doc, const padded_string &s) & noexcept {
    +  return parse_into_document(provided_doc, s.data(), s.length(), false);
    +}
    +
    +
    +inline simdjson_result parser::parse(const uint8_t *buf, size_t len, bool realloc_if_needed) & noexcept {
    +  return parse_into_document(doc, buf, len, realloc_if_needed);
    +}
    +
    +simdjson_inline simdjson_result parser::parse(const char *buf, size_t len, bool realloc_if_needed) & noexcept {
    +  return parse(reinterpret_cast(buf), len, realloc_if_needed);
    +}
    +simdjson_inline simdjson_result parser::parse(const std::string &s) & noexcept {
    +  return parse(s.data(), s.length(), s.capacity() - s.length() < SIMDJSON_PADDING);
    +}
    +simdjson_inline simdjson_result parser::parse(const padded_string &s) & noexcept {
    +  return parse(s.data(), s.length(), false);
    +}
    +simdjson_inline simdjson_result parser::parse(const padded_string_view &v) & noexcept {
    +  return parse(v.data(), v.length(), false);
    +}
    +
    +inline simdjson_result parser::parse_many(const uint8_t *buf, size_t len, size_t batch_size) noexcept {
    +  if(batch_size < MINIMAL_BATCH_SIZE) { batch_size = MINIMAL_BATCH_SIZE; }
    +  if((len >= 3) && (std::memcmp(buf, "\xEF\xBB\xBF", 3) == 0)) {
    +    buf += 3;
    +    len -= 3;
    +  }
    +  return document_stream(*this, buf, len, batch_size);
    +}
    +inline simdjson_result parser::parse_many(const char *buf, size_t len, size_t batch_size) noexcept {
    +  return parse_many(reinterpret_cast(buf), len, batch_size);
    +}
    +inline simdjson_result parser::parse_many(const std::string &s, size_t batch_size) noexcept {
    +  return parse_many(s.data(), s.length(), batch_size);
    +}
    +inline simdjson_result parser::parse_many(const padded_string &s, size_t batch_size) noexcept {
    +  return parse_many(s.data(), s.length(), batch_size);
    +}
    +
    +simdjson_inline size_t parser::capacity() const noexcept {
    +  return implementation ? implementation->capacity() : 0;
    +}
    +simdjson_inline size_t parser::max_capacity() const noexcept {
    +  return _max_capacity;
    +}
    +simdjson_inline size_t parser::max_depth() const noexcept {
    +  return implementation ? implementation->max_depth() : DEFAULT_MAX_DEPTH;
    +}
    +
    +simdjson_warn_unused
    +inline error_code parser::allocate(size_t capacity, size_t max_depth) noexcept {
    +  //
    +  // Reallocate implementation if needed
    +  //
    +  error_code err;
    +  if (implementation) {
    +    err = implementation->allocate(capacity, max_depth);
    +  } else {
    +    err = simdjson::get_active_implementation()->create_dom_parser_implementation(capacity, max_depth, implementation);
    +  }
    +  if (err) { return err; }
    +  return SUCCESS;
    +}
    +
    +#ifndef SIMDJSON_DISABLE_DEPRECATED_API
    +simdjson_warn_unused
    +inline bool parser::allocate_capacity(size_t capacity, size_t max_depth) noexcept {
    +  return !allocate(capacity, max_depth);
    +}
    +#endif // SIMDJSON_DISABLE_DEPRECATED_API
    +
    +inline error_code parser::ensure_capacity(size_t desired_capacity) noexcept {
    +  return ensure_capacity(doc, desired_capacity);
    +}
    +
    +
    +inline error_code parser::ensure_capacity(document& target_document, size_t desired_capacity) noexcept {
    +  // 1. It is wasteful to allocate a document and a parser for documents spanning less than MINIMAL_DOCUMENT_CAPACITY bytes.
    +  // 2. If we allow desired_capacity = 0 then it is possible to exit this function with implementation == nullptr.
    +  if(desired_capacity < MINIMAL_DOCUMENT_CAPACITY) { desired_capacity = MINIMAL_DOCUMENT_CAPACITY; }
    +  // If we don't have enough capacity, (try to) automatically bump it.
    +  // If the document needs allocation, do it too.
    +  // Both in one if statement to minimize unlikely branching.
    +  //
    +  // Note: we must make sure that this function is called if capacity() == 0. We do so because we
    +  // ensure that desired_capacity > 0.
    +  if (simdjson_unlikely(capacity() < desired_capacity || target_document.capacity() < desired_capacity)) {
    +    if (desired_capacity > max_capacity()) {
    +      return error = CAPACITY;
    +    }
    +    error_code err1 = target_document.capacity() < desired_capacity ? target_document.allocate(desired_capacity) : SUCCESS;
    +    error_code err2 = capacity() < desired_capacity ? allocate(desired_capacity, max_depth()) : SUCCESS;
    +    if(err1 != SUCCESS) { return error = err1; }
    +    if(err2 != SUCCESS) { return error = err2; }
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_inline void parser::set_max_capacity(size_t max_capacity) noexcept {
    +  if(max_capacity > MINIMAL_DOCUMENT_CAPACITY) {
    +    _max_capacity = max_capacity;
    +  } else {
    +    _max_capacity = MINIMAL_DOCUMENT_CAPACITY;
    +  }
    +}
    +
    +} // namespace dom
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_PARSER_INL_H
    +/* end file simdjson/dom/parser-inl.h */
    +
    +namespace simdjson {
    +
    +//
    +// C API (json_parse and build_parsed_json) declarations
    +//
    +
    +#ifndef SIMDJSON_DISABLE_DEPRECATED_API
    +[[deprecated("Use parser.parse() instead")]]
    +inline int json_parse(const uint8_t *buf, size_t len, dom::parser &parser, bool realloc_if_needed = true) noexcept {
    +  error_code code = parser.parse(buf, len, realloc_if_needed).error();
    +  // The deprecated json_parse API is a signal that the user plans to *use* the error code / valid
    +  // bits in the parser instead of heeding the result code. The normal parser unsets those in
    +  // anticipation of making the error code ephemeral.
    +  // Here we put the code back into the parser, until we've removed this method.
    +  parser.valid = code == SUCCESS;
    +  parser.error = code;
    +  return code;
    +}
    +[[deprecated("Use parser.parse() instead")]]
    +inline int json_parse(const char *buf, size_t len, dom::parser &parser, bool realloc_if_needed = true) noexcept {
    +  error_code code = parser.parse(buf, len, realloc_if_needed).error();
    +  // The deprecated json_parse API is a signal that the user plans to *use* the error code / valid
    +  // bits in the parser instead of heeding the result code. The normal parser unsets those in
    +  // anticipation of making the error code ephemeral.
    +  // Here we put the code back into the parser, until we've removed this method.
    +  parser.valid = code == SUCCESS;
    +  parser.error = code;
    +  return code;
    +}
    +[[deprecated("Use parser.parse() instead")]]
    +inline int json_parse(const std::string &s, dom::parser &parser, bool realloc_if_needed = true) noexcept {
    +  error_code code = parser.parse(s.data(), s.length(), realloc_if_needed).error();
    +  // The deprecated json_parse API is a signal that the user plans to *use* the error code / valid
    +  // bits in the parser instead of heeding the result code. The normal parser unsets those in
    +  // anticipation of making the error code ephemeral.
    +  // Here we put the code back into the parser, until we've removed this method.
    +  parser.valid = code == SUCCESS;
    +  parser.error = code;
    +  return code;
    +}
    +[[deprecated("Use parser.parse() instead")]]
    +inline int json_parse(const padded_string &s, dom::parser &parser) noexcept {
    +  error_code code = parser.parse(s).error();
    +  // The deprecated json_parse API is a signal that the user plans to *use* the error code / valid
    +  // bits in the parser instead of heeding the result code. The normal parser unsets those in
    +  // anticipation of making the error code ephemeral.
    +  // Here we put the code back into the parser, until we've removed this method.
    +  parser.valid = code == SUCCESS;
    +  parser.error = code;
    +  return code;
    +}
    +
    +[[deprecated("Use parser.parse() instead")]]
    +simdjson_warn_unused inline dom::parser build_parsed_json(const uint8_t *buf, size_t len, bool realloc_if_needed = true) noexcept {
    +  dom::parser parser;
    +  error_code code = parser.parse(buf, len, realloc_if_needed).error();
    +  // The deprecated json_parse API is a signal that the user plans to *use* the error code / valid
    +  // bits in the parser instead of heeding the result code. The normal parser unsets those in
    +  // anticipation of making the error code ephemeral.
    +  // Here we put the code back into the parser, until we've removed this method.
    +  parser.valid = code == SUCCESS;
    +  parser.error = code;
    +  return parser;
    +}
    +[[deprecated("Use parser.parse() instead")]]
    +simdjson_warn_unused inline dom::parser build_parsed_json(const char *buf, size_t len, bool realloc_if_needed = true) noexcept {
    +  dom::parser parser;
    +  error_code code = parser.parse(buf, len, realloc_if_needed).error();
    +  // The deprecated json_parse API is a signal that the user plans to *use* the error code / valid
    +  // bits in the parser instead of heeding the result code. The normal parser unsets those in
    +  // anticipation of making the error code ephemeral.
    +  // Here we put the code back into the parser, until we've removed this method.
    +  parser.valid = code == SUCCESS;
    +  parser.error = code;
    +  return parser;
    +}
    +[[deprecated("Use parser.parse() instead")]]
    +simdjson_warn_unused inline dom::parser build_parsed_json(const std::string &s, bool realloc_if_needed = true) noexcept {
    +  dom::parser parser;
    +  error_code code = parser.parse(s.data(), s.length(), realloc_if_needed).error();
    +  // The deprecated json_parse API is a signal that the user plans to *use* the error code / valid
    +  // bits in the parser instead of heeding the result code. The normal parser unsets those in
    +  // anticipation of making the error code ephemeral.
    +  // Here we put the code back into the parser, until we've removed this method.
    +  parser.valid = code == SUCCESS;
    +  parser.error = code;
    +  return parser;
    +}
    +[[deprecated("Use parser.parse() instead")]]
    +simdjson_warn_unused inline dom::parser build_parsed_json(const padded_string &s) noexcept {
    +  dom::parser parser;
    +  error_code code = parser.parse(s).error();
    +  // The deprecated json_parse API is a signal that the user plans to *use* the error code / valid
    +  // bits in the parser instead of heeding the result code. The normal parser unsets those in
    +  // anticipation of making the error code ephemeral.
    +  // Here we put the code back into the parser, until we've removed this method.
    +  parser.valid = code == SUCCESS;
    +  parser.error = code;
    +  return parser;
    +}
    +#endif // SIMDJSON_DISABLE_DEPRECATED_API
    +
    +/** @private We do not want to allow implicit conversion from C string to std::string. */
    +int json_parse(const char *buf, dom::parser &parser) noexcept = delete;
    +/** @private We do not want to allow implicit conversion from C string to std::string. */
    +dom::parser build_parsed_json(const char *buf) noexcept = delete;
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_DOM_JSONPARSER_H
    +/* end file simdjson/dom/jsonparser.h */
    +/* including simdjson/dom/parsedjson.h: #include "simdjson/dom/parsedjson.h" */
    +/* begin file simdjson/dom/parsedjson.h */
    +// TODO Remove this -- deprecated API and files
    +
    +#ifndef SIMDJSON_DOM_PARSEDJSON_H
    +#define SIMDJSON_DOM_PARSEDJSON_H
    +
    +/* skipped duplicate #include "simdjson/dom/base.h" */
    +
    +namespace simdjson {
    +
    +/**
    + * @deprecated Use `dom::parser` instead.
    + */
    +using ParsedJson [[deprecated("Use dom::parser instead")]] = dom::parser;
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_DOM_PARSEDJSON_H
    +/* end file simdjson/dom/parsedjson.h */
    +/* including simdjson/dom/parsedjson_iterator.h: #include "simdjson/dom/parsedjson_iterator.h" */
    +/* begin file simdjson/dom/parsedjson_iterator.h */
    +// TODO Remove this -- deprecated API and files
    +
    +#ifndef SIMDJSON_DOM_PARSEDJSON_ITERATOR_H
    +#define SIMDJSON_DOM_PARSEDJSON_ITERATOR_H
    +
    +/* skipped duplicate #include "simdjson/dom/base.h" */
    +/* skipped duplicate #include "simdjson/dom/parser.h" */
    +
    +#ifndef SIMDJSON_DISABLE_DEPRECATED_API
    +
    +namespace simdjson {
    +/** @private **/
    +class [[deprecated("Use the new DOM navigation API instead (see doc/basics.md)")]] dom::parser::Iterator {
    +public:
    +  inline Iterator(const dom::parser &parser) noexcept(false);
    +  inline Iterator(const Iterator &o) noexcept;
    +  inline ~Iterator() noexcept;
    +
    +  inline Iterator& operator=(const Iterator&) = delete;
    +
    +  inline bool is_ok() const;
    +
    +  // useful for debugging purposes
    +  inline size_t get_tape_location() const;
    +
    +  // useful for debugging purposes
    +  inline size_t get_tape_length() const;
    +
    +  // returns the current depth (start at 1 with 0 reserved for the fictitious
    +  // root node)
    +  inline size_t get_depth() const;
    +
    +  // A scope is a series of nodes at the same depth, typically it is either an
    +  // object ({) or an array ([). The root node has type 'r'.
    +  inline uint8_t get_scope_type() const;
    +
    +  // move forward in document order
    +  inline bool move_forward();
    +
    +  // retrieve the character code of what we're looking at:
    +  // [{"slutfn are the possibilities
    +  inline uint8_t get_type() const {
    +      return current_type; // short functions should be inlined!
    +  }
    +
    +  // get the int64_t value at this node; valid only if get_type is "l"
    +  inline int64_t get_integer() const;
    +
    +  // get the value as uint64; valid only if  if get_type is "u"
    +  inline uint64_t get_unsigned_integer() const;
    +
    +  // get the string value at this node (NULL ended); valid only if get_type is "
    +  // note that tabs, and line endings are escaped in the returned value (see
    +  // print_with_escapes) return value is valid UTF-8, it may contain NULL chars
    +  // within the string: get_string_length determines the true string length.
    +  inline const char *get_string() const;
    +
    +  // return the length of the string in bytes
    +  inline uint32_t get_string_length() const;
    +
    +  // get the double value at this node; valid only if
    +  // get_type() is "d"
    +  inline double get_double() const;
    +
    +  inline bool is_object_or_array() const { return is_object() || is_array(); }
    +
    +  inline bool is_object() const { return get_type() == '{'; }
    +
    +  inline bool is_array() const { return get_type() == '['; }
    +
    +  inline bool is_string() const { return get_type() == '"'; }
    +
    +  // Returns true if the current type of the node is an signed integer.
    +  // You can get its value with `get_integer()`.
    +  inline bool is_integer() const { return get_type() == 'l'; }
    +
    +  // Returns true if the current type of the node is an unsigned integer.
    +  // You can get its value with `get_unsigned_integer()`.
    +  //
    +  // NOTE:
    +  // Only a large value, which is out of range of a 64-bit signed integer, is
    +  // represented internally as an unsigned node. On the other hand, a typical
    +  // positive integer, such as 1, 42, or 1000000, is as a signed node.
    +  // Be aware this function returns false for a signed node.
    +  inline bool is_unsigned_integer() const { return get_type() == 'u'; }
    +  // Returns true if the current type of the node is a double floating-point number.
    +  inline bool is_double() const { return get_type() == 'd'; }
    +  // Returns true if the current type of the node is a number (integer or floating-point).
    +  inline bool is_number() const {
    +      return is_integer() || is_unsigned_integer() || is_double();
    +  }
    +  // Returns true if the current type of the node is a bool with true value.
    +  inline bool is_true() const { return get_type() == 't'; }
    +  // Returns true if the current type of the node is a bool with false value.
    +  inline bool is_false() const { return get_type() == 'f'; }
    +  // Returns true if the current type of the node is null.
    +  inline bool is_null() const { return get_type() == 'n'; }
    +  // Returns true if the type byte represents an object of an array
    +  static bool is_object_or_array(uint8_t type) {
    +      return ((type == '[') || (type == '{'));
    +  }
    +
    +  // when at {, go one level deep, looking for a given key
    +  // if successful, we are left pointing at the value,
    +  // if not, we are still pointing at the object ({)
    +  // (in case of repeated keys, this only finds the first one).
    +  // We seek the key using C's strcmp so if your JSON strings contain
    +  // NULL chars, this would trigger a false positive: if you expect that
    +  // to be the case, take extra precautions.
    +  // Furthermore, we do the comparison character-by-character
    +  // without taking into account Unicode equivalence.
    +  inline bool move_to_key(const char *key);
    +
    +  // as above, but case insensitive lookup (strcmpi instead of strcmp)
    +  inline bool move_to_key_insensitive(const char *key);
    +
    +  // when at {, go one level deep, looking for a given key
    +  // if successful, we are left pointing at the value,
    +  // if not, we are still pointing at the object ({)
    +  // (in case of repeated keys, this only finds the first one).
    +  // The string we search for can contain NULL values.
    +  // Furthermore, we do the comparison character-by-character
    +  // without taking into account Unicode equivalence.
    +  inline bool move_to_key(const char *key, uint32_t length);
    +
    +  // when at a key location within an object, this moves to the accompanying
    +  // value (located next to it). This is equivalent but much faster than
    +  // calling "next()".
    +  inline void move_to_value();
    +
    +  // when at [, go one level deep, and advance to the given index.
    +  // if successful, we are left pointing at the value,
    +  // if not, we are still pointing at the array ([)
    +  inline bool move_to_index(uint32_t index);
    +
    +  // Moves the iterator to the value corresponding to the json pointer.
    +  // Always search from the root of the document.
    +  // if successful, we are left pointing at the value,
    +  // if not, we are still pointing the same value we were pointing before the
    +  // call. The json pointer follows the rfc6901 standard's syntax:
    +  // https://tools.ietf.org/html/rfc6901 However, the standard says "If a
    +  // referenced member name is not unique in an object, the member that is
    +  // referenced is undefined, and evaluation fails". Here we just return the
    +  // first corresponding value. The length parameter is the length of the
    +  // jsonpointer string ('pointer').
    +  inline bool move_to(const char *pointer, uint32_t length);
    +
    +  // Moves the iterator to the value corresponding to the json pointer.
    +  // Always search from the root of the document.
    +  // if successful, we are left pointing at the value,
    +  // if not, we are still pointing the same value we were pointing before the
    +  // call. The json pointer implementation follows the rfc6901 standard's
    +  // syntax: https://tools.ietf.org/html/rfc6901 However, the standard says
    +  // "If a referenced member name is not unique in an object, the member that
    +  // is referenced is undefined, and evaluation fails". Here we just return
    +  // the first corresponding value.
    +  inline bool move_to(const std::string &pointer);
    +
    +  private:
    +  // Almost the same as move_to(), except it searches from the current
    +  // position. The pointer's syntax is identical, though that case is not
    +  // handled by the rfc6901 standard. The '/' is still required at the
    +  // beginning. However, contrary to move_to(), the URI Fragment Identifier
    +  // Representation is not supported here. Also, in case of failure, we are
    +  // left pointing at the closest value it could reach. For these reasons it
    +  // is private. It exists because it is used by move_to().
    +  inline bool relative_move_to(const char *pointer, uint32_t length);
    +
    +  public:
    +  // throughout return true if we can do the navigation, false
    +  // otherwise
    +
    +  // Within a given scope (series of nodes at the same depth within either an
    +  // array or an object), we move forward.
    +  // Thus, given [true, null, {"a":1}, [1,2]], we would visit true, null, {
    +  // and [. At the object ({) or at the array ([), you can issue a "down" to
    +  // visit their content. valid if we're not at the end of a scope (returns
    +  // true).
    +  inline bool next();
    +
    +  // Within a given scope (series of nodes at the same depth within either an
    +  // array or an object), we move backward.
    +  // Thus, given [true, null, {"a":1}, [1,2]], we would visit ], }, null, true
    +  // when starting at the end of the scope. At the object ({) or at the array
    +  // ([), you can issue a "down" to visit their content.
    +  // Performance warning: This function is implemented by starting again
    +  // from the beginning of the scope and scanning forward. You should expect
    +  // it to be relatively slow.
    +  inline bool prev();
    +
    +  // Moves back to either the containing array or object (type { or [) from
    +  // within a contained scope.
    +  // Valid unless we are at the first level of the document
    +  inline bool up();
    +
    +  // Valid if we're at a [ or { and it starts a non-empty scope; moves us to
    +  // start of that deeper scope if it not empty. Thus, given [true, null,
    +  // {"a":1}, [1,2]], if we are at the { node, we would move to the "a" node.
    +  inline bool down();
    +
    +  // move us to the start of our current scope,
    +  // a scope is a series of nodes at the same level
    +  inline void to_start_scope();
    +
    +  inline void rewind();
    +
    +
    +
    +  // print the node we are currently pointing at
    +  inline bool print(std::ostream &os, bool escape_strings = true) const;
    +
    +  private:
    +  const document &doc;
    +  size_t max_depth{};
    +  size_t depth{};
    +  size_t location{}; // our current location on a tape
    +  size_t tape_length{};
    +  uint8_t current_type{};
    +  uint64_t current_val{};
    +  typedef struct {
    +      size_t start_of_scope;
    +      uint8_t scope_type;
    +  } scopeindex_t;
    +
    +  scopeindex_t *depth_index{};
    +};
    +
    +} // namespace simdjson
    +#endif // SIMDJSON_DISABLE_DEPRECATED_API
    +
    +#endif // SIMDJSON_DOM_PARSEDJSON_ITERATOR_H
    +/* end file simdjson/dom/parsedjson_iterator.h */
    +
    +// Inline functions
    +/* including simdjson/dom/array-inl.h: #include "simdjson/dom/array-inl.h" */
    +/* begin file simdjson/dom/array-inl.h */
    +#ifndef SIMDJSON_ARRAY_INL_H
    +#define SIMDJSON_ARRAY_INL_H
    +
    +#include 
    +
    +/* skipped duplicate #include "simdjson/dom/base.h" */
    +/* skipped duplicate #include "simdjson/dom/array.h" */
    +/* skipped duplicate #include "simdjson/dom/element.h" */
    +/* skipped duplicate #include "simdjson/error-inl.h" */
    +/* including simdjson/internal/tape_ref-inl.h: #include "simdjson/internal/tape_ref-inl.h" */
    +/* begin file simdjson/internal/tape_ref-inl.h */
    +#ifndef SIMDJSON_TAPE_REF_INL_H
    +#define SIMDJSON_TAPE_REF_INL_H
    +
    +/* skipped duplicate #include "simdjson/dom/document.h" */
    +/* skipped duplicate #include "simdjson/internal/tape_ref.h" */
    +/* skipped duplicate #include "simdjson/internal/tape_type.h" */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace internal {
    +
    +constexpr const uint64_t JSON_VALUE_MASK = 0x00FFFFFFFFFFFFFF;
    +constexpr const uint32_t JSON_COUNT_MASK = 0xFFFFFF;
    +
    +//
    +// tape_ref inline implementation
    +//
    +simdjson_inline tape_ref::tape_ref() noexcept : doc{nullptr}, json_index{0} {}
    +simdjson_inline tape_ref::tape_ref(const dom::document *_doc, size_t _json_index) noexcept : doc{_doc}, json_index{_json_index} {}
    +
    +
    +simdjson_inline bool tape_ref::is_document_root() const noexcept {
    +  return json_index == 1; // should we ever change the structure of the tape, this should get updated.
    +}
    +simdjson_inline bool tape_ref::usable() const noexcept {
    +  return doc != nullptr; // when the document pointer is null, this tape_ref is uninitialized (should not be accessed).
    +}
    +// Some value types have a specific on-tape word value. It can be faster
    +// to check the type by doing a word-to-word comparison instead of extracting the
    +// most significant 8 bits.
    +
    +simdjson_inline bool tape_ref::is_double() const noexcept {
    +  constexpr uint64_t tape_double = uint64_t(tape_type::DOUBLE)<<56;
    +  return doc->tape[json_index] == tape_double;
    +}
    +simdjson_inline bool tape_ref::is_int64() const noexcept {
    +  constexpr uint64_t tape_int64 = uint64_t(tape_type::INT64)<<56;
    +  return doc->tape[json_index] == tape_int64;
    +}
    +simdjson_inline bool tape_ref::is_uint64() const noexcept {
    +  constexpr uint64_t tape_uint64 = uint64_t(tape_type::UINT64)<<56;
    +  return doc->tape[json_index] == tape_uint64;
    +}
    +simdjson_inline bool tape_ref::is_false() const noexcept {
    +  constexpr uint64_t tape_false = uint64_t(tape_type::FALSE_VALUE)<<56;
    +  return doc->tape[json_index] == tape_false;
    +}
    +simdjson_inline bool tape_ref::is_true() const noexcept {
    +  constexpr uint64_t tape_true = uint64_t(tape_type::TRUE_VALUE)<<56;
    +  return doc->tape[json_index] == tape_true;
    +}
    +simdjson_inline bool tape_ref::is_null_on_tape() const noexcept {
    +  constexpr uint64_t tape_null = uint64_t(tape_type::NULL_VALUE)<<56;
    +  return doc->tape[json_index] == tape_null;
    +}
    +
    +inline size_t tape_ref::after_element() const noexcept {
    +  switch (tape_ref_type()) {
    +    case tape_type::START_ARRAY:
    +    case tape_type::START_OBJECT:
    +      return matching_brace_index();
    +    case tape_type::UINT64:
    +    case tape_type::INT64:
    +    case tape_type::DOUBLE:
    +      return json_index + 2;
    +    default:
    +      return json_index + 1;
    +  }
    +}
    +simdjson_inline tape_type tape_ref::tape_ref_type() const noexcept {
    +  return static_cast(doc->tape[json_index] >> 56);
    +}
    +simdjson_inline uint64_t internal::tape_ref::tape_value() const noexcept {
    +  return doc->tape[json_index] & internal::JSON_VALUE_MASK;
    +}
    +simdjson_inline uint32_t internal::tape_ref::matching_brace_index() const noexcept {
    +  return uint32_t(doc->tape[json_index]);
    +}
    +simdjson_inline uint32_t internal::tape_ref::scope_count() const noexcept {
    +  return uint32_t((doc->tape[json_index] >> 32) & internal::JSON_COUNT_MASK);
    +}
    +
    +template
    +simdjson_inline T tape_ref::next_tape_value() const noexcept {
    +  static_assert(sizeof(T) == sizeof(uint64_t), "next_tape_value() template parameter must be 64-bit");
    +  // Though the following is tempting...
    +  //  return *reinterpret_cast(&doc->tape[json_index + 1]);
    +  // It is not generally safe. It is safer, and often faster to rely
    +  // on memcpy. Yes, it is uglier, but it is also encapsulated.
    +  T x;
    +  std::memcpy(&x,&doc->tape[json_index + 1],sizeof(uint64_t));
    +  return x;
    +}
    +
    +simdjson_inline uint32_t internal::tape_ref::get_string_length() const noexcept {
    +  size_t string_buf_index = size_t(tape_value());
    +  uint32_t len;
    +  std::memcpy(&len, &doc->string_buf[string_buf_index], sizeof(len));
    +  return len;
    +}
    +
    +simdjson_inline const char * internal::tape_ref::get_c_str() const noexcept {
    +  size_t string_buf_index = size_t(tape_value());
    +  return reinterpret_cast(&doc->string_buf[string_buf_index + sizeof(uint32_t)]);
    +}
    +
    +inline std::string_view internal::tape_ref::get_string_view() const noexcept {
    +  return std::string_view(
    +      get_c_str(),
    +      get_string_length()
    +  );
    +}
    +
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_TAPE_REF_INL_H
    +/* end file simdjson/internal/tape_ref-inl.h */
    +
    +#include 
    +
    +namespace simdjson {
    +
    +//
    +// simdjson_result inline implementation
    +//
    +simdjson_inline simdjson_result::simdjson_result() noexcept
    +    : internal::simdjson_result_base() {}
    +simdjson_inline simdjson_result::simdjson_result(dom::array value) noexcept
    +    : internal::simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : internal::simdjson_result_base(error) {}
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +inline dom::array::iterator simdjson_result::begin() const noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first.begin();
    +}
    +inline dom::array::iterator simdjson_result::end() const noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first.end();
    +}
    +inline size_t simdjson_result::size() const noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first.size();
    +}
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) const noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +inline simdjson_result simdjson_result::at(size_t index) const noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +
    +namespace dom {
    +
    +//
    +// array inline implementation
    +//
    +simdjson_inline array::array() noexcept : tape{} {}
    +simdjson_inline array::array(const internal::tape_ref &_tape) noexcept : tape{_tape} {}
    +inline array::iterator array::begin() const noexcept {
    +  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
    +  return internal::tape_ref(tape.doc, tape.json_index + 1);
    +}
    +inline array::iterator array::end() const noexcept {
    +  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
    +  return internal::tape_ref(tape.doc, tape.after_element() - 1);
    +}
    +inline size_t array::size() const noexcept {
    +  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
    +  return tape.scope_count();
    +}
    +inline size_t array::number_of_slots() const noexcept {
    +  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
    +  return tape.matching_brace_index() - tape.json_index;
    +}
    +inline simdjson_result array::at_pointer(std::string_view json_pointer) const noexcept {
    +  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
    +  if(json_pointer.empty()) { // an empty string means that we return the current node
    +      return element(this->tape); // copy the current node
    +  } else if(json_pointer[0] != '/') { // otherwise there is an error
    +      return INVALID_JSON_POINTER;
    +  }
    +  json_pointer = json_pointer.substr(1);
    +  // - means "the append position" or "the element after the end of the array"
    +  // We don't support this, because we're returning a real element, not a position.
    +  if (json_pointer == "-") { return INDEX_OUT_OF_BOUNDS; }
    +
    +  // Read the array index
    +  size_t array_index = 0;
    +  size_t i;
    +  for (i = 0; i < json_pointer.length() && json_pointer[i] != '/'; i++) {
    +    uint8_t digit = uint8_t(json_pointer[i] - '0');
    +    // Check for non-digit in array index. If it's there, we're trying to get a field in an object
    +    if (digit > 9) { return INCORRECT_TYPE; }
    +    array_index = array_index*10 + digit;
    +  }
    +
    +  // 0 followed by other digits is invalid
    +  if (i > 1 && json_pointer[0] == '0') { return INVALID_JSON_POINTER; } // "JSON pointer array index has other characters after 0"
    +
    +  // Empty string is invalid; so is a "/" with no digits before it
    +  if (i == 0) { return INVALID_JSON_POINTER; } // "Empty string in JSON pointer array index"
    +
    +  // Get the child
    +  auto child = array(tape).at(array_index);
    +  // If there is an error, it ends here
    +  if(child.error()) {
    +    return child;
    +  }
    +  // If there is a /, we're not done yet, call recursively.
    +  if (i < json_pointer.length()) {
    +    child = child.at_pointer(json_pointer.substr(i));
    +  }
    +  return child;
    +}
    +
    +inline simdjson_result array::at(size_t index) const noexcept {
    +  SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914
    +  size_t i=0;
    +  for (auto element : *this) {
    +    if (i == index) { return element; }
    +    i++;
    +  }
    +  return INDEX_OUT_OF_BOUNDS;
    +}
    +
    +//
    +// array::iterator inline implementation
    +//
    +simdjson_inline array::iterator::iterator(const internal::tape_ref &_tape) noexcept : tape{_tape} { }
    +inline element array::iterator::operator*() const noexcept {
    +  return element(tape);
    +}
    +inline array::iterator& array::iterator::operator++() noexcept {
    +  tape.json_index = tape.after_element();
    +  return *this;
    +}
    +inline array::iterator array::iterator::operator++(int) noexcept {
    +  array::iterator out = *this;
    +  ++*this;
    +  return out;
    +}
    +inline bool array::iterator::operator!=(const array::iterator& other) const noexcept {
    +  return tape.json_index != other.tape.json_index;
    +}
    +inline bool array::iterator::operator==(const array::iterator& other) const noexcept {
    +  return tape.json_index == other.tape.json_index;
    +}
    +inline bool array::iterator::operator<(const array::iterator& other) const noexcept {
    +  return tape.json_index < other.tape.json_index;
    +}
    +inline bool array::iterator::operator<=(const array::iterator& other) const noexcept {
    +  return tape.json_index <= other.tape.json_index;
    +}
    +inline bool array::iterator::operator>=(const array::iterator& other) const noexcept {
    +  return tape.json_index >= other.tape.json_index;
    +}
    +inline bool array::iterator::operator>(const array::iterator& other) const noexcept {
    +  return tape.json_index > other.tape.json_index;
    +}
    +
    +} // namespace dom
    +
    +
    +} // namespace simdjson
    +
    +/* skipped duplicate #include "simdjson/dom/element-inl.h" */
    +
    +#if defined(__cpp_lib_ranges)
    +static_assert(std::ranges::view);
    +static_assert(std::ranges::sized_range);
    +#if SIMDJSON_EXCEPTIONS
    +static_assert(std::ranges::view>);
    +static_assert(std::ranges::sized_range>);
    +#endif // SIMDJSON_EXCEPTIONS
    +#endif // defined(__cpp_lib_ranges)
    +
    +#endif // SIMDJSON_ARRAY_INL_H
    +/* end file simdjson/dom/array-inl.h */
    +/* skipped duplicate #include "simdjson/dom/document_stream-inl.h" */
    +/* including simdjson/dom/document-inl.h: #include "simdjson/dom/document-inl.h" */
    +/* begin file simdjson/dom/document-inl.h */
    +#ifndef SIMDJSON_DOCUMENT_INL_H
    +#define SIMDJSON_DOCUMENT_INL_H
    +
    +// Inline implementations go in here.
    +
    +/* skipped duplicate #include "simdjson/dom/base.h" */
    +/* skipped duplicate #include "simdjson/dom/document.h" */
    +/* skipped duplicate #include "simdjson/dom/element-inl.h" */
    +/* skipped duplicate #include "simdjson/internal/tape_ref-inl.h" */
    +/* including simdjson/internal/jsonformatutils.h: #include "simdjson/internal/jsonformatutils.h" */
    +/* begin file simdjson/internal/jsonformatutils.h */
    +#ifndef SIMDJSON_INTERNAL_JSONFORMATUTILS_H
    +#define SIMDJSON_INTERNAL_JSONFORMATUTILS_H
    +
    +/* skipped duplicate #include "simdjson/base.h" */
    +#include 
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace internal {
    +
    +inline std::ostream& operator<<(std::ostream& out, const escape_json_string &str);
    +
    +class escape_json_string {
    +public:
    +  escape_json_string(std::string_view _str) noexcept : str{_str} {}
    +  operator std::string() const noexcept { std::stringstream s; s << *this; return s.str(); }
    +private:
    +  std::string_view str;
    +  friend std::ostream& operator<<(std::ostream& out, const escape_json_string &unescaped);
    +};
    +
    +inline std::ostream& operator<<(std::ostream& out, const escape_json_string &unescaped) {
    +  for (size_t i=0; i(unescaped.str[i]) <= 0x1F) {
    +        // TODO can this be done once at the beginning, or will it mess up << char?
    +        std::ios::fmtflags f(out.flags());
    +        out << "\\u" << std::hex << std::setw(4) << std::setfill('0') << int(unescaped.str[i]);
    +        out.flags(f);
    +      } else {
    +        out << unescaped.str[i];
    +      }
    +    }
    +  }
    +  return out;
    +}
    +
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_INTERNAL_JSONFORMATUTILS_H
    +/* end file simdjson/internal/jsonformatutils.h */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace dom {
    +
    +//
    +// document inline implementation
    +//
    +inline element document::root() const noexcept {
    +  return element(internal::tape_ref(this, 1));
    +}
    +simdjson_warn_unused
    +inline size_t document::capacity() const noexcept {
    +  return allocated_capacity;
    +}
    +
    +simdjson_warn_unused
    +inline error_code document::allocate(size_t capacity) noexcept {
    +  if (capacity == 0) {
    +    string_buf.reset();
    +    tape.reset();
    +    allocated_capacity = 0;
    +    return SUCCESS;
    +  }
    +
    +  // a pathological input like "[[[[..." would generate capacity tape elements, so
    +  // need a capacity of at least capacity + 1, but it is also possible to do
    +  // worse with "[7,7,7,7,6,7,7,7,6,7,7,6,[7,7,7,7,6,7,7,7,6,7,7,6,7,7,7,7,7,7,6"
    +  //where capacity + 1 tape elements are
    +  // generated, see issue https://github.com/simdjson/simdjson/issues/345
    +  size_t tape_capacity = SIMDJSON_ROUNDUP_N(capacity + 3, 64);
    +  // a document with only zero-length strings... could have capacity/3 string
    +  // and we would need capacity/3 * 5 bytes on the string buffer
    +  size_t string_capacity = SIMDJSON_ROUNDUP_N(5 * capacity / 3 + SIMDJSON_PADDING, 64);
    +  string_buf.reset( new (std::nothrow) uint8_t[string_capacity]);
    +  tape.reset(new (std::nothrow) uint64_t[tape_capacity]);
    +  if(!(string_buf && tape)) {
    +    allocated_capacity = 0;
    +    string_buf.reset();
    +    tape.reset();
    +    return MEMALLOC;
    +  }
    +  // Technically the allocated_capacity might be larger than capacity
    +  // so the next line is pessimistic.
    +  allocated_capacity = capacity;
    +  return SUCCESS;
    +}
    +
    +inline bool document::dump_raw_tape(std::ostream &os) const noexcept {
    +  uint32_t string_length;
    +  size_t tape_idx = 0;
    +  uint64_t tape_val = tape[tape_idx];
    +  uint8_t type = uint8_t(tape_val >> 56);
    +  os << tape_idx << " : " << type;
    +  tape_idx++;
    +  size_t how_many = 0;
    +  if (type == 'r') {
    +    how_many = size_t(tape_val & internal::JSON_VALUE_MASK);
    +  } else {
    +    // Error: no starting root node?
    +    return false;
    +  }
    +  os << "\t// pointing to " << how_many << " (right after last node)\n";
    +  uint64_t payload;
    +  for (; tape_idx < how_many; tape_idx++) {
    +    os << tape_idx << " : ";
    +    tape_val = tape[tape_idx];
    +    payload = tape_val & internal::JSON_VALUE_MASK;
    +    type = uint8_t(tape_val >> 56);
    +    switch (type) {
    +    case '"': // we have a string
    +      os << "string \"";
    +      std::memcpy(&string_length, string_buf.get() + payload, sizeof(uint32_t));
    +      os << internal::escape_json_string(std::string_view(
    +        reinterpret_cast(string_buf.get() + payload + sizeof(uint32_t)),
    +        string_length
    +      ));
    +      os << '"';
    +      os << '\n';
    +      break;
    +    case 'l': // we have a long int
    +      if (tape_idx + 1 >= how_many) {
    +        return false;
    +      }
    +      os << "integer " << static_cast(tape[++tape_idx]) << "\n";
    +      break;
    +    case 'u': // we have a long uint
    +      if (tape_idx + 1 >= how_many) {
    +        return false;
    +      }
    +      os << "unsigned integer " << tape[++tape_idx] << "\n";
    +      break;
    +    case 'd': // we have a double
    +      os << "float ";
    +      if (tape_idx + 1 >= how_many) {
    +        return false;
    +      }
    +      double answer;
    +      std::memcpy(&answer, &tape[++tape_idx], sizeof(answer));
    +      os << answer << '\n';
    +      break;
    +    case 'n': // we have a null
    +      os << "null\n";
    +      break;
    +    case 't': // we have a true
    +      os << "true\n";
    +      break;
    +    case 'f': // we have a false
    +      os << "false\n";
    +      break;
    +    case '{': // we have an object
    +      os << "{\t// pointing to next tape location " << uint32_t(payload)
    +         << " (first node after the scope), "
    +         << " saturated count "
    +         << ((payload >> 32) & internal::JSON_COUNT_MASK)<< "\n";
    +      break;    case '}': // we end an object
    +      os << "}\t// pointing to previous tape location " << uint32_t(payload)
    +         << " (start of the scope)\n";
    +      break;
    +    case '[': // we start an array
    +      os << "[\t// pointing to next tape location " << uint32_t(payload)
    +         << " (first node after the scope), "
    +         << " saturated count "
    +         << ((payload >> 32) & internal::JSON_COUNT_MASK)<< "\n";
    +      break;
    +    case ']': // we end an array
    +      os << "]\t// pointing to previous tape location " << uint32_t(payload)
    +         << " (start of the scope)\n";
    +      break;
    +    case 'r': // we start and end with the root node
    +      // should we be hitting the root node?
    +      return false;
    +    default:
    +      return false;
    +    }
    +  }
    +  tape_val = tape[tape_idx];
    +  payload = tape_val & internal::JSON_VALUE_MASK;
    +  type = uint8_t(tape_val >> 56);
    +  os << tape_idx << " : " << type << "\t// pointing to " << payload
    +     << " (start root)\n";
    +  return true;
    +}
    +
    +} // namespace dom
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_DOCUMENT_INL_H
    +/* end file simdjson/dom/document-inl.h */
    +/* skipped duplicate #include "simdjson/dom/element-inl.h" */
    +/* skipped duplicate #include "simdjson/dom/object-inl.h" */
    +/* including simdjson/dom/parsedjson_iterator-inl.h: #include "simdjson/dom/parsedjson_iterator-inl.h" */
    +/* begin file simdjson/dom/parsedjson_iterator-inl.h */
    +#ifndef SIMDJSON_PARSEDJSON_ITERATOR_INL_H
    +#define SIMDJSON_PARSEDJSON_ITERATOR_INL_H
    +
    +/* skipped duplicate #include "simdjson/dom/base.h" */
    +/* skipped duplicate #include "simdjson/dom/parsedjson_iterator.h" */
    +/* skipped duplicate #include "simdjson/internal/jsonformatutils.h" */
    +
    +/* skipped duplicate #include "simdjson/dom/parser-inl.h" */
    +/* skipped duplicate #include "simdjson/internal/tape_ref-inl.h" */
    +
    +#include 
    +#include 
    +#include 
    +#include 
    +
    +#ifndef SIMDJSON_DISABLE_DEPRECATED_API
    +
    +namespace simdjson {
    +
    +// VS2017 reports deprecated warnings when you define a deprecated class's methods.
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_DEPRECATED_WARNING
    +
    +// Because of template weirdness, the actual class definition is inline in the document class
    +simdjson_warn_unused bool dom::parser::Iterator::is_ok() const {
    +  return location < tape_length;
    +}
    +
    +// useful for debugging purposes
    +size_t dom::parser::Iterator::get_tape_location() const {
    +  return location;
    +}
    +
    +// useful for debugging purposes
    +size_t dom::parser::Iterator::get_tape_length() const {
    +  return tape_length;
    +}
    +
    +// returns the current depth (start at 1 with 0 reserved for the fictitious root
    +// node)
    +size_t dom::parser::Iterator::get_depth() const {
    +  return depth;
    +}
    +
    +// A scope is a series of nodes at the same depth, typically it is either an
    +// object ({) or an array ([). The root node has type 'r'.
    +uint8_t dom::parser::Iterator::get_scope_type() const {
    +  return depth_index[depth].scope_type;
    +}
    +
    +bool dom::parser::Iterator::move_forward() {
    +  if (location + 1 >= tape_length) {
    +    return false; // we are at the end!
    +  }
    +
    +  if ((current_type == '[') || (current_type == '{')) {
    +    // We are entering a new scope
    +    depth++;
    +    assert(depth < max_depth);
    +    depth_index[depth].start_of_scope = location;
    +    depth_index[depth].scope_type = current_type;
    +  } else if ((current_type == ']') || (current_type == '}')) {
    +    // Leaving a scope.
    +    depth--;
    +  } else if (is_number()) {
    +    // these types use 2 locations on the tape, not just one.
    +    location += 1;
    +  }
    +
    +  location += 1;
    +  current_val = doc.tape[location];
    +  current_type = uint8_t(current_val >> 56);
    +  return true;
    +}
    +
    +void dom::parser::Iterator::move_to_value() {
    +  // assume that we are on a key, so move by 1.
    +  location += 1;
    +  current_val = doc.tape[location];
    +  current_type = uint8_t(current_val >> 56);
    +}
    +
    +bool dom::parser::Iterator::move_to_key(const char *key) {
    +    if (down()) {
    +      do {
    +        const bool right_key = (strcmp(get_string(), key) == 0);
    +        move_to_value();
    +        if (right_key) {
    +          return true;
    +        }
    +      } while (next());
    +      up();
    +    }
    +    return false;
    +}
    +
    +bool dom::parser::Iterator::move_to_key_insensitive(
    +    const char *key) {
    +    if (down()) {
    +      do {
    +        const bool right_key = (simdjson_strcasecmp(get_string(), key) == 0);
    +        move_to_value();
    +        if (right_key) {
    +          return true;
    +        }
    +      } while (next());
    +      up();
    +    }
    +    return false;
    +}
    +
    +bool dom::parser::Iterator::move_to_key(const char *key,
    +                                                       uint32_t length) {
    +  if (down()) {
    +    do {
    +      bool right_key = ((get_string_length() == length) &&
    +                        (memcmp(get_string(), key, length) == 0));
    +      move_to_value();
    +      if (right_key) {
    +        return true;
    +      }
    +    } while (next());
    +    up();
    +  }
    +  return false;
    +}
    +
    +bool dom::parser::Iterator::move_to_index(uint32_t index) {
    +  if (down()) {
    +    uint32_t i = 0;
    +    for (; i < index; i++) {
    +      if (!next()) {
    +        break;
    +      }
    +    }
    +    if (i == index) {
    +      return true;
    +    }
    +    up();
    +  }
    +  return false;
    +}
    +
    +bool dom::parser::Iterator::prev() {
    +  size_t target_location = location;
    +  to_start_scope();
    +  size_t npos = location;
    +  if (target_location == npos) {
    +    return false; // we were already at the start
    +  }
    +  size_t oldnpos;
    +  // we have that npos < target_location here
    +  do {
    +    oldnpos = npos;
    +    if ((current_type == '[') || (current_type == '{')) {
    +      // we need to jump
    +      npos = uint32_t(current_val);
    +    } else {
    +      npos = npos + ((current_type == 'd' || current_type == 'l') ? 2 : 1);
    +    }
    +  } while (npos < target_location);
    +  location = oldnpos;
    +  current_val = doc.tape[location];
    +  current_type = uint8_t(current_val >> 56);
    +  return true;
    +}
    +
    +bool dom::parser::Iterator::up() {
    +  if (depth == 1) {
    +    return false; // don't allow moving back to root
    +  }
    +  to_start_scope();
    +  // next we just move to the previous value
    +  depth--;
    +  location -= 1;
    +  current_val = doc.tape[location];
    +  current_type = uint8_t(current_val >> 56);
    +  return true;
    +}
    +
    +bool dom::parser::Iterator::down() {
    +  if (location + 1 >= tape_length) {
    +    return false;
    +  }
    +  if ((current_type == '[') || (current_type == '{')) {
    +    size_t npos = uint32_t(current_val);
    +    if (npos == location + 2) {
    +      return false; // we have an empty scope
    +    }
    +    depth++;
    +    assert(depth < max_depth);
    +    location = location + 1;
    +    depth_index[depth].start_of_scope = location;
    +    depth_index[depth].scope_type = current_type;
    +    current_val = doc.tape[location];
    +    current_type = uint8_t(current_val >> 56);
    +    return true;
    +  }
    +  return false;
    +}
    +
    +void dom::parser::Iterator::to_start_scope() {
    +  location = depth_index[depth].start_of_scope;
    +  current_val = doc.tape[location];
    +  current_type = uint8_t(current_val >> 56);
    +}
    +
    +inline void dom::parser::Iterator::rewind() {
    +    while (up())
    +    ;
    +}
    +
    +
    +bool dom::parser::Iterator::next() {
    +  size_t npos;
    +  if ((current_type == '[') || (current_type == '{')) {
    +    // we need to jump
    +    npos = uint32_t(current_val);
    +  } else {
    +    npos = location + (is_number() ? 2 : 1);
    +  }
    +  uint64_t next_val = doc.tape[npos];
    +  uint8_t next_type = uint8_t(next_val >> 56);
    +  if ((next_type == ']') || (next_type == '}')) {
    +    return false; // we reached the end of the scope
    +  }
    +  location = npos;
    +  current_val = next_val;
    +  current_type = next_type;
    +  return true;
    +}
    +dom::parser::Iterator::Iterator(const dom::parser &pj) noexcept(false)
    +    : doc(pj.doc)
    +{
    +#if SIMDJSON_EXCEPTIONS
    +  if (!pj.valid) { throw simdjson_error(pj.error); }
    +#else
    +  if (!pj.valid) { return; } //  abort() usage is forbidden in the library
    +#endif
    +
    +  max_depth = pj.max_depth();
    +  depth_index = new scopeindex_t[max_depth + 1];
    +  depth_index[0].start_of_scope = location;
    +  current_val = doc.tape[location++];
    +  current_type = uint8_t(current_val >> 56);
    +  depth_index[0].scope_type = current_type;
    +  tape_length = size_t(current_val & internal::JSON_VALUE_MASK);
    +  if (location < tape_length) {
    +    // If we make it here, then depth_capacity must >=2, but the compiler
    +    // may not know this.
    +    current_val = doc.tape[location];
    +    current_type = uint8_t(current_val >> 56);
    +    depth++;
    +    assert(depth < max_depth);
    +    depth_index[depth].start_of_scope = location;
    +    depth_index[depth].scope_type = current_type;
    +  }
    +}
    +dom::parser::Iterator::Iterator(
    +    const dom::parser::Iterator &o) noexcept
    +    : doc(o.doc),
    +    max_depth(o.depth),
    +    depth(o.depth),
    +    location(o.location),
    +    tape_length(o.tape_length),
    +    current_type(o.current_type),
    +    current_val(o.current_val)
    +{
    +  depth_index = new scopeindex_t[max_depth+1];
    +  std::memcpy(depth_index, o.depth_index, (depth + 1) * sizeof(depth_index[0]));
    +}
    +
    +dom::parser::Iterator::~Iterator() noexcept {
    +  if (depth_index) { delete[] depth_index; }
    +}
    +
    +bool dom::parser::Iterator::print(std::ostream &os, bool escape_strings) const {
    +  if (!is_ok()) {
    +    return false;
    +  }
    +  switch (current_type) {
    +  case '"': // we have a string
    +    os << '"';
    +    if (escape_strings) {
    +      os << internal::escape_json_string(std::string_view(get_string(), get_string_length()));
    +    } else {
    +      // was: os << get_string();, but given that we can include null chars, we
    +      // have to do something crazier:
    +      std::copy(get_string(), get_string() + get_string_length(), std::ostream_iterator(os));
    +    }
    +    os << '"';
    +    break;
    +  case 'l': // we have a long int
    +    os << get_integer();
    +    break;
    +  case 'u':
    +    os << get_unsigned_integer();
    +    break;
    +  case 'd':
    +    os << get_double();
    +    break;
    +  case 'n': // we have a null
    +    os << "null";
    +    break;
    +  case 't': // we have a true
    +    os << "true";
    +    break;
    +  case 'f': // we have a false
    +    os << "false";
    +    break;
    +  case '{': // we have an object
    +  case '}': // we end an object
    +  case '[': // we start an array
    +  case ']': // we end an array
    +    os << char(current_type);
    +    break;
    +  default:
    +    return false;
    +  }
    +  return true;
    +}
    +
    +bool dom::parser::Iterator::move_to(const char *pointer,
    +                                                   uint32_t length) {
    +  char *new_pointer = nullptr;
    +  if (pointer[0] == '#') {
    +    // Converting fragment representation to string representation
    +    new_pointer = new char[length];
    +    uint32_t new_length = 0;
    +    for (uint32_t i = 1; i < length; i++) {
    +      if (pointer[i] == '%' && pointer[i + 1] == 'x') {
    +#if __cpp_exceptions
    +        try {
    +#endif
    +          int fragment =
    +              std::stoi(std::string(&pointer[i + 2], 2), nullptr, 16);
    +          if (fragment == '\\' || fragment == '"' || (fragment <= 0x1F)) {
    +            // escaping the character
    +            new_pointer[new_length] = '\\';
    +            new_length++;
    +          }
    +          new_pointer[new_length] = char(fragment);
    +          i += 3;
    +#if __cpp_exceptions
    +        } catch (std::invalid_argument &) {
    +          delete[] new_pointer;
    +          return false; // the fragment is invalid
    +        }
    +#endif
    +      } else {
    +        new_pointer[new_length] = pointer[i];
    +      }
    +      new_length++;
    +    }
    +    length = new_length;
    +    pointer = new_pointer;
    +  }
    +
    +  // saving the current state
    +  size_t depth_s = depth;
    +  size_t location_s = location;
    +  uint8_t current_type_s = current_type;
    +  uint64_t current_val_s = current_val;
    +
    +  rewind(); // The json pointer is used from the root of the document.
    +
    +  bool found = relative_move_to(pointer, length);
    +  delete[] new_pointer;
    +
    +  if (!found) {
    +    // since the pointer has found nothing, we get back to the original
    +    // position.
    +    depth = depth_s;
    +    location = location_s;
    +    current_type = current_type_s;
    +    current_val = current_val_s;
    +  }
    +
    +  return found;
    +}
    +
    +inline bool dom::parser::Iterator::move_to(const std::string &pointer) {
    +  return move_to(pointer.c_str(), uint32_t(pointer.length()));
    +}
    +
    +inline int64_t dom::parser::Iterator::get_integer() const {
    +    if (location + 1 >= tape_length) {
    +    return 0; // default value in case of error
    +    }
    +    return static_cast(doc.tape[location + 1]);
    +}
    +
    +inline uint64_t dom::parser::Iterator::get_unsigned_integer() const {
    +    if (location + 1 >= tape_length) {
    +    return 0; // default value in case of error
    +    }
    +    return doc.tape[location + 1];
    +}
    +
    +inline const char * dom::parser::Iterator::get_string() const {
    +    return reinterpret_cast(
    +        doc.string_buf.get() + (current_val & internal::JSON_VALUE_MASK) + sizeof(uint32_t));
    +}
    +
    +inline uint32_t dom::parser::Iterator::get_string_length() const {
    +    uint32_t answer;
    +    std::memcpy(&answer,
    +        reinterpret_cast(doc.string_buf.get() +
    +                                        (current_val & internal::JSON_VALUE_MASK)),
    +        sizeof(uint32_t));
    +    return answer;
    +}
    +
    +inline double dom::parser::Iterator::get_double() const {
    +    if (location + 1 >= tape_length) {
    +    return std::numeric_limits::quiet_NaN(); // default value in
    +                                                    // case of error
    +    }
    +    double answer;
    +    std::memcpy(&answer, &doc.tape[location + 1], sizeof(answer));
    +    return answer;
    +}
    +
    +bool dom::parser::Iterator::relative_move_to(const char *pointer,
    +                                                            uint32_t length) {
    +  if (length == 0) {
    +    // returns the whole document
    +    return true;
    +  }
    +
    +  if (pointer[0] != '/') {
    +    // '/' must be the first character
    +    return false;
    +  }
    +
    +  // finding the key in an object or the index in an array
    +  std::string key_or_index;
    +  uint32_t offset = 1;
    +
    +  // checking for the "-" case
    +  if (is_array() && pointer[1] == '-') {
    +    if (length != 2) {
    +      // the pointer must be exactly "/-"
    +      // there can't be anything more after '-' as an index
    +      return false;
    +    }
    +    key_or_index = '-';
    +    offset = length; // will skip the loop coming right after
    +  }
    +
    +  // We either transform the first reference token to a valid json key
    +  // or we make sure it is a valid index in an array.
    +  for (; offset < length; offset++) {
    +    if (pointer[offset] == '/') {
    +      // beginning of the next key or index
    +      break;
    +    }
    +    if (is_array() && (pointer[offset] < '0' || pointer[offset] > '9')) {
    +      // the index of an array must be an integer
    +      // we also make sure std::stoi won't discard whitespaces later
    +      return false;
    +    }
    +    if (pointer[offset] == '~') {
    +      // "~1" represents "/"
    +      if (pointer[offset + 1] == '1') {
    +        key_or_index += '/';
    +        offset++;
    +        continue;
    +      }
    +      // "~0" represents "~"
    +      if (pointer[offset + 1] == '0') {
    +        key_or_index += '~';
    +        offset++;
    +        continue;
    +      }
    +    }
    +    if (pointer[offset] == '\\') {
    +      if (pointer[offset + 1] == '\\' || pointer[offset + 1] == '"' ||
    +          (pointer[offset + 1] <= 0x1F)) {
    +        key_or_index += pointer[offset + 1];
    +        offset++;
    +        continue;
    +      }
    +      return false; // invalid escaped character
    +    }
    +    if (pointer[offset] == '\"') {
    +      // unescaped quote character. this is an invalid case.
    +      // lets do nothing and assume most pointers will be valid.
    +      // it won't find any corresponding json key anyway.
    +      // return false;
    +    }
    +    key_or_index += pointer[offset];
    +  }
    +
    +  bool found = false;
    +  if (is_object()) {
    +    if (move_to_key(key_or_index.c_str(), uint32_t(key_or_index.length()))) {
    +      found = relative_move_to(pointer + offset, length - offset);
    +    }
    +  } else if (is_array()) {
    +    if (key_or_index == "-") { // handling "-" case first
    +      if (down()) {
    +        while (next())
    +          ; // moving to the end of the array
    +        // moving to the nonexistent value right after...
    +        size_t npos;
    +        if ((current_type == '[') || (current_type == '{')) {
    +          // we need to jump
    +          npos = uint32_t(current_val);
    +        } else {
    +          npos =
    +              location + ((current_type == 'd' || current_type == 'l') ? 2 : 1);
    +        }
    +        location = npos;
    +        current_val = doc.tape[npos];
    +        current_type = uint8_t(current_val >> 56);
    +        return true; // how could it fail ?
    +      }
    +    } else { // regular numeric index
    +      // The index can't have a leading '0'
    +      if (key_or_index[0] == '0' && key_or_index.length() > 1) {
    +        return false;
    +      }
    +      // it cannot be empty
    +      if (key_or_index.length() == 0) {
    +        return false;
    +      }
    +      // we already checked the index contains only valid digits
    +      uint32_t index = std::stoi(key_or_index);
    +      if (move_to_index(index)) {
    +        found = relative_move_to(pointer + offset, length - offset);
    +      }
    +    }
    +  }
    +
    +  return found;
    +}
    +
    +SIMDJSON_POP_DISABLE_WARNINGS
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_DISABLE_DEPRECATED_API
    +
    +
    +#endif // SIMDJSON_PARSEDJSON_ITERATOR_INL_H
    +/* end file simdjson/dom/parsedjson_iterator-inl.h */
    +/* skipped duplicate #include "simdjson/dom/parser-inl.h" */
    +/* skipped duplicate #include "simdjson/internal/tape_ref-inl.h" */
    +/* including simdjson/dom/serialization-inl.h: #include "simdjson/dom/serialization-inl.h" */
    +/* begin file simdjson/dom/serialization-inl.h */
    +
    +#ifndef SIMDJSON_SERIALIZATION_INL_H
    +#define SIMDJSON_SERIALIZATION_INL_H
    +
    +/* skipped duplicate #include "simdjson/dom/base.h" */
    +/* skipped duplicate #include "simdjson/dom/serialization.h" */
    +/* skipped duplicate #include "simdjson/dom/parser.h" */
    +/* skipped duplicate #include "simdjson/internal/tape_type.h" */
    +
    +/* skipped duplicate #include "simdjson/dom/array-inl.h" */
    +/* skipped duplicate #include "simdjson/dom/object-inl.h" */
    +/* skipped duplicate #include "simdjson/internal/tape_ref-inl.h" */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace dom {
    +inline bool parser::print_json(std::ostream &os) const noexcept {
    +  if (!valid) { return false; }
    +  simdjson::internal::string_builder<> sb;
    +  sb.append(doc.root());
    +  std::string_view answer = sb.str();
    +  os << answer;
    +  return true;
    +}
    +
    +inline std::ostream& operator<<(std::ostream& out, simdjson::dom::element value) {
    +    simdjson::internal::string_builder<> sb;
    +    sb.append(value);
    +    return (out << sb.str());
    +}
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) {
    +    if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +    return (out << x.value());
    +}
    +#endif
    +inline std::ostream& operator<<(std::ostream& out, simdjson::dom::array value)  {
    +    simdjson::internal::string_builder<> sb;
    +    sb.append(value);
    +    return (out << sb.str());
    +}
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) {
    +    if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +    return (out << x.value());
    +}
    +#endif
    +inline std::ostream& operator<<(std::ostream& out, simdjson::dom::object value)   {
    +    simdjson::internal::string_builder<> sb;
    +    sb.append(value);
    +    return (out << sb.str());
    +}
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out,  simdjson::simdjson_result x) {
    +    if (x.error()) { throw  simdjson::simdjson_error(x.error()); }
    +    return (out << x.value());
    +}
    +#endif
    +
    +} // namespace dom
    +
    +/***
    + * Number utility functions
    + **/
    +namespace {
    +/**@private
    + * Escape sequence like \b or \u0001
    + * We expect that most compilers will use 8 bytes for this data structure.
    + **/
    +struct escape_sequence {
    +    uint8_t length;
    +    const char string[7]; // technically, we only ever need 6 characters, we pad to 8
    +};
    +/**@private
    + * This converts a signed integer into a character sequence.
    + * The caller is responsible for providing enough memory (at least
    + * 20 characters.)
    + * Though various runtime libraries provide itoa functions,
    + * it is not part of the C++ standard. The C++17 standard
    + * adds the to_chars functions which would do as well, but
    + * we want to support C++11.
    + */
    +static char *fast_itoa(char *output, int64_t value) noexcept {
    +  // This is a standard implementation of itoa.
    +  char buffer[20];
    +  uint64_t value_positive;
    +  // In general, negating a signed integer is unsafe.
    +  if(value < 0) {
    +    *output++ = '-';
    +    // Doing value_positive = -value; while avoiding
    +    // undefined behavior warnings.
    +    // It assumes two complement's which is universal at this
    +    // point in time.
    +    std::memcpy(&value_positive, &value, sizeof(value));
    +    value_positive = (~value_positive) + 1; // this is a negation
    +  } else {
    +    value_positive = value;
    +  }
    +  // We work solely with value_positive. It *might* be easier
    +  // for an optimizing compiler to deal with an unsigned variable
    +  // as far as performance goes.
    +  const char *const end_buffer = buffer + 20;
    +  char *write_pointer = buffer + 19;
    +  // A faster approach is possible if we expect large integers:
    +  // unroll the loop (work in 100s, 1000s) and use some kind of
    +  // memoization.
    +  while(value_positive >= 10) {
    +    *write_pointer-- = char('0' + (value_positive % 10));
    +    value_positive /= 10;
    +  }
    +  *write_pointer = char('0' + value_positive);
    +  size_t len = end_buffer - write_pointer;
    +  std::memcpy(output, write_pointer, len);
    +  return output + len;
    +}
    +/**@private
    + * This converts an unsigned integer into a character sequence.
    + * The caller is responsible for providing enough memory (at least
    + * 19 characters.)
    + * Though various runtime libraries provide itoa functions,
    + * it is not part of the C++ standard. The C++17 standard
    + * adds the to_chars functions which would do as well, but
    + * we want to support C++11.
    + */
    +static char *fast_itoa(char *output, uint64_t value) noexcept {
    +  // This is a standard implementation of itoa.
    +  char buffer[20];
    +  const char *const end_buffer = buffer + 20;
    +  char *write_pointer = buffer + 19;
    +  // A faster approach is possible if we expect large integers:
    +  // unroll the loop (work in 100s, 1000s) and use some kind of
    +  // memoization.
    +  while(value >= 10) {
    +    *write_pointer-- = char('0' + (value % 10));
    +    value /= 10;
    +  };
    +  *write_pointer = char('0' + value);
    +  size_t len = end_buffer - write_pointer;
    +  std::memcpy(output, write_pointer, len);
    +  return output + len;
    +}
    +
    +
    +} // anonymous namespace
    +namespace internal {
    +
    +/***
    + * Minifier/formatter code.
    + **/
    +
    +template
    +simdjson_inline void base_formatter::number(uint64_t x) {
    +  char number_buffer[24];
    +  char *newp = fast_itoa(number_buffer, x);
    +  buffer.insert(buffer.end(), number_buffer, newp);
    +}
    +
    +template
    +simdjson_inline void base_formatter::number(int64_t x) {
    +  char number_buffer[24];
    +  char *newp = fast_itoa(number_buffer, x);
    +  buffer.insert(buffer.end(), number_buffer, newp);
    +}
    +
    +template
    +simdjson_inline void base_formatter::number(double x) {
    +  char number_buffer[24];
    +  // Currently, passing the nullptr to the second argument is
    +  // safe because our implementation does not check the second
    +  // argument.
    +  char *newp = internal::to_chars(number_buffer, nullptr, x);
    +  buffer.insert(buffer.end(), number_buffer, newp);
    +}
    +
    +template
    +simdjson_inline void base_formatter::start_array() { one_char('['); }
    +
    +
    +template
    +simdjson_inline void base_formatter::end_array() { one_char(']'); }
    +
    +template
    +simdjson_inline void base_formatter::start_object() { one_char('{'); }
    +
    +template
    +simdjson_inline void base_formatter::end_object() { one_char('}'); }
    +
    +template
    +simdjson_inline void base_formatter::comma() { one_char(','); }
    +
    +template
    +simdjson_inline void base_formatter::true_atom() {
    +  const char * s = "true";
    +  buffer.insert(buffer.end(), s, s + 4);
    +}
    +
    +template
    +simdjson_inline void base_formatter::false_atom() {
    +  const char * s = "false";
    +  buffer.insert(buffer.end(), s, s + 5);
    +}
    +
    +template
    +simdjson_inline void base_formatter::null_atom() {
    +  const char * s = "null";
    +  buffer.insert(buffer.end(), s, s + 4);
    +}
    +
    +template
    +simdjson_inline void base_formatter::one_char(char c) { buffer.push_back(c); }
    +
    +template
    +simdjson_inline void base_formatter::key(std::string_view unescaped) {
    +  string(unescaped);
    +  one_char(':');
    +}
    +
    +template
    +simdjson_inline void base_formatter::string(std::string_view unescaped) {
    +  one_char('\"');
    +  size_t i = 0;
    +  // Fast path for the case where we have no control character, no ", and no backslash.
    +  // This should include most keys.
    +  //
    +  // We would like to use 'bool' but some compilers take offense to bitwise operation
    +  // with bool types.
    +  constexpr static char needs_escaping[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    +    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
    +    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
    +    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    +  for(;i + 8 <= unescaped.length(); i += 8) {
    +    // Poor's man vectorization. This could get much faster if we used SIMD.
    +    //
    +    // It is not the case that replacing '|' with '||' would be neutral performance-wise.
    +    if(needs_escaping[uint8_t(unescaped[i])] | needs_escaping[uint8_t(unescaped[i+1])]
    +      | needs_escaping[uint8_t(unescaped[i+2])] | needs_escaping[uint8_t(unescaped[i+3])]
    +      | needs_escaping[uint8_t(unescaped[i+4])] | needs_escaping[uint8_t(unescaped[i+5])]
    +      | needs_escaping[uint8_t(unescaped[i+6])] | needs_escaping[uint8_t(unescaped[i+7])]
    +      ) { break; }
    +  }
    +  for(;i < unescaped.length(); i++) {
    +    if(needs_escaping[uint8_t(unescaped[i])]) { break; }
    +  }
    +  // The following is also possible and omits a 256-byte table, but it is slower:
    +  // for (; (i < unescaped.length()) && (uint8_t(unescaped[i]) > 0x1F)
    +  //      && (unescaped[i] != '\"') && (unescaped[i] != '\\'); i++) {}
    +
    +  // At least for long strings, the following should be fast. We could
    +  // do better by integrating the checks and the insertion.
    +  buffer.insert(buffer.end(), unescaped.data(), unescaped.data() + i);
    +  // We caught a control character if we enter this loop (slow).
    +  // Note that we are do not restart from the beginning, but rather we continue
    +  // from the point where we encountered something that requires escaping.
    +  for (; i < unescaped.length(); i++) {
    +    switch (unescaped[i]) {
    +    case '\"':
    +      {
    +        const char * s = "\\\"";
    +        buffer.insert(buffer.end(), s, s + 2);
    +      }
    +      break;
    +    case '\\':
    +      {
    +        const char * s = "\\\\";
    +        buffer.insert(buffer.end(), s, s + 2);
    +      }
    +      break;
    +    default:
    +      if (uint8_t(unescaped[i]) <= 0x1F) {
    +        // If packed, this uses 8 * 32 bytes.
    +        // Note that we expect most compilers to embed this code in the data
    +        // section.
    +        constexpr static escape_sequence escaped[32] = {
    +          {6, "\\u0000"}, {6, "\\u0001"}, {6, "\\u0002"}, {6, "\\u0003"},
    +          {6, "\\u0004"}, {6, "\\u0005"}, {6, "\\u0006"}, {6, "\\u0007"},
    +          {2, "\\b"},     {2, "\\t"},     {2, "\\n"},     {6, "\\u000b"},
    +          {2, "\\f"},     {2, "\\r"},     {6, "\\u000e"}, {6, "\\u000f"},
    +          {6, "\\u0010"}, {6, "\\u0011"}, {6, "\\u0012"}, {6, "\\u0013"},
    +          {6, "\\u0014"}, {6, "\\u0015"}, {6, "\\u0016"}, {6, "\\u0017"},
    +          {6, "\\u0018"}, {6, "\\u0019"}, {6, "\\u001a"}, {6, "\\u001b"},
    +          {6, "\\u001c"}, {6, "\\u001d"}, {6, "\\u001e"}, {6, "\\u001f"}};
    +        auto u = escaped[uint8_t(unescaped[i])];
    +        buffer.insert(buffer.end(), u.string, u.string + u.length);
    +      } else {
    +        one_char(unescaped[i]);
    +      }
    +    } // switch
    +  }   // for
    +  one_char('\"');
    +}
    +
    +
    +template
    +inline void base_formatter::clear() {
    +  buffer.clear();
    +}
    +
    +template
    +simdjson_inline std::string_view base_formatter::str() const {
    +  return std::string_view(buffer.data(), buffer.size());
    +}
    +
    +simdjson_inline void mini_formatter::print_newline() {
    +    return;
    +}
    +
    +simdjson_inline void mini_formatter::print_indents(size_t depth) {
    +    (void)depth;
    +    return;
    +}
    +
    +simdjson_inline void mini_formatter::print_space() {
    +    return;
    +}
    +
    +simdjson_inline void pretty_formatter::print_newline() {
    +    one_char('\n');
    +}
    +
    +simdjson_inline void pretty_formatter::print_indents(size_t depth) {
    +    if(this->indent_step <= 0) {
    +        return;
    +    }
    +    for(size_t i = 0; i < this->indent_step * depth; i++) {
    +        one_char(' ');
    +    }
    +}
    +
    +simdjson_inline void pretty_formatter::print_space() {
    +    one_char(' ');
    +}
    +
    +/***
    + * String building code.
    + **/
    +
    +template 
    +inline void string_builder::append(simdjson::dom::element value) {
    +  // using tape_type = simdjson::internal::tape_type;
    +  size_t depth = 0;
    +  constexpr size_t MAX_DEPTH = 16;
    +  bool is_object[MAX_DEPTH];
    +  is_object[0] = false;
    +  bool after_value = false;
    +
    +  internal::tape_ref iter(value.tape);
    +  do {
    +    // print commas after each value
    +    if (after_value) {
    +      format.comma();
    +      format.print_newline();
    +    }
    +
    +    format.print_indents(depth);
    +
    +    // If we are in an object, print the next key and :, and skip to the next
    +    // value.
    +    if (is_object[depth]) {
    +      format.key(iter.get_string_view());
    +      format.print_space();
    +      iter.json_index++;
    +    }
    +    switch (iter.tape_ref_type()) {
    +
    +    // Arrays
    +    case tape_type::START_ARRAY: {
    +      // If we're too deep, we need to recurse to go deeper.
    +      depth++;
    +      if (simdjson_unlikely(depth >= MAX_DEPTH)) {
    +        append(simdjson::dom::array(iter));
    +        iter.json_index = iter.matching_brace_index() - 1; // Jump to the ]
    +        depth--;
    +        break;
    +      }
    +
    +      // Output start [
    +      format.start_array();
    +      iter.json_index++;
    +
    +      // Handle empty [] (we don't want to come back around and print commas)
    +      if (iter.tape_ref_type() == tape_type::END_ARRAY) {
    +        format.end_array();
    +        depth--;
    +        break;
    +      }
    +
    +      is_object[depth] = false;
    +      after_value = false;
    +      format.print_newline();
    +      continue;
    +    }
    +
    +    // Objects
    +    case tape_type::START_OBJECT: {
    +      // If we're too deep, we need to recurse to go deeper.
    +      depth++;
    +      if (simdjson_unlikely(depth >= MAX_DEPTH)) {
    +        append(simdjson::dom::object(iter));
    +        iter.json_index = iter.matching_brace_index() - 1; // Jump to the }
    +        depth--;
    +        break;
    +      }
    +
    +      // Output start {
    +      format.start_object();
    +      iter.json_index++;
    +
    +      // Handle empty {} (we don't want to come back around and print commas)
    +      if (iter.tape_ref_type() == tape_type::END_OBJECT) {
    +        format.end_object();
    +        depth--;
    +        break;
    +      }
    +
    +      is_object[depth] = true;
    +      after_value = false;
    +      format.print_newline();
    +      continue;
    +    }
    +
    +    // Scalars
    +    case tape_type::STRING:
    +      format.string(iter.get_string_view());
    +      break;
    +    case tape_type::INT64:
    +      format.number(iter.next_tape_value());
    +      iter.json_index++; // numbers take up 2 spots, so we need to increment
    +                         // extra
    +      break;
    +    case tape_type::UINT64:
    +      format.number(iter.next_tape_value());
    +      iter.json_index++; // numbers take up 2 spots, so we need to increment
    +                         // extra
    +      break;
    +    case tape_type::DOUBLE:
    +      format.number(iter.next_tape_value());
    +      iter.json_index++; // numbers take up 2 spots, so we need to increment
    +                         // extra
    +      break;
    +    case tape_type::TRUE_VALUE:
    +      format.true_atom();
    +      break;
    +    case tape_type::FALSE_VALUE:
    +      format.false_atom();
    +      break;
    +    case tape_type::NULL_VALUE:
    +      format.null_atom();
    +      break;
    +
    +    // These are impossible
    +    case tape_type::END_ARRAY:
    +    case tape_type::END_OBJECT:
    +    case tape_type::ROOT:
    +      SIMDJSON_UNREACHABLE();
    +    }
    +    iter.json_index++;
    +    after_value = true;
    +
    +    // Handle multiple ends in a row
    +    while (depth != 0 && (iter.tape_ref_type() == tape_type::END_ARRAY ||
    +                          iter.tape_ref_type() == tape_type::END_OBJECT)) {
    +      format.print_newline();
    +      depth--;
    +      format.print_indents(depth);
    +      if (iter.tape_ref_type() == tape_type::END_ARRAY) {
    +        format.end_array();
    +      } else {
    +        format.end_object();
    +      }
    +      iter.json_index++;
    +    }
    +
    +    // Stop when we're at depth 0
    +  } while (depth != 0);
    +
    +  format.print_newline();
    +}
    +
    +template 
    +inline void string_builder::append(simdjson::dom::object value) {
    +  format.start_object();
    +  auto pair = value.begin();
    +  auto end = value.end();
    +  if (pair != end) {
    +    append(*pair);
    +    for (++pair; pair != end; ++pair) {
    +      format.comma();
    +      append(*pair);
    +    }
    +  }
    +  format.end_object();
    +}
    +
    +template 
    +inline void string_builder::append(simdjson::dom::array value) {
    +  format.start_array();
    +  auto iter = value.begin();
    +  auto end = value.end();
    +  if (iter != end) {
    +    append(*iter);
    +    for (++iter; iter != end; ++iter) {
    +      format.comma();
    +      append(*iter);
    +    }
    +  }
    +  format.end_array();
    +}
    +
    +template 
    +simdjson_inline void string_builder::append(simdjson::dom::key_value_pair kv) {
    +  format.key(kv.key);
    +  append(kv.value);
    +}
    +
    +template 
    +simdjson_inline void string_builder::clear() {
    +  format.clear();
    +}
    +
    +template 
    +simdjson_inline std::string_view string_builder::str() const {
    +  return format.str();
    +}
    +
    +
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif
    +/* end file simdjson/dom/serialization-inl.h */
    +
    +#endif // SIMDJSON_DOM_H
    +/* end file simdjson/dom.h */
    +/* including simdjson/ondemand.h: #include "simdjson/ondemand.h" */
    +/* begin file simdjson/ondemand.h */
    +#ifndef SIMDJSON_ONDEMAND_H
    +#define SIMDJSON_ONDEMAND_H
    +
    +/* including simdjson/builtin/ondemand.h: #include "simdjson/builtin/ondemand.h" */
    +/* begin file simdjson/builtin/ondemand.h */
    +#ifndef SIMDJSON_BUILTIN_ONDEMAND_H
    +#define SIMDJSON_BUILTIN_ONDEMAND_H
    +
    +/* including simdjson/builtin.h: #include "simdjson/builtin.h" */
    +/* begin file simdjson/builtin.h */
    +#ifndef SIMDJSON_BUILTIN_H
    +#define SIMDJSON_BUILTIN_H
    +
    +/* including simdjson/builtin/base.h: #include "simdjson/builtin/base.h" */
    +/* begin file simdjson/builtin/base.h */
    +#ifndef SIMDJSON_BUILTIN_BASE_H
    +#define SIMDJSON_BUILTIN_BASE_H
    +
    +/* skipped duplicate #include "simdjson/base.h" */
    +/* including simdjson/implementation_detection.h: #include "simdjson/implementation_detection.h" */
    +/* begin file simdjson/implementation_detection.h */
    +#ifndef SIMDJSON_IMPLEMENTATION_DETECTION_H
    +#define SIMDJSON_IMPLEMENTATION_DETECTION_H
    +
    +/* skipped duplicate #include "simdjson/base.h" */
    +
    +// 0 is reserved, because undefined SIMDJSON_IMPLEMENTATION equals 0 in preprocessor macros.
    +#define SIMDJSON_IMPLEMENTATION_ID_arm64 1
    +#define SIMDJSON_IMPLEMENTATION_ID_fallback 2
    +#define SIMDJSON_IMPLEMENTATION_ID_haswell 3
    +#define SIMDJSON_IMPLEMENTATION_ID_icelake 4
    +#define SIMDJSON_IMPLEMENTATION_ID_ppc64 5
    +#define SIMDJSON_IMPLEMENTATION_ID_westmere 6
    +
    +#define SIMDJSON_IMPLEMENTATION_ID_FOR(IMPL) SIMDJSON_CAT(SIMDJSON_IMPLEMENTATION_ID_, IMPL)
    +#define SIMDJSON_IMPLEMENTATION_ID SIMDJSON_IMPLEMENTATION_ID_FOR(SIMDJSON_IMPLEMENTATION)
    +
    +#define SIMDJSON_IMPLEMENTATION_IS(IMPL) SIMDJSON_IMPLEMENTATION_ID == SIMDJSON_IMPLEMENTATION_ID_FOR(IMPL)
    +
    +//
    +// First, figure out which implementations can be run. Doing it here makes it so we don't have to worry about the order
    +// in which we include them.
    +//
    +
    +#ifndef SIMDJSON_IMPLEMENTATION_ARM64
    +#define SIMDJSON_IMPLEMENTATION_ARM64 (SIMDJSON_IS_ARM64)
    +#endif
    +#define SIMDJSON_CAN_ALWAYS_RUN_ARM64 SIMDJSON_IMPLEMENTATION_ARM64 && SIMDJSON_IS_ARM64
    +
    +// Default Icelake to on if this is x86-64. Even if we're not compiled for it, it could be selected
    +// at runtime.
    +#ifndef SIMDJSON_IMPLEMENTATION_ICELAKE
    +#define SIMDJSON_IMPLEMENTATION_ICELAKE ((SIMDJSON_IS_X86_64) && (SIMDJSON_AVX512_ALLOWED) && (SIMDJSON_COMPILER_SUPPORTS_VBMI2))
    +#endif
    +
    +#ifdef _MSC_VER
    +// To see why  (__BMI__) && (__PCLMUL__) && (__LZCNT__) are not part of this next line, see
    +// https://github.com/simdjson/simdjson/issues/1247
    +#define SIMDJSON_CAN_ALWAYS_RUN_ICELAKE ((SIMDJSON_IMPLEMENTATION_ICELAKE) && (__AVX2__) && (__AVX512F__) && (__AVX512DQ__) && (__AVX512CD__) && (__AVX512BW__) && (__AVX512VL__) && (__AVX512VBMI2__))
    +#else
    +#define SIMDJSON_CAN_ALWAYS_RUN_ICELAKE ((SIMDJSON_IMPLEMENTATION_ICELAKE) && (__AVX2__) && (__BMI__) && (__PCLMUL__) && (__LZCNT__) && (__AVX512F__) && (__AVX512DQ__) && (__AVX512CD__) && (__AVX512BW__) && (__AVX512VL__) && (__AVX512VBMI2__))
    +#endif
    +
    +// Default Haswell to on if this is x86-64. Even if we're not compiled for it, it could be selected
    +// at runtime.
    +#ifndef SIMDJSON_IMPLEMENTATION_HASWELL
    +#if SIMDJSON_CAN_ALWAYS_RUN_ICELAKE
    +// if icelake is always available, never enable haswell.
    +#define SIMDJSON_IMPLEMENTATION_HASWELL 0
    +#else
    +#define SIMDJSON_IMPLEMENTATION_HASWELL SIMDJSON_IS_X86_64
    +#endif
    +#endif
    +#ifdef _MSC_VER
    +// To see why  (__BMI__) && (__PCLMUL__) && (__LZCNT__) are not part of this next line, see
    +// https://github.com/simdjson/simdjson/issues/1247
    +#define SIMDJSON_CAN_ALWAYS_RUN_HASWELL ((SIMDJSON_IMPLEMENTATION_HASWELL) && (SIMDJSON_IS_X86_64) && (__AVX2__))
    +#else
    +#define SIMDJSON_CAN_ALWAYS_RUN_HASWELL ((SIMDJSON_IMPLEMENTATION_HASWELL) && (SIMDJSON_IS_X86_64) && (__AVX2__) && (__BMI__) && (__PCLMUL__) && (__LZCNT__))
    +#endif
    +
    +// Default Westmere to on if this is x86-64.
    +#ifndef SIMDJSON_IMPLEMENTATION_WESTMERE
    +#if SIMDJSON_CAN_ALWAYS_RUN_ICELAKE || SIMDJSON_CAN_ALWAYS_RUN_HASWELL
    +// if icelake or haswell are always available, never enable westmere.
    +#define SIMDJSON_IMPLEMENTATION_WESTMERE 0
    +#else
    +#define SIMDJSON_IMPLEMENTATION_WESTMERE SIMDJSON_IS_X86_64
    +#endif
    +#endif
    +#define SIMDJSON_CAN_ALWAYS_RUN_WESTMERE (SIMDJSON_IMPLEMENTATION_WESTMERE && SIMDJSON_IS_X86_64 && __SSE4_2__ && __PCLMUL__)
    +
    +#ifndef SIMDJSON_IMPLEMENTATION_PPC64
    +#define SIMDJSON_IMPLEMENTATION_PPC64 (SIMDJSON_IS_PPC64 && SIMDJSON_IS_PPC64_VMX)
    +#endif
    +#define SIMDJSON_CAN_ALWAYS_RUN_PPC64 SIMDJSON_IMPLEMENTATION_PPC64 && SIMDJSON_IS_PPC64 && SIMDJSON_IS_PPC64_VMX
    +
    +// Default Fallback to on unless a builtin implementation has already been selected.
    +#ifndef SIMDJSON_IMPLEMENTATION_FALLBACK
    +#if SIMDJSON_CAN_ALWAYS_RUN_ARM64 || SIMDJSON_CAN_ALWAYS_RUN_ICELAKE || SIMDJSON_CAN_ALWAYS_RUN_HASWELL || SIMDJSON_CAN_ALWAYS_RUN_WESTMERE || SIMDJSON_CAN_ALWAYS_RUN_PPC64
    +// if anything at all except fallback can always run, then disable fallback.
    +#define SIMDJSON_IMPLEMENTATION_FALLBACK 0
    +#else
    +#define SIMDJSON_IMPLEMENTATION_FALLBACK 1
    +#endif
    +#endif
    +#define SIMDJSON_CAN_ALWAYS_RUN_FALLBACK SIMDJSON_IMPLEMENTATION_FALLBACK
    +
    +// Determine the best builtin implementation
    +#ifndef SIMDJSON_BUILTIN_IMPLEMENTATION
    +
    +#if SIMDJSON_CAN_ALWAYS_RUN_ICELAKE
    +#define SIMDJSON_BUILTIN_IMPLEMENTATION icelake
    +#elif SIMDJSON_CAN_ALWAYS_RUN_HASWELL
    +#define SIMDJSON_BUILTIN_IMPLEMENTATION haswell
    +#elif SIMDJSON_CAN_ALWAYS_RUN_WESTMERE
    +#define SIMDJSON_BUILTIN_IMPLEMENTATION westmere
    +#elif SIMDJSON_CAN_ALWAYS_RUN_ARM64
    +#define SIMDJSON_BUILTIN_IMPLEMENTATION arm64
    +#elif SIMDJSON_CAN_ALWAYS_RUN_PPC64
    +#define SIMDJSON_BUILTIN_IMPLEMENTATION ppc64
    +#elif SIMDJSON_CAN_ALWAYS_RUN_FALLBACK
    +#define SIMDJSON_BUILTIN_IMPLEMENTATION fallback
    +#else
    +#error "All possible implementations (including fallback) have been disabled! simdjson will not run."
    +#endif
    +
    +#endif // SIMDJSON_BUILTIN_IMPLEMENTATION
    +
    +#define SIMDJSON_BUILTIN_IMPLEMENTATION_ID SIMDJSON_IMPLEMENTATION_ID_FOR(SIMDJSON_BUILTIN_IMPLEMENTATION)
    +#define SIMDJSON_BUILTIN_IMPLEMENTATION_IS(IMPL) SIMDJSON_BUILTIN_IMPLEMENTATION_ID == SIMDJSON_IMPLEMENTATION_ID_FOR(IMPL)
    +
    +#endif // SIMDJSON_IMPLEMENTATION_DETECTION_H
    +/* end file simdjson/implementation_detection.h */
    +
    +namespace simdjson {
    +#if SIMDJSON_BUILTIN_IMPLEMENTATION_IS(arm64)
    +  namespace arm64 {}
    +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(fallback)
    +  namespace fallback {}
    +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(haswell)
    +  namespace haswell {}
    +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(icelake)
    +  namespace icelake {}
    +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(ppc64)
    +  namespace ppc64 {}
    +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(westmere)
    +  namespace westmere {}
    +#else
    +#error Unknown SIMDJSON_BUILTIN_IMPLEMENTATION
    +#endif
    +
    +  /**
    +   * Represents the best statically linked simdjson implementation that can be used by the compiling
    +   * program.
    +   *
    +   * Detects what options the program is compiled against, and picks the minimum implementation that
    +   * will work on any computer that can run the program. For example, if you compile with g++
    +   * -march=westmere, it will pick the westmere implementation. The haswell implementation will
    +   * still be available, and can be selected at runtime, but the builtin implementation (and any
    +   * code that uses it) will use westmere.
    +   */
    +  namespace builtin = SIMDJSON_BUILTIN_IMPLEMENTATION;
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_BUILTIN_BASE_H
    +/* end file simdjson/builtin/base.h */
    +/* including simdjson/builtin/implementation.h: #include "simdjson/builtin/implementation.h" */
    +/* begin file simdjson/builtin/implementation.h */
    +#ifndef SIMDJSON_BUILTIN_IMPLEMENTATION_H
    +#define SIMDJSON_BUILTIN_IMPLEMENTATION_H
    +
    +/* skipped duplicate #include "simdjson/builtin/base.h" */
    +
    +/* including simdjson/generic/dependencies.h: #include "simdjson/generic/dependencies.h" */
    +/* begin file simdjson/generic/dependencies.h */
    +#ifdef SIMDJSON_CONDITIONAL_INCLUDE
    +#error simdjson/generic/dependencies.h must be included before defining SIMDJSON_CONDITIONAL_INCLUDE!
    +#endif
    +
    +#ifndef SIMDJSON_GENERIC_DEPENDENCIES_H
    +#define SIMDJSON_GENERIC_DEPENDENCIES_H
    +
    +// Internal headers needed for generics.
    +// All includes referencing simdjson headers *not* under simdjson/generic must be here!
    +// Otherwise, amalgamation will fail.
    +/* skipped duplicate #include "simdjson/base.h" */
    +/* skipped duplicate #include "simdjson/implementation.h" */
    +/* skipped duplicate #include "simdjson/implementation_detection.h" */
    +/* including simdjson/internal/instruction_set.h: #include "simdjson/internal/instruction_set.h" */
    +/* begin file simdjson/internal/instruction_set.h */
    +/* From
    +https://github.com/endorno/pytorch/blob/master/torch/lib/TH/generic/simd/simd.h
    +Highly modified.
    +
    +Copyright (c) 2016-     Facebook, Inc            (Adam Paszke)
    +Copyright (c) 2014-     Facebook, Inc            (Soumith Chintala)
    +Copyright (c) 2011-2014 Idiap Research Institute (Ronan Collobert)
    +Copyright (c) 2012-2014 Deepmind Technologies    (Koray Kavukcuoglu)
    +Copyright (c) 2011-2012 NEC Laboratories America (Koray Kavukcuoglu)
    +Copyright (c) 2011-2013 NYU                      (Clement Farabet)
    +Copyright (c) 2006-2010 NEC Laboratories America (Ronan Collobert, Leon Bottou,
    +Iain Melvin, Jason Weston) Copyright (c) 2006      Idiap Research Institute
    +(Samy Bengio) Copyright (c) 2001-2004 Idiap Research Institute (Ronan Collobert,
    +Samy Bengio, Johnny Mariethoz)
    +
    +All rights reserved.
    +
    +Redistribution and use in source and binary forms, with or without
    +modification, are permitted provided that the following conditions are met:
    +
    +1. Redistributions of source code must retain the above copyright
    +   notice, this list of conditions and the following disclaimer.
    +
    +2. Redistributions in binary form must reproduce the above copyright
    +   notice, this list of conditions and the following disclaimer in the
    +   documentation and/or other materials provided with the distribution.
    +
    +3. Neither the names of Facebook, Deepmind Technologies, NYU, NEC Laboratories
    +America and IDIAP Research Institute nor the names of its contributors may be
    +   used to endorse or promote products derived from this software without
    +   specific prior written permission.
    +
    +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    +POSSIBILITY OF SUCH DAMAGE.
    +*/
    +
    +#ifndef SIMDJSON_INTERNAL_INSTRUCTION_SET_H
    +#define SIMDJSON_INTERNAL_INSTRUCTION_SET_H
    +
    +namespace simdjson {
    +namespace internal {
    +
    +enum instruction_set {
    +  DEFAULT = 0x0,
    +  NEON = 0x1,
    +  AVX2 = 0x4,
    +  SSE42 = 0x8,
    +  PCLMULQDQ = 0x10,
    +  BMI1 = 0x20,
    +  BMI2 = 0x40,
    +  ALTIVEC = 0x80,
    +  AVX512F = 0x100,
    +  AVX512DQ = 0x200,
    +  AVX512IFMA = 0x400,
    +  AVX512PF = 0x800,
    +  AVX512ER = 0x1000,
    +  AVX512CD = 0x2000,
    +  AVX512BW = 0x4000,
    +  AVX512VL = 0x8000,
    +  AVX512VBMI2 = 0x10000
    +};
    +
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_INTERNAL_INSTRUCTION_SET_H
    +/* end file simdjson/internal/instruction_set.h */
    +/* skipped duplicate #include "simdjson/internal/dom_parser_implementation.h" */
    +/* including simdjson/internal/jsoncharutils_tables.h: #include "simdjson/internal/jsoncharutils_tables.h" */
    +/* begin file simdjson/internal/jsoncharutils_tables.h */
    +#ifndef SIMDJSON_INTERNAL_JSONCHARUTILS_TABLES_H
    +#define SIMDJSON_INTERNAL_JSONCHARUTILS_TABLES_H
    +
    +/* skipped duplicate #include "simdjson/base.h" */
    +
    +#ifdef JSON_TEST_STRINGS
    +void found_string(const uint8_t *buf, const uint8_t *parsed_begin,
    +                  const uint8_t *parsed_end);
    +void found_bad_string(const uint8_t *buf);
    +#endif
    +
    +namespace simdjson {
    +namespace internal {
    +// structural chars here are
    +// they are { 0x7b } 0x7d : 0x3a [ 0x5b ] 0x5d , 0x2c (and NULL)
    +// we are also interested in the four whitespace characters
    +// space 0x20, linefeed 0x0a, horizontal tab 0x09 and carriage return 0x0d
    +
    +extern SIMDJSON_DLLIMPORTEXPORT const bool structural_or_whitespace_negated[256];
    +extern SIMDJSON_DLLIMPORTEXPORT const bool structural_or_whitespace[256];
    +extern SIMDJSON_DLLIMPORTEXPORT const uint32_t digit_to_val32[886];
    +
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_INTERNAL_JSONCHARUTILS_TABLES_H
    +/* end file simdjson/internal/jsoncharutils_tables.h */
    +/* including simdjson/internal/numberparsing_tables.h: #include "simdjson/internal/numberparsing_tables.h" */
    +/* begin file simdjson/internal/numberparsing_tables.h */
    +#ifndef SIMDJSON_INTERNAL_NUMBERPARSING_TABLES_H
    +#define SIMDJSON_INTERNAL_NUMBERPARSING_TABLES_H
    +
    +/* skipped duplicate #include "simdjson/base.h" */
    +
    +namespace simdjson {
    +namespace internal {
    +/**
    + * The smallest non-zero float (binary64) is 2^-1074.
    + * We take as input numbers of the form w x 10^q where w < 2^64.
    + * We have that w * 10^-343  <  2^(64-344) 5^-343 < 2^-1076.
    + * However, we have that
    + * (2^64-1) * 10^-342 =  (2^64-1) * 2^-342 * 5^-342 > 2^-1074.
    + * Thus it is possible for a number of the form w * 10^-342 where
    + * w is a 64-bit value to be a non-zero floating-point number.
    + *********
    + * Any number of form w * 10^309 where w>= 1 is going to be
    + * infinite in binary64 so we never need to worry about powers
    + * of 5 greater than 308.
    + */
    +constexpr int smallest_power = -342;
    +constexpr int largest_power = 308;
    +
    +/**
    + * Represents a 128-bit value.
    + * low: least significant 64 bits.
    + * high: most significant 64 bits.
    + */
    +struct value128 {
    +  uint64_t low;
    +  uint64_t high;
    +};
    +
    +
    +// Precomputed powers of ten from 10^0 to 10^22. These
    +// can be represented exactly using the double type.
    +extern SIMDJSON_DLLIMPORTEXPORT const double power_of_ten[];
    +
    +
    +/**
    + * When mapping numbers from decimal to binary,
    + * we go from w * 10^q to m * 2^p but we have
    + * 10^q = 5^q * 2^q, so effectively
    + * we are trying to match
    + * w * 2^q * 5^q to m * 2^p. Thus the powers of two
    + * are not a concern since they can be represented
    + * exactly using the binary notation, only the powers of five
    + * affect the binary significand.
    + */
    +
    +
    +// The truncated powers of five from 5^-342 all the way to 5^308
    +// The mantissa is truncated to 128 bits, and
    +// never rounded up. Uses about 10KB.
    +extern SIMDJSON_DLLIMPORTEXPORT const uint64_t power_of_five_128[];
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_INTERNAL_NUMBERPARSING_TABLES_H
    +/* end file simdjson/internal/numberparsing_tables.h */
    +/* including simdjson/internal/simdprune_tables.h: #include "simdjson/internal/simdprune_tables.h" */
    +/* begin file simdjson/internal/simdprune_tables.h */
    +#ifndef SIMDJSON_INTERNAL_SIMDPRUNE_TABLES_H
    +#define SIMDJSON_INTERNAL_SIMDPRUNE_TABLES_H
    +
    +/* skipped duplicate #include "simdjson/base.h" */
    +
    +#include 
    +
    +namespace simdjson { // table modified and copied from
    +namespace internal { // http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetTable
    +
    +extern SIMDJSON_DLLIMPORTEXPORT const unsigned char BitsSetTable256mul2[256];
    +
    +extern SIMDJSON_DLLIMPORTEXPORT const uint8_t pshufb_combine_table[272];
    +
    +// 256 * 8 bytes = 2kB, easily fits in cache.
    +extern SIMDJSON_DLLIMPORTEXPORT const uint64_t thintable_epi8[256];
    +
    +} // namespace internal
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_INTERNAL_SIMDPRUNE_TABLES_H
    +/* end file simdjson/internal/simdprune_tables.h */
    +
    +#endif // SIMDJSON_GENERIC_DEPENDENCIES_H
    +/* end file simdjson/generic/dependencies.h */
    +
    +/* defining SIMDJSON_CONDITIONAL_INCLUDE */
    +#define SIMDJSON_CONDITIONAL_INCLUDE
    +
    +#if SIMDJSON_BUILTIN_IMPLEMENTATION_IS(arm64)
    +/* including simdjson/arm64/implementation.h: #include "simdjson/arm64/implementation.h" */
    +/* begin file simdjson/arm64/implementation.h */
    +#ifndef SIMDJSON_ARM64_IMPLEMENTATION_H
    +#define SIMDJSON_ARM64_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/instruction_set.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +
    +/**
    + * @private
    + */
    +class implementation final : public simdjson::implementation {
    +public:
    +  simdjson_inline implementation() : simdjson::implementation("arm64", "ARM NEON", internal::instruction_set::NEON) {}
    +  simdjson_warn_unused error_code create_dom_parser_implementation(
    +    size_t capacity,
    +    size_t max_length,
    +    std::unique_ptr& dst
    +  ) const noexcept final;
    +  simdjson_warn_unused error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept final;
    +  simdjson_warn_unused bool validate_utf8(const char *buf, size_t len) const noexcept final;
    +};
    +
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ARM64_IMPLEMENTATION_H
    +/* end file simdjson/arm64/implementation.h */
    +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(fallback)
    +/* including simdjson/fallback/implementation.h: #include "simdjson/fallback/implementation.h" */
    +/* begin file simdjson/fallback/implementation.h */
    +#ifndef SIMDJSON_FALLBACK_IMPLEMENTATION_H
    +#define SIMDJSON_FALLBACK_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +
    +/**
    + * @private
    + */
    +class implementation final : public simdjson::implementation {
    +public:
    +  simdjson_inline implementation() : simdjson::implementation(
    +      "fallback",
    +      "Generic fallback implementation",
    +      0
    +  ) {}
    +  simdjson_warn_unused error_code create_dom_parser_implementation(
    +    size_t capacity,
    +    size_t max_length,
    +    std::unique_ptr& dst
    +  ) const noexcept final;
    +  simdjson_warn_unused error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept final;
    +  simdjson_warn_unused bool validate_utf8(const char *buf, size_t len) const noexcept final;
    +};
    +
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_FALLBACK_IMPLEMENTATION_H
    +/* end file simdjson/fallback/implementation.h */
    +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(haswell)
    +/* including simdjson/haswell/implementation.h: #include "simdjson/haswell/implementation.h" */
    +/* begin file simdjson/haswell/implementation.h */
    +#ifndef SIMDJSON_HASWELL_IMPLEMENTATION_H
    +#define SIMDJSON_HASWELL_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/instruction_set.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_HASWELL
    +namespace simdjson {
    +namespace haswell {
    +
    +/**
    + * @private
    + */
    +class implementation final : public simdjson::implementation {
    +public:
    +  simdjson_inline implementation() : simdjson::implementation(
    +      "haswell",
    +      "Intel/AMD AVX2",
    +      internal::instruction_set::AVX2 | internal::instruction_set::PCLMULQDQ | internal::instruction_set::BMI1 | internal::instruction_set::BMI2
    +  ) {}
    +  simdjson_warn_unused error_code create_dom_parser_implementation(
    +    size_t capacity,
    +    size_t max_length,
    +    std::unique_ptr& dst
    +  ) const noexcept final;
    +  simdjson_warn_unused error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept final;
    +  simdjson_warn_unused bool validate_utf8(const char *buf, size_t len) const noexcept final;
    +};
    +
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_HASWELL_IMPLEMENTATION_H
    +/* end file simdjson/haswell/implementation.h */
    +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(icelake)
    +/* including simdjson/icelake/implementation.h: #include "simdjson/icelake/implementation.h" */
    +/* begin file simdjson/icelake/implementation.h */
    +#ifndef SIMDJSON_ICELAKE_IMPLEMENTATION_H
    +#define SIMDJSON_ICELAKE_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/instruction_set.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_ICELAKE
    +namespace simdjson {
    +namespace icelake {
    +
    +/**
    + * @private
    + */
    +class implementation final : public simdjson::implementation {
    +public:
    +  simdjson_inline implementation() : simdjson::implementation(
    +      "icelake",
    +      "Intel/AMD AVX512",
    +      internal::instruction_set::AVX2 | internal::instruction_set::PCLMULQDQ | internal::instruction_set::BMI1 | internal::instruction_set::BMI2 | internal::instruction_set::AVX512F | internal::instruction_set::AVX512DQ | internal::instruction_set::AVX512CD | internal::instruction_set::AVX512BW | internal::instruction_set::AVX512VL | internal::instruction_set::AVX512VBMI2
    +  ) {}
    +  simdjson_warn_unused error_code create_dom_parser_implementation(
    +    size_t capacity,
    +    size_t max_length,
    +    std::unique_ptr& dst
    +  ) const noexcept final;
    +  simdjson_warn_unused error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept final;
    +  simdjson_warn_unused bool validate_utf8(const char *buf, size_t len) const noexcept final;
    +};
    +
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ICELAKE_IMPLEMENTATION_H
    +/* end file simdjson/icelake/implementation.h */
    +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(ppc64)
    +/* including simdjson/ppc64/implementation.h: #include "simdjson/ppc64/implementation.h" */
    +/* begin file simdjson/ppc64/implementation.h */
    +#ifndef SIMDJSON_PPC64_IMPLEMENTATION_H
    +#define SIMDJSON_PPC64_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/instruction_set.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +
    +/**
    + * Implementation for ALTIVEC (PPC64).
    + */
    +namespace ppc64 {
    +
    +/**
    + * @private
    + */
    +class implementation final : public simdjson::implementation {
    +public:
    +  simdjson_inline implementation()
    +      : simdjson::implementation("ppc64", "PPC64 ALTIVEC",
    +                                 internal::instruction_set::ALTIVEC) {}
    +
    +  simdjson_warn_unused error_code create_dom_parser_implementation(
    +      size_t capacity, size_t max_length,
    +      std::unique_ptr &dst)
    +      const noexcept final;
    +  simdjson_warn_unused error_code minify(const uint8_t *buf, size_t len,
    +                                         uint8_t *dst,
    +                                         size_t &dst_len) const noexcept final;
    +  simdjson_warn_unused bool validate_utf8(const char *buf,
    +                                          size_t len) const noexcept final;
    +};
    +
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_PPC64_IMPLEMENTATION_H
    +/* end file simdjson/ppc64/implementation.h */
    +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(westmere)
    +/* including simdjson/westmere/implementation.h: #include "simdjson/westmere/implementation.h" */
    +/* begin file simdjson/westmere/implementation.h */
    +#ifndef SIMDJSON_WESTMERE_IMPLEMENTATION_H
    +#define SIMDJSON_WESTMERE_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/instruction_set.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_WESTMERE
    +namespace simdjson {
    +namespace westmere {
    +
    +/**
    + * @private
    + */
    +class implementation final : public simdjson::implementation {
    +public:
    +  simdjson_inline implementation() : simdjson::implementation("westmere", "Intel/AMD SSE4.2", internal::instruction_set::SSE42 | internal::instruction_set::PCLMULQDQ) {}
    +  simdjson_warn_unused error_code create_dom_parser_implementation(
    +    size_t capacity,
    +    size_t max_length,
    +    std::unique_ptr& dst
    +  ) const noexcept final;
    +  simdjson_warn_unused error_code minify(const uint8_t *buf, size_t len, uint8_t *dst, size_t &dst_len) const noexcept final;
    +  simdjson_warn_unused bool validate_utf8(const char *buf, size_t len) const noexcept final;
    +};
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_IMPLEMENTATION_H
    +/* end file simdjson/westmere/implementation.h */
    +#else
    +#error Unknown SIMDJSON_BUILTIN_IMPLEMENTATION
    +#endif
    +
    +/* undefining SIMDJSON_CONDITIONAL_INCLUDE */
    +#undef SIMDJSON_CONDITIONAL_INCLUDE
    +
    +namespace simdjson {
    +  /**
    +   * Function which returns a pointer to an implementation matching the "builtin" implementation.
    +   * The builtin implementation is the best statically linked simdjson implementation that can be used by the compiling
    +   * program. If you compile with g++ -march=haswell, this will return the haswell implementation.
    +   * It is handy to be able to check what builtin was used: builtin_implementation()->name().
    +   */
    +  const implementation * builtin_implementation();
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_BUILTIN_IMPLEMENTATION_H
    +/* end file simdjson/builtin/implementation.h */
    +
    +/* skipped duplicate #include "simdjson/generic/dependencies.h" */
    +
    +/* defining SIMDJSON_CONDITIONAL_INCLUDE */
    +#define SIMDJSON_CONDITIONAL_INCLUDE
    +
    +#if SIMDJSON_BUILTIN_IMPLEMENTATION_IS(arm64)
    +/* including simdjson/arm64.h: #include "simdjson/arm64.h" */
    +/* begin file simdjson/arm64.h */
    +#ifndef SIMDJSON_ARM64_H
    +#define SIMDJSON_ARM64_H
    +
    +/* including simdjson/arm64/begin.h: #include "simdjson/arm64/begin.h" */
    +/* begin file simdjson/arm64/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "arm64" */
    +#define SIMDJSON_IMPLEMENTATION arm64
    +/* including simdjson/arm64/base.h: #include "simdjson/arm64/base.h" */
    +/* begin file simdjson/arm64/base.h */
    +#ifndef SIMDJSON_ARM64_BASE_H
    +#define SIMDJSON_ARM64_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +/**
    + * Implementation for NEON (ARMv8).
    + */
    +namespace arm64 {
    +
    +class implementation;
    +
    +namespace {
    +namespace simd {
    +template  struct simd8;
    +template  struct simd8x64;
    +} // namespace simd
    +} // unnamed namespace
    +
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ARM64_BASE_H
    +/* end file simdjson/arm64/base.h */
    +/* including simdjson/arm64/intrinsics.h: #include "simdjson/arm64/intrinsics.h" */
    +/* begin file simdjson/arm64/intrinsics.h */
    +#ifndef SIMDJSON_ARM64_INTRINSICS_H
    +#define SIMDJSON_ARM64_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This should be the correct header whether
    +// you use visual studio or other compilers.
    +#include 
    +
    +static_assert(sizeof(uint8x16_t) <= simdjson::SIMDJSON_PADDING, "insufficient padding for arm64");
    +
    +#endif //  SIMDJSON_ARM64_INTRINSICS_H
    +/* end file simdjson/arm64/intrinsics.h */
    +/* including simdjson/arm64/bitmanipulation.h: #include "simdjson/arm64/bitmanipulation.h" */
    +/* begin file simdjson/arm64/bitmanipulation.h */
    +#ifndef SIMDJSON_ARM64_BITMANIPULATION_H
    +#define SIMDJSON_ARM64_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long ret;
    +  // Search the mask data from least significant bit (LSB)
    +  // to the most significant bit (MSB) for a set bit (1).
    +  _BitScanForward64(&ret, input_num);
    +  return (int)ret;
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return input_num & (input_num-1);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long leading_zero = 0;
    +  // Search the mask data from most significant bit (MSB)
    +  // to least significant bit (LSB) for a set bit (1).
    +  if (_BitScanReverse64(&leading_zero, input_num))
    +    return (int)(63 - leading_zero);
    +  else
    +    return 64;
    +#else
    +  return __builtin_clzll(input_num);
    +#endif// SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int count_ones(uint64_t input_num) {
    +   return vaddv_u8(vcnt_u8(vcreate_u8(input_num)));
    +}
    +
    +
    +#if defined(__GNUC__) // catches clang and gcc
    +/**
    + * ARM has a fast 64-bit "bit reversal function" that is handy. However,
    + * it is not generally available as an intrinsic function under Visual
    + * Studio (though this might be changing). Even under clang/gcc, we
    + * apparently need to invoke inline assembly.
    + */
    +/*
    + * We use SIMDJSON_PREFER_REVERSE_BITS as a hint that algorithms that
    + * work well with bit reversal may use it.
    + */
    +#define SIMDJSON_PREFER_REVERSE_BITS 1
    +
    +/* reverse the bits */
    +simdjson_inline uint64_t reverse_bits(uint64_t input_num) {
    +  uint64_t rev_bits;
    +  __asm("rbit %0, %1" : "=r"(rev_bits) : "r"(input_num));
    +  return rev_bits;
    +}
    +
    +/**
    + * Flips bit at index 63 - lz. Thus if you have 'leading_zeroes' leading zeroes,
    + * then this will set to zero the leading bit. It is possible for leading_zeroes to be
    + * greating or equal to 63 in which case we trigger undefined behavior, but the output
    + * of such undefined behavior is never used.
    + **/
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +simdjson_inline uint64_t zero_leading_bit(uint64_t rev_bits, int leading_zeroes) {
    +  return rev_bits ^ (uint64_t(0x8000000000000000) >> leading_zeroes);
    +}
    +
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *result) {
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +  *result = value1 + value2;
    +  return *result < value1;
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ARM64_BITMANIPULATION_H
    +/* end file simdjson/arm64/bitmanipulation.h */
    +/* including simdjson/arm64/bitmask.h: #include "simdjson/arm64/bitmask.h" */
    +/* begin file simdjson/arm64/bitmask.h */
    +#ifndef SIMDJSON_ARM64_BITMASK_H
    +#define SIMDJSON_ARM64_BITMASK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +
    +//
    +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered.
    +//
    +// For example, prefix_xor(00100100) == 00011100
    +//
    +simdjson_inline uint64_t prefix_xor(uint64_t bitmask) {
    +  /////////////
    +  // We could do this with PMULL, but it is apparently slow.
    +  //
    +  //#ifdef __ARM_FEATURE_CRYPTO // some ARM processors lack this extension
    +  //return vmull_p64(-1ULL, bitmask);
    +  //#else
    +  // Analysis by @sebpop:
    +  // When diffing the assembly for src/stage1_find_marks.cpp I see that the eors are all spread out
    +  // in between other vector code, so effectively the extra cycles of the sequence do not matter
    +  // because the GPR units are idle otherwise and the critical path is on the FP side.
    +  // Also the PMULL requires two extra fmovs: GPR->FP (3 cycles in N1, 5 cycles in A72 )
    +  // and FP->GPR (2 cycles on N1 and 5 cycles on A72.)
    +  ///////////
    +  bitmask ^= bitmask << 1;
    +  bitmask ^= bitmask << 2;
    +  bitmask ^= bitmask << 4;
    +  bitmask ^= bitmask << 8;
    +  bitmask ^= bitmask << 16;
    +  bitmask ^= bitmask << 32;
    +  return bitmask;
    +}
    +
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif
    +/* end file simdjson/arm64/bitmask.h */
    +/* including simdjson/arm64/numberparsing_defs.h: #include "simdjson/arm64/numberparsing_defs.h" */
    +/* begin file simdjson/arm64/numberparsing_defs.h */
    +#ifndef SIMDJSON_ARM64_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_ARM64_NUMBERPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +#if _M_ARM64
    +// __umulh requires intrin.h
    +#include 
    +#endif // _M_ARM64
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace numberparsing {
    +
    +// we don't have SSE, so let us use a scalar function
    +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  uint64_t val;
    +  std::memcpy(&val, chars, sizeof(uint64_t));
    +  val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8;
    +  val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16;
    +  return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32);
    +}
    +
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif // SIMDJSON_ARM64_NUMBERPARSING_DEFS_H
    +/* end file simdjson/arm64/numberparsing_defs.h */
    +/* including simdjson/arm64/simd.h: #include "simdjson/arm64/simd.h" */
    +/* begin file simdjson/arm64/simd.h */
    +#ifndef SIMDJSON_ARM64_SIMD_H
    +#define SIMDJSON_ARM64_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +namespace simd {
    +
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +namespace {
    +// Start of private section with Visual Studio workaround
    +
    +
    +#ifndef simdjson_make_uint8x16_t
    +#define simdjson_make_uint8x16_t(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, \
    +                             x13, x14, x15, x16)                                   \
    +   ([=]() {                                                                        \
    +     uint8_t array[16] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8,                    \
    +                                 x9, x10, x11, x12, x13, x14, x15, x16};           \
    +     return vld1q_u8(array);                                                       \
    +   }())
    +#endif
    +#ifndef simdjson_make_int8x16_t
    +#define simdjson_make_int8x16_t(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, \
    +                             x13, x14, x15, x16)                                  \
    +   ([=]() {                                                                       \
    +     int8_t array[16] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8,                    \
    +                                 x9, x10, x11, x12, x13, x14, x15, x16};          \
    +     return vld1q_s8(array);                                                      \
    +   }())
    +#endif
    +
    +#ifndef simdjson_make_uint8x8_t
    +#define simdjson_make_uint8x8_t(x1, x2, x3, x4, x5, x6, x7, x8)                \
    +   ([=]() {                                                                    \
    +     uint8_t array[8] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8};                \
    +     return vld1_u8(array);                                                    \
    +   }())
    +#endif
    +#ifndef simdjson_make_int8x8_t
    +#define simdjson_make_int8x8_t(x1, x2, x3, x4, x5, x6, x7, x8)                 \
    +   ([=]() {                                                                    \
    +     int8_t array[8] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8};                 \
    +     return vld1_s8(array);                                                    \
    +   }())
    +#endif
    +#ifndef simdjson_make_uint16x8_t
    +#define simdjson_make_uint16x8_t(x1, x2, x3, x4, x5, x6, x7, x8)               \
    +   ([=]() {                                                                    \
    +     uint16_t array[8] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8};               \
    +     return vld1q_u16(array);                                                  \
    +   }())
    +#endif
    +#ifndef simdjson_make_int16x8_t
    +#define simdjson_make_int16x8_t(x1, x2, x3, x4, x5, x6, x7, x8)                \
    +   ([=]() {                                                                    \
    +     int16_t array[8] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8};                \
    +     return vld1q_s16(array);                                                  \
    +   }())
    +#endif
    +
    +// End of private section with Visual Studio workaround
    +} // namespace
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +
    +
    +  template
    +  struct simd8;
    +
    +  //
    +  // Base class of simd8 and simd8, both of which use uint8x16_t internally.
    +  //
    +  template>
    +  struct base_u8 {
    +    uint8x16_t value;
    +    static const int SIZE = sizeof(value);
    +
    +    // Conversion from/to SIMD register
    +    simdjson_inline base_u8(const uint8x16_t _value) : value(_value) {}
    +    simdjson_inline operator const uint8x16_t&() const { return this->value; }
    +    simdjson_inline operator uint8x16_t&() { return this->value; }
    +
    +    // Bit operations
    +    simdjson_inline simd8 operator|(const simd8 other) const { return vorrq_u8(*this, other); }
    +    simdjson_inline simd8 operator&(const simd8 other) const { return vandq_u8(*this, other); }
    +    simdjson_inline simd8 operator^(const simd8 other) const { return veorq_u8(*this, other); }
    +    simdjson_inline simd8 bit_andnot(const simd8 other) const { return vbicq_u8(*this, other); }
    +    simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +    simdjson_inline simd8& operator|=(const simd8 other) { auto this_cast = static_cast*>(this); *this_cast = *this_cast | other; return *this_cast; }
    +    simdjson_inline simd8& operator&=(const simd8 other) { auto this_cast = static_cast*>(this); *this_cast = *this_cast & other; return *this_cast; }
    +    simdjson_inline simd8& operator^=(const simd8 other) { auto this_cast = static_cast*>(this); *this_cast = *this_cast ^ other; return *this_cast; }
    +
    +    friend simdjson_inline Mask operator==(const simd8 lhs, const simd8 rhs) { return vceqq_u8(lhs, rhs); }
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +      return vextq_u8(prev_chunk, *this, 16 - N);
    +    }
    +  };
    +
    +  // SIMD byte mask type (returned by things like eq and gt)
    +  template<>
    +  struct simd8: base_u8 {
    +    typedef uint16_t bitmask_t;
    +    typedef uint32_t bitmask2_t;
    +
    +    static simdjson_inline simd8 splat(bool _value) { return vmovq_n_u8(uint8_t(-(!!_value))); }
    +
    +    simdjson_inline simd8(const uint8x16_t _value) : base_u8(_value) {}
    +    // False constructor
    +    simdjson_inline simd8() : simd8(vdupq_n_u8(0)) {}
    +    // Splat constructor
    +    simdjson_inline simd8(bool _value) : simd8(splat(_value)) {}
    +
    +    // We return uint32_t instead of uint16_t because that seems to be more efficient for most
    +    // purposes (cutting it down to uint16_t costs performance in some compilers).
    +    simdjson_inline uint32_t to_bitmask() const {
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +      const uint8x16_t bit_mask =  simdjson_make_uint8x16_t(0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
    +                                                   0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80);
    +#else
    +      const uint8x16_t bit_mask =  {0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
    +                                    0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80};
    +#endif
    +      auto minput = *this & bit_mask;
    +      uint8x16_t tmp = vpaddq_u8(minput, minput);
    +      tmp = vpaddq_u8(tmp, tmp);
    +      tmp = vpaddq_u8(tmp, tmp);
    +      return vgetq_lane_u16(vreinterpretq_u16_u8(tmp), 0);
    +    }
    +    simdjson_inline bool any() const { return vmaxvq_u8(*this) != 0; }
    +  };
    +
    +  // Unsigned bytes
    +  template<>
    +  struct simd8: base_u8 {
    +    static simdjson_inline uint8x16_t splat(uint8_t _value) { return vmovq_n_u8(_value); }
    +    static simdjson_inline uint8x16_t zero() { return vdupq_n_u8(0); }
    +    static simdjson_inline uint8x16_t load(const uint8_t* values) { return vld1q_u8(values); }
    +
    +    simdjson_inline simd8(const uint8x16_t _value) : base_u8(_value) {}
    +    // Zero constructor
    +    simdjson_inline simd8() : simd8(zero()) {}
    +    // Array constructor
    +    simdjson_inline simd8(const uint8_t values[16]) : simd8(load(values)) {}
    +    // Splat constructor
    +    simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +    // Member-by-member initialization
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) : simd8(simdjson_make_uint8x16_t(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +#else
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) : simd8(uint8x16_t{
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    }) {}
    +#endif
    +
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Store to array
    +    simdjson_inline void store(uint8_t dst[16]) const { return vst1q_u8(dst, *this); }
    +
    +    // Saturated math
    +    simdjson_inline simd8 saturating_add(const simd8 other) const { return vqaddq_u8(*this, other); }
    +    simdjson_inline simd8 saturating_sub(const simd8 other) const { return vqsubq_u8(*this, other); }
    +
    +    // Addition/subtraction are the same for signed and unsigned
    +    simdjson_inline simd8 operator+(const simd8 other) const { return vaddq_u8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return vsubq_u8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *this; }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *this; }
    +
    +    // Order-specific operations
    +    simdjson_inline uint8_t max_val() const { return vmaxvq_u8(*this); }
    +    simdjson_inline uint8_t min_val() const { return vminvq_u8(*this); }
    +    simdjson_inline simd8 max_val(const simd8 other) const { return vmaxq_u8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return vminq_u8(*this, other); }
    +    simdjson_inline simd8 operator<=(const simd8 other) const { return vcleq_u8(*this, other); }
    +    simdjson_inline simd8 operator>=(const simd8 other) const { return vcgeq_u8(*this, other); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return vcltq_u8(*this, other); }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return vcgtq_u8(*this, other); }
    +    // Same as >, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. For ARM, returns all 1's.
    +    simdjson_inline simd8 gt_bits(const simd8 other) const { return simd8(*this > other); }
    +    // Same as <, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. For ARM, returns all 1's.
    +    simdjson_inline simd8 lt_bits(const simd8 other) const { return simd8(*this < other); }
    +
    +    // Bit-specific operations
    +    simdjson_inline simd8 any_bits_set(simd8 bits) const { return vtstq_u8(*this, bits); }
    +    simdjson_inline bool any_bits_set_anywhere() const { return this->max_val() != 0; }
    +    simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return (*this & bits).any_bits_set_anywhere(); }
    +    template
    +    simdjson_inline simd8 shr() const { return vshrq_n_u8(*this, N); }
    +    template
    +    simdjson_inline simd8 shl() const { return vshlq_n_u8(*this, N); }
    +
    +    // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values)
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return lookup_table.apply_lookup_16_to(*this);
    +    }
    +
    +
    +    // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset).
    +    // Passing a 0 value for mask would be equivalent to writing out every byte to output.
    +    // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes
    +    // get written.
    +    // Design consideration: it seems like a function with the
    +    // signature simd8 compress(uint16_t mask) would be
    +    // sensible, but the AVX ISA makes this kind of approach difficult.
    +    template
    +    simdjson_inline void compress(uint16_t mask, L * output) const {
    +      using internal::thintable_epi8;
    +      using internal::BitsSetTable256mul2;
    +      using internal::pshufb_combine_table;
    +      // this particular implementation was inspired by work done by @animetosho
    +      // we do it in two steps, first 8 bytes and then second 8 bytes
    +      uint8_t mask1 = uint8_t(mask); // least significant 8 bits
    +      uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
    +      // next line just loads the 64-bit values thintable_epi8[mask1] and
    +      // thintable_epi8[mask2] into a 128-bit register, using only
    +      // two instructions on most compilers.
    +      uint64x2_t shufmask64 = {thintable_epi8[mask1], thintable_epi8[mask2]};
    +      uint8x16_t shufmask = vreinterpretq_u8_u64(shufmask64);
    +      // we increment by 0x08 the second half of the mask
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +      uint8x16_t inc = simdjson_make_uint8x16_t(0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08);
    +#else
    +      uint8x16_t inc = {0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08};
    +#endif
    +      shufmask = vaddq_u8(shufmask, inc);
    +      // this is the version "nearly pruned"
    +      uint8x16_t pruned = vqtbl1q_u8(*this, shufmask);
    +      // we still need to put the two halves together.
    +      // we compute the popcount of the first half:
    +      int pop1 = BitsSetTable256mul2[mask1];
    +      // then load the corresponding mask, what it does is to write
    +      // only the first pop1 bytes from the first 8 bytes, and then
    +      // it fills in with the bytes from the second 8 bytes + some filling
    +      // at the end.
    +      uint8x16_t compactmask = vld1q_u8(reinterpret_cast(pshufb_combine_table + pop1 * 8));
    +      uint8x16_t answer = vqtbl1q_u8(pruned, compactmask);
    +      vst1q_u8(reinterpret_cast(output), answer);
    +    }
    +
    +    // Copies all bytes corresponding to a 0 in the low half of the mask (interpreted as a
    +    // bitset) to output1, then those corresponding to a 0 in the high half to output2.
    +    template
    +    simdjson_inline void compress_halves(uint16_t mask, L *output1, L *output2) const {
    +      using internal::thintable_epi8;
    +      uint8_t mask1 = uint8_t(mask); // least significant 8 bits
    +      uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
    +      uint8x8_t compactmask1 = vcreate_u8(thintable_epi8[mask1]);
    +      uint8x8_t compactmask2 = vcreate_u8(thintable_epi8[mask2]);
    +      // we increment by 0x08 the second half of the mask
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +      uint8x8_t inc = simdjson_make_uint8x8_t(0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08);
    +#else
    +      uint8x8_t inc = {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08};
    +#endif
    +      compactmask2 = vadd_u8(compactmask2, inc);
    +      // store each result (with the second store possibly overlapping the first)
    +      vst1_u8((uint8_t*)output1, vqtbl1_u8(*this, compactmask1));
    +      vst1_u8((uint8_t*)output2, vqtbl1_u8(*this, compactmask2));
    +    }
    +
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +
    +    template
    +    simdjson_inline simd8 apply_lookup_16_to(const simd8 original) {
    +      return vqtbl1q_u8(*this, simd8(original));
    +    }
    +  };
    +
    +  // Signed bytes
    +  template<>
    +  struct simd8 {
    +    int8x16_t value;
    +
    +    static simdjson_inline simd8 splat(int8_t _value) { return vmovq_n_s8(_value); }
    +    static simdjson_inline simd8 zero() { return vdupq_n_s8(0); }
    +    static simdjson_inline simd8 load(const int8_t values[16]) { return vld1q_s8(values); }
    +
    +    // Conversion from/to SIMD register
    +    simdjson_inline simd8(const int8x16_t _value) : value{_value} {}
    +    simdjson_inline operator const int8x16_t&() const { return this->value; }
    +    simdjson_inline operator int8x16_t&() { return this->value; }
    +
    +    // Zero constructor
    +    simdjson_inline simd8() : simd8(zero()) {}
    +    // Splat constructor
    +    simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const int8_t* values) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3, int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) : simd8(simdjson_make_int8x16_t(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +#else
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3, int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) : simd8(int8x16_t{
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    }) {}
    +#endif
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Store to array
    +    simdjson_inline void store(int8_t dst[16]) const { return vst1q_s8(dst, *this); }
    +
    +    // Explicit conversion to/from unsigned
    +    //
    +    // Under Visual Studio/ARM64 uint8x16_t and int8x16_t are apparently the same type.
    +    // In theory, we could check this occurrence with std::same_as and std::enabled_if but it is C++14
    +    // and relatively ugly and hard to read.
    +#ifndef SIMDJSON_REGULAR_VISUAL_STUDIO
    +    simdjson_inline explicit simd8(const uint8x16_t other): simd8(vreinterpretq_s8_u8(other)) {}
    +#endif
    +    simdjson_inline explicit operator simd8() const { return vreinterpretq_u8_s8(this->value); }
    +
    +    // Math
    +    simdjson_inline simd8 operator+(const simd8 other) const { return vaddq_s8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return vsubq_s8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *this; }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *this; }
    +
    +    // Order-sensitive comparisons
    +    simdjson_inline simd8 max_val(const simd8 other) const { return vmaxq_s8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return vminq_s8(*this, other); }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return vcgtq_s8(*this, other); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return vcltq_s8(*this, other); }
    +    simdjson_inline simd8 operator==(const simd8 other) const { return vceqq_s8(*this, other); }
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +      return vextq_s8(prev_chunk, *this, 16 - N);
    +    }
    +
    +    // Perform a lookup assuming no value is larger than 16
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return lookup_table.apply_lookup_16_to(*this);
    +    }
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +
    +    template
    +    simdjson_inline simd8 apply_lookup_16_to(const simd8 original) {
    +      return vqtbl1q_s8(*this, simd8(original));
    +    }
    +  };
    +
    +  template
    +  struct simd8x64 {
    +    static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +    static_assert(NUM_CHUNKS == 4, "ARM kernel should use four registers per 64-byte block.");
    +    const simd8 chunks[NUM_CHUNKS];
    +
    +    simd8x64(const simd8x64& o) = delete; // no copy allowed
    +    simd8x64& operator=(const simd8& other) = delete; // no assignment allowed
    +    simd8x64() = delete; // no default constructor allowed
    +
    +    simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1, const simd8 chunk2, const simd8 chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {}
    +    simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8::load(ptr), simd8::load(ptr+16), simd8::load(ptr+32), simd8::load(ptr+48)} {}
    +
    +    simdjson_inline void store(T ptr[64]) const {
    +      this->chunks[0].store(ptr+sizeof(simd8)*0);
    +      this->chunks[1].store(ptr+sizeof(simd8)*1);
    +      this->chunks[2].store(ptr+sizeof(simd8)*2);
    +      this->chunks[3].store(ptr+sizeof(simd8)*3);
    +    }
    +
    +    simdjson_inline simd8 reduce_or() const {
    +      return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]);
    +    }
    +
    +
    +    simdjson_inline uint64_t compress(uint64_t mask, T * output) const {
    +      uint64_t popcounts = vget_lane_u64(vreinterpret_u64_u8(vcnt_u8(vcreate_u8(~mask))), 0);
    +      // compute the prefix sum of the popcounts of each byte
    +      uint64_t offsets = popcounts * 0x0101010101010101;
    +      this->chunks[0].compress_halves(uint16_t(mask), output, &output[popcounts & 0xFF]);
    +      this->chunks[1].compress_halves(uint16_t(mask >> 16), &output[(offsets >> 8) & 0xFF], &output[(offsets >> 16) & 0xFF]);
    +      this->chunks[2].compress_halves(uint16_t(mask >> 32), &output[(offsets >> 24) & 0xFF], &output[(offsets >> 32) & 0xFF]);
    +      this->chunks[3].compress_halves(uint16_t(mask >> 48), &output[(offsets >> 40) & 0xFF], &output[(offsets >> 48) & 0xFF]);
    +      return offsets >> 56;
    +    }
    +
    +    simdjson_inline uint64_t to_bitmask() const {
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +      const uint8x16_t bit_mask = simdjson_make_uint8x16_t(
    +        0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
    +        0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80
    +      );
    +#else
    +      const uint8x16_t bit_mask = {
    +        0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
    +        0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80
    +      };
    +#endif
    +      // Add each of the elements next to each other, successively, to stuff each 8 byte mask into one.
    +      uint8x16_t sum0 = vpaddq_u8(this->chunks[0] & bit_mask, this->chunks[1] & bit_mask);
    +      uint8x16_t sum1 = vpaddq_u8(this->chunks[2] & bit_mask, this->chunks[3] & bit_mask);
    +      sum0 = vpaddq_u8(sum0, sum1);
    +      sum0 = vpaddq_u8(sum0, sum0);
    +      return vgetq_lane_u64(vreinterpretq_u64_u8(sum0), 0);
    +    }
    +
    +    simdjson_inline uint64_t eq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] == mask,
    +        this->chunks[1] == mask,
    +        this->chunks[2] == mask,
    +        this->chunks[3] == mask
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t lteq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] <= mask,
    +        this->chunks[1] <= mask,
    +        this->chunks[2] <= mask,
    +        this->chunks[3] <= mask
    +      ).to_bitmask();
    +    }
    +  }; // struct simd8x64
    +
    +} // namespace simd
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ARM64_SIMD_H
    +/* end file simdjson/arm64/simd.h */
    +/* including simdjson/arm64/stringparsing_defs.h: #include "simdjson/arm64/stringparsing_defs.h" */
    +/* begin file simdjson/arm64/stringparsing_defs.h */
    +#ifndef SIMDJSON_ARM64_STRINGPARSING_DEFS_H
    +#define SIMDJSON_ARM64_STRINGPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/simd.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +
    +using namespace simd;
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 32;
    +  simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; }
    +  simdjson_inline bool has_backslash() { return bs_bits != 0; }
    +  simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); }
    +  simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); }
    +
    +  uint32_t bs_bits;
    +  uint32_t quote_bits;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // this can read up to 31 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes");
    +  simd8 v0(src);
    +  simd8 v1(src + sizeof(v0));
    +  v0.store(dst);
    +  v1.store(dst + sizeof(v0));
    +
    +  // Getting a 64-bit bitmask is much cheaper than multiple 16-bit bitmasks on ARM; therefore, we
    +  // smash them together into a 64-byte mask and get the bitmask from there.
    +  uint64_t bs_and_quote = simd8x64(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask();
    +  return {
    +    uint32_t(bs_and_quote),      // bs_bits
    +    uint32_t(bs_and_quote >> 32) // quote_bits
    +  };
    +}
    +
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ARM64_STRINGPARSING_DEFS_H
    +/* end file simdjson/arm64/stringparsing_defs.h */
    +
    +#define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1
    +/* end file simdjson/arm64/begin.h */
    +/* including simdjson/generic/amalgamated.h for arm64: #include "simdjson/generic/amalgamated.h" */
    +/* begin file simdjson/generic/amalgamated.h for arm64 */
    +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_DEPENDENCIES_H)
    +#error simdjson/generic/dependencies.h must be included before simdjson/generic/amalgamated.h!
    +#endif
    +
    +/* including simdjson/generic/base.h for arm64: #include "simdjson/generic/base.h" */
    +/* begin file simdjson/generic/base.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): // If we haven't got an implementation yet, we're in the editor, editing a generic file! Just */
    +/* amalgamation skipped (editor-only): // use the most advanced one we can so the most possible stuff can be tested. */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation_detection.h" */
    +/* amalgamation skipped (editor-only): #if SIMDJSON_IMPLEMENTATION_ICELAKE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_HASWELL */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_WESTMERE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_ARM64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */
    +/* amalgamation skipped (editor-only): #else */
    +/* amalgamation skipped (editor-only): #error "All possible implementations (including fallback) have been disabled! simdjson will not run." */
    +/* amalgamation skipped (editor-only): #endif */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +
    +struct open_container;
    +class dom_parser_implementation;
    +
    +/**
    + * The type of a JSON number
    + */
    +enum class number_type {
    +    floating_point_number=1, /// a binary64 number
    +    signed_integer,          /// a signed integer that fits in a 64-bit word using two's complement
    +    unsigned_integer         /// a positive integer larger or equal to 1<<63
    +};
    +
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_BASE_H
    +/* end file simdjson/generic/base.h for arm64 */
    +/* including simdjson/generic/jsoncharutils.h for arm64: #include "simdjson/generic/jsoncharutils.h" */
    +/* begin file simdjson/generic/jsoncharutils.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_JSONCHARUTILS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_JSONCHARUTILS_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/jsoncharutils_tables.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +namespace jsoncharutils {
    +
    +// return non-zero if not a structural or whitespace char
    +// zero otherwise
    +simdjson_inline uint32_t is_not_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace_negated[c];
    +}
    +
    +simdjson_inline uint32_t is_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace[c];
    +}
    +
    +// returns a value with the high 16 bits set if not valid
    +// otherwise returns the conversion of the 4 hex digits at src into the bottom
    +// 16 bits of the 32-bit return register
    +//
    +// see
    +// https://lemire.me/blog/2019/04/17/parsing-short-hexadecimal-strings-efficiently/
    +static inline uint32_t hex_to_u32_nocheck(
    +    const uint8_t *src) { // strictly speaking, static inline is a C-ism
    +  uint32_t v1 = internal::digit_to_val32[630 + src[0]];
    +  uint32_t v2 = internal::digit_to_val32[420 + src[1]];
    +  uint32_t v3 = internal::digit_to_val32[210 + src[2]];
    +  uint32_t v4 = internal::digit_to_val32[0 + src[3]];
    +  return v1 | v2 | v3 | v4;
    +}
    +
    +// given a code point cp, writes to c
    +// the utf-8 code, outputting the length in
    +// bytes, if the length is zero, the code point
    +// is invalid
    +//
    +// This can possibly be made faster using pdep
    +// and clz and table lookups, but JSON documents
    +// have few escaped code points, and the following
    +// function looks cheap.
    +//
    +// Note: we assume that surrogates are treated separately
    +//
    +simdjson_inline size_t codepoint_to_utf8(uint32_t cp, uint8_t *c) {
    +  if (cp <= 0x7F) {
    +    c[0] = uint8_t(cp);
    +    return 1; // ascii
    +  }
    +  if (cp <= 0x7FF) {
    +    c[0] = uint8_t((cp >> 6) + 192);
    +    c[1] = uint8_t((cp & 63) + 128);
    +    return 2; // universal plane
    +    //  Surrogates are treated elsewhere...
    +    //} //else if (0xd800 <= cp && cp <= 0xdfff) {
    +    //  return 0; // surrogates // could put assert here
    +  } else if (cp <= 0xFFFF) {
    +    c[0] = uint8_t((cp >> 12) + 224);
    +    c[1] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[2] = uint8_t((cp & 63) + 128);
    +    return 3;
    +  } else if (cp <= 0x10FFFF) { // if you know you have a valid code point, this
    +                               // is not needed
    +    c[0] = uint8_t((cp >> 18) + 240);
    +    c[1] = uint8_t(((cp >> 12) & 63) + 128);
    +    c[2] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[3] = uint8_t((cp & 63) + 128);
    +    return 4;
    +  }
    +  // will return 0 when the code point was too large.
    +  return 0; // bad r
    +}
    +
    +#if SIMDJSON_IS_32BITS // _umul128 for x86, arm
    +// this is a slow emulation routine for 32-bit
    +//
    +static simdjson_inline uint64_t __emulu(uint32_t x, uint32_t y) {
    +  return x * (uint64_t)y;
    +}
    +static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) {
    +  uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd);
    +  uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd);
    +  uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32));
    +  uint64_t adbc_carry = !!(adbc < ad);
    +  uint64_t lo = bd + (adbc << 32);
    +  *hi = __emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) +
    +        (adbc_carry << 32) + !!(lo < bd);
    +  return lo;
    +}
    +#endif
    +
    +} // namespace jsoncharutils
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_JSONCHARUTILS_H
    +/* end file simdjson/generic/jsoncharutils.h for arm64 */
    +/* including simdjson/generic/atomparsing.h for arm64: #include "simdjson/generic/atomparsing.h" */
    +/* begin file simdjson/generic/atomparsing.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ATOMPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ATOMPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +/// @private
    +namespace atomparsing {
    +
    +// The string_to_uint32 is exclusively used to map literal strings to 32-bit values.
    +// We use memcpy instead of a pointer cast to avoid undefined behaviors since we cannot
    +// be certain that the character pointer will be properly aligned.
    +// You might think that using memcpy makes this function expensive, but you'd be wrong.
    +// All decent optimizing compilers (GCC, clang, Visual Studio) will compile string_to_uint32("false");
    +// to the compile-time constant 1936482662.
    +simdjson_inline uint32_t string_to_uint32(const char* str) { uint32_t val; std::memcpy(&val, str, sizeof(uint32_t)); return val; }
    +
    +
    +// Again in str4ncmp we use a memcpy to avoid undefined behavior. The memcpy may appear expensive.
    +// Yet all decent optimizing compilers will compile memcpy to a single instruction, just about.
    +simdjson_warn_unused
    +simdjson_inline uint32_t str4ncmp(const uint8_t *src, const char* atom) {
    +  uint32_t srcval; // we want to avoid unaligned 32-bit loads (undefined in C/C++)
    +  static_assert(sizeof(uint32_t) <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be larger than 4 bytes");
    +  std::memcpy(&srcval, src, sizeof(uint32_t));
    +  return srcval ^ string_to_uint32(atom);
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "true") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_true_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "true"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src) {
    +  return (str4ncmp(src+1, "alse") | jsoncharutils::is_not_structural_or_whitespace(src[5])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src, size_t len) {
    +  if (len > 5) { return is_valid_false_atom(src); }
    +  else if (len == 5) { return !str4ncmp(src+1, "alse"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "null") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_null_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "null"); }
    +  else { return false; }
    +}
    +
    +} // namespace atomparsing
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ATOMPARSING_H
    +/* end file simdjson/generic/atomparsing.h for arm64 */
    +/* including simdjson/generic/dom_parser_implementation.h for arm64: #include "simdjson/generic/dom_parser_implementation.h" */
    +/* begin file simdjson/generic/dom_parser_implementation.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +
    +// expectation: sizeof(open_container) = 64/8.
    +struct open_container {
    +  uint32_t tape_index; // where, on the tape, does the scope ([,{) begins
    +  uint32_t count; // how many elements in the scope
    +}; // struct open_container
    +
    +static_assert(sizeof(open_container) == 64/8, "Open container must be 64 bits");
    +
    +class dom_parser_implementation final : public internal::dom_parser_implementation {
    +public:
    +  /** Tape location of each open { or [ */
    +  std::unique_ptr open_containers{};
    +  /** Whether each open container is a [ or { */
    +  std::unique_ptr is_array{};
    +  /** Buffer passed to stage 1 */
    +  const uint8_t *buf{};
    +  /** Length passed to stage 1 */
    +  size_t len{0};
    +  /** Document passed to stage 2 */
    +  dom::document *doc{};
    +
    +  inline dom_parser_implementation() noexcept;
    +  inline dom_parser_implementation(dom_parser_implementation &&other) noexcept;
    +  inline dom_parser_implementation &operator=(dom_parser_implementation &&other) noexcept;
    +  dom_parser_implementation(const dom_parser_implementation &) = delete;
    +  dom_parser_implementation &operator=(const dom_parser_implementation &) = delete;
    +
    +  simdjson_warn_unused error_code parse(const uint8_t *buf, size_t len, dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage1(const uint8_t *buf, size_t len, stage1_mode partial) noexcept final;
    +  simdjson_warn_unused error_code stage2(dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage2_next(dom::document &doc) noexcept final;
    +  simdjson_warn_unused uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) const noexcept final;
    +  simdjson_warn_unused uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept final;
    +  inline simdjson_warn_unused error_code set_capacity(size_t capacity) noexcept final;
    +  inline simdjson_warn_unused error_code set_max_depth(size_t max_depth) noexcept final;
    +private:
    +  simdjson_inline simdjson_warn_unused error_code set_capacity_stage1(size_t capacity);
    +
    +};
    +
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +namespace arm64 {
    +
    +inline dom_parser_implementation::dom_parser_implementation() noexcept = default;
    +inline dom_parser_implementation::dom_parser_implementation(dom_parser_implementation &&other) noexcept = default;
    +inline dom_parser_implementation &dom_parser_implementation::operator=(dom_parser_implementation &&other) noexcept = default;
    +
    +// Leaving these here so they can be inlined if so desired
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_capacity(size_t capacity) noexcept {
    +  if(capacity > SIMDJSON_MAXSIZE_BYTES) { return CAPACITY; }
    +  // Stage 1 index output
    +  size_t max_structures = SIMDJSON_ROUNDUP_N(capacity, 64) + 2 + 7;
    +  structural_indexes.reset( new (std::nothrow) uint32_t[max_structures] );
    +  if (!structural_indexes) { _capacity = 0; return MEMALLOC; }
    +  structural_indexes[0] = 0;
    +  n_structural_indexes = 0;
    +
    +  _capacity = capacity;
    +  return SUCCESS;
    +}
    +
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_max_depth(size_t max_depth) noexcept {
    +  // Stage 2 stacks
    +  open_containers.reset(new (std::nothrow) open_container[max_depth]);
    +  is_array.reset(new (std::nothrow) bool[max_depth]);
    +  if (!is_array || !open_containers) { _max_depth = 0; return MEMALLOC; }
    +
    +  _max_depth = max_depth;
    +  return SUCCESS;
    +}
    +
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +/* end file simdjson/generic/dom_parser_implementation.h for arm64 */
    +/* including simdjson/generic/implementation_simdjson_result_base.h for arm64: #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +
    +// This is a near copy of include/error.h's implementation_simdjson_result_base, except it doesn't use std::pair
    +// so we can avoid inlining errors
    +// TODO reconcile these!
    +/**
    + * The result of a simdjson operation that could fail.
    + *
    + * Gives the option of reading error codes, or throwing an exception by casting to the desired result.
    + *
    + * This is a base class for implementations that want to add functions to the result type for
    + * chaining.
    + *
    + * Override like:
    + *
    + *   struct simdjson_result : public internal::implementation_simdjson_result_base {
    + *     simdjson_result() noexcept : internal::implementation_simdjson_result_base() {}
    + *     simdjson_result(error_code error) noexcept : internal::implementation_simdjson_result_base(error) {}
    + *     simdjson_result(T &&value) noexcept : internal::implementation_simdjson_result_base(std::forward(value)) {}
    + *     simdjson_result(T &&value, error_code error) noexcept : internal::implementation_simdjson_result_base(value, error) {}
    + *     // Your extra methods here
    + *   }
    + *
    + * Then any method returning simdjson_result will be chainable with your methods.
    + */
    +template
    +struct implementation_simdjson_result_base {
    +
    +  /**
    +   * Create a new empty result with error = UNINITIALIZED.
    +   */
    +  simdjson_inline implementation_simdjson_result_base() noexcept = default;
    +
    +  /**
    +   * Create a new error result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(error_code error) noexcept;
    +
    +  /**
    +   * Create a new successful result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value) noexcept;
    +
    +  /**
    +   * Create a new result with both things (use if you don't want to branch when creating the result).
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value, error_code error) noexcept;
    +
    +  /**
    +   * Move the value and the error to the provided variables.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   * @param error The variable to assign the error to. Set to SUCCESS if there is no error.
    +   */
    +  simdjson_inline void tie(T &value, error_code &error) && noexcept;
    +
    +  /**
    +   * Move the value to the provided variable.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   */
    +  simdjson_inline error_code get(T &value) && noexcept;
    +
    +  /**
    +   * The error.
    +   */
    +  simdjson_inline error_code error() const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value.
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T& value() & noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& value() && noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& take_value() && noexcept(false);
    +
    +  /**
    +   * Cast to the value (will throw on error).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline operator T&&() && noexcept(false);
    +
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline const T& value_unsafe() const& noexcept;
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T& value_unsafe() & noexcept;
    +  /**
    +   * Take the result value (move it). This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T&& value_unsafe() && noexcept;
    +protected:
    +  /** users should never directly access first and second. **/
    +  T first{}; /** Users should never directly access 'first'. **/
    +  error_code second{UNINITIALIZED}; /** Users should never directly access 'second'. **/
    +}; // struct implementation_simdjson_result_base
    +
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +/* end file simdjson/generic/implementation_simdjson_result_base.h for arm64 */
    +/* including simdjson/generic/numberparsing.h for arm64: #include "simdjson/generic/numberparsing.h" */
    +/* begin file simdjson/generic/numberparsing.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_NUMBERPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_NUMBERPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace numberparsing {
    +
    +#ifdef JSON_TEST_NUMBERS
    +#define INVALID_NUMBER(SRC) (found_invalid_number((SRC)), NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (found_integer((VALUE), (SRC)), (WRITER).append_s64((VALUE)))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (found_unsigned_integer((VALUE), (SRC)), (WRITER).append_u64((VALUE)))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (found_float((VALUE), (SRC)), (WRITER).append_double((VALUE)))
    +#else
    +#define INVALID_NUMBER(SRC) (NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (WRITER).append_s64((VALUE))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (WRITER).append_u64((VALUE))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (WRITER).append_double((VALUE))
    +#endif
    +
    +namespace {
    +
    +// Convert a mantissa, an exponent and a sign bit into an ieee64 double.
    +// The real_exponent needs to be in [0, 2046] (technically real_exponent = 2047 would be acceptable).
    +// The mantissa should be in [0,1<<53). The bit at index (1ULL << 52) while be zeroed.
    +simdjson_inline double to_double(uint64_t mantissa, uint64_t real_exponent, bool negative) {
    +    double d;
    +    mantissa &= ~(1ULL << 52);
    +    mantissa |= real_exponent << 52;
    +    mantissa |= ((static_cast(negative)) << 63);
    +    std::memcpy(&d, &mantissa, sizeof(d));
    +    return d;
    +}
    +
    +// Attempts to compute i * 10^(power) exactly; and if "negative" is
    +// true, negate the result.
    +// This function will only work in some cases, when it does not work, success is
    +// set to false. This should work *most of the time* (like 99% of the time).
    +// We assume that power is in the [smallest_power,
    +// largest_power] interval: the caller is responsible for this check.
    +simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative, double &d) {
    +  // we start with a fast path
    +  // It was described in
    +  // Clinger WD. How to read floating point numbers accurately.
    +  // ACM SIGPLAN Notices. 1990
    +#ifndef FLT_EVAL_METHOD
    +#error "FLT_EVAL_METHOD should be defined, please include cfloat."
    +#endif
    +#if (FLT_EVAL_METHOD != 1) && (FLT_EVAL_METHOD != 0)
    +  // We cannot be certain that x/y is rounded to nearest.
    +  if (0 <= power && power <= 22 && i <= 9007199254740991)
    +#else
    +  if (-22 <= power && power <= 22 && i <= 9007199254740991)
    +#endif
    +  {
    +    // convert the integer into a double. This is lossless since
    +    // 0 <= i <= 2^53 - 1.
    +    d = double(i);
    +    //
    +    // The general idea is as follows.
    +    // If 0 <= s < 2^53 and if 10^0 <= p <= 10^22 then
    +    // 1) Both s and p can be represented exactly as 64-bit floating-point
    +    // values
    +    // (binary64).
    +    // 2) Because s and p can be represented exactly as floating-point values,
    +    // then s * p
    +    // and s / p will produce correctly rounded values.
    +    //
    +    if (power < 0) {
    +      d = d / simdjson::internal::power_of_ten[-power];
    +    } else {
    +      d = d * simdjson::internal::power_of_ten[power];
    +    }
    +    if (negative) {
    +      d = -d;
    +    }
    +    return true;
    +  }
    +  // When 22 < power && power <  22 + 16, we could
    +  // hope for another, secondary fast path.  It was
    +  // described by David M. Gay in  "Correctly rounded
    +  // binary-decimal and decimal-binary conversions." (1990)
    +  // If you need to compute i * 10^(22 + x) for x < 16,
    +  // first compute i * 10^x, if you know that result is exact
    +  // (e.g., when i * 10^x < 2^53),
    +  // then you can still proceed and do (i * 10^x) * 10^22.
    +  // Is this worth your time?
    +  // You need  22 < power *and* power <  22 + 16 *and* (i * 10^(x-22) < 2^53)
    +  // for this second fast path to work.
    +  // If you you have 22 < power *and* power <  22 + 16, and then you
    +  // optimistically compute "i * 10^(x-22)", there is still a chance that you
    +  // have wasted your time if i * 10^(x-22) >= 2^53. It makes the use cases of
    +  // this optimization maybe less common than we would like. Source:
    +  // http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/
    +  // also used in RapidJSON: https://rapidjson.org/strtod_8h_source.html
    +
    +  // The fast path has now failed, so we are failing back on the slower path.
    +
    +  // In the slow path, we need to adjust i so that it is > 1<<63 which is always
    +  // possible, except if i == 0, so we handle i == 0 separately.
    +  if(i == 0) {
    +    d = negative ? -0.0 : 0.0;
    +    return true;
    +  }
    +
    +
    +  // The exponent is 1024 + 63 + power
    +  //     + floor(log(5**power)/log(2)).
    +  // The 1024 comes from the ieee64 standard.
    +  // The 63 comes from the fact that we use a 64-bit word.
    +  //
    +  // Computing floor(log(5**power)/log(2)) could be
    +  // slow. Instead we use a fast function.
    +  //
    +  // For power in (-400,350), we have that
    +  // (((152170 + 65536) * power ) >> 16);
    +  // is equal to
    +  //  floor(log(5**power)/log(2)) + power when power >= 0
    +  // and it is equal to
    +  //  ceil(log(5**-power)/log(2)) + power when power < 0
    +  //
    +  // The 65536 is (1<<16) and corresponds to
    +  // (65536 * power) >> 16 ---> power
    +  //
    +  // ((152170 * power ) >> 16) is equal to
    +  // floor(log(5**power)/log(2))
    +  //
    +  // Note that this is not magic: 152170/(1<<16) is
    +  // approximatively equal to log(5)/log(2).
    +  // The 1<<16 value is a power of two; we could use a
    +  // larger power of 2 if we wanted to.
    +  //
    +  int64_t exponent = (((152170 + 65536) * power) >> 16) + 1024 + 63;
    +
    +
    +  // We want the most significant bit of i to be 1. Shift if needed.
    +  int lz = leading_zeroes(i);
    +  i <<= lz;
    +
    +
    +  // We are going to need to do some 64-bit arithmetic to get a precise product.
    +  // We use a table lookup approach.
    +  // It is safe because
    +  // power >= smallest_power
    +  // and power <= largest_power
    +  // We recover the mantissa of the power, it has a leading 1. It is always
    +  // rounded down.
    +  //
    +  // We want the most significant 64 bits of the product. We know
    +  // this will be non-zero because the most significant bit of i is
    +  // 1.
    +  const uint32_t index = 2 * uint32_t(power - simdjson::internal::smallest_power);
    +  // Optimization: It may be that materializing the index as a variable might confuse some compilers and prevent effective complex-addressing loads. (Done for code clarity.)
    +  //
    +  // The full_multiplication function computes the 128-bit product of two 64-bit words
    +  // with a returned value of type value128 with a "low component" corresponding to the
    +  // 64-bit least significant bits of the product and with a "high component" corresponding
    +  // to the 64-bit most significant bits of the product.
    +  simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
    +  // Both i and power_of_five_128[index] have their most significant bit set to 1 which
    +  // implies that the either the most or the second most significant bit of the product
    +  // is 1. We pack values in this manner for efficiency reasons: it maximizes the use
    +  // we make of the product. It also makes it easy to reason about the product: there
    +  // is 0 or 1 leading zero in the product.
    +
    +  // Unless the least significant 9 bits of the high (64-bit) part of the full
    +  // product are all 1s, then we know that the most significant 55 bits are
    +  // exact and no further work is needed. Having 55 bits is necessary because
    +  // we need 53 bits for the mantissa but we have to have one rounding bit and
    +  // we can waste a bit if the most significant bit of the product is zero.
    +  if((firstproduct.high & 0x1FF) == 0x1FF) {
    +    // We want to compute i * 5^q, but only care about the top 55 bits at most.
    +    // Consider the scenario where q>=0. Then 5^q may not fit in 64-bits. Doing
    +    // the full computation is wasteful. So we do what is called a "truncated
    +    // multiplication".
    +    // We take the most significant 64-bits, and we put them in
    +    // power_of_five_128[index]. Usually, that's good enough to approximate i * 5^q
    +    // to the desired approximation using one multiplication. Sometimes it does not suffice.
    +    // Then we store the next most significant 64 bits in power_of_five_128[index + 1], and
    +    // then we get a better approximation to i * 5^q.
    +    //
    +    // That's for when q>=0. The logic for q<0 is somewhat similar but it is somewhat
    +    // more complicated.
    +    //
    +    // There is an extra layer of complexity in that we need more than 55 bits of
    +    // accuracy in the round-to-even scenario.
    +    //
    +    // The full_multiplication function computes the 128-bit product of two 64-bit words
    +    // with a returned value of type value128 with a "low component" corresponding to the
    +    // 64-bit least significant bits of the product and with a "high component" corresponding
    +    // to the 64-bit most significant bits of the product.
    +    simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
    +    firstproduct.low += secondproduct.high;
    +    if(secondproduct.high > firstproduct.low) { firstproduct.high++; }
    +    // As it has been proven by Noble Mushtak and Daniel Lemire in "Fast Number Parsing Without
    +    // Fallback" (https://arxiv.org/abs/2212.06644), at this point we are sure that the product
    +    // is sufficiently accurate, and more computation is not needed.
    +  }
    +  uint64_t lower = firstproduct.low;
    +  uint64_t upper = firstproduct.high;
    +  // The final mantissa should be 53 bits with a leading 1.
    +  // We shift it so that it occupies 54 bits with a leading 1.
    +  ///////
    +  uint64_t upperbit = upper >> 63;
    +  uint64_t mantissa = upper >> (upperbit + 9);
    +  lz += int(1 ^ upperbit);
    +
    +  // Here we have mantissa < (1<<54).
    +  int64_t real_exponent = exponent - lz;
    +  if (simdjson_unlikely(real_exponent <= 0)) { // we have a subnormal?
    +    // Here have that real_exponent <= 0 so -real_exponent >= 0
    +    if(-real_exponent + 1 >= 64) { // if we have more than 64 bits below the minimum exponent, you have a zero for sure.
    +      d = negative ? -0.0 : 0.0;
    +      return true;
    +    }
    +    // next line is safe because -real_exponent + 1 < 0
    +    mantissa >>= -real_exponent + 1;
    +    // Thankfully, we can't have both "round-to-even" and subnormals because
    +    // "round-to-even" only occurs for powers close to 0.
    +    mantissa += (mantissa & 1); // round up
    +    mantissa >>= 1;
    +    // There is a weird scenario where we don't have a subnormal but just.
    +    // Suppose we start with 2.2250738585072013e-308, we end up
    +    // with 0x3fffffffffffff x 2^-1023-53 which is technically subnormal
    +    // whereas 0x40000000000000 x 2^-1023-53  is normal. Now, we need to round
    +    // up 0x3fffffffffffff x 2^-1023-53  and once we do, we are no longer
    +    // subnormal, but we can only know this after rounding.
    +    // So we only declare a subnormal if we are smaller than the threshold.
    +    real_exponent = (mantissa < (uint64_t(1) << 52)) ? 0 : 1;
    +    d = to_double(mantissa, real_exponent, negative);
    +    return true;
    +  }
    +  // We have to round to even. The "to even" part
    +  // is only a problem when we are right in between two floats
    +  // which we guard against.
    +  // If we have lots of trailing zeros, we may fall right between two
    +  // floating-point values.
    +  //
    +  // The round-to-even cases take the form of a number 2m+1 which is in (2^53,2^54]
    +  // times a power of two. That is, it is right between a number with binary significand
    +  // m and another number with binary significand m+1; and it must be the case
    +  // that it cannot be represented by a float itself.
    +  //
    +  // We must have that w * 10 ^q == (2m+1) * 2^p for some power of two 2^p.
    +  // Recall that 10^q = 5^q * 2^q.
    +  // When q >= 0, we must have that (2m+1) is divible by 5^q, so 5^q <= 2^54. We have that
    +  //  5^23 <=  2^54 and it is the last power of five to qualify, so q <= 23.
    +  // When q<0, we have  w  >=  (2m+1) x 5^{-q}.  We must have that w<2^{64} so
    +  // (2m+1) x 5^{-q} < 2^{64}. We have that 2m+1>2^{53}. Hence, we must have
    +  // 2^{53} x 5^{-q} < 2^{64}.
    +  // Hence we have 5^{-q} < 2^{11}$ or q>= -4.
    +  //
    +  // We require lower <= 1 and not lower == 0 because we could not prove that
    +  // that lower == 0 is implied; but we could prove that lower <= 1 is a necessary and sufficient test.
    +  if (simdjson_unlikely((lower <= 1) && (power >= -4) && (power <= 23) && ((mantissa & 3) == 1))) {
    +    if((mantissa  << (upperbit + 64 - 53 - 2)) ==  upper) {
    +      mantissa &= ~1;             // flip it so that we do not round up
    +    }
    +  }
    +
    +  mantissa += mantissa & 1;
    +  mantissa >>= 1;
    +
    +  // Here we have mantissa < (1<<53), unless there was an overflow
    +  if (mantissa >= (1ULL << 53)) {
    +    //////////
    +    // This will happen when parsing values such as 7.2057594037927933e+16
    +    ////////
    +    mantissa = (1ULL << 52);
    +    real_exponent++;
    +  }
    +  mantissa &= ~(1ULL << 52);
    +  // we have to check that real_exponent is in range, otherwise we bail out
    +  if (simdjson_unlikely(real_exponent > 2046)) {
    +    // We have an infinite value!!! We could actually throw an error here if we could.
    +    return false;
    +  }
    +  d = to_double(mantissa, real_exponent, negative);
    +  return true;
    +}
    +
    +// We call a fallback floating-point parser that might be slow. Note
    +// it will accept JSON numbers, but the JSON spec. is more restrictive so
    +// before you call parse_float_fallback, you need to have validated the input
    +// string with the JSON grammar.
    +// It will return an error (false) if the parsed number is infinite.
    +// The string parsing itself always succeeds. We know that there is at least
    +// one digit.
    +static bool parse_float_fallback(const uint8_t *ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +static bool parse_float_fallback(const uint8_t *ptr, const uint8_t *end_ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr), reinterpret_cast(end_ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +// check quickly whether the next 8 chars are made of digits
    +// at a glance, it looks better than Mula's
    +// http://0x80.pl/articles/swar-digits-validate.html
    +simdjson_inline bool is_made_of_eight_digits_fast(const uint8_t *chars) {
    +  uint64_t val;
    +  // this can read up to 7 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(7 <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be bigger than 7");
    +  std::memcpy(&val, chars, 8);
    +  // a branchy method might be faster:
    +  // return (( val & 0xF0F0F0F0F0F0F0F0 ) == 0x3030303030303030)
    +  //  && (( (val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0 ) ==
    +  //  0x3030303030303030);
    +  return (((val & 0xF0F0F0F0F0F0F0F0) |
    +           (((val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0) >> 4)) ==
    +          0x3333333333333333);
    +}
    +
    +template
    +SIMDJSON_NO_SANITIZE_UNDEFINED // We deliberately allow overflow here and check later
    +simdjson_inline bool parse_digit(const uint8_t c, I &i) {
    +  const uint8_t digit = static_cast(c - '0');
    +  if (digit > 9) {
    +    return false;
    +  }
    +  // PERF NOTE: multiplication by 10 is cheaper than arbitrary integer multiplication
    +  i = 10 * i + digit; // might overflow, we will handle the overflow later
    +  return true;
    +}
    +
    +simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const uint8_t *const src, const uint8_t *&p, uint64_t &i, int64_t &exponent) {
    +  // we continue with the fiction that we have an integer. If the
    +  // floating point number is representable as x * 10^z for some integer
    +  // z that fits in 53 bits, then we will be able to convert back the
    +  // the integer into a float in a lossless manner.
    +  const uint8_t *const first_after_period = p;
    +
    +#ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +#if SIMDJSON_SWAR_NUMBER_PARSING
    +  // this helps if we have lots of decimals!
    +  // this turns out to be frequent enough.
    +  if (is_made_of_eight_digits_fast(p)) {
    +    i = i * 100000000 + parse_eight_digits_unrolled(p);
    +    p += 8;
    +  }
    +#endif // SIMDJSON_SWAR_NUMBER_PARSING
    +#endif // #ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +  // Unrolling the first digit makes a small difference on some implementations (e.g. westmere)
    +  if (parse_digit(*p, i)) { ++p; }
    +  while (parse_digit(*p, i)) { p++; }
    +  exponent = first_after_period - p;
    +  // Decimal without digits (123.) is illegal
    +  if (exponent == 0) {
    +    return INVALID_NUMBER(src);
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) {
    +  // Exp Sign: -123.456e[-]78
    +  bool neg_exp = ('-' == *p);
    +  if (neg_exp || '+' == *p) { p++; } // Skip + as well
    +
    +  // Exponent: -123.456e-[78]
    +  auto start_exp = p;
    +  int64_t exp_number = 0;
    +  while (parse_digit(*p, exp_number)) { ++p; }
    +  // It is possible for parse_digit to overflow.
    +  // In particular, it could overflow to INT64_MIN, and we cannot do - INT64_MIN.
    +  // Thus we *must* check for possible overflow before we negate exp_number.
    +
    +  // Performance notes: it may seem like combining the two "simdjson_unlikely checks" below into
    +  // a single simdjson_unlikely path would be faster. The reasoning is sound, but the compiler may
    +  // not oblige and may, in fact, generate two distinct paths in any case. It might be
    +  // possible to do uint64_t(p - start_exp - 1) >= 18 but it could end up trading off
    +  // instructions for a simdjson_likely branch, an unconclusive gain.
    +
    +  // If there were no digits, it's an error.
    +  if (simdjson_unlikely(p == start_exp)) {
    +    return INVALID_NUMBER(src);
    +  }
    +  // We have a valid positive exponent in exp_number at this point, except that
    +  // it may have overflowed.
    +
    +  // If there were more than 18 digits, we may have overflowed the integer. We have to do
    +  // something!!!!
    +  if (simdjson_unlikely(p > start_exp+18)) {
    +    // Skip leading zeroes: 1e000000000000000000001 is technically valid and doesn't overflow
    +    while (*start_exp == '0') { start_exp++; }
    +    // 19 digits could overflow int64_t and is kind of absurd anyway. We don't
    +    // support exponents smaller than -999,999,999,999,999,999 and bigger
    +    // than 999,999,999,999,999,999.
    +    // We can truncate.
    +    // Note that 999999999999999999 is assuredly too large. The maximal ieee64 value before
    +    // infinity is ~1.8e308. The smallest subnormal is ~5e-324. So, actually, we could
    +    // truncate at 324.
    +    // Note that there is no reason to fail per se at this point in time.
    +    // E.g., 0e999999999999999999999 is a fine number.
    +    if (p > start_exp+18) { exp_number = 999999999999999999; }
    +  }
    +  // At this point, we know that exp_number is a sane, positive, signed integer.
    +  // It is <= 999,999,999,999,999,999. As long as 'exponent' is in
    +  // [-8223372036854775808, 8223372036854775808], we won't overflow. Because 'exponent'
    +  // is bounded in magnitude by the size of the JSON input, we are fine in this universe.
    +  // To sum it up: the next line should never overflow.
    +  exponent += (neg_exp ? -exp_number : exp_number);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline size_t significant_digits(const uint8_t * start_digits, size_t digit_count) {
    +  // It is possible that the integer had an overflow.
    +  // We have to handle the case where we have 0.0000somenumber.
    +  const uint8_t *start = start_digits;
    +  while ((*start == '0') || (*start == '.')) { ++start; }
    +  // we over-decrement by one when there is a '.'
    +  return digit_count - size_t(start - start_digits);
    +}
    +
    +} // unnamed namespace
    +
    +/** @private */
    +template
    +error_code slow_float_parsing(simdjson_unused const uint8_t * src, W writer) {
    +  double d;
    +  if (parse_float_fallback(src, &d)) {
    +    writer.append_double(d);
    +    return SUCCESS;
    +  }
    +  return INVALID_NUMBER(src);
    +}
    +
    +/** @private */
    +template
    +simdjson_inline error_code write_float(const uint8_t *const src, bool negative, uint64_t i, const uint8_t * start_digits, size_t digit_count, int64_t exponent, W &writer) {
    +  // If we frequently had to deal with long strings of digits,
    +  // we could extend our code by using a 128-bit integer instead
    +  // of a 64-bit integer. However, this is uncommon in practice.
    +  //
    +  // 9999999999999999999 < 2**64 so we can accommodate 19 digits.
    +  // If we have a decimal separator, then digit_count - 1 is the number of digits, but we
    +  // may not have a decimal separator!
    +  if (simdjson_unlikely(digit_count > 19 && significant_digits(start_digits, digit_count) > 19)) {
    +    // Ok, chances are good that we had an overflow!
    +    // this is almost never going to get called!!!
    +    // we start anew, going slowly!!!
    +    // This will happen in the following examples:
    +    // 10000000000000000000000000000000000000000000e+308
    +    // 3.1415926535897932384626433832795028841971693993751
    +    //
    +    // NOTE: This makes a *copy* of the writer and passes it to slow_float_parsing. This happens
    +    // because slow_float_parsing is a non-inlined function. If we passed our writer reference to
    +    // it, it would force it to be stored in memory, preventing the compiler from picking it apart
    +    // and putting into registers. i.e. if we pass it as reference, it gets slow.
    +    // This is what forces the skip_double, as well.
    +    error_code error = slow_float_parsing(src, writer);
    +    writer.skip_double();
    +    return error;
    +  }
    +  // NOTE: it's weird that the simdjson_unlikely() only wraps half the if, but it seems to get slower any other
    +  // way we've tried: https://github.com/simdjson/simdjson/pull/990#discussion_r448497331
    +  // To future reader: we'd love if someone found a better way, or at least could explain this result!
    +  if (simdjson_unlikely(exponent < simdjson::internal::smallest_power) || (exponent > simdjson::internal::largest_power)) {
    +    //
    +    // Important: smallest_power is such that it leads to a zero value.
    +    // Observe that 18446744073709551615e-343 == 0, i.e. (2**64 - 1) e -343 is zero
    +    // so something x 10^-343 goes to zero, but not so with  something x 10^-342.
    +    static_assert(simdjson::internal::smallest_power <= -342, "smallest_power is not small enough");
    +    //
    +    if((exponent < simdjson::internal::smallest_power) || (i == 0)) {
    +      // E.g. Parse "-0.0e-999" into the same value as "-0.0". See https://en.wikipedia.org/wiki/Signed_zero
    +      WRITE_DOUBLE(negative ? -0.0 : 0.0, src, writer);
    +      return SUCCESS;
    +    } else { // (exponent > largest_power) and (i != 0)
    +      // We have, for sure, an infinite value and simdjson refuses to parse infinite values.
    +      return INVALID_NUMBER(src);
    +    }
    +  }
    +  double d;
    +  if (!compute_float_64(exponent, i, negative, d)) {
    +    // we are almost never going to get here.
    +    if (!parse_float_fallback(src, &d)) { return INVALID_NUMBER(src); }
    +  }
    +  WRITE_DOUBLE(d, src, writer);
    +  return SUCCESS;
    +}
    +
    +// for performance analysis, it is sometimes  useful to skip parsing
    +#ifdef SIMDJSON_SKIPNUMBERPARSING
    +
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const, W &writer) {
    +  writer.append_s64(0);        // always write zero
    +  return SUCCESS;              // always succeeds
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept { return number_type::signed_integer; }
    +#else
    +
    +// parse the number at src
    +// define JSON_TEST_NUMBERS for unit testing
    +//
    +// It is assumed that the number is followed by a structural ({,},],[) character
    +// or a white space character. If that is not the case (e.g., when the JSON
    +// document is made of a single number), then it is necessary to copy the
    +// content and append a space before calling this function.
    +//
    +// Our objective is accurate parsing (ULP of 0) at high speed.
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) {
    +
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  if (digit_count == 0 || ('0' == *start_digits && digit_count > 1)) { return INVALID_NUMBER(src); }
    +
    +  //
    +  // Handle floats if there is a . or e (or both)
    +  //
    +  int64_t exponent = 0;
    +  bool is_float = false;
    +  if ('.' == *p) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_decimal_after_separator(src, p, i, exponent) );
    +    digit_count = int(p - start_digits); // used later to guard against overflows
    +  }
    +  if (('e' == *p) || ('E' == *p)) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_exponent(src, p, exponent) );
    +  }
    +  if (is_float) {
    +    const bool dirty_end = jsoncharutils::is_not_structural_or_whitespace(*p);
    +    SIMDJSON_TRY( write_float(src, negative, i, start_digits, digit_count, exponent, writer) );
    +    if (dirty_end) { return INVALID_NUMBER(src); }
    +    return SUCCESS;
    +  }
    +
    +  // The longest negative 64-bit number is 19 digits.
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  size_t longest_digit_count = negative ? 19 : 20;
    +  if (digit_count > longest_digit_count) { return INVALID_NUMBER(src); }
    +  if (digit_count == longest_digit_count) {
    +    if (negative) {
    +      // Anything negative above INT64_MAX+1 is invalid
    +      if (i > uint64_t(INT64_MAX)+1) { return INVALID_NUMBER(src);  }
    +      WRITE_INTEGER(~i+1, src, writer);
    +      if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +      return SUCCESS;
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    }  else if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INVALID_NUMBER(src); }
    +  }
    +
    +  // Write unsigned if it doesn't fit in a signed integer.
    +  if (i > uint64_t(INT64_MAX)) {
    +    WRITE_UNSIGNED(i, src, writer);
    +  } else {
    +    WRITE_INTEGER(negative ? (~i+1) : i, src, writer);
    +  }
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +  return SUCCESS;
    +}
    +
    +// Inlineable functions
    +namespace {
    +
    +// This table can be used to characterize the final character of an integer
    +// string. For JSON structural character and allowable white space characters,
    +// we return SUCCESS. For 'e', '.' and 'E', we return INCORRECT_TYPE. Otherwise
    +// we return NUMBER_ERROR.
    +// Optimization note: we could easily reduce the size of the table by half (to 128)
    +// at the cost of an extra branch.
    +// Optimization note: we want the values to use at most 8 bits (not, e.g., 32 bits):
    +static_assert(error_code(uint8_t(NUMBER_ERROR))== NUMBER_ERROR, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(SUCCESS))== SUCCESS, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(INCORRECT_TYPE))== INCORRECT_TYPE, "bad NUMBER_ERROR cast");
    +
    +const uint8_t integer_string_finisher[256] = {
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   SUCCESS,      NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, INCORRECT_TYPE,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, SUCCESS,        NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR};
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if ((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src + 1;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    // Note: we use src[1] and not src[0] because src[0] is the quote character in this
    +    // instance.
    +    if (src[1] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = src;
    +  uint64_t i = 0;
    +  while (parse_digit(*src, i)) { src++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(src - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*src)) {
    +  //  return (*src == '.' || *src == 'e' || *src == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(*src != '"') { return NUMBER_ERROR; }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept {
    +  return (*src == '-');
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) { return true; }
    +  return false;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) {
    +    // We have an integer.
    +    // If the number is negative and valid, it must be a signed integer.
    +    if(negative) { return number_type::signed_integer; }
    +    // We want values larger or equal to 9223372036854775808 to be unsigned
    +    // integers, and the other values to be signed integers.
    +    int digit_count = int(p - src);
    +    if(digit_count >= 19) {
    +      const uint8_t * smaller_big_integer = reinterpret_cast("9223372036854775808");
    +      if((digit_count >= 20) || (memcmp(src, smaller_big_integer, 19) >= 0)) {
    +        return number_type::unsigned_integer;
    +      }
    +    }
    +    return number_type::signed_integer;
    +  }
    +  // Hopefully, we have 'e' or 'E' or '.'.
    +  return number_type::floating_point_number;
    +}
    +
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src, const uint8_t * const src_end) noexcept {
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  if(p == src_end) { return NUMBER_ERROR; }
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely((p != src_end) && (*p == '.'))) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if ((p == src_end) || !parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = start_digits-src > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if ((p != src_end) && (*p == 'e' || *p == 'E')) {
    +    p++;
    +    if(p == src_end) { return NUMBER_ERROR; }
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while ((p != src_end) && parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if ((p != src_end) && jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), src_end, &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +} // unnamed namespace
    +#endif // SIMDJSON_SKIPNUMBERPARSING
    +
    +} // namespace numberparsing
    +
    +inline std::ostream& operator<<(std::ostream& out, number_type type) noexcept {
    +    switch (type) {
    +        case number_type::signed_integer: out << "integer in [-9223372036854775808,9223372036854775808)"; break;
    +        case number_type::unsigned_integer: out << "unsigned integer in [9223372036854775808,18446744073709551616)"; break;
    +        case number_type::floating_point_number: out << "floating-point number (binary64)"; break;
    +        default: SIMDJSON_UNREACHABLE();
    +    }
    +    return out;
    +}
    +
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_NUMBERPARSING_H
    +/* end file simdjson/generic/numberparsing.h for arm64 */
    +
    +/* including simdjson/generic/implementation_simdjson_result_base-inl.h for arm64: #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base-inl.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +
    +//
    +// internal::implementation_simdjson_result_base inline implementation
    +//
    +
    +template
    +simdjson_inline void implementation_simdjson_result_base::tie(T &value, error_code &error) && noexcept {
    +  error = this->second;
    +  if (!error) {
    +    value = std::forward>(*this).first;
    +  }
    +}
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::get(T &value) && noexcept {
    +  error_code error;
    +  std::forward>(*this).tie(value, error);
    +  return error;
    +}
    +
    +template
    +simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept {
    +  return this->second;
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::take_value() && noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::operator T&&() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline const T& implementation_simdjson_result_base::value_unsafe() const& noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value_unsafe() & noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value_unsafe() && noexcept {
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value, error_code error) noexcept
    +    : first{std::forward(value)}, second{error} {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(error_code error) noexcept
    +    : implementation_simdjson_result_base(T{}, error) {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value), SUCCESS) {}
    +
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +/* end file simdjson/generic/implementation_simdjson_result_base-inl.h for arm64 */
    +/* end file simdjson/generic/amalgamated.h for arm64 */
    +/* including simdjson/arm64/end.h: #include "simdjson/arm64/end.h" */
    +/* begin file simdjson/arm64/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT
    +/* undefining SIMDJSON_IMPLEMENTATION from "arm64" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/arm64/end.h */
    +
    +#endif // SIMDJSON_ARM64_H
    +/* end file simdjson/arm64.h */
    +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(fallback)
    +/* including simdjson/fallback.h: #include "simdjson/fallback.h" */
    +/* begin file simdjson/fallback.h */
    +#ifndef SIMDJSON_FALLBACK_H
    +#define SIMDJSON_FALLBACK_H
    +
    +/* including simdjson/fallback/begin.h: #include "simdjson/fallback/begin.h" */
    +/* begin file simdjson/fallback/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "fallback" */
    +#define SIMDJSON_IMPLEMENTATION fallback
    +/* including simdjson/fallback/base.h: #include "simdjson/fallback/base.h" */
    +/* begin file simdjson/fallback/base.h */
    +#ifndef SIMDJSON_FALLBACK_BASE_H
    +#define SIMDJSON_FALLBACK_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +/**
    + * Fallback implementation (runs on any machine).
    + */
    +namespace fallback {
    +
    +class implementation;
    +
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_FALLBACK_BASE_H
    +/* end file simdjson/fallback/base.h */
    +/* including simdjson/fallback/bitmanipulation.h: #include "simdjson/fallback/bitmanipulation.h" */
    +/* begin file simdjson/fallback/bitmanipulation.h */
    +#ifndef SIMDJSON_FALLBACK_BITMANIPULATION_H
    +#define SIMDJSON_FALLBACK_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace {
    +
    +#if defined(_MSC_VER) && !defined(_M_ARM64) && !defined(_M_X64)
    +static inline unsigned char _BitScanForward64(unsigned long* ret, uint64_t x) {
    +  unsigned long x0 = (unsigned long)x, top, bottom;
    +  _BitScanForward(&top, (unsigned long)(x >> 32));
    +  _BitScanForward(&bottom, x0);
    +  *ret = x0 ? bottom : 32 + top;
    +  return x != 0;
    +}
    +static unsigned char _BitScanReverse64(unsigned long* ret, uint64_t x) {
    +  unsigned long x1 = (unsigned long)(x >> 32), top, bottom;
    +  _BitScanReverse(&top, x1);
    +  _BitScanReverse(&bottom, (unsigned long)x);
    +  *ret = x1 ? top + 32 : bottom;
    +  return x != 0;
    +}
    +#endif
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +#ifdef _MSC_VER
    +  unsigned long leading_zero = 0;
    +  // Search the mask data from most significant bit (MSB)
    +  // to least significant bit (LSB) for a set bit (1).
    +  if (_BitScanReverse64(&leading_zero, input_num))
    +    return (int)(63 - leading_zero);
    +  else
    +    return 64;
    +#else
    +  return __builtin_clzll(input_num);
    +#endif// _MSC_VER
    +}
    +
    +} // unnamed namespace
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_FALLBACK_BITMANIPULATION_H
    +/* end file simdjson/fallback/bitmanipulation.h */
    +/* including simdjson/fallback/stringparsing_defs.h: #include "simdjson/fallback/stringparsing_defs.h" */
    +/* begin file simdjson/fallback/stringparsing_defs.h */
    +#ifndef SIMDJSON_FALLBACK_STRINGPARSING_DEFS_H
    +#define SIMDJSON_FALLBACK_STRINGPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace {
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 1;
    +  simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() { return c == '"'; }
    +  simdjson_inline bool has_backslash() { return c == '\\'; }
    +  simdjson_inline int quote_index() { return c == '"' ? 0 : 1; }
    +  simdjson_inline int backslash_index() { return c == '\\' ? 0 : 1; }
    +
    +  uint8_t c;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // store to dest unconditionally - we can overwrite the bits we don't like later
    +  dst[0] = src[0];
    +  return { src[0] };
    +}
    +
    +} // unnamed namespace
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_FALLBACK_STRINGPARSING_DEFS_H
    +/* end file simdjson/fallback/stringparsing_defs.h */
    +/* including simdjson/fallback/numberparsing_defs.h: #include "simdjson/fallback/numberparsing_defs.h" */
    +/* begin file simdjson/fallback/numberparsing_defs.h */
    +#ifndef SIMDJSON_FALLBACK_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_FALLBACK_NUMBERPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +#ifdef JSON_TEST_NUMBERS // for unit testing
    +void found_invalid_number(const uint8_t *buf);
    +void found_integer(int64_t result, const uint8_t *buf);
    +void found_unsigned_integer(uint64_t result, const uint8_t *buf);
    +void found_float(double result, const uint8_t *buf);
    +#endif
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace numberparsing {
    +
    +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const char *chars) {
    +  uint64_t val;
    +  memcpy(&val, chars, sizeof(uint64_t));
    +  val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8;
    +  val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16;
    +  return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32);
    +}
    +
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  return parse_eight_digits_unrolled(reinterpret_cast(chars));
    +}
    +
    +#if SIMDJSON_IS_32BITS // _umul128 for x86, arm
    +// this is a slow emulation routine for 32-bit
    +//
    +static simdjson_inline uint64_t __emulu(uint32_t x, uint32_t y) {
    +  return x * (uint64_t)y;
    +}
    +static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) {
    +  uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd);
    +  uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd);
    +  uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32));
    +  uint64_t adbc_carry = !!(adbc < ad);
    +  uint64_t lo = bd + (adbc << 32);
    +  *hi = __emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) +
    +        (adbc_carry << 32) + !!(lo < bd);
    +  return lo;
    +}
    +#endif
    +
    +/** @private */
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif // SIMDJSON_FALLBACK_NUMBERPARSING_DEFS_H
    +/* end file simdjson/fallback/numberparsing_defs.h */
    +/* end file simdjson/fallback/begin.h */
    +/* including simdjson/generic/amalgamated.h for fallback: #include "simdjson/generic/amalgamated.h" */
    +/* begin file simdjson/generic/amalgamated.h for fallback */
    +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_DEPENDENCIES_H)
    +#error simdjson/generic/dependencies.h must be included before simdjson/generic/amalgamated.h!
    +#endif
    +
    +/* including simdjson/generic/base.h for fallback: #include "simdjson/generic/base.h" */
    +/* begin file simdjson/generic/base.h for fallback */
    +#ifndef SIMDJSON_GENERIC_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): // If we haven't got an implementation yet, we're in the editor, editing a generic file! Just */
    +/* amalgamation skipped (editor-only): // use the most advanced one we can so the most possible stuff can be tested. */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation_detection.h" */
    +/* amalgamation skipped (editor-only): #if SIMDJSON_IMPLEMENTATION_ICELAKE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_HASWELL */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_WESTMERE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_ARM64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */
    +/* amalgamation skipped (editor-only): #else */
    +/* amalgamation skipped (editor-only): #error "All possible implementations (including fallback) have been disabled! simdjson will not run." */
    +/* amalgamation skipped (editor-only): #endif */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +
    +struct open_container;
    +class dom_parser_implementation;
    +
    +/**
    + * The type of a JSON number
    + */
    +enum class number_type {
    +    floating_point_number=1, /// a binary64 number
    +    signed_integer,          /// a signed integer that fits in a 64-bit word using two's complement
    +    unsigned_integer         /// a positive integer larger or equal to 1<<63
    +};
    +
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_BASE_H
    +/* end file simdjson/generic/base.h for fallback */
    +/* including simdjson/generic/jsoncharutils.h for fallback: #include "simdjson/generic/jsoncharutils.h" */
    +/* begin file simdjson/generic/jsoncharutils.h for fallback */
    +#ifndef SIMDJSON_GENERIC_JSONCHARUTILS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_JSONCHARUTILS_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/jsoncharutils_tables.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace {
    +namespace jsoncharutils {
    +
    +// return non-zero if not a structural or whitespace char
    +// zero otherwise
    +simdjson_inline uint32_t is_not_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace_negated[c];
    +}
    +
    +simdjson_inline uint32_t is_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace[c];
    +}
    +
    +// returns a value with the high 16 bits set if not valid
    +// otherwise returns the conversion of the 4 hex digits at src into the bottom
    +// 16 bits of the 32-bit return register
    +//
    +// see
    +// https://lemire.me/blog/2019/04/17/parsing-short-hexadecimal-strings-efficiently/
    +static inline uint32_t hex_to_u32_nocheck(
    +    const uint8_t *src) { // strictly speaking, static inline is a C-ism
    +  uint32_t v1 = internal::digit_to_val32[630 + src[0]];
    +  uint32_t v2 = internal::digit_to_val32[420 + src[1]];
    +  uint32_t v3 = internal::digit_to_val32[210 + src[2]];
    +  uint32_t v4 = internal::digit_to_val32[0 + src[3]];
    +  return v1 | v2 | v3 | v4;
    +}
    +
    +// given a code point cp, writes to c
    +// the utf-8 code, outputting the length in
    +// bytes, if the length is zero, the code point
    +// is invalid
    +//
    +// This can possibly be made faster using pdep
    +// and clz and table lookups, but JSON documents
    +// have few escaped code points, and the following
    +// function looks cheap.
    +//
    +// Note: we assume that surrogates are treated separately
    +//
    +simdjson_inline size_t codepoint_to_utf8(uint32_t cp, uint8_t *c) {
    +  if (cp <= 0x7F) {
    +    c[0] = uint8_t(cp);
    +    return 1; // ascii
    +  }
    +  if (cp <= 0x7FF) {
    +    c[0] = uint8_t((cp >> 6) + 192);
    +    c[1] = uint8_t((cp & 63) + 128);
    +    return 2; // universal plane
    +    //  Surrogates are treated elsewhere...
    +    //} //else if (0xd800 <= cp && cp <= 0xdfff) {
    +    //  return 0; // surrogates // could put assert here
    +  } else if (cp <= 0xFFFF) {
    +    c[0] = uint8_t((cp >> 12) + 224);
    +    c[1] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[2] = uint8_t((cp & 63) + 128);
    +    return 3;
    +  } else if (cp <= 0x10FFFF) { // if you know you have a valid code point, this
    +                               // is not needed
    +    c[0] = uint8_t((cp >> 18) + 240);
    +    c[1] = uint8_t(((cp >> 12) & 63) + 128);
    +    c[2] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[3] = uint8_t((cp & 63) + 128);
    +    return 4;
    +  }
    +  // will return 0 when the code point was too large.
    +  return 0; // bad r
    +}
    +
    +#if SIMDJSON_IS_32BITS // _umul128 for x86, arm
    +// this is a slow emulation routine for 32-bit
    +//
    +static simdjson_inline uint64_t __emulu(uint32_t x, uint32_t y) {
    +  return x * (uint64_t)y;
    +}
    +static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) {
    +  uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd);
    +  uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd);
    +  uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32));
    +  uint64_t adbc_carry = !!(adbc < ad);
    +  uint64_t lo = bd + (adbc << 32);
    +  *hi = __emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) +
    +        (adbc_carry << 32) + !!(lo < bd);
    +  return lo;
    +}
    +#endif
    +
    +} // namespace jsoncharutils
    +} // unnamed namespace
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_JSONCHARUTILS_H
    +/* end file simdjson/generic/jsoncharutils.h for fallback */
    +/* including simdjson/generic/atomparsing.h for fallback: #include "simdjson/generic/atomparsing.h" */
    +/* begin file simdjson/generic/atomparsing.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ATOMPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ATOMPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace {
    +/// @private
    +namespace atomparsing {
    +
    +// The string_to_uint32 is exclusively used to map literal strings to 32-bit values.
    +// We use memcpy instead of a pointer cast to avoid undefined behaviors since we cannot
    +// be certain that the character pointer will be properly aligned.
    +// You might think that using memcpy makes this function expensive, but you'd be wrong.
    +// All decent optimizing compilers (GCC, clang, Visual Studio) will compile string_to_uint32("false");
    +// to the compile-time constant 1936482662.
    +simdjson_inline uint32_t string_to_uint32(const char* str) { uint32_t val; std::memcpy(&val, str, sizeof(uint32_t)); return val; }
    +
    +
    +// Again in str4ncmp we use a memcpy to avoid undefined behavior. The memcpy may appear expensive.
    +// Yet all decent optimizing compilers will compile memcpy to a single instruction, just about.
    +simdjson_warn_unused
    +simdjson_inline uint32_t str4ncmp(const uint8_t *src, const char* atom) {
    +  uint32_t srcval; // we want to avoid unaligned 32-bit loads (undefined in C/C++)
    +  static_assert(sizeof(uint32_t) <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be larger than 4 bytes");
    +  std::memcpy(&srcval, src, sizeof(uint32_t));
    +  return srcval ^ string_to_uint32(atom);
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "true") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_true_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "true"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src) {
    +  return (str4ncmp(src+1, "alse") | jsoncharutils::is_not_structural_or_whitespace(src[5])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src, size_t len) {
    +  if (len > 5) { return is_valid_false_atom(src); }
    +  else if (len == 5) { return !str4ncmp(src+1, "alse"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "null") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_null_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "null"); }
    +  else { return false; }
    +}
    +
    +} // namespace atomparsing
    +} // unnamed namespace
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ATOMPARSING_H
    +/* end file simdjson/generic/atomparsing.h for fallback */
    +/* including simdjson/generic/dom_parser_implementation.h for fallback: #include "simdjson/generic/dom_parser_implementation.h" */
    +/* begin file simdjson/generic/dom_parser_implementation.h for fallback */
    +#ifndef SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +
    +// expectation: sizeof(open_container) = 64/8.
    +struct open_container {
    +  uint32_t tape_index; // where, on the tape, does the scope ([,{) begins
    +  uint32_t count; // how many elements in the scope
    +}; // struct open_container
    +
    +static_assert(sizeof(open_container) == 64/8, "Open container must be 64 bits");
    +
    +class dom_parser_implementation final : public internal::dom_parser_implementation {
    +public:
    +  /** Tape location of each open { or [ */
    +  std::unique_ptr open_containers{};
    +  /** Whether each open container is a [ or { */
    +  std::unique_ptr is_array{};
    +  /** Buffer passed to stage 1 */
    +  const uint8_t *buf{};
    +  /** Length passed to stage 1 */
    +  size_t len{0};
    +  /** Document passed to stage 2 */
    +  dom::document *doc{};
    +
    +  inline dom_parser_implementation() noexcept;
    +  inline dom_parser_implementation(dom_parser_implementation &&other) noexcept;
    +  inline dom_parser_implementation &operator=(dom_parser_implementation &&other) noexcept;
    +  dom_parser_implementation(const dom_parser_implementation &) = delete;
    +  dom_parser_implementation &operator=(const dom_parser_implementation &) = delete;
    +
    +  simdjson_warn_unused error_code parse(const uint8_t *buf, size_t len, dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage1(const uint8_t *buf, size_t len, stage1_mode partial) noexcept final;
    +  simdjson_warn_unused error_code stage2(dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage2_next(dom::document &doc) noexcept final;
    +  simdjson_warn_unused uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) const noexcept final;
    +  simdjson_warn_unused uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept final;
    +  inline simdjson_warn_unused error_code set_capacity(size_t capacity) noexcept final;
    +  inline simdjson_warn_unused error_code set_max_depth(size_t max_depth) noexcept final;
    +private:
    +  simdjson_inline simdjson_warn_unused error_code set_capacity_stage1(size_t capacity);
    +
    +};
    +
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +namespace fallback {
    +
    +inline dom_parser_implementation::dom_parser_implementation() noexcept = default;
    +inline dom_parser_implementation::dom_parser_implementation(dom_parser_implementation &&other) noexcept = default;
    +inline dom_parser_implementation &dom_parser_implementation::operator=(dom_parser_implementation &&other) noexcept = default;
    +
    +// Leaving these here so they can be inlined if so desired
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_capacity(size_t capacity) noexcept {
    +  if(capacity > SIMDJSON_MAXSIZE_BYTES) { return CAPACITY; }
    +  // Stage 1 index output
    +  size_t max_structures = SIMDJSON_ROUNDUP_N(capacity, 64) + 2 + 7;
    +  structural_indexes.reset( new (std::nothrow) uint32_t[max_structures] );
    +  if (!structural_indexes) { _capacity = 0; return MEMALLOC; }
    +  structural_indexes[0] = 0;
    +  n_structural_indexes = 0;
    +
    +  _capacity = capacity;
    +  return SUCCESS;
    +}
    +
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_max_depth(size_t max_depth) noexcept {
    +  // Stage 2 stacks
    +  open_containers.reset(new (std::nothrow) open_container[max_depth]);
    +  is_array.reset(new (std::nothrow) bool[max_depth]);
    +  if (!is_array || !open_containers) { _max_depth = 0; return MEMALLOC; }
    +
    +  _max_depth = max_depth;
    +  return SUCCESS;
    +}
    +
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +/* end file simdjson/generic/dom_parser_implementation.h for fallback */
    +/* including simdjson/generic/implementation_simdjson_result_base.h for fallback: #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base.h for fallback */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +
    +// This is a near copy of include/error.h's implementation_simdjson_result_base, except it doesn't use std::pair
    +// so we can avoid inlining errors
    +// TODO reconcile these!
    +/**
    + * The result of a simdjson operation that could fail.
    + *
    + * Gives the option of reading error codes, or throwing an exception by casting to the desired result.
    + *
    + * This is a base class for implementations that want to add functions to the result type for
    + * chaining.
    + *
    + * Override like:
    + *
    + *   struct simdjson_result : public internal::implementation_simdjson_result_base {
    + *     simdjson_result() noexcept : internal::implementation_simdjson_result_base() {}
    + *     simdjson_result(error_code error) noexcept : internal::implementation_simdjson_result_base(error) {}
    + *     simdjson_result(T &&value) noexcept : internal::implementation_simdjson_result_base(std::forward(value)) {}
    + *     simdjson_result(T &&value, error_code error) noexcept : internal::implementation_simdjson_result_base(value, error) {}
    + *     // Your extra methods here
    + *   }
    + *
    + * Then any method returning simdjson_result will be chainable with your methods.
    + */
    +template
    +struct implementation_simdjson_result_base {
    +
    +  /**
    +   * Create a new empty result with error = UNINITIALIZED.
    +   */
    +  simdjson_inline implementation_simdjson_result_base() noexcept = default;
    +
    +  /**
    +   * Create a new error result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(error_code error) noexcept;
    +
    +  /**
    +   * Create a new successful result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value) noexcept;
    +
    +  /**
    +   * Create a new result with both things (use if you don't want to branch when creating the result).
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value, error_code error) noexcept;
    +
    +  /**
    +   * Move the value and the error to the provided variables.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   * @param error The variable to assign the error to. Set to SUCCESS if there is no error.
    +   */
    +  simdjson_inline void tie(T &value, error_code &error) && noexcept;
    +
    +  /**
    +   * Move the value to the provided variable.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   */
    +  simdjson_inline error_code get(T &value) && noexcept;
    +
    +  /**
    +   * The error.
    +   */
    +  simdjson_inline error_code error() const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value.
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T& value() & noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& value() && noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& take_value() && noexcept(false);
    +
    +  /**
    +   * Cast to the value (will throw on error).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline operator T&&() && noexcept(false);
    +
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline const T& value_unsafe() const& noexcept;
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T& value_unsafe() & noexcept;
    +  /**
    +   * Take the result value (move it). This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T&& value_unsafe() && noexcept;
    +protected:
    +  /** users should never directly access first and second. **/
    +  T first{}; /** Users should never directly access 'first'. **/
    +  error_code second{UNINITIALIZED}; /** Users should never directly access 'second'. **/
    +}; // struct implementation_simdjson_result_base
    +
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +/* end file simdjson/generic/implementation_simdjson_result_base.h for fallback */
    +/* including simdjson/generic/numberparsing.h for fallback: #include "simdjson/generic/numberparsing.h" */
    +/* begin file simdjson/generic/numberparsing.h for fallback */
    +#ifndef SIMDJSON_GENERIC_NUMBERPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_NUMBERPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace numberparsing {
    +
    +#ifdef JSON_TEST_NUMBERS
    +#define INVALID_NUMBER(SRC) (found_invalid_number((SRC)), NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (found_integer((VALUE), (SRC)), (WRITER).append_s64((VALUE)))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (found_unsigned_integer((VALUE), (SRC)), (WRITER).append_u64((VALUE)))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (found_float((VALUE), (SRC)), (WRITER).append_double((VALUE)))
    +#else
    +#define INVALID_NUMBER(SRC) (NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (WRITER).append_s64((VALUE))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (WRITER).append_u64((VALUE))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (WRITER).append_double((VALUE))
    +#endif
    +
    +namespace {
    +
    +// Convert a mantissa, an exponent and a sign bit into an ieee64 double.
    +// The real_exponent needs to be in [0, 2046] (technically real_exponent = 2047 would be acceptable).
    +// The mantissa should be in [0,1<<53). The bit at index (1ULL << 52) while be zeroed.
    +simdjson_inline double to_double(uint64_t mantissa, uint64_t real_exponent, bool negative) {
    +    double d;
    +    mantissa &= ~(1ULL << 52);
    +    mantissa |= real_exponent << 52;
    +    mantissa |= ((static_cast(negative)) << 63);
    +    std::memcpy(&d, &mantissa, sizeof(d));
    +    return d;
    +}
    +
    +// Attempts to compute i * 10^(power) exactly; and if "negative" is
    +// true, negate the result.
    +// This function will only work in some cases, when it does not work, success is
    +// set to false. This should work *most of the time* (like 99% of the time).
    +// We assume that power is in the [smallest_power,
    +// largest_power] interval: the caller is responsible for this check.
    +simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative, double &d) {
    +  // we start with a fast path
    +  // It was described in
    +  // Clinger WD. How to read floating point numbers accurately.
    +  // ACM SIGPLAN Notices. 1990
    +#ifndef FLT_EVAL_METHOD
    +#error "FLT_EVAL_METHOD should be defined, please include cfloat."
    +#endif
    +#if (FLT_EVAL_METHOD != 1) && (FLT_EVAL_METHOD != 0)
    +  // We cannot be certain that x/y is rounded to nearest.
    +  if (0 <= power && power <= 22 && i <= 9007199254740991)
    +#else
    +  if (-22 <= power && power <= 22 && i <= 9007199254740991)
    +#endif
    +  {
    +    // convert the integer into a double. This is lossless since
    +    // 0 <= i <= 2^53 - 1.
    +    d = double(i);
    +    //
    +    // The general idea is as follows.
    +    // If 0 <= s < 2^53 and if 10^0 <= p <= 10^22 then
    +    // 1) Both s and p can be represented exactly as 64-bit floating-point
    +    // values
    +    // (binary64).
    +    // 2) Because s and p can be represented exactly as floating-point values,
    +    // then s * p
    +    // and s / p will produce correctly rounded values.
    +    //
    +    if (power < 0) {
    +      d = d / simdjson::internal::power_of_ten[-power];
    +    } else {
    +      d = d * simdjson::internal::power_of_ten[power];
    +    }
    +    if (negative) {
    +      d = -d;
    +    }
    +    return true;
    +  }
    +  // When 22 < power && power <  22 + 16, we could
    +  // hope for another, secondary fast path.  It was
    +  // described by David M. Gay in  "Correctly rounded
    +  // binary-decimal and decimal-binary conversions." (1990)
    +  // If you need to compute i * 10^(22 + x) for x < 16,
    +  // first compute i * 10^x, if you know that result is exact
    +  // (e.g., when i * 10^x < 2^53),
    +  // then you can still proceed and do (i * 10^x) * 10^22.
    +  // Is this worth your time?
    +  // You need  22 < power *and* power <  22 + 16 *and* (i * 10^(x-22) < 2^53)
    +  // for this second fast path to work.
    +  // If you you have 22 < power *and* power <  22 + 16, and then you
    +  // optimistically compute "i * 10^(x-22)", there is still a chance that you
    +  // have wasted your time if i * 10^(x-22) >= 2^53. It makes the use cases of
    +  // this optimization maybe less common than we would like. Source:
    +  // http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/
    +  // also used in RapidJSON: https://rapidjson.org/strtod_8h_source.html
    +
    +  // The fast path has now failed, so we are failing back on the slower path.
    +
    +  // In the slow path, we need to adjust i so that it is > 1<<63 which is always
    +  // possible, except if i == 0, so we handle i == 0 separately.
    +  if(i == 0) {
    +    d = negative ? -0.0 : 0.0;
    +    return true;
    +  }
    +
    +
    +  // The exponent is 1024 + 63 + power
    +  //     + floor(log(5**power)/log(2)).
    +  // The 1024 comes from the ieee64 standard.
    +  // The 63 comes from the fact that we use a 64-bit word.
    +  //
    +  // Computing floor(log(5**power)/log(2)) could be
    +  // slow. Instead we use a fast function.
    +  //
    +  // For power in (-400,350), we have that
    +  // (((152170 + 65536) * power ) >> 16);
    +  // is equal to
    +  //  floor(log(5**power)/log(2)) + power when power >= 0
    +  // and it is equal to
    +  //  ceil(log(5**-power)/log(2)) + power when power < 0
    +  //
    +  // The 65536 is (1<<16) and corresponds to
    +  // (65536 * power) >> 16 ---> power
    +  //
    +  // ((152170 * power ) >> 16) is equal to
    +  // floor(log(5**power)/log(2))
    +  //
    +  // Note that this is not magic: 152170/(1<<16) is
    +  // approximatively equal to log(5)/log(2).
    +  // The 1<<16 value is a power of two; we could use a
    +  // larger power of 2 if we wanted to.
    +  //
    +  int64_t exponent = (((152170 + 65536) * power) >> 16) + 1024 + 63;
    +
    +
    +  // We want the most significant bit of i to be 1. Shift if needed.
    +  int lz = leading_zeroes(i);
    +  i <<= lz;
    +
    +
    +  // We are going to need to do some 64-bit arithmetic to get a precise product.
    +  // We use a table lookup approach.
    +  // It is safe because
    +  // power >= smallest_power
    +  // and power <= largest_power
    +  // We recover the mantissa of the power, it has a leading 1. It is always
    +  // rounded down.
    +  //
    +  // We want the most significant 64 bits of the product. We know
    +  // this will be non-zero because the most significant bit of i is
    +  // 1.
    +  const uint32_t index = 2 * uint32_t(power - simdjson::internal::smallest_power);
    +  // Optimization: It may be that materializing the index as a variable might confuse some compilers and prevent effective complex-addressing loads. (Done for code clarity.)
    +  //
    +  // The full_multiplication function computes the 128-bit product of two 64-bit words
    +  // with a returned value of type value128 with a "low component" corresponding to the
    +  // 64-bit least significant bits of the product and with a "high component" corresponding
    +  // to the 64-bit most significant bits of the product.
    +  simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
    +  // Both i and power_of_five_128[index] have their most significant bit set to 1 which
    +  // implies that the either the most or the second most significant bit of the product
    +  // is 1. We pack values in this manner for efficiency reasons: it maximizes the use
    +  // we make of the product. It also makes it easy to reason about the product: there
    +  // is 0 or 1 leading zero in the product.
    +
    +  // Unless the least significant 9 bits of the high (64-bit) part of the full
    +  // product are all 1s, then we know that the most significant 55 bits are
    +  // exact and no further work is needed. Having 55 bits is necessary because
    +  // we need 53 bits for the mantissa but we have to have one rounding bit and
    +  // we can waste a bit if the most significant bit of the product is zero.
    +  if((firstproduct.high & 0x1FF) == 0x1FF) {
    +    // We want to compute i * 5^q, but only care about the top 55 bits at most.
    +    // Consider the scenario where q>=0. Then 5^q may not fit in 64-bits. Doing
    +    // the full computation is wasteful. So we do what is called a "truncated
    +    // multiplication".
    +    // We take the most significant 64-bits, and we put them in
    +    // power_of_five_128[index]. Usually, that's good enough to approximate i * 5^q
    +    // to the desired approximation using one multiplication. Sometimes it does not suffice.
    +    // Then we store the next most significant 64 bits in power_of_five_128[index + 1], and
    +    // then we get a better approximation to i * 5^q.
    +    //
    +    // That's for when q>=0. The logic for q<0 is somewhat similar but it is somewhat
    +    // more complicated.
    +    //
    +    // There is an extra layer of complexity in that we need more than 55 bits of
    +    // accuracy in the round-to-even scenario.
    +    //
    +    // The full_multiplication function computes the 128-bit product of two 64-bit words
    +    // with a returned value of type value128 with a "low component" corresponding to the
    +    // 64-bit least significant bits of the product and with a "high component" corresponding
    +    // to the 64-bit most significant bits of the product.
    +    simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
    +    firstproduct.low += secondproduct.high;
    +    if(secondproduct.high > firstproduct.low) { firstproduct.high++; }
    +    // As it has been proven by Noble Mushtak and Daniel Lemire in "Fast Number Parsing Without
    +    // Fallback" (https://arxiv.org/abs/2212.06644), at this point we are sure that the product
    +    // is sufficiently accurate, and more computation is not needed.
    +  }
    +  uint64_t lower = firstproduct.low;
    +  uint64_t upper = firstproduct.high;
    +  // The final mantissa should be 53 bits with a leading 1.
    +  // We shift it so that it occupies 54 bits with a leading 1.
    +  ///////
    +  uint64_t upperbit = upper >> 63;
    +  uint64_t mantissa = upper >> (upperbit + 9);
    +  lz += int(1 ^ upperbit);
    +
    +  // Here we have mantissa < (1<<54).
    +  int64_t real_exponent = exponent - lz;
    +  if (simdjson_unlikely(real_exponent <= 0)) { // we have a subnormal?
    +    // Here have that real_exponent <= 0 so -real_exponent >= 0
    +    if(-real_exponent + 1 >= 64) { // if we have more than 64 bits below the minimum exponent, you have a zero for sure.
    +      d = negative ? -0.0 : 0.0;
    +      return true;
    +    }
    +    // next line is safe because -real_exponent + 1 < 0
    +    mantissa >>= -real_exponent + 1;
    +    // Thankfully, we can't have both "round-to-even" and subnormals because
    +    // "round-to-even" only occurs for powers close to 0.
    +    mantissa += (mantissa & 1); // round up
    +    mantissa >>= 1;
    +    // There is a weird scenario where we don't have a subnormal but just.
    +    // Suppose we start with 2.2250738585072013e-308, we end up
    +    // with 0x3fffffffffffff x 2^-1023-53 which is technically subnormal
    +    // whereas 0x40000000000000 x 2^-1023-53  is normal. Now, we need to round
    +    // up 0x3fffffffffffff x 2^-1023-53  and once we do, we are no longer
    +    // subnormal, but we can only know this after rounding.
    +    // So we only declare a subnormal if we are smaller than the threshold.
    +    real_exponent = (mantissa < (uint64_t(1) << 52)) ? 0 : 1;
    +    d = to_double(mantissa, real_exponent, negative);
    +    return true;
    +  }
    +  // We have to round to even. The "to even" part
    +  // is only a problem when we are right in between two floats
    +  // which we guard against.
    +  // If we have lots of trailing zeros, we may fall right between two
    +  // floating-point values.
    +  //
    +  // The round-to-even cases take the form of a number 2m+1 which is in (2^53,2^54]
    +  // times a power of two. That is, it is right between a number with binary significand
    +  // m and another number with binary significand m+1; and it must be the case
    +  // that it cannot be represented by a float itself.
    +  //
    +  // We must have that w * 10 ^q == (2m+1) * 2^p for some power of two 2^p.
    +  // Recall that 10^q = 5^q * 2^q.
    +  // When q >= 0, we must have that (2m+1) is divible by 5^q, so 5^q <= 2^54. We have that
    +  //  5^23 <=  2^54 and it is the last power of five to qualify, so q <= 23.
    +  // When q<0, we have  w  >=  (2m+1) x 5^{-q}.  We must have that w<2^{64} so
    +  // (2m+1) x 5^{-q} < 2^{64}. We have that 2m+1>2^{53}. Hence, we must have
    +  // 2^{53} x 5^{-q} < 2^{64}.
    +  // Hence we have 5^{-q} < 2^{11}$ or q>= -4.
    +  //
    +  // We require lower <= 1 and not lower == 0 because we could not prove that
    +  // that lower == 0 is implied; but we could prove that lower <= 1 is a necessary and sufficient test.
    +  if (simdjson_unlikely((lower <= 1) && (power >= -4) && (power <= 23) && ((mantissa & 3) == 1))) {
    +    if((mantissa  << (upperbit + 64 - 53 - 2)) ==  upper) {
    +      mantissa &= ~1;             // flip it so that we do not round up
    +    }
    +  }
    +
    +  mantissa += mantissa & 1;
    +  mantissa >>= 1;
    +
    +  // Here we have mantissa < (1<<53), unless there was an overflow
    +  if (mantissa >= (1ULL << 53)) {
    +    //////////
    +    // This will happen when parsing values such as 7.2057594037927933e+16
    +    ////////
    +    mantissa = (1ULL << 52);
    +    real_exponent++;
    +  }
    +  mantissa &= ~(1ULL << 52);
    +  // we have to check that real_exponent is in range, otherwise we bail out
    +  if (simdjson_unlikely(real_exponent > 2046)) {
    +    // We have an infinite value!!! We could actually throw an error here if we could.
    +    return false;
    +  }
    +  d = to_double(mantissa, real_exponent, negative);
    +  return true;
    +}
    +
    +// We call a fallback floating-point parser that might be slow. Note
    +// it will accept JSON numbers, but the JSON spec. is more restrictive so
    +// before you call parse_float_fallback, you need to have validated the input
    +// string with the JSON grammar.
    +// It will return an error (false) if the parsed number is infinite.
    +// The string parsing itself always succeeds. We know that there is at least
    +// one digit.
    +static bool parse_float_fallback(const uint8_t *ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +static bool parse_float_fallback(const uint8_t *ptr, const uint8_t *end_ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr), reinterpret_cast(end_ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +// check quickly whether the next 8 chars are made of digits
    +// at a glance, it looks better than Mula's
    +// http://0x80.pl/articles/swar-digits-validate.html
    +simdjson_inline bool is_made_of_eight_digits_fast(const uint8_t *chars) {
    +  uint64_t val;
    +  // this can read up to 7 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(7 <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be bigger than 7");
    +  std::memcpy(&val, chars, 8);
    +  // a branchy method might be faster:
    +  // return (( val & 0xF0F0F0F0F0F0F0F0 ) == 0x3030303030303030)
    +  //  && (( (val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0 ) ==
    +  //  0x3030303030303030);
    +  return (((val & 0xF0F0F0F0F0F0F0F0) |
    +           (((val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0) >> 4)) ==
    +          0x3333333333333333);
    +}
    +
    +template
    +SIMDJSON_NO_SANITIZE_UNDEFINED // We deliberately allow overflow here and check later
    +simdjson_inline bool parse_digit(const uint8_t c, I &i) {
    +  const uint8_t digit = static_cast(c - '0');
    +  if (digit > 9) {
    +    return false;
    +  }
    +  // PERF NOTE: multiplication by 10 is cheaper than arbitrary integer multiplication
    +  i = 10 * i + digit; // might overflow, we will handle the overflow later
    +  return true;
    +}
    +
    +simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const uint8_t *const src, const uint8_t *&p, uint64_t &i, int64_t &exponent) {
    +  // we continue with the fiction that we have an integer. If the
    +  // floating point number is representable as x * 10^z for some integer
    +  // z that fits in 53 bits, then we will be able to convert back the
    +  // the integer into a float in a lossless manner.
    +  const uint8_t *const first_after_period = p;
    +
    +#ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +#if SIMDJSON_SWAR_NUMBER_PARSING
    +  // this helps if we have lots of decimals!
    +  // this turns out to be frequent enough.
    +  if (is_made_of_eight_digits_fast(p)) {
    +    i = i * 100000000 + parse_eight_digits_unrolled(p);
    +    p += 8;
    +  }
    +#endif // SIMDJSON_SWAR_NUMBER_PARSING
    +#endif // #ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +  // Unrolling the first digit makes a small difference on some implementations (e.g. westmere)
    +  if (parse_digit(*p, i)) { ++p; }
    +  while (parse_digit(*p, i)) { p++; }
    +  exponent = first_after_period - p;
    +  // Decimal without digits (123.) is illegal
    +  if (exponent == 0) {
    +    return INVALID_NUMBER(src);
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) {
    +  // Exp Sign: -123.456e[-]78
    +  bool neg_exp = ('-' == *p);
    +  if (neg_exp || '+' == *p) { p++; } // Skip + as well
    +
    +  // Exponent: -123.456e-[78]
    +  auto start_exp = p;
    +  int64_t exp_number = 0;
    +  while (parse_digit(*p, exp_number)) { ++p; }
    +  // It is possible for parse_digit to overflow.
    +  // In particular, it could overflow to INT64_MIN, and we cannot do - INT64_MIN.
    +  // Thus we *must* check for possible overflow before we negate exp_number.
    +
    +  // Performance notes: it may seem like combining the two "simdjson_unlikely checks" below into
    +  // a single simdjson_unlikely path would be faster. The reasoning is sound, but the compiler may
    +  // not oblige and may, in fact, generate two distinct paths in any case. It might be
    +  // possible to do uint64_t(p - start_exp - 1) >= 18 but it could end up trading off
    +  // instructions for a simdjson_likely branch, an unconclusive gain.
    +
    +  // If there were no digits, it's an error.
    +  if (simdjson_unlikely(p == start_exp)) {
    +    return INVALID_NUMBER(src);
    +  }
    +  // We have a valid positive exponent in exp_number at this point, except that
    +  // it may have overflowed.
    +
    +  // If there were more than 18 digits, we may have overflowed the integer. We have to do
    +  // something!!!!
    +  if (simdjson_unlikely(p > start_exp+18)) {
    +    // Skip leading zeroes: 1e000000000000000000001 is technically valid and doesn't overflow
    +    while (*start_exp == '0') { start_exp++; }
    +    // 19 digits could overflow int64_t and is kind of absurd anyway. We don't
    +    // support exponents smaller than -999,999,999,999,999,999 and bigger
    +    // than 999,999,999,999,999,999.
    +    // We can truncate.
    +    // Note that 999999999999999999 is assuredly too large. The maximal ieee64 value before
    +    // infinity is ~1.8e308. The smallest subnormal is ~5e-324. So, actually, we could
    +    // truncate at 324.
    +    // Note that there is no reason to fail per se at this point in time.
    +    // E.g., 0e999999999999999999999 is a fine number.
    +    if (p > start_exp+18) { exp_number = 999999999999999999; }
    +  }
    +  // At this point, we know that exp_number is a sane, positive, signed integer.
    +  // It is <= 999,999,999,999,999,999. As long as 'exponent' is in
    +  // [-8223372036854775808, 8223372036854775808], we won't overflow. Because 'exponent'
    +  // is bounded in magnitude by the size of the JSON input, we are fine in this universe.
    +  // To sum it up: the next line should never overflow.
    +  exponent += (neg_exp ? -exp_number : exp_number);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline size_t significant_digits(const uint8_t * start_digits, size_t digit_count) {
    +  // It is possible that the integer had an overflow.
    +  // We have to handle the case where we have 0.0000somenumber.
    +  const uint8_t *start = start_digits;
    +  while ((*start == '0') || (*start == '.')) { ++start; }
    +  // we over-decrement by one when there is a '.'
    +  return digit_count - size_t(start - start_digits);
    +}
    +
    +} // unnamed namespace
    +
    +/** @private */
    +template
    +error_code slow_float_parsing(simdjson_unused const uint8_t * src, W writer) {
    +  double d;
    +  if (parse_float_fallback(src, &d)) {
    +    writer.append_double(d);
    +    return SUCCESS;
    +  }
    +  return INVALID_NUMBER(src);
    +}
    +
    +/** @private */
    +template
    +simdjson_inline error_code write_float(const uint8_t *const src, bool negative, uint64_t i, const uint8_t * start_digits, size_t digit_count, int64_t exponent, W &writer) {
    +  // If we frequently had to deal with long strings of digits,
    +  // we could extend our code by using a 128-bit integer instead
    +  // of a 64-bit integer. However, this is uncommon in practice.
    +  //
    +  // 9999999999999999999 < 2**64 so we can accommodate 19 digits.
    +  // If we have a decimal separator, then digit_count - 1 is the number of digits, but we
    +  // may not have a decimal separator!
    +  if (simdjson_unlikely(digit_count > 19 && significant_digits(start_digits, digit_count) > 19)) {
    +    // Ok, chances are good that we had an overflow!
    +    // this is almost never going to get called!!!
    +    // we start anew, going slowly!!!
    +    // This will happen in the following examples:
    +    // 10000000000000000000000000000000000000000000e+308
    +    // 3.1415926535897932384626433832795028841971693993751
    +    //
    +    // NOTE: This makes a *copy* of the writer and passes it to slow_float_parsing. This happens
    +    // because slow_float_parsing is a non-inlined function. If we passed our writer reference to
    +    // it, it would force it to be stored in memory, preventing the compiler from picking it apart
    +    // and putting into registers. i.e. if we pass it as reference, it gets slow.
    +    // This is what forces the skip_double, as well.
    +    error_code error = slow_float_parsing(src, writer);
    +    writer.skip_double();
    +    return error;
    +  }
    +  // NOTE: it's weird that the simdjson_unlikely() only wraps half the if, but it seems to get slower any other
    +  // way we've tried: https://github.com/simdjson/simdjson/pull/990#discussion_r448497331
    +  // To future reader: we'd love if someone found a better way, or at least could explain this result!
    +  if (simdjson_unlikely(exponent < simdjson::internal::smallest_power) || (exponent > simdjson::internal::largest_power)) {
    +    //
    +    // Important: smallest_power is such that it leads to a zero value.
    +    // Observe that 18446744073709551615e-343 == 0, i.e. (2**64 - 1) e -343 is zero
    +    // so something x 10^-343 goes to zero, but not so with  something x 10^-342.
    +    static_assert(simdjson::internal::smallest_power <= -342, "smallest_power is not small enough");
    +    //
    +    if((exponent < simdjson::internal::smallest_power) || (i == 0)) {
    +      // E.g. Parse "-0.0e-999" into the same value as "-0.0". See https://en.wikipedia.org/wiki/Signed_zero
    +      WRITE_DOUBLE(negative ? -0.0 : 0.0, src, writer);
    +      return SUCCESS;
    +    } else { // (exponent > largest_power) and (i != 0)
    +      // We have, for sure, an infinite value and simdjson refuses to parse infinite values.
    +      return INVALID_NUMBER(src);
    +    }
    +  }
    +  double d;
    +  if (!compute_float_64(exponent, i, negative, d)) {
    +    // we are almost never going to get here.
    +    if (!parse_float_fallback(src, &d)) { return INVALID_NUMBER(src); }
    +  }
    +  WRITE_DOUBLE(d, src, writer);
    +  return SUCCESS;
    +}
    +
    +// for performance analysis, it is sometimes  useful to skip parsing
    +#ifdef SIMDJSON_SKIPNUMBERPARSING
    +
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const, W &writer) {
    +  writer.append_s64(0);        // always write zero
    +  return SUCCESS;              // always succeeds
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept { return number_type::signed_integer; }
    +#else
    +
    +// parse the number at src
    +// define JSON_TEST_NUMBERS for unit testing
    +//
    +// It is assumed that the number is followed by a structural ({,},],[) character
    +// or a white space character. If that is not the case (e.g., when the JSON
    +// document is made of a single number), then it is necessary to copy the
    +// content and append a space before calling this function.
    +//
    +// Our objective is accurate parsing (ULP of 0) at high speed.
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) {
    +
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  if (digit_count == 0 || ('0' == *start_digits && digit_count > 1)) { return INVALID_NUMBER(src); }
    +
    +  //
    +  // Handle floats if there is a . or e (or both)
    +  //
    +  int64_t exponent = 0;
    +  bool is_float = false;
    +  if ('.' == *p) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_decimal_after_separator(src, p, i, exponent) );
    +    digit_count = int(p - start_digits); // used later to guard against overflows
    +  }
    +  if (('e' == *p) || ('E' == *p)) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_exponent(src, p, exponent) );
    +  }
    +  if (is_float) {
    +    const bool dirty_end = jsoncharutils::is_not_structural_or_whitespace(*p);
    +    SIMDJSON_TRY( write_float(src, negative, i, start_digits, digit_count, exponent, writer) );
    +    if (dirty_end) { return INVALID_NUMBER(src); }
    +    return SUCCESS;
    +  }
    +
    +  // The longest negative 64-bit number is 19 digits.
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  size_t longest_digit_count = negative ? 19 : 20;
    +  if (digit_count > longest_digit_count) { return INVALID_NUMBER(src); }
    +  if (digit_count == longest_digit_count) {
    +    if (negative) {
    +      // Anything negative above INT64_MAX+1 is invalid
    +      if (i > uint64_t(INT64_MAX)+1) { return INVALID_NUMBER(src);  }
    +      WRITE_INTEGER(~i+1, src, writer);
    +      if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +      return SUCCESS;
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    }  else if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INVALID_NUMBER(src); }
    +  }
    +
    +  // Write unsigned if it doesn't fit in a signed integer.
    +  if (i > uint64_t(INT64_MAX)) {
    +    WRITE_UNSIGNED(i, src, writer);
    +  } else {
    +    WRITE_INTEGER(negative ? (~i+1) : i, src, writer);
    +  }
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +  return SUCCESS;
    +}
    +
    +// Inlineable functions
    +namespace {
    +
    +// This table can be used to characterize the final character of an integer
    +// string. For JSON structural character and allowable white space characters,
    +// we return SUCCESS. For 'e', '.' and 'E', we return INCORRECT_TYPE. Otherwise
    +// we return NUMBER_ERROR.
    +// Optimization note: we could easily reduce the size of the table by half (to 128)
    +// at the cost of an extra branch.
    +// Optimization note: we want the values to use at most 8 bits (not, e.g., 32 bits):
    +static_assert(error_code(uint8_t(NUMBER_ERROR))== NUMBER_ERROR, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(SUCCESS))== SUCCESS, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(INCORRECT_TYPE))== INCORRECT_TYPE, "bad NUMBER_ERROR cast");
    +
    +const uint8_t integer_string_finisher[256] = {
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   SUCCESS,      NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, INCORRECT_TYPE,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, SUCCESS,        NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR};
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if ((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src + 1;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    // Note: we use src[1] and not src[0] because src[0] is the quote character in this
    +    // instance.
    +    if (src[1] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = src;
    +  uint64_t i = 0;
    +  while (parse_digit(*src, i)) { src++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(src - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*src)) {
    +  //  return (*src == '.' || *src == 'e' || *src == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(*src != '"') { return NUMBER_ERROR; }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept {
    +  return (*src == '-');
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) { return true; }
    +  return false;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) {
    +    // We have an integer.
    +    // If the number is negative and valid, it must be a signed integer.
    +    if(negative) { return number_type::signed_integer; }
    +    // We want values larger or equal to 9223372036854775808 to be unsigned
    +    // integers, and the other values to be signed integers.
    +    int digit_count = int(p - src);
    +    if(digit_count >= 19) {
    +      const uint8_t * smaller_big_integer = reinterpret_cast("9223372036854775808");
    +      if((digit_count >= 20) || (memcmp(src, smaller_big_integer, 19) >= 0)) {
    +        return number_type::unsigned_integer;
    +      }
    +    }
    +    return number_type::signed_integer;
    +  }
    +  // Hopefully, we have 'e' or 'E' or '.'.
    +  return number_type::floating_point_number;
    +}
    +
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src, const uint8_t * const src_end) noexcept {
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  if(p == src_end) { return NUMBER_ERROR; }
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely((p != src_end) && (*p == '.'))) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if ((p == src_end) || !parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = start_digits-src > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if ((p != src_end) && (*p == 'e' || *p == 'E')) {
    +    p++;
    +    if(p == src_end) { return NUMBER_ERROR; }
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while ((p != src_end) && parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if ((p != src_end) && jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), src_end, &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +} // unnamed namespace
    +#endif // SIMDJSON_SKIPNUMBERPARSING
    +
    +} // namespace numberparsing
    +
    +inline std::ostream& operator<<(std::ostream& out, number_type type) noexcept {
    +    switch (type) {
    +        case number_type::signed_integer: out << "integer in [-9223372036854775808,9223372036854775808)"; break;
    +        case number_type::unsigned_integer: out << "unsigned integer in [9223372036854775808,18446744073709551616)"; break;
    +        case number_type::floating_point_number: out << "floating-point number (binary64)"; break;
    +        default: SIMDJSON_UNREACHABLE();
    +    }
    +    return out;
    +}
    +
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_NUMBERPARSING_H
    +/* end file simdjson/generic/numberparsing.h for fallback */
    +
    +/* including simdjson/generic/implementation_simdjson_result_base-inl.h for fallback: #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base-inl.h for fallback */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +
    +//
    +// internal::implementation_simdjson_result_base inline implementation
    +//
    +
    +template
    +simdjson_inline void implementation_simdjson_result_base::tie(T &value, error_code &error) && noexcept {
    +  error = this->second;
    +  if (!error) {
    +    value = std::forward>(*this).first;
    +  }
    +}
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::get(T &value) && noexcept {
    +  error_code error;
    +  std::forward>(*this).tie(value, error);
    +  return error;
    +}
    +
    +template
    +simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept {
    +  return this->second;
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::take_value() && noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::operator T&&() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline const T& implementation_simdjson_result_base::value_unsafe() const& noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value_unsafe() & noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value_unsafe() && noexcept {
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value, error_code error) noexcept
    +    : first{std::forward(value)}, second{error} {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(error_code error) noexcept
    +    : implementation_simdjson_result_base(T{}, error) {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value), SUCCESS) {}
    +
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +/* end file simdjson/generic/implementation_simdjson_result_base-inl.h for fallback */
    +/* end file simdjson/generic/amalgamated.h for fallback */
    +/* including simdjson/fallback/end.h: #include "simdjson/fallback/end.h" */
    +/* begin file simdjson/fallback/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +/* undefining SIMDJSON_IMPLEMENTATION from "fallback" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/fallback/end.h */
    +
    +#endif // SIMDJSON_FALLBACK_H
    +/* end file simdjson/fallback.h */
    +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(haswell)
    +/* including simdjson/haswell.h: #include "simdjson/haswell.h" */
    +/* begin file simdjson/haswell.h */
    +#ifndef SIMDJSON_HASWELL_H
    +#define SIMDJSON_HASWELL_H
    +
    +/* including simdjson/haswell/begin.h: #include "simdjson/haswell/begin.h" */
    +/* begin file simdjson/haswell/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "haswell" */
    +#define SIMDJSON_IMPLEMENTATION haswell
    +
    +/* including simdjson/haswell/base.h: #include "simdjson/haswell/base.h" */
    +/* begin file simdjson/haswell/base.h */
    +#ifndef SIMDJSON_HASWELL_BASE_H
    +#define SIMDJSON_HASWELL_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_HASWELL
    +namespace simdjson {
    +/**
    + * Implementation for Haswell (Intel AVX2).
    + */
    +namespace haswell {
    +
    +class implementation;
    +
    +namespace {
    +namespace simd {
    +template  struct simd8;
    +template  struct simd8x64;
    +} // namespace simd
    +} // unnamed namespace
    +
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_HASWELL_BASE_H
    +/* end file simdjson/haswell/base.h */
    +/* including simdjson/haswell/intrinsics.h: #include "simdjson/haswell/intrinsics.h" */
    +/* begin file simdjson/haswell/intrinsics.h */
    +#ifndef SIMDJSON_HASWELL_INTRINSICS_H
    +#define SIMDJSON_HASWELL_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if SIMDJSON_VISUAL_STUDIO
    +// under clang within visual studio, this will include 
    +#include   // visual studio or clang
    +#else
    +#include  // elsewhere
    +#endif // SIMDJSON_VISUAL_STUDIO
    +
    +#if SIMDJSON_CLANG_VISUAL_STUDIO
    +/**
    + * You are not supposed, normally, to include these
    + * headers directly. Instead you should either include intrin.h
    + * or x86intrin.h. However, when compiling with clang
    + * under Windows (i.e., when _MSC_VER is set), these headers
    + * only get included *if* the corresponding features are detected
    + * from macros:
    + * e.g., if __AVX2__ is set... in turn,  we normally set these
    + * macros by compiling against the corresponding architecture
    + * (e.g., arch:AVX2, -mavx2, etc.) which compiles the whole
    + * software with these advanced instructions. In simdjson, we
    + * want to compile the whole program for a generic target,
    + * and only target our specific kernels. As a workaround,
    + * we directly include the needed headers. These headers would
    + * normally guard against such usage, but we carefully included
    + *   (or ) before, so the headers
    + * are fooled.
    + */
    +#include    // for _blsr_u64
    +#include  // for  __lzcnt64
    +#include    // for most things (AVX2, AVX512, _popcnt64)
    +#include 
    +#include 
    +#include 
    +#include 
    +#include    // for  _mm_clmulepi64_si128
    +// unfortunately, we may not get _blsr_u64, but, thankfully, clang
    +// has it as a macro.
    +#ifndef _blsr_u64
    +// we roll our own
    +#define _blsr_u64(n) ((n - 1) & n)
    +#endif //  _blsr_u64
    +#endif // SIMDJSON_CLANG_VISUAL_STUDIO
    +
    +static_assert(sizeof(__m256i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for haswell kernel.");
    +
    +#endif // SIMDJSON_HASWELL_INTRINSICS_H
    +/* end file simdjson/haswell/intrinsics.h */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_HASWELL
    +SIMDJSON_TARGET_REGION("avx2,bmi,pclmul,lzcnt,popcnt")
    +#endif
    +
    +/* including simdjson/haswell/bitmanipulation.h: #include "simdjson/haswell/bitmanipulation.h" */
    +/* begin file simdjson/haswell/bitmanipulation.h */
    +#ifndef SIMDJSON_HASWELL_BITMANIPULATION_H
    +#define SIMDJSON_HASWELL_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/bitmask.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return (int)_tzcnt_u64(input_num);
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  ////////
    +  // You might expect the next line to be equivalent to
    +  // return (int)_tzcnt_u64(input_num);
    +  // but the generated code differs and might be less efficient?
    +  ////////
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return _blsr_u64(input_num);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +  return int(_lzcnt_u64(input_num));
    +}
    +
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +simdjson_inline unsigned __int64 count_ones(uint64_t input_num) {
    +  // note: we do not support legacy 32-bit Windows in this kernel
    +  return __popcnt64(input_num);// Visual Studio wants two underscores
    +}
    +#else
    +simdjson_inline long long int count_ones(uint64_t input_num) {
    +  return _popcnt64(input_num);
    +}
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2,
    +                                uint64_t *result) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return _addcarry_u64(0, value1, value2,
    +                       reinterpret_cast(result));
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_HASWELL_BITMANIPULATION_H
    +/* end file simdjson/haswell/bitmanipulation.h */
    +/* including simdjson/haswell/bitmask.h: #include "simdjson/haswell/bitmask.h" */
    +/* begin file simdjson/haswell/bitmask.h */
    +#ifndef SIMDJSON_HASWELL_BITMASK_H
    +#define SIMDJSON_HASWELL_BITMASK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +
    +//
    +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered.
    +//
    +// For example, prefix_xor(00100100) == 00011100
    +//
    +simdjson_inline uint64_t prefix_xor(const uint64_t bitmask) {
    +  // There should be no such thing with a processor supporting avx2
    +  // but not clmul.
    +  __m128i all_ones = _mm_set1_epi8('\xFF');
    +  __m128i result = _mm_clmulepi64_si128(_mm_set_epi64x(0ULL, bitmask), all_ones, 0);
    +  return _mm_cvtsi128_si64(result);
    +}
    +
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_HASWELL_BITMASK_H
    +/* end file simdjson/haswell/bitmask.h */
    +/* including simdjson/haswell/numberparsing_defs.h: #include "simdjson/haswell/numberparsing_defs.h" */
    +/* begin file simdjson/haswell/numberparsing_defs.h */
    +#ifndef SIMDJSON_HASWELL_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_HASWELL_NUMBERPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace numberparsing {
    +
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  // this actually computes *16* values so we are being wasteful.
    +  const __m128i ascii0 = _mm_set1_epi8('0');
    +  const __m128i mul_1_10 =
    +      _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1);
    +  const __m128i mul_1_100 = _mm_setr_epi16(100, 1, 100, 1, 100, 1, 100, 1);
    +  const __m128i mul_1_10000 =
    +      _mm_setr_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1);
    +  const __m128i input = _mm_sub_epi8(
    +      _mm_loadu_si128(reinterpret_cast(chars)), ascii0);
    +  const __m128i t1 = _mm_maddubs_epi16(input, mul_1_10);
    +  const __m128i t2 = _mm_madd_epi16(t1, mul_1_100);
    +  const __m128i t3 = _mm_packus_epi32(t2, t2);
    +  const __m128i t4 = _mm_madd_epi16(t3, mul_1_10000);
    +  return _mm_cvtsi128_si32(
    +      t4); // only captures the sum of the first 8 digits, drop the rest
    +}
    +
    +/** @private */
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif // SIMDJSON_HASWELL_NUMBERPARSING_DEFS_H
    +/* end file simdjson/haswell/numberparsing_defs.h */
    +/* including simdjson/haswell/simd.h: #include "simdjson/haswell/simd.h" */
    +/* begin file simdjson/haswell/simd.h */
    +#ifndef SIMDJSON_HASWELL_SIMD_H
    +#define SIMDJSON_HASWELL_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +namespace simd {
    +
    +  // Forward-declared so they can be used by splat and friends.
    +  template
    +  struct base {
    +    __m256i value;
    +
    +    // Zero constructor
    +    simdjson_inline base() : value{__m256i()} {}
    +
    +    // Conversion from SIMD register
    +    simdjson_inline base(const __m256i _value) : value(_value) {}
    +
    +    // Conversion to SIMD register
    +    simdjson_inline operator const __m256i&() const { return this->value; }
    +    simdjson_inline operator __m256i&() { return this->value; }
    +
    +    // Bit operations
    +    simdjson_inline Child operator|(const Child other) const { return _mm256_or_si256(*this, other); }
    +    simdjson_inline Child operator&(const Child other) const { return _mm256_and_si256(*this, other); }
    +    simdjson_inline Child operator^(const Child other) const { return _mm256_xor_si256(*this, other); }
    +    simdjson_inline Child bit_andnot(const Child other) const { return _mm256_andnot_si256(other, *this); }
    +    simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast | other; return *this_cast; }
    +    simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast & other; return *this_cast; }
    +    simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast ^ other; return *this_cast; }
    +  };
    +
    +  // Forward-declared so they can be used by splat and friends.
    +  template
    +  struct simd8;
    +
    +  template>
    +  struct base8: base> {
    +    typedef uint32_t bitmask_t;
    +    typedef uint64_t bitmask2_t;
    +
    +    simdjson_inline base8() : base>() {}
    +    simdjson_inline base8(const __m256i _value) : base>(_value) {}
    +
    +    friend simdjson_really_inline Mask operator==(const simd8 lhs, const simd8 rhs) { return _mm256_cmpeq_epi8(lhs, rhs); }
    +
    +    static const int SIZE = sizeof(base::value);
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +      return _mm256_alignr_epi8(*this, _mm256_permute2x128_si256(prev_chunk, *this, 0x21), 16 - N);
    +    }
    +  };
    +
    +  // SIMD byte mask type (returned by things like eq and gt)
    +  template<>
    +  struct simd8: base8 {
    +    static simdjson_inline simd8 splat(bool _value) { return _mm256_set1_epi8(uint8_t(-(!!_value))); }
    +
    +    simdjson_inline simd8() : base8() {}
    +    simdjson_inline simd8(const __m256i _value) : base8(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(bool _value) : base8(splat(_value)) {}
    +
    +    simdjson_inline int to_bitmask() const { return _mm256_movemask_epi8(*this); }
    +    simdjson_inline bool any() const { return !_mm256_testz_si256(*this, *this); }
    +    simdjson_inline simd8 operator~() const { return *this ^ true; }
    +  };
    +
    +  template
    +  struct base8_numeric: base8 {
    +    static simdjson_inline simd8 splat(T _value) { return _mm256_set1_epi8(_value); }
    +    static simdjson_inline simd8 zero() { return _mm256_setzero_si256(); }
    +    static simdjson_inline simd8 load(const T values[32]) {
    +      return _mm256_loadu_si256(reinterpret_cast(values));
    +    }
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    static simdjson_inline simd8 repeat_16(
    +      T v0,  T v1,  T v2,  T v3,  T v4,  T v5,  T v6,  T v7,
    +      T v8,  T v9,  T v10, T v11, T v12, T v13, T v14, T v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    simdjson_inline base8_numeric() : base8() {}
    +    simdjson_inline base8_numeric(const __m256i _value) : base8(_value) {}
    +
    +    // Store to array
    +    simdjson_inline void store(T dst[32]) const { return _mm256_storeu_si256(reinterpret_cast<__m256i *>(dst), *this); }
    +
    +    // Addition/subtraction are the same for signed and unsigned
    +    simdjson_inline simd8 operator+(const simd8 other) const { return _mm256_add_epi8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return _mm256_sub_epi8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *static_cast*>(this); }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *static_cast*>(this); }
    +
    +    // Override to distinguish from bool version
    +    simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +
    +    // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values)
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return _mm256_shuffle_epi8(lookup_table, *this);
    +    }
    +
    +    // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset).
    +    // Passing a 0 value for mask would be equivalent to writing out every byte to output.
    +    // Only the first 32 - count_ones(mask) bytes of the result are significant but 32 bytes
    +    // get written.
    +    // Design consideration: it seems like a function with the
    +    // signature simd8 compress(uint32_t mask) would be
    +    // sensible, but the AVX ISA makes this kind of approach difficult.
    +    template
    +    simdjson_inline void compress(uint32_t mask, L * output) const {
    +      using internal::thintable_epi8;
    +      using internal::BitsSetTable256mul2;
    +      using internal::pshufb_combine_table;
    +      // this particular implementation was inspired by work done by @animetosho
    +      // we do it in four steps, first 8 bytes and then second 8 bytes...
    +      uint8_t mask1 = uint8_t(mask); // least significant 8 bits
    +      uint8_t mask2 = uint8_t(mask >> 8); // second least significant 8 bits
    +      uint8_t mask3 = uint8_t(mask >> 16); // ...
    +      uint8_t mask4 = uint8_t(mask >> 24); // ...
    +      // next line just loads the 64-bit values thintable_epi8[mask1] and
    +      // thintable_epi8[mask2] into a 128-bit register, using only
    +      // two instructions on most compilers.
    +      __m256i shufmask =  _mm256_set_epi64x(thintable_epi8[mask4], thintable_epi8[mask3],
    +        thintable_epi8[mask2], thintable_epi8[mask1]);
    +      // we increment by 0x08 the second half of the mask and so forth
    +      shufmask =
    +      _mm256_add_epi8(shufmask, _mm256_set_epi32(0x18181818, 0x18181818,
    +         0x10101010, 0x10101010, 0x08080808, 0x08080808, 0, 0));
    +      // this is the version "nearly pruned"
    +      __m256i pruned = _mm256_shuffle_epi8(*this, shufmask);
    +      // we still need to put the  pieces back together.
    +      // we compute the popcount of the first words:
    +      int pop1 = BitsSetTable256mul2[mask1];
    +      int pop3 = BitsSetTable256mul2[mask3];
    +
    +      // then load the corresponding mask
    +      // could be done with _mm256_loadu2_m128i but many standard libraries omit this intrinsic.
    +      __m256i v256 = _mm256_castsi128_si256(
    +        _mm_loadu_si128(reinterpret_cast(pshufb_combine_table + pop1 * 8)));
    +      __m256i compactmask = _mm256_insertf128_si256(v256,
    +         _mm_loadu_si128(reinterpret_cast(pshufb_combine_table + pop3 * 8)), 1);
    +      __m256i almostthere =  _mm256_shuffle_epi8(pruned, compactmask);
    +      // We just need to write out the result.
    +      // This is the tricky bit that is hard to do
    +      // if we want to return a SIMD register, since there
    +      // is no single-instruction approach to recombine
    +      // the two 128-bit lanes with an offset.
    +      __m128i v128;
    +      v128 = _mm256_castsi256_si128(almostthere);
    +      _mm_storeu_si128( reinterpret_cast<__m128i *>(output), v128);
    +      v128 = _mm256_extractf128_si256(almostthere, 1);
    +      _mm_storeu_si128( reinterpret_cast<__m128i *>(output + 16 - count_ones(mask & 0xFFFF)), v128);
    +    }
    +
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +  };
    +
    +  // Signed bytes
    +  template<>
    +  struct simd8 : base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m256i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const int8_t values[32]) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15,
    +      int8_t v16, int8_t v17, int8_t v18, int8_t v19, int8_t v20, int8_t v21, int8_t v22, int8_t v23,
    +      int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, int8_t v30, int8_t v31
    +    ) : simd8(_mm256_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15,
    +      v16,v17,v18,v19,v20,v21,v22,v23,
    +      v24,v25,v26,v27,v28,v29,v30,v31
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Order-sensitive comparisons
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm256_max_epi8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm256_min_epi8(*this, other); }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return _mm256_cmpgt_epi8(*this, other); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return _mm256_cmpgt_epi8(other, *this); }
    +  };
    +
    +  // Unsigned bytes
    +  template<>
    +  struct simd8: base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m256i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const uint8_t values[32]) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15,
    +      uint8_t v16, uint8_t v17, uint8_t v18, uint8_t v19, uint8_t v20, uint8_t v21, uint8_t v22, uint8_t v23,
    +      uint8_t v24, uint8_t v25, uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, uint8_t v31
    +    ) : simd8(_mm256_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15,
    +      v16,v17,v18,v19,v20,v21,v22,v23,
    +      v24,v25,v26,v27,v28,v29,v30,v31
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Saturated math
    +    simdjson_inline simd8 saturating_add(const simd8 other) const { return _mm256_adds_epu8(*this, other); }
    +    simdjson_inline simd8 saturating_sub(const simd8 other) const { return _mm256_subs_epu8(*this, other); }
    +
    +    // Order-specific operations
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm256_max_epu8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm256_min_epu8(other, *this); }
    +    // Same as >, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 gt_bits(const simd8 other) const { return this->saturating_sub(other); }
    +    // Same as <, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 lt_bits(const simd8 other) const { return other.saturating_sub(*this); }
    +    simdjson_inline simd8 operator<=(const simd8 other) const { return other.max_val(*this) == other; }
    +    simdjson_inline simd8 operator>=(const simd8 other) const { return other.min_val(*this) == other; }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return this->lt_bits(other).any_bits_set(); }
    +
    +    // Bit-specific operations
    +    simdjson_inline simd8 bits_not_set() const { return *this == uint8_t(0); }
    +    simdjson_inline simd8 bits_not_set(simd8 bits) const { return (*this & bits).bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set() const { return ~this->bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set(simd8 bits) const { return ~this->bits_not_set(bits); }
    +    simdjson_inline bool is_ascii() const { return _mm256_movemask_epi8(*this) == 0; }
    +    simdjson_inline bool bits_not_set_anywhere() const { return _mm256_testz_si256(*this, *this); }
    +    simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); }
    +    simdjson_inline bool bits_not_set_anywhere(simd8 bits) const { return _mm256_testz_si256(*this, bits); }
    +    simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return !bits_not_set_anywhere(bits); }
    +    template
    +    simdjson_inline simd8 shr() const { return simd8(_mm256_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); }
    +    template
    +    simdjson_inline simd8 shl() const { return simd8(_mm256_slli_epi16(*this, N)) & uint8_t(0xFFu << N); }
    +    // Get one of the bits and make a bitmask out of it.
    +    // e.g. value.get_bit<7>() gets the high bit
    +    template
    +    simdjson_inline int get_bit() const { return _mm256_movemask_epi8(_mm256_slli_epi16(*this, 7-N)); }
    +  };
    +
    +  template
    +  struct simd8x64 {
    +    static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +    static_assert(NUM_CHUNKS == 2, "Haswell kernel should use two registers per 64-byte block.");
    +    const simd8 chunks[NUM_CHUNKS];
    +
    +    simd8x64(const simd8x64& o) = delete; // no copy allowed
    +    simd8x64& operator=(const simd8& other) = delete; // no assignment allowed
    +    simd8x64() = delete; // no default constructor allowed
    +
    +    simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1) : chunks{chunk0, chunk1} {}
    +    simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8::load(ptr), simd8::load(ptr+32)} {}
    +
    +    simdjson_inline uint64_t compress(uint64_t mask, T * output) const {
    +      uint32_t mask1 = uint32_t(mask);
    +      uint32_t mask2 = uint32_t(mask >> 32);
    +      this->chunks[0].compress(mask1, output);
    +      this->chunks[1].compress(mask2, output + 32 - count_ones(mask1));
    +      return 64 - count_ones(mask);
    +    }
    +
    +    simdjson_inline void store(T ptr[64]) const {
    +      this->chunks[0].store(ptr+sizeof(simd8)*0);
    +      this->chunks[1].store(ptr+sizeof(simd8)*1);
    +    }
    +
    +    simdjson_inline uint64_t to_bitmask() const {
    +      uint64_t r_lo = uint32_t(this->chunks[0].to_bitmask());
    +      uint64_t r_hi =                       this->chunks[1].to_bitmask();
    +      return r_lo | (r_hi << 32);
    +    }
    +
    +    simdjson_inline simd8 reduce_or() const {
    +      return this->chunks[0] | this->chunks[1];
    +    }
    +
    +    simdjson_inline simd8x64 bit_or(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return simd8x64(
    +        this->chunks[0] | mask,
    +        this->chunks[1] | mask
    +      );
    +    }
    +
    +    simdjson_inline uint64_t eq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] == mask,
    +        this->chunks[1] == mask
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t eq(const simd8x64 &other) const {
    +      return  simd8x64(
    +        this->chunks[0] == other.chunks[0],
    +        this->chunks[1] == other.chunks[1]
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t lteq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] <= mask,
    +        this->chunks[1] <= mask
    +      ).to_bitmask();
    +    }
    +  }; // struct simd8x64
    +
    +} // namespace simd
    +
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_HASWELL_SIMD_H
    +/* end file simdjson/haswell/simd.h */
    +/* including simdjson/haswell/stringparsing_defs.h: #include "simdjson/haswell/stringparsing_defs.h" */
    +/* begin file simdjson/haswell/stringparsing_defs.h */
    +#ifndef SIMDJSON_HASWELL_STRINGPARSING_DEFS_H
    +#define SIMDJSON_HASWELL_STRINGPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/simd.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +
    +using namespace simd;
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 32;
    +  simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; }
    +  simdjson_inline bool has_backslash() { return ((quote_bits - 1) & bs_bits) != 0; }
    +  simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); }
    +  simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); }
    +
    +  uint32_t bs_bits;
    +  uint32_t quote_bits;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // this can read up to 15 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes");
    +  simd8 v(src);
    +  // store to dest unconditionally - we can overwrite the bits we don't like later
    +  v.store(dst);
    +  return {
    +      static_cast((v == '\\').to_bitmask()),     // bs_bits
    +      static_cast((v == '"').to_bitmask()), // quote_bits
    +  };
    +}
    +
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_HASWELL_STRINGPARSING_DEFS_H
    +/* end file simdjson/haswell/stringparsing_defs.h */
    +/* end file simdjson/haswell/begin.h */
    +/* including simdjson/generic/amalgamated.h for haswell: #include "simdjson/generic/amalgamated.h" */
    +/* begin file simdjson/generic/amalgamated.h for haswell */
    +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_DEPENDENCIES_H)
    +#error simdjson/generic/dependencies.h must be included before simdjson/generic/amalgamated.h!
    +#endif
    +
    +/* including simdjson/generic/base.h for haswell: #include "simdjson/generic/base.h" */
    +/* begin file simdjson/generic/base.h for haswell */
    +#ifndef SIMDJSON_GENERIC_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): // If we haven't got an implementation yet, we're in the editor, editing a generic file! Just */
    +/* amalgamation skipped (editor-only): // use the most advanced one we can so the most possible stuff can be tested. */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation_detection.h" */
    +/* amalgamation skipped (editor-only): #if SIMDJSON_IMPLEMENTATION_ICELAKE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_HASWELL */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_WESTMERE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_ARM64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */
    +/* amalgamation skipped (editor-only): #else */
    +/* amalgamation skipped (editor-only): #error "All possible implementations (including fallback) have been disabled! simdjson will not run." */
    +/* amalgamation skipped (editor-only): #endif */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +
    +struct open_container;
    +class dom_parser_implementation;
    +
    +/**
    + * The type of a JSON number
    + */
    +enum class number_type {
    +    floating_point_number=1, /// a binary64 number
    +    signed_integer,          /// a signed integer that fits in a 64-bit word using two's complement
    +    unsigned_integer         /// a positive integer larger or equal to 1<<63
    +};
    +
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_BASE_H
    +/* end file simdjson/generic/base.h for haswell */
    +/* including simdjson/generic/jsoncharutils.h for haswell: #include "simdjson/generic/jsoncharutils.h" */
    +/* begin file simdjson/generic/jsoncharutils.h for haswell */
    +#ifndef SIMDJSON_GENERIC_JSONCHARUTILS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_JSONCHARUTILS_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/jsoncharutils_tables.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +namespace jsoncharutils {
    +
    +// return non-zero if not a structural or whitespace char
    +// zero otherwise
    +simdjson_inline uint32_t is_not_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace_negated[c];
    +}
    +
    +simdjson_inline uint32_t is_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace[c];
    +}
    +
    +// returns a value with the high 16 bits set if not valid
    +// otherwise returns the conversion of the 4 hex digits at src into the bottom
    +// 16 bits of the 32-bit return register
    +//
    +// see
    +// https://lemire.me/blog/2019/04/17/parsing-short-hexadecimal-strings-efficiently/
    +static inline uint32_t hex_to_u32_nocheck(
    +    const uint8_t *src) { // strictly speaking, static inline is a C-ism
    +  uint32_t v1 = internal::digit_to_val32[630 + src[0]];
    +  uint32_t v2 = internal::digit_to_val32[420 + src[1]];
    +  uint32_t v3 = internal::digit_to_val32[210 + src[2]];
    +  uint32_t v4 = internal::digit_to_val32[0 + src[3]];
    +  return v1 | v2 | v3 | v4;
    +}
    +
    +// given a code point cp, writes to c
    +// the utf-8 code, outputting the length in
    +// bytes, if the length is zero, the code point
    +// is invalid
    +//
    +// This can possibly be made faster using pdep
    +// and clz and table lookups, but JSON documents
    +// have few escaped code points, and the following
    +// function looks cheap.
    +//
    +// Note: we assume that surrogates are treated separately
    +//
    +simdjson_inline size_t codepoint_to_utf8(uint32_t cp, uint8_t *c) {
    +  if (cp <= 0x7F) {
    +    c[0] = uint8_t(cp);
    +    return 1; // ascii
    +  }
    +  if (cp <= 0x7FF) {
    +    c[0] = uint8_t((cp >> 6) + 192);
    +    c[1] = uint8_t((cp & 63) + 128);
    +    return 2; // universal plane
    +    //  Surrogates are treated elsewhere...
    +    //} //else if (0xd800 <= cp && cp <= 0xdfff) {
    +    //  return 0; // surrogates // could put assert here
    +  } else if (cp <= 0xFFFF) {
    +    c[0] = uint8_t((cp >> 12) + 224);
    +    c[1] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[2] = uint8_t((cp & 63) + 128);
    +    return 3;
    +  } else if (cp <= 0x10FFFF) { // if you know you have a valid code point, this
    +                               // is not needed
    +    c[0] = uint8_t((cp >> 18) + 240);
    +    c[1] = uint8_t(((cp >> 12) & 63) + 128);
    +    c[2] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[3] = uint8_t((cp & 63) + 128);
    +    return 4;
    +  }
    +  // will return 0 when the code point was too large.
    +  return 0; // bad r
    +}
    +
    +#if SIMDJSON_IS_32BITS // _umul128 for x86, arm
    +// this is a slow emulation routine for 32-bit
    +//
    +static simdjson_inline uint64_t __emulu(uint32_t x, uint32_t y) {
    +  return x * (uint64_t)y;
    +}
    +static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) {
    +  uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd);
    +  uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd);
    +  uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32));
    +  uint64_t adbc_carry = !!(adbc < ad);
    +  uint64_t lo = bd + (adbc << 32);
    +  *hi = __emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) +
    +        (adbc_carry << 32) + !!(lo < bd);
    +  return lo;
    +}
    +#endif
    +
    +} // namespace jsoncharutils
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_JSONCHARUTILS_H
    +/* end file simdjson/generic/jsoncharutils.h for haswell */
    +/* including simdjson/generic/atomparsing.h for haswell: #include "simdjson/generic/atomparsing.h" */
    +/* begin file simdjson/generic/atomparsing.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ATOMPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ATOMPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +/// @private
    +namespace atomparsing {
    +
    +// The string_to_uint32 is exclusively used to map literal strings to 32-bit values.
    +// We use memcpy instead of a pointer cast to avoid undefined behaviors since we cannot
    +// be certain that the character pointer will be properly aligned.
    +// You might think that using memcpy makes this function expensive, but you'd be wrong.
    +// All decent optimizing compilers (GCC, clang, Visual Studio) will compile string_to_uint32("false");
    +// to the compile-time constant 1936482662.
    +simdjson_inline uint32_t string_to_uint32(const char* str) { uint32_t val; std::memcpy(&val, str, sizeof(uint32_t)); return val; }
    +
    +
    +// Again in str4ncmp we use a memcpy to avoid undefined behavior. The memcpy may appear expensive.
    +// Yet all decent optimizing compilers will compile memcpy to a single instruction, just about.
    +simdjson_warn_unused
    +simdjson_inline uint32_t str4ncmp(const uint8_t *src, const char* atom) {
    +  uint32_t srcval; // we want to avoid unaligned 32-bit loads (undefined in C/C++)
    +  static_assert(sizeof(uint32_t) <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be larger than 4 bytes");
    +  std::memcpy(&srcval, src, sizeof(uint32_t));
    +  return srcval ^ string_to_uint32(atom);
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "true") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_true_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "true"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src) {
    +  return (str4ncmp(src+1, "alse") | jsoncharutils::is_not_structural_or_whitespace(src[5])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src, size_t len) {
    +  if (len > 5) { return is_valid_false_atom(src); }
    +  else if (len == 5) { return !str4ncmp(src+1, "alse"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "null") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_null_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "null"); }
    +  else { return false; }
    +}
    +
    +} // namespace atomparsing
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ATOMPARSING_H
    +/* end file simdjson/generic/atomparsing.h for haswell */
    +/* including simdjson/generic/dom_parser_implementation.h for haswell: #include "simdjson/generic/dom_parser_implementation.h" */
    +/* begin file simdjson/generic/dom_parser_implementation.h for haswell */
    +#ifndef SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +
    +// expectation: sizeof(open_container) = 64/8.
    +struct open_container {
    +  uint32_t tape_index; // where, on the tape, does the scope ([,{) begins
    +  uint32_t count; // how many elements in the scope
    +}; // struct open_container
    +
    +static_assert(sizeof(open_container) == 64/8, "Open container must be 64 bits");
    +
    +class dom_parser_implementation final : public internal::dom_parser_implementation {
    +public:
    +  /** Tape location of each open { or [ */
    +  std::unique_ptr open_containers{};
    +  /** Whether each open container is a [ or { */
    +  std::unique_ptr is_array{};
    +  /** Buffer passed to stage 1 */
    +  const uint8_t *buf{};
    +  /** Length passed to stage 1 */
    +  size_t len{0};
    +  /** Document passed to stage 2 */
    +  dom::document *doc{};
    +
    +  inline dom_parser_implementation() noexcept;
    +  inline dom_parser_implementation(dom_parser_implementation &&other) noexcept;
    +  inline dom_parser_implementation &operator=(dom_parser_implementation &&other) noexcept;
    +  dom_parser_implementation(const dom_parser_implementation &) = delete;
    +  dom_parser_implementation &operator=(const dom_parser_implementation &) = delete;
    +
    +  simdjson_warn_unused error_code parse(const uint8_t *buf, size_t len, dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage1(const uint8_t *buf, size_t len, stage1_mode partial) noexcept final;
    +  simdjson_warn_unused error_code stage2(dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage2_next(dom::document &doc) noexcept final;
    +  simdjson_warn_unused uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) const noexcept final;
    +  simdjson_warn_unused uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept final;
    +  inline simdjson_warn_unused error_code set_capacity(size_t capacity) noexcept final;
    +  inline simdjson_warn_unused error_code set_max_depth(size_t max_depth) noexcept final;
    +private:
    +  simdjson_inline simdjson_warn_unused error_code set_capacity_stage1(size_t capacity);
    +
    +};
    +
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +namespace haswell {
    +
    +inline dom_parser_implementation::dom_parser_implementation() noexcept = default;
    +inline dom_parser_implementation::dom_parser_implementation(dom_parser_implementation &&other) noexcept = default;
    +inline dom_parser_implementation &dom_parser_implementation::operator=(dom_parser_implementation &&other) noexcept = default;
    +
    +// Leaving these here so they can be inlined if so desired
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_capacity(size_t capacity) noexcept {
    +  if(capacity > SIMDJSON_MAXSIZE_BYTES) { return CAPACITY; }
    +  // Stage 1 index output
    +  size_t max_structures = SIMDJSON_ROUNDUP_N(capacity, 64) + 2 + 7;
    +  structural_indexes.reset( new (std::nothrow) uint32_t[max_structures] );
    +  if (!structural_indexes) { _capacity = 0; return MEMALLOC; }
    +  structural_indexes[0] = 0;
    +  n_structural_indexes = 0;
    +
    +  _capacity = capacity;
    +  return SUCCESS;
    +}
    +
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_max_depth(size_t max_depth) noexcept {
    +  // Stage 2 stacks
    +  open_containers.reset(new (std::nothrow) open_container[max_depth]);
    +  is_array.reset(new (std::nothrow) bool[max_depth]);
    +  if (!is_array || !open_containers) { _max_depth = 0; return MEMALLOC; }
    +
    +  _max_depth = max_depth;
    +  return SUCCESS;
    +}
    +
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +/* end file simdjson/generic/dom_parser_implementation.h for haswell */
    +/* including simdjson/generic/implementation_simdjson_result_base.h for haswell: #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base.h for haswell */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +
    +// This is a near copy of include/error.h's implementation_simdjson_result_base, except it doesn't use std::pair
    +// so we can avoid inlining errors
    +// TODO reconcile these!
    +/**
    + * The result of a simdjson operation that could fail.
    + *
    + * Gives the option of reading error codes, or throwing an exception by casting to the desired result.
    + *
    + * This is a base class for implementations that want to add functions to the result type for
    + * chaining.
    + *
    + * Override like:
    + *
    + *   struct simdjson_result : public internal::implementation_simdjson_result_base {
    + *     simdjson_result() noexcept : internal::implementation_simdjson_result_base() {}
    + *     simdjson_result(error_code error) noexcept : internal::implementation_simdjson_result_base(error) {}
    + *     simdjson_result(T &&value) noexcept : internal::implementation_simdjson_result_base(std::forward(value)) {}
    + *     simdjson_result(T &&value, error_code error) noexcept : internal::implementation_simdjson_result_base(value, error) {}
    + *     // Your extra methods here
    + *   }
    + *
    + * Then any method returning simdjson_result will be chainable with your methods.
    + */
    +template
    +struct implementation_simdjson_result_base {
    +
    +  /**
    +   * Create a new empty result with error = UNINITIALIZED.
    +   */
    +  simdjson_inline implementation_simdjson_result_base() noexcept = default;
    +
    +  /**
    +   * Create a new error result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(error_code error) noexcept;
    +
    +  /**
    +   * Create a new successful result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value) noexcept;
    +
    +  /**
    +   * Create a new result with both things (use if you don't want to branch when creating the result).
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value, error_code error) noexcept;
    +
    +  /**
    +   * Move the value and the error to the provided variables.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   * @param error The variable to assign the error to. Set to SUCCESS if there is no error.
    +   */
    +  simdjson_inline void tie(T &value, error_code &error) && noexcept;
    +
    +  /**
    +   * Move the value to the provided variable.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   */
    +  simdjson_inline error_code get(T &value) && noexcept;
    +
    +  /**
    +   * The error.
    +   */
    +  simdjson_inline error_code error() const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value.
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T& value() & noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& value() && noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& take_value() && noexcept(false);
    +
    +  /**
    +   * Cast to the value (will throw on error).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline operator T&&() && noexcept(false);
    +
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline const T& value_unsafe() const& noexcept;
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T& value_unsafe() & noexcept;
    +  /**
    +   * Take the result value (move it). This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T&& value_unsafe() && noexcept;
    +protected:
    +  /** users should never directly access first and second. **/
    +  T first{}; /** Users should never directly access 'first'. **/
    +  error_code second{UNINITIALIZED}; /** Users should never directly access 'second'. **/
    +}; // struct implementation_simdjson_result_base
    +
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +/* end file simdjson/generic/implementation_simdjson_result_base.h for haswell */
    +/* including simdjson/generic/numberparsing.h for haswell: #include "simdjson/generic/numberparsing.h" */
    +/* begin file simdjson/generic/numberparsing.h for haswell */
    +#ifndef SIMDJSON_GENERIC_NUMBERPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_NUMBERPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace numberparsing {
    +
    +#ifdef JSON_TEST_NUMBERS
    +#define INVALID_NUMBER(SRC) (found_invalid_number((SRC)), NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (found_integer((VALUE), (SRC)), (WRITER).append_s64((VALUE)))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (found_unsigned_integer((VALUE), (SRC)), (WRITER).append_u64((VALUE)))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (found_float((VALUE), (SRC)), (WRITER).append_double((VALUE)))
    +#else
    +#define INVALID_NUMBER(SRC) (NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (WRITER).append_s64((VALUE))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (WRITER).append_u64((VALUE))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (WRITER).append_double((VALUE))
    +#endif
    +
    +namespace {
    +
    +// Convert a mantissa, an exponent and a sign bit into an ieee64 double.
    +// The real_exponent needs to be in [0, 2046] (technically real_exponent = 2047 would be acceptable).
    +// The mantissa should be in [0,1<<53). The bit at index (1ULL << 52) while be zeroed.
    +simdjson_inline double to_double(uint64_t mantissa, uint64_t real_exponent, bool negative) {
    +    double d;
    +    mantissa &= ~(1ULL << 52);
    +    mantissa |= real_exponent << 52;
    +    mantissa |= ((static_cast(negative)) << 63);
    +    std::memcpy(&d, &mantissa, sizeof(d));
    +    return d;
    +}
    +
    +// Attempts to compute i * 10^(power) exactly; and if "negative" is
    +// true, negate the result.
    +// This function will only work in some cases, when it does not work, success is
    +// set to false. This should work *most of the time* (like 99% of the time).
    +// We assume that power is in the [smallest_power,
    +// largest_power] interval: the caller is responsible for this check.
    +simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative, double &d) {
    +  // we start with a fast path
    +  // It was described in
    +  // Clinger WD. How to read floating point numbers accurately.
    +  // ACM SIGPLAN Notices. 1990
    +#ifndef FLT_EVAL_METHOD
    +#error "FLT_EVAL_METHOD should be defined, please include cfloat."
    +#endif
    +#if (FLT_EVAL_METHOD != 1) && (FLT_EVAL_METHOD != 0)
    +  // We cannot be certain that x/y is rounded to nearest.
    +  if (0 <= power && power <= 22 && i <= 9007199254740991)
    +#else
    +  if (-22 <= power && power <= 22 && i <= 9007199254740991)
    +#endif
    +  {
    +    // convert the integer into a double. This is lossless since
    +    // 0 <= i <= 2^53 - 1.
    +    d = double(i);
    +    //
    +    // The general idea is as follows.
    +    // If 0 <= s < 2^53 and if 10^0 <= p <= 10^22 then
    +    // 1) Both s and p can be represented exactly as 64-bit floating-point
    +    // values
    +    // (binary64).
    +    // 2) Because s and p can be represented exactly as floating-point values,
    +    // then s * p
    +    // and s / p will produce correctly rounded values.
    +    //
    +    if (power < 0) {
    +      d = d / simdjson::internal::power_of_ten[-power];
    +    } else {
    +      d = d * simdjson::internal::power_of_ten[power];
    +    }
    +    if (negative) {
    +      d = -d;
    +    }
    +    return true;
    +  }
    +  // When 22 < power && power <  22 + 16, we could
    +  // hope for another, secondary fast path.  It was
    +  // described by David M. Gay in  "Correctly rounded
    +  // binary-decimal and decimal-binary conversions." (1990)
    +  // If you need to compute i * 10^(22 + x) for x < 16,
    +  // first compute i * 10^x, if you know that result is exact
    +  // (e.g., when i * 10^x < 2^53),
    +  // then you can still proceed and do (i * 10^x) * 10^22.
    +  // Is this worth your time?
    +  // You need  22 < power *and* power <  22 + 16 *and* (i * 10^(x-22) < 2^53)
    +  // for this second fast path to work.
    +  // If you you have 22 < power *and* power <  22 + 16, and then you
    +  // optimistically compute "i * 10^(x-22)", there is still a chance that you
    +  // have wasted your time if i * 10^(x-22) >= 2^53. It makes the use cases of
    +  // this optimization maybe less common than we would like. Source:
    +  // http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/
    +  // also used in RapidJSON: https://rapidjson.org/strtod_8h_source.html
    +
    +  // The fast path has now failed, so we are failing back on the slower path.
    +
    +  // In the slow path, we need to adjust i so that it is > 1<<63 which is always
    +  // possible, except if i == 0, so we handle i == 0 separately.
    +  if(i == 0) {
    +    d = negative ? -0.0 : 0.0;
    +    return true;
    +  }
    +
    +
    +  // The exponent is 1024 + 63 + power
    +  //     + floor(log(5**power)/log(2)).
    +  // The 1024 comes from the ieee64 standard.
    +  // The 63 comes from the fact that we use a 64-bit word.
    +  //
    +  // Computing floor(log(5**power)/log(2)) could be
    +  // slow. Instead we use a fast function.
    +  //
    +  // For power in (-400,350), we have that
    +  // (((152170 + 65536) * power ) >> 16);
    +  // is equal to
    +  //  floor(log(5**power)/log(2)) + power when power >= 0
    +  // and it is equal to
    +  //  ceil(log(5**-power)/log(2)) + power when power < 0
    +  //
    +  // The 65536 is (1<<16) and corresponds to
    +  // (65536 * power) >> 16 ---> power
    +  //
    +  // ((152170 * power ) >> 16) is equal to
    +  // floor(log(5**power)/log(2))
    +  //
    +  // Note that this is not magic: 152170/(1<<16) is
    +  // approximatively equal to log(5)/log(2).
    +  // The 1<<16 value is a power of two; we could use a
    +  // larger power of 2 if we wanted to.
    +  //
    +  int64_t exponent = (((152170 + 65536) * power) >> 16) + 1024 + 63;
    +
    +
    +  // We want the most significant bit of i to be 1. Shift if needed.
    +  int lz = leading_zeroes(i);
    +  i <<= lz;
    +
    +
    +  // We are going to need to do some 64-bit arithmetic to get a precise product.
    +  // We use a table lookup approach.
    +  // It is safe because
    +  // power >= smallest_power
    +  // and power <= largest_power
    +  // We recover the mantissa of the power, it has a leading 1. It is always
    +  // rounded down.
    +  //
    +  // We want the most significant 64 bits of the product. We know
    +  // this will be non-zero because the most significant bit of i is
    +  // 1.
    +  const uint32_t index = 2 * uint32_t(power - simdjson::internal::smallest_power);
    +  // Optimization: It may be that materializing the index as a variable might confuse some compilers and prevent effective complex-addressing loads. (Done for code clarity.)
    +  //
    +  // The full_multiplication function computes the 128-bit product of two 64-bit words
    +  // with a returned value of type value128 with a "low component" corresponding to the
    +  // 64-bit least significant bits of the product and with a "high component" corresponding
    +  // to the 64-bit most significant bits of the product.
    +  simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
    +  // Both i and power_of_five_128[index] have their most significant bit set to 1 which
    +  // implies that the either the most or the second most significant bit of the product
    +  // is 1. We pack values in this manner for efficiency reasons: it maximizes the use
    +  // we make of the product. It also makes it easy to reason about the product: there
    +  // is 0 or 1 leading zero in the product.
    +
    +  // Unless the least significant 9 bits of the high (64-bit) part of the full
    +  // product are all 1s, then we know that the most significant 55 bits are
    +  // exact and no further work is needed. Having 55 bits is necessary because
    +  // we need 53 bits for the mantissa but we have to have one rounding bit and
    +  // we can waste a bit if the most significant bit of the product is zero.
    +  if((firstproduct.high & 0x1FF) == 0x1FF) {
    +    // We want to compute i * 5^q, but only care about the top 55 bits at most.
    +    // Consider the scenario where q>=0. Then 5^q may not fit in 64-bits. Doing
    +    // the full computation is wasteful. So we do what is called a "truncated
    +    // multiplication".
    +    // We take the most significant 64-bits, and we put them in
    +    // power_of_five_128[index]. Usually, that's good enough to approximate i * 5^q
    +    // to the desired approximation using one multiplication. Sometimes it does not suffice.
    +    // Then we store the next most significant 64 bits in power_of_five_128[index + 1], and
    +    // then we get a better approximation to i * 5^q.
    +    //
    +    // That's for when q>=0. The logic for q<0 is somewhat similar but it is somewhat
    +    // more complicated.
    +    //
    +    // There is an extra layer of complexity in that we need more than 55 bits of
    +    // accuracy in the round-to-even scenario.
    +    //
    +    // The full_multiplication function computes the 128-bit product of two 64-bit words
    +    // with a returned value of type value128 with a "low component" corresponding to the
    +    // 64-bit least significant bits of the product and with a "high component" corresponding
    +    // to the 64-bit most significant bits of the product.
    +    simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
    +    firstproduct.low += secondproduct.high;
    +    if(secondproduct.high > firstproduct.low) { firstproduct.high++; }
    +    // As it has been proven by Noble Mushtak and Daniel Lemire in "Fast Number Parsing Without
    +    // Fallback" (https://arxiv.org/abs/2212.06644), at this point we are sure that the product
    +    // is sufficiently accurate, and more computation is not needed.
    +  }
    +  uint64_t lower = firstproduct.low;
    +  uint64_t upper = firstproduct.high;
    +  // The final mantissa should be 53 bits with a leading 1.
    +  // We shift it so that it occupies 54 bits with a leading 1.
    +  ///////
    +  uint64_t upperbit = upper >> 63;
    +  uint64_t mantissa = upper >> (upperbit + 9);
    +  lz += int(1 ^ upperbit);
    +
    +  // Here we have mantissa < (1<<54).
    +  int64_t real_exponent = exponent - lz;
    +  if (simdjson_unlikely(real_exponent <= 0)) { // we have a subnormal?
    +    // Here have that real_exponent <= 0 so -real_exponent >= 0
    +    if(-real_exponent + 1 >= 64) { // if we have more than 64 bits below the minimum exponent, you have a zero for sure.
    +      d = negative ? -0.0 : 0.0;
    +      return true;
    +    }
    +    // next line is safe because -real_exponent + 1 < 0
    +    mantissa >>= -real_exponent + 1;
    +    // Thankfully, we can't have both "round-to-even" and subnormals because
    +    // "round-to-even" only occurs for powers close to 0.
    +    mantissa += (mantissa & 1); // round up
    +    mantissa >>= 1;
    +    // There is a weird scenario where we don't have a subnormal but just.
    +    // Suppose we start with 2.2250738585072013e-308, we end up
    +    // with 0x3fffffffffffff x 2^-1023-53 which is technically subnormal
    +    // whereas 0x40000000000000 x 2^-1023-53  is normal. Now, we need to round
    +    // up 0x3fffffffffffff x 2^-1023-53  and once we do, we are no longer
    +    // subnormal, but we can only know this after rounding.
    +    // So we only declare a subnormal if we are smaller than the threshold.
    +    real_exponent = (mantissa < (uint64_t(1) << 52)) ? 0 : 1;
    +    d = to_double(mantissa, real_exponent, negative);
    +    return true;
    +  }
    +  // We have to round to even. The "to even" part
    +  // is only a problem when we are right in between two floats
    +  // which we guard against.
    +  // If we have lots of trailing zeros, we may fall right between two
    +  // floating-point values.
    +  //
    +  // The round-to-even cases take the form of a number 2m+1 which is in (2^53,2^54]
    +  // times a power of two. That is, it is right between a number with binary significand
    +  // m and another number with binary significand m+1; and it must be the case
    +  // that it cannot be represented by a float itself.
    +  //
    +  // We must have that w * 10 ^q == (2m+1) * 2^p for some power of two 2^p.
    +  // Recall that 10^q = 5^q * 2^q.
    +  // When q >= 0, we must have that (2m+1) is divible by 5^q, so 5^q <= 2^54. We have that
    +  //  5^23 <=  2^54 and it is the last power of five to qualify, so q <= 23.
    +  // When q<0, we have  w  >=  (2m+1) x 5^{-q}.  We must have that w<2^{64} so
    +  // (2m+1) x 5^{-q} < 2^{64}. We have that 2m+1>2^{53}. Hence, we must have
    +  // 2^{53} x 5^{-q} < 2^{64}.
    +  // Hence we have 5^{-q} < 2^{11}$ or q>= -4.
    +  //
    +  // We require lower <= 1 and not lower == 0 because we could not prove that
    +  // that lower == 0 is implied; but we could prove that lower <= 1 is a necessary and sufficient test.
    +  if (simdjson_unlikely((lower <= 1) && (power >= -4) && (power <= 23) && ((mantissa & 3) == 1))) {
    +    if((mantissa  << (upperbit + 64 - 53 - 2)) ==  upper) {
    +      mantissa &= ~1;             // flip it so that we do not round up
    +    }
    +  }
    +
    +  mantissa += mantissa & 1;
    +  mantissa >>= 1;
    +
    +  // Here we have mantissa < (1<<53), unless there was an overflow
    +  if (mantissa >= (1ULL << 53)) {
    +    //////////
    +    // This will happen when parsing values such as 7.2057594037927933e+16
    +    ////////
    +    mantissa = (1ULL << 52);
    +    real_exponent++;
    +  }
    +  mantissa &= ~(1ULL << 52);
    +  // we have to check that real_exponent is in range, otherwise we bail out
    +  if (simdjson_unlikely(real_exponent > 2046)) {
    +    // We have an infinite value!!! We could actually throw an error here if we could.
    +    return false;
    +  }
    +  d = to_double(mantissa, real_exponent, negative);
    +  return true;
    +}
    +
    +// We call a fallback floating-point parser that might be slow. Note
    +// it will accept JSON numbers, but the JSON spec. is more restrictive so
    +// before you call parse_float_fallback, you need to have validated the input
    +// string with the JSON grammar.
    +// It will return an error (false) if the parsed number is infinite.
    +// The string parsing itself always succeeds. We know that there is at least
    +// one digit.
    +static bool parse_float_fallback(const uint8_t *ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +static bool parse_float_fallback(const uint8_t *ptr, const uint8_t *end_ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr), reinterpret_cast(end_ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +// check quickly whether the next 8 chars are made of digits
    +// at a glance, it looks better than Mula's
    +// http://0x80.pl/articles/swar-digits-validate.html
    +simdjson_inline bool is_made_of_eight_digits_fast(const uint8_t *chars) {
    +  uint64_t val;
    +  // this can read up to 7 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(7 <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be bigger than 7");
    +  std::memcpy(&val, chars, 8);
    +  // a branchy method might be faster:
    +  // return (( val & 0xF0F0F0F0F0F0F0F0 ) == 0x3030303030303030)
    +  //  && (( (val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0 ) ==
    +  //  0x3030303030303030);
    +  return (((val & 0xF0F0F0F0F0F0F0F0) |
    +           (((val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0) >> 4)) ==
    +          0x3333333333333333);
    +}
    +
    +template
    +SIMDJSON_NO_SANITIZE_UNDEFINED // We deliberately allow overflow here and check later
    +simdjson_inline bool parse_digit(const uint8_t c, I &i) {
    +  const uint8_t digit = static_cast(c - '0');
    +  if (digit > 9) {
    +    return false;
    +  }
    +  // PERF NOTE: multiplication by 10 is cheaper than arbitrary integer multiplication
    +  i = 10 * i + digit; // might overflow, we will handle the overflow later
    +  return true;
    +}
    +
    +simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const uint8_t *const src, const uint8_t *&p, uint64_t &i, int64_t &exponent) {
    +  // we continue with the fiction that we have an integer. If the
    +  // floating point number is representable as x * 10^z for some integer
    +  // z that fits in 53 bits, then we will be able to convert back the
    +  // the integer into a float in a lossless manner.
    +  const uint8_t *const first_after_period = p;
    +
    +#ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +#if SIMDJSON_SWAR_NUMBER_PARSING
    +  // this helps if we have lots of decimals!
    +  // this turns out to be frequent enough.
    +  if (is_made_of_eight_digits_fast(p)) {
    +    i = i * 100000000 + parse_eight_digits_unrolled(p);
    +    p += 8;
    +  }
    +#endif // SIMDJSON_SWAR_NUMBER_PARSING
    +#endif // #ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +  // Unrolling the first digit makes a small difference on some implementations (e.g. westmere)
    +  if (parse_digit(*p, i)) { ++p; }
    +  while (parse_digit(*p, i)) { p++; }
    +  exponent = first_after_period - p;
    +  // Decimal without digits (123.) is illegal
    +  if (exponent == 0) {
    +    return INVALID_NUMBER(src);
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) {
    +  // Exp Sign: -123.456e[-]78
    +  bool neg_exp = ('-' == *p);
    +  if (neg_exp || '+' == *p) { p++; } // Skip + as well
    +
    +  // Exponent: -123.456e-[78]
    +  auto start_exp = p;
    +  int64_t exp_number = 0;
    +  while (parse_digit(*p, exp_number)) { ++p; }
    +  // It is possible for parse_digit to overflow.
    +  // In particular, it could overflow to INT64_MIN, and we cannot do - INT64_MIN.
    +  // Thus we *must* check for possible overflow before we negate exp_number.
    +
    +  // Performance notes: it may seem like combining the two "simdjson_unlikely checks" below into
    +  // a single simdjson_unlikely path would be faster. The reasoning is sound, but the compiler may
    +  // not oblige and may, in fact, generate two distinct paths in any case. It might be
    +  // possible to do uint64_t(p - start_exp - 1) >= 18 but it could end up trading off
    +  // instructions for a simdjson_likely branch, an unconclusive gain.
    +
    +  // If there were no digits, it's an error.
    +  if (simdjson_unlikely(p == start_exp)) {
    +    return INVALID_NUMBER(src);
    +  }
    +  // We have a valid positive exponent in exp_number at this point, except that
    +  // it may have overflowed.
    +
    +  // If there were more than 18 digits, we may have overflowed the integer. We have to do
    +  // something!!!!
    +  if (simdjson_unlikely(p > start_exp+18)) {
    +    // Skip leading zeroes: 1e000000000000000000001 is technically valid and doesn't overflow
    +    while (*start_exp == '0') { start_exp++; }
    +    // 19 digits could overflow int64_t and is kind of absurd anyway. We don't
    +    // support exponents smaller than -999,999,999,999,999,999 and bigger
    +    // than 999,999,999,999,999,999.
    +    // We can truncate.
    +    // Note that 999999999999999999 is assuredly too large. The maximal ieee64 value before
    +    // infinity is ~1.8e308. The smallest subnormal is ~5e-324. So, actually, we could
    +    // truncate at 324.
    +    // Note that there is no reason to fail per se at this point in time.
    +    // E.g., 0e999999999999999999999 is a fine number.
    +    if (p > start_exp+18) { exp_number = 999999999999999999; }
    +  }
    +  // At this point, we know that exp_number is a sane, positive, signed integer.
    +  // It is <= 999,999,999,999,999,999. As long as 'exponent' is in
    +  // [-8223372036854775808, 8223372036854775808], we won't overflow. Because 'exponent'
    +  // is bounded in magnitude by the size of the JSON input, we are fine in this universe.
    +  // To sum it up: the next line should never overflow.
    +  exponent += (neg_exp ? -exp_number : exp_number);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline size_t significant_digits(const uint8_t * start_digits, size_t digit_count) {
    +  // It is possible that the integer had an overflow.
    +  // We have to handle the case where we have 0.0000somenumber.
    +  const uint8_t *start = start_digits;
    +  while ((*start == '0') || (*start == '.')) { ++start; }
    +  // we over-decrement by one when there is a '.'
    +  return digit_count - size_t(start - start_digits);
    +}
    +
    +} // unnamed namespace
    +
    +/** @private */
    +template
    +error_code slow_float_parsing(simdjson_unused const uint8_t * src, W writer) {
    +  double d;
    +  if (parse_float_fallback(src, &d)) {
    +    writer.append_double(d);
    +    return SUCCESS;
    +  }
    +  return INVALID_NUMBER(src);
    +}
    +
    +/** @private */
    +template
    +simdjson_inline error_code write_float(const uint8_t *const src, bool negative, uint64_t i, const uint8_t * start_digits, size_t digit_count, int64_t exponent, W &writer) {
    +  // If we frequently had to deal with long strings of digits,
    +  // we could extend our code by using a 128-bit integer instead
    +  // of a 64-bit integer. However, this is uncommon in practice.
    +  //
    +  // 9999999999999999999 < 2**64 so we can accommodate 19 digits.
    +  // If we have a decimal separator, then digit_count - 1 is the number of digits, but we
    +  // may not have a decimal separator!
    +  if (simdjson_unlikely(digit_count > 19 && significant_digits(start_digits, digit_count) > 19)) {
    +    // Ok, chances are good that we had an overflow!
    +    // this is almost never going to get called!!!
    +    // we start anew, going slowly!!!
    +    // This will happen in the following examples:
    +    // 10000000000000000000000000000000000000000000e+308
    +    // 3.1415926535897932384626433832795028841971693993751
    +    //
    +    // NOTE: This makes a *copy* of the writer and passes it to slow_float_parsing. This happens
    +    // because slow_float_parsing is a non-inlined function. If we passed our writer reference to
    +    // it, it would force it to be stored in memory, preventing the compiler from picking it apart
    +    // and putting into registers. i.e. if we pass it as reference, it gets slow.
    +    // This is what forces the skip_double, as well.
    +    error_code error = slow_float_parsing(src, writer);
    +    writer.skip_double();
    +    return error;
    +  }
    +  // NOTE: it's weird that the simdjson_unlikely() only wraps half the if, but it seems to get slower any other
    +  // way we've tried: https://github.com/simdjson/simdjson/pull/990#discussion_r448497331
    +  // To future reader: we'd love if someone found a better way, or at least could explain this result!
    +  if (simdjson_unlikely(exponent < simdjson::internal::smallest_power) || (exponent > simdjson::internal::largest_power)) {
    +    //
    +    // Important: smallest_power is such that it leads to a zero value.
    +    // Observe that 18446744073709551615e-343 == 0, i.e. (2**64 - 1) e -343 is zero
    +    // so something x 10^-343 goes to zero, but not so with  something x 10^-342.
    +    static_assert(simdjson::internal::smallest_power <= -342, "smallest_power is not small enough");
    +    //
    +    if((exponent < simdjson::internal::smallest_power) || (i == 0)) {
    +      // E.g. Parse "-0.0e-999" into the same value as "-0.0". See https://en.wikipedia.org/wiki/Signed_zero
    +      WRITE_DOUBLE(negative ? -0.0 : 0.0, src, writer);
    +      return SUCCESS;
    +    } else { // (exponent > largest_power) and (i != 0)
    +      // We have, for sure, an infinite value and simdjson refuses to parse infinite values.
    +      return INVALID_NUMBER(src);
    +    }
    +  }
    +  double d;
    +  if (!compute_float_64(exponent, i, negative, d)) {
    +    // we are almost never going to get here.
    +    if (!parse_float_fallback(src, &d)) { return INVALID_NUMBER(src); }
    +  }
    +  WRITE_DOUBLE(d, src, writer);
    +  return SUCCESS;
    +}
    +
    +// for performance analysis, it is sometimes  useful to skip parsing
    +#ifdef SIMDJSON_SKIPNUMBERPARSING
    +
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const, W &writer) {
    +  writer.append_s64(0);        // always write zero
    +  return SUCCESS;              // always succeeds
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept { return number_type::signed_integer; }
    +#else
    +
    +// parse the number at src
    +// define JSON_TEST_NUMBERS for unit testing
    +//
    +// It is assumed that the number is followed by a structural ({,},],[) character
    +// or a white space character. If that is not the case (e.g., when the JSON
    +// document is made of a single number), then it is necessary to copy the
    +// content and append a space before calling this function.
    +//
    +// Our objective is accurate parsing (ULP of 0) at high speed.
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) {
    +
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  if (digit_count == 0 || ('0' == *start_digits && digit_count > 1)) { return INVALID_NUMBER(src); }
    +
    +  //
    +  // Handle floats if there is a . or e (or both)
    +  //
    +  int64_t exponent = 0;
    +  bool is_float = false;
    +  if ('.' == *p) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_decimal_after_separator(src, p, i, exponent) );
    +    digit_count = int(p - start_digits); // used later to guard against overflows
    +  }
    +  if (('e' == *p) || ('E' == *p)) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_exponent(src, p, exponent) );
    +  }
    +  if (is_float) {
    +    const bool dirty_end = jsoncharutils::is_not_structural_or_whitespace(*p);
    +    SIMDJSON_TRY( write_float(src, negative, i, start_digits, digit_count, exponent, writer) );
    +    if (dirty_end) { return INVALID_NUMBER(src); }
    +    return SUCCESS;
    +  }
    +
    +  // The longest negative 64-bit number is 19 digits.
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  size_t longest_digit_count = negative ? 19 : 20;
    +  if (digit_count > longest_digit_count) { return INVALID_NUMBER(src); }
    +  if (digit_count == longest_digit_count) {
    +    if (negative) {
    +      // Anything negative above INT64_MAX+1 is invalid
    +      if (i > uint64_t(INT64_MAX)+1) { return INVALID_NUMBER(src);  }
    +      WRITE_INTEGER(~i+1, src, writer);
    +      if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +      return SUCCESS;
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    }  else if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INVALID_NUMBER(src); }
    +  }
    +
    +  // Write unsigned if it doesn't fit in a signed integer.
    +  if (i > uint64_t(INT64_MAX)) {
    +    WRITE_UNSIGNED(i, src, writer);
    +  } else {
    +    WRITE_INTEGER(negative ? (~i+1) : i, src, writer);
    +  }
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +  return SUCCESS;
    +}
    +
    +// Inlineable functions
    +namespace {
    +
    +// This table can be used to characterize the final character of an integer
    +// string. For JSON structural character and allowable white space characters,
    +// we return SUCCESS. For 'e', '.' and 'E', we return INCORRECT_TYPE. Otherwise
    +// we return NUMBER_ERROR.
    +// Optimization note: we could easily reduce the size of the table by half (to 128)
    +// at the cost of an extra branch.
    +// Optimization note: we want the values to use at most 8 bits (not, e.g., 32 bits):
    +static_assert(error_code(uint8_t(NUMBER_ERROR))== NUMBER_ERROR, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(SUCCESS))== SUCCESS, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(INCORRECT_TYPE))== INCORRECT_TYPE, "bad NUMBER_ERROR cast");
    +
    +const uint8_t integer_string_finisher[256] = {
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   SUCCESS,      NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, INCORRECT_TYPE,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, SUCCESS,        NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR};
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if ((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src + 1;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    // Note: we use src[1] and not src[0] because src[0] is the quote character in this
    +    // instance.
    +    if (src[1] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = src;
    +  uint64_t i = 0;
    +  while (parse_digit(*src, i)) { src++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(src - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*src)) {
    +  //  return (*src == '.' || *src == 'e' || *src == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(*src != '"') { return NUMBER_ERROR; }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept {
    +  return (*src == '-');
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) { return true; }
    +  return false;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) {
    +    // We have an integer.
    +    // If the number is negative and valid, it must be a signed integer.
    +    if(negative) { return number_type::signed_integer; }
    +    // We want values larger or equal to 9223372036854775808 to be unsigned
    +    // integers, and the other values to be signed integers.
    +    int digit_count = int(p - src);
    +    if(digit_count >= 19) {
    +      const uint8_t * smaller_big_integer = reinterpret_cast("9223372036854775808");
    +      if((digit_count >= 20) || (memcmp(src, smaller_big_integer, 19) >= 0)) {
    +        return number_type::unsigned_integer;
    +      }
    +    }
    +    return number_type::signed_integer;
    +  }
    +  // Hopefully, we have 'e' or 'E' or '.'.
    +  return number_type::floating_point_number;
    +}
    +
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src, const uint8_t * const src_end) noexcept {
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  if(p == src_end) { return NUMBER_ERROR; }
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely((p != src_end) && (*p == '.'))) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if ((p == src_end) || !parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = start_digits-src > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if ((p != src_end) && (*p == 'e' || *p == 'E')) {
    +    p++;
    +    if(p == src_end) { return NUMBER_ERROR; }
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while ((p != src_end) && parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if ((p != src_end) && jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), src_end, &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +} // unnamed namespace
    +#endif // SIMDJSON_SKIPNUMBERPARSING
    +
    +} // namespace numberparsing
    +
    +inline std::ostream& operator<<(std::ostream& out, number_type type) noexcept {
    +    switch (type) {
    +        case number_type::signed_integer: out << "integer in [-9223372036854775808,9223372036854775808)"; break;
    +        case number_type::unsigned_integer: out << "unsigned integer in [9223372036854775808,18446744073709551616)"; break;
    +        case number_type::floating_point_number: out << "floating-point number (binary64)"; break;
    +        default: SIMDJSON_UNREACHABLE();
    +    }
    +    return out;
    +}
    +
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_NUMBERPARSING_H
    +/* end file simdjson/generic/numberparsing.h for haswell */
    +
    +/* including simdjson/generic/implementation_simdjson_result_base-inl.h for haswell: #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base-inl.h for haswell */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +
    +//
    +// internal::implementation_simdjson_result_base inline implementation
    +//
    +
    +template
    +simdjson_inline void implementation_simdjson_result_base::tie(T &value, error_code &error) && noexcept {
    +  error = this->second;
    +  if (!error) {
    +    value = std::forward>(*this).first;
    +  }
    +}
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::get(T &value) && noexcept {
    +  error_code error;
    +  std::forward>(*this).tie(value, error);
    +  return error;
    +}
    +
    +template
    +simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept {
    +  return this->second;
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::take_value() && noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::operator T&&() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline const T& implementation_simdjson_result_base::value_unsafe() const& noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value_unsafe() & noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value_unsafe() && noexcept {
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value, error_code error) noexcept
    +    : first{std::forward(value)}, second{error} {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(error_code error) noexcept
    +    : implementation_simdjson_result_base(T{}, error) {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value), SUCCESS) {}
    +
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +/* end file simdjson/generic/implementation_simdjson_result_base-inl.h for haswell */
    +/* end file simdjson/generic/amalgamated.h for haswell */
    +/* including simdjson/haswell/end.h: #include "simdjson/haswell/end.h" */
    +/* begin file simdjson/haswell/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_HASWELL
    +SIMDJSON_UNTARGET_REGION
    +#endif
    +
    +/* undefining SIMDJSON_IMPLEMENTATION from "haswell" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/haswell/end.h */
    +
    +#endif // SIMDJSON_HASWELL_H
    +/* end file simdjson/haswell.h */
    +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(icelake)
    +/* including simdjson/icelake.h: #include "simdjson/icelake.h" */
    +/* begin file simdjson/icelake.h */
    +#ifndef SIMDJSON_ICELAKE_H
    +#define SIMDJSON_ICELAKE_H
    +
    +/* including simdjson/icelake/begin.h: #include "simdjson/icelake/begin.h" */
    +/* begin file simdjson/icelake/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "icelake" */
    +#define SIMDJSON_IMPLEMENTATION icelake
    +/* including simdjson/icelake/base.h: #include "simdjson/icelake/base.h" */
    +/* begin file simdjson/icelake/base.h */
    +#ifndef SIMDJSON_ICELAKE_BASE_H
    +#define SIMDJSON_ICELAKE_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_ICELAKE
    +namespace simdjson {
    +/**
    + * Implementation for Icelake (Intel AVX512).
    + */
    +namespace icelake {
    +
    +class implementation;
    +
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ICELAKE_BASE_H
    +/* end file simdjson/icelake/base.h */
    +/* including simdjson/icelake/intrinsics.h: #include "simdjson/icelake/intrinsics.h" */
    +/* begin file simdjson/icelake/intrinsics.h */
    +#ifndef SIMDJSON_ICELAKE_INTRINSICS_H
    +#define SIMDJSON_ICELAKE_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if SIMDJSON_VISUAL_STUDIO
    +// under clang within visual studio, this will include 
    +#include   // visual studio or clang
    +#else
    +#include  // elsewhere
    +#endif // SIMDJSON_VISUAL_STUDIO
    +
    +#if SIMDJSON_CLANG_VISUAL_STUDIO
    +/**
    + * You are not supposed, normally, to include these
    + * headers directly. Instead you should either include intrin.h
    + * or x86intrin.h. However, when compiling with clang
    + * under Windows (i.e., when _MSC_VER is set), these headers
    + * only get included *if* the corresponding features are detected
    + * from macros:
    + * e.g., if __AVX2__ is set... in turn,  we normally set these
    + * macros by compiling against the corresponding architecture
    + * (e.g., arch:AVX2, -mavx2, etc.) which compiles the whole
    + * software with these advanced instructions. In simdjson, we
    + * want to compile the whole program for a generic target,
    + * and only target our specific kernels. As a workaround,
    + * we directly include the needed headers. These headers would
    + * normally guard against such usage, but we carefully included
    + *   (or ) before, so the headers
    + * are fooled.
    + */
    +#include    // for _blsr_u64
    +#include  // for  __lzcnt64
    +#include    // for most things (AVX2, AVX512, _popcnt64)
    +#include 
    +#include 
    +#include 
    +#include 
    +#include    // for  _mm_clmulepi64_si128
    +// Important: we need the AVX-512 headers:
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +// unfortunately, we may not get _blsr_u64, but, thankfully, clang
    +// has it as a macro.
    +#ifndef _blsr_u64
    +// we roll our own
    +#define _blsr_u64(n) ((n - 1) & n)
    +#endif //  _blsr_u64
    +#endif // SIMDJSON_CLANG_VISUAL_STUDIO
    +
    +static_assert(sizeof(__m512i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for icelake");
    +
    +#endif // SIMDJSON_ICELAKE_INTRINSICS_H
    +/* end file simdjson/icelake/intrinsics.h */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_ICELAKE
    +SIMDJSON_TARGET_REGION("avx512f,avx512dq,avx512cd,avx512bw,avx512vbmi,avx512vbmi2,avx512vl,avx2,bmi,pclmul,lzcnt,popcnt")
    +#endif
    +
    +/* including simdjson/icelake/bitmanipulation.h: #include "simdjson/icelake/bitmanipulation.h" */
    +/* begin file simdjson/icelake/bitmanipulation.h */
    +#ifndef SIMDJSON_ICELAKE_BITMANIPULATION_H
    +#define SIMDJSON_ICELAKE_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return (int)_tzcnt_u64(input_num);
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  ////////
    +  // You might expect the next line to be equivalent to
    +  // return (int)_tzcnt_u64(input_num);
    +  // but the generated code differs and might be less efficient?
    +  ////////
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return _blsr_u64(input_num);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +  return int(_lzcnt_u64(input_num));
    +}
    +
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +simdjson_inline unsigned __int64 count_ones(uint64_t input_num) {
    +  // note: we do not support legacy 32-bit Windows
    +  return __popcnt64(input_num);// Visual Studio wants two underscores
    +}
    +#else
    +simdjson_inline long long int count_ones(uint64_t input_num) {
    +  return _popcnt64(input_num);
    +}
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2,
    +                                uint64_t *result) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return _addcarry_u64(0, value1, value2,
    +                       reinterpret_cast(result));
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ICELAKE_BITMANIPULATION_H
    +/* end file simdjson/icelake/bitmanipulation.h */
    +/* including simdjson/icelake/bitmask.h: #include "simdjson/icelake/bitmask.h" */
    +/* begin file simdjson/icelake/bitmask.h */
    +#ifndef SIMDJSON_ICELAKE_BITMASK_H
    +#define SIMDJSON_ICELAKE_BITMASK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +
    +//
    +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered.
    +//
    +// For example, prefix_xor(00100100) == 00011100
    +//
    +simdjson_inline uint64_t prefix_xor(const uint64_t bitmask) {
    +  // There should be no such thing with a processor supporting avx2
    +  // but not clmul.
    +  __m128i all_ones = _mm_set1_epi8('\xFF');
    +  __m128i result = _mm_clmulepi64_si128(_mm_set_epi64x(0ULL, bitmask), all_ones, 0);
    +  return _mm_cvtsi128_si64(result);
    +}
    +
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ICELAKE_BITMASK_H
    +/* end file simdjson/icelake/bitmask.h */
    +/* including simdjson/icelake/simd.h: #include "simdjson/icelake/simd.h" */
    +/* begin file simdjson/icelake/simd.h */
    +#ifndef SIMDJSON_ICELAKE_SIMD_H
    +#define SIMDJSON_ICELAKE_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if defined(__GNUC__) && !defined(__clang__)
    +#if __GNUC__ == 8
    +#define SIMDJSON_GCC8 1
    +#endif //  __GNUC__ == 8
    +#endif // defined(__GNUC__) && !defined(__clang__)
    +
    +#if SIMDJSON_GCC8
    +/**
    + * GCC 8 fails to provide _mm512_set_epi8. We roll our own.
    + */
    +inline __m512i _mm512_set_epi8(uint8_t a0, uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4, uint8_t a5, uint8_t a6, uint8_t a7, uint8_t a8, uint8_t a9, uint8_t a10, uint8_t a11, uint8_t a12, uint8_t a13, uint8_t a14, uint8_t a15, uint8_t a16, uint8_t a17, uint8_t a18, uint8_t a19, uint8_t a20, uint8_t a21, uint8_t a22, uint8_t a23, uint8_t a24, uint8_t a25, uint8_t a26, uint8_t a27, uint8_t a28, uint8_t a29, uint8_t a30, uint8_t a31, uint8_t a32, uint8_t a33, uint8_t a34, uint8_t a35, uint8_t a36, uint8_t a37, uint8_t a38, uint8_t a39, uint8_t a40, uint8_t a41, uint8_t a42, uint8_t a43, uint8_t a44, uint8_t a45, uint8_t a46, uint8_t a47, uint8_t a48, uint8_t a49, uint8_t a50, uint8_t a51, uint8_t a52, uint8_t a53, uint8_t a54, uint8_t a55, uint8_t a56, uint8_t a57, uint8_t a58, uint8_t a59, uint8_t a60, uint8_t a61, uint8_t a62, uint8_t a63) {
    +  return _mm512_set_epi64(uint64_t(a7) + (uint64_t(a6) << 8) + (uint64_t(a5) << 16) + (uint64_t(a4) << 24) + (uint64_t(a3) << 32) + (uint64_t(a2) << 40) + (uint64_t(a1) << 48) + (uint64_t(a0) << 56),
    +                          uint64_t(a15) + (uint64_t(a14) << 8) + (uint64_t(a13) << 16) + (uint64_t(a12) << 24) + (uint64_t(a11) << 32) + (uint64_t(a10) << 40) + (uint64_t(a9) << 48) + (uint64_t(a8) << 56),
    +                          uint64_t(a23) + (uint64_t(a22) << 8) + (uint64_t(a21) << 16) + (uint64_t(a20) << 24) + (uint64_t(a19) << 32) + (uint64_t(a18) << 40) + (uint64_t(a17) << 48) + (uint64_t(a16) << 56),
    +                          uint64_t(a31) + (uint64_t(a30) << 8) + (uint64_t(a29) << 16) + (uint64_t(a28) << 24) + (uint64_t(a27) << 32) + (uint64_t(a26) << 40) + (uint64_t(a25) << 48) + (uint64_t(a24) << 56),
    +                          uint64_t(a39) + (uint64_t(a38) << 8) + (uint64_t(a37) << 16) + (uint64_t(a36) << 24) + (uint64_t(a35) << 32) + (uint64_t(a34) << 40) + (uint64_t(a33) << 48) + (uint64_t(a32) << 56),
    +                          uint64_t(a47) + (uint64_t(a46) << 8) + (uint64_t(a45) << 16) + (uint64_t(a44) << 24) + (uint64_t(a43) << 32) + (uint64_t(a42) << 40) + (uint64_t(a41) << 48) + (uint64_t(a40) << 56),
    +                          uint64_t(a55) + (uint64_t(a54) << 8) + (uint64_t(a53) << 16) + (uint64_t(a52) << 24) + (uint64_t(a51) << 32) + (uint64_t(a50) << 40) + (uint64_t(a49) << 48) + (uint64_t(a48) << 56),
    +                          uint64_t(a63) + (uint64_t(a62) << 8) + (uint64_t(a61) << 16) + (uint64_t(a60) << 24) + (uint64_t(a59) << 32) + (uint64_t(a58) << 40) + (uint64_t(a57) << 48) + (uint64_t(a56) << 56));
    +}
    +#endif // SIMDJSON_GCC8
    +
    +
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +namespace simd {
    +
    +  // Forward-declared so they can be used by splat and friends.
    +  template
    +  struct base {
    +    __m512i value;
    +
    +    // Zero constructor
    +    simdjson_inline base() : value{__m512i()} {}
    +
    +    // Conversion from SIMD register
    +    simdjson_inline base(const __m512i _value) : value(_value) {}
    +
    +    // Conversion to SIMD register
    +    simdjson_inline operator const __m512i&() const { return this->value; }
    +    simdjson_inline operator __m512i&() { return this->value; }
    +
    +    // Bit operations
    +    simdjson_inline Child operator|(const Child other) const { return _mm512_or_si512(*this, other); }
    +    simdjson_inline Child operator&(const Child other) const { return _mm512_and_si512(*this, other); }
    +    simdjson_inline Child operator^(const Child other) const { return _mm512_xor_si512(*this, other); }
    +    simdjson_inline Child bit_andnot(const Child other) const { return _mm512_andnot_si512(other, *this); }
    +    simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast | other; return *this_cast; }
    +    simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast & other; return *this_cast; }
    +    simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast ^ other; return *this_cast; }
    +  };
    +
    +  // Forward-declared so they can be used by splat and friends.
    +  template
    +  struct simd8;
    +
    +  template>
    +  struct base8: base> {
    +    typedef uint32_t bitmask_t;
    +    typedef uint64_t bitmask2_t;
    +
    +    simdjson_inline base8() : base>() {}
    +    simdjson_inline base8(const __m512i _value) : base>(_value) {}
    +
    +    friend simdjson_really_inline uint64_t operator==(const simd8 lhs, const simd8 rhs) {
    +      return _mm512_cmpeq_epi8_mask(lhs, rhs);
    +    }
    +
    +    static const int SIZE = sizeof(base::value);
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +     // workaround for compilers unable to figure out that 16 - N is a constant (GCC 8)
    +      constexpr int shift = 16 - N;
    +      return _mm512_alignr_epi8(*this, _mm512_permutex2var_epi64(prev_chunk, _mm512_set_epi64(13, 12, 11, 10, 9, 8, 7, 6), *this), shift);
    +    }
    +  };
    +
    +  // SIMD byte mask type (returned by things like eq and gt)
    +  template<>
    +  struct simd8: base8 {
    +    static simdjson_inline simd8 splat(bool _value) { return _mm512_set1_epi8(uint8_t(-(!!_value))); }
    +
    +    simdjson_inline simd8() : base8() {}
    +    simdjson_inline simd8(const __m512i _value) : base8(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(bool _value) : base8(splat(_value)) {}
    +    simdjson_inline bool any() const { return !!_mm512_test_epi8_mask (*this, *this); }
    +    simdjson_inline simd8 operator~() const { return *this ^ true; }
    +  };
    +
    +  template
    +  struct base8_numeric: base8 {
    +    static simdjson_inline simd8 splat(T _value) { return _mm512_set1_epi8(_value); }
    +    static simdjson_inline simd8 zero() { return _mm512_setzero_si512(); }
    +    static simdjson_inline simd8 load(const T values[64]) {
    +      return _mm512_loadu_si512(reinterpret_cast(values));
    +    }
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    static simdjson_inline simd8 repeat_16(
    +      T v0,  T v1,  T v2,  T v3,  T v4,  T v5,  T v6,  T v7,
    +      T v8,  T v9,  T v10, T v11, T v12, T v13, T v14, T v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    simdjson_inline base8_numeric() : base8() {}
    +    simdjson_inline base8_numeric(const __m512i _value) : base8(_value) {}
    +
    +    // Store to array
    +    simdjson_inline void store(T dst[64]) const { return _mm512_storeu_si512(reinterpret_cast<__m512i *>(dst), *this); }
    +
    +    // Addition/subtraction are the same for signed and unsigned
    +    simdjson_inline simd8 operator+(const simd8 other) const { return _mm512_add_epi8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return _mm512_sub_epi8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *static_cast*>(this); }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *static_cast*>(this); }
    +
    +    // Override to distinguish from bool version
    +    simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +
    +    // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values)
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return _mm512_shuffle_epi8(lookup_table, *this);
    +    }
    +
    +    // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset).
    +    // Passing a 0 value for mask would be equivalent to writing out every byte to output.
    +    // Only the first 32 - count_ones(mask) bytes of the result are significant but 32 bytes
    +    // get written.
    +    // Design consideration: it seems like a function with the
    +    // signature simd8 compress(uint32_t mask) would be
    +    // sensible, but the AVX ISA makes this kind of approach difficult.
    +    template
    +    simdjson_inline void compress(uint64_t mask, L * output) const {
    +      _mm512_mask_compressstoreu_epi8 (output,~mask,*this);
    +    }
    +
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +  };
    +
    +  // Signed bytes
    +  template<>
    +  struct simd8 : base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m512i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const int8_t values[64]) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15,
    +      int8_t v16, int8_t v17, int8_t v18, int8_t v19, int8_t v20, int8_t v21, int8_t v22, int8_t v23,
    +      int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, int8_t v30, int8_t v31,
    +      int8_t v32, int8_t v33, int8_t v34, int8_t v35, int8_t v36, int8_t v37, int8_t v38, int8_t v39,
    +      int8_t v40, int8_t v41, int8_t v42, int8_t v43, int8_t v44, int8_t v45, int8_t v46, int8_t v47,
    +      int8_t v48, int8_t v49, int8_t v50, int8_t v51, int8_t v52, int8_t v53, int8_t v54, int8_t v55,
    +      int8_t v56, int8_t v57, int8_t v58, int8_t v59, int8_t v60, int8_t v61, int8_t v62, int8_t v63
    +    ) : simd8(_mm512_set_epi8(
    +      v63, v62, v61, v60, v59, v58, v57, v56,
    +      v55, v54, v53, v52, v51, v50, v49, v48,
    +      v47, v46, v45, v44, v43, v42, v41, v40,
    +      v39, v38, v37, v36, v35, v34, v33, v32,
    +      v31, v30, v29, v28, v27, v26, v25, v24,
    +      v23, v22, v21, v20, v19, v18, v17, v16,
    +      v15, v14, v13, v12, v11, v10,  v9,  v8,
    +       v7,  v6,  v5,  v4,  v3,  v2,  v1,  v0
    +    )) {}
    +
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Order-sensitive comparisons
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm512_max_epi8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm512_min_epi8(*this, other); }
    +
    +    simdjson_inline simd8 operator>(const simd8 other) const { return _mm512_maskz_abs_epi8(_mm512_cmpgt_epi8_mask(*this, other),_mm512_set1_epi8(uint8_t(0x80))); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return _mm512_maskz_abs_epi8(_mm512_cmpgt_epi8_mask(other, *this),_mm512_set1_epi8(uint8_t(0x80))); }
    +  };
    +
    +  // Unsigned bytes
    +  template<>
    +  struct simd8: base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m512i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const uint8_t values[64]) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15,
    +      uint8_t v16, uint8_t v17, uint8_t v18, uint8_t v19, uint8_t v20, uint8_t v21, uint8_t v22, uint8_t v23,
    +      uint8_t v24, uint8_t v25, uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, uint8_t v31,
    +      uint8_t v32, uint8_t v33, uint8_t v34, uint8_t v35, uint8_t v36, uint8_t v37, uint8_t v38, uint8_t v39,
    +      uint8_t v40, uint8_t v41, uint8_t v42, uint8_t v43, uint8_t v44, uint8_t v45, uint8_t v46, uint8_t v47,
    +      uint8_t v48, uint8_t v49, uint8_t v50, uint8_t v51, uint8_t v52, uint8_t v53, uint8_t v54, uint8_t v55,
    +      uint8_t v56, uint8_t v57, uint8_t v58, uint8_t v59, uint8_t v60, uint8_t v61, uint8_t v62, uint8_t v63
    +    ) : simd8(_mm512_set_epi8(
    +      v63, v62, v61, v60, v59, v58, v57, v56,
    +      v55, v54, v53, v52, v51, v50, v49, v48,
    +      v47, v46, v45, v44, v43, v42, v41, v40,
    +      v39, v38, v37, v36, v35, v34, v33, v32,
    +      v31, v30, v29, v28, v27, v26, v25, v24,
    +      v23, v22, v21, v20, v19, v18, v17, v16,
    +      v15, v14, v13, v12, v11, v10,  v9,  v8,
    +       v7,  v6,  v5,  v4,  v3,  v2,  v1,  v0
    +    )) {}
    +
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Saturated math
    +    simdjson_inline simd8 saturating_add(const simd8 other) const { return _mm512_adds_epu8(*this, other); }
    +    simdjson_inline simd8 saturating_sub(const simd8 other) const { return _mm512_subs_epu8(*this, other); }
    +
    +    // Order-specific operations
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm512_max_epu8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm512_min_epu8(other, *this); }
    +    // Same as >, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 gt_bits(const simd8 other) const { return this->saturating_sub(other); }
    +    // Same as <, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 lt_bits(const simd8 other) const { return other.saturating_sub(*this); }
    +    simdjson_inline uint64_t operator<=(const simd8 other) const { return other.max_val(*this) == other; }
    +    simdjson_inline uint64_t operator>=(const simd8 other) const { return other.min_val(*this) == other; }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return this->lt_bits(other).any_bits_set(); }
    +
    +    // Bit-specific operations
    +    simdjson_inline simd8 bits_not_set() const { return _mm512_mask_blend_epi8(*this == uint8_t(0), _mm512_set1_epi8(0), _mm512_set1_epi8(-1)); }
    +    simdjson_inline simd8 bits_not_set(simd8 bits) const { return (*this & bits).bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set() const { return ~this->bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set(simd8 bits) const { return ~this->bits_not_set(bits); }
    +
    +    simdjson_inline bool is_ascii() const { return _mm512_movepi8_mask(*this) == 0; }
    +    simdjson_inline bool bits_not_set_anywhere() const {
    +      return !_mm512_test_epi8_mask(*this, *this);
    +    }
    +    simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); }
    +    simdjson_inline bool bits_not_set_anywhere(simd8 bits) const { return !_mm512_test_epi8_mask(*this, bits); }
    +    simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return !bits_not_set_anywhere(bits); }
    +    template
    +    simdjson_inline simd8 shr() const { return simd8(_mm512_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); }
    +    template
    +    simdjson_inline simd8 shl() const { return simd8(_mm512_slli_epi16(*this, N)) & uint8_t(0xFFu << N); }
    +    // Get one of the bits and make a bitmask out of it.
    +    // e.g. value.get_bit<7>() gets the high bit
    +    template
    +    simdjson_inline uint64_t get_bit() const { return _mm512_movepi8_mask(_mm512_slli_epi16(*this, 7-N)); }
    +  };
    +
    +  template
    +  struct simd8x64 {
    +    static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +    static_assert(NUM_CHUNKS == 1, "Icelake kernel should use one register per 64-byte block.");
    +    const simd8 chunks[NUM_CHUNKS];
    +
    +    simd8x64(const simd8x64& o) = delete; // no copy allowed
    +    simd8x64& operator=(const simd8& other) = delete; // no assignment allowed
    +    simd8x64() = delete; // no default constructor allowed
    +
    +    simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1) : chunks{chunk0, chunk1} {}
    +    simdjson_inline simd8x64(const simd8 chunk0) : chunks{chunk0} {}
    +    simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8::load(ptr)} {}
    +
    +    simdjson_inline uint64_t compress(uint64_t mask, T * output) const {
    +      this->chunks[0].compress(mask, output);
    +      return 64 - count_ones(mask);
    +    }
    +
    +    simdjson_inline void store(T ptr[64]) const {
    +      this->chunks[0].store(ptr+sizeof(simd8)*0);
    +    }
    +
    +    simdjson_inline simd8 reduce_or() const {
    +      return this->chunks[0];
    +    }
    +
    +    simdjson_inline simd8x64 bit_or(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return simd8x64(
    +        this->chunks[0] | mask
    +      );
    +    }
    +
    +    simdjson_inline uint64_t eq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return this->chunks[0] == mask;
    +    }
    +
    +    simdjson_inline uint64_t eq(const simd8x64 &other) const {
    +      return this->chunks[0] == other.chunks[0];
    +    }
    +
    +    simdjson_inline uint64_t lteq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return this->chunks[0] <= mask;
    +    }
    +  }; // struct simd8x64
    +
    +} // namespace simd
    +
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ICELAKE_SIMD_H
    +/* end file simdjson/icelake/simd.h */
    +/* including simdjson/icelake/stringparsing_defs.h: #include "simdjson/icelake/stringparsing_defs.h" */
    +/* begin file simdjson/icelake/stringparsing_defs.h */
    +#ifndef SIMDJSON_ICELAKE_STRINGPARSING_DEFS_H
    +#define SIMDJSON_ICELAKE_STRINGPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/simd.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +
    +using namespace simd;
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 64;
    +  simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; }
    +  simdjson_inline bool has_backslash() { return ((quote_bits - 1) & bs_bits) != 0; }
    +  simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); }
    +  simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); }
    +
    +  uint64_t bs_bits;
    +  uint64_t quote_bits;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // this can read up to 15 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes");
    +  simd8 v(src);
    +  // store to dest unconditionally - we can overwrite the bits we don't like later
    +  v.store(dst);
    +  return {
    +      static_cast(v == '\\'), // bs_bits
    +      static_cast(v == '"'), // quote_bits
    +  };
    +}
    +
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ICELAKE_STRINGPARSING_DEFS_H
    +/* end file simdjson/icelake/stringparsing_defs.h */
    +/* including simdjson/icelake/numberparsing_defs.h: #include "simdjson/icelake/numberparsing_defs.h" */
    +/* begin file simdjson/icelake/numberparsing_defs.h */
    +#ifndef SIMDJSON_ICELAKE_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_ICELAKE_NUMBERPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace numberparsing {
    +
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  // this actually computes *16* values so we are being wasteful.
    +  const __m128i ascii0 = _mm_set1_epi8('0');
    +  const __m128i mul_1_10 =
    +      _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1);
    +  const __m128i mul_1_100 = _mm_setr_epi16(100, 1, 100, 1, 100, 1, 100, 1);
    +  const __m128i mul_1_10000 =
    +      _mm_setr_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1);
    +  const __m128i input = _mm_sub_epi8(
    +      _mm_loadu_si128(reinterpret_cast(chars)), ascii0);
    +  const __m128i t1 = _mm_maddubs_epi16(input, mul_1_10);
    +  const __m128i t2 = _mm_madd_epi16(t1, mul_1_100);
    +  const __m128i t3 = _mm_packus_epi32(t2, t2);
    +  const __m128i t4 = _mm_madd_epi16(t3, mul_1_10000);
    +  return _mm_cvtsi128_si32(
    +      t4); // only captures the sum of the first 8 digits, drop the rest
    +}
    +
    +/** @private */
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif // SIMDJSON_ICELAKE_NUMBERPARSING_DEFS_H
    +/* end file simdjson/icelake/numberparsing_defs.h */
    +/* end file simdjson/icelake/begin.h */
    +/* including simdjson/generic/amalgamated.h for icelake: #include "simdjson/generic/amalgamated.h" */
    +/* begin file simdjson/generic/amalgamated.h for icelake */
    +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_DEPENDENCIES_H)
    +#error simdjson/generic/dependencies.h must be included before simdjson/generic/amalgamated.h!
    +#endif
    +
    +/* including simdjson/generic/base.h for icelake: #include "simdjson/generic/base.h" */
    +/* begin file simdjson/generic/base.h for icelake */
    +#ifndef SIMDJSON_GENERIC_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): // If we haven't got an implementation yet, we're in the editor, editing a generic file! Just */
    +/* amalgamation skipped (editor-only): // use the most advanced one we can so the most possible stuff can be tested. */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation_detection.h" */
    +/* amalgamation skipped (editor-only): #if SIMDJSON_IMPLEMENTATION_ICELAKE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_HASWELL */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_WESTMERE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_ARM64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */
    +/* amalgamation skipped (editor-only): #else */
    +/* amalgamation skipped (editor-only): #error "All possible implementations (including fallback) have been disabled! simdjson will not run." */
    +/* amalgamation skipped (editor-only): #endif */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +
    +struct open_container;
    +class dom_parser_implementation;
    +
    +/**
    + * The type of a JSON number
    + */
    +enum class number_type {
    +    floating_point_number=1, /// a binary64 number
    +    signed_integer,          /// a signed integer that fits in a 64-bit word using two's complement
    +    unsigned_integer         /// a positive integer larger or equal to 1<<63
    +};
    +
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_BASE_H
    +/* end file simdjson/generic/base.h for icelake */
    +/* including simdjson/generic/jsoncharutils.h for icelake: #include "simdjson/generic/jsoncharutils.h" */
    +/* begin file simdjson/generic/jsoncharutils.h for icelake */
    +#ifndef SIMDJSON_GENERIC_JSONCHARUTILS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_JSONCHARUTILS_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/jsoncharutils_tables.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +namespace jsoncharutils {
    +
    +// return non-zero if not a structural or whitespace char
    +// zero otherwise
    +simdjson_inline uint32_t is_not_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace_negated[c];
    +}
    +
    +simdjson_inline uint32_t is_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace[c];
    +}
    +
    +// returns a value with the high 16 bits set if not valid
    +// otherwise returns the conversion of the 4 hex digits at src into the bottom
    +// 16 bits of the 32-bit return register
    +//
    +// see
    +// https://lemire.me/blog/2019/04/17/parsing-short-hexadecimal-strings-efficiently/
    +static inline uint32_t hex_to_u32_nocheck(
    +    const uint8_t *src) { // strictly speaking, static inline is a C-ism
    +  uint32_t v1 = internal::digit_to_val32[630 + src[0]];
    +  uint32_t v2 = internal::digit_to_val32[420 + src[1]];
    +  uint32_t v3 = internal::digit_to_val32[210 + src[2]];
    +  uint32_t v4 = internal::digit_to_val32[0 + src[3]];
    +  return v1 | v2 | v3 | v4;
    +}
    +
    +// given a code point cp, writes to c
    +// the utf-8 code, outputting the length in
    +// bytes, if the length is zero, the code point
    +// is invalid
    +//
    +// This can possibly be made faster using pdep
    +// and clz and table lookups, but JSON documents
    +// have few escaped code points, and the following
    +// function looks cheap.
    +//
    +// Note: we assume that surrogates are treated separately
    +//
    +simdjson_inline size_t codepoint_to_utf8(uint32_t cp, uint8_t *c) {
    +  if (cp <= 0x7F) {
    +    c[0] = uint8_t(cp);
    +    return 1; // ascii
    +  }
    +  if (cp <= 0x7FF) {
    +    c[0] = uint8_t((cp >> 6) + 192);
    +    c[1] = uint8_t((cp & 63) + 128);
    +    return 2; // universal plane
    +    //  Surrogates are treated elsewhere...
    +    //} //else if (0xd800 <= cp && cp <= 0xdfff) {
    +    //  return 0; // surrogates // could put assert here
    +  } else if (cp <= 0xFFFF) {
    +    c[0] = uint8_t((cp >> 12) + 224);
    +    c[1] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[2] = uint8_t((cp & 63) + 128);
    +    return 3;
    +  } else if (cp <= 0x10FFFF) { // if you know you have a valid code point, this
    +                               // is not needed
    +    c[0] = uint8_t((cp >> 18) + 240);
    +    c[1] = uint8_t(((cp >> 12) & 63) + 128);
    +    c[2] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[3] = uint8_t((cp & 63) + 128);
    +    return 4;
    +  }
    +  // will return 0 when the code point was too large.
    +  return 0; // bad r
    +}
    +
    +#if SIMDJSON_IS_32BITS // _umul128 for x86, arm
    +// this is a slow emulation routine for 32-bit
    +//
    +static simdjson_inline uint64_t __emulu(uint32_t x, uint32_t y) {
    +  return x * (uint64_t)y;
    +}
    +static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) {
    +  uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd);
    +  uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd);
    +  uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32));
    +  uint64_t adbc_carry = !!(adbc < ad);
    +  uint64_t lo = bd + (adbc << 32);
    +  *hi = __emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) +
    +        (adbc_carry << 32) + !!(lo < bd);
    +  return lo;
    +}
    +#endif
    +
    +} // namespace jsoncharutils
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_JSONCHARUTILS_H
    +/* end file simdjson/generic/jsoncharutils.h for icelake */
    +/* including simdjson/generic/atomparsing.h for icelake: #include "simdjson/generic/atomparsing.h" */
    +/* begin file simdjson/generic/atomparsing.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ATOMPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ATOMPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +/// @private
    +namespace atomparsing {
    +
    +// The string_to_uint32 is exclusively used to map literal strings to 32-bit values.
    +// We use memcpy instead of a pointer cast to avoid undefined behaviors since we cannot
    +// be certain that the character pointer will be properly aligned.
    +// You might think that using memcpy makes this function expensive, but you'd be wrong.
    +// All decent optimizing compilers (GCC, clang, Visual Studio) will compile string_to_uint32("false");
    +// to the compile-time constant 1936482662.
    +simdjson_inline uint32_t string_to_uint32(const char* str) { uint32_t val; std::memcpy(&val, str, sizeof(uint32_t)); return val; }
    +
    +
    +// Again in str4ncmp we use a memcpy to avoid undefined behavior. The memcpy may appear expensive.
    +// Yet all decent optimizing compilers will compile memcpy to a single instruction, just about.
    +simdjson_warn_unused
    +simdjson_inline uint32_t str4ncmp(const uint8_t *src, const char* atom) {
    +  uint32_t srcval; // we want to avoid unaligned 32-bit loads (undefined in C/C++)
    +  static_assert(sizeof(uint32_t) <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be larger than 4 bytes");
    +  std::memcpy(&srcval, src, sizeof(uint32_t));
    +  return srcval ^ string_to_uint32(atom);
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "true") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_true_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "true"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src) {
    +  return (str4ncmp(src+1, "alse") | jsoncharutils::is_not_structural_or_whitespace(src[5])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src, size_t len) {
    +  if (len > 5) { return is_valid_false_atom(src); }
    +  else if (len == 5) { return !str4ncmp(src+1, "alse"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "null") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_null_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "null"); }
    +  else { return false; }
    +}
    +
    +} // namespace atomparsing
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ATOMPARSING_H
    +/* end file simdjson/generic/atomparsing.h for icelake */
    +/* including simdjson/generic/dom_parser_implementation.h for icelake: #include "simdjson/generic/dom_parser_implementation.h" */
    +/* begin file simdjson/generic/dom_parser_implementation.h for icelake */
    +#ifndef SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +
    +// expectation: sizeof(open_container) = 64/8.
    +struct open_container {
    +  uint32_t tape_index; // where, on the tape, does the scope ([,{) begins
    +  uint32_t count; // how many elements in the scope
    +}; // struct open_container
    +
    +static_assert(sizeof(open_container) == 64/8, "Open container must be 64 bits");
    +
    +class dom_parser_implementation final : public internal::dom_parser_implementation {
    +public:
    +  /** Tape location of each open { or [ */
    +  std::unique_ptr open_containers{};
    +  /** Whether each open container is a [ or { */
    +  std::unique_ptr is_array{};
    +  /** Buffer passed to stage 1 */
    +  const uint8_t *buf{};
    +  /** Length passed to stage 1 */
    +  size_t len{0};
    +  /** Document passed to stage 2 */
    +  dom::document *doc{};
    +
    +  inline dom_parser_implementation() noexcept;
    +  inline dom_parser_implementation(dom_parser_implementation &&other) noexcept;
    +  inline dom_parser_implementation &operator=(dom_parser_implementation &&other) noexcept;
    +  dom_parser_implementation(const dom_parser_implementation &) = delete;
    +  dom_parser_implementation &operator=(const dom_parser_implementation &) = delete;
    +
    +  simdjson_warn_unused error_code parse(const uint8_t *buf, size_t len, dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage1(const uint8_t *buf, size_t len, stage1_mode partial) noexcept final;
    +  simdjson_warn_unused error_code stage2(dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage2_next(dom::document &doc) noexcept final;
    +  simdjson_warn_unused uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) const noexcept final;
    +  simdjson_warn_unused uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept final;
    +  inline simdjson_warn_unused error_code set_capacity(size_t capacity) noexcept final;
    +  inline simdjson_warn_unused error_code set_max_depth(size_t max_depth) noexcept final;
    +private:
    +  simdjson_inline simdjson_warn_unused error_code set_capacity_stage1(size_t capacity);
    +
    +};
    +
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +namespace icelake {
    +
    +inline dom_parser_implementation::dom_parser_implementation() noexcept = default;
    +inline dom_parser_implementation::dom_parser_implementation(dom_parser_implementation &&other) noexcept = default;
    +inline dom_parser_implementation &dom_parser_implementation::operator=(dom_parser_implementation &&other) noexcept = default;
    +
    +// Leaving these here so they can be inlined if so desired
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_capacity(size_t capacity) noexcept {
    +  if(capacity > SIMDJSON_MAXSIZE_BYTES) { return CAPACITY; }
    +  // Stage 1 index output
    +  size_t max_structures = SIMDJSON_ROUNDUP_N(capacity, 64) + 2 + 7;
    +  structural_indexes.reset( new (std::nothrow) uint32_t[max_structures] );
    +  if (!structural_indexes) { _capacity = 0; return MEMALLOC; }
    +  structural_indexes[0] = 0;
    +  n_structural_indexes = 0;
    +
    +  _capacity = capacity;
    +  return SUCCESS;
    +}
    +
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_max_depth(size_t max_depth) noexcept {
    +  // Stage 2 stacks
    +  open_containers.reset(new (std::nothrow) open_container[max_depth]);
    +  is_array.reset(new (std::nothrow) bool[max_depth]);
    +  if (!is_array || !open_containers) { _max_depth = 0; return MEMALLOC; }
    +
    +  _max_depth = max_depth;
    +  return SUCCESS;
    +}
    +
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +/* end file simdjson/generic/dom_parser_implementation.h for icelake */
    +/* including simdjson/generic/implementation_simdjson_result_base.h for icelake: #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base.h for icelake */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +
    +// This is a near copy of include/error.h's implementation_simdjson_result_base, except it doesn't use std::pair
    +// so we can avoid inlining errors
    +// TODO reconcile these!
    +/**
    + * The result of a simdjson operation that could fail.
    + *
    + * Gives the option of reading error codes, or throwing an exception by casting to the desired result.
    + *
    + * This is a base class for implementations that want to add functions to the result type for
    + * chaining.
    + *
    + * Override like:
    + *
    + *   struct simdjson_result : public internal::implementation_simdjson_result_base {
    + *     simdjson_result() noexcept : internal::implementation_simdjson_result_base() {}
    + *     simdjson_result(error_code error) noexcept : internal::implementation_simdjson_result_base(error) {}
    + *     simdjson_result(T &&value) noexcept : internal::implementation_simdjson_result_base(std::forward(value)) {}
    + *     simdjson_result(T &&value, error_code error) noexcept : internal::implementation_simdjson_result_base(value, error) {}
    + *     // Your extra methods here
    + *   }
    + *
    + * Then any method returning simdjson_result will be chainable with your methods.
    + */
    +template
    +struct implementation_simdjson_result_base {
    +
    +  /**
    +   * Create a new empty result with error = UNINITIALIZED.
    +   */
    +  simdjson_inline implementation_simdjson_result_base() noexcept = default;
    +
    +  /**
    +   * Create a new error result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(error_code error) noexcept;
    +
    +  /**
    +   * Create a new successful result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value) noexcept;
    +
    +  /**
    +   * Create a new result with both things (use if you don't want to branch when creating the result).
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value, error_code error) noexcept;
    +
    +  /**
    +   * Move the value and the error to the provided variables.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   * @param error The variable to assign the error to. Set to SUCCESS if there is no error.
    +   */
    +  simdjson_inline void tie(T &value, error_code &error) && noexcept;
    +
    +  /**
    +   * Move the value to the provided variable.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   */
    +  simdjson_inline error_code get(T &value) && noexcept;
    +
    +  /**
    +   * The error.
    +   */
    +  simdjson_inline error_code error() const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value.
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T& value() & noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& value() && noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& take_value() && noexcept(false);
    +
    +  /**
    +   * Cast to the value (will throw on error).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline operator T&&() && noexcept(false);
    +
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline const T& value_unsafe() const& noexcept;
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T& value_unsafe() & noexcept;
    +  /**
    +   * Take the result value (move it). This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T&& value_unsafe() && noexcept;
    +protected:
    +  /** users should never directly access first and second. **/
    +  T first{}; /** Users should never directly access 'first'. **/
    +  error_code second{UNINITIALIZED}; /** Users should never directly access 'second'. **/
    +}; // struct implementation_simdjson_result_base
    +
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +/* end file simdjson/generic/implementation_simdjson_result_base.h for icelake */
    +/* including simdjson/generic/numberparsing.h for icelake: #include "simdjson/generic/numberparsing.h" */
    +/* begin file simdjson/generic/numberparsing.h for icelake */
    +#ifndef SIMDJSON_GENERIC_NUMBERPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_NUMBERPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace numberparsing {
    +
    +#ifdef JSON_TEST_NUMBERS
    +#define INVALID_NUMBER(SRC) (found_invalid_number((SRC)), NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (found_integer((VALUE), (SRC)), (WRITER).append_s64((VALUE)))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (found_unsigned_integer((VALUE), (SRC)), (WRITER).append_u64((VALUE)))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (found_float((VALUE), (SRC)), (WRITER).append_double((VALUE)))
    +#else
    +#define INVALID_NUMBER(SRC) (NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (WRITER).append_s64((VALUE))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (WRITER).append_u64((VALUE))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (WRITER).append_double((VALUE))
    +#endif
    +
    +namespace {
    +
    +// Convert a mantissa, an exponent and a sign bit into an ieee64 double.
    +// The real_exponent needs to be in [0, 2046] (technically real_exponent = 2047 would be acceptable).
    +// The mantissa should be in [0,1<<53). The bit at index (1ULL << 52) while be zeroed.
    +simdjson_inline double to_double(uint64_t mantissa, uint64_t real_exponent, bool negative) {
    +    double d;
    +    mantissa &= ~(1ULL << 52);
    +    mantissa |= real_exponent << 52;
    +    mantissa |= ((static_cast(negative)) << 63);
    +    std::memcpy(&d, &mantissa, sizeof(d));
    +    return d;
    +}
    +
    +// Attempts to compute i * 10^(power) exactly; and if "negative" is
    +// true, negate the result.
    +// This function will only work in some cases, when it does not work, success is
    +// set to false. This should work *most of the time* (like 99% of the time).
    +// We assume that power is in the [smallest_power,
    +// largest_power] interval: the caller is responsible for this check.
    +simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative, double &d) {
    +  // we start with a fast path
    +  // It was described in
    +  // Clinger WD. How to read floating point numbers accurately.
    +  // ACM SIGPLAN Notices. 1990
    +#ifndef FLT_EVAL_METHOD
    +#error "FLT_EVAL_METHOD should be defined, please include cfloat."
    +#endif
    +#if (FLT_EVAL_METHOD != 1) && (FLT_EVAL_METHOD != 0)
    +  // We cannot be certain that x/y is rounded to nearest.
    +  if (0 <= power && power <= 22 && i <= 9007199254740991)
    +#else
    +  if (-22 <= power && power <= 22 && i <= 9007199254740991)
    +#endif
    +  {
    +    // convert the integer into a double. This is lossless since
    +    // 0 <= i <= 2^53 - 1.
    +    d = double(i);
    +    //
    +    // The general idea is as follows.
    +    // If 0 <= s < 2^53 and if 10^0 <= p <= 10^22 then
    +    // 1) Both s and p can be represented exactly as 64-bit floating-point
    +    // values
    +    // (binary64).
    +    // 2) Because s and p can be represented exactly as floating-point values,
    +    // then s * p
    +    // and s / p will produce correctly rounded values.
    +    //
    +    if (power < 0) {
    +      d = d / simdjson::internal::power_of_ten[-power];
    +    } else {
    +      d = d * simdjson::internal::power_of_ten[power];
    +    }
    +    if (negative) {
    +      d = -d;
    +    }
    +    return true;
    +  }
    +  // When 22 < power && power <  22 + 16, we could
    +  // hope for another, secondary fast path.  It was
    +  // described by David M. Gay in  "Correctly rounded
    +  // binary-decimal and decimal-binary conversions." (1990)
    +  // If you need to compute i * 10^(22 + x) for x < 16,
    +  // first compute i * 10^x, if you know that result is exact
    +  // (e.g., when i * 10^x < 2^53),
    +  // then you can still proceed and do (i * 10^x) * 10^22.
    +  // Is this worth your time?
    +  // You need  22 < power *and* power <  22 + 16 *and* (i * 10^(x-22) < 2^53)
    +  // for this second fast path to work.
    +  // If you you have 22 < power *and* power <  22 + 16, and then you
    +  // optimistically compute "i * 10^(x-22)", there is still a chance that you
    +  // have wasted your time if i * 10^(x-22) >= 2^53. It makes the use cases of
    +  // this optimization maybe less common than we would like. Source:
    +  // http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/
    +  // also used in RapidJSON: https://rapidjson.org/strtod_8h_source.html
    +
    +  // The fast path has now failed, so we are failing back on the slower path.
    +
    +  // In the slow path, we need to adjust i so that it is > 1<<63 which is always
    +  // possible, except if i == 0, so we handle i == 0 separately.
    +  if(i == 0) {
    +    d = negative ? -0.0 : 0.0;
    +    return true;
    +  }
    +
    +
    +  // The exponent is 1024 + 63 + power
    +  //     + floor(log(5**power)/log(2)).
    +  // The 1024 comes from the ieee64 standard.
    +  // The 63 comes from the fact that we use a 64-bit word.
    +  //
    +  // Computing floor(log(5**power)/log(2)) could be
    +  // slow. Instead we use a fast function.
    +  //
    +  // For power in (-400,350), we have that
    +  // (((152170 + 65536) * power ) >> 16);
    +  // is equal to
    +  //  floor(log(5**power)/log(2)) + power when power >= 0
    +  // and it is equal to
    +  //  ceil(log(5**-power)/log(2)) + power when power < 0
    +  //
    +  // The 65536 is (1<<16) and corresponds to
    +  // (65536 * power) >> 16 ---> power
    +  //
    +  // ((152170 * power ) >> 16) is equal to
    +  // floor(log(5**power)/log(2))
    +  //
    +  // Note that this is not magic: 152170/(1<<16) is
    +  // approximatively equal to log(5)/log(2).
    +  // The 1<<16 value is a power of two; we could use a
    +  // larger power of 2 if we wanted to.
    +  //
    +  int64_t exponent = (((152170 + 65536) * power) >> 16) + 1024 + 63;
    +
    +
    +  // We want the most significant bit of i to be 1. Shift if needed.
    +  int lz = leading_zeroes(i);
    +  i <<= lz;
    +
    +
    +  // We are going to need to do some 64-bit arithmetic to get a precise product.
    +  // We use a table lookup approach.
    +  // It is safe because
    +  // power >= smallest_power
    +  // and power <= largest_power
    +  // We recover the mantissa of the power, it has a leading 1. It is always
    +  // rounded down.
    +  //
    +  // We want the most significant 64 bits of the product. We know
    +  // this will be non-zero because the most significant bit of i is
    +  // 1.
    +  const uint32_t index = 2 * uint32_t(power - simdjson::internal::smallest_power);
    +  // Optimization: It may be that materializing the index as a variable might confuse some compilers and prevent effective complex-addressing loads. (Done for code clarity.)
    +  //
    +  // The full_multiplication function computes the 128-bit product of two 64-bit words
    +  // with a returned value of type value128 with a "low component" corresponding to the
    +  // 64-bit least significant bits of the product and with a "high component" corresponding
    +  // to the 64-bit most significant bits of the product.
    +  simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
    +  // Both i and power_of_five_128[index] have their most significant bit set to 1 which
    +  // implies that the either the most or the second most significant bit of the product
    +  // is 1. We pack values in this manner for efficiency reasons: it maximizes the use
    +  // we make of the product. It also makes it easy to reason about the product: there
    +  // is 0 or 1 leading zero in the product.
    +
    +  // Unless the least significant 9 bits of the high (64-bit) part of the full
    +  // product are all 1s, then we know that the most significant 55 bits are
    +  // exact and no further work is needed. Having 55 bits is necessary because
    +  // we need 53 bits for the mantissa but we have to have one rounding bit and
    +  // we can waste a bit if the most significant bit of the product is zero.
    +  if((firstproduct.high & 0x1FF) == 0x1FF) {
    +    // We want to compute i * 5^q, but only care about the top 55 bits at most.
    +    // Consider the scenario where q>=0. Then 5^q may not fit in 64-bits. Doing
    +    // the full computation is wasteful. So we do what is called a "truncated
    +    // multiplication".
    +    // We take the most significant 64-bits, and we put them in
    +    // power_of_five_128[index]. Usually, that's good enough to approximate i * 5^q
    +    // to the desired approximation using one multiplication. Sometimes it does not suffice.
    +    // Then we store the next most significant 64 bits in power_of_five_128[index + 1], and
    +    // then we get a better approximation to i * 5^q.
    +    //
    +    // That's for when q>=0. The logic for q<0 is somewhat similar but it is somewhat
    +    // more complicated.
    +    //
    +    // There is an extra layer of complexity in that we need more than 55 bits of
    +    // accuracy in the round-to-even scenario.
    +    //
    +    // The full_multiplication function computes the 128-bit product of two 64-bit words
    +    // with a returned value of type value128 with a "low component" corresponding to the
    +    // 64-bit least significant bits of the product and with a "high component" corresponding
    +    // to the 64-bit most significant bits of the product.
    +    simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
    +    firstproduct.low += secondproduct.high;
    +    if(secondproduct.high > firstproduct.low) { firstproduct.high++; }
    +    // As it has been proven by Noble Mushtak and Daniel Lemire in "Fast Number Parsing Without
    +    // Fallback" (https://arxiv.org/abs/2212.06644), at this point we are sure that the product
    +    // is sufficiently accurate, and more computation is not needed.
    +  }
    +  uint64_t lower = firstproduct.low;
    +  uint64_t upper = firstproduct.high;
    +  // The final mantissa should be 53 bits with a leading 1.
    +  // We shift it so that it occupies 54 bits with a leading 1.
    +  ///////
    +  uint64_t upperbit = upper >> 63;
    +  uint64_t mantissa = upper >> (upperbit + 9);
    +  lz += int(1 ^ upperbit);
    +
    +  // Here we have mantissa < (1<<54).
    +  int64_t real_exponent = exponent - lz;
    +  if (simdjson_unlikely(real_exponent <= 0)) { // we have a subnormal?
    +    // Here have that real_exponent <= 0 so -real_exponent >= 0
    +    if(-real_exponent + 1 >= 64) { // if we have more than 64 bits below the minimum exponent, you have a zero for sure.
    +      d = negative ? -0.0 : 0.0;
    +      return true;
    +    }
    +    // next line is safe because -real_exponent + 1 < 0
    +    mantissa >>= -real_exponent + 1;
    +    // Thankfully, we can't have both "round-to-even" and subnormals because
    +    // "round-to-even" only occurs for powers close to 0.
    +    mantissa += (mantissa & 1); // round up
    +    mantissa >>= 1;
    +    // There is a weird scenario where we don't have a subnormal but just.
    +    // Suppose we start with 2.2250738585072013e-308, we end up
    +    // with 0x3fffffffffffff x 2^-1023-53 which is technically subnormal
    +    // whereas 0x40000000000000 x 2^-1023-53  is normal. Now, we need to round
    +    // up 0x3fffffffffffff x 2^-1023-53  and once we do, we are no longer
    +    // subnormal, but we can only know this after rounding.
    +    // So we only declare a subnormal if we are smaller than the threshold.
    +    real_exponent = (mantissa < (uint64_t(1) << 52)) ? 0 : 1;
    +    d = to_double(mantissa, real_exponent, negative);
    +    return true;
    +  }
    +  // We have to round to even. The "to even" part
    +  // is only a problem when we are right in between two floats
    +  // which we guard against.
    +  // If we have lots of trailing zeros, we may fall right between two
    +  // floating-point values.
    +  //
    +  // The round-to-even cases take the form of a number 2m+1 which is in (2^53,2^54]
    +  // times a power of two. That is, it is right between a number with binary significand
    +  // m and another number with binary significand m+1; and it must be the case
    +  // that it cannot be represented by a float itself.
    +  //
    +  // We must have that w * 10 ^q == (2m+1) * 2^p for some power of two 2^p.
    +  // Recall that 10^q = 5^q * 2^q.
    +  // When q >= 0, we must have that (2m+1) is divible by 5^q, so 5^q <= 2^54. We have that
    +  //  5^23 <=  2^54 and it is the last power of five to qualify, so q <= 23.
    +  // When q<0, we have  w  >=  (2m+1) x 5^{-q}.  We must have that w<2^{64} so
    +  // (2m+1) x 5^{-q} < 2^{64}. We have that 2m+1>2^{53}. Hence, we must have
    +  // 2^{53} x 5^{-q} < 2^{64}.
    +  // Hence we have 5^{-q} < 2^{11}$ or q>= -4.
    +  //
    +  // We require lower <= 1 and not lower == 0 because we could not prove that
    +  // that lower == 0 is implied; but we could prove that lower <= 1 is a necessary and sufficient test.
    +  if (simdjson_unlikely((lower <= 1) && (power >= -4) && (power <= 23) && ((mantissa & 3) == 1))) {
    +    if((mantissa  << (upperbit + 64 - 53 - 2)) ==  upper) {
    +      mantissa &= ~1;             // flip it so that we do not round up
    +    }
    +  }
    +
    +  mantissa += mantissa & 1;
    +  mantissa >>= 1;
    +
    +  // Here we have mantissa < (1<<53), unless there was an overflow
    +  if (mantissa >= (1ULL << 53)) {
    +    //////////
    +    // This will happen when parsing values such as 7.2057594037927933e+16
    +    ////////
    +    mantissa = (1ULL << 52);
    +    real_exponent++;
    +  }
    +  mantissa &= ~(1ULL << 52);
    +  // we have to check that real_exponent is in range, otherwise we bail out
    +  if (simdjson_unlikely(real_exponent > 2046)) {
    +    // We have an infinite value!!! We could actually throw an error here if we could.
    +    return false;
    +  }
    +  d = to_double(mantissa, real_exponent, negative);
    +  return true;
    +}
    +
    +// We call a fallback floating-point parser that might be slow. Note
    +// it will accept JSON numbers, but the JSON spec. is more restrictive so
    +// before you call parse_float_fallback, you need to have validated the input
    +// string with the JSON grammar.
    +// It will return an error (false) if the parsed number is infinite.
    +// The string parsing itself always succeeds. We know that there is at least
    +// one digit.
    +static bool parse_float_fallback(const uint8_t *ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +static bool parse_float_fallback(const uint8_t *ptr, const uint8_t *end_ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr), reinterpret_cast(end_ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +// check quickly whether the next 8 chars are made of digits
    +// at a glance, it looks better than Mula's
    +// http://0x80.pl/articles/swar-digits-validate.html
    +simdjson_inline bool is_made_of_eight_digits_fast(const uint8_t *chars) {
    +  uint64_t val;
    +  // this can read up to 7 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(7 <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be bigger than 7");
    +  std::memcpy(&val, chars, 8);
    +  // a branchy method might be faster:
    +  // return (( val & 0xF0F0F0F0F0F0F0F0 ) == 0x3030303030303030)
    +  //  && (( (val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0 ) ==
    +  //  0x3030303030303030);
    +  return (((val & 0xF0F0F0F0F0F0F0F0) |
    +           (((val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0) >> 4)) ==
    +          0x3333333333333333);
    +}
    +
    +template
    +SIMDJSON_NO_SANITIZE_UNDEFINED // We deliberately allow overflow here and check later
    +simdjson_inline bool parse_digit(const uint8_t c, I &i) {
    +  const uint8_t digit = static_cast(c - '0');
    +  if (digit > 9) {
    +    return false;
    +  }
    +  // PERF NOTE: multiplication by 10 is cheaper than arbitrary integer multiplication
    +  i = 10 * i + digit; // might overflow, we will handle the overflow later
    +  return true;
    +}
    +
    +simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const uint8_t *const src, const uint8_t *&p, uint64_t &i, int64_t &exponent) {
    +  // we continue with the fiction that we have an integer. If the
    +  // floating point number is representable as x * 10^z for some integer
    +  // z that fits in 53 bits, then we will be able to convert back the
    +  // the integer into a float in a lossless manner.
    +  const uint8_t *const first_after_period = p;
    +
    +#ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +#if SIMDJSON_SWAR_NUMBER_PARSING
    +  // this helps if we have lots of decimals!
    +  // this turns out to be frequent enough.
    +  if (is_made_of_eight_digits_fast(p)) {
    +    i = i * 100000000 + parse_eight_digits_unrolled(p);
    +    p += 8;
    +  }
    +#endif // SIMDJSON_SWAR_NUMBER_PARSING
    +#endif // #ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +  // Unrolling the first digit makes a small difference on some implementations (e.g. westmere)
    +  if (parse_digit(*p, i)) { ++p; }
    +  while (parse_digit(*p, i)) { p++; }
    +  exponent = first_after_period - p;
    +  // Decimal without digits (123.) is illegal
    +  if (exponent == 0) {
    +    return INVALID_NUMBER(src);
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) {
    +  // Exp Sign: -123.456e[-]78
    +  bool neg_exp = ('-' == *p);
    +  if (neg_exp || '+' == *p) { p++; } // Skip + as well
    +
    +  // Exponent: -123.456e-[78]
    +  auto start_exp = p;
    +  int64_t exp_number = 0;
    +  while (parse_digit(*p, exp_number)) { ++p; }
    +  // It is possible for parse_digit to overflow.
    +  // In particular, it could overflow to INT64_MIN, and we cannot do - INT64_MIN.
    +  // Thus we *must* check for possible overflow before we negate exp_number.
    +
    +  // Performance notes: it may seem like combining the two "simdjson_unlikely checks" below into
    +  // a single simdjson_unlikely path would be faster. The reasoning is sound, but the compiler may
    +  // not oblige and may, in fact, generate two distinct paths in any case. It might be
    +  // possible to do uint64_t(p - start_exp - 1) >= 18 but it could end up trading off
    +  // instructions for a simdjson_likely branch, an unconclusive gain.
    +
    +  // If there were no digits, it's an error.
    +  if (simdjson_unlikely(p == start_exp)) {
    +    return INVALID_NUMBER(src);
    +  }
    +  // We have a valid positive exponent in exp_number at this point, except that
    +  // it may have overflowed.
    +
    +  // If there were more than 18 digits, we may have overflowed the integer. We have to do
    +  // something!!!!
    +  if (simdjson_unlikely(p > start_exp+18)) {
    +    // Skip leading zeroes: 1e000000000000000000001 is technically valid and doesn't overflow
    +    while (*start_exp == '0') { start_exp++; }
    +    // 19 digits could overflow int64_t and is kind of absurd anyway. We don't
    +    // support exponents smaller than -999,999,999,999,999,999 and bigger
    +    // than 999,999,999,999,999,999.
    +    // We can truncate.
    +    // Note that 999999999999999999 is assuredly too large. The maximal ieee64 value before
    +    // infinity is ~1.8e308. The smallest subnormal is ~5e-324. So, actually, we could
    +    // truncate at 324.
    +    // Note that there is no reason to fail per se at this point in time.
    +    // E.g., 0e999999999999999999999 is a fine number.
    +    if (p > start_exp+18) { exp_number = 999999999999999999; }
    +  }
    +  // At this point, we know that exp_number is a sane, positive, signed integer.
    +  // It is <= 999,999,999,999,999,999. As long as 'exponent' is in
    +  // [-8223372036854775808, 8223372036854775808], we won't overflow. Because 'exponent'
    +  // is bounded in magnitude by the size of the JSON input, we are fine in this universe.
    +  // To sum it up: the next line should never overflow.
    +  exponent += (neg_exp ? -exp_number : exp_number);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline size_t significant_digits(const uint8_t * start_digits, size_t digit_count) {
    +  // It is possible that the integer had an overflow.
    +  // We have to handle the case where we have 0.0000somenumber.
    +  const uint8_t *start = start_digits;
    +  while ((*start == '0') || (*start == '.')) { ++start; }
    +  // we over-decrement by one when there is a '.'
    +  return digit_count - size_t(start - start_digits);
    +}
    +
    +} // unnamed namespace
    +
    +/** @private */
    +template
    +error_code slow_float_parsing(simdjson_unused const uint8_t * src, W writer) {
    +  double d;
    +  if (parse_float_fallback(src, &d)) {
    +    writer.append_double(d);
    +    return SUCCESS;
    +  }
    +  return INVALID_NUMBER(src);
    +}
    +
    +/** @private */
    +template
    +simdjson_inline error_code write_float(const uint8_t *const src, bool negative, uint64_t i, const uint8_t * start_digits, size_t digit_count, int64_t exponent, W &writer) {
    +  // If we frequently had to deal with long strings of digits,
    +  // we could extend our code by using a 128-bit integer instead
    +  // of a 64-bit integer. However, this is uncommon in practice.
    +  //
    +  // 9999999999999999999 < 2**64 so we can accommodate 19 digits.
    +  // If we have a decimal separator, then digit_count - 1 is the number of digits, but we
    +  // may not have a decimal separator!
    +  if (simdjson_unlikely(digit_count > 19 && significant_digits(start_digits, digit_count) > 19)) {
    +    // Ok, chances are good that we had an overflow!
    +    // this is almost never going to get called!!!
    +    // we start anew, going slowly!!!
    +    // This will happen in the following examples:
    +    // 10000000000000000000000000000000000000000000e+308
    +    // 3.1415926535897932384626433832795028841971693993751
    +    //
    +    // NOTE: This makes a *copy* of the writer and passes it to slow_float_parsing. This happens
    +    // because slow_float_parsing is a non-inlined function. If we passed our writer reference to
    +    // it, it would force it to be stored in memory, preventing the compiler from picking it apart
    +    // and putting into registers. i.e. if we pass it as reference, it gets slow.
    +    // This is what forces the skip_double, as well.
    +    error_code error = slow_float_parsing(src, writer);
    +    writer.skip_double();
    +    return error;
    +  }
    +  // NOTE: it's weird that the simdjson_unlikely() only wraps half the if, but it seems to get slower any other
    +  // way we've tried: https://github.com/simdjson/simdjson/pull/990#discussion_r448497331
    +  // To future reader: we'd love if someone found a better way, or at least could explain this result!
    +  if (simdjson_unlikely(exponent < simdjson::internal::smallest_power) || (exponent > simdjson::internal::largest_power)) {
    +    //
    +    // Important: smallest_power is such that it leads to a zero value.
    +    // Observe that 18446744073709551615e-343 == 0, i.e. (2**64 - 1) e -343 is zero
    +    // so something x 10^-343 goes to zero, but not so with  something x 10^-342.
    +    static_assert(simdjson::internal::smallest_power <= -342, "smallest_power is not small enough");
    +    //
    +    if((exponent < simdjson::internal::smallest_power) || (i == 0)) {
    +      // E.g. Parse "-0.0e-999" into the same value as "-0.0". See https://en.wikipedia.org/wiki/Signed_zero
    +      WRITE_DOUBLE(negative ? -0.0 : 0.0, src, writer);
    +      return SUCCESS;
    +    } else { // (exponent > largest_power) and (i != 0)
    +      // We have, for sure, an infinite value and simdjson refuses to parse infinite values.
    +      return INVALID_NUMBER(src);
    +    }
    +  }
    +  double d;
    +  if (!compute_float_64(exponent, i, negative, d)) {
    +    // we are almost never going to get here.
    +    if (!parse_float_fallback(src, &d)) { return INVALID_NUMBER(src); }
    +  }
    +  WRITE_DOUBLE(d, src, writer);
    +  return SUCCESS;
    +}
    +
    +// for performance analysis, it is sometimes  useful to skip parsing
    +#ifdef SIMDJSON_SKIPNUMBERPARSING
    +
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const, W &writer) {
    +  writer.append_s64(0);        // always write zero
    +  return SUCCESS;              // always succeeds
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept { return number_type::signed_integer; }
    +#else
    +
    +// parse the number at src
    +// define JSON_TEST_NUMBERS for unit testing
    +//
    +// It is assumed that the number is followed by a structural ({,},],[) character
    +// or a white space character. If that is not the case (e.g., when the JSON
    +// document is made of a single number), then it is necessary to copy the
    +// content and append a space before calling this function.
    +//
    +// Our objective is accurate parsing (ULP of 0) at high speed.
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) {
    +
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  if (digit_count == 0 || ('0' == *start_digits && digit_count > 1)) { return INVALID_NUMBER(src); }
    +
    +  //
    +  // Handle floats if there is a . or e (or both)
    +  //
    +  int64_t exponent = 0;
    +  bool is_float = false;
    +  if ('.' == *p) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_decimal_after_separator(src, p, i, exponent) );
    +    digit_count = int(p - start_digits); // used later to guard against overflows
    +  }
    +  if (('e' == *p) || ('E' == *p)) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_exponent(src, p, exponent) );
    +  }
    +  if (is_float) {
    +    const bool dirty_end = jsoncharutils::is_not_structural_or_whitespace(*p);
    +    SIMDJSON_TRY( write_float(src, negative, i, start_digits, digit_count, exponent, writer) );
    +    if (dirty_end) { return INVALID_NUMBER(src); }
    +    return SUCCESS;
    +  }
    +
    +  // The longest negative 64-bit number is 19 digits.
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  size_t longest_digit_count = negative ? 19 : 20;
    +  if (digit_count > longest_digit_count) { return INVALID_NUMBER(src); }
    +  if (digit_count == longest_digit_count) {
    +    if (negative) {
    +      // Anything negative above INT64_MAX+1 is invalid
    +      if (i > uint64_t(INT64_MAX)+1) { return INVALID_NUMBER(src);  }
    +      WRITE_INTEGER(~i+1, src, writer);
    +      if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +      return SUCCESS;
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    }  else if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INVALID_NUMBER(src); }
    +  }
    +
    +  // Write unsigned if it doesn't fit in a signed integer.
    +  if (i > uint64_t(INT64_MAX)) {
    +    WRITE_UNSIGNED(i, src, writer);
    +  } else {
    +    WRITE_INTEGER(negative ? (~i+1) : i, src, writer);
    +  }
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +  return SUCCESS;
    +}
    +
    +// Inlineable functions
    +namespace {
    +
    +// This table can be used to characterize the final character of an integer
    +// string. For JSON structural character and allowable white space characters,
    +// we return SUCCESS. For 'e', '.' and 'E', we return INCORRECT_TYPE. Otherwise
    +// we return NUMBER_ERROR.
    +// Optimization note: we could easily reduce the size of the table by half (to 128)
    +// at the cost of an extra branch.
    +// Optimization note: we want the values to use at most 8 bits (not, e.g., 32 bits):
    +static_assert(error_code(uint8_t(NUMBER_ERROR))== NUMBER_ERROR, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(SUCCESS))== SUCCESS, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(INCORRECT_TYPE))== INCORRECT_TYPE, "bad NUMBER_ERROR cast");
    +
    +const uint8_t integer_string_finisher[256] = {
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   SUCCESS,      NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, INCORRECT_TYPE,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, SUCCESS,        NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR};
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if ((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src + 1;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    // Note: we use src[1] and not src[0] because src[0] is the quote character in this
    +    // instance.
    +    if (src[1] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = src;
    +  uint64_t i = 0;
    +  while (parse_digit(*src, i)) { src++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(src - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*src)) {
    +  //  return (*src == '.' || *src == 'e' || *src == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(*src != '"') { return NUMBER_ERROR; }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept {
    +  return (*src == '-');
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) { return true; }
    +  return false;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) {
    +    // We have an integer.
    +    // If the number is negative and valid, it must be a signed integer.
    +    if(negative) { return number_type::signed_integer; }
    +    // We want values larger or equal to 9223372036854775808 to be unsigned
    +    // integers, and the other values to be signed integers.
    +    int digit_count = int(p - src);
    +    if(digit_count >= 19) {
    +      const uint8_t * smaller_big_integer = reinterpret_cast("9223372036854775808");
    +      if((digit_count >= 20) || (memcmp(src, smaller_big_integer, 19) >= 0)) {
    +        return number_type::unsigned_integer;
    +      }
    +    }
    +    return number_type::signed_integer;
    +  }
    +  // Hopefully, we have 'e' or 'E' or '.'.
    +  return number_type::floating_point_number;
    +}
    +
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src, const uint8_t * const src_end) noexcept {
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  if(p == src_end) { return NUMBER_ERROR; }
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely((p != src_end) && (*p == '.'))) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if ((p == src_end) || !parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = start_digits-src > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if ((p != src_end) && (*p == 'e' || *p == 'E')) {
    +    p++;
    +    if(p == src_end) { return NUMBER_ERROR; }
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while ((p != src_end) && parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if ((p != src_end) && jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), src_end, &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +} // unnamed namespace
    +#endif // SIMDJSON_SKIPNUMBERPARSING
    +
    +} // namespace numberparsing
    +
    +inline std::ostream& operator<<(std::ostream& out, number_type type) noexcept {
    +    switch (type) {
    +        case number_type::signed_integer: out << "integer in [-9223372036854775808,9223372036854775808)"; break;
    +        case number_type::unsigned_integer: out << "unsigned integer in [9223372036854775808,18446744073709551616)"; break;
    +        case number_type::floating_point_number: out << "floating-point number (binary64)"; break;
    +        default: SIMDJSON_UNREACHABLE();
    +    }
    +    return out;
    +}
    +
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_NUMBERPARSING_H
    +/* end file simdjson/generic/numberparsing.h for icelake */
    +
    +/* including simdjson/generic/implementation_simdjson_result_base-inl.h for icelake: #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base-inl.h for icelake */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +
    +//
    +// internal::implementation_simdjson_result_base inline implementation
    +//
    +
    +template
    +simdjson_inline void implementation_simdjson_result_base::tie(T &value, error_code &error) && noexcept {
    +  error = this->second;
    +  if (!error) {
    +    value = std::forward>(*this).first;
    +  }
    +}
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::get(T &value) && noexcept {
    +  error_code error;
    +  std::forward>(*this).tie(value, error);
    +  return error;
    +}
    +
    +template
    +simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept {
    +  return this->second;
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::take_value() && noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::operator T&&() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline const T& implementation_simdjson_result_base::value_unsafe() const& noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value_unsafe() & noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value_unsafe() && noexcept {
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value, error_code error) noexcept
    +    : first{std::forward(value)}, second{error} {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(error_code error) noexcept
    +    : implementation_simdjson_result_base(T{}, error) {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value), SUCCESS) {}
    +
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +/* end file simdjson/generic/implementation_simdjson_result_base-inl.h for icelake */
    +/* end file simdjson/generic/amalgamated.h for icelake */
    +/* including simdjson/icelake/end.h: #include "simdjson/icelake/end.h" */
    +/* begin file simdjson/icelake/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_ICELAKE
    +SIMDJSON_UNTARGET_REGION
    +#endif
    +
    +/* undefining SIMDJSON_IMPLEMENTATION from "icelake" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/icelake/end.h */
    +
    +#endif // SIMDJSON_ICELAKE_H
    +/* end file simdjson/icelake.h */
    +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(ppc64)
    +/* including simdjson/ppc64.h: #include "simdjson/ppc64.h" */
    +/* begin file simdjson/ppc64.h */
    +#ifndef SIMDJSON_PPC64_H
    +#define SIMDJSON_PPC64_H
    +
    +/* including simdjson/ppc64/begin.h: #include "simdjson/ppc64/begin.h" */
    +/* begin file simdjson/ppc64/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "ppc64" */
    +#define SIMDJSON_IMPLEMENTATION ppc64
    +/* including simdjson/ppc64/base.h: #include "simdjson/ppc64/base.h" */
    +/* begin file simdjson/ppc64/base.h */
    +#ifndef SIMDJSON_PPC64_BASE_H
    +#define SIMDJSON_PPC64_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +/**
    + * Implementation for ALTIVEC (PPC64).
    + */
    +namespace ppc64 {
    +
    +class implementation;
    +
    +namespace {
    +namespace simd {
    +template  struct simd8;
    +template  struct simd8x64;
    +} // namespace simd
    +} // unnamed namespace
    +
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_PPC64_BASE_H
    +/* end file simdjson/ppc64/base.h */
    +/* including simdjson/ppc64/intrinsics.h: #include "simdjson/ppc64/intrinsics.h" */
    +/* begin file simdjson/ppc64/intrinsics.h */
    +#ifndef SIMDJSON_PPC64_INTRINSICS_H
    +#define SIMDJSON_PPC64_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This should be the correct header whether
    +// you use visual studio or other compilers.
    +#include 
    +
    +// These are defined by altivec.h in GCC toolchain, it is safe to undef them.
    +#ifdef bool
    +#undef bool
    +#endif
    +
    +#ifdef vector
    +#undef vector
    +#endif
    +
    +static_assert(sizeof(__vector unsigned char) <= simdjson::SIMDJSON_PADDING, "insufficient padding for ppc64");
    +
    +#endif //  SIMDJSON_PPC64_INTRINSICS_H
    +/* end file simdjson/ppc64/intrinsics.h */
    +/* including simdjson/ppc64/bitmanipulation.h: #include "simdjson/ppc64/bitmanipulation.h" */
    +/* begin file simdjson/ppc64/bitmanipulation.h */
    +#ifndef SIMDJSON_PPC64_BITMANIPULATION_H
    +#define SIMDJSON_PPC64_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long ret;
    +  // Search the mask data from least significant bit (LSB)
    +  // to the most significant bit (MSB) for a set bit (1).
    +  _BitScanForward64(&ret, input_num);
    +  return (int)ret;
    +#else  // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return input_num & (input_num - 1);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long leading_zero = 0;
    +  // Search the mask data from most significant bit (MSB)
    +  // to least significant bit (LSB) for a set bit (1).
    +  if (_BitScanReverse64(&leading_zero, input_num))
    +    return (int)(63 - leading_zero);
    +  else
    +    return 64;
    +#else
    +  return __builtin_clzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +simdjson_inline int count_ones(uint64_t input_num) {
    +  // note: we do not support legacy 32-bit Windows in this kernel
    +  return __popcnt64(input_num); // Visual Studio wants two underscores
    +}
    +#else
    +simdjson_inline int count_ones(uint64_t input_num) {
    +  return __builtin_popcountll(input_num);
    +}
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2,
    +                                         uint64_t *result) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  *result = value1 + value2;
    +  return *result < value1;
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_PPC64_BITMANIPULATION_H
    +/* end file simdjson/ppc64/bitmanipulation.h */
    +/* including simdjson/ppc64/bitmask.h: #include "simdjson/ppc64/bitmask.h" */
    +/* begin file simdjson/ppc64/bitmask.h */
    +#ifndef SIMDJSON_PPC64_BITMASK_H
    +#define SIMDJSON_PPC64_BITMASK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +
    +//
    +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is
    +// encountered.
    +//
    +// For example, prefix_xor(00100100) == 00011100
    +//
    +simdjson_inline uint64_t prefix_xor(uint64_t bitmask) {
    +  // You can use the version below, however gcc sometimes miscompiles
    +  // vec_pmsum_be, it happens somewhere around between 8 and 9th version.
    +  // The performance boost was not noticeable, falling back to a usual
    +  // implementation.
    +  //   __vector unsigned long long all_ones = {~0ull, ~0ull};
    +  //   __vector unsigned long long mask = {bitmask, 0};
    +  //   // Clang and GCC return different values for pmsum for ull so cast it to one.
    +  //   // Generally it is not specified by ALTIVEC ISA what is returned by
    +  //   // vec_pmsum_be.
    +  // #if defined(__LITTLE_ENDIAN__)
    +  //   return (uint64_t)(((__vector unsigned long long)vec_pmsum_be(all_ones, mask))[0]);
    +  // #else
    +  //   return (uint64_t)(((__vector unsigned long long)vec_pmsum_be(all_ones, mask))[1]);
    +  // #endif
    +  bitmask ^= bitmask << 1;
    +  bitmask ^= bitmask << 2;
    +  bitmask ^= bitmask << 4;
    +  bitmask ^= bitmask << 8;
    +  bitmask ^= bitmask << 16;
    +  bitmask ^= bitmask << 32;
    +  return bitmask;
    +}
    +
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif
    +/* end file simdjson/ppc64/bitmask.h */
    +/* including simdjson/ppc64/numberparsing_defs.h: #include "simdjson/ppc64/numberparsing_defs.h" */
    +/* begin file simdjson/ppc64/numberparsing_defs.h */
    +#ifndef SIMDJSON_PPC64_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_PPC64_NUMBERPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +#if defined(__linux__)
    +#include 
    +#elif defined(__FreeBSD__)
    +#include 
    +#endif
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace numberparsing {
    +
    +// we don't have appropriate instructions, so let us use a scalar function
    +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  uint64_t val;
    +  std::memcpy(&val, chars, sizeof(uint64_t));
    +#ifdef __BIG_ENDIAN__
    +#if defined(__linux__)
    +  val = bswap_64(val);
    +#elif defined(__FreeBSD__)
    +  val = bswap64(val);
    +#endif
    +#endif
    +  val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8;
    +  val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16;
    +  return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32);
    +}
    +
    +/** @private */
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif // SIMDJSON_PPC64_NUMBERPARSING_DEFS_H
    +/* end file simdjson/ppc64/numberparsing_defs.h */
    +/* including simdjson/ppc64/simd.h: #include "simdjson/ppc64/simd.h" */
    +/* begin file simdjson/ppc64/simd.h */
    +#ifndef SIMDJSON_PPC64_SIMD_H
    +#define SIMDJSON_PPC64_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +namespace simd {
    +
    +using __m128i = __vector unsigned char;
    +
    +template  struct base {
    +  __m128i value;
    +
    +  // Zero constructor
    +  simdjson_inline base() : value{__m128i()} {}
    +
    +  // Conversion from SIMD register
    +  simdjson_inline base(const __m128i _value) : value(_value) {}
    +
    +  // Conversion to SIMD register
    +  simdjson_inline operator const __m128i &() const {
    +    return this->value;
    +  }
    +  simdjson_inline operator __m128i &() { return this->value; }
    +
    +  // Bit operations
    +  simdjson_inline Child operator|(const Child other) const {
    +    return vec_or(this->value, (__m128i)other);
    +  }
    +  simdjson_inline Child operator&(const Child other) const {
    +    return vec_and(this->value, (__m128i)other);
    +  }
    +  simdjson_inline Child operator^(const Child other) const {
    +    return vec_xor(this->value, (__m128i)other);
    +  }
    +  simdjson_inline Child bit_andnot(const Child other) const {
    +    return vec_andc(this->value, (__m128i)other);
    +  }
    +  simdjson_inline Child &operator|=(const Child other) {
    +    auto this_cast = static_cast(this);
    +    *this_cast = *this_cast | other;
    +    return *this_cast;
    +  }
    +  simdjson_inline Child &operator&=(const Child other) {
    +    auto this_cast = static_cast(this);
    +    *this_cast = *this_cast & other;
    +    return *this_cast;
    +  }
    +  simdjson_inline Child &operator^=(const Child other) {
    +    auto this_cast = static_cast(this);
    +    *this_cast = *this_cast ^ other;
    +    return *this_cast;
    +  }
    +};
    +
    +template >
    +struct base8 : base> {
    +  typedef uint16_t bitmask_t;
    +  typedef uint32_t bitmask2_t;
    +
    +  simdjson_inline base8() : base>() {}
    +  simdjson_inline base8(const __m128i _value) : base>(_value) {}
    +
    +  friend simdjson_inline Mask operator==(const simd8 lhs, const simd8 rhs) {
    +    return (__m128i)vec_cmpeq(lhs.value, (__m128i)rhs);
    +  }
    +
    +  static const int SIZE = sizeof(base>::value);
    +
    +  template 
    +  simdjson_inline simd8 prev(simd8 prev_chunk) const {
    +    __m128i chunk = this->value;
    +#ifdef __LITTLE_ENDIAN__
    +    chunk = (__m128i)vec_reve(this->value);
    +    prev_chunk = (__m128i)vec_reve((__m128i)prev_chunk);
    +#endif
    +    chunk = (__m128i)vec_sld((__m128i)prev_chunk, (__m128i)chunk, 16 - N);
    +#ifdef __LITTLE_ENDIAN__
    +    chunk = (__m128i)vec_reve((__m128i)chunk);
    +#endif
    +    return chunk;
    +  }
    +};
    +
    +// SIMD byte mask type (returned by things like eq and gt)
    +template <> struct simd8 : base8 {
    +  static simdjson_inline simd8 splat(bool _value) {
    +    return (__m128i)vec_splats((unsigned char)(-(!!_value)));
    +  }
    +
    +  simdjson_inline simd8() : base8() {}
    +  simdjson_inline simd8(const __m128i _value)
    +      : base8(_value) {}
    +  // Splat constructor
    +  simdjson_inline simd8(bool _value)
    +      : base8(splat(_value)) {}
    +
    +  simdjson_inline int to_bitmask() const {
    +    __vector unsigned long long result;
    +    const __m128i perm_mask = {0x78, 0x70, 0x68, 0x60, 0x58, 0x50, 0x48, 0x40,
    +                               0x38, 0x30, 0x28, 0x20, 0x18, 0x10, 0x08, 0x00};
    +
    +    result = ((__vector unsigned long long)vec_vbpermq((__m128i)this->value,
    +                                                       (__m128i)perm_mask));
    +#ifdef __LITTLE_ENDIAN__
    +    return static_cast(result[1]);
    +#else
    +    return static_cast(result[0]);
    +#endif
    +  }
    +  simdjson_inline bool any() const {
    +    return !vec_all_eq(this->value, (__m128i)vec_splats(0));
    +  }
    +  simdjson_inline simd8 operator~() const {
    +    return this->value ^ (__m128i)splat(true);
    +  }
    +};
    +
    +template  struct base8_numeric : base8 {
    +  static simdjson_inline simd8 splat(T value) {
    +    (void)value;
    +    return (__m128i)vec_splats(value);
    +  }
    +  static simdjson_inline simd8 zero() { return splat(0); }
    +  static simdjson_inline simd8 load(const T values[16]) {
    +    return (__m128i)(vec_vsx_ld(0, reinterpret_cast(values)));
    +  }
    +  // Repeat 16 values as many times as necessary (usually for lookup tables)
    +  static simdjson_inline simd8 repeat_16(T v0, T v1, T v2, T v3, T v4,
    +                                                   T v5, T v6, T v7, T v8, T v9,
    +                                                   T v10, T v11, T v12, T v13,
    +                                                   T v14, T v15) {
    +    return simd8(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
    +                    v14, v15);
    +  }
    +
    +  simdjson_inline base8_numeric() : base8() {}
    +  simdjson_inline base8_numeric(const __m128i _value)
    +      : base8(_value) {}
    +
    +  // Store to array
    +  simdjson_inline void store(T dst[16]) const {
    +    vec_vsx_st(this->value, 0, reinterpret_cast<__m128i *>(dst));
    +  }
    +
    +  // Override to distinguish from bool version
    +  simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +
    +  // Addition/subtraction are the same for signed and unsigned
    +  simdjson_inline simd8 operator+(const simd8 other) const {
    +    return (__m128i)((__m128i)this->value + (__m128i)other);
    +  }
    +  simdjson_inline simd8 operator-(const simd8 other) const {
    +    return (__m128i)((__m128i)this->value - (__m128i)other);
    +  }
    +  simdjson_inline simd8 &operator+=(const simd8 other) {
    +    *this = *this + other;
    +    return *static_cast *>(this);
    +  }
    +  simdjson_inline simd8 &operator-=(const simd8 other) {
    +    *this = *this - other;
    +    return *static_cast *>(this);
    +  }
    +
    +  // Perform a lookup assuming the value is between 0 and 16 (undefined behavior
    +  // for out of range values)
    +  template 
    +  simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +    return (__m128i)vec_perm((__m128i)lookup_table, (__m128i)lookup_table, this->value);
    +  }
    +
    +  // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted
    +  // as a bitset). Passing a 0 value for mask would be equivalent to writing out
    +  // every byte to output. Only the first 16 - count_ones(mask) bytes of the
    +  // result are significant but 16 bytes get written. Design consideration: it
    +  // seems like a function with the signature simd8 compress(uint32_t mask)
    +  // would be sensible, but the AVX ISA makes this kind of approach difficult.
    +  template 
    +  simdjson_inline void compress(uint16_t mask, L *output) const {
    +    using internal::BitsSetTable256mul2;
    +    using internal::pshufb_combine_table;
    +    using internal::thintable_epi8;
    +    // this particular implementation was inspired by work done by @animetosho
    +    // we do it in two steps, first 8 bytes and then second 8 bytes
    +    uint8_t mask1 = uint8_t(mask);      // least significant 8 bits
    +    uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
    +    // next line just loads the 64-bit values thintable_epi8[mask1] and
    +    // thintable_epi8[mask2] into a 128-bit register, using only
    +    // two instructions on most compilers.
    +#ifdef __LITTLE_ENDIAN__
    +    __m128i shufmask = (__m128i)(__vector unsigned long long){
    +        thintable_epi8[mask1], thintable_epi8[mask2]};
    +#else
    +    __m128i shufmask = (__m128i)(__vector unsigned long long){
    +        thintable_epi8[mask2], thintable_epi8[mask1]};
    +    shufmask = (__m128i)vec_reve((__m128i)shufmask);
    +#endif
    +    // we increment by 0x08 the second half of the mask
    +    shufmask = ((__m128i)shufmask) +
    +               ((__m128i)(__vector int){0, 0, 0x08080808, 0x08080808});
    +
    +    // this is the version "nearly pruned"
    +    __m128i pruned = vec_perm(this->value, this->value, shufmask);
    +    // we still need to put the two halves together.
    +    // we compute the popcount of the first half:
    +    int pop1 = BitsSetTable256mul2[mask1];
    +    // then load the corresponding mask, what it does is to write
    +    // only the first pop1 bytes from the first 8 bytes, and then
    +    // it fills in with the bytes from the second 8 bytes + some filling
    +    // at the end.
    +    __m128i compactmask =
    +        vec_vsx_ld(0, reinterpret_cast(pshufb_combine_table + pop1 * 8));
    +    __m128i answer = vec_perm(pruned, (__m128i)vec_splats(0), compactmask);
    +    vec_vsx_st(answer, 0, reinterpret_cast<__m128i *>(output));
    +  }
    +
    +  template 
    +  simdjson_inline simd8
    +  lookup_16(L replace0, L replace1, L replace2, L replace3, L replace4,
    +            L replace5, L replace6, L replace7, L replace8, L replace9,
    +            L replace10, L replace11, L replace12, L replace13, L replace14,
    +            L replace15) const {
    +    return lookup_16(simd8::repeat_16(
    +        replace0, replace1, replace2, replace3, replace4, replace5, replace6,
    +        replace7, replace8, replace9, replace10, replace11, replace12,
    +        replace13, replace14, replace15));
    +  }
    +};
    +
    +// Signed bytes
    +template <> struct simd8 : base8_numeric {
    +  simdjson_inline simd8() : base8_numeric() {}
    +  simdjson_inline simd8(const __m128i _value)
    +      : base8_numeric(_value) {}
    +  // Splat constructor
    +  simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +  // Array constructor
    +  simdjson_inline simd8(const int8_t *values) : simd8(load(values)) {}
    +  // Member-by-member initialization
    +  simdjson_inline simd8(int8_t v0, int8_t v1, int8_t v2, int8_t v3,
    +                               int8_t v4, int8_t v5, int8_t v6, int8_t v7,
    +                               int8_t v8, int8_t v9, int8_t v10, int8_t v11,
    +                               int8_t v12, int8_t v13, int8_t v14, int8_t v15)
    +      : simd8((__m128i)(__vector signed char){v0, v1, v2, v3, v4, v5, v6, v7,
    +                                              v8, v9, v10, v11, v12, v13, v14,
    +                                              v15}) {}
    +  // Repeat 16 values as many times as necessary (usually for lookup tables)
    +  simdjson_inline static simd8
    +  repeat_16(int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5,
    +            int8_t v6, int8_t v7, int8_t v8, int8_t v9, int8_t v10, int8_t v11,
    +            int8_t v12, int8_t v13, int8_t v14, int8_t v15) {
    +    return simd8(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
    +                         v13, v14, v15);
    +  }
    +
    +  // Order-sensitive comparisons
    +  simdjson_inline simd8
    +  max_val(const simd8 other) const {
    +    return (__m128i)vec_max((__vector signed char)this->value,
    +                            (__vector signed char)(__m128i)other);
    +  }
    +  simdjson_inline simd8
    +  min_val(const simd8 other) const {
    +    return (__m128i)vec_min((__vector signed char)this->value,
    +                            (__vector signed char)(__m128i)other);
    +  }
    +  simdjson_inline simd8
    +  operator>(const simd8 other) const {
    +    return (__m128i)vec_cmpgt((__vector signed char)this->value,
    +                              (__vector signed char)(__m128i)other);
    +  }
    +  simdjson_inline simd8
    +  operator<(const simd8 other) const {
    +    return (__m128i)vec_cmplt((__vector signed char)this->value,
    +                              (__vector signed char)(__m128i)other);
    +  }
    +};
    +
    +// Unsigned bytes
    +template <> struct simd8 : base8_numeric {
    +  simdjson_inline simd8() : base8_numeric() {}
    +  simdjson_inline simd8(const __m128i _value)
    +      : base8_numeric(_value) {}
    +  // Splat constructor
    +  simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +  // Array constructor
    +  simdjson_inline simd8(const uint8_t *values) : simd8(load(values)) {}
    +  // Member-by-member initialization
    +  simdjson_inline
    +  simd8(uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5,
    +        uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9, uint8_t v10,
    +        uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15)
    +      : simd8((__m128i){v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
    +                        v13, v14, v15}) {}
    +  // Repeat 16 values as many times as necessary (usually for lookup tables)
    +  simdjson_inline static simd8
    +  repeat_16(uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4,
    +            uint8_t v5, uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9,
    +            uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14,
    +            uint8_t v15) {
    +    return simd8(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
    +                          v13, v14, v15);
    +  }
    +
    +  // Saturated math
    +  simdjson_inline simd8
    +  saturating_add(const simd8 other) const {
    +    return (__m128i)vec_adds(this->value, (__m128i)other);
    +  }
    +  simdjson_inline simd8
    +  saturating_sub(const simd8 other) const {
    +    return (__m128i)vec_subs(this->value, (__m128i)other);
    +  }
    +
    +  // Order-specific operations
    +  simdjson_inline simd8
    +  max_val(const simd8 other) const {
    +    return (__m128i)vec_max(this->value, (__m128i)other);
    +  }
    +  simdjson_inline simd8
    +  min_val(const simd8 other) const {
    +    return (__m128i)vec_min(this->value, (__m128i)other);
    +  }
    +  // Same as >, but only guarantees true is nonzero (< guarantees true = -1)
    +  simdjson_inline simd8
    +  gt_bits(const simd8 other) const {
    +    return this->saturating_sub(other);
    +  }
    +  // Same as <, but only guarantees true is nonzero (< guarantees true = -1)
    +  simdjson_inline simd8
    +  lt_bits(const simd8 other) const {
    +    return other.saturating_sub(*this);
    +  }
    +  simdjson_inline simd8
    +  operator<=(const simd8 other) const {
    +    return other.max_val(*this) == other;
    +  }
    +  simdjson_inline simd8
    +  operator>=(const simd8 other) const {
    +    return other.min_val(*this) == other;
    +  }
    +  simdjson_inline simd8
    +  operator>(const simd8 other) const {
    +    return this->gt_bits(other).any_bits_set();
    +  }
    +  simdjson_inline simd8
    +  operator<(const simd8 other) const {
    +    return this->gt_bits(other).any_bits_set();
    +  }
    +
    +  // Bit-specific operations
    +  simdjson_inline simd8 bits_not_set() const {
    +    return (__m128i)vec_cmpeq(this->value, (__m128i)vec_splats(uint8_t(0)));
    +  }
    +  simdjson_inline simd8 bits_not_set(simd8 bits) const {
    +    return (*this & bits).bits_not_set();
    +  }
    +  simdjson_inline simd8 any_bits_set() const {
    +    return ~this->bits_not_set();
    +  }
    +  simdjson_inline simd8 any_bits_set(simd8 bits) const {
    +    return ~this->bits_not_set(bits);
    +  }
    +  simdjson_inline bool bits_not_set_anywhere() const {
    +    return vec_all_eq(this->value, (__m128i)vec_splats(0));
    +  }
    +  simdjson_inline bool any_bits_set_anywhere() const {
    +    return !bits_not_set_anywhere();
    +  }
    +  simdjson_inline bool bits_not_set_anywhere(simd8 bits) const {
    +    return vec_all_eq(vec_and(this->value, (__m128i)bits),
    +                      (__m128i)vec_splats(0));
    +  }
    +  simdjson_inline bool any_bits_set_anywhere(simd8 bits) const {
    +    return !bits_not_set_anywhere(bits);
    +  }
    +  template  simdjson_inline simd8 shr() const {
    +    return simd8(
    +        (__m128i)vec_sr(this->value, (__m128i)vec_splat_u8(N)));
    +  }
    +  template  simdjson_inline simd8 shl() const {
    +    return simd8(
    +        (__m128i)vec_sl(this->value, (__m128i)vec_splat_u8(N)));
    +  }
    +};
    +
    +template  struct simd8x64 {
    +  static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +  static_assert(NUM_CHUNKS == 4,
    +                "PPC64 kernel should use four registers per 64-byte block.");
    +  const simd8 chunks[NUM_CHUNKS];
    +
    +  simd8x64(const simd8x64 &o) = delete; // no copy allowed
    +  simd8x64 &
    +  operator=(const simd8& other) = delete; // no assignment allowed
    +  simd8x64() = delete;                      // no default constructor allowed
    +
    +  simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1,
    +                                  const simd8 chunk2, const simd8 chunk3)
    +      : chunks{chunk0, chunk1, chunk2, chunk3} {}
    +  simdjson_inline simd8x64(const T ptr[64])
    +      : chunks{simd8::load(ptr), simd8::load(ptr + 16),
    +               simd8::load(ptr + 32), simd8::load(ptr + 48)} {}
    +
    +  simdjson_inline void store(T ptr[64]) const {
    +    this->chunks[0].store(ptr + sizeof(simd8) * 0);
    +    this->chunks[1].store(ptr + sizeof(simd8) * 1);
    +    this->chunks[2].store(ptr + sizeof(simd8) * 2);
    +    this->chunks[3].store(ptr + sizeof(simd8) * 3);
    +  }
    +
    +  simdjson_inline simd8 reduce_or() const {
    +    return (this->chunks[0] | this->chunks[1]) |
    +           (this->chunks[2] | this->chunks[3]);
    +  }
    +
    +  simdjson_inline uint64_t compress(uint64_t mask, T *output) const {
    +    this->chunks[0].compress(uint16_t(mask), output);
    +    this->chunks[1].compress(uint16_t(mask >> 16),
    +                             output + 16 - count_ones(mask & 0xFFFF));
    +    this->chunks[2].compress(uint16_t(mask >> 32),
    +                             output + 32 - count_ones(mask & 0xFFFFFFFF));
    +    this->chunks[3].compress(uint16_t(mask >> 48),
    +                             output + 48 - count_ones(mask & 0xFFFFFFFFFFFF));
    +    return 64 - count_ones(mask);
    +  }
    +
    +  simdjson_inline uint64_t to_bitmask() const {
    +    uint64_t r0 = uint32_t(this->chunks[0].to_bitmask());
    +    uint64_t r1 = this->chunks[1].to_bitmask();
    +    uint64_t r2 = this->chunks[2].to_bitmask();
    +    uint64_t r3 = this->chunks[3].to_bitmask();
    +    return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48);
    +  }
    +
    +  simdjson_inline uint64_t eq(const T m) const {
    +    const simd8 mask = simd8::splat(m);
    +    return simd8x64(this->chunks[0] == mask, this->chunks[1] == mask,
    +                          this->chunks[2] == mask, this->chunks[3] == mask)
    +        .to_bitmask();
    +  }
    +
    +  simdjson_inline uint64_t eq(const simd8x64 &other) const {
    +    return simd8x64(this->chunks[0] == other.chunks[0],
    +                          this->chunks[1] == other.chunks[1],
    +                          this->chunks[2] == other.chunks[2],
    +                          this->chunks[3] == other.chunks[3])
    +        .to_bitmask();
    +  }
    +
    +  simdjson_inline uint64_t lteq(const T m) const {
    +    const simd8 mask = simd8::splat(m);
    +    return simd8x64(this->chunks[0] <= mask, this->chunks[1] <= mask,
    +                          this->chunks[2] <= mask, this->chunks[3] <= mask)
    +        .to_bitmask();
    +  }
    +}; // struct simd8x64
    +
    +} // namespace simd
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_PPC64_SIMD_INPUT_H
    +/* end file simdjson/ppc64/simd.h */
    +/* including simdjson/ppc64/stringparsing_defs.h: #include "simdjson/ppc64/stringparsing_defs.h" */
    +/* begin file simdjson/ppc64/stringparsing_defs.h */
    +#ifndef SIMDJSON_PPC64_STRINGPARSING_DEFS_H
    +#define SIMDJSON_PPC64_STRINGPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/simd.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +
    +using namespace simd;
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 32;
    +  simdjson_inline static backslash_and_quote
    +  copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() {
    +    return ((bs_bits - 1) & quote_bits) != 0;
    +  }
    +  simdjson_inline bool has_backslash() { return bs_bits != 0; }
    +  simdjson_inline int quote_index() {
    +    return trailing_zeroes(quote_bits);
    +  }
    +  simdjson_inline int backslash_index() {
    +    return trailing_zeroes(bs_bits);
    +  }
    +
    +  uint32_t bs_bits;
    +  uint32_t quote_bits;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote
    +backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // this can read up to 31 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1),
    +                "backslash and quote finder must process fewer than "
    +                "SIMDJSON_PADDING bytes");
    +  simd8 v0(src);
    +  simd8 v1(src + sizeof(v0));
    +  v0.store(dst);
    +  v1.store(dst + sizeof(v0));
    +
    +  // Getting a 64-bit bitmask is much cheaper than multiple 16-bit bitmasks on
    +  // PPC; therefore, we smash them together into a 64-byte mask and get the
    +  // bitmask from there.
    +  uint64_t bs_and_quote =
    +      simd8x64(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask();
    +  return {
    +      uint32_t(bs_and_quote),      // bs_bits
    +      uint32_t(bs_and_quote >> 32) // quote_bits
    +  };
    +}
    +
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_PPC64_STRINGPARSING_DEFS_H
    +/* end file simdjson/ppc64/stringparsing_defs.h */
    +
    +#define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1
    +/* end file simdjson/ppc64/begin.h */
    +/* including simdjson/generic/amalgamated.h for ppc64: #include "simdjson/generic/amalgamated.h" */
    +/* begin file simdjson/generic/amalgamated.h for ppc64 */
    +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_DEPENDENCIES_H)
    +#error simdjson/generic/dependencies.h must be included before simdjson/generic/amalgamated.h!
    +#endif
    +
    +/* including simdjson/generic/base.h for ppc64: #include "simdjson/generic/base.h" */
    +/* begin file simdjson/generic/base.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): // If we haven't got an implementation yet, we're in the editor, editing a generic file! Just */
    +/* amalgamation skipped (editor-only): // use the most advanced one we can so the most possible stuff can be tested. */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation_detection.h" */
    +/* amalgamation skipped (editor-only): #if SIMDJSON_IMPLEMENTATION_ICELAKE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_HASWELL */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_WESTMERE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_ARM64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */
    +/* amalgamation skipped (editor-only): #else */
    +/* amalgamation skipped (editor-only): #error "All possible implementations (including fallback) have been disabled! simdjson will not run." */
    +/* amalgamation skipped (editor-only): #endif */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +
    +struct open_container;
    +class dom_parser_implementation;
    +
    +/**
    + * The type of a JSON number
    + */
    +enum class number_type {
    +    floating_point_number=1, /// a binary64 number
    +    signed_integer,          /// a signed integer that fits in a 64-bit word using two's complement
    +    unsigned_integer         /// a positive integer larger or equal to 1<<63
    +};
    +
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_BASE_H
    +/* end file simdjson/generic/base.h for ppc64 */
    +/* including simdjson/generic/jsoncharutils.h for ppc64: #include "simdjson/generic/jsoncharutils.h" */
    +/* begin file simdjson/generic/jsoncharutils.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_JSONCHARUTILS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_JSONCHARUTILS_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/jsoncharutils_tables.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +namespace jsoncharutils {
    +
    +// return non-zero if not a structural or whitespace char
    +// zero otherwise
    +simdjson_inline uint32_t is_not_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace_negated[c];
    +}
    +
    +simdjson_inline uint32_t is_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace[c];
    +}
    +
    +// returns a value with the high 16 bits set if not valid
    +// otherwise returns the conversion of the 4 hex digits at src into the bottom
    +// 16 bits of the 32-bit return register
    +//
    +// see
    +// https://lemire.me/blog/2019/04/17/parsing-short-hexadecimal-strings-efficiently/
    +static inline uint32_t hex_to_u32_nocheck(
    +    const uint8_t *src) { // strictly speaking, static inline is a C-ism
    +  uint32_t v1 = internal::digit_to_val32[630 + src[0]];
    +  uint32_t v2 = internal::digit_to_val32[420 + src[1]];
    +  uint32_t v3 = internal::digit_to_val32[210 + src[2]];
    +  uint32_t v4 = internal::digit_to_val32[0 + src[3]];
    +  return v1 | v2 | v3 | v4;
    +}
    +
    +// given a code point cp, writes to c
    +// the utf-8 code, outputting the length in
    +// bytes, if the length is zero, the code point
    +// is invalid
    +//
    +// This can possibly be made faster using pdep
    +// and clz and table lookups, but JSON documents
    +// have few escaped code points, and the following
    +// function looks cheap.
    +//
    +// Note: we assume that surrogates are treated separately
    +//
    +simdjson_inline size_t codepoint_to_utf8(uint32_t cp, uint8_t *c) {
    +  if (cp <= 0x7F) {
    +    c[0] = uint8_t(cp);
    +    return 1; // ascii
    +  }
    +  if (cp <= 0x7FF) {
    +    c[0] = uint8_t((cp >> 6) + 192);
    +    c[1] = uint8_t((cp & 63) + 128);
    +    return 2; // universal plane
    +    //  Surrogates are treated elsewhere...
    +    //} //else if (0xd800 <= cp && cp <= 0xdfff) {
    +    //  return 0; // surrogates // could put assert here
    +  } else if (cp <= 0xFFFF) {
    +    c[0] = uint8_t((cp >> 12) + 224);
    +    c[1] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[2] = uint8_t((cp & 63) + 128);
    +    return 3;
    +  } else if (cp <= 0x10FFFF) { // if you know you have a valid code point, this
    +                               // is not needed
    +    c[0] = uint8_t((cp >> 18) + 240);
    +    c[1] = uint8_t(((cp >> 12) & 63) + 128);
    +    c[2] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[3] = uint8_t((cp & 63) + 128);
    +    return 4;
    +  }
    +  // will return 0 when the code point was too large.
    +  return 0; // bad r
    +}
    +
    +#if SIMDJSON_IS_32BITS // _umul128 for x86, arm
    +// this is a slow emulation routine for 32-bit
    +//
    +static simdjson_inline uint64_t __emulu(uint32_t x, uint32_t y) {
    +  return x * (uint64_t)y;
    +}
    +static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) {
    +  uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd);
    +  uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd);
    +  uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32));
    +  uint64_t adbc_carry = !!(adbc < ad);
    +  uint64_t lo = bd + (adbc << 32);
    +  *hi = __emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) +
    +        (adbc_carry << 32) + !!(lo < bd);
    +  return lo;
    +}
    +#endif
    +
    +} // namespace jsoncharutils
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_JSONCHARUTILS_H
    +/* end file simdjson/generic/jsoncharutils.h for ppc64 */
    +/* including simdjson/generic/atomparsing.h for ppc64: #include "simdjson/generic/atomparsing.h" */
    +/* begin file simdjson/generic/atomparsing.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ATOMPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ATOMPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +/// @private
    +namespace atomparsing {
    +
    +// The string_to_uint32 is exclusively used to map literal strings to 32-bit values.
    +// We use memcpy instead of a pointer cast to avoid undefined behaviors since we cannot
    +// be certain that the character pointer will be properly aligned.
    +// You might think that using memcpy makes this function expensive, but you'd be wrong.
    +// All decent optimizing compilers (GCC, clang, Visual Studio) will compile string_to_uint32("false");
    +// to the compile-time constant 1936482662.
    +simdjson_inline uint32_t string_to_uint32(const char* str) { uint32_t val; std::memcpy(&val, str, sizeof(uint32_t)); return val; }
    +
    +
    +// Again in str4ncmp we use a memcpy to avoid undefined behavior. The memcpy may appear expensive.
    +// Yet all decent optimizing compilers will compile memcpy to a single instruction, just about.
    +simdjson_warn_unused
    +simdjson_inline uint32_t str4ncmp(const uint8_t *src, const char* atom) {
    +  uint32_t srcval; // we want to avoid unaligned 32-bit loads (undefined in C/C++)
    +  static_assert(sizeof(uint32_t) <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be larger than 4 bytes");
    +  std::memcpy(&srcval, src, sizeof(uint32_t));
    +  return srcval ^ string_to_uint32(atom);
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "true") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_true_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "true"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src) {
    +  return (str4ncmp(src+1, "alse") | jsoncharutils::is_not_structural_or_whitespace(src[5])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src, size_t len) {
    +  if (len > 5) { return is_valid_false_atom(src); }
    +  else if (len == 5) { return !str4ncmp(src+1, "alse"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "null") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_null_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "null"); }
    +  else { return false; }
    +}
    +
    +} // namespace atomparsing
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ATOMPARSING_H
    +/* end file simdjson/generic/atomparsing.h for ppc64 */
    +/* including simdjson/generic/dom_parser_implementation.h for ppc64: #include "simdjson/generic/dom_parser_implementation.h" */
    +/* begin file simdjson/generic/dom_parser_implementation.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +
    +// expectation: sizeof(open_container) = 64/8.
    +struct open_container {
    +  uint32_t tape_index; // where, on the tape, does the scope ([,{) begins
    +  uint32_t count; // how many elements in the scope
    +}; // struct open_container
    +
    +static_assert(sizeof(open_container) == 64/8, "Open container must be 64 bits");
    +
    +class dom_parser_implementation final : public internal::dom_parser_implementation {
    +public:
    +  /** Tape location of each open { or [ */
    +  std::unique_ptr open_containers{};
    +  /** Whether each open container is a [ or { */
    +  std::unique_ptr is_array{};
    +  /** Buffer passed to stage 1 */
    +  const uint8_t *buf{};
    +  /** Length passed to stage 1 */
    +  size_t len{0};
    +  /** Document passed to stage 2 */
    +  dom::document *doc{};
    +
    +  inline dom_parser_implementation() noexcept;
    +  inline dom_parser_implementation(dom_parser_implementation &&other) noexcept;
    +  inline dom_parser_implementation &operator=(dom_parser_implementation &&other) noexcept;
    +  dom_parser_implementation(const dom_parser_implementation &) = delete;
    +  dom_parser_implementation &operator=(const dom_parser_implementation &) = delete;
    +
    +  simdjson_warn_unused error_code parse(const uint8_t *buf, size_t len, dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage1(const uint8_t *buf, size_t len, stage1_mode partial) noexcept final;
    +  simdjson_warn_unused error_code stage2(dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage2_next(dom::document &doc) noexcept final;
    +  simdjson_warn_unused uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) const noexcept final;
    +  simdjson_warn_unused uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept final;
    +  inline simdjson_warn_unused error_code set_capacity(size_t capacity) noexcept final;
    +  inline simdjson_warn_unused error_code set_max_depth(size_t max_depth) noexcept final;
    +private:
    +  simdjson_inline simdjson_warn_unused error_code set_capacity_stage1(size_t capacity);
    +
    +};
    +
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +namespace ppc64 {
    +
    +inline dom_parser_implementation::dom_parser_implementation() noexcept = default;
    +inline dom_parser_implementation::dom_parser_implementation(dom_parser_implementation &&other) noexcept = default;
    +inline dom_parser_implementation &dom_parser_implementation::operator=(dom_parser_implementation &&other) noexcept = default;
    +
    +// Leaving these here so they can be inlined if so desired
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_capacity(size_t capacity) noexcept {
    +  if(capacity > SIMDJSON_MAXSIZE_BYTES) { return CAPACITY; }
    +  // Stage 1 index output
    +  size_t max_structures = SIMDJSON_ROUNDUP_N(capacity, 64) + 2 + 7;
    +  structural_indexes.reset( new (std::nothrow) uint32_t[max_structures] );
    +  if (!structural_indexes) { _capacity = 0; return MEMALLOC; }
    +  structural_indexes[0] = 0;
    +  n_structural_indexes = 0;
    +
    +  _capacity = capacity;
    +  return SUCCESS;
    +}
    +
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_max_depth(size_t max_depth) noexcept {
    +  // Stage 2 stacks
    +  open_containers.reset(new (std::nothrow) open_container[max_depth]);
    +  is_array.reset(new (std::nothrow) bool[max_depth]);
    +  if (!is_array || !open_containers) { _max_depth = 0; return MEMALLOC; }
    +
    +  _max_depth = max_depth;
    +  return SUCCESS;
    +}
    +
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +/* end file simdjson/generic/dom_parser_implementation.h for ppc64 */
    +/* including simdjson/generic/implementation_simdjson_result_base.h for ppc64: #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +
    +// This is a near copy of include/error.h's implementation_simdjson_result_base, except it doesn't use std::pair
    +// so we can avoid inlining errors
    +// TODO reconcile these!
    +/**
    + * The result of a simdjson operation that could fail.
    + *
    + * Gives the option of reading error codes, or throwing an exception by casting to the desired result.
    + *
    + * This is a base class for implementations that want to add functions to the result type for
    + * chaining.
    + *
    + * Override like:
    + *
    + *   struct simdjson_result : public internal::implementation_simdjson_result_base {
    + *     simdjson_result() noexcept : internal::implementation_simdjson_result_base() {}
    + *     simdjson_result(error_code error) noexcept : internal::implementation_simdjson_result_base(error) {}
    + *     simdjson_result(T &&value) noexcept : internal::implementation_simdjson_result_base(std::forward(value)) {}
    + *     simdjson_result(T &&value, error_code error) noexcept : internal::implementation_simdjson_result_base(value, error) {}
    + *     // Your extra methods here
    + *   }
    + *
    + * Then any method returning simdjson_result will be chainable with your methods.
    + */
    +template
    +struct implementation_simdjson_result_base {
    +
    +  /**
    +   * Create a new empty result with error = UNINITIALIZED.
    +   */
    +  simdjson_inline implementation_simdjson_result_base() noexcept = default;
    +
    +  /**
    +   * Create a new error result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(error_code error) noexcept;
    +
    +  /**
    +   * Create a new successful result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value) noexcept;
    +
    +  /**
    +   * Create a new result with both things (use if you don't want to branch when creating the result).
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value, error_code error) noexcept;
    +
    +  /**
    +   * Move the value and the error to the provided variables.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   * @param error The variable to assign the error to. Set to SUCCESS if there is no error.
    +   */
    +  simdjson_inline void tie(T &value, error_code &error) && noexcept;
    +
    +  /**
    +   * Move the value to the provided variable.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   */
    +  simdjson_inline error_code get(T &value) && noexcept;
    +
    +  /**
    +   * The error.
    +   */
    +  simdjson_inline error_code error() const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value.
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T& value() & noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& value() && noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& take_value() && noexcept(false);
    +
    +  /**
    +   * Cast to the value (will throw on error).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline operator T&&() && noexcept(false);
    +
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline const T& value_unsafe() const& noexcept;
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T& value_unsafe() & noexcept;
    +  /**
    +   * Take the result value (move it). This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T&& value_unsafe() && noexcept;
    +protected:
    +  /** users should never directly access first and second. **/
    +  T first{}; /** Users should never directly access 'first'. **/
    +  error_code second{UNINITIALIZED}; /** Users should never directly access 'second'. **/
    +}; // struct implementation_simdjson_result_base
    +
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +/* end file simdjson/generic/implementation_simdjson_result_base.h for ppc64 */
    +/* including simdjson/generic/numberparsing.h for ppc64: #include "simdjson/generic/numberparsing.h" */
    +/* begin file simdjson/generic/numberparsing.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_NUMBERPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_NUMBERPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace numberparsing {
    +
    +#ifdef JSON_TEST_NUMBERS
    +#define INVALID_NUMBER(SRC) (found_invalid_number((SRC)), NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (found_integer((VALUE), (SRC)), (WRITER).append_s64((VALUE)))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (found_unsigned_integer((VALUE), (SRC)), (WRITER).append_u64((VALUE)))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (found_float((VALUE), (SRC)), (WRITER).append_double((VALUE)))
    +#else
    +#define INVALID_NUMBER(SRC) (NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (WRITER).append_s64((VALUE))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (WRITER).append_u64((VALUE))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (WRITER).append_double((VALUE))
    +#endif
    +
    +namespace {
    +
    +// Convert a mantissa, an exponent and a sign bit into an ieee64 double.
    +// The real_exponent needs to be in [0, 2046] (technically real_exponent = 2047 would be acceptable).
    +// The mantissa should be in [0,1<<53). The bit at index (1ULL << 52) while be zeroed.
    +simdjson_inline double to_double(uint64_t mantissa, uint64_t real_exponent, bool negative) {
    +    double d;
    +    mantissa &= ~(1ULL << 52);
    +    mantissa |= real_exponent << 52;
    +    mantissa |= ((static_cast(negative)) << 63);
    +    std::memcpy(&d, &mantissa, sizeof(d));
    +    return d;
    +}
    +
    +// Attempts to compute i * 10^(power) exactly; and if "negative" is
    +// true, negate the result.
    +// This function will only work in some cases, when it does not work, success is
    +// set to false. This should work *most of the time* (like 99% of the time).
    +// We assume that power is in the [smallest_power,
    +// largest_power] interval: the caller is responsible for this check.
    +simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative, double &d) {
    +  // we start with a fast path
    +  // It was described in
    +  // Clinger WD. How to read floating point numbers accurately.
    +  // ACM SIGPLAN Notices. 1990
    +#ifndef FLT_EVAL_METHOD
    +#error "FLT_EVAL_METHOD should be defined, please include cfloat."
    +#endif
    +#if (FLT_EVAL_METHOD != 1) && (FLT_EVAL_METHOD != 0)
    +  // We cannot be certain that x/y is rounded to nearest.
    +  if (0 <= power && power <= 22 && i <= 9007199254740991)
    +#else
    +  if (-22 <= power && power <= 22 && i <= 9007199254740991)
    +#endif
    +  {
    +    // convert the integer into a double. This is lossless since
    +    // 0 <= i <= 2^53 - 1.
    +    d = double(i);
    +    //
    +    // The general idea is as follows.
    +    // If 0 <= s < 2^53 and if 10^0 <= p <= 10^22 then
    +    // 1) Both s and p can be represented exactly as 64-bit floating-point
    +    // values
    +    // (binary64).
    +    // 2) Because s and p can be represented exactly as floating-point values,
    +    // then s * p
    +    // and s / p will produce correctly rounded values.
    +    //
    +    if (power < 0) {
    +      d = d / simdjson::internal::power_of_ten[-power];
    +    } else {
    +      d = d * simdjson::internal::power_of_ten[power];
    +    }
    +    if (negative) {
    +      d = -d;
    +    }
    +    return true;
    +  }
    +  // When 22 < power && power <  22 + 16, we could
    +  // hope for another, secondary fast path.  It was
    +  // described by David M. Gay in  "Correctly rounded
    +  // binary-decimal and decimal-binary conversions." (1990)
    +  // If you need to compute i * 10^(22 + x) for x < 16,
    +  // first compute i * 10^x, if you know that result is exact
    +  // (e.g., when i * 10^x < 2^53),
    +  // then you can still proceed and do (i * 10^x) * 10^22.
    +  // Is this worth your time?
    +  // You need  22 < power *and* power <  22 + 16 *and* (i * 10^(x-22) < 2^53)
    +  // for this second fast path to work.
    +  // If you you have 22 < power *and* power <  22 + 16, and then you
    +  // optimistically compute "i * 10^(x-22)", there is still a chance that you
    +  // have wasted your time if i * 10^(x-22) >= 2^53. It makes the use cases of
    +  // this optimization maybe less common than we would like. Source:
    +  // http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/
    +  // also used in RapidJSON: https://rapidjson.org/strtod_8h_source.html
    +
    +  // The fast path has now failed, so we are failing back on the slower path.
    +
    +  // In the slow path, we need to adjust i so that it is > 1<<63 which is always
    +  // possible, except if i == 0, so we handle i == 0 separately.
    +  if(i == 0) {
    +    d = negative ? -0.0 : 0.0;
    +    return true;
    +  }
    +
    +
    +  // The exponent is 1024 + 63 + power
    +  //     + floor(log(5**power)/log(2)).
    +  // The 1024 comes from the ieee64 standard.
    +  // The 63 comes from the fact that we use a 64-bit word.
    +  //
    +  // Computing floor(log(5**power)/log(2)) could be
    +  // slow. Instead we use a fast function.
    +  //
    +  // For power in (-400,350), we have that
    +  // (((152170 + 65536) * power ) >> 16);
    +  // is equal to
    +  //  floor(log(5**power)/log(2)) + power when power >= 0
    +  // and it is equal to
    +  //  ceil(log(5**-power)/log(2)) + power when power < 0
    +  //
    +  // The 65536 is (1<<16) and corresponds to
    +  // (65536 * power) >> 16 ---> power
    +  //
    +  // ((152170 * power ) >> 16) is equal to
    +  // floor(log(5**power)/log(2))
    +  //
    +  // Note that this is not magic: 152170/(1<<16) is
    +  // approximatively equal to log(5)/log(2).
    +  // The 1<<16 value is a power of two; we could use a
    +  // larger power of 2 if we wanted to.
    +  //
    +  int64_t exponent = (((152170 + 65536) * power) >> 16) + 1024 + 63;
    +
    +
    +  // We want the most significant bit of i to be 1. Shift if needed.
    +  int lz = leading_zeroes(i);
    +  i <<= lz;
    +
    +
    +  // We are going to need to do some 64-bit arithmetic to get a precise product.
    +  // We use a table lookup approach.
    +  // It is safe because
    +  // power >= smallest_power
    +  // and power <= largest_power
    +  // We recover the mantissa of the power, it has a leading 1. It is always
    +  // rounded down.
    +  //
    +  // We want the most significant 64 bits of the product. We know
    +  // this will be non-zero because the most significant bit of i is
    +  // 1.
    +  const uint32_t index = 2 * uint32_t(power - simdjson::internal::smallest_power);
    +  // Optimization: It may be that materializing the index as a variable might confuse some compilers and prevent effective complex-addressing loads. (Done for code clarity.)
    +  //
    +  // The full_multiplication function computes the 128-bit product of two 64-bit words
    +  // with a returned value of type value128 with a "low component" corresponding to the
    +  // 64-bit least significant bits of the product and with a "high component" corresponding
    +  // to the 64-bit most significant bits of the product.
    +  simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
    +  // Both i and power_of_five_128[index] have their most significant bit set to 1 which
    +  // implies that the either the most or the second most significant bit of the product
    +  // is 1. We pack values in this manner for efficiency reasons: it maximizes the use
    +  // we make of the product. It also makes it easy to reason about the product: there
    +  // is 0 or 1 leading zero in the product.
    +
    +  // Unless the least significant 9 bits of the high (64-bit) part of the full
    +  // product are all 1s, then we know that the most significant 55 bits are
    +  // exact and no further work is needed. Having 55 bits is necessary because
    +  // we need 53 bits for the mantissa but we have to have one rounding bit and
    +  // we can waste a bit if the most significant bit of the product is zero.
    +  if((firstproduct.high & 0x1FF) == 0x1FF) {
    +    // We want to compute i * 5^q, but only care about the top 55 bits at most.
    +    // Consider the scenario where q>=0. Then 5^q may not fit in 64-bits. Doing
    +    // the full computation is wasteful. So we do what is called a "truncated
    +    // multiplication".
    +    // We take the most significant 64-bits, and we put them in
    +    // power_of_five_128[index]. Usually, that's good enough to approximate i * 5^q
    +    // to the desired approximation using one multiplication. Sometimes it does not suffice.
    +    // Then we store the next most significant 64 bits in power_of_five_128[index + 1], and
    +    // then we get a better approximation to i * 5^q.
    +    //
    +    // That's for when q>=0. The logic for q<0 is somewhat similar but it is somewhat
    +    // more complicated.
    +    //
    +    // There is an extra layer of complexity in that we need more than 55 bits of
    +    // accuracy in the round-to-even scenario.
    +    //
    +    // The full_multiplication function computes the 128-bit product of two 64-bit words
    +    // with a returned value of type value128 with a "low component" corresponding to the
    +    // 64-bit least significant bits of the product and with a "high component" corresponding
    +    // to the 64-bit most significant bits of the product.
    +    simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
    +    firstproduct.low += secondproduct.high;
    +    if(secondproduct.high > firstproduct.low) { firstproduct.high++; }
    +    // As it has been proven by Noble Mushtak and Daniel Lemire in "Fast Number Parsing Without
    +    // Fallback" (https://arxiv.org/abs/2212.06644), at this point we are sure that the product
    +    // is sufficiently accurate, and more computation is not needed.
    +  }
    +  uint64_t lower = firstproduct.low;
    +  uint64_t upper = firstproduct.high;
    +  // The final mantissa should be 53 bits with a leading 1.
    +  // We shift it so that it occupies 54 bits with a leading 1.
    +  ///////
    +  uint64_t upperbit = upper >> 63;
    +  uint64_t mantissa = upper >> (upperbit + 9);
    +  lz += int(1 ^ upperbit);
    +
    +  // Here we have mantissa < (1<<54).
    +  int64_t real_exponent = exponent - lz;
    +  if (simdjson_unlikely(real_exponent <= 0)) { // we have a subnormal?
    +    // Here have that real_exponent <= 0 so -real_exponent >= 0
    +    if(-real_exponent + 1 >= 64) { // if we have more than 64 bits below the minimum exponent, you have a zero for sure.
    +      d = negative ? -0.0 : 0.0;
    +      return true;
    +    }
    +    // next line is safe because -real_exponent + 1 < 0
    +    mantissa >>= -real_exponent + 1;
    +    // Thankfully, we can't have both "round-to-even" and subnormals because
    +    // "round-to-even" only occurs for powers close to 0.
    +    mantissa += (mantissa & 1); // round up
    +    mantissa >>= 1;
    +    // There is a weird scenario where we don't have a subnormal but just.
    +    // Suppose we start with 2.2250738585072013e-308, we end up
    +    // with 0x3fffffffffffff x 2^-1023-53 which is technically subnormal
    +    // whereas 0x40000000000000 x 2^-1023-53  is normal. Now, we need to round
    +    // up 0x3fffffffffffff x 2^-1023-53  and once we do, we are no longer
    +    // subnormal, but we can only know this after rounding.
    +    // So we only declare a subnormal if we are smaller than the threshold.
    +    real_exponent = (mantissa < (uint64_t(1) << 52)) ? 0 : 1;
    +    d = to_double(mantissa, real_exponent, negative);
    +    return true;
    +  }
    +  // We have to round to even. The "to even" part
    +  // is only a problem when we are right in between two floats
    +  // which we guard against.
    +  // If we have lots of trailing zeros, we may fall right between two
    +  // floating-point values.
    +  //
    +  // The round-to-even cases take the form of a number 2m+1 which is in (2^53,2^54]
    +  // times a power of two. That is, it is right between a number with binary significand
    +  // m and another number with binary significand m+1; and it must be the case
    +  // that it cannot be represented by a float itself.
    +  //
    +  // We must have that w * 10 ^q == (2m+1) * 2^p for some power of two 2^p.
    +  // Recall that 10^q = 5^q * 2^q.
    +  // When q >= 0, we must have that (2m+1) is divible by 5^q, so 5^q <= 2^54. We have that
    +  //  5^23 <=  2^54 and it is the last power of five to qualify, so q <= 23.
    +  // When q<0, we have  w  >=  (2m+1) x 5^{-q}.  We must have that w<2^{64} so
    +  // (2m+1) x 5^{-q} < 2^{64}. We have that 2m+1>2^{53}. Hence, we must have
    +  // 2^{53} x 5^{-q} < 2^{64}.
    +  // Hence we have 5^{-q} < 2^{11}$ or q>= -4.
    +  //
    +  // We require lower <= 1 and not lower == 0 because we could not prove that
    +  // that lower == 0 is implied; but we could prove that lower <= 1 is a necessary and sufficient test.
    +  if (simdjson_unlikely((lower <= 1) && (power >= -4) && (power <= 23) && ((mantissa & 3) == 1))) {
    +    if((mantissa  << (upperbit + 64 - 53 - 2)) ==  upper) {
    +      mantissa &= ~1;             // flip it so that we do not round up
    +    }
    +  }
    +
    +  mantissa += mantissa & 1;
    +  mantissa >>= 1;
    +
    +  // Here we have mantissa < (1<<53), unless there was an overflow
    +  if (mantissa >= (1ULL << 53)) {
    +    //////////
    +    // This will happen when parsing values such as 7.2057594037927933e+16
    +    ////////
    +    mantissa = (1ULL << 52);
    +    real_exponent++;
    +  }
    +  mantissa &= ~(1ULL << 52);
    +  // we have to check that real_exponent is in range, otherwise we bail out
    +  if (simdjson_unlikely(real_exponent > 2046)) {
    +    // We have an infinite value!!! We could actually throw an error here if we could.
    +    return false;
    +  }
    +  d = to_double(mantissa, real_exponent, negative);
    +  return true;
    +}
    +
    +// We call a fallback floating-point parser that might be slow. Note
    +// it will accept JSON numbers, but the JSON spec. is more restrictive so
    +// before you call parse_float_fallback, you need to have validated the input
    +// string with the JSON grammar.
    +// It will return an error (false) if the parsed number is infinite.
    +// The string parsing itself always succeeds. We know that there is at least
    +// one digit.
    +static bool parse_float_fallback(const uint8_t *ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +static bool parse_float_fallback(const uint8_t *ptr, const uint8_t *end_ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr), reinterpret_cast(end_ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +// check quickly whether the next 8 chars are made of digits
    +// at a glance, it looks better than Mula's
    +// http://0x80.pl/articles/swar-digits-validate.html
    +simdjson_inline bool is_made_of_eight_digits_fast(const uint8_t *chars) {
    +  uint64_t val;
    +  // this can read up to 7 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(7 <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be bigger than 7");
    +  std::memcpy(&val, chars, 8);
    +  // a branchy method might be faster:
    +  // return (( val & 0xF0F0F0F0F0F0F0F0 ) == 0x3030303030303030)
    +  //  && (( (val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0 ) ==
    +  //  0x3030303030303030);
    +  return (((val & 0xF0F0F0F0F0F0F0F0) |
    +           (((val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0) >> 4)) ==
    +          0x3333333333333333);
    +}
    +
    +template
    +SIMDJSON_NO_SANITIZE_UNDEFINED // We deliberately allow overflow here and check later
    +simdjson_inline bool parse_digit(const uint8_t c, I &i) {
    +  const uint8_t digit = static_cast(c - '0');
    +  if (digit > 9) {
    +    return false;
    +  }
    +  // PERF NOTE: multiplication by 10 is cheaper than arbitrary integer multiplication
    +  i = 10 * i + digit; // might overflow, we will handle the overflow later
    +  return true;
    +}
    +
    +simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const uint8_t *const src, const uint8_t *&p, uint64_t &i, int64_t &exponent) {
    +  // we continue with the fiction that we have an integer. If the
    +  // floating point number is representable as x * 10^z for some integer
    +  // z that fits in 53 bits, then we will be able to convert back the
    +  // the integer into a float in a lossless manner.
    +  const uint8_t *const first_after_period = p;
    +
    +#ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +#if SIMDJSON_SWAR_NUMBER_PARSING
    +  // this helps if we have lots of decimals!
    +  // this turns out to be frequent enough.
    +  if (is_made_of_eight_digits_fast(p)) {
    +    i = i * 100000000 + parse_eight_digits_unrolled(p);
    +    p += 8;
    +  }
    +#endif // SIMDJSON_SWAR_NUMBER_PARSING
    +#endif // #ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +  // Unrolling the first digit makes a small difference on some implementations (e.g. westmere)
    +  if (parse_digit(*p, i)) { ++p; }
    +  while (parse_digit(*p, i)) { p++; }
    +  exponent = first_after_period - p;
    +  // Decimal without digits (123.) is illegal
    +  if (exponent == 0) {
    +    return INVALID_NUMBER(src);
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) {
    +  // Exp Sign: -123.456e[-]78
    +  bool neg_exp = ('-' == *p);
    +  if (neg_exp || '+' == *p) { p++; } // Skip + as well
    +
    +  // Exponent: -123.456e-[78]
    +  auto start_exp = p;
    +  int64_t exp_number = 0;
    +  while (parse_digit(*p, exp_number)) { ++p; }
    +  // It is possible for parse_digit to overflow.
    +  // In particular, it could overflow to INT64_MIN, and we cannot do - INT64_MIN.
    +  // Thus we *must* check for possible overflow before we negate exp_number.
    +
    +  // Performance notes: it may seem like combining the two "simdjson_unlikely checks" below into
    +  // a single simdjson_unlikely path would be faster. The reasoning is sound, but the compiler may
    +  // not oblige and may, in fact, generate two distinct paths in any case. It might be
    +  // possible to do uint64_t(p - start_exp - 1) >= 18 but it could end up trading off
    +  // instructions for a simdjson_likely branch, an unconclusive gain.
    +
    +  // If there were no digits, it's an error.
    +  if (simdjson_unlikely(p == start_exp)) {
    +    return INVALID_NUMBER(src);
    +  }
    +  // We have a valid positive exponent in exp_number at this point, except that
    +  // it may have overflowed.
    +
    +  // If there were more than 18 digits, we may have overflowed the integer. We have to do
    +  // something!!!!
    +  if (simdjson_unlikely(p > start_exp+18)) {
    +    // Skip leading zeroes: 1e000000000000000000001 is technically valid and doesn't overflow
    +    while (*start_exp == '0') { start_exp++; }
    +    // 19 digits could overflow int64_t and is kind of absurd anyway. We don't
    +    // support exponents smaller than -999,999,999,999,999,999 and bigger
    +    // than 999,999,999,999,999,999.
    +    // We can truncate.
    +    // Note that 999999999999999999 is assuredly too large. The maximal ieee64 value before
    +    // infinity is ~1.8e308. The smallest subnormal is ~5e-324. So, actually, we could
    +    // truncate at 324.
    +    // Note that there is no reason to fail per se at this point in time.
    +    // E.g., 0e999999999999999999999 is a fine number.
    +    if (p > start_exp+18) { exp_number = 999999999999999999; }
    +  }
    +  // At this point, we know that exp_number is a sane, positive, signed integer.
    +  // It is <= 999,999,999,999,999,999. As long as 'exponent' is in
    +  // [-8223372036854775808, 8223372036854775808], we won't overflow. Because 'exponent'
    +  // is bounded in magnitude by the size of the JSON input, we are fine in this universe.
    +  // To sum it up: the next line should never overflow.
    +  exponent += (neg_exp ? -exp_number : exp_number);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline size_t significant_digits(const uint8_t * start_digits, size_t digit_count) {
    +  // It is possible that the integer had an overflow.
    +  // We have to handle the case where we have 0.0000somenumber.
    +  const uint8_t *start = start_digits;
    +  while ((*start == '0') || (*start == '.')) { ++start; }
    +  // we over-decrement by one when there is a '.'
    +  return digit_count - size_t(start - start_digits);
    +}
    +
    +} // unnamed namespace
    +
    +/** @private */
    +template
    +error_code slow_float_parsing(simdjson_unused const uint8_t * src, W writer) {
    +  double d;
    +  if (parse_float_fallback(src, &d)) {
    +    writer.append_double(d);
    +    return SUCCESS;
    +  }
    +  return INVALID_NUMBER(src);
    +}
    +
    +/** @private */
    +template
    +simdjson_inline error_code write_float(const uint8_t *const src, bool negative, uint64_t i, const uint8_t * start_digits, size_t digit_count, int64_t exponent, W &writer) {
    +  // If we frequently had to deal with long strings of digits,
    +  // we could extend our code by using a 128-bit integer instead
    +  // of a 64-bit integer. However, this is uncommon in practice.
    +  //
    +  // 9999999999999999999 < 2**64 so we can accommodate 19 digits.
    +  // If we have a decimal separator, then digit_count - 1 is the number of digits, but we
    +  // may not have a decimal separator!
    +  if (simdjson_unlikely(digit_count > 19 && significant_digits(start_digits, digit_count) > 19)) {
    +    // Ok, chances are good that we had an overflow!
    +    // this is almost never going to get called!!!
    +    // we start anew, going slowly!!!
    +    // This will happen in the following examples:
    +    // 10000000000000000000000000000000000000000000e+308
    +    // 3.1415926535897932384626433832795028841971693993751
    +    //
    +    // NOTE: This makes a *copy* of the writer and passes it to slow_float_parsing. This happens
    +    // because slow_float_parsing is a non-inlined function. If we passed our writer reference to
    +    // it, it would force it to be stored in memory, preventing the compiler from picking it apart
    +    // and putting into registers. i.e. if we pass it as reference, it gets slow.
    +    // This is what forces the skip_double, as well.
    +    error_code error = slow_float_parsing(src, writer);
    +    writer.skip_double();
    +    return error;
    +  }
    +  // NOTE: it's weird that the simdjson_unlikely() only wraps half the if, but it seems to get slower any other
    +  // way we've tried: https://github.com/simdjson/simdjson/pull/990#discussion_r448497331
    +  // To future reader: we'd love if someone found a better way, or at least could explain this result!
    +  if (simdjson_unlikely(exponent < simdjson::internal::smallest_power) || (exponent > simdjson::internal::largest_power)) {
    +    //
    +    // Important: smallest_power is such that it leads to a zero value.
    +    // Observe that 18446744073709551615e-343 == 0, i.e. (2**64 - 1) e -343 is zero
    +    // so something x 10^-343 goes to zero, but not so with  something x 10^-342.
    +    static_assert(simdjson::internal::smallest_power <= -342, "smallest_power is not small enough");
    +    //
    +    if((exponent < simdjson::internal::smallest_power) || (i == 0)) {
    +      // E.g. Parse "-0.0e-999" into the same value as "-0.0". See https://en.wikipedia.org/wiki/Signed_zero
    +      WRITE_DOUBLE(negative ? -0.0 : 0.0, src, writer);
    +      return SUCCESS;
    +    } else { // (exponent > largest_power) and (i != 0)
    +      // We have, for sure, an infinite value and simdjson refuses to parse infinite values.
    +      return INVALID_NUMBER(src);
    +    }
    +  }
    +  double d;
    +  if (!compute_float_64(exponent, i, negative, d)) {
    +    // we are almost never going to get here.
    +    if (!parse_float_fallback(src, &d)) { return INVALID_NUMBER(src); }
    +  }
    +  WRITE_DOUBLE(d, src, writer);
    +  return SUCCESS;
    +}
    +
    +// for performance analysis, it is sometimes  useful to skip parsing
    +#ifdef SIMDJSON_SKIPNUMBERPARSING
    +
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const, W &writer) {
    +  writer.append_s64(0);        // always write zero
    +  return SUCCESS;              // always succeeds
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept { return number_type::signed_integer; }
    +#else
    +
    +// parse the number at src
    +// define JSON_TEST_NUMBERS for unit testing
    +//
    +// It is assumed that the number is followed by a structural ({,},],[) character
    +// or a white space character. If that is not the case (e.g., when the JSON
    +// document is made of a single number), then it is necessary to copy the
    +// content and append a space before calling this function.
    +//
    +// Our objective is accurate parsing (ULP of 0) at high speed.
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) {
    +
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  if (digit_count == 0 || ('0' == *start_digits && digit_count > 1)) { return INVALID_NUMBER(src); }
    +
    +  //
    +  // Handle floats if there is a . or e (or both)
    +  //
    +  int64_t exponent = 0;
    +  bool is_float = false;
    +  if ('.' == *p) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_decimal_after_separator(src, p, i, exponent) );
    +    digit_count = int(p - start_digits); // used later to guard against overflows
    +  }
    +  if (('e' == *p) || ('E' == *p)) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_exponent(src, p, exponent) );
    +  }
    +  if (is_float) {
    +    const bool dirty_end = jsoncharutils::is_not_structural_or_whitespace(*p);
    +    SIMDJSON_TRY( write_float(src, negative, i, start_digits, digit_count, exponent, writer) );
    +    if (dirty_end) { return INVALID_NUMBER(src); }
    +    return SUCCESS;
    +  }
    +
    +  // The longest negative 64-bit number is 19 digits.
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  size_t longest_digit_count = negative ? 19 : 20;
    +  if (digit_count > longest_digit_count) { return INVALID_NUMBER(src); }
    +  if (digit_count == longest_digit_count) {
    +    if (negative) {
    +      // Anything negative above INT64_MAX+1 is invalid
    +      if (i > uint64_t(INT64_MAX)+1) { return INVALID_NUMBER(src);  }
    +      WRITE_INTEGER(~i+1, src, writer);
    +      if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +      return SUCCESS;
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    }  else if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INVALID_NUMBER(src); }
    +  }
    +
    +  // Write unsigned if it doesn't fit in a signed integer.
    +  if (i > uint64_t(INT64_MAX)) {
    +    WRITE_UNSIGNED(i, src, writer);
    +  } else {
    +    WRITE_INTEGER(negative ? (~i+1) : i, src, writer);
    +  }
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +  return SUCCESS;
    +}
    +
    +// Inlineable functions
    +namespace {
    +
    +// This table can be used to characterize the final character of an integer
    +// string. For JSON structural character and allowable white space characters,
    +// we return SUCCESS. For 'e', '.' and 'E', we return INCORRECT_TYPE. Otherwise
    +// we return NUMBER_ERROR.
    +// Optimization note: we could easily reduce the size of the table by half (to 128)
    +// at the cost of an extra branch.
    +// Optimization note: we want the values to use at most 8 bits (not, e.g., 32 bits):
    +static_assert(error_code(uint8_t(NUMBER_ERROR))== NUMBER_ERROR, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(SUCCESS))== SUCCESS, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(INCORRECT_TYPE))== INCORRECT_TYPE, "bad NUMBER_ERROR cast");
    +
    +const uint8_t integer_string_finisher[256] = {
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   SUCCESS,      NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, INCORRECT_TYPE,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, SUCCESS,        NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR};
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if ((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src + 1;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    // Note: we use src[1] and not src[0] because src[0] is the quote character in this
    +    // instance.
    +    if (src[1] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = src;
    +  uint64_t i = 0;
    +  while (parse_digit(*src, i)) { src++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(src - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*src)) {
    +  //  return (*src == '.' || *src == 'e' || *src == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(*src != '"') { return NUMBER_ERROR; }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept {
    +  return (*src == '-');
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) { return true; }
    +  return false;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) {
    +    // We have an integer.
    +    // If the number is negative and valid, it must be a signed integer.
    +    if(negative) { return number_type::signed_integer; }
    +    // We want values larger or equal to 9223372036854775808 to be unsigned
    +    // integers, and the other values to be signed integers.
    +    int digit_count = int(p - src);
    +    if(digit_count >= 19) {
    +      const uint8_t * smaller_big_integer = reinterpret_cast("9223372036854775808");
    +      if((digit_count >= 20) || (memcmp(src, smaller_big_integer, 19) >= 0)) {
    +        return number_type::unsigned_integer;
    +      }
    +    }
    +    return number_type::signed_integer;
    +  }
    +  // Hopefully, we have 'e' or 'E' or '.'.
    +  return number_type::floating_point_number;
    +}
    +
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src, const uint8_t * const src_end) noexcept {
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  if(p == src_end) { return NUMBER_ERROR; }
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely((p != src_end) && (*p == '.'))) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if ((p == src_end) || !parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = start_digits-src > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if ((p != src_end) && (*p == 'e' || *p == 'E')) {
    +    p++;
    +    if(p == src_end) { return NUMBER_ERROR; }
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while ((p != src_end) && parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if ((p != src_end) && jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), src_end, &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +} // unnamed namespace
    +#endif // SIMDJSON_SKIPNUMBERPARSING
    +
    +} // namespace numberparsing
    +
    +inline std::ostream& operator<<(std::ostream& out, number_type type) noexcept {
    +    switch (type) {
    +        case number_type::signed_integer: out << "integer in [-9223372036854775808,9223372036854775808)"; break;
    +        case number_type::unsigned_integer: out << "unsigned integer in [9223372036854775808,18446744073709551616)"; break;
    +        case number_type::floating_point_number: out << "floating-point number (binary64)"; break;
    +        default: SIMDJSON_UNREACHABLE();
    +    }
    +    return out;
    +}
    +
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_NUMBERPARSING_H
    +/* end file simdjson/generic/numberparsing.h for ppc64 */
    +
    +/* including simdjson/generic/implementation_simdjson_result_base-inl.h for ppc64: #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base-inl.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +
    +//
    +// internal::implementation_simdjson_result_base inline implementation
    +//
    +
    +template
    +simdjson_inline void implementation_simdjson_result_base::tie(T &value, error_code &error) && noexcept {
    +  error = this->second;
    +  if (!error) {
    +    value = std::forward>(*this).first;
    +  }
    +}
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::get(T &value) && noexcept {
    +  error_code error;
    +  std::forward>(*this).tie(value, error);
    +  return error;
    +}
    +
    +template
    +simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept {
    +  return this->second;
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::take_value() && noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::operator T&&() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline const T& implementation_simdjson_result_base::value_unsafe() const& noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value_unsafe() & noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value_unsafe() && noexcept {
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value, error_code error) noexcept
    +    : first{std::forward(value)}, second{error} {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(error_code error) noexcept
    +    : implementation_simdjson_result_base(T{}, error) {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value), SUCCESS) {}
    +
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +/* end file simdjson/generic/implementation_simdjson_result_base-inl.h for ppc64 */
    +/* end file simdjson/generic/amalgamated.h for ppc64 */
    +/* including simdjson/ppc64/end.h: #include "simdjson/ppc64/end.h" */
    +/* begin file simdjson/ppc64/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT
    +/* undefining SIMDJSON_IMPLEMENTATION from "ppc64" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/ppc64/end.h */
    +
    +#endif // SIMDJSON_PPC64_H
    +/* end file simdjson/ppc64.h */
    +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(westmere)
    +/* including simdjson/westmere.h: #include "simdjson/westmere.h" */
    +/* begin file simdjson/westmere.h */
    +#ifndef SIMDJSON_WESTMERE_H
    +#define SIMDJSON_WESTMERE_H
    +
    +/* including simdjson/westmere/begin.h: #include "simdjson/westmere/begin.h" */
    +/* begin file simdjson/westmere/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "westmere" */
    +#define SIMDJSON_IMPLEMENTATION westmere
    +/* including simdjson/westmere/base.h: #include "simdjson/westmere/base.h" */
    +/* begin file simdjson/westmere/base.h */
    +#ifndef SIMDJSON_WESTMERE_BASE_H
    +#define SIMDJSON_WESTMERE_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_WESTMERE
    +namespace simdjson {
    +/**
    + * Implementation for Westmere (Intel SSE4.2).
    + */
    +namespace westmere {
    +
    +class implementation;
    +
    +namespace {
    +namespace simd {
    +
    +template  struct simd8;
    +template  struct simd8x64;
    +
    +} // namespace simd
    +} // unnamed namespace
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_BASE_H
    +/* end file simdjson/westmere/base.h */
    +/* including simdjson/westmere/intrinsics.h: #include "simdjson/westmere/intrinsics.h" */
    +/* begin file simdjson/westmere/intrinsics.h */
    +#ifndef SIMDJSON_WESTMERE_INTRINSICS_H
    +#define SIMDJSON_WESTMERE_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if SIMDJSON_VISUAL_STUDIO
    +// under clang within visual studio, this will include 
    +#include  // visual studio or clang
    +#else
    +#include  // elsewhere
    +#endif // SIMDJSON_VISUAL_STUDIO
    +
    +
    +#if SIMDJSON_CLANG_VISUAL_STUDIO
    +/**
    + * You are not supposed, normally, to include these
    + * headers directly. Instead you should either include intrin.h
    + * or x86intrin.h. However, when compiling with clang
    + * under Windows (i.e., when _MSC_VER is set), these headers
    + * only get included *if* the corresponding features are detected
    + * from macros:
    + */
    +#include   // for _mm_alignr_epi8
    +#include   // for  _mm_clmulepi64_si128
    +#endif
    +
    +static_assert(sizeof(__m128i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for westmere");
    +
    +#endif // SIMDJSON_WESTMERE_INTRINSICS_H
    +/* end file simdjson/westmere/intrinsics.h */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_WESTMERE
    +SIMDJSON_TARGET_REGION("sse4.2,pclmul,popcnt")
    +#endif
    +
    +/* including simdjson/westmere/bitmanipulation.h: #include "simdjson/westmere/bitmanipulation.h" */
    +/* begin file simdjson/westmere/bitmanipulation.h */
    +#ifndef SIMDJSON_WESTMERE_BITMANIPULATION_H
    +#define SIMDJSON_WESTMERE_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long ret;
    +  // Search the mask data from least significant bit (LSB)
    +  // to the most significant bit (MSB) for a set bit (1).
    +  _BitScanForward64(&ret, input_num);
    +  return (int)ret;
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return input_num & (input_num-1);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long leading_zero = 0;
    +  // Search the mask data from most significant bit (MSB)
    +  // to least significant bit (LSB) for a set bit (1).
    +  if (_BitScanReverse64(&leading_zero, input_num))
    +    return (int)(63 - leading_zero);
    +  else
    +    return 64;
    +#else
    +  return __builtin_clzll(input_num);
    +#endif// SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +simdjson_inline unsigned __int64 count_ones(uint64_t input_num) {
    +  // note: we do not support legacy 32-bit Windows in this kernel
    +  return __popcnt64(input_num);// Visual Studio wants two underscores
    +}
    +#else
    +simdjson_inline long long int count_ones(uint64_t input_num) {
    +  return _popcnt64(input_num);
    +}
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2,
    +                                uint64_t *result) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return _addcarry_u64(0, value1, value2,
    +                       reinterpret_cast(result));
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_BITMANIPULATION_H
    +/* end file simdjson/westmere/bitmanipulation.h */
    +/* including simdjson/westmere/bitmask.h: #include "simdjson/westmere/bitmask.h" */
    +/* begin file simdjson/westmere/bitmask.h */
    +#ifndef SIMDJSON_WESTMERE_BITMASK_H
    +#define SIMDJSON_WESTMERE_BITMASK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +
    +//
    +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered.
    +//
    +// For example, prefix_xor(00100100) == 00011100
    +//
    +simdjson_inline uint64_t prefix_xor(const uint64_t bitmask) {
    +  // There should be no such thing with a processing supporting avx2
    +  // but not clmul.
    +  __m128i all_ones = _mm_set1_epi8('\xFF');
    +  __m128i result = _mm_clmulepi64_si128(_mm_set_epi64x(0ULL, bitmask), all_ones, 0);
    +  return _mm_cvtsi128_si64(result);
    +}
    +
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_BITMASK_H
    +/* end file simdjson/westmere/bitmask.h */
    +/* including simdjson/westmere/numberparsing_defs.h: #include "simdjson/westmere/numberparsing_defs.h" */
    +/* begin file simdjson/westmere/numberparsing_defs.h */
    +#ifndef SIMDJSON_WESTMERE_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_WESTMERE_NUMBERPARSING_DEFS_H
    +
    +/* including simdjson/westmere/base.h: #include "simdjson/westmere/base.h" */
    +/* begin file simdjson/westmere/base.h */
    +#ifndef SIMDJSON_WESTMERE_BASE_H
    +#define SIMDJSON_WESTMERE_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_WESTMERE
    +namespace simdjson {
    +/**
    + * Implementation for Westmere (Intel SSE4.2).
    + */
    +namespace westmere {
    +
    +class implementation;
    +
    +namespace {
    +namespace simd {
    +
    +template  struct simd8;
    +template  struct simd8x64;
    +
    +} // namespace simd
    +} // unnamed namespace
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_BASE_H
    +/* end file simdjson/westmere/base.h */
    +/* including simdjson/westmere/intrinsics.h: #include "simdjson/westmere/intrinsics.h" */
    +/* begin file simdjson/westmere/intrinsics.h */
    +#ifndef SIMDJSON_WESTMERE_INTRINSICS_H
    +#define SIMDJSON_WESTMERE_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if SIMDJSON_VISUAL_STUDIO
    +// under clang within visual studio, this will include 
    +#include  // visual studio or clang
    +#else
    +#include  // elsewhere
    +#endif // SIMDJSON_VISUAL_STUDIO
    +
    +
    +#if SIMDJSON_CLANG_VISUAL_STUDIO
    +/**
    + * You are not supposed, normally, to include these
    + * headers directly. Instead you should either include intrin.h
    + * or x86intrin.h. However, when compiling with clang
    + * under Windows (i.e., when _MSC_VER is set), these headers
    + * only get included *if* the corresponding features are detected
    + * from macros:
    + */
    +#include   // for _mm_alignr_epi8
    +#include   // for  _mm_clmulepi64_si128
    +#endif
    +
    +static_assert(sizeof(__m128i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for westmere");
    +
    +#endif // SIMDJSON_WESTMERE_INTRINSICS_H
    +/* end file simdjson/westmere/intrinsics.h */
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace numberparsing {
    +
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  // this actually computes *16* values so we are being wasteful.
    +  const __m128i ascii0 = _mm_set1_epi8('0');
    +  const __m128i mul_1_10 =
    +      _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1);
    +  const __m128i mul_1_100 = _mm_setr_epi16(100, 1, 100, 1, 100, 1, 100, 1);
    +  const __m128i mul_1_10000 =
    +      _mm_setr_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1);
    +  const __m128i input = _mm_sub_epi8(
    +      _mm_loadu_si128(reinterpret_cast(chars)), ascii0);
    +  const __m128i t1 = _mm_maddubs_epi16(input, mul_1_10);
    +  const __m128i t2 = _mm_madd_epi16(t1, mul_1_100);
    +  const __m128i t3 = _mm_packus_epi32(t2, t2);
    +  const __m128i t4 = _mm_madd_epi16(t3, mul_1_10000);
    +  return _mm_cvtsi128_si32(
    +      t4); // only captures the sum of the first 8 digits, drop the rest
    +}
    +
    +/** @private */
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif //  SIMDJSON_WESTMERE_NUMBERPARSING_DEFS_H
    +/* end file simdjson/westmere/numberparsing_defs.h */
    +/* including simdjson/westmere/simd.h: #include "simdjson/westmere/simd.h" */
    +/* begin file simdjson/westmere/simd.h */
    +#ifndef SIMDJSON_WESTMERE_SIMD_H
    +#define SIMDJSON_WESTMERE_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace simd {
    +
    +  template
    +  struct base {
    +    __m128i value;
    +
    +    // Zero constructor
    +    simdjson_inline base() : value{__m128i()} {}
    +
    +    // Conversion from SIMD register
    +    simdjson_inline base(const __m128i _value) : value(_value) {}
    +
    +    // Conversion to SIMD register
    +    simdjson_inline operator const __m128i&() const { return this->value; }
    +    simdjson_inline operator __m128i&() { return this->value; }
    +
    +    // Bit operations
    +    simdjson_inline Child operator|(const Child other) const { return _mm_or_si128(*this, other); }
    +    simdjson_inline Child operator&(const Child other) const { return _mm_and_si128(*this, other); }
    +    simdjson_inline Child operator^(const Child other) const { return _mm_xor_si128(*this, other); }
    +    simdjson_inline Child bit_andnot(const Child other) const { return _mm_andnot_si128(other, *this); }
    +    simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast | other; return *this_cast; }
    +    simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast & other; return *this_cast; }
    +    simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast ^ other; return *this_cast; }
    +  };
    +
    +  template>
    +  struct base8: base> {
    +    typedef uint16_t bitmask_t;
    +    typedef uint32_t bitmask2_t;
    +
    +    simdjson_inline base8() : base>() {}
    +    simdjson_inline base8(const __m128i _value) : base>(_value) {}
    +
    +    friend simdjson_inline Mask operator==(const simd8 lhs, const simd8 rhs) { return _mm_cmpeq_epi8(lhs, rhs); }
    +
    +    static const int SIZE = sizeof(base>::value);
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +      return _mm_alignr_epi8(*this, prev_chunk, 16 - N);
    +    }
    +  };
    +
    +  // SIMD byte mask type (returned by things like eq and gt)
    +  template<>
    +  struct simd8: base8 {
    +    static simdjson_inline simd8 splat(bool _value) { return _mm_set1_epi8(uint8_t(-(!!_value))); }
    +
    +    simdjson_inline simd8() : base8() {}
    +    simdjson_inline simd8(const __m128i _value) : base8(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(bool _value) : base8(splat(_value)) {}
    +
    +    simdjson_inline int to_bitmask() const { return _mm_movemask_epi8(*this); }
    +    simdjson_inline bool any() const { return !_mm_testz_si128(*this, *this); }
    +    simdjson_inline simd8 operator~() const { return *this ^ true; }
    +  };
    +
    +  template
    +  struct base8_numeric: base8 {
    +    static simdjson_inline simd8 splat(T _value) { return _mm_set1_epi8(_value); }
    +    static simdjson_inline simd8 zero() { return _mm_setzero_si128(); }
    +    static simdjson_inline simd8 load(const T values[16]) {
    +      return _mm_loadu_si128(reinterpret_cast(values));
    +    }
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    static simdjson_inline simd8 repeat_16(
    +      T v0,  T v1,  T v2,  T v3,  T v4,  T v5,  T v6,  T v7,
    +      T v8,  T v9,  T v10, T v11, T v12, T v13, T v14, T v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    simdjson_inline base8_numeric() : base8() {}
    +    simdjson_inline base8_numeric(const __m128i _value) : base8(_value) {}
    +
    +    // Store to array
    +    simdjson_inline void store(T dst[16]) const { return _mm_storeu_si128(reinterpret_cast<__m128i *>(dst), *this); }
    +
    +    // Override to distinguish from bool version
    +    simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +
    +    // Addition/subtraction are the same for signed and unsigned
    +    simdjson_inline simd8 operator+(const simd8 other) const { return _mm_add_epi8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return _mm_sub_epi8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *static_cast*>(this); }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *static_cast*>(this); }
    +
    +    // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values)
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return _mm_shuffle_epi8(lookup_table, *this);
    +    }
    +
    +    // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset).
    +    // Passing a 0 value for mask would be equivalent to writing out every byte to output.
    +    // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes
    +    // get written.
    +    // Design consideration: it seems like a function with the
    +    // signature simd8 compress(uint32_t mask) would be
    +    // sensible, but the AVX ISA makes this kind of approach difficult.
    +    template
    +    simdjson_inline void compress(uint16_t mask, L * output) const {
    +      using internal::thintable_epi8;
    +      using internal::BitsSetTable256mul2;
    +      using internal::pshufb_combine_table;
    +      // this particular implementation was inspired by work done by @animetosho
    +      // we do it in two steps, first 8 bytes and then second 8 bytes
    +      uint8_t mask1 = uint8_t(mask); // least significant 8 bits
    +      uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
    +      // next line just loads the 64-bit values thintable_epi8[mask1] and
    +      // thintable_epi8[mask2] into a 128-bit register, using only
    +      // two instructions on most compilers.
    +      __m128i shufmask =  _mm_set_epi64x(thintable_epi8[mask2], thintable_epi8[mask1]);
    +      // we increment by 0x08 the second half of the mask
    +      shufmask =
    +      _mm_add_epi8(shufmask, _mm_set_epi32(0x08080808, 0x08080808, 0, 0));
    +      // this is the version "nearly pruned"
    +      __m128i pruned = _mm_shuffle_epi8(*this, shufmask);
    +      // we still need to put the two halves together.
    +      // we compute the popcount of the first half:
    +      int pop1 = BitsSetTable256mul2[mask1];
    +      // then load the corresponding mask, what it does is to write
    +      // only the first pop1 bytes from the first 8 bytes, and then
    +      // it fills in with the bytes from the second 8 bytes + some filling
    +      // at the end.
    +      __m128i compactmask =
    +      _mm_loadu_si128(reinterpret_cast(pshufb_combine_table + pop1 * 8));
    +      __m128i answer = _mm_shuffle_epi8(pruned, compactmask);
    +      _mm_storeu_si128(reinterpret_cast<__m128i *>(output), answer);
    +    }
    +
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +  };
    +
    +  // Signed bytes
    +  template<>
    +  struct simd8 : base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m128i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const int8_t* values) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) : simd8(_mm_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Order-sensitive comparisons
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm_max_epi8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm_min_epi8(*this, other); }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return _mm_cmpgt_epi8(*this, other); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return _mm_cmpgt_epi8(other, *this); }
    +  };
    +
    +  // Unsigned bytes
    +  template<>
    +  struct simd8: base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m128i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const uint8_t* values) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) : simd8(_mm_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Saturated math
    +    simdjson_inline simd8 saturating_add(const simd8 other) const { return _mm_adds_epu8(*this, other); }
    +    simdjson_inline simd8 saturating_sub(const simd8 other) const { return _mm_subs_epu8(*this, other); }
    +
    +    // Order-specific operations
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm_max_epu8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm_min_epu8(*this, other); }
    +    // Same as >, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 gt_bits(const simd8 other) const { return this->saturating_sub(other); }
    +    // Same as <, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 lt_bits(const simd8 other) const { return other.saturating_sub(*this); }
    +    simdjson_inline simd8 operator<=(const simd8 other) const { return other.max_val(*this) == other; }
    +    simdjson_inline simd8 operator>=(const simd8 other) const { return other.min_val(*this) == other; }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +
    +    // Bit-specific operations
    +    simdjson_inline simd8 bits_not_set() const { return *this == uint8_t(0); }
    +    simdjson_inline simd8 bits_not_set(simd8 bits) const { return (*this & bits).bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set() const { return ~this->bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set(simd8 bits) const { return ~this->bits_not_set(bits); }
    +    simdjson_inline bool is_ascii() const { return _mm_movemask_epi8(*this) == 0; }
    +    simdjson_inline bool bits_not_set_anywhere() const { return _mm_testz_si128(*this, *this); }
    +    simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); }
    +    simdjson_inline bool bits_not_set_anywhere(simd8 bits) const { return _mm_testz_si128(*this, bits); }
    +    simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return !bits_not_set_anywhere(bits); }
    +    template
    +    simdjson_inline simd8 shr() const { return simd8(_mm_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); }
    +    template
    +    simdjson_inline simd8 shl() const { return simd8(_mm_slli_epi16(*this, N)) & uint8_t(0xFFu << N); }
    +    // Get one of the bits and make a bitmask out of it.
    +    // e.g. value.get_bit<7>() gets the high bit
    +    template
    +    simdjson_inline int get_bit() const { return _mm_movemask_epi8(_mm_slli_epi16(*this, 7-N)); }
    +  };
    +
    +  template
    +  struct simd8x64 {
    +    static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +    static_assert(NUM_CHUNKS == 4, "Westmere kernel should use four registers per 64-byte block.");
    +    const simd8 chunks[NUM_CHUNKS];
    +
    +    simd8x64(const simd8x64& o) = delete; // no copy allowed
    +    simd8x64& operator=(const simd8& other) = delete; // no assignment allowed
    +    simd8x64() = delete; // no default constructor allowed
    +
    +    simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1, const simd8 chunk2, const simd8 chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {}
    +    simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8::load(ptr), simd8::load(ptr+16), simd8::load(ptr+32), simd8::load(ptr+48)} {}
    +
    +    simdjson_inline void store(T ptr[64]) const {
    +      this->chunks[0].store(ptr+sizeof(simd8)*0);
    +      this->chunks[1].store(ptr+sizeof(simd8)*1);
    +      this->chunks[2].store(ptr+sizeof(simd8)*2);
    +      this->chunks[3].store(ptr+sizeof(simd8)*3);
    +    }
    +
    +    simdjson_inline simd8 reduce_or() const {
    +      return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]);
    +    }
    +
    +    simdjson_inline uint64_t compress(uint64_t mask, T * output) const {
    +      this->chunks[0].compress(uint16_t(mask), output);
    +      this->chunks[1].compress(uint16_t(mask >> 16), output + 16 - count_ones(mask & 0xFFFF));
    +      this->chunks[2].compress(uint16_t(mask >> 32), output + 32 - count_ones(mask & 0xFFFFFFFF));
    +      this->chunks[3].compress(uint16_t(mask >> 48), output + 48 - count_ones(mask & 0xFFFFFFFFFFFF));
    +      return 64 - count_ones(mask);
    +    }
    +
    +    simdjson_inline uint64_t to_bitmask() const {
    +      uint64_t r0 = uint32_t(this->chunks[0].to_bitmask() );
    +      uint64_t r1 =          this->chunks[1].to_bitmask() ;
    +      uint64_t r2 =          this->chunks[2].to_bitmask() ;
    +      uint64_t r3 =          this->chunks[3].to_bitmask() ;
    +      return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48);
    +    }
    +
    +    simdjson_inline uint64_t eq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] == mask,
    +        this->chunks[1] == mask,
    +        this->chunks[2] == mask,
    +        this->chunks[3] == mask
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t eq(const simd8x64 &other) const {
    +      return  simd8x64(
    +        this->chunks[0] == other.chunks[0],
    +        this->chunks[1] == other.chunks[1],
    +        this->chunks[2] == other.chunks[2],
    +        this->chunks[3] == other.chunks[3]
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t lteq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] <= mask,
    +        this->chunks[1] <= mask,
    +        this->chunks[2] <= mask,
    +        this->chunks[3] <= mask
    +      ).to_bitmask();
    +    }
    +  }; // struct simd8x64
    +
    +} // namespace simd
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_SIMD_INPUT_H
    +/* end file simdjson/westmere/simd.h */
    +/* including simdjson/westmere/stringparsing_defs.h: #include "simdjson/westmere/stringparsing_defs.h" */
    +/* begin file simdjson/westmere/stringparsing_defs.h */
    +#ifndef SIMDJSON_WESTMERE_STRINGPARSING_DEFS_H
    +#define SIMDJSON_WESTMERE_STRINGPARSING_DEFS_H
    +
    +/* including simdjson/westmere/bitmanipulation.h: #include "simdjson/westmere/bitmanipulation.h" */
    +/* begin file simdjson/westmere/bitmanipulation.h */
    +#ifndef SIMDJSON_WESTMERE_BITMANIPULATION_H
    +#define SIMDJSON_WESTMERE_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long ret;
    +  // Search the mask data from least significant bit (LSB)
    +  // to the most significant bit (MSB) for a set bit (1).
    +  _BitScanForward64(&ret, input_num);
    +  return (int)ret;
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return input_num & (input_num-1);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long leading_zero = 0;
    +  // Search the mask data from most significant bit (MSB)
    +  // to least significant bit (LSB) for a set bit (1).
    +  if (_BitScanReverse64(&leading_zero, input_num))
    +    return (int)(63 - leading_zero);
    +  else
    +    return 64;
    +#else
    +  return __builtin_clzll(input_num);
    +#endif// SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +simdjson_inline unsigned __int64 count_ones(uint64_t input_num) {
    +  // note: we do not support legacy 32-bit Windows in this kernel
    +  return __popcnt64(input_num);// Visual Studio wants two underscores
    +}
    +#else
    +simdjson_inline long long int count_ones(uint64_t input_num) {
    +  return _popcnt64(input_num);
    +}
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2,
    +                                uint64_t *result) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return _addcarry_u64(0, value1, value2,
    +                       reinterpret_cast(result));
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_BITMANIPULATION_H
    +/* end file simdjson/westmere/bitmanipulation.h */
    +/* including simdjson/westmere/simd.h: #include "simdjson/westmere/simd.h" */
    +/* begin file simdjson/westmere/simd.h */
    +#ifndef SIMDJSON_WESTMERE_SIMD_H
    +#define SIMDJSON_WESTMERE_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace simd {
    +
    +  template
    +  struct base {
    +    __m128i value;
    +
    +    // Zero constructor
    +    simdjson_inline base() : value{__m128i()} {}
    +
    +    // Conversion from SIMD register
    +    simdjson_inline base(const __m128i _value) : value(_value) {}
    +
    +    // Conversion to SIMD register
    +    simdjson_inline operator const __m128i&() const { return this->value; }
    +    simdjson_inline operator __m128i&() { return this->value; }
    +
    +    // Bit operations
    +    simdjson_inline Child operator|(const Child other) const { return _mm_or_si128(*this, other); }
    +    simdjson_inline Child operator&(const Child other) const { return _mm_and_si128(*this, other); }
    +    simdjson_inline Child operator^(const Child other) const { return _mm_xor_si128(*this, other); }
    +    simdjson_inline Child bit_andnot(const Child other) const { return _mm_andnot_si128(other, *this); }
    +    simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast | other; return *this_cast; }
    +    simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast & other; return *this_cast; }
    +    simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast ^ other; return *this_cast; }
    +  };
    +
    +  template>
    +  struct base8: base> {
    +    typedef uint16_t bitmask_t;
    +    typedef uint32_t bitmask2_t;
    +
    +    simdjson_inline base8() : base>() {}
    +    simdjson_inline base8(const __m128i _value) : base>(_value) {}
    +
    +    friend simdjson_inline Mask operator==(const simd8 lhs, const simd8 rhs) { return _mm_cmpeq_epi8(lhs, rhs); }
    +
    +    static const int SIZE = sizeof(base>::value);
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +      return _mm_alignr_epi8(*this, prev_chunk, 16 - N);
    +    }
    +  };
    +
    +  // SIMD byte mask type (returned by things like eq and gt)
    +  template<>
    +  struct simd8: base8 {
    +    static simdjson_inline simd8 splat(bool _value) { return _mm_set1_epi8(uint8_t(-(!!_value))); }
    +
    +    simdjson_inline simd8() : base8() {}
    +    simdjson_inline simd8(const __m128i _value) : base8(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(bool _value) : base8(splat(_value)) {}
    +
    +    simdjson_inline int to_bitmask() const { return _mm_movemask_epi8(*this); }
    +    simdjson_inline bool any() const { return !_mm_testz_si128(*this, *this); }
    +    simdjson_inline simd8 operator~() const { return *this ^ true; }
    +  };
    +
    +  template
    +  struct base8_numeric: base8 {
    +    static simdjson_inline simd8 splat(T _value) { return _mm_set1_epi8(_value); }
    +    static simdjson_inline simd8 zero() { return _mm_setzero_si128(); }
    +    static simdjson_inline simd8 load(const T values[16]) {
    +      return _mm_loadu_si128(reinterpret_cast(values));
    +    }
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    static simdjson_inline simd8 repeat_16(
    +      T v0,  T v1,  T v2,  T v3,  T v4,  T v5,  T v6,  T v7,
    +      T v8,  T v9,  T v10, T v11, T v12, T v13, T v14, T v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    simdjson_inline base8_numeric() : base8() {}
    +    simdjson_inline base8_numeric(const __m128i _value) : base8(_value) {}
    +
    +    // Store to array
    +    simdjson_inline void store(T dst[16]) const { return _mm_storeu_si128(reinterpret_cast<__m128i *>(dst), *this); }
    +
    +    // Override to distinguish from bool version
    +    simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +
    +    // Addition/subtraction are the same for signed and unsigned
    +    simdjson_inline simd8 operator+(const simd8 other) const { return _mm_add_epi8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return _mm_sub_epi8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *static_cast*>(this); }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *static_cast*>(this); }
    +
    +    // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values)
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return _mm_shuffle_epi8(lookup_table, *this);
    +    }
    +
    +    // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset).
    +    // Passing a 0 value for mask would be equivalent to writing out every byte to output.
    +    // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes
    +    // get written.
    +    // Design consideration: it seems like a function with the
    +    // signature simd8 compress(uint32_t mask) would be
    +    // sensible, but the AVX ISA makes this kind of approach difficult.
    +    template
    +    simdjson_inline void compress(uint16_t mask, L * output) const {
    +      using internal::thintable_epi8;
    +      using internal::BitsSetTable256mul2;
    +      using internal::pshufb_combine_table;
    +      // this particular implementation was inspired by work done by @animetosho
    +      // we do it in two steps, first 8 bytes and then second 8 bytes
    +      uint8_t mask1 = uint8_t(mask); // least significant 8 bits
    +      uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
    +      // next line just loads the 64-bit values thintable_epi8[mask1] and
    +      // thintable_epi8[mask2] into a 128-bit register, using only
    +      // two instructions on most compilers.
    +      __m128i shufmask =  _mm_set_epi64x(thintable_epi8[mask2], thintable_epi8[mask1]);
    +      // we increment by 0x08 the second half of the mask
    +      shufmask =
    +      _mm_add_epi8(shufmask, _mm_set_epi32(0x08080808, 0x08080808, 0, 0));
    +      // this is the version "nearly pruned"
    +      __m128i pruned = _mm_shuffle_epi8(*this, shufmask);
    +      // we still need to put the two halves together.
    +      // we compute the popcount of the first half:
    +      int pop1 = BitsSetTable256mul2[mask1];
    +      // then load the corresponding mask, what it does is to write
    +      // only the first pop1 bytes from the first 8 bytes, and then
    +      // it fills in with the bytes from the second 8 bytes + some filling
    +      // at the end.
    +      __m128i compactmask =
    +      _mm_loadu_si128(reinterpret_cast(pshufb_combine_table + pop1 * 8));
    +      __m128i answer = _mm_shuffle_epi8(pruned, compactmask);
    +      _mm_storeu_si128(reinterpret_cast<__m128i *>(output), answer);
    +    }
    +
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +  };
    +
    +  // Signed bytes
    +  template<>
    +  struct simd8 : base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m128i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const int8_t* values) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) : simd8(_mm_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Order-sensitive comparisons
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm_max_epi8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm_min_epi8(*this, other); }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return _mm_cmpgt_epi8(*this, other); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return _mm_cmpgt_epi8(other, *this); }
    +  };
    +
    +  // Unsigned bytes
    +  template<>
    +  struct simd8: base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m128i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const uint8_t* values) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) : simd8(_mm_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Saturated math
    +    simdjson_inline simd8 saturating_add(const simd8 other) const { return _mm_adds_epu8(*this, other); }
    +    simdjson_inline simd8 saturating_sub(const simd8 other) const { return _mm_subs_epu8(*this, other); }
    +
    +    // Order-specific operations
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm_max_epu8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm_min_epu8(*this, other); }
    +    // Same as >, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 gt_bits(const simd8 other) const { return this->saturating_sub(other); }
    +    // Same as <, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 lt_bits(const simd8 other) const { return other.saturating_sub(*this); }
    +    simdjson_inline simd8 operator<=(const simd8 other) const { return other.max_val(*this) == other; }
    +    simdjson_inline simd8 operator>=(const simd8 other) const { return other.min_val(*this) == other; }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +
    +    // Bit-specific operations
    +    simdjson_inline simd8 bits_not_set() const { return *this == uint8_t(0); }
    +    simdjson_inline simd8 bits_not_set(simd8 bits) const { return (*this & bits).bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set() const { return ~this->bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set(simd8 bits) const { return ~this->bits_not_set(bits); }
    +    simdjson_inline bool is_ascii() const { return _mm_movemask_epi8(*this) == 0; }
    +    simdjson_inline bool bits_not_set_anywhere() const { return _mm_testz_si128(*this, *this); }
    +    simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); }
    +    simdjson_inline bool bits_not_set_anywhere(simd8 bits) const { return _mm_testz_si128(*this, bits); }
    +    simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return !bits_not_set_anywhere(bits); }
    +    template
    +    simdjson_inline simd8 shr() const { return simd8(_mm_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); }
    +    template
    +    simdjson_inline simd8 shl() const { return simd8(_mm_slli_epi16(*this, N)) & uint8_t(0xFFu << N); }
    +    // Get one of the bits and make a bitmask out of it.
    +    // e.g. value.get_bit<7>() gets the high bit
    +    template
    +    simdjson_inline int get_bit() const { return _mm_movemask_epi8(_mm_slli_epi16(*this, 7-N)); }
    +  };
    +
    +  template
    +  struct simd8x64 {
    +    static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +    static_assert(NUM_CHUNKS == 4, "Westmere kernel should use four registers per 64-byte block.");
    +    const simd8 chunks[NUM_CHUNKS];
    +
    +    simd8x64(const simd8x64& o) = delete; // no copy allowed
    +    simd8x64& operator=(const simd8& other) = delete; // no assignment allowed
    +    simd8x64() = delete; // no default constructor allowed
    +
    +    simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1, const simd8 chunk2, const simd8 chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {}
    +    simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8::load(ptr), simd8::load(ptr+16), simd8::load(ptr+32), simd8::load(ptr+48)} {}
    +
    +    simdjson_inline void store(T ptr[64]) const {
    +      this->chunks[0].store(ptr+sizeof(simd8)*0);
    +      this->chunks[1].store(ptr+sizeof(simd8)*1);
    +      this->chunks[2].store(ptr+sizeof(simd8)*2);
    +      this->chunks[3].store(ptr+sizeof(simd8)*3);
    +    }
    +
    +    simdjson_inline simd8 reduce_or() const {
    +      return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]);
    +    }
    +
    +    simdjson_inline uint64_t compress(uint64_t mask, T * output) const {
    +      this->chunks[0].compress(uint16_t(mask), output);
    +      this->chunks[1].compress(uint16_t(mask >> 16), output + 16 - count_ones(mask & 0xFFFF));
    +      this->chunks[2].compress(uint16_t(mask >> 32), output + 32 - count_ones(mask & 0xFFFFFFFF));
    +      this->chunks[3].compress(uint16_t(mask >> 48), output + 48 - count_ones(mask & 0xFFFFFFFFFFFF));
    +      return 64 - count_ones(mask);
    +    }
    +
    +    simdjson_inline uint64_t to_bitmask() const {
    +      uint64_t r0 = uint32_t(this->chunks[0].to_bitmask() );
    +      uint64_t r1 =          this->chunks[1].to_bitmask() ;
    +      uint64_t r2 =          this->chunks[2].to_bitmask() ;
    +      uint64_t r3 =          this->chunks[3].to_bitmask() ;
    +      return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48);
    +    }
    +
    +    simdjson_inline uint64_t eq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] == mask,
    +        this->chunks[1] == mask,
    +        this->chunks[2] == mask,
    +        this->chunks[3] == mask
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t eq(const simd8x64 &other) const {
    +      return  simd8x64(
    +        this->chunks[0] == other.chunks[0],
    +        this->chunks[1] == other.chunks[1],
    +        this->chunks[2] == other.chunks[2],
    +        this->chunks[3] == other.chunks[3]
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t lteq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] <= mask,
    +        this->chunks[1] <= mask,
    +        this->chunks[2] <= mask,
    +        this->chunks[3] <= mask
    +      ).to_bitmask();
    +    }
    +  }; // struct simd8x64
    +
    +} // namespace simd
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_SIMD_INPUT_H
    +/* end file simdjson/westmere/simd.h */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +
    +using namespace simd;
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 32;
    +  simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; }
    +  simdjson_inline bool has_backslash() { return bs_bits != 0; }
    +  simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); }
    +  simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); }
    +
    +  uint32_t bs_bits;
    +  uint32_t quote_bits;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // this can read up to 31 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes");
    +  simd8 v0(src);
    +  simd8 v1(src + 16);
    +  v0.store(dst);
    +  v1.store(dst + 16);
    +  uint64_t bs_and_quote = simd8x64(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask();
    +  return {
    +    uint32_t(bs_and_quote),      // bs_bits
    +    uint32_t(bs_and_quote >> 32) // quote_bits
    +  };
    +}
    +
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_STRINGPARSING_DEFS_H
    +/* end file simdjson/westmere/stringparsing_defs.h */
    +/* end file simdjson/westmere/begin.h */
    +/* including simdjson/generic/amalgamated.h for westmere: #include "simdjson/generic/amalgamated.h" */
    +/* begin file simdjson/generic/amalgamated.h for westmere */
    +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_DEPENDENCIES_H)
    +#error simdjson/generic/dependencies.h must be included before simdjson/generic/amalgamated.h!
    +#endif
    +
    +/* including simdjson/generic/base.h for westmere: #include "simdjson/generic/base.h" */
    +/* begin file simdjson/generic/base.h for westmere */
    +#ifndef SIMDJSON_GENERIC_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): // If we haven't got an implementation yet, we're in the editor, editing a generic file! Just */
    +/* amalgamation skipped (editor-only): // use the most advanced one we can so the most possible stuff can be tested. */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation_detection.h" */
    +/* amalgamation skipped (editor-only): #if SIMDJSON_IMPLEMENTATION_ICELAKE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_HASWELL */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_WESTMERE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_ARM64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_PPC64 */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/begin.h" */
    +/* amalgamation skipped (editor-only): #elif SIMDJSON_IMPLEMENTATION_FALLBACK */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/begin.h" */
    +/* amalgamation skipped (editor-only): #else */
    +/* amalgamation skipped (editor-only): #error "All possible implementations (including fallback) have been disabled! simdjson will not run." */
    +/* amalgamation skipped (editor-only): #endif */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_IMPLEMENTATION */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +
    +struct open_container;
    +class dom_parser_implementation;
    +
    +/**
    + * The type of a JSON number
    + */
    +enum class number_type {
    +    floating_point_number=1, /// a binary64 number
    +    signed_integer,          /// a signed integer that fits in a 64-bit word using two's complement
    +    unsigned_integer         /// a positive integer larger or equal to 1<<63
    +};
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_BASE_H
    +/* end file simdjson/generic/base.h for westmere */
    +/* including simdjson/generic/jsoncharutils.h for westmere: #include "simdjson/generic/jsoncharutils.h" */
    +/* begin file simdjson/generic/jsoncharutils.h for westmere */
    +#ifndef SIMDJSON_GENERIC_JSONCHARUTILS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_JSONCHARUTILS_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/jsoncharutils_tables.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace jsoncharutils {
    +
    +// return non-zero if not a structural or whitespace char
    +// zero otherwise
    +simdjson_inline uint32_t is_not_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace_negated[c];
    +}
    +
    +simdjson_inline uint32_t is_structural_or_whitespace(uint8_t c) {
    +  return internal::structural_or_whitespace[c];
    +}
    +
    +// returns a value with the high 16 bits set if not valid
    +// otherwise returns the conversion of the 4 hex digits at src into the bottom
    +// 16 bits of the 32-bit return register
    +//
    +// see
    +// https://lemire.me/blog/2019/04/17/parsing-short-hexadecimal-strings-efficiently/
    +static inline uint32_t hex_to_u32_nocheck(
    +    const uint8_t *src) { // strictly speaking, static inline is a C-ism
    +  uint32_t v1 = internal::digit_to_val32[630 + src[0]];
    +  uint32_t v2 = internal::digit_to_val32[420 + src[1]];
    +  uint32_t v3 = internal::digit_to_val32[210 + src[2]];
    +  uint32_t v4 = internal::digit_to_val32[0 + src[3]];
    +  return v1 | v2 | v3 | v4;
    +}
    +
    +// given a code point cp, writes to c
    +// the utf-8 code, outputting the length in
    +// bytes, if the length is zero, the code point
    +// is invalid
    +//
    +// This can possibly be made faster using pdep
    +// and clz and table lookups, but JSON documents
    +// have few escaped code points, and the following
    +// function looks cheap.
    +//
    +// Note: we assume that surrogates are treated separately
    +//
    +simdjson_inline size_t codepoint_to_utf8(uint32_t cp, uint8_t *c) {
    +  if (cp <= 0x7F) {
    +    c[0] = uint8_t(cp);
    +    return 1; // ascii
    +  }
    +  if (cp <= 0x7FF) {
    +    c[0] = uint8_t((cp >> 6) + 192);
    +    c[1] = uint8_t((cp & 63) + 128);
    +    return 2; // universal plane
    +    //  Surrogates are treated elsewhere...
    +    //} //else if (0xd800 <= cp && cp <= 0xdfff) {
    +    //  return 0; // surrogates // could put assert here
    +  } else if (cp <= 0xFFFF) {
    +    c[0] = uint8_t((cp >> 12) + 224);
    +    c[1] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[2] = uint8_t((cp & 63) + 128);
    +    return 3;
    +  } else if (cp <= 0x10FFFF) { // if you know you have a valid code point, this
    +                               // is not needed
    +    c[0] = uint8_t((cp >> 18) + 240);
    +    c[1] = uint8_t(((cp >> 12) & 63) + 128);
    +    c[2] = uint8_t(((cp >> 6) & 63) + 128);
    +    c[3] = uint8_t((cp & 63) + 128);
    +    return 4;
    +  }
    +  // will return 0 when the code point was too large.
    +  return 0; // bad r
    +}
    +
    +#if SIMDJSON_IS_32BITS // _umul128 for x86, arm
    +// this is a slow emulation routine for 32-bit
    +//
    +static simdjson_inline uint64_t __emulu(uint32_t x, uint32_t y) {
    +  return x * (uint64_t)y;
    +}
    +static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) {
    +  uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd);
    +  uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd);
    +  uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32));
    +  uint64_t adbc_carry = !!(adbc < ad);
    +  uint64_t lo = bd + (adbc << 32);
    +  *hi = __emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) +
    +        (adbc_carry << 32) + !!(lo < bd);
    +  return lo;
    +}
    +#endif
    +
    +} // namespace jsoncharutils
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_JSONCHARUTILS_H
    +/* end file simdjson/generic/jsoncharutils.h for westmere */
    +/* including simdjson/generic/atomparsing.h for westmere: #include "simdjson/generic/atomparsing.h" */
    +/* begin file simdjson/generic/atomparsing.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ATOMPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ATOMPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +/// @private
    +namespace atomparsing {
    +
    +// The string_to_uint32 is exclusively used to map literal strings to 32-bit values.
    +// We use memcpy instead of a pointer cast to avoid undefined behaviors since we cannot
    +// be certain that the character pointer will be properly aligned.
    +// You might think that using memcpy makes this function expensive, but you'd be wrong.
    +// All decent optimizing compilers (GCC, clang, Visual Studio) will compile string_to_uint32("false");
    +// to the compile-time constant 1936482662.
    +simdjson_inline uint32_t string_to_uint32(const char* str) { uint32_t val; std::memcpy(&val, str, sizeof(uint32_t)); return val; }
    +
    +
    +// Again in str4ncmp we use a memcpy to avoid undefined behavior. The memcpy may appear expensive.
    +// Yet all decent optimizing compilers will compile memcpy to a single instruction, just about.
    +simdjson_warn_unused
    +simdjson_inline uint32_t str4ncmp(const uint8_t *src, const char* atom) {
    +  uint32_t srcval; // we want to avoid unaligned 32-bit loads (undefined in C/C++)
    +  static_assert(sizeof(uint32_t) <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be larger than 4 bytes");
    +  std::memcpy(&srcval, src, sizeof(uint32_t));
    +  return srcval ^ string_to_uint32(atom);
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "true") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_true_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_true_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "true"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src) {
    +  return (str4ncmp(src+1, "alse") | jsoncharutils::is_not_structural_or_whitespace(src[5])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_false_atom(const uint8_t *src, size_t len) {
    +  if (len > 5) { return is_valid_false_atom(src); }
    +  else if (len == 5) { return !str4ncmp(src+1, "alse"); }
    +  else { return false; }
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src) {
    +  return (str4ncmp(src, "null") | jsoncharutils::is_not_structural_or_whitespace(src[4])) == 0;
    +}
    +
    +simdjson_warn_unused
    +simdjson_inline bool is_valid_null_atom(const uint8_t *src, size_t len) {
    +  if (len > 4) { return is_valid_null_atom(src); }
    +  else if (len == 4) { return !str4ncmp(src, "null"); }
    +  else { return false; }
    +}
    +
    +} // namespace atomparsing
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ATOMPARSING_H
    +/* end file simdjson/generic/atomparsing.h for westmere */
    +/* including simdjson/generic/dom_parser_implementation.h for westmere: #include "simdjson/generic/dom_parser_implementation.h" */
    +/* begin file simdjson/generic/dom_parser_implementation.h for westmere */
    +#ifndef SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +
    +// expectation: sizeof(open_container) = 64/8.
    +struct open_container {
    +  uint32_t tape_index; // where, on the tape, does the scope ([,{) begins
    +  uint32_t count; // how many elements in the scope
    +}; // struct open_container
    +
    +static_assert(sizeof(open_container) == 64/8, "Open container must be 64 bits");
    +
    +class dom_parser_implementation final : public internal::dom_parser_implementation {
    +public:
    +  /** Tape location of each open { or [ */
    +  std::unique_ptr open_containers{};
    +  /** Whether each open container is a [ or { */
    +  std::unique_ptr is_array{};
    +  /** Buffer passed to stage 1 */
    +  const uint8_t *buf{};
    +  /** Length passed to stage 1 */
    +  size_t len{0};
    +  /** Document passed to stage 2 */
    +  dom::document *doc{};
    +
    +  inline dom_parser_implementation() noexcept;
    +  inline dom_parser_implementation(dom_parser_implementation &&other) noexcept;
    +  inline dom_parser_implementation &operator=(dom_parser_implementation &&other) noexcept;
    +  dom_parser_implementation(const dom_parser_implementation &) = delete;
    +  dom_parser_implementation &operator=(const dom_parser_implementation &) = delete;
    +
    +  simdjson_warn_unused error_code parse(const uint8_t *buf, size_t len, dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage1(const uint8_t *buf, size_t len, stage1_mode partial) noexcept final;
    +  simdjson_warn_unused error_code stage2(dom::document &doc) noexcept final;
    +  simdjson_warn_unused error_code stage2_next(dom::document &doc) noexcept final;
    +  simdjson_warn_unused uint8_t *parse_string(const uint8_t *src, uint8_t *dst, bool allow_replacement) const noexcept final;
    +  simdjson_warn_unused uint8_t *parse_wobbly_string(const uint8_t *src, uint8_t *dst) const noexcept final;
    +  inline simdjson_warn_unused error_code set_capacity(size_t capacity) noexcept final;
    +  inline simdjson_warn_unused error_code set_max_depth(size_t max_depth) noexcept final;
    +private:
    +  simdjson_inline simdjson_warn_unused error_code set_capacity_stage1(size_t capacity);
    +
    +};
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +namespace westmere {
    +
    +inline dom_parser_implementation::dom_parser_implementation() noexcept = default;
    +inline dom_parser_implementation::dom_parser_implementation(dom_parser_implementation &&other) noexcept = default;
    +inline dom_parser_implementation &dom_parser_implementation::operator=(dom_parser_implementation &&other) noexcept = default;
    +
    +// Leaving these here so they can be inlined if so desired
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_capacity(size_t capacity) noexcept {
    +  if(capacity > SIMDJSON_MAXSIZE_BYTES) { return CAPACITY; }
    +  // Stage 1 index output
    +  size_t max_structures = SIMDJSON_ROUNDUP_N(capacity, 64) + 2 + 7;
    +  structural_indexes.reset( new (std::nothrow) uint32_t[max_structures] );
    +  if (!structural_indexes) { _capacity = 0; return MEMALLOC; }
    +  structural_indexes[0] = 0;
    +  n_structural_indexes = 0;
    +
    +  _capacity = capacity;
    +  return SUCCESS;
    +}
    +
    +inline simdjson_warn_unused error_code dom_parser_implementation::set_max_depth(size_t max_depth) noexcept {
    +  // Stage 2 stacks
    +  open_containers.reset(new (std::nothrow) open_container[max_depth]);
    +  is_array.reset(new (std::nothrow) bool[max_depth]);
    +  if (!is_array || !open_containers) { _max_depth = 0; return MEMALLOC; }
    +
    +  _max_depth = max_depth;
    +  return SUCCESS;
    +}
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_DOM_PARSER_IMPLEMENTATION_H
    +/* end file simdjson/generic/dom_parser_implementation.h for westmere */
    +/* including simdjson/generic/implementation_simdjson_result_base.h for westmere: #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base.h for westmere */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +
    +// This is a near copy of include/error.h's implementation_simdjson_result_base, except it doesn't use std::pair
    +// so we can avoid inlining errors
    +// TODO reconcile these!
    +/**
    + * The result of a simdjson operation that could fail.
    + *
    + * Gives the option of reading error codes, or throwing an exception by casting to the desired result.
    + *
    + * This is a base class for implementations that want to add functions to the result type for
    + * chaining.
    + *
    + * Override like:
    + *
    + *   struct simdjson_result : public internal::implementation_simdjson_result_base {
    + *     simdjson_result() noexcept : internal::implementation_simdjson_result_base() {}
    + *     simdjson_result(error_code error) noexcept : internal::implementation_simdjson_result_base(error) {}
    + *     simdjson_result(T &&value) noexcept : internal::implementation_simdjson_result_base(std::forward(value)) {}
    + *     simdjson_result(T &&value, error_code error) noexcept : internal::implementation_simdjson_result_base(value, error) {}
    + *     // Your extra methods here
    + *   }
    + *
    + * Then any method returning simdjson_result will be chainable with your methods.
    + */
    +template
    +struct implementation_simdjson_result_base {
    +
    +  /**
    +   * Create a new empty result with error = UNINITIALIZED.
    +   */
    +  simdjson_inline implementation_simdjson_result_base() noexcept = default;
    +
    +  /**
    +   * Create a new error result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(error_code error) noexcept;
    +
    +  /**
    +   * Create a new successful result.
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value) noexcept;
    +
    +  /**
    +   * Create a new result with both things (use if you don't want to branch when creating the result).
    +   */
    +  simdjson_inline implementation_simdjson_result_base(T &&value, error_code error) noexcept;
    +
    +  /**
    +   * Move the value and the error to the provided variables.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   * @param error The variable to assign the error to. Set to SUCCESS if there is no error.
    +   */
    +  simdjson_inline void tie(T &value, error_code &error) && noexcept;
    +
    +  /**
    +   * Move the value to the provided variable.
    +   *
    +   * @param value The variable to assign the value to. May not be set if there is an error.
    +   */
    +  simdjson_inline error_code get(T &value) && noexcept;
    +
    +  /**
    +   * The error.
    +   */
    +  simdjson_inline error_code error() const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value.
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T& value() & noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& value() && noexcept(false);
    +
    +  /**
    +   * Take the result value (move it).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline T&& take_value() && noexcept(false);
    +
    +  /**
    +   * Cast to the value (will throw on error).
    +   *
    +   * @throw simdjson_error if there was an error.
    +   */
    +  simdjson_inline operator T&&() && noexcept(false);
    +
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline const T& value_unsafe() const& noexcept;
    +  /**
    +   * Get the result value. This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T& value_unsafe() & noexcept;
    +  /**
    +   * Take the result value (move it). This function is safe if and only
    +   * the error() method returns a value that evaluates to false.
    +   */
    +  simdjson_inline T&& value_unsafe() && noexcept;
    +protected:
    +  /** users should never directly access first and second. **/
    +  T first{}; /** Users should never directly access 'first'. **/
    +  error_code second{UNINITIALIZED}; /** Users should never directly access 'second'. **/
    +}; // struct implementation_simdjson_result_base
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_H
    +/* end file simdjson/generic/implementation_simdjson_result_base.h for westmere */
    +/* including simdjson/generic/numberparsing.h for westmere: #include "simdjson/generic/numberparsing.h" */
    +/* begin file simdjson/generic/numberparsing.h for westmere */
    +#ifndef SIMDJSON_GENERIC_NUMBERPARSING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_NUMBERPARSING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/jsoncharutils.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace numberparsing {
    +
    +#ifdef JSON_TEST_NUMBERS
    +#define INVALID_NUMBER(SRC) (found_invalid_number((SRC)), NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (found_integer((VALUE), (SRC)), (WRITER).append_s64((VALUE)))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (found_unsigned_integer((VALUE), (SRC)), (WRITER).append_u64((VALUE)))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (found_float((VALUE), (SRC)), (WRITER).append_double((VALUE)))
    +#else
    +#define INVALID_NUMBER(SRC) (NUMBER_ERROR)
    +#define WRITE_INTEGER(VALUE, SRC, WRITER) (WRITER).append_s64((VALUE))
    +#define WRITE_UNSIGNED(VALUE, SRC, WRITER) (WRITER).append_u64((VALUE))
    +#define WRITE_DOUBLE(VALUE, SRC, WRITER) (WRITER).append_double((VALUE))
    +#endif
    +
    +namespace {
    +
    +// Convert a mantissa, an exponent and a sign bit into an ieee64 double.
    +// The real_exponent needs to be in [0, 2046] (technically real_exponent = 2047 would be acceptable).
    +// The mantissa should be in [0,1<<53). The bit at index (1ULL << 52) while be zeroed.
    +simdjson_inline double to_double(uint64_t mantissa, uint64_t real_exponent, bool negative) {
    +    double d;
    +    mantissa &= ~(1ULL << 52);
    +    mantissa |= real_exponent << 52;
    +    mantissa |= ((static_cast(negative)) << 63);
    +    std::memcpy(&d, &mantissa, sizeof(d));
    +    return d;
    +}
    +
    +// Attempts to compute i * 10^(power) exactly; and if "negative" is
    +// true, negate the result.
    +// This function will only work in some cases, when it does not work, success is
    +// set to false. This should work *most of the time* (like 99% of the time).
    +// We assume that power is in the [smallest_power,
    +// largest_power] interval: the caller is responsible for this check.
    +simdjson_inline bool compute_float_64(int64_t power, uint64_t i, bool negative, double &d) {
    +  // we start with a fast path
    +  // It was described in
    +  // Clinger WD. How to read floating point numbers accurately.
    +  // ACM SIGPLAN Notices. 1990
    +#ifndef FLT_EVAL_METHOD
    +#error "FLT_EVAL_METHOD should be defined, please include cfloat."
    +#endif
    +#if (FLT_EVAL_METHOD != 1) && (FLT_EVAL_METHOD != 0)
    +  // We cannot be certain that x/y is rounded to nearest.
    +  if (0 <= power && power <= 22 && i <= 9007199254740991)
    +#else
    +  if (-22 <= power && power <= 22 && i <= 9007199254740991)
    +#endif
    +  {
    +    // convert the integer into a double. This is lossless since
    +    // 0 <= i <= 2^53 - 1.
    +    d = double(i);
    +    //
    +    // The general idea is as follows.
    +    // If 0 <= s < 2^53 and if 10^0 <= p <= 10^22 then
    +    // 1) Both s and p can be represented exactly as 64-bit floating-point
    +    // values
    +    // (binary64).
    +    // 2) Because s and p can be represented exactly as floating-point values,
    +    // then s * p
    +    // and s / p will produce correctly rounded values.
    +    //
    +    if (power < 0) {
    +      d = d / simdjson::internal::power_of_ten[-power];
    +    } else {
    +      d = d * simdjson::internal::power_of_ten[power];
    +    }
    +    if (negative) {
    +      d = -d;
    +    }
    +    return true;
    +  }
    +  // When 22 < power && power <  22 + 16, we could
    +  // hope for another, secondary fast path.  It was
    +  // described by David M. Gay in  "Correctly rounded
    +  // binary-decimal and decimal-binary conversions." (1990)
    +  // If you need to compute i * 10^(22 + x) for x < 16,
    +  // first compute i * 10^x, if you know that result is exact
    +  // (e.g., when i * 10^x < 2^53),
    +  // then you can still proceed and do (i * 10^x) * 10^22.
    +  // Is this worth your time?
    +  // You need  22 < power *and* power <  22 + 16 *and* (i * 10^(x-22) < 2^53)
    +  // for this second fast path to work.
    +  // If you you have 22 < power *and* power <  22 + 16, and then you
    +  // optimistically compute "i * 10^(x-22)", there is still a chance that you
    +  // have wasted your time if i * 10^(x-22) >= 2^53. It makes the use cases of
    +  // this optimization maybe less common than we would like. Source:
    +  // http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/
    +  // also used in RapidJSON: https://rapidjson.org/strtod_8h_source.html
    +
    +  // The fast path has now failed, so we are failing back on the slower path.
    +
    +  // In the slow path, we need to adjust i so that it is > 1<<63 which is always
    +  // possible, except if i == 0, so we handle i == 0 separately.
    +  if(i == 0) {
    +    d = negative ? -0.0 : 0.0;
    +    return true;
    +  }
    +
    +
    +  // The exponent is 1024 + 63 + power
    +  //     + floor(log(5**power)/log(2)).
    +  // The 1024 comes from the ieee64 standard.
    +  // The 63 comes from the fact that we use a 64-bit word.
    +  //
    +  // Computing floor(log(5**power)/log(2)) could be
    +  // slow. Instead we use a fast function.
    +  //
    +  // For power in (-400,350), we have that
    +  // (((152170 + 65536) * power ) >> 16);
    +  // is equal to
    +  //  floor(log(5**power)/log(2)) + power when power >= 0
    +  // and it is equal to
    +  //  ceil(log(5**-power)/log(2)) + power when power < 0
    +  //
    +  // The 65536 is (1<<16) and corresponds to
    +  // (65536 * power) >> 16 ---> power
    +  //
    +  // ((152170 * power ) >> 16) is equal to
    +  // floor(log(5**power)/log(2))
    +  //
    +  // Note that this is not magic: 152170/(1<<16) is
    +  // approximatively equal to log(5)/log(2).
    +  // The 1<<16 value is a power of two; we could use a
    +  // larger power of 2 if we wanted to.
    +  //
    +  int64_t exponent = (((152170 + 65536) * power) >> 16) + 1024 + 63;
    +
    +
    +  // We want the most significant bit of i to be 1. Shift if needed.
    +  int lz = leading_zeroes(i);
    +  i <<= lz;
    +
    +
    +  // We are going to need to do some 64-bit arithmetic to get a precise product.
    +  // We use a table lookup approach.
    +  // It is safe because
    +  // power >= smallest_power
    +  // and power <= largest_power
    +  // We recover the mantissa of the power, it has a leading 1. It is always
    +  // rounded down.
    +  //
    +  // We want the most significant 64 bits of the product. We know
    +  // this will be non-zero because the most significant bit of i is
    +  // 1.
    +  const uint32_t index = 2 * uint32_t(power - simdjson::internal::smallest_power);
    +  // Optimization: It may be that materializing the index as a variable might confuse some compilers and prevent effective complex-addressing loads. (Done for code clarity.)
    +  //
    +  // The full_multiplication function computes the 128-bit product of two 64-bit words
    +  // with a returned value of type value128 with a "low component" corresponding to the
    +  // 64-bit least significant bits of the product and with a "high component" corresponding
    +  // to the 64-bit most significant bits of the product.
    +  simdjson::internal::value128 firstproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index]);
    +  // Both i and power_of_five_128[index] have their most significant bit set to 1 which
    +  // implies that the either the most or the second most significant bit of the product
    +  // is 1. We pack values in this manner for efficiency reasons: it maximizes the use
    +  // we make of the product. It also makes it easy to reason about the product: there
    +  // is 0 or 1 leading zero in the product.
    +
    +  // Unless the least significant 9 bits of the high (64-bit) part of the full
    +  // product are all 1s, then we know that the most significant 55 bits are
    +  // exact and no further work is needed. Having 55 bits is necessary because
    +  // we need 53 bits for the mantissa but we have to have one rounding bit and
    +  // we can waste a bit if the most significant bit of the product is zero.
    +  if((firstproduct.high & 0x1FF) == 0x1FF) {
    +    // We want to compute i * 5^q, but only care about the top 55 bits at most.
    +    // Consider the scenario where q>=0. Then 5^q may not fit in 64-bits. Doing
    +    // the full computation is wasteful. So we do what is called a "truncated
    +    // multiplication".
    +    // We take the most significant 64-bits, and we put them in
    +    // power_of_five_128[index]. Usually, that's good enough to approximate i * 5^q
    +    // to the desired approximation using one multiplication. Sometimes it does not suffice.
    +    // Then we store the next most significant 64 bits in power_of_five_128[index + 1], and
    +    // then we get a better approximation to i * 5^q.
    +    //
    +    // That's for when q>=0. The logic for q<0 is somewhat similar but it is somewhat
    +    // more complicated.
    +    //
    +    // There is an extra layer of complexity in that we need more than 55 bits of
    +    // accuracy in the round-to-even scenario.
    +    //
    +    // The full_multiplication function computes the 128-bit product of two 64-bit words
    +    // with a returned value of type value128 with a "low component" corresponding to the
    +    // 64-bit least significant bits of the product and with a "high component" corresponding
    +    // to the 64-bit most significant bits of the product.
    +    simdjson::internal::value128 secondproduct = full_multiplication(i, simdjson::internal::power_of_five_128[index + 1]);
    +    firstproduct.low += secondproduct.high;
    +    if(secondproduct.high > firstproduct.low) { firstproduct.high++; }
    +    // As it has been proven by Noble Mushtak and Daniel Lemire in "Fast Number Parsing Without
    +    // Fallback" (https://arxiv.org/abs/2212.06644), at this point we are sure that the product
    +    // is sufficiently accurate, and more computation is not needed.
    +  }
    +  uint64_t lower = firstproduct.low;
    +  uint64_t upper = firstproduct.high;
    +  // The final mantissa should be 53 bits with a leading 1.
    +  // We shift it so that it occupies 54 bits with a leading 1.
    +  ///////
    +  uint64_t upperbit = upper >> 63;
    +  uint64_t mantissa = upper >> (upperbit + 9);
    +  lz += int(1 ^ upperbit);
    +
    +  // Here we have mantissa < (1<<54).
    +  int64_t real_exponent = exponent - lz;
    +  if (simdjson_unlikely(real_exponent <= 0)) { // we have a subnormal?
    +    // Here have that real_exponent <= 0 so -real_exponent >= 0
    +    if(-real_exponent + 1 >= 64) { // if we have more than 64 bits below the minimum exponent, you have a zero for sure.
    +      d = negative ? -0.0 : 0.0;
    +      return true;
    +    }
    +    // next line is safe because -real_exponent + 1 < 0
    +    mantissa >>= -real_exponent + 1;
    +    // Thankfully, we can't have both "round-to-even" and subnormals because
    +    // "round-to-even" only occurs for powers close to 0.
    +    mantissa += (mantissa & 1); // round up
    +    mantissa >>= 1;
    +    // There is a weird scenario where we don't have a subnormal but just.
    +    // Suppose we start with 2.2250738585072013e-308, we end up
    +    // with 0x3fffffffffffff x 2^-1023-53 which is technically subnormal
    +    // whereas 0x40000000000000 x 2^-1023-53  is normal. Now, we need to round
    +    // up 0x3fffffffffffff x 2^-1023-53  and once we do, we are no longer
    +    // subnormal, but we can only know this after rounding.
    +    // So we only declare a subnormal if we are smaller than the threshold.
    +    real_exponent = (mantissa < (uint64_t(1) << 52)) ? 0 : 1;
    +    d = to_double(mantissa, real_exponent, negative);
    +    return true;
    +  }
    +  // We have to round to even. The "to even" part
    +  // is only a problem when we are right in between two floats
    +  // which we guard against.
    +  // If we have lots of trailing zeros, we may fall right between two
    +  // floating-point values.
    +  //
    +  // The round-to-even cases take the form of a number 2m+1 which is in (2^53,2^54]
    +  // times a power of two. That is, it is right between a number with binary significand
    +  // m and another number with binary significand m+1; and it must be the case
    +  // that it cannot be represented by a float itself.
    +  //
    +  // We must have that w * 10 ^q == (2m+1) * 2^p for some power of two 2^p.
    +  // Recall that 10^q = 5^q * 2^q.
    +  // When q >= 0, we must have that (2m+1) is divible by 5^q, so 5^q <= 2^54. We have that
    +  //  5^23 <=  2^54 and it is the last power of five to qualify, so q <= 23.
    +  // When q<0, we have  w  >=  (2m+1) x 5^{-q}.  We must have that w<2^{64} so
    +  // (2m+1) x 5^{-q} < 2^{64}. We have that 2m+1>2^{53}. Hence, we must have
    +  // 2^{53} x 5^{-q} < 2^{64}.
    +  // Hence we have 5^{-q} < 2^{11}$ or q>= -4.
    +  //
    +  // We require lower <= 1 and not lower == 0 because we could not prove that
    +  // that lower == 0 is implied; but we could prove that lower <= 1 is a necessary and sufficient test.
    +  if (simdjson_unlikely((lower <= 1) && (power >= -4) && (power <= 23) && ((mantissa & 3) == 1))) {
    +    if((mantissa  << (upperbit + 64 - 53 - 2)) ==  upper) {
    +      mantissa &= ~1;             // flip it so that we do not round up
    +    }
    +  }
    +
    +  mantissa += mantissa & 1;
    +  mantissa >>= 1;
    +
    +  // Here we have mantissa < (1<<53), unless there was an overflow
    +  if (mantissa >= (1ULL << 53)) {
    +    //////////
    +    // This will happen when parsing values such as 7.2057594037927933e+16
    +    ////////
    +    mantissa = (1ULL << 52);
    +    real_exponent++;
    +  }
    +  mantissa &= ~(1ULL << 52);
    +  // we have to check that real_exponent is in range, otherwise we bail out
    +  if (simdjson_unlikely(real_exponent > 2046)) {
    +    // We have an infinite value!!! We could actually throw an error here if we could.
    +    return false;
    +  }
    +  d = to_double(mantissa, real_exponent, negative);
    +  return true;
    +}
    +
    +// We call a fallback floating-point parser that might be slow. Note
    +// it will accept JSON numbers, but the JSON spec. is more restrictive so
    +// before you call parse_float_fallback, you need to have validated the input
    +// string with the JSON grammar.
    +// It will return an error (false) if the parsed number is infinite.
    +// The string parsing itself always succeeds. We know that there is at least
    +// one digit.
    +static bool parse_float_fallback(const uint8_t *ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +static bool parse_float_fallback(const uint8_t *ptr, const uint8_t *end_ptr, double *outDouble) {
    +  *outDouble = simdjson::internal::from_chars(reinterpret_cast(ptr), reinterpret_cast(end_ptr));
    +  // We do not accept infinite values.
    +
    +  // Detecting finite values in a portable manner is ridiculously hard, ideally
    +  // we would want to do:
    +  // return !std::isfinite(*outDouble);
    +  // but that mysteriously fails under legacy/old libc++ libraries, see
    +  // https://github.com/simdjson/simdjson/issues/1286
    +  //
    +  // Therefore, fall back to this solution (the extra parens are there
    +  // to handle that max may be a macro on windows).
    +  return !(*outDouble > (std::numeric_limits::max)() || *outDouble < std::numeric_limits::lowest());
    +}
    +
    +// check quickly whether the next 8 chars are made of digits
    +// at a glance, it looks better than Mula's
    +// http://0x80.pl/articles/swar-digits-validate.html
    +simdjson_inline bool is_made_of_eight_digits_fast(const uint8_t *chars) {
    +  uint64_t val;
    +  // this can read up to 7 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(7 <= SIMDJSON_PADDING, "SIMDJSON_PADDING must be bigger than 7");
    +  std::memcpy(&val, chars, 8);
    +  // a branchy method might be faster:
    +  // return (( val & 0xF0F0F0F0F0F0F0F0 ) == 0x3030303030303030)
    +  //  && (( (val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0 ) ==
    +  //  0x3030303030303030);
    +  return (((val & 0xF0F0F0F0F0F0F0F0) |
    +           (((val + 0x0606060606060606) & 0xF0F0F0F0F0F0F0F0) >> 4)) ==
    +          0x3333333333333333);
    +}
    +
    +template
    +SIMDJSON_NO_SANITIZE_UNDEFINED // We deliberately allow overflow here and check later
    +simdjson_inline bool parse_digit(const uint8_t c, I &i) {
    +  const uint8_t digit = static_cast(c - '0');
    +  if (digit > 9) {
    +    return false;
    +  }
    +  // PERF NOTE: multiplication by 10 is cheaper than arbitrary integer multiplication
    +  i = 10 * i + digit; // might overflow, we will handle the overflow later
    +  return true;
    +}
    +
    +simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const uint8_t *const src, const uint8_t *&p, uint64_t &i, int64_t &exponent) {
    +  // we continue with the fiction that we have an integer. If the
    +  // floating point number is representable as x * 10^z for some integer
    +  // z that fits in 53 bits, then we will be able to convert back the
    +  // the integer into a float in a lossless manner.
    +  const uint8_t *const first_after_period = p;
    +
    +#ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +#if SIMDJSON_SWAR_NUMBER_PARSING
    +  // this helps if we have lots of decimals!
    +  // this turns out to be frequent enough.
    +  if (is_made_of_eight_digits_fast(p)) {
    +    i = i * 100000000 + parse_eight_digits_unrolled(p);
    +    p += 8;
    +  }
    +#endif // SIMDJSON_SWAR_NUMBER_PARSING
    +#endif // #ifdef SIMDJSON_SWAR_NUMBER_PARSING
    +  // Unrolling the first digit makes a small difference on some implementations (e.g. westmere)
    +  if (parse_digit(*p, i)) { ++p; }
    +  while (parse_digit(*p, i)) { p++; }
    +  exponent = first_after_period - p;
    +  // Decimal without digits (123.) is illegal
    +  if (exponent == 0) {
    +    return INVALID_NUMBER(src);
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) {
    +  // Exp Sign: -123.456e[-]78
    +  bool neg_exp = ('-' == *p);
    +  if (neg_exp || '+' == *p) { p++; } // Skip + as well
    +
    +  // Exponent: -123.456e-[78]
    +  auto start_exp = p;
    +  int64_t exp_number = 0;
    +  while (parse_digit(*p, exp_number)) { ++p; }
    +  // It is possible for parse_digit to overflow.
    +  // In particular, it could overflow to INT64_MIN, and we cannot do - INT64_MIN.
    +  // Thus we *must* check for possible overflow before we negate exp_number.
    +
    +  // Performance notes: it may seem like combining the two "simdjson_unlikely checks" below into
    +  // a single simdjson_unlikely path would be faster. The reasoning is sound, but the compiler may
    +  // not oblige and may, in fact, generate two distinct paths in any case. It might be
    +  // possible to do uint64_t(p - start_exp - 1) >= 18 but it could end up trading off
    +  // instructions for a simdjson_likely branch, an unconclusive gain.
    +
    +  // If there were no digits, it's an error.
    +  if (simdjson_unlikely(p == start_exp)) {
    +    return INVALID_NUMBER(src);
    +  }
    +  // We have a valid positive exponent in exp_number at this point, except that
    +  // it may have overflowed.
    +
    +  // If there were more than 18 digits, we may have overflowed the integer. We have to do
    +  // something!!!!
    +  if (simdjson_unlikely(p > start_exp+18)) {
    +    // Skip leading zeroes: 1e000000000000000000001 is technically valid and doesn't overflow
    +    while (*start_exp == '0') { start_exp++; }
    +    // 19 digits could overflow int64_t and is kind of absurd anyway. We don't
    +    // support exponents smaller than -999,999,999,999,999,999 and bigger
    +    // than 999,999,999,999,999,999.
    +    // We can truncate.
    +    // Note that 999999999999999999 is assuredly too large. The maximal ieee64 value before
    +    // infinity is ~1.8e308. The smallest subnormal is ~5e-324. So, actually, we could
    +    // truncate at 324.
    +    // Note that there is no reason to fail per se at this point in time.
    +    // E.g., 0e999999999999999999999 is a fine number.
    +    if (p > start_exp+18) { exp_number = 999999999999999999; }
    +  }
    +  // At this point, we know that exp_number is a sane, positive, signed integer.
    +  // It is <= 999,999,999,999,999,999. As long as 'exponent' is in
    +  // [-8223372036854775808, 8223372036854775808], we won't overflow. Because 'exponent'
    +  // is bounded in magnitude by the size of the JSON input, we are fine in this universe.
    +  // To sum it up: the next line should never overflow.
    +  exponent += (neg_exp ? -exp_number : exp_number);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline size_t significant_digits(const uint8_t * start_digits, size_t digit_count) {
    +  // It is possible that the integer had an overflow.
    +  // We have to handle the case where we have 0.0000somenumber.
    +  const uint8_t *start = start_digits;
    +  while ((*start == '0') || (*start == '.')) { ++start; }
    +  // we over-decrement by one when there is a '.'
    +  return digit_count - size_t(start - start_digits);
    +}
    +
    +} // unnamed namespace
    +
    +/** @private */
    +template
    +error_code slow_float_parsing(simdjson_unused const uint8_t * src, W writer) {
    +  double d;
    +  if (parse_float_fallback(src, &d)) {
    +    writer.append_double(d);
    +    return SUCCESS;
    +  }
    +  return INVALID_NUMBER(src);
    +}
    +
    +/** @private */
    +template
    +simdjson_inline error_code write_float(const uint8_t *const src, bool negative, uint64_t i, const uint8_t * start_digits, size_t digit_count, int64_t exponent, W &writer) {
    +  // If we frequently had to deal with long strings of digits,
    +  // we could extend our code by using a 128-bit integer instead
    +  // of a 64-bit integer. However, this is uncommon in practice.
    +  //
    +  // 9999999999999999999 < 2**64 so we can accommodate 19 digits.
    +  // If we have a decimal separator, then digit_count - 1 is the number of digits, but we
    +  // may not have a decimal separator!
    +  if (simdjson_unlikely(digit_count > 19 && significant_digits(start_digits, digit_count) > 19)) {
    +    // Ok, chances are good that we had an overflow!
    +    // this is almost never going to get called!!!
    +    // we start anew, going slowly!!!
    +    // This will happen in the following examples:
    +    // 10000000000000000000000000000000000000000000e+308
    +    // 3.1415926535897932384626433832795028841971693993751
    +    //
    +    // NOTE: This makes a *copy* of the writer and passes it to slow_float_parsing. This happens
    +    // because slow_float_parsing is a non-inlined function. If we passed our writer reference to
    +    // it, it would force it to be stored in memory, preventing the compiler from picking it apart
    +    // and putting into registers. i.e. if we pass it as reference, it gets slow.
    +    // This is what forces the skip_double, as well.
    +    error_code error = slow_float_parsing(src, writer);
    +    writer.skip_double();
    +    return error;
    +  }
    +  // NOTE: it's weird that the simdjson_unlikely() only wraps half the if, but it seems to get slower any other
    +  // way we've tried: https://github.com/simdjson/simdjson/pull/990#discussion_r448497331
    +  // To future reader: we'd love if someone found a better way, or at least could explain this result!
    +  if (simdjson_unlikely(exponent < simdjson::internal::smallest_power) || (exponent > simdjson::internal::largest_power)) {
    +    //
    +    // Important: smallest_power is such that it leads to a zero value.
    +    // Observe that 18446744073709551615e-343 == 0, i.e. (2**64 - 1) e -343 is zero
    +    // so something x 10^-343 goes to zero, but not so with  something x 10^-342.
    +    static_assert(simdjson::internal::smallest_power <= -342, "smallest_power is not small enough");
    +    //
    +    if((exponent < simdjson::internal::smallest_power) || (i == 0)) {
    +      // E.g. Parse "-0.0e-999" into the same value as "-0.0". See https://en.wikipedia.org/wiki/Signed_zero
    +      WRITE_DOUBLE(negative ? -0.0 : 0.0, src, writer);
    +      return SUCCESS;
    +    } else { // (exponent > largest_power) and (i != 0)
    +      // We have, for sure, an infinite value and simdjson refuses to parse infinite values.
    +      return INVALID_NUMBER(src);
    +    }
    +  }
    +  double d;
    +  if (!compute_float_64(exponent, i, negative, d)) {
    +    // we are almost never going to get here.
    +    if (!parse_float_fallback(src, &d)) { return INVALID_NUMBER(src); }
    +  }
    +  WRITE_DOUBLE(d, src, writer);
    +  return SUCCESS;
    +}
    +
    +// for performance analysis, it is sometimes  useful to skip parsing
    +#ifdef SIMDJSON_SKIPNUMBERPARSING
    +
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const, W &writer) {
    +  writer.append_s64(0);        // always write zero
    +  return SUCCESS;              // always succeeds
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * const src) noexcept { return 0; }
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept  { return false; }
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept { return number_type::signed_integer; }
    +#else
    +
    +// parse the number at src
    +// define JSON_TEST_NUMBERS for unit testing
    +//
    +// It is assumed that the number is followed by a structural ({,},],[) character
    +// or a white space character. If that is not the case (e.g., when the JSON
    +// document is made of a single number), then it is necessary to copy the
    +// content and append a space before calling this function.
    +//
    +// Our objective is accurate parsing (ULP of 0) at high speed.
    +template
    +simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) {
    +
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  if (digit_count == 0 || ('0' == *start_digits && digit_count > 1)) { return INVALID_NUMBER(src); }
    +
    +  //
    +  // Handle floats if there is a . or e (or both)
    +  //
    +  int64_t exponent = 0;
    +  bool is_float = false;
    +  if ('.' == *p) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_decimal_after_separator(src, p, i, exponent) );
    +    digit_count = int(p - start_digits); // used later to guard against overflows
    +  }
    +  if (('e' == *p) || ('E' == *p)) {
    +    is_float = true;
    +    ++p;
    +    SIMDJSON_TRY( parse_exponent(src, p, exponent) );
    +  }
    +  if (is_float) {
    +    const bool dirty_end = jsoncharutils::is_not_structural_or_whitespace(*p);
    +    SIMDJSON_TRY( write_float(src, negative, i, start_digits, digit_count, exponent, writer) );
    +    if (dirty_end) { return INVALID_NUMBER(src); }
    +    return SUCCESS;
    +  }
    +
    +  // The longest negative 64-bit number is 19 digits.
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  size_t longest_digit_count = negative ? 19 : 20;
    +  if (digit_count > longest_digit_count) { return INVALID_NUMBER(src); }
    +  if (digit_count == longest_digit_count) {
    +    if (negative) {
    +      // Anything negative above INT64_MAX+1 is invalid
    +      if (i > uint64_t(INT64_MAX)+1) { return INVALID_NUMBER(src);  }
    +      WRITE_INTEGER(~i+1, src, writer);
    +      if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +      return SUCCESS;
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    }  else if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INVALID_NUMBER(src); }
    +  }
    +
    +  // Write unsigned if it doesn't fit in a signed integer.
    +  if (i > uint64_t(INT64_MAX)) {
    +    WRITE_UNSIGNED(i, src, writer);
    +  } else {
    +    WRITE_INTEGER(negative ? (~i+1) : i, src, writer);
    +  }
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return INVALID_NUMBER(src); }
    +  return SUCCESS;
    +}
    +
    +// Inlineable functions
    +namespace {
    +
    +// This table can be used to characterize the final character of an integer
    +// string. For JSON structural character and allowable white space characters,
    +// we return SUCCESS. For 'e', '.' and 'E', we return INCORRECT_TYPE. Otherwise
    +// we return NUMBER_ERROR.
    +// Optimization note: we could easily reduce the size of the table by half (to 128)
    +// at the cost of an extra branch.
    +// Optimization note: we want the values to use at most 8 bits (not, e.g., 32 bits):
    +static_assert(error_code(uint8_t(NUMBER_ERROR))== NUMBER_ERROR, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(SUCCESS))== SUCCESS, "bad NUMBER_ERROR cast");
    +static_assert(error_code(uint8_t(INCORRECT_TYPE))== INCORRECT_TYPE, "bad NUMBER_ERROR cast");
    +
    +const uint8_t integer_string_finisher[256] = {
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   SUCCESS,      NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, SUCCESS,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, INCORRECT_TYPE,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, SUCCESS,        NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, INCORRECT_TYPE, NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, SUCCESS,      NUMBER_ERROR,
    +    SUCCESS,      NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR, NUMBER_ERROR,   NUMBER_ERROR, NUMBER_ERROR, NUMBER_ERROR,
    +    NUMBER_ERROR};
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  const uint8_t *p = src;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if ((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    if (src[0] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from 0 to 18,446,744,073,709,551,615
    +simdjson_unused simdjson_inline simdjson_result parse_unsigned_in_string(const uint8_t * const src) noexcept {
    +  const uint8_t *p = src + 1;
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // The longest positive 64-bit number is 20 digits.
    +  // We do it this way so we don't trigger this branch unless we must.
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > 20))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > 20)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  if (digit_count == 20) {
    +    // Positive overflow check:
    +    // - A 20 digit number starting with 2-9 is overflow, because 18,446,744,073,709,551,615 is the
    +    //   biggest uint64_t.
    +    // - A 20 digit number starting with 1 is overflow if it is less than INT64_MAX.
    +    //   If we got here, it's a 20 digit number starting with the digit "1".
    +    // - If a 20 digit number starting with 1 overflowed (i*10+digit), the result will be smaller
    +    //   than 1,553,255,926,290,448,384.
    +    // - That is smaller than the smallest possible 20-digit number the user could write:
    +    //   10,000,000,000,000,000,000.
    +    // - Therefore, if the number is positive and lower than that, it's overflow.
    +    // - The value we are looking at is less than or equal to INT64_MAX.
    +    //
    +    // Note: we use src[1] and not src[0] because src[0] is the quote character in this
    +    // instance.
    +    if (src[1] != uint8_t('1') || i <= uint64_t(INT64_MAX)) { return INCORRECT_TYPE; }
    +  }
    +
    +  return i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while (parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_integer(const uint8_t * const src, const uint8_t * const src_end) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  bool negative = (*src == '-');
    +  const uint8_t *p = src + uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = p;
    +  uint64_t i = 0;
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(p - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*p)) {
    +  //  return (*p == '.' || *p == 'e' || *p == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if((p != src_end) && integer_string_finisher[*p] != SUCCESS) { return error_code(integer_string_finisher[*p]); }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +// Parse any number from  -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +simdjson_unused simdjson_inline simdjson_result parse_integer_in_string(const uint8_t *src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  // PERF NOTE: we don't use is_made_of_eight_digits_fast because large integers like 123456789 are rare
    +  const uint8_t *const start_digits = src;
    +  uint64_t i = 0;
    +  while (parse_digit(*src, i)) { src++; }
    +
    +  // If there were no digits, or if the integer starts with 0 and has more than one digit, it's an error.
    +  // Optimization note: size_t is expected to be unsigned.
    +  size_t digit_count = size_t(src - start_digits);
    +  // We go from
    +  // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    +  // so we can never represent numbers that have more than 19 digits.
    +  size_t longest_digit_count = 19;
    +  // Optimization note: the compiler can probably merge
    +  // ((digit_count == 0) || (digit_count > longest_digit_count))
    +  // into a single  branch since digit_count is unsigned.
    +  if ((digit_count == 0) || (digit_count > longest_digit_count)) { return INCORRECT_TYPE; }
    +  // Here digit_count > 0.
    +  if (('0' == *start_digits) && (digit_count > 1)) { return NUMBER_ERROR; }
    +  // We can do the following...
    +  // if (!jsoncharutils::is_structural_or_whitespace(*src)) {
    +  //  return (*src == '.' || *src == 'e' || *src == 'E') ? INCORRECT_TYPE : NUMBER_ERROR;
    +  // }
    +  // as a single table lookup:
    +  if(*src != '"') { return NUMBER_ERROR; }
    +  // Negative numbers have can go down to - INT64_MAX - 1 whereas positive numbers are limited to INT64_MAX.
    +  // Performance note: This check is only needed when digit_count == longest_digit_count but it is
    +  // so cheap that we might as well always make it.
    +  if(i > uint64_t(INT64_MAX) + uint64_t(negative)) { return INCORRECT_TYPE; }
    +  return negative ? (~i+1) : i;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline bool is_negative(const uint8_t * src) noexcept {
    +  return (*src == '-');
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result is_integer(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) { return true; }
    +  return false;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result get_number_type(const uint8_t * src) noexcept {
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +  const uint8_t *p = src;
    +  while(static_cast(*p - '0') <= 9) { p++; }
    +  if ( p == src ) { return NUMBER_ERROR; }
    +  if (jsoncharutils::is_structural_or_whitespace(*p)) {
    +    // We have an integer.
    +    // If the number is negative and valid, it must be a signed integer.
    +    if(negative) { return number_type::signed_integer; }
    +    // We want values larger or equal to 9223372036854775808 to be unsigned
    +    // integers, and the other values to be signed integers.
    +    int digit_count = int(p - src);
    +    if(digit_count >= 19) {
    +      const uint8_t * smaller_big_integer = reinterpret_cast("9223372036854775808");
    +      if((digit_count >= 20) || (memcmp(src, smaller_big_integer, 19) >= 0)) {
    +        return number_type::unsigned_integer;
    +      }
    +    }
    +    return number_type::signed_integer;
    +  }
    +  // Hopefully, we have 'e' or 'E' or '.'.
    +  return number_type::floating_point_number;
    +}
    +
    +// Never read at src_end or beyond
    +simdjson_unused simdjson_inline simdjson_result parse_double(const uint8_t * src, const uint8_t * const src_end) noexcept {
    +  if(src == src_end) { return NUMBER_ERROR; }
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*src == '-');
    +  src += uint8_t(negative);
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  if(p == src_end) { return NUMBER_ERROR; }
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely((p != src_end) && (*p == '.'))) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if ((p == src_end) || !parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while ((p != src_end) && parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = start_digits-src > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if ((p != src_end) && (*p == 'e' || *p == 'E')) {
    +    p++;
    +    if(p == src_end) { return NUMBER_ERROR; }
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while ((p != src_end) && parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if ((p != src_end) && jsoncharutils::is_not_structural_or_whitespace(*p)) { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), src_end, &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +simdjson_unused simdjson_inline simdjson_result parse_double_in_string(const uint8_t * src) noexcept {
    +  //
    +  // Check for minus sign
    +  //
    +  bool negative = (*(src + 1) == '-');
    +  src += uint8_t(negative) + 1;
    +
    +  //
    +  // Parse the integer part.
    +  //
    +  uint64_t i = 0;
    +  const uint8_t *p = src;
    +  p += parse_digit(*p, i);
    +  bool leading_zero = (i == 0);
    +  while (parse_digit(*p, i)) { p++; }
    +  // no integer digits, or 0123 (zero must be solo)
    +  if ( p == src ) { return INCORRECT_TYPE; }
    +  if ( (leading_zero && p != src+1)) { return NUMBER_ERROR; }
    +
    +  //
    +  // Parse the decimal part.
    +  //
    +  int64_t exponent = 0;
    +  bool overflow;
    +  if (simdjson_likely(*p == '.')) {
    +    p++;
    +    const uint8_t *start_decimal_digits = p;
    +    if (!parse_digit(*p, i)) { return NUMBER_ERROR; } // no decimal digits
    +    p++;
    +    while (parse_digit(*p, i)) { p++; }
    +    exponent = -(p - start_decimal_digits);
    +
    +    // Overflow check. More than 19 digits (minus the decimal) may be overflow.
    +    overflow = p-src-1 > 19;
    +    if (simdjson_unlikely(overflow && leading_zero)) {
    +      // Skip leading 0.00000 and see if it still overflows
    +      const uint8_t *start_digits = src + 2;
    +      while (*start_digits == '0') { start_digits++; }
    +      overflow = p-start_digits > 19;
    +    }
    +  } else {
    +    overflow = p-src > 19;
    +  }
    +
    +  //
    +  // Parse the exponent
    +  //
    +  if (*p == 'e' || *p == 'E') {
    +    p++;
    +    bool exp_neg = *p == '-';
    +    p += exp_neg || *p == '+';
    +
    +    uint64_t exp = 0;
    +    const uint8_t *start_exp_digits = p;
    +    while (parse_digit(*p, exp)) { p++; }
    +    // no exp digits, or 20+ exp digits
    +    if (p-start_exp_digits == 0 || p-start_exp_digits > 19) { return NUMBER_ERROR; }
    +
    +    exponent += exp_neg ? 0-exp : exp;
    +  }
    +
    +  if (*p != '"') { return NUMBER_ERROR; }
    +
    +  overflow = overflow || exponent < simdjson::internal::smallest_power || exponent > simdjson::internal::largest_power;
    +
    +  //
    +  // Assemble (or slow-parse) the float
    +  //
    +  double d;
    +  if (simdjson_likely(!overflow)) {
    +    if (compute_float_64(exponent, i, negative, d)) { return d; }
    +  }
    +  if (!parse_float_fallback(src - uint8_t(negative), &d)) {
    +    return NUMBER_ERROR;
    +  }
    +  return d;
    +}
    +
    +} // unnamed namespace
    +#endif // SIMDJSON_SKIPNUMBERPARSING
    +
    +} // namespace numberparsing
    +
    +inline std::ostream& operator<<(std::ostream& out, number_type type) noexcept {
    +    switch (type) {
    +        case number_type::signed_integer: out << "integer in [-9223372036854775808,9223372036854775808)"; break;
    +        case number_type::unsigned_integer: out << "unsigned integer in [9223372036854775808,18446744073709551616)"; break;
    +        case number_type::floating_point_number: out << "floating-point number (binary64)"; break;
    +        default: SIMDJSON_UNREACHABLE();
    +    }
    +    return out;
    +}
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_NUMBERPARSING_H
    +/* end file simdjson/generic/numberparsing.h for westmere */
    +
    +/* including simdjson/generic/implementation_simdjson_result_base-inl.h for westmere: #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* begin file simdjson/generic/implementation_simdjson_result_base-inl.h for westmere */
    +#ifndef SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +
    +//
    +// internal::implementation_simdjson_result_base inline implementation
    +//
    +
    +template
    +simdjson_inline void implementation_simdjson_result_base::tie(T &value, error_code &error) && noexcept {
    +  error = this->second;
    +  if (!error) {
    +    value = std::forward>(*this).first;
    +  }
    +}
    +
    +template
    +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::get(T &value) && noexcept {
    +  error_code error;
    +  std::forward>(*this).tie(value, error);
    +  return error;
    +}
    +
    +template
    +simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept {
    +  return this->second;
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::take_value() && noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::operator T&&() && noexcept(false) {
    +  return std::forward>(*this).take_value();
    +}
    +
    +#endif // SIMDJSON_EXCEPTIONS
    +
    +template
    +simdjson_inline const T& implementation_simdjson_result_base::value_unsafe() const& noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T& implementation_simdjson_result_base::value_unsafe() & noexcept {
    +  return this->first;
    +}
    +
    +template
    +simdjson_inline T&& implementation_simdjson_result_base::value_unsafe() && noexcept {
    +  return std::forward(this->first);
    +}
    +
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value, error_code error) noexcept
    +    : first{std::forward(value)}, second{error} {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(error_code error) noexcept
    +    : implementation_simdjson_result_base(T{}, error) {}
    +template
    +simdjson_inline implementation_simdjson_result_base::implementation_simdjson_result_base(T &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value), SUCCESS) {}
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_IMPLEMENTATION_SIMDJSON_RESULT_BASE_INL_H
    +/* end file simdjson/generic/implementation_simdjson_result_base-inl.h for westmere */
    +/* end file simdjson/generic/amalgamated.h for westmere */
    +/* including simdjson/westmere/end.h: #include "simdjson/westmere/end.h" */
    +/* begin file simdjson/westmere/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_WESTMERE
    +SIMDJSON_UNTARGET_REGION
    +#endif
    +
    +/* undefining SIMDJSON_IMPLEMENTATION from "westmere" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/westmere/end.h */
    +
    +#endif // SIMDJSON_WESTMERE_H
    +/* end file simdjson/westmere.h */
    +#else
    +#error Unknown SIMDJSON_BUILTIN_IMPLEMENTATION
    +#endif
    +
    +/* undefining SIMDJSON_CONDITIONAL_INCLUDE */
    +#undef SIMDJSON_CONDITIONAL_INCLUDE
    +
    +#endif // SIMDJSON_BUILTIN_H
    +/* end file simdjson/builtin.h */
    +/* skipped duplicate #include "simdjson/builtin/base.h" */
    +
    +/* including simdjson/generic/ondemand/dependencies.h: #include "simdjson/generic/ondemand/dependencies.h" */
    +/* begin file simdjson/generic/ondemand/dependencies.h */
    +#ifdef SIMDJSON_CONDITIONAL_INCLUDE
    +#error simdjson/generic/ondemand/dependencies.h must be included before defining SIMDJSON_CONDITIONAL_INCLUDE!
    +#endif
    +
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DEPENDENCIES_H
    +#define SIMDJSON_GENERIC_ONDEMAND_DEPENDENCIES_H
    +
    +// Internal headers needed for ondemand generics.
    +// All includes not under simdjson/generic/ondemand must be here!
    +// Otherwise, amalgamation will fail.
    +/* skipped duplicate #include "simdjson/dom/base.h" // for MINIMAL_DOCUMENT_CAPACITY */
    +/* skipped duplicate #include "simdjson/implementation.h" */
    +/* skipped duplicate #include "simdjson/padded_string.h" */
    +/* skipped duplicate #include "simdjson/padded_string_view.h" */
    +/* skipped duplicate #include "simdjson/internal/dom_parser_implementation.h" */
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DEPENDENCIES_H
    +/* end file simdjson/generic/ondemand/dependencies.h */
    +
    +/* defining SIMDJSON_CONDITIONAL_INCLUDE */
    +#define SIMDJSON_CONDITIONAL_INCLUDE
    +
    +#if SIMDJSON_BUILTIN_IMPLEMENTATION_IS(arm64)
    +/* including simdjson/arm64/ondemand.h: #include "simdjson/arm64/ondemand.h" */
    +/* begin file simdjson/arm64/ondemand.h */
    +#ifndef SIMDJSON_ARM64_ONDEMAND_H
    +#define SIMDJSON_ARM64_ONDEMAND_H
    +
    +/* including simdjson/arm64/begin.h: #include "simdjson/arm64/begin.h" */
    +/* begin file simdjson/arm64/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "arm64" */
    +#define SIMDJSON_IMPLEMENTATION arm64
    +/* including simdjson/arm64/base.h: #include "simdjson/arm64/base.h" */
    +/* begin file simdjson/arm64/base.h */
    +#ifndef SIMDJSON_ARM64_BASE_H
    +#define SIMDJSON_ARM64_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +/**
    + * Implementation for NEON (ARMv8).
    + */
    +namespace arm64 {
    +
    +class implementation;
    +
    +namespace {
    +namespace simd {
    +template  struct simd8;
    +template  struct simd8x64;
    +} // namespace simd
    +} // unnamed namespace
    +
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ARM64_BASE_H
    +/* end file simdjson/arm64/base.h */
    +/* including simdjson/arm64/intrinsics.h: #include "simdjson/arm64/intrinsics.h" */
    +/* begin file simdjson/arm64/intrinsics.h */
    +#ifndef SIMDJSON_ARM64_INTRINSICS_H
    +#define SIMDJSON_ARM64_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This should be the correct header whether
    +// you use visual studio or other compilers.
    +#include 
    +
    +static_assert(sizeof(uint8x16_t) <= simdjson::SIMDJSON_PADDING, "insufficient padding for arm64");
    +
    +#endif //  SIMDJSON_ARM64_INTRINSICS_H
    +/* end file simdjson/arm64/intrinsics.h */
    +/* including simdjson/arm64/bitmanipulation.h: #include "simdjson/arm64/bitmanipulation.h" */
    +/* begin file simdjson/arm64/bitmanipulation.h */
    +#ifndef SIMDJSON_ARM64_BITMANIPULATION_H
    +#define SIMDJSON_ARM64_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long ret;
    +  // Search the mask data from least significant bit (LSB)
    +  // to the most significant bit (MSB) for a set bit (1).
    +  _BitScanForward64(&ret, input_num);
    +  return (int)ret;
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return input_num & (input_num-1);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long leading_zero = 0;
    +  // Search the mask data from most significant bit (MSB)
    +  // to least significant bit (LSB) for a set bit (1).
    +  if (_BitScanReverse64(&leading_zero, input_num))
    +    return (int)(63 - leading_zero);
    +  else
    +    return 64;
    +#else
    +  return __builtin_clzll(input_num);
    +#endif// SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int count_ones(uint64_t input_num) {
    +   return vaddv_u8(vcnt_u8(vcreate_u8(input_num)));
    +}
    +
    +
    +#if defined(__GNUC__) // catches clang and gcc
    +/**
    + * ARM has a fast 64-bit "bit reversal function" that is handy. However,
    + * it is not generally available as an intrinsic function under Visual
    + * Studio (though this might be changing). Even under clang/gcc, we
    + * apparently need to invoke inline assembly.
    + */
    +/*
    + * We use SIMDJSON_PREFER_REVERSE_BITS as a hint that algorithms that
    + * work well with bit reversal may use it.
    + */
    +#define SIMDJSON_PREFER_REVERSE_BITS 1
    +
    +/* reverse the bits */
    +simdjson_inline uint64_t reverse_bits(uint64_t input_num) {
    +  uint64_t rev_bits;
    +  __asm("rbit %0, %1" : "=r"(rev_bits) : "r"(input_num));
    +  return rev_bits;
    +}
    +
    +/**
    + * Flips bit at index 63 - lz. Thus if you have 'leading_zeroes' leading zeroes,
    + * then this will set to zero the leading bit. It is possible for leading_zeroes to be
    + * greating or equal to 63 in which case we trigger undefined behavior, but the output
    + * of such undefined behavior is never used.
    + **/
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +simdjson_inline uint64_t zero_leading_bit(uint64_t rev_bits, int leading_zeroes) {
    +  return rev_bits ^ (uint64_t(0x8000000000000000) >> leading_zeroes);
    +}
    +
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2, uint64_t *result) {
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +  *result = value1 + value2;
    +  return *result < value1;
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ARM64_BITMANIPULATION_H
    +/* end file simdjson/arm64/bitmanipulation.h */
    +/* including simdjson/arm64/bitmask.h: #include "simdjson/arm64/bitmask.h" */
    +/* begin file simdjson/arm64/bitmask.h */
    +#ifndef SIMDJSON_ARM64_BITMASK_H
    +#define SIMDJSON_ARM64_BITMASK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +
    +//
    +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered.
    +//
    +// For example, prefix_xor(00100100) == 00011100
    +//
    +simdjson_inline uint64_t prefix_xor(uint64_t bitmask) {
    +  /////////////
    +  // We could do this with PMULL, but it is apparently slow.
    +  //
    +  //#ifdef __ARM_FEATURE_CRYPTO // some ARM processors lack this extension
    +  //return vmull_p64(-1ULL, bitmask);
    +  //#else
    +  // Analysis by @sebpop:
    +  // When diffing the assembly for src/stage1_find_marks.cpp I see that the eors are all spread out
    +  // in between other vector code, so effectively the extra cycles of the sequence do not matter
    +  // because the GPR units are idle otherwise and the critical path is on the FP side.
    +  // Also the PMULL requires two extra fmovs: GPR->FP (3 cycles in N1, 5 cycles in A72 )
    +  // and FP->GPR (2 cycles on N1 and 5 cycles on A72.)
    +  ///////////
    +  bitmask ^= bitmask << 1;
    +  bitmask ^= bitmask << 2;
    +  bitmask ^= bitmask << 4;
    +  bitmask ^= bitmask << 8;
    +  bitmask ^= bitmask << 16;
    +  bitmask ^= bitmask << 32;
    +  return bitmask;
    +}
    +
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif
    +/* end file simdjson/arm64/bitmask.h */
    +/* including simdjson/arm64/numberparsing_defs.h: #include "simdjson/arm64/numberparsing_defs.h" */
    +/* begin file simdjson/arm64/numberparsing_defs.h */
    +#ifndef SIMDJSON_ARM64_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_ARM64_NUMBERPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +#if _M_ARM64
    +// __umulh requires intrin.h
    +#include 
    +#endif // _M_ARM64
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace numberparsing {
    +
    +// we don't have SSE, so let us use a scalar function
    +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  uint64_t val;
    +  std::memcpy(&val, chars, sizeof(uint64_t));
    +  val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8;
    +  val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16;
    +  return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32);
    +}
    +
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif // SIMDJSON_ARM64_NUMBERPARSING_DEFS_H
    +/* end file simdjson/arm64/numberparsing_defs.h */
    +/* including simdjson/arm64/simd.h: #include "simdjson/arm64/simd.h" */
    +/* begin file simdjson/arm64/simd.h */
    +#ifndef SIMDJSON_ARM64_SIMD_H
    +#define SIMDJSON_ARM64_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +namespace simd {
    +
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +namespace {
    +// Start of private section with Visual Studio workaround
    +
    +
    +#ifndef simdjson_make_uint8x16_t
    +#define simdjson_make_uint8x16_t(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, \
    +                             x13, x14, x15, x16)                                   \
    +   ([=]() {                                                                        \
    +     uint8_t array[16] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8,                    \
    +                                 x9, x10, x11, x12, x13, x14, x15, x16};           \
    +     return vld1q_u8(array);                                                       \
    +   }())
    +#endif
    +#ifndef simdjson_make_int8x16_t
    +#define simdjson_make_int8x16_t(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, \
    +                             x13, x14, x15, x16)                                  \
    +   ([=]() {                                                                       \
    +     int8_t array[16] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8,                    \
    +                                 x9, x10, x11, x12, x13, x14, x15, x16};          \
    +     return vld1q_s8(array);                                                      \
    +   }())
    +#endif
    +
    +#ifndef simdjson_make_uint8x8_t
    +#define simdjson_make_uint8x8_t(x1, x2, x3, x4, x5, x6, x7, x8)                \
    +   ([=]() {                                                                    \
    +     uint8_t array[8] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8};                \
    +     return vld1_u8(array);                                                    \
    +   }())
    +#endif
    +#ifndef simdjson_make_int8x8_t
    +#define simdjson_make_int8x8_t(x1, x2, x3, x4, x5, x6, x7, x8)                 \
    +   ([=]() {                                                                    \
    +     int8_t array[8] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8};                 \
    +     return vld1_s8(array);                                                    \
    +   }())
    +#endif
    +#ifndef simdjson_make_uint16x8_t
    +#define simdjson_make_uint16x8_t(x1, x2, x3, x4, x5, x6, x7, x8)               \
    +   ([=]() {                                                                    \
    +     uint16_t array[8] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8};               \
    +     return vld1q_u16(array);                                                  \
    +   }())
    +#endif
    +#ifndef simdjson_make_int16x8_t
    +#define simdjson_make_int16x8_t(x1, x2, x3, x4, x5, x6, x7, x8)                \
    +   ([=]() {                                                                    \
    +     int16_t array[8] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8};                \
    +     return vld1q_s16(array);                                                  \
    +   }())
    +#endif
    +
    +// End of private section with Visual Studio workaround
    +} // namespace
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +
    +
    +  template
    +  struct simd8;
    +
    +  //
    +  // Base class of simd8 and simd8, both of which use uint8x16_t internally.
    +  //
    +  template>
    +  struct base_u8 {
    +    uint8x16_t value;
    +    static const int SIZE = sizeof(value);
    +
    +    // Conversion from/to SIMD register
    +    simdjson_inline base_u8(const uint8x16_t _value) : value(_value) {}
    +    simdjson_inline operator const uint8x16_t&() const { return this->value; }
    +    simdjson_inline operator uint8x16_t&() { return this->value; }
    +
    +    // Bit operations
    +    simdjson_inline simd8 operator|(const simd8 other) const { return vorrq_u8(*this, other); }
    +    simdjson_inline simd8 operator&(const simd8 other) const { return vandq_u8(*this, other); }
    +    simdjson_inline simd8 operator^(const simd8 other) const { return veorq_u8(*this, other); }
    +    simdjson_inline simd8 bit_andnot(const simd8 other) const { return vbicq_u8(*this, other); }
    +    simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +    simdjson_inline simd8& operator|=(const simd8 other) { auto this_cast = static_cast*>(this); *this_cast = *this_cast | other; return *this_cast; }
    +    simdjson_inline simd8& operator&=(const simd8 other) { auto this_cast = static_cast*>(this); *this_cast = *this_cast & other; return *this_cast; }
    +    simdjson_inline simd8& operator^=(const simd8 other) { auto this_cast = static_cast*>(this); *this_cast = *this_cast ^ other; return *this_cast; }
    +
    +    friend simdjson_inline Mask operator==(const simd8 lhs, const simd8 rhs) { return vceqq_u8(lhs, rhs); }
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +      return vextq_u8(prev_chunk, *this, 16 - N);
    +    }
    +  };
    +
    +  // SIMD byte mask type (returned by things like eq and gt)
    +  template<>
    +  struct simd8: base_u8 {
    +    typedef uint16_t bitmask_t;
    +    typedef uint32_t bitmask2_t;
    +
    +    static simdjson_inline simd8 splat(bool _value) { return vmovq_n_u8(uint8_t(-(!!_value))); }
    +
    +    simdjson_inline simd8(const uint8x16_t _value) : base_u8(_value) {}
    +    // False constructor
    +    simdjson_inline simd8() : simd8(vdupq_n_u8(0)) {}
    +    // Splat constructor
    +    simdjson_inline simd8(bool _value) : simd8(splat(_value)) {}
    +
    +    // We return uint32_t instead of uint16_t because that seems to be more efficient for most
    +    // purposes (cutting it down to uint16_t costs performance in some compilers).
    +    simdjson_inline uint32_t to_bitmask() const {
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +      const uint8x16_t bit_mask =  simdjson_make_uint8x16_t(0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
    +                                                   0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80);
    +#else
    +      const uint8x16_t bit_mask =  {0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
    +                                    0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80};
    +#endif
    +      auto minput = *this & bit_mask;
    +      uint8x16_t tmp = vpaddq_u8(minput, minput);
    +      tmp = vpaddq_u8(tmp, tmp);
    +      tmp = vpaddq_u8(tmp, tmp);
    +      return vgetq_lane_u16(vreinterpretq_u16_u8(tmp), 0);
    +    }
    +    simdjson_inline bool any() const { return vmaxvq_u8(*this) != 0; }
    +  };
    +
    +  // Unsigned bytes
    +  template<>
    +  struct simd8: base_u8 {
    +    static simdjson_inline uint8x16_t splat(uint8_t _value) { return vmovq_n_u8(_value); }
    +    static simdjson_inline uint8x16_t zero() { return vdupq_n_u8(0); }
    +    static simdjson_inline uint8x16_t load(const uint8_t* values) { return vld1q_u8(values); }
    +
    +    simdjson_inline simd8(const uint8x16_t _value) : base_u8(_value) {}
    +    // Zero constructor
    +    simdjson_inline simd8() : simd8(zero()) {}
    +    // Array constructor
    +    simdjson_inline simd8(const uint8_t values[16]) : simd8(load(values)) {}
    +    // Splat constructor
    +    simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +    // Member-by-member initialization
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) : simd8(simdjson_make_uint8x16_t(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +#else
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) : simd8(uint8x16_t{
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    }) {}
    +#endif
    +
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Store to array
    +    simdjson_inline void store(uint8_t dst[16]) const { return vst1q_u8(dst, *this); }
    +
    +    // Saturated math
    +    simdjson_inline simd8 saturating_add(const simd8 other) const { return vqaddq_u8(*this, other); }
    +    simdjson_inline simd8 saturating_sub(const simd8 other) const { return vqsubq_u8(*this, other); }
    +
    +    // Addition/subtraction are the same for signed and unsigned
    +    simdjson_inline simd8 operator+(const simd8 other) const { return vaddq_u8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return vsubq_u8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *this; }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *this; }
    +
    +    // Order-specific operations
    +    simdjson_inline uint8_t max_val() const { return vmaxvq_u8(*this); }
    +    simdjson_inline uint8_t min_val() const { return vminvq_u8(*this); }
    +    simdjson_inline simd8 max_val(const simd8 other) const { return vmaxq_u8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return vminq_u8(*this, other); }
    +    simdjson_inline simd8 operator<=(const simd8 other) const { return vcleq_u8(*this, other); }
    +    simdjson_inline simd8 operator>=(const simd8 other) const { return vcgeq_u8(*this, other); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return vcltq_u8(*this, other); }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return vcgtq_u8(*this, other); }
    +    // Same as >, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. For ARM, returns all 1's.
    +    simdjson_inline simd8 gt_bits(const simd8 other) const { return simd8(*this > other); }
    +    // Same as <, but instead of guaranteeing all 1's == true, false = 0 and true = nonzero. For ARM, returns all 1's.
    +    simdjson_inline simd8 lt_bits(const simd8 other) const { return simd8(*this < other); }
    +
    +    // Bit-specific operations
    +    simdjson_inline simd8 any_bits_set(simd8 bits) const { return vtstq_u8(*this, bits); }
    +    simdjson_inline bool any_bits_set_anywhere() const { return this->max_val() != 0; }
    +    simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return (*this & bits).any_bits_set_anywhere(); }
    +    template
    +    simdjson_inline simd8 shr() const { return vshrq_n_u8(*this, N); }
    +    template
    +    simdjson_inline simd8 shl() const { return vshlq_n_u8(*this, N); }
    +
    +    // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values)
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return lookup_table.apply_lookup_16_to(*this);
    +    }
    +
    +
    +    // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset).
    +    // Passing a 0 value for mask would be equivalent to writing out every byte to output.
    +    // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes
    +    // get written.
    +    // Design consideration: it seems like a function with the
    +    // signature simd8 compress(uint16_t mask) would be
    +    // sensible, but the AVX ISA makes this kind of approach difficult.
    +    template
    +    simdjson_inline void compress(uint16_t mask, L * output) const {
    +      using internal::thintable_epi8;
    +      using internal::BitsSetTable256mul2;
    +      using internal::pshufb_combine_table;
    +      // this particular implementation was inspired by work done by @animetosho
    +      // we do it in two steps, first 8 bytes and then second 8 bytes
    +      uint8_t mask1 = uint8_t(mask); // least significant 8 bits
    +      uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
    +      // next line just loads the 64-bit values thintable_epi8[mask1] and
    +      // thintable_epi8[mask2] into a 128-bit register, using only
    +      // two instructions on most compilers.
    +      uint64x2_t shufmask64 = {thintable_epi8[mask1], thintable_epi8[mask2]};
    +      uint8x16_t shufmask = vreinterpretq_u8_u64(shufmask64);
    +      // we increment by 0x08 the second half of the mask
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +      uint8x16_t inc = simdjson_make_uint8x16_t(0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08);
    +#else
    +      uint8x16_t inc = {0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08};
    +#endif
    +      shufmask = vaddq_u8(shufmask, inc);
    +      // this is the version "nearly pruned"
    +      uint8x16_t pruned = vqtbl1q_u8(*this, shufmask);
    +      // we still need to put the two halves together.
    +      // we compute the popcount of the first half:
    +      int pop1 = BitsSetTable256mul2[mask1];
    +      // then load the corresponding mask, what it does is to write
    +      // only the first pop1 bytes from the first 8 bytes, and then
    +      // it fills in with the bytes from the second 8 bytes + some filling
    +      // at the end.
    +      uint8x16_t compactmask = vld1q_u8(reinterpret_cast(pshufb_combine_table + pop1 * 8));
    +      uint8x16_t answer = vqtbl1q_u8(pruned, compactmask);
    +      vst1q_u8(reinterpret_cast(output), answer);
    +    }
    +
    +    // Copies all bytes corresponding to a 0 in the low half of the mask (interpreted as a
    +    // bitset) to output1, then those corresponding to a 0 in the high half to output2.
    +    template
    +    simdjson_inline void compress_halves(uint16_t mask, L *output1, L *output2) const {
    +      using internal::thintable_epi8;
    +      uint8_t mask1 = uint8_t(mask); // least significant 8 bits
    +      uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
    +      uint8x8_t compactmask1 = vcreate_u8(thintable_epi8[mask1]);
    +      uint8x8_t compactmask2 = vcreate_u8(thintable_epi8[mask2]);
    +      // we increment by 0x08 the second half of the mask
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +      uint8x8_t inc = simdjson_make_uint8x8_t(0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08);
    +#else
    +      uint8x8_t inc = {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08};
    +#endif
    +      compactmask2 = vadd_u8(compactmask2, inc);
    +      // store each result (with the second store possibly overlapping the first)
    +      vst1_u8((uint8_t*)output1, vqtbl1_u8(*this, compactmask1));
    +      vst1_u8((uint8_t*)output2, vqtbl1_u8(*this, compactmask2));
    +    }
    +
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +
    +    template
    +    simdjson_inline simd8 apply_lookup_16_to(const simd8 original) {
    +      return vqtbl1q_u8(*this, simd8(original));
    +    }
    +  };
    +
    +  // Signed bytes
    +  template<>
    +  struct simd8 {
    +    int8x16_t value;
    +
    +    static simdjson_inline simd8 splat(int8_t _value) { return vmovq_n_s8(_value); }
    +    static simdjson_inline simd8 zero() { return vdupq_n_s8(0); }
    +    static simdjson_inline simd8 load(const int8_t values[16]) { return vld1q_s8(values); }
    +
    +    // Conversion from/to SIMD register
    +    simdjson_inline simd8(const int8x16_t _value) : value{_value} {}
    +    simdjson_inline operator const int8x16_t&() const { return this->value; }
    +    simdjson_inline operator int8x16_t&() { return this->value; }
    +
    +    // Zero constructor
    +    simdjson_inline simd8() : simd8(zero()) {}
    +    // Splat constructor
    +    simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const int8_t* values) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3, int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) : simd8(simdjson_make_int8x16_t(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +#else
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3, int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) : simd8(int8x16_t{
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    }) {}
    +#endif
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Store to array
    +    simdjson_inline void store(int8_t dst[16]) const { return vst1q_s8(dst, *this); }
    +
    +    // Explicit conversion to/from unsigned
    +    //
    +    // Under Visual Studio/ARM64 uint8x16_t and int8x16_t are apparently the same type.
    +    // In theory, we could check this occurrence with std::same_as and std::enabled_if but it is C++14
    +    // and relatively ugly and hard to read.
    +#ifndef SIMDJSON_REGULAR_VISUAL_STUDIO
    +    simdjson_inline explicit simd8(const uint8x16_t other): simd8(vreinterpretq_s8_u8(other)) {}
    +#endif
    +    simdjson_inline explicit operator simd8() const { return vreinterpretq_u8_s8(this->value); }
    +
    +    // Math
    +    simdjson_inline simd8 operator+(const simd8 other) const { return vaddq_s8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return vsubq_s8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *this; }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *this; }
    +
    +    // Order-sensitive comparisons
    +    simdjson_inline simd8 max_val(const simd8 other) const { return vmaxq_s8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return vminq_s8(*this, other); }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return vcgtq_s8(*this, other); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return vcltq_s8(*this, other); }
    +    simdjson_inline simd8 operator==(const simd8 other) const { return vceqq_s8(*this, other); }
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +      return vextq_s8(prev_chunk, *this, 16 - N);
    +    }
    +
    +    // Perform a lookup assuming no value is larger than 16
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return lookup_table.apply_lookup_16_to(*this);
    +    }
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +
    +    template
    +    simdjson_inline simd8 apply_lookup_16_to(const simd8 original) {
    +      return vqtbl1q_s8(*this, simd8(original));
    +    }
    +  };
    +
    +  template
    +  struct simd8x64 {
    +    static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +    static_assert(NUM_CHUNKS == 4, "ARM kernel should use four registers per 64-byte block.");
    +    const simd8 chunks[NUM_CHUNKS];
    +
    +    simd8x64(const simd8x64& o) = delete; // no copy allowed
    +    simd8x64& operator=(const simd8& other) = delete; // no assignment allowed
    +    simd8x64() = delete; // no default constructor allowed
    +
    +    simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1, const simd8 chunk2, const simd8 chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {}
    +    simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8::load(ptr), simd8::load(ptr+16), simd8::load(ptr+32), simd8::load(ptr+48)} {}
    +
    +    simdjson_inline void store(T ptr[64]) const {
    +      this->chunks[0].store(ptr+sizeof(simd8)*0);
    +      this->chunks[1].store(ptr+sizeof(simd8)*1);
    +      this->chunks[2].store(ptr+sizeof(simd8)*2);
    +      this->chunks[3].store(ptr+sizeof(simd8)*3);
    +    }
    +
    +    simdjson_inline simd8 reduce_or() const {
    +      return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]);
    +    }
    +
    +
    +    simdjson_inline uint64_t compress(uint64_t mask, T * output) const {
    +      uint64_t popcounts = vget_lane_u64(vreinterpret_u64_u8(vcnt_u8(vcreate_u8(~mask))), 0);
    +      // compute the prefix sum of the popcounts of each byte
    +      uint64_t offsets = popcounts * 0x0101010101010101;
    +      this->chunks[0].compress_halves(uint16_t(mask), output, &output[popcounts & 0xFF]);
    +      this->chunks[1].compress_halves(uint16_t(mask >> 16), &output[(offsets >> 8) & 0xFF], &output[(offsets >> 16) & 0xFF]);
    +      this->chunks[2].compress_halves(uint16_t(mask >> 32), &output[(offsets >> 24) & 0xFF], &output[(offsets >> 32) & 0xFF]);
    +      this->chunks[3].compress_halves(uint16_t(mask >> 48), &output[(offsets >> 40) & 0xFF], &output[(offsets >> 48) & 0xFF]);
    +      return offsets >> 56;
    +    }
    +
    +    simdjson_inline uint64_t to_bitmask() const {
    +#ifdef SIMDJSON_REGULAR_VISUAL_STUDIO
    +      const uint8x16_t bit_mask = simdjson_make_uint8x16_t(
    +        0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
    +        0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80
    +      );
    +#else
    +      const uint8x16_t bit_mask = {
    +        0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
    +        0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80
    +      };
    +#endif
    +      // Add each of the elements next to each other, successively, to stuff each 8 byte mask into one.
    +      uint8x16_t sum0 = vpaddq_u8(this->chunks[0] & bit_mask, this->chunks[1] & bit_mask);
    +      uint8x16_t sum1 = vpaddq_u8(this->chunks[2] & bit_mask, this->chunks[3] & bit_mask);
    +      sum0 = vpaddq_u8(sum0, sum1);
    +      sum0 = vpaddq_u8(sum0, sum0);
    +      return vgetq_lane_u64(vreinterpretq_u64_u8(sum0), 0);
    +    }
    +
    +    simdjson_inline uint64_t eq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] == mask,
    +        this->chunks[1] == mask,
    +        this->chunks[2] == mask,
    +        this->chunks[3] == mask
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t lteq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] <= mask,
    +        this->chunks[1] <= mask,
    +        this->chunks[2] <= mask,
    +        this->chunks[3] <= mask
    +      ).to_bitmask();
    +    }
    +  }; // struct simd8x64
    +
    +} // namespace simd
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ARM64_SIMD_H
    +/* end file simdjson/arm64/simd.h */
    +/* including simdjson/arm64/stringparsing_defs.h: #include "simdjson/arm64/stringparsing_defs.h" */
    +/* begin file simdjson/arm64/stringparsing_defs.h */
    +#ifndef SIMDJSON_ARM64_STRINGPARSING_DEFS_H
    +#define SIMDJSON_ARM64_STRINGPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/simd.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace {
    +
    +using namespace simd;
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 32;
    +  simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; }
    +  simdjson_inline bool has_backslash() { return bs_bits != 0; }
    +  simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); }
    +  simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); }
    +
    +  uint32_t bs_bits;
    +  uint32_t quote_bits;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // this can read up to 31 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes");
    +  simd8 v0(src);
    +  simd8 v1(src + sizeof(v0));
    +  v0.store(dst);
    +  v1.store(dst + sizeof(v0));
    +
    +  // Getting a 64-bit bitmask is much cheaper than multiple 16-bit bitmasks on ARM; therefore, we
    +  // smash them together into a 64-byte mask and get the bitmask from there.
    +  uint64_t bs_and_quote = simd8x64(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask();
    +  return {
    +    uint32_t(bs_and_quote),      // bs_bits
    +    uint32_t(bs_and_quote >> 32) // quote_bits
    +  };
    +}
    +
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ARM64_STRINGPARSING_DEFS_H
    +/* end file simdjson/arm64/stringparsing_defs.h */
    +
    +#define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1
    +/* end file simdjson/arm64/begin.h */
    +/* including simdjson/generic/ondemand/amalgamated.h for arm64: #include "simdjson/generic/ondemand/amalgamated.h" */
    +/* begin file simdjson/generic/ondemand/amalgamated.h for arm64 */
    +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_ONDEMAND_DEPENDENCIES_H)
    +#error simdjson/generic/ondemand/dependencies.h must be included before simdjson/generic/ondemand/amalgamated.h!
    +#endif
    +
    +// Stuff other things depend on
    +/* including simdjson/generic/ondemand/base.h for arm64: #include "simdjson/generic/ondemand/base.h" */
    +/* begin file simdjson/generic/ondemand/base.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +/**
    + * A fast, simple, DOM-like interface that parses JSON as you use it.
    + *
    + * Designed for maximum speed and a lower memory profile.
    + */
    +namespace ondemand {
    +
    +/** Represents the depth of a JSON value (number of nested arrays/objects). */
    +using depth_t = int32_t;
    +
    +/** @copydoc simdjson::arm64::number_type */
    +using number_type = simdjson::arm64::number_type;
    +
    +/** @private Position in the JSON buffer indexes */
    +using token_position = const uint32_t *;
    +
    +class array;
    +class array_iterator;
    +class document;
    +class document_reference;
    +class document_stream;
    +class field;
    +class json_iterator;
    +enum class json_type;
    +struct number;
    +class object;
    +class object_iterator;
    +class parser;
    +class raw_json_string;
    +class token_iterator;
    +class value;
    +class value_iterator;
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_BASE_H
    +/* end file simdjson/generic/ondemand/base.h for arm64 */
    +/* including simdjson/generic/ondemand/value_iterator.h for arm64: #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* begin file simdjson/generic/ondemand/value_iterator.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +/**
    + * Iterates through a single JSON value at a particular depth.
    + *
    + * Does not keep track of the type of value: provides methods for objects, arrays and scalars and expects
    + * the caller to call the right ones.
    + *
    + * @private This is not intended for external use.
    + */
    +class value_iterator {
    +protected:
    +  /** The underlying JSON iterator */
    +  json_iterator *_json_iter{};
    +  /** The depth of this value */
    +  depth_t _depth{};
    +  /**
    +   * The starting token index for this value
    +   */
    +  token_position _start_position{};
    +
    +public:
    +  simdjson_inline value_iterator() noexcept = default;
    +
    +  /**
    +   * Denote that we're starting a document.
    +   */
    +  simdjson_inline void start_document() noexcept;
    +
    +  /**
    +   * Skips a non-iterated or partially-iterated JSON value, whether it is a scalar, array or object.
    +   *
    +   * Optimized for scalars.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code skip_child() noexcept;
    +
    +  /**
    +   * Tell whether the iterator is at the EOF mark
    +   */
    +  simdjson_inline bool at_end() const noexcept;
    +
    +  /**
    +   * Tell whether the iterator is at the start of the value
    +   */
    +  simdjson_inline bool at_start() const noexcept;
    +
    +  /**
    +   * Tell whether the value is open--if the value has not been used, or the array/object is still open.
    +   */
    +  simdjson_inline bool is_open() const noexcept;
    +
    +  /**
    +   * Tell whether the value is at an object's first field (just after the {).
    +   */
    +  simdjson_inline bool at_first_field() const noexcept;
    +
    +  /**
    +   * Abandon all iteration.
    +   */
    +  simdjson_inline void abandon() noexcept;
    +
    +  /**
    +   * Get the child value as a value_iterator.
    +   */
    +  simdjson_inline value_iterator child_value() const noexcept;
    +
    +  /**
    +   * Get the depth of this value.
    +   */
    +  simdjson_inline int32_t depth() const noexcept;
    +
    +  /**
    +   * Get the JSON type of this value.
    +   *
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result type() const noexcept;
    +
    +  /**
    +   * @addtogroup object Object iteration
    +   *
    +   * Methods to iterate and find object fields. These methods generally *assume* the value is
    +   * actually an object; the caller is responsible for keeping track of that fact.
    +   *
    +   * @{
    +   */
    +
    +  /**
    +   * Start an object iteration.
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCORRECT_TYPE if there is no opening {
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_object() noexcept;
    +  /**
    +   * Start an object iteration from the root.
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCORRECT_TYPE if there is no opening {
    +   * @error TAPE_ERROR if there is no matching } at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_root_object() noexcept;
    +  /**
    +   * Checks whether an object could be started from the root. May be called by start_root_object.
    +   *
    +   * @returns SUCCESS if it is possible to safely start an object from the root (document level).
    +   * @error INCORRECT_TYPE if there is no opening {
    +   * @error TAPE_ERROR if there is no matching } at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline error_code check_root_object() noexcept;
    +  /**
    +   * Start an object iteration after the user has already checked and moved past the {.
    +   *
    +   * Does not move the iterator unless the object is empty ({}).
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_object() noexcept;
    +  /**
    +   * Start an object iteration from the root, after the user has already checked and moved past the {.
    +   *
    +   * Does not move the iterator unless the object is empty ({}).
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_root_object() noexcept;
    +
    +  /**
    +   * Moves to the next field in an object.
    +   *
    +   * Looks for , and }. If } is found, the object is finished and the iterator advances past it.
    +   * Otherwise, it advances to the next value.
    +   *
    +   * @return whether there is another field in the object.
    +   * @error TAPE_ERROR If there is a comma missing between fields.
    +   * @error TAPE_ERROR If there is a comma, but not enough tokens remaining to have a key, :, and value.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result has_next_field() noexcept;
    +
    +  /**
    +   * Get the current field's key.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result field_key() noexcept;
    +
    +  /**
    +   * Pass the : in the field and move to its value.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code field_value() noexcept;
    +
    +  /**
    +   * Find the next field with the given key.
    +   *
    +   * Assumes you have called next_field() or otherwise matched the previous value.
    +   *
    +   * This means the iterator must be sitting at the next key:
    +   *
    +   * ```
    +   * { "a": 1, "b": 2 }
    +   *           ^
    +   * ```
    +   *
    +   * Key is *raw JSON,* meaning it will be matched against the verbatim JSON without attempting to
    +   * unescape it. This works well for typical ASCII and UTF-8 keys (almost all of them), but may
    +   * fail to match some keys with escapes (\u, \n, etc.).
    +   */
    +  simdjson_warn_unused simdjson_inline error_code find_field(const std::string_view key) noexcept;
    +
    +  /**
    +   * Find the next field with the given key, *without* unescaping. This assumes object order: it
    +   * will not find the field if it was already passed when looking for some *other* field.
    +   *
    +   * Assumes you have called next_field() or otherwise matched the previous value.
    +   *
    +   * This means the iterator must be sitting at the next key:
    +   *
    +   * ```
    +   * { "a": 1, "b": 2 }
    +   *           ^
    +   * ```
    +   *
    +   * Key is *raw JSON,* meaning it will be matched against the verbatim JSON without attempting to
    +   * unescape it. This works well for typical ASCII and UTF-8 keys (almost all of them), but may
    +   * fail to match some keys with escapes (\u, \n, etc.).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result find_field_raw(const std::string_view key) noexcept;
    +
    +  /**
    +   * Find the field with the given key without regard to order, and *without* unescaping.
    +   *
    +   * This is an unordered object lookup: if the field is not found initially, it will cycle around and scan from the beginning.
    +   *
    +   * Assumes you have called next_field() or otherwise matched the previous value.
    +   *
    +   * This means the iterator must be sitting at the next key:
    +   *
    +   * ```
    +   * { "a": 1, "b": 2 }
    +   *           ^
    +   * ```
    +   *
    +   * Key is *raw JSON,* meaning it will be matched against the verbatim JSON without attempting to
    +   * unescape it. This works well for typical ASCII and UTF-8 keys (almost all of them), but may
    +   * fail to match some keys with escapes (\u, \n, etc.).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result find_field_unordered_raw(const std::string_view key) noexcept;
    +
    +  /** @} */
    +
    +  /**
    +   * @addtogroup array Array iteration
    +   * Methods to iterate over array elements. These methods generally *assume* the value is actually
    +   * an object; the caller is responsible for keeping track of that fact.
    +   * @{
    +   */
    +
    +  /**
    +   * Check for an opening [ and start an array iteration.
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCORRECT_TYPE If there is no [.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_array() noexcept;
    +  /**
    +   * Check for an opening [ and start an array iteration while at the root.
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCORRECT_TYPE If there is no [.
    +   * @error TAPE_ERROR if there is no matching ] at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_root_array() noexcept;
    +  /**
    +   * Checks whether an array could be started from the root. May be called by start_root_array.
    +   *
    +   * @returns SUCCESS if it is possible to safely start an array from the root (document level).
    +   * @error INCORRECT_TYPE If there is no [.
    +   * @error TAPE_ERROR if there is no matching ] at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline error_code check_root_array() noexcept;
    +  /**
    +   * Start an array iteration, after the user has already checked and moved past the [.
    +   *
    +   * Does not move the iterator unless the array is empty ([]).
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_array() noexcept;
    +  /**
    +   * Start an array iteration from the root, after the user has already checked and moved past the [.
    +   *
    +   * Does not move the iterator unless the array is empty ([]).
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_root_array() noexcept;
    +
    +  /**
    +   * Moves to the next element in an array.
    +   *
    +   * Looks for , and ]. If ] is found, the array is finished and the iterator advances past it.
    +   * Otherwise, it advances to the next value.
    +   *
    +   * @return Whether there is another element in the array.
    +   * @error TAPE_ERROR If there is a comma missing between elements.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result has_next_element() noexcept;
    +
    +  /**
    +   * Get a child value iterator.
    +   */
    +  simdjson_warn_unused simdjson_inline value_iterator child() const noexcept;
    +
    +  /** @} */
    +
    +  /**
    +   * @defgroup scalar Scalar values
    +   * @addtogroup scalar
    +   * @{
    +   */
    +
    +  simdjson_warn_unused simdjson_inline simdjson_result get_string(bool allow_replacement) noexcept;
    +  template 
    +  simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_null() noexcept;
    +  simdjson_warn_unused simdjson_inline bool is_negative() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept;
    +
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_string(bool check_trailing, bool allow_replacement) noexcept;
    +  template 
    +  simdjson_warn_unused simdjson_inline error_code get_root_string(string_type& receiver, bool check_trailing, bool allow_replacement) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_wobbly_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_raw_json_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_uint64(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_uint64_in_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_int64(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_int64_in_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_double(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_double_in_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_bool(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline bool is_root_negative() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_root_integer(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_number_type(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_number(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_root_null(bool check_trailing) noexcept;
    +
    +  simdjson_inline error_code error() const noexcept;
    +  simdjson_inline uint8_t *&string_buf_loc() noexcept;
    +  simdjson_inline const json_iterator &json_iter() const noexcept;
    +  simdjson_inline json_iterator &json_iter() noexcept;
    +
    +  simdjson_inline void assert_is_valid() const noexcept;
    +  simdjson_inline bool is_valid() const noexcept;
    +
    +  /** @} */
    +protected:
    +  /**
    +   * Restarts an array iteration.
    +   * @returns Whether the array has any elements (returns false for empty).
    +   */
    +  simdjson_inline simdjson_result reset_array() noexcept;
    +  /**
    +   * Restarts an object iteration.
    +   * @returns Whether the object has any fields (returns false for empty).
    +   */
    +  simdjson_inline simdjson_result reset_object() noexcept;
    +  /**
    +   * move_at_start(): moves us so that we are pointing at the beginning of
    +   * the container. It updates the index so that at_start() is true and it
    +   * syncs the depth. The user can then create a new container instance.
    +   *
    +   * Usage: used with value::count_elements().
    +   **/
    +  simdjson_inline void move_at_start() noexcept;
    +
    +  /**
    +   * move_at_container_start(): moves us so that we are pointing at the beginning of
    +   * the container so that assert_at_container_start() passes.
    +   *
    +   * Usage: used with reset_array() and reset_object().
    +   **/
    +   simdjson_inline void move_at_container_start() noexcept;
    +  /* Useful for debugging and logging purposes. */
    +  inline std::string to_string() const noexcept;
    +  simdjson_inline value_iterator(json_iterator *json_iter, depth_t depth, token_position start_index) noexcept;
    +
    +  simdjson_inline simdjson_result parse_null(const uint8_t *json) const noexcept;
    +  simdjson_inline simdjson_result parse_bool(const uint8_t *json) const noexcept;
    +  simdjson_inline const uint8_t *peek_start() const noexcept;
    +  simdjson_inline uint32_t peek_start_length() const noexcept;
    +
    +  /**
    +   * The general idea of the advance_... methods and the peek_* methods
    +   * is that you first peek and check that you have desired type. If you do,
    +   * and only if you do, then you advance.
    +   *
    +   * We used to unconditionally advance. But this made reasoning about our
    +   * current state difficult.
    +   * Suppose you always advance. Look at the 'value' matching the key
    +   * "shadowable" in the following example...
    +   *
    +   * ({"globals":{"a":{"shadowable":[}}}})
    +   *
    +   * If the user thinks it is a Boolean and asks for it, then we check the '[',
    +   * decide it is not a Boolean, but still move into the next character ('}'). Now
    +   * we are left pointing at '}' right after a '['. And we have not yet reported
    +   * an error, only that we do not have a Boolean.
    +   *
    +   * If, instead, you just stand your ground until it is content that you know, then
    +   * you will only even move beyond the '[' if the user tells you that you have an
    +   * array. So you will be at the '}' character inside the array and, hopefully, you
    +   * will then catch the error because an array cannot start with '}', but the code
    +   * processing Boolean values does not know this.
    +   *
    +   * So the contract is: first call 'peek_...' and then call 'advance_...' only
    +   * if you have determined that it is a type you can handle.
    +   *
    +   * Unfortunately, it makes the code more verbose, longer and maybe more error prone.
    +   */
    +
    +  simdjson_inline void advance_scalar(const char *type) noexcept;
    +  simdjson_inline void advance_root_scalar(const char *type) noexcept;
    +  simdjson_inline void advance_non_root_scalar(const char *type) noexcept;
    +
    +  simdjson_inline const uint8_t *peek_scalar(const char *type) noexcept;
    +  simdjson_inline const uint8_t *peek_root_scalar(const char *type) noexcept;
    +  simdjson_inline const uint8_t *peek_non_root_scalar(const char *type) noexcept;
    +
    +
    +  simdjson_inline error_code start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept;
    +  simdjson_inline error_code end_container() noexcept;
    +
    +  /**
    +   * Advance to a place expecting a value (increasing depth).
    +   *
    +   * @return The current token (the one left behind).
    +   * @error TAPE_ERROR If the document ended early.
    +   */
    +  simdjson_inline simdjson_result advance_to_value() noexcept;
    +
    +  simdjson_inline error_code incorrect_type_error(const char *message) const noexcept;
    +  simdjson_inline error_code error_unless_more_tokens(uint32_t tokens=1) const noexcept;
    +
    +  simdjson_inline bool is_at_start() const noexcept;
    +  /**
    +   * is_at_iterator_start() returns true on an array or object after it has just been
    +   * created, whether the instance is empty or not.
    +   *
    +   * Usage: used by array::begin() in debug mode (SIMDJSON_DEVELOPMENT_CHECKS)
    +   */
    +  simdjson_inline bool is_at_iterator_start() const noexcept;
    +
    +  /**
    +   * Assuming that we are within an object, this returns true if we
    +   * are pointing at a key.
    +   *
    +   * Usage: the skip_child() method should never be used while we are pointing
    +   * at a key inside an object.
    +   */
    +  simdjson_inline bool is_at_key() const noexcept;
    +
    +  inline void assert_at_start() const noexcept;
    +  inline void assert_at_container_start() const noexcept;
    +  inline void assert_at_root() const noexcept;
    +  inline void assert_at_child() const noexcept;
    +  inline void assert_at_next() const noexcept;
    +  inline void assert_at_non_root_start() const noexcept;
    +
    +  /** Get the starting position of this value */
    +  simdjson_inline token_position start_position() const noexcept;
    +
    +  /** @copydoc error_code json_iterator::position() const noexcept; */
    +  simdjson_inline token_position position() const noexcept;
    +  /** @copydoc error_code json_iterator::end_position() const noexcept; */
    +  simdjson_inline token_position last_position() const noexcept;
    +  /** @copydoc error_code json_iterator::end_position() const noexcept; */
    +  simdjson_inline token_position end_position() const noexcept;
    +  /** @copydoc error_code json_iterator::report_error(error_code error, const char *message) noexcept; */
    +  simdjson_inline error_code report_error(error_code error, const char *message) noexcept;
    +
    +  friend class document;
    +  friend class object;
    +  friend class array;
    +  friend class value;
    +}; // value_iterator
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public arm64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(arm64::ondemand::value_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H
    +/* end file simdjson/generic/ondemand/value_iterator.h for arm64 */
    +/* including simdjson/generic/ondemand/value.h for arm64: #include "simdjson/generic/ondemand/value.h" */
    +/* begin file simdjson/generic/ondemand/value.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +/**
    + * An ephemeral JSON value returned during iteration. It is only valid for as long as you do
    + * not access more data in the JSON document.
    + */
    +class value {
    +public:
    +  /**
    +   * Create a new invalid value.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline value() noexcept = default;
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool
    +   *
    +   * You may use get_double(), get_bool(), get_uint64(), get_int64(),
    +   * get_object(), get_array(), get_raw_json_string(), or get_string() instead.
    +   *
    +   * @returns A value of the given type, parsed from the JSON.
    +   * @returns INCORRECT_TYPE If the JSON value is not the given type.
    +   */
    +  template simdjson_inline simdjson_result get() noexcept {
    +    // Unless the simdjson library provides an inline implementation, calling this method should
    +    // immediately fail.
    +    static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. "
    +      "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
    +      "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), "
    +      " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template.");
    +  }
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool
    +   *
    +   * @param out This is set to a value of the given type, parsed from the JSON. If there is an error, this may not be initialized.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   * @returns SUCCESS If the parse succeeded and the out parameter was set to the value.
    +   */
    +  template simdjson_inline error_code get(T &out) noexcept;
    +
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @returns INCORRECT_TYPE If the JSON value is not an array.
    +   */
    +  simdjson_inline simdjson_result get_array() noexcept;
    +
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   */
    +  simdjson_inline simdjson_result get_object() noexcept;
    +
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A unsigned 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a unsigned integer.
    +   *
    +   * @returns A unsigned 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a double
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Equivalent to get().
    +   *
    +   * Important: a value should be consumed once. Calling get_string() twice on the same value
    +   * is an error.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +
    +  /**
    +   * Attempts to fill the provided std::string reference with the parsed value of the current string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Important: a value should be consumed once. Calling get_string() twice on the same value
    +   * is an error.
    +   *
    +   * Performance: This method may be slower than get_string() or get_string(bool) because it may need to allocate memory.
    +   * We recommend you avoid allocating an std::string unless you need to.
    +   *
    +   * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS.
    +   */
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +
    +  /**
    +   * Cast this JSON value to a "wobbly" string.
    +   *
    +   * The string is may not be a valid UTF-8 string.
    +   * See https://simonsapin.github.io/wtf-8/
    +   *
    +   * Important: a value should be consumed once. Calling get_wobbly_string() twice on the same value
    +   * is an error.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @returns INCORRECT_TYPE if the JSON value is not true or false.
    +   */
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +
    +  /**
    +   * Checks if this JSON value is null. If and only if the value is
    +   * null, then it is consumed (we advance). If we find a token that
    +   * begins with 'n' but is not 'null', then an error is returned.
    +   *
    +   * @returns Whether the value is null.
    +   * @returns INCORRECT_TYPE If the JSON value begins with 'n' and is not 'null'.
    +   */
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an array.
    +   */
    +  simdjson_inline operator array() noexcept(false);
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an object.
    +   */
    +  simdjson_inline operator object() noexcept(false);
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline operator int64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline operator double() noexcept(false);
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Equivalent to get().
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator raw_json_string() noexcept(false);
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not true or false.
    +   */
    +  simdjson_inline operator bool() noexcept(false);
    +#endif
    +
    +  /**
    +   * Begin array iteration.
    +   *
    +   * Part of the std::iterable interface.
    +   *
    +   * @returns INCORRECT_TYPE If the JSON value is not an array.
    +   */
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  /**
    +   * Sentinel representing the end of the array.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result end() & noexcept;
    +  /**
    +   * This method scans the array and counts the number of elements.
    +   * The count_elements method should always be called before you have begun
    +   * iterating through the array: it is expected that you are pointing at
    +   * the beginning of the array.
    +   * The runtime complexity is linear in the size of the array. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * Performance hint: You should only call count_elements() as a last
    +   * resort as it may require scanning the document twice or more.
    +   */
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  /**
    +   * This method scans the object and counts the number of key-value pairs.
    +   * The count_fields method should always be called before you have begun
    +   * iterating through the object: it is expected that you are pointing at
    +   * the beginning of the object.
    +   * The runtime complexity is linear in the size of the object. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an object is empty, it is more performant to use
    +   * the is_empty() method on the object instance.
    +   *
    +   * Performance hint: You should only call count_fields() as a last
    +   * resort as it may require scanning the document twice or more.
    +   */
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  /**
    +   * Get the value at the given index in the array. This function has linear-time complexity.
    +   * This function should only be called once on an array instance since the array iterator is not reset between each call.
    +   *
    +   * @return The value at the given index, or:
    +   *         - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
    +   */
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field(const char *key) noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](const char *key) noexcept;
    +
    +  /**
    +   * Get the type of this JSON value. It does not validate or consume the value.
    +   * E.g., you must still call "is_null()" to check that a value is null even if
    +   * "type()" returns json_type::null.
    +   *
    +   * NOTE: If you're only expecting a value to be one type (a typical case), it's generally
    +   * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just
    +   * let it throw an exception).
    +   *
    +   * @return The type of JSON value (json_type::array, json_type::object, json_type::string,
    +   *     json_type::number, json_type::boolean, or json_type::null).
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result type() noexcept;
    +
    +  /**
    +   * Checks whether the value is a scalar (string, number, null, Boolean).
    +   * Returns false when there it is an array or object.
    +   *
    +   * @returns true if the type is string, number, null, Boolean
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +
    +  /**
    +   * Checks whether the value is a negative number.
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline bool is_negative() noexcept;
    +  /**
    +   * Checks whether the value is an integer number. Note that
    +   * this requires to partially parse the number string. If
    +   * the value is determined to be an integer, it may still
    +   * not parse properly as an integer in subsequent steps
    +   * (e.g., it might overflow).
    +   *
    +   * Performance note: if you call this function systematically
    +   * before parsing a number, you may have fallen for a performance
    +   * anti-pattern.
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  /**
    +   * Determine the number type (integer or floating-point number) as quickly
    +   * as possible. This function does not fully validate the input. It is
    +   * useful when you only need to classify the numbers, without parsing them.
    +   *
    +   * If you are planning to retrieve the value or you need full validation,
    +   * consider using the get_number() method instead: it will fully parse
    +   * and validate the input, and give you access to the type:
    +   * get_number().get_number_type().
    +   *
    +   * get_number_type() is number_type::unsigned_integer if we have
    +   * an integer greater or equal to 9223372036854775808
    +   * get_number_type() is number_type::signed_integer if we have an
    +   * integer that is less than 9223372036854775808
    +   * Otherwise, get_number_type() has value number_type::floating_point_number
    +   *
    +   * This function requires processing the number string, but it is expected
    +   * to be faster than get_number().get_number_type() because it is does not
    +   * parse the number value.
    +   *
    +   * @returns the type of the number
    +   */
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +
    +  /**
    +   * Attempt to parse an ondemand::number. An ondemand::number may
    +   * contain an integer value or a floating-point value, the simdjson
    +   * library will autodetect the type. Thus it is a dynamically typed
    +   * number. Before accessing the value, you must determine the detected
    +   * type.
    +   *
    +   * number.get_number_type() is number_type::signed_integer if we have
    +   * an integer in [-9223372036854775808,9223372036854775808)
    +   * You can recover the value by calling number.get_int64() and you
    +   * have that number.is_int64() is true.
    +   *
    +   * number.get_number_type() is number_type::unsigned_integer if we have
    +   * an integer in [9223372036854775808,18446744073709551616)
    +   * You can recover the value by calling number.get_uint64() and you
    +   * have that number.is_uint64() is true.
    +   *
    +   * Otherwise, number.get_number_type() has value number_type::floating_point_number
    +   * and we have a binary64 number.
    +   * You can recover the value by calling number.get_double() and you
    +   * have that number.is_double() is true.
    +   *
    +   * You must check the type before accessing the value: it is an error
    +   * to call "get_int64()" when number.get_number_type() is not
    +   * number_type::signed_integer and when number.is_int64() is false.
    +   *
    +   * Performance note: this is designed with performance in mind. When
    +   * calling 'get_number()', you scan the number string only once, determining
    +   * efficiently the type and storing it in an efficient manner.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept;
    +
    +
    +  /**
    +   * Get the raw JSON for this token.
    +   *
    +   * The string_view will always point into the input buffer.
    +   *
    +   * The string_view will start at the beginning of the token, and include the entire token
    +   * *as well as all spaces until the next token (or EOF).* This means, for example, that a
    +   * string token always begins with a " and is always terminated by the final ", possibly
    +   * followed by a number of spaces.
    +   *
    +   * The string_view is *not* null-terminated. However, if this is a scalar (string, number,
    +   * boolean, or null), the character after the end of the string_view is guaranteed to be
    +   * a non-space token.
    +   *
    +   * Tokens include:
    +   * - {
    +   * - [
    +   * - "a string (possibly with UTF-8 or backslashed characters like \\\")".
    +   * - -1.2e-100
    +   * - true
    +   * - false
    +   * - null
    +   *
    +   * See also value::raw_json().
    +   */
    +  simdjson_inline std::string_view raw_json_token() noexcept;
    +
    +  /**
    +   * Get a string_view pointing at this value in the JSON document.
    +   * If this element is an array or an object, it consumes the array or the object
    +   * and returns a string_view instance corresponding to the
    +   * array as represented in JSON. It points inside the original document.
    +   * If this element is a scalar (string, number, Boolean, null), it returns what
    +   * raw_json_token() would return.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +  /**
    +   * Returns the current location in the document if in bounds.
    +   */
    +  simdjson_inline simdjson_result current_location() noexcept;
    +
    +  /**
    +   * Returns the current depth in the document if in bounds.
    +   *
    +   * E.g.,
    +   *  0 = finished with document
    +   *  1 = document root value (could be [ or {, not yet known)
    +   *  2 = , or } inside root array/object
    +   *  3 = key or value inside root array/object.
    +   */
    +  simdjson_inline int32_t current_depth() const noexcept;
    +
    +  /**
    +   * Get the value associated with the given JSON pointer.  We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/foo/a/1") == 20
    +   *
    +   * It is allowed for a key to be the empty string:
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("//a/1") == 20
    +   *
    +   * Note that at_pointer() called on the document automatically calls the document's rewind
    +   * method between each call. It invalidates all previously accessed arrays, objects and values
    +   * that have not been consumed.
    +   *
    +   * Calling at_pointer() on non-document instances (e.g., arrays and objects) is not
    +   * standardized (by RFC 6901). We provide some experimental support for JSON pointers
    +   * on non-document instances.  Yet it is not the case when calling at_pointer on an array
    +   * or an object instance: there is no rewind and no invalidation.
    +   *
    +   * You may only call at_pointer on an array after it has been created, but before it has
    +   * been first accessed. When calling at_pointer on an array, the pointer is advanced to
    +   * the location indicated by the JSON pointer (in case of success). It is no longer possible
    +   * to call at_pointer on the same array.
    +   *
    +   * You may call at_pointer more than once on an object, but each time the pointer is advanced
    +   * to be within the value matched by the key indicated by the JSON pointer query. Thus any preceding
    +   * key (as well as the current key) can no longer be used with following JSON pointer calls.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   */
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +
    +protected:
    +  /**
    +   * Create a value.
    +   */
    +  simdjson_inline value(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Skip this value, allowing iteration to continue.
    +   */
    +  simdjson_inline void skip() noexcept;
    +
    +  /**
    +   * Start a value at the current position.
    +   *
    +   * (It should already be started; this is just a self-documentation method.)
    +   */
    +  static simdjson_inline value start(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Resume a value.
    +   */
    +  static simdjson_inline value resume(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Get the object, starting or resuming it as necessary
    +   */
    +  simdjson_inline simdjson_result start_or_resume_object() noexcept;
    +
    +  // simdjson_inline void log_value(const char *type) const noexcept;
    +  // simdjson_inline void log_error(const char *message) const noexcept;
    +
    +  value_iterator iter{};
    +
    +  friend class document;
    +  friend class array_iterator;
    +  friend class field;
    +  friend class object;
    +  friend struct simdjson_result;
    +  friend struct simdjson_result;
    +};
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public arm64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(arm64::ondemand::value &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result get_array() noexcept;
    +  simdjson_inline simdjson_result get_object() noexcept;
    +
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +  template simdjson_inline simdjson_result get() noexcept;
    +
    +  template simdjson_inline error_code get(T &out) noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator arm64::ondemand::array() noexcept(false);
    +  simdjson_inline operator arm64::ondemand::object() noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator arm64::ondemand::raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   *
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field(const char *key) noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](const char *key) noexcept;
    +
    +  /**
    +   * Get the type of this JSON value.
    +   *
    +   * NOTE: If you're only expecting a value to be one type (a typical case), it's generally
    +   * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just
    +   * let it throw an exception).
    +   */
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +  simdjson_inline simdjson_result is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +
    +  /** @copydoc simdjson_inline std::string_view value::raw_json_token() const noexcept */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +  /** @copydoc simdjson_inline simdjson_result current_location() noexcept */
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  /** @copydoc simdjson_inline int32_t current_depth() const noexcept */
    +  simdjson_inline simdjson_result current_depth() const noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_H
    +/* end file simdjson/generic/ondemand/value.h for arm64 */
    +/* including simdjson/generic/ondemand/logger.h for arm64: #include "simdjson/generic/ondemand/logger.h" */
    +/* begin file simdjson/generic/ondemand/logger.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_LOGGER_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +// Logging should be free unless SIMDJSON_VERBOSE_LOGGING is set. Importantly, it is critical
    +// that the call to the log functions be side-effect free. Thus, for example, you should not
    +// create temporary std::string instances.
    +namespace logger {
    +
    +enum class log_level : int32_t {
    +  info = 0,
    +  error = 1
    +};
    +
    +#if SIMDJSON_VERBOSE_LOGGING
    +  static constexpr const bool LOG_ENABLED = true;
    +#else
    +  static constexpr const bool LOG_ENABLED = false;
    +#endif
    +
    +// We do not want these functions to be 'really inlined' since real inlining is
    +// for performance purposes and if you are using the loggers, you do not care about
    +// performance (or should not).
    +static inline void log_headers() noexcept;
    +// If args are provided, title will be treated as format string
    +template 
    +static inline void log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, logger::log_level level, Args&&... args) noexcept;
    +template 
    +static inline void log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, logger::log_level level, Args&&... args) noexcept;
    +static inline void log_event(const json_iterator &iter, const char *type, std::string_view detail="", int delta=0, int depth_delta=0) noexcept;
    +static inline void log_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail="") noexcept;
    +static inline void log_value(const json_iterator &iter, const char *type, std::string_view detail="", int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_start_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail="") noexcept;
    +static inline void log_start_value(const json_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_end_value(const json_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +
    +static inline void log_error(const json_iterator &iter, token_position index, depth_t depth, const char *error, const char *detail="") noexcept;
    +static inline void log_error(const json_iterator &iter, const char *error, const char *detail="", int delta=-1, int depth_delta=0) noexcept;
    +
    +static inline void log_event(const value_iterator &iter, const char *type, std::string_view detail="", int delta=0, int depth_delta=0) noexcept;
    +static inline void log_value(const value_iterator &iter, const char *type, std::string_view detail="", int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_start_value(const value_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_end_value(const value_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_error(const value_iterator &iter, const char *error, const char *detail="", int delta=-1, int depth_delta=0) noexcept;
    +
    +} // namespace logger
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_H
    +/* end file simdjson/generic/ondemand/logger.h for arm64 */
    +/* including simdjson/generic/ondemand/token_iterator.h for arm64: #include "simdjson/generic/ondemand/token_iterator.h" */
    +/* begin file simdjson/generic/ondemand/token_iterator.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/logger.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +/**
    + * Iterates through JSON tokens (`{` `}` `[` `]` `,` `:` `""` `123` `true` `false` `null`)
    + * detected by stage 1.
    + *
    + * @private This is not intended for external use.
    + */
    +class token_iterator {
    +public:
    +  /**
    +   * Create a new invalid token_iterator.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline token_iterator() noexcept = default;
    +  simdjson_inline token_iterator(token_iterator &&other) noexcept = default;
    +  simdjson_inline token_iterator &operator=(token_iterator &&other) noexcept = default;
    +  simdjson_inline token_iterator(const token_iterator &other) noexcept = default;
    +  simdjson_inline token_iterator &operator=(const token_iterator &other) noexcept = default;
    +
    +  /**
    +   * Advance to the next token (returning the current one).
    +   */
    +  simdjson_inline const uint8_t *return_current_and_advance() noexcept;
    +  /**
    +   * Reports the current offset in bytes from the start of the underlying buffer.
    +   */
    +  simdjson_inline uint32_t current_offset() const noexcept;
    +  /**
    +   * Get the JSON text for a given token (relative).
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = current token,
    +   *              1 = next token, -1 = prev token.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek(int32_t delta=0) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for a given token.
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = current token,
    +   *              1 = next token, -1 = prev token.
    +   */
    +  simdjson_inline uint32_t peek_length(int32_t delta=0) const noexcept;
    +
    +  /**
    +   * Get the JSON text for a given token.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param position The position of the token.
    +   *
    +   */
    +  simdjson_inline const uint8_t *peek(token_position position) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for a given token.
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param position The position of the token.
    +   */
    +  simdjson_inline uint32_t peek_length(token_position position) const noexcept;
    +
    +  /**
    +   * Return the current index.
    +   */
    +  simdjson_inline token_position position() const noexcept;
    +  /**
    +   * Reset to a previously saved index.
    +   */
    +  simdjson_inline void set_position(token_position target_position) noexcept;
    +
    +  // NOTE: we don't support a full C++ iterator interface, because we expect people to make
    +  // different calls to advance the iterator based on *their own* state.
    +
    +  simdjson_inline bool operator==(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator!=(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator>(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator>=(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator<(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator<=(const token_iterator &other) const noexcept;
    +
    +protected:
    +  simdjson_inline token_iterator(const uint8_t *buf, token_position position) noexcept;
    +
    +  /**
    +   * Get the index of the JSON text for a given token (relative).
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = current token,
    +   *              1 = next token, -1 = prev token.
    +   */
    +  simdjson_inline uint32_t peek_index(int32_t delta=0) const noexcept;
    +  /**
    +   * Get the index of the JSON text for a given token.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param position The position of the token.
    +   *
    +   */
    +  simdjson_inline uint32_t peek_index(token_position position) const noexcept;
    +
    +  const uint8_t *buf{};
    +  token_position _position{};
    +
    +  friend class json_iterator;
    +  friend class value_iterator;
    +  friend class object;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, logger::log_level level, Args&&... args) noexcept;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, logger::log_level level, Args&&... args) noexcept;
    +};
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public arm64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(arm64::ondemand::token_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline ~simdjson_result() noexcept = default; ///< @private
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H
    +/* end file simdjson/generic/ondemand/token_iterator.h for arm64 */
    +/* including simdjson/generic/ondemand/json_iterator.h for arm64: #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* begin file simdjson/generic/ondemand/json_iterator.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/token_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +/**
    + * Iterates through JSON tokens, keeping track of depth and string buffer.
    + *
    + * @private This is not intended for external use.
    + */
    +class json_iterator {
    +protected:
    +  token_iterator token{};
    +  ondemand::parser *parser{};
    +  /**
    +   * Next free location in the string buffer.
    +   *
    +   * Used by raw_json_string::unescape() to have a place to unescape strings to.
    +   */
    +  uint8_t *_string_buf_loc{};
    +  /**
    +   * JSON error, if there is one.
    +   *
    +   * INCORRECT_TYPE and NO_SUCH_FIELD are *not* stored here, ever.
    +   *
    +   * PERF NOTE: we *hope* this will be elided into control flow, as it is only used (a) in the first
    +   * iteration of the loop, or (b) for the final iteration after a missing comma is found in ++. If
    +   * this is not elided, we should make sure it's at least not using up a register. Failing that,
    +   * we should store it in document so there's only one of them.
    +   */
    +  error_code error{SUCCESS};
    +  /**
    +   * Depth of the current token in the JSON.
    +   *
    +   * - 0 = finished with document
    +   * - 1 = document root value (could be [ or {, not yet known)
    +   * - 2 = , or } inside root array/object
    +   * - 3 = key or value inside root array/object.
    +   */
    +  depth_t _depth{};
    +  /**
    +   * Beginning of the document indexes.
    +   * Normally we have root == parser->implementation->structural_indexes.get()
    +   * but this may differ, especially in streaming mode (where we have several
    +   * documents);
    +   */
    +  token_position _root{};
    +  /**
    +   * Normally, a json_iterator operates over a single document, but in
    +   * some cases, we may have a stream of documents. This attribute is meant
    +   * as meta-data: the json_iterator works the same irrespective of the
    +   * value of this attribute.
    +   */
    +  bool _streaming{false};
    +
    +public:
    +  simdjson_inline json_iterator() noexcept = default;
    +  simdjson_inline json_iterator(json_iterator &&other) noexcept;
    +  simdjson_inline json_iterator &operator=(json_iterator &&other) noexcept;
    +  simdjson_inline explicit json_iterator(const json_iterator &other) noexcept = default;
    +  simdjson_inline json_iterator &operator=(const json_iterator &other) noexcept = default;
    +  /**
    +   * Skips a JSON value, whether it is a scalar, array or object.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code skip_child(depth_t parent_depth) noexcept;
    +
    +  /**
    +   * Tell whether the iterator is still at the start
    +   */
    +  simdjson_inline bool at_root() const noexcept;
    +
    +  /**
    +   * Tell whether we should be expected to run in streaming
    +   * mode (iterating over many documents). It is pure metadata
    +   * that does not affect how the iterator works. It is used by
    +   * start_root_array() and start_root_object().
    +   */
    +  simdjson_inline bool streaming() const noexcept;
    +
    +  /**
    +   * Get the root value iterator
    +   */
    +  simdjson_inline token_position root_position() const noexcept;
    +  /**
    +   * Assert that we are at the document depth (== 1)
    +   */
    +  simdjson_inline void assert_at_document_depth() const noexcept;
    +  /**
    +   * Assert that we are at the root of the document
    +   */
    +  simdjson_inline void assert_at_root() const noexcept;
    +
    +  /**
    +   * Tell whether the iterator is at the EOF mark
    +   */
    +  simdjson_inline bool at_end() const noexcept;
    +
    +  /**
    +   * Tell whether the iterator is live (has not been moved).
    +   */
    +  simdjson_inline bool is_alive() const noexcept;
    +
    +  /**
    +   * Abandon this iterator, setting depth to 0 (as if the document is finished).
    +   */
    +  simdjson_inline void abandon() noexcept;
    +
    +  /**
    +   * Advance the current token without modifying depth.
    +   */
    +  simdjson_inline const uint8_t *return_current_and_advance() noexcept;
    +
    +  /**
    +   * Returns true if there is a single token in the index (i.e., it is
    +   * a JSON with a scalar value such as a single number).
    +   *
    +   * @return whether there is a single token
    +   */
    +  simdjson_inline bool is_single_token() const noexcept;
    +
    +  /**
    +   * Assert that there are at least the given number of tokens left.
    +   *
    +   * Has no effect in release builds.
    +   */
    +  simdjson_inline void assert_more_tokens(uint32_t required_tokens=1) const noexcept;
    +  /**
    +   * Assert that the given position addresses an actual token (is within bounds).
    +   *
    +   * Has no effect in release builds.
    +   */
    +  simdjson_inline void assert_valid_position(token_position position) const noexcept;
    +  /**
    +   * Get the JSON text for a given token (relative).
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = next token, -1 = prev token.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek(int32_t delta=0) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for the current token (or relative).
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = next token, -1 = prev token.
    +   */
    +  simdjson_inline uint32_t peek_length(int32_t delta=0) const noexcept;
    +  /**
    +   * Get a pointer to the current location in the input buffer.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * You may be pointing outside of the input buffer: it is not generally
    +   * safe to dereference this pointer.
    +   */
    +  simdjson_inline const uint8_t *unsafe_pointer() const noexcept;
    +  /**
    +   * Get the JSON text for a given token.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param position The position of the token to retrieve.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek(token_position position) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for the current token (or relative).
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param position The position of the token to retrieve.
    +   */
    +  simdjson_inline uint32_t peek_length(token_position position) const noexcept;
    +  /**
    +   * Get the JSON text for the last token in the document.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek_last() const noexcept;
    +
    +  /**
    +   * Ascend one level.
    +   *
    +   * Validates that the depth - 1 == parent_depth.
    +   *
    +   * @param parent_depth the expected parent depth.
    +   */
    +  simdjson_inline void ascend_to(depth_t parent_depth) noexcept;
    +
    +  /**
    +   * Descend one level.
    +   *
    +   * Validates that the new depth == child_depth.
    +   *
    +   * @param child_depth the expected child depth.
    +   */
    +  simdjson_inline void descend_to(depth_t child_depth) noexcept;
    +  simdjson_inline void descend_to(depth_t child_depth, int32_t delta) noexcept;
    +
    +  /**
    +   * Get current depth.
    +   */
    +  simdjson_inline depth_t depth() const noexcept;
    +
    +  /**
    +   * Get current (writeable) location in the string buffer.
    +   */
    +  simdjson_inline uint8_t *&string_buf_loc() noexcept;
    +
    +  /**
    +   * Report an unrecoverable error, preventing further iteration.
    +   *
    +   * @param error The error to report. Must not be SUCCESS, UNINITIALIZED, INCORRECT_TYPE, or NO_SUCH_FIELD.
    +   * @param message An error message to report with the error.
    +   */
    +  simdjson_inline error_code report_error(error_code error, const char *message) noexcept;
    +
    +  /**
    +   * Log error, but don't stop iteration.
    +   * @param error The error to report. Must be INCORRECT_TYPE, or NO_SUCH_FIELD.
    +   * @param message An error message to report with the error.
    +   */
    +  simdjson_inline error_code optional_error(error_code error, const char *message) noexcept;
    +
    +  /**
    +   * Take an input in json containing max_len characters and attempt to copy it over to tmpbuf, a buffer with
    +   * N bytes of capacity. It will return false if N is too small (smaller than max_len) of if it is zero.
    +   * The buffer (tmpbuf) is padded with space characters.
    +   */
    +  simdjson_warn_unused simdjson_inline bool copy_to_buffer(const uint8_t *json, uint32_t max_len, uint8_t *tmpbuf, size_t N) noexcept;
    +
    +  simdjson_inline token_position position() const noexcept;
    +  /**
    +   * Write the raw_json_string to the string buffer and return a string_view.
    +   * Each raw_json_string should be unescaped once, or else the string buffer might
    +   * overflow.
    +   */
    +  simdjson_inline simdjson_result unescape(raw_json_string in, bool allow_replacement) noexcept;
    +  simdjson_inline simdjson_result unescape_wobbly(raw_json_string in) noexcept;
    +
    +  simdjson_inline void reenter_child(token_position position, depth_t child_depth) noexcept;
    +
    +  simdjson_inline error_code consume_character(char c) noexcept;
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  simdjson_inline token_position start_position(depth_t depth) const noexcept;
    +  simdjson_inline void set_start_position(depth_t depth, token_position position) noexcept;
    +#endif
    +
    +  /* Useful for debugging and logging purposes. */
    +  inline std::string to_string() const noexcept;
    +
    +  /**
    +   * Returns the current location in the document if in bounds.
    +   */
    +  inline simdjson_result current_location() const noexcept;
    +
    +  /**
    +   * Updates this json iterator so that it is back at the beginning of the document,
    +   * as if it had just been created.
    +   */
    +  inline void rewind() noexcept;
    +  /**
    +   * This checks whether the {,},[,] are balanced so that the document
    +   * ends with proper zero depth. This requires scanning the whole document
    +   * and it may be expensive. It is expected that it will be rarely called.
    +   * It does not attempt to match { with } and [ with ].
    +   */
    +  inline bool balanced() const noexcept;
    +protected:
    +  simdjson_inline json_iterator(const uint8_t *buf, ondemand::parser *parser) noexcept;
    +  /// The last token before the end
    +  simdjson_inline token_position last_position() const noexcept;
    +  /// The token *at* the end. This points at gibberish and should only be used for comparison.
    +  simdjson_inline token_position end_position() const noexcept;
    +  /// The end of the buffer.
    +  simdjson_inline token_position end() const noexcept;
    +
    +  friend class document;
    +  friend class document_stream;
    +  friend class object;
    +  friend class array;
    +  friend class value;
    +  friend class raw_json_string;
    +  friend class parser;
    +  friend class value_iterator;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, logger::log_level level, Args&&... args) noexcept;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, logger::log_level level, Args&&... args) noexcept;
    +}; // json_iterator
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public arm64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(arm64::ondemand::json_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H
    +/* end file simdjson/generic/ondemand/json_iterator.h for arm64 */
    +/* including simdjson/generic/ondemand/json_type.h for arm64: #include "simdjson/generic/ondemand/json_type.h" */
    +/* begin file simdjson/generic/ondemand/json_type.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/numberparsing.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +/**
    + * The type of a JSON value.
    + */
    +enum class json_type {
    +    // Start at 1 to catch uninitialized / default values more easily
    +    array=1, ///< A JSON array   ( [ 1, 2, 3 ... ] )
    +    object,  ///< A JSON object  ( { "a": 1, "b" 2, ... } )
    +    number,  ///< A JSON number  ( 1 or -2.3 or 4.5e6 ...)
    +    string,  ///< A JSON string  ( "a" or "hello world\n" ...)
    +    boolean, ///< A JSON boolean (true or false)
    +    null     ///< A JSON null    (null)
    +};
    +
    +/**
    + * A type representing a JSON number.
    + * The design of the struct is deliberately straight-forward. All
    + * functions return standard values with no error check.
    + */
    +struct number {
    +
    +  /**
    +   * return the automatically determined type of
    +   * the number: number_type::floating_point_number,
    +   * number_type::signed_integer or number_type::unsigned_integer.
    +   *
    +   *    enum class number_type {
    +   *        floating_point_number=1, /// a binary64 number
    +   *        signed_integer,          /// a signed integer that fits in a 64-bit word using two's complement
    +   *        unsigned_integer         /// a positive integer larger or equal to 1<<63
    +   *    };
    +   */
    +  simdjson_inline ondemand::number_type get_number_type() const noexcept;
    +  /**
    +   * return true if the automatically determined type of
    +   * the number is number_type::unsigned_integer.
    +   */
    +  simdjson_inline bool is_uint64() const noexcept;
    +  /**
    +   * return the value as a uint64_t, only valid if is_uint64() is true.
    +   */
    +  simdjson_inline uint64_t get_uint64() const noexcept;
    +  simdjson_inline operator uint64_t() const noexcept;
    +
    +  /**
    +   * return true if the automatically determined type of
    +   * the number is number_type::signed_integer.
    +   */
    +  simdjson_inline bool is_int64() const noexcept;
    +  /**
    +   * return the value as a int64_t, only valid if is_int64() is true.
    +   */
    +  simdjson_inline int64_t get_int64() const noexcept;
    +  simdjson_inline operator int64_t() const noexcept;
    +
    +
    +  /**
    +   * return true if the automatically determined type of
    +   * the number is number_type::floating_point_number.
    +   */
    +  simdjson_inline bool is_double() const noexcept;
    +  /**
    +   * return the value as a double, only valid if is_double() is true.
    +   */
    +  simdjson_inline double get_double() const noexcept;
    +  simdjson_inline operator double() const noexcept;
    +
    +  /**
    +   * Convert the number to a double. Though it always succeed, the conversion
    +   * may be lossy if the number cannot be represented exactly.
    +   */
    +  simdjson_inline double as_double() const noexcept;
    +
    +
    +protected:
    +  /**
    +   * The next block of declaration is designed so that we can call the number parsing
    +   * functions on a number type. They are protected and should never be used outside
    +   * of the core simdjson library.
    +   */
    +  friend class value_iterator;
    +  template
    +  friend error_code numberparsing::slow_float_parsing(simdjson_unused const uint8_t * src, W writer);
    +  template
    +  friend error_code numberparsing::write_float(const uint8_t *const src, bool negative, uint64_t i, const uint8_t * start_digits, size_t digit_count, int64_t exponent, W &writer);
    +  template
    +  friend error_code numberparsing::parse_number(const uint8_t *const src, W &writer);
    +  /** Store a signed 64-bit value to the number. */
    +  simdjson_inline void append_s64(int64_t value) noexcept;
    +  /** Store an unsigned 64-bit value to the number. */
    +  simdjson_inline void append_u64(uint64_t value) noexcept;
    +  /** Store a double value to the number. */
    +  simdjson_inline void append_double(double value) noexcept;
    +  /** Specifies that the value is a double, but leave it undefined. */
    +  simdjson_inline void skip_double() noexcept;
    +  /**
    +   * End of friend declarations.
    +   */
    +
    +  /**
    +   * Our attributes are a union type (size = 64 bits)
    +   * followed by a type indicator.
    +   */
    +  union {
    +    double floating_point_number;
    +    int64_t signed_integer;
    +    uint64_t unsigned_integer;
    +  } payload{0};
    +  number_type type{number_type::signed_integer};
    +};
    +
    +/**
    + * Write the JSON type to the output stream
    + *
    + * @param out The output stream.
    + * @param type The json_type.
    + */
    +inline std::ostream& operator<<(std::ostream& out, json_type type) noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +/**
    + * Send JSON type to an output stream.
    + *
    + * @param out The output stream.
    + * @param type The json_type.
    + * @throw simdjson_error if the result being printed has an error. If there is an error with the
    + *        underlying output stream, that error will be propagated (simdjson_error will not be
    + *        thrown).
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false);
    +#endif
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public arm64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(arm64::ondemand::json_type &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline ~simdjson_result() noexcept = default; ///< @private
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H
    +/* end file simdjson/generic/ondemand/json_type.h for arm64 */
    +/* including simdjson/generic/ondemand/raw_json_string.h for arm64: #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* begin file simdjson/generic/ondemand/raw_json_string.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +/**
    + * A string escaped per JSON rules, terminated with quote ("). They are used to represent
    + * unescaped keys inside JSON documents.
    + *
    + * (In other words, a pointer to the beginning of a string, just after the start quote, inside a
    + * JSON file.)
    + *
    + * This class is deliberately simplistic and has little functionality. You can
    + * compare a raw_json_string instance with an unescaped C string, but
    + * that is nearly all you can do.
    + *
    + * The raw_json_string is unescaped. If you wish to write an unescaped version of it to your own
    + * buffer, you may do so using the parser.unescape(string, buff) method, using an ondemand::parser
    + * instance. Doing so requires you to have a sufficiently large buffer.
    + *
    + * The raw_json_string instances originate typically from field instance which in turn represent
    + * key-value pairs from object instances. From a field instance, you get the raw_json_string
    + * instance by calling key(). You can, if you want a more usable string_view instance, call
    + * the unescaped_key() method on the field instance. You may also create a raw_json_string from
    + * any other string value, with the value.get_raw_json_string() method. Again, you can get
    + * a more usable string_view instance by calling get_string().
    + *
    + */
    +class raw_json_string {
    +public:
    +  /**
    +   * Create a new invalid raw_json_string.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline raw_json_string() noexcept = default;
    +
    +  /**
    +   * Create a new invalid raw_json_string pointed at the given location in the JSON.
    +   *
    +   * The given location must be just *after* the beginning quote (") in the JSON file.
    +   *
    +   * It *must* be terminated by a ", and be a valid JSON string.
    +   */
    +  simdjson_inline raw_json_string(const uint8_t * _buf) noexcept;
    +  /**
    +   * Get the raw pointer to the beginning of the string in the JSON (just after the ").
    +   *
    +   * It is possible for this function to return a null pointer if the instance
    +   * has outlived its existence.
    +   */
    +  simdjson_inline const char * raw() const noexcept;
    +
    +  /**
    +   * This compares the current instance to the std::string_view target: returns true if
    +   * they are byte-by-byte equal (no escaping is done) on target.size() characters,
    +   * and if the raw_json_string instance has a quote character at byte index target.size().
    +   * We never read more than length + 1 bytes in the raw_json_string instance.
    +   * If length is smaller than target.size(), this will return false.
    +   *
    +   * The std::string_view instance may contain any characters. However, the caller
    +   * is responsible for setting length so that length bytes may be read in the
    +   * raw_json_string.
    +   *
    +   * Performance: the comparison may be done using memcmp which may be efficient
    +   * for long strings.
    +   */
    +  simdjson_inline bool unsafe_is_equal(size_t length, std::string_view target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the std::string_view target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   * The std::string_view instance should not contain unescaped quote characters:
    +   * the caller is responsible for this check. See is_free_from_unescaped_quote.
    +   *
    +   * Performance: the comparison is done byte-by-byte which might be inefficient for
    +   * long strings.
    +   *
    +   * If target is a compile-time constant, and your compiler likes you,
    +   * you should be able to do the following without performance penalty...
    +   *
    +   *   static_assert(raw_json_string::is_free_from_unescaped_quote(target), "");
    +   *   s.unsafe_is_equal(target);
    +   */
    +  simdjson_inline bool unsafe_is_equal(std::string_view target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the C string target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   * The provided C string should not contain an unescaped quote character:
    +   * the caller is responsible for this check. See is_free_from_unescaped_quote.
    +   *
    +   * If target is a compile-time constant, and your compiler likes you,
    +   * you should be able to do the following without performance penalty...
    +   *
    +   *   static_assert(raw_json_string::is_free_from_unescaped_quote(target), "");
    +   *   s.unsafe_is_equal(target);
    +   */
    +  simdjson_inline bool unsafe_is_equal(const char* target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the std::string_view target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   */
    +  simdjson_inline bool is_equal(std::string_view target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the C string target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   */
    +  simdjson_inline bool is_equal(const char* target) const noexcept;
    +
    +  /**
    +   * Returns true if target is free from unescaped quote. If target is known at
    +   * compile-time, we might expect the computation to happen at compile time with
    +   * many compilers (not all!).
    +   */
    +  static simdjson_inline bool is_free_from_unescaped_quote(std::string_view target) noexcept;
    +  static simdjson_inline bool is_free_from_unescaped_quote(const char* target) noexcept;
    +
    +private:
    +
    +
    +  /**
    +   * This will set the inner pointer to zero, effectively making
    +   * this instance unusable.
    +   */
    +  simdjson_inline void consume() noexcept { buf = nullptr; }
    +
    +  /**
    +   * Checks whether the inner pointer is non-null and thus usable.
    +   */
    +  simdjson_inline simdjson_warn_unused bool alive() const noexcept { return buf != nullptr; }
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc.
    +   * The result will be a valid UTF-8.
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid until the next parse() call on the parser.
    +   *
    +   * @param iter A json_iterator, which contains a buffer where the string will be written.
    +   * @param allow_replacement Whether we allow replacement of invalid surrogate pairs.
    +   */
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape(json_iterator &iter, bool allow_replacement) const noexcept;
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc.
    +   * The result may not be a valid UTF-8. https://simonsapin.github.io/wtf-8/
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid until the next parse() call on the parser.
    +   *
    +   * @param iter A json_iterator, which contains a buffer where the string will be written.
    +   */
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape_wobbly(json_iterator &iter) const noexcept;
    +  const uint8_t * buf{};
    +  friend class object;
    +  friend class field;
    +  friend class parser;
    +  friend struct simdjson_result;
    +};
    +
    +simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &, const raw_json_string &) noexcept;
    +
    +/**
    + * Comparisons between raw_json_string and std::string_view instances are potentially unsafe: the user is responsible
    + * for providing a string with no unescaped quote. Note that unescaped quotes cannot be present in valid JSON strings.
    + */
    +simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept;
    +simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept;
    +simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept;
    +simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept;
    +
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public arm64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(arm64::ondemand::raw_json_string &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline ~simdjson_result() noexcept = default; ///< @private
    +
    +  simdjson_inline simdjson_result raw() const noexcept;
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape(arm64::ondemand::json_iterator &iter, bool allow_replacement) const noexcept;
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape_wobbly(arm64::ondemand::json_iterator &iter) const noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H
    +/* end file simdjson/generic/ondemand/raw_json_string.h for arm64 */
    +/* including simdjson/generic/ondemand/parser.h for arm64: #include "simdjson/generic/ondemand/parser.h" */
    +/* begin file simdjson/generic/ondemand/parser.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_PARSER_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +/**
    + * The default batch size for document_stream instances for this On Demand kernel.
    + * Note that different On Demand kernel may use a different DEFAULT_BATCH_SIZE value
    + * in the future.
    + */
    +static constexpr size_t DEFAULT_BATCH_SIZE = 1000000;
    +/**
    + * Some adversary might try to set the batch size to 0 or 1, which might cause problems.
    + * We set a minimum of 32B since anything else is highly likely to be an error. In practice,
    + * most users will want a much larger batch size.
    + *
    + * All non-negative MINIMAL_BATCH_SIZE values should be 'safe' except that, obviously, no JSON
    + * document can ever span 0 or 1 byte and that very large values would create memory allocation issues.
    + */
    +static constexpr size_t MINIMAL_BATCH_SIZE = 32;
    +
    +/**
    + * A JSON fragment iterator.
    + *
    + * This holds the actual iterator as well as the buffer for writing strings.
    + */
    +class parser {
    +public:
    +  /**
    +   * Create a JSON parser.
    +   *
    +   * The new parser will have zero capacity.
    +   */
    +  inline explicit parser(size_t max_capacity = SIMDJSON_MAXSIZE_BYTES) noexcept;
    +
    +  inline parser(parser &&other) noexcept = default;
    +  simdjson_inline parser(const parser &other) = delete;
    +  simdjson_inline parser &operator=(const parser &other) = delete;
    +  simdjson_inline parser &operator=(parser &&other) noexcept = default;
    +
    +  /** Deallocate the JSON parser. */
    +  inline ~parser() noexcept = default;
    +
    +  /**
    +   * Start iterating an on-demand JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   document doc = parser.iterate(json);
    +   *
    +   * It is expected that the content is a valid UTF-8 file, containing a valid JSON document.
    +   * Otherwise the iterate method may return an error. In particular, the whole input should be
    +   * valid: we do not attempt to tolerate incorrect content either before or after a JSON
    +   * document. If there is a UTF-8 BOM, the parser skips it.
    +   *
    +   * ### IMPORTANT: Validate what you use
    +   *
    +   * Calling iterate on an invalid JSON document may not immediately trigger an error. The call to
    +   * iterate does not parse and validate the whole document.
    +   *
    +   * ### IMPORTANT: Buffer Lifetime
    +   *
    +   * Because parsing is done while you iterate, you *must* keep the JSON buffer around at least as
    +   * long as the document iteration.
    +   *
    +   * ### IMPORTANT: Document Lifetime
    +   *
    +   * Only one iteration at a time can happen per parser, and the parser *must* be kept alive during
    +   * iteration to ensure intermediate buffers can be accessed. Any document must be destroyed before
    +   * you call parse() again or destroy the parser.
    +   *
    +   * ### REQUIRED: Buffer Padding
    +   *
    +   * The buffer must have at least SIMDJSON_PADDING extra allocated bytes. It does not matter what
    +   * those bytes are initialized to, as long as they are allocated. These bytes will be read: if you
    +   * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the
    +   * SIMDJSON_PADDING bytes to avoid runtime warnings.
    +   *
    +   * @param json The JSON to parse.
    +   * @param len The length of the JSON.
    +   * @param capacity The number of bytes allocated in the JSON (must be at least len+SIMDJSON_PADDING).
    +   *
    +   * @return The document, or an error:
    +   *         - INSUFFICIENT_PADDING if the input has less than SIMDJSON_PADDING extra bytes.
    +   *         - MEMALLOC if realloc_if_needed the parser does not have enough capacity, and memory
    +   *           allocation fails.
    +   *         - EMPTY if the document is all whitespace.
    +   *         - UTF8_ERROR if the document is not valid UTF-8.
    +   *         - UNESCAPED_CHARS if a string contains control characters that must be escaped
    +   *         - UNCLOSED_STRING if there is an unclosed string in the document.
    +   */
    +  simdjson_warn_unused simdjson_result iterate(padded_string_view json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const char *json, size_t len, size_t capacity) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const uint8_t *json, size_t len, size_t capacity) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(std::string_view json, size_t capacity) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const std::string &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(std::string &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(padded_string &&json) & noexcept = delete;
    +
    +  /**
    +   * @private
    +   *
    +   * Start iterating an on-demand JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   json_iterator doc = parser.iterate(json);
    +   *
    +   * ### IMPORTANT: Buffer Lifetime
    +   *
    +   * Because parsing is done while you iterate, you *must* keep the JSON buffer around at least as
    +   * long as the document iteration.
    +   *
    +   * ### IMPORTANT: Document Lifetime
    +   *
    +   * Only one iteration at a time can happen per parser, and the parser *must* be kept alive during
    +   * iteration to ensure intermediate buffers can be accessed. Any document must be destroyed before
    +   * you call parse() again or destroy the parser.
    +   *
    +   * The ondemand::document instance holds the iterator. The document must remain in scope
    +   * while you are accessing instances of ondemand::value, ondemand::object, ondemand::array.
    +   *
    +   * ### REQUIRED: Buffer Padding
    +   *
    +   * The buffer must have at least SIMDJSON_PADDING extra allocated bytes. It does not matter what
    +   * those bytes are initialized to, as long as they are allocated. These bytes will be read: if you
    +   * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the
    +   * SIMDJSON_PADDING bytes to avoid runtime warnings.
    +   *
    +   * @param json The JSON to parse.
    +   *
    +   * @return The iterator, or an error:
    +   *         - INSUFFICIENT_PADDING if the input has less than SIMDJSON_PADDING extra bytes.
    +   *         - MEMALLOC if realloc_if_needed the parser does not have enough capacity, and memory
    +   *           allocation fails.
    +   *         - EMPTY if the document is all whitespace.
    +   *         - UTF8_ERROR if the document is not valid UTF-8.
    +   *         - UNESCAPED_CHARS if a string contains control characters that must be escaped
    +   *         - UNCLOSED_STRING if there is an unclosed string in the document.
    +   */
    +  simdjson_warn_unused simdjson_result iterate_raw(padded_string_view json) & noexcept;
    +
    +
    +  /**
    +   * Parse a buffer containing many JSON documents.
    +   *
    +   *   auto json = R"({ "foo": 1 } { "foo": 2 } { "foo": 3 } )"_padded;
    +   *   ondemand::parser parser;
    +   *   ondemand::document_stream docs = parser.iterate_many(json);
    +   *   for (auto & doc : docs) {
    +   *     std::cout << doc["foo"] << std::endl;
    +   *   }
    +   *   // Prints 1 2 3
    +   *
    +   * No copy of the input buffer is made.
    +   *
    +   * The function is lazy: it may be that no more than one JSON document at a time is parsed.
    +   *
    +   * The caller is responsabile to ensure that the input string data remains unchanged and is
    +   * not deleted during the loop.
    +   *
    +   * ### Format
    +   *
    +   * The buffer must contain a series of one or more JSON documents, concatenated into a single
    +   * buffer, separated by ASCII whitespace. It effectively parses until it has a fully valid document,
    +   * then starts parsing the next document at that point. (It does this with more parallelism and
    +   * lookahead than you might think, though.)
    +   *
    +   * documents that consist of an object or array may omit the whitespace between them, concatenating
    +   * with no separator. Documents that consist of a single primitive (i.e. documents that are not
    +   * arrays or objects) MUST be separated with ASCII whitespace.
    +   *
    +   * The characters inside a JSON document, and between JSON documents, must be valid Unicode (UTF-8).
    +   * If there is a UTF-8 BOM, the parser skips it.
    +   *
    +   * The documents must not exceed batch_size bytes (by default 1MB) or they will fail to parse.
    +   * Setting batch_size to excessively large or excessively small values may impact negatively the
    +   * performance.
    +   *
    +   * ### REQUIRED: Buffer Padding
    +   *
    +   * The buffer must have at least SIMDJSON_PADDING extra allocated bytes. It does not matter what
    +   * those bytes are initialized to, as long as they are allocated. These bytes will be read: if you
    +   * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the
    +   * SIMDJSON_PADDING bytes to avoid runtime warnings.
    +   *
    +   * ### Threads
    +   *
    +   * When compiled with SIMDJSON_THREADS_ENABLED, this method will use a single thread under the
    +   * hood to do some lookahead.
    +   *
    +   * ### Parser Capacity
    +   *
    +   * If the parser's current capacity is less than batch_size, it will allocate enough capacity
    +   * to handle it (up to max_capacity).
    +   *
    +   * @param buf The concatenated JSON to parse.
    +   * @param len The length of the concatenated JSON.
    +   * @param batch_size The batch size to use. MUST be larger than the largest document. The sweet
    +   *                   spot is cache-related: small enough to fit in cache, yet big enough to
    +   *                   parse as many documents as possible in one tight loop.
    +   *                   Defaults to 10MB, which has been a reasonable sweet spot in our tests.
    +   * @param allow_comma_separated (defaults on false) This allows a mode where the documents are
    +   *                   separated by commas instead of whitespace. It comes with a performance
    +   *                   penalty because the entire document is indexed at once (and the document must be
    +   *                   less than 4 GB), and there is no multithreading. In this mode, the batch_size parameter
    +   *                   is effectively ignored, as it is set to at least the document size.
    +   * @return The stream, or an error. An empty input will yield 0 documents rather than an EMPTY error. Errors:
    +   *         - MEMALLOC if the parser does not have enough capacity and memory allocation fails
    +   *         - CAPACITY if the parser does not have enough capacity and batch_size > max_capacity.
    +   *         - other json errors if parsing fails. You should not rely on these errors to always the same for the
    +   *           same document: they may vary under runtime dispatch (so they may vary depending on your system and hardware).
    +   */
    +  inline simdjson_result iterate_many(const uint8_t *buf, size_t len, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */
    +  inline simdjson_result iterate_many(const char *buf, size_t len, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */
    +  inline simdjson_result iterate_many(const std::string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  inline simdjson_result iterate_many(const std::string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe
    +  /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */
    +  inline simdjson_result iterate_many(const padded_string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  inline simdjson_result iterate_many(const padded_string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe
    +
    +  /** @private We do not want to allow implicit conversion from C string to std::string. */
    +  simdjson_result iterate_many(const char *buf, size_t batch_size = DEFAULT_BATCH_SIZE) noexcept = delete;
    +
    +  /** The capacity of this parser (the largest document it can process). */
    +  simdjson_inline size_t capacity() const noexcept;
    +  /** The maximum capacity of this parser (the largest document it is allowed to process). */
    +  simdjson_inline size_t max_capacity() const noexcept;
    +  simdjson_inline void set_max_capacity(size_t max_capacity) noexcept;
    +  /**
    +   * The maximum depth of this parser (the most deeply nested objects and arrays it can process).
    +   * This parameter is only relevant when the macro SIMDJSON_DEVELOPMENT_CHECKS is set to true.
    +   * The document's instance current_depth() method should be used to monitor the parsing
    +   * depth and limit it if desired.
    +   */
    +  simdjson_inline size_t max_depth() const noexcept;
    +
    +  /**
    +   * Ensure this parser has enough memory to process JSON documents up to `capacity` bytes in length
    +   * and `max_depth` depth.
    +   *
    +   * The max_depth parameter is only relevant when the macro SIMDJSON_DEVELOPMENT_CHECKS is set to true.
    +   * The document's instance current_depth() method should be used to monitor the parsing
    +   * depth and limit it if desired.
    +   *
    +   * @param capacity The new capacity.
    +   * @param max_depth The new max_depth. Defaults to DEFAULT_MAX_DEPTH.
    +   * @return The error, if there is one.
    +   */
    +  simdjson_warn_unused error_code allocate(size_t capacity, size_t max_depth=DEFAULT_MAX_DEPTH) noexcept;
    +
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  /**
    +   * The parser instance can use threads when they are available to speed up some
    +   * operations. It is enabled by default. Changing this attribute will change the
    +   * behavior of the parser for future operations.
    +   */
    +  bool threaded{true};
    +  #endif
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc. to a user-provided buffer.
    +   * The result must be valid UTF-8.
    +   * The provided pointer is advanced to the end of the string by reference, and a string_view instance
    +   * is returned. You can ensure that your buffer is large enough by allocating a block of memory at least
    +   * as large as the input JSON plus SIMDJSON_PADDING and then unescape all strings to this one buffer.
    +   *
    +   * This unescape function is a low-level function. If you want a more user-friendly approach, you should
    +   * avoid raw_json_string instances (e.g., by calling unescaped_key() instead of key() or get_string()
    +   * instead of get_raw_json_string()).
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid as long as the bytes in dst.
    +   *
    +   * @param raw_json_string input
    +   * @param dst A pointer to a buffer at least large enough to write this string as well as
    +   *            an additional SIMDJSON_PADDING bytes.
    +   * @param allow_replacement Whether we allow a replacement if the input string contains unmatched surrogate pairs.
    +   * @return A string_view pointing at the unescaped string in dst
    +   * @error STRING_ERROR if escapes are incorrect.
    +   */
    +  simdjson_inline simdjson_result unescape(raw_json_string in, uint8_t *&dst, bool allow_replacement = false) const noexcept;
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc. to a user-provided buffer.
    +   * The result may not be valid UTF-8. See https://simonsapin.github.io/wtf-8/
    +   * The provided pointer is advanced to the end of the string by reference, and a string_view instance
    +   * is returned. You can ensure that your buffer is large enough by allocating a block of memory at least
    +   * as large as the input JSON plus SIMDJSON_PADDING and then unescape all strings to this one buffer.
    +   *
    +   * This unescape function is a low-level function. If you want a more user-friendly approach, you should
    +   * avoid raw_json_string instances (e.g., by calling unescaped_key() instead of key() or get_string()
    +   * instead of get_raw_json_string()).
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid as long as the bytes in dst.
    +   *
    +   * @param raw_json_string input
    +   * @param dst A pointer to a buffer at least large enough to write this string as well as
    +   *            an additional SIMDJSON_PADDING bytes.
    +   * @return A string_view pointing at the unescaped string in dst
    +   * @error STRING_ERROR if escapes are incorrect.
    +   */
    +  simdjson_inline simdjson_result unescape_wobbly(raw_json_string in, uint8_t *&dst) const noexcept;
    +
    +private:
    +  /** @private [for benchmarking access] The implementation to use */
    +  std::unique_ptr implementation{};
    +  size_t _capacity{0};
    +  size_t _max_capacity;
    +  size_t _max_depth{DEFAULT_MAX_DEPTH};
    +  std::unique_ptr string_buf{};
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  std::unique_ptr start_positions{};
    +#endif
    +
    +  friend class json_iterator;
    +  friend class document_stream;
    +};
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public arm64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(arm64::ondemand::parser &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_H
    +/* end file simdjson/generic/ondemand/parser.h for arm64 */
    +
    +// All other declarations
    +/* including simdjson/generic/ondemand/array.h for arm64: #include "simdjson/generic/ondemand/array.h" */
    +/* begin file simdjson/generic/ondemand/array.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +/**
    + * A forward-only JSON array.
    + */
    +class array {
    +public:
    +  /**
    +   * Create a new invalid array.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline array() noexcept = default;
    +
    +  /**
    +   * Begin array iteration.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result begin() noexcept;
    +  /**
    +   * Sentinel representing the end of the array.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result end() noexcept;
    +  /**
    +   * This method scans the array and counts the number of elements.
    +   * The count_elements method should always be called before you have begun
    +   * iterating through the array: it is expected that you are pointing at
    +   * the beginning of the array.
    +   * The runtime complexity is linear in the size of the array. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an array is empty, it is more performant to use
    +   * the is_empty() method.
    +   */
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  /**
    +   * This method scans the beginning of the array and checks whether the
    +   * array is empty.
    +   * The runtime complexity is constant time. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   */
    +  simdjson_inline simdjson_result is_empty() & noexcept;
    +  /**
    +   * Reset the iterator so that we are pointing back at the
    +   * beginning of the array. You should still consume values only once even if you
    +   * can iterate through the array more than once. If you unescape a string
    +   * within the array more than once, you have unsafe code. Note that rewinding
    +   * an array means that you may need to reparse it anew: it is not a free
    +   * operation.
    +   *
    +   * @returns true if the array contains some elements (not empty)
    +   */
    +  inline simdjson_result reset() & noexcept;
    +  /**
    +   * Get the value associated with the given JSON pointer.  We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard, interpreting the current node
    +   * as the root of its own JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"([ { "foo": { "a": [ 10, 20, 30 ] }} ])"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/0/foo/a/1") == 20
    +   *
    +   * Note that at_pointer() called on the document automatically calls the document's rewind
    +   * method between each call. It invalidates all previously accessed arrays, objects and values
    +   * that have not been consumed. Yet it is not the case when calling at_pointer on an array
    +   * instance: there is no rewind and no invalidation.
    +   *
    +   * You may only call at_pointer on an array after it has been created, but before it has
    +   * been first accessed. When calling at_pointer on an array, the pointer is advanced to
    +   * the location indicated by the JSON pointer (in case of success). It is no longer possible
    +   * to call at_pointer on the same array.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching.
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   */
    +  inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  /**
    +   * Consumes the array and returns a string_view instance corresponding to the
    +   * array as represented in JSON. It points inside the original document.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +  /**
    +   * Get the value at the given index. This function has linear-time complexity.
    +   * This function should only be called once on an array instance since the array iterator is not reset between each call.
    +   *
    +   * @return The value at the given index, or:
    +   *         - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
    +   */
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +protected:
    +  /**
    +   * Go to the end of the array, no matter where you are right now.
    +   */
    +  simdjson_inline error_code consume() noexcept;
    +
    +  /**
    +   * Begin array iteration.
    +   *
    +   * @param iter The iterator. Must be where the initial [ is expected. Will be *moved* into the
    +   *        resulting array.
    +   * @error INCORRECT_TYPE if the iterator is not at [.
    +   */
    +  static simdjson_inline simdjson_result start(value_iterator &iter) noexcept;
    +  /**
    +   * Begin array iteration from the root.
    +   *
    +   * @param iter The iterator. Must be where the initial [ is expected. Will be *moved* into the
    +   *        resulting array.
    +   * @error INCORRECT_TYPE if the iterator is not at [.
    +   * @error TAPE_ERROR if there is no closing ] at the end of the document.
    +   */
    +  static simdjson_inline simdjson_result start_root(value_iterator &iter) noexcept;
    +  /**
    +   * Begin array iteration.
    +   *
    +   * This version of the method should be called after the initial [ has been verified, and is
    +   * intended for use by switch statements that check the type of a value.
    +   *
    +   * @param iter The iterator. Must be after the initial [. Will be *moved* into the resulting array.
    +   */
    +  static simdjson_inline simdjson_result started(value_iterator &iter) noexcept;
    +
    +  /**
    +   * Create an array at the given Internal array creation. Call array::start() or array::started() instead of this.
    +   *
    +   * @param iter The iterator. Must either be at the start of the first element with iter.is_alive()
    +   *        == true, or past the [] with is_alive() == false if the array is empty. Will be *moved*
    +   *        into the resulting array.
    +   */
    +  simdjson_inline array(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Iterator marking current position.
    +   *
    +   * iter.is_alive() == false indicates iteration is complete.
    +   */
    +  value_iterator iter{};
    +
    +  friend class value;
    +  friend class document;
    +  friend struct simdjson_result;
    +  friend struct simdjson_result;
    +  friend class array_iterator;
    +};
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public arm64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(arm64::ondemand::array &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result begin() noexcept;
    +  simdjson_inline simdjson_result end() noexcept;
    +  inline simdjson_result count_elements() & noexcept;
    +  inline simdjson_result is_empty() & noexcept;
    +  inline simdjson_result reset() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_H
    +/* end file simdjson/generic/ondemand/array.h for arm64 */
    +/* including simdjson/generic/ondemand/array_iterator.h for arm64: #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* begin file simdjson/generic/ondemand/array_iterator.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +/**
    + * A forward-only JSON array.
    + *
    + * This is an input_iterator, meaning:
    + * - It is forward-only
    + * - * must be called exactly once per element.
    + * - ++ must be called exactly once in between each * (*, ++, *, ++, * ...)
    + */
    +class array_iterator {
    +public:
    +  /** Create a new, invalid array iterator. */
    +  simdjson_inline array_iterator() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  /**
    +   * Get the current element.
    +   *
    +   * Part of the std::iterator interface.
    +   */
    +  simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  /**
    +   * Check if we are at the end of the JSON.
    +   *
    +   * Part of the std::iterator interface.
    +   *
    +   * @return true if there are no more elements in the JSON array.
    +   */
    +  simdjson_inline bool operator==(const array_iterator &) const noexcept;
    +  /**
    +   * Check if there are more elements in the JSON array.
    +   *
    +   * Part of the std::iterator interface.
    +   *
    +   * @return true if there are more elements in the JSON array.
    +   */
    +  simdjson_inline bool operator!=(const array_iterator &) const noexcept;
    +  /**
    +   * Move to the next element.
    +   *
    +   * Part of the std::iterator interface.
    +   */
    +  simdjson_inline array_iterator &operator++() noexcept;
    +
    +private:
    +  value_iterator iter{};
    +
    +  simdjson_inline array_iterator(const value_iterator &iter) noexcept;
    +
    +  friend class array;
    +  friend class value;
    +  friend struct simdjson_result;
    +};
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public arm64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(arm64::ondemand::array_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  simdjson_inline bool operator==(const simdjson_result &) const noexcept;
    +  simdjson_inline bool operator!=(const simdjson_result &) const noexcept;
    +  simdjson_inline simdjson_result &operator++() noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H
    +/* end file simdjson/generic/ondemand/array_iterator.h for arm64 */
    +/* including simdjson/generic/ondemand/document.h for arm64: #include "simdjson/generic/ondemand/document.h" */
    +/* begin file simdjson/generic/ondemand/document.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +/**
    + * A JSON document. It holds a json_iterator instance.
    + *
    + * Used by tokens to get text, and string buffer location.
    + *
    + * You must keep the document around during iteration.
    + */
    +class document {
    +public:
    +  /**
    +   * Create a new invalid document.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline document() noexcept = default;
    +  simdjson_inline document(const document &other) noexcept = delete; // pass your documents by reference, not by copy
    +  simdjson_inline document(document &&other) noexcept = default;
    +  simdjson_inline document &operator=(const document &other) noexcept = delete;
    +  simdjson_inline document &operator=(document &&other) noexcept = default;
    +
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @returns INCORRECT_TYPE If the JSON value is not an array.
    +   */
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   */
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  /**
    +   * Cast this JSON value (inside string) to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  /**
    +   * Cast this JSON value (inside string) to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a double.
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Important: Calling get_string() twice on the same document is an error.
    +   *
    +   * @param Whether to allow a replacement character for unmatched surrogate pairs.
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  /**
    +   * Attempts to fill the provided std::string reference with the parsed value of the current string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Important: a value should be consumed once. Calling get_string() twice on the same value
    +   * is an error.
    +   *
    +   * Performance: This method may be slower than get_string() or get_string(bool) because it may need to allocate memory.
    +   * We recommend you avoid allocating an std::string unless you need to.
    +   *
    +   * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS.
    +   */
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is not guaranteed to be valid UTF-8. See https://simonsapin.github.io/wtf-8/
    +   *
    +   * Important: Calling get_wobbly_string() twice on the same document is an error.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @returns INCORRECT_TYPE if the JSON value is not true or false.
    +   */
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  /**
    +   * Cast this JSON value to a value when the document is an object or an array.
    +   *
    +   * You must not have begun iterating through the object or array. When
    +   * SIMDJSON_DEVELOPMENT_CHECKS is set to 1 (which is the case when building in Debug mode
    +   * by default), and you have already begun iterating,
    +   * you will get an OUT_OF_ORDER_ITERATION error. If you have begun iterating, you can use
    +   * rewind() to reset the document to its initial state before calling this method.
    +   *
    +   * @returns A value if a JSON array or object cannot be found.
    +   * @returns SCALAR_DOCUMENT_AS_VALUE error is the document is a scalar (see is_scalar() function).
    +   */
    +  simdjson_inline simdjson_result get_value() noexcept;
    +
    +  /**
    +   * Checks if this JSON value is null.  If and only if the value is
    +   * null, then it is consumed (we advance). If we find a token that
    +   * begins with 'n' but is not 'null', then an error is returned.
    +   *
    +   * @returns Whether the value is null.
    +   * @returns INCORRECT_TYPE If the JSON value begins with 'n' and is not 'null'.
    +   */
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool
    +   *
    +   * You may use get_double(), get_bool(), get_uint64(), get_int64(),
    +   * get_object(), get_array(), get_raw_json_string(), or get_string() instead.
    +   *
    +   * @returns A value of the given type, parsed from the JSON.
    +   * @returns INCORRECT_TYPE If the JSON value is not the given type.
    +   */
    +  template simdjson_inline simdjson_result get() & noexcept {
    +    // Unless the simdjson library provides an inline implementation, calling this method should
    +    // immediately fail.
    +    static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. "
    +      "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
    +      "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), "
    +      " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template.");
    +  }
    +  /** @overload template simdjson_result get() & noexcept */
    +  template simdjson_inline simdjson_result get() && noexcept {
    +    // Unless the simdjson library provides an inline implementation, calling this method should
    +    // immediately fail.
    +    static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. "
    +      "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
    +      "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), "
    +      " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template.");
    +  }
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool, value
    +   *
    +   * Be mindful that the document instance must remain in scope while you are accessing object, array and value instances.
    +   *
    +   * @param out This is set to a value of the given type, parsed from the JSON. If there is an error, this may not be initialized.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   * @returns SUCCESS If the parse succeeded and the out parameter was set to the value.
    +   */
    +  template simdjson_inline error_code get(T &out) & noexcept;
    +  /** @overload template error_code get(T &out) & noexcept */
    +  template simdjson_inline error_code get(T &out) && noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an array.
    +   */
    +  simdjson_inline operator array() & noexcept(false);
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an object.
    +   */
    +  simdjson_inline operator object() & noexcept(false);
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline operator int64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline operator double() noexcept(false);
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator raw_json_string() noexcept(false);
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not true or false.
    +   */
    +  simdjson_inline operator bool() noexcept(false);
    +  /**
    +   * Cast this JSON value to a value when the document is an object or an array.
    +   *
    +   * You must not have begun iterating through the object or array. When
    +   * SIMDJSON_DEVELOPMENT_CHECKS is defined, and you have already begun iterating,
    +   * you will get an OUT_OF_ORDER_ITERATION error. If you have begun iterating, you can use
    +   * rewind() to reset the document to its initial state before calling this method.
    +   *
    +   * @returns A value value if a JSON array or object cannot be found.
    +   * @exception SCALAR_DOCUMENT_AS_VALUE error is the document is a scalar (see is_scalar() function).
    +   */
    +  simdjson_inline operator value() noexcept(false);
    +#endif
    +  /**
    +   * This method scans the array and counts the number of elements.
    +   * The count_elements method should always be called before you have begun
    +   * iterating through the array: it is expected that you are pointing at
    +   * the beginning of the array.
    +   * The runtime complexity is linear in the size of the array. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   */
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +   /**
    +   * This method scans the object and counts the number of key-value pairs.
    +   * The count_fields method should always be called before you have begun
    +   * iterating through the object: it is expected that you are pointing at
    +   * the beginning of the object.
    +   * The runtime complexity is linear in the size of the object. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an object is empty, it is more performant to use
    +   * the is_empty() method.
    +   */
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  /**
    +   * Get the value at the given index in the array. This function has linear-time complexity.
    +   * This function should only be called once on an array instance since the array iterator is not reset between each call.
    +   *
    +   * @return The value at the given index, or:
    +   *         - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
    +   */
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  /**
    +   * Begin array iteration.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  /**
    +   * Sentinel representing the end of the array.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result end() & noexcept;
    +
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   *
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. E.g., the array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to
    +   * a key a single time. Doing object["mykey"].to_string()and then again object["mykey"].to_string()
    +   * is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. E.g., the array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to a key
    +   * a single time. Doing object["mykey"].to_string() and then again object["mykey"].to_string()
    +   * is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +
    +  /**
    +   * Get the type of this JSON value. It does not validate or consume the value.
    +   * E.g., you must still call "is_null()" to check that a value is null even if
    +   * "type()" returns json_type::null.
    +   *
    +   * NOTE: If you're only expecting a value to be one type (a typical case), it's generally
    +   * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just
    +   * let it throw an exception).
    +   *
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result type() noexcept;
    +
    +  /**
    +   * Checks whether the document is a scalar (string, number, null, Boolean).
    +   * Returns false when there it is an array or object.
    +   *
    +   * @returns true if the type is string, number, null, Boolean
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +
    +  /**
    +   * Checks whether the document is a negative number.
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline bool is_negative() noexcept;
    +  /**
    +   * Checks whether the document is an integer number. Note that
    +   * this requires to partially parse the number string. If
    +   * the value is determined to be an integer, it may still
    +   * not parse properly as an integer in subsequent steps
    +   * (e.g., it might overflow).
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  /**
    +   * Determine the number type (integer or floating-point number) as quickly
    +   * as possible. This function does not fully validate the input. It is
    +   * useful when you only need to classify the numbers, without parsing them.
    +   *
    +   * If you are planning to retrieve the value or you need full validation,
    +   * consider using the get_number() method instead: it will fully parse
    +   * and validate the input, and give you access to the type:
    +   * get_number().get_number_type().
    +   *
    +   * get_number_type() is number_type::unsigned_integer if we have
    +   * an integer greater or equal to 9223372036854775808
    +   * get_number_type() is number_type::signed_integer if we have an
    +   * integer that is less than 9223372036854775808
    +   * Otherwise, get_number_type() has value number_type::floating_point_number
    +   *
    +   * This function requires processing the number string, but it is expected
    +   * to be faster than get_number().get_number_type() because it is does not
    +   * parse the number value.
    +   *
    +   * @returns the type of the number
    +   */
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +
    +  /**
    +   * Attempt to parse an ondemand::number. An ondemand::number may
    +   * contain an integer value or a floating-point value, the simdjson
    +   * library will autodetect the type. Thus it is a dynamically typed
    +   * number. Before accessing the value, you must determine the detected
    +   * type.
    +   *
    +   * number.get_number_type() is number_type::signed_integer if we have
    +   * an integer in [-9223372036854775808,9223372036854775808)
    +   * You can recover the value by calling number.get_int64() and you
    +   * have that number.is_int64() is true.
    +   *
    +   * number.get_number_type() is number_type::unsigned_integer if we have
    +   * an integer in [9223372036854775808,18446744073709551616)
    +   * You can recover the value by calling number.get_uint64() and you
    +   * have that number.is_uint64() is true.
    +   *
    +   * Otherwise, number.get_number_type() has value number_type::floating_point_number
    +   * and we have a binary64 number.
    +   * You can recover the value by calling number.get_double() and you
    +   * have that number.is_double() is true.
    +   *
    +   * You must check the type before accessing the value: it is an error
    +   * to call "get_int64()" when number.get_number_type() is not
    +   * number_type::signed_integer and when number.is_int64() is false.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept;
    +
    +  /**
    +   * Get the raw JSON for this token.
    +   *
    +   * The string_view will always point into the input buffer.
    +   *
    +   * The string_view will start at the beginning of the token, and include the entire token
    +   * *as well as all spaces until the next token (or EOF).* This means, for example, that a
    +   * string token always begins with a " and is always terminated by the final ", possibly
    +   * followed by a number of spaces.
    +   *
    +   * The string_view is *not* null-terminated. If this is a scalar (string, number,
    +   * boolean, or null), the character after the end of the string_view may be the padded buffer.
    +   *
    +   * Tokens include:
    +   * - {
    +   * - [
    +   * - "a string (possibly with UTF-8 or backslashed characters like \\\")".
    +   * - -1.2e-100
    +   * - true
    +   * - false
    +   * - null
    +   */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +
    +  /**
    +   * Reset the iterator inside the document instance so we are pointing back at the
    +   * beginning of the document, as if it had just been created. It invalidates all
    +   * values, objects and arrays that you have created so far (including unescaped strings).
    +   */
    +  inline void rewind() noexcept;
    +  /**
    +   * Returns debugging information.
    +   */
    +  inline std::string to_debug_string() noexcept;
    +  /**
    +   * Some unrecoverable error conditions may render the document instance unusable.
    +   * The is_alive() method returns true when the document is still suitable.
    +   */
    +  inline bool is_alive() noexcept;
    +
    +  /**
    +   * Returns the current location in the document if in bounds.
    +   */
    +  inline simdjson_result current_location() const noexcept;
    +
    +  /**
    +   * Returns true if this document has been fully parsed.
    +   * If you have consumed the whole document and at_end() returns
    +   * false, then there may be trailing content.
    +   */
    +  inline bool at_end() const noexcept;
    +
    +  /**
    +   * Returns the current depth in the document if in bounds.
    +   *
    +   * E.g.,
    +   *  0 = finished with document
    +   *  1 = document root value (could be [ or {, not yet known)
    +   *  2 = , or } inside root array/object
    +   *  3 = key or value inside root array/object.
    +   */
    +  simdjson_inline int32_t current_depth() const noexcept;
    +
    +  /**
    +   * Get the value associated with the given JSON pointer.  We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/foo/a/1") == 20
    +   *
    +   * It is allowed for a key to be the empty string:
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("//a/1") == 20
    +   *
    +   * Note that at_pointer() automatically calls rewind between each call. Thus
    +   * all values, objects and arrays that you have created so far (including unescaped strings)
    +   * are invalidated. After calling at_pointer, you need to consume the result: string values
    +   * should be stored in your own variables, arrays should be decoded and stored in your own array-like
    +   * structures and so forth.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   *         - SCALAR_DOCUMENT_AS_VALUE if the json_pointer is empty and the document is not a scalar (see is_scalar() function).
    +   */
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  /**
    +   * Consumes the document and returns a string_view instance corresponding to the
    +   * document as represented in JSON. It points inside the original byte array containing
    +   * the JSON document.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +protected:
    +  /**
    +   * Consumes the document.
    +   */
    +  simdjson_inline error_code consume() noexcept;
    +
    +  simdjson_inline document(ondemand::json_iterator &&iter) noexcept;
    +  simdjson_inline const uint8_t *text(uint32_t idx) const noexcept;
    +
    +  simdjson_inline value_iterator resume_value_iterator() noexcept;
    +  simdjson_inline value_iterator get_root_value_iterator() noexcept;
    +  simdjson_inline simdjson_result start_or_resume_object() noexcept;
    +  static simdjson_inline document start(ondemand::json_iterator &&iter) noexcept;
    +
    +  //
    +  // Fields
    +  //
    +  json_iterator iter{}; ///< Current position in the document
    +  static constexpr depth_t DOCUMENT_DEPTH = 0; ///< document depth is always 0
    +
    +  friend class array_iterator;
    +  friend class value;
    +  friend class ondemand::parser;
    +  friend class object;
    +  friend class array;
    +  friend class field;
    +  friend class token;
    +  friend class document_stream;
    +  friend class document_reference;
    +};
    +
    +
    +/**
    + * A document_reference is a thin wrapper around a document reference instance.
    + */
    +class document_reference {
    +public:
    +  simdjson_inline document_reference() noexcept;
    +  simdjson_inline document_reference(document &d) noexcept;
    +  simdjson_inline document_reference(const document_reference &other) noexcept = default;
    +  simdjson_inline document_reference& operator=(const document_reference &other) noexcept = default;
    +  simdjson_inline void rewind() noexcept;
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result get_value() noexcept;
    +
    +  simdjson_inline simdjson_result is_null() noexcept;
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +  simdjson_inline operator document&() const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator array() & noexcept(false);
    +  simdjson_inline operator object() & noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +  simdjson_inline operator value() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  simdjson_inline int32_t current_depth() const noexcept;
    +  simdjson_inline bool is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +private:
    +  document *doc{nullptr};
    +};
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public arm64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(arm64::ondemand::document &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline error_code rewind() noexcept;
    +
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result get_value() noexcept;
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +  template simdjson_inline simdjson_result get() & noexcept;
    +  template simdjson_inline simdjson_result get() && noexcept;
    +
    +  template simdjson_inline error_code get(T &out) & noexcept;
    +  template simdjson_inline error_code get(T &out) && noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator arm64::ondemand::array() & noexcept(false);
    +  simdjson_inline operator arm64::ondemand::object() & noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator arm64::ondemand::raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +  simdjson_inline operator arm64::ondemand::value() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  simdjson_inline int32_t current_depth() const noexcept;
    +  simdjson_inline bool at_end() const noexcept;
    +  simdjson_inline bool is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +  /** @copydoc simdjson_inline std::string_view document::raw_json_token() const noexcept */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +};
    +
    +
    +} // namespace simdjson
    +
    +
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public arm64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(arm64::ondemand::document_reference value, error_code error) noexcept;
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline error_code rewind() noexcept;
    +
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result get_value() noexcept;
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator arm64::ondemand::array() & noexcept(false);
    +  simdjson_inline operator arm64::ondemand::object() & noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator arm64::ondemand::raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +  simdjson_inline operator arm64::ondemand::value() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  simdjson_inline simdjson_result current_depth() const noexcept;
    +  simdjson_inline simdjson_result is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +  /** @copydoc simdjson_inline std::string_view document_reference::raw_json_token() const noexcept */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +};
    +
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H
    +/* end file simdjson/generic/ondemand/document.h for arm64 */
    +/* including simdjson/generic/ondemand/document_stream.h for arm64: #include "simdjson/generic/ondemand/document_stream.h" */
    +/* begin file simdjson/generic/ondemand/document_stream.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +#include 
    +#include 
    +#include 
    +#endif
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +/** @private Custom worker class **/
    +struct stage1_worker {
    +  stage1_worker() noexcept = default;
    +  stage1_worker(const stage1_worker&) = delete;
    +  stage1_worker(stage1_worker&&) = delete;
    +  stage1_worker operator=(const stage1_worker&) = delete;
    +  ~stage1_worker();
    +  /**
    +   * We only start the thread when it is needed, not at object construction, this may throw.
    +   * You should only call this once.
    +   **/
    +  void start_thread();
    +  /**
    +   * Start a stage 1 job. You should first call 'run', then 'finish'.
    +   * You must call start_thread once before.
    +   */
    +  void run(document_stream * ds, parser * stage1, size_t next_batch_start);
    +  /** Wait for the run to finish (blocking). You should first call 'run', then 'finish'. **/
    +  void finish();
    +
    +private:
    +
    +  /**
    +   * Normally, we would never stop the thread. But we do in the destructor.
    +   * This function is only safe assuming that you are not waiting for results. You
    +   * should have called run, then finish, and be done.
    +   **/
    +  void stop_thread();
    +
    +  std::thread thread{};
    +  /** These three variables define the work done by the thread. **/
    +  ondemand::parser * stage1_thread_parser{};
    +  size_t _next_batch_start{};
    +  document_stream * owner{};
    +  /**
    +   * We have two state variables. This could be streamlined to one variable in the future but
    +   * we use two for clarity.
    +   */
    +  bool has_work{false};
    +  bool can_work{true};
    +
    +  /**
    +   * We lock using a mutex.
    +   */
    +  std::mutex locking_mutex{};
    +  std::condition_variable cond_var{};
    +
    +  friend class document_stream;
    +};
    +#endif  // SIMDJSON_THREADS_ENABLED
    +
    +/**
    + * A forward-only stream of documents.
    + *
    + * Produced by parser::iterate_many.
    + *
    + */
    +class document_stream {
    +public:
    +  /**
    +   * Construct an uninitialized document_stream.
    +   *
    +   *  ```c++
    +   *  document_stream docs;
    +   *  auto error = parser.iterate_many(json).get(docs);
    +   *  ```
    +   */
    +  simdjson_inline document_stream() noexcept;
    +  /** Move one document_stream to another. */
    +  simdjson_inline document_stream(document_stream &&other) noexcept = default;
    +  /** Move one document_stream to another. */
    +  simdjson_inline document_stream &operator=(document_stream &&other) noexcept = default;
    +
    +  simdjson_inline ~document_stream() noexcept;
    +
    +  /**
    +   * Returns the input size in bytes.
    +   */
    +  inline size_t size_in_bytes() const noexcept;
    +
    +  /**
    +   * After iterating through the stream, this method
    +   * returns the number of bytes that were not parsed at the end
    +   * of the stream. If truncated_bytes() differs from zero,
    +   * then the input was truncated maybe because incomplete JSON
    +   * documents were found at the end of the stream. You
    +   * may need to process the bytes in the interval [size_in_bytes()-truncated_bytes(), size_in_bytes()).
    +   *
    +   * You should only call truncated_bytes() after streaming through all
    +   * documents, like so:
    +   *
    +   *   document_stream stream = parser.iterate_many(json,window);
    +   *   for(auto & doc : stream) {
    +   *      // do something with doc
    +   *   }
    +   *   size_t truncated = stream.truncated_bytes();
    +   *
    +   */
    +  inline size_t truncated_bytes() const noexcept;
    +
    +  class iterator {
    +  public:
    +    using value_type = simdjson_result;
    +    using reference  = value_type;
    +
    +    using difference_type   = std::ptrdiff_t;
    +
    +    using iterator_category = std::input_iterator_tag;
    +
    +    /**
    +     * Default constructor.
    +     */
    +    simdjson_inline iterator() noexcept;
    +    /**
    +     * Get the current document (or error).
    +     */
    +    simdjson_inline simdjson_result operator*() noexcept;
    +    /**
    +     * Advance to the next document (prefix).
    +     */
    +    inline iterator& operator++() noexcept;
    +    /**
    +     * Check if we're at the end yet.
    +     * @param other the end iterator to compare to.
    +     */
    +    simdjson_inline bool operator!=(const iterator &other) const noexcept;
    +    /**
    +     * @private
    +     *
    +     * Gives the current index in the input document in bytes.
    +     *
    +     *   document_stream stream = parser.parse_many(json,window);
    +     *   for(auto i = stream.begin(); i != stream.end(); ++i) {
    +     *      auto doc = *i;
    +     *      size_t index = i.current_index();
    +     *   }
    +     *
    +     * This function (current_index()) is experimental and the usage
    +     * may change in future versions of simdjson: we find the API somewhat
    +     * awkward and we would like to offer something friendlier.
    +     */
    +     simdjson_inline size_t current_index() const noexcept;
    +
    +     /**
    +     * @private
    +     *
    +     * Gives a view of the current document at the current position.
    +     *
    +     *   document_stream stream = parser.iterate_many(json,window);
    +     *   for(auto i = stream.begin(); i != stream.end(); ++i) {
    +     *      std::string_view v = i.source();
    +     *   }
    +     *
    +     * The returned string_view instance is simply a map to the (unparsed)
    +     * source string: it may thus include white-space characters and all manner
    +     * of padding.
    +     *
    +     * This function (source()) is experimental and the usage
    +     * may change in future versions of simdjson: we find the API somewhat
    +     * awkward and we would like to offer something friendlier.
    +     *
    +     */
    +     simdjson_inline std::string_view source() const noexcept;
    +
    +    /**
    +     * Returns error of the stream (if any).
    +     */
    +     inline error_code error() const noexcept;
    +
    +  private:
    +    simdjson_inline iterator(document_stream *s, bool finished) noexcept;
    +    /** The document_stream we're iterating through. */
    +    document_stream* stream;
    +    /** Whether we're finished or not. */
    +    bool finished;
    +
    +    friend class document;
    +    friend class document_stream;
    +    friend class json_iterator;
    +  };
    +
    +  /**
    +   * Start iterating the documents in the stream.
    +   */
    +  simdjson_inline iterator begin() noexcept;
    +  /**
    +   * The end of the stream, for iterator comparison purposes.
    +   */
    +  simdjson_inline iterator end() noexcept;
    +
    +private:
    +
    +  document_stream &operator=(const document_stream &) = delete; // Disallow copying
    +  document_stream(const document_stream &other) = delete; // Disallow copying
    +
    +  /**
    +   * Construct a document_stream. Does not allocate or parse anything until the iterator is
    +   * used.
    +   *
    +   * @param parser is a reference to the parser instance used to generate this document_stream
    +   * @param buf is the raw byte buffer we need to process
    +   * @param len is the length of the raw byte buffer in bytes
    +   * @param batch_size is the size of the windows (must be strictly greater or equal to the largest JSON document)
    +   */
    +  simdjson_inline document_stream(
    +    ondemand::parser &parser,
    +    const uint8_t *buf,
    +    size_t len,
    +    size_t batch_size,
    +    bool allow_comma_separated
    +  ) noexcept;
    +
    +  /**
    +   * Parse the first document in the buffer. Used by begin(), to handle allocation and
    +   * initialization.
    +   */
    +  inline void start() noexcept;
    +
    +  /**
    +   * Parse the next document found in the buffer previously given to document_stream.
    +   *
    +   * The content should be a valid JSON document encoded as UTF-8. If there is a
    +   * UTF-8 BOM, the parser skips it.
    +   *
    +   * You do NOT need to pre-allocate a parser.  This function takes care of
    +   * pre-allocating a capacity defined by the batch_size defined when creating the
    +   * document_stream object.
    +   *
    +   * The function returns simdjson::EMPTY if there is no more data to be parsed.
    +   *
    +   * The function returns simdjson::SUCCESS (as integer = 0) in case of success
    +   * and indicates that the buffer has successfully been parsed to the end.
    +   * Every document it contained has been parsed without error.
    +   *
    +   * The function returns an error code from simdjson/simdjson.h in case of failure
    +   * such as simdjson::CAPACITY, simdjson::MEMALLOC, simdjson::DEPTH_ERROR and so forth;
    +   * the simdjson::error_message function converts these error codes into a string).
    +   *
    +   * You can also check validity by calling parser.is_valid(). The same parser can
    +   * and should be reused for the other documents in the buffer.
    +   */
    +  inline void next() noexcept;
    +
    +  /** Move the json_iterator of the document to the location of the next document in the stream. */
    +  inline void next_document() noexcept;
    +
    +  /** Get the next document index. */
    +  inline size_t next_batch_start() const noexcept;
    +
    +  /** Pass the next batch through stage 1 with the given parser. */
    +  inline error_code run_stage1(ondemand::parser &p, size_t batch_start) noexcept;
    +
    +  // Fields
    +  ondemand::parser *parser;
    +  const uint8_t *buf;
    +  size_t len;
    +  size_t batch_size;
    +  bool allow_comma_separated;
    +  /**
    +   * We are going to use just one document instance. The document owns
    +   * the json_iterator. It implies that we only ever pass a reference
    +   * to the document to the users.
    +   */
    +  document doc{};
    +  /** The error (or lack thereof) from the current document. */
    +  error_code error;
    +  size_t batch_start{0};
    +  size_t doc_index{};
    +
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  /** Indicates whether we use threads. Note that this needs to be a constant during the execution of the parsing. */
    +  bool use_thread;
    +
    +  inline void load_from_stage1_thread() noexcept;
    +
    +  /** Start a thread to run stage 1 on the next batch. */
    +  inline void start_stage1_thread() noexcept;
    +
    +  /** Wait for the stage 1 thread to finish and capture the results. */
    +  inline void finish_stage1_thread() noexcept;
    +
    +  /** The error returned from the stage 1 thread. */
    +  error_code stage1_thread_error{UNINITIALIZED};
    +  /** The thread used to run stage 1 against the next batch in the background. */
    +  std::unique_ptr worker{new(std::nothrow) stage1_worker()};
    +  /**
    +   * The parser used to run stage 1 in the background. Will be swapped
    +   * with the regular parser when finished.
    +   */
    +  ondemand::parser stage1_thread_parser{};
    +
    +  friend struct stage1_worker;
    +  #endif // SIMDJSON_THREADS_ENABLED
    +
    +  friend class parser;
    +  friend class document;
    +  friend class json_iterator;
    +  friend struct simdjson_result;
    +  friend struct internal::simdjson_result_base;
    +};  // document_stream
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +template<>
    +struct simdjson_result : public arm64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(arm64::ondemand::document_stream &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H
    +/* end file simdjson/generic/ondemand/document_stream.h for arm64 */
    +/* including simdjson/generic/ondemand/field.h for arm64: #include "simdjson/generic/ondemand/field.h" */
    +/* begin file simdjson/generic/ondemand/field.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_FIELD_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +/**
    + * A JSON field (key/value pair) in an object.
    + *
    + * Returned from object iteration.
    + *
    + * Extends from std::pair so you can use C++ algorithms that rely on pairs.
    + */
    +class field : public std::pair {
    +public:
    +  /**
    +   * Create a new invalid field.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline field() noexcept;
    +
    +  /**
    +   * Get the key as a string_view (for higher speed, consider raw_key).
    +   * We deliberately use a more cumbersome name (unescaped_key) to force users
    +   * to think twice about using it.
    +   *
    +   * This consumes the key: once you have called unescaped_key(), you cannot
    +   * call it again nor can you call key().
    +   */
    +  simdjson_inline simdjson_warn_unused simdjson_result unescaped_key(bool allow_replacement) noexcept;
    +  /**
    +   * Get the key as a raw_json_string. Can be used for direct comparison with
    +   * an unescaped C string: e.g., key() == "test".
    +   */
    +  simdjson_inline raw_json_string key() const noexcept;
    +  /**
    +   * Get the field value.
    +   */
    +  simdjson_inline ondemand::value &value() & noexcept;
    +  /**
    +   * @overload ondemand::value &ondemand::value() & noexcept
    +   */
    +  simdjson_inline ondemand::value value() && noexcept;
    +
    +protected:
    +  simdjson_inline field(raw_json_string key, ondemand::value &&value) noexcept;
    +  static simdjson_inline simdjson_result start(value_iterator &parent_iter) noexcept;
    +  static simdjson_inline simdjson_result start(const value_iterator &parent_iter, raw_json_string key) noexcept;
    +  friend struct simdjson_result;
    +  friend class object_iterator;
    +};
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public arm64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(arm64::ondemand::field &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result unescaped_key(bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result key() noexcept;
    +  simdjson_inline simdjson_result value() noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_H
    +/* end file simdjson/generic/ondemand/field.h for arm64 */
    +/* including simdjson/generic/ondemand/object.h for arm64: #include "simdjson/generic/ondemand/object.h" */
    +/* begin file simdjson/generic/ondemand/object.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +/**
    + * A forward-only JSON object field iterator.
    + */
    +class object {
    +public:
    +  /**
    +   * Create a new invalid object.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline object() noexcept = default;
    +
    +  simdjson_inline simdjson_result begin() noexcept;
    +  simdjson_inline simdjson_result end() noexcept;
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +   *
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. The value instance you get
    +   * from  `content["bids"]` becomes invalid when you call `content["asks"]`. The array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to a
    +   * key a single time. Doing object["mykey"].to_string() and then again object["mykey"].to_string()
    +   * is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field(std::string_view key) && noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. The value instance you get
    +   * from  `content["bids"]` becomes invalid when you call `content["asks"]`. The array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to a key
    +   * a single time. Doing object["mykey"].to_string() and then again object["mykey"].to_string() is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) && noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) && noexcept;
    +
    +  /**
    +   * Get the value associated with the given JSON pointer. We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard, interpreting the current node
    +   * as the root of its own JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/foo/a/1") == 20
    +   *
    +   * It is allowed for a key to be the empty string:
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("//a/1") == 20
    +   *
    +   * Note that at_pointer() called on the document automatically calls the document's rewind
    +   * method between each call. It invalidates all previously accessed arrays, objects and values
    +   * that have not been consumed. Yet it is not the case when calling at_pointer on an object
    +   * instance: there is no rewind and no invalidation.
    +   *
    +   * You may call at_pointer more than once on an object, but each time the pointer is advanced
    +   * to be within the value matched by the key indicated by the JSON pointer query. Thus any preceding
    +   * key (as well as the current key) can no longer be used with following JSON pointer calls.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching.
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   */
    +  inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +
    +  /**
    +   * Reset the iterator so that we are pointing back at the
    +   * beginning of the object. You should still consume values only once even if you
    +   * can iterate through the object more than once. If you unescape a string within
    +   * the object more than once, you have unsafe code. Note that rewinding an object
    +   * means that you may need to reparse it anew: it is not a free operation.
    +   *
    +   * @returns true if the object contains some elements (not empty)
    +   */
    +  inline simdjson_result reset() & noexcept;
    +  /**
    +   * This method scans the beginning of the object and checks whether the
    +   * object is empty.
    +   * The runtime complexity is constant time. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   */
    +  inline simdjson_result is_empty() & noexcept;
    +  /**
    +   * This method scans the object and counts the number of key-value pairs.
    +   * The count_fields method should always be called before you have begun
    +   * iterating through the object: it is expected that you are pointing at
    +   * the beginning of the object.
    +   * The runtime complexity is linear in the size of the object. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an object is empty, it is more performant to use
    +   * the is_empty() method.
    +   *
    +   * Performance hint: You should only call count_fields() as a last
    +   * resort as it may require scanning the document twice or more.
    +   */
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  /**
    +   * Consumes the object and returns a string_view instance corresponding to the
    +   * object as represented in JSON. It points inside the original byte array containing
    +   * the JSON document.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +protected:
    +  /**
    +   * Go to the end of the object, no matter where you are right now.
    +   */
    +  simdjson_inline error_code consume() noexcept;
    +  static simdjson_inline simdjson_result start(value_iterator &iter) noexcept;
    +  static simdjson_inline simdjson_result start_root(value_iterator &iter) noexcept;
    +  static simdjson_inline simdjson_result started(value_iterator &iter) noexcept;
    +  static simdjson_inline object resume(const value_iterator &iter) noexcept;
    +  simdjson_inline object(const value_iterator &iter) noexcept;
    +
    +  simdjson_warn_unused simdjson_inline error_code find_field_raw(const std::string_view key) noexcept;
    +
    +  value_iterator iter{};
    +
    +  friend class value;
    +  friend class document;
    +  friend struct simdjson_result;
    +};
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public arm64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(arm64::ondemand::object &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result begin() noexcept;
    +  simdjson_inline simdjson_result end() noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) && noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) && noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) && noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  inline simdjson_result reset() noexcept;
    +  inline simdjson_result is_empty() noexcept;
    +  inline simdjson_result count_fields() & noexcept;
    +  inline simdjson_result raw_json() noexcept;
    +
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_H
    +/* end file simdjson/generic/ondemand/object.h for arm64 */
    +/* including simdjson/generic/ondemand/object_iterator.h for arm64: #include "simdjson/generic/ondemand/object_iterator.h" */
    +/* begin file simdjson/generic/ondemand/object_iterator.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +class object_iterator {
    +public:
    +  /**
    +   * Create a new invalid object_iterator.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline object_iterator() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  // Reads key and value, yielding them to the user.
    +  // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  simdjson_inline simdjson_result operator*() noexcept;
    +  // Assumes it's being compared with the end. true if depth < iter->depth.
    +  simdjson_inline bool operator==(const object_iterator &) const noexcept;
    +  // Assumes it's being compared with the end. true if depth >= iter->depth.
    +  simdjson_inline bool operator!=(const object_iterator &) const noexcept;
    +  // Checks for ']' and ','
    +  simdjson_inline object_iterator &operator++() noexcept;
    +
    +private:
    +  /**
    +   * The underlying JSON iterator.
    +   *
    +   * PERF NOTE: expected to be elided in favor of the parent document: this is set when the object
    +   * is first used, and never changes afterwards.
    +   */
    +  value_iterator iter{};
    +
    +  simdjson_inline object_iterator(const value_iterator &iter) noexcept;
    +  friend struct simdjson_result;
    +  friend class object;
    +};
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public arm64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(arm64::ondemand::object_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  // Reads key and value, yielding them to the user.
    +  simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  // Assumes it's being compared with the end. true if depth < iter->depth.
    +  simdjson_inline bool operator==(const simdjson_result &) const noexcept;
    +  // Assumes it's being compared with the end. true if depth >= iter->depth.
    +  simdjson_inline bool operator!=(const simdjson_result &) const noexcept;
    +  // Checks for ']' and ','
    +  simdjson_inline simdjson_result &operator++() noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H
    +/* end file simdjson/generic/ondemand/object_iterator.h for arm64 */
    +/* including simdjson/generic/ondemand/serialization.h for arm64: #include "simdjson/generic/ondemand/serialization.h" */
    +/* begin file simdjson/generic/ondemand/serialization.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +/**
    + * Create a string-view instance out of a document instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(arm64::ondemand::document& x) noexcept;
    +/**
    + * Create a string-view instance out of a value instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. The value must
    + * not have been accessed previously. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(arm64::ondemand::value& x) noexcept;
    +/**
    + * Create a string-view instance out of an object instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(arm64::ondemand::object& x) noexcept;
    +/**
    + * Create a string-view instance out of an array instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(arm64::ondemand::array& x) noexcept;
    +inline simdjson_result to_json_string(simdjson_result x);
    +inline simdjson_result to_json_string(simdjson_result x);
    +inline simdjson_result to_json_string(simdjson_result x);
    +inline simdjson_result to_json_string(simdjson_result x);
    +} // namespace simdjson
    +
    +/**
    + * We want to support argument-dependent lookup (ADL).
    + * Hence we should define operator<< in the namespace
    + * where the argument (here value, object, etc.) resides.
    + * Credit: @madhur4127
    + * See https://github.com/simdjson/simdjson/issues/1768
    + */
    +namespace simdjson { namespace arm64 { namespace ondemand {
    +
    +/**
    + * Print JSON to an output stream.  It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The element.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::value x);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x);
    +#endif
    +/**
    + * Print JSON to an output stream. It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The array.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::array value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x);
    +#endif
    +/**
    + * Print JSON to an output stream. It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The array.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::document& value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x);
    +#endif
    +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::document_reference& value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x);
    +#endif
    +/**
    + * Print JSON to an output stream. It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The object.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::object value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x);
    +#endif
    +}}} // namespace simdjson::arm64::ondemand
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H
    +/* end file simdjson/generic/ondemand/serialization.h for arm64 */
    +
    +// Inline definitions
    +/* including simdjson/generic/ondemand/array-inl.h for arm64: #include "simdjson/generic/ondemand/array-inl.h" */
    +/* begin file simdjson/generic/ondemand/array-inl.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +//
    +// ### Live States
    +//
    +// While iterating or looking up values, depth >= iter->depth. at_start may vary. Error is
    +// always SUCCESS:
    +//
    +// - Start: This is the state when the array is first found and the iterator is just past the `{`.
    +//   In this state, at_start == true.
    +// - Next: After we hand a scalar value to the user, or an array/object which they then fully
    +//   iterate over, the iterator is at the `,` before the next value (or `]`). In this state,
    +//   depth == iter->depth, at_start == false, and error == SUCCESS.
    +// - Unfinished Business: When we hand an array/object to the user which they do not fully
    +//   iterate over, we need to finish that iteration by skipping child values until we reach the
    +//   Next state. In this state, depth > iter->depth, at_start == false, and error == SUCCESS.
    +//
    +// ## Error States
    +//
    +// In error states, we will yield exactly one more value before stopping. iter->depth == depth
    +// and at_start is always false. We decrement after yielding the error, moving to the Finished
    +// state.
    +//
    +// - Chained Error: When the array iterator is part of an error chain--for example, in
    +//   `for (auto tweet : doc["tweets"])`, where the tweet element may be missing or not be an
    +//   array--we yield that error in the loop, exactly once. In this state, error != SUCCESS and
    +//   iter->depth == depth, and at_start == false. We decrement depth when we yield the error.
    +// - Missing Comma Error: When the iterator ++ method discovers there is no comma between elements,
    +//   we flag that as an error and treat it exactly the same as a Chained Error. In this state,
    +//   error == TAPE_ERROR, iter->depth == depth, and at_start == false.
    +//
    +// ## Terminal State
    +//
    +// The terminal state has iter->depth < depth. at_start is always false.
    +//
    +// - Finished: When we have reached a `]` or have reported an error, we are finished. We signal this
    +//   by decrementing depth. In this state, iter->depth < depth, at_start == false, and
    +//   error == SUCCESS.
    +//
    +
    +simdjson_inline array::array(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{
    +}
    +
    +simdjson_inline simdjson_result array::start(value_iterator &iter) noexcept {
    +  // We don't need to know if the array is empty to start iteration, but we do want to know if there
    +  // is an error--thus `simdjson_unused`.
    +  simdjson_unused bool has_value;
    +  SIMDJSON_TRY( iter.start_array().get(has_value) );
    +  return array(iter);
    +}
    +simdjson_inline simdjson_result array::start_root(value_iterator &iter) noexcept {
    +  simdjson_unused bool has_value;
    +  SIMDJSON_TRY( iter.start_root_array().get(has_value) );
    +  return array(iter);
    +}
    +simdjson_inline simdjson_result array::started(value_iterator &iter) noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY(iter.started_array().get(has_value));
    +  return array(iter);
    +}
    +
    +simdjson_inline simdjson_result array::begin() noexcept {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  return array_iterator(iter);
    +}
    +simdjson_inline simdjson_result array::end() noexcept {
    +  return array_iterator(iter);
    +}
    +simdjson_inline error_code array::consume() noexcept {
    +  auto error = iter.json_iter().skip_child(iter.depth()-1);
    +  if(error) { iter.abandon(); }
    +  return error;
    +}
    +
    +simdjson_inline simdjson_result array::raw_json() noexcept {
    +  const uint8_t * starting_point{iter.peek_start()};
    +  auto error = consume();
    +  if(error) { return error; }
    +  // After 'consume()', we could be left pointing just beyond the document, but that
    +  // is ok because we are not going to dereference the final pointer position, we just
    +  // use it to compute the length in bytes.
    +  const uint8_t * final_point{iter._json_iter->unsafe_pointer()};
    +  return std::string_view(reinterpret_cast(starting_point), size_t(final_point - starting_point));
    +}
    +
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_inline simdjson_result array::count_elements() & noexcept {
    +  size_t count{0};
    +  // Important: we do not consume any of the values.
    +  for(simdjson_unused auto v : *this) { count++; }
    +  // The above loop will always succeed, but we want to report errors.
    +  if(iter.error()) { return iter.error(); }
    +  // We need to move back at the start because we expect users to iterate through
    +  // the array after counting the number of elements.
    +  iter.reset_array();
    +  return count;
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_inline simdjson_result array::is_empty() & noexcept {
    +  bool is_not_empty;
    +  auto error = iter.reset_array().get(is_not_empty);
    +  if(error) { return error; }
    +  return !is_not_empty;
    +}
    +
    +inline simdjson_result array::reset() & noexcept {
    +  return iter.reset_array();
    +}
    +
    +inline simdjson_result array::at_pointer(std::string_view json_pointer) noexcept {
    +  if (json_pointer[0] != '/') { return INVALID_JSON_POINTER; }
    +  json_pointer = json_pointer.substr(1);
    +  // - means "the append position" or "the element after the end of the array"
    +  // We don't support this, because we're returning a real element, not a position.
    +  if (json_pointer == "-") { return INDEX_OUT_OF_BOUNDS; }
    +
    +  // Read the array index
    +  size_t array_index = 0;
    +  size_t i;
    +  for (i = 0; i < json_pointer.length() && json_pointer[i] != '/'; i++) {
    +    uint8_t digit = uint8_t(json_pointer[i] - '0');
    +    // Check for non-digit in array index. If it's there, we're trying to get a field in an object
    +    if (digit > 9) { return INCORRECT_TYPE; }
    +    array_index = array_index*10 + digit;
    +  }
    +
    +  // 0 followed by other digits is invalid
    +  if (i > 1 && json_pointer[0] == '0') { return INVALID_JSON_POINTER; } // "JSON pointer array index has other characters after 0"
    +
    +  // Empty string is invalid; so is a "/" with no digits before it
    +  if (i == 0) { return INVALID_JSON_POINTER; } // "Empty string in JSON pointer array index"
    +  // Get the child
    +  auto child = at(array_index);
    +  // If there is an error, it ends here
    +  if(child.error()) {
    +    return child;
    +  }
    +
    +  // If there is a /, we're not done yet, call recursively.
    +  if (i < json_pointer.length()) {
    +    child = child.at_pointer(json_pointer.substr(i));
    +  }
    +  return child;
    +}
    +
    +simdjson_inline simdjson_result array::at(size_t index) noexcept {
    +  size_t i = 0;
    +  for (auto value : *this) {
    +    if (i == index) { return value; }
    +    i++;
    +  }
    +  return INDEX_OUT_OF_BOUNDS;
    +}
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  arm64::ondemand::array &&value
    +) noexcept
    +  : implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept
    +  : implementation_simdjson_result_base(error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::begin() noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() noexcept {
    +  if (error()) { return error(); }
    +  return first.end();
    +}
    +simdjson_inline  simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline  simdjson_result simdjson_result::is_empty() & noexcept {
    +  if (error()) { return error(); }
    +  return first.is_empty();
    +}
    +simdjson_inline  simdjson_result simdjson_result::at(size_t index) noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline  simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +simdjson_inline  simdjson_result simdjson_result::raw_json() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json();
    +}
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H
    +/* end file simdjson/generic/ondemand/array-inl.h for arm64 */
    +/* including simdjson/generic/ondemand/array_iterator-inl.h for arm64: #include "simdjson/generic/ondemand/array_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/array_iterator-inl.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{}
    +
    +simdjson_inline simdjson_result array_iterator::operator*() noexcept {
    +  if (iter.error()) { iter.abandon(); return iter.error(); }
    +  return value(iter.child());
    +}
    +simdjson_inline bool array_iterator::operator==(const array_iterator &other) const noexcept {
    +  return !(*this != other);
    +}
    +simdjson_inline bool array_iterator::operator!=(const array_iterator &) const noexcept {
    +  return iter.is_open();
    +}
    +simdjson_inline array_iterator &array_iterator::operator++() noexcept {
    +  error_code error;
    +  // PERF NOTE this is a safety rail ... users should exit loops as soon as they receive an error, so we'll never get here.
    +  // However, it does not seem to make a perf difference, so we add it out of an abundance of caution.
    +  if (( error = iter.error() )) { return *this; }
    +  if (( error = iter.skip_child() )) { return *this; }
    +  if (( error = iter.has_next_element().error() )) { return *this; }
    +  return *this;
    +}
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  arm64::ondemand::array_iterator &&value
    +) noexcept
    +  : arm64::implementation_simdjson_result_base(std::forward(value))
    +{
    +  first.iter.assert_is_valid();
    +}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +  : arm64::implementation_simdjson_result_base({}, error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::operator*() noexcept {
    +  if (error()) { return error(); }
    +  return *first;
    +}
    +simdjson_inline bool simdjson_result::operator==(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return !error(); }
    +  return first == other.first;
    +}
    +simdjson_inline bool simdjson_result::operator!=(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return error(); }
    +  return first != other.first;
    +}
    +simdjson_inline simdjson_result &simdjson_result::operator++() noexcept {
    +  // Clear the error if there is one, so we don't yield it twice
    +  if (error()) { second = SUCCESS; return *this; }
    +  ++(first);
    +  return *this;
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/array_iterator-inl.h for arm64 */
    +/* including simdjson/generic/ondemand/document-inl.h for arm64: #include "simdjson/generic/ondemand/document-inl.h" */
    +/* begin file simdjson/generic/ondemand/document-inl.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +simdjson_inline document::document(ondemand::json_iterator &&_iter) noexcept
    +  : iter{std::forward(_iter)}
    +{
    +  logger::log_start_value(iter, "document");
    +}
    +
    +simdjson_inline document document::start(json_iterator &&iter) noexcept {
    +  return document(std::forward(iter));
    +}
    +
    +inline void document::rewind() noexcept {
    +  iter.rewind();
    +}
    +
    +inline std::string document::to_debug_string() noexcept {
    +  return iter.to_string();
    +}
    +
    +inline simdjson_result document::current_location() const noexcept {
    +  return iter.current_location();
    +}
    +
    +inline int32_t document::current_depth() const noexcept {
    +  return iter.depth();
    +}
    +
    +inline bool document::at_end() const noexcept {
    +  return iter.at_end();
    +}
    +
    +
    +inline bool document::is_alive() noexcept {
    +  return iter.is_alive();
    +}
    +simdjson_inline value_iterator document::resume_value_iterator() noexcept {
    +  return value_iterator(&iter, 1, iter.root_position());
    +}
    +simdjson_inline value_iterator document::get_root_value_iterator() noexcept {
    +  return resume_value_iterator();
    +}
    +simdjson_inline simdjson_result document::start_or_resume_object() noexcept {
    +  if (iter.at_root()) {
    +    return get_object();
    +  } else {
    +    return object::resume(resume_value_iterator());
    +  }
    +}
    +simdjson_inline simdjson_result document::get_value() noexcept {
    +  // Make sure we start any arrays or objects before returning, so that start_root_()
    +  // gets called.
    +
    +  // It is the convention throughout the code that  the macro `SIMDJSON_DEVELOPMENT_CHECKS` determines whether
    +  // we check for OUT_OF_ORDER_ITERATION. Proper on::demand code should never trigger this error.
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  if (!iter.at_root()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  // assert_at_root() serves two purposes: in Debug mode, whether or not
    +  // SIMDJSON_DEVELOPMENT_CHECKS is set or not, it checks that we are at the root of
    +  // the document (this will typically be redundant). In release mode, it generates
    +  // SIMDJSON_ASSUME statements to allow the compiler to make assumptions.
    +  iter.assert_at_root();
    +  switch (*iter.peek()) {
    +    case '[': {
    +      // The following lines check that the document ends with ].
    +      auto value_iterator = get_root_value_iterator();
    +      auto error = value_iterator.check_root_array();
    +      if(error) { return error; }
    +      return value(get_root_value_iterator());
    +    }
    +    case '{': {
    +      // The following lines would check that the document ends with }.
    +      auto value_iterator = get_root_value_iterator();
    +      auto error = value_iterator.check_root_object();
    +      if(error) { return error; }
    +      return value(get_root_value_iterator());
    +    }
    +    default:
    +      // Unfortunately, scalar documents are a special case in simdjson and they cannot
    +      // be safely converted to value instances.
    +      return SCALAR_DOCUMENT_AS_VALUE;
    +  }
    +}
    +simdjson_inline simdjson_result document::get_array() & noexcept {
    +  auto value = get_root_value_iterator();
    +  return array::start_root(value);
    +}
    +simdjson_inline simdjson_result document::get_object() & noexcept {
    +  auto value = get_root_value_iterator();
    +  return object::start_root(value);
    +}
    +
    +/**
    + * We decided that calling 'get_double()' on the JSON document '1.233 blabla' should
    + * give an error, so we check for trailing content. We want to disallow trailing
    + * content.
    + * Thus, in several implementations below, we pass a 'true' parameter value to
    + * a get_root_value_iterator() method: this indicates that we disallow trailing content.
    + */
    +
    +simdjson_inline simdjson_result document::get_uint64() noexcept {
    +  return get_root_value_iterator().get_root_uint64(true);
    +}
    +simdjson_inline simdjson_result document::get_uint64_in_string() noexcept {
    +  return get_root_value_iterator().get_root_uint64_in_string(true);
    +}
    +simdjson_inline simdjson_result document::get_int64() noexcept {
    +  return get_root_value_iterator().get_root_int64(true);
    +}
    +simdjson_inline simdjson_result document::get_int64_in_string() noexcept {
    +  return get_root_value_iterator().get_root_int64_in_string(true);
    +}
    +simdjson_inline simdjson_result document::get_double() noexcept {
    +  return get_root_value_iterator().get_root_double(true);
    +}
    +simdjson_inline simdjson_result document::get_double_in_string() noexcept {
    +  return get_root_value_iterator().get_root_double_in_string(true);
    +}
    +simdjson_inline simdjson_result document::get_string(bool allow_replacement) noexcept {
    +  return get_root_value_iterator().get_root_string(true, allow_replacement);
    +}
    +template 
    +simdjson_inline error_code document::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  return get_root_value_iterator().get_root_string(receiver, true, allow_replacement);
    +}
    +simdjson_inline simdjson_result document::get_wobbly_string() noexcept {
    +  return get_root_value_iterator().get_root_wobbly_string(true);
    +}
    +simdjson_inline simdjson_result document::get_raw_json_string() noexcept {
    +  return get_root_value_iterator().get_root_raw_json_string(true);
    +}
    +simdjson_inline simdjson_result document::get_bool() noexcept {
    +  return get_root_value_iterator().get_root_bool(true);
    +}
    +simdjson_inline simdjson_result document::is_null() noexcept {
    +  return get_root_value_iterator().is_root_null(true);
    +}
    +
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_array(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_object(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_raw_json_string(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_string(false); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_double(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_uint64(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_int64(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_value(); }
    +
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return get_value(); }
    +
    +template simdjson_inline error_code document::get(T &out) & noexcept {
    +  return get().get(out);
    +}
    +template simdjson_inline error_code document::get(T &out) && noexcept {
    +  return std::forward(*this).get().get(out);
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline document::operator array() & noexcept(false) { return get_array(); }
    +simdjson_inline document::operator object() & noexcept(false) { return get_object(); }
    +simdjson_inline document::operator uint64_t() noexcept(false) { return get_uint64(); }
    +simdjson_inline document::operator int64_t() noexcept(false) { return get_int64(); }
    +simdjson_inline document::operator double() noexcept(false) { return get_double(); }
    +simdjson_inline document::operator std::string_view() noexcept(false) { return get_string(false); }
    +simdjson_inline document::operator raw_json_string() noexcept(false) { return get_raw_json_string(); }
    +simdjson_inline document::operator bool() noexcept(false) { return get_bool(); }
    +simdjson_inline document::operator value() noexcept(false) { return get_value(); }
    +
    +#endif
    +simdjson_inline simdjson_result document::count_elements() & noexcept {
    +  auto a = get_array();
    +  simdjson_result answer = a.count_elements();
    +  /* If there was an array, we are now left pointing at its first element. */
    +  if(answer.error() == SUCCESS) { rewind(); }
    +  return answer;
    +}
    +simdjson_inline simdjson_result document::count_fields() & noexcept {
    +  auto a = get_object();
    +  simdjson_result answer = a.count_fields();
    +  /* If there was an object, we are now left pointing at its first element. */
    +  if(answer.error() == SUCCESS) { rewind(); }
    +  return answer;
    +}
    +simdjson_inline simdjson_result document::at(size_t index) & noexcept {
    +  auto a = get_array();
    +  return a.at(index);
    +}
    +simdjson_inline simdjson_result document::begin() & noexcept {
    +  return get_array().begin();
    +}
    +simdjson_inline simdjson_result document::end() & noexcept {
    +  return {};
    +}
    +
    +simdjson_inline simdjson_result document::find_field(std::string_view key) & noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +simdjson_inline simdjson_result document::find_field(const char *key) & noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +simdjson_inline simdjson_result document::find_field_unordered(std::string_view key) & noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result document::find_field_unordered(const char *key) & noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result document::operator[](std::string_view key) & noexcept {
    +  return start_or_resume_object()[key];
    +}
    +simdjson_inline simdjson_result document::operator[](const char *key) & noexcept {
    +  return start_or_resume_object()[key];
    +}
    +
    +simdjson_inline error_code document::consume() noexcept {
    +  auto error = iter.skip_child(0);
    +  if(error) { iter.abandon(); }
    +  return error;
    +}
    +
    +simdjson_inline simdjson_result document::raw_json() noexcept {
    +  auto _iter = get_root_value_iterator();
    +  const uint8_t * starting_point{_iter.peek_start()};
    +  auto error = consume();
    +  if(error) { return error; }
    +  // After 'consume()', we could be left pointing just beyond the document, but that
    +  // is ok because we are not going to dereference the final pointer position, we just
    +  // use it to compute the length in bytes.
    +  const uint8_t * final_point{iter.unsafe_pointer()};
    +  return std::string_view(reinterpret_cast(starting_point), size_t(final_point - starting_point));
    +}
    +
    +simdjson_inline simdjson_result document::type() noexcept {
    +  return get_root_value_iterator().type();
    +}
    +
    +simdjson_inline simdjson_result document::is_scalar() noexcept {
    +  json_type this_type;
    +  auto error = type().get(this_type);
    +  if(error) { return error; }
    +  return ! ((this_type == json_type::array) || (this_type == json_type::object));
    +}
    +
    +simdjson_inline bool document::is_negative() noexcept {
    +  return get_root_value_iterator().is_root_negative();
    +}
    +
    +simdjson_inline simdjson_result document::is_integer() noexcept {
    +  return get_root_value_iterator().is_root_integer(true);
    +}
    +
    +simdjson_inline simdjson_result document::get_number_type() noexcept {
    +  return get_root_value_iterator().get_root_number_type(true);
    +}
    +
    +simdjson_inline simdjson_result document::get_number() noexcept {
    +  return get_root_value_iterator().get_root_number(true);
    +}
    +
    +
    +simdjson_inline simdjson_result document::raw_json_token() noexcept {
    +  auto _iter = get_root_value_iterator();
    +  return std::string_view(reinterpret_cast(_iter.peek_start()), _iter.peek_start_length());
    +}
    +
    +simdjson_inline simdjson_result document::at_pointer(std::string_view json_pointer) noexcept {
    +  rewind(); // Rewind the document each time at_pointer is called
    +  if (json_pointer.empty()) {
    +    return this->get_value();
    +  }
    +  json_type t;
    +  SIMDJSON_TRY(type().get(t));
    +  switch (t)
    +  {
    +    case json_type::array:
    +      return (*this).get_array().at_pointer(json_pointer);
    +    case json_type::object:
    +      return (*this).get_object().at_pointer(json_pointer);
    +    default:
    +      return INVALID_JSON_POINTER;
    +  }
    +}
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  arm64::ondemand::document &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      error
    +    )
    +{
    +}
    +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline error_code simdjson_result::rewind() noexcept {
    +  if (error()) { return error(); }
    +  first.rewind();
    +  return SUCCESS;
    +}
    +simdjson_inline simdjson_result simdjson_result::begin() & noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() & noexcept {
    +  return {};
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_array();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_object();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_bool();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_value() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_value();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_null() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_null();
    +}
    +
    +template
    +simdjson_inline simdjson_result simdjson_result::get() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get();
    +}
    +template
    +simdjson_inline simdjson_result simdjson_result::get() && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).get();
    +}
    +template
    +simdjson_inline error_code simdjson_result::get(T &out) & noexcept {
    +  if (error()) { return error(); }
    +  return first.get(out);
    +}
    +template
    +simdjson_inline error_code simdjson_result::get(T &out) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).get(out);
    +}
    +
    +template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete;
    +template<> simdjson_inline simdjson_result simdjson_result::get() && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first);
    +}
    +template<> simdjson_inline error_code simdjson_result::get(arm64::ondemand::document &out) & noexcept = delete;
    +template<> simdjson_inline error_code simdjson_result::get(arm64::ondemand::document &out) && noexcept {
    +  if (error()) { return error(); }
    +  out = std::forward(first);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::type() noexcept {
    +  if (error()) { return error(); }
    +  return first.type();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_scalar();
    +}
    +
    +
    +simdjson_inline bool simdjson_result::is_negative() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_negative();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_integer();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number_type();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::get_number() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number();
    +}
    +
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline simdjson_result::operator arm64::ondemand::array() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator arm64::ondemand::object() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator int64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator double() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator arm64::ondemand::raw_json_string() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator bool() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator arm64::ondemand::value() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +#endif
    +
    +
    +simdjson_inline simdjson_result simdjson_result::current_location() noexcept {
    +  if (error()) { return error(); }
    +  return first.current_location();
    +}
    +
    +simdjson_inline bool simdjson_result::at_end() const noexcept {
    +  if (error()) { return error(); }
    +  return first.at_end();
    +}
    +
    +
    +simdjson_inline int32_t simdjson_result::current_depth() const noexcept {
    +  if (error()) { return error(); }
    +  return first.current_depth();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json_token();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +
    +} // namespace simdjson
    +
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +simdjson_inline document_reference::document_reference() noexcept : doc{nullptr} {}
    +simdjson_inline document_reference::document_reference(document &d) noexcept : doc(&d) {}
    +simdjson_inline void document_reference::rewind() noexcept { doc->rewind(); }
    +simdjson_inline simdjson_result document_reference::get_array() & noexcept { return doc->get_array(); }
    +simdjson_inline simdjson_result document_reference::get_object() & noexcept { return doc->get_object(); }
    +/**
    + * The document_reference instances are used primarily/solely for streams of JSON
    + * documents.
    + * We decided that calling 'get_double()' on the JSON document '1.233 blabla' should
    + * give an error, so we check for trailing content.
    + *
    + * However, for streams of JSON documents, we want to be able to start from
    + * "321" "321" "321"
    + * and parse it successfully as a stream of JSON documents, calling get_uint64_in_string()
    + * successfully each time.
    + *
    + * To achieve this result, we pass a 'false' to a get_root_value_iterator() method:
    + * this indicates that we allow trailing content.
    + */
    +simdjson_inline simdjson_result document_reference::get_uint64() noexcept { return doc->get_root_value_iterator().get_root_uint64(false); }
    +simdjson_inline simdjson_result document_reference::get_uint64_in_string() noexcept { return doc->get_root_value_iterator().get_root_uint64_in_string(false); }
    +simdjson_inline simdjson_result document_reference::get_int64() noexcept { return doc->get_root_value_iterator().get_root_int64(false); }
    +simdjson_inline simdjson_result document_reference::get_int64_in_string() noexcept { return doc->get_root_value_iterator().get_root_int64_in_string(false); }
    +simdjson_inline simdjson_result document_reference::get_double() noexcept { return doc->get_root_value_iterator().get_root_double(false); }
    +simdjson_inline simdjson_result document_reference::get_double_in_string() noexcept { return doc->get_root_value_iterator().get_root_double(false); }
    +simdjson_inline simdjson_result document_reference::get_string(bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(false, allow_replacement); }
    +template 
    +simdjson_inline error_code document_reference::get_string(string_type& receiver, bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(receiver, false, allow_replacement); }
    +simdjson_inline simdjson_result document_reference::get_wobbly_string() noexcept { return doc->get_root_value_iterator().get_root_wobbly_string(false); }
    +simdjson_inline simdjson_result document_reference::get_raw_json_string() noexcept { return doc->get_root_value_iterator().get_root_raw_json_string(false); }
    +simdjson_inline simdjson_result document_reference::get_bool() noexcept { return doc->get_root_value_iterator().get_root_bool(false); }
    +simdjson_inline simdjson_result document_reference::get_value() noexcept { return doc->get_value(); }
    +simdjson_inline simdjson_result document_reference::is_null() noexcept { return doc->get_root_value_iterator().is_root_null(false); }
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline document_reference::operator array() & noexcept(false) { return array(*doc); }
    +simdjson_inline document_reference::operator object() & noexcept(false) { return object(*doc); }
    +simdjson_inline document_reference::operator uint64_t() noexcept(false) { return get_uint64(); }
    +simdjson_inline document_reference::operator int64_t() noexcept(false) { return get_int64(); }
    +simdjson_inline document_reference::operator double() noexcept(false) { return get_double(); }
    +simdjson_inline document_reference::operator std::string_view() noexcept(false) { return std::string_view(*doc); }
    +simdjson_inline document_reference::operator raw_json_string() noexcept(false) { return raw_json_string(*doc); }
    +simdjson_inline document_reference::operator bool() noexcept(false) { return get_bool(); }
    +simdjson_inline document_reference::operator value() noexcept(false) { return value(*doc); }
    +#endif
    +simdjson_inline simdjson_result document_reference::count_elements() & noexcept { return doc->count_elements(); }
    +simdjson_inline simdjson_result document_reference::count_fields() & noexcept { return doc->count_fields(); }
    +simdjson_inline simdjson_result document_reference::at(size_t index) & noexcept { return doc->at(index); }
    +simdjson_inline simdjson_result document_reference::begin() & noexcept { return doc->begin(); }
    +simdjson_inline simdjson_result document_reference::end() & noexcept { return doc->end(); }
    +simdjson_inline simdjson_result document_reference::find_field(std::string_view key) & noexcept { return doc->find_field(key); }
    +simdjson_inline simdjson_result document_reference::find_field(const char *key) & noexcept { return doc->find_field(key); }
    +simdjson_inline simdjson_result document_reference::operator[](std::string_view key) & noexcept { return (*doc)[key]; }
    +simdjson_inline simdjson_result document_reference::operator[](const char *key) & noexcept { return (*doc)[key]; }
    +simdjson_inline simdjson_result document_reference::find_field_unordered(std::string_view key) & noexcept { return doc->find_field_unordered(key); }
    +simdjson_inline simdjson_result document_reference::find_field_unordered(const char *key) & noexcept { return doc->find_field_unordered(key); }
    +simdjson_inline simdjson_result document_reference::type() noexcept { return doc->type(); }
    +simdjson_inline simdjson_result document_reference::is_scalar() noexcept { return doc->is_scalar(); }
    +simdjson_inline simdjson_result document_reference::current_location() noexcept { return doc->current_location(); }
    +simdjson_inline int32_t document_reference::current_depth() const noexcept { return doc->current_depth(); }
    +simdjson_inline bool document_reference::is_negative() noexcept { return doc->is_negative(); }
    +simdjson_inline simdjson_result document_reference::is_integer() noexcept { return doc->get_root_value_iterator().is_root_integer(false); }
    +simdjson_inline simdjson_result document_reference::get_number_type() noexcept { return doc->get_root_value_iterator().get_root_number_type(false); }
    +simdjson_inline simdjson_result document_reference::get_number() noexcept { return doc->get_root_value_iterator().get_root_number(false); }
    +simdjson_inline simdjson_result document_reference::raw_json_token() noexcept { return doc->raw_json_token(); }
    +simdjson_inline simdjson_result document_reference::at_pointer(std::string_view json_pointer) noexcept { return doc->at_pointer(json_pointer); }
    +simdjson_inline simdjson_result document_reference::raw_json() noexcept { return doc->raw_json();}
    +simdjson_inline document_reference::operator document&() const noexcept { return *doc; }
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +
    +
    +namespace simdjson {
    +simdjson_inline simdjson_result::simdjson_result(arm64::ondemand::document_reference value, error_code error)
    +  noexcept : implementation_simdjson_result_base(std::forward(value), error) {}
    +
    +
    +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline error_code simdjson_result::rewind() noexcept {
    +  if (error()) { return error(); }
    +  first.rewind();
    +  return SUCCESS;
    +}
    +simdjson_inline simdjson_result simdjson_result::begin() & noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() & noexcept {
    +  return {};
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_array();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_object();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_bool();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_value() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_value();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_null() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_null();
    +}
    +simdjson_inline simdjson_result simdjson_result::type() noexcept {
    +  if (error()) { return error(); }
    +  return first.type();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_scalar();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_negative() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_negative();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_integer();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number_type();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number();
    +}
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline simdjson_result::operator arm64::ondemand::array() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator arm64::ondemand::object() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator int64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator double() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator arm64::ondemand::raw_json_string() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator bool() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator arm64::ondemand::value() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +#endif
    +
    +simdjson_inline simdjson_result simdjson_result::current_location() noexcept {
    +  if (error()) { return error(); }
    +  return first.current_location();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json_token();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H
    +/* end file simdjson/generic/ondemand/document-inl.h for arm64 */
    +/* including simdjson/generic/ondemand/document_stream-inl.h for arm64: #include "simdjson/generic/ondemand/document_stream-inl.h" */
    +/* begin file simdjson/generic/ondemand/document_stream-inl.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document_stream.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +
    +inline void stage1_worker::finish() {
    +  // After calling "run" someone would call finish() to wait
    +  // for the end of the processing.
    +  // This function will wait until either the thread has done
    +  // the processing or, else, the destructor has been called.
    +  std::unique_lock lock(locking_mutex);
    +  cond_var.wait(lock, [this]{return has_work == false;});
    +}
    +
    +inline stage1_worker::~stage1_worker() {
    +  // The thread may never outlive the stage1_worker instance
    +  // and will always be stopped/joined before the stage1_worker
    +  // instance is gone.
    +  stop_thread();
    +}
    +
    +inline void stage1_worker::start_thread() {
    +  std::unique_lock lock(locking_mutex);
    +  if(thread.joinable()) {
    +    return; // This should never happen but we never want to create more than one thread.
    +  }
    +  thread = std::thread([this]{
    +      while(true) {
    +        std::unique_lock thread_lock(locking_mutex);
    +        // We wait for either "run" or "stop_thread" to be called.
    +        cond_var.wait(thread_lock, [this]{return has_work || !can_work;});
    +        // If, for some reason, the stop_thread() method was called (i.e., the
    +        // destructor of stage1_worker is called, then we want to immediately destroy
    +        // the thread (and not do any more processing).
    +        if(!can_work) {
    +          break;
    +        }
    +        this->owner->stage1_thread_error = this->owner->run_stage1(*this->stage1_thread_parser,
    +              this->_next_batch_start);
    +        this->has_work = false;
    +        // The condition variable call should be moved after thread_lock.unlock() for performance
    +        // reasons but thread sanitizers may report it as a data race if we do.
    +        // See https://stackoverflow.com/questions/35775501/c-should-condition-variable-be-notified-under-lock
    +        cond_var.notify_one(); // will notify "finish"
    +        thread_lock.unlock();
    +      }
    +    }
    +  );
    +}
    +
    +
    +inline void stage1_worker::stop_thread() {
    +  std::unique_lock lock(locking_mutex);
    +  // We have to make sure that all locks can be released.
    +  can_work = false;
    +  has_work = false;
    +  cond_var.notify_all();
    +  lock.unlock();
    +  if(thread.joinable()) {
    +    thread.join();
    +  }
    +}
    +
    +inline void stage1_worker::run(document_stream * ds, parser * stage1, size_t next_batch_start) {
    +  std::unique_lock lock(locking_mutex);
    +  owner = ds;
    +  _next_batch_start = next_batch_start;
    +  stage1_thread_parser = stage1;
    +  has_work = true;
    +  // The condition variable call should be moved after thread_lock.unlock() for performance
    +  // reasons but thread sanitizers may report it as a data race if we do.
    +  // See https://stackoverflow.com/questions/35775501/c-should-condition-variable-be-notified-under-lock
    +  cond_var.notify_one(); // will notify the thread lock that we have work
    +  lock.unlock();
    +}
    +
    +#endif  // SIMDJSON_THREADS_ENABLED
    +
    +simdjson_inline document_stream::document_stream(
    +  ondemand::parser &_parser,
    +  const uint8_t *_buf,
    +  size_t _len,
    +  size_t _batch_size,
    +  bool _allow_comma_separated
    +) noexcept
    +  : parser{&_parser},
    +    buf{_buf},
    +    len{_len},
    +    batch_size{_batch_size <= MINIMAL_BATCH_SIZE ? MINIMAL_BATCH_SIZE : _batch_size},
    +    allow_comma_separated{_allow_comma_separated},
    +    error{SUCCESS}
    +    #ifdef SIMDJSON_THREADS_ENABLED
    +    , use_thread(_parser.threaded) // we need to make a copy because _parser.threaded can change
    +    #endif
    +{
    +#ifdef SIMDJSON_THREADS_ENABLED
    +  if(worker.get() == nullptr) {
    +    error = MEMALLOC;
    +  }
    +#endif
    +}
    +
    +simdjson_inline document_stream::document_stream() noexcept
    +  : parser{nullptr},
    +    buf{nullptr},
    +    len{0},
    +    batch_size{0},
    +    allow_comma_separated{false},
    +    error{UNINITIALIZED}
    +    #ifdef SIMDJSON_THREADS_ENABLED
    +    , use_thread(false)
    +    #endif
    +{
    +}
    +
    +simdjson_inline document_stream::~document_stream() noexcept
    +{
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  worker.reset();
    +  #endif
    +}
    +
    +inline size_t document_stream::size_in_bytes() const noexcept {
    +  return len;
    +}
    +
    +inline size_t document_stream::truncated_bytes() const noexcept {
    +  if(error == CAPACITY) { return len - batch_start; }
    +  return parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] - parser->implementation->structural_indexes[parser->implementation->n_structural_indexes + 1];
    +}
    +
    +simdjson_inline document_stream::iterator::iterator() noexcept
    +  : stream{nullptr}, finished{true} {
    +}
    +
    +simdjson_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept
    +  : stream{_stream}, finished{is_end} {
    +}
    +
    +simdjson_inline simdjson_result document_stream::iterator::operator*() noexcept {
    +  //if(stream->error) { return stream->error; }
    +  return simdjson_result(stream->doc, stream->error);
    +}
    +
    +simdjson_inline document_stream::iterator& document_stream::iterator::operator++() noexcept {
    +  // If there is an error, then we want the iterator
    +  // to be finished, no matter what. (E.g., we do not
    +  // keep generating documents with errors, or go beyond
    +  // a document with errors.)
    +  //
    +  // Users do not have to call "operator*()" when they use operator++,
    +  // so we need to end the stream in the operator++ function.
    +  //
    +  // Note that setting finished = true is essential otherwise
    +  // we would enter an infinite loop.
    +  if (stream->error) { finished = true; }
    +  // Note that stream->error() is guarded against error conditions
    +  // (it will immediately return if stream->error casts to false).
    +  // In effect, this next function does nothing when (stream->error)
    +  // is true (hence the risk of an infinite loop).
    +  stream->next();
    +  // If that was the last document, we're finished.
    +  // It is the only type of error we do not want to appear
    +  // in operator*.
    +  if (stream->error == EMPTY) { finished = true; }
    +  // If we had any other kind of error (not EMPTY) then we want
    +  // to pass it along to the operator* and we cannot mark the result
    +  // as "finished" just yet.
    +  return *this;
    +}
    +
    +simdjson_inline bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept {
    +  return finished != other.finished;
    +}
    +
    +simdjson_inline document_stream::iterator document_stream::begin() noexcept {
    +  start();
    +  // If there are no documents, we're finished.
    +  return iterator(this, error == EMPTY);
    +}
    +
    +simdjson_inline document_stream::iterator document_stream::end() noexcept {
    +  return iterator(this, true);
    +}
    +
    +inline void document_stream::start() noexcept {
    +  if (error) { return; }
    +  error = parser->allocate(batch_size);
    +  if (error) { return; }
    +  // Always run the first stage 1 parse immediately
    +  batch_start = 0;
    +  error = run_stage1(*parser, batch_start);
    +  while(error == EMPTY) {
    +    // In exceptional cases, we may start with an empty block
    +    batch_start = next_batch_start();
    +    if (batch_start >= len) { return; }
    +    error = run_stage1(*parser, batch_start);
    +  }
    +  if (error) { return; }
    +  doc_index = batch_start;
    +  doc = document(json_iterator(&buf[batch_start], parser));
    +  doc.iter._streaming = true;
    +
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  if (use_thread && next_batch_start() < len) {
    +    // Kick off the first thread on next batch if needed
    +    error = stage1_thread_parser.allocate(batch_size);
    +    if (error) { return; }
    +    worker->start_thread();
    +    start_stage1_thread();
    +    if (error) { return; }
    +  }
    +  #endif // SIMDJSON_THREADS_ENABLED
    +}
    +
    +inline void document_stream::next() noexcept {
    +  // We always enter at once once in an error condition.
    +  if (error) { return; }
    +  next_document();
    +  if (error) { return; }
    +  auto cur_struct_index = doc.iter._root - parser->implementation->structural_indexes.get();
    +  doc_index = batch_start + parser->implementation->structural_indexes[cur_struct_index];
    +
    +  // Check if at end of structural indexes (i.e. at end of batch)
    +  if(cur_struct_index >= static_cast(parser->implementation->n_structural_indexes)) {
    +    error = EMPTY;
    +    // Load another batch (if available)
    +    while (error == EMPTY) {
    +      batch_start = next_batch_start();
    +      if (batch_start >= len) { break; }
    +      #ifdef SIMDJSON_THREADS_ENABLED
    +      if(use_thread) {
    +        load_from_stage1_thread();
    +      } else {
    +        error = run_stage1(*parser, batch_start);
    +      }
    +      #else
    +      error = run_stage1(*parser, batch_start);
    +      #endif
    +      /**
    +       * Whenever we move to another window, we need to update all pointers to make
    +       * it appear as if the input buffer started at the beginning of the window.
    +       *
    +       * Take this input:
    +       *
    +       * {"z":5}  {"1":1,"2":2,"4":4} [7,  10,   9]  [15,  11,   12, 13]  [154,  110,   112, 1311]
    +       *
    +       * Say you process the following window...
    +       *
    +       * '{"z":5}  {"1":1,"2":2,"4":4} [7,  10,   9]'
    +       *
    +       * When you do so, the json_iterator has a pointer at the beginning of the memory region
    +       * (pointing at the beginning of '{"z"...'.
    +       *
    +       * When you move to the window that starts at...
    +       *
    +       * '[7,  10,   9]  [15,  11,   12, 13] ...
    +       *
    +       * then it is not sufficient to just run stage 1. You also need to re-anchor the
    +       * json_iterator so that it believes we are starting at '[7,  10,   9]...'.
    +       *
    +       * Under the DOM front-end, this gets done automatically because the parser owns
    +       * the pointer the data, and when you call stage1 and then stage2 on the same
    +       * parser, then stage2 will run on the pointer acquired by stage1.
    +       *
    +       * That is, stage1 calls "this->buf = _buf" so the parser remembers the buffer that
    +       * we used. But json_iterator has no callback when stage1 is called on the parser.
    +       * In fact, I think that the parser is unaware of json_iterator.
    +       *
    +       *
    +       * So we need to re-anchor the json_iterator after each call to stage 1 so that
    +       * all of the pointers are in sync.
    +       */
    +      doc.iter = json_iterator(&buf[batch_start], parser);
    +      doc.iter._streaming = true;
    +      /**
    +       * End of resync.
    +       */
    +
    +      if (error) { continue; } // If the error was EMPTY, we may want to load another batch.
    +      doc_index = batch_start;
    +    }
    +  }
    +}
    +
    +inline void document_stream::next_document() noexcept {
    +  // Go to next place where depth=0 (document depth)
    +  error = doc.iter.skip_child(0);
    +  if (error) { return; }
    +  // Always set depth=1 at the start of document
    +  doc.iter._depth = 1;
    +  // consume comma if comma separated is allowed
    +  if (allow_comma_separated) { doc.iter.consume_character(','); }
    +  // Resets the string buffer at the beginning, thus invalidating the strings.
    +  doc.iter._string_buf_loc = parser->string_buf.get();
    +  doc.iter._root = doc.iter.position();
    +}
    +
    +inline size_t document_stream::next_batch_start() const noexcept {
    +  return batch_start + parser->implementation->structural_indexes[parser->implementation->n_structural_indexes];
    +}
    +
    +inline error_code document_stream::run_stage1(ondemand::parser &p, size_t _batch_start) noexcept {
    +  // This code only updates the structural index in the parser, it does not update any json_iterator
    +  // instance.
    +  size_t remaining = len - _batch_start;
    +  if (remaining <= batch_size) {
    +    return p.implementation->stage1(&buf[_batch_start], remaining, stage1_mode::streaming_final);
    +  } else {
    +    return p.implementation->stage1(&buf[_batch_start], batch_size, stage1_mode::streaming_partial);
    +  }
    +}
    +
    +simdjson_inline size_t document_stream::iterator::current_index() const noexcept {
    +  return stream->doc_index;
    +}
    +
    +simdjson_inline std::string_view document_stream::iterator::source() const noexcept {
    +  auto depth = stream->doc.iter.depth();
    +  auto cur_struct_index = stream->doc.iter._root - stream->parser->implementation->structural_indexes.get();
    +
    +  // If at root, process the first token to determine if scalar value
    +  if (stream->doc.iter.at_root()) {
    +    switch (stream->buf[stream->batch_start + stream->parser->implementation->structural_indexes[cur_struct_index]]) {
    +      case '{': case '[':   // Depth=1 already at start of document
    +        break;
    +      case '}': case ']':
    +        depth--;
    +        break;
    +      default:    // Scalar value document
    +        // TODO: Remove any trailing whitespaces
    +        // This returns a string spanning from start of value to the beginning of the next document (excluded)
    +        return std::string_view(reinterpret_cast(stream->buf) + current_index(), stream->parser->implementation->structural_indexes[++cur_struct_index] - current_index() - 1);
    +    }
    +    cur_struct_index++;
    +  }
    +
    +  while (cur_struct_index <= static_cast(stream->parser->implementation->n_structural_indexes)) {
    +    switch (stream->buf[stream->batch_start + stream->parser->implementation->structural_indexes[cur_struct_index]]) {
    +      case '{': case '[':
    +        depth++;
    +        break;
    +      case '}': case ']':
    +        depth--;
    +        break;
    +    }
    +    if (depth == 0) { break; }
    +    cur_struct_index++;
    +  }
    +
    +  return std::string_view(reinterpret_cast(stream->buf) + current_index(), stream->parser->implementation->structural_indexes[cur_struct_index] - current_index() + stream->batch_start + 1);;
    +}
    +
    +inline error_code document_stream::iterator::error() const noexcept {
    +  return stream->error;
    +}
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +
    +inline void document_stream::load_from_stage1_thread() noexcept {
    +  worker->finish();
    +  // Swap to the parser that was loaded up in the thread. Make sure the parser has
    +  // enough memory to swap to, as well.
    +  std::swap(stage1_thread_parser,*parser);
    +  error = stage1_thread_error;
    +  if (error) { return; }
    +
    +  // If there's anything left, start the stage 1 thread!
    +  if (next_batch_start() < len) {
    +    start_stage1_thread();
    +  }
    +}
    +
    +inline void document_stream::start_stage1_thread() noexcept {
    +  // we call the thread on a lambda that will update
    +  // this->stage1_thread_error
    +  // there is only one thread that may write to this value
    +  // TODO this is NOT exception-safe.
    +  this->stage1_thread_error = UNINITIALIZED; // In case something goes wrong, make sure it's an error
    +  size_t _next_batch_start = this->next_batch_start();
    +
    +  worker->run(this, & this->stage1_thread_parser, _next_batch_start);
    +}
    +
    +#endif // SIMDJSON_THREADS_ENABLED
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(error)
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  arm64::ondemand::document_stream &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +
    +}
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H
    +/* end file simdjson/generic/ondemand/document_stream-inl.h for arm64 */
    +/* including simdjson/generic/ondemand/field-inl.h for arm64: #include "simdjson/generic/ondemand/field-inl.h" */
    +/* begin file simdjson/generic/ondemand/field-inl.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/field.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +// clang 6 doesn't think the default constructor can be noexcept, so we make it explicit
    +simdjson_inline field::field() noexcept : std::pair() {}
    +
    +simdjson_inline field::field(raw_json_string key, ondemand::value &&value) noexcept
    +  : std::pair(key, std::forward(value))
    +{
    +}
    +
    +simdjson_inline simdjson_result field::start(value_iterator &parent_iter) noexcept {
    +  raw_json_string key;
    +  SIMDJSON_TRY( parent_iter.field_key().get(key) );
    +  SIMDJSON_TRY( parent_iter.field_value() );
    +  return field::start(parent_iter, key);
    +}
    +
    +simdjson_inline simdjson_result field::start(const value_iterator &parent_iter, raw_json_string key) noexcept {
    +    return field(key, parent_iter.child());
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result field::unescaped_key(bool allow_replacement) noexcept {
    +  SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() but Visual Studio won't let us.
    +  simdjson_result answer = first.unescape(second.iter.json_iter(), allow_replacement);
    +  first.consume();
    +  return answer;
    +}
    +
    +simdjson_inline raw_json_string field::key() const noexcept {
    +  SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() by Visual Studio won't let us.
    +  return first;
    +}
    +
    +simdjson_inline value &field::value() & noexcept {
    +  return second;
    +}
    +
    +simdjson_inline value field::value() && noexcept {
    +  return std::forward(*this).second;
    +}
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  arm64::ondemand::field &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::key() noexcept {
    +  if (error()) { return error(); }
    +  return first.key();
    +}
    +simdjson_inline simdjson_result simdjson_result::unescaped_key(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.unescaped_key(allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::value() noexcept {
    +  if (error()) { return error(); }
    +  return std::move(first.value());
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H
    +/* end file simdjson/generic/ondemand/field-inl.h for arm64 */
    +/* including simdjson/generic/ondemand/json_iterator-inl.h for arm64: #include "simdjson/generic/ondemand/json_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/json_iterator-inl.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/logger-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/token_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept
    +  : token(std::forward(other.token)),
    +    parser{other.parser},
    +    _string_buf_loc{other._string_buf_loc},
    +    error{other.error},
    +    _depth{other._depth},
    +    _root{other._root},
    +    _streaming{other._streaming}
    +{
    +  other.parser = nullptr;
    +}
    +simdjson_inline json_iterator &json_iterator::operator=(json_iterator &&other) noexcept {
    +  token = other.token;
    +  parser = other.parser;
    +  _string_buf_loc = other._string_buf_loc;
    +  error = other.error;
    +  _depth = other._depth;
    +  _root = other._root;
    +  _streaming = other._streaming;
    +  other.parser = nullptr;
    +  return *this;
    +}
    +
    +simdjson_inline json_iterator::json_iterator(const uint8_t *buf, ondemand::parser *_parser) noexcept
    +  : token(buf, &_parser->implementation->structural_indexes[0]),
    +    parser{_parser},
    +    _string_buf_loc{parser->string_buf.get()},
    +    _depth{1},
    +    _root{parser->implementation->structural_indexes.get()},
    +    _streaming{false}
    +
    +{
    +  logger::log_headers();
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens();
    +#endif
    +}
    +
    +inline void json_iterator::rewind() noexcept {
    +  token.set_position( root_position() );
    +  logger::log_headers(); // We start again
    +  _string_buf_loc = parser->string_buf.get();
    +  _depth = 1;
    +}
    +
    +inline bool json_iterator::balanced() const noexcept {
    +  token_iterator ti(token);
    +  int32_t count{0};
    +  ti.set_position( root_position() );
    +  while(ti.peek() <= peek_last()) {
    +    switch (*ti.return_current_and_advance())
    +    {
    +    case '[': case '{':
    +      count++;
    +      break;
    +    case ']': case '}':
    +      count--;
    +      break;
    +    default:
    +      break;
    +    }
    +  }
    +  return count == 0;
    +}
    +
    +
    +// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller
    +// relating depth and parent_depth, which is a desired effect. The warning does not show up if the
    +// skip_child() function is not marked inline).
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_warn_unused simdjson_inline error_code json_iterator::skip_child(depth_t parent_depth) noexcept {
    +  if (depth() <= parent_depth) { return SUCCESS; }
    +  switch (*return_current_and_advance()) {
    +    // TODO consider whether matching braces is a requirement: if non-matching braces indicates
    +    // *missing* braces, then future lookups are not in the object/arrays they think they are,
    +    // violating the rule "validate enough structure that the user can be confident they are
    +    // looking at the right values."
    +    // PERF TODO we can eliminate the switch here with a lookup of how much to add to depth
    +
    +    // For the first open array/object in a value, we've already incremented depth, so keep it the same
    +    // We never stop at colon, but if we did, it wouldn't affect depth
    +    case '[': case '{': case ':':
    +      logger::log_start_value(*this, "skip");
    +      break;
    +    // If there is a comma, we have just finished a value in an array/object, and need to get back in
    +    case ',':
    +      logger::log_value(*this, "skip");
    +      break;
    +    // ] or } means we just finished a value and need to jump out of the array/object
    +    case ']': case '}':
    +      logger::log_end_value(*this, "skip");
    +      _depth--;
    +      if (depth() <= parent_depth) { return SUCCESS; }
    +#if SIMDJSON_CHECK_EOF
    +      // If there are no more tokens, the parent is incomplete.
    +      if (at_end()) { return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "Missing [ or { at start"); }
    +#endif // SIMDJSON_CHECK_EOF
    +      break;
    +    case '"':
    +      if(*peek() == ':') {
    +        // We are at a key!!!
    +        // This might happen if you just started an object and you skip it immediately.
    +        // Performance note: it would be nice to get rid of this check as it is somewhat
    +        // expensive.
    +        // https://github.com/simdjson/simdjson/issues/1742
    +        logger::log_value(*this, "key");
    +        return_current_and_advance(); // eat up the ':'
    +        break; // important!!!
    +      }
    +      simdjson_fallthrough;
    +    // Anything else must be a scalar value
    +    default:
    +      // For the first scalar, we will have incremented depth already, so we decrement it here.
    +      logger::log_value(*this, "skip");
    +      _depth--;
    +      if (depth() <= parent_depth) { return SUCCESS; }
    +      break;
    +  }
    +
    +  // Now that we've considered the first value, we only increment/decrement for arrays/objects
    +  while (position() < end_position()) {
    +    switch (*return_current_and_advance()) {
    +      case '[': case '{':
    +        logger::log_start_value(*this, "skip");
    +        _depth++;
    +        break;
    +      // TODO consider whether matching braces is a requirement: if non-matching braces indicates
    +      // *missing* braces, then future lookups are not in the object/arrays they think they are,
    +      // violating the rule "validate enough structure that the user can be confident they are
    +      // looking at the right values."
    +      // PERF TODO we can eliminate the switch here with a lookup of how much to add to depth
    +      case ']': case '}':
    +        logger::log_end_value(*this, "skip");
    +        _depth--;
    +        if (depth() <= parent_depth) { return SUCCESS; }
    +        break;
    +      default:
    +        logger::log_value(*this, "skip", "");
    +        break;
    +    }
    +  }
    +
    +  return report_error(TAPE_ERROR, "not enough close braces");
    +}
    +
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_inline bool json_iterator::at_root() const noexcept {
    +  return position() == root_position();
    +}
    +
    +simdjson_inline bool json_iterator::is_single_token() const noexcept {
    +  return parser->implementation->n_structural_indexes == 1;
    +}
    +
    +simdjson_inline bool json_iterator::streaming() const noexcept {
    +  return _streaming;
    +}
    +
    +simdjson_inline token_position json_iterator::root_position() const noexcept {
    +  return _root;
    +}
    +
    +simdjson_inline void json_iterator::assert_at_document_depth() const noexcept {
    +  SIMDJSON_ASSUME( _depth == 1 );
    +}
    +
    +simdjson_inline void json_iterator::assert_at_root() const noexcept {
    +  SIMDJSON_ASSUME( _depth == 1 );
    +#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
    +  // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument
    +  // has side effects that will be discarded.
    +  SIMDJSON_ASSUME( token.position() == _root );
    +#endif
    +}
    +
    +simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) const noexcept {
    +  assert_valid_position(token._position + required_tokens - 1);
    +}
    +
    +simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept {
    +#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
    +  SIMDJSON_ASSUME( position >= &parser->implementation->structural_indexes[0] );
    +  SIMDJSON_ASSUME( position < &parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] );
    +#endif
    +}
    +
    +simdjson_inline bool json_iterator::at_end() const noexcept {
    +  return position() == end_position();
    +}
    +simdjson_inline token_position json_iterator::end_position() const noexcept {
    +  uint32_t n_structural_indexes{parser->implementation->n_structural_indexes};
    +  return &parser->implementation->structural_indexes[n_structural_indexes];
    +}
    +
    +inline std::string json_iterator::to_string() const noexcept {
    +  if( !is_alive() ) { return "dead json_iterator instance"; }
    +  const char * current_structural = reinterpret_cast(token.peek());
    +  return std::string("json_iterator [ depth : ") + std::to_string(_depth)
    +          + std::string(", structural : '") + std::string(current_structural,1)
    +          + std::string("', offset : ") + std::to_string(token.current_offset())
    +          + std::string("', error : ") + error_message(error)
    +          + std::string(" ]");
    +}
    +
    +inline simdjson_result json_iterator::current_location() const noexcept {
    +  if (!is_alive()) {    // Unrecoverable error
    +    if (!at_root()) {
    +      return reinterpret_cast(token.peek(-1));
    +    } else {
    +      return reinterpret_cast(token.peek());
    +    }
    +  }
    +  if (at_end()) {
    +    return OUT_OF_BOUNDS;
    +  }
    +  return reinterpret_cast(token.peek());
    +}
    +
    +simdjson_inline bool json_iterator::is_alive() const noexcept {
    +  return parser;
    +}
    +
    +simdjson_inline void json_iterator::abandon() noexcept {
    +  parser = nullptr;
    +  _depth = 0;
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::return_current_and_advance() noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens();
    +#endif // SIMDJSON_CHECK_EOF
    +  return token.return_current_and_advance();
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::unsafe_pointer() const noexcept {
    +  // deliberately done without safety guard:
    +  return token.peek();
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::peek(int32_t delta) const noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens(delta+1);
    +#endif // SIMDJSON_CHECK_EOF
    +  return token.peek(delta);
    +}
    +
    +simdjson_inline uint32_t json_iterator::peek_length(int32_t delta) const noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens(delta+1);
    +#endif // #if SIMDJSON_CHECK_EOF
    +  return token.peek_length(delta);
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::peek(token_position position) const noexcept {
    +  // todo: currently we require end-of-string buffering, but the following
    +  // assert_valid_position should be turned on if/when we lift that condition.
    +  // assert_valid_position(position);
    +  // This is almost surely related to SIMDJSON_CHECK_EOF but given that SIMDJSON_CHECK_EOF
    +  // is ON by default, we have no choice but to disable it for real with a comment.
    +  return token.peek(position);
    +}
    +
    +simdjson_inline uint32_t json_iterator::peek_length(token_position position) const noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_valid_position(position);
    +#endif // SIMDJSON_CHECK_EOF
    +  return token.peek_length(position);
    +}
    +
    +simdjson_inline token_position json_iterator::last_position() const noexcept {
    +  // The following line fails under some compilers...
    +  // SIMDJSON_ASSUME(parser->implementation->n_structural_indexes > 0);
    +  // since it has side-effects.
    +  uint32_t n_structural_indexes{parser->implementation->n_structural_indexes};
    +  SIMDJSON_ASSUME(n_structural_indexes > 0);
    +  return &parser->implementation->structural_indexes[n_structural_indexes - 1];
    +}
    +simdjson_inline const uint8_t *json_iterator::peek_last() const noexcept {
    +  return token.peek(last_position());
    +}
    +
    +simdjson_inline void json_iterator::ascend_to(depth_t parent_depth) noexcept {
    +  SIMDJSON_ASSUME(parent_depth >= 0 && parent_depth < INT32_MAX - 1);
    +  SIMDJSON_ASSUME(_depth == parent_depth + 1);
    +  _depth = parent_depth;
    +}
    +
    +simdjson_inline void json_iterator::descend_to(depth_t child_depth) noexcept {
    +  SIMDJSON_ASSUME(child_depth >= 1 && child_depth < INT32_MAX);
    +  SIMDJSON_ASSUME(_depth == child_depth - 1);
    +  _depth = child_depth;
    +}
    +
    +simdjson_inline depth_t json_iterator::depth() const noexcept {
    +  return _depth;
    +}
    +
    +simdjson_inline uint8_t *&json_iterator::string_buf_loc() noexcept {
    +  return _string_buf_loc;
    +}
    +
    +simdjson_inline error_code json_iterator::report_error(error_code _error, const char *message) noexcept {
    +  SIMDJSON_ASSUME(_error != SUCCESS && _error != UNINITIALIZED && _error != INCORRECT_TYPE && _error != NO_SUCH_FIELD);
    +  logger::log_error(*this, message);
    +  error = _error;
    +  return error;
    +}
    +
    +simdjson_inline token_position json_iterator::position() const noexcept {
    +  return token.position();
    +}
    +
    +simdjson_inline simdjson_result json_iterator::unescape(raw_json_string in, bool allow_replacement) noexcept {
    +  return parser->unescape(in, _string_buf_loc, allow_replacement);
    +}
    +
    +simdjson_inline simdjson_result json_iterator::unescape_wobbly(raw_json_string in) noexcept {
    +  return parser->unescape_wobbly(in, _string_buf_loc);
    +}
    +
    +simdjson_inline void json_iterator::reenter_child(token_position position, depth_t child_depth) noexcept {
    +  SIMDJSON_ASSUME(child_depth >= 1 && child_depth < INT32_MAX);
    +  SIMDJSON_ASSUME(_depth == child_depth - 1);
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
    +  SIMDJSON_ASSUME(size_t(child_depth) < parser->max_depth());
    +  SIMDJSON_ASSUME(position >= parser->start_positions[child_depth]);
    +#endif
    +#endif
    +  token.set_position(position);
    +  _depth = child_depth;
    +}
    +
    +simdjson_inline error_code json_iterator::consume_character(char c) noexcept {
    +  if (*peek() == c) {
    +    return_current_and_advance();
    +    return SUCCESS;
    +  }
    +  return TAPE_ERROR;
    +}
    +
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +
    +simdjson_inline token_position json_iterator::start_position(depth_t depth) const noexcept {
    +  SIMDJSON_ASSUME(size_t(depth) < parser->max_depth());
    +  return size_t(depth) < parser->max_depth() ? parser->start_positions[depth] : 0;
    +}
    +
    +simdjson_inline void json_iterator::set_start_position(depth_t depth, token_position position) noexcept {
    +  SIMDJSON_ASSUME(size_t(depth) < parser->max_depth());
    +  if(size_t(depth) < parser->max_depth()) { parser->start_positions[depth] = position; }
    +}
    +
    +#endif
    +
    +
    +simdjson_inline error_code json_iterator::optional_error(error_code _error, const char *message) noexcept {
    +  SIMDJSON_ASSUME(_error == INCORRECT_TYPE || _error == NO_SUCH_FIELD);
    +  logger::log_error(*this, message);
    +  return _error;
    +}
    +
    +
    +simdjson_warn_unused simdjson_inline bool json_iterator::copy_to_buffer(const uint8_t *json, uint32_t max_len, uint8_t *tmpbuf, size_t N) noexcept {
    +  // This function is not expected to be called in performance-sensitive settings.
    +  // Let us guard against silly cases:
    +  if((N < max_len) || (N == 0)) { return false; }
    +  // Copy to the buffer.
    +  std::memcpy(tmpbuf, json, max_len);
    +  if(N > max_len) { // We pad whatever remains with ' '.
    +    std::memset(tmpbuf + max_len, ' ', N - max_len);
    +  }
    +  return true;
    +}
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(arm64::ondemand::json_iterator &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/json_iterator-inl.h for arm64 */
    +/* including simdjson/generic/ondemand/json_type-inl.h for arm64: #include "simdjson/generic/ondemand/json_type-inl.h" */
    +/* begin file simdjson/generic/ondemand/json_type-inl.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +inline std::ostream& operator<<(std::ostream& out, json_type type) noexcept {
    +    switch (type) {
    +        case json_type::array: out << "array"; break;
    +        case json_type::object: out << "object"; break;
    +        case json_type::number: out << "number"; break;
    +        case json_type::string: out << "string"; break;
    +        case json_type::boolean: out << "boolean"; break;
    +        case json_type::null: out << "null"; break;
    +        default: SIMDJSON_UNREACHABLE();
    +    }
    +    return out;
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false) {
    +    return out << type.value();
    +}
    +#endif
    +
    +
    +
    +simdjson_inline number_type number::get_number_type() const noexcept {
    +  return type;
    +}
    +
    +simdjson_inline bool number::is_uint64() const noexcept {
    +  return get_number_type() == number_type::unsigned_integer;
    +}
    +
    +simdjson_inline uint64_t number::get_uint64() const noexcept {
    +  return payload.unsigned_integer;
    +}
    +
    +simdjson_inline number::operator uint64_t() const noexcept {
    +  return get_uint64();
    +}
    +
    +
    +simdjson_inline bool number::is_int64() const noexcept {
    +  return get_number_type() == number_type::signed_integer;
    +}
    +
    +simdjson_inline int64_t number::get_int64() const noexcept {
    +  return payload.signed_integer;
    +}
    +
    +simdjson_inline number::operator int64_t() const noexcept {
    +  return get_int64();
    +}
    +
    +simdjson_inline bool number::is_double() const noexcept {
    +    return get_number_type() == number_type::floating_point_number;
    +}
    +
    +simdjson_inline double number::get_double() const noexcept {
    +  return payload.floating_point_number;
    +}
    +
    +simdjson_inline number::operator double() const noexcept {
    +  return get_double();
    +}
    +
    +simdjson_inline double number::as_double() const noexcept {
    +  if(is_double()) {
    +    return payload.floating_point_number;
    +  }
    +  if(is_int64()) {
    +    return double(payload.signed_integer);
    +  }
    +  return double(payload.unsigned_integer);
    +}
    +
    +simdjson_inline void number::append_s64(int64_t value) noexcept {
    +  payload.signed_integer = value;
    +  type = number_type::signed_integer;
    +}
    +
    +simdjson_inline void number::append_u64(uint64_t value) noexcept {
    +  payload.unsigned_integer = value;
    +  type = number_type::unsigned_integer;
    +}
    +
    +simdjson_inline void number::append_double(double value) noexcept {
    +  payload.floating_point_number = value;
    +  type = number_type::floating_point_number;
    +}
    +
    +simdjson_inline void number::skip_double() noexcept {
    +  type = number_type::floating_point_number;
    +}
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(arm64::ondemand::json_type &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H
    +/* end file simdjson/generic/ondemand/json_type-inl.h for arm64 */
    +/* including simdjson/generic/ondemand/logger-inl.h for arm64: #include "simdjson/generic/ondemand/logger-inl.h" */
    +/* begin file simdjson/generic/ondemand/logger-inl.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/logger.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +namespace logger {
    +
    +static constexpr const char * DASHES = "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------";
    +static constexpr const int LOG_EVENT_LEN = 20;
    +static constexpr const int LOG_BUFFER_LEN = 30;
    +static constexpr const int LOG_SMALL_BUFFER_LEN = 10;
    +static int log_depth = 0; // Not threadsafe. Log only.
    +
    +// Helper to turn unprintable or newline characters into spaces
    +static inline char printable_char(char c) {
    +  if (c >= 0x20) {
    +    return c;
    +  } else {
    +    return ' ';
    +  }
    +}
    +
    +template
    +static inline std::string string_format(const std::string& format, const Args&... args)
    +{
    +  SIMDJSON_PUSH_DISABLE_ALL_WARNINGS
    +  int size_s = std::snprintf(nullptr, 0, format.c_str(), args...) + 1;
    +  auto size = static_cast(size_s);
    +  if (size <= 0) return std::string();
    +  std::unique_ptr buf(new char[size]);
    +  std::snprintf(buf.get(), size, format.c_str(), args...);
    +  SIMDJSON_POP_DISABLE_WARNINGS
    +  return std::string(buf.get(), buf.get() + size - 1);
    +}
    +
    +static inline log_level get_log_level_from_env()
    +{
    +  SIMDJSON_PUSH_DISABLE_WARNINGS
    +  SIMDJSON_DISABLE_DEPRECATED_WARNING // Disable CRT_SECURE warning on MSVC: manually verified this is safe
    +      char *lvl = getenv("SIMDJSON_LOG_LEVEL");
    +  SIMDJSON_POP_DISABLE_WARNINGS
    +  if (lvl && simdjson_strcasecmp(lvl, "ERROR") == 0) { return log_level::error; }
    +  return log_level::info;
    +}
    +
    +static inline log_level log_threshold()
    +{
    +  static log_level threshold = get_log_level_from_env();
    +  return threshold;
    +}
    +
    +static inline bool should_log(log_level level)
    +{
    +  return level >= log_threshold();
    +}
    +
    +inline void log_event(const json_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_line(iter, "", type, detail, delta, depth_delta, log_level::info);
    +}
    +
    +inline void log_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail) noexcept {
    +  log_line(iter, index, depth, "", type, detail, log_level::info);
    +}
    +inline void log_value(const json_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_line(iter, "", type, detail, delta, depth_delta, log_level::info);
    +}
    +
    +inline void log_start_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail) noexcept {
    +  log_line(iter, index, depth, "+", type, detail, log_level::info);
    +  if (LOG_ENABLED) { log_depth++; }
    +}
    +inline void log_start_value(const json_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  log_line(iter, "+", type, "", delta, depth_delta, log_level::info);
    +  if (LOG_ENABLED) { log_depth++; }
    +}
    +
    +inline void log_end_value(const json_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  if (LOG_ENABLED) { log_depth--; }
    +  log_line(iter, "-", type, "", delta, depth_delta, log_level::info);
    +}
    +
    +inline void log_error(const json_iterator &iter, const char *error, const char *detail, int delta, int depth_delta) noexcept {
    +  log_line(iter, "ERROR: ", error, detail, delta, depth_delta, log_level::error);
    +}
    +inline void log_error(const json_iterator &iter, token_position index, depth_t depth, const char *error, const char *detail) noexcept {
    +  log_line(iter, index, depth, "ERROR: ", error, detail, log_level::error);
    +}
    +
    +inline void log_event(const value_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_event(iter.json_iter(), type, detail, delta, depth_delta);
    +}
    +
    +inline void log_value(const value_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_value(iter.json_iter(), type, detail, delta, depth_delta);
    +}
    +
    +inline void log_start_value(const value_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  log_start_value(iter.json_iter(), type, delta, depth_delta);
    +}
    +
    +inline void log_end_value(const value_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  log_end_value(iter.json_iter(), type, delta, depth_delta);
    +}
    +
    +inline void log_error(const value_iterator &iter, const char *error, const char *detail, int delta, int depth_delta) noexcept {
    +  log_error(iter.json_iter(), error, detail, delta, depth_delta);
    +}
    +
    +inline void log_headers() noexcept {
    +  if (LOG_ENABLED) {
    +    if (simdjson_unlikely(should_log(log_level::info))) {
    +      // Technically a static variable is not thread-safe, but if you are using threads and logging... well...
    +      static bool displayed_hint{false};
    +      log_depth = 0;
    +      printf("\n");
    +      if (!displayed_hint) {
    +        // We only print this helpful header once.
    +        printf("# Logging provides the depth and position of the iterator user-visible steps:\n");
    +        printf("# +array says 'this is where we were when we discovered the start array'\n");
    +        printf(
    +            "# -array says 'this is where we were when we ended the array'\n");
    +        printf("# skip says 'this is a structural or value I am skipping'\n");
    +        printf("# +/-skip says 'this is a start/end array or object I am skipping'\n");
    +        printf("#\n");
    +        printf("# The indentation of the terms (array, string,...) indicates the depth,\n");
    +        printf("# in addition to the depth being displayed.\n");
    +        printf("#\n");
    +        printf("# Every token in the document has a single depth determined by the tokens before it,\n");
    +        printf("# and is not affected by what the token actually is.\n");
    +        printf("#\n");
    +        printf("# Not all structural elements are presented as tokens in the logs.\n");
    +        printf("#\n");
    +        printf("# We never give control to the user within an empty array or an empty object.\n");
    +        printf("#\n");
    +        printf("# Inside an array, having a depth greater than the array's depth means that\n");
    +        printf("# we are pointing inside a value.\n");
    +        printf("# Having a depth equal to the array means that we are pointing right before a value.\n");
    +        printf("# Having a depth smaller than the array means that we have moved beyond the array.\n");
    +        displayed_hint = true;
    +      }
    +      printf("\n");
    +      printf("| %-*s ", LOG_EVENT_LEN, "Event");
    +      printf("| %-*s ", LOG_BUFFER_LEN, "Buffer");
    +      printf("| %-*s ", LOG_SMALL_BUFFER_LEN, "Next");
    +      // printf("| %-*s ", 5,                    "Next#");
    +      printf("| %-*s ", 5, "Depth");
    +      printf("| Detail ");
    +      printf("|\n");
    +
    +      printf("|%.*s", LOG_EVENT_LEN + 2, DASHES);
    +      printf("|%.*s", LOG_BUFFER_LEN + 2, DASHES);
    +      printf("|%.*s", LOG_SMALL_BUFFER_LEN + 2, DASHES);
    +      // printf("|%.*s", 5+2, DASHES);
    +      printf("|%.*s", 5 + 2, DASHES);
    +      printf("|--------");
    +      printf("|\n");
    +      fflush(stdout);
    +    }
    +  }
    +}
    +
    +template 
    +inline void log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, log_level level, Args&&... args) noexcept {
    +  log_line(iter, iter.position()+delta, depth_t(iter.depth()+depth_delta), title_prefix, title, detail, level, std::forward(args)...);
    +}
    +
    +template 
    +inline void log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, log_level level, Args&&... args) noexcept {
    +  if (LOG_ENABLED) {
    +    if (simdjson_unlikely(should_log(level))) {
    +      const int indent = depth * 2;
    +      const auto buf = iter.token.buf;
    +      auto msg = string_format(title, std::forward(args)...);
    +      printf("| %*s%s%-*s ", indent, "", title_prefix,
    +             LOG_EVENT_LEN - indent - int(strlen(title_prefix)), msg.c_str());
    +      {
    +        // Print the current structural.
    +        printf("| ");
    +        // Before we begin, the index might point right before the document.
    +        // This could be unsafe, see https://github.com/simdjson/simdjson/discussions/1938
    +        if (index < iter._root) {
    +          printf("%*s", LOG_BUFFER_LEN, "");
    +        } else {
    +          auto current_structural = &buf[*index];
    +          for (int i = 0; i < LOG_BUFFER_LEN; i++) {
    +            printf("%c", printable_char(current_structural[i]));
    +          }
    +        }
    +        printf(" ");
    +      }
    +      {
    +        // Print the next structural.
    +        printf("| ");
    +        auto next_structural = &buf[*(index + 1)];
    +        for (int i = 0; i < LOG_SMALL_BUFFER_LEN; i++) {
    +          printf("%c", printable_char(next_structural[i]));
    +        }
    +        printf(" ");
    +      }
    +      // printf("| %5u ", *(index+1));
    +      printf("| %5i ", depth);
    +      printf("| %6.*s ", int(detail.size()), detail.data());
    +      printf("|\n");
    +      fflush(stdout);
    +    }
    +  }
    +}
    +
    +} // namespace logger
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H
    +/* end file simdjson/generic/ondemand/logger-inl.h for arm64 */
    +/* including simdjson/generic/ondemand/object-inl.h for arm64: #include "simdjson/generic/ondemand/object-inl.h" */
    +/* begin file simdjson/generic/ondemand/object-inl.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/field.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +simdjson_inline simdjson_result object::find_field_unordered(const std::string_view key) & noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_unordered_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +simdjson_inline simdjson_result object::find_field_unordered(const std::string_view key) && noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_unordered_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +simdjson_inline simdjson_result object::operator[](const std::string_view key) & noexcept {
    +  return find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result object::operator[](const std::string_view key) && noexcept {
    +  return std::forward(*this).find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result object::find_field(const std::string_view key) & noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +simdjson_inline simdjson_result object::find_field(const std::string_view key) && noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +
    +simdjson_inline simdjson_result object::start(value_iterator &iter) noexcept {
    +  SIMDJSON_TRY( iter.start_object().error() );
    +  return object(iter);
    +}
    +simdjson_inline simdjson_result object::start_root(value_iterator &iter) noexcept {
    +  SIMDJSON_TRY( iter.start_root_object().error() );
    +  return object(iter);
    +}
    +simdjson_inline error_code object::consume() noexcept {
    +  if(iter.is_at_key()) {
    +    /**
    +     * whenever you are pointing at a key, calling skip_child() is
    +     * unsafe because you will hit a string and you will assume that
    +     * it is string value, and this mistake will lead you to make bad
    +     * depth computation.
    +     */
    +    /**
    +     * We want to 'consume' the key. We could really
    +     * just do _json_iter->return_current_and_advance(); at this
    +     * point, but, for clarity, we will use the high-level API to
    +     * eat the key. We assume that the compiler optimizes away
    +     * most of the work.
    +     */
    +    simdjson_unused raw_json_string actual_key;
    +    auto error = iter.field_key().get(actual_key);
    +    if (error) { iter.abandon(); return error; };
    +    // Let us move to the value while we are at it.
    +    if ((error = iter.field_value())) { iter.abandon(); return error; }
    +  }
    +  auto error_skip = iter.json_iter().skip_child(iter.depth()-1);
    +  if(error_skip) { iter.abandon(); }
    +  return error_skip;
    +}
    +
    +simdjson_inline simdjson_result object::raw_json() noexcept {
    +  const uint8_t * starting_point{iter.peek_start()};
    +  auto error = consume();
    +  if(error) { return error; }
    +  const uint8_t * final_point{iter._json_iter->peek()};
    +  return std::string_view(reinterpret_cast(starting_point), size_t(final_point - starting_point));
    +}
    +
    +simdjson_inline simdjson_result object::started(value_iterator &iter) noexcept {
    +  SIMDJSON_TRY( iter.started_object().error() );
    +  return object(iter);
    +}
    +
    +simdjson_inline object object::resume(const value_iterator &iter) noexcept {
    +  return iter;
    +}
    +
    +simdjson_inline object::object(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{
    +}
    +
    +simdjson_inline simdjson_result object::begin() noexcept {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  return object_iterator(iter);
    +}
    +simdjson_inline simdjson_result object::end() noexcept {
    +  return object_iterator(iter);
    +}
    +
    +inline simdjson_result object::at_pointer(std::string_view json_pointer) noexcept {
    +  if (json_pointer[0] != '/') { return INVALID_JSON_POINTER; }
    +  json_pointer = json_pointer.substr(1);
    +  size_t slash = json_pointer.find('/');
    +  std::string_view key = json_pointer.substr(0, slash);
    +  // Grab the child with the given key
    +  simdjson_result child;
    +
    +  // If there is an escape character in the key, unescape it and then get the child.
    +  size_t escape = key.find('~');
    +  if (escape != std::string_view::npos) {
    +    // Unescape the key
    +    std::string unescaped(key);
    +    do {
    +      switch (unescaped[escape+1]) {
    +        case '0':
    +          unescaped.replace(escape, 2, "~");
    +          break;
    +        case '1':
    +          unescaped.replace(escape, 2, "/");
    +          break;
    +        default:
    +          return INVALID_JSON_POINTER; // "Unexpected ~ escape character in JSON pointer");
    +      }
    +      escape = unescaped.find('~', escape+1);
    +    } while (escape != std::string::npos);
    +    child = find_field(unescaped);  // Take note find_field does not unescape keys when matching
    +  } else {
    +    child = find_field(key);
    +  }
    +  if(child.error()) {
    +    return child; // we do not continue if there was an error
    +  }
    +  // If there is a /, we have to recurse and look up more of the path
    +  if (slash != std::string_view::npos) {
    +    child = child.at_pointer(json_pointer.substr(slash));
    +  }
    +  return child;
    +}
    +
    +simdjson_inline simdjson_result object::count_fields() & noexcept {
    +  size_t count{0};
    +  // Important: we do not consume any of the values.
    +  for(simdjson_unused auto v : *this) { count++; }
    +  // The above loop will always succeed, but we want to report errors.
    +  if(iter.error()) { return iter.error(); }
    +  // We need to move back at the start because we expect users to iterate through
    +  // the object after counting the number of elements.
    +  iter.reset_object();
    +  return count;
    +}
    +
    +simdjson_inline simdjson_result object::is_empty() & noexcept {
    +  bool is_not_empty;
    +  auto error = iter.reset_object().get(is_not_empty);
    +  if(error) { return error; }
    +  return !is_not_empty;
    +}
    +
    +simdjson_inline simdjson_result object::reset() & noexcept {
    +  return iter.reset_object();
    +}
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(arm64::ondemand::object &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +simdjson_inline simdjson_result simdjson_result::begin() noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() noexcept {
    +  if (error()) { return error(); }
    +  return first.end();
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first)[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).find_field(key);
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +inline simdjson_result simdjson_result::reset() noexcept {
    +  if (error()) { return error(); }
    +  return first.reset();
    +}
    +
    +inline simdjson_result simdjson_result::is_empty() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_empty();
    +}
    +
    +simdjson_inline  simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +
    +simdjson_inline  simdjson_result simdjson_result::raw_json() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json();
    +}
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H
    +/* end file simdjson/generic/ondemand/object-inl.h for arm64 */
    +/* including simdjson/generic/ondemand/object_iterator-inl.h for arm64: #include "simdjson/generic/ondemand/object_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/object_iterator-inl.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/field-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +//
    +// object_iterator
    +//
    +
    +simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{}
    +
    +simdjson_inline simdjson_result object_iterator::operator*() noexcept {
    +  error_code error = iter.error();
    +  if (error) { iter.abandon(); return error; }
    +  auto result = field::start(iter);
    +  // TODO this is a safety rail ... users should exit loops as soon as they receive an error.
    +  // Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free.
    +  if (result.error()) { iter.abandon(); }
    +  return result;
    +}
    +simdjson_inline bool object_iterator::operator==(const object_iterator &other) const noexcept {
    +  return !(*this != other);
    +}
    +simdjson_inline bool object_iterator::operator!=(const object_iterator &) const noexcept {
    +  return iter.is_open();
    +}
    +
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_inline object_iterator &object_iterator::operator++() noexcept {
    +  // TODO this is a safety rail ... users should exit loops as soon as they receive an error.
    +  // Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free.
    +  if (!iter.is_open()) { return *this; } // Iterator will be released if there is an error
    +
    +  simdjson_unused error_code error;
    +  if ((error = iter.skip_child() )) { return *this; }
    +
    +  simdjson_unused bool has_value;
    +  if ((error = iter.has_next_field().get(has_value) )) { return *this; };
    +  return *this;
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +//
    +// ### Live States
    +//
    +// While iterating or looking up values, depth >= iter.depth. at_start may vary. Error is
    +// always SUCCESS:
    +//
    +// - Start: This is the state when the object is first found and the iterator is just past the {.
    +//   In this state, at_start == true.
    +// - Next: After we hand a scalar value to the user, or an array/object which they then fully
    +//   iterate over, the iterator is at the , or } before the next value. In this state,
    +//   depth == iter.depth, at_start == false, and error == SUCCESS.
    +// - Unfinished Business: When we hand an array/object to the user which they do not fully
    +//   iterate over, we need to finish that iteration by skipping child values until we reach the
    +//   Next state. In this state, depth > iter.depth, at_start == false, and error == SUCCESS.
    +//
    +// ## Error States
    +//
    +// In error states, we will yield exactly one more value before stopping. iter.depth == depth
    +// and at_start is always false. We decrement after yielding the error, moving to the Finished
    +// state.
    +//
    +// - Chained Error: When the object iterator is part of an error chain--for example, in
    +//   `for (auto tweet : doc["tweets"])`, where the tweet field may be missing or not be an
    +//   object--we yield that error in the loop, exactly once. In this state, error != SUCCESS and
    +//   iter.depth == depth, and at_start == false. We decrement depth when we yield the error.
    +// - Missing Comma Error: When the iterator ++ method discovers there is no comma between fields,
    +//   we flag that as an error and treat it exactly the same as a Chained Error. In this state,
    +//   error == TAPE_ERROR, iter.depth == depth, and at_start == false.
    +//
    +// Errors that occur while reading a field to give to the user (such as when the key is not a
    +// string or the field is missing a colon) are yielded immediately. Depth is then decremented,
    +// moving to the Finished state without transitioning through an Error state at all.
    +//
    +// ## Terminal State
    +//
    +// The terminal state has iter.depth < depth. at_start is always false.
    +//
    +// - Finished: When we have reached a }, we are finished. We signal this by decrementing depth.
    +//   In this state, iter.depth < depth, at_start == false, and error == SUCCESS.
    +//
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  arm64::ondemand::object_iterator &&value
    +) noexcept
    +  : implementation_simdjson_result_base(std::forward(value))
    +{
    +  first.iter.assert_is_valid();
    +}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +  : implementation_simdjson_result_base({}, error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::operator*() noexcept {
    +  if (error()) { return error(); }
    +  return *first;
    +}
    +// If we're iterating and there is an error, return the error once.
    +simdjson_inline bool simdjson_result::operator==(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return !error(); }
    +  return first == other.first;
    +}
    +// If we're iterating and there is an error, return the error once.
    +simdjson_inline bool simdjson_result::operator!=(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return error(); }
    +  return first != other.first;
    +}
    +// Checks for ']' and ','
    +simdjson_inline simdjson_result &simdjson_result::operator++() noexcept {
    +  // Clear the error if there is one, so we don't yield it twice
    +  if (error()) { second = SUCCESS; return *this; }
    +  ++first;
    +  return *this;
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/object_iterator-inl.h for arm64 */
    +/* including simdjson/generic/ondemand/parser-inl.h for arm64: #include "simdjson/generic/ondemand/parser-inl.h" */
    +/* begin file simdjson/generic/ondemand/parser-inl.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/padded_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/padded_string_view.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/dom/base.h" // for MINIMAL_DOCUMENT_CAPACITY */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document_stream.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +simdjson_inline parser::parser(size_t max_capacity) noexcept
    +  : _max_capacity{max_capacity} {
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code parser::allocate(size_t new_capacity, size_t new_max_depth) noexcept {
    +  if (new_capacity > max_capacity()) { return CAPACITY; }
    +  if (string_buf && new_capacity == capacity() && new_max_depth == max_depth()) { return SUCCESS; }
    +
    +  // string_capacity copied from document::allocate
    +  _capacity = 0;
    +  size_t string_capacity = SIMDJSON_ROUNDUP_N(5 * new_capacity / 3 + SIMDJSON_PADDING, 64);
    +  string_buf.reset(new (std::nothrow) uint8_t[string_capacity]);
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  start_positions.reset(new (std::nothrow) token_position[new_max_depth]);
    +#endif
    +  if (implementation) {
    +    SIMDJSON_TRY( implementation->set_capacity(new_capacity) );
    +    SIMDJSON_TRY( implementation->set_max_depth(new_max_depth) );
    +  } else {
    +    SIMDJSON_TRY( simdjson::get_active_implementation()->create_dom_parser_implementation(new_capacity, new_max_depth, implementation) );
    +  }
    +  _capacity = new_capacity;
    +  _max_depth = new_max_depth;
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(padded_string_view json) & noexcept {
    +  if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; }
    +
    +  json.remove_utf8_bom();
    +
    +  // Allocate if needed
    +  if (capacity() < json.length() || !string_buf) {
    +    SIMDJSON_TRY( allocate(json.length(), max_depth()) );
    +  }
    +
    +  // Run stage 1.
    +  SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) );
    +  return document::start({ reinterpret_cast(json.data()), this });
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const char *json, size_t len, size_t allocated) & noexcept {
    +  return iterate(padded_string_view(json, len, allocated));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const uint8_t *json, size_t len, size_t allocated) & noexcept {
    +  return iterate(padded_string_view(json, len, allocated));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string_view json, size_t allocated) & noexcept {
    +  return iterate(padded_string_view(json, allocated));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string &json) & noexcept {
    +  if(json.capacity() - json.size() < SIMDJSON_PADDING) {
    +    json.reserve(json.size() + SIMDJSON_PADDING);
    +  }
    +  return iterate(padded_string_view(json));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const std::string &json) & noexcept {
    +  return iterate(padded_string_view(json));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept {
    +  // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception
    +  SIMDJSON_TRY( result.error() );
    +  padded_string_view json = result.value_unsafe();
    +  return iterate(json);
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept {
    +  // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception
    +  SIMDJSON_TRY( result.error() );
    +  const padded_string &json = result.value_unsafe();
    +  return iterate(json);
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate_raw(padded_string_view json) & noexcept {
    +  if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; }
    +
    +  json.remove_utf8_bom();
    +
    +  // Allocate if needed
    +  if (capacity() < json.length()) {
    +    SIMDJSON_TRY( allocate(json.length(), max_depth()) );
    +  }
    +
    +  // Run stage 1.
    +  SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) );
    +  return json_iterator(reinterpret_cast(json.data()), this);
    +}
    +
    +inline simdjson_result parser::iterate_many(const uint8_t *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept {
    +  if(batch_size < MINIMAL_BATCH_SIZE) { batch_size = MINIMAL_BATCH_SIZE; }
    +  if((len >= 3) && (std::memcmp(buf, "\xEF\xBB\xBF", 3) == 0)) {
    +    buf += 3;
    +    len -= 3;
    +  }
    +  if(allow_comma_separated && batch_size < len) { batch_size = len; }
    +  return document_stream(*this, buf, len, batch_size, allow_comma_separated);
    +}
    +inline simdjson_result parser::iterate_many(const char *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept {
    +  return iterate_many(reinterpret_cast(buf), len, batch_size, allow_comma_separated);
    +}
    +inline simdjson_result parser::iterate_many(const std::string &s, size_t batch_size, bool allow_comma_separated) noexcept {
    +  return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated);
    +}
    +inline simdjson_result parser::iterate_many(const padded_string &s, size_t batch_size, bool allow_comma_separated) noexcept {
    +  return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated);
    +}
    +
    +simdjson_inline size_t parser::capacity() const noexcept {
    +  return _capacity;
    +}
    +simdjson_inline size_t parser::max_capacity() const noexcept {
    +  return _max_capacity;
    +}
    +simdjson_inline size_t parser::max_depth() const noexcept {
    +  return _max_depth;
    +}
    +
    +simdjson_inline void parser::set_max_capacity(size_t max_capacity) noexcept {
    +  if(max_capacity < dom::MINIMAL_DOCUMENT_CAPACITY) {
    +    _max_capacity = max_capacity;
    +  } else {
    +    _max_capacity = dom::MINIMAL_DOCUMENT_CAPACITY;
    +  }
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result parser::unescape(raw_json_string in, uint8_t *&dst, bool allow_replacement) const noexcept {
    +  uint8_t *end = implementation->parse_string(in.buf, dst, allow_replacement);
    +  if (!end) { return STRING_ERROR; }
    +  std::string_view result(reinterpret_cast(dst), end-dst);
    +  dst = end;
    +  return result;
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result parser::unescape_wobbly(raw_json_string in, uint8_t *&dst) const noexcept {
    +  uint8_t *end = implementation->parse_wobbly_string(in.buf, dst);
    +  if (!end) { return STRING_ERROR; }
    +  std::string_view result(reinterpret_cast(dst), end-dst);
    +  dst = end;
    +  return result;
    +}
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(arm64::ondemand::parser &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H
    +/* end file simdjson/generic/ondemand/parser-inl.h for arm64 */
    +/* including simdjson/generic/ondemand/raw_json_string-inl.h for arm64: #include "simdjson/generic/ondemand/raw_json_string-inl.h" */
    +/* begin file simdjson/generic/ondemand/raw_json_string-inl.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +
    +namespace arm64 {
    +namespace ondemand {
    +
    +simdjson_inline raw_json_string::raw_json_string(const uint8_t * _buf) noexcept : buf{_buf} {}
    +
    +simdjson_inline const char * raw_json_string::raw() const noexcept { return reinterpret_cast(buf); }
    +
    +
    +simdjson_inline bool raw_json_string::is_free_from_unescaped_quote(std::string_view target) noexcept {
    +  size_t pos{0};
    +  // if the content has no escape character, just scan through it quickly!
    +  for(;pos < target.size() && target[pos] != '\\';pos++) {}
    +  // slow path may begin.
    +  bool escaping{false};
    +  for(;pos < target.size();pos++) {
    +    if((target[pos] == '"') && !escaping) {
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  return true;
    +}
    +
    +simdjson_inline bool raw_json_string::is_free_from_unescaped_quote(const char* target) noexcept {
    +  size_t pos{0};
    +  // if the content has no escape character, just scan through it quickly!
    +  for(;target[pos] && target[pos] != '\\';pos++) {}
    +  // slow path may begin.
    +  bool escaping{false};
    +  for(;target[pos];pos++) {
    +    if((target[pos] == '"') && !escaping) {
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  return true;
    +}
    +
    +
    +simdjson_inline bool raw_json_string::unsafe_is_equal(size_t length, std::string_view target) const noexcept {
    +  // If we are going to call memcmp, then we must know something about the length of the raw_json_string.
    +  return (length >= target.size()) && (raw()[target.size()] == '"') && !memcmp(raw(), target.data(), target.size());
    +}
    +
    +simdjson_inline bool raw_json_string::unsafe_is_equal(std::string_view target) const noexcept {
    +  // Assumptions: does not contain unescaped quote characters, and
    +  // the raw content is quote terminated within a valid JSON string.
    +  if(target.size() <= SIMDJSON_PADDING) {
    +    return (raw()[target.size()] == '"') && !memcmp(raw(), target.data(), target.size());
    +  }
    +  const char * r{raw()};
    +  size_t pos{0};
    +  for(;pos < target.size();pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +simdjson_inline bool raw_json_string::is_equal(std::string_view target) const noexcept {
    +  const char * r{raw()};
    +  size_t pos{0};
    +  bool escaping{false};
    +  for(;pos < target.size();pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +    // if target is a compile-time constant and it is free from
    +    // quotes, then the next part could get optimized away through
    +    // inlining.
    +    if((target[pos] == '"') && !escaping) {
    +      // We have reached the end of the raw_json_string but
    +      // the target is not done.
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +
    +simdjson_inline bool raw_json_string::unsafe_is_equal(const char * target) const noexcept {
    +  // Assumptions: 'target' does not contain unescaped quote characters, is null terminated and
    +  // the raw content is quote terminated within a valid JSON string.
    +  const char * r{raw()};
    +  size_t pos{0};
    +  for(;target[pos];pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +simdjson_inline bool raw_json_string::is_equal(const char* target) const noexcept {
    +  // Assumptions: does not contain unescaped quote characters, and
    +  // the raw content is quote terminated within a valid JSON string.
    +  const char * r{raw()};
    +  size_t pos{0};
    +  bool escaping{false};
    +  for(;target[pos];pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +    // if target is a compile-time constant and it is free from
    +    // quotes, then the next part could get optimized away through
    +    // inlining.
    +    if((target[pos] == '"') && !escaping) {
    +      // We have reached the end of the raw_json_string but
    +      // the target is not done.
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept {
    +  return a.unsafe_is_equal(c);
    +}
    +
    +simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept {
    +  return a == c;
    +}
    +
    +simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept {
    +  return !(a == c);
    +}
    +
    +simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept {
    +  return !(a == c);
    +}
    +
    +
    +simdjson_inline simdjson_warn_unused simdjson_result raw_json_string::unescape(json_iterator &iter, bool allow_replacement) const noexcept {
    +  return iter.unescape(*this, allow_replacement);
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result raw_json_string::unescape_wobbly(json_iterator &iter) const noexcept {
    +  return iter.unescape_wobbly(*this);
    +}
    +
    +simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &out, const raw_json_string &str) noexcept {
    +  bool in_escape = false;
    +  const char *s = str.raw();
    +  while (true) {
    +    switch (*s) {
    +      case '\\': in_escape = !in_escape; break;
    +      case '"': if (in_escape) { in_escape = false; } else { return out; } break;
    +      default: if (in_escape) { in_escape = false; }
    +    }
    +    out << *s;
    +    s++;
    +  }
    +}
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(arm64::ondemand::raw_json_string &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +simdjson_inline simdjson_result simdjson_result::raw() const noexcept {
    +  if (error()) { return error(); }
    +  return first.raw();
    +}
    +simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape(arm64::ondemand::json_iterator &iter, bool allow_replacement) const noexcept {
    +  if (error()) { return error(); }
    +  return first.unescape(iter, allow_replacement);
    +}
    +simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape_wobbly(arm64::ondemand::json_iterator &iter) const noexcept {
    +  if (error()) { return error(); }
    +  return first.unescape_wobbly(iter);
    +}
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H
    +/* end file simdjson/generic/ondemand/raw_json_string-inl.h for arm64 */
    +/* including simdjson/generic/ondemand/serialization-inl.h for arm64: #include "simdjson/generic/ondemand/serialization-inl.h" */
    +/* begin file simdjson/generic/ondemand/serialization-inl.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/serialization.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +
    +inline std::string_view trim(const std::string_view str) noexcept {
    +  // We can almost surely do better by rolling our own find_first_not_of function.
    +  size_t first = str.find_first_not_of(" \t\n\r");
    +  // If we have the empty string (just white space), then no trimming is possible, and
    +  // we return the empty string_view.
    +  if (std::string_view::npos == first) { return std::string_view(); }
    +  size_t last = str.find_last_not_of(" \t\n\r");
    +  return str.substr(first, (last - first + 1));
    +}
    +
    +
    +inline simdjson_result to_json_string(arm64::ondemand::document& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(arm64::ondemand::document_reference& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(arm64::ondemand::value& x) noexcept {
    +  /**
    +   * If we somehow receive a value that has already been consumed,
    +   * then the following code could be in trouble. E.g., we create
    +   * an array as needed, but if an array was already created, then
    +   * it could be bad.
    +   */
    +  using namespace arm64::ondemand;
    +  arm64::ondemand::json_type t;
    +  auto error = x.type().get(t);
    +  if(error != SUCCESS) { return error; }
    +  switch (t)
    +  {
    +    case json_type::array:
    +    {
    +      arm64::ondemand::array array;
    +      error = x.get_array().get(array);
    +      if(error) { return error; }
    +      return to_json_string(array);
    +    }
    +    case json_type::object:
    +    {
    +      arm64::ondemand::object object;
    +      error = x.get_object().get(object);
    +      if(error) { return error; }
    +      return to_json_string(object);
    +    }
    +    default:
    +      return trim(x.raw_json_token());
    +  }
    +}
    +
    +inline simdjson_result to_json_string(arm64::ondemand::object& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(arm64::ondemand::array& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +} // namespace simdjson
    +
    +namespace simdjson { namespace arm64 { namespace ondemand {
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::value x) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(x).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::value x) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(x).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::array value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::array value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::document& value)  {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::document_reference& value)  {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::document& value)  {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::object value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out,  simdjson::simdjson_result x) {
    +  if (x.error()) { throw  simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::arm64::ondemand::object value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +}}} // namespace simdjson::arm64::ondemand
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H
    +/* end file simdjson/generic/ondemand/serialization-inl.h for arm64 */
    +/* including simdjson/generic/ondemand/token_iterator-inl.h for arm64: #include "simdjson/generic/ondemand/token_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/token_iterator-inl.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/token_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +simdjson_inline token_iterator::token_iterator(
    +  const uint8_t *_buf,
    +  token_position position
    +) noexcept : buf{_buf}, _position{position}
    +{
    +}
    +
    +simdjson_inline uint32_t token_iterator::current_offset() const noexcept {
    +  return *(_position);
    +}
    +
    +
    +simdjson_inline const uint8_t *token_iterator::return_current_and_advance() noexcept {
    +  return &buf[*(_position++)];
    +}
    +
    +simdjson_inline const uint8_t *token_iterator::peek(token_position position) const noexcept {
    +  return &buf[*position];
    +}
    +simdjson_inline uint32_t token_iterator::peek_index(token_position position) const noexcept {
    +  return *position;
    +}
    +simdjson_inline uint32_t token_iterator::peek_length(token_position position) const noexcept {
    +  return *(position+1) - *position;
    +}
    +
    +simdjson_inline const uint8_t *token_iterator::peek(int32_t delta) const noexcept {
    +  return &buf[*(_position+delta)];
    +}
    +simdjson_inline uint32_t token_iterator::peek_index(int32_t delta) const noexcept {
    +  return *(_position+delta);
    +}
    +simdjson_inline uint32_t token_iterator::peek_length(int32_t delta) const noexcept {
    +  return *(_position+delta+1) - *(_position+delta);
    +}
    +
    +simdjson_inline token_position token_iterator::position() const noexcept {
    +  return _position;
    +}
    +simdjson_inline void token_iterator::set_position(token_position target_position) noexcept {
    +  _position = target_position;
    +}
    +
    +simdjson_inline bool token_iterator::operator==(const token_iterator &other) const noexcept {
    +  return _position == other._position;
    +}
    +simdjson_inline bool token_iterator::operator!=(const token_iterator &other) const noexcept {
    +  return _position != other._position;
    +}
    +simdjson_inline bool token_iterator::operator>(const token_iterator &other) const noexcept {
    +  return _position > other._position;
    +}
    +simdjson_inline bool token_iterator::operator>=(const token_iterator &other) const noexcept {
    +  return _position >= other._position;
    +}
    +simdjson_inline bool token_iterator::operator<(const token_iterator &other) const noexcept {
    +  return _position < other._position;
    +}
    +simdjson_inline bool token_iterator::operator<=(const token_iterator &other) const noexcept {
    +  return _position <= other._position;
    +}
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(arm64::ondemand::token_iterator &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/token_iterator-inl.h for arm64 */
    +/* including simdjson/generic/ondemand/value-inl.h for arm64: #include "simdjson/generic/ondemand/value-inl.h" */
    +/* begin file simdjson/generic/ondemand/value-inl.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +simdjson_inline value::value(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{
    +}
    +simdjson_inline value value::start(const value_iterator &iter) noexcept {
    +  return iter;
    +}
    +simdjson_inline value value::resume(const value_iterator &iter) noexcept {
    +  return iter;
    +}
    +
    +simdjson_inline simdjson_result value::get_array() noexcept {
    +  return array::start(iter);
    +}
    +simdjson_inline simdjson_result value::get_object() noexcept {
    +  return object::start(iter);
    +}
    +simdjson_inline simdjson_result value::start_or_resume_object() noexcept {
    +  if (iter.at_start()) {
    +    return get_object();
    +  } else {
    +    return object::resume(iter);
    +  }
    +}
    +
    +simdjson_inline simdjson_result value::get_raw_json_string() noexcept {
    +  return iter.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result value::get_string(bool allow_replacement) noexcept {
    +  return iter.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code value::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  return iter.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result value::get_wobbly_string() noexcept {
    +  return iter.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result value::get_double() noexcept {
    +  return iter.get_double();
    +}
    +simdjson_inline simdjson_result value::get_double_in_string() noexcept {
    +  return iter.get_double_in_string();
    +}
    +simdjson_inline simdjson_result value::get_uint64() noexcept {
    +  return iter.get_uint64();
    +}
    +simdjson_inline simdjson_result value::get_uint64_in_string() noexcept {
    +  return iter.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result value::get_int64() noexcept {
    +  return iter.get_int64();
    +}
    +simdjson_inline simdjson_result value::get_int64_in_string() noexcept {
    +  return iter.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result value::get_bool() noexcept {
    +  return iter.get_bool();
    +}
    +simdjson_inline simdjson_result value::is_null() noexcept {
    +  return iter.is_null();
    +}
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_array(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_object(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_raw_json_string(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_string(false); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_number(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_double(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_uint64(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_int64(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_bool(); }
    +
    +template simdjson_inline error_code value::get(T &out) noexcept {
    +  return get().get(out);
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline value::operator array() noexcept(false) {
    +  return get_array();
    +}
    +simdjson_inline value::operator object() noexcept(false) {
    +  return get_object();
    +}
    +simdjson_inline value::operator uint64_t() noexcept(false) {
    +  return get_uint64();
    +}
    +simdjson_inline value::operator int64_t() noexcept(false) {
    +  return get_int64();
    +}
    +simdjson_inline value::operator double() noexcept(false) {
    +  return get_double();
    +}
    +simdjson_inline value::operator std::string_view() noexcept(false) {
    +  return get_string(false);
    +}
    +simdjson_inline value::operator raw_json_string() noexcept(false) {
    +  return get_raw_json_string();
    +}
    +simdjson_inline value::operator bool() noexcept(false) {
    +  return get_bool();
    +}
    +#endif
    +
    +simdjson_inline simdjson_result value::begin() & noexcept {
    +  return get_array().begin();
    +}
    +simdjson_inline simdjson_result value::end() & noexcept {
    +  return {};
    +}
    +simdjson_inline simdjson_result value::count_elements() & noexcept {
    +  simdjson_result answer;
    +  auto a = get_array();
    +  answer = a.count_elements();
    +  // count_elements leaves you pointing inside the array, at the first element.
    +  // We need to move back so that the user can create a new array (which requires that
    +  // we point at '[').
    +  iter.move_at_start();
    +  return answer;
    +}
    +simdjson_inline simdjson_result value::count_fields() & noexcept {
    +  simdjson_result answer;
    +  auto a = get_object();
    +  answer = a.count_fields();
    +  iter.move_at_start();
    +  return answer;
    +}
    +simdjson_inline simdjson_result value::at(size_t index) noexcept {
    +  auto a = get_array();
    +  return a.at(index);
    +}
    +
    +simdjson_inline simdjson_result value::find_field(std::string_view key) noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +simdjson_inline simdjson_result value::find_field(const char *key) noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +
    +simdjson_inline simdjson_result value::find_field_unordered(std::string_view key) noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result value::find_field_unordered(const char *key) noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +
    +simdjson_inline simdjson_result value::operator[](std::string_view key) noexcept {
    +  return start_or_resume_object()[key];
    +}
    +simdjson_inline simdjson_result value::operator[](const char *key) noexcept {
    +  return start_or_resume_object()[key];
    +}
    +
    +simdjson_inline simdjson_result value::type() noexcept {
    +  return iter.type();
    +}
    +
    +simdjson_inline simdjson_result value::is_scalar() noexcept {
    +  json_type this_type;
    +  auto error = type().get(this_type);
    +  if(error) { return error; }
    +  return ! ((this_type == json_type::array) || (this_type == json_type::object));
    +}
    +
    +simdjson_inline bool value::is_negative() noexcept {
    +  return iter.is_negative();
    +}
    +
    +simdjson_inline simdjson_result value::is_integer() noexcept {
    +  return iter.is_integer();
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value::get_number_type() noexcept {
    +  return iter.get_number_type();
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value::get_number() noexcept {
    +  return iter.get_number();
    +}
    +
    +simdjson_inline std::string_view value::raw_json_token() noexcept {
    +  return std::string_view(reinterpret_cast(iter.peek_start()), iter.peek_start_length());
    +}
    +
    +simdjson_inline simdjson_result value::raw_json() noexcept {
    +  json_type t;
    +  SIMDJSON_TRY(type().get(t));
    +  switch (t)
    +  {
    +    case json_type::array: {
    +      ondemand::array array;
    +      SIMDJSON_TRY(get_array().get(array));
    +      return array.raw_json();
    +    }
    +    case json_type::object: {
    +      ondemand::object object;
    +      SIMDJSON_TRY(get_object().get(object));
    +      return object.raw_json();
    +    }
    +    default:
    +      return raw_json_token();
    +  }
    +}
    +
    +simdjson_inline simdjson_result value::current_location() noexcept {
    +  return iter.json_iter().current_location();
    +}
    +
    +simdjson_inline int32_t value::current_depth() const noexcept{
    +  return iter.json_iter().depth();
    +}
    +
    +simdjson_inline simdjson_result value::at_pointer(std::string_view json_pointer) noexcept {
    +  json_type t;
    +  SIMDJSON_TRY(type().get(t));
    +  switch (t)
    +  {
    +    case json_type::array:
    +      return (*this).get_array().at_pointer(json_pointer);
    +    case json_type::object:
    +      return (*this).get_object().at_pointer(json_pointer);
    +    default:
    +      return INVALID_JSON_POINTER;
    +  }
    +}
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  arm64::ondemand::value &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(error)
    +{
    +}
    +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +simdjson_inline simdjson_result simdjson_result::at(size_t index) noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline simdjson_result simdjson_result::begin() & noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() & noexcept {
    +  if (error()) { return error(); }
    +  return {};
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::get_array() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_array();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_object() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_object();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_bool();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_null() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_null();
    +}
    +
    +template simdjson_inline simdjson_result simdjson_result::get() noexcept {
    +  if (error()) { return error(); }
    +  return first.get();
    +}
    +template simdjson_inline error_code simdjson_result::get(T &out) noexcept {
    +  if (error()) { return error(); }
    +  return first.get(out);
    +}
    +
    +template<> simdjson_inline simdjson_result simdjson_result::get() noexcept  {
    +  if (error()) { return error(); }
    +  return std::move(first);
    +}
    +template<> simdjson_inline error_code simdjson_result::get(arm64::ondemand::value &out) noexcept {
    +  if (error()) { return error(); }
    +  out = first;
    +  return SUCCESS;
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::type() noexcept {
    +  if (error()) { return error(); }
    +  return first.type();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_scalar();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_negative() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_negative();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_integer();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number_type();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number();
    +}
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline simdjson_result::operator arm64::ondemand::array() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator arm64::ondemand::object() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator int64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator double() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator arm64::ondemand::raw_json_string() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator bool() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +#endif
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json_token();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::current_location() noexcept {
    +  if (error()) { return error(); }
    +  return first.current_location();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::current_depth() const noexcept {
    +  if (error()) { return error(); }
    +  return first.current_depth();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H
    +/* end file simdjson/generic/ondemand/value-inl.h for arm64 */
    +/* including simdjson/generic/ondemand/value_iterator-inl.h for arm64: #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/value_iterator-inl.h for arm64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/atomparsing.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/numberparsing.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace arm64 {
    +namespace ondemand {
    +
    +simdjson_inline value_iterator::value_iterator(
    +  json_iterator *json_iter,
    +  depth_t depth,
    +  token_position start_position
    +) noexcept : _json_iter{json_iter}, _depth{depth}, _start_position{start_position}
    +{
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_object() noexcept {
    +  SIMDJSON_TRY( start_container('{', "Not an object", "object") );
    +  return started_object();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_object() noexcept {
    +  SIMDJSON_TRY( start_container('{', "Not an object", "object") );
    +  return started_root_object();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_object() noexcept {
    +  assert_at_container_start();
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  _json_iter->set_start_position(_depth, start_position());
    +#endif
    +  if (*_json_iter->peek() == '}') {
    +    logger::log_value(*_json_iter, "empty object");
    +    _json_iter->return_current_and_advance();
    +    end_container();
    +    return false;
    +  }
    +  return true;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::check_root_object() noexcept {
    +  // When in streaming mode, we cannot expect peek_last() to be the last structural element of the
    +  // current document. It only works in the normal mode where we have indexed a single document.
    +  // Note that adding a check for 'streaming' is not expensive since we only have at most
    +  // one root element.
    +  if ( ! _json_iter->streaming() ) {
    +    // The following lines do not fully protect against garbage content within the
    +    // object: e.g., `{"a":2} foo }`. Users concerned with garbage content should
    +    // call `at_end()` on the document instance at the end of the processing to
    +    // ensure that the processing has finished at the end.
    +    //
    +    if (*_json_iter->peek_last() != '}') {
    +      _json_iter->abandon();
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing } at end");
    +    }
    +    // If the last character is } *and* the first gibberish character is also '}'
    +    // then on-demand could accidentally go over. So we need additional checks.
    +    // https://github.com/simdjson/simdjson/issues/1834
    +    // Checking that the document is balanced requires a full scan which is potentially
    +    // expensive, but it only happens in edge cases where the first padding character is
    +    // a closing bracket.
    +    if ((*_json_iter->peek(_json_iter->end_position()) == '}') && (!_json_iter->balanced())) {
    +      _json_iter->abandon();
    +      // The exact error would require more work. It will typically be an unclosed object.
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "the document is unbalanced");
    +    }
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_object() noexcept {
    +  auto error = check_root_object();
    +  if(error) { return error; }
    +  return started_object();
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::end_container() noexcept {
    +#if SIMDJSON_CHECK_EOF
    +    if (depth() > 1 && at_end()) { return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing parent ] or }"); }
    +    // if (depth() <= 1 && !at_end()) { return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing [ or { at start"); }
    +#endif // SIMDJSON_CHECK_EOF
    +    _json_iter->ascend_to(depth()-1);
    +    return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_field() noexcept {
    +  assert_at_next();
    +
    +  // It's illegal to call this unless there are more tokens: anything that ends in } or ] is
    +  // obligated to verify there are more tokens if they are not the top level.
    +  switch (*_json_iter->return_current_and_advance()) {
    +    case '}':
    +      logger::log_end_value(*_json_iter, "object");
    +      SIMDJSON_TRY( end_container() );
    +      return false;
    +    case ',':
    +      return true;
    +    default:
    +      return report_error(TAPE_ERROR, "Missing comma between object fields");
    +  }
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::find_field_raw(const std::string_view key) noexcept {
    +  error_code error;
    +  bool has_value;
    +  //
    +  // Initially, the object can be in one of a few different places:
    +  //
    +  // 1. The start of the object, at the first field:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //      ^ (depth 2, index 1)
    +  //    ```
    +  if (at_first_field()) {
    +    has_value = true;
    +
    +  //
    +  // 2. When a previous search did not yield a value or the object is empty:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                     ^ (depth 0)
    +  //    { }
    +  //        ^ (depth 0, index 2)
    +  //    ```
    +  //
    +  } else if (!is_open()) {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    // If we're past the end of the object, we're being iterated out of order.
    +    // Note: this isn't perfect detection. It's possible the user is inside some other object; if so,
    +    // this object iterator will blithely scan that object for fields.
    +    if (_json_iter->depth() < depth() - 1) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +    return false;
    +
    +  // 3. When a previous search found a field or an iterator yielded a value:
    +  //
    +  //    ```
    +  //    // When a field was not fully consumed (or not even touched at all)
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //           ^ (depth 2)
    +  //    // When a field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                   ^ (depth 1)
    +  //    // When the last field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                   ^ (depth 1)
    +  //    ```
    +  //
    +  } else {
    +    if ((error = skip_child() )) { abandon(); return error; }
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    if (_json_iter->start_position(_depth) != start_position()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  }
    +  while (has_value) {
    +    // Get the key and colon, stopping at the value.
    +    raw_json_string actual_key;
    +    // size_t max_key_length = _json_iter->peek_length() - 2; // -2 for the two quotes
    +    // Note: _json_iter->peek_length() - 2 might overflow if _json_iter->peek_length() < 2.
    +    // field_key() advances the pointer and checks that '"' is found (corresponding to a key).
    +    // The depth is left unchanged by field_key().
    +    if ((error = field_key().get(actual_key) )) { abandon(); return error; };
    +    // field_value() will advance and check that we find a ':' separating the
    +    // key and the value. It will also increment the depth by one.
    +    if ((error = field_value() )) { abandon(); return error; }
    +    // If it matches, stop and return
    +    // We could do it this way if we wanted to allow arbitrary
    +    // key content (including escaped quotes).
    +    //if (actual_key.unsafe_is_equal(max_key_length, key)) {
    +    // Instead we do the following which may trigger buffer overruns if the
    +    // user provides an adversarial key (containing a well placed unescaped quote
    +    // character and being longer than the number of bytes remaining in the JSON
    +    // input).
    +    if (actual_key.unsafe_is_equal(key)) {
    +      logger::log_event(*this, "match", key, -2);
    +      // If we return here, then we return while pointing at the ':' that we just checked.
    +      return true;
    +    }
    +
    +    // No match: skip the value and see if , or } is next
    +    logger::log_event(*this, "no match", key, -2);
    +    // The call to skip_child is meant to skip over the value corresponding to the key.
    +    // After skip_child(), we are right before the next comma (',') or the final brace ('}').
    +    SIMDJSON_TRY( skip_child() ); // Skip the value entirely
    +    // The has_next_field() advances the pointer and check that either ',' or '}' is found.
    +    // It returns true if ',' is found, false otherwise. If anything other than ',' or '}' is found,
    +    // then we are in error and we abort.
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +  }
    +
    +  // If the loop ended, we're out of fields to look at.
    +  return false;
    +}
    +
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::find_field_unordered_raw(const std::string_view key) noexcept {
    +  /**
    +   * When find_field_unordered_raw is called, we can either be pointing at the
    +   * first key, pointing outside (at the closing brace) or if a key was matched
    +   * we can be either pointing right afterthe ':' right before the value (that we need skip),
    +   * or we may have consumed the value and we might be at a comma or at the
    +   * final brace (ready for a call to has_next_field()).
    +   */
    +  error_code error;
    +  bool has_value;
    +
    +  // First, we scan from that point to the end.
    +  // If we don't find a match, we may loop back around, and scan from the beginning to that point.
    +  token_position search_start = _json_iter->position();
    +
    +  // We want to know whether we need to go back to the beginning.
    +  bool at_first = at_first_field();
    +  ///////////////
    +  // Initially, the object can be in one of a few different places:
    +  //
    +  // 1. At the first key:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //      ^ (depth 2, index 1)
    +  //    ```
    +  //
    +  if (at_first) {
    +    has_value = true;
    +
    +  // 2. When a previous search did not yield a value or the object is empty:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                     ^ (depth 0)
    +  //    { }
    +  //        ^ (depth 0, index 2)
    +  //    ```
    +  //
    +  } else if (!is_open()) {
    +
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    // If we're past the end of the object, we're being iterated out of order.
    +    // Note: this isn't perfect detection. It's possible the user is inside some other object; if so,
    +    // this object iterator will blithely scan that object for fields.
    +    if (_json_iter->depth() < depth() - 1) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +    SIMDJSON_TRY(reset_object().get(has_value));
    +    at_first = true;
    +  // 3. When a previous search found a field or an iterator yielded a value:
    +  //
    +  //    ```
    +  //    // When a field was not fully consumed (or not even touched at all)
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //           ^ (depth 2)
    +  //    // When a field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                   ^ (depth 1)
    +  //    // When the last field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                   ^ (depth 1)
    +  //    ```
    +  //
    +  } else {
    +    // If someone queried a key but they not did access the value, then we are left pointing
    +    // at the ':' and we need to move forward through the value... If the value was
    +    // processed then skip_child() does not move the iterator (but may adjust the depth).
    +    if ((error = skip_child() )) { abandon(); return error; }
    +    search_start = _json_iter->position();
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    if (_json_iter->start_position(_depth) != start_position()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  }
    +
    +  // After initial processing, we will be in one of two states:
    +  //
    +  // ```
    +  // // At the beginning of a field
    +  // { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //   ^ (depth 1)
    +  // { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                  ^ (depth 1)
    +  // // At the end of the object
    +  // { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                  ^ (depth 0)
    +  // ```
    +  //
    +  // Next, we find a match starting from the current position.
    +  while (has_value) {
    +    SIMDJSON_ASSUME( _json_iter->_depth == _depth ); // We must be at the start of a field
    +
    +    // Get the key and colon, stopping at the value.
    +    raw_json_string actual_key;
    +    // size_t max_key_length = _json_iter->peek_length() - 2; // -2 for the two quotes
    +    // Note: _json_iter->peek_length() - 2 might overflow if _json_iter->peek_length() < 2.
    +    // field_key() advances the pointer and checks that '"' is found (corresponding to a key).
    +    // The depth is left unchanged by field_key().
    +    if ((error = field_key().get(actual_key) )) { abandon(); return error; };
    +    // field_value() will advance and check that we find a ':' separating the
    +    // key and the value. It will also increment the depth by one.
    +    if ((error = field_value() )) { abandon(); return error; }
    +
    +    // If it matches, stop and return
    +    // We could do it this way if we wanted to allow arbitrary
    +    // key content (including escaped quotes).
    +    // if (actual_key.unsafe_is_equal(max_key_length, key)) {
    +    // Instead we do the following which may trigger buffer overruns if the
    +    // user provides an adversarial key (containing a well placed unescaped quote
    +    // character and being longer than the number of bytes remaining in the JSON
    +    // input).
    +    if (actual_key.unsafe_is_equal(key)) {
    +      logger::log_event(*this, "match", key, -2);
    +      // If we return here, then we return while pointing at the ':' that we just checked.
    +      return true;
    +    }
    +
    +    // No match: skip the value and see if , or } is next
    +    logger::log_event(*this, "no match", key, -2);
    +    // The call to skip_child is meant to skip over the value corresponding to the key.
    +    // After skip_child(), we are right before the next comma (',') or the final brace ('}').
    +    SIMDJSON_TRY( skip_child() );
    +    // The has_next_field() advances the pointer and check that either ',' or '}' is found.
    +    // It returns true if ',' is found, false otherwise. If anything other than ',' or '}' is found,
    +    // then we are in error and we abort.
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +  }
    +  // Performance note: it maybe wasteful to rewind to the beginning when there might be
    +  // no other query following. Indeed, it would require reskipping the whole object.
    +  // Instead, you can just stay where you are. If there is a new query, there is always time
    +  // to rewind.
    +  if(at_first) { return false; }
    +
    +  // If we reach the end without finding a match, search the rest of the fields starting at the
    +  // beginning of the object.
    +  // (We have already run through the object before, so we've already validated its structure. We
    +  // don't check errors in this bit.)
    +  SIMDJSON_TRY(reset_object().get(has_value));
    +  while (true) {
    +    SIMDJSON_ASSUME(has_value); // we should reach search_start before ever reaching the end of the object
    +    SIMDJSON_ASSUME( _json_iter->_depth == _depth ); // We must be at the start of a field
    +
    +    // Get the key and colon, stopping at the value.
    +    raw_json_string actual_key;
    +    // size_t max_key_length = _json_iter->peek_length() - 2; // -2 for the two quotes
    +    // Note: _json_iter->peek_length() - 2 might overflow if _json_iter->peek_length() < 2.
    +    // field_key() advances the pointer and checks that '"' is found (corresponding to a key).
    +    // The depth is left unchanged by field_key().
    +    error = field_key().get(actual_key); SIMDJSON_ASSUME(!error);
    +    // field_value() will advance and check that we find a ':' separating the
    +    // key and the value.  It will also increment the depth by one.
    +    error = field_value(); SIMDJSON_ASSUME(!error);
    +
    +    // If it matches, stop and return
    +    // We could do it this way if we wanted to allow arbitrary
    +    // key content (including escaped quotes).
    +    // if (actual_key.unsafe_is_equal(max_key_length, key)) {
    +    // Instead we do the following which may trigger buffer overruns if the
    +    // user provides an adversarial key (containing a well placed unescaped quote
    +    // character and being longer than the number of bytes remaining in the JSON
    +    // input).
    +    if (actual_key.unsafe_is_equal(key)) {
    +      logger::log_event(*this, "match", key, -2);
    +      // If we return here, then we return while pointing at the ':' that we just checked.
    +      return true;
    +    }
    +
    +    // No match: skip the value and see if , or } is next
    +    logger::log_event(*this, "no match", key, -2);
    +    // The call to skip_child is meant to skip over the value corresponding to the key.
    +    // After skip_child(), we are right before the next comma (',') or the final brace ('}').
    +    SIMDJSON_TRY( skip_child() );
    +    // If we reached the end of the key-value pair we started from, then we know
    +    // that the key is not there so we return false. We are either right before
    +    // the next comma or the final brace.
    +    if(_json_iter->position() == search_start) { return false; }
    +    // The has_next_field() advances the pointer and check that either ',' or '}' is found.
    +    // It returns true if ',' is found, false otherwise. If anything other than ',' or '}' is found,
    +    // then we are in error and we abort.
    +    error = has_next_field().get(has_value); SIMDJSON_ASSUME(!error);
    +    // If we make the mistake of exiting here, then we could be left pointing at a key
    +    // in the middle of an object. That's not an allowable state.
    +  }
    +  // If the loop ended, we're out of fields to look at. The program should
    +  // never reach this point.
    +  return false;
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::field_key() noexcept {
    +  assert_at_next();
    +
    +  const uint8_t *key = _json_iter->return_current_and_advance();
    +  if (*(key++) != '"') { return report_error(TAPE_ERROR, "Object key is not a string"); }
    +  return raw_json_string(key);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::field_value() noexcept {
    +  assert_at_next();
    +
    +  if (*_json_iter->return_current_and_advance() != ':') { return report_error(TAPE_ERROR, "Missing colon in object field"); }
    +  _json_iter->descend_to(depth()+1);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_array() noexcept {
    +  SIMDJSON_TRY( start_container('[', "Not an array", "array") );
    +  return started_array();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_array() noexcept {
    +  SIMDJSON_TRY( start_container('[', "Not an array", "array") );
    +  return started_root_array();
    +}
    +
    +inline std::string value_iterator::to_string() const noexcept {
    +  auto answer = std::string("value_iterator [ depth : ") + std::to_string(_depth) + std::string(", ");
    +  if(_json_iter != nullptr) { answer +=  _json_iter->to_string(); }
    +  answer += std::string(" ]");
    +  return answer;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_array() noexcept {
    +  assert_at_container_start();
    +  if (*_json_iter->peek() == ']') {
    +    logger::log_value(*_json_iter, "empty array");
    +    _json_iter->return_current_and_advance();
    +    SIMDJSON_TRY( end_container() );
    +    return false;
    +  }
    +  _json_iter->descend_to(depth()+1);
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  _json_iter->set_start_position(_depth, start_position());
    +#endif
    +  return true;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::check_root_array() noexcept {
    +  // When in streaming mode, we cannot expect peek_last() to be the last structural element of the
    +  // current document. It only works in the normal mode where we have indexed a single document.
    +  // Note that adding a check for 'streaming' is not expensive since we only have at most
    +  // one root element.
    +  if ( ! _json_iter->streaming() ) {
    +    // The following lines do not fully protect against garbage content within the
    +    // array: e.g., `[1, 2] foo]`. Users concerned with garbage content should
    +    // also call `at_end()` on the document instance at the end of the processing to
    +    // ensure that the processing has finished at the end.
    +    //
    +    if (*_json_iter->peek_last() != ']') {
    +      _json_iter->abandon();
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing ] at end");
    +    }
    +    // If the last character is ] *and* the first gibberish character is also ']'
    +    // then on-demand could accidentally go over. So we need additional checks.
    +    // https://github.com/simdjson/simdjson/issues/1834
    +    // Checking that the document is balanced requires a full scan which is potentially
    +    // expensive, but it only happens in edge cases where the first padding character is
    +    // a closing bracket.
    +    if ((*_json_iter->peek(_json_iter->end_position()) == ']') && (!_json_iter->balanced())) {
    +      _json_iter->abandon();
    +      // The exact error would require more work. It will typically be an unclosed array.
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "the document is unbalanced");
    +    }
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_array() noexcept {
    +  auto error = check_root_array();
    +  if (error) { return error; }
    +  return started_array();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_element() noexcept {
    +  assert_at_next();
    +
    +  logger::log_event(*this, "has_next_element");
    +  switch (*_json_iter->return_current_and_advance()) {
    +    case ']':
    +      logger::log_end_value(*_json_iter, "array");
    +      SIMDJSON_TRY( end_container() );
    +      return false;
    +    case ',':
    +      _json_iter->descend_to(depth()+1);
    +      return true;
    +    default:
    +      return report_error(TAPE_ERROR, "Missing comma between array elements");
    +  }
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::parse_bool(const uint8_t *json) const noexcept {
    +  auto not_true = atomparsing::str4ncmp(json, "true");
    +  auto not_false = atomparsing::str4ncmp(json, "fals") | (json[4] ^ 'e');
    +  bool error = (not_true && not_false) || jsoncharutils::is_not_structural_or_whitespace(json[not_true ? 5 : 4]);
    +  if (error) { return incorrect_type_error("Not a boolean"); }
    +  return simdjson_result(!not_true);
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::parse_null(const uint8_t *json) const noexcept {
    +  bool is_null_string = !atomparsing::str4ncmp(json, "null") && jsoncharutils::is_structural_or_whitespace(json[4]);
    +  // if we start with 'n', we must be a null
    +  if(!is_null_string && json[0]=='n') { return incorrect_type_error("Not a null but starts with n"); }
    +  return is_null_string;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_string(bool allow_replacement) noexcept {
    +  return get_raw_json_string().unescape(json_iter(), allow_replacement);
    +}
    +template 
    +simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  std::string_view content;
    +  auto err = get_string(allow_replacement).get(content);
    +  if (err) { return err; }
    +  receiver = content;
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_wobbly_string() noexcept {
    +  return get_raw_json_string().unescape_wobbly(json_iter());
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_raw_json_string() noexcept {
    +  auto json = peek_scalar("string");
    +  if (*json != '"') { return incorrect_type_error("Not a string"); }
    +  advance_scalar("string");
    +  return raw_json_string(json+1);
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_uint64() noexcept {
    +  auto result = numberparsing::parse_unsigned(peek_non_root_scalar("uint64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("uint64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_uint64_in_string() noexcept {
    +  auto result = numberparsing::parse_unsigned_in_string(peek_non_root_scalar("uint64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("uint64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_int64() noexcept {
    +  auto result = numberparsing::parse_integer(peek_non_root_scalar("int64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("int64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_int64_in_string() noexcept {
    +  auto result = numberparsing::parse_integer_in_string(peek_non_root_scalar("int64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("int64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_double() noexcept {
    +  auto result = numberparsing::parse_double(peek_non_root_scalar("double"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("double"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_double_in_string() noexcept {
    +  auto result = numberparsing::parse_double_in_string(peek_non_root_scalar("double"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("double"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_bool() noexcept {
    +  auto result = parse_bool(peek_non_root_scalar("bool"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("bool"); }
    +  return result;
    +}
    +simdjson_inline simdjson_result value_iterator::is_null() noexcept {
    +  bool is_null_value;
    +  SIMDJSON_TRY(parse_null(peek_non_root_scalar("null")).get(is_null_value));
    +  if(is_null_value) { advance_non_root_scalar("null"); }
    +  return is_null_value;
    +}
    +simdjson_inline bool value_iterator::is_negative() noexcept {
    +  return numberparsing::is_negative(peek_non_root_scalar("numbersign"));
    +}
    +simdjson_inline bool value_iterator::is_root_negative() noexcept {
    +  return numberparsing::is_negative(peek_root_scalar("numbersign"));
    +}
    +simdjson_inline simdjson_result value_iterator::is_integer() noexcept {
    +  return numberparsing::is_integer(peek_non_root_scalar("integer"));
    +}
    +simdjson_inline simdjson_result value_iterator::get_number_type() noexcept {
    +  return numberparsing::get_number_type(peek_non_root_scalar("integer"));
    +}
    +simdjson_inline simdjson_result value_iterator::get_number() noexcept {
    +  number num;
    +  error_code error =  numberparsing::parse_number(peek_non_root_scalar("number"), num);
    +  if(error) { return error; }
    +  return num;
    +}
    +
    +simdjson_inline simdjson_result value_iterator::is_root_integer(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("is_root_integer");
    +  uint8_t tmpbuf[20+1+1]{}; // <20 digits> is the longest possible unsigned integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    return false; // if there are more than 20 characters, it cannot be represented as an integer.
    +  }
    +  auto answer = numberparsing::is_integer(tmpbuf);
    +  // If the parsing was a success, we must still check that it is
    +  // a single scalar. Note that we parse first because of cases like '[]' where
    +  // getting TRAILING_CONTENT is wrong.
    +  if(check_trailing && (answer.error() == SUCCESS) && (!_json_iter->is_single_token())) { return TRAILING_CONTENT; }
    +  return answer;
    +}
    +
    +simdjson_inline simdjson_result value_iterator::get_root_number_type(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("number");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1];
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto answer = numberparsing::get_number_type(tmpbuf);
    +  if (check_trailing && (answer.error() == SUCCESS)  && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +  return answer;
    +}
    +simdjson_inline simdjson_result value_iterator::get_root_number(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("number");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1];
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  number num;
    +  error_code error =  numberparsing::parse_number(tmpbuf, num);
    +  if(error) { return error; }
    +  if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +  advance_root_scalar("number");
    +  return num;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_string(bool check_trailing, bool allow_replacement) noexcept {
    +  return get_root_raw_json_string(check_trailing).unescape(json_iter(), allow_replacement);
    +}
    +template 
    +simdjson_warn_unused simdjson_inline error_code value_iterator::get_root_string(string_type& receiver, bool check_trailing, bool allow_replacement) noexcept {
    +  std::string_view content;
    +  auto err = get_root_string(check_trailing, allow_replacement).get(content);
    +  if (err) { return err; }
    +  receiver = content;
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_wobbly_string(bool check_trailing) noexcept {
    +  return get_root_raw_json_string(check_trailing).unescape_wobbly(json_iter());
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_raw_json_string(bool check_trailing) noexcept {
    +  auto json = peek_scalar("string");
    +  if (*json != '"') { return incorrect_type_error("Not a string"); }
    +  if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +  advance_scalar("string");
    +  return raw_json_string(json+1);
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_uint64(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("uint64");
    +  uint8_t tmpbuf[20+1+1]{}; // <20 digits> is the longest possible unsigned integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_unsigned(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("uint64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_uint64_in_string(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("uint64");
    +  uint8_t tmpbuf[20+1+1]{}; // <20 digits> is the longest possible unsigned integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_unsigned_in_string(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("uint64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_int64(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("int64");
    +  uint8_t tmpbuf[20+1+1]; // -<19 digits> is the longest possible integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +
    +  auto result = numberparsing::parse_integer(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("int64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_int64_in_string(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("int64");
    +  uint8_t tmpbuf[20+1+1]; // -<19 digits> is the longest possible integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +
    +  auto result = numberparsing::parse_integer_in_string(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("int64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_double(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("double");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination.
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_double(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("double");
    +  }
    +  return result;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_double_in_string(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("double");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination.
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_double_in_string(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("double");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_bool(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("bool");
    +  uint8_t tmpbuf[5+1+1]; // +1 for null termination
    +  tmpbuf[5+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 5+1)) { return incorrect_type_error("Not a boolean"); }
    +  auto result = parse_bool(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("bool");
    +  }
    +  return result;
    +}
    +simdjson_inline simdjson_result value_iterator::is_root_null(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("null");
    +  bool result = (max_len >= 4 && !atomparsing::str4ncmp(json, "null") &&
    +         (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4])));
    +  if(result) { // we have something that looks like a null.
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("null");
    +  }
    +  return result;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::skip_child() noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth >= _depth );
    +
    +  return _json_iter->skip_child(depth());
    +}
    +
    +simdjson_inline value_iterator value_iterator::child() const noexcept {
    +  assert_at_child();
    +  return { _json_iter, depth()+1, _json_iter->token.position() };
    +}
    +
    +// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller
    +// relating depth and iterator depth, which is a desired effect. It does not happen if is_open is
    +// marked non-inline.
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_inline bool value_iterator::is_open() const noexcept {
    +  return _json_iter->depth() >= depth();
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_inline bool value_iterator::at_end() const noexcept {
    +  return _json_iter->at_end();
    +}
    +
    +simdjson_inline bool value_iterator::at_start() const noexcept {
    +  return _json_iter->token.position() == start_position();
    +}
    +
    +simdjson_inline bool value_iterator::at_first_field() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  return _json_iter->token.position() == start_position() + 1;
    +}
    +
    +simdjson_inline void value_iterator::abandon() noexcept {
    +  _json_iter->abandon();
    +}
    +
    +simdjson_warn_unused simdjson_inline depth_t value_iterator::depth() const noexcept {
    +  return _depth;
    +}
    +simdjson_warn_unused simdjson_inline error_code value_iterator::error() const noexcept {
    +  return _json_iter->error;
    +}
    +simdjson_warn_unused simdjson_inline uint8_t *&value_iterator::string_buf_loc() noexcept {
    +  return _json_iter->string_buf_loc();
    +}
    +simdjson_warn_unused simdjson_inline const json_iterator &value_iterator::json_iter() const noexcept {
    +  return *_json_iter;
    +}
    +simdjson_warn_unused simdjson_inline json_iterator &value_iterator::json_iter() noexcept {
    +  return *_json_iter;
    +}
    +
    +simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept {
    +  return _json_iter->peek(start_position());
    +}
    +simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept {
    +  return _json_iter->peek_length(start_position());
    +}
    +
    +simdjson_inline const uint8_t *value_iterator::peek_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  // If we're not at the position anymore, we don't want to advance the cursor.
    +  if (!is_at_start()) { return peek_start(); }
    +
    +  // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value.
    +  assert_at_start();
    +  return _json_iter->peek();
    +}
    +
    +simdjson_inline void value_iterator::advance_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  // If we're not at the position anymore, we don't want to advance the cursor.
    +  if (!is_at_start()) { return; }
    +
    +  // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value.
    +  assert_at_start();
    +  _json_iter->return_current_and_advance();
    +  _json_iter->ascend_to(depth()-1);
    +}
    +
    +simdjson_inline error_code value_iterator::start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept {
    +  logger::log_start_value(*_json_iter, start_position(), depth(), type);
    +  // If we're not at the position anymore, we don't want to advance the cursor.
    +  const uint8_t *json;
    +  if (!is_at_start()) {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    if (!is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +    json = peek_start();
    +    if (*json != start_char) { return incorrect_type_error(incorrect_type_message); }
    +  } else {
    +    assert_at_start();
    +    /**
    +     * We should be prudent. Let us peek. If it is not the right type, we
    +     * return an error. Only once we have determined that we have the right
    +     * type are we allowed to advance!
    +     */
    +    json = _json_iter->peek();
    +    if (*json != start_char) { return incorrect_type_error(incorrect_type_message); }
    +    _json_iter->return_current_and_advance();
    +  }
    +
    +
    +  return SUCCESS;
    +}
    +
    +
    +simdjson_inline const uint8_t *value_iterator::peek_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return peek_start(); }
    +
    +  assert_at_root();
    +  return _json_iter->peek();
    +}
    +simdjson_inline const uint8_t *value_iterator::peek_non_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return peek_start(); }
    +
    +  assert_at_non_root_start();
    +  return _json_iter->peek();
    +}
    +
    +simdjson_inline void value_iterator::advance_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return; }
    +
    +  assert_at_root();
    +  _json_iter->return_current_and_advance();
    +  _json_iter->ascend_to(depth()-1);
    +}
    +simdjson_inline void value_iterator::advance_non_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return; }
    +
    +  assert_at_non_root_start();
    +  _json_iter->return_current_and_advance();
    +  _json_iter->ascend_to(depth()-1);
    +}
    +
    +simdjson_inline error_code value_iterator::incorrect_type_error(const char *message) const noexcept {
    +  logger::log_error(*_json_iter, start_position(), depth(), message);
    +  return INCORRECT_TYPE;
    +}
    +
    +simdjson_inline bool value_iterator::is_at_start() const noexcept {
    +  return position() == start_position();
    +}
    +
    +simdjson_inline bool value_iterator::is_at_key() const noexcept {
    +  // Keys are at the same depth as the object.
    +  // Note here that we could be safer and check that we are within an object,
    +  // but we do not.
    +  return _depth == _json_iter->_depth && *_json_iter->peek() == '"';
    +}
    +
    +simdjson_inline bool value_iterator::is_at_iterator_start() const noexcept {
    +  // We can legitimately be either at the first value ([1]), or after the array if it's empty ([]).
    +  auto delta = position() - start_position();
    +  return delta == 1 || delta == 2;
    +}
    +
    +inline void value_iterator::assert_at_start() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position == _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +inline void value_iterator::assert_at_container_start() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position == _start_position + 1 );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +inline void value_iterator::assert_at_next() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +simdjson_inline void value_iterator::move_at_start() noexcept {
    +  _json_iter->_depth = _depth;
    +  _json_iter->token.set_position(_start_position);
    +}
    +
    +simdjson_inline void value_iterator::move_at_container_start() noexcept {
    +  _json_iter->_depth = _depth;
    +  _json_iter->token.set_position(_start_position + 1);
    +}
    +
    +simdjson_inline simdjson_result value_iterator::reset_array() noexcept {
    +  if(error()) { return error(); }
    +  move_at_container_start();
    +  return started_array();
    +}
    +
    +simdjson_inline simdjson_result value_iterator::reset_object() noexcept {
    +  if(error()) { return error(); }
    +  move_at_container_start();
    +  return started_object();
    +}
    +
    +inline void value_iterator::assert_at_child() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth + 1 );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +inline void value_iterator::assert_at_root() const noexcept {
    +  assert_at_start();
    +  SIMDJSON_ASSUME( _depth == 1 );
    +}
    +
    +inline void value_iterator::assert_at_non_root_start() const noexcept {
    +  assert_at_start();
    +  SIMDJSON_ASSUME( _depth > 1 );
    +}
    +
    +inline void value_iterator::assert_is_valid() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter != nullptr );
    +}
    +
    +simdjson_inline bool value_iterator::is_valid() const noexcept {
    +  return _json_iter != nullptr;
    +}
    +
    +simdjson_inline simdjson_result value_iterator::type() const noexcept {
    +  switch (*peek_start()) {
    +    case '{':
    +      return json_type::object;
    +    case '[':
    +      return json_type::array;
    +    case '"':
    +      return json_type::string;
    +    case 'n':
    +      return json_type::null;
    +    case 't': case 'f':
    +      return json_type::boolean;
    +    case '-':
    +    case '0': case '1': case '2': case '3': case '4':
    +    case '5': case '6': case '7': case '8': case '9':
    +      return json_type::number;
    +    default:
    +      return TAPE_ERROR;
    +  }
    +}
    +
    +simdjson_inline token_position value_iterator::start_position() const noexcept {
    +  return _start_position;
    +}
    +
    +simdjson_inline token_position value_iterator::position() const noexcept {
    +  return _json_iter->position();
    +}
    +
    +simdjson_inline token_position value_iterator::end_position() const noexcept {
    +  return _json_iter->end_position();
    +}
    +
    +simdjson_inline token_position value_iterator::last_position() const noexcept {
    +  return _json_iter->last_position();
    +}
    +
    +simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept {
    +  return _json_iter->report_error(error, message);
    +}
    +
    +} // namespace ondemand
    +} // namespace arm64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(arm64::ondemand::value_iterator &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/value_iterator-inl.h for arm64 */
    +/* end file simdjson/generic/ondemand/amalgamated.h for arm64 */
    +/* including simdjson/arm64/end.h: #include "simdjson/arm64/end.h" */
    +/* begin file simdjson/arm64/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/arm64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT
    +/* undefining SIMDJSON_IMPLEMENTATION from "arm64" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/arm64/end.h */
    +
    +#endif // SIMDJSON_ARM64_ONDEMAND_H
    +/* end file simdjson/arm64/ondemand.h */
    +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(fallback)
    +/* including simdjson/fallback/ondemand.h: #include "simdjson/fallback/ondemand.h" */
    +/* begin file simdjson/fallback/ondemand.h */
    +#ifndef SIMDJSON_FALLBACK_ONDEMAND_H
    +#define SIMDJSON_FALLBACK_ONDEMAND_H
    +
    +/* including simdjson/fallback/begin.h: #include "simdjson/fallback/begin.h" */
    +/* begin file simdjson/fallback/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "fallback" */
    +#define SIMDJSON_IMPLEMENTATION fallback
    +/* including simdjson/fallback/base.h: #include "simdjson/fallback/base.h" */
    +/* begin file simdjson/fallback/base.h */
    +#ifndef SIMDJSON_FALLBACK_BASE_H
    +#define SIMDJSON_FALLBACK_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +/**
    + * Fallback implementation (runs on any machine).
    + */
    +namespace fallback {
    +
    +class implementation;
    +
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_FALLBACK_BASE_H
    +/* end file simdjson/fallback/base.h */
    +/* including simdjson/fallback/bitmanipulation.h: #include "simdjson/fallback/bitmanipulation.h" */
    +/* begin file simdjson/fallback/bitmanipulation.h */
    +#ifndef SIMDJSON_FALLBACK_BITMANIPULATION_H
    +#define SIMDJSON_FALLBACK_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace {
    +
    +#if defined(_MSC_VER) && !defined(_M_ARM64) && !defined(_M_X64)
    +static inline unsigned char _BitScanForward64(unsigned long* ret, uint64_t x) {
    +  unsigned long x0 = (unsigned long)x, top, bottom;
    +  _BitScanForward(&top, (unsigned long)(x >> 32));
    +  _BitScanForward(&bottom, x0);
    +  *ret = x0 ? bottom : 32 + top;
    +  return x != 0;
    +}
    +static unsigned char _BitScanReverse64(unsigned long* ret, uint64_t x) {
    +  unsigned long x1 = (unsigned long)(x >> 32), top, bottom;
    +  _BitScanReverse(&top, x1);
    +  _BitScanReverse(&bottom, (unsigned long)x);
    +  *ret = x1 ? top + 32 : bottom;
    +  return x != 0;
    +}
    +#endif
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +#ifdef _MSC_VER
    +  unsigned long leading_zero = 0;
    +  // Search the mask data from most significant bit (MSB)
    +  // to least significant bit (LSB) for a set bit (1).
    +  if (_BitScanReverse64(&leading_zero, input_num))
    +    return (int)(63 - leading_zero);
    +  else
    +    return 64;
    +#else
    +  return __builtin_clzll(input_num);
    +#endif// _MSC_VER
    +}
    +
    +} // unnamed namespace
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_FALLBACK_BITMANIPULATION_H
    +/* end file simdjson/fallback/bitmanipulation.h */
    +/* including simdjson/fallback/stringparsing_defs.h: #include "simdjson/fallback/stringparsing_defs.h" */
    +/* begin file simdjson/fallback/stringparsing_defs.h */
    +#ifndef SIMDJSON_FALLBACK_STRINGPARSING_DEFS_H
    +#define SIMDJSON_FALLBACK_STRINGPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace {
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 1;
    +  simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() { return c == '"'; }
    +  simdjson_inline bool has_backslash() { return c == '\\'; }
    +  simdjson_inline int quote_index() { return c == '"' ? 0 : 1; }
    +  simdjson_inline int backslash_index() { return c == '\\' ? 0 : 1; }
    +
    +  uint8_t c;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // store to dest unconditionally - we can overwrite the bits we don't like later
    +  dst[0] = src[0];
    +  return { src[0] };
    +}
    +
    +} // unnamed namespace
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_FALLBACK_STRINGPARSING_DEFS_H
    +/* end file simdjson/fallback/stringparsing_defs.h */
    +/* including simdjson/fallback/numberparsing_defs.h: #include "simdjson/fallback/numberparsing_defs.h" */
    +/* begin file simdjson/fallback/numberparsing_defs.h */
    +#ifndef SIMDJSON_FALLBACK_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_FALLBACK_NUMBERPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +#ifdef JSON_TEST_NUMBERS // for unit testing
    +void found_invalid_number(const uint8_t *buf);
    +void found_integer(int64_t result, const uint8_t *buf);
    +void found_unsigned_integer(uint64_t result, const uint8_t *buf);
    +void found_float(double result, const uint8_t *buf);
    +#endif
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace numberparsing {
    +
    +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const char *chars) {
    +  uint64_t val;
    +  memcpy(&val, chars, sizeof(uint64_t));
    +  val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8;
    +  val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16;
    +  return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32);
    +}
    +
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  return parse_eight_digits_unrolled(reinterpret_cast(chars));
    +}
    +
    +#if SIMDJSON_IS_32BITS // _umul128 for x86, arm
    +// this is a slow emulation routine for 32-bit
    +//
    +static simdjson_inline uint64_t __emulu(uint32_t x, uint32_t y) {
    +  return x * (uint64_t)y;
    +}
    +static simdjson_inline uint64_t _umul128(uint64_t ab, uint64_t cd, uint64_t *hi) {
    +  uint64_t ad = __emulu((uint32_t)(ab >> 32), (uint32_t)cd);
    +  uint64_t bd = __emulu((uint32_t)ab, (uint32_t)cd);
    +  uint64_t adbc = ad + __emulu((uint32_t)ab, (uint32_t)(cd >> 32));
    +  uint64_t adbc_carry = !!(adbc < ad);
    +  uint64_t lo = bd + (adbc << 32);
    +  *hi = __emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) +
    +        (adbc_carry << 32) + !!(lo < bd);
    +  return lo;
    +}
    +#endif
    +
    +/** @private */
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif // SIMDJSON_FALLBACK_NUMBERPARSING_DEFS_H
    +/* end file simdjson/fallback/numberparsing_defs.h */
    +/* end file simdjson/fallback/begin.h */
    +/* including simdjson/generic/ondemand/amalgamated.h for fallback: #include "simdjson/generic/ondemand/amalgamated.h" */
    +/* begin file simdjson/generic/ondemand/amalgamated.h for fallback */
    +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_ONDEMAND_DEPENDENCIES_H)
    +#error simdjson/generic/ondemand/dependencies.h must be included before simdjson/generic/ondemand/amalgamated.h!
    +#endif
    +
    +// Stuff other things depend on
    +/* including simdjson/generic/ondemand/base.h for fallback: #include "simdjson/generic/ondemand/base.h" */
    +/* begin file simdjson/generic/ondemand/base.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +/**
    + * A fast, simple, DOM-like interface that parses JSON as you use it.
    + *
    + * Designed for maximum speed and a lower memory profile.
    + */
    +namespace ondemand {
    +
    +/** Represents the depth of a JSON value (number of nested arrays/objects). */
    +using depth_t = int32_t;
    +
    +/** @copydoc simdjson::fallback::number_type */
    +using number_type = simdjson::fallback::number_type;
    +
    +/** @private Position in the JSON buffer indexes */
    +using token_position = const uint32_t *;
    +
    +class array;
    +class array_iterator;
    +class document;
    +class document_reference;
    +class document_stream;
    +class field;
    +class json_iterator;
    +enum class json_type;
    +struct number;
    +class object;
    +class object_iterator;
    +class parser;
    +class raw_json_string;
    +class token_iterator;
    +class value;
    +class value_iterator;
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_BASE_H
    +/* end file simdjson/generic/ondemand/base.h for fallback */
    +/* including simdjson/generic/ondemand/value_iterator.h for fallback: #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* begin file simdjson/generic/ondemand/value_iterator.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +/**
    + * Iterates through a single JSON value at a particular depth.
    + *
    + * Does not keep track of the type of value: provides methods for objects, arrays and scalars and expects
    + * the caller to call the right ones.
    + *
    + * @private This is not intended for external use.
    + */
    +class value_iterator {
    +protected:
    +  /** The underlying JSON iterator */
    +  json_iterator *_json_iter{};
    +  /** The depth of this value */
    +  depth_t _depth{};
    +  /**
    +   * The starting token index for this value
    +   */
    +  token_position _start_position{};
    +
    +public:
    +  simdjson_inline value_iterator() noexcept = default;
    +
    +  /**
    +   * Denote that we're starting a document.
    +   */
    +  simdjson_inline void start_document() noexcept;
    +
    +  /**
    +   * Skips a non-iterated or partially-iterated JSON value, whether it is a scalar, array or object.
    +   *
    +   * Optimized for scalars.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code skip_child() noexcept;
    +
    +  /**
    +   * Tell whether the iterator is at the EOF mark
    +   */
    +  simdjson_inline bool at_end() const noexcept;
    +
    +  /**
    +   * Tell whether the iterator is at the start of the value
    +   */
    +  simdjson_inline bool at_start() const noexcept;
    +
    +  /**
    +   * Tell whether the value is open--if the value has not been used, or the array/object is still open.
    +   */
    +  simdjson_inline bool is_open() const noexcept;
    +
    +  /**
    +   * Tell whether the value is at an object's first field (just after the {).
    +   */
    +  simdjson_inline bool at_first_field() const noexcept;
    +
    +  /**
    +   * Abandon all iteration.
    +   */
    +  simdjson_inline void abandon() noexcept;
    +
    +  /**
    +   * Get the child value as a value_iterator.
    +   */
    +  simdjson_inline value_iterator child_value() const noexcept;
    +
    +  /**
    +   * Get the depth of this value.
    +   */
    +  simdjson_inline int32_t depth() const noexcept;
    +
    +  /**
    +   * Get the JSON type of this value.
    +   *
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result type() const noexcept;
    +
    +  /**
    +   * @addtogroup object Object iteration
    +   *
    +   * Methods to iterate and find object fields. These methods generally *assume* the value is
    +   * actually an object; the caller is responsible for keeping track of that fact.
    +   *
    +   * @{
    +   */
    +
    +  /**
    +   * Start an object iteration.
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCORRECT_TYPE if there is no opening {
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_object() noexcept;
    +  /**
    +   * Start an object iteration from the root.
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCORRECT_TYPE if there is no opening {
    +   * @error TAPE_ERROR if there is no matching } at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_root_object() noexcept;
    +  /**
    +   * Checks whether an object could be started from the root. May be called by start_root_object.
    +   *
    +   * @returns SUCCESS if it is possible to safely start an object from the root (document level).
    +   * @error INCORRECT_TYPE if there is no opening {
    +   * @error TAPE_ERROR if there is no matching } at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline error_code check_root_object() noexcept;
    +  /**
    +   * Start an object iteration after the user has already checked and moved past the {.
    +   *
    +   * Does not move the iterator unless the object is empty ({}).
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_object() noexcept;
    +  /**
    +   * Start an object iteration from the root, after the user has already checked and moved past the {.
    +   *
    +   * Does not move the iterator unless the object is empty ({}).
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_root_object() noexcept;
    +
    +  /**
    +   * Moves to the next field in an object.
    +   *
    +   * Looks for , and }. If } is found, the object is finished and the iterator advances past it.
    +   * Otherwise, it advances to the next value.
    +   *
    +   * @return whether there is another field in the object.
    +   * @error TAPE_ERROR If there is a comma missing between fields.
    +   * @error TAPE_ERROR If there is a comma, but not enough tokens remaining to have a key, :, and value.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result has_next_field() noexcept;
    +
    +  /**
    +   * Get the current field's key.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result field_key() noexcept;
    +
    +  /**
    +   * Pass the : in the field and move to its value.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code field_value() noexcept;
    +
    +  /**
    +   * Find the next field with the given key.
    +   *
    +   * Assumes you have called next_field() or otherwise matched the previous value.
    +   *
    +   * This means the iterator must be sitting at the next key:
    +   *
    +   * ```
    +   * { "a": 1, "b": 2 }
    +   *           ^
    +   * ```
    +   *
    +   * Key is *raw JSON,* meaning it will be matched against the verbatim JSON without attempting to
    +   * unescape it. This works well for typical ASCII and UTF-8 keys (almost all of them), but may
    +   * fail to match some keys with escapes (\u, \n, etc.).
    +   */
    +  simdjson_warn_unused simdjson_inline error_code find_field(const std::string_view key) noexcept;
    +
    +  /**
    +   * Find the next field with the given key, *without* unescaping. This assumes object order: it
    +   * will not find the field if it was already passed when looking for some *other* field.
    +   *
    +   * Assumes you have called next_field() or otherwise matched the previous value.
    +   *
    +   * This means the iterator must be sitting at the next key:
    +   *
    +   * ```
    +   * { "a": 1, "b": 2 }
    +   *           ^
    +   * ```
    +   *
    +   * Key is *raw JSON,* meaning it will be matched against the verbatim JSON without attempting to
    +   * unescape it. This works well for typical ASCII and UTF-8 keys (almost all of them), but may
    +   * fail to match some keys with escapes (\u, \n, etc.).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result find_field_raw(const std::string_view key) noexcept;
    +
    +  /**
    +   * Find the field with the given key without regard to order, and *without* unescaping.
    +   *
    +   * This is an unordered object lookup: if the field is not found initially, it will cycle around and scan from the beginning.
    +   *
    +   * Assumes you have called next_field() or otherwise matched the previous value.
    +   *
    +   * This means the iterator must be sitting at the next key:
    +   *
    +   * ```
    +   * { "a": 1, "b": 2 }
    +   *           ^
    +   * ```
    +   *
    +   * Key is *raw JSON,* meaning it will be matched against the verbatim JSON without attempting to
    +   * unescape it. This works well for typical ASCII and UTF-8 keys (almost all of them), but may
    +   * fail to match some keys with escapes (\u, \n, etc.).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result find_field_unordered_raw(const std::string_view key) noexcept;
    +
    +  /** @} */
    +
    +  /**
    +   * @addtogroup array Array iteration
    +   * Methods to iterate over array elements. These methods generally *assume* the value is actually
    +   * an object; the caller is responsible for keeping track of that fact.
    +   * @{
    +   */
    +
    +  /**
    +   * Check for an opening [ and start an array iteration.
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCORRECT_TYPE If there is no [.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_array() noexcept;
    +  /**
    +   * Check for an opening [ and start an array iteration while at the root.
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCORRECT_TYPE If there is no [.
    +   * @error TAPE_ERROR if there is no matching ] at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_root_array() noexcept;
    +  /**
    +   * Checks whether an array could be started from the root. May be called by start_root_array.
    +   *
    +   * @returns SUCCESS if it is possible to safely start an array from the root (document level).
    +   * @error INCORRECT_TYPE If there is no [.
    +   * @error TAPE_ERROR if there is no matching ] at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline error_code check_root_array() noexcept;
    +  /**
    +   * Start an array iteration, after the user has already checked and moved past the [.
    +   *
    +   * Does not move the iterator unless the array is empty ([]).
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_array() noexcept;
    +  /**
    +   * Start an array iteration from the root, after the user has already checked and moved past the [.
    +   *
    +   * Does not move the iterator unless the array is empty ([]).
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_root_array() noexcept;
    +
    +  /**
    +   * Moves to the next element in an array.
    +   *
    +   * Looks for , and ]. If ] is found, the array is finished and the iterator advances past it.
    +   * Otherwise, it advances to the next value.
    +   *
    +   * @return Whether there is another element in the array.
    +   * @error TAPE_ERROR If there is a comma missing between elements.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result has_next_element() noexcept;
    +
    +  /**
    +   * Get a child value iterator.
    +   */
    +  simdjson_warn_unused simdjson_inline value_iterator child() const noexcept;
    +
    +  /** @} */
    +
    +  /**
    +   * @defgroup scalar Scalar values
    +   * @addtogroup scalar
    +   * @{
    +   */
    +
    +  simdjson_warn_unused simdjson_inline simdjson_result get_string(bool allow_replacement) noexcept;
    +  template 
    +  simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_null() noexcept;
    +  simdjson_warn_unused simdjson_inline bool is_negative() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept;
    +
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_string(bool check_trailing, bool allow_replacement) noexcept;
    +  template 
    +  simdjson_warn_unused simdjson_inline error_code get_root_string(string_type& receiver, bool check_trailing, bool allow_replacement) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_wobbly_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_raw_json_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_uint64(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_uint64_in_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_int64(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_int64_in_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_double(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_double_in_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_bool(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline bool is_root_negative() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_root_integer(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_number_type(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_number(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_root_null(bool check_trailing) noexcept;
    +
    +  simdjson_inline error_code error() const noexcept;
    +  simdjson_inline uint8_t *&string_buf_loc() noexcept;
    +  simdjson_inline const json_iterator &json_iter() const noexcept;
    +  simdjson_inline json_iterator &json_iter() noexcept;
    +
    +  simdjson_inline void assert_is_valid() const noexcept;
    +  simdjson_inline bool is_valid() const noexcept;
    +
    +  /** @} */
    +protected:
    +  /**
    +   * Restarts an array iteration.
    +   * @returns Whether the array has any elements (returns false for empty).
    +   */
    +  simdjson_inline simdjson_result reset_array() noexcept;
    +  /**
    +   * Restarts an object iteration.
    +   * @returns Whether the object has any fields (returns false for empty).
    +   */
    +  simdjson_inline simdjson_result reset_object() noexcept;
    +  /**
    +   * move_at_start(): moves us so that we are pointing at the beginning of
    +   * the container. It updates the index so that at_start() is true and it
    +   * syncs the depth. The user can then create a new container instance.
    +   *
    +   * Usage: used with value::count_elements().
    +   **/
    +  simdjson_inline void move_at_start() noexcept;
    +
    +  /**
    +   * move_at_container_start(): moves us so that we are pointing at the beginning of
    +   * the container so that assert_at_container_start() passes.
    +   *
    +   * Usage: used with reset_array() and reset_object().
    +   **/
    +   simdjson_inline void move_at_container_start() noexcept;
    +  /* Useful for debugging and logging purposes. */
    +  inline std::string to_string() const noexcept;
    +  simdjson_inline value_iterator(json_iterator *json_iter, depth_t depth, token_position start_index) noexcept;
    +
    +  simdjson_inline simdjson_result parse_null(const uint8_t *json) const noexcept;
    +  simdjson_inline simdjson_result parse_bool(const uint8_t *json) const noexcept;
    +  simdjson_inline const uint8_t *peek_start() const noexcept;
    +  simdjson_inline uint32_t peek_start_length() const noexcept;
    +
    +  /**
    +   * The general idea of the advance_... methods and the peek_* methods
    +   * is that you first peek and check that you have desired type. If you do,
    +   * and only if you do, then you advance.
    +   *
    +   * We used to unconditionally advance. But this made reasoning about our
    +   * current state difficult.
    +   * Suppose you always advance. Look at the 'value' matching the key
    +   * "shadowable" in the following example...
    +   *
    +   * ({"globals":{"a":{"shadowable":[}}}})
    +   *
    +   * If the user thinks it is a Boolean and asks for it, then we check the '[',
    +   * decide it is not a Boolean, but still move into the next character ('}'). Now
    +   * we are left pointing at '}' right after a '['. And we have not yet reported
    +   * an error, only that we do not have a Boolean.
    +   *
    +   * If, instead, you just stand your ground until it is content that you know, then
    +   * you will only even move beyond the '[' if the user tells you that you have an
    +   * array. So you will be at the '}' character inside the array and, hopefully, you
    +   * will then catch the error because an array cannot start with '}', but the code
    +   * processing Boolean values does not know this.
    +   *
    +   * So the contract is: first call 'peek_...' and then call 'advance_...' only
    +   * if you have determined that it is a type you can handle.
    +   *
    +   * Unfortunately, it makes the code more verbose, longer and maybe more error prone.
    +   */
    +
    +  simdjson_inline void advance_scalar(const char *type) noexcept;
    +  simdjson_inline void advance_root_scalar(const char *type) noexcept;
    +  simdjson_inline void advance_non_root_scalar(const char *type) noexcept;
    +
    +  simdjson_inline const uint8_t *peek_scalar(const char *type) noexcept;
    +  simdjson_inline const uint8_t *peek_root_scalar(const char *type) noexcept;
    +  simdjson_inline const uint8_t *peek_non_root_scalar(const char *type) noexcept;
    +
    +
    +  simdjson_inline error_code start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept;
    +  simdjson_inline error_code end_container() noexcept;
    +
    +  /**
    +   * Advance to a place expecting a value (increasing depth).
    +   *
    +   * @return The current token (the one left behind).
    +   * @error TAPE_ERROR If the document ended early.
    +   */
    +  simdjson_inline simdjson_result advance_to_value() noexcept;
    +
    +  simdjson_inline error_code incorrect_type_error(const char *message) const noexcept;
    +  simdjson_inline error_code error_unless_more_tokens(uint32_t tokens=1) const noexcept;
    +
    +  simdjson_inline bool is_at_start() const noexcept;
    +  /**
    +   * is_at_iterator_start() returns true on an array or object after it has just been
    +   * created, whether the instance is empty or not.
    +   *
    +   * Usage: used by array::begin() in debug mode (SIMDJSON_DEVELOPMENT_CHECKS)
    +   */
    +  simdjson_inline bool is_at_iterator_start() const noexcept;
    +
    +  /**
    +   * Assuming that we are within an object, this returns true if we
    +   * are pointing at a key.
    +   *
    +   * Usage: the skip_child() method should never be used while we are pointing
    +   * at a key inside an object.
    +   */
    +  simdjson_inline bool is_at_key() const noexcept;
    +
    +  inline void assert_at_start() const noexcept;
    +  inline void assert_at_container_start() const noexcept;
    +  inline void assert_at_root() const noexcept;
    +  inline void assert_at_child() const noexcept;
    +  inline void assert_at_next() const noexcept;
    +  inline void assert_at_non_root_start() const noexcept;
    +
    +  /** Get the starting position of this value */
    +  simdjson_inline token_position start_position() const noexcept;
    +
    +  /** @copydoc error_code json_iterator::position() const noexcept; */
    +  simdjson_inline token_position position() const noexcept;
    +  /** @copydoc error_code json_iterator::end_position() const noexcept; */
    +  simdjson_inline token_position last_position() const noexcept;
    +  /** @copydoc error_code json_iterator::end_position() const noexcept; */
    +  simdjson_inline token_position end_position() const noexcept;
    +  /** @copydoc error_code json_iterator::report_error(error_code error, const char *message) noexcept; */
    +  simdjson_inline error_code report_error(error_code error, const char *message) noexcept;
    +
    +  friend class document;
    +  friend class object;
    +  friend class array;
    +  friend class value;
    +}; // value_iterator
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public fallback::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(fallback::ondemand::value_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H
    +/* end file simdjson/generic/ondemand/value_iterator.h for fallback */
    +/* including simdjson/generic/ondemand/value.h for fallback: #include "simdjson/generic/ondemand/value.h" */
    +/* begin file simdjson/generic/ondemand/value.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +/**
    + * An ephemeral JSON value returned during iteration. It is only valid for as long as you do
    + * not access more data in the JSON document.
    + */
    +class value {
    +public:
    +  /**
    +   * Create a new invalid value.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline value() noexcept = default;
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool
    +   *
    +   * You may use get_double(), get_bool(), get_uint64(), get_int64(),
    +   * get_object(), get_array(), get_raw_json_string(), or get_string() instead.
    +   *
    +   * @returns A value of the given type, parsed from the JSON.
    +   * @returns INCORRECT_TYPE If the JSON value is not the given type.
    +   */
    +  template simdjson_inline simdjson_result get() noexcept {
    +    // Unless the simdjson library provides an inline implementation, calling this method should
    +    // immediately fail.
    +    static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. "
    +      "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
    +      "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), "
    +      " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template.");
    +  }
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool
    +   *
    +   * @param out This is set to a value of the given type, parsed from the JSON. If there is an error, this may not be initialized.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   * @returns SUCCESS If the parse succeeded and the out parameter was set to the value.
    +   */
    +  template simdjson_inline error_code get(T &out) noexcept;
    +
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @returns INCORRECT_TYPE If the JSON value is not an array.
    +   */
    +  simdjson_inline simdjson_result get_array() noexcept;
    +
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   */
    +  simdjson_inline simdjson_result get_object() noexcept;
    +
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A unsigned 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a unsigned integer.
    +   *
    +   * @returns A unsigned 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a double
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Equivalent to get().
    +   *
    +   * Important: a value should be consumed once. Calling get_string() twice on the same value
    +   * is an error.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +
    +  /**
    +   * Attempts to fill the provided std::string reference with the parsed value of the current string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Important: a value should be consumed once. Calling get_string() twice on the same value
    +   * is an error.
    +   *
    +   * Performance: This method may be slower than get_string() or get_string(bool) because it may need to allocate memory.
    +   * We recommend you avoid allocating an std::string unless you need to.
    +   *
    +   * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS.
    +   */
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +
    +  /**
    +   * Cast this JSON value to a "wobbly" string.
    +   *
    +   * The string is may not be a valid UTF-8 string.
    +   * See https://simonsapin.github.io/wtf-8/
    +   *
    +   * Important: a value should be consumed once. Calling get_wobbly_string() twice on the same value
    +   * is an error.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @returns INCORRECT_TYPE if the JSON value is not true or false.
    +   */
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +
    +  /**
    +   * Checks if this JSON value is null. If and only if the value is
    +   * null, then it is consumed (we advance). If we find a token that
    +   * begins with 'n' but is not 'null', then an error is returned.
    +   *
    +   * @returns Whether the value is null.
    +   * @returns INCORRECT_TYPE If the JSON value begins with 'n' and is not 'null'.
    +   */
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an array.
    +   */
    +  simdjson_inline operator array() noexcept(false);
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an object.
    +   */
    +  simdjson_inline operator object() noexcept(false);
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline operator int64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline operator double() noexcept(false);
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Equivalent to get().
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator raw_json_string() noexcept(false);
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not true or false.
    +   */
    +  simdjson_inline operator bool() noexcept(false);
    +#endif
    +
    +  /**
    +   * Begin array iteration.
    +   *
    +   * Part of the std::iterable interface.
    +   *
    +   * @returns INCORRECT_TYPE If the JSON value is not an array.
    +   */
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  /**
    +   * Sentinel representing the end of the array.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result end() & noexcept;
    +  /**
    +   * This method scans the array and counts the number of elements.
    +   * The count_elements method should always be called before you have begun
    +   * iterating through the array: it is expected that you are pointing at
    +   * the beginning of the array.
    +   * The runtime complexity is linear in the size of the array. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * Performance hint: You should only call count_elements() as a last
    +   * resort as it may require scanning the document twice or more.
    +   */
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  /**
    +   * This method scans the object and counts the number of key-value pairs.
    +   * The count_fields method should always be called before you have begun
    +   * iterating through the object: it is expected that you are pointing at
    +   * the beginning of the object.
    +   * The runtime complexity is linear in the size of the object. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an object is empty, it is more performant to use
    +   * the is_empty() method on the object instance.
    +   *
    +   * Performance hint: You should only call count_fields() as a last
    +   * resort as it may require scanning the document twice or more.
    +   */
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  /**
    +   * Get the value at the given index in the array. This function has linear-time complexity.
    +   * This function should only be called once on an array instance since the array iterator is not reset between each call.
    +   *
    +   * @return The value at the given index, or:
    +   *         - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
    +   */
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field(const char *key) noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](const char *key) noexcept;
    +
    +  /**
    +   * Get the type of this JSON value. It does not validate or consume the value.
    +   * E.g., you must still call "is_null()" to check that a value is null even if
    +   * "type()" returns json_type::null.
    +   *
    +   * NOTE: If you're only expecting a value to be one type (a typical case), it's generally
    +   * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just
    +   * let it throw an exception).
    +   *
    +   * @return The type of JSON value (json_type::array, json_type::object, json_type::string,
    +   *     json_type::number, json_type::boolean, or json_type::null).
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result type() noexcept;
    +
    +  /**
    +   * Checks whether the value is a scalar (string, number, null, Boolean).
    +   * Returns false when there it is an array or object.
    +   *
    +   * @returns true if the type is string, number, null, Boolean
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +
    +  /**
    +   * Checks whether the value is a negative number.
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline bool is_negative() noexcept;
    +  /**
    +   * Checks whether the value is an integer number. Note that
    +   * this requires to partially parse the number string. If
    +   * the value is determined to be an integer, it may still
    +   * not parse properly as an integer in subsequent steps
    +   * (e.g., it might overflow).
    +   *
    +   * Performance note: if you call this function systematically
    +   * before parsing a number, you may have fallen for a performance
    +   * anti-pattern.
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  /**
    +   * Determine the number type (integer or floating-point number) as quickly
    +   * as possible. This function does not fully validate the input. It is
    +   * useful when you only need to classify the numbers, without parsing them.
    +   *
    +   * If you are planning to retrieve the value or you need full validation,
    +   * consider using the get_number() method instead: it will fully parse
    +   * and validate the input, and give you access to the type:
    +   * get_number().get_number_type().
    +   *
    +   * get_number_type() is number_type::unsigned_integer if we have
    +   * an integer greater or equal to 9223372036854775808
    +   * get_number_type() is number_type::signed_integer if we have an
    +   * integer that is less than 9223372036854775808
    +   * Otherwise, get_number_type() has value number_type::floating_point_number
    +   *
    +   * This function requires processing the number string, but it is expected
    +   * to be faster than get_number().get_number_type() because it is does not
    +   * parse the number value.
    +   *
    +   * @returns the type of the number
    +   */
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +
    +  /**
    +   * Attempt to parse an ondemand::number. An ondemand::number may
    +   * contain an integer value or a floating-point value, the simdjson
    +   * library will autodetect the type. Thus it is a dynamically typed
    +   * number. Before accessing the value, you must determine the detected
    +   * type.
    +   *
    +   * number.get_number_type() is number_type::signed_integer if we have
    +   * an integer in [-9223372036854775808,9223372036854775808)
    +   * You can recover the value by calling number.get_int64() and you
    +   * have that number.is_int64() is true.
    +   *
    +   * number.get_number_type() is number_type::unsigned_integer if we have
    +   * an integer in [9223372036854775808,18446744073709551616)
    +   * You can recover the value by calling number.get_uint64() and you
    +   * have that number.is_uint64() is true.
    +   *
    +   * Otherwise, number.get_number_type() has value number_type::floating_point_number
    +   * and we have a binary64 number.
    +   * You can recover the value by calling number.get_double() and you
    +   * have that number.is_double() is true.
    +   *
    +   * You must check the type before accessing the value: it is an error
    +   * to call "get_int64()" when number.get_number_type() is not
    +   * number_type::signed_integer and when number.is_int64() is false.
    +   *
    +   * Performance note: this is designed with performance in mind. When
    +   * calling 'get_number()', you scan the number string only once, determining
    +   * efficiently the type and storing it in an efficient manner.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept;
    +
    +
    +  /**
    +   * Get the raw JSON for this token.
    +   *
    +   * The string_view will always point into the input buffer.
    +   *
    +   * The string_view will start at the beginning of the token, and include the entire token
    +   * *as well as all spaces until the next token (or EOF).* This means, for example, that a
    +   * string token always begins with a " and is always terminated by the final ", possibly
    +   * followed by a number of spaces.
    +   *
    +   * The string_view is *not* null-terminated. However, if this is a scalar (string, number,
    +   * boolean, or null), the character after the end of the string_view is guaranteed to be
    +   * a non-space token.
    +   *
    +   * Tokens include:
    +   * - {
    +   * - [
    +   * - "a string (possibly with UTF-8 or backslashed characters like \\\")".
    +   * - -1.2e-100
    +   * - true
    +   * - false
    +   * - null
    +   *
    +   * See also value::raw_json().
    +   */
    +  simdjson_inline std::string_view raw_json_token() noexcept;
    +
    +  /**
    +   * Get a string_view pointing at this value in the JSON document.
    +   * If this element is an array or an object, it consumes the array or the object
    +   * and returns a string_view instance corresponding to the
    +   * array as represented in JSON. It points inside the original document.
    +   * If this element is a scalar (string, number, Boolean, null), it returns what
    +   * raw_json_token() would return.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +  /**
    +   * Returns the current location in the document if in bounds.
    +   */
    +  simdjson_inline simdjson_result current_location() noexcept;
    +
    +  /**
    +   * Returns the current depth in the document if in bounds.
    +   *
    +   * E.g.,
    +   *  0 = finished with document
    +   *  1 = document root value (could be [ or {, not yet known)
    +   *  2 = , or } inside root array/object
    +   *  3 = key or value inside root array/object.
    +   */
    +  simdjson_inline int32_t current_depth() const noexcept;
    +
    +  /**
    +   * Get the value associated with the given JSON pointer.  We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/foo/a/1") == 20
    +   *
    +   * It is allowed for a key to be the empty string:
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("//a/1") == 20
    +   *
    +   * Note that at_pointer() called on the document automatically calls the document's rewind
    +   * method between each call. It invalidates all previously accessed arrays, objects and values
    +   * that have not been consumed.
    +   *
    +   * Calling at_pointer() on non-document instances (e.g., arrays and objects) is not
    +   * standardized (by RFC 6901). We provide some experimental support for JSON pointers
    +   * on non-document instances.  Yet it is not the case when calling at_pointer on an array
    +   * or an object instance: there is no rewind and no invalidation.
    +   *
    +   * You may only call at_pointer on an array after it has been created, but before it has
    +   * been first accessed. When calling at_pointer on an array, the pointer is advanced to
    +   * the location indicated by the JSON pointer (in case of success). It is no longer possible
    +   * to call at_pointer on the same array.
    +   *
    +   * You may call at_pointer more than once on an object, but each time the pointer is advanced
    +   * to be within the value matched by the key indicated by the JSON pointer query. Thus any preceding
    +   * key (as well as the current key) can no longer be used with following JSON pointer calls.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   */
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +
    +protected:
    +  /**
    +   * Create a value.
    +   */
    +  simdjson_inline value(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Skip this value, allowing iteration to continue.
    +   */
    +  simdjson_inline void skip() noexcept;
    +
    +  /**
    +   * Start a value at the current position.
    +   *
    +   * (It should already be started; this is just a self-documentation method.)
    +   */
    +  static simdjson_inline value start(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Resume a value.
    +   */
    +  static simdjson_inline value resume(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Get the object, starting or resuming it as necessary
    +   */
    +  simdjson_inline simdjson_result start_or_resume_object() noexcept;
    +
    +  // simdjson_inline void log_value(const char *type) const noexcept;
    +  // simdjson_inline void log_error(const char *message) const noexcept;
    +
    +  value_iterator iter{};
    +
    +  friend class document;
    +  friend class array_iterator;
    +  friend class field;
    +  friend class object;
    +  friend struct simdjson_result;
    +  friend struct simdjson_result;
    +};
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public fallback::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(fallback::ondemand::value &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result get_array() noexcept;
    +  simdjson_inline simdjson_result get_object() noexcept;
    +
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +  template simdjson_inline simdjson_result get() noexcept;
    +
    +  template simdjson_inline error_code get(T &out) noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator fallback::ondemand::array() noexcept(false);
    +  simdjson_inline operator fallback::ondemand::object() noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator fallback::ondemand::raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   *
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field(const char *key) noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](const char *key) noexcept;
    +
    +  /**
    +   * Get the type of this JSON value.
    +   *
    +   * NOTE: If you're only expecting a value to be one type (a typical case), it's generally
    +   * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just
    +   * let it throw an exception).
    +   */
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +  simdjson_inline simdjson_result is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +
    +  /** @copydoc simdjson_inline std::string_view value::raw_json_token() const noexcept */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +  /** @copydoc simdjson_inline simdjson_result current_location() noexcept */
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  /** @copydoc simdjson_inline int32_t current_depth() const noexcept */
    +  simdjson_inline simdjson_result current_depth() const noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_H
    +/* end file simdjson/generic/ondemand/value.h for fallback */
    +/* including simdjson/generic/ondemand/logger.h for fallback: #include "simdjson/generic/ondemand/logger.h" */
    +/* begin file simdjson/generic/ondemand/logger.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_LOGGER_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +// Logging should be free unless SIMDJSON_VERBOSE_LOGGING is set. Importantly, it is critical
    +// that the call to the log functions be side-effect free. Thus, for example, you should not
    +// create temporary std::string instances.
    +namespace logger {
    +
    +enum class log_level : int32_t {
    +  info = 0,
    +  error = 1
    +};
    +
    +#if SIMDJSON_VERBOSE_LOGGING
    +  static constexpr const bool LOG_ENABLED = true;
    +#else
    +  static constexpr const bool LOG_ENABLED = false;
    +#endif
    +
    +// We do not want these functions to be 'really inlined' since real inlining is
    +// for performance purposes and if you are using the loggers, you do not care about
    +// performance (or should not).
    +static inline void log_headers() noexcept;
    +// If args are provided, title will be treated as format string
    +template 
    +static inline void log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, logger::log_level level, Args&&... args) noexcept;
    +template 
    +static inline void log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, logger::log_level level, Args&&... args) noexcept;
    +static inline void log_event(const json_iterator &iter, const char *type, std::string_view detail="", int delta=0, int depth_delta=0) noexcept;
    +static inline void log_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail="") noexcept;
    +static inline void log_value(const json_iterator &iter, const char *type, std::string_view detail="", int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_start_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail="") noexcept;
    +static inline void log_start_value(const json_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_end_value(const json_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +
    +static inline void log_error(const json_iterator &iter, token_position index, depth_t depth, const char *error, const char *detail="") noexcept;
    +static inline void log_error(const json_iterator &iter, const char *error, const char *detail="", int delta=-1, int depth_delta=0) noexcept;
    +
    +static inline void log_event(const value_iterator &iter, const char *type, std::string_view detail="", int delta=0, int depth_delta=0) noexcept;
    +static inline void log_value(const value_iterator &iter, const char *type, std::string_view detail="", int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_start_value(const value_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_end_value(const value_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_error(const value_iterator &iter, const char *error, const char *detail="", int delta=-1, int depth_delta=0) noexcept;
    +
    +} // namespace logger
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_H
    +/* end file simdjson/generic/ondemand/logger.h for fallback */
    +/* including simdjson/generic/ondemand/token_iterator.h for fallback: #include "simdjson/generic/ondemand/token_iterator.h" */
    +/* begin file simdjson/generic/ondemand/token_iterator.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/logger.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +/**
    + * Iterates through JSON tokens (`{` `}` `[` `]` `,` `:` `""` `123` `true` `false` `null`)
    + * detected by stage 1.
    + *
    + * @private This is not intended for external use.
    + */
    +class token_iterator {
    +public:
    +  /**
    +   * Create a new invalid token_iterator.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline token_iterator() noexcept = default;
    +  simdjson_inline token_iterator(token_iterator &&other) noexcept = default;
    +  simdjson_inline token_iterator &operator=(token_iterator &&other) noexcept = default;
    +  simdjson_inline token_iterator(const token_iterator &other) noexcept = default;
    +  simdjson_inline token_iterator &operator=(const token_iterator &other) noexcept = default;
    +
    +  /**
    +   * Advance to the next token (returning the current one).
    +   */
    +  simdjson_inline const uint8_t *return_current_and_advance() noexcept;
    +  /**
    +   * Reports the current offset in bytes from the start of the underlying buffer.
    +   */
    +  simdjson_inline uint32_t current_offset() const noexcept;
    +  /**
    +   * Get the JSON text for a given token (relative).
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = current token,
    +   *              1 = next token, -1 = prev token.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek(int32_t delta=0) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for a given token.
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = current token,
    +   *              1 = next token, -1 = prev token.
    +   */
    +  simdjson_inline uint32_t peek_length(int32_t delta=0) const noexcept;
    +
    +  /**
    +   * Get the JSON text for a given token.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param position The position of the token.
    +   *
    +   */
    +  simdjson_inline const uint8_t *peek(token_position position) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for a given token.
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param position The position of the token.
    +   */
    +  simdjson_inline uint32_t peek_length(token_position position) const noexcept;
    +
    +  /**
    +   * Return the current index.
    +   */
    +  simdjson_inline token_position position() const noexcept;
    +  /**
    +   * Reset to a previously saved index.
    +   */
    +  simdjson_inline void set_position(token_position target_position) noexcept;
    +
    +  // NOTE: we don't support a full C++ iterator interface, because we expect people to make
    +  // different calls to advance the iterator based on *their own* state.
    +
    +  simdjson_inline bool operator==(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator!=(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator>(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator>=(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator<(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator<=(const token_iterator &other) const noexcept;
    +
    +protected:
    +  simdjson_inline token_iterator(const uint8_t *buf, token_position position) noexcept;
    +
    +  /**
    +   * Get the index of the JSON text for a given token (relative).
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = current token,
    +   *              1 = next token, -1 = prev token.
    +   */
    +  simdjson_inline uint32_t peek_index(int32_t delta=0) const noexcept;
    +  /**
    +   * Get the index of the JSON text for a given token.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param position The position of the token.
    +   *
    +   */
    +  simdjson_inline uint32_t peek_index(token_position position) const noexcept;
    +
    +  const uint8_t *buf{};
    +  token_position _position{};
    +
    +  friend class json_iterator;
    +  friend class value_iterator;
    +  friend class object;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, logger::log_level level, Args&&... args) noexcept;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, logger::log_level level, Args&&... args) noexcept;
    +};
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public fallback::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(fallback::ondemand::token_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline ~simdjson_result() noexcept = default; ///< @private
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H
    +/* end file simdjson/generic/ondemand/token_iterator.h for fallback */
    +/* including simdjson/generic/ondemand/json_iterator.h for fallback: #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* begin file simdjson/generic/ondemand/json_iterator.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/token_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +/**
    + * Iterates through JSON tokens, keeping track of depth and string buffer.
    + *
    + * @private This is not intended for external use.
    + */
    +class json_iterator {
    +protected:
    +  token_iterator token{};
    +  ondemand::parser *parser{};
    +  /**
    +   * Next free location in the string buffer.
    +   *
    +   * Used by raw_json_string::unescape() to have a place to unescape strings to.
    +   */
    +  uint8_t *_string_buf_loc{};
    +  /**
    +   * JSON error, if there is one.
    +   *
    +   * INCORRECT_TYPE and NO_SUCH_FIELD are *not* stored here, ever.
    +   *
    +   * PERF NOTE: we *hope* this will be elided into control flow, as it is only used (a) in the first
    +   * iteration of the loop, or (b) for the final iteration after a missing comma is found in ++. If
    +   * this is not elided, we should make sure it's at least not using up a register. Failing that,
    +   * we should store it in document so there's only one of them.
    +   */
    +  error_code error{SUCCESS};
    +  /**
    +   * Depth of the current token in the JSON.
    +   *
    +   * - 0 = finished with document
    +   * - 1 = document root value (could be [ or {, not yet known)
    +   * - 2 = , or } inside root array/object
    +   * - 3 = key or value inside root array/object.
    +   */
    +  depth_t _depth{};
    +  /**
    +   * Beginning of the document indexes.
    +   * Normally we have root == parser->implementation->structural_indexes.get()
    +   * but this may differ, especially in streaming mode (where we have several
    +   * documents);
    +   */
    +  token_position _root{};
    +  /**
    +   * Normally, a json_iterator operates over a single document, but in
    +   * some cases, we may have a stream of documents. This attribute is meant
    +   * as meta-data: the json_iterator works the same irrespective of the
    +   * value of this attribute.
    +   */
    +  bool _streaming{false};
    +
    +public:
    +  simdjson_inline json_iterator() noexcept = default;
    +  simdjson_inline json_iterator(json_iterator &&other) noexcept;
    +  simdjson_inline json_iterator &operator=(json_iterator &&other) noexcept;
    +  simdjson_inline explicit json_iterator(const json_iterator &other) noexcept = default;
    +  simdjson_inline json_iterator &operator=(const json_iterator &other) noexcept = default;
    +  /**
    +   * Skips a JSON value, whether it is a scalar, array or object.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code skip_child(depth_t parent_depth) noexcept;
    +
    +  /**
    +   * Tell whether the iterator is still at the start
    +   */
    +  simdjson_inline bool at_root() const noexcept;
    +
    +  /**
    +   * Tell whether we should be expected to run in streaming
    +   * mode (iterating over many documents). It is pure metadata
    +   * that does not affect how the iterator works. It is used by
    +   * start_root_array() and start_root_object().
    +   */
    +  simdjson_inline bool streaming() const noexcept;
    +
    +  /**
    +   * Get the root value iterator
    +   */
    +  simdjson_inline token_position root_position() const noexcept;
    +  /**
    +   * Assert that we are at the document depth (== 1)
    +   */
    +  simdjson_inline void assert_at_document_depth() const noexcept;
    +  /**
    +   * Assert that we are at the root of the document
    +   */
    +  simdjson_inline void assert_at_root() const noexcept;
    +
    +  /**
    +   * Tell whether the iterator is at the EOF mark
    +   */
    +  simdjson_inline bool at_end() const noexcept;
    +
    +  /**
    +   * Tell whether the iterator is live (has not been moved).
    +   */
    +  simdjson_inline bool is_alive() const noexcept;
    +
    +  /**
    +   * Abandon this iterator, setting depth to 0 (as if the document is finished).
    +   */
    +  simdjson_inline void abandon() noexcept;
    +
    +  /**
    +   * Advance the current token without modifying depth.
    +   */
    +  simdjson_inline const uint8_t *return_current_and_advance() noexcept;
    +
    +  /**
    +   * Returns true if there is a single token in the index (i.e., it is
    +   * a JSON with a scalar value such as a single number).
    +   *
    +   * @return whether there is a single token
    +   */
    +  simdjson_inline bool is_single_token() const noexcept;
    +
    +  /**
    +   * Assert that there are at least the given number of tokens left.
    +   *
    +   * Has no effect in release builds.
    +   */
    +  simdjson_inline void assert_more_tokens(uint32_t required_tokens=1) const noexcept;
    +  /**
    +   * Assert that the given position addresses an actual token (is within bounds).
    +   *
    +   * Has no effect in release builds.
    +   */
    +  simdjson_inline void assert_valid_position(token_position position) const noexcept;
    +  /**
    +   * Get the JSON text for a given token (relative).
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = next token, -1 = prev token.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek(int32_t delta=0) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for the current token (or relative).
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = next token, -1 = prev token.
    +   */
    +  simdjson_inline uint32_t peek_length(int32_t delta=0) const noexcept;
    +  /**
    +   * Get a pointer to the current location in the input buffer.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * You may be pointing outside of the input buffer: it is not generally
    +   * safe to dereference this pointer.
    +   */
    +  simdjson_inline const uint8_t *unsafe_pointer() const noexcept;
    +  /**
    +   * Get the JSON text for a given token.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param position The position of the token to retrieve.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek(token_position position) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for the current token (or relative).
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param position The position of the token to retrieve.
    +   */
    +  simdjson_inline uint32_t peek_length(token_position position) const noexcept;
    +  /**
    +   * Get the JSON text for the last token in the document.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek_last() const noexcept;
    +
    +  /**
    +   * Ascend one level.
    +   *
    +   * Validates that the depth - 1 == parent_depth.
    +   *
    +   * @param parent_depth the expected parent depth.
    +   */
    +  simdjson_inline void ascend_to(depth_t parent_depth) noexcept;
    +
    +  /**
    +   * Descend one level.
    +   *
    +   * Validates that the new depth == child_depth.
    +   *
    +   * @param child_depth the expected child depth.
    +   */
    +  simdjson_inline void descend_to(depth_t child_depth) noexcept;
    +  simdjson_inline void descend_to(depth_t child_depth, int32_t delta) noexcept;
    +
    +  /**
    +   * Get current depth.
    +   */
    +  simdjson_inline depth_t depth() const noexcept;
    +
    +  /**
    +   * Get current (writeable) location in the string buffer.
    +   */
    +  simdjson_inline uint8_t *&string_buf_loc() noexcept;
    +
    +  /**
    +   * Report an unrecoverable error, preventing further iteration.
    +   *
    +   * @param error The error to report. Must not be SUCCESS, UNINITIALIZED, INCORRECT_TYPE, or NO_SUCH_FIELD.
    +   * @param message An error message to report with the error.
    +   */
    +  simdjson_inline error_code report_error(error_code error, const char *message) noexcept;
    +
    +  /**
    +   * Log error, but don't stop iteration.
    +   * @param error The error to report. Must be INCORRECT_TYPE, or NO_SUCH_FIELD.
    +   * @param message An error message to report with the error.
    +   */
    +  simdjson_inline error_code optional_error(error_code error, const char *message) noexcept;
    +
    +  /**
    +   * Take an input in json containing max_len characters and attempt to copy it over to tmpbuf, a buffer with
    +   * N bytes of capacity. It will return false if N is too small (smaller than max_len) of if it is zero.
    +   * The buffer (tmpbuf) is padded with space characters.
    +   */
    +  simdjson_warn_unused simdjson_inline bool copy_to_buffer(const uint8_t *json, uint32_t max_len, uint8_t *tmpbuf, size_t N) noexcept;
    +
    +  simdjson_inline token_position position() const noexcept;
    +  /**
    +   * Write the raw_json_string to the string buffer and return a string_view.
    +   * Each raw_json_string should be unescaped once, or else the string buffer might
    +   * overflow.
    +   */
    +  simdjson_inline simdjson_result unescape(raw_json_string in, bool allow_replacement) noexcept;
    +  simdjson_inline simdjson_result unescape_wobbly(raw_json_string in) noexcept;
    +
    +  simdjson_inline void reenter_child(token_position position, depth_t child_depth) noexcept;
    +
    +  simdjson_inline error_code consume_character(char c) noexcept;
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  simdjson_inline token_position start_position(depth_t depth) const noexcept;
    +  simdjson_inline void set_start_position(depth_t depth, token_position position) noexcept;
    +#endif
    +
    +  /* Useful for debugging and logging purposes. */
    +  inline std::string to_string() const noexcept;
    +
    +  /**
    +   * Returns the current location in the document if in bounds.
    +   */
    +  inline simdjson_result current_location() const noexcept;
    +
    +  /**
    +   * Updates this json iterator so that it is back at the beginning of the document,
    +   * as if it had just been created.
    +   */
    +  inline void rewind() noexcept;
    +  /**
    +   * This checks whether the {,},[,] are balanced so that the document
    +   * ends with proper zero depth. This requires scanning the whole document
    +   * and it may be expensive. It is expected that it will be rarely called.
    +   * It does not attempt to match { with } and [ with ].
    +   */
    +  inline bool balanced() const noexcept;
    +protected:
    +  simdjson_inline json_iterator(const uint8_t *buf, ondemand::parser *parser) noexcept;
    +  /// The last token before the end
    +  simdjson_inline token_position last_position() const noexcept;
    +  /// The token *at* the end. This points at gibberish and should only be used for comparison.
    +  simdjson_inline token_position end_position() const noexcept;
    +  /// The end of the buffer.
    +  simdjson_inline token_position end() const noexcept;
    +
    +  friend class document;
    +  friend class document_stream;
    +  friend class object;
    +  friend class array;
    +  friend class value;
    +  friend class raw_json_string;
    +  friend class parser;
    +  friend class value_iterator;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, logger::log_level level, Args&&... args) noexcept;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, logger::log_level level, Args&&... args) noexcept;
    +}; // json_iterator
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public fallback::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(fallback::ondemand::json_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H
    +/* end file simdjson/generic/ondemand/json_iterator.h for fallback */
    +/* including simdjson/generic/ondemand/json_type.h for fallback: #include "simdjson/generic/ondemand/json_type.h" */
    +/* begin file simdjson/generic/ondemand/json_type.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/numberparsing.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +/**
    + * The type of a JSON value.
    + */
    +enum class json_type {
    +    // Start at 1 to catch uninitialized / default values more easily
    +    array=1, ///< A JSON array   ( [ 1, 2, 3 ... ] )
    +    object,  ///< A JSON object  ( { "a": 1, "b" 2, ... } )
    +    number,  ///< A JSON number  ( 1 or -2.3 or 4.5e6 ...)
    +    string,  ///< A JSON string  ( "a" or "hello world\n" ...)
    +    boolean, ///< A JSON boolean (true or false)
    +    null     ///< A JSON null    (null)
    +};
    +
    +/**
    + * A type representing a JSON number.
    + * The design of the struct is deliberately straight-forward. All
    + * functions return standard values with no error check.
    + */
    +struct number {
    +
    +  /**
    +   * return the automatically determined type of
    +   * the number: number_type::floating_point_number,
    +   * number_type::signed_integer or number_type::unsigned_integer.
    +   *
    +   *    enum class number_type {
    +   *        floating_point_number=1, /// a binary64 number
    +   *        signed_integer,          /// a signed integer that fits in a 64-bit word using two's complement
    +   *        unsigned_integer         /// a positive integer larger or equal to 1<<63
    +   *    };
    +   */
    +  simdjson_inline ondemand::number_type get_number_type() const noexcept;
    +  /**
    +   * return true if the automatically determined type of
    +   * the number is number_type::unsigned_integer.
    +   */
    +  simdjson_inline bool is_uint64() const noexcept;
    +  /**
    +   * return the value as a uint64_t, only valid if is_uint64() is true.
    +   */
    +  simdjson_inline uint64_t get_uint64() const noexcept;
    +  simdjson_inline operator uint64_t() const noexcept;
    +
    +  /**
    +   * return true if the automatically determined type of
    +   * the number is number_type::signed_integer.
    +   */
    +  simdjson_inline bool is_int64() const noexcept;
    +  /**
    +   * return the value as a int64_t, only valid if is_int64() is true.
    +   */
    +  simdjson_inline int64_t get_int64() const noexcept;
    +  simdjson_inline operator int64_t() const noexcept;
    +
    +
    +  /**
    +   * return true if the automatically determined type of
    +   * the number is number_type::floating_point_number.
    +   */
    +  simdjson_inline bool is_double() const noexcept;
    +  /**
    +   * return the value as a double, only valid if is_double() is true.
    +   */
    +  simdjson_inline double get_double() const noexcept;
    +  simdjson_inline operator double() const noexcept;
    +
    +  /**
    +   * Convert the number to a double. Though it always succeed, the conversion
    +   * may be lossy if the number cannot be represented exactly.
    +   */
    +  simdjson_inline double as_double() const noexcept;
    +
    +
    +protected:
    +  /**
    +   * The next block of declaration is designed so that we can call the number parsing
    +   * functions on a number type. They are protected and should never be used outside
    +   * of the core simdjson library.
    +   */
    +  friend class value_iterator;
    +  template
    +  friend error_code numberparsing::slow_float_parsing(simdjson_unused const uint8_t * src, W writer);
    +  template
    +  friend error_code numberparsing::write_float(const uint8_t *const src, bool negative, uint64_t i, const uint8_t * start_digits, size_t digit_count, int64_t exponent, W &writer);
    +  template
    +  friend error_code numberparsing::parse_number(const uint8_t *const src, W &writer);
    +  /** Store a signed 64-bit value to the number. */
    +  simdjson_inline void append_s64(int64_t value) noexcept;
    +  /** Store an unsigned 64-bit value to the number. */
    +  simdjson_inline void append_u64(uint64_t value) noexcept;
    +  /** Store a double value to the number. */
    +  simdjson_inline void append_double(double value) noexcept;
    +  /** Specifies that the value is a double, but leave it undefined. */
    +  simdjson_inline void skip_double() noexcept;
    +  /**
    +   * End of friend declarations.
    +   */
    +
    +  /**
    +   * Our attributes are a union type (size = 64 bits)
    +   * followed by a type indicator.
    +   */
    +  union {
    +    double floating_point_number;
    +    int64_t signed_integer;
    +    uint64_t unsigned_integer;
    +  } payload{0};
    +  number_type type{number_type::signed_integer};
    +};
    +
    +/**
    + * Write the JSON type to the output stream
    + *
    + * @param out The output stream.
    + * @param type The json_type.
    + */
    +inline std::ostream& operator<<(std::ostream& out, json_type type) noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +/**
    + * Send JSON type to an output stream.
    + *
    + * @param out The output stream.
    + * @param type The json_type.
    + * @throw simdjson_error if the result being printed has an error. If there is an error with the
    + *        underlying output stream, that error will be propagated (simdjson_error will not be
    + *        thrown).
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false);
    +#endif
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public fallback::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(fallback::ondemand::json_type &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline ~simdjson_result() noexcept = default; ///< @private
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H
    +/* end file simdjson/generic/ondemand/json_type.h for fallback */
    +/* including simdjson/generic/ondemand/raw_json_string.h for fallback: #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* begin file simdjson/generic/ondemand/raw_json_string.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +/**
    + * A string escaped per JSON rules, terminated with quote ("). They are used to represent
    + * unescaped keys inside JSON documents.
    + *
    + * (In other words, a pointer to the beginning of a string, just after the start quote, inside a
    + * JSON file.)
    + *
    + * This class is deliberately simplistic and has little functionality. You can
    + * compare a raw_json_string instance with an unescaped C string, but
    + * that is nearly all you can do.
    + *
    + * The raw_json_string is unescaped. If you wish to write an unescaped version of it to your own
    + * buffer, you may do so using the parser.unescape(string, buff) method, using an ondemand::parser
    + * instance. Doing so requires you to have a sufficiently large buffer.
    + *
    + * The raw_json_string instances originate typically from field instance which in turn represent
    + * key-value pairs from object instances. From a field instance, you get the raw_json_string
    + * instance by calling key(). You can, if you want a more usable string_view instance, call
    + * the unescaped_key() method on the field instance. You may also create a raw_json_string from
    + * any other string value, with the value.get_raw_json_string() method. Again, you can get
    + * a more usable string_view instance by calling get_string().
    + *
    + */
    +class raw_json_string {
    +public:
    +  /**
    +   * Create a new invalid raw_json_string.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline raw_json_string() noexcept = default;
    +
    +  /**
    +   * Create a new invalid raw_json_string pointed at the given location in the JSON.
    +   *
    +   * The given location must be just *after* the beginning quote (") in the JSON file.
    +   *
    +   * It *must* be terminated by a ", and be a valid JSON string.
    +   */
    +  simdjson_inline raw_json_string(const uint8_t * _buf) noexcept;
    +  /**
    +   * Get the raw pointer to the beginning of the string in the JSON (just after the ").
    +   *
    +   * It is possible for this function to return a null pointer if the instance
    +   * has outlived its existence.
    +   */
    +  simdjson_inline const char * raw() const noexcept;
    +
    +  /**
    +   * This compares the current instance to the std::string_view target: returns true if
    +   * they are byte-by-byte equal (no escaping is done) on target.size() characters,
    +   * and if the raw_json_string instance has a quote character at byte index target.size().
    +   * We never read more than length + 1 bytes in the raw_json_string instance.
    +   * If length is smaller than target.size(), this will return false.
    +   *
    +   * The std::string_view instance may contain any characters. However, the caller
    +   * is responsible for setting length so that length bytes may be read in the
    +   * raw_json_string.
    +   *
    +   * Performance: the comparison may be done using memcmp which may be efficient
    +   * for long strings.
    +   */
    +  simdjson_inline bool unsafe_is_equal(size_t length, std::string_view target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the std::string_view target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   * The std::string_view instance should not contain unescaped quote characters:
    +   * the caller is responsible for this check. See is_free_from_unescaped_quote.
    +   *
    +   * Performance: the comparison is done byte-by-byte which might be inefficient for
    +   * long strings.
    +   *
    +   * If target is a compile-time constant, and your compiler likes you,
    +   * you should be able to do the following without performance penalty...
    +   *
    +   *   static_assert(raw_json_string::is_free_from_unescaped_quote(target), "");
    +   *   s.unsafe_is_equal(target);
    +   */
    +  simdjson_inline bool unsafe_is_equal(std::string_view target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the C string target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   * The provided C string should not contain an unescaped quote character:
    +   * the caller is responsible for this check. See is_free_from_unescaped_quote.
    +   *
    +   * If target is a compile-time constant, and your compiler likes you,
    +   * you should be able to do the following without performance penalty...
    +   *
    +   *   static_assert(raw_json_string::is_free_from_unescaped_quote(target), "");
    +   *   s.unsafe_is_equal(target);
    +   */
    +  simdjson_inline bool unsafe_is_equal(const char* target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the std::string_view target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   */
    +  simdjson_inline bool is_equal(std::string_view target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the C string target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   */
    +  simdjson_inline bool is_equal(const char* target) const noexcept;
    +
    +  /**
    +   * Returns true if target is free from unescaped quote. If target is known at
    +   * compile-time, we might expect the computation to happen at compile time with
    +   * many compilers (not all!).
    +   */
    +  static simdjson_inline bool is_free_from_unescaped_quote(std::string_view target) noexcept;
    +  static simdjson_inline bool is_free_from_unescaped_quote(const char* target) noexcept;
    +
    +private:
    +
    +
    +  /**
    +   * This will set the inner pointer to zero, effectively making
    +   * this instance unusable.
    +   */
    +  simdjson_inline void consume() noexcept { buf = nullptr; }
    +
    +  /**
    +   * Checks whether the inner pointer is non-null and thus usable.
    +   */
    +  simdjson_inline simdjson_warn_unused bool alive() const noexcept { return buf != nullptr; }
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc.
    +   * The result will be a valid UTF-8.
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid until the next parse() call on the parser.
    +   *
    +   * @param iter A json_iterator, which contains a buffer where the string will be written.
    +   * @param allow_replacement Whether we allow replacement of invalid surrogate pairs.
    +   */
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape(json_iterator &iter, bool allow_replacement) const noexcept;
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc.
    +   * The result may not be a valid UTF-8. https://simonsapin.github.io/wtf-8/
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid until the next parse() call on the parser.
    +   *
    +   * @param iter A json_iterator, which contains a buffer where the string will be written.
    +   */
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape_wobbly(json_iterator &iter) const noexcept;
    +  const uint8_t * buf{};
    +  friend class object;
    +  friend class field;
    +  friend class parser;
    +  friend struct simdjson_result;
    +};
    +
    +simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &, const raw_json_string &) noexcept;
    +
    +/**
    + * Comparisons between raw_json_string and std::string_view instances are potentially unsafe: the user is responsible
    + * for providing a string with no unescaped quote. Note that unescaped quotes cannot be present in valid JSON strings.
    + */
    +simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept;
    +simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept;
    +simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept;
    +simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept;
    +
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public fallback::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(fallback::ondemand::raw_json_string &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline ~simdjson_result() noexcept = default; ///< @private
    +
    +  simdjson_inline simdjson_result raw() const noexcept;
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape(fallback::ondemand::json_iterator &iter, bool allow_replacement) const noexcept;
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape_wobbly(fallback::ondemand::json_iterator &iter) const noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H
    +/* end file simdjson/generic/ondemand/raw_json_string.h for fallback */
    +/* including simdjson/generic/ondemand/parser.h for fallback: #include "simdjson/generic/ondemand/parser.h" */
    +/* begin file simdjson/generic/ondemand/parser.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_PARSER_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +/**
    + * The default batch size for document_stream instances for this On Demand kernel.
    + * Note that different On Demand kernel may use a different DEFAULT_BATCH_SIZE value
    + * in the future.
    + */
    +static constexpr size_t DEFAULT_BATCH_SIZE = 1000000;
    +/**
    + * Some adversary might try to set the batch size to 0 or 1, which might cause problems.
    + * We set a minimum of 32B since anything else is highly likely to be an error. In practice,
    + * most users will want a much larger batch size.
    + *
    + * All non-negative MINIMAL_BATCH_SIZE values should be 'safe' except that, obviously, no JSON
    + * document can ever span 0 or 1 byte and that very large values would create memory allocation issues.
    + */
    +static constexpr size_t MINIMAL_BATCH_SIZE = 32;
    +
    +/**
    + * A JSON fragment iterator.
    + *
    + * This holds the actual iterator as well as the buffer for writing strings.
    + */
    +class parser {
    +public:
    +  /**
    +   * Create a JSON parser.
    +   *
    +   * The new parser will have zero capacity.
    +   */
    +  inline explicit parser(size_t max_capacity = SIMDJSON_MAXSIZE_BYTES) noexcept;
    +
    +  inline parser(parser &&other) noexcept = default;
    +  simdjson_inline parser(const parser &other) = delete;
    +  simdjson_inline parser &operator=(const parser &other) = delete;
    +  simdjson_inline parser &operator=(parser &&other) noexcept = default;
    +
    +  /** Deallocate the JSON parser. */
    +  inline ~parser() noexcept = default;
    +
    +  /**
    +   * Start iterating an on-demand JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   document doc = parser.iterate(json);
    +   *
    +   * It is expected that the content is a valid UTF-8 file, containing a valid JSON document.
    +   * Otherwise the iterate method may return an error. In particular, the whole input should be
    +   * valid: we do not attempt to tolerate incorrect content either before or after a JSON
    +   * document. If there is a UTF-8 BOM, the parser skips it.
    +   *
    +   * ### IMPORTANT: Validate what you use
    +   *
    +   * Calling iterate on an invalid JSON document may not immediately trigger an error. The call to
    +   * iterate does not parse and validate the whole document.
    +   *
    +   * ### IMPORTANT: Buffer Lifetime
    +   *
    +   * Because parsing is done while you iterate, you *must* keep the JSON buffer around at least as
    +   * long as the document iteration.
    +   *
    +   * ### IMPORTANT: Document Lifetime
    +   *
    +   * Only one iteration at a time can happen per parser, and the parser *must* be kept alive during
    +   * iteration to ensure intermediate buffers can be accessed. Any document must be destroyed before
    +   * you call parse() again or destroy the parser.
    +   *
    +   * ### REQUIRED: Buffer Padding
    +   *
    +   * The buffer must have at least SIMDJSON_PADDING extra allocated bytes. It does not matter what
    +   * those bytes are initialized to, as long as they are allocated. These bytes will be read: if you
    +   * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the
    +   * SIMDJSON_PADDING bytes to avoid runtime warnings.
    +   *
    +   * @param json The JSON to parse.
    +   * @param len The length of the JSON.
    +   * @param capacity The number of bytes allocated in the JSON (must be at least len+SIMDJSON_PADDING).
    +   *
    +   * @return The document, or an error:
    +   *         - INSUFFICIENT_PADDING if the input has less than SIMDJSON_PADDING extra bytes.
    +   *         - MEMALLOC if realloc_if_needed the parser does not have enough capacity, and memory
    +   *           allocation fails.
    +   *         - EMPTY if the document is all whitespace.
    +   *         - UTF8_ERROR if the document is not valid UTF-8.
    +   *         - UNESCAPED_CHARS if a string contains control characters that must be escaped
    +   *         - UNCLOSED_STRING if there is an unclosed string in the document.
    +   */
    +  simdjson_warn_unused simdjson_result iterate(padded_string_view json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const char *json, size_t len, size_t capacity) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const uint8_t *json, size_t len, size_t capacity) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(std::string_view json, size_t capacity) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const std::string &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(std::string &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(padded_string &&json) & noexcept = delete;
    +
    +  /**
    +   * @private
    +   *
    +   * Start iterating an on-demand JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   json_iterator doc = parser.iterate(json);
    +   *
    +   * ### IMPORTANT: Buffer Lifetime
    +   *
    +   * Because parsing is done while you iterate, you *must* keep the JSON buffer around at least as
    +   * long as the document iteration.
    +   *
    +   * ### IMPORTANT: Document Lifetime
    +   *
    +   * Only one iteration at a time can happen per parser, and the parser *must* be kept alive during
    +   * iteration to ensure intermediate buffers can be accessed. Any document must be destroyed before
    +   * you call parse() again or destroy the parser.
    +   *
    +   * The ondemand::document instance holds the iterator. The document must remain in scope
    +   * while you are accessing instances of ondemand::value, ondemand::object, ondemand::array.
    +   *
    +   * ### REQUIRED: Buffer Padding
    +   *
    +   * The buffer must have at least SIMDJSON_PADDING extra allocated bytes. It does not matter what
    +   * those bytes are initialized to, as long as they are allocated. These bytes will be read: if you
    +   * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the
    +   * SIMDJSON_PADDING bytes to avoid runtime warnings.
    +   *
    +   * @param json The JSON to parse.
    +   *
    +   * @return The iterator, or an error:
    +   *         - INSUFFICIENT_PADDING if the input has less than SIMDJSON_PADDING extra bytes.
    +   *         - MEMALLOC if realloc_if_needed the parser does not have enough capacity, and memory
    +   *           allocation fails.
    +   *         - EMPTY if the document is all whitespace.
    +   *         - UTF8_ERROR if the document is not valid UTF-8.
    +   *         - UNESCAPED_CHARS if a string contains control characters that must be escaped
    +   *         - UNCLOSED_STRING if there is an unclosed string in the document.
    +   */
    +  simdjson_warn_unused simdjson_result iterate_raw(padded_string_view json) & noexcept;
    +
    +
    +  /**
    +   * Parse a buffer containing many JSON documents.
    +   *
    +   *   auto json = R"({ "foo": 1 } { "foo": 2 } { "foo": 3 } )"_padded;
    +   *   ondemand::parser parser;
    +   *   ondemand::document_stream docs = parser.iterate_many(json);
    +   *   for (auto & doc : docs) {
    +   *     std::cout << doc["foo"] << std::endl;
    +   *   }
    +   *   // Prints 1 2 3
    +   *
    +   * No copy of the input buffer is made.
    +   *
    +   * The function is lazy: it may be that no more than one JSON document at a time is parsed.
    +   *
    +   * The caller is responsabile to ensure that the input string data remains unchanged and is
    +   * not deleted during the loop.
    +   *
    +   * ### Format
    +   *
    +   * The buffer must contain a series of one or more JSON documents, concatenated into a single
    +   * buffer, separated by ASCII whitespace. It effectively parses until it has a fully valid document,
    +   * then starts parsing the next document at that point. (It does this with more parallelism and
    +   * lookahead than you might think, though.)
    +   *
    +   * documents that consist of an object or array may omit the whitespace between them, concatenating
    +   * with no separator. Documents that consist of a single primitive (i.e. documents that are not
    +   * arrays or objects) MUST be separated with ASCII whitespace.
    +   *
    +   * The characters inside a JSON document, and between JSON documents, must be valid Unicode (UTF-8).
    +   * If there is a UTF-8 BOM, the parser skips it.
    +   *
    +   * The documents must not exceed batch_size bytes (by default 1MB) or they will fail to parse.
    +   * Setting batch_size to excessively large or excessively small values may impact negatively the
    +   * performance.
    +   *
    +   * ### REQUIRED: Buffer Padding
    +   *
    +   * The buffer must have at least SIMDJSON_PADDING extra allocated bytes. It does not matter what
    +   * those bytes are initialized to, as long as they are allocated. These bytes will be read: if you
    +   * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the
    +   * SIMDJSON_PADDING bytes to avoid runtime warnings.
    +   *
    +   * ### Threads
    +   *
    +   * When compiled with SIMDJSON_THREADS_ENABLED, this method will use a single thread under the
    +   * hood to do some lookahead.
    +   *
    +   * ### Parser Capacity
    +   *
    +   * If the parser's current capacity is less than batch_size, it will allocate enough capacity
    +   * to handle it (up to max_capacity).
    +   *
    +   * @param buf The concatenated JSON to parse.
    +   * @param len The length of the concatenated JSON.
    +   * @param batch_size The batch size to use. MUST be larger than the largest document. The sweet
    +   *                   spot is cache-related: small enough to fit in cache, yet big enough to
    +   *                   parse as many documents as possible in one tight loop.
    +   *                   Defaults to 10MB, which has been a reasonable sweet spot in our tests.
    +   * @param allow_comma_separated (defaults on false) This allows a mode where the documents are
    +   *                   separated by commas instead of whitespace. It comes with a performance
    +   *                   penalty because the entire document is indexed at once (and the document must be
    +   *                   less than 4 GB), and there is no multithreading. In this mode, the batch_size parameter
    +   *                   is effectively ignored, as it is set to at least the document size.
    +   * @return The stream, or an error. An empty input will yield 0 documents rather than an EMPTY error. Errors:
    +   *         - MEMALLOC if the parser does not have enough capacity and memory allocation fails
    +   *         - CAPACITY if the parser does not have enough capacity and batch_size > max_capacity.
    +   *         - other json errors if parsing fails. You should not rely on these errors to always the same for the
    +   *           same document: they may vary under runtime dispatch (so they may vary depending on your system and hardware).
    +   */
    +  inline simdjson_result iterate_many(const uint8_t *buf, size_t len, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */
    +  inline simdjson_result iterate_many(const char *buf, size_t len, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */
    +  inline simdjson_result iterate_many(const std::string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  inline simdjson_result iterate_many(const std::string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe
    +  /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */
    +  inline simdjson_result iterate_many(const padded_string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  inline simdjson_result iterate_many(const padded_string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe
    +
    +  /** @private We do not want to allow implicit conversion from C string to std::string. */
    +  simdjson_result iterate_many(const char *buf, size_t batch_size = DEFAULT_BATCH_SIZE) noexcept = delete;
    +
    +  /** The capacity of this parser (the largest document it can process). */
    +  simdjson_inline size_t capacity() const noexcept;
    +  /** The maximum capacity of this parser (the largest document it is allowed to process). */
    +  simdjson_inline size_t max_capacity() const noexcept;
    +  simdjson_inline void set_max_capacity(size_t max_capacity) noexcept;
    +  /**
    +   * The maximum depth of this parser (the most deeply nested objects and arrays it can process).
    +   * This parameter is only relevant when the macro SIMDJSON_DEVELOPMENT_CHECKS is set to true.
    +   * The document's instance current_depth() method should be used to monitor the parsing
    +   * depth and limit it if desired.
    +   */
    +  simdjson_inline size_t max_depth() const noexcept;
    +
    +  /**
    +   * Ensure this parser has enough memory to process JSON documents up to `capacity` bytes in length
    +   * and `max_depth` depth.
    +   *
    +   * The max_depth parameter is only relevant when the macro SIMDJSON_DEVELOPMENT_CHECKS is set to true.
    +   * The document's instance current_depth() method should be used to monitor the parsing
    +   * depth and limit it if desired.
    +   *
    +   * @param capacity The new capacity.
    +   * @param max_depth The new max_depth. Defaults to DEFAULT_MAX_DEPTH.
    +   * @return The error, if there is one.
    +   */
    +  simdjson_warn_unused error_code allocate(size_t capacity, size_t max_depth=DEFAULT_MAX_DEPTH) noexcept;
    +
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  /**
    +   * The parser instance can use threads when they are available to speed up some
    +   * operations. It is enabled by default. Changing this attribute will change the
    +   * behavior of the parser for future operations.
    +   */
    +  bool threaded{true};
    +  #endif
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc. to a user-provided buffer.
    +   * The result must be valid UTF-8.
    +   * The provided pointer is advanced to the end of the string by reference, and a string_view instance
    +   * is returned. You can ensure that your buffer is large enough by allocating a block of memory at least
    +   * as large as the input JSON plus SIMDJSON_PADDING and then unescape all strings to this one buffer.
    +   *
    +   * This unescape function is a low-level function. If you want a more user-friendly approach, you should
    +   * avoid raw_json_string instances (e.g., by calling unescaped_key() instead of key() or get_string()
    +   * instead of get_raw_json_string()).
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid as long as the bytes in dst.
    +   *
    +   * @param raw_json_string input
    +   * @param dst A pointer to a buffer at least large enough to write this string as well as
    +   *            an additional SIMDJSON_PADDING bytes.
    +   * @param allow_replacement Whether we allow a replacement if the input string contains unmatched surrogate pairs.
    +   * @return A string_view pointing at the unescaped string in dst
    +   * @error STRING_ERROR if escapes are incorrect.
    +   */
    +  simdjson_inline simdjson_result unescape(raw_json_string in, uint8_t *&dst, bool allow_replacement = false) const noexcept;
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc. to a user-provided buffer.
    +   * The result may not be valid UTF-8. See https://simonsapin.github.io/wtf-8/
    +   * The provided pointer is advanced to the end of the string by reference, and a string_view instance
    +   * is returned. You can ensure that your buffer is large enough by allocating a block of memory at least
    +   * as large as the input JSON plus SIMDJSON_PADDING and then unescape all strings to this one buffer.
    +   *
    +   * This unescape function is a low-level function. If you want a more user-friendly approach, you should
    +   * avoid raw_json_string instances (e.g., by calling unescaped_key() instead of key() or get_string()
    +   * instead of get_raw_json_string()).
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid as long as the bytes in dst.
    +   *
    +   * @param raw_json_string input
    +   * @param dst A pointer to a buffer at least large enough to write this string as well as
    +   *            an additional SIMDJSON_PADDING bytes.
    +   * @return A string_view pointing at the unescaped string in dst
    +   * @error STRING_ERROR if escapes are incorrect.
    +   */
    +  simdjson_inline simdjson_result unescape_wobbly(raw_json_string in, uint8_t *&dst) const noexcept;
    +
    +private:
    +  /** @private [for benchmarking access] The implementation to use */
    +  std::unique_ptr implementation{};
    +  size_t _capacity{0};
    +  size_t _max_capacity;
    +  size_t _max_depth{DEFAULT_MAX_DEPTH};
    +  std::unique_ptr string_buf{};
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  std::unique_ptr start_positions{};
    +#endif
    +
    +  friend class json_iterator;
    +  friend class document_stream;
    +};
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public fallback::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(fallback::ondemand::parser &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_H
    +/* end file simdjson/generic/ondemand/parser.h for fallback */
    +
    +// All other declarations
    +/* including simdjson/generic/ondemand/array.h for fallback: #include "simdjson/generic/ondemand/array.h" */
    +/* begin file simdjson/generic/ondemand/array.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +/**
    + * A forward-only JSON array.
    + */
    +class array {
    +public:
    +  /**
    +   * Create a new invalid array.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline array() noexcept = default;
    +
    +  /**
    +   * Begin array iteration.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result begin() noexcept;
    +  /**
    +   * Sentinel representing the end of the array.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result end() noexcept;
    +  /**
    +   * This method scans the array and counts the number of elements.
    +   * The count_elements method should always be called before you have begun
    +   * iterating through the array: it is expected that you are pointing at
    +   * the beginning of the array.
    +   * The runtime complexity is linear in the size of the array. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an array is empty, it is more performant to use
    +   * the is_empty() method.
    +   */
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  /**
    +   * This method scans the beginning of the array and checks whether the
    +   * array is empty.
    +   * The runtime complexity is constant time. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   */
    +  simdjson_inline simdjson_result is_empty() & noexcept;
    +  /**
    +   * Reset the iterator so that we are pointing back at the
    +   * beginning of the array. You should still consume values only once even if you
    +   * can iterate through the array more than once. If you unescape a string
    +   * within the array more than once, you have unsafe code. Note that rewinding
    +   * an array means that you may need to reparse it anew: it is not a free
    +   * operation.
    +   *
    +   * @returns true if the array contains some elements (not empty)
    +   */
    +  inline simdjson_result reset() & noexcept;
    +  /**
    +   * Get the value associated with the given JSON pointer.  We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard, interpreting the current node
    +   * as the root of its own JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"([ { "foo": { "a": [ 10, 20, 30 ] }} ])"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/0/foo/a/1") == 20
    +   *
    +   * Note that at_pointer() called on the document automatically calls the document's rewind
    +   * method between each call. It invalidates all previously accessed arrays, objects and values
    +   * that have not been consumed. Yet it is not the case when calling at_pointer on an array
    +   * instance: there is no rewind and no invalidation.
    +   *
    +   * You may only call at_pointer on an array after it has been created, but before it has
    +   * been first accessed. When calling at_pointer on an array, the pointer is advanced to
    +   * the location indicated by the JSON pointer (in case of success). It is no longer possible
    +   * to call at_pointer on the same array.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching.
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   */
    +  inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  /**
    +   * Consumes the array and returns a string_view instance corresponding to the
    +   * array as represented in JSON. It points inside the original document.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +  /**
    +   * Get the value at the given index. This function has linear-time complexity.
    +   * This function should only be called once on an array instance since the array iterator is not reset between each call.
    +   *
    +   * @return The value at the given index, or:
    +   *         - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
    +   */
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +protected:
    +  /**
    +   * Go to the end of the array, no matter where you are right now.
    +   */
    +  simdjson_inline error_code consume() noexcept;
    +
    +  /**
    +   * Begin array iteration.
    +   *
    +   * @param iter The iterator. Must be where the initial [ is expected. Will be *moved* into the
    +   *        resulting array.
    +   * @error INCORRECT_TYPE if the iterator is not at [.
    +   */
    +  static simdjson_inline simdjson_result start(value_iterator &iter) noexcept;
    +  /**
    +   * Begin array iteration from the root.
    +   *
    +   * @param iter The iterator. Must be where the initial [ is expected. Will be *moved* into the
    +   *        resulting array.
    +   * @error INCORRECT_TYPE if the iterator is not at [.
    +   * @error TAPE_ERROR if there is no closing ] at the end of the document.
    +   */
    +  static simdjson_inline simdjson_result start_root(value_iterator &iter) noexcept;
    +  /**
    +   * Begin array iteration.
    +   *
    +   * This version of the method should be called after the initial [ has been verified, and is
    +   * intended for use by switch statements that check the type of a value.
    +   *
    +   * @param iter The iterator. Must be after the initial [. Will be *moved* into the resulting array.
    +   */
    +  static simdjson_inline simdjson_result started(value_iterator &iter) noexcept;
    +
    +  /**
    +   * Create an array at the given Internal array creation. Call array::start() or array::started() instead of this.
    +   *
    +   * @param iter The iterator. Must either be at the start of the first element with iter.is_alive()
    +   *        == true, or past the [] with is_alive() == false if the array is empty. Will be *moved*
    +   *        into the resulting array.
    +   */
    +  simdjson_inline array(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Iterator marking current position.
    +   *
    +   * iter.is_alive() == false indicates iteration is complete.
    +   */
    +  value_iterator iter{};
    +
    +  friend class value;
    +  friend class document;
    +  friend struct simdjson_result;
    +  friend struct simdjson_result;
    +  friend class array_iterator;
    +};
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public fallback::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(fallback::ondemand::array &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result begin() noexcept;
    +  simdjson_inline simdjson_result end() noexcept;
    +  inline simdjson_result count_elements() & noexcept;
    +  inline simdjson_result is_empty() & noexcept;
    +  inline simdjson_result reset() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_H
    +/* end file simdjson/generic/ondemand/array.h for fallback */
    +/* including simdjson/generic/ondemand/array_iterator.h for fallback: #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* begin file simdjson/generic/ondemand/array_iterator.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +/**
    + * A forward-only JSON array.
    + *
    + * This is an input_iterator, meaning:
    + * - It is forward-only
    + * - * must be called exactly once per element.
    + * - ++ must be called exactly once in between each * (*, ++, *, ++, * ...)
    + */
    +class array_iterator {
    +public:
    +  /** Create a new, invalid array iterator. */
    +  simdjson_inline array_iterator() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  /**
    +   * Get the current element.
    +   *
    +   * Part of the std::iterator interface.
    +   */
    +  simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  /**
    +   * Check if we are at the end of the JSON.
    +   *
    +   * Part of the std::iterator interface.
    +   *
    +   * @return true if there are no more elements in the JSON array.
    +   */
    +  simdjson_inline bool operator==(const array_iterator &) const noexcept;
    +  /**
    +   * Check if there are more elements in the JSON array.
    +   *
    +   * Part of the std::iterator interface.
    +   *
    +   * @return true if there are more elements in the JSON array.
    +   */
    +  simdjson_inline bool operator!=(const array_iterator &) const noexcept;
    +  /**
    +   * Move to the next element.
    +   *
    +   * Part of the std::iterator interface.
    +   */
    +  simdjson_inline array_iterator &operator++() noexcept;
    +
    +private:
    +  value_iterator iter{};
    +
    +  simdjson_inline array_iterator(const value_iterator &iter) noexcept;
    +
    +  friend class array;
    +  friend class value;
    +  friend struct simdjson_result;
    +};
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public fallback::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(fallback::ondemand::array_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  simdjson_inline bool operator==(const simdjson_result &) const noexcept;
    +  simdjson_inline bool operator!=(const simdjson_result &) const noexcept;
    +  simdjson_inline simdjson_result &operator++() noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H
    +/* end file simdjson/generic/ondemand/array_iterator.h for fallback */
    +/* including simdjson/generic/ondemand/document.h for fallback: #include "simdjson/generic/ondemand/document.h" */
    +/* begin file simdjson/generic/ondemand/document.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +/**
    + * A JSON document. It holds a json_iterator instance.
    + *
    + * Used by tokens to get text, and string buffer location.
    + *
    + * You must keep the document around during iteration.
    + */
    +class document {
    +public:
    +  /**
    +   * Create a new invalid document.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline document() noexcept = default;
    +  simdjson_inline document(const document &other) noexcept = delete; // pass your documents by reference, not by copy
    +  simdjson_inline document(document &&other) noexcept = default;
    +  simdjson_inline document &operator=(const document &other) noexcept = delete;
    +  simdjson_inline document &operator=(document &&other) noexcept = default;
    +
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @returns INCORRECT_TYPE If the JSON value is not an array.
    +   */
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   */
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  /**
    +   * Cast this JSON value (inside string) to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  /**
    +   * Cast this JSON value (inside string) to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a double.
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Important: Calling get_string() twice on the same document is an error.
    +   *
    +   * @param Whether to allow a replacement character for unmatched surrogate pairs.
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  /**
    +   * Attempts to fill the provided std::string reference with the parsed value of the current string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Important: a value should be consumed once. Calling get_string() twice on the same value
    +   * is an error.
    +   *
    +   * Performance: This method may be slower than get_string() or get_string(bool) because it may need to allocate memory.
    +   * We recommend you avoid allocating an std::string unless you need to.
    +   *
    +   * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS.
    +   */
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is not guaranteed to be valid UTF-8. See https://simonsapin.github.io/wtf-8/
    +   *
    +   * Important: Calling get_wobbly_string() twice on the same document is an error.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @returns INCORRECT_TYPE if the JSON value is not true or false.
    +   */
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  /**
    +   * Cast this JSON value to a value when the document is an object or an array.
    +   *
    +   * You must not have begun iterating through the object or array. When
    +   * SIMDJSON_DEVELOPMENT_CHECKS is set to 1 (which is the case when building in Debug mode
    +   * by default), and you have already begun iterating,
    +   * you will get an OUT_OF_ORDER_ITERATION error. If you have begun iterating, you can use
    +   * rewind() to reset the document to its initial state before calling this method.
    +   *
    +   * @returns A value if a JSON array or object cannot be found.
    +   * @returns SCALAR_DOCUMENT_AS_VALUE error is the document is a scalar (see is_scalar() function).
    +   */
    +  simdjson_inline simdjson_result get_value() noexcept;
    +
    +  /**
    +   * Checks if this JSON value is null.  If and only if the value is
    +   * null, then it is consumed (we advance). If we find a token that
    +   * begins with 'n' but is not 'null', then an error is returned.
    +   *
    +   * @returns Whether the value is null.
    +   * @returns INCORRECT_TYPE If the JSON value begins with 'n' and is not 'null'.
    +   */
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool
    +   *
    +   * You may use get_double(), get_bool(), get_uint64(), get_int64(),
    +   * get_object(), get_array(), get_raw_json_string(), or get_string() instead.
    +   *
    +   * @returns A value of the given type, parsed from the JSON.
    +   * @returns INCORRECT_TYPE If the JSON value is not the given type.
    +   */
    +  template simdjson_inline simdjson_result get() & noexcept {
    +    // Unless the simdjson library provides an inline implementation, calling this method should
    +    // immediately fail.
    +    static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. "
    +      "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
    +      "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), "
    +      " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template.");
    +  }
    +  /** @overload template simdjson_result get() & noexcept */
    +  template simdjson_inline simdjson_result get() && noexcept {
    +    // Unless the simdjson library provides an inline implementation, calling this method should
    +    // immediately fail.
    +    static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. "
    +      "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
    +      "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), "
    +      " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template.");
    +  }
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool, value
    +   *
    +   * Be mindful that the document instance must remain in scope while you are accessing object, array and value instances.
    +   *
    +   * @param out This is set to a value of the given type, parsed from the JSON. If there is an error, this may not be initialized.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   * @returns SUCCESS If the parse succeeded and the out parameter was set to the value.
    +   */
    +  template simdjson_inline error_code get(T &out) & noexcept;
    +  /** @overload template error_code get(T &out) & noexcept */
    +  template simdjson_inline error_code get(T &out) && noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an array.
    +   */
    +  simdjson_inline operator array() & noexcept(false);
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an object.
    +   */
    +  simdjson_inline operator object() & noexcept(false);
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline operator int64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline operator double() noexcept(false);
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator raw_json_string() noexcept(false);
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not true or false.
    +   */
    +  simdjson_inline operator bool() noexcept(false);
    +  /**
    +   * Cast this JSON value to a value when the document is an object or an array.
    +   *
    +   * You must not have begun iterating through the object or array. When
    +   * SIMDJSON_DEVELOPMENT_CHECKS is defined, and you have already begun iterating,
    +   * you will get an OUT_OF_ORDER_ITERATION error. If you have begun iterating, you can use
    +   * rewind() to reset the document to its initial state before calling this method.
    +   *
    +   * @returns A value value if a JSON array or object cannot be found.
    +   * @exception SCALAR_DOCUMENT_AS_VALUE error is the document is a scalar (see is_scalar() function).
    +   */
    +  simdjson_inline operator value() noexcept(false);
    +#endif
    +  /**
    +   * This method scans the array and counts the number of elements.
    +   * The count_elements method should always be called before you have begun
    +   * iterating through the array: it is expected that you are pointing at
    +   * the beginning of the array.
    +   * The runtime complexity is linear in the size of the array. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   */
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +   /**
    +   * This method scans the object and counts the number of key-value pairs.
    +   * The count_fields method should always be called before you have begun
    +   * iterating through the object: it is expected that you are pointing at
    +   * the beginning of the object.
    +   * The runtime complexity is linear in the size of the object. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an object is empty, it is more performant to use
    +   * the is_empty() method.
    +   */
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  /**
    +   * Get the value at the given index in the array. This function has linear-time complexity.
    +   * This function should only be called once on an array instance since the array iterator is not reset between each call.
    +   *
    +   * @return The value at the given index, or:
    +   *         - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
    +   */
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  /**
    +   * Begin array iteration.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  /**
    +   * Sentinel representing the end of the array.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result end() & noexcept;
    +
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   *
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. E.g., the array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to
    +   * a key a single time. Doing object["mykey"].to_string()and then again object["mykey"].to_string()
    +   * is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. E.g., the array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to a key
    +   * a single time. Doing object["mykey"].to_string() and then again object["mykey"].to_string()
    +   * is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +
    +  /**
    +   * Get the type of this JSON value. It does not validate or consume the value.
    +   * E.g., you must still call "is_null()" to check that a value is null even if
    +   * "type()" returns json_type::null.
    +   *
    +   * NOTE: If you're only expecting a value to be one type (a typical case), it's generally
    +   * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just
    +   * let it throw an exception).
    +   *
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result type() noexcept;
    +
    +  /**
    +   * Checks whether the document is a scalar (string, number, null, Boolean).
    +   * Returns false when there it is an array or object.
    +   *
    +   * @returns true if the type is string, number, null, Boolean
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +
    +  /**
    +   * Checks whether the document is a negative number.
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline bool is_negative() noexcept;
    +  /**
    +   * Checks whether the document is an integer number. Note that
    +   * this requires to partially parse the number string. If
    +   * the value is determined to be an integer, it may still
    +   * not parse properly as an integer in subsequent steps
    +   * (e.g., it might overflow).
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  /**
    +   * Determine the number type (integer or floating-point number) as quickly
    +   * as possible. This function does not fully validate the input. It is
    +   * useful when you only need to classify the numbers, without parsing them.
    +   *
    +   * If you are planning to retrieve the value or you need full validation,
    +   * consider using the get_number() method instead: it will fully parse
    +   * and validate the input, and give you access to the type:
    +   * get_number().get_number_type().
    +   *
    +   * get_number_type() is number_type::unsigned_integer if we have
    +   * an integer greater or equal to 9223372036854775808
    +   * get_number_type() is number_type::signed_integer if we have an
    +   * integer that is less than 9223372036854775808
    +   * Otherwise, get_number_type() has value number_type::floating_point_number
    +   *
    +   * This function requires processing the number string, but it is expected
    +   * to be faster than get_number().get_number_type() because it is does not
    +   * parse the number value.
    +   *
    +   * @returns the type of the number
    +   */
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +
    +  /**
    +   * Attempt to parse an ondemand::number. An ondemand::number may
    +   * contain an integer value or a floating-point value, the simdjson
    +   * library will autodetect the type. Thus it is a dynamically typed
    +   * number. Before accessing the value, you must determine the detected
    +   * type.
    +   *
    +   * number.get_number_type() is number_type::signed_integer if we have
    +   * an integer in [-9223372036854775808,9223372036854775808)
    +   * You can recover the value by calling number.get_int64() and you
    +   * have that number.is_int64() is true.
    +   *
    +   * number.get_number_type() is number_type::unsigned_integer if we have
    +   * an integer in [9223372036854775808,18446744073709551616)
    +   * You can recover the value by calling number.get_uint64() and you
    +   * have that number.is_uint64() is true.
    +   *
    +   * Otherwise, number.get_number_type() has value number_type::floating_point_number
    +   * and we have a binary64 number.
    +   * You can recover the value by calling number.get_double() and you
    +   * have that number.is_double() is true.
    +   *
    +   * You must check the type before accessing the value: it is an error
    +   * to call "get_int64()" when number.get_number_type() is not
    +   * number_type::signed_integer and when number.is_int64() is false.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept;
    +
    +  /**
    +   * Get the raw JSON for this token.
    +   *
    +   * The string_view will always point into the input buffer.
    +   *
    +   * The string_view will start at the beginning of the token, and include the entire token
    +   * *as well as all spaces until the next token (or EOF).* This means, for example, that a
    +   * string token always begins with a " and is always terminated by the final ", possibly
    +   * followed by a number of spaces.
    +   *
    +   * The string_view is *not* null-terminated. If this is a scalar (string, number,
    +   * boolean, or null), the character after the end of the string_view may be the padded buffer.
    +   *
    +   * Tokens include:
    +   * - {
    +   * - [
    +   * - "a string (possibly with UTF-8 or backslashed characters like \\\")".
    +   * - -1.2e-100
    +   * - true
    +   * - false
    +   * - null
    +   */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +
    +  /**
    +   * Reset the iterator inside the document instance so we are pointing back at the
    +   * beginning of the document, as if it had just been created. It invalidates all
    +   * values, objects and arrays that you have created so far (including unescaped strings).
    +   */
    +  inline void rewind() noexcept;
    +  /**
    +   * Returns debugging information.
    +   */
    +  inline std::string to_debug_string() noexcept;
    +  /**
    +   * Some unrecoverable error conditions may render the document instance unusable.
    +   * The is_alive() method returns true when the document is still suitable.
    +   */
    +  inline bool is_alive() noexcept;
    +
    +  /**
    +   * Returns the current location in the document if in bounds.
    +   */
    +  inline simdjson_result current_location() const noexcept;
    +
    +  /**
    +   * Returns true if this document has been fully parsed.
    +   * If you have consumed the whole document and at_end() returns
    +   * false, then there may be trailing content.
    +   */
    +  inline bool at_end() const noexcept;
    +
    +  /**
    +   * Returns the current depth in the document if in bounds.
    +   *
    +   * E.g.,
    +   *  0 = finished with document
    +   *  1 = document root value (could be [ or {, not yet known)
    +   *  2 = , or } inside root array/object
    +   *  3 = key or value inside root array/object.
    +   */
    +  simdjson_inline int32_t current_depth() const noexcept;
    +
    +  /**
    +   * Get the value associated with the given JSON pointer.  We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/foo/a/1") == 20
    +   *
    +   * It is allowed for a key to be the empty string:
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("//a/1") == 20
    +   *
    +   * Note that at_pointer() automatically calls rewind between each call. Thus
    +   * all values, objects and arrays that you have created so far (including unescaped strings)
    +   * are invalidated. After calling at_pointer, you need to consume the result: string values
    +   * should be stored in your own variables, arrays should be decoded and stored in your own array-like
    +   * structures and so forth.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   *         - SCALAR_DOCUMENT_AS_VALUE if the json_pointer is empty and the document is not a scalar (see is_scalar() function).
    +   */
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  /**
    +   * Consumes the document and returns a string_view instance corresponding to the
    +   * document as represented in JSON. It points inside the original byte array containing
    +   * the JSON document.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +protected:
    +  /**
    +   * Consumes the document.
    +   */
    +  simdjson_inline error_code consume() noexcept;
    +
    +  simdjson_inline document(ondemand::json_iterator &&iter) noexcept;
    +  simdjson_inline const uint8_t *text(uint32_t idx) const noexcept;
    +
    +  simdjson_inline value_iterator resume_value_iterator() noexcept;
    +  simdjson_inline value_iterator get_root_value_iterator() noexcept;
    +  simdjson_inline simdjson_result start_or_resume_object() noexcept;
    +  static simdjson_inline document start(ondemand::json_iterator &&iter) noexcept;
    +
    +  //
    +  // Fields
    +  //
    +  json_iterator iter{}; ///< Current position in the document
    +  static constexpr depth_t DOCUMENT_DEPTH = 0; ///< document depth is always 0
    +
    +  friend class array_iterator;
    +  friend class value;
    +  friend class ondemand::parser;
    +  friend class object;
    +  friend class array;
    +  friend class field;
    +  friend class token;
    +  friend class document_stream;
    +  friend class document_reference;
    +};
    +
    +
    +/**
    + * A document_reference is a thin wrapper around a document reference instance.
    + */
    +class document_reference {
    +public:
    +  simdjson_inline document_reference() noexcept;
    +  simdjson_inline document_reference(document &d) noexcept;
    +  simdjson_inline document_reference(const document_reference &other) noexcept = default;
    +  simdjson_inline document_reference& operator=(const document_reference &other) noexcept = default;
    +  simdjson_inline void rewind() noexcept;
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result get_value() noexcept;
    +
    +  simdjson_inline simdjson_result is_null() noexcept;
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +  simdjson_inline operator document&() const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator array() & noexcept(false);
    +  simdjson_inline operator object() & noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +  simdjson_inline operator value() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  simdjson_inline int32_t current_depth() const noexcept;
    +  simdjson_inline bool is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +private:
    +  document *doc{nullptr};
    +};
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public fallback::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(fallback::ondemand::document &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline error_code rewind() noexcept;
    +
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result get_value() noexcept;
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +  template simdjson_inline simdjson_result get() & noexcept;
    +  template simdjson_inline simdjson_result get() && noexcept;
    +
    +  template simdjson_inline error_code get(T &out) & noexcept;
    +  template simdjson_inline error_code get(T &out) && noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator fallback::ondemand::array() & noexcept(false);
    +  simdjson_inline operator fallback::ondemand::object() & noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator fallback::ondemand::raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +  simdjson_inline operator fallback::ondemand::value() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  simdjson_inline int32_t current_depth() const noexcept;
    +  simdjson_inline bool at_end() const noexcept;
    +  simdjson_inline bool is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +  /** @copydoc simdjson_inline std::string_view document::raw_json_token() const noexcept */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +};
    +
    +
    +} // namespace simdjson
    +
    +
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public fallback::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(fallback::ondemand::document_reference value, error_code error) noexcept;
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline error_code rewind() noexcept;
    +
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result get_value() noexcept;
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator fallback::ondemand::array() & noexcept(false);
    +  simdjson_inline operator fallback::ondemand::object() & noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator fallback::ondemand::raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +  simdjson_inline operator fallback::ondemand::value() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  simdjson_inline simdjson_result current_depth() const noexcept;
    +  simdjson_inline simdjson_result is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +  /** @copydoc simdjson_inline std::string_view document_reference::raw_json_token() const noexcept */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +};
    +
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H
    +/* end file simdjson/generic/ondemand/document.h for fallback */
    +/* including simdjson/generic/ondemand/document_stream.h for fallback: #include "simdjson/generic/ondemand/document_stream.h" */
    +/* begin file simdjson/generic/ondemand/document_stream.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +#include 
    +#include 
    +#include 
    +#endif
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +/** @private Custom worker class **/
    +struct stage1_worker {
    +  stage1_worker() noexcept = default;
    +  stage1_worker(const stage1_worker&) = delete;
    +  stage1_worker(stage1_worker&&) = delete;
    +  stage1_worker operator=(const stage1_worker&) = delete;
    +  ~stage1_worker();
    +  /**
    +   * We only start the thread when it is needed, not at object construction, this may throw.
    +   * You should only call this once.
    +   **/
    +  void start_thread();
    +  /**
    +   * Start a stage 1 job. You should first call 'run', then 'finish'.
    +   * You must call start_thread once before.
    +   */
    +  void run(document_stream * ds, parser * stage1, size_t next_batch_start);
    +  /** Wait for the run to finish (blocking). You should first call 'run', then 'finish'. **/
    +  void finish();
    +
    +private:
    +
    +  /**
    +   * Normally, we would never stop the thread. But we do in the destructor.
    +   * This function is only safe assuming that you are not waiting for results. You
    +   * should have called run, then finish, and be done.
    +   **/
    +  void stop_thread();
    +
    +  std::thread thread{};
    +  /** These three variables define the work done by the thread. **/
    +  ondemand::parser * stage1_thread_parser{};
    +  size_t _next_batch_start{};
    +  document_stream * owner{};
    +  /**
    +   * We have two state variables. This could be streamlined to one variable in the future but
    +   * we use two for clarity.
    +   */
    +  bool has_work{false};
    +  bool can_work{true};
    +
    +  /**
    +   * We lock using a mutex.
    +   */
    +  std::mutex locking_mutex{};
    +  std::condition_variable cond_var{};
    +
    +  friend class document_stream;
    +};
    +#endif  // SIMDJSON_THREADS_ENABLED
    +
    +/**
    + * A forward-only stream of documents.
    + *
    + * Produced by parser::iterate_many.
    + *
    + */
    +class document_stream {
    +public:
    +  /**
    +   * Construct an uninitialized document_stream.
    +   *
    +   *  ```c++
    +   *  document_stream docs;
    +   *  auto error = parser.iterate_many(json).get(docs);
    +   *  ```
    +   */
    +  simdjson_inline document_stream() noexcept;
    +  /** Move one document_stream to another. */
    +  simdjson_inline document_stream(document_stream &&other) noexcept = default;
    +  /** Move one document_stream to another. */
    +  simdjson_inline document_stream &operator=(document_stream &&other) noexcept = default;
    +
    +  simdjson_inline ~document_stream() noexcept;
    +
    +  /**
    +   * Returns the input size in bytes.
    +   */
    +  inline size_t size_in_bytes() const noexcept;
    +
    +  /**
    +   * After iterating through the stream, this method
    +   * returns the number of bytes that were not parsed at the end
    +   * of the stream. If truncated_bytes() differs from zero,
    +   * then the input was truncated maybe because incomplete JSON
    +   * documents were found at the end of the stream. You
    +   * may need to process the bytes in the interval [size_in_bytes()-truncated_bytes(), size_in_bytes()).
    +   *
    +   * You should only call truncated_bytes() after streaming through all
    +   * documents, like so:
    +   *
    +   *   document_stream stream = parser.iterate_many(json,window);
    +   *   for(auto & doc : stream) {
    +   *      // do something with doc
    +   *   }
    +   *   size_t truncated = stream.truncated_bytes();
    +   *
    +   */
    +  inline size_t truncated_bytes() const noexcept;
    +
    +  class iterator {
    +  public:
    +    using value_type = simdjson_result;
    +    using reference  = value_type;
    +
    +    using difference_type   = std::ptrdiff_t;
    +
    +    using iterator_category = std::input_iterator_tag;
    +
    +    /**
    +     * Default constructor.
    +     */
    +    simdjson_inline iterator() noexcept;
    +    /**
    +     * Get the current document (or error).
    +     */
    +    simdjson_inline simdjson_result operator*() noexcept;
    +    /**
    +     * Advance to the next document (prefix).
    +     */
    +    inline iterator& operator++() noexcept;
    +    /**
    +     * Check if we're at the end yet.
    +     * @param other the end iterator to compare to.
    +     */
    +    simdjson_inline bool operator!=(const iterator &other) const noexcept;
    +    /**
    +     * @private
    +     *
    +     * Gives the current index in the input document in bytes.
    +     *
    +     *   document_stream stream = parser.parse_many(json,window);
    +     *   for(auto i = stream.begin(); i != stream.end(); ++i) {
    +     *      auto doc = *i;
    +     *      size_t index = i.current_index();
    +     *   }
    +     *
    +     * This function (current_index()) is experimental and the usage
    +     * may change in future versions of simdjson: we find the API somewhat
    +     * awkward and we would like to offer something friendlier.
    +     */
    +     simdjson_inline size_t current_index() const noexcept;
    +
    +     /**
    +     * @private
    +     *
    +     * Gives a view of the current document at the current position.
    +     *
    +     *   document_stream stream = parser.iterate_many(json,window);
    +     *   for(auto i = stream.begin(); i != stream.end(); ++i) {
    +     *      std::string_view v = i.source();
    +     *   }
    +     *
    +     * The returned string_view instance is simply a map to the (unparsed)
    +     * source string: it may thus include white-space characters and all manner
    +     * of padding.
    +     *
    +     * This function (source()) is experimental and the usage
    +     * may change in future versions of simdjson: we find the API somewhat
    +     * awkward and we would like to offer something friendlier.
    +     *
    +     */
    +     simdjson_inline std::string_view source() const noexcept;
    +
    +    /**
    +     * Returns error of the stream (if any).
    +     */
    +     inline error_code error() const noexcept;
    +
    +  private:
    +    simdjson_inline iterator(document_stream *s, bool finished) noexcept;
    +    /** The document_stream we're iterating through. */
    +    document_stream* stream;
    +    /** Whether we're finished or not. */
    +    bool finished;
    +
    +    friend class document;
    +    friend class document_stream;
    +    friend class json_iterator;
    +  };
    +
    +  /**
    +   * Start iterating the documents in the stream.
    +   */
    +  simdjson_inline iterator begin() noexcept;
    +  /**
    +   * The end of the stream, for iterator comparison purposes.
    +   */
    +  simdjson_inline iterator end() noexcept;
    +
    +private:
    +
    +  document_stream &operator=(const document_stream &) = delete; // Disallow copying
    +  document_stream(const document_stream &other) = delete; // Disallow copying
    +
    +  /**
    +   * Construct a document_stream. Does not allocate or parse anything until the iterator is
    +   * used.
    +   *
    +   * @param parser is a reference to the parser instance used to generate this document_stream
    +   * @param buf is the raw byte buffer we need to process
    +   * @param len is the length of the raw byte buffer in bytes
    +   * @param batch_size is the size of the windows (must be strictly greater or equal to the largest JSON document)
    +   */
    +  simdjson_inline document_stream(
    +    ondemand::parser &parser,
    +    const uint8_t *buf,
    +    size_t len,
    +    size_t batch_size,
    +    bool allow_comma_separated
    +  ) noexcept;
    +
    +  /**
    +   * Parse the first document in the buffer. Used by begin(), to handle allocation and
    +   * initialization.
    +   */
    +  inline void start() noexcept;
    +
    +  /**
    +   * Parse the next document found in the buffer previously given to document_stream.
    +   *
    +   * The content should be a valid JSON document encoded as UTF-8. If there is a
    +   * UTF-8 BOM, the parser skips it.
    +   *
    +   * You do NOT need to pre-allocate a parser.  This function takes care of
    +   * pre-allocating a capacity defined by the batch_size defined when creating the
    +   * document_stream object.
    +   *
    +   * The function returns simdjson::EMPTY if there is no more data to be parsed.
    +   *
    +   * The function returns simdjson::SUCCESS (as integer = 0) in case of success
    +   * and indicates that the buffer has successfully been parsed to the end.
    +   * Every document it contained has been parsed without error.
    +   *
    +   * The function returns an error code from simdjson/simdjson.h in case of failure
    +   * such as simdjson::CAPACITY, simdjson::MEMALLOC, simdjson::DEPTH_ERROR and so forth;
    +   * the simdjson::error_message function converts these error codes into a string).
    +   *
    +   * You can also check validity by calling parser.is_valid(). The same parser can
    +   * and should be reused for the other documents in the buffer.
    +   */
    +  inline void next() noexcept;
    +
    +  /** Move the json_iterator of the document to the location of the next document in the stream. */
    +  inline void next_document() noexcept;
    +
    +  /** Get the next document index. */
    +  inline size_t next_batch_start() const noexcept;
    +
    +  /** Pass the next batch through stage 1 with the given parser. */
    +  inline error_code run_stage1(ondemand::parser &p, size_t batch_start) noexcept;
    +
    +  // Fields
    +  ondemand::parser *parser;
    +  const uint8_t *buf;
    +  size_t len;
    +  size_t batch_size;
    +  bool allow_comma_separated;
    +  /**
    +   * We are going to use just one document instance. The document owns
    +   * the json_iterator. It implies that we only ever pass a reference
    +   * to the document to the users.
    +   */
    +  document doc{};
    +  /** The error (or lack thereof) from the current document. */
    +  error_code error;
    +  size_t batch_start{0};
    +  size_t doc_index{};
    +
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  /** Indicates whether we use threads. Note that this needs to be a constant during the execution of the parsing. */
    +  bool use_thread;
    +
    +  inline void load_from_stage1_thread() noexcept;
    +
    +  /** Start a thread to run stage 1 on the next batch. */
    +  inline void start_stage1_thread() noexcept;
    +
    +  /** Wait for the stage 1 thread to finish and capture the results. */
    +  inline void finish_stage1_thread() noexcept;
    +
    +  /** The error returned from the stage 1 thread. */
    +  error_code stage1_thread_error{UNINITIALIZED};
    +  /** The thread used to run stage 1 against the next batch in the background. */
    +  std::unique_ptr worker{new(std::nothrow) stage1_worker()};
    +  /**
    +   * The parser used to run stage 1 in the background. Will be swapped
    +   * with the regular parser when finished.
    +   */
    +  ondemand::parser stage1_thread_parser{};
    +
    +  friend struct stage1_worker;
    +  #endif // SIMDJSON_THREADS_ENABLED
    +
    +  friend class parser;
    +  friend class document;
    +  friend class json_iterator;
    +  friend struct simdjson_result;
    +  friend struct internal::simdjson_result_base;
    +};  // document_stream
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +template<>
    +struct simdjson_result : public fallback::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(fallback::ondemand::document_stream &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H
    +/* end file simdjson/generic/ondemand/document_stream.h for fallback */
    +/* including simdjson/generic/ondemand/field.h for fallback: #include "simdjson/generic/ondemand/field.h" */
    +/* begin file simdjson/generic/ondemand/field.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_FIELD_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +/**
    + * A JSON field (key/value pair) in an object.
    + *
    + * Returned from object iteration.
    + *
    + * Extends from std::pair so you can use C++ algorithms that rely on pairs.
    + */
    +class field : public std::pair {
    +public:
    +  /**
    +   * Create a new invalid field.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline field() noexcept;
    +
    +  /**
    +   * Get the key as a string_view (for higher speed, consider raw_key).
    +   * We deliberately use a more cumbersome name (unescaped_key) to force users
    +   * to think twice about using it.
    +   *
    +   * This consumes the key: once you have called unescaped_key(), you cannot
    +   * call it again nor can you call key().
    +   */
    +  simdjson_inline simdjson_warn_unused simdjson_result unescaped_key(bool allow_replacement) noexcept;
    +  /**
    +   * Get the key as a raw_json_string. Can be used for direct comparison with
    +   * an unescaped C string: e.g., key() == "test".
    +   */
    +  simdjson_inline raw_json_string key() const noexcept;
    +  /**
    +   * Get the field value.
    +   */
    +  simdjson_inline ondemand::value &value() & noexcept;
    +  /**
    +   * @overload ondemand::value &ondemand::value() & noexcept
    +   */
    +  simdjson_inline ondemand::value value() && noexcept;
    +
    +protected:
    +  simdjson_inline field(raw_json_string key, ondemand::value &&value) noexcept;
    +  static simdjson_inline simdjson_result start(value_iterator &parent_iter) noexcept;
    +  static simdjson_inline simdjson_result start(const value_iterator &parent_iter, raw_json_string key) noexcept;
    +  friend struct simdjson_result;
    +  friend class object_iterator;
    +};
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public fallback::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(fallback::ondemand::field &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result unescaped_key(bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result key() noexcept;
    +  simdjson_inline simdjson_result value() noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_H
    +/* end file simdjson/generic/ondemand/field.h for fallback */
    +/* including simdjson/generic/ondemand/object.h for fallback: #include "simdjson/generic/ondemand/object.h" */
    +/* begin file simdjson/generic/ondemand/object.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +/**
    + * A forward-only JSON object field iterator.
    + */
    +class object {
    +public:
    +  /**
    +   * Create a new invalid object.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline object() noexcept = default;
    +
    +  simdjson_inline simdjson_result begin() noexcept;
    +  simdjson_inline simdjson_result end() noexcept;
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +   *
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. The value instance you get
    +   * from  `content["bids"]` becomes invalid when you call `content["asks"]`. The array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to a
    +   * key a single time. Doing object["mykey"].to_string() and then again object["mykey"].to_string()
    +   * is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field(std::string_view key) && noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. The value instance you get
    +   * from  `content["bids"]` becomes invalid when you call `content["asks"]`. The array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to a key
    +   * a single time. Doing object["mykey"].to_string() and then again object["mykey"].to_string() is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) && noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) && noexcept;
    +
    +  /**
    +   * Get the value associated with the given JSON pointer. We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard, interpreting the current node
    +   * as the root of its own JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/foo/a/1") == 20
    +   *
    +   * It is allowed for a key to be the empty string:
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("//a/1") == 20
    +   *
    +   * Note that at_pointer() called on the document automatically calls the document's rewind
    +   * method between each call. It invalidates all previously accessed arrays, objects and values
    +   * that have not been consumed. Yet it is not the case when calling at_pointer on an object
    +   * instance: there is no rewind and no invalidation.
    +   *
    +   * You may call at_pointer more than once on an object, but each time the pointer is advanced
    +   * to be within the value matched by the key indicated by the JSON pointer query. Thus any preceding
    +   * key (as well as the current key) can no longer be used with following JSON pointer calls.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching.
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   */
    +  inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +
    +  /**
    +   * Reset the iterator so that we are pointing back at the
    +   * beginning of the object. You should still consume values only once even if you
    +   * can iterate through the object more than once. If you unescape a string within
    +   * the object more than once, you have unsafe code. Note that rewinding an object
    +   * means that you may need to reparse it anew: it is not a free operation.
    +   *
    +   * @returns true if the object contains some elements (not empty)
    +   */
    +  inline simdjson_result reset() & noexcept;
    +  /**
    +   * This method scans the beginning of the object and checks whether the
    +   * object is empty.
    +   * The runtime complexity is constant time. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   */
    +  inline simdjson_result is_empty() & noexcept;
    +  /**
    +   * This method scans the object and counts the number of key-value pairs.
    +   * The count_fields method should always be called before you have begun
    +   * iterating through the object: it is expected that you are pointing at
    +   * the beginning of the object.
    +   * The runtime complexity is linear in the size of the object. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an object is empty, it is more performant to use
    +   * the is_empty() method.
    +   *
    +   * Performance hint: You should only call count_fields() as a last
    +   * resort as it may require scanning the document twice or more.
    +   */
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  /**
    +   * Consumes the object and returns a string_view instance corresponding to the
    +   * object as represented in JSON. It points inside the original byte array containing
    +   * the JSON document.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +protected:
    +  /**
    +   * Go to the end of the object, no matter where you are right now.
    +   */
    +  simdjson_inline error_code consume() noexcept;
    +  static simdjson_inline simdjson_result start(value_iterator &iter) noexcept;
    +  static simdjson_inline simdjson_result start_root(value_iterator &iter) noexcept;
    +  static simdjson_inline simdjson_result started(value_iterator &iter) noexcept;
    +  static simdjson_inline object resume(const value_iterator &iter) noexcept;
    +  simdjson_inline object(const value_iterator &iter) noexcept;
    +
    +  simdjson_warn_unused simdjson_inline error_code find_field_raw(const std::string_view key) noexcept;
    +
    +  value_iterator iter{};
    +
    +  friend class value;
    +  friend class document;
    +  friend struct simdjson_result;
    +};
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public fallback::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(fallback::ondemand::object &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result begin() noexcept;
    +  simdjson_inline simdjson_result end() noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) && noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) && noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) && noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  inline simdjson_result reset() noexcept;
    +  inline simdjson_result is_empty() noexcept;
    +  inline simdjson_result count_fields() & noexcept;
    +  inline simdjson_result raw_json() noexcept;
    +
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_H
    +/* end file simdjson/generic/ondemand/object.h for fallback */
    +/* including simdjson/generic/ondemand/object_iterator.h for fallback: #include "simdjson/generic/ondemand/object_iterator.h" */
    +/* begin file simdjson/generic/ondemand/object_iterator.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +class object_iterator {
    +public:
    +  /**
    +   * Create a new invalid object_iterator.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline object_iterator() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  // Reads key and value, yielding them to the user.
    +  // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  simdjson_inline simdjson_result operator*() noexcept;
    +  // Assumes it's being compared with the end. true if depth < iter->depth.
    +  simdjson_inline bool operator==(const object_iterator &) const noexcept;
    +  // Assumes it's being compared with the end. true if depth >= iter->depth.
    +  simdjson_inline bool operator!=(const object_iterator &) const noexcept;
    +  // Checks for ']' and ','
    +  simdjson_inline object_iterator &operator++() noexcept;
    +
    +private:
    +  /**
    +   * The underlying JSON iterator.
    +   *
    +   * PERF NOTE: expected to be elided in favor of the parent document: this is set when the object
    +   * is first used, and never changes afterwards.
    +   */
    +  value_iterator iter{};
    +
    +  simdjson_inline object_iterator(const value_iterator &iter) noexcept;
    +  friend struct simdjson_result;
    +  friend class object;
    +};
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public fallback::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(fallback::ondemand::object_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  // Reads key and value, yielding them to the user.
    +  simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  // Assumes it's being compared with the end. true if depth < iter->depth.
    +  simdjson_inline bool operator==(const simdjson_result &) const noexcept;
    +  // Assumes it's being compared with the end. true if depth >= iter->depth.
    +  simdjson_inline bool operator!=(const simdjson_result &) const noexcept;
    +  // Checks for ']' and ','
    +  simdjson_inline simdjson_result &operator++() noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H
    +/* end file simdjson/generic/ondemand/object_iterator.h for fallback */
    +/* including simdjson/generic/ondemand/serialization.h for fallback: #include "simdjson/generic/ondemand/serialization.h" */
    +/* begin file simdjson/generic/ondemand/serialization.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +/**
    + * Create a string-view instance out of a document instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(fallback::ondemand::document& x) noexcept;
    +/**
    + * Create a string-view instance out of a value instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. The value must
    + * not have been accessed previously. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(fallback::ondemand::value& x) noexcept;
    +/**
    + * Create a string-view instance out of an object instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(fallback::ondemand::object& x) noexcept;
    +/**
    + * Create a string-view instance out of an array instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(fallback::ondemand::array& x) noexcept;
    +inline simdjson_result to_json_string(simdjson_result x);
    +inline simdjson_result to_json_string(simdjson_result x);
    +inline simdjson_result to_json_string(simdjson_result x);
    +inline simdjson_result to_json_string(simdjson_result x);
    +} // namespace simdjson
    +
    +/**
    + * We want to support argument-dependent lookup (ADL).
    + * Hence we should define operator<< in the namespace
    + * where the argument (here value, object, etc.) resides.
    + * Credit: @madhur4127
    + * See https://github.com/simdjson/simdjson/issues/1768
    + */
    +namespace simdjson { namespace fallback { namespace ondemand {
    +
    +/**
    + * Print JSON to an output stream.  It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The element.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::value x);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x);
    +#endif
    +/**
    + * Print JSON to an output stream. It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The array.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::array value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x);
    +#endif
    +/**
    + * Print JSON to an output stream. It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The array.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::document& value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x);
    +#endif
    +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::document_reference& value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x);
    +#endif
    +/**
    + * Print JSON to an output stream. It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The object.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::object value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x);
    +#endif
    +}}} // namespace simdjson::fallback::ondemand
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H
    +/* end file simdjson/generic/ondemand/serialization.h for fallback */
    +
    +// Inline definitions
    +/* including simdjson/generic/ondemand/array-inl.h for fallback: #include "simdjson/generic/ondemand/array-inl.h" */
    +/* begin file simdjson/generic/ondemand/array-inl.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +//
    +// ### Live States
    +//
    +// While iterating or looking up values, depth >= iter->depth. at_start may vary. Error is
    +// always SUCCESS:
    +//
    +// - Start: This is the state when the array is first found and the iterator is just past the `{`.
    +//   In this state, at_start == true.
    +// - Next: After we hand a scalar value to the user, or an array/object which they then fully
    +//   iterate over, the iterator is at the `,` before the next value (or `]`). In this state,
    +//   depth == iter->depth, at_start == false, and error == SUCCESS.
    +// - Unfinished Business: When we hand an array/object to the user which they do not fully
    +//   iterate over, we need to finish that iteration by skipping child values until we reach the
    +//   Next state. In this state, depth > iter->depth, at_start == false, and error == SUCCESS.
    +//
    +// ## Error States
    +//
    +// In error states, we will yield exactly one more value before stopping. iter->depth == depth
    +// and at_start is always false. We decrement after yielding the error, moving to the Finished
    +// state.
    +//
    +// - Chained Error: When the array iterator is part of an error chain--for example, in
    +//   `for (auto tweet : doc["tweets"])`, where the tweet element may be missing or not be an
    +//   array--we yield that error in the loop, exactly once. In this state, error != SUCCESS and
    +//   iter->depth == depth, and at_start == false. We decrement depth when we yield the error.
    +// - Missing Comma Error: When the iterator ++ method discovers there is no comma between elements,
    +//   we flag that as an error and treat it exactly the same as a Chained Error. In this state,
    +//   error == TAPE_ERROR, iter->depth == depth, and at_start == false.
    +//
    +// ## Terminal State
    +//
    +// The terminal state has iter->depth < depth. at_start is always false.
    +//
    +// - Finished: When we have reached a `]` or have reported an error, we are finished. We signal this
    +//   by decrementing depth. In this state, iter->depth < depth, at_start == false, and
    +//   error == SUCCESS.
    +//
    +
    +simdjson_inline array::array(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{
    +}
    +
    +simdjson_inline simdjson_result array::start(value_iterator &iter) noexcept {
    +  // We don't need to know if the array is empty to start iteration, but we do want to know if there
    +  // is an error--thus `simdjson_unused`.
    +  simdjson_unused bool has_value;
    +  SIMDJSON_TRY( iter.start_array().get(has_value) );
    +  return array(iter);
    +}
    +simdjson_inline simdjson_result array::start_root(value_iterator &iter) noexcept {
    +  simdjson_unused bool has_value;
    +  SIMDJSON_TRY( iter.start_root_array().get(has_value) );
    +  return array(iter);
    +}
    +simdjson_inline simdjson_result array::started(value_iterator &iter) noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY(iter.started_array().get(has_value));
    +  return array(iter);
    +}
    +
    +simdjson_inline simdjson_result array::begin() noexcept {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  return array_iterator(iter);
    +}
    +simdjson_inline simdjson_result array::end() noexcept {
    +  return array_iterator(iter);
    +}
    +simdjson_inline error_code array::consume() noexcept {
    +  auto error = iter.json_iter().skip_child(iter.depth()-1);
    +  if(error) { iter.abandon(); }
    +  return error;
    +}
    +
    +simdjson_inline simdjson_result array::raw_json() noexcept {
    +  const uint8_t * starting_point{iter.peek_start()};
    +  auto error = consume();
    +  if(error) { return error; }
    +  // After 'consume()', we could be left pointing just beyond the document, but that
    +  // is ok because we are not going to dereference the final pointer position, we just
    +  // use it to compute the length in bytes.
    +  const uint8_t * final_point{iter._json_iter->unsafe_pointer()};
    +  return std::string_view(reinterpret_cast(starting_point), size_t(final_point - starting_point));
    +}
    +
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_inline simdjson_result array::count_elements() & noexcept {
    +  size_t count{0};
    +  // Important: we do not consume any of the values.
    +  for(simdjson_unused auto v : *this) { count++; }
    +  // The above loop will always succeed, but we want to report errors.
    +  if(iter.error()) { return iter.error(); }
    +  // We need to move back at the start because we expect users to iterate through
    +  // the array after counting the number of elements.
    +  iter.reset_array();
    +  return count;
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_inline simdjson_result array::is_empty() & noexcept {
    +  bool is_not_empty;
    +  auto error = iter.reset_array().get(is_not_empty);
    +  if(error) { return error; }
    +  return !is_not_empty;
    +}
    +
    +inline simdjson_result array::reset() & noexcept {
    +  return iter.reset_array();
    +}
    +
    +inline simdjson_result array::at_pointer(std::string_view json_pointer) noexcept {
    +  if (json_pointer[0] != '/') { return INVALID_JSON_POINTER; }
    +  json_pointer = json_pointer.substr(1);
    +  // - means "the append position" or "the element after the end of the array"
    +  // We don't support this, because we're returning a real element, not a position.
    +  if (json_pointer == "-") { return INDEX_OUT_OF_BOUNDS; }
    +
    +  // Read the array index
    +  size_t array_index = 0;
    +  size_t i;
    +  for (i = 0; i < json_pointer.length() && json_pointer[i] != '/'; i++) {
    +    uint8_t digit = uint8_t(json_pointer[i] - '0');
    +    // Check for non-digit in array index. If it's there, we're trying to get a field in an object
    +    if (digit > 9) { return INCORRECT_TYPE; }
    +    array_index = array_index*10 + digit;
    +  }
    +
    +  // 0 followed by other digits is invalid
    +  if (i > 1 && json_pointer[0] == '0') { return INVALID_JSON_POINTER; } // "JSON pointer array index has other characters after 0"
    +
    +  // Empty string is invalid; so is a "/" with no digits before it
    +  if (i == 0) { return INVALID_JSON_POINTER; } // "Empty string in JSON pointer array index"
    +  // Get the child
    +  auto child = at(array_index);
    +  // If there is an error, it ends here
    +  if(child.error()) {
    +    return child;
    +  }
    +
    +  // If there is a /, we're not done yet, call recursively.
    +  if (i < json_pointer.length()) {
    +    child = child.at_pointer(json_pointer.substr(i));
    +  }
    +  return child;
    +}
    +
    +simdjson_inline simdjson_result array::at(size_t index) noexcept {
    +  size_t i = 0;
    +  for (auto value : *this) {
    +    if (i == index) { return value; }
    +    i++;
    +  }
    +  return INDEX_OUT_OF_BOUNDS;
    +}
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  fallback::ondemand::array &&value
    +) noexcept
    +  : implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept
    +  : implementation_simdjson_result_base(error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::begin() noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() noexcept {
    +  if (error()) { return error(); }
    +  return first.end();
    +}
    +simdjson_inline  simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline  simdjson_result simdjson_result::is_empty() & noexcept {
    +  if (error()) { return error(); }
    +  return first.is_empty();
    +}
    +simdjson_inline  simdjson_result simdjson_result::at(size_t index) noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline  simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +simdjson_inline  simdjson_result simdjson_result::raw_json() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json();
    +}
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H
    +/* end file simdjson/generic/ondemand/array-inl.h for fallback */
    +/* including simdjson/generic/ondemand/array_iterator-inl.h for fallback: #include "simdjson/generic/ondemand/array_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/array_iterator-inl.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{}
    +
    +simdjson_inline simdjson_result array_iterator::operator*() noexcept {
    +  if (iter.error()) { iter.abandon(); return iter.error(); }
    +  return value(iter.child());
    +}
    +simdjson_inline bool array_iterator::operator==(const array_iterator &other) const noexcept {
    +  return !(*this != other);
    +}
    +simdjson_inline bool array_iterator::operator!=(const array_iterator &) const noexcept {
    +  return iter.is_open();
    +}
    +simdjson_inline array_iterator &array_iterator::operator++() noexcept {
    +  error_code error;
    +  // PERF NOTE this is a safety rail ... users should exit loops as soon as they receive an error, so we'll never get here.
    +  // However, it does not seem to make a perf difference, so we add it out of an abundance of caution.
    +  if (( error = iter.error() )) { return *this; }
    +  if (( error = iter.skip_child() )) { return *this; }
    +  if (( error = iter.has_next_element().error() )) { return *this; }
    +  return *this;
    +}
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  fallback::ondemand::array_iterator &&value
    +) noexcept
    +  : fallback::implementation_simdjson_result_base(std::forward(value))
    +{
    +  first.iter.assert_is_valid();
    +}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +  : fallback::implementation_simdjson_result_base({}, error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::operator*() noexcept {
    +  if (error()) { return error(); }
    +  return *first;
    +}
    +simdjson_inline bool simdjson_result::operator==(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return !error(); }
    +  return first == other.first;
    +}
    +simdjson_inline bool simdjson_result::operator!=(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return error(); }
    +  return first != other.first;
    +}
    +simdjson_inline simdjson_result &simdjson_result::operator++() noexcept {
    +  // Clear the error if there is one, so we don't yield it twice
    +  if (error()) { second = SUCCESS; return *this; }
    +  ++(first);
    +  return *this;
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/array_iterator-inl.h for fallback */
    +/* including simdjson/generic/ondemand/document-inl.h for fallback: #include "simdjson/generic/ondemand/document-inl.h" */
    +/* begin file simdjson/generic/ondemand/document-inl.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +simdjson_inline document::document(ondemand::json_iterator &&_iter) noexcept
    +  : iter{std::forward(_iter)}
    +{
    +  logger::log_start_value(iter, "document");
    +}
    +
    +simdjson_inline document document::start(json_iterator &&iter) noexcept {
    +  return document(std::forward(iter));
    +}
    +
    +inline void document::rewind() noexcept {
    +  iter.rewind();
    +}
    +
    +inline std::string document::to_debug_string() noexcept {
    +  return iter.to_string();
    +}
    +
    +inline simdjson_result document::current_location() const noexcept {
    +  return iter.current_location();
    +}
    +
    +inline int32_t document::current_depth() const noexcept {
    +  return iter.depth();
    +}
    +
    +inline bool document::at_end() const noexcept {
    +  return iter.at_end();
    +}
    +
    +
    +inline bool document::is_alive() noexcept {
    +  return iter.is_alive();
    +}
    +simdjson_inline value_iterator document::resume_value_iterator() noexcept {
    +  return value_iterator(&iter, 1, iter.root_position());
    +}
    +simdjson_inline value_iterator document::get_root_value_iterator() noexcept {
    +  return resume_value_iterator();
    +}
    +simdjson_inline simdjson_result document::start_or_resume_object() noexcept {
    +  if (iter.at_root()) {
    +    return get_object();
    +  } else {
    +    return object::resume(resume_value_iterator());
    +  }
    +}
    +simdjson_inline simdjson_result document::get_value() noexcept {
    +  // Make sure we start any arrays or objects before returning, so that start_root_()
    +  // gets called.
    +
    +  // It is the convention throughout the code that  the macro `SIMDJSON_DEVELOPMENT_CHECKS` determines whether
    +  // we check for OUT_OF_ORDER_ITERATION. Proper on::demand code should never trigger this error.
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  if (!iter.at_root()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  // assert_at_root() serves two purposes: in Debug mode, whether or not
    +  // SIMDJSON_DEVELOPMENT_CHECKS is set or not, it checks that we are at the root of
    +  // the document (this will typically be redundant). In release mode, it generates
    +  // SIMDJSON_ASSUME statements to allow the compiler to make assumptions.
    +  iter.assert_at_root();
    +  switch (*iter.peek()) {
    +    case '[': {
    +      // The following lines check that the document ends with ].
    +      auto value_iterator = get_root_value_iterator();
    +      auto error = value_iterator.check_root_array();
    +      if(error) { return error; }
    +      return value(get_root_value_iterator());
    +    }
    +    case '{': {
    +      // The following lines would check that the document ends with }.
    +      auto value_iterator = get_root_value_iterator();
    +      auto error = value_iterator.check_root_object();
    +      if(error) { return error; }
    +      return value(get_root_value_iterator());
    +    }
    +    default:
    +      // Unfortunately, scalar documents are a special case in simdjson and they cannot
    +      // be safely converted to value instances.
    +      return SCALAR_DOCUMENT_AS_VALUE;
    +  }
    +}
    +simdjson_inline simdjson_result document::get_array() & noexcept {
    +  auto value = get_root_value_iterator();
    +  return array::start_root(value);
    +}
    +simdjson_inline simdjson_result document::get_object() & noexcept {
    +  auto value = get_root_value_iterator();
    +  return object::start_root(value);
    +}
    +
    +/**
    + * We decided that calling 'get_double()' on the JSON document '1.233 blabla' should
    + * give an error, so we check for trailing content. We want to disallow trailing
    + * content.
    + * Thus, in several implementations below, we pass a 'true' parameter value to
    + * a get_root_value_iterator() method: this indicates that we disallow trailing content.
    + */
    +
    +simdjson_inline simdjson_result document::get_uint64() noexcept {
    +  return get_root_value_iterator().get_root_uint64(true);
    +}
    +simdjson_inline simdjson_result document::get_uint64_in_string() noexcept {
    +  return get_root_value_iterator().get_root_uint64_in_string(true);
    +}
    +simdjson_inline simdjson_result document::get_int64() noexcept {
    +  return get_root_value_iterator().get_root_int64(true);
    +}
    +simdjson_inline simdjson_result document::get_int64_in_string() noexcept {
    +  return get_root_value_iterator().get_root_int64_in_string(true);
    +}
    +simdjson_inline simdjson_result document::get_double() noexcept {
    +  return get_root_value_iterator().get_root_double(true);
    +}
    +simdjson_inline simdjson_result document::get_double_in_string() noexcept {
    +  return get_root_value_iterator().get_root_double_in_string(true);
    +}
    +simdjson_inline simdjson_result document::get_string(bool allow_replacement) noexcept {
    +  return get_root_value_iterator().get_root_string(true, allow_replacement);
    +}
    +template 
    +simdjson_inline error_code document::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  return get_root_value_iterator().get_root_string(receiver, true, allow_replacement);
    +}
    +simdjson_inline simdjson_result document::get_wobbly_string() noexcept {
    +  return get_root_value_iterator().get_root_wobbly_string(true);
    +}
    +simdjson_inline simdjson_result document::get_raw_json_string() noexcept {
    +  return get_root_value_iterator().get_root_raw_json_string(true);
    +}
    +simdjson_inline simdjson_result document::get_bool() noexcept {
    +  return get_root_value_iterator().get_root_bool(true);
    +}
    +simdjson_inline simdjson_result document::is_null() noexcept {
    +  return get_root_value_iterator().is_root_null(true);
    +}
    +
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_array(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_object(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_raw_json_string(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_string(false); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_double(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_uint64(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_int64(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_value(); }
    +
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return get_value(); }
    +
    +template simdjson_inline error_code document::get(T &out) & noexcept {
    +  return get().get(out);
    +}
    +template simdjson_inline error_code document::get(T &out) && noexcept {
    +  return std::forward(*this).get().get(out);
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline document::operator array() & noexcept(false) { return get_array(); }
    +simdjson_inline document::operator object() & noexcept(false) { return get_object(); }
    +simdjson_inline document::operator uint64_t() noexcept(false) { return get_uint64(); }
    +simdjson_inline document::operator int64_t() noexcept(false) { return get_int64(); }
    +simdjson_inline document::operator double() noexcept(false) { return get_double(); }
    +simdjson_inline document::operator std::string_view() noexcept(false) { return get_string(false); }
    +simdjson_inline document::operator raw_json_string() noexcept(false) { return get_raw_json_string(); }
    +simdjson_inline document::operator bool() noexcept(false) { return get_bool(); }
    +simdjson_inline document::operator value() noexcept(false) { return get_value(); }
    +
    +#endif
    +simdjson_inline simdjson_result document::count_elements() & noexcept {
    +  auto a = get_array();
    +  simdjson_result answer = a.count_elements();
    +  /* If there was an array, we are now left pointing at its first element. */
    +  if(answer.error() == SUCCESS) { rewind(); }
    +  return answer;
    +}
    +simdjson_inline simdjson_result document::count_fields() & noexcept {
    +  auto a = get_object();
    +  simdjson_result answer = a.count_fields();
    +  /* If there was an object, we are now left pointing at its first element. */
    +  if(answer.error() == SUCCESS) { rewind(); }
    +  return answer;
    +}
    +simdjson_inline simdjson_result document::at(size_t index) & noexcept {
    +  auto a = get_array();
    +  return a.at(index);
    +}
    +simdjson_inline simdjson_result document::begin() & noexcept {
    +  return get_array().begin();
    +}
    +simdjson_inline simdjson_result document::end() & noexcept {
    +  return {};
    +}
    +
    +simdjson_inline simdjson_result document::find_field(std::string_view key) & noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +simdjson_inline simdjson_result document::find_field(const char *key) & noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +simdjson_inline simdjson_result document::find_field_unordered(std::string_view key) & noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result document::find_field_unordered(const char *key) & noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result document::operator[](std::string_view key) & noexcept {
    +  return start_or_resume_object()[key];
    +}
    +simdjson_inline simdjson_result document::operator[](const char *key) & noexcept {
    +  return start_or_resume_object()[key];
    +}
    +
    +simdjson_inline error_code document::consume() noexcept {
    +  auto error = iter.skip_child(0);
    +  if(error) { iter.abandon(); }
    +  return error;
    +}
    +
    +simdjson_inline simdjson_result document::raw_json() noexcept {
    +  auto _iter = get_root_value_iterator();
    +  const uint8_t * starting_point{_iter.peek_start()};
    +  auto error = consume();
    +  if(error) { return error; }
    +  // After 'consume()', we could be left pointing just beyond the document, but that
    +  // is ok because we are not going to dereference the final pointer position, we just
    +  // use it to compute the length in bytes.
    +  const uint8_t * final_point{iter.unsafe_pointer()};
    +  return std::string_view(reinterpret_cast(starting_point), size_t(final_point - starting_point));
    +}
    +
    +simdjson_inline simdjson_result document::type() noexcept {
    +  return get_root_value_iterator().type();
    +}
    +
    +simdjson_inline simdjson_result document::is_scalar() noexcept {
    +  json_type this_type;
    +  auto error = type().get(this_type);
    +  if(error) { return error; }
    +  return ! ((this_type == json_type::array) || (this_type == json_type::object));
    +}
    +
    +simdjson_inline bool document::is_negative() noexcept {
    +  return get_root_value_iterator().is_root_negative();
    +}
    +
    +simdjson_inline simdjson_result document::is_integer() noexcept {
    +  return get_root_value_iterator().is_root_integer(true);
    +}
    +
    +simdjson_inline simdjson_result document::get_number_type() noexcept {
    +  return get_root_value_iterator().get_root_number_type(true);
    +}
    +
    +simdjson_inline simdjson_result document::get_number() noexcept {
    +  return get_root_value_iterator().get_root_number(true);
    +}
    +
    +
    +simdjson_inline simdjson_result document::raw_json_token() noexcept {
    +  auto _iter = get_root_value_iterator();
    +  return std::string_view(reinterpret_cast(_iter.peek_start()), _iter.peek_start_length());
    +}
    +
    +simdjson_inline simdjson_result document::at_pointer(std::string_view json_pointer) noexcept {
    +  rewind(); // Rewind the document each time at_pointer is called
    +  if (json_pointer.empty()) {
    +    return this->get_value();
    +  }
    +  json_type t;
    +  SIMDJSON_TRY(type().get(t));
    +  switch (t)
    +  {
    +    case json_type::array:
    +      return (*this).get_array().at_pointer(json_pointer);
    +    case json_type::object:
    +      return (*this).get_object().at_pointer(json_pointer);
    +    default:
    +      return INVALID_JSON_POINTER;
    +  }
    +}
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  fallback::ondemand::document &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      error
    +    )
    +{
    +}
    +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline error_code simdjson_result::rewind() noexcept {
    +  if (error()) { return error(); }
    +  first.rewind();
    +  return SUCCESS;
    +}
    +simdjson_inline simdjson_result simdjson_result::begin() & noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() & noexcept {
    +  return {};
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_array();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_object();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_bool();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_value() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_value();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_null() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_null();
    +}
    +
    +template
    +simdjson_inline simdjson_result simdjson_result::get() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get();
    +}
    +template
    +simdjson_inline simdjson_result simdjson_result::get() && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).get();
    +}
    +template
    +simdjson_inline error_code simdjson_result::get(T &out) & noexcept {
    +  if (error()) { return error(); }
    +  return first.get(out);
    +}
    +template
    +simdjson_inline error_code simdjson_result::get(T &out) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).get(out);
    +}
    +
    +template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete;
    +template<> simdjson_inline simdjson_result simdjson_result::get() && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first);
    +}
    +template<> simdjson_inline error_code simdjson_result::get(fallback::ondemand::document &out) & noexcept = delete;
    +template<> simdjson_inline error_code simdjson_result::get(fallback::ondemand::document &out) && noexcept {
    +  if (error()) { return error(); }
    +  out = std::forward(first);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::type() noexcept {
    +  if (error()) { return error(); }
    +  return first.type();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_scalar();
    +}
    +
    +
    +simdjson_inline bool simdjson_result::is_negative() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_negative();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_integer();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number_type();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::get_number() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number();
    +}
    +
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline simdjson_result::operator fallback::ondemand::array() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator fallback::ondemand::object() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator int64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator double() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator fallback::ondemand::raw_json_string() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator bool() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator fallback::ondemand::value() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +#endif
    +
    +
    +simdjson_inline simdjson_result simdjson_result::current_location() noexcept {
    +  if (error()) { return error(); }
    +  return first.current_location();
    +}
    +
    +simdjson_inline bool simdjson_result::at_end() const noexcept {
    +  if (error()) { return error(); }
    +  return first.at_end();
    +}
    +
    +
    +simdjson_inline int32_t simdjson_result::current_depth() const noexcept {
    +  if (error()) { return error(); }
    +  return first.current_depth();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json_token();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +
    +} // namespace simdjson
    +
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +simdjson_inline document_reference::document_reference() noexcept : doc{nullptr} {}
    +simdjson_inline document_reference::document_reference(document &d) noexcept : doc(&d) {}
    +simdjson_inline void document_reference::rewind() noexcept { doc->rewind(); }
    +simdjson_inline simdjson_result document_reference::get_array() & noexcept { return doc->get_array(); }
    +simdjson_inline simdjson_result document_reference::get_object() & noexcept { return doc->get_object(); }
    +/**
    + * The document_reference instances are used primarily/solely for streams of JSON
    + * documents.
    + * We decided that calling 'get_double()' on the JSON document '1.233 blabla' should
    + * give an error, so we check for trailing content.
    + *
    + * However, for streams of JSON documents, we want to be able to start from
    + * "321" "321" "321"
    + * and parse it successfully as a stream of JSON documents, calling get_uint64_in_string()
    + * successfully each time.
    + *
    + * To achieve this result, we pass a 'false' to a get_root_value_iterator() method:
    + * this indicates that we allow trailing content.
    + */
    +simdjson_inline simdjson_result document_reference::get_uint64() noexcept { return doc->get_root_value_iterator().get_root_uint64(false); }
    +simdjson_inline simdjson_result document_reference::get_uint64_in_string() noexcept { return doc->get_root_value_iterator().get_root_uint64_in_string(false); }
    +simdjson_inline simdjson_result document_reference::get_int64() noexcept { return doc->get_root_value_iterator().get_root_int64(false); }
    +simdjson_inline simdjson_result document_reference::get_int64_in_string() noexcept { return doc->get_root_value_iterator().get_root_int64_in_string(false); }
    +simdjson_inline simdjson_result document_reference::get_double() noexcept { return doc->get_root_value_iterator().get_root_double(false); }
    +simdjson_inline simdjson_result document_reference::get_double_in_string() noexcept { return doc->get_root_value_iterator().get_root_double(false); }
    +simdjson_inline simdjson_result document_reference::get_string(bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(false, allow_replacement); }
    +template 
    +simdjson_inline error_code document_reference::get_string(string_type& receiver, bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(receiver, false, allow_replacement); }
    +simdjson_inline simdjson_result document_reference::get_wobbly_string() noexcept { return doc->get_root_value_iterator().get_root_wobbly_string(false); }
    +simdjson_inline simdjson_result document_reference::get_raw_json_string() noexcept { return doc->get_root_value_iterator().get_root_raw_json_string(false); }
    +simdjson_inline simdjson_result document_reference::get_bool() noexcept { return doc->get_root_value_iterator().get_root_bool(false); }
    +simdjson_inline simdjson_result document_reference::get_value() noexcept { return doc->get_value(); }
    +simdjson_inline simdjson_result document_reference::is_null() noexcept { return doc->get_root_value_iterator().is_root_null(false); }
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline document_reference::operator array() & noexcept(false) { return array(*doc); }
    +simdjson_inline document_reference::operator object() & noexcept(false) { return object(*doc); }
    +simdjson_inline document_reference::operator uint64_t() noexcept(false) { return get_uint64(); }
    +simdjson_inline document_reference::operator int64_t() noexcept(false) { return get_int64(); }
    +simdjson_inline document_reference::operator double() noexcept(false) { return get_double(); }
    +simdjson_inline document_reference::operator std::string_view() noexcept(false) { return std::string_view(*doc); }
    +simdjson_inline document_reference::operator raw_json_string() noexcept(false) { return raw_json_string(*doc); }
    +simdjson_inline document_reference::operator bool() noexcept(false) { return get_bool(); }
    +simdjson_inline document_reference::operator value() noexcept(false) { return value(*doc); }
    +#endif
    +simdjson_inline simdjson_result document_reference::count_elements() & noexcept { return doc->count_elements(); }
    +simdjson_inline simdjson_result document_reference::count_fields() & noexcept { return doc->count_fields(); }
    +simdjson_inline simdjson_result document_reference::at(size_t index) & noexcept { return doc->at(index); }
    +simdjson_inline simdjson_result document_reference::begin() & noexcept { return doc->begin(); }
    +simdjson_inline simdjson_result document_reference::end() & noexcept { return doc->end(); }
    +simdjson_inline simdjson_result document_reference::find_field(std::string_view key) & noexcept { return doc->find_field(key); }
    +simdjson_inline simdjson_result document_reference::find_field(const char *key) & noexcept { return doc->find_field(key); }
    +simdjson_inline simdjson_result document_reference::operator[](std::string_view key) & noexcept { return (*doc)[key]; }
    +simdjson_inline simdjson_result document_reference::operator[](const char *key) & noexcept { return (*doc)[key]; }
    +simdjson_inline simdjson_result document_reference::find_field_unordered(std::string_view key) & noexcept { return doc->find_field_unordered(key); }
    +simdjson_inline simdjson_result document_reference::find_field_unordered(const char *key) & noexcept { return doc->find_field_unordered(key); }
    +simdjson_inline simdjson_result document_reference::type() noexcept { return doc->type(); }
    +simdjson_inline simdjson_result document_reference::is_scalar() noexcept { return doc->is_scalar(); }
    +simdjson_inline simdjson_result document_reference::current_location() noexcept { return doc->current_location(); }
    +simdjson_inline int32_t document_reference::current_depth() const noexcept { return doc->current_depth(); }
    +simdjson_inline bool document_reference::is_negative() noexcept { return doc->is_negative(); }
    +simdjson_inline simdjson_result document_reference::is_integer() noexcept { return doc->get_root_value_iterator().is_root_integer(false); }
    +simdjson_inline simdjson_result document_reference::get_number_type() noexcept { return doc->get_root_value_iterator().get_root_number_type(false); }
    +simdjson_inline simdjson_result document_reference::get_number() noexcept { return doc->get_root_value_iterator().get_root_number(false); }
    +simdjson_inline simdjson_result document_reference::raw_json_token() noexcept { return doc->raw_json_token(); }
    +simdjson_inline simdjson_result document_reference::at_pointer(std::string_view json_pointer) noexcept { return doc->at_pointer(json_pointer); }
    +simdjson_inline simdjson_result document_reference::raw_json() noexcept { return doc->raw_json();}
    +simdjson_inline document_reference::operator document&() const noexcept { return *doc; }
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +
    +
    +namespace simdjson {
    +simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::document_reference value, error_code error)
    +  noexcept : implementation_simdjson_result_base(std::forward(value), error) {}
    +
    +
    +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline error_code simdjson_result::rewind() noexcept {
    +  if (error()) { return error(); }
    +  first.rewind();
    +  return SUCCESS;
    +}
    +simdjson_inline simdjson_result simdjson_result::begin() & noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() & noexcept {
    +  return {};
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_array();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_object();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_bool();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_value() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_value();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_null() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_null();
    +}
    +simdjson_inline simdjson_result simdjson_result::type() noexcept {
    +  if (error()) { return error(); }
    +  return first.type();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_scalar();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_negative() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_negative();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_integer();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number_type();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number();
    +}
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline simdjson_result::operator fallback::ondemand::array() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator fallback::ondemand::object() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator int64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator double() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator fallback::ondemand::raw_json_string() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator bool() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator fallback::ondemand::value() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +#endif
    +
    +simdjson_inline simdjson_result simdjson_result::current_location() noexcept {
    +  if (error()) { return error(); }
    +  return first.current_location();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json_token();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H
    +/* end file simdjson/generic/ondemand/document-inl.h for fallback */
    +/* including simdjson/generic/ondemand/document_stream-inl.h for fallback: #include "simdjson/generic/ondemand/document_stream-inl.h" */
    +/* begin file simdjson/generic/ondemand/document_stream-inl.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document_stream.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +
    +inline void stage1_worker::finish() {
    +  // After calling "run" someone would call finish() to wait
    +  // for the end of the processing.
    +  // This function will wait until either the thread has done
    +  // the processing or, else, the destructor has been called.
    +  std::unique_lock lock(locking_mutex);
    +  cond_var.wait(lock, [this]{return has_work == false;});
    +}
    +
    +inline stage1_worker::~stage1_worker() {
    +  // The thread may never outlive the stage1_worker instance
    +  // and will always be stopped/joined before the stage1_worker
    +  // instance is gone.
    +  stop_thread();
    +}
    +
    +inline void stage1_worker::start_thread() {
    +  std::unique_lock lock(locking_mutex);
    +  if(thread.joinable()) {
    +    return; // This should never happen but we never want to create more than one thread.
    +  }
    +  thread = std::thread([this]{
    +      while(true) {
    +        std::unique_lock thread_lock(locking_mutex);
    +        // We wait for either "run" or "stop_thread" to be called.
    +        cond_var.wait(thread_lock, [this]{return has_work || !can_work;});
    +        // If, for some reason, the stop_thread() method was called (i.e., the
    +        // destructor of stage1_worker is called, then we want to immediately destroy
    +        // the thread (and not do any more processing).
    +        if(!can_work) {
    +          break;
    +        }
    +        this->owner->stage1_thread_error = this->owner->run_stage1(*this->stage1_thread_parser,
    +              this->_next_batch_start);
    +        this->has_work = false;
    +        // The condition variable call should be moved after thread_lock.unlock() for performance
    +        // reasons but thread sanitizers may report it as a data race if we do.
    +        // See https://stackoverflow.com/questions/35775501/c-should-condition-variable-be-notified-under-lock
    +        cond_var.notify_one(); // will notify "finish"
    +        thread_lock.unlock();
    +      }
    +    }
    +  );
    +}
    +
    +
    +inline void stage1_worker::stop_thread() {
    +  std::unique_lock lock(locking_mutex);
    +  // We have to make sure that all locks can be released.
    +  can_work = false;
    +  has_work = false;
    +  cond_var.notify_all();
    +  lock.unlock();
    +  if(thread.joinable()) {
    +    thread.join();
    +  }
    +}
    +
    +inline void stage1_worker::run(document_stream * ds, parser * stage1, size_t next_batch_start) {
    +  std::unique_lock lock(locking_mutex);
    +  owner = ds;
    +  _next_batch_start = next_batch_start;
    +  stage1_thread_parser = stage1;
    +  has_work = true;
    +  // The condition variable call should be moved after thread_lock.unlock() for performance
    +  // reasons but thread sanitizers may report it as a data race if we do.
    +  // See https://stackoverflow.com/questions/35775501/c-should-condition-variable-be-notified-under-lock
    +  cond_var.notify_one(); // will notify the thread lock that we have work
    +  lock.unlock();
    +}
    +
    +#endif  // SIMDJSON_THREADS_ENABLED
    +
    +simdjson_inline document_stream::document_stream(
    +  ondemand::parser &_parser,
    +  const uint8_t *_buf,
    +  size_t _len,
    +  size_t _batch_size,
    +  bool _allow_comma_separated
    +) noexcept
    +  : parser{&_parser},
    +    buf{_buf},
    +    len{_len},
    +    batch_size{_batch_size <= MINIMAL_BATCH_SIZE ? MINIMAL_BATCH_SIZE : _batch_size},
    +    allow_comma_separated{_allow_comma_separated},
    +    error{SUCCESS}
    +    #ifdef SIMDJSON_THREADS_ENABLED
    +    , use_thread(_parser.threaded) // we need to make a copy because _parser.threaded can change
    +    #endif
    +{
    +#ifdef SIMDJSON_THREADS_ENABLED
    +  if(worker.get() == nullptr) {
    +    error = MEMALLOC;
    +  }
    +#endif
    +}
    +
    +simdjson_inline document_stream::document_stream() noexcept
    +  : parser{nullptr},
    +    buf{nullptr},
    +    len{0},
    +    batch_size{0},
    +    allow_comma_separated{false},
    +    error{UNINITIALIZED}
    +    #ifdef SIMDJSON_THREADS_ENABLED
    +    , use_thread(false)
    +    #endif
    +{
    +}
    +
    +simdjson_inline document_stream::~document_stream() noexcept
    +{
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  worker.reset();
    +  #endif
    +}
    +
    +inline size_t document_stream::size_in_bytes() const noexcept {
    +  return len;
    +}
    +
    +inline size_t document_stream::truncated_bytes() const noexcept {
    +  if(error == CAPACITY) { return len - batch_start; }
    +  return parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] - parser->implementation->structural_indexes[parser->implementation->n_structural_indexes + 1];
    +}
    +
    +simdjson_inline document_stream::iterator::iterator() noexcept
    +  : stream{nullptr}, finished{true} {
    +}
    +
    +simdjson_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept
    +  : stream{_stream}, finished{is_end} {
    +}
    +
    +simdjson_inline simdjson_result document_stream::iterator::operator*() noexcept {
    +  //if(stream->error) { return stream->error; }
    +  return simdjson_result(stream->doc, stream->error);
    +}
    +
    +simdjson_inline document_stream::iterator& document_stream::iterator::operator++() noexcept {
    +  // If there is an error, then we want the iterator
    +  // to be finished, no matter what. (E.g., we do not
    +  // keep generating documents with errors, or go beyond
    +  // a document with errors.)
    +  //
    +  // Users do not have to call "operator*()" when they use operator++,
    +  // so we need to end the stream in the operator++ function.
    +  //
    +  // Note that setting finished = true is essential otherwise
    +  // we would enter an infinite loop.
    +  if (stream->error) { finished = true; }
    +  // Note that stream->error() is guarded against error conditions
    +  // (it will immediately return if stream->error casts to false).
    +  // In effect, this next function does nothing when (stream->error)
    +  // is true (hence the risk of an infinite loop).
    +  stream->next();
    +  // If that was the last document, we're finished.
    +  // It is the only type of error we do not want to appear
    +  // in operator*.
    +  if (stream->error == EMPTY) { finished = true; }
    +  // If we had any other kind of error (not EMPTY) then we want
    +  // to pass it along to the operator* and we cannot mark the result
    +  // as "finished" just yet.
    +  return *this;
    +}
    +
    +simdjson_inline bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept {
    +  return finished != other.finished;
    +}
    +
    +simdjson_inline document_stream::iterator document_stream::begin() noexcept {
    +  start();
    +  // If there are no documents, we're finished.
    +  return iterator(this, error == EMPTY);
    +}
    +
    +simdjson_inline document_stream::iterator document_stream::end() noexcept {
    +  return iterator(this, true);
    +}
    +
    +inline void document_stream::start() noexcept {
    +  if (error) { return; }
    +  error = parser->allocate(batch_size);
    +  if (error) { return; }
    +  // Always run the first stage 1 parse immediately
    +  batch_start = 0;
    +  error = run_stage1(*parser, batch_start);
    +  while(error == EMPTY) {
    +    // In exceptional cases, we may start with an empty block
    +    batch_start = next_batch_start();
    +    if (batch_start >= len) { return; }
    +    error = run_stage1(*parser, batch_start);
    +  }
    +  if (error) { return; }
    +  doc_index = batch_start;
    +  doc = document(json_iterator(&buf[batch_start], parser));
    +  doc.iter._streaming = true;
    +
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  if (use_thread && next_batch_start() < len) {
    +    // Kick off the first thread on next batch if needed
    +    error = stage1_thread_parser.allocate(batch_size);
    +    if (error) { return; }
    +    worker->start_thread();
    +    start_stage1_thread();
    +    if (error) { return; }
    +  }
    +  #endif // SIMDJSON_THREADS_ENABLED
    +}
    +
    +inline void document_stream::next() noexcept {
    +  // We always enter at once once in an error condition.
    +  if (error) { return; }
    +  next_document();
    +  if (error) { return; }
    +  auto cur_struct_index = doc.iter._root - parser->implementation->structural_indexes.get();
    +  doc_index = batch_start + parser->implementation->structural_indexes[cur_struct_index];
    +
    +  // Check if at end of structural indexes (i.e. at end of batch)
    +  if(cur_struct_index >= static_cast(parser->implementation->n_structural_indexes)) {
    +    error = EMPTY;
    +    // Load another batch (if available)
    +    while (error == EMPTY) {
    +      batch_start = next_batch_start();
    +      if (batch_start >= len) { break; }
    +      #ifdef SIMDJSON_THREADS_ENABLED
    +      if(use_thread) {
    +        load_from_stage1_thread();
    +      } else {
    +        error = run_stage1(*parser, batch_start);
    +      }
    +      #else
    +      error = run_stage1(*parser, batch_start);
    +      #endif
    +      /**
    +       * Whenever we move to another window, we need to update all pointers to make
    +       * it appear as if the input buffer started at the beginning of the window.
    +       *
    +       * Take this input:
    +       *
    +       * {"z":5}  {"1":1,"2":2,"4":4} [7,  10,   9]  [15,  11,   12, 13]  [154,  110,   112, 1311]
    +       *
    +       * Say you process the following window...
    +       *
    +       * '{"z":5}  {"1":1,"2":2,"4":4} [7,  10,   9]'
    +       *
    +       * When you do so, the json_iterator has a pointer at the beginning of the memory region
    +       * (pointing at the beginning of '{"z"...'.
    +       *
    +       * When you move to the window that starts at...
    +       *
    +       * '[7,  10,   9]  [15,  11,   12, 13] ...
    +       *
    +       * then it is not sufficient to just run stage 1. You also need to re-anchor the
    +       * json_iterator so that it believes we are starting at '[7,  10,   9]...'.
    +       *
    +       * Under the DOM front-end, this gets done automatically because the parser owns
    +       * the pointer the data, and when you call stage1 and then stage2 on the same
    +       * parser, then stage2 will run on the pointer acquired by stage1.
    +       *
    +       * That is, stage1 calls "this->buf = _buf" so the parser remembers the buffer that
    +       * we used. But json_iterator has no callback when stage1 is called on the parser.
    +       * In fact, I think that the parser is unaware of json_iterator.
    +       *
    +       *
    +       * So we need to re-anchor the json_iterator after each call to stage 1 so that
    +       * all of the pointers are in sync.
    +       */
    +      doc.iter = json_iterator(&buf[batch_start], parser);
    +      doc.iter._streaming = true;
    +      /**
    +       * End of resync.
    +       */
    +
    +      if (error) { continue; } // If the error was EMPTY, we may want to load another batch.
    +      doc_index = batch_start;
    +    }
    +  }
    +}
    +
    +inline void document_stream::next_document() noexcept {
    +  // Go to next place where depth=0 (document depth)
    +  error = doc.iter.skip_child(0);
    +  if (error) { return; }
    +  // Always set depth=1 at the start of document
    +  doc.iter._depth = 1;
    +  // consume comma if comma separated is allowed
    +  if (allow_comma_separated) { doc.iter.consume_character(','); }
    +  // Resets the string buffer at the beginning, thus invalidating the strings.
    +  doc.iter._string_buf_loc = parser->string_buf.get();
    +  doc.iter._root = doc.iter.position();
    +}
    +
    +inline size_t document_stream::next_batch_start() const noexcept {
    +  return batch_start + parser->implementation->structural_indexes[parser->implementation->n_structural_indexes];
    +}
    +
    +inline error_code document_stream::run_stage1(ondemand::parser &p, size_t _batch_start) noexcept {
    +  // This code only updates the structural index in the parser, it does not update any json_iterator
    +  // instance.
    +  size_t remaining = len - _batch_start;
    +  if (remaining <= batch_size) {
    +    return p.implementation->stage1(&buf[_batch_start], remaining, stage1_mode::streaming_final);
    +  } else {
    +    return p.implementation->stage1(&buf[_batch_start], batch_size, stage1_mode::streaming_partial);
    +  }
    +}
    +
    +simdjson_inline size_t document_stream::iterator::current_index() const noexcept {
    +  return stream->doc_index;
    +}
    +
    +simdjson_inline std::string_view document_stream::iterator::source() const noexcept {
    +  auto depth = stream->doc.iter.depth();
    +  auto cur_struct_index = stream->doc.iter._root - stream->parser->implementation->structural_indexes.get();
    +
    +  // If at root, process the first token to determine if scalar value
    +  if (stream->doc.iter.at_root()) {
    +    switch (stream->buf[stream->batch_start + stream->parser->implementation->structural_indexes[cur_struct_index]]) {
    +      case '{': case '[':   // Depth=1 already at start of document
    +        break;
    +      case '}': case ']':
    +        depth--;
    +        break;
    +      default:    // Scalar value document
    +        // TODO: Remove any trailing whitespaces
    +        // This returns a string spanning from start of value to the beginning of the next document (excluded)
    +        return std::string_view(reinterpret_cast(stream->buf) + current_index(), stream->parser->implementation->structural_indexes[++cur_struct_index] - current_index() - 1);
    +    }
    +    cur_struct_index++;
    +  }
    +
    +  while (cur_struct_index <= static_cast(stream->parser->implementation->n_structural_indexes)) {
    +    switch (stream->buf[stream->batch_start + stream->parser->implementation->structural_indexes[cur_struct_index]]) {
    +      case '{': case '[':
    +        depth++;
    +        break;
    +      case '}': case ']':
    +        depth--;
    +        break;
    +    }
    +    if (depth == 0) { break; }
    +    cur_struct_index++;
    +  }
    +
    +  return std::string_view(reinterpret_cast(stream->buf) + current_index(), stream->parser->implementation->structural_indexes[cur_struct_index] - current_index() + stream->batch_start + 1);;
    +}
    +
    +inline error_code document_stream::iterator::error() const noexcept {
    +  return stream->error;
    +}
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +
    +inline void document_stream::load_from_stage1_thread() noexcept {
    +  worker->finish();
    +  // Swap to the parser that was loaded up in the thread. Make sure the parser has
    +  // enough memory to swap to, as well.
    +  std::swap(stage1_thread_parser,*parser);
    +  error = stage1_thread_error;
    +  if (error) { return; }
    +
    +  // If there's anything left, start the stage 1 thread!
    +  if (next_batch_start() < len) {
    +    start_stage1_thread();
    +  }
    +}
    +
    +inline void document_stream::start_stage1_thread() noexcept {
    +  // we call the thread on a lambda that will update
    +  // this->stage1_thread_error
    +  // there is only one thread that may write to this value
    +  // TODO this is NOT exception-safe.
    +  this->stage1_thread_error = UNINITIALIZED; // In case something goes wrong, make sure it's an error
    +  size_t _next_batch_start = this->next_batch_start();
    +
    +  worker->run(this, & this->stage1_thread_parser, _next_batch_start);
    +}
    +
    +#endif // SIMDJSON_THREADS_ENABLED
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(error)
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  fallback::ondemand::document_stream &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +
    +}
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H
    +/* end file simdjson/generic/ondemand/document_stream-inl.h for fallback */
    +/* including simdjson/generic/ondemand/field-inl.h for fallback: #include "simdjson/generic/ondemand/field-inl.h" */
    +/* begin file simdjson/generic/ondemand/field-inl.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/field.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +// clang 6 doesn't think the default constructor can be noexcept, so we make it explicit
    +simdjson_inline field::field() noexcept : std::pair() {}
    +
    +simdjson_inline field::field(raw_json_string key, ondemand::value &&value) noexcept
    +  : std::pair(key, std::forward(value))
    +{
    +}
    +
    +simdjson_inline simdjson_result field::start(value_iterator &parent_iter) noexcept {
    +  raw_json_string key;
    +  SIMDJSON_TRY( parent_iter.field_key().get(key) );
    +  SIMDJSON_TRY( parent_iter.field_value() );
    +  return field::start(parent_iter, key);
    +}
    +
    +simdjson_inline simdjson_result field::start(const value_iterator &parent_iter, raw_json_string key) noexcept {
    +    return field(key, parent_iter.child());
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result field::unescaped_key(bool allow_replacement) noexcept {
    +  SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() but Visual Studio won't let us.
    +  simdjson_result answer = first.unescape(second.iter.json_iter(), allow_replacement);
    +  first.consume();
    +  return answer;
    +}
    +
    +simdjson_inline raw_json_string field::key() const noexcept {
    +  SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() by Visual Studio won't let us.
    +  return first;
    +}
    +
    +simdjson_inline value &field::value() & noexcept {
    +  return second;
    +}
    +
    +simdjson_inline value field::value() && noexcept {
    +  return std::forward(*this).second;
    +}
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  fallback::ondemand::field &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::key() noexcept {
    +  if (error()) { return error(); }
    +  return first.key();
    +}
    +simdjson_inline simdjson_result simdjson_result::unescaped_key(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.unescaped_key(allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::value() noexcept {
    +  if (error()) { return error(); }
    +  return std::move(first.value());
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H
    +/* end file simdjson/generic/ondemand/field-inl.h for fallback */
    +/* including simdjson/generic/ondemand/json_iterator-inl.h for fallback: #include "simdjson/generic/ondemand/json_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/json_iterator-inl.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/logger-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/token_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept
    +  : token(std::forward(other.token)),
    +    parser{other.parser},
    +    _string_buf_loc{other._string_buf_loc},
    +    error{other.error},
    +    _depth{other._depth},
    +    _root{other._root},
    +    _streaming{other._streaming}
    +{
    +  other.parser = nullptr;
    +}
    +simdjson_inline json_iterator &json_iterator::operator=(json_iterator &&other) noexcept {
    +  token = other.token;
    +  parser = other.parser;
    +  _string_buf_loc = other._string_buf_loc;
    +  error = other.error;
    +  _depth = other._depth;
    +  _root = other._root;
    +  _streaming = other._streaming;
    +  other.parser = nullptr;
    +  return *this;
    +}
    +
    +simdjson_inline json_iterator::json_iterator(const uint8_t *buf, ondemand::parser *_parser) noexcept
    +  : token(buf, &_parser->implementation->structural_indexes[0]),
    +    parser{_parser},
    +    _string_buf_loc{parser->string_buf.get()},
    +    _depth{1},
    +    _root{parser->implementation->structural_indexes.get()},
    +    _streaming{false}
    +
    +{
    +  logger::log_headers();
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens();
    +#endif
    +}
    +
    +inline void json_iterator::rewind() noexcept {
    +  token.set_position( root_position() );
    +  logger::log_headers(); // We start again
    +  _string_buf_loc = parser->string_buf.get();
    +  _depth = 1;
    +}
    +
    +inline bool json_iterator::balanced() const noexcept {
    +  token_iterator ti(token);
    +  int32_t count{0};
    +  ti.set_position( root_position() );
    +  while(ti.peek() <= peek_last()) {
    +    switch (*ti.return_current_and_advance())
    +    {
    +    case '[': case '{':
    +      count++;
    +      break;
    +    case ']': case '}':
    +      count--;
    +      break;
    +    default:
    +      break;
    +    }
    +  }
    +  return count == 0;
    +}
    +
    +
    +// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller
    +// relating depth and parent_depth, which is a desired effect. The warning does not show up if the
    +// skip_child() function is not marked inline).
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_warn_unused simdjson_inline error_code json_iterator::skip_child(depth_t parent_depth) noexcept {
    +  if (depth() <= parent_depth) { return SUCCESS; }
    +  switch (*return_current_and_advance()) {
    +    // TODO consider whether matching braces is a requirement: if non-matching braces indicates
    +    // *missing* braces, then future lookups are not in the object/arrays they think they are,
    +    // violating the rule "validate enough structure that the user can be confident they are
    +    // looking at the right values."
    +    // PERF TODO we can eliminate the switch here with a lookup of how much to add to depth
    +
    +    // For the first open array/object in a value, we've already incremented depth, so keep it the same
    +    // We never stop at colon, but if we did, it wouldn't affect depth
    +    case '[': case '{': case ':':
    +      logger::log_start_value(*this, "skip");
    +      break;
    +    // If there is a comma, we have just finished a value in an array/object, and need to get back in
    +    case ',':
    +      logger::log_value(*this, "skip");
    +      break;
    +    // ] or } means we just finished a value and need to jump out of the array/object
    +    case ']': case '}':
    +      logger::log_end_value(*this, "skip");
    +      _depth--;
    +      if (depth() <= parent_depth) { return SUCCESS; }
    +#if SIMDJSON_CHECK_EOF
    +      // If there are no more tokens, the parent is incomplete.
    +      if (at_end()) { return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "Missing [ or { at start"); }
    +#endif // SIMDJSON_CHECK_EOF
    +      break;
    +    case '"':
    +      if(*peek() == ':') {
    +        // We are at a key!!!
    +        // This might happen if you just started an object and you skip it immediately.
    +        // Performance note: it would be nice to get rid of this check as it is somewhat
    +        // expensive.
    +        // https://github.com/simdjson/simdjson/issues/1742
    +        logger::log_value(*this, "key");
    +        return_current_and_advance(); // eat up the ':'
    +        break; // important!!!
    +      }
    +      simdjson_fallthrough;
    +    // Anything else must be a scalar value
    +    default:
    +      // For the first scalar, we will have incremented depth already, so we decrement it here.
    +      logger::log_value(*this, "skip");
    +      _depth--;
    +      if (depth() <= parent_depth) { return SUCCESS; }
    +      break;
    +  }
    +
    +  // Now that we've considered the first value, we only increment/decrement for arrays/objects
    +  while (position() < end_position()) {
    +    switch (*return_current_and_advance()) {
    +      case '[': case '{':
    +        logger::log_start_value(*this, "skip");
    +        _depth++;
    +        break;
    +      // TODO consider whether matching braces is a requirement: if non-matching braces indicates
    +      // *missing* braces, then future lookups are not in the object/arrays they think they are,
    +      // violating the rule "validate enough structure that the user can be confident they are
    +      // looking at the right values."
    +      // PERF TODO we can eliminate the switch here with a lookup of how much to add to depth
    +      case ']': case '}':
    +        logger::log_end_value(*this, "skip");
    +        _depth--;
    +        if (depth() <= parent_depth) { return SUCCESS; }
    +        break;
    +      default:
    +        logger::log_value(*this, "skip", "");
    +        break;
    +    }
    +  }
    +
    +  return report_error(TAPE_ERROR, "not enough close braces");
    +}
    +
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_inline bool json_iterator::at_root() const noexcept {
    +  return position() == root_position();
    +}
    +
    +simdjson_inline bool json_iterator::is_single_token() const noexcept {
    +  return parser->implementation->n_structural_indexes == 1;
    +}
    +
    +simdjson_inline bool json_iterator::streaming() const noexcept {
    +  return _streaming;
    +}
    +
    +simdjson_inline token_position json_iterator::root_position() const noexcept {
    +  return _root;
    +}
    +
    +simdjson_inline void json_iterator::assert_at_document_depth() const noexcept {
    +  SIMDJSON_ASSUME( _depth == 1 );
    +}
    +
    +simdjson_inline void json_iterator::assert_at_root() const noexcept {
    +  SIMDJSON_ASSUME( _depth == 1 );
    +#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
    +  // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument
    +  // has side effects that will be discarded.
    +  SIMDJSON_ASSUME( token.position() == _root );
    +#endif
    +}
    +
    +simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) const noexcept {
    +  assert_valid_position(token._position + required_tokens - 1);
    +}
    +
    +simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept {
    +#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
    +  SIMDJSON_ASSUME( position >= &parser->implementation->structural_indexes[0] );
    +  SIMDJSON_ASSUME( position < &parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] );
    +#endif
    +}
    +
    +simdjson_inline bool json_iterator::at_end() const noexcept {
    +  return position() == end_position();
    +}
    +simdjson_inline token_position json_iterator::end_position() const noexcept {
    +  uint32_t n_structural_indexes{parser->implementation->n_structural_indexes};
    +  return &parser->implementation->structural_indexes[n_structural_indexes];
    +}
    +
    +inline std::string json_iterator::to_string() const noexcept {
    +  if( !is_alive() ) { return "dead json_iterator instance"; }
    +  const char * current_structural = reinterpret_cast(token.peek());
    +  return std::string("json_iterator [ depth : ") + std::to_string(_depth)
    +          + std::string(", structural : '") + std::string(current_structural,1)
    +          + std::string("', offset : ") + std::to_string(token.current_offset())
    +          + std::string("', error : ") + error_message(error)
    +          + std::string(" ]");
    +}
    +
    +inline simdjson_result json_iterator::current_location() const noexcept {
    +  if (!is_alive()) {    // Unrecoverable error
    +    if (!at_root()) {
    +      return reinterpret_cast(token.peek(-1));
    +    } else {
    +      return reinterpret_cast(token.peek());
    +    }
    +  }
    +  if (at_end()) {
    +    return OUT_OF_BOUNDS;
    +  }
    +  return reinterpret_cast(token.peek());
    +}
    +
    +simdjson_inline bool json_iterator::is_alive() const noexcept {
    +  return parser;
    +}
    +
    +simdjson_inline void json_iterator::abandon() noexcept {
    +  parser = nullptr;
    +  _depth = 0;
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::return_current_and_advance() noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens();
    +#endif // SIMDJSON_CHECK_EOF
    +  return token.return_current_and_advance();
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::unsafe_pointer() const noexcept {
    +  // deliberately done without safety guard:
    +  return token.peek();
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::peek(int32_t delta) const noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens(delta+1);
    +#endif // SIMDJSON_CHECK_EOF
    +  return token.peek(delta);
    +}
    +
    +simdjson_inline uint32_t json_iterator::peek_length(int32_t delta) const noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens(delta+1);
    +#endif // #if SIMDJSON_CHECK_EOF
    +  return token.peek_length(delta);
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::peek(token_position position) const noexcept {
    +  // todo: currently we require end-of-string buffering, but the following
    +  // assert_valid_position should be turned on if/when we lift that condition.
    +  // assert_valid_position(position);
    +  // This is almost surely related to SIMDJSON_CHECK_EOF but given that SIMDJSON_CHECK_EOF
    +  // is ON by default, we have no choice but to disable it for real with a comment.
    +  return token.peek(position);
    +}
    +
    +simdjson_inline uint32_t json_iterator::peek_length(token_position position) const noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_valid_position(position);
    +#endif // SIMDJSON_CHECK_EOF
    +  return token.peek_length(position);
    +}
    +
    +simdjson_inline token_position json_iterator::last_position() const noexcept {
    +  // The following line fails under some compilers...
    +  // SIMDJSON_ASSUME(parser->implementation->n_structural_indexes > 0);
    +  // since it has side-effects.
    +  uint32_t n_structural_indexes{parser->implementation->n_structural_indexes};
    +  SIMDJSON_ASSUME(n_structural_indexes > 0);
    +  return &parser->implementation->structural_indexes[n_structural_indexes - 1];
    +}
    +simdjson_inline const uint8_t *json_iterator::peek_last() const noexcept {
    +  return token.peek(last_position());
    +}
    +
    +simdjson_inline void json_iterator::ascend_to(depth_t parent_depth) noexcept {
    +  SIMDJSON_ASSUME(parent_depth >= 0 && parent_depth < INT32_MAX - 1);
    +  SIMDJSON_ASSUME(_depth == parent_depth + 1);
    +  _depth = parent_depth;
    +}
    +
    +simdjson_inline void json_iterator::descend_to(depth_t child_depth) noexcept {
    +  SIMDJSON_ASSUME(child_depth >= 1 && child_depth < INT32_MAX);
    +  SIMDJSON_ASSUME(_depth == child_depth - 1);
    +  _depth = child_depth;
    +}
    +
    +simdjson_inline depth_t json_iterator::depth() const noexcept {
    +  return _depth;
    +}
    +
    +simdjson_inline uint8_t *&json_iterator::string_buf_loc() noexcept {
    +  return _string_buf_loc;
    +}
    +
    +simdjson_inline error_code json_iterator::report_error(error_code _error, const char *message) noexcept {
    +  SIMDJSON_ASSUME(_error != SUCCESS && _error != UNINITIALIZED && _error != INCORRECT_TYPE && _error != NO_SUCH_FIELD);
    +  logger::log_error(*this, message);
    +  error = _error;
    +  return error;
    +}
    +
    +simdjson_inline token_position json_iterator::position() const noexcept {
    +  return token.position();
    +}
    +
    +simdjson_inline simdjson_result json_iterator::unescape(raw_json_string in, bool allow_replacement) noexcept {
    +  return parser->unescape(in, _string_buf_loc, allow_replacement);
    +}
    +
    +simdjson_inline simdjson_result json_iterator::unescape_wobbly(raw_json_string in) noexcept {
    +  return parser->unescape_wobbly(in, _string_buf_loc);
    +}
    +
    +simdjson_inline void json_iterator::reenter_child(token_position position, depth_t child_depth) noexcept {
    +  SIMDJSON_ASSUME(child_depth >= 1 && child_depth < INT32_MAX);
    +  SIMDJSON_ASSUME(_depth == child_depth - 1);
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
    +  SIMDJSON_ASSUME(size_t(child_depth) < parser->max_depth());
    +  SIMDJSON_ASSUME(position >= parser->start_positions[child_depth]);
    +#endif
    +#endif
    +  token.set_position(position);
    +  _depth = child_depth;
    +}
    +
    +simdjson_inline error_code json_iterator::consume_character(char c) noexcept {
    +  if (*peek() == c) {
    +    return_current_and_advance();
    +    return SUCCESS;
    +  }
    +  return TAPE_ERROR;
    +}
    +
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +
    +simdjson_inline token_position json_iterator::start_position(depth_t depth) const noexcept {
    +  SIMDJSON_ASSUME(size_t(depth) < parser->max_depth());
    +  return size_t(depth) < parser->max_depth() ? parser->start_positions[depth] : 0;
    +}
    +
    +simdjson_inline void json_iterator::set_start_position(depth_t depth, token_position position) noexcept {
    +  SIMDJSON_ASSUME(size_t(depth) < parser->max_depth());
    +  if(size_t(depth) < parser->max_depth()) { parser->start_positions[depth] = position; }
    +}
    +
    +#endif
    +
    +
    +simdjson_inline error_code json_iterator::optional_error(error_code _error, const char *message) noexcept {
    +  SIMDJSON_ASSUME(_error == INCORRECT_TYPE || _error == NO_SUCH_FIELD);
    +  logger::log_error(*this, message);
    +  return _error;
    +}
    +
    +
    +simdjson_warn_unused simdjson_inline bool json_iterator::copy_to_buffer(const uint8_t *json, uint32_t max_len, uint8_t *tmpbuf, size_t N) noexcept {
    +  // This function is not expected to be called in performance-sensitive settings.
    +  // Let us guard against silly cases:
    +  if((N < max_len) || (N == 0)) { return false; }
    +  // Copy to the buffer.
    +  std::memcpy(tmpbuf, json, max_len);
    +  if(N > max_len) { // We pad whatever remains with ' '.
    +    std::memset(tmpbuf + max_len, ' ', N - max_len);
    +  }
    +  return true;
    +}
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::json_iterator &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/json_iterator-inl.h for fallback */
    +/* including simdjson/generic/ondemand/json_type-inl.h for fallback: #include "simdjson/generic/ondemand/json_type-inl.h" */
    +/* begin file simdjson/generic/ondemand/json_type-inl.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +inline std::ostream& operator<<(std::ostream& out, json_type type) noexcept {
    +    switch (type) {
    +        case json_type::array: out << "array"; break;
    +        case json_type::object: out << "object"; break;
    +        case json_type::number: out << "number"; break;
    +        case json_type::string: out << "string"; break;
    +        case json_type::boolean: out << "boolean"; break;
    +        case json_type::null: out << "null"; break;
    +        default: SIMDJSON_UNREACHABLE();
    +    }
    +    return out;
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false) {
    +    return out << type.value();
    +}
    +#endif
    +
    +
    +
    +simdjson_inline number_type number::get_number_type() const noexcept {
    +  return type;
    +}
    +
    +simdjson_inline bool number::is_uint64() const noexcept {
    +  return get_number_type() == number_type::unsigned_integer;
    +}
    +
    +simdjson_inline uint64_t number::get_uint64() const noexcept {
    +  return payload.unsigned_integer;
    +}
    +
    +simdjson_inline number::operator uint64_t() const noexcept {
    +  return get_uint64();
    +}
    +
    +
    +simdjson_inline bool number::is_int64() const noexcept {
    +  return get_number_type() == number_type::signed_integer;
    +}
    +
    +simdjson_inline int64_t number::get_int64() const noexcept {
    +  return payload.signed_integer;
    +}
    +
    +simdjson_inline number::operator int64_t() const noexcept {
    +  return get_int64();
    +}
    +
    +simdjson_inline bool number::is_double() const noexcept {
    +    return get_number_type() == number_type::floating_point_number;
    +}
    +
    +simdjson_inline double number::get_double() const noexcept {
    +  return payload.floating_point_number;
    +}
    +
    +simdjson_inline number::operator double() const noexcept {
    +  return get_double();
    +}
    +
    +simdjson_inline double number::as_double() const noexcept {
    +  if(is_double()) {
    +    return payload.floating_point_number;
    +  }
    +  if(is_int64()) {
    +    return double(payload.signed_integer);
    +  }
    +  return double(payload.unsigned_integer);
    +}
    +
    +simdjson_inline void number::append_s64(int64_t value) noexcept {
    +  payload.signed_integer = value;
    +  type = number_type::signed_integer;
    +}
    +
    +simdjson_inline void number::append_u64(uint64_t value) noexcept {
    +  payload.unsigned_integer = value;
    +  type = number_type::unsigned_integer;
    +}
    +
    +simdjson_inline void number::append_double(double value) noexcept {
    +  payload.floating_point_number = value;
    +  type = number_type::floating_point_number;
    +}
    +
    +simdjson_inline void number::skip_double() noexcept {
    +  type = number_type::floating_point_number;
    +}
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::json_type &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H
    +/* end file simdjson/generic/ondemand/json_type-inl.h for fallback */
    +/* including simdjson/generic/ondemand/logger-inl.h for fallback: #include "simdjson/generic/ondemand/logger-inl.h" */
    +/* begin file simdjson/generic/ondemand/logger-inl.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/logger.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +namespace logger {
    +
    +static constexpr const char * DASHES = "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------";
    +static constexpr const int LOG_EVENT_LEN = 20;
    +static constexpr const int LOG_BUFFER_LEN = 30;
    +static constexpr const int LOG_SMALL_BUFFER_LEN = 10;
    +static int log_depth = 0; // Not threadsafe. Log only.
    +
    +// Helper to turn unprintable or newline characters into spaces
    +static inline char printable_char(char c) {
    +  if (c >= 0x20) {
    +    return c;
    +  } else {
    +    return ' ';
    +  }
    +}
    +
    +template
    +static inline std::string string_format(const std::string& format, const Args&... args)
    +{
    +  SIMDJSON_PUSH_DISABLE_ALL_WARNINGS
    +  int size_s = std::snprintf(nullptr, 0, format.c_str(), args...) + 1;
    +  auto size = static_cast(size_s);
    +  if (size <= 0) return std::string();
    +  std::unique_ptr buf(new char[size]);
    +  std::snprintf(buf.get(), size, format.c_str(), args...);
    +  SIMDJSON_POP_DISABLE_WARNINGS
    +  return std::string(buf.get(), buf.get() + size - 1);
    +}
    +
    +static inline log_level get_log_level_from_env()
    +{
    +  SIMDJSON_PUSH_DISABLE_WARNINGS
    +  SIMDJSON_DISABLE_DEPRECATED_WARNING // Disable CRT_SECURE warning on MSVC: manually verified this is safe
    +      char *lvl = getenv("SIMDJSON_LOG_LEVEL");
    +  SIMDJSON_POP_DISABLE_WARNINGS
    +  if (lvl && simdjson_strcasecmp(lvl, "ERROR") == 0) { return log_level::error; }
    +  return log_level::info;
    +}
    +
    +static inline log_level log_threshold()
    +{
    +  static log_level threshold = get_log_level_from_env();
    +  return threshold;
    +}
    +
    +static inline bool should_log(log_level level)
    +{
    +  return level >= log_threshold();
    +}
    +
    +inline void log_event(const json_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_line(iter, "", type, detail, delta, depth_delta, log_level::info);
    +}
    +
    +inline void log_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail) noexcept {
    +  log_line(iter, index, depth, "", type, detail, log_level::info);
    +}
    +inline void log_value(const json_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_line(iter, "", type, detail, delta, depth_delta, log_level::info);
    +}
    +
    +inline void log_start_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail) noexcept {
    +  log_line(iter, index, depth, "+", type, detail, log_level::info);
    +  if (LOG_ENABLED) { log_depth++; }
    +}
    +inline void log_start_value(const json_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  log_line(iter, "+", type, "", delta, depth_delta, log_level::info);
    +  if (LOG_ENABLED) { log_depth++; }
    +}
    +
    +inline void log_end_value(const json_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  if (LOG_ENABLED) { log_depth--; }
    +  log_line(iter, "-", type, "", delta, depth_delta, log_level::info);
    +}
    +
    +inline void log_error(const json_iterator &iter, const char *error, const char *detail, int delta, int depth_delta) noexcept {
    +  log_line(iter, "ERROR: ", error, detail, delta, depth_delta, log_level::error);
    +}
    +inline void log_error(const json_iterator &iter, token_position index, depth_t depth, const char *error, const char *detail) noexcept {
    +  log_line(iter, index, depth, "ERROR: ", error, detail, log_level::error);
    +}
    +
    +inline void log_event(const value_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_event(iter.json_iter(), type, detail, delta, depth_delta);
    +}
    +
    +inline void log_value(const value_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_value(iter.json_iter(), type, detail, delta, depth_delta);
    +}
    +
    +inline void log_start_value(const value_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  log_start_value(iter.json_iter(), type, delta, depth_delta);
    +}
    +
    +inline void log_end_value(const value_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  log_end_value(iter.json_iter(), type, delta, depth_delta);
    +}
    +
    +inline void log_error(const value_iterator &iter, const char *error, const char *detail, int delta, int depth_delta) noexcept {
    +  log_error(iter.json_iter(), error, detail, delta, depth_delta);
    +}
    +
    +inline void log_headers() noexcept {
    +  if (LOG_ENABLED) {
    +    if (simdjson_unlikely(should_log(log_level::info))) {
    +      // Technically a static variable is not thread-safe, but if you are using threads and logging... well...
    +      static bool displayed_hint{false};
    +      log_depth = 0;
    +      printf("\n");
    +      if (!displayed_hint) {
    +        // We only print this helpful header once.
    +        printf("# Logging provides the depth and position of the iterator user-visible steps:\n");
    +        printf("# +array says 'this is where we were when we discovered the start array'\n");
    +        printf(
    +            "# -array says 'this is where we were when we ended the array'\n");
    +        printf("# skip says 'this is a structural or value I am skipping'\n");
    +        printf("# +/-skip says 'this is a start/end array or object I am skipping'\n");
    +        printf("#\n");
    +        printf("# The indentation of the terms (array, string,...) indicates the depth,\n");
    +        printf("# in addition to the depth being displayed.\n");
    +        printf("#\n");
    +        printf("# Every token in the document has a single depth determined by the tokens before it,\n");
    +        printf("# and is not affected by what the token actually is.\n");
    +        printf("#\n");
    +        printf("# Not all structural elements are presented as tokens in the logs.\n");
    +        printf("#\n");
    +        printf("# We never give control to the user within an empty array or an empty object.\n");
    +        printf("#\n");
    +        printf("# Inside an array, having a depth greater than the array's depth means that\n");
    +        printf("# we are pointing inside a value.\n");
    +        printf("# Having a depth equal to the array means that we are pointing right before a value.\n");
    +        printf("# Having a depth smaller than the array means that we have moved beyond the array.\n");
    +        displayed_hint = true;
    +      }
    +      printf("\n");
    +      printf("| %-*s ", LOG_EVENT_LEN, "Event");
    +      printf("| %-*s ", LOG_BUFFER_LEN, "Buffer");
    +      printf("| %-*s ", LOG_SMALL_BUFFER_LEN, "Next");
    +      // printf("| %-*s ", 5,                    "Next#");
    +      printf("| %-*s ", 5, "Depth");
    +      printf("| Detail ");
    +      printf("|\n");
    +
    +      printf("|%.*s", LOG_EVENT_LEN + 2, DASHES);
    +      printf("|%.*s", LOG_BUFFER_LEN + 2, DASHES);
    +      printf("|%.*s", LOG_SMALL_BUFFER_LEN + 2, DASHES);
    +      // printf("|%.*s", 5+2, DASHES);
    +      printf("|%.*s", 5 + 2, DASHES);
    +      printf("|--------");
    +      printf("|\n");
    +      fflush(stdout);
    +    }
    +  }
    +}
    +
    +template 
    +inline void log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, log_level level, Args&&... args) noexcept {
    +  log_line(iter, iter.position()+delta, depth_t(iter.depth()+depth_delta), title_prefix, title, detail, level, std::forward(args)...);
    +}
    +
    +template 
    +inline void log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, log_level level, Args&&... args) noexcept {
    +  if (LOG_ENABLED) {
    +    if (simdjson_unlikely(should_log(level))) {
    +      const int indent = depth * 2;
    +      const auto buf = iter.token.buf;
    +      auto msg = string_format(title, std::forward(args)...);
    +      printf("| %*s%s%-*s ", indent, "", title_prefix,
    +             LOG_EVENT_LEN - indent - int(strlen(title_prefix)), msg.c_str());
    +      {
    +        // Print the current structural.
    +        printf("| ");
    +        // Before we begin, the index might point right before the document.
    +        // This could be unsafe, see https://github.com/simdjson/simdjson/discussions/1938
    +        if (index < iter._root) {
    +          printf("%*s", LOG_BUFFER_LEN, "");
    +        } else {
    +          auto current_structural = &buf[*index];
    +          for (int i = 0; i < LOG_BUFFER_LEN; i++) {
    +            printf("%c", printable_char(current_structural[i]));
    +          }
    +        }
    +        printf(" ");
    +      }
    +      {
    +        // Print the next structural.
    +        printf("| ");
    +        auto next_structural = &buf[*(index + 1)];
    +        for (int i = 0; i < LOG_SMALL_BUFFER_LEN; i++) {
    +          printf("%c", printable_char(next_structural[i]));
    +        }
    +        printf(" ");
    +      }
    +      // printf("| %5u ", *(index+1));
    +      printf("| %5i ", depth);
    +      printf("| %6.*s ", int(detail.size()), detail.data());
    +      printf("|\n");
    +      fflush(stdout);
    +    }
    +  }
    +}
    +
    +} // namespace logger
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H
    +/* end file simdjson/generic/ondemand/logger-inl.h for fallback */
    +/* including simdjson/generic/ondemand/object-inl.h for fallback: #include "simdjson/generic/ondemand/object-inl.h" */
    +/* begin file simdjson/generic/ondemand/object-inl.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/field.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +simdjson_inline simdjson_result object::find_field_unordered(const std::string_view key) & noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_unordered_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +simdjson_inline simdjson_result object::find_field_unordered(const std::string_view key) && noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_unordered_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +simdjson_inline simdjson_result object::operator[](const std::string_view key) & noexcept {
    +  return find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result object::operator[](const std::string_view key) && noexcept {
    +  return std::forward(*this).find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result object::find_field(const std::string_view key) & noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +simdjson_inline simdjson_result object::find_field(const std::string_view key) && noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +
    +simdjson_inline simdjson_result object::start(value_iterator &iter) noexcept {
    +  SIMDJSON_TRY( iter.start_object().error() );
    +  return object(iter);
    +}
    +simdjson_inline simdjson_result object::start_root(value_iterator &iter) noexcept {
    +  SIMDJSON_TRY( iter.start_root_object().error() );
    +  return object(iter);
    +}
    +simdjson_inline error_code object::consume() noexcept {
    +  if(iter.is_at_key()) {
    +    /**
    +     * whenever you are pointing at a key, calling skip_child() is
    +     * unsafe because you will hit a string and you will assume that
    +     * it is string value, and this mistake will lead you to make bad
    +     * depth computation.
    +     */
    +    /**
    +     * We want to 'consume' the key. We could really
    +     * just do _json_iter->return_current_and_advance(); at this
    +     * point, but, for clarity, we will use the high-level API to
    +     * eat the key. We assume that the compiler optimizes away
    +     * most of the work.
    +     */
    +    simdjson_unused raw_json_string actual_key;
    +    auto error = iter.field_key().get(actual_key);
    +    if (error) { iter.abandon(); return error; };
    +    // Let us move to the value while we are at it.
    +    if ((error = iter.field_value())) { iter.abandon(); return error; }
    +  }
    +  auto error_skip = iter.json_iter().skip_child(iter.depth()-1);
    +  if(error_skip) { iter.abandon(); }
    +  return error_skip;
    +}
    +
    +simdjson_inline simdjson_result object::raw_json() noexcept {
    +  const uint8_t * starting_point{iter.peek_start()};
    +  auto error = consume();
    +  if(error) { return error; }
    +  const uint8_t * final_point{iter._json_iter->peek()};
    +  return std::string_view(reinterpret_cast(starting_point), size_t(final_point - starting_point));
    +}
    +
    +simdjson_inline simdjson_result object::started(value_iterator &iter) noexcept {
    +  SIMDJSON_TRY( iter.started_object().error() );
    +  return object(iter);
    +}
    +
    +simdjson_inline object object::resume(const value_iterator &iter) noexcept {
    +  return iter;
    +}
    +
    +simdjson_inline object::object(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{
    +}
    +
    +simdjson_inline simdjson_result object::begin() noexcept {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  return object_iterator(iter);
    +}
    +simdjson_inline simdjson_result object::end() noexcept {
    +  return object_iterator(iter);
    +}
    +
    +inline simdjson_result object::at_pointer(std::string_view json_pointer) noexcept {
    +  if (json_pointer[0] != '/') { return INVALID_JSON_POINTER; }
    +  json_pointer = json_pointer.substr(1);
    +  size_t slash = json_pointer.find('/');
    +  std::string_view key = json_pointer.substr(0, slash);
    +  // Grab the child with the given key
    +  simdjson_result child;
    +
    +  // If there is an escape character in the key, unescape it and then get the child.
    +  size_t escape = key.find('~');
    +  if (escape != std::string_view::npos) {
    +    // Unescape the key
    +    std::string unescaped(key);
    +    do {
    +      switch (unescaped[escape+1]) {
    +        case '0':
    +          unescaped.replace(escape, 2, "~");
    +          break;
    +        case '1':
    +          unescaped.replace(escape, 2, "/");
    +          break;
    +        default:
    +          return INVALID_JSON_POINTER; // "Unexpected ~ escape character in JSON pointer");
    +      }
    +      escape = unescaped.find('~', escape+1);
    +    } while (escape != std::string::npos);
    +    child = find_field(unescaped);  // Take note find_field does not unescape keys when matching
    +  } else {
    +    child = find_field(key);
    +  }
    +  if(child.error()) {
    +    return child; // we do not continue if there was an error
    +  }
    +  // If there is a /, we have to recurse and look up more of the path
    +  if (slash != std::string_view::npos) {
    +    child = child.at_pointer(json_pointer.substr(slash));
    +  }
    +  return child;
    +}
    +
    +simdjson_inline simdjson_result object::count_fields() & noexcept {
    +  size_t count{0};
    +  // Important: we do not consume any of the values.
    +  for(simdjson_unused auto v : *this) { count++; }
    +  // The above loop will always succeed, but we want to report errors.
    +  if(iter.error()) { return iter.error(); }
    +  // We need to move back at the start because we expect users to iterate through
    +  // the object after counting the number of elements.
    +  iter.reset_object();
    +  return count;
    +}
    +
    +simdjson_inline simdjson_result object::is_empty() & noexcept {
    +  bool is_not_empty;
    +  auto error = iter.reset_object().get(is_not_empty);
    +  if(error) { return error; }
    +  return !is_not_empty;
    +}
    +
    +simdjson_inline simdjson_result object::reset() & noexcept {
    +  return iter.reset_object();
    +}
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::object &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +simdjson_inline simdjson_result simdjson_result::begin() noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() noexcept {
    +  if (error()) { return error(); }
    +  return first.end();
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first)[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).find_field(key);
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +inline simdjson_result simdjson_result::reset() noexcept {
    +  if (error()) { return error(); }
    +  return first.reset();
    +}
    +
    +inline simdjson_result simdjson_result::is_empty() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_empty();
    +}
    +
    +simdjson_inline  simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +
    +simdjson_inline  simdjson_result simdjson_result::raw_json() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json();
    +}
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H
    +/* end file simdjson/generic/ondemand/object-inl.h for fallback */
    +/* including simdjson/generic/ondemand/object_iterator-inl.h for fallback: #include "simdjson/generic/ondemand/object_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/object_iterator-inl.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/field-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +//
    +// object_iterator
    +//
    +
    +simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{}
    +
    +simdjson_inline simdjson_result object_iterator::operator*() noexcept {
    +  error_code error = iter.error();
    +  if (error) { iter.abandon(); return error; }
    +  auto result = field::start(iter);
    +  // TODO this is a safety rail ... users should exit loops as soon as they receive an error.
    +  // Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free.
    +  if (result.error()) { iter.abandon(); }
    +  return result;
    +}
    +simdjson_inline bool object_iterator::operator==(const object_iterator &other) const noexcept {
    +  return !(*this != other);
    +}
    +simdjson_inline bool object_iterator::operator!=(const object_iterator &) const noexcept {
    +  return iter.is_open();
    +}
    +
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_inline object_iterator &object_iterator::operator++() noexcept {
    +  // TODO this is a safety rail ... users should exit loops as soon as they receive an error.
    +  // Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free.
    +  if (!iter.is_open()) { return *this; } // Iterator will be released if there is an error
    +
    +  simdjson_unused error_code error;
    +  if ((error = iter.skip_child() )) { return *this; }
    +
    +  simdjson_unused bool has_value;
    +  if ((error = iter.has_next_field().get(has_value) )) { return *this; };
    +  return *this;
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +//
    +// ### Live States
    +//
    +// While iterating or looking up values, depth >= iter.depth. at_start may vary. Error is
    +// always SUCCESS:
    +//
    +// - Start: This is the state when the object is first found and the iterator is just past the {.
    +//   In this state, at_start == true.
    +// - Next: After we hand a scalar value to the user, or an array/object which they then fully
    +//   iterate over, the iterator is at the , or } before the next value. In this state,
    +//   depth == iter.depth, at_start == false, and error == SUCCESS.
    +// - Unfinished Business: When we hand an array/object to the user which they do not fully
    +//   iterate over, we need to finish that iteration by skipping child values until we reach the
    +//   Next state. In this state, depth > iter.depth, at_start == false, and error == SUCCESS.
    +//
    +// ## Error States
    +//
    +// In error states, we will yield exactly one more value before stopping. iter.depth == depth
    +// and at_start is always false. We decrement after yielding the error, moving to the Finished
    +// state.
    +//
    +// - Chained Error: When the object iterator is part of an error chain--for example, in
    +//   `for (auto tweet : doc["tweets"])`, where the tweet field may be missing or not be an
    +//   object--we yield that error in the loop, exactly once. In this state, error != SUCCESS and
    +//   iter.depth == depth, and at_start == false. We decrement depth when we yield the error.
    +// - Missing Comma Error: When the iterator ++ method discovers there is no comma between fields,
    +//   we flag that as an error and treat it exactly the same as a Chained Error. In this state,
    +//   error == TAPE_ERROR, iter.depth == depth, and at_start == false.
    +//
    +// Errors that occur while reading a field to give to the user (such as when the key is not a
    +// string or the field is missing a colon) are yielded immediately. Depth is then decremented,
    +// moving to the Finished state without transitioning through an Error state at all.
    +//
    +// ## Terminal State
    +//
    +// The terminal state has iter.depth < depth. at_start is always false.
    +//
    +// - Finished: When we have reached a }, we are finished. We signal this by decrementing depth.
    +//   In this state, iter.depth < depth, at_start == false, and error == SUCCESS.
    +//
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  fallback::ondemand::object_iterator &&value
    +) noexcept
    +  : implementation_simdjson_result_base(std::forward(value))
    +{
    +  first.iter.assert_is_valid();
    +}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +  : implementation_simdjson_result_base({}, error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::operator*() noexcept {
    +  if (error()) { return error(); }
    +  return *first;
    +}
    +// If we're iterating and there is an error, return the error once.
    +simdjson_inline bool simdjson_result::operator==(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return !error(); }
    +  return first == other.first;
    +}
    +// If we're iterating and there is an error, return the error once.
    +simdjson_inline bool simdjson_result::operator!=(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return error(); }
    +  return first != other.first;
    +}
    +// Checks for ']' and ','
    +simdjson_inline simdjson_result &simdjson_result::operator++() noexcept {
    +  // Clear the error if there is one, so we don't yield it twice
    +  if (error()) { second = SUCCESS; return *this; }
    +  ++first;
    +  return *this;
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/object_iterator-inl.h for fallback */
    +/* including simdjson/generic/ondemand/parser-inl.h for fallback: #include "simdjson/generic/ondemand/parser-inl.h" */
    +/* begin file simdjson/generic/ondemand/parser-inl.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/padded_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/padded_string_view.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/dom/base.h" // for MINIMAL_DOCUMENT_CAPACITY */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document_stream.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +simdjson_inline parser::parser(size_t max_capacity) noexcept
    +  : _max_capacity{max_capacity} {
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code parser::allocate(size_t new_capacity, size_t new_max_depth) noexcept {
    +  if (new_capacity > max_capacity()) { return CAPACITY; }
    +  if (string_buf && new_capacity == capacity() && new_max_depth == max_depth()) { return SUCCESS; }
    +
    +  // string_capacity copied from document::allocate
    +  _capacity = 0;
    +  size_t string_capacity = SIMDJSON_ROUNDUP_N(5 * new_capacity / 3 + SIMDJSON_PADDING, 64);
    +  string_buf.reset(new (std::nothrow) uint8_t[string_capacity]);
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  start_positions.reset(new (std::nothrow) token_position[new_max_depth]);
    +#endif
    +  if (implementation) {
    +    SIMDJSON_TRY( implementation->set_capacity(new_capacity) );
    +    SIMDJSON_TRY( implementation->set_max_depth(new_max_depth) );
    +  } else {
    +    SIMDJSON_TRY( simdjson::get_active_implementation()->create_dom_parser_implementation(new_capacity, new_max_depth, implementation) );
    +  }
    +  _capacity = new_capacity;
    +  _max_depth = new_max_depth;
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(padded_string_view json) & noexcept {
    +  if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; }
    +
    +  json.remove_utf8_bom();
    +
    +  // Allocate if needed
    +  if (capacity() < json.length() || !string_buf) {
    +    SIMDJSON_TRY( allocate(json.length(), max_depth()) );
    +  }
    +
    +  // Run stage 1.
    +  SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) );
    +  return document::start({ reinterpret_cast(json.data()), this });
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const char *json, size_t len, size_t allocated) & noexcept {
    +  return iterate(padded_string_view(json, len, allocated));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const uint8_t *json, size_t len, size_t allocated) & noexcept {
    +  return iterate(padded_string_view(json, len, allocated));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string_view json, size_t allocated) & noexcept {
    +  return iterate(padded_string_view(json, allocated));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string &json) & noexcept {
    +  if(json.capacity() - json.size() < SIMDJSON_PADDING) {
    +    json.reserve(json.size() + SIMDJSON_PADDING);
    +  }
    +  return iterate(padded_string_view(json));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const std::string &json) & noexcept {
    +  return iterate(padded_string_view(json));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept {
    +  // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception
    +  SIMDJSON_TRY( result.error() );
    +  padded_string_view json = result.value_unsafe();
    +  return iterate(json);
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept {
    +  // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception
    +  SIMDJSON_TRY( result.error() );
    +  const padded_string &json = result.value_unsafe();
    +  return iterate(json);
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate_raw(padded_string_view json) & noexcept {
    +  if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; }
    +
    +  json.remove_utf8_bom();
    +
    +  // Allocate if needed
    +  if (capacity() < json.length()) {
    +    SIMDJSON_TRY( allocate(json.length(), max_depth()) );
    +  }
    +
    +  // Run stage 1.
    +  SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) );
    +  return json_iterator(reinterpret_cast(json.data()), this);
    +}
    +
    +inline simdjson_result parser::iterate_many(const uint8_t *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept {
    +  if(batch_size < MINIMAL_BATCH_SIZE) { batch_size = MINIMAL_BATCH_SIZE; }
    +  if((len >= 3) && (std::memcmp(buf, "\xEF\xBB\xBF", 3) == 0)) {
    +    buf += 3;
    +    len -= 3;
    +  }
    +  if(allow_comma_separated && batch_size < len) { batch_size = len; }
    +  return document_stream(*this, buf, len, batch_size, allow_comma_separated);
    +}
    +inline simdjson_result parser::iterate_many(const char *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept {
    +  return iterate_many(reinterpret_cast(buf), len, batch_size, allow_comma_separated);
    +}
    +inline simdjson_result parser::iterate_many(const std::string &s, size_t batch_size, bool allow_comma_separated) noexcept {
    +  return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated);
    +}
    +inline simdjson_result parser::iterate_many(const padded_string &s, size_t batch_size, bool allow_comma_separated) noexcept {
    +  return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated);
    +}
    +
    +simdjson_inline size_t parser::capacity() const noexcept {
    +  return _capacity;
    +}
    +simdjson_inline size_t parser::max_capacity() const noexcept {
    +  return _max_capacity;
    +}
    +simdjson_inline size_t parser::max_depth() const noexcept {
    +  return _max_depth;
    +}
    +
    +simdjson_inline void parser::set_max_capacity(size_t max_capacity) noexcept {
    +  if(max_capacity < dom::MINIMAL_DOCUMENT_CAPACITY) {
    +    _max_capacity = max_capacity;
    +  } else {
    +    _max_capacity = dom::MINIMAL_DOCUMENT_CAPACITY;
    +  }
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result parser::unescape(raw_json_string in, uint8_t *&dst, bool allow_replacement) const noexcept {
    +  uint8_t *end = implementation->parse_string(in.buf, dst, allow_replacement);
    +  if (!end) { return STRING_ERROR; }
    +  std::string_view result(reinterpret_cast(dst), end-dst);
    +  dst = end;
    +  return result;
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result parser::unescape_wobbly(raw_json_string in, uint8_t *&dst) const noexcept {
    +  uint8_t *end = implementation->parse_wobbly_string(in.buf, dst);
    +  if (!end) { return STRING_ERROR; }
    +  std::string_view result(reinterpret_cast(dst), end-dst);
    +  dst = end;
    +  return result;
    +}
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::parser &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H
    +/* end file simdjson/generic/ondemand/parser-inl.h for fallback */
    +/* including simdjson/generic/ondemand/raw_json_string-inl.h for fallback: #include "simdjson/generic/ondemand/raw_json_string-inl.h" */
    +/* begin file simdjson/generic/ondemand/raw_json_string-inl.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +
    +namespace fallback {
    +namespace ondemand {
    +
    +simdjson_inline raw_json_string::raw_json_string(const uint8_t * _buf) noexcept : buf{_buf} {}
    +
    +simdjson_inline const char * raw_json_string::raw() const noexcept { return reinterpret_cast(buf); }
    +
    +
    +simdjson_inline bool raw_json_string::is_free_from_unescaped_quote(std::string_view target) noexcept {
    +  size_t pos{0};
    +  // if the content has no escape character, just scan through it quickly!
    +  for(;pos < target.size() && target[pos] != '\\';pos++) {}
    +  // slow path may begin.
    +  bool escaping{false};
    +  for(;pos < target.size();pos++) {
    +    if((target[pos] == '"') && !escaping) {
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  return true;
    +}
    +
    +simdjson_inline bool raw_json_string::is_free_from_unescaped_quote(const char* target) noexcept {
    +  size_t pos{0};
    +  // if the content has no escape character, just scan through it quickly!
    +  for(;target[pos] && target[pos] != '\\';pos++) {}
    +  // slow path may begin.
    +  bool escaping{false};
    +  for(;target[pos];pos++) {
    +    if((target[pos] == '"') && !escaping) {
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  return true;
    +}
    +
    +
    +simdjson_inline bool raw_json_string::unsafe_is_equal(size_t length, std::string_view target) const noexcept {
    +  // If we are going to call memcmp, then we must know something about the length of the raw_json_string.
    +  return (length >= target.size()) && (raw()[target.size()] == '"') && !memcmp(raw(), target.data(), target.size());
    +}
    +
    +simdjson_inline bool raw_json_string::unsafe_is_equal(std::string_view target) const noexcept {
    +  // Assumptions: does not contain unescaped quote characters, and
    +  // the raw content is quote terminated within a valid JSON string.
    +  if(target.size() <= SIMDJSON_PADDING) {
    +    return (raw()[target.size()] == '"') && !memcmp(raw(), target.data(), target.size());
    +  }
    +  const char * r{raw()};
    +  size_t pos{0};
    +  for(;pos < target.size();pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +simdjson_inline bool raw_json_string::is_equal(std::string_view target) const noexcept {
    +  const char * r{raw()};
    +  size_t pos{0};
    +  bool escaping{false};
    +  for(;pos < target.size();pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +    // if target is a compile-time constant and it is free from
    +    // quotes, then the next part could get optimized away through
    +    // inlining.
    +    if((target[pos] == '"') && !escaping) {
    +      // We have reached the end of the raw_json_string but
    +      // the target is not done.
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +
    +simdjson_inline bool raw_json_string::unsafe_is_equal(const char * target) const noexcept {
    +  // Assumptions: 'target' does not contain unescaped quote characters, is null terminated and
    +  // the raw content is quote terminated within a valid JSON string.
    +  const char * r{raw()};
    +  size_t pos{0};
    +  for(;target[pos];pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +simdjson_inline bool raw_json_string::is_equal(const char* target) const noexcept {
    +  // Assumptions: does not contain unescaped quote characters, and
    +  // the raw content is quote terminated within a valid JSON string.
    +  const char * r{raw()};
    +  size_t pos{0};
    +  bool escaping{false};
    +  for(;target[pos];pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +    // if target is a compile-time constant and it is free from
    +    // quotes, then the next part could get optimized away through
    +    // inlining.
    +    if((target[pos] == '"') && !escaping) {
    +      // We have reached the end of the raw_json_string but
    +      // the target is not done.
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept {
    +  return a.unsafe_is_equal(c);
    +}
    +
    +simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept {
    +  return a == c;
    +}
    +
    +simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept {
    +  return !(a == c);
    +}
    +
    +simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept {
    +  return !(a == c);
    +}
    +
    +
    +simdjson_inline simdjson_warn_unused simdjson_result raw_json_string::unescape(json_iterator &iter, bool allow_replacement) const noexcept {
    +  return iter.unescape(*this, allow_replacement);
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result raw_json_string::unescape_wobbly(json_iterator &iter) const noexcept {
    +  return iter.unescape_wobbly(*this);
    +}
    +
    +simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &out, const raw_json_string &str) noexcept {
    +  bool in_escape = false;
    +  const char *s = str.raw();
    +  while (true) {
    +    switch (*s) {
    +      case '\\': in_escape = !in_escape; break;
    +      case '"': if (in_escape) { in_escape = false; } else { return out; } break;
    +      default: if (in_escape) { in_escape = false; }
    +    }
    +    out << *s;
    +    s++;
    +  }
    +}
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::raw_json_string &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +simdjson_inline simdjson_result simdjson_result::raw() const noexcept {
    +  if (error()) { return error(); }
    +  return first.raw();
    +}
    +simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape(fallback::ondemand::json_iterator &iter, bool allow_replacement) const noexcept {
    +  if (error()) { return error(); }
    +  return first.unescape(iter, allow_replacement);
    +}
    +simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape_wobbly(fallback::ondemand::json_iterator &iter) const noexcept {
    +  if (error()) { return error(); }
    +  return first.unescape_wobbly(iter);
    +}
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H
    +/* end file simdjson/generic/ondemand/raw_json_string-inl.h for fallback */
    +/* including simdjson/generic/ondemand/serialization-inl.h for fallback: #include "simdjson/generic/ondemand/serialization-inl.h" */
    +/* begin file simdjson/generic/ondemand/serialization-inl.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/serialization.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +
    +inline std::string_view trim(const std::string_view str) noexcept {
    +  // We can almost surely do better by rolling our own find_first_not_of function.
    +  size_t first = str.find_first_not_of(" \t\n\r");
    +  // If we have the empty string (just white space), then no trimming is possible, and
    +  // we return the empty string_view.
    +  if (std::string_view::npos == first) { return std::string_view(); }
    +  size_t last = str.find_last_not_of(" \t\n\r");
    +  return str.substr(first, (last - first + 1));
    +}
    +
    +
    +inline simdjson_result to_json_string(fallback::ondemand::document& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(fallback::ondemand::document_reference& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(fallback::ondemand::value& x) noexcept {
    +  /**
    +   * If we somehow receive a value that has already been consumed,
    +   * then the following code could be in trouble. E.g., we create
    +   * an array as needed, but if an array was already created, then
    +   * it could be bad.
    +   */
    +  using namespace fallback::ondemand;
    +  fallback::ondemand::json_type t;
    +  auto error = x.type().get(t);
    +  if(error != SUCCESS) { return error; }
    +  switch (t)
    +  {
    +    case json_type::array:
    +    {
    +      fallback::ondemand::array array;
    +      error = x.get_array().get(array);
    +      if(error) { return error; }
    +      return to_json_string(array);
    +    }
    +    case json_type::object:
    +    {
    +      fallback::ondemand::object object;
    +      error = x.get_object().get(object);
    +      if(error) { return error; }
    +      return to_json_string(object);
    +    }
    +    default:
    +      return trim(x.raw_json_token());
    +  }
    +}
    +
    +inline simdjson_result to_json_string(fallback::ondemand::object& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(fallback::ondemand::array& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +} // namespace simdjson
    +
    +namespace simdjson { namespace fallback { namespace ondemand {
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::value x) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(x).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::value x) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(x).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::array value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::array value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::document& value)  {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::document_reference& value)  {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::document& value)  {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::object value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out,  simdjson::simdjson_result x) {
    +  if (x.error()) { throw  simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::fallback::ondemand::object value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +}}} // namespace simdjson::fallback::ondemand
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H
    +/* end file simdjson/generic/ondemand/serialization-inl.h for fallback */
    +/* including simdjson/generic/ondemand/token_iterator-inl.h for fallback: #include "simdjson/generic/ondemand/token_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/token_iterator-inl.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/token_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +simdjson_inline token_iterator::token_iterator(
    +  const uint8_t *_buf,
    +  token_position position
    +) noexcept : buf{_buf}, _position{position}
    +{
    +}
    +
    +simdjson_inline uint32_t token_iterator::current_offset() const noexcept {
    +  return *(_position);
    +}
    +
    +
    +simdjson_inline const uint8_t *token_iterator::return_current_and_advance() noexcept {
    +  return &buf[*(_position++)];
    +}
    +
    +simdjson_inline const uint8_t *token_iterator::peek(token_position position) const noexcept {
    +  return &buf[*position];
    +}
    +simdjson_inline uint32_t token_iterator::peek_index(token_position position) const noexcept {
    +  return *position;
    +}
    +simdjson_inline uint32_t token_iterator::peek_length(token_position position) const noexcept {
    +  return *(position+1) - *position;
    +}
    +
    +simdjson_inline const uint8_t *token_iterator::peek(int32_t delta) const noexcept {
    +  return &buf[*(_position+delta)];
    +}
    +simdjson_inline uint32_t token_iterator::peek_index(int32_t delta) const noexcept {
    +  return *(_position+delta);
    +}
    +simdjson_inline uint32_t token_iterator::peek_length(int32_t delta) const noexcept {
    +  return *(_position+delta+1) - *(_position+delta);
    +}
    +
    +simdjson_inline token_position token_iterator::position() const noexcept {
    +  return _position;
    +}
    +simdjson_inline void token_iterator::set_position(token_position target_position) noexcept {
    +  _position = target_position;
    +}
    +
    +simdjson_inline bool token_iterator::operator==(const token_iterator &other) const noexcept {
    +  return _position == other._position;
    +}
    +simdjson_inline bool token_iterator::operator!=(const token_iterator &other) const noexcept {
    +  return _position != other._position;
    +}
    +simdjson_inline bool token_iterator::operator>(const token_iterator &other) const noexcept {
    +  return _position > other._position;
    +}
    +simdjson_inline bool token_iterator::operator>=(const token_iterator &other) const noexcept {
    +  return _position >= other._position;
    +}
    +simdjson_inline bool token_iterator::operator<(const token_iterator &other) const noexcept {
    +  return _position < other._position;
    +}
    +simdjson_inline bool token_iterator::operator<=(const token_iterator &other) const noexcept {
    +  return _position <= other._position;
    +}
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::token_iterator &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/token_iterator-inl.h for fallback */
    +/* including simdjson/generic/ondemand/value-inl.h for fallback: #include "simdjson/generic/ondemand/value-inl.h" */
    +/* begin file simdjson/generic/ondemand/value-inl.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +simdjson_inline value::value(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{
    +}
    +simdjson_inline value value::start(const value_iterator &iter) noexcept {
    +  return iter;
    +}
    +simdjson_inline value value::resume(const value_iterator &iter) noexcept {
    +  return iter;
    +}
    +
    +simdjson_inline simdjson_result value::get_array() noexcept {
    +  return array::start(iter);
    +}
    +simdjson_inline simdjson_result value::get_object() noexcept {
    +  return object::start(iter);
    +}
    +simdjson_inline simdjson_result value::start_or_resume_object() noexcept {
    +  if (iter.at_start()) {
    +    return get_object();
    +  } else {
    +    return object::resume(iter);
    +  }
    +}
    +
    +simdjson_inline simdjson_result value::get_raw_json_string() noexcept {
    +  return iter.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result value::get_string(bool allow_replacement) noexcept {
    +  return iter.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code value::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  return iter.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result value::get_wobbly_string() noexcept {
    +  return iter.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result value::get_double() noexcept {
    +  return iter.get_double();
    +}
    +simdjson_inline simdjson_result value::get_double_in_string() noexcept {
    +  return iter.get_double_in_string();
    +}
    +simdjson_inline simdjson_result value::get_uint64() noexcept {
    +  return iter.get_uint64();
    +}
    +simdjson_inline simdjson_result value::get_uint64_in_string() noexcept {
    +  return iter.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result value::get_int64() noexcept {
    +  return iter.get_int64();
    +}
    +simdjson_inline simdjson_result value::get_int64_in_string() noexcept {
    +  return iter.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result value::get_bool() noexcept {
    +  return iter.get_bool();
    +}
    +simdjson_inline simdjson_result value::is_null() noexcept {
    +  return iter.is_null();
    +}
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_array(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_object(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_raw_json_string(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_string(false); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_number(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_double(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_uint64(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_int64(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_bool(); }
    +
    +template simdjson_inline error_code value::get(T &out) noexcept {
    +  return get().get(out);
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline value::operator array() noexcept(false) {
    +  return get_array();
    +}
    +simdjson_inline value::operator object() noexcept(false) {
    +  return get_object();
    +}
    +simdjson_inline value::operator uint64_t() noexcept(false) {
    +  return get_uint64();
    +}
    +simdjson_inline value::operator int64_t() noexcept(false) {
    +  return get_int64();
    +}
    +simdjson_inline value::operator double() noexcept(false) {
    +  return get_double();
    +}
    +simdjson_inline value::operator std::string_view() noexcept(false) {
    +  return get_string(false);
    +}
    +simdjson_inline value::operator raw_json_string() noexcept(false) {
    +  return get_raw_json_string();
    +}
    +simdjson_inline value::operator bool() noexcept(false) {
    +  return get_bool();
    +}
    +#endif
    +
    +simdjson_inline simdjson_result value::begin() & noexcept {
    +  return get_array().begin();
    +}
    +simdjson_inline simdjson_result value::end() & noexcept {
    +  return {};
    +}
    +simdjson_inline simdjson_result value::count_elements() & noexcept {
    +  simdjson_result answer;
    +  auto a = get_array();
    +  answer = a.count_elements();
    +  // count_elements leaves you pointing inside the array, at the first element.
    +  // We need to move back so that the user can create a new array (which requires that
    +  // we point at '[').
    +  iter.move_at_start();
    +  return answer;
    +}
    +simdjson_inline simdjson_result value::count_fields() & noexcept {
    +  simdjson_result answer;
    +  auto a = get_object();
    +  answer = a.count_fields();
    +  iter.move_at_start();
    +  return answer;
    +}
    +simdjson_inline simdjson_result value::at(size_t index) noexcept {
    +  auto a = get_array();
    +  return a.at(index);
    +}
    +
    +simdjson_inline simdjson_result value::find_field(std::string_view key) noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +simdjson_inline simdjson_result value::find_field(const char *key) noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +
    +simdjson_inline simdjson_result value::find_field_unordered(std::string_view key) noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result value::find_field_unordered(const char *key) noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +
    +simdjson_inline simdjson_result value::operator[](std::string_view key) noexcept {
    +  return start_or_resume_object()[key];
    +}
    +simdjson_inline simdjson_result value::operator[](const char *key) noexcept {
    +  return start_or_resume_object()[key];
    +}
    +
    +simdjson_inline simdjson_result value::type() noexcept {
    +  return iter.type();
    +}
    +
    +simdjson_inline simdjson_result value::is_scalar() noexcept {
    +  json_type this_type;
    +  auto error = type().get(this_type);
    +  if(error) { return error; }
    +  return ! ((this_type == json_type::array) || (this_type == json_type::object));
    +}
    +
    +simdjson_inline bool value::is_negative() noexcept {
    +  return iter.is_negative();
    +}
    +
    +simdjson_inline simdjson_result value::is_integer() noexcept {
    +  return iter.is_integer();
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value::get_number_type() noexcept {
    +  return iter.get_number_type();
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value::get_number() noexcept {
    +  return iter.get_number();
    +}
    +
    +simdjson_inline std::string_view value::raw_json_token() noexcept {
    +  return std::string_view(reinterpret_cast(iter.peek_start()), iter.peek_start_length());
    +}
    +
    +simdjson_inline simdjson_result value::raw_json() noexcept {
    +  json_type t;
    +  SIMDJSON_TRY(type().get(t));
    +  switch (t)
    +  {
    +    case json_type::array: {
    +      ondemand::array array;
    +      SIMDJSON_TRY(get_array().get(array));
    +      return array.raw_json();
    +    }
    +    case json_type::object: {
    +      ondemand::object object;
    +      SIMDJSON_TRY(get_object().get(object));
    +      return object.raw_json();
    +    }
    +    default:
    +      return raw_json_token();
    +  }
    +}
    +
    +simdjson_inline simdjson_result value::current_location() noexcept {
    +  return iter.json_iter().current_location();
    +}
    +
    +simdjson_inline int32_t value::current_depth() const noexcept{
    +  return iter.json_iter().depth();
    +}
    +
    +simdjson_inline simdjson_result value::at_pointer(std::string_view json_pointer) noexcept {
    +  json_type t;
    +  SIMDJSON_TRY(type().get(t));
    +  switch (t)
    +  {
    +    case json_type::array:
    +      return (*this).get_array().at_pointer(json_pointer);
    +    case json_type::object:
    +      return (*this).get_object().at_pointer(json_pointer);
    +    default:
    +      return INVALID_JSON_POINTER;
    +  }
    +}
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  fallback::ondemand::value &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(error)
    +{
    +}
    +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +simdjson_inline simdjson_result simdjson_result::at(size_t index) noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline simdjson_result simdjson_result::begin() & noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() & noexcept {
    +  if (error()) { return error(); }
    +  return {};
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::get_array() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_array();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_object() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_object();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_bool();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_null() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_null();
    +}
    +
    +template simdjson_inline simdjson_result simdjson_result::get() noexcept {
    +  if (error()) { return error(); }
    +  return first.get();
    +}
    +template simdjson_inline error_code simdjson_result::get(T &out) noexcept {
    +  if (error()) { return error(); }
    +  return first.get(out);
    +}
    +
    +template<> simdjson_inline simdjson_result simdjson_result::get() noexcept  {
    +  if (error()) { return error(); }
    +  return std::move(first);
    +}
    +template<> simdjson_inline error_code simdjson_result::get(fallback::ondemand::value &out) noexcept {
    +  if (error()) { return error(); }
    +  out = first;
    +  return SUCCESS;
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::type() noexcept {
    +  if (error()) { return error(); }
    +  return first.type();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_scalar();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_negative() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_negative();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_integer();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number_type();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number();
    +}
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline simdjson_result::operator fallback::ondemand::array() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator fallback::ondemand::object() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator int64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator double() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator fallback::ondemand::raw_json_string() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator bool() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +#endif
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json_token();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::current_location() noexcept {
    +  if (error()) { return error(); }
    +  return first.current_location();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::current_depth() const noexcept {
    +  if (error()) { return error(); }
    +  return first.current_depth();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H
    +/* end file simdjson/generic/ondemand/value-inl.h for fallback */
    +/* including simdjson/generic/ondemand/value_iterator-inl.h for fallback: #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/value_iterator-inl.h for fallback */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/atomparsing.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/numberparsing.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace fallback {
    +namespace ondemand {
    +
    +simdjson_inline value_iterator::value_iterator(
    +  json_iterator *json_iter,
    +  depth_t depth,
    +  token_position start_position
    +) noexcept : _json_iter{json_iter}, _depth{depth}, _start_position{start_position}
    +{
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_object() noexcept {
    +  SIMDJSON_TRY( start_container('{', "Not an object", "object") );
    +  return started_object();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_object() noexcept {
    +  SIMDJSON_TRY( start_container('{', "Not an object", "object") );
    +  return started_root_object();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_object() noexcept {
    +  assert_at_container_start();
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  _json_iter->set_start_position(_depth, start_position());
    +#endif
    +  if (*_json_iter->peek() == '}') {
    +    logger::log_value(*_json_iter, "empty object");
    +    _json_iter->return_current_and_advance();
    +    end_container();
    +    return false;
    +  }
    +  return true;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::check_root_object() noexcept {
    +  // When in streaming mode, we cannot expect peek_last() to be the last structural element of the
    +  // current document. It only works in the normal mode where we have indexed a single document.
    +  // Note that adding a check for 'streaming' is not expensive since we only have at most
    +  // one root element.
    +  if ( ! _json_iter->streaming() ) {
    +    // The following lines do not fully protect against garbage content within the
    +    // object: e.g., `{"a":2} foo }`. Users concerned with garbage content should
    +    // call `at_end()` on the document instance at the end of the processing to
    +    // ensure that the processing has finished at the end.
    +    //
    +    if (*_json_iter->peek_last() != '}') {
    +      _json_iter->abandon();
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing } at end");
    +    }
    +    // If the last character is } *and* the first gibberish character is also '}'
    +    // then on-demand could accidentally go over. So we need additional checks.
    +    // https://github.com/simdjson/simdjson/issues/1834
    +    // Checking that the document is balanced requires a full scan which is potentially
    +    // expensive, but it only happens in edge cases where the first padding character is
    +    // a closing bracket.
    +    if ((*_json_iter->peek(_json_iter->end_position()) == '}') && (!_json_iter->balanced())) {
    +      _json_iter->abandon();
    +      // The exact error would require more work. It will typically be an unclosed object.
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "the document is unbalanced");
    +    }
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_object() noexcept {
    +  auto error = check_root_object();
    +  if(error) { return error; }
    +  return started_object();
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::end_container() noexcept {
    +#if SIMDJSON_CHECK_EOF
    +    if (depth() > 1 && at_end()) { return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing parent ] or }"); }
    +    // if (depth() <= 1 && !at_end()) { return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing [ or { at start"); }
    +#endif // SIMDJSON_CHECK_EOF
    +    _json_iter->ascend_to(depth()-1);
    +    return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_field() noexcept {
    +  assert_at_next();
    +
    +  // It's illegal to call this unless there are more tokens: anything that ends in } or ] is
    +  // obligated to verify there are more tokens if they are not the top level.
    +  switch (*_json_iter->return_current_and_advance()) {
    +    case '}':
    +      logger::log_end_value(*_json_iter, "object");
    +      SIMDJSON_TRY( end_container() );
    +      return false;
    +    case ',':
    +      return true;
    +    default:
    +      return report_error(TAPE_ERROR, "Missing comma between object fields");
    +  }
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::find_field_raw(const std::string_view key) noexcept {
    +  error_code error;
    +  bool has_value;
    +  //
    +  // Initially, the object can be in one of a few different places:
    +  //
    +  // 1. The start of the object, at the first field:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //      ^ (depth 2, index 1)
    +  //    ```
    +  if (at_first_field()) {
    +    has_value = true;
    +
    +  //
    +  // 2. When a previous search did not yield a value or the object is empty:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                     ^ (depth 0)
    +  //    { }
    +  //        ^ (depth 0, index 2)
    +  //    ```
    +  //
    +  } else if (!is_open()) {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    // If we're past the end of the object, we're being iterated out of order.
    +    // Note: this isn't perfect detection. It's possible the user is inside some other object; if so,
    +    // this object iterator will blithely scan that object for fields.
    +    if (_json_iter->depth() < depth() - 1) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +    return false;
    +
    +  // 3. When a previous search found a field or an iterator yielded a value:
    +  //
    +  //    ```
    +  //    // When a field was not fully consumed (or not even touched at all)
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //           ^ (depth 2)
    +  //    // When a field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                   ^ (depth 1)
    +  //    // When the last field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                   ^ (depth 1)
    +  //    ```
    +  //
    +  } else {
    +    if ((error = skip_child() )) { abandon(); return error; }
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    if (_json_iter->start_position(_depth) != start_position()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  }
    +  while (has_value) {
    +    // Get the key and colon, stopping at the value.
    +    raw_json_string actual_key;
    +    // size_t max_key_length = _json_iter->peek_length() - 2; // -2 for the two quotes
    +    // Note: _json_iter->peek_length() - 2 might overflow if _json_iter->peek_length() < 2.
    +    // field_key() advances the pointer and checks that '"' is found (corresponding to a key).
    +    // The depth is left unchanged by field_key().
    +    if ((error = field_key().get(actual_key) )) { abandon(); return error; };
    +    // field_value() will advance and check that we find a ':' separating the
    +    // key and the value. It will also increment the depth by one.
    +    if ((error = field_value() )) { abandon(); return error; }
    +    // If it matches, stop and return
    +    // We could do it this way if we wanted to allow arbitrary
    +    // key content (including escaped quotes).
    +    //if (actual_key.unsafe_is_equal(max_key_length, key)) {
    +    // Instead we do the following which may trigger buffer overruns if the
    +    // user provides an adversarial key (containing a well placed unescaped quote
    +    // character and being longer than the number of bytes remaining in the JSON
    +    // input).
    +    if (actual_key.unsafe_is_equal(key)) {
    +      logger::log_event(*this, "match", key, -2);
    +      // If we return here, then we return while pointing at the ':' that we just checked.
    +      return true;
    +    }
    +
    +    // No match: skip the value and see if , or } is next
    +    logger::log_event(*this, "no match", key, -2);
    +    // The call to skip_child is meant to skip over the value corresponding to the key.
    +    // After skip_child(), we are right before the next comma (',') or the final brace ('}').
    +    SIMDJSON_TRY( skip_child() ); // Skip the value entirely
    +    // The has_next_field() advances the pointer and check that either ',' or '}' is found.
    +    // It returns true if ',' is found, false otherwise. If anything other than ',' or '}' is found,
    +    // then we are in error and we abort.
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +  }
    +
    +  // If the loop ended, we're out of fields to look at.
    +  return false;
    +}
    +
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::find_field_unordered_raw(const std::string_view key) noexcept {
    +  /**
    +   * When find_field_unordered_raw is called, we can either be pointing at the
    +   * first key, pointing outside (at the closing brace) or if a key was matched
    +   * we can be either pointing right afterthe ':' right before the value (that we need skip),
    +   * or we may have consumed the value and we might be at a comma or at the
    +   * final brace (ready for a call to has_next_field()).
    +   */
    +  error_code error;
    +  bool has_value;
    +
    +  // First, we scan from that point to the end.
    +  // If we don't find a match, we may loop back around, and scan from the beginning to that point.
    +  token_position search_start = _json_iter->position();
    +
    +  // We want to know whether we need to go back to the beginning.
    +  bool at_first = at_first_field();
    +  ///////////////
    +  // Initially, the object can be in one of a few different places:
    +  //
    +  // 1. At the first key:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //      ^ (depth 2, index 1)
    +  //    ```
    +  //
    +  if (at_first) {
    +    has_value = true;
    +
    +  // 2. When a previous search did not yield a value or the object is empty:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                     ^ (depth 0)
    +  //    { }
    +  //        ^ (depth 0, index 2)
    +  //    ```
    +  //
    +  } else if (!is_open()) {
    +
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    // If we're past the end of the object, we're being iterated out of order.
    +    // Note: this isn't perfect detection. It's possible the user is inside some other object; if so,
    +    // this object iterator will blithely scan that object for fields.
    +    if (_json_iter->depth() < depth() - 1) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +    SIMDJSON_TRY(reset_object().get(has_value));
    +    at_first = true;
    +  // 3. When a previous search found a field or an iterator yielded a value:
    +  //
    +  //    ```
    +  //    // When a field was not fully consumed (or not even touched at all)
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //           ^ (depth 2)
    +  //    // When a field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                   ^ (depth 1)
    +  //    // When the last field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                   ^ (depth 1)
    +  //    ```
    +  //
    +  } else {
    +    // If someone queried a key but they not did access the value, then we are left pointing
    +    // at the ':' and we need to move forward through the value... If the value was
    +    // processed then skip_child() does not move the iterator (but may adjust the depth).
    +    if ((error = skip_child() )) { abandon(); return error; }
    +    search_start = _json_iter->position();
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    if (_json_iter->start_position(_depth) != start_position()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  }
    +
    +  // After initial processing, we will be in one of two states:
    +  //
    +  // ```
    +  // // At the beginning of a field
    +  // { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //   ^ (depth 1)
    +  // { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                  ^ (depth 1)
    +  // // At the end of the object
    +  // { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                  ^ (depth 0)
    +  // ```
    +  //
    +  // Next, we find a match starting from the current position.
    +  while (has_value) {
    +    SIMDJSON_ASSUME( _json_iter->_depth == _depth ); // We must be at the start of a field
    +
    +    // Get the key and colon, stopping at the value.
    +    raw_json_string actual_key;
    +    // size_t max_key_length = _json_iter->peek_length() - 2; // -2 for the two quotes
    +    // Note: _json_iter->peek_length() - 2 might overflow if _json_iter->peek_length() < 2.
    +    // field_key() advances the pointer and checks that '"' is found (corresponding to a key).
    +    // The depth is left unchanged by field_key().
    +    if ((error = field_key().get(actual_key) )) { abandon(); return error; };
    +    // field_value() will advance and check that we find a ':' separating the
    +    // key and the value. It will also increment the depth by one.
    +    if ((error = field_value() )) { abandon(); return error; }
    +
    +    // If it matches, stop and return
    +    // We could do it this way if we wanted to allow arbitrary
    +    // key content (including escaped quotes).
    +    // if (actual_key.unsafe_is_equal(max_key_length, key)) {
    +    // Instead we do the following which may trigger buffer overruns if the
    +    // user provides an adversarial key (containing a well placed unescaped quote
    +    // character and being longer than the number of bytes remaining in the JSON
    +    // input).
    +    if (actual_key.unsafe_is_equal(key)) {
    +      logger::log_event(*this, "match", key, -2);
    +      // If we return here, then we return while pointing at the ':' that we just checked.
    +      return true;
    +    }
    +
    +    // No match: skip the value and see if , or } is next
    +    logger::log_event(*this, "no match", key, -2);
    +    // The call to skip_child is meant to skip over the value corresponding to the key.
    +    // After skip_child(), we are right before the next comma (',') or the final brace ('}').
    +    SIMDJSON_TRY( skip_child() );
    +    // The has_next_field() advances the pointer and check that either ',' or '}' is found.
    +    // It returns true if ',' is found, false otherwise. If anything other than ',' or '}' is found,
    +    // then we are in error and we abort.
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +  }
    +  // Performance note: it maybe wasteful to rewind to the beginning when there might be
    +  // no other query following. Indeed, it would require reskipping the whole object.
    +  // Instead, you can just stay where you are. If there is a new query, there is always time
    +  // to rewind.
    +  if(at_first) { return false; }
    +
    +  // If we reach the end without finding a match, search the rest of the fields starting at the
    +  // beginning of the object.
    +  // (We have already run through the object before, so we've already validated its structure. We
    +  // don't check errors in this bit.)
    +  SIMDJSON_TRY(reset_object().get(has_value));
    +  while (true) {
    +    SIMDJSON_ASSUME(has_value); // we should reach search_start before ever reaching the end of the object
    +    SIMDJSON_ASSUME( _json_iter->_depth == _depth ); // We must be at the start of a field
    +
    +    // Get the key and colon, stopping at the value.
    +    raw_json_string actual_key;
    +    // size_t max_key_length = _json_iter->peek_length() - 2; // -2 for the two quotes
    +    // Note: _json_iter->peek_length() - 2 might overflow if _json_iter->peek_length() < 2.
    +    // field_key() advances the pointer and checks that '"' is found (corresponding to a key).
    +    // The depth is left unchanged by field_key().
    +    error = field_key().get(actual_key); SIMDJSON_ASSUME(!error);
    +    // field_value() will advance and check that we find a ':' separating the
    +    // key and the value.  It will also increment the depth by one.
    +    error = field_value(); SIMDJSON_ASSUME(!error);
    +
    +    // If it matches, stop and return
    +    // We could do it this way if we wanted to allow arbitrary
    +    // key content (including escaped quotes).
    +    // if (actual_key.unsafe_is_equal(max_key_length, key)) {
    +    // Instead we do the following which may trigger buffer overruns if the
    +    // user provides an adversarial key (containing a well placed unescaped quote
    +    // character and being longer than the number of bytes remaining in the JSON
    +    // input).
    +    if (actual_key.unsafe_is_equal(key)) {
    +      logger::log_event(*this, "match", key, -2);
    +      // If we return here, then we return while pointing at the ':' that we just checked.
    +      return true;
    +    }
    +
    +    // No match: skip the value and see if , or } is next
    +    logger::log_event(*this, "no match", key, -2);
    +    // The call to skip_child is meant to skip over the value corresponding to the key.
    +    // After skip_child(), we are right before the next comma (',') or the final brace ('}').
    +    SIMDJSON_TRY( skip_child() );
    +    // If we reached the end of the key-value pair we started from, then we know
    +    // that the key is not there so we return false. We are either right before
    +    // the next comma or the final brace.
    +    if(_json_iter->position() == search_start) { return false; }
    +    // The has_next_field() advances the pointer and check that either ',' or '}' is found.
    +    // It returns true if ',' is found, false otherwise. If anything other than ',' or '}' is found,
    +    // then we are in error and we abort.
    +    error = has_next_field().get(has_value); SIMDJSON_ASSUME(!error);
    +    // If we make the mistake of exiting here, then we could be left pointing at a key
    +    // in the middle of an object. That's not an allowable state.
    +  }
    +  // If the loop ended, we're out of fields to look at. The program should
    +  // never reach this point.
    +  return false;
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::field_key() noexcept {
    +  assert_at_next();
    +
    +  const uint8_t *key = _json_iter->return_current_and_advance();
    +  if (*(key++) != '"') { return report_error(TAPE_ERROR, "Object key is not a string"); }
    +  return raw_json_string(key);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::field_value() noexcept {
    +  assert_at_next();
    +
    +  if (*_json_iter->return_current_and_advance() != ':') { return report_error(TAPE_ERROR, "Missing colon in object field"); }
    +  _json_iter->descend_to(depth()+1);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_array() noexcept {
    +  SIMDJSON_TRY( start_container('[', "Not an array", "array") );
    +  return started_array();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_array() noexcept {
    +  SIMDJSON_TRY( start_container('[', "Not an array", "array") );
    +  return started_root_array();
    +}
    +
    +inline std::string value_iterator::to_string() const noexcept {
    +  auto answer = std::string("value_iterator [ depth : ") + std::to_string(_depth) + std::string(", ");
    +  if(_json_iter != nullptr) { answer +=  _json_iter->to_string(); }
    +  answer += std::string(" ]");
    +  return answer;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_array() noexcept {
    +  assert_at_container_start();
    +  if (*_json_iter->peek() == ']') {
    +    logger::log_value(*_json_iter, "empty array");
    +    _json_iter->return_current_and_advance();
    +    SIMDJSON_TRY( end_container() );
    +    return false;
    +  }
    +  _json_iter->descend_to(depth()+1);
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  _json_iter->set_start_position(_depth, start_position());
    +#endif
    +  return true;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::check_root_array() noexcept {
    +  // When in streaming mode, we cannot expect peek_last() to be the last structural element of the
    +  // current document. It only works in the normal mode where we have indexed a single document.
    +  // Note that adding a check for 'streaming' is not expensive since we only have at most
    +  // one root element.
    +  if ( ! _json_iter->streaming() ) {
    +    // The following lines do not fully protect against garbage content within the
    +    // array: e.g., `[1, 2] foo]`. Users concerned with garbage content should
    +    // also call `at_end()` on the document instance at the end of the processing to
    +    // ensure that the processing has finished at the end.
    +    //
    +    if (*_json_iter->peek_last() != ']') {
    +      _json_iter->abandon();
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing ] at end");
    +    }
    +    // If the last character is ] *and* the first gibberish character is also ']'
    +    // then on-demand could accidentally go over. So we need additional checks.
    +    // https://github.com/simdjson/simdjson/issues/1834
    +    // Checking that the document is balanced requires a full scan which is potentially
    +    // expensive, but it only happens in edge cases where the first padding character is
    +    // a closing bracket.
    +    if ((*_json_iter->peek(_json_iter->end_position()) == ']') && (!_json_iter->balanced())) {
    +      _json_iter->abandon();
    +      // The exact error would require more work. It will typically be an unclosed array.
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "the document is unbalanced");
    +    }
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_array() noexcept {
    +  auto error = check_root_array();
    +  if (error) { return error; }
    +  return started_array();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_element() noexcept {
    +  assert_at_next();
    +
    +  logger::log_event(*this, "has_next_element");
    +  switch (*_json_iter->return_current_and_advance()) {
    +    case ']':
    +      logger::log_end_value(*_json_iter, "array");
    +      SIMDJSON_TRY( end_container() );
    +      return false;
    +    case ',':
    +      _json_iter->descend_to(depth()+1);
    +      return true;
    +    default:
    +      return report_error(TAPE_ERROR, "Missing comma between array elements");
    +  }
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::parse_bool(const uint8_t *json) const noexcept {
    +  auto not_true = atomparsing::str4ncmp(json, "true");
    +  auto not_false = atomparsing::str4ncmp(json, "fals") | (json[4] ^ 'e');
    +  bool error = (not_true && not_false) || jsoncharutils::is_not_structural_or_whitespace(json[not_true ? 5 : 4]);
    +  if (error) { return incorrect_type_error("Not a boolean"); }
    +  return simdjson_result(!not_true);
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::parse_null(const uint8_t *json) const noexcept {
    +  bool is_null_string = !atomparsing::str4ncmp(json, "null") && jsoncharutils::is_structural_or_whitespace(json[4]);
    +  // if we start with 'n', we must be a null
    +  if(!is_null_string && json[0]=='n') { return incorrect_type_error("Not a null but starts with n"); }
    +  return is_null_string;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_string(bool allow_replacement) noexcept {
    +  return get_raw_json_string().unescape(json_iter(), allow_replacement);
    +}
    +template 
    +simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  std::string_view content;
    +  auto err = get_string(allow_replacement).get(content);
    +  if (err) { return err; }
    +  receiver = content;
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_wobbly_string() noexcept {
    +  return get_raw_json_string().unescape_wobbly(json_iter());
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_raw_json_string() noexcept {
    +  auto json = peek_scalar("string");
    +  if (*json != '"') { return incorrect_type_error("Not a string"); }
    +  advance_scalar("string");
    +  return raw_json_string(json+1);
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_uint64() noexcept {
    +  auto result = numberparsing::parse_unsigned(peek_non_root_scalar("uint64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("uint64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_uint64_in_string() noexcept {
    +  auto result = numberparsing::parse_unsigned_in_string(peek_non_root_scalar("uint64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("uint64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_int64() noexcept {
    +  auto result = numberparsing::parse_integer(peek_non_root_scalar("int64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("int64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_int64_in_string() noexcept {
    +  auto result = numberparsing::parse_integer_in_string(peek_non_root_scalar("int64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("int64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_double() noexcept {
    +  auto result = numberparsing::parse_double(peek_non_root_scalar("double"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("double"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_double_in_string() noexcept {
    +  auto result = numberparsing::parse_double_in_string(peek_non_root_scalar("double"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("double"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_bool() noexcept {
    +  auto result = parse_bool(peek_non_root_scalar("bool"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("bool"); }
    +  return result;
    +}
    +simdjson_inline simdjson_result value_iterator::is_null() noexcept {
    +  bool is_null_value;
    +  SIMDJSON_TRY(parse_null(peek_non_root_scalar("null")).get(is_null_value));
    +  if(is_null_value) { advance_non_root_scalar("null"); }
    +  return is_null_value;
    +}
    +simdjson_inline bool value_iterator::is_negative() noexcept {
    +  return numberparsing::is_negative(peek_non_root_scalar("numbersign"));
    +}
    +simdjson_inline bool value_iterator::is_root_negative() noexcept {
    +  return numberparsing::is_negative(peek_root_scalar("numbersign"));
    +}
    +simdjson_inline simdjson_result value_iterator::is_integer() noexcept {
    +  return numberparsing::is_integer(peek_non_root_scalar("integer"));
    +}
    +simdjson_inline simdjson_result value_iterator::get_number_type() noexcept {
    +  return numberparsing::get_number_type(peek_non_root_scalar("integer"));
    +}
    +simdjson_inline simdjson_result value_iterator::get_number() noexcept {
    +  number num;
    +  error_code error =  numberparsing::parse_number(peek_non_root_scalar("number"), num);
    +  if(error) { return error; }
    +  return num;
    +}
    +
    +simdjson_inline simdjson_result value_iterator::is_root_integer(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("is_root_integer");
    +  uint8_t tmpbuf[20+1+1]{}; // <20 digits> is the longest possible unsigned integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    return false; // if there are more than 20 characters, it cannot be represented as an integer.
    +  }
    +  auto answer = numberparsing::is_integer(tmpbuf);
    +  // If the parsing was a success, we must still check that it is
    +  // a single scalar. Note that we parse first because of cases like '[]' where
    +  // getting TRAILING_CONTENT is wrong.
    +  if(check_trailing && (answer.error() == SUCCESS) && (!_json_iter->is_single_token())) { return TRAILING_CONTENT; }
    +  return answer;
    +}
    +
    +simdjson_inline simdjson_result value_iterator::get_root_number_type(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("number");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1];
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto answer = numberparsing::get_number_type(tmpbuf);
    +  if (check_trailing && (answer.error() == SUCCESS)  && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +  return answer;
    +}
    +simdjson_inline simdjson_result value_iterator::get_root_number(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("number");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1];
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  number num;
    +  error_code error =  numberparsing::parse_number(tmpbuf, num);
    +  if(error) { return error; }
    +  if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +  advance_root_scalar("number");
    +  return num;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_string(bool check_trailing, bool allow_replacement) noexcept {
    +  return get_root_raw_json_string(check_trailing).unescape(json_iter(), allow_replacement);
    +}
    +template 
    +simdjson_warn_unused simdjson_inline error_code value_iterator::get_root_string(string_type& receiver, bool check_trailing, bool allow_replacement) noexcept {
    +  std::string_view content;
    +  auto err = get_root_string(check_trailing, allow_replacement).get(content);
    +  if (err) { return err; }
    +  receiver = content;
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_wobbly_string(bool check_trailing) noexcept {
    +  return get_root_raw_json_string(check_trailing).unescape_wobbly(json_iter());
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_raw_json_string(bool check_trailing) noexcept {
    +  auto json = peek_scalar("string");
    +  if (*json != '"') { return incorrect_type_error("Not a string"); }
    +  if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +  advance_scalar("string");
    +  return raw_json_string(json+1);
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_uint64(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("uint64");
    +  uint8_t tmpbuf[20+1+1]{}; // <20 digits> is the longest possible unsigned integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_unsigned(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("uint64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_uint64_in_string(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("uint64");
    +  uint8_t tmpbuf[20+1+1]{}; // <20 digits> is the longest possible unsigned integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_unsigned_in_string(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("uint64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_int64(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("int64");
    +  uint8_t tmpbuf[20+1+1]; // -<19 digits> is the longest possible integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +
    +  auto result = numberparsing::parse_integer(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("int64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_int64_in_string(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("int64");
    +  uint8_t tmpbuf[20+1+1]; // -<19 digits> is the longest possible integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +
    +  auto result = numberparsing::parse_integer_in_string(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("int64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_double(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("double");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination.
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_double(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("double");
    +  }
    +  return result;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_double_in_string(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("double");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination.
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_double_in_string(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("double");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_bool(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("bool");
    +  uint8_t tmpbuf[5+1+1]; // +1 for null termination
    +  tmpbuf[5+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 5+1)) { return incorrect_type_error("Not a boolean"); }
    +  auto result = parse_bool(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("bool");
    +  }
    +  return result;
    +}
    +simdjson_inline simdjson_result value_iterator::is_root_null(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("null");
    +  bool result = (max_len >= 4 && !atomparsing::str4ncmp(json, "null") &&
    +         (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4])));
    +  if(result) { // we have something that looks like a null.
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("null");
    +  }
    +  return result;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::skip_child() noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth >= _depth );
    +
    +  return _json_iter->skip_child(depth());
    +}
    +
    +simdjson_inline value_iterator value_iterator::child() const noexcept {
    +  assert_at_child();
    +  return { _json_iter, depth()+1, _json_iter->token.position() };
    +}
    +
    +// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller
    +// relating depth and iterator depth, which is a desired effect. It does not happen if is_open is
    +// marked non-inline.
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_inline bool value_iterator::is_open() const noexcept {
    +  return _json_iter->depth() >= depth();
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_inline bool value_iterator::at_end() const noexcept {
    +  return _json_iter->at_end();
    +}
    +
    +simdjson_inline bool value_iterator::at_start() const noexcept {
    +  return _json_iter->token.position() == start_position();
    +}
    +
    +simdjson_inline bool value_iterator::at_first_field() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  return _json_iter->token.position() == start_position() + 1;
    +}
    +
    +simdjson_inline void value_iterator::abandon() noexcept {
    +  _json_iter->abandon();
    +}
    +
    +simdjson_warn_unused simdjson_inline depth_t value_iterator::depth() const noexcept {
    +  return _depth;
    +}
    +simdjson_warn_unused simdjson_inline error_code value_iterator::error() const noexcept {
    +  return _json_iter->error;
    +}
    +simdjson_warn_unused simdjson_inline uint8_t *&value_iterator::string_buf_loc() noexcept {
    +  return _json_iter->string_buf_loc();
    +}
    +simdjson_warn_unused simdjson_inline const json_iterator &value_iterator::json_iter() const noexcept {
    +  return *_json_iter;
    +}
    +simdjson_warn_unused simdjson_inline json_iterator &value_iterator::json_iter() noexcept {
    +  return *_json_iter;
    +}
    +
    +simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept {
    +  return _json_iter->peek(start_position());
    +}
    +simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept {
    +  return _json_iter->peek_length(start_position());
    +}
    +
    +simdjson_inline const uint8_t *value_iterator::peek_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  // If we're not at the position anymore, we don't want to advance the cursor.
    +  if (!is_at_start()) { return peek_start(); }
    +
    +  // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value.
    +  assert_at_start();
    +  return _json_iter->peek();
    +}
    +
    +simdjson_inline void value_iterator::advance_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  // If we're not at the position anymore, we don't want to advance the cursor.
    +  if (!is_at_start()) { return; }
    +
    +  // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value.
    +  assert_at_start();
    +  _json_iter->return_current_and_advance();
    +  _json_iter->ascend_to(depth()-1);
    +}
    +
    +simdjson_inline error_code value_iterator::start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept {
    +  logger::log_start_value(*_json_iter, start_position(), depth(), type);
    +  // If we're not at the position anymore, we don't want to advance the cursor.
    +  const uint8_t *json;
    +  if (!is_at_start()) {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    if (!is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +    json = peek_start();
    +    if (*json != start_char) { return incorrect_type_error(incorrect_type_message); }
    +  } else {
    +    assert_at_start();
    +    /**
    +     * We should be prudent. Let us peek. If it is not the right type, we
    +     * return an error. Only once we have determined that we have the right
    +     * type are we allowed to advance!
    +     */
    +    json = _json_iter->peek();
    +    if (*json != start_char) { return incorrect_type_error(incorrect_type_message); }
    +    _json_iter->return_current_and_advance();
    +  }
    +
    +
    +  return SUCCESS;
    +}
    +
    +
    +simdjson_inline const uint8_t *value_iterator::peek_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return peek_start(); }
    +
    +  assert_at_root();
    +  return _json_iter->peek();
    +}
    +simdjson_inline const uint8_t *value_iterator::peek_non_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return peek_start(); }
    +
    +  assert_at_non_root_start();
    +  return _json_iter->peek();
    +}
    +
    +simdjson_inline void value_iterator::advance_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return; }
    +
    +  assert_at_root();
    +  _json_iter->return_current_and_advance();
    +  _json_iter->ascend_to(depth()-1);
    +}
    +simdjson_inline void value_iterator::advance_non_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return; }
    +
    +  assert_at_non_root_start();
    +  _json_iter->return_current_and_advance();
    +  _json_iter->ascend_to(depth()-1);
    +}
    +
    +simdjson_inline error_code value_iterator::incorrect_type_error(const char *message) const noexcept {
    +  logger::log_error(*_json_iter, start_position(), depth(), message);
    +  return INCORRECT_TYPE;
    +}
    +
    +simdjson_inline bool value_iterator::is_at_start() const noexcept {
    +  return position() == start_position();
    +}
    +
    +simdjson_inline bool value_iterator::is_at_key() const noexcept {
    +  // Keys are at the same depth as the object.
    +  // Note here that we could be safer and check that we are within an object,
    +  // but we do not.
    +  return _depth == _json_iter->_depth && *_json_iter->peek() == '"';
    +}
    +
    +simdjson_inline bool value_iterator::is_at_iterator_start() const noexcept {
    +  // We can legitimately be either at the first value ([1]), or after the array if it's empty ([]).
    +  auto delta = position() - start_position();
    +  return delta == 1 || delta == 2;
    +}
    +
    +inline void value_iterator::assert_at_start() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position == _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +inline void value_iterator::assert_at_container_start() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position == _start_position + 1 );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +inline void value_iterator::assert_at_next() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +simdjson_inline void value_iterator::move_at_start() noexcept {
    +  _json_iter->_depth = _depth;
    +  _json_iter->token.set_position(_start_position);
    +}
    +
    +simdjson_inline void value_iterator::move_at_container_start() noexcept {
    +  _json_iter->_depth = _depth;
    +  _json_iter->token.set_position(_start_position + 1);
    +}
    +
    +simdjson_inline simdjson_result value_iterator::reset_array() noexcept {
    +  if(error()) { return error(); }
    +  move_at_container_start();
    +  return started_array();
    +}
    +
    +simdjson_inline simdjson_result value_iterator::reset_object() noexcept {
    +  if(error()) { return error(); }
    +  move_at_container_start();
    +  return started_object();
    +}
    +
    +inline void value_iterator::assert_at_child() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth + 1 );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +inline void value_iterator::assert_at_root() const noexcept {
    +  assert_at_start();
    +  SIMDJSON_ASSUME( _depth == 1 );
    +}
    +
    +inline void value_iterator::assert_at_non_root_start() const noexcept {
    +  assert_at_start();
    +  SIMDJSON_ASSUME( _depth > 1 );
    +}
    +
    +inline void value_iterator::assert_is_valid() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter != nullptr );
    +}
    +
    +simdjson_inline bool value_iterator::is_valid() const noexcept {
    +  return _json_iter != nullptr;
    +}
    +
    +simdjson_inline simdjson_result value_iterator::type() const noexcept {
    +  switch (*peek_start()) {
    +    case '{':
    +      return json_type::object;
    +    case '[':
    +      return json_type::array;
    +    case '"':
    +      return json_type::string;
    +    case 'n':
    +      return json_type::null;
    +    case 't': case 'f':
    +      return json_type::boolean;
    +    case '-':
    +    case '0': case '1': case '2': case '3': case '4':
    +    case '5': case '6': case '7': case '8': case '9':
    +      return json_type::number;
    +    default:
    +      return TAPE_ERROR;
    +  }
    +}
    +
    +simdjson_inline token_position value_iterator::start_position() const noexcept {
    +  return _start_position;
    +}
    +
    +simdjson_inline token_position value_iterator::position() const noexcept {
    +  return _json_iter->position();
    +}
    +
    +simdjson_inline token_position value_iterator::end_position() const noexcept {
    +  return _json_iter->end_position();
    +}
    +
    +simdjson_inline token_position value_iterator::last_position() const noexcept {
    +  return _json_iter->last_position();
    +}
    +
    +simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept {
    +  return _json_iter->report_error(error, message);
    +}
    +
    +} // namespace ondemand
    +} // namespace fallback
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::value_iterator &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/value_iterator-inl.h for fallback */
    +/* end file simdjson/generic/ondemand/amalgamated.h for fallback */
    +/* including simdjson/fallback/end.h: #include "simdjson/fallback/end.h" */
    +/* begin file simdjson/fallback/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/fallback/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +/* undefining SIMDJSON_IMPLEMENTATION from "fallback" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/fallback/end.h */
    +
    +#endif // SIMDJSON_FALLBACK_ONDEMAND_H
    +/* end file simdjson/fallback/ondemand.h */
    +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(haswell)
    +/* including simdjson/haswell/ondemand.h: #include "simdjson/haswell/ondemand.h" */
    +/* begin file simdjson/haswell/ondemand.h */
    +#ifndef SIMDJSON_HASWELL_ONDEMAND_H
    +#define SIMDJSON_HASWELL_ONDEMAND_H
    +
    +/* including simdjson/haswell/begin.h: #include "simdjson/haswell/begin.h" */
    +/* begin file simdjson/haswell/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "haswell" */
    +#define SIMDJSON_IMPLEMENTATION haswell
    +
    +/* including simdjson/haswell/base.h: #include "simdjson/haswell/base.h" */
    +/* begin file simdjson/haswell/base.h */
    +#ifndef SIMDJSON_HASWELL_BASE_H
    +#define SIMDJSON_HASWELL_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_HASWELL
    +namespace simdjson {
    +/**
    + * Implementation for Haswell (Intel AVX2).
    + */
    +namespace haswell {
    +
    +class implementation;
    +
    +namespace {
    +namespace simd {
    +template  struct simd8;
    +template  struct simd8x64;
    +} // namespace simd
    +} // unnamed namespace
    +
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_HASWELL_BASE_H
    +/* end file simdjson/haswell/base.h */
    +/* including simdjson/haswell/intrinsics.h: #include "simdjson/haswell/intrinsics.h" */
    +/* begin file simdjson/haswell/intrinsics.h */
    +#ifndef SIMDJSON_HASWELL_INTRINSICS_H
    +#define SIMDJSON_HASWELL_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if SIMDJSON_VISUAL_STUDIO
    +// under clang within visual studio, this will include 
    +#include   // visual studio or clang
    +#else
    +#include  // elsewhere
    +#endif // SIMDJSON_VISUAL_STUDIO
    +
    +#if SIMDJSON_CLANG_VISUAL_STUDIO
    +/**
    + * You are not supposed, normally, to include these
    + * headers directly. Instead you should either include intrin.h
    + * or x86intrin.h. However, when compiling with clang
    + * under Windows (i.e., when _MSC_VER is set), these headers
    + * only get included *if* the corresponding features are detected
    + * from macros:
    + * e.g., if __AVX2__ is set... in turn,  we normally set these
    + * macros by compiling against the corresponding architecture
    + * (e.g., arch:AVX2, -mavx2, etc.) which compiles the whole
    + * software with these advanced instructions. In simdjson, we
    + * want to compile the whole program for a generic target,
    + * and only target our specific kernels. As a workaround,
    + * we directly include the needed headers. These headers would
    + * normally guard against such usage, but we carefully included
    + *   (or ) before, so the headers
    + * are fooled.
    + */
    +#include    // for _blsr_u64
    +#include  // for  __lzcnt64
    +#include    // for most things (AVX2, AVX512, _popcnt64)
    +#include 
    +#include 
    +#include 
    +#include 
    +#include    // for  _mm_clmulepi64_si128
    +// unfortunately, we may not get _blsr_u64, but, thankfully, clang
    +// has it as a macro.
    +#ifndef _blsr_u64
    +// we roll our own
    +#define _blsr_u64(n) ((n - 1) & n)
    +#endif //  _blsr_u64
    +#endif // SIMDJSON_CLANG_VISUAL_STUDIO
    +
    +static_assert(sizeof(__m256i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for haswell kernel.");
    +
    +#endif // SIMDJSON_HASWELL_INTRINSICS_H
    +/* end file simdjson/haswell/intrinsics.h */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_HASWELL
    +SIMDJSON_TARGET_REGION("avx2,bmi,pclmul,lzcnt,popcnt")
    +#endif
    +
    +/* including simdjson/haswell/bitmanipulation.h: #include "simdjson/haswell/bitmanipulation.h" */
    +/* begin file simdjson/haswell/bitmanipulation.h */
    +#ifndef SIMDJSON_HASWELL_BITMANIPULATION_H
    +#define SIMDJSON_HASWELL_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/bitmask.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return (int)_tzcnt_u64(input_num);
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  ////////
    +  // You might expect the next line to be equivalent to
    +  // return (int)_tzcnt_u64(input_num);
    +  // but the generated code differs and might be less efficient?
    +  ////////
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return _blsr_u64(input_num);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +  return int(_lzcnt_u64(input_num));
    +}
    +
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +simdjson_inline unsigned __int64 count_ones(uint64_t input_num) {
    +  // note: we do not support legacy 32-bit Windows in this kernel
    +  return __popcnt64(input_num);// Visual Studio wants two underscores
    +}
    +#else
    +simdjson_inline long long int count_ones(uint64_t input_num) {
    +  return _popcnt64(input_num);
    +}
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2,
    +                                uint64_t *result) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return _addcarry_u64(0, value1, value2,
    +                       reinterpret_cast(result));
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_HASWELL_BITMANIPULATION_H
    +/* end file simdjson/haswell/bitmanipulation.h */
    +/* including simdjson/haswell/bitmask.h: #include "simdjson/haswell/bitmask.h" */
    +/* begin file simdjson/haswell/bitmask.h */
    +#ifndef SIMDJSON_HASWELL_BITMASK_H
    +#define SIMDJSON_HASWELL_BITMASK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +
    +//
    +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered.
    +//
    +// For example, prefix_xor(00100100) == 00011100
    +//
    +simdjson_inline uint64_t prefix_xor(const uint64_t bitmask) {
    +  // There should be no such thing with a processor supporting avx2
    +  // but not clmul.
    +  __m128i all_ones = _mm_set1_epi8('\xFF');
    +  __m128i result = _mm_clmulepi64_si128(_mm_set_epi64x(0ULL, bitmask), all_ones, 0);
    +  return _mm_cvtsi128_si64(result);
    +}
    +
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_HASWELL_BITMASK_H
    +/* end file simdjson/haswell/bitmask.h */
    +/* including simdjson/haswell/numberparsing_defs.h: #include "simdjson/haswell/numberparsing_defs.h" */
    +/* begin file simdjson/haswell/numberparsing_defs.h */
    +#ifndef SIMDJSON_HASWELL_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_HASWELL_NUMBERPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace numberparsing {
    +
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  // this actually computes *16* values so we are being wasteful.
    +  const __m128i ascii0 = _mm_set1_epi8('0');
    +  const __m128i mul_1_10 =
    +      _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1);
    +  const __m128i mul_1_100 = _mm_setr_epi16(100, 1, 100, 1, 100, 1, 100, 1);
    +  const __m128i mul_1_10000 =
    +      _mm_setr_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1);
    +  const __m128i input = _mm_sub_epi8(
    +      _mm_loadu_si128(reinterpret_cast(chars)), ascii0);
    +  const __m128i t1 = _mm_maddubs_epi16(input, mul_1_10);
    +  const __m128i t2 = _mm_madd_epi16(t1, mul_1_100);
    +  const __m128i t3 = _mm_packus_epi32(t2, t2);
    +  const __m128i t4 = _mm_madd_epi16(t3, mul_1_10000);
    +  return _mm_cvtsi128_si32(
    +      t4); // only captures the sum of the first 8 digits, drop the rest
    +}
    +
    +/** @private */
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif // SIMDJSON_HASWELL_NUMBERPARSING_DEFS_H
    +/* end file simdjson/haswell/numberparsing_defs.h */
    +/* including simdjson/haswell/simd.h: #include "simdjson/haswell/simd.h" */
    +/* begin file simdjson/haswell/simd.h */
    +#ifndef SIMDJSON_HASWELL_SIMD_H
    +#define SIMDJSON_HASWELL_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +namespace simd {
    +
    +  // Forward-declared so they can be used by splat and friends.
    +  template
    +  struct base {
    +    __m256i value;
    +
    +    // Zero constructor
    +    simdjson_inline base() : value{__m256i()} {}
    +
    +    // Conversion from SIMD register
    +    simdjson_inline base(const __m256i _value) : value(_value) {}
    +
    +    // Conversion to SIMD register
    +    simdjson_inline operator const __m256i&() const { return this->value; }
    +    simdjson_inline operator __m256i&() { return this->value; }
    +
    +    // Bit operations
    +    simdjson_inline Child operator|(const Child other) const { return _mm256_or_si256(*this, other); }
    +    simdjson_inline Child operator&(const Child other) const { return _mm256_and_si256(*this, other); }
    +    simdjson_inline Child operator^(const Child other) const { return _mm256_xor_si256(*this, other); }
    +    simdjson_inline Child bit_andnot(const Child other) const { return _mm256_andnot_si256(other, *this); }
    +    simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast | other; return *this_cast; }
    +    simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast & other; return *this_cast; }
    +    simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast ^ other; return *this_cast; }
    +  };
    +
    +  // Forward-declared so they can be used by splat and friends.
    +  template
    +  struct simd8;
    +
    +  template>
    +  struct base8: base> {
    +    typedef uint32_t bitmask_t;
    +    typedef uint64_t bitmask2_t;
    +
    +    simdjson_inline base8() : base>() {}
    +    simdjson_inline base8(const __m256i _value) : base>(_value) {}
    +
    +    friend simdjson_really_inline Mask operator==(const simd8 lhs, const simd8 rhs) { return _mm256_cmpeq_epi8(lhs, rhs); }
    +
    +    static const int SIZE = sizeof(base::value);
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +      return _mm256_alignr_epi8(*this, _mm256_permute2x128_si256(prev_chunk, *this, 0x21), 16 - N);
    +    }
    +  };
    +
    +  // SIMD byte mask type (returned by things like eq and gt)
    +  template<>
    +  struct simd8: base8 {
    +    static simdjson_inline simd8 splat(bool _value) { return _mm256_set1_epi8(uint8_t(-(!!_value))); }
    +
    +    simdjson_inline simd8() : base8() {}
    +    simdjson_inline simd8(const __m256i _value) : base8(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(bool _value) : base8(splat(_value)) {}
    +
    +    simdjson_inline int to_bitmask() const { return _mm256_movemask_epi8(*this); }
    +    simdjson_inline bool any() const { return !_mm256_testz_si256(*this, *this); }
    +    simdjson_inline simd8 operator~() const { return *this ^ true; }
    +  };
    +
    +  template
    +  struct base8_numeric: base8 {
    +    static simdjson_inline simd8 splat(T _value) { return _mm256_set1_epi8(_value); }
    +    static simdjson_inline simd8 zero() { return _mm256_setzero_si256(); }
    +    static simdjson_inline simd8 load(const T values[32]) {
    +      return _mm256_loadu_si256(reinterpret_cast(values));
    +    }
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    static simdjson_inline simd8 repeat_16(
    +      T v0,  T v1,  T v2,  T v3,  T v4,  T v5,  T v6,  T v7,
    +      T v8,  T v9,  T v10, T v11, T v12, T v13, T v14, T v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    simdjson_inline base8_numeric() : base8() {}
    +    simdjson_inline base8_numeric(const __m256i _value) : base8(_value) {}
    +
    +    // Store to array
    +    simdjson_inline void store(T dst[32]) const { return _mm256_storeu_si256(reinterpret_cast<__m256i *>(dst), *this); }
    +
    +    // Addition/subtraction are the same for signed and unsigned
    +    simdjson_inline simd8 operator+(const simd8 other) const { return _mm256_add_epi8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return _mm256_sub_epi8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *static_cast*>(this); }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *static_cast*>(this); }
    +
    +    // Override to distinguish from bool version
    +    simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +
    +    // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values)
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return _mm256_shuffle_epi8(lookup_table, *this);
    +    }
    +
    +    // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset).
    +    // Passing a 0 value for mask would be equivalent to writing out every byte to output.
    +    // Only the first 32 - count_ones(mask) bytes of the result are significant but 32 bytes
    +    // get written.
    +    // Design consideration: it seems like a function with the
    +    // signature simd8 compress(uint32_t mask) would be
    +    // sensible, but the AVX ISA makes this kind of approach difficult.
    +    template
    +    simdjson_inline void compress(uint32_t mask, L * output) const {
    +      using internal::thintable_epi8;
    +      using internal::BitsSetTable256mul2;
    +      using internal::pshufb_combine_table;
    +      // this particular implementation was inspired by work done by @animetosho
    +      // we do it in four steps, first 8 bytes and then second 8 bytes...
    +      uint8_t mask1 = uint8_t(mask); // least significant 8 bits
    +      uint8_t mask2 = uint8_t(mask >> 8); // second least significant 8 bits
    +      uint8_t mask3 = uint8_t(mask >> 16); // ...
    +      uint8_t mask4 = uint8_t(mask >> 24); // ...
    +      // next line just loads the 64-bit values thintable_epi8[mask1] and
    +      // thintable_epi8[mask2] into a 128-bit register, using only
    +      // two instructions on most compilers.
    +      __m256i shufmask =  _mm256_set_epi64x(thintable_epi8[mask4], thintable_epi8[mask3],
    +        thintable_epi8[mask2], thintable_epi8[mask1]);
    +      // we increment by 0x08 the second half of the mask and so forth
    +      shufmask =
    +      _mm256_add_epi8(shufmask, _mm256_set_epi32(0x18181818, 0x18181818,
    +         0x10101010, 0x10101010, 0x08080808, 0x08080808, 0, 0));
    +      // this is the version "nearly pruned"
    +      __m256i pruned = _mm256_shuffle_epi8(*this, shufmask);
    +      // we still need to put the  pieces back together.
    +      // we compute the popcount of the first words:
    +      int pop1 = BitsSetTable256mul2[mask1];
    +      int pop3 = BitsSetTable256mul2[mask3];
    +
    +      // then load the corresponding mask
    +      // could be done with _mm256_loadu2_m128i but many standard libraries omit this intrinsic.
    +      __m256i v256 = _mm256_castsi128_si256(
    +        _mm_loadu_si128(reinterpret_cast(pshufb_combine_table + pop1 * 8)));
    +      __m256i compactmask = _mm256_insertf128_si256(v256,
    +         _mm_loadu_si128(reinterpret_cast(pshufb_combine_table + pop3 * 8)), 1);
    +      __m256i almostthere =  _mm256_shuffle_epi8(pruned, compactmask);
    +      // We just need to write out the result.
    +      // This is the tricky bit that is hard to do
    +      // if we want to return a SIMD register, since there
    +      // is no single-instruction approach to recombine
    +      // the two 128-bit lanes with an offset.
    +      __m128i v128;
    +      v128 = _mm256_castsi256_si128(almostthere);
    +      _mm_storeu_si128( reinterpret_cast<__m128i *>(output), v128);
    +      v128 = _mm256_extractf128_si256(almostthere, 1);
    +      _mm_storeu_si128( reinterpret_cast<__m128i *>(output + 16 - count_ones(mask & 0xFFFF)), v128);
    +    }
    +
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +  };
    +
    +  // Signed bytes
    +  template<>
    +  struct simd8 : base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m256i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const int8_t values[32]) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15,
    +      int8_t v16, int8_t v17, int8_t v18, int8_t v19, int8_t v20, int8_t v21, int8_t v22, int8_t v23,
    +      int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, int8_t v30, int8_t v31
    +    ) : simd8(_mm256_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15,
    +      v16,v17,v18,v19,v20,v21,v22,v23,
    +      v24,v25,v26,v27,v28,v29,v30,v31
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Order-sensitive comparisons
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm256_max_epi8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm256_min_epi8(*this, other); }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return _mm256_cmpgt_epi8(*this, other); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return _mm256_cmpgt_epi8(other, *this); }
    +  };
    +
    +  // Unsigned bytes
    +  template<>
    +  struct simd8: base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m256i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const uint8_t values[32]) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15,
    +      uint8_t v16, uint8_t v17, uint8_t v18, uint8_t v19, uint8_t v20, uint8_t v21, uint8_t v22, uint8_t v23,
    +      uint8_t v24, uint8_t v25, uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, uint8_t v31
    +    ) : simd8(_mm256_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15,
    +      v16,v17,v18,v19,v20,v21,v22,v23,
    +      v24,v25,v26,v27,v28,v29,v30,v31
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Saturated math
    +    simdjson_inline simd8 saturating_add(const simd8 other) const { return _mm256_adds_epu8(*this, other); }
    +    simdjson_inline simd8 saturating_sub(const simd8 other) const { return _mm256_subs_epu8(*this, other); }
    +
    +    // Order-specific operations
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm256_max_epu8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm256_min_epu8(other, *this); }
    +    // Same as >, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 gt_bits(const simd8 other) const { return this->saturating_sub(other); }
    +    // Same as <, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 lt_bits(const simd8 other) const { return other.saturating_sub(*this); }
    +    simdjson_inline simd8 operator<=(const simd8 other) const { return other.max_val(*this) == other; }
    +    simdjson_inline simd8 operator>=(const simd8 other) const { return other.min_val(*this) == other; }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return this->lt_bits(other).any_bits_set(); }
    +
    +    // Bit-specific operations
    +    simdjson_inline simd8 bits_not_set() const { return *this == uint8_t(0); }
    +    simdjson_inline simd8 bits_not_set(simd8 bits) const { return (*this & bits).bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set() const { return ~this->bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set(simd8 bits) const { return ~this->bits_not_set(bits); }
    +    simdjson_inline bool is_ascii() const { return _mm256_movemask_epi8(*this) == 0; }
    +    simdjson_inline bool bits_not_set_anywhere() const { return _mm256_testz_si256(*this, *this); }
    +    simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); }
    +    simdjson_inline bool bits_not_set_anywhere(simd8 bits) const { return _mm256_testz_si256(*this, bits); }
    +    simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return !bits_not_set_anywhere(bits); }
    +    template
    +    simdjson_inline simd8 shr() const { return simd8(_mm256_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); }
    +    template
    +    simdjson_inline simd8 shl() const { return simd8(_mm256_slli_epi16(*this, N)) & uint8_t(0xFFu << N); }
    +    // Get one of the bits and make a bitmask out of it.
    +    // e.g. value.get_bit<7>() gets the high bit
    +    template
    +    simdjson_inline int get_bit() const { return _mm256_movemask_epi8(_mm256_slli_epi16(*this, 7-N)); }
    +  };
    +
    +  template
    +  struct simd8x64 {
    +    static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +    static_assert(NUM_CHUNKS == 2, "Haswell kernel should use two registers per 64-byte block.");
    +    const simd8 chunks[NUM_CHUNKS];
    +
    +    simd8x64(const simd8x64& o) = delete; // no copy allowed
    +    simd8x64& operator=(const simd8& other) = delete; // no assignment allowed
    +    simd8x64() = delete; // no default constructor allowed
    +
    +    simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1) : chunks{chunk0, chunk1} {}
    +    simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8::load(ptr), simd8::load(ptr+32)} {}
    +
    +    simdjson_inline uint64_t compress(uint64_t mask, T * output) const {
    +      uint32_t mask1 = uint32_t(mask);
    +      uint32_t mask2 = uint32_t(mask >> 32);
    +      this->chunks[0].compress(mask1, output);
    +      this->chunks[1].compress(mask2, output + 32 - count_ones(mask1));
    +      return 64 - count_ones(mask);
    +    }
    +
    +    simdjson_inline void store(T ptr[64]) const {
    +      this->chunks[0].store(ptr+sizeof(simd8)*0);
    +      this->chunks[1].store(ptr+sizeof(simd8)*1);
    +    }
    +
    +    simdjson_inline uint64_t to_bitmask() const {
    +      uint64_t r_lo = uint32_t(this->chunks[0].to_bitmask());
    +      uint64_t r_hi =                       this->chunks[1].to_bitmask();
    +      return r_lo | (r_hi << 32);
    +    }
    +
    +    simdjson_inline simd8 reduce_or() const {
    +      return this->chunks[0] | this->chunks[1];
    +    }
    +
    +    simdjson_inline simd8x64 bit_or(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return simd8x64(
    +        this->chunks[0] | mask,
    +        this->chunks[1] | mask
    +      );
    +    }
    +
    +    simdjson_inline uint64_t eq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] == mask,
    +        this->chunks[1] == mask
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t eq(const simd8x64 &other) const {
    +      return  simd8x64(
    +        this->chunks[0] == other.chunks[0],
    +        this->chunks[1] == other.chunks[1]
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t lteq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] <= mask,
    +        this->chunks[1] <= mask
    +      ).to_bitmask();
    +    }
    +  }; // struct simd8x64
    +
    +} // namespace simd
    +
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_HASWELL_SIMD_H
    +/* end file simdjson/haswell/simd.h */
    +/* including simdjson/haswell/stringparsing_defs.h: #include "simdjson/haswell/stringparsing_defs.h" */
    +/* begin file simdjson/haswell/stringparsing_defs.h */
    +#ifndef SIMDJSON_HASWELL_STRINGPARSING_DEFS_H
    +#define SIMDJSON_HASWELL_STRINGPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/simd.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace {
    +
    +using namespace simd;
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 32;
    +  simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; }
    +  simdjson_inline bool has_backslash() { return ((quote_bits - 1) & bs_bits) != 0; }
    +  simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); }
    +  simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); }
    +
    +  uint32_t bs_bits;
    +  uint32_t quote_bits;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // this can read up to 15 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes");
    +  simd8 v(src);
    +  // store to dest unconditionally - we can overwrite the bits we don't like later
    +  v.store(dst);
    +  return {
    +      static_cast((v == '\\').to_bitmask()),     // bs_bits
    +      static_cast((v == '"').to_bitmask()), // quote_bits
    +  };
    +}
    +
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_HASWELL_STRINGPARSING_DEFS_H
    +/* end file simdjson/haswell/stringparsing_defs.h */
    +/* end file simdjson/haswell/begin.h */
    +/* including simdjson/generic/ondemand/amalgamated.h for haswell: #include "simdjson/generic/ondemand/amalgamated.h" */
    +/* begin file simdjson/generic/ondemand/amalgamated.h for haswell */
    +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_ONDEMAND_DEPENDENCIES_H)
    +#error simdjson/generic/ondemand/dependencies.h must be included before simdjson/generic/ondemand/amalgamated.h!
    +#endif
    +
    +// Stuff other things depend on
    +/* including simdjson/generic/ondemand/base.h for haswell: #include "simdjson/generic/ondemand/base.h" */
    +/* begin file simdjson/generic/ondemand/base.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +/**
    + * A fast, simple, DOM-like interface that parses JSON as you use it.
    + *
    + * Designed for maximum speed and a lower memory profile.
    + */
    +namespace ondemand {
    +
    +/** Represents the depth of a JSON value (number of nested arrays/objects). */
    +using depth_t = int32_t;
    +
    +/** @copydoc simdjson::haswell::number_type */
    +using number_type = simdjson::haswell::number_type;
    +
    +/** @private Position in the JSON buffer indexes */
    +using token_position = const uint32_t *;
    +
    +class array;
    +class array_iterator;
    +class document;
    +class document_reference;
    +class document_stream;
    +class field;
    +class json_iterator;
    +enum class json_type;
    +struct number;
    +class object;
    +class object_iterator;
    +class parser;
    +class raw_json_string;
    +class token_iterator;
    +class value;
    +class value_iterator;
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_BASE_H
    +/* end file simdjson/generic/ondemand/base.h for haswell */
    +/* including simdjson/generic/ondemand/value_iterator.h for haswell: #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* begin file simdjson/generic/ondemand/value_iterator.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +/**
    + * Iterates through a single JSON value at a particular depth.
    + *
    + * Does not keep track of the type of value: provides methods for objects, arrays and scalars and expects
    + * the caller to call the right ones.
    + *
    + * @private This is not intended for external use.
    + */
    +class value_iterator {
    +protected:
    +  /** The underlying JSON iterator */
    +  json_iterator *_json_iter{};
    +  /** The depth of this value */
    +  depth_t _depth{};
    +  /**
    +   * The starting token index for this value
    +   */
    +  token_position _start_position{};
    +
    +public:
    +  simdjson_inline value_iterator() noexcept = default;
    +
    +  /**
    +   * Denote that we're starting a document.
    +   */
    +  simdjson_inline void start_document() noexcept;
    +
    +  /**
    +   * Skips a non-iterated or partially-iterated JSON value, whether it is a scalar, array or object.
    +   *
    +   * Optimized for scalars.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code skip_child() noexcept;
    +
    +  /**
    +   * Tell whether the iterator is at the EOF mark
    +   */
    +  simdjson_inline bool at_end() const noexcept;
    +
    +  /**
    +   * Tell whether the iterator is at the start of the value
    +   */
    +  simdjson_inline bool at_start() const noexcept;
    +
    +  /**
    +   * Tell whether the value is open--if the value has not been used, or the array/object is still open.
    +   */
    +  simdjson_inline bool is_open() const noexcept;
    +
    +  /**
    +   * Tell whether the value is at an object's first field (just after the {).
    +   */
    +  simdjson_inline bool at_first_field() const noexcept;
    +
    +  /**
    +   * Abandon all iteration.
    +   */
    +  simdjson_inline void abandon() noexcept;
    +
    +  /**
    +   * Get the child value as a value_iterator.
    +   */
    +  simdjson_inline value_iterator child_value() const noexcept;
    +
    +  /**
    +   * Get the depth of this value.
    +   */
    +  simdjson_inline int32_t depth() const noexcept;
    +
    +  /**
    +   * Get the JSON type of this value.
    +   *
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result type() const noexcept;
    +
    +  /**
    +   * @addtogroup object Object iteration
    +   *
    +   * Methods to iterate and find object fields. These methods generally *assume* the value is
    +   * actually an object; the caller is responsible for keeping track of that fact.
    +   *
    +   * @{
    +   */
    +
    +  /**
    +   * Start an object iteration.
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCORRECT_TYPE if there is no opening {
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_object() noexcept;
    +  /**
    +   * Start an object iteration from the root.
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCORRECT_TYPE if there is no opening {
    +   * @error TAPE_ERROR if there is no matching } at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_root_object() noexcept;
    +  /**
    +   * Checks whether an object could be started from the root. May be called by start_root_object.
    +   *
    +   * @returns SUCCESS if it is possible to safely start an object from the root (document level).
    +   * @error INCORRECT_TYPE if there is no opening {
    +   * @error TAPE_ERROR if there is no matching } at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline error_code check_root_object() noexcept;
    +  /**
    +   * Start an object iteration after the user has already checked and moved past the {.
    +   *
    +   * Does not move the iterator unless the object is empty ({}).
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_object() noexcept;
    +  /**
    +   * Start an object iteration from the root, after the user has already checked and moved past the {.
    +   *
    +   * Does not move the iterator unless the object is empty ({}).
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_root_object() noexcept;
    +
    +  /**
    +   * Moves to the next field in an object.
    +   *
    +   * Looks for , and }. If } is found, the object is finished and the iterator advances past it.
    +   * Otherwise, it advances to the next value.
    +   *
    +   * @return whether there is another field in the object.
    +   * @error TAPE_ERROR If there is a comma missing between fields.
    +   * @error TAPE_ERROR If there is a comma, but not enough tokens remaining to have a key, :, and value.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result has_next_field() noexcept;
    +
    +  /**
    +   * Get the current field's key.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result field_key() noexcept;
    +
    +  /**
    +   * Pass the : in the field and move to its value.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code field_value() noexcept;
    +
    +  /**
    +   * Find the next field with the given key.
    +   *
    +   * Assumes you have called next_field() or otherwise matched the previous value.
    +   *
    +   * This means the iterator must be sitting at the next key:
    +   *
    +   * ```
    +   * { "a": 1, "b": 2 }
    +   *           ^
    +   * ```
    +   *
    +   * Key is *raw JSON,* meaning it will be matched against the verbatim JSON without attempting to
    +   * unescape it. This works well for typical ASCII and UTF-8 keys (almost all of them), but may
    +   * fail to match some keys with escapes (\u, \n, etc.).
    +   */
    +  simdjson_warn_unused simdjson_inline error_code find_field(const std::string_view key) noexcept;
    +
    +  /**
    +   * Find the next field with the given key, *without* unescaping. This assumes object order: it
    +   * will not find the field if it was already passed when looking for some *other* field.
    +   *
    +   * Assumes you have called next_field() or otherwise matched the previous value.
    +   *
    +   * This means the iterator must be sitting at the next key:
    +   *
    +   * ```
    +   * { "a": 1, "b": 2 }
    +   *           ^
    +   * ```
    +   *
    +   * Key is *raw JSON,* meaning it will be matched against the verbatim JSON without attempting to
    +   * unescape it. This works well for typical ASCII and UTF-8 keys (almost all of them), but may
    +   * fail to match some keys with escapes (\u, \n, etc.).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result find_field_raw(const std::string_view key) noexcept;
    +
    +  /**
    +   * Find the field with the given key without regard to order, and *without* unescaping.
    +   *
    +   * This is an unordered object lookup: if the field is not found initially, it will cycle around and scan from the beginning.
    +   *
    +   * Assumes you have called next_field() or otherwise matched the previous value.
    +   *
    +   * This means the iterator must be sitting at the next key:
    +   *
    +   * ```
    +   * { "a": 1, "b": 2 }
    +   *           ^
    +   * ```
    +   *
    +   * Key is *raw JSON,* meaning it will be matched against the verbatim JSON without attempting to
    +   * unescape it. This works well for typical ASCII and UTF-8 keys (almost all of them), but may
    +   * fail to match some keys with escapes (\u, \n, etc.).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result find_field_unordered_raw(const std::string_view key) noexcept;
    +
    +  /** @} */
    +
    +  /**
    +   * @addtogroup array Array iteration
    +   * Methods to iterate over array elements. These methods generally *assume* the value is actually
    +   * an object; the caller is responsible for keeping track of that fact.
    +   * @{
    +   */
    +
    +  /**
    +   * Check for an opening [ and start an array iteration.
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCORRECT_TYPE If there is no [.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_array() noexcept;
    +  /**
    +   * Check for an opening [ and start an array iteration while at the root.
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCORRECT_TYPE If there is no [.
    +   * @error TAPE_ERROR if there is no matching ] at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_root_array() noexcept;
    +  /**
    +   * Checks whether an array could be started from the root. May be called by start_root_array.
    +   *
    +   * @returns SUCCESS if it is possible to safely start an array from the root (document level).
    +   * @error INCORRECT_TYPE If there is no [.
    +   * @error TAPE_ERROR if there is no matching ] at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline error_code check_root_array() noexcept;
    +  /**
    +   * Start an array iteration, after the user has already checked and moved past the [.
    +   *
    +   * Does not move the iterator unless the array is empty ([]).
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_array() noexcept;
    +  /**
    +   * Start an array iteration from the root, after the user has already checked and moved past the [.
    +   *
    +   * Does not move the iterator unless the array is empty ([]).
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_root_array() noexcept;
    +
    +  /**
    +   * Moves to the next element in an array.
    +   *
    +   * Looks for , and ]. If ] is found, the array is finished and the iterator advances past it.
    +   * Otherwise, it advances to the next value.
    +   *
    +   * @return Whether there is another element in the array.
    +   * @error TAPE_ERROR If there is a comma missing between elements.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result has_next_element() noexcept;
    +
    +  /**
    +   * Get a child value iterator.
    +   */
    +  simdjson_warn_unused simdjson_inline value_iterator child() const noexcept;
    +
    +  /** @} */
    +
    +  /**
    +   * @defgroup scalar Scalar values
    +   * @addtogroup scalar
    +   * @{
    +   */
    +
    +  simdjson_warn_unused simdjson_inline simdjson_result get_string(bool allow_replacement) noexcept;
    +  template 
    +  simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_null() noexcept;
    +  simdjson_warn_unused simdjson_inline bool is_negative() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept;
    +
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_string(bool check_trailing, bool allow_replacement) noexcept;
    +  template 
    +  simdjson_warn_unused simdjson_inline error_code get_root_string(string_type& receiver, bool check_trailing, bool allow_replacement) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_wobbly_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_raw_json_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_uint64(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_uint64_in_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_int64(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_int64_in_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_double(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_double_in_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_bool(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline bool is_root_negative() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_root_integer(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_number_type(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_number(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_root_null(bool check_trailing) noexcept;
    +
    +  simdjson_inline error_code error() const noexcept;
    +  simdjson_inline uint8_t *&string_buf_loc() noexcept;
    +  simdjson_inline const json_iterator &json_iter() const noexcept;
    +  simdjson_inline json_iterator &json_iter() noexcept;
    +
    +  simdjson_inline void assert_is_valid() const noexcept;
    +  simdjson_inline bool is_valid() const noexcept;
    +
    +  /** @} */
    +protected:
    +  /**
    +   * Restarts an array iteration.
    +   * @returns Whether the array has any elements (returns false for empty).
    +   */
    +  simdjson_inline simdjson_result reset_array() noexcept;
    +  /**
    +   * Restarts an object iteration.
    +   * @returns Whether the object has any fields (returns false for empty).
    +   */
    +  simdjson_inline simdjson_result reset_object() noexcept;
    +  /**
    +   * move_at_start(): moves us so that we are pointing at the beginning of
    +   * the container. It updates the index so that at_start() is true and it
    +   * syncs the depth. The user can then create a new container instance.
    +   *
    +   * Usage: used with value::count_elements().
    +   **/
    +  simdjson_inline void move_at_start() noexcept;
    +
    +  /**
    +   * move_at_container_start(): moves us so that we are pointing at the beginning of
    +   * the container so that assert_at_container_start() passes.
    +   *
    +   * Usage: used with reset_array() and reset_object().
    +   **/
    +   simdjson_inline void move_at_container_start() noexcept;
    +  /* Useful for debugging and logging purposes. */
    +  inline std::string to_string() const noexcept;
    +  simdjson_inline value_iterator(json_iterator *json_iter, depth_t depth, token_position start_index) noexcept;
    +
    +  simdjson_inline simdjson_result parse_null(const uint8_t *json) const noexcept;
    +  simdjson_inline simdjson_result parse_bool(const uint8_t *json) const noexcept;
    +  simdjson_inline const uint8_t *peek_start() const noexcept;
    +  simdjson_inline uint32_t peek_start_length() const noexcept;
    +
    +  /**
    +   * The general idea of the advance_... methods and the peek_* methods
    +   * is that you first peek and check that you have desired type. If you do,
    +   * and only if you do, then you advance.
    +   *
    +   * We used to unconditionally advance. But this made reasoning about our
    +   * current state difficult.
    +   * Suppose you always advance. Look at the 'value' matching the key
    +   * "shadowable" in the following example...
    +   *
    +   * ({"globals":{"a":{"shadowable":[}}}})
    +   *
    +   * If the user thinks it is a Boolean and asks for it, then we check the '[',
    +   * decide it is not a Boolean, but still move into the next character ('}'). Now
    +   * we are left pointing at '}' right after a '['. And we have not yet reported
    +   * an error, only that we do not have a Boolean.
    +   *
    +   * If, instead, you just stand your ground until it is content that you know, then
    +   * you will only even move beyond the '[' if the user tells you that you have an
    +   * array. So you will be at the '}' character inside the array and, hopefully, you
    +   * will then catch the error because an array cannot start with '}', but the code
    +   * processing Boolean values does not know this.
    +   *
    +   * So the contract is: first call 'peek_...' and then call 'advance_...' only
    +   * if you have determined that it is a type you can handle.
    +   *
    +   * Unfortunately, it makes the code more verbose, longer and maybe more error prone.
    +   */
    +
    +  simdjson_inline void advance_scalar(const char *type) noexcept;
    +  simdjson_inline void advance_root_scalar(const char *type) noexcept;
    +  simdjson_inline void advance_non_root_scalar(const char *type) noexcept;
    +
    +  simdjson_inline const uint8_t *peek_scalar(const char *type) noexcept;
    +  simdjson_inline const uint8_t *peek_root_scalar(const char *type) noexcept;
    +  simdjson_inline const uint8_t *peek_non_root_scalar(const char *type) noexcept;
    +
    +
    +  simdjson_inline error_code start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept;
    +  simdjson_inline error_code end_container() noexcept;
    +
    +  /**
    +   * Advance to a place expecting a value (increasing depth).
    +   *
    +   * @return The current token (the one left behind).
    +   * @error TAPE_ERROR If the document ended early.
    +   */
    +  simdjson_inline simdjson_result advance_to_value() noexcept;
    +
    +  simdjson_inline error_code incorrect_type_error(const char *message) const noexcept;
    +  simdjson_inline error_code error_unless_more_tokens(uint32_t tokens=1) const noexcept;
    +
    +  simdjson_inline bool is_at_start() const noexcept;
    +  /**
    +   * is_at_iterator_start() returns true on an array or object after it has just been
    +   * created, whether the instance is empty or not.
    +   *
    +   * Usage: used by array::begin() in debug mode (SIMDJSON_DEVELOPMENT_CHECKS)
    +   */
    +  simdjson_inline bool is_at_iterator_start() const noexcept;
    +
    +  /**
    +   * Assuming that we are within an object, this returns true if we
    +   * are pointing at a key.
    +   *
    +   * Usage: the skip_child() method should never be used while we are pointing
    +   * at a key inside an object.
    +   */
    +  simdjson_inline bool is_at_key() const noexcept;
    +
    +  inline void assert_at_start() const noexcept;
    +  inline void assert_at_container_start() const noexcept;
    +  inline void assert_at_root() const noexcept;
    +  inline void assert_at_child() const noexcept;
    +  inline void assert_at_next() const noexcept;
    +  inline void assert_at_non_root_start() const noexcept;
    +
    +  /** Get the starting position of this value */
    +  simdjson_inline token_position start_position() const noexcept;
    +
    +  /** @copydoc error_code json_iterator::position() const noexcept; */
    +  simdjson_inline token_position position() const noexcept;
    +  /** @copydoc error_code json_iterator::end_position() const noexcept; */
    +  simdjson_inline token_position last_position() const noexcept;
    +  /** @copydoc error_code json_iterator::end_position() const noexcept; */
    +  simdjson_inline token_position end_position() const noexcept;
    +  /** @copydoc error_code json_iterator::report_error(error_code error, const char *message) noexcept; */
    +  simdjson_inline error_code report_error(error_code error, const char *message) noexcept;
    +
    +  friend class document;
    +  friend class object;
    +  friend class array;
    +  friend class value;
    +}; // value_iterator
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public haswell::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(haswell::ondemand::value_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H
    +/* end file simdjson/generic/ondemand/value_iterator.h for haswell */
    +/* including simdjson/generic/ondemand/value.h for haswell: #include "simdjson/generic/ondemand/value.h" */
    +/* begin file simdjson/generic/ondemand/value.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +/**
    + * An ephemeral JSON value returned during iteration. It is only valid for as long as you do
    + * not access more data in the JSON document.
    + */
    +class value {
    +public:
    +  /**
    +   * Create a new invalid value.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline value() noexcept = default;
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool
    +   *
    +   * You may use get_double(), get_bool(), get_uint64(), get_int64(),
    +   * get_object(), get_array(), get_raw_json_string(), or get_string() instead.
    +   *
    +   * @returns A value of the given type, parsed from the JSON.
    +   * @returns INCORRECT_TYPE If the JSON value is not the given type.
    +   */
    +  template simdjson_inline simdjson_result get() noexcept {
    +    // Unless the simdjson library provides an inline implementation, calling this method should
    +    // immediately fail.
    +    static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. "
    +      "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
    +      "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), "
    +      " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template.");
    +  }
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool
    +   *
    +   * @param out This is set to a value of the given type, parsed from the JSON. If there is an error, this may not be initialized.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   * @returns SUCCESS If the parse succeeded and the out parameter was set to the value.
    +   */
    +  template simdjson_inline error_code get(T &out) noexcept;
    +
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @returns INCORRECT_TYPE If the JSON value is not an array.
    +   */
    +  simdjson_inline simdjson_result get_array() noexcept;
    +
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   */
    +  simdjson_inline simdjson_result get_object() noexcept;
    +
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A unsigned 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a unsigned integer.
    +   *
    +   * @returns A unsigned 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a double
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Equivalent to get().
    +   *
    +   * Important: a value should be consumed once. Calling get_string() twice on the same value
    +   * is an error.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +
    +  /**
    +   * Attempts to fill the provided std::string reference with the parsed value of the current string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Important: a value should be consumed once. Calling get_string() twice on the same value
    +   * is an error.
    +   *
    +   * Performance: This method may be slower than get_string() or get_string(bool) because it may need to allocate memory.
    +   * We recommend you avoid allocating an std::string unless you need to.
    +   *
    +   * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS.
    +   */
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +
    +  /**
    +   * Cast this JSON value to a "wobbly" string.
    +   *
    +   * The string is may not be a valid UTF-8 string.
    +   * See https://simonsapin.github.io/wtf-8/
    +   *
    +   * Important: a value should be consumed once. Calling get_wobbly_string() twice on the same value
    +   * is an error.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @returns INCORRECT_TYPE if the JSON value is not true or false.
    +   */
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +
    +  /**
    +   * Checks if this JSON value is null. If and only if the value is
    +   * null, then it is consumed (we advance). If we find a token that
    +   * begins with 'n' but is not 'null', then an error is returned.
    +   *
    +   * @returns Whether the value is null.
    +   * @returns INCORRECT_TYPE If the JSON value begins with 'n' and is not 'null'.
    +   */
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an array.
    +   */
    +  simdjson_inline operator array() noexcept(false);
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an object.
    +   */
    +  simdjson_inline operator object() noexcept(false);
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline operator int64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline operator double() noexcept(false);
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Equivalent to get().
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator raw_json_string() noexcept(false);
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not true or false.
    +   */
    +  simdjson_inline operator bool() noexcept(false);
    +#endif
    +
    +  /**
    +   * Begin array iteration.
    +   *
    +   * Part of the std::iterable interface.
    +   *
    +   * @returns INCORRECT_TYPE If the JSON value is not an array.
    +   */
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  /**
    +   * Sentinel representing the end of the array.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result end() & noexcept;
    +  /**
    +   * This method scans the array and counts the number of elements.
    +   * The count_elements method should always be called before you have begun
    +   * iterating through the array: it is expected that you are pointing at
    +   * the beginning of the array.
    +   * The runtime complexity is linear in the size of the array. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * Performance hint: You should only call count_elements() as a last
    +   * resort as it may require scanning the document twice or more.
    +   */
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  /**
    +   * This method scans the object and counts the number of key-value pairs.
    +   * The count_fields method should always be called before you have begun
    +   * iterating through the object: it is expected that you are pointing at
    +   * the beginning of the object.
    +   * The runtime complexity is linear in the size of the object. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an object is empty, it is more performant to use
    +   * the is_empty() method on the object instance.
    +   *
    +   * Performance hint: You should only call count_fields() as a last
    +   * resort as it may require scanning the document twice or more.
    +   */
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  /**
    +   * Get the value at the given index in the array. This function has linear-time complexity.
    +   * This function should only be called once on an array instance since the array iterator is not reset between each call.
    +   *
    +   * @return The value at the given index, or:
    +   *         - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
    +   */
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field(const char *key) noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](const char *key) noexcept;
    +
    +  /**
    +   * Get the type of this JSON value. It does not validate or consume the value.
    +   * E.g., you must still call "is_null()" to check that a value is null even if
    +   * "type()" returns json_type::null.
    +   *
    +   * NOTE: If you're only expecting a value to be one type (a typical case), it's generally
    +   * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just
    +   * let it throw an exception).
    +   *
    +   * @return The type of JSON value (json_type::array, json_type::object, json_type::string,
    +   *     json_type::number, json_type::boolean, or json_type::null).
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result type() noexcept;
    +
    +  /**
    +   * Checks whether the value is a scalar (string, number, null, Boolean).
    +   * Returns false when there it is an array or object.
    +   *
    +   * @returns true if the type is string, number, null, Boolean
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +
    +  /**
    +   * Checks whether the value is a negative number.
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline bool is_negative() noexcept;
    +  /**
    +   * Checks whether the value is an integer number. Note that
    +   * this requires to partially parse the number string. If
    +   * the value is determined to be an integer, it may still
    +   * not parse properly as an integer in subsequent steps
    +   * (e.g., it might overflow).
    +   *
    +   * Performance note: if you call this function systematically
    +   * before parsing a number, you may have fallen for a performance
    +   * anti-pattern.
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  /**
    +   * Determine the number type (integer or floating-point number) as quickly
    +   * as possible. This function does not fully validate the input. It is
    +   * useful when you only need to classify the numbers, without parsing them.
    +   *
    +   * If you are planning to retrieve the value or you need full validation,
    +   * consider using the get_number() method instead: it will fully parse
    +   * and validate the input, and give you access to the type:
    +   * get_number().get_number_type().
    +   *
    +   * get_number_type() is number_type::unsigned_integer if we have
    +   * an integer greater or equal to 9223372036854775808
    +   * get_number_type() is number_type::signed_integer if we have an
    +   * integer that is less than 9223372036854775808
    +   * Otherwise, get_number_type() has value number_type::floating_point_number
    +   *
    +   * This function requires processing the number string, but it is expected
    +   * to be faster than get_number().get_number_type() because it is does not
    +   * parse the number value.
    +   *
    +   * @returns the type of the number
    +   */
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +
    +  /**
    +   * Attempt to parse an ondemand::number. An ondemand::number may
    +   * contain an integer value or a floating-point value, the simdjson
    +   * library will autodetect the type. Thus it is a dynamically typed
    +   * number. Before accessing the value, you must determine the detected
    +   * type.
    +   *
    +   * number.get_number_type() is number_type::signed_integer if we have
    +   * an integer in [-9223372036854775808,9223372036854775808)
    +   * You can recover the value by calling number.get_int64() and you
    +   * have that number.is_int64() is true.
    +   *
    +   * number.get_number_type() is number_type::unsigned_integer if we have
    +   * an integer in [9223372036854775808,18446744073709551616)
    +   * You can recover the value by calling number.get_uint64() and you
    +   * have that number.is_uint64() is true.
    +   *
    +   * Otherwise, number.get_number_type() has value number_type::floating_point_number
    +   * and we have a binary64 number.
    +   * You can recover the value by calling number.get_double() and you
    +   * have that number.is_double() is true.
    +   *
    +   * You must check the type before accessing the value: it is an error
    +   * to call "get_int64()" when number.get_number_type() is not
    +   * number_type::signed_integer and when number.is_int64() is false.
    +   *
    +   * Performance note: this is designed with performance in mind. When
    +   * calling 'get_number()', you scan the number string only once, determining
    +   * efficiently the type and storing it in an efficient manner.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept;
    +
    +
    +  /**
    +   * Get the raw JSON for this token.
    +   *
    +   * The string_view will always point into the input buffer.
    +   *
    +   * The string_view will start at the beginning of the token, and include the entire token
    +   * *as well as all spaces until the next token (or EOF).* This means, for example, that a
    +   * string token always begins with a " and is always terminated by the final ", possibly
    +   * followed by a number of spaces.
    +   *
    +   * The string_view is *not* null-terminated. However, if this is a scalar (string, number,
    +   * boolean, or null), the character after the end of the string_view is guaranteed to be
    +   * a non-space token.
    +   *
    +   * Tokens include:
    +   * - {
    +   * - [
    +   * - "a string (possibly with UTF-8 or backslashed characters like \\\")".
    +   * - -1.2e-100
    +   * - true
    +   * - false
    +   * - null
    +   *
    +   * See also value::raw_json().
    +   */
    +  simdjson_inline std::string_view raw_json_token() noexcept;
    +
    +  /**
    +   * Get a string_view pointing at this value in the JSON document.
    +   * If this element is an array or an object, it consumes the array or the object
    +   * and returns a string_view instance corresponding to the
    +   * array as represented in JSON. It points inside the original document.
    +   * If this element is a scalar (string, number, Boolean, null), it returns what
    +   * raw_json_token() would return.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +  /**
    +   * Returns the current location in the document if in bounds.
    +   */
    +  simdjson_inline simdjson_result current_location() noexcept;
    +
    +  /**
    +   * Returns the current depth in the document if in bounds.
    +   *
    +   * E.g.,
    +   *  0 = finished with document
    +   *  1 = document root value (could be [ or {, not yet known)
    +   *  2 = , or } inside root array/object
    +   *  3 = key or value inside root array/object.
    +   */
    +  simdjson_inline int32_t current_depth() const noexcept;
    +
    +  /**
    +   * Get the value associated with the given JSON pointer.  We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/foo/a/1") == 20
    +   *
    +   * It is allowed for a key to be the empty string:
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("//a/1") == 20
    +   *
    +   * Note that at_pointer() called on the document automatically calls the document's rewind
    +   * method between each call. It invalidates all previously accessed arrays, objects and values
    +   * that have not been consumed.
    +   *
    +   * Calling at_pointer() on non-document instances (e.g., arrays and objects) is not
    +   * standardized (by RFC 6901). We provide some experimental support for JSON pointers
    +   * on non-document instances.  Yet it is not the case when calling at_pointer on an array
    +   * or an object instance: there is no rewind and no invalidation.
    +   *
    +   * You may only call at_pointer on an array after it has been created, but before it has
    +   * been first accessed. When calling at_pointer on an array, the pointer is advanced to
    +   * the location indicated by the JSON pointer (in case of success). It is no longer possible
    +   * to call at_pointer on the same array.
    +   *
    +   * You may call at_pointer more than once on an object, but each time the pointer is advanced
    +   * to be within the value matched by the key indicated by the JSON pointer query. Thus any preceding
    +   * key (as well as the current key) can no longer be used with following JSON pointer calls.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   */
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +
    +protected:
    +  /**
    +   * Create a value.
    +   */
    +  simdjson_inline value(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Skip this value, allowing iteration to continue.
    +   */
    +  simdjson_inline void skip() noexcept;
    +
    +  /**
    +   * Start a value at the current position.
    +   *
    +   * (It should already be started; this is just a self-documentation method.)
    +   */
    +  static simdjson_inline value start(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Resume a value.
    +   */
    +  static simdjson_inline value resume(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Get the object, starting or resuming it as necessary
    +   */
    +  simdjson_inline simdjson_result start_or_resume_object() noexcept;
    +
    +  // simdjson_inline void log_value(const char *type) const noexcept;
    +  // simdjson_inline void log_error(const char *message) const noexcept;
    +
    +  value_iterator iter{};
    +
    +  friend class document;
    +  friend class array_iterator;
    +  friend class field;
    +  friend class object;
    +  friend struct simdjson_result;
    +  friend struct simdjson_result;
    +};
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public haswell::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(haswell::ondemand::value &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result get_array() noexcept;
    +  simdjson_inline simdjson_result get_object() noexcept;
    +
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +  template simdjson_inline simdjson_result get() noexcept;
    +
    +  template simdjson_inline error_code get(T &out) noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator haswell::ondemand::array() noexcept(false);
    +  simdjson_inline operator haswell::ondemand::object() noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator haswell::ondemand::raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   *
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field(const char *key) noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](const char *key) noexcept;
    +
    +  /**
    +   * Get the type of this JSON value.
    +   *
    +   * NOTE: If you're only expecting a value to be one type (a typical case), it's generally
    +   * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just
    +   * let it throw an exception).
    +   */
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +  simdjson_inline simdjson_result is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +
    +  /** @copydoc simdjson_inline std::string_view value::raw_json_token() const noexcept */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +  /** @copydoc simdjson_inline simdjson_result current_location() noexcept */
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  /** @copydoc simdjson_inline int32_t current_depth() const noexcept */
    +  simdjson_inline simdjson_result current_depth() const noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_H
    +/* end file simdjson/generic/ondemand/value.h for haswell */
    +/* including simdjson/generic/ondemand/logger.h for haswell: #include "simdjson/generic/ondemand/logger.h" */
    +/* begin file simdjson/generic/ondemand/logger.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_LOGGER_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +// Logging should be free unless SIMDJSON_VERBOSE_LOGGING is set. Importantly, it is critical
    +// that the call to the log functions be side-effect free. Thus, for example, you should not
    +// create temporary std::string instances.
    +namespace logger {
    +
    +enum class log_level : int32_t {
    +  info = 0,
    +  error = 1
    +};
    +
    +#if SIMDJSON_VERBOSE_LOGGING
    +  static constexpr const bool LOG_ENABLED = true;
    +#else
    +  static constexpr const bool LOG_ENABLED = false;
    +#endif
    +
    +// We do not want these functions to be 'really inlined' since real inlining is
    +// for performance purposes and if you are using the loggers, you do not care about
    +// performance (or should not).
    +static inline void log_headers() noexcept;
    +// If args are provided, title will be treated as format string
    +template 
    +static inline void log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, logger::log_level level, Args&&... args) noexcept;
    +template 
    +static inline void log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, logger::log_level level, Args&&... args) noexcept;
    +static inline void log_event(const json_iterator &iter, const char *type, std::string_view detail="", int delta=0, int depth_delta=0) noexcept;
    +static inline void log_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail="") noexcept;
    +static inline void log_value(const json_iterator &iter, const char *type, std::string_view detail="", int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_start_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail="") noexcept;
    +static inline void log_start_value(const json_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_end_value(const json_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +
    +static inline void log_error(const json_iterator &iter, token_position index, depth_t depth, const char *error, const char *detail="") noexcept;
    +static inline void log_error(const json_iterator &iter, const char *error, const char *detail="", int delta=-1, int depth_delta=0) noexcept;
    +
    +static inline void log_event(const value_iterator &iter, const char *type, std::string_view detail="", int delta=0, int depth_delta=0) noexcept;
    +static inline void log_value(const value_iterator &iter, const char *type, std::string_view detail="", int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_start_value(const value_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_end_value(const value_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_error(const value_iterator &iter, const char *error, const char *detail="", int delta=-1, int depth_delta=0) noexcept;
    +
    +} // namespace logger
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_H
    +/* end file simdjson/generic/ondemand/logger.h for haswell */
    +/* including simdjson/generic/ondemand/token_iterator.h for haswell: #include "simdjson/generic/ondemand/token_iterator.h" */
    +/* begin file simdjson/generic/ondemand/token_iterator.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/logger.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +/**
    + * Iterates through JSON tokens (`{` `}` `[` `]` `,` `:` `""` `123` `true` `false` `null`)
    + * detected by stage 1.
    + *
    + * @private This is not intended for external use.
    + */
    +class token_iterator {
    +public:
    +  /**
    +   * Create a new invalid token_iterator.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline token_iterator() noexcept = default;
    +  simdjson_inline token_iterator(token_iterator &&other) noexcept = default;
    +  simdjson_inline token_iterator &operator=(token_iterator &&other) noexcept = default;
    +  simdjson_inline token_iterator(const token_iterator &other) noexcept = default;
    +  simdjson_inline token_iterator &operator=(const token_iterator &other) noexcept = default;
    +
    +  /**
    +   * Advance to the next token (returning the current one).
    +   */
    +  simdjson_inline const uint8_t *return_current_and_advance() noexcept;
    +  /**
    +   * Reports the current offset in bytes from the start of the underlying buffer.
    +   */
    +  simdjson_inline uint32_t current_offset() const noexcept;
    +  /**
    +   * Get the JSON text for a given token (relative).
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = current token,
    +   *              1 = next token, -1 = prev token.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek(int32_t delta=0) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for a given token.
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = current token,
    +   *              1 = next token, -1 = prev token.
    +   */
    +  simdjson_inline uint32_t peek_length(int32_t delta=0) const noexcept;
    +
    +  /**
    +   * Get the JSON text for a given token.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param position The position of the token.
    +   *
    +   */
    +  simdjson_inline const uint8_t *peek(token_position position) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for a given token.
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param position The position of the token.
    +   */
    +  simdjson_inline uint32_t peek_length(token_position position) const noexcept;
    +
    +  /**
    +   * Return the current index.
    +   */
    +  simdjson_inline token_position position() const noexcept;
    +  /**
    +   * Reset to a previously saved index.
    +   */
    +  simdjson_inline void set_position(token_position target_position) noexcept;
    +
    +  // NOTE: we don't support a full C++ iterator interface, because we expect people to make
    +  // different calls to advance the iterator based on *their own* state.
    +
    +  simdjson_inline bool operator==(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator!=(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator>(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator>=(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator<(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator<=(const token_iterator &other) const noexcept;
    +
    +protected:
    +  simdjson_inline token_iterator(const uint8_t *buf, token_position position) noexcept;
    +
    +  /**
    +   * Get the index of the JSON text for a given token (relative).
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = current token,
    +   *              1 = next token, -1 = prev token.
    +   */
    +  simdjson_inline uint32_t peek_index(int32_t delta=0) const noexcept;
    +  /**
    +   * Get the index of the JSON text for a given token.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param position The position of the token.
    +   *
    +   */
    +  simdjson_inline uint32_t peek_index(token_position position) const noexcept;
    +
    +  const uint8_t *buf{};
    +  token_position _position{};
    +
    +  friend class json_iterator;
    +  friend class value_iterator;
    +  friend class object;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, logger::log_level level, Args&&... args) noexcept;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, logger::log_level level, Args&&... args) noexcept;
    +};
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public haswell::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(haswell::ondemand::token_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline ~simdjson_result() noexcept = default; ///< @private
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H
    +/* end file simdjson/generic/ondemand/token_iterator.h for haswell */
    +/* including simdjson/generic/ondemand/json_iterator.h for haswell: #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* begin file simdjson/generic/ondemand/json_iterator.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/token_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +/**
    + * Iterates through JSON tokens, keeping track of depth and string buffer.
    + *
    + * @private This is not intended for external use.
    + */
    +class json_iterator {
    +protected:
    +  token_iterator token{};
    +  ondemand::parser *parser{};
    +  /**
    +   * Next free location in the string buffer.
    +   *
    +   * Used by raw_json_string::unescape() to have a place to unescape strings to.
    +   */
    +  uint8_t *_string_buf_loc{};
    +  /**
    +   * JSON error, if there is one.
    +   *
    +   * INCORRECT_TYPE and NO_SUCH_FIELD are *not* stored here, ever.
    +   *
    +   * PERF NOTE: we *hope* this will be elided into control flow, as it is only used (a) in the first
    +   * iteration of the loop, or (b) for the final iteration after a missing comma is found in ++. If
    +   * this is not elided, we should make sure it's at least not using up a register. Failing that,
    +   * we should store it in document so there's only one of them.
    +   */
    +  error_code error{SUCCESS};
    +  /**
    +   * Depth of the current token in the JSON.
    +   *
    +   * - 0 = finished with document
    +   * - 1 = document root value (could be [ or {, not yet known)
    +   * - 2 = , or } inside root array/object
    +   * - 3 = key or value inside root array/object.
    +   */
    +  depth_t _depth{};
    +  /**
    +   * Beginning of the document indexes.
    +   * Normally we have root == parser->implementation->structural_indexes.get()
    +   * but this may differ, especially in streaming mode (where we have several
    +   * documents);
    +   */
    +  token_position _root{};
    +  /**
    +   * Normally, a json_iterator operates over a single document, but in
    +   * some cases, we may have a stream of documents. This attribute is meant
    +   * as meta-data: the json_iterator works the same irrespective of the
    +   * value of this attribute.
    +   */
    +  bool _streaming{false};
    +
    +public:
    +  simdjson_inline json_iterator() noexcept = default;
    +  simdjson_inline json_iterator(json_iterator &&other) noexcept;
    +  simdjson_inline json_iterator &operator=(json_iterator &&other) noexcept;
    +  simdjson_inline explicit json_iterator(const json_iterator &other) noexcept = default;
    +  simdjson_inline json_iterator &operator=(const json_iterator &other) noexcept = default;
    +  /**
    +   * Skips a JSON value, whether it is a scalar, array or object.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code skip_child(depth_t parent_depth) noexcept;
    +
    +  /**
    +   * Tell whether the iterator is still at the start
    +   */
    +  simdjson_inline bool at_root() const noexcept;
    +
    +  /**
    +   * Tell whether we should be expected to run in streaming
    +   * mode (iterating over many documents). It is pure metadata
    +   * that does not affect how the iterator works. It is used by
    +   * start_root_array() and start_root_object().
    +   */
    +  simdjson_inline bool streaming() const noexcept;
    +
    +  /**
    +   * Get the root value iterator
    +   */
    +  simdjson_inline token_position root_position() const noexcept;
    +  /**
    +   * Assert that we are at the document depth (== 1)
    +   */
    +  simdjson_inline void assert_at_document_depth() const noexcept;
    +  /**
    +   * Assert that we are at the root of the document
    +   */
    +  simdjson_inline void assert_at_root() const noexcept;
    +
    +  /**
    +   * Tell whether the iterator is at the EOF mark
    +   */
    +  simdjson_inline bool at_end() const noexcept;
    +
    +  /**
    +   * Tell whether the iterator is live (has not been moved).
    +   */
    +  simdjson_inline bool is_alive() const noexcept;
    +
    +  /**
    +   * Abandon this iterator, setting depth to 0 (as if the document is finished).
    +   */
    +  simdjson_inline void abandon() noexcept;
    +
    +  /**
    +   * Advance the current token without modifying depth.
    +   */
    +  simdjson_inline const uint8_t *return_current_and_advance() noexcept;
    +
    +  /**
    +   * Returns true if there is a single token in the index (i.e., it is
    +   * a JSON with a scalar value such as a single number).
    +   *
    +   * @return whether there is a single token
    +   */
    +  simdjson_inline bool is_single_token() const noexcept;
    +
    +  /**
    +   * Assert that there are at least the given number of tokens left.
    +   *
    +   * Has no effect in release builds.
    +   */
    +  simdjson_inline void assert_more_tokens(uint32_t required_tokens=1) const noexcept;
    +  /**
    +   * Assert that the given position addresses an actual token (is within bounds).
    +   *
    +   * Has no effect in release builds.
    +   */
    +  simdjson_inline void assert_valid_position(token_position position) const noexcept;
    +  /**
    +   * Get the JSON text for a given token (relative).
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = next token, -1 = prev token.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek(int32_t delta=0) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for the current token (or relative).
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = next token, -1 = prev token.
    +   */
    +  simdjson_inline uint32_t peek_length(int32_t delta=0) const noexcept;
    +  /**
    +   * Get a pointer to the current location in the input buffer.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * You may be pointing outside of the input buffer: it is not generally
    +   * safe to dereference this pointer.
    +   */
    +  simdjson_inline const uint8_t *unsafe_pointer() const noexcept;
    +  /**
    +   * Get the JSON text for a given token.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param position The position of the token to retrieve.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek(token_position position) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for the current token (or relative).
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param position The position of the token to retrieve.
    +   */
    +  simdjson_inline uint32_t peek_length(token_position position) const noexcept;
    +  /**
    +   * Get the JSON text for the last token in the document.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek_last() const noexcept;
    +
    +  /**
    +   * Ascend one level.
    +   *
    +   * Validates that the depth - 1 == parent_depth.
    +   *
    +   * @param parent_depth the expected parent depth.
    +   */
    +  simdjson_inline void ascend_to(depth_t parent_depth) noexcept;
    +
    +  /**
    +   * Descend one level.
    +   *
    +   * Validates that the new depth == child_depth.
    +   *
    +   * @param child_depth the expected child depth.
    +   */
    +  simdjson_inline void descend_to(depth_t child_depth) noexcept;
    +  simdjson_inline void descend_to(depth_t child_depth, int32_t delta) noexcept;
    +
    +  /**
    +   * Get current depth.
    +   */
    +  simdjson_inline depth_t depth() const noexcept;
    +
    +  /**
    +   * Get current (writeable) location in the string buffer.
    +   */
    +  simdjson_inline uint8_t *&string_buf_loc() noexcept;
    +
    +  /**
    +   * Report an unrecoverable error, preventing further iteration.
    +   *
    +   * @param error The error to report. Must not be SUCCESS, UNINITIALIZED, INCORRECT_TYPE, or NO_SUCH_FIELD.
    +   * @param message An error message to report with the error.
    +   */
    +  simdjson_inline error_code report_error(error_code error, const char *message) noexcept;
    +
    +  /**
    +   * Log error, but don't stop iteration.
    +   * @param error The error to report. Must be INCORRECT_TYPE, or NO_SUCH_FIELD.
    +   * @param message An error message to report with the error.
    +   */
    +  simdjson_inline error_code optional_error(error_code error, const char *message) noexcept;
    +
    +  /**
    +   * Take an input in json containing max_len characters and attempt to copy it over to tmpbuf, a buffer with
    +   * N bytes of capacity. It will return false if N is too small (smaller than max_len) of if it is zero.
    +   * The buffer (tmpbuf) is padded with space characters.
    +   */
    +  simdjson_warn_unused simdjson_inline bool copy_to_buffer(const uint8_t *json, uint32_t max_len, uint8_t *tmpbuf, size_t N) noexcept;
    +
    +  simdjson_inline token_position position() const noexcept;
    +  /**
    +   * Write the raw_json_string to the string buffer and return a string_view.
    +   * Each raw_json_string should be unescaped once, or else the string buffer might
    +   * overflow.
    +   */
    +  simdjson_inline simdjson_result unescape(raw_json_string in, bool allow_replacement) noexcept;
    +  simdjson_inline simdjson_result unescape_wobbly(raw_json_string in) noexcept;
    +
    +  simdjson_inline void reenter_child(token_position position, depth_t child_depth) noexcept;
    +
    +  simdjson_inline error_code consume_character(char c) noexcept;
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  simdjson_inline token_position start_position(depth_t depth) const noexcept;
    +  simdjson_inline void set_start_position(depth_t depth, token_position position) noexcept;
    +#endif
    +
    +  /* Useful for debugging and logging purposes. */
    +  inline std::string to_string() const noexcept;
    +
    +  /**
    +   * Returns the current location in the document if in bounds.
    +   */
    +  inline simdjson_result current_location() const noexcept;
    +
    +  /**
    +   * Updates this json iterator so that it is back at the beginning of the document,
    +   * as if it had just been created.
    +   */
    +  inline void rewind() noexcept;
    +  /**
    +   * This checks whether the {,},[,] are balanced so that the document
    +   * ends with proper zero depth. This requires scanning the whole document
    +   * and it may be expensive. It is expected that it will be rarely called.
    +   * It does not attempt to match { with } and [ with ].
    +   */
    +  inline bool balanced() const noexcept;
    +protected:
    +  simdjson_inline json_iterator(const uint8_t *buf, ondemand::parser *parser) noexcept;
    +  /// The last token before the end
    +  simdjson_inline token_position last_position() const noexcept;
    +  /// The token *at* the end. This points at gibberish and should only be used for comparison.
    +  simdjson_inline token_position end_position() const noexcept;
    +  /// The end of the buffer.
    +  simdjson_inline token_position end() const noexcept;
    +
    +  friend class document;
    +  friend class document_stream;
    +  friend class object;
    +  friend class array;
    +  friend class value;
    +  friend class raw_json_string;
    +  friend class parser;
    +  friend class value_iterator;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, logger::log_level level, Args&&... args) noexcept;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, logger::log_level level, Args&&... args) noexcept;
    +}; // json_iterator
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public haswell::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(haswell::ondemand::json_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H
    +/* end file simdjson/generic/ondemand/json_iterator.h for haswell */
    +/* including simdjson/generic/ondemand/json_type.h for haswell: #include "simdjson/generic/ondemand/json_type.h" */
    +/* begin file simdjson/generic/ondemand/json_type.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/numberparsing.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +/**
    + * The type of a JSON value.
    + */
    +enum class json_type {
    +    // Start at 1 to catch uninitialized / default values more easily
    +    array=1, ///< A JSON array   ( [ 1, 2, 3 ... ] )
    +    object,  ///< A JSON object  ( { "a": 1, "b" 2, ... } )
    +    number,  ///< A JSON number  ( 1 or -2.3 or 4.5e6 ...)
    +    string,  ///< A JSON string  ( "a" or "hello world\n" ...)
    +    boolean, ///< A JSON boolean (true or false)
    +    null     ///< A JSON null    (null)
    +};
    +
    +/**
    + * A type representing a JSON number.
    + * The design of the struct is deliberately straight-forward. All
    + * functions return standard values with no error check.
    + */
    +struct number {
    +
    +  /**
    +   * return the automatically determined type of
    +   * the number: number_type::floating_point_number,
    +   * number_type::signed_integer or number_type::unsigned_integer.
    +   *
    +   *    enum class number_type {
    +   *        floating_point_number=1, /// a binary64 number
    +   *        signed_integer,          /// a signed integer that fits in a 64-bit word using two's complement
    +   *        unsigned_integer         /// a positive integer larger or equal to 1<<63
    +   *    };
    +   */
    +  simdjson_inline ondemand::number_type get_number_type() const noexcept;
    +  /**
    +   * return true if the automatically determined type of
    +   * the number is number_type::unsigned_integer.
    +   */
    +  simdjson_inline bool is_uint64() const noexcept;
    +  /**
    +   * return the value as a uint64_t, only valid if is_uint64() is true.
    +   */
    +  simdjson_inline uint64_t get_uint64() const noexcept;
    +  simdjson_inline operator uint64_t() const noexcept;
    +
    +  /**
    +   * return true if the automatically determined type of
    +   * the number is number_type::signed_integer.
    +   */
    +  simdjson_inline bool is_int64() const noexcept;
    +  /**
    +   * return the value as a int64_t, only valid if is_int64() is true.
    +   */
    +  simdjson_inline int64_t get_int64() const noexcept;
    +  simdjson_inline operator int64_t() const noexcept;
    +
    +
    +  /**
    +   * return true if the automatically determined type of
    +   * the number is number_type::floating_point_number.
    +   */
    +  simdjson_inline bool is_double() const noexcept;
    +  /**
    +   * return the value as a double, only valid if is_double() is true.
    +   */
    +  simdjson_inline double get_double() const noexcept;
    +  simdjson_inline operator double() const noexcept;
    +
    +  /**
    +   * Convert the number to a double. Though it always succeed, the conversion
    +   * may be lossy if the number cannot be represented exactly.
    +   */
    +  simdjson_inline double as_double() const noexcept;
    +
    +
    +protected:
    +  /**
    +   * The next block of declaration is designed so that we can call the number parsing
    +   * functions on a number type. They are protected and should never be used outside
    +   * of the core simdjson library.
    +   */
    +  friend class value_iterator;
    +  template
    +  friend error_code numberparsing::slow_float_parsing(simdjson_unused const uint8_t * src, W writer);
    +  template
    +  friend error_code numberparsing::write_float(const uint8_t *const src, bool negative, uint64_t i, const uint8_t * start_digits, size_t digit_count, int64_t exponent, W &writer);
    +  template
    +  friend error_code numberparsing::parse_number(const uint8_t *const src, W &writer);
    +  /** Store a signed 64-bit value to the number. */
    +  simdjson_inline void append_s64(int64_t value) noexcept;
    +  /** Store an unsigned 64-bit value to the number. */
    +  simdjson_inline void append_u64(uint64_t value) noexcept;
    +  /** Store a double value to the number. */
    +  simdjson_inline void append_double(double value) noexcept;
    +  /** Specifies that the value is a double, but leave it undefined. */
    +  simdjson_inline void skip_double() noexcept;
    +  /**
    +   * End of friend declarations.
    +   */
    +
    +  /**
    +   * Our attributes are a union type (size = 64 bits)
    +   * followed by a type indicator.
    +   */
    +  union {
    +    double floating_point_number;
    +    int64_t signed_integer;
    +    uint64_t unsigned_integer;
    +  } payload{0};
    +  number_type type{number_type::signed_integer};
    +};
    +
    +/**
    + * Write the JSON type to the output stream
    + *
    + * @param out The output stream.
    + * @param type The json_type.
    + */
    +inline std::ostream& operator<<(std::ostream& out, json_type type) noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +/**
    + * Send JSON type to an output stream.
    + *
    + * @param out The output stream.
    + * @param type The json_type.
    + * @throw simdjson_error if the result being printed has an error. If there is an error with the
    + *        underlying output stream, that error will be propagated (simdjson_error will not be
    + *        thrown).
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false);
    +#endif
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public haswell::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(haswell::ondemand::json_type &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline ~simdjson_result() noexcept = default; ///< @private
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H
    +/* end file simdjson/generic/ondemand/json_type.h for haswell */
    +/* including simdjson/generic/ondemand/raw_json_string.h for haswell: #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* begin file simdjson/generic/ondemand/raw_json_string.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +/**
    + * A string escaped per JSON rules, terminated with quote ("). They are used to represent
    + * unescaped keys inside JSON documents.
    + *
    + * (In other words, a pointer to the beginning of a string, just after the start quote, inside a
    + * JSON file.)
    + *
    + * This class is deliberately simplistic and has little functionality. You can
    + * compare a raw_json_string instance with an unescaped C string, but
    + * that is nearly all you can do.
    + *
    + * The raw_json_string is unescaped. If you wish to write an unescaped version of it to your own
    + * buffer, you may do so using the parser.unescape(string, buff) method, using an ondemand::parser
    + * instance. Doing so requires you to have a sufficiently large buffer.
    + *
    + * The raw_json_string instances originate typically from field instance which in turn represent
    + * key-value pairs from object instances. From a field instance, you get the raw_json_string
    + * instance by calling key(). You can, if you want a more usable string_view instance, call
    + * the unescaped_key() method on the field instance. You may also create a raw_json_string from
    + * any other string value, with the value.get_raw_json_string() method. Again, you can get
    + * a more usable string_view instance by calling get_string().
    + *
    + */
    +class raw_json_string {
    +public:
    +  /**
    +   * Create a new invalid raw_json_string.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline raw_json_string() noexcept = default;
    +
    +  /**
    +   * Create a new invalid raw_json_string pointed at the given location in the JSON.
    +   *
    +   * The given location must be just *after* the beginning quote (") in the JSON file.
    +   *
    +   * It *must* be terminated by a ", and be a valid JSON string.
    +   */
    +  simdjson_inline raw_json_string(const uint8_t * _buf) noexcept;
    +  /**
    +   * Get the raw pointer to the beginning of the string in the JSON (just after the ").
    +   *
    +   * It is possible for this function to return a null pointer if the instance
    +   * has outlived its existence.
    +   */
    +  simdjson_inline const char * raw() const noexcept;
    +
    +  /**
    +   * This compares the current instance to the std::string_view target: returns true if
    +   * they are byte-by-byte equal (no escaping is done) on target.size() characters,
    +   * and if the raw_json_string instance has a quote character at byte index target.size().
    +   * We never read more than length + 1 bytes in the raw_json_string instance.
    +   * If length is smaller than target.size(), this will return false.
    +   *
    +   * The std::string_view instance may contain any characters. However, the caller
    +   * is responsible for setting length so that length bytes may be read in the
    +   * raw_json_string.
    +   *
    +   * Performance: the comparison may be done using memcmp which may be efficient
    +   * for long strings.
    +   */
    +  simdjson_inline bool unsafe_is_equal(size_t length, std::string_view target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the std::string_view target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   * The std::string_view instance should not contain unescaped quote characters:
    +   * the caller is responsible for this check. See is_free_from_unescaped_quote.
    +   *
    +   * Performance: the comparison is done byte-by-byte which might be inefficient for
    +   * long strings.
    +   *
    +   * If target is a compile-time constant, and your compiler likes you,
    +   * you should be able to do the following without performance penalty...
    +   *
    +   *   static_assert(raw_json_string::is_free_from_unescaped_quote(target), "");
    +   *   s.unsafe_is_equal(target);
    +   */
    +  simdjson_inline bool unsafe_is_equal(std::string_view target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the C string target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   * The provided C string should not contain an unescaped quote character:
    +   * the caller is responsible for this check. See is_free_from_unescaped_quote.
    +   *
    +   * If target is a compile-time constant, and your compiler likes you,
    +   * you should be able to do the following without performance penalty...
    +   *
    +   *   static_assert(raw_json_string::is_free_from_unescaped_quote(target), "");
    +   *   s.unsafe_is_equal(target);
    +   */
    +  simdjson_inline bool unsafe_is_equal(const char* target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the std::string_view target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   */
    +  simdjson_inline bool is_equal(std::string_view target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the C string target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   */
    +  simdjson_inline bool is_equal(const char* target) const noexcept;
    +
    +  /**
    +   * Returns true if target is free from unescaped quote. If target is known at
    +   * compile-time, we might expect the computation to happen at compile time with
    +   * many compilers (not all!).
    +   */
    +  static simdjson_inline bool is_free_from_unescaped_quote(std::string_view target) noexcept;
    +  static simdjson_inline bool is_free_from_unescaped_quote(const char* target) noexcept;
    +
    +private:
    +
    +
    +  /**
    +   * This will set the inner pointer to zero, effectively making
    +   * this instance unusable.
    +   */
    +  simdjson_inline void consume() noexcept { buf = nullptr; }
    +
    +  /**
    +   * Checks whether the inner pointer is non-null and thus usable.
    +   */
    +  simdjson_inline simdjson_warn_unused bool alive() const noexcept { return buf != nullptr; }
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc.
    +   * The result will be a valid UTF-8.
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid until the next parse() call on the parser.
    +   *
    +   * @param iter A json_iterator, which contains a buffer where the string will be written.
    +   * @param allow_replacement Whether we allow replacement of invalid surrogate pairs.
    +   */
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape(json_iterator &iter, bool allow_replacement) const noexcept;
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc.
    +   * The result may not be a valid UTF-8. https://simonsapin.github.io/wtf-8/
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid until the next parse() call on the parser.
    +   *
    +   * @param iter A json_iterator, which contains a buffer where the string will be written.
    +   */
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape_wobbly(json_iterator &iter) const noexcept;
    +  const uint8_t * buf{};
    +  friend class object;
    +  friend class field;
    +  friend class parser;
    +  friend struct simdjson_result;
    +};
    +
    +simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &, const raw_json_string &) noexcept;
    +
    +/**
    + * Comparisons between raw_json_string and std::string_view instances are potentially unsafe: the user is responsible
    + * for providing a string with no unescaped quote. Note that unescaped quotes cannot be present in valid JSON strings.
    + */
    +simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept;
    +simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept;
    +simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept;
    +simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept;
    +
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public haswell::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(haswell::ondemand::raw_json_string &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline ~simdjson_result() noexcept = default; ///< @private
    +
    +  simdjson_inline simdjson_result raw() const noexcept;
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape(haswell::ondemand::json_iterator &iter, bool allow_replacement) const noexcept;
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape_wobbly(haswell::ondemand::json_iterator &iter) const noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H
    +/* end file simdjson/generic/ondemand/raw_json_string.h for haswell */
    +/* including simdjson/generic/ondemand/parser.h for haswell: #include "simdjson/generic/ondemand/parser.h" */
    +/* begin file simdjson/generic/ondemand/parser.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_PARSER_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +/**
    + * The default batch size for document_stream instances for this On Demand kernel.
    + * Note that different On Demand kernel may use a different DEFAULT_BATCH_SIZE value
    + * in the future.
    + */
    +static constexpr size_t DEFAULT_BATCH_SIZE = 1000000;
    +/**
    + * Some adversary might try to set the batch size to 0 or 1, which might cause problems.
    + * We set a minimum of 32B since anything else is highly likely to be an error. In practice,
    + * most users will want a much larger batch size.
    + *
    + * All non-negative MINIMAL_BATCH_SIZE values should be 'safe' except that, obviously, no JSON
    + * document can ever span 0 or 1 byte and that very large values would create memory allocation issues.
    + */
    +static constexpr size_t MINIMAL_BATCH_SIZE = 32;
    +
    +/**
    + * A JSON fragment iterator.
    + *
    + * This holds the actual iterator as well as the buffer for writing strings.
    + */
    +class parser {
    +public:
    +  /**
    +   * Create a JSON parser.
    +   *
    +   * The new parser will have zero capacity.
    +   */
    +  inline explicit parser(size_t max_capacity = SIMDJSON_MAXSIZE_BYTES) noexcept;
    +
    +  inline parser(parser &&other) noexcept = default;
    +  simdjson_inline parser(const parser &other) = delete;
    +  simdjson_inline parser &operator=(const parser &other) = delete;
    +  simdjson_inline parser &operator=(parser &&other) noexcept = default;
    +
    +  /** Deallocate the JSON parser. */
    +  inline ~parser() noexcept = default;
    +
    +  /**
    +   * Start iterating an on-demand JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   document doc = parser.iterate(json);
    +   *
    +   * It is expected that the content is a valid UTF-8 file, containing a valid JSON document.
    +   * Otherwise the iterate method may return an error. In particular, the whole input should be
    +   * valid: we do not attempt to tolerate incorrect content either before or after a JSON
    +   * document. If there is a UTF-8 BOM, the parser skips it.
    +   *
    +   * ### IMPORTANT: Validate what you use
    +   *
    +   * Calling iterate on an invalid JSON document may not immediately trigger an error. The call to
    +   * iterate does not parse and validate the whole document.
    +   *
    +   * ### IMPORTANT: Buffer Lifetime
    +   *
    +   * Because parsing is done while you iterate, you *must* keep the JSON buffer around at least as
    +   * long as the document iteration.
    +   *
    +   * ### IMPORTANT: Document Lifetime
    +   *
    +   * Only one iteration at a time can happen per parser, and the parser *must* be kept alive during
    +   * iteration to ensure intermediate buffers can be accessed. Any document must be destroyed before
    +   * you call parse() again or destroy the parser.
    +   *
    +   * ### REQUIRED: Buffer Padding
    +   *
    +   * The buffer must have at least SIMDJSON_PADDING extra allocated bytes. It does not matter what
    +   * those bytes are initialized to, as long as they are allocated. These bytes will be read: if you
    +   * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the
    +   * SIMDJSON_PADDING bytes to avoid runtime warnings.
    +   *
    +   * @param json The JSON to parse.
    +   * @param len The length of the JSON.
    +   * @param capacity The number of bytes allocated in the JSON (must be at least len+SIMDJSON_PADDING).
    +   *
    +   * @return The document, or an error:
    +   *         - INSUFFICIENT_PADDING if the input has less than SIMDJSON_PADDING extra bytes.
    +   *         - MEMALLOC if realloc_if_needed the parser does not have enough capacity, and memory
    +   *           allocation fails.
    +   *         - EMPTY if the document is all whitespace.
    +   *         - UTF8_ERROR if the document is not valid UTF-8.
    +   *         - UNESCAPED_CHARS if a string contains control characters that must be escaped
    +   *         - UNCLOSED_STRING if there is an unclosed string in the document.
    +   */
    +  simdjson_warn_unused simdjson_result iterate(padded_string_view json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const char *json, size_t len, size_t capacity) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const uint8_t *json, size_t len, size_t capacity) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(std::string_view json, size_t capacity) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const std::string &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(std::string &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(padded_string &&json) & noexcept = delete;
    +
    +  /**
    +   * @private
    +   *
    +   * Start iterating an on-demand JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   json_iterator doc = parser.iterate(json);
    +   *
    +   * ### IMPORTANT: Buffer Lifetime
    +   *
    +   * Because parsing is done while you iterate, you *must* keep the JSON buffer around at least as
    +   * long as the document iteration.
    +   *
    +   * ### IMPORTANT: Document Lifetime
    +   *
    +   * Only one iteration at a time can happen per parser, and the parser *must* be kept alive during
    +   * iteration to ensure intermediate buffers can be accessed. Any document must be destroyed before
    +   * you call parse() again or destroy the parser.
    +   *
    +   * The ondemand::document instance holds the iterator. The document must remain in scope
    +   * while you are accessing instances of ondemand::value, ondemand::object, ondemand::array.
    +   *
    +   * ### REQUIRED: Buffer Padding
    +   *
    +   * The buffer must have at least SIMDJSON_PADDING extra allocated bytes. It does not matter what
    +   * those bytes are initialized to, as long as they are allocated. These bytes will be read: if you
    +   * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the
    +   * SIMDJSON_PADDING bytes to avoid runtime warnings.
    +   *
    +   * @param json The JSON to parse.
    +   *
    +   * @return The iterator, or an error:
    +   *         - INSUFFICIENT_PADDING if the input has less than SIMDJSON_PADDING extra bytes.
    +   *         - MEMALLOC if realloc_if_needed the parser does not have enough capacity, and memory
    +   *           allocation fails.
    +   *         - EMPTY if the document is all whitespace.
    +   *         - UTF8_ERROR if the document is not valid UTF-8.
    +   *         - UNESCAPED_CHARS if a string contains control characters that must be escaped
    +   *         - UNCLOSED_STRING if there is an unclosed string in the document.
    +   */
    +  simdjson_warn_unused simdjson_result iterate_raw(padded_string_view json) & noexcept;
    +
    +
    +  /**
    +   * Parse a buffer containing many JSON documents.
    +   *
    +   *   auto json = R"({ "foo": 1 } { "foo": 2 } { "foo": 3 } )"_padded;
    +   *   ondemand::parser parser;
    +   *   ondemand::document_stream docs = parser.iterate_many(json);
    +   *   for (auto & doc : docs) {
    +   *     std::cout << doc["foo"] << std::endl;
    +   *   }
    +   *   // Prints 1 2 3
    +   *
    +   * No copy of the input buffer is made.
    +   *
    +   * The function is lazy: it may be that no more than one JSON document at a time is parsed.
    +   *
    +   * The caller is responsabile to ensure that the input string data remains unchanged and is
    +   * not deleted during the loop.
    +   *
    +   * ### Format
    +   *
    +   * The buffer must contain a series of one or more JSON documents, concatenated into a single
    +   * buffer, separated by ASCII whitespace. It effectively parses until it has a fully valid document,
    +   * then starts parsing the next document at that point. (It does this with more parallelism and
    +   * lookahead than you might think, though.)
    +   *
    +   * documents that consist of an object or array may omit the whitespace between them, concatenating
    +   * with no separator. Documents that consist of a single primitive (i.e. documents that are not
    +   * arrays or objects) MUST be separated with ASCII whitespace.
    +   *
    +   * The characters inside a JSON document, and between JSON documents, must be valid Unicode (UTF-8).
    +   * If there is a UTF-8 BOM, the parser skips it.
    +   *
    +   * The documents must not exceed batch_size bytes (by default 1MB) or they will fail to parse.
    +   * Setting batch_size to excessively large or excessively small values may impact negatively the
    +   * performance.
    +   *
    +   * ### REQUIRED: Buffer Padding
    +   *
    +   * The buffer must have at least SIMDJSON_PADDING extra allocated bytes. It does not matter what
    +   * those bytes are initialized to, as long as they are allocated. These bytes will be read: if you
    +   * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the
    +   * SIMDJSON_PADDING bytes to avoid runtime warnings.
    +   *
    +   * ### Threads
    +   *
    +   * When compiled with SIMDJSON_THREADS_ENABLED, this method will use a single thread under the
    +   * hood to do some lookahead.
    +   *
    +   * ### Parser Capacity
    +   *
    +   * If the parser's current capacity is less than batch_size, it will allocate enough capacity
    +   * to handle it (up to max_capacity).
    +   *
    +   * @param buf The concatenated JSON to parse.
    +   * @param len The length of the concatenated JSON.
    +   * @param batch_size The batch size to use. MUST be larger than the largest document. The sweet
    +   *                   spot is cache-related: small enough to fit in cache, yet big enough to
    +   *                   parse as many documents as possible in one tight loop.
    +   *                   Defaults to 10MB, which has been a reasonable sweet spot in our tests.
    +   * @param allow_comma_separated (defaults on false) This allows a mode where the documents are
    +   *                   separated by commas instead of whitespace. It comes with a performance
    +   *                   penalty because the entire document is indexed at once (and the document must be
    +   *                   less than 4 GB), and there is no multithreading. In this mode, the batch_size parameter
    +   *                   is effectively ignored, as it is set to at least the document size.
    +   * @return The stream, or an error. An empty input will yield 0 documents rather than an EMPTY error. Errors:
    +   *         - MEMALLOC if the parser does not have enough capacity and memory allocation fails
    +   *         - CAPACITY if the parser does not have enough capacity and batch_size > max_capacity.
    +   *         - other json errors if parsing fails. You should not rely on these errors to always the same for the
    +   *           same document: they may vary under runtime dispatch (so they may vary depending on your system and hardware).
    +   */
    +  inline simdjson_result iterate_many(const uint8_t *buf, size_t len, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */
    +  inline simdjson_result iterate_many(const char *buf, size_t len, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */
    +  inline simdjson_result iterate_many(const std::string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  inline simdjson_result iterate_many(const std::string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe
    +  /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */
    +  inline simdjson_result iterate_many(const padded_string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  inline simdjson_result iterate_many(const padded_string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe
    +
    +  /** @private We do not want to allow implicit conversion from C string to std::string. */
    +  simdjson_result iterate_many(const char *buf, size_t batch_size = DEFAULT_BATCH_SIZE) noexcept = delete;
    +
    +  /** The capacity of this parser (the largest document it can process). */
    +  simdjson_inline size_t capacity() const noexcept;
    +  /** The maximum capacity of this parser (the largest document it is allowed to process). */
    +  simdjson_inline size_t max_capacity() const noexcept;
    +  simdjson_inline void set_max_capacity(size_t max_capacity) noexcept;
    +  /**
    +   * The maximum depth of this parser (the most deeply nested objects and arrays it can process).
    +   * This parameter is only relevant when the macro SIMDJSON_DEVELOPMENT_CHECKS is set to true.
    +   * The document's instance current_depth() method should be used to monitor the parsing
    +   * depth and limit it if desired.
    +   */
    +  simdjson_inline size_t max_depth() const noexcept;
    +
    +  /**
    +   * Ensure this parser has enough memory to process JSON documents up to `capacity` bytes in length
    +   * and `max_depth` depth.
    +   *
    +   * The max_depth parameter is only relevant when the macro SIMDJSON_DEVELOPMENT_CHECKS is set to true.
    +   * The document's instance current_depth() method should be used to monitor the parsing
    +   * depth and limit it if desired.
    +   *
    +   * @param capacity The new capacity.
    +   * @param max_depth The new max_depth. Defaults to DEFAULT_MAX_DEPTH.
    +   * @return The error, if there is one.
    +   */
    +  simdjson_warn_unused error_code allocate(size_t capacity, size_t max_depth=DEFAULT_MAX_DEPTH) noexcept;
    +
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  /**
    +   * The parser instance can use threads when they are available to speed up some
    +   * operations. It is enabled by default. Changing this attribute will change the
    +   * behavior of the parser for future operations.
    +   */
    +  bool threaded{true};
    +  #endif
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc. to a user-provided buffer.
    +   * The result must be valid UTF-8.
    +   * The provided pointer is advanced to the end of the string by reference, and a string_view instance
    +   * is returned. You can ensure that your buffer is large enough by allocating a block of memory at least
    +   * as large as the input JSON plus SIMDJSON_PADDING and then unescape all strings to this one buffer.
    +   *
    +   * This unescape function is a low-level function. If you want a more user-friendly approach, you should
    +   * avoid raw_json_string instances (e.g., by calling unescaped_key() instead of key() or get_string()
    +   * instead of get_raw_json_string()).
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid as long as the bytes in dst.
    +   *
    +   * @param raw_json_string input
    +   * @param dst A pointer to a buffer at least large enough to write this string as well as
    +   *            an additional SIMDJSON_PADDING bytes.
    +   * @param allow_replacement Whether we allow a replacement if the input string contains unmatched surrogate pairs.
    +   * @return A string_view pointing at the unescaped string in dst
    +   * @error STRING_ERROR if escapes are incorrect.
    +   */
    +  simdjson_inline simdjson_result unescape(raw_json_string in, uint8_t *&dst, bool allow_replacement = false) const noexcept;
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc. to a user-provided buffer.
    +   * The result may not be valid UTF-8. See https://simonsapin.github.io/wtf-8/
    +   * The provided pointer is advanced to the end of the string by reference, and a string_view instance
    +   * is returned. You can ensure that your buffer is large enough by allocating a block of memory at least
    +   * as large as the input JSON plus SIMDJSON_PADDING and then unescape all strings to this one buffer.
    +   *
    +   * This unescape function is a low-level function. If you want a more user-friendly approach, you should
    +   * avoid raw_json_string instances (e.g., by calling unescaped_key() instead of key() or get_string()
    +   * instead of get_raw_json_string()).
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid as long as the bytes in dst.
    +   *
    +   * @param raw_json_string input
    +   * @param dst A pointer to a buffer at least large enough to write this string as well as
    +   *            an additional SIMDJSON_PADDING bytes.
    +   * @return A string_view pointing at the unescaped string in dst
    +   * @error STRING_ERROR if escapes are incorrect.
    +   */
    +  simdjson_inline simdjson_result unescape_wobbly(raw_json_string in, uint8_t *&dst) const noexcept;
    +
    +private:
    +  /** @private [for benchmarking access] The implementation to use */
    +  std::unique_ptr implementation{};
    +  size_t _capacity{0};
    +  size_t _max_capacity;
    +  size_t _max_depth{DEFAULT_MAX_DEPTH};
    +  std::unique_ptr string_buf{};
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  std::unique_ptr start_positions{};
    +#endif
    +
    +  friend class json_iterator;
    +  friend class document_stream;
    +};
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public haswell::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(haswell::ondemand::parser &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_H
    +/* end file simdjson/generic/ondemand/parser.h for haswell */
    +
    +// All other declarations
    +/* including simdjson/generic/ondemand/array.h for haswell: #include "simdjson/generic/ondemand/array.h" */
    +/* begin file simdjson/generic/ondemand/array.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +/**
    + * A forward-only JSON array.
    + */
    +class array {
    +public:
    +  /**
    +   * Create a new invalid array.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline array() noexcept = default;
    +
    +  /**
    +   * Begin array iteration.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result begin() noexcept;
    +  /**
    +   * Sentinel representing the end of the array.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result end() noexcept;
    +  /**
    +   * This method scans the array and counts the number of elements.
    +   * The count_elements method should always be called before you have begun
    +   * iterating through the array: it is expected that you are pointing at
    +   * the beginning of the array.
    +   * The runtime complexity is linear in the size of the array. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an array is empty, it is more performant to use
    +   * the is_empty() method.
    +   */
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  /**
    +   * This method scans the beginning of the array and checks whether the
    +   * array is empty.
    +   * The runtime complexity is constant time. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   */
    +  simdjson_inline simdjson_result is_empty() & noexcept;
    +  /**
    +   * Reset the iterator so that we are pointing back at the
    +   * beginning of the array. You should still consume values only once even if you
    +   * can iterate through the array more than once. If you unescape a string
    +   * within the array more than once, you have unsafe code. Note that rewinding
    +   * an array means that you may need to reparse it anew: it is not a free
    +   * operation.
    +   *
    +   * @returns true if the array contains some elements (not empty)
    +   */
    +  inline simdjson_result reset() & noexcept;
    +  /**
    +   * Get the value associated with the given JSON pointer.  We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard, interpreting the current node
    +   * as the root of its own JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"([ { "foo": { "a": [ 10, 20, 30 ] }} ])"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/0/foo/a/1") == 20
    +   *
    +   * Note that at_pointer() called on the document automatically calls the document's rewind
    +   * method between each call. It invalidates all previously accessed arrays, objects and values
    +   * that have not been consumed. Yet it is not the case when calling at_pointer on an array
    +   * instance: there is no rewind and no invalidation.
    +   *
    +   * You may only call at_pointer on an array after it has been created, but before it has
    +   * been first accessed. When calling at_pointer on an array, the pointer is advanced to
    +   * the location indicated by the JSON pointer (in case of success). It is no longer possible
    +   * to call at_pointer on the same array.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching.
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   */
    +  inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  /**
    +   * Consumes the array and returns a string_view instance corresponding to the
    +   * array as represented in JSON. It points inside the original document.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +  /**
    +   * Get the value at the given index. This function has linear-time complexity.
    +   * This function should only be called once on an array instance since the array iterator is not reset between each call.
    +   *
    +   * @return The value at the given index, or:
    +   *         - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
    +   */
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +protected:
    +  /**
    +   * Go to the end of the array, no matter where you are right now.
    +   */
    +  simdjson_inline error_code consume() noexcept;
    +
    +  /**
    +   * Begin array iteration.
    +   *
    +   * @param iter The iterator. Must be where the initial [ is expected. Will be *moved* into the
    +   *        resulting array.
    +   * @error INCORRECT_TYPE if the iterator is not at [.
    +   */
    +  static simdjson_inline simdjson_result start(value_iterator &iter) noexcept;
    +  /**
    +   * Begin array iteration from the root.
    +   *
    +   * @param iter The iterator. Must be where the initial [ is expected. Will be *moved* into the
    +   *        resulting array.
    +   * @error INCORRECT_TYPE if the iterator is not at [.
    +   * @error TAPE_ERROR if there is no closing ] at the end of the document.
    +   */
    +  static simdjson_inline simdjson_result start_root(value_iterator &iter) noexcept;
    +  /**
    +   * Begin array iteration.
    +   *
    +   * This version of the method should be called after the initial [ has been verified, and is
    +   * intended for use by switch statements that check the type of a value.
    +   *
    +   * @param iter The iterator. Must be after the initial [. Will be *moved* into the resulting array.
    +   */
    +  static simdjson_inline simdjson_result started(value_iterator &iter) noexcept;
    +
    +  /**
    +   * Create an array at the given Internal array creation. Call array::start() or array::started() instead of this.
    +   *
    +   * @param iter The iterator. Must either be at the start of the first element with iter.is_alive()
    +   *        == true, or past the [] with is_alive() == false if the array is empty. Will be *moved*
    +   *        into the resulting array.
    +   */
    +  simdjson_inline array(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Iterator marking current position.
    +   *
    +   * iter.is_alive() == false indicates iteration is complete.
    +   */
    +  value_iterator iter{};
    +
    +  friend class value;
    +  friend class document;
    +  friend struct simdjson_result;
    +  friend struct simdjson_result;
    +  friend class array_iterator;
    +};
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public haswell::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(haswell::ondemand::array &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result begin() noexcept;
    +  simdjson_inline simdjson_result end() noexcept;
    +  inline simdjson_result count_elements() & noexcept;
    +  inline simdjson_result is_empty() & noexcept;
    +  inline simdjson_result reset() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_H
    +/* end file simdjson/generic/ondemand/array.h for haswell */
    +/* including simdjson/generic/ondemand/array_iterator.h for haswell: #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* begin file simdjson/generic/ondemand/array_iterator.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +/**
    + * A forward-only JSON array.
    + *
    + * This is an input_iterator, meaning:
    + * - It is forward-only
    + * - * must be called exactly once per element.
    + * - ++ must be called exactly once in between each * (*, ++, *, ++, * ...)
    + */
    +class array_iterator {
    +public:
    +  /** Create a new, invalid array iterator. */
    +  simdjson_inline array_iterator() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  /**
    +   * Get the current element.
    +   *
    +   * Part of the std::iterator interface.
    +   */
    +  simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  /**
    +   * Check if we are at the end of the JSON.
    +   *
    +   * Part of the std::iterator interface.
    +   *
    +   * @return true if there are no more elements in the JSON array.
    +   */
    +  simdjson_inline bool operator==(const array_iterator &) const noexcept;
    +  /**
    +   * Check if there are more elements in the JSON array.
    +   *
    +   * Part of the std::iterator interface.
    +   *
    +   * @return true if there are more elements in the JSON array.
    +   */
    +  simdjson_inline bool operator!=(const array_iterator &) const noexcept;
    +  /**
    +   * Move to the next element.
    +   *
    +   * Part of the std::iterator interface.
    +   */
    +  simdjson_inline array_iterator &operator++() noexcept;
    +
    +private:
    +  value_iterator iter{};
    +
    +  simdjson_inline array_iterator(const value_iterator &iter) noexcept;
    +
    +  friend class array;
    +  friend class value;
    +  friend struct simdjson_result;
    +};
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public haswell::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(haswell::ondemand::array_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  simdjson_inline bool operator==(const simdjson_result &) const noexcept;
    +  simdjson_inline bool operator!=(const simdjson_result &) const noexcept;
    +  simdjson_inline simdjson_result &operator++() noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H
    +/* end file simdjson/generic/ondemand/array_iterator.h for haswell */
    +/* including simdjson/generic/ondemand/document.h for haswell: #include "simdjson/generic/ondemand/document.h" */
    +/* begin file simdjson/generic/ondemand/document.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +/**
    + * A JSON document. It holds a json_iterator instance.
    + *
    + * Used by tokens to get text, and string buffer location.
    + *
    + * You must keep the document around during iteration.
    + */
    +class document {
    +public:
    +  /**
    +   * Create a new invalid document.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline document() noexcept = default;
    +  simdjson_inline document(const document &other) noexcept = delete; // pass your documents by reference, not by copy
    +  simdjson_inline document(document &&other) noexcept = default;
    +  simdjson_inline document &operator=(const document &other) noexcept = delete;
    +  simdjson_inline document &operator=(document &&other) noexcept = default;
    +
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @returns INCORRECT_TYPE If the JSON value is not an array.
    +   */
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   */
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  /**
    +   * Cast this JSON value (inside string) to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  /**
    +   * Cast this JSON value (inside string) to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a double.
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Important: Calling get_string() twice on the same document is an error.
    +   *
    +   * @param Whether to allow a replacement character for unmatched surrogate pairs.
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  /**
    +   * Attempts to fill the provided std::string reference with the parsed value of the current string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Important: a value should be consumed once. Calling get_string() twice on the same value
    +   * is an error.
    +   *
    +   * Performance: This method may be slower than get_string() or get_string(bool) because it may need to allocate memory.
    +   * We recommend you avoid allocating an std::string unless you need to.
    +   *
    +   * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS.
    +   */
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is not guaranteed to be valid UTF-8. See https://simonsapin.github.io/wtf-8/
    +   *
    +   * Important: Calling get_wobbly_string() twice on the same document is an error.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @returns INCORRECT_TYPE if the JSON value is not true or false.
    +   */
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  /**
    +   * Cast this JSON value to a value when the document is an object or an array.
    +   *
    +   * You must not have begun iterating through the object or array. When
    +   * SIMDJSON_DEVELOPMENT_CHECKS is set to 1 (which is the case when building in Debug mode
    +   * by default), and you have already begun iterating,
    +   * you will get an OUT_OF_ORDER_ITERATION error. If you have begun iterating, you can use
    +   * rewind() to reset the document to its initial state before calling this method.
    +   *
    +   * @returns A value if a JSON array or object cannot be found.
    +   * @returns SCALAR_DOCUMENT_AS_VALUE error is the document is a scalar (see is_scalar() function).
    +   */
    +  simdjson_inline simdjson_result get_value() noexcept;
    +
    +  /**
    +   * Checks if this JSON value is null.  If and only if the value is
    +   * null, then it is consumed (we advance). If we find a token that
    +   * begins with 'n' but is not 'null', then an error is returned.
    +   *
    +   * @returns Whether the value is null.
    +   * @returns INCORRECT_TYPE If the JSON value begins with 'n' and is not 'null'.
    +   */
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool
    +   *
    +   * You may use get_double(), get_bool(), get_uint64(), get_int64(),
    +   * get_object(), get_array(), get_raw_json_string(), or get_string() instead.
    +   *
    +   * @returns A value of the given type, parsed from the JSON.
    +   * @returns INCORRECT_TYPE If the JSON value is not the given type.
    +   */
    +  template simdjson_inline simdjson_result get() & noexcept {
    +    // Unless the simdjson library provides an inline implementation, calling this method should
    +    // immediately fail.
    +    static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. "
    +      "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
    +      "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), "
    +      " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template.");
    +  }
    +  /** @overload template simdjson_result get() & noexcept */
    +  template simdjson_inline simdjson_result get() && noexcept {
    +    // Unless the simdjson library provides an inline implementation, calling this method should
    +    // immediately fail.
    +    static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. "
    +      "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
    +      "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), "
    +      " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template.");
    +  }
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool, value
    +   *
    +   * Be mindful that the document instance must remain in scope while you are accessing object, array and value instances.
    +   *
    +   * @param out This is set to a value of the given type, parsed from the JSON. If there is an error, this may not be initialized.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   * @returns SUCCESS If the parse succeeded and the out parameter was set to the value.
    +   */
    +  template simdjson_inline error_code get(T &out) & noexcept;
    +  /** @overload template error_code get(T &out) & noexcept */
    +  template simdjson_inline error_code get(T &out) && noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an array.
    +   */
    +  simdjson_inline operator array() & noexcept(false);
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an object.
    +   */
    +  simdjson_inline operator object() & noexcept(false);
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline operator int64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline operator double() noexcept(false);
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator raw_json_string() noexcept(false);
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not true or false.
    +   */
    +  simdjson_inline operator bool() noexcept(false);
    +  /**
    +   * Cast this JSON value to a value when the document is an object or an array.
    +   *
    +   * You must not have begun iterating through the object or array. When
    +   * SIMDJSON_DEVELOPMENT_CHECKS is defined, and you have already begun iterating,
    +   * you will get an OUT_OF_ORDER_ITERATION error. If you have begun iterating, you can use
    +   * rewind() to reset the document to its initial state before calling this method.
    +   *
    +   * @returns A value value if a JSON array or object cannot be found.
    +   * @exception SCALAR_DOCUMENT_AS_VALUE error is the document is a scalar (see is_scalar() function).
    +   */
    +  simdjson_inline operator value() noexcept(false);
    +#endif
    +  /**
    +   * This method scans the array and counts the number of elements.
    +   * The count_elements method should always be called before you have begun
    +   * iterating through the array: it is expected that you are pointing at
    +   * the beginning of the array.
    +   * The runtime complexity is linear in the size of the array. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   */
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +   /**
    +   * This method scans the object and counts the number of key-value pairs.
    +   * The count_fields method should always be called before you have begun
    +   * iterating through the object: it is expected that you are pointing at
    +   * the beginning of the object.
    +   * The runtime complexity is linear in the size of the object. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an object is empty, it is more performant to use
    +   * the is_empty() method.
    +   */
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  /**
    +   * Get the value at the given index in the array. This function has linear-time complexity.
    +   * This function should only be called once on an array instance since the array iterator is not reset between each call.
    +   *
    +   * @return The value at the given index, or:
    +   *         - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
    +   */
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  /**
    +   * Begin array iteration.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  /**
    +   * Sentinel representing the end of the array.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result end() & noexcept;
    +
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   *
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. E.g., the array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to
    +   * a key a single time. Doing object["mykey"].to_string()and then again object["mykey"].to_string()
    +   * is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. E.g., the array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to a key
    +   * a single time. Doing object["mykey"].to_string() and then again object["mykey"].to_string()
    +   * is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +
    +  /**
    +   * Get the type of this JSON value. It does not validate or consume the value.
    +   * E.g., you must still call "is_null()" to check that a value is null even if
    +   * "type()" returns json_type::null.
    +   *
    +   * NOTE: If you're only expecting a value to be one type (a typical case), it's generally
    +   * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just
    +   * let it throw an exception).
    +   *
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result type() noexcept;
    +
    +  /**
    +   * Checks whether the document is a scalar (string, number, null, Boolean).
    +   * Returns false when there it is an array or object.
    +   *
    +   * @returns true if the type is string, number, null, Boolean
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +
    +  /**
    +   * Checks whether the document is a negative number.
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline bool is_negative() noexcept;
    +  /**
    +   * Checks whether the document is an integer number. Note that
    +   * this requires to partially parse the number string. If
    +   * the value is determined to be an integer, it may still
    +   * not parse properly as an integer in subsequent steps
    +   * (e.g., it might overflow).
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  /**
    +   * Determine the number type (integer or floating-point number) as quickly
    +   * as possible. This function does not fully validate the input. It is
    +   * useful when you only need to classify the numbers, without parsing them.
    +   *
    +   * If you are planning to retrieve the value or you need full validation,
    +   * consider using the get_number() method instead: it will fully parse
    +   * and validate the input, and give you access to the type:
    +   * get_number().get_number_type().
    +   *
    +   * get_number_type() is number_type::unsigned_integer if we have
    +   * an integer greater or equal to 9223372036854775808
    +   * get_number_type() is number_type::signed_integer if we have an
    +   * integer that is less than 9223372036854775808
    +   * Otherwise, get_number_type() has value number_type::floating_point_number
    +   *
    +   * This function requires processing the number string, but it is expected
    +   * to be faster than get_number().get_number_type() because it is does not
    +   * parse the number value.
    +   *
    +   * @returns the type of the number
    +   */
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +
    +  /**
    +   * Attempt to parse an ondemand::number. An ondemand::number may
    +   * contain an integer value or a floating-point value, the simdjson
    +   * library will autodetect the type. Thus it is a dynamically typed
    +   * number. Before accessing the value, you must determine the detected
    +   * type.
    +   *
    +   * number.get_number_type() is number_type::signed_integer if we have
    +   * an integer in [-9223372036854775808,9223372036854775808)
    +   * You can recover the value by calling number.get_int64() and you
    +   * have that number.is_int64() is true.
    +   *
    +   * number.get_number_type() is number_type::unsigned_integer if we have
    +   * an integer in [9223372036854775808,18446744073709551616)
    +   * You can recover the value by calling number.get_uint64() and you
    +   * have that number.is_uint64() is true.
    +   *
    +   * Otherwise, number.get_number_type() has value number_type::floating_point_number
    +   * and we have a binary64 number.
    +   * You can recover the value by calling number.get_double() and you
    +   * have that number.is_double() is true.
    +   *
    +   * You must check the type before accessing the value: it is an error
    +   * to call "get_int64()" when number.get_number_type() is not
    +   * number_type::signed_integer and when number.is_int64() is false.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept;
    +
    +  /**
    +   * Get the raw JSON for this token.
    +   *
    +   * The string_view will always point into the input buffer.
    +   *
    +   * The string_view will start at the beginning of the token, and include the entire token
    +   * *as well as all spaces until the next token (or EOF).* This means, for example, that a
    +   * string token always begins with a " and is always terminated by the final ", possibly
    +   * followed by a number of spaces.
    +   *
    +   * The string_view is *not* null-terminated. If this is a scalar (string, number,
    +   * boolean, or null), the character after the end of the string_view may be the padded buffer.
    +   *
    +   * Tokens include:
    +   * - {
    +   * - [
    +   * - "a string (possibly with UTF-8 or backslashed characters like \\\")".
    +   * - -1.2e-100
    +   * - true
    +   * - false
    +   * - null
    +   */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +
    +  /**
    +   * Reset the iterator inside the document instance so we are pointing back at the
    +   * beginning of the document, as if it had just been created. It invalidates all
    +   * values, objects and arrays that you have created so far (including unescaped strings).
    +   */
    +  inline void rewind() noexcept;
    +  /**
    +   * Returns debugging information.
    +   */
    +  inline std::string to_debug_string() noexcept;
    +  /**
    +   * Some unrecoverable error conditions may render the document instance unusable.
    +   * The is_alive() method returns true when the document is still suitable.
    +   */
    +  inline bool is_alive() noexcept;
    +
    +  /**
    +   * Returns the current location in the document if in bounds.
    +   */
    +  inline simdjson_result current_location() const noexcept;
    +
    +  /**
    +   * Returns true if this document has been fully parsed.
    +   * If you have consumed the whole document and at_end() returns
    +   * false, then there may be trailing content.
    +   */
    +  inline bool at_end() const noexcept;
    +
    +  /**
    +   * Returns the current depth in the document if in bounds.
    +   *
    +   * E.g.,
    +   *  0 = finished with document
    +   *  1 = document root value (could be [ or {, not yet known)
    +   *  2 = , or } inside root array/object
    +   *  3 = key or value inside root array/object.
    +   */
    +  simdjson_inline int32_t current_depth() const noexcept;
    +
    +  /**
    +   * Get the value associated with the given JSON pointer.  We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/foo/a/1") == 20
    +   *
    +   * It is allowed for a key to be the empty string:
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("//a/1") == 20
    +   *
    +   * Note that at_pointer() automatically calls rewind between each call. Thus
    +   * all values, objects and arrays that you have created so far (including unescaped strings)
    +   * are invalidated. After calling at_pointer, you need to consume the result: string values
    +   * should be stored in your own variables, arrays should be decoded and stored in your own array-like
    +   * structures and so forth.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   *         - SCALAR_DOCUMENT_AS_VALUE if the json_pointer is empty and the document is not a scalar (see is_scalar() function).
    +   */
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  /**
    +   * Consumes the document and returns a string_view instance corresponding to the
    +   * document as represented in JSON. It points inside the original byte array containing
    +   * the JSON document.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +protected:
    +  /**
    +   * Consumes the document.
    +   */
    +  simdjson_inline error_code consume() noexcept;
    +
    +  simdjson_inline document(ondemand::json_iterator &&iter) noexcept;
    +  simdjson_inline const uint8_t *text(uint32_t idx) const noexcept;
    +
    +  simdjson_inline value_iterator resume_value_iterator() noexcept;
    +  simdjson_inline value_iterator get_root_value_iterator() noexcept;
    +  simdjson_inline simdjson_result start_or_resume_object() noexcept;
    +  static simdjson_inline document start(ondemand::json_iterator &&iter) noexcept;
    +
    +  //
    +  // Fields
    +  //
    +  json_iterator iter{}; ///< Current position in the document
    +  static constexpr depth_t DOCUMENT_DEPTH = 0; ///< document depth is always 0
    +
    +  friend class array_iterator;
    +  friend class value;
    +  friend class ondemand::parser;
    +  friend class object;
    +  friend class array;
    +  friend class field;
    +  friend class token;
    +  friend class document_stream;
    +  friend class document_reference;
    +};
    +
    +
    +/**
    + * A document_reference is a thin wrapper around a document reference instance.
    + */
    +class document_reference {
    +public:
    +  simdjson_inline document_reference() noexcept;
    +  simdjson_inline document_reference(document &d) noexcept;
    +  simdjson_inline document_reference(const document_reference &other) noexcept = default;
    +  simdjson_inline document_reference& operator=(const document_reference &other) noexcept = default;
    +  simdjson_inline void rewind() noexcept;
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result get_value() noexcept;
    +
    +  simdjson_inline simdjson_result is_null() noexcept;
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +  simdjson_inline operator document&() const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator array() & noexcept(false);
    +  simdjson_inline operator object() & noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +  simdjson_inline operator value() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  simdjson_inline int32_t current_depth() const noexcept;
    +  simdjson_inline bool is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +private:
    +  document *doc{nullptr};
    +};
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public haswell::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(haswell::ondemand::document &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline error_code rewind() noexcept;
    +
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result get_value() noexcept;
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +  template simdjson_inline simdjson_result get() & noexcept;
    +  template simdjson_inline simdjson_result get() && noexcept;
    +
    +  template simdjson_inline error_code get(T &out) & noexcept;
    +  template simdjson_inline error_code get(T &out) && noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator haswell::ondemand::array() & noexcept(false);
    +  simdjson_inline operator haswell::ondemand::object() & noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator haswell::ondemand::raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +  simdjson_inline operator haswell::ondemand::value() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  simdjson_inline int32_t current_depth() const noexcept;
    +  simdjson_inline bool at_end() const noexcept;
    +  simdjson_inline bool is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +  /** @copydoc simdjson_inline std::string_view document::raw_json_token() const noexcept */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +};
    +
    +
    +} // namespace simdjson
    +
    +
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public haswell::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(haswell::ondemand::document_reference value, error_code error) noexcept;
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline error_code rewind() noexcept;
    +
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result get_value() noexcept;
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator haswell::ondemand::array() & noexcept(false);
    +  simdjson_inline operator haswell::ondemand::object() & noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator haswell::ondemand::raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +  simdjson_inline operator haswell::ondemand::value() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  simdjson_inline simdjson_result current_depth() const noexcept;
    +  simdjson_inline simdjson_result is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +  /** @copydoc simdjson_inline std::string_view document_reference::raw_json_token() const noexcept */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +};
    +
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H
    +/* end file simdjson/generic/ondemand/document.h for haswell */
    +/* including simdjson/generic/ondemand/document_stream.h for haswell: #include "simdjson/generic/ondemand/document_stream.h" */
    +/* begin file simdjson/generic/ondemand/document_stream.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +#include 
    +#include 
    +#include 
    +#endif
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +/** @private Custom worker class **/
    +struct stage1_worker {
    +  stage1_worker() noexcept = default;
    +  stage1_worker(const stage1_worker&) = delete;
    +  stage1_worker(stage1_worker&&) = delete;
    +  stage1_worker operator=(const stage1_worker&) = delete;
    +  ~stage1_worker();
    +  /**
    +   * We only start the thread when it is needed, not at object construction, this may throw.
    +   * You should only call this once.
    +   **/
    +  void start_thread();
    +  /**
    +   * Start a stage 1 job. You should first call 'run', then 'finish'.
    +   * You must call start_thread once before.
    +   */
    +  void run(document_stream * ds, parser * stage1, size_t next_batch_start);
    +  /** Wait for the run to finish (blocking). You should first call 'run', then 'finish'. **/
    +  void finish();
    +
    +private:
    +
    +  /**
    +   * Normally, we would never stop the thread. But we do in the destructor.
    +   * This function is only safe assuming that you are not waiting for results. You
    +   * should have called run, then finish, and be done.
    +   **/
    +  void stop_thread();
    +
    +  std::thread thread{};
    +  /** These three variables define the work done by the thread. **/
    +  ondemand::parser * stage1_thread_parser{};
    +  size_t _next_batch_start{};
    +  document_stream * owner{};
    +  /**
    +   * We have two state variables. This could be streamlined to one variable in the future but
    +   * we use two for clarity.
    +   */
    +  bool has_work{false};
    +  bool can_work{true};
    +
    +  /**
    +   * We lock using a mutex.
    +   */
    +  std::mutex locking_mutex{};
    +  std::condition_variable cond_var{};
    +
    +  friend class document_stream;
    +};
    +#endif  // SIMDJSON_THREADS_ENABLED
    +
    +/**
    + * A forward-only stream of documents.
    + *
    + * Produced by parser::iterate_many.
    + *
    + */
    +class document_stream {
    +public:
    +  /**
    +   * Construct an uninitialized document_stream.
    +   *
    +   *  ```c++
    +   *  document_stream docs;
    +   *  auto error = parser.iterate_many(json).get(docs);
    +   *  ```
    +   */
    +  simdjson_inline document_stream() noexcept;
    +  /** Move one document_stream to another. */
    +  simdjson_inline document_stream(document_stream &&other) noexcept = default;
    +  /** Move one document_stream to another. */
    +  simdjson_inline document_stream &operator=(document_stream &&other) noexcept = default;
    +
    +  simdjson_inline ~document_stream() noexcept;
    +
    +  /**
    +   * Returns the input size in bytes.
    +   */
    +  inline size_t size_in_bytes() const noexcept;
    +
    +  /**
    +   * After iterating through the stream, this method
    +   * returns the number of bytes that were not parsed at the end
    +   * of the stream. If truncated_bytes() differs from zero,
    +   * then the input was truncated maybe because incomplete JSON
    +   * documents were found at the end of the stream. You
    +   * may need to process the bytes in the interval [size_in_bytes()-truncated_bytes(), size_in_bytes()).
    +   *
    +   * You should only call truncated_bytes() after streaming through all
    +   * documents, like so:
    +   *
    +   *   document_stream stream = parser.iterate_many(json,window);
    +   *   for(auto & doc : stream) {
    +   *      // do something with doc
    +   *   }
    +   *   size_t truncated = stream.truncated_bytes();
    +   *
    +   */
    +  inline size_t truncated_bytes() const noexcept;
    +
    +  class iterator {
    +  public:
    +    using value_type = simdjson_result;
    +    using reference  = value_type;
    +
    +    using difference_type   = std::ptrdiff_t;
    +
    +    using iterator_category = std::input_iterator_tag;
    +
    +    /**
    +     * Default constructor.
    +     */
    +    simdjson_inline iterator() noexcept;
    +    /**
    +     * Get the current document (or error).
    +     */
    +    simdjson_inline simdjson_result operator*() noexcept;
    +    /**
    +     * Advance to the next document (prefix).
    +     */
    +    inline iterator& operator++() noexcept;
    +    /**
    +     * Check if we're at the end yet.
    +     * @param other the end iterator to compare to.
    +     */
    +    simdjson_inline bool operator!=(const iterator &other) const noexcept;
    +    /**
    +     * @private
    +     *
    +     * Gives the current index in the input document in bytes.
    +     *
    +     *   document_stream stream = parser.parse_many(json,window);
    +     *   for(auto i = stream.begin(); i != stream.end(); ++i) {
    +     *      auto doc = *i;
    +     *      size_t index = i.current_index();
    +     *   }
    +     *
    +     * This function (current_index()) is experimental and the usage
    +     * may change in future versions of simdjson: we find the API somewhat
    +     * awkward and we would like to offer something friendlier.
    +     */
    +     simdjson_inline size_t current_index() const noexcept;
    +
    +     /**
    +     * @private
    +     *
    +     * Gives a view of the current document at the current position.
    +     *
    +     *   document_stream stream = parser.iterate_many(json,window);
    +     *   for(auto i = stream.begin(); i != stream.end(); ++i) {
    +     *      std::string_view v = i.source();
    +     *   }
    +     *
    +     * The returned string_view instance is simply a map to the (unparsed)
    +     * source string: it may thus include white-space characters and all manner
    +     * of padding.
    +     *
    +     * This function (source()) is experimental and the usage
    +     * may change in future versions of simdjson: we find the API somewhat
    +     * awkward and we would like to offer something friendlier.
    +     *
    +     */
    +     simdjson_inline std::string_view source() const noexcept;
    +
    +    /**
    +     * Returns error of the stream (if any).
    +     */
    +     inline error_code error() const noexcept;
    +
    +  private:
    +    simdjson_inline iterator(document_stream *s, bool finished) noexcept;
    +    /** The document_stream we're iterating through. */
    +    document_stream* stream;
    +    /** Whether we're finished or not. */
    +    bool finished;
    +
    +    friend class document;
    +    friend class document_stream;
    +    friend class json_iterator;
    +  };
    +
    +  /**
    +   * Start iterating the documents in the stream.
    +   */
    +  simdjson_inline iterator begin() noexcept;
    +  /**
    +   * The end of the stream, for iterator comparison purposes.
    +   */
    +  simdjson_inline iterator end() noexcept;
    +
    +private:
    +
    +  document_stream &operator=(const document_stream &) = delete; // Disallow copying
    +  document_stream(const document_stream &other) = delete; // Disallow copying
    +
    +  /**
    +   * Construct a document_stream. Does not allocate or parse anything until the iterator is
    +   * used.
    +   *
    +   * @param parser is a reference to the parser instance used to generate this document_stream
    +   * @param buf is the raw byte buffer we need to process
    +   * @param len is the length of the raw byte buffer in bytes
    +   * @param batch_size is the size of the windows (must be strictly greater or equal to the largest JSON document)
    +   */
    +  simdjson_inline document_stream(
    +    ondemand::parser &parser,
    +    const uint8_t *buf,
    +    size_t len,
    +    size_t batch_size,
    +    bool allow_comma_separated
    +  ) noexcept;
    +
    +  /**
    +   * Parse the first document in the buffer. Used by begin(), to handle allocation and
    +   * initialization.
    +   */
    +  inline void start() noexcept;
    +
    +  /**
    +   * Parse the next document found in the buffer previously given to document_stream.
    +   *
    +   * The content should be a valid JSON document encoded as UTF-8. If there is a
    +   * UTF-8 BOM, the parser skips it.
    +   *
    +   * You do NOT need to pre-allocate a parser.  This function takes care of
    +   * pre-allocating a capacity defined by the batch_size defined when creating the
    +   * document_stream object.
    +   *
    +   * The function returns simdjson::EMPTY if there is no more data to be parsed.
    +   *
    +   * The function returns simdjson::SUCCESS (as integer = 0) in case of success
    +   * and indicates that the buffer has successfully been parsed to the end.
    +   * Every document it contained has been parsed without error.
    +   *
    +   * The function returns an error code from simdjson/simdjson.h in case of failure
    +   * such as simdjson::CAPACITY, simdjson::MEMALLOC, simdjson::DEPTH_ERROR and so forth;
    +   * the simdjson::error_message function converts these error codes into a string).
    +   *
    +   * You can also check validity by calling parser.is_valid(). The same parser can
    +   * and should be reused for the other documents in the buffer.
    +   */
    +  inline void next() noexcept;
    +
    +  /** Move the json_iterator of the document to the location of the next document in the stream. */
    +  inline void next_document() noexcept;
    +
    +  /** Get the next document index. */
    +  inline size_t next_batch_start() const noexcept;
    +
    +  /** Pass the next batch through stage 1 with the given parser. */
    +  inline error_code run_stage1(ondemand::parser &p, size_t batch_start) noexcept;
    +
    +  // Fields
    +  ondemand::parser *parser;
    +  const uint8_t *buf;
    +  size_t len;
    +  size_t batch_size;
    +  bool allow_comma_separated;
    +  /**
    +   * We are going to use just one document instance. The document owns
    +   * the json_iterator. It implies that we only ever pass a reference
    +   * to the document to the users.
    +   */
    +  document doc{};
    +  /** The error (or lack thereof) from the current document. */
    +  error_code error;
    +  size_t batch_start{0};
    +  size_t doc_index{};
    +
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  /** Indicates whether we use threads. Note that this needs to be a constant during the execution of the parsing. */
    +  bool use_thread;
    +
    +  inline void load_from_stage1_thread() noexcept;
    +
    +  /** Start a thread to run stage 1 on the next batch. */
    +  inline void start_stage1_thread() noexcept;
    +
    +  /** Wait for the stage 1 thread to finish and capture the results. */
    +  inline void finish_stage1_thread() noexcept;
    +
    +  /** The error returned from the stage 1 thread. */
    +  error_code stage1_thread_error{UNINITIALIZED};
    +  /** The thread used to run stage 1 against the next batch in the background. */
    +  std::unique_ptr worker{new(std::nothrow) stage1_worker()};
    +  /**
    +   * The parser used to run stage 1 in the background. Will be swapped
    +   * with the regular parser when finished.
    +   */
    +  ondemand::parser stage1_thread_parser{};
    +
    +  friend struct stage1_worker;
    +  #endif // SIMDJSON_THREADS_ENABLED
    +
    +  friend class parser;
    +  friend class document;
    +  friend class json_iterator;
    +  friend struct simdjson_result;
    +  friend struct internal::simdjson_result_base;
    +};  // document_stream
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +template<>
    +struct simdjson_result : public haswell::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(haswell::ondemand::document_stream &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H
    +/* end file simdjson/generic/ondemand/document_stream.h for haswell */
    +/* including simdjson/generic/ondemand/field.h for haswell: #include "simdjson/generic/ondemand/field.h" */
    +/* begin file simdjson/generic/ondemand/field.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_FIELD_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +/**
    + * A JSON field (key/value pair) in an object.
    + *
    + * Returned from object iteration.
    + *
    + * Extends from std::pair so you can use C++ algorithms that rely on pairs.
    + */
    +class field : public std::pair {
    +public:
    +  /**
    +   * Create a new invalid field.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline field() noexcept;
    +
    +  /**
    +   * Get the key as a string_view (for higher speed, consider raw_key).
    +   * We deliberately use a more cumbersome name (unescaped_key) to force users
    +   * to think twice about using it.
    +   *
    +   * This consumes the key: once you have called unescaped_key(), you cannot
    +   * call it again nor can you call key().
    +   */
    +  simdjson_inline simdjson_warn_unused simdjson_result unescaped_key(bool allow_replacement) noexcept;
    +  /**
    +   * Get the key as a raw_json_string. Can be used for direct comparison with
    +   * an unescaped C string: e.g., key() == "test".
    +   */
    +  simdjson_inline raw_json_string key() const noexcept;
    +  /**
    +   * Get the field value.
    +   */
    +  simdjson_inline ondemand::value &value() & noexcept;
    +  /**
    +   * @overload ondemand::value &ondemand::value() & noexcept
    +   */
    +  simdjson_inline ondemand::value value() && noexcept;
    +
    +protected:
    +  simdjson_inline field(raw_json_string key, ondemand::value &&value) noexcept;
    +  static simdjson_inline simdjson_result start(value_iterator &parent_iter) noexcept;
    +  static simdjson_inline simdjson_result start(const value_iterator &parent_iter, raw_json_string key) noexcept;
    +  friend struct simdjson_result;
    +  friend class object_iterator;
    +};
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public haswell::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(haswell::ondemand::field &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result unescaped_key(bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result key() noexcept;
    +  simdjson_inline simdjson_result value() noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_H
    +/* end file simdjson/generic/ondemand/field.h for haswell */
    +/* including simdjson/generic/ondemand/object.h for haswell: #include "simdjson/generic/ondemand/object.h" */
    +/* begin file simdjson/generic/ondemand/object.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +/**
    + * A forward-only JSON object field iterator.
    + */
    +class object {
    +public:
    +  /**
    +   * Create a new invalid object.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline object() noexcept = default;
    +
    +  simdjson_inline simdjson_result begin() noexcept;
    +  simdjson_inline simdjson_result end() noexcept;
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +   *
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. The value instance you get
    +   * from  `content["bids"]` becomes invalid when you call `content["asks"]`. The array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to a
    +   * key a single time. Doing object["mykey"].to_string() and then again object["mykey"].to_string()
    +   * is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field(std::string_view key) && noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. The value instance you get
    +   * from  `content["bids"]` becomes invalid when you call `content["asks"]`. The array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to a key
    +   * a single time. Doing object["mykey"].to_string() and then again object["mykey"].to_string() is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) && noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) && noexcept;
    +
    +  /**
    +   * Get the value associated with the given JSON pointer. We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard, interpreting the current node
    +   * as the root of its own JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/foo/a/1") == 20
    +   *
    +   * It is allowed for a key to be the empty string:
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("//a/1") == 20
    +   *
    +   * Note that at_pointer() called on the document automatically calls the document's rewind
    +   * method between each call. It invalidates all previously accessed arrays, objects and values
    +   * that have not been consumed. Yet it is not the case when calling at_pointer on an object
    +   * instance: there is no rewind and no invalidation.
    +   *
    +   * You may call at_pointer more than once on an object, but each time the pointer is advanced
    +   * to be within the value matched by the key indicated by the JSON pointer query. Thus any preceding
    +   * key (as well as the current key) can no longer be used with following JSON pointer calls.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching.
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   */
    +  inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +
    +  /**
    +   * Reset the iterator so that we are pointing back at the
    +   * beginning of the object. You should still consume values only once even if you
    +   * can iterate through the object more than once. If you unescape a string within
    +   * the object more than once, you have unsafe code. Note that rewinding an object
    +   * means that you may need to reparse it anew: it is not a free operation.
    +   *
    +   * @returns true if the object contains some elements (not empty)
    +   */
    +  inline simdjson_result reset() & noexcept;
    +  /**
    +   * This method scans the beginning of the object and checks whether the
    +   * object is empty.
    +   * The runtime complexity is constant time. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   */
    +  inline simdjson_result is_empty() & noexcept;
    +  /**
    +   * This method scans the object and counts the number of key-value pairs.
    +   * The count_fields method should always be called before you have begun
    +   * iterating through the object: it is expected that you are pointing at
    +   * the beginning of the object.
    +   * The runtime complexity is linear in the size of the object. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an object is empty, it is more performant to use
    +   * the is_empty() method.
    +   *
    +   * Performance hint: You should only call count_fields() as a last
    +   * resort as it may require scanning the document twice or more.
    +   */
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  /**
    +   * Consumes the object and returns a string_view instance corresponding to the
    +   * object as represented in JSON. It points inside the original byte array containing
    +   * the JSON document.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +protected:
    +  /**
    +   * Go to the end of the object, no matter where you are right now.
    +   */
    +  simdjson_inline error_code consume() noexcept;
    +  static simdjson_inline simdjson_result start(value_iterator &iter) noexcept;
    +  static simdjson_inline simdjson_result start_root(value_iterator &iter) noexcept;
    +  static simdjson_inline simdjson_result started(value_iterator &iter) noexcept;
    +  static simdjson_inline object resume(const value_iterator &iter) noexcept;
    +  simdjson_inline object(const value_iterator &iter) noexcept;
    +
    +  simdjson_warn_unused simdjson_inline error_code find_field_raw(const std::string_view key) noexcept;
    +
    +  value_iterator iter{};
    +
    +  friend class value;
    +  friend class document;
    +  friend struct simdjson_result;
    +};
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public haswell::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(haswell::ondemand::object &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result begin() noexcept;
    +  simdjson_inline simdjson_result end() noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) && noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) && noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) && noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  inline simdjson_result reset() noexcept;
    +  inline simdjson_result is_empty() noexcept;
    +  inline simdjson_result count_fields() & noexcept;
    +  inline simdjson_result raw_json() noexcept;
    +
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_H
    +/* end file simdjson/generic/ondemand/object.h for haswell */
    +/* including simdjson/generic/ondemand/object_iterator.h for haswell: #include "simdjson/generic/ondemand/object_iterator.h" */
    +/* begin file simdjson/generic/ondemand/object_iterator.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +class object_iterator {
    +public:
    +  /**
    +   * Create a new invalid object_iterator.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline object_iterator() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  // Reads key and value, yielding them to the user.
    +  // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  simdjson_inline simdjson_result operator*() noexcept;
    +  // Assumes it's being compared with the end. true if depth < iter->depth.
    +  simdjson_inline bool operator==(const object_iterator &) const noexcept;
    +  // Assumes it's being compared with the end. true if depth >= iter->depth.
    +  simdjson_inline bool operator!=(const object_iterator &) const noexcept;
    +  // Checks for ']' and ','
    +  simdjson_inline object_iterator &operator++() noexcept;
    +
    +private:
    +  /**
    +   * The underlying JSON iterator.
    +   *
    +   * PERF NOTE: expected to be elided in favor of the parent document: this is set when the object
    +   * is first used, and never changes afterwards.
    +   */
    +  value_iterator iter{};
    +
    +  simdjson_inline object_iterator(const value_iterator &iter) noexcept;
    +  friend struct simdjson_result;
    +  friend class object;
    +};
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public haswell::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(haswell::ondemand::object_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  // Reads key and value, yielding them to the user.
    +  simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  // Assumes it's being compared with the end. true if depth < iter->depth.
    +  simdjson_inline bool operator==(const simdjson_result &) const noexcept;
    +  // Assumes it's being compared with the end. true if depth >= iter->depth.
    +  simdjson_inline bool operator!=(const simdjson_result &) const noexcept;
    +  // Checks for ']' and ','
    +  simdjson_inline simdjson_result &operator++() noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H
    +/* end file simdjson/generic/ondemand/object_iterator.h for haswell */
    +/* including simdjson/generic/ondemand/serialization.h for haswell: #include "simdjson/generic/ondemand/serialization.h" */
    +/* begin file simdjson/generic/ondemand/serialization.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +/**
    + * Create a string-view instance out of a document instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(haswell::ondemand::document& x) noexcept;
    +/**
    + * Create a string-view instance out of a value instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. The value must
    + * not have been accessed previously. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(haswell::ondemand::value& x) noexcept;
    +/**
    + * Create a string-view instance out of an object instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(haswell::ondemand::object& x) noexcept;
    +/**
    + * Create a string-view instance out of an array instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(haswell::ondemand::array& x) noexcept;
    +inline simdjson_result to_json_string(simdjson_result x);
    +inline simdjson_result to_json_string(simdjson_result x);
    +inline simdjson_result to_json_string(simdjson_result x);
    +inline simdjson_result to_json_string(simdjson_result x);
    +} // namespace simdjson
    +
    +/**
    + * We want to support argument-dependent lookup (ADL).
    + * Hence we should define operator<< in the namespace
    + * where the argument (here value, object, etc.) resides.
    + * Credit: @madhur4127
    + * See https://github.com/simdjson/simdjson/issues/1768
    + */
    +namespace simdjson { namespace haswell { namespace ondemand {
    +
    +/**
    + * Print JSON to an output stream.  It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The element.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::value x);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x);
    +#endif
    +/**
    + * Print JSON to an output stream. It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The array.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::array value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x);
    +#endif
    +/**
    + * Print JSON to an output stream. It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The array.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::document& value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x);
    +#endif
    +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::document_reference& value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x);
    +#endif
    +/**
    + * Print JSON to an output stream. It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The object.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::object value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x);
    +#endif
    +}}} // namespace simdjson::haswell::ondemand
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H
    +/* end file simdjson/generic/ondemand/serialization.h for haswell */
    +
    +// Inline definitions
    +/* including simdjson/generic/ondemand/array-inl.h for haswell: #include "simdjson/generic/ondemand/array-inl.h" */
    +/* begin file simdjson/generic/ondemand/array-inl.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +//
    +// ### Live States
    +//
    +// While iterating or looking up values, depth >= iter->depth. at_start may vary. Error is
    +// always SUCCESS:
    +//
    +// - Start: This is the state when the array is first found and the iterator is just past the `{`.
    +//   In this state, at_start == true.
    +// - Next: After we hand a scalar value to the user, or an array/object which they then fully
    +//   iterate over, the iterator is at the `,` before the next value (or `]`). In this state,
    +//   depth == iter->depth, at_start == false, and error == SUCCESS.
    +// - Unfinished Business: When we hand an array/object to the user which they do not fully
    +//   iterate over, we need to finish that iteration by skipping child values until we reach the
    +//   Next state. In this state, depth > iter->depth, at_start == false, and error == SUCCESS.
    +//
    +// ## Error States
    +//
    +// In error states, we will yield exactly one more value before stopping. iter->depth == depth
    +// and at_start is always false. We decrement after yielding the error, moving to the Finished
    +// state.
    +//
    +// - Chained Error: When the array iterator is part of an error chain--for example, in
    +//   `for (auto tweet : doc["tweets"])`, where the tweet element may be missing or not be an
    +//   array--we yield that error in the loop, exactly once. In this state, error != SUCCESS and
    +//   iter->depth == depth, and at_start == false. We decrement depth when we yield the error.
    +// - Missing Comma Error: When the iterator ++ method discovers there is no comma between elements,
    +//   we flag that as an error and treat it exactly the same as a Chained Error. In this state,
    +//   error == TAPE_ERROR, iter->depth == depth, and at_start == false.
    +//
    +// ## Terminal State
    +//
    +// The terminal state has iter->depth < depth. at_start is always false.
    +//
    +// - Finished: When we have reached a `]` or have reported an error, we are finished. We signal this
    +//   by decrementing depth. In this state, iter->depth < depth, at_start == false, and
    +//   error == SUCCESS.
    +//
    +
    +simdjson_inline array::array(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{
    +}
    +
    +simdjson_inline simdjson_result array::start(value_iterator &iter) noexcept {
    +  // We don't need to know if the array is empty to start iteration, but we do want to know if there
    +  // is an error--thus `simdjson_unused`.
    +  simdjson_unused bool has_value;
    +  SIMDJSON_TRY( iter.start_array().get(has_value) );
    +  return array(iter);
    +}
    +simdjson_inline simdjson_result array::start_root(value_iterator &iter) noexcept {
    +  simdjson_unused bool has_value;
    +  SIMDJSON_TRY( iter.start_root_array().get(has_value) );
    +  return array(iter);
    +}
    +simdjson_inline simdjson_result array::started(value_iterator &iter) noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY(iter.started_array().get(has_value));
    +  return array(iter);
    +}
    +
    +simdjson_inline simdjson_result array::begin() noexcept {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  return array_iterator(iter);
    +}
    +simdjson_inline simdjson_result array::end() noexcept {
    +  return array_iterator(iter);
    +}
    +simdjson_inline error_code array::consume() noexcept {
    +  auto error = iter.json_iter().skip_child(iter.depth()-1);
    +  if(error) { iter.abandon(); }
    +  return error;
    +}
    +
    +simdjson_inline simdjson_result array::raw_json() noexcept {
    +  const uint8_t * starting_point{iter.peek_start()};
    +  auto error = consume();
    +  if(error) { return error; }
    +  // After 'consume()', we could be left pointing just beyond the document, but that
    +  // is ok because we are not going to dereference the final pointer position, we just
    +  // use it to compute the length in bytes.
    +  const uint8_t * final_point{iter._json_iter->unsafe_pointer()};
    +  return std::string_view(reinterpret_cast(starting_point), size_t(final_point - starting_point));
    +}
    +
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_inline simdjson_result array::count_elements() & noexcept {
    +  size_t count{0};
    +  // Important: we do not consume any of the values.
    +  for(simdjson_unused auto v : *this) { count++; }
    +  // The above loop will always succeed, but we want to report errors.
    +  if(iter.error()) { return iter.error(); }
    +  // We need to move back at the start because we expect users to iterate through
    +  // the array after counting the number of elements.
    +  iter.reset_array();
    +  return count;
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_inline simdjson_result array::is_empty() & noexcept {
    +  bool is_not_empty;
    +  auto error = iter.reset_array().get(is_not_empty);
    +  if(error) { return error; }
    +  return !is_not_empty;
    +}
    +
    +inline simdjson_result array::reset() & noexcept {
    +  return iter.reset_array();
    +}
    +
    +inline simdjson_result array::at_pointer(std::string_view json_pointer) noexcept {
    +  if (json_pointer[0] != '/') { return INVALID_JSON_POINTER; }
    +  json_pointer = json_pointer.substr(1);
    +  // - means "the append position" or "the element after the end of the array"
    +  // We don't support this, because we're returning a real element, not a position.
    +  if (json_pointer == "-") { return INDEX_OUT_OF_BOUNDS; }
    +
    +  // Read the array index
    +  size_t array_index = 0;
    +  size_t i;
    +  for (i = 0; i < json_pointer.length() && json_pointer[i] != '/'; i++) {
    +    uint8_t digit = uint8_t(json_pointer[i] - '0');
    +    // Check for non-digit in array index. If it's there, we're trying to get a field in an object
    +    if (digit > 9) { return INCORRECT_TYPE; }
    +    array_index = array_index*10 + digit;
    +  }
    +
    +  // 0 followed by other digits is invalid
    +  if (i > 1 && json_pointer[0] == '0') { return INVALID_JSON_POINTER; } // "JSON pointer array index has other characters after 0"
    +
    +  // Empty string is invalid; so is a "/" with no digits before it
    +  if (i == 0) { return INVALID_JSON_POINTER; } // "Empty string in JSON pointer array index"
    +  // Get the child
    +  auto child = at(array_index);
    +  // If there is an error, it ends here
    +  if(child.error()) {
    +    return child;
    +  }
    +
    +  // If there is a /, we're not done yet, call recursively.
    +  if (i < json_pointer.length()) {
    +    child = child.at_pointer(json_pointer.substr(i));
    +  }
    +  return child;
    +}
    +
    +simdjson_inline simdjson_result array::at(size_t index) noexcept {
    +  size_t i = 0;
    +  for (auto value : *this) {
    +    if (i == index) { return value; }
    +    i++;
    +  }
    +  return INDEX_OUT_OF_BOUNDS;
    +}
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  haswell::ondemand::array &&value
    +) noexcept
    +  : implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept
    +  : implementation_simdjson_result_base(error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::begin() noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() noexcept {
    +  if (error()) { return error(); }
    +  return first.end();
    +}
    +simdjson_inline  simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline  simdjson_result simdjson_result::is_empty() & noexcept {
    +  if (error()) { return error(); }
    +  return first.is_empty();
    +}
    +simdjson_inline  simdjson_result simdjson_result::at(size_t index) noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline  simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +simdjson_inline  simdjson_result simdjson_result::raw_json() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json();
    +}
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H
    +/* end file simdjson/generic/ondemand/array-inl.h for haswell */
    +/* including simdjson/generic/ondemand/array_iterator-inl.h for haswell: #include "simdjson/generic/ondemand/array_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/array_iterator-inl.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{}
    +
    +simdjson_inline simdjson_result array_iterator::operator*() noexcept {
    +  if (iter.error()) { iter.abandon(); return iter.error(); }
    +  return value(iter.child());
    +}
    +simdjson_inline bool array_iterator::operator==(const array_iterator &other) const noexcept {
    +  return !(*this != other);
    +}
    +simdjson_inline bool array_iterator::operator!=(const array_iterator &) const noexcept {
    +  return iter.is_open();
    +}
    +simdjson_inline array_iterator &array_iterator::operator++() noexcept {
    +  error_code error;
    +  // PERF NOTE this is a safety rail ... users should exit loops as soon as they receive an error, so we'll never get here.
    +  // However, it does not seem to make a perf difference, so we add it out of an abundance of caution.
    +  if (( error = iter.error() )) { return *this; }
    +  if (( error = iter.skip_child() )) { return *this; }
    +  if (( error = iter.has_next_element().error() )) { return *this; }
    +  return *this;
    +}
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  haswell::ondemand::array_iterator &&value
    +) noexcept
    +  : haswell::implementation_simdjson_result_base(std::forward(value))
    +{
    +  first.iter.assert_is_valid();
    +}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +  : haswell::implementation_simdjson_result_base({}, error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::operator*() noexcept {
    +  if (error()) { return error(); }
    +  return *first;
    +}
    +simdjson_inline bool simdjson_result::operator==(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return !error(); }
    +  return first == other.first;
    +}
    +simdjson_inline bool simdjson_result::operator!=(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return error(); }
    +  return first != other.first;
    +}
    +simdjson_inline simdjson_result &simdjson_result::operator++() noexcept {
    +  // Clear the error if there is one, so we don't yield it twice
    +  if (error()) { second = SUCCESS; return *this; }
    +  ++(first);
    +  return *this;
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/array_iterator-inl.h for haswell */
    +/* including simdjson/generic/ondemand/document-inl.h for haswell: #include "simdjson/generic/ondemand/document-inl.h" */
    +/* begin file simdjson/generic/ondemand/document-inl.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +simdjson_inline document::document(ondemand::json_iterator &&_iter) noexcept
    +  : iter{std::forward(_iter)}
    +{
    +  logger::log_start_value(iter, "document");
    +}
    +
    +simdjson_inline document document::start(json_iterator &&iter) noexcept {
    +  return document(std::forward(iter));
    +}
    +
    +inline void document::rewind() noexcept {
    +  iter.rewind();
    +}
    +
    +inline std::string document::to_debug_string() noexcept {
    +  return iter.to_string();
    +}
    +
    +inline simdjson_result document::current_location() const noexcept {
    +  return iter.current_location();
    +}
    +
    +inline int32_t document::current_depth() const noexcept {
    +  return iter.depth();
    +}
    +
    +inline bool document::at_end() const noexcept {
    +  return iter.at_end();
    +}
    +
    +
    +inline bool document::is_alive() noexcept {
    +  return iter.is_alive();
    +}
    +simdjson_inline value_iterator document::resume_value_iterator() noexcept {
    +  return value_iterator(&iter, 1, iter.root_position());
    +}
    +simdjson_inline value_iterator document::get_root_value_iterator() noexcept {
    +  return resume_value_iterator();
    +}
    +simdjson_inline simdjson_result document::start_or_resume_object() noexcept {
    +  if (iter.at_root()) {
    +    return get_object();
    +  } else {
    +    return object::resume(resume_value_iterator());
    +  }
    +}
    +simdjson_inline simdjson_result document::get_value() noexcept {
    +  // Make sure we start any arrays or objects before returning, so that start_root_()
    +  // gets called.
    +
    +  // It is the convention throughout the code that  the macro `SIMDJSON_DEVELOPMENT_CHECKS` determines whether
    +  // we check for OUT_OF_ORDER_ITERATION. Proper on::demand code should never trigger this error.
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  if (!iter.at_root()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  // assert_at_root() serves two purposes: in Debug mode, whether or not
    +  // SIMDJSON_DEVELOPMENT_CHECKS is set or not, it checks that we are at the root of
    +  // the document (this will typically be redundant). In release mode, it generates
    +  // SIMDJSON_ASSUME statements to allow the compiler to make assumptions.
    +  iter.assert_at_root();
    +  switch (*iter.peek()) {
    +    case '[': {
    +      // The following lines check that the document ends with ].
    +      auto value_iterator = get_root_value_iterator();
    +      auto error = value_iterator.check_root_array();
    +      if(error) { return error; }
    +      return value(get_root_value_iterator());
    +    }
    +    case '{': {
    +      // The following lines would check that the document ends with }.
    +      auto value_iterator = get_root_value_iterator();
    +      auto error = value_iterator.check_root_object();
    +      if(error) { return error; }
    +      return value(get_root_value_iterator());
    +    }
    +    default:
    +      // Unfortunately, scalar documents are a special case in simdjson and they cannot
    +      // be safely converted to value instances.
    +      return SCALAR_DOCUMENT_AS_VALUE;
    +  }
    +}
    +simdjson_inline simdjson_result document::get_array() & noexcept {
    +  auto value = get_root_value_iterator();
    +  return array::start_root(value);
    +}
    +simdjson_inline simdjson_result document::get_object() & noexcept {
    +  auto value = get_root_value_iterator();
    +  return object::start_root(value);
    +}
    +
    +/**
    + * We decided that calling 'get_double()' on the JSON document '1.233 blabla' should
    + * give an error, so we check for trailing content. We want to disallow trailing
    + * content.
    + * Thus, in several implementations below, we pass a 'true' parameter value to
    + * a get_root_value_iterator() method: this indicates that we disallow trailing content.
    + */
    +
    +simdjson_inline simdjson_result document::get_uint64() noexcept {
    +  return get_root_value_iterator().get_root_uint64(true);
    +}
    +simdjson_inline simdjson_result document::get_uint64_in_string() noexcept {
    +  return get_root_value_iterator().get_root_uint64_in_string(true);
    +}
    +simdjson_inline simdjson_result document::get_int64() noexcept {
    +  return get_root_value_iterator().get_root_int64(true);
    +}
    +simdjson_inline simdjson_result document::get_int64_in_string() noexcept {
    +  return get_root_value_iterator().get_root_int64_in_string(true);
    +}
    +simdjson_inline simdjson_result document::get_double() noexcept {
    +  return get_root_value_iterator().get_root_double(true);
    +}
    +simdjson_inline simdjson_result document::get_double_in_string() noexcept {
    +  return get_root_value_iterator().get_root_double_in_string(true);
    +}
    +simdjson_inline simdjson_result document::get_string(bool allow_replacement) noexcept {
    +  return get_root_value_iterator().get_root_string(true, allow_replacement);
    +}
    +template 
    +simdjson_inline error_code document::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  return get_root_value_iterator().get_root_string(receiver, true, allow_replacement);
    +}
    +simdjson_inline simdjson_result document::get_wobbly_string() noexcept {
    +  return get_root_value_iterator().get_root_wobbly_string(true);
    +}
    +simdjson_inline simdjson_result document::get_raw_json_string() noexcept {
    +  return get_root_value_iterator().get_root_raw_json_string(true);
    +}
    +simdjson_inline simdjson_result document::get_bool() noexcept {
    +  return get_root_value_iterator().get_root_bool(true);
    +}
    +simdjson_inline simdjson_result document::is_null() noexcept {
    +  return get_root_value_iterator().is_root_null(true);
    +}
    +
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_array(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_object(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_raw_json_string(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_string(false); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_double(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_uint64(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_int64(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_value(); }
    +
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return get_value(); }
    +
    +template simdjson_inline error_code document::get(T &out) & noexcept {
    +  return get().get(out);
    +}
    +template simdjson_inline error_code document::get(T &out) && noexcept {
    +  return std::forward(*this).get().get(out);
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline document::operator array() & noexcept(false) { return get_array(); }
    +simdjson_inline document::operator object() & noexcept(false) { return get_object(); }
    +simdjson_inline document::operator uint64_t() noexcept(false) { return get_uint64(); }
    +simdjson_inline document::operator int64_t() noexcept(false) { return get_int64(); }
    +simdjson_inline document::operator double() noexcept(false) { return get_double(); }
    +simdjson_inline document::operator std::string_view() noexcept(false) { return get_string(false); }
    +simdjson_inline document::operator raw_json_string() noexcept(false) { return get_raw_json_string(); }
    +simdjson_inline document::operator bool() noexcept(false) { return get_bool(); }
    +simdjson_inline document::operator value() noexcept(false) { return get_value(); }
    +
    +#endif
    +simdjson_inline simdjson_result document::count_elements() & noexcept {
    +  auto a = get_array();
    +  simdjson_result answer = a.count_elements();
    +  /* If there was an array, we are now left pointing at its first element. */
    +  if(answer.error() == SUCCESS) { rewind(); }
    +  return answer;
    +}
    +simdjson_inline simdjson_result document::count_fields() & noexcept {
    +  auto a = get_object();
    +  simdjson_result answer = a.count_fields();
    +  /* If there was an object, we are now left pointing at its first element. */
    +  if(answer.error() == SUCCESS) { rewind(); }
    +  return answer;
    +}
    +simdjson_inline simdjson_result document::at(size_t index) & noexcept {
    +  auto a = get_array();
    +  return a.at(index);
    +}
    +simdjson_inline simdjson_result document::begin() & noexcept {
    +  return get_array().begin();
    +}
    +simdjson_inline simdjson_result document::end() & noexcept {
    +  return {};
    +}
    +
    +simdjson_inline simdjson_result document::find_field(std::string_view key) & noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +simdjson_inline simdjson_result document::find_field(const char *key) & noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +simdjson_inline simdjson_result document::find_field_unordered(std::string_view key) & noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result document::find_field_unordered(const char *key) & noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result document::operator[](std::string_view key) & noexcept {
    +  return start_or_resume_object()[key];
    +}
    +simdjson_inline simdjson_result document::operator[](const char *key) & noexcept {
    +  return start_or_resume_object()[key];
    +}
    +
    +simdjson_inline error_code document::consume() noexcept {
    +  auto error = iter.skip_child(0);
    +  if(error) { iter.abandon(); }
    +  return error;
    +}
    +
    +simdjson_inline simdjson_result document::raw_json() noexcept {
    +  auto _iter = get_root_value_iterator();
    +  const uint8_t * starting_point{_iter.peek_start()};
    +  auto error = consume();
    +  if(error) { return error; }
    +  // After 'consume()', we could be left pointing just beyond the document, but that
    +  // is ok because we are not going to dereference the final pointer position, we just
    +  // use it to compute the length in bytes.
    +  const uint8_t * final_point{iter.unsafe_pointer()};
    +  return std::string_view(reinterpret_cast(starting_point), size_t(final_point - starting_point));
    +}
    +
    +simdjson_inline simdjson_result document::type() noexcept {
    +  return get_root_value_iterator().type();
    +}
    +
    +simdjson_inline simdjson_result document::is_scalar() noexcept {
    +  json_type this_type;
    +  auto error = type().get(this_type);
    +  if(error) { return error; }
    +  return ! ((this_type == json_type::array) || (this_type == json_type::object));
    +}
    +
    +simdjson_inline bool document::is_negative() noexcept {
    +  return get_root_value_iterator().is_root_negative();
    +}
    +
    +simdjson_inline simdjson_result document::is_integer() noexcept {
    +  return get_root_value_iterator().is_root_integer(true);
    +}
    +
    +simdjson_inline simdjson_result document::get_number_type() noexcept {
    +  return get_root_value_iterator().get_root_number_type(true);
    +}
    +
    +simdjson_inline simdjson_result document::get_number() noexcept {
    +  return get_root_value_iterator().get_root_number(true);
    +}
    +
    +
    +simdjson_inline simdjson_result document::raw_json_token() noexcept {
    +  auto _iter = get_root_value_iterator();
    +  return std::string_view(reinterpret_cast(_iter.peek_start()), _iter.peek_start_length());
    +}
    +
    +simdjson_inline simdjson_result document::at_pointer(std::string_view json_pointer) noexcept {
    +  rewind(); // Rewind the document each time at_pointer is called
    +  if (json_pointer.empty()) {
    +    return this->get_value();
    +  }
    +  json_type t;
    +  SIMDJSON_TRY(type().get(t));
    +  switch (t)
    +  {
    +    case json_type::array:
    +      return (*this).get_array().at_pointer(json_pointer);
    +    case json_type::object:
    +      return (*this).get_object().at_pointer(json_pointer);
    +    default:
    +      return INVALID_JSON_POINTER;
    +  }
    +}
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  haswell::ondemand::document &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      error
    +    )
    +{
    +}
    +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline error_code simdjson_result::rewind() noexcept {
    +  if (error()) { return error(); }
    +  first.rewind();
    +  return SUCCESS;
    +}
    +simdjson_inline simdjson_result simdjson_result::begin() & noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() & noexcept {
    +  return {};
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_array();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_object();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_bool();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_value() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_value();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_null() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_null();
    +}
    +
    +template
    +simdjson_inline simdjson_result simdjson_result::get() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get();
    +}
    +template
    +simdjson_inline simdjson_result simdjson_result::get() && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).get();
    +}
    +template
    +simdjson_inline error_code simdjson_result::get(T &out) & noexcept {
    +  if (error()) { return error(); }
    +  return first.get(out);
    +}
    +template
    +simdjson_inline error_code simdjson_result::get(T &out) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).get(out);
    +}
    +
    +template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete;
    +template<> simdjson_inline simdjson_result simdjson_result::get() && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first);
    +}
    +template<> simdjson_inline error_code simdjson_result::get(haswell::ondemand::document &out) & noexcept = delete;
    +template<> simdjson_inline error_code simdjson_result::get(haswell::ondemand::document &out) && noexcept {
    +  if (error()) { return error(); }
    +  out = std::forward(first);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::type() noexcept {
    +  if (error()) { return error(); }
    +  return first.type();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_scalar();
    +}
    +
    +
    +simdjson_inline bool simdjson_result::is_negative() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_negative();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_integer();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number_type();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::get_number() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number();
    +}
    +
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline simdjson_result::operator haswell::ondemand::array() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator haswell::ondemand::object() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator int64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator double() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator haswell::ondemand::raw_json_string() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator bool() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator haswell::ondemand::value() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +#endif
    +
    +
    +simdjson_inline simdjson_result simdjson_result::current_location() noexcept {
    +  if (error()) { return error(); }
    +  return first.current_location();
    +}
    +
    +simdjson_inline bool simdjson_result::at_end() const noexcept {
    +  if (error()) { return error(); }
    +  return first.at_end();
    +}
    +
    +
    +simdjson_inline int32_t simdjson_result::current_depth() const noexcept {
    +  if (error()) { return error(); }
    +  return first.current_depth();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json_token();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +
    +} // namespace simdjson
    +
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +simdjson_inline document_reference::document_reference() noexcept : doc{nullptr} {}
    +simdjson_inline document_reference::document_reference(document &d) noexcept : doc(&d) {}
    +simdjson_inline void document_reference::rewind() noexcept { doc->rewind(); }
    +simdjson_inline simdjson_result document_reference::get_array() & noexcept { return doc->get_array(); }
    +simdjson_inline simdjson_result document_reference::get_object() & noexcept { return doc->get_object(); }
    +/**
    + * The document_reference instances are used primarily/solely for streams of JSON
    + * documents.
    + * We decided that calling 'get_double()' on the JSON document '1.233 blabla' should
    + * give an error, so we check for trailing content.
    + *
    + * However, for streams of JSON documents, we want to be able to start from
    + * "321" "321" "321"
    + * and parse it successfully as a stream of JSON documents, calling get_uint64_in_string()
    + * successfully each time.
    + *
    + * To achieve this result, we pass a 'false' to a get_root_value_iterator() method:
    + * this indicates that we allow trailing content.
    + */
    +simdjson_inline simdjson_result document_reference::get_uint64() noexcept { return doc->get_root_value_iterator().get_root_uint64(false); }
    +simdjson_inline simdjson_result document_reference::get_uint64_in_string() noexcept { return doc->get_root_value_iterator().get_root_uint64_in_string(false); }
    +simdjson_inline simdjson_result document_reference::get_int64() noexcept { return doc->get_root_value_iterator().get_root_int64(false); }
    +simdjson_inline simdjson_result document_reference::get_int64_in_string() noexcept { return doc->get_root_value_iterator().get_root_int64_in_string(false); }
    +simdjson_inline simdjson_result document_reference::get_double() noexcept { return doc->get_root_value_iterator().get_root_double(false); }
    +simdjson_inline simdjson_result document_reference::get_double_in_string() noexcept { return doc->get_root_value_iterator().get_root_double(false); }
    +simdjson_inline simdjson_result document_reference::get_string(bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(false, allow_replacement); }
    +template 
    +simdjson_inline error_code document_reference::get_string(string_type& receiver, bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(receiver, false, allow_replacement); }
    +simdjson_inline simdjson_result document_reference::get_wobbly_string() noexcept { return doc->get_root_value_iterator().get_root_wobbly_string(false); }
    +simdjson_inline simdjson_result document_reference::get_raw_json_string() noexcept { return doc->get_root_value_iterator().get_root_raw_json_string(false); }
    +simdjson_inline simdjson_result document_reference::get_bool() noexcept { return doc->get_root_value_iterator().get_root_bool(false); }
    +simdjson_inline simdjson_result document_reference::get_value() noexcept { return doc->get_value(); }
    +simdjson_inline simdjson_result document_reference::is_null() noexcept { return doc->get_root_value_iterator().is_root_null(false); }
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline document_reference::operator array() & noexcept(false) { return array(*doc); }
    +simdjson_inline document_reference::operator object() & noexcept(false) { return object(*doc); }
    +simdjson_inline document_reference::operator uint64_t() noexcept(false) { return get_uint64(); }
    +simdjson_inline document_reference::operator int64_t() noexcept(false) { return get_int64(); }
    +simdjson_inline document_reference::operator double() noexcept(false) { return get_double(); }
    +simdjson_inline document_reference::operator std::string_view() noexcept(false) { return std::string_view(*doc); }
    +simdjson_inline document_reference::operator raw_json_string() noexcept(false) { return raw_json_string(*doc); }
    +simdjson_inline document_reference::operator bool() noexcept(false) { return get_bool(); }
    +simdjson_inline document_reference::operator value() noexcept(false) { return value(*doc); }
    +#endif
    +simdjson_inline simdjson_result document_reference::count_elements() & noexcept { return doc->count_elements(); }
    +simdjson_inline simdjson_result document_reference::count_fields() & noexcept { return doc->count_fields(); }
    +simdjson_inline simdjson_result document_reference::at(size_t index) & noexcept { return doc->at(index); }
    +simdjson_inline simdjson_result document_reference::begin() & noexcept { return doc->begin(); }
    +simdjson_inline simdjson_result document_reference::end() & noexcept { return doc->end(); }
    +simdjson_inline simdjson_result document_reference::find_field(std::string_view key) & noexcept { return doc->find_field(key); }
    +simdjson_inline simdjson_result document_reference::find_field(const char *key) & noexcept { return doc->find_field(key); }
    +simdjson_inline simdjson_result document_reference::operator[](std::string_view key) & noexcept { return (*doc)[key]; }
    +simdjson_inline simdjson_result document_reference::operator[](const char *key) & noexcept { return (*doc)[key]; }
    +simdjson_inline simdjson_result document_reference::find_field_unordered(std::string_view key) & noexcept { return doc->find_field_unordered(key); }
    +simdjson_inline simdjson_result document_reference::find_field_unordered(const char *key) & noexcept { return doc->find_field_unordered(key); }
    +simdjson_inline simdjson_result document_reference::type() noexcept { return doc->type(); }
    +simdjson_inline simdjson_result document_reference::is_scalar() noexcept { return doc->is_scalar(); }
    +simdjson_inline simdjson_result document_reference::current_location() noexcept { return doc->current_location(); }
    +simdjson_inline int32_t document_reference::current_depth() const noexcept { return doc->current_depth(); }
    +simdjson_inline bool document_reference::is_negative() noexcept { return doc->is_negative(); }
    +simdjson_inline simdjson_result document_reference::is_integer() noexcept { return doc->get_root_value_iterator().is_root_integer(false); }
    +simdjson_inline simdjson_result document_reference::get_number_type() noexcept { return doc->get_root_value_iterator().get_root_number_type(false); }
    +simdjson_inline simdjson_result document_reference::get_number() noexcept { return doc->get_root_value_iterator().get_root_number(false); }
    +simdjson_inline simdjson_result document_reference::raw_json_token() noexcept { return doc->raw_json_token(); }
    +simdjson_inline simdjson_result document_reference::at_pointer(std::string_view json_pointer) noexcept { return doc->at_pointer(json_pointer); }
    +simdjson_inline simdjson_result document_reference::raw_json() noexcept { return doc->raw_json();}
    +simdjson_inline document_reference::operator document&() const noexcept { return *doc; }
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +
    +
    +namespace simdjson {
    +simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::document_reference value, error_code error)
    +  noexcept : implementation_simdjson_result_base(std::forward(value), error) {}
    +
    +
    +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline error_code simdjson_result::rewind() noexcept {
    +  if (error()) { return error(); }
    +  first.rewind();
    +  return SUCCESS;
    +}
    +simdjson_inline simdjson_result simdjson_result::begin() & noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() & noexcept {
    +  return {};
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_array();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_object();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_bool();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_value() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_value();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_null() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_null();
    +}
    +simdjson_inline simdjson_result simdjson_result::type() noexcept {
    +  if (error()) { return error(); }
    +  return first.type();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_scalar();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_negative() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_negative();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_integer();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number_type();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number();
    +}
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline simdjson_result::operator haswell::ondemand::array() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator haswell::ondemand::object() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator int64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator double() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator haswell::ondemand::raw_json_string() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator bool() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator haswell::ondemand::value() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +#endif
    +
    +simdjson_inline simdjson_result simdjson_result::current_location() noexcept {
    +  if (error()) { return error(); }
    +  return first.current_location();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json_token();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H
    +/* end file simdjson/generic/ondemand/document-inl.h for haswell */
    +/* including simdjson/generic/ondemand/document_stream-inl.h for haswell: #include "simdjson/generic/ondemand/document_stream-inl.h" */
    +/* begin file simdjson/generic/ondemand/document_stream-inl.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document_stream.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +
    +inline void stage1_worker::finish() {
    +  // After calling "run" someone would call finish() to wait
    +  // for the end of the processing.
    +  // This function will wait until either the thread has done
    +  // the processing or, else, the destructor has been called.
    +  std::unique_lock lock(locking_mutex);
    +  cond_var.wait(lock, [this]{return has_work == false;});
    +}
    +
    +inline stage1_worker::~stage1_worker() {
    +  // The thread may never outlive the stage1_worker instance
    +  // and will always be stopped/joined before the stage1_worker
    +  // instance is gone.
    +  stop_thread();
    +}
    +
    +inline void stage1_worker::start_thread() {
    +  std::unique_lock lock(locking_mutex);
    +  if(thread.joinable()) {
    +    return; // This should never happen but we never want to create more than one thread.
    +  }
    +  thread = std::thread([this]{
    +      while(true) {
    +        std::unique_lock thread_lock(locking_mutex);
    +        // We wait for either "run" or "stop_thread" to be called.
    +        cond_var.wait(thread_lock, [this]{return has_work || !can_work;});
    +        // If, for some reason, the stop_thread() method was called (i.e., the
    +        // destructor of stage1_worker is called, then we want to immediately destroy
    +        // the thread (and not do any more processing).
    +        if(!can_work) {
    +          break;
    +        }
    +        this->owner->stage1_thread_error = this->owner->run_stage1(*this->stage1_thread_parser,
    +              this->_next_batch_start);
    +        this->has_work = false;
    +        // The condition variable call should be moved after thread_lock.unlock() for performance
    +        // reasons but thread sanitizers may report it as a data race if we do.
    +        // See https://stackoverflow.com/questions/35775501/c-should-condition-variable-be-notified-under-lock
    +        cond_var.notify_one(); // will notify "finish"
    +        thread_lock.unlock();
    +      }
    +    }
    +  );
    +}
    +
    +
    +inline void stage1_worker::stop_thread() {
    +  std::unique_lock lock(locking_mutex);
    +  // We have to make sure that all locks can be released.
    +  can_work = false;
    +  has_work = false;
    +  cond_var.notify_all();
    +  lock.unlock();
    +  if(thread.joinable()) {
    +    thread.join();
    +  }
    +}
    +
    +inline void stage1_worker::run(document_stream * ds, parser * stage1, size_t next_batch_start) {
    +  std::unique_lock lock(locking_mutex);
    +  owner = ds;
    +  _next_batch_start = next_batch_start;
    +  stage1_thread_parser = stage1;
    +  has_work = true;
    +  // The condition variable call should be moved after thread_lock.unlock() for performance
    +  // reasons but thread sanitizers may report it as a data race if we do.
    +  // See https://stackoverflow.com/questions/35775501/c-should-condition-variable-be-notified-under-lock
    +  cond_var.notify_one(); // will notify the thread lock that we have work
    +  lock.unlock();
    +}
    +
    +#endif  // SIMDJSON_THREADS_ENABLED
    +
    +simdjson_inline document_stream::document_stream(
    +  ondemand::parser &_parser,
    +  const uint8_t *_buf,
    +  size_t _len,
    +  size_t _batch_size,
    +  bool _allow_comma_separated
    +) noexcept
    +  : parser{&_parser},
    +    buf{_buf},
    +    len{_len},
    +    batch_size{_batch_size <= MINIMAL_BATCH_SIZE ? MINIMAL_BATCH_SIZE : _batch_size},
    +    allow_comma_separated{_allow_comma_separated},
    +    error{SUCCESS}
    +    #ifdef SIMDJSON_THREADS_ENABLED
    +    , use_thread(_parser.threaded) // we need to make a copy because _parser.threaded can change
    +    #endif
    +{
    +#ifdef SIMDJSON_THREADS_ENABLED
    +  if(worker.get() == nullptr) {
    +    error = MEMALLOC;
    +  }
    +#endif
    +}
    +
    +simdjson_inline document_stream::document_stream() noexcept
    +  : parser{nullptr},
    +    buf{nullptr},
    +    len{0},
    +    batch_size{0},
    +    allow_comma_separated{false},
    +    error{UNINITIALIZED}
    +    #ifdef SIMDJSON_THREADS_ENABLED
    +    , use_thread(false)
    +    #endif
    +{
    +}
    +
    +simdjson_inline document_stream::~document_stream() noexcept
    +{
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  worker.reset();
    +  #endif
    +}
    +
    +inline size_t document_stream::size_in_bytes() const noexcept {
    +  return len;
    +}
    +
    +inline size_t document_stream::truncated_bytes() const noexcept {
    +  if(error == CAPACITY) { return len - batch_start; }
    +  return parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] - parser->implementation->structural_indexes[parser->implementation->n_structural_indexes + 1];
    +}
    +
    +simdjson_inline document_stream::iterator::iterator() noexcept
    +  : stream{nullptr}, finished{true} {
    +}
    +
    +simdjson_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept
    +  : stream{_stream}, finished{is_end} {
    +}
    +
    +simdjson_inline simdjson_result document_stream::iterator::operator*() noexcept {
    +  //if(stream->error) { return stream->error; }
    +  return simdjson_result(stream->doc, stream->error);
    +}
    +
    +simdjson_inline document_stream::iterator& document_stream::iterator::operator++() noexcept {
    +  // If there is an error, then we want the iterator
    +  // to be finished, no matter what. (E.g., we do not
    +  // keep generating documents with errors, or go beyond
    +  // a document with errors.)
    +  //
    +  // Users do not have to call "operator*()" when they use operator++,
    +  // so we need to end the stream in the operator++ function.
    +  //
    +  // Note that setting finished = true is essential otherwise
    +  // we would enter an infinite loop.
    +  if (stream->error) { finished = true; }
    +  // Note that stream->error() is guarded against error conditions
    +  // (it will immediately return if stream->error casts to false).
    +  // In effect, this next function does nothing when (stream->error)
    +  // is true (hence the risk of an infinite loop).
    +  stream->next();
    +  // If that was the last document, we're finished.
    +  // It is the only type of error we do not want to appear
    +  // in operator*.
    +  if (stream->error == EMPTY) { finished = true; }
    +  // If we had any other kind of error (not EMPTY) then we want
    +  // to pass it along to the operator* and we cannot mark the result
    +  // as "finished" just yet.
    +  return *this;
    +}
    +
    +simdjson_inline bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept {
    +  return finished != other.finished;
    +}
    +
    +simdjson_inline document_stream::iterator document_stream::begin() noexcept {
    +  start();
    +  // If there are no documents, we're finished.
    +  return iterator(this, error == EMPTY);
    +}
    +
    +simdjson_inline document_stream::iterator document_stream::end() noexcept {
    +  return iterator(this, true);
    +}
    +
    +inline void document_stream::start() noexcept {
    +  if (error) { return; }
    +  error = parser->allocate(batch_size);
    +  if (error) { return; }
    +  // Always run the first stage 1 parse immediately
    +  batch_start = 0;
    +  error = run_stage1(*parser, batch_start);
    +  while(error == EMPTY) {
    +    // In exceptional cases, we may start with an empty block
    +    batch_start = next_batch_start();
    +    if (batch_start >= len) { return; }
    +    error = run_stage1(*parser, batch_start);
    +  }
    +  if (error) { return; }
    +  doc_index = batch_start;
    +  doc = document(json_iterator(&buf[batch_start], parser));
    +  doc.iter._streaming = true;
    +
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  if (use_thread && next_batch_start() < len) {
    +    // Kick off the first thread on next batch if needed
    +    error = stage1_thread_parser.allocate(batch_size);
    +    if (error) { return; }
    +    worker->start_thread();
    +    start_stage1_thread();
    +    if (error) { return; }
    +  }
    +  #endif // SIMDJSON_THREADS_ENABLED
    +}
    +
    +inline void document_stream::next() noexcept {
    +  // We always enter at once once in an error condition.
    +  if (error) { return; }
    +  next_document();
    +  if (error) { return; }
    +  auto cur_struct_index = doc.iter._root - parser->implementation->structural_indexes.get();
    +  doc_index = batch_start + parser->implementation->structural_indexes[cur_struct_index];
    +
    +  // Check if at end of structural indexes (i.e. at end of batch)
    +  if(cur_struct_index >= static_cast(parser->implementation->n_structural_indexes)) {
    +    error = EMPTY;
    +    // Load another batch (if available)
    +    while (error == EMPTY) {
    +      batch_start = next_batch_start();
    +      if (batch_start >= len) { break; }
    +      #ifdef SIMDJSON_THREADS_ENABLED
    +      if(use_thread) {
    +        load_from_stage1_thread();
    +      } else {
    +        error = run_stage1(*parser, batch_start);
    +      }
    +      #else
    +      error = run_stage1(*parser, batch_start);
    +      #endif
    +      /**
    +       * Whenever we move to another window, we need to update all pointers to make
    +       * it appear as if the input buffer started at the beginning of the window.
    +       *
    +       * Take this input:
    +       *
    +       * {"z":5}  {"1":1,"2":2,"4":4} [7,  10,   9]  [15,  11,   12, 13]  [154,  110,   112, 1311]
    +       *
    +       * Say you process the following window...
    +       *
    +       * '{"z":5}  {"1":1,"2":2,"4":4} [7,  10,   9]'
    +       *
    +       * When you do so, the json_iterator has a pointer at the beginning of the memory region
    +       * (pointing at the beginning of '{"z"...'.
    +       *
    +       * When you move to the window that starts at...
    +       *
    +       * '[7,  10,   9]  [15,  11,   12, 13] ...
    +       *
    +       * then it is not sufficient to just run stage 1. You also need to re-anchor the
    +       * json_iterator so that it believes we are starting at '[7,  10,   9]...'.
    +       *
    +       * Under the DOM front-end, this gets done automatically because the parser owns
    +       * the pointer the data, and when you call stage1 and then stage2 on the same
    +       * parser, then stage2 will run on the pointer acquired by stage1.
    +       *
    +       * That is, stage1 calls "this->buf = _buf" so the parser remembers the buffer that
    +       * we used. But json_iterator has no callback when stage1 is called on the parser.
    +       * In fact, I think that the parser is unaware of json_iterator.
    +       *
    +       *
    +       * So we need to re-anchor the json_iterator after each call to stage 1 so that
    +       * all of the pointers are in sync.
    +       */
    +      doc.iter = json_iterator(&buf[batch_start], parser);
    +      doc.iter._streaming = true;
    +      /**
    +       * End of resync.
    +       */
    +
    +      if (error) { continue; } // If the error was EMPTY, we may want to load another batch.
    +      doc_index = batch_start;
    +    }
    +  }
    +}
    +
    +inline void document_stream::next_document() noexcept {
    +  // Go to next place where depth=0 (document depth)
    +  error = doc.iter.skip_child(0);
    +  if (error) { return; }
    +  // Always set depth=1 at the start of document
    +  doc.iter._depth = 1;
    +  // consume comma if comma separated is allowed
    +  if (allow_comma_separated) { doc.iter.consume_character(','); }
    +  // Resets the string buffer at the beginning, thus invalidating the strings.
    +  doc.iter._string_buf_loc = parser->string_buf.get();
    +  doc.iter._root = doc.iter.position();
    +}
    +
    +inline size_t document_stream::next_batch_start() const noexcept {
    +  return batch_start + parser->implementation->structural_indexes[parser->implementation->n_structural_indexes];
    +}
    +
    +inline error_code document_stream::run_stage1(ondemand::parser &p, size_t _batch_start) noexcept {
    +  // This code only updates the structural index in the parser, it does not update any json_iterator
    +  // instance.
    +  size_t remaining = len - _batch_start;
    +  if (remaining <= batch_size) {
    +    return p.implementation->stage1(&buf[_batch_start], remaining, stage1_mode::streaming_final);
    +  } else {
    +    return p.implementation->stage1(&buf[_batch_start], batch_size, stage1_mode::streaming_partial);
    +  }
    +}
    +
    +simdjson_inline size_t document_stream::iterator::current_index() const noexcept {
    +  return stream->doc_index;
    +}
    +
    +simdjson_inline std::string_view document_stream::iterator::source() const noexcept {
    +  auto depth = stream->doc.iter.depth();
    +  auto cur_struct_index = stream->doc.iter._root - stream->parser->implementation->structural_indexes.get();
    +
    +  // If at root, process the first token to determine if scalar value
    +  if (stream->doc.iter.at_root()) {
    +    switch (stream->buf[stream->batch_start + stream->parser->implementation->structural_indexes[cur_struct_index]]) {
    +      case '{': case '[':   // Depth=1 already at start of document
    +        break;
    +      case '}': case ']':
    +        depth--;
    +        break;
    +      default:    // Scalar value document
    +        // TODO: Remove any trailing whitespaces
    +        // This returns a string spanning from start of value to the beginning of the next document (excluded)
    +        return std::string_view(reinterpret_cast(stream->buf) + current_index(), stream->parser->implementation->structural_indexes[++cur_struct_index] - current_index() - 1);
    +    }
    +    cur_struct_index++;
    +  }
    +
    +  while (cur_struct_index <= static_cast(stream->parser->implementation->n_structural_indexes)) {
    +    switch (stream->buf[stream->batch_start + stream->parser->implementation->structural_indexes[cur_struct_index]]) {
    +      case '{': case '[':
    +        depth++;
    +        break;
    +      case '}': case ']':
    +        depth--;
    +        break;
    +    }
    +    if (depth == 0) { break; }
    +    cur_struct_index++;
    +  }
    +
    +  return std::string_view(reinterpret_cast(stream->buf) + current_index(), stream->parser->implementation->structural_indexes[cur_struct_index] - current_index() + stream->batch_start + 1);;
    +}
    +
    +inline error_code document_stream::iterator::error() const noexcept {
    +  return stream->error;
    +}
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +
    +inline void document_stream::load_from_stage1_thread() noexcept {
    +  worker->finish();
    +  // Swap to the parser that was loaded up in the thread. Make sure the parser has
    +  // enough memory to swap to, as well.
    +  std::swap(stage1_thread_parser,*parser);
    +  error = stage1_thread_error;
    +  if (error) { return; }
    +
    +  // If there's anything left, start the stage 1 thread!
    +  if (next_batch_start() < len) {
    +    start_stage1_thread();
    +  }
    +}
    +
    +inline void document_stream::start_stage1_thread() noexcept {
    +  // we call the thread on a lambda that will update
    +  // this->stage1_thread_error
    +  // there is only one thread that may write to this value
    +  // TODO this is NOT exception-safe.
    +  this->stage1_thread_error = UNINITIALIZED; // In case something goes wrong, make sure it's an error
    +  size_t _next_batch_start = this->next_batch_start();
    +
    +  worker->run(this, & this->stage1_thread_parser, _next_batch_start);
    +}
    +
    +#endif // SIMDJSON_THREADS_ENABLED
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(error)
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  haswell::ondemand::document_stream &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +
    +}
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H
    +/* end file simdjson/generic/ondemand/document_stream-inl.h for haswell */
    +/* including simdjson/generic/ondemand/field-inl.h for haswell: #include "simdjson/generic/ondemand/field-inl.h" */
    +/* begin file simdjson/generic/ondemand/field-inl.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/field.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +// clang 6 doesn't think the default constructor can be noexcept, so we make it explicit
    +simdjson_inline field::field() noexcept : std::pair() {}
    +
    +simdjson_inline field::field(raw_json_string key, ondemand::value &&value) noexcept
    +  : std::pair(key, std::forward(value))
    +{
    +}
    +
    +simdjson_inline simdjson_result field::start(value_iterator &parent_iter) noexcept {
    +  raw_json_string key;
    +  SIMDJSON_TRY( parent_iter.field_key().get(key) );
    +  SIMDJSON_TRY( parent_iter.field_value() );
    +  return field::start(parent_iter, key);
    +}
    +
    +simdjson_inline simdjson_result field::start(const value_iterator &parent_iter, raw_json_string key) noexcept {
    +    return field(key, parent_iter.child());
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result field::unescaped_key(bool allow_replacement) noexcept {
    +  SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() but Visual Studio won't let us.
    +  simdjson_result answer = first.unescape(second.iter.json_iter(), allow_replacement);
    +  first.consume();
    +  return answer;
    +}
    +
    +simdjson_inline raw_json_string field::key() const noexcept {
    +  SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() by Visual Studio won't let us.
    +  return first;
    +}
    +
    +simdjson_inline value &field::value() & noexcept {
    +  return second;
    +}
    +
    +simdjson_inline value field::value() && noexcept {
    +  return std::forward(*this).second;
    +}
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  haswell::ondemand::field &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::key() noexcept {
    +  if (error()) { return error(); }
    +  return first.key();
    +}
    +simdjson_inline simdjson_result simdjson_result::unescaped_key(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.unescaped_key(allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::value() noexcept {
    +  if (error()) { return error(); }
    +  return std::move(first.value());
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H
    +/* end file simdjson/generic/ondemand/field-inl.h for haswell */
    +/* including simdjson/generic/ondemand/json_iterator-inl.h for haswell: #include "simdjson/generic/ondemand/json_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/json_iterator-inl.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/logger-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/token_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept
    +  : token(std::forward(other.token)),
    +    parser{other.parser},
    +    _string_buf_loc{other._string_buf_loc},
    +    error{other.error},
    +    _depth{other._depth},
    +    _root{other._root},
    +    _streaming{other._streaming}
    +{
    +  other.parser = nullptr;
    +}
    +simdjson_inline json_iterator &json_iterator::operator=(json_iterator &&other) noexcept {
    +  token = other.token;
    +  parser = other.parser;
    +  _string_buf_loc = other._string_buf_loc;
    +  error = other.error;
    +  _depth = other._depth;
    +  _root = other._root;
    +  _streaming = other._streaming;
    +  other.parser = nullptr;
    +  return *this;
    +}
    +
    +simdjson_inline json_iterator::json_iterator(const uint8_t *buf, ondemand::parser *_parser) noexcept
    +  : token(buf, &_parser->implementation->structural_indexes[0]),
    +    parser{_parser},
    +    _string_buf_loc{parser->string_buf.get()},
    +    _depth{1},
    +    _root{parser->implementation->structural_indexes.get()},
    +    _streaming{false}
    +
    +{
    +  logger::log_headers();
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens();
    +#endif
    +}
    +
    +inline void json_iterator::rewind() noexcept {
    +  token.set_position( root_position() );
    +  logger::log_headers(); // We start again
    +  _string_buf_loc = parser->string_buf.get();
    +  _depth = 1;
    +}
    +
    +inline bool json_iterator::balanced() const noexcept {
    +  token_iterator ti(token);
    +  int32_t count{0};
    +  ti.set_position( root_position() );
    +  while(ti.peek() <= peek_last()) {
    +    switch (*ti.return_current_and_advance())
    +    {
    +    case '[': case '{':
    +      count++;
    +      break;
    +    case ']': case '}':
    +      count--;
    +      break;
    +    default:
    +      break;
    +    }
    +  }
    +  return count == 0;
    +}
    +
    +
    +// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller
    +// relating depth and parent_depth, which is a desired effect. The warning does not show up if the
    +// skip_child() function is not marked inline).
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_warn_unused simdjson_inline error_code json_iterator::skip_child(depth_t parent_depth) noexcept {
    +  if (depth() <= parent_depth) { return SUCCESS; }
    +  switch (*return_current_and_advance()) {
    +    // TODO consider whether matching braces is a requirement: if non-matching braces indicates
    +    // *missing* braces, then future lookups are not in the object/arrays they think they are,
    +    // violating the rule "validate enough structure that the user can be confident they are
    +    // looking at the right values."
    +    // PERF TODO we can eliminate the switch here with a lookup of how much to add to depth
    +
    +    // For the first open array/object in a value, we've already incremented depth, so keep it the same
    +    // We never stop at colon, but if we did, it wouldn't affect depth
    +    case '[': case '{': case ':':
    +      logger::log_start_value(*this, "skip");
    +      break;
    +    // If there is a comma, we have just finished a value in an array/object, and need to get back in
    +    case ',':
    +      logger::log_value(*this, "skip");
    +      break;
    +    // ] or } means we just finished a value and need to jump out of the array/object
    +    case ']': case '}':
    +      logger::log_end_value(*this, "skip");
    +      _depth--;
    +      if (depth() <= parent_depth) { return SUCCESS; }
    +#if SIMDJSON_CHECK_EOF
    +      // If there are no more tokens, the parent is incomplete.
    +      if (at_end()) { return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "Missing [ or { at start"); }
    +#endif // SIMDJSON_CHECK_EOF
    +      break;
    +    case '"':
    +      if(*peek() == ':') {
    +        // We are at a key!!!
    +        // This might happen if you just started an object and you skip it immediately.
    +        // Performance note: it would be nice to get rid of this check as it is somewhat
    +        // expensive.
    +        // https://github.com/simdjson/simdjson/issues/1742
    +        logger::log_value(*this, "key");
    +        return_current_and_advance(); // eat up the ':'
    +        break; // important!!!
    +      }
    +      simdjson_fallthrough;
    +    // Anything else must be a scalar value
    +    default:
    +      // For the first scalar, we will have incremented depth already, so we decrement it here.
    +      logger::log_value(*this, "skip");
    +      _depth--;
    +      if (depth() <= parent_depth) { return SUCCESS; }
    +      break;
    +  }
    +
    +  // Now that we've considered the first value, we only increment/decrement for arrays/objects
    +  while (position() < end_position()) {
    +    switch (*return_current_and_advance()) {
    +      case '[': case '{':
    +        logger::log_start_value(*this, "skip");
    +        _depth++;
    +        break;
    +      // TODO consider whether matching braces is a requirement: if non-matching braces indicates
    +      // *missing* braces, then future lookups are not in the object/arrays they think they are,
    +      // violating the rule "validate enough structure that the user can be confident they are
    +      // looking at the right values."
    +      // PERF TODO we can eliminate the switch here with a lookup of how much to add to depth
    +      case ']': case '}':
    +        logger::log_end_value(*this, "skip");
    +        _depth--;
    +        if (depth() <= parent_depth) { return SUCCESS; }
    +        break;
    +      default:
    +        logger::log_value(*this, "skip", "");
    +        break;
    +    }
    +  }
    +
    +  return report_error(TAPE_ERROR, "not enough close braces");
    +}
    +
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_inline bool json_iterator::at_root() const noexcept {
    +  return position() == root_position();
    +}
    +
    +simdjson_inline bool json_iterator::is_single_token() const noexcept {
    +  return parser->implementation->n_structural_indexes == 1;
    +}
    +
    +simdjson_inline bool json_iterator::streaming() const noexcept {
    +  return _streaming;
    +}
    +
    +simdjson_inline token_position json_iterator::root_position() const noexcept {
    +  return _root;
    +}
    +
    +simdjson_inline void json_iterator::assert_at_document_depth() const noexcept {
    +  SIMDJSON_ASSUME( _depth == 1 );
    +}
    +
    +simdjson_inline void json_iterator::assert_at_root() const noexcept {
    +  SIMDJSON_ASSUME( _depth == 1 );
    +#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
    +  // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument
    +  // has side effects that will be discarded.
    +  SIMDJSON_ASSUME( token.position() == _root );
    +#endif
    +}
    +
    +simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) const noexcept {
    +  assert_valid_position(token._position + required_tokens - 1);
    +}
    +
    +simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept {
    +#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
    +  SIMDJSON_ASSUME( position >= &parser->implementation->structural_indexes[0] );
    +  SIMDJSON_ASSUME( position < &parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] );
    +#endif
    +}
    +
    +simdjson_inline bool json_iterator::at_end() const noexcept {
    +  return position() == end_position();
    +}
    +simdjson_inline token_position json_iterator::end_position() const noexcept {
    +  uint32_t n_structural_indexes{parser->implementation->n_structural_indexes};
    +  return &parser->implementation->structural_indexes[n_structural_indexes];
    +}
    +
    +inline std::string json_iterator::to_string() const noexcept {
    +  if( !is_alive() ) { return "dead json_iterator instance"; }
    +  const char * current_structural = reinterpret_cast(token.peek());
    +  return std::string("json_iterator [ depth : ") + std::to_string(_depth)
    +          + std::string(", structural : '") + std::string(current_structural,1)
    +          + std::string("', offset : ") + std::to_string(token.current_offset())
    +          + std::string("', error : ") + error_message(error)
    +          + std::string(" ]");
    +}
    +
    +inline simdjson_result json_iterator::current_location() const noexcept {
    +  if (!is_alive()) {    // Unrecoverable error
    +    if (!at_root()) {
    +      return reinterpret_cast(token.peek(-1));
    +    } else {
    +      return reinterpret_cast(token.peek());
    +    }
    +  }
    +  if (at_end()) {
    +    return OUT_OF_BOUNDS;
    +  }
    +  return reinterpret_cast(token.peek());
    +}
    +
    +simdjson_inline bool json_iterator::is_alive() const noexcept {
    +  return parser;
    +}
    +
    +simdjson_inline void json_iterator::abandon() noexcept {
    +  parser = nullptr;
    +  _depth = 0;
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::return_current_and_advance() noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens();
    +#endif // SIMDJSON_CHECK_EOF
    +  return token.return_current_and_advance();
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::unsafe_pointer() const noexcept {
    +  // deliberately done without safety guard:
    +  return token.peek();
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::peek(int32_t delta) const noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens(delta+1);
    +#endif // SIMDJSON_CHECK_EOF
    +  return token.peek(delta);
    +}
    +
    +simdjson_inline uint32_t json_iterator::peek_length(int32_t delta) const noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens(delta+1);
    +#endif // #if SIMDJSON_CHECK_EOF
    +  return token.peek_length(delta);
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::peek(token_position position) const noexcept {
    +  // todo: currently we require end-of-string buffering, but the following
    +  // assert_valid_position should be turned on if/when we lift that condition.
    +  // assert_valid_position(position);
    +  // This is almost surely related to SIMDJSON_CHECK_EOF but given that SIMDJSON_CHECK_EOF
    +  // is ON by default, we have no choice but to disable it for real with a comment.
    +  return token.peek(position);
    +}
    +
    +simdjson_inline uint32_t json_iterator::peek_length(token_position position) const noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_valid_position(position);
    +#endif // SIMDJSON_CHECK_EOF
    +  return token.peek_length(position);
    +}
    +
    +simdjson_inline token_position json_iterator::last_position() const noexcept {
    +  // The following line fails under some compilers...
    +  // SIMDJSON_ASSUME(parser->implementation->n_structural_indexes > 0);
    +  // since it has side-effects.
    +  uint32_t n_structural_indexes{parser->implementation->n_structural_indexes};
    +  SIMDJSON_ASSUME(n_structural_indexes > 0);
    +  return &parser->implementation->structural_indexes[n_structural_indexes - 1];
    +}
    +simdjson_inline const uint8_t *json_iterator::peek_last() const noexcept {
    +  return token.peek(last_position());
    +}
    +
    +simdjson_inline void json_iterator::ascend_to(depth_t parent_depth) noexcept {
    +  SIMDJSON_ASSUME(parent_depth >= 0 && parent_depth < INT32_MAX - 1);
    +  SIMDJSON_ASSUME(_depth == parent_depth + 1);
    +  _depth = parent_depth;
    +}
    +
    +simdjson_inline void json_iterator::descend_to(depth_t child_depth) noexcept {
    +  SIMDJSON_ASSUME(child_depth >= 1 && child_depth < INT32_MAX);
    +  SIMDJSON_ASSUME(_depth == child_depth - 1);
    +  _depth = child_depth;
    +}
    +
    +simdjson_inline depth_t json_iterator::depth() const noexcept {
    +  return _depth;
    +}
    +
    +simdjson_inline uint8_t *&json_iterator::string_buf_loc() noexcept {
    +  return _string_buf_loc;
    +}
    +
    +simdjson_inline error_code json_iterator::report_error(error_code _error, const char *message) noexcept {
    +  SIMDJSON_ASSUME(_error != SUCCESS && _error != UNINITIALIZED && _error != INCORRECT_TYPE && _error != NO_SUCH_FIELD);
    +  logger::log_error(*this, message);
    +  error = _error;
    +  return error;
    +}
    +
    +simdjson_inline token_position json_iterator::position() const noexcept {
    +  return token.position();
    +}
    +
    +simdjson_inline simdjson_result json_iterator::unescape(raw_json_string in, bool allow_replacement) noexcept {
    +  return parser->unescape(in, _string_buf_loc, allow_replacement);
    +}
    +
    +simdjson_inline simdjson_result json_iterator::unescape_wobbly(raw_json_string in) noexcept {
    +  return parser->unescape_wobbly(in, _string_buf_loc);
    +}
    +
    +simdjson_inline void json_iterator::reenter_child(token_position position, depth_t child_depth) noexcept {
    +  SIMDJSON_ASSUME(child_depth >= 1 && child_depth < INT32_MAX);
    +  SIMDJSON_ASSUME(_depth == child_depth - 1);
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
    +  SIMDJSON_ASSUME(size_t(child_depth) < parser->max_depth());
    +  SIMDJSON_ASSUME(position >= parser->start_positions[child_depth]);
    +#endif
    +#endif
    +  token.set_position(position);
    +  _depth = child_depth;
    +}
    +
    +simdjson_inline error_code json_iterator::consume_character(char c) noexcept {
    +  if (*peek() == c) {
    +    return_current_and_advance();
    +    return SUCCESS;
    +  }
    +  return TAPE_ERROR;
    +}
    +
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +
    +simdjson_inline token_position json_iterator::start_position(depth_t depth) const noexcept {
    +  SIMDJSON_ASSUME(size_t(depth) < parser->max_depth());
    +  return size_t(depth) < parser->max_depth() ? parser->start_positions[depth] : 0;
    +}
    +
    +simdjson_inline void json_iterator::set_start_position(depth_t depth, token_position position) noexcept {
    +  SIMDJSON_ASSUME(size_t(depth) < parser->max_depth());
    +  if(size_t(depth) < parser->max_depth()) { parser->start_positions[depth] = position; }
    +}
    +
    +#endif
    +
    +
    +simdjson_inline error_code json_iterator::optional_error(error_code _error, const char *message) noexcept {
    +  SIMDJSON_ASSUME(_error == INCORRECT_TYPE || _error == NO_SUCH_FIELD);
    +  logger::log_error(*this, message);
    +  return _error;
    +}
    +
    +
    +simdjson_warn_unused simdjson_inline bool json_iterator::copy_to_buffer(const uint8_t *json, uint32_t max_len, uint8_t *tmpbuf, size_t N) noexcept {
    +  // This function is not expected to be called in performance-sensitive settings.
    +  // Let us guard against silly cases:
    +  if((N < max_len) || (N == 0)) { return false; }
    +  // Copy to the buffer.
    +  std::memcpy(tmpbuf, json, max_len);
    +  if(N > max_len) { // We pad whatever remains with ' '.
    +    std::memset(tmpbuf + max_len, ' ', N - max_len);
    +  }
    +  return true;
    +}
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::json_iterator &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/json_iterator-inl.h for haswell */
    +/* including simdjson/generic/ondemand/json_type-inl.h for haswell: #include "simdjson/generic/ondemand/json_type-inl.h" */
    +/* begin file simdjson/generic/ondemand/json_type-inl.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +inline std::ostream& operator<<(std::ostream& out, json_type type) noexcept {
    +    switch (type) {
    +        case json_type::array: out << "array"; break;
    +        case json_type::object: out << "object"; break;
    +        case json_type::number: out << "number"; break;
    +        case json_type::string: out << "string"; break;
    +        case json_type::boolean: out << "boolean"; break;
    +        case json_type::null: out << "null"; break;
    +        default: SIMDJSON_UNREACHABLE();
    +    }
    +    return out;
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false) {
    +    return out << type.value();
    +}
    +#endif
    +
    +
    +
    +simdjson_inline number_type number::get_number_type() const noexcept {
    +  return type;
    +}
    +
    +simdjson_inline bool number::is_uint64() const noexcept {
    +  return get_number_type() == number_type::unsigned_integer;
    +}
    +
    +simdjson_inline uint64_t number::get_uint64() const noexcept {
    +  return payload.unsigned_integer;
    +}
    +
    +simdjson_inline number::operator uint64_t() const noexcept {
    +  return get_uint64();
    +}
    +
    +
    +simdjson_inline bool number::is_int64() const noexcept {
    +  return get_number_type() == number_type::signed_integer;
    +}
    +
    +simdjson_inline int64_t number::get_int64() const noexcept {
    +  return payload.signed_integer;
    +}
    +
    +simdjson_inline number::operator int64_t() const noexcept {
    +  return get_int64();
    +}
    +
    +simdjson_inline bool number::is_double() const noexcept {
    +    return get_number_type() == number_type::floating_point_number;
    +}
    +
    +simdjson_inline double number::get_double() const noexcept {
    +  return payload.floating_point_number;
    +}
    +
    +simdjson_inline number::operator double() const noexcept {
    +  return get_double();
    +}
    +
    +simdjson_inline double number::as_double() const noexcept {
    +  if(is_double()) {
    +    return payload.floating_point_number;
    +  }
    +  if(is_int64()) {
    +    return double(payload.signed_integer);
    +  }
    +  return double(payload.unsigned_integer);
    +}
    +
    +simdjson_inline void number::append_s64(int64_t value) noexcept {
    +  payload.signed_integer = value;
    +  type = number_type::signed_integer;
    +}
    +
    +simdjson_inline void number::append_u64(uint64_t value) noexcept {
    +  payload.unsigned_integer = value;
    +  type = number_type::unsigned_integer;
    +}
    +
    +simdjson_inline void number::append_double(double value) noexcept {
    +  payload.floating_point_number = value;
    +  type = number_type::floating_point_number;
    +}
    +
    +simdjson_inline void number::skip_double() noexcept {
    +  type = number_type::floating_point_number;
    +}
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::json_type &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H
    +/* end file simdjson/generic/ondemand/json_type-inl.h for haswell */
    +/* including simdjson/generic/ondemand/logger-inl.h for haswell: #include "simdjson/generic/ondemand/logger-inl.h" */
    +/* begin file simdjson/generic/ondemand/logger-inl.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/logger.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +namespace logger {
    +
    +static constexpr const char * DASHES = "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------";
    +static constexpr const int LOG_EVENT_LEN = 20;
    +static constexpr const int LOG_BUFFER_LEN = 30;
    +static constexpr const int LOG_SMALL_BUFFER_LEN = 10;
    +static int log_depth = 0; // Not threadsafe. Log only.
    +
    +// Helper to turn unprintable or newline characters into spaces
    +static inline char printable_char(char c) {
    +  if (c >= 0x20) {
    +    return c;
    +  } else {
    +    return ' ';
    +  }
    +}
    +
    +template
    +static inline std::string string_format(const std::string& format, const Args&... args)
    +{
    +  SIMDJSON_PUSH_DISABLE_ALL_WARNINGS
    +  int size_s = std::snprintf(nullptr, 0, format.c_str(), args...) + 1;
    +  auto size = static_cast(size_s);
    +  if (size <= 0) return std::string();
    +  std::unique_ptr buf(new char[size]);
    +  std::snprintf(buf.get(), size, format.c_str(), args...);
    +  SIMDJSON_POP_DISABLE_WARNINGS
    +  return std::string(buf.get(), buf.get() + size - 1);
    +}
    +
    +static inline log_level get_log_level_from_env()
    +{
    +  SIMDJSON_PUSH_DISABLE_WARNINGS
    +  SIMDJSON_DISABLE_DEPRECATED_WARNING // Disable CRT_SECURE warning on MSVC: manually verified this is safe
    +      char *lvl = getenv("SIMDJSON_LOG_LEVEL");
    +  SIMDJSON_POP_DISABLE_WARNINGS
    +  if (lvl && simdjson_strcasecmp(lvl, "ERROR") == 0) { return log_level::error; }
    +  return log_level::info;
    +}
    +
    +static inline log_level log_threshold()
    +{
    +  static log_level threshold = get_log_level_from_env();
    +  return threshold;
    +}
    +
    +static inline bool should_log(log_level level)
    +{
    +  return level >= log_threshold();
    +}
    +
    +inline void log_event(const json_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_line(iter, "", type, detail, delta, depth_delta, log_level::info);
    +}
    +
    +inline void log_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail) noexcept {
    +  log_line(iter, index, depth, "", type, detail, log_level::info);
    +}
    +inline void log_value(const json_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_line(iter, "", type, detail, delta, depth_delta, log_level::info);
    +}
    +
    +inline void log_start_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail) noexcept {
    +  log_line(iter, index, depth, "+", type, detail, log_level::info);
    +  if (LOG_ENABLED) { log_depth++; }
    +}
    +inline void log_start_value(const json_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  log_line(iter, "+", type, "", delta, depth_delta, log_level::info);
    +  if (LOG_ENABLED) { log_depth++; }
    +}
    +
    +inline void log_end_value(const json_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  if (LOG_ENABLED) { log_depth--; }
    +  log_line(iter, "-", type, "", delta, depth_delta, log_level::info);
    +}
    +
    +inline void log_error(const json_iterator &iter, const char *error, const char *detail, int delta, int depth_delta) noexcept {
    +  log_line(iter, "ERROR: ", error, detail, delta, depth_delta, log_level::error);
    +}
    +inline void log_error(const json_iterator &iter, token_position index, depth_t depth, const char *error, const char *detail) noexcept {
    +  log_line(iter, index, depth, "ERROR: ", error, detail, log_level::error);
    +}
    +
    +inline void log_event(const value_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_event(iter.json_iter(), type, detail, delta, depth_delta);
    +}
    +
    +inline void log_value(const value_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_value(iter.json_iter(), type, detail, delta, depth_delta);
    +}
    +
    +inline void log_start_value(const value_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  log_start_value(iter.json_iter(), type, delta, depth_delta);
    +}
    +
    +inline void log_end_value(const value_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  log_end_value(iter.json_iter(), type, delta, depth_delta);
    +}
    +
    +inline void log_error(const value_iterator &iter, const char *error, const char *detail, int delta, int depth_delta) noexcept {
    +  log_error(iter.json_iter(), error, detail, delta, depth_delta);
    +}
    +
    +inline void log_headers() noexcept {
    +  if (LOG_ENABLED) {
    +    if (simdjson_unlikely(should_log(log_level::info))) {
    +      // Technically a static variable is not thread-safe, but if you are using threads and logging... well...
    +      static bool displayed_hint{false};
    +      log_depth = 0;
    +      printf("\n");
    +      if (!displayed_hint) {
    +        // We only print this helpful header once.
    +        printf("# Logging provides the depth and position of the iterator user-visible steps:\n");
    +        printf("# +array says 'this is where we were when we discovered the start array'\n");
    +        printf(
    +            "# -array says 'this is where we were when we ended the array'\n");
    +        printf("# skip says 'this is a structural or value I am skipping'\n");
    +        printf("# +/-skip says 'this is a start/end array or object I am skipping'\n");
    +        printf("#\n");
    +        printf("# The indentation of the terms (array, string,...) indicates the depth,\n");
    +        printf("# in addition to the depth being displayed.\n");
    +        printf("#\n");
    +        printf("# Every token in the document has a single depth determined by the tokens before it,\n");
    +        printf("# and is not affected by what the token actually is.\n");
    +        printf("#\n");
    +        printf("# Not all structural elements are presented as tokens in the logs.\n");
    +        printf("#\n");
    +        printf("# We never give control to the user within an empty array or an empty object.\n");
    +        printf("#\n");
    +        printf("# Inside an array, having a depth greater than the array's depth means that\n");
    +        printf("# we are pointing inside a value.\n");
    +        printf("# Having a depth equal to the array means that we are pointing right before a value.\n");
    +        printf("# Having a depth smaller than the array means that we have moved beyond the array.\n");
    +        displayed_hint = true;
    +      }
    +      printf("\n");
    +      printf("| %-*s ", LOG_EVENT_LEN, "Event");
    +      printf("| %-*s ", LOG_BUFFER_LEN, "Buffer");
    +      printf("| %-*s ", LOG_SMALL_BUFFER_LEN, "Next");
    +      // printf("| %-*s ", 5,                    "Next#");
    +      printf("| %-*s ", 5, "Depth");
    +      printf("| Detail ");
    +      printf("|\n");
    +
    +      printf("|%.*s", LOG_EVENT_LEN + 2, DASHES);
    +      printf("|%.*s", LOG_BUFFER_LEN + 2, DASHES);
    +      printf("|%.*s", LOG_SMALL_BUFFER_LEN + 2, DASHES);
    +      // printf("|%.*s", 5+2, DASHES);
    +      printf("|%.*s", 5 + 2, DASHES);
    +      printf("|--------");
    +      printf("|\n");
    +      fflush(stdout);
    +    }
    +  }
    +}
    +
    +template 
    +inline void log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, log_level level, Args&&... args) noexcept {
    +  log_line(iter, iter.position()+delta, depth_t(iter.depth()+depth_delta), title_prefix, title, detail, level, std::forward(args)...);
    +}
    +
    +template 
    +inline void log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, log_level level, Args&&... args) noexcept {
    +  if (LOG_ENABLED) {
    +    if (simdjson_unlikely(should_log(level))) {
    +      const int indent = depth * 2;
    +      const auto buf = iter.token.buf;
    +      auto msg = string_format(title, std::forward(args)...);
    +      printf("| %*s%s%-*s ", indent, "", title_prefix,
    +             LOG_EVENT_LEN - indent - int(strlen(title_prefix)), msg.c_str());
    +      {
    +        // Print the current structural.
    +        printf("| ");
    +        // Before we begin, the index might point right before the document.
    +        // This could be unsafe, see https://github.com/simdjson/simdjson/discussions/1938
    +        if (index < iter._root) {
    +          printf("%*s", LOG_BUFFER_LEN, "");
    +        } else {
    +          auto current_structural = &buf[*index];
    +          for (int i = 0; i < LOG_BUFFER_LEN; i++) {
    +            printf("%c", printable_char(current_structural[i]));
    +          }
    +        }
    +        printf(" ");
    +      }
    +      {
    +        // Print the next structural.
    +        printf("| ");
    +        auto next_structural = &buf[*(index + 1)];
    +        for (int i = 0; i < LOG_SMALL_BUFFER_LEN; i++) {
    +          printf("%c", printable_char(next_structural[i]));
    +        }
    +        printf(" ");
    +      }
    +      // printf("| %5u ", *(index+1));
    +      printf("| %5i ", depth);
    +      printf("| %6.*s ", int(detail.size()), detail.data());
    +      printf("|\n");
    +      fflush(stdout);
    +    }
    +  }
    +}
    +
    +} // namespace logger
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H
    +/* end file simdjson/generic/ondemand/logger-inl.h for haswell */
    +/* including simdjson/generic/ondemand/object-inl.h for haswell: #include "simdjson/generic/ondemand/object-inl.h" */
    +/* begin file simdjson/generic/ondemand/object-inl.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/field.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +simdjson_inline simdjson_result object::find_field_unordered(const std::string_view key) & noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_unordered_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +simdjson_inline simdjson_result object::find_field_unordered(const std::string_view key) && noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_unordered_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +simdjson_inline simdjson_result object::operator[](const std::string_view key) & noexcept {
    +  return find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result object::operator[](const std::string_view key) && noexcept {
    +  return std::forward(*this).find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result object::find_field(const std::string_view key) & noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +simdjson_inline simdjson_result object::find_field(const std::string_view key) && noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +
    +simdjson_inline simdjson_result object::start(value_iterator &iter) noexcept {
    +  SIMDJSON_TRY( iter.start_object().error() );
    +  return object(iter);
    +}
    +simdjson_inline simdjson_result object::start_root(value_iterator &iter) noexcept {
    +  SIMDJSON_TRY( iter.start_root_object().error() );
    +  return object(iter);
    +}
    +simdjson_inline error_code object::consume() noexcept {
    +  if(iter.is_at_key()) {
    +    /**
    +     * whenever you are pointing at a key, calling skip_child() is
    +     * unsafe because you will hit a string and you will assume that
    +     * it is string value, and this mistake will lead you to make bad
    +     * depth computation.
    +     */
    +    /**
    +     * We want to 'consume' the key. We could really
    +     * just do _json_iter->return_current_and_advance(); at this
    +     * point, but, for clarity, we will use the high-level API to
    +     * eat the key. We assume that the compiler optimizes away
    +     * most of the work.
    +     */
    +    simdjson_unused raw_json_string actual_key;
    +    auto error = iter.field_key().get(actual_key);
    +    if (error) { iter.abandon(); return error; };
    +    // Let us move to the value while we are at it.
    +    if ((error = iter.field_value())) { iter.abandon(); return error; }
    +  }
    +  auto error_skip = iter.json_iter().skip_child(iter.depth()-1);
    +  if(error_skip) { iter.abandon(); }
    +  return error_skip;
    +}
    +
    +simdjson_inline simdjson_result object::raw_json() noexcept {
    +  const uint8_t * starting_point{iter.peek_start()};
    +  auto error = consume();
    +  if(error) { return error; }
    +  const uint8_t * final_point{iter._json_iter->peek()};
    +  return std::string_view(reinterpret_cast(starting_point), size_t(final_point - starting_point));
    +}
    +
    +simdjson_inline simdjson_result object::started(value_iterator &iter) noexcept {
    +  SIMDJSON_TRY( iter.started_object().error() );
    +  return object(iter);
    +}
    +
    +simdjson_inline object object::resume(const value_iterator &iter) noexcept {
    +  return iter;
    +}
    +
    +simdjson_inline object::object(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{
    +}
    +
    +simdjson_inline simdjson_result object::begin() noexcept {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  return object_iterator(iter);
    +}
    +simdjson_inline simdjson_result object::end() noexcept {
    +  return object_iterator(iter);
    +}
    +
    +inline simdjson_result object::at_pointer(std::string_view json_pointer) noexcept {
    +  if (json_pointer[0] != '/') { return INVALID_JSON_POINTER; }
    +  json_pointer = json_pointer.substr(1);
    +  size_t slash = json_pointer.find('/');
    +  std::string_view key = json_pointer.substr(0, slash);
    +  // Grab the child with the given key
    +  simdjson_result child;
    +
    +  // If there is an escape character in the key, unescape it and then get the child.
    +  size_t escape = key.find('~');
    +  if (escape != std::string_view::npos) {
    +    // Unescape the key
    +    std::string unescaped(key);
    +    do {
    +      switch (unescaped[escape+1]) {
    +        case '0':
    +          unescaped.replace(escape, 2, "~");
    +          break;
    +        case '1':
    +          unescaped.replace(escape, 2, "/");
    +          break;
    +        default:
    +          return INVALID_JSON_POINTER; // "Unexpected ~ escape character in JSON pointer");
    +      }
    +      escape = unescaped.find('~', escape+1);
    +    } while (escape != std::string::npos);
    +    child = find_field(unescaped);  // Take note find_field does not unescape keys when matching
    +  } else {
    +    child = find_field(key);
    +  }
    +  if(child.error()) {
    +    return child; // we do not continue if there was an error
    +  }
    +  // If there is a /, we have to recurse and look up more of the path
    +  if (slash != std::string_view::npos) {
    +    child = child.at_pointer(json_pointer.substr(slash));
    +  }
    +  return child;
    +}
    +
    +simdjson_inline simdjson_result object::count_fields() & noexcept {
    +  size_t count{0};
    +  // Important: we do not consume any of the values.
    +  for(simdjson_unused auto v : *this) { count++; }
    +  // The above loop will always succeed, but we want to report errors.
    +  if(iter.error()) { return iter.error(); }
    +  // We need to move back at the start because we expect users to iterate through
    +  // the object after counting the number of elements.
    +  iter.reset_object();
    +  return count;
    +}
    +
    +simdjson_inline simdjson_result object::is_empty() & noexcept {
    +  bool is_not_empty;
    +  auto error = iter.reset_object().get(is_not_empty);
    +  if(error) { return error; }
    +  return !is_not_empty;
    +}
    +
    +simdjson_inline simdjson_result object::reset() & noexcept {
    +  return iter.reset_object();
    +}
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::object &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +simdjson_inline simdjson_result simdjson_result::begin() noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() noexcept {
    +  if (error()) { return error(); }
    +  return first.end();
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first)[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).find_field(key);
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +inline simdjson_result simdjson_result::reset() noexcept {
    +  if (error()) { return error(); }
    +  return first.reset();
    +}
    +
    +inline simdjson_result simdjson_result::is_empty() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_empty();
    +}
    +
    +simdjson_inline  simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +
    +simdjson_inline  simdjson_result simdjson_result::raw_json() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json();
    +}
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H
    +/* end file simdjson/generic/ondemand/object-inl.h for haswell */
    +/* including simdjson/generic/ondemand/object_iterator-inl.h for haswell: #include "simdjson/generic/ondemand/object_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/object_iterator-inl.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/field-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +//
    +// object_iterator
    +//
    +
    +simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{}
    +
    +simdjson_inline simdjson_result object_iterator::operator*() noexcept {
    +  error_code error = iter.error();
    +  if (error) { iter.abandon(); return error; }
    +  auto result = field::start(iter);
    +  // TODO this is a safety rail ... users should exit loops as soon as they receive an error.
    +  // Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free.
    +  if (result.error()) { iter.abandon(); }
    +  return result;
    +}
    +simdjson_inline bool object_iterator::operator==(const object_iterator &other) const noexcept {
    +  return !(*this != other);
    +}
    +simdjson_inline bool object_iterator::operator!=(const object_iterator &) const noexcept {
    +  return iter.is_open();
    +}
    +
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_inline object_iterator &object_iterator::operator++() noexcept {
    +  // TODO this is a safety rail ... users should exit loops as soon as they receive an error.
    +  // Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free.
    +  if (!iter.is_open()) { return *this; } // Iterator will be released if there is an error
    +
    +  simdjson_unused error_code error;
    +  if ((error = iter.skip_child() )) { return *this; }
    +
    +  simdjson_unused bool has_value;
    +  if ((error = iter.has_next_field().get(has_value) )) { return *this; };
    +  return *this;
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +//
    +// ### Live States
    +//
    +// While iterating or looking up values, depth >= iter.depth. at_start may vary. Error is
    +// always SUCCESS:
    +//
    +// - Start: This is the state when the object is first found and the iterator is just past the {.
    +//   In this state, at_start == true.
    +// - Next: After we hand a scalar value to the user, or an array/object which they then fully
    +//   iterate over, the iterator is at the , or } before the next value. In this state,
    +//   depth == iter.depth, at_start == false, and error == SUCCESS.
    +// - Unfinished Business: When we hand an array/object to the user which they do not fully
    +//   iterate over, we need to finish that iteration by skipping child values until we reach the
    +//   Next state. In this state, depth > iter.depth, at_start == false, and error == SUCCESS.
    +//
    +// ## Error States
    +//
    +// In error states, we will yield exactly one more value before stopping. iter.depth == depth
    +// and at_start is always false. We decrement after yielding the error, moving to the Finished
    +// state.
    +//
    +// - Chained Error: When the object iterator is part of an error chain--for example, in
    +//   `for (auto tweet : doc["tweets"])`, where the tweet field may be missing or not be an
    +//   object--we yield that error in the loop, exactly once. In this state, error != SUCCESS and
    +//   iter.depth == depth, and at_start == false. We decrement depth when we yield the error.
    +// - Missing Comma Error: When the iterator ++ method discovers there is no comma between fields,
    +//   we flag that as an error and treat it exactly the same as a Chained Error. In this state,
    +//   error == TAPE_ERROR, iter.depth == depth, and at_start == false.
    +//
    +// Errors that occur while reading a field to give to the user (such as when the key is not a
    +// string or the field is missing a colon) are yielded immediately. Depth is then decremented,
    +// moving to the Finished state without transitioning through an Error state at all.
    +//
    +// ## Terminal State
    +//
    +// The terminal state has iter.depth < depth. at_start is always false.
    +//
    +// - Finished: When we have reached a }, we are finished. We signal this by decrementing depth.
    +//   In this state, iter.depth < depth, at_start == false, and error == SUCCESS.
    +//
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  haswell::ondemand::object_iterator &&value
    +) noexcept
    +  : implementation_simdjson_result_base(std::forward(value))
    +{
    +  first.iter.assert_is_valid();
    +}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +  : implementation_simdjson_result_base({}, error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::operator*() noexcept {
    +  if (error()) { return error(); }
    +  return *first;
    +}
    +// If we're iterating and there is an error, return the error once.
    +simdjson_inline bool simdjson_result::operator==(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return !error(); }
    +  return first == other.first;
    +}
    +// If we're iterating and there is an error, return the error once.
    +simdjson_inline bool simdjson_result::operator!=(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return error(); }
    +  return first != other.first;
    +}
    +// Checks for ']' and ','
    +simdjson_inline simdjson_result &simdjson_result::operator++() noexcept {
    +  // Clear the error if there is one, so we don't yield it twice
    +  if (error()) { second = SUCCESS; return *this; }
    +  ++first;
    +  return *this;
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/object_iterator-inl.h for haswell */
    +/* including simdjson/generic/ondemand/parser-inl.h for haswell: #include "simdjson/generic/ondemand/parser-inl.h" */
    +/* begin file simdjson/generic/ondemand/parser-inl.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/padded_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/padded_string_view.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/dom/base.h" // for MINIMAL_DOCUMENT_CAPACITY */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document_stream.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +simdjson_inline parser::parser(size_t max_capacity) noexcept
    +  : _max_capacity{max_capacity} {
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code parser::allocate(size_t new_capacity, size_t new_max_depth) noexcept {
    +  if (new_capacity > max_capacity()) { return CAPACITY; }
    +  if (string_buf && new_capacity == capacity() && new_max_depth == max_depth()) { return SUCCESS; }
    +
    +  // string_capacity copied from document::allocate
    +  _capacity = 0;
    +  size_t string_capacity = SIMDJSON_ROUNDUP_N(5 * new_capacity / 3 + SIMDJSON_PADDING, 64);
    +  string_buf.reset(new (std::nothrow) uint8_t[string_capacity]);
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  start_positions.reset(new (std::nothrow) token_position[new_max_depth]);
    +#endif
    +  if (implementation) {
    +    SIMDJSON_TRY( implementation->set_capacity(new_capacity) );
    +    SIMDJSON_TRY( implementation->set_max_depth(new_max_depth) );
    +  } else {
    +    SIMDJSON_TRY( simdjson::get_active_implementation()->create_dom_parser_implementation(new_capacity, new_max_depth, implementation) );
    +  }
    +  _capacity = new_capacity;
    +  _max_depth = new_max_depth;
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(padded_string_view json) & noexcept {
    +  if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; }
    +
    +  json.remove_utf8_bom();
    +
    +  // Allocate if needed
    +  if (capacity() < json.length() || !string_buf) {
    +    SIMDJSON_TRY( allocate(json.length(), max_depth()) );
    +  }
    +
    +  // Run stage 1.
    +  SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) );
    +  return document::start({ reinterpret_cast(json.data()), this });
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const char *json, size_t len, size_t allocated) & noexcept {
    +  return iterate(padded_string_view(json, len, allocated));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const uint8_t *json, size_t len, size_t allocated) & noexcept {
    +  return iterate(padded_string_view(json, len, allocated));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string_view json, size_t allocated) & noexcept {
    +  return iterate(padded_string_view(json, allocated));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string &json) & noexcept {
    +  if(json.capacity() - json.size() < SIMDJSON_PADDING) {
    +    json.reserve(json.size() + SIMDJSON_PADDING);
    +  }
    +  return iterate(padded_string_view(json));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const std::string &json) & noexcept {
    +  return iterate(padded_string_view(json));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept {
    +  // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception
    +  SIMDJSON_TRY( result.error() );
    +  padded_string_view json = result.value_unsafe();
    +  return iterate(json);
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept {
    +  // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception
    +  SIMDJSON_TRY( result.error() );
    +  const padded_string &json = result.value_unsafe();
    +  return iterate(json);
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate_raw(padded_string_view json) & noexcept {
    +  if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; }
    +
    +  json.remove_utf8_bom();
    +
    +  // Allocate if needed
    +  if (capacity() < json.length()) {
    +    SIMDJSON_TRY( allocate(json.length(), max_depth()) );
    +  }
    +
    +  // Run stage 1.
    +  SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) );
    +  return json_iterator(reinterpret_cast(json.data()), this);
    +}
    +
    +inline simdjson_result parser::iterate_many(const uint8_t *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept {
    +  if(batch_size < MINIMAL_BATCH_SIZE) { batch_size = MINIMAL_BATCH_SIZE; }
    +  if((len >= 3) && (std::memcmp(buf, "\xEF\xBB\xBF", 3) == 0)) {
    +    buf += 3;
    +    len -= 3;
    +  }
    +  if(allow_comma_separated && batch_size < len) { batch_size = len; }
    +  return document_stream(*this, buf, len, batch_size, allow_comma_separated);
    +}
    +inline simdjson_result parser::iterate_many(const char *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept {
    +  return iterate_many(reinterpret_cast(buf), len, batch_size, allow_comma_separated);
    +}
    +inline simdjson_result parser::iterate_many(const std::string &s, size_t batch_size, bool allow_comma_separated) noexcept {
    +  return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated);
    +}
    +inline simdjson_result parser::iterate_many(const padded_string &s, size_t batch_size, bool allow_comma_separated) noexcept {
    +  return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated);
    +}
    +
    +simdjson_inline size_t parser::capacity() const noexcept {
    +  return _capacity;
    +}
    +simdjson_inline size_t parser::max_capacity() const noexcept {
    +  return _max_capacity;
    +}
    +simdjson_inline size_t parser::max_depth() const noexcept {
    +  return _max_depth;
    +}
    +
    +simdjson_inline void parser::set_max_capacity(size_t max_capacity) noexcept {
    +  if(max_capacity < dom::MINIMAL_DOCUMENT_CAPACITY) {
    +    _max_capacity = max_capacity;
    +  } else {
    +    _max_capacity = dom::MINIMAL_DOCUMENT_CAPACITY;
    +  }
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result parser::unescape(raw_json_string in, uint8_t *&dst, bool allow_replacement) const noexcept {
    +  uint8_t *end = implementation->parse_string(in.buf, dst, allow_replacement);
    +  if (!end) { return STRING_ERROR; }
    +  std::string_view result(reinterpret_cast(dst), end-dst);
    +  dst = end;
    +  return result;
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result parser::unescape_wobbly(raw_json_string in, uint8_t *&dst) const noexcept {
    +  uint8_t *end = implementation->parse_wobbly_string(in.buf, dst);
    +  if (!end) { return STRING_ERROR; }
    +  std::string_view result(reinterpret_cast(dst), end-dst);
    +  dst = end;
    +  return result;
    +}
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::parser &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H
    +/* end file simdjson/generic/ondemand/parser-inl.h for haswell */
    +/* including simdjson/generic/ondemand/raw_json_string-inl.h for haswell: #include "simdjson/generic/ondemand/raw_json_string-inl.h" */
    +/* begin file simdjson/generic/ondemand/raw_json_string-inl.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +
    +namespace haswell {
    +namespace ondemand {
    +
    +simdjson_inline raw_json_string::raw_json_string(const uint8_t * _buf) noexcept : buf{_buf} {}
    +
    +simdjson_inline const char * raw_json_string::raw() const noexcept { return reinterpret_cast(buf); }
    +
    +
    +simdjson_inline bool raw_json_string::is_free_from_unescaped_quote(std::string_view target) noexcept {
    +  size_t pos{0};
    +  // if the content has no escape character, just scan through it quickly!
    +  for(;pos < target.size() && target[pos] != '\\';pos++) {}
    +  // slow path may begin.
    +  bool escaping{false};
    +  for(;pos < target.size();pos++) {
    +    if((target[pos] == '"') && !escaping) {
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  return true;
    +}
    +
    +simdjson_inline bool raw_json_string::is_free_from_unescaped_quote(const char* target) noexcept {
    +  size_t pos{0};
    +  // if the content has no escape character, just scan through it quickly!
    +  for(;target[pos] && target[pos] != '\\';pos++) {}
    +  // slow path may begin.
    +  bool escaping{false};
    +  for(;target[pos];pos++) {
    +    if((target[pos] == '"') && !escaping) {
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  return true;
    +}
    +
    +
    +simdjson_inline bool raw_json_string::unsafe_is_equal(size_t length, std::string_view target) const noexcept {
    +  // If we are going to call memcmp, then we must know something about the length of the raw_json_string.
    +  return (length >= target.size()) && (raw()[target.size()] == '"') && !memcmp(raw(), target.data(), target.size());
    +}
    +
    +simdjson_inline bool raw_json_string::unsafe_is_equal(std::string_view target) const noexcept {
    +  // Assumptions: does not contain unescaped quote characters, and
    +  // the raw content is quote terminated within a valid JSON string.
    +  if(target.size() <= SIMDJSON_PADDING) {
    +    return (raw()[target.size()] == '"') && !memcmp(raw(), target.data(), target.size());
    +  }
    +  const char * r{raw()};
    +  size_t pos{0};
    +  for(;pos < target.size();pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +simdjson_inline bool raw_json_string::is_equal(std::string_view target) const noexcept {
    +  const char * r{raw()};
    +  size_t pos{0};
    +  bool escaping{false};
    +  for(;pos < target.size();pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +    // if target is a compile-time constant and it is free from
    +    // quotes, then the next part could get optimized away through
    +    // inlining.
    +    if((target[pos] == '"') && !escaping) {
    +      // We have reached the end of the raw_json_string but
    +      // the target is not done.
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +
    +simdjson_inline bool raw_json_string::unsafe_is_equal(const char * target) const noexcept {
    +  // Assumptions: 'target' does not contain unescaped quote characters, is null terminated and
    +  // the raw content is quote terminated within a valid JSON string.
    +  const char * r{raw()};
    +  size_t pos{0};
    +  for(;target[pos];pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +simdjson_inline bool raw_json_string::is_equal(const char* target) const noexcept {
    +  // Assumptions: does not contain unescaped quote characters, and
    +  // the raw content is quote terminated within a valid JSON string.
    +  const char * r{raw()};
    +  size_t pos{0};
    +  bool escaping{false};
    +  for(;target[pos];pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +    // if target is a compile-time constant and it is free from
    +    // quotes, then the next part could get optimized away through
    +    // inlining.
    +    if((target[pos] == '"') && !escaping) {
    +      // We have reached the end of the raw_json_string but
    +      // the target is not done.
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept {
    +  return a.unsafe_is_equal(c);
    +}
    +
    +simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept {
    +  return a == c;
    +}
    +
    +simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept {
    +  return !(a == c);
    +}
    +
    +simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept {
    +  return !(a == c);
    +}
    +
    +
    +simdjson_inline simdjson_warn_unused simdjson_result raw_json_string::unescape(json_iterator &iter, bool allow_replacement) const noexcept {
    +  return iter.unescape(*this, allow_replacement);
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result raw_json_string::unescape_wobbly(json_iterator &iter) const noexcept {
    +  return iter.unescape_wobbly(*this);
    +}
    +
    +simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &out, const raw_json_string &str) noexcept {
    +  bool in_escape = false;
    +  const char *s = str.raw();
    +  while (true) {
    +    switch (*s) {
    +      case '\\': in_escape = !in_escape; break;
    +      case '"': if (in_escape) { in_escape = false; } else { return out; } break;
    +      default: if (in_escape) { in_escape = false; }
    +    }
    +    out << *s;
    +    s++;
    +  }
    +}
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::raw_json_string &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +simdjson_inline simdjson_result simdjson_result::raw() const noexcept {
    +  if (error()) { return error(); }
    +  return first.raw();
    +}
    +simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape(haswell::ondemand::json_iterator &iter, bool allow_replacement) const noexcept {
    +  if (error()) { return error(); }
    +  return first.unescape(iter, allow_replacement);
    +}
    +simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape_wobbly(haswell::ondemand::json_iterator &iter) const noexcept {
    +  if (error()) { return error(); }
    +  return first.unescape_wobbly(iter);
    +}
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H
    +/* end file simdjson/generic/ondemand/raw_json_string-inl.h for haswell */
    +/* including simdjson/generic/ondemand/serialization-inl.h for haswell: #include "simdjson/generic/ondemand/serialization-inl.h" */
    +/* begin file simdjson/generic/ondemand/serialization-inl.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/serialization.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +
    +inline std::string_view trim(const std::string_view str) noexcept {
    +  // We can almost surely do better by rolling our own find_first_not_of function.
    +  size_t first = str.find_first_not_of(" \t\n\r");
    +  // If we have the empty string (just white space), then no trimming is possible, and
    +  // we return the empty string_view.
    +  if (std::string_view::npos == first) { return std::string_view(); }
    +  size_t last = str.find_last_not_of(" \t\n\r");
    +  return str.substr(first, (last - first + 1));
    +}
    +
    +
    +inline simdjson_result to_json_string(haswell::ondemand::document& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(haswell::ondemand::document_reference& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(haswell::ondemand::value& x) noexcept {
    +  /**
    +   * If we somehow receive a value that has already been consumed,
    +   * then the following code could be in trouble. E.g., we create
    +   * an array as needed, but if an array was already created, then
    +   * it could be bad.
    +   */
    +  using namespace haswell::ondemand;
    +  haswell::ondemand::json_type t;
    +  auto error = x.type().get(t);
    +  if(error != SUCCESS) { return error; }
    +  switch (t)
    +  {
    +    case json_type::array:
    +    {
    +      haswell::ondemand::array array;
    +      error = x.get_array().get(array);
    +      if(error) { return error; }
    +      return to_json_string(array);
    +    }
    +    case json_type::object:
    +    {
    +      haswell::ondemand::object object;
    +      error = x.get_object().get(object);
    +      if(error) { return error; }
    +      return to_json_string(object);
    +    }
    +    default:
    +      return trim(x.raw_json_token());
    +  }
    +}
    +
    +inline simdjson_result to_json_string(haswell::ondemand::object& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(haswell::ondemand::array& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +} // namespace simdjson
    +
    +namespace simdjson { namespace haswell { namespace ondemand {
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::value x) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(x).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::value x) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(x).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::array value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::array value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::document& value)  {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::document_reference& value)  {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::document& value)  {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::object value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out,  simdjson::simdjson_result x) {
    +  if (x.error()) { throw  simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::haswell::ondemand::object value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +}}} // namespace simdjson::haswell::ondemand
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H
    +/* end file simdjson/generic/ondemand/serialization-inl.h for haswell */
    +/* including simdjson/generic/ondemand/token_iterator-inl.h for haswell: #include "simdjson/generic/ondemand/token_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/token_iterator-inl.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/token_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +simdjson_inline token_iterator::token_iterator(
    +  const uint8_t *_buf,
    +  token_position position
    +) noexcept : buf{_buf}, _position{position}
    +{
    +}
    +
    +simdjson_inline uint32_t token_iterator::current_offset() const noexcept {
    +  return *(_position);
    +}
    +
    +
    +simdjson_inline const uint8_t *token_iterator::return_current_and_advance() noexcept {
    +  return &buf[*(_position++)];
    +}
    +
    +simdjson_inline const uint8_t *token_iterator::peek(token_position position) const noexcept {
    +  return &buf[*position];
    +}
    +simdjson_inline uint32_t token_iterator::peek_index(token_position position) const noexcept {
    +  return *position;
    +}
    +simdjson_inline uint32_t token_iterator::peek_length(token_position position) const noexcept {
    +  return *(position+1) - *position;
    +}
    +
    +simdjson_inline const uint8_t *token_iterator::peek(int32_t delta) const noexcept {
    +  return &buf[*(_position+delta)];
    +}
    +simdjson_inline uint32_t token_iterator::peek_index(int32_t delta) const noexcept {
    +  return *(_position+delta);
    +}
    +simdjson_inline uint32_t token_iterator::peek_length(int32_t delta) const noexcept {
    +  return *(_position+delta+1) - *(_position+delta);
    +}
    +
    +simdjson_inline token_position token_iterator::position() const noexcept {
    +  return _position;
    +}
    +simdjson_inline void token_iterator::set_position(token_position target_position) noexcept {
    +  _position = target_position;
    +}
    +
    +simdjson_inline bool token_iterator::operator==(const token_iterator &other) const noexcept {
    +  return _position == other._position;
    +}
    +simdjson_inline bool token_iterator::operator!=(const token_iterator &other) const noexcept {
    +  return _position != other._position;
    +}
    +simdjson_inline bool token_iterator::operator>(const token_iterator &other) const noexcept {
    +  return _position > other._position;
    +}
    +simdjson_inline bool token_iterator::operator>=(const token_iterator &other) const noexcept {
    +  return _position >= other._position;
    +}
    +simdjson_inline bool token_iterator::operator<(const token_iterator &other) const noexcept {
    +  return _position < other._position;
    +}
    +simdjson_inline bool token_iterator::operator<=(const token_iterator &other) const noexcept {
    +  return _position <= other._position;
    +}
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::token_iterator &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/token_iterator-inl.h for haswell */
    +/* including simdjson/generic/ondemand/value-inl.h for haswell: #include "simdjson/generic/ondemand/value-inl.h" */
    +/* begin file simdjson/generic/ondemand/value-inl.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +simdjson_inline value::value(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{
    +}
    +simdjson_inline value value::start(const value_iterator &iter) noexcept {
    +  return iter;
    +}
    +simdjson_inline value value::resume(const value_iterator &iter) noexcept {
    +  return iter;
    +}
    +
    +simdjson_inline simdjson_result value::get_array() noexcept {
    +  return array::start(iter);
    +}
    +simdjson_inline simdjson_result value::get_object() noexcept {
    +  return object::start(iter);
    +}
    +simdjson_inline simdjson_result value::start_or_resume_object() noexcept {
    +  if (iter.at_start()) {
    +    return get_object();
    +  } else {
    +    return object::resume(iter);
    +  }
    +}
    +
    +simdjson_inline simdjson_result value::get_raw_json_string() noexcept {
    +  return iter.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result value::get_string(bool allow_replacement) noexcept {
    +  return iter.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code value::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  return iter.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result value::get_wobbly_string() noexcept {
    +  return iter.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result value::get_double() noexcept {
    +  return iter.get_double();
    +}
    +simdjson_inline simdjson_result value::get_double_in_string() noexcept {
    +  return iter.get_double_in_string();
    +}
    +simdjson_inline simdjson_result value::get_uint64() noexcept {
    +  return iter.get_uint64();
    +}
    +simdjson_inline simdjson_result value::get_uint64_in_string() noexcept {
    +  return iter.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result value::get_int64() noexcept {
    +  return iter.get_int64();
    +}
    +simdjson_inline simdjson_result value::get_int64_in_string() noexcept {
    +  return iter.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result value::get_bool() noexcept {
    +  return iter.get_bool();
    +}
    +simdjson_inline simdjson_result value::is_null() noexcept {
    +  return iter.is_null();
    +}
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_array(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_object(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_raw_json_string(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_string(false); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_number(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_double(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_uint64(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_int64(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_bool(); }
    +
    +template simdjson_inline error_code value::get(T &out) noexcept {
    +  return get().get(out);
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline value::operator array() noexcept(false) {
    +  return get_array();
    +}
    +simdjson_inline value::operator object() noexcept(false) {
    +  return get_object();
    +}
    +simdjson_inline value::operator uint64_t() noexcept(false) {
    +  return get_uint64();
    +}
    +simdjson_inline value::operator int64_t() noexcept(false) {
    +  return get_int64();
    +}
    +simdjson_inline value::operator double() noexcept(false) {
    +  return get_double();
    +}
    +simdjson_inline value::operator std::string_view() noexcept(false) {
    +  return get_string(false);
    +}
    +simdjson_inline value::operator raw_json_string() noexcept(false) {
    +  return get_raw_json_string();
    +}
    +simdjson_inline value::operator bool() noexcept(false) {
    +  return get_bool();
    +}
    +#endif
    +
    +simdjson_inline simdjson_result value::begin() & noexcept {
    +  return get_array().begin();
    +}
    +simdjson_inline simdjson_result value::end() & noexcept {
    +  return {};
    +}
    +simdjson_inline simdjson_result value::count_elements() & noexcept {
    +  simdjson_result answer;
    +  auto a = get_array();
    +  answer = a.count_elements();
    +  // count_elements leaves you pointing inside the array, at the first element.
    +  // We need to move back so that the user can create a new array (which requires that
    +  // we point at '[').
    +  iter.move_at_start();
    +  return answer;
    +}
    +simdjson_inline simdjson_result value::count_fields() & noexcept {
    +  simdjson_result answer;
    +  auto a = get_object();
    +  answer = a.count_fields();
    +  iter.move_at_start();
    +  return answer;
    +}
    +simdjson_inline simdjson_result value::at(size_t index) noexcept {
    +  auto a = get_array();
    +  return a.at(index);
    +}
    +
    +simdjson_inline simdjson_result value::find_field(std::string_view key) noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +simdjson_inline simdjson_result value::find_field(const char *key) noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +
    +simdjson_inline simdjson_result value::find_field_unordered(std::string_view key) noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result value::find_field_unordered(const char *key) noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +
    +simdjson_inline simdjson_result value::operator[](std::string_view key) noexcept {
    +  return start_or_resume_object()[key];
    +}
    +simdjson_inline simdjson_result value::operator[](const char *key) noexcept {
    +  return start_or_resume_object()[key];
    +}
    +
    +simdjson_inline simdjson_result value::type() noexcept {
    +  return iter.type();
    +}
    +
    +simdjson_inline simdjson_result value::is_scalar() noexcept {
    +  json_type this_type;
    +  auto error = type().get(this_type);
    +  if(error) { return error; }
    +  return ! ((this_type == json_type::array) || (this_type == json_type::object));
    +}
    +
    +simdjson_inline bool value::is_negative() noexcept {
    +  return iter.is_negative();
    +}
    +
    +simdjson_inline simdjson_result value::is_integer() noexcept {
    +  return iter.is_integer();
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value::get_number_type() noexcept {
    +  return iter.get_number_type();
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value::get_number() noexcept {
    +  return iter.get_number();
    +}
    +
    +simdjson_inline std::string_view value::raw_json_token() noexcept {
    +  return std::string_view(reinterpret_cast(iter.peek_start()), iter.peek_start_length());
    +}
    +
    +simdjson_inline simdjson_result value::raw_json() noexcept {
    +  json_type t;
    +  SIMDJSON_TRY(type().get(t));
    +  switch (t)
    +  {
    +    case json_type::array: {
    +      ondemand::array array;
    +      SIMDJSON_TRY(get_array().get(array));
    +      return array.raw_json();
    +    }
    +    case json_type::object: {
    +      ondemand::object object;
    +      SIMDJSON_TRY(get_object().get(object));
    +      return object.raw_json();
    +    }
    +    default:
    +      return raw_json_token();
    +  }
    +}
    +
    +simdjson_inline simdjson_result value::current_location() noexcept {
    +  return iter.json_iter().current_location();
    +}
    +
    +simdjson_inline int32_t value::current_depth() const noexcept{
    +  return iter.json_iter().depth();
    +}
    +
    +simdjson_inline simdjson_result value::at_pointer(std::string_view json_pointer) noexcept {
    +  json_type t;
    +  SIMDJSON_TRY(type().get(t));
    +  switch (t)
    +  {
    +    case json_type::array:
    +      return (*this).get_array().at_pointer(json_pointer);
    +    case json_type::object:
    +      return (*this).get_object().at_pointer(json_pointer);
    +    default:
    +      return INVALID_JSON_POINTER;
    +  }
    +}
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  haswell::ondemand::value &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(error)
    +{
    +}
    +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +simdjson_inline simdjson_result simdjson_result::at(size_t index) noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline simdjson_result simdjson_result::begin() & noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() & noexcept {
    +  if (error()) { return error(); }
    +  return {};
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::get_array() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_array();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_object() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_object();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_bool();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_null() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_null();
    +}
    +
    +template simdjson_inline simdjson_result simdjson_result::get() noexcept {
    +  if (error()) { return error(); }
    +  return first.get();
    +}
    +template simdjson_inline error_code simdjson_result::get(T &out) noexcept {
    +  if (error()) { return error(); }
    +  return first.get(out);
    +}
    +
    +template<> simdjson_inline simdjson_result simdjson_result::get() noexcept  {
    +  if (error()) { return error(); }
    +  return std::move(first);
    +}
    +template<> simdjson_inline error_code simdjson_result::get(haswell::ondemand::value &out) noexcept {
    +  if (error()) { return error(); }
    +  out = first;
    +  return SUCCESS;
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::type() noexcept {
    +  if (error()) { return error(); }
    +  return first.type();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_scalar();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_negative() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_negative();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_integer();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number_type();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number();
    +}
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline simdjson_result::operator haswell::ondemand::array() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator haswell::ondemand::object() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator int64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator double() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator haswell::ondemand::raw_json_string() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator bool() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +#endif
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json_token();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::current_location() noexcept {
    +  if (error()) { return error(); }
    +  return first.current_location();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::current_depth() const noexcept {
    +  if (error()) { return error(); }
    +  return first.current_depth();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H
    +/* end file simdjson/generic/ondemand/value-inl.h for haswell */
    +/* including simdjson/generic/ondemand/value_iterator-inl.h for haswell: #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/value_iterator-inl.h for haswell */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/atomparsing.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/numberparsing.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace haswell {
    +namespace ondemand {
    +
    +simdjson_inline value_iterator::value_iterator(
    +  json_iterator *json_iter,
    +  depth_t depth,
    +  token_position start_position
    +) noexcept : _json_iter{json_iter}, _depth{depth}, _start_position{start_position}
    +{
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_object() noexcept {
    +  SIMDJSON_TRY( start_container('{', "Not an object", "object") );
    +  return started_object();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_object() noexcept {
    +  SIMDJSON_TRY( start_container('{', "Not an object", "object") );
    +  return started_root_object();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_object() noexcept {
    +  assert_at_container_start();
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  _json_iter->set_start_position(_depth, start_position());
    +#endif
    +  if (*_json_iter->peek() == '}') {
    +    logger::log_value(*_json_iter, "empty object");
    +    _json_iter->return_current_and_advance();
    +    end_container();
    +    return false;
    +  }
    +  return true;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::check_root_object() noexcept {
    +  // When in streaming mode, we cannot expect peek_last() to be the last structural element of the
    +  // current document. It only works in the normal mode where we have indexed a single document.
    +  // Note that adding a check for 'streaming' is not expensive since we only have at most
    +  // one root element.
    +  if ( ! _json_iter->streaming() ) {
    +    // The following lines do not fully protect against garbage content within the
    +    // object: e.g., `{"a":2} foo }`. Users concerned with garbage content should
    +    // call `at_end()` on the document instance at the end of the processing to
    +    // ensure that the processing has finished at the end.
    +    //
    +    if (*_json_iter->peek_last() != '}') {
    +      _json_iter->abandon();
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing } at end");
    +    }
    +    // If the last character is } *and* the first gibberish character is also '}'
    +    // then on-demand could accidentally go over. So we need additional checks.
    +    // https://github.com/simdjson/simdjson/issues/1834
    +    // Checking that the document is balanced requires a full scan which is potentially
    +    // expensive, but it only happens in edge cases where the first padding character is
    +    // a closing bracket.
    +    if ((*_json_iter->peek(_json_iter->end_position()) == '}') && (!_json_iter->balanced())) {
    +      _json_iter->abandon();
    +      // The exact error would require more work. It will typically be an unclosed object.
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "the document is unbalanced");
    +    }
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_object() noexcept {
    +  auto error = check_root_object();
    +  if(error) { return error; }
    +  return started_object();
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::end_container() noexcept {
    +#if SIMDJSON_CHECK_EOF
    +    if (depth() > 1 && at_end()) { return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing parent ] or }"); }
    +    // if (depth() <= 1 && !at_end()) { return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing [ or { at start"); }
    +#endif // SIMDJSON_CHECK_EOF
    +    _json_iter->ascend_to(depth()-1);
    +    return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_field() noexcept {
    +  assert_at_next();
    +
    +  // It's illegal to call this unless there are more tokens: anything that ends in } or ] is
    +  // obligated to verify there are more tokens if they are not the top level.
    +  switch (*_json_iter->return_current_and_advance()) {
    +    case '}':
    +      logger::log_end_value(*_json_iter, "object");
    +      SIMDJSON_TRY( end_container() );
    +      return false;
    +    case ',':
    +      return true;
    +    default:
    +      return report_error(TAPE_ERROR, "Missing comma between object fields");
    +  }
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::find_field_raw(const std::string_view key) noexcept {
    +  error_code error;
    +  bool has_value;
    +  //
    +  // Initially, the object can be in one of a few different places:
    +  //
    +  // 1. The start of the object, at the first field:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //      ^ (depth 2, index 1)
    +  //    ```
    +  if (at_first_field()) {
    +    has_value = true;
    +
    +  //
    +  // 2. When a previous search did not yield a value or the object is empty:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                     ^ (depth 0)
    +  //    { }
    +  //        ^ (depth 0, index 2)
    +  //    ```
    +  //
    +  } else if (!is_open()) {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    // If we're past the end of the object, we're being iterated out of order.
    +    // Note: this isn't perfect detection. It's possible the user is inside some other object; if so,
    +    // this object iterator will blithely scan that object for fields.
    +    if (_json_iter->depth() < depth() - 1) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +    return false;
    +
    +  // 3. When a previous search found a field or an iterator yielded a value:
    +  //
    +  //    ```
    +  //    // When a field was not fully consumed (or not even touched at all)
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //           ^ (depth 2)
    +  //    // When a field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                   ^ (depth 1)
    +  //    // When the last field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                   ^ (depth 1)
    +  //    ```
    +  //
    +  } else {
    +    if ((error = skip_child() )) { abandon(); return error; }
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    if (_json_iter->start_position(_depth) != start_position()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  }
    +  while (has_value) {
    +    // Get the key and colon, stopping at the value.
    +    raw_json_string actual_key;
    +    // size_t max_key_length = _json_iter->peek_length() - 2; // -2 for the two quotes
    +    // Note: _json_iter->peek_length() - 2 might overflow if _json_iter->peek_length() < 2.
    +    // field_key() advances the pointer and checks that '"' is found (corresponding to a key).
    +    // The depth is left unchanged by field_key().
    +    if ((error = field_key().get(actual_key) )) { abandon(); return error; };
    +    // field_value() will advance and check that we find a ':' separating the
    +    // key and the value. It will also increment the depth by one.
    +    if ((error = field_value() )) { abandon(); return error; }
    +    // If it matches, stop and return
    +    // We could do it this way if we wanted to allow arbitrary
    +    // key content (including escaped quotes).
    +    //if (actual_key.unsafe_is_equal(max_key_length, key)) {
    +    // Instead we do the following which may trigger buffer overruns if the
    +    // user provides an adversarial key (containing a well placed unescaped quote
    +    // character and being longer than the number of bytes remaining in the JSON
    +    // input).
    +    if (actual_key.unsafe_is_equal(key)) {
    +      logger::log_event(*this, "match", key, -2);
    +      // If we return here, then we return while pointing at the ':' that we just checked.
    +      return true;
    +    }
    +
    +    // No match: skip the value and see if , or } is next
    +    logger::log_event(*this, "no match", key, -2);
    +    // The call to skip_child is meant to skip over the value corresponding to the key.
    +    // After skip_child(), we are right before the next comma (',') or the final brace ('}').
    +    SIMDJSON_TRY( skip_child() ); // Skip the value entirely
    +    // The has_next_field() advances the pointer and check that either ',' or '}' is found.
    +    // It returns true if ',' is found, false otherwise. If anything other than ',' or '}' is found,
    +    // then we are in error and we abort.
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +  }
    +
    +  // If the loop ended, we're out of fields to look at.
    +  return false;
    +}
    +
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::find_field_unordered_raw(const std::string_view key) noexcept {
    +  /**
    +   * When find_field_unordered_raw is called, we can either be pointing at the
    +   * first key, pointing outside (at the closing brace) or if a key was matched
    +   * we can be either pointing right afterthe ':' right before the value (that we need skip),
    +   * or we may have consumed the value and we might be at a comma or at the
    +   * final brace (ready for a call to has_next_field()).
    +   */
    +  error_code error;
    +  bool has_value;
    +
    +  // First, we scan from that point to the end.
    +  // If we don't find a match, we may loop back around, and scan from the beginning to that point.
    +  token_position search_start = _json_iter->position();
    +
    +  // We want to know whether we need to go back to the beginning.
    +  bool at_first = at_first_field();
    +  ///////////////
    +  // Initially, the object can be in one of a few different places:
    +  //
    +  // 1. At the first key:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //      ^ (depth 2, index 1)
    +  //    ```
    +  //
    +  if (at_first) {
    +    has_value = true;
    +
    +  // 2. When a previous search did not yield a value or the object is empty:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                     ^ (depth 0)
    +  //    { }
    +  //        ^ (depth 0, index 2)
    +  //    ```
    +  //
    +  } else if (!is_open()) {
    +
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    // If we're past the end of the object, we're being iterated out of order.
    +    // Note: this isn't perfect detection. It's possible the user is inside some other object; if so,
    +    // this object iterator will blithely scan that object for fields.
    +    if (_json_iter->depth() < depth() - 1) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +    SIMDJSON_TRY(reset_object().get(has_value));
    +    at_first = true;
    +  // 3. When a previous search found a field or an iterator yielded a value:
    +  //
    +  //    ```
    +  //    // When a field was not fully consumed (or not even touched at all)
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //           ^ (depth 2)
    +  //    // When a field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                   ^ (depth 1)
    +  //    // When the last field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                   ^ (depth 1)
    +  //    ```
    +  //
    +  } else {
    +    // If someone queried a key but they not did access the value, then we are left pointing
    +    // at the ':' and we need to move forward through the value... If the value was
    +    // processed then skip_child() does not move the iterator (but may adjust the depth).
    +    if ((error = skip_child() )) { abandon(); return error; }
    +    search_start = _json_iter->position();
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    if (_json_iter->start_position(_depth) != start_position()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  }
    +
    +  // After initial processing, we will be in one of two states:
    +  //
    +  // ```
    +  // // At the beginning of a field
    +  // { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //   ^ (depth 1)
    +  // { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                  ^ (depth 1)
    +  // // At the end of the object
    +  // { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                  ^ (depth 0)
    +  // ```
    +  //
    +  // Next, we find a match starting from the current position.
    +  while (has_value) {
    +    SIMDJSON_ASSUME( _json_iter->_depth == _depth ); // We must be at the start of a field
    +
    +    // Get the key and colon, stopping at the value.
    +    raw_json_string actual_key;
    +    // size_t max_key_length = _json_iter->peek_length() - 2; // -2 for the two quotes
    +    // Note: _json_iter->peek_length() - 2 might overflow if _json_iter->peek_length() < 2.
    +    // field_key() advances the pointer and checks that '"' is found (corresponding to a key).
    +    // The depth is left unchanged by field_key().
    +    if ((error = field_key().get(actual_key) )) { abandon(); return error; };
    +    // field_value() will advance and check that we find a ':' separating the
    +    // key and the value. It will also increment the depth by one.
    +    if ((error = field_value() )) { abandon(); return error; }
    +
    +    // If it matches, stop and return
    +    // We could do it this way if we wanted to allow arbitrary
    +    // key content (including escaped quotes).
    +    // if (actual_key.unsafe_is_equal(max_key_length, key)) {
    +    // Instead we do the following which may trigger buffer overruns if the
    +    // user provides an adversarial key (containing a well placed unescaped quote
    +    // character and being longer than the number of bytes remaining in the JSON
    +    // input).
    +    if (actual_key.unsafe_is_equal(key)) {
    +      logger::log_event(*this, "match", key, -2);
    +      // If we return here, then we return while pointing at the ':' that we just checked.
    +      return true;
    +    }
    +
    +    // No match: skip the value and see if , or } is next
    +    logger::log_event(*this, "no match", key, -2);
    +    // The call to skip_child is meant to skip over the value corresponding to the key.
    +    // After skip_child(), we are right before the next comma (',') or the final brace ('}').
    +    SIMDJSON_TRY( skip_child() );
    +    // The has_next_field() advances the pointer and check that either ',' or '}' is found.
    +    // It returns true if ',' is found, false otherwise. If anything other than ',' or '}' is found,
    +    // then we are in error and we abort.
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +  }
    +  // Performance note: it maybe wasteful to rewind to the beginning when there might be
    +  // no other query following. Indeed, it would require reskipping the whole object.
    +  // Instead, you can just stay where you are. If there is a new query, there is always time
    +  // to rewind.
    +  if(at_first) { return false; }
    +
    +  // If we reach the end without finding a match, search the rest of the fields starting at the
    +  // beginning of the object.
    +  // (We have already run through the object before, so we've already validated its structure. We
    +  // don't check errors in this bit.)
    +  SIMDJSON_TRY(reset_object().get(has_value));
    +  while (true) {
    +    SIMDJSON_ASSUME(has_value); // we should reach search_start before ever reaching the end of the object
    +    SIMDJSON_ASSUME( _json_iter->_depth == _depth ); // We must be at the start of a field
    +
    +    // Get the key and colon, stopping at the value.
    +    raw_json_string actual_key;
    +    // size_t max_key_length = _json_iter->peek_length() - 2; // -2 for the two quotes
    +    // Note: _json_iter->peek_length() - 2 might overflow if _json_iter->peek_length() < 2.
    +    // field_key() advances the pointer and checks that '"' is found (corresponding to a key).
    +    // The depth is left unchanged by field_key().
    +    error = field_key().get(actual_key); SIMDJSON_ASSUME(!error);
    +    // field_value() will advance and check that we find a ':' separating the
    +    // key and the value.  It will also increment the depth by one.
    +    error = field_value(); SIMDJSON_ASSUME(!error);
    +
    +    // If it matches, stop and return
    +    // We could do it this way if we wanted to allow arbitrary
    +    // key content (including escaped quotes).
    +    // if (actual_key.unsafe_is_equal(max_key_length, key)) {
    +    // Instead we do the following which may trigger buffer overruns if the
    +    // user provides an adversarial key (containing a well placed unescaped quote
    +    // character and being longer than the number of bytes remaining in the JSON
    +    // input).
    +    if (actual_key.unsafe_is_equal(key)) {
    +      logger::log_event(*this, "match", key, -2);
    +      // If we return here, then we return while pointing at the ':' that we just checked.
    +      return true;
    +    }
    +
    +    // No match: skip the value and see if , or } is next
    +    logger::log_event(*this, "no match", key, -2);
    +    // The call to skip_child is meant to skip over the value corresponding to the key.
    +    // After skip_child(), we are right before the next comma (',') or the final brace ('}').
    +    SIMDJSON_TRY( skip_child() );
    +    // If we reached the end of the key-value pair we started from, then we know
    +    // that the key is not there so we return false. We are either right before
    +    // the next comma or the final brace.
    +    if(_json_iter->position() == search_start) { return false; }
    +    // The has_next_field() advances the pointer and check that either ',' or '}' is found.
    +    // It returns true if ',' is found, false otherwise. If anything other than ',' or '}' is found,
    +    // then we are in error and we abort.
    +    error = has_next_field().get(has_value); SIMDJSON_ASSUME(!error);
    +    // If we make the mistake of exiting here, then we could be left pointing at a key
    +    // in the middle of an object. That's not an allowable state.
    +  }
    +  // If the loop ended, we're out of fields to look at. The program should
    +  // never reach this point.
    +  return false;
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::field_key() noexcept {
    +  assert_at_next();
    +
    +  const uint8_t *key = _json_iter->return_current_and_advance();
    +  if (*(key++) != '"') { return report_error(TAPE_ERROR, "Object key is not a string"); }
    +  return raw_json_string(key);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::field_value() noexcept {
    +  assert_at_next();
    +
    +  if (*_json_iter->return_current_and_advance() != ':') { return report_error(TAPE_ERROR, "Missing colon in object field"); }
    +  _json_iter->descend_to(depth()+1);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_array() noexcept {
    +  SIMDJSON_TRY( start_container('[', "Not an array", "array") );
    +  return started_array();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_array() noexcept {
    +  SIMDJSON_TRY( start_container('[', "Not an array", "array") );
    +  return started_root_array();
    +}
    +
    +inline std::string value_iterator::to_string() const noexcept {
    +  auto answer = std::string("value_iterator [ depth : ") + std::to_string(_depth) + std::string(", ");
    +  if(_json_iter != nullptr) { answer +=  _json_iter->to_string(); }
    +  answer += std::string(" ]");
    +  return answer;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_array() noexcept {
    +  assert_at_container_start();
    +  if (*_json_iter->peek() == ']') {
    +    logger::log_value(*_json_iter, "empty array");
    +    _json_iter->return_current_and_advance();
    +    SIMDJSON_TRY( end_container() );
    +    return false;
    +  }
    +  _json_iter->descend_to(depth()+1);
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  _json_iter->set_start_position(_depth, start_position());
    +#endif
    +  return true;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::check_root_array() noexcept {
    +  // When in streaming mode, we cannot expect peek_last() to be the last structural element of the
    +  // current document. It only works in the normal mode where we have indexed a single document.
    +  // Note that adding a check for 'streaming' is not expensive since we only have at most
    +  // one root element.
    +  if ( ! _json_iter->streaming() ) {
    +    // The following lines do not fully protect against garbage content within the
    +    // array: e.g., `[1, 2] foo]`. Users concerned with garbage content should
    +    // also call `at_end()` on the document instance at the end of the processing to
    +    // ensure that the processing has finished at the end.
    +    //
    +    if (*_json_iter->peek_last() != ']') {
    +      _json_iter->abandon();
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing ] at end");
    +    }
    +    // If the last character is ] *and* the first gibberish character is also ']'
    +    // then on-demand could accidentally go over. So we need additional checks.
    +    // https://github.com/simdjson/simdjson/issues/1834
    +    // Checking that the document is balanced requires a full scan which is potentially
    +    // expensive, but it only happens in edge cases where the first padding character is
    +    // a closing bracket.
    +    if ((*_json_iter->peek(_json_iter->end_position()) == ']') && (!_json_iter->balanced())) {
    +      _json_iter->abandon();
    +      // The exact error would require more work. It will typically be an unclosed array.
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "the document is unbalanced");
    +    }
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_array() noexcept {
    +  auto error = check_root_array();
    +  if (error) { return error; }
    +  return started_array();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_element() noexcept {
    +  assert_at_next();
    +
    +  logger::log_event(*this, "has_next_element");
    +  switch (*_json_iter->return_current_and_advance()) {
    +    case ']':
    +      logger::log_end_value(*_json_iter, "array");
    +      SIMDJSON_TRY( end_container() );
    +      return false;
    +    case ',':
    +      _json_iter->descend_to(depth()+1);
    +      return true;
    +    default:
    +      return report_error(TAPE_ERROR, "Missing comma between array elements");
    +  }
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::parse_bool(const uint8_t *json) const noexcept {
    +  auto not_true = atomparsing::str4ncmp(json, "true");
    +  auto not_false = atomparsing::str4ncmp(json, "fals") | (json[4] ^ 'e');
    +  bool error = (not_true && not_false) || jsoncharutils::is_not_structural_or_whitespace(json[not_true ? 5 : 4]);
    +  if (error) { return incorrect_type_error("Not a boolean"); }
    +  return simdjson_result(!not_true);
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::parse_null(const uint8_t *json) const noexcept {
    +  bool is_null_string = !atomparsing::str4ncmp(json, "null") && jsoncharutils::is_structural_or_whitespace(json[4]);
    +  // if we start with 'n', we must be a null
    +  if(!is_null_string && json[0]=='n') { return incorrect_type_error("Not a null but starts with n"); }
    +  return is_null_string;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_string(bool allow_replacement) noexcept {
    +  return get_raw_json_string().unescape(json_iter(), allow_replacement);
    +}
    +template 
    +simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  std::string_view content;
    +  auto err = get_string(allow_replacement).get(content);
    +  if (err) { return err; }
    +  receiver = content;
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_wobbly_string() noexcept {
    +  return get_raw_json_string().unescape_wobbly(json_iter());
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_raw_json_string() noexcept {
    +  auto json = peek_scalar("string");
    +  if (*json != '"') { return incorrect_type_error("Not a string"); }
    +  advance_scalar("string");
    +  return raw_json_string(json+1);
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_uint64() noexcept {
    +  auto result = numberparsing::parse_unsigned(peek_non_root_scalar("uint64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("uint64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_uint64_in_string() noexcept {
    +  auto result = numberparsing::parse_unsigned_in_string(peek_non_root_scalar("uint64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("uint64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_int64() noexcept {
    +  auto result = numberparsing::parse_integer(peek_non_root_scalar("int64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("int64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_int64_in_string() noexcept {
    +  auto result = numberparsing::parse_integer_in_string(peek_non_root_scalar("int64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("int64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_double() noexcept {
    +  auto result = numberparsing::parse_double(peek_non_root_scalar("double"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("double"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_double_in_string() noexcept {
    +  auto result = numberparsing::parse_double_in_string(peek_non_root_scalar("double"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("double"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_bool() noexcept {
    +  auto result = parse_bool(peek_non_root_scalar("bool"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("bool"); }
    +  return result;
    +}
    +simdjson_inline simdjson_result value_iterator::is_null() noexcept {
    +  bool is_null_value;
    +  SIMDJSON_TRY(parse_null(peek_non_root_scalar("null")).get(is_null_value));
    +  if(is_null_value) { advance_non_root_scalar("null"); }
    +  return is_null_value;
    +}
    +simdjson_inline bool value_iterator::is_negative() noexcept {
    +  return numberparsing::is_negative(peek_non_root_scalar("numbersign"));
    +}
    +simdjson_inline bool value_iterator::is_root_negative() noexcept {
    +  return numberparsing::is_negative(peek_root_scalar("numbersign"));
    +}
    +simdjson_inline simdjson_result value_iterator::is_integer() noexcept {
    +  return numberparsing::is_integer(peek_non_root_scalar("integer"));
    +}
    +simdjson_inline simdjson_result value_iterator::get_number_type() noexcept {
    +  return numberparsing::get_number_type(peek_non_root_scalar("integer"));
    +}
    +simdjson_inline simdjson_result value_iterator::get_number() noexcept {
    +  number num;
    +  error_code error =  numberparsing::parse_number(peek_non_root_scalar("number"), num);
    +  if(error) { return error; }
    +  return num;
    +}
    +
    +simdjson_inline simdjson_result value_iterator::is_root_integer(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("is_root_integer");
    +  uint8_t tmpbuf[20+1+1]{}; // <20 digits> is the longest possible unsigned integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    return false; // if there are more than 20 characters, it cannot be represented as an integer.
    +  }
    +  auto answer = numberparsing::is_integer(tmpbuf);
    +  // If the parsing was a success, we must still check that it is
    +  // a single scalar. Note that we parse first because of cases like '[]' where
    +  // getting TRAILING_CONTENT is wrong.
    +  if(check_trailing && (answer.error() == SUCCESS) && (!_json_iter->is_single_token())) { return TRAILING_CONTENT; }
    +  return answer;
    +}
    +
    +simdjson_inline simdjson_result value_iterator::get_root_number_type(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("number");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1];
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto answer = numberparsing::get_number_type(tmpbuf);
    +  if (check_trailing && (answer.error() == SUCCESS)  && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +  return answer;
    +}
    +simdjson_inline simdjson_result value_iterator::get_root_number(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("number");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1];
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  number num;
    +  error_code error =  numberparsing::parse_number(tmpbuf, num);
    +  if(error) { return error; }
    +  if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +  advance_root_scalar("number");
    +  return num;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_string(bool check_trailing, bool allow_replacement) noexcept {
    +  return get_root_raw_json_string(check_trailing).unescape(json_iter(), allow_replacement);
    +}
    +template 
    +simdjson_warn_unused simdjson_inline error_code value_iterator::get_root_string(string_type& receiver, bool check_trailing, bool allow_replacement) noexcept {
    +  std::string_view content;
    +  auto err = get_root_string(check_trailing, allow_replacement).get(content);
    +  if (err) { return err; }
    +  receiver = content;
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_wobbly_string(bool check_trailing) noexcept {
    +  return get_root_raw_json_string(check_trailing).unescape_wobbly(json_iter());
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_raw_json_string(bool check_trailing) noexcept {
    +  auto json = peek_scalar("string");
    +  if (*json != '"') { return incorrect_type_error("Not a string"); }
    +  if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +  advance_scalar("string");
    +  return raw_json_string(json+1);
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_uint64(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("uint64");
    +  uint8_t tmpbuf[20+1+1]{}; // <20 digits> is the longest possible unsigned integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_unsigned(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("uint64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_uint64_in_string(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("uint64");
    +  uint8_t tmpbuf[20+1+1]{}; // <20 digits> is the longest possible unsigned integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_unsigned_in_string(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("uint64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_int64(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("int64");
    +  uint8_t tmpbuf[20+1+1]; // -<19 digits> is the longest possible integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +
    +  auto result = numberparsing::parse_integer(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("int64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_int64_in_string(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("int64");
    +  uint8_t tmpbuf[20+1+1]; // -<19 digits> is the longest possible integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +
    +  auto result = numberparsing::parse_integer_in_string(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("int64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_double(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("double");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination.
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_double(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("double");
    +  }
    +  return result;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_double_in_string(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("double");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination.
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_double_in_string(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("double");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_bool(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("bool");
    +  uint8_t tmpbuf[5+1+1]; // +1 for null termination
    +  tmpbuf[5+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 5+1)) { return incorrect_type_error("Not a boolean"); }
    +  auto result = parse_bool(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("bool");
    +  }
    +  return result;
    +}
    +simdjson_inline simdjson_result value_iterator::is_root_null(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("null");
    +  bool result = (max_len >= 4 && !atomparsing::str4ncmp(json, "null") &&
    +         (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4])));
    +  if(result) { // we have something that looks like a null.
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("null");
    +  }
    +  return result;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::skip_child() noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth >= _depth );
    +
    +  return _json_iter->skip_child(depth());
    +}
    +
    +simdjson_inline value_iterator value_iterator::child() const noexcept {
    +  assert_at_child();
    +  return { _json_iter, depth()+1, _json_iter->token.position() };
    +}
    +
    +// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller
    +// relating depth and iterator depth, which is a desired effect. It does not happen if is_open is
    +// marked non-inline.
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_inline bool value_iterator::is_open() const noexcept {
    +  return _json_iter->depth() >= depth();
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_inline bool value_iterator::at_end() const noexcept {
    +  return _json_iter->at_end();
    +}
    +
    +simdjson_inline bool value_iterator::at_start() const noexcept {
    +  return _json_iter->token.position() == start_position();
    +}
    +
    +simdjson_inline bool value_iterator::at_first_field() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  return _json_iter->token.position() == start_position() + 1;
    +}
    +
    +simdjson_inline void value_iterator::abandon() noexcept {
    +  _json_iter->abandon();
    +}
    +
    +simdjson_warn_unused simdjson_inline depth_t value_iterator::depth() const noexcept {
    +  return _depth;
    +}
    +simdjson_warn_unused simdjson_inline error_code value_iterator::error() const noexcept {
    +  return _json_iter->error;
    +}
    +simdjson_warn_unused simdjson_inline uint8_t *&value_iterator::string_buf_loc() noexcept {
    +  return _json_iter->string_buf_loc();
    +}
    +simdjson_warn_unused simdjson_inline const json_iterator &value_iterator::json_iter() const noexcept {
    +  return *_json_iter;
    +}
    +simdjson_warn_unused simdjson_inline json_iterator &value_iterator::json_iter() noexcept {
    +  return *_json_iter;
    +}
    +
    +simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept {
    +  return _json_iter->peek(start_position());
    +}
    +simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept {
    +  return _json_iter->peek_length(start_position());
    +}
    +
    +simdjson_inline const uint8_t *value_iterator::peek_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  // If we're not at the position anymore, we don't want to advance the cursor.
    +  if (!is_at_start()) { return peek_start(); }
    +
    +  // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value.
    +  assert_at_start();
    +  return _json_iter->peek();
    +}
    +
    +simdjson_inline void value_iterator::advance_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  // If we're not at the position anymore, we don't want to advance the cursor.
    +  if (!is_at_start()) { return; }
    +
    +  // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value.
    +  assert_at_start();
    +  _json_iter->return_current_and_advance();
    +  _json_iter->ascend_to(depth()-1);
    +}
    +
    +simdjson_inline error_code value_iterator::start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept {
    +  logger::log_start_value(*_json_iter, start_position(), depth(), type);
    +  // If we're not at the position anymore, we don't want to advance the cursor.
    +  const uint8_t *json;
    +  if (!is_at_start()) {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    if (!is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +    json = peek_start();
    +    if (*json != start_char) { return incorrect_type_error(incorrect_type_message); }
    +  } else {
    +    assert_at_start();
    +    /**
    +     * We should be prudent. Let us peek. If it is not the right type, we
    +     * return an error. Only once we have determined that we have the right
    +     * type are we allowed to advance!
    +     */
    +    json = _json_iter->peek();
    +    if (*json != start_char) { return incorrect_type_error(incorrect_type_message); }
    +    _json_iter->return_current_and_advance();
    +  }
    +
    +
    +  return SUCCESS;
    +}
    +
    +
    +simdjson_inline const uint8_t *value_iterator::peek_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return peek_start(); }
    +
    +  assert_at_root();
    +  return _json_iter->peek();
    +}
    +simdjson_inline const uint8_t *value_iterator::peek_non_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return peek_start(); }
    +
    +  assert_at_non_root_start();
    +  return _json_iter->peek();
    +}
    +
    +simdjson_inline void value_iterator::advance_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return; }
    +
    +  assert_at_root();
    +  _json_iter->return_current_and_advance();
    +  _json_iter->ascend_to(depth()-1);
    +}
    +simdjson_inline void value_iterator::advance_non_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return; }
    +
    +  assert_at_non_root_start();
    +  _json_iter->return_current_and_advance();
    +  _json_iter->ascend_to(depth()-1);
    +}
    +
    +simdjson_inline error_code value_iterator::incorrect_type_error(const char *message) const noexcept {
    +  logger::log_error(*_json_iter, start_position(), depth(), message);
    +  return INCORRECT_TYPE;
    +}
    +
    +simdjson_inline bool value_iterator::is_at_start() const noexcept {
    +  return position() == start_position();
    +}
    +
    +simdjson_inline bool value_iterator::is_at_key() const noexcept {
    +  // Keys are at the same depth as the object.
    +  // Note here that we could be safer and check that we are within an object,
    +  // but we do not.
    +  return _depth == _json_iter->_depth && *_json_iter->peek() == '"';
    +}
    +
    +simdjson_inline bool value_iterator::is_at_iterator_start() const noexcept {
    +  // We can legitimately be either at the first value ([1]), or after the array if it's empty ([]).
    +  auto delta = position() - start_position();
    +  return delta == 1 || delta == 2;
    +}
    +
    +inline void value_iterator::assert_at_start() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position == _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +inline void value_iterator::assert_at_container_start() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position == _start_position + 1 );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +inline void value_iterator::assert_at_next() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +simdjson_inline void value_iterator::move_at_start() noexcept {
    +  _json_iter->_depth = _depth;
    +  _json_iter->token.set_position(_start_position);
    +}
    +
    +simdjson_inline void value_iterator::move_at_container_start() noexcept {
    +  _json_iter->_depth = _depth;
    +  _json_iter->token.set_position(_start_position + 1);
    +}
    +
    +simdjson_inline simdjson_result value_iterator::reset_array() noexcept {
    +  if(error()) { return error(); }
    +  move_at_container_start();
    +  return started_array();
    +}
    +
    +simdjson_inline simdjson_result value_iterator::reset_object() noexcept {
    +  if(error()) { return error(); }
    +  move_at_container_start();
    +  return started_object();
    +}
    +
    +inline void value_iterator::assert_at_child() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth + 1 );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +inline void value_iterator::assert_at_root() const noexcept {
    +  assert_at_start();
    +  SIMDJSON_ASSUME( _depth == 1 );
    +}
    +
    +inline void value_iterator::assert_at_non_root_start() const noexcept {
    +  assert_at_start();
    +  SIMDJSON_ASSUME( _depth > 1 );
    +}
    +
    +inline void value_iterator::assert_is_valid() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter != nullptr );
    +}
    +
    +simdjson_inline bool value_iterator::is_valid() const noexcept {
    +  return _json_iter != nullptr;
    +}
    +
    +simdjson_inline simdjson_result value_iterator::type() const noexcept {
    +  switch (*peek_start()) {
    +    case '{':
    +      return json_type::object;
    +    case '[':
    +      return json_type::array;
    +    case '"':
    +      return json_type::string;
    +    case 'n':
    +      return json_type::null;
    +    case 't': case 'f':
    +      return json_type::boolean;
    +    case '-':
    +    case '0': case '1': case '2': case '3': case '4':
    +    case '5': case '6': case '7': case '8': case '9':
    +      return json_type::number;
    +    default:
    +      return TAPE_ERROR;
    +  }
    +}
    +
    +simdjson_inline token_position value_iterator::start_position() const noexcept {
    +  return _start_position;
    +}
    +
    +simdjson_inline token_position value_iterator::position() const noexcept {
    +  return _json_iter->position();
    +}
    +
    +simdjson_inline token_position value_iterator::end_position() const noexcept {
    +  return _json_iter->end_position();
    +}
    +
    +simdjson_inline token_position value_iterator::last_position() const noexcept {
    +  return _json_iter->last_position();
    +}
    +
    +simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept {
    +  return _json_iter->report_error(error, message);
    +}
    +
    +} // namespace ondemand
    +} // namespace haswell
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::value_iterator &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/value_iterator-inl.h for haswell */
    +/* end file simdjson/generic/ondemand/amalgamated.h for haswell */
    +/* including simdjson/haswell/end.h: #include "simdjson/haswell/end.h" */
    +/* begin file simdjson/haswell/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/haswell/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_HASWELL
    +SIMDJSON_UNTARGET_REGION
    +#endif
    +
    +/* undefining SIMDJSON_IMPLEMENTATION from "haswell" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/haswell/end.h */
    +
    +#endif // SIMDJSON_HASWELL_ONDEMAND_H
    +/* end file simdjson/haswell/ondemand.h */
    +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(icelake)
    +/* including simdjson/icelake/ondemand.h: #include "simdjson/icelake/ondemand.h" */
    +/* begin file simdjson/icelake/ondemand.h */
    +#ifndef SIMDJSON_ICELAKE_ONDEMAND_H
    +#define SIMDJSON_ICELAKE_ONDEMAND_H
    +
    +/* including simdjson/icelake/begin.h: #include "simdjson/icelake/begin.h" */
    +/* begin file simdjson/icelake/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "icelake" */
    +#define SIMDJSON_IMPLEMENTATION icelake
    +/* including simdjson/icelake/base.h: #include "simdjson/icelake/base.h" */
    +/* begin file simdjson/icelake/base.h */
    +#ifndef SIMDJSON_ICELAKE_BASE_H
    +#define SIMDJSON_ICELAKE_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_ICELAKE
    +namespace simdjson {
    +/**
    + * Implementation for Icelake (Intel AVX512).
    + */
    +namespace icelake {
    +
    +class implementation;
    +
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ICELAKE_BASE_H
    +/* end file simdjson/icelake/base.h */
    +/* including simdjson/icelake/intrinsics.h: #include "simdjson/icelake/intrinsics.h" */
    +/* begin file simdjson/icelake/intrinsics.h */
    +#ifndef SIMDJSON_ICELAKE_INTRINSICS_H
    +#define SIMDJSON_ICELAKE_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if SIMDJSON_VISUAL_STUDIO
    +// under clang within visual studio, this will include 
    +#include   // visual studio or clang
    +#else
    +#include  // elsewhere
    +#endif // SIMDJSON_VISUAL_STUDIO
    +
    +#if SIMDJSON_CLANG_VISUAL_STUDIO
    +/**
    + * You are not supposed, normally, to include these
    + * headers directly. Instead you should either include intrin.h
    + * or x86intrin.h. However, when compiling with clang
    + * under Windows (i.e., when _MSC_VER is set), these headers
    + * only get included *if* the corresponding features are detected
    + * from macros:
    + * e.g., if __AVX2__ is set... in turn,  we normally set these
    + * macros by compiling against the corresponding architecture
    + * (e.g., arch:AVX2, -mavx2, etc.) which compiles the whole
    + * software with these advanced instructions. In simdjson, we
    + * want to compile the whole program for a generic target,
    + * and only target our specific kernels. As a workaround,
    + * we directly include the needed headers. These headers would
    + * normally guard against such usage, but we carefully included
    + *   (or ) before, so the headers
    + * are fooled.
    + */
    +#include    // for _blsr_u64
    +#include  // for  __lzcnt64
    +#include    // for most things (AVX2, AVX512, _popcnt64)
    +#include 
    +#include 
    +#include 
    +#include 
    +#include    // for  _mm_clmulepi64_si128
    +// Important: we need the AVX-512 headers:
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +// unfortunately, we may not get _blsr_u64, but, thankfully, clang
    +// has it as a macro.
    +#ifndef _blsr_u64
    +// we roll our own
    +#define _blsr_u64(n) ((n - 1) & n)
    +#endif //  _blsr_u64
    +#endif // SIMDJSON_CLANG_VISUAL_STUDIO
    +
    +static_assert(sizeof(__m512i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for icelake");
    +
    +#endif // SIMDJSON_ICELAKE_INTRINSICS_H
    +/* end file simdjson/icelake/intrinsics.h */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_ICELAKE
    +SIMDJSON_TARGET_REGION("avx512f,avx512dq,avx512cd,avx512bw,avx512vbmi,avx512vbmi2,avx512vl,avx2,bmi,pclmul,lzcnt,popcnt")
    +#endif
    +
    +/* including simdjson/icelake/bitmanipulation.h: #include "simdjson/icelake/bitmanipulation.h" */
    +/* begin file simdjson/icelake/bitmanipulation.h */
    +#ifndef SIMDJSON_ICELAKE_BITMANIPULATION_H
    +#define SIMDJSON_ICELAKE_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return (int)_tzcnt_u64(input_num);
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  ////////
    +  // You might expect the next line to be equivalent to
    +  // return (int)_tzcnt_u64(input_num);
    +  // but the generated code differs and might be less efficient?
    +  ////////
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return _blsr_u64(input_num);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +  return int(_lzcnt_u64(input_num));
    +}
    +
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +simdjson_inline unsigned __int64 count_ones(uint64_t input_num) {
    +  // note: we do not support legacy 32-bit Windows
    +  return __popcnt64(input_num);// Visual Studio wants two underscores
    +}
    +#else
    +simdjson_inline long long int count_ones(uint64_t input_num) {
    +  return _popcnt64(input_num);
    +}
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2,
    +                                uint64_t *result) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return _addcarry_u64(0, value1, value2,
    +                       reinterpret_cast(result));
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ICELAKE_BITMANIPULATION_H
    +/* end file simdjson/icelake/bitmanipulation.h */
    +/* including simdjson/icelake/bitmask.h: #include "simdjson/icelake/bitmask.h" */
    +/* begin file simdjson/icelake/bitmask.h */
    +#ifndef SIMDJSON_ICELAKE_BITMASK_H
    +#define SIMDJSON_ICELAKE_BITMASK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +
    +//
    +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered.
    +//
    +// For example, prefix_xor(00100100) == 00011100
    +//
    +simdjson_inline uint64_t prefix_xor(const uint64_t bitmask) {
    +  // There should be no such thing with a processor supporting avx2
    +  // but not clmul.
    +  __m128i all_ones = _mm_set1_epi8('\xFF');
    +  __m128i result = _mm_clmulepi64_si128(_mm_set_epi64x(0ULL, bitmask), all_ones, 0);
    +  return _mm_cvtsi128_si64(result);
    +}
    +
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ICELAKE_BITMASK_H
    +/* end file simdjson/icelake/bitmask.h */
    +/* including simdjson/icelake/simd.h: #include "simdjson/icelake/simd.h" */
    +/* begin file simdjson/icelake/simd.h */
    +#ifndef SIMDJSON_ICELAKE_SIMD_H
    +#define SIMDJSON_ICELAKE_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if defined(__GNUC__) && !defined(__clang__)
    +#if __GNUC__ == 8
    +#define SIMDJSON_GCC8 1
    +#endif //  __GNUC__ == 8
    +#endif // defined(__GNUC__) && !defined(__clang__)
    +
    +#if SIMDJSON_GCC8
    +/**
    + * GCC 8 fails to provide _mm512_set_epi8. We roll our own.
    + */
    +inline __m512i _mm512_set_epi8(uint8_t a0, uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4, uint8_t a5, uint8_t a6, uint8_t a7, uint8_t a8, uint8_t a9, uint8_t a10, uint8_t a11, uint8_t a12, uint8_t a13, uint8_t a14, uint8_t a15, uint8_t a16, uint8_t a17, uint8_t a18, uint8_t a19, uint8_t a20, uint8_t a21, uint8_t a22, uint8_t a23, uint8_t a24, uint8_t a25, uint8_t a26, uint8_t a27, uint8_t a28, uint8_t a29, uint8_t a30, uint8_t a31, uint8_t a32, uint8_t a33, uint8_t a34, uint8_t a35, uint8_t a36, uint8_t a37, uint8_t a38, uint8_t a39, uint8_t a40, uint8_t a41, uint8_t a42, uint8_t a43, uint8_t a44, uint8_t a45, uint8_t a46, uint8_t a47, uint8_t a48, uint8_t a49, uint8_t a50, uint8_t a51, uint8_t a52, uint8_t a53, uint8_t a54, uint8_t a55, uint8_t a56, uint8_t a57, uint8_t a58, uint8_t a59, uint8_t a60, uint8_t a61, uint8_t a62, uint8_t a63) {
    +  return _mm512_set_epi64(uint64_t(a7) + (uint64_t(a6) << 8) + (uint64_t(a5) << 16) + (uint64_t(a4) << 24) + (uint64_t(a3) << 32) + (uint64_t(a2) << 40) + (uint64_t(a1) << 48) + (uint64_t(a0) << 56),
    +                          uint64_t(a15) + (uint64_t(a14) << 8) + (uint64_t(a13) << 16) + (uint64_t(a12) << 24) + (uint64_t(a11) << 32) + (uint64_t(a10) << 40) + (uint64_t(a9) << 48) + (uint64_t(a8) << 56),
    +                          uint64_t(a23) + (uint64_t(a22) << 8) + (uint64_t(a21) << 16) + (uint64_t(a20) << 24) + (uint64_t(a19) << 32) + (uint64_t(a18) << 40) + (uint64_t(a17) << 48) + (uint64_t(a16) << 56),
    +                          uint64_t(a31) + (uint64_t(a30) << 8) + (uint64_t(a29) << 16) + (uint64_t(a28) << 24) + (uint64_t(a27) << 32) + (uint64_t(a26) << 40) + (uint64_t(a25) << 48) + (uint64_t(a24) << 56),
    +                          uint64_t(a39) + (uint64_t(a38) << 8) + (uint64_t(a37) << 16) + (uint64_t(a36) << 24) + (uint64_t(a35) << 32) + (uint64_t(a34) << 40) + (uint64_t(a33) << 48) + (uint64_t(a32) << 56),
    +                          uint64_t(a47) + (uint64_t(a46) << 8) + (uint64_t(a45) << 16) + (uint64_t(a44) << 24) + (uint64_t(a43) << 32) + (uint64_t(a42) << 40) + (uint64_t(a41) << 48) + (uint64_t(a40) << 56),
    +                          uint64_t(a55) + (uint64_t(a54) << 8) + (uint64_t(a53) << 16) + (uint64_t(a52) << 24) + (uint64_t(a51) << 32) + (uint64_t(a50) << 40) + (uint64_t(a49) << 48) + (uint64_t(a48) << 56),
    +                          uint64_t(a63) + (uint64_t(a62) << 8) + (uint64_t(a61) << 16) + (uint64_t(a60) << 24) + (uint64_t(a59) << 32) + (uint64_t(a58) << 40) + (uint64_t(a57) << 48) + (uint64_t(a56) << 56));
    +}
    +#endif // SIMDJSON_GCC8
    +
    +
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +namespace simd {
    +
    +  // Forward-declared so they can be used by splat and friends.
    +  template
    +  struct base {
    +    __m512i value;
    +
    +    // Zero constructor
    +    simdjson_inline base() : value{__m512i()} {}
    +
    +    // Conversion from SIMD register
    +    simdjson_inline base(const __m512i _value) : value(_value) {}
    +
    +    // Conversion to SIMD register
    +    simdjson_inline operator const __m512i&() const { return this->value; }
    +    simdjson_inline operator __m512i&() { return this->value; }
    +
    +    // Bit operations
    +    simdjson_inline Child operator|(const Child other) const { return _mm512_or_si512(*this, other); }
    +    simdjson_inline Child operator&(const Child other) const { return _mm512_and_si512(*this, other); }
    +    simdjson_inline Child operator^(const Child other) const { return _mm512_xor_si512(*this, other); }
    +    simdjson_inline Child bit_andnot(const Child other) const { return _mm512_andnot_si512(other, *this); }
    +    simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast | other; return *this_cast; }
    +    simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast & other; return *this_cast; }
    +    simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast ^ other; return *this_cast; }
    +  };
    +
    +  // Forward-declared so they can be used by splat and friends.
    +  template
    +  struct simd8;
    +
    +  template>
    +  struct base8: base> {
    +    typedef uint32_t bitmask_t;
    +    typedef uint64_t bitmask2_t;
    +
    +    simdjson_inline base8() : base>() {}
    +    simdjson_inline base8(const __m512i _value) : base>(_value) {}
    +
    +    friend simdjson_really_inline uint64_t operator==(const simd8 lhs, const simd8 rhs) {
    +      return _mm512_cmpeq_epi8_mask(lhs, rhs);
    +    }
    +
    +    static const int SIZE = sizeof(base::value);
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +     // workaround for compilers unable to figure out that 16 - N is a constant (GCC 8)
    +      constexpr int shift = 16 - N;
    +      return _mm512_alignr_epi8(*this, _mm512_permutex2var_epi64(prev_chunk, _mm512_set_epi64(13, 12, 11, 10, 9, 8, 7, 6), *this), shift);
    +    }
    +  };
    +
    +  // SIMD byte mask type (returned by things like eq and gt)
    +  template<>
    +  struct simd8: base8 {
    +    static simdjson_inline simd8 splat(bool _value) { return _mm512_set1_epi8(uint8_t(-(!!_value))); }
    +
    +    simdjson_inline simd8() : base8() {}
    +    simdjson_inline simd8(const __m512i _value) : base8(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(bool _value) : base8(splat(_value)) {}
    +    simdjson_inline bool any() const { return !!_mm512_test_epi8_mask (*this, *this); }
    +    simdjson_inline simd8 operator~() const { return *this ^ true; }
    +  };
    +
    +  template
    +  struct base8_numeric: base8 {
    +    static simdjson_inline simd8 splat(T _value) { return _mm512_set1_epi8(_value); }
    +    static simdjson_inline simd8 zero() { return _mm512_setzero_si512(); }
    +    static simdjson_inline simd8 load(const T values[64]) {
    +      return _mm512_loadu_si512(reinterpret_cast(values));
    +    }
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    static simdjson_inline simd8 repeat_16(
    +      T v0,  T v1,  T v2,  T v3,  T v4,  T v5,  T v6,  T v7,
    +      T v8,  T v9,  T v10, T v11, T v12, T v13, T v14, T v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    simdjson_inline base8_numeric() : base8() {}
    +    simdjson_inline base8_numeric(const __m512i _value) : base8(_value) {}
    +
    +    // Store to array
    +    simdjson_inline void store(T dst[64]) const { return _mm512_storeu_si512(reinterpret_cast<__m512i *>(dst), *this); }
    +
    +    // Addition/subtraction are the same for signed and unsigned
    +    simdjson_inline simd8 operator+(const simd8 other) const { return _mm512_add_epi8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return _mm512_sub_epi8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *static_cast*>(this); }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *static_cast*>(this); }
    +
    +    // Override to distinguish from bool version
    +    simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +
    +    // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values)
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return _mm512_shuffle_epi8(lookup_table, *this);
    +    }
    +
    +    // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset).
    +    // Passing a 0 value for mask would be equivalent to writing out every byte to output.
    +    // Only the first 32 - count_ones(mask) bytes of the result are significant but 32 bytes
    +    // get written.
    +    // Design consideration: it seems like a function with the
    +    // signature simd8 compress(uint32_t mask) would be
    +    // sensible, but the AVX ISA makes this kind of approach difficult.
    +    template
    +    simdjson_inline void compress(uint64_t mask, L * output) const {
    +      _mm512_mask_compressstoreu_epi8 (output,~mask,*this);
    +    }
    +
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +  };
    +
    +  // Signed bytes
    +  template<>
    +  struct simd8 : base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m512i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const int8_t values[64]) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15,
    +      int8_t v16, int8_t v17, int8_t v18, int8_t v19, int8_t v20, int8_t v21, int8_t v22, int8_t v23,
    +      int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, int8_t v30, int8_t v31,
    +      int8_t v32, int8_t v33, int8_t v34, int8_t v35, int8_t v36, int8_t v37, int8_t v38, int8_t v39,
    +      int8_t v40, int8_t v41, int8_t v42, int8_t v43, int8_t v44, int8_t v45, int8_t v46, int8_t v47,
    +      int8_t v48, int8_t v49, int8_t v50, int8_t v51, int8_t v52, int8_t v53, int8_t v54, int8_t v55,
    +      int8_t v56, int8_t v57, int8_t v58, int8_t v59, int8_t v60, int8_t v61, int8_t v62, int8_t v63
    +    ) : simd8(_mm512_set_epi8(
    +      v63, v62, v61, v60, v59, v58, v57, v56,
    +      v55, v54, v53, v52, v51, v50, v49, v48,
    +      v47, v46, v45, v44, v43, v42, v41, v40,
    +      v39, v38, v37, v36, v35, v34, v33, v32,
    +      v31, v30, v29, v28, v27, v26, v25, v24,
    +      v23, v22, v21, v20, v19, v18, v17, v16,
    +      v15, v14, v13, v12, v11, v10,  v9,  v8,
    +       v7,  v6,  v5,  v4,  v3,  v2,  v1,  v0
    +    )) {}
    +
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Order-sensitive comparisons
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm512_max_epi8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm512_min_epi8(*this, other); }
    +
    +    simdjson_inline simd8 operator>(const simd8 other) const { return _mm512_maskz_abs_epi8(_mm512_cmpgt_epi8_mask(*this, other),_mm512_set1_epi8(uint8_t(0x80))); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return _mm512_maskz_abs_epi8(_mm512_cmpgt_epi8_mask(other, *this),_mm512_set1_epi8(uint8_t(0x80))); }
    +  };
    +
    +  // Unsigned bytes
    +  template<>
    +  struct simd8: base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m512i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const uint8_t values[64]) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15,
    +      uint8_t v16, uint8_t v17, uint8_t v18, uint8_t v19, uint8_t v20, uint8_t v21, uint8_t v22, uint8_t v23,
    +      uint8_t v24, uint8_t v25, uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, uint8_t v31,
    +      uint8_t v32, uint8_t v33, uint8_t v34, uint8_t v35, uint8_t v36, uint8_t v37, uint8_t v38, uint8_t v39,
    +      uint8_t v40, uint8_t v41, uint8_t v42, uint8_t v43, uint8_t v44, uint8_t v45, uint8_t v46, uint8_t v47,
    +      uint8_t v48, uint8_t v49, uint8_t v50, uint8_t v51, uint8_t v52, uint8_t v53, uint8_t v54, uint8_t v55,
    +      uint8_t v56, uint8_t v57, uint8_t v58, uint8_t v59, uint8_t v60, uint8_t v61, uint8_t v62, uint8_t v63
    +    ) : simd8(_mm512_set_epi8(
    +      v63, v62, v61, v60, v59, v58, v57, v56,
    +      v55, v54, v53, v52, v51, v50, v49, v48,
    +      v47, v46, v45, v44, v43, v42, v41, v40,
    +      v39, v38, v37, v36, v35, v34, v33, v32,
    +      v31, v30, v29, v28, v27, v26, v25, v24,
    +      v23, v22, v21, v20, v19, v18, v17, v16,
    +      v15, v14, v13, v12, v11, v10,  v9,  v8,
    +       v7,  v6,  v5,  v4,  v3,  v2,  v1,  v0
    +    )) {}
    +
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15,
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Saturated math
    +    simdjson_inline simd8 saturating_add(const simd8 other) const { return _mm512_adds_epu8(*this, other); }
    +    simdjson_inline simd8 saturating_sub(const simd8 other) const { return _mm512_subs_epu8(*this, other); }
    +
    +    // Order-specific operations
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm512_max_epu8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm512_min_epu8(other, *this); }
    +    // Same as >, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 gt_bits(const simd8 other) const { return this->saturating_sub(other); }
    +    // Same as <, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 lt_bits(const simd8 other) const { return other.saturating_sub(*this); }
    +    simdjson_inline uint64_t operator<=(const simd8 other) const { return other.max_val(*this) == other; }
    +    simdjson_inline uint64_t operator>=(const simd8 other) const { return other.min_val(*this) == other; }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return this->lt_bits(other).any_bits_set(); }
    +
    +    // Bit-specific operations
    +    simdjson_inline simd8 bits_not_set() const { return _mm512_mask_blend_epi8(*this == uint8_t(0), _mm512_set1_epi8(0), _mm512_set1_epi8(-1)); }
    +    simdjson_inline simd8 bits_not_set(simd8 bits) const { return (*this & bits).bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set() const { return ~this->bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set(simd8 bits) const { return ~this->bits_not_set(bits); }
    +
    +    simdjson_inline bool is_ascii() const { return _mm512_movepi8_mask(*this) == 0; }
    +    simdjson_inline bool bits_not_set_anywhere() const {
    +      return !_mm512_test_epi8_mask(*this, *this);
    +    }
    +    simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); }
    +    simdjson_inline bool bits_not_set_anywhere(simd8 bits) const { return !_mm512_test_epi8_mask(*this, bits); }
    +    simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return !bits_not_set_anywhere(bits); }
    +    template
    +    simdjson_inline simd8 shr() const { return simd8(_mm512_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); }
    +    template
    +    simdjson_inline simd8 shl() const { return simd8(_mm512_slli_epi16(*this, N)) & uint8_t(0xFFu << N); }
    +    // Get one of the bits and make a bitmask out of it.
    +    // e.g. value.get_bit<7>() gets the high bit
    +    template
    +    simdjson_inline uint64_t get_bit() const { return _mm512_movepi8_mask(_mm512_slli_epi16(*this, 7-N)); }
    +  };
    +
    +  template
    +  struct simd8x64 {
    +    static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +    static_assert(NUM_CHUNKS == 1, "Icelake kernel should use one register per 64-byte block.");
    +    const simd8 chunks[NUM_CHUNKS];
    +
    +    simd8x64(const simd8x64& o) = delete; // no copy allowed
    +    simd8x64& operator=(const simd8& other) = delete; // no assignment allowed
    +    simd8x64() = delete; // no default constructor allowed
    +
    +    simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1) : chunks{chunk0, chunk1} {}
    +    simdjson_inline simd8x64(const simd8 chunk0) : chunks{chunk0} {}
    +    simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8::load(ptr)} {}
    +
    +    simdjson_inline uint64_t compress(uint64_t mask, T * output) const {
    +      this->chunks[0].compress(mask, output);
    +      return 64 - count_ones(mask);
    +    }
    +
    +    simdjson_inline void store(T ptr[64]) const {
    +      this->chunks[0].store(ptr+sizeof(simd8)*0);
    +    }
    +
    +    simdjson_inline simd8 reduce_or() const {
    +      return this->chunks[0];
    +    }
    +
    +    simdjson_inline simd8x64 bit_or(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return simd8x64(
    +        this->chunks[0] | mask
    +      );
    +    }
    +
    +    simdjson_inline uint64_t eq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return this->chunks[0] == mask;
    +    }
    +
    +    simdjson_inline uint64_t eq(const simd8x64 &other) const {
    +      return this->chunks[0] == other.chunks[0];
    +    }
    +
    +    simdjson_inline uint64_t lteq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return this->chunks[0] <= mask;
    +    }
    +  }; // struct simd8x64
    +
    +} // namespace simd
    +
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ICELAKE_SIMD_H
    +/* end file simdjson/icelake/simd.h */
    +/* including simdjson/icelake/stringparsing_defs.h: #include "simdjson/icelake/stringparsing_defs.h" */
    +/* begin file simdjson/icelake/stringparsing_defs.h */
    +#ifndef SIMDJSON_ICELAKE_STRINGPARSING_DEFS_H
    +#define SIMDJSON_ICELAKE_STRINGPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/simd.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace {
    +
    +using namespace simd;
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 64;
    +  simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; }
    +  simdjson_inline bool has_backslash() { return ((quote_bits - 1) & bs_bits) != 0; }
    +  simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); }
    +  simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); }
    +
    +  uint64_t bs_bits;
    +  uint64_t quote_bits;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // this can read up to 15 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes");
    +  simd8 v(src);
    +  // store to dest unconditionally - we can overwrite the bits we don't like later
    +  v.store(dst);
    +  return {
    +      static_cast(v == '\\'), // bs_bits
    +      static_cast(v == '"'), // quote_bits
    +  };
    +}
    +
    +} // unnamed namespace
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ICELAKE_STRINGPARSING_DEFS_H
    +/* end file simdjson/icelake/stringparsing_defs.h */
    +/* including simdjson/icelake/numberparsing_defs.h: #include "simdjson/icelake/numberparsing_defs.h" */
    +/* begin file simdjson/icelake/numberparsing_defs.h */
    +#ifndef SIMDJSON_ICELAKE_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_ICELAKE_NUMBERPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace numberparsing {
    +
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  // this actually computes *16* values so we are being wasteful.
    +  const __m128i ascii0 = _mm_set1_epi8('0');
    +  const __m128i mul_1_10 =
    +      _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1);
    +  const __m128i mul_1_100 = _mm_setr_epi16(100, 1, 100, 1, 100, 1, 100, 1);
    +  const __m128i mul_1_10000 =
    +      _mm_setr_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1);
    +  const __m128i input = _mm_sub_epi8(
    +      _mm_loadu_si128(reinterpret_cast(chars)), ascii0);
    +  const __m128i t1 = _mm_maddubs_epi16(input, mul_1_10);
    +  const __m128i t2 = _mm_madd_epi16(t1, mul_1_100);
    +  const __m128i t3 = _mm_packus_epi32(t2, t2);
    +  const __m128i t4 = _mm_madd_epi16(t3, mul_1_10000);
    +  return _mm_cvtsi128_si32(
    +      t4); // only captures the sum of the first 8 digits, drop the rest
    +}
    +
    +/** @private */
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif // SIMDJSON_ICELAKE_NUMBERPARSING_DEFS_H
    +/* end file simdjson/icelake/numberparsing_defs.h */
    +/* end file simdjson/icelake/begin.h */
    +/* including simdjson/generic/ondemand/amalgamated.h for icelake: #include "simdjson/generic/ondemand/amalgamated.h" */
    +/* begin file simdjson/generic/ondemand/amalgamated.h for icelake */
    +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_ONDEMAND_DEPENDENCIES_H)
    +#error simdjson/generic/ondemand/dependencies.h must be included before simdjson/generic/ondemand/amalgamated.h!
    +#endif
    +
    +// Stuff other things depend on
    +/* including simdjson/generic/ondemand/base.h for icelake: #include "simdjson/generic/ondemand/base.h" */
    +/* begin file simdjson/generic/ondemand/base.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +/**
    + * A fast, simple, DOM-like interface that parses JSON as you use it.
    + *
    + * Designed for maximum speed and a lower memory profile.
    + */
    +namespace ondemand {
    +
    +/** Represents the depth of a JSON value (number of nested arrays/objects). */
    +using depth_t = int32_t;
    +
    +/** @copydoc simdjson::icelake::number_type */
    +using number_type = simdjson::icelake::number_type;
    +
    +/** @private Position in the JSON buffer indexes */
    +using token_position = const uint32_t *;
    +
    +class array;
    +class array_iterator;
    +class document;
    +class document_reference;
    +class document_stream;
    +class field;
    +class json_iterator;
    +enum class json_type;
    +struct number;
    +class object;
    +class object_iterator;
    +class parser;
    +class raw_json_string;
    +class token_iterator;
    +class value;
    +class value_iterator;
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_BASE_H
    +/* end file simdjson/generic/ondemand/base.h for icelake */
    +/* including simdjson/generic/ondemand/value_iterator.h for icelake: #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* begin file simdjson/generic/ondemand/value_iterator.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +/**
    + * Iterates through a single JSON value at a particular depth.
    + *
    + * Does not keep track of the type of value: provides methods for objects, arrays and scalars and expects
    + * the caller to call the right ones.
    + *
    + * @private This is not intended for external use.
    + */
    +class value_iterator {
    +protected:
    +  /** The underlying JSON iterator */
    +  json_iterator *_json_iter{};
    +  /** The depth of this value */
    +  depth_t _depth{};
    +  /**
    +   * The starting token index for this value
    +   */
    +  token_position _start_position{};
    +
    +public:
    +  simdjson_inline value_iterator() noexcept = default;
    +
    +  /**
    +   * Denote that we're starting a document.
    +   */
    +  simdjson_inline void start_document() noexcept;
    +
    +  /**
    +   * Skips a non-iterated or partially-iterated JSON value, whether it is a scalar, array or object.
    +   *
    +   * Optimized for scalars.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code skip_child() noexcept;
    +
    +  /**
    +   * Tell whether the iterator is at the EOF mark
    +   */
    +  simdjson_inline bool at_end() const noexcept;
    +
    +  /**
    +   * Tell whether the iterator is at the start of the value
    +   */
    +  simdjson_inline bool at_start() const noexcept;
    +
    +  /**
    +   * Tell whether the value is open--if the value has not been used, or the array/object is still open.
    +   */
    +  simdjson_inline bool is_open() const noexcept;
    +
    +  /**
    +   * Tell whether the value is at an object's first field (just after the {).
    +   */
    +  simdjson_inline bool at_first_field() const noexcept;
    +
    +  /**
    +   * Abandon all iteration.
    +   */
    +  simdjson_inline void abandon() noexcept;
    +
    +  /**
    +   * Get the child value as a value_iterator.
    +   */
    +  simdjson_inline value_iterator child_value() const noexcept;
    +
    +  /**
    +   * Get the depth of this value.
    +   */
    +  simdjson_inline int32_t depth() const noexcept;
    +
    +  /**
    +   * Get the JSON type of this value.
    +   *
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result type() const noexcept;
    +
    +  /**
    +   * @addtogroup object Object iteration
    +   *
    +   * Methods to iterate and find object fields. These methods generally *assume* the value is
    +   * actually an object; the caller is responsible for keeping track of that fact.
    +   *
    +   * @{
    +   */
    +
    +  /**
    +   * Start an object iteration.
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCORRECT_TYPE if there is no opening {
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_object() noexcept;
    +  /**
    +   * Start an object iteration from the root.
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCORRECT_TYPE if there is no opening {
    +   * @error TAPE_ERROR if there is no matching } at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_root_object() noexcept;
    +  /**
    +   * Checks whether an object could be started from the root. May be called by start_root_object.
    +   *
    +   * @returns SUCCESS if it is possible to safely start an object from the root (document level).
    +   * @error INCORRECT_TYPE if there is no opening {
    +   * @error TAPE_ERROR if there is no matching } at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline error_code check_root_object() noexcept;
    +  /**
    +   * Start an object iteration after the user has already checked and moved past the {.
    +   *
    +   * Does not move the iterator unless the object is empty ({}).
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_object() noexcept;
    +  /**
    +   * Start an object iteration from the root, after the user has already checked and moved past the {.
    +   *
    +   * Does not move the iterator unless the object is empty ({}).
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_root_object() noexcept;
    +
    +  /**
    +   * Moves to the next field in an object.
    +   *
    +   * Looks for , and }. If } is found, the object is finished and the iterator advances past it.
    +   * Otherwise, it advances to the next value.
    +   *
    +   * @return whether there is another field in the object.
    +   * @error TAPE_ERROR If there is a comma missing between fields.
    +   * @error TAPE_ERROR If there is a comma, but not enough tokens remaining to have a key, :, and value.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result has_next_field() noexcept;
    +
    +  /**
    +   * Get the current field's key.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result field_key() noexcept;
    +
    +  /**
    +   * Pass the : in the field and move to its value.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code field_value() noexcept;
    +
    +  /**
    +   * Find the next field with the given key.
    +   *
    +   * Assumes you have called next_field() or otherwise matched the previous value.
    +   *
    +   * This means the iterator must be sitting at the next key:
    +   *
    +   * ```
    +   * { "a": 1, "b": 2 }
    +   *           ^
    +   * ```
    +   *
    +   * Key is *raw JSON,* meaning it will be matched against the verbatim JSON without attempting to
    +   * unescape it. This works well for typical ASCII and UTF-8 keys (almost all of them), but may
    +   * fail to match some keys with escapes (\u, \n, etc.).
    +   */
    +  simdjson_warn_unused simdjson_inline error_code find_field(const std::string_view key) noexcept;
    +
    +  /**
    +   * Find the next field with the given key, *without* unescaping. This assumes object order: it
    +   * will not find the field if it was already passed when looking for some *other* field.
    +   *
    +   * Assumes you have called next_field() or otherwise matched the previous value.
    +   *
    +   * This means the iterator must be sitting at the next key:
    +   *
    +   * ```
    +   * { "a": 1, "b": 2 }
    +   *           ^
    +   * ```
    +   *
    +   * Key is *raw JSON,* meaning it will be matched against the verbatim JSON without attempting to
    +   * unescape it. This works well for typical ASCII and UTF-8 keys (almost all of them), but may
    +   * fail to match some keys with escapes (\u, \n, etc.).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result find_field_raw(const std::string_view key) noexcept;
    +
    +  /**
    +   * Find the field with the given key without regard to order, and *without* unescaping.
    +   *
    +   * This is an unordered object lookup: if the field is not found initially, it will cycle around and scan from the beginning.
    +   *
    +   * Assumes you have called next_field() or otherwise matched the previous value.
    +   *
    +   * This means the iterator must be sitting at the next key:
    +   *
    +   * ```
    +   * { "a": 1, "b": 2 }
    +   *           ^
    +   * ```
    +   *
    +   * Key is *raw JSON,* meaning it will be matched against the verbatim JSON without attempting to
    +   * unescape it. This works well for typical ASCII and UTF-8 keys (almost all of them), but may
    +   * fail to match some keys with escapes (\u, \n, etc.).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result find_field_unordered_raw(const std::string_view key) noexcept;
    +
    +  /** @} */
    +
    +  /**
    +   * @addtogroup array Array iteration
    +   * Methods to iterate over array elements. These methods generally *assume* the value is actually
    +   * an object; the caller is responsible for keeping track of that fact.
    +   * @{
    +   */
    +
    +  /**
    +   * Check for an opening [ and start an array iteration.
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCORRECT_TYPE If there is no [.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_array() noexcept;
    +  /**
    +   * Check for an opening [ and start an array iteration while at the root.
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCORRECT_TYPE If there is no [.
    +   * @error TAPE_ERROR if there is no matching ] at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_root_array() noexcept;
    +  /**
    +   * Checks whether an array could be started from the root. May be called by start_root_array.
    +   *
    +   * @returns SUCCESS if it is possible to safely start an array from the root (document level).
    +   * @error INCORRECT_TYPE If there is no [.
    +   * @error TAPE_ERROR if there is no matching ] at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline error_code check_root_array() noexcept;
    +  /**
    +   * Start an array iteration, after the user has already checked and moved past the [.
    +   *
    +   * Does not move the iterator unless the array is empty ([]).
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_array() noexcept;
    +  /**
    +   * Start an array iteration from the root, after the user has already checked and moved past the [.
    +   *
    +   * Does not move the iterator unless the array is empty ([]).
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_root_array() noexcept;
    +
    +  /**
    +   * Moves to the next element in an array.
    +   *
    +   * Looks for , and ]. If ] is found, the array is finished and the iterator advances past it.
    +   * Otherwise, it advances to the next value.
    +   *
    +   * @return Whether there is another element in the array.
    +   * @error TAPE_ERROR If there is a comma missing between elements.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result has_next_element() noexcept;
    +
    +  /**
    +   * Get a child value iterator.
    +   */
    +  simdjson_warn_unused simdjson_inline value_iterator child() const noexcept;
    +
    +  /** @} */
    +
    +  /**
    +   * @defgroup scalar Scalar values
    +   * @addtogroup scalar
    +   * @{
    +   */
    +
    +  simdjson_warn_unused simdjson_inline simdjson_result get_string(bool allow_replacement) noexcept;
    +  template 
    +  simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_null() noexcept;
    +  simdjson_warn_unused simdjson_inline bool is_negative() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept;
    +
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_string(bool check_trailing, bool allow_replacement) noexcept;
    +  template 
    +  simdjson_warn_unused simdjson_inline error_code get_root_string(string_type& receiver, bool check_trailing, bool allow_replacement) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_wobbly_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_raw_json_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_uint64(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_uint64_in_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_int64(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_int64_in_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_double(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_double_in_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_bool(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline bool is_root_negative() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_root_integer(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_number_type(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_number(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_root_null(bool check_trailing) noexcept;
    +
    +  simdjson_inline error_code error() const noexcept;
    +  simdjson_inline uint8_t *&string_buf_loc() noexcept;
    +  simdjson_inline const json_iterator &json_iter() const noexcept;
    +  simdjson_inline json_iterator &json_iter() noexcept;
    +
    +  simdjson_inline void assert_is_valid() const noexcept;
    +  simdjson_inline bool is_valid() const noexcept;
    +
    +  /** @} */
    +protected:
    +  /**
    +   * Restarts an array iteration.
    +   * @returns Whether the array has any elements (returns false for empty).
    +   */
    +  simdjson_inline simdjson_result reset_array() noexcept;
    +  /**
    +   * Restarts an object iteration.
    +   * @returns Whether the object has any fields (returns false for empty).
    +   */
    +  simdjson_inline simdjson_result reset_object() noexcept;
    +  /**
    +   * move_at_start(): moves us so that we are pointing at the beginning of
    +   * the container. It updates the index so that at_start() is true and it
    +   * syncs the depth. The user can then create a new container instance.
    +   *
    +   * Usage: used with value::count_elements().
    +   **/
    +  simdjson_inline void move_at_start() noexcept;
    +
    +  /**
    +   * move_at_container_start(): moves us so that we are pointing at the beginning of
    +   * the container so that assert_at_container_start() passes.
    +   *
    +   * Usage: used with reset_array() and reset_object().
    +   **/
    +   simdjson_inline void move_at_container_start() noexcept;
    +  /* Useful for debugging and logging purposes. */
    +  inline std::string to_string() const noexcept;
    +  simdjson_inline value_iterator(json_iterator *json_iter, depth_t depth, token_position start_index) noexcept;
    +
    +  simdjson_inline simdjson_result parse_null(const uint8_t *json) const noexcept;
    +  simdjson_inline simdjson_result parse_bool(const uint8_t *json) const noexcept;
    +  simdjson_inline const uint8_t *peek_start() const noexcept;
    +  simdjson_inline uint32_t peek_start_length() const noexcept;
    +
    +  /**
    +   * The general idea of the advance_... methods and the peek_* methods
    +   * is that you first peek and check that you have desired type. If you do,
    +   * and only if you do, then you advance.
    +   *
    +   * We used to unconditionally advance. But this made reasoning about our
    +   * current state difficult.
    +   * Suppose you always advance. Look at the 'value' matching the key
    +   * "shadowable" in the following example...
    +   *
    +   * ({"globals":{"a":{"shadowable":[}}}})
    +   *
    +   * If the user thinks it is a Boolean and asks for it, then we check the '[',
    +   * decide it is not a Boolean, but still move into the next character ('}'). Now
    +   * we are left pointing at '}' right after a '['. And we have not yet reported
    +   * an error, only that we do not have a Boolean.
    +   *
    +   * If, instead, you just stand your ground until it is content that you know, then
    +   * you will only even move beyond the '[' if the user tells you that you have an
    +   * array. So you will be at the '}' character inside the array and, hopefully, you
    +   * will then catch the error because an array cannot start with '}', but the code
    +   * processing Boolean values does not know this.
    +   *
    +   * So the contract is: first call 'peek_...' and then call 'advance_...' only
    +   * if you have determined that it is a type you can handle.
    +   *
    +   * Unfortunately, it makes the code more verbose, longer and maybe more error prone.
    +   */
    +
    +  simdjson_inline void advance_scalar(const char *type) noexcept;
    +  simdjson_inline void advance_root_scalar(const char *type) noexcept;
    +  simdjson_inline void advance_non_root_scalar(const char *type) noexcept;
    +
    +  simdjson_inline const uint8_t *peek_scalar(const char *type) noexcept;
    +  simdjson_inline const uint8_t *peek_root_scalar(const char *type) noexcept;
    +  simdjson_inline const uint8_t *peek_non_root_scalar(const char *type) noexcept;
    +
    +
    +  simdjson_inline error_code start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept;
    +  simdjson_inline error_code end_container() noexcept;
    +
    +  /**
    +   * Advance to a place expecting a value (increasing depth).
    +   *
    +   * @return The current token (the one left behind).
    +   * @error TAPE_ERROR If the document ended early.
    +   */
    +  simdjson_inline simdjson_result advance_to_value() noexcept;
    +
    +  simdjson_inline error_code incorrect_type_error(const char *message) const noexcept;
    +  simdjson_inline error_code error_unless_more_tokens(uint32_t tokens=1) const noexcept;
    +
    +  simdjson_inline bool is_at_start() const noexcept;
    +  /**
    +   * is_at_iterator_start() returns true on an array or object after it has just been
    +   * created, whether the instance is empty or not.
    +   *
    +   * Usage: used by array::begin() in debug mode (SIMDJSON_DEVELOPMENT_CHECKS)
    +   */
    +  simdjson_inline bool is_at_iterator_start() const noexcept;
    +
    +  /**
    +   * Assuming that we are within an object, this returns true if we
    +   * are pointing at a key.
    +   *
    +   * Usage: the skip_child() method should never be used while we are pointing
    +   * at a key inside an object.
    +   */
    +  simdjson_inline bool is_at_key() const noexcept;
    +
    +  inline void assert_at_start() const noexcept;
    +  inline void assert_at_container_start() const noexcept;
    +  inline void assert_at_root() const noexcept;
    +  inline void assert_at_child() const noexcept;
    +  inline void assert_at_next() const noexcept;
    +  inline void assert_at_non_root_start() const noexcept;
    +
    +  /** Get the starting position of this value */
    +  simdjson_inline token_position start_position() const noexcept;
    +
    +  /** @copydoc error_code json_iterator::position() const noexcept; */
    +  simdjson_inline token_position position() const noexcept;
    +  /** @copydoc error_code json_iterator::end_position() const noexcept; */
    +  simdjson_inline token_position last_position() const noexcept;
    +  /** @copydoc error_code json_iterator::end_position() const noexcept; */
    +  simdjson_inline token_position end_position() const noexcept;
    +  /** @copydoc error_code json_iterator::report_error(error_code error, const char *message) noexcept; */
    +  simdjson_inline error_code report_error(error_code error, const char *message) noexcept;
    +
    +  friend class document;
    +  friend class object;
    +  friend class array;
    +  friend class value;
    +}; // value_iterator
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public icelake::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(icelake::ondemand::value_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H
    +/* end file simdjson/generic/ondemand/value_iterator.h for icelake */
    +/* including simdjson/generic/ondemand/value.h for icelake: #include "simdjson/generic/ondemand/value.h" */
    +/* begin file simdjson/generic/ondemand/value.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +/**
    + * An ephemeral JSON value returned during iteration. It is only valid for as long as you do
    + * not access more data in the JSON document.
    + */
    +class value {
    +public:
    +  /**
    +   * Create a new invalid value.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline value() noexcept = default;
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool
    +   *
    +   * You may use get_double(), get_bool(), get_uint64(), get_int64(),
    +   * get_object(), get_array(), get_raw_json_string(), or get_string() instead.
    +   *
    +   * @returns A value of the given type, parsed from the JSON.
    +   * @returns INCORRECT_TYPE If the JSON value is not the given type.
    +   */
    +  template simdjson_inline simdjson_result get() noexcept {
    +    // Unless the simdjson library provides an inline implementation, calling this method should
    +    // immediately fail.
    +    static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. "
    +      "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
    +      "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), "
    +      " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template.");
    +  }
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool
    +   *
    +   * @param out This is set to a value of the given type, parsed from the JSON. If there is an error, this may not be initialized.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   * @returns SUCCESS If the parse succeeded and the out parameter was set to the value.
    +   */
    +  template simdjson_inline error_code get(T &out) noexcept;
    +
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @returns INCORRECT_TYPE If the JSON value is not an array.
    +   */
    +  simdjson_inline simdjson_result get_array() noexcept;
    +
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   */
    +  simdjson_inline simdjson_result get_object() noexcept;
    +
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A unsigned 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a unsigned integer.
    +   *
    +   * @returns A unsigned 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a double
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Equivalent to get().
    +   *
    +   * Important: a value should be consumed once. Calling get_string() twice on the same value
    +   * is an error.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +
    +  /**
    +   * Attempts to fill the provided std::string reference with the parsed value of the current string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Important: a value should be consumed once. Calling get_string() twice on the same value
    +   * is an error.
    +   *
    +   * Performance: This method may be slower than get_string() or get_string(bool) because it may need to allocate memory.
    +   * We recommend you avoid allocating an std::string unless you need to.
    +   *
    +   * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS.
    +   */
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +
    +  /**
    +   * Cast this JSON value to a "wobbly" string.
    +   *
    +   * The string is may not be a valid UTF-8 string.
    +   * See https://simonsapin.github.io/wtf-8/
    +   *
    +   * Important: a value should be consumed once. Calling get_wobbly_string() twice on the same value
    +   * is an error.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @returns INCORRECT_TYPE if the JSON value is not true or false.
    +   */
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +
    +  /**
    +   * Checks if this JSON value is null. If and only if the value is
    +   * null, then it is consumed (we advance). If we find a token that
    +   * begins with 'n' but is not 'null', then an error is returned.
    +   *
    +   * @returns Whether the value is null.
    +   * @returns INCORRECT_TYPE If the JSON value begins with 'n' and is not 'null'.
    +   */
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an array.
    +   */
    +  simdjson_inline operator array() noexcept(false);
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an object.
    +   */
    +  simdjson_inline operator object() noexcept(false);
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline operator int64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline operator double() noexcept(false);
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Equivalent to get().
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator raw_json_string() noexcept(false);
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not true or false.
    +   */
    +  simdjson_inline operator bool() noexcept(false);
    +#endif
    +
    +  /**
    +   * Begin array iteration.
    +   *
    +   * Part of the std::iterable interface.
    +   *
    +   * @returns INCORRECT_TYPE If the JSON value is not an array.
    +   */
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  /**
    +   * Sentinel representing the end of the array.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result end() & noexcept;
    +  /**
    +   * This method scans the array and counts the number of elements.
    +   * The count_elements method should always be called before you have begun
    +   * iterating through the array: it is expected that you are pointing at
    +   * the beginning of the array.
    +   * The runtime complexity is linear in the size of the array. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * Performance hint: You should only call count_elements() as a last
    +   * resort as it may require scanning the document twice or more.
    +   */
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  /**
    +   * This method scans the object and counts the number of key-value pairs.
    +   * The count_fields method should always be called before you have begun
    +   * iterating through the object: it is expected that you are pointing at
    +   * the beginning of the object.
    +   * The runtime complexity is linear in the size of the object. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an object is empty, it is more performant to use
    +   * the is_empty() method on the object instance.
    +   *
    +   * Performance hint: You should only call count_fields() as a last
    +   * resort as it may require scanning the document twice or more.
    +   */
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  /**
    +   * Get the value at the given index in the array. This function has linear-time complexity.
    +   * This function should only be called once on an array instance since the array iterator is not reset between each call.
    +   *
    +   * @return The value at the given index, or:
    +   *         - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
    +   */
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field(const char *key) noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](const char *key) noexcept;
    +
    +  /**
    +   * Get the type of this JSON value. It does not validate or consume the value.
    +   * E.g., you must still call "is_null()" to check that a value is null even if
    +   * "type()" returns json_type::null.
    +   *
    +   * NOTE: If you're only expecting a value to be one type (a typical case), it's generally
    +   * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just
    +   * let it throw an exception).
    +   *
    +   * @return The type of JSON value (json_type::array, json_type::object, json_type::string,
    +   *     json_type::number, json_type::boolean, or json_type::null).
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result type() noexcept;
    +
    +  /**
    +   * Checks whether the value is a scalar (string, number, null, Boolean).
    +   * Returns false when there it is an array or object.
    +   *
    +   * @returns true if the type is string, number, null, Boolean
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +
    +  /**
    +   * Checks whether the value is a negative number.
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline bool is_negative() noexcept;
    +  /**
    +   * Checks whether the value is an integer number. Note that
    +   * this requires to partially parse the number string. If
    +   * the value is determined to be an integer, it may still
    +   * not parse properly as an integer in subsequent steps
    +   * (e.g., it might overflow).
    +   *
    +   * Performance note: if you call this function systematically
    +   * before parsing a number, you may have fallen for a performance
    +   * anti-pattern.
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  /**
    +   * Determine the number type (integer or floating-point number) as quickly
    +   * as possible. This function does not fully validate the input. It is
    +   * useful when you only need to classify the numbers, without parsing them.
    +   *
    +   * If you are planning to retrieve the value or you need full validation,
    +   * consider using the get_number() method instead: it will fully parse
    +   * and validate the input, and give you access to the type:
    +   * get_number().get_number_type().
    +   *
    +   * get_number_type() is number_type::unsigned_integer if we have
    +   * an integer greater or equal to 9223372036854775808
    +   * get_number_type() is number_type::signed_integer if we have an
    +   * integer that is less than 9223372036854775808
    +   * Otherwise, get_number_type() has value number_type::floating_point_number
    +   *
    +   * This function requires processing the number string, but it is expected
    +   * to be faster than get_number().get_number_type() because it is does not
    +   * parse the number value.
    +   *
    +   * @returns the type of the number
    +   */
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +
    +  /**
    +   * Attempt to parse an ondemand::number. An ondemand::number may
    +   * contain an integer value or a floating-point value, the simdjson
    +   * library will autodetect the type. Thus it is a dynamically typed
    +   * number. Before accessing the value, you must determine the detected
    +   * type.
    +   *
    +   * number.get_number_type() is number_type::signed_integer if we have
    +   * an integer in [-9223372036854775808,9223372036854775808)
    +   * You can recover the value by calling number.get_int64() and you
    +   * have that number.is_int64() is true.
    +   *
    +   * number.get_number_type() is number_type::unsigned_integer if we have
    +   * an integer in [9223372036854775808,18446744073709551616)
    +   * You can recover the value by calling number.get_uint64() and you
    +   * have that number.is_uint64() is true.
    +   *
    +   * Otherwise, number.get_number_type() has value number_type::floating_point_number
    +   * and we have a binary64 number.
    +   * You can recover the value by calling number.get_double() and you
    +   * have that number.is_double() is true.
    +   *
    +   * You must check the type before accessing the value: it is an error
    +   * to call "get_int64()" when number.get_number_type() is not
    +   * number_type::signed_integer and when number.is_int64() is false.
    +   *
    +   * Performance note: this is designed with performance in mind. When
    +   * calling 'get_number()', you scan the number string only once, determining
    +   * efficiently the type and storing it in an efficient manner.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept;
    +
    +
    +  /**
    +   * Get the raw JSON for this token.
    +   *
    +   * The string_view will always point into the input buffer.
    +   *
    +   * The string_view will start at the beginning of the token, and include the entire token
    +   * *as well as all spaces until the next token (or EOF).* This means, for example, that a
    +   * string token always begins with a " and is always terminated by the final ", possibly
    +   * followed by a number of spaces.
    +   *
    +   * The string_view is *not* null-terminated. However, if this is a scalar (string, number,
    +   * boolean, or null), the character after the end of the string_view is guaranteed to be
    +   * a non-space token.
    +   *
    +   * Tokens include:
    +   * - {
    +   * - [
    +   * - "a string (possibly with UTF-8 or backslashed characters like \\\")".
    +   * - -1.2e-100
    +   * - true
    +   * - false
    +   * - null
    +   *
    +   * See also value::raw_json().
    +   */
    +  simdjson_inline std::string_view raw_json_token() noexcept;
    +
    +  /**
    +   * Get a string_view pointing at this value in the JSON document.
    +   * If this element is an array or an object, it consumes the array or the object
    +   * and returns a string_view instance corresponding to the
    +   * array as represented in JSON. It points inside the original document.
    +   * If this element is a scalar (string, number, Boolean, null), it returns what
    +   * raw_json_token() would return.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +  /**
    +   * Returns the current location in the document if in bounds.
    +   */
    +  simdjson_inline simdjson_result current_location() noexcept;
    +
    +  /**
    +   * Returns the current depth in the document if in bounds.
    +   *
    +   * E.g.,
    +   *  0 = finished with document
    +   *  1 = document root value (could be [ or {, not yet known)
    +   *  2 = , or } inside root array/object
    +   *  3 = key or value inside root array/object.
    +   */
    +  simdjson_inline int32_t current_depth() const noexcept;
    +
    +  /**
    +   * Get the value associated with the given JSON pointer.  We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/foo/a/1") == 20
    +   *
    +   * It is allowed for a key to be the empty string:
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("//a/1") == 20
    +   *
    +   * Note that at_pointer() called on the document automatically calls the document's rewind
    +   * method between each call. It invalidates all previously accessed arrays, objects and values
    +   * that have not been consumed.
    +   *
    +   * Calling at_pointer() on non-document instances (e.g., arrays and objects) is not
    +   * standardized (by RFC 6901). We provide some experimental support for JSON pointers
    +   * on non-document instances.  Yet it is not the case when calling at_pointer on an array
    +   * or an object instance: there is no rewind and no invalidation.
    +   *
    +   * You may only call at_pointer on an array after it has been created, but before it has
    +   * been first accessed. When calling at_pointer on an array, the pointer is advanced to
    +   * the location indicated by the JSON pointer (in case of success). It is no longer possible
    +   * to call at_pointer on the same array.
    +   *
    +   * You may call at_pointer more than once on an object, but each time the pointer is advanced
    +   * to be within the value matched by the key indicated by the JSON pointer query. Thus any preceding
    +   * key (as well as the current key) can no longer be used with following JSON pointer calls.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   */
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +
    +protected:
    +  /**
    +   * Create a value.
    +   */
    +  simdjson_inline value(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Skip this value, allowing iteration to continue.
    +   */
    +  simdjson_inline void skip() noexcept;
    +
    +  /**
    +   * Start a value at the current position.
    +   *
    +   * (It should already be started; this is just a self-documentation method.)
    +   */
    +  static simdjson_inline value start(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Resume a value.
    +   */
    +  static simdjson_inline value resume(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Get the object, starting or resuming it as necessary
    +   */
    +  simdjson_inline simdjson_result start_or_resume_object() noexcept;
    +
    +  // simdjson_inline void log_value(const char *type) const noexcept;
    +  // simdjson_inline void log_error(const char *message) const noexcept;
    +
    +  value_iterator iter{};
    +
    +  friend class document;
    +  friend class array_iterator;
    +  friend class field;
    +  friend class object;
    +  friend struct simdjson_result;
    +  friend struct simdjson_result;
    +};
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public icelake::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(icelake::ondemand::value &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result get_array() noexcept;
    +  simdjson_inline simdjson_result get_object() noexcept;
    +
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +  template simdjson_inline simdjson_result get() noexcept;
    +
    +  template simdjson_inline error_code get(T &out) noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator icelake::ondemand::array() noexcept(false);
    +  simdjson_inline operator icelake::ondemand::object() noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator icelake::ondemand::raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   *
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field(const char *key) noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](const char *key) noexcept;
    +
    +  /**
    +   * Get the type of this JSON value.
    +   *
    +   * NOTE: If you're only expecting a value to be one type (a typical case), it's generally
    +   * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just
    +   * let it throw an exception).
    +   */
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +  simdjson_inline simdjson_result is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +
    +  /** @copydoc simdjson_inline std::string_view value::raw_json_token() const noexcept */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +  /** @copydoc simdjson_inline simdjson_result current_location() noexcept */
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  /** @copydoc simdjson_inline int32_t current_depth() const noexcept */
    +  simdjson_inline simdjson_result current_depth() const noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_H
    +/* end file simdjson/generic/ondemand/value.h for icelake */
    +/* including simdjson/generic/ondemand/logger.h for icelake: #include "simdjson/generic/ondemand/logger.h" */
    +/* begin file simdjson/generic/ondemand/logger.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_LOGGER_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +// Logging should be free unless SIMDJSON_VERBOSE_LOGGING is set. Importantly, it is critical
    +// that the call to the log functions be side-effect free. Thus, for example, you should not
    +// create temporary std::string instances.
    +namespace logger {
    +
    +enum class log_level : int32_t {
    +  info = 0,
    +  error = 1
    +};
    +
    +#if SIMDJSON_VERBOSE_LOGGING
    +  static constexpr const bool LOG_ENABLED = true;
    +#else
    +  static constexpr const bool LOG_ENABLED = false;
    +#endif
    +
    +// We do not want these functions to be 'really inlined' since real inlining is
    +// for performance purposes and if you are using the loggers, you do not care about
    +// performance (or should not).
    +static inline void log_headers() noexcept;
    +// If args are provided, title will be treated as format string
    +template 
    +static inline void log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, logger::log_level level, Args&&... args) noexcept;
    +template 
    +static inline void log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, logger::log_level level, Args&&... args) noexcept;
    +static inline void log_event(const json_iterator &iter, const char *type, std::string_view detail="", int delta=0, int depth_delta=0) noexcept;
    +static inline void log_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail="") noexcept;
    +static inline void log_value(const json_iterator &iter, const char *type, std::string_view detail="", int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_start_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail="") noexcept;
    +static inline void log_start_value(const json_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_end_value(const json_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +
    +static inline void log_error(const json_iterator &iter, token_position index, depth_t depth, const char *error, const char *detail="") noexcept;
    +static inline void log_error(const json_iterator &iter, const char *error, const char *detail="", int delta=-1, int depth_delta=0) noexcept;
    +
    +static inline void log_event(const value_iterator &iter, const char *type, std::string_view detail="", int delta=0, int depth_delta=0) noexcept;
    +static inline void log_value(const value_iterator &iter, const char *type, std::string_view detail="", int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_start_value(const value_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_end_value(const value_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_error(const value_iterator &iter, const char *error, const char *detail="", int delta=-1, int depth_delta=0) noexcept;
    +
    +} // namespace logger
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_H
    +/* end file simdjson/generic/ondemand/logger.h for icelake */
    +/* including simdjson/generic/ondemand/token_iterator.h for icelake: #include "simdjson/generic/ondemand/token_iterator.h" */
    +/* begin file simdjson/generic/ondemand/token_iterator.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/logger.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +/**
    + * Iterates through JSON tokens (`{` `}` `[` `]` `,` `:` `""` `123` `true` `false` `null`)
    + * detected by stage 1.
    + *
    + * @private This is not intended for external use.
    + */
    +class token_iterator {
    +public:
    +  /**
    +   * Create a new invalid token_iterator.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline token_iterator() noexcept = default;
    +  simdjson_inline token_iterator(token_iterator &&other) noexcept = default;
    +  simdjson_inline token_iterator &operator=(token_iterator &&other) noexcept = default;
    +  simdjson_inline token_iterator(const token_iterator &other) noexcept = default;
    +  simdjson_inline token_iterator &operator=(const token_iterator &other) noexcept = default;
    +
    +  /**
    +   * Advance to the next token (returning the current one).
    +   */
    +  simdjson_inline const uint8_t *return_current_and_advance() noexcept;
    +  /**
    +   * Reports the current offset in bytes from the start of the underlying buffer.
    +   */
    +  simdjson_inline uint32_t current_offset() const noexcept;
    +  /**
    +   * Get the JSON text for a given token (relative).
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = current token,
    +   *              1 = next token, -1 = prev token.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek(int32_t delta=0) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for a given token.
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = current token,
    +   *              1 = next token, -1 = prev token.
    +   */
    +  simdjson_inline uint32_t peek_length(int32_t delta=0) const noexcept;
    +
    +  /**
    +   * Get the JSON text for a given token.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param position The position of the token.
    +   *
    +   */
    +  simdjson_inline const uint8_t *peek(token_position position) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for a given token.
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param position The position of the token.
    +   */
    +  simdjson_inline uint32_t peek_length(token_position position) const noexcept;
    +
    +  /**
    +   * Return the current index.
    +   */
    +  simdjson_inline token_position position() const noexcept;
    +  /**
    +   * Reset to a previously saved index.
    +   */
    +  simdjson_inline void set_position(token_position target_position) noexcept;
    +
    +  // NOTE: we don't support a full C++ iterator interface, because we expect people to make
    +  // different calls to advance the iterator based on *their own* state.
    +
    +  simdjson_inline bool operator==(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator!=(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator>(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator>=(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator<(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator<=(const token_iterator &other) const noexcept;
    +
    +protected:
    +  simdjson_inline token_iterator(const uint8_t *buf, token_position position) noexcept;
    +
    +  /**
    +   * Get the index of the JSON text for a given token (relative).
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = current token,
    +   *              1 = next token, -1 = prev token.
    +   */
    +  simdjson_inline uint32_t peek_index(int32_t delta=0) const noexcept;
    +  /**
    +   * Get the index of the JSON text for a given token.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param position The position of the token.
    +   *
    +   */
    +  simdjson_inline uint32_t peek_index(token_position position) const noexcept;
    +
    +  const uint8_t *buf{};
    +  token_position _position{};
    +
    +  friend class json_iterator;
    +  friend class value_iterator;
    +  friend class object;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, logger::log_level level, Args&&... args) noexcept;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, logger::log_level level, Args&&... args) noexcept;
    +};
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public icelake::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(icelake::ondemand::token_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline ~simdjson_result() noexcept = default; ///< @private
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H
    +/* end file simdjson/generic/ondemand/token_iterator.h for icelake */
    +/* including simdjson/generic/ondemand/json_iterator.h for icelake: #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* begin file simdjson/generic/ondemand/json_iterator.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/token_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +/**
    + * Iterates through JSON tokens, keeping track of depth and string buffer.
    + *
    + * @private This is not intended for external use.
    + */
    +class json_iterator {
    +protected:
    +  token_iterator token{};
    +  ondemand::parser *parser{};
    +  /**
    +   * Next free location in the string buffer.
    +   *
    +   * Used by raw_json_string::unescape() to have a place to unescape strings to.
    +   */
    +  uint8_t *_string_buf_loc{};
    +  /**
    +   * JSON error, if there is one.
    +   *
    +   * INCORRECT_TYPE and NO_SUCH_FIELD are *not* stored here, ever.
    +   *
    +   * PERF NOTE: we *hope* this will be elided into control flow, as it is only used (a) in the first
    +   * iteration of the loop, or (b) for the final iteration after a missing comma is found in ++. If
    +   * this is not elided, we should make sure it's at least not using up a register. Failing that,
    +   * we should store it in document so there's only one of them.
    +   */
    +  error_code error{SUCCESS};
    +  /**
    +   * Depth of the current token in the JSON.
    +   *
    +   * - 0 = finished with document
    +   * - 1 = document root value (could be [ or {, not yet known)
    +   * - 2 = , or } inside root array/object
    +   * - 3 = key or value inside root array/object.
    +   */
    +  depth_t _depth{};
    +  /**
    +   * Beginning of the document indexes.
    +   * Normally we have root == parser->implementation->structural_indexes.get()
    +   * but this may differ, especially in streaming mode (where we have several
    +   * documents);
    +   */
    +  token_position _root{};
    +  /**
    +   * Normally, a json_iterator operates over a single document, but in
    +   * some cases, we may have a stream of documents. This attribute is meant
    +   * as meta-data: the json_iterator works the same irrespective of the
    +   * value of this attribute.
    +   */
    +  bool _streaming{false};
    +
    +public:
    +  simdjson_inline json_iterator() noexcept = default;
    +  simdjson_inline json_iterator(json_iterator &&other) noexcept;
    +  simdjson_inline json_iterator &operator=(json_iterator &&other) noexcept;
    +  simdjson_inline explicit json_iterator(const json_iterator &other) noexcept = default;
    +  simdjson_inline json_iterator &operator=(const json_iterator &other) noexcept = default;
    +  /**
    +   * Skips a JSON value, whether it is a scalar, array or object.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code skip_child(depth_t parent_depth) noexcept;
    +
    +  /**
    +   * Tell whether the iterator is still at the start
    +   */
    +  simdjson_inline bool at_root() const noexcept;
    +
    +  /**
    +   * Tell whether we should be expected to run in streaming
    +   * mode (iterating over many documents). It is pure metadata
    +   * that does not affect how the iterator works. It is used by
    +   * start_root_array() and start_root_object().
    +   */
    +  simdjson_inline bool streaming() const noexcept;
    +
    +  /**
    +   * Get the root value iterator
    +   */
    +  simdjson_inline token_position root_position() const noexcept;
    +  /**
    +   * Assert that we are at the document depth (== 1)
    +   */
    +  simdjson_inline void assert_at_document_depth() const noexcept;
    +  /**
    +   * Assert that we are at the root of the document
    +   */
    +  simdjson_inline void assert_at_root() const noexcept;
    +
    +  /**
    +   * Tell whether the iterator is at the EOF mark
    +   */
    +  simdjson_inline bool at_end() const noexcept;
    +
    +  /**
    +   * Tell whether the iterator is live (has not been moved).
    +   */
    +  simdjson_inline bool is_alive() const noexcept;
    +
    +  /**
    +   * Abandon this iterator, setting depth to 0 (as if the document is finished).
    +   */
    +  simdjson_inline void abandon() noexcept;
    +
    +  /**
    +   * Advance the current token without modifying depth.
    +   */
    +  simdjson_inline const uint8_t *return_current_and_advance() noexcept;
    +
    +  /**
    +   * Returns true if there is a single token in the index (i.e., it is
    +   * a JSON with a scalar value such as a single number).
    +   *
    +   * @return whether there is a single token
    +   */
    +  simdjson_inline bool is_single_token() const noexcept;
    +
    +  /**
    +   * Assert that there are at least the given number of tokens left.
    +   *
    +   * Has no effect in release builds.
    +   */
    +  simdjson_inline void assert_more_tokens(uint32_t required_tokens=1) const noexcept;
    +  /**
    +   * Assert that the given position addresses an actual token (is within bounds).
    +   *
    +   * Has no effect in release builds.
    +   */
    +  simdjson_inline void assert_valid_position(token_position position) const noexcept;
    +  /**
    +   * Get the JSON text for a given token (relative).
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = next token, -1 = prev token.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek(int32_t delta=0) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for the current token (or relative).
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = next token, -1 = prev token.
    +   */
    +  simdjson_inline uint32_t peek_length(int32_t delta=0) const noexcept;
    +  /**
    +   * Get a pointer to the current location in the input buffer.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * You may be pointing outside of the input buffer: it is not generally
    +   * safe to dereference this pointer.
    +   */
    +  simdjson_inline const uint8_t *unsafe_pointer() const noexcept;
    +  /**
    +   * Get the JSON text for a given token.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param position The position of the token to retrieve.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek(token_position position) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for the current token (or relative).
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param position The position of the token to retrieve.
    +   */
    +  simdjson_inline uint32_t peek_length(token_position position) const noexcept;
    +  /**
    +   * Get the JSON text for the last token in the document.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek_last() const noexcept;
    +
    +  /**
    +   * Ascend one level.
    +   *
    +   * Validates that the depth - 1 == parent_depth.
    +   *
    +   * @param parent_depth the expected parent depth.
    +   */
    +  simdjson_inline void ascend_to(depth_t parent_depth) noexcept;
    +
    +  /**
    +   * Descend one level.
    +   *
    +   * Validates that the new depth == child_depth.
    +   *
    +   * @param child_depth the expected child depth.
    +   */
    +  simdjson_inline void descend_to(depth_t child_depth) noexcept;
    +  simdjson_inline void descend_to(depth_t child_depth, int32_t delta) noexcept;
    +
    +  /**
    +   * Get current depth.
    +   */
    +  simdjson_inline depth_t depth() const noexcept;
    +
    +  /**
    +   * Get current (writeable) location in the string buffer.
    +   */
    +  simdjson_inline uint8_t *&string_buf_loc() noexcept;
    +
    +  /**
    +   * Report an unrecoverable error, preventing further iteration.
    +   *
    +   * @param error The error to report. Must not be SUCCESS, UNINITIALIZED, INCORRECT_TYPE, or NO_SUCH_FIELD.
    +   * @param message An error message to report with the error.
    +   */
    +  simdjson_inline error_code report_error(error_code error, const char *message) noexcept;
    +
    +  /**
    +   * Log error, but don't stop iteration.
    +   * @param error The error to report. Must be INCORRECT_TYPE, or NO_SUCH_FIELD.
    +   * @param message An error message to report with the error.
    +   */
    +  simdjson_inline error_code optional_error(error_code error, const char *message) noexcept;
    +
    +  /**
    +   * Take an input in json containing max_len characters and attempt to copy it over to tmpbuf, a buffer with
    +   * N bytes of capacity. It will return false if N is too small (smaller than max_len) of if it is zero.
    +   * The buffer (tmpbuf) is padded with space characters.
    +   */
    +  simdjson_warn_unused simdjson_inline bool copy_to_buffer(const uint8_t *json, uint32_t max_len, uint8_t *tmpbuf, size_t N) noexcept;
    +
    +  simdjson_inline token_position position() const noexcept;
    +  /**
    +   * Write the raw_json_string to the string buffer and return a string_view.
    +   * Each raw_json_string should be unescaped once, or else the string buffer might
    +   * overflow.
    +   */
    +  simdjson_inline simdjson_result unescape(raw_json_string in, bool allow_replacement) noexcept;
    +  simdjson_inline simdjson_result unescape_wobbly(raw_json_string in) noexcept;
    +
    +  simdjson_inline void reenter_child(token_position position, depth_t child_depth) noexcept;
    +
    +  simdjson_inline error_code consume_character(char c) noexcept;
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  simdjson_inline token_position start_position(depth_t depth) const noexcept;
    +  simdjson_inline void set_start_position(depth_t depth, token_position position) noexcept;
    +#endif
    +
    +  /* Useful for debugging and logging purposes. */
    +  inline std::string to_string() const noexcept;
    +
    +  /**
    +   * Returns the current location in the document if in bounds.
    +   */
    +  inline simdjson_result current_location() const noexcept;
    +
    +  /**
    +   * Updates this json iterator so that it is back at the beginning of the document,
    +   * as if it had just been created.
    +   */
    +  inline void rewind() noexcept;
    +  /**
    +   * This checks whether the {,},[,] are balanced so that the document
    +   * ends with proper zero depth. This requires scanning the whole document
    +   * and it may be expensive. It is expected that it will be rarely called.
    +   * It does not attempt to match { with } and [ with ].
    +   */
    +  inline bool balanced() const noexcept;
    +protected:
    +  simdjson_inline json_iterator(const uint8_t *buf, ondemand::parser *parser) noexcept;
    +  /// The last token before the end
    +  simdjson_inline token_position last_position() const noexcept;
    +  /// The token *at* the end. This points at gibberish and should only be used for comparison.
    +  simdjson_inline token_position end_position() const noexcept;
    +  /// The end of the buffer.
    +  simdjson_inline token_position end() const noexcept;
    +
    +  friend class document;
    +  friend class document_stream;
    +  friend class object;
    +  friend class array;
    +  friend class value;
    +  friend class raw_json_string;
    +  friend class parser;
    +  friend class value_iterator;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, logger::log_level level, Args&&... args) noexcept;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, logger::log_level level, Args&&... args) noexcept;
    +}; // json_iterator
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public icelake::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(icelake::ondemand::json_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H
    +/* end file simdjson/generic/ondemand/json_iterator.h for icelake */
    +/* including simdjson/generic/ondemand/json_type.h for icelake: #include "simdjson/generic/ondemand/json_type.h" */
    +/* begin file simdjson/generic/ondemand/json_type.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/numberparsing.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +/**
    + * The type of a JSON value.
    + */
    +enum class json_type {
    +    // Start at 1 to catch uninitialized / default values more easily
    +    array=1, ///< A JSON array   ( [ 1, 2, 3 ... ] )
    +    object,  ///< A JSON object  ( { "a": 1, "b" 2, ... } )
    +    number,  ///< A JSON number  ( 1 or -2.3 or 4.5e6 ...)
    +    string,  ///< A JSON string  ( "a" or "hello world\n" ...)
    +    boolean, ///< A JSON boolean (true or false)
    +    null     ///< A JSON null    (null)
    +};
    +
    +/**
    + * A type representing a JSON number.
    + * The design of the struct is deliberately straight-forward. All
    + * functions return standard values with no error check.
    + */
    +struct number {
    +
    +  /**
    +   * return the automatically determined type of
    +   * the number: number_type::floating_point_number,
    +   * number_type::signed_integer or number_type::unsigned_integer.
    +   *
    +   *    enum class number_type {
    +   *        floating_point_number=1, /// a binary64 number
    +   *        signed_integer,          /// a signed integer that fits in a 64-bit word using two's complement
    +   *        unsigned_integer         /// a positive integer larger or equal to 1<<63
    +   *    };
    +   */
    +  simdjson_inline ondemand::number_type get_number_type() const noexcept;
    +  /**
    +   * return true if the automatically determined type of
    +   * the number is number_type::unsigned_integer.
    +   */
    +  simdjson_inline bool is_uint64() const noexcept;
    +  /**
    +   * return the value as a uint64_t, only valid if is_uint64() is true.
    +   */
    +  simdjson_inline uint64_t get_uint64() const noexcept;
    +  simdjson_inline operator uint64_t() const noexcept;
    +
    +  /**
    +   * return true if the automatically determined type of
    +   * the number is number_type::signed_integer.
    +   */
    +  simdjson_inline bool is_int64() const noexcept;
    +  /**
    +   * return the value as a int64_t, only valid if is_int64() is true.
    +   */
    +  simdjson_inline int64_t get_int64() const noexcept;
    +  simdjson_inline operator int64_t() const noexcept;
    +
    +
    +  /**
    +   * return true if the automatically determined type of
    +   * the number is number_type::floating_point_number.
    +   */
    +  simdjson_inline bool is_double() const noexcept;
    +  /**
    +   * return the value as a double, only valid if is_double() is true.
    +   */
    +  simdjson_inline double get_double() const noexcept;
    +  simdjson_inline operator double() const noexcept;
    +
    +  /**
    +   * Convert the number to a double. Though it always succeed, the conversion
    +   * may be lossy if the number cannot be represented exactly.
    +   */
    +  simdjson_inline double as_double() const noexcept;
    +
    +
    +protected:
    +  /**
    +   * The next block of declaration is designed so that we can call the number parsing
    +   * functions on a number type. They are protected and should never be used outside
    +   * of the core simdjson library.
    +   */
    +  friend class value_iterator;
    +  template
    +  friend error_code numberparsing::slow_float_parsing(simdjson_unused const uint8_t * src, W writer);
    +  template
    +  friend error_code numberparsing::write_float(const uint8_t *const src, bool negative, uint64_t i, const uint8_t * start_digits, size_t digit_count, int64_t exponent, W &writer);
    +  template
    +  friend error_code numberparsing::parse_number(const uint8_t *const src, W &writer);
    +  /** Store a signed 64-bit value to the number. */
    +  simdjson_inline void append_s64(int64_t value) noexcept;
    +  /** Store an unsigned 64-bit value to the number. */
    +  simdjson_inline void append_u64(uint64_t value) noexcept;
    +  /** Store a double value to the number. */
    +  simdjson_inline void append_double(double value) noexcept;
    +  /** Specifies that the value is a double, but leave it undefined. */
    +  simdjson_inline void skip_double() noexcept;
    +  /**
    +   * End of friend declarations.
    +   */
    +
    +  /**
    +   * Our attributes are a union type (size = 64 bits)
    +   * followed by a type indicator.
    +   */
    +  union {
    +    double floating_point_number;
    +    int64_t signed_integer;
    +    uint64_t unsigned_integer;
    +  } payload{0};
    +  number_type type{number_type::signed_integer};
    +};
    +
    +/**
    + * Write the JSON type to the output stream
    + *
    + * @param out The output stream.
    + * @param type The json_type.
    + */
    +inline std::ostream& operator<<(std::ostream& out, json_type type) noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +/**
    + * Send JSON type to an output stream.
    + *
    + * @param out The output stream.
    + * @param type The json_type.
    + * @throw simdjson_error if the result being printed has an error. If there is an error with the
    + *        underlying output stream, that error will be propagated (simdjson_error will not be
    + *        thrown).
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false);
    +#endif
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public icelake::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(icelake::ondemand::json_type &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline ~simdjson_result() noexcept = default; ///< @private
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H
    +/* end file simdjson/generic/ondemand/json_type.h for icelake */
    +/* including simdjson/generic/ondemand/raw_json_string.h for icelake: #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* begin file simdjson/generic/ondemand/raw_json_string.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +/**
    + * A string escaped per JSON rules, terminated with quote ("). They are used to represent
    + * unescaped keys inside JSON documents.
    + *
    + * (In other words, a pointer to the beginning of a string, just after the start quote, inside a
    + * JSON file.)
    + *
    + * This class is deliberately simplistic and has little functionality. You can
    + * compare a raw_json_string instance with an unescaped C string, but
    + * that is nearly all you can do.
    + *
    + * The raw_json_string is unescaped. If you wish to write an unescaped version of it to your own
    + * buffer, you may do so using the parser.unescape(string, buff) method, using an ondemand::parser
    + * instance. Doing so requires you to have a sufficiently large buffer.
    + *
    + * The raw_json_string instances originate typically from field instance which in turn represent
    + * key-value pairs from object instances. From a field instance, you get the raw_json_string
    + * instance by calling key(). You can, if you want a more usable string_view instance, call
    + * the unescaped_key() method on the field instance. You may also create a raw_json_string from
    + * any other string value, with the value.get_raw_json_string() method. Again, you can get
    + * a more usable string_view instance by calling get_string().
    + *
    + */
    +class raw_json_string {
    +public:
    +  /**
    +   * Create a new invalid raw_json_string.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline raw_json_string() noexcept = default;
    +
    +  /**
    +   * Create a new invalid raw_json_string pointed at the given location in the JSON.
    +   *
    +   * The given location must be just *after* the beginning quote (") in the JSON file.
    +   *
    +   * It *must* be terminated by a ", and be a valid JSON string.
    +   */
    +  simdjson_inline raw_json_string(const uint8_t * _buf) noexcept;
    +  /**
    +   * Get the raw pointer to the beginning of the string in the JSON (just after the ").
    +   *
    +   * It is possible for this function to return a null pointer if the instance
    +   * has outlived its existence.
    +   */
    +  simdjson_inline const char * raw() const noexcept;
    +
    +  /**
    +   * This compares the current instance to the std::string_view target: returns true if
    +   * they are byte-by-byte equal (no escaping is done) on target.size() characters,
    +   * and if the raw_json_string instance has a quote character at byte index target.size().
    +   * We never read more than length + 1 bytes in the raw_json_string instance.
    +   * If length is smaller than target.size(), this will return false.
    +   *
    +   * The std::string_view instance may contain any characters. However, the caller
    +   * is responsible for setting length so that length bytes may be read in the
    +   * raw_json_string.
    +   *
    +   * Performance: the comparison may be done using memcmp which may be efficient
    +   * for long strings.
    +   */
    +  simdjson_inline bool unsafe_is_equal(size_t length, std::string_view target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the std::string_view target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   * The std::string_view instance should not contain unescaped quote characters:
    +   * the caller is responsible for this check. See is_free_from_unescaped_quote.
    +   *
    +   * Performance: the comparison is done byte-by-byte which might be inefficient for
    +   * long strings.
    +   *
    +   * If target is a compile-time constant, and your compiler likes you,
    +   * you should be able to do the following without performance penalty...
    +   *
    +   *   static_assert(raw_json_string::is_free_from_unescaped_quote(target), "");
    +   *   s.unsafe_is_equal(target);
    +   */
    +  simdjson_inline bool unsafe_is_equal(std::string_view target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the C string target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   * The provided C string should not contain an unescaped quote character:
    +   * the caller is responsible for this check. See is_free_from_unescaped_quote.
    +   *
    +   * If target is a compile-time constant, and your compiler likes you,
    +   * you should be able to do the following without performance penalty...
    +   *
    +   *   static_assert(raw_json_string::is_free_from_unescaped_quote(target), "");
    +   *   s.unsafe_is_equal(target);
    +   */
    +  simdjson_inline bool unsafe_is_equal(const char* target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the std::string_view target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   */
    +  simdjson_inline bool is_equal(std::string_view target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the C string target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   */
    +  simdjson_inline bool is_equal(const char* target) const noexcept;
    +
    +  /**
    +   * Returns true if target is free from unescaped quote. If target is known at
    +   * compile-time, we might expect the computation to happen at compile time with
    +   * many compilers (not all!).
    +   */
    +  static simdjson_inline bool is_free_from_unescaped_quote(std::string_view target) noexcept;
    +  static simdjson_inline bool is_free_from_unescaped_quote(const char* target) noexcept;
    +
    +private:
    +
    +
    +  /**
    +   * This will set the inner pointer to zero, effectively making
    +   * this instance unusable.
    +   */
    +  simdjson_inline void consume() noexcept { buf = nullptr; }
    +
    +  /**
    +   * Checks whether the inner pointer is non-null and thus usable.
    +   */
    +  simdjson_inline simdjson_warn_unused bool alive() const noexcept { return buf != nullptr; }
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc.
    +   * The result will be a valid UTF-8.
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid until the next parse() call on the parser.
    +   *
    +   * @param iter A json_iterator, which contains a buffer where the string will be written.
    +   * @param allow_replacement Whether we allow replacement of invalid surrogate pairs.
    +   */
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape(json_iterator &iter, bool allow_replacement) const noexcept;
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc.
    +   * The result may not be a valid UTF-8. https://simonsapin.github.io/wtf-8/
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid until the next parse() call on the parser.
    +   *
    +   * @param iter A json_iterator, which contains a buffer where the string will be written.
    +   */
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape_wobbly(json_iterator &iter) const noexcept;
    +  const uint8_t * buf{};
    +  friend class object;
    +  friend class field;
    +  friend class parser;
    +  friend struct simdjson_result;
    +};
    +
    +simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &, const raw_json_string &) noexcept;
    +
    +/**
    + * Comparisons between raw_json_string and std::string_view instances are potentially unsafe: the user is responsible
    + * for providing a string with no unescaped quote. Note that unescaped quotes cannot be present in valid JSON strings.
    + */
    +simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept;
    +simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept;
    +simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept;
    +simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept;
    +
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public icelake::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(icelake::ondemand::raw_json_string &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline ~simdjson_result() noexcept = default; ///< @private
    +
    +  simdjson_inline simdjson_result raw() const noexcept;
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape(icelake::ondemand::json_iterator &iter, bool allow_replacement) const noexcept;
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape_wobbly(icelake::ondemand::json_iterator &iter) const noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H
    +/* end file simdjson/generic/ondemand/raw_json_string.h for icelake */
    +/* including simdjson/generic/ondemand/parser.h for icelake: #include "simdjson/generic/ondemand/parser.h" */
    +/* begin file simdjson/generic/ondemand/parser.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_PARSER_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +/**
    + * The default batch size for document_stream instances for this On Demand kernel.
    + * Note that different On Demand kernel may use a different DEFAULT_BATCH_SIZE value
    + * in the future.
    + */
    +static constexpr size_t DEFAULT_BATCH_SIZE = 1000000;
    +/**
    + * Some adversary might try to set the batch size to 0 or 1, which might cause problems.
    + * We set a minimum of 32B since anything else is highly likely to be an error. In practice,
    + * most users will want a much larger batch size.
    + *
    + * All non-negative MINIMAL_BATCH_SIZE values should be 'safe' except that, obviously, no JSON
    + * document can ever span 0 or 1 byte and that very large values would create memory allocation issues.
    + */
    +static constexpr size_t MINIMAL_BATCH_SIZE = 32;
    +
    +/**
    + * A JSON fragment iterator.
    + *
    + * This holds the actual iterator as well as the buffer for writing strings.
    + */
    +class parser {
    +public:
    +  /**
    +   * Create a JSON parser.
    +   *
    +   * The new parser will have zero capacity.
    +   */
    +  inline explicit parser(size_t max_capacity = SIMDJSON_MAXSIZE_BYTES) noexcept;
    +
    +  inline parser(parser &&other) noexcept = default;
    +  simdjson_inline parser(const parser &other) = delete;
    +  simdjson_inline parser &operator=(const parser &other) = delete;
    +  simdjson_inline parser &operator=(parser &&other) noexcept = default;
    +
    +  /** Deallocate the JSON parser. */
    +  inline ~parser() noexcept = default;
    +
    +  /**
    +   * Start iterating an on-demand JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   document doc = parser.iterate(json);
    +   *
    +   * It is expected that the content is a valid UTF-8 file, containing a valid JSON document.
    +   * Otherwise the iterate method may return an error. In particular, the whole input should be
    +   * valid: we do not attempt to tolerate incorrect content either before or after a JSON
    +   * document. If there is a UTF-8 BOM, the parser skips it.
    +   *
    +   * ### IMPORTANT: Validate what you use
    +   *
    +   * Calling iterate on an invalid JSON document may not immediately trigger an error. The call to
    +   * iterate does not parse and validate the whole document.
    +   *
    +   * ### IMPORTANT: Buffer Lifetime
    +   *
    +   * Because parsing is done while you iterate, you *must* keep the JSON buffer around at least as
    +   * long as the document iteration.
    +   *
    +   * ### IMPORTANT: Document Lifetime
    +   *
    +   * Only one iteration at a time can happen per parser, and the parser *must* be kept alive during
    +   * iteration to ensure intermediate buffers can be accessed. Any document must be destroyed before
    +   * you call parse() again or destroy the parser.
    +   *
    +   * ### REQUIRED: Buffer Padding
    +   *
    +   * The buffer must have at least SIMDJSON_PADDING extra allocated bytes. It does not matter what
    +   * those bytes are initialized to, as long as they are allocated. These bytes will be read: if you
    +   * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the
    +   * SIMDJSON_PADDING bytes to avoid runtime warnings.
    +   *
    +   * @param json The JSON to parse.
    +   * @param len The length of the JSON.
    +   * @param capacity The number of bytes allocated in the JSON (must be at least len+SIMDJSON_PADDING).
    +   *
    +   * @return The document, or an error:
    +   *         - INSUFFICIENT_PADDING if the input has less than SIMDJSON_PADDING extra bytes.
    +   *         - MEMALLOC if realloc_if_needed the parser does not have enough capacity, and memory
    +   *           allocation fails.
    +   *         - EMPTY if the document is all whitespace.
    +   *         - UTF8_ERROR if the document is not valid UTF-8.
    +   *         - UNESCAPED_CHARS if a string contains control characters that must be escaped
    +   *         - UNCLOSED_STRING if there is an unclosed string in the document.
    +   */
    +  simdjson_warn_unused simdjson_result iterate(padded_string_view json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const char *json, size_t len, size_t capacity) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const uint8_t *json, size_t len, size_t capacity) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(std::string_view json, size_t capacity) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const std::string &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(std::string &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(padded_string &&json) & noexcept = delete;
    +
    +  /**
    +   * @private
    +   *
    +   * Start iterating an on-demand JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   json_iterator doc = parser.iterate(json);
    +   *
    +   * ### IMPORTANT: Buffer Lifetime
    +   *
    +   * Because parsing is done while you iterate, you *must* keep the JSON buffer around at least as
    +   * long as the document iteration.
    +   *
    +   * ### IMPORTANT: Document Lifetime
    +   *
    +   * Only one iteration at a time can happen per parser, and the parser *must* be kept alive during
    +   * iteration to ensure intermediate buffers can be accessed. Any document must be destroyed before
    +   * you call parse() again or destroy the parser.
    +   *
    +   * The ondemand::document instance holds the iterator. The document must remain in scope
    +   * while you are accessing instances of ondemand::value, ondemand::object, ondemand::array.
    +   *
    +   * ### REQUIRED: Buffer Padding
    +   *
    +   * The buffer must have at least SIMDJSON_PADDING extra allocated bytes. It does not matter what
    +   * those bytes are initialized to, as long as they are allocated. These bytes will be read: if you
    +   * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the
    +   * SIMDJSON_PADDING bytes to avoid runtime warnings.
    +   *
    +   * @param json The JSON to parse.
    +   *
    +   * @return The iterator, or an error:
    +   *         - INSUFFICIENT_PADDING if the input has less than SIMDJSON_PADDING extra bytes.
    +   *         - MEMALLOC if realloc_if_needed the parser does not have enough capacity, and memory
    +   *           allocation fails.
    +   *         - EMPTY if the document is all whitespace.
    +   *         - UTF8_ERROR if the document is not valid UTF-8.
    +   *         - UNESCAPED_CHARS if a string contains control characters that must be escaped
    +   *         - UNCLOSED_STRING if there is an unclosed string in the document.
    +   */
    +  simdjson_warn_unused simdjson_result iterate_raw(padded_string_view json) & noexcept;
    +
    +
    +  /**
    +   * Parse a buffer containing many JSON documents.
    +   *
    +   *   auto json = R"({ "foo": 1 } { "foo": 2 } { "foo": 3 } )"_padded;
    +   *   ondemand::parser parser;
    +   *   ondemand::document_stream docs = parser.iterate_many(json);
    +   *   for (auto & doc : docs) {
    +   *     std::cout << doc["foo"] << std::endl;
    +   *   }
    +   *   // Prints 1 2 3
    +   *
    +   * No copy of the input buffer is made.
    +   *
    +   * The function is lazy: it may be that no more than one JSON document at a time is parsed.
    +   *
    +   * The caller is responsabile to ensure that the input string data remains unchanged and is
    +   * not deleted during the loop.
    +   *
    +   * ### Format
    +   *
    +   * The buffer must contain a series of one or more JSON documents, concatenated into a single
    +   * buffer, separated by ASCII whitespace. It effectively parses until it has a fully valid document,
    +   * then starts parsing the next document at that point. (It does this with more parallelism and
    +   * lookahead than you might think, though.)
    +   *
    +   * documents that consist of an object or array may omit the whitespace between them, concatenating
    +   * with no separator. Documents that consist of a single primitive (i.e. documents that are not
    +   * arrays or objects) MUST be separated with ASCII whitespace.
    +   *
    +   * The characters inside a JSON document, and between JSON documents, must be valid Unicode (UTF-8).
    +   * If there is a UTF-8 BOM, the parser skips it.
    +   *
    +   * The documents must not exceed batch_size bytes (by default 1MB) or they will fail to parse.
    +   * Setting batch_size to excessively large or excessively small values may impact negatively the
    +   * performance.
    +   *
    +   * ### REQUIRED: Buffer Padding
    +   *
    +   * The buffer must have at least SIMDJSON_PADDING extra allocated bytes. It does not matter what
    +   * those bytes are initialized to, as long as they are allocated. These bytes will be read: if you
    +   * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the
    +   * SIMDJSON_PADDING bytes to avoid runtime warnings.
    +   *
    +   * ### Threads
    +   *
    +   * When compiled with SIMDJSON_THREADS_ENABLED, this method will use a single thread under the
    +   * hood to do some lookahead.
    +   *
    +   * ### Parser Capacity
    +   *
    +   * If the parser's current capacity is less than batch_size, it will allocate enough capacity
    +   * to handle it (up to max_capacity).
    +   *
    +   * @param buf The concatenated JSON to parse.
    +   * @param len The length of the concatenated JSON.
    +   * @param batch_size The batch size to use. MUST be larger than the largest document. The sweet
    +   *                   spot is cache-related: small enough to fit in cache, yet big enough to
    +   *                   parse as many documents as possible in one tight loop.
    +   *                   Defaults to 10MB, which has been a reasonable sweet spot in our tests.
    +   * @param allow_comma_separated (defaults on false) This allows a mode where the documents are
    +   *                   separated by commas instead of whitespace. It comes with a performance
    +   *                   penalty because the entire document is indexed at once (and the document must be
    +   *                   less than 4 GB), and there is no multithreading. In this mode, the batch_size parameter
    +   *                   is effectively ignored, as it is set to at least the document size.
    +   * @return The stream, or an error. An empty input will yield 0 documents rather than an EMPTY error. Errors:
    +   *         - MEMALLOC if the parser does not have enough capacity and memory allocation fails
    +   *         - CAPACITY if the parser does not have enough capacity and batch_size > max_capacity.
    +   *         - other json errors if parsing fails. You should not rely on these errors to always the same for the
    +   *           same document: they may vary under runtime dispatch (so they may vary depending on your system and hardware).
    +   */
    +  inline simdjson_result iterate_many(const uint8_t *buf, size_t len, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */
    +  inline simdjson_result iterate_many(const char *buf, size_t len, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */
    +  inline simdjson_result iterate_many(const std::string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  inline simdjson_result iterate_many(const std::string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe
    +  /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */
    +  inline simdjson_result iterate_many(const padded_string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  inline simdjson_result iterate_many(const padded_string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe
    +
    +  /** @private We do not want to allow implicit conversion from C string to std::string. */
    +  simdjson_result iterate_many(const char *buf, size_t batch_size = DEFAULT_BATCH_SIZE) noexcept = delete;
    +
    +  /** The capacity of this parser (the largest document it can process). */
    +  simdjson_inline size_t capacity() const noexcept;
    +  /** The maximum capacity of this parser (the largest document it is allowed to process). */
    +  simdjson_inline size_t max_capacity() const noexcept;
    +  simdjson_inline void set_max_capacity(size_t max_capacity) noexcept;
    +  /**
    +   * The maximum depth of this parser (the most deeply nested objects and arrays it can process).
    +   * This parameter is only relevant when the macro SIMDJSON_DEVELOPMENT_CHECKS is set to true.
    +   * The document's instance current_depth() method should be used to monitor the parsing
    +   * depth and limit it if desired.
    +   */
    +  simdjson_inline size_t max_depth() const noexcept;
    +
    +  /**
    +   * Ensure this parser has enough memory to process JSON documents up to `capacity` bytes in length
    +   * and `max_depth` depth.
    +   *
    +   * The max_depth parameter is only relevant when the macro SIMDJSON_DEVELOPMENT_CHECKS is set to true.
    +   * The document's instance current_depth() method should be used to monitor the parsing
    +   * depth and limit it if desired.
    +   *
    +   * @param capacity The new capacity.
    +   * @param max_depth The new max_depth. Defaults to DEFAULT_MAX_DEPTH.
    +   * @return The error, if there is one.
    +   */
    +  simdjson_warn_unused error_code allocate(size_t capacity, size_t max_depth=DEFAULT_MAX_DEPTH) noexcept;
    +
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  /**
    +   * The parser instance can use threads when they are available to speed up some
    +   * operations. It is enabled by default. Changing this attribute will change the
    +   * behavior of the parser for future operations.
    +   */
    +  bool threaded{true};
    +  #endif
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc. to a user-provided buffer.
    +   * The result must be valid UTF-8.
    +   * The provided pointer is advanced to the end of the string by reference, and a string_view instance
    +   * is returned. You can ensure that your buffer is large enough by allocating a block of memory at least
    +   * as large as the input JSON plus SIMDJSON_PADDING and then unescape all strings to this one buffer.
    +   *
    +   * This unescape function is a low-level function. If you want a more user-friendly approach, you should
    +   * avoid raw_json_string instances (e.g., by calling unescaped_key() instead of key() or get_string()
    +   * instead of get_raw_json_string()).
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid as long as the bytes in dst.
    +   *
    +   * @param raw_json_string input
    +   * @param dst A pointer to a buffer at least large enough to write this string as well as
    +   *            an additional SIMDJSON_PADDING bytes.
    +   * @param allow_replacement Whether we allow a replacement if the input string contains unmatched surrogate pairs.
    +   * @return A string_view pointing at the unescaped string in dst
    +   * @error STRING_ERROR if escapes are incorrect.
    +   */
    +  simdjson_inline simdjson_result unescape(raw_json_string in, uint8_t *&dst, bool allow_replacement = false) const noexcept;
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc. to a user-provided buffer.
    +   * The result may not be valid UTF-8. See https://simonsapin.github.io/wtf-8/
    +   * The provided pointer is advanced to the end of the string by reference, and a string_view instance
    +   * is returned. You can ensure that your buffer is large enough by allocating a block of memory at least
    +   * as large as the input JSON plus SIMDJSON_PADDING and then unescape all strings to this one buffer.
    +   *
    +   * This unescape function is a low-level function. If you want a more user-friendly approach, you should
    +   * avoid raw_json_string instances (e.g., by calling unescaped_key() instead of key() or get_string()
    +   * instead of get_raw_json_string()).
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid as long as the bytes in dst.
    +   *
    +   * @param raw_json_string input
    +   * @param dst A pointer to a buffer at least large enough to write this string as well as
    +   *            an additional SIMDJSON_PADDING bytes.
    +   * @return A string_view pointing at the unescaped string in dst
    +   * @error STRING_ERROR if escapes are incorrect.
    +   */
    +  simdjson_inline simdjson_result unescape_wobbly(raw_json_string in, uint8_t *&dst) const noexcept;
    +
    +private:
    +  /** @private [for benchmarking access] The implementation to use */
    +  std::unique_ptr implementation{};
    +  size_t _capacity{0};
    +  size_t _max_capacity;
    +  size_t _max_depth{DEFAULT_MAX_DEPTH};
    +  std::unique_ptr string_buf{};
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  std::unique_ptr start_positions{};
    +#endif
    +
    +  friend class json_iterator;
    +  friend class document_stream;
    +};
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public icelake::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(icelake::ondemand::parser &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_H
    +/* end file simdjson/generic/ondemand/parser.h for icelake */
    +
    +// All other declarations
    +/* including simdjson/generic/ondemand/array.h for icelake: #include "simdjson/generic/ondemand/array.h" */
    +/* begin file simdjson/generic/ondemand/array.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +/**
    + * A forward-only JSON array.
    + */
    +class array {
    +public:
    +  /**
    +   * Create a new invalid array.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline array() noexcept = default;
    +
    +  /**
    +   * Begin array iteration.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result begin() noexcept;
    +  /**
    +   * Sentinel representing the end of the array.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result end() noexcept;
    +  /**
    +   * This method scans the array and counts the number of elements.
    +   * The count_elements method should always be called before you have begun
    +   * iterating through the array: it is expected that you are pointing at
    +   * the beginning of the array.
    +   * The runtime complexity is linear in the size of the array. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an array is empty, it is more performant to use
    +   * the is_empty() method.
    +   */
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  /**
    +   * This method scans the beginning of the array and checks whether the
    +   * array is empty.
    +   * The runtime complexity is constant time. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   */
    +  simdjson_inline simdjson_result is_empty() & noexcept;
    +  /**
    +   * Reset the iterator so that we are pointing back at the
    +   * beginning of the array. You should still consume values only once even if you
    +   * can iterate through the array more than once. If you unescape a string
    +   * within the array more than once, you have unsafe code. Note that rewinding
    +   * an array means that you may need to reparse it anew: it is not a free
    +   * operation.
    +   *
    +   * @returns true if the array contains some elements (not empty)
    +   */
    +  inline simdjson_result reset() & noexcept;
    +  /**
    +   * Get the value associated with the given JSON pointer.  We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard, interpreting the current node
    +   * as the root of its own JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"([ { "foo": { "a": [ 10, 20, 30 ] }} ])"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/0/foo/a/1") == 20
    +   *
    +   * Note that at_pointer() called on the document automatically calls the document's rewind
    +   * method between each call. It invalidates all previously accessed arrays, objects and values
    +   * that have not been consumed. Yet it is not the case when calling at_pointer on an array
    +   * instance: there is no rewind and no invalidation.
    +   *
    +   * You may only call at_pointer on an array after it has been created, but before it has
    +   * been first accessed. When calling at_pointer on an array, the pointer is advanced to
    +   * the location indicated by the JSON pointer (in case of success). It is no longer possible
    +   * to call at_pointer on the same array.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching.
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   */
    +  inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  /**
    +   * Consumes the array and returns a string_view instance corresponding to the
    +   * array as represented in JSON. It points inside the original document.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +  /**
    +   * Get the value at the given index. This function has linear-time complexity.
    +   * This function should only be called once on an array instance since the array iterator is not reset between each call.
    +   *
    +   * @return The value at the given index, or:
    +   *         - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
    +   */
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +protected:
    +  /**
    +   * Go to the end of the array, no matter where you are right now.
    +   */
    +  simdjson_inline error_code consume() noexcept;
    +
    +  /**
    +   * Begin array iteration.
    +   *
    +   * @param iter The iterator. Must be where the initial [ is expected. Will be *moved* into the
    +   *        resulting array.
    +   * @error INCORRECT_TYPE if the iterator is not at [.
    +   */
    +  static simdjson_inline simdjson_result start(value_iterator &iter) noexcept;
    +  /**
    +   * Begin array iteration from the root.
    +   *
    +   * @param iter The iterator. Must be where the initial [ is expected. Will be *moved* into the
    +   *        resulting array.
    +   * @error INCORRECT_TYPE if the iterator is not at [.
    +   * @error TAPE_ERROR if there is no closing ] at the end of the document.
    +   */
    +  static simdjson_inline simdjson_result start_root(value_iterator &iter) noexcept;
    +  /**
    +   * Begin array iteration.
    +   *
    +   * This version of the method should be called after the initial [ has been verified, and is
    +   * intended for use by switch statements that check the type of a value.
    +   *
    +   * @param iter The iterator. Must be after the initial [. Will be *moved* into the resulting array.
    +   */
    +  static simdjson_inline simdjson_result started(value_iterator &iter) noexcept;
    +
    +  /**
    +   * Create an array at the given Internal array creation. Call array::start() or array::started() instead of this.
    +   *
    +   * @param iter The iterator. Must either be at the start of the first element with iter.is_alive()
    +   *        == true, or past the [] with is_alive() == false if the array is empty. Will be *moved*
    +   *        into the resulting array.
    +   */
    +  simdjson_inline array(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Iterator marking current position.
    +   *
    +   * iter.is_alive() == false indicates iteration is complete.
    +   */
    +  value_iterator iter{};
    +
    +  friend class value;
    +  friend class document;
    +  friend struct simdjson_result;
    +  friend struct simdjson_result;
    +  friend class array_iterator;
    +};
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public icelake::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(icelake::ondemand::array &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result begin() noexcept;
    +  simdjson_inline simdjson_result end() noexcept;
    +  inline simdjson_result count_elements() & noexcept;
    +  inline simdjson_result is_empty() & noexcept;
    +  inline simdjson_result reset() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_H
    +/* end file simdjson/generic/ondemand/array.h for icelake */
    +/* including simdjson/generic/ondemand/array_iterator.h for icelake: #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* begin file simdjson/generic/ondemand/array_iterator.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +/**
    + * A forward-only JSON array.
    + *
    + * This is an input_iterator, meaning:
    + * - It is forward-only
    + * - * must be called exactly once per element.
    + * - ++ must be called exactly once in between each * (*, ++, *, ++, * ...)
    + */
    +class array_iterator {
    +public:
    +  /** Create a new, invalid array iterator. */
    +  simdjson_inline array_iterator() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  /**
    +   * Get the current element.
    +   *
    +   * Part of the std::iterator interface.
    +   */
    +  simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  /**
    +   * Check if we are at the end of the JSON.
    +   *
    +   * Part of the std::iterator interface.
    +   *
    +   * @return true if there are no more elements in the JSON array.
    +   */
    +  simdjson_inline bool operator==(const array_iterator &) const noexcept;
    +  /**
    +   * Check if there are more elements in the JSON array.
    +   *
    +   * Part of the std::iterator interface.
    +   *
    +   * @return true if there are more elements in the JSON array.
    +   */
    +  simdjson_inline bool operator!=(const array_iterator &) const noexcept;
    +  /**
    +   * Move to the next element.
    +   *
    +   * Part of the std::iterator interface.
    +   */
    +  simdjson_inline array_iterator &operator++() noexcept;
    +
    +private:
    +  value_iterator iter{};
    +
    +  simdjson_inline array_iterator(const value_iterator &iter) noexcept;
    +
    +  friend class array;
    +  friend class value;
    +  friend struct simdjson_result;
    +};
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public icelake::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(icelake::ondemand::array_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  simdjson_inline bool operator==(const simdjson_result &) const noexcept;
    +  simdjson_inline bool operator!=(const simdjson_result &) const noexcept;
    +  simdjson_inline simdjson_result &operator++() noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H
    +/* end file simdjson/generic/ondemand/array_iterator.h for icelake */
    +/* including simdjson/generic/ondemand/document.h for icelake: #include "simdjson/generic/ondemand/document.h" */
    +/* begin file simdjson/generic/ondemand/document.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +/**
    + * A JSON document. It holds a json_iterator instance.
    + *
    + * Used by tokens to get text, and string buffer location.
    + *
    + * You must keep the document around during iteration.
    + */
    +class document {
    +public:
    +  /**
    +   * Create a new invalid document.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline document() noexcept = default;
    +  simdjson_inline document(const document &other) noexcept = delete; // pass your documents by reference, not by copy
    +  simdjson_inline document(document &&other) noexcept = default;
    +  simdjson_inline document &operator=(const document &other) noexcept = delete;
    +  simdjson_inline document &operator=(document &&other) noexcept = default;
    +
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @returns INCORRECT_TYPE If the JSON value is not an array.
    +   */
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   */
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  /**
    +   * Cast this JSON value (inside string) to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  /**
    +   * Cast this JSON value (inside string) to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a double.
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Important: Calling get_string() twice on the same document is an error.
    +   *
    +   * @param Whether to allow a replacement character for unmatched surrogate pairs.
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  /**
    +   * Attempts to fill the provided std::string reference with the parsed value of the current string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Important: a value should be consumed once. Calling get_string() twice on the same value
    +   * is an error.
    +   *
    +   * Performance: This method may be slower than get_string() or get_string(bool) because it may need to allocate memory.
    +   * We recommend you avoid allocating an std::string unless you need to.
    +   *
    +   * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS.
    +   */
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is not guaranteed to be valid UTF-8. See https://simonsapin.github.io/wtf-8/
    +   *
    +   * Important: Calling get_wobbly_string() twice on the same document is an error.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @returns INCORRECT_TYPE if the JSON value is not true or false.
    +   */
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  /**
    +   * Cast this JSON value to a value when the document is an object or an array.
    +   *
    +   * You must not have begun iterating through the object or array. When
    +   * SIMDJSON_DEVELOPMENT_CHECKS is set to 1 (which is the case when building in Debug mode
    +   * by default), and you have already begun iterating,
    +   * you will get an OUT_OF_ORDER_ITERATION error. If you have begun iterating, you can use
    +   * rewind() to reset the document to its initial state before calling this method.
    +   *
    +   * @returns A value if a JSON array or object cannot be found.
    +   * @returns SCALAR_DOCUMENT_AS_VALUE error is the document is a scalar (see is_scalar() function).
    +   */
    +  simdjson_inline simdjson_result get_value() noexcept;
    +
    +  /**
    +   * Checks if this JSON value is null.  If and only if the value is
    +   * null, then it is consumed (we advance). If we find a token that
    +   * begins with 'n' but is not 'null', then an error is returned.
    +   *
    +   * @returns Whether the value is null.
    +   * @returns INCORRECT_TYPE If the JSON value begins with 'n' and is not 'null'.
    +   */
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool
    +   *
    +   * You may use get_double(), get_bool(), get_uint64(), get_int64(),
    +   * get_object(), get_array(), get_raw_json_string(), or get_string() instead.
    +   *
    +   * @returns A value of the given type, parsed from the JSON.
    +   * @returns INCORRECT_TYPE If the JSON value is not the given type.
    +   */
    +  template simdjson_inline simdjson_result get() & noexcept {
    +    // Unless the simdjson library provides an inline implementation, calling this method should
    +    // immediately fail.
    +    static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. "
    +      "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
    +      "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), "
    +      " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template.");
    +  }
    +  /** @overload template simdjson_result get() & noexcept */
    +  template simdjson_inline simdjson_result get() && noexcept {
    +    // Unless the simdjson library provides an inline implementation, calling this method should
    +    // immediately fail.
    +    static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. "
    +      "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
    +      "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), "
    +      " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template.");
    +  }
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool, value
    +   *
    +   * Be mindful that the document instance must remain in scope while you are accessing object, array and value instances.
    +   *
    +   * @param out This is set to a value of the given type, parsed from the JSON. If there is an error, this may not be initialized.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   * @returns SUCCESS If the parse succeeded and the out parameter was set to the value.
    +   */
    +  template simdjson_inline error_code get(T &out) & noexcept;
    +  /** @overload template error_code get(T &out) & noexcept */
    +  template simdjson_inline error_code get(T &out) && noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an array.
    +   */
    +  simdjson_inline operator array() & noexcept(false);
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an object.
    +   */
    +  simdjson_inline operator object() & noexcept(false);
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline operator int64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline operator double() noexcept(false);
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator raw_json_string() noexcept(false);
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not true or false.
    +   */
    +  simdjson_inline operator bool() noexcept(false);
    +  /**
    +   * Cast this JSON value to a value when the document is an object or an array.
    +   *
    +   * You must not have begun iterating through the object or array. When
    +   * SIMDJSON_DEVELOPMENT_CHECKS is defined, and you have already begun iterating,
    +   * you will get an OUT_OF_ORDER_ITERATION error. If you have begun iterating, you can use
    +   * rewind() to reset the document to its initial state before calling this method.
    +   *
    +   * @returns A value value if a JSON array or object cannot be found.
    +   * @exception SCALAR_DOCUMENT_AS_VALUE error is the document is a scalar (see is_scalar() function).
    +   */
    +  simdjson_inline operator value() noexcept(false);
    +#endif
    +  /**
    +   * This method scans the array and counts the number of elements.
    +   * The count_elements method should always be called before you have begun
    +   * iterating through the array: it is expected that you are pointing at
    +   * the beginning of the array.
    +   * The runtime complexity is linear in the size of the array. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   */
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +   /**
    +   * This method scans the object and counts the number of key-value pairs.
    +   * The count_fields method should always be called before you have begun
    +   * iterating through the object: it is expected that you are pointing at
    +   * the beginning of the object.
    +   * The runtime complexity is linear in the size of the object. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an object is empty, it is more performant to use
    +   * the is_empty() method.
    +   */
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  /**
    +   * Get the value at the given index in the array. This function has linear-time complexity.
    +   * This function should only be called once on an array instance since the array iterator is not reset between each call.
    +   *
    +   * @return The value at the given index, or:
    +   *         - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
    +   */
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  /**
    +   * Begin array iteration.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  /**
    +   * Sentinel representing the end of the array.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result end() & noexcept;
    +
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   *
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. E.g., the array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to
    +   * a key a single time. Doing object["mykey"].to_string()and then again object["mykey"].to_string()
    +   * is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. E.g., the array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to a key
    +   * a single time. Doing object["mykey"].to_string() and then again object["mykey"].to_string()
    +   * is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +
    +  /**
    +   * Get the type of this JSON value. It does not validate or consume the value.
    +   * E.g., you must still call "is_null()" to check that a value is null even if
    +   * "type()" returns json_type::null.
    +   *
    +   * NOTE: If you're only expecting a value to be one type (a typical case), it's generally
    +   * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just
    +   * let it throw an exception).
    +   *
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result type() noexcept;
    +
    +  /**
    +   * Checks whether the document is a scalar (string, number, null, Boolean).
    +   * Returns false when there it is an array or object.
    +   *
    +   * @returns true if the type is string, number, null, Boolean
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +
    +  /**
    +   * Checks whether the document is a negative number.
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline bool is_negative() noexcept;
    +  /**
    +   * Checks whether the document is an integer number. Note that
    +   * this requires to partially parse the number string. If
    +   * the value is determined to be an integer, it may still
    +   * not parse properly as an integer in subsequent steps
    +   * (e.g., it might overflow).
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  /**
    +   * Determine the number type (integer or floating-point number) as quickly
    +   * as possible. This function does not fully validate the input. It is
    +   * useful when you only need to classify the numbers, without parsing them.
    +   *
    +   * If you are planning to retrieve the value or you need full validation,
    +   * consider using the get_number() method instead: it will fully parse
    +   * and validate the input, and give you access to the type:
    +   * get_number().get_number_type().
    +   *
    +   * get_number_type() is number_type::unsigned_integer if we have
    +   * an integer greater or equal to 9223372036854775808
    +   * get_number_type() is number_type::signed_integer if we have an
    +   * integer that is less than 9223372036854775808
    +   * Otherwise, get_number_type() has value number_type::floating_point_number
    +   *
    +   * This function requires processing the number string, but it is expected
    +   * to be faster than get_number().get_number_type() because it is does not
    +   * parse the number value.
    +   *
    +   * @returns the type of the number
    +   */
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +
    +  /**
    +   * Attempt to parse an ondemand::number. An ondemand::number may
    +   * contain an integer value or a floating-point value, the simdjson
    +   * library will autodetect the type. Thus it is a dynamically typed
    +   * number. Before accessing the value, you must determine the detected
    +   * type.
    +   *
    +   * number.get_number_type() is number_type::signed_integer if we have
    +   * an integer in [-9223372036854775808,9223372036854775808)
    +   * You can recover the value by calling number.get_int64() and you
    +   * have that number.is_int64() is true.
    +   *
    +   * number.get_number_type() is number_type::unsigned_integer if we have
    +   * an integer in [9223372036854775808,18446744073709551616)
    +   * You can recover the value by calling number.get_uint64() and you
    +   * have that number.is_uint64() is true.
    +   *
    +   * Otherwise, number.get_number_type() has value number_type::floating_point_number
    +   * and we have a binary64 number.
    +   * You can recover the value by calling number.get_double() and you
    +   * have that number.is_double() is true.
    +   *
    +   * You must check the type before accessing the value: it is an error
    +   * to call "get_int64()" when number.get_number_type() is not
    +   * number_type::signed_integer and when number.is_int64() is false.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept;
    +
    +  /**
    +   * Get the raw JSON for this token.
    +   *
    +   * The string_view will always point into the input buffer.
    +   *
    +   * The string_view will start at the beginning of the token, and include the entire token
    +   * *as well as all spaces until the next token (or EOF).* This means, for example, that a
    +   * string token always begins with a " and is always terminated by the final ", possibly
    +   * followed by a number of spaces.
    +   *
    +   * The string_view is *not* null-terminated. If this is a scalar (string, number,
    +   * boolean, or null), the character after the end of the string_view may be the padded buffer.
    +   *
    +   * Tokens include:
    +   * - {
    +   * - [
    +   * - "a string (possibly with UTF-8 or backslashed characters like \\\")".
    +   * - -1.2e-100
    +   * - true
    +   * - false
    +   * - null
    +   */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +
    +  /**
    +   * Reset the iterator inside the document instance so we are pointing back at the
    +   * beginning of the document, as if it had just been created. It invalidates all
    +   * values, objects and arrays that you have created so far (including unescaped strings).
    +   */
    +  inline void rewind() noexcept;
    +  /**
    +   * Returns debugging information.
    +   */
    +  inline std::string to_debug_string() noexcept;
    +  /**
    +   * Some unrecoverable error conditions may render the document instance unusable.
    +   * The is_alive() method returns true when the document is still suitable.
    +   */
    +  inline bool is_alive() noexcept;
    +
    +  /**
    +   * Returns the current location in the document if in bounds.
    +   */
    +  inline simdjson_result current_location() const noexcept;
    +
    +  /**
    +   * Returns true if this document has been fully parsed.
    +   * If you have consumed the whole document and at_end() returns
    +   * false, then there may be trailing content.
    +   */
    +  inline bool at_end() const noexcept;
    +
    +  /**
    +   * Returns the current depth in the document if in bounds.
    +   *
    +   * E.g.,
    +   *  0 = finished with document
    +   *  1 = document root value (could be [ or {, not yet known)
    +   *  2 = , or } inside root array/object
    +   *  3 = key or value inside root array/object.
    +   */
    +  simdjson_inline int32_t current_depth() const noexcept;
    +
    +  /**
    +   * Get the value associated with the given JSON pointer.  We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/foo/a/1") == 20
    +   *
    +   * It is allowed for a key to be the empty string:
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("//a/1") == 20
    +   *
    +   * Note that at_pointer() automatically calls rewind between each call. Thus
    +   * all values, objects and arrays that you have created so far (including unescaped strings)
    +   * are invalidated. After calling at_pointer, you need to consume the result: string values
    +   * should be stored in your own variables, arrays should be decoded and stored in your own array-like
    +   * structures and so forth.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   *         - SCALAR_DOCUMENT_AS_VALUE if the json_pointer is empty and the document is not a scalar (see is_scalar() function).
    +   */
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  /**
    +   * Consumes the document and returns a string_view instance corresponding to the
    +   * document as represented in JSON. It points inside the original byte array containing
    +   * the JSON document.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +protected:
    +  /**
    +   * Consumes the document.
    +   */
    +  simdjson_inline error_code consume() noexcept;
    +
    +  simdjson_inline document(ondemand::json_iterator &&iter) noexcept;
    +  simdjson_inline const uint8_t *text(uint32_t idx) const noexcept;
    +
    +  simdjson_inline value_iterator resume_value_iterator() noexcept;
    +  simdjson_inline value_iterator get_root_value_iterator() noexcept;
    +  simdjson_inline simdjson_result start_or_resume_object() noexcept;
    +  static simdjson_inline document start(ondemand::json_iterator &&iter) noexcept;
    +
    +  //
    +  // Fields
    +  //
    +  json_iterator iter{}; ///< Current position in the document
    +  static constexpr depth_t DOCUMENT_DEPTH = 0; ///< document depth is always 0
    +
    +  friend class array_iterator;
    +  friend class value;
    +  friend class ondemand::parser;
    +  friend class object;
    +  friend class array;
    +  friend class field;
    +  friend class token;
    +  friend class document_stream;
    +  friend class document_reference;
    +};
    +
    +
    +/**
    + * A document_reference is a thin wrapper around a document reference instance.
    + */
    +class document_reference {
    +public:
    +  simdjson_inline document_reference() noexcept;
    +  simdjson_inline document_reference(document &d) noexcept;
    +  simdjson_inline document_reference(const document_reference &other) noexcept = default;
    +  simdjson_inline document_reference& operator=(const document_reference &other) noexcept = default;
    +  simdjson_inline void rewind() noexcept;
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result get_value() noexcept;
    +
    +  simdjson_inline simdjson_result is_null() noexcept;
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +  simdjson_inline operator document&() const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator array() & noexcept(false);
    +  simdjson_inline operator object() & noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +  simdjson_inline operator value() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  simdjson_inline int32_t current_depth() const noexcept;
    +  simdjson_inline bool is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +private:
    +  document *doc{nullptr};
    +};
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public icelake::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(icelake::ondemand::document &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline error_code rewind() noexcept;
    +
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result get_value() noexcept;
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +  template simdjson_inline simdjson_result get() & noexcept;
    +  template simdjson_inline simdjson_result get() && noexcept;
    +
    +  template simdjson_inline error_code get(T &out) & noexcept;
    +  template simdjson_inline error_code get(T &out) && noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator icelake::ondemand::array() & noexcept(false);
    +  simdjson_inline operator icelake::ondemand::object() & noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator icelake::ondemand::raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +  simdjson_inline operator icelake::ondemand::value() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  simdjson_inline int32_t current_depth() const noexcept;
    +  simdjson_inline bool at_end() const noexcept;
    +  simdjson_inline bool is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +  /** @copydoc simdjson_inline std::string_view document::raw_json_token() const noexcept */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +};
    +
    +
    +} // namespace simdjson
    +
    +
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public icelake::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(icelake::ondemand::document_reference value, error_code error) noexcept;
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline error_code rewind() noexcept;
    +
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result get_value() noexcept;
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator icelake::ondemand::array() & noexcept(false);
    +  simdjson_inline operator icelake::ondemand::object() & noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator icelake::ondemand::raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +  simdjson_inline operator icelake::ondemand::value() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  simdjson_inline simdjson_result current_depth() const noexcept;
    +  simdjson_inline simdjson_result is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +  /** @copydoc simdjson_inline std::string_view document_reference::raw_json_token() const noexcept */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +};
    +
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H
    +/* end file simdjson/generic/ondemand/document.h for icelake */
    +/* including simdjson/generic/ondemand/document_stream.h for icelake: #include "simdjson/generic/ondemand/document_stream.h" */
    +/* begin file simdjson/generic/ondemand/document_stream.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +#include 
    +#include 
    +#include 
    +#endif
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +/** @private Custom worker class **/
    +struct stage1_worker {
    +  stage1_worker() noexcept = default;
    +  stage1_worker(const stage1_worker&) = delete;
    +  stage1_worker(stage1_worker&&) = delete;
    +  stage1_worker operator=(const stage1_worker&) = delete;
    +  ~stage1_worker();
    +  /**
    +   * We only start the thread when it is needed, not at object construction, this may throw.
    +   * You should only call this once.
    +   **/
    +  void start_thread();
    +  /**
    +   * Start a stage 1 job. You should first call 'run', then 'finish'.
    +   * You must call start_thread once before.
    +   */
    +  void run(document_stream * ds, parser * stage1, size_t next_batch_start);
    +  /** Wait for the run to finish (blocking). You should first call 'run', then 'finish'. **/
    +  void finish();
    +
    +private:
    +
    +  /**
    +   * Normally, we would never stop the thread. But we do in the destructor.
    +   * This function is only safe assuming that you are not waiting for results. You
    +   * should have called run, then finish, and be done.
    +   **/
    +  void stop_thread();
    +
    +  std::thread thread{};
    +  /** These three variables define the work done by the thread. **/
    +  ondemand::parser * stage1_thread_parser{};
    +  size_t _next_batch_start{};
    +  document_stream * owner{};
    +  /**
    +   * We have two state variables. This could be streamlined to one variable in the future but
    +   * we use two for clarity.
    +   */
    +  bool has_work{false};
    +  bool can_work{true};
    +
    +  /**
    +   * We lock using a mutex.
    +   */
    +  std::mutex locking_mutex{};
    +  std::condition_variable cond_var{};
    +
    +  friend class document_stream;
    +};
    +#endif  // SIMDJSON_THREADS_ENABLED
    +
    +/**
    + * A forward-only stream of documents.
    + *
    + * Produced by parser::iterate_many.
    + *
    + */
    +class document_stream {
    +public:
    +  /**
    +   * Construct an uninitialized document_stream.
    +   *
    +   *  ```c++
    +   *  document_stream docs;
    +   *  auto error = parser.iterate_many(json).get(docs);
    +   *  ```
    +   */
    +  simdjson_inline document_stream() noexcept;
    +  /** Move one document_stream to another. */
    +  simdjson_inline document_stream(document_stream &&other) noexcept = default;
    +  /** Move one document_stream to another. */
    +  simdjson_inline document_stream &operator=(document_stream &&other) noexcept = default;
    +
    +  simdjson_inline ~document_stream() noexcept;
    +
    +  /**
    +   * Returns the input size in bytes.
    +   */
    +  inline size_t size_in_bytes() const noexcept;
    +
    +  /**
    +   * After iterating through the stream, this method
    +   * returns the number of bytes that were not parsed at the end
    +   * of the stream. If truncated_bytes() differs from zero,
    +   * then the input was truncated maybe because incomplete JSON
    +   * documents were found at the end of the stream. You
    +   * may need to process the bytes in the interval [size_in_bytes()-truncated_bytes(), size_in_bytes()).
    +   *
    +   * You should only call truncated_bytes() after streaming through all
    +   * documents, like so:
    +   *
    +   *   document_stream stream = parser.iterate_many(json,window);
    +   *   for(auto & doc : stream) {
    +   *      // do something with doc
    +   *   }
    +   *   size_t truncated = stream.truncated_bytes();
    +   *
    +   */
    +  inline size_t truncated_bytes() const noexcept;
    +
    +  class iterator {
    +  public:
    +    using value_type = simdjson_result;
    +    using reference  = value_type;
    +
    +    using difference_type   = std::ptrdiff_t;
    +
    +    using iterator_category = std::input_iterator_tag;
    +
    +    /**
    +     * Default constructor.
    +     */
    +    simdjson_inline iterator() noexcept;
    +    /**
    +     * Get the current document (or error).
    +     */
    +    simdjson_inline simdjson_result operator*() noexcept;
    +    /**
    +     * Advance to the next document (prefix).
    +     */
    +    inline iterator& operator++() noexcept;
    +    /**
    +     * Check if we're at the end yet.
    +     * @param other the end iterator to compare to.
    +     */
    +    simdjson_inline bool operator!=(const iterator &other) const noexcept;
    +    /**
    +     * @private
    +     *
    +     * Gives the current index in the input document in bytes.
    +     *
    +     *   document_stream stream = parser.parse_many(json,window);
    +     *   for(auto i = stream.begin(); i != stream.end(); ++i) {
    +     *      auto doc = *i;
    +     *      size_t index = i.current_index();
    +     *   }
    +     *
    +     * This function (current_index()) is experimental and the usage
    +     * may change in future versions of simdjson: we find the API somewhat
    +     * awkward and we would like to offer something friendlier.
    +     */
    +     simdjson_inline size_t current_index() const noexcept;
    +
    +     /**
    +     * @private
    +     *
    +     * Gives a view of the current document at the current position.
    +     *
    +     *   document_stream stream = parser.iterate_many(json,window);
    +     *   for(auto i = stream.begin(); i != stream.end(); ++i) {
    +     *      std::string_view v = i.source();
    +     *   }
    +     *
    +     * The returned string_view instance is simply a map to the (unparsed)
    +     * source string: it may thus include white-space characters and all manner
    +     * of padding.
    +     *
    +     * This function (source()) is experimental and the usage
    +     * may change in future versions of simdjson: we find the API somewhat
    +     * awkward and we would like to offer something friendlier.
    +     *
    +     */
    +     simdjson_inline std::string_view source() const noexcept;
    +
    +    /**
    +     * Returns error of the stream (if any).
    +     */
    +     inline error_code error() const noexcept;
    +
    +  private:
    +    simdjson_inline iterator(document_stream *s, bool finished) noexcept;
    +    /** The document_stream we're iterating through. */
    +    document_stream* stream;
    +    /** Whether we're finished or not. */
    +    bool finished;
    +
    +    friend class document;
    +    friend class document_stream;
    +    friend class json_iterator;
    +  };
    +
    +  /**
    +   * Start iterating the documents in the stream.
    +   */
    +  simdjson_inline iterator begin() noexcept;
    +  /**
    +   * The end of the stream, for iterator comparison purposes.
    +   */
    +  simdjson_inline iterator end() noexcept;
    +
    +private:
    +
    +  document_stream &operator=(const document_stream &) = delete; // Disallow copying
    +  document_stream(const document_stream &other) = delete; // Disallow copying
    +
    +  /**
    +   * Construct a document_stream. Does not allocate or parse anything until the iterator is
    +   * used.
    +   *
    +   * @param parser is a reference to the parser instance used to generate this document_stream
    +   * @param buf is the raw byte buffer we need to process
    +   * @param len is the length of the raw byte buffer in bytes
    +   * @param batch_size is the size of the windows (must be strictly greater or equal to the largest JSON document)
    +   */
    +  simdjson_inline document_stream(
    +    ondemand::parser &parser,
    +    const uint8_t *buf,
    +    size_t len,
    +    size_t batch_size,
    +    bool allow_comma_separated
    +  ) noexcept;
    +
    +  /**
    +   * Parse the first document in the buffer. Used by begin(), to handle allocation and
    +   * initialization.
    +   */
    +  inline void start() noexcept;
    +
    +  /**
    +   * Parse the next document found in the buffer previously given to document_stream.
    +   *
    +   * The content should be a valid JSON document encoded as UTF-8. If there is a
    +   * UTF-8 BOM, the parser skips it.
    +   *
    +   * You do NOT need to pre-allocate a parser.  This function takes care of
    +   * pre-allocating a capacity defined by the batch_size defined when creating the
    +   * document_stream object.
    +   *
    +   * The function returns simdjson::EMPTY if there is no more data to be parsed.
    +   *
    +   * The function returns simdjson::SUCCESS (as integer = 0) in case of success
    +   * and indicates that the buffer has successfully been parsed to the end.
    +   * Every document it contained has been parsed without error.
    +   *
    +   * The function returns an error code from simdjson/simdjson.h in case of failure
    +   * such as simdjson::CAPACITY, simdjson::MEMALLOC, simdjson::DEPTH_ERROR and so forth;
    +   * the simdjson::error_message function converts these error codes into a string).
    +   *
    +   * You can also check validity by calling parser.is_valid(). The same parser can
    +   * and should be reused for the other documents in the buffer.
    +   */
    +  inline void next() noexcept;
    +
    +  /** Move the json_iterator of the document to the location of the next document in the stream. */
    +  inline void next_document() noexcept;
    +
    +  /** Get the next document index. */
    +  inline size_t next_batch_start() const noexcept;
    +
    +  /** Pass the next batch through stage 1 with the given parser. */
    +  inline error_code run_stage1(ondemand::parser &p, size_t batch_start) noexcept;
    +
    +  // Fields
    +  ondemand::parser *parser;
    +  const uint8_t *buf;
    +  size_t len;
    +  size_t batch_size;
    +  bool allow_comma_separated;
    +  /**
    +   * We are going to use just one document instance. The document owns
    +   * the json_iterator. It implies that we only ever pass a reference
    +   * to the document to the users.
    +   */
    +  document doc{};
    +  /** The error (or lack thereof) from the current document. */
    +  error_code error;
    +  size_t batch_start{0};
    +  size_t doc_index{};
    +
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  /** Indicates whether we use threads. Note that this needs to be a constant during the execution of the parsing. */
    +  bool use_thread;
    +
    +  inline void load_from_stage1_thread() noexcept;
    +
    +  /** Start a thread to run stage 1 on the next batch. */
    +  inline void start_stage1_thread() noexcept;
    +
    +  /** Wait for the stage 1 thread to finish and capture the results. */
    +  inline void finish_stage1_thread() noexcept;
    +
    +  /** The error returned from the stage 1 thread. */
    +  error_code stage1_thread_error{UNINITIALIZED};
    +  /** The thread used to run stage 1 against the next batch in the background. */
    +  std::unique_ptr worker{new(std::nothrow) stage1_worker()};
    +  /**
    +   * The parser used to run stage 1 in the background. Will be swapped
    +   * with the regular parser when finished.
    +   */
    +  ondemand::parser stage1_thread_parser{};
    +
    +  friend struct stage1_worker;
    +  #endif // SIMDJSON_THREADS_ENABLED
    +
    +  friend class parser;
    +  friend class document;
    +  friend class json_iterator;
    +  friend struct simdjson_result;
    +  friend struct internal::simdjson_result_base;
    +};  // document_stream
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +template<>
    +struct simdjson_result : public icelake::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(icelake::ondemand::document_stream &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H
    +/* end file simdjson/generic/ondemand/document_stream.h for icelake */
    +/* including simdjson/generic/ondemand/field.h for icelake: #include "simdjson/generic/ondemand/field.h" */
    +/* begin file simdjson/generic/ondemand/field.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_FIELD_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +/**
    + * A JSON field (key/value pair) in an object.
    + *
    + * Returned from object iteration.
    + *
    + * Extends from std::pair so you can use C++ algorithms that rely on pairs.
    + */
    +class field : public std::pair {
    +public:
    +  /**
    +   * Create a new invalid field.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline field() noexcept;
    +
    +  /**
    +   * Get the key as a string_view (for higher speed, consider raw_key).
    +   * We deliberately use a more cumbersome name (unescaped_key) to force users
    +   * to think twice about using it.
    +   *
    +   * This consumes the key: once you have called unescaped_key(), you cannot
    +   * call it again nor can you call key().
    +   */
    +  simdjson_inline simdjson_warn_unused simdjson_result unescaped_key(bool allow_replacement) noexcept;
    +  /**
    +   * Get the key as a raw_json_string. Can be used for direct comparison with
    +   * an unescaped C string: e.g., key() == "test".
    +   */
    +  simdjson_inline raw_json_string key() const noexcept;
    +  /**
    +   * Get the field value.
    +   */
    +  simdjson_inline ondemand::value &value() & noexcept;
    +  /**
    +   * @overload ondemand::value &ondemand::value() & noexcept
    +   */
    +  simdjson_inline ondemand::value value() && noexcept;
    +
    +protected:
    +  simdjson_inline field(raw_json_string key, ondemand::value &&value) noexcept;
    +  static simdjson_inline simdjson_result start(value_iterator &parent_iter) noexcept;
    +  static simdjson_inline simdjson_result start(const value_iterator &parent_iter, raw_json_string key) noexcept;
    +  friend struct simdjson_result;
    +  friend class object_iterator;
    +};
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public icelake::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(icelake::ondemand::field &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result unescaped_key(bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result key() noexcept;
    +  simdjson_inline simdjson_result value() noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_H
    +/* end file simdjson/generic/ondemand/field.h for icelake */
    +/* including simdjson/generic/ondemand/object.h for icelake: #include "simdjson/generic/ondemand/object.h" */
    +/* begin file simdjson/generic/ondemand/object.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +/**
    + * A forward-only JSON object field iterator.
    + */
    +class object {
    +public:
    +  /**
    +   * Create a new invalid object.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline object() noexcept = default;
    +
    +  simdjson_inline simdjson_result begin() noexcept;
    +  simdjson_inline simdjson_result end() noexcept;
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +   *
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. The value instance you get
    +   * from  `content["bids"]` becomes invalid when you call `content["asks"]`. The array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to a
    +   * key a single time. Doing object["mykey"].to_string() and then again object["mykey"].to_string()
    +   * is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field(std::string_view key) && noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. The value instance you get
    +   * from  `content["bids"]` becomes invalid when you call `content["asks"]`. The array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to a key
    +   * a single time. Doing object["mykey"].to_string() and then again object["mykey"].to_string() is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) && noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) && noexcept;
    +
    +  /**
    +   * Get the value associated with the given JSON pointer. We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard, interpreting the current node
    +   * as the root of its own JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/foo/a/1") == 20
    +   *
    +   * It is allowed for a key to be the empty string:
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("//a/1") == 20
    +   *
    +   * Note that at_pointer() called on the document automatically calls the document's rewind
    +   * method between each call. It invalidates all previously accessed arrays, objects and values
    +   * that have not been consumed. Yet it is not the case when calling at_pointer on an object
    +   * instance: there is no rewind and no invalidation.
    +   *
    +   * You may call at_pointer more than once on an object, but each time the pointer is advanced
    +   * to be within the value matched by the key indicated by the JSON pointer query. Thus any preceding
    +   * key (as well as the current key) can no longer be used with following JSON pointer calls.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching.
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   */
    +  inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +
    +  /**
    +   * Reset the iterator so that we are pointing back at the
    +   * beginning of the object. You should still consume values only once even if you
    +   * can iterate through the object more than once. If you unescape a string within
    +   * the object more than once, you have unsafe code. Note that rewinding an object
    +   * means that you may need to reparse it anew: it is not a free operation.
    +   *
    +   * @returns true if the object contains some elements (not empty)
    +   */
    +  inline simdjson_result reset() & noexcept;
    +  /**
    +   * This method scans the beginning of the object and checks whether the
    +   * object is empty.
    +   * The runtime complexity is constant time. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   */
    +  inline simdjson_result is_empty() & noexcept;
    +  /**
    +   * This method scans the object and counts the number of key-value pairs.
    +   * The count_fields method should always be called before you have begun
    +   * iterating through the object: it is expected that you are pointing at
    +   * the beginning of the object.
    +   * The runtime complexity is linear in the size of the object. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an object is empty, it is more performant to use
    +   * the is_empty() method.
    +   *
    +   * Performance hint: You should only call count_fields() as a last
    +   * resort as it may require scanning the document twice or more.
    +   */
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  /**
    +   * Consumes the object and returns a string_view instance corresponding to the
    +   * object as represented in JSON. It points inside the original byte array containing
    +   * the JSON document.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +protected:
    +  /**
    +   * Go to the end of the object, no matter where you are right now.
    +   */
    +  simdjson_inline error_code consume() noexcept;
    +  static simdjson_inline simdjson_result start(value_iterator &iter) noexcept;
    +  static simdjson_inline simdjson_result start_root(value_iterator &iter) noexcept;
    +  static simdjson_inline simdjson_result started(value_iterator &iter) noexcept;
    +  static simdjson_inline object resume(const value_iterator &iter) noexcept;
    +  simdjson_inline object(const value_iterator &iter) noexcept;
    +
    +  simdjson_warn_unused simdjson_inline error_code find_field_raw(const std::string_view key) noexcept;
    +
    +  value_iterator iter{};
    +
    +  friend class value;
    +  friend class document;
    +  friend struct simdjson_result;
    +};
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public icelake::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(icelake::ondemand::object &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result begin() noexcept;
    +  simdjson_inline simdjson_result end() noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) && noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) && noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) && noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  inline simdjson_result reset() noexcept;
    +  inline simdjson_result is_empty() noexcept;
    +  inline simdjson_result count_fields() & noexcept;
    +  inline simdjson_result raw_json() noexcept;
    +
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_H
    +/* end file simdjson/generic/ondemand/object.h for icelake */
    +/* including simdjson/generic/ondemand/object_iterator.h for icelake: #include "simdjson/generic/ondemand/object_iterator.h" */
    +/* begin file simdjson/generic/ondemand/object_iterator.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +class object_iterator {
    +public:
    +  /**
    +   * Create a new invalid object_iterator.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline object_iterator() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  // Reads key and value, yielding them to the user.
    +  // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  simdjson_inline simdjson_result operator*() noexcept;
    +  // Assumes it's being compared with the end. true if depth < iter->depth.
    +  simdjson_inline bool operator==(const object_iterator &) const noexcept;
    +  // Assumes it's being compared with the end. true if depth >= iter->depth.
    +  simdjson_inline bool operator!=(const object_iterator &) const noexcept;
    +  // Checks for ']' and ','
    +  simdjson_inline object_iterator &operator++() noexcept;
    +
    +private:
    +  /**
    +   * The underlying JSON iterator.
    +   *
    +   * PERF NOTE: expected to be elided in favor of the parent document: this is set when the object
    +   * is first used, and never changes afterwards.
    +   */
    +  value_iterator iter{};
    +
    +  simdjson_inline object_iterator(const value_iterator &iter) noexcept;
    +  friend struct simdjson_result;
    +  friend class object;
    +};
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public icelake::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(icelake::ondemand::object_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  // Reads key and value, yielding them to the user.
    +  simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  // Assumes it's being compared with the end. true if depth < iter->depth.
    +  simdjson_inline bool operator==(const simdjson_result &) const noexcept;
    +  // Assumes it's being compared with the end. true if depth >= iter->depth.
    +  simdjson_inline bool operator!=(const simdjson_result &) const noexcept;
    +  // Checks for ']' and ','
    +  simdjson_inline simdjson_result &operator++() noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H
    +/* end file simdjson/generic/ondemand/object_iterator.h for icelake */
    +/* including simdjson/generic/ondemand/serialization.h for icelake: #include "simdjson/generic/ondemand/serialization.h" */
    +/* begin file simdjson/generic/ondemand/serialization.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +/**
    + * Create a string-view instance out of a document instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(icelake::ondemand::document& x) noexcept;
    +/**
    + * Create a string-view instance out of a value instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. The value must
    + * not have been accessed previously. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(icelake::ondemand::value& x) noexcept;
    +/**
    + * Create a string-view instance out of an object instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(icelake::ondemand::object& x) noexcept;
    +/**
    + * Create a string-view instance out of an array instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(icelake::ondemand::array& x) noexcept;
    +inline simdjson_result to_json_string(simdjson_result x);
    +inline simdjson_result to_json_string(simdjson_result x);
    +inline simdjson_result to_json_string(simdjson_result x);
    +inline simdjson_result to_json_string(simdjson_result x);
    +} // namespace simdjson
    +
    +/**
    + * We want to support argument-dependent lookup (ADL).
    + * Hence we should define operator<< in the namespace
    + * where the argument (here value, object, etc.) resides.
    + * Credit: @madhur4127
    + * See https://github.com/simdjson/simdjson/issues/1768
    + */
    +namespace simdjson { namespace icelake { namespace ondemand {
    +
    +/**
    + * Print JSON to an output stream.  It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The element.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::value x);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x);
    +#endif
    +/**
    + * Print JSON to an output stream. It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The array.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::array value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x);
    +#endif
    +/**
    + * Print JSON to an output stream. It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The array.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::document& value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x);
    +#endif
    +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::document_reference& value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x);
    +#endif
    +/**
    + * Print JSON to an output stream. It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The object.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::object value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x);
    +#endif
    +}}} // namespace simdjson::icelake::ondemand
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H
    +/* end file simdjson/generic/ondemand/serialization.h for icelake */
    +
    +// Inline definitions
    +/* including simdjson/generic/ondemand/array-inl.h for icelake: #include "simdjson/generic/ondemand/array-inl.h" */
    +/* begin file simdjson/generic/ondemand/array-inl.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +//
    +// ### Live States
    +//
    +// While iterating or looking up values, depth >= iter->depth. at_start may vary. Error is
    +// always SUCCESS:
    +//
    +// - Start: This is the state when the array is first found and the iterator is just past the `{`.
    +//   In this state, at_start == true.
    +// - Next: After we hand a scalar value to the user, or an array/object which they then fully
    +//   iterate over, the iterator is at the `,` before the next value (or `]`). In this state,
    +//   depth == iter->depth, at_start == false, and error == SUCCESS.
    +// - Unfinished Business: When we hand an array/object to the user which they do not fully
    +//   iterate over, we need to finish that iteration by skipping child values until we reach the
    +//   Next state. In this state, depth > iter->depth, at_start == false, and error == SUCCESS.
    +//
    +// ## Error States
    +//
    +// In error states, we will yield exactly one more value before stopping. iter->depth == depth
    +// and at_start is always false. We decrement after yielding the error, moving to the Finished
    +// state.
    +//
    +// - Chained Error: When the array iterator is part of an error chain--for example, in
    +//   `for (auto tweet : doc["tweets"])`, where the tweet element may be missing or not be an
    +//   array--we yield that error in the loop, exactly once. In this state, error != SUCCESS and
    +//   iter->depth == depth, and at_start == false. We decrement depth when we yield the error.
    +// - Missing Comma Error: When the iterator ++ method discovers there is no comma between elements,
    +//   we flag that as an error and treat it exactly the same as a Chained Error. In this state,
    +//   error == TAPE_ERROR, iter->depth == depth, and at_start == false.
    +//
    +// ## Terminal State
    +//
    +// The terminal state has iter->depth < depth. at_start is always false.
    +//
    +// - Finished: When we have reached a `]` or have reported an error, we are finished. We signal this
    +//   by decrementing depth. In this state, iter->depth < depth, at_start == false, and
    +//   error == SUCCESS.
    +//
    +
    +simdjson_inline array::array(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{
    +}
    +
    +simdjson_inline simdjson_result array::start(value_iterator &iter) noexcept {
    +  // We don't need to know if the array is empty to start iteration, but we do want to know if there
    +  // is an error--thus `simdjson_unused`.
    +  simdjson_unused bool has_value;
    +  SIMDJSON_TRY( iter.start_array().get(has_value) );
    +  return array(iter);
    +}
    +simdjson_inline simdjson_result array::start_root(value_iterator &iter) noexcept {
    +  simdjson_unused bool has_value;
    +  SIMDJSON_TRY( iter.start_root_array().get(has_value) );
    +  return array(iter);
    +}
    +simdjson_inline simdjson_result array::started(value_iterator &iter) noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY(iter.started_array().get(has_value));
    +  return array(iter);
    +}
    +
    +simdjson_inline simdjson_result array::begin() noexcept {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  return array_iterator(iter);
    +}
    +simdjson_inline simdjson_result array::end() noexcept {
    +  return array_iterator(iter);
    +}
    +simdjson_inline error_code array::consume() noexcept {
    +  auto error = iter.json_iter().skip_child(iter.depth()-1);
    +  if(error) { iter.abandon(); }
    +  return error;
    +}
    +
    +simdjson_inline simdjson_result array::raw_json() noexcept {
    +  const uint8_t * starting_point{iter.peek_start()};
    +  auto error = consume();
    +  if(error) { return error; }
    +  // After 'consume()', we could be left pointing just beyond the document, but that
    +  // is ok because we are not going to dereference the final pointer position, we just
    +  // use it to compute the length in bytes.
    +  const uint8_t * final_point{iter._json_iter->unsafe_pointer()};
    +  return std::string_view(reinterpret_cast(starting_point), size_t(final_point - starting_point));
    +}
    +
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_inline simdjson_result array::count_elements() & noexcept {
    +  size_t count{0};
    +  // Important: we do not consume any of the values.
    +  for(simdjson_unused auto v : *this) { count++; }
    +  // The above loop will always succeed, but we want to report errors.
    +  if(iter.error()) { return iter.error(); }
    +  // We need to move back at the start because we expect users to iterate through
    +  // the array after counting the number of elements.
    +  iter.reset_array();
    +  return count;
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_inline simdjson_result array::is_empty() & noexcept {
    +  bool is_not_empty;
    +  auto error = iter.reset_array().get(is_not_empty);
    +  if(error) { return error; }
    +  return !is_not_empty;
    +}
    +
    +inline simdjson_result array::reset() & noexcept {
    +  return iter.reset_array();
    +}
    +
    +inline simdjson_result array::at_pointer(std::string_view json_pointer) noexcept {
    +  if (json_pointer[0] != '/') { return INVALID_JSON_POINTER; }
    +  json_pointer = json_pointer.substr(1);
    +  // - means "the append position" or "the element after the end of the array"
    +  // We don't support this, because we're returning a real element, not a position.
    +  if (json_pointer == "-") { return INDEX_OUT_OF_BOUNDS; }
    +
    +  // Read the array index
    +  size_t array_index = 0;
    +  size_t i;
    +  for (i = 0; i < json_pointer.length() && json_pointer[i] != '/'; i++) {
    +    uint8_t digit = uint8_t(json_pointer[i] - '0');
    +    // Check for non-digit in array index. If it's there, we're trying to get a field in an object
    +    if (digit > 9) { return INCORRECT_TYPE; }
    +    array_index = array_index*10 + digit;
    +  }
    +
    +  // 0 followed by other digits is invalid
    +  if (i > 1 && json_pointer[0] == '0') { return INVALID_JSON_POINTER; } // "JSON pointer array index has other characters after 0"
    +
    +  // Empty string is invalid; so is a "/" with no digits before it
    +  if (i == 0) { return INVALID_JSON_POINTER; } // "Empty string in JSON pointer array index"
    +  // Get the child
    +  auto child = at(array_index);
    +  // If there is an error, it ends here
    +  if(child.error()) {
    +    return child;
    +  }
    +
    +  // If there is a /, we're not done yet, call recursively.
    +  if (i < json_pointer.length()) {
    +    child = child.at_pointer(json_pointer.substr(i));
    +  }
    +  return child;
    +}
    +
    +simdjson_inline simdjson_result array::at(size_t index) noexcept {
    +  size_t i = 0;
    +  for (auto value : *this) {
    +    if (i == index) { return value; }
    +    i++;
    +  }
    +  return INDEX_OUT_OF_BOUNDS;
    +}
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  icelake::ondemand::array &&value
    +) noexcept
    +  : implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept
    +  : implementation_simdjson_result_base(error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::begin() noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() noexcept {
    +  if (error()) { return error(); }
    +  return first.end();
    +}
    +simdjson_inline  simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline  simdjson_result simdjson_result::is_empty() & noexcept {
    +  if (error()) { return error(); }
    +  return first.is_empty();
    +}
    +simdjson_inline  simdjson_result simdjson_result::at(size_t index) noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline  simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +simdjson_inline  simdjson_result simdjson_result::raw_json() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json();
    +}
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H
    +/* end file simdjson/generic/ondemand/array-inl.h for icelake */
    +/* including simdjson/generic/ondemand/array_iterator-inl.h for icelake: #include "simdjson/generic/ondemand/array_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/array_iterator-inl.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{}
    +
    +simdjson_inline simdjson_result array_iterator::operator*() noexcept {
    +  if (iter.error()) { iter.abandon(); return iter.error(); }
    +  return value(iter.child());
    +}
    +simdjson_inline bool array_iterator::operator==(const array_iterator &other) const noexcept {
    +  return !(*this != other);
    +}
    +simdjson_inline bool array_iterator::operator!=(const array_iterator &) const noexcept {
    +  return iter.is_open();
    +}
    +simdjson_inline array_iterator &array_iterator::operator++() noexcept {
    +  error_code error;
    +  // PERF NOTE this is a safety rail ... users should exit loops as soon as they receive an error, so we'll never get here.
    +  // However, it does not seem to make a perf difference, so we add it out of an abundance of caution.
    +  if (( error = iter.error() )) { return *this; }
    +  if (( error = iter.skip_child() )) { return *this; }
    +  if (( error = iter.has_next_element().error() )) { return *this; }
    +  return *this;
    +}
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  icelake::ondemand::array_iterator &&value
    +) noexcept
    +  : icelake::implementation_simdjson_result_base(std::forward(value))
    +{
    +  first.iter.assert_is_valid();
    +}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +  : icelake::implementation_simdjson_result_base({}, error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::operator*() noexcept {
    +  if (error()) { return error(); }
    +  return *first;
    +}
    +simdjson_inline bool simdjson_result::operator==(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return !error(); }
    +  return first == other.first;
    +}
    +simdjson_inline bool simdjson_result::operator!=(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return error(); }
    +  return first != other.first;
    +}
    +simdjson_inline simdjson_result &simdjson_result::operator++() noexcept {
    +  // Clear the error if there is one, so we don't yield it twice
    +  if (error()) { second = SUCCESS; return *this; }
    +  ++(first);
    +  return *this;
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/array_iterator-inl.h for icelake */
    +/* including simdjson/generic/ondemand/document-inl.h for icelake: #include "simdjson/generic/ondemand/document-inl.h" */
    +/* begin file simdjson/generic/ondemand/document-inl.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +simdjson_inline document::document(ondemand::json_iterator &&_iter) noexcept
    +  : iter{std::forward(_iter)}
    +{
    +  logger::log_start_value(iter, "document");
    +}
    +
    +simdjson_inline document document::start(json_iterator &&iter) noexcept {
    +  return document(std::forward(iter));
    +}
    +
    +inline void document::rewind() noexcept {
    +  iter.rewind();
    +}
    +
    +inline std::string document::to_debug_string() noexcept {
    +  return iter.to_string();
    +}
    +
    +inline simdjson_result document::current_location() const noexcept {
    +  return iter.current_location();
    +}
    +
    +inline int32_t document::current_depth() const noexcept {
    +  return iter.depth();
    +}
    +
    +inline bool document::at_end() const noexcept {
    +  return iter.at_end();
    +}
    +
    +
    +inline bool document::is_alive() noexcept {
    +  return iter.is_alive();
    +}
    +simdjson_inline value_iterator document::resume_value_iterator() noexcept {
    +  return value_iterator(&iter, 1, iter.root_position());
    +}
    +simdjson_inline value_iterator document::get_root_value_iterator() noexcept {
    +  return resume_value_iterator();
    +}
    +simdjson_inline simdjson_result document::start_or_resume_object() noexcept {
    +  if (iter.at_root()) {
    +    return get_object();
    +  } else {
    +    return object::resume(resume_value_iterator());
    +  }
    +}
    +simdjson_inline simdjson_result document::get_value() noexcept {
    +  // Make sure we start any arrays or objects before returning, so that start_root_()
    +  // gets called.
    +
    +  // It is the convention throughout the code that  the macro `SIMDJSON_DEVELOPMENT_CHECKS` determines whether
    +  // we check for OUT_OF_ORDER_ITERATION. Proper on::demand code should never trigger this error.
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  if (!iter.at_root()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  // assert_at_root() serves two purposes: in Debug mode, whether or not
    +  // SIMDJSON_DEVELOPMENT_CHECKS is set or not, it checks that we are at the root of
    +  // the document (this will typically be redundant). In release mode, it generates
    +  // SIMDJSON_ASSUME statements to allow the compiler to make assumptions.
    +  iter.assert_at_root();
    +  switch (*iter.peek()) {
    +    case '[': {
    +      // The following lines check that the document ends with ].
    +      auto value_iterator = get_root_value_iterator();
    +      auto error = value_iterator.check_root_array();
    +      if(error) { return error; }
    +      return value(get_root_value_iterator());
    +    }
    +    case '{': {
    +      // The following lines would check that the document ends with }.
    +      auto value_iterator = get_root_value_iterator();
    +      auto error = value_iterator.check_root_object();
    +      if(error) { return error; }
    +      return value(get_root_value_iterator());
    +    }
    +    default:
    +      // Unfortunately, scalar documents are a special case in simdjson and they cannot
    +      // be safely converted to value instances.
    +      return SCALAR_DOCUMENT_AS_VALUE;
    +  }
    +}
    +simdjson_inline simdjson_result document::get_array() & noexcept {
    +  auto value = get_root_value_iterator();
    +  return array::start_root(value);
    +}
    +simdjson_inline simdjson_result document::get_object() & noexcept {
    +  auto value = get_root_value_iterator();
    +  return object::start_root(value);
    +}
    +
    +/**
    + * We decided that calling 'get_double()' on the JSON document '1.233 blabla' should
    + * give an error, so we check for trailing content. We want to disallow trailing
    + * content.
    + * Thus, in several implementations below, we pass a 'true' parameter value to
    + * a get_root_value_iterator() method: this indicates that we disallow trailing content.
    + */
    +
    +simdjson_inline simdjson_result document::get_uint64() noexcept {
    +  return get_root_value_iterator().get_root_uint64(true);
    +}
    +simdjson_inline simdjson_result document::get_uint64_in_string() noexcept {
    +  return get_root_value_iterator().get_root_uint64_in_string(true);
    +}
    +simdjson_inline simdjson_result document::get_int64() noexcept {
    +  return get_root_value_iterator().get_root_int64(true);
    +}
    +simdjson_inline simdjson_result document::get_int64_in_string() noexcept {
    +  return get_root_value_iterator().get_root_int64_in_string(true);
    +}
    +simdjson_inline simdjson_result document::get_double() noexcept {
    +  return get_root_value_iterator().get_root_double(true);
    +}
    +simdjson_inline simdjson_result document::get_double_in_string() noexcept {
    +  return get_root_value_iterator().get_root_double_in_string(true);
    +}
    +simdjson_inline simdjson_result document::get_string(bool allow_replacement) noexcept {
    +  return get_root_value_iterator().get_root_string(true, allow_replacement);
    +}
    +template 
    +simdjson_inline error_code document::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  return get_root_value_iterator().get_root_string(receiver, true, allow_replacement);
    +}
    +simdjson_inline simdjson_result document::get_wobbly_string() noexcept {
    +  return get_root_value_iterator().get_root_wobbly_string(true);
    +}
    +simdjson_inline simdjson_result document::get_raw_json_string() noexcept {
    +  return get_root_value_iterator().get_root_raw_json_string(true);
    +}
    +simdjson_inline simdjson_result document::get_bool() noexcept {
    +  return get_root_value_iterator().get_root_bool(true);
    +}
    +simdjson_inline simdjson_result document::is_null() noexcept {
    +  return get_root_value_iterator().is_root_null(true);
    +}
    +
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_array(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_object(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_raw_json_string(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_string(false); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_double(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_uint64(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_int64(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_value(); }
    +
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return get_value(); }
    +
    +template simdjson_inline error_code document::get(T &out) & noexcept {
    +  return get().get(out);
    +}
    +template simdjson_inline error_code document::get(T &out) && noexcept {
    +  return std::forward(*this).get().get(out);
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline document::operator array() & noexcept(false) { return get_array(); }
    +simdjson_inline document::operator object() & noexcept(false) { return get_object(); }
    +simdjson_inline document::operator uint64_t() noexcept(false) { return get_uint64(); }
    +simdjson_inline document::operator int64_t() noexcept(false) { return get_int64(); }
    +simdjson_inline document::operator double() noexcept(false) { return get_double(); }
    +simdjson_inline document::operator std::string_view() noexcept(false) { return get_string(false); }
    +simdjson_inline document::operator raw_json_string() noexcept(false) { return get_raw_json_string(); }
    +simdjson_inline document::operator bool() noexcept(false) { return get_bool(); }
    +simdjson_inline document::operator value() noexcept(false) { return get_value(); }
    +
    +#endif
    +simdjson_inline simdjson_result document::count_elements() & noexcept {
    +  auto a = get_array();
    +  simdjson_result answer = a.count_elements();
    +  /* If there was an array, we are now left pointing at its first element. */
    +  if(answer.error() == SUCCESS) { rewind(); }
    +  return answer;
    +}
    +simdjson_inline simdjson_result document::count_fields() & noexcept {
    +  auto a = get_object();
    +  simdjson_result answer = a.count_fields();
    +  /* If there was an object, we are now left pointing at its first element. */
    +  if(answer.error() == SUCCESS) { rewind(); }
    +  return answer;
    +}
    +simdjson_inline simdjson_result document::at(size_t index) & noexcept {
    +  auto a = get_array();
    +  return a.at(index);
    +}
    +simdjson_inline simdjson_result document::begin() & noexcept {
    +  return get_array().begin();
    +}
    +simdjson_inline simdjson_result document::end() & noexcept {
    +  return {};
    +}
    +
    +simdjson_inline simdjson_result document::find_field(std::string_view key) & noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +simdjson_inline simdjson_result document::find_field(const char *key) & noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +simdjson_inline simdjson_result document::find_field_unordered(std::string_view key) & noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result document::find_field_unordered(const char *key) & noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result document::operator[](std::string_view key) & noexcept {
    +  return start_or_resume_object()[key];
    +}
    +simdjson_inline simdjson_result document::operator[](const char *key) & noexcept {
    +  return start_or_resume_object()[key];
    +}
    +
    +simdjson_inline error_code document::consume() noexcept {
    +  auto error = iter.skip_child(0);
    +  if(error) { iter.abandon(); }
    +  return error;
    +}
    +
    +simdjson_inline simdjson_result document::raw_json() noexcept {
    +  auto _iter = get_root_value_iterator();
    +  const uint8_t * starting_point{_iter.peek_start()};
    +  auto error = consume();
    +  if(error) { return error; }
    +  // After 'consume()', we could be left pointing just beyond the document, but that
    +  // is ok because we are not going to dereference the final pointer position, we just
    +  // use it to compute the length in bytes.
    +  const uint8_t * final_point{iter.unsafe_pointer()};
    +  return std::string_view(reinterpret_cast(starting_point), size_t(final_point - starting_point));
    +}
    +
    +simdjson_inline simdjson_result document::type() noexcept {
    +  return get_root_value_iterator().type();
    +}
    +
    +simdjson_inline simdjson_result document::is_scalar() noexcept {
    +  json_type this_type;
    +  auto error = type().get(this_type);
    +  if(error) { return error; }
    +  return ! ((this_type == json_type::array) || (this_type == json_type::object));
    +}
    +
    +simdjson_inline bool document::is_negative() noexcept {
    +  return get_root_value_iterator().is_root_negative();
    +}
    +
    +simdjson_inline simdjson_result document::is_integer() noexcept {
    +  return get_root_value_iterator().is_root_integer(true);
    +}
    +
    +simdjson_inline simdjson_result document::get_number_type() noexcept {
    +  return get_root_value_iterator().get_root_number_type(true);
    +}
    +
    +simdjson_inline simdjson_result document::get_number() noexcept {
    +  return get_root_value_iterator().get_root_number(true);
    +}
    +
    +
    +simdjson_inline simdjson_result document::raw_json_token() noexcept {
    +  auto _iter = get_root_value_iterator();
    +  return std::string_view(reinterpret_cast(_iter.peek_start()), _iter.peek_start_length());
    +}
    +
    +simdjson_inline simdjson_result document::at_pointer(std::string_view json_pointer) noexcept {
    +  rewind(); // Rewind the document each time at_pointer is called
    +  if (json_pointer.empty()) {
    +    return this->get_value();
    +  }
    +  json_type t;
    +  SIMDJSON_TRY(type().get(t));
    +  switch (t)
    +  {
    +    case json_type::array:
    +      return (*this).get_array().at_pointer(json_pointer);
    +    case json_type::object:
    +      return (*this).get_object().at_pointer(json_pointer);
    +    default:
    +      return INVALID_JSON_POINTER;
    +  }
    +}
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  icelake::ondemand::document &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      error
    +    )
    +{
    +}
    +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline error_code simdjson_result::rewind() noexcept {
    +  if (error()) { return error(); }
    +  first.rewind();
    +  return SUCCESS;
    +}
    +simdjson_inline simdjson_result simdjson_result::begin() & noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() & noexcept {
    +  return {};
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_array();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_object();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_bool();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_value() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_value();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_null() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_null();
    +}
    +
    +template
    +simdjson_inline simdjson_result simdjson_result::get() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get();
    +}
    +template
    +simdjson_inline simdjson_result simdjson_result::get() && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).get();
    +}
    +template
    +simdjson_inline error_code simdjson_result::get(T &out) & noexcept {
    +  if (error()) { return error(); }
    +  return first.get(out);
    +}
    +template
    +simdjson_inline error_code simdjson_result::get(T &out) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).get(out);
    +}
    +
    +template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete;
    +template<> simdjson_inline simdjson_result simdjson_result::get() && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first);
    +}
    +template<> simdjson_inline error_code simdjson_result::get(icelake::ondemand::document &out) & noexcept = delete;
    +template<> simdjson_inline error_code simdjson_result::get(icelake::ondemand::document &out) && noexcept {
    +  if (error()) { return error(); }
    +  out = std::forward(first);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::type() noexcept {
    +  if (error()) { return error(); }
    +  return first.type();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_scalar();
    +}
    +
    +
    +simdjson_inline bool simdjson_result::is_negative() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_negative();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_integer();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number_type();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::get_number() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number();
    +}
    +
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline simdjson_result::operator icelake::ondemand::array() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator icelake::ondemand::object() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator int64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator double() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator icelake::ondemand::raw_json_string() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator bool() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator icelake::ondemand::value() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +#endif
    +
    +
    +simdjson_inline simdjson_result simdjson_result::current_location() noexcept {
    +  if (error()) { return error(); }
    +  return first.current_location();
    +}
    +
    +simdjson_inline bool simdjson_result::at_end() const noexcept {
    +  if (error()) { return error(); }
    +  return first.at_end();
    +}
    +
    +
    +simdjson_inline int32_t simdjson_result::current_depth() const noexcept {
    +  if (error()) { return error(); }
    +  return first.current_depth();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json_token();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +
    +} // namespace simdjson
    +
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +simdjson_inline document_reference::document_reference() noexcept : doc{nullptr} {}
    +simdjson_inline document_reference::document_reference(document &d) noexcept : doc(&d) {}
    +simdjson_inline void document_reference::rewind() noexcept { doc->rewind(); }
    +simdjson_inline simdjson_result document_reference::get_array() & noexcept { return doc->get_array(); }
    +simdjson_inline simdjson_result document_reference::get_object() & noexcept { return doc->get_object(); }
    +/**
    + * The document_reference instances are used primarily/solely for streams of JSON
    + * documents.
    + * We decided that calling 'get_double()' on the JSON document '1.233 blabla' should
    + * give an error, so we check for trailing content.
    + *
    + * However, for streams of JSON documents, we want to be able to start from
    + * "321" "321" "321"
    + * and parse it successfully as a stream of JSON documents, calling get_uint64_in_string()
    + * successfully each time.
    + *
    + * To achieve this result, we pass a 'false' to a get_root_value_iterator() method:
    + * this indicates that we allow trailing content.
    + */
    +simdjson_inline simdjson_result document_reference::get_uint64() noexcept { return doc->get_root_value_iterator().get_root_uint64(false); }
    +simdjson_inline simdjson_result document_reference::get_uint64_in_string() noexcept { return doc->get_root_value_iterator().get_root_uint64_in_string(false); }
    +simdjson_inline simdjson_result document_reference::get_int64() noexcept { return doc->get_root_value_iterator().get_root_int64(false); }
    +simdjson_inline simdjson_result document_reference::get_int64_in_string() noexcept { return doc->get_root_value_iterator().get_root_int64_in_string(false); }
    +simdjson_inline simdjson_result document_reference::get_double() noexcept { return doc->get_root_value_iterator().get_root_double(false); }
    +simdjson_inline simdjson_result document_reference::get_double_in_string() noexcept { return doc->get_root_value_iterator().get_root_double(false); }
    +simdjson_inline simdjson_result document_reference::get_string(bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(false, allow_replacement); }
    +template 
    +simdjson_inline error_code document_reference::get_string(string_type& receiver, bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(receiver, false, allow_replacement); }
    +simdjson_inline simdjson_result document_reference::get_wobbly_string() noexcept { return doc->get_root_value_iterator().get_root_wobbly_string(false); }
    +simdjson_inline simdjson_result document_reference::get_raw_json_string() noexcept { return doc->get_root_value_iterator().get_root_raw_json_string(false); }
    +simdjson_inline simdjson_result document_reference::get_bool() noexcept { return doc->get_root_value_iterator().get_root_bool(false); }
    +simdjson_inline simdjson_result document_reference::get_value() noexcept { return doc->get_value(); }
    +simdjson_inline simdjson_result document_reference::is_null() noexcept { return doc->get_root_value_iterator().is_root_null(false); }
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline document_reference::operator array() & noexcept(false) { return array(*doc); }
    +simdjson_inline document_reference::operator object() & noexcept(false) { return object(*doc); }
    +simdjson_inline document_reference::operator uint64_t() noexcept(false) { return get_uint64(); }
    +simdjson_inline document_reference::operator int64_t() noexcept(false) { return get_int64(); }
    +simdjson_inline document_reference::operator double() noexcept(false) { return get_double(); }
    +simdjson_inline document_reference::operator std::string_view() noexcept(false) { return std::string_view(*doc); }
    +simdjson_inline document_reference::operator raw_json_string() noexcept(false) { return raw_json_string(*doc); }
    +simdjson_inline document_reference::operator bool() noexcept(false) { return get_bool(); }
    +simdjson_inline document_reference::operator value() noexcept(false) { return value(*doc); }
    +#endif
    +simdjson_inline simdjson_result document_reference::count_elements() & noexcept { return doc->count_elements(); }
    +simdjson_inline simdjson_result document_reference::count_fields() & noexcept { return doc->count_fields(); }
    +simdjson_inline simdjson_result document_reference::at(size_t index) & noexcept { return doc->at(index); }
    +simdjson_inline simdjson_result document_reference::begin() & noexcept { return doc->begin(); }
    +simdjson_inline simdjson_result document_reference::end() & noexcept { return doc->end(); }
    +simdjson_inline simdjson_result document_reference::find_field(std::string_view key) & noexcept { return doc->find_field(key); }
    +simdjson_inline simdjson_result document_reference::find_field(const char *key) & noexcept { return doc->find_field(key); }
    +simdjson_inline simdjson_result document_reference::operator[](std::string_view key) & noexcept { return (*doc)[key]; }
    +simdjson_inline simdjson_result document_reference::operator[](const char *key) & noexcept { return (*doc)[key]; }
    +simdjson_inline simdjson_result document_reference::find_field_unordered(std::string_view key) & noexcept { return doc->find_field_unordered(key); }
    +simdjson_inline simdjson_result document_reference::find_field_unordered(const char *key) & noexcept { return doc->find_field_unordered(key); }
    +simdjson_inline simdjson_result document_reference::type() noexcept { return doc->type(); }
    +simdjson_inline simdjson_result document_reference::is_scalar() noexcept { return doc->is_scalar(); }
    +simdjson_inline simdjson_result document_reference::current_location() noexcept { return doc->current_location(); }
    +simdjson_inline int32_t document_reference::current_depth() const noexcept { return doc->current_depth(); }
    +simdjson_inline bool document_reference::is_negative() noexcept { return doc->is_negative(); }
    +simdjson_inline simdjson_result document_reference::is_integer() noexcept { return doc->get_root_value_iterator().is_root_integer(false); }
    +simdjson_inline simdjson_result document_reference::get_number_type() noexcept { return doc->get_root_value_iterator().get_root_number_type(false); }
    +simdjson_inline simdjson_result document_reference::get_number() noexcept { return doc->get_root_value_iterator().get_root_number(false); }
    +simdjson_inline simdjson_result document_reference::raw_json_token() noexcept { return doc->raw_json_token(); }
    +simdjson_inline simdjson_result document_reference::at_pointer(std::string_view json_pointer) noexcept { return doc->at_pointer(json_pointer); }
    +simdjson_inline simdjson_result document_reference::raw_json() noexcept { return doc->raw_json();}
    +simdjson_inline document_reference::operator document&() const noexcept { return *doc; }
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +
    +
    +namespace simdjson {
    +simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::document_reference value, error_code error)
    +  noexcept : implementation_simdjson_result_base(std::forward(value), error) {}
    +
    +
    +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline error_code simdjson_result::rewind() noexcept {
    +  if (error()) { return error(); }
    +  first.rewind();
    +  return SUCCESS;
    +}
    +simdjson_inline simdjson_result simdjson_result::begin() & noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() & noexcept {
    +  return {};
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_array();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_object();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_bool();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_value() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_value();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_null() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_null();
    +}
    +simdjson_inline simdjson_result simdjson_result::type() noexcept {
    +  if (error()) { return error(); }
    +  return first.type();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_scalar();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_negative() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_negative();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_integer();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number_type();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number();
    +}
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline simdjson_result::operator icelake::ondemand::array() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator icelake::ondemand::object() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator int64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator double() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator icelake::ondemand::raw_json_string() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator bool() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator icelake::ondemand::value() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +#endif
    +
    +simdjson_inline simdjson_result simdjson_result::current_location() noexcept {
    +  if (error()) { return error(); }
    +  return first.current_location();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json_token();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H
    +/* end file simdjson/generic/ondemand/document-inl.h for icelake */
    +/* including simdjson/generic/ondemand/document_stream-inl.h for icelake: #include "simdjson/generic/ondemand/document_stream-inl.h" */
    +/* begin file simdjson/generic/ondemand/document_stream-inl.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document_stream.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +
    +inline void stage1_worker::finish() {
    +  // After calling "run" someone would call finish() to wait
    +  // for the end of the processing.
    +  // This function will wait until either the thread has done
    +  // the processing or, else, the destructor has been called.
    +  std::unique_lock lock(locking_mutex);
    +  cond_var.wait(lock, [this]{return has_work == false;});
    +}
    +
    +inline stage1_worker::~stage1_worker() {
    +  // The thread may never outlive the stage1_worker instance
    +  // and will always be stopped/joined before the stage1_worker
    +  // instance is gone.
    +  stop_thread();
    +}
    +
    +inline void stage1_worker::start_thread() {
    +  std::unique_lock lock(locking_mutex);
    +  if(thread.joinable()) {
    +    return; // This should never happen but we never want to create more than one thread.
    +  }
    +  thread = std::thread([this]{
    +      while(true) {
    +        std::unique_lock thread_lock(locking_mutex);
    +        // We wait for either "run" or "stop_thread" to be called.
    +        cond_var.wait(thread_lock, [this]{return has_work || !can_work;});
    +        // If, for some reason, the stop_thread() method was called (i.e., the
    +        // destructor of stage1_worker is called, then we want to immediately destroy
    +        // the thread (and not do any more processing).
    +        if(!can_work) {
    +          break;
    +        }
    +        this->owner->stage1_thread_error = this->owner->run_stage1(*this->stage1_thread_parser,
    +              this->_next_batch_start);
    +        this->has_work = false;
    +        // The condition variable call should be moved after thread_lock.unlock() for performance
    +        // reasons but thread sanitizers may report it as a data race if we do.
    +        // See https://stackoverflow.com/questions/35775501/c-should-condition-variable-be-notified-under-lock
    +        cond_var.notify_one(); // will notify "finish"
    +        thread_lock.unlock();
    +      }
    +    }
    +  );
    +}
    +
    +
    +inline void stage1_worker::stop_thread() {
    +  std::unique_lock lock(locking_mutex);
    +  // We have to make sure that all locks can be released.
    +  can_work = false;
    +  has_work = false;
    +  cond_var.notify_all();
    +  lock.unlock();
    +  if(thread.joinable()) {
    +    thread.join();
    +  }
    +}
    +
    +inline void stage1_worker::run(document_stream * ds, parser * stage1, size_t next_batch_start) {
    +  std::unique_lock lock(locking_mutex);
    +  owner = ds;
    +  _next_batch_start = next_batch_start;
    +  stage1_thread_parser = stage1;
    +  has_work = true;
    +  // The condition variable call should be moved after thread_lock.unlock() for performance
    +  // reasons but thread sanitizers may report it as a data race if we do.
    +  // See https://stackoverflow.com/questions/35775501/c-should-condition-variable-be-notified-under-lock
    +  cond_var.notify_one(); // will notify the thread lock that we have work
    +  lock.unlock();
    +}
    +
    +#endif  // SIMDJSON_THREADS_ENABLED
    +
    +simdjson_inline document_stream::document_stream(
    +  ondemand::parser &_parser,
    +  const uint8_t *_buf,
    +  size_t _len,
    +  size_t _batch_size,
    +  bool _allow_comma_separated
    +) noexcept
    +  : parser{&_parser},
    +    buf{_buf},
    +    len{_len},
    +    batch_size{_batch_size <= MINIMAL_BATCH_SIZE ? MINIMAL_BATCH_SIZE : _batch_size},
    +    allow_comma_separated{_allow_comma_separated},
    +    error{SUCCESS}
    +    #ifdef SIMDJSON_THREADS_ENABLED
    +    , use_thread(_parser.threaded) // we need to make a copy because _parser.threaded can change
    +    #endif
    +{
    +#ifdef SIMDJSON_THREADS_ENABLED
    +  if(worker.get() == nullptr) {
    +    error = MEMALLOC;
    +  }
    +#endif
    +}
    +
    +simdjson_inline document_stream::document_stream() noexcept
    +  : parser{nullptr},
    +    buf{nullptr},
    +    len{0},
    +    batch_size{0},
    +    allow_comma_separated{false},
    +    error{UNINITIALIZED}
    +    #ifdef SIMDJSON_THREADS_ENABLED
    +    , use_thread(false)
    +    #endif
    +{
    +}
    +
    +simdjson_inline document_stream::~document_stream() noexcept
    +{
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  worker.reset();
    +  #endif
    +}
    +
    +inline size_t document_stream::size_in_bytes() const noexcept {
    +  return len;
    +}
    +
    +inline size_t document_stream::truncated_bytes() const noexcept {
    +  if(error == CAPACITY) { return len - batch_start; }
    +  return parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] - parser->implementation->structural_indexes[parser->implementation->n_structural_indexes + 1];
    +}
    +
    +simdjson_inline document_stream::iterator::iterator() noexcept
    +  : stream{nullptr}, finished{true} {
    +}
    +
    +simdjson_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept
    +  : stream{_stream}, finished{is_end} {
    +}
    +
    +simdjson_inline simdjson_result document_stream::iterator::operator*() noexcept {
    +  //if(stream->error) { return stream->error; }
    +  return simdjson_result(stream->doc, stream->error);
    +}
    +
    +simdjson_inline document_stream::iterator& document_stream::iterator::operator++() noexcept {
    +  // If there is an error, then we want the iterator
    +  // to be finished, no matter what. (E.g., we do not
    +  // keep generating documents with errors, or go beyond
    +  // a document with errors.)
    +  //
    +  // Users do not have to call "operator*()" when they use operator++,
    +  // so we need to end the stream in the operator++ function.
    +  //
    +  // Note that setting finished = true is essential otherwise
    +  // we would enter an infinite loop.
    +  if (stream->error) { finished = true; }
    +  // Note that stream->error() is guarded against error conditions
    +  // (it will immediately return if stream->error casts to false).
    +  // In effect, this next function does nothing when (stream->error)
    +  // is true (hence the risk of an infinite loop).
    +  stream->next();
    +  // If that was the last document, we're finished.
    +  // It is the only type of error we do not want to appear
    +  // in operator*.
    +  if (stream->error == EMPTY) { finished = true; }
    +  // If we had any other kind of error (not EMPTY) then we want
    +  // to pass it along to the operator* and we cannot mark the result
    +  // as "finished" just yet.
    +  return *this;
    +}
    +
    +simdjson_inline bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept {
    +  return finished != other.finished;
    +}
    +
    +simdjson_inline document_stream::iterator document_stream::begin() noexcept {
    +  start();
    +  // If there are no documents, we're finished.
    +  return iterator(this, error == EMPTY);
    +}
    +
    +simdjson_inline document_stream::iterator document_stream::end() noexcept {
    +  return iterator(this, true);
    +}
    +
    +inline void document_stream::start() noexcept {
    +  if (error) { return; }
    +  error = parser->allocate(batch_size);
    +  if (error) { return; }
    +  // Always run the first stage 1 parse immediately
    +  batch_start = 0;
    +  error = run_stage1(*parser, batch_start);
    +  while(error == EMPTY) {
    +    // In exceptional cases, we may start with an empty block
    +    batch_start = next_batch_start();
    +    if (batch_start >= len) { return; }
    +    error = run_stage1(*parser, batch_start);
    +  }
    +  if (error) { return; }
    +  doc_index = batch_start;
    +  doc = document(json_iterator(&buf[batch_start], parser));
    +  doc.iter._streaming = true;
    +
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  if (use_thread && next_batch_start() < len) {
    +    // Kick off the first thread on next batch if needed
    +    error = stage1_thread_parser.allocate(batch_size);
    +    if (error) { return; }
    +    worker->start_thread();
    +    start_stage1_thread();
    +    if (error) { return; }
    +  }
    +  #endif // SIMDJSON_THREADS_ENABLED
    +}
    +
    +inline void document_stream::next() noexcept {
    +  // We always enter at once once in an error condition.
    +  if (error) { return; }
    +  next_document();
    +  if (error) { return; }
    +  auto cur_struct_index = doc.iter._root - parser->implementation->structural_indexes.get();
    +  doc_index = batch_start + parser->implementation->structural_indexes[cur_struct_index];
    +
    +  // Check if at end of structural indexes (i.e. at end of batch)
    +  if(cur_struct_index >= static_cast(parser->implementation->n_structural_indexes)) {
    +    error = EMPTY;
    +    // Load another batch (if available)
    +    while (error == EMPTY) {
    +      batch_start = next_batch_start();
    +      if (batch_start >= len) { break; }
    +      #ifdef SIMDJSON_THREADS_ENABLED
    +      if(use_thread) {
    +        load_from_stage1_thread();
    +      } else {
    +        error = run_stage1(*parser, batch_start);
    +      }
    +      #else
    +      error = run_stage1(*parser, batch_start);
    +      #endif
    +      /**
    +       * Whenever we move to another window, we need to update all pointers to make
    +       * it appear as if the input buffer started at the beginning of the window.
    +       *
    +       * Take this input:
    +       *
    +       * {"z":5}  {"1":1,"2":2,"4":4} [7,  10,   9]  [15,  11,   12, 13]  [154,  110,   112, 1311]
    +       *
    +       * Say you process the following window...
    +       *
    +       * '{"z":5}  {"1":1,"2":2,"4":4} [7,  10,   9]'
    +       *
    +       * When you do so, the json_iterator has a pointer at the beginning of the memory region
    +       * (pointing at the beginning of '{"z"...'.
    +       *
    +       * When you move to the window that starts at...
    +       *
    +       * '[7,  10,   9]  [15,  11,   12, 13] ...
    +       *
    +       * then it is not sufficient to just run stage 1. You also need to re-anchor the
    +       * json_iterator so that it believes we are starting at '[7,  10,   9]...'.
    +       *
    +       * Under the DOM front-end, this gets done automatically because the parser owns
    +       * the pointer the data, and when you call stage1 and then stage2 on the same
    +       * parser, then stage2 will run on the pointer acquired by stage1.
    +       *
    +       * That is, stage1 calls "this->buf = _buf" so the parser remembers the buffer that
    +       * we used. But json_iterator has no callback when stage1 is called on the parser.
    +       * In fact, I think that the parser is unaware of json_iterator.
    +       *
    +       *
    +       * So we need to re-anchor the json_iterator after each call to stage 1 so that
    +       * all of the pointers are in sync.
    +       */
    +      doc.iter = json_iterator(&buf[batch_start], parser);
    +      doc.iter._streaming = true;
    +      /**
    +       * End of resync.
    +       */
    +
    +      if (error) { continue; } // If the error was EMPTY, we may want to load another batch.
    +      doc_index = batch_start;
    +    }
    +  }
    +}
    +
    +inline void document_stream::next_document() noexcept {
    +  // Go to next place where depth=0 (document depth)
    +  error = doc.iter.skip_child(0);
    +  if (error) { return; }
    +  // Always set depth=1 at the start of document
    +  doc.iter._depth = 1;
    +  // consume comma if comma separated is allowed
    +  if (allow_comma_separated) { doc.iter.consume_character(','); }
    +  // Resets the string buffer at the beginning, thus invalidating the strings.
    +  doc.iter._string_buf_loc = parser->string_buf.get();
    +  doc.iter._root = doc.iter.position();
    +}
    +
    +inline size_t document_stream::next_batch_start() const noexcept {
    +  return batch_start + parser->implementation->structural_indexes[parser->implementation->n_structural_indexes];
    +}
    +
    +inline error_code document_stream::run_stage1(ondemand::parser &p, size_t _batch_start) noexcept {
    +  // This code only updates the structural index in the parser, it does not update any json_iterator
    +  // instance.
    +  size_t remaining = len - _batch_start;
    +  if (remaining <= batch_size) {
    +    return p.implementation->stage1(&buf[_batch_start], remaining, stage1_mode::streaming_final);
    +  } else {
    +    return p.implementation->stage1(&buf[_batch_start], batch_size, stage1_mode::streaming_partial);
    +  }
    +}
    +
    +simdjson_inline size_t document_stream::iterator::current_index() const noexcept {
    +  return stream->doc_index;
    +}
    +
    +simdjson_inline std::string_view document_stream::iterator::source() const noexcept {
    +  auto depth = stream->doc.iter.depth();
    +  auto cur_struct_index = stream->doc.iter._root - stream->parser->implementation->structural_indexes.get();
    +
    +  // If at root, process the first token to determine if scalar value
    +  if (stream->doc.iter.at_root()) {
    +    switch (stream->buf[stream->batch_start + stream->parser->implementation->structural_indexes[cur_struct_index]]) {
    +      case '{': case '[':   // Depth=1 already at start of document
    +        break;
    +      case '}': case ']':
    +        depth--;
    +        break;
    +      default:    // Scalar value document
    +        // TODO: Remove any trailing whitespaces
    +        // This returns a string spanning from start of value to the beginning of the next document (excluded)
    +        return std::string_view(reinterpret_cast(stream->buf) + current_index(), stream->parser->implementation->structural_indexes[++cur_struct_index] - current_index() - 1);
    +    }
    +    cur_struct_index++;
    +  }
    +
    +  while (cur_struct_index <= static_cast(stream->parser->implementation->n_structural_indexes)) {
    +    switch (stream->buf[stream->batch_start + stream->parser->implementation->structural_indexes[cur_struct_index]]) {
    +      case '{': case '[':
    +        depth++;
    +        break;
    +      case '}': case ']':
    +        depth--;
    +        break;
    +    }
    +    if (depth == 0) { break; }
    +    cur_struct_index++;
    +  }
    +
    +  return std::string_view(reinterpret_cast(stream->buf) + current_index(), stream->parser->implementation->structural_indexes[cur_struct_index] - current_index() + stream->batch_start + 1);;
    +}
    +
    +inline error_code document_stream::iterator::error() const noexcept {
    +  return stream->error;
    +}
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +
    +inline void document_stream::load_from_stage1_thread() noexcept {
    +  worker->finish();
    +  // Swap to the parser that was loaded up in the thread. Make sure the parser has
    +  // enough memory to swap to, as well.
    +  std::swap(stage1_thread_parser,*parser);
    +  error = stage1_thread_error;
    +  if (error) { return; }
    +
    +  // If there's anything left, start the stage 1 thread!
    +  if (next_batch_start() < len) {
    +    start_stage1_thread();
    +  }
    +}
    +
    +inline void document_stream::start_stage1_thread() noexcept {
    +  // we call the thread on a lambda that will update
    +  // this->stage1_thread_error
    +  // there is only one thread that may write to this value
    +  // TODO this is NOT exception-safe.
    +  this->stage1_thread_error = UNINITIALIZED; // In case something goes wrong, make sure it's an error
    +  size_t _next_batch_start = this->next_batch_start();
    +
    +  worker->run(this, & this->stage1_thread_parser, _next_batch_start);
    +}
    +
    +#endif // SIMDJSON_THREADS_ENABLED
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(error)
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  icelake::ondemand::document_stream &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +
    +}
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H
    +/* end file simdjson/generic/ondemand/document_stream-inl.h for icelake */
    +/* including simdjson/generic/ondemand/field-inl.h for icelake: #include "simdjson/generic/ondemand/field-inl.h" */
    +/* begin file simdjson/generic/ondemand/field-inl.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/field.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +// clang 6 doesn't think the default constructor can be noexcept, so we make it explicit
    +simdjson_inline field::field() noexcept : std::pair() {}
    +
    +simdjson_inline field::field(raw_json_string key, ondemand::value &&value) noexcept
    +  : std::pair(key, std::forward(value))
    +{
    +}
    +
    +simdjson_inline simdjson_result field::start(value_iterator &parent_iter) noexcept {
    +  raw_json_string key;
    +  SIMDJSON_TRY( parent_iter.field_key().get(key) );
    +  SIMDJSON_TRY( parent_iter.field_value() );
    +  return field::start(parent_iter, key);
    +}
    +
    +simdjson_inline simdjson_result field::start(const value_iterator &parent_iter, raw_json_string key) noexcept {
    +    return field(key, parent_iter.child());
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result field::unescaped_key(bool allow_replacement) noexcept {
    +  SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() but Visual Studio won't let us.
    +  simdjson_result answer = first.unescape(second.iter.json_iter(), allow_replacement);
    +  first.consume();
    +  return answer;
    +}
    +
    +simdjson_inline raw_json_string field::key() const noexcept {
    +  SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() by Visual Studio won't let us.
    +  return first;
    +}
    +
    +simdjson_inline value &field::value() & noexcept {
    +  return second;
    +}
    +
    +simdjson_inline value field::value() && noexcept {
    +  return std::forward(*this).second;
    +}
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  icelake::ondemand::field &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::key() noexcept {
    +  if (error()) { return error(); }
    +  return first.key();
    +}
    +simdjson_inline simdjson_result simdjson_result::unescaped_key(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.unescaped_key(allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::value() noexcept {
    +  if (error()) { return error(); }
    +  return std::move(first.value());
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H
    +/* end file simdjson/generic/ondemand/field-inl.h for icelake */
    +/* including simdjson/generic/ondemand/json_iterator-inl.h for icelake: #include "simdjson/generic/ondemand/json_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/json_iterator-inl.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/logger-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/token_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept
    +  : token(std::forward(other.token)),
    +    parser{other.parser},
    +    _string_buf_loc{other._string_buf_loc},
    +    error{other.error},
    +    _depth{other._depth},
    +    _root{other._root},
    +    _streaming{other._streaming}
    +{
    +  other.parser = nullptr;
    +}
    +simdjson_inline json_iterator &json_iterator::operator=(json_iterator &&other) noexcept {
    +  token = other.token;
    +  parser = other.parser;
    +  _string_buf_loc = other._string_buf_loc;
    +  error = other.error;
    +  _depth = other._depth;
    +  _root = other._root;
    +  _streaming = other._streaming;
    +  other.parser = nullptr;
    +  return *this;
    +}
    +
    +simdjson_inline json_iterator::json_iterator(const uint8_t *buf, ondemand::parser *_parser) noexcept
    +  : token(buf, &_parser->implementation->structural_indexes[0]),
    +    parser{_parser},
    +    _string_buf_loc{parser->string_buf.get()},
    +    _depth{1},
    +    _root{parser->implementation->structural_indexes.get()},
    +    _streaming{false}
    +
    +{
    +  logger::log_headers();
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens();
    +#endif
    +}
    +
    +inline void json_iterator::rewind() noexcept {
    +  token.set_position( root_position() );
    +  logger::log_headers(); // We start again
    +  _string_buf_loc = parser->string_buf.get();
    +  _depth = 1;
    +}
    +
    +inline bool json_iterator::balanced() const noexcept {
    +  token_iterator ti(token);
    +  int32_t count{0};
    +  ti.set_position( root_position() );
    +  while(ti.peek() <= peek_last()) {
    +    switch (*ti.return_current_and_advance())
    +    {
    +    case '[': case '{':
    +      count++;
    +      break;
    +    case ']': case '}':
    +      count--;
    +      break;
    +    default:
    +      break;
    +    }
    +  }
    +  return count == 0;
    +}
    +
    +
    +// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller
    +// relating depth and parent_depth, which is a desired effect. The warning does not show up if the
    +// skip_child() function is not marked inline).
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_warn_unused simdjson_inline error_code json_iterator::skip_child(depth_t parent_depth) noexcept {
    +  if (depth() <= parent_depth) { return SUCCESS; }
    +  switch (*return_current_and_advance()) {
    +    // TODO consider whether matching braces is a requirement: if non-matching braces indicates
    +    // *missing* braces, then future lookups are not in the object/arrays they think they are,
    +    // violating the rule "validate enough structure that the user can be confident they are
    +    // looking at the right values."
    +    // PERF TODO we can eliminate the switch here with a lookup of how much to add to depth
    +
    +    // For the first open array/object in a value, we've already incremented depth, so keep it the same
    +    // We never stop at colon, but if we did, it wouldn't affect depth
    +    case '[': case '{': case ':':
    +      logger::log_start_value(*this, "skip");
    +      break;
    +    // If there is a comma, we have just finished a value in an array/object, and need to get back in
    +    case ',':
    +      logger::log_value(*this, "skip");
    +      break;
    +    // ] or } means we just finished a value and need to jump out of the array/object
    +    case ']': case '}':
    +      logger::log_end_value(*this, "skip");
    +      _depth--;
    +      if (depth() <= parent_depth) { return SUCCESS; }
    +#if SIMDJSON_CHECK_EOF
    +      // If there are no more tokens, the parent is incomplete.
    +      if (at_end()) { return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "Missing [ or { at start"); }
    +#endif // SIMDJSON_CHECK_EOF
    +      break;
    +    case '"':
    +      if(*peek() == ':') {
    +        // We are at a key!!!
    +        // This might happen if you just started an object and you skip it immediately.
    +        // Performance note: it would be nice to get rid of this check as it is somewhat
    +        // expensive.
    +        // https://github.com/simdjson/simdjson/issues/1742
    +        logger::log_value(*this, "key");
    +        return_current_and_advance(); // eat up the ':'
    +        break; // important!!!
    +      }
    +      simdjson_fallthrough;
    +    // Anything else must be a scalar value
    +    default:
    +      // For the first scalar, we will have incremented depth already, so we decrement it here.
    +      logger::log_value(*this, "skip");
    +      _depth--;
    +      if (depth() <= parent_depth) { return SUCCESS; }
    +      break;
    +  }
    +
    +  // Now that we've considered the first value, we only increment/decrement for arrays/objects
    +  while (position() < end_position()) {
    +    switch (*return_current_and_advance()) {
    +      case '[': case '{':
    +        logger::log_start_value(*this, "skip");
    +        _depth++;
    +        break;
    +      // TODO consider whether matching braces is a requirement: if non-matching braces indicates
    +      // *missing* braces, then future lookups are not in the object/arrays they think they are,
    +      // violating the rule "validate enough structure that the user can be confident they are
    +      // looking at the right values."
    +      // PERF TODO we can eliminate the switch here with a lookup of how much to add to depth
    +      case ']': case '}':
    +        logger::log_end_value(*this, "skip");
    +        _depth--;
    +        if (depth() <= parent_depth) { return SUCCESS; }
    +        break;
    +      default:
    +        logger::log_value(*this, "skip", "");
    +        break;
    +    }
    +  }
    +
    +  return report_error(TAPE_ERROR, "not enough close braces");
    +}
    +
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_inline bool json_iterator::at_root() const noexcept {
    +  return position() == root_position();
    +}
    +
    +simdjson_inline bool json_iterator::is_single_token() const noexcept {
    +  return parser->implementation->n_structural_indexes == 1;
    +}
    +
    +simdjson_inline bool json_iterator::streaming() const noexcept {
    +  return _streaming;
    +}
    +
    +simdjson_inline token_position json_iterator::root_position() const noexcept {
    +  return _root;
    +}
    +
    +simdjson_inline void json_iterator::assert_at_document_depth() const noexcept {
    +  SIMDJSON_ASSUME( _depth == 1 );
    +}
    +
    +simdjson_inline void json_iterator::assert_at_root() const noexcept {
    +  SIMDJSON_ASSUME( _depth == 1 );
    +#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
    +  // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument
    +  // has side effects that will be discarded.
    +  SIMDJSON_ASSUME( token.position() == _root );
    +#endif
    +}
    +
    +simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) const noexcept {
    +  assert_valid_position(token._position + required_tokens - 1);
    +}
    +
    +simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept {
    +#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
    +  SIMDJSON_ASSUME( position >= &parser->implementation->structural_indexes[0] );
    +  SIMDJSON_ASSUME( position < &parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] );
    +#endif
    +}
    +
    +simdjson_inline bool json_iterator::at_end() const noexcept {
    +  return position() == end_position();
    +}
    +simdjson_inline token_position json_iterator::end_position() const noexcept {
    +  uint32_t n_structural_indexes{parser->implementation->n_structural_indexes};
    +  return &parser->implementation->structural_indexes[n_structural_indexes];
    +}
    +
    +inline std::string json_iterator::to_string() const noexcept {
    +  if( !is_alive() ) { return "dead json_iterator instance"; }
    +  const char * current_structural = reinterpret_cast(token.peek());
    +  return std::string("json_iterator [ depth : ") + std::to_string(_depth)
    +          + std::string(", structural : '") + std::string(current_structural,1)
    +          + std::string("', offset : ") + std::to_string(token.current_offset())
    +          + std::string("', error : ") + error_message(error)
    +          + std::string(" ]");
    +}
    +
    +inline simdjson_result json_iterator::current_location() const noexcept {
    +  if (!is_alive()) {    // Unrecoverable error
    +    if (!at_root()) {
    +      return reinterpret_cast(token.peek(-1));
    +    } else {
    +      return reinterpret_cast(token.peek());
    +    }
    +  }
    +  if (at_end()) {
    +    return OUT_OF_BOUNDS;
    +  }
    +  return reinterpret_cast(token.peek());
    +}
    +
    +simdjson_inline bool json_iterator::is_alive() const noexcept {
    +  return parser;
    +}
    +
    +simdjson_inline void json_iterator::abandon() noexcept {
    +  parser = nullptr;
    +  _depth = 0;
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::return_current_and_advance() noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens();
    +#endif // SIMDJSON_CHECK_EOF
    +  return token.return_current_and_advance();
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::unsafe_pointer() const noexcept {
    +  // deliberately done without safety guard:
    +  return token.peek();
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::peek(int32_t delta) const noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens(delta+1);
    +#endif // SIMDJSON_CHECK_EOF
    +  return token.peek(delta);
    +}
    +
    +simdjson_inline uint32_t json_iterator::peek_length(int32_t delta) const noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens(delta+1);
    +#endif // #if SIMDJSON_CHECK_EOF
    +  return token.peek_length(delta);
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::peek(token_position position) const noexcept {
    +  // todo: currently we require end-of-string buffering, but the following
    +  // assert_valid_position should be turned on if/when we lift that condition.
    +  // assert_valid_position(position);
    +  // This is almost surely related to SIMDJSON_CHECK_EOF but given that SIMDJSON_CHECK_EOF
    +  // is ON by default, we have no choice but to disable it for real with a comment.
    +  return token.peek(position);
    +}
    +
    +simdjson_inline uint32_t json_iterator::peek_length(token_position position) const noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_valid_position(position);
    +#endif // SIMDJSON_CHECK_EOF
    +  return token.peek_length(position);
    +}
    +
    +simdjson_inline token_position json_iterator::last_position() const noexcept {
    +  // The following line fails under some compilers...
    +  // SIMDJSON_ASSUME(parser->implementation->n_structural_indexes > 0);
    +  // since it has side-effects.
    +  uint32_t n_structural_indexes{parser->implementation->n_structural_indexes};
    +  SIMDJSON_ASSUME(n_structural_indexes > 0);
    +  return &parser->implementation->structural_indexes[n_structural_indexes - 1];
    +}
    +simdjson_inline const uint8_t *json_iterator::peek_last() const noexcept {
    +  return token.peek(last_position());
    +}
    +
    +simdjson_inline void json_iterator::ascend_to(depth_t parent_depth) noexcept {
    +  SIMDJSON_ASSUME(parent_depth >= 0 && parent_depth < INT32_MAX - 1);
    +  SIMDJSON_ASSUME(_depth == parent_depth + 1);
    +  _depth = parent_depth;
    +}
    +
    +simdjson_inline void json_iterator::descend_to(depth_t child_depth) noexcept {
    +  SIMDJSON_ASSUME(child_depth >= 1 && child_depth < INT32_MAX);
    +  SIMDJSON_ASSUME(_depth == child_depth - 1);
    +  _depth = child_depth;
    +}
    +
    +simdjson_inline depth_t json_iterator::depth() const noexcept {
    +  return _depth;
    +}
    +
    +simdjson_inline uint8_t *&json_iterator::string_buf_loc() noexcept {
    +  return _string_buf_loc;
    +}
    +
    +simdjson_inline error_code json_iterator::report_error(error_code _error, const char *message) noexcept {
    +  SIMDJSON_ASSUME(_error != SUCCESS && _error != UNINITIALIZED && _error != INCORRECT_TYPE && _error != NO_SUCH_FIELD);
    +  logger::log_error(*this, message);
    +  error = _error;
    +  return error;
    +}
    +
    +simdjson_inline token_position json_iterator::position() const noexcept {
    +  return token.position();
    +}
    +
    +simdjson_inline simdjson_result json_iterator::unescape(raw_json_string in, bool allow_replacement) noexcept {
    +  return parser->unescape(in, _string_buf_loc, allow_replacement);
    +}
    +
    +simdjson_inline simdjson_result json_iterator::unescape_wobbly(raw_json_string in) noexcept {
    +  return parser->unescape_wobbly(in, _string_buf_loc);
    +}
    +
    +simdjson_inline void json_iterator::reenter_child(token_position position, depth_t child_depth) noexcept {
    +  SIMDJSON_ASSUME(child_depth >= 1 && child_depth < INT32_MAX);
    +  SIMDJSON_ASSUME(_depth == child_depth - 1);
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
    +  SIMDJSON_ASSUME(size_t(child_depth) < parser->max_depth());
    +  SIMDJSON_ASSUME(position >= parser->start_positions[child_depth]);
    +#endif
    +#endif
    +  token.set_position(position);
    +  _depth = child_depth;
    +}
    +
    +simdjson_inline error_code json_iterator::consume_character(char c) noexcept {
    +  if (*peek() == c) {
    +    return_current_and_advance();
    +    return SUCCESS;
    +  }
    +  return TAPE_ERROR;
    +}
    +
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +
    +simdjson_inline token_position json_iterator::start_position(depth_t depth) const noexcept {
    +  SIMDJSON_ASSUME(size_t(depth) < parser->max_depth());
    +  return size_t(depth) < parser->max_depth() ? parser->start_positions[depth] : 0;
    +}
    +
    +simdjson_inline void json_iterator::set_start_position(depth_t depth, token_position position) noexcept {
    +  SIMDJSON_ASSUME(size_t(depth) < parser->max_depth());
    +  if(size_t(depth) < parser->max_depth()) { parser->start_positions[depth] = position; }
    +}
    +
    +#endif
    +
    +
    +simdjson_inline error_code json_iterator::optional_error(error_code _error, const char *message) noexcept {
    +  SIMDJSON_ASSUME(_error == INCORRECT_TYPE || _error == NO_SUCH_FIELD);
    +  logger::log_error(*this, message);
    +  return _error;
    +}
    +
    +
    +simdjson_warn_unused simdjson_inline bool json_iterator::copy_to_buffer(const uint8_t *json, uint32_t max_len, uint8_t *tmpbuf, size_t N) noexcept {
    +  // This function is not expected to be called in performance-sensitive settings.
    +  // Let us guard against silly cases:
    +  if((N < max_len) || (N == 0)) { return false; }
    +  // Copy to the buffer.
    +  std::memcpy(tmpbuf, json, max_len);
    +  if(N > max_len) { // We pad whatever remains with ' '.
    +    std::memset(tmpbuf + max_len, ' ', N - max_len);
    +  }
    +  return true;
    +}
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::json_iterator &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/json_iterator-inl.h for icelake */
    +/* including simdjson/generic/ondemand/json_type-inl.h for icelake: #include "simdjson/generic/ondemand/json_type-inl.h" */
    +/* begin file simdjson/generic/ondemand/json_type-inl.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +inline std::ostream& operator<<(std::ostream& out, json_type type) noexcept {
    +    switch (type) {
    +        case json_type::array: out << "array"; break;
    +        case json_type::object: out << "object"; break;
    +        case json_type::number: out << "number"; break;
    +        case json_type::string: out << "string"; break;
    +        case json_type::boolean: out << "boolean"; break;
    +        case json_type::null: out << "null"; break;
    +        default: SIMDJSON_UNREACHABLE();
    +    }
    +    return out;
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false) {
    +    return out << type.value();
    +}
    +#endif
    +
    +
    +
    +simdjson_inline number_type number::get_number_type() const noexcept {
    +  return type;
    +}
    +
    +simdjson_inline bool number::is_uint64() const noexcept {
    +  return get_number_type() == number_type::unsigned_integer;
    +}
    +
    +simdjson_inline uint64_t number::get_uint64() const noexcept {
    +  return payload.unsigned_integer;
    +}
    +
    +simdjson_inline number::operator uint64_t() const noexcept {
    +  return get_uint64();
    +}
    +
    +
    +simdjson_inline bool number::is_int64() const noexcept {
    +  return get_number_type() == number_type::signed_integer;
    +}
    +
    +simdjson_inline int64_t number::get_int64() const noexcept {
    +  return payload.signed_integer;
    +}
    +
    +simdjson_inline number::operator int64_t() const noexcept {
    +  return get_int64();
    +}
    +
    +simdjson_inline bool number::is_double() const noexcept {
    +    return get_number_type() == number_type::floating_point_number;
    +}
    +
    +simdjson_inline double number::get_double() const noexcept {
    +  return payload.floating_point_number;
    +}
    +
    +simdjson_inline number::operator double() const noexcept {
    +  return get_double();
    +}
    +
    +simdjson_inline double number::as_double() const noexcept {
    +  if(is_double()) {
    +    return payload.floating_point_number;
    +  }
    +  if(is_int64()) {
    +    return double(payload.signed_integer);
    +  }
    +  return double(payload.unsigned_integer);
    +}
    +
    +simdjson_inline void number::append_s64(int64_t value) noexcept {
    +  payload.signed_integer = value;
    +  type = number_type::signed_integer;
    +}
    +
    +simdjson_inline void number::append_u64(uint64_t value) noexcept {
    +  payload.unsigned_integer = value;
    +  type = number_type::unsigned_integer;
    +}
    +
    +simdjson_inline void number::append_double(double value) noexcept {
    +  payload.floating_point_number = value;
    +  type = number_type::floating_point_number;
    +}
    +
    +simdjson_inline void number::skip_double() noexcept {
    +  type = number_type::floating_point_number;
    +}
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::json_type &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H
    +/* end file simdjson/generic/ondemand/json_type-inl.h for icelake */
    +/* including simdjson/generic/ondemand/logger-inl.h for icelake: #include "simdjson/generic/ondemand/logger-inl.h" */
    +/* begin file simdjson/generic/ondemand/logger-inl.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/logger.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +namespace logger {
    +
    +static constexpr const char * DASHES = "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------";
    +static constexpr const int LOG_EVENT_LEN = 20;
    +static constexpr const int LOG_BUFFER_LEN = 30;
    +static constexpr const int LOG_SMALL_BUFFER_LEN = 10;
    +static int log_depth = 0; // Not threadsafe. Log only.
    +
    +// Helper to turn unprintable or newline characters into spaces
    +static inline char printable_char(char c) {
    +  if (c >= 0x20) {
    +    return c;
    +  } else {
    +    return ' ';
    +  }
    +}
    +
    +template
    +static inline std::string string_format(const std::string& format, const Args&... args)
    +{
    +  SIMDJSON_PUSH_DISABLE_ALL_WARNINGS
    +  int size_s = std::snprintf(nullptr, 0, format.c_str(), args...) + 1;
    +  auto size = static_cast(size_s);
    +  if (size <= 0) return std::string();
    +  std::unique_ptr buf(new char[size]);
    +  std::snprintf(buf.get(), size, format.c_str(), args...);
    +  SIMDJSON_POP_DISABLE_WARNINGS
    +  return std::string(buf.get(), buf.get() + size - 1);
    +}
    +
    +static inline log_level get_log_level_from_env()
    +{
    +  SIMDJSON_PUSH_DISABLE_WARNINGS
    +  SIMDJSON_DISABLE_DEPRECATED_WARNING // Disable CRT_SECURE warning on MSVC: manually verified this is safe
    +      char *lvl = getenv("SIMDJSON_LOG_LEVEL");
    +  SIMDJSON_POP_DISABLE_WARNINGS
    +  if (lvl && simdjson_strcasecmp(lvl, "ERROR") == 0) { return log_level::error; }
    +  return log_level::info;
    +}
    +
    +static inline log_level log_threshold()
    +{
    +  static log_level threshold = get_log_level_from_env();
    +  return threshold;
    +}
    +
    +static inline bool should_log(log_level level)
    +{
    +  return level >= log_threshold();
    +}
    +
    +inline void log_event(const json_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_line(iter, "", type, detail, delta, depth_delta, log_level::info);
    +}
    +
    +inline void log_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail) noexcept {
    +  log_line(iter, index, depth, "", type, detail, log_level::info);
    +}
    +inline void log_value(const json_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_line(iter, "", type, detail, delta, depth_delta, log_level::info);
    +}
    +
    +inline void log_start_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail) noexcept {
    +  log_line(iter, index, depth, "+", type, detail, log_level::info);
    +  if (LOG_ENABLED) { log_depth++; }
    +}
    +inline void log_start_value(const json_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  log_line(iter, "+", type, "", delta, depth_delta, log_level::info);
    +  if (LOG_ENABLED) { log_depth++; }
    +}
    +
    +inline void log_end_value(const json_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  if (LOG_ENABLED) { log_depth--; }
    +  log_line(iter, "-", type, "", delta, depth_delta, log_level::info);
    +}
    +
    +inline void log_error(const json_iterator &iter, const char *error, const char *detail, int delta, int depth_delta) noexcept {
    +  log_line(iter, "ERROR: ", error, detail, delta, depth_delta, log_level::error);
    +}
    +inline void log_error(const json_iterator &iter, token_position index, depth_t depth, const char *error, const char *detail) noexcept {
    +  log_line(iter, index, depth, "ERROR: ", error, detail, log_level::error);
    +}
    +
    +inline void log_event(const value_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_event(iter.json_iter(), type, detail, delta, depth_delta);
    +}
    +
    +inline void log_value(const value_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_value(iter.json_iter(), type, detail, delta, depth_delta);
    +}
    +
    +inline void log_start_value(const value_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  log_start_value(iter.json_iter(), type, delta, depth_delta);
    +}
    +
    +inline void log_end_value(const value_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  log_end_value(iter.json_iter(), type, delta, depth_delta);
    +}
    +
    +inline void log_error(const value_iterator &iter, const char *error, const char *detail, int delta, int depth_delta) noexcept {
    +  log_error(iter.json_iter(), error, detail, delta, depth_delta);
    +}
    +
    +inline void log_headers() noexcept {
    +  if (LOG_ENABLED) {
    +    if (simdjson_unlikely(should_log(log_level::info))) {
    +      // Technically a static variable is not thread-safe, but if you are using threads and logging... well...
    +      static bool displayed_hint{false};
    +      log_depth = 0;
    +      printf("\n");
    +      if (!displayed_hint) {
    +        // We only print this helpful header once.
    +        printf("# Logging provides the depth and position of the iterator user-visible steps:\n");
    +        printf("# +array says 'this is where we were when we discovered the start array'\n");
    +        printf(
    +            "# -array says 'this is where we were when we ended the array'\n");
    +        printf("# skip says 'this is a structural or value I am skipping'\n");
    +        printf("# +/-skip says 'this is a start/end array or object I am skipping'\n");
    +        printf("#\n");
    +        printf("# The indentation of the terms (array, string,...) indicates the depth,\n");
    +        printf("# in addition to the depth being displayed.\n");
    +        printf("#\n");
    +        printf("# Every token in the document has a single depth determined by the tokens before it,\n");
    +        printf("# and is not affected by what the token actually is.\n");
    +        printf("#\n");
    +        printf("# Not all structural elements are presented as tokens in the logs.\n");
    +        printf("#\n");
    +        printf("# We never give control to the user within an empty array or an empty object.\n");
    +        printf("#\n");
    +        printf("# Inside an array, having a depth greater than the array's depth means that\n");
    +        printf("# we are pointing inside a value.\n");
    +        printf("# Having a depth equal to the array means that we are pointing right before a value.\n");
    +        printf("# Having a depth smaller than the array means that we have moved beyond the array.\n");
    +        displayed_hint = true;
    +      }
    +      printf("\n");
    +      printf("| %-*s ", LOG_EVENT_LEN, "Event");
    +      printf("| %-*s ", LOG_BUFFER_LEN, "Buffer");
    +      printf("| %-*s ", LOG_SMALL_BUFFER_LEN, "Next");
    +      // printf("| %-*s ", 5,                    "Next#");
    +      printf("| %-*s ", 5, "Depth");
    +      printf("| Detail ");
    +      printf("|\n");
    +
    +      printf("|%.*s", LOG_EVENT_LEN + 2, DASHES);
    +      printf("|%.*s", LOG_BUFFER_LEN + 2, DASHES);
    +      printf("|%.*s", LOG_SMALL_BUFFER_LEN + 2, DASHES);
    +      // printf("|%.*s", 5+2, DASHES);
    +      printf("|%.*s", 5 + 2, DASHES);
    +      printf("|--------");
    +      printf("|\n");
    +      fflush(stdout);
    +    }
    +  }
    +}
    +
    +template 
    +inline void log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, log_level level, Args&&... args) noexcept {
    +  log_line(iter, iter.position()+delta, depth_t(iter.depth()+depth_delta), title_prefix, title, detail, level, std::forward(args)...);
    +}
    +
    +template 
    +inline void log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, log_level level, Args&&... args) noexcept {
    +  if (LOG_ENABLED) {
    +    if (simdjson_unlikely(should_log(level))) {
    +      const int indent = depth * 2;
    +      const auto buf = iter.token.buf;
    +      auto msg = string_format(title, std::forward(args)...);
    +      printf("| %*s%s%-*s ", indent, "", title_prefix,
    +             LOG_EVENT_LEN - indent - int(strlen(title_prefix)), msg.c_str());
    +      {
    +        // Print the current structural.
    +        printf("| ");
    +        // Before we begin, the index might point right before the document.
    +        // This could be unsafe, see https://github.com/simdjson/simdjson/discussions/1938
    +        if (index < iter._root) {
    +          printf("%*s", LOG_BUFFER_LEN, "");
    +        } else {
    +          auto current_structural = &buf[*index];
    +          for (int i = 0; i < LOG_BUFFER_LEN; i++) {
    +            printf("%c", printable_char(current_structural[i]));
    +          }
    +        }
    +        printf(" ");
    +      }
    +      {
    +        // Print the next structural.
    +        printf("| ");
    +        auto next_structural = &buf[*(index + 1)];
    +        for (int i = 0; i < LOG_SMALL_BUFFER_LEN; i++) {
    +          printf("%c", printable_char(next_structural[i]));
    +        }
    +        printf(" ");
    +      }
    +      // printf("| %5u ", *(index+1));
    +      printf("| %5i ", depth);
    +      printf("| %6.*s ", int(detail.size()), detail.data());
    +      printf("|\n");
    +      fflush(stdout);
    +    }
    +  }
    +}
    +
    +} // namespace logger
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H
    +/* end file simdjson/generic/ondemand/logger-inl.h for icelake */
    +/* including simdjson/generic/ondemand/object-inl.h for icelake: #include "simdjson/generic/ondemand/object-inl.h" */
    +/* begin file simdjson/generic/ondemand/object-inl.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/field.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +simdjson_inline simdjson_result object::find_field_unordered(const std::string_view key) & noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_unordered_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +simdjson_inline simdjson_result object::find_field_unordered(const std::string_view key) && noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_unordered_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +simdjson_inline simdjson_result object::operator[](const std::string_view key) & noexcept {
    +  return find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result object::operator[](const std::string_view key) && noexcept {
    +  return std::forward(*this).find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result object::find_field(const std::string_view key) & noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +simdjson_inline simdjson_result object::find_field(const std::string_view key) && noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +
    +simdjson_inline simdjson_result object::start(value_iterator &iter) noexcept {
    +  SIMDJSON_TRY( iter.start_object().error() );
    +  return object(iter);
    +}
    +simdjson_inline simdjson_result object::start_root(value_iterator &iter) noexcept {
    +  SIMDJSON_TRY( iter.start_root_object().error() );
    +  return object(iter);
    +}
    +simdjson_inline error_code object::consume() noexcept {
    +  if(iter.is_at_key()) {
    +    /**
    +     * whenever you are pointing at a key, calling skip_child() is
    +     * unsafe because you will hit a string and you will assume that
    +     * it is string value, and this mistake will lead you to make bad
    +     * depth computation.
    +     */
    +    /**
    +     * We want to 'consume' the key. We could really
    +     * just do _json_iter->return_current_and_advance(); at this
    +     * point, but, for clarity, we will use the high-level API to
    +     * eat the key. We assume that the compiler optimizes away
    +     * most of the work.
    +     */
    +    simdjson_unused raw_json_string actual_key;
    +    auto error = iter.field_key().get(actual_key);
    +    if (error) { iter.abandon(); return error; };
    +    // Let us move to the value while we are at it.
    +    if ((error = iter.field_value())) { iter.abandon(); return error; }
    +  }
    +  auto error_skip = iter.json_iter().skip_child(iter.depth()-1);
    +  if(error_skip) { iter.abandon(); }
    +  return error_skip;
    +}
    +
    +simdjson_inline simdjson_result object::raw_json() noexcept {
    +  const uint8_t * starting_point{iter.peek_start()};
    +  auto error = consume();
    +  if(error) { return error; }
    +  const uint8_t * final_point{iter._json_iter->peek()};
    +  return std::string_view(reinterpret_cast(starting_point), size_t(final_point - starting_point));
    +}
    +
    +simdjson_inline simdjson_result object::started(value_iterator &iter) noexcept {
    +  SIMDJSON_TRY( iter.started_object().error() );
    +  return object(iter);
    +}
    +
    +simdjson_inline object object::resume(const value_iterator &iter) noexcept {
    +  return iter;
    +}
    +
    +simdjson_inline object::object(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{
    +}
    +
    +simdjson_inline simdjson_result object::begin() noexcept {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  return object_iterator(iter);
    +}
    +simdjson_inline simdjson_result object::end() noexcept {
    +  return object_iterator(iter);
    +}
    +
    +inline simdjson_result object::at_pointer(std::string_view json_pointer) noexcept {
    +  if (json_pointer[0] != '/') { return INVALID_JSON_POINTER; }
    +  json_pointer = json_pointer.substr(1);
    +  size_t slash = json_pointer.find('/');
    +  std::string_view key = json_pointer.substr(0, slash);
    +  // Grab the child with the given key
    +  simdjson_result child;
    +
    +  // If there is an escape character in the key, unescape it and then get the child.
    +  size_t escape = key.find('~');
    +  if (escape != std::string_view::npos) {
    +    // Unescape the key
    +    std::string unescaped(key);
    +    do {
    +      switch (unescaped[escape+1]) {
    +        case '0':
    +          unescaped.replace(escape, 2, "~");
    +          break;
    +        case '1':
    +          unescaped.replace(escape, 2, "/");
    +          break;
    +        default:
    +          return INVALID_JSON_POINTER; // "Unexpected ~ escape character in JSON pointer");
    +      }
    +      escape = unescaped.find('~', escape+1);
    +    } while (escape != std::string::npos);
    +    child = find_field(unescaped);  // Take note find_field does not unescape keys when matching
    +  } else {
    +    child = find_field(key);
    +  }
    +  if(child.error()) {
    +    return child; // we do not continue if there was an error
    +  }
    +  // If there is a /, we have to recurse and look up more of the path
    +  if (slash != std::string_view::npos) {
    +    child = child.at_pointer(json_pointer.substr(slash));
    +  }
    +  return child;
    +}
    +
    +simdjson_inline simdjson_result object::count_fields() & noexcept {
    +  size_t count{0};
    +  // Important: we do not consume any of the values.
    +  for(simdjson_unused auto v : *this) { count++; }
    +  // The above loop will always succeed, but we want to report errors.
    +  if(iter.error()) { return iter.error(); }
    +  // We need to move back at the start because we expect users to iterate through
    +  // the object after counting the number of elements.
    +  iter.reset_object();
    +  return count;
    +}
    +
    +simdjson_inline simdjson_result object::is_empty() & noexcept {
    +  bool is_not_empty;
    +  auto error = iter.reset_object().get(is_not_empty);
    +  if(error) { return error; }
    +  return !is_not_empty;
    +}
    +
    +simdjson_inline simdjson_result object::reset() & noexcept {
    +  return iter.reset_object();
    +}
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::object &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +simdjson_inline simdjson_result simdjson_result::begin() noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() noexcept {
    +  if (error()) { return error(); }
    +  return first.end();
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first)[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).find_field(key);
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +inline simdjson_result simdjson_result::reset() noexcept {
    +  if (error()) { return error(); }
    +  return first.reset();
    +}
    +
    +inline simdjson_result simdjson_result::is_empty() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_empty();
    +}
    +
    +simdjson_inline  simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +
    +simdjson_inline  simdjson_result simdjson_result::raw_json() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json();
    +}
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H
    +/* end file simdjson/generic/ondemand/object-inl.h for icelake */
    +/* including simdjson/generic/ondemand/object_iterator-inl.h for icelake: #include "simdjson/generic/ondemand/object_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/object_iterator-inl.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/field-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +//
    +// object_iterator
    +//
    +
    +simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{}
    +
    +simdjson_inline simdjson_result object_iterator::operator*() noexcept {
    +  error_code error = iter.error();
    +  if (error) { iter.abandon(); return error; }
    +  auto result = field::start(iter);
    +  // TODO this is a safety rail ... users should exit loops as soon as they receive an error.
    +  // Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free.
    +  if (result.error()) { iter.abandon(); }
    +  return result;
    +}
    +simdjson_inline bool object_iterator::operator==(const object_iterator &other) const noexcept {
    +  return !(*this != other);
    +}
    +simdjson_inline bool object_iterator::operator!=(const object_iterator &) const noexcept {
    +  return iter.is_open();
    +}
    +
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_inline object_iterator &object_iterator::operator++() noexcept {
    +  // TODO this is a safety rail ... users should exit loops as soon as they receive an error.
    +  // Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free.
    +  if (!iter.is_open()) { return *this; } // Iterator will be released if there is an error
    +
    +  simdjson_unused error_code error;
    +  if ((error = iter.skip_child() )) { return *this; }
    +
    +  simdjson_unused bool has_value;
    +  if ((error = iter.has_next_field().get(has_value) )) { return *this; };
    +  return *this;
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +//
    +// ### Live States
    +//
    +// While iterating or looking up values, depth >= iter.depth. at_start may vary. Error is
    +// always SUCCESS:
    +//
    +// - Start: This is the state when the object is first found and the iterator is just past the {.
    +//   In this state, at_start == true.
    +// - Next: After we hand a scalar value to the user, or an array/object which they then fully
    +//   iterate over, the iterator is at the , or } before the next value. In this state,
    +//   depth == iter.depth, at_start == false, and error == SUCCESS.
    +// - Unfinished Business: When we hand an array/object to the user which they do not fully
    +//   iterate over, we need to finish that iteration by skipping child values until we reach the
    +//   Next state. In this state, depth > iter.depth, at_start == false, and error == SUCCESS.
    +//
    +// ## Error States
    +//
    +// In error states, we will yield exactly one more value before stopping. iter.depth == depth
    +// and at_start is always false. We decrement after yielding the error, moving to the Finished
    +// state.
    +//
    +// - Chained Error: When the object iterator is part of an error chain--for example, in
    +//   `for (auto tweet : doc["tweets"])`, where the tweet field may be missing or not be an
    +//   object--we yield that error in the loop, exactly once. In this state, error != SUCCESS and
    +//   iter.depth == depth, and at_start == false. We decrement depth when we yield the error.
    +// - Missing Comma Error: When the iterator ++ method discovers there is no comma between fields,
    +//   we flag that as an error and treat it exactly the same as a Chained Error. In this state,
    +//   error == TAPE_ERROR, iter.depth == depth, and at_start == false.
    +//
    +// Errors that occur while reading a field to give to the user (such as when the key is not a
    +// string or the field is missing a colon) are yielded immediately. Depth is then decremented,
    +// moving to the Finished state without transitioning through an Error state at all.
    +//
    +// ## Terminal State
    +//
    +// The terminal state has iter.depth < depth. at_start is always false.
    +//
    +// - Finished: When we have reached a }, we are finished. We signal this by decrementing depth.
    +//   In this state, iter.depth < depth, at_start == false, and error == SUCCESS.
    +//
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  icelake::ondemand::object_iterator &&value
    +) noexcept
    +  : implementation_simdjson_result_base(std::forward(value))
    +{
    +  first.iter.assert_is_valid();
    +}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +  : implementation_simdjson_result_base({}, error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::operator*() noexcept {
    +  if (error()) { return error(); }
    +  return *first;
    +}
    +// If we're iterating and there is an error, return the error once.
    +simdjson_inline bool simdjson_result::operator==(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return !error(); }
    +  return first == other.first;
    +}
    +// If we're iterating and there is an error, return the error once.
    +simdjson_inline bool simdjson_result::operator!=(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return error(); }
    +  return first != other.first;
    +}
    +// Checks for ']' and ','
    +simdjson_inline simdjson_result &simdjson_result::operator++() noexcept {
    +  // Clear the error if there is one, so we don't yield it twice
    +  if (error()) { second = SUCCESS; return *this; }
    +  ++first;
    +  return *this;
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/object_iterator-inl.h for icelake */
    +/* including simdjson/generic/ondemand/parser-inl.h for icelake: #include "simdjson/generic/ondemand/parser-inl.h" */
    +/* begin file simdjson/generic/ondemand/parser-inl.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/padded_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/padded_string_view.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/dom/base.h" // for MINIMAL_DOCUMENT_CAPACITY */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document_stream.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +simdjson_inline parser::parser(size_t max_capacity) noexcept
    +  : _max_capacity{max_capacity} {
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code parser::allocate(size_t new_capacity, size_t new_max_depth) noexcept {
    +  if (new_capacity > max_capacity()) { return CAPACITY; }
    +  if (string_buf && new_capacity == capacity() && new_max_depth == max_depth()) { return SUCCESS; }
    +
    +  // string_capacity copied from document::allocate
    +  _capacity = 0;
    +  size_t string_capacity = SIMDJSON_ROUNDUP_N(5 * new_capacity / 3 + SIMDJSON_PADDING, 64);
    +  string_buf.reset(new (std::nothrow) uint8_t[string_capacity]);
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  start_positions.reset(new (std::nothrow) token_position[new_max_depth]);
    +#endif
    +  if (implementation) {
    +    SIMDJSON_TRY( implementation->set_capacity(new_capacity) );
    +    SIMDJSON_TRY( implementation->set_max_depth(new_max_depth) );
    +  } else {
    +    SIMDJSON_TRY( simdjson::get_active_implementation()->create_dom_parser_implementation(new_capacity, new_max_depth, implementation) );
    +  }
    +  _capacity = new_capacity;
    +  _max_depth = new_max_depth;
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(padded_string_view json) & noexcept {
    +  if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; }
    +
    +  json.remove_utf8_bom();
    +
    +  // Allocate if needed
    +  if (capacity() < json.length() || !string_buf) {
    +    SIMDJSON_TRY( allocate(json.length(), max_depth()) );
    +  }
    +
    +  // Run stage 1.
    +  SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) );
    +  return document::start({ reinterpret_cast(json.data()), this });
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const char *json, size_t len, size_t allocated) & noexcept {
    +  return iterate(padded_string_view(json, len, allocated));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const uint8_t *json, size_t len, size_t allocated) & noexcept {
    +  return iterate(padded_string_view(json, len, allocated));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string_view json, size_t allocated) & noexcept {
    +  return iterate(padded_string_view(json, allocated));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string &json) & noexcept {
    +  if(json.capacity() - json.size() < SIMDJSON_PADDING) {
    +    json.reserve(json.size() + SIMDJSON_PADDING);
    +  }
    +  return iterate(padded_string_view(json));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const std::string &json) & noexcept {
    +  return iterate(padded_string_view(json));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept {
    +  // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception
    +  SIMDJSON_TRY( result.error() );
    +  padded_string_view json = result.value_unsafe();
    +  return iterate(json);
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept {
    +  // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception
    +  SIMDJSON_TRY( result.error() );
    +  const padded_string &json = result.value_unsafe();
    +  return iterate(json);
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate_raw(padded_string_view json) & noexcept {
    +  if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; }
    +
    +  json.remove_utf8_bom();
    +
    +  // Allocate if needed
    +  if (capacity() < json.length()) {
    +    SIMDJSON_TRY( allocate(json.length(), max_depth()) );
    +  }
    +
    +  // Run stage 1.
    +  SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) );
    +  return json_iterator(reinterpret_cast(json.data()), this);
    +}
    +
    +inline simdjson_result parser::iterate_many(const uint8_t *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept {
    +  if(batch_size < MINIMAL_BATCH_SIZE) { batch_size = MINIMAL_BATCH_SIZE; }
    +  if((len >= 3) && (std::memcmp(buf, "\xEF\xBB\xBF", 3) == 0)) {
    +    buf += 3;
    +    len -= 3;
    +  }
    +  if(allow_comma_separated && batch_size < len) { batch_size = len; }
    +  return document_stream(*this, buf, len, batch_size, allow_comma_separated);
    +}
    +inline simdjson_result parser::iterate_many(const char *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept {
    +  return iterate_many(reinterpret_cast(buf), len, batch_size, allow_comma_separated);
    +}
    +inline simdjson_result parser::iterate_many(const std::string &s, size_t batch_size, bool allow_comma_separated) noexcept {
    +  return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated);
    +}
    +inline simdjson_result parser::iterate_many(const padded_string &s, size_t batch_size, bool allow_comma_separated) noexcept {
    +  return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated);
    +}
    +
    +simdjson_inline size_t parser::capacity() const noexcept {
    +  return _capacity;
    +}
    +simdjson_inline size_t parser::max_capacity() const noexcept {
    +  return _max_capacity;
    +}
    +simdjson_inline size_t parser::max_depth() const noexcept {
    +  return _max_depth;
    +}
    +
    +simdjson_inline void parser::set_max_capacity(size_t max_capacity) noexcept {
    +  if(max_capacity < dom::MINIMAL_DOCUMENT_CAPACITY) {
    +    _max_capacity = max_capacity;
    +  } else {
    +    _max_capacity = dom::MINIMAL_DOCUMENT_CAPACITY;
    +  }
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result parser::unescape(raw_json_string in, uint8_t *&dst, bool allow_replacement) const noexcept {
    +  uint8_t *end = implementation->parse_string(in.buf, dst, allow_replacement);
    +  if (!end) { return STRING_ERROR; }
    +  std::string_view result(reinterpret_cast(dst), end-dst);
    +  dst = end;
    +  return result;
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result parser::unescape_wobbly(raw_json_string in, uint8_t *&dst) const noexcept {
    +  uint8_t *end = implementation->parse_wobbly_string(in.buf, dst);
    +  if (!end) { return STRING_ERROR; }
    +  std::string_view result(reinterpret_cast(dst), end-dst);
    +  dst = end;
    +  return result;
    +}
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::parser &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H
    +/* end file simdjson/generic/ondemand/parser-inl.h for icelake */
    +/* including simdjson/generic/ondemand/raw_json_string-inl.h for icelake: #include "simdjson/generic/ondemand/raw_json_string-inl.h" */
    +/* begin file simdjson/generic/ondemand/raw_json_string-inl.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +
    +namespace icelake {
    +namespace ondemand {
    +
    +simdjson_inline raw_json_string::raw_json_string(const uint8_t * _buf) noexcept : buf{_buf} {}
    +
    +simdjson_inline const char * raw_json_string::raw() const noexcept { return reinterpret_cast(buf); }
    +
    +
    +simdjson_inline bool raw_json_string::is_free_from_unescaped_quote(std::string_view target) noexcept {
    +  size_t pos{0};
    +  // if the content has no escape character, just scan through it quickly!
    +  for(;pos < target.size() && target[pos] != '\\';pos++) {}
    +  // slow path may begin.
    +  bool escaping{false};
    +  for(;pos < target.size();pos++) {
    +    if((target[pos] == '"') && !escaping) {
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  return true;
    +}
    +
    +simdjson_inline bool raw_json_string::is_free_from_unescaped_quote(const char* target) noexcept {
    +  size_t pos{0};
    +  // if the content has no escape character, just scan through it quickly!
    +  for(;target[pos] && target[pos] != '\\';pos++) {}
    +  // slow path may begin.
    +  bool escaping{false};
    +  for(;target[pos];pos++) {
    +    if((target[pos] == '"') && !escaping) {
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  return true;
    +}
    +
    +
    +simdjson_inline bool raw_json_string::unsafe_is_equal(size_t length, std::string_view target) const noexcept {
    +  // If we are going to call memcmp, then we must know something about the length of the raw_json_string.
    +  return (length >= target.size()) && (raw()[target.size()] == '"') && !memcmp(raw(), target.data(), target.size());
    +}
    +
    +simdjson_inline bool raw_json_string::unsafe_is_equal(std::string_view target) const noexcept {
    +  // Assumptions: does not contain unescaped quote characters, and
    +  // the raw content is quote terminated within a valid JSON string.
    +  if(target.size() <= SIMDJSON_PADDING) {
    +    return (raw()[target.size()] == '"') && !memcmp(raw(), target.data(), target.size());
    +  }
    +  const char * r{raw()};
    +  size_t pos{0};
    +  for(;pos < target.size();pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +simdjson_inline bool raw_json_string::is_equal(std::string_view target) const noexcept {
    +  const char * r{raw()};
    +  size_t pos{0};
    +  bool escaping{false};
    +  for(;pos < target.size();pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +    // if target is a compile-time constant and it is free from
    +    // quotes, then the next part could get optimized away through
    +    // inlining.
    +    if((target[pos] == '"') && !escaping) {
    +      // We have reached the end of the raw_json_string but
    +      // the target is not done.
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +
    +simdjson_inline bool raw_json_string::unsafe_is_equal(const char * target) const noexcept {
    +  // Assumptions: 'target' does not contain unescaped quote characters, is null terminated and
    +  // the raw content is quote terminated within a valid JSON string.
    +  const char * r{raw()};
    +  size_t pos{0};
    +  for(;target[pos];pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +simdjson_inline bool raw_json_string::is_equal(const char* target) const noexcept {
    +  // Assumptions: does not contain unescaped quote characters, and
    +  // the raw content is quote terminated within a valid JSON string.
    +  const char * r{raw()};
    +  size_t pos{0};
    +  bool escaping{false};
    +  for(;target[pos];pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +    // if target is a compile-time constant and it is free from
    +    // quotes, then the next part could get optimized away through
    +    // inlining.
    +    if((target[pos] == '"') && !escaping) {
    +      // We have reached the end of the raw_json_string but
    +      // the target is not done.
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept {
    +  return a.unsafe_is_equal(c);
    +}
    +
    +simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept {
    +  return a == c;
    +}
    +
    +simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept {
    +  return !(a == c);
    +}
    +
    +simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept {
    +  return !(a == c);
    +}
    +
    +
    +simdjson_inline simdjson_warn_unused simdjson_result raw_json_string::unescape(json_iterator &iter, bool allow_replacement) const noexcept {
    +  return iter.unescape(*this, allow_replacement);
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result raw_json_string::unescape_wobbly(json_iterator &iter) const noexcept {
    +  return iter.unescape_wobbly(*this);
    +}
    +
    +simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &out, const raw_json_string &str) noexcept {
    +  bool in_escape = false;
    +  const char *s = str.raw();
    +  while (true) {
    +    switch (*s) {
    +      case '\\': in_escape = !in_escape; break;
    +      case '"': if (in_escape) { in_escape = false; } else { return out; } break;
    +      default: if (in_escape) { in_escape = false; }
    +    }
    +    out << *s;
    +    s++;
    +  }
    +}
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::raw_json_string &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +simdjson_inline simdjson_result simdjson_result::raw() const noexcept {
    +  if (error()) { return error(); }
    +  return first.raw();
    +}
    +simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape(icelake::ondemand::json_iterator &iter, bool allow_replacement) const noexcept {
    +  if (error()) { return error(); }
    +  return first.unescape(iter, allow_replacement);
    +}
    +simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape_wobbly(icelake::ondemand::json_iterator &iter) const noexcept {
    +  if (error()) { return error(); }
    +  return first.unescape_wobbly(iter);
    +}
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H
    +/* end file simdjson/generic/ondemand/raw_json_string-inl.h for icelake */
    +/* including simdjson/generic/ondemand/serialization-inl.h for icelake: #include "simdjson/generic/ondemand/serialization-inl.h" */
    +/* begin file simdjson/generic/ondemand/serialization-inl.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/serialization.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +
    +inline std::string_view trim(const std::string_view str) noexcept {
    +  // We can almost surely do better by rolling our own find_first_not_of function.
    +  size_t first = str.find_first_not_of(" \t\n\r");
    +  // If we have the empty string (just white space), then no trimming is possible, and
    +  // we return the empty string_view.
    +  if (std::string_view::npos == first) { return std::string_view(); }
    +  size_t last = str.find_last_not_of(" \t\n\r");
    +  return str.substr(first, (last - first + 1));
    +}
    +
    +
    +inline simdjson_result to_json_string(icelake::ondemand::document& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(icelake::ondemand::document_reference& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(icelake::ondemand::value& x) noexcept {
    +  /**
    +   * If we somehow receive a value that has already been consumed,
    +   * then the following code could be in trouble. E.g., we create
    +   * an array as needed, but if an array was already created, then
    +   * it could be bad.
    +   */
    +  using namespace icelake::ondemand;
    +  icelake::ondemand::json_type t;
    +  auto error = x.type().get(t);
    +  if(error != SUCCESS) { return error; }
    +  switch (t)
    +  {
    +    case json_type::array:
    +    {
    +      icelake::ondemand::array array;
    +      error = x.get_array().get(array);
    +      if(error) { return error; }
    +      return to_json_string(array);
    +    }
    +    case json_type::object:
    +    {
    +      icelake::ondemand::object object;
    +      error = x.get_object().get(object);
    +      if(error) { return error; }
    +      return to_json_string(object);
    +    }
    +    default:
    +      return trim(x.raw_json_token());
    +  }
    +}
    +
    +inline simdjson_result to_json_string(icelake::ondemand::object& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(icelake::ondemand::array& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +} // namespace simdjson
    +
    +namespace simdjson { namespace icelake { namespace ondemand {
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::value x) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(x).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::value x) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(x).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::array value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::array value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::document& value)  {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::document_reference& value)  {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::document& value)  {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::object value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out,  simdjson::simdjson_result x) {
    +  if (x.error()) { throw  simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::icelake::ondemand::object value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +}}} // namespace simdjson::icelake::ondemand
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H
    +/* end file simdjson/generic/ondemand/serialization-inl.h for icelake */
    +/* including simdjson/generic/ondemand/token_iterator-inl.h for icelake: #include "simdjson/generic/ondemand/token_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/token_iterator-inl.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/token_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +simdjson_inline token_iterator::token_iterator(
    +  const uint8_t *_buf,
    +  token_position position
    +) noexcept : buf{_buf}, _position{position}
    +{
    +}
    +
    +simdjson_inline uint32_t token_iterator::current_offset() const noexcept {
    +  return *(_position);
    +}
    +
    +
    +simdjson_inline const uint8_t *token_iterator::return_current_and_advance() noexcept {
    +  return &buf[*(_position++)];
    +}
    +
    +simdjson_inline const uint8_t *token_iterator::peek(token_position position) const noexcept {
    +  return &buf[*position];
    +}
    +simdjson_inline uint32_t token_iterator::peek_index(token_position position) const noexcept {
    +  return *position;
    +}
    +simdjson_inline uint32_t token_iterator::peek_length(token_position position) const noexcept {
    +  return *(position+1) - *position;
    +}
    +
    +simdjson_inline const uint8_t *token_iterator::peek(int32_t delta) const noexcept {
    +  return &buf[*(_position+delta)];
    +}
    +simdjson_inline uint32_t token_iterator::peek_index(int32_t delta) const noexcept {
    +  return *(_position+delta);
    +}
    +simdjson_inline uint32_t token_iterator::peek_length(int32_t delta) const noexcept {
    +  return *(_position+delta+1) - *(_position+delta);
    +}
    +
    +simdjson_inline token_position token_iterator::position() const noexcept {
    +  return _position;
    +}
    +simdjson_inline void token_iterator::set_position(token_position target_position) noexcept {
    +  _position = target_position;
    +}
    +
    +simdjson_inline bool token_iterator::operator==(const token_iterator &other) const noexcept {
    +  return _position == other._position;
    +}
    +simdjson_inline bool token_iterator::operator!=(const token_iterator &other) const noexcept {
    +  return _position != other._position;
    +}
    +simdjson_inline bool token_iterator::operator>(const token_iterator &other) const noexcept {
    +  return _position > other._position;
    +}
    +simdjson_inline bool token_iterator::operator>=(const token_iterator &other) const noexcept {
    +  return _position >= other._position;
    +}
    +simdjson_inline bool token_iterator::operator<(const token_iterator &other) const noexcept {
    +  return _position < other._position;
    +}
    +simdjson_inline bool token_iterator::operator<=(const token_iterator &other) const noexcept {
    +  return _position <= other._position;
    +}
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::token_iterator &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/token_iterator-inl.h for icelake */
    +/* including simdjson/generic/ondemand/value-inl.h for icelake: #include "simdjson/generic/ondemand/value-inl.h" */
    +/* begin file simdjson/generic/ondemand/value-inl.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +simdjson_inline value::value(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{
    +}
    +simdjson_inline value value::start(const value_iterator &iter) noexcept {
    +  return iter;
    +}
    +simdjson_inline value value::resume(const value_iterator &iter) noexcept {
    +  return iter;
    +}
    +
    +simdjson_inline simdjson_result value::get_array() noexcept {
    +  return array::start(iter);
    +}
    +simdjson_inline simdjson_result value::get_object() noexcept {
    +  return object::start(iter);
    +}
    +simdjson_inline simdjson_result value::start_or_resume_object() noexcept {
    +  if (iter.at_start()) {
    +    return get_object();
    +  } else {
    +    return object::resume(iter);
    +  }
    +}
    +
    +simdjson_inline simdjson_result value::get_raw_json_string() noexcept {
    +  return iter.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result value::get_string(bool allow_replacement) noexcept {
    +  return iter.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code value::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  return iter.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result value::get_wobbly_string() noexcept {
    +  return iter.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result value::get_double() noexcept {
    +  return iter.get_double();
    +}
    +simdjson_inline simdjson_result value::get_double_in_string() noexcept {
    +  return iter.get_double_in_string();
    +}
    +simdjson_inline simdjson_result value::get_uint64() noexcept {
    +  return iter.get_uint64();
    +}
    +simdjson_inline simdjson_result value::get_uint64_in_string() noexcept {
    +  return iter.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result value::get_int64() noexcept {
    +  return iter.get_int64();
    +}
    +simdjson_inline simdjson_result value::get_int64_in_string() noexcept {
    +  return iter.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result value::get_bool() noexcept {
    +  return iter.get_bool();
    +}
    +simdjson_inline simdjson_result value::is_null() noexcept {
    +  return iter.is_null();
    +}
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_array(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_object(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_raw_json_string(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_string(false); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_number(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_double(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_uint64(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_int64(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_bool(); }
    +
    +template simdjson_inline error_code value::get(T &out) noexcept {
    +  return get().get(out);
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline value::operator array() noexcept(false) {
    +  return get_array();
    +}
    +simdjson_inline value::operator object() noexcept(false) {
    +  return get_object();
    +}
    +simdjson_inline value::operator uint64_t() noexcept(false) {
    +  return get_uint64();
    +}
    +simdjson_inline value::operator int64_t() noexcept(false) {
    +  return get_int64();
    +}
    +simdjson_inline value::operator double() noexcept(false) {
    +  return get_double();
    +}
    +simdjson_inline value::operator std::string_view() noexcept(false) {
    +  return get_string(false);
    +}
    +simdjson_inline value::operator raw_json_string() noexcept(false) {
    +  return get_raw_json_string();
    +}
    +simdjson_inline value::operator bool() noexcept(false) {
    +  return get_bool();
    +}
    +#endif
    +
    +simdjson_inline simdjson_result value::begin() & noexcept {
    +  return get_array().begin();
    +}
    +simdjson_inline simdjson_result value::end() & noexcept {
    +  return {};
    +}
    +simdjson_inline simdjson_result value::count_elements() & noexcept {
    +  simdjson_result answer;
    +  auto a = get_array();
    +  answer = a.count_elements();
    +  // count_elements leaves you pointing inside the array, at the first element.
    +  // We need to move back so that the user can create a new array (which requires that
    +  // we point at '[').
    +  iter.move_at_start();
    +  return answer;
    +}
    +simdjson_inline simdjson_result value::count_fields() & noexcept {
    +  simdjson_result answer;
    +  auto a = get_object();
    +  answer = a.count_fields();
    +  iter.move_at_start();
    +  return answer;
    +}
    +simdjson_inline simdjson_result value::at(size_t index) noexcept {
    +  auto a = get_array();
    +  return a.at(index);
    +}
    +
    +simdjson_inline simdjson_result value::find_field(std::string_view key) noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +simdjson_inline simdjson_result value::find_field(const char *key) noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +
    +simdjson_inline simdjson_result value::find_field_unordered(std::string_view key) noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result value::find_field_unordered(const char *key) noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +
    +simdjson_inline simdjson_result value::operator[](std::string_view key) noexcept {
    +  return start_or_resume_object()[key];
    +}
    +simdjson_inline simdjson_result value::operator[](const char *key) noexcept {
    +  return start_or_resume_object()[key];
    +}
    +
    +simdjson_inline simdjson_result value::type() noexcept {
    +  return iter.type();
    +}
    +
    +simdjson_inline simdjson_result value::is_scalar() noexcept {
    +  json_type this_type;
    +  auto error = type().get(this_type);
    +  if(error) { return error; }
    +  return ! ((this_type == json_type::array) || (this_type == json_type::object));
    +}
    +
    +simdjson_inline bool value::is_negative() noexcept {
    +  return iter.is_negative();
    +}
    +
    +simdjson_inline simdjson_result value::is_integer() noexcept {
    +  return iter.is_integer();
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value::get_number_type() noexcept {
    +  return iter.get_number_type();
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value::get_number() noexcept {
    +  return iter.get_number();
    +}
    +
    +simdjson_inline std::string_view value::raw_json_token() noexcept {
    +  return std::string_view(reinterpret_cast(iter.peek_start()), iter.peek_start_length());
    +}
    +
    +simdjson_inline simdjson_result value::raw_json() noexcept {
    +  json_type t;
    +  SIMDJSON_TRY(type().get(t));
    +  switch (t)
    +  {
    +    case json_type::array: {
    +      ondemand::array array;
    +      SIMDJSON_TRY(get_array().get(array));
    +      return array.raw_json();
    +    }
    +    case json_type::object: {
    +      ondemand::object object;
    +      SIMDJSON_TRY(get_object().get(object));
    +      return object.raw_json();
    +    }
    +    default:
    +      return raw_json_token();
    +  }
    +}
    +
    +simdjson_inline simdjson_result value::current_location() noexcept {
    +  return iter.json_iter().current_location();
    +}
    +
    +simdjson_inline int32_t value::current_depth() const noexcept{
    +  return iter.json_iter().depth();
    +}
    +
    +simdjson_inline simdjson_result value::at_pointer(std::string_view json_pointer) noexcept {
    +  json_type t;
    +  SIMDJSON_TRY(type().get(t));
    +  switch (t)
    +  {
    +    case json_type::array:
    +      return (*this).get_array().at_pointer(json_pointer);
    +    case json_type::object:
    +      return (*this).get_object().at_pointer(json_pointer);
    +    default:
    +      return INVALID_JSON_POINTER;
    +  }
    +}
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  icelake::ondemand::value &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(error)
    +{
    +}
    +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +simdjson_inline simdjson_result simdjson_result::at(size_t index) noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline simdjson_result simdjson_result::begin() & noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() & noexcept {
    +  if (error()) { return error(); }
    +  return {};
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::get_array() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_array();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_object() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_object();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_bool();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_null() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_null();
    +}
    +
    +template simdjson_inline simdjson_result simdjson_result::get() noexcept {
    +  if (error()) { return error(); }
    +  return first.get();
    +}
    +template simdjson_inline error_code simdjson_result::get(T &out) noexcept {
    +  if (error()) { return error(); }
    +  return first.get(out);
    +}
    +
    +template<> simdjson_inline simdjson_result simdjson_result::get() noexcept  {
    +  if (error()) { return error(); }
    +  return std::move(first);
    +}
    +template<> simdjson_inline error_code simdjson_result::get(icelake::ondemand::value &out) noexcept {
    +  if (error()) { return error(); }
    +  out = first;
    +  return SUCCESS;
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::type() noexcept {
    +  if (error()) { return error(); }
    +  return first.type();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_scalar();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_negative() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_negative();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_integer();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number_type();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number();
    +}
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline simdjson_result::operator icelake::ondemand::array() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator icelake::ondemand::object() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator int64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator double() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator icelake::ondemand::raw_json_string() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator bool() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +#endif
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json_token();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::current_location() noexcept {
    +  if (error()) { return error(); }
    +  return first.current_location();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::current_depth() const noexcept {
    +  if (error()) { return error(); }
    +  return first.current_depth();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H
    +/* end file simdjson/generic/ondemand/value-inl.h for icelake */
    +/* including simdjson/generic/ondemand/value_iterator-inl.h for icelake: #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/value_iterator-inl.h for icelake */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/atomparsing.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/numberparsing.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace icelake {
    +namespace ondemand {
    +
    +simdjson_inline value_iterator::value_iterator(
    +  json_iterator *json_iter,
    +  depth_t depth,
    +  token_position start_position
    +) noexcept : _json_iter{json_iter}, _depth{depth}, _start_position{start_position}
    +{
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_object() noexcept {
    +  SIMDJSON_TRY( start_container('{', "Not an object", "object") );
    +  return started_object();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_object() noexcept {
    +  SIMDJSON_TRY( start_container('{', "Not an object", "object") );
    +  return started_root_object();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_object() noexcept {
    +  assert_at_container_start();
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  _json_iter->set_start_position(_depth, start_position());
    +#endif
    +  if (*_json_iter->peek() == '}') {
    +    logger::log_value(*_json_iter, "empty object");
    +    _json_iter->return_current_and_advance();
    +    end_container();
    +    return false;
    +  }
    +  return true;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::check_root_object() noexcept {
    +  // When in streaming mode, we cannot expect peek_last() to be the last structural element of the
    +  // current document. It only works in the normal mode where we have indexed a single document.
    +  // Note that adding a check for 'streaming' is not expensive since we only have at most
    +  // one root element.
    +  if ( ! _json_iter->streaming() ) {
    +    // The following lines do not fully protect against garbage content within the
    +    // object: e.g., `{"a":2} foo }`. Users concerned with garbage content should
    +    // call `at_end()` on the document instance at the end of the processing to
    +    // ensure that the processing has finished at the end.
    +    //
    +    if (*_json_iter->peek_last() != '}') {
    +      _json_iter->abandon();
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing } at end");
    +    }
    +    // If the last character is } *and* the first gibberish character is also '}'
    +    // then on-demand could accidentally go over. So we need additional checks.
    +    // https://github.com/simdjson/simdjson/issues/1834
    +    // Checking that the document is balanced requires a full scan which is potentially
    +    // expensive, but it only happens in edge cases where the first padding character is
    +    // a closing bracket.
    +    if ((*_json_iter->peek(_json_iter->end_position()) == '}') && (!_json_iter->balanced())) {
    +      _json_iter->abandon();
    +      // The exact error would require more work. It will typically be an unclosed object.
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "the document is unbalanced");
    +    }
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_object() noexcept {
    +  auto error = check_root_object();
    +  if(error) { return error; }
    +  return started_object();
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::end_container() noexcept {
    +#if SIMDJSON_CHECK_EOF
    +    if (depth() > 1 && at_end()) { return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing parent ] or }"); }
    +    // if (depth() <= 1 && !at_end()) { return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing [ or { at start"); }
    +#endif // SIMDJSON_CHECK_EOF
    +    _json_iter->ascend_to(depth()-1);
    +    return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_field() noexcept {
    +  assert_at_next();
    +
    +  // It's illegal to call this unless there are more tokens: anything that ends in } or ] is
    +  // obligated to verify there are more tokens if they are not the top level.
    +  switch (*_json_iter->return_current_and_advance()) {
    +    case '}':
    +      logger::log_end_value(*_json_iter, "object");
    +      SIMDJSON_TRY( end_container() );
    +      return false;
    +    case ',':
    +      return true;
    +    default:
    +      return report_error(TAPE_ERROR, "Missing comma between object fields");
    +  }
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::find_field_raw(const std::string_view key) noexcept {
    +  error_code error;
    +  bool has_value;
    +  //
    +  // Initially, the object can be in one of a few different places:
    +  //
    +  // 1. The start of the object, at the first field:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //      ^ (depth 2, index 1)
    +  //    ```
    +  if (at_first_field()) {
    +    has_value = true;
    +
    +  //
    +  // 2. When a previous search did not yield a value or the object is empty:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                     ^ (depth 0)
    +  //    { }
    +  //        ^ (depth 0, index 2)
    +  //    ```
    +  //
    +  } else if (!is_open()) {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    // If we're past the end of the object, we're being iterated out of order.
    +    // Note: this isn't perfect detection. It's possible the user is inside some other object; if so,
    +    // this object iterator will blithely scan that object for fields.
    +    if (_json_iter->depth() < depth() - 1) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +    return false;
    +
    +  // 3. When a previous search found a field or an iterator yielded a value:
    +  //
    +  //    ```
    +  //    // When a field was not fully consumed (or not even touched at all)
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //           ^ (depth 2)
    +  //    // When a field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                   ^ (depth 1)
    +  //    // When the last field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                   ^ (depth 1)
    +  //    ```
    +  //
    +  } else {
    +    if ((error = skip_child() )) { abandon(); return error; }
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    if (_json_iter->start_position(_depth) != start_position()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  }
    +  while (has_value) {
    +    // Get the key and colon, stopping at the value.
    +    raw_json_string actual_key;
    +    // size_t max_key_length = _json_iter->peek_length() - 2; // -2 for the two quotes
    +    // Note: _json_iter->peek_length() - 2 might overflow if _json_iter->peek_length() < 2.
    +    // field_key() advances the pointer and checks that '"' is found (corresponding to a key).
    +    // The depth is left unchanged by field_key().
    +    if ((error = field_key().get(actual_key) )) { abandon(); return error; };
    +    // field_value() will advance and check that we find a ':' separating the
    +    // key and the value. It will also increment the depth by one.
    +    if ((error = field_value() )) { abandon(); return error; }
    +    // If it matches, stop and return
    +    // We could do it this way if we wanted to allow arbitrary
    +    // key content (including escaped quotes).
    +    //if (actual_key.unsafe_is_equal(max_key_length, key)) {
    +    // Instead we do the following which may trigger buffer overruns if the
    +    // user provides an adversarial key (containing a well placed unescaped quote
    +    // character and being longer than the number of bytes remaining in the JSON
    +    // input).
    +    if (actual_key.unsafe_is_equal(key)) {
    +      logger::log_event(*this, "match", key, -2);
    +      // If we return here, then we return while pointing at the ':' that we just checked.
    +      return true;
    +    }
    +
    +    // No match: skip the value and see if , or } is next
    +    logger::log_event(*this, "no match", key, -2);
    +    // The call to skip_child is meant to skip over the value corresponding to the key.
    +    // After skip_child(), we are right before the next comma (',') or the final brace ('}').
    +    SIMDJSON_TRY( skip_child() ); // Skip the value entirely
    +    // The has_next_field() advances the pointer and check that either ',' or '}' is found.
    +    // It returns true if ',' is found, false otherwise. If anything other than ',' or '}' is found,
    +    // then we are in error and we abort.
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +  }
    +
    +  // If the loop ended, we're out of fields to look at.
    +  return false;
    +}
    +
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::find_field_unordered_raw(const std::string_view key) noexcept {
    +  /**
    +   * When find_field_unordered_raw is called, we can either be pointing at the
    +   * first key, pointing outside (at the closing brace) or if a key was matched
    +   * we can be either pointing right afterthe ':' right before the value (that we need skip),
    +   * or we may have consumed the value and we might be at a comma or at the
    +   * final brace (ready for a call to has_next_field()).
    +   */
    +  error_code error;
    +  bool has_value;
    +
    +  // First, we scan from that point to the end.
    +  // If we don't find a match, we may loop back around, and scan from the beginning to that point.
    +  token_position search_start = _json_iter->position();
    +
    +  // We want to know whether we need to go back to the beginning.
    +  bool at_first = at_first_field();
    +  ///////////////
    +  // Initially, the object can be in one of a few different places:
    +  //
    +  // 1. At the first key:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //      ^ (depth 2, index 1)
    +  //    ```
    +  //
    +  if (at_first) {
    +    has_value = true;
    +
    +  // 2. When a previous search did not yield a value or the object is empty:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                     ^ (depth 0)
    +  //    { }
    +  //        ^ (depth 0, index 2)
    +  //    ```
    +  //
    +  } else if (!is_open()) {
    +
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    // If we're past the end of the object, we're being iterated out of order.
    +    // Note: this isn't perfect detection. It's possible the user is inside some other object; if so,
    +    // this object iterator will blithely scan that object for fields.
    +    if (_json_iter->depth() < depth() - 1) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +    SIMDJSON_TRY(reset_object().get(has_value));
    +    at_first = true;
    +  // 3. When a previous search found a field or an iterator yielded a value:
    +  //
    +  //    ```
    +  //    // When a field was not fully consumed (or not even touched at all)
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //           ^ (depth 2)
    +  //    // When a field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                   ^ (depth 1)
    +  //    // When the last field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                   ^ (depth 1)
    +  //    ```
    +  //
    +  } else {
    +    // If someone queried a key but they not did access the value, then we are left pointing
    +    // at the ':' and we need to move forward through the value... If the value was
    +    // processed then skip_child() does not move the iterator (but may adjust the depth).
    +    if ((error = skip_child() )) { abandon(); return error; }
    +    search_start = _json_iter->position();
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    if (_json_iter->start_position(_depth) != start_position()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  }
    +
    +  // After initial processing, we will be in one of two states:
    +  //
    +  // ```
    +  // // At the beginning of a field
    +  // { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //   ^ (depth 1)
    +  // { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                  ^ (depth 1)
    +  // // At the end of the object
    +  // { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                  ^ (depth 0)
    +  // ```
    +  //
    +  // Next, we find a match starting from the current position.
    +  while (has_value) {
    +    SIMDJSON_ASSUME( _json_iter->_depth == _depth ); // We must be at the start of a field
    +
    +    // Get the key and colon, stopping at the value.
    +    raw_json_string actual_key;
    +    // size_t max_key_length = _json_iter->peek_length() - 2; // -2 for the two quotes
    +    // Note: _json_iter->peek_length() - 2 might overflow if _json_iter->peek_length() < 2.
    +    // field_key() advances the pointer and checks that '"' is found (corresponding to a key).
    +    // The depth is left unchanged by field_key().
    +    if ((error = field_key().get(actual_key) )) { abandon(); return error; };
    +    // field_value() will advance and check that we find a ':' separating the
    +    // key and the value. It will also increment the depth by one.
    +    if ((error = field_value() )) { abandon(); return error; }
    +
    +    // If it matches, stop and return
    +    // We could do it this way if we wanted to allow arbitrary
    +    // key content (including escaped quotes).
    +    // if (actual_key.unsafe_is_equal(max_key_length, key)) {
    +    // Instead we do the following which may trigger buffer overruns if the
    +    // user provides an adversarial key (containing a well placed unescaped quote
    +    // character and being longer than the number of bytes remaining in the JSON
    +    // input).
    +    if (actual_key.unsafe_is_equal(key)) {
    +      logger::log_event(*this, "match", key, -2);
    +      // If we return here, then we return while pointing at the ':' that we just checked.
    +      return true;
    +    }
    +
    +    // No match: skip the value and see if , or } is next
    +    logger::log_event(*this, "no match", key, -2);
    +    // The call to skip_child is meant to skip over the value corresponding to the key.
    +    // After skip_child(), we are right before the next comma (',') or the final brace ('}').
    +    SIMDJSON_TRY( skip_child() );
    +    // The has_next_field() advances the pointer and check that either ',' or '}' is found.
    +    // It returns true if ',' is found, false otherwise. If anything other than ',' or '}' is found,
    +    // then we are in error and we abort.
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +  }
    +  // Performance note: it maybe wasteful to rewind to the beginning when there might be
    +  // no other query following. Indeed, it would require reskipping the whole object.
    +  // Instead, you can just stay where you are. If there is a new query, there is always time
    +  // to rewind.
    +  if(at_first) { return false; }
    +
    +  // If we reach the end without finding a match, search the rest of the fields starting at the
    +  // beginning of the object.
    +  // (We have already run through the object before, so we've already validated its structure. We
    +  // don't check errors in this bit.)
    +  SIMDJSON_TRY(reset_object().get(has_value));
    +  while (true) {
    +    SIMDJSON_ASSUME(has_value); // we should reach search_start before ever reaching the end of the object
    +    SIMDJSON_ASSUME( _json_iter->_depth == _depth ); // We must be at the start of a field
    +
    +    // Get the key and colon, stopping at the value.
    +    raw_json_string actual_key;
    +    // size_t max_key_length = _json_iter->peek_length() - 2; // -2 for the two quotes
    +    // Note: _json_iter->peek_length() - 2 might overflow if _json_iter->peek_length() < 2.
    +    // field_key() advances the pointer and checks that '"' is found (corresponding to a key).
    +    // The depth is left unchanged by field_key().
    +    error = field_key().get(actual_key); SIMDJSON_ASSUME(!error);
    +    // field_value() will advance and check that we find a ':' separating the
    +    // key and the value.  It will also increment the depth by one.
    +    error = field_value(); SIMDJSON_ASSUME(!error);
    +
    +    // If it matches, stop and return
    +    // We could do it this way if we wanted to allow arbitrary
    +    // key content (including escaped quotes).
    +    // if (actual_key.unsafe_is_equal(max_key_length, key)) {
    +    // Instead we do the following which may trigger buffer overruns if the
    +    // user provides an adversarial key (containing a well placed unescaped quote
    +    // character and being longer than the number of bytes remaining in the JSON
    +    // input).
    +    if (actual_key.unsafe_is_equal(key)) {
    +      logger::log_event(*this, "match", key, -2);
    +      // If we return here, then we return while pointing at the ':' that we just checked.
    +      return true;
    +    }
    +
    +    // No match: skip the value and see if , or } is next
    +    logger::log_event(*this, "no match", key, -2);
    +    // The call to skip_child is meant to skip over the value corresponding to the key.
    +    // After skip_child(), we are right before the next comma (',') or the final brace ('}').
    +    SIMDJSON_TRY( skip_child() );
    +    // If we reached the end of the key-value pair we started from, then we know
    +    // that the key is not there so we return false. We are either right before
    +    // the next comma or the final brace.
    +    if(_json_iter->position() == search_start) { return false; }
    +    // The has_next_field() advances the pointer and check that either ',' or '}' is found.
    +    // It returns true if ',' is found, false otherwise. If anything other than ',' or '}' is found,
    +    // then we are in error and we abort.
    +    error = has_next_field().get(has_value); SIMDJSON_ASSUME(!error);
    +    // If we make the mistake of exiting here, then we could be left pointing at a key
    +    // in the middle of an object. That's not an allowable state.
    +  }
    +  // If the loop ended, we're out of fields to look at. The program should
    +  // never reach this point.
    +  return false;
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::field_key() noexcept {
    +  assert_at_next();
    +
    +  const uint8_t *key = _json_iter->return_current_and_advance();
    +  if (*(key++) != '"') { return report_error(TAPE_ERROR, "Object key is not a string"); }
    +  return raw_json_string(key);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::field_value() noexcept {
    +  assert_at_next();
    +
    +  if (*_json_iter->return_current_and_advance() != ':') { return report_error(TAPE_ERROR, "Missing colon in object field"); }
    +  _json_iter->descend_to(depth()+1);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_array() noexcept {
    +  SIMDJSON_TRY( start_container('[', "Not an array", "array") );
    +  return started_array();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_array() noexcept {
    +  SIMDJSON_TRY( start_container('[', "Not an array", "array") );
    +  return started_root_array();
    +}
    +
    +inline std::string value_iterator::to_string() const noexcept {
    +  auto answer = std::string("value_iterator [ depth : ") + std::to_string(_depth) + std::string(", ");
    +  if(_json_iter != nullptr) { answer +=  _json_iter->to_string(); }
    +  answer += std::string(" ]");
    +  return answer;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_array() noexcept {
    +  assert_at_container_start();
    +  if (*_json_iter->peek() == ']') {
    +    logger::log_value(*_json_iter, "empty array");
    +    _json_iter->return_current_and_advance();
    +    SIMDJSON_TRY( end_container() );
    +    return false;
    +  }
    +  _json_iter->descend_to(depth()+1);
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  _json_iter->set_start_position(_depth, start_position());
    +#endif
    +  return true;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::check_root_array() noexcept {
    +  // When in streaming mode, we cannot expect peek_last() to be the last structural element of the
    +  // current document. It only works in the normal mode where we have indexed a single document.
    +  // Note that adding a check for 'streaming' is not expensive since we only have at most
    +  // one root element.
    +  if ( ! _json_iter->streaming() ) {
    +    // The following lines do not fully protect against garbage content within the
    +    // array: e.g., `[1, 2] foo]`. Users concerned with garbage content should
    +    // also call `at_end()` on the document instance at the end of the processing to
    +    // ensure that the processing has finished at the end.
    +    //
    +    if (*_json_iter->peek_last() != ']') {
    +      _json_iter->abandon();
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing ] at end");
    +    }
    +    // If the last character is ] *and* the first gibberish character is also ']'
    +    // then on-demand could accidentally go over. So we need additional checks.
    +    // https://github.com/simdjson/simdjson/issues/1834
    +    // Checking that the document is balanced requires a full scan which is potentially
    +    // expensive, but it only happens in edge cases where the first padding character is
    +    // a closing bracket.
    +    if ((*_json_iter->peek(_json_iter->end_position()) == ']') && (!_json_iter->balanced())) {
    +      _json_iter->abandon();
    +      // The exact error would require more work. It will typically be an unclosed array.
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "the document is unbalanced");
    +    }
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_array() noexcept {
    +  auto error = check_root_array();
    +  if (error) { return error; }
    +  return started_array();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_element() noexcept {
    +  assert_at_next();
    +
    +  logger::log_event(*this, "has_next_element");
    +  switch (*_json_iter->return_current_and_advance()) {
    +    case ']':
    +      logger::log_end_value(*_json_iter, "array");
    +      SIMDJSON_TRY( end_container() );
    +      return false;
    +    case ',':
    +      _json_iter->descend_to(depth()+1);
    +      return true;
    +    default:
    +      return report_error(TAPE_ERROR, "Missing comma between array elements");
    +  }
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::parse_bool(const uint8_t *json) const noexcept {
    +  auto not_true = atomparsing::str4ncmp(json, "true");
    +  auto not_false = atomparsing::str4ncmp(json, "fals") | (json[4] ^ 'e');
    +  bool error = (not_true && not_false) || jsoncharutils::is_not_structural_or_whitespace(json[not_true ? 5 : 4]);
    +  if (error) { return incorrect_type_error("Not a boolean"); }
    +  return simdjson_result(!not_true);
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::parse_null(const uint8_t *json) const noexcept {
    +  bool is_null_string = !atomparsing::str4ncmp(json, "null") && jsoncharutils::is_structural_or_whitespace(json[4]);
    +  // if we start with 'n', we must be a null
    +  if(!is_null_string && json[0]=='n') { return incorrect_type_error("Not a null but starts with n"); }
    +  return is_null_string;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_string(bool allow_replacement) noexcept {
    +  return get_raw_json_string().unescape(json_iter(), allow_replacement);
    +}
    +template 
    +simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  std::string_view content;
    +  auto err = get_string(allow_replacement).get(content);
    +  if (err) { return err; }
    +  receiver = content;
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_wobbly_string() noexcept {
    +  return get_raw_json_string().unescape_wobbly(json_iter());
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_raw_json_string() noexcept {
    +  auto json = peek_scalar("string");
    +  if (*json != '"') { return incorrect_type_error("Not a string"); }
    +  advance_scalar("string");
    +  return raw_json_string(json+1);
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_uint64() noexcept {
    +  auto result = numberparsing::parse_unsigned(peek_non_root_scalar("uint64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("uint64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_uint64_in_string() noexcept {
    +  auto result = numberparsing::parse_unsigned_in_string(peek_non_root_scalar("uint64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("uint64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_int64() noexcept {
    +  auto result = numberparsing::parse_integer(peek_non_root_scalar("int64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("int64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_int64_in_string() noexcept {
    +  auto result = numberparsing::parse_integer_in_string(peek_non_root_scalar("int64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("int64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_double() noexcept {
    +  auto result = numberparsing::parse_double(peek_non_root_scalar("double"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("double"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_double_in_string() noexcept {
    +  auto result = numberparsing::parse_double_in_string(peek_non_root_scalar("double"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("double"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_bool() noexcept {
    +  auto result = parse_bool(peek_non_root_scalar("bool"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("bool"); }
    +  return result;
    +}
    +simdjson_inline simdjson_result value_iterator::is_null() noexcept {
    +  bool is_null_value;
    +  SIMDJSON_TRY(parse_null(peek_non_root_scalar("null")).get(is_null_value));
    +  if(is_null_value) { advance_non_root_scalar("null"); }
    +  return is_null_value;
    +}
    +simdjson_inline bool value_iterator::is_negative() noexcept {
    +  return numberparsing::is_negative(peek_non_root_scalar("numbersign"));
    +}
    +simdjson_inline bool value_iterator::is_root_negative() noexcept {
    +  return numberparsing::is_negative(peek_root_scalar("numbersign"));
    +}
    +simdjson_inline simdjson_result value_iterator::is_integer() noexcept {
    +  return numberparsing::is_integer(peek_non_root_scalar("integer"));
    +}
    +simdjson_inline simdjson_result value_iterator::get_number_type() noexcept {
    +  return numberparsing::get_number_type(peek_non_root_scalar("integer"));
    +}
    +simdjson_inline simdjson_result value_iterator::get_number() noexcept {
    +  number num;
    +  error_code error =  numberparsing::parse_number(peek_non_root_scalar("number"), num);
    +  if(error) { return error; }
    +  return num;
    +}
    +
    +simdjson_inline simdjson_result value_iterator::is_root_integer(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("is_root_integer");
    +  uint8_t tmpbuf[20+1+1]{}; // <20 digits> is the longest possible unsigned integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    return false; // if there are more than 20 characters, it cannot be represented as an integer.
    +  }
    +  auto answer = numberparsing::is_integer(tmpbuf);
    +  // If the parsing was a success, we must still check that it is
    +  // a single scalar. Note that we parse first because of cases like '[]' where
    +  // getting TRAILING_CONTENT is wrong.
    +  if(check_trailing && (answer.error() == SUCCESS) && (!_json_iter->is_single_token())) { return TRAILING_CONTENT; }
    +  return answer;
    +}
    +
    +simdjson_inline simdjson_result value_iterator::get_root_number_type(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("number");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1];
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto answer = numberparsing::get_number_type(tmpbuf);
    +  if (check_trailing && (answer.error() == SUCCESS)  && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +  return answer;
    +}
    +simdjson_inline simdjson_result value_iterator::get_root_number(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("number");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1];
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  number num;
    +  error_code error =  numberparsing::parse_number(tmpbuf, num);
    +  if(error) { return error; }
    +  if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +  advance_root_scalar("number");
    +  return num;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_string(bool check_trailing, bool allow_replacement) noexcept {
    +  return get_root_raw_json_string(check_trailing).unescape(json_iter(), allow_replacement);
    +}
    +template 
    +simdjson_warn_unused simdjson_inline error_code value_iterator::get_root_string(string_type& receiver, bool check_trailing, bool allow_replacement) noexcept {
    +  std::string_view content;
    +  auto err = get_root_string(check_trailing, allow_replacement).get(content);
    +  if (err) { return err; }
    +  receiver = content;
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_wobbly_string(bool check_trailing) noexcept {
    +  return get_root_raw_json_string(check_trailing).unescape_wobbly(json_iter());
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_raw_json_string(bool check_trailing) noexcept {
    +  auto json = peek_scalar("string");
    +  if (*json != '"') { return incorrect_type_error("Not a string"); }
    +  if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +  advance_scalar("string");
    +  return raw_json_string(json+1);
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_uint64(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("uint64");
    +  uint8_t tmpbuf[20+1+1]{}; // <20 digits> is the longest possible unsigned integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_unsigned(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("uint64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_uint64_in_string(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("uint64");
    +  uint8_t tmpbuf[20+1+1]{}; // <20 digits> is the longest possible unsigned integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_unsigned_in_string(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("uint64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_int64(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("int64");
    +  uint8_t tmpbuf[20+1+1]; // -<19 digits> is the longest possible integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +
    +  auto result = numberparsing::parse_integer(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("int64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_int64_in_string(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("int64");
    +  uint8_t tmpbuf[20+1+1]; // -<19 digits> is the longest possible integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +
    +  auto result = numberparsing::parse_integer_in_string(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("int64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_double(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("double");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination.
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_double(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("double");
    +  }
    +  return result;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_double_in_string(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("double");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination.
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_double_in_string(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("double");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_bool(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("bool");
    +  uint8_t tmpbuf[5+1+1]; // +1 for null termination
    +  tmpbuf[5+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 5+1)) { return incorrect_type_error("Not a boolean"); }
    +  auto result = parse_bool(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("bool");
    +  }
    +  return result;
    +}
    +simdjson_inline simdjson_result value_iterator::is_root_null(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("null");
    +  bool result = (max_len >= 4 && !atomparsing::str4ncmp(json, "null") &&
    +         (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4])));
    +  if(result) { // we have something that looks like a null.
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("null");
    +  }
    +  return result;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::skip_child() noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth >= _depth );
    +
    +  return _json_iter->skip_child(depth());
    +}
    +
    +simdjson_inline value_iterator value_iterator::child() const noexcept {
    +  assert_at_child();
    +  return { _json_iter, depth()+1, _json_iter->token.position() };
    +}
    +
    +// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller
    +// relating depth and iterator depth, which is a desired effect. It does not happen if is_open is
    +// marked non-inline.
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_inline bool value_iterator::is_open() const noexcept {
    +  return _json_iter->depth() >= depth();
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_inline bool value_iterator::at_end() const noexcept {
    +  return _json_iter->at_end();
    +}
    +
    +simdjson_inline bool value_iterator::at_start() const noexcept {
    +  return _json_iter->token.position() == start_position();
    +}
    +
    +simdjson_inline bool value_iterator::at_first_field() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  return _json_iter->token.position() == start_position() + 1;
    +}
    +
    +simdjson_inline void value_iterator::abandon() noexcept {
    +  _json_iter->abandon();
    +}
    +
    +simdjson_warn_unused simdjson_inline depth_t value_iterator::depth() const noexcept {
    +  return _depth;
    +}
    +simdjson_warn_unused simdjson_inline error_code value_iterator::error() const noexcept {
    +  return _json_iter->error;
    +}
    +simdjson_warn_unused simdjson_inline uint8_t *&value_iterator::string_buf_loc() noexcept {
    +  return _json_iter->string_buf_loc();
    +}
    +simdjson_warn_unused simdjson_inline const json_iterator &value_iterator::json_iter() const noexcept {
    +  return *_json_iter;
    +}
    +simdjson_warn_unused simdjson_inline json_iterator &value_iterator::json_iter() noexcept {
    +  return *_json_iter;
    +}
    +
    +simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept {
    +  return _json_iter->peek(start_position());
    +}
    +simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept {
    +  return _json_iter->peek_length(start_position());
    +}
    +
    +simdjson_inline const uint8_t *value_iterator::peek_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  // If we're not at the position anymore, we don't want to advance the cursor.
    +  if (!is_at_start()) { return peek_start(); }
    +
    +  // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value.
    +  assert_at_start();
    +  return _json_iter->peek();
    +}
    +
    +simdjson_inline void value_iterator::advance_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  // If we're not at the position anymore, we don't want to advance the cursor.
    +  if (!is_at_start()) { return; }
    +
    +  // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value.
    +  assert_at_start();
    +  _json_iter->return_current_and_advance();
    +  _json_iter->ascend_to(depth()-1);
    +}
    +
    +simdjson_inline error_code value_iterator::start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept {
    +  logger::log_start_value(*_json_iter, start_position(), depth(), type);
    +  // If we're not at the position anymore, we don't want to advance the cursor.
    +  const uint8_t *json;
    +  if (!is_at_start()) {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    if (!is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +    json = peek_start();
    +    if (*json != start_char) { return incorrect_type_error(incorrect_type_message); }
    +  } else {
    +    assert_at_start();
    +    /**
    +     * We should be prudent. Let us peek. If it is not the right type, we
    +     * return an error. Only once we have determined that we have the right
    +     * type are we allowed to advance!
    +     */
    +    json = _json_iter->peek();
    +    if (*json != start_char) { return incorrect_type_error(incorrect_type_message); }
    +    _json_iter->return_current_and_advance();
    +  }
    +
    +
    +  return SUCCESS;
    +}
    +
    +
    +simdjson_inline const uint8_t *value_iterator::peek_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return peek_start(); }
    +
    +  assert_at_root();
    +  return _json_iter->peek();
    +}
    +simdjson_inline const uint8_t *value_iterator::peek_non_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return peek_start(); }
    +
    +  assert_at_non_root_start();
    +  return _json_iter->peek();
    +}
    +
    +simdjson_inline void value_iterator::advance_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return; }
    +
    +  assert_at_root();
    +  _json_iter->return_current_and_advance();
    +  _json_iter->ascend_to(depth()-1);
    +}
    +simdjson_inline void value_iterator::advance_non_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return; }
    +
    +  assert_at_non_root_start();
    +  _json_iter->return_current_and_advance();
    +  _json_iter->ascend_to(depth()-1);
    +}
    +
    +simdjson_inline error_code value_iterator::incorrect_type_error(const char *message) const noexcept {
    +  logger::log_error(*_json_iter, start_position(), depth(), message);
    +  return INCORRECT_TYPE;
    +}
    +
    +simdjson_inline bool value_iterator::is_at_start() const noexcept {
    +  return position() == start_position();
    +}
    +
    +simdjson_inline bool value_iterator::is_at_key() const noexcept {
    +  // Keys are at the same depth as the object.
    +  // Note here that we could be safer and check that we are within an object,
    +  // but we do not.
    +  return _depth == _json_iter->_depth && *_json_iter->peek() == '"';
    +}
    +
    +simdjson_inline bool value_iterator::is_at_iterator_start() const noexcept {
    +  // We can legitimately be either at the first value ([1]), or after the array if it's empty ([]).
    +  auto delta = position() - start_position();
    +  return delta == 1 || delta == 2;
    +}
    +
    +inline void value_iterator::assert_at_start() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position == _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +inline void value_iterator::assert_at_container_start() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position == _start_position + 1 );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +inline void value_iterator::assert_at_next() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +simdjson_inline void value_iterator::move_at_start() noexcept {
    +  _json_iter->_depth = _depth;
    +  _json_iter->token.set_position(_start_position);
    +}
    +
    +simdjson_inline void value_iterator::move_at_container_start() noexcept {
    +  _json_iter->_depth = _depth;
    +  _json_iter->token.set_position(_start_position + 1);
    +}
    +
    +simdjson_inline simdjson_result value_iterator::reset_array() noexcept {
    +  if(error()) { return error(); }
    +  move_at_container_start();
    +  return started_array();
    +}
    +
    +simdjson_inline simdjson_result value_iterator::reset_object() noexcept {
    +  if(error()) { return error(); }
    +  move_at_container_start();
    +  return started_object();
    +}
    +
    +inline void value_iterator::assert_at_child() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth + 1 );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +inline void value_iterator::assert_at_root() const noexcept {
    +  assert_at_start();
    +  SIMDJSON_ASSUME( _depth == 1 );
    +}
    +
    +inline void value_iterator::assert_at_non_root_start() const noexcept {
    +  assert_at_start();
    +  SIMDJSON_ASSUME( _depth > 1 );
    +}
    +
    +inline void value_iterator::assert_is_valid() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter != nullptr );
    +}
    +
    +simdjson_inline bool value_iterator::is_valid() const noexcept {
    +  return _json_iter != nullptr;
    +}
    +
    +simdjson_inline simdjson_result value_iterator::type() const noexcept {
    +  switch (*peek_start()) {
    +    case '{':
    +      return json_type::object;
    +    case '[':
    +      return json_type::array;
    +    case '"':
    +      return json_type::string;
    +    case 'n':
    +      return json_type::null;
    +    case 't': case 'f':
    +      return json_type::boolean;
    +    case '-':
    +    case '0': case '1': case '2': case '3': case '4':
    +    case '5': case '6': case '7': case '8': case '9':
    +      return json_type::number;
    +    default:
    +      return TAPE_ERROR;
    +  }
    +}
    +
    +simdjson_inline token_position value_iterator::start_position() const noexcept {
    +  return _start_position;
    +}
    +
    +simdjson_inline token_position value_iterator::position() const noexcept {
    +  return _json_iter->position();
    +}
    +
    +simdjson_inline token_position value_iterator::end_position() const noexcept {
    +  return _json_iter->end_position();
    +}
    +
    +simdjson_inline token_position value_iterator::last_position() const noexcept {
    +  return _json_iter->last_position();
    +}
    +
    +simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept {
    +  return _json_iter->report_error(error, message);
    +}
    +
    +} // namespace ondemand
    +} // namespace icelake
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::value_iterator &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/value_iterator-inl.h for icelake */
    +/* end file simdjson/generic/ondemand/amalgamated.h for icelake */
    +/* including simdjson/icelake/end.h: #include "simdjson/icelake/end.h" */
    +/* begin file simdjson/icelake/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/icelake/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_ICELAKE
    +SIMDJSON_UNTARGET_REGION
    +#endif
    +
    +/* undefining SIMDJSON_IMPLEMENTATION from "icelake" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/icelake/end.h */
    +
    +#endif // SIMDJSON_ICELAKE_ONDEMAND_H
    +/* end file simdjson/icelake/ondemand.h */
    +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(ppc64)
    +/* including simdjson/ppc64/ondemand.h: #include "simdjson/ppc64/ondemand.h" */
    +/* begin file simdjson/ppc64/ondemand.h */
    +#ifndef SIMDJSON_PPC64_ONDEMAND_H
    +#define SIMDJSON_PPC64_ONDEMAND_H
    +
    +/* including simdjson/ppc64/begin.h: #include "simdjson/ppc64/begin.h" */
    +/* begin file simdjson/ppc64/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "ppc64" */
    +#define SIMDJSON_IMPLEMENTATION ppc64
    +/* including simdjson/ppc64/base.h: #include "simdjson/ppc64/base.h" */
    +/* begin file simdjson/ppc64/base.h */
    +#ifndef SIMDJSON_PPC64_BASE_H
    +#define SIMDJSON_PPC64_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +/**
    + * Implementation for ALTIVEC (PPC64).
    + */
    +namespace ppc64 {
    +
    +class implementation;
    +
    +namespace {
    +namespace simd {
    +template  struct simd8;
    +template  struct simd8x64;
    +} // namespace simd
    +} // unnamed namespace
    +
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_PPC64_BASE_H
    +/* end file simdjson/ppc64/base.h */
    +/* including simdjson/ppc64/intrinsics.h: #include "simdjson/ppc64/intrinsics.h" */
    +/* begin file simdjson/ppc64/intrinsics.h */
    +#ifndef SIMDJSON_PPC64_INTRINSICS_H
    +#define SIMDJSON_PPC64_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// This should be the correct header whether
    +// you use visual studio or other compilers.
    +#include 
    +
    +// These are defined by altivec.h in GCC toolchain, it is safe to undef them.
    +#ifdef bool
    +#undef bool
    +#endif
    +
    +#ifdef vector
    +#undef vector
    +#endif
    +
    +static_assert(sizeof(__vector unsigned char) <= simdjson::SIMDJSON_PADDING, "insufficient padding for ppc64");
    +
    +#endif //  SIMDJSON_PPC64_INTRINSICS_H
    +/* end file simdjson/ppc64/intrinsics.h */
    +/* including simdjson/ppc64/bitmanipulation.h: #include "simdjson/ppc64/bitmanipulation.h" */
    +/* begin file simdjson/ppc64/bitmanipulation.h */
    +#ifndef SIMDJSON_PPC64_BITMANIPULATION_H
    +#define SIMDJSON_PPC64_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long ret;
    +  // Search the mask data from least significant bit (LSB)
    +  // to the most significant bit (MSB) for a set bit (1).
    +  _BitScanForward64(&ret, input_num);
    +  return (int)ret;
    +#else  // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return input_num & (input_num - 1);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long leading_zero = 0;
    +  // Search the mask data from most significant bit (MSB)
    +  // to least significant bit (LSB) for a set bit (1).
    +  if (_BitScanReverse64(&leading_zero, input_num))
    +    return (int)(63 - leading_zero);
    +  else
    +    return 64;
    +#else
    +  return __builtin_clzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +simdjson_inline int count_ones(uint64_t input_num) {
    +  // note: we do not support legacy 32-bit Windows in this kernel
    +  return __popcnt64(input_num); // Visual Studio wants two underscores
    +}
    +#else
    +simdjson_inline int count_ones(uint64_t input_num) {
    +  return __builtin_popcountll(input_num);
    +}
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2,
    +                                         uint64_t *result) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  *result = value1 + value2;
    +  return *result < value1;
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_PPC64_BITMANIPULATION_H
    +/* end file simdjson/ppc64/bitmanipulation.h */
    +/* including simdjson/ppc64/bitmask.h: #include "simdjson/ppc64/bitmask.h" */
    +/* begin file simdjson/ppc64/bitmask.h */
    +#ifndef SIMDJSON_PPC64_BITMASK_H
    +#define SIMDJSON_PPC64_BITMASK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +
    +//
    +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is
    +// encountered.
    +//
    +// For example, prefix_xor(00100100) == 00011100
    +//
    +simdjson_inline uint64_t prefix_xor(uint64_t bitmask) {
    +  // You can use the version below, however gcc sometimes miscompiles
    +  // vec_pmsum_be, it happens somewhere around between 8 and 9th version.
    +  // The performance boost was not noticeable, falling back to a usual
    +  // implementation.
    +  //   __vector unsigned long long all_ones = {~0ull, ~0ull};
    +  //   __vector unsigned long long mask = {bitmask, 0};
    +  //   // Clang and GCC return different values for pmsum for ull so cast it to one.
    +  //   // Generally it is not specified by ALTIVEC ISA what is returned by
    +  //   // vec_pmsum_be.
    +  // #if defined(__LITTLE_ENDIAN__)
    +  //   return (uint64_t)(((__vector unsigned long long)vec_pmsum_be(all_ones, mask))[0]);
    +  // #else
    +  //   return (uint64_t)(((__vector unsigned long long)vec_pmsum_be(all_ones, mask))[1]);
    +  // #endif
    +  bitmask ^= bitmask << 1;
    +  bitmask ^= bitmask << 2;
    +  bitmask ^= bitmask << 4;
    +  bitmask ^= bitmask << 8;
    +  bitmask ^= bitmask << 16;
    +  bitmask ^= bitmask << 32;
    +  return bitmask;
    +}
    +
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif
    +/* end file simdjson/ppc64/bitmask.h */
    +/* including simdjson/ppc64/numberparsing_defs.h: #include "simdjson/ppc64/numberparsing_defs.h" */
    +/* begin file simdjson/ppc64/numberparsing_defs.h */
    +#ifndef SIMDJSON_PPC64_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_PPC64_NUMBERPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +#if defined(__linux__)
    +#include 
    +#elif defined(__FreeBSD__)
    +#include 
    +#endif
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace numberparsing {
    +
    +// we don't have appropriate instructions, so let us use a scalar function
    +// credit: https://johnnylee-sde.github.io/Fast-numeric-string-to-int/
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  uint64_t val;
    +  std::memcpy(&val, chars, sizeof(uint64_t));
    +#ifdef __BIG_ENDIAN__
    +#if defined(__linux__)
    +  val = bswap_64(val);
    +#elif defined(__FreeBSD__)
    +  val = bswap64(val);
    +#endif
    +#endif
    +  val = (val & 0x0F0F0F0F0F0F0F0F) * 2561 >> 8;
    +  val = (val & 0x00FF00FF00FF00FF) * 6553601 >> 16;
    +  return uint32_t((val & 0x0000FFFF0000FFFF) * 42949672960001 >> 32);
    +}
    +
    +/** @private */
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif // SIMDJSON_PPC64_NUMBERPARSING_DEFS_H
    +/* end file simdjson/ppc64/numberparsing_defs.h */
    +/* including simdjson/ppc64/simd.h: #include "simdjson/ppc64/simd.h" */
    +/* begin file simdjson/ppc64/simd.h */
    +#ifndef SIMDJSON_PPC64_SIMD_H
    +#define SIMDJSON_PPC64_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +namespace simd {
    +
    +using __m128i = __vector unsigned char;
    +
    +template  struct base {
    +  __m128i value;
    +
    +  // Zero constructor
    +  simdjson_inline base() : value{__m128i()} {}
    +
    +  // Conversion from SIMD register
    +  simdjson_inline base(const __m128i _value) : value(_value) {}
    +
    +  // Conversion to SIMD register
    +  simdjson_inline operator const __m128i &() const {
    +    return this->value;
    +  }
    +  simdjson_inline operator __m128i &() { return this->value; }
    +
    +  // Bit operations
    +  simdjson_inline Child operator|(const Child other) const {
    +    return vec_or(this->value, (__m128i)other);
    +  }
    +  simdjson_inline Child operator&(const Child other) const {
    +    return vec_and(this->value, (__m128i)other);
    +  }
    +  simdjson_inline Child operator^(const Child other) const {
    +    return vec_xor(this->value, (__m128i)other);
    +  }
    +  simdjson_inline Child bit_andnot(const Child other) const {
    +    return vec_andc(this->value, (__m128i)other);
    +  }
    +  simdjson_inline Child &operator|=(const Child other) {
    +    auto this_cast = static_cast(this);
    +    *this_cast = *this_cast | other;
    +    return *this_cast;
    +  }
    +  simdjson_inline Child &operator&=(const Child other) {
    +    auto this_cast = static_cast(this);
    +    *this_cast = *this_cast & other;
    +    return *this_cast;
    +  }
    +  simdjson_inline Child &operator^=(const Child other) {
    +    auto this_cast = static_cast(this);
    +    *this_cast = *this_cast ^ other;
    +    return *this_cast;
    +  }
    +};
    +
    +template >
    +struct base8 : base> {
    +  typedef uint16_t bitmask_t;
    +  typedef uint32_t bitmask2_t;
    +
    +  simdjson_inline base8() : base>() {}
    +  simdjson_inline base8(const __m128i _value) : base>(_value) {}
    +
    +  friend simdjson_inline Mask operator==(const simd8 lhs, const simd8 rhs) {
    +    return (__m128i)vec_cmpeq(lhs.value, (__m128i)rhs);
    +  }
    +
    +  static const int SIZE = sizeof(base>::value);
    +
    +  template 
    +  simdjson_inline simd8 prev(simd8 prev_chunk) const {
    +    __m128i chunk = this->value;
    +#ifdef __LITTLE_ENDIAN__
    +    chunk = (__m128i)vec_reve(this->value);
    +    prev_chunk = (__m128i)vec_reve((__m128i)prev_chunk);
    +#endif
    +    chunk = (__m128i)vec_sld((__m128i)prev_chunk, (__m128i)chunk, 16 - N);
    +#ifdef __LITTLE_ENDIAN__
    +    chunk = (__m128i)vec_reve((__m128i)chunk);
    +#endif
    +    return chunk;
    +  }
    +};
    +
    +// SIMD byte mask type (returned by things like eq and gt)
    +template <> struct simd8 : base8 {
    +  static simdjson_inline simd8 splat(bool _value) {
    +    return (__m128i)vec_splats((unsigned char)(-(!!_value)));
    +  }
    +
    +  simdjson_inline simd8() : base8() {}
    +  simdjson_inline simd8(const __m128i _value)
    +      : base8(_value) {}
    +  // Splat constructor
    +  simdjson_inline simd8(bool _value)
    +      : base8(splat(_value)) {}
    +
    +  simdjson_inline int to_bitmask() const {
    +    __vector unsigned long long result;
    +    const __m128i perm_mask = {0x78, 0x70, 0x68, 0x60, 0x58, 0x50, 0x48, 0x40,
    +                               0x38, 0x30, 0x28, 0x20, 0x18, 0x10, 0x08, 0x00};
    +
    +    result = ((__vector unsigned long long)vec_vbpermq((__m128i)this->value,
    +                                                       (__m128i)perm_mask));
    +#ifdef __LITTLE_ENDIAN__
    +    return static_cast(result[1]);
    +#else
    +    return static_cast(result[0]);
    +#endif
    +  }
    +  simdjson_inline bool any() const {
    +    return !vec_all_eq(this->value, (__m128i)vec_splats(0));
    +  }
    +  simdjson_inline simd8 operator~() const {
    +    return this->value ^ (__m128i)splat(true);
    +  }
    +};
    +
    +template  struct base8_numeric : base8 {
    +  static simdjson_inline simd8 splat(T value) {
    +    (void)value;
    +    return (__m128i)vec_splats(value);
    +  }
    +  static simdjson_inline simd8 zero() { return splat(0); }
    +  static simdjson_inline simd8 load(const T values[16]) {
    +    return (__m128i)(vec_vsx_ld(0, reinterpret_cast(values)));
    +  }
    +  // Repeat 16 values as many times as necessary (usually for lookup tables)
    +  static simdjson_inline simd8 repeat_16(T v0, T v1, T v2, T v3, T v4,
    +                                                   T v5, T v6, T v7, T v8, T v9,
    +                                                   T v10, T v11, T v12, T v13,
    +                                                   T v14, T v15) {
    +    return simd8(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
    +                    v14, v15);
    +  }
    +
    +  simdjson_inline base8_numeric() : base8() {}
    +  simdjson_inline base8_numeric(const __m128i _value)
    +      : base8(_value) {}
    +
    +  // Store to array
    +  simdjson_inline void store(T dst[16]) const {
    +    vec_vsx_st(this->value, 0, reinterpret_cast<__m128i *>(dst));
    +  }
    +
    +  // Override to distinguish from bool version
    +  simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +
    +  // Addition/subtraction are the same for signed and unsigned
    +  simdjson_inline simd8 operator+(const simd8 other) const {
    +    return (__m128i)((__m128i)this->value + (__m128i)other);
    +  }
    +  simdjson_inline simd8 operator-(const simd8 other) const {
    +    return (__m128i)((__m128i)this->value - (__m128i)other);
    +  }
    +  simdjson_inline simd8 &operator+=(const simd8 other) {
    +    *this = *this + other;
    +    return *static_cast *>(this);
    +  }
    +  simdjson_inline simd8 &operator-=(const simd8 other) {
    +    *this = *this - other;
    +    return *static_cast *>(this);
    +  }
    +
    +  // Perform a lookup assuming the value is between 0 and 16 (undefined behavior
    +  // for out of range values)
    +  template 
    +  simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +    return (__m128i)vec_perm((__m128i)lookup_table, (__m128i)lookup_table, this->value);
    +  }
    +
    +  // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted
    +  // as a bitset). Passing a 0 value for mask would be equivalent to writing out
    +  // every byte to output. Only the first 16 - count_ones(mask) bytes of the
    +  // result are significant but 16 bytes get written. Design consideration: it
    +  // seems like a function with the signature simd8 compress(uint32_t mask)
    +  // would be sensible, but the AVX ISA makes this kind of approach difficult.
    +  template 
    +  simdjson_inline void compress(uint16_t mask, L *output) const {
    +    using internal::BitsSetTable256mul2;
    +    using internal::pshufb_combine_table;
    +    using internal::thintable_epi8;
    +    // this particular implementation was inspired by work done by @animetosho
    +    // we do it in two steps, first 8 bytes and then second 8 bytes
    +    uint8_t mask1 = uint8_t(mask);      // least significant 8 bits
    +    uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
    +    // next line just loads the 64-bit values thintable_epi8[mask1] and
    +    // thintable_epi8[mask2] into a 128-bit register, using only
    +    // two instructions on most compilers.
    +#ifdef __LITTLE_ENDIAN__
    +    __m128i shufmask = (__m128i)(__vector unsigned long long){
    +        thintable_epi8[mask1], thintable_epi8[mask2]};
    +#else
    +    __m128i shufmask = (__m128i)(__vector unsigned long long){
    +        thintable_epi8[mask2], thintable_epi8[mask1]};
    +    shufmask = (__m128i)vec_reve((__m128i)shufmask);
    +#endif
    +    // we increment by 0x08 the second half of the mask
    +    shufmask = ((__m128i)shufmask) +
    +               ((__m128i)(__vector int){0, 0, 0x08080808, 0x08080808});
    +
    +    // this is the version "nearly pruned"
    +    __m128i pruned = vec_perm(this->value, this->value, shufmask);
    +    // we still need to put the two halves together.
    +    // we compute the popcount of the first half:
    +    int pop1 = BitsSetTable256mul2[mask1];
    +    // then load the corresponding mask, what it does is to write
    +    // only the first pop1 bytes from the first 8 bytes, and then
    +    // it fills in with the bytes from the second 8 bytes + some filling
    +    // at the end.
    +    __m128i compactmask =
    +        vec_vsx_ld(0, reinterpret_cast(pshufb_combine_table + pop1 * 8));
    +    __m128i answer = vec_perm(pruned, (__m128i)vec_splats(0), compactmask);
    +    vec_vsx_st(answer, 0, reinterpret_cast<__m128i *>(output));
    +  }
    +
    +  template 
    +  simdjson_inline simd8
    +  lookup_16(L replace0, L replace1, L replace2, L replace3, L replace4,
    +            L replace5, L replace6, L replace7, L replace8, L replace9,
    +            L replace10, L replace11, L replace12, L replace13, L replace14,
    +            L replace15) const {
    +    return lookup_16(simd8::repeat_16(
    +        replace0, replace1, replace2, replace3, replace4, replace5, replace6,
    +        replace7, replace8, replace9, replace10, replace11, replace12,
    +        replace13, replace14, replace15));
    +  }
    +};
    +
    +// Signed bytes
    +template <> struct simd8 : base8_numeric {
    +  simdjson_inline simd8() : base8_numeric() {}
    +  simdjson_inline simd8(const __m128i _value)
    +      : base8_numeric(_value) {}
    +  // Splat constructor
    +  simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +  // Array constructor
    +  simdjson_inline simd8(const int8_t *values) : simd8(load(values)) {}
    +  // Member-by-member initialization
    +  simdjson_inline simd8(int8_t v0, int8_t v1, int8_t v2, int8_t v3,
    +                               int8_t v4, int8_t v5, int8_t v6, int8_t v7,
    +                               int8_t v8, int8_t v9, int8_t v10, int8_t v11,
    +                               int8_t v12, int8_t v13, int8_t v14, int8_t v15)
    +      : simd8((__m128i)(__vector signed char){v0, v1, v2, v3, v4, v5, v6, v7,
    +                                              v8, v9, v10, v11, v12, v13, v14,
    +                                              v15}) {}
    +  // Repeat 16 values as many times as necessary (usually for lookup tables)
    +  simdjson_inline static simd8
    +  repeat_16(int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5,
    +            int8_t v6, int8_t v7, int8_t v8, int8_t v9, int8_t v10, int8_t v11,
    +            int8_t v12, int8_t v13, int8_t v14, int8_t v15) {
    +    return simd8(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
    +                         v13, v14, v15);
    +  }
    +
    +  // Order-sensitive comparisons
    +  simdjson_inline simd8
    +  max_val(const simd8 other) const {
    +    return (__m128i)vec_max((__vector signed char)this->value,
    +                            (__vector signed char)(__m128i)other);
    +  }
    +  simdjson_inline simd8
    +  min_val(const simd8 other) const {
    +    return (__m128i)vec_min((__vector signed char)this->value,
    +                            (__vector signed char)(__m128i)other);
    +  }
    +  simdjson_inline simd8
    +  operator>(const simd8 other) const {
    +    return (__m128i)vec_cmpgt((__vector signed char)this->value,
    +                              (__vector signed char)(__m128i)other);
    +  }
    +  simdjson_inline simd8
    +  operator<(const simd8 other) const {
    +    return (__m128i)vec_cmplt((__vector signed char)this->value,
    +                              (__vector signed char)(__m128i)other);
    +  }
    +};
    +
    +// Unsigned bytes
    +template <> struct simd8 : base8_numeric {
    +  simdjson_inline simd8() : base8_numeric() {}
    +  simdjson_inline simd8(const __m128i _value)
    +      : base8_numeric(_value) {}
    +  // Splat constructor
    +  simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +  // Array constructor
    +  simdjson_inline simd8(const uint8_t *values) : simd8(load(values)) {}
    +  // Member-by-member initialization
    +  simdjson_inline
    +  simd8(uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5,
    +        uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9, uint8_t v10,
    +        uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15)
    +      : simd8((__m128i){v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
    +                        v13, v14, v15}) {}
    +  // Repeat 16 values as many times as necessary (usually for lookup tables)
    +  simdjson_inline static simd8
    +  repeat_16(uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4,
    +            uint8_t v5, uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9,
    +            uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14,
    +            uint8_t v15) {
    +    return simd8(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
    +                          v13, v14, v15);
    +  }
    +
    +  // Saturated math
    +  simdjson_inline simd8
    +  saturating_add(const simd8 other) const {
    +    return (__m128i)vec_adds(this->value, (__m128i)other);
    +  }
    +  simdjson_inline simd8
    +  saturating_sub(const simd8 other) const {
    +    return (__m128i)vec_subs(this->value, (__m128i)other);
    +  }
    +
    +  // Order-specific operations
    +  simdjson_inline simd8
    +  max_val(const simd8 other) const {
    +    return (__m128i)vec_max(this->value, (__m128i)other);
    +  }
    +  simdjson_inline simd8
    +  min_val(const simd8 other) const {
    +    return (__m128i)vec_min(this->value, (__m128i)other);
    +  }
    +  // Same as >, but only guarantees true is nonzero (< guarantees true = -1)
    +  simdjson_inline simd8
    +  gt_bits(const simd8 other) const {
    +    return this->saturating_sub(other);
    +  }
    +  // Same as <, but only guarantees true is nonzero (< guarantees true = -1)
    +  simdjson_inline simd8
    +  lt_bits(const simd8 other) const {
    +    return other.saturating_sub(*this);
    +  }
    +  simdjson_inline simd8
    +  operator<=(const simd8 other) const {
    +    return other.max_val(*this) == other;
    +  }
    +  simdjson_inline simd8
    +  operator>=(const simd8 other) const {
    +    return other.min_val(*this) == other;
    +  }
    +  simdjson_inline simd8
    +  operator>(const simd8 other) const {
    +    return this->gt_bits(other).any_bits_set();
    +  }
    +  simdjson_inline simd8
    +  operator<(const simd8 other) const {
    +    return this->gt_bits(other).any_bits_set();
    +  }
    +
    +  // Bit-specific operations
    +  simdjson_inline simd8 bits_not_set() const {
    +    return (__m128i)vec_cmpeq(this->value, (__m128i)vec_splats(uint8_t(0)));
    +  }
    +  simdjson_inline simd8 bits_not_set(simd8 bits) const {
    +    return (*this & bits).bits_not_set();
    +  }
    +  simdjson_inline simd8 any_bits_set() const {
    +    return ~this->bits_not_set();
    +  }
    +  simdjson_inline simd8 any_bits_set(simd8 bits) const {
    +    return ~this->bits_not_set(bits);
    +  }
    +  simdjson_inline bool bits_not_set_anywhere() const {
    +    return vec_all_eq(this->value, (__m128i)vec_splats(0));
    +  }
    +  simdjson_inline bool any_bits_set_anywhere() const {
    +    return !bits_not_set_anywhere();
    +  }
    +  simdjson_inline bool bits_not_set_anywhere(simd8 bits) const {
    +    return vec_all_eq(vec_and(this->value, (__m128i)bits),
    +                      (__m128i)vec_splats(0));
    +  }
    +  simdjson_inline bool any_bits_set_anywhere(simd8 bits) const {
    +    return !bits_not_set_anywhere(bits);
    +  }
    +  template  simdjson_inline simd8 shr() const {
    +    return simd8(
    +        (__m128i)vec_sr(this->value, (__m128i)vec_splat_u8(N)));
    +  }
    +  template  simdjson_inline simd8 shl() const {
    +    return simd8(
    +        (__m128i)vec_sl(this->value, (__m128i)vec_splat_u8(N)));
    +  }
    +};
    +
    +template  struct simd8x64 {
    +  static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +  static_assert(NUM_CHUNKS == 4,
    +                "PPC64 kernel should use four registers per 64-byte block.");
    +  const simd8 chunks[NUM_CHUNKS];
    +
    +  simd8x64(const simd8x64 &o) = delete; // no copy allowed
    +  simd8x64 &
    +  operator=(const simd8& other) = delete; // no assignment allowed
    +  simd8x64() = delete;                      // no default constructor allowed
    +
    +  simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1,
    +                                  const simd8 chunk2, const simd8 chunk3)
    +      : chunks{chunk0, chunk1, chunk2, chunk3} {}
    +  simdjson_inline simd8x64(const T ptr[64])
    +      : chunks{simd8::load(ptr), simd8::load(ptr + 16),
    +               simd8::load(ptr + 32), simd8::load(ptr + 48)} {}
    +
    +  simdjson_inline void store(T ptr[64]) const {
    +    this->chunks[0].store(ptr + sizeof(simd8) * 0);
    +    this->chunks[1].store(ptr + sizeof(simd8) * 1);
    +    this->chunks[2].store(ptr + sizeof(simd8) * 2);
    +    this->chunks[3].store(ptr + sizeof(simd8) * 3);
    +  }
    +
    +  simdjson_inline simd8 reduce_or() const {
    +    return (this->chunks[0] | this->chunks[1]) |
    +           (this->chunks[2] | this->chunks[3]);
    +  }
    +
    +  simdjson_inline uint64_t compress(uint64_t mask, T *output) const {
    +    this->chunks[0].compress(uint16_t(mask), output);
    +    this->chunks[1].compress(uint16_t(mask >> 16),
    +                             output + 16 - count_ones(mask & 0xFFFF));
    +    this->chunks[2].compress(uint16_t(mask >> 32),
    +                             output + 32 - count_ones(mask & 0xFFFFFFFF));
    +    this->chunks[3].compress(uint16_t(mask >> 48),
    +                             output + 48 - count_ones(mask & 0xFFFFFFFFFFFF));
    +    return 64 - count_ones(mask);
    +  }
    +
    +  simdjson_inline uint64_t to_bitmask() const {
    +    uint64_t r0 = uint32_t(this->chunks[0].to_bitmask());
    +    uint64_t r1 = this->chunks[1].to_bitmask();
    +    uint64_t r2 = this->chunks[2].to_bitmask();
    +    uint64_t r3 = this->chunks[3].to_bitmask();
    +    return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48);
    +  }
    +
    +  simdjson_inline uint64_t eq(const T m) const {
    +    const simd8 mask = simd8::splat(m);
    +    return simd8x64(this->chunks[0] == mask, this->chunks[1] == mask,
    +                          this->chunks[2] == mask, this->chunks[3] == mask)
    +        .to_bitmask();
    +  }
    +
    +  simdjson_inline uint64_t eq(const simd8x64 &other) const {
    +    return simd8x64(this->chunks[0] == other.chunks[0],
    +                          this->chunks[1] == other.chunks[1],
    +                          this->chunks[2] == other.chunks[2],
    +                          this->chunks[3] == other.chunks[3])
    +        .to_bitmask();
    +  }
    +
    +  simdjson_inline uint64_t lteq(const T m) const {
    +    const simd8 mask = simd8::splat(m);
    +    return simd8x64(this->chunks[0] <= mask, this->chunks[1] <= mask,
    +                          this->chunks[2] <= mask, this->chunks[3] <= mask)
    +        .to_bitmask();
    +  }
    +}; // struct simd8x64
    +
    +} // namespace simd
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_PPC64_SIMD_INPUT_H
    +/* end file simdjson/ppc64/simd.h */
    +/* including simdjson/ppc64/stringparsing_defs.h: #include "simdjson/ppc64/stringparsing_defs.h" */
    +/* begin file simdjson/ppc64/stringparsing_defs.h */
    +#ifndef SIMDJSON_PPC64_STRINGPARSING_DEFS_H
    +#define SIMDJSON_PPC64_STRINGPARSING_DEFS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/simd.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace {
    +
    +using namespace simd;
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 32;
    +  simdjson_inline static backslash_and_quote
    +  copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() {
    +    return ((bs_bits - 1) & quote_bits) != 0;
    +  }
    +  simdjson_inline bool has_backslash() { return bs_bits != 0; }
    +  simdjson_inline int quote_index() {
    +    return trailing_zeroes(quote_bits);
    +  }
    +  simdjson_inline int backslash_index() {
    +    return trailing_zeroes(bs_bits);
    +  }
    +
    +  uint32_t bs_bits;
    +  uint32_t quote_bits;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote
    +backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // this can read up to 31 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1),
    +                "backslash and quote finder must process fewer than "
    +                "SIMDJSON_PADDING bytes");
    +  simd8 v0(src);
    +  simd8 v1(src + sizeof(v0));
    +  v0.store(dst);
    +  v1.store(dst + sizeof(v0));
    +
    +  // Getting a 64-bit bitmask is much cheaper than multiple 16-bit bitmasks on
    +  // PPC; therefore, we smash them together into a 64-byte mask and get the
    +  // bitmask from there.
    +  uint64_t bs_and_quote =
    +      simd8x64(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask();
    +  return {
    +      uint32_t(bs_and_quote),      // bs_bits
    +      uint32_t(bs_and_quote >> 32) // quote_bits
    +  };
    +}
    +
    +} // unnamed namespace
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_PPC64_STRINGPARSING_DEFS_H
    +/* end file simdjson/ppc64/stringparsing_defs.h */
    +
    +#define SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT 1
    +/* end file simdjson/ppc64/begin.h */
    +/* including simdjson/generic/ondemand/amalgamated.h for ppc64: #include "simdjson/generic/ondemand/amalgamated.h" */
    +/* begin file simdjson/generic/ondemand/amalgamated.h for ppc64 */
    +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_ONDEMAND_DEPENDENCIES_H)
    +#error simdjson/generic/ondemand/dependencies.h must be included before simdjson/generic/ondemand/amalgamated.h!
    +#endif
    +
    +// Stuff other things depend on
    +/* including simdjson/generic/ondemand/base.h for ppc64: #include "simdjson/generic/ondemand/base.h" */
    +/* begin file simdjson/generic/ondemand/base.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +/**
    + * A fast, simple, DOM-like interface that parses JSON as you use it.
    + *
    + * Designed for maximum speed and a lower memory profile.
    + */
    +namespace ondemand {
    +
    +/** Represents the depth of a JSON value (number of nested arrays/objects). */
    +using depth_t = int32_t;
    +
    +/** @copydoc simdjson::ppc64::number_type */
    +using number_type = simdjson::ppc64::number_type;
    +
    +/** @private Position in the JSON buffer indexes */
    +using token_position = const uint32_t *;
    +
    +class array;
    +class array_iterator;
    +class document;
    +class document_reference;
    +class document_stream;
    +class field;
    +class json_iterator;
    +enum class json_type;
    +struct number;
    +class object;
    +class object_iterator;
    +class parser;
    +class raw_json_string;
    +class token_iterator;
    +class value;
    +class value_iterator;
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_BASE_H
    +/* end file simdjson/generic/ondemand/base.h for ppc64 */
    +/* including simdjson/generic/ondemand/value_iterator.h for ppc64: #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* begin file simdjson/generic/ondemand/value_iterator.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +/**
    + * Iterates through a single JSON value at a particular depth.
    + *
    + * Does not keep track of the type of value: provides methods for objects, arrays and scalars and expects
    + * the caller to call the right ones.
    + *
    + * @private This is not intended for external use.
    + */
    +class value_iterator {
    +protected:
    +  /** The underlying JSON iterator */
    +  json_iterator *_json_iter{};
    +  /** The depth of this value */
    +  depth_t _depth{};
    +  /**
    +   * The starting token index for this value
    +   */
    +  token_position _start_position{};
    +
    +public:
    +  simdjson_inline value_iterator() noexcept = default;
    +
    +  /**
    +   * Denote that we're starting a document.
    +   */
    +  simdjson_inline void start_document() noexcept;
    +
    +  /**
    +   * Skips a non-iterated or partially-iterated JSON value, whether it is a scalar, array or object.
    +   *
    +   * Optimized for scalars.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code skip_child() noexcept;
    +
    +  /**
    +   * Tell whether the iterator is at the EOF mark
    +   */
    +  simdjson_inline bool at_end() const noexcept;
    +
    +  /**
    +   * Tell whether the iterator is at the start of the value
    +   */
    +  simdjson_inline bool at_start() const noexcept;
    +
    +  /**
    +   * Tell whether the value is open--if the value has not been used, or the array/object is still open.
    +   */
    +  simdjson_inline bool is_open() const noexcept;
    +
    +  /**
    +   * Tell whether the value is at an object's first field (just after the {).
    +   */
    +  simdjson_inline bool at_first_field() const noexcept;
    +
    +  /**
    +   * Abandon all iteration.
    +   */
    +  simdjson_inline void abandon() noexcept;
    +
    +  /**
    +   * Get the child value as a value_iterator.
    +   */
    +  simdjson_inline value_iterator child_value() const noexcept;
    +
    +  /**
    +   * Get the depth of this value.
    +   */
    +  simdjson_inline int32_t depth() const noexcept;
    +
    +  /**
    +   * Get the JSON type of this value.
    +   *
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result type() const noexcept;
    +
    +  /**
    +   * @addtogroup object Object iteration
    +   *
    +   * Methods to iterate and find object fields. These methods generally *assume* the value is
    +   * actually an object; the caller is responsible for keeping track of that fact.
    +   *
    +   * @{
    +   */
    +
    +  /**
    +   * Start an object iteration.
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCORRECT_TYPE if there is no opening {
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_object() noexcept;
    +  /**
    +   * Start an object iteration from the root.
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCORRECT_TYPE if there is no opening {
    +   * @error TAPE_ERROR if there is no matching } at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_root_object() noexcept;
    +  /**
    +   * Checks whether an object could be started from the root. May be called by start_root_object.
    +   *
    +   * @returns SUCCESS if it is possible to safely start an object from the root (document level).
    +   * @error INCORRECT_TYPE if there is no opening {
    +   * @error TAPE_ERROR if there is no matching } at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline error_code check_root_object() noexcept;
    +  /**
    +   * Start an object iteration after the user has already checked and moved past the {.
    +   *
    +   * Does not move the iterator unless the object is empty ({}).
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_object() noexcept;
    +  /**
    +   * Start an object iteration from the root, after the user has already checked and moved past the {.
    +   *
    +   * Does not move the iterator unless the object is empty ({}).
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_root_object() noexcept;
    +
    +  /**
    +   * Moves to the next field in an object.
    +   *
    +   * Looks for , and }. If } is found, the object is finished and the iterator advances past it.
    +   * Otherwise, it advances to the next value.
    +   *
    +   * @return whether there is another field in the object.
    +   * @error TAPE_ERROR If there is a comma missing between fields.
    +   * @error TAPE_ERROR If there is a comma, but not enough tokens remaining to have a key, :, and value.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result has_next_field() noexcept;
    +
    +  /**
    +   * Get the current field's key.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result field_key() noexcept;
    +
    +  /**
    +   * Pass the : in the field and move to its value.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code field_value() noexcept;
    +
    +  /**
    +   * Find the next field with the given key.
    +   *
    +   * Assumes you have called next_field() or otherwise matched the previous value.
    +   *
    +   * This means the iterator must be sitting at the next key:
    +   *
    +   * ```
    +   * { "a": 1, "b": 2 }
    +   *           ^
    +   * ```
    +   *
    +   * Key is *raw JSON,* meaning it will be matched against the verbatim JSON without attempting to
    +   * unescape it. This works well for typical ASCII and UTF-8 keys (almost all of them), but may
    +   * fail to match some keys with escapes (\u, \n, etc.).
    +   */
    +  simdjson_warn_unused simdjson_inline error_code find_field(const std::string_view key) noexcept;
    +
    +  /**
    +   * Find the next field with the given key, *without* unescaping. This assumes object order: it
    +   * will not find the field if it was already passed when looking for some *other* field.
    +   *
    +   * Assumes you have called next_field() or otherwise matched the previous value.
    +   *
    +   * This means the iterator must be sitting at the next key:
    +   *
    +   * ```
    +   * { "a": 1, "b": 2 }
    +   *           ^
    +   * ```
    +   *
    +   * Key is *raw JSON,* meaning it will be matched against the verbatim JSON without attempting to
    +   * unescape it. This works well for typical ASCII and UTF-8 keys (almost all of them), but may
    +   * fail to match some keys with escapes (\u, \n, etc.).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result find_field_raw(const std::string_view key) noexcept;
    +
    +  /**
    +   * Find the field with the given key without regard to order, and *without* unescaping.
    +   *
    +   * This is an unordered object lookup: if the field is not found initially, it will cycle around and scan from the beginning.
    +   *
    +   * Assumes you have called next_field() or otherwise matched the previous value.
    +   *
    +   * This means the iterator must be sitting at the next key:
    +   *
    +   * ```
    +   * { "a": 1, "b": 2 }
    +   *           ^
    +   * ```
    +   *
    +   * Key is *raw JSON,* meaning it will be matched against the verbatim JSON without attempting to
    +   * unescape it. This works well for typical ASCII and UTF-8 keys (almost all of them), but may
    +   * fail to match some keys with escapes (\u, \n, etc.).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result find_field_unordered_raw(const std::string_view key) noexcept;
    +
    +  /** @} */
    +
    +  /**
    +   * @addtogroup array Array iteration
    +   * Methods to iterate over array elements. These methods generally *assume* the value is actually
    +   * an object; the caller is responsible for keeping track of that fact.
    +   * @{
    +   */
    +
    +  /**
    +   * Check for an opening [ and start an array iteration.
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCORRECT_TYPE If there is no [.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_array() noexcept;
    +  /**
    +   * Check for an opening [ and start an array iteration while at the root.
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCORRECT_TYPE If there is no [.
    +   * @error TAPE_ERROR if there is no matching ] at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_root_array() noexcept;
    +  /**
    +   * Checks whether an array could be started from the root. May be called by start_root_array.
    +   *
    +   * @returns SUCCESS if it is possible to safely start an array from the root (document level).
    +   * @error INCORRECT_TYPE If there is no [.
    +   * @error TAPE_ERROR if there is no matching ] at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline error_code check_root_array() noexcept;
    +  /**
    +   * Start an array iteration, after the user has already checked and moved past the [.
    +   *
    +   * Does not move the iterator unless the array is empty ([]).
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_array() noexcept;
    +  /**
    +   * Start an array iteration from the root, after the user has already checked and moved past the [.
    +   *
    +   * Does not move the iterator unless the array is empty ([]).
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_root_array() noexcept;
    +
    +  /**
    +   * Moves to the next element in an array.
    +   *
    +   * Looks for , and ]. If ] is found, the array is finished and the iterator advances past it.
    +   * Otherwise, it advances to the next value.
    +   *
    +   * @return Whether there is another element in the array.
    +   * @error TAPE_ERROR If there is a comma missing between elements.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result has_next_element() noexcept;
    +
    +  /**
    +   * Get a child value iterator.
    +   */
    +  simdjson_warn_unused simdjson_inline value_iterator child() const noexcept;
    +
    +  /** @} */
    +
    +  /**
    +   * @defgroup scalar Scalar values
    +   * @addtogroup scalar
    +   * @{
    +   */
    +
    +  simdjson_warn_unused simdjson_inline simdjson_result get_string(bool allow_replacement) noexcept;
    +  template 
    +  simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_null() noexcept;
    +  simdjson_warn_unused simdjson_inline bool is_negative() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept;
    +
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_string(bool check_trailing, bool allow_replacement) noexcept;
    +  template 
    +  simdjson_warn_unused simdjson_inline error_code get_root_string(string_type& receiver, bool check_trailing, bool allow_replacement) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_wobbly_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_raw_json_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_uint64(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_uint64_in_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_int64(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_int64_in_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_double(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_double_in_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_bool(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline bool is_root_negative() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_root_integer(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_number_type(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_number(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_root_null(bool check_trailing) noexcept;
    +
    +  simdjson_inline error_code error() const noexcept;
    +  simdjson_inline uint8_t *&string_buf_loc() noexcept;
    +  simdjson_inline const json_iterator &json_iter() const noexcept;
    +  simdjson_inline json_iterator &json_iter() noexcept;
    +
    +  simdjson_inline void assert_is_valid() const noexcept;
    +  simdjson_inline bool is_valid() const noexcept;
    +
    +  /** @} */
    +protected:
    +  /**
    +   * Restarts an array iteration.
    +   * @returns Whether the array has any elements (returns false for empty).
    +   */
    +  simdjson_inline simdjson_result reset_array() noexcept;
    +  /**
    +   * Restarts an object iteration.
    +   * @returns Whether the object has any fields (returns false for empty).
    +   */
    +  simdjson_inline simdjson_result reset_object() noexcept;
    +  /**
    +   * move_at_start(): moves us so that we are pointing at the beginning of
    +   * the container. It updates the index so that at_start() is true and it
    +   * syncs the depth. The user can then create a new container instance.
    +   *
    +   * Usage: used with value::count_elements().
    +   **/
    +  simdjson_inline void move_at_start() noexcept;
    +
    +  /**
    +   * move_at_container_start(): moves us so that we are pointing at the beginning of
    +   * the container so that assert_at_container_start() passes.
    +   *
    +   * Usage: used with reset_array() and reset_object().
    +   **/
    +   simdjson_inline void move_at_container_start() noexcept;
    +  /* Useful for debugging and logging purposes. */
    +  inline std::string to_string() const noexcept;
    +  simdjson_inline value_iterator(json_iterator *json_iter, depth_t depth, token_position start_index) noexcept;
    +
    +  simdjson_inline simdjson_result parse_null(const uint8_t *json) const noexcept;
    +  simdjson_inline simdjson_result parse_bool(const uint8_t *json) const noexcept;
    +  simdjson_inline const uint8_t *peek_start() const noexcept;
    +  simdjson_inline uint32_t peek_start_length() const noexcept;
    +
    +  /**
    +   * The general idea of the advance_... methods and the peek_* methods
    +   * is that you first peek and check that you have desired type. If you do,
    +   * and only if you do, then you advance.
    +   *
    +   * We used to unconditionally advance. But this made reasoning about our
    +   * current state difficult.
    +   * Suppose you always advance. Look at the 'value' matching the key
    +   * "shadowable" in the following example...
    +   *
    +   * ({"globals":{"a":{"shadowable":[}}}})
    +   *
    +   * If the user thinks it is a Boolean and asks for it, then we check the '[',
    +   * decide it is not a Boolean, but still move into the next character ('}'). Now
    +   * we are left pointing at '}' right after a '['. And we have not yet reported
    +   * an error, only that we do not have a Boolean.
    +   *
    +   * If, instead, you just stand your ground until it is content that you know, then
    +   * you will only even move beyond the '[' if the user tells you that you have an
    +   * array. So you will be at the '}' character inside the array and, hopefully, you
    +   * will then catch the error because an array cannot start with '}', but the code
    +   * processing Boolean values does not know this.
    +   *
    +   * So the contract is: first call 'peek_...' and then call 'advance_...' only
    +   * if you have determined that it is a type you can handle.
    +   *
    +   * Unfortunately, it makes the code more verbose, longer and maybe more error prone.
    +   */
    +
    +  simdjson_inline void advance_scalar(const char *type) noexcept;
    +  simdjson_inline void advance_root_scalar(const char *type) noexcept;
    +  simdjson_inline void advance_non_root_scalar(const char *type) noexcept;
    +
    +  simdjson_inline const uint8_t *peek_scalar(const char *type) noexcept;
    +  simdjson_inline const uint8_t *peek_root_scalar(const char *type) noexcept;
    +  simdjson_inline const uint8_t *peek_non_root_scalar(const char *type) noexcept;
    +
    +
    +  simdjson_inline error_code start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept;
    +  simdjson_inline error_code end_container() noexcept;
    +
    +  /**
    +   * Advance to a place expecting a value (increasing depth).
    +   *
    +   * @return The current token (the one left behind).
    +   * @error TAPE_ERROR If the document ended early.
    +   */
    +  simdjson_inline simdjson_result advance_to_value() noexcept;
    +
    +  simdjson_inline error_code incorrect_type_error(const char *message) const noexcept;
    +  simdjson_inline error_code error_unless_more_tokens(uint32_t tokens=1) const noexcept;
    +
    +  simdjson_inline bool is_at_start() const noexcept;
    +  /**
    +   * is_at_iterator_start() returns true on an array or object after it has just been
    +   * created, whether the instance is empty or not.
    +   *
    +   * Usage: used by array::begin() in debug mode (SIMDJSON_DEVELOPMENT_CHECKS)
    +   */
    +  simdjson_inline bool is_at_iterator_start() const noexcept;
    +
    +  /**
    +   * Assuming that we are within an object, this returns true if we
    +   * are pointing at a key.
    +   *
    +   * Usage: the skip_child() method should never be used while we are pointing
    +   * at a key inside an object.
    +   */
    +  simdjson_inline bool is_at_key() const noexcept;
    +
    +  inline void assert_at_start() const noexcept;
    +  inline void assert_at_container_start() const noexcept;
    +  inline void assert_at_root() const noexcept;
    +  inline void assert_at_child() const noexcept;
    +  inline void assert_at_next() const noexcept;
    +  inline void assert_at_non_root_start() const noexcept;
    +
    +  /** Get the starting position of this value */
    +  simdjson_inline token_position start_position() const noexcept;
    +
    +  /** @copydoc error_code json_iterator::position() const noexcept; */
    +  simdjson_inline token_position position() const noexcept;
    +  /** @copydoc error_code json_iterator::end_position() const noexcept; */
    +  simdjson_inline token_position last_position() const noexcept;
    +  /** @copydoc error_code json_iterator::end_position() const noexcept; */
    +  simdjson_inline token_position end_position() const noexcept;
    +  /** @copydoc error_code json_iterator::report_error(error_code error, const char *message) noexcept; */
    +  simdjson_inline error_code report_error(error_code error, const char *message) noexcept;
    +
    +  friend class document;
    +  friend class object;
    +  friend class array;
    +  friend class value;
    +}; // value_iterator
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public ppc64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(ppc64::ondemand::value_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H
    +/* end file simdjson/generic/ondemand/value_iterator.h for ppc64 */
    +/* including simdjson/generic/ondemand/value.h for ppc64: #include "simdjson/generic/ondemand/value.h" */
    +/* begin file simdjson/generic/ondemand/value.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +/**
    + * An ephemeral JSON value returned during iteration. It is only valid for as long as you do
    + * not access more data in the JSON document.
    + */
    +class value {
    +public:
    +  /**
    +   * Create a new invalid value.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline value() noexcept = default;
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool
    +   *
    +   * You may use get_double(), get_bool(), get_uint64(), get_int64(),
    +   * get_object(), get_array(), get_raw_json_string(), or get_string() instead.
    +   *
    +   * @returns A value of the given type, parsed from the JSON.
    +   * @returns INCORRECT_TYPE If the JSON value is not the given type.
    +   */
    +  template simdjson_inline simdjson_result get() noexcept {
    +    // Unless the simdjson library provides an inline implementation, calling this method should
    +    // immediately fail.
    +    static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. "
    +      "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
    +      "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), "
    +      " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template.");
    +  }
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool
    +   *
    +   * @param out This is set to a value of the given type, parsed from the JSON. If there is an error, this may not be initialized.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   * @returns SUCCESS If the parse succeeded and the out parameter was set to the value.
    +   */
    +  template simdjson_inline error_code get(T &out) noexcept;
    +
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @returns INCORRECT_TYPE If the JSON value is not an array.
    +   */
    +  simdjson_inline simdjson_result get_array() noexcept;
    +
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   */
    +  simdjson_inline simdjson_result get_object() noexcept;
    +
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A unsigned 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a unsigned integer.
    +   *
    +   * @returns A unsigned 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a double
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Equivalent to get().
    +   *
    +   * Important: a value should be consumed once. Calling get_string() twice on the same value
    +   * is an error.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +
    +  /**
    +   * Attempts to fill the provided std::string reference with the parsed value of the current string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Important: a value should be consumed once. Calling get_string() twice on the same value
    +   * is an error.
    +   *
    +   * Performance: This method may be slower than get_string() or get_string(bool) because it may need to allocate memory.
    +   * We recommend you avoid allocating an std::string unless you need to.
    +   *
    +   * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS.
    +   */
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +
    +  /**
    +   * Cast this JSON value to a "wobbly" string.
    +   *
    +   * The string is may not be a valid UTF-8 string.
    +   * See https://simonsapin.github.io/wtf-8/
    +   *
    +   * Important: a value should be consumed once. Calling get_wobbly_string() twice on the same value
    +   * is an error.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @returns INCORRECT_TYPE if the JSON value is not true or false.
    +   */
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +
    +  /**
    +   * Checks if this JSON value is null. If and only if the value is
    +   * null, then it is consumed (we advance). If we find a token that
    +   * begins with 'n' but is not 'null', then an error is returned.
    +   *
    +   * @returns Whether the value is null.
    +   * @returns INCORRECT_TYPE If the JSON value begins with 'n' and is not 'null'.
    +   */
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an array.
    +   */
    +  simdjson_inline operator array() noexcept(false);
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an object.
    +   */
    +  simdjson_inline operator object() noexcept(false);
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline operator int64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline operator double() noexcept(false);
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Equivalent to get().
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator raw_json_string() noexcept(false);
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not true or false.
    +   */
    +  simdjson_inline operator bool() noexcept(false);
    +#endif
    +
    +  /**
    +   * Begin array iteration.
    +   *
    +   * Part of the std::iterable interface.
    +   *
    +   * @returns INCORRECT_TYPE If the JSON value is not an array.
    +   */
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  /**
    +   * Sentinel representing the end of the array.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result end() & noexcept;
    +  /**
    +   * This method scans the array and counts the number of elements.
    +   * The count_elements method should always be called before you have begun
    +   * iterating through the array: it is expected that you are pointing at
    +   * the beginning of the array.
    +   * The runtime complexity is linear in the size of the array. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * Performance hint: You should only call count_elements() as a last
    +   * resort as it may require scanning the document twice or more.
    +   */
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  /**
    +   * This method scans the object and counts the number of key-value pairs.
    +   * The count_fields method should always be called before you have begun
    +   * iterating through the object: it is expected that you are pointing at
    +   * the beginning of the object.
    +   * The runtime complexity is linear in the size of the object. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an object is empty, it is more performant to use
    +   * the is_empty() method on the object instance.
    +   *
    +   * Performance hint: You should only call count_fields() as a last
    +   * resort as it may require scanning the document twice or more.
    +   */
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  /**
    +   * Get the value at the given index in the array. This function has linear-time complexity.
    +   * This function should only be called once on an array instance since the array iterator is not reset between each call.
    +   *
    +   * @return The value at the given index, or:
    +   *         - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
    +   */
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field(const char *key) noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](const char *key) noexcept;
    +
    +  /**
    +   * Get the type of this JSON value. It does not validate or consume the value.
    +   * E.g., you must still call "is_null()" to check that a value is null even if
    +   * "type()" returns json_type::null.
    +   *
    +   * NOTE: If you're only expecting a value to be one type (a typical case), it's generally
    +   * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just
    +   * let it throw an exception).
    +   *
    +   * @return The type of JSON value (json_type::array, json_type::object, json_type::string,
    +   *     json_type::number, json_type::boolean, or json_type::null).
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result type() noexcept;
    +
    +  /**
    +   * Checks whether the value is a scalar (string, number, null, Boolean).
    +   * Returns false when there it is an array or object.
    +   *
    +   * @returns true if the type is string, number, null, Boolean
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +
    +  /**
    +   * Checks whether the value is a negative number.
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline bool is_negative() noexcept;
    +  /**
    +   * Checks whether the value is an integer number. Note that
    +   * this requires to partially parse the number string. If
    +   * the value is determined to be an integer, it may still
    +   * not parse properly as an integer in subsequent steps
    +   * (e.g., it might overflow).
    +   *
    +   * Performance note: if you call this function systematically
    +   * before parsing a number, you may have fallen for a performance
    +   * anti-pattern.
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  /**
    +   * Determine the number type (integer or floating-point number) as quickly
    +   * as possible. This function does not fully validate the input. It is
    +   * useful when you only need to classify the numbers, without parsing them.
    +   *
    +   * If you are planning to retrieve the value or you need full validation,
    +   * consider using the get_number() method instead: it will fully parse
    +   * and validate the input, and give you access to the type:
    +   * get_number().get_number_type().
    +   *
    +   * get_number_type() is number_type::unsigned_integer if we have
    +   * an integer greater or equal to 9223372036854775808
    +   * get_number_type() is number_type::signed_integer if we have an
    +   * integer that is less than 9223372036854775808
    +   * Otherwise, get_number_type() has value number_type::floating_point_number
    +   *
    +   * This function requires processing the number string, but it is expected
    +   * to be faster than get_number().get_number_type() because it is does not
    +   * parse the number value.
    +   *
    +   * @returns the type of the number
    +   */
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +
    +  /**
    +   * Attempt to parse an ondemand::number. An ondemand::number may
    +   * contain an integer value or a floating-point value, the simdjson
    +   * library will autodetect the type. Thus it is a dynamically typed
    +   * number. Before accessing the value, you must determine the detected
    +   * type.
    +   *
    +   * number.get_number_type() is number_type::signed_integer if we have
    +   * an integer in [-9223372036854775808,9223372036854775808)
    +   * You can recover the value by calling number.get_int64() and you
    +   * have that number.is_int64() is true.
    +   *
    +   * number.get_number_type() is number_type::unsigned_integer if we have
    +   * an integer in [9223372036854775808,18446744073709551616)
    +   * You can recover the value by calling number.get_uint64() and you
    +   * have that number.is_uint64() is true.
    +   *
    +   * Otherwise, number.get_number_type() has value number_type::floating_point_number
    +   * and we have a binary64 number.
    +   * You can recover the value by calling number.get_double() and you
    +   * have that number.is_double() is true.
    +   *
    +   * You must check the type before accessing the value: it is an error
    +   * to call "get_int64()" when number.get_number_type() is not
    +   * number_type::signed_integer and when number.is_int64() is false.
    +   *
    +   * Performance note: this is designed with performance in mind. When
    +   * calling 'get_number()', you scan the number string only once, determining
    +   * efficiently the type and storing it in an efficient manner.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept;
    +
    +
    +  /**
    +   * Get the raw JSON for this token.
    +   *
    +   * The string_view will always point into the input buffer.
    +   *
    +   * The string_view will start at the beginning of the token, and include the entire token
    +   * *as well as all spaces until the next token (or EOF).* This means, for example, that a
    +   * string token always begins with a " and is always terminated by the final ", possibly
    +   * followed by a number of spaces.
    +   *
    +   * The string_view is *not* null-terminated. However, if this is a scalar (string, number,
    +   * boolean, or null), the character after the end of the string_view is guaranteed to be
    +   * a non-space token.
    +   *
    +   * Tokens include:
    +   * - {
    +   * - [
    +   * - "a string (possibly with UTF-8 or backslashed characters like \\\")".
    +   * - -1.2e-100
    +   * - true
    +   * - false
    +   * - null
    +   *
    +   * See also value::raw_json().
    +   */
    +  simdjson_inline std::string_view raw_json_token() noexcept;
    +
    +  /**
    +   * Get a string_view pointing at this value in the JSON document.
    +   * If this element is an array or an object, it consumes the array or the object
    +   * and returns a string_view instance corresponding to the
    +   * array as represented in JSON. It points inside the original document.
    +   * If this element is a scalar (string, number, Boolean, null), it returns what
    +   * raw_json_token() would return.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +  /**
    +   * Returns the current location in the document if in bounds.
    +   */
    +  simdjson_inline simdjson_result current_location() noexcept;
    +
    +  /**
    +   * Returns the current depth in the document if in bounds.
    +   *
    +   * E.g.,
    +   *  0 = finished with document
    +   *  1 = document root value (could be [ or {, not yet known)
    +   *  2 = , or } inside root array/object
    +   *  3 = key or value inside root array/object.
    +   */
    +  simdjson_inline int32_t current_depth() const noexcept;
    +
    +  /**
    +   * Get the value associated with the given JSON pointer.  We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/foo/a/1") == 20
    +   *
    +   * It is allowed for a key to be the empty string:
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("//a/1") == 20
    +   *
    +   * Note that at_pointer() called on the document automatically calls the document's rewind
    +   * method between each call. It invalidates all previously accessed arrays, objects and values
    +   * that have not been consumed.
    +   *
    +   * Calling at_pointer() on non-document instances (e.g., arrays and objects) is not
    +   * standardized (by RFC 6901). We provide some experimental support for JSON pointers
    +   * on non-document instances.  Yet it is not the case when calling at_pointer on an array
    +   * or an object instance: there is no rewind and no invalidation.
    +   *
    +   * You may only call at_pointer on an array after it has been created, but before it has
    +   * been first accessed. When calling at_pointer on an array, the pointer is advanced to
    +   * the location indicated by the JSON pointer (in case of success). It is no longer possible
    +   * to call at_pointer on the same array.
    +   *
    +   * You may call at_pointer more than once on an object, but each time the pointer is advanced
    +   * to be within the value matched by the key indicated by the JSON pointer query. Thus any preceding
    +   * key (as well as the current key) can no longer be used with following JSON pointer calls.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   */
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +
    +protected:
    +  /**
    +   * Create a value.
    +   */
    +  simdjson_inline value(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Skip this value, allowing iteration to continue.
    +   */
    +  simdjson_inline void skip() noexcept;
    +
    +  /**
    +   * Start a value at the current position.
    +   *
    +   * (It should already be started; this is just a self-documentation method.)
    +   */
    +  static simdjson_inline value start(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Resume a value.
    +   */
    +  static simdjson_inline value resume(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Get the object, starting or resuming it as necessary
    +   */
    +  simdjson_inline simdjson_result start_or_resume_object() noexcept;
    +
    +  // simdjson_inline void log_value(const char *type) const noexcept;
    +  // simdjson_inline void log_error(const char *message) const noexcept;
    +
    +  value_iterator iter{};
    +
    +  friend class document;
    +  friend class array_iterator;
    +  friend class field;
    +  friend class object;
    +  friend struct simdjson_result;
    +  friend struct simdjson_result;
    +};
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public ppc64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(ppc64::ondemand::value &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result get_array() noexcept;
    +  simdjson_inline simdjson_result get_object() noexcept;
    +
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +  template simdjson_inline simdjson_result get() noexcept;
    +
    +  template simdjson_inline error_code get(T &out) noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator ppc64::ondemand::array() noexcept(false);
    +  simdjson_inline operator ppc64::ondemand::object() noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator ppc64::ondemand::raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   *
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field(const char *key) noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](const char *key) noexcept;
    +
    +  /**
    +   * Get the type of this JSON value.
    +   *
    +   * NOTE: If you're only expecting a value to be one type (a typical case), it's generally
    +   * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just
    +   * let it throw an exception).
    +   */
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +  simdjson_inline simdjson_result is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +
    +  /** @copydoc simdjson_inline std::string_view value::raw_json_token() const noexcept */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +  /** @copydoc simdjson_inline simdjson_result current_location() noexcept */
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  /** @copydoc simdjson_inline int32_t current_depth() const noexcept */
    +  simdjson_inline simdjson_result current_depth() const noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_H
    +/* end file simdjson/generic/ondemand/value.h for ppc64 */
    +/* including simdjson/generic/ondemand/logger.h for ppc64: #include "simdjson/generic/ondemand/logger.h" */
    +/* begin file simdjson/generic/ondemand/logger.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_LOGGER_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +// Logging should be free unless SIMDJSON_VERBOSE_LOGGING is set. Importantly, it is critical
    +// that the call to the log functions be side-effect free. Thus, for example, you should not
    +// create temporary std::string instances.
    +namespace logger {
    +
    +enum class log_level : int32_t {
    +  info = 0,
    +  error = 1
    +};
    +
    +#if SIMDJSON_VERBOSE_LOGGING
    +  static constexpr const bool LOG_ENABLED = true;
    +#else
    +  static constexpr const bool LOG_ENABLED = false;
    +#endif
    +
    +// We do not want these functions to be 'really inlined' since real inlining is
    +// for performance purposes and if you are using the loggers, you do not care about
    +// performance (or should not).
    +static inline void log_headers() noexcept;
    +// If args are provided, title will be treated as format string
    +template 
    +static inline void log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, logger::log_level level, Args&&... args) noexcept;
    +template 
    +static inline void log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, logger::log_level level, Args&&... args) noexcept;
    +static inline void log_event(const json_iterator &iter, const char *type, std::string_view detail="", int delta=0, int depth_delta=0) noexcept;
    +static inline void log_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail="") noexcept;
    +static inline void log_value(const json_iterator &iter, const char *type, std::string_view detail="", int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_start_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail="") noexcept;
    +static inline void log_start_value(const json_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_end_value(const json_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +
    +static inline void log_error(const json_iterator &iter, token_position index, depth_t depth, const char *error, const char *detail="") noexcept;
    +static inline void log_error(const json_iterator &iter, const char *error, const char *detail="", int delta=-1, int depth_delta=0) noexcept;
    +
    +static inline void log_event(const value_iterator &iter, const char *type, std::string_view detail="", int delta=0, int depth_delta=0) noexcept;
    +static inline void log_value(const value_iterator &iter, const char *type, std::string_view detail="", int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_start_value(const value_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_end_value(const value_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_error(const value_iterator &iter, const char *error, const char *detail="", int delta=-1, int depth_delta=0) noexcept;
    +
    +} // namespace logger
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_H
    +/* end file simdjson/generic/ondemand/logger.h for ppc64 */
    +/* including simdjson/generic/ondemand/token_iterator.h for ppc64: #include "simdjson/generic/ondemand/token_iterator.h" */
    +/* begin file simdjson/generic/ondemand/token_iterator.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/logger.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +/**
    + * Iterates through JSON tokens (`{` `}` `[` `]` `,` `:` `""` `123` `true` `false` `null`)
    + * detected by stage 1.
    + *
    + * @private This is not intended for external use.
    + */
    +class token_iterator {
    +public:
    +  /**
    +   * Create a new invalid token_iterator.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline token_iterator() noexcept = default;
    +  simdjson_inline token_iterator(token_iterator &&other) noexcept = default;
    +  simdjson_inline token_iterator &operator=(token_iterator &&other) noexcept = default;
    +  simdjson_inline token_iterator(const token_iterator &other) noexcept = default;
    +  simdjson_inline token_iterator &operator=(const token_iterator &other) noexcept = default;
    +
    +  /**
    +   * Advance to the next token (returning the current one).
    +   */
    +  simdjson_inline const uint8_t *return_current_and_advance() noexcept;
    +  /**
    +   * Reports the current offset in bytes from the start of the underlying buffer.
    +   */
    +  simdjson_inline uint32_t current_offset() const noexcept;
    +  /**
    +   * Get the JSON text for a given token (relative).
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = current token,
    +   *              1 = next token, -1 = prev token.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek(int32_t delta=0) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for a given token.
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = current token,
    +   *              1 = next token, -1 = prev token.
    +   */
    +  simdjson_inline uint32_t peek_length(int32_t delta=0) const noexcept;
    +
    +  /**
    +   * Get the JSON text for a given token.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param position The position of the token.
    +   *
    +   */
    +  simdjson_inline const uint8_t *peek(token_position position) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for a given token.
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param position The position of the token.
    +   */
    +  simdjson_inline uint32_t peek_length(token_position position) const noexcept;
    +
    +  /**
    +   * Return the current index.
    +   */
    +  simdjson_inline token_position position() const noexcept;
    +  /**
    +   * Reset to a previously saved index.
    +   */
    +  simdjson_inline void set_position(token_position target_position) noexcept;
    +
    +  // NOTE: we don't support a full C++ iterator interface, because we expect people to make
    +  // different calls to advance the iterator based on *their own* state.
    +
    +  simdjson_inline bool operator==(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator!=(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator>(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator>=(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator<(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator<=(const token_iterator &other) const noexcept;
    +
    +protected:
    +  simdjson_inline token_iterator(const uint8_t *buf, token_position position) noexcept;
    +
    +  /**
    +   * Get the index of the JSON text for a given token (relative).
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = current token,
    +   *              1 = next token, -1 = prev token.
    +   */
    +  simdjson_inline uint32_t peek_index(int32_t delta=0) const noexcept;
    +  /**
    +   * Get the index of the JSON text for a given token.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param position The position of the token.
    +   *
    +   */
    +  simdjson_inline uint32_t peek_index(token_position position) const noexcept;
    +
    +  const uint8_t *buf{};
    +  token_position _position{};
    +
    +  friend class json_iterator;
    +  friend class value_iterator;
    +  friend class object;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, logger::log_level level, Args&&... args) noexcept;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, logger::log_level level, Args&&... args) noexcept;
    +};
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public ppc64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(ppc64::ondemand::token_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline ~simdjson_result() noexcept = default; ///< @private
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H
    +/* end file simdjson/generic/ondemand/token_iterator.h for ppc64 */
    +/* including simdjson/generic/ondemand/json_iterator.h for ppc64: #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* begin file simdjson/generic/ondemand/json_iterator.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/token_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +/**
    + * Iterates through JSON tokens, keeping track of depth and string buffer.
    + *
    + * @private This is not intended for external use.
    + */
    +class json_iterator {
    +protected:
    +  token_iterator token{};
    +  ondemand::parser *parser{};
    +  /**
    +   * Next free location in the string buffer.
    +   *
    +   * Used by raw_json_string::unescape() to have a place to unescape strings to.
    +   */
    +  uint8_t *_string_buf_loc{};
    +  /**
    +   * JSON error, if there is one.
    +   *
    +   * INCORRECT_TYPE and NO_SUCH_FIELD are *not* stored here, ever.
    +   *
    +   * PERF NOTE: we *hope* this will be elided into control flow, as it is only used (a) in the first
    +   * iteration of the loop, or (b) for the final iteration after a missing comma is found in ++. If
    +   * this is not elided, we should make sure it's at least not using up a register. Failing that,
    +   * we should store it in document so there's only one of them.
    +   */
    +  error_code error{SUCCESS};
    +  /**
    +   * Depth of the current token in the JSON.
    +   *
    +   * - 0 = finished with document
    +   * - 1 = document root value (could be [ or {, not yet known)
    +   * - 2 = , or } inside root array/object
    +   * - 3 = key or value inside root array/object.
    +   */
    +  depth_t _depth{};
    +  /**
    +   * Beginning of the document indexes.
    +   * Normally we have root == parser->implementation->structural_indexes.get()
    +   * but this may differ, especially in streaming mode (where we have several
    +   * documents);
    +   */
    +  token_position _root{};
    +  /**
    +   * Normally, a json_iterator operates over a single document, but in
    +   * some cases, we may have a stream of documents. This attribute is meant
    +   * as meta-data: the json_iterator works the same irrespective of the
    +   * value of this attribute.
    +   */
    +  bool _streaming{false};
    +
    +public:
    +  simdjson_inline json_iterator() noexcept = default;
    +  simdjson_inline json_iterator(json_iterator &&other) noexcept;
    +  simdjson_inline json_iterator &operator=(json_iterator &&other) noexcept;
    +  simdjson_inline explicit json_iterator(const json_iterator &other) noexcept = default;
    +  simdjson_inline json_iterator &operator=(const json_iterator &other) noexcept = default;
    +  /**
    +   * Skips a JSON value, whether it is a scalar, array or object.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code skip_child(depth_t parent_depth) noexcept;
    +
    +  /**
    +   * Tell whether the iterator is still at the start
    +   */
    +  simdjson_inline bool at_root() const noexcept;
    +
    +  /**
    +   * Tell whether we should be expected to run in streaming
    +   * mode (iterating over many documents). It is pure metadata
    +   * that does not affect how the iterator works. It is used by
    +   * start_root_array() and start_root_object().
    +   */
    +  simdjson_inline bool streaming() const noexcept;
    +
    +  /**
    +   * Get the root value iterator
    +   */
    +  simdjson_inline token_position root_position() const noexcept;
    +  /**
    +   * Assert that we are at the document depth (== 1)
    +   */
    +  simdjson_inline void assert_at_document_depth() const noexcept;
    +  /**
    +   * Assert that we are at the root of the document
    +   */
    +  simdjson_inline void assert_at_root() const noexcept;
    +
    +  /**
    +   * Tell whether the iterator is at the EOF mark
    +   */
    +  simdjson_inline bool at_end() const noexcept;
    +
    +  /**
    +   * Tell whether the iterator is live (has not been moved).
    +   */
    +  simdjson_inline bool is_alive() const noexcept;
    +
    +  /**
    +   * Abandon this iterator, setting depth to 0 (as if the document is finished).
    +   */
    +  simdjson_inline void abandon() noexcept;
    +
    +  /**
    +   * Advance the current token without modifying depth.
    +   */
    +  simdjson_inline const uint8_t *return_current_and_advance() noexcept;
    +
    +  /**
    +   * Returns true if there is a single token in the index (i.e., it is
    +   * a JSON with a scalar value such as a single number).
    +   *
    +   * @return whether there is a single token
    +   */
    +  simdjson_inline bool is_single_token() const noexcept;
    +
    +  /**
    +   * Assert that there are at least the given number of tokens left.
    +   *
    +   * Has no effect in release builds.
    +   */
    +  simdjson_inline void assert_more_tokens(uint32_t required_tokens=1) const noexcept;
    +  /**
    +   * Assert that the given position addresses an actual token (is within bounds).
    +   *
    +   * Has no effect in release builds.
    +   */
    +  simdjson_inline void assert_valid_position(token_position position) const noexcept;
    +  /**
    +   * Get the JSON text for a given token (relative).
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = next token, -1 = prev token.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek(int32_t delta=0) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for the current token (or relative).
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = next token, -1 = prev token.
    +   */
    +  simdjson_inline uint32_t peek_length(int32_t delta=0) const noexcept;
    +  /**
    +   * Get a pointer to the current location in the input buffer.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * You may be pointing outside of the input buffer: it is not generally
    +   * safe to dereference this pointer.
    +   */
    +  simdjson_inline const uint8_t *unsafe_pointer() const noexcept;
    +  /**
    +   * Get the JSON text for a given token.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param position The position of the token to retrieve.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek(token_position position) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for the current token (or relative).
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param position The position of the token to retrieve.
    +   */
    +  simdjson_inline uint32_t peek_length(token_position position) const noexcept;
    +  /**
    +   * Get the JSON text for the last token in the document.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek_last() const noexcept;
    +
    +  /**
    +   * Ascend one level.
    +   *
    +   * Validates that the depth - 1 == parent_depth.
    +   *
    +   * @param parent_depth the expected parent depth.
    +   */
    +  simdjson_inline void ascend_to(depth_t parent_depth) noexcept;
    +
    +  /**
    +   * Descend one level.
    +   *
    +   * Validates that the new depth == child_depth.
    +   *
    +   * @param child_depth the expected child depth.
    +   */
    +  simdjson_inline void descend_to(depth_t child_depth) noexcept;
    +  simdjson_inline void descend_to(depth_t child_depth, int32_t delta) noexcept;
    +
    +  /**
    +   * Get current depth.
    +   */
    +  simdjson_inline depth_t depth() const noexcept;
    +
    +  /**
    +   * Get current (writeable) location in the string buffer.
    +   */
    +  simdjson_inline uint8_t *&string_buf_loc() noexcept;
    +
    +  /**
    +   * Report an unrecoverable error, preventing further iteration.
    +   *
    +   * @param error The error to report. Must not be SUCCESS, UNINITIALIZED, INCORRECT_TYPE, or NO_SUCH_FIELD.
    +   * @param message An error message to report with the error.
    +   */
    +  simdjson_inline error_code report_error(error_code error, const char *message) noexcept;
    +
    +  /**
    +   * Log error, but don't stop iteration.
    +   * @param error The error to report. Must be INCORRECT_TYPE, or NO_SUCH_FIELD.
    +   * @param message An error message to report with the error.
    +   */
    +  simdjson_inline error_code optional_error(error_code error, const char *message) noexcept;
    +
    +  /**
    +   * Take an input in json containing max_len characters and attempt to copy it over to tmpbuf, a buffer with
    +   * N bytes of capacity. It will return false if N is too small (smaller than max_len) of if it is zero.
    +   * The buffer (tmpbuf) is padded with space characters.
    +   */
    +  simdjson_warn_unused simdjson_inline bool copy_to_buffer(const uint8_t *json, uint32_t max_len, uint8_t *tmpbuf, size_t N) noexcept;
    +
    +  simdjson_inline token_position position() const noexcept;
    +  /**
    +   * Write the raw_json_string to the string buffer and return a string_view.
    +   * Each raw_json_string should be unescaped once, or else the string buffer might
    +   * overflow.
    +   */
    +  simdjson_inline simdjson_result unescape(raw_json_string in, bool allow_replacement) noexcept;
    +  simdjson_inline simdjson_result unescape_wobbly(raw_json_string in) noexcept;
    +
    +  simdjson_inline void reenter_child(token_position position, depth_t child_depth) noexcept;
    +
    +  simdjson_inline error_code consume_character(char c) noexcept;
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  simdjson_inline token_position start_position(depth_t depth) const noexcept;
    +  simdjson_inline void set_start_position(depth_t depth, token_position position) noexcept;
    +#endif
    +
    +  /* Useful for debugging and logging purposes. */
    +  inline std::string to_string() const noexcept;
    +
    +  /**
    +   * Returns the current location in the document if in bounds.
    +   */
    +  inline simdjson_result current_location() const noexcept;
    +
    +  /**
    +   * Updates this json iterator so that it is back at the beginning of the document,
    +   * as if it had just been created.
    +   */
    +  inline void rewind() noexcept;
    +  /**
    +   * This checks whether the {,},[,] are balanced so that the document
    +   * ends with proper zero depth. This requires scanning the whole document
    +   * and it may be expensive. It is expected that it will be rarely called.
    +   * It does not attempt to match { with } and [ with ].
    +   */
    +  inline bool balanced() const noexcept;
    +protected:
    +  simdjson_inline json_iterator(const uint8_t *buf, ondemand::parser *parser) noexcept;
    +  /// The last token before the end
    +  simdjson_inline token_position last_position() const noexcept;
    +  /// The token *at* the end. This points at gibberish and should only be used for comparison.
    +  simdjson_inline token_position end_position() const noexcept;
    +  /// The end of the buffer.
    +  simdjson_inline token_position end() const noexcept;
    +
    +  friend class document;
    +  friend class document_stream;
    +  friend class object;
    +  friend class array;
    +  friend class value;
    +  friend class raw_json_string;
    +  friend class parser;
    +  friend class value_iterator;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, logger::log_level level, Args&&... args) noexcept;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, logger::log_level level, Args&&... args) noexcept;
    +}; // json_iterator
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public ppc64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(ppc64::ondemand::json_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H
    +/* end file simdjson/generic/ondemand/json_iterator.h for ppc64 */
    +/* including simdjson/generic/ondemand/json_type.h for ppc64: #include "simdjson/generic/ondemand/json_type.h" */
    +/* begin file simdjson/generic/ondemand/json_type.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/numberparsing.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +/**
    + * The type of a JSON value.
    + */
    +enum class json_type {
    +    // Start at 1 to catch uninitialized / default values more easily
    +    array=1, ///< A JSON array   ( [ 1, 2, 3 ... ] )
    +    object,  ///< A JSON object  ( { "a": 1, "b" 2, ... } )
    +    number,  ///< A JSON number  ( 1 or -2.3 or 4.5e6 ...)
    +    string,  ///< A JSON string  ( "a" or "hello world\n" ...)
    +    boolean, ///< A JSON boolean (true or false)
    +    null     ///< A JSON null    (null)
    +};
    +
    +/**
    + * A type representing a JSON number.
    + * The design of the struct is deliberately straight-forward. All
    + * functions return standard values with no error check.
    + */
    +struct number {
    +
    +  /**
    +   * return the automatically determined type of
    +   * the number: number_type::floating_point_number,
    +   * number_type::signed_integer or number_type::unsigned_integer.
    +   *
    +   *    enum class number_type {
    +   *        floating_point_number=1, /// a binary64 number
    +   *        signed_integer,          /// a signed integer that fits in a 64-bit word using two's complement
    +   *        unsigned_integer         /// a positive integer larger or equal to 1<<63
    +   *    };
    +   */
    +  simdjson_inline ondemand::number_type get_number_type() const noexcept;
    +  /**
    +   * return true if the automatically determined type of
    +   * the number is number_type::unsigned_integer.
    +   */
    +  simdjson_inline bool is_uint64() const noexcept;
    +  /**
    +   * return the value as a uint64_t, only valid if is_uint64() is true.
    +   */
    +  simdjson_inline uint64_t get_uint64() const noexcept;
    +  simdjson_inline operator uint64_t() const noexcept;
    +
    +  /**
    +   * return true if the automatically determined type of
    +   * the number is number_type::signed_integer.
    +   */
    +  simdjson_inline bool is_int64() const noexcept;
    +  /**
    +   * return the value as a int64_t, only valid if is_int64() is true.
    +   */
    +  simdjson_inline int64_t get_int64() const noexcept;
    +  simdjson_inline operator int64_t() const noexcept;
    +
    +
    +  /**
    +   * return true if the automatically determined type of
    +   * the number is number_type::floating_point_number.
    +   */
    +  simdjson_inline bool is_double() const noexcept;
    +  /**
    +   * return the value as a double, only valid if is_double() is true.
    +   */
    +  simdjson_inline double get_double() const noexcept;
    +  simdjson_inline operator double() const noexcept;
    +
    +  /**
    +   * Convert the number to a double. Though it always succeed, the conversion
    +   * may be lossy if the number cannot be represented exactly.
    +   */
    +  simdjson_inline double as_double() const noexcept;
    +
    +
    +protected:
    +  /**
    +   * The next block of declaration is designed so that we can call the number parsing
    +   * functions on a number type. They are protected and should never be used outside
    +   * of the core simdjson library.
    +   */
    +  friend class value_iterator;
    +  template
    +  friend error_code numberparsing::slow_float_parsing(simdjson_unused const uint8_t * src, W writer);
    +  template
    +  friend error_code numberparsing::write_float(const uint8_t *const src, bool negative, uint64_t i, const uint8_t * start_digits, size_t digit_count, int64_t exponent, W &writer);
    +  template
    +  friend error_code numberparsing::parse_number(const uint8_t *const src, W &writer);
    +  /** Store a signed 64-bit value to the number. */
    +  simdjson_inline void append_s64(int64_t value) noexcept;
    +  /** Store an unsigned 64-bit value to the number. */
    +  simdjson_inline void append_u64(uint64_t value) noexcept;
    +  /** Store a double value to the number. */
    +  simdjson_inline void append_double(double value) noexcept;
    +  /** Specifies that the value is a double, but leave it undefined. */
    +  simdjson_inline void skip_double() noexcept;
    +  /**
    +   * End of friend declarations.
    +   */
    +
    +  /**
    +   * Our attributes are a union type (size = 64 bits)
    +   * followed by a type indicator.
    +   */
    +  union {
    +    double floating_point_number;
    +    int64_t signed_integer;
    +    uint64_t unsigned_integer;
    +  } payload{0};
    +  number_type type{number_type::signed_integer};
    +};
    +
    +/**
    + * Write the JSON type to the output stream
    + *
    + * @param out The output stream.
    + * @param type The json_type.
    + */
    +inline std::ostream& operator<<(std::ostream& out, json_type type) noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +/**
    + * Send JSON type to an output stream.
    + *
    + * @param out The output stream.
    + * @param type The json_type.
    + * @throw simdjson_error if the result being printed has an error. If there is an error with the
    + *        underlying output stream, that error will be propagated (simdjson_error will not be
    + *        thrown).
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false);
    +#endif
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public ppc64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(ppc64::ondemand::json_type &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline ~simdjson_result() noexcept = default; ///< @private
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H
    +/* end file simdjson/generic/ondemand/json_type.h for ppc64 */
    +/* including simdjson/generic/ondemand/raw_json_string.h for ppc64: #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* begin file simdjson/generic/ondemand/raw_json_string.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +/**
    + * A string escaped per JSON rules, terminated with quote ("). They are used to represent
    + * unescaped keys inside JSON documents.
    + *
    + * (In other words, a pointer to the beginning of a string, just after the start quote, inside a
    + * JSON file.)
    + *
    + * This class is deliberately simplistic and has little functionality. You can
    + * compare a raw_json_string instance with an unescaped C string, but
    + * that is nearly all you can do.
    + *
    + * The raw_json_string is unescaped. If you wish to write an unescaped version of it to your own
    + * buffer, you may do so using the parser.unescape(string, buff) method, using an ondemand::parser
    + * instance. Doing so requires you to have a sufficiently large buffer.
    + *
    + * The raw_json_string instances originate typically from field instance which in turn represent
    + * key-value pairs from object instances. From a field instance, you get the raw_json_string
    + * instance by calling key(). You can, if you want a more usable string_view instance, call
    + * the unescaped_key() method on the field instance. You may also create a raw_json_string from
    + * any other string value, with the value.get_raw_json_string() method. Again, you can get
    + * a more usable string_view instance by calling get_string().
    + *
    + */
    +class raw_json_string {
    +public:
    +  /**
    +   * Create a new invalid raw_json_string.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline raw_json_string() noexcept = default;
    +
    +  /**
    +   * Create a new invalid raw_json_string pointed at the given location in the JSON.
    +   *
    +   * The given location must be just *after* the beginning quote (") in the JSON file.
    +   *
    +   * It *must* be terminated by a ", and be a valid JSON string.
    +   */
    +  simdjson_inline raw_json_string(const uint8_t * _buf) noexcept;
    +  /**
    +   * Get the raw pointer to the beginning of the string in the JSON (just after the ").
    +   *
    +   * It is possible for this function to return a null pointer if the instance
    +   * has outlived its existence.
    +   */
    +  simdjson_inline const char * raw() const noexcept;
    +
    +  /**
    +   * This compares the current instance to the std::string_view target: returns true if
    +   * they are byte-by-byte equal (no escaping is done) on target.size() characters,
    +   * and if the raw_json_string instance has a quote character at byte index target.size().
    +   * We never read more than length + 1 bytes in the raw_json_string instance.
    +   * If length is smaller than target.size(), this will return false.
    +   *
    +   * The std::string_view instance may contain any characters. However, the caller
    +   * is responsible for setting length so that length bytes may be read in the
    +   * raw_json_string.
    +   *
    +   * Performance: the comparison may be done using memcmp which may be efficient
    +   * for long strings.
    +   */
    +  simdjson_inline bool unsafe_is_equal(size_t length, std::string_view target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the std::string_view target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   * The std::string_view instance should not contain unescaped quote characters:
    +   * the caller is responsible for this check. See is_free_from_unescaped_quote.
    +   *
    +   * Performance: the comparison is done byte-by-byte which might be inefficient for
    +   * long strings.
    +   *
    +   * If target is a compile-time constant, and your compiler likes you,
    +   * you should be able to do the following without performance penalty...
    +   *
    +   *   static_assert(raw_json_string::is_free_from_unescaped_quote(target), "");
    +   *   s.unsafe_is_equal(target);
    +   */
    +  simdjson_inline bool unsafe_is_equal(std::string_view target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the C string target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   * The provided C string should not contain an unescaped quote character:
    +   * the caller is responsible for this check. See is_free_from_unescaped_quote.
    +   *
    +   * If target is a compile-time constant, and your compiler likes you,
    +   * you should be able to do the following without performance penalty...
    +   *
    +   *   static_assert(raw_json_string::is_free_from_unescaped_quote(target), "");
    +   *   s.unsafe_is_equal(target);
    +   */
    +  simdjson_inline bool unsafe_is_equal(const char* target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the std::string_view target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   */
    +  simdjson_inline bool is_equal(std::string_view target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the C string target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   */
    +  simdjson_inline bool is_equal(const char* target) const noexcept;
    +
    +  /**
    +   * Returns true if target is free from unescaped quote. If target is known at
    +   * compile-time, we might expect the computation to happen at compile time with
    +   * many compilers (not all!).
    +   */
    +  static simdjson_inline bool is_free_from_unescaped_quote(std::string_view target) noexcept;
    +  static simdjson_inline bool is_free_from_unescaped_quote(const char* target) noexcept;
    +
    +private:
    +
    +
    +  /**
    +   * This will set the inner pointer to zero, effectively making
    +   * this instance unusable.
    +   */
    +  simdjson_inline void consume() noexcept { buf = nullptr; }
    +
    +  /**
    +   * Checks whether the inner pointer is non-null and thus usable.
    +   */
    +  simdjson_inline simdjson_warn_unused bool alive() const noexcept { return buf != nullptr; }
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc.
    +   * The result will be a valid UTF-8.
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid until the next parse() call on the parser.
    +   *
    +   * @param iter A json_iterator, which contains a buffer where the string will be written.
    +   * @param allow_replacement Whether we allow replacement of invalid surrogate pairs.
    +   */
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape(json_iterator &iter, bool allow_replacement) const noexcept;
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc.
    +   * The result may not be a valid UTF-8. https://simonsapin.github.io/wtf-8/
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid until the next parse() call on the parser.
    +   *
    +   * @param iter A json_iterator, which contains a buffer where the string will be written.
    +   */
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape_wobbly(json_iterator &iter) const noexcept;
    +  const uint8_t * buf{};
    +  friend class object;
    +  friend class field;
    +  friend class parser;
    +  friend struct simdjson_result;
    +};
    +
    +simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &, const raw_json_string &) noexcept;
    +
    +/**
    + * Comparisons between raw_json_string and std::string_view instances are potentially unsafe: the user is responsible
    + * for providing a string with no unescaped quote. Note that unescaped quotes cannot be present in valid JSON strings.
    + */
    +simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept;
    +simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept;
    +simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept;
    +simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept;
    +
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public ppc64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(ppc64::ondemand::raw_json_string &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline ~simdjson_result() noexcept = default; ///< @private
    +
    +  simdjson_inline simdjson_result raw() const noexcept;
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape(ppc64::ondemand::json_iterator &iter, bool allow_replacement) const noexcept;
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape_wobbly(ppc64::ondemand::json_iterator &iter) const noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H
    +/* end file simdjson/generic/ondemand/raw_json_string.h for ppc64 */
    +/* including simdjson/generic/ondemand/parser.h for ppc64: #include "simdjson/generic/ondemand/parser.h" */
    +/* begin file simdjson/generic/ondemand/parser.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_PARSER_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +/**
    + * The default batch size for document_stream instances for this On Demand kernel.
    + * Note that different On Demand kernel may use a different DEFAULT_BATCH_SIZE value
    + * in the future.
    + */
    +static constexpr size_t DEFAULT_BATCH_SIZE = 1000000;
    +/**
    + * Some adversary might try to set the batch size to 0 or 1, which might cause problems.
    + * We set a minimum of 32B since anything else is highly likely to be an error. In practice,
    + * most users will want a much larger batch size.
    + *
    + * All non-negative MINIMAL_BATCH_SIZE values should be 'safe' except that, obviously, no JSON
    + * document can ever span 0 or 1 byte and that very large values would create memory allocation issues.
    + */
    +static constexpr size_t MINIMAL_BATCH_SIZE = 32;
    +
    +/**
    + * A JSON fragment iterator.
    + *
    + * This holds the actual iterator as well as the buffer for writing strings.
    + */
    +class parser {
    +public:
    +  /**
    +   * Create a JSON parser.
    +   *
    +   * The new parser will have zero capacity.
    +   */
    +  inline explicit parser(size_t max_capacity = SIMDJSON_MAXSIZE_BYTES) noexcept;
    +
    +  inline parser(parser &&other) noexcept = default;
    +  simdjson_inline parser(const parser &other) = delete;
    +  simdjson_inline parser &operator=(const parser &other) = delete;
    +  simdjson_inline parser &operator=(parser &&other) noexcept = default;
    +
    +  /** Deallocate the JSON parser. */
    +  inline ~parser() noexcept = default;
    +
    +  /**
    +   * Start iterating an on-demand JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   document doc = parser.iterate(json);
    +   *
    +   * It is expected that the content is a valid UTF-8 file, containing a valid JSON document.
    +   * Otherwise the iterate method may return an error. In particular, the whole input should be
    +   * valid: we do not attempt to tolerate incorrect content either before or after a JSON
    +   * document. If there is a UTF-8 BOM, the parser skips it.
    +   *
    +   * ### IMPORTANT: Validate what you use
    +   *
    +   * Calling iterate on an invalid JSON document may not immediately trigger an error. The call to
    +   * iterate does not parse and validate the whole document.
    +   *
    +   * ### IMPORTANT: Buffer Lifetime
    +   *
    +   * Because parsing is done while you iterate, you *must* keep the JSON buffer around at least as
    +   * long as the document iteration.
    +   *
    +   * ### IMPORTANT: Document Lifetime
    +   *
    +   * Only one iteration at a time can happen per parser, and the parser *must* be kept alive during
    +   * iteration to ensure intermediate buffers can be accessed. Any document must be destroyed before
    +   * you call parse() again or destroy the parser.
    +   *
    +   * ### REQUIRED: Buffer Padding
    +   *
    +   * The buffer must have at least SIMDJSON_PADDING extra allocated bytes. It does not matter what
    +   * those bytes are initialized to, as long as they are allocated. These bytes will be read: if you
    +   * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the
    +   * SIMDJSON_PADDING bytes to avoid runtime warnings.
    +   *
    +   * @param json The JSON to parse.
    +   * @param len The length of the JSON.
    +   * @param capacity The number of bytes allocated in the JSON (must be at least len+SIMDJSON_PADDING).
    +   *
    +   * @return The document, or an error:
    +   *         - INSUFFICIENT_PADDING if the input has less than SIMDJSON_PADDING extra bytes.
    +   *         - MEMALLOC if realloc_if_needed the parser does not have enough capacity, and memory
    +   *           allocation fails.
    +   *         - EMPTY if the document is all whitespace.
    +   *         - UTF8_ERROR if the document is not valid UTF-8.
    +   *         - UNESCAPED_CHARS if a string contains control characters that must be escaped
    +   *         - UNCLOSED_STRING if there is an unclosed string in the document.
    +   */
    +  simdjson_warn_unused simdjson_result iterate(padded_string_view json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const char *json, size_t len, size_t capacity) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const uint8_t *json, size_t len, size_t capacity) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(std::string_view json, size_t capacity) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const std::string &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(std::string &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(padded_string &&json) & noexcept = delete;
    +
    +  /**
    +   * @private
    +   *
    +   * Start iterating an on-demand JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   json_iterator doc = parser.iterate(json);
    +   *
    +   * ### IMPORTANT: Buffer Lifetime
    +   *
    +   * Because parsing is done while you iterate, you *must* keep the JSON buffer around at least as
    +   * long as the document iteration.
    +   *
    +   * ### IMPORTANT: Document Lifetime
    +   *
    +   * Only one iteration at a time can happen per parser, and the parser *must* be kept alive during
    +   * iteration to ensure intermediate buffers can be accessed. Any document must be destroyed before
    +   * you call parse() again or destroy the parser.
    +   *
    +   * The ondemand::document instance holds the iterator. The document must remain in scope
    +   * while you are accessing instances of ondemand::value, ondemand::object, ondemand::array.
    +   *
    +   * ### REQUIRED: Buffer Padding
    +   *
    +   * The buffer must have at least SIMDJSON_PADDING extra allocated bytes. It does not matter what
    +   * those bytes are initialized to, as long as they are allocated. These bytes will be read: if you
    +   * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the
    +   * SIMDJSON_PADDING bytes to avoid runtime warnings.
    +   *
    +   * @param json The JSON to parse.
    +   *
    +   * @return The iterator, or an error:
    +   *         - INSUFFICIENT_PADDING if the input has less than SIMDJSON_PADDING extra bytes.
    +   *         - MEMALLOC if realloc_if_needed the parser does not have enough capacity, and memory
    +   *           allocation fails.
    +   *         - EMPTY if the document is all whitespace.
    +   *         - UTF8_ERROR if the document is not valid UTF-8.
    +   *         - UNESCAPED_CHARS if a string contains control characters that must be escaped
    +   *         - UNCLOSED_STRING if there is an unclosed string in the document.
    +   */
    +  simdjson_warn_unused simdjson_result iterate_raw(padded_string_view json) & noexcept;
    +
    +
    +  /**
    +   * Parse a buffer containing many JSON documents.
    +   *
    +   *   auto json = R"({ "foo": 1 } { "foo": 2 } { "foo": 3 } )"_padded;
    +   *   ondemand::parser parser;
    +   *   ondemand::document_stream docs = parser.iterate_many(json);
    +   *   for (auto & doc : docs) {
    +   *     std::cout << doc["foo"] << std::endl;
    +   *   }
    +   *   // Prints 1 2 3
    +   *
    +   * No copy of the input buffer is made.
    +   *
    +   * The function is lazy: it may be that no more than one JSON document at a time is parsed.
    +   *
    +   * The caller is responsabile to ensure that the input string data remains unchanged and is
    +   * not deleted during the loop.
    +   *
    +   * ### Format
    +   *
    +   * The buffer must contain a series of one or more JSON documents, concatenated into a single
    +   * buffer, separated by ASCII whitespace. It effectively parses until it has a fully valid document,
    +   * then starts parsing the next document at that point. (It does this with more parallelism and
    +   * lookahead than you might think, though.)
    +   *
    +   * documents that consist of an object or array may omit the whitespace between them, concatenating
    +   * with no separator. Documents that consist of a single primitive (i.e. documents that are not
    +   * arrays or objects) MUST be separated with ASCII whitespace.
    +   *
    +   * The characters inside a JSON document, and between JSON documents, must be valid Unicode (UTF-8).
    +   * If there is a UTF-8 BOM, the parser skips it.
    +   *
    +   * The documents must not exceed batch_size bytes (by default 1MB) or they will fail to parse.
    +   * Setting batch_size to excessively large or excessively small values may impact negatively the
    +   * performance.
    +   *
    +   * ### REQUIRED: Buffer Padding
    +   *
    +   * The buffer must have at least SIMDJSON_PADDING extra allocated bytes. It does not matter what
    +   * those bytes are initialized to, as long as they are allocated. These bytes will be read: if you
    +   * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the
    +   * SIMDJSON_PADDING bytes to avoid runtime warnings.
    +   *
    +   * ### Threads
    +   *
    +   * When compiled with SIMDJSON_THREADS_ENABLED, this method will use a single thread under the
    +   * hood to do some lookahead.
    +   *
    +   * ### Parser Capacity
    +   *
    +   * If the parser's current capacity is less than batch_size, it will allocate enough capacity
    +   * to handle it (up to max_capacity).
    +   *
    +   * @param buf The concatenated JSON to parse.
    +   * @param len The length of the concatenated JSON.
    +   * @param batch_size The batch size to use. MUST be larger than the largest document. The sweet
    +   *                   spot is cache-related: small enough to fit in cache, yet big enough to
    +   *                   parse as many documents as possible in one tight loop.
    +   *                   Defaults to 10MB, which has been a reasonable sweet spot in our tests.
    +   * @param allow_comma_separated (defaults on false) This allows a mode where the documents are
    +   *                   separated by commas instead of whitespace. It comes with a performance
    +   *                   penalty because the entire document is indexed at once (and the document must be
    +   *                   less than 4 GB), and there is no multithreading. In this mode, the batch_size parameter
    +   *                   is effectively ignored, as it is set to at least the document size.
    +   * @return The stream, or an error. An empty input will yield 0 documents rather than an EMPTY error. Errors:
    +   *         - MEMALLOC if the parser does not have enough capacity and memory allocation fails
    +   *         - CAPACITY if the parser does not have enough capacity and batch_size > max_capacity.
    +   *         - other json errors if parsing fails. You should not rely on these errors to always the same for the
    +   *           same document: they may vary under runtime dispatch (so they may vary depending on your system and hardware).
    +   */
    +  inline simdjson_result iterate_many(const uint8_t *buf, size_t len, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */
    +  inline simdjson_result iterate_many(const char *buf, size_t len, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */
    +  inline simdjson_result iterate_many(const std::string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  inline simdjson_result iterate_many(const std::string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe
    +  /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */
    +  inline simdjson_result iterate_many(const padded_string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  inline simdjson_result iterate_many(const padded_string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe
    +
    +  /** @private We do not want to allow implicit conversion from C string to std::string. */
    +  simdjson_result iterate_many(const char *buf, size_t batch_size = DEFAULT_BATCH_SIZE) noexcept = delete;
    +
    +  /** The capacity of this parser (the largest document it can process). */
    +  simdjson_inline size_t capacity() const noexcept;
    +  /** The maximum capacity of this parser (the largest document it is allowed to process). */
    +  simdjson_inline size_t max_capacity() const noexcept;
    +  simdjson_inline void set_max_capacity(size_t max_capacity) noexcept;
    +  /**
    +   * The maximum depth of this parser (the most deeply nested objects and arrays it can process).
    +   * This parameter is only relevant when the macro SIMDJSON_DEVELOPMENT_CHECKS is set to true.
    +   * The document's instance current_depth() method should be used to monitor the parsing
    +   * depth and limit it if desired.
    +   */
    +  simdjson_inline size_t max_depth() const noexcept;
    +
    +  /**
    +   * Ensure this parser has enough memory to process JSON documents up to `capacity` bytes in length
    +   * and `max_depth` depth.
    +   *
    +   * The max_depth parameter is only relevant when the macro SIMDJSON_DEVELOPMENT_CHECKS is set to true.
    +   * The document's instance current_depth() method should be used to monitor the parsing
    +   * depth and limit it if desired.
    +   *
    +   * @param capacity The new capacity.
    +   * @param max_depth The new max_depth. Defaults to DEFAULT_MAX_DEPTH.
    +   * @return The error, if there is one.
    +   */
    +  simdjson_warn_unused error_code allocate(size_t capacity, size_t max_depth=DEFAULT_MAX_DEPTH) noexcept;
    +
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  /**
    +   * The parser instance can use threads when they are available to speed up some
    +   * operations. It is enabled by default. Changing this attribute will change the
    +   * behavior of the parser for future operations.
    +   */
    +  bool threaded{true};
    +  #endif
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc. to a user-provided buffer.
    +   * The result must be valid UTF-8.
    +   * The provided pointer is advanced to the end of the string by reference, and a string_view instance
    +   * is returned. You can ensure that your buffer is large enough by allocating a block of memory at least
    +   * as large as the input JSON plus SIMDJSON_PADDING and then unescape all strings to this one buffer.
    +   *
    +   * This unescape function is a low-level function. If you want a more user-friendly approach, you should
    +   * avoid raw_json_string instances (e.g., by calling unescaped_key() instead of key() or get_string()
    +   * instead of get_raw_json_string()).
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid as long as the bytes in dst.
    +   *
    +   * @param raw_json_string input
    +   * @param dst A pointer to a buffer at least large enough to write this string as well as
    +   *            an additional SIMDJSON_PADDING bytes.
    +   * @param allow_replacement Whether we allow a replacement if the input string contains unmatched surrogate pairs.
    +   * @return A string_view pointing at the unescaped string in dst
    +   * @error STRING_ERROR if escapes are incorrect.
    +   */
    +  simdjson_inline simdjson_result unescape(raw_json_string in, uint8_t *&dst, bool allow_replacement = false) const noexcept;
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc. to a user-provided buffer.
    +   * The result may not be valid UTF-8. See https://simonsapin.github.io/wtf-8/
    +   * The provided pointer is advanced to the end of the string by reference, and a string_view instance
    +   * is returned. You can ensure that your buffer is large enough by allocating a block of memory at least
    +   * as large as the input JSON plus SIMDJSON_PADDING and then unescape all strings to this one buffer.
    +   *
    +   * This unescape function is a low-level function. If you want a more user-friendly approach, you should
    +   * avoid raw_json_string instances (e.g., by calling unescaped_key() instead of key() or get_string()
    +   * instead of get_raw_json_string()).
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid as long as the bytes in dst.
    +   *
    +   * @param raw_json_string input
    +   * @param dst A pointer to a buffer at least large enough to write this string as well as
    +   *            an additional SIMDJSON_PADDING bytes.
    +   * @return A string_view pointing at the unescaped string in dst
    +   * @error STRING_ERROR if escapes are incorrect.
    +   */
    +  simdjson_inline simdjson_result unescape_wobbly(raw_json_string in, uint8_t *&dst) const noexcept;
    +
    +private:
    +  /** @private [for benchmarking access] The implementation to use */
    +  std::unique_ptr implementation{};
    +  size_t _capacity{0};
    +  size_t _max_capacity;
    +  size_t _max_depth{DEFAULT_MAX_DEPTH};
    +  std::unique_ptr string_buf{};
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  std::unique_ptr start_positions{};
    +#endif
    +
    +  friend class json_iterator;
    +  friend class document_stream;
    +};
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public ppc64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(ppc64::ondemand::parser &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_H
    +/* end file simdjson/generic/ondemand/parser.h for ppc64 */
    +
    +// All other declarations
    +/* including simdjson/generic/ondemand/array.h for ppc64: #include "simdjson/generic/ondemand/array.h" */
    +/* begin file simdjson/generic/ondemand/array.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +/**
    + * A forward-only JSON array.
    + */
    +class array {
    +public:
    +  /**
    +   * Create a new invalid array.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline array() noexcept = default;
    +
    +  /**
    +   * Begin array iteration.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result begin() noexcept;
    +  /**
    +   * Sentinel representing the end of the array.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result end() noexcept;
    +  /**
    +   * This method scans the array and counts the number of elements.
    +   * The count_elements method should always be called before you have begun
    +   * iterating through the array: it is expected that you are pointing at
    +   * the beginning of the array.
    +   * The runtime complexity is linear in the size of the array. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an array is empty, it is more performant to use
    +   * the is_empty() method.
    +   */
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  /**
    +   * This method scans the beginning of the array and checks whether the
    +   * array is empty.
    +   * The runtime complexity is constant time. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   */
    +  simdjson_inline simdjson_result is_empty() & noexcept;
    +  /**
    +   * Reset the iterator so that we are pointing back at the
    +   * beginning of the array. You should still consume values only once even if you
    +   * can iterate through the array more than once. If you unescape a string
    +   * within the array more than once, you have unsafe code. Note that rewinding
    +   * an array means that you may need to reparse it anew: it is not a free
    +   * operation.
    +   *
    +   * @returns true if the array contains some elements (not empty)
    +   */
    +  inline simdjson_result reset() & noexcept;
    +  /**
    +   * Get the value associated with the given JSON pointer.  We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard, interpreting the current node
    +   * as the root of its own JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"([ { "foo": { "a": [ 10, 20, 30 ] }} ])"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/0/foo/a/1") == 20
    +   *
    +   * Note that at_pointer() called on the document automatically calls the document's rewind
    +   * method between each call. It invalidates all previously accessed arrays, objects and values
    +   * that have not been consumed. Yet it is not the case when calling at_pointer on an array
    +   * instance: there is no rewind and no invalidation.
    +   *
    +   * You may only call at_pointer on an array after it has been created, but before it has
    +   * been first accessed. When calling at_pointer on an array, the pointer is advanced to
    +   * the location indicated by the JSON pointer (in case of success). It is no longer possible
    +   * to call at_pointer on the same array.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching.
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   */
    +  inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  /**
    +   * Consumes the array and returns a string_view instance corresponding to the
    +   * array as represented in JSON. It points inside the original document.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +  /**
    +   * Get the value at the given index. This function has linear-time complexity.
    +   * This function should only be called once on an array instance since the array iterator is not reset between each call.
    +   *
    +   * @return The value at the given index, or:
    +   *         - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
    +   */
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +protected:
    +  /**
    +   * Go to the end of the array, no matter where you are right now.
    +   */
    +  simdjson_inline error_code consume() noexcept;
    +
    +  /**
    +   * Begin array iteration.
    +   *
    +   * @param iter The iterator. Must be where the initial [ is expected. Will be *moved* into the
    +   *        resulting array.
    +   * @error INCORRECT_TYPE if the iterator is not at [.
    +   */
    +  static simdjson_inline simdjson_result start(value_iterator &iter) noexcept;
    +  /**
    +   * Begin array iteration from the root.
    +   *
    +   * @param iter The iterator. Must be where the initial [ is expected. Will be *moved* into the
    +   *        resulting array.
    +   * @error INCORRECT_TYPE if the iterator is not at [.
    +   * @error TAPE_ERROR if there is no closing ] at the end of the document.
    +   */
    +  static simdjson_inline simdjson_result start_root(value_iterator &iter) noexcept;
    +  /**
    +   * Begin array iteration.
    +   *
    +   * This version of the method should be called after the initial [ has been verified, and is
    +   * intended for use by switch statements that check the type of a value.
    +   *
    +   * @param iter The iterator. Must be after the initial [. Will be *moved* into the resulting array.
    +   */
    +  static simdjson_inline simdjson_result started(value_iterator &iter) noexcept;
    +
    +  /**
    +   * Create an array at the given Internal array creation. Call array::start() or array::started() instead of this.
    +   *
    +   * @param iter The iterator. Must either be at the start of the first element with iter.is_alive()
    +   *        == true, or past the [] with is_alive() == false if the array is empty. Will be *moved*
    +   *        into the resulting array.
    +   */
    +  simdjson_inline array(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Iterator marking current position.
    +   *
    +   * iter.is_alive() == false indicates iteration is complete.
    +   */
    +  value_iterator iter{};
    +
    +  friend class value;
    +  friend class document;
    +  friend struct simdjson_result;
    +  friend struct simdjson_result;
    +  friend class array_iterator;
    +};
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public ppc64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(ppc64::ondemand::array &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result begin() noexcept;
    +  simdjson_inline simdjson_result end() noexcept;
    +  inline simdjson_result count_elements() & noexcept;
    +  inline simdjson_result is_empty() & noexcept;
    +  inline simdjson_result reset() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_H
    +/* end file simdjson/generic/ondemand/array.h for ppc64 */
    +/* including simdjson/generic/ondemand/array_iterator.h for ppc64: #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* begin file simdjson/generic/ondemand/array_iterator.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +/**
    + * A forward-only JSON array.
    + *
    + * This is an input_iterator, meaning:
    + * - It is forward-only
    + * - * must be called exactly once per element.
    + * - ++ must be called exactly once in between each * (*, ++, *, ++, * ...)
    + */
    +class array_iterator {
    +public:
    +  /** Create a new, invalid array iterator. */
    +  simdjson_inline array_iterator() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  /**
    +   * Get the current element.
    +   *
    +   * Part of the std::iterator interface.
    +   */
    +  simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  /**
    +   * Check if we are at the end of the JSON.
    +   *
    +   * Part of the std::iterator interface.
    +   *
    +   * @return true if there are no more elements in the JSON array.
    +   */
    +  simdjson_inline bool operator==(const array_iterator &) const noexcept;
    +  /**
    +   * Check if there are more elements in the JSON array.
    +   *
    +   * Part of the std::iterator interface.
    +   *
    +   * @return true if there are more elements in the JSON array.
    +   */
    +  simdjson_inline bool operator!=(const array_iterator &) const noexcept;
    +  /**
    +   * Move to the next element.
    +   *
    +   * Part of the std::iterator interface.
    +   */
    +  simdjson_inline array_iterator &operator++() noexcept;
    +
    +private:
    +  value_iterator iter{};
    +
    +  simdjson_inline array_iterator(const value_iterator &iter) noexcept;
    +
    +  friend class array;
    +  friend class value;
    +  friend struct simdjson_result;
    +};
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public ppc64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(ppc64::ondemand::array_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  simdjson_inline bool operator==(const simdjson_result &) const noexcept;
    +  simdjson_inline bool operator!=(const simdjson_result &) const noexcept;
    +  simdjson_inline simdjson_result &operator++() noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H
    +/* end file simdjson/generic/ondemand/array_iterator.h for ppc64 */
    +/* including simdjson/generic/ondemand/document.h for ppc64: #include "simdjson/generic/ondemand/document.h" */
    +/* begin file simdjson/generic/ondemand/document.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +/**
    + * A JSON document. It holds a json_iterator instance.
    + *
    + * Used by tokens to get text, and string buffer location.
    + *
    + * You must keep the document around during iteration.
    + */
    +class document {
    +public:
    +  /**
    +   * Create a new invalid document.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline document() noexcept = default;
    +  simdjson_inline document(const document &other) noexcept = delete; // pass your documents by reference, not by copy
    +  simdjson_inline document(document &&other) noexcept = default;
    +  simdjson_inline document &operator=(const document &other) noexcept = delete;
    +  simdjson_inline document &operator=(document &&other) noexcept = default;
    +
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @returns INCORRECT_TYPE If the JSON value is not an array.
    +   */
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   */
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  /**
    +   * Cast this JSON value (inside string) to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  /**
    +   * Cast this JSON value (inside string) to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a double.
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Important: Calling get_string() twice on the same document is an error.
    +   *
    +   * @param Whether to allow a replacement character for unmatched surrogate pairs.
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  /**
    +   * Attempts to fill the provided std::string reference with the parsed value of the current string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Important: a value should be consumed once. Calling get_string() twice on the same value
    +   * is an error.
    +   *
    +   * Performance: This method may be slower than get_string() or get_string(bool) because it may need to allocate memory.
    +   * We recommend you avoid allocating an std::string unless you need to.
    +   *
    +   * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS.
    +   */
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is not guaranteed to be valid UTF-8. See https://simonsapin.github.io/wtf-8/
    +   *
    +   * Important: Calling get_wobbly_string() twice on the same document is an error.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @returns INCORRECT_TYPE if the JSON value is not true or false.
    +   */
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  /**
    +   * Cast this JSON value to a value when the document is an object or an array.
    +   *
    +   * You must not have begun iterating through the object or array. When
    +   * SIMDJSON_DEVELOPMENT_CHECKS is set to 1 (which is the case when building in Debug mode
    +   * by default), and you have already begun iterating,
    +   * you will get an OUT_OF_ORDER_ITERATION error. If you have begun iterating, you can use
    +   * rewind() to reset the document to its initial state before calling this method.
    +   *
    +   * @returns A value if a JSON array or object cannot be found.
    +   * @returns SCALAR_DOCUMENT_AS_VALUE error is the document is a scalar (see is_scalar() function).
    +   */
    +  simdjson_inline simdjson_result get_value() noexcept;
    +
    +  /**
    +   * Checks if this JSON value is null.  If and only if the value is
    +   * null, then it is consumed (we advance). If we find a token that
    +   * begins with 'n' but is not 'null', then an error is returned.
    +   *
    +   * @returns Whether the value is null.
    +   * @returns INCORRECT_TYPE If the JSON value begins with 'n' and is not 'null'.
    +   */
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool
    +   *
    +   * You may use get_double(), get_bool(), get_uint64(), get_int64(),
    +   * get_object(), get_array(), get_raw_json_string(), or get_string() instead.
    +   *
    +   * @returns A value of the given type, parsed from the JSON.
    +   * @returns INCORRECT_TYPE If the JSON value is not the given type.
    +   */
    +  template simdjson_inline simdjson_result get() & noexcept {
    +    // Unless the simdjson library provides an inline implementation, calling this method should
    +    // immediately fail.
    +    static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. "
    +      "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
    +      "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), "
    +      " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template.");
    +  }
    +  /** @overload template simdjson_result get() & noexcept */
    +  template simdjson_inline simdjson_result get() && noexcept {
    +    // Unless the simdjson library provides an inline implementation, calling this method should
    +    // immediately fail.
    +    static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. "
    +      "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
    +      "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), "
    +      " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template.");
    +  }
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool, value
    +   *
    +   * Be mindful that the document instance must remain in scope while you are accessing object, array and value instances.
    +   *
    +   * @param out This is set to a value of the given type, parsed from the JSON. If there is an error, this may not be initialized.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   * @returns SUCCESS If the parse succeeded and the out parameter was set to the value.
    +   */
    +  template simdjson_inline error_code get(T &out) & noexcept;
    +  /** @overload template error_code get(T &out) & noexcept */
    +  template simdjson_inline error_code get(T &out) && noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an array.
    +   */
    +  simdjson_inline operator array() & noexcept(false);
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an object.
    +   */
    +  simdjson_inline operator object() & noexcept(false);
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline operator int64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline operator double() noexcept(false);
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator raw_json_string() noexcept(false);
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not true or false.
    +   */
    +  simdjson_inline operator bool() noexcept(false);
    +  /**
    +   * Cast this JSON value to a value when the document is an object or an array.
    +   *
    +   * You must not have begun iterating through the object or array. When
    +   * SIMDJSON_DEVELOPMENT_CHECKS is defined, and you have already begun iterating,
    +   * you will get an OUT_OF_ORDER_ITERATION error. If you have begun iterating, you can use
    +   * rewind() to reset the document to its initial state before calling this method.
    +   *
    +   * @returns A value value if a JSON array or object cannot be found.
    +   * @exception SCALAR_DOCUMENT_AS_VALUE error is the document is a scalar (see is_scalar() function).
    +   */
    +  simdjson_inline operator value() noexcept(false);
    +#endif
    +  /**
    +   * This method scans the array and counts the number of elements.
    +   * The count_elements method should always be called before you have begun
    +   * iterating through the array: it is expected that you are pointing at
    +   * the beginning of the array.
    +   * The runtime complexity is linear in the size of the array. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   */
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +   /**
    +   * This method scans the object and counts the number of key-value pairs.
    +   * The count_fields method should always be called before you have begun
    +   * iterating through the object: it is expected that you are pointing at
    +   * the beginning of the object.
    +   * The runtime complexity is linear in the size of the object. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an object is empty, it is more performant to use
    +   * the is_empty() method.
    +   */
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  /**
    +   * Get the value at the given index in the array. This function has linear-time complexity.
    +   * This function should only be called once on an array instance since the array iterator is not reset between each call.
    +   *
    +   * @return The value at the given index, or:
    +   *         - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
    +   */
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  /**
    +   * Begin array iteration.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  /**
    +   * Sentinel representing the end of the array.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result end() & noexcept;
    +
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   *
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. E.g., the array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to
    +   * a key a single time. Doing object["mykey"].to_string()and then again object["mykey"].to_string()
    +   * is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. E.g., the array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to a key
    +   * a single time. Doing object["mykey"].to_string() and then again object["mykey"].to_string()
    +   * is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +
    +  /**
    +   * Get the type of this JSON value. It does not validate or consume the value.
    +   * E.g., you must still call "is_null()" to check that a value is null even if
    +   * "type()" returns json_type::null.
    +   *
    +   * NOTE: If you're only expecting a value to be one type (a typical case), it's generally
    +   * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just
    +   * let it throw an exception).
    +   *
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result type() noexcept;
    +
    +  /**
    +   * Checks whether the document is a scalar (string, number, null, Boolean).
    +   * Returns false when there it is an array or object.
    +   *
    +   * @returns true if the type is string, number, null, Boolean
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +
    +  /**
    +   * Checks whether the document is a negative number.
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline bool is_negative() noexcept;
    +  /**
    +   * Checks whether the document is an integer number. Note that
    +   * this requires to partially parse the number string. If
    +   * the value is determined to be an integer, it may still
    +   * not parse properly as an integer in subsequent steps
    +   * (e.g., it might overflow).
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  /**
    +   * Determine the number type (integer or floating-point number) as quickly
    +   * as possible. This function does not fully validate the input. It is
    +   * useful when you only need to classify the numbers, without parsing them.
    +   *
    +   * If you are planning to retrieve the value or you need full validation,
    +   * consider using the get_number() method instead: it will fully parse
    +   * and validate the input, and give you access to the type:
    +   * get_number().get_number_type().
    +   *
    +   * get_number_type() is number_type::unsigned_integer if we have
    +   * an integer greater or equal to 9223372036854775808
    +   * get_number_type() is number_type::signed_integer if we have an
    +   * integer that is less than 9223372036854775808
    +   * Otherwise, get_number_type() has value number_type::floating_point_number
    +   *
    +   * This function requires processing the number string, but it is expected
    +   * to be faster than get_number().get_number_type() because it is does not
    +   * parse the number value.
    +   *
    +   * @returns the type of the number
    +   */
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +
    +  /**
    +   * Attempt to parse an ondemand::number. An ondemand::number may
    +   * contain an integer value or a floating-point value, the simdjson
    +   * library will autodetect the type. Thus it is a dynamically typed
    +   * number. Before accessing the value, you must determine the detected
    +   * type.
    +   *
    +   * number.get_number_type() is number_type::signed_integer if we have
    +   * an integer in [-9223372036854775808,9223372036854775808)
    +   * You can recover the value by calling number.get_int64() and you
    +   * have that number.is_int64() is true.
    +   *
    +   * number.get_number_type() is number_type::unsigned_integer if we have
    +   * an integer in [9223372036854775808,18446744073709551616)
    +   * You can recover the value by calling number.get_uint64() and you
    +   * have that number.is_uint64() is true.
    +   *
    +   * Otherwise, number.get_number_type() has value number_type::floating_point_number
    +   * and we have a binary64 number.
    +   * You can recover the value by calling number.get_double() and you
    +   * have that number.is_double() is true.
    +   *
    +   * You must check the type before accessing the value: it is an error
    +   * to call "get_int64()" when number.get_number_type() is not
    +   * number_type::signed_integer and when number.is_int64() is false.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept;
    +
    +  /**
    +   * Get the raw JSON for this token.
    +   *
    +   * The string_view will always point into the input buffer.
    +   *
    +   * The string_view will start at the beginning of the token, and include the entire token
    +   * *as well as all spaces until the next token (or EOF).* This means, for example, that a
    +   * string token always begins with a " and is always terminated by the final ", possibly
    +   * followed by a number of spaces.
    +   *
    +   * The string_view is *not* null-terminated. If this is a scalar (string, number,
    +   * boolean, or null), the character after the end of the string_view may be the padded buffer.
    +   *
    +   * Tokens include:
    +   * - {
    +   * - [
    +   * - "a string (possibly with UTF-8 or backslashed characters like \\\")".
    +   * - -1.2e-100
    +   * - true
    +   * - false
    +   * - null
    +   */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +
    +  /**
    +   * Reset the iterator inside the document instance so we are pointing back at the
    +   * beginning of the document, as if it had just been created. It invalidates all
    +   * values, objects and arrays that you have created so far (including unescaped strings).
    +   */
    +  inline void rewind() noexcept;
    +  /**
    +   * Returns debugging information.
    +   */
    +  inline std::string to_debug_string() noexcept;
    +  /**
    +   * Some unrecoverable error conditions may render the document instance unusable.
    +   * The is_alive() method returns true when the document is still suitable.
    +   */
    +  inline bool is_alive() noexcept;
    +
    +  /**
    +   * Returns the current location in the document if in bounds.
    +   */
    +  inline simdjson_result current_location() const noexcept;
    +
    +  /**
    +   * Returns true if this document has been fully parsed.
    +   * If you have consumed the whole document and at_end() returns
    +   * false, then there may be trailing content.
    +   */
    +  inline bool at_end() const noexcept;
    +
    +  /**
    +   * Returns the current depth in the document if in bounds.
    +   *
    +   * E.g.,
    +   *  0 = finished with document
    +   *  1 = document root value (could be [ or {, not yet known)
    +   *  2 = , or } inside root array/object
    +   *  3 = key or value inside root array/object.
    +   */
    +  simdjson_inline int32_t current_depth() const noexcept;
    +
    +  /**
    +   * Get the value associated with the given JSON pointer.  We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/foo/a/1") == 20
    +   *
    +   * It is allowed for a key to be the empty string:
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("//a/1") == 20
    +   *
    +   * Note that at_pointer() automatically calls rewind between each call. Thus
    +   * all values, objects and arrays that you have created so far (including unescaped strings)
    +   * are invalidated. After calling at_pointer, you need to consume the result: string values
    +   * should be stored in your own variables, arrays should be decoded and stored in your own array-like
    +   * structures and so forth.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   *         - SCALAR_DOCUMENT_AS_VALUE if the json_pointer is empty and the document is not a scalar (see is_scalar() function).
    +   */
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  /**
    +   * Consumes the document and returns a string_view instance corresponding to the
    +   * document as represented in JSON. It points inside the original byte array containing
    +   * the JSON document.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +protected:
    +  /**
    +   * Consumes the document.
    +   */
    +  simdjson_inline error_code consume() noexcept;
    +
    +  simdjson_inline document(ondemand::json_iterator &&iter) noexcept;
    +  simdjson_inline const uint8_t *text(uint32_t idx) const noexcept;
    +
    +  simdjson_inline value_iterator resume_value_iterator() noexcept;
    +  simdjson_inline value_iterator get_root_value_iterator() noexcept;
    +  simdjson_inline simdjson_result start_or_resume_object() noexcept;
    +  static simdjson_inline document start(ondemand::json_iterator &&iter) noexcept;
    +
    +  //
    +  // Fields
    +  //
    +  json_iterator iter{}; ///< Current position in the document
    +  static constexpr depth_t DOCUMENT_DEPTH = 0; ///< document depth is always 0
    +
    +  friend class array_iterator;
    +  friend class value;
    +  friend class ondemand::parser;
    +  friend class object;
    +  friend class array;
    +  friend class field;
    +  friend class token;
    +  friend class document_stream;
    +  friend class document_reference;
    +};
    +
    +
    +/**
    + * A document_reference is a thin wrapper around a document reference instance.
    + */
    +class document_reference {
    +public:
    +  simdjson_inline document_reference() noexcept;
    +  simdjson_inline document_reference(document &d) noexcept;
    +  simdjson_inline document_reference(const document_reference &other) noexcept = default;
    +  simdjson_inline document_reference& operator=(const document_reference &other) noexcept = default;
    +  simdjson_inline void rewind() noexcept;
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result get_value() noexcept;
    +
    +  simdjson_inline simdjson_result is_null() noexcept;
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +  simdjson_inline operator document&() const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator array() & noexcept(false);
    +  simdjson_inline operator object() & noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +  simdjson_inline operator value() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  simdjson_inline int32_t current_depth() const noexcept;
    +  simdjson_inline bool is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +private:
    +  document *doc{nullptr};
    +};
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public ppc64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(ppc64::ondemand::document &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline error_code rewind() noexcept;
    +
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result get_value() noexcept;
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +  template simdjson_inline simdjson_result get() & noexcept;
    +  template simdjson_inline simdjson_result get() && noexcept;
    +
    +  template simdjson_inline error_code get(T &out) & noexcept;
    +  template simdjson_inline error_code get(T &out) && noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator ppc64::ondemand::array() & noexcept(false);
    +  simdjson_inline operator ppc64::ondemand::object() & noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator ppc64::ondemand::raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +  simdjson_inline operator ppc64::ondemand::value() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  simdjson_inline int32_t current_depth() const noexcept;
    +  simdjson_inline bool at_end() const noexcept;
    +  simdjson_inline bool is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +  /** @copydoc simdjson_inline std::string_view document::raw_json_token() const noexcept */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +};
    +
    +
    +} // namespace simdjson
    +
    +
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public ppc64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(ppc64::ondemand::document_reference value, error_code error) noexcept;
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline error_code rewind() noexcept;
    +
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result get_value() noexcept;
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator ppc64::ondemand::array() & noexcept(false);
    +  simdjson_inline operator ppc64::ondemand::object() & noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator ppc64::ondemand::raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +  simdjson_inline operator ppc64::ondemand::value() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  simdjson_inline simdjson_result current_depth() const noexcept;
    +  simdjson_inline simdjson_result is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +  /** @copydoc simdjson_inline std::string_view document_reference::raw_json_token() const noexcept */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +};
    +
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H
    +/* end file simdjson/generic/ondemand/document.h for ppc64 */
    +/* including simdjson/generic/ondemand/document_stream.h for ppc64: #include "simdjson/generic/ondemand/document_stream.h" */
    +/* begin file simdjson/generic/ondemand/document_stream.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +#include 
    +#include 
    +#include 
    +#endif
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +/** @private Custom worker class **/
    +struct stage1_worker {
    +  stage1_worker() noexcept = default;
    +  stage1_worker(const stage1_worker&) = delete;
    +  stage1_worker(stage1_worker&&) = delete;
    +  stage1_worker operator=(const stage1_worker&) = delete;
    +  ~stage1_worker();
    +  /**
    +   * We only start the thread when it is needed, not at object construction, this may throw.
    +   * You should only call this once.
    +   **/
    +  void start_thread();
    +  /**
    +   * Start a stage 1 job. You should first call 'run', then 'finish'.
    +   * You must call start_thread once before.
    +   */
    +  void run(document_stream * ds, parser * stage1, size_t next_batch_start);
    +  /** Wait for the run to finish (blocking). You should first call 'run', then 'finish'. **/
    +  void finish();
    +
    +private:
    +
    +  /**
    +   * Normally, we would never stop the thread. But we do in the destructor.
    +   * This function is only safe assuming that you are not waiting for results. You
    +   * should have called run, then finish, and be done.
    +   **/
    +  void stop_thread();
    +
    +  std::thread thread{};
    +  /** These three variables define the work done by the thread. **/
    +  ondemand::parser * stage1_thread_parser{};
    +  size_t _next_batch_start{};
    +  document_stream * owner{};
    +  /**
    +   * We have two state variables. This could be streamlined to one variable in the future but
    +   * we use two for clarity.
    +   */
    +  bool has_work{false};
    +  bool can_work{true};
    +
    +  /**
    +   * We lock using a mutex.
    +   */
    +  std::mutex locking_mutex{};
    +  std::condition_variable cond_var{};
    +
    +  friend class document_stream;
    +};
    +#endif  // SIMDJSON_THREADS_ENABLED
    +
    +/**
    + * A forward-only stream of documents.
    + *
    + * Produced by parser::iterate_many.
    + *
    + */
    +class document_stream {
    +public:
    +  /**
    +   * Construct an uninitialized document_stream.
    +   *
    +   *  ```c++
    +   *  document_stream docs;
    +   *  auto error = parser.iterate_many(json).get(docs);
    +   *  ```
    +   */
    +  simdjson_inline document_stream() noexcept;
    +  /** Move one document_stream to another. */
    +  simdjson_inline document_stream(document_stream &&other) noexcept = default;
    +  /** Move one document_stream to another. */
    +  simdjson_inline document_stream &operator=(document_stream &&other) noexcept = default;
    +
    +  simdjson_inline ~document_stream() noexcept;
    +
    +  /**
    +   * Returns the input size in bytes.
    +   */
    +  inline size_t size_in_bytes() const noexcept;
    +
    +  /**
    +   * After iterating through the stream, this method
    +   * returns the number of bytes that were not parsed at the end
    +   * of the stream. If truncated_bytes() differs from zero,
    +   * then the input was truncated maybe because incomplete JSON
    +   * documents were found at the end of the stream. You
    +   * may need to process the bytes in the interval [size_in_bytes()-truncated_bytes(), size_in_bytes()).
    +   *
    +   * You should only call truncated_bytes() after streaming through all
    +   * documents, like so:
    +   *
    +   *   document_stream stream = parser.iterate_many(json,window);
    +   *   for(auto & doc : stream) {
    +   *      // do something with doc
    +   *   }
    +   *   size_t truncated = stream.truncated_bytes();
    +   *
    +   */
    +  inline size_t truncated_bytes() const noexcept;
    +
    +  class iterator {
    +  public:
    +    using value_type = simdjson_result;
    +    using reference  = value_type;
    +
    +    using difference_type   = std::ptrdiff_t;
    +
    +    using iterator_category = std::input_iterator_tag;
    +
    +    /**
    +     * Default constructor.
    +     */
    +    simdjson_inline iterator() noexcept;
    +    /**
    +     * Get the current document (or error).
    +     */
    +    simdjson_inline simdjson_result operator*() noexcept;
    +    /**
    +     * Advance to the next document (prefix).
    +     */
    +    inline iterator& operator++() noexcept;
    +    /**
    +     * Check if we're at the end yet.
    +     * @param other the end iterator to compare to.
    +     */
    +    simdjson_inline bool operator!=(const iterator &other) const noexcept;
    +    /**
    +     * @private
    +     *
    +     * Gives the current index in the input document in bytes.
    +     *
    +     *   document_stream stream = parser.parse_many(json,window);
    +     *   for(auto i = stream.begin(); i != stream.end(); ++i) {
    +     *      auto doc = *i;
    +     *      size_t index = i.current_index();
    +     *   }
    +     *
    +     * This function (current_index()) is experimental and the usage
    +     * may change in future versions of simdjson: we find the API somewhat
    +     * awkward and we would like to offer something friendlier.
    +     */
    +     simdjson_inline size_t current_index() const noexcept;
    +
    +     /**
    +     * @private
    +     *
    +     * Gives a view of the current document at the current position.
    +     *
    +     *   document_stream stream = parser.iterate_many(json,window);
    +     *   for(auto i = stream.begin(); i != stream.end(); ++i) {
    +     *      std::string_view v = i.source();
    +     *   }
    +     *
    +     * The returned string_view instance is simply a map to the (unparsed)
    +     * source string: it may thus include white-space characters and all manner
    +     * of padding.
    +     *
    +     * This function (source()) is experimental and the usage
    +     * may change in future versions of simdjson: we find the API somewhat
    +     * awkward and we would like to offer something friendlier.
    +     *
    +     */
    +     simdjson_inline std::string_view source() const noexcept;
    +
    +    /**
    +     * Returns error of the stream (if any).
    +     */
    +     inline error_code error() const noexcept;
    +
    +  private:
    +    simdjson_inline iterator(document_stream *s, bool finished) noexcept;
    +    /** The document_stream we're iterating through. */
    +    document_stream* stream;
    +    /** Whether we're finished or not. */
    +    bool finished;
    +
    +    friend class document;
    +    friend class document_stream;
    +    friend class json_iterator;
    +  };
    +
    +  /**
    +   * Start iterating the documents in the stream.
    +   */
    +  simdjson_inline iterator begin() noexcept;
    +  /**
    +   * The end of the stream, for iterator comparison purposes.
    +   */
    +  simdjson_inline iterator end() noexcept;
    +
    +private:
    +
    +  document_stream &operator=(const document_stream &) = delete; // Disallow copying
    +  document_stream(const document_stream &other) = delete; // Disallow copying
    +
    +  /**
    +   * Construct a document_stream. Does not allocate or parse anything until the iterator is
    +   * used.
    +   *
    +   * @param parser is a reference to the parser instance used to generate this document_stream
    +   * @param buf is the raw byte buffer we need to process
    +   * @param len is the length of the raw byte buffer in bytes
    +   * @param batch_size is the size of the windows (must be strictly greater or equal to the largest JSON document)
    +   */
    +  simdjson_inline document_stream(
    +    ondemand::parser &parser,
    +    const uint8_t *buf,
    +    size_t len,
    +    size_t batch_size,
    +    bool allow_comma_separated
    +  ) noexcept;
    +
    +  /**
    +   * Parse the first document in the buffer. Used by begin(), to handle allocation and
    +   * initialization.
    +   */
    +  inline void start() noexcept;
    +
    +  /**
    +   * Parse the next document found in the buffer previously given to document_stream.
    +   *
    +   * The content should be a valid JSON document encoded as UTF-8. If there is a
    +   * UTF-8 BOM, the parser skips it.
    +   *
    +   * You do NOT need to pre-allocate a parser.  This function takes care of
    +   * pre-allocating a capacity defined by the batch_size defined when creating the
    +   * document_stream object.
    +   *
    +   * The function returns simdjson::EMPTY if there is no more data to be parsed.
    +   *
    +   * The function returns simdjson::SUCCESS (as integer = 0) in case of success
    +   * and indicates that the buffer has successfully been parsed to the end.
    +   * Every document it contained has been parsed without error.
    +   *
    +   * The function returns an error code from simdjson/simdjson.h in case of failure
    +   * such as simdjson::CAPACITY, simdjson::MEMALLOC, simdjson::DEPTH_ERROR and so forth;
    +   * the simdjson::error_message function converts these error codes into a string).
    +   *
    +   * You can also check validity by calling parser.is_valid(). The same parser can
    +   * and should be reused for the other documents in the buffer.
    +   */
    +  inline void next() noexcept;
    +
    +  /** Move the json_iterator of the document to the location of the next document in the stream. */
    +  inline void next_document() noexcept;
    +
    +  /** Get the next document index. */
    +  inline size_t next_batch_start() const noexcept;
    +
    +  /** Pass the next batch through stage 1 with the given parser. */
    +  inline error_code run_stage1(ondemand::parser &p, size_t batch_start) noexcept;
    +
    +  // Fields
    +  ondemand::parser *parser;
    +  const uint8_t *buf;
    +  size_t len;
    +  size_t batch_size;
    +  bool allow_comma_separated;
    +  /**
    +   * We are going to use just one document instance. The document owns
    +   * the json_iterator. It implies that we only ever pass a reference
    +   * to the document to the users.
    +   */
    +  document doc{};
    +  /** The error (or lack thereof) from the current document. */
    +  error_code error;
    +  size_t batch_start{0};
    +  size_t doc_index{};
    +
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  /** Indicates whether we use threads. Note that this needs to be a constant during the execution of the parsing. */
    +  bool use_thread;
    +
    +  inline void load_from_stage1_thread() noexcept;
    +
    +  /** Start a thread to run stage 1 on the next batch. */
    +  inline void start_stage1_thread() noexcept;
    +
    +  /** Wait for the stage 1 thread to finish and capture the results. */
    +  inline void finish_stage1_thread() noexcept;
    +
    +  /** The error returned from the stage 1 thread. */
    +  error_code stage1_thread_error{UNINITIALIZED};
    +  /** The thread used to run stage 1 against the next batch in the background. */
    +  std::unique_ptr worker{new(std::nothrow) stage1_worker()};
    +  /**
    +   * The parser used to run stage 1 in the background. Will be swapped
    +   * with the regular parser when finished.
    +   */
    +  ondemand::parser stage1_thread_parser{};
    +
    +  friend struct stage1_worker;
    +  #endif // SIMDJSON_THREADS_ENABLED
    +
    +  friend class parser;
    +  friend class document;
    +  friend class json_iterator;
    +  friend struct simdjson_result;
    +  friend struct internal::simdjson_result_base;
    +};  // document_stream
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +template<>
    +struct simdjson_result : public ppc64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(ppc64::ondemand::document_stream &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H
    +/* end file simdjson/generic/ondemand/document_stream.h for ppc64 */
    +/* including simdjson/generic/ondemand/field.h for ppc64: #include "simdjson/generic/ondemand/field.h" */
    +/* begin file simdjson/generic/ondemand/field.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_FIELD_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +/**
    + * A JSON field (key/value pair) in an object.
    + *
    + * Returned from object iteration.
    + *
    + * Extends from std::pair so you can use C++ algorithms that rely on pairs.
    + */
    +class field : public std::pair {
    +public:
    +  /**
    +   * Create a new invalid field.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline field() noexcept;
    +
    +  /**
    +   * Get the key as a string_view (for higher speed, consider raw_key).
    +   * We deliberately use a more cumbersome name (unescaped_key) to force users
    +   * to think twice about using it.
    +   *
    +   * This consumes the key: once you have called unescaped_key(), you cannot
    +   * call it again nor can you call key().
    +   */
    +  simdjson_inline simdjson_warn_unused simdjson_result unescaped_key(bool allow_replacement) noexcept;
    +  /**
    +   * Get the key as a raw_json_string. Can be used for direct comparison with
    +   * an unescaped C string: e.g., key() == "test".
    +   */
    +  simdjson_inline raw_json_string key() const noexcept;
    +  /**
    +   * Get the field value.
    +   */
    +  simdjson_inline ondemand::value &value() & noexcept;
    +  /**
    +   * @overload ondemand::value &ondemand::value() & noexcept
    +   */
    +  simdjson_inline ondemand::value value() && noexcept;
    +
    +protected:
    +  simdjson_inline field(raw_json_string key, ondemand::value &&value) noexcept;
    +  static simdjson_inline simdjson_result start(value_iterator &parent_iter) noexcept;
    +  static simdjson_inline simdjson_result start(const value_iterator &parent_iter, raw_json_string key) noexcept;
    +  friend struct simdjson_result;
    +  friend class object_iterator;
    +};
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public ppc64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(ppc64::ondemand::field &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result unescaped_key(bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result key() noexcept;
    +  simdjson_inline simdjson_result value() noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_H
    +/* end file simdjson/generic/ondemand/field.h for ppc64 */
    +/* including simdjson/generic/ondemand/object.h for ppc64: #include "simdjson/generic/ondemand/object.h" */
    +/* begin file simdjson/generic/ondemand/object.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +/**
    + * A forward-only JSON object field iterator.
    + */
    +class object {
    +public:
    +  /**
    +   * Create a new invalid object.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline object() noexcept = default;
    +
    +  simdjson_inline simdjson_result begin() noexcept;
    +  simdjson_inline simdjson_result end() noexcept;
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +   *
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. The value instance you get
    +   * from  `content["bids"]` becomes invalid when you call `content["asks"]`. The array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to a
    +   * key a single time. Doing object["mykey"].to_string() and then again object["mykey"].to_string()
    +   * is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field(std::string_view key) && noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. The value instance you get
    +   * from  `content["bids"]` becomes invalid when you call `content["asks"]`. The array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to a key
    +   * a single time. Doing object["mykey"].to_string() and then again object["mykey"].to_string() is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) && noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) && noexcept;
    +
    +  /**
    +   * Get the value associated with the given JSON pointer. We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard, interpreting the current node
    +   * as the root of its own JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/foo/a/1") == 20
    +   *
    +   * It is allowed for a key to be the empty string:
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("//a/1") == 20
    +   *
    +   * Note that at_pointer() called on the document automatically calls the document's rewind
    +   * method between each call. It invalidates all previously accessed arrays, objects and values
    +   * that have not been consumed. Yet it is not the case when calling at_pointer on an object
    +   * instance: there is no rewind and no invalidation.
    +   *
    +   * You may call at_pointer more than once on an object, but each time the pointer is advanced
    +   * to be within the value matched by the key indicated by the JSON pointer query. Thus any preceding
    +   * key (as well as the current key) can no longer be used with following JSON pointer calls.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching.
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   */
    +  inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +
    +  /**
    +   * Reset the iterator so that we are pointing back at the
    +   * beginning of the object. You should still consume values only once even if you
    +   * can iterate through the object more than once. If you unescape a string within
    +   * the object more than once, you have unsafe code. Note that rewinding an object
    +   * means that you may need to reparse it anew: it is not a free operation.
    +   *
    +   * @returns true if the object contains some elements (not empty)
    +   */
    +  inline simdjson_result reset() & noexcept;
    +  /**
    +   * This method scans the beginning of the object and checks whether the
    +   * object is empty.
    +   * The runtime complexity is constant time. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   */
    +  inline simdjson_result is_empty() & noexcept;
    +  /**
    +   * This method scans the object and counts the number of key-value pairs.
    +   * The count_fields method should always be called before you have begun
    +   * iterating through the object: it is expected that you are pointing at
    +   * the beginning of the object.
    +   * The runtime complexity is linear in the size of the object. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an object is empty, it is more performant to use
    +   * the is_empty() method.
    +   *
    +   * Performance hint: You should only call count_fields() as a last
    +   * resort as it may require scanning the document twice or more.
    +   */
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  /**
    +   * Consumes the object and returns a string_view instance corresponding to the
    +   * object as represented in JSON. It points inside the original byte array containing
    +   * the JSON document.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +protected:
    +  /**
    +   * Go to the end of the object, no matter where you are right now.
    +   */
    +  simdjson_inline error_code consume() noexcept;
    +  static simdjson_inline simdjson_result start(value_iterator &iter) noexcept;
    +  static simdjson_inline simdjson_result start_root(value_iterator &iter) noexcept;
    +  static simdjson_inline simdjson_result started(value_iterator &iter) noexcept;
    +  static simdjson_inline object resume(const value_iterator &iter) noexcept;
    +  simdjson_inline object(const value_iterator &iter) noexcept;
    +
    +  simdjson_warn_unused simdjson_inline error_code find_field_raw(const std::string_view key) noexcept;
    +
    +  value_iterator iter{};
    +
    +  friend class value;
    +  friend class document;
    +  friend struct simdjson_result;
    +};
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public ppc64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(ppc64::ondemand::object &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result begin() noexcept;
    +  simdjson_inline simdjson_result end() noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) && noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) && noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) && noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  inline simdjson_result reset() noexcept;
    +  inline simdjson_result is_empty() noexcept;
    +  inline simdjson_result count_fields() & noexcept;
    +  inline simdjson_result raw_json() noexcept;
    +
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_H
    +/* end file simdjson/generic/ondemand/object.h for ppc64 */
    +/* including simdjson/generic/ondemand/object_iterator.h for ppc64: #include "simdjson/generic/ondemand/object_iterator.h" */
    +/* begin file simdjson/generic/ondemand/object_iterator.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +class object_iterator {
    +public:
    +  /**
    +   * Create a new invalid object_iterator.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline object_iterator() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  // Reads key and value, yielding them to the user.
    +  // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  simdjson_inline simdjson_result operator*() noexcept;
    +  // Assumes it's being compared with the end. true if depth < iter->depth.
    +  simdjson_inline bool operator==(const object_iterator &) const noexcept;
    +  // Assumes it's being compared with the end. true if depth >= iter->depth.
    +  simdjson_inline bool operator!=(const object_iterator &) const noexcept;
    +  // Checks for ']' and ','
    +  simdjson_inline object_iterator &operator++() noexcept;
    +
    +private:
    +  /**
    +   * The underlying JSON iterator.
    +   *
    +   * PERF NOTE: expected to be elided in favor of the parent document: this is set when the object
    +   * is first used, and never changes afterwards.
    +   */
    +  value_iterator iter{};
    +
    +  simdjson_inline object_iterator(const value_iterator &iter) noexcept;
    +  friend struct simdjson_result;
    +  friend class object;
    +};
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public ppc64::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(ppc64::ondemand::object_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  // Reads key and value, yielding them to the user.
    +  simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  // Assumes it's being compared with the end. true if depth < iter->depth.
    +  simdjson_inline bool operator==(const simdjson_result &) const noexcept;
    +  // Assumes it's being compared with the end. true if depth >= iter->depth.
    +  simdjson_inline bool operator!=(const simdjson_result &) const noexcept;
    +  // Checks for ']' and ','
    +  simdjson_inline simdjson_result &operator++() noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H
    +/* end file simdjson/generic/ondemand/object_iterator.h for ppc64 */
    +/* including simdjson/generic/ondemand/serialization.h for ppc64: #include "simdjson/generic/ondemand/serialization.h" */
    +/* begin file simdjson/generic/ondemand/serialization.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +/**
    + * Create a string-view instance out of a document instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(ppc64::ondemand::document& x) noexcept;
    +/**
    + * Create a string-view instance out of a value instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. The value must
    + * not have been accessed previously. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(ppc64::ondemand::value& x) noexcept;
    +/**
    + * Create a string-view instance out of an object instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(ppc64::ondemand::object& x) noexcept;
    +/**
    + * Create a string-view instance out of an array instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(ppc64::ondemand::array& x) noexcept;
    +inline simdjson_result to_json_string(simdjson_result x);
    +inline simdjson_result to_json_string(simdjson_result x);
    +inline simdjson_result to_json_string(simdjson_result x);
    +inline simdjson_result to_json_string(simdjson_result x);
    +} // namespace simdjson
    +
    +/**
    + * We want to support argument-dependent lookup (ADL).
    + * Hence we should define operator<< in the namespace
    + * where the argument (here value, object, etc.) resides.
    + * Credit: @madhur4127
    + * See https://github.com/simdjson/simdjson/issues/1768
    + */
    +namespace simdjson { namespace ppc64 { namespace ondemand {
    +
    +/**
    + * Print JSON to an output stream.  It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The element.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::value x);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x);
    +#endif
    +/**
    + * Print JSON to an output stream. It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The array.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::array value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x);
    +#endif
    +/**
    + * Print JSON to an output stream. It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The array.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::document& value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x);
    +#endif
    +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::document_reference& value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x);
    +#endif
    +/**
    + * Print JSON to an output stream. It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The object.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::object value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x);
    +#endif
    +}}} // namespace simdjson::ppc64::ondemand
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H
    +/* end file simdjson/generic/ondemand/serialization.h for ppc64 */
    +
    +// Inline definitions
    +/* including simdjson/generic/ondemand/array-inl.h for ppc64: #include "simdjson/generic/ondemand/array-inl.h" */
    +/* begin file simdjson/generic/ondemand/array-inl.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +//
    +// ### Live States
    +//
    +// While iterating or looking up values, depth >= iter->depth. at_start may vary. Error is
    +// always SUCCESS:
    +//
    +// - Start: This is the state when the array is first found and the iterator is just past the `{`.
    +//   In this state, at_start == true.
    +// - Next: After we hand a scalar value to the user, or an array/object which they then fully
    +//   iterate over, the iterator is at the `,` before the next value (or `]`). In this state,
    +//   depth == iter->depth, at_start == false, and error == SUCCESS.
    +// - Unfinished Business: When we hand an array/object to the user which they do not fully
    +//   iterate over, we need to finish that iteration by skipping child values until we reach the
    +//   Next state. In this state, depth > iter->depth, at_start == false, and error == SUCCESS.
    +//
    +// ## Error States
    +//
    +// In error states, we will yield exactly one more value before stopping. iter->depth == depth
    +// and at_start is always false. We decrement after yielding the error, moving to the Finished
    +// state.
    +//
    +// - Chained Error: When the array iterator is part of an error chain--for example, in
    +//   `for (auto tweet : doc["tweets"])`, where the tweet element may be missing or not be an
    +//   array--we yield that error in the loop, exactly once. In this state, error != SUCCESS and
    +//   iter->depth == depth, and at_start == false. We decrement depth when we yield the error.
    +// - Missing Comma Error: When the iterator ++ method discovers there is no comma between elements,
    +//   we flag that as an error and treat it exactly the same as a Chained Error. In this state,
    +//   error == TAPE_ERROR, iter->depth == depth, and at_start == false.
    +//
    +// ## Terminal State
    +//
    +// The terminal state has iter->depth < depth. at_start is always false.
    +//
    +// - Finished: When we have reached a `]` or have reported an error, we are finished. We signal this
    +//   by decrementing depth. In this state, iter->depth < depth, at_start == false, and
    +//   error == SUCCESS.
    +//
    +
    +simdjson_inline array::array(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{
    +}
    +
    +simdjson_inline simdjson_result array::start(value_iterator &iter) noexcept {
    +  // We don't need to know if the array is empty to start iteration, but we do want to know if there
    +  // is an error--thus `simdjson_unused`.
    +  simdjson_unused bool has_value;
    +  SIMDJSON_TRY( iter.start_array().get(has_value) );
    +  return array(iter);
    +}
    +simdjson_inline simdjson_result array::start_root(value_iterator &iter) noexcept {
    +  simdjson_unused bool has_value;
    +  SIMDJSON_TRY( iter.start_root_array().get(has_value) );
    +  return array(iter);
    +}
    +simdjson_inline simdjson_result array::started(value_iterator &iter) noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY(iter.started_array().get(has_value));
    +  return array(iter);
    +}
    +
    +simdjson_inline simdjson_result array::begin() noexcept {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  return array_iterator(iter);
    +}
    +simdjson_inline simdjson_result array::end() noexcept {
    +  return array_iterator(iter);
    +}
    +simdjson_inline error_code array::consume() noexcept {
    +  auto error = iter.json_iter().skip_child(iter.depth()-1);
    +  if(error) { iter.abandon(); }
    +  return error;
    +}
    +
    +simdjson_inline simdjson_result array::raw_json() noexcept {
    +  const uint8_t * starting_point{iter.peek_start()};
    +  auto error = consume();
    +  if(error) { return error; }
    +  // After 'consume()', we could be left pointing just beyond the document, but that
    +  // is ok because we are not going to dereference the final pointer position, we just
    +  // use it to compute the length in bytes.
    +  const uint8_t * final_point{iter._json_iter->unsafe_pointer()};
    +  return std::string_view(reinterpret_cast(starting_point), size_t(final_point - starting_point));
    +}
    +
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_inline simdjson_result array::count_elements() & noexcept {
    +  size_t count{0};
    +  // Important: we do not consume any of the values.
    +  for(simdjson_unused auto v : *this) { count++; }
    +  // The above loop will always succeed, but we want to report errors.
    +  if(iter.error()) { return iter.error(); }
    +  // We need to move back at the start because we expect users to iterate through
    +  // the array after counting the number of elements.
    +  iter.reset_array();
    +  return count;
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_inline simdjson_result array::is_empty() & noexcept {
    +  bool is_not_empty;
    +  auto error = iter.reset_array().get(is_not_empty);
    +  if(error) { return error; }
    +  return !is_not_empty;
    +}
    +
    +inline simdjson_result array::reset() & noexcept {
    +  return iter.reset_array();
    +}
    +
    +inline simdjson_result array::at_pointer(std::string_view json_pointer) noexcept {
    +  if (json_pointer[0] != '/') { return INVALID_JSON_POINTER; }
    +  json_pointer = json_pointer.substr(1);
    +  // - means "the append position" or "the element after the end of the array"
    +  // We don't support this, because we're returning a real element, not a position.
    +  if (json_pointer == "-") { return INDEX_OUT_OF_BOUNDS; }
    +
    +  // Read the array index
    +  size_t array_index = 0;
    +  size_t i;
    +  for (i = 0; i < json_pointer.length() && json_pointer[i] != '/'; i++) {
    +    uint8_t digit = uint8_t(json_pointer[i] - '0');
    +    // Check for non-digit in array index. If it's there, we're trying to get a field in an object
    +    if (digit > 9) { return INCORRECT_TYPE; }
    +    array_index = array_index*10 + digit;
    +  }
    +
    +  // 0 followed by other digits is invalid
    +  if (i > 1 && json_pointer[0] == '0') { return INVALID_JSON_POINTER; } // "JSON pointer array index has other characters after 0"
    +
    +  // Empty string is invalid; so is a "/" with no digits before it
    +  if (i == 0) { return INVALID_JSON_POINTER; } // "Empty string in JSON pointer array index"
    +  // Get the child
    +  auto child = at(array_index);
    +  // If there is an error, it ends here
    +  if(child.error()) {
    +    return child;
    +  }
    +
    +  // If there is a /, we're not done yet, call recursively.
    +  if (i < json_pointer.length()) {
    +    child = child.at_pointer(json_pointer.substr(i));
    +  }
    +  return child;
    +}
    +
    +simdjson_inline simdjson_result array::at(size_t index) noexcept {
    +  size_t i = 0;
    +  for (auto value : *this) {
    +    if (i == index) { return value; }
    +    i++;
    +  }
    +  return INDEX_OUT_OF_BOUNDS;
    +}
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  ppc64::ondemand::array &&value
    +) noexcept
    +  : implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept
    +  : implementation_simdjson_result_base(error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::begin() noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() noexcept {
    +  if (error()) { return error(); }
    +  return first.end();
    +}
    +simdjson_inline  simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline  simdjson_result simdjson_result::is_empty() & noexcept {
    +  if (error()) { return error(); }
    +  return first.is_empty();
    +}
    +simdjson_inline  simdjson_result simdjson_result::at(size_t index) noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline  simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +simdjson_inline  simdjson_result simdjson_result::raw_json() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json();
    +}
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H
    +/* end file simdjson/generic/ondemand/array-inl.h for ppc64 */
    +/* including simdjson/generic/ondemand/array_iterator-inl.h for ppc64: #include "simdjson/generic/ondemand/array_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/array_iterator-inl.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{}
    +
    +simdjson_inline simdjson_result array_iterator::operator*() noexcept {
    +  if (iter.error()) { iter.abandon(); return iter.error(); }
    +  return value(iter.child());
    +}
    +simdjson_inline bool array_iterator::operator==(const array_iterator &other) const noexcept {
    +  return !(*this != other);
    +}
    +simdjson_inline bool array_iterator::operator!=(const array_iterator &) const noexcept {
    +  return iter.is_open();
    +}
    +simdjson_inline array_iterator &array_iterator::operator++() noexcept {
    +  error_code error;
    +  // PERF NOTE this is a safety rail ... users should exit loops as soon as they receive an error, so we'll never get here.
    +  // However, it does not seem to make a perf difference, so we add it out of an abundance of caution.
    +  if (( error = iter.error() )) { return *this; }
    +  if (( error = iter.skip_child() )) { return *this; }
    +  if (( error = iter.has_next_element().error() )) { return *this; }
    +  return *this;
    +}
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  ppc64::ondemand::array_iterator &&value
    +) noexcept
    +  : ppc64::implementation_simdjson_result_base(std::forward(value))
    +{
    +  first.iter.assert_is_valid();
    +}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +  : ppc64::implementation_simdjson_result_base({}, error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::operator*() noexcept {
    +  if (error()) { return error(); }
    +  return *first;
    +}
    +simdjson_inline bool simdjson_result::operator==(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return !error(); }
    +  return first == other.first;
    +}
    +simdjson_inline bool simdjson_result::operator!=(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return error(); }
    +  return first != other.first;
    +}
    +simdjson_inline simdjson_result &simdjson_result::operator++() noexcept {
    +  // Clear the error if there is one, so we don't yield it twice
    +  if (error()) { second = SUCCESS; return *this; }
    +  ++(first);
    +  return *this;
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/array_iterator-inl.h for ppc64 */
    +/* including simdjson/generic/ondemand/document-inl.h for ppc64: #include "simdjson/generic/ondemand/document-inl.h" */
    +/* begin file simdjson/generic/ondemand/document-inl.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +simdjson_inline document::document(ondemand::json_iterator &&_iter) noexcept
    +  : iter{std::forward(_iter)}
    +{
    +  logger::log_start_value(iter, "document");
    +}
    +
    +simdjson_inline document document::start(json_iterator &&iter) noexcept {
    +  return document(std::forward(iter));
    +}
    +
    +inline void document::rewind() noexcept {
    +  iter.rewind();
    +}
    +
    +inline std::string document::to_debug_string() noexcept {
    +  return iter.to_string();
    +}
    +
    +inline simdjson_result document::current_location() const noexcept {
    +  return iter.current_location();
    +}
    +
    +inline int32_t document::current_depth() const noexcept {
    +  return iter.depth();
    +}
    +
    +inline bool document::at_end() const noexcept {
    +  return iter.at_end();
    +}
    +
    +
    +inline bool document::is_alive() noexcept {
    +  return iter.is_alive();
    +}
    +simdjson_inline value_iterator document::resume_value_iterator() noexcept {
    +  return value_iterator(&iter, 1, iter.root_position());
    +}
    +simdjson_inline value_iterator document::get_root_value_iterator() noexcept {
    +  return resume_value_iterator();
    +}
    +simdjson_inline simdjson_result document::start_or_resume_object() noexcept {
    +  if (iter.at_root()) {
    +    return get_object();
    +  } else {
    +    return object::resume(resume_value_iterator());
    +  }
    +}
    +simdjson_inline simdjson_result document::get_value() noexcept {
    +  // Make sure we start any arrays or objects before returning, so that start_root_()
    +  // gets called.
    +
    +  // It is the convention throughout the code that  the macro `SIMDJSON_DEVELOPMENT_CHECKS` determines whether
    +  // we check for OUT_OF_ORDER_ITERATION. Proper on::demand code should never trigger this error.
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  if (!iter.at_root()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  // assert_at_root() serves two purposes: in Debug mode, whether or not
    +  // SIMDJSON_DEVELOPMENT_CHECKS is set or not, it checks that we are at the root of
    +  // the document (this will typically be redundant). In release mode, it generates
    +  // SIMDJSON_ASSUME statements to allow the compiler to make assumptions.
    +  iter.assert_at_root();
    +  switch (*iter.peek()) {
    +    case '[': {
    +      // The following lines check that the document ends with ].
    +      auto value_iterator = get_root_value_iterator();
    +      auto error = value_iterator.check_root_array();
    +      if(error) { return error; }
    +      return value(get_root_value_iterator());
    +    }
    +    case '{': {
    +      // The following lines would check that the document ends with }.
    +      auto value_iterator = get_root_value_iterator();
    +      auto error = value_iterator.check_root_object();
    +      if(error) { return error; }
    +      return value(get_root_value_iterator());
    +    }
    +    default:
    +      // Unfortunately, scalar documents are a special case in simdjson and they cannot
    +      // be safely converted to value instances.
    +      return SCALAR_DOCUMENT_AS_VALUE;
    +  }
    +}
    +simdjson_inline simdjson_result document::get_array() & noexcept {
    +  auto value = get_root_value_iterator();
    +  return array::start_root(value);
    +}
    +simdjson_inline simdjson_result document::get_object() & noexcept {
    +  auto value = get_root_value_iterator();
    +  return object::start_root(value);
    +}
    +
    +/**
    + * We decided that calling 'get_double()' on the JSON document '1.233 blabla' should
    + * give an error, so we check for trailing content. We want to disallow trailing
    + * content.
    + * Thus, in several implementations below, we pass a 'true' parameter value to
    + * a get_root_value_iterator() method: this indicates that we disallow trailing content.
    + */
    +
    +simdjson_inline simdjson_result document::get_uint64() noexcept {
    +  return get_root_value_iterator().get_root_uint64(true);
    +}
    +simdjson_inline simdjson_result document::get_uint64_in_string() noexcept {
    +  return get_root_value_iterator().get_root_uint64_in_string(true);
    +}
    +simdjson_inline simdjson_result document::get_int64() noexcept {
    +  return get_root_value_iterator().get_root_int64(true);
    +}
    +simdjson_inline simdjson_result document::get_int64_in_string() noexcept {
    +  return get_root_value_iterator().get_root_int64_in_string(true);
    +}
    +simdjson_inline simdjson_result document::get_double() noexcept {
    +  return get_root_value_iterator().get_root_double(true);
    +}
    +simdjson_inline simdjson_result document::get_double_in_string() noexcept {
    +  return get_root_value_iterator().get_root_double_in_string(true);
    +}
    +simdjson_inline simdjson_result document::get_string(bool allow_replacement) noexcept {
    +  return get_root_value_iterator().get_root_string(true, allow_replacement);
    +}
    +template 
    +simdjson_inline error_code document::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  return get_root_value_iterator().get_root_string(receiver, true, allow_replacement);
    +}
    +simdjson_inline simdjson_result document::get_wobbly_string() noexcept {
    +  return get_root_value_iterator().get_root_wobbly_string(true);
    +}
    +simdjson_inline simdjson_result document::get_raw_json_string() noexcept {
    +  return get_root_value_iterator().get_root_raw_json_string(true);
    +}
    +simdjson_inline simdjson_result document::get_bool() noexcept {
    +  return get_root_value_iterator().get_root_bool(true);
    +}
    +simdjson_inline simdjson_result document::is_null() noexcept {
    +  return get_root_value_iterator().is_root_null(true);
    +}
    +
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_array(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_object(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_raw_json_string(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_string(false); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_double(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_uint64(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_int64(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_value(); }
    +
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return get_value(); }
    +
    +template simdjson_inline error_code document::get(T &out) & noexcept {
    +  return get().get(out);
    +}
    +template simdjson_inline error_code document::get(T &out) && noexcept {
    +  return std::forward(*this).get().get(out);
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline document::operator array() & noexcept(false) { return get_array(); }
    +simdjson_inline document::operator object() & noexcept(false) { return get_object(); }
    +simdjson_inline document::operator uint64_t() noexcept(false) { return get_uint64(); }
    +simdjson_inline document::operator int64_t() noexcept(false) { return get_int64(); }
    +simdjson_inline document::operator double() noexcept(false) { return get_double(); }
    +simdjson_inline document::operator std::string_view() noexcept(false) { return get_string(false); }
    +simdjson_inline document::operator raw_json_string() noexcept(false) { return get_raw_json_string(); }
    +simdjson_inline document::operator bool() noexcept(false) { return get_bool(); }
    +simdjson_inline document::operator value() noexcept(false) { return get_value(); }
    +
    +#endif
    +simdjson_inline simdjson_result document::count_elements() & noexcept {
    +  auto a = get_array();
    +  simdjson_result answer = a.count_elements();
    +  /* If there was an array, we are now left pointing at its first element. */
    +  if(answer.error() == SUCCESS) { rewind(); }
    +  return answer;
    +}
    +simdjson_inline simdjson_result document::count_fields() & noexcept {
    +  auto a = get_object();
    +  simdjson_result answer = a.count_fields();
    +  /* If there was an object, we are now left pointing at its first element. */
    +  if(answer.error() == SUCCESS) { rewind(); }
    +  return answer;
    +}
    +simdjson_inline simdjson_result document::at(size_t index) & noexcept {
    +  auto a = get_array();
    +  return a.at(index);
    +}
    +simdjson_inline simdjson_result document::begin() & noexcept {
    +  return get_array().begin();
    +}
    +simdjson_inline simdjson_result document::end() & noexcept {
    +  return {};
    +}
    +
    +simdjson_inline simdjson_result document::find_field(std::string_view key) & noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +simdjson_inline simdjson_result document::find_field(const char *key) & noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +simdjson_inline simdjson_result document::find_field_unordered(std::string_view key) & noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result document::find_field_unordered(const char *key) & noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result document::operator[](std::string_view key) & noexcept {
    +  return start_or_resume_object()[key];
    +}
    +simdjson_inline simdjson_result document::operator[](const char *key) & noexcept {
    +  return start_or_resume_object()[key];
    +}
    +
    +simdjson_inline error_code document::consume() noexcept {
    +  auto error = iter.skip_child(0);
    +  if(error) { iter.abandon(); }
    +  return error;
    +}
    +
    +simdjson_inline simdjson_result document::raw_json() noexcept {
    +  auto _iter = get_root_value_iterator();
    +  const uint8_t * starting_point{_iter.peek_start()};
    +  auto error = consume();
    +  if(error) { return error; }
    +  // After 'consume()', we could be left pointing just beyond the document, but that
    +  // is ok because we are not going to dereference the final pointer position, we just
    +  // use it to compute the length in bytes.
    +  const uint8_t * final_point{iter.unsafe_pointer()};
    +  return std::string_view(reinterpret_cast(starting_point), size_t(final_point - starting_point));
    +}
    +
    +simdjson_inline simdjson_result document::type() noexcept {
    +  return get_root_value_iterator().type();
    +}
    +
    +simdjson_inline simdjson_result document::is_scalar() noexcept {
    +  json_type this_type;
    +  auto error = type().get(this_type);
    +  if(error) { return error; }
    +  return ! ((this_type == json_type::array) || (this_type == json_type::object));
    +}
    +
    +simdjson_inline bool document::is_negative() noexcept {
    +  return get_root_value_iterator().is_root_negative();
    +}
    +
    +simdjson_inline simdjson_result document::is_integer() noexcept {
    +  return get_root_value_iterator().is_root_integer(true);
    +}
    +
    +simdjson_inline simdjson_result document::get_number_type() noexcept {
    +  return get_root_value_iterator().get_root_number_type(true);
    +}
    +
    +simdjson_inline simdjson_result document::get_number() noexcept {
    +  return get_root_value_iterator().get_root_number(true);
    +}
    +
    +
    +simdjson_inline simdjson_result document::raw_json_token() noexcept {
    +  auto _iter = get_root_value_iterator();
    +  return std::string_view(reinterpret_cast(_iter.peek_start()), _iter.peek_start_length());
    +}
    +
    +simdjson_inline simdjson_result document::at_pointer(std::string_view json_pointer) noexcept {
    +  rewind(); // Rewind the document each time at_pointer is called
    +  if (json_pointer.empty()) {
    +    return this->get_value();
    +  }
    +  json_type t;
    +  SIMDJSON_TRY(type().get(t));
    +  switch (t)
    +  {
    +    case json_type::array:
    +      return (*this).get_array().at_pointer(json_pointer);
    +    case json_type::object:
    +      return (*this).get_object().at_pointer(json_pointer);
    +    default:
    +      return INVALID_JSON_POINTER;
    +  }
    +}
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  ppc64::ondemand::document &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      error
    +    )
    +{
    +}
    +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline error_code simdjson_result::rewind() noexcept {
    +  if (error()) { return error(); }
    +  first.rewind();
    +  return SUCCESS;
    +}
    +simdjson_inline simdjson_result simdjson_result::begin() & noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() & noexcept {
    +  return {};
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_array();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_object();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_bool();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_value() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_value();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_null() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_null();
    +}
    +
    +template
    +simdjson_inline simdjson_result simdjson_result::get() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get();
    +}
    +template
    +simdjson_inline simdjson_result simdjson_result::get() && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).get();
    +}
    +template
    +simdjson_inline error_code simdjson_result::get(T &out) & noexcept {
    +  if (error()) { return error(); }
    +  return first.get(out);
    +}
    +template
    +simdjson_inline error_code simdjson_result::get(T &out) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).get(out);
    +}
    +
    +template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete;
    +template<> simdjson_inline simdjson_result simdjson_result::get() && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first);
    +}
    +template<> simdjson_inline error_code simdjson_result::get(ppc64::ondemand::document &out) & noexcept = delete;
    +template<> simdjson_inline error_code simdjson_result::get(ppc64::ondemand::document &out) && noexcept {
    +  if (error()) { return error(); }
    +  out = std::forward(first);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::type() noexcept {
    +  if (error()) { return error(); }
    +  return first.type();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_scalar();
    +}
    +
    +
    +simdjson_inline bool simdjson_result::is_negative() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_negative();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_integer();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number_type();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::get_number() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number();
    +}
    +
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline simdjson_result::operator ppc64::ondemand::array() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator ppc64::ondemand::object() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator int64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator double() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator ppc64::ondemand::raw_json_string() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator bool() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator ppc64::ondemand::value() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +#endif
    +
    +
    +simdjson_inline simdjson_result simdjson_result::current_location() noexcept {
    +  if (error()) { return error(); }
    +  return first.current_location();
    +}
    +
    +simdjson_inline bool simdjson_result::at_end() const noexcept {
    +  if (error()) { return error(); }
    +  return first.at_end();
    +}
    +
    +
    +simdjson_inline int32_t simdjson_result::current_depth() const noexcept {
    +  if (error()) { return error(); }
    +  return first.current_depth();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json_token();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +
    +} // namespace simdjson
    +
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +simdjson_inline document_reference::document_reference() noexcept : doc{nullptr} {}
    +simdjson_inline document_reference::document_reference(document &d) noexcept : doc(&d) {}
    +simdjson_inline void document_reference::rewind() noexcept { doc->rewind(); }
    +simdjson_inline simdjson_result document_reference::get_array() & noexcept { return doc->get_array(); }
    +simdjson_inline simdjson_result document_reference::get_object() & noexcept { return doc->get_object(); }
    +/**
    + * The document_reference instances are used primarily/solely for streams of JSON
    + * documents.
    + * We decided that calling 'get_double()' on the JSON document '1.233 blabla' should
    + * give an error, so we check for trailing content.
    + *
    + * However, for streams of JSON documents, we want to be able to start from
    + * "321" "321" "321"
    + * and parse it successfully as a stream of JSON documents, calling get_uint64_in_string()
    + * successfully each time.
    + *
    + * To achieve this result, we pass a 'false' to a get_root_value_iterator() method:
    + * this indicates that we allow trailing content.
    + */
    +simdjson_inline simdjson_result document_reference::get_uint64() noexcept { return doc->get_root_value_iterator().get_root_uint64(false); }
    +simdjson_inline simdjson_result document_reference::get_uint64_in_string() noexcept { return doc->get_root_value_iterator().get_root_uint64_in_string(false); }
    +simdjson_inline simdjson_result document_reference::get_int64() noexcept { return doc->get_root_value_iterator().get_root_int64(false); }
    +simdjson_inline simdjson_result document_reference::get_int64_in_string() noexcept { return doc->get_root_value_iterator().get_root_int64_in_string(false); }
    +simdjson_inline simdjson_result document_reference::get_double() noexcept { return doc->get_root_value_iterator().get_root_double(false); }
    +simdjson_inline simdjson_result document_reference::get_double_in_string() noexcept { return doc->get_root_value_iterator().get_root_double(false); }
    +simdjson_inline simdjson_result document_reference::get_string(bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(false, allow_replacement); }
    +template 
    +simdjson_inline error_code document_reference::get_string(string_type& receiver, bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(receiver, false, allow_replacement); }
    +simdjson_inline simdjson_result document_reference::get_wobbly_string() noexcept { return doc->get_root_value_iterator().get_root_wobbly_string(false); }
    +simdjson_inline simdjson_result document_reference::get_raw_json_string() noexcept { return doc->get_root_value_iterator().get_root_raw_json_string(false); }
    +simdjson_inline simdjson_result document_reference::get_bool() noexcept { return doc->get_root_value_iterator().get_root_bool(false); }
    +simdjson_inline simdjson_result document_reference::get_value() noexcept { return doc->get_value(); }
    +simdjson_inline simdjson_result document_reference::is_null() noexcept { return doc->get_root_value_iterator().is_root_null(false); }
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline document_reference::operator array() & noexcept(false) { return array(*doc); }
    +simdjson_inline document_reference::operator object() & noexcept(false) { return object(*doc); }
    +simdjson_inline document_reference::operator uint64_t() noexcept(false) { return get_uint64(); }
    +simdjson_inline document_reference::operator int64_t() noexcept(false) { return get_int64(); }
    +simdjson_inline document_reference::operator double() noexcept(false) { return get_double(); }
    +simdjson_inline document_reference::operator std::string_view() noexcept(false) { return std::string_view(*doc); }
    +simdjson_inline document_reference::operator raw_json_string() noexcept(false) { return raw_json_string(*doc); }
    +simdjson_inline document_reference::operator bool() noexcept(false) { return get_bool(); }
    +simdjson_inline document_reference::operator value() noexcept(false) { return value(*doc); }
    +#endif
    +simdjson_inline simdjson_result document_reference::count_elements() & noexcept { return doc->count_elements(); }
    +simdjson_inline simdjson_result document_reference::count_fields() & noexcept { return doc->count_fields(); }
    +simdjson_inline simdjson_result document_reference::at(size_t index) & noexcept { return doc->at(index); }
    +simdjson_inline simdjson_result document_reference::begin() & noexcept { return doc->begin(); }
    +simdjson_inline simdjson_result document_reference::end() & noexcept { return doc->end(); }
    +simdjson_inline simdjson_result document_reference::find_field(std::string_view key) & noexcept { return doc->find_field(key); }
    +simdjson_inline simdjson_result document_reference::find_field(const char *key) & noexcept { return doc->find_field(key); }
    +simdjson_inline simdjson_result document_reference::operator[](std::string_view key) & noexcept { return (*doc)[key]; }
    +simdjson_inline simdjson_result document_reference::operator[](const char *key) & noexcept { return (*doc)[key]; }
    +simdjson_inline simdjson_result document_reference::find_field_unordered(std::string_view key) & noexcept { return doc->find_field_unordered(key); }
    +simdjson_inline simdjson_result document_reference::find_field_unordered(const char *key) & noexcept { return doc->find_field_unordered(key); }
    +simdjson_inline simdjson_result document_reference::type() noexcept { return doc->type(); }
    +simdjson_inline simdjson_result document_reference::is_scalar() noexcept { return doc->is_scalar(); }
    +simdjson_inline simdjson_result document_reference::current_location() noexcept { return doc->current_location(); }
    +simdjson_inline int32_t document_reference::current_depth() const noexcept { return doc->current_depth(); }
    +simdjson_inline bool document_reference::is_negative() noexcept { return doc->is_negative(); }
    +simdjson_inline simdjson_result document_reference::is_integer() noexcept { return doc->get_root_value_iterator().is_root_integer(false); }
    +simdjson_inline simdjson_result document_reference::get_number_type() noexcept { return doc->get_root_value_iterator().get_root_number_type(false); }
    +simdjson_inline simdjson_result document_reference::get_number() noexcept { return doc->get_root_value_iterator().get_root_number(false); }
    +simdjson_inline simdjson_result document_reference::raw_json_token() noexcept { return doc->raw_json_token(); }
    +simdjson_inline simdjson_result document_reference::at_pointer(std::string_view json_pointer) noexcept { return doc->at_pointer(json_pointer); }
    +simdjson_inline simdjson_result document_reference::raw_json() noexcept { return doc->raw_json();}
    +simdjson_inline document_reference::operator document&() const noexcept { return *doc; }
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +
    +
    +namespace simdjson {
    +simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::document_reference value, error_code error)
    +  noexcept : implementation_simdjson_result_base(std::forward(value), error) {}
    +
    +
    +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline error_code simdjson_result::rewind() noexcept {
    +  if (error()) { return error(); }
    +  first.rewind();
    +  return SUCCESS;
    +}
    +simdjson_inline simdjson_result simdjson_result::begin() & noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() & noexcept {
    +  return {};
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_array();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_object();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_bool();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_value() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_value();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_null() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_null();
    +}
    +simdjson_inline simdjson_result simdjson_result::type() noexcept {
    +  if (error()) { return error(); }
    +  return first.type();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_scalar();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_negative() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_negative();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_integer();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number_type();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number();
    +}
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline simdjson_result::operator ppc64::ondemand::array() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator ppc64::ondemand::object() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator int64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator double() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator ppc64::ondemand::raw_json_string() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator bool() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator ppc64::ondemand::value() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +#endif
    +
    +simdjson_inline simdjson_result simdjson_result::current_location() noexcept {
    +  if (error()) { return error(); }
    +  return first.current_location();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json_token();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H
    +/* end file simdjson/generic/ondemand/document-inl.h for ppc64 */
    +/* including simdjson/generic/ondemand/document_stream-inl.h for ppc64: #include "simdjson/generic/ondemand/document_stream-inl.h" */
    +/* begin file simdjson/generic/ondemand/document_stream-inl.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document_stream.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +
    +inline void stage1_worker::finish() {
    +  // After calling "run" someone would call finish() to wait
    +  // for the end of the processing.
    +  // This function will wait until either the thread has done
    +  // the processing or, else, the destructor has been called.
    +  std::unique_lock lock(locking_mutex);
    +  cond_var.wait(lock, [this]{return has_work == false;});
    +}
    +
    +inline stage1_worker::~stage1_worker() {
    +  // The thread may never outlive the stage1_worker instance
    +  // and will always be stopped/joined before the stage1_worker
    +  // instance is gone.
    +  stop_thread();
    +}
    +
    +inline void stage1_worker::start_thread() {
    +  std::unique_lock lock(locking_mutex);
    +  if(thread.joinable()) {
    +    return; // This should never happen but we never want to create more than one thread.
    +  }
    +  thread = std::thread([this]{
    +      while(true) {
    +        std::unique_lock thread_lock(locking_mutex);
    +        // We wait for either "run" or "stop_thread" to be called.
    +        cond_var.wait(thread_lock, [this]{return has_work || !can_work;});
    +        // If, for some reason, the stop_thread() method was called (i.e., the
    +        // destructor of stage1_worker is called, then we want to immediately destroy
    +        // the thread (and not do any more processing).
    +        if(!can_work) {
    +          break;
    +        }
    +        this->owner->stage1_thread_error = this->owner->run_stage1(*this->stage1_thread_parser,
    +              this->_next_batch_start);
    +        this->has_work = false;
    +        // The condition variable call should be moved after thread_lock.unlock() for performance
    +        // reasons but thread sanitizers may report it as a data race if we do.
    +        // See https://stackoverflow.com/questions/35775501/c-should-condition-variable-be-notified-under-lock
    +        cond_var.notify_one(); // will notify "finish"
    +        thread_lock.unlock();
    +      }
    +    }
    +  );
    +}
    +
    +
    +inline void stage1_worker::stop_thread() {
    +  std::unique_lock lock(locking_mutex);
    +  // We have to make sure that all locks can be released.
    +  can_work = false;
    +  has_work = false;
    +  cond_var.notify_all();
    +  lock.unlock();
    +  if(thread.joinable()) {
    +    thread.join();
    +  }
    +}
    +
    +inline void stage1_worker::run(document_stream * ds, parser * stage1, size_t next_batch_start) {
    +  std::unique_lock lock(locking_mutex);
    +  owner = ds;
    +  _next_batch_start = next_batch_start;
    +  stage1_thread_parser = stage1;
    +  has_work = true;
    +  // The condition variable call should be moved after thread_lock.unlock() for performance
    +  // reasons but thread sanitizers may report it as a data race if we do.
    +  // See https://stackoverflow.com/questions/35775501/c-should-condition-variable-be-notified-under-lock
    +  cond_var.notify_one(); // will notify the thread lock that we have work
    +  lock.unlock();
    +}
    +
    +#endif  // SIMDJSON_THREADS_ENABLED
    +
    +simdjson_inline document_stream::document_stream(
    +  ondemand::parser &_parser,
    +  const uint8_t *_buf,
    +  size_t _len,
    +  size_t _batch_size,
    +  bool _allow_comma_separated
    +) noexcept
    +  : parser{&_parser},
    +    buf{_buf},
    +    len{_len},
    +    batch_size{_batch_size <= MINIMAL_BATCH_SIZE ? MINIMAL_BATCH_SIZE : _batch_size},
    +    allow_comma_separated{_allow_comma_separated},
    +    error{SUCCESS}
    +    #ifdef SIMDJSON_THREADS_ENABLED
    +    , use_thread(_parser.threaded) // we need to make a copy because _parser.threaded can change
    +    #endif
    +{
    +#ifdef SIMDJSON_THREADS_ENABLED
    +  if(worker.get() == nullptr) {
    +    error = MEMALLOC;
    +  }
    +#endif
    +}
    +
    +simdjson_inline document_stream::document_stream() noexcept
    +  : parser{nullptr},
    +    buf{nullptr},
    +    len{0},
    +    batch_size{0},
    +    allow_comma_separated{false},
    +    error{UNINITIALIZED}
    +    #ifdef SIMDJSON_THREADS_ENABLED
    +    , use_thread(false)
    +    #endif
    +{
    +}
    +
    +simdjson_inline document_stream::~document_stream() noexcept
    +{
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  worker.reset();
    +  #endif
    +}
    +
    +inline size_t document_stream::size_in_bytes() const noexcept {
    +  return len;
    +}
    +
    +inline size_t document_stream::truncated_bytes() const noexcept {
    +  if(error == CAPACITY) { return len - batch_start; }
    +  return parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] - parser->implementation->structural_indexes[parser->implementation->n_structural_indexes + 1];
    +}
    +
    +simdjson_inline document_stream::iterator::iterator() noexcept
    +  : stream{nullptr}, finished{true} {
    +}
    +
    +simdjson_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept
    +  : stream{_stream}, finished{is_end} {
    +}
    +
    +simdjson_inline simdjson_result document_stream::iterator::operator*() noexcept {
    +  //if(stream->error) { return stream->error; }
    +  return simdjson_result(stream->doc, stream->error);
    +}
    +
    +simdjson_inline document_stream::iterator& document_stream::iterator::operator++() noexcept {
    +  // If there is an error, then we want the iterator
    +  // to be finished, no matter what. (E.g., we do not
    +  // keep generating documents with errors, or go beyond
    +  // a document with errors.)
    +  //
    +  // Users do not have to call "operator*()" when they use operator++,
    +  // so we need to end the stream in the operator++ function.
    +  //
    +  // Note that setting finished = true is essential otherwise
    +  // we would enter an infinite loop.
    +  if (stream->error) { finished = true; }
    +  // Note that stream->error() is guarded against error conditions
    +  // (it will immediately return if stream->error casts to false).
    +  // In effect, this next function does nothing when (stream->error)
    +  // is true (hence the risk of an infinite loop).
    +  stream->next();
    +  // If that was the last document, we're finished.
    +  // It is the only type of error we do not want to appear
    +  // in operator*.
    +  if (stream->error == EMPTY) { finished = true; }
    +  // If we had any other kind of error (not EMPTY) then we want
    +  // to pass it along to the operator* and we cannot mark the result
    +  // as "finished" just yet.
    +  return *this;
    +}
    +
    +simdjson_inline bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept {
    +  return finished != other.finished;
    +}
    +
    +simdjson_inline document_stream::iterator document_stream::begin() noexcept {
    +  start();
    +  // If there are no documents, we're finished.
    +  return iterator(this, error == EMPTY);
    +}
    +
    +simdjson_inline document_stream::iterator document_stream::end() noexcept {
    +  return iterator(this, true);
    +}
    +
    +inline void document_stream::start() noexcept {
    +  if (error) { return; }
    +  error = parser->allocate(batch_size);
    +  if (error) { return; }
    +  // Always run the first stage 1 parse immediately
    +  batch_start = 0;
    +  error = run_stage1(*parser, batch_start);
    +  while(error == EMPTY) {
    +    // In exceptional cases, we may start with an empty block
    +    batch_start = next_batch_start();
    +    if (batch_start >= len) { return; }
    +    error = run_stage1(*parser, batch_start);
    +  }
    +  if (error) { return; }
    +  doc_index = batch_start;
    +  doc = document(json_iterator(&buf[batch_start], parser));
    +  doc.iter._streaming = true;
    +
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  if (use_thread && next_batch_start() < len) {
    +    // Kick off the first thread on next batch if needed
    +    error = stage1_thread_parser.allocate(batch_size);
    +    if (error) { return; }
    +    worker->start_thread();
    +    start_stage1_thread();
    +    if (error) { return; }
    +  }
    +  #endif // SIMDJSON_THREADS_ENABLED
    +}
    +
    +inline void document_stream::next() noexcept {
    +  // We always enter at once once in an error condition.
    +  if (error) { return; }
    +  next_document();
    +  if (error) { return; }
    +  auto cur_struct_index = doc.iter._root - parser->implementation->structural_indexes.get();
    +  doc_index = batch_start + parser->implementation->structural_indexes[cur_struct_index];
    +
    +  // Check if at end of structural indexes (i.e. at end of batch)
    +  if(cur_struct_index >= static_cast(parser->implementation->n_structural_indexes)) {
    +    error = EMPTY;
    +    // Load another batch (if available)
    +    while (error == EMPTY) {
    +      batch_start = next_batch_start();
    +      if (batch_start >= len) { break; }
    +      #ifdef SIMDJSON_THREADS_ENABLED
    +      if(use_thread) {
    +        load_from_stage1_thread();
    +      } else {
    +        error = run_stage1(*parser, batch_start);
    +      }
    +      #else
    +      error = run_stage1(*parser, batch_start);
    +      #endif
    +      /**
    +       * Whenever we move to another window, we need to update all pointers to make
    +       * it appear as if the input buffer started at the beginning of the window.
    +       *
    +       * Take this input:
    +       *
    +       * {"z":5}  {"1":1,"2":2,"4":4} [7,  10,   9]  [15,  11,   12, 13]  [154,  110,   112, 1311]
    +       *
    +       * Say you process the following window...
    +       *
    +       * '{"z":5}  {"1":1,"2":2,"4":4} [7,  10,   9]'
    +       *
    +       * When you do so, the json_iterator has a pointer at the beginning of the memory region
    +       * (pointing at the beginning of '{"z"...'.
    +       *
    +       * When you move to the window that starts at...
    +       *
    +       * '[7,  10,   9]  [15,  11,   12, 13] ...
    +       *
    +       * then it is not sufficient to just run stage 1. You also need to re-anchor the
    +       * json_iterator so that it believes we are starting at '[7,  10,   9]...'.
    +       *
    +       * Under the DOM front-end, this gets done automatically because the parser owns
    +       * the pointer the data, and when you call stage1 and then stage2 on the same
    +       * parser, then stage2 will run on the pointer acquired by stage1.
    +       *
    +       * That is, stage1 calls "this->buf = _buf" so the parser remembers the buffer that
    +       * we used. But json_iterator has no callback when stage1 is called on the parser.
    +       * In fact, I think that the parser is unaware of json_iterator.
    +       *
    +       *
    +       * So we need to re-anchor the json_iterator after each call to stage 1 so that
    +       * all of the pointers are in sync.
    +       */
    +      doc.iter = json_iterator(&buf[batch_start], parser);
    +      doc.iter._streaming = true;
    +      /**
    +       * End of resync.
    +       */
    +
    +      if (error) { continue; } // If the error was EMPTY, we may want to load another batch.
    +      doc_index = batch_start;
    +    }
    +  }
    +}
    +
    +inline void document_stream::next_document() noexcept {
    +  // Go to next place where depth=0 (document depth)
    +  error = doc.iter.skip_child(0);
    +  if (error) { return; }
    +  // Always set depth=1 at the start of document
    +  doc.iter._depth = 1;
    +  // consume comma if comma separated is allowed
    +  if (allow_comma_separated) { doc.iter.consume_character(','); }
    +  // Resets the string buffer at the beginning, thus invalidating the strings.
    +  doc.iter._string_buf_loc = parser->string_buf.get();
    +  doc.iter._root = doc.iter.position();
    +}
    +
    +inline size_t document_stream::next_batch_start() const noexcept {
    +  return batch_start + parser->implementation->structural_indexes[parser->implementation->n_structural_indexes];
    +}
    +
    +inline error_code document_stream::run_stage1(ondemand::parser &p, size_t _batch_start) noexcept {
    +  // This code only updates the structural index in the parser, it does not update any json_iterator
    +  // instance.
    +  size_t remaining = len - _batch_start;
    +  if (remaining <= batch_size) {
    +    return p.implementation->stage1(&buf[_batch_start], remaining, stage1_mode::streaming_final);
    +  } else {
    +    return p.implementation->stage1(&buf[_batch_start], batch_size, stage1_mode::streaming_partial);
    +  }
    +}
    +
    +simdjson_inline size_t document_stream::iterator::current_index() const noexcept {
    +  return stream->doc_index;
    +}
    +
    +simdjson_inline std::string_view document_stream::iterator::source() const noexcept {
    +  auto depth = stream->doc.iter.depth();
    +  auto cur_struct_index = stream->doc.iter._root - stream->parser->implementation->structural_indexes.get();
    +
    +  // If at root, process the first token to determine if scalar value
    +  if (stream->doc.iter.at_root()) {
    +    switch (stream->buf[stream->batch_start + stream->parser->implementation->structural_indexes[cur_struct_index]]) {
    +      case '{': case '[':   // Depth=1 already at start of document
    +        break;
    +      case '}': case ']':
    +        depth--;
    +        break;
    +      default:    // Scalar value document
    +        // TODO: Remove any trailing whitespaces
    +        // This returns a string spanning from start of value to the beginning of the next document (excluded)
    +        return std::string_view(reinterpret_cast(stream->buf) + current_index(), stream->parser->implementation->structural_indexes[++cur_struct_index] - current_index() - 1);
    +    }
    +    cur_struct_index++;
    +  }
    +
    +  while (cur_struct_index <= static_cast(stream->parser->implementation->n_structural_indexes)) {
    +    switch (stream->buf[stream->batch_start + stream->parser->implementation->structural_indexes[cur_struct_index]]) {
    +      case '{': case '[':
    +        depth++;
    +        break;
    +      case '}': case ']':
    +        depth--;
    +        break;
    +    }
    +    if (depth == 0) { break; }
    +    cur_struct_index++;
    +  }
    +
    +  return std::string_view(reinterpret_cast(stream->buf) + current_index(), stream->parser->implementation->structural_indexes[cur_struct_index] - current_index() + stream->batch_start + 1);;
    +}
    +
    +inline error_code document_stream::iterator::error() const noexcept {
    +  return stream->error;
    +}
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +
    +inline void document_stream::load_from_stage1_thread() noexcept {
    +  worker->finish();
    +  // Swap to the parser that was loaded up in the thread. Make sure the parser has
    +  // enough memory to swap to, as well.
    +  std::swap(stage1_thread_parser,*parser);
    +  error = stage1_thread_error;
    +  if (error) { return; }
    +
    +  // If there's anything left, start the stage 1 thread!
    +  if (next_batch_start() < len) {
    +    start_stage1_thread();
    +  }
    +}
    +
    +inline void document_stream::start_stage1_thread() noexcept {
    +  // we call the thread on a lambda that will update
    +  // this->stage1_thread_error
    +  // there is only one thread that may write to this value
    +  // TODO this is NOT exception-safe.
    +  this->stage1_thread_error = UNINITIALIZED; // In case something goes wrong, make sure it's an error
    +  size_t _next_batch_start = this->next_batch_start();
    +
    +  worker->run(this, & this->stage1_thread_parser, _next_batch_start);
    +}
    +
    +#endif // SIMDJSON_THREADS_ENABLED
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(error)
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  ppc64::ondemand::document_stream &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +
    +}
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H
    +/* end file simdjson/generic/ondemand/document_stream-inl.h for ppc64 */
    +/* including simdjson/generic/ondemand/field-inl.h for ppc64: #include "simdjson/generic/ondemand/field-inl.h" */
    +/* begin file simdjson/generic/ondemand/field-inl.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/field.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +// clang 6 doesn't think the default constructor can be noexcept, so we make it explicit
    +simdjson_inline field::field() noexcept : std::pair() {}
    +
    +simdjson_inline field::field(raw_json_string key, ondemand::value &&value) noexcept
    +  : std::pair(key, std::forward(value))
    +{
    +}
    +
    +simdjson_inline simdjson_result field::start(value_iterator &parent_iter) noexcept {
    +  raw_json_string key;
    +  SIMDJSON_TRY( parent_iter.field_key().get(key) );
    +  SIMDJSON_TRY( parent_iter.field_value() );
    +  return field::start(parent_iter, key);
    +}
    +
    +simdjson_inline simdjson_result field::start(const value_iterator &parent_iter, raw_json_string key) noexcept {
    +    return field(key, parent_iter.child());
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result field::unescaped_key(bool allow_replacement) noexcept {
    +  SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() but Visual Studio won't let us.
    +  simdjson_result answer = first.unescape(second.iter.json_iter(), allow_replacement);
    +  first.consume();
    +  return answer;
    +}
    +
    +simdjson_inline raw_json_string field::key() const noexcept {
    +  SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() by Visual Studio won't let us.
    +  return first;
    +}
    +
    +simdjson_inline value &field::value() & noexcept {
    +  return second;
    +}
    +
    +simdjson_inline value field::value() && noexcept {
    +  return std::forward(*this).second;
    +}
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  ppc64::ondemand::field &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::key() noexcept {
    +  if (error()) { return error(); }
    +  return first.key();
    +}
    +simdjson_inline simdjson_result simdjson_result::unescaped_key(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.unescaped_key(allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::value() noexcept {
    +  if (error()) { return error(); }
    +  return std::move(first.value());
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H
    +/* end file simdjson/generic/ondemand/field-inl.h for ppc64 */
    +/* including simdjson/generic/ondemand/json_iterator-inl.h for ppc64: #include "simdjson/generic/ondemand/json_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/json_iterator-inl.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/logger-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/token_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept
    +  : token(std::forward(other.token)),
    +    parser{other.parser},
    +    _string_buf_loc{other._string_buf_loc},
    +    error{other.error},
    +    _depth{other._depth},
    +    _root{other._root},
    +    _streaming{other._streaming}
    +{
    +  other.parser = nullptr;
    +}
    +simdjson_inline json_iterator &json_iterator::operator=(json_iterator &&other) noexcept {
    +  token = other.token;
    +  parser = other.parser;
    +  _string_buf_loc = other._string_buf_loc;
    +  error = other.error;
    +  _depth = other._depth;
    +  _root = other._root;
    +  _streaming = other._streaming;
    +  other.parser = nullptr;
    +  return *this;
    +}
    +
    +simdjson_inline json_iterator::json_iterator(const uint8_t *buf, ondemand::parser *_parser) noexcept
    +  : token(buf, &_parser->implementation->structural_indexes[0]),
    +    parser{_parser},
    +    _string_buf_loc{parser->string_buf.get()},
    +    _depth{1},
    +    _root{parser->implementation->structural_indexes.get()},
    +    _streaming{false}
    +
    +{
    +  logger::log_headers();
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens();
    +#endif
    +}
    +
    +inline void json_iterator::rewind() noexcept {
    +  token.set_position( root_position() );
    +  logger::log_headers(); // We start again
    +  _string_buf_loc = parser->string_buf.get();
    +  _depth = 1;
    +}
    +
    +inline bool json_iterator::balanced() const noexcept {
    +  token_iterator ti(token);
    +  int32_t count{0};
    +  ti.set_position( root_position() );
    +  while(ti.peek() <= peek_last()) {
    +    switch (*ti.return_current_and_advance())
    +    {
    +    case '[': case '{':
    +      count++;
    +      break;
    +    case ']': case '}':
    +      count--;
    +      break;
    +    default:
    +      break;
    +    }
    +  }
    +  return count == 0;
    +}
    +
    +
    +// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller
    +// relating depth and parent_depth, which is a desired effect. The warning does not show up if the
    +// skip_child() function is not marked inline).
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_warn_unused simdjson_inline error_code json_iterator::skip_child(depth_t parent_depth) noexcept {
    +  if (depth() <= parent_depth) { return SUCCESS; }
    +  switch (*return_current_and_advance()) {
    +    // TODO consider whether matching braces is a requirement: if non-matching braces indicates
    +    // *missing* braces, then future lookups are not in the object/arrays they think they are,
    +    // violating the rule "validate enough structure that the user can be confident they are
    +    // looking at the right values."
    +    // PERF TODO we can eliminate the switch here with a lookup of how much to add to depth
    +
    +    // For the first open array/object in a value, we've already incremented depth, so keep it the same
    +    // We never stop at colon, but if we did, it wouldn't affect depth
    +    case '[': case '{': case ':':
    +      logger::log_start_value(*this, "skip");
    +      break;
    +    // If there is a comma, we have just finished a value in an array/object, and need to get back in
    +    case ',':
    +      logger::log_value(*this, "skip");
    +      break;
    +    // ] or } means we just finished a value and need to jump out of the array/object
    +    case ']': case '}':
    +      logger::log_end_value(*this, "skip");
    +      _depth--;
    +      if (depth() <= parent_depth) { return SUCCESS; }
    +#if SIMDJSON_CHECK_EOF
    +      // If there are no more tokens, the parent is incomplete.
    +      if (at_end()) { return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "Missing [ or { at start"); }
    +#endif // SIMDJSON_CHECK_EOF
    +      break;
    +    case '"':
    +      if(*peek() == ':') {
    +        // We are at a key!!!
    +        // This might happen if you just started an object and you skip it immediately.
    +        // Performance note: it would be nice to get rid of this check as it is somewhat
    +        // expensive.
    +        // https://github.com/simdjson/simdjson/issues/1742
    +        logger::log_value(*this, "key");
    +        return_current_and_advance(); // eat up the ':'
    +        break; // important!!!
    +      }
    +      simdjson_fallthrough;
    +    // Anything else must be a scalar value
    +    default:
    +      // For the first scalar, we will have incremented depth already, so we decrement it here.
    +      logger::log_value(*this, "skip");
    +      _depth--;
    +      if (depth() <= parent_depth) { return SUCCESS; }
    +      break;
    +  }
    +
    +  // Now that we've considered the first value, we only increment/decrement for arrays/objects
    +  while (position() < end_position()) {
    +    switch (*return_current_and_advance()) {
    +      case '[': case '{':
    +        logger::log_start_value(*this, "skip");
    +        _depth++;
    +        break;
    +      // TODO consider whether matching braces is a requirement: if non-matching braces indicates
    +      // *missing* braces, then future lookups are not in the object/arrays they think they are,
    +      // violating the rule "validate enough structure that the user can be confident they are
    +      // looking at the right values."
    +      // PERF TODO we can eliminate the switch here with a lookup of how much to add to depth
    +      case ']': case '}':
    +        logger::log_end_value(*this, "skip");
    +        _depth--;
    +        if (depth() <= parent_depth) { return SUCCESS; }
    +        break;
    +      default:
    +        logger::log_value(*this, "skip", "");
    +        break;
    +    }
    +  }
    +
    +  return report_error(TAPE_ERROR, "not enough close braces");
    +}
    +
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_inline bool json_iterator::at_root() const noexcept {
    +  return position() == root_position();
    +}
    +
    +simdjson_inline bool json_iterator::is_single_token() const noexcept {
    +  return parser->implementation->n_structural_indexes == 1;
    +}
    +
    +simdjson_inline bool json_iterator::streaming() const noexcept {
    +  return _streaming;
    +}
    +
    +simdjson_inline token_position json_iterator::root_position() const noexcept {
    +  return _root;
    +}
    +
    +simdjson_inline void json_iterator::assert_at_document_depth() const noexcept {
    +  SIMDJSON_ASSUME( _depth == 1 );
    +}
    +
    +simdjson_inline void json_iterator::assert_at_root() const noexcept {
    +  SIMDJSON_ASSUME( _depth == 1 );
    +#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
    +  // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument
    +  // has side effects that will be discarded.
    +  SIMDJSON_ASSUME( token.position() == _root );
    +#endif
    +}
    +
    +simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) const noexcept {
    +  assert_valid_position(token._position + required_tokens - 1);
    +}
    +
    +simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept {
    +#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
    +  SIMDJSON_ASSUME( position >= &parser->implementation->structural_indexes[0] );
    +  SIMDJSON_ASSUME( position < &parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] );
    +#endif
    +}
    +
    +simdjson_inline bool json_iterator::at_end() const noexcept {
    +  return position() == end_position();
    +}
    +simdjson_inline token_position json_iterator::end_position() const noexcept {
    +  uint32_t n_structural_indexes{parser->implementation->n_structural_indexes};
    +  return &parser->implementation->structural_indexes[n_structural_indexes];
    +}
    +
    +inline std::string json_iterator::to_string() const noexcept {
    +  if( !is_alive() ) { return "dead json_iterator instance"; }
    +  const char * current_structural = reinterpret_cast(token.peek());
    +  return std::string("json_iterator [ depth : ") + std::to_string(_depth)
    +          + std::string(", structural : '") + std::string(current_structural,1)
    +          + std::string("', offset : ") + std::to_string(token.current_offset())
    +          + std::string("', error : ") + error_message(error)
    +          + std::string(" ]");
    +}
    +
    +inline simdjson_result json_iterator::current_location() const noexcept {
    +  if (!is_alive()) {    // Unrecoverable error
    +    if (!at_root()) {
    +      return reinterpret_cast(token.peek(-1));
    +    } else {
    +      return reinterpret_cast(token.peek());
    +    }
    +  }
    +  if (at_end()) {
    +    return OUT_OF_BOUNDS;
    +  }
    +  return reinterpret_cast(token.peek());
    +}
    +
    +simdjson_inline bool json_iterator::is_alive() const noexcept {
    +  return parser;
    +}
    +
    +simdjson_inline void json_iterator::abandon() noexcept {
    +  parser = nullptr;
    +  _depth = 0;
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::return_current_and_advance() noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens();
    +#endif // SIMDJSON_CHECK_EOF
    +  return token.return_current_and_advance();
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::unsafe_pointer() const noexcept {
    +  // deliberately done without safety guard:
    +  return token.peek();
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::peek(int32_t delta) const noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens(delta+1);
    +#endif // SIMDJSON_CHECK_EOF
    +  return token.peek(delta);
    +}
    +
    +simdjson_inline uint32_t json_iterator::peek_length(int32_t delta) const noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens(delta+1);
    +#endif // #if SIMDJSON_CHECK_EOF
    +  return token.peek_length(delta);
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::peek(token_position position) const noexcept {
    +  // todo: currently we require end-of-string buffering, but the following
    +  // assert_valid_position should be turned on if/when we lift that condition.
    +  // assert_valid_position(position);
    +  // This is almost surely related to SIMDJSON_CHECK_EOF but given that SIMDJSON_CHECK_EOF
    +  // is ON by default, we have no choice but to disable it for real with a comment.
    +  return token.peek(position);
    +}
    +
    +simdjson_inline uint32_t json_iterator::peek_length(token_position position) const noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_valid_position(position);
    +#endif // SIMDJSON_CHECK_EOF
    +  return token.peek_length(position);
    +}
    +
    +simdjson_inline token_position json_iterator::last_position() const noexcept {
    +  // The following line fails under some compilers...
    +  // SIMDJSON_ASSUME(parser->implementation->n_structural_indexes > 0);
    +  // since it has side-effects.
    +  uint32_t n_structural_indexes{parser->implementation->n_structural_indexes};
    +  SIMDJSON_ASSUME(n_structural_indexes > 0);
    +  return &parser->implementation->structural_indexes[n_structural_indexes - 1];
    +}
    +simdjson_inline const uint8_t *json_iterator::peek_last() const noexcept {
    +  return token.peek(last_position());
    +}
    +
    +simdjson_inline void json_iterator::ascend_to(depth_t parent_depth) noexcept {
    +  SIMDJSON_ASSUME(parent_depth >= 0 && parent_depth < INT32_MAX - 1);
    +  SIMDJSON_ASSUME(_depth == parent_depth + 1);
    +  _depth = parent_depth;
    +}
    +
    +simdjson_inline void json_iterator::descend_to(depth_t child_depth) noexcept {
    +  SIMDJSON_ASSUME(child_depth >= 1 && child_depth < INT32_MAX);
    +  SIMDJSON_ASSUME(_depth == child_depth - 1);
    +  _depth = child_depth;
    +}
    +
    +simdjson_inline depth_t json_iterator::depth() const noexcept {
    +  return _depth;
    +}
    +
    +simdjson_inline uint8_t *&json_iterator::string_buf_loc() noexcept {
    +  return _string_buf_loc;
    +}
    +
    +simdjson_inline error_code json_iterator::report_error(error_code _error, const char *message) noexcept {
    +  SIMDJSON_ASSUME(_error != SUCCESS && _error != UNINITIALIZED && _error != INCORRECT_TYPE && _error != NO_SUCH_FIELD);
    +  logger::log_error(*this, message);
    +  error = _error;
    +  return error;
    +}
    +
    +simdjson_inline token_position json_iterator::position() const noexcept {
    +  return token.position();
    +}
    +
    +simdjson_inline simdjson_result json_iterator::unescape(raw_json_string in, bool allow_replacement) noexcept {
    +  return parser->unescape(in, _string_buf_loc, allow_replacement);
    +}
    +
    +simdjson_inline simdjson_result json_iterator::unescape_wobbly(raw_json_string in) noexcept {
    +  return parser->unescape_wobbly(in, _string_buf_loc);
    +}
    +
    +simdjson_inline void json_iterator::reenter_child(token_position position, depth_t child_depth) noexcept {
    +  SIMDJSON_ASSUME(child_depth >= 1 && child_depth < INT32_MAX);
    +  SIMDJSON_ASSUME(_depth == child_depth - 1);
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
    +  SIMDJSON_ASSUME(size_t(child_depth) < parser->max_depth());
    +  SIMDJSON_ASSUME(position >= parser->start_positions[child_depth]);
    +#endif
    +#endif
    +  token.set_position(position);
    +  _depth = child_depth;
    +}
    +
    +simdjson_inline error_code json_iterator::consume_character(char c) noexcept {
    +  if (*peek() == c) {
    +    return_current_and_advance();
    +    return SUCCESS;
    +  }
    +  return TAPE_ERROR;
    +}
    +
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +
    +simdjson_inline token_position json_iterator::start_position(depth_t depth) const noexcept {
    +  SIMDJSON_ASSUME(size_t(depth) < parser->max_depth());
    +  return size_t(depth) < parser->max_depth() ? parser->start_positions[depth] : 0;
    +}
    +
    +simdjson_inline void json_iterator::set_start_position(depth_t depth, token_position position) noexcept {
    +  SIMDJSON_ASSUME(size_t(depth) < parser->max_depth());
    +  if(size_t(depth) < parser->max_depth()) { parser->start_positions[depth] = position; }
    +}
    +
    +#endif
    +
    +
    +simdjson_inline error_code json_iterator::optional_error(error_code _error, const char *message) noexcept {
    +  SIMDJSON_ASSUME(_error == INCORRECT_TYPE || _error == NO_SUCH_FIELD);
    +  logger::log_error(*this, message);
    +  return _error;
    +}
    +
    +
    +simdjson_warn_unused simdjson_inline bool json_iterator::copy_to_buffer(const uint8_t *json, uint32_t max_len, uint8_t *tmpbuf, size_t N) noexcept {
    +  // This function is not expected to be called in performance-sensitive settings.
    +  // Let us guard against silly cases:
    +  if((N < max_len) || (N == 0)) { return false; }
    +  // Copy to the buffer.
    +  std::memcpy(tmpbuf, json, max_len);
    +  if(N > max_len) { // We pad whatever remains with ' '.
    +    std::memset(tmpbuf + max_len, ' ', N - max_len);
    +  }
    +  return true;
    +}
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::json_iterator &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/json_iterator-inl.h for ppc64 */
    +/* including simdjson/generic/ondemand/json_type-inl.h for ppc64: #include "simdjson/generic/ondemand/json_type-inl.h" */
    +/* begin file simdjson/generic/ondemand/json_type-inl.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +inline std::ostream& operator<<(std::ostream& out, json_type type) noexcept {
    +    switch (type) {
    +        case json_type::array: out << "array"; break;
    +        case json_type::object: out << "object"; break;
    +        case json_type::number: out << "number"; break;
    +        case json_type::string: out << "string"; break;
    +        case json_type::boolean: out << "boolean"; break;
    +        case json_type::null: out << "null"; break;
    +        default: SIMDJSON_UNREACHABLE();
    +    }
    +    return out;
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false) {
    +    return out << type.value();
    +}
    +#endif
    +
    +
    +
    +simdjson_inline number_type number::get_number_type() const noexcept {
    +  return type;
    +}
    +
    +simdjson_inline bool number::is_uint64() const noexcept {
    +  return get_number_type() == number_type::unsigned_integer;
    +}
    +
    +simdjson_inline uint64_t number::get_uint64() const noexcept {
    +  return payload.unsigned_integer;
    +}
    +
    +simdjson_inline number::operator uint64_t() const noexcept {
    +  return get_uint64();
    +}
    +
    +
    +simdjson_inline bool number::is_int64() const noexcept {
    +  return get_number_type() == number_type::signed_integer;
    +}
    +
    +simdjson_inline int64_t number::get_int64() const noexcept {
    +  return payload.signed_integer;
    +}
    +
    +simdjson_inline number::operator int64_t() const noexcept {
    +  return get_int64();
    +}
    +
    +simdjson_inline bool number::is_double() const noexcept {
    +    return get_number_type() == number_type::floating_point_number;
    +}
    +
    +simdjson_inline double number::get_double() const noexcept {
    +  return payload.floating_point_number;
    +}
    +
    +simdjson_inline number::operator double() const noexcept {
    +  return get_double();
    +}
    +
    +simdjson_inline double number::as_double() const noexcept {
    +  if(is_double()) {
    +    return payload.floating_point_number;
    +  }
    +  if(is_int64()) {
    +    return double(payload.signed_integer);
    +  }
    +  return double(payload.unsigned_integer);
    +}
    +
    +simdjson_inline void number::append_s64(int64_t value) noexcept {
    +  payload.signed_integer = value;
    +  type = number_type::signed_integer;
    +}
    +
    +simdjson_inline void number::append_u64(uint64_t value) noexcept {
    +  payload.unsigned_integer = value;
    +  type = number_type::unsigned_integer;
    +}
    +
    +simdjson_inline void number::append_double(double value) noexcept {
    +  payload.floating_point_number = value;
    +  type = number_type::floating_point_number;
    +}
    +
    +simdjson_inline void number::skip_double() noexcept {
    +  type = number_type::floating_point_number;
    +}
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::json_type &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H
    +/* end file simdjson/generic/ondemand/json_type-inl.h for ppc64 */
    +/* including simdjson/generic/ondemand/logger-inl.h for ppc64: #include "simdjson/generic/ondemand/logger-inl.h" */
    +/* begin file simdjson/generic/ondemand/logger-inl.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/logger.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +namespace logger {
    +
    +static constexpr const char * DASHES = "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------";
    +static constexpr const int LOG_EVENT_LEN = 20;
    +static constexpr const int LOG_BUFFER_LEN = 30;
    +static constexpr const int LOG_SMALL_BUFFER_LEN = 10;
    +static int log_depth = 0; // Not threadsafe. Log only.
    +
    +// Helper to turn unprintable or newline characters into spaces
    +static inline char printable_char(char c) {
    +  if (c >= 0x20) {
    +    return c;
    +  } else {
    +    return ' ';
    +  }
    +}
    +
    +template
    +static inline std::string string_format(const std::string& format, const Args&... args)
    +{
    +  SIMDJSON_PUSH_DISABLE_ALL_WARNINGS
    +  int size_s = std::snprintf(nullptr, 0, format.c_str(), args...) + 1;
    +  auto size = static_cast(size_s);
    +  if (size <= 0) return std::string();
    +  std::unique_ptr buf(new char[size]);
    +  std::snprintf(buf.get(), size, format.c_str(), args...);
    +  SIMDJSON_POP_DISABLE_WARNINGS
    +  return std::string(buf.get(), buf.get() + size - 1);
    +}
    +
    +static inline log_level get_log_level_from_env()
    +{
    +  SIMDJSON_PUSH_DISABLE_WARNINGS
    +  SIMDJSON_DISABLE_DEPRECATED_WARNING // Disable CRT_SECURE warning on MSVC: manually verified this is safe
    +      char *lvl = getenv("SIMDJSON_LOG_LEVEL");
    +  SIMDJSON_POP_DISABLE_WARNINGS
    +  if (lvl && simdjson_strcasecmp(lvl, "ERROR") == 0) { return log_level::error; }
    +  return log_level::info;
    +}
    +
    +static inline log_level log_threshold()
    +{
    +  static log_level threshold = get_log_level_from_env();
    +  return threshold;
    +}
    +
    +static inline bool should_log(log_level level)
    +{
    +  return level >= log_threshold();
    +}
    +
    +inline void log_event(const json_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_line(iter, "", type, detail, delta, depth_delta, log_level::info);
    +}
    +
    +inline void log_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail) noexcept {
    +  log_line(iter, index, depth, "", type, detail, log_level::info);
    +}
    +inline void log_value(const json_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_line(iter, "", type, detail, delta, depth_delta, log_level::info);
    +}
    +
    +inline void log_start_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail) noexcept {
    +  log_line(iter, index, depth, "+", type, detail, log_level::info);
    +  if (LOG_ENABLED) { log_depth++; }
    +}
    +inline void log_start_value(const json_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  log_line(iter, "+", type, "", delta, depth_delta, log_level::info);
    +  if (LOG_ENABLED) { log_depth++; }
    +}
    +
    +inline void log_end_value(const json_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  if (LOG_ENABLED) { log_depth--; }
    +  log_line(iter, "-", type, "", delta, depth_delta, log_level::info);
    +}
    +
    +inline void log_error(const json_iterator &iter, const char *error, const char *detail, int delta, int depth_delta) noexcept {
    +  log_line(iter, "ERROR: ", error, detail, delta, depth_delta, log_level::error);
    +}
    +inline void log_error(const json_iterator &iter, token_position index, depth_t depth, const char *error, const char *detail) noexcept {
    +  log_line(iter, index, depth, "ERROR: ", error, detail, log_level::error);
    +}
    +
    +inline void log_event(const value_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_event(iter.json_iter(), type, detail, delta, depth_delta);
    +}
    +
    +inline void log_value(const value_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_value(iter.json_iter(), type, detail, delta, depth_delta);
    +}
    +
    +inline void log_start_value(const value_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  log_start_value(iter.json_iter(), type, delta, depth_delta);
    +}
    +
    +inline void log_end_value(const value_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  log_end_value(iter.json_iter(), type, delta, depth_delta);
    +}
    +
    +inline void log_error(const value_iterator &iter, const char *error, const char *detail, int delta, int depth_delta) noexcept {
    +  log_error(iter.json_iter(), error, detail, delta, depth_delta);
    +}
    +
    +inline void log_headers() noexcept {
    +  if (LOG_ENABLED) {
    +    if (simdjson_unlikely(should_log(log_level::info))) {
    +      // Technically a static variable is not thread-safe, but if you are using threads and logging... well...
    +      static bool displayed_hint{false};
    +      log_depth = 0;
    +      printf("\n");
    +      if (!displayed_hint) {
    +        // We only print this helpful header once.
    +        printf("# Logging provides the depth and position of the iterator user-visible steps:\n");
    +        printf("# +array says 'this is where we were when we discovered the start array'\n");
    +        printf(
    +            "# -array says 'this is where we were when we ended the array'\n");
    +        printf("# skip says 'this is a structural or value I am skipping'\n");
    +        printf("# +/-skip says 'this is a start/end array or object I am skipping'\n");
    +        printf("#\n");
    +        printf("# The indentation of the terms (array, string,...) indicates the depth,\n");
    +        printf("# in addition to the depth being displayed.\n");
    +        printf("#\n");
    +        printf("# Every token in the document has a single depth determined by the tokens before it,\n");
    +        printf("# and is not affected by what the token actually is.\n");
    +        printf("#\n");
    +        printf("# Not all structural elements are presented as tokens in the logs.\n");
    +        printf("#\n");
    +        printf("# We never give control to the user within an empty array or an empty object.\n");
    +        printf("#\n");
    +        printf("# Inside an array, having a depth greater than the array's depth means that\n");
    +        printf("# we are pointing inside a value.\n");
    +        printf("# Having a depth equal to the array means that we are pointing right before a value.\n");
    +        printf("# Having a depth smaller than the array means that we have moved beyond the array.\n");
    +        displayed_hint = true;
    +      }
    +      printf("\n");
    +      printf("| %-*s ", LOG_EVENT_LEN, "Event");
    +      printf("| %-*s ", LOG_BUFFER_LEN, "Buffer");
    +      printf("| %-*s ", LOG_SMALL_BUFFER_LEN, "Next");
    +      // printf("| %-*s ", 5,                    "Next#");
    +      printf("| %-*s ", 5, "Depth");
    +      printf("| Detail ");
    +      printf("|\n");
    +
    +      printf("|%.*s", LOG_EVENT_LEN + 2, DASHES);
    +      printf("|%.*s", LOG_BUFFER_LEN + 2, DASHES);
    +      printf("|%.*s", LOG_SMALL_BUFFER_LEN + 2, DASHES);
    +      // printf("|%.*s", 5+2, DASHES);
    +      printf("|%.*s", 5 + 2, DASHES);
    +      printf("|--------");
    +      printf("|\n");
    +      fflush(stdout);
    +    }
    +  }
    +}
    +
    +template 
    +inline void log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, log_level level, Args&&... args) noexcept {
    +  log_line(iter, iter.position()+delta, depth_t(iter.depth()+depth_delta), title_prefix, title, detail, level, std::forward(args)...);
    +}
    +
    +template 
    +inline void log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, log_level level, Args&&... args) noexcept {
    +  if (LOG_ENABLED) {
    +    if (simdjson_unlikely(should_log(level))) {
    +      const int indent = depth * 2;
    +      const auto buf = iter.token.buf;
    +      auto msg = string_format(title, std::forward(args)...);
    +      printf("| %*s%s%-*s ", indent, "", title_prefix,
    +             LOG_EVENT_LEN - indent - int(strlen(title_prefix)), msg.c_str());
    +      {
    +        // Print the current structural.
    +        printf("| ");
    +        // Before we begin, the index might point right before the document.
    +        // This could be unsafe, see https://github.com/simdjson/simdjson/discussions/1938
    +        if (index < iter._root) {
    +          printf("%*s", LOG_BUFFER_LEN, "");
    +        } else {
    +          auto current_structural = &buf[*index];
    +          for (int i = 0; i < LOG_BUFFER_LEN; i++) {
    +            printf("%c", printable_char(current_structural[i]));
    +          }
    +        }
    +        printf(" ");
    +      }
    +      {
    +        // Print the next structural.
    +        printf("| ");
    +        auto next_structural = &buf[*(index + 1)];
    +        for (int i = 0; i < LOG_SMALL_BUFFER_LEN; i++) {
    +          printf("%c", printable_char(next_structural[i]));
    +        }
    +        printf(" ");
    +      }
    +      // printf("| %5u ", *(index+1));
    +      printf("| %5i ", depth);
    +      printf("| %6.*s ", int(detail.size()), detail.data());
    +      printf("|\n");
    +      fflush(stdout);
    +    }
    +  }
    +}
    +
    +} // namespace logger
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H
    +/* end file simdjson/generic/ondemand/logger-inl.h for ppc64 */
    +/* including simdjson/generic/ondemand/object-inl.h for ppc64: #include "simdjson/generic/ondemand/object-inl.h" */
    +/* begin file simdjson/generic/ondemand/object-inl.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/field.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +simdjson_inline simdjson_result object::find_field_unordered(const std::string_view key) & noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_unordered_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +simdjson_inline simdjson_result object::find_field_unordered(const std::string_view key) && noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_unordered_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +simdjson_inline simdjson_result object::operator[](const std::string_view key) & noexcept {
    +  return find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result object::operator[](const std::string_view key) && noexcept {
    +  return std::forward(*this).find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result object::find_field(const std::string_view key) & noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +simdjson_inline simdjson_result object::find_field(const std::string_view key) && noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +
    +simdjson_inline simdjson_result object::start(value_iterator &iter) noexcept {
    +  SIMDJSON_TRY( iter.start_object().error() );
    +  return object(iter);
    +}
    +simdjson_inline simdjson_result object::start_root(value_iterator &iter) noexcept {
    +  SIMDJSON_TRY( iter.start_root_object().error() );
    +  return object(iter);
    +}
    +simdjson_inline error_code object::consume() noexcept {
    +  if(iter.is_at_key()) {
    +    /**
    +     * whenever you are pointing at a key, calling skip_child() is
    +     * unsafe because you will hit a string and you will assume that
    +     * it is string value, and this mistake will lead you to make bad
    +     * depth computation.
    +     */
    +    /**
    +     * We want to 'consume' the key. We could really
    +     * just do _json_iter->return_current_and_advance(); at this
    +     * point, but, for clarity, we will use the high-level API to
    +     * eat the key. We assume that the compiler optimizes away
    +     * most of the work.
    +     */
    +    simdjson_unused raw_json_string actual_key;
    +    auto error = iter.field_key().get(actual_key);
    +    if (error) { iter.abandon(); return error; };
    +    // Let us move to the value while we are at it.
    +    if ((error = iter.field_value())) { iter.abandon(); return error; }
    +  }
    +  auto error_skip = iter.json_iter().skip_child(iter.depth()-1);
    +  if(error_skip) { iter.abandon(); }
    +  return error_skip;
    +}
    +
    +simdjson_inline simdjson_result object::raw_json() noexcept {
    +  const uint8_t * starting_point{iter.peek_start()};
    +  auto error = consume();
    +  if(error) { return error; }
    +  const uint8_t * final_point{iter._json_iter->peek()};
    +  return std::string_view(reinterpret_cast(starting_point), size_t(final_point - starting_point));
    +}
    +
    +simdjson_inline simdjson_result object::started(value_iterator &iter) noexcept {
    +  SIMDJSON_TRY( iter.started_object().error() );
    +  return object(iter);
    +}
    +
    +simdjson_inline object object::resume(const value_iterator &iter) noexcept {
    +  return iter;
    +}
    +
    +simdjson_inline object::object(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{
    +}
    +
    +simdjson_inline simdjson_result object::begin() noexcept {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  return object_iterator(iter);
    +}
    +simdjson_inline simdjson_result object::end() noexcept {
    +  return object_iterator(iter);
    +}
    +
    +inline simdjson_result object::at_pointer(std::string_view json_pointer) noexcept {
    +  if (json_pointer[0] != '/') { return INVALID_JSON_POINTER; }
    +  json_pointer = json_pointer.substr(1);
    +  size_t slash = json_pointer.find('/');
    +  std::string_view key = json_pointer.substr(0, slash);
    +  // Grab the child with the given key
    +  simdjson_result child;
    +
    +  // If there is an escape character in the key, unescape it and then get the child.
    +  size_t escape = key.find('~');
    +  if (escape != std::string_view::npos) {
    +    // Unescape the key
    +    std::string unescaped(key);
    +    do {
    +      switch (unescaped[escape+1]) {
    +        case '0':
    +          unescaped.replace(escape, 2, "~");
    +          break;
    +        case '1':
    +          unescaped.replace(escape, 2, "/");
    +          break;
    +        default:
    +          return INVALID_JSON_POINTER; // "Unexpected ~ escape character in JSON pointer");
    +      }
    +      escape = unescaped.find('~', escape+1);
    +    } while (escape != std::string::npos);
    +    child = find_field(unescaped);  // Take note find_field does not unescape keys when matching
    +  } else {
    +    child = find_field(key);
    +  }
    +  if(child.error()) {
    +    return child; // we do not continue if there was an error
    +  }
    +  // If there is a /, we have to recurse and look up more of the path
    +  if (slash != std::string_view::npos) {
    +    child = child.at_pointer(json_pointer.substr(slash));
    +  }
    +  return child;
    +}
    +
    +simdjson_inline simdjson_result object::count_fields() & noexcept {
    +  size_t count{0};
    +  // Important: we do not consume any of the values.
    +  for(simdjson_unused auto v : *this) { count++; }
    +  // The above loop will always succeed, but we want to report errors.
    +  if(iter.error()) { return iter.error(); }
    +  // We need to move back at the start because we expect users to iterate through
    +  // the object after counting the number of elements.
    +  iter.reset_object();
    +  return count;
    +}
    +
    +simdjson_inline simdjson_result object::is_empty() & noexcept {
    +  bool is_not_empty;
    +  auto error = iter.reset_object().get(is_not_empty);
    +  if(error) { return error; }
    +  return !is_not_empty;
    +}
    +
    +simdjson_inline simdjson_result object::reset() & noexcept {
    +  return iter.reset_object();
    +}
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::object &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +simdjson_inline simdjson_result simdjson_result::begin() noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() noexcept {
    +  if (error()) { return error(); }
    +  return first.end();
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first)[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).find_field(key);
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +inline simdjson_result simdjson_result::reset() noexcept {
    +  if (error()) { return error(); }
    +  return first.reset();
    +}
    +
    +inline simdjson_result simdjson_result::is_empty() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_empty();
    +}
    +
    +simdjson_inline  simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +
    +simdjson_inline  simdjson_result simdjson_result::raw_json() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json();
    +}
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H
    +/* end file simdjson/generic/ondemand/object-inl.h for ppc64 */
    +/* including simdjson/generic/ondemand/object_iterator-inl.h for ppc64: #include "simdjson/generic/ondemand/object_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/object_iterator-inl.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/field-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +//
    +// object_iterator
    +//
    +
    +simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{}
    +
    +simdjson_inline simdjson_result object_iterator::operator*() noexcept {
    +  error_code error = iter.error();
    +  if (error) { iter.abandon(); return error; }
    +  auto result = field::start(iter);
    +  // TODO this is a safety rail ... users should exit loops as soon as they receive an error.
    +  // Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free.
    +  if (result.error()) { iter.abandon(); }
    +  return result;
    +}
    +simdjson_inline bool object_iterator::operator==(const object_iterator &other) const noexcept {
    +  return !(*this != other);
    +}
    +simdjson_inline bool object_iterator::operator!=(const object_iterator &) const noexcept {
    +  return iter.is_open();
    +}
    +
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_inline object_iterator &object_iterator::operator++() noexcept {
    +  // TODO this is a safety rail ... users should exit loops as soon as they receive an error.
    +  // Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free.
    +  if (!iter.is_open()) { return *this; } // Iterator will be released if there is an error
    +
    +  simdjson_unused error_code error;
    +  if ((error = iter.skip_child() )) { return *this; }
    +
    +  simdjson_unused bool has_value;
    +  if ((error = iter.has_next_field().get(has_value) )) { return *this; };
    +  return *this;
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +//
    +// ### Live States
    +//
    +// While iterating or looking up values, depth >= iter.depth. at_start may vary. Error is
    +// always SUCCESS:
    +//
    +// - Start: This is the state when the object is first found and the iterator is just past the {.
    +//   In this state, at_start == true.
    +// - Next: After we hand a scalar value to the user, or an array/object which they then fully
    +//   iterate over, the iterator is at the , or } before the next value. In this state,
    +//   depth == iter.depth, at_start == false, and error == SUCCESS.
    +// - Unfinished Business: When we hand an array/object to the user which they do not fully
    +//   iterate over, we need to finish that iteration by skipping child values until we reach the
    +//   Next state. In this state, depth > iter.depth, at_start == false, and error == SUCCESS.
    +//
    +// ## Error States
    +//
    +// In error states, we will yield exactly one more value before stopping. iter.depth == depth
    +// and at_start is always false. We decrement after yielding the error, moving to the Finished
    +// state.
    +//
    +// - Chained Error: When the object iterator is part of an error chain--for example, in
    +//   `for (auto tweet : doc["tweets"])`, where the tweet field may be missing or not be an
    +//   object--we yield that error in the loop, exactly once. In this state, error != SUCCESS and
    +//   iter.depth == depth, and at_start == false. We decrement depth when we yield the error.
    +// - Missing Comma Error: When the iterator ++ method discovers there is no comma between fields,
    +//   we flag that as an error and treat it exactly the same as a Chained Error. In this state,
    +//   error == TAPE_ERROR, iter.depth == depth, and at_start == false.
    +//
    +// Errors that occur while reading a field to give to the user (such as when the key is not a
    +// string or the field is missing a colon) are yielded immediately. Depth is then decremented,
    +// moving to the Finished state without transitioning through an Error state at all.
    +//
    +// ## Terminal State
    +//
    +// The terminal state has iter.depth < depth. at_start is always false.
    +//
    +// - Finished: When we have reached a }, we are finished. We signal this by decrementing depth.
    +//   In this state, iter.depth < depth, at_start == false, and error == SUCCESS.
    +//
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  ppc64::ondemand::object_iterator &&value
    +) noexcept
    +  : implementation_simdjson_result_base(std::forward(value))
    +{
    +  first.iter.assert_is_valid();
    +}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +  : implementation_simdjson_result_base({}, error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::operator*() noexcept {
    +  if (error()) { return error(); }
    +  return *first;
    +}
    +// If we're iterating and there is an error, return the error once.
    +simdjson_inline bool simdjson_result::operator==(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return !error(); }
    +  return first == other.first;
    +}
    +// If we're iterating and there is an error, return the error once.
    +simdjson_inline bool simdjson_result::operator!=(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return error(); }
    +  return first != other.first;
    +}
    +// Checks for ']' and ','
    +simdjson_inline simdjson_result &simdjson_result::operator++() noexcept {
    +  // Clear the error if there is one, so we don't yield it twice
    +  if (error()) { second = SUCCESS; return *this; }
    +  ++first;
    +  return *this;
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/object_iterator-inl.h for ppc64 */
    +/* including simdjson/generic/ondemand/parser-inl.h for ppc64: #include "simdjson/generic/ondemand/parser-inl.h" */
    +/* begin file simdjson/generic/ondemand/parser-inl.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/padded_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/padded_string_view.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/dom/base.h" // for MINIMAL_DOCUMENT_CAPACITY */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document_stream.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +simdjson_inline parser::parser(size_t max_capacity) noexcept
    +  : _max_capacity{max_capacity} {
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code parser::allocate(size_t new_capacity, size_t new_max_depth) noexcept {
    +  if (new_capacity > max_capacity()) { return CAPACITY; }
    +  if (string_buf && new_capacity == capacity() && new_max_depth == max_depth()) { return SUCCESS; }
    +
    +  // string_capacity copied from document::allocate
    +  _capacity = 0;
    +  size_t string_capacity = SIMDJSON_ROUNDUP_N(5 * new_capacity / 3 + SIMDJSON_PADDING, 64);
    +  string_buf.reset(new (std::nothrow) uint8_t[string_capacity]);
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  start_positions.reset(new (std::nothrow) token_position[new_max_depth]);
    +#endif
    +  if (implementation) {
    +    SIMDJSON_TRY( implementation->set_capacity(new_capacity) );
    +    SIMDJSON_TRY( implementation->set_max_depth(new_max_depth) );
    +  } else {
    +    SIMDJSON_TRY( simdjson::get_active_implementation()->create_dom_parser_implementation(new_capacity, new_max_depth, implementation) );
    +  }
    +  _capacity = new_capacity;
    +  _max_depth = new_max_depth;
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(padded_string_view json) & noexcept {
    +  if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; }
    +
    +  json.remove_utf8_bom();
    +
    +  // Allocate if needed
    +  if (capacity() < json.length() || !string_buf) {
    +    SIMDJSON_TRY( allocate(json.length(), max_depth()) );
    +  }
    +
    +  // Run stage 1.
    +  SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) );
    +  return document::start({ reinterpret_cast(json.data()), this });
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const char *json, size_t len, size_t allocated) & noexcept {
    +  return iterate(padded_string_view(json, len, allocated));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const uint8_t *json, size_t len, size_t allocated) & noexcept {
    +  return iterate(padded_string_view(json, len, allocated));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string_view json, size_t allocated) & noexcept {
    +  return iterate(padded_string_view(json, allocated));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string &json) & noexcept {
    +  if(json.capacity() - json.size() < SIMDJSON_PADDING) {
    +    json.reserve(json.size() + SIMDJSON_PADDING);
    +  }
    +  return iterate(padded_string_view(json));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const std::string &json) & noexcept {
    +  return iterate(padded_string_view(json));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept {
    +  // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception
    +  SIMDJSON_TRY( result.error() );
    +  padded_string_view json = result.value_unsafe();
    +  return iterate(json);
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept {
    +  // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception
    +  SIMDJSON_TRY( result.error() );
    +  const padded_string &json = result.value_unsafe();
    +  return iterate(json);
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate_raw(padded_string_view json) & noexcept {
    +  if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; }
    +
    +  json.remove_utf8_bom();
    +
    +  // Allocate if needed
    +  if (capacity() < json.length()) {
    +    SIMDJSON_TRY( allocate(json.length(), max_depth()) );
    +  }
    +
    +  // Run stage 1.
    +  SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) );
    +  return json_iterator(reinterpret_cast(json.data()), this);
    +}
    +
    +inline simdjson_result parser::iterate_many(const uint8_t *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept {
    +  if(batch_size < MINIMAL_BATCH_SIZE) { batch_size = MINIMAL_BATCH_SIZE; }
    +  if((len >= 3) && (std::memcmp(buf, "\xEF\xBB\xBF", 3) == 0)) {
    +    buf += 3;
    +    len -= 3;
    +  }
    +  if(allow_comma_separated && batch_size < len) { batch_size = len; }
    +  return document_stream(*this, buf, len, batch_size, allow_comma_separated);
    +}
    +inline simdjson_result parser::iterate_many(const char *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept {
    +  return iterate_many(reinterpret_cast(buf), len, batch_size, allow_comma_separated);
    +}
    +inline simdjson_result parser::iterate_many(const std::string &s, size_t batch_size, bool allow_comma_separated) noexcept {
    +  return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated);
    +}
    +inline simdjson_result parser::iterate_many(const padded_string &s, size_t batch_size, bool allow_comma_separated) noexcept {
    +  return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated);
    +}
    +
    +simdjson_inline size_t parser::capacity() const noexcept {
    +  return _capacity;
    +}
    +simdjson_inline size_t parser::max_capacity() const noexcept {
    +  return _max_capacity;
    +}
    +simdjson_inline size_t parser::max_depth() const noexcept {
    +  return _max_depth;
    +}
    +
    +simdjson_inline void parser::set_max_capacity(size_t max_capacity) noexcept {
    +  if(max_capacity < dom::MINIMAL_DOCUMENT_CAPACITY) {
    +    _max_capacity = max_capacity;
    +  } else {
    +    _max_capacity = dom::MINIMAL_DOCUMENT_CAPACITY;
    +  }
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result parser::unescape(raw_json_string in, uint8_t *&dst, bool allow_replacement) const noexcept {
    +  uint8_t *end = implementation->parse_string(in.buf, dst, allow_replacement);
    +  if (!end) { return STRING_ERROR; }
    +  std::string_view result(reinterpret_cast(dst), end-dst);
    +  dst = end;
    +  return result;
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result parser::unescape_wobbly(raw_json_string in, uint8_t *&dst) const noexcept {
    +  uint8_t *end = implementation->parse_wobbly_string(in.buf, dst);
    +  if (!end) { return STRING_ERROR; }
    +  std::string_view result(reinterpret_cast(dst), end-dst);
    +  dst = end;
    +  return result;
    +}
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::parser &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H
    +/* end file simdjson/generic/ondemand/parser-inl.h for ppc64 */
    +/* including simdjson/generic/ondemand/raw_json_string-inl.h for ppc64: #include "simdjson/generic/ondemand/raw_json_string-inl.h" */
    +/* begin file simdjson/generic/ondemand/raw_json_string-inl.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +
    +namespace ppc64 {
    +namespace ondemand {
    +
    +simdjson_inline raw_json_string::raw_json_string(const uint8_t * _buf) noexcept : buf{_buf} {}
    +
    +simdjson_inline const char * raw_json_string::raw() const noexcept { return reinterpret_cast(buf); }
    +
    +
    +simdjson_inline bool raw_json_string::is_free_from_unescaped_quote(std::string_view target) noexcept {
    +  size_t pos{0};
    +  // if the content has no escape character, just scan through it quickly!
    +  for(;pos < target.size() && target[pos] != '\\';pos++) {}
    +  // slow path may begin.
    +  bool escaping{false};
    +  for(;pos < target.size();pos++) {
    +    if((target[pos] == '"') && !escaping) {
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  return true;
    +}
    +
    +simdjson_inline bool raw_json_string::is_free_from_unescaped_quote(const char* target) noexcept {
    +  size_t pos{0};
    +  // if the content has no escape character, just scan through it quickly!
    +  for(;target[pos] && target[pos] != '\\';pos++) {}
    +  // slow path may begin.
    +  bool escaping{false};
    +  for(;target[pos];pos++) {
    +    if((target[pos] == '"') && !escaping) {
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  return true;
    +}
    +
    +
    +simdjson_inline bool raw_json_string::unsafe_is_equal(size_t length, std::string_view target) const noexcept {
    +  // If we are going to call memcmp, then we must know something about the length of the raw_json_string.
    +  return (length >= target.size()) && (raw()[target.size()] == '"') && !memcmp(raw(), target.data(), target.size());
    +}
    +
    +simdjson_inline bool raw_json_string::unsafe_is_equal(std::string_view target) const noexcept {
    +  // Assumptions: does not contain unescaped quote characters, and
    +  // the raw content is quote terminated within a valid JSON string.
    +  if(target.size() <= SIMDJSON_PADDING) {
    +    return (raw()[target.size()] == '"') && !memcmp(raw(), target.data(), target.size());
    +  }
    +  const char * r{raw()};
    +  size_t pos{0};
    +  for(;pos < target.size();pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +simdjson_inline bool raw_json_string::is_equal(std::string_view target) const noexcept {
    +  const char * r{raw()};
    +  size_t pos{0};
    +  bool escaping{false};
    +  for(;pos < target.size();pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +    // if target is a compile-time constant and it is free from
    +    // quotes, then the next part could get optimized away through
    +    // inlining.
    +    if((target[pos] == '"') && !escaping) {
    +      // We have reached the end of the raw_json_string but
    +      // the target is not done.
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +
    +simdjson_inline bool raw_json_string::unsafe_is_equal(const char * target) const noexcept {
    +  // Assumptions: 'target' does not contain unescaped quote characters, is null terminated and
    +  // the raw content is quote terminated within a valid JSON string.
    +  const char * r{raw()};
    +  size_t pos{0};
    +  for(;target[pos];pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +simdjson_inline bool raw_json_string::is_equal(const char* target) const noexcept {
    +  // Assumptions: does not contain unescaped quote characters, and
    +  // the raw content is quote terminated within a valid JSON string.
    +  const char * r{raw()};
    +  size_t pos{0};
    +  bool escaping{false};
    +  for(;target[pos];pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +    // if target is a compile-time constant and it is free from
    +    // quotes, then the next part could get optimized away through
    +    // inlining.
    +    if((target[pos] == '"') && !escaping) {
    +      // We have reached the end of the raw_json_string but
    +      // the target is not done.
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept {
    +  return a.unsafe_is_equal(c);
    +}
    +
    +simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept {
    +  return a == c;
    +}
    +
    +simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept {
    +  return !(a == c);
    +}
    +
    +simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept {
    +  return !(a == c);
    +}
    +
    +
    +simdjson_inline simdjson_warn_unused simdjson_result raw_json_string::unescape(json_iterator &iter, bool allow_replacement) const noexcept {
    +  return iter.unescape(*this, allow_replacement);
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result raw_json_string::unescape_wobbly(json_iterator &iter) const noexcept {
    +  return iter.unescape_wobbly(*this);
    +}
    +
    +simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &out, const raw_json_string &str) noexcept {
    +  bool in_escape = false;
    +  const char *s = str.raw();
    +  while (true) {
    +    switch (*s) {
    +      case '\\': in_escape = !in_escape; break;
    +      case '"': if (in_escape) { in_escape = false; } else { return out; } break;
    +      default: if (in_escape) { in_escape = false; }
    +    }
    +    out << *s;
    +    s++;
    +  }
    +}
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::raw_json_string &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +simdjson_inline simdjson_result simdjson_result::raw() const noexcept {
    +  if (error()) { return error(); }
    +  return first.raw();
    +}
    +simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape(ppc64::ondemand::json_iterator &iter, bool allow_replacement) const noexcept {
    +  if (error()) { return error(); }
    +  return first.unescape(iter, allow_replacement);
    +}
    +simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape_wobbly(ppc64::ondemand::json_iterator &iter) const noexcept {
    +  if (error()) { return error(); }
    +  return first.unescape_wobbly(iter);
    +}
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H
    +/* end file simdjson/generic/ondemand/raw_json_string-inl.h for ppc64 */
    +/* including simdjson/generic/ondemand/serialization-inl.h for ppc64: #include "simdjson/generic/ondemand/serialization-inl.h" */
    +/* begin file simdjson/generic/ondemand/serialization-inl.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/serialization.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +
    +inline std::string_view trim(const std::string_view str) noexcept {
    +  // We can almost surely do better by rolling our own find_first_not_of function.
    +  size_t first = str.find_first_not_of(" \t\n\r");
    +  // If we have the empty string (just white space), then no trimming is possible, and
    +  // we return the empty string_view.
    +  if (std::string_view::npos == first) { return std::string_view(); }
    +  size_t last = str.find_last_not_of(" \t\n\r");
    +  return str.substr(first, (last - first + 1));
    +}
    +
    +
    +inline simdjson_result to_json_string(ppc64::ondemand::document& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(ppc64::ondemand::document_reference& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(ppc64::ondemand::value& x) noexcept {
    +  /**
    +   * If we somehow receive a value that has already been consumed,
    +   * then the following code could be in trouble. E.g., we create
    +   * an array as needed, but if an array was already created, then
    +   * it could be bad.
    +   */
    +  using namespace ppc64::ondemand;
    +  ppc64::ondemand::json_type t;
    +  auto error = x.type().get(t);
    +  if(error != SUCCESS) { return error; }
    +  switch (t)
    +  {
    +    case json_type::array:
    +    {
    +      ppc64::ondemand::array array;
    +      error = x.get_array().get(array);
    +      if(error) { return error; }
    +      return to_json_string(array);
    +    }
    +    case json_type::object:
    +    {
    +      ppc64::ondemand::object object;
    +      error = x.get_object().get(object);
    +      if(error) { return error; }
    +      return to_json_string(object);
    +    }
    +    default:
    +      return trim(x.raw_json_token());
    +  }
    +}
    +
    +inline simdjson_result to_json_string(ppc64::ondemand::object& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(ppc64::ondemand::array& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +} // namespace simdjson
    +
    +namespace simdjson { namespace ppc64 { namespace ondemand {
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::value x) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(x).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::value x) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(x).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::array value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::array value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::document& value)  {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::document_reference& value)  {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::document& value)  {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::object value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out,  simdjson::simdjson_result x) {
    +  if (x.error()) { throw  simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::ppc64::ondemand::object value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +}}} // namespace simdjson::ppc64::ondemand
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H
    +/* end file simdjson/generic/ondemand/serialization-inl.h for ppc64 */
    +/* including simdjson/generic/ondemand/token_iterator-inl.h for ppc64: #include "simdjson/generic/ondemand/token_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/token_iterator-inl.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/token_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +simdjson_inline token_iterator::token_iterator(
    +  const uint8_t *_buf,
    +  token_position position
    +) noexcept : buf{_buf}, _position{position}
    +{
    +}
    +
    +simdjson_inline uint32_t token_iterator::current_offset() const noexcept {
    +  return *(_position);
    +}
    +
    +
    +simdjson_inline const uint8_t *token_iterator::return_current_and_advance() noexcept {
    +  return &buf[*(_position++)];
    +}
    +
    +simdjson_inline const uint8_t *token_iterator::peek(token_position position) const noexcept {
    +  return &buf[*position];
    +}
    +simdjson_inline uint32_t token_iterator::peek_index(token_position position) const noexcept {
    +  return *position;
    +}
    +simdjson_inline uint32_t token_iterator::peek_length(token_position position) const noexcept {
    +  return *(position+1) - *position;
    +}
    +
    +simdjson_inline const uint8_t *token_iterator::peek(int32_t delta) const noexcept {
    +  return &buf[*(_position+delta)];
    +}
    +simdjson_inline uint32_t token_iterator::peek_index(int32_t delta) const noexcept {
    +  return *(_position+delta);
    +}
    +simdjson_inline uint32_t token_iterator::peek_length(int32_t delta) const noexcept {
    +  return *(_position+delta+1) - *(_position+delta);
    +}
    +
    +simdjson_inline token_position token_iterator::position() const noexcept {
    +  return _position;
    +}
    +simdjson_inline void token_iterator::set_position(token_position target_position) noexcept {
    +  _position = target_position;
    +}
    +
    +simdjson_inline bool token_iterator::operator==(const token_iterator &other) const noexcept {
    +  return _position == other._position;
    +}
    +simdjson_inline bool token_iterator::operator!=(const token_iterator &other) const noexcept {
    +  return _position != other._position;
    +}
    +simdjson_inline bool token_iterator::operator>(const token_iterator &other) const noexcept {
    +  return _position > other._position;
    +}
    +simdjson_inline bool token_iterator::operator>=(const token_iterator &other) const noexcept {
    +  return _position >= other._position;
    +}
    +simdjson_inline bool token_iterator::operator<(const token_iterator &other) const noexcept {
    +  return _position < other._position;
    +}
    +simdjson_inline bool token_iterator::operator<=(const token_iterator &other) const noexcept {
    +  return _position <= other._position;
    +}
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::token_iterator &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/token_iterator-inl.h for ppc64 */
    +/* including simdjson/generic/ondemand/value-inl.h for ppc64: #include "simdjson/generic/ondemand/value-inl.h" */
    +/* begin file simdjson/generic/ondemand/value-inl.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +simdjson_inline value::value(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{
    +}
    +simdjson_inline value value::start(const value_iterator &iter) noexcept {
    +  return iter;
    +}
    +simdjson_inline value value::resume(const value_iterator &iter) noexcept {
    +  return iter;
    +}
    +
    +simdjson_inline simdjson_result value::get_array() noexcept {
    +  return array::start(iter);
    +}
    +simdjson_inline simdjson_result value::get_object() noexcept {
    +  return object::start(iter);
    +}
    +simdjson_inline simdjson_result value::start_or_resume_object() noexcept {
    +  if (iter.at_start()) {
    +    return get_object();
    +  } else {
    +    return object::resume(iter);
    +  }
    +}
    +
    +simdjson_inline simdjson_result value::get_raw_json_string() noexcept {
    +  return iter.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result value::get_string(bool allow_replacement) noexcept {
    +  return iter.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code value::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  return iter.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result value::get_wobbly_string() noexcept {
    +  return iter.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result value::get_double() noexcept {
    +  return iter.get_double();
    +}
    +simdjson_inline simdjson_result value::get_double_in_string() noexcept {
    +  return iter.get_double_in_string();
    +}
    +simdjson_inline simdjson_result value::get_uint64() noexcept {
    +  return iter.get_uint64();
    +}
    +simdjson_inline simdjson_result value::get_uint64_in_string() noexcept {
    +  return iter.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result value::get_int64() noexcept {
    +  return iter.get_int64();
    +}
    +simdjson_inline simdjson_result value::get_int64_in_string() noexcept {
    +  return iter.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result value::get_bool() noexcept {
    +  return iter.get_bool();
    +}
    +simdjson_inline simdjson_result value::is_null() noexcept {
    +  return iter.is_null();
    +}
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_array(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_object(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_raw_json_string(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_string(false); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_number(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_double(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_uint64(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_int64(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_bool(); }
    +
    +template simdjson_inline error_code value::get(T &out) noexcept {
    +  return get().get(out);
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline value::operator array() noexcept(false) {
    +  return get_array();
    +}
    +simdjson_inline value::operator object() noexcept(false) {
    +  return get_object();
    +}
    +simdjson_inline value::operator uint64_t() noexcept(false) {
    +  return get_uint64();
    +}
    +simdjson_inline value::operator int64_t() noexcept(false) {
    +  return get_int64();
    +}
    +simdjson_inline value::operator double() noexcept(false) {
    +  return get_double();
    +}
    +simdjson_inline value::operator std::string_view() noexcept(false) {
    +  return get_string(false);
    +}
    +simdjson_inline value::operator raw_json_string() noexcept(false) {
    +  return get_raw_json_string();
    +}
    +simdjson_inline value::operator bool() noexcept(false) {
    +  return get_bool();
    +}
    +#endif
    +
    +simdjson_inline simdjson_result value::begin() & noexcept {
    +  return get_array().begin();
    +}
    +simdjson_inline simdjson_result value::end() & noexcept {
    +  return {};
    +}
    +simdjson_inline simdjson_result value::count_elements() & noexcept {
    +  simdjson_result answer;
    +  auto a = get_array();
    +  answer = a.count_elements();
    +  // count_elements leaves you pointing inside the array, at the first element.
    +  // We need to move back so that the user can create a new array (which requires that
    +  // we point at '[').
    +  iter.move_at_start();
    +  return answer;
    +}
    +simdjson_inline simdjson_result value::count_fields() & noexcept {
    +  simdjson_result answer;
    +  auto a = get_object();
    +  answer = a.count_fields();
    +  iter.move_at_start();
    +  return answer;
    +}
    +simdjson_inline simdjson_result value::at(size_t index) noexcept {
    +  auto a = get_array();
    +  return a.at(index);
    +}
    +
    +simdjson_inline simdjson_result value::find_field(std::string_view key) noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +simdjson_inline simdjson_result value::find_field(const char *key) noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +
    +simdjson_inline simdjson_result value::find_field_unordered(std::string_view key) noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result value::find_field_unordered(const char *key) noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +
    +simdjson_inline simdjson_result value::operator[](std::string_view key) noexcept {
    +  return start_or_resume_object()[key];
    +}
    +simdjson_inline simdjson_result value::operator[](const char *key) noexcept {
    +  return start_or_resume_object()[key];
    +}
    +
    +simdjson_inline simdjson_result value::type() noexcept {
    +  return iter.type();
    +}
    +
    +simdjson_inline simdjson_result value::is_scalar() noexcept {
    +  json_type this_type;
    +  auto error = type().get(this_type);
    +  if(error) { return error; }
    +  return ! ((this_type == json_type::array) || (this_type == json_type::object));
    +}
    +
    +simdjson_inline bool value::is_negative() noexcept {
    +  return iter.is_negative();
    +}
    +
    +simdjson_inline simdjson_result value::is_integer() noexcept {
    +  return iter.is_integer();
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value::get_number_type() noexcept {
    +  return iter.get_number_type();
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value::get_number() noexcept {
    +  return iter.get_number();
    +}
    +
    +simdjson_inline std::string_view value::raw_json_token() noexcept {
    +  return std::string_view(reinterpret_cast(iter.peek_start()), iter.peek_start_length());
    +}
    +
    +simdjson_inline simdjson_result value::raw_json() noexcept {
    +  json_type t;
    +  SIMDJSON_TRY(type().get(t));
    +  switch (t)
    +  {
    +    case json_type::array: {
    +      ondemand::array array;
    +      SIMDJSON_TRY(get_array().get(array));
    +      return array.raw_json();
    +    }
    +    case json_type::object: {
    +      ondemand::object object;
    +      SIMDJSON_TRY(get_object().get(object));
    +      return object.raw_json();
    +    }
    +    default:
    +      return raw_json_token();
    +  }
    +}
    +
    +simdjson_inline simdjson_result value::current_location() noexcept {
    +  return iter.json_iter().current_location();
    +}
    +
    +simdjson_inline int32_t value::current_depth() const noexcept{
    +  return iter.json_iter().depth();
    +}
    +
    +simdjson_inline simdjson_result value::at_pointer(std::string_view json_pointer) noexcept {
    +  json_type t;
    +  SIMDJSON_TRY(type().get(t));
    +  switch (t)
    +  {
    +    case json_type::array:
    +      return (*this).get_array().at_pointer(json_pointer);
    +    case json_type::object:
    +      return (*this).get_object().at_pointer(json_pointer);
    +    default:
    +      return INVALID_JSON_POINTER;
    +  }
    +}
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  ppc64::ondemand::value &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(error)
    +{
    +}
    +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +simdjson_inline simdjson_result simdjson_result::at(size_t index) noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline simdjson_result simdjson_result::begin() & noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() & noexcept {
    +  if (error()) { return error(); }
    +  return {};
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::get_array() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_array();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_object() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_object();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_bool();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_null() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_null();
    +}
    +
    +template simdjson_inline simdjson_result simdjson_result::get() noexcept {
    +  if (error()) { return error(); }
    +  return first.get();
    +}
    +template simdjson_inline error_code simdjson_result::get(T &out) noexcept {
    +  if (error()) { return error(); }
    +  return first.get(out);
    +}
    +
    +template<> simdjson_inline simdjson_result simdjson_result::get() noexcept  {
    +  if (error()) { return error(); }
    +  return std::move(first);
    +}
    +template<> simdjson_inline error_code simdjson_result::get(ppc64::ondemand::value &out) noexcept {
    +  if (error()) { return error(); }
    +  out = first;
    +  return SUCCESS;
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::type() noexcept {
    +  if (error()) { return error(); }
    +  return first.type();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_scalar();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_negative() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_negative();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_integer();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number_type();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number();
    +}
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline simdjson_result::operator ppc64::ondemand::array() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator ppc64::ondemand::object() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator int64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator double() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator ppc64::ondemand::raw_json_string() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator bool() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +#endif
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json_token();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::current_location() noexcept {
    +  if (error()) { return error(); }
    +  return first.current_location();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::current_depth() const noexcept {
    +  if (error()) { return error(); }
    +  return first.current_depth();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H
    +/* end file simdjson/generic/ondemand/value-inl.h for ppc64 */
    +/* including simdjson/generic/ondemand/value_iterator-inl.h for ppc64: #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/value_iterator-inl.h for ppc64 */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/atomparsing.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/numberparsing.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace ppc64 {
    +namespace ondemand {
    +
    +simdjson_inline value_iterator::value_iterator(
    +  json_iterator *json_iter,
    +  depth_t depth,
    +  token_position start_position
    +) noexcept : _json_iter{json_iter}, _depth{depth}, _start_position{start_position}
    +{
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_object() noexcept {
    +  SIMDJSON_TRY( start_container('{', "Not an object", "object") );
    +  return started_object();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_object() noexcept {
    +  SIMDJSON_TRY( start_container('{', "Not an object", "object") );
    +  return started_root_object();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_object() noexcept {
    +  assert_at_container_start();
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  _json_iter->set_start_position(_depth, start_position());
    +#endif
    +  if (*_json_iter->peek() == '}') {
    +    logger::log_value(*_json_iter, "empty object");
    +    _json_iter->return_current_and_advance();
    +    end_container();
    +    return false;
    +  }
    +  return true;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::check_root_object() noexcept {
    +  // When in streaming mode, we cannot expect peek_last() to be the last structural element of the
    +  // current document. It only works in the normal mode where we have indexed a single document.
    +  // Note that adding a check for 'streaming' is not expensive since we only have at most
    +  // one root element.
    +  if ( ! _json_iter->streaming() ) {
    +    // The following lines do not fully protect against garbage content within the
    +    // object: e.g., `{"a":2} foo }`. Users concerned with garbage content should
    +    // call `at_end()` on the document instance at the end of the processing to
    +    // ensure that the processing has finished at the end.
    +    //
    +    if (*_json_iter->peek_last() != '}') {
    +      _json_iter->abandon();
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing } at end");
    +    }
    +    // If the last character is } *and* the first gibberish character is also '}'
    +    // then on-demand could accidentally go over. So we need additional checks.
    +    // https://github.com/simdjson/simdjson/issues/1834
    +    // Checking that the document is balanced requires a full scan which is potentially
    +    // expensive, but it only happens in edge cases where the first padding character is
    +    // a closing bracket.
    +    if ((*_json_iter->peek(_json_iter->end_position()) == '}') && (!_json_iter->balanced())) {
    +      _json_iter->abandon();
    +      // The exact error would require more work. It will typically be an unclosed object.
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "the document is unbalanced");
    +    }
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_object() noexcept {
    +  auto error = check_root_object();
    +  if(error) { return error; }
    +  return started_object();
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::end_container() noexcept {
    +#if SIMDJSON_CHECK_EOF
    +    if (depth() > 1 && at_end()) { return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing parent ] or }"); }
    +    // if (depth() <= 1 && !at_end()) { return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing [ or { at start"); }
    +#endif // SIMDJSON_CHECK_EOF
    +    _json_iter->ascend_to(depth()-1);
    +    return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_field() noexcept {
    +  assert_at_next();
    +
    +  // It's illegal to call this unless there are more tokens: anything that ends in } or ] is
    +  // obligated to verify there are more tokens if they are not the top level.
    +  switch (*_json_iter->return_current_and_advance()) {
    +    case '}':
    +      logger::log_end_value(*_json_iter, "object");
    +      SIMDJSON_TRY( end_container() );
    +      return false;
    +    case ',':
    +      return true;
    +    default:
    +      return report_error(TAPE_ERROR, "Missing comma between object fields");
    +  }
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::find_field_raw(const std::string_view key) noexcept {
    +  error_code error;
    +  bool has_value;
    +  //
    +  // Initially, the object can be in one of a few different places:
    +  //
    +  // 1. The start of the object, at the first field:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //      ^ (depth 2, index 1)
    +  //    ```
    +  if (at_first_field()) {
    +    has_value = true;
    +
    +  //
    +  // 2. When a previous search did not yield a value or the object is empty:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                     ^ (depth 0)
    +  //    { }
    +  //        ^ (depth 0, index 2)
    +  //    ```
    +  //
    +  } else if (!is_open()) {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    // If we're past the end of the object, we're being iterated out of order.
    +    // Note: this isn't perfect detection. It's possible the user is inside some other object; if so,
    +    // this object iterator will blithely scan that object for fields.
    +    if (_json_iter->depth() < depth() - 1) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +    return false;
    +
    +  // 3. When a previous search found a field or an iterator yielded a value:
    +  //
    +  //    ```
    +  //    // When a field was not fully consumed (or not even touched at all)
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //           ^ (depth 2)
    +  //    // When a field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                   ^ (depth 1)
    +  //    // When the last field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                   ^ (depth 1)
    +  //    ```
    +  //
    +  } else {
    +    if ((error = skip_child() )) { abandon(); return error; }
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    if (_json_iter->start_position(_depth) != start_position()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  }
    +  while (has_value) {
    +    // Get the key and colon, stopping at the value.
    +    raw_json_string actual_key;
    +    // size_t max_key_length = _json_iter->peek_length() - 2; // -2 for the two quotes
    +    // Note: _json_iter->peek_length() - 2 might overflow if _json_iter->peek_length() < 2.
    +    // field_key() advances the pointer and checks that '"' is found (corresponding to a key).
    +    // The depth is left unchanged by field_key().
    +    if ((error = field_key().get(actual_key) )) { abandon(); return error; };
    +    // field_value() will advance and check that we find a ':' separating the
    +    // key and the value. It will also increment the depth by one.
    +    if ((error = field_value() )) { abandon(); return error; }
    +    // If it matches, stop and return
    +    // We could do it this way if we wanted to allow arbitrary
    +    // key content (including escaped quotes).
    +    //if (actual_key.unsafe_is_equal(max_key_length, key)) {
    +    // Instead we do the following which may trigger buffer overruns if the
    +    // user provides an adversarial key (containing a well placed unescaped quote
    +    // character and being longer than the number of bytes remaining in the JSON
    +    // input).
    +    if (actual_key.unsafe_is_equal(key)) {
    +      logger::log_event(*this, "match", key, -2);
    +      // If we return here, then we return while pointing at the ':' that we just checked.
    +      return true;
    +    }
    +
    +    // No match: skip the value and see if , or } is next
    +    logger::log_event(*this, "no match", key, -2);
    +    // The call to skip_child is meant to skip over the value corresponding to the key.
    +    // After skip_child(), we are right before the next comma (',') or the final brace ('}').
    +    SIMDJSON_TRY( skip_child() ); // Skip the value entirely
    +    // The has_next_field() advances the pointer and check that either ',' or '}' is found.
    +    // It returns true if ',' is found, false otherwise. If anything other than ',' or '}' is found,
    +    // then we are in error and we abort.
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +  }
    +
    +  // If the loop ended, we're out of fields to look at.
    +  return false;
    +}
    +
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::find_field_unordered_raw(const std::string_view key) noexcept {
    +  /**
    +   * When find_field_unordered_raw is called, we can either be pointing at the
    +   * first key, pointing outside (at the closing brace) or if a key was matched
    +   * we can be either pointing right afterthe ':' right before the value (that we need skip),
    +   * or we may have consumed the value and we might be at a comma or at the
    +   * final brace (ready for a call to has_next_field()).
    +   */
    +  error_code error;
    +  bool has_value;
    +
    +  // First, we scan from that point to the end.
    +  // If we don't find a match, we may loop back around, and scan from the beginning to that point.
    +  token_position search_start = _json_iter->position();
    +
    +  // We want to know whether we need to go back to the beginning.
    +  bool at_first = at_first_field();
    +  ///////////////
    +  // Initially, the object can be in one of a few different places:
    +  //
    +  // 1. At the first key:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //      ^ (depth 2, index 1)
    +  //    ```
    +  //
    +  if (at_first) {
    +    has_value = true;
    +
    +  // 2. When a previous search did not yield a value or the object is empty:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                     ^ (depth 0)
    +  //    { }
    +  //        ^ (depth 0, index 2)
    +  //    ```
    +  //
    +  } else if (!is_open()) {
    +
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    // If we're past the end of the object, we're being iterated out of order.
    +    // Note: this isn't perfect detection. It's possible the user is inside some other object; if so,
    +    // this object iterator will blithely scan that object for fields.
    +    if (_json_iter->depth() < depth() - 1) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +    SIMDJSON_TRY(reset_object().get(has_value));
    +    at_first = true;
    +  // 3. When a previous search found a field or an iterator yielded a value:
    +  //
    +  //    ```
    +  //    // When a field was not fully consumed (or not even touched at all)
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //           ^ (depth 2)
    +  //    // When a field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                   ^ (depth 1)
    +  //    // When the last field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                   ^ (depth 1)
    +  //    ```
    +  //
    +  } else {
    +    // If someone queried a key but they not did access the value, then we are left pointing
    +    // at the ':' and we need to move forward through the value... If the value was
    +    // processed then skip_child() does not move the iterator (but may adjust the depth).
    +    if ((error = skip_child() )) { abandon(); return error; }
    +    search_start = _json_iter->position();
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    if (_json_iter->start_position(_depth) != start_position()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  }
    +
    +  // After initial processing, we will be in one of two states:
    +  //
    +  // ```
    +  // // At the beginning of a field
    +  // { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //   ^ (depth 1)
    +  // { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                  ^ (depth 1)
    +  // // At the end of the object
    +  // { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                  ^ (depth 0)
    +  // ```
    +  //
    +  // Next, we find a match starting from the current position.
    +  while (has_value) {
    +    SIMDJSON_ASSUME( _json_iter->_depth == _depth ); // We must be at the start of a field
    +
    +    // Get the key and colon, stopping at the value.
    +    raw_json_string actual_key;
    +    // size_t max_key_length = _json_iter->peek_length() - 2; // -2 for the two quotes
    +    // Note: _json_iter->peek_length() - 2 might overflow if _json_iter->peek_length() < 2.
    +    // field_key() advances the pointer and checks that '"' is found (corresponding to a key).
    +    // The depth is left unchanged by field_key().
    +    if ((error = field_key().get(actual_key) )) { abandon(); return error; };
    +    // field_value() will advance and check that we find a ':' separating the
    +    // key and the value. It will also increment the depth by one.
    +    if ((error = field_value() )) { abandon(); return error; }
    +
    +    // If it matches, stop and return
    +    // We could do it this way if we wanted to allow arbitrary
    +    // key content (including escaped quotes).
    +    // if (actual_key.unsafe_is_equal(max_key_length, key)) {
    +    // Instead we do the following which may trigger buffer overruns if the
    +    // user provides an adversarial key (containing a well placed unescaped quote
    +    // character and being longer than the number of bytes remaining in the JSON
    +    // input).
    +    if (actual_key.unsafe_is_equal(key)) {
    +      logger::log_event(*this, "match", key, -2);
    +      // If we return here, then we return while pointing at the ':' that we just checked.
    +      return true;
    +    }
    +
    +    // No match: skip the value and see if , or } is next
    +    logger::log_event(*this, "no match", key, -2);
    +    // The call to skip_child is meant to skip over the value corresponding to the key.
    +    // After skip_child(), we are right before the next comma (',') or the final brace ('}').
    +    SIMDJSON_TRY( skip_child() );
    +    // The has_next_field() advances the pointer and check that either ',' or '}' is found.
    +    // It returns true if ',' is found, false otherwise. If anything other than ',' or '}' is found,
    +    // then we are in error and we abort.
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +  }
    +  // Performance note: it maybe wasteful to rewind to the beginning when there might be
    +  // no other query following. Indeed, it would require reskipping the whole object.
    +  // Instead, you can just stay where you are. If there is a new query, there is always time
    +  // to rewind.
    +  if(at_first) { return false; }
    +
    +  // If we reach the end without finding a match, search the rest of the fields starting at the
    +  // beginning of the object.
    +  // (We have already run through the object before, so we've already validated its structure. We
    +  // don't check errors in this bit.)
    +  SIMDJSON_TRY(reset_object().get(has_value));
    +  while (true) {
    +    SIMDJSON_ASSUME(has_value); // we should reach search_start before ever reaching the end of the object
    +    SIMDJSON_ASSUME( _json_iter->_depth == _depth ); // We must be at the start of a field
    +
    +    // Get the key and colon, stopping at the value.
    +    raw_json_string actual_key;
    +    // size_t max_key_length = _json_iter->peek_length() - 2; // -2 for the two quotes
    +    // Note: _json_iter->peek_length() - 2 might overflow if _json_iter->peek_length() < 2.
    +    // field_key() advances the pointer and checks that '"' is found (corresponding to a key).
    +    // The depth is left unchanged by field_key().
    +    error = field_key().get(actual_key); SIMDJSON_ASSUME(!error);
    +    // field_value() will advance and check that we find a ':' separating the
    +    // key and the value.  It will also increment the depth by one.
    +    error = field_value(); SIMDJSON_ASSUME(!error);
    +
    +    // If it matches, stop and return
    +    // We could do it this way if we wanted to allow arbitrary
    +    // key content (including escaped quotes).
    +    // if (actual_key.unsafe_is_equal(max_key_length, key)) {
    +    // Instead we do the following which may trigger buffer overruns if the
    +    // user provides an adversarial key (containing a well placed unescaped quote
    +    // character and being longer than the number of bytes remaining in the JSON
    +    // input).
    +    if (actual_key.unsafe_is_equal(key)) {
    +      logger::log_event(*this, "match", key, -2);
    +      // If we return here, then we return while pointing at the ':' that we just checked.
    +      return true;
    +    }
    +
    +    // No match: skip the value and see if , or } is next
    +    logger::log_event(*this, "no match", key, -2);
    +    // The call to skip_child is meant to skip over the value corresponding to the key.
    +    // After skip_child(), we are right before the next comma (',') or the final brace ('}').
    +    SIMDJSON_TRY( skip_child() );
    +    // If we reached the end of the key-value pair we started from, then we know
    +    // that the key is not there so we return false. We are either right before
    +    // the next comma or the final brace.
    +    if(_json_iter->position() == search_start) { return false; }
    +    // The has_next_field() advances the pointer and check that either ',' or '}' is found.
    +    // It returns true if ',' is found, false otherwise. If anything other than ',' or '}' is found,
    +    // then we are in error and we abort.
    +    error = has_next_field().get(has_value); SIMDJSON_ASSUME(!error);
    +    // If we make the mistake of exiting here, then we could be left pointing at a key
    +    // in the middle of an object. That's not an allowable state.
    +  }
    +  // If the loop ended, we're out of fields to look at. The program should
    +  // never reach this point.
    +  return false;
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::field_key() noexcept {
    +  assert_at_next();
    +
    +  const uint8_t *key = _json_iter->return_current_and_advance();
    +  if (*(key++) != '"') { return report_error(TAPE_ERROR, "Object key is not a string"); }
    +  return raw_json_string(key);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::field_value() noexcept {
    +  assert_at_next();
    +
    +  if (*_json_iter->return_current_and_advance() != ':') { return report_error(TAPE_ERROR, "Missing colon in object field"); }
    +  _json_iter->descend_to(depth()+1);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_array() noexcept {
    +  SIMDJSON_TRY( start_container('[', "Not an array", "array") );
    +  return started_array();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_array() noexcept {
    +  SIMDJSON_TRY( start_container('[', "Not an array", "array") );
    +  return started_root_array();
    +}
    +
    +inline std::string value_iterator::to_string() const noexcept {
    +  auto answer = std::string("value_iterator [ depth : ") + std::to_string(_depth) + std::string(", ");
    +  if(_json_iter != nullptr) { answer +=  _json_iter->to_string(); }
    +  answer += std::string(" ]");
    +  return answer;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_array() noexcept {
    +  assert_at_container_start();
    +  if (*_json_iter->peek() == ']') {
    +    logger::log_value(*_json_iter, "empty array");
    +    _json_iter->return_current_and_advance();
    +    SIMDJSON_TRY( end_container() );
    +    return false;
    +  }
    +  _json_iter->descend_to(depth()+1);
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  _json_iter->set_start_position(_depth, start_position());
    +#endif
    +  return true;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::check_root_array() noexcept {
    +  // When in streaming mode, we cannot expect peek_last() to be the last structural element of the
    +  // current document. It only works in the normal mode where we have indexed a single document.
    +  // Note that adding a check for 'streaming' is not expensive since we only have at most
    +  // one root element.
    +  if ( ! _json_iter->streaming() ) {
    +    // The following lines do not fully protect against garbage content within the
    +    // array: e.g., `[1, 2] foo]`. Users concerned with garbage content should
    +    // also call `at_end()` on the document instance at the end of the processing to
    +    // ensure that the processing has finished at the end.
    +    //
    +    if (*_json_iter->peek_last() != ']') {
    +      _json_iter->abandon();
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing ] at end");
    +    }
    +    // If the last character is ] *and* the first gibberish character is also ']'
    +    // then on-demand could accidentally go over. So we need additional checks.
    +    // https://github.com/simdjson/simdjson/issues/1834
    +    // Checking that the document is balanced requires a full scan which is potentially
    +    // expensive, but it only happens in edge cases where the first padding character is
    +    // a closing bracket.
    +    if ((*_json_iter->peek(_json_iter->end_position()) == ']') && (!_json_iter->balanced())) {
    +      _json_iter->abandon();
    +      // The exact error would require more work. It will typically be an unclosed array.
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "the document is unbalanced");
    +    }
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_array() noexcept {
    +  auto error = check_root_array();
    +  if (error) { return error; }
    +  return started_array();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_element() noexcept {
    +  assert_at_next();
    +
    +  logger::log_event(*this, "has_next_element");
    +  switch (*_json_iter->return_current_and_advance()) {
    +    case ']':
    +      logger::log_end_value(*_json_iter, "array");
    +      SIMDJSON_TRY( end_container() );
    +      return false;
    +    case ',':
    +      _json_iter->descend_to(depth()+1);
    +      return true;
    +    default:
    +      return report_error(TAPE_ERROR, "Missing comma between array elements");
    +  }
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::parse_bool(const uint8_t *json) const noexcept {
    +  auto not_true = atomparsing::str4ncmp(json, "true");
    +  auto not_false = atomparsing::str4ncmp(json, "fals") | (json[4] ^ 'e');
    +  bool error = (not_true && not_false) || jsoncharutils::is_not_structural_or_whitespace(json[not_true ? 5 : 4]);
    +  if (error) { return incorrect_type_error("Not a boolean"); }
    +  return simdjson_result(!not_true);
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::parse_null(const uint8_t *json) const noexcept {
    +  bool is_null_string = !atomparsing::str4ncmp(json, "null") && jsoncharutils::is_structural_or_whitespace(json[4]);
    +  // if we start with 'n', we must be a null
    +  if(!is_null_string && json[0]=='n') { return incorrect_type_error("Not a null but starts with n"); }
    +  return is_null_string;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_string(bool allow_replacement) noexcept {
    +  return get_raw_json_string().unescape(json_iter(), allow_replacement);
    +}
    +template 
    +simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  std::string_view content;
    +  auto err = get_string(allow_replacement).get(content);
    +  if (err) { return err; }
    +  receiver = content;
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_wobbly_string() noexcept {
    +  return get_raw_json_string().unescape_wobbly(json_iter());
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_raw_json_string() noexcept {
    +  auto json = peek_scalar("string");
    +  if (*json != '"') { return incorrect_type_error("Not a string"); }
    +  advance_scalar("string");
    +  return raw_json_string(json+1);
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_uint64() noexcept {
    +  auto result = numberparsing::parse_unsigned(peek_non_root_scalar("uint64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("uint64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_uint64_in_string() noexcept {
    +  auto result = numberparsing::parse_unsigned_in_string(peek_non_root_scalar("uint64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("uint64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_int64() noexcept {
    +  auto result = numberparsing::parse_integer(peek_non_root_scalar("int64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("int64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_int64_in_string() noexcept {
    +  auto result = numberparsing::parse_integer_in_string(peek_non_root_scalar("int64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("int64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_double() noexcept {
    +  auto result = numberparsing::parse_double(peek_non_root_scalar("double"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("double"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_double_in_string() noexcept {
    +  auto result = numberparsing::parse_double_in_string(peek_non_root_scalar("double"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("double"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_bool() noexcept {
    +  auto result = parse_bool(peek_non_root_scalar("bool"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("bool"); }
    +  return result;
    +}
    +simdjson_inline simdjson_result value_iterator::is_null() noexcept {
    +  bool is_null_value;
    +  SIMDJSON_TRY(parse_null(peek_non_root_scalar("null")).get(is_null_value));
    +  if(is_null_value) { advance_non_root_scalar("null"); }
    +  return is_null_value;
    +}
    +simdjson_inline bool value_iterator::is_negative() noexcept {
    +  return numberparsing::is_negative(peek_non_root_scalar("numbersign"));
    +}
    +simdjson_inline bool value_iterator::is_root_negative() noexcept {
    +  return numberparsing::is_negative(peek_root_scalar("numbersign"));
    +}
    +simdjson_inline simdjson_result value_iterator::is_integer() noexcept {
    +  return numberparsing::is_integer(peek_non_root_scalar("integer"));
    +}
    +simdjson_inline simdjson_result value_iterator::get_number_type() noexcept {
    +  return numberparsing::get_number_type(peek_non_root_scalar("integer"));
    +}
    +simdjson_inline simdjson_result value_iterator::get_number() noexcept {
    +  number num;
    +  error_code error =  numberparsing::parse_number(peek_non_root_scalar("number"), num);
    +  if(error) { return error; }
    +  return num;
    +}
    +
    +simdjson_inline simdjson_result value_iterator::is_root_integer(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("is_root_integer");
    +  uint8_t tmpbuf[20+1+1]{}; // <20 digits> is the longest possible unsigned integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    return false; // if there are more than 20 characters, it cannot be represented as an integer.
    +  }
    +  auto answer = numberparsing::is_integer(tmpbuf);
    +  // If the parsing was a success, we must still check that it is
    +  // a single scalar. Note that we parse first because of cases like '[]' where
    +  // getting TRAILING_CONTENT is wrong.
    +  if(check_trailing && (answer.error() == SUCCESS) && (!_json_iter->is_single_token())) { return TRAILING_CONTENT; }
    +  return answer;
    +}
    +
    +simdjson_inline simdjson_result value_iterator::get_root_number_type(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("number");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1];
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto answer = numberparsing::get_number_type(tmpbuf);
    +  if (check_trailing && (answer.error() == SUCCESS)  && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +  return answer;
    +}
    +simdjson_inline simdjson_result value_iterator::get_root_number(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("number");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1];
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  number num;
    +  error_code error =  numberparsing::parse_number(tmpbuf, num);
    +  if(error) { return error; }
    +  if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +  advance_root_scalar("number");
    +  return num;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_string(bool check_trailing, bool allow_replacement) noexcept {
    +  return get_root_raw_json_string(check_trailing).unescape(json_iter(), allow_replacement);
    +}
    +template 
    +simdjson_warn_unused simdjson_inline error_code value_iterator::get_root_string(string_type& receiver, bool check_trailing, bool allow_replacement) noexcept {
    +  std::string_view content;
    +  auto err = get_root_string(check_trailing, allow_replacement).get(content);
    +  if (err) { return err; }
    +  receiver = content;
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_wobbly_string(bool check_trailing) noexcept {
    +  return get_root_raw_json_string(check_trailing).unescape_wobbly(json_iter());
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_raw_json_string(bool check_trailing) noexcept {
    +  auto json = peek_scalar("string");
    +  if (*json != '"') { return incorrect_type_error("Not a string"); }
    +  if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +  advance_scalar("string");
    +  return raw_json_string(json+1);
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_uint64(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("uint64");
    +  uint8_t tmpbuf[20+1+1]{}; // <20 digits> is the longest possible unsigned integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_unsigned(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("uint64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_uint64_in_string(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("uint64");
    +  uint8_t tmpbuf[20+1+1]{}; // <20 digits> is the longest possible unsigned integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_unsigned_in_string(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("uint64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_int64(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("int64");
    +  uint8_t tmpbuf[20+1+1]; // -<19 digits> is the longest possible integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +
    +  auto result = numberparsing::parse_integer(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("int64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_int64_in_string(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("int64");
    +  uint8_t tmpbuf[20+1+1]; // -<19 digits> is the longest possible integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +
    +  auto result = numberparsing::parse_integer_in_string(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("int64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_double(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("double");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination.
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_double(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("double");
    +  }
    +  return result;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_double_in_string(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("double");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination.
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_double_in_string(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("double");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_bool(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("bool");
    +  uint8_t tmpbuf[5+1+1]; // +1 for null termination
    +  tmpbuf[5+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 5+1)) { return incorrect_type_error("Not a boolean"); }
    +  auto result = parse_bool(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("bool");
    +  }
    +  return result;
    +}
    +simdjson_inline simdjson_result value_iterator::is_root_null(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("null");
    +  bool result = (max_len >= 4 && !atomparsing::str4ncmp(json, "null") &&
    +         (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4])));
    +  if(result) { // we have something that looks like a null.
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("null");
    +  }
    +  return result;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::skip_child() noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth >= _depth );
    +
    +  return _json_iter->skip_child(depth());
    +}
    +
    +simdjson_inline value_iterator value_iterator::child() const noexcept {
    +  assert_at_child();
    +  return { _json_iter, depth()+1, _json_iter->token.position() };
    +}
    +
    +// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller
    +// relating depth and iterator depth, which is a desired effect. It does not happen if is_open is
    +// marked non-inline.
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_inline bool value_iterator::is_open() const noexcept {
    +  return _json_iter->depth() >= depth();
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_inline bool value_iterator::at_end() const noexcept {
    +  return _json_iter->at_end();
    +}
    +
    +simdjson_inline bool value_iterator::at_start() const noexcept {
    +  return _json_iter->token.position() == start_position();
    +}
    +
    +simdjson_inline bool value_iterator::at_first_field() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  return _json_iter->token.position() == start_position() + 1;
    +}
    +
    +simdjson_inline void value_iterator::abandon() noexcept {
    +  _json_iter->abandon();
    +}
    +
    +simdjson_warn_unused simdjson_inline depth_t value_iterator::depth() const noexcept {
    +  return _depth;
    +}
    +simdjson_warn_unused simdjson_inline error_code value_iterator::error() const noexcept {
    +  return _json_iter->error;
    +}
    +simdjson_warn_unused simdjson_inline uint8_t *&value_iterator::string_buf_loc() noexcept {
    +  return _json_iter->string_buf_loc();
    +}
    +simdjson_warn_unused simdjson_inline const json_iterator &value_iterator::json_iter() const noexcept {
    +  return *_json_iter;
    +}
    +simdjson_warn_unused simdjson_inline json_iterator &value_iterator::json_iter() noexcept {
    +  return *_json_iter;
    +}
    +
    +simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept {
    +  return _json_iter->peek(start_position());
    +}
    +simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept {
    +  return _json_iter->peek_length(start_position());
    +}
    +
    +simdjson_inline const uint8_t *value_iterator::peek_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  // If we're not at the position anymore, we don't want to advance the cursor.
    +  if (!is_at_start()) { return peek_start(); }
    +
    +  // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value.
    +  assert_at_start();
    +  return _json_iter->peek();
    +}
    +
    +simdjson_inline void value_iterator::advance_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  // If we're not at the position anymore, we don't want to advance the cursor.
    +  if (!is_at_start()) { return; }
    +
    +  // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value.
    +  assert_at_start();
    +  _json_iter->return_current_and_advance();
    +  _json_iter->ascend_to(depth()-1);
    +}
    +
    +simdjson_inline error_code value_iterator::start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept {
    +  logger::log_start_value(*_json_iter, start_position(), depth(), type);
    +  // If we're not at the position anymore, we don't want to advance the cursor.
    +  const uint8_t *json;
    +  if (!is_at_start()) {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    if (!is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +    json = peek_start();
    +    if (*json != start_char) { return incorrect_type_error(incorrect_type_message); }
    +  } else {
    +    assert_at_start();
    +    /**
    +     * We should be prudent. Let us peek. If it is not the right type, we
    +     * return an error. Only once we have determined that we have the right
    +     * type are we allowed to advance!
    +     */
    +    json = _json_iter->peek();
    +    if (*json != start_char) { return incorrect_type_error(incorrect_type_message); }
    +    _json_iter->return_current_and_advance();
    +  }
    +
    +
    +  return SUCCESS;
    +}
    +
    +
    +simdjson_inline const uint8_t *value_iterator::peek_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return peek_start(); }
    +
    +  assert_at_root();
    +  return _json_iter->peek();
    +}
    +simdjson_inline const uint8_t *value_iterator::peek_non_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return peek_start(); }
    +
    +  assert_at_non_root_start();
    +  return _json_iter->peek();
    +}
    +
    +simdjson_inline void value_iterator::advance_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return; }
    +
    +  assert_at_root();
    +  _json_iter->return_current_and_advance();
    +  _json_iter->ascend_to(depth()-1);
    +}
    +simdjson_inline void value_iterator::advance_non_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return; }
    +
    +  assert_at_non_root_start();
    +  _json_iter->return_current_and_advance();
    +  _json_iter->ascend_to(depth()-1);
    +}
    +
    +simdjson_inline error_code value_iterator::incorrect_type_error(const char *message) const noexcept {
    +  logger::log_error(*_json_iter, start_position(), depth(), message);
    +  return INCORRECT_TYPE;
    +}
    +
    +simdjson_inline bool value_iterator::is_at_start() const noexcept {
    +  return position() == start_position();
    +}
    +
    +simdjson_inline bool value_iterator::is_at_key() const noexcept {
    +  // Keys are at the same depth as the object.
    +  // Note here that we could be safer and check that we are within an object,
    +  // but we do not.
    +  return _depth == _json_iter->_depth && *_json_iter->peek() == '"';
    +}
    +
    +simdjson_inline bool value_iterator::is_at_iterator_start() const noexcept {
    +  // We can legitimately be either at the first value ([1]), or after the array if it's empty ([]).
    +  auto delta = position() - start_position();
    +  return delta == 1 || delta == 2;
    +}
    +
    +inline void value_iterator::assert_at_start() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position == _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +inline void value_iterator::assert_at_container_start() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position == _start_position + 1 );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +inline void value_iterator::assert_at_next() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +simdjson_inline void value_iterator::move_at_start() noexcept {
    +  _json_iter->_depth = _depth;
    +  _json_iter->token.set_position(_start_position);
    +}
    +
    +simdjson_inline void value_iterator::move_at_container_start() noexcept {
    +  _json_iter->_depth = _depth;
    +  _json_iter->token.set_position(_start_position + 1);
    +}
    +
    +simdjson_inline simdjson_result value_iterator::reset_array() noexcept {
    +  if(error()) { return error(); }
    +  move_at_container_start();
    +  return started_array();
    +}
    +
    +simdjson_inline simdjson_result value_iterator::reset_object() noexcept {
    +  if(error()) { return error(); }
    +  move_at_container_start();
    +  return started_object();
    +}
    +
    +inline void value_iterator::assert_at_child() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth + 1 );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +inline void value_iterator::assert_at_root() const noexcept {
    +  assert_at_start();
    +  SIMDJSON_ASSUME( _depth == 1 );
    +}
    +
    +inline void value_iterator::assert_at_non_root_start() const noexcept {
    +  assert_at_start();
    +  SIMDJSON_ASSUME( _depth > 1 );
    +}
    +
    +inline void value_iterator::assert_is_valid() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter != nullptr );
    +}
    +
    +simdjson_inline bool value_iterator::is_valid() const noexcept {
    +  return _json_iter != nullptr;
    +}
    +
    +simdjson_inline simdjson_result value_iterator::type() const noexcept {
    +  switch (*peek_start()) {
    +    case '{':
    +      return json_type::object;
    +    case '[':
    +      return json_type::array;
    +    case '"':
    +      return json_type::string;
    +    case 'n':
    +      return json_type::null;
    +    case 't': case 'f':
    +      return json_type::boolean;
    +    case '-':
    +    case '0': case '1': case '2': case '3': case '4':
    +    case '5': case '6': case '7': case '8': case '9':
    +      return json_type::number;
    +    default:
    +      return TAPE_ERROR;
    +  }
    +}
    +
    +simdjson_inline token_position value_iterator::start_position() const noexcept {
    +  return _start_position;
    +}
    +
    +simdjson_inline token_position value_iterator::position() const noexcept {
    +  return _json_iter->position();
    +}
    +
    +simdjson_inline token_position value_iterator::end_position() const noexcept {
    +  return _json_iter->end_position();
    +}
    +
    +simdjson_inline token_position value_iterator::last_position() const noexcept {
    +  return _json_iter->last_position();
    +}
    +
    +simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept {
    +  return _json_iter->report_error(error, message);
    +}
    +
    +} // namespace ondemand
    +} // namespace ppc64
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::value_iterator &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/value_iterator-inl.h for ppc64 */
    +/* end file simdjson/generic/ondemand/amalgamated.h for ppc64 */
    +/* including simdjson/ppc64/end.h: #include "simdjson/ppc64/end.h" */
    +/* begin file simdjson/ppc64/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/ppc64/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT
    +/* undefining SIMDJSON_IMPLEMENTATION from "ppc64" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/ppc64/end.h */
    +
    +#endif // SIMDJSON_PPC64_ONDEMAND_H
    +/* end file simdjson/ppc64/ondemand.h */
    +#elif SIMDJSON_BUILTIN_IMPLEMENTATION_IS(westmere)
    +/* including simdjson/westmere/ondemand.h: #include "simdjson/westmere/ondemand.h" */
    +/* begin file simdjson/westmere/ondemand.h */
    +#ifndef SIMDJSON_WESTMERE_ONDEMAND_H
    +#define SIMDJSON_WESTMERE_ONDEMAND_H
    +
    +/* including simdjson/westmere/begin.h: #include "simdjson/westmere/begin.h" */
    +/* begin file simdjson/westmere/begin.h */
    +/* defining SIMDJSON_IMPLEMENTATION to "westmere" */
    +#define SIMDJSON_IMPLEMENTATION westmere
    +/* including simdjson/westmere/base.h: #include "simdjson/westmere/base.h" */
    +/* begin file simdjson/westmere/base.h */
    +#ifndef SIMDJSON_WESTMERE_BASE_H
    +#define SIMDJSON_WESTMERE_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_WESTMERE
    +namespace simdjson {
    +/**
    + * Implementation for Westmere (Intel SSE4.2).
    + */
    +namespace westmere {
    +
    +class implementation;
    +
    +namespace {
    +namespace simd {
    +
    +template  struct simd8;
    +template  struct simd8x64;
    +
    +} // namespace simd
    +} // unnamed namespace
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_BASE_H
    +/* end file simdjson/westmere/base.h */
    +/* including simdjson/westmere/intrinsics.h: #include "simdjson/westmere/intrinsics.h" */
    +/* begin file simdjson/westmere/intrinsics.h */
    +#ifndef SIMDJSON_WESTMERE_INTRINSICS_H
    +#define SIMDJSON_WESTMERE_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if SIMDJSON_VISUAL_STUDIO
    +// under clang within visual studio, this will include 
    +#include  // visual studio or clang
    +#else
    +#include  // elsewhere
    +#endif // SIMDJSON_VISUAL_STUDIO
    +
    +
    +#if SIMDJSON_CLANG_VISUAL_STUDIO
    +/**
    + * You are not supposed, normally, to include these
    + * headers directly. Instead you should either include intrin.h
    + * or x86intrin.h. However, when compiling with clang
    + * under Windows (i.e., when _MSC_VER is set), these headers
    + * only get included *if* the corresponding features are detected
    + * from macros:
    + */
    +#include   // for _mm_alignr_epi8
    +#include   // for  _mm_clmulepi64_si128
    +#endif
    +
    +static_assert(sizeof(__m128i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for westmere");
    +
    +#endif // SIMDJSON_WESTMERE_INTRINSICS_H
    +/* end file simdjson/westmere/intrinsics.h */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_WESTMERE
    +SIMDJSON_TARGET_REGION("sse4.2,pclmul,popcnt")
    +#endif
    +
    +/* including simdjson/westmere/bitmanipulation.h: #include "simdjson/westmere/bitmanipulation.h" */
    +/* begin file simdjson/westmere/bitmanipulation.h */
    +#ifndef SIMDJSON_WESTMERE_BITMANIPULATION_H
    +#define SIMDJSON_WESTMERE_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long ret;
    +  // Search the mask data from least significant bit (LSB)
    +  // to the most significant bit (MSB) for a set bit (1).
    +  _BitScanForward64(&ret, input_num);
    +  return (int)ret;
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return input_num & (input_num-1);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long leading_zero = 0;
    +  // Search the mask data from most significant bit (MSB)
    +  // to least significant bit (LSB) for a set bit (1).
    +  if (_BitScanReverse64(&leading_zero, input_num))
    +    return (int)(63 - leading_zero);
    +  else
    +    return 64;
    +#else
    +  return __builtin_clzll(input_num);
    +#endif// SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +simdjson_inline unsigned __int64 count_ones(uint64_t input_num) {
    +  // note: we do not support legacy 32-bit Windows in this kernel
    +  return __popcnt64(input_num);// Visual Studio wants two underscores
    +}
    +#else
    +simdjson_inline long long int count_ones(uint64_t input_num) {
    +  return _popcnt64(input_num);
    +}
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2,
    +                                uint64_t *result) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return _addcarry_u64(0, value1, value2,
    +                       reinterpret_cast(result));
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_BITMANIPULATION_H
    +/* end file simdjson/westmere/bitmanipulation.h */
    +/* including simdjson/westmere/bitmask.h: #include "simdjson/westmere/bitmask.h" */
    +/* begin file simdjson/westmere/bitmask.h */
    +#ifndef SIMDJSON_WESTMERE_BITMASK_H
    +#define SIMDJSON_WESTMERE_BITMASK_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +
    +//
    +// Perform a "cumulative bitwise xor," flipping bits each time a 1 is encountered.
    +//
    +// For example, prefix_xor(00100100) == 00011100
    +//
    +simdjson_inline uint64_t prefix_xor(const uint64_t bitmask) {
    +  // There should be no such thing with a processing supporting avx2
    +  // but not clmul.
    +  __m128i all_ones = _mm_set1_epi8('\xFF');
    +  __m128i result = _mm_clmulepi64_si128(_mm_set_epi64x(0ULL, bitmask), all_ones, 0);
    +  return _mm_cvtsi128_si64(result);
    +}
    +
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_BITMASK_H
    +/* end file simdjson/westmere/bitmask.h */
    +/* including simdjson/westmere/numberparsing_defs.h: #include "simdjson/westmere/numberparsing_defs.h" */
    +/* begin file simdjson/westmere/numberparsing_defs.h */
    +#ifndef SIMDJSON_WESTMERE_NUMBERPARSING_DEFS_H
    +#define SIMDJSON_WESTMERE_NUMBERPARSING_DEFS_H
    +
    +/* including simdjson/westmere/base.h: #include "simdjson/westmere/base.h" */
    +/* begin file simdjson/westmere/base.h */
    +#ifndef SIMDJSON_WESTMERE_BASE_H
    +#define SIMDJSON_WESTMERE_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +// The constructor may be executed on any host, so we take care not to use SIMDJSON_TARGET_WESTMERE
    +namespace simdjson {
    +/**
    + * Implementation for Westmere (Intel SSE4.2).
    + */
    +namespace westmere {
    +
    +class implementation;
    +
    +namespace {
    +namespace simd {
    +
    +template  struct simd8;
    +template  struct simd8x64;
    +
    +} // namespace simd
    +} // unnamed namespace
    +
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_BASE_H
    +/* end file simdjson/westmere/base.h */
    +/* including simdjson/westmere/intrinsics.h: #include "simdjson/westmere/intrinsics.h" */
    +/* begin file simdjson/westmere/intrinsics.h */
    +#ifndef SIMDJSON_WESTMERE_INTRINSICS_H
    +#define SIMDJSON_WESTMERE_INTRINSICS_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if SIMDJSON_VISUAL_STUDIO
    +// under clang within visual studio, this will include 
    +#include  // visual studio or clang
    +#else
    +#include  // elsewhere
    +#endif // SIMDJSON_VISUAL_STUDIO
    +
    +
    +#if SIMDJSON_CLANG_VISUAL_STUDIO
    +/**
    + * You are not supposed, normally, to include these
    + * headers directly. Instead you should either include intrin.h
    + * or x86intrin.h. However, when compiling with clang
    + * under Windows (i.e., when _MSC_VER is set), these headers
    + * only get included *if* the corresponding features are detected
    + * from macros:
    + */
    +#include   // for _mm_alignr_epi8
    +#include   // for  _mm_clmulepi64_si128
    +#endif
    +
    +static_assert(sizeof(__m128i) <= simdjson::SIMDJSON_PADDING, "insufficient padding for westmere");
    +
    +#endif // SIMDJSON_WESTMERE_INTRINSICS_H
    +/* end file simdjson/westmere/intrinsics.h */
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/numberparsing_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace numberparsing {
    +
    +/** @private */
    +static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) {
    +  // this actually computes *16* values so we are being wasteful.
    +  const __m128i ascii0 = _mm_set1_epi8('0');
    +  const __m128i mul_1_10 =
    +      _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1);
    +  const __m128i mul_1_100 = _mm_setr_epi16(100, 1, 100, 1, 100, 1, 100, 1);
    +  const __m128i mul_1_10000 =
    +      _mm_setr_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1);
    +  const __m128i input = _mm_sub_epi8(
    +      _mm_loadu_si128(reinterpret_cast(chars)), ascii0);
    +  const __m128i t1 = _mm_maddubs_epi16(input, mul_1_10);
    +  const __m128i t2 = _mm_madd_epi16(t1, mul_1_100);
    +  const __m128i t3 = _mm_packus_epi32(t2, t2);
    +  const __m128i t4 = _mm_madd_epi16(t3, mul_1_10000);
    +  return _mm_cvtsi128_si32(
    +      t4); // only captures the sum of the first 8 digits, drop the rest
    +}
    +
    +/** @private */
    +simdjson_inline internal::value128 full_multiplication(uint64_t value1, uint64_t value2) {
    +  internal::value128 answer;
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +#ifdef _M_ARM64
    +  // ARM64 has native support for 64-bit multiplications, no need to emultate
    +  answer.high = __umulh(value1, value2);
    +  answer.low = value1 * value2;
    +#else
    +  answer.low = _umul128(value1, value2, &answer.high); // _umul128 not available on ARM64
    +#endif // _M_ARM64
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO || SIMDJSON_IS_32BITS
    +  __uint128_t r = (static_cast<__uint128_t>(value1)) * value2;
    +  answer.low = uint64_t(r);
    +  answer.high = uint64_t(r >> 64);
    +#endif
    +  return answer;
    +}
    +
    +} // namespace numberparsing
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#define SIMDJSON_SWAR_NUMBER_PARSING 1
    +
    +#endif //  SIMDJSON_WESTMERE_NUMBERPARSING_DEFS_H
    +/* end file simdjson/westmere/numberparsing_defs.h */
    +/* including simdjson/westmere/simd.h: #include "simdjson/westmere/simd.h" */
    +/* begin file simdjson/westmere/simd.h */
    +#ifndef SIMDJSON_WESTMERE_SIMD_H
    +#define SIMDJSON_WESTMERE_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace simd {
    +
    +  template
    +  struct base {
    +    __m128i value;
    +
    +    // Zero constructor
    +    simdjson_inline base() : value{__m128i()} {}
    +
    +    // Conversion from SIMD register
    +    simdjson_inline base(const __m128i _value) : value(_value) {}
    +
    +    // Conversion to SIMD register
    +    simdjson_inline operator const __m128i&() const { return this->value; }
    +    simdjson_inline operator __m128i&() { return this->value; }
    +
    +    // Bit operations
    +    simdjson_inline Child operator|(const Child other) const { return _mm_or_si128(*this, other); }
    +    simdjson_inline Child operator&(const Child other) const { return _mm_and_si128(*this, other); }
    +    simdjson_inline Child operator^(const Child other) const { return _mm_xor_si128(*this, other); }
    +    simdjson_inline Child bit_andnot(const Child other) const { return _mm_andnot_si128(other, *this); }
    +    simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast | other; return *this_cast; }
    +    simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast & other; return *this_cast; }
    +    simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast ^ other; return *this_cast; }
    +  };
    +
    +  template>
    +  struct base8: base> {
    +    typedef uint16_t bitmask_t;
    +    typedef uint32_t bitmask2_t;
    +
    +    simdjson_inline base8() : base>() {}
    +    simdjson_inline base8(const __m128i _value) : base>(_value) {}
    +
    +    friend simdjson_inline Mask operator==(const simd8 lhs, const simd8 rhs) { return _mm_cmpeq_epi8(lhs, rhs); }
    +
    +    static const int SIZE = sizeof(base>::value);
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +      return _mm_alignr_epi8(*this, prev_chunk, 16 - N);
    +    }
    +  };
    +
    +  // SIMD byte mask type (returned by things like eq and gt)
    +  template<>
    +  struct simd8: base8 {
    +    static simdjson_inline simd8 splat(bool _value) { return _mm_set1_epi8(uint8_t(-(!!_value))); }
    +
    +    simdjson_inline simd8() : base8() {}
    +    simdjson_inline simd8(const __m128i _value) : base8(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(bool _value) : base8(splat(_value)) {}
    +
    +    simdjson_inline int to_bitmask() const { return _mm_movemask_epi8(*this); }
    +    simdjson_inline bool any() const { return !_mm_testz_si128(*this, *this); }
    +    simdjson_inline simd8 operator~() const { return *this ^ true; }
    +  };
    +
    +  template
    +  struct base8_numeric: base8 {
    +    static simdjson_inline simd8 splat(T _value) { return _mm_set1_epi8(_value); }
    +    static simdjson_inline simd8 zero() { return _mm_setzero_si128(); }
    +    static simdjson_inline simd8 load(const T values[16]) {
    +      return _mm_loadu_si128(reinterpret_cast(values));
    +    }
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    static simdjson_inline simd8 repeat_16(
    +      T v0,  T v1,  T v2,  T v3,  T v4,  T v5,  T v6,  T v7,
    +      T v8,  T v9,  T v10, T v11, T v12, T v13, T v14, T v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    simdjson_inline base8_numeric() : base8() {}
    +    simdjson_inline base8_numeric(const __m128i _value) : base8(_value) {}
    +
    +    // Store to array
    +    simdjson_inline void store(T dst[16]) const { return _mm_storeu_si128(reinterpret_cast<__m128i *>(dst), *this); }
    +
    +    // Override to distinguish from bool version
    +    simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +
    +    // Addition/subtraction are the same for signed and unsigned
    +    simdjson_inline simd8 operator+(const simd8 other) const { return _mm_add_epi8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return _mm_sub_epi8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *static_cast*>(this); }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *static_cast*>(this); }
    +
    +    // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values)
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return _mm_shuffle_epi8(lookup_table, *this);
    +    }
    +
    +    // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset).
    +    // Passing a 0 value for mask would be equivalent to writing out every byte to output.
    +    // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes
    +    // get written.
    +    // Design consideration: it seems like a function with the
    +    // signature simd8 compress(uint32_t mask) would be
    +    // sensible, but the AVX ISA makes this kind of approach difficult.
    +    template
    +    simdjson_inline void compress(uint16_t mask, L * output) const {
    +      using internal::thintable_epi8;
    +      using internal::BitsSetTable256mul2;
    +      using internal::pshufb_combine_table;
    +      // this particular implementation was inspired by work done by @animetosho
    +      // we do it in two steps, first 8 bytes and then second 8 bytes
    +      uint8_t mask1 = uint8_t(mask); // least significant 8 bits
    +      uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
    +      // next line just loads the 64-bit values thintable_epi8[mask1] and
    +      // thintable_epi8[mask2] into a 128-bit register, using only
    +      // two instructions on most compilers.
    +      __m128i shufmask =  _mm_set_epi64x(thintable_epi8[mask2], thintable_epi8[mask1]);
    +      // we increment by 0x08 the second half of the mask
    +      shufmask =
    +      _mm_add_epi8(shufmask, _mm_set_epi32(0x08080808, 0x08080808, 0, 0));
    +      // this is the version "nearly pruned"
    +      __m128i pruned = _mm_shuffle_epi8(*this, shufmask);
    +      // we still need to put the two halves together.
    +      // we compute the popcount of the first half:
    +      int pop1 = BitsSetTable256mul2[mask1];
    +      // then load the corresponding mask, what it does is to write
    +      // only the first pop1 bytes from the first 8 bytes, and then
    +      // it fills in with the bytes from the second 8 bytes + some filling
    +      // at the end.
    +      __m128i compactmask =
    +      _mm_loadu_si128(reinterpret_cast(pshufb_combine_table + pop1 * 8));
    +      __m128i answer = _mm_shuffle_epi8(pruned, compactmask);
    +      _mm_storeu_si128(reinterpret_cast<__m128i *>(output), answer);
    +    }
    +
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +  };
    +
    +  // Signed bytes
    +  template<>
    +  struct simd8 : base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m128i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const int8_t* values) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) : simd8(_mm_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Order-sensitive comparisons
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm_max_epi8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm_min_epi8(*this, other); }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return _mm_cmpgt_epi8(*this, other); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return _mm_cmpgt_epi8(other, *this); }
    +  };
    +
    +  // Unsigned bytes
    +  template<>
    +  struct simd8: base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m128i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const uint8_t* values) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) : simd8(_mm_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Saturated math
    +    simdjson_inline simd8 saturating_add(const simd8 other) const { return _mm_adds_epu8(*this, other); }
    +    simdjson_inline simd8 saturating_sub(const simd8 other) const { return _mm_subs_epu8(*this, other); }
    +
    +    // Order-specific operations
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm_max_epu8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm_min_epu8(*this, other); }
    +    // Same as >, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 gt_bits(const simd8 other) const { return this->saturating_sub(other); }
    +    // Same as <, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 lt_bits(const simd8 other) const { return other.saturating_sub(*this); }
    +    simdjson_inline simd8 operator<=(const simd8 other) const { return other.max_val(*this) == other; }
    +    simdjson_inline simd8 operator>=(const simd8 other) const { return other.min_val(*this) == other; }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +
    +    // Bit-specific operations
    +    simdjson_inline simd8 bits_not_set() const { return *this == uint8_t(0); }
    +    simdjson_inline simd8 bits_not_set(simd8 bits) const { return (*this & bits).bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set() const { return ~this->bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set(simd8 bits) const { return ~this->bits_not_set(bits); }
    +    simdjson_inline bool is_ascii() const { return _mm_movemask_epi8(*this) == 0; }
    +    simdjson_inline bool bits_not_set_anywhere() const { return _mm_testz_si128(*this, *this); }
    +    simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); }
    +    simdjson_inline bool bits_not_set_anywhere(simd8 bits) const { return _mm_testz_si128(*this, bits); }
    +    simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return !bits_not_set_anywhere(bits); }
    +    template
    +    simdjson_inline simd8 shr() const { return simd8(_mm_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); }
    +    template
    +    simdjson_inline simd8 shl() const { return simd8(_mm_slli_epi16(*this, N)) & uint8_t(0xFFu << N); }
    +    // Get one of the bits and make a bitmask out of it.
    +    // e.g. value.get_bit<7>() gets the high bit
    +    template
    +    simdjson_inline int get_bit() const { return _mm_movemask_epi8(_mm_slli_epi16(*this, 7-N)); }
    +  };
    +
    +  template
    +  struct simd8x64 {
    +    static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +    static_assert(NUM_CHUNKS == 4, "Westmere kernel should use four registers per 64-byte block.");
    +    const simd8 chunks[NUM_CHUNKS];
    +
    +    simd8x64(const simd8x64& o) = delete; // no copy allowed
    +    simd8x64& operator=(const simd8& other) = delete; // no assignment allowed
    +    simd8x64() = delete; // no default constructor allowed
    +
    +    simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1, const simd8 chunk2, const simd8 chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {}
    +    simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8::load(ptr), simd8::load(ptr+16), simd8::load(ptr+32), simd8::load(ptr+48)} {}
    +
    +    simdjson_inline void store(T ptr[64]) const {
    +      this->chunks[0].store(ptr+sizeof(simd8)*0);
    +      this->chunks[1].store(ptr+sizeof(simd8)*1);
    +      this->chunks[2].store(ptr+sizeof(simd8)*2);
    +      this->chunks[3].store(ptr+sizeof(simd8)*3);
    +    }
    +
    +    simdjson_inline simd8 reduce_or() const {
    +      return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]);
    +    }
    +
    +    simdjson_inline uint64_t compress(uint64_t mask, T * output) const {
    +      this->chunks[0].compress(uint16_t(mask), output);
    +      this->chunks[1].compress(uint16_t(mask >> 16), output + 16 - count_ones(mask & 0xFFFF));
    +      this->chunks[2].compress(uint16_t(mask >> 32), output + 32 - count_ones(mask & 0xFFFFFFFF));
    +      this->chunks[3].compress(uint16_t(mask >> 48), output + 48 - count_ones(mask & 0xFFFFFFFFFFFF));
    +      return 64 - count_ones(mask);
    +    }
    +
    +    simdjson_inline uint64_t to_bitmask() const {
    +      uint64_t r0 = uint32_t(this->chunks[0].to_bitmask() );
    +      uint64_t r1 =          this->chunks[1].to_bitmask() ;
    +      uint64_t r2 =          this->chunks[2].to_bitmask() ;
    +      uint64_t r3 =          this->chunks[3].to_bitmask() ;
    +      return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48);
    +    }
    +
    +    simdjson_inline uint64_t eq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] == mask,
    +        this->chunks[1] == mask,
    +        this->chunks[2] == mask,
    +        this->chunks[3] == mask
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t eq(const simd8x64 &other) const {
    +      return  simd8x64(
    +        this->chunks[0] == other.chunks[0],
    +        this->chunks[1] == other.chunks[1],
    +        this->chunks[2] == other.chunks[2],
    +        this->chunks[3] == other.chunks[3]
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t lteq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] <= mask,
    +        this->chunks[1] <= mask,
    +        this->chunks[2] <= mask,
    +        this->chunks[3] <= mask
    +      ).to_bitmask();
    +    }
    +  }; // struct simd8x64
    +
    +} // namespace simd
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_SIMD_INPUT_H
    +/* end file simdjson/westmere/simd.h */
    +/* including simdjson/westmere/stringparsing_defs.h: #include "simdjson/westmere/stringparsing_defs.h" */
    +/* begin file simdjson/westmere/stringparsing_defs.h */
    +#ifndef SIMDJSON_WESTMERE_STRINGPARSING_DEFS_H
    +#define SIMDJSON_WESTMERE_STRINGPARSING_DEFS_H
    +
    +/* including simdjson/westmere/bitmanipulation.h: #include "simdjson/westmere/bitmanipulation.h" */
    +/* begin file simdjson/westmere/bitmanipulation.h */
    +#ifndef SIMDJSON_WESTMERE_BITMANIPULATION_H
    +#define SIMDJSON_WESTMERE_BITMANIPULATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/intrinsics.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +
    +// We sometimes call trailing_zero on inputs that are zero,
    +// but the algorithms do not end up using the returned value.
    +// Sadly, sanitizers are not smart enough to figure it out.
    +SIMDJSON_NO_SANITIZE_UNDEFINED
    +// This function can be used safely even if not all bytes have been
    +// initialized.
    +// See issue https://github.com/simdjson/simdjson/issues/1965
    +SIMDJSON_NO_SANITIZE_MEMORY
    +simdjson_inline int trailing_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long ret;
    +  // Search the mask data from least significant bit (LSB)
    +  // to the most significant bit (MSB) for a set bit (1).
    +  _BitScanForward64(&ret, input_num);
    +  return (int)ret;
    +#else // SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return __builtin_ctzll(input_num);
    +#endif // SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline uint64_t clear_lowest_bit(uint64_t input_num) {
    +  return input_num & (input_num-1);
    +}
    +
    +/* result might be undefined when input_num is zero */
    +simdjson_inline int leading_zeroes(uint64_t input_num) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  unsigned long leading_zero = 0;
    +  // Search the mask data from most significant bit (MSB)
    +  // to least significant bit (LSB) for a set bit (1).
    +  if (_BitScanReverse64(&leading_zero, input_num))
    +    return (int)(63 - leading_zero);
    +  else
    +    return 64;
    +#else
    +  return __builtin_clzll(input_num);
    +#endif// SIMDJSON_REGULAR_VISUAL_STUDIO
    +}
    +
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +simdjson_inline unsigned __int64 count_ones(uint64_t input_num) {
    +  // note: we do not support legacy 32-bit Windows in this kernel
    +  return __popcnt64(input_num);// Visual Studio wants two underscores
    +}
    +#else
    +simdjson_inline long long int count_ones(uint64_t input_num) {
    +  return _popcnt64(input_num);
    +}
    +#endif
    +
    +simdjson_inline bool add_overflow(uint64_t value1, uint64_t value2,
    +                                uint64_t *result) {
    +#if SIMDJSON_REGULAR_VISUAL_STUDIO
    +  return _addcarry_u64(0, value1, value2,
    +                       reinterpret_cast(result));
    +#else
    +  return __builtin_uaddll_overflow(value1, value2,
    +                                   reinterpret_cast(result));
    +#endif
    +}
    +
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_BITMANIPULATION_H
    +/* end file simdjson/westmere/bitmanipulation.h */
    +/* including simdjson/westmere/simd.h: #include "simdjson/westmere/simd.h" */
    +/* begin file simdjson/westmere/simd.h */
    +#ifndef SIMDJSON_WESTMERE_SIMD_H
    +#define SIMDJSON_WESTMERE_SIMD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/bitmanipulation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/simdprune_tables.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +namespace simd {
    +
    +  template
    +  struct base {
    +    __m128i value;
    +
    +    // Zero constructor
    +    simdjson_inline base() : value{__m128i()} {}
    +
    +    // Conversion from SIMD register
    +    simdjson_inline base(const __m128i _value) : value(_value) {}
    +
    +    // Conversion to SIMD register
    +    simdjson_inline operator const __m128i&() const { return this->value; }
    +    simdjson_inline operator __m128i&() { return this->value; }
    +
    +    // Bit operations
    +    simdjson_inline Child operator|(const Child other) const { return _mm_or_si128(*this, other); }
    +    simdjson_inline Child operator&(const Child other) const { return _mm_and_si128(*this, other); }
    +    simdjson_inline Child operator^(const Child other) const { return _mm_xor_si128(*this, other); }
    +    simdjson_inline Child bit_andnot(const Child other) const { return _mm_andnot_si128(other, *this); }
    +    simdjson_inline Child& operator|=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast | other; return *this_cast; }
    +    simdjson_inline Child& operator&=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast & other; return *this_cast; }
    +    simdjson_inline Child& operator^=(const Child other) { auto this_cast = static_cast(this); *this_cast = *this_cast ^ other; return *this_cast; }
    +  };
    +
    +  template>
    +  struct base8: base> {
    +    typedef uint16_t bitmask_t;
    +    typedef uint32_t bitmask2_t;
    +
    +    simdjson_inline base8() : base>() {}
    +    simdjson_inline base8(const __m128i _value) : base>(_value) {}
    +
    +    friend simdjson_inline Mask operator==(const simd8 lhs, const simd8 rhs) { return _mm_cmpeq_epi8(lhs, rhs); }
    +
    +    static const int SIZE = sizeof(base>::value);
    +
    +    template
    +    simdjson_inline simd8 prev(const simd8 prev_chunk) const {
    +      return _mm_alignr_epi8(*this, prev_chunk, 16 - N);
    +    }
    +  };
    +
    +  // SIMD byte mask type (returned by things like eq and gt)
    +  template<>
    +  struct simd8: base8 {
    +    static simdjson_inline simd8 splat(bool _value) { return _mm_set1_epi8(uint8_t(-(!!_value))); }
    +
    +    simdjson_inline simd8() : base8() {}
    +    simdjson_inline simd8(const __m128i _value) : base8(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(bool _value) : base8(splat(_value)) {}
    +
    +    simdjson_inline int to_bitmask() const { return _mm_movemask_epi8(*this); }
    +    simdjson_inline bool any() const { return !_mm_testz_si128(*this, *this); }
    +    simdjson_inline simd8 operator~() const { return *this ^ true; }
    +  };
    +
    +  template
    +  struct base8_numeric: base8 {
    +    static simdjson_inline simd8 splat(T _value) { return _mm_set1_epi8(_value); }
    +    static simdjson_inline simd8 zero() { return _mm_setzero_si128(); }
    +    static simdjson_inline simd8 load(const T values[16]) {
    +      return _mm_loadu_si128(reinterpret_cast(values));
    +    }
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    static simdjson_inline simd8 repeat_16(
    +      T v0,  T v1,  T v2,  T v3,  T v4,  T v5,  T v6,  T v7,
    +      T v8,  T v9,  T v10, T v11, T v12, T v13, T v14, T v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    simdjson_inline base8_numeric() : base8() {}
    +    simdjson_inline base8_numeric(const __m128i _value) : base8(_value) {}
    +
    +    // Store to array
    +    simdjson_inline void store(T dst[16]) const { return _mm_storeu_si128(reinterpret_cast<__m128i *>(dst), *this); }
    +
    +    // Override to distinguish from bool version
    +    simdjson_inline simd8 operator~() const { return *this ^ 0xFFu; }
    +
    +    // Addition/subtraction are the same for signed and unsigned
    +    simdjson_inline simd8 operator+(const simd8 other) const { return _mm_add_epi8(*this, other); }
    +    simdjson_inline simd8 operator-(const simd8 other) const { return _mm_sub_epi8(*this, other); }
    +    simdjson_inline simd8& operator+=(const simd8 other) { *this = *this + other; return *static_cast*>(this); }
    +    simdjson_inline simd8& operator-=(const simd8 other) { *this = *this - other; return *static_cast*>(this); }
    +
    +    // Perform a lookup assuming the value is between 0 and 16 (undefined behavior for out of range values)
    +    template
    +    simdjson_inline simd8 lookup_16(simd8 lookup_table) const {
    +      return _mm_shuffle_epi8(lookup_table, *this);
    +    }
    +
    +    // Copies to 'output" all bytes corresponding to a 0 in the mask (interpreted as a bitset).
    +    // Passing a 0 value for mask would be equivalent to writing out every byte to output.
    +    // Only the first 16 - count_ones(mask) bytes of the result are significant but 16 bytes
    +    // get written.
    +    // Design consideration: it seems like a function with the
    +    // signature simd8 compress(uint32_t mask) would be
    +    // sensible, but the AVX ISA makes this kind of approach difficult.
    +    template
    +    simdjson_inline void compress(uint16_t mask, L * output) const {
    +      using internal::thintable_epi8;
    +      using internal::BitsSetTable256mul2;
    +      using internal::pshufb_combine_table;
    +      // this particular implementation was inspired by work done by @animetosho
    +      // we do it in two steps, first 8 bytes and then second 8 bytes
    +      uint8_t mask1 = uint8_t(mask); // least significant 8 bits
    +      uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
    +      // next line just loads the 64-bit values thintable_epi8[mask1] and
    +      // thintable_epi8[mask2] into a 128-bit register, using only
    +      // two instructions on most compilers.
    +      __m128i shufmask =  _mm_set_epi64x(thintable_epi8[mask2], thintable_epi8[mask1]);
    +      // we increment by 0x08 the second half of the mask
    +      shufmask =
    +      _mm_add_epi8(shufmask, _mm_set_epi32(0x08080808, 0x08080808, 0, 0));
    +      // this is the version "nearly pruned"
    +      __m128i pruned = _mm_shuffle_epi8(*this, shufmask);
    +      // we still need to put the two halves together.
    +      // we compute the popcount of the first half:
    +      int pop1 = BitsSetTable256mul2[mask1];
    +      // then load the corresponding mask, what it does is to write
    +      // only the first pop1 bytes from the first 8 bytes, and then
    +      // it fills in with the bytes from the second 8 bytes + some filling
    +      // at the end.
    +      __m128i compactmask =
    +      _mm_loadu_si128(reinterpret_cast(pshufb_combine_table + pop1 * 8));
    +      __m128i answer = _mm_shuffle_epi8(pruned, compactmask);
    +      _mm_storeu_si128(reinterpret_cast<__m128i *>(output), answer);
    +    }
    +
    +    template
    +    simdjson_inline simd8 lookup_16(
    +        L replace0,  L replace1,  L replace2,  L replace3,
    +        L replace4,  L replace5,  L replace6,  L replace7,
    +        L replace8,  L replace9,  L replace10, L replace11,
    +        L replace12, L replace13, L replace14, L replace15) const {
    +      return lookup_16(simd8::repeat_16(
    +        replace0,  replace1,  replace2,  replace3,
    +        replace4,  replace5,  replace6,  replace7,
    +        replace8,  replace9,  replace10, replace11,
    +        replace12, replace13, replace14, replace15
    +      ));
    +    }
    +  };
    +
    +  // Signed bytes
    +  template<>
    +  struct simd8 : base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m128i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(int8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const int8_t* values) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) : simd8(_mm_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3,  int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
    +      int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Order-sensitive comparisons
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm_max_epi8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm_min_epi8(*this, other); }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return _mm_cmpgt_epi8(*this, other); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return _mm_cmpgt_epi8(other, *this); }
    +  };
    +
    +  // Unsigned bytes
    +  template<>
    +  struct simd8: base8_numeric {
    +    simdjson_inline simd8() : base8_numeric() {}
    +    simdjson_inline simd8(const __m128i _value) : base8_numeric(_value) {}
    +    // Splat constructor
    +    simdjson_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
    +    // Array constructor
    +    simdjson_inline simd8(const uint8_t* values) : simd8(load(values)) {}
    +    // Member-by-member initialization
    +    simdjson_inline simd8(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) : simd8(_mm_setr_epi8(
    +      v0, v1, v2, v3, v4, v5, v6, v7,
    +      v8, v9, v10,v11,v12,v13,v14,v15
    +    )) {}
    +    // Repeat 16 values as many times as necessary (usually for lookup tables)
    +    simdjson_inline static simd8 repeat_16(
    +      uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
    +      uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    +    ) {
    +      return simd8(
    +        v0, v1, v2, v3, v4, v5, v6, v7,
    +        v8, v9, v10,v11,v12,v13,v14,v15
    +      );
    +    }
    +
    +    // Saturated math
    +    simdjson_inline simd8 saturating_add(const simd8 other) const { return _mm_adds_epu8(*this, other); }
    +    simdjson_inline simd8 saturating_sub(const simd8 other) const { return _mm_subs_epu8(*this, other); }
    +
    +    // Order-specific operations
    +    simdjson_inline simd8 max_val(const simd8 other) const { return _mm_max_epu8(*this, other); }
    +    simdjson_inline simd8 min_val(const simd8 other) const { return _mm_min_epu8(*this, other); }
    +    // Same as >, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 gt_bits(const simd8 other) const { return this->saturating_sub(other); }
    +    // Same as <, but only guarantees true is nonzero (< guarantees true = -1)
    +    simdjson_inline simd8 lt_bits(const simd8 other) const { return other.saturating_sub(*this); }
    +    simdjson_inline simd8 operator<=(const simd8 other) const { return other.max_val(*this) == other; }
    +    simdjson_inline simd8 operator>=(const simd8 other) const { return other.min_val(*this) == other; }
    +    simdjson_inline simd8 operator>(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +    simdjson_inline simd8 operator<(const simd8 other) const { return this->gt_bits(other).any_bits_set(); }
    +
    +    // Bit-specific operations
    +    simdjson_inline simd8 bits_not_set() const { return *this == uint8_t(0); }
    +    simdjson_inline simd8 bits_not_set(simd8 bits) const { return (*this & bits).bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set() const { return ~this->bits_not_set(); }
    +    simdjson_inline simd8 any_bits_set(simd8 bits) const { return ~this->bits_not_set(bits); }
    +    simdjson_inline bool is_ascii() const { return _mm_movemask_epi8(*this) == 0; }
    +    simdjson_inline bool bits_not_set_anywhere() const { return _mm_testz_si128(*this, *this); }
    +    simdjson_inline bool any_bits_set_anywhere() const { return !bits_not_set_anywhere(); }
    +    simdjson_inline bool bits_not_set_anywhere(simd8 bits) const { return _mm_testz_si128(*this, bits); }
    +    simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return !bits_not_set_anywhere(bits); }
    +    template
    +    simdjson_inline simd8 shr() const { return simd8(_mm_srli_epi16(*this, N)) & uint8_t(0xFFu >> N); }
    +    template
    +    simdjson_inline simd8 shl() const { return simd8(_mm_slli_epi16(*this, N)) & uint8_t(0xFFu << N); }
    +    // Get one of the bits and make a bitmask out of it.
    +    // e.g. value.get_bit<7>() gets the high bit
    +    template
    +    simdjson_inline int get_bit() const { return _mm_movemask_epi8(_mm_slli_epi16(*this, 7-N)); }
    +  };
    +
    +  template
    +  struct simd8x64 {
    +    static constexpr int NUM_CHUNKS = 64 / sizeof(simd8);
    +    static_assert(NUM_CHUNKS == 4, "Westmere kernel should use four registers per 64-byte block.");
    +    const simd8 chunks[NUM_CHUNKS];
    +
    +    simd8x64(const simd8x64& o) = delete; // no copy allowed
    +    simd8x64& operator=(const simd8& other) = delete; // no assignment allowed
    +    simd8x64() = delete; // no default constructor allowed
    +
    +    simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1, const simd8 chunk2, const simd8 chunk3) : chunks{chunk0, chunk1, chunk2, chunk3} {}
    +    simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8::load(ptr), simd8::load(ptr+16), simd8::load(ptr+32), simd8::load(ptr+48)} {}
    +
    +    simdjson_inline void store(T ptr[64]) const {
    +      this->chunks[0].store(ptr+sizeof(simd8)*0);
    +      this->chunks[1].store(ptr+sizeof(simd8)*1);
    +      this->chunks[2].store(ptr+sizeof(simd8)*2);
    +      this->chunks[3].store(ptr+sizeof(simd8)*3);
    +    }
    +
    +    simdjson_inline simd8 reduce_or() const {
    +      return (this->chunks[0] | this->chunks[1]) | (this->chunks[2] | this->chunks[3]);
    +    }
    +
    +    simdjson_inline uint64_t compress(uint64_t mask, T * output) const {
    +      this->chunks[0].compress(uint16_t(mask), output);
    +      this->chunks[1].compress(uint16_t(mask >> 16), output + 16 - count_ones(mask & 0xFFFF));
    +      this->chunks[2].compress(uint16_t(mask >> 32), output + 32 - count_ones(mask & 0xFFFFFFFF));
    +      this->chunks[3].compress(uint16_t(mask >> 48), output + 48 - count_ones(mask & 0xFFFFFFFFFFFF));
    +      return 64 - count_ones(mask);
    +    }
    +
    +    simdjson_inline uint64_t to_bitmask() const {
    +      uint64_t r0 = uint32_t(this->chunks[0].to_bitmask() );
    +      uint64_t r1 =          this->chunks[1].to_bitmask() ;
    +      uint64_t r2 =          this->chunks[2].to_bitmask() ;
    +      uint64_t r3 =          this->chunks[3].to_bitmask() ;
    +      return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48);
    +    }
    +
    +    simdjson_inline uint64_t eq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] == mask,
    +        this->chunks[1] == mask,
    +        this->chunks[2] == mask,
    +        this->chunks[3] == mask
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t eq(const simd8x64 &other) const {
    +      return  simd8x64(
    +        this->chunks[0] == other.chunks[0],
    +        this->chunks[1] == other.chunks[1],
    +        this->chunks[2] == other.chunks[2],
    +        this->chunks[3] == other.chunks[3]
    +      ).to_bitmask();
    +    }
    +
    +    simdjson_inline uint64_t lteq(const T m) const {
    +      const simd8 mask = simd8::splat(m);
    +      return  simd8x64(
    +        this->chunks[0] <= mask,
    +        this->chunks[1] <= mask,
    +        this->chunks[2] <= mask,
    +        this->chunks[3] <= mask
    +      ).to_bitmask();
    +    }
    +  }; // struct simd8x64
    +
    +} // namespace simd
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_SIMD_INPUT_H
    +/* end file simdjson/westmere/simd.h */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace {
    +
    +using namespace simd;
    +
    +// Holds backslashes and quotes locations.
    +struct backslash_and_quote {
    +public:
    +  static constexpr uint32_t BYTES_PROCESSED = 32;
    +  simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst);
    +
    +  simdjson_inline bool has_quote_first() { return ((bs_bits - 1) & quote_bits) != 0; }
    +  simdjson_inline bool has_backslash() { return bs_bits != 0; }
    +  simdjson_inline int quote_index() { return trailing_zeroes(quote_bits); }
    +  simdjson_inline int backslash_index() { return trailing_zeroes(bs_bits); }
    +
    +  uint32_t bs_bits;
    +  uint32_t quote_bits;
    +}; // struct backslash_and_quote
    +
    +simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) {
    +  // this can read up to 31 bytes beyond the buffer size, but we require
    +  // SIMDJSON_PADDING of padding
    +  static_assert(SIMDJSON_PADDING >= (BYTES_PROCESSED - 1), "backslash and quote finder must process fewer than SIMDJSON_PADDING bytes");
    +  simd8 v0(src);
    +  simd8 v1(src + 16);
    +  v0.store(dst);
    +  v1.store(dst + 16);
    +  uint64_t bs_and_quote = simd8x64(v0 == '\\', v1 == '\\', v0 == '"', v1 == '"').to_bitmask();
    +  return {
    +    uint32_t(bs_and_quote),      // bs_bits
    +    uint32_t(bs_and_quote >> 32) // quote_bits
    +  };
    +}
    +
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_WESTMERE_STRINGPARSING_DEFS_H
    +/* end file simdjson/westmere/stringparsing_defs.h */
    +/* end file simdjson/westmere/begin.h */
    +/* including simdjson/generic/ondemand/amalgamated.h for westmere: #include "simdjson/generic/ondemand/amalgamated.h" */
    +/* begin file simdjson/generic/ondemand/amalgamated.h for westmere */
    +#if defined(SIMDJSON_CONDITIONAL_INCLUDE) && !defined(SIMDJSON_GENERIC_ONDEMAND_DEPENDENCIES_H)
    +#error simdjson/generic/ondemand/dependencies.h must be included before simdjson/generic/ondemand/amalgamated.h!
    +#endif
    +
    +// Stuff other things depend on
    +/* including simdjson/generic/ondemand/base.h for westmere: #include "simdjson/generic/ondemand/base.h" */
    +/* begin file simdjson/generic/ondemand/base.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_BASE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_BASE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +/**
    + * A fast, simple, DOM-like interface that parses JSON as you use it.
    + *
    + * Designed for maximum speed and a lower memory profile.
    + */
    +namespace ondemand {
    +
    +/** Represents the depth of a JSON value (number of nested arrays/objects). */
    +using depth_t = int32_t;
    +
    +/** @copydoc simdjson::westmere::number_type */
    +using number_type = simdjson::westmere::number_type;
    +
    +/** @private Position in the JSON buffer indexes */
    +using token_position = const uint32_t *;
    +
    +class array;
    +class array_iterator;
    +class document;
    +class document_reference;
    +class document_stream;
    +class field;
    +class json_iterator;
    +enum class json_type;
    +struct number;
    +class object;
    +class object_iterator;
    +class parser;
    +class raw_json_string;
    +class token_iterator;
    +class value;
    +class value_iterator;
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_BASE_H
    +/* end file simdjson/generic/ondemand/base.h for westmere */
    +/* including simdjson/generic/ondemand/value_iterator.h for westmere: #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* begin file simdjson/generic/ondemand/value_iterator.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +/**
    + * Iterates through a single JSON value at a particular depth.
    + *
    + * Does not keep track of the type of value: provides methods for objects, arrays and scalars and expects
    + * the caller to call the right ones.
    + *
    + * @private This is not intended for external use.
    + */
    +class value_iterator {
    +protected:
    +  /** The underlying JSON iterator */
    +  json_iterator *_json_iter{};
    +  /** The depth of this value */
    +  depth_t _depth{};
    +  /**
    +   * The starting token index for this value
    +   */
    +  token_position _start_position{};
    +
    +public:
    +  simdjson_inline value_iterator() noexcept = default;
    +
    +  /**
    +   * Denote that we're starting a document.
    +   */
    +  simdjson_inline void start_document() noexcept;
    +
    +  /**
    +   * Skips a non-iterated or partially-iterated JSON value, whether it is a scalar, array or object.
    +   *
    +   * Optimized for scalars.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code skip_child() noexcept;
    +
    +  /**
    +   * Tell whether the iterator is at the EOF mark
    +   */
    +  simdjson_inline bool at_end() const noexcept;
    +
    +  /**
    +   * Tell whether the iterator is at the start of the value
    +   */
    +  simdjson_inline bool at_start() const noexcept;
    +
    +  /**
    +   * Tell whether the value is open--if the value has not been used, or the array/object is still open.
    +   */
    +  simdjson_inline bool is_open() const noexcept;
    +
    +  /**
    +   * Tell whether the value is at an object's first field (just after the {).
    +   */
    +  simdjson_inline bool at_first_field() const noexcept;
    +
    +  /**
    +   * Abandon all iteration.
    +   */
    +  simdjson_inline void abandon() noexcept;
    +
    +  /**
    +   * Get the child value as a value_iterator.
    +   */
    +  simdjson_inline value_iterator child_value() const noexcept;
    +
    +  /**
    +   * Get the depth of this value.
    +   */
    +  simdjson_inline int32_t depth() const noexcept;
    +
    +  /**
    +   * Get the JSON type of this value.
    +   *
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result type() const noexcept;
    +
    +  /**
    +   * @addtogroup object Object iteration
    +   *
    +   * Methods to iterate and find object fields. These methods generally *assume* the value is
    +   * actually an object; the caller is responsible for keeping track of that fact.
    +   *
    +   * @{
    +   */
    +
    +  /**
    +   * Start an object iteration.
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCORRECT_TYPE if there is no opening {
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_object() noexcept;
    +  /**
    +   * Start an object iteration from the root.
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCORRECT_TYPE if there is no opening {
    +   * @error TAPE_ERROR if there is no matching } at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_root_object() noexcept;
    +  /**
    +   * Checks whether an object could be started from the root. May be called by start_root_object.
    +   *
    +   * @returns SUCCESS if it is possible to safely start an object from the root (document level).
    +   * @error INCORRECT_TYPE if there is no opening {
    +   * @error TAPE_ERROR if there is no matching } at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline error_code check_root_object() noexcept;
    +  /**
    +   * Start an object iteration after the user has already checked and moved past the {.
    +   *
    +   * Does not move the iterator unless the object is empty ({}).
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_object() noexcept;
    +  /**
    +   * Start an object iteration from the root, after the user has already checked and moved past the {.
    +   *
    +   * Does not move the iterator unless the object is empty ({}).
    +   *
    +   * @returns Whether the object had any fields (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_root_object() noexcept;
    +
    +  /**
    +   * Moves to the next field in an object.
    +   *
    +   * Looks for , and }. If } is found, the object is finished and the iterator advances past it.
    +   * Otherwise, it advances to the next value.
    +   *
    +   * @return whether there is another field in the object.
    +   * @error TAPE_ERROR If there is a comma missing between fields.
    +   * @error TAPE_ERROR If there is a comma, but not enough tokens remaining to have a key, :, and value.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result has_next_field() noexcept;
    +
    +  /**
    +   * Get the current field's key.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result field_key() noexcept;
    +
    +  /**
    +   * Pass the : in the field and move to its value.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code field_value() noexcept;
    +
    +  /**
    +   * Find the next field with the given key.
    +   *
    +   * Assumes you have called next_field() or otherwise matched the previous value.
    +   *
    +   * This means the iterator must be sitting at the next key:
    +   *
    +   * ```
    +   * { "a": 1, "b": 2 }
    +   *           ^
    +   * ```
    +   *
    +   * Key is *raw JSON,* meaning it will be matched against the verbatim JSON without attempting to
    +   * unescape it. This works well for typical ASCII and UTF-8 keys (almost all of them), but may
    +   * fail to match some keys with escapes (\u, \n, etc.).
    +   */
    +  simdjson_warn_unused simdjson_inline error_code find_field(const std::string_view key) noexcept;
    +
    +  /**
    +   * Find the next field with the given key, *without* unescaping. This assumes object order: it
    +   * will not find the field if it was already passed when looking for some *other* field.
    +   *
    +   * Assumes you have called next_field() or otherwise matched the previous value.
    +   *
    +   * This means the iterator must be sitting at the next key:
    +   *
    +   * ```
    +   * { "a": 1, "b": 2 }
    +   *           ^
    +   * ```
    +   *
    +   * Key is *raw JSON,* meaning it will be matched against the verbatim JSON without attempting to
    +   * unescape it. This works well for typical ASCII and UTF-8 keys (almost all of them), but may
    +   * fail to match some keys with escapes (\u, \n, etc.).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result find_field_raw(const std::string_view key) noexcept;
    +
    +  /**
    +   * Find the field with the given key without regard to order, and *without* unescaping.
    +   *
    +   * This is an unordered object lookup: if the field is not found initially, it will cycle around and scan from the beginning.
    +   *
    +   * Assumes you have called next_field() or otherwise matched the previous value.
    +   *
    +   * This means the iterator must be sitting at the next key:
    +   *
    +   * ```
    +   * { "a": 1, "b": 2 }
    +   *           ^
    +   * ```
    +   *
    +   * Key is *raw JSON,* meaning it will be matched against the verbatim JSON without attempting to
    +   * unescape it. This works well for typical ASCII and UTF-8 keys (almost all of them), but may
    +   * fail to match some keys with escapes (\u, \n, etc.).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result find_field_unordered_raw(const std::string_view key) noexcept;
    +
    +  /** @} */
    +
    +  /**
    +   * @addtogroup array Array iteration
    +   * Methods to iterate over array elements. These methods generally *assume* the value is actually
    +   * an object; the caller is responsible for keeping track of that fact.
    +   * @{
    +   */
    +
    +  /**
    +   * Check for an opening [ and start an array iteration.
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCORRECT_TYPE If there is no [.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_array() noexcept;
    +  /**
    +   * Check for an opening [ and start an array iteration while at the root.
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCORRECT_TYPE If there is no [.
    +   * @error TAPE_ERROR if there is no matching ] at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result start_root_array() noexcept;
    +  /**
    +   * Checks whether an array could be started from the root. May be called by start_root_array.
    +   *
    +   * @returns SUCCESS if it is possible to safely start an array from the root (document level).
    +   * @error INCORRECT_TYPE If there is no [.
    +   * @error TAPE_ERROR if there is no matching ] at end of document
    +   */
    +  simdjson_warn_unused simdjson_inline error_code check_root_array() noexcept;
    +  /**
    +   * Start an array iteration, after the user has already checked and moved past the [.
    +   *
    +   * Does not move the iterator unless the array is empty ([]).
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_array() noexcept;
    +  /**
    +   * Start an array iteration from the root, after the user has already checked and moved past the [.
    +   *
    +   * Does not move the iterator unless the array is empty ([]).
    +   *
    +   * @returns Whether the array had any elements (returns false for empty).
    +   * @error INCOMPLETE_ARRAY_OR_OBJECT If there are no more tokens (implying the *parent*
    +   *        array or object is incomplete).
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result started_root_array() noexcept;
    +
    +  /**
    +   * Moves to the next element in an array.
    +   *
    +   * Looks for , and ]. If ] is found, the array is finished and the iterator advances past it.
    +   * Otherwise, it advances to the next value.
    +   *
    +   * @return Whether there is another element in the array.
    +   * @error TAPE_ERROR If there is a comma missing between elements.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result has_next_element() noexcept;
    +
    +  /**
    +   * Get a child value iterator.
    +   */
    +  simdjson_warn_unused simdjson_inline value_iterator child() const noexcept;
    +
    +  /** @} */
    +
    +  /**
    +   * @defgroup scalar Scalar values
    +   * @addtogroup scalar
    +   * @{
    +   */
    +
    +  simdjson_warn_unused simdjson_inline simdjson_result get_string(bool allow_replacement) noexcept;
    +  template 
    +  simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_null() noexcept;
    +  simdjson_warn_unused simdjson_inline bool is_negative() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept;
    +
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_string(bool check_trailing, bool allow_replacement) noexcept;
    +  template 
    +  simdjson_warn_unused simdjson_inline error_code get_root_string(string_type& receiver, bool check_trailing, bool allow_replacement) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_wobbly_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_raw_json_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_uint64(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_uint64_in_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_int64(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_int64_in_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_double(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_double_in_string(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_bool(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline bool is_root_negative() noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_root_integer(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_number_type(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result get_root_number(bool check_trailing) noexcept;
    +  simdjson_warn_unused simdjson_inline simdjson_result is_root_null(bool check_trailing) noexcept;
    +
    +  simdjson_inline error_code error() const noexcept;
    +  simdjson_inline uint8_t *&string_buf_loc() noexcept;
    +  simdjson_inline const json_iterator &json_iter() const noexcept;
    +  simdjson_inline json_iterator &json_iter() noexcept;
    +
    +  simdjson_inline void assert_is_valid() const noexcept;
    +  simdjson_inline bool is_valid() const noexcept;
    +
    +  /** @} */
    +protected:
    +  /**
    +   * Restarts an array iteration.
    +   * @returns Whether the array has any elements (returns false for empty).
    +   */
    +  simdjson_inline simdjson_result reset_array() noexcept;
    +  /**
    +   * Restarts an object iteration.
    +   * @returns Whether the object has any fields (returns false for empty).
    +   */
    +  simdjson_inline simdjson_result reset_object() noexcept;
    +  /**
    +   * move_at_start(): moves us so that we are pointing at the beginning of
    +   * the container. It updates the index so that at_start() is true and it
    +   * syncs the depth. The user can then create a new container instance.
    +   *
    +   * Usage: used with value::count_elements().
    +   **/
    +  simdjson_inline void move_at_start() noexcept;
    +
    +  /**
    +   * move_at_container_start(): moves us so that we are pointing at the beginning of
    +   * the container so that assert_at_container_start() passes.
    +   *
    +   * Usage: used with reset_array() and reset_object().
    +   **/
    +   simdjson_inline void move_at_container_start() noexcept;
    +  /* Useful for debugging and logging purposes. */
    +  inline std::string to_string() const noexcept;
    +  simdjson_inline value_iterator(json_iterator *json_iter, depth_t depth, token_position start_index) noexcept;
    +
    +  simdjson_inline simdjson_result parse_null(const uint8_t *json) const noexcept;
    +  simdjson_inline simdjson_result parse_bool(const uint8_t *json) const noexcept;
    +  simdjson_inline const uint8_t *peek_start() const noexcept;
    +  simdjson_inline uint32_t peek_start_length() const noexcept;
    +
    +  /**
    +   * The general idea of the advance_... methods and the peek_* methods
    +   * is that you first peek and check that you have desired type. If you do,
    +   * and only if you do, then you advance.
    +   *
    +   * We used to unconditionally advance. But this made reasoning about our
    +   * current state difficult.
    +   * Suppose you always advance. Look at the 'value' matching the key
    +   * "shadowable" in the following example...
    +   *
    +   * ({"globals":{"a":{"shadowable":[}}}})
    +   *
    +   * If the user thinks it is a Boolean and asks for it, then we check the '[',
    +   * decide it is not a Boolean, but still move into the next character ('}'). Now
    +   * we are left pointing at '}' right after a '['. And we have not yet reported
    +   * an error, only that we do not have a Boolean.
    +   *
    +   * If, instead, you just stand your ground until it is content that you know, then
    +   * you will only even move beyond the '[' if the user tells you that you have an
    +   * array. So you will be at the '}' character inside the array and, hopefully, you
    +   * will then catch the error because an array cannot start with '}', but the code
    +   * processing Boolean values does not know this.
    +   *
    +   * So the contract is: first call 'peek_...' and then call 'advance_...' only
    +   * if you have determined that it is a type you can handle.
    +   *
    +   * Unfortunately, it makes the code more verbose, longer and maybe more error prone.
    +   */
    +
    +  simdjson_inline void advance_scalar(const char *type) noexcept;
    +  simdjson_inline void advance_root_scalar(const char *type) noexcept;
    +  simdjson_inline void advance_non_root_scalar(const char *type) noexcept;
    +
    +  simdjson_inline const uint8_t *peek_scalar(const char *type) noexcept;
    +  simdjson_inline const uint8_t *peek_root_scalar(const char *type) noexcept;
    +  simdjson_inline const uint8_t *peek_non_root_scalar(const char *type) noexcept;
    +
    +
    +  simdjson_inline error_code start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept;
    +  simdjson_inline error_code end_container() noexcept;
    +
    +  /**
    +   * Advance to a place expecting a value (increasing depth).
    +   *
    +   * @return The current token (the one left behind).
    +   * @error TAPE_ERROR If the document ended early.
    +   */
    +  simdjson_inline simdjson_result advance_to_value() noexcept;
    +
    +  simdjson_inline error_code incorrect_type_error(const char *message) const noexcept;
    +  simdjson_inline error_code error_unless_more_tokens(uint32_t tokens=1) const noexcept;
    +
    +  simdjson_inline bool is_at_start() const noexcept;
    +  /**
    +   * is_at_iterator_start() returns true on an array or object after it has just been
    +   * created, whether the instance is empty or not.
    +   *
    +   * Usage: used by array::begin() in debug mode (SIMDJSON_DEVELOPMENT_CHECKS)
    +   */
    +  simdjson_inline bool is_at_iterator_start() const noexcept;
    +
    +  /**
    +   * Assuming that we are within an object, this returns true if we
    +   * are pointing at a key.
    +   *
    +   * Usage: the skip_child() method should never be used while we are pointing
    +   * at a key inside an object.
    +   */
    +  simdjson_inline bool is_at_key() const noexcept;
    +
    +  inline void assert_at_start() const noexcept;
    +  inline void assert_at_container_start() const noexcept;
    +  inline void assert_at_root() const noexcept;
    +  inline void assert_at_child() const noexcept;
    +  inline void assert_at_next() const noexcept;
    +  inline void assert_at_non_root_start() const noexcept;
    +
    +  /** Get the starting position of this value */
    +  simdjson_inline token_position start_position() const noexcept;
    +
    +  /** @copydoc error_code json_iterator::position() const noexcept; */
    +  simdjson_inline token_position position() const noexcept;
    +  /** @copydoc error_code json_iterator::end_position() const noexcept; */
    +  simdjson_inline token_position last_position() const noexcept;
    +  /** @copydoc error_code json_iterator::end_position() const noexcept; */
    +  simdjson_inline token_position end_position() const noexcept;
    +  /** @copydoc error_code json_iterator::report_error(error_code error, const char *message) noexcept; */
    +  simdjson_inline error_code report_error(error_code error, const char *message) noexcept;
    +
    +  friend class document;
    +  friend class object;
    +  friend class array;
    +  friend class value;
    +}; // value_iterator
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public westmere::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(westmere::ondemand::value_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_H
    +/* end file simdjson/generic/ondemand/value_iterator.h for westmere */
    +/* including simdjson/generic/ondemand/value.h for westmere: #include "simdjson/generic/ondemand/value.h" */
    +/* begin file simdjson/generic/ondemand/value.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +/**
    + * An ephemeral JSON value returned during iteration. It is only valid for as long as you do
    + * not access more data in the JSON document.
    + */
    +class value {
    +public:
    +  /**
    +   * Create a new invalid value.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline value() noexcept = default;
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool
    +   *
    +   * You may use get_double(), get_bool(), get_uint64(), get_int64(),
    +   * get_object(), get_array(), get_raw_json_string(), or get_string() instead.
    +   *
    +   * @returns A value of the given type, parsed from the JSON.
    +   * @returns INCORRECT_TYPE If the JSON value is not the given type.
    +   */
    +  template simdjson_inline simdjson_result get() noexcept {
    +    // Unless the simdjson library provides an inline implementation, calling this method should
    +    // immediately fail.
    +    static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. "
    +      "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
    +      "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), "
    +      " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template.");
    +  }
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool
    +   *
    +   * @param out This is set to a value of the given type, parsed from the JSON. If there is an error, this may not be initialized.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   * @returns SUCCESS If the parse succeeded and the out parameter was set to the value.
    +   */
    +  template simdjson_inline error_code get(T &out) noexcept;
    +
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @returns INCORRECT_TYPE If the JSON value is not an array.
    +   */
    +  simdjson_inline simdjson_result get_array() noexcept;
    +
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   */
    +  simdjson_inline simdjson_result get_object() noexcept;
    +
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A unsigned 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a unsigned integer.
    +   *
    +   * @returns A unsigned 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a double
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Equivalent to get().
    +   *
    +   * Important: a value should be consumed once. Calling get_string() twice on the same value
    +   * is an error.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +
    +  /**
    +   * Attempts to fill the provided std::string reference with the parsed value of the current string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Important: a value should be consumed once. Calling get_string() twice on the same value
    +   * is an error.
    +   *
    +   * Performance: This method may be slower than get_string() or get_string(bool) because it may need to allocate memory.
    +   * We recommend you avoid allocating an std::string unless you need to.
    +   *
    +   * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS.
    +   */
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +
    +  /**
    +   * Cast this JSON value to a "wobbly" string.
    +   *
    +   * The string is may not be a valid UTF-8 string.
    +   * See https://simonsapin.github.io/wtf-8/
    +   *
    +   * Important: a value should be consumed once. Calling get_wobbly_string() twice on the same value
    +   * is an error.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @returns INCORRECT_TYPE if the JSON value is not true or false.
    +   */
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +
    +  /**
    +   * Checks if this JSON value is null. If and only if the value is
    +   * null, then it is consumed (we advance). If we find a token that
    +   * begins with 'n' but is not 'null', then an error is returned.
    +   *
    +   * @returns Whether the value is null.
    +   * @returns INCORRECT_TYPE If the JSON value begins with 'n' and is not 'null'.
    +   */
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an array.
    +   */
    +  simdjson_inline operator array() noexcept(false);
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an object.
    +   */
    +  simdjson_inline operator object() noexcept(false);
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline operator int64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline operator double() noexcept(false);
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Equivalent to get().
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator raw_json_string() noexcept(false);
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not true or false.
    +   */
    +  simdjson_inline operator bool() noexcept(false);
    +#endif
    +
    +  /**
    +   * Begin array iteration.
    +   *
    +   * Part of the std::iterable interface.
    +   *
    +   * @returns INCORRECT_TYPE If the JSON value is not an array.
    +   */
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  /**
    +   * Sentinel representing the end of the array.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result end() & noexcept;
    +  /**
    +   * This method scans the array and counts the number of elements.
    +   * The count_elements method should always be called before you have begun
    +   * iterating through the array: it is expected that you are pointing at
    +   * the beginning of the array.
    +   * The runtime complexity is linear in the size of the array. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * Performance hint: You should only call count_elements() as a last
    +   * resort as it may require scanning the document twice or more.
    +   */
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  /**
    +   * This method scans the object and counts the number of key-value pairs.
    +   * The count_fields method should always be called before you have begun
    +   * iterating through the object: it is expected that you are pointing at
    +   * the beginning of the object.
    +   * The runtime complexity is linear in the size of the object. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an object is empty, it is more performant to use
    +   * the is_empty() method on the object instance.
    +   *
    +   * Performance hint: You should only call count_fields() as a last
    +   * resort as it may require scanning the document twice or more.
    +   */
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  /**
    +   * Get the value at the given index in the array. This function has linear-time complexity.
    +   * This function should only be called once on an array instance since the array iterator is not reset between each call.
    +   *
    +   * @return The value at the given index, or:
    +   *         - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
    +   */
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field(const char *key) noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](const char *key) noexcept;
    +
    +  /**
    +   * Get the type of this JSON value. It does not validate or consume the value.
    +   * E.g., you must still call "is_null()" to check that a value is null even if
    +   * "type()" returns json_type::null.
    +   *
    +   * NOTE: If you're only expecting a value to be one type (a typical case), it's generally
    +   * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just
    +   * let it throw an exception).
    +   *
    +   * @return The type of JSON value (json_type::array, json_type::object, json_type::string,
    +   *     json_type::number, json_type::boolean, or json_type::null).
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result type() noexcept;
    +
    +  /**
    +   * Checks whether the value is a scalar (string, number, null, Boolean).
    +   * Returns false when there it is an array or object.
    +   *
    +   * @returns true if the type is string, number, null, Boolean
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +
    +  /**
    +   * Checks whether the value is a negative number.
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline bool is_negative() noexcept;
    +  /**
    +   * Checks whether the value is an integer number. Note that
    +   * this requires to partially parse the number string. If
    +   * the value is determined to be an integer, it may still
    +   * not parse properly as an integer in subsequent steps
    +   * (e.g., it might overflow).
    +   *
    +   * Performance note: if you call this function systematically
    +   * before parsing a number, you may have fallen for a performance
    +   * anti-pattern.
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  /**
    +   * Determine the number type (integer or floating-point number) as quickly
    +   * as possible. This function does not fully validate the input. It is
    +   * useful when you only need to classify the numbers, without parsing them.
    +   *
    +   * If you are planning to retrieve the value or you need full validation,
    +   * consider using the get_number() method instead: it will fully parse
    +   * and validate the input, and give you access to the type:
    +   * get_number().get_number_type().
    +   *
    +   * get_number_type() is number_type::unsigned_integer if we have
    +   * an integer greater or equal to 9223372036854775808
    +   * get_number_type() is number_type::signed_integer if we have an
    +   * integer that is less than 9223372036854775808
    +   * Otherwise, get_number_type() has value number_type::floating_point_number
    +   *
    +   * This function requires processing the number string, but it is expected
    +   * to be faster than get_number().get_number_type() because it is does not
    +   * parse the number value.
    +   *
    +   * @returns the type of the number
    +   */
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +
    +  /**
    +   * Attempt to parse an ondemand::number. An ondemand::number may
    +   * contain an integer value or a floating-point value, the simdjson
    +   * library will autodetect the type. Thus it is a dynamically typed
    +   * number. Before accessing the value, you must determine the detected
    +   * type.
    +   *
    +   * number.get_number_type() is number_type::signed_integer if we have
    +   * an integer in [-9223372036854775808,9223372036854775808)
    +   * You can recover the value by calling number.get_int64() and you
    +   * have that number.is_int64() is true.
    +   *
    +   * number.get_number_type() is number_type::unsigned_integer if we have
    +   * an integer in [9223372036854775808,18446744073709551616)
    +   * You can recover the value by calling number.get_uint64() and you
    +   * have that number.is_uint64() is true.
    +   *
    +   * Otherwise, number.get_number_type() has value number_type::floating_point_number
    +   * and we have a binary64 number.
    +   * You can recover the value by calling number.get_double() and you
    +   * have that number.is_double() is true.
    +   *
    +   * You must check the type before accessing the value: it is an error
    +   * to call "get_int64()" when number.get_number_type() is not
    +   * number_type::signed_integer and when number.is_int64() is false.
    +   *
    +   * Performance note: this is designed with performance in mind. When
    +   * calling 'get_number()', you scan the number string only once, determining
    +   * efficiently the type and storing it in an efficient manner.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept;
    +
    +
    +  /**
    +   * Get the raw JSON for this token.
    +   *
    +   * The string_view will always point into the input buffer.
    +   *
    +   * The string_view will start at the beginning of the token, and include the entire token
    +   * *as well as all spaces until the next token (or EOF).* This means, for example, that a
    +   * string token always begins with a " and is always terminated by the final ", possibly
    +   * followed by a number of spaces.
    +   *
    +   * The string_view is *not* null-terminated. However, if this is a scalar (string, number,
    +   * boolean, or null), the character after the end of the string_view is guaranteed to be
    +   * a non-space token.
    +   *
    +   * Tokens include:
    +   * - {
    +   * - [
    +   * - "a string (possibly with UTF-8 or backslashed characters like \\\")".
    +   * - -1.2e-100
    +   * - true
    +   * - false
    +   * - null
    +   *
    +   * See also value::raw_json().
    +   */
    +  simdjson_inline std::string_view raw_json_token() noexcept;
    +
    +  /**
    +   * Get a string_view pointing at this value in the JSON document.
    +   * If this element is an array or an object, it consumes the array or the object
    +   * and returns a string_view instance corresponding to the
    +   * array as represented in JSON. It points inside the original document.
    +   * If this element is a scalar (string, number, Boolean, null), it returns what
    +   * raw_json_token() would return.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +  /**
    +   * Returns the current location in the document if in bounds.
    +   */
    +  simdjson_inline simdjson_result current_location() noexcept;
    +
    +  /**
    +   * Returns the current depth in the document if in bounds.
    +   *
    +   * E.g.,
    +   *  0 = finished with document
    +   *  1 = document root value (could be [ or {, not yet known)
    +   *  2 = , or } inside root array/object
    +   *  3 = key or value inside root array/object.
    +   */
    +  simdjson_inline int32_t current_depth() const noexcept;
    +
    +  /**
    +   * Get the value associated with the given JSON pointer.  We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/foo/a/1") == 20
    +   *
    +   * It is allowed for a key to be the empty string:
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("//a/1") == 20
    +   *
    +   * Note that at_pointer() called on the document automatically calls the document's rewind
    +   * method between each call. It invalidates all previously accessed arrays, objects and values
    +   * that have not been consumed.
    +   *
    +   * Calling at_pointer() on non-document instances (e.g., arrays and objects) is not
    +   * standardized (by RFC 6901). We provide some experimental support for JSON pointers
    +   * on non-document instances.  Yet it is not the case when calling at_pointer on an array
    +   * or an object instance: there is no rewind and no invalidation.
    +   *
    +   * You may only call at_pointer on an array after it has been created, but before it has
    +   * been first accessed. When calling at_pointer on an array, the pointer is advanced to
    +   * the location indicated by the JSON pointer (in case of success). It is no longer possible
    +   * to call at_pointer on the same array.
    +   *
    +   * You may call at_pointer more than once on an object, but each time the pointer is advanced
    +   * to be within the value matched by the key indicated by the JSON pointer query. Thus any preceding
    +   * key (as well as the current key) can no longer be used with following JSON pointer calls.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   */
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +
    +protected:
    +  /**
    +   * Create a value.
    +   */
    +  simdjson_inline value(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Skip this value, allowing iteration to continue.
    +   */
    +  simdjson_inline void skip() noexcept;
    +
    +  /**
    +   * Start a value at the current position.
    +   *
    +   * (It should already be started; this is just a self-documentation method.)
    +   */
    +  static simdjson_inline value start(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Resume a value.
    +   */
    +  static simdjson_inline value resume(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Get the object, starting or resuming it as necessary
    +   */
    +  simdjson_inline simdjson_result start_or_resume_object() noexcept;
    +
    +  // simdjson_inline void log_value(const char *type) const noexcept;
    +  // simdjson_inline void log_error(const char *message) const noexcept;
    +
    +  value_iterator iter{};
    +
    +  friend class document;
    +  friend class array_iterator;
    +  friend class field;
    +  friend class object;
    +  friend struct simdjson_result;
    +  friend struct simdjson_result;
    +};
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public westmere::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(westmere::ondemand::value &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result get_array() noexcept;
    +  simdjson_inline simdjson_result get_object() noexcept;
    +
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +  template simdjson_inline simdjson_result get() noexcept;
    +
    +  template simdjson_inline error_code get(T &out) noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator westmere::ondemand::array() noexcept(false);
    +  simdjson_inline operator westmere::ondemand::object() noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator westmere::ondemand::raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   *
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field(const char *key) noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */
    +  simdjson_inline simdjson_result operator[](const char *key) noexcept;
    +
    +  /**
    +   * Get the type of this JSON value.
    +   *
    +   * NOTE: If you're only expecting a value to be one type (a typical case), it's generally
    +   * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just
    +   * let it throw an exception).
    +   */
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +  simdjson_inline simdjson_result is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +
    +  /** @copydoc simdjson_inline std::string_view value::raw_json_token() const noexcept */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +  /** @copydoc simdjson_inline simdjson_result current_location() noexcept */
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  /** @copydoc simdjson_inline int32_t current_depth() const noexcept */
    +  simdjson_inline simdjson_result current_depth() const noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_H
    +/* end file simdjson/generic/ondemand/value.h for westmere */
    +/* including simdjson/generic/ondemand/logger.h for westmere: #include "simdjson/generic/ondemand/logger.h" */
    +/* begin file simdjson/generic/ondemand/logger.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_LOGGER_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +// Logging should be free unless SIMDJSON_VERBOSE_LOGGING is set. Importantly, it is critical
    +// that the call to the log functions be side-effect free. Thus, for example, you should not
    +// create temporary std::string instances.
    +namespace logger {
    +
    +enum class log_level : int32_t {
    +  info = 0,
    +  error = 1
    +};
    +
    +#if SIMDJSON_VERBOSE_LOGGING
    +  static constexpr const bool LOG_ENABLED = true;
    +#else
    +  static constexpr const bool LOG_ENABLED = false;
    +#endif
    +
    +// We do not want these functions to be 'really inlined' since real inlining is
    +// for performance purposes and if you are using the loggers, you do not care about
    +// performance (or should not).
    +static inline void log_headers() noexcept;
    +// If args are provided, title will be treated as format string
    +template 
    +static inline void log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, logger::log_level level, Args&&... args) noexcept;
    +template 
    +static inline void log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, logger::log_level level, Args&&... args) noexcept;
    +static inline void log_event(const json_iterator &iter, const char *type, std::string_view detail="", int delta=0, int depth_delta=0) noexcept;
    +static inline void log_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail="") noexcept;
    +static inline void log_value(const json_iterator &iter, const char *type, std::string_view detail="", int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_start_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail="") noexcept;
    +static inline void log_start_value(const json_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_end_value(const json_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +
    +static inline void log_error(const json_iterator &iter, token_position index, depth_t depth, const char *error, const char *detail="") noexcept;
    +static inline void log_error(const json_iterator &iter, const char *error, const char *detail="", int delta=-1, int depth_delta=0) noexcept;
    +
    +static inline void log_event(const value_iterator &iter, const char *type, std::string_view detail="", int delta=0, int depth_delta=0) noexcept;
    +static inline void log_value(const value_iterator &iter, const char *type, std::string_view detail="", int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_start_value(const value_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_end_value(const value_iterator &iter, const char *type, int delta=-1, int depth_delta=0) noexcept;
    +static inline void log_error(const value_iterator &iter, const char *error, const char *detail="", int delta=-1, int depth_delta=0) noexcept;
    +
    +} // namespace logger
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_H
    +/* end file simdjson/generic/ondemand/logger.h for westmere */
    +/* including simdjson/generic/ondemand/token_iterator.h for westmere: #include "simdjson/generic/ondemand/token_iterator.h" */
    +/* begin file simdjson/generic/ondemand/token_iterator.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/logger.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +/**
    + * Iterates through JSON tokens (`{` `}` `[` `]` `,` `:` `""` `123` `true` `false` `null`)
    + * detected by stage 1.
    + *
    + * @private This is not intended for external use.
    + */
    +class token_iterator {
    +public:
    +  /**
    +   * Create a new invalid token_iterator.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline token_iterator() noexcept = default;
    +  simdjson_inline token_iterator(token_iterator &&other) noexcept = default;
    +  simdjson_inline token_iterator &operator=(token_iterator &&other) noexcept = default;
    +  simdjson_inline token_iterator(const token_iterator &other) noexcept = default;
    +  simdjson_inline token_iterator &operator=(const token_iterator &other) noexcept = default;
    +
    +  /**
    +   * Advance to the next token (returning the current one).
    +   */
    +  simdjson_inline const uint8_t *return_current_and_advance() noexcept;
    +  /**
    +   * Reports the current offset in bytes from the start of the underlying buffer.
    +   */
    +  simdjson_inline uint32_t current_offset() const noexcept;
    +  /**
    +   * Get the JSON text for a given token (relative).
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = current token,
    +   *              1 = next token, -1 = prev token.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek(int32_t delta=0) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for a given token.
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = current token,
    +   *              1 = next token, -1 = prev token.
    +   */
    +  simdjson_inline uint32_t peek_length(int32_t delta=0) const noexcept;
    +
    +  /**
    +   * Get the JSON text for a given token.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param position The position of the token.
    +   *
    +   */
    +  simdjson_inline const uint8_t *peek(token_position position) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for a given token.
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param position The position of the token.
    +   */
    +  simdjson_inline uint32_t peek_length(token_position position) const noexcept;
    +
    +  /**
    +   * Return the current index.
    +   */
    +  simdjson_inline token_position position() const noexcept;
    +  /**
    +   * Reset to a previously saved index.
    +   */
    +  simdjson_inline void set_position(token_position target_position) noexcept;
    +
    +  // NOTE: we don't support a full C++ iterator interface, because we expect people to make
    +  // different calls to advance the iterator based on *their own* state.
    +
    +  simdjson_inline bool operator==(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator!=(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator>(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator>=(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator<(const token_iterator &other) const noexcept;
    +  simdjson_inline bool operator<=(const token_iterator &other) const noexcept;
    +
    +protected:
    +  simdjson_inline token_iterator(const uint8_t *buf, token_position position) noexcept;
    +
    +  /**
    +   * Get the index of the JSON text for a given token (relative).
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = current token,
    +   *              1 = next token, -1 = prev token.
    +   */
    +  simdjson_inline uint32_t peek_index(int32_t delta=0) const noexcept;
    +  /**
    +   * Get the index of the JSON text for a given token.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param position The position of the token.
    +   *
    +   */
    +  simdjson_inline uint32_t peek_index(token_position position) const noexcept;
    +
    +  const uint8_t *buf{};
    +  token_position _position{};
    +
    +  friend class json_iterator;
    +  friend class value_iterator;
    +  friend class object;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, logger::log_level level, Args&&... args) noexcept;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, logger::log_level level, Args&&... args) noexcept;
    +};
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public westmere::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(westmere::ondemand::token_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline ~simdjson_result() noexcept = default; ///< @private
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H
    +/* end file simdjson/generic/ondemand/token_iterator.h for westmere */
    +/* including simdjson/generic/ondemand/json_iterator.h for westmere: #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* begin file simdjson/generic/ondemand/json_iterator.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/token_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +/**
    + * Iterates through JSON tokens, keeping track of depth and string buffer.
    + *
    + * @private This is not intended for external use.
    + */
    +class json_iterator {
    +protected:
    +  token_iterator token{};
    +  ondemand::parser *parser{};
    +  /**
    +   * Next free location in the string buffer.
    +   *
    +   * Used by raw_json_string::unescape() to have a place to unescape strings to.
    +   */
    +  uint8_t *_string_buf_loc{};
    +  /**
    +   * JSON error, if there is one.
    +   *
    +   * INCORRECT_TYPE and NO_SUCH_FIELD are *not* stored here, ever.
    +   *
    +   * PERF NOTE: we *hope* this will be elided into control flow, as it is only used (a) in the first
    +   * iteration of the loop, or (b) for the final iteration after a missing comma is found in ++. If
    +   * this is not elided, we should make sure it's at least not using up a register. Failing that,
    +   * we should store it in document so there's only one of them.
    +   */
    +  error_code error{SUCCESS};
    +  /**
    +   * Depth of the current token in the JSON.
    +   *
    +   * - 0 = finished with document
    +   * - 1 = document root value (could be [ or {, not yet known)
    +   * - 2 = , or } inside root array/object
    +   * - 3 = key or value inside root array/object.
    +   */
    +  depth_t _depth{};
    +  /**
    +   * Beginning of the document indexes.
    +   * Normally we have root == parser->implementation->structural_indexes.get()
    +   * but this may differ, especially in streaming mode (where we have several
    +   * documents);
    +   */
    +  token_position _root{};
    +  /**
    +   * Normally, a json_iterator operates over a single document, but in
    +   * some cases, we may have a stream of documents. This attribute is meant
    +   * as meta-data: the json_iterator works the same irrespective of the
    +   * value of this attribute.
    +   */
    +  bool _streaming{false};
    +
    +public:
    +  simdjson_inline json_iterator() noexcept = default;
    +  simdjson_inline json_iterator(json_iterator &&other) noexcept;
    +  simdjson_inline json_iterator &operator=(json_iterator &&other) noexcept;
    +  simdjson_inline explicit json_iterator(const json_iterator &other) noexcept = default;
    +  simdjson_inline json_iterator &operator=(const json_iterator &other) noexcept = default;
    +  /**
    +   * Skips a JSON value, whether it is a scalar, array or object.
    +   */
    +  simdjson_warn_unused simdjson_inline error_code skip_child(depth_t parent_depth) noexcept;
    +
    +  /**
    +   * Tell whether the iterator is still at the start
    +   */
    +  simdjson_inline bool at_root() const noexcept;
    +
    +  /**
    +   * Tell whether we should be expected to run in streaming
    +   * mode (iterating over many documents). It is pure metadata
    +   * that does not affect how the iterator works. It is used by
    +   * start_root_array() and start_root_object().
    +   */
    +  simdjson_inline bool streaming() const noexcept;
    +
    +  /**
    +   * Get the root value iterator
    +   */
    +  simdjson_inline token_position root_position() const noexcept;
    +  /**
    +   * Assert that we are at the document depth (== 1)
    +   */
    +  simdjson_inline void assert_at_document_depth() const noexcept;
    +  /**
    +   * Assert that we are at the root of the document
    +   */
    +  simdjson_inline void assert_at_root() const noexcept;
    +
    +  /**
    +   * Tell whether the iterator is at the EOF mark
    +   */
    +  simdjson_inline bool at_end() const noexcept;
    +
    +  /**
    +   * Tell whether the iterator is live (has not been moved).
    +   */
    +  simdjson_inline bool is_alive() const noexcept;
    +
    +  /**
    +   * Abandon this iterator, setting depth to 0 (as if the document is finished).
    +   */
    +  simdjson_inline void abandon() noexcept;
    +
    +  /**
    +   * Advance the current token without modifying depth.
    +   */
    +  simdjson_inline const uint8_t *return_current_and_advance() noexcept;
    +
    +  /**
    +   * Returns true if there is a single token in the index (i.e., it is
    +   * a JSON with a scalar value such as a single number).
    +   *
    +   * @return whether there is a single token
    +   */
    +  simdjson_inline bool is_single_token() const noexcept;
    +
    +  /**
    +   * Assert that there are at least the given number of tokens left.
    +   *
    +   * Has no effect in release builds.
    +   */
    +  simdjson_inline void assert_more_tokens(uint32_t required_tokens=1) const noexcept;
    +  /**
    +   * Assert that the given position addresses an actual token (is within bounds).
    +   *
    +   * Has no effect in release builds.
    +   */
    +  simdjson_inline void assert_valid_position(token_position position) const noexcept;
    +  /**
    +   * Get the JSON text for a given token (relative).
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = next token, -1 = prev token.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek(int32_t delta=0) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for the current token (or relative).
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param delta The relative position of the token to retrieve. e.g. 0 = next token, -1 = prev token.
    +   */
    +  simdjson_inline uint32_t peek_length(int32_t delta=0) const noexcept;
    +  /**
    +   * Get a pointer to the current location in the input buffer.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * You may be pointing outside of the input buffer: it is not generally
    +   * safe to dereference this pointer.
    +   */
    +  simdjson_inline const uint8_t *unsafe_pointer() const noexcept;
    +  /**
    +   * Get the JSON text for a given token.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * @param position The position of the token to retrieve.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek(token_position position) const noexcept;
    +  /**
    +   * Get the maximum length of the JSON text for the current token (or relative).
    +   *
    +   * The length will include any whitespace at the end of the token.
    +   *
    +   * @param position The position of the token to retrieve.
    +   */
    +  simdjson_inline uint32_t peek_length(token_position position) const noexcept;
    +  /**
    +   * Get the JSON text for the last token in the document.
    +   *
    +   * This is not null-terminated; it is a view into the JSON.
    +   *
    +   * TODO consider a string_view, assuming the length will get stripped out by the optimizer when
    +   * it isn't used ...
    +   */
    +  simdjson_inline const uint8_t *peek_last() const noexcept;
    +
    +  /**
    +   * Ascend one level.
    +   *
    +   * Validates that the depth - 1 == parent_depth.
    +   *
    +   * @param parent_depth the expected parent depth.
    +   */
    +  simdjson_inline void ascend_to(depth_t parent_depth) noexcept;
    +
    +  /**
    +   * Descend one level.
    +   *
    +   * Validates that the new depth == child_depth.
    +   *
    +   * @param child_depth the expected child depth.
    +   */
    +  simdjson_inline void descend_to(depth_t child_depth) noexcept;
    +  simdjson_inline void descend_to(depth_t child_depth, int32_t delta) noexcept;
    +
    +  /**
    +   * Get current depth.
    +   */
    +  simdjson_inline depth_t depth() const noexcept;
    +
    +  /**
    +   * Get current (writeable) location in the string buffer.
    +   */
    +  simdjson_inline uint8_t *&string_buf_loc() noexcept;
    +
    +  /**
    +   * Report an unrecoverable error, preventing further iteration.
    +   *
    +   * @param error The error to report. Must not be SUCCESS, UNINITIALIZED, INCORRECT_TYPE, or NO_SUCH_FIELD.
    +   * @param message An error message to report with the error.
    +   */
    +  simdjson_inline error_code report_error(error_code error, const char *message) noexcept;
    +
    +  /**
    +   * Log error, but don't stop iteration.
    +   * @param error The error to report. Must be INCORRECT_TYPE, or NO_SUCH_FIELD.
    +   * @param message An error message to report with the error.
    +   */
    +  simdjson_inline error_code optional_error(error_code error, const char *message) noexcept;
    +
    +  /**
    +   * Take an input in json containing max_len characters and attempt to copy it over to tmpbuf, a buffer with
    +   * N bytes of capacity. It will return false if N is too small (smaller than max_len) of if it is zero.
    +   * The buffer (tmpbuf) is padded with space characters.
    +   */
    +  simdjson_warn_unused simdjson_inline bool copy_to_buffer(const uint8_t *json, uint32_t max_len, uint8_t *tmpbuf, size_t N) noexcept;
    +
    +  simdjson_inline token_position position() const noexcept;
    +  /**
    +   * Write the raw_json_string to the string buffer and return a string_view.
    +   * Each raw_json_string should be unescaped once, or else the string buffer might
    +   * overflow.
    +   */
    +  simdjson_inline simdjson_result unescape(raw_json_string in, bool allow_replacement) noexcept;
    +  simdjson_inline simdjson_result unescape_wobbly(raw_json_string in) noexcept;
    +
    +  simdjson_inline void reenter_child(token_position position, depth_t child_depth) noexcept;
    +
    +  simdjson_inline error_code consume_character(char c) noexcept;
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  simdjson_inline token_position start_position(depth_t depth) const noexcept;
    +  simdjson_inline void set_start_position(depth_t depth, token_position position) noexcept;
    +#endif
    +
    +  /* Useful for debugging and logging purposes. */
    +  inline std::string to_string() const noexcept;
    +
    +  /**
    +   * Returns the current location in the document if in bounds.
    +   */
    +  inline simdjson_result current_location() const noexcept;
    +
    +  /**
    +   * Updates this json iterator so that it is back at the beginning of the document,
    +   * as if it had just been created.
    +   */
    +  inline void rewind() noexcept;
    +  /**
    +   * This checks whether the {,},[,] are balanced so that the document
    +   * ends with proper zero depth. This requires scanning the whole document
    +   * and it may be expensive. It is expected that it will be rarely called.
    +   * It does not attempt to match { with } and [ with ].
    +   */
    +  inline bool balanced() const noexcept;
    +protected:
    +  simdjson_inline json_iterator(const uint8_t *buf, ondemand::parser *parser) noexcept;
    +  /// The last token before the end
    +  simdjson_inline token_position last_position() const noexcept;
    +  /// The token *at* the end. This points at gibberish and should only be used for comparison.
    +  simdjson_inline token_position end_position() const noexcept;
    +  /// The end of the buffer.
    +  simdjson_inline token_position end() const noexcept;
    +
    +  friend class document;
    +  friend class document_stream;
    +  friend class object;
    +  friend class array;
    +  friend class value;
    +  friend class raw_json_string;
    +  friend class parser;
    +  friend class value_iterator;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, logger::log_level level, Args&&... args) noexcept;
    +  template 
    +  friend simdjson_inline void logger::log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, logger::log_level level, Args&&... args) noexcept;
    +}; // json_iterator
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public westmere::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(westmere::ondemand::json_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H
    +/* end file simdjson/generic/ondemand/json_iterator.h for westmere */
    +/* including simdjson/generic/ondemand/json_type.h for westmere: #include "simdjson/generic/ondemand/json_type.h" */
    +/* begin file simdjson/generic/ondemand/json_type.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/numberparsing.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +/**
    + * The type of a JSON value.
    + */
    +enum class json_type {
    +    // Start at 1 to catch uninitialized / default values more easily
    +    array=1, ///< A JSON array   ( [ 1, 2, 3 ... ] )
    +    object,  ///< A JSON object  ( { "a": 1, "b" 2, ... } )
    +    number,  ///< A JSON number  ( 1 or -2.3 or 4.5e6 ...)
    +    string,  ///< A JSON string  ( "a" or "hello world\n" ...)
    +    boolean, ///< A JSON boolean (true or false)
    +    null     ///< A JSON null    (null)
    +};
    +
    +/**
    + * A type representing a JSON number.
    + * The design of the struct is deliberately straight-forward. All
    + * functions return standard values with no error check.
    + */
    +struct number {
    +
    +  /**
    +   * return the automatically determined type of
    +   * the number: number_type::floating_point_number,
    +   * number_type::signed_integer or number_type::unsigned_integer.
    +   *
    +   *    enum class number_type {
    +   *        floating_point_number=1, /// a binary64 number
    +   *        signed_integer,          /// a signed integer that fits in a 64-bit word using two's complement
    +   *        unsigned_integer         /// a positive integer larger or equal to 1<<63
    +   *    };
    +   */
    +  simdjson_inline ondemand::number_type get_number_type() const noexcept;
    +  /**
    +   * return true if the automatically determined type of
    +   * the number is number_type::unsigned_integer.
    +   */
    +  simdjson_inline bool is_uint64() const noexcept;
    +  /**
    +   * return the value as a uint64_t, only valid if is_uint64() is true.
    +   */
    +  simdjson_inline uint64_t get_uint64() const noexcept;
    +  simdjson_inline operator uint64_t() const noexcept;
    +
    +  /**
    +   * return true if the automatically determined type of
    +   * the number is number_type::signed_integer.
    +   */
    +  simdjson_inline bool is_int64() const noexcept;
    +  /**
    +   * return the value as a int64_t, only valid if is_int64() is true.
    +   */
    +  simdjson_inline int64_t get_int64() const noexcept;
    +  simdjson_inline operator int64_t() const noexcept;
    +
    +
    +  /**
    +   * return true if the automatically determined type of
    +   * the number is number_type::floating_point_number.
    +   */
    +  simdjson_inline bool is_double() const noexcept;
    +  /**
    +   * return the value as a double, only valid if is_double() is true.
    +   */
    +  simdjson_inline double get_double() const noexcept;
    +  simdjson_inline operator double() const noexcept;
    +
    +  /**
    +   * Convert the number to a double. Though it always succeed, the conversion
    +   * may be lossy if the number cannot be represented exactly.
    +   */
    +  simdjson_inline double as_double() const noexcept;
    +
    +
    +protected:
    +  /**
    +   * The next block of declaration is designed so that we can call the number parsing
    +   * functions on a number type. They are protected and should never be used outside
    +   * of the core simdjson library.
    +   */
    +  friend class value_iterator;
    +  template
    +  friend error_code numberparsing::slow_float_parsing(simdjson_unused const uint8_t * src, W writer);
    +  template
    +  friend error_code numberparsing::write_float(const uint8_t *const src, bool negative, uint64_t i, const uint8_t * start_digits, size_t digit_count, int64_t exponent, W &writer);
    +  template
    +  friend error_code numberparsing::parse_number(const uint8_t *const src, W &writer);
    +  /** Store a signed 64-bit value to the number. */
    +  simdjson_inline void append_s64(int64_t value) noexcept;
    +  /** Store an unsigned 64-bit value to the number. */
    +  simdjson_inline void append_u64(uint64_t value) noexcept;
    +  /** Store a double value to the number. */
    +  simdjson_inline void append_double(double value) noexcept;
    +  /** Specifies that the value is a double, but leave it undefined. */
    +  simdjson_inline void skip_double() noexcept;
    +  /**
    +   * End of friend declarations.
    +   */
    +
    +  /**
    +   * Our attributes are a union type (size = 64 bits)
    +   * followed by a type indicator.
    +   */
    +  union {
    +    double floating_point_number;
    +    int64_t signed_integer;
    +    uint64_t unsigned_integer;
    +  } payload{0};
    +  number_type type{number_type::signed_integer};
    +};
    +
    +/**
    + * Write the JSON type to the output stream
    + *
    + * @param out The output stream.
    + * @param type The json_type.
    + */
    +inline std::ostream& operator<<(std::ostream& out, json_type type) noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +/**
    + * Send JSON type to an output stream.
    + *
    + * @param out The output stream.
    + * @param type The json_type.
    + * @throw simdjson_error if the result being printed has an error. If there is an error with the
    + *        underlying output stream, that error will be propagated (simdjson_error will not be
    + *        thrown).
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false);
    +#endif
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public westmere::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(westmere::ondemand::json_type &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline ~simdjson_result() noexcept = default; ///< @private
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H
    +/* end file simdjson/generic/ondemand/json_type.h for westmere */
    +/* including simdjson/generic/ondemand/raw_json_string.h for westmere: #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* begin file simdjson/generic/ondemand/raw_json_string.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +/**
    + * A string escaped per JSON rules, terminated with quote ("). They are used to represent
    + * unescaped keys inside JSON documents.
    + *
    + * (In other words, a pointer to the beginning of a string, just after the start quote, inside a
    + * JSON file.)
    + *
    + * This class is deliberately simplistic and has little functionality. You can
    + * compare a raw_json_string instance with an unescaped C string, but
    + * that is nearly all you can do.
    + *
    + * The raw_json_string is unescaped. If you wish to write an unescaped version of it to your own
    + * buffer, you may do so using the parser.unescape(string, buff) method, using an ondemand::parser
    + * instance. Doing so requires you to have a sufficiently large buffer.
    + *
    + * The raw_json_string instances originate typically from field instance which in turn represent
    + * key-value pairs from object instances. From a field instance, you get the raw_json_string
    + * instance by calling key(). You can, if you want a more usable string_view instance, call
    + * the unescaped_key() method on the field instance. You may also create a raw_json_string from
    + * any other string value, with the value.get_raw_json_string() method. Again, you can get
    + * a more usable string_view instance by calling get_string().
    + *
    + */
    +class raw_json_string {
    +public:
    +  /**
    +   * Create a new invalid raw_json_string.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline raw_json_string() noexcept = default;
    +
    +  /**
    +   * Create a new invalid raw_json_string pointed at the given location in the JSON.
    +   *
    +   * The given location must be just *after* the beginning quote (") in the JSON file.
    +   *
    +   * It *must* be terminated by a ", and be a valid JSON string.
    +   */
    +  simdjson_inline raw_json_string(const uint8_t * _buf) noexcept;
    +  /**
    +   * Get the raw pointer to the beginning of the string in the JSON (just after the ").
    +   *
    +   * It is possible for this function to return a null pointer if the instance
    +   * has outlived its existence.
    +   */
    +  simdjson_inline const char * raw() const noexcept;
    +
    +  /**
    +   * This compares the current instance to the std::string_view target: returns true if
    +   * they are byte-by-byte equal (no escaping is done) on target.size() characters,
    +   * and if the raw_json_string instance has a quote character at byte index target.size().
    +   * We never read more than length + 1 bytes in the raw_json_string instance.
    +   * If length is smaller than target.size(), this will return false.
    +   *
    +   * The std::string_view instance may contain any characters. However, the caller
    +   * is responsible for setting length so that length bytes may be read in the
    +   * raw_json_string.
    +   *
    +   * Performance: the comparison may be done using memcmp which may be efficient
    +   * for long strings.
    +   */
    +  simdjson_inline bool unsafe_is_equal(size_t length, std::string_view target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the std::string_view target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   * The std::string_view instance should not contain unescaped quote characters:
    +   * the caller is responsible for this check. See is_free_from_unescaped_quote.
    +   *
    +   * Performance: the comparison is done byte-by-byte which might be inefficient for
    +   * long strings.
    +   *
    +   * If target is a compile-time constant, and your compiler likes you,
    +   * you should be able to do the following without performance penalty...
    +   *
    +   *   static_assert(raw_json_string::is_free_from_unescaped_quote(target), "");
    +   *   s.unsafe_is_equal(target);
    +   */
    +  simdjson_inline bool unsafe_is_equal(std::string_view target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the C string target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   * The provided C string should not contain an unescaped quote character:
    +   * the caller is responsible for this check. See is_free_from_unescaped_quote.
    +   *
    +   * If target is a compile-time constant, and your compiler likes you,
    +   * you should be able to do the following without performance penalty...
    +   *
    +   *   static_assert(raw_json_string::is_free_from_unescaped_quote(target), "");
    +   *   s.unsafe_is_equal(target);
    +   */
    +  simdjson_inline bool unsafe_is_equal(const char* target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the std::string_view target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   */
    +  simdjson_inline bool is_equal(std::string_view target) const noexcept;
    +
    +  /**
    +   * This compares the current instance to the C string target: returns true if
    +   * they are byte-by-byte equal (no escaping is done).
    +   */
    +  simdjson_inline bool is_equal(const char* target) const noexcept;
    +
    +  /**
    +   * Returns true if target is free from unescaped quote. If target is known at
    +   * compile-time, we might expect the computation to happen at compile time with
    +   * many compilers (not all!).
    +   */
    +  static simdjson_inline bool is_free_from_unescaped_quote(std::string_view target) noexcept;
    +  static simdjson_inline bool is_free_from_unescaped_quote(const char* target) noexcept;
    +
    +private:
    +
    +
    +  /**
    +   * This will set the inner pointer to zero, effectively making
    +   * this instance unusable.
    +   */
    +  simdjson_inline void consume() noexcept { buf = nullptr; }
    +
    +  /**
    +   * Checks whether the inner pointer is non-null and thus usable.
    +   */
    +  simdjson_inline simdjson_warn_unused bool alive() const noexcept { return buf != nullptr; }
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc.
    +   * The result will be a valid UTF-8.
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid until the next parse() call on the parser.
    +   *
    +   * @param iter A json_iterator, which contains a buffer where the string will be written.
    +   * @param allow_replacement Whether we allow replacement of invalid surrogate pairs.
    +   */
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape(json_iterator &iter, bool allow_replacement) const noexcept;
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc.
    +   * The result may not be a valid UTF-8. https://simonsapin.github.io/wtf-8/
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid until the next parse() call on the parser.
    +   *
    +   * @param iter A json_iterator, which contains a buffer where the string will be written.
    +   */
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape_wobbly(json_iterator &iter) const noexcept;
    +  const uint8_t * buf{};
    +  friend class object;
    +  friend class field;
    +  friend class parser;
    +  friend struct simdjson_result;
    +};
    +
    +simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &, const raw_json_string &) noexcept;
    +
    +/**
    + * Comparisons between raw_json_string and std::string_view instances are potentially unsafe: the user is responsible
    + * for providing a string with no unescaped quote. Note that unescaped quotes cannot be present in valid JSON strings.
    + */
    +simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept;
    +simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept;
    +simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept;
    +simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept;
    +
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public westmere::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(westmere::ondemand::raw_json_string &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline ~simdjson_result() noexcept = default; ///< @private
    +
    +  simdjson_inline simdjson_result raw() const noexcept;
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape(westmere::ondemand::json_iterator &iter, bool allow_replacement) const noexcept;
    +  simdjson_inline simdjson_warn_unused simdjson_result unescape_wobbly(westmere::ondemand::json_iterator &iter) const noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H
    +/* end file simdjson/generic/ondemand/raw_json_string.h for westmere */
    +/* including simdjson/generic/ondemand/parser.h for westmere: #include "simdjson/generic/ondemand/parser.h" */
    +/* begin file simdjson/generic/ondemand/parser.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_PARSER_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +/**
    + * The default batch size for document_stream instances for this On Demand kernel.
    + * Note that different On Demand kernel may use a different DEFAULT_BATCH_SIZE value
    + * in the future.
    + */
    +static constexpr size_t DEFAULT_BATCH_SIZE = 1000000;
    +/**
    + * Some adversary might try to set the batch size to 0 or 1, which might cause problems.
    + * We set a minimum of 32B since anything else is highly likely to be an error. In practice,
    + * most users will want a much larger batch size.
    + *
    + * All non-negative MINIMAL_BATCH_SIZE values should be 'safe' except that, obviously, no JSON
    + * document can ever span 0 or 1 byte and that very large values would create memory allocation issues.
    + */
    +static constexpr size_t MINIMAL_BATCH_SIZE = 32;
    +
    +/**
    + * A JSON fragment iterator.
    + *
    + * This holds the actual iterator as well as the buffer for writing strings.
    + */
    +class parser {
    +public:
    +  /**
    +   * Create a JSON parser.
    +   *
    +   * The new parser will have zero capacity.
    +   */
    +  inline explicit parser(size_t max_capacity = SIMDJSON_MAXSIZE_BYTES) noexcept;
    +
    +  inline parser(parser &&other) noexcept = default;
    +  simdjson_inline parser(const parser &other) = delete;
    +  simdjson_inline parser &operator=(const parser &other) = delete;
    +  simdjson_inline parser &operator=(parser &&other) noexcept = default;
    +
    +  /** Deallocate the JSON parser. */
    +  inline ~parser() noexcept = default;
    +
    +  /**
    +   * Start iterating an on-demand JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   document doc = parser.iterate(json);
    +   *
    +   * It is expected that the content is a valid UTF-8 file, containing a valid JSON document.
    +   * Otherwise the iterate method may return an error. In particular, the whole input should be
    +   * valid: we do not attempt to tolerate incorrect content either before or after a JSON
    +   * document. If there is a UTF-8 BOM, the parser skips it.
    +   *
    +   * ### IMPORTANT: Validate what you use
    +   *
    +   * Calling iterate on an invalid JSON document may not immediately trigger an error. The call to
    +   * iterate does not parse and validate the whole document.
    +   *
    +   * ### IMPORTANT: Buffer Lifetime
    +   *
    +   * Because parsing is done while you iterate, you *must* keep the JSON buffer around at least as
    +   * long as the document iteration.
    +   *
    +   * ### IMPORTANT: Document Lifetime
    +   *
    +   * Only one iteration at a time can happen per parser, and the parser *must* be kept alive during
    +   * iteration to ensure intermediate buffers can be accessed. Any document must be destroyed before
    +   * you call parse() again or destroy the parser.
    +   *
    +   * ### REQUIRED: Buffer Padding
    +   *
    +   * The buffer must have at least SIMDJSON_PADDING extra allocated bytes. It does not matter what
    +   * those bytes are initialized to, as long as they are allocated. These bytes will be read: if you
    +   * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the
    +   * SIMDJSON_PADDING bytes to avoid runtime warnings.
    +   *
    +   * @param json The JSON to parse.
    +   * @param len The length of the JSON.
    +   * @param capacity The number of bytes allocated in the JSON (must be at least len+SIMDJSON_PADDING).
    +   *
    +   * @return The document, or an error:
    +   *         - INSUFFICIENT_PADDING if the input has less than SIMDJSON_PADDING extra bytes.
    +   *         - MEMALLOC if realloc_if_needed the parser does not have enough capacity, and memory
    +   *           allocation fails.
    +   *         - EMPTY if the document is all whitespace.
    +   *         - UTF8_ERROR if the document is not valid UTF-8.
    +   *         - UNESCAPED_CHARS if a string contains control characters that must be escaped
    +   *         - UNCLOSED_STRING if there is an unclosed string in the document.
    +   */
    +  simdjson_warn_unused simdjson_result iterate(padded_string_view json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const char *json, size_t len, size_t capacity) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const uint8_t *json, size_t len, size_t capacity) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(std::string_view json, size_t capacity) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const std::string &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(std::string &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept;
    +  /** @overload simdjson_result iterate(padded_string_view json) & noexcept */
    +  simdjson_warn_unused simdjson_result iterate(padded_string &&json) & noexcept = delete;
    +
    +  /**
    +   * @private
    +   *
    +   * Start iterating an on-demand JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   json_iterator doc = parser.iterate(json);
    +   *
    +   * ### IMPORTANT: Buffer Lifetime
    +   *
    +   * Because parsing is done while you iterate, you *must* keep the JSON buffer around at least as
    +   * long as the document iteration.
    +   *
    +   * ### IMPORTANT: Document Lifetime
    +   *
    +   * Only one iteration at a time can happen per parser, and the parser *must* be kept alive during
    +   * iteration to ensure intermediate buffers can be accessed. Any document must be destroyed before
    +   * you call parse() again or destroy the parser.
    +   *
    +   * The ondemand::document instance holds the iterator. The document must remain in scope
    +   * while you are accessing instances of ondemand::value, ondemand::object, ondemand::array.
    +   *
    +   * ### REQUIRED: Buffer Padding
    +   *
    +   * The buffer must have at least SIMDJSON_PADDING extra allocated bytes. It does not matter what
    +   * those bytes are initialized to, as long as they are allocated. These bytes will be read: if you
    +   * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the
    +   * SIMDJSON_PADDING bytes to avoid runtime warnings.
    +   *
    +   * @param json The JSON to parse.
    +   *
    +   * @return The iterator, or an error:
    +   *         - INSUFFICIENT_PADDING if the input has less than SIMDJSON_PADDING extra bytes.
    +   *         - MEMALLOC if realloc_if_needed the parser does not have enough capacity, and memory
    +   *           allocation fails.
    +   *         - EMPTY if the document is all whitespace.
    +   *         - UTF8_ERROR if the document is not valid UTF-8.
    +   *         - UNESCAPED_CHARS if a string contains control characters that must be escaped
    +   *         - UNCLOSED_STRING if there is an unclosed string in the document.
    +   */
    +  simdjson_warn_unused simdjson_result iterate_raw(padded_string_view json) & noexcept;
    +
    +
    +  /**
    +   * Parse a buffer containing many JSON documents.
    +   *
    +   *   auto json = R"({ "foo": 1 } { "foo": 2 } { "foo": 3 } )"_padded;
    +   *   ondemand::parser parser;
    +   *   ondemand::document_stream docs = parser.iterate_many(json);
    +   *   for (auto & doc : docs) {
    +   *     std::cout << doc["foo"] << std::endl;
    +   *   }
    +   *   // Prints 1 2 3
    +   *
    +   * No copy of the input buffer is made.
    +   *
    +   * The function is lazy: it may be that no more than one JSON document at a time is parsed.
    +   *
    +   * The caller is responsabile to ensure that the input string data remains unchanged and is
    +   * not deleted during the loop.
    +   *
    +   * ### Format
    +   *
    +   * The buffer must contain a series of one or more JSON documents, concatenated into a single
    +   * buffer, separated by ASCII whitespace. It effectively parses until it has a fully valid document,
    +   * then starts parsing the next document at that point. (It does this with more parallelism and
    +   * lookahead than you might think, though.)
    +   *
    +   * documents that consist of an object or array may omit the whitespace between them, concatenating
    +   * with no separator. Documents that consist of a single primitive (i.e. documents that are not
    +   * arrays or objects) MUST be separated with ASCII whitespace.
    +   *
    +   * The characters inside a JSON document, and between JSON documents, must be valid Unicode (UTF-8).
    +   * If there is a UTF-8 BOM, the parser skips it.
    +   *
    +   * The documents must not exceed batch_size bytes (by default 1MB) or they will fail to parse.
    +   * Setting batch_size to excessively large or excessively small values may impact negatively the
    +   * performance.
    +   *
    +   * ### REQUIRED: Buffer Padding
    +   *
    +   * The buffer must have at least SIMDJSON_PADDING extra allocated bytes. It does not matter what
    +   * those bytes are initialized to, as long as they are allocated. These bytes will be read: if you
    +   * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the
    +   * SIMDJSON_PADDING bytes to avoid runtime warnings.
    +   *
    +   * ### Threads
    +   *
    +   * When compiled with SIMDJSON_THREADS_ENABLED, this method will use a single thread under the
    +   * hood to do some lookahead.
    +   *
    +   * ### Parser Capacity
    +   *
    +   * If the parser's current capacity is less than batch_size, it will allocate enough capacity
    +   * to handle it (up to max_capacity).
    +   *
    +   * @param buf The concatenated JSON to parse.
    +   * @param len The length of the concatenated JSON.
    +   * @param batch_size The batch size to use. MUST be larger than the largest document. The sweet
    +   *                   spot is cache-related: small enough to fit in cache, yet big enough to
    +   *                   parse as many documents as possible in one tight loop.
    +   *                   Defaults to 10MB, which has been a reasonable sweet spot in our tests.
    +   * @param allow_comma_separated (defaults on false) This allows a mode where the documents are
    +   *                   separated by commas instead of whitespace. It comes with a performance
    +   *                   penalty because the entire document is indexed at once (and the document must be
    +   *                   less than 4 GB), and there is no multithreading. In this mode, the batch_size parameter
    +   *                   is effectively ignored, as it is set to at least the document size.
    +   * @return The stream, or an error. An empty input will yield 0 documents rather than an EMPTY error. Errors:
    +   *         - MEMALLOC if the parser does not have enough capacity and memory allocation fails
    +   *         - CAPACITY if the parser does not have enough capacity and batch_size > max_capacity.
    +   *         - other json errors if parsing fails. You should not rely on these errors to always the same for the
    +   *           same document: they may vary under runtime dispatch (so they may vary depending on your system and hardware).
    +   */
    +  inline simdjson_result iterate_many(const uint8_t *buf, size_t len, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */
    +  inline simdjson_result iterate_many(const char *buf, size_t len, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */
    +  inline simdjson_result iterate_many(const std::string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  inline simdjson_result iterate_many(const std::string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe
    +  /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */
    +  inline simdjson_result iterate_many(const padded_string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept;
    +  inline simdjson_result iterate_many(const padded_string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe
    +
    +  /** @private We do not want to allow implicit conversion from C string to std::string. */
    +  simdjson_result iterate_many(const char *buf, size_t batch_size = DEFAULT_BATCH_SIZE) noexcept = delete;
    +
    +  /** The capacity of this parser (the largest document it can process). */
    +  simdjson_inline size_t capacity() const noexcept;
    +  /** The maximum capacity of this parser (the largest document it is allowed to process). */
    +  simdjson_inline size_t max_capacity() const noexcept;
    +  simdjson_inline void set_max_capacity(size_t max_capacity) noexcept;
    +  /**
    +   * The maximum depth of this parser (the most deeply nested objects and arrays it can process).
    +   * This parameter is only relevant when the macro SIMDJSON_DEVELOPMENT_CHECKS is set to true.
    +   * The document's instance current_depth() method should be used to monitor the parsing
    +   * depth and limit it if desired.
    +   */
    +  simdjson_inline size_t max_depth() const noexcept;
    +
    +  /**
    +   * Ensure this parser has enough memory to process JSON documents up to `capacity` bytes in length
    +   * and `max_depth` depth.
    +   *
    +   * The max_depth parameter is only relevant when the macro SIMDJSON_DEVELOPMENT_CHECKS is set to true.
    +   * The document's instance current_depth() method should be used to monitor the parsing
    +   * depth and limit it if desired.
    +   *
    +   * @param capacity The new capacity.
    +   * @param max_depth The new max_depth. Defaults to DEFAULT_MAX_DEPTH.
    +   * @return The error, if there is one.
    +   */
    +  simdjson_warn_unused error_code allocate(size_t capacity, size_t max_depth=DEFAULT_MAX_DEPTH) noexcept;
    +
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  /**
    +   * The parser instance can use threads when they are available to speed up some
    +   * operations. It is enabled by default. Changing this attribute will change the
    +   * behavior of the parser for future operations.
    +   */
    +  bool threaded{true};
    +  #endif
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc. to a user-provided buffer.
    +   * The result must be valid UTF-8.
    +   * The provided pointer is advanced to the end of the string by reference, and a string_view instance
    +   * is returned. You can ensure that your buffer is large enough by allocating a block of memory at least
    +   * as large as the input JSON plus SIMDJSON_PADDING and then unescape all strings to this one buffer.
    +   *
    +   * This unescape function is a low-level function. If you want a more user-friendly approach, you should
    +   * avoid raw_json_string instances (e.g., by calling unescaped_key() instead of key() or get_string()
    +   * instead of get_raw_json_string()).
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid as long as the bytes in dst.
    +   *
    +   * @param raw_json_string input
    +   * @param dst A pointer to a buffer at least large enough to write this string as well as
    +   *            an additional SIMDJSON_PADDING bytes.
    +   * @param allow_replacement Whether we allow a replacement if the input string contains unmatched surrogate pairs.
    +   * @return A string_view pointing at the unescaped string in dst
    +   * @error STRING_ERROR if escapes are incorrect.
    +   */
    +  simdjson_inline simdjson_result unescape(raw_json_string in, uint8_t *&dst, bool allow_replacement = false) const noexcept;
    +
    +  /**
    +   * Unescape this JSON string, replacing \\ with \, \n with newline, etc. to a user-provided buffer.
    +   * The result may not be valid UTF-8. See https://simonsapin.github.io/wtf-8/
    +   * The provided pointer is advanced to the end of the string by reference, and a string_view instance
    +   * is returned. You can ensure that your buffer is large enough by allocating a block of memory at least
    +   * as large as the input JSON plus SIMDJSON_PADDING and then unescape all strings to this one buffer.
    +   *
    +   * This unescape function is a low-level function. If you want a more user-friendly approach, you should
    +   * avoid raw_json_string instances (e.g., by calling unescaped_key() instead of key() or get_string()
    +   * instead of get_raw_json_string()).
    +   *
    +   * ## IMPORTANT: string_view lifetime
    +   *
    +   * The string_view is only valid as long as the bytes in dst.
    +   *
    +   * @param raw_json_string input
    +   * @param dst A pointer to a buffer at least large enough to write this string as well as
    +   *            an additional SIMDJSON_PADDING bytes.
    +   * @return A string_view pointing at the unescaped string in dst
    +   * @error STRING_ERROR if escapes are incorrect.
    +   */
    +  simdjson_inline simdjson_result unescape_wobbly(raw_json_string in, uint8_t *&dst) const noexcept;
    +
    +private:
    +  /** @private [for benchmarking access] The implementation to use */
    +  std::unique_ptr implementation{};
    +  size_t _capacity{0};
    +  size_t _max_capacity;
    +  size_t _max_depth{DEFAULT_MAX_DEPTH};
    +  std::unique_ptr string_buf{};
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  std::unique_ptr start_positions{};
    +#endif
    +
    +  friend class json_iterator;
    +  friend class document_stream;
    +};
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public westmere::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(westmere::ondemand::parser &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_H
    +/* end file simdjson/generic/ondemand/parser.h for westmere */
    +
    +// All other declarations
    +/* including simdjson/generic/ondemand/array.h for westmere: #include "simdjson/generic/ondemand/array.h" */
    +/* begin file simdjson/generic/ondemand/array.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +/**
    + * A forward-only JSON array.
    + */
    +class array {
    +public:
    +  /**
    +   * Create a new invalid array.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline array() noexcept = default;
    +
    +  /**
    +   * Begin array iteration.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result begin() noexcept;
    +  /**
    +   * Sentinel representing the end of the array.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result end() noexcept;
    +  /**
    +   * This method scans the array and counts the number of elements.
    +   * The count_elements method should always be called before you have begun
    +   * iterating through the array: it is expected that you are pointing at
    +   * the beginning of the array.
    +   * The runtime complexity is linear in the size of the array. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an array is empty, it is more performant to use
    +   * the is_empty() method.
    +   */
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  /**
    +   * This method scans the beginning of the array and checks whether the
    +   * array is empty.
    +   * The runtime complexity is constant time. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   */
    +  simdjson_inline simdjson_result is_empty() & noexcept;
    +  /**
    +   * Reset the iterator so that we are pointing back at the
    +   * beginning of the array. You should still consume values only once even if you
    +   * can iterate through the array more than once. If you unescape a string
    +   * within the array more than once, you have unsafe code. Note that rewinding
    +   * an array means that you may need to reparse it anew: it is not a free
    +   * operation.
    +   *
    +   * @returns true if the array contains some elements (not empty)
    +   */
    +  inline simdjson_result reset() & noexcept;
    +  /**
    +   * Get the value associated with the given JSON pointer.  We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard, interpreting the current node
    +   * as the root of its own JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"([ { "foo": { "a": [ 10, 20, 30 ] }} ])"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/0/foo/a/1") == 20
    +   *
    +   * Note that at_pointer() called on the document automatically calls the document's rewind
    +   * method between each call. It invalidates all previously accessed arrays, objects and values
    +   * that have not been consumed. Yet it is not the case when calling at_pointer on an array
    +   * instance: there is no rewind and no invalidation.
    +   *
    +   * You may only call at_pointer on an array after it has been created, but before it has
    +   * been first accessed. When calling at_pointer on an array, the pointer is advanced to
    +   * the location indicated by the JSON pointer (in case of success). It is no longer possible
    +   * to call at_pointer on the same array.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching.
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   */
    +  inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  /**
    +   * Consumes the array and returns a string_view instance corresponding to the
    +   * array as represented in JSON. It points inside the original document.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +  /**
    +   * Get the value at the given index. This function has linear-time complexity.
    +   * This function should only be called once on an array instance since the array iterator is not reset between each call.
    +   *
    +   * @return The value at the given index, or:
    +   *         - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
    +   */
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +protected:
    +  /**
    +   * Go to the end of the array, no matter where you are right now.
    +   */
    +  simdjson_inline error_code consume() noexcept;
    +
    +  /**
    +   * Begin array iteration.
    +   *
    +   * @param iter The iterator. Must be where the initial [ is expected. Will be *moved* into the
    +   *        resulting array.
    +   * @error INCORRECT_TYPE if the iterator is not at [.
    +   */
    +  static simdjson_inline simdjson_result start(value_iterator &iter) noexcept;
    +  /**
    +   * Begin array iteration from the root.
    +   *
    +   * @param iter The iterator. Must be where the initial [ is expected. Will be *moved* into the
    +   *        resulting array.
    +   * @error INCORRECT_TYPE if the iterator is not at [.
    +   * @error TAPE_ERROR if there is no closing ] at the end of the document.
    +   */
    +  static simdjson_inline simdjson_result start_root(value_iterator &iter) noexcept;
    +  /**
    +   * Begin array iteration.
    +   *
    +   * This version of the method should be called after the initial [ has been verified, and is
    +   * intended for use by switch statements that check the type of a value.
    +   *
    +   * @param iter The iterator. Must be after the initial [. Will be *moved* into the resulting array.
    +   */
    +  static simdjson_inline simdjson_result started(value_iterator &iter) noexcept;
    +
    +  /**
    +   * Create an array at the given Internal array creation. Call array::start() or array::started() instead of this.
    +   *
    +   * @param iter The iterator. Must either be at the start of the first element with iter.is_alive()
    +   *        == true, or past the [] with is_alive() == false if the array is empty. Will be *moved*
    +   *        into the resulting array.
    +   */
    +  simdjson_inline array(const value_iterator &iter) noexcept;
    +
    +  /**
    +   * Iterator marking current position.
    +   *
    +   * iter.is_alive() == false indicates iteration is complete.
    +   */
    +  value_iterator iter{};
    +
    +  friend class value;
    +  friend class document;
    +  friend struct simdjson_result;
    +  friend struct simdjson_result;
    +  friend class array_iterator;
    +};
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public westmere::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(westmere::ondemand::array &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result begin() noexcept;
    +  simdjson_inline simdjson_result end() noexcept;
    +  inline simdjson_result count_elements() & noexcept;
    +  inline simdjson_result is_empty() & noexcept;
    +  inline simdjson_result reset() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_H
    +/* end file simdjson/generic/ondemand/array.h for westmere */
    +/* including simdjson/generic/ondemand/array_iterator.h for westmere: #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* begin file simdjson/generic/ondemand/array_iterator.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +/**
    + * A forward-only JSON array.
    + *
    + * This is an input_iterator, meaning:
    + * - It is forward-only
    + * - * must be called exactly once per element.
    + * - ++ must be called exactly once in between each * (*, ++, *, ++, * ...)
    + */
    +class array_iterator {
    +public:
    +  /** Create a new, invalid array iterator. */
    +  simdjson_inline array_iterator() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  /**
    +   * Get the current element.
    +   *
    +   * Part of the std::iterator interface.
    +   */
    +  simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  /**
    +   * Check if we are at the end of the JSON.
    +   *
    +   * Part of the std::iterator interface.
    +   *
    +   * @return true if there are no more elements in the JSON array.
    +   */
    +  simdjson_inline bool operator==(const array_iterator &) const noexcept;
    +  /**
    +   * Check if there are more elements in the JSON array.
    +   *
    +   * Part of the std::iterator interface.
    +   *
    +   * @return true if there are more elements in the JSON array.
    +   */
    +  simdjson_inline bool operator!=(const array_iterator &) const noexcept;
    +  /**
    +   * Move to the next element.
    +   *
    +   * Part of the std::iterator interface.
    +   */
    +  simdjson_inline array_iterator &operator++() noexcept;
    +
    +private:
    +  value_iterator iter{};
    +
    +  simdjson_inline array_iterator(const value_iterator &iter) noexcept;
    +
    +  friend class array;
    +  friend class value;
    +  friend struct simdjson_result;
    +};
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public westmere::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(westmere::ondemand::array_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  simdjson_inline bool operator==(const simdjson_result &) const noexcept;
    +  simdjson_inline bool operator!=(const simdjson_result &) const noexcept;
    +  simdjson_inline simdjson_result &operator++() noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H
    +/* end file simdjson/generic/ondemand/array_iterator.h for westmere */
    +/* including simdjson/generic/ondemand/document.h for westmere: #include "simdjson/generic/ondemand/document.h" */
    +/* begin file simdjson/generic/ondemand/document.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +/**
    + * A JSON document. It holds a json_iterator instance.
    + *
    + * Used by tokens to get text, and string buffer location.
    + *
    + * You must keep the document around during iteration.
    + */
    +class document {
    +public:
    +  /**
    +   * Create a new invalid document.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline document() noexcept = default;
    +  simdjson_inline document(const document &other) noexcept = delete; // pass your documents by reference, not by copy
    +  simdjson_inline document(document &&other) noexcept = default;
    +  simdjson_inline document &operator=(const document &other) noexcept = delete;
    +  simdjson_inline document &operator=(document &&other) noexcept = default;
    +
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @returns INCORRECT_TYPE If the JSON value is not an array.
    +   */
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   */
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  /**
    +   * Cast this JSON value (inside string) to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  /**
    +   * Cast this JSON value (inside string) to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double() noexcept;
    +
    +  /**
    +   * Cast this JSON value (inside string) to a double.
    +   *
    +   * @returns A double.
    +   * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Important: Calling get_string() twice on the same document is an error.
    +   *
    +   * @param Whether to allow a replacement character for unmatched surrogate pairs.
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  /**
    +   * Attempts to fill the provided std::string reference with the parsed value of the current string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * Important: a value should be consumed once. Calling get_string() twice on the same value
    +   * is an error.
    +   *
    +   * Performance: This method may be slower than get_string() or get_string(bool) because it may need to allocate memory.
    +   * We recommend you avoid allocating an std::string unless you need to.
    +   *
    +   * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS.
    +   */
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is not guaranteed to be valid UTF-8. See https://simonsapin.github.io/wtf-8/
    +   *
    +   * Important: Calling get_wobbly_string() twice on the same document is an error.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @returns INCORRECT_TYPE if the JSON value is not a string.
    +   */
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @returns INCORRECT_TYPE if the JSON value is not true or false.
    +   */
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  /**
    +   * Cast this JSON value to a value when the document is an object or an array.
    +   *
    +   * You must not have begun iterating through the object or array. When
    +   * SIMDJSON_DEVELOPMENT_CHECKS is set to 1 (which is the case when building in Debug mode
    +   * by default), and you have already begun iterating,
    +   * you will get an OUT_OF_ORDER_ITERATION error. If you have begun iterating, you can use
    +   * rewind() to reset the document to its initial state before calling this method.
    +   *
    +   * @returns A value if a JSON array or object cannot be found.
    +   * @returns SCALAR_DOCUMENT_AS_VALUE error is the document is a scalar (see is_scalar() function).
    +   */
    +  simdjson_inline simdjson_result get_value() noexcept;
    +
    +  /**
    +   * Checks if this JSON value is null.  If and only if the value is
    +   * null, then it is consumed (we advance). If we find a token that
    +   * begins with 'n' but is not 'null', then an error is returned.
    +   *
    +   * @returns Whether the value is null.
    +   * @returns INCORRECT_TYPE If the JSON value begins with 'n' and is not 'null'.
    +   */
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool
    +   *
    +   * You may use get_double(), get_bool(), get_uint64(), get_int64(),
    +   * get_object(), get_array(), get_raw_json_string(), or get_string() instead.
    +   *
    +   * @returns A value of the given type, parsed from the JSON.
    +   * @returns INCORRECT_TYPE If the JSON value is not the given type.
    +   */
    +  template simdjson_inline simdjson_result get() & noexcept {
    +    // Unless the simdjson library provides an inline implementation, calling this method should
    +    // immediately fail.
    +    static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. "
    +      "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
    +      "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), "
    +      " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template.");
    +  }
    +  /** @overload template simdjson_result get() & noexcept */
    +  template simdjson_inline simdjson_result get() && noexcept {
    +    // Unless the simdjson library provides an inline implementation, calling this method should
    +    // immediately fail.
    +    static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. "
    +      "The supported types are ondemand::object, ondemand::array, raw_json_string, std::string_view, uint64_t, "
    +      "int64_t, double, and bool. We recommend you use get_double(), get_bool(), get_uint64(), get_int64(), "
    +      " get_object(), get_array(), get_raw_json_string(), or get_string() instead of the get template.");
    +  }
    +
    +  /**
    +   * Get this value as the given type.
    +   *
    +   * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool, value
    +   *
    +   * Be mindful that the document instance must remain in scope while you are accessing object, array and value instances.
    +   *
    +   * @param out This is set to a value of the given type, parsed from the JSON. If there is an error, this may not be initialized.
    +   * @returns INCORRECT_TYPE If the JSON value is not an object.
    +   * @returns SUCCESS If the parse succeeded and the out parameter was set to the value.
    +   */
    +  template simdjson_inline error_code get(T &out) & noexcept;
    +  /** @overload template error_code get(T &out) & noexcept */
    +  template simdjson_inline error_code get(T &out) && noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  /**
    +   * Cast this JSON value to an array.
    +   *
    +   * @returns An object that can be used to iterate the array.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an array.
    +   */
    +  simdjson_inline operator array() & noexcept(false);
    +  /**
    +   * Cast this JSON value to an object.
    +   *
    +   * @returns An object that can be used to look up or iterate fields.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an object.
    +   */
    +  simdjson_inline operator object() & noexcept(false);
    +  /**
    +   * Cast this JSON value to an unsigned integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit unsigned integer.
    +   */
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a signed integer.
    +   *
    +   * @returns A signed 64-bit integer.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit integer.
    +   */
    +  simdjson_inline operator int64_t() noexcept(false);
    +  /**
    +   * Cast this JSON value to a double.
    +   *
    +   * @returns A double.
    +   * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a valid floating-point number.
    +   */
    +  simdjson_inline operator double() noexcept(false);
    +  /**
    +   * Cast this JSON value to a string.
    +   *
    +   * The string is guaranteed to be valid UTF-8.
    +   *
    +   * @returns An UTF-8 string. The string is stored in the parser and will be invalidated the next
    +   *          time it parses a document or when it is destroyed.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  /**
    +   * Cast this JSON value to a raw_json_string.
    +   *
    +   * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n).
    +   *
    +   * @returns A pointer to the raw JSON for the given string.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string.
    +   */
    +  simdjson_inline operator raw_json_string() noexcept(false);
    +  /**
    +   * Cast this JSON value to a bool.
    +   *
    +   * @returns A bool value.
    +   * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not true or false.
    +   */
    +  simdjson_inline operator bool() noexcept(false);
    +  /**
    +   * Cast this JSON value to a value when the document is an object or an array.
    +   *
    +   * You must not have begun iterating through the object or array. When
    +   * SIMDJSON_DEVELOPMENT_CHECKS is defined, and you have already begun iterating,
    +   * you will get an OUT_OF_ORDER_ITERATION error. If you have begun iterating, you can use
    +   * rewind() to reset the document to its initial state before calling this method.
    +   *
    +   * @returns A value value if a JSON array or object cannot be found.
    +   * @exception SCALAR_DOCUMENT_AS_VALUE error is the document is a scalar (see is_scalar() function).
    +   */
    +  simdjson_inline operator value() noexcept(false);
    +#endif
    +  /**
    +   * This method scans the array and counts the number of elements.
    +   * The count_elements method should always be called before you have begun
    +   * iterating through the array: it is expected that you are pointing at
    +   * the beginning of the array.
    +   * The runtime complexity is linear in the size of the array. After
    +   * calling this function, if successful, the array is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   */
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +   /**
    +   * This method scans the object and counts the number of key-value pairs.
    +   * The count_fields method should always be called before you have begun
    +   * iterating through the object: it is expected that you are pointing at
    +   * the beginning of the object.
    +   * The runtime complexity is linear in the size of the object. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an object is empty, it is more performant to use
    +   * the is_empty() method.
    +   */
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  /**
    +   * Get the value at the given index in the array. This function has linear-time complexity.
    +   * This function should only be called once on an array instance since the array iterator is not reset between each call.
    +   *
    +   * @return The value at the given index, or:
    +   *         - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length
    +   */
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  /**
    +   * Begin array iteration.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  /**
    +   * Sentinel representing the end of the array.
    +   *
    +   * Part of the std::iterable interface.
    +   */
    +  simdjson_inline simdjson_result end() & noexcept;
    +
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   *
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. E.g., the array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to
    +   * a key a single time. Doing object["mykey"].to_string()and then again object["mykey"].to_string()
    +   * is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. E.g., the array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to a key
    +   * a single time. Doing object["mykey"].to_string() and then again object["mykey"].to_string()
    +   * is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +
    +  /**
    +   * Get the type of this JSON value. It does not validate or consume the value.
    +   * E.g., you must still call "is_null()" to check that a value is null even if
    +   * "type()" returns json_type::null.
    +   *
    +   * NOTE: If you're only expecting a value to be one type (a typical case), it's generally
    +   * better to just call .get_double, .get_string, etc. and check for INCORRECT_TYPE (or just
    +   * let it throw an exception).
    +   *
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result type() noexcept;
    +
    +  /**
    +   * Checks whether the document is a scalar (string, number, null, Boolean).
    +   * Returns false when there it is an array or object.
    +   *
    +   * @returns true if the type is string, number, null, Boolean
    +   * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse".
    +   */
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +
    +  /**
    +   * Checks whether the document is a negative number.
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline bool is_negative() noexcept;
    +  /**
    +   * Checks whether the document is an integer number. Note that
    +   * this requires to partially parse the number string. If
    +   * the value is determined to be an integer, it may still
    +   * not parse properly as an integer in subsequent steps
    +   * (e.g., it might overflow).
    +   *
    +   * @returns true if the number if negative.
    +   */
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  /**
    +   * Determine the number type (integer or floating-point number) as quickly
    +   * as possible. This function does not fully validate the input. It is
    +   * useful when you only need to classify the numbers, without parsing them.
    +   *
    +   * If you are planning to retrieve the value or you need full validation,
    +   * consider using the get_number() method instead: it will fully parse
    +   * and validate the input, and give you access to the type:
    +   * get_number().get_number_type().
    +   *
    +   * get_number_type() is number_type::unsigned_integer if we have
    +   * an integer greater or equal to 9223372036854775808
    +   * get_number_type() is number_type::signed_integer if we have an
    +   * integer that is less than 9223372036854775808
    +   * Otherwise, get_number_type() has value number_type::floating_point_number
    +   *
    +   * This function requires processing the number string, but it is expected
    +   * to be faster than get_number().get_number_type() because it is does not
    +   * parse the number value.
    +   *
    +   * @returns the type of the number
    +   */
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +
    +  /**
    +   * Attempt to parse an ondemand::number. An ondemand::number may
    +   * contain an integer value or a floating-point value, the simdjson
    +   * library will autodetect the type. Thus it is a dynamically typed
    +   * number. Before accessing the value, you must determine the detected
    +   * type.
    +   *
    +   * number.get_number_type() is number_type::signed_integer if we have
    +   * an integer in [-9223372036854775808,9223372036854775808)
    +   * You can recover the value by calling number.get_int64() and you
    +   * have that number.is_int64() is true.
    +   *
    +   * number.get_number_type() is number_type::unsigned_integer if we have
    +   * an integer in [9223372036854775808,18446744073709551616)
    +   * You can recover the value by calling number.get_uint64() and you
    +   * have that number.is_uint64() is true.
    +   *
    +   * Otherwise, number.get_number_type() has value number_type::floating_point_number
    +   * and we have a binary64 number.
    +   * You can recover the value by calling number.get_double() and you
    +   * have that number.is_double() is true.
    +   *
    +   * You must check the type before accessing the value: it is an error
    +   * to call "get_int64()" when number.get_number_type() is not
    +   * number_type::signed_integer and when number.is_int64() is false.
    +   */
    +  simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept;
    +
    +  /**
    +   * Get the raw JSON for this token.
    +   *
    +   * The string_view will always point into the input buffer.
    +   *
    +   * The string_view will start at the beginning of the token, and include the entire token
    +   * *as well as all spaces until the next token (or EOF).* This means, for example, that a
    +   * string token always begins with a " and is always terminated by the final ", possibly
    +   * followed by a number of spaces.
    +   *
    +   * The string_view is *not* null-terminated. If this is a scalar (string, number,
    +   * boolean, or null), the character after the end of the string_view may be the padded buffer.
    +   *
    +   * Tokens include:
    +   * - {
    +   * - [
    +   * - "a string (possibly with UTF-8 or backslashed characters like \\\")".
    +   * - -1.2e-100
    +   * - true
    +   * - false
    +   * - null
    +   */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +
    +  /**
    +   * Reset the iterator inside the document instance so we are pointing back at the
    +   * beginning of the document, as if it had just been created. It invalidates all
    +   * values, objects and arrays that you have created so far (including unescaped strings).
    +   */
    +  inline void rewind() noexcept;
    +  /**
    +   * Returns debugging information.
    +   */
    +  inline std::string to_debug_string() noexcept;
    +  /**
    +   * Some unrecoverable error conditions may render the document instance unusable.
    +   * The is_alive() method returns true when the document is still suitable.
    +   */
    +  inline bool is_alive() noexcept;
    +
    +  /**
    +   * Returns the current location in the document if in bounds.
    +   */
    +  inline simdjson_result current_location() const noexcept;
    +
    +  /**
    +   * Returns true if this document has been fully parsed.
    +   * If you have consumed the whole document and at_end() returns
    +   * false, then there may be trailing content.
    +   */
    +  inline bool at_end() const noexcept;
    +
    +  /**
    +   * Returns the current depth in the document if in bounds.
    +   *
    +   * E.g.,
    +   *  0 = finished with document
    +   *  1 = document root value (could be [ or {, not yet known)
    +   *  2 = , or } inside root array/object
    +   *  3 = key or value inside root array/object.
    +   */
    +  simdjson_inline int32_t current_depth() const noexcept;
    +
    +  /**
    +   * Get the value associated with the given JSON pointer.  We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/foo/a/1") == 20
    +   *
    +   * It is allowed for a key to be the empty string:
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("//a/1") == 20
    +   *
    +   * Note that at_pointer() automatically calls rewind between each call. Thus
    +   * all values, objects and arrays that you have created so far (including unescaped strings)
    +   * are invalidated. After calling at_pointer, you need to consume the result: string values
    +   * should be stored in your own variables, arrays should be decoded and stored in your own array-like
    +   * structures and so forth.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   *         - SCALAR_DOCUMENT_AS_VALUE if the json_pointer is empty and the document is not a scalar (see is_scalar() function).
    +   */
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  /**
    +   * Consumes the document and returns a string_view instance corresponding to the
    +   * document as represented in JSON. It points inside the original byte array containing
    +   * the JSON document.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +protected:
    +  /**
    +   * Consumes the document.
    +   */
    +  simdjson_inline error_code consume() noexcept;
    +
    +  simdjson_inline document(ondemand::json_iterator &&iter) noexcept;
    +  simdjson_inline const uint8_t *text(uint32_t idx) const noexcept;
    +
    +  simdjson_inline value_iterator resume_value_iterator() noexcept;
    +  simdjson_inline value_iterator get_root_value_iterator() noexcept;
    +  simdjson_inline simdjson_result start_or_resume_object() noexcept;
    +  static simdjson_inline document start(ondemand::json_iterator &&iter) noexcept;
    +
    +  //
    +  // Fields
    +  //
    +  json_iterator iter{}; ///< Current position in the document
    +  static constexpr depth_t DOCUMENT_DEPTH = 0; ///< document depth is always 0
    +
    +  friend class array_iterator;
    +  friend class value;
    +  friend class ondemand::parser;
    +  friend class object;
    +  friend class array;
    +  friend class field;
    +  friend class token;
    +  friend class document_stream;
    +  friend class document_reference;
    +};
    +
    +
    +/**
    + * A document_reference is a thin wrapper around a document reference instance.
    + */
    +class document_reference {
    +public:
    +  simdjson_inline document_reference() noexcept;
    +  simdjson_inline document_reference(document &d) noexcept;
    +  simdjson_inline document_reference(const document_reference &other) noexcept = default;
    +  simdjson_inline document_reference& operator=(const document_reference &other) noexcept = default;
    +  simdjson_inline void rewind() noexcept;
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result get_value() noexcept;
    +
    +  simdjson_inline simdjson_result is_null() noexcept;
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +  simdjson_inline operator document&() const noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator array() & noexcept(false);
    +  simdjson_inline operator object() & noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +  simdjson_inline operator value() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  simdjson_inline int32_t current_depth() const noexcept;
    +  simdjson_inline bool is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +private:
    +  document *doc{nullptr};
    +};
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public westmere::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(westmere::ondemand::document &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline error_code rewind() noexcept;
    +
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result get_value() noexcept;
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +  template simdjson_inline simdjson_result get() & noexcept;
    +  template simdjson_inline simdjson_result get() && noexcept;
    +
    +  template simdjson_inline error_code get(T &out) & noexcept;
    +  template simdjson_inline error_code get(T &out) && noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator westmere::ondemand::array() & noexcept(false);
    +  simdjson_inline operator westmere::ondemand::object() & noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator westmere::ondemand::raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +  simdjson_inline operator westmere::ondemand::value() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  simdjson_inline int32_t current_depth() const noexcept;
    +  simdjson_inline bool at_end() const noexcept;
    +  simdjson_inline bool is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +  /** @copydoc simdjson_inline std::string_view document::raw_json_token() const noexcept */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +};
    +
    +
    +} // namespace simdjson
    +
    +
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public westmere::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(westmere::ondemand::document_reference value, error_code error) noexcept;
    +  simdjson_inline simdjson_result() noexcept = default;
    +  simdjson_inline error_code rewind() noexcept;
    +
    +  simdjson_inline simdjson_result get_array() & noexcept;
    +  simdjson_inline simdjson_result get_object() & noexcept;
    +  simdjson_inline simdjson_result get_uint64() noexcept;
    +  simdjson_inline simdjson_result get_uint64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_int64() noexcept;
    +  simdjson_inline simdjson_result get_int64_in_string() noexcept;
    +  simdjson_inline simdjson_result get_double() noexcept;
    +  simdjson_inline simdjson_result get_double_in_string() noexcept;
    +  simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept;
    +  template 
    +  simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result get_wobbly_string() noexcept;
    +  simdjson_inline simdjson_result get_raw_json_string() noexcept;
    +  simdjson_inline simdjson_result get_bool() noexcept;
    +  simdjson_inline simdjson_result get_value() noexcept;
    +  simdjson_inline simdjson_result is_null() noexcept;
    +
    +#if SIMDJSON_EXCEPTIONS
    +  simdjson_inline operator westmere::ondemand::array() & noexcept(false);
    +  simdjson_inline operator westmere::ondemand::object() & noexcept(false);
    +  simdjson_inline operator uint64_t() noexcept(false);
    +  simdjson_inline operator int64_t() noexcept(false);
    +  simdjson_inline operator double() noexcept(false);
    +  simdjson_inline operator std::string_view() noexcept(false);
    +  simdjson_inline operator westmere::ondemand::raw_json_string() noexcept(false);
    +  simdjson_inline operator bool() noexcept(false);
    +  simdjson_inline operator westmere::ondemand::value() noexcept(false);
    +#endif
    +  simdjson_inline simdjson_result count_elements() & noexcept;
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  simdjson_inline simdjson_result at(size_t index) & noexcept;
    +  simdjson_inline simdjson_result begin() & noexcept;
    +  simdjson_inline simdjson_result end() & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(const char *key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](const char *key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept;
    +  simdjson_inline simdjson_result type() noexcept;
    +  simdjson_inline simdjson_result is_scalar() noexcept;
    +  simdjson_inline simdjson_result current_location() noexcept;
    +  simdjson_inline simdjson_result current_depth() const noexcept;
    +  simdjson_inline simdjson_result is_negative() noexcept;
    +  simdjson_inline simdjson_result is_integer() noexcept;
    +  simdjson_inline simdjson_result get_number_type() noexcept;
    +  simdjson_inline simdjson_result get_number() noexcept;
    +  /** @copydoc simdjson_inline std::string_view document_reference::raw_json_token() const noexcept */
    +  simdjson_inline simdjson_result raw_json_token() noexcept;
    +
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +};
    +
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H
    +/* end file simdjson/generic/ondemand/document.h for westmere */
    +/* including simdjson/generic/ondemand/document_stream.h for westmere: #include "simdjson/generic/ondemand/document_stream.h" */
    +/* begin file simdjson/generic/ondemand/document_stream.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +#include 
    +#include 
    +#include 
    +#endif
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +/** @private Custom worker class **/
    +struct stage1_worker {
    +  stage1_worker() noexcept = default;
    +  stage1_worker(const stage1_worker&) = delete;
    +  stage1_worker(stage1_worker&&) = delete;
    +  stage1_worker operator=(const stage1_worker&) = delete;
    +  ~stage1_worker();
    +  /**
    +   * We only start the thread when it is needed, not at object construction, this may throw.
    +   * You should only call this once.
    +   **/
    +  void start_thread();
    +  /**
    +   * Start a stage 1 job. You should first call 'run', then 'finish'.
    +   * You must call start_thread once before.
    +   */
    +  void run(document_stream * ds, parser * stage1, size_t next_batch_start);
    +  /** Wait for the run to finish (blocking). You should first call 'run', then 'finish'. **/
    +  void finish();
    +
    +private:
    +
    +  /**
    +   * Normally, we would never stop the thread. But we do in the destructor.
    +   * This function is only safe assuming that you are not waiting for results. You
    +   * should have called run, then finish, and be done.
    +   **/
    +  void stop_thread();
    +
    +  std::thread thread{};
    +  /** These three variables define the work done by the thread. **/
    +  ondemand::parser * stage1_thread_parser{};
    +  size_t _next_batch_start{};
    +  document_stream * owner{};
    +  /**
    +   * We have two state variables. This could be streamlined to one variable in the future but
    +   * we use two for clarity.
    +   */
    +  bool has_work{false};
    +  bool can_work{true};
    +
    +  /**
    +   * We lock using a mutex.
    +   */
    +  std::mutex locking_mutex{};
    +  std::condition_variable cond_var{};
    +
    +  friend class document_stream;
    +};
    +#endif  // SIMDJSON_THREADS_ENABLED
    +
    +/**
    + * A forward-only stream of documents.
    + *
    + * Produced by parser::iterate_many.
    + *
    + */
    +class document_stream {
    +public:
    +  /**
    +   * Construct an uninitialized document_stream.
    +   *
    +   *  ```c++
    +   *  document_stream docs;
    +   *  auto error = parser.iterate_many(json).get(docs);
    +   *  ```
    +   */
    +  simdjson_inline document_stream() noexcept;
    +  /** Move one document_stream to another. */
    +  simdjson_inline document_stream(document_stream &&other) noexcept = default;
    +  /** Move one document_stream to another. */
    +  simdjson_inline document_stream &operator=(document_stream &&other) noexcept = default;
    +
    +  simdjson_inline ~document_stream() noexcept;
    +
    +  /**
    +   * Returns the input size in bytes.
    +   */
    +  inline size_t size_in_bytes() const noexcept;
    +
    +  /**
    +   * After iterating through the stream, this method
    +   * returns the number of bytes that were not parsed at the end
    +   * of the stream. If truncated_bytes() differs from zero,
    +   * then the input was truncated maybe because incomplete JSON
    +   * documents were found at the end of the stream. You
    +   * may need to process the bytes in the interval [size_in_bytes()-truncated_bytes(), size_in_bytes()).
    +   *
    +   * You should only call truncated_bytes() after streaming through all
    +   * documents, like so:
    +   *
    +   *   document_stream stream = parser.iterate_many(json,window);
    +   *   for(auto & doc : stream) {
    +   *      // do something with doc
    +   *   }
    +   *   size_t truncated = stream.truncated_bytes();
    +   *
    +   */
    +  inline size_t truncated_bytes() const noexcept;
    +
    +  class iterator {
    +  public:
    +    using value_type = simdjson_result;
    +    using reference  = value_type;
    +
    +    using difference_type   = std::ptrdiff_t;
    +
    +    using iterator_category = std::input_iterator_tag;
    +
    +    /**
    +     * Default constructor.
    +     */
    +    simdjson_inline iterator() noexcept;
    +    /**
    +     * Get the current document (or error).
    +     */
    +    simdjson_inline simdjson_result operator*() noexcept;
    +    /**
    +     * Advance to the next document (prefix).
    +     */
    +    inline iterator& operator++() noexcept;
    +    /**
    +     * Check if we're at the end yet.
    +     * @param other the end iterator to compare to.
    +     */
    +    simdjson_inline bool operator!=(const iterator &other) const noexcept;
    +    /**
    +     * @private
    +     *
    +     * Gives the current index in the input document in bytes.
    +     *
    +     *   document_stream stream = parser.parse_many(json,window);
    +     *   for(auto i = stream.begin(); i != stream.end(); ++i) {
    +     *      auto doc = *i;
    +     *      size_t index = i.current_index();
    +     *   }
    +     *
    +     * This function (current_index()) is experimental and the usage
    +     * may change in future versions of simdjson: we find the API somewhat
    +     * awkward and we would like to offer something friendlier.
    +     */
    +     simdjson_inline size_t current_index() const noexcept;
    +
    +     /**
    +     * @private
    +     *
    +     * Gives a view of the current document at the current position.
    +     *
    +     *   document_stream stream = parser.iterate_many(json,window);
    +     *   for(auto i = stream.begin(); i != stream.end(); ++i) {
    +     *      std::string_view v = i.source();
    +     *   }
    +     *
    +     * The returned string_view instance is simply a map to the (unparsed)
    +     * source string: it may thus include white-space characters and all manner
    +     * of padding.
    +     *
    +     * This function (source()) is experimental and the usage
    +     * may change in future versions of simdjson: we find the API somewhat
    +     * awkward and we would like to offer something friendlier.
    +     *
    +     */
    +     simdjson_inline std::string_view source() const noexcept;
    +
    +    /**
    +     * Returns error of the stream (if any).
    +     */
    +     inline error_code error() const noexcept;
    +
    +  private:
    +    simdjson_inline iterator(document_stream *s, bool finished) noexcept;
    +    /** The document_stream we're iterating through. */
    +    document_stream* stream;
    +    /** Whether we're finished or not. */
    +    bool finished;
    +
    +    friend class document;
    +    friend class document_stream;
    +    friend class json_iterator;
    +  };
    +
    +  /**
    +   * Start iterating the documents in the stream.
    +   */
    +  simdjson_inline iterator begin() noexcept;
    +  /**
    +   * The end of the stream, for iterator comparison purposes.
    +   */
    +  simdjson_inline iterator end() noexcept;
    +
    +private:
    +
    +  document_stream &operator=(const document_stream &) = delete; // Disallow copying
    +  document_stream(const document_stream &other) = delete; // Disallow copying
    +
    +  /**
    +   * Construct a document_stream. Does not allocate or parse anything until the iterator is
    +   * used.
    +   *
    +   * @param parser is a reference to the parser instance used to generate this document_stream
    +   * @param buf is the raw byte buffer we need to process
    +   * @param len is the length of the raw byte buffer in bytes
    +   * @param batch_size is the size of the windows (must be strictly greater or equal to the largest JSON document)
    +   */
    +  simdjson_inline document_stream(
    +    ondemand::parser &parser,
    +    const uint8_t *buf,
    +    size_t len,
    +    size_t batch_size,
    +    bool allow_comma_separated
    +  ) noexcept;
    +
    +  /**
    +   * Parse the first document in the buffer. Used by begin(), to handle allocation and
    +   * initialization.
    +   */
    +  inline void start() noexcept;
    +
    +  /**
    +   * Parse the next document found in the buffer previously given to document_stream.
    +   *
    +   * The content should be a valid JSON document encoded as UTF-8. If there is a
    +   * UTF-8 BOM, the parser skips it.
    +   *
    +   * You do NOT need to pre-allocate a parser.  This function takes care of
    +   * pre-allocating a capacity defined by the batch_size defined when creating the
    +   * document_stream object.
    +   *
    +   * The function returns simdjson::EMPTY if there is no more data to be parsed.
    +   *
    +   * The function returns simdjson::SUCCESS (as integer = 0) in case of success
    +   * and indicates that the buffer has successfully been parsed to the end.
    +   * Every document it contained has been parsed without error.
    +   *
    +   * The function returns an error code from simdjson/simdjson.h in case of failure
    +   * such as simdjson::CAPACITY, simdjson::MEMALLOC, simdjson::DEPTH_ERROR and so forth;
    +   * the simdjson::error_message function converts these error codes into a string).
    +   *
    +   * You can also check validity by calling parser.is_valid(). The same parser can
    +   * and should be reused for the other documents in the buffer.
    +   */
    +  inline void next() noexcept;
    +
    +  /** Move the json_iterator of the document to the location of the next document in the stream. */
    +  inline void next_document() noexcept;
    +
    +  /** Get the next document index. */
    +  inline size_t next_batch_start() const noexcept;
    +
    +  /** Pass the next batch through stage 1 with the given parser. */
    +  inline error_code run_stage1(ondemand::parser &p, size_t batch_start) noexcept;
    +
    +  // Fields
    +  ondemand::parser *parser;
    +  const uint8_t *buf;
    +  size_t len;
    +  size_t batch_size;
    +  bool allow_comma_separated;
    +  /**
    +   * We are going to use just one document instance. The document owns
    +   * the json_iterator. It implies that we only ever pass a reference
    +   * to the document to the users.
    +   */
    +  document doc{};
    +  /** The error (or lack thereof) from the current document. */
    +  error_code error;
    +  size_t batch_start{0};
    +  size_t doc_index{};
    +
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  /** Indicates whether we use threads. Note that this needs to be a constant during the execution of the parsing. */
    +  bool use_thread;
    +
    +  inline void load_from_stage1_thread() noexcept;
    +
    +  /** Start a thread to run stage 1 on the next batch. */
    +  inline void start_stage1_thread() noexcept;
    +
    +  /** Wait for the stage 1 thread to finish and capture the results. */
    +  inline void finish_stage1_thread() noexcept;
    +
    +  /** The error returned from the stage 1 thread. */
    +  error_code stage1_thread_error{UNINITIALIZED};
    +  /** The thread used to run stage 1 against the next batch in the background. */
    +  std::unique_ptr worker{new(std::nothrow) stage1_worker()};
    +  /**
    +   * The parser used to run stage 1 in the background. Will be swapped
    +   * with the regular parser when finished.
    +   */
    +  ondemand::parser stage1_thread_parser{};
    +
    +  friend struct stage1_worker;
    +  #endif // SIMDJSON_THREADS_ENABLED
    +
    +  friend class parser;
    +  friend class document;
    +  friend class json_iterator;
    +  friend struct simdjson_result;
    +  friend struct internal::simdjson_result_base;
    +};  // document_stream
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +template<>
    +struct simdjson_result : public westmere::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(westmere::ondemand::document_stream &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H
    +/* end file simdjson/generic/ondemand/document_stream.h for westmere */
    +/* including simdjson/generic/ondemand/field.h for westmere: #include "simdjson/generic/ondemand/field.h" */
    +/* begin file simdjson/generic/ondemand/field.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_FIELD_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +/**
    + * A JSON field (key/value pair) in an object.
    + *
    + * Returned from object iteration.
    + *
    + * Extends from std::pair so you can use C++ algorithms that rely on pairs.
    + */
    +class field : public std::pair {
    +public:
    +  /**
    +   * Create a new invalid field.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline field() noexcept;
    +
    +  /**
    +   * Get the key as a string_view (for higher speed, consider raw_key).
    +   * We deliberately use a more cumbersome name (unescaped_key) to force users
    +   * to think twice about using it.
    +   *
    +   * This consumes the key: once you have called unescaped_key(), you cannot
    +   * call it again nor can you call key().
    +   */
    +  simdjson_inline simdjson_warn_unused simdjson_result unescaped_key(bool allow_replacement) noexcept;
    +  /**
    +   * Get the key as a raw_json_string. Can be used for direct comparison with
    +   * an unescaped C string: e.g., key() == "test".
    +   */
    +  simdjson_inline raw_json_string key() const noexcept;
    +  /**
    +   * Get the field value.
    +   */
    +  simdjson_inline ondemand::value &value() & noexcept;
    +  /**
    +   * @overload ondemand::value &ondemand::value() & noexcept
    +   */
    +  simdjson_inline ondemand::value value() && noexcept;
    +
    +protected:
    +  simdjson_inline field(raw_json_string key, ondemand::value &&value) noexcept;
    +  static simdjson_inline simdjson_result start(value_iterator &parent_iter) noexcept;
    +  static simdjson_inline simdjson_result start(const value_iterator &parent_iter, raw_json_string key) noexcept;
    +  friend struct simdjson_result;
    +  friend class object_iterator;
    +};
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public westmere::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(westmere::ondemand::field &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result unescaped_key(bool allow_replacement = false) noexcept;
    +  simdjson_inline simdjson_result key() noexcept;
    +  simdjson_inline simdjson_result value() noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_H
    +/* end file simdjson/generic/ondemand/field.h for westmere */
    +/* including simdjson/generic/ondemand/object.h for westmere: #include "simdjson/generic/ondemand/object.h" */
    +/* begin file simdjson/generic/ondemand/object.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +/**
    + * A forward-only JSON object field iterator.
    + */
    +class object {
    +public:
    +  /**
    +   * Create a new invalid object.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline object() noexcept = default;
    +
    +  simdjson_inline simdjson_result begin() noexcept;
    +  simdjson_inline simdjson_result end() noexcept;
    +  /**
    +   * Look up a field by name on an object (order-sensitive).
    +   *
    +   * The following code reads z, then y, then x, and thus will not retrieve x or y if fed the
    +   * JSON `{ "x": 1, "y": 2, "z": 3 }`:
    +   *
    +   * ```c++
    +   * simdjson::ondemand::parser parser;
    +   * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded);
    +   * double z = obj.find_field("z");
    +   * double y = obj.find_field("y");
    +   * double x = obj.find_field("x");
    +   * ```
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +   *
    +   * **Raw Keys:** The lookup will be done against the *raw* key, and will not unescape keys.
    +   * e.g. `object["a"]` will match `{ "a": 1 }`, but will *not* match `{ "\u0061": 1 }`.
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. The value instance you get
    +   * from  `content["bids"]` becomes invalid when you call `content["asks"]`. The array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to a
    +   * key a single time. Doing object["mykey"].to_string() and then again object["mykey"].to_string()
    +   * is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field(std::string_view key) && noexcept;
    +
    +  /**
    +   * Look up a field by name on an object, without regard to key order.
    +   *
    +   * **Performance Notes:** This is a bit less performant than find_field(), though its effect varies
    +   * and often appears negligible. It starts out normally, starting out at the last field; but if
    +   * the field is not found, it scans from the beginning of the object to see if it missed it. That
    +   * missing case has a non-cache-friendly bump and lots of extra scanning, especially if the object
    +   * in question is large. The fact that the extra code is there also bumps the executable size.
    +   *
    +   * It is the default, however, because it would be highly surprising (and hard to debug) if the
    +   * default behavior failed to look up a field just because it was in the wrong order--and many
    +   * APIs assume this. Therefore, you must be explicit if you want to treat objects as out of order.
    +   *
    +   * Use find_field() if you are sure fields will be in order (or are willing to treat it as if the
    +   * field wasn't there when they aren't).
    +   *
    +   * If you have multiple fields with a matching key ({"x": 1,  "x": 1}) be mindful
    +   * that only one field is returned.
    +   *
    +   * You must consume the fields on an object one at a time. A request for a new key
    +   * invalidates previous field values: it makes them unsafe. The value instance you get
    +   * from  `content["bids"]` becomes invalid when you call `content["asks"]`. The array
    +   * given by content["bids"].get_array() should not be accessed after you have called
    +   * content["asks"].get_array(). You can detect such mistakes by first compiling and running
    +   * the code in Debug mode (or with the macro `SIMDJSON_DEVELOPMENT_CHECKS` set to 1): an
    +   * OUT_OF_ORDER_ITERATION error is generated.
    +   *
    +   * You are expected to access keys only once. You should access the value corresponding to a key
    +   * a single time. Doing object["mykey"].to_string() and then again object["mykey"].to_string() is an error.
    +   *
    +   * @param key The key to look up.
    +   * @returns The value of the field, or NO_SUCH_FIELD if the field is not in the object.
    +   */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) && noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */
    +  simdjson_inline simdjson_result operator[](std::string_view key) && noexcept;
    +
    +  /**
    +   * Get the value associated with the given JSON pointer. We use the RFC 6901
    +   * https://tools.ietf.org/html/rfc6901 standard, interpreting the current node
    +   * as the root of its own JSON document.
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("/foo/a/1") == 20
    +   *
    +   * It is allowed for a key to be the empty string:
    +   *
    +   *   ondemand::parser parser;
    +   *   auto json = R"({ "": { "a": [ 10, 20, 30 ] }})"_padded;
    +   *   auto doc = parser.iterate(json);
    +   *   doc.at_pointer("//a/1") == 20
    +   *
    +   * Note that at_pointer() called on the document automatically calls the document's rewind
    +   * method between each call. It invalidates all previously accessed arrays, objects and values
    +   * that have not been consumed. Yet it is not the case when calling at_pointer on an object
    +   * instance: there is no rewind and no invalidation.
    +   *
    +   * You may call at_pointer more than once on an object, but each time the pointer is advanced
    +   * to be within the value matched by the key indicated by the JSON pointer query. Thus any preceding
    +   * key (as well as the current key) can no longer be used with following JSON pointer calls.
    +   *
    +   * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching.
    +   *
    +   * @return The value associated with the given JSON pointer, or:
    +   *         - NO_SUCH_FIELD if a field does not exist in an object
    +   *         - INDEX_OUT_OF_BOUNDS if an array index is larger than an array length
    +   *         - INCORRECT_TYPE if a non-integer is used to access an array
    +   *         - INVALID_JSON_POINTER if the JSON pointer is invalid and cannot be parsed
    +   */
    +  inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +
    +  /**
    +   * Reset the iterator so that we are pointing back at the
    +   * beginning of the object. You should still consume values only once even if you
    +   * can iterate through the object more than once. If you unescape a string within
    +   * the object more than once, you have unsafe code. Note that rewinding an object
    +   * means that you may need to reparse it anew: it is not a free operation.
    +   *
    +   * @returns true if the object contains some elements (not empty)
    +   */
    +  inline simdjson_result reset() & noexcept;
    +  /**
    +   * This method scans the beginning of the object and checks whether the
    +   * object is empty.
    +   * The runtime complexity is constant time. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   */
    +  inline simdjson_result is_empty() & noexcept;
    +  /**
    +   * This method scans the object and counts the number of key-value pairs.
    +   * The count_fields method should always be called before you have begun
    +   * iterating through the object: it is expected that you are pointing at
    +   * the beginning of the object.
    +   * The runtime complexity is linear in the size of the object. After
    +   * calling this function, if successful, the object is 'rewinded' at its
    +   * beginning as if it had never been accessed. If the JSON is malformed (e.g.,
    +   * there is a missing comma), then an error is returned and it is no longer
    +   * safe to continue.
    +   *
    +   * To check that an object is empty, it is more performant to use
    +   * the is_empty() method.
    +   *
    +   * Performance hint: You should only call count_fields() as a last
    +   * resort as it may require scanning the document twice or more.
    +   */
    +  simdjson_inline simdjson_result count_fields() & noexcept;
    +  /**
    +   * Consumes the object and returns a string_view instance corresponding to the
    +   * object as represented in JSON. It points inside the original byte array containing
    +   * the JSON document.
    +   */
    +  simdjson_inline simdjson_result raw_json() noexcept;
    +
    +protected:
    +  /**
    +   * Go to the end of the object, no matter where you are right now.
    +   */
    +  simdjson_inline error_code consume() noexcept;
    +  static simdjson_inline simdjson_result start(value_iterator &iter) noexcept;
    +  static simdjson_inline simdjson_result start_root(value_iterator &iter) noexcept;
    +  static simdjson_inline simdjson_result started(value_iterator &iter) noexcept;
    +  static simdjson_inline object resume(const value_iterator &iter) noexcept;
    +  simdjson_inline object(const value_iterator &iter) noexcept;
    +
    +  simdjson_warn_unused simdjson_inline error_code find_field_raw(const std::string_view key) noexcept;
    +
    +  value_iterator iter{};
    +
    +  friend class value;
    +  friend class document;
    +  friend struct simdjson_result;
    +};
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public westmere::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(westmere::ondemand::object &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  simdjson_inline simdjson_result begin() noexcept;
    +  simdjson_inline simdjson_result end() noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field(std::string_view key) && noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result find_field_unordered(std::string_view key) && noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) & noexcept;
    +  simdjson_inline simdjson_result operator[](std::string_view key) && noexcept;
    +  simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept;
    +  inline simdjson_result reset() noexcept;
    +  inline simdjson_result is_empty() noexcept;
    +  inline simdjson_result count_fields() & noexcept;
    +  inline simdjson_result raw_json() noexcept;
    +
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_H
    +/* end file simdjson/generic/ondemand/object.h for westmere */
    +/* including simdjson/generic/ondemand/object_iterator.h for westmere: #include "simdjson/generic/ondemand/object_iterator.h" */
    +/* begin file simdjson/generic/ondemand/object_iterator.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +class object_iterator {
    +public:
    +  /**
    +   * Create a new invalid object_iterator.
    +   *
    +   * Exists so you can declare a variable and later assign to it before use.
    +   */
    +  simdjson_inline object_iterator() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  // Reads key and value, yielding them to the user.
    +  // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  simdjson_inline simdjson_result operator*() noexcept;
    +  // Assumes it's being compared with the end. true if depth < iter->depth.
    +  simdjson_inline bool operator==(const object_iterator &) const noexcept;
    +  // Assumes it's being compared with the end. true if depth >= iter->depth.
    +  simdjson_inline bool operator!=(const object_iterator &) const noexcept;
    +  // Checks for ']' and ','
    +  simdjson_inline object_iterator &operator++() noexcept;
    +
    +private:
    +  /**
    +   * The underlying JSON iterator.
    +   *
    +   * PERF NOTE: expected to be elided in favor of the parent document: this is set when the object
    +   * is first used, and never changes afterwards.
    +   */
    +  value_iterator iter{};
    +
    +  simdjson_inline object_iterator(const value_iterator &iter) noexcept;
    +  friend struct simdjson_result;
    +  friend class object;
    +};
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +template<>
    +struct simdjson_result : public westmere::implementation_simdjson_result_base {
    +public:
    +  simdjson_inline simdjson_result(westmere::ondemand::object_iterator &&value) noexcept; ///< @private
    +  simdjson_inline simdjson_result(error_code error) noexcept; ///< @private
    +  simdjson_inline simdjson_result() noexcept = default;
    +
    +  //
    +  // Iterator interface
    +  //
    +
    +  // Reads key and value, yielding them to the user.
    +  simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION.
    +  // Assumes it's being compared with the end. true if depth < iter->depth.
    +  simdjson_inline bool operator==(const simdjson_result &) const noexcept;
    +  // Assumes it's being compared with the end. true if depth >= iter->depth.
    +  simdjson_inline bool operator!=(const simdjson_result &) const noexcept;
    +  // Checks for ']' and ','
    +  simdjson_inline simdjson_result &operator++() noexcept;
    +};
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H
    +/* end file simdjson/generic/ondemand/object_iterator.h for westmere */
    +/* including simdjson/generic/ondemand/serialization.h for westmere: #include "simdjson/generic/ondemand/serialization.h" */
    +/* begin file simdjson/generic/ondemand/serialization.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +/**
    + * Create a string-view instance out of a document instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(westmere::ondemand::document& x) noexcept;
    +/**
    + * Create a string-view instance out of a value instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. The value must
    + * not have been accessed previously. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(westmere::ondemand::value& x) noexcept;
    +/**
    + * Create a string-view instance out of an object instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(westmere::ondemand::object& x) noexcept;
    +/**
    + * Create a string-view instance out of an array instance. The string-view instance
    + * contains JSON text that is suitable to be parsed as JSON again. It does not
    + * validate the content.
    + */
    +inline simdjson_result to_json_string(westmere::ondemand::array& x) noexcept;
    +inline simdjson_result to_json_string(simdjson_result x);
    +inline simdjson_result to_json_string(simdjson_result x);
    +inline simdjson_result to_json_string(simdjson_result x);
    +inline simdjson_result to_json_string(simdjson_result x);
    +} // namespace simdjson
    +
    +/**
    + * We want to support argument-dependent lookup (ADL).
    + * Hence we should define operator<< in the namespace
    + * where the argument (here value, object, etc.) resides.
    + * Credit: @madhur4127
    + * See https://github.com/simdjson/simdjson/issues/1768
    + */
    +namespace simdjson { namespace westmere { namespace ondemand {
    +
    +/**
    + * Print JSON to an output stream.  It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The element.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::value x);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x);
    +#endif
    +/**
    + * Print JSON to an output stream. It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The array.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::array value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x);
    +#endif
    +/**
    + * Print JSON to an output stream. It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The array.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::document& value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x);
    +#endif
    +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::document_reference& value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x);
    +#endif
    +/**
    + * Print JSON to an output stream. It does not
    + * validate the content.
    + *
    + * @param out The output stream.
    + * @param value The object.
    + * @throw if there is an error with the underlying output stream. simdjson itself will not throw.
    + */
    +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::object value);
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x);
    +#endif
    +}}} // namespace simdjson::westmere::ondemand
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H
    +/* end file simdjson/generic/ondemand/serialization.h for westmere */
    +
    +// Inline definitions
    +/* including simdjson/generic/ondemand/array-inl.h for westmere: #include "simdjson/generic/ondemand/array-inl.h" */
    +/* begin file simdjson/generic/ondemand/array-inl.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +//
    +// ### Live States
    +//
    +// While iterating or looking up values, depth >= iter->depth. at_start may vary. Error is
    +// always SUCCESS:
    +//
    +// - Start: This is the state when the array is first found and the iterator is just past the `{`.
    +//   In this state, at_start == true.
    +// - Next: After we hand a scalar value to the user, or an array/object which they then fully
    +//   iterate over, the iterator is at the `,` before the next value (or `]`). In this state,
    +//   depth == iter->depth, at_start == false, and error == SUCCESS.
    +// - Unfinished Business: When we hand an array/object to the user which they do not fully
    +//   iterate over, we need to finish that iteration by skipping child values until we reach the
    +//   Next state. In this state, depth > iter->depth, at_start == false, and error == SUCCESS.
    +//
    +// ## Error States
    +//
    +// In error states, we will yield exactly one more value before stopping. iter->depth == depth
    +// and at_start is always false. We decrement after yielding the error, moving to the Finished
    +// state.
    +//
    +// - Chained Error: When the array iterator is part of an error chain--for example, in
    +//   `for (auto tweet : doc["tweets"])`, where the tweet element may be missing or not be an
    +//   array--we yield that error in the loop, exactly once. In this state, error != SUCCESS and
    +//   iter->depth == depth, and at_start == false. We decrement depth when we yield the error.
    +// - Missing Comma Error: When the iterator ++ method discovers there is no comma between elements,
    +//   we flag that as an error and treat it exactly the same as a Chained Error. In this state,
    +//   error == TAPE_ERROR, iter->depth == depth, and at_start == false.
    +//
    +// ## Terminal State
    +//
    +// The terminal state has iter->depth < depth. at_start is always false.
    +//
    +// - Finished: When we have reached a `]` or have reported an error, we are finished. We signal this
    +//   by decrementing depth. In this state, iter->depth < depth, at_start == false, and
    +//   error == SUCCESS.
    +//
    +
    +simdjson_inline array::array(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{
    +}
    +
    +simdjson_inline simdjson_result array::start(value_iterator &iter) noexcept {
    +  // We don't need to know if the array is empty to start iteration, but we do want to know if there
    +  // is an error--thus `simdjson_unused`.
    +  simdjson_unused bool has_value;
    +  SIMDJSON_TRY( iter.start_array().get(has_value) );
    +  return array(iter);
    +}
    +simdjson_inline simdjson_result array::start_root(value_iterator &iter) noexcept {
    +  simdjson_unused bool has_value;
    +  SIMDJSON_TRY( iter.start_root_array().get(has_value) );
    +  return array(iter);
    +}
    +simdjson_inline simdjson_result array::started(value_iterator &iter) noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY(iter.started_array().get(has_value));
    +  return array(iter);
    +}
    +
    +simdjson_inline simdjson_result array::begin() noexcept {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  return array_iterator(iter);
    +}
    +simdjson_inline simdjson_result array::end() noexcept {
    +  return array_iterator(iter);
    +}
    +simdjson_inline error_code array::consume() noexcept {
    +  auto error = iter.json_iter().skip_child(iter.depth()-1);
    +  if(error) { iter.abandon(); }
    +  return error;
    +}
    +
    +simdjson_inline simdjson_result array::raw_json() noexcept {
    +  const uint8_t * starting_point{iter.peek_start()};
    +  auto error = consume();
    +  if(error) { return error; }
    +  // After 'consume()', we could be left pointing just beyond the document, but that
    +  // is ok because we are not going to dereference the final pointer position, we just
    +  // use it to compute the length in bytes.
    +  const uint8_t * final_point{iter._json_iter->unsafe_pointer()};
    +  return std::string_view(reinterpret_cast(starting_point), size_t(final_point - starting_point));
    +}
    +
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_inline simdjson_result array::count_elements() & noexcept {
    +  size_t count{0};
    +  // Important: we do not consume any of the values.
    +  for(simdjson_unused auto v : *this) { count++; }
    +  // The above loop will always succeed, but we want to report errors.
    +  if(iter.error()) { return iter.error(); }
    +  // We need to move back at the start because we expect users to iterate through
    +  // the array after counting the number of elements.
    +  iter.reset_array();
    +  return count;
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_inline simdjson_result array::is_empty() & noexcept {
    +  bool is_not_empty;
    +  auto error = iter.reset_array().get(is_not_empty);
    +  if(error) { return error; }
    +  return !is_not_empty;
    +}
    +
    +inline simdjson_result array::reset() & noexcept {
    +  return iter.reset_array();
    +}
    +
    +inline simdjson_result array::at_pointer(std::string_view json_pointer) noexcept {
    +  if (json_pointer[0] != '/') { return INVALID_JSON_POINTER; }
    +  json_pointer = json_pointer.substr(1);
    +  // - means "the append position" or "the element after the end of the array"
    +  // We don't support this, because we're returning a real element, not a position.
    +  if (json_pointer == "-") { return INDEX_OUT_OF_BOUNDS; }
    +
    +  // Read the array index
    +  size_t array_index = 0;
    +  size_t i;
    +  for (i = 0; i < json_pointer.length() && json_pointer[i] != '/'; i++) {
    +    uint8_t digit = uint8_t(json_pointer[i] - '0');
    +    // Check for non-digit in array index. If it's there, we're trying to get a field in an object
    +    if (digit > 9) { return INCORRECT_TYPE; }
    +    array_index = array_index*10 + digit;
    +  }
    +
    +  // 0 followed by other digits is invalid
    +  if (i > 1 && json_pointer[0] == '0') { return INVALID_JSON_POINTER; } // "JSON pointer array index has other characters after 0"
    +
    +  // Empty string is invalid; so is a "/" with no digits before it
    +  if (i == 0) { return INVALID_JSON_POINTER; } // "Empty string in JSON pointer array index"
    +  // Get the child
    +  auto child = at(array_index);
    +  // If there is an error, it ends here
    +  if(child.error()) {
    +    return child;
    +  }
    +
    +  // If there is a /, we're not done yet, call recursively.
    +  if (i < json_pointer.length()) {
    +    child = child.at_pointer(json_pointer.substr(i));
    +  }
    +  return child;
    +}
    +
    +simdjson_inline simdjson_result array::at(size_t index) noexcept {
    +  size_t i = 0;
    +  for (auto value : *this) {
    +    if (i == index) { return value; }
    +    i++;
    +  }
    +  return INDEX_OUT_OF_BOUNDS;
    +}
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  westmere::ondemand::array &&value
    +) noexcept
    +  : implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept
    +  : implementation_simdjson_result_base(error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::begin() noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() noexcept {
    +  if (error()) { return error(); }
    +  return first.end();
    +}
    +simdjson_inline  simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline  simdjson_result simdjson_result::is_empty() & noexcept {
    +  if (error()) { return error(); }
    +  return first.is_empty();
    +}
    +simdjson_inline  simdjson_result simdjson_result::at(size_t index) noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline  simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +simdjson_inline  simdjson_result simdjson_result::raw_json() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json();
    +}
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H
    +/* end file simdjson/generic/ondemand/array-inl.h for westmere */
    +/* including simdjson/generic/ondemand/array_iterator-inl.h for westmere: #include "simdjson/generic/ondemand/array_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/array_iterator-inl.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{}
    +
    +simdjson_inline simdjson_result array_iterator::operator*() noexcept {
    +  if (iter.error()) { iter.abandon(); return iter.error(); }
    +  return value(iter.child());
    +}
    +simdjson_inline bool array_iterator::operator==(const array_iterator &other) const noexcept {
    +  return !(*this != other);
    +}
    +simdjson_inline bool array_iterator::operator!=(const array_iterator &) const noexcept {
    +  return iter.is_open();
    +}
    +simdjson_inline array_iterator &array_iterator::operator++() noexcept {
    +  error_code error;
    +  // PERF NOTE this is a safety rail ... users should exit loops as soon as they receive an error, so we'll never get here.
    +  // However, it does not seem to make a perf difference, so we add it out of an abundance of caution.
    +  if (( error = iter.error() )) { return *this; }
    +  if (( error = iter.skip_child() )) { return *this; }
    +  if (( error = iter.has_next_element().error() )) { return *this; }
    +  return *this;
    +}
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  westmere::ondemand::array_iterator &&value
    +) noexcept
    +  : westmere::implementation_simdjson_result_base(std::forward(value))
    +{
    +  first.iter.assert_is_valid();
    +}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +  : westmere::implementation_simdjson_result_base({}, error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::operator*() noexcept {
    +  if (error()) { return error(); }
    +  return *first;
    +}
    +simdjson_inline bool simdjson_result::operator==(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return !error(); }
    +  return first == other.first;
    +}
    +simdjson_inline bool simdjson_result::operator!=(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return error(); }
    +  return first != other.first;
    +}
    +simdjson_inline simdjson_result &simdjson_result::operator++() noexcept {
    +  // Clear the error if there is one, so we don't yield it twice
    +  if (error()) { second = SUCCESS; return *this; }
    +  ++(first);
    +  return *this;
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/array_iterator-inl.h for westmere */
    +/* including simdjson/generic/ondemand/document-inl.h for westmere: #include "simdjson/generic/ondemand/document-inl.h" */
    +/* begin file simdjson/generic/ondemand/document-inl.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +simdjson_inline document::document(ondemand::json_iterator &&_iter) noexcept
    +  : iter{std::forward(_iter)}
    +{
    +  logger::log_start_value(iter, "document");
    +}
    +
    +simdjson_inline document document::start(json_iterator &&iter) noexcept {
    +  return document(std::forward(iter));
    +}
    +
    +inline void document::rewind() noexcept {
    +  iter.rewind();
    +}
    +
    +inline std::string document::to_debug_string() noexcept {
    +  return iter.to_string();
    +}
    +
    +inline simdjson_result document::current_location() const noexcept {
    +  return iter.current_location();
    +}
    +
    +inline int32_t document::current_depth() const noexcept {
    +  return iter.depth();
    +}
    +
    +inline bool document::at_end() const noexcept {
    +  return iter.at_end();
    +}
    +
    +
    +inline bool document::is_alive() noexcept {
    +  return iter.is_alive();
    +}
    +simdjson_inline value_iterator document::resume_value_iterator() noexcept {
    +  return value_iterator(&iter, 1, iter.root_position());
    +}
    +simdjson_inline value_iterator document::get_root_value_iterator() noexcept {
    +  return resume_value_iterator();
    +}
    +simdjson_inline simdjson_result document::start_or_resume_object() noexcept {
    +  if (iter.at_root()) {
    +    return get_object();
    +  } else {
    +    return object::resume(resume_value_iterator());
    +  }
    +}
    +simdjson_inline simdjson_result document::get_value() noexcept {
    +  // Make sure we start any arrays or objects before returning, so that start_root_()
    +  // gets called.
    +
    +  // It is the convention throughout the code that  the macro `SIMDJSON_DEVELOPMENT_CHECKS` determines whether
    +  // we check for OUT_OF_ORDER_ITERATION. Proper on::demand code should never trigger this error.
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  if (!iter.at_root()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  // assert_at_root() serves two purposes: in Debug mode, whether or not
    +  // SIMDJSON_DEVELOPMENT_CHECKS is set or not, it checks that we are at the root of
    +  // the document (this will typically be redundant). In release mode, it generates
    +  // SIMDJSON_ASSUME statements to allow the compiler to make assumptions.
    +  iter.assert_at_root();
    +  switch (*iter.peek()) {
    +    case '[': {
    +      // The following lines check that the document ends with ].
    +      auto value_iterator = get_root_value_iterator();
    +      auto error = value_iterator.check_root_array();
    +      if(error) { return error; }
    +      return value(get_root_value_iterator());
    +    }
    +    case '{': {
    +      // The following lines would check that the document ends with }.
    +      auto value_iterator = get_root_value_iterator();
    +      auto error = value_iterator.check_root_object();
    +      if(error) { return error; }
    +      return value(get_root_value_iterator());
    +    }
    +    default:
    +      // Unfortunately, scalar documents are a special case in simdjson and they cannot
    +      // be safely converted to value instances.
    +      return SCALAR_DOCUMENT_AS_VALUE;
    +  }
    +}
    +simdjson_inline simdjson_result document::get_array() & noexcept {
    +  auto value = get_root_value_iterator();
    +  return array::start_root(value);
    +}
    +simdjson_inline simdjson_result document::get_object() & noexcept {
    +  auto value = get_root_value_iterator();
    +  return object::start_root(value);
    +}
    +
    +/**
    + * We decided that calling 'get_double()' on the JSON document '1.233 blabla' should
    + * give an error, so we check for trailing content. We want to disallow trailing
    + * content.
    + * Thus, in several implementations below, we pass a 'true' parameter value to
    + * a get_root_value_iterator() method: this indicates that we disallow trailing content.
    + */
    +
    +simdjson_inline simdjson_result document::get_uint64() noexcept {
    +  return get_root_value_iterator().get_root_uint64(true);
    +}
    +simdjson_inline simdjson_result document::get_uint64_in_string() noexcept {
    +  return get_root_value_iterator().get_root_uint64_in_string(true);
    +}
    +simdjson_inline simdjson_result document::get_int64() noexcept {
    +  return get_root_value_iterator().get_root_int64(true);
    +}
    +simdjson_inline simdjson_result document::get_int64_in_string() noexcept {
    +  return get_root_value_iterator().get_root_int64_in_string(true);
    +}
    +simdjson_inline simdjson_result document::get_double() noexcept {
    +  return get_root_value_iterator().get_root_double(true);
    +}
    +simdjson_inline simdjson_result document::get_double_in_string() noexcept {
    +  return get_root_value_iterator().get_root_double_in_string(true);
    +}
    +simdjson_inline simdjson_result document::get_string(bool allow_replacement) noexcept {
    +  return get_root_value_iterator().get_root_string(true, allow_replacement);
    +}
    +template 
    +simdjson_inline error_code document::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  return get_root_value_iterator().get_root_string(receiver, true, allow_replacement);
    +}
    +simdjson_inline simdjson_result document::get_wobbly_string() noexcept {
    +  return get_root_value_iterator().get_root_wobbly_string(true);
    +}
    +simdjson_inline simdjson_result document::get_raw_json_string() noexcept {
    +  return get_root_value_iterator().get_root_raw_json_string(true);
    +}
    +simdjson_inline simdjson_result document::get_bool() noexcept {
    +  return get_root_value_iterator().get_root_bool(true);
    +}
    +simdjson_inline simdjson_result document::is_null() noexcept {
    +  return get_root_value_iterator().is_root_null(true);
    +}
    +
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_array(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_object(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_raw_json_string(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_string(false); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_double(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_uint64(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_int64(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); }
    +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_value(); }
    +
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); }
    +template<> simdjson_inline simdjson_result document::get() && noexcept { return get_value(); }
    +
    +template simdjson_inline error_code document::get(T &out) & noexcept {
    +  return get().get(out);
    +}
    +template simdjson_inline error_code document::get(T &out) && noexcept {
    +  return std::forward(*this).get().get(out);
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline document::operator array() & noexcept(false) { return get_array(); }
    +simdjson_inline document::operator object() & noexcept(false) { return get_object(); }
    +simdjson_inline document::operator uint64_t() noexcept(false) { return get_uint64(); }
    +simdjson_inline document::operator int64_t() noexcept(false) { return get_int64(); }
    +simdjson_inline document::operator double() noexcept(false) { return get_double(); }
    +simdjson_inline document::operator std::string_view() noexcept(false) { return get_string(false); }
    +simdjson_inline document::operator raw_json_string() noexcept(false) { return get_raw_json_string(); }
    +simdjson_inline document::operator bool() noexcept(false) { return get_bool(); }
    +simdjson_inline document::operator value() noexcept(false) { return get_value(); }
    +
    +#endif
    +simdjson_inline simdjson_result document::count_elements() & noexcept {
    +  auto a = get_array();
    +  simdjson_result answer = a.count_elements();
    +  /* If there was an array, we are now left pointing at its first element. */
    +  if(answer.error() == SUCCESS) { rewind(); }
    +  return answer;
    +}
    +simdjson_inline simdjson_result document::count_fields() & noexcept {
    +  auto a = get_object();
    +  simdjson_result answer = a.count_fields();
    +  /* If there was an object, we are now left pointing at its first element. */
    +  if(answer.error() == SUCCESS) { rewind(); }
    +  return answer;
    +}
    +simdjson_inline simdjson_result document::at(size_t index) & noexcept {
    +  auto a = get_array();
    +  return a.at(index);
    +}
    +simdjson_inline simdjson_result document::begin() & noexcept {
    +  return get_array().begin();
    +}
    +simdjson_inline simdjson_result document::end() & noexcept {
    +  return {};
    +}
    +
    +simdjson_inline simdjson_result document::find_field(std::string_view key) & noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +simdjson_inline simdjson_result document::find_field(const char *key) & noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +simdjson_inline simdjson_result document::find_field_unordered(std::string_view key) & noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result document::find_field_unordered(const char *key) & noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result document::operator[](std::string_view key) & noexcept {
    +  return start_or_resume_object()[key];
    +}
    +simdjson_inline simdjson_result document::operator[](const char *key) & noexcept {
    +  return start_or_resume_object()[key];
    +}
    +
    +simdjson_inline error_code document::consume() noexcept {
    +  auto error = iter.skip_child(0);
    +  if(error) { iter.abandon(); }
    +  return error;
    +}
    +
    +simdjson_inline simdjson_result document::raw_json() noexcept {
    +  auto _iter = get_root_value_iterator();
    +  const uint8_t * starting_point{_iter.peek_start()};
    +  auto error = consume();
    +  if(error) { return error; }
    +  // After 'consume()', we could be left pointing just beyond the document, but that
    +  // is ok because we are not going to dereference the final pointer position, we just
    +  // use it to compute the length in bytes.
    +  const uint8_t * final_point{iter.unsafe_pointer()};
    +  return std::string_view(reinterpret_cast(starting_point), size_t(final_point - starting_point));
    +}
    +
    +simdjson_inline simdjson_result document::type() noexcept {
    +  return get_root_value_iterator().type();
    +}
    +
    +simdjson_inline simdjson_result document::is_scalar() noexcept {
    +  json_type this_type;
    +  auto error = type().get(this_type);
    +  if(error) { return error; }
    +  return ! ((this_type == json_type::array) || (this_type == json_type::object));
    +}
    +
    +simdjson_inline bool document::is_negative() noexcept {
    +  return get_root_value_iterator().is_root_negative();
    +}
    +
    +simdjson_inline simdjson_result document::is_integer() noexcept {
    +  return get_root_value_iterator().is_root_integer(true);
    +}
    +
    +simdjson_inline simdjson_result document::get_number_type() noexcept {
    +  return get_root_value_iterator().get_root_number_type(true);
    +}
    +
    +simdjson_inline simdjson_result document::get_number() noexcept {
    +  return get_root_value_iterator().get_root_number(true);
    +}
    +
    +
    +simdjson_inline simdjson_result document::raw_json_token() noexcept {
    +  auto _iter = get_root_value_iterator();
    +  return std::string_view(reinterpret_cast(_iter.peek_start()), _iter.peek_start_length());
    +}
    +
    +simdjson_inline simdjson_result document::at_pointer(std::string_view json_pointer) noexcept {
    +  rewind(); // Rewind the document each time at_pointer is called
    +  if (json_pointer.empty()) {
    +    return this->get_value();
    +  }
    +  json_type t;
    +  SIMDJSON_TRY(type().get(t));
    +  switch (t)
    +  {
    +    case json_type::array:
    +      return (*this).get_array().at_pointer(json_pointer);
    +    case json_type::object:
    +      return (*this).get_object().at_pointer(json_pointer);
    +    default:
    +      return INVALID_JSON_POINTER;
    +  }
    +}
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  westmere::ondemand::document &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      error
    +    )
    +{
    +}
    +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline error_code simdjson_result::rewind() noexcept {
    +  if (error()) { return error(); }
    +  first.rewind();
    +  return SUCCESS;
    +}
    +simdjson_inline simdjson_result simdjson_result::begin() & noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() & noexcept {
    +  return {};
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_array();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_object();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_bool();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_value() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_value();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_null() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_null();
    +}
    +
    +template
    +simdjson_inline simdjson_result simdjson_result::get() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get();
    +}
    +template
    +simdjson_inline simdjson_result simdjson_result::get() && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).get();
    +}
    +template
    +simdjson_inline error_code simdjson_result::get(T &out) & noexcept {
    +  if (error()) { return error(); }
    +  return first.get(out);
    +}
    +template
    +simdjson_inline error_code simdjson_result::get(T &out) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).get(out);
    +}
    +
    +template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete;
    +template<> simdjson_inline simdjson_result simdjson_result::get() && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first);
    +}
    +template<> simdjson_inline error_code simdjson_result::get(westmere::ondemand::document &out) & noexcept = delete;
    +template<> simdjson_inline error_code simdjson_result::get(westmere::ondemand::document &out) && noexcept {
    +  if (error()) { return error(); }
    +  out = std::forward(first);
    +  return SUCCESS;
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::type() noexcept {
    +  if (error()) { return error(); }
    +  return first.type();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_scalar();
    +}
    +
    +
    +simdjson_inline bool simdjson_result::is_negative() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_negative();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_integer();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number_type();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::get_number() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number();
    +}
    +
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline simdjson_result::operator westmere::ondemand::array() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator westmere::ondemand::object() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator int64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator double() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator westmere::ondemand::raw_json_string() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator bool() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator westmere::ondemand::value() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +#endif
    +
    +
    +simdjson_inline simdjson_result simdjson_result::current_location() noexcept {
    +  if (error()) { return error(); }
    +  return first.current_location();
    +}
    +
    +simdjson_inline bool simdjson_result::at_end() const noexcept {
    +  if (error()) { return error(); }
    +  return first.at_end();
    +}
    +
    +
    +simdjson_inline int32_t simdjson_result::current_depth() const noexcept {
    +  if (error()) { return error(); }
    +  return first.current_depth();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json_token();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +
    +} // namespace simdjson
    +
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +simdjson_inline document_reference::document_reference() noexcept : doc{nullptr} {}
    +simdjson_inline document_reference::document_reference(document &d) noexcept : doc(&d) {}
    +simdjson_inline void document_reference::rewind() noexcept { doc->rewind(); }
    +simdjson_inline simdjson_result document_reference::get_array() & noexcept { return doc->get_array(); }
    +simdjson_inline simdjson_result document_reference::get_object() & noexcept { return doc->get_object(); }
    +/**
    + * The document_reference instances are used primarily/solely for streams of JSON
    + * documents.
    + * We decided that calling 'get_double()' on the JSON document '1.233 blabla' should
    + * give an error, so we check for trailing content.
    + *
    + * However, for streams of JSON documents, we want to be able to start from
    + * "321" "321" "321"
    + * and parse it successfully as a stream of JSON documents, calling get_uint64_in_string()
    + * successfully each time.
    + *
    + * To achieve this result, we pass a 'false' to a get_root_value_iterator() method:
    + * this indicates that we allow trailing content.
    + */
    +simdjson_inline simdjson_result document_reference::get_uint64() noexcept { return doc->get_root_value_iterator().get_root_uint64(false); }
    +simdjson_inline simdjson_result document_reference::get_uint64_in_string() noexcept { return doc->get_root_value_iterator().get_root_uint64_in_string(false); }
    +simdjson_inline simdjson_result document_reference::get_int64() noexcept { return doc->get_root_value_iterator().get_root_int64(false); }
    +simdjson_inline simdjson_result document_reference::get_int64_in_string() noexcept { return doc->get_root_value_iterator().get_root_int64_in_string(false); }
    +simdjson_inline simdjson_result document_reference::get_double() noexcept { return doc->get_root_value_iterator().get_root_double(false); }
    +simdjson_inline simdjson_result document_reference::get_double_in_string() noexcept { return doc->get_root_value_iterator().get_root_double(false); }
    +simdjson_inline simdjson_result document_reference::get_string(bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(false, allow_replacement); }
    +template 
    +simdjson_inline error_code document_reference::get_string(string_type& receiver, bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(receiver, false, allow_replacement); }
    +simdjson_inline simdjson_result document_reference::get_wobbly_string() noexcept { return doc->get_root_value_iterator().get_root_wobbly_string(false); }
    +simdjson_inline simdjson_result document_reference::get_raw_json_string() noexcept { return doc->get_root_value_iterator().get_root_raw_json_string(false); }
    +simdjson_inline simdjson_result document_reference::get_bool() noexcept { return doc->get_root_value_iterator().get_root_bool(false); }
    +simdjson_inline simdjson_result document_reference::get_value() noexcept { return doc->get_value(); }
    +simdjson_inline simdjson_result document_reference::is_null() noexcept { return doc->get_root_value_iterator().is_root_null(false); }
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline document_reference::operator array() & noexcept(false) { return array(*doc); }
    +simdjson_inline document_reference::operator object() & noexcept(false) { return object(*doc); }
    +simdjson_inline document_reference::operator uint64_t() noexcept(false) { return get_uint64(); }
    +simdjson_inline document_reference::operator int64_t() noexcept(false) { return get_int64(); }
    +simdjson_inline document_reference::operator double() noexcept(false) { return get_double(); }
    +simdjson_inline document_reference::operator std::string_view() noexcept(false) { return std::string_view(*doc); }
    +simdjson_inline document_reference::operator raw_json_string() noexcept(false) { return raw_json_string(*doc); }
    +simdjson_inline document_reference::operator bool() noexcept(false) { return get_bool(); }
    +simdjson_inline document_reference::operator value() noexcept(false) { return value(*doc); }
    +#endif
    +simdjson_inline simdjson_result document_reference::count_elements() & noexcept { return doc->count_elements(); }
    +simdjson_inline simdjson_result document_reference::count_fields() & noexcept { return doc->count_fields(); }
    +simdjson_inline simdjson_result document_reference::at(size_t index) & noexcept { return doc->at(index); }
    +simdjson_inline simdjson_result document_reference::begin() & noexcept { return doc->begin(); }
    +simdjson_inline simdjson_result document_reference::end() & noexcept { return doc->end(); }
    +simdjson_inline simdjson_result document_reference::find_field(std::string_view key) & noexcept { return doc->find_field(key); }
    +simdjson_inline simdjson_result document_reference::find_field(const char *key) & noexcept { return doc->find_field(key); }
    +simdjson_inline simdjson_result document_reference::operator[](std::string_view key) & noexcept { return (*doc)[key]; }
    +simdjson_inline simdjson_result document_reference::operator[](const char *key) & noexcept { return (*doc)[key]; }
    +simdjson_inline simdjson_result document_reference::find_field_unordered(std::string_view key) & noexcept { return doc->find_field_unordered(key); }
    +simdjson_inline simdjson_result document_reference::find_field_unordered(const char *key) & noexcept { return doc->find_field_unordered(key); }
    +simdjson_inline simdjson_result document_reference::type() noexcept { return doc->type(); }
    +simdjson_inline simdjson_result document_reference::is_scalar() noexcept { return doc->is_scalar(); }
    +simdjson_inline simdjson_result document_reference::current_location() noexcept { return doc->current_location(); }
    +simdjson_inline int32_t document_reference::current_depth() const noexcept { return doc->current_depth(); }
    +simdjson_inline bool document_reference::is_negative() noexcept { return doc->is_negative(); }
    +simdjson_inline simdjson_result document_reference::is_integer() noexcept { return doc->get_root_value_iterator().is_root_integer(false); }
    +simdjson_inline simdjson_result document_reference::get_number_type() noexcept { return doc->get_root_value_iterator().get_root_number_type(false); }
    +simdjson_inline simdjson_result document_reference::get_number() noexcept { return doc->get_root_value_iterator().get_root_number(false); }
    +simdjson_inline simdjson_result document_reference::raw_json_token() noexcept { return doc->raw_json_token(); }
    +simdjson_inline simdjson_result document_reference::at_pointer(std::string_view json_pointer) noexcept { return doc->at_pointer(json_pointer); }
    +simdjson_inline simdjson_result document_reference::raw_json() noexcept { return doc->raw_json();}
    +simdjson_inline document_reference::operator document&() const noexcept { return *doc; }
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +
    +
    +namespace simdjson {
    +simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::document_reference value, error_code error)
    +  noexcept : implementation_simdjson_result_base(std::forward(value), error) {}
    +
    +
    +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline error_code simdjson_result::rewind() noexcept {
    +  if (error()) { return error(); }
    +  first.rewind();
    +  return SUCCESS;
    +}
    +simdjson_inline simdjson_result simdjson_result::begin() & noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() & noexcept {
    +  return {};
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_array();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept {
    +  if (error()) { return error(); }
    +  return first.get_object();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_bool();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_value() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_value();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_null() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_null();
    +}
    +simdjson_inline simdjson_result simdjson_result::type() noexcept {
    +  if (error()) { return error(); }
    +  return first.type();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_scalar();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_negative() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_negative();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_integer();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number_type();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number();
    +}
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline simdjson_result::operator westmere::ondemand::array() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator westmere::ondemand::object() & noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator int64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator double() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator westmere::ondemand::raw_json_string() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator bool() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator westmere::ondemand::value() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +#endif
    +
    +simdjson_inline simdjson_result simdjson_result::current_location() noexcept {
    +  if (error()) { return error(); }
    +  return first.current_location();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json_token();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H
    +/* end file simdjson/generic/ondemand/document-inl.h for westmere */
    +/* including simdjson/generic/ondemand/document_stream-inl.h for westmere: #include "simdjson/generic/ondemand/document_stream-inl.h" */
    +/* begin file simdjson/generic/ondemand/document_stream-inl.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document_stream.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +
    +inline void stage1_worker::finish() {
    +  // After calling "run" someone would call finish() to wait
    +  // for the end of the processing.
    +  // This function will wait until either the thread has done
    +  // the processing or, else, the destructor has been called.
    +  std::unique_lock lock(locking_mutex);
    +  cond_var.wait(lock, [this]{return has_work == false;});
    +}
    +
    +inline stage1_worker::~stage1_worker() {
    +  // The thread may never outlive the stage1_worker instance
    +  // and will always be stopped/joined before the stage1_worker
    +  // instance is gone.
    +  stop_thread();
    +}
    +
    +inline void stage1_worker::start_thread() {
    +  std::unique_lock lock(locking_mutex);
    +  if(thread.joinable()) {
    +    return; // This should never happen but we never want to create more than one thread.
    +  }
    +  thread = std::thread([this]{
    +      while(true) {
    +        std::unique_lock thread_lock(locking_mutex);
    +        // We wait for either "run" or "stop_thread" to be called.
    +        cond_var.wait(thread_lock, [this]{return has_work || !can_work;});
    +        // If, for some reason, the stop_thread() method was called (i.e., the
    +        // destructor of stage1_worker is called, then we want to immediately destroy
    +        // the thread (and not do any more processing).
    +        if(!can_work) {
    +          break;
    +        }
    +        this->owner->stage1_thread_error = this->owner->run_stage1(*this->stage1_thread_parser,
    +              this->_next_batch_start);
    +        this->has_work = false;
    +        // The condition variable call should be moved after thread_lock.unlock() for performance
    +        // reasons but thread sanitizers may report it as a data race if we do.
    +        // See https://stackoverflow.com/questions/35775501/c-should-condition-variable-be-notified-under-lock
    +        cond_var.notify_one(); // will notify "finish"
    +        thread_lock.unlock();
    +      }
    +    }
    +  );
    +}
    +
    +
    +inline void stage1_worker::stop_thread() {
    +  std::unique_lock lock(locking_mutex);
    +  // We have to make sure that all locks can be released.
    +  can_work = false;
    +  has_work = false;
    +  cond_var.notify_all();
    +  lock.unlock();
    +  if(thread.joinable()) {
    +    thread.join();
    +  }
    +}
    +
    +inline void stage1_worker::run(document_stream * ds, parser * stage1, size_t next_batch_start) {
    +  std::unique_lock lock(locking_mutex);
    +  owner = ds;
    +  _next_batch_start = next_batch_start;
    +  stage1_thread_parser = stage1;
    +  has_work = true;
    +  // The condition variable call should be moved after thread_lock.unlock() for performance
    +  // reasons but thread sanitizers may report it as a data race if we do.
    +  // See https://stackoverflow.com/questions/35775501/c-should-condition-variable-be-notified-under-lock
    +  cond_var.notify_one(); // will notify the thread lock that we have work
    +  lock.unlock();
    +}
    +
    +#endif  // SIMDJSON_THREADS_ENABLED
    +
    +simdjson_inline document_stream::document_stream(
    +  ondemand::parser &_parser,
    +  const uint8_t *_buf,
    +  size_t _len,
    +  size_t _batch_size,
    +  bool _allow_comma_separated
    +) noexcept
    +  : parser{&_parser},
    +    buf{_buf},
    +    len{_len},
    +    batch_size{_batch_size <= MINIMAL_BATCH_SIZE ? MINIMAL_BATCH_SIZE : _batch_size},
    +    allow_comma_separated{_allow_comma_separated},
    +    error{SUCCESS}
    +    #ifdef SIMDJSON_THREADS_ENABLED
    +    , use_thread(_parser.threaded) // we need to make a copy because _parser.threaded can change
    +    #endif
    +{
    +#ifdef SIMDJSON_THREADS_ENABLED
    +  if(worker.get() == nullptr) {
    +    error = MEMALLOC;
    +  }
    +#endif
    +}
    +
    +simdjson_inline document_stream::document_stream() noexcept
    +  : parser{nullptr},
    +    buf{nullptr},
    +    len{0},
    +    batch_size{0},
    +    allow_comma_separated{false},
    +    error{UNINITIALIZED}
    +    #ifdef SIMDJSON_THREADS_ENABLED
    +    , use_thread(false)
    +    #endif
    +{
    +}
    +
    +simdjson_inline document_stream::~document_stream() noexcept
    +{
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  worker.reset();
    +  #endif
    +}
    +
    +inline size_t document_stream::size_in_bytes() const noexcept {
    +  return len;
    +}
    +
    +inline size_t document_stream::truncated_bytes() const noexcept {
    +  if(error == CAPACITY) { return len - batch_start; }
    +  return parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] - parser->implementation->structural_indexes[parser->implementation->n_structural_indexes + 1];
    +}
    +
    +simdjson_inline document_stream::iterator::iterator() noexcept
    +  : stream{nullptr}, finished{true} {
    +}
    +
    +simdjson_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept
    +  : stream{_stream}, finished{is_end} {
    +}
    +
    +simdjson_inline simdjson_result document_stream::iterator::operator*() noexcept {
    +  //if(stream->error) { return stream->error; }
    +  return simdjson_result(stream->doc, stream->error);
    +}
    +
    +simdjson_inline document_stream::iterator& document_stream::iterator::operator++() noexcept {
    +  // If there is an error, then we want the iterator
    +  // to be finished, no matter what. (E.g., we do not
    +  // keep generating documents with errors, or go beyond
    +  // a document with errors.)
    +  //
    +  // Users do not have to call "operator*()" when they use operator++,
    +  // so we need to end the stream in the operator++ function.
    +  //
    +  // Note that setting finished = true is essential otherwise
    +  // we would enter an infinite loop.
    +  if (stream->error) { finished = true; }
    +  // Note that stream->error() is guarded against error conditions
    +  // (it will immediately return if stream->error casts to false).
    +  // In effect, this next function does nothing when (stream->error)
    +  // is true (hence the risk of an infinite loop).
    +  stream->next();
    +  // If that was the last document, we're finished.
    +  // It is the only type of error we do not want to appear
    +  // in operator*.
    +  if (stream->error == EMPTY) { finished = true; }
    +  // If we had any other kind of error (not EMPTY) then we want
    +  // to pass it along to the operator* and we cannot mark the result
    +  // as "finished" just yet.
    +  return *this;
    +}
    +
    +simdjson_inline bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept {
    +  return finished != other.finished;
    +}
    +
    +simdjson_inline document_stream::iterator document_stream::begin() noexcept {
    +  start();
    +  // If there are no documents, we're finished.
    +  return iterator(this, error == EMPTY);
    +}
    +
    +simdjson_inline document_stream::iterator document_stream::end() noexcept {
    +  return iterator(this, true);
    +}
    +
    +inline void document_stream::start() noexcept {
    +  if (error) { return; }
    +  error = parser->allocate(batch_size);
    +  if (error) { return; }
    +  // Always run the first stage 1 parse immediately
    +  batch_start = 0;
    +  error = run_stage1(*parser, batch_start);
    +  while(error == EMPTY) {
    +    // In exceptional cases, we may start with an empty block
    +    batch_start = next_batch_start();
    +    if (batch_start >= len) { return; }
    +    error = run_stage1(*parser, batch_start);
    +  }
    +  if (error) { return; }
    +  doc_index = batch_start;
    +  doc = document(json_iterator(&buf[batch_start], parser));
    +  doc.iter._streaming = true;
    +
    +  #ifdef SIMDJSON_THREADS_ENABLED
    +  if (use_thread && next_batch_start() < len) {
    +    // Kick off the first thread on next batch if needed
    +    error = stage1_thread_parser.allocate(batch_size);
    +    if (error) { return; }
    +    worker->start_thread();
    +    start_stage1_thread();
    +    if (error) { return; }
    +  }
    +  #endif // SIMDJSON_THREADS_ENABLED
    +}
    +
    +inline void document_stream::next() noexcept {
    +  // We always enter at once once in an error condition.
    +  if (error) { return; }
    +  next_document();
    +  if (error) { return; }
    +  auto cur_struct_index = doc.iter._root - parser->implementation->structural_indexes.get();
    +  doc_index = batch_start + parser->implementation->structural_indexes[cur_struct_index];
    +
    +  // Check if at end of structural indexes (i.e. at end of batch)
    +  if(cur_struct_index >= static_cast(parser->implementation->n_structural_indexes)) {
    +    error = EMPTY;
    +    // Load another batch (if available)
    +    while (error == EMPTY) {
    +      batch_start = next_batch_start();
    +      if (batch_start >= len) { break; }
    +      #ifdef SIMDJSON_THREADS_ENABLED
    +      if(use_thread) {
    +        load_from_stage1_thread();
    +      } else {
    +        error = run_stage1(*parser, batch_start);
    +      }
    +      #else
    +      error = run_stage1(*parser, batch_start);
    +      #endif
    +      /**
    +       * Whenever we move to another window, we need to update all pointers to make
    +       * it appear as if the input buffer started at the beginning of the window.
    +       *
    +       * Take this input:
    +       *
    +       * {"z":5}  {"1":1,"2":2,"4":4} [7,  10,   9]  [15,  11,   12, 13]  [154,  110,   112, 1311]
    +       *
    +       * Say you process the following window...
    +       *
    +       * '{"z":5}  {"1":1,"2":2,"4":4} [7,  10,   9]'
    +       *
    +       * When you do so, the json_iterator has a pointer at the beginning of the memory region
    +       * (pointing at the beginning of '{"z"...'.
    +       *
    +       * When you move to the window that starts at...
    +       *
    +       * '[7,  10,   9]  [15,  11,   12, 13] ...
    +       *
    +       * then it is not sufficient to just run stage 1. You also need to re-anchor the
    +       * json_iterator so that it believes we are starting at '[7,  10,   9]...'.
    +       *
    +       * Under the DOM front-end, this gets done automatically because the parser owns
    +       * the pointer the data, and when you call stage1 and then stage2 on the same
    +       * parser, then stage2 will run on the pointer acquired by stage1.
    +       *
    +       * That is, stage1 calls "this->buf = _buf" so the parser remembers the buffer that
    +       * we used. But json_iterator has no callback when stage1 is called on the parser.
    +       * In fact, I think that the parser is unaware of json_iterator.
    +       *
    +       *
    +       * So we need to re-anchor the json_iterator after each call to stage 1 so that
    +       * all of the pointers are in sync.
    +       */
    +      doc.iter = json_iterator(&buf[batch_start], parser);
    +      doc.iter._streaming = true;
    +      /**
    +       * End of resync.
    +       */
    +
    +      if (error) { continue; } // If the error was EMPTY, we may want to load another batch.
    +      doc_index = batch_start;
    +    }
    +  }
    +}
    +
    +inline void document_stream::next_document() noexcept {
    +  // Go to next place where depth=0 (document depth)
    +  error = doc.iter.skip_child(0);
    +  if (error) { return; }
    +  // Always set depth=1 at the start of document
    +  doc.iter._depth = 1;
    +  // consume comma if comma separated is allowed
    +  if (allow_comma_separated) { doc.iter.consume_character(','); }
    +  // Resets the string buffer at the beginning, thus invalidating the strings.
    +  doc.iter._string_buf_loc = parser->string_buf.get();
    +  doc.iter._root = doc.iter.position();
    +}
    +
    +inline size_t document_stream::next_batch_start() const noexcept {
    +  return batch_start + parser->implementation->structural_indexes[parser->implementation->n_structural_indexes];
    +}
    +
    +inline error_code document_stream::run_stage1(ondemand::parser &p, size_t _batch_start) noexcept {
    +  // This code only updates the structural index in the parser, it does not update any json_iterator
    +  // instance.
    +  size_t remaining = len - _batch_start;
    +  if (remaining <= batch_size) {
    +    return p.implementation->stage1(&buf[_batch_start], remaining, stage1_mode::streaming_final);
    +  } else {
    +    return p.implementation->stage1(&buf[_batch_start], batch_size, stage1_mode::streaming_partial);
    +  }
    +}
    +
    +simdjson_inline size_t document_stream::iterator::current_index() const noexcept {
    +  return stream->doc_index;
    +}
    +
    +simdjson_inline std::string_view document_stream::iterator::source() const noexcept {
    +  auto depth = stream->doc.iter.depth();
    +  auto cur_struct_index = stream->doc.iter._root - stream->parser->implementation->structural_indexes.get();
    +
    +  // If at root, process the first token to determine if scalar value
    +  if (stream->doc.iter.at_root()) {
    +    switch (stream->buf[stream->batch_start + stream->parser->implementation->structural_indexes[cur_struct_index]]) {
    +      case '{': case '[':   // Depth=1 already at start of document
    +        break;
    +      case '}': case ']':
    +        depth--;
    +        break;
    +      default:    // Scalar value document
    +        // TODO: Remove any trailing whitespaces
    +        // This returns a string spanning from start of value to the beginning of the next document (excluded)
    +        return std::string_view(reinterpret_cast(stream->buf) + current_index(), stream->parser->implementation->structural_indexes[++cur_struct_index] - current_index() - 1);
    +    }
    +    cur_struct_index++;
    +  }
    +
    +  while (cur_struct_index <= static_cast(stream->parser->implementation->n_structural_indexes)) {
    +    switch (stream->buf[stream->batch_start + stream->parser->implementation->structural_indexes[cur_struct_index]]) {
    +      case '{': case '[':
    +        depth++;
    +        break;
    +      case '}': case ']':
    +        depth--;
    +        break;
    +    }
    +    if (depth == 0) { break; }
    +    cur_struct_index++;
    +  }
    +
    +  return std::string_view(reinterpret_cast(stream->buf) + current_index(), stream->parser->implementation->structural_indexes[cur_struct_index] - current_index() + stream->batch_start + 1);;
    +}
    +
    +inline error_code document_stream::iterator::error() const noexcept {
    +  return stream->error;
    +}
    +
    +#ifdef SIMDJSON_THREADS_ENABLED
    +
    +inline void document_stream::load_from_stage1_thread() noexcept {
    +  worker->finish();
    +  // Swap to the parser that was loaded up in the thread. Make sure the parser has
    +  // enough memory to swap to, as well.
    +  std::swap(stage1_thread_parser,*parser);
    +  error = stage1_thread_error;
    +  if (error) { return; }
    +
    +  // If there's anything left, start the stage 1 thread!
    +  if (next_batch_start() < len) {
    +    start_stage1_thread();
    +  }
    +}
    +
    +inline void document_stream::start_stage1_thread() noexcept {
    +  // we call the thread on a lambda that will update
    +  // this->stage1_thread_error
    +  // there is only one thread that may write to this value
    +  // TODO this is NOT exception-safe.
    +  this->stage1_thread_error = UNINITIALIZED; // In case something goes wrong, make sure it's an error
    +  size_t _next_batch_start = this->next_batch_start();
    +
    +  worker->run(this, & this->stage1_thread_parser, _next_batch_start);
    +}
    +
    +#endif // SIMDJSON_THREADS_ENABLED
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(error)
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  westmere::ondemand::document_stream &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +
    +}
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H
    +/* end file simdjson/generic/ondemand/document_stream-inl.h for westmere */
    +/* including simdjson/generic/ondemand/field-inl.h for westmere: #include "simdjson/generic/ondemand/field-inl.h" */
    +/* begin file simdjson/generic/ondemand/field-inl.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/field.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +// clang 6 doesn't think the default constructor can be noexcept, so we make it explicit
    +simdjson_inline field::field() noexcept : std::pair() {}
    +
    +simdjson_inline field::field(raw_json_string key, ondemand::value &&value) noexcept
    +  : std::pair(key, std::forward(value))
    +{
    +}
    +
    +simdjson_inline simdjson_result field::start(value_iterator &parent_iter) noexcept {
    +  raw_json_string key;
    +  SIMDJSON_TRY( parent_iter.field_key().get(key) );
    +  SIMDJSON_TRY( parent_iter.field_value() );
    +  return field::start(parent_iter, key);
    +}
    +
    +simdjson_inline simdjson_result field::start(const value_iterator &parent_iter, raw_json_string key) noexcept {
    +    return field(key, parent_iter.child());
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result field::unescaped_key(bool allow_replacement) noexcept {
    +  SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() but Visual Studio won't let us.
    +  simdjson_result answer = first.unescape(second.iter.json_iter(), allow_replacement);
    +  first.consume();
    +  return answer;
    +}
    +
    +simdjson_inline raw_json_string field::key() const noexcept {
    +  SIMDJSON_ASSUME(first.buf != nullptr); // We would like to call .alive() by Visual Studio won't let us.
    +  return first;
    +}
    +
    +simdjson_inline value &field::value() & noexcept {
    +  return second;
    +}
    +
    +simdjson_inline value field::value() && noexcept {
    +  return std::forward(*this).second;
    +}
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  westmere::ondemand::field &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::key() noexcept {
    +  if (error()) { return error(); }
    +  return first.key();
    +}
    +simdjson_inline simdjson_result simdjson_result::unescaped_key(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.unescaped_key(allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::value() noexcept {
    +  if (error()) { return error(); }
    +  return std::move(first.value());
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H
    +/* end file simdjson/generic/ondemand/field-inl.h for westmere */
    +/* including simdjson/generic/ondemand/json_iterator-inl.h for westmere: #include "simdjson/generic/ondemand/json_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/json_iterator-inl.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/logger-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/token_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept
    +  : token(std::forward(other.token)),
    +    parser{other.parser},
    +    _string_buf_loc{other._string_buf_loc},
    +    error{other.error},
    +    _depth{other._depth},
    +    _root{other._root},
    +    _streaming{other._streaming}
    +{
    +  other.parser = nullptr;
    +}
    +simdjson_inline json_iterator &json_iterator::operator=(json_iterator &&other) noexcept {
    +  token = other.token;
    +  parser = other.parser;
    +  _string_buf_loc = other._string_buf_loc;
    +  error = other.error;
    +  _depth = other._depth;
    +  _root = other._root;
    +  _streaming = other._streaming;
    +  other.parser = nullptr;
    +  return *this;
    +}
    +
    +simdjson_inline json_iterator::json_iterator(const uint8_t *buf, ondemand::parser *_parser) noexcept
    +  : token(buf, &_parser->implementation->structural_indexes[0]),
    +    parser{_parser},
    +    _string_buf_loc{parser->string_buf.get()},
    +    _depth{1},
    +    _root{parser->implementation->structural_indexes.get()},
    +    _streaming{false}
    +
    +{
    +  logger::log_headers();
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens();
    +#endif
    +}
    +
    +inline void json_iterator::rewind() noexcept {
    +  token.set_position( root_position() );
    +  logger::log_headers(); // We start again
    +  _string_buf_loc = parser->string_buf.get();
    +  _depth = 1;
    +}
    +
    +inline bool json_iterator::balanced() const noexcept {
    +  token_iterator ti(token);
    +  int32_t count{0};
    +  ti.set_position( root_position() );
    +  while(ti.peek() <= peek_last()) {
    +    switch (*ti.return_current_and_advance())
    +    {
    +    case '[': case '{':
    +      count++;
    +      break;
    +    case ']': case '}':
    +      count--;
    +      break;
    +    default:
    +      break;
    +    }
    +  }
    +  return count == 0;
    +}
    +
    +
    +// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller
    +// relating depth and parent_depth, which is a desired effect. The warning does not show up if the
    +// skip_child() function is not marked inline).
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_warn_unused simdjson_inline error_code json_iterator::skip_child(depth_t parent_depth) noexcept {
    +  if (depth() <= parent_depth) { return SUCCESS; }
    +  switch (*return_current_and_advance()) {
    +    // TODO consider whether matching braces is a requirement: if non-matching braces indicates
    +    // *missing* braces, then future lookups are not in the object/arrays they think they are,
    +    // violating the rule "validate enough structure that the user can be confident they are
    +    // looking at the right values."
    +    // PERF TODO we can eliminate the switch here with a lookup of how much to add to depth
    +
    +    // For the first open array/object in a value, we've already incremented depth, so keep it the same
    +    // We never stop at colon, but if we did, it wouldn't affect depth
    +    case '[': case '{': case ':':
    +      logger::log_start_value(*this, "skip");
    +      break;
    +    // If there is a comma, we have just finished a value in an array/object, and need to get back in
    +    case ',':
    +      logger::log_value(*this, "skip");
    +      break;
    +    // ] or } means we just finished a value and need to jump out of the array/object
    +    case ']': case '}':
    +      logger::log_end_value(*this, "skip");
    +      _depth--;
    +      if (depth() <= parent_depth) { return SUCCESS; }
    +#if SIMDJSON_CHECK_EOF
    +      // If there are no more tokens, the parent is incomplete.
    +      if (at_end()) { return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "Missing [ or { at start"); }
    +#endif // SIMDJSON_CHECK_EOF
    +      break;
    +    case '"':
    +      if(*peek() == ':') {
    +        // We are at a key!!!
    +        // This might happen if you just started an object and you skip it immediately.
    +        // Performance note: it would be nice to get rid of this check as it is somewhat
    +        // expensive.
    +        // https://github.com/simdjson/simdjson/issues/1742
    +        logger::log_value(*this, "key");
    +        return_current_and_advance(); // eat up the ':'
    +        break; // important!!!
    +      }
    +      simdjson_fallthrough;
    +    // Anything else must be a scalar value
    +    default:
    +      // For the first scalar, we will have incremented depth already, so we decrement it here.
    +      logger::log_value(*this, "skip");
    +      _depth--;
    +      if (depth() <= parent_depth) { return SUCCESS; }
    +      break;
    +  }
    +
    +  // Now that we've considered the first value, we only increment/decrement for arrays/objects
    +  while (position() < end_position()) {
    +    switch (*return_current_and_advance()) {
    +      case '[': case '{':
    +        logger::log_start_value(*this, "skip");
    +        _depth++;
    +        break;
    +      // TODO consider whether matching braces is a requirement: if non-matching braces indicates
    +      // *missing* braces, then future lookups are not in the object/arrays they think they are,
    +      // violating the rule "validate enough structure that the user can be confident they are
    +      // looking at the right values."
    +      // PERF TODO we can eliminate the switch here with a lookup of how much to add to depth
    +      case ']': case '}':
    +        logger::log_end_value(*this, "skip");
    +        _depth--;
    +        if (depth() <= parent_depth) { return SUCCESS; }
    +        break;
    +      default:
    +        logger::log_value(*this, "skip", "");
    +        break;
    +    }
    +  }
    +
    +  return report_error(TAPE_ERROR, "not enough close braces");
    +}
    +
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_inline bool json_iterator::at_root() const noexcept {
    +  return position() == root_position();
    +}
    +
    +simdjson_inline bool json_iterator::is_single_token() const noexcept {
    +  return parser->implementation->n_structural_indexes == 1;
    +}
    +
    +simdjson_inline bool json_iterator::streaming() const noexcept {
    +  return _streaming;
    +}
    +
    +simdjson_inline token_position json_iterator::root_position() const noexcept {
    +  return _root;
    +}
    +
    +simdjson_inline void json_iterator::assert_at_document_depth() const noexcept {
    +  SIMDJSON_ASSUME( _depth == 1 );
    +}
    +
    +simdjson_inline void json_iterator::assert_at_root() const noexcept {
    +  SIMDJSON_ASSUME( _depth == 1 );
    +#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
    +  // Under Visual Studio, the next SIMDJSON_ASSUME fails with: the argument
    +  // has side effects that will be discarded.
    +  SIMDJSON_ASSUME( token.position() == _root );
    +#endif
    +}
    +
    +simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) const noexcept {
    +  assert_valid_position(token._position + required_tokens - 1);
    +}
    +
    +simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept {
    +#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
    +  SIMDJSON_ASSUME( position >= &parser->implementation->structural_indexes[0] );
    +  SIMDJSON_ASSUME( position < &parser->implementation->structural_indexes[parser->implementation->n_structural_indexes] );
    +#endif
    +}
    +
    +simdjson_inline bool json_iterator::at_end() const noexcept {
    +  return position() == end_position();
    +}
    +simdjson_inline token_position json_iterator::end_position() const noexcept {
    +  uint32_t n_structural_indexes{parser->implementation->n_structural_indexes};
    +  return &parser->implementation->structural_indexes[n_structural_indexes];
    +}
    +
    +inline std::string json_iterator::to_string() const noexcept {
    +  if( !is_alive() ) { return "dead json_iterator instance"; }
    +  const char * current_structural = reinterpret_cast(token.peek());
    +  return std::string("json_iterator [ depth : ") + std::to_string(_depth)
    +          + std::string(", structural : '") + std::string(current_structural,1)
    +          + std::string("', offset : ") + std::to_string(token.current_offset())
    +          + std::string("', error : ") + error_message(error)
    +          + std::string(" ]");
    +}
    +
    +inline simdjson_result json_iterator::current_location() const noexcept {
    +  if (!is_alive()) {    // Unrecoverable error
    +    if (!at_root()) {
    +      return reinterpret_cast(token.peek(-1));
    +    } else {
    +      return reinterpret_cast(token.peek());
    +    }
    +  }
    +  if (at_end()) {
    +    return OUT_OF_BOUNDS;
    +  }
    +  return reinterpret_cast(token.peek());
    +}
    +
    +simdjson_inline bool json_iterator::is_alive() const noexcept {
    +  return parser;
    +}
    +
    +simdjson_inline void json_iterator::abandon() noexcept {
    +  parser = nullptr;
    +  _depth = 0;
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::return_current_and_advance() noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens();
    +#endif // SIMDJSON_CHECK_EOF
    +  return token.return_current_and_advance();
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::unsafe_pointer() const noexcept {
    +  // deliberately done without safety guard:
    +  return token.peek();
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::peek(int32_t delta) const noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens(delta+1);
    +#endif // SIMDJSON_CHECK_EOF
    +  return token.peek(delta);
    +}
    +
    +simdjson_inline uint32_t json_iterator::peek_length(int32_t delta) const noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_more_tokens(delta+1);
    +#endif // #if SIMDJSON_CHECK_EOF
    +  return token.peek_length(delta);
    +}
    +
    +simdjson_inline const uint8_t *json_iterator::peek(token_position position) const noexcept {
    +  // todo: currently we require end-of-string buffering, but the following
    +  // assert_valid_position should be turned on if/when we lift that condition.
    +  // assert_valid_position(position);
    +  // This is almost surely related to SIMDJSON_CHECK_EOF but given that SIMDJSON_CHECK_EOF
    +  // is ON by default, we have no choice but to disable it for real with a comment.
    +  return token.peek(position);
    +}
    +
    +simdjson_inline uint32_t json_iterator::peek_length(token_position position) const noexcept {
    +#if SIMDJSON_CHECK_EOF
    +  assert_valid_position(position);
    +#endif // SIMDJSON_CHECK_EOF
    +  return token.peek_length(position);
    +}
    +
    +simdjson_inline token_position json_iterator::last_position() const noexcept {
    +  // The following line fails under some compilers...
    +  // SIMDJSON_ASSUME(parser->implementation->n_structural_indexes > 0);
    +  // since it has side-effects.
    +  uint32_t n_structural_indexes{parser->implementation->n_structural_indexes};
    +  SIMDJSON_ASSUME(n_structural_indexes > 0);
    +  return &parser->implementation->structural_indexes[n_structural_indexes - 1];
    +}
    +simdjson_inline const uint8_t *json_iterator::peek_last() const noexcept {
    +  return token.peek(last_position());
    +}
    +
    +simdjson_inline void json_iterator::ascend_to(depth_t parent_depth) noexcept {
    +  SIMDJSON_ASSUME(parent_depth >= 0 && parent_depth < INT32_MAX - 1);
    +  SIMDJSON_ASSUME(_depth == parent_depth + 1);
    +  _depth = parent_depth;
    +}
    +
    +simdjson_inline void json_iterator::descend_to(depth_t child_depth) noexcept {
    +  SIMDJSON_ASSUME(child_depth >= 1 && child_depth < INT32_MAX);
    +  SIMDJSON_ASSUME(_depth == child_depth - 1);
    +  _depth = child_depth;
    +}
    +
    +simdjson_inline depth_t json_iterator::depth() const noexcept {
    +  return _depth;
    +}
    +
    +simdjson_inline uint8_t *&json_iterator::string_buf_loc() noexcept {
    +  return _string_buf_loc;
    +}
    +
    +simdjson_inline error_code json_iterator::report_error(error_code _error, const char *message) noexcept {
    +  SIMDJSON_ASSUME(_error != SUCCESS && _error != UNINITIALIZED && _error != INCORRECT_TYPE && _error != NO_SUCH_FIELD);
    +  logger::log_error(*this, message);
    +  error = _error;
    +  return error;
    +}
    +
    +simdjson_inline token_position json_iterator::position() const noexcept {
    +  return token.position();
    +}
    +
    +simdjson_inline simdjson_result json_iterator::unescape(raw_json_string in, bool allow_replacement) noexcept {
    +  return parser->unescape(in, _string_buf_loc, allow_replacement);
    +}
    +
    +simdjson_inline simdjson_result json_iterator::unescape_wobbly(raw_json_string in) noexcept {
    +  return parser->unescape_wobbly(in, _string_buf_loc);
    +}
    +
    +simdjson_inline void json_iterator::reenter_child(token_position position, depth_t child_depth) noexcept {
    +  SIMDJSON_ASSUME(child_depth >= 1 && child_depth < INT32_MAX);
    +  SIMDJSON_ASSUME(_depth == child_depth - 1);
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +#ifndef SIMDJSON_CLANG_VISUAL_STUDIO
    +  SIMDJSON_ASSUME(size_t(child_depth) < parser->max_depth());
    +  SIMDJSON_ASSUME(position >= parser->start_positions[child_depth]);
    +#endif
    +#endif
    +  token.set_position(position);
    +  _depth = child_depth;
    +}
    +
    +simdjson_inline error_code json_iterator::consume_character(char c) noexcept {
    +  if (*peek() == c) {
    +    return_current_and_advance();
    +    return SUCCESS;
    +  }
    +  return TAPE_ERROR;
    +}
    +
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +
    +simdjson_inline token_position json_iterator::start_position(depth_t depth) const noexcept {
    +  SIMDJSON_ASSUME(size_t(depth) < parser->max_depth());
    +  return size_t(depth) < parser->max_depth() ? parser->start_positions[depth] : 0;
    +}
    +
    +simdjson_inline void json_iterator::set_start_position(depth_t depth, token_position position) noexcept {
    +  SIMDJSON_ASSUME(size_t(depth) < parser->max_depth());
    +  if(size_t(depth) < parser->max_depth()) { parser->start_positions[depth] = position; }
    +}
    +
    +#endif
    +
    +
    +simdjson_inline error_code json_iterator::optional_error(error_code _error, const char *message) noexcept {
    +  SIMDJSON_ASSUME(_error == INCORRECT_TYPE || _error == NO_SUCH_FIELD);
    +  logger::log_error(*this, message);
    +  return _error;
    +}
    +
    +
    +simdjson_warn_unused simdjson_inline bool json_iterator::copy_to_buffer(const uint8_t *json, uint32_t max_len, uint8_t *tmpbuf, size_t N) noexcept {
    +  // This function is not expected to be called in performance-sensitive settings.
    +  // Let us guard against silly cases:
    +  if((N < max_len) || (N == 0)) { return false; }
    +  // Copy to the buffer.
    +  std::memcpy(tmpbuf, json, max_len);
    +  if(N > max_len) { // We pad whatever remains with ' '.
    +    std::memset(tmpbuf + max_len, ' ', N - max_len);
    +  }
    +  return true;
    +}
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::json_iterator &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/json_iterator-inl.h for westmere */
    +/* including simdjson/generic/ondemand/json_type-inl.h for westmere: #include "simdjson/generic/ondemand/json_type-inl.h" */
    +/* begin file simdjson/generic/ondemand/json_type-inl.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +inline std::ostream& operator<<(std::ostream& out, json_type type) noexcept {
    +    switch (type) {
    +        case json_type::array: out << "array"; break;
    +        case json_type::object: out << "object"; break;
    +        case json_type::number: out << "number"; break;
    +        case json_type::string: out << "string"; break;
    +        case json_type::boolean: out << "boolean"; break;
    +        case json_type::null: out << "null"; break;
    +        default: SIMDJSON_UNREACHABLE();
    +    }
    +    return out;
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false) {
    +    return out << type.value();
    +}
    +#endif
    +
    +
    +
    +simdjson_inline number_type number::get_number_type() const noexcept {
    +  return type;
    +}
    +
    +simdjson_inline bool number::is_uint64() const noexcept {
    +  return get_number_type() == number_type::unsigned_integer;
    +}
    +
    +simdjson_inline uint64_t number::get_uint64() const noexcept {
    +  return payload.unsigned_integer;
    +}
    +
    +simdjson_inline number::operator uint64_t() const noexcept {
    +  return get_uint64();
    +}
    +
    +
    +simdjson_inline bool number::is_int64() const noexcept {
    +  return get_number_type() == number_type::signed_integer;
    +}
    +
    +simdjson_inline int64_t number::get_int64() const noexcept {
    +  return payload.signed_integer;
    +}
    +
    +simdjson_inline number::operator int64_t() const noexcept {
    +  return get_int64();
    +}
    +
    +simdjson_inline bool number::is_double() const noexcept {
    +    return get_number_type() == number_type::floating_point_number;
    +}
    +
    +simdjson_inline double number::get_double() const noexcept {
    +  return payload.floating_point_number;
    +}
    +
    +simdjson_inline number::operator double() const noexcept {
    +  return get_double();
    +}
    +
    +simdjson_inline double number::as_double() const noexcept {
    +  if(is_double()) {
    +    return payload.floating_point_number;
    +  }
    +  if(is_int64()) {
    +    return double(payload.signed_integer);
    +  }
    +  return double(payload.unsigned_integer);
    +}
    +
    +simdjson_inline void number::append_s64(int64_t value) noexcept {
    +  payload.signed_integer = value;
    +  type = number_type::signed_integer;
    +}
    +
    +simdjson_inline void number::append_u64(uint64_t value) noexcept {
    +  payload.unsigned_integer = value;
    +  type = number_type::unsigned_integer;
    +}
    +
    +simdjson_inline void number::append_double(double value) noexcept {
    +  payload.floating_point_number = value;
    +  type = number_type::floating_point_number;
    +}
    +
    +simdjson_inline void number::skip_double() noexcept {
    +  type = number_type::floating_point_number;
    +}
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::json_type &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H
    +/* end file simdjson/generic/ondemand/json_type-inl.h for westmere */
    +/* including simdjson/generic/ondemand/logger-inl.h for westmere: #include "simdjson/generic/ondemand/logger-inl.h" */
    +/* begin file simdjson/generic/ondemand/logger-inl.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/logger.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#include 
    +#include 
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +namespace logger {
    +
    +static constexpr const char * DASHES = "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------";
    +static constexpr const int LOG_EVENT_LEN = 20;
    +static constexpr const int LOG_BUFFER_LEN = 30;
    +static constexpr const int LOG_SMALL_BUFFER_LEN = 10;
    +static int log_depth = 0; // Not threadsafe. Log only.
    +
    +// Helper to turn unprintable or newline characters into spaces
    +static inline char printable_char(char c) {
    +  if (c >= 0x20) {
    +    return c;
    +  } else {
    +    return ' ';
    +  }
    +}
    +
    +template
    +static inline std::string string_format(const std::string& format, const Args&... args)
    +{
    +  SIMDJSON_PUSH_DISABLE_ALL_WARNINGS
    +  int size_s = std::snprintf(nullptr, 0, format.c_str(), args...) + 1;
    +  auto size = static_cast(size_s);
    +  if (size <= 0) return std::string();
    +  std::unique_ptr buf(new char[size]);
    +  std::snprintf(buf.get(), size, format.c_str(), args...);
    +  SIMDJSON_POP_DISABLE_WARNINGS
    +  return std::string(buf.get(), buf.get() + size - 1);
    +}
    +
    +static inline log_level get_log_level_from_env()
    +{
    +  SIMDJSON_PUSH_DISABLE_WARNINGS
    +  SIMDJSON_DISABLE_DEPRECATED_WARNING // Disable CRT_SECURE warning on MSVC: manually verified this is safe
    +      char *lvl = getenv("SIMDJSON_LOG_LEVEL");
    +  SIMDJSON_POP_DISABLE_WARNINGS
    +  if (lvl && simdjson_strcasecmp(lvl, "ERROR") == 0) { return log_level::error; }
    +  return log_level::info;
    +}
    +
    +static inline log_level log_threshold()
    +{
    +  static log_level threshold = get_log_level_from_env();
    +  return threshold;
    +}
    +
    +static inline bool should_log(log_level level)
    +{
    +  return level >= log_threshold();
    +}
    +
    +inline void log_event(const json_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_line(iter, "", type, detail, delta, depth_delta, log_level::info);
    +}
    +
    +inline void log_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail) noexcept {
    +  log_line(iter, index, depth, "", type, detail, log_level::info);
    +}
    +inline void log_value(const json_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_line(iter, "", type, detail, delta, depth_delta, log_level::info);
    +}
    +
    +inline void log_start_value(const json_iterator &iter, token_position index, depth_t depth, const char *type, std::string_view detail) noexcept {
    +  log_line(iter, index, depth, "+", type, detail, log_level::info);
    +  if (LOG_ENABLED) { log_depth++; }
    +}
    +inline void log_start_value(const json_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  log_line(iter, "+", type, "", delta, depth_delta, log_level::info);
    +  if (LOG_ENABLED) { log_depth++; }
    +}
    +
    +inline void log_end_value(const json_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  if (LOG_ENABLED) { log_depth--; }
    +  log_line(iter, "-", type, "", delta, depth_delta, log_level::info);
    +}
    +
    +inline void log_error(const json_iterator &iter, const char *error, const char *detail, int delta, int depth_delta) noexcept {
    +  log_line(iter, "ERROR: ", error, detail, delta, depth_delta, log_level::error);
    +}
    +inline void log_error(const json_iterator &iter, token_position index, depth_t depth, const char *error, const char *detail) noexcept {
    +  log_line(iter, index, depth, "ERROR: ", error, detail, log_level::error);
    +}
    +
    +inline void log_event(const value_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_event(iter.json_iter(), type, detail, delta, depth_delta);
    +}
    +
    +inline void log_value(const value_iterator &iter, const char *type, std::string_view detail, int delta, int depth_delta) noexcept {
    +  log_value(iter.json_iter(), type, detail, delta, depth_delta);
    +}
    +
    +inline void log_start_value(const value_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  log_start_value(iter.json_iter(), type, delta, depth_delta);
    +}
    +
    +inline void log_end_value(const value_iterator &iter, const char *type, int delta, int depth_delta) noexcept {
    +  log_end_value(iter.json_iter(), type, delta, depth_delta);
    +}
    +
    +inline void log_error(const value_iterator &iter, const char *error, const char *detail, int delta, int depth_delta) noexcept {
    +  log_error(iter.json_iter(), error, detail, delta, depth_delta);
    +}
    +
    +inline void log_headers() noexcept {
    +  if (LOG_ENABLED) {
    +    if (simdjson_unlikely(should_log(log_level::info))) {
    +      // Technically a static variable is not thread-safe, but if you are using threads and logging... well...
    +      static bool displayed_hint{false};
    +      log_depth = 0;
    +      printf("\n");
    +      if (!displayed_hint) {
    +        // We only print this helpful header once.
    +        printf("# Logging provides the depth and position of the iterator user-visible steps:\n");
    +        printf("# +array says 'this is where we were when we discovered the start array'\n");
    +        printf(
    +            "# -array says 'this is where we were when we ended the array'\n");
    +        printf("# skip says 'this is a structural or value I am skipping'\n");
    +        printf("# +/-skip says 'this is a start/end array or object I am skipping'\n");
    +        printf("#\n");
    +        printf("# The indentation of the terms (array, string,...) indicates the depth,\n");
    +        printf("# in addition to the depth being displayed.\n");
    +        printf("#\n");
    +        printf("# Every token in the document has a single depth determined by the tokens before it,\n");
    +        printf("# and is not affected by what the token actually is.\n");
    +        printf("#\n");
    +        printf("# Not all structural elements are presented as tokens in the logs.\n");
    +        printf("#\n");
    +        printf("# We never give control to the user within an empty array or an empty object.\n");
    +        printf("#\n");
    +        printf("# Inside an array, having a depth greater than the array's depth means that\n");
    +        printf("# we are pointing inside a value.\n");
    +        printf("# Having a depth equal to the array means that we are pointing right before a value.\n");
    +        printf("# Having a depth smaller than the array means that we have moved beyond the array.\n");
    +        displayed_hint = true;
    +      }
    +      printf("\n");
    +      printf("| %-*s ", LOG_EVENT_LEN, "Event");
    +      printf("| %-*s ", LOG_BUFFER_LEN, "Buffer");
    +      printf("| %-*s ", LOG_SMALL_BUFFER_LEN, "Next");
    +      // printf("| %-*s ", 5,                    "Next#");
    +      printf("| %-*s ", 5, "Depth");
    +      printf("| Detail ");
    +      printf("|\n");
    +
    +      printf("|%.*s", LOG_EVENT_LEN + 2, DASHES);
    +      printf("|%.*s", LOG_BUFFER_LEN + 2, DASHES);
    +      printf("|%.*s", LOG_SMALL_BUFFER_LEN + 2, DASHES);
    +      // printf("|%.*s", 5+2, DASHES);
    +      printf("|%.*s", 5 + 2, DASHES);
    +      printf("|--------");
    +      printf("|\n");
    +      fflush(stdout);
    +    }
    +  }
    +}
    +
    +template 
    +inline void log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta, log_level level, Args&&... args) noexcept {
    +  log_line(iter, iter.position()+delta, depth_t(iter.depth()+depth_delta), title_prefix, title, detail, level, std::forward(args)...);
    +}
    +
    +template 
    +inline void log_line(const json_iterator &iter, token_position index, depth_t depth, const char *title_prefix, const char *title, std::string_view detail, log_level level, Args&&... args) noexcept {
    +  if (LOG_ENABLED) {
    +    if (simdjson_unlikely(should_log(level))) {
    +      const int indent = depth * 2;
    +      const auto buf = iter.token.buf;
    +      auto msg = string_format(title, std::forward(args)...);
    +      printf("| %*s%s%-*s ", indent, "", title_prefix,
    +             LOG_EVENT_LEN - indent - int(strlen(title_prefix)), msg.c_str());
    +      {
    +        // Print the current structural.
    +        printf("| ");
    +        // Before we begin, the index might point right before the document.
    +        // This could be unsafe, see https://github.com/simdjson/simdjson/discussions/1938
    +        if (index < iter._root) {
    +          printf("%*s", LOG_BUFFER_LEN, "");
    +        } else {
    +          auto current_structural = &buf[*index];
    +          for (int i = 0; i < LOG_BUFFER_LEN; i++) {
    +            printf("%c", printable_char(current_structural[i]));
    +          }
    +        }
    +        printf(" ");
    +      }
    +      {
    +        // Print the next structural.
    +        printf("| ");
    +        auto next_structural = &buf[*(index + 1)];
    +        for (int i = 0; i < LOG_SMALL_BUFFER_LEN; i++) {
    +          printf("%c", printable_char(next_structural[i]));
    +        }
    +        printf(" ");
    +      }
    +      // printf("| %5u ", *(index+1));
    +      printf("| %5i ", depth);
    +      printf("| %6.*s ", int(detail.size()), detail.data());
    +      printf("|\n");
    +      fflush(stdout);
    +    }
    +  }
    +}
    +
    +} // namespace logger
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H
    +/* end file simdjson/generic/ondemand/logger-inl.h for westmere */
    +/* including simdjson/generic/ondemand/object-inl.h for westmere: #include "simdjson/generic/ondemand/object-inl.h" */
    +/* begin file simdjson/generic/ondemand/object-inl.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/field.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +simdjson_inline simdjson_result object::find_field_unordered(const std::string_view key) & noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_unordered_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +simdjson_inline simdjson_result object::find_field_unordered(const std::string_view key) && noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_unordered_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +simdjson_inline simdjson_result object::operator[](const std::string_view key) & noexcept {
    +  return find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result object::operator[](const std::string_view key) && noexcept {
    +  return std::forward(*this).find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result object::find_field(const std::string_view key) & noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +simdjson_inline simdjson_result object::find_field(const std::string_view key) && noexcept {
    +  bool has_value;
    +  SIMDJSON_TRY( iter.find_field_raw(key).get(has_value) );
    +  if (!has_value) {
    +    logger::log_line(iter.json_iter(), "ERROR: ", "Cannot find key %.*s", "", -1, 0, logger::log_level::error, static_cast(key.size()), key.data());
    +    return NO_SUCH_FIELD;
    +  }
    +  return value(iter.child());
    +}
    +
    +simdjson_inline simdjson_result object::start(value_iterator &iter) noexcept {
    +  SIMDJSON_TRY( iter.start_object().error() );
    +  return object(iter);
    +}
    +simdjson_inline simdjson_result object::start_root(value_iterator &iter) noexcept {
    +  SIMDJSON_TRY( iter.start_root_object().error() );
    +  return object(iter);
    +}
    +simdjson_inline error_code object::consume() noexcept {
    +  if(iter.is_at_key()) {
    +    /**
    +     * whenever you are pointing at a key, calling skip_child() is
    +     * unsafe because you will hit a string and you will assume that
    +     * it is string value, and this mistake will lead you to make bad
    +     * depth computation.
    +     */
    +    /**
    +     * We want to 'consume' the key. We could really
    +     * just do _json_iter->return_current_and_advance(); at this
    +     * point, but, for clarity, we will use the high-level API to
    +     * eat the key. We assume that the compiler optimizes away
    +     * most of the work.
    +     */
    +    simdjson_unused raw_json_string actual_key;
    +    auto error = iter.field_key().get(actual_key);
    +    if (error) { iter.abandon(); return error; };
    +    // Let us move to the value while we are at it.
    +    if ((error = iter.field_value())) { iter.abandon(); return error; }
    +  }
    +  auto error_skip = iter.json_iter().skip_child(iter.depth()-1);
    +  if(error_skip) { iter.abandon(); }
    +  return error_skip;
    +}
    +
    +simdjson_inline simdjson_result object::raw_json() noexcept {
    +  const uint8_t * starting_point{iter.peek_start()};
    +  auto error = consume();
    +  if(error) { return error; }
    +  const uint8_t * final_point{iter._json_iter->peek()};
    +  return std::string_view(reinterpret_cast(starting_point), size_t(final_point - starting_point));
    +}
    +
    +simdjson_inline simdjson_result object::started(value_iterator &iter) noexcept {
    +  SIMDJSON_TRY( iter.started_object().error() );
    +  return object(iter);
    +}
    +
    +simdjson_inline object object::resume(const value_iterator &iter) noexcept {
    +  return iter;
    +}
    +
    +simdjson_inline object::object(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{
    +}
    +
    +simdjson_inline simdjson_result object::begin() noexcept {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  return object_iterator(iter);
    +}
    +simdjson_inline simdjson_result object::end() noexcept {
    +  return object_iterator(iter);
    +}
    +
    +inline simdjson_result object::at_pointer(std::string_view json_pointer) noexcept {
    +  if (json_pointer[0] != '/') { return INVALID_JSON_POINTER; }
    +  json_pointer = json_pointer.substr(1);
    +  size_t slash = json_pointer.find('/');
    +  std::string_view key = json_pointer.substr(0, slash);
    +  // Grab the child with the given key
    +  simdjson_result child;
    +
    +  // If there is an escape character in the key, unescape it and then get the child.
    +  size_t escape = key.find('~');
    +  if (escape != std::string_view::npos) {
    +    // Unescape the key
    +    std::string unescaped(key);
    +    do {
    +      switch (unescaped[escape+1]) {
    +        case '0':
    +          unescaped.replace(escape, 2, "~");
    +          break;
    +        case '1':
    +          unescaped.replace(escape, 2, "/");
    +          break;
    +        default:
    +          return INVALID_JSON_POINTER; // "Unexpected ~ escape character in JSON pointer");
    +      }
    +      escape = unescaped.find('~', escape+1);
    +    } while (escape != std::string::npos);
    +    child = find_field(unescaped);  // Take note find_field does not unescape keys when matching
    +  } else {
    +    child = find_field(key);
    +  }
    +  if(child.error()) {
    +    return child; // we do not continue if there was an error
    +  }
    +  // If there is a /, we have to recurse and look up more of the path
    +  if (slash != std::string_view::npos) {
    +    child = child.at_pointer(json_pointer.substr(slash));
    +  }
    +  return child;
    +}
    +
    +simdjson_inline simdjson_result object::count_fields() & noexcept {
    +  size_t count{0};
    +  // Important: we do not consume any of the values.
    +  for(simdjson_unused auto v : *this) { count++; }
    +  // The above loop will always succeed, but we want to report errors.
    +  if(iter.error()) { return iter.error(); }
    +  // We need to move back at the start because we expect users to iterate through
    +  // the object after counting the number of elements.
    +  iter.reset_object();
    +  return count;
    +}
    +
    +simdjson_inline simdjson_result object::is_empty() & noexcept {
    +  bool is_not_empty;
    +  auto error = iter.reset_object().get(is_not_empty);
    +  if(error) { return error; }
    +  return !is_not_empty;
    +}
    +
    +simdjson_inline simdjson_result object::reset() & noexcept {
    +  return iter.reset_object();
    +}
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::object &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +simdjson_inline simdjson_result simdjson_result::begin() noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() noexcept {
    +  if (error()) { return error(); }
    +  return first.end();
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first)[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) && noexcept {
    +  if (error()) { return error(); }
    +  return std::forward(first).find_field(key);
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +inline simdjson_result simdjson_result::reset() noexcept {
    +  if (error()) { return error(); }
    +  return first.reset();
    +}
    +
    +inline simdjson_result simdjson_result::is_empty() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_empty();
    +}
    +
    +simdjson_inline  simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +
    +simdjson_inline  simdjson_result simdjson_result::raw_json() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json();
    +}
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H
    +/* end file simdjson/generic/ondemand/object-inl.h for westmere */
    +/* including simdjson/generic/ondemand/object_iterator-inl.h for westmere: #include "simdjson/generic/ondemand/object_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/object_iterator-inl.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/field-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +//
    +// object_iterator
    +//
    +
    +simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{}
    +
    +simdjson_inline simdjson_result object_iterator::operator*() noexcept {
    +  error_code error = iter.error();
    +  if (error) { iter.abandon(); return error; }
    +  auto result = field::start(iter);
    +  // TODO this is a safety rail ... users should exit loops as soon as they receive an error.
    +  // Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free.
    +  if (result.error()) { iter.abandon(); }
    +  return result;
    +}
    +simdjson_inline bool object_iterator::operator==(const object_iterator &other) const noexcept {
    +  return !(*this != other);
    +}
    +simdjson_inline bool object_iterator::operator!=(const object_iterator &) const noexcept {
    +  return iter.is_open();
    +}
    +
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_inline object_iterator &object_iterator::operator++() noexcept {
    +  // TODO this is a safety rail ... users should exit loops as soon as they receive an error.
    +  // Nonetheless, let's see if performance is OK with this if statement--the compiler may give it to us for free.
    +  if (!iter.is_open()) { return *this; } // Iterator will be released if there is an error
    +
    +  simdjson_unused error_code error;
    +  if ((error = iter.skip_child() )) { return *this; }
    +
    +  simdjson_unused bool has_value;
    +  if ((error = iter.has_next_field().get(has_value) )) { return *this; };
    +  return *this;
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +//
    +// ### Live States
    +//
    +// While iterating or looking up values, depth >= iter.depth. at_start may vary. Error is
    +// always SUCCESS:
    +//
    +// - Start: This is the state when the object is first found and the iterator is just past the {.
    +//   In this state, at_start == true.
    +// - Next: After we hand a scalar value to the user, or an array/object which they then fully
    +//   iterate over, the iterator is at the , or } before the next value. In this state,
    +//   depth == iter.depth, at_start == false, and error == SUCCESS.
    +// - Unfinished Business: When we hand an array/object to the user which they do not fully
    +//   iterate over, we need to finish that iteration by skipping child values until we reach the
    +//   Next state. In this state, depth > iter.depth, at_start == false, and error == SUCCESS.
    +//
    +// ## Error States
    +//
    +// In error states, we will yield exactly one more value before stopping. iter.depth == depth
    +// and at_start is always false. We decrement after yielding the error, moving to the Finished
    +// state.
    +//
    +// - Chained Error: When the object iterator is part of an error chain--for example, in
    +//   `for (auto tweet : doc["tweets"])`, where the tweet field may be missing or not be an
    +//   object--we yield that error in the loop, exactly once. In this state, error != SUCCESS and
    +//   iter.depth == depth, and at_start == false. We decrement depth when we yield the error.
    +// - Missing Comma Error: When the iterator ++ method discovers there is no comma between fields,
    +//   we flag that as an error and treat it exactly the same as a Chained Error. In this state,
    +//   error == TAPE_ERROR, iter.depth == depth, and at_start == false.
    +//
    +// Errors that occur while reading a field to give to the user (such as when the key is not a
    +// string or the field is missing a colon) are yielded immediately. Depth is then decremented,
    +// moving to the Finished state without transitioning through an Error state at all.
    +//
    +// ## Terminal State
    +//
    +// The terminal state has iter.depth < depth. at_start is always false.
    +//
    +// - Finished: When we have reached a }, we are finished. We signal this by decrementing depth.
    +//   In this state, iter.depth < depth, at_start == false, and error == SUCCESS.
    +//
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  westmere::ondemand::object_iterator &&value
    +) noexcept
    +  : implementation_simdjson_result_base(std::forward(value))
    +{
    +  first.iter.assert_is_valid();
    +}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +  : implementation_simdjson_result_base({}, error)
    +{
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::operator*() noexcept {
    +  if (error()) { return error(); }
    +  return *first;
    +}
    +// If we're iterating and there is an error, return the error once.
    +simdjson_inline bool simdjson_result::operator==(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return !error(); }
    +  return first == other.first;
    +}
    +// If we're iterating and there is an error, return the error once.
    +simdjson_inline bool simdjson_result::operator!=(const simdjson_result &other) const noexcept {
    +  if (!first.iter.is_valid()) { return error(); }
    +  return first != other.first;
    +}
    +// Checks for ']' and ','
    +simdjson_inline simdjson_result &simdjson_result::operator++() noexcept {
    +  // Clear the error if there is one, so we don't yield it twice
    +  if (error()) { second = SUCCESS; return *this; }
    +  ++first;
    +  return *this;
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/object_iterator-inl.h for westmere */
    +/* including simdjson/generic/ondemand/parser-inl.h for westmere: #include "simdjson/generic/ondemand/parser-inl.h" */
    +/* begin file simdjson/generic/ondemand/parser-inl.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/padded_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/padded_string_view.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/internal/dom_parser_implementation.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/dom/base.h" // for MINIMAL_DOCUMENT_CAPACITY */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document_stream.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +simdjson_inline parser::parser(size_t max_capacity) noexcept
    +  : _max_capacity{max_capacity} {
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code parser::allocate(size_t new_capacity, size_t new_max_depth) noexcept {
    +  if (new_capacity > max_capacity()) { return CAPACITY; }
    +  if (string_buf && new_capacity == capacity() && new_max_depth == max_depth()) { return SUCCESS; }
    +
    +  // string_capacity copied from document::allocate
    +  _capacity = 0;
    +  size_t string_capacity = SIMDJSON_ROUNDUP_N(5 * new_capacity / 3 + SIMDJSON_PADDING, 64);
    +  string_buf.reset(new (std::nothrow) uint8_t[string_capacity]);
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  start_positions.reset(new (std::nothrow) token_position[new_max_depth]);
    +#endif
    +  if (implementation) {
    +    SIMDJSON_TRY( implementation->set_capacity(new_capacity) );
    +    SIMDJSON_TRY( implementation->set_max_depth(new_max_depth) );
    +  } else {
    +    SIMDJSON_TRY( simdjson::get_active_implementation()->create_dom_parser_implementation(new_capacity, new_max_depth, implementation) );
    +  }
    +  _capacity = new_capacity;
    +  _max_depth = new_max_depth;
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(padded_string_view json) & noexcept {
    +  if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; }
    +
    +  json.remove_utf8_bom();
    +
    +  // Allocate if needed
    +  if (capacity() < json.length() || !string_buf) {
    +    SIMDJSON_TRY( allocate(json.length(), max_depth()) );
    +  }
    +
    +  // Run stage 1.
    +  SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) );
    +  return document::start({ reinterpret_cast(json.data()), this });
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const char *json, size_t len, size_t allocated) & noexcept {
    +  return iterate(padded_string_view(json, len, allocated));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const uint8_t *json, size_t len, size_t allocated) & noexcept {
    +  return iterate(padded_string_view(json, len, allocated));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string_view json, size_t allocated) & noexcept {
    +  return iterate(padded_string_view(json, allocated));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string &json) & noexcept {
    +  if(json.capacity() - json.size() < SIMDJSON_PADDING) {
    +    json.reserve(json.size() + SIMDJSON_PADDING);
    +  }
    +  return iterate(padded_string_view(json));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const std::string &json) & noexcept {
    +  return iterate(padded_string_view(json));
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept {
    +  // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception
    +  SIMDJSON_TRY( result.error() );
    +  padded_string_view json = result.value_unsafe();
    +  return iterate(json);
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept {
    +  // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception
    +  SIMDJSON_TRY( result.error() );
    +  const padded_string &json = result.value_unsafe();
    +  return iterate(json);
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate_raw(padded_string_view json) & noexcept {
    +  if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; }
    +
    +  json.remove_utf8_bom();
    +
    +  // Allocate if needed
    +  if (capacity() < json.length()) {
    +    SIMDJSON_TRY( allocate(json.length(), max_depth()) );
    +  }
    +
    +  // Run stage 1.
    +  SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) );
    +  return json_iterator(reinterpret_cast(json.data()), this);
    +}
    +
    +inline simdjson_result parser::iterate_many(const uint8_t *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept {
    +  if(batch_size < MINIMAL_BATCH_SIZE) { batch_size = MINIMAL_BATCH_SIZE; }
    +  if((len >= 3) && (std::memcmp(buf, "\xEF\xBB\xBF", 3) == 0)) {
    +    buf += 3;
    +    len -= 3;
    +  }
    +  if(allow_comma_separated && batch_size < len) { batch_size = len; }
    +  return document_stream(*this, buf, len, batch_size, allow_comma_separated);
    +}
    +inline simdjson_result parser::iterate_many(const char *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept {
    +  return iterate_many(reinterpret_cast(buf), len, batch_size, allow_comma_separated);
    +}
    +inline simdjson_result parser::iterate_many(const std::string &s, size_t batch_size, bool allow_comma_separated) noexcept {
    +  return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated);
    +}
    +inline simdjson_result parser::iterate_many(const padded_string &s, size_t batch_size, bool allow_comma_separated) noexcept {
    +  return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated);
    +}
    +
    +simdjson_inline size_t parser::capacity() const noexcept {
    +  return _capacity;
    +}
    +simdjson_inline size_t parser::max_capacity() const noexcept {
    +  return _max_capacity;
    +}
    +simdjson_inline size_t parser::max_depth() const noexcept {
    +  return _max_depth;
    +}
    +
    +simdjson_inline void parser::set_max_capacity(size_t max_capacity) noexcept {
    +  if(max_capacity < dom::MINIMAL_DOCUMENT_CAPACITY) {
    +    _max_capacity = max_capacity;
    +  } else {
    +    _max_capacity = dom::MINIMAL_DOCUMENT_CAPACITY;
    +  }
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result parser::unescape(raw_json_string in, uint8_t *&dst, bool allow_replacement) const noexcept {
    +  uint8_t *end = implementation->parse_string(in.buf, dst, allow_replacement);
    +  if (!end) { return STRING_ERROR; }
    +  std::string_view result(reinterpret_cast(dst), end-dst);
    +  dst = end;
    +  return result;
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result parser::unescape_wobbly(raw_json_string in, uint8_t *&dst) const noexcept {
    +  uint8_t *end = implementation->parse_wobbly_string(in.buf, dst);
    +  if (!end) { return STRING_ERROR; }
    +  std::string_view result(reinterpret_cast(dst), end-dst);
    +  dst = end;
    +  return result;
    +}
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::parser &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H
    +/* end file simdjson/generic/ondemand/parser-inl.h for westmere */
    +/* including simdjson/generic/ondemand/raw_json_string-inl.h for westmere: #include "simdjson/generic/ondemand/raw_json_string-inl.h" */
    +/* begin file simdjson/generic/ondemand/raw_json_string-inl.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +
    +namespace westmere {
    +namespace ondemand {
    +
    +simdjson_inline raw_json_string::raw_json_string(const uint8_t * _buf) noexcept : buf{_buf} {}
    +
    +simdjson_inline const char * raw_json_string::raw() const noexcept { return reinterpret_cast(buf); }
    +
    +
    +simdjson_inline bool raw_json_string::is_free_from_unescaped_quote(std::string_view target) noexcept {
    +  size_t pos{0};
    +  // if the content has no escape character, just scan through it quickly!
    +  for(;pos < target.size() && target[pos] != '\\';pos++) {}
    +  // slow path may begin.
    +  bool escaping{false};
    +  for(;pos < target.size();pos++) {
    +    if((target[pos] == '"') && !escaping) {
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  return true;
    +}
    +
    +simdjson_inline bool raw_json_string::is_free_from_unescaped_quote(const char* target) noexcept {
    +  size_t pos{0};
    +  // if the content has no escape character, just scan through it quickly!
    +  for(;target[pos] && target[pos] != '\\';pos++) {}
    +  // slow path may begin.
    +  bool escaping{false};
    +  for(;target[pos];pos++) {
    +    if((target[pos] == '"') && !escaping) {
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  return true;
    +}
    +
    +
    +simdjson_inline bool raw_json_string::unsafe_is_equal(size_t length, std::string_view target) const noexcept {
    +  // If we are going to call memcmp, then we must know something about the length of the raw_json_string.
    +  return (length >= target.size()) && (raw()[target.size()] == '"') && !memcmp(raw(), target.data(), target.size());
    +}
    +
    +simdjson_inline bool raw_json_string::unsafe_is_equal(std::string_view target) const noexcept {
    +  // Assumptions: does not contain unescaped quote characters, and
    +  // the raw content is quote terminated within a valid JSON string.
    +  if(target.size() <= SIMDJSON_PADDING) {
    +    return (raw()[target.size()] == '"') && !memcmp(raw(), target.data(), target.size());
    +  }
    +  const char * r{raw()};
    +  size_t pos{0};
    +  for(;pos < target.size();pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +simdjson_inline bool raw_json_string::is_equal(std::string_view target) const noexcept {
    +  const char * r{raw()};
    +  size_t pos{0};
    +  bool escaping{false};
    +  for(;pos < target.size();pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +    // if target is a compile-time constant and it is free from
    +    // quotes, then the next part could get optimized away through
    +    // inlining.
    +    if((target[pos] == '"') && !escaping) {
    +      // We have reached the end of the raw_json_string but
    +      // the target is not done.
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +
    +simdjson_inline bool raw_json_string::unsafe_is_equal(const char * target) const noexcept {
    +  // Assumptions: 'target' does not contain unescaped quote characters, is null terminated and
    +  // the raw content is quote terminated within a valid JSON string.
    +  const char * r{raw()};
    +  size_t pos{0};
    +  for(;target[pos];pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +simdjson_inline bool raw_json_string::is_equal(const char* target) const noexcept {
    +  // Assumptions: does not contain unescaped quote characters, and
    +  // the raw content is quote terminated within a valid JSON string.
    +  const char * r{raw()};
    +  size_t pos{0};
    +  bool escaping{false};
    +  for(;target[pos];pos++) {
    +    if(r[pos] != target[pos]) { return false; }
    +    // if target is a compile-time constant and it is free from
    +    // quotes, then the next part could get optimized away through
    +    // inlining.
    +    if((target[pos] == '"') && !escaping) {
    +      // We have reached the end of the raw_json_string but
    +      // the target is not done.
    +      return false;
    +    } else if(target[pos] == '\\') {
    +      escaping = !escaping;
    +    } else {
    +      escaping = false;
    +    }
    +  }
    +  if(r[pos] != '"') { return false; }
    +  return true;
    +}
    +
    +simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept {
    +  return a.unsafe_is_equal(c);
    +}
    +
    +simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept {
    +  return a == c;
    +}
    +
    +simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept {
    +  return !(a == c);
    +}
    +
    +simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept {
    +  return !(a == c);
    +}
    +
    +
    +simdjson_inline simdjson_warn_unused simdjson_result raw_json_string::unescape(json_iterator &iter, bool allow_replacement) const noexcept {
    +  return iter.unescape(*this, allow_replacement);
    +}
    +
    +simdjson_inline simdjson_warn_unused simdjson_result raw_json_string::unescape_wobbly(json_iterator &iter) const noexcept {
    +  return iter.unescape_wobbly(*this);
    +}
    +
    +simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &out, const raw_json_string &str) noexcept {
    +  bool in_escape = false;
    +  const char *s = str.raw();
    +  while (true) {
    +    switch (*s) {
    +      case '\\': in_escape = !in_escape; break;
    +      case '"': if (in_escape) { in_escape = false; } else { return out; } break;
    +      default: if (in_escape) { in_escape = false; }
    +    }
    +    out << *s;
    +    s++;
    +  }
    +}
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::raw_json_string &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +simdjson_inline simdjson_result simdjson_result::raw() const noexcept {
    +  if (error()) { return error(); }
    +  return first.raw();
    +}
    +simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape(westmere::ondemand::json_iterator &iter, bool allow_replacement) const noexcept {
    +  if (error()) { return error(); }
    +  return first.unescape(iter, allow_replacement);
    +}
    +simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape_wobbly(westmere::ondemand::json_iterator &iter) const noexcept {
    +  if (error()) { return error(); }
    +  return first.unescape_wobbly(iter);
    +}
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_INL_H
    +/* end file simdjson/generic/ondemand/raw_json_string-inl.h for westmere */
    +/* including simdjson/generic/ondemand/serialization-inl.h for westmere: #include "simdjson/generic/ondemand/serialization-inl.h" */
    +/* begin file simdjson/generic/ondemand/serialization-inl.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/serialization.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +
    +inline std::string_view trim(const std::string_view str) noexcept {
    +  // We can almost surely do better by rolling our own find_first_not_of function.
    +  size_t first = str.find_first_not_of(" \t\n\r");
    +  // If we have the empty string (just white space), then no trimming is possible, and
    +  // we return the empty string_view.
    +  if (std::string_view::npos == first) { return std::string_view(); }
    +  size_t last = str.find_last_not_of(" \t\n\r");
    +  return str.substr(first, (last - first + 1));
    +}
    +
    +
    +inline simdjson_result to_json_string(westmere::ondemand::document& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(westmere::ondemand::document_reference& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(westmere::ondemand::value& x) noexcept {
    +  /**
    +   * If we somehow receive a value that has already been consumed,
    +   * then the following code could be in trouble. E.g., we create
    +   * an array as needed, but if an array was already created, then
    +   * it could be bad.
    +   */
    +  using namespace westmere::ondemand;
    +  westmere::ondemand::json_type t;
    +  auto error = x.type().get(t);
    +  if(error != SUCCESS) { return error; }
    +  switch (t)
    +  {
    +    case json_type::array:
    +    {
    +      westmere::ondemand::array array;
    +      error = x.get_array().get(array);
    +      if(error) { return error; }
    +      return to_json_string(array);
    +    }
    +    case json_type::object:
    +    {
    +      westmere::ondemand::object object;
    +      error = x.get_object().get(object);
    +      if(error) { return error; }
    +      return to_json_string(object);
    +    }
    +    default:
    +      return trim(x.raw_json_token());
    +  }
    +}
    +
    +inline simdjson_result to_json_string(westmere::ondemand::object& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(westmere::ondemand::array& x) noexcept {
    +  std::string_view v;
    +  auto error = x.raw_json().get(v);
    +  if(error) {return error; }
    +  return trim(v);
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +
    +inline simdjson_result to_json_string(simdjson_result x) {
    +  if (x.error()) { return x.error(); }
    +  return to_json_string(x.value_unsafe());
    +}
    +} // namespace simdjson
    +
    +namespace simdjson { namespace westmere { namespace ondemand {
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::value x) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(x).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::value x) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(x).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::array value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::array value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::document& value)  {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::document_reference& value)  {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x) {
    +  if (x.error()) { throw simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::document& value)  {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +
    +#if SIMDJSON_EXCEPTIONS
    +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::object value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    throw simdjson::simdjson_error(error);
    +  }
    +}
    +inline std::ostream& operator<<(std::ostream& out,  simdjson::simdjson_result x) {
    +  if (x.error()) { throw  simdjson::simdjson_error(x.error()); }
    +  return (out << x.value());
    +}
    +#else
    +inline std::ostream& operator<<(std::ostream& out, simdjson::westmere::ondemand::object value) {
    +  std::string_view v;
    +  auto error = simdjson::to_json_string(value).get(v);
    +  if(error == simdjson::SUCCESS) {
    +    return (out << v);
    +  } else {
    +    return (out << error);
    +  }
    +}
    +#endif
    +}}} // namespace simdjson::westmere::ondemand
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_INL_H
    +/* end file simdjson/generic/ondemand/serialization-inl.h for westmere */
    +/* including simdjson/generic/ondemand/token_iterator-inl.h for westmere: #include "simdjson/generic/ondemand/token_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/token_iterator-inl.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/token_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +simdjson_inline token_iterator::token_iterator(
    +  const uint8_t *_buf,
    +  token_position position
    +) noexcept : buf{_buf}, _position{position}
    +{
    +}
    +
    +simdjson_inline uint32_t token_iterator::current_offset() const noexcept {
    +  return *(_position);
    +}
    +
    +
    +simdjson_inline const uint8_t *token_iterator::return_current_and_advance() noexcept {
    +  return &buf[*(_position++)];
    +}
    +
    +simdjson_inline const uint8_t *token_iterator::peek(token_position position) const noexcept {
    +  return &buf[*position];
    +}
    +simdjson_inline uint32_t token_iterator::peek_index(token_position position) const noexcept {
    +  return *position;
    +}
    +simdjson_inline uint32_t token_iterator::peek_length(token_position position) const noexcept {
    +  return *(position+1) - *position;
    +}
    +
    +simdjson_inline const uint8_t *token_iterator::peek(int32_t delta) const noexcept {
    +  return &buf[*(_position+delta)];
    +}
    +simdjson_inline uint32_t token_iterator::peek_index(int32_t delta) const noexcept {
    +  return *(_position+delta);
    +}
    +simdjson_inline uint32_t token_iterator::peek_length(int32_t delta) const noexcept {
    +  return *(_position+delta+1) - *(_position+delta);
    +}
    +
    +simdjson_inline token_position token_iterator::position() const noexcept {
    +  return _position;
    +}
    +simdjson_inline void token_iterator::set_position(token_position target_position) noexcept {
    +  _position = target_position;
    +}
    +
    +simdjson_inline bool token_iterator::operator==(const token_iterator &other) const noexcept {
    +  return _position == other._position;
    +}
    +simdjson_inline bool token_iterator::operator!=(const token_iterator &other) const noexcept {
    +  return _position != other._position;
    +}
    +simdjson_inline bool token_iterator::operator>(const token_iterator &other) const noexcept {
    +  return _position > other._position;
    +}
    +simdjson_inline bool token_iterator::operator>=(const token_iterator &other) const noexcept {
    +  return _position >= other._position;
    +}
    +simdjson_inline bool token_iterator::operator<(const token_iterator &other) const noexcept {
    +  return _position < other._position;
    +}
    +simdjson_inline bool token_iterator::operator<=(const token_iterator &other) const noexcept {
    +  return _position <= other._position;
    +}
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::token_iterator &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/token_iterator-inl.h for westmere */
    +/* including simdjson/generic/ondemand/value-inl.h for westmere: #include "simdjson/generic/ondemand/value-inl.h" */
    +/* begin file simdjson/generic/ondemand/value-inl.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +simdjson_inline value::value(const value_iterator &_iter) noexcept
    +  : iter{_iter}
    +{
    +}
    +simdjson_inline value value::start(const value_iterator &iter) noexcept {
    +  return iter;
    +}
    +simdjson_inline value value::resume(const value_iterator &iter) noexcept {
    +  return iter;
    +}
    +
    +simdjson_inline simdjson_result value::get_array() noexcept {
    +  return array::start(iter);
    +}
    +simdjson_inline simdjson_result value::get_object() noexcept {
    +  return object::start(iter);
    +}
    +simdjson_inline simdjson_result value::start_or_resume_object() noexcept {
    +  if (iter.at_start()) {
    +    return get_object();
    +  } else {
    +    return object::resume(iter);
    +  }
    +}
    +
    +simdjson_inline simdjson_result value::get_raw_json_string() noexcept {
    +  return iter.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result value::get_string(bool allow_replacement) noexcept {
    +  return iter.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code value::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  return iter.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result value::get_wobbly_string() noexcept {
    +  return iter.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result value::get_double() noexcept {
    +  return iter.get_double();
    +}
    +simdjson_inline simdjson_result value::get_double_in_string() noexcept {
    +  return iter.get_double_in_string();
    +}
    +simdjson_inline simdjson_result value::get_uint64() noexcept {
    +  return iter.get_uint64();
    +}
    +simdjson_inline simdjson_result value::get_uint64_in_string() noexcept {
    +  return iter.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result value::get_int64() noexcept {
    +  return iter.get_int64();
    +}
    +simdjson_inline simdjson_result value::get_int64_in_string() noexcept {
    +  return iter.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result value::get_bool() noexcept {
    +  return iter.get_bool();
    +}
    +simdjson_inline simdjson_result value::is_null() noexcept {
    +  return iter.is_null();
    +}
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_array(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_object(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_raw_json_string(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_string(false); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_number(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_double(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_uint64(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_int64(); }
    +template<> simdjson_inline simdjson_result value::get() noexcept { return get_bool(); }
    +
    +template simdjson_inline error_code value::get(T &out) noexcept {
    +  return get().get(out);
    +}
    +
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline value::operator array() noexcept(false) {
    +  return get_array();
    +}
    +simdjson_inline value::operator object() noexcept(false) {
    +  return get_object();
    +}
    +simdjson_inline value::operator uint64_t() noexcept(false) {
    +  return get_uint64();
    +}
    +simdjson_inline value::operator int64_t() noexcept(false) {
    +  return get_int64();
    +}
    +simdjson_inline value::operator double() noexcept(false) {
    +  return get_double();
    +}
    +simdjson_inline value::operator std::string_view() noexcept(false) {
    +  return get_string(false);
    +}
    +simdjson_inline value::operator raw_json_string() noexcept(false) {
    +  return get_raw_json_string();
    +}
    +simdjson_inline value::operator bool() noexcept(false) {
    +  return get_bool();
    +}
    +#endif
    +
    +simdjson_inline simdjson_result value::begin() & noexcept {
    +  return get_array().begin();
    +}
    +simdjson_inline simdjson_result value::end() & noexcept {
    +  return {};
    +}
    +simdjson_inline simdjson_result value::count_elements() & noexcept {
    +  simdjson_result answer;
    +  auto a = get_array();
    +  answer = a.count_elements();
    +  // count_elements leaves you pointing inside the array, at the first element.
    +  // We need to move back so that the user can create a new array (which requires that
    +  // we point at '[').
    +  iter.move_at_start();
    +  return answer;
    +}
    +simdjson_inline simdjson_result value::count_fields() & noexcept {
    +  simdjson_result answer;
    +  auto a = get_object();
    +  answer = a.count_fields();
    +  iter.move_at_start();
    +  return answer;
    +}
    +simdjson_inline simdjson_result value::at(size_t index) noexcept {
    +  auto a = get_array();
    +  return a.at(index);
    +}
    +
    +simdjson_inline simdjson_result value::find_field(std::string_view key) noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +simdjson_inline simdjson_result value::find_field(const char *key) noexcept {
    +  return start_or_resume_object().find_field(key);
    +}
    +
    +simdjson_inline simdjson_result value::find_field_unordered(std::string_view key) noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result value::find_field_unordered(const char *key) noexcept {
    +  return start_or_resume_object().find_field_unordered(key);
    +}
    +
    +simdjson_inline simdjson_result value::operator[](std::string_view key) noexcept {
    +  return start_or_resume_object()[key];
    +}
    +simdjson_inline simdjson_result value::operator[](const char *key) noexcept {
    +  return start_or_resume_object()[key];
    +}
    +
    +simdjson_inline simdjson_result value::type() noexcept {
    +  return iter.type();
    +}
    +
    +simdjson_inline simdjson_result value::is_scalar() noexcept {
    +  json_type this_type;
    +  auto error = type().get(this_type);
    +  if(error) { return error; }
    +  return ! ((this_type == json_type::array) || (this_type == json_type::object));
    +}
    +
    +simdjson_inline bool value::is_negative() noexcept {
    +  return iter.is_negative();
    +}
    +
    +simdjson_inline simdjson_result value::is_integer() noexcept {
    +  return iter.is_integer();
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value::get_number_type() noexcept {
    +  return iter.get_number_type();
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value::get_number() noexcept {
    +  return iter.get_number();
    +}
    +
    +simdjson_inline std::string_view value::raw_json_token() noexcept {
    +  return std::string_view(reinterpret_cast(iter.peek_start()), iter.peek_start_length());
    +}
    +
    +simdjson_inline simdjson_result value::raw_json() noexcept {
    +  json_type t;
    +  SIMDJSON_TRY(type().get(t));
    +  switch (t)
    +  {
    +    case json_type::array: {
    +      ondemand::array array;
    +      SIMDJSON_TRY(get_array().get(array));
    +      return array.raw_json();
    +    }
    +    case json_type::object: {
    +      ondemand::object object;
    +      SIMDJSON_TRY(get_object().get(object));
    +      return object.raw_json();
    +    }
    +    default:
    +      return raw_json_token();
    +  }
    +}
    +
    +simdjson_inline simdjson_result value::current_location() noexcept {
    +  return iter.json_iter().current_location();
    +}
    +
    +simdjson_inline int32_t value::current_depth() const noexcept{
    +  return iter.json_iter().depth();
    +}
    +
    +simdjson_inline simdjson_result value::at_pointer(std::string_view json_pointer) noexcept {
    +  json_type t;
    +  SIMDJSON_TRY(type().get(t));
    +  switch (t)
    +  {
    +    case json_type::array:
    +      return (*this).get_array().at_pointer(json_pointer);
    +    case json_type::object:
    +      return (*this).get_object().at_pointer(json_pointer);
    +    default:
    +      return INVALID_JSON_POINTER;
    +  }
    +}
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(
    +  westmere::ondemand::value &&value
    +) noexcept :
    +    implementation_simdjson_result_base(
    +      std::forward(value)
    +    )
    +{
    +}
    +simdjson_inline simdjson_result::simdjson_result(
    +  error_code error
    +) noexcept :
    +    implementation_simdjson_result_base(error)
    +{
    +}
    +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_elements();
    +}
    +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept {
    +  if (error()) { return error(); }
    +  return first.count_fields();
    +}
    +simdjson_inline simdjson_result simdjson_result::at(size_t index) noexcept {
    +  if (error()) { return error(); }
    +  return first.at(index);
    +}
    +simdjson_inline simdjson_result simdjson_result::begin() & noexcept {
    +  if (error()) { return error(); }
    +  return first.begin();
    +}
    +simdjson_inline simdjson_result simdjson_result::end() & noexcept {
    +  if (error()) { return error(); }
    +  return {};
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field(key);
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) noexcept {
    +  if (error()) { return error(); }
    +  return first.find_field_unordered(key);
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) noexcept {
    +  if (error()) { return error(); }
    +  return first[key];
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::get_array() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_array();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_object() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_object();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_uint64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_int64_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_double_in_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(allow_replacement);
    +}
    +template 
    +simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  if (error()) { return error(); }
    +  return first.get_string(receiver, allow_replacement);
    +}
    +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_wobbly_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_raw_json_string();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_bool();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_null() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_null();
    +}
    +
    +template simdjson_inline simdjson_result simdjson_result::get() noexcept {
    +  if (error()) { return error(); }
    +  return first.get();
    +}
    +template simdjson_inline error_code simdjson_result::get(T &out) noexcept {
    +  if (error()) { return error(); }
    +  return first.get(out);
    +}
    +
    +template<> simdjson_inline simdjson_result simdjson_result::get() noexcept  {
    +  if (error()) { return error(); }
    +  return std::move(first);
    +}
    +template<> simdjson_inline error_code simdjson_result::get(westmere::ondemand::value &out) noexcept {
    +  if (error()) { return error(); }
    +  out = first;
    +  return SUCCESS;
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::type() noexcept {
    +  if (error()) { return error(); }
    +  return first.type();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_scalar();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_negative() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_negative();
    +}
    +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept {
    +  if (error()) { return error(); }
    +  return first.is_integer();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number_type();
    +}
    +simdjson_inline simdjson_result simdjson_result::get_number() noexcept {
    +  if (error()) { return error(); }
    +  return first.get_number();
    +}
    +#if SIMDJSON_EXCEPTIONS
    +simdjson_inline simdjson_result::operator westmere::ondemand::array() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator westmere::ondemand::object() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator int64_t() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator double() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator westmere::ondemand::raw_json_string() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +simdjson_inline simdjson_result::operator bool() noexcept(false) {
    +  if (error()) { throw simdjson_error(error()); }
    +  return first;
    +}
    +#endif
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json_token();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::raw_json() noexcept {
    +  if (error()) { return error(); }
    +  return first.raw_json();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::current_location() noexcept {
    +  if (error()) { return error(); }
    +  return first.current_location();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::current_depth() const noexcept {
    +  if (error()) { return error(); }
    +  return first.current_depth();
    +}
    +
    +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept {
    +  if (error()) { return error(); }
    +  return first.at_pointer(json_pointer);
    +}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H
    +/* end file simdjson/generic/ondemand/value-inl.h for westmere */
    +/* including simdjson/generic/ondemand/value_iterator-inl.h for westmere: #include "simdjson/generic/ondemand/value_iterator-inl.h" */
    +/* begin file simdjson/generic/ondemand/value_iterator-inl.h for westmere */
    +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H
    +
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/atomparsing.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/numberparsing.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string-inl.h" */
    +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +namespace simdjson {
    +namespace westmere {
    +namespace ondemand {
    +
    +simdjson_inline value_iterator::value_iterator(
    +  json_iterator *json_iter,
    +  depth_t depth,
    +  token_position start_position
    +) noexcept : _json_iter{json_iter}, _depth{depth}, _start_position{start_position}
    +{
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_object() noexcept {
    +  SIMDJSON_TRY( start_container('{', "Not an object", "object") );
    +  return started_object();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_object() noexcept {
    +  SIMDJSON_TRY( start_container('{', "Not an object", "object") );
    +  return started_root_object();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_object() noexcept {
    +  assert_at_container_start();
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  _json_iter->set_start_position(_depth, start_position());
    +#endif
    +  if (*_json_iter->peek() == '}') {
    +    logger::log_value(*_json_iter, "empty object");
    +    _json_iter->return_current_and_advance();
    +    end_container();
    +    return false;
    +  }
    +  return true;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::check_root_object() noexcept {
    +  // When in streaming mode, we cannot expect peek_last() to be the last structural element of the
    +  // current document. It only works in the normal mode where we have indexed a single document.
    +  // Note that adding a check for 'streaming' is not expensive since we only have at most
    +  // one root element.
    +  if ( ! _json_iter->streaming() ) {
    +    // The following lines do not fully protect against garbage content within the
    +    // object: e.g., `{"a":2} foo }`. Users concerned with garbage content should
    +    // call `at_end()` on the document instance at the end of the processing to
    +    // ensure that the processing has finished at the end.
    +    //
    +    if (*_json_iter->peek_last() != '}') {
    +      _json_iter->abandon();
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing } at end");
    +    }
    +    // If the last character is } *and* the first gibberish character is also '}'
    +    // then on-demand could accidentally go over. So we need additional checks.
    +    // https://github.com/simdjson/simdjson/issues/1834
    +    // Checking that the document is balanced requires a full scan which is potentially
    +    // expensive, but it only happens in edge cases where the first padding character is
    +    // a closing bracket.
    +    if ((*_json_iter->peek(_json_iter->end_position()) == '}') && (!_json_iter->balanced())) {
    +      _json_iter->abandon();
    +      // The exact error would require more work. It will typically be an unclosed object.
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "the document is unbalanced");
    +    }
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_object() noexcept {
    +  auto error = check_root_object();
    +  if(error) { return error; }
    +  return started_object();
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::end_container() noexcept {
    +#if SIMDJSON_CHECK_EOF
    +    if (depth() > 1 && at_end()) { return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing parent ] or }"); }
    +    // if (depth() <= 1 && !at_end()) { return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing [ or { at start"); }
    +#endif // SIMDJSON_CHECK_EOF
    +    _json_iter->ascend_to(depth()-1);
    +    return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_field() noexcept {
    +  assert_at_next();
    +
    +  // It's illegal to call this unless there are more tokens: anything that ends in } or ] is
    +  // obligated to verify there are more tokens if they are not the top level.
    +  switch (*_json_iter->return_current_and_advance()) {
    +    case '}':
    +      logger::log_end_value(*_json_iter, "object");
    +      SIMDJSON_TRY( end_container() );
    +      return false;
    +    case ',':
    +      return true;
    +    default:
    +      return report_error(TAPE_ERROR, "Missing comma between object fields");
    +  }
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::find_field_raw(const std::string_view key) noexcept {
    +  error_code error;
    +  bool has_value;
    +  //
    +  // Initially, the object can be in one of a few different places:
    +  //
    +  // 1. The start of the object, at the first field:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //      ^ (depth 2, index 1)
    +  //    ```
    +  if (at_first_field()) {
    +    has_value = true;
    +
    +  //
    +  // 2. When a previous search did not yield a value or the object is empty:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                     ^ (depth 0)
    +  //    { }
    +  //        ^ (depth 0, index 2)
    +  //    ```
    +  //
    +  } else if (!is_open()) {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    // If we're past the end of the object, we're being iterated out of order.
    +    // Note: this isn't perfect detection. It's possible the user is inside some other object; if so,
    +    // this object iterator will blithely scan that object for fields.
    +    if (_json_iter->depth() < depth() - 1) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +    return false;
    +
    +  // 3. When a previous search found a field or an iterator yielded a value:
    +  //
    +  //    ```
    +  //    // When a field was not fully consumed (or not even touched at all)
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //           ^ (depth 2)
    +  //    // When a field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                   ^ (depth 1)
    +  //    // When the last field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                   ^ (depth 1)
    +  //    ```
    +  //
    +  } else {
    +    if ((error = skip_child() )) { abandon(); return error; }
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    if (_json_iter->start_position(_depth) != start_position()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  }
    +  while (has_value) {
    +    // Get the key and colon, stopping at the value.
    +    raw_json_string actual_key;
    +    // size_t max_key_length = _json_iter->peek_length() - 2; // -2 for the two quotes
    +    // Note: _json_iter->peek_length() - 2 might overflow if _json_iter->peek_length() < 2.
    +    // field_key() advances the pointer and checks that '"' is found (corresponding to a key).
    +    // The depth is left unchanged by field_key().
    +    if ((error = field_key().get(actual_key) )) { abandon(); return error; };
    +    // field_value() will advance and check that we find a ':' separating the
    +    // key and the value. It will also increment the depth by one.
    +    if ((error = field_value() )) { abandon(); return error; }
    +    // If it matches, stop and return
    +    // We could do it this way if we wanted to allow arbitrary
    +    // key content (including escaped quotes).
    +    //if (actual_key.unsafe_is_equal(max_key_length, key)) {
    +    // Instead we do the following which may trigger buffer overruns if the
    +    // user provides an adversarial key (containing a well placed unescaped quote
    +    // character and being longer than the number of bytes remaining in the JSON
    +    // input).
    +    if (actual_key.unsafe_is_equal(key)) {
    +      logger::log_event(*this, "match", key, -2);
    +      // If we return here, then we return while pointing at the ':' that we just checked.
    +      return true;
    +    }
    +
    +    // No match: skip the value and see if , or } is next
    +    logger::log_event(*this, "no match", key, -2);
    +    // The call to skip_child is meant to skip over the value corresponding to the key.
    +    // After skip_child(), we are right before the next comma (',') or the final brace ('}').
    +    SIMDJSON_TRY( skip_child() ); // Skip the value entirely
    +    // The has_next_field() advances the pointer and check that either ',' or '}' is found.
    +    // It returns true if ',' is found, false otherwise. If anything other than ',' or '}' is found,
    +    // then we are in error and we abort.
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +  }
    +
    +  // If the loop ended, we're out of fields to look at.
    +  return false;
    +}
    +
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::find_field_unordered_raw(const std::string_view key) noexcept {
    +  /**
    +   * When find_field_unordered_raw is called, we can either be pointing at the
    +   * first key, pointing outside (at the closing brace) or if a key was matched
    +   * we can be either pointing right afterthe ':' right before the value (that we need skip),
    +   * or we may have consumed the value and we might be at a comma or at the
    +   * final brace (ready for a call to has_next_field()).
    +   */
    +  error_code error;
    +  bool has_value;
    +
    +  // First, we scan from that point to the end.
    +  // If we don't find a match, we may loop back around, and scan from the beginning to that point.
    +  token_position search_start = _json_iter->position();
    +
    +  // We want to know whether we need to go back to the beginning.
    +  bool at_first = at_first_field();
    +  ///////////////
    +  // Initially, the object can be in one of a few different places:
    +  //
    +  // 1. At the first key:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //      ^ (depth 2, index 1)
    +  //    ```
    +  //
    +  if (at_first) {
    +    has_value = true;
    +
    +  // 2. When a previous search did not yield a value or the object is empty:
    +  //
    +  //    ```
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                     ^ (depth 0)
    +  //    { }
    +  //        ^ (depth 0, index 2)
    +  //    ```
    +  //
    +  } else if (!is_open()) {
    +
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    // If we're past the end of the object, we're being iterated out of order.
    +    // Note: this isn't perfect detection. It's possible the user is inside some other object; if so,
    +    // this object iterator will blithely scan that object for fields.
    +    if (_json_iter->depth() < depth() - 1) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +    SIMDJSON_TRY(reset_object().get(has_value));
    +    at_first = true;
    +  // 3. When a previous search found a field or an iterator yielded a value:
    +  //
    +  //    ```
    +  //    // When a field was not fully consumed (or not even touched at all)
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //           ^ (depth 2)
    +  //    // When a field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                   ^ (depth 1)
    +  //    // When the last field was fully consumed
    +  //    { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                   ^ (depth 1)
    +  //    ```
    +  //
    +  } else {
    +    // If someone queried a key but they not did access the value, then we are left pointing
    +    // at the ':' and we need to move forward through the value... If the value was
    +    // processed then skip_child() does not move the iterator (but may adjust the depth).
    +    if ((error = skip_child() )) { abandon(); return error; }
    +    search_start = _json_iter->position();
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    if (_json_iter->start_position(_depth) != start_position()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +  }
    +
    +  // After initial processing, we will be in one of two states:
    +  //
    +  // ```
    +  // // At the beginning of a field
    +  // { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //   ^ (depth 1)
    +  // { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                  ^ (depth 1)
    +  // // At the end of the object
    +  // { "a": [ 1, 2 ], "b": [ 3, 4 ] }
    +  //                                  ^ (depth 0)
    +  // ```
    +  //
    +  // Next, we find a match starting from the current position.
    +  while (has_value) {
    +    SIMDJSON_ASSUME( _json_iter->_depth == _depth ); // We must be at the start of a field
    +
    +    // Get the key and colon, stopping at the value.
    +    raw_json_string actual_key;
    +    // size_t max_key_length = _json_iter->peek_length() - 2; // -2 for the two quotes
    +    // Note: _json_iter->peek_length() - 2 might overflow if _json_iter->peek_length() < 2.
    +    // field_key() advances the pointer and checks that '"' is found (corresponding to a key).
    +    // The depth is left unchanged by field_key().
    +    if ((error = field_key().get(actual_key) )) { abandon(); return error; };
    +    // field_value() will advance and check that we find a ':' separating the
    +    // key and the value. It will also increment the depth by one.
    +    if ((error = field_value() )) { abandon(); return error; }
    +
    +    // If it matches, stop and return
    +    // We could do it this way if we wanted to allow arbitrary
    +    // key content (including escaped quotes).
    +    // if (actual_key.unsafe_is_equal(max_key_length, key)) {
    +    // Instead we do the following which may trigger buffer overruns if the
    +    // user provides an adversarial key (containing a well placed unescaped quote
    +    // character and being longer than the number of bytes remaining in the JSON
    +    // input).
    +    if (actual_key.unsafe_is_equal(key)) {
    +      logger::log_event(*this, "match", key, -2);
    +      // If we return here, then we return while pointing at the ':' that we just checked.
    +      return true;
    +    }
    +
    +    // No match: skip the value and see if , or } is next
    +    logger::log_event(*this, "no match", key, -2);
    +    // The call to skip_child is meant to skip over the value corresponding to the key.
    +    // After skip_child(), we are right before the next comma (',') or the final brace ('}').
    +    SIMDJSON_TRY( skip_child() );
    +    // The has_next_field() advances the pointer and check that either ',' or '}' is found.
    +    // It returns true if ',' is found, false otherwise. If anything other than ',' or '}' is found,
    +    // then we are in error and we abort.
    +    if ((error = has_next_field().get(has_value) )) { abandon(); return error; }
    +  }
    +  // Performance note: it maybe wasteful to rewind to the beginning when there might be
    +  // no other query following. Indeed, it would require reskipping the whole object.
    +  // Instead, you can just stay where you are. If there is a new query, there is always time
    +  // to rewind.
    +  if(at_first) { return false; }
    +
    +  // If we reach the end without finding a match, search the rest of the fields starting at the
    +  // beginning of the object.
    +  // (We have already run through the object before, so we've already validated its structure. We
    +  // don't check errors in this bit.)
    +  SIMDJSON_TRY(reset_object().get(has_value));
    +  while (true) {
    +    SIMDJSON_ASSUME(has_value); // we should reach search_start before ever reaching the end of the object
    +    SIMDJSON_ASSUME( _json_iter->_depth == _depth ); // We must be at the start of a field
    +
    +    // Get the key and colon, stopping at the value.
    +    raw_json_string actual_key;
    +    // size_t max_key_length = _json_iter->peek_length() - 2; // -2 for the two quotes
    +    // Note: _json_iter->peek_length() - 2 might overflow if _json_iter->peek_length() < 2.
    +    // field_key() advances the pointer and checks that '"' is found (corresponding to a key).
    +    // The depth is left unchanged by field_key().
    +    error = field_key().get(actual_key); SIMDJSON_ASSUME(!error);
    +    // field_value() will advance and check that we find a ':' separating the
    +    // key and the value.  It will also increment the depth by one.
    +    error = field_value(); SIMDJSON_ASSUME(!error);
    +
    +    // If it matches, stop and return
    +    // We could do it this way if we wanted to allow arbitrary
    +    // key content (including escaped quotes).
    +    // if (actual_key.unsafe_is_equal(max_key_length, key)) {
    +    // Instead we do the following which may trigger buffer overruns if the
    +    // user provides an adversarial key (containing a well placed unescaped quote
    +    // character and being longer than the number of bytes remaining in the JSON
    +    // input).
    +    if (actual_key.unsafe_is_equal(key)) {
    +      logger::log_event(*this, "match", key, -2);
    +      // If we return here, then we return while pointing at the ':' that we just checked.
    +      return true;
    +    }
    +
    +    // No match: skip the value and see if , or } is next
    +    logger::log_event(*this, "no match", key, -2);
    +    // The call to skip_child is meant to skip over the value corresponding to the key.
    +    // After skip_child(), we are right before the next comma (',') or the final brace ('}').
    +    SIMDJSON_TRY( skip_child() );
    +    // If we reached the end of the key-value pair we started from, then we know
    +    // that the key is not there so we return false. We are either right before
    +    // the next comma or the final brace.
    +    if(_json_iter->position() == search_start) { return false; }
    +    // The has_next_field() advances the pointer and check that either ',' or '}' is found.
    +    // It returns true if ',' is found, false otherwise. If anything other than ',' or '}' is found,
    +    // then we are in error and we abort.
    +    error = has_next_field().get(has_value); SIMDJSON_ASSUME(!error);
    +    // If we make the mistake of exiting here, then we could be left pointing at a key
    +    // in the middle of an object. That's not an allowable state.
    +  }
    +  // If the loop ended, we're out of fields to look at. The program should
    +  // never reach this point.
    +  return false;
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::field_key() noexcept {
    +  assert_at_next();
    +
    +  const uint8_t *key = _json_iter->return_current_and_advance();
    +  if (*(key++) != '"') { return report_error(TAPE_ERROR, "Object key is not a string"); }
    +  return raw_json_string(key);
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::field_value() noexcept {
    +  assert_at_next();
    +
    +  if (*_json_iter->return_current_and_advance() != ':') { return report_error(TAPE_ERROR, "Missing colon in object field"); }
    +  _json_iter->descend_to(depth()+1);
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_array() noexcept {
    +  SIMDJSON_TRY( start_container('[', "Not an array", "array") );
    +  return started_array();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_array() noexcept {
    +  SIMDJSON_TRY( start_container('[', "Not an array", "array") );
    +  return started_root_array();
    +}
    +
    +inline std::string value_iterator::to_string() const noexcept {
    +  auto answer = std::string("value_iterator [ depth : ") + std::to_string(_depth) + std::string(", ");
    +  if(_json_iter != nullptr) { answer +=  _json_iter->to_string(); }
    +  answer += std::string(" ]");
    +  return answer;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_array() noexcept {
    +  assert_at_container_start();
    +  if (*_json_iter->peek() == ']') {
    +    logger::log_value(*_json_iter, "empty array");
    +    _json_iter->return_current_and_advance();
    +    SIMDJSON_TRY( end_container() );
    +    return false;
    +  }
    +  _json_iter->descend_to(depth()+1);
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +  _json_iter->set_start_position(_depth, start_position());
    +#endif
    +  return true;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::check_root_array() noexcept {
    +  // When in streaming mode, we cannot expect peek_last() to be the last structural element of the
    +  // current document. It only works in the normal mode where we have indexed a single document.
    +  // Note that adding a check for 'streaming' is not expensive since we only have at most
    +  // one root element.
    +  if ( ! _json_iter->streaming() ) {
    +    // The following lines do not fully protect against garbage content within the
    +    // array: e.g., `[1, 2] foo]`. Users concerned with garbage content should
    +    // also call `at_end()` on the document instance at the end of the processing to
    +    // ensure that the processing has finished at the end.
    +    //
    +    if (*_json_iter->peek_last() != ']') {
    +      _json_iter->abandon();
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "missing ] at end");
    +    }
    +    // If the last character is ] *and* the first gibberish character is also ']'
    +    // then on-demand could accidentally go over. So we need additional checks.
    +    // https://github.com/simdjson/simdjson/issues/1834
    +    // Checking that the document is balanced requires a full scan which is potentially
    +    // expensive, but it only happens in edge cases where the first padding character is
    +    // a closing bracket.
    +    if ((*_json_iter->peek(_json_iter->end_position()) == ']') && (!_json_iter->balanced())) {
    +      _json_iter->abandon();
    +      // The exact error would require more work. It will typically be an unclosed array.
    +      return report_error(INCOMPLETE_ARRAY_OR_OBJECT, "the document is unbalanced");
    +    }
    +  }
    +  return SUCCESS;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_array() noexcept {
    +  auto error = check_root_array();
    +  if (error) { return error; }
    +  return started_array();
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_element() noexcept {
    +  assert_at_next();
    +
    +  logger::log_event(*this, "has_next_element");
    +  switch (*_json_iter->return_current_and_advance()) {
    +    case ']':
    +      logger::log_end_value(*_json_iter, "array");
    +      SIMDJSON_TRY( end_container() );
    +      return false;
    +    case ',':
    +      _json_iter->descend_to(depth()+1);
    +      return true;
    +    default:
    +      return report_error(TAPE_ERROR, "Missing comma between array elements");
    +  }
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::parse_bool(const uint8_t *json) const noexcept {
    +  auto not_true = atomparsing::str4ncmp(json, "true");
    +  auto not_false = atomparsing::str4ncmp(json, "fals") | (json[4] ^ 'e');
    +  bool error = (not_true && not_false) || jsoncharutils::is_not_structural_or_whitespace(json[not_true ? 5 : 4]);
    +  if (error) { return incorrect_type_error("Not a boolean"); }
    +  return simdjson_result(!not_true);
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::parse_null(const uint8_t *json) const noexcept {
    +  bool is_null_string = !atomparsing::str4ncmp(json, "null") && jsoncharutils::is_structural_or_whitespace(json[4]);
    +  // if we start with 'n', we must be a null
    +  if(!is_null_string && json[0]=='n') { return incorrect_type_error("Not a null but starts with n"); }
    +  return is_null_string;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_string(bool allow_replacement) noexcept {
    +  return get_raw_json_string().unescape(json_iter(), allow_replacement);
    +}
    +template 
    +simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept {
    +  std::string_view content;
    +  auto err = get_string(allow_replacement).get(content);
    +  if (err) { return err; }
    +  receiver = content;
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_wobbly_string() noexcept {
    +  return get_raw_json_string().unescape_wobbly(json_iter());
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_raw_json_string() noexcept {
    +  auto json = peek_scalar("string");
    +  if (*json != '"') { return incorrect_type_error("Not a string"); }
    +  advance_scalar("string");
    +  return raw_json_string(json+1);
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_uint64() noexcept {
    +  auto result = numberparsing::parse_unsigned(peek_non_root_scalar("uint64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("uint64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_uint64_in_string() noexcept {
    +  auto result = numberparsing::parse_unsigned_in_string(peek_non_root_scalar("uint64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("uint64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_int64() noexcept {
    +  auto result = numberparsing::parse_integer(peek_non_root_scalar("int64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("int64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_int64_in_string() noexcept {
    +  auto result = numberparsing::parse_integer_in_string(peek_non_root_scalar("int64"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("int64"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_double() noexcept {
    +  auto result = numberparsing::parse_double(peek_non_root_scalar("double"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("double"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_double_in_string() noexcept {
    +  auto result = numberparsing::parse_double_in_string(peek_non_root_scalar("double"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("double"); }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_bool() noexcept {
    +  auto result = parse_bool(peek_non_root_scalar("bool"));
    +  if(result.error() == SUCCESS) { advance_non_root_scalar("bool"); }
    +  return result;
    +}
    +simdjson_inline simdjson_result value_iterator::is_null() noexcept {
    +  bool is_null_value;
    +  SIMDJSON_TRY(parse_null(peek_non_root_scalar("null")).get(is_null_value));
    +  if(is_null_value) { advance_non_root_scalar("null"); }
    +  return is_null_value;
    +}
    +simdjson_inline bool value_iterator::is_negative() noexcept {
    +  return numberparsing::is_negative(peek_non_root_scalar("numbersign"));
    +}
    +simdjson_inline bool value_iterator::is_root_negative() noexcept {
    +  return numberparsing::is_negative(peek_root_scalar("numbersign"));
    +}
    +simdjson_inline simdjson_result value_iterator::is_integer() noexcept {
    +  return numberparsing::is_integer(peek_non_root_scalar("integer"));
    +}
    +simdjson_inline simdjson_result value_iterator::get_number_type() noexcept {
    +  return numberparsing::get_number_type(peek_non_root_scalar("integer"));
    +}
    +simdjson_inline simdjson_result value_iterator::get_number() noexcept {
    +  number num;
    +  error_code error =  numberparsing::parse_number(peek_non_root_scalar("number"), num);
    +  if(error) { return error; }
    +  return num;
    +}
    +
    +simdjson_inline simdjson_result value_iterator::is_root_integer(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("is_root_integer");
    +  uint8_t tmpbuf[20+1+1]{}; // <20 digits> is the longest possible unsigned integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    return false; // if there are more than 20 characters, it cannot be represented as an integer.
    +  }
    +  auto answer = numberparsing::is_integer(tmpbuf);
    +  // If the parsing was a success, we must still check that it is
    +  // a single scalar. Note that we parse first because of cases like '[]' where
    +  // getting TRAILING_CONTENT is wrong.
    +  if(check_trailing && (answer.error() == SUCCESS) && (!_json_iter->is_single_token())) { return TRAILING_CONTENT; }
    +  return answer;
    +}
    +
    +simdjson_inline simdjson_result value_iterator::get_root_number_type(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("number");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1];
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto answer = numberparsing::get_number_type(tmpbuf);
    +  if (check_trailing && (answer.error() == SUCCESS)  && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +  return answer;
    +}
    +simdjson_inline simdjson_result value_iterator::get_root_number(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("number");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1];
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  number num;
    +  error_code error =  numberparsing::parse_number(tmpbuf, num);
    +  if(error) { return error; }
    +  if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +  advance_root_scalar("number");
    +  return num;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_string(bool check_trailing, bool allow_replacement) noexcept {
    +  return get_root_raw_json_string(check_trailing).unescape(json_iter(), allow_replacement);
    +}
    +template 
    +simdjson_warn_unused simdjson_inline error_code value_iterator::get_root_string(string_type& receiver, bool check_trailing, bool allow_replacement) noexcept {
    +  std::string_view content;
    +  auto err = get_root_string(check_trailing, allow_replacement).get(content);
    +  if (err) { return err; }
    +  receiver = content;
    +  return SUCCESS;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_wobbly_string(bool check_trailing) noexcept {
    +  return get_root_raw_json_string(check_trailing).unescape_wobbly(json_iter());
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_raw_json_string(bool check_trailing) noexcept {
    +  auto json = peek_scalar("string");
    +  if (*json != '"') { return incorrect_type_error("Not a string"); }
    +  if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +  advance_scalar("string");
    +  return raw_json_string(json+1);
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_uint64(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("uint64");
    +  uint8_t tmpbuf[20+1+1]{}; // <20 digits> is the longest possible unsigned integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_unsigned(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("uint64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_uint64_in_string(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("uint64");
    +  uint8_t tmpbuf[20+1+1]{}; // <20 digits> is the longest possible unsigned integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_unsigned_in_string(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("uint64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_int64(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("int64");
    +  uint8_t tmpbuf[20+1+1]; // -<19 digits> is the longest possible integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +
    +  auto result = numberparsing::parse_integer(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("int64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_int64_in_string(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("int64");
    +  uint8_t tmpbuf[20+1+1]; // -<19 digits> is the longest possible integer
    +  tmpbuf[20+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 20+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 20 characters");
    +    return NUMBER_ERROR;
    +  }
    +
    +  auto result = numberparsing::parse_integer_in_string(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("int64");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_double(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("double");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination.
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_double(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("double");
    +  }
    +  return result;
    +}
    +
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_double_in_string(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("double");
    +  // Per https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/,
    +  // 1074 is the maximum number of significant fractional digits. Add 8 more digits for the biggest
    +  // number: -0.e-308.
    +  uint8_t tmpbuf[1074+8+1+1]; // +1 for null termination.
    +  tmpbuf[1074+8+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 1074+8+1)) {
    +    logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters");
    +    return NUMBER_ERROR;
    +  }
    +  auto result = numberparsing::parse_double_in_string(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("double");
    +  }
    +  return result;
    +}
    +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_bool(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("bool");
    +  uint8_t tmpbuf[5+1+1]; // +1 for null termination
    +  tmpbuf[5+1] = '\0'; // make sure that buffer is always null terminated.
    +  if (!_json_iter->copy_to_buffer(json, max_len, tmpbuf, 5+1)) { return incorrect_type_error("Not a boolean"); }
    +  auto result = parse_bool(tmpbuf);
    +  if(result.error() == SUCCESS) {
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("bool");
    +  }
    +  return result;
    +}
    +simdjson_inline simdjson_result value_iterator::is_root_null(bool check_trailing) noexcept {
    +  auto max_len = peek_start_length();
    +  auto json = peek_root_scalar("null");
    +  bool result = (max_len >= 4 && !atomparsing::str4ncmp(json, "null") &&
    +         (max_len == 4 || jsoncharutils::is_structural_or_whitespace(json[4])));
    +  if(result) { // we have something that looks like a null.
    +    if (check_trailing && !_json_iter->is_single_token()) { return TRAILING_CONTENT; }
    +    advance_root_scalar("null");
    +  }
    +  return result;
    +}
    +
    +simdjson_warn_unused simdjson_inline error_code value_iterator::skip_child() noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth >= _depth );
    +
    +  return _json_iter->skip_child(depth());
    +}
    +
    +simdjson_inline value_iterator value_iterator::child() const noexcept {
    +  assert_at_child();
    +  return { _json_iter, depth()+1, _json_iter->token.position() };
    +}
    +
    +// GCC 7 warns when the first line of this function is inlined away into oblivion due to the caller
    +// relating depth and iterator depth, which is a desired effect. It does not happen if is_open is
    +// marked non-inline.
    +SIMDJSON_PUSH_DISABLE_WARNINGS
    +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING
    +simdjson_inline bool value_iterator::is_open() const noexcept {
    +  return _json_iter->depth() >= depth();
    +}
    +SIMDJSON_POP_DISABLE_WARNINGS
    +
    +simdjson_inline bool value_iterator::at_end() const noexcept {
    +  return _json_iter->at_end();
    +}
    +
    +simdjson_inline bool value_iterator::at_start() const noexcept {
    +  return _json_iter->token.position() == start_position();
    +}
    +
    +simdjson_inline bool value_iterator::at_first_field() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  return _json_iter->token.position() == start_position() + 1;
    +}
    +
    +simdjson_inline void value_iterator::abandon() noexcept {
    +  _json_iter->abandon();
    +}
    +
    +simdjson_warn_unused simdjson_inline depth_t value_iterator::depth() const noexcept {
    +  return _depth;
    +}
    +simdjson_warn_unused simdjson_inline error_code value_iterator::error() const noexcept {
    +  return _json_iter->error;
    +}
    +simdjson_warn_unused simdjson_inline uint8_t *&value_iterator::string_buf_loc() noexcept {
    +  return _json_iter->string_buf_loc();
    +}
    +simdjson_warn_unused simdjson_inline const json_iterator &value_iterator::json_iter() const noexcept {
    +  return *_json_iter;
    +}
    +simdjson_warn_unused simdjson_inline json_iterator &value_iterator::json_iter() noexcept {
    +  return *_json_iter;
    +}
    +
    +simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept {
    +  return _json_iter->peek(start_position());
    +}
    +simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept {
    +  return _json_iter->peek_length(start_position());
    +}
    +
    +simdjson_inline const uint8_t *value_iterator::peek_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  // If we're not at the position anymore, we don't want to advance the cursor.
    +  if (!is_at_start()) { return peek_start(); }
    +
    +  // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value.
    +  assert_at_start();
    +  return _json_iter->peek();
    +}
    +
    +simdjson_inline void value_iterator::advance_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  // If we're not at the position anymore, we don't want to advance the cursor.
    +  if (!is_at_start()) { return; }
    +
    +  // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value.
    +  assert_at_start();
    +  _json_iter->return_current_and_advance();
    +  _json_iter->ascend_to(depth()-1);
    +}
    +
    +simdjson_inline error_code value_iterator::start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept {
    +  logger::log_start_value(*_json_iter, start_position(), depth(), type);
    +  // If we're not at the position anymore, we don't want to advance the cursor.
    +  const uint8_t *json;
    +  if (!is_at_start()) {
    +#if SIMDJSON_DEVELOPMENT_CHECKS
    +    if (!is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; }
    +#endif
    +    json = peek_start();
    +    if (*json != start_char) { return incorrect_type_error(incorrect_type_message); }
    +  } else {
    +    assert_at_start();
    +    /**
    +     * We should be prudent. Let us peek. If it is not the right type, we
    +     * return an error. Only once we have determined that we have the right
    +     * type are we allowed to advance!
    +     */
    +    json = _json_iter->peek();
    +    if (*json != start_char) { return incorrect_type_error(incorrect_type_message); }
    +    _json_iter->return_current_and_advance();
    +  }
    +
    +
    +  return SUCCESS;
    +}
    +
    +
    +simdjson_inline const uint8_t *value_iterator::peek_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return peek_start(); }
    +
    +  assert_at_root();
    +  return _json_iter->peek();
    +}
    +simdjson_inline const uint8_t *value_iterator::peek_non_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return peek_start(); }
    +
    +  assert_at_non_root_start();
    +  return _json_iter->peek();
    +}
    +
    +simdjson_inline void value_iterator::advance_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return; }
    +
    +  assert_at_root();
    +  _json_iter->return_current_and_advance();
    +  _json_iter->ascend_to(depth()-1);
    +}
    +simdjson_inline void value_iterator::advance_non_root_scalar(const char *type) noexcept {
    +  logger::log_value(*_json_iter, start_position(), depth(), type);
    +  if (!is_at_start()) { return; }
    +
    +  assert_at_non_root_start();
    +  _json_iter->return_current_and_advance();
    +  _json_iter->ascend_to(depth()-1);
    +}
    +
    +simdjson_inline error_code value_iterator::incorrect_type_error(const char *message) const noexcept {
    +  logger::log_error(*_json_iter, start_position(), depth(), message);
    +  return INCORRECT_TYPE;
    +}
    +
    +simdjson_inline bool value_iterator::is_at_start() const noexcept {
    +  return position() == start_position();
    +}
    +
    +simdjson_inline bool value_iterator::is_at_key() const noexcept {
    +  // Keys are at the same depth as the object.
    +  // Note here that we could be safer and check that we are within an object,
    +  // but we do not.
    +  return _depth == _json_iter->_depth && *_json_iter->peek() == '"';
    +}
    +
    +simdjson_inline bool value_iterator::is_at_iterator_start() const noexcept {
    +  // We can legitimately be either at the first value ([1]), or after the array if it's empty ([]).
    +  auto delta = position() - start_position();
    +  return delta == 1 || delta == 2;
    +}
    +
    +inline void value_iterator::assert_at_start() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position == _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +inline void value_iterator::assert_at_container_start() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position == _start_position + 1 );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +inline void value_iterator::assert_at_next() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +simdjson_inline void value_iterator::move_at_start() noexcept {
    +  _json_iter->_depth = _depth;
    +  _json_iter->token.set_position(_start_position);
    +}
    +
    +simdjson_inline void value_iterator::move_at_container_start() noexcept {
    +  _json_iter->_depth = _depth;
    +  _json_iter->token.set_position(_start_position + 1);
    +}
    +
    +simdjson_inline simdjson_result value_iterator::reset_array() noexcept {
    +  if(error()) { return error(); }
    +  move_at_container_start();
    +  return started_array();
    +}
    +
    +simdjson_inline simdjson_result value_iterator::reset_object() noexcept {
    +  if(error()) { return error(); }
    +  move_at_container_start();
    +  return started_object();
    +}
    +
    +inline void value_iterator::assert_at_child() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter->token._position > _start_position );
    +  SIMDJSON_ASSUME( _json_iter->_depth == _depth + 1 );
    +  SIMDJSON_ASSUME( _depth > 0 );
    +}
    +
    +inline void value_iterator::assert_at_root() const noexcept {
    +  assert_at_start();
    +  SIMDJSON_ASSUME( _depth == 1 );
    +}
    +
    +inline void value_iterator::assert_at_non_root_start() const noexcept {
    +  assert_at_start();
    +  SIMDJSON_ASSUME( _depth > 1 );
    +}
    +
    +inline void value_iterator::assert_is_valid() const noexcept {
    +  SIMDJSON_ASSUME( _json_iter != nullptr );
    +}
    +
    +simdjson_inline bool value_iterator::is_valid() const noexcept {
    +  return _json_iter != nullptr;
    +}
    +
    +simdjson_inline simdjson_result value_iterator::type() const noexcept {
    +  switch (*peek_start()) {
    +    case '{':
    +      return json_type::object;
    +    case '[':
    +      return json_type::array;
    +    case '"':
    +      return json_type::string;
    +    case 'n':
    +      return json_type::null;
    +    case 't': case 'f':
    +      return json_type::boolean;
    +    case '-':
    +    case '0': case '1': case '2': case '3': case '4':
    +    case '5': case '6': case '7': case '8': case '9':
    +      return json_type::number;
    +    default:
    +      return TAPE_ERROR;
    +  }
    +}
    +
    +simdjson_inline token_position value_iterator::start_position() const noexcept {
    +  return _start_position;
    +}
    +
    +simdjson_inline token_position value_iterator::position() const noexcept {
    +  return _json_iter->position();
    +}
    +
    +simdjson_inline token_position value_iterator::end_position() const noexcept {
    +  return _json_iter->end_position();
    +}
    +
    +simdjson_inline token_position value_iterator::last_position() const noexcept {
    +  return _json_iter->last_position();
    +}
    +
    +simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept {
    +  return _json_iter->report_error(error, message);
    +}
    +
    +} // namespace ondemand
    +} // namespace westmere
    +} // namespace simdjson
    +
    +namespace simdjson {
    +
    +simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::value_iterator &&value) noexcept
    +    : implementation_simdjson_result_base(std::forward(value)) {}
    +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept
    +    : implementation_simdjson_result_base(error) {}
    +
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H
    +/* end file simdjson/generic/ondemand/value_iterator-inl.h for westmere */
    +/* end file simdjson/generic/ondemand/amalgamated.h for westmere */
    +/* including simdjson/westmere/end.h: #include "simdjson/westmere/end.h" */
    +/* begin file simdjson/westmere/end.h */
    +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */
    +/* amalgamation skipped (editor-only): #include "simdjson/westmere/base.h" */
    +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */
    +
    +#if !SIMDJSON_CAN_ALWAYS_RUN_WESTMERE
    +SIMDJSON_UNTARGET_REGION
    +#endif
    +
    +/* undefining SIMDJSON_IMPLEMENTATION from "westmere" */
    +#undef SIMDJSON_IMPLEMENTATION
    +/* end file simdjson/westmere/end.h */
    +
    +#endif // SIMDJSON_WESTMERE_IMPLEMENTATION_H
    +/* end file simdjson/westmere/ondemand.h */
    +#else
    +#error Unknown SIMDJSON_BUILTIN_IMPLEMENTATION
    +#endif
    +
    +/* undefining SIMDJSON_CONDITIONAL_INCLUDE */
    +#undef SIMDJSON_CONDITIONAL_INCLUDE
    +
    +namespace simdjson {
    +  /**
    +   * @copydoc simdjson::SIMDJSON_BUILTIN_IMPLEMENTATION::ondemand
    +   */
    +  namespace ondemand = SIMDJSON_BUILTIN_IMPLEMENTATION::ondemand;
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_BUILTIN_ONDEMAND_H
    +/* end file simdjson/builtin/ondemand.h */
    +
    +namespace simdjson {
    +  /**
    +   * @copydoc simdjson::builtin::ondemand
    +   */
    +  namespace ondemand = builtin::ondemand;
    +} // namespace simdjson
    +
    +#endif // SIMDJSON_ONDEMAND_H
    +/* end file simdjson/ondemand.h */
    +
    +#endif // SIMDJSON_H
    +/* end file simdjson.h */
    diff --git a/deps/simdjson/unofficial.gni b/deps/simdjson/unofficial.gni
    new file mode 100644
    index 00000000000000..d6909b95886f4d
    --- /dev/null
    +++ b/deps/simdjson/unofficial.gni
    @@ -0,0 +1,22 @@
    +# This file is used by GN for building, which is NOT the build system used for
    +# building official binaries.
    +# Please edit the gyp files if you are making changes to build system.
    +
    +# The actual configurations are put inside a template in unofficial.gni to
    +# prevent accidental edits from contributors.
    +template("simdjson_gn_build") {
    +  config("simdjson_config") {
    +    include_dirs = [ "." ]
    +  }
    +
    +  gypi_values = exec_script("../../tools/gypi_to_gn.py",
    +                            [ rebase_path("simdjson.gyp") ],
    +                            "scope",
    +                            [ "simdjson.gyp" ])
    +
    +  source_set(target_name) {
    +    forward_variables_from(invoker, "*")
    +    public_configs = [ ":simdjson_config" ]
    +    sources = gypi_values.simdjson_sources
    +  }
    +}
    diff --git a/deps/simdutf/BUILD.gn b/deps/simdutf/BUILD.gn
    new file mode 100644
    index 00000000000000..119d49456911e9
    --- /dev/null
    +++ b/deps/simdutf/BUILD.gn
    @@ -0,0 +1,14 @@
    +##############################################################################
    +#                                                                            #
    +#                       DO NOT EDIT THIS FILE!                               #
    +#                                                                            #
    +##############################################################################
    +
    +# This file is used by GN for building, which is NOT the build system used for
    +# building official binaries.
    +# Please modify the gyp files if you are making changes to build system.
    +
    +import("unofficial.gni")
    +
    +simdutf_gn_build("simdutf") {
    +}
    diff --git a/deps/simdutf/simdutf.cpp b/deps/simdutf/simdutf.cpp
    index 70b461ab550b46..dc58d9ab5c3637 100644
    --- a/deps/simdutf/simdutf.cpp
    +++ b/deps/simdutf/simdutf.cpp
    @@ -1,8 +1,6 @@
    -/* auto-generated on 2023-10-08 13:48:09 -0400. Do not edit! */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf.cpp
    +/* auto-generated on 2023-12-01 13:59:01 -0500. Do not edit! */
     /* begin file src/simdutf.cpp */
     #include "simdutf.h"
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=implementation.cpp
     /* begin file src/implementation.cpp */
     #include 
     #include 
    @@ -26,7 +24,6 @@ std::string toBinaryString(T b) {
     
     // Implementations
     // The best choice should always come first!
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/arm64.h
     /* begin file src/simdutf/arm64.h */
     #ifndef SIMDUTF_ARM64_H
     #define SIMDUTF_ARM64_H
    @@ -53,7 +50,6 @@ namespace arm64 {
     } // namespace arm64
     } // namespace simdutf
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/arm64/implementation.h
     /* begin file src/simdutf/arm64/implementation.h */
     #ifndef SIMDUTF_ARM64_IMPLEMENTATION_H
     #define SIMDUTF_ARM64_IMPLEMENTATION_H
    @@ -80,6 +76,13 @@ class implementation final : public simdutf::implementation {
       simdutf_warn_unused result validate_utf16be_with_errors(const char16_t *buf, size_t len) const noexcept final;
       simdutf_warn_unused bool validate_utf32(const char32_t *buf, size_t len) const noexcept final;
       simdutf_warn_unused result validate_utf32_with_errors(const char32_t *buf, size_t len) const noexcept final;
    +  simdutf_warn_unused size_t convert_latin1_to_utf8(const char * buf, size_t len, char* utf8_output) const noexcept final;
    +  simdutf_warn_unused size_t convert_latin1_to_utf16le(const char * buf, size_t len, char16_t* utf16_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_latin1_to_utf16be(const char * buf, size_t len, char16_t* utf16_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_latin1_to_utf32(const char * buf, size_t len, char32_t* utf32_output) const noexcept final;
    +  simdutf_warn_unused size_t convert_utf8_to_latin1(const char * buf, size_t len, char* latin1_output) const noexcept final;
    +  simdutf_warn_unused result convert_utf8_to_latin1_with_errors(const char * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_valid_utf8_to_latin1(const char * buf, size_t len, char* latin1_output) const noexcept final;
       simdutf_warn_unused size_t convert_utf8_to_utf16le(const char * buf, size_t len, char16_t* utf16_output) const noexcept final;
       simdutf_warn_unused size_t convert_utf8_to_utf16be(const char * buf, size_t len, char16_t* utf16_output) const noexcept final;
       simdutf_warn_unused result convert_utf8_to_utf16le_with_errors(const char * buf, size_t len, char16_t* utf16_output) const noexcept final;
    @@ -89,12 +92,21 @@ class implementation final : public simdutf::implementation {
       simdutf_warn_unused size_t convert_utf8_to_utf32(const char * buf, size_t len, char32_t* utf32_output) const noexcept final;
       simdutf_warn_unused result convert_utf8_to_utf32_with_errors(const char * buf, size_t len, char32_t* utf32_output) const noexcept final;
       simdutf_warn_unused size_t convert_valid_utf8_to_utf32(const char * buf, size_t len, char32_t* utf32_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_utf16le_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_utf16be_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused result convert_utf16le_to_latin1_with_errors(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused result convert_utf16be_to_latin1_with_errors(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_valid_utf16le_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_valid_utf16be_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
       simdutf_warn_unused size_t convert_utf16le_to_utf8(const char16_t * buf, size_t len, char* utf8_buffer) const noexcept final;
       simdutf_warn_unused size_t convert_utf16be_to_utf8(const char16_t * buf, size_t len, char* utf8_buffer) const noexcept final;
       simdutf_warn_unused result convert_utf16le_to_utf8_with_errors(const char16_t * buf, size_t len, char* utf8_buffer) const noexcept final;
       simdutf_warn_unused result convert_utf16be_to_utf8_with_errors(const char16_t * buf, size_t len, char* utf8_buffer) const noexcept final;
       simdutf_warn_unused size_t convert_valid_utf16le_to_utf8(const char16_t * buf, size_t len, char* utf8_buffer) const noexcept final;
       simdutf_warn_unused size_t convert_valid_utf16be_to_utf8(const char16_t * buf, size_t len, char* utf8_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_utf32_to_latin1(const char32_t * buf, size_t len, char* latin1_output) const noexcept final;
    +  simdutf_warn_unused result convert_utf32_to_latin1_with_errors(const char32_t * buf, size_t len, char* latin1_output) const noexcept final;
    +  simdutf_warn_unused size_t convert_valid_utf32_to_latin1(const char32_t * buf, size_t len, char* latin1_output) const noexcept final;
       simdutf_warn_unused size_t convert_utf32_to_utf8(const char32_t * buf, size_t len, char* utf8_buffer) const noexcept final;
       simdutf_warn_unused result convert_utf32_to_utf8_with_errors(const char32_t * buf, size_t len, char* utf8_buffer) const noexcept final;
       simdutf_warn_unused size_t convert_valid_utf32_to_utf8(const char32_t * buf, size_t len, char* utf8_buffer) const noexcept final;
    @@ -122,6 +134,13 @@ class implementation final : public simdutf::implementation {
       simdutf_warn_unused size_t utf8_length_from_utf32(const char32_t * input, size_t length) const noexcept;
       simdutf_warn_unused size_t utf16_length_from_utf32(const char32_t * input, size_t length) const noexcept;
       simdutf_warn_unused size_t utf32_length_from_utf8(const char * input, size_t length) const noexcept;
    +  simdutf_warn_unused size_t latin1_length_from_utf8(const char * input, size_t length) const noexcept;
    +  simdutf_warn_unused size_t latin1_length_from_utf16(size_t length) const noexcept;
    +  simdutf_warn_unused size_t latin1_length_from_utf32(size_t length) const noexcept;
    +  simdutf_warn_unused size_t utf32_length_from_latin1(size_t length) const noexcept;
    +  simdutf_warn_unused size_t utf16_length_from_latin1(size_t length) const noexcept;
    +  simdutf_warn_unused size_t utf8_length_from_latin1(const char * input, size_t length) const noexcept;
    +
     };
     
     } // namespace arm64
    @@ -130,14 +149,12 @@ class implementation final : public simdutf::implementation {
     #endif // SIMDUTF_ARM64_IMPLEMENTATION_H
     /* end file src/simdutf/arm64/implementation.h */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/arm64/begin.h
     /* begin file src/simdutf/arm64/begin.h */
     // redefining SIMDUTF_IMPLEMENTATION to "arm64"
     // #define SIMDUTF_IMPLEMENTATION arm64
     /* end file src/simdutf/arm64/begin.h */
     
     // Declarations
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/arm64/intrinsics.h
     /* begin file src/simdutf/arm64/intrinsics.h */
     #ifndef SIMDUTF_ARM64_INTRINSICS_H
     #define SIMDUTF_ARM64_INTRINSICS_H
    @@ -149,7 +166,6 @@ class implementation final : public simdutf::implementation {
     
     #endif //  SIMDUTF_ARM64_INTRINSICS_H
     /* end file src/simdutf/arm64/intrinsics.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/arm64/bitmanipulation.h
     /* begin file src/simdutf/arm64/bitmanipulation.h */
     #ifndef SIMDUTF_ARM64_BITMANIPULATION_H
     #define SIMDUTF_ARM64_BITMANIPULATION_H
    @@ -169,7 +185,6 @@ simdutf_really_inline int count_ones(uint64_t input_num) {
     
     #endif // SIMDUTF_ARM64_BITMANIPULATION_H
     /* end file src/simdutf/arm64/bitmanipulation.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/arm64/simd.h
     /* begin file src/simdutf/arm64/simd.h */
     #ifndef SIMDUTF_ARM64_SIMD_H
     #define SIMDUTF_ARM64_SIMD_H
    @@ -186,118 +201,53 @@ namespace simd {
     namespace {
     // Start of private section with Visual Studio workaround
     
    +#ifndef simdutf_make_uint8x16_t
    +#define simdutf_make_uint8x16_t(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, \
    +                             x13, x14, x15, x16)                                   \
    +   ([=]() {                                                                        \
    +     uint8_t array[16] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8,                    \
    +                                 x9, x10, x11, x12, x13, x14, x15, x16};           \
    +     return vld1q_u8(array);                                                       \
    +   }())
    +#endif
    +#ifndef simdutf_make_int8x16_t
    +#define simdutf_make_int8x16_t(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, \
    +                             x13, x14, x15, x16)                                  \
    +   ([=]() {                                                                       \
    +     int8_t array[16] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8,                    \
    +                                 x9, x10, x11, x12, x13, x14, x15, x16};          \
    +     return vld1q_s8(array);                                                      \
    +   }())
    +#endif
     
    -/**
    - * make_uint8x16_t initializes a SIMD register (uint8x16_t).
    - * This is needed because, incredibly, the syntax uint8x16_t x = {1,2,3...}
    - * is not recognized under Visual Studio! This is a workaround.
    - * Using a std::initializer_list  as a parameter resulted in
    - * inefficient code. With the current approach, if the parameters are
    - * compile-time constants,
    - * GNU GCC compiles it to ldr, the same as uint8x16_t x = {1,2,3...}.
    - * You should not use this function except for compile-time constants:
    - * it is not efficient.
    - */
    -simdutf_really_inline uint8x16_t make_uint8x16_t(uint8_t x1,  uint8_t x2,  uint8_t x3,  uint8_t x4,
    -                                         uint8_t x5,  uint8_t x6,  uint8_t x7,  uint8_t x8,
    -                                         uint8_t x9,  uint8_t x10, uint8_t x11, uint8_t x12,
    -                                         uint8_t x13, uint8_t x14, uint8_t x15, uint8_t x16) {
    -  // Doing a load like so end ups generating worse code.
    -  // uint8_t array[16] = {x1, x2, x3, x4, x5, x6, x7, x8,
    -  //                     x9, x10,x11,x12,x13,x14,x15,x16};
    -  // return vld1q_u8(array);
    -  uint8x16_t x{};
    -  // incredibly, Visual Studio does not allow x[0] = x1
    -  x = vsetq_lane_u8(x1, x, 0);
    -  x = vsetq_lane_u8(x2, x, 1);
    -  x = vsetq_lane_u8(x3, x, 2);
    -  x = vsetq_lane_u8(x4, x, 3);
    -  x = vsetq_lane_u8(x5, x, 4);
    -  x = vsetq_lane_u8(x6, x, 5);
    -  x = vsetq_lane_u8(x7, x, 6);
    -  x = vsetq_lane_u8(x8, x, 7);
    -  x = vsetq_lane_u8(x9, x, 8);
    -  x = vsetq_lane_u8(x10, x, 9);
    -  x = vsetq_lane_u8(x11, x, 10);
    -  x = vsetq_lane_u8(x12, x, 11);
    -  x = vsetq_lane_u8(x13, x, 12);
    -  x = vsetq_lane_u8(x14, x, 13);
    -  x = vsetq_lane_u8(x15, x, 14);
    -  x = vsetq_lane_u8(x16, x, 15);
    -  return x;
    -}
    -
    -// We have to do the same work for make_int8x16_t
    -simdutf_really_inline int8x16_t make_int8x16_t(int8_t x1,  int8_t x2,  int8_t x3,  int8_t x4,
    -                                       int8_t x5,  int8_t x6,  int8_t x7,  int8_t x8,
    -                                       int8_t x9,  int8_t x10, int8_t x11, int8_t x12,
    -                                       int8_t x13, int8_t x14, int8_t x15, int8_t x16) {
    -  // Doing a load like so end ups generating worse code.
    -  // int8_t array[16] = {x1, x2, x3, x4, x5, x6, x7, x8,
    -  //                     x9, x10,x11,x12,x13,x14,x15,x16};
    -  // return vld1q_s8(array);
    -  int8x16_t x{};
    -  // incredibly, Visual Studio does not allow x[0] = x1
    -  x = vsetq_lane_s8(x1, x, 0);
    -  x = vsetq_lane_s8(x2, x, 1);
    -  x = vsetq_lane_s8(x3, x, 2);
    -  x = vsetq_lane_s8(x4, x, 3);
    -  x = vsetq_lane_s8(x5, x, 4);
    -  x = vsetq_lane_s8(x6, x, 5);
    -  x = vsetq_lane_s8(x7, x, 6);
    -  x = vsetq_lane_s8(x8, x, 7);
    -  x = vsetq_lane_s8(x9, x, 8);
    -  x = vsetq_lane_s8(x10, x, 9);
    -  x = vsetq_lane_s8(x11, x, 10);
    -  x = vsetq_lane_s8(x12, x, 11);
    -  x = vsetq_lane_s8(x13, x, 12);
    -  x = vsetq_lane_s8(x14, x, 13);
    -  x = vsetq_lane_s8(x15, x, 14);
    -  x = vsetq_lane_s8(x16, x, 15);
    -  return x;
    -}
    -
    -simdutf_really_inline uint8x8_t make_uint8x8_t(uint8_t x1,  uint8_t x2,  uint8_t x3,  uint8_t x4,
    -                                         uint8_t x5,  uint8_t x6,  uint8_t x7,  uint8_t x8) {
    -  uint8x8_t x{};
    -  x = vset_lane_u8(x1, x, 0);
    -  x = vset_lane_u8(x2, x, 1);
    -  x = vset_lane_u8(x3, x, 2);
    -  x = vset_lane_u8(x4, x, 3);
    -  x = vset_lane_u8(x5, x, 4);
    -  x = vset_lane_u8(x6, x, 5);
    -  x = vset_lane_u8(x7, x, 6);
    -  x = vset_lane_u8(x8, x, 7);
    -  return x;
    -}
    -
    -simdutf_really_inline uint16x8_t make_uint16x8_t(uint16_t x1,  uint16_t x2,  uint16_t x3,  uint16_t x4,
    -                                       uint16_t x5,  uint16_t x6,  uint16_t x7,  uint16_t x8) {
    -  uint16x8_t x{};
    -  x = vsetq_lane_u16(x1, x, 0);
    -  x = vsetq_lane_u16(x2, x, 1);
    -  x = vsetq_lane_u16(x3, x, 2);
    -  x = vsetq_lane_u16(x4, x, 3);
    -  x = vsetq_lane_u16(x5, x, 4);
    -  x = vsetq_lane_u16(x6, x, 5);
    -  x = vsetq_lane_u16(x7, x, 6);
    -  x = vsetq_lane_u16(x8, x, 7);;
    -  return x;
    -}
    -
    -simdutf_really_inline int16x8_t make_int16x8_t(int16_t x1,  int16_t x2,  int16_t x3,  int16_t x4,
    -                                       int16_t x5,  int16_t x6,  int16_t x7,  int16_t x8) {
    -  uint16x8_t x{};
    -  x = vsetq_lane_s16(x1, x, 0);
    -  x = vsetq_lane_s16(x2, x, 1);
    -  x = vsetq_lane_s16(x3, x, 2);
    -  x = vsetq_lane_s16(x4, x, 3);
    -  x = vsetq_lane_s16(x5, x, 4);
    -  x = vsetq_lane_s16(x6, x, 5);
    -  x = vsetq_lane_s16(x7, x, 6);
    -  x = vsetq_lane_s16(x8, x, 7);;
    -  return x;
    -}
    +#ifndef simdutf_make_uint8x8_t
    +#define simdutf_make_uint8x8_t(x1, x2, x3, x4, x5, x6, x7, x8)                \
    +   ([=]() {                                                                   \
    +     uint8_t array[8] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8};               \
    +     return vld1_u8(array);                                                   \
    +   }())
    +#endif
    +#ifndef simdutf_make_int8x8_t
    +#define simdutf_make_int8x8_t(x1, x2, x3, x4, x5, x6, x7, x8)                 \
    +   ([=]() {                                                                   \
    +     int8_t array[8] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8};                \
    +     return vld1_s8(array);                                                   \
    +   }())
    +#endif
    +#ifndef simdutf_make_uint16x8_t
    +#define simdutf_make_uint16x8_t(x1, x2, x3, x4, x5, x6, x7, x8)                \
    +   ([=]() {                                                                    \
    +     uint16_t array[8] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8};               \
    +     return vld1q_u16(array);                                                  \
    +   }())
    +#endif
    +#ifndef simdutf_make_int16x8_t
    +#define simdutf_make_int16x8_t(x1, x2, x3, x4, x5, x6, x7, x8)                 \
    +   ([=]() {                                                                    \
    +     int16_t array[8] = {x1, x2,  x3,  x4,  x5,  x6,  x7,  x8};                \
    +     return vld1q_s16(array);                                                  \
    +   }())
    +#endif
     
     
     // End of private section with Visual Studio workaround
    @@ -360,7 +310,7 @@ simdutf_really_inline int16x8_t make_int16x8_t(int16_t x1,  int16_t x2,  int16_t
         // purposes (cutting it down to uint16_t costs performance in some compilers).
         simdutf_really_inline uint32_t to_bitmask() const {
     #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -      const uint8x16_t bit_mask =  make_uint8x16_t(0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
    +      const uint8x16_t bit_mask =  simdutf_make_uint8x16_t(0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
                                                        0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80);
     #else
           const uint8x16_t bit_mask =  {0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
    @@ -407,7 +357,7 @@ simdutf_really_inline int16x8_t make_int16x8_t(int16_t x1,  int16_t x2,  int16_t
         simdutf_really_inline simd8(
           uint8_t v0,  uint8_t v1,  uint8_t v2,  uint8_t v3,  uint8_t v4,  uint8_t v5,  uint8_t v6,  uint8_t v7,
           uint8_t v8,  uint8_t v9,  uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15
    -    ) : simd8(make_uint8x16_t(
    +    ) : simd8(simdutf_make_uint8x16_t(
           v0, v1, v2, v3, v4, v5, v6, v7,
           v8, v9, v10,v11,v12,v13,v14,v15
         )) {}
    @@ -505,32 +455,68 @@ simdutf_really_inline int16x8_t make_int16x8_t(int16_t x1,  int16_t x2,  int16_t
         static simdutf_really_inline simd8 splat(int8_t _value) { return vmovq_n_s8(_value); }
         static simdutf_really_inline simd8 zero() { return vdupq_n_s8(0); }
         static simdutf_really_inline simd8 load(const int8_t values[16]) { return vld1q_s8(values); }
    +
    +    // Use ST2 instead of UXTL+UXTL2 to interleave zeroes. UXTL is actually a USHLL #0,
    +    // and shifting in NEON is actually quite slow.
    +    //
    +    // While this needs the registers to be in a specific order, bigger cores can interleave
    +    // these with no overhead, and it still performs decently on little cores.
    +    //    movi  v1.3d, #0
    +    //      mov   v0.16b, value[0]
    +    //    st2   {v0.16b, v1.16b}, [ptr], #32
    +    //      mov   v0.16b, value[1]
    +    //    st2   {v0.16b, v1.16b}, [ptr], #32
    +    //    ...
         template 
         simdutf_really_inline void store_ascii_as_utf16(char16_t * p) const {
    -      uint16x8_t first = vmovl_u8(vget_low_u8 (vreinterpretq_u8_s8(this->value)));
    -      uint16x8_t second = vmovl_high_u8(vreinterpretq_u8_s8(this->value));
    -      if (!match_system(big_endian)) {
    -        #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -        const uint8x16_t swap = make_uint8x16_t(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14);
    -        #else
    -        const uint8x16_t swap = {1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14};
    -        #endif
    -        first = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(first), swap));
    -        second = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(second), swap));
    -      }
    -      vst1q_u16(reinterpret_cast(p), first);
    -      vst1q_u16(reinterpret_cast(p + 8), second);
    -    }
    +      int8x16x2_t pair = match_system(big_endian)
    +          ? int8x16x2_t{{this->value, vmovq_n_s8(0)}}
    +          : int8x16x2_t{{vmovq_n_s8(0), this->value}};
    +      vst2q_s8(reinterpret_cast(p), pair);
    +    }
    +
    +    // currently unused
    +    // Technically this could be done with ST4 like in store_ascii_as_utf16, but it is
    +    // very much not worth it, as explicitly mentioned in the ARM Cortex-X1 Core Software
    +    // Optimization Guide:
    +    //   4.18 Complex ASIMD instructions
    +    //     The bandwidth of [ST4 with element size less than 64b] is limited by decode
    +    //     constraints and it is advisable to avoid them when high performing code is desired.
    +    // Instead, it is better to use ZIP1+ZIP2 and two ST2.
         simdutf_really_inline void store_ascii_as_utf32(char32_t * p) const {
    -      vst1q_u32(reinterpret_cast(p), vmovl_u16(vget_low_u16(vmovl_u8(vget_low_u8 (vreinterpretq_u8_s8(this->value))))));
    -      vst1q_u32(reinterpret_cast(p + 4), vmovl_high_u16(vmovl_u8(vget_low_u8 (vreinterpretq_u8_s8(this->value)))));
    -      vst1q_u32(reinterpret_cast(p + 8), vmovl_u16(vget_low_u16(vmovl_high_u8(vreinterpretq_u8_s8(this->value)))));
    -      vst1q_u32(reinterpret_cast(p + 12), vmovl_high_u16(vmovl_high_u8(vreinterpretq_u8_s8(this->value))));
    +      const uint16x8_t low = vreinterpretq_u16_s8(vzip1q_s8(this->value, vmovq_n_s8(0)));
    +      const uint16x8_t high = vreinterpretq_u16_s8(vzip2q_s8(this->value, vmovq_n_s8(0)));
    +      const uint16x8x2_t low_pair{{ low, vmovq_n_u16(0) }};
    +      vst2q_u16(reinterpret_cast(p), low_pair);
    +      const uint16x8x2_t high_pair{{ high, vmovq_n_u16(0) }};
    +      vst2q_u16(reinterpret_cast(p + 8), high_pair);
    +    }
    +
    +    // In places where the table can be reused, which is most uses in simdutf, it is worth it to do
    +    // 4 table lookups, as there is no direct zero extension from u8 to u32.
    +    simdutf_really_inline void store_ascii_as_utf32_tbl(char32_t * p) const {
    +      const simd8 tb1{  0,255,255,255,  1,255,255,255,  2,255,255,255,  3,255,255,255 };
    +      const simd8 tb2{  4,255,255,255,  5,255,255,255,  6,255,255,255,  7,255,255,255 };
    +      const simd8 tb3{  8,255,255,255,  9,255,255,255, 10,255,255,255, 11,255,255,255 };
    +      const simd8 tb4{ 12,255,255,255, 13,255,255,255, 14,255,255,255, 15,255,255,255 };
    +
    +      // encourage store pairing and interleaving
    +      const auto shuf1 = this->apply_lookup_16_to(tb1);
    +      const auto shuf2 = this->apply_lookup_16_to(tb2);
    +      shuf1.store(reinterpret_cast(p));
    +      shuf2.store(reinterpret_cast(p + 4));
    +
    +      const auto shuf3 = this->apply_lookup_16_to(tb3);
    +      const auto shuf4 = this->apply_lookup_16_to(tb4);
    +      shuf3.store(reinterpret_cast(p + 8));
    +      shuf4.store(reinterpret_cast(p + 12));
         }
         // Conversion from/to SIMD register
         simdutf_really_inline simd8(const int8x16_t _value) : value{_value} {}
         simdutf_really_inline operator const int8x16_t&() const { return this->value; }
    +#ifndef SIMDUTF_REGULAR_VISUAL_STUDIO
         simdutf_really_inline operator const uint8x16_t() const { return vreinterpretq_u8_s8(this->value); }
    +#endif
         simdutf_really_inline operator int8x16_t&() { return this->value; }
     
         // Zero constructor
    @@ -544,7 +530,7 @@ simdutf_really_inline int16x8_t make_int16x8_t(int16_t x1,  int16_t x2,  int16_t
         simdutf_really_inline simd8(
           int8_t v0,  int8_t v1,  int8_t v2,  int8_t v3, int8_t v4,  int8_t v5,  int8_t v6,  int8_t v7,
           int8_t v8,  int8_t v9,  int8_t v10, int8_t v11, int8_t v12, int8_t v13, int8_t v14, int8_t v15
    -    ) : simd8(make_int8x16_t(
    +    ) : simd8(simdutf_make_int8x16_t(
           v0, v1, v2, v3, v4, v5, v6, v7,
           v8, v9, v10,v11,v12,v13,v14,v15
         )) {}
    @@ -627,7 +613,7 @@ simdutf_really_inline int16x8_t make_int16x8_t(int16_t x1,  int16_t x2,  int16_t
         }
     
         template
    -    simdutf_really_inline simd8 apply_lookup_16_to(const simd8 original) {
    +    simdutf_really_inline simd8 apply_lookup_16_to(const simd8 original) const {
           return vqtbl1q_s8(*this, simd8(original));
         }
       };
    @@ -678,15 +664,15 @@ simdutf_really_inline int16x8_t make_int16x8_t(int16_t x1,  int16_t x2,  int16_t
         }
     
         simdutf_really_inline void store_ascii_as_utf32(char32_t * ptr) const {
    -      this->chunks[0].store_ascii_as_utf32(ptr+sizeof(simd8)*0);
    -      this->chunks[1].store_ascii_as_utf32(ptr+sizeof(simd8)*1);
    -      this->chunks[2].store_ascii_as_utf32(ptr+sizeof(simd8)*2);
    -      this->chunks[3].store_ascii_as_utf32(ptr+sizeof(simd8)*3);
    +      this->chunks[0].store_ascii_as_utf32_tbl(ptr+sizeof(simd8)*0);
    +      this->chunks[1].store_ascii_as_utf32_tbl(ptr+sizeof(simd8)*1);
    +      this->chunks[2].store_ascii_as_utf32_tbl(ptr+sizeof(simd8)*2);
    +      this->chunks[3].store_ascii_as_utf32_tbl(ptr+sizeof(simd8)*3);
         }
     
         simdutf_really_inline uint64_t to_bitmask() const {
     #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -      const uint8x16_t bit_mask = make_uint8x16_t(
    +      const uint8x16_t bit_mask = simdutf_make_uint8x16_t(
             0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
             0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80
           );
    @@ -782,7 +768,6 @@ simdutf_really_inline int16x8_t make_int16x8_t(int16_t x1,  int16_t x2,  int16_t
           ).to_bitmask();
         }
       }; // struct simd8x64
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/arm64/simd16-inl.h
     /* begin file src/simdutf/arm64/simd16-inl.h */
     template
     struct simd16;
    @@ -869,7 +854,7 @@ struct base16_numeric: base16 {
       simdutf_really_inline simd16& operator-=(const simd16 other) { *this = *this - other; return *static_cast*>(this); }
     };
     
    -// Signed words
    +// Signed code units
     template<>
     struct simd16 : base16_numeric {
       simdutf_really_inline simd16() : base16_numeric() {}
    @@ -899,7 +884,7 @@ struct simd16 : base16_numeric {
     
     
     
    -// Unsigned words
    +// Unsigned code units
     template<>
     struct simd16: base16_numeric  {
       simdutf_really_inline simd16() : base16_numeric() {}
    @@ -942,19 +927,14 @@ struct simd16: base16_numeric  {
       simdutf_really_inline simd16 operator&(const simd16 other) const { return vandq_u16(*this, other); }
       simdutf_really_inline simd16 operator^(const simd16 other) const { return veorq_u16(*this, other); }
     
    -  // Pack with the unsigned saturation  two uint16_t words into single uint8_t vector
    +  // Pack with the unsigned saturation  two uint16_t code units into single uint8_t vector
       static simdutf_really_inline simd8 pack(const simd16& v0, const simd16& v1) {
         return vqmovn_high_u16(vqmovn_u16(v0), v1);
       }
     
       // Change the endianness
       simdutf_really_inline simd16 swap_bytes() const {
    -    #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -    const uint8x16_t swap = make_uint8x16_t(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14);
    -    #else
    -    const uint8x16_t swap = {1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14};
    -    #endif
    -    return vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(*this), swap));
    +    return vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(*this)));
       }
     };
     simdutf_really_inline simd16::operator simd16() const { return this->value; }
    @@ -997,7 +977,7 @@ simdutf_really_inline simd16::operator simd16() const { retur
     
         simdutf_really_inline uint64_t to_bitmask() const {
     #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -      const uint8x16_t bit_mask = make_uint8x16_t(
    +      const uint8x16_t bit_mask = simdutf_make_uint8x16_t(
             0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
             0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80
           );
    @@ -1095,7 +1075,6 @@ simdutf_really_inline simd16::operator simd16() const { retur
     #endif // SIMDUTF_ARM64_SIMD_H
     /* end file src/simdutf/arm64/simd.h */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/arm64/end.h
     /* begin file src/simdutf/arm64/end.h */
     /* end file src/simdutf/arm64/end.h */
     
    @@ -1103,7 +1082,6 @@ simdutf_really_inline simd16::operator simd16() const { retur
     
     #endif // SIMDUTF_ARM64_H
     /* end file src/simdutf/arm64.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/icelake.h
     /* begin file src/simdutf/icelake.h */
     #ifndef SIMDUTF_ICELAKE_H
     #define SIMDUTF_ICELAKE_H
    @@ -1145,7 +1123,7 @@ simdutf_really_inline simd16::operator simd16() const { retur
     #if SIMDUTF_CAN_ALWAYS_RUN_ICELAKE
     #define SIMDUTF_TARGET_ICELAKE
     #else
    -#define SIMDUTF_TARGET_ICELAKE SIMDUTF_TARGET_REGION("avx512f,avx512dq,avx512cd,avx512bw,avx512vbmi,avx512vbmi2,avx512vl,avx2,bmi,bmi2,pclmul,lzcnt,popcnt")
    +#define SIMDUTF_TARGET_ICELAKE SIMDUTF_TARGET_REGION("avx512f,avx512dq,avx512cd,avx512bw,avx512vbmi,avx512vbmi2,avx512vl,avx2,bmi,bmi2,pclmul,lzcnt,popcnt,avx512vpopcntdq")
     #endif
     
     namespace simdutf {
    @@ -1158,7 +1136,6 @@ namespace icelake {
     //
     // These two need to be included outside SIMDUTF_TARGET_REGION
     //
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/icelake/intrinsics.h
     /* begin file src/simdutf/icelake/intrinsics.h */
     #ifndef SIMDUTF_ICELAKE_INTRINSICS_H
     #define SIMDUTF_ICELAKE_INTRINSICS_H
    @@ -1227,6 +1204,8 @@ SIMDUTF_POP_DISABLE_WARNINGS
     #include 
     #include 
     #include 
    +#include 
    +#include 
     // unfortunately, we may not get _blsr_u64, but, thankfully, clang
     // has it as a macro.
     #ifndef _blsr_u64
    @@ -1268,7 +1247,6 @@ inline __m512i _mm512_set_epi8(uint8_t a0, uint8_t a1, uint8_t a2, uint8_t a3, u
     
     #endif // SIMDUTF_HASWELL_INTRINSICS_H
     /* end file src/simdutf/icelake/intrinsics.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/icelake/implementation.h
     /* begin file src/simdutf/icelake/implementation.h */
     #ifndef SIMDUTF_ICELAKE_IMPLEMENTATION_H
     #define SIMDUTF_ICELAKE_IMPLEMENTATION_H
    @@ -1286,7 +1264,7 @@ class implementation final : public simdutf::implementation {
       simdutf_really_inline implementation() : simdutf::implementation(
           "icelake",
           "Intel AVX512 (AVX-512BW, AVX-512CD, AVX-512VL, AVX-512VBMI2 extensions)",
    -      internal::instruction_set::AVX2 | internal::instruction_set::BMI1 | internal::instruction_set::BMI2 | internal::instruction_set::AVX512BW | internal::instruction_set::AVX512CD | internal::instruction_set::AVX512VL | internal::instruction_set::AVX512VBMI2 ) {}
    +      internal::instruction_set::AVX2 | internal::instruction_set::BMI1 | internal::instruction_set::BMI2 | internal::instruction_set::AVX512BW | internal::instruction_set::AVX512CD | internal::instruction_set::AVX512VL | internal::instruction_set::AVX512VBMI2 | internal::instruction_set::AVX512VPOPCNTDQ ) {}
       simdutf_warn_unused int detect_encodings(const char * input, size_t length) const noexcept final;
       simdutf_warn_unused bool validate_utf8(const char *buf, size_t len) const noexcept final;
       simdutf_warn_unused result validate_utf8_with_errors(const char *buf, size_t len) const noexcept final;
    @@ -1298,6 +1276,13 @@ class implementation final : public simdutf::implementation {
       simdutf_warn_unused result validate_utf16be_with_errors(const char16_t *buf, size_t len) const noexcept final;
       simdutf_warn_unused bool validate_utf32(const char32_t *buf, size_t len) const noexcept final;
       simdutf_warn_unused result validate_utf32_with_errors(const char32_t *buf, size_t len) const noexcept final;
    +  simdutf_warn_unused size_t convert_latin1_to_utf8(const char * buf, size_t len, char* utf8_output) const noexcept final;
    +  simdutf_warn_unused size_t convert_latin1_to_utf16le(const char * buf, size_t len, char16_t* utf16_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_latin1_to_utf16be(const char * buf, size_t len, char16_t* utf16_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_latin1_to_utf32(const char * buf, size_t len, char32_t* utf32_output) const noexcept final;
    +  simdutf_warn_unused size_t convert_utf8_to_latin1(const char * buf, size_t len, char* latin1_output) const noexcept final;
    +  simdutf_warn_unused result convert_utf8_to_latin1_with_errors(const char * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_valid_utf8_to_latin1(const char * buf, size_t len, char* latin1_output) const noexcept final;
       simdutf_warn_unused size_t convert_utf8_to_utf16le(const char * buf, size_t len, char16_t* utf16_output) const noexcept final;
       simdutf_warn_unused size_t convert_utf8_to_utf16be(const char * buf, size_t len, char16_t* utf16_output) const noexcept final;
       simdutf_warn_unused result convert_utf8_to_utf16le_with_errors(const char * buf, size_t len, char16_t* utf16_output) const noexcept final;
    @@ -1307,6 +1292,12 @@ class implementation final : public simdutf::implementation {
       simdutf_warn_unused size_t convert_utf8_to_utf32(const char * buf, size_t len, char32_t* utf32_output) const noexcept final;
       simdutf_warn_unused result convert_utf8_to_utf32_with_errors(const char * buf, size_t len, char32_t* utf32_output) const noexcept final;
       simdutf_warn_unused size_t convert_valid_utf8_to_utf32(const char * buf, size_t len, char32_t* utf32_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_utf16le_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_utf16be_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused result convert_utf16le_to_latin1_with_errors(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused result convert_utf16be_to_latin1_with_errors(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_valid_utf16le_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_valid_utf16be_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
       simdutf_warn_unused size_t convert_utf16le_to_utf8(const char16_t * buf, size_t len, char* utf8_buffer) const noexcept final;
       simdutf_warn_unused size_t convert_utf16be_to_utf8(const char16_t * buf, size_t len, char* utf8_buffer) const noexcept final;
       simdutf_warn_unused result convert_utf16le_to_utf8_with_errors(const char16_t * buf, size_t len, char* utf8_buffer) const noexcept final;
    @@ -1316,6 +1307,9 @@ class implementation final : public simdutf::implementation {
       simdutf_warn_unused size_t convert_utf32_to_utf8(const char32_t * buf, size_t len, char* utf8_buffer) const noexcept final;
       simdutf_warn_unused result convert_utf32_to_utf8_with_errors(const char32_t * buf, size_t len, char* utf8_buffer) const noexcept final;
       simdutf_warn_unused size_t convert_valid_utf32_to_utf8(const char32_t * buf, size_t len, char* utf8_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_utf32_to_latin1(const char32_t * buf, size_t len, char* latin1_output) const noexcept final;
    +  simdutf_warn_unused result convert_utf32_to_latin1_with_errors(const char32_t * buf, size_t len, char* latin1_output) const noexcept final;
    +  simdutf_warn_unused size_t convert_valid_utf32_to_latin1(const char32_t * buf, size_t len, char* latin1_output) const noexcept final;
       simdutf_warn_unused size_t convert_utf32_to_utf16le(const char32_t * buf, size_t len, char16_t* utf16_buffer) const noexcept final;
       simdutf_warn_unused size_t convert_utf32_to_utf16be(const char32_t * buf, size_t len, char16_t* utf16_buffer) const noexcept final;
       simdutf_warn_unused result convert_utf32_to_utf16le_with_errors(const char32_t * buf, size_t len, char16_t* utf16_buffer) const noexcept final;
    @@ -1340,6 +1334,12 @@ class implementation final : public simdutf::implementation {
       simdutf_warn_unused size_t utf8_length_from_utf32(const char32_t * input, size_t length) const noexcept;
       simdutf_warn_unused size_t utf16_length_from_utf32(const char32_t * input, size_t length) const noexcept;
       simdutf_warn_unused size_t utf32_length_from_utf8(const char * input, size_t length) const noexcept;
    +  simdutf_warn_unused size_t latin1_length_from_utf8(const char * input, size_t length) const noexcept;
    +  simdutf_warn_unused size_t latin1_length_from_utf16(size_t length) const noexcept;
    +  simdutf_warn_unused size_t latin1_length_from_utf32(size_t length) const noexcept;
    +  simdutf_warn_unused size_t utf32_length_from_latin1(size_t length) const noexcept;
    +  simdutf_warn_unused size_t utf16_length_from_latin1(size_t length) const noexcept;
    +  simdutf_warn_unused size_t utf8_length_from_latin1(const char * input, size_t length) const noexcept;
     };
     
     } // namespace icelake
    @@ -1351,7 +1351,6 @@ class implementation final : public simdutf::implementation {
     //
     // The rest need to be inside the region
     //
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/icelake/begin.h
     /* begin file src/simdutf/icelake/begin.h */
     // redefining SIMDUTF_IMPLEMENTATION to "icelake"
     // #define SIMDUTF_IMPLEMENTATION icelake
    @@ -1367,7 +1366,6 @@ SIMDUTF_DISABLE_GCC_WARNING(-Wmaybe-uninitialized)
     #endif // end of workaround
     /* end file src/simdutf/icelake/begin.h */
     // Declarations
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/icelake/bitmanipulation.h
     /* begin file src/simdutf/icelake/bitmanipulation.h */
     #ifndef SIMDUTF_ICELAKE_BITMANIPULATION_H
     #define SIMDUTF_ICELAKE_BITMANIPULATION_H
    @@ -1393,7 +1391,6 @@ simdutf_really_inline long long int count_ones(uint64_t input_num) {
     
     #endif // SIMDUTF_ICELAKE_BITMANIPULATION_H
     /* end file src/simdutf/icelake/bitmanipulation.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/icelake/end.h
     /* begin file src/simdutf/icelake/end.h */
     #if SIMDUTF_CAN_ALWAYS_RUN_ICELAKE
     // nothing needed.
    @@ -1412,7 +1409,6 @@ SIMDUTF_POP_DISABLE_WARNINGS
     #endif // SIMDUTF_IMPLEMENTATION_ICELAKE
     #endif // SIMDUTF_ICELAKE_H
     /* end file src/simdutf/icelake.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/haswell.h
     /* begin file src/simdutf/haswell.h */
     #ifndef SIMDUTF_HASWELL_H
     #define SIMDUTF_HASWELL_H
    @@ -1458,7 +1454,6 @@ namespace haswell {
     //
     // These two need to be included outside SIMDUTF_TARGET_REGION
     //
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/haswell/implementation.h
     /* begin file src/simdutf/haswell/implementation.h */
     #ifndef SIMDUTF_HASWELL_IMPLEMENTATION_H
     #define SIMDUTF_HASWELL_IMPLEMENTATION_H
    @@ -1488,6 +1483,13 @@ class implementation final : public simdutf::implementation {
       simdutf_warn_unused result validate_utf16be_with_errors(const char16_t *buf, size_t len) const noexcept final;
       simdutf_warn_unused bool validate_utf32(const char32_t *buf, size_t len) const noexcept final;
       simdutf_warn_unused result validate_utf32_with_errors(const char32_t *buf, size_t len) const noexcept final;
    +  simdutf_warn_unused size_t convert_latin1_to_utf8(const char * buf, size_t len, char* utf8_output) const noexcept final;
    +  simdutf_warn_unused size_t convert_latin1_to_utf16le(const char * buf, size_t len, char16_t* utf16_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_latin1_to_utf16be(const char * buf, size_t len, char16_t* utf16_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_latin1_to_utf32(const char * buf, size_t len, char32_t* utf32_output) const noexcept final;
    +  simdutf_warn_unused size_t convert_utf8_to_latin1(const char * buf, size_t len, char* latin1_output) const noexcept final;
    +  simdutf_warn_unused result convert_utf8_to_latin1_with_errors(const char * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_valid_utf8_to_latin1(const char * buf, size_t len, char* latin1_output) const noexcept final;
       simdutf_warn_unused size_t convert_utf8_to_utf16le(const char * buf, size_t len, char16_t* utf16_output) const noexcept final;
       simdutf_warn_unused size_t convert_utf8_to_utf16be(const char * buf, size_t len, char16_t* utf16_output) const noexcept final;
       simdutf_warn_unused result convert_utf8_to_utf16le_with_errors(const char * buf, size_t len, char16_t* utf16_output) const noexcept final;
    @@ -1497,6 +1499,12 @@ class implementation final : public simdutf::implementation {
       simdutf_warn_unused size_t convert_utf8_to_utf32(const char * buf, size_t len, char32_t* utf32_output) const noexcept final;
       simdutf_warn_unused result convert_utf8_to_utf32_with_errors(const char * buf, size_t len, char32_t* utf32_output) const noexcept final;
       simdutf_warn_unused size_t convert_valid_utf8_to_utf32(const char * buf, size_t len, char32_t* utf32_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_utf16le_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_utf16be_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused result convert_utf16le_to_latin1_with_errors(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused result convert_utf16be_to_latin1_with_errors(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_valid_utf16le_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_valid_utf16be_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
       simdutf_warn_unused size_t convert_utf16le_to_utf8(const char16_t * buf, size_t len, char* utf8_buffer) const noexcept final;
       simdutf_warn_unused size_t convert_utf16be_to_utf8(const char16_t * buf, size_t len, char* utf8_buffer) const noexcept final;
       simdutf_warn_unused result convert_utf16le_to_utf8_with_errors(const char16_t * buf, size_t len, char* utf8_buffer) const noexcept final;
    @@ -1506,6 +1514,9 @@ class implementation final : public simdutf::implementation {
       simdutf_warn_unused size_t convert_utf32_to_utf8(const char32_t * buf, size_t len, char* utf8_buffer) const noexcept final;
       simdutf_warn_unused result convert_utf32_to_utf8_with_errors(const char32_t * buf, size_t len, char* utf8_buffer) const noexcept final;
       simdutf_warn_unused size_t convert_valid_utf32_to_utf8(const char32_t * buf, size_t len, char* utf8_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_utf32_to_latin1(const char32_t * buf, size_t len, char* latin1_output) const noexcept final;
    +  simdutf_warn_unused result convert_utf32_to_latin1_with_errors(const char32_t * buf, size_t len, char* latin1_output) const noexcept final;
    +  simdutf_warn_unused size_t convert_valid_utf32_to_latin1(const char32_t * buf, size_t len, char* latin1_output) const noexcept final;
       simdutf_warn_unused size_t convert_utf32_to_utf16le(const char32_t * buf, size_t len, char16_t* utf16_buffer) const noexcept final;
       simdutf_warn_unused size_t convert_utf32_to_utf16be(const char32_t * buf, size_t len, char16_t* utf16_buffer) const noexcept final;
       simdutf_warn_unused result convert_utf32_to_utf16le_with_errors(const char32_t * buf, size_t len, char16_t* utf16_buffer) const noexcept final;
    @@ -1530,6 +1541,12 @@ class implementation final : public simdutf::implementation {
       simdutf_warn_unused size_t utf8_length_from_utf32(const char32_t * input, size_t length) const noexcept;
       simdutf_warn_unused size_t utf16_length_from_utf32(const char32_t * input, size_t length) const noexcept;
       simdutf_warn_unused size_t utf32_length_from_utf8(const char * input, size_t length) const noexcept;
    +  simdutf_warn_unused size_t latin1_length_from_utf8(const char * input, size_t length) const noexcept;
    +  simdutf_warn_unused size_t latin1_length_from_utf16(size_t length) const noexcept;
    +  simdutf_warn_unused size_t latin1_length_from_utf32(size_t length) const noexcept;
    +  simdutf_warn_unused size_t utf32_length_from_latin1(size_t length) const noexcept;
    +  simdutf_warn_unused size_t utf16_length_from_latin1(size_t length) const noexcept;
    +  simdutf_warn_unused size_t utf8_length_from_latin1(const char * input, size_t length) const noexcept;
     };
     
     } // namespace haswell
    @@ -1537,7 +1554,6 @@ class implementation final : public simdutf::implementation {
     
     #endif // SIMDUTF_HASWELL_IMPLEMENTATION_H
     /* end file src/simdutf/haswell/implementation.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/haswell/intrinsics.h
     /* begin file src/simdutf/haswell/intrinsics.h */
     #ifndef SIMDUTF_HASWELL_INTRINSICS_H
     #define SIMDUTF_HASWELL_INTRINSICS_H
    @@ -1606,7 +1622,6 @@ SIMDUTF_POP_DISABLE_WARNINGS
     //
     // The rest need to be inside the region
     //
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/haswell/begin.h
     /* begin file src/simdutf/haswell/begin.h */
     // redefining SIMDUTF_IMPLEMENTATION to "haswell"
     // #define SIMDUTF_IMPLEMENTATION haswell
    @@ -1622,7 +1637,6 @@ SIMDUTF_DISABLE_GCC_WARNING(-Wmaybe-uninitialized)
     #endif // end of workaround
     /* end file src/simdutf/haswell/begin.h */
     // Declarations
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/haswell/bitmanipulation.h
     /* begin file src/simdutf/haswell/bitmanipulation.h */
     #ifndef SIMDUTF_HASWELL_BITMANIPULATION_H
     #define SIMDUTF_HASWELL_BITMANIPULATION_H
    @@ -1648,7 +1662,6 @@ simdutf_really_inline long long int count_ones(uint64_t input_num) {
     
     #endif // SIMDUTF_HASWELL_BITMANIPULATION_H
     /* end file src/simdutf/haswell/bitmanipulation.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/haswell/simd.h
     /* begin file src/simdutf/haswell/simd.h */
     #ifndef SIMDUTF_HASWELL_SIMD_H
     #define SIMDUTF_HASWELL_SIMD_H
    @@ -2000,9 +2013,7 @@ namespace simd {
     
           return  simd8x64(
             (this->chunks[0] <= mask_high) & (this->chunks[0] >= mask_low),
    -        (this->chunks[1] <= mask_high) & (this->chunks[1] >= mask_low),
    -        (this->chunks[2] <= mask_high) & (this->chunks[2] >= mask_low),
    -        (this->chunks[3] <= mask_high) & (this->chunks[3] >= mask_low)
    +        (this->chunks[1] <= mask_high) & (this->chunks[1] >= mask_low)
           ).to_bitmask();
         }
         simdutf_really_inline uint64_t not_in_range(const T low, const T high) const {
    @@ -2044,7 +2055,6 @@ namespace simd {
         }
       }; // struct simd8x64
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/haswell/simd16-inl.h
     /* begin file src/simdutf/haswell/simd16-inl.h */
     #ifdef __GNUC__
     #if __GNUC__ < 8
    @@ -2117,7 +2127,7 @@ struct base16_numeric: base16 {
       simdutf_really_inline simd16& operator-=(const simd16 other) { *this = *this - other; return *static_cast*>(this); }
     };
     
    -// Signed words
    +// Signed code units
     template<>
     struct simd16 : base16_numeric {
       simdutf_really_inline simd16() : base16_numeric() {}
    @@ -2134,7 +2144,7 @@ struct simd16 : base16_numeric {
       simdutf_really_inline simd16 operator<(const simd16 other) const { return _mm256_cmpgt_epi16(other, *this); }
     };
     
    -// Unsigned words
    +// Unsigned code units
     template<>
     struct simd16: base16_numeric  {
       simdutf_really_inline simd16() : base16_numeric() {}
    @@ -2188,7 +2198,7 @@ struct simd16: base16_numeric  {
         return _mm256_shuffle_epi8(*this, swap);
       }
     
    -  // Pack with the unsigned saturation two uint16_t words into single uint8_t vector
    +  // Pack with the unsigned saturation two uint16_t code units into single uint8_t vector
       static simdutf_really_inline simd8 pack(const simd16& v0, const simd16& v1) {
         // Note: the AVX2 variant of pack operates on 128-bit lanes, thus
         //       we have to shuffle lanes in order to produce bytes in the
    @@ -2206,7 +2216,7 @@ struct simd16: base16_numeric  {
         const __m256i t0 = _mm256_set_m128i(lo_1, lo_0);
         const __m256i t1 = _mm256_set_m128i(hi_1, hi_0);
     
    -    // pack words in linear order from v0 and v1
    +    // pack code units in linear order from v0 and v1
         return _mm256_packus_epi16(t0, t1);
       }
     };
    @@ -2291,9 +2301,7 @@ struct simd16: base16_numeric  {
     
           return  simd16x32(
             (this->chunks[0] <= mask_high) & (this->chunks[0] >= mask_low),
    -        (this->chunks[1] <= mask_high) & (this->chunks[1] >= mask_low),
    -        (this->chunks[2] <= mask_high) & (this->chunks[2] >= mask_low),
    -        (this->chunks[3] <= mask_high) & (this->chunks[3] >= mask_low)
    +        (this->chunks[1] <= mask_high) & (this->chunks[1] >= mask_low)
           ).to_bitmask();
         }
         simdutf_really_inline uint64_t not_in_range(const T low, const T high) const {
    @@ -2323,7 +2331,6 @@ struct simd16: base16_numeric  {
     #endif // SIMDUTF_HASWELL_SIMD_H
     /* end file src/simdutf/haswell/simd.h */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/haswell/end.h
     /* begin file src/simdutf/haswell/end.h */
     #if SIMDUTF_CAN_ALWAYS_RUN_HASWELL
     // nothing needed.
    @@ -2340,7 +2347,6 @@ SIMDUTF_POP_DISABLE_WARNINGS
     #endif // SIMDUTF_IMPLEMENTATION_HASWELL
     #endif // SIMDUTF_HASWELL_COMMON_H
     /* end file src/simdutf/haswell.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/westmere.h
     /* begin file src/simdutf/westmere.h */
     #ifndef SIMDUTF_WESTMERE_H
     #define SIMDUTF_WESTMERE_H
    @@ -2381,7 +2387,6 @@ namespace westmere {
     //
     // These two need to be included outside SIMDUTF_TARGET_REGION
     //
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/westmere/implementation.h
     /* begin file src/simdutf/westmere/implementation.h */
     #ifndef SIMDUTF_WESTMERE_IMPLEMENTATION_H
     #define SIMDUTF_WESTMERE_IMPLEMENTATION_H
    @@ -2409,6 +2414,13 @@ class implementation final : public simdutf::implementation {
       simdutf_warn_unused result validate_utf16be_with_errors(const char16_t *buf, size_t len) const noexcept final;
       simdutf_warn_unused bool validate_utf32(const char32_t *buf, size_t len) const noexcept final;
       simdutf_warn_unused result validate_utf32_with_errors(const char32_t *buf, size_t len) const noexcept final;
    +  simdutf_warn_unused size_t convert_latin1_to_utf8(const char * buf, size_t len, char* utf8_output) const noexcept final;
    +  simdutf_warn_unused size_t convert_latin1_to_utf16le(const char * buf, size_t len, char16_t* utf16_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_latin1_to_utf16be(const char * buf, size_t len, char16_t* utf16_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_latin1_to_utf32(const char * buf, size_t len, char32_t* utf32_output) const noexcept final;
    +  simdutf_warn_unused size_t convert_utf8_to_latin1(const char * buf, size_t len, char* latin1_output) const noexcept final;
    +  simdutf_warn_unused result convert_utf8_to_latin1_with_errors(const char * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_valid_utf8_to_latin1(const char * buf, size_t len, char* latin1_output) const noexcept final;
       simdutf_warn_unused size_t convert_utf8_to_utf16le(const char * buf, size_t len, char16_t* utf16_output) const noexcept final;
       simdutf_warn_unused size_t convert_utf8_to_utf16be(const char * buf, size_t len, char16_t* utf16_output) const noexcept final;
       simdutf_warn_unused result convert_utf8_to_utf16le_with_errors(const char * buf, size_t len, char16_t* utf16_output) const noexcept final;
    @@ -2418,6 +2430,12 @@ class implementation final : public simdutf::implementation {
       simdutf_warn_unused size_t convert_utf8_to_utf32(const char * buf, size_t len, char32_t* utf32_output) const noexcept final;
       simdutf_warn_unused result convert_utf8_to_utf32_with_errors(const char * buf, size_t len, char32_t* utf32_output) const noexcept final;
       simdutf_warn_unused size_t convert_valid_utf8_to_utf32(const char * buf, size_t len, char32_t* utf32_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_utf16le_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_utf16be_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused result convert_utf16le_to_latin1_with_errors(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused result convert_utf16be_to_latin1_with_errors(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_valid_utf16le_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_valid_utf16be_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
       simdutf_warn_unused size_t convert_utf16le_to_utf8(const char16_t * buf, size_t len, char* utf8_buffer) const noexcept final;
       simdutf_warn_unused size_t convert_utf16be_to_utf8(const char16_t * buf, size_t len, char* utf8_buffer) const noexcept final;
       simdutf_warn_unused result convert_utf16le_to_utf8_with_errors(const char16_t * buf, size_t len, char* utf8_buffer) const noexcept final;
    @@ -2427,6 +2445,9 @@ class implementation final : public simdutf::implementation {
       simdutf_warn_unused size_t convert_utf32_to_utf8(const char32_t * buf, size_t len, char* utf8_buffer) const noexcept final;
       simdutf_warn_unused result convert_utf32_to_utf8_with_errors(const char32_t * buf, size_t len, char* utf8_buffer) const noexcept final;
       simdutf_warn_unused size_t convert_valid_utf32_to_utf8(const char32_t * buf, size_t len, char* utf8_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_utf32_to_latin1(const char32_t * buf, size_t len, char* latin1_output) const noexcept final;
    +  simdutf_warn_unused result convert_utf32_to_latin1_with_errors(const char32_t * buf, size_t len, char* latin1_output) const noexcept final;
    +  simdutf_warn_unused size_t convert_valid_utf32_to_latin1(const char32_t * buf, size_t len, char* latin1_output) const noexcept final;
       simdutf_warn_unused size_t convert_utf32_to_utf16le(const char32_t * buf, size_t len, char16_t* utf16_buffer) const noexcept final;
       simdutf_warn_unused size_t convert_utf32_to_utf16be(const char32_t * buf, size_t len, char16_t* utf16_buffer) const noexcept final;
       simdutf_warn_unused result convert_utf32_to_utf16le_with_errors(const char32_t * buf, size_t len, char16_t* utf16_buffer) const noexcept final;
    @@ -2451,6 +2472,12 @@ class implementation final : public simdutf::implementation {
       simdutf_warn_unused size_t utf8_length_from_utf32(const char32_t * input, size_t length) const noexcept;
       simdutf_warn_unused size_t utf16_length_from_utf32(const char32_t * input, size_t length) const noexcept;
       simdutf_warn_unused size_t utf32_length_from_utf8(const char * input, size_t length) const noexcept;
    +  simdutf_warn_unused size_t latin1_length_from_utf8(const char * input, size_t length) const noexcept;
    +  simdutf_warn_unused size_t latin1_length_from_utf16(size_t length) const noexcept;
    +  simdutf_warn_unused size_t latin1_length_from_utf32(size_t length) const noexcept;
    +  simdutf_warn_unused size_t utf32_length_from_latin1(size_t length) const noexcept;
    +  simdutf_warn_unused size_t utf16_length_from_latin1(size_t length) const noexcept;
    +  simdutf_warn_unused size_t utf8_length_from_latin1(const char * input, size_t length) const noexcept;
     };
     
     } // namespace westmere
    @@ -2458,7 +2485,6 @@ class implementation final : public simdutf::implementation {
     
     #endif // SIMDUTF_WESTMERE_IMPLEMENTATION_H
     /* end file src/simdutf/westmere/implementation.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/westmere/intrinsics.h
     /* begin file src/simdutf/westmere/intrinsics.h */
     #ifndef SIMDUTF_WESTMERE_INTRINSICS_H
     #define SIMDUTF_WESTMERE_INTRINSICS_H
    @@ -2507,7 +2533,6 @@ SIMDUTF_POP_DISABLE_WARNINGS
     //
     // The rest need to be inside the region
     //
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/westmere/begin.h
     /* begin file src/simdutf/westmere/begin.h */
     // redefining SIMDUTF_IMPLEMENTATION to "westmere"
     // #define SIMDUTF_IMPLEMENTATION westmere
    @@ -2520,7 +2545,6 @@ SIMDUTF_TARGET_WESTMERE
     /* end file src/simdutf/westmere/begin.h */
     
     // Declarations
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/westmere/bitmanipulation.h
     /* begin file src/simdutf/westmere/bitmanipulation.h */
     #ifndef SIMDUTF_WESTMERE_BITMANIPULATION_H
     #define SIMDUTF_WESTMERE_BITMANIPULATION_H
    @@ -2546,7 +2570,6 @@ simdutf_really_inline long long int count_ones(uint64_t input_num) {
     
     #endif // SIMDUTF_WESTMERE_BITMANIPULATION_H
     /* end file src/simdutf/westmere/bitmanipulation.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/westmere/simd.h
     /* begin file src/simdutf/westmere/simd.h */
     #ifndef SIMDUTF_WESTMERE_SIMD_H
     #define SIMDUTF_WESTMERE_SIMD_H
    @@ -2894,10 +2917,10 @@ namespace simd {
         }
     
         simdutf_really_inline uint64_t to_bitmask() const {
    -      uint64_t r0 = uint32_t(this->chunks[0].to_bitmask() );
    -      uint64_t r1 =          this->chunks[1].to_bitmask() ;
    -      uint64_t r2 =          this->chunks[2].to_bitmask() ;
    -      uint64_t r3 =          this->chunks[3].to_bitmask() ;
    +      uint64_t r0 = uint32_t(this->chunks[0].to_bitmask());
    +      uint64_t r1 =          this->chunks[1].to_bitmask();
    +      uint64_t r2 =          this->chunks[2].to_bitmask();
    +      uint64_t r3 =          this->chunks[3].to_bitmask();
           return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48);
         }
     
    @@ -2990,7 +3013,6 @@ namespace simd {
         }
       }; // struct simd8x64
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/westmere/simd16-inl.h
     /* begin file src/simdutf/westmere/simd16-inl.h */
     template
     struct simd16;
    @@ -3054,7 +3076,7 @@ struct base16_numeric: base16 {
       simdutf_really_inline simd16& operator-=(const simd16 other) { *this = *this - other; return *static_cast*>(this); }
     };
     
    -// Signed words
    +// Signed code units
     template<>
     struct simd16 : base16_numeric {
       simdutf_really_inline simd16() : base16_numeric() {}
    @@ -3077,7 +3099,7 @@ struct simd16 : base16_numeric {
       simdutf_really_inline simd16 operator<(const simd16 other) const { return _mm_cmpgt_epi16(other, *this); }
     };
     
    -// Unsigned words
    +// Unsigned code units
     template<>
     struct simd16: base16_numeric  {
       simdutf_really_inline simd16() : base16_numeric() {}
    @@ -3140,7 +3162,7 @@ struct simd16: base16_numeric  {
         return _mm_shuffle_epi8(*this, swap);
       }
     
    -  // Pack with the unsigned saturation  two uint16_t words into single uint8_t vector
    +  // Pack with the unsigned saturation  two uint16_t code units into single uint8_t vector
       static simdutf_really_inline simd8 pack(const simd16& v0, const simd16& v1) {
         return _mm_packus_epi16(v0, v1);
       }
    @@ -3183,10 +3205,10 @@ template
         }
     
         simdutf_really_inline uint64_t to_bitmask() const {
    -      uint64_t r0 = uint32_t(this->chunks[0].to_bitmask() );
    -      uint64_t r1 =          this->chunks[1].to_bitmask() ;
    -      uint64_t r2 =          this->chunks[2].to_bitmask() ;
    -      uint64_t r3 =          this->chunks[3].to_bitmask() ;
    +      uint64_t r0 = uint32_t(this->chunks[0].to_bitmask());
    +      uint64_t r1 =          this->chunks[1].to_bitmask();
    +      uint64_t r2 =          this->chunks[2].to_bitmask();
    +      uint64_t r3 =          this->chunks[3].to_bitmask();
           return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48);
         }
     
    @@ -3267,7 +3289,6 @@ template
     #endif // SIMDUTF_WESTMERE_SIMD_INPUT_H
     /* end file src/simdutf/westmere/simd.h */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/westmere/end.h
     /* begin file src/simdutf/westmere/end.h */
     #if SIMDUTF_CAN_ALWAYS_RUN_WESTMERE
     // nothing needed.
    @@ -3280,7 +3301,6 @@ SIMDUTF_UNTARGET_REGION
     #endif // SIMDUTF_IMPLEMENTATION_WESTMERE
     #endif // SIMDUTF_WESTMERE_COMMON_H
     /* end file src/simdutf/westmere.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/ppc64.h
     /* begin file src/simdutf/ppc64.h */
     #ifndef SIMDUTF_PPC64_H
     #define SIMDUTF_PPC64_H
    @@ -3307,7 +3327,6 @@ namespace ppc64 {
     } // namespace ppc64
     } // namespace simdutf
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/ppc64/implementation.h
     /* begin file src/simdutf/ppc64/implementation.h */
     #ifndef SIMDUTF_PPC64_IMPLEMENTATION_H
     #define SIMDUTF_PPC64_IMPLEMENTATION_H
    @@ -3386,14 +3405,12 @@ class implementation final : public simdutf::implementation {
     #endif // SIMDUTF_PPC64_IMPLEMENTATION_H
     /* end file src/simdutf/ppc64/implementation.h */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/ppc64/begin.h
     /* begin file src/simdutf/ppc64/begin.h */
     // redefining SIMDUTF_IMPLEMENTATION to "ppc64"
     // #define SIMDUTF_IMPLEMENTATION ppc64
     /* end file src/simdutf/ppc64/begin.h */
     
     // Declarations
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/ppc64/intrinsics.h
     /* begin file src/simdutf/ppc64/intrinsics.h */
     #ifndef SIMDUTF_PPC64_INTRINSICS_H
     #define SIMDUTF_PPC64_INTRINSICS_H
    @@ -3414,7 +3431,6 @@ class implementation final : public simdutf::implementation {
     
     #endif //  SIMDUTF_PPC64_INTRINSICS_H
     /* end file src/simdutf/ppc64/intrinsics.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/ppc64/bitmanipulation.h
     /* begin file src/simdutf/ppc64/bitmanipulation.h */
     #ifndef SIMDUTF_PPC64_BITMANIPULATION_H
     #define SIMDUTF_PPC64_BITMANIPULATION_H
    @@ -3440,7 +3456,6 @@ simdutf_really_inline int count_ones(uint64_t input_num) {
     
     #endif // SIMDUTF_PPC64_BITMANIPULATION_H
     /* end file src/simdutf/ppc64/bitmanipulation.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/ppc64/simd.h
     /* begin file src/simdutf/ppc64/simd.h */
     #ifndef SIMDUTF_PPC64_SIMD_H
     #define SIMDUTF_PPC64_SIMD_H
    @@ -3932,7 +3947,6 @@ template  struct simd8x64 {
     #endif // SIMDUTF_PPC64_SIMD_INPUT_H
     /* end file src/simdutf/ppc64/simd.h */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/ppc64/end.h
     /* begin file src/simdutf/ppc64/end.h */
     /* end file src/simdutf/ppc64/end.h */
     
    @@ -3940,7 +3954,6 @@ template  struct simd8x64 {
     
     #endif // SIMDUTF_PPC64_H
     /* end file src/simdutf/ppc64.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/fallback.h
     /* begin file src/simdutf/fallback.h */
     #ifndef SIMDUTF_FALLBACK_H
     #define SIMDUTF_FALLBACK_H
    @@ -3969,7 +3982,6 @@ namespace fallback {
     } // namespace fallback
     } // namespace simdutf
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/fallback/implementation.h
     /* begin file src/simdutf/fallback/implementation.h */
     #ifndef SIMDUTF_FALLBACK_IMPLEMENTATION_H
     #define SIMDUTF_FALLBACK_IMPLEMENTATION_H
    @@ -4000,6 +4012,13 @@ class implementation final : public simdutf::implementation {
       simdutf_warn_unused result validate_utf16be_with_errors(const char16_t *buf, size_t len) const noexcept final;
       simdutf_warn_unused bool validate_utf32(const char32_t *buf, size_t len) const noexcept final;
       simdutf_warn_unused result validate_utf32_with_errors(const char32_t *buf, size_t len) const noexcept final;
    +  simdutf_warn_unused size_t convert_latin1_to_utf8(const char * buf, size_t len, char* utf8_output) const noexcept final;
    +  simdutf_warn_unused size_t convert_latin1_to_utf16le(const char * buf, size_t len, char16_t* utf16_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_latin1_to_utf16be(const char * buf, size_t len, char16_t* utf16_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_latin1_to_utf32(const char * buf, size_t len, char32_t* utf32_output) const noexcept final;
    +  simdutf_warn_unused size_t convert_utf8_to_latin1(const char * buf, size_t len, char* latin1_output) const noexcept final;
    +  simdutf_warn_unused result convert_utf8_to_latin1_with_errors(const char * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_valid_utf8_to_latin1(const char * buf, size_t len, char* latin1_output) const noexcept final;
       simdutf_warn_unused size_t convert_utf8_to_utf16le(const char * buf, size_t len, char16_t* utf16_output) const noexcept final;
       simdutf_warn_unused size_t convert_utf8_to_utf16be(const char * buf, size_t len, char16_t* utf16_output) const noexcept final;
       simdutf_warn_unused result convert_utf8_to_utf16le_with_errors(const char * buf, size_t len, char16_t* utf16_output) const noexcept final;
    @@ -4009,6 +4028,12 @@ class implementation final : public simdutf::implementation {
       simdutf_warn_unused size_t convert_utf8_to_utf32(const char * buf, size_t len, char32_t* utf32_output) const noexcept final;
       simdutf_warn_unused result convert_utf8_to_utf32_with_errors(const char * buf, size_t len, char32_t* utf32_output) const noexcept final;
       simdutf_warn_unused size_t convert_valid_utf8_to_utf32(const char * buf, size_t len, char32_t* utf32_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_utf16le_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_utf16be_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused result convert_utf16le_to_latin1_with_errors(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused result convert_utf16be_to_latin1_with_errors(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_valid_utf16le_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_valid_utf16be_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) const noexcept final;
       simdutf_warn_unused size_t convert_utf16le_to_utf8(const char16_t * buf, size_t len, char* utf8_buffer) const noexcept final;
       simdutf_warn_unused size_t convert_utf16be_to_utf8(const char16_t * buf, size_t len, char* utf8_buffer) const noexcept final;
       simdutf_warn_unused result convert_utf16le_to_utf8_with_errors(const char16_t * buf, size_t len, char* utf8_buffer) const noexcept final;
    @@ -4018,6 +4043,9 @@ class implementation final : public simdutf::implementation {
       simdutf_warn_unused size_t convert_utf32_to_utf8(const char32_t * buf, size_t len, char* utf8_buffer) const noexcept final;
       simdutf_warn_unused result convert_utf32_to_utf8_with_errors(const char32_t * buf, size_t len, char* utf8_buffer) const noexcept final;
       simdutf_warn_unused size_t convert_valid_utf32_to_utf8(const char32_t * buf, size_t len, char* utf8_buffer) const noexcept final;
    +  simdutf_warn_unused size_t convert_utf32_to_latin1(const char32_t * buf, size_t len, char* latin1_output) const noexcept final;
    +  simdutf_warn_unused result convert_utf32_to_latin1_with_errors(const char32_t * buf, size_t len, char* latin1_output) const noexcept final;
    +  simdutf_warn_unused size_t convert_valid_utf32_to_latin1(const char32_t * buf, size_t len, char* latin1_output) const noexcept final;
       simdutf_warn_unused size_t convert_utf32_to_utf16le(const char32_t * buf, size_t len, char16_t* utf16_buffer) const noexcept final;
       simdutf_warn_unused size_t convert_utf32_to_utf16be(const char32_t * buf, size_t len, char16_t* utf16_buffer) const noexcept final;
       simdutf_warn_unused result convert_utf32_to_utf16le_with_errors(const char32_t * buf, size_t len, char16_t* utf16_buffer) const noexcept final;
    @@ -4042,7 +4070,12 @@ class implementation final : public simdutf::implementation {
       simdutf_warn_unused size_t utf8_length_from_utf32(const char32_t * input, size_t length) const noexcept;
       simdutf_warn_unused size_t utf16_length_from_utf32(const char32_t * input, size_t length) const noexcept;
       simdutf_warn_unused size_t utf32_length_from_utf8(const char * input, size_t length) const noexcept;
    -};
    +  simdutf_warn_unused size_t latin1_length_from_utf8(const char * input, size_t length) const noexcept;
    +  simdutf_warn_unused size_t latin1_length_from_utf16(size_t length) const noexcept;
    +  simdutf_warn_unused size_t latin1_length_from_utf32(size_t length) const noexcept;
    +  simdutf_warn_unused size_t utf32_length_from_latin1(size_t length) const noexcept;
    +  simdutf_warn_unused size_t utf16_length_from_latin1(size_t length) const noexcept;
    +  simdutf_warn_unused size_t utf8_length_from_latin1(const char * input, size_t length) const noexcept;};
     
     } // namespace fallback
     } // namespace simdutf
    @@ -4050,14 +4083,12 @@ class implementation final : public simdutf::implementation {
     #endif // SIMDUTF_FALLBACK_IMPLEMENTATION_H
     /* end file src/simdutf/fallback/implementation.h */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/fallback/begin.h
     /* begin file src/simdutf/fallback/begin.h */
     // redefining SIMDUTF_IMPLEMENTATION to "fallback"
     // #define SIMDUTF_IMPLEMENTATION fallback
     /* end file src/simdutf/fallback/begin.h */
     
     // Declarations
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/fallback/bitmanipulation.h
     /* begin file src/simdutf/fallback/bitmanipulation.h */
     #ifndef SIMDUTF_FALLBACK_BITMANIPULATION_H
     #define SIMDUTF_FALLBACK_BITMANIPULATION_H
    @@ -4068,23 +4099,6 @@ namespace simdutf {
     namespace fallback {
     namespace {
     
    -#if defined(_MSC_VER) && !defined(_M_ARM64) && !defined(_M_X64)
    -static inline unsigned char _BitScanForward64(unsigned long* ret, uint64_t x) {
    -  unsigned long x0 = (unsigned long)x, top, bottom;
    -  _BitScanForward(&top, (unsigned long)(x >> 32));
    -  _BitScanForward(&bottom, x0);
    -  *ret = x0 ? bottom : 32 + top;
    -  return x != 0;
    -}
    -static unsigned char _BitScanReverse64(unsigned long* ret, uint64_t x) {
    -  unsigned long x1 = (unsigned long)(x >> 32), top, bottom;
    -  _BitScanReverse(&top, x1);
    -  _BitScanReverse(&bottom, (unsigned long)x);
    -  *ret = x1 ? top + 32 : bottom;
    -  return x != 0;
    -}
    -#endif
    -
     } // unnamed namespace
     } // namespace fallback
     } // namespace simdutf
    @@ -4092,7 +4106,6 @@ static unsigned char _BitScanReverse64(unsigned long* ret, uint64_t x) {
     #endif // SIMDUTF_FALLBACK_BITMANIPULATION_H
     /* end file src/simdutf/fallback/bitmanipulation.h */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/fallback/end.h
     /* begin file src/simdutf/fallback/end.h */
     /* end file src/simdutf/fallback/end.h */
     
    @@ -4100,98 +4113,457 @@ static unsigned char _BitScanReverse64(unsigned long* ret, uint64_t x) {
     #endif // SIMDUTF_FALLBACK_H
     /* end file src/simdutf/fallback.h */
     
    +/* begin file src/scalar/utf8.h */
    +#ifndef SIMDUTF_UTF8_H
    +#define SIMDUTF_UTF8_H
    +
     namespace simdutf {
    -bool implementation::supported_by_runtime_system() const {
    -  uint32_t required_instruction_sets = this->required_instruction_sets();
    -  uint32_t supported_instruction_sets = internal::detect_supported_architectures();
    -  return ((supported_instruction_sets & required_instruction_sets) == required_instruction_sets);
    -}
    +namespace scalar {
    +namespace {
    +namespace utf8 {
    +#if SIMDUTF_IMPLEMENTATION_FALLBACK
    +// only used by the fallback kernel.
    +// credit: based on code from Google Fuchsia (Apache Licensed)
    +inline simdutf_warn_unused bool validate(const char *buf, size_t len) noexcept {
    +  const uint8_t *data = reinterpret_cast(buf);
    +  uint64_t pos = 0;
    +  uint32_t code_point = 0;
    +  while (pos < len) {
    +    // check of the next 16 bytes are ascii.
    +    uint64_t next_pos = pos + 16;
    +    if (next_pos <= len) { // if it is safe to read 16 more bytes, check that they are ascii
    +      uint64_t v1;
    +      std::memcpy(&v1, data + pos, sizeof(uint64_t));
    +      uint64_t v2;
    +      std::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t));
    +      uint64_t v{v1 | v2};
    +      if ((v & 0x8080808080808080) == 0) {
    +        pos = next_pos;
    +        continue;
    +      }
    +    }
    +    unsigned char byte = data[pos];
     
    -simdutf_warn_unused encoding_type implementation::autodetect_encoding(const char * input, size_t length) const noexcept {
    -    // If there is a BOM, then we trust it.
    -    auto bom_encoding = simdutf::BOM::check_bom(input, length);
    -    if(bom_encoding != encoding_type::unspecified) { return bom_encoding; }
    -    // UTF8 is common, it includes ASCII, and is commonly represented
    -    // without a BOM, so if it fits, go with that. Note that it is still
    -    // possible to get it wrong, we are only 'guessing'. If some has UTF-16
    -    // data without a BOM, it could pass as UTF-8.
    -    //
    -    // An interesting twist might be to check for UTF-16 ASCII first (every
    -    // other byte is zero).
    -    if(validate_utf8(input, length)) { return encoding_type::UTF8; }
    -    // The next most common encoding that might appear without BOM is probably
    -    // UTF-16LE, so try that next.
    -    if((length % 2) == 0) {
    -      // important: we need to divide by two
    -      if(validate_utf16le(reinterpret_cast(input), length/2)) { return encoding_type::UTF16_LE; }
    +    while (byte < 0b10000000) {
    +      if (++pos == len) { return true; }
    +      byte = data[pos];
         }
    -    if((length % 4) == 0) {
    -      if(validate_utf32(reinterpret_cast(input), length/4)) { return encoding_type::UTF32_LE; }
    +
    +    if ((byte & 0b11100000) == 0b11000000) {
    +      next_pos = pos + 2;
    +      if (next_pos > len) { return false; }
    +      if ((data[pos + 1] & 0b11000000) != 0b10000000) { return false; }
    +      // range check
    +      code_point = (byte & 0b00011111) << 6 | (data[pos + 1] & 0b00111111);
    +      if ((code_point < 0x80) || (0x7ff < code_point)) { return false; }
    +    } else if ((byte & 0b11110000) == 0b11100000) {
    +      next_pos = pos + 3;
    +      if (next_pos > len) { return false; }
    +      if ((data[pos + 1] & 0b11000000) != 0b10000000) { return false; }
    +      if ((data[pos + 2] & 0b11000000) != 0b10000000) { return false; }
    +      // range check
    +      code_point = (byte & 0b00001111) << 12 |
    +                   (data[pos + 1] & 0b00111111) << 6 |
    +                   (data[pos + 2] & 0b00111111);
    +      if ((code_point < 0x800) || (0xffff < code_point) ||
    +          (0xd7ff < code_point && code_point < 0xe000)) {
    +        return false;
    +      }
    +    } else if ((byte & 0b11111000) == 0b11110000) { // 0b11110000
    +      next_pos = pos + 4;
    +      if (next_pos > len) { return false; }
    +      if ((data[pos + 1] & 0b11000000) != 0b10000000) { return false; }
    +      if ((data[pos + 2] & 0b11000000) != 0b10000000) { return false; }
    +      if ((data[pos + 3] & 0b11000000) != 0b10000000) { return false; }
    +      // range check
    +      code_point =
    +          (byte & 0b00000111) << 18 | (data[pos + 1] & 0b00111111) << 12 |
    +          (data[pos + 2] & 0b00111111) << 6 | (data[pos + 3] & 0b00111111);
    +      if (code_point <= 0xffff || 0x10ffff < code_point) { return false; }
    +    } else {
    +      // we may have a continuation
    +      return false;
         }
    -    return encoding_type::unspecified;
    +    pos = next_pos;
    +  }
    +  return true;
     }
    -
    -namespace internal {
    -
    -// Static array of known implementations. We're hoping these get baked into the executable
    -// without requiring a static initializer.
    -
    -
    -#if SIMDUTF_IMPLEMENTATION_ICELAKE
    -const icelake::implementation icelake_singleton{};
    -#endif
    -#if SIMDUTF_IMPLEMENTATION_HASWELL
    -const haswell::implementation haswell_singleton{};
    -#endif
    -#if SIMDUTF_IMPLEMENTATION_WESTMERE
    -const westmere::implementation westmere_singleton{};
     #endif
    -#if SIMDUTF_IMPLEMENTATION_ARM64
    -const arm64::implementation arm64_singleton{};
    -#endif
    -#if SIMDUTF_IMPLEMENTATION_PPC64
    -const ppc64::implementation ppc64_singleton{};
    -#endif
    -#if SIMDUTF_IMPLEMENTATION_FALLBACK
    -const fallback::implementation fallback_singleton{};
    -#endif
    -
    -/**
    - * @private Detects best supported implementation on first use, and sets it
    - */
    -class detect_best_supported_implementation_on_first_use final : public implementation {
    -public:
    -  const std::string &name() const noexcept final { return set_best()->name(); }
    -  const std::string &description() const noexcept final { return set_best()->description(); }
    -  uint32_t required_instruction_sets() const noexcept final { return set_best()->required_instruction_sets(); }
     
    -  simdutf_warn_unused int detect_encodings(const char * input, size_t length) const noexcept override {
    -    return set_best()->detect_encodings(input, length);
    -  }
    +inline simdutf_warn_unused result validate_with_errors(const char *buf, size_t len) noexcept {
    +  const uint8_t *data = reinterpret_cast(buf);
    +  size_t pos = 0;
    +  uint32_t code_point = 0;
    +  while (pos < len) {
    +    // check of the next 16 bytes are ascii.
    +    size_t next_pos = pos + 16;
    +    if (next_pos <= len) { // if it is safe to read 16 more bytes, check that they are ascii
    +      uint64_t v1;
    +      std::memcpy(&v1, data + pos, sizeof(uint64_t));
    +      uint64_t v2;
    +      std::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t));
    +      uint64_t v{v1 | v2};
    +      if ((v & 0x8080808080808080) == 0) {
    +        pos = next_pos;
    +        continue;
    +      }
    +    }
    +    unsigned char byte = data[pos];
     
    -  simdutf_warn_unused bool validate_utf8(const char * buf, size_t len) const noexcept final override {
    -    return set_best()->validate_utf8(buf, len);
    -  }
    +    while (byte < 0b10000000) {
    +      if (++pos == len) { return result(error_code::SUCCESS, len); }
    +      byte = data[pos];
    +    }
     
    -  simdutf_warn_unused result validate_utf8_with_errors(const char * buf, size_t len) const noexcept final override {
    -    return set_best()->validate_utf8_with_errors(buf, len);
    +    if ((byte & 0b11100000) == 0b11000000) {
    +      next_pos = pos + 2;
    +      if (next_pos > len) { return result(error_code::TOO_SHORT, pos); }
    +      if ((data[pos + 1] & 0b11000000) != 0b10000000) { return result(error_code::TOO_SHORT, pos); }
    +      // range check
    +      code_point = (byte & 0b00011111) << 6 | (data[pos + 1] & 0b00111111);
    +      if ((code_point < 0x80) || (0x7ff < code_point)) { return result(error_code::OVERLONG, pos); }
    +    } else if ((byte & 0b11110000) == 0b11100000) {
    +      next_pos = pos + 3;
    +      if (next_pos > len) { return result(error_code::TOO_SHORT, pos); }
    +      if ((data[pos + 1] & 0b11000000) != 0b10000000) { return result(error_code::TOO_SHORT, pos); }
    +      if ((data[pos + 2] & 0b11000000) != 0b10000000) { return result(error_code::TOO_SHORT, pos); }
    +      // range check
    +      code_point = (byte & 0b00001111) << 12 |
    +                   (data[pos + 1] & 0b00111111) << 6 |
    +                   (data[pos + 2] & 0b00111111);
    +      if ((code_point < 0x800) || (0xffff < code_point)) { return result(error_code::OVERLONG, pos);}
    +      if (0xd7ff < code_point && code_point < 0xe000) { return result(error_code::SURROGATE, pos); }
    +    } else if ((byte & 0b11111000) == 0b11110000) { // 0b11110000
    +      next_pos = pos + 4;
    +      if (next_pos > len) { return result(error_code::TOO_SHORT, pos); }
    +      if ((data[pos + 1] & 0b11000000) != 0b10000000) { return result(error_code::TOO_SHORT, pos); }
    +      if ((data[pos + 2] & 0b11000000) != 0b10000000) { return result(error_code::TOO_SHORT, pos); }
    +      if ((data[pos + 3] & 0b11000000) != 0b10000000) { return result(error_code::TOO_SHORT, pos); }
    +      // range check
    +      code_point =
    +          (byte & 0b00000111) << 18 | (data[pos + 1] & 0b00111111) << 12 |
    +          (data[pos + 2] & 0b00111111) << 6 | (data[pos + 3] & 0b00111111);
    +      if (code_point <= 0xffff) { return result(error_code::OVERLONG, pos); }
    +      if (0x10ffff < code_point) { return result(error_code::TOO_LARGE, pos); }
    +    } else {
    +      // we either have too many continuation bytes or an invalid leading byte
    +      if ((byte & 0b11000000) == 0b10000000) { return result(error_code::TOO_LONG, pos); }
    +      else { return result(error_code::HEADER_BITS, pos); }
    +    }
    +    pos = next_pos;
       }
    +  return result(error_code::SUCCESS, len);
    +}
     
    -  simdutf_warn_unused bool validate_ascii(const char * buf, size_t len) const noexcept final override {
    -    return set_best()->validate_ascii(buf, len);
    +// Finds the previous leading byte starting backward from buf and validates with errors from there
    +// Used to pinpoint the location of an error when an invalid chunk is detected
    +// We assume that the stream starts with a leading byte, and to check that it is the case, we
    +// ask that you pass a pointer to the start of the stream (start).
    +inline simdutf_warn_unused result rewind_and_validate_with_errors(const char *start, const char *buf, size_t len) noexcept {
    +    // First check that we start with a leading byte
    +  if ((*start & 0b11000000) == 0b10000000) {
    +    return result(error_code::TOO_LONG, 0);
       }
    -
    -  simdutf_warn_unused result validate_ascii_with_errors(const char * buf, size_t len) const noexcept final override {
    -    return set_best()->validate_ascii_with_errors(buf, len);
    +  size_t extra_len{0};
    +  // A leading byte cannot be further than 4 bytes away
    +  for(int i = 0; i < 5; i++) {
    +    unsigned char byte = *buf;
    +    if ((byte & 0b11000000) != 0b10000000) {
    +      break;
    +    } else {
    +      buf--;
    +      extra_len++;
    +    }
       }
     
    -  simdutf_warn_unused bool validate_utf16le(const char16_t * buf, size_t len) const noexcept final override {
    -    return set_best()->validate_utf16le(buf, len);
    -  }
    +  result res = validate_with_errors(buf, len + extra_len);
    +  res.count -= extra_len;
    +  return res;
    +}
     
    -  simdutf_warn_unused bool validate_utf16be(const char16_t * buf, size_t len) const noexcept final override {
    -    return set_best()->validate_utf16be(buf, len);
    -  }
    +inline size_t count_code_points(const char* buf, size_t len) {
    +    const int8_t * p = reinterpret_cast(buf);
    +    size_t counter{0};
    +    for(size_t i = 0; i < len; i++) {
    +        // -65 is 0b10111111, anything larger in two-complement's should start a new code point.
    +        if(p[i] > -65) { counter++; }
    +    }
    +    return counter;
    +}
    +
    +inline size_t utf16_length_from_utf8(const char* buf, size_t len) {
    +    const int8_t * p = reinterpret_cast(buf);
    +    size_t counter{0};
    +    for(size_t i = 0; i < len; i++) {
    +        if(p[i] > -65) { counter++; }
    +        if(uint8_t(p[i]) >= 240) { counter++; }
    +    }
    +    return counter;
    +}
    +
    +simdutf_warn_unused inline size_t trim_partial_utf8(const char *input, size_t length) {
    +  if (length < 3) {
    +    switch (length) {
    +      case 2:
    +        if (uint8_t(input[length-1]) >= 0xc0) { return length-1; } // 2-, 3- and 4-byte characters with only 1 byte left
    +        if (uint8_t(input[length-2]) >= 0xe0) { return length-2; } // 3- and 4-byte characters with only 2 bytes left
    +        return length;
    +      case 1:
    +        if (uint8_t(input[length-1]) >= 0xc0) { return length-1; } // 2-, 3- and 4-byte characters with only 1 byte left
    +        return length;
    +      case 0:
    +        return length;
    +    }
    +  }
    +  if (uint8_t(input[length-1]) >= 0xc0) { return length-1; } // 2-, 3- and 4-byte characters with only 1 byte left
    +  if (uint8_t(input[length-2]) >= 0xe0) { return length-2; } // 3- and 4-byte characters with only 1 byte left
    +  if (uint8_t(input[length-3]) >= 0xf0) { return length-3; } // 4-byte characters with only 3 bytes left
    +  return length;
    +}
    +
    +} // utf8 namespace
    +} // unnamed namespace
    +} // namespace scalar
    +} // namespace simdutf
    +
    +#endif
    +/* end file src/scalar/utf8.h */
    +/* begin file src/scalar/utf16.h */
    +#ifndef SIMDUTF_UTF16_H
    +#define SIMDUTF_UTF16_H
    +
    +namespace simdutf {
    +namespace scalar {
    +namespace {
    +namespace utf16 {
    +
    +inline simdutf_warn_unused uint16_t swap_bytes(const uint16_t word) {
    +  return uint16_t((word >> 8) | (word << 8));
    +}
    +
    +template 
    +inline simdutf_warn_unused bool validate(const char16_t *buf, size_t len) noexcept {
    +  const uint16_t *data = reinterpret_cast(buf);
    +  uint64_t pos = 0;
    +  while (pos < len) {
    +    uint16_t word = !match_system(big_endian) ? swap_bytes(data[pos]) : data[pos];
    +    if((word &0xF800) == 0xD800) {
    +        if(pos + 1 >= len) { return false; }
    +        uint16_t diff = uint16_t(word - 0xD800);
    +        if(diff > 0x3FF) { return false; }
    +        uint16_t next_word = !match_system(big_endian) ? swap_bytes(data[pos + 1]) : data[pos + 1];
    +        uint16_t diff2 = uint16_t(next_word - 0xDC00);
    +        if(diff2 > 0x3FF) { return false; }
    +        pos += 2;
    +    } else {
    +        pos++;
    +    }
    +  }
    +  return true;
    +}
    +
    +template 
    +inline simdutf_warn_unused result validate_with_errors(const char16_t *buf, size_t len) noexcept {
    +  const uint16_t *data = reinterpret_cast(buf);
    +  size_t pos = 0;
    +  while (pos < len) {
    +    uint16_t word = !match_system(big_endian) ? swap_bytes(data[pos]) : data[pos];
    +    if((word & 0xF800) == 0xD800) {
    +        if(pos + 1 >= len) { return result(error_code::SURROGATE, pos); }
    +        uint16_t diff = uint16_t(word - 0xD800);
    +        if(diff > 0x3FF) { return result(error_code::SURROGATE, pos); }
    +        uint16_t next_word = !match_system(big_endian) ? swap_bytes(data[pos + 1]) : data[pos + 1];
    +        uint16_t diff2 = uint16_t(next_word - 0xDC00);
    +        if(diff2 > 0x3FF) { return result(error_code::SURROGATE, pos); }
    +        pos += 2;
    +    } else {
    +        pos++;
    +    }
    +  }
    +  return result(error_code::SUCCESS, pos);
    +}
    +
    +template 
    +inline size_t count_code_points(const char16_t* buf, size_t len) {
    +  // We are not BOM aware.
    +  const uint16_t * p = reinterpret_cast(buf);
    +  size_t counter{0};
    +  for(size_t i = 0; i < len; i++) {
    +    uint16_t word = !match_system(big_endian) ? swap_bytes(p[i]) : p[i];
    +    counter += ((word & 0xFC00) != 0xDC00);
    +  }
    +  return counter;
    +}
    +
    +template 
    +inline size_t utf8_length_from_utf16(const char16_t* buf, size_t len) {
    +  // We are not BOM aware.
    +  const uint16_t * p = reinterpret_cast(buf);
    +  size_t counter{0};
    +  for(size_t i = 0; i < len; i++) {
    +    uint16_t word = !match_system(big_endian) ? swap_bytes(p[i]) : p[i];
    +    counter++;                                      // ASCII
    +    counter += static_cast(word > 0x7F);    // non-ASCII is at least 2 bytes, surrogates are 2*2 == 4 bytes
    +    counter += static_cast((word > 0x7FF && word <= 0xD7FF) || (word >= 0xE000));   // three-byte
    +  }
    +  return counter;
    +}
    +
    +template 
    +inline size_t utf32_length_from_utf16(const char16_t* buf, size_t len) {
    +  // We are not BOM aware.
    +  const uint16_t * p = reinterpret_cast(buf);
    +  size_t counter{0};
    +  for(size_t i = 0; i < len; i++) {
    +    uint16_t word = !match_system(big_endian) ? swap_bytes(p[i]) : p[i];
    +    counter += ((word & 0xFC00) != 0xDC00);
    +  }
    +  return counter;
    +}
    +
    +
    +inline size_t latin1_length_from_utf16(size_t len) {
    +  return len;
    +}
    +
    +simdutf_really_inline void change_endianness_utf16(const char16_t* in, size_t size, char16_t* out) {
    +  const uint16_t * input = reinterpret_cast(in);
    +  uint16_t * output = reinterpret_cast(out);
    +  for (size_t i = 0; i < size; i++) {
    +    *output++ = uint16_t(input[i] >> 8 | input[i] << 8);
    +  }
    +}
    +
    +
    +template 
    +simdutf_warn_unused inline size_t trim_partial_utf16(const char16_t* input, size_t length) {
    +  if (length <= 1) {
    +    return length;
    +  }
    +  uint16_t last_word = uint16_t(input[length-1]);
    +  last_word = !match_system(big_endian) ? swap_bytes(last_word) : last_word;
    +  length -= ((last_word & 0xFC00) == 0xD800);
    +  return length;
    +}
    +
    +} // utf16 namespace
    +} // unnamed namespace
    +} // namespace scalar
    +} // namespace simdutf
    +
    +#endif
    +/* end file src/scalar/utf16.h */
    +
    +namespace simdutf {
    +bool implementation::supported_by_runtime_system() const {
    +  uint32_t required_instruction_sets = this->required_instruction_sets();
    +  uint32_t supported_instruction_sets = internal::detect_supported_architectures();
    +  return ((supported_instruction_sets & required_instruction_sets) == required_instruction_sets);
    +}
    +
    +simdutf_warn_unused encoding_type implementation::autodetect_encoding(const char * input, size_t length) const noexcept {
    +    // If there is a BOM, then we trust it.
    +    auto bom_encoding = simdutf::BOM::check_bom(input, length);
    +    if(bom_encoding != encoding_type::unspecified) { return bom_encoding; }
    +    // UTF8 is common, it includes ASCII, and is commonly represented
    +    // without a BOM, so if it fits, go with that. Note that it is still
    +    // possible to get it wrong, we are only 'guessing'. If some has UTF-16
    +    // data without a BOM, it could pass as UTF-8.
    +    //
    +    // An interesting twist might be to check for UTF-16 ASCII first (every
    +    // other byte is zero).
    +    if(validate_utf8(input, length)) { return encoding_type::UTF8; }
    +    // The next most common encoding that might appear without BOM is probably
    +    // UTF-16LE, so try that next.
    +    if((length % 2) == 0) {
    +      // important: we need to divide by two
    +      if(validate_utf16le(reinterpret_cast(input), length/2)) { return encoding_type::UTF16_LE; }
    +    }
    +    if((length % 4) == 0) {
    +      if(validate_utf32(reinterpret_cast(input), length/4)) { return encoding_type::UTF32_LE; }
    +    }
    +    return encoding_type::unspecified;
    +}
    +
    +namespace internal {
    +
    +// Static array of known implementations. We're hoping these get baked into the executable
    +// without requiring a static initializer.
    +
    +
    +#if SIMDUTF_IMPLEMENTATION_ICELAKE
    +static const icelake::implementation* get_icelake_singleton() {
    +  static const icelake::implementation icelake_singleton{};
    +  return &icelake_singleton;
    +}
    +#endif
    +#if SIMDUTF_IMPLEMENTATION_HASWELL
    +static const haswell::implementation* get_haswell_singleton() {
    +  static const haswell::implementation haswell_singleton{};
    +  return &haswell_singleton;
    +}
    +#endif
    +#if SIMDUTF_IMPLEMENTATION_WESTMERE
    +static const westmere::implementation* get_westmere_singleton() {
    +  static const westmere::implementation westmere_singleton{};
    +  return &westmere_singleton;
    +}
    +#endif
    +#if SIMDUTF_IMPLEMENTATION_ARM64
    +static const arm64::implementation* get_arm64_singleton() {
    +  static const arm64::implementation arm64_singleton{};
    +  return &arm64_singleton;
    +}
    +#endif
    +#if SIMDUTF_IMPLEMENTATION_PPC64
    +static const ppc64::implementation* get_ppc64_singleton() {
    +  static const ppc64::implementation ppc64_singleton{};
    +  return &ppc64_singleton;
    +}
    +#endif
    +#if SIMDUTF_IMPLEMENTATION_FALLBACK
    +static const fallback::implementation* get_fallback_singleton() {
    +  static const fallback::implementation fallback_singleton{};
    +  return &fallback_singleton;
    +}
    +#endif
    +
    +/**
    + * @private Detects best supported implementation on first use, and sets it
    + */
    +class detect_best_supported_implementation_on_first_use final : public implementation {
    +public:
    +  const std::string &name() const noexcept final { return set_best()->name(); }
    +  const std::string &description() const noexcept final { return set_best()->description(); }
    +  uint32_t required_instruction_sets() const noexcept final { return set_best()->required_instruction_sets(); }
    +
    +  simdutf_warn_unused int detect_encodings(const char * input, size_t length) const noexcept override {
    +    return set_best()->detect_encodings(input, length);
    +  }
    +
    +  simdutf_warn_unused bool validate_utf8(const char * buf, size_t len) const noexcept final override {
    +    return set_best()->validate_utf8(buf, len);
    +  }
    +
    +  simdutf_warn_unused result validate_utf8_with_errors(const char * buf, size_t len) const noexcept final override {
    +    return set_best()->validate_utf8_with_errors(buf, len);
    +  }
    +
    +  simdutf_warn_unused bool validate_ascii(const char * buf, size_t len) const noexcept final override {
    +    return set_best()->validate_ascii(buf, len);
    +  }
    +
    +  simdutf_warn_unused result validate_ascii_with_errors(const char * buf, size_t len) const noexcept final override {
    +    return set_best()->validate_ascii_with_errors(buf, len);
    +  }
    +
    +  simdutf_warn_unused bool validate_utf16le(const char16_t * buf, size_t len) const noexcept final override {
    +    return set_best()->validate_utf16le(buf, len);
    +  }
    +
    +  simdutf_warn_unused bool validate_utf16be(const char16_t * buf, size_t len) const noexcept final override {
    +    return set_best()->validate_utf16be(buf, len);
    +  }
     
       simdutf_warn_unused result validate_utf16le_with_errors(const char16_t * buf, size_t len) const noexcept final override {
         return set_best()->validate_utf16le_with_errors(buf, len);
    @@ -4209,6 +4581,34 @@ class detect_best_supported_implementation_on_first_use final : public implement
         return set_best()->validate_utf32_with_errors(buf, len);
       }
     
    +  simdutf_warn_unused size_t convert_latin1_to_utf8(const char * buf, size_t len, char* utf8_output) const noexcept final override {
    +    return set_best()->convert_latin1_to_utf8(buf, len,utf8_output);
    +  }
    +
    +  simdutf_warn_unused size_t convert_latin1_to_utf16le(const char * buf, size_t len, char16_t* utf16_output) const noexcept final override {
    +    return set_best()->convert_latin1_to_utf16le(buf, len, utf16_output);
    +  }
    +
    +  simdutf_warn_unused size_t convert_latin1_to_utf16be(const char * buf, size_t len, char16_t* utf16_output) const noexcept final override {
    +    return set_best()->convert_latin1_to_utf16be(buf, len, utf16_output);
    +  }
    +
    +  simdutf_warn_unused size_t convert_latin1_to_utf32(const char * buf, size_t len, char32_t * latin1_output) const noexcept final override {
    +    return set_best()->convert_latin1_to_utf32(buf, len,latin1_output);
    +  }
    +
    +  simdutf_warn_unused size_t convert_utf8_to_latin1(const char * buf, size_t len, char* latin1_output) const noexcept final override {
    +    return set_best()->convert_utf8_to_latin1(buf, len,latin1_output);
    +  }
    +
    +  simdutf_warn_unused result convert_utf8_to_latin1_with_errors(const char* buf, size_t len, char* latin1_output) const noexcept  final override {
    +  return set_best()->convert_utf8_to_latin1_with_errors(buf, len, latin1_output);
    +  }
    +
    +  simdutf_warn_unused size_t convert_valid_utf8_to_latin1(const char * buf, size_t len, char* latin1_output) const noexcept final override {
    +    return set_best()->convert_valid_utf8_to_latin1(buf, len,latin1_output);
    +  }
    +
       simdutf_warn_unused size_t convert_utf8_to_utf16le(const char * buf, size_t len, char16_t* utf16_output) const noexcept final override {
         return set_best()->convert_utf8_to_utf16le(buf, len, utf16_output);
       }
    @@ -4245,6 +4645,30 @@ class detect_best_supported_implementation_on_first_use final : public implement
         return set_best()->convert_valid_utf8_to_utf32(buf, len, utf32_output);
       }
     
    +  simdutf_warn_unused size_t convert_utf16le_to_latin1(const char16_t * buf, size_t len, char* latin1_output) const noexcept final override {
    +    return set_best()->convert_utf16le_to_latin1(buf, len, latin1_output);
    +  }
    +
    +  simdutf_warn_unused size_t convert_utf16be_to_latin1(const char16_t * buf, size_t len, char* latin1_output) const noexcept final override {
    +    return set_best()->convert_utf16be_to_latin1(buf, len, latin1_output);
    +  }
    +
    +  simdutf_warn_unused result convert_utf16le_to_latin1_with_errors(const char16_t * buf, size_t len, char* latin1_output) const noexcept final override {
    +    return set_best()->convert_utf16le_to_latin1_with_errors(buf, len, latin1_output);
    +  }
    +
    +  simdutf_warn_unused result convert_utf16be_to_latin1_with_errors(const char16_t * buf, size_t len, char* latin1_output) const noexcept final override {
    +    return set_best()->convert_utf16be_to_latin1_with_errors(buf, len, latin1_output);
    +  }
    +
    +  simdutf_warn_unused size_t convert_valid_utf16le_to_latin1(const char16_t * buf, size_t len, char* latin1_output) const noexcept final override {
    +    return set_best()->convert_valid_utf16le_to_latin1(buf, len, latin1_output);
    +  }
    +
    +  simdutf_warn_unused size_t convert_valid_utf16be_to_latin1(const char16_t * buf, size_t len, char* latin1_output) const noexcept final override {
    +    return set_best()->convert_valid_utf16be_to_latin1(buf, len, latin1_output);
    +  }
    +
       simdutf_warn_unused size_t convert_utf16le_to_utf8(const char16_t * buf, size_t len, char* utf8_output) const noexcept final override {
         return set_best()->convert_utf16le_to_utf8(buf, len, utf8_output);
       }
    @@ -4269,8 +4693,20 @@ class detect_best_supported_implementation_on_first_use final : public implement
         return set_best()->convert_valid_utf16be_to_utf8(buf, len, utf8_output);
       }
     
    -  simdutf_warn_unused size_t convert_utf32_to_utf8(const char32_t * buf, size_t len, char* utf8_output) const noexcept final override {
    -    return set_best()->convert_utf32_to_utf8(buf, len, utf8_output);
    +  simdutf_warn_unused size_t convert_utf32_to_latin1(const char32_t * buf, size_t len, char* latin1_output) const noexcept final override {
    +    return set_best()->convert_utf32_to_latin1(buf, len,latin1_output);
    +  }
    +
    +  simdutf_warn_unused result convert_utf32_to_latin1_with_errors(const char32_t * buf, size_t len, char* latin1_output) const noexcept final override {
    +    return set_best()->convert_utf32_to_latin1_with_errors(buf, len,latin1_output);
    +  }
    +
    +  simdutf_warn_unused size_t convert_valid_utf32_to_latin1(const char32_t * buf, size_t len, char* latin1_output) const noexcept final override {
    +    return set_best()->convert_utf32_to_latin1(buf, len,latin1_output);
    +  }
    +
    +  simdutf_warn_unused size_t convert_utf32_to_utf8(const char32_t * buf, size_t len, char* utf8_output) const noexcept final override {
    +    return set_best()->convert_utf32_to_utf8(buf, len, utf8_output);
       }
     
       simdutf_warn_unused result convert_utf32_to_utf8_with_errors(const char32_t * buf, size_t len, char* utf8_output) const noexcept final override {
    @@ -4345,6 +4781,22 @@ class detect_best_supported_implementation_on_first_use final : public implement
         return set_best()->count_utf8(buf, len);
       }
     
    +  simdutf_warn_unused size_t latin1_length_from_utf8(const char * buf, size_t len) const noexcept override {
    +    return set_best()->latin1_length_from_utf8(buf, len);
    +  }
    +
    +  simdutf_warn_unused size_t latin1_length_from_utf16(size_t len) const noexcept override {
    +    return set_best()->latin1_length_from_utf16(len);
    +  }
    +
    +  simdutf_warn_unused size_t latin1_length_from_utf32(size_t len) const noexcept override {
    +    return set_best()->latin1_length_from_utf32(len);
    +  }
    +
    +  simdutf_warn_unused size_t utf8_length_from_latin1(const char * buf, size_t len) const noexcept override {
    +    return set_best()->utf8_length_from_latin1(buf, len);
    +  }
    +
       simdutf_warn_unused size_t utf8_length_from_utf16le(const char16_t * buf, size_t len) const noexcept override {
         return set_best()->utf8_length_from_utf16le(buf, len);
       }
    @@ -4353,6 +4805,14 @@ class detect_best_supported_implementation_on_first_use final : public implement
         return set_best()->utf8_length_from_utf16be(buf, len);
       }
     
    +  simdutf_warn_unused size_t utf16_length_from_latin1(size_t len) const noexcept override {
    +    return set_best()->utf16_length_from_latin1(len);
    +  }
    +
    +  simdutf_warn_unused size_t utf32_length_from_latin1(size_t len) const noexcept override {
    +    return set_best()->utf32_length_from_latin1(len);
    +  }
    +
       simdutf_warn_unused size_t utf32_length_from_utf16le(const char16_t * buf, size_t len) const noexcept override {
         return set_best()->utf32_length_from_utf16le(buf, len);
       }
    @@ -4383,27 +4843,29 @@ class detect_best_supported_implementation_on_first_use final : public implement
       const implementation *set_best() const noexcept;
     };
     
    -
    -const std::initializer_list available_implementation_pointers {
    +static const std::initializer_list& get_available_implementation_pointers() {
    +  static const std::initializer_list available_implementation_pointers {
     #if SIMDUTF_IMPLEMENTATION_ICELAKE
    -  &icelake_singleton,
    +    get_icelake_singleton(),
     #endif
     #if SIMDUTF_IMPLEMENTATION_HASWELL
    -  &haswell_singleton,
    +    get_haswell_singleton(),
     #endif
     #if SIMDUTF_IMPLEMENTATION_WESTMERE
    -  &westmere_singleton,
    +    get_westmere_singleton(),
     #endif
     #if SIMDUTF_IMPLEMENTATION_ARM64
    -  &arm64_singleton,
    +    get_arm64_singleton(),
     #endif
     #if SIMDUTF_IMPLEMENTATION_PPC64
    -  &ppc64_singleton,
    +    get_ppc64_singleton(),
     #endif
     #if SIMDUTF_IMPLEMENTATION_FALLBACK
    -  &fallback_singleton,
    +    get_fallback_singleton(),
     #endif
    -}; // available_implementation_pointers
    +  }; // available_implementation_pointers
    +  return available_implementation_pointers;
    +}
     
     // So we can return UNSUPPORTED_ARCHITECTURE from the parser when there is no support
     class unsupported_implementation final : public implementation {
    @@ -4459,6 +4921,34 @@ class unsupported_implementation final : public implementation {
         return result(error_code::OTHER, 0);
       }
     
    +  simdutf_warn_unused size_t convert_latin1_to_utf8(const char*, size_t, char*) const noexcept final override {
    +    return 0;
    +  }
    +
    +  simdutf_warn_unused size_t convert_latin1_to_utf16le(const char*, size_t, char16_t*) const noexcept final override {
    +    return 0;
    +  }
    +
    +  simdutf_warn_unused size_t convert_latin1_to_utf16be(const char*, size_t, char16_t*) const noexcept final override {
    +    return 0;
    +  }
    +
    +  simdutf_warn_unused size_t convert_latin1_to_utf32(const char*, size_t, char32_t*) const noexcept final override {
    +    return 0;
    +  }
    +
    +  simdutf_warn_unused size_t convert_utf8_to_latin1(const char*, size_t, char*) const noexcept final override {
    +    return 0;
    +  }
    +
    +  simdutf_warn_unused result convert_utf8_to_latin1_with_errors(const char*, size_t, char*) const noexcept final override {
    +    return result(error_code::OTHER, 0);
    +  }
    +
    +  simdutf_warn_unused size_t convert_valid_utf8_to_latin1(const char*, size_t, char*) const noexcept final override {
    +    return 0;
    +  }
    +
       simdutf_warn_unused size_t convert_utf8_to_utf16le(const char*, size_t, char16_t*) const noexcept final override {
         return 0;
       }
    @@ -4495,6 +4985,30 @@ class unsupported_implementation final : public implementation {
         return 0;
       }
     
    +  simdutf_warn_unused size_t convert_utf16le_to_latin1(const char16_t*, size_t, char*) const noexcept final override {
    +    return 0;
    +  }
    +
    +  simdutf_warn_unused size_t convert_utf16be_to_latin1(const char16_t*, size_t, char*) const noexcept final override {
    +    return 0;
    +  }
    +
    +  simdutf_warn_unused result convert_utf16le_to_latin1_with_errors(const char16_t*, size_t, char*) const noexcept final override {
    +    return result(error_code::OTHER, 0);
    +  }
    +
    +  simdutf_warn_unused result convert_utf16be_to_latin1_with_errors(const char16_t*, size_t, char*) const noexcept final override {
    +    return result(error_code::OTHER, 0);
    +  }
    +
    +  simdutf_warn_unused size_t convert_valid_utf16le_to_latin1(const char16_t*, size_t, char*) const noexcept final override {
    +    return 0;
    +  }
    +
    +  simdutf_warn_unused size_t convert_valid_utf16be_to_latin1(const char16_t*, size_t, char*) const noexcept final override {
    +    return 0;
    +  }
    +
       simdutf_warn_unused size_t convert_utf16le_to_utf8(const char16_t*, size_t, char*) const noexcept final override {
         return 0;
       }
    @@ -4519,6 +5033,18 @@ class unsupported_implementation final : public implementation {
         return 0;
       }
     
    +  simdutf_warn_unused size_t convert_utf32_to_latin1(const char32_t *, size_t, char* ) const noexcept final override {
    +    return 0;
    +  }
    +
    +  simdutf_warn_unused result convert_utf32_to_latin1_with_errors(const char32_t *, size_t, char* ) const noexcept final override {
    +    return result(error_code::OTHER, 0);
    +  }
    +
    +  simdutf_warn_unused size_t convert_valid_utf32_to_latin1(const char32_t *, size_t, char* ) const noexcept final override {
    +    return 0;
    +  }
    +
       simdutf_warn_unused size_t convert_utf32_to_utf8(const char32_t*, size_t, char*) const noexcept final override {
         return 0;
       }
    @@ -4595,6 +5121,21 @@ class unsupported_implementation final : public implementation {
         return 0;
       }
     
    +  simdutf_warn_unused size_t latin1_length_from_utf8(const char *, size_t) const noexcept override {
    +    return 0;
    +  }
    +
    +  simdutf_warn_unused size_t latin1_length_from_utf16(size_t) const noexcept override {
    +    return 0;
    +  }
    +
    +  simdutf_warn_unused size_t latin1_length_from_utf32(size_t) const noexcept override {
    +    return 0;
    +  }
    +  simdutf_warn_unused size_t utf8_length_from_latin1(const char *, size_t) const noexcept override {
    +    return 0;
    +  }
    +
       simdutf_warn_unused size_t utf8_length_from_utf16le(const char16_t *, size_t) const noexcept override {
         return 0;
       }
    @@ -4611,10 +5152,16 @@ class unsupported_implementation final : public implementation {
         return 0;
       }
     
    -  simdutf_warn_unused size_t utf16_length_from_utf8(const char *, size_t) const noexcept override {
    +    simdutf_warn_unused size_t utf32_length_from_latin1(size_t) const noexcept override {
         return 0;
       }
     
    +  simdutf_warn_unused size_t utf16_length_from_utf8(const char *, size_t) const noexcept override {
    +    return 0;
    +  }
    +  simdutf_warn_unused size_t utf16_length_from_latin1(size_t) const noexcept override {
    +    return 0;
    +  }
       simdutf_warn_unused size_t utf8_length_from_utf32(const char32_t *, size_t) const noexcept override {
         return 0;
       }
    @@ -4633,18 +5180,18 @@ class unsupported_implementation final : public implementation {
     const unsupported_implementation unsupported_singleton{};
     
     size_t available_implementation_list::size() const noexcept {
    -  return internal::available_implementation_pointers.size();
    +  return internal::get_available_implementation_pointers().size();
     }
     const implementation * const *available_implementation_list::begin() const noexcept {
    -  return internal::available_implementation_pointers.begin();
    +  return internal::get_available_implementation_pointers().begin();
     }
     const implementation * const *available_implementation_list::end() const noexcept {
    -  return internal::available_implementation_pointers.end();
    +  return internal::get_available_implementation_pointers().end();
     }
     const implementation *available_implementation_list::detect_best_supported() const noexcept {
       // They are prelisted in priority order, so we just go down the list
       uint32_t supported_instruction_sets = internal::detect_supported_architectures();
    -  for (const implementation *impl : internal::available_implementation_pointers) {
    +  for (const implementation *impl : internal::get_available_implementation_pointers()) {
         uint32_t required_instruction_sets = impl->required_instruction_sets();
         if ((supported_instruction_sets & required_instruction_sets) == required_instruction_sets) { return impl; }
       }
    @@ -4709,6 +5256,27 @@ simdutf_warn_unused size_t convert_utf8_to_utf16(const char * input, size_t leng
       return convert_utf8_to_utf16le(input, length, utf16_output);
       #endif
     }
    +simdutf_warn_unused size_t convert_latin1_to_utf8(const char * buf, size_t len, char* utf8_output) noexcept {
    +  return get_active_implementation()->convert_latin1_to_utf8(buf, len,utf8_output);
    +}
    +simdutf_warn_unused size_t convert_latin1_to_utf16le(const char * buf, size_t len, char16_t* utf16_output) noexcept {
    +  return get_active_implementation()->convert_latin1_to_utf16le(buf, len, utf16_output);
    +}
    +simdutf_warn_unused size_t convert_latin1_to_utf16be(const char * buf, size_t len, char16_t* utf16_output) noexcept{
    +  return get_active_implementation()->convert_latin1_to_utf16be(buf, len, utf16_output);
    +}
    +simdutf_warn_unused size_t convert_latin1_to_utf32(const char * buf, size_t len, char32_t * latin1_output) noexcept {
    +  return get_active_implementation()->convert_latin1_to_utf32(buf, len,latin1_output);
    +}
    +simdutf_warn_unused size_t convert_utf8_to_latin1(const char * buf, size_t len, char* latin1_output) noexcept {
    +  return get_active_implementation()->convert_utf8_to_latin1(buf, len,latin1_output);
    +}
    +simdutf_warn_unused result convert_utf8_to_latin1_with_errors(const char* buf, size_t len, char* latin1_output) noexcept {
    +  return get_active_implementation()->convert_utf8_to_latin1_with_errors(buf, len, latin1_output);
    +}
    +simdutf_warn_unused size_t convert_valid_utf8_to_latin1(const char * buf, size_t len, char* latin1_output) noexcept {
    +  return get_active_implementation()->convert_valid_utf8_to_latin1(buf, len,latin1_output);
    +}
     simdutf_warn_unused size_t convert_utf8_to_utf16le(const char * input, size_t length, char16_t* utf16_output) noexcept {
       return get_active_implementation()->convert_utf8_to_utf16le(input, length, utf16_output);
     }
    @@ -4789,6 +5357,38 @@ simdutf_warn_unused size_t convert_utf16_to_utf8(const char16_t * buf, size_t le
       return convert_utf16le_to_utf8(buf, len, utf8_buffer);
       #endif
     }
    +simdutf_warn_unused size_t convert_utf16_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) noexcept {
    +  #if SIMDUTF_IS_BIG_ENDIAN
    +  return convert_utf16be_to_latin1(buf, len, latin1_buffer);
    +  #else
    +  return convert_utf16le_to_latin1(buf, len, latin1_buffer);
    +  #endif
    +}
    +simdutf_warn_unused size_t convert_latin1_to_utf16(const char * buf, size_t len, char16_t* utf16_output) noexcept {
    +  #if SIMDUTF_IS_BIG_ENDIAN
    +  return convert_latin1_to_utf16be(buf, len, utf16_output);
    +  #else
    +  return convert_latin1_to_utf16le(buf, len, utf16_output);
    +  #endif
    +}
    +simdutf_warn_unused size_t convert_utf16be_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) noexcept {
    +  return get_active_implementation()->convert_utf16be_to_latin1(buf, len, latin1_buffer);
    +}
    +simdutf_warn_unused size_t convert_utf16le_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) noexcept {
    +  return get_active_implementation()->convert_utf16le_to_latin1(buf, len, latin1_buffer);
    +}
    +simdutf_warn_unused size_t convert_valid_utf16be_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) noexcept {
    +  return get_active_implementation()->convert_valid_utf16be_to_latin1(buf, len, latin1_buffer);
    +}
    +simdutf_warn_unused size_t convert_valid_utf16le_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) noexcept {
    +  return get_active_implementation()->convert_valid_utf16le_to_latin1(buf, len, latin1_buffer);
    +}
    +simdutf_warn_unused result convert_utf16le_to_latin1_with_errors(const char16_t * buf, size_t len, char* latin1_buffer) noexcept {
    +  return get_active_implementation()->convert_utf16le_to_latin1_with_errors(buf, len, latin1_buffer);
    +}
    +simdutf_warn_unused result convert_utf16be_to_latin1_with_errors(const char16_t * buf, size_t len, char* latin1_buffer) noexcept {
    +  return get_active_implementation()->convert_utf16be_to_latin1_with_errors(buf, len, latin1_buffer);
    +}
     simdutf_warn_unused size_t convert_utf16le_to_utf8(const char16_t * buf, size_t len, char* utf8_buffer) noexcept {
       return get_active_implementation()->convert_utf16le_to_utf8(buf, len, utf8_buffer);
     }
    @@ -4802,6 +5402,13 @@ simdutf_warn_unused result convert_utf16_to_utf8_with_errors(const char16_t * bu
       return convert_utf16le_to_utf8_with_errors(buf, len, utf8_buffer);
       #endif
     }
    +simdutf_warn_unused result convert_utf16_to_latin1_with_errors(const char16_t * buf, size_t len, char* latin1_buffer) noexcept {
    +  #if SIMDUTF_IS_BIG_ENDIAN
    +  return convert_utf16be_to_latin1_with_errors(buf, len, latin1_buffer);
    +  #else
    +  return convert_utf16le_to_latin1_with_errors(buf, len, latin1_buffer);
    +  #endif
    +}
     simdutf_warn_unused result convert_utf16le_to_utf8_with_errors(const char16_t * buf, size_t len, char* utf8_buffer) noexcept {
       return get_active_implementation()->convert_utf16le_to_utf8_with_errors(buf, len, utf8_buffer);
     }
    @@ -4815,6 +5422,13 @@ simdutf_warn_unused size_t convert_valid_utf16_to_utf8(const char16_t * buf, siz
       return convert_valid_utf16le_to_utf8(buf, len, utf8_buffer);
       #endif
     }
    +simdutf_warn_unused size_t convert_valid_utf16_to_latin1(const char16_t * buf, size_t len, char* latin1_buffer) noexcept {
    +  #if SIMDUTF_IS_BIG_ENDIAN
    +  return convert_valid_utf16be_to_latin1(buf, len, latin1_buffer);
    +  #else
    +  return convert_valid_utf16le_to_latin1(buf, len, latin1_buffer);
    +  #endif
    +}
     simdutf_warn_unused size_t convert_valid_utf16le_to_utf8(const char16_t * buf, size_t len, char* utf8_buffer) noexcept {
       return get_active_implementation()->convert_valid_utf16le_to_utf8(buf, len, utf8_buffer);
     }
    @@ -4837,6 +5451,9 @@ simdutf_warn_unused size_t convert_utf32_to_utf16(const char32_t * buf, size_t l
       return convert_utf32_to_utf16le(buf, len, utf16_buffer);
       #endif
     }
    +simdutf_warn_unused size_t convert_utf32_to_latin1(const char32_t * input, size_t length, char* latin1_output) noexcept {
    +  return get_active_implementation()->convert_utf32_to_latin1(input, length, latin1_output);
    +}
     simdutf_warn_unused size_t convert_utf32_to_utf16le(const char32_t * buf, size_t len, char16_t* utf16_buffer) noexcept {
       return get_active_implementation()->convert_utf32_to_utf16le(buf, len, utf16_buffer);
     }
    @@ -4927,6 +5544,18 @@ simdutf_warn_unused size_t count_utf16be(const char16_t * input, size_t length)
     simdutf_warn_unused size_t count_utf8(const char * input, size_t length) noexcept {
       return get_active_implementation()->count_utf8(input, length);
     }
    +simdutf_warn_unused size_t latin1_length_from_utf8(const char * buf, size_t len) noexcept {
    +  return get_active_implementation()->latin1_length_from_utf8(buf, len);
    +}
    +simdutf_warn_unused size_t latin1_length_from_utf16(size_t len) noexcept {
    +  return get_active_implementation()->latin1_length_from_utf16(len);
    +}
    +simdutf_warn_unused size_t latin1_length_from_utf32(size_t len) noexcept {
    +  return get_active_implementation()->latin1_length_from_utf32(len);
    +}
    +simdutf_warn_unused size_t utf8_length_from_latin1(const char * buf, size_t len) noexcept {
    +  return get_active_implementation()->utf8_length_from_latin1(buf, len);
    +}
     simdutf_warn_unused size_t utf8_length_from_utf16(const char16_t * input, size_t length) noexcept {
       #if SIMDUTF_IS_BIG_ENDIAN
       return utf8_length_from_utf16be(input, length);
    @@ -4956,6 +5585,9 @@ simdutf_warn_unused size_t utf32_length_from_utf16be(const char16_t * input, siz
     simdutf_warn_unused size_t utf16_length_from_utf8(const char * input, size_t length) noexcept {
       return get_active_implementation()->utf16_length_from_utf8(input, length);
     }
    +simdutf_warn_unused size_t utf16_length_from_latin1(size_t length) noexcept {
    +  return get_active_implementation()->utf16_length_from_latin1(length);
    +}
     simdutf_warn_unused size_t utf8_length_from_utf32(const char32_t * input, size_t length) noexcept {
       return get_active_implementation()->utf8_length_from_utf32(input, length);
     }
    @@ -4971,17 +5603,34 @@ simdutf_warn_unused simdutf::encoding_type autodetect_encoding(const char * buf,
     simdutf_warn_unused int detect_encodings(const char * buf, size_t length) noexcept {
       return get_active_implementation()->detect_encodings(buf, length);
     }
    -
     const implementation * builtin_implementation() {
       static const implementation * builtin_impl = get_available_implementations()[SIMDUTF_STRINGIFY(SIMDUTF_BUILTIN_IMPLEMENTATION)];
       return builtin_impl;
     }
     
    +simdutf_warn_unused size_t trim_partial_utf8(const char *input, size_t length) {
    +  return scalar::utf8::trim_partial_utf8(input, length);
    +}
    +
    +simdutf_warn_unused size_t trim_partial_utf16be(const char16_t* input, size_t length) {
    +  return scalar::utf16::trim_partial_utf16(input, length);
    +}
    +
    +simdutf_warn_unused size_t trim_partial_utf16le(const char16_t* input, size_t length) {
    +  return scalar::utf16::trim_partial_utf16(input, length);
    +}
    +
    +simdutf_warn_unused size_t trim_partial_utf16(const char16_t* input, size_t length) {
    +  #if SIMDUTF_IS_BIG_ENDIAN
    +  return trim_partial_utf16be(input, length);
    +  #else
    +  return trim_partial_utf16le(input, length);
    +  #endif
    +}
     
     } // namespace simdutf
     
     /* end file src/implementation.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=encoding_types.cpp
     /* begin file src/encoding_types.cpp */
     
     namespace simdutf {
    @@ -5043,19 +5692,17 @@ encoding_type check_bom(const char* byte, size_t length) {
     }
     }
     /* end file src/encoding_types.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=error.cpp
     /* begin file src/error.cpp */
     namespace simdutf {
     
    -  simdutf_really_inline result::result() : error{error_code::SUCCESS}, count{0} {};
    +  simdutf_really_inline result::result() : error{error_code::SUCCESS}, count{0} {}
     
    -  simdutf_really_inline result::result(error_code _err, size_t _pos) : error{_err}, count{_pos} {};
    +  simdutf_really_inline result::result(error_code _err, size_t _pos) : error{_err}, count{_pos} {}
     
     }
     /* end file src/error.cpp */
     // The large tables should be included once and they
     // should not depend on a kernel.
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=tables/utf8_to_utf16_tables.h
     /* begin file src/tables/utf8_to_utf16_tables.h */
     #ifndef SIMDUTF_UTF8_TO_UTF16_TABLES_H
     #define SIMDUTF_UTF8_TO_UTF16_TABLES_H
    @@ -9394,7 +10041,6 @@ const uint8_t utf8bigindex[4096][2] =
     
     #endif // SIMDUTF_UTF8_TO_UTF16_TABLES_H
     /* end file src/tables/utf8_to_utf16_tables.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=tables/utf16_to_utf8_tables.h
     /* begin file src/tables/utf16_to_utf8_tables.h */
     // file generated by scripts/sse_convert_utf16_to_utf8.py
     #ifndef SIMDUTF_UTF16_TO_UTF8_TABLES_H
    @@ -9935,7 +10581,6 @@ namespace utf16_to_utf8 {
     // End of tables.
     
     // The scalar routines should be included once.
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=scalar/ascii.h
     /* begin file src/scalar/ascii.h */
     #ifndef SIMDUTF_ASCII_H
     #define SIMDUTF_ASCII_H
    @@ -9950,7 +10595,7 @@ inline simdutf_warn_unused bool validate(const char *buf, size_t len) noexcept {
         const uint8_t *data = reinterpret_cast(buf);
         uint64_t pos = 0;
         // process in blocks of 16 bytes when possible
    -    for (;pos + 16 < len; pos += 16) {
    +    for (;pos + 16 <= len; pos += 16) {
             uint64_t v1;
             std::memcpy(&v1, data + pos, sizeof(uint64_t));
             uint64_t v2;
    @@ -9970,7 +10615,7 @@ inline simdutf_warn_unused result validate_with_errors(const char *buf, size_t l
         const uint8_t *data = reinterpret_cast(buf);
         size_t pos = 0;
         // process in blocks of 16 bytes when possible
    -    for (;pos + 16 < len; pos += 16) {
    +    for (;pos + 16 <= len; pos += 16) {
             uint64_t v1;
             std::memcpy(&v1, data + pos, sizeof(uint64_t));
             uint64_t v2;
    @@ -9996,379 +10641,106 @@ inline simdutf_warn_unused result validate_with_errors(const char *buf, size_t l
     
     #endif
     /* end file src/scalar/ascii.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=scalar/utf8.h
    -/* begin file src/scalar/utf8.h */
    -#ifndef SIMDUTF_UTF8_H
    -#define SIMDUTF_UTF8_H
    +/* begin file src/scalar/utf32.h */
    +#ifndef SIMDUTF_UTF32_H
    +#define SIMDUTF_UTF32_H
     
     namespace simdutf {
     namespace scalar {
     namespace {
    -namespace utf8 {
    -#if SIMDUTF_IMPLEMENTATION_FALLBACK
    -// only used by the fallback kernel.
    -// credit: based on code from Google Fuchsia (Apache Licensed)
    -inline simdutf_warn_unused bool validate(const char *buf, size_t len) noexcept {
    -  const uint8_t *data = reinterpret_cast(buf);
    -  uint64_t pos = 0;
    -  uint32_t code_point = 0;
    -  while (pos < len) {
    -    // check of the next 8 bytes are ascii.
    -    uint64_t next_pos = pos + 16;
    -    if (next_pos <= len) { // if it is safe to read 8 more bytes, check that they are ascii
    -      uint64_t v1;
    -      std::memcpy(&v1, data + pos, sizeof(uint64_t));
    -      uint64_t v2;
    -      std::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t));
    -      uint64_t v{v1 | v2};
    -      if ((v & 0x8080808080808080) == 0) {
    -        pos = next_pos;
    -        continue;
    -      }
    -    }
    -    unsigned char byte = data[pos];
    -
    -    while (byte < 0b10000000) {
    -      if (++pos == len) { return true; }
    -      byte = data[pos];
    -    }
    +namespace utf32 {
     
    -    if ((byte & 0b11100000) == 0b11000000) {
    -      next_pos = pos + 2;
    -      if (next_pos > len) { return false; }
    -      if ((data[pos + 1] & 0b11000000) != 0b10000000) { return false; }
    -      // range check
    -      code_point = (byte & 0b00011111) << 6 | (data[pos + 1] & 0b00111111);
    -      if ((code_point < 0x80) || (0x7ff < code_point)) { return false; }
    -    } else if ((byte & 0b11110000) == 0b11100000) {
    -      next_pos = pos + 3;
    -      if (next_pos > len) { return false; }
    -      if ((data[pos + 1] & 0b11000000) != 0b10000000) { return false; }
    -      if ((data[pos + 2] & 0b11000000) != 0b10000000) { return false; }
    -      // range check
    -      code_point = (byte & 0b00001111) << 12 |
    -                   (data[pos + 1] & 0b00111111) << 6 |
    -                   (data[pos + 2] & 0b00111111);
    -      if ((code_point < 0x800) || (0xffff < code_point) ||
    -          (0xd7ff < code_point && code_point < 0xe000)) {
    +inline simdutf_warn_unused bool validate(const char32_t *buf, size_t len) noexcept {
    +  const uint32_t *data = reinterpret_cast(buf);
    +  uint64_t pos = 0;
    +  for(;pos < len; pos++) {
    +    uint32_t word = data[pos];
    +    if(word > 0x10FFFF || (word >= 0xD800 && word <= 0xDFFF)) {
             return false;
    -      }
    -    } else if ((byte & 0b11111000) == 0b11110000) { // 0b11110000
    -      next_pos = pos + 4;
    -      if (next_pos > len) { return false; }
    -      if ((data[pos + 1] & 0b11000000) != 0b10000000) { return false; }
    -      if ((data[pos + 2] & 0b11000000) != 0b10000000) { return false; }
    -      if ((data[pos + 3] & 0b11000000) != 0b10000000) { return false; }
    -      // range check
    -      code_point =
    -          (byte & 0b00000111) << 18 | (data[pos + 1] & 0b00111111) << 12 |
    -          (data[pos + 2] & 0b00111111) << 6 | (data[pos + 3] & 0b00111111);
    -      if (code_point <= 0xffff || 0x10ffff < code_point) { return false; }
    -    } else {
    -      // we may have a continuation
    -      return false;
         }
    -    pos = next_pos;
       }
       return true;
     }
    -#endif
     
    -inline simdutf_warn_unused result validate_with_errors(const char *buf, size_t len) noexcept {
    -  const uint8_t *data = reinterpret_cast(buf);
    +inline simdutf_warn_unused result validate_with_errors(const char32_t *buf, size_t len) noexcept {
    +  const uint32_t *data = reinterpret_cast(buf);
       size_t pos = 0;
    -  uint32_t code_point = 0;
    -  while (pos < len) {
    -    // check of the next 8 bytes are ascii.
    -    size_t next_pos = pos + 16;
    -    if (next_pos <= len) { // if it is safe to read 8 more bytes, check that they are ascii
    -      uint64_t v1;
    -      std::memcpy(&v1, data + pos, sizeof(uint64_t));
    -      uint64_t v2;
    -      std::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t));
    -      uint64_t v{v1 | v2};
    -      if ((v & 0x8080808080808080) == 0) {
    -        pos = next_pos;
    -        continue;
    -      }
    +  for(;pos < len; pos++) {
    +    uint32_t word = data[pos];
    +    if(word > 0x10FFFF) {
    +        return result(error_code::TOO_LARGE, pos);
         }
    -    unsigned char byte = data[pos];
    -
    -    while (byte < 0b10000000) {
    -      if (++pos == len) { return result(error_code::SUCCESS, len); }
    -      byte = data[pos];
    +    if(word >= 0xD800 && word <= 0xDFFF) {
    +        return result(error_code::SURROGATE, pos);
         }
    +  }
    +  return result(error_code::SUCCESS, pos);
    +}
     
    -    if ((byte & 0b11100000) == 0b11000000) {
    -      next_pos = pos + 2;
    -      if (next_pos > len) { return result(error_code::TOO_SHORT, pos); }
    -      if ((data[pos + 1] & 0b11000000) != 0b10000000) { return result(error_code::TOO_SHORT, pos); }
    -      // range check
    -      code_point = (byte & 0b00011111) << 6 | (data[pos + 1] & 0b00111111);
    -      if ((code_point < 0x80) || (0x7ff < code_point)) { return result(error_code::OVERLONG, pos); }
    -    } else if ((byte & 0b11110000) == 0b11100000) {
    -      next_pos = pos + 3;
    -      if (next_pos > len) { return result(error_code::TOO_SHORT, pos); }
    -      if ((data[pos + 1] & 0b11000000) != 0b10000000) { return result(error_code::TOO_SHORT, pos); }
    -      if ((data[pos + 2] & 0b11000000) != 0b10000000) { return result(error_code::TOO_SHORT, pos); }
    -      // range check
    -      code_point = (byte & 0b00001111) << 12 |
    -                   (data[pos + 1] & 0b00111111) << 6 |
    -                   (data[pos + 2] & 0b00111111);
    -      if ((code_point < 0x800) || (0xffff < code_point)) { return result(error_code::OVERLONG, pos);}
    -      if (0xd7ff < code_point && code_point < 0xe000) { return result(error_code::SURROGATE, pos); }
    -    } else if ((byte & 0b11111000) == 0b11110000) { // 0b11110000
    -      next_pos = pos + 4;
    -      if (next_pos > len) { return result(error_code::TOO_SHORT, pos); }
    -      if ((data[pos + 1] & 0b11000000) != 0b10000000) { return result(error_code::TOO_SHORT, pos); }
    -      if ((data[pos + 2] & 0b11000000) != 0b10000000) { return result(error_code::TOO_SHORT, pos); }
    -      if ((data[pos + 3] & 0b11000000) != 0b10000000) { return result(error_code::TOO_SHORT, pos); }
    -      // range check
    -      code_point =
    -          (byte & 0b00000111) << 18 | (data[pos + 1] & 0b00111111) << 12 |
    -          (data[pos + 2] & 0b00111111) << 6 | (data[pos + 3] & 0b00111111);
    -      if (code_point <= 0xffff) { return result(error_code::OVERLONG, pos); }
    -      if (0x10ffff < code_point) { return result(error_code::TOO_LARGE, pos); }
    -    } else {
    -      // we either have too many continuation bytes or an invalid leading byte
    -      if ((byte & 0b11000000) == 0b10000000) { return result(error_code::TOO_LONG, pos); }
    -      else { return result(error_code::HEADER_BITS, pos); }
    -    }
    -    pos = next_pos;
    -  }
    -  return result(error_code::SUCCESS, len);
    -}
    -
    -// Finds the previous leading byte and validates with errors from there
    -// Used to pinpoint the location of an error when an invalid chunk is detected
    -inline simdutf_warn_unused result rewind_and_validate_with_errors(const char *start, const char *buf, size_t len) noexcept {
    -  // First check that we start with a leading byte
    -  if ((*start & 0b11000000) == 0b10000000) {
    -    return result(error_code::TOO_LONG, 0);
    -  }
    -  size_t extra_len{0};
    -  // A leading byte cannot be further than 4 bytes away
    -  for(int i = 0; i < 5; i++) {
    -    unsigned char byte = *buf;
    -    if ((byte & 0b11000000) != 0b10000000) {
    -      break;
    -    } else {
    -      buf--;
    -      extra_len++;
    -    }
    -  }
    -
    -  result res = validate_with_errors(buf, len + extra_len);
    -  res.count -= extra_len;
    -  return res;
    -}
    -
    -inline size_t count_code_points(const char* buf, size_t len) {
    -    const int8_t * p = reinterpret_cast(buf);
    -    size_t counter{0};
    -    for(size_t i = 0; i < len; i++) {
    -        // -65 is 0b10111111, anything larger in two-complement's should start a new code point.
    -        if(p[i] > -65) { counter++; }
    -    }
    -    return counter;
    -}
    -
    -inline size_t utf16_length_from_utf8(const char* buf, size_t len) {
    -    const int8_t * p = reinterpret_cast(buf);
    -    size_t counter{0};
    -    for(size_t i = 0; i < len; i++) {
    -        if(p[i] > -65) { counter++; }
    -        if(uint8_t(p[i]) >= 240) { counter++; }
    -    }
    -    return counter;
    -}
    -
    -} // utf8 namespace
    -} // unnamed namespace
    -} // namespace scalar
    -} // namespace simdutf
    -
    -#endif
    -/* end file src/scalar/utf8.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=scalar/utf16.h
    -/* begin file src/scalar/utf16.h */
    -#ifndef SIMDUTF_UTF16_H
    -#define SIMDUTF_UTF16_H
    -
    -namespace simdutf {
    -namespace scalar {
    -namespace {
    -namespace utf16 {
    -
    -inline simdutf_warn_unused uint16_t swap_bytes(const uint16_t word) {
    -  return uint16_t((word >> 8) | (word << 8));
    -}
    -
    -template 
    -inline simdutf_warn_unused bool validate(const char16_t *buf, size_t len) noexcept {
    -  const uint16_t *data = reinterpret_cast(buf);
    -  uint64_t pos = 0;
    -  while (pos < len) {
    -    uint16_t word = !match_system(big_endian) ? swap_bytes(data[pos]) : data[pos];
    -    if((word &0xF800) == 0xD800) {
    -        if(pos + 1 >= len) { return false; }
    -        uint16_t diff = uint16_t(word - 0xD800);
    -        if(diff > 0x3FF) { return false; }
    -        uint16_t next_word = !match_system(big_endian) ? swap_bytes(data[pos + 1]) : data[pos + 1];
    -        uint16_t diff2 = uint16_t(next_word - 0xDC00);
    -        if(diff2 > 0x3FF) { return false; }
    -        pos += 2;
    -    } else {
    -        pos++;
    -    }
    -  }
    -  return true;
    -}
    -
    -template 
    -inline simdutf_warn_unused result validate_with_errors(const char16_t *buf, size_t len) noexcept {
    -  const uint16_t *data = reinterpret_cast(buf);
    -  size_t pos = 0;
    -  while (pos < len) {
    -    uint16_t word = !match_system(big_endian) ? swap_bytes(data[pos]) : data[pos];
    -    if((word & 0xF800) == 0xD800) {
    -        if(pos + 1 >= len) { return result(error_code::SURROGATE, pos); }
    -        uint16_t diff = uint16_t(word - 0xD800);
    -        if(diff > 0x3FF) { return result(error_code::SURROGATE, pos); }
    -        uint16_t next_word = !match_system(big_endian) ? swap_bytes(data[pos + 1]) : data[pos + 1];
    -        uint16_t diff2 = uint16_t(next_word - 0xDC00);
    -        if(diff2 > 0x3FF) { return result(error_code::SURROGATE, pos); }
    -        pos += 2;
    -    } else {
    -        pos++;
    -    }
    -  }
    -  return result(error_code::SUCCESS, pos);
    -}
    -
    -template 
    -inline size_t count_code_points(const char16_t* buf, size_t len) {
    +inline size_t utf8_length_from_utf32(const char32_t* buf, size_t len) {
       // We are not BOM aware.
    -  const uint16_t * p = reinterpret_cast(buf);
    +  const uint32_t * p = reinterpret_cast(buf);
       size_t counter{0};
       for(size_t i = 0; i < len; i++) {
    -    uint16_t word = !match_system(big_endian) ? swap_bytes(p[i]) : p[i];
    -    counter += ((word & 0xFC00) != 0xDC00);
    +    // credit: @ttsugriy  for the vectorizable approach
    +    counter++;                                      // ASCII
    +    counter += static_cast(p[i] > 0x7F);    // two-byte
    +    counter += static_cast(p[i] > 0x7FF);   // three-byte
    +    counter += static_cast(p[i] > 0xFFFF);  // four-bytes
       }
       return counter;
     }
     
    -template 
    -inline size_t utf8_length_from_utf16(const char16_t* buf, size_t len) {
    +inline size_t utf16_length_from_utf32(const char32_t* buf, size_t len) {
       // We are not BOM aware.
    -  const uint16_t * p = reinterpret_cast(buf);
    +  const uint32_t * p = reinterpret_cast(buf);
       size_t counter{0};
       for(size_t i = 0; i < len; i++) {
    -    uint16_t word = !match_system(big_endian) ? swap_bytes(p[i]) : p[i];
    -    /** ASCII **/
    -    if(word <= 0x7F) { counter++; }
    -    /** two-byte **/
    -    else if (word <= 0x7FF) { counter += 2; }
    -    /** three-byte **/
    -    else if((word <= 0xD7FF) || (word >= 0xE000)) { counter += 3; }
    -    /** surrogates -- 4 bytes **/
    -    else { counter += 2; }
    +    counter++;                                      // non-surrogate word
    +    counter += static_cast(p[i] > 0xFFFF);  // surrogate pair
       }
       return counter;
     }
     
    -template 
    -inline size_t utf32_length_from_utf16(const char16_t* buf, size_t len) {
    +inline size_t latin1_length_from_utf32(size_t len) {
       // We are not BOM aware.
    -  const uint16_t * p = reinterpret_cast(buf);
    -  size_t counter{0};
    -  for(size_t i = 0; i < len; i++) {
    -    uint16_t word = !match_system(big_endian) ? swap_bytes(p[i]) : p[i];
    -    counter += ((word & 0xFC00) != 0xDC00);
    -  }
    -  return counter;
    +  return len; // a utf32 codepoint will always represent 1 latin1 character
     }
     
    -simdutf_really_inline void change_endianness_utf16(const char16_t* in, size_t size, char16_t* out) {
    -  const uint16_t * input = reinterpret_cast(in);
    -  uint16_t * output = reinterpret_cast(out);
    -  for (size_t i = 0; i < size; i++) {
    -    *output++ = uint16_t(input[i] >> 8 | input[i] << 8);
    -  }
    -}
     
    -} // utf16 namespace
    +
    +} // utf32 namespace
     } // unnamed namespace
     } // namespace scalar
     } // namespace simdutf
     
     #endif
    -/* end file src/scalar/utf16.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=scalar/utf32.h
    -/* begin file src/scalar/utf32.h */
    -#ifndef SIMDUTF_UTF32_H
    -#define SIMDUTF_UTF32_H
    +/* end file src/scalar/utf32.h */
    +/* begin file src/scalar/latin1.h */
    +#ifndef SIMDUTF_LATIN1_H
    +#define SIMDUTF_LATIN1_H
     
     namespace simdutf {
     namespace scalar {
     namespace {
    -namespace utf32 {
    -
    -inline simdutf_warn_unused bool validate(const char32_t *buf, size_t len) noexcept {
    -  const uint32_t *data = reinterpret_cast(buf);
    -  uint64_t pos = 0;
    -  for(;pos < len; pos++) {
    -    uint32_t word = data[pos];
    -    if(word > 0x10FFFF || (word >= 0xD800 && word <= 0xDFFF)) {
    -        return false;
    -    }
    -  }
    -  return true;
    -}
    +namespace latin1 {
     
    -inline simdutf_warn_unused result validate_with_errors(const char32_t *buf, size_t len) noexcept {
    -  const uint32_t *data = reinterpret_cast(buf);
    -  size_t pos = 0;
    -  for(;pos < len; pos++) {
    -    uint32_t word = data[pos];
    -    if(word > 0x10FFFF) {
    -        return result(error_code::TOO_LARGE, pos);
    -    }
    -    if(word >= 0xD800 && word <= 0xDFFF) {
    -        return result(error_code::SURROGATE, pos);
    -    }
    -  }
    -  return result(error_code::SUCCESS, pos);
    +inline size_t utf32_length_from_latin1(size_t len) {
    +  // We are not BOM aware.
    +  return len; // a utf32 unit will always represent 1 latin1 character
     }
     
    -inline size_t utf8_length_from_utf32(const char32_t* buf, size_t len) {
    -  // We are not BOM aware.
    -  const uint32_t * p = reinterpret_cast(buf);
    -  size_t counter{0};
    -  for(size_t i = 0; i < len; i++) {
    -    /** ASCII **/
    -    if(p[i] <= 0x7F) { counter++; }
    -    /** two-byte **/
    -    else if(p[i] <= 0x7FF) { counter += 2; }
    -    /** three-byte **/
    -    else if(p[i] <= 0xFFFF) { counter += 3; }
    -    /** four-bytes **/
    -    else { counter += 4; }
    +inline size_t utf8_length_from_latin1(const char *buf, size_t len) {
    +  const uint8_t * c = reinterpret_cast(buf);
    +  size_t answer = 0;
    +  for(size_t i = 0; i>7)) { answer++; }
       }
    -  return counter;
    +  return answer + len;
     }
     
    -inline size_t utf16_length_from_utf32(const char32_t* buf, size_t len) {
    -  // We are not BOM aware.
    -  const uint32_t * p = reinterpret_cast(buf);
    -  size_t counter{0};
    -  for(size_t i = 0; i < len; i++) {
    -    /** non-surrogate word **/
    -    if(p[i] <= 0xFFFF) { counter++; }
    -    /** surrogate pair **/
    -    else { counter += 2; }
    -  }
    -  return counter;
    +inline size_t utf16_length_from_latin1(size_t len) {
    +  return len;
     }
     
     } // utf32 namespace
    @@ -10377,9 +10749,8 @@ inline size_t utf16_length_from_utf32(const char32_t* buf, size_t len) {
     } // namespace simdutf
     
     #endif
    -/* end file src/scalar/utf32.h */
    +/* end file src/scalar/latin1.h */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=scalar/utf32_to_utf8/valid_utf32_to_utf8.h
     /* begin file src/scalar/utf32_to_utf8/valid_utf32_to_utf8.h */
     #ifndef SIMDUTF_VALID_UTF32_TO_UTF8_H
     #define SIMDUTF_VALID_UTF32_TO_UTF8_H
    @@ -10446,7 +10817,6 @@ inline size_t convert_valid(const char32_t* buf, size_t len, char* utf8_output)
     
     #endif
     /* end file src/scalar/utf32_to_utf8/valid_utf32_to_utf8.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=scalar/utf32_to_utf8/utf32_to_utf8.h
     /* begin file src/scalar/utf32_to_utf8/utf32_to_utf8.h */
     #ifndef SIMDUTF_UTF32_TO_UTF8_H
     #define SIMDUTF_UTF32_TO_UTF8_H
    @@ -10562,7 +10932,6 @@ inline result convert_with_errors(const char32_t* buf, size_t len, char* utf8_ou
     #endif
     /* end file src/scalar/utf32_to_utf8/utf32_to_utf8.h */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=scalar/utf32_to_utf16/valid_utf32_to_utf16.h
     /* begin file src/scalar/utf32_to_utf16/valid_utf32_to_utf16.h */
     #ifndef SIMDUTF_VALID_UTF32_TO_UTF16_H
     #define SIMDUTF_VALID_UTF32_TO_UTF16_H
    @@ -10607,7 +10976,6 @@ inline size_t convert_valid(const char32_t* buf, size_t len, char16_t* utf16_out
     
     #endif
     /* end file src/scalar/utf32_to_utf16/valid_utf32_to_utf16.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=scalar/utf32_to_utf16/utf32_to_utf16.h
     /* begin file src/scalar/utf32_to_utf16/utf32_to_utf16.h */
     #ifndef SIMDUTF_UTF32_TO_UTF16_H
     #define SIMDUTF_UTF32_TO_UTF16_H
    @@ -10683,7 +11051,6 @@ inline result convert_with_errors(const char32_t* buf, size_t len, char16_t* utf
     #endif
     /* end file src/scalar/utf32_to_utf16/utf32_to_utf16.h */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=scalar/utf16_to_utf8/valid_utf16_to_utf8.h
     /* begin file src/scalar/utf16_to_utf8/valid_utf16_to_utf8.h */
     #ifndef SIMDUTF_VALID_UTF16_TO_UTF8_H
     #define SIMDUTF_VALID_UTF16_TO_UTF8_H
    @@ -10703,7 +11070,7 @@ inline size_t convert_valid(const char16_t* buf, size_t len, char* utf8_output)
         if (pos + 4 <= len) { // if it is safe to read 8 more bytes, check that they are ascii
           uint64_t v;
           ::memcpy(&v, data + pos, sizeof(uint64_t));
    -      if (!match_system(big_endian)) v = (v >> 8) | (v << (64 - 8));
    +      if (!match_system(big_endian)) { v = (v >> 8) | (v << (64 - 8)); }
           if ((v & 0xFF80FF80FF80FF80) == 0) {
             size_t final_pos = pos + 4;
             while(pos < final_pos) {
    @@ -10758,7 +11125,6 @@ inline size_t convert_valid(const char16_t* buf, size_t len, char* utf8_output)
     
     #endif
     /* end file src/scalar/utf16_to_utf8/valid_utf16_to_utf8.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=scalar/utf16_to_utf8/utf16_to_utf8.h
     /* begin file src/scalar/utf16_to_utf8/utf16_to_utf8.h */
     #ifndef SIMDUTF_UTF16_TO_UTF8_H
     #define SIMDUTF_UTF16_TO_UTF8_H
    @@ -10774,11 +11140,11 @@ inline size_t convert(const char16_t* buf, size_t len, char* utf8_output) {
       size_t pos = 0;
       char* start{utf8_output};
       while (pos < len) {
    -    // try to convert the next block of 8 ASCII characters
    +    // try to convert the next block of 8 bytes
         if (pos + 4 <= len) { // if it is safe to read 8 more bytes, check that they are ascii
           uint64_t v;
           ::memcpy(&v, data + pos, sizeof(uint64_t));
    -      if (!match_system(big_endian)) v = (v >> 8) | (v << (64 - 8));
    +      if (!match_system(big_endian)) { v = (v >> 8) | (v << (64 - 8)); }
           if ((v & 0xFF80FF80FF80FF80) == 0) {
             size_t final_pos = pos + 4;
             while(pos < final_pos) {
    @@ -10833,7 +11199,7 @@ inline result convert_with_errors(const char16_t* buf, size_t len, char* utf8_ou
       size_t pos = 0;
       char* start{utf8_output};
       while (pos < len) {
    -    // try to convert the next block of 8 ASCII characters
    +    // try to convert the next block of 8 bytes
         if (pos + 4 <= len) { // if it is safe to read 8 more bytes, check that they are ascii
           uint64_t v;
           ::memcpy(&v, data + pos, sizeof(uint64_t));
    @@ -10894,7 +11260,6 @@ inline result convert_with_errors(const char16_t* buf, size_t len, char* utf8_ou
     #endif
     /* end file src/scalar/utf16_to_utf8/utf16_to_utf8.h */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=scalar/utf16_to_utf32/valid_utf16_to_utf32.h
     /* begin file src/scalar/utf16_to_utf32/valid_utf16_to_utf32.h */
     #ifndef SIMDUTF_VALID_UTF16_TO_UTF32_H
     #define SIMDUTF_VALID_UTF16_TO_UTF32_H
    @@ -10936,7 +11301,6 @@ inline size_t convert_valid(const char16_t* buf, size_t len, char32_t* utf32_out
     
     #endif
     /* end file src/scalar/utf16_to_utf32/valid_utf16_to_utf32.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=scalar/utf16_to_utf32/utf16_to_utf32.h
     /* begin file src/scalar/utf16_to_utf32/utf16_to_utf32.h */
     #ifndef SIMDUTF_UTF16_TO_UTF32_H
     #define SIMDUTF_UTF16_TO_UTF32_H
    @@ -11008,7 +11372,6 @@ inline result convert_with_errors(const char16_t* buf, size_t len, char32_t* utf
     #endif
     /* end file src/scalar/utf16_to_utf32/utf16_to_utf32.h */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=scalar/utf8_to_utf16/valid_utf8_to_utf16.h
     /* begin file src/scalar/utf8_to_utf16/valid_utf8_to_utf16.h */
     #ifndef SIMDUTF_VALID_UTF8_TO_UTF16_H
     #define SIMDUTF_VALID_UTF8_TO_UTF16_H
    @@ -11093,7 +11456,6 @@ inline size_t convert_valid(const char* buf, size_t len, char16_t* utf16_output)
     
     #endif
     /* end file src/scalar/utf8_to_utf16/valid_utf8_to_utf16.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=scalar/utf8_to_utf16/utf8_to_utf16.h
     /* begin file src/scalar/utf8_to_utf16/utf8_to_utf16.h */
     #ifndef SIMDUTF_UTF8_TO_UTF16_H
     #define SIMDUTF_UTF8_TO_UTF16_H
    @@ -11343,7 +11705,6 @@ inline result rewind_and_convert_with_errors(size_t prior_bytes, const char* buf
     #endif
     /* end file src/scalar/utf8_to_utf16/utf8_to_utf16.h */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=scalar/utf8_to_utf32/valid_utf8_to_utf32.h
     /* begin file src/scalar/utf8_to_utf32/valid_utf8_to_utf32.h */
     #ifndef SIMDUTF_VALID_UTF8_TO_UTF32_H
     #define SIMDUTF_VALID_UTF8_TO_UTF32_H
    @@ -11409,7 +11770,6 @@ inline size_t convert_valid(const char* buf, size_t len, char32_t* utf32_output)
     
     #endif
     /* end file src/scalar/utf8_to_utf32/valid_utf8_to_utf32.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=scalar/utf8_to_utf32/utf8_to_utf32.h
     /* begin file src/scalar/utf8_to_utf32/utf8_to_utf32.h */
     #ifndef SIMDUTF_UTF8_TO_UTF32_H
     #define SIMDUTF_UTF8_TO_UTF32_H
    @@ -11621,1994 +11981,2040 @@ inline result rewind_and_convert_with_errors(size_t prior_bytes, const char* buf
     
     #endif
     /* end file src/scalar/utf8_to_utf32/utf8_to_utf32.h */
    -//
    -
    -
    -SIMDUTF_PUSH_DISABLE_WARNINGS
    -SIMDUTF_DISABLE_UNDESIRED_WARNINGS
     
    +/* begin file src/scalar/latin1_to_utf8/latin1_to_utf8.h */
    +#ifndef SIMDUTF_LATIN1_TO_UTF8_H
    +#define SIMDUTF_LATIN1_TO_UTF8_H
     
    -#if SIMDUTF_IMPLEMENTATION_ARM64
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=arm64/implementation.cpp
    -/* begin file src/arm64/implementation.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/arm64/begin.h
    -/* begin file src/simdutf/arm64/begin.h */
    -// redefining SIMDUTF_IMPLEMENTATION to "arm64"
    -// #define SIMDUTF_IMPLEMENTATION arm64
    -/* end file src/simdutf/arm64/begin.h */
     namespace simdutf {
    -namespace arm64 {
    +namespace scalar {
     namespace {
    -#ifndef SIMDUTF_ARM64_H
    -#error "arm64.h must be included"
    -#endif
    -using namespace simd;
    +namespace latin1_to_utf8 {
     
    -simdutf_really_inline bool is_ascii(const simd8x64& input) {
    -    simd8 bits = input.reduce_or();
    -    return bits.max_val() < 0b10000000u;
    +inline size_t convert(const char* buf, size_t len, char* utf8_output) {
    +  const unsigned char *data = reinterpret_cast(buf);
    +  size_t pos = 0;
    +  char* start{utf8_output};
    +  while (pos < len) {
    +    // try to convert the next block of 16 ASCII bytes
    +    if (pos + 16 <= len) { // if it is safe to read 16 more bytes, check that they are ascii
    +      uint64_t v1;
    +      ::memcpy(&v1, data + pos, sizeof(uint64_t));
    +      uint64_t v2;
    +      ::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t));
    +      uint64_t v{v1 | v2}; // We are only interested in these bits: 1000 1000 1000 1000, so it makes sense to concatenate everything
    +      if ((v & 0x8080808080808080) == 0) { // if NONE of these are set, e.g. all of them are zero, then everything is ASCII
    +        size_t final_pos = pos + 16;
    +        while(pos < final_pos) {
    +          *utf8_output++ = char(buf[pos]);
    +          pos++;
    +        }
    +        continue;
    +      }
    +    }
    +
    +    unsigned char byte = data[pos];
    +    if((byte & 0x80) == 0) { // if ASCII
    +      // will generate one UTF-8 bytes
    +      *utf8_output++ = char(byte);
    +      pos++;
    +    } else {
    +      // will generate two UTF-8 bytes
    +      *utf8_output++ = char((byte>>6) | 0b11000000);
    +      *utf8_output++ = char((byte & 0b111111) | 0b10000000);
    +      pos++;
    +    }
    +  }
    +  return utf8_output - start;
     }
     
    -simdutf_unused simdutf_really_inline simd8 must_be_continuation(const simd8 prev1, const simd8 prev2, const simd8 prev3) {
    -    simd8 is_second_byte = prev1 >= uint8_t(0b11000000u);
    -    simd8 is_third_byte  = prev2 >= uint8_t(0b11100000u);
    -    simd8 is_fourth_byte = prev3 >= uint8_t(0b11110000u);
    -    // Use ^ instead of | for is_*_byte, because ^ is commutative, and the caller is using ^ as well.
    -    // This will work fine because we only have to report errors for cases with 0-1 lead bytes.
    -    // Multiple lead bytes implies 2 overlapping multibyte characters, and if that happens, there is
    -    // guaranteed to be at least *one* lead byte that is part of only 1 other multibyte character.
    -    // The error will be detected there.
    -    return is_second_byte ^ is_third_byte ^ is_fourth_byte;
    -}
    +} // latin1_to_utf8 namespace
    +} // unnamed namespace
    +} // namespace scalar
    +} // namespace simdutf
     
    -simdutf_really_inline simd8 must_be_2_3_continuation(const simd8 prev2, const simd8 prev3) {
    -    simd8 is_third_byte  = prev2 >= uint8_t(0b11100000u);
    -    simd8 is_fourth_byte = prev3 >= uint8_t(0b11110000u);
    -    return is_third_byte ^ is_fourth_byte;
    -}
    +#endif
    +/* end file src/scalar/latin1_to_utf8/latin1_to_utf8.h */
    +/* begin file src/scalar/latin1_to_utf16/latin1_to_utf16.h */
    +#ifndef SIMDUTF_LATIN1_TO_UTF16_H
    +#define SIMDUTF_LATIN1_TO_UTF16_H
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=arm64/arm_detect_encodings.cpp
    -/* begin file src/arm64/arm_detect_encodings.cpp */
    -template
    -// len is known to be a multiple of 2 when this is called
    -int arm_detect_encodings(const char * buf, size_t len) {
    -    const char* start = buf;
    -    const char* end = buf + len;
    +namespace simdutf {
    +namespace scalar {
    +namespace {
    +namespace latin1_to_utf16 {
     
    -    bool is_utf8 = true;
    -    bool is_utf16 = true;
    -    bool is_utf32 = true;
    +template 
    +inline size_t convert(const char* buf, size_t len, char16_t* utf16_output) {
    +  const uint8_t* data = reinterpret_cast(buf);
    +  size_t pos = 0;
    +  char16_t* start{ utf16_output };
     
    -    int out = 0;
    +  while (pos < len) {
    +    uint16_t word = uint16_t(data[pos]); // extend Latin-1 char to 16-bit Unicode code point
    +    *utf16_output++ = char16_t(match_system(big_endian) ? word : utf16::swap_bytes(word));
    +    pos++;
    +  }
     
    -    const auto v_d8 = simd8::splat(0xd8);
    -    const auto v_f8 = simd8::splat(0xf8);
    +  return utf16_output - start;
    +}
     
    -    uint32x4_t currentmax = vmovq_n_u32(0x0);
    +template 
    +inline result convert_with_errors(const char* buf, size_t len, char16_t* utf16_output) {
    +  const uint8_t* data = reinterpret_cast(buf);
    +  size_t pos = 0;
    +  char16_t* start{ utf16_output };
     
    -    checker check{};
    +  while (pos < len) {
    +    uint16_t word = uint16_t(data[pos]); // extend Latin-1 char to 16-bit Unicode code point
    +    *utf16_output++ = char16_t(match_system(big_endian) ? word : utf16::swap_bytes(word));
    +    pos++;
    +  }
     
    -    while(buf + 64 <= end) {
    -        uint16x8_t in = vld1q_u16(reinterpret_cast(buf));
    -        uint16x8_t secondin = vld1q_u16(reinterpret_cast(buf) + simd16::SIZE / sizeof(char16_t));
    -        uint16x8_t thirdin = vld1q_u16(reinterpret_cast(buf) + 2*simd16::SIZE / sizeof(char16_t));
    -        uint16x8_t fourthin = vld1q_u16(reinterpret_cast(buf) + 3*simd16::SIZE / sizeof(char16_t));
    +  return result(error_code::SUCCESS, utf16_output - start);
    +}
     
    -        const auto u0 = simd16(in);
    -        const auto u1 = simd16(secondin);
    -        const auto u2 = simd16(thirdin);
    -        const auto u3 = simd16(fourthin);
    +} // latin1_to_utf16 namespace
    +} // unnamed namespace
    +} // namespace scalar
    +} // namespace simdutf
     
    -        const auto v0 = u0.shr<8>();
    -        const auto v1 = u1.shr<8>();
    -        const auto v2 = u2.shr<8>();
    -        const auto v3 = u3.shr<8>();
    +#endif
    +/* end file src/scalar/latin1_to_utf16/latin1_to_utf16.h */
    +/* begin file src/scalar/latin1_to_utf32/latin1_to_utf32.h */
    +#ifndef SIMDUTF_LATIN1_TO_UTF32_H
    +#define SIMDUTF_LATIN1_TO_UTF32_H
     
    -        const auto in16 = simd16::pack(v0, v1);
    -        const auto nextin16 = simd16::pack(v2, v3);
    +namespace simdutf {
    +namespace scalar {
    +namespace {
    +namespace latin1_to_utf32 {
     
    -        const uint64_t surrogates_wordmask0 = ((in16 & v_f8) == v_d8).to_bitmask64();
    -        const uint64_t surrogates_wordmask1 = ((nextin16 & v_f8) == v_d8).to_bitmask64();
     
    -        // Check for surrogates
    -        if (surrogates_wordmask0 != 0 || surrogates_wordmask1 != 0) {
    -            // Cannot be UTF8
    -            is_utf8 = false;
    -            // Can still be either UTF-16LE or UTF-32 depending on the positions of the surrogates
    -            // To be valid UTF-32, a surrogate cannot be in the two most significant bytes of any 32-bit word.
    -            // On the other hand, to be valid UTF-16LE, at least one surrogate must be in the two most significant
    -            // bytes of a 32-bit word since they always come in pairs in UTF-16LE.
    -            // Note that we always proceed in multiple of 4 before this point so there is no offset in 32-bit words.
    +inline size_t convert(const char *buf, size_t len, char32_t *utf32_output) {
    +  const unsigned char *data = reinterpret_cast(buf);
    +  char32_t* start{utf32_output};
    +  for (size_t i = 0; i < len; i++) {
    +    *utf32_output++ = (char32_t)data[i];
    +  }
    +  return utf32_output - start;
    +}
     
    -            if (((surrogates_wordmask0 | surrogates_wordmask1) & 0xf0f0f0f0f0f0f0f0) != 0) {
    -                is_utf32 = false;
    -                // Code from arm_validate_utf16le.cpp
    -                // Not efficient, we do not process surrogates_wordmask1
    -                const char16_t * input = reinterpret_cast(buf);
    -                const char16_t* end16 = reinterpret_cast(start) + len/2;
    +} // latin1_to_utf32 namespace
    +} // unnamed namespace
    +} // namespace scalar
    +} // namespace simdutf
     
    -                const auto v_fc = simd8::splat(0xfc);
    -                const auto v_dc = simd8::splat(0xdc);
    +#endif
    +/* end file src/scalar/latin1_to_utf32/latin1_to_utf32.h */
     
    -                const uint64_t V0 = ~surrogates_wordmask0;
    +/* begin file src/scalar/utf8_to_latin1/utf8_to_latin1.h */
    +#ifndef SIMDUTF_UTF8_TO_LATIN1_H
    +#define SIMDUTF_UTF8_TO_LATIN1_H
    +#include 
     
    -                const auto vH0 = ((in16 & v_fc) ==  v_dc);
    -                const uint64_t H0 = vH0.to_bitmask64();
    +namespace simdutf {
    +namespace scalar {
    +namespace {
    +namespace utf8_to_latin1 {
     
    -                const uint64_t L0 = ~H0 & surrogates_wordmask0;
    +inline size_t convert(const char* buf, size_t len, char* latin_output) {
    + const uint8_t *data = reinterpret_cast(buf);
    +  size_t pos = 0;
    +  char* start{latin_output};
     
    -                const uint64_t a0 = L0 & (H0 >> 4);
    +  while (pos < len) {
    +    // try to convert the next block of 16 ASCII bytes
    +    if (pos + 16 <= len) { // if it is safe to read 16 more bytes, check that they are ascii
    +      uint64_t v1;
    +      ::memcpy(&v1, data + pos, sizeof(uint64_t));
    +      uint64_t v2;
    +      ::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t));
    +      uint64_t v{v1 | v2}; // We are only interested in these bits: 1000 1000 1000 1000 .... etc
    +      if ((v & 0x8080808080808080) == 0) { // if NONE of these are set, e.g. all of them are zero, then everything is ASCII
    +        size_t final_pos = pos + 16;
    +        while(pos < final_pos) {
    +          *latin_output++ = char(buf[pos]);
    +          pos++;
    +        }
    +        continue;
    +      }
    +    }
     
    -                const uint64_t b0 = a0 << 4;
    +    // suppose it is not an all ASCII byte sequence
    +    uint8_t leading_byte = data[pos]; // leading byte
    +    if (leading_byte < 0b10000000) {
    +      // converting one ASCII byte !!!
    +      *latin_output++ = char(leading_byte);
    +      pos++;
    +    } else if ((leading_byte & 0b11100000) == 0b11000000) { // the first three bits indicate:
    +      // We have a two-byte UTF-8
    +      if(pos + 1 >= len) {
    +        return 0;
    +      } // minimal bound checking
    +      if ((data[pos + 1] & 0b11000000) != 0b10000000) { return 0; } // checks if the next byte is a valid continuation byte in UTF-8. A valid continuation byte starts with 10.
    +      // range check -
    +      uint32_t code_point = (leading_byte & 0b00011111) << 6 | (data[pos + 1] & 0b00111111); // assembles the Unicode code point from the two bytes. It does this by discarding the leading 110 and 10 bits from the two bytes, shifting the remaining bits of the first byte, and then combining the results with a bitwise OR operation.
    +      if (code_point < 0x80 || 0xFF < code_point) {
    +        return 0; // We only care about the range 129-255 which is Non-ASCII latin1 characters. A code_point beneath 0x80 is invalid as it's already covered by bytes whose leading bit is zero. 
    +      }
    +      *latin_output++ = char(code_point);
    +      pos += 2;
    +    } else {
    +      return 0;
    +    }
    +  }
    +  return latin_output - start;
    +}
     
    -                const uint64_t c0 = V0 | a0 | b0;
    -                if (c0 == ~0ull) {
    -                    input += 16;
    -                } else if (c0 == 0xfffffffffffffffull) {
    -                    input += 15;
    -                } else {
    -                    is_utf16 = false;
    -                    break;
    -                }
    +inline result convert_with_errors(const char* buf, size_t len, char* latin_output) {
    + const uint8_t *data = reinterpret_cast(buf);
    +  size_t pos = 0;
    +  char* start{latin_output};
     
    -                while (input + 16 < end16) {
    -                    const auto in0 = simd16(input);
    -                    const auto in1 = simd16(input + simd16::SIZE / sizeof(char16_t));
    -                    const auto t0 = in0.shr<8>();
    -                    const auto t1 = in1.shr<8>();
    -                    const simd8 in_16 = simd16::pack(t0, t1);
    +  while (pos < len) {
    +    // try to convert the next block of 16 ASCII bytes
    +    if (pos + 16 <= len) { // if it is safe to read 16 more bytes, check that they are ascii
    +      uint64_t v1;
    +      ::memcpy(&v1, data + pos, sizeof(uint64_t));
    +      uint64_t v2;
    +      ::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t));
    +      uint64_t v{v1 | v2}; // We are only interested in these bits: 1000 1000 1000 1000...etc
    +      if ((v & 0x8080808080808080) == 0) { // if NONE of these are set, e.g. all of them are zero, then everything is ASCII
    +        size_t final_pos = pos + 16;
    +        while(pos < final_pos) {
    +          *latin_output++ = char(buf[pos]);
    +          pos++;
    +        }
    +        continue;
    +      }
    +    }
    +    // suppose it is not an all ASCII byte sequence
    +    uint8_t leading_byte = data[pos]; // leading byte
    +    if (leading_byte < 0b10000000) {
    +      // converting one ASCII byte !!!
    +      *latin_output++ = char(leading_byte);
    +      pos++;
    +    } else if ((leading_byte & 0b11100000) == 0b11000000) { // the first three bits indicate:
    +      // We have a two-byte UTF-8
    +      if(pos + 1 >= len) {
    +        return result(error_code::TOO_SHORT, pos); } // minimal bound checking
    +      if ((data[pos + 1] & 0b11000000) != 0b10000000) {
    +        return result(error_code::TOO_SHORT, pos); } // checks if the next byte is a valid continuation byte in UTF-8. A valid continuation byte starts with 10.
    +      // range check -
    +      uint32_t code_point = (leading_byte & 0b00011111) << 6 | (data[pos + 1] & 0b00111111); // assembles the Unicode code point from the two bytes. It does this by discarding the leading 110 and 10 bits from the two bytes, shifting the remaining bits of the first byte, and then combining the results with a bitwise OR operation.
    +      if (code_point < 0x80) {
    +        return result(error_code::OVERLONG, pos);
    +      }
    +      if (0xFF < code_point) {
    +        return result(error_code::TOO_LARGE, pos);
    +      } // We only care about the range 129-255 which is Non-ASCII latin1 characters
    +      *latin_output++ = char(code_point);
    +      pos += 2;
    +    } else if ((leading_byte & 0b11110000) == 0b11100000) {
    +      // We have a three-byte UTF-8
    +      return result(error_code::TOO_LARGE, pos);
    +    } else if ((leading_byte & 0b11111000) == 0b11110000) { // 0b11110000
    +      // we have a 4-byte UTF-8 word.
    +      return result(error_code::TOO_LARGE, pos);
    +    } else {
    +      // we either have too many continuation bytes or an invalid leading byte
    +      if ((leading_byte & 0b11000000) == 0b10000000) {
    +        return result(error_code::TOO_LONG, pos);
    +      }
     
    -                    const uint64_t surrogates_wordmask = ((in_16 & v_f8) == v_d8).to_bitmask64();
    -                    if(surrogates_wordmask == 0) {
    -                        input += 16;
    -                    } else {
    -                        const uint64_t V = ~surrogates_wordmask;
    +      return result(error_code::HEADER_BITS, pos);
     
    -                        const auto vH = ((in_16 & v_fc) ==  v_dc);
    -                        const uint64_t H = vH.to_bitmask64();
    +    }
    +  }
    +  return result(error_code::SUCCESS, latin_output - start);
    +}
     
    -                        const uint64_t L = ~H & surrogates_wordmask;
     
    -                        const uint64_t a = L & (H >> 4);
    +inline result rewind_and_convert_with_errors(size_t prior_bytes, const char* buf, size_t len, char* latin1_output) {
    +  size_t extra_len{0};
    +  // We potentially need to go back in time and find a leading byte.
    +  // In theory '3' would be sufficient, but sometimes the error can go back quite far.
    +  size_t how_far_back = prior_bytes;
    +  // size_t how_far_back = 3; // 3 bytes in the past + current position
    +  // if(how_far_back >= prior_bytes) { how_far_back = prior_bytes; }
    +  bool found_leading_bytes{false};
    +  // important: it is i <= how_far_back and not 'i < how_far_back'.
    +  for(size_t i = 0; i <= how_far_back; i++) {
    +    unsigned char byte = buf[0-i];
    +    found_leading_bytes = ((byte & 0b11000000) != 0b10000000);
    +    if(found_leading_bytes) {
    +      buf -= i;
    +      extra_len = i;
    +      break;
    +    }
    +  }
    +  //
    +  // It is possible for this function to return a negative count in its result.
    +  // C++ Standard Section 18.1 defines size_t is in  which is described in C Standard as .
    +  // C Standard Section 4.1.5 defines size_t as an unsigned integral type of the result of the sizeof operator
    +  //
    +  // An unsigned type will simply wrap round arithmetically (well defined).
    +  //
    +  if(!found_leading_bytes) {
    +    // If how_far_back == 3, we may have four consecutive continuation bytes!!!
    +    // [....] [continuation] [continuation] [continuation] | [buf is continuation]
    +    // Or we possibly have a stream that does not start with a leading byte.
    +    return result(error_code::TOO_LONG, 0-how_far_back);
    +  }
    +  result res = convert_with_errors(buf, len + extra_len, latin1_output);
    +  if (res.error) {
    +    res.count -= extra_len;
    +  }
    +  return res;
    +}
     
    -                        const uint64_t b = a << 4;
     
    -                        const uint64_t c = V | a | b;
    -                        if (c == ~0ull) {
    -                            input += 16;
    -                        } else if (c == 0xfffffffffffffffull) {
    -                            input += 15;
    -                        } else {
    -                            is_utf16 = false;
    -                            break;
    -                        }
    -                    }
    -                }
    -            } else {
    -                is_utf16 = false;
    -                // Check for UTF-32
    -                if (len % 4 == 0) {
    -                    const char32_t * input = reinterpret_cast(buf);
    -                    const char32_t* end32 = reinterpret_cast(start) + len/4;
    +} // utf8_to_latin1 namespace
    +} // unnamed namespace
    +} // namespace scalar
    +} // namespace simdutf
     
    -                    // Must start checking for surrogates
    -                    uint32x4_t currentoffsetmax = vmovq_n_u32(0x0);
    -                    const uint32x4_t offset = vmovq_n_u32(0xffff2000);
    -                    const uint32x4_t standardoffsetmax = vmovq_n_u32(0xfffff7ff);
    +#endif
    +/* end file src/scalar/utf8_to_latin1/utf8_to_latin1.h */
    +/* begin file src/scalar/utf16_to_latin1/utf16_to_latin1.h */
    +#ifndef SIMDUTF_UTF16_TO_LATIN1_H
    +#define SIMDUTF_UTF16_TO_LATIN1_H
     
    -                    const uint32x4_t in32 =  vreinterpretq_u32_u16(in);
    -                    const uint32x4_t secondin32 =  vreinterpretq_u32_u16(secondin);
    -                    const uint32x4_t thirdin32 =  vreinterpretq_u32_u16(thirdin);
    -                    const uint32x4_t fourthin32 =  vreinterpretq_u32_u16(fourthin);
    -
    -                    currentmax = vmaxq_u32(in32,currentmax);
    -                    currentmax = vmaxq_u32(secondin32,currentmax);
    -                    currentmax = vmaxq_u32(thirdin32,currentmax);
    -                    currentmax = vmaxq_u32(fourthin32,currentmax);
    +namespace simdutf {
    +namespace scalar {
    +namespace {
    +namespace utf16_to_latin1 {
     
    -                    currentoffsetmax = vmaxq_u32(vaddq_u32(in32, offset), currentoffsetmax);
    -                    currentoffsetmax = vmaxq_u32(vaddq_u32(secondin32, offset), currentoffsetmax);
    -                    currentoffsetmax = vmaxq_u32(vaddq_u32(thirdin32, offset), currentoffsetmax);
    -                    currentoffsetmax = vmaxq_u32(vaddq_u32(fourthin32, offset), currentoffsetmax);
    +#include   // for std::memcpy
     
    -                    while (input + 4 < end32) {
    -                        const uint32x4_t in_32 = vld1q_u32(reinterpret_cast(input));
    -                        currentmax = vmaxq_u32(in_32,currentmax);
    -                        currentoffsetmax = vmaxq_u32(vaddq_u32(in_32, offset), currentoffsetmax);
    -                        input += 4;
    -                    }
    +template 
    +inline size_t convert(const char16_t* buf, size_t len, char* latin_output) {
    +  const uint16_t *data = reinterpret_cast(buf);
    +  size_t pos = 0;
    +  std::vector temp_output(len);
    +  char* current_write = temp_output.data();
    +  uint16_t word = 0;
    +  uint16_t too_large = 0;
     
    -                    uint32x4_t forbidden_words = veorq_u32(vmaxq_u32(currentoffsetmax, standardoffsetmax), standardoffsetmax);
    -                    if(vmaxvq_u32(forbidden_words) != 0) {
    -                        is_utf32 = false;
    -                    }
    -                } else {
    -                    is_utf32 = false;
    -                }
    -            }
    -            break;
    -        }
    -        // If no surrogate, validate under other encodings as well
    +  while (pos < len) {
    +    word = !match_system(big_endian) ? utf16::swap_bytes(data[pos]) : data[pos];
    +    too_large |= word;
    +    *current_write++ = char(word & 0xFF);
    +    pos++;
    +  }
    +  if((too_large & 0xFF00) != 0) { return 0; }
     
    -        // UTF-32 validation
    -        currentmax = vmaxq_u32(vreinterpretq_u32_u16(in),currentmax);
    -        currentmax = vmaxq_u32(vreinterpretq_u32_u16(secondin),currentmax);
    -        currentmax = vmaxq_u32(vreinterpretq_u32_u16(thirdin),currentmax);
    -        currentmax = vmaxq_u32(vreinterpretq_u32_u16(fourthin),currentmax);
    +  // Only copy to latin_output if there were no errors
    +  std::memcpy(latin_output, temp_output.data(), len);
    +  
    +  return current_write - temp_output.data();
    +}
     
    -        // UTF-8 validation
    -        // Relies on ../generic/utf8_validation/utf8_lookup4_algorithm.h
    -        simd::simd8x64 in8(vreinterpretq_u8_u16(in), vreinterpretq_u8_u16(secondin), vreinterpretq_u8_u16(thirdin), vreinterpretq_u8_u16(fourthin));
    -        check.check_next_input(in8);
    +template 
    +inline result convert_with_errors(const char16_t* buf, size_t len, char* latin_output) {
    + const uint16_t *data = reinterpret_cast(buf);
    +  size_t pos = 0;
    +  char* start{latin_output};
    +  uint16_t word;
     
    -        buf += 64;
    -    }
    +  while (pos < len) {
    +    if (pos + 16 <= len) { // if it is safe to read 32 more bytes, check that they are Latin1
    +      uint64_t v1, v2, v3, v4;
    +      ::memcpy(&v1, data + pos, sizeof(uint64_t));
    +      ::memcpy(&v2, data + pos + 4, sizeof(uint64_t));
    +      ::memcpy(&v3, data + pos + 8, sizeof(uint64_t));
    +      ::memcpy(&v4, data + pos  + 12, sizeof(uint64_t));
     
    -    // Check which encodings are possible
    +      if (!match_system(big_endian)) { v1 = (v1 >> 8) | (v1 << (64 - 8)); }
    +      if (!match_system(big_endian)) { v2 = (v2 >> 8) | (v2 << (64 - 8)); }
    +      if (!match_system(big_endian)) { v3 = (v3 >> 8) | (v3 << (64 - 8)); }
    +      if (!match_system(big_endian)) { v4 = (v1 >> 8) | (v4 << (64 - 8)); }
     
    -    if (is_utf8) {
    -        if (static_cast(buf - start) != len) {
    -            uint8_t block[64]{};
    -            std::memset(block, 0x20, 64);
    -            std::memcpy(block, buf, len - (buf - start));
    -            simd::simd8x64 in(block);
    -            check.check_next_input(in);
    -        }
    -        if (!check.errors()) {
    -            out |= simdutf::encoding_type::UTF8;
    +      if (((v1 | v2 | v3 | v4) & 0xFF00FF00FF00FF00) == 0) {
    +        size_t final_pos = pos + 16;
    +        while(pos < final_pos) {
    +          *latin_output++ = !match_system(big_endian) ? char(utf16::swap_bytes(data[pos])) : char(data[pos]);
    +          pos++;
             }
    +        continue;
    +      }
         }
    +    word = !match_system(big_endian) ? utf16::swap_bytes(data[pos]) : data[pos];
    +    if((word & 0xFF00 ) == 0) {
    +        *latin_output++ = char(word & 0xFF);
    +        pos++;
    +    } else { return result(error_code::TOO_LARGE, pos); }
    +  }
    +  return result(error_code::SUCCESS,latin_output - start);
    +}
     
    -    if (is_utf16 && scalar::utf16::validate(reinterpret_cast(buf), (len - (buf - start))/2)) {
    -        out |= simdutf::encoding_type::UTF16_LE;
    -    }
     
    -    if (is_utf32 && (len % 4 == 0)) {
    -        const uint32x4_t standardmax = vmovq_n_u32(0x10ffff);
    -        uint32x4_t is_zero = veorq_u32(vmaxq_u32(currentmax, standardmax), standardmax);
    -        if (vmaxvq_u32(is_zero) == 0 && scalar::utf32::validate(reinterpret_cast(buf), (len - (buf - start))/4)) {
    -            out |= simdutf::encoding_type::UTF32_LE;
    -        }
    -    }
    +} // utf16_to_latin1 namespace
    +} // unnamed namespace
    +} // namespace scalar
    +} // namespace simdutf
     
    -    return out;
    +#endif
    +/* end file src/scalar/utf16_to_latin1/utf16_to_latin1.h */
    +/* begin file src/scalar/utf32_to_latin1/utf32_to_latin1.h */
    +#ifndef SIMDUTF_UTF32_TO_LATIN1_H
    +#define SIMDUTF_UTF32_TO_LATIN1_H
    +
    +namespace simdutf {
    +namespace scalar {
    +namespace {
    +namespace utf32_to_latin1 {
    +
    +inline size_t convert(const char32_t *buf, size_t len, char *latin1_output) {
    +  const uint32_t *data = reinterpret_cast(buf);
    +  char* start = latin1_output;
    +  uint32_t utf32_char;
    +  size_t pos = 0;
    +  uint32_t too_large = 0;
    +
    +  while (pos < len) {
    +    utf32_char = (uint32_t)data[pos];
    +    too_large |= utf32_char;
    +    *latin1_output++ = (char)(utf32_char & 0xFF);
    +    pos++;
    +  }
    +  if((too_large & 0xFFFFFF00) != 0) { return 0; }
    +  return latin1_output - start;
     }
    -/* end file src/arm64/arm_detect_encodings.cpp */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=arm64/arm_validate_utf16.cpp
    -/* begin file src/arm64/arm_validate_utf16.cpp */
    -template 
    -const char16_t* arm_validate_utf16(const char16_t* input, size_t size) {
    -    const char16_t* end = input + size;
    -    const auto v_d8 = simd8::splat(0xd8);
    -    const auto v_f8 = simd8::splat(0xf8);
    -    const auto v_fc = simd8::splat(0xfc);
    -    const auto v_dc = simd8::splat(0xdc);
    -    while (input + 16 < end) {
    -        // 0. Load data: since the validation takes into account only higher
    -        //    byte of each word, we compress the two vectors into one which
    -        //    consists only the higher bytes.
    -        auto in0 = simd16(input);
    -        auto in1 = simd16(input + simd16::SIZE / sizeof(char16_t));
    -        if (!match_system(big_endian)) {
    -            #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -            const uint8x16_t swap = make_uint8x16_t(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14);
    -            #else
    -            const uint8x16_t swap = {1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14};
    -            #endif
    -            in0 = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(in0), swap));
    -            in1 = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(in1), swap));
    -        }
    -        const auto t0 = in0.shr<8>();
    -        const auto t1 = in1.shr<8>();
    -        const simd8 in = simd16::pack(t0, t1);
    -        // 1. Check whether we have any 0xD800..DFFF word (0b1101'1xxx'yyyy'yyyy).
    -        const uint64_t surrogates_wordmask = ((in & v_f8) == v_d8).to_bitmask64();
    -        if(surrogates_wordmask == 0) {
    -            input += 16;
    -        } else {
    -            // 2. We have some surrogates that have to be distinguished:
    -            //    - low  surrogates: 0b1101'10xx'yyyy'yyyy (0xD800..0xDBFF)
    -            //    - high surrogates: 0b1101'11xx'yyyy'yyyy (0xDC00..0xDFFF)
    -            //
    -            //    Fact: high surrogate has 11th bit set (3rd bit in the higher word)
    +inline result convert_with_errors(const char32_t *buf, size_t len, char *latin1_output) {
    +  const uint32_t *data = reinterpret_cast(buf);
    +  char* start{latin1_output};
    +  size_t pos = 0;
    +  while (pos < len) {
    +    if (pos + 2 <= len) { // if it is safe to read 8 more bytes, check that they are Latin1
    +      uint64_t v;
    +      ::memcpy(&v, data + pos, sizeof(uint64_t));
    +      if ((v & 0xFFFFFF00FFFFFF00) == 0) {
    +        *latin1_output++ = char(buf[pos]);
    +        *latin1_output++ = char(buf[pos+1]);
    +        pos += 2;
    +        continue;
    +      }
    +    }
    +    uint32_t utf32_char = data[pos];
    +    if ((utf32_char & 0xFFFFFF00) == 0) { // Check if the character can be represented in Latin-1
    +      *latin1_output++ = (char)(utf32_char & 0xFF);
    +      pos++;
    +    } else { return result(error_code::TOO_LARGE, pos); };
    +  }
    +  return result(error_code::SUCCESS, latin1_output - start);
    +}
     
    -            // V - non-surrogate words
    -            //     V = not surrogates_wordmask
    -            const uint64_t V = ~surrogates_wordmask;
    +} // utf32_to_latin1 namespace
    +} // unnamed namespace
    +} // namespace scalar
    +} // namespace simdutf
     
    -            // H - word-mask for high surrogates: the six highest bits are 0b1101'11
    -            const auto vH = ((in & v_fc) ==  v_dc);
    -            const uint64_t H = vH.to_bitmask64();
    +#endif
    +/* end file src/scalar/utf32_to_latin1/utf32_to_latin1.h */
     
    -            // L - word mask for low surrogates
    -            //     L = not H and surrogates_wordmask
    -            const uint64_t L = ~H & surrogates_wordmask;
    +/* begin file src/scalar/utf8_to_latin1/valid_utf8_to_latin1.h */
    +#ifndef SIMDUTF_VALID_UTF8_TO_LATIN1_H
    +#define SIMDUTF_VALID_UTF8_TO_LATIN1_H
     
    -            const uint64_t a = L & (H >> 4); // A low surrogate must be followed by high one.
    -                              // (A low surrogate placed in the 7th register's word
    -                              // is an exception we handle.)
    -            const uint64_t b = a << 4; // Just mark that the opposite fact is hold,
    -                          // thanks to that we have only two masks for valid case.
    -            const uint64_t c = V | a | b;      // Combine all the masks into the final one.
    -            if (c == ~0ull) {
    -                // The whole input register contains valid UTF-16, i.e.,
    -                // either single words or proper surrogate pairs.
    -                input += 16;
    -            } else if (c == 0xfffffffffffffffull) {
    -                // The 15 lower words of the input register contains valid UTF-16.
    -                // The 15th word may be either a low or high surrogate. It the next
    -                // iteration we 1) check if the low surrogate is followed by a high
    -                // one, 2) reject sole high surrogate.
    -                input += 15;
    -            } else {
    -                return nullptr;
    -            }
    +namespace simdutf {
    +namespace scalar {
    +namespace {
    +namespace utf8_to_latin1 {
    +
    +inline size_t convert_valid(const char* buf, size_t len, char* latin_output) {
    + const uint8_t *data = reinterpret_cast(buf);
    +
    +  size_t pos = 0;
    +  char* start{latin_output};
    +
    +  while (pos < len) {
    +    // try to convert the next block of 16 ASCII bytes
    +    if (pos + 16 <= len) { // if it is safe to read 16 more bytes, check that they are ascii
    +      uint64_t v1;
    +      ::memcpy(&v1, data + pos, sizeof(uint64_t));
    +      uint64_t v2;
    +      ::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t));
    +      uint64_t v{v1 | v2}; // We are only interested in these bits: 1000 1000 1000 1000, so it makes sense to concatenate everything
    +      if ((v & 0x8080808080808080) == 0) { // if NONE of these are set, e.g. all of them are zero, then everything is ASCII
    +        size_t final_pos = pos + 16;
    +        while(pos < final_pos) {
    +          *latin_output++ = char(buf[pos]);
    +          pos++;
             }
    +        continue;
    +      }
         }
    -    return input;
    +
    +    // suppose it is not an all ASCII byte sequence
    +    uint8_t leading_byte = data[pos]; // leading byte
    +    if (leading_byte < 0b10000000) {
    +      // converting one ASCII byte !!!
    +      *latin_output++ = char(leading_byte);
    +      pos++;
    +    } else if ((leading_byte & 0b11100000) == 0b11000000) { // the first three bits indicate:
    +      // We have a two-byte UTF-8
    +      if(pos + 1 >= len) { break; } // minimal bound checking
    +      if ((data[pos + 1] & 0b11000000) != 0b10000000) { return 0; } // checks if the next byte is a valid continuation byte in UTF-8. A valid continuation byte starts with 10.
    +      // range check -
    +      uint32_t code_point = (leading_byte & 0b00011111) << 6 | (data[pos + 1] & 0b00111111); // assembles the Unicode code point from the two bytes. It does this by discarding the leading 110 and 10 bits from the two bytes, shifting the remaining bits of the first byte, and then combining the results with a bitwise OR operation.
    +      *latin_output++ = char(code_point);
    +      pos += 2;
    +    } else {
    +      // we may have a continuation but we do not do error checking
    +      return 0;
    +    }
    +  }
    +  return latin_output - start;
     }
     
    +} // utf8_to_latin1 namespace
    +} // unnamed namespace
    +} // namespace scalar
    +} // namespace simdutf
    +
    +#endif
    +/* end file src/scalar/utf8_to_latin1/valid_utf8_to_latin1.h */
    +/* begin file src/scalar/utf16_to_latin1/valid_utf16_to_latin1.h */
    +#ifndef SIMDUTF_VALID_UTF16_TO_LATIN1_H
    +#define SIMDUTF_VALID_UTF16_TO_LATIN1_H
    +
    +namespace simdutf {
    +namespace scalar {
    +namespace {
    +namespace utf16_to_latin1 {
     
     template 
    -const result arm_validate_utf16_with_errors(const char16_t* input, size_t size) {
    -    const char16_t* start = input;
    -    const char16_t* end = input + size;
    +inline size_t convert_valid(const char16_t* buf, size_t len, char* latin_output) {
    + const uint16_t *data = reinterpret_cast(buf);
    +  size_t pos = 0;
    +  char* start{latin_output};
    +  uint16_t word = 0;
     
    -    const auto v_d8 = simd8::splat(0xd8);
    -    const auto v_f8 = simd8::splat(0xf8);
    -    const auto v_fc = simd8::splat(0xfc);
    -    const auto v_dc = simd8::splat(0xdc);
    -    while (input + 16 < end) {
    -        // 0. Load data: since the validation takes into account only higher
    -        //    byte of each word, we compress the two vectors into one which
    -        //    consists only the higher bytes.
    -        auto in0 = simd16(input);
    -        auto in1 = simd16(input + simd16::SIZE / sizeof(char16_t));
    +  while (pos < len) {
    +    word = !match_system(big_endian) ? utf16::swap_bytes(data[pos]) : data[pos];
    +    *latin_output++ = char(word);
    +    pos++;
    +  }
     
    -        if (!match_system(big_endian)) {
    -            #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -            const uint8x16_t swap = make_uint8x16_t(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14);
    -            #else
    -            const uint8x16_t swap = {1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14};
    -            #endif
    -            in0 = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(in0), swap));
    -            in1 = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(in1), swap));
    -        }
    -        const auto t0 = in0.shr<8>();
    -        const auto t1 = in1.shr<8>();
    -        const simd8 in = simd16::pack(t0, t1);
    -        // 1. Check whether we have any 0xD800..DFFF word (0b1101'1xxx'yyyy'yyyy).
    -        const uint64_t surrogates_wordmask = ((in & v_f8) == v_d8).to_bitmask64();
    -        if(surrogates_wordmask == 0) {
    -            input += 16;
    -        } else {
    -            // 2. We have some surrogates that have to be distinguished:
    -            //    - low  surrogates: 0b1101'10xx'yyyy'yyyy (0xD800..0xDBFF)
    -            //    - high surrogates: 0b1101'11xx'yyyy'yyyy (0xDC00..0xDFFF)
    -            //
    -            //    Fact: high surrogate has 11th bit set (3rd bit in the higher word)
    +  return latin_output - start;
    +}
     
    -            // V - non-surrogate words
    -            //     V = not surrogates_wordmask
    -            const uint64_t V = ~surrogates_wordmask;
    +} // utf16_to_latin1 namespace
    +} // unnamed namespace
    +} // namespace scalar
    +} // namespace simdutf
     
    -            // H - word-mask for high surrogates: the six highest bits are 0b1101'11
    -            const auto vH = ((in & v_fc) ==  v_dc);
    -            const uint64_t H = vH.to_bitmask64();
    +#endif
    +/* end file src/scalar/utf16_to_latin1/valid_utf16_to_latin1.h */
    +/* begin file src/scalar/utf32_to_latin1/valid_utf32_to_latin1.h */
    +#ifndef SIMDUTF_VALID_UTF32_TO_LATIN1_H
    +#define SIMDUTF_VALID_UTF32_TO_LATIN1_H
     
    -            // L - word mask for low surrogates
    -            //     L = not H and surrogates_wordmask
    -            const uint64_t L = ~H & surrogates_wordmask;
    -
    -            const uint64_t a = L & (H >> 4); // A low surrogate must be followed by high one.
    -                              // (A low surrogate placed in the 7th register's word
    -                              // is an exception we handle.)
    -            const uint64_t b = a << 4; // Just mark that the opposite fact is hold,
    -                          // thanks to that we have only two masks for valid case.
    -            const uint64_t c = V | a | b;      // Combine all the masks into the final one.
    -            if (c == ~0ull) {
    -                // The whole input register contains valid UTF-16, i.e.,
    -                // either single words or proper surrogate pairs.
    -                input += 16;
    -            } else if (c == 0xfffffffffffffffull) {
    -                // The 15 lower words of the input register contains valid UTF-16.
    -                // The 15th word may be either a low or high surrogate. It the next
    -                // iteration we 1) check if the low surrogate is followed by a high
    -                // one, 2) reject sole high surrogate.
    -                input += 15;
    -            } else {
    -                return result(error_code::SURROGATE, input - start);
    -            }
    -        }
    -    }
    -    return result(error_code::SUCCESS, input - start);
    -}
    -/* end file src/arm64/arm_validate_utf16.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=arm64/arm_validate_utf32le.cpp
    -/* begin file src/arm64/arm_validate_utf32le.cpp */
    -
    -const char32_t* arm_validate_utf32le(const char32_t* input, size_t size) {
    -    const char32_t* end = input + size;
    -
    -    const uint32x4_t standardmax = vmovq_n_u32(0x10ffff);
    -    const uint32x4_t offset = vmovq_n_u32(0xffff2000);
    -    const uint32x4_t standardoffsetmax = vmovq_n_u32(0xfffff7ff);
    -    uint32x4_t currentmax = vmovq_n_u32(0x0);
    -    uint32x4_t currentoffsetmax = vmovq_n_u32(0x0);
    +namespace simdutf {
    +namespace scalar {
    +namespace {
    +namespace utf32_to_latin1 {
     
    -    while (input + 4 < end) {
    -        const uint32x4_t in = vld1q_u32(reinterpret_cast(input));
    -        currentmax = vmaxq_u32(in,currentmax);
    -        currentoffsetmax = vmaxq_u32(vaddq_u32(in, offset), currentoffsetmax);
    -        input += 4;
    -    }
    +inline size_t convert_valid(const char32_t *buf, size_t len, char *latin1_output) {
    +  const uint32_t *data = reinterpret_cast(buf);
    +  char* start = latin1_output;
    +  uint32_t utf32_char;
    +  size_t pos = 0;
     
    -    uint32x4_t is_zero = veorq_u32(vmaxq_u32(currentmax, standardmax), standardmax);
    -    if(vmaxvq_u32(is_zero) != 0) {
    -        return nullptr;
    -    }
    +  while (pos < len) {
    +  utf32_char = (uint32_t)data[pos];
     
    -    is_zero = veorq_u32(vmaxq_u32(currentoffsetmax, standardoffsetmax), standardoffsetmax);
    -    if(vmaxvq_u32(is_zero) != 0) {
    -        return nullptr;
    +  if (pos + 2 <= len) { // if it is safe to read 8 more bytes, check that they are Latin1
    +      uint64_t v;
    +      ::memcpy(&v, data + pos, sizeof(uint64_t));
    +      if ((v & 0xFFFFFF00FFFFFF00) == 0) {
    +      *latin1_output++ = char(buf[pos]);
    +      *latin1_output++ = char(buf[pos+1]);
    +      pos += 2;
    +      continue;
         }
    +  }
    +  *latin1_output++ = (char)(utf32_char & 0xFF);
    +  pos++;
     
    -    return input;
    +  }
    +  return latin1_output - start;
     }
     
     
    -const result arm_validate_utf32le_with_errors(const char32_t* input, size_t size) {
    -    const char32_t* start = input;
    -    const char32_t* end = input + size;
    -
    -    const uint32x4_t standardmax = vmovq_n_u32(0x10ffff);
    -    const uint32x4_t offset = vmovq_n_u32(0xffff2000);
    -    const uint32x4_t standardoffsetmax = vmovq_n_u32(0xfffff7ff);
    -    uint32x4_t currentmax = vmovq_n_u32(0x0);
    -    uint32x4_t currentoffsetmax = vmovq_n_u32(0x0);
    +} // utf32_to_latin1 namespace
    +} // unnamed namespace
    +} // namespace scalar
    +} // namespace simdutf
     
    -    while (input + 4 < end) {
    -        const uint32x4_t in = vld1q_u32(reinterpret_cast(input));
    -        currentmax = vmaxq_u32(in,currentmax);
    -        currentoffsetmax = vmaxq_u32(vaddq_u32(in, offset), currentoffsetmax);
    +#endif
    +/* end file src/scalar/utf32_to_latin1/valid_utf32_to_latin1.h */
     
    -        uint32x4_t is_zero = veorq_u32(vmaxq_u32(currentmax, standardmax), standardmax);
    -        if(vmaxvq_u32(is_zero) != 0) {
    -            return result(error_code::TOO_LARGE, input - start);
    -        }
     
    -        is_zero = veorq_u32(vmaxq_u32(currentoffsetmax, standardoffsetmax), standardoffsetmax);
    -        if(vmaxvq_u32(is_zero) != 0) {
    -            return result(error_code::SURROGATE, input - start);
    -        }
     
    -        input += 4;
    -    }
    +SIMDUTF_PUSH_DISABLE_WARNINGS
    +SIMDUTF_DISABLE_UNDESIRED_WARNINGS
     
    -    return result(error_code::SUCCESS, input - start);
    -}
    -/* end file src/arm64/arm_validate_utf32le.cpp */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=arm64/arm_convert_utf8_to_utf16.cpp
    -/* begin file src/arm64/arm_convert_utf8_to_utf16.cpp */
    -// Convert up to 12 bytes from utf8 to utf16 using a mask indicating the
    -// end of the code points. Only the least significant 12 bits of the mask
    -// are accessed.
    -// It returns how many bytes were consumed (up to 12).
    -template 
    -size_t convert_masked_utf8_to_utf16(const char *input,
    -                           uint64_t utf8_end_of_code_point_mask,
    -                           char16_t *&utf16_output) {
    -  // we use an approach where we try to process up to 12 input bytes.
    -  // Why 12 input bytes and not 16? Because we are concerned with the size of
    -  // the lookup tables. Also 12 is nicely divisible by two and three.
    -  //
    -  #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -  const uint8x16_t swap = make_uint8x16_t(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14);
    -  #else
    -  const uint8x16_t swap = {1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14};
    -  #endif
    -  uint8x16_t in = vld1q_u8(reinterpret_cast(input));
    -  const uint16_t input_utf8_end_of_code_point_mask =
    -      utf8_end_of_code_point_mask & 0xfff;
    -  //
    -  // Optimization note: our main path below is load-latency dependent. Thus it is maybe
    -  // beneficial to have fast paths that depend on branch prediction but have less latency.
    -  // This results in more instructions but, potentially, also higher speeds.
    -  //
    -  // We first try a few fast paths.
    -  if((utf8_end_of_code_point_mask & 0xffff) == 0xffff) {
    -    // We process in chunks of 16 bytes
    -    uint16x8_t ascii_first = vmovl_u8(vget_low_u8 (in));
    -    uint16x8_t ascii_second = vmovl_high_u8(in);
    -    if (!match_system(big_endian)) {
    -      ascii_first = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(ascii_first), swap));
    -      ascii_second = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(ascii_second), swap));
    -    }
    -    vst1q_u16(reinterpret_cast(utf16_output), ascii_first);
    -    vst1q_u16(reinterpret_cast(utf16_output) + 8, ascii_second);
    -    utf16_output += 16; // We wrote 16 16-bit characters.
    -    return 16; // We consumed 16 bytes.
    -  }
    -  if((utf8_end_of_code_point_mask & 0xffff) == 0xaaaa) {
    -    // We want to take 8 2-byte UTF-8 words and turn them into 8 2-byte UTF-16 words.
    -    // There is probably a more efficient sequence, but the following might do.
    -    uint8x16_t perm = vqtbl1q_u8(in, swap);
    -    uint8x16_t ascii = vandq_u8(perm, vreinterpretq_u8_u16(vmovq_n_u16(0x7f)));
    -    uint8x16_t highbyte = vandq_u8(perm, vreinterpretq_u8_u16(vmovq_n_u16(0x1f00)));
    -    uint8x16_t composed = vorrq_u8(ascii, vreinterpretq_u8_u16(vshrq_n_u16(vreinterpretq_u16_u8(highbyte), 2)));
    -    if (!match_system(big_endian)) composed = vqtbl1q_u8(composed, swap);
    -    vst1q_u8(reinterpret_cast(utf16_output), composed);
    -    utf16_output += 8; // We wrote 16 bytes, 8 code points.
    -    return 16;
    -  }
    -  if(input_utf8_end_of_code_point_mask == 0x924) {
    -    // We want to take 4 3-byte UTF-8 words and turn them into 4 2-byte UTF-16 words.
    -    // There is probably a more efficient sequence, but the following might do.
    -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -    const uint8x16_t sh = make_uint8x16_t(2, 1, 0, 255, 5, 4, 3, 255, 8, 7, 6, 255, 11, 10, 9, 255);
    -#else
    -    const uint8x16_t sh = {2, 1, 0, 255, 5, 4, 3, 255, 8, 7, 6, 255, 11, 10, 9, 255};
    +#if SIMDUTF_IMPLEMENTATION_ARM64
    +/* begin file src/arm64/implementation.cpp */
    +/* begin file src/simdutf/arm64/begin.h */
    +// redefining SIMDUTF_IMPLEMENTATION to "arm64"
    +// #define SIMDUTF_IMPLEMENTATION arm64
    +/* end file src/simdutf/arm64/begin.h */
    +namespace simdutf {
    +namespace arm64 {
    +namespace {
    +#ifndef SIMDUTF_ARM64_H
    +#error "arm64.h must be included"
     #endif
    -    uint8x16_t perm = vqtbl1q_u8(in, sh);
    -    uint8x16_t ascii =
    -        vandq_u8(perm, vreinterpretq_u8_u32(vmovq_n_u32(0x7f))); // 7 or 6 bits
    -    uint8x16_t middlebyte =
    -        vandq_u8(perm, vreinterpretq_u8_u32(vmovq_n_u32(0x3f00))); // 5 or 6 bits
    -    uint8x16_t middlebyte_shifted = vreinterpretq_u8_u32(vshrq_n_u32(vreinterpretq_u32_u8(middlebyte), 2));
    -    uint32x4_t highbyte =
    -        vreinterpretq_u32_u8(vandq_u8(perm, vreinterpretq_u8_u32(vmovq_n_u32(0x0f0000)))); // 4 bits
    -    uint32x4_t highbyte_shifted = vshrq_n_u32(highbyte, 4);
    -    uint32x4_t composed =
    -        vorrq_u32(vorrq_u32(vreinterpretq_u32_u8(ascii), vreinterpretq_u32_u8(middlebyte_shifted)), highbyte_shifted);
    -    uint16x8_t composed_repacked = vmovn_high_u32(vmovn_u32(composed), composed);
    -    if (!match_system(big_endian)) composed_repacked = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(composed_repacked), swap));
    -    vst1q_u16(reinterpret_cast(utf16_output), composed_repacked);
    -    utf16_output += 4;
    -    return 12;
    -  }
    -  /// We do not have a fast path available, so we fallback.
    +using namespace simd;
     
    -  const uint8_t idx =
    -      simdutf::tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][0];
    -  const uint8_t consumed =
    -      simdutf::tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][1];
    +simdutf_really_inline bool is_ascii(const simd8x64& input) {
    +    simd8 bits = input.reduce_or();
    +    return bits.max_val() < 0b10000000u;
    +}
     
    +simdutf_unused simdutf_really_inline simd8 must_be_continuation(const simd8 prev1, const simd8 prev2, const simd8 prev3) {
    +    simd8 is_second_byte = prev1 >= uint8_t(0b11000000u);
    +    simd8 is_third_byte  = prev2 >= uint8_t(0b11100000u);
    +    simd8 is_fourth_byte = prev3 >= uint8_t(0b11110000u);
    +    // Use ^ instead of | for is_*_byte, because ^ is commutative, and the caller is using ^ as well.
    +    // This will work fine because we only have to report errors for cases with 0-1 lead bytes.
    +    // Multiple lead bytes implies 2 overlapping multibyte characters, and if that happens, there is
    +    // guaranteed to be at least *one* lead byte that is part of only 1 other multibyte character.
    +    // The error will be detected there.
    +    return is_second_byte ^ is_third_byte ^ is_fourth_byte;
    +}
     
    -  if (idx < 64) {
    -    // SIX (6) input code-words
    -    // this is a relatively easy scenario
    -    // we process SIX (6) input code-words. The max length in bytes of six code
    -    // words spanning between 1 and 2 bytes each is 12 bytes.
    -    uint8x16_t sh = vld1q_u8(reinterpret_cast(simdutf::tables::utf8_to_utf16::shufutf8[idx]));
    -    uint8x16_t perm = vqtbl1q_u8(in, sh);
    -    uint8x16_t ascii = vandq_u8(perm, vreinterpretq_u8_u16(vmovq_n_u16(0x7f)));
    -    uint8x16_t highbyte = vandq_u8(perm, vreinterpretq_u8_u16(vmovq_n_u16(0x1f00)));
    -    uint8x16_t composed = vorrq_u8(ascii, vreinterpretq_u8_u16(vshrq_n_u16(vreinterpretq_u16_u8(highbyte), 2)));
    -    if (!match_system(big_endian)) composed = vqtbl1q_u8(composed, swap);
    -    vst1q_u8(reinterpret_cast(utf16_output), composed);
    -    utf16_output += 6; // We wrote 12 bytes, 6 code points.
    -  } else if (idx < 145) {
    -    // FOUR (4) input code-words
    -    uint8x16_t sh = vld1q_u8(reinterpret_cast(simdutf::tables::utf8_to_utf16::shufutf8[idx]));
    -    uint8x16_t perm = vqtbl1q_u8(in, sh);
    -    uint8x16_t ascii =
    -        vandq_u8(perm, vreinterpretq_u8_u32(vmovq_n_u32(0x7f))); // 7 or 6 bits
    -    uint8x16_t middlebyte =
    -        vandq_u8(perm, vreinterpretq_u8_u32(vmovq_n_u32(0x3f00))); // 5 or 6 bits
    -    uint8x16_t middlebyte_shifted = vreinterpretq_u8_u32(vshrq_n_u32(vreinterpretq_u32_u8(middlebyte), 2));
    -    uint32x4_t highbyte =
    -        vreinterpretq_u32_u8(vandq_u8(perm, vreinterpretq_u8_u32(vmovq_n_u32(0x0f0000)))); // 4 bits
    -    uint32x4_t highbyte_shifted = vshrq_n_u32(highbyte, 4);
    -    uint32x4_t composed =
    -        vorrq_u32(vorrq_u32(vreinterpretq_u32_u8(ascii), vreinterpretq_u32_u8(middlebyte_shifted)), highbyte_shifted);
    -    uint16x8_t composed_repacked = vmovn_high_u32(vmovn_u32(composed), composed);
    -    if (!match_system(big_endian)) composed_repacked = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(composed_repacked), swap));
    -    vst1q_u16(reinterpret_cast(utf16_output), composed_repacked);
    -    utf16_output += 4;
    -  } else if (idx < 209) {
    -    // TWO (2) input code-words
    -    //////////////
    -    // There might be garbage inputs where a leading byte mascarades as a four-byte
    -    // leading byte (by being followed by 3 continuation byte), but is not greater than
    -    // 0xf0. This could trigger a buffer overflow if we only counted leading
    -    // bytes of the form 0xf0 as generating surrogate pairs, without further UTF-8 validation.
    -    // Thus we must be careful to ensure that only leading bytes at least as large as 0xf0 generate surrogate pairs.
    -    // We do as at the cost of an extra mask.
    -    /////////////
    -    uint8x16_t sh = vld1q_u8(reinterpret_cast(simdutf::tables::utf8_to_utf16::shufutf8[idx]));
    -    uint8x16_t perm = vqtbl1q_u8(in, sh);
    -    uint8x16_t ascii = vandq_u8(perm, vreinterpretq_u8_u32(vmovq_n_u32(0x7f)));
    -    uint8x16_t middlebyte = vandq_u8(perm, vreinterpretq_u8_u32(vmovq_n_u32(0x3f00)));
    -    uint8x16_t middlebyte_shifted = vreinterpretq_u8_u32(vshrq_n_u32(vreinterpretq_u32_u8(middlebyte), 2));
    -    uint8x16_t middlehighbyte = vandq_u8(perm, vreinterpretq_u8_u32(vmovq_n_u32(0x3f0000)));
    -    // correct for spurious high bit
    -    uint8x16_t correct =
    -        vreinterpretq_u8_u32(vshrq_n_u32(vreinterpretq_u32_u8(vandq_u8(perm, vreinterpretq_u8_u32(vmovq_n_u32(0x400000)))), 1));
    -    middlehighbyte = veorq_u8(correct, middlehighbyte);
    -    uint8x16_t middlehighbyte_shifted = vreinterpretq_u8_u32(vshrq_n_u32(vreinterpretq_u32_u8(middlehighbyte), 4));
    -    // We deliberately carry the leading four bits if they are present, we remove
    -    // them later when computing hightenbits.
    -    uint8x16_t highbyte = vandq_u8(perm, vreinterpretq_u8_u32(vmovq_n_u32(0xff000000)));
    -    uint8x16_t highbyte_shifted = vreinterpretq_u8_u32(vshrq_n_u32(vreinterpretq_u32_u8(highbyte), 6));
    -    // When we need to generate a surrogate pair (leading byte > 0xF0), then
    -    // the corresponding 32-bit value in 'composed'  will be greater than
    -    // > (0xff00000>>6) or > 0x3c00000. This can be used later to identify the
    -    // location of the surrogate pairs.
    -    uint8x16_t composed =
    -        vorrq_u8(vorrq_u8(ascii, middlebyte_shifted),
    -                     vorrq_u8(highbyte_shifted, middlehighbyte_shifted));
    -    uint32x4_t composedminus =
    -        vsubq_u32(vreinterpretq_u32_u8(composed), vmovq_n_u32(0x10000));
    -    uint32x4_t lowtenbits =
    -        vandq_u32(composedminus, vmovq_n_u32(0x3ff));
    -    // Notice the 0x3ff mask:
    -    uint32x4_t hightenbits = vandq_u32(vshrq_n_u32(composedminus, 10), vmovq_n_u32(0x3ff));
    -    uint32x4_t lowtenbitsadd =
    -        vaddq_u32(lowtenbits, vmovq_n_u32(0xDC00));
    -    uint32x4_t hightenbitsadd =
    -        vaddq_u32(hightenbits, vmovq_n_u32(0xD800));
    -    uint32x4_t lowtenbitsaddshifted = vshlq_n_u32(lowtenbitsadd, 16);
    -    uint32x4_t surrogates =
    -        vorrq_u32(hightenbitsadd, lowtenbitsaddshifted);
    -    uint32_t basic_buffer[4];
    -    uint32_t basic_buffer_swap[4];
    -    if (!match_system(big_endian)) {
    -      vst1q_u32(basic_buffer_swap, vreinterpretq_u32_u8(vqtbl1q_u8(composed, swap)));
    -      surrogates = vreinterpretq_u32_u8(vqtbl1q_u8(vreinterpretq_u8_u32(surrogates), swap));
    -    }
    -    vst1q_u32(basic_buffer, vreinterpretq_u32_u8(composed));
    -    uint32_t surrogate_buffer[4];
    -    vst1q_u32(surrogate_buffer, surrogates);
    -    for (size_t i = 0; i < 3; i++) {
    -      if(basic_buffer[i] > 0x3c00000) {
    -        utf16_output[0] = uint16_t(surrogate_buffer[i] & 0xffff);
    -        utf16_output[1] = uint16_t(surrogate_buffer[i] >> 16);
    -        utf16_output += 2;
    -      } else {
    -        utf16_output[0] = !match_system(big_endian) ? uint16_t(basic_buffer_swap[i]) : uint16_t(basic_buffer[i]);
    -        utf16_output++;
    -      }
    -    }
    -  } else {
    -    // here we know that there is an error but we do not handle errors
    -  }
    -  return consumed;
    +simdutf_really_inline simd8 must_be_2_3_continuation(const simd8 prev2, const simd8 prev3) {
    +    simd8 is_third_byte  = prev2 >= uint8_t(0b11100000u);
    +    simd8 is_fourth_byte = prev3 >= uint8_t(0b11110000u);
    +    return is_third_byte ^ is_fourth_byte;
     }
    -/* end file src/arm64/arm_convert_utf8_to_utf16.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=arm64/arm_convert_utf8_to_utf32.cpp
    -/* begin file src/arm64/arm_convert_utf8_to_utf32.cpp */
    -// Convert up to 12 bytes from utf8 to utf32 using a mask indicating the
    -// end of the code points. Only the least significant 12 bits of the mask
    -// are accessed.
    -// It returns how many bytes were consumed (up to 12).
    -size_t convert_masked_utf8_to_utf32(const char *input,
    -                           uint64_t utf8_end_of_code_point_mask,
    -                           char32_t *&utf32_out) {
    -  // we use an approach where we try to process up to 12 input bytes.
    -  // Why 12 input bytes and not 16? Because we are concerned with the size of
    -  // the lookup tables. Also 12 is nicely divisible by two and three.
    -  //
    -  uint32_t*& utf32_output = reinterpret_cast(utf32_out);
    -  uint8x16_t in = vld1q_u8(reinterpret_cast(input));
    -  const uint16_t input_utf8_end_of_code_point_mask =
    -      utf8_end_of_code_point_mask & 0xFFF;
    -  //
    -  // Optimization note: our main path below is load-latency dependent. Thus it is maybe
    -  // beneficial to have fast paths that depend on branch prediction but have less latency.
    -  // This results in more instructions but, potentially, also higher speeds.
    -  //
    -  // We first try a few fast paths.
    -  if((utf8_end_of_code_point_mask & 0xffff) == 0xffff) {
    -    // We process in chunks of 16 bytes
    -    vst1q_u32(utf32_output, vmovl_u16(vget_low_u16(vmovl_u8(vget_low_u8 (in)))));
    -    vst1q_u32(utf32_output + 4, vmovl_high_u16(vmovl_u8(vget_low_u8 (in))));
    -    vst1q_u32(utf32_output + 8, vmovl_u16(vget_low_u16(vmovl_high_u8(in))));
    -    vst1q_u32(utf32_output + 12, vmovl_high_u16(vmovl_high_u8(in)));
    -    utf32_output += 16; // We wrote 16 16-bit characters.
    -    return 16; // We consumed 16 bytes.
    -  }
    -  if((utf8_end_of_code_point_mask & 0xffff) == 0xaaaa) {
    -    // We want to take 8 2-byte UTF-8 words and turn them into 8 4-byte UTF-32 words.
    -    // There is probably a more efficient sequence, but the following might do.
    -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -    const uint8x16_t sh = make_uint8x16_t(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14);
    -#else
    -    //const uint8x16_t sh = {1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14};
    -    const uint8x16_t sh = {1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14};
    -#endif
    -    uint8x16_t perm = vqtbl1q_u8(in, sh);
    -    uint8x16_t ascii = vandq_u8(perm, vreinterpretq_u8_u16(vmovq_n_u16(0x7f)));
    -    uint8x16_t highbyte = vandq_u8(perm, vreinterpretq_u8_u16(vmovq_n_u16(0x1f00)));
    -    uint8x16_t composed = vorrq_u8(ascii, vreinterpretq_u8_u16(vshrq_n_u16(vreinterpretq_u16_u8(highbyte), 2)));
    -    vst1q_u32(utf32_output,  vmovl_u16(vget_low_u16(vreinterpretq_u16_u8(composed))));
    -    vst1q_u32(utf32_output+4,  vmovl_high_u16(vreinterpretq_u16_u8(composed)));
    -    utf32_output += 8; // We wrote 32 bytes, 8 code points.
    -    return 16;
    -  }
    -  if(input_utf8_end_of_code_point_mask == 0x924) {
    -    // We want to take 4 3-byte UTF-8 words and turn them into 4 4-byte UTF-32 words.
    -    // There is probably a more efficient sequence, but the following might do.
    +
    +// common functions for utf8 conversions
    +simdutf_really_inline uint16x4_t convert_utf8_3_byte_to_utf16(uint8x16_t in) {
    +  // Low half contains  10cccccc|1110aaaa
    +  // High half contains 10bbbbbb|10bbbbbb
     #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -    const uint8x16_t sh = make_uint8x16_t(2, 1, 0, 255, 5, 4, 3, 255, 8, 7, 6, 255, 11, 10, 9, 255);
    +  const uint8x16_t sh = simdutf_make_uint8x16_t(0, 2, 3, 5, 6, 8, 9, 11, 1, 1, 4, 4, 7, 7, 10, 10);
     #else
    -    const uint8x16_t sh = {2, 1, 0, 255, 5, 4, 3, 255, 8, 7, 6, 255, 11, 10, 9, 255};
    +  const uint8x16_t sh = {0, 2, 3, 5, 6, 8, 9, 11, 1, 1, 4, 4, 7, 7, 10, 10};
     #endif
    -    uint8x16_t perm = vqtbl1q_u8(in, sh);
    -    uint8x16_t ascii =
    -        vandq_u8(perm, vreinterpretq_u8_u32(vmovq_n_u32(0x7f))); // 7 or 6 bits
    -    uint8x16_t middlebyte =
    -        vandq_u8(perm, vreinterpretq_u8_u32(vmovq_n_u32(0x3f00))); // 5 or 6 bits
    -    uint8x16_t middlebyte_shifted = vreinterpretq_u8_u32(vshrq_n_u32(vreinterpretq_u32_u8(middlebyte), 2));
    -    uint32x4_t highbyte =
    -        vreinterpretq_u32_u8(vandq_u8(perm, vreinterpretq_u8_u32(vmovq_n_u32(0x0f0000)))); // 4 bits
    -    uint32x4_t highbyte_shifted = vshrq_n_u32(highbyte, 4);
    -    uint32x4_t composed =
    -        vorrq_u32(vorrq_u32(vreinterpretq_u32_u8(ascii), vreinterpretq_u32_u8(middlebyte_shifted)), highbyte_shifted);
    -    vst1q_u32(utf32_output, composed);
    -    utf32_output += 4;
    -    return 12;
    -  }
    -  /// We do not have a fast path available, so we fallback.
    -
    -  const uint8_t idx =
    -      simdutf::tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][0];
    -  const uint8_t consumed =
    -      simdutf::tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][1];
    +  uint8x16_t perm = vqtbl1q_u8(in, sh);
    +  // Split into half vectors.
    +  // 10cccccc|1110aaaa
    +  uint8x8_t perm_low = vget_low_u8(perm); // no-op
    +  // 10bbbbbb|10bbbbbb
    +  uint8x8_t perm_high = vget_high_u8(perm);
    +  // xxxxxxxx 10bbbbbb
    +  uint16x4_t mid = vreinterpret_u16_u8(perm_high); // no-op
    +  // xxxxxxxx 1110aaaa
    +  uint16x4_t high = vreinterpret_u16_u8(perm_low); // no-op
    +  // Assemble with shift left insert.
    +  // xxxxxxaa aabbbbbb
    +  uint16x4_t mid_high = vsli_n_u16(mid, high, 6);
    +  // (perm_low << 8) | (perm_low >> 8)
    +  // xxxxxxxx 10cccccc
    +  uint16x4_t low = vreinterpret_u16_u8(vrev16_u8(perm_low));
    +  // Shift left insert into the low bits
    +  // aaaabbbb bbcccccc
    +  uint16x4_t composed = vsli_n_u16(low, mid_high, 6);
    +  return composed;
    +}
    +
    +simdutf_really_inline uint16x8_t convert_utf8_2_byte_to_utf16(uint8x16_t in) {
    +  // Converts 6 2 byte UTF-8 characters to 6 UTF-16 characters.
    +  // Technically this calculates 8, but 6 does better and happens more often
    +  // (The languages which use these codepoints use ASCII spaces so 8 would need to be
    +  // in the middle of a very long word).
    +
    +  // 10bbbbbb 110aaaaa
    +  uint16x8_t upper = vreinterpretq_u16_u8(in);
    +  // (in << 8) | (in >> 8)
    +  // 110aaaaa 10bbbbbb
    +  uint16x8_t lower = vreinterpretq_u16_u8(vrev16q_u8(in));
    +  // 00000000 000aaaaa
    +  uint16x8_t upper_masked = vandq_u16(upper, vmovq_n_u16(0x1F));
    +  // Assemble with shift left insert.
    +  // 00000aaa aabbbbbb
    +  uint16x8_t composed = vsliq_n_u16(lower, upper_masked, 6);
    +  return composed;
    +}
    +
    +simdutf_really_inline uint16x8_t convert_utf8_1_to_2_byte_to_utf16(uint8x16_t in, size_t shufutf8_idx) {
    +  // Converts 6 1-2 byte UTF-8 characters to 6 UTF-16 characters.
    +  // This is a relatively easy scenario
    +  // we process SIX (6) input code-code units. The max length in bytes of six code
    +  // code units spanning between 1 and 2 bytes each is 12 bytes.
    +  uint8x16_t sh = vld1q_u8(reinterpret_cast(simdutf::tables::utf8_to_utf16::shufutf8[shufutf8_idx]));
    +  // Shuffle
    +  // 1 byte: 00000000 0bbbbbbb
    +  // 2 byte: 110aaaaa 10bbbbbb
    +  uint16x8_t perm = vreinterpretq_u16_u8(vqtbl1q_u8(in, sh));
    +  // Mask
    +  // 1 byte: 00000000 0bbbbbbb
    +  // 2 byte: 00000000 00bbbbbb
    +  uint16x8_t ascii = vandq_u16(perm, vmovq_n_u16(0x7f)); // 6 or 7 bits
    +  // 1 byte: 00000000 00000000
    +  // 2 byte: 000aaaaa 00000000
    +  uint16x8_t highbyte = vandq_u16(perm, vmovq_n_u16(0x1f00)); // 5 bits
    +  // Combine with a shift right accumulate
    +  // 1 byte: 00000000 0bbbbbbb
    +  // 2 byte: 00000aaa aabbbbbb
    +  uint16x8_t composed = vsraq_n_u16(ascii, highbyte, 2);
    +  return composed;
    +}
     
    +/* begin file src/arm64/arm_detect_encodings.cpp */
    +template
    +// len is known to be a multiple of 2 when this is called
    +int arm_detect_encodings(const char * buf, size_t len) {
    +    const char* start = buf;
    +    const char* end = buf + len;
     
    -  if (idx < 64) {
    -    // SIX (6) input code-words
    -    // this is a relatively easy scenario
    -    // we process SIX (6) input code-words. The max length in bytes of six code
    -    // words spanning between 1 and 2 bytes each is 12 bytes.
    -    uint8x16_t sh = vld1q_u8(reinterpret_cast(simdutf::tables::utf8_to_utf16::shufutf8[idx]));
    -    uint8x16_t perm = vqtbl1q_u8(in, sh);
    -    uint8x16_t ascii = vandq_u8(perm, vreinterpretq_u8_u16(vmovq_n_u16(0x7f)));
    -    uint8x16_t highbyte = vandq_u8(perm, vreinterpretq_u8_u16(vmovq_n_u16(0x1f00)));
    -    uint8x16_t composed = vorrq_u8(ascii, vreinterpretq_u8_u16(vshrq_n_u16(vreinterpretq_u16_u8(highbyte), 2)));
    -    vst1q_u32(utf32_output,  vmovl_u16(vget_low_u16(vreinterpretq_u16_u8(composed))));
    -    vst1q_u32(utf32_output+4,  vmovl_high_u16(vreinterpretq_u16_u8(composed)));
    -    utf32_output += 6; // We wrote 12 bytes, 6 code points.
    -  } else if (idx < 145) {
    -    // FOUR (4) input code-words
    -    uint8x16_t sh = vld1q_u8(reinterpret_cast(simdutf::tables::utf8_to_utf16::shufutf8[idx]));
    -    uint8x16_t perm = vqtbl1q_u8(in, sh);
    -    uint8x16_t ascii =
    -        vandq_u8(perm, vreinterpretq_u8_u32(vmovq_n_u32(0x7f))); // 7 or 6 bits
    -    uint8x16_t middlebyte =
    -        vandq_u8(perm, vreinterpretq_u8_u32(vmovq_n_u32(0x3f00))); // 5 or 6 bits
    -    uint8x16_t middlebyte_shifted = vreinterpretq_u8_u32(vshrq_n_u32(vreinterpretq_u32_u8(middlebyte), 2));
    -    uint32x4_t highbyte =
    -        vreinterpretq_u32_u8(vandq_u8(perm, vreinterpretq_u8_u32(vmovq_n_u32(0x0f0000)))); // 4 bits
    -    uint32x4_t highbyte_shifted = vshrq_n_u32(highbyte, 4);
    -    uint32x4_t composed =
    -        vorrq_u32(vorrq_u32(vreinterpretq_u32_u8(ascii), vreinterpretq_u32_u8(middlebyte_shifted)), highbyte_shifted);
    -    vst1q_u32(utf32_output, composed);
    -    utf32_output += 4;
    -  } else if (idx < 209) {
    -    // TWO (2) input code-words
    -    uint8x16_t sh = vld1q_u8(reinterpret_cast(simdutf::tables::utf8_to_utf16::shufutf8[idx]));
    -    uint8x16_t perm = vqtbl1q_u8(in, sh);
    -    uint8x16_t ascii = vandq_u8(perm, vreinterpretq_u8_u32(vmovq_n_u32(0x7f)));
    -    uint8x16_t middlebyte = vandq_u8(perm, vreinterpretq_u8_u32(vmovq_n_u32(0x3f00)));
    -    uint8x16_t middlebyte_shifted = vreinterpretq_u8_u32(vshrq_n_u32(vreinterpretq_u32_u8(middlebyte), 2));
    -    uint8x16_t middlehighbyte = vandq_u8(perm, vreinterpretq_u8_u32(vmovq_n_u32(0x3f0000)));
    -    // correct for spurious high bit
    -    uint8x16_t correct =
    -        vreinterpretq_u8_u32(vshrq_n_u32(vreinterpretq_u32_u8(vandq_u8(perm, vreinterpretq_u8_u32(vmovq_n_u32(0x400000)))), 1));
    -    middlehighbyte = veorq_u8(correct, middlehighbyte);
    -    uint8x16_t middlehighbyte_shifted = vreinterpretq_u8_u32(vshrq_n_u32(vreinterpretq_u32_u8(middlehighbyte), 4));
    -    uint8x16_t highbyte = vandq_u8(perm, vreinterpretq_u8_u32(vmovq_n_u32(0x07000000)));
    -    uint8x16_t highbyte_shifted =vreinterpretq_u8_u32(vshrq_n_u32(vreinterpretq_u32_u8(highbyte), 6));
    -    uint8x16_t composed =
    -        vorrq_u8(vorrq_u8(ascii, middlebyte_shifted),
    -                     vorrq_u8(highbyte_shifted, middlehighbyte_shifted));
    -    vst1q_u32(utf32_output, vreinterpretq_u32_u8(composed));
    -    utf32_output += 3;
    -  } else {
    -    // here we know that there is an error but we do not handle errors
    -  }
    -  return consumed;
    -}
    -/* end file src/arm64/arm_convert_utf8_to_utf32.cpp */
    +    bool is_utf8 = true;
    +    bool is_utf16 = true;
    +    bool is_utf32 = true;
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=arm64/arm_convert_utf16_to_utf8.cpp
    -/* begin file src/arm64/arm_convert_utf16_to_utf8.cpp */
    -/*
    -    The vectorized algorithm works on single SSE register i.e., it
    -    loads eight 16-bit words.
    +    int out = 0;
     
    -    We consider three cases:
    -    1. an input register contains no surrogates and each value
    -       is in range 0x0000 .. 0x07ff.
    -    2. an input register contains no surrogates and values are
    -       is in range 0x0000 .. 0xffff.
    -    3. an input register contains surrogates --- i.e. codepoints
    -       can have 16 or 32 bits.
    +    const auto v_d8 = simd8::splat(0xd8);
    +    const auto v_f8 = simd8::splat(0xf8);
     
    -    Ad 1.
    +    uint32x4_t currentmax = vmovq_n_u32(0x0);
     
    -    When values are less than 0x0800, it means that a 16-bit words
    -    can be converted into: 1) single UTF8 byte (when it's an ASCII
    -    char) or 2) two UTF8 bytes.
    +    checker check{};
     
    -    For this case we do only some shuffle to obtain these 2-byte
    -    codes and finally compress the whole SSE register with a single
    -    shuffle.
    +    while(buf + 64 <= end) {
    +        uint16x8_t in = vld1q_u16(reinterpret_cast(buf));
    +        uint16x8_t secondin = vld1q_u16(reinterpret_cast(buf) + simd16::SIZE / sizeof(char16_t));
    +        uint16x8_t thirdin = vld1q_u16(reinterpret_cast(buf) + 2*simd16::SIZE / sizeof(char16_t));
    +        uint16x8_t fourthin = vld1q_u16(reinterpret_cast(buf) + 3*simd16::SIZE / sizeof(char16_t));
     
    -    We need 256-entry lookup table to get a compression pattern
    -    and the number of output bytes in the compressed vector register.
    -    Each entry occupies 17 bytes.
    +        const auto u0 = simd16(in);
    +        const auto u1 = simd16(secondin);
    +        const auto u2 = simd16(thirdin);
    +        const auto u3 = simd16(fourthin);
     
    -    Ad 2.
    +        const auto v0 = u0.shr<8>();
    +        const auto v1 = u1.shr<8>();
    +        const auto v2 = u2.shr<8>();
    +        const auto v3 = u3.shr<8>();
     
    -    When values fit in 16-bit words, but are above 0x07ff, then
    -    a single word may produce one, two or three UTF8 bytes.
    +        const auto in16 = simd16::pack(v0, v1);
    +        const auto nextin16 = simd16::pack(v2, v3);
     
    -    We prepare data for all these three cases in two registers.
    -    The first register contains lower two UTF8 bytes (used in all
    -    cases), while the second one contains just the third byte for
    -    the three-UTF8-bytes case.
    +        const uint64_t surrogates_wordmask0 = ((in16 & v_f8) == v_d8).to_bitmask64();
    +        const uint64_t surrogates_wordmask1 = ((nextin16 & v_f8) == v_d8).to_bitmask64();
     
    -    Finally these two registers are interleaved forming eight-element
    -    array of 32-bit values. The array spans two SSE registers.
    -    The bytes from the registers are compressed using two shuffles.
    +        // Check for surrogates
    +        if (surrogates_wordmask0 != 0 || surrogates_wordmask1 != 0) {
    +            // Cannot be UTF8
    +            is_utf8 = false;
    +            // Can still be either UTF-16LE or UTF-32 depending on the positions of the surrogates
    +            // To be valid UTF-32, a surrogate cannot be in the two most significant bytes of any 32-bit word.
    +            // On the other hand, to be valid UTF-16LE, at least one surrogate must be in the two most significant
    +            // bytes of a 32-bit word since they always come in pairs in UTF-16LE.
    +            // Note that we always proceed in multiple of 4 before this point so there is no offset in 32-bit code units.
     
    -    We need 256-entry lookup table to get a compression pattern
    -    and the number of output bytes in the compressed vector register.
    -    Each entry occupies 17 bytes.
    +            if (((surrogates_wordmask0 | surrogates_wordmask1) & 0xf0f0f0f0f0f0f0f0) != 0) {
    +                is_utf32 = false;
    +                // Code from arm_validate_utf16le.cpp
    +                // Not efficient, we do not process surrogates_wordmask1
    +                const char16_t * input = reinterpret_cast(buf);
    +                const char16_t* end16 = reinterpret_cast(start) + len/2;
     
    +                const auto v_fc = simd8::splat(0xfc);
    +                const auto v_dc = simd8::splat(0xdc);
     
    -    To summarize:
    -    - We need two 256-entry tables that have 8704 bytes in total.
    -*/
    -/*
    -  Returns a pair: the first unprocessed byte from buf and utf8_output
    -  A scalar routing should carry on the conversion of the tail.
    -*/
    -template 
    -std::pair arm_convert_utf16_to_utf8(const char16_t* buf, size_t len, char* utf8_out) {
    -  uint8_t * utf8_output = reinterpret_cast(utf8_out);
    -  const char16_t* end = buf + len;
    +                const uint64_t V0 = ~surrogates_wordmask0;
     
    -  const uint16x8_t v_f800 = vmovq_n_u16((uint16_t)0xf800);
    -  const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800);
    -  const uint16x8_t v_c080 = vmovq_n_u16((uint16_t)0xc080);
    +                const auto vH0 = ((in16 & v_fc) ==  v_dc);
    +                const uint64_t H0 = vH0.to_bitmask64();
     
    -  while (buf + 16 <= end) {
    -    uint16x8_t in = vld1q_u16(reinterpret_cast(buf));
    -    if (!match_system(big_endian)) {
    -      #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -      const uint8x16_t swap = make_uint8x16_t(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14);
    -      #else
    -      const uint8x16_t swap = {1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14};
    -      #endif
    -      in = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(in), swap));
    -    }
    -    if(vmaxvq_u16(in) <= 0x7F) { // ASCII fast path!!!!
    -        // It is common enough that we have sequences of 16 consecutive ASCII characters.
    -        uint16x8_t nextin = vld1q_u16(reinterpret_cast(buf) + 8);
    -        if (!match_system(big_endian)) {
    -          #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -          const uint8x16_t swap = make_uint8x16_t(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14);
    -          #else
    -          const uint8x16_t swap = {1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14};
    -          #endif
    -          nextin = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(nextin), swap));
    -        }
    -        if(vmaxvq_u16(nextin) > 0x7F) {
    -          // 1. pack the bytes
    -          // obviously suboptimal.
    -          uint8x8_t utf8_packed = vmovn_u16(in);
    -          // 2. store (8 bytes)
    -          vst1_u8(utf8_output, utf8_packed);
    -          // 3. adjust pointers
    -          buf += 8;
    -          utf8_output += 8;
    -          in = nextin;
    -        } else {
    -          // 1. pack the bytes
    -          // obviously suboptimal.
    -          uint8x16_t utf8_packed = vmovn_high_u16(vmovn_u16(in), nextin);
    -          // 2. store (16 bytes)
    -          vst1q_u8(utf8_output, utf8_packed);
    -          // 3. adjust pointers
    -          buf += 16;
    -          utf8_output += 16;
    -          continue; // we are done for this round!
    -        }
    -    }
    +                const uint64_t L0 = ~H0 & surrogates_wordmask0;
     
    -    if (vmaxvq_u16(in) <= 0x7FF) {
    -          // 1. prepare 2-byte values
    -          // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
    -          // expected output   : [110a|aaaa|10bb|bbbb] x 8
    -          const uint16x8_t v_1f00 = vmovq_n_u16((int16_t)0x1f00);
    -          const uint16x8_t v_003f = vmovq_n_u16((int16_t)0x003f);
    +                const uint64_t a0 = L0 & (H0 >> 4);
     
    -          // t0 = [000a|aaaa|bbbb|bb00]
    -          const uint16x8_t t0 = vshlq_n_u16(in, 2);
    -          // t1 = [000a|aaaa|0000|0000]
    -          const uint16x8_t t1 = vandq_u16(t0, v_1f00);
    -          // t2 = [0000|0000|00bb|bbbb]
    -          const uint16x8_t t2 = vandq_u16(in, v_003f);
    -          // t3 = [000a|aaaa|00bb|bbbb]
    -          const uint16x8_t t3 = vorrq_u16(t1, t2);
    -          // t4 = [110a|aaaa|10bb|bbbb]
    -          const uint16x8_t t4 = vorrq_u16(t3, v_c080);
    -          // 2. merge ASCII and 2-byte codewords
    -          const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
    -          const uint16x8_t one_byte_bytemask = vcleq_u16(in, v_007f);
    -          const uint8x16_t utf8_unpacked = vreinterpretq_u8_u16(vbslq_u16(one_byte_bytemask, in, t4));
    -          // 3. prepare bitmask for 8-bit lookup
    -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -          const uint16x8_t mask = make_uint16x8_t(0x0001, 0x0004,
    -                                    0x0010, 0x0040,
    -                                    0x0002, 0x0008,
    -                                    0x0020, 0x0080);
    -#else
    -          const uint16x8_t mask = { 0x0001, 0x0004,
    -                                    0x0010, 0x0040,
    -                                    0x0002, 0x0008,
    -                                    0x0020, 0x0080 };
    -#endif
    -          uint16_t m2 = vaddvq_u16(vandq_u16(one_byte_bytemask, mask));
    -          // 4. pack the bytes
    -          const uint8_t* row = &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0];
    -          const uint8x16_t shuffle = vld1q_u8(row + 1);
    -          const uint8x16_t utf8_packed = vqtbl1q_u8(utf8_unpacked, shuffle);
    +                const uint64_t b0 = a0 << 4;
     
    -          // 5. store bytes
    -          vst1q_u8(utf8_output, utf8_packed);
    +                const uint64_t c0 = V0 | a0 | b0;
    +                if (c0 == ~0ull) {
    +                    input += 16;
    +                } else if (c0 == 0xfffffffffffffffull) {
    +                    input += 15;
    +                } else {
    +                    is_utf16 = false;
    +                    break;
    +                }
     
    -          // 6. adjust pointers
    -          buf += 8;
    -          utf8_output += row[0];
    -          continue;
    +                while (input + 16 < end16) {
    +                    const auto in0 = simd16(input);
    +                    const auto in1 = simd16(input + simd16::SIZE / sizeof(char16_t));
    +                    const auto t0 = in0.shr<8>();
    +                    const auto t1 = in1.shr<8>();
    +                    const simd8 in_16 = simd16::pack(t0, t1);
     
    -    }
    -    const uint16x8_t surrogates_bytemask = vceqq_u16(vandq_u16(in, v_f800), v_d800);
    -    // It might seem like checking for surrogates_bitmask == 0xc000 could help. However,
    -    // it is likely an uncommon occurrence.
    -      if (vmaxvq_u16(surrogates_bytemask) == 0) {
    -      // case: words from register produce either 1, 2 or 3 UTF-8 bytes
    -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -        const uint16x8_t dup_even = make_uint16x8_t(0x0000, 0x0202, 0x0404, 0x0606,
    -                                     0x0808, 0x0a0a, 0x0c0c, 0x0e0e);
    -#else
    -        const uint16x8_t dup_even = {0x0000, 0x0202, 0x0404, 0x0606,
    -                                     0x0808, 0x0a0a, 0x0c0c, 0x0e0e};
    -#endif
    -        /* In this branch we handle three cases:
    -           1. [0000|0000|0ccc|cccc] => [0ccc|cccc]                           - single UFT-8 byte
    -           2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc]              - two UTF-8 bytes
    -           3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three UTF-8 bytes
    +                    const uint64_t surrogates_wordmask = ((in_16 & v_f8) == v_d8).to_bitmask64();
    +                    if(surrogates_wordmask == 0) {
    +                        input += 16;
    +                    } else {
    +                        const uint64_t V = ~surrogates_wordmask;
     
    -          We expand the input word (16-bit) into two words (32-bit), thus
    -          we have room for four bytes. However, we need five distinct bit
    -          layouts. Note that the last byte in cases #2 and #3 is the same.
    +                        const auto vH = ((in_16 & v_fc) ==  v_dc);
    +                        const uint64_t H = vH.to_bitmask64();
     
    -          We precompute byte 1 for case #1 and the common byte for cases #2 & #3
    -          in register t2.
    +                        const uint64_t L = ~H & surrogates_wordmask;
     
    -          We precompute byte 1 for case #3 and -- **conditionally** -- precompute
    -          either byte 1 for case #2 or byte 2 for case #3. Note that they
    -          differ by exactly one bit.
    +                        const uint64_t a = L & (H >> 4);
     
    -          Finally from these two words we build proper UTF-8 sequence, taking
    -          into account the case (i.e, the number of bytes to write).
    -        */
    -        /**
    -         * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce:
    -         * t2 => [0ccc|cccc] [10cc|cccc]
    -         * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb])
    -         */
    -#define simdutf_vec(x) vmovq_n_u16(static_cast(x))
    -        // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc]
    -        const uint16x8_t t0 = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(in), vreinterpretq_u8_u16(dup_even)));
    -        // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc]
    -        const uint16x8_t t1 = vandq_u16(t0, simdutf_vec(0b0011111101111111));
    -        // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc]
    -        const uint16x8_t t2 = vorrq_u16 (t1, simdutf_vec(0b1000000000000000));
    +                        const uint64_t b = a << 4;
     
    -        // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa]
    -        const uint16x8_t s0 = vshrq_n_u16(in, 12);
    -        // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000]
    -        const uint16x8_t s1 = vandq_u16(in, simdutf_vec(0b0000111111000000));
    -        // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000]
    -        const uint16x8_t s1s = vshlq_n_u16(s1, 2);
    -        // [00bb|bbbb|0000|aaaa]
    -        const uint16x8_t s2 = vorrq_u16(s0, s1s);
    -        // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa]
    -        const uint16x8_t s3 = vorrq_u16(s2, simdutf_vec(0b1100000011100000));
    -        const uint16x8_t v_07ff = vmovq_n_u16((uint16_t)0x07FF);
    -        const uint16x8_t one_or_two_bytes_bytemask = vcleq_u16(in, v_07ff);
    -        const uint16x8_t m0 = vbicq_u16(simdutf_vec(0b0100000000000000), one_or_two_bytes_bytemask);
    -        const uint16x8_t s4 = veorq_u16(s3, m0);
    -#undef simdutf_vec
    +                        const uint64_t c = V | a | b;
    +                        if (c == ~0ull) {
    +                            input += 16;
    +                        } else if (c == 0xfffffffffffffffull) {
    +                            input += 15;
    +                        } else {
    +                            is_utf16 = false;
    +                            break;
    +                        }
    +                    }
    +                }
    +            } else {
    +                is_utf16 = false;
    +                // Check for UTF-32
    +                if (len % 4 == 0) {
    +                    const char32_t * input = reinterpret_cast(buf);
    +                    const char32_t* end32 = reinterpret_cast(start) + len/4;
     
    -        // 4. expand words 16-bit => 32-bit
    -        const uint8x16_t out0 = vreinterpretq_u8_u16(vzip1q_u16(t2, s4));
    -        const uint8x16_t out1 = vreinterpretq_u8_u16(vzip2q_u16(t2, s4));
    +                    // Must start checking for surrogates
    +                    uint32x4_t currentoffsetmax = vmovq_n_u32(0x0);
    +                    const uint32x4_t offset = vmovq_n_u32(0xffff2000);
    +                    const uint32x4_t standardoffsetmax = vmovq_n_u32(0xfffff7ff);
     
    -        // 5. compress 32-bit words into 1, 2 or 3 bytes -- 2 x shuffle
    -        const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
    -        const uint16x8_t one_byte_bytemask = vcleq_u16(in, v_007f);
    -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -        const uint16x8_t onemask = make_uint16x8_t(0x0001, 0x0004,
    -                                    0x0010, 0x0040,
    -                                    0x0100, 0x0400,
    -                                    0x1000, 0x4000 );
    -        const uint16x8_t twomask = make_uint16x8_t(0x0002, 0x0008,
    -                                    0x0020, 0x0080,
    -                                    0x0200, 0x0800,
    -                                    0x2000, 0x8000 );
    -#else
    -        const uint16x8_t onemask = { 0x0001, 0x0004,
    -                                    0x0010, 0x0040,
    -                                    0x0100, 0x0400,
    -                                    0x1000, 0x4000 };
    -        const uint16x8_t twomask = { 0x0002, 0x0008,
    -                                    0x0020, 0x0080,
    -                                    0x0200, 0x0800,
    -                                    0x2000, 0x8000 };
    -#endif
    -        const uint16x8_t combined = vorrq_u16(vandq_u16(one_byte_bytemask, onemask), vandq_u16(one_or_two_bytes_bytemask, twomask));
    -        const uint16_t mask = vaddvq_u16(combined);
    -        // The following fast path may or may not be beneficial.
    -        /*if(mask == 0) {
    -          // We only have three-byte words. Use fast path.
    -          const uint8x16_t shuffle = {2,3,1,6,7,5,10,11,9,14,15,13,0,0,0,0};
    -          const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle);
    -          const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle);
    -          vst1q_u8(utf8_output, utf8_0);
    -          utf8_output += 12;
    -          vst1q_u8(utf8_output, utf8_1);
    -          utf8_output += 12;
    -          buf += 8;
    -          continue;
    -        }*/
    -        const uint8_t mask0 = uint8_t(mask);
    +                    const uint32x4_t in32 =  vreinterpretq_u32_u16(in);
    +                    const uint32x4_t secondin32 =  vreinterpretq_u32_u16(secondin);
    +                    const uint32x4_t thirdin32 =  vreinterpretq_u32_u16(thirdin);
    +                    const uint32x4_t fourthin32 =  vreinterpretq_u32_u16(fourthin);
     
    -        const uint8_t* row0 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0];
    -        const uint8x16_t shuffle0 = vld1q_u8(row0 + 1);
    -        const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle0);
    +                    currentmax = vmaxq_u32(in32,currentmax);
    +                    currentmax = vmaxq_u32(secondin32,currentmax);
    +                    currentmax = vmaxq_u32(thirdin32,currentmax);
    +                    currentmax = vmaxq_u32(fourthin32,currentmax);
     
    -        const uint8_t mask1 = static_cast(mask >> 8);
    -        const uint8_t* row1 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0];
    -        const uint8x16_t shuffle1 = vld1q_u8(row1 + 1);
    -        const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle1);
    +                    currentoffsetmax = vmaxq_u32(vaddq_u32(in32, offset), currentoffsetmax);
    +                    currentoffsetmax = vmaxq_u32(vaddq_u32(secondin32, offset), currentoffsetmax);
    +                    currentoffsetmax = vmaxq_u32(vaddq_u32(thirdin32, offset), currentoffsetmax);
    +                    currentoffsetmax = vmaxq_u32(vaddq_u32(fourthin32, offset), currentoffsetmax);
     
    -        vst1q_u8(utf8_output, utf8_0);
    -        utf8_output += row0[0];
    -        vst1q_u8(utf8_output, utf8_1);
    -        utf8_output += row1[0];
    +                    while (input + 4 < end32) {
    +                        const uint32x4_t in_32 = vld1q_u32(reinterpret_cast(input));
    +                        currentmax = vmaxq_u32(in_32,currentmax);
    +                        currentoffsetmax = vmaxq_u32(vaddq_u32(in_32, offset), currentoffsetmax);
    +                        input += 4;
    +                    }
     
    -        buf += 8;
    -    // surrogate pair(s) in a register
    -    } else {
    -      // Let us do a scalar fallback.
    -      // It may seem wasteful to use scalar code, but being efficient with SIMD
    -      // in the presence of surrogate pairs may require non-trivial tables.
    -      size_t forward = 15;
    -      size_t k = 0;
    -      if(size_t(end - buf) < forward + 1) { forward = size_t(end - buf - 1);}
    -      for(; k < forward; k++) {
    -        uint16_t word = !match_system(big_endian) ? scalar::utf16::swap_bytes(buf[k]) : buf[k];
    -        if((word & 0xFF80)==0) {
    -          *utf8_output++ = char(word);
    -        } else if((word & 0xF800)==0) {
    -          *utf8_output++ = char((word>>6) | 0b11000000);
    -          *utf8_output++ = char((word & 0b111111) | 0b10000000);
    -        } else if((word &0xF800 ) != 0xD800) {
    -          *utf8_output++ = char((word>>12) | 0b11100000);
    -          *utf8_output++ = char(((word>>6) & 0b111111) | 0b10000000);
    -          *utf8_output++ = char((word & 0b111111) | 0b10000000);
    -        } else {
    -          // must be a surrogate pair
    -          uint16_t diff = uint16_t(word - 0xD800);
    -          uint16_t next_word = !match_system(big_endian) ? scalar::utf16::swap_bytes(buf[k + 1]) : buf[k + 1];
    -          k++;
    -          uint16_t diff2 = uint16_t(next_word - 0xDC00);
    -          if((diff | diff2) > 0x3FF)  { return std::make_pair(nullptr, reinterpret_cast(utf8_output)); }
    -          uint32_t value = (diff << 10) + diff2 + 0x10000;
    -          *utf8_output++ = char((value>>18) | 0b11110000);
    -          *utf8_output++ = char(((value>>12) & 0b111111) | 0b10000000);
    -          *utf8_output++ = char(((value>>6) & 0b111111) | 0b10000000);
    -          *utf8_output++ = char((value & 0b111111) | 0b10000000);
    +                    uint32x4_t forbidden_words = veorq_u32(vmaxq_u32(currentoffsetmax, standardoffsetmax), standardoffsetmax);
    +                    if(vmaxvq_u32(forbidden_words) != 0) {
    +                        is_utf32 = false;
    +                    }
    +                } else {
    +                    is_utf32 = false;
    +                }
    +            }
    +            break;
             }
    -      }
    -      buf += k;
    -    }
    -  } // while
    +        // If no surrogate, validate under other encodings as well
     
    -  return std::make_pair(buf, reinterpret_cast(utf8_output));
    -}
    +        // UTF-32 validation
    +        currentmax = vmaxq_u32(vreinterpretq_u32_u16(in),currentmax);
    +        currentmax = vmaxq_u32(vreinterpretq_u32_u16(secondin),currentmax);
    +        currentmax = vmaxq_u32(vreinterpretq_u32_u16(thirdin),currentmax);
    +        currentmax = vmaxq_u32(vreinterpretq_u32_u16(fourthin),currentmax);
     
    +        // UTF-8 validation
    +        // Relies on ../generic/utf8_validation/utf8_lookup4_algorithm.h
    +        simd::simd8x64 in8(vreinterpretq_u8_u16(in), vreinterpretq_u8_u16(secondin), vreinterpretq_u8_u16(thirdin), vreinterpretq_u8_u16(fourthin));
    +        check.check_next_input(in8);
     
    -/*
    -  Returns a pair: a result struct and utf8_output.
    -  If there is an error, the count field of the result is the position of the error.
    -  Otherwise, it is the position of the first unprocessed byte in buf (even if finished).
    -  A scalar routing should carry on the conversion of the tail if needed.
    -*/
    -template 
    -std::pair arm_convert_utf16_to_utf8_with_errors(const char16_t* buf, size_t len, char* utf8_out) {
    -  uint8_t * utf8_output = reinterpret_cast(utf8_out);
    -    const char16_t* start = buf;
    -  const char16_t* end = buf + len;
    +        buf += 64;
    +    }
     
    -  const uint16x8_t v_f800 = vmovq_n_u16((uint16_t)0xf800);
    -  const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800);
    -  const uint16x8_t v_c080 = vmovq_n_u16((uint16_t)0xc080);
    +    // Check which encodings are possible
     
    -  while (buf + 16 <= end) {
    -    uint16x8_t in = vld1q_u16(reinterpret_cast(buf));
    -    if (!match_system(big_endian)) {
    -      #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -      const uint8x16_t swap = make_uint8x16_t(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14);
    -      #else
    -      const uint8x16_t swap = {1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14};
    -      #endif
    -      in = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(in), swap));
    -    }
    -    if(vmaxvq_u16(in) <= 0x7F) { // ASCII fast path!!!!
    -        // It is common enough that we have sequences of 16 consecutive ASCII characters.
    -        uint16x8_t nextin = vld1q_u16(reinterpret_cast(buf) + 8);
    -        if (!match_system(big_endian)) {
    -          #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -          const uint8x16_t swap = make_uint8x16_t(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14);
    -          #else
    -          const uint8x16_t swap = {1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14};
    -          #endif
    -          nextin = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(nextin), swap));
    +    if (is_utf8) {
    +        if (static_cast(buf - start) != len) {
    +            uint8_t block[64]{};
    +            std::memset(block, 0x20, 64);
    +            std::memcpy(block, buf, len - (buf - start));
    +            simd::simd8x64 in(block);
    +            check.check_next_input(in);
             }
    -        if(vmaxvq_u16(nextin) > 0x7F) {
    -          // 1. pack the bytes
    -          // obviously suboptimal.
    -          uint8x8_t utf8_packed = vmovn_u16(in);
    -          // 2. store (8 bytes)
    -          vst1_u8(utf8_output, utf8_packed);
    -          // 3. adjust pointers
    -          buf += 8;
    -          utf8_output += 8;
    -          in = nextin;
    -        } else {
    -          // 1. pack the bytes
    -          // obviously suboptimal.
    -          uint8x16_t utf8_packed = vmovn_high_u16(vmovn_u16(in), nextin);
    -          // 2. store (16 bytes)
    -          vst1q_u8(utf8_output, utf8_packed);
    -          // 3. adjust pointers
    -          buf += 16;
    -          utf8_output += 16;
    -          continue; // we are done for this round!
    +        if (!check.errors()) {
    +            out |= simdutf::encoding_type::UTF8;
             }
         }
     
    -    if (vmaxvq_u16(in) <= 0x7FF) {
    -          // 1. prepare 2-byte values
    -          // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
    -          // expected output   : [110a|aaaa|10bb|bbbb] x 8
    -          const uint16x8_t v_1f00 = vmovq_n_u16((int16_t)0x1f00);
    -          const uint16x8_t v_003f = vmovq_n_u16((int16_t)0x003f);
    +    if (is_utf16 && scalar::utf16::validate(reinterpret_cast(buf), (len - (buf - start))/2)) {
    +        out |= simdutf::encoding_type::UTF16_LE;
    +    }
     
    -          // t0 = [000a|aaaa|bbbb|bb00]
    -          const uint16x8_t t0 = vshlq_n_u16(in, 2);
    -          // t1 = [000a|aaaa|0000|0000]
    -          const uint16x8_t t1 = vandq_u16(t0, v_1f00);
    -          // t2 = [0000|0000|00bb|bbbb]
    -          const uint16x8_t t2 = vandq_u16(in, v_003f);
    -          // t3 = [000a|aaaa|00bb|bbbb]
    -          const uint16x8_t t3 = vorrq_u16(t1, t2);
    -          // t4 = [110a|aaaa|10bb|bbbb]
    -          const uint16x8_t t4 = vorrq_u16(t3, v_c080);
    -          // 2. merge ASCII and 2-byte codewords
    -          const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
    -          const uint16x8_t one_byte_bytemask = vcleq_u16(in, v_007f);
    -          const uint8x16_t utf8_unpacked = vreinterpretq_u8_u16(vbslq_u16(one_byte_bytemask, in, t4));
    -          // 3. prepare bitmask for 8-bit lookup
    -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -          const uint16x8_t mask = make_uint16x8_t(0x0001, 0x0004,
    -                                    0x0010, 0x0040,
    -                                    0x0002, 0x0008,
    -                                    0x0020, 0x0080);
    -#else
    -          const uint16x8_t mask = { 0x0001, 0x0004,
    -                                    0x0010, 0x0040,
    -                                    0x0002, 0x0008,
    -                                    0x0020, 0x0080 };
    -#endif
    -          uint16_t m2 = vaddvq_u16(vandq_u16(one_byte_bytemask, mask));
    -          // 4. pack the bytes
    -          const uint8_t* row = &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0];
    -          const uint8x16_t shuffle = vld1q_u8(row + 1);
    -          const uint8x16_t utf8_packed = vqtbl1q_u8(utf8_unpacked, shuffle);
    +    if (is_utf32 && (len % 4 == 0)) {
    +        const uint32x4_t standardmax = vmovq_n_u32(0x10ffff);
    +        uint32x4_t is_zero = veorq_u32(vmaxq_u32(currentmax, standardmax), standardmax);
    +        if (vmaxvq_u32(is_zero) == 0 && scalar::utf32::validate(reinterpret_cast(buf), (len - (buf - start))/4)) {
    +            out |= simdutf::encoding_type::UTF32_LE;
    +        }
    +    }
     
    -          // 5. store bytes
    -          vst1q_u8(utf8_output, utf8_packed);
    +    return out;
    +}
    +/* end file src/arm64/arm_detect_encodings.cpp */
     
    -          // 6. adjust pointers
    -          buf += 8;
    -          utf8_output += row[0];
    -          continue;
    +/* begin file src/arm64/arm_validate_utf16.cpp */
    +template 
    +const char16_t* arm_validate_utf16(const char16_t* input, size_t size) {
    +    const char16_t* end = input + size;
    +    const auto v_d8 = simd8::splat(0xd8);
    +    const auto v_f8 = simd8::splat(0xf8);
    +    const auto v_fc = simd8::splat(0xfc);
    +    const auto v_dc = simd8::splat(0xdc);
    +    while (input + 16 < end) {
    +        // 0. Load data: since the validation takes into account only higher
    +        //    byte of each word, we compress the two vectors into one which
    +        //    consists only the higher bytes.
    +        auto in0 = simd16(input);
    +        auto in1 = simd16(input + simd16::SIZE / sizeof(char16_t));
    +        if (!match_system(big_endian)) {
    +            in0 = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in0)));
    +            in1 = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in1)));
    +        }
    +        const auto t0 = in0.shr<8>();
    +        const auto t1 = in1.shr<8>();
    +        const simd8 in = simd16::pack(t0, t1);
    +        // 1. Check whether we have any 0xD800..DFFF word (0b1101'1xxx'yyyy'yyyy).
    +        const uint64_t surrogates_wordmask = ((in & v_f8) == v_d8).to_bitmask64();
    +        if(surrogates_wordmask == 0) {
    +            input += 16;
    +        } else {
    +            // 2. We have some surrogates that have to be distinguished:
    +            //    - low  surrogates: 0b1101'10xx'yyyy'yyyy (0xD800..0xDBFF)
    +            //    - high surrogates: 0b1101'11xx'yyyy'yyyy (0xDC00..0xDFFF)
    +            //
    +            //    Fact: high surrogate has 11th bit set (3rd bit in the higher word)
     
    -    }
    -    const uint16x8_t surrogates_bytemask = vceqq_u16(vandq_u16(in, v_f800), v_d800);
    -    // It might seem like checking for surrogates_bitmask == 0xc000 could help. However,
    -    // it is likely an uncommon occurrence.
    -      if (vmaxvq_u16(surrogates_bytemask) == 0) {
    -      // case: words from register produce either 1, 2 or 3 UTF-8 bytes
    -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -        const uint16x8_t dup_even = make_uint16x8_t(0x0000, 0x0202, 0x0404, 0x0606,
    -                                     0x0808, 0x0a0a, 0x0c0c, 0x0e0e);
    -#else
    -        const uint16x8_t dup_even = {0x0000, 0x0202, 0x0404, 0x0606,
    -                                     0x0808, 0x0a0a, 0x0c0c, 0x0e0e};
    -#endif
    -        /* In this branch we handle three cases:
    -           1. [0000|0000|0ccc|cccc] => [0ccc|cccc]                           - single UFT-8 byte
    -           2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc]              - two UTF-8 bytes
    -           3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three UTF-8 bytes
    +            // V - non-surrogate code units
    +            //     V = not surrogates_wordmask
    +            const uint64_t V = ~surrogates_wordmask;
     
    -          We expand the input word (16-bit) into two words (32-bit), thus
    -          we have room for four bytes. However, we need five distinct bit
    -          layouts. Note that the last byte in cases #2 and #3 is the same.
    +            // H - word-mask for high surrogates: the six highest bits are 0b1101'11
    +            const auto vH = ((in & v_fc) ==  v_dc);
    +            const uint64_t H = vH.to_bitmask64();
     
    -          We precompute byte 1 for case #1 and the common byte for cases #2 & #3
    -          in register t2.
    +            // L - word mask for low surrogates
    +            //     L = not H and surrogates_wordmask
    +            const uint64_t L = ~H & surrogates_wordmask;
     
    -          We precompute byte 1 for case #3 and -- **conditionally** -- precompute
    -          either byte 1 for case #2 or byte 2 for case #3. Note that they
    -          differ by exactly one bit.
    +            const uint64_t a = L & (H >> 4); // A low surrogate must be followed by high one.
    +                              // (A low surrogate placed in the 7th register's word
    +                              // is an exception we handle.)
    +            const uint64_t b = a << 4; // Just mark that the opposite fact is hold,
    +                          // thanks to that we have only two masks for valid case.
    +            const uint64_t c = V | a | b;      // Combine all the masks into the final one.
    +            if (c == ~0ull) {
    +                // The whole input register contains valid UTF-16, i.e.,
    +                // either single code units or proper surrogate pairs.
    +                input += 16;
    +            } else if (c == 0xfffffffffffffffull) {
    +                // The 15 lower code units of the input register contains valid UTF-16.
    +                // The 15th word may be either a low or high surrogate. It the next
    +                // iteration we 1) check if the low surrogate is followed by a high
    +                // one, 2) reject sole high surrogate.
    +                input += 15;
    +            } else {
    +                return nullptr;
    +            }
    +        }
    +    }
    +    return input;
    +}
     
    -          Finally from these two words we build proper UTF-8 sequence, taking
    -          into account the case (i.e, the number of bytes to write).
    -        */
    -        /**
    -         * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce:
    -         * t2 => [0ccc|cccc] [10cc|cccc]
    -         * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb])
    -         */
    -#define simdutf_vec(x) vmovq_n_u16(static_cast(x))
    -        // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc]
    -        const uint16x8_t t0 = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(in), vreinterpretq_u8_u16(dup_even)));
    -        // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc]
    -        const uint16x8_t t1 = vandq_u16(t0, simdutf_vec(0b0011111101111111));
    -        // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc]
    -        const uint16x8_t t2 = vorrq_u16 (t1, simdutf_vec(0b1000000000000000));
     
    -        // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa]
    -        const uint16x8_t s0 = vshrq_n_u16(in, 12);
    -        // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000]
    -        const uint16x8_t s1 = vandq_u16(in, simdutf_vec(0b0000111111000000));
    -        // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000]
    -        const uint16x8_t s1s = vshlq_n_u16(s1, 2);
    -        // [00bb|bbbb|0000|aaaa]
    -        const uint16x8_t s2 = vorrq_u16(s0, s1s);
    -        // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa]
    -        const uint16x8_t s3 = vorrq_u16(s2, simdutf_vec(0b1100000011100000));
    -        const uint16x8_t v_07ff = vmovq_n_u16((uint16_t)0x07FF);
    -        const uint16x8_t one_or_two_bytes_bytemask = vcleq_u16(in, v_07ff);
    -        const uint16x8_t m0 = vbicq_u16(simdutf_vec(0b0100000000000000), one_or_two_bytes_bytemask);
    -        const uint16x8_t s4 = veorq_u16(s3, m0);
    -#undef simdutf_vec
    +template 
    +const result arm_validate_utf16_with_errors(const char16_t* input, size_t size) {
    +    const char16_t* start = input;
    +    const char16_t* end = input + size;
     
    -        // 4. expand words 16-bit => 32-bit
    -        const uint8x16_t out0 = vreinterpretq_u8_u16(vzip1q_u16(t2, s4));
    -        const uint8x16_t out1 = vreinterpretq_u8_u16(vzip2q_u16(t2, s4));
    +    const auto v_d8 = simd8::splat(0xd8);
    +    const auto v_f8 = simd8::splat(0xf8);
    +    const auto v_fc = simd8::splat(0xfc);
    +    const auto v_dc = simd8::splat(0xdc);
    +    while (input + 16 < end) {
    +        // 0. Load data: since the validation takes into account only higher
    +        //    byte of each word, we compress the two vectors into one which
    +        //    consists only the higher bytes.
    +        auto in0 = simd16(input);
    +        auto in1 = simd16(input + simd16::SIZE / sizeof(char16_t));
     
    -        // 5. compress 32-bit words into 1, 2 or 3 bytes -- 2 x shuffle
    -        const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
    -        const uint16x8_t one_byte_bytemask = vcleq_u16(in, v_007f);
    -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -        const uint16x8_t onemask = make_uint16x8_t(0x0001, 0x0004,
    -                                    0x0010, 0x0040,
    -                                    0x0100, 0x0400,
    -                                    0x1000, 0x4000 );
    -        const uint16x8_t twomask = make_uint16x8_t(0x0002, 0x0008,
    -                                    0x0020, 0x0080,
    -                                    0x0200, 0x0800,
    -                                    0x2000, 0x8000 );
    -#else
    -        const uint16x8_t onemask = { 0x0001, 0x0004,
    -                                    0x0010, 0x0040,
    -                                    0x0100, 0x0400,
    -                                    0x1000, 0x4000 };
    -        const uint16x8_t twomask = { 0x0002, 0x0008,
    -                                    0x0020, 0x0080,
    -                                    0x0200, 0x0800,
    -                                    0x2000, 0x8000 };
    -#endif
    -        const uint16x8_t combined = vorrq_u16(vandq_u16(one_byte_bytemask, onemask), vandq_u16(one_or_two_bytes_bytemask, twomask));
    -        const uint16_t mask = vaddvq_u16(combined);
    -        // The following fast path may or may not be beneficial.
    -        /*if(mask == 0) {
    -          // We only have three-byte words. Use fast path.
    -          const uint8x16_t shuffle = {2,3,1,6,7,5,10,11,9,14,15,13,0,0,0,0};
    -          const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle);
    -          const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle);
    -          vst1q_u8(utf8_output, utf8_0);
    -          utf8_output += 12;
    -          vst1q_u8(utf8_output, utf8_1);
    -          utf8_output += 12;
    -          buf += 8;
    -          continue;
    -        }*/
    -        const uint8_t mask0 = uint8_t(mask);
    +        if (!match_system(big_endian)) {
    +            in0 = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in0)));
    +            in1 = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in1)));
    +        }
    +        const auto t0 = in0.shr<8>();
    +        const auto t1 = in1.shr<8>();
    +        const simd8 in = simd16::pack(t0, t1);
    +        // 1. Check whether we have any 0xD800..DFFF word (0b1101'1xxx'yyyy'yyyy).
    +        const uint64_t surrogates_wordmask = ((in & v_f8) == v_d8).to_bitmask64();
    +        if(surrogates_wordmask == 0) {
    +            input += 16;
    +        } else {
    +            // 2. We have some surrogates that have to be distinguished:
    +            //    - low  surrogates: 0b1101'10xx'yyyy'yyyy (0xD800..0xDBFF)
    +            //    - high surrogates: 0b1101'11xx'yyyy'yyyy (0xDC00..0xDFFF)
    +            //
    +            //    Fact: high surrogate has 11th bit set (3rd bit in the higher word)
     
    -        const uint8_t* row0 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0];
    -        const uint8x16_t shuffle0 = vld1q_u8(row0 + 1);
    -        const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle0);
    +            // V - non-surrogate code units
    +            //     V = not surrogates_wordmask
    +            const uint64_t V = ~surrogates_wordmask;
     
    -        const uint8_t mask1 = static_cast(mask >> 8);
    -        const uint8_t* row1 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0];
    -        const uint8x16_t shuffle1 = vld1q_u8(row1 + 1);
    -        const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle1);
    +            // H - word-mask for high surrogates: the six highest bits are 0b1101'11
    +            const auto vH = ((in & v_fc) ==  v_dc);
    +            const uint64_t H = vH.to_bitmask64();
     
    -        vst1q_u8(utf8_output, utf8_0);
    -        utf8_output += row0[0];
    -        vst1q_u8(utf8_output, utf8_1);
    -        utf8_output += row1[0];
    +            // L - word mask for low surrogates
    +            //     L = not H and surrogates_wordmask
    +            const uint64_t L = ~H & surrogates_wordmask;
     
    -        buf += 8;
    -    // surrogate pair(s) in a register
    -    } else {
    -      // Let us do a scalar fallback.
    -      // It may seem wasteful to use scalar code, but being efficient with SIMD
    -      // in the presence of surrogate pairs may require non-trivial tables.
    -      size_t forward = 15;
    -      size_t k = 0;
    -      if(size_t(end - buf) < forward + 1) { forward = size_t(end - buf - 1);}
    -      for(; k < forward; k++) {
    -        uint16_t word = !match_system(big_endian) ? scalar::utf16::swap_bytes(buf[k]) : buf[k];
    -        if((word & 0xFF80)==0) {
    -          *utf8_output++ = char(word);
    -        } else if((word & 0xF800)==0) {
    -          *utf8_output++ = char((word>>6) | 0b11000000);
    -          *utf8_output++ = char((word & 0b111111) | 0b10000000);
    -        } else if((word &0xF800 ) != 0xD800) {
    -          *utf8_output++ = char((word>>12) | 0b11100000);
    -          *utf8_output++ = char(((word>>6) & 0b111111) | 0b10000000);
    -          *utf8_output++ = char((word & 0b111111) | 0b10000000);
    -        } else {
    -          // must be a surrogate pair
    -          uint16_t diff = uint16_t(word - 0xD800);
    -          uint16_t next_word = !match_system(big_endian) ? scalar::utf16::swap_bytes(buf[k + 1]) : buf[k + 1];
    -          k++;
    -          uint16_t diff2 = uint16_t(next_word - 0xDC00);
    -          if((diff | diff2) > 0x3FF)  { return std::make_pair(result(error_code::SURROGATE, buf - start + k - 1), reinterpret_cast(utf8_output)); }
    -          uint32_t value = (diff << 10) + diff2 + 0x10000;
    -          *utf8_output++ = char((value>>18) | 0b11110000);
    -          *utf8_output++ = char(((value>>12) & 0b111111) | 0b10000000);
    -          *utf8_output++ = char(((value>>6) & 0b111111) | 0b10000000);
    -          *utf8_output++ = char((value & 0b111111) | 0b10000000);
    +            const uint64_t a = L & (H >> 4); // A low surrogate must be followed by high one.
    +                              // (A low surrogate placed in the 7th register's word
    +                              // is an exception we handle.)
    +            const uint64_t b = a << 4; // Just mark that the opposite fact is hold,
    +                          // thanks to that we have only two masks for valid case.
    +            const uint64_t c = V | a | b;      // Combine all the masks into the final one.
    +            if (c == ~0ull) {
    +                // The whole input register contains valid UTF-16, i.e.,
    +                // either single code units or proper surrogate pairs.
    +                input += 16;
    +            } else if (c == 0xfffffffffffffffull) {
    +                // The 15 lower code units of the input register contains valid UTF-16.
    +                // The 15th word may be either a low or high surrogate. It the next
    +                // iteration we 1) check if the low surrogate is followed by a high
    +                // one, 2) reject sole high surrogate.
    +                input += 15;
    +            } else {
    +                return result(error_code::SURROGATE, input - start);
    +            }
             }
    -      }
    -      buf += k;
         }
    -  } // while
    -
    -  return std::make_pair(result(error_code::SUCCESS, buf - start), reinterpret_cast(utf8_output));
    +    return result(error_code::SUCCESS, input - start);
     }
    -/* end file src/arm64/arm_convert_utf16_to_utf8.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=arm64/arm_convert_utf16_to_utf32.cpp
    -/* begin file src/arm64/arm_convert_utf16_to_utf32.cpp */
    -/*
    -    The vectorized algorithm works on single SSE register i.e., it
    -    loads eight 16-bit words.
    +/* end file src/arm64/arm_validate_utf16.cpp */
    +/* begin file src/arm64/arm_validate_utf32le.cpp */
     
    -    We consider three cases:
    -    1. an input register contains no surrogates and each value
    -       is in range 0x0000 .. 0x07ff.
    -    2. an input register contains no surrogates and values are
    -       is in range 0x0000 .. 0xffff.
    -    3. an input register contains surrogates --- i.e. codepoints
    -       can have 16 or 32 bits.
    +const char32_t* arm_validate_utf32le(const char32_t* input, size_t size) {
    +    const char32_t* end = input + size;
     
    -    Ad 1.
    +    const uint32x4_t standardmax = vmovq_n_u32(0x10ffff);
    +    const uint32x4_t offset = vmovq_n_u32(0xffff2000);
    +    const uint32x4_t standardoffsetmax = vmovq_n_u32(0xfffff7ff);
    +    uint32x4_t currentmax = vmovq_n_u32(0x0);
    +    uint32x4_t currentoffsetmax = vmovq_n_u32(0x0);
     
    -    When values are less than 0x0800, it means that a 16-bit words
    -    can be converted into: 1) single UTF8 byte (when it's an ASCII
    -    char) or 2) two UTF8 bytes.
    +    while (input + 4 < end) {
    +        const uint32x4_t in = vld1q_u32(reinterpret_cast(input));
    +        currentmax = vmaxq_u32(in,currentmax);
    +        currentoffsetmax = vmaxq_u32(vaddq_u32(in, offset), currentoffsetmax);
    +        input += 4;
    +    }
     
    -    For this case we do only some shuffle to obtain these 2-byte
    -    codes and finally compress the whole SSE register with a single
    -    shuffle.
    +    uint32x4_t is_zero = veorq_u32(vmaxq_u32(currentmax, standardmax), standardmax);
    +    if(vmaxvq_u32(is_zero) != 0) {
    +        return nullptr;
    +    }
     
    -    We need 256-entry lookup table to get a compression pattern
    -    and the number of output bytes in the compressed vector register.
    -    Each entry occupies 17 bytes.
    +    is_zero = veorq_u32(vmaxq_u32(currentoffsetmax, standardoffsetmax), standardoffsetmax);
    +    if(vmaxvq_u32(is_zero) != 0) {
    +        return nullptr;
    +    }
     
    -    Ad 2.
    +    return input;
    +}
     
    -    When values fit in 16-bit words, but are above 0x07ff, then
    -    a single word may produce one, two or three UTF8 bytes.
     
    -    We prepare data for all these three cases in two registers.
    -    The first register contains lower two UTF8 bytes (used in all
    -    cases), while the second one contains just the third byte for
    -    the three-UTF8-bytes case.
    +const result arm_validate_utf32le_with_errors(const char32_t* input, size_t size) {
    +    const char32_t* start = input;
    +    const char32_t* end = input + size;
     
    -    Finally these two registers are interleaved forming eight-element
    -    array of 32-bit values. The array spans two SSE registers.
    -    The bytes from the registers are compressed using two shuffles.
    +    const uint32x4_t standardmax = vmovq_n_u32(0x10ffff);
    +    const uint32x4_t offset = vmovq_n_u32(0xffff2000);
    +    const uint32x4_t standardoffsetmax = vmovq_n_u32(0xfffff7ff);
    +    uint32x4_t currentmax = vmovq_n_u32(0x0);
    +    uint32x4_t currentoffsetmax = vmovq_n_u32(0x0);
     
    -    We need 256-entry lookup table to get a compression pattern
    -    and the number of output bytes in the compressed vector register.
    -    Each entry occupies 17 bytes.
    +    while (input + 4 < end) {
    +        const uint32x4_t in = vld1q_u32(reinterpret_cast(input));
    +        currentmax = vmaxq_u32(in,currentmax);
    +        currentoffsetmax = vmaxq_u32(vaddq_u32(in, offset), currentoffsetmax);
     
    +        uint32x4_t is_zero = veorq_u32(vmaxq_u32(currentmax, standardmax), standardmax);
    +        if(vmaxvq_u32(is_zero) != 0) {
    +            return result(error_code::TOO_LARGE, input - start);
    +        }
     
    -    To summarize:
    -    - We need two 256-entry tables that have 8704 bytes in total.
    -*/
    +        is_zero = veorq_u32(vmaxq_u32(currentoffsetmax, standardoffsetmax), standardoffsetmax);
    +        if(vmaxvq_u32(is_zero) != 0) {
    +            return result(error_code::SURROGATE, input - start);
    +        }
    +
    +        input += 4;
    +    }
    +
    +    return result(error_code::SUCCESS, input - start);
    +}
    +/* end file src/arm64/arm_validate_utf32le.cpp */
    +
    +/* begin file src/arm64/arm_convert_latin1_to_utf8.cpp */
     /*
       Returns a pair: the first unprocessed byte from buf and utf8_output
       A scalar routing should carry on the conversion of the tail.
     */
    -template 
    -std::pair arm_convert_utf16_to_utf32(const char16_t* buf, size_t len, char32_t* utf32_out) {
    -  uint32_t * utf32_output = reinterpret_cast(utf32_out);
    -  const char16_t* end = buf + len;
    +std::pair
    +arm_convert_latin1_to_utf8(const char *latin1_input, size_t len,
    +                           char *utf8_out) {
    +  uint8_t *utf8_output = reinterpret_cast(utf8_out);
    +  const char *end = latin1_input + len;
    +  const uint16x8_t v_c080 = vmovq_n_u16((uint16_t)0xc080);
    +  // We always write 16 bytes, of which more than the first 8 bytes
    +  // are valid. A safety margin of 8 is more than sufficient.
    +  while (latin1_input + 16 + 8 <= end) {
    +    uint8x16_t in8 = vld1q_u8(reinterpret_cast(latin1_input));
    +    if (vmaxvq_u8(in8) <= 0x7F) { // ASCII fast path!!!!
    +      vst1q_u8(utf8_output, in8);
    +      utf8_output += 16;
    +      latin1_input += 16;
    +      continue;
    +    }
     
    -  const uint16x8_t v_f800 = vmovq_n_u16((uint16_t)0xf800);
    -  const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800);
    +    // We just fallback on UTF-16 code. This could be optimized/simplified
    +    // further.
    +    uint16x8_t in16 = vmovl_u8(vget_low_u8(in8));
    +    // 1. prepare 2-byte values
    +    // input 8-bit word : [aabb|bbbb] x 8
    +    // expected output   : [1100|00aa|10bb|bbbb] x 8
    +    const uint16x8_t v_1f00 = vmovq_n_u16((int16_t)0x1f00);
    +    const uint16x8_t v_003f = vmovq_n_u16((int16_t)0x003f);
    +
    +    // t0 = [0000|00aa|bbbb|bb00]
    +    const uint16x8_t t0 = vshlq_n_u16(in16, 2);
    +    // t1 = [0000|00aa|0000|0000]
    +    const uint16x8_t t1 = vandq_u16(t0, v_1f00);
    +    // t2 = [0000|0000|00bb|bbbb]
    +    const uint16x8_t t2 = vandq_u16(in16, v_003f);
    +    // t3 = [0000|00aa|00bb|bbbb]
    +    const uint16x8_t t3 = vorrq_u16(t1, t2);
    +    // t4 = [1100|00aa|10bb|bbbb]
    +    const uint16x8_t t4 = vorrq_u16(t3, v_c080);
    +    // 2. merge ASCII and 2-byte codewords
    +    const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
    +    const uint16x8_t one_byte_bytemask = vcleq_u16(in16, v_007f);
    +    const uint8x16_t utf8_unpacked =
    +        vreinterpretq_u8_u16(vbslq_u16(one_byte_bytemask, in16, t4));
    +    // 3. prepare bitmask for 8-bit lookup
    +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    +    const uint16x8_t mask = simdutf_make_uint16x8_t(0x0001, 0x0004, 0x0010, 0x0040,
    +                                            0x0002, 0x0008, 0x0020, 0x0080);
    +#else
    +    const uint16x8_t mask = {0x0001, 0x0004, 0x0010, 0x0040,
    +                             0x0002, 0x0008, 0x0020, 0x0080};
    +#endif
    +    uint16_t m2 = vaddvq_u16(vandq_u16(one_byte_bytemask, mask));
    +    // 4. pack the bytes
    +    const uint8_t *row =
    +        &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0];
    +    const uint8x16_t shuffle = vld1q_u8(row + 1);
    +    const uint8x16_t utf8_packed = vqtbl1q_u8(utf8_unpacked, shuffle);
    +
    +    // 5. store bytes
    +    vst1q_u8(utf8_output, utf8_packed);
    +    // 6. adjust pointers
    +    latin1_input += 8;
    +    utf8_output += row[0];
     
    -  while (buf + 16 <= end) {
    -    uint16x8_t in = vld1q_u16(reinterpret_cast(buf));
    -    if (!match_system(big_endian)) {
    -      #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -      const uint8x16_t swap = make_uint8x16_t(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14);
    -      #else
    -      const uint8x16_t swap = {1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14};
    -      #endif
    -      in = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(in), swap));
    -    }
    +  } // while
     
    -    const uint16x8_t surrogates_bytemask = vceqq_u16(vandq_u16(in, v_f800), v_d800);
    -    // It might seem like checking for surrogates_bitmask == 0xc000 could help. However,
    -    // it is likely an uncommon occurrence.
    -      if (vmaxvq_u16(surrogates_bytemask) == 0) {
    -      // case: no surrogate pairs, extend all 16-bit words to 32-bit words
    -      vst1q_u32(utf32_output,  vmovl_u16(vget_low_u16(in)));
    -      vst1q_u32(utf32_output+4,  vmovl_high_u16(in));
    -      utf32_output += 8;
    -      buf += 8;
    -    // surrogate pair(s) in a register
    -    } else {
    -      // Let us do a scalar fallback.
    -      // It may seem wasteful to use scalar code, but being efficient with SIMD
    -      // in the presence of surrogate pairs may require non-trivial tables.
    -      size_t forward = 15;
    -      size_t k = 0;
    -      if(size_t(end - buf) < forward + 1) { forward = size_t(end - buf - 1);}
    -      for(; k < forward; k++) {
    -        uint16_t word = !match_system(big_endian) ? scalar::utf16::swap_bytes(buf[k]) : buf[k];
    -        if((word &0xF800 ) != 0xD800) {
    -          *utf32_output++ = char32_t(word);
    -        } else {
    -          // must be a surrogate pair
    -          uint16_t diff = uint16_t(word - 0xD800);
    -          uint16_t next_word = !match_system(big_endian) ? scalar::utf16::swap_bytes(buf[k + 1]) : buf[k + 1];
    -          k++;
    -          uint16_t diff2 = uint16_t(next_word - 0xDC00);
    -          if((diff | diff2) > 0x3FF)  { return std::make_pair(nullptr, reinterpret_cast(utf32_output)); }
    -          uint32_t value = (diff << 10) + diff2 + 0x10000;
    -          *utf32_output++ = char32_t(value);
    -        }
    -      }
    -      buf += k;
    +  return std::make_pair(latin1_input, reinterpret_cast(utf8_output));
    +}
    +/* end file src/arm64/arm_convert_latin1_to_utf8.cpp */
    +/* begin file src/arm64/arm_convert_latin1_to_utf16.cpp */
    +template 
    +std::pair arm_convert_latin1_to_utf16(const char* buf, size_t len, char16_t* utf16_output) {
    +    const char* end = buf + len;
    +
    +    while (buf + 16 <= end) {
    +        uint8x16_t in8 = vld1q_u8(reinterpret_cast(buf));
    +        uint16x8_t inlow = vmovl_u8(vget_low_u8(in8));
    +        if (!match_system(big_endian)) { inlow = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(inlow))); }
    +        vst1q_u16(reinterpret_cast(utf16_output), inlow);
    +        uint16x8_t inhigh = vmovl_u8(vget_high_u8(in8));
    +        if (!match_system(big_endian)) { inhigh = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(inhigh))); }
    +        vst1q_u16(reinterpret_cast(utf16_output+8), inhigh);
    +        utf16_output += 16;
    +        buf += 16;
         }
    -  } // while
    -  return std::make_pair(buf, reinterpret_cast(utf32_output));
    +
    +    return std::make_pair(buf, utf16_output);
     }
    +/* end file src/arm64/arm_convert_latin1_to_utf16.cpp */
    +/* begin file src/arm64/arm_convert_latin1_to_utf32.cpp */
    +std::pair arm_convert_latin1_to_utf32(const char* buf, size_t len, char32_t* utf32_output) {
    +    const char* end = buf + len;
     
    +    while (buf + 16 <= end) {
    +        uint8x16_t in8 = vld1q_u8(reinterpret_cast(buf));
    +        uint16x8_t in8low = vmovl_u8(vget_low_u8(in8));
    +        uint32x4_t in16lowlow = vmovl_u16(vget_low_u16(in8low));
    +        uint32x4_t in16lowhigh = vmovl_u16(vget_high_u16(in8low));
    +        uint16x8_t in8high = vmovl_u8(vget_high_u8(in8));
    +        uint32x4_t in8highlow = vmovl_u16(vget_low_u16(in8high));
    +        uint32x4_t in8highhigh = vmovl_u16(vget_high_u16(in8high));
    +        vst1q_u32(reinterpret_cast(utf32_output), in16lowlow);
    +        vst1q_u32(reinterpret_cast(utf32_output+4), in16lowhigh);
    +        vst1q_u32(reinterpret_cast(utf32_output+8), in8highlow);
    +        vst1q_u32(reinterpret_cast(utf32_output+12), in8highhigh);
     
    -/*
    -  Returns a pair: a result struct and utf8_output.
    -  If there is an error, the count field of the result is the position of the error.
    -  Otherwise, it is the position of the first unprocessed byte in buf (even if finished).
    -  A scalar routing should carry on the conversion of the tail if needed.
    -*/
    +        utf32_output += 16;
    +        buf += 16;
    +    }
    +
    +    return std::make_pair(buf, utf32_output);
    +}
    +/* end file src/arm64/arm_convert_latin1_to_utf32.cpp */
    +
    +/* begin file src/arm64/arm_convert_utf8_to_utf16.cpp */
    +// Convert up to 16 bytes from utf8 to utf16 using a mask indicating the
    +// end of the code points. Only the least significant 12 bits of the mask
    +// are accessed.
    +// It returns how many bytes were consumed (up to 16, usually 12).
     template 
    -std::pair arm_convert_utf16_to_utf32_with_errors(const char16_t* buf, size_t len, char32_t* utf32_out) {
    -  uint32_t * utf32_output = reinterpret_cast(utf32_out);
    -  const char16_t* start = buf;
    -  const char16_t* end = buf + len;
    +size_t convert_masked_utf8_to_utf16(const char *input,
    +                           uint64_t utf8_end_of_code_point_mask,
    +                           char16_t *&utf16_output) {
    +  // we use an approach where we try to process up to 12 input bytes.
    +  // Why 12 input bytes and not 16? Because we are concerned with the size of
    +  // the lookup tables. Also 12 is nicely divisible by two and three.
    +  //
    +  uint8x16_t in = vld1q_u8(reinterpret_cast(input));
    +  const uint16_t input_utf8_end_of_code_point_mask =
    +      utf8_end_of_code_point_mask & 0xfff;
    +  //
    +  // Optimization note: our main path below is load-latency dependent. Thus it is maybe
    +  // beneficial to have fast paths that depend on branch prediction but have less latency.
    +  // This results in more instructions but, potentially, also higher speeds.
     
    -  const uint16x8_t v_f800 = vmovq_n_u16((uint16_t)0xf800);
    -  const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800);
    +  // We first try a few fast paths.
    +  // The obvious first test is ASCII, which actually consumes the full 16.
    +  if((utf8_end_of_code_point_mask & 0xFFFF) == 0xffff) {
    +    // We process in chunks of 16 bytes
    +    // The routine in simd.h is reused.
    +    simd8 temp{vreinterpretq_s8_u8(in)};
    +    temp.store_ascii_as_utf16(utf16_output);
    +    utf16_output += 16; // We wrote 16 16-bit characters.
    +    return 16; // We consumed 16 bytes.
    +  }
     
    -  while (buf + 16 <= end) {
    -    uint16x8_t in = vld1q_u16(reinterpret_cast(buf));
    +  // 3 byte sequences are the next most common, as seen in CJK, which has long sequences
    +  // of these.
    +  if (input_utf8_end_of_code_point_mask == 0x924) {
    +    // We want to take 4 3-byte UTF-8 code units and turn them into 4 2-byte UTF-16 code units.
    +    uint16x4_t composed = convert_utf8_3_byte_to_utf16(in);
    +    // Byte swap if necessary
         if (!match_system(big_endian)) {
    -      #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -      const uint8x16_t swap = make_uint8x16_t(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14);
    -      #else
    -      const uint8x16_t swap = {1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14};
    -      #endif
    -      in = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(in), swap));
    +      composed = vreinterpret_u16_u8(vrev16_u8(vreinterpret_u8_u16(composed)));
         }
    +    vst1_u16(reinterpret_cast(utf16_output), composed);
    +    utf16_output += 4; // We wrote 4 16-bit characters.
    +    return 12; // We consumed 12 bytes.
    +  }
     
    -    const uint16x8_t surrogates_bytemask = vceqq_u16(vandq_u16(in, v_f800), v_d800);
    -    // It might seem like checking for surrogates_bitmask == 0xc000 could help. However,
    -    // it is likely an uncommon occurrence.
    -      if (vmaxvq_u16(surrogates_bytemask) == 0) {
    -      // case: no surrogate pairs, extend all 16-bit words to 32-bit words
    -      vst1q_u32(utf32_output,  vmovl_u16(vget_low_u16(in)));
    -      vst1q_u32(utf32_output+4,  vmovl_high_u16(in));
    -      utf32_output += 8;
    -      buf += 8;
    -    // surrogate pair(s) in a register
    -    } else {
    -      // Let us do a scalar fallback.
    -      // It may seem wasteful to use scalar code, but being efficient with SIMD
    -      // in the presence of surrogate pairs may require non-trivial tables.
    -      size_t forward = 15;
    -      size_t k = 0;
    -      if(size_t(end - buf) < forward + 1) { forward = size_t(end - buf - 1);}
    -      for(; k < forward; k++) {
    -        uint16_t word = !match_system(big_endian) ? scalar::utf16::swap_bytes(buf[k]) : buf[k];
    -        if((word &0xF800 ) != 0xD800) {
    -          *utf32_output++ = char32_t(word);
    -        } else {
    -          // must be a surrogate pair
    -          uint16_t diff = uint16_t(word - 0xD800);
    -          uint16_t next_word = !match_system(big_endian) ? scalar::utf16::swap_bytes(buf[k + 1]) : buf[k + 1];
    -          k++;
    -          uint16_t diff2 = uint16_t(next_word - 0xDC00);
    -          if((diff | diff2) > 0x3FF)  { return std::make_pair(result(error_code::SURROGATE, buf - start + k - 1), reinterpret_cast(utf32_output)); }
    -          uint32_t value = (diff << 10) + diff2 + 0x10000;
    -          *utf32_output++ = char32_t(value);
    -        }
    -      }
    -      buf += k;
    +  // 2 byte sequences occur in short bursts in languages like Greek and Russian.
    +  if ((utf8_end_of_code_point_mask & 0xFFF) == 0xaaa) {
    +    // We want to take 6 2-byte UTF-8 code units and turn them into 6 2-byte UTF-16 code units.
    +    uint16x8_t composed = convert_utf8_2_byte_to_utf16(in);
    +    // Byte swap if necessary
    +    if (!match_system(big_endian)) {
    +      composed = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(composed)));
         }
    -  } // while
    -  return std::make_pair(result(error_code::SUCCESS, buf - start), reinterpret_cast(utf32_output));
    -}
    -/* end file src/arm64/arm_convert_utf16_to_utf32.cpp */
    +    vst1q_u16(reinterpret_cast(utf16_output), composed);
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=arm64/arm_convert_utf32_to_utf8.cpp
    -/* begin file src/arm64/arm_convert_utf32_to_utf8.cpp */
    -std::pair arm_convert_utf32_to_utf8(const char32_t* buf, size_t len, char* utf8_out) {
    -  uint8_t * utf8_output = reinterpret_cast(utf8_out);
    -  const char32_t* end = buf + len;
    +    utf16_output += 6; // We wrote 6 16-bit characters.
    +    return 12; // We consumed 12 bytes.
    +  }
     
    -  const uint16x8_t v_c080 = vmovq_n_u16((uint16_t)0xc080);
    +  /// We do not have a fast path available, or the fast path is unimportant, so we fallback.
    +  const uint8_t idx =
    +      simdutf::tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][0];
     
    -  uint16x8_t forbidden_bytemask = vmovq_n_u16(0x0);
    +  const uint8_t consumed =
    +      simdutf::tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][1];
     
    -  while (buf + 16 <= end) {
    -    uint32x4_t in = vld1q_u32(reinterpret_cast(buf));
    -    uint32x4_t nextin = vld1q_u32(reinterpret_cast(buf+4));
    +  if (idx < 64) {
    +    // SIX (6) input code-code units
    +    // Convert to UTF-16
    +    uint16x8_t composed = convert_utf8_1_to_2_byte_to_utf16(in, idx);
    +    // Byte swap if necessary
    +    if (!match_system(big_endian)) {
    +      composed = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(composed)));
    +    }
    +    // Store
    +    vst1q_u16(reinterpret_cast(utf16_output), composed);
    +    utf16_output += 6; // We wrote 6 16-bit characters.
    +    return consumed;
    +  } else if (idx < 145) {
    +    // FOUR (4) input code-code units
    +    // UTF-16 and UTF-32 use similar algorithms, but UTF-32 skips the narrowing.
    +    uint8x16_t sh = vld1q_u8(reinterpret_cast(simdutf::tables::utf8_to_utf16::shufutf8[idx]));
    +    // XXX: depending on the system scalar instructions might be faster.
    +    // 1 byte: 00000000 00000000 0ccccccc
    +    // 2 byte: 00000000 110bbbbb 10cccccc
    +    // 3 byte: 1110aaaa 10bbbbbb 10cccccc
    +    uint32x4_t perm = vreinterpretq_u32_u8(vqtbl1q_u8(in, sh));
    +    // 1 byte: 00000000 0ccccccc
    +    // 2 byte: xx0bbbbb x0cccccc
    +    // 3 byte: xxbbbbbb x0cccccc
    +    uint16x4_t lowperm = vmovn_u32(perm);
    +    // Partially mask with bic (doesn't require a temporary register unlike and)
    +    // The shift left insert below will clear the top bits.
    +    // 1 byte: 00000000 00000000
    +    // 2 byte: xx0bbbbb 00000000
    +    // 3 byte: xxbbbbbb 00000000
    +    uint16x4_t middlebyte = vbic_u16(lowperm, vmov_n_u16(uint16_t(~0xFF00)));
    +    // ASCII
    +    // 1 byte: 00000000 0ccccccc
    +    // 2+byte: 00000000 00cccccc
    +    uint16x4_t ascii = vand_u16(lowperm, vmov_n_u16(0x7F));
    +    // Split into narrow vectors.
    +    // 2 byte: 00000000 00000000
    +    // 3 byte: 00000000 xxxxaaaa
    +    uint16x4_t highperm = vshrn_n_u32(perm, 16);
    +    // Shift right accumulate the middle byte
    +    // 1 byte: 00000000 0ccccccc
    +    // 2 byte: 00xx0bbb bbcccccc
    +    // 3 byte: 00xxbbbb bbcccccc
    +    uint16x4_t middlelow = vsra_n_u16(ascii, middlebyte, 2);
    +    // Shift left and insert the top 4 bits, overwriting the garbage
    +    // 1 byte: 00000000 0ccccccc
    +    // 2 byte: 00000bbb bbcccccc
    +    // 3 byte: aaaabbbb bbcccccc
    +    uint16x4_t composed = vsli_n_u16(middlelow, highperm, 12);
    +    // Byte swap if necessary
    +    if (!match_system(big_endian)) {
    +      composed = vreinterpret_u16_u8(vrev16_u8(vreinterpret_u8_u16(composed)));
    +    }
    +    vst1_u16(reinterpret_cast(utf16_output), composed);
     
    -    // Check if no bits set above 16th
    -    if(vmaxvq_u32(vorrq_u32(in, nextin)) <= 0xFFFF) {
    -      // Pack UTF-32 to UTF-16 safely (without surrogate pairs)
    -      // Apply UTF-16 => UTF-8 routine (arm_convert_utf16_to_utf8.cpp)
    -      uint16x8_t utf16_packed = vcombine_u16(vmovn_u32(in), vmovn_u32(nextin));
    -      if(vmaxvq_u16(utf16_packed) <= 0x7F) { // ASCII fast path!!!!
    -          // 1. pack the bytes
    -          // obviously suboptimal.
    -          uint8x8_t utf8_packed = vmovn_u16(utf16_packed);
    -          // 2. store (8 bytes)
    -          vst1_u8(utf8_output, utf8_packed);
    -          // 3. adjust pointers
    -          buf += 8;
    -          utf8_output += 8;
    -          continue; // we are done for this round!
    +    utf16_output += 4; // We wrote 4 16-bit codepoints
    +    return consumed;
    +  } else if (idx < 209) {
    +    // THREE (3) input code-code units
    +    if (input_utf8_end_of_code_point_mask == 0x888) {
    +      // We want to take 3 4-byte UTF-8 code units and turn them into 3 4-byte UTF-16 pairs.
    +      // Generating surrogate pairs is a little tricky though, but it is easier when we
    +      // can assume they are all pairs.
    +      // This version does not use the LUT, but 4 byte sequences are less common and the
    +      // overhead of the extra memory access is less important than the early branch overhead
    +      // in shorter sequences.
    +
    +      // Swap byte pairs
    +      // 10dddddd 10cccccc|10bbbbbb 11110aaa
    +      // 10cccccc 10dddddd|11110aaa 10bbbbbb
    +      uint8x16_t swap = vrev16q_u8(in);
    +      // Shift left 2 bits
    +      // cccccc00 dddddd00 xxxxxxxx bbbbbb00
    +      uint32x4_t shift = vreinterpretq_u32_u8(vshlq_n_u8(swap, 2));
    +      // Create a magic number containing the low 2 bits of the trail surrogate and all the
    +      // corrections needed to create the pair.
    +      // UTF-8 4b prefix   = -0x0000|0xF000
    +      // surrogate offset  = -0x0000|0x0040 (0x10000 << 6)
    +      // surrogate high    = +0x0000|0xD800
    +      // surrogate low     = +0xDC00|0x0000
    +      // -------------------------------
    +      //                   = +0xDC00|0xE7C0
    +      uint32x4_t magic = vmovq_n_u32(0xDC00E7C0);
    +      // Generate unadjusted trail surrogate minus lowest 2 bits
    +      // xxxxxxxx xxxxxxxx|11110aaa bbbbbb00
    +      uint32x4_t trail = vbslq_u32(vmovq_n_u32(0x0000FF00), vreinterpretq_u32_u8(swap), shift);
    +      // Insert low 2 bits of trail surrogate to magic number for later
    +      // 11011100 00000000 11100111 110000cc
    +      uint16x8_t magic_with_low_2 = vreinterpretq_u16_u32(vsraq_n_u32(magic, shift, 30));
    +      // Generate lead surrogate
    +      // xxxxcccc ccdddddd|xxxxxxxx xxxxxxxx
    +      uint32x4_t lead = vreinterpretq_u32_u16(vsliq_n_u16(vreinterpretq_u16_u8(swap), vreinterpretq_u16_u8(in), 6));
    +      // Mask out lead
    +      // 000000cc ccdddddd|xxxxxxxx xxxxxxxx
    +      lead = vbicq_u32(lead, vmovq_n_u32(uint32_t(~0x03FFFFFF)));
    +      // Blend pairs
    +      // 000000cc ccdddddd|11110aaa bbbbbb00
    +      uint16x8_t blend = vreinterpretq_u16_u32(vbslq_u32(vmovq_n_u32(0x0000FFFF), trail, lead));
    +      // Add magic number to finish the result
    +      // 110111CC CCDDDDDD|110110AA BBBBBBCC
    +      uint16x8_t composed = vaddq_u16(blend, magic_with_low_2);
    +      // Byte swap if necessary
    +      if (!match_system(big_endian)) {
    +        composed = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(composed)));
           }
    +      vst1q_u16(reinterpret_cast(utf16_output), composed);
    +      utf16_output += 6; // We 3 32-bit surrogate pairs.
    +      return 12; // We consumed 12 bytes.
    +    }
    +    // 3 1-4 byte sequences
    +    uint8x16_t sh = vld1q_u8(reinterpret_cast(simdutf::tables::utf8_to_utf16::shufutf8[idx]));
     
    -      if (vmaxvq_u16(utf16_packed) <= 0x7FF) {
    -            // 1. prepare 2-byte values
    -            // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
    -            // expected output   : [110a|aaaa|10bb|bbbb] x 8
    -            const uint16x8_t v_1f00 = vmovq_n_u16((int16_t)0x1f00);
    -            const uint16x8_t v_003f = vmovq_n_u16((int16_t)0x003f);
    -
    -            // t0 = [000a|aaaa|bbbb|bb00]
    -            const uint16x8_t t0 = vshlq_n_u16(utf16_packed, 2);
    -            // t1 = [000a|aaaa|0000|0000]
    -            const uint16x8_t t1 = vandq_u16(t0, v_1f00);
    -            // t2 = [0000|0000|00bb|bbbb]
    -            const uint16x8_t t2 = vandq_u16(utf16_packed, v_003f);
    -            // t3 = [000a|aaaa|00bb|bbbb]
    -            const uint16x8_t t3 = vorrq_u16(t1, t2);
    -            // t4 = [110a|aaaa|10bb|bbbb]
    -            const uint16x8_t t4 = vorrq_u16(t3, v_c080);
    -            // 2. merge ASCII and 2-byte codewords
    -            const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
    -            const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f);
    -            const uint8x16_t utf8_unpacked = vreinterpretq_u8_u16(vbslq_u16(one_byte_bytemask, utf16_packed, t4));
    -            // 3. prepare bitmask for 8-bit lookup
    -  #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -            const uint16x8_t mask = make_uint16x8_t(0x0001, 0x0004,
    -                                      0x0010, 0x0040,
    -                                      0x0002, 0x0008,
    -                                      0x0020, 0x0080);
    -  #else
    -            const uint16x8_t mask = { 0x0001, 0x0004,
    -                                      0x0010, 0x0040,
    -                                      0x0002, 0x0008,
    -                                      0x0020, 0x0080 };
    -  #endif
    -            uint16_t m2 = vaddvq_u16(vandq_u16(one_byte_bytemask, mask));
    -            // 4. pack the bytes
    -            const uint8_t* row = &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0];
    -            const uint8x16_t shuffle = vld1q_u8(row + 1);
    -            const uint8x16_t utf8_packed = vqtbl1q_u8(utf8_unpacked, shuffle);
    -
    -            // 5. store bytes
    -            vst1q_u8(utf8_output, utf8_packed);
    -
    -            // 6. adjust pointers
    -            buf += 8;
    -            utf8_output += row[0];
    -            continue;
    -
    +    // 1 byte: 00000000 00000000 00000000 0ddddddd
    +    // 3 byte: 00000000 00000000 110ccccc 10dddddd
    +    // 3 byte: 00000000 1110bbbb 10cccccc 10dddddd
    +    // 4 byte: 11110aaa 10bbbbbb 10cccccc 10dddddd
    +    uint32x4_t perm = vreinterpretq_u32_u8(vqtbl1q_u8(in, sh));
    +    // Mask the low and middle bytes
    +    // 00000000 00000000 00000000 0ddddddd
    +    uint32x4_t ascii = vandq_u32(perm, vmovq_n_u32(0x7f));
    +    // Because the surrogates need more work, the high surrogate is computed first.
    +    uint32x4_t middlehigh = vshlq_n_u32(perm, 2);
    +    // 00000000 00000000 00cccccc 00000000
    +    uint32x4_t middlebyte = vandq_u32(perm, vmovq_n_u32(0x3F00));
    +    // Start assembling the sequence. Since the 4th byte is in the same position as it
    +    // would be in a surrogate and there is no dependency, shift left instead of right.
    +    // 3 byte: 00000000 10bbbbxx xxxxxxxx xxxxxxxx
    +    // 4 byte: 11110aaa bbbbbbxx xxxxxxxx xxxxxxxx
    +    uint32x4_t ab = vbslq_u32(vmovq_n_u32(0xFF000000), perm, middlehigh);
    +    // Top 16 bits contains the high ten bits of the surrogate pair before correction
    +    // 3 byte: 00000000 10bbbbcc|cccc0000 00000000
    +    // 4 byte: 11110aaa bbbbbbcc|cccc0000 00000000 - high 10 bits correct w/o correction
    +    uint32x4_t abc = vbslq_u32(vmovq_n_u32(0xFFFC0000), ab, vshlq_n_u32(middlebyte, 4));
    +    // Combine the low 6 or 7 bits by a shift right accumulate
    +    // 3 byte: 00000000 00000010|bbbbcccc ccdddddd - low 16 bits correct
    +    // 4 byte: 00000011 110aaabb|bbbbcccc ccdddddd - low 10 bits correct w/o correction
    +    uint32x4_t composed = vsraq_n_u32(ascii, abc, 6);
    +    // After this is for surrogates
    +    // Blend the low and high surrogates
    +    // 4 byte: 11110aaa bbbbbbcc|bbbbcccc ccdddddd
    +    uint32x4_t mixed = vbslq_u32(vmovq_n_u32(0xFFFF0000), abc, composed);
    +    // Clear the upper 6 bits of the low surrogate. Don't clear the upper bits yet as
    +    // 0x10000 was not subtracted from the codepoint yet.
    +    // 4 byte: 11110aaa bbbbbbcc|000000cc ccdddddd
    +    uint16x8_t masked_pair =
    +        vreinterpretq_u16_u32(vbicq_u32(mixed, vmovq_n_u32(uint32_t(~0xFFFF03FF))));
    +    // Correct the remaining UTF-8 prefix, surrogate offset, and add the surrogate prefixes
    +    // in one magic 16-bit addition.
    +    // similar magic number but without the continue byte adjust and halfword swapped
    +    // UTF-8 4b prefix   = -0xF000|0x0000
    +    // surrogate offset  = -0x0040|0x0000 (0x10000 << 6)
    +    // surrogate high    = +0xD800|0x0000
    +    // surrogate low     = +0x0000|0xDC00
    +    // -----------------------------------
    +    //                   = +0xE7C0|0xDC00
    +    uint16x8_t magic = vreinterpretq_u16_u32(vmovq_n_u32(0xE7C0DC00));
    +    // 4 byte: 110110AA BBBBBBCC|110111CC CCDDDDDD - surrogate pair complete
    +    uint32x4_t surrogates = vreinterpretq_u32_u16(vaddq_u16(masked_pair, magic));
    +    // If the high bit is 1 (s32 less than zero), this needs a surrogate pair
    +    uint32x4_t is_pair = vcltzq_s32(vreinterpretq_s32_u32(perm));
    +
    +    // Select either the 4 byte surrogate pair or the 2 byte solo codepoint
    +    // 3 byte: 0xxxxxxx xxxxxxxx|bbbbcccc ccdddddd
    +    // 4 byte: 110110AA BBBBBBCC|110111CC CCDDDDDD
    +    uint32x4_t selected = vbslq_u32(is_pair, surrogates, composed);
    +    // Byte swap if necessary
    +    if (!match_system(big_endian)) {
    +      selected = vreinterpretq_u32_u8(vrev16q_u8(vreinterpretq_u8_u32(selected)));
    +    }
    +    // Attempting to shuffle and store would be complex, just scalarize.
    +    uint32_t buffer[4];
    +    vst1q_u32(buffer, selected);
    +    // Test for the top bit of the surrogate mask.
    +    const uint32_t SURROGATE_MASK = match_system(big_endian) ? 0x80000000 : 0x00800000;
    +    for (size_t i = 0; i < 3; i++) {
    +      // Surrogate
    +      if (buffer[i] & SURROGATE_MASK) {
    +        utf16_output[0] = uint16_t(buffer[i] >> 16);
    +        utf16_output[1] = uint16_t(buffer[i] & 0xFFFF);
    +        utf16_output += 2;
           } else {
    -        // case: words from register produce either 1, 2 or 3 UTF-8 bytes
    -        const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800);
    -        const uint16x8_t v_dfff = vmovq_n_u16((uint16_t)0xdfff);
    -        forbidden_bytemask = vorrq_u16(vandq_u16(vcleq_u16(utf16_packed, v_dfff), vcgeq_u16(utf16_packed, v_d800)), forbidden_bytemask);
    -
    -  #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -          const uint16x8_t dup_even = make_uint16x8_t(0x0000, 0x0202, 0x0404, 0x0606,
    -                                      0x0808, 0x0a0a, 0x0c0c, 0x0e0e);
    -  #else
    -          const uint16x8_t dup_even = {0x0000, 0x0202, 0x0404, 0x0606,
    -                                      0x0808, 0x0a0a, 0x0c0c, 0x0e0e};
    -  #endif
    -          /* In this branch we handle three cases:
    -            1. [0000|0000|0ccc|cccc] => [0ccc|cccc]                           - single UFT-8 byte
    -            2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc]              - two UTF-8 bytes
    -            3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three UTF-8 bytes
    +        utf16_output[0] = uint16_t(buffer[i] & 0xFFFF);
    +        utf16_output++;
    +      }
    +    }
    +    return consumed;
    +  } else {
    +    // here we know that there is an error but we do not handle errors
    +    return 12;
    +  }
    +}
     
    -            We expand the input word (16-bit) into two words (32-bit), thus
    -            we have room for four bytes. However, we need five distinct bit
    -            layouts. Note that the last byte in cases #2 and #3 is the same.
    +/* end file src/arm64/arm_convert_utf8_to_utf16.cpp */
    +/* begin file src/arm64/arm_convert_utf8_to_utf32.cpp */
    +// Convert up to 12 bytes from utf8 to utf32 using a mask indicating the
    +// end of the code points. Only the least significant 12 bits of the mask
    +// are accessed.
    +// It returns how many bytes were consumed (up to 12).
    +size_t convert_masked_utf8_to_utf32(const char *input,
    +                           uint64_t utf8_end_of_code_point_mask,
    +                           char32_t *&utf32_out) {
    +  // we use an approach where we try to process up to 12 input bytes.
    +  // Why 12 input bytes and not 16? Because we are concerned with the size of
    +  // the lookup tables. Also 12 is nicely divisible by two and three.
    +  //
    +  uint32_t*& utf32_output = reinterpret_cast(utf32_out);
    +  uint8x16_t in = vld1q_u8(reinterpret_cast(input));
    +  const uint16_t input_utf8_end_of_code_point_mask =
    +      utf8_end_of_code_point_mask & 0xFFF;
    +  //
    +  // Optimization note: our main path below is load-latency dependent. Thus it is maybe
    +  // beneficial to have fast paths that depend on branch prediction but have less latency.
    +  // This results in more instructions but, potentially, also higher speeds.
    +  //
    +  // We first try a few fast paths.
    +  if((utf8_end_of_code_point_mask & 0xffff) == 0xffff) {
    +    // We process in chunks of 16 bytes.
    +    // use fast implementation in src/simdutf/arm64/simd.h
    +    // Ideally the compiler can keep the tables in registers.
    +    simd8 temp{vreinterpretq_s8_u8(in)};
    +    temp.store_ascii_as_utf32_tbl(utf32_out);
    +    utf32_output += 16; // We wrote 16 32-bit characters.
    +    return 16; // We consumed 16 bytes.
    +  }
    +  if(input_utf8_end_of_code_point_mask == 0x924) {
    +    // We want to take 4 3-byte UTF-8 code units and turn them into 4 4-byte UTF-32 code units.
    +    // Convert to UTF-16
    +    uint16x4_t composed_utf16 = convert_utf8_3_byte_to_utf16(in);
    +    // Zero extend and store via ST2 with a zero.
    +    uint16x4x2_t interleaver = {{ composed_utf16, vmov_n_u16(0) }};
    +    vst2_u16(reinterpret_cast(utf32_output), interleaver);
    +    utf32_output += 4; // We wrote 4 32-bit characters.
    +    return 12; // We consumed 12 bytes.
    +  }
    +
    +  // 2 byte sequences occur in short bursts in languages like Greek and Russian.
    +  if(input_utf8_end_of_code_point_mask == 0xaaa) {
    +    // We want to take 6 2-byte UTF-8 code units and turn them into 6 4-byte UTF-32 code units.
    +    // Convert to UTF-16
    +    uint16x8_t composed_utf16 = convert_utf8_2_byte_to_utf16(in);
    +    // Zero extend and store via ST2 with a zero.
    +    uint16x8x2_t interleaver = {{ composed_utf16, vmovq_n_u16(0) }};
    +    vst2q_u16(reinterpret_cast(utf32_output), interleaver);
    +    utf32_output += 6; // We wrote 6 32-bit characters.
    +    return 12; // We consumed 12 bytes.
    +  }
    +  /// Either no fast path or an unimportant fast path.
     
    -            We precompute byte 1 for case #1 and the common byte for cases #2 & #3
    -            in register t2.
    +  const uint8_t idx =
    +      simdutf::tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][0];
    +  const uint8_t consumed =
    +      simdutf::tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][1];
     
    -            We precompute byte 1 for case #3 and -- **conditionally** -- precompute
    -            either byte 1 for case #2 or byte 2 for case #3. Note that they
    -            differ by exactly one bit.
     
    -            Finally from these two words we build proper UTF-8 sequence, taking
    -            into account the case (i.e, the number of bytes to write).
    -          */
    -          /**
    -           * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce:
    -           * t2 => [0ccc|cccc] [10cc|cccc]
    -           * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb])
    -           */
    -  #define simdutf_vec(x) vmovq_n_u16(static_cast(x))
    -          // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc]
    -          const uint16x8_t t0 = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(utf16_packed), vreinterpretq_u8_u16(dup_even)));
    -          // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc]
    -          const uint16x8_t t1 = vandq_u16(t0, simdutf_vec(0b0011111101111111));
    -          // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc]
    -          const uint16x8_t t2 = vorrq_u16 (t1, simdutf_vec(0b1000000000000000));
    +  if (idx < 64) {
    +    // SIX (6) input code-code units
    +    // Convert to UTF-16
    +    uint16x8_t composed_utf16 = convert_utf8_1_to_2_byte_to_utf16(in, idx);
    +    // Zero extend and store with ST2 and zero
    +    uint16x8x2_t interleaver = {{ composed_utf16, vmovq_n_u16(0) }};
    +    vst2q_u16(reinterpret_cast(utf32_output), interleaver);
    +    utf32_output += 6; // We wrote 6 32-bit characters.
    +    return consumed;
    +  } else if (idx < 145) {
    +    // FOUR (4) input code-code units
    +    // UTF-16 and UTF-32 use similar algorithms, but UTF-32 skips the narrowing.
    +    uint8x16_t sh = vld1q_u8(reinterpret_cast(simdutf::tables::utf8_to_utf16::shufutf8[idx]));
    +    // Shuffle
    +    // 1 byte: 00000000 00000000 0ccccccc
    +    // 2 byte: 00000000 110bbbbb 10cccccc
    +    // 3 byte: 1110aaaa 10bbbbbb 10cccccc
    +    uint32x4_t perm = vreinterpretq_u32_u8(vqtbl1q_u8(in, sh));
    +    // Split
    +    // 00000000 00000000 0ccccccc
    +    uint32x4_t ascii = vandq_u32(perm, vmovq_n_u32(0x7F));    // 6 or 7 bits
    +    // Note: unmasked
    +    // xxxxxxxx aaaaxxxx xxxxxxxx
    +    uint32x4_t high = vshrq_n_u32(perm, 4);                   // 4 bits
    +    // Use 16 bit bic instead of and.
    +    // The top bits will be corrected later in the bsl
    +    // 00000000 10bbbbbb 00000000
    +    uint32x4_t middle =
    +        vreinterpretq_u32_u16(vbicq_u16(vreinterpretq_u16_u32(perm), vmovq_n_u16(uint16_t(~0xff00)))); // 5 or 6 bits
    +    // Combine low and middle with shift right accumulate
    +    // 00000000 00xxbbbb bbcccccc
    +    uint32x4_t lowmid = vsraq_n_u32(ascii, middle, 2);
    +    // Insert top 4 bits from high byte with bitwise select
    +    // 00000000 aaaabbbb bbcccccc
    +    uint32x4_t composed = vbslq_u32(vmovq_n_u32(0x0000F000), high, lowmid);
    +    vst1q_u32(utf32_output, composed);
    +    utf32_output += 4; // We wrote 4 32-bit characters.
    +    return consumed;
    +  } else if (idx < 209) {
    +    // THREE (3) input code-code units
    +    if (input_utf8_end_of_code_point_mask == 0x888) {
    +      // We want to take 3 4-byte UTF-8 code units and turn them into 3 4-byte UTF-32 code units.
    +      // This uses the same method as the fixed 3 byte version, reversing and shift left insert.
    +      // However, there is no need for a shuffle mask now, just rev16 and rev32.
    +      //
    +      // This version does not use the LUT, but 4 byte sequences are less common and the
    +      // overhead of the extra memory access is less important than the early branch overhead
    +      // in shorter sequences, so it comes last.
    +
    +      // Swap pairs of bytes
    +      // 10dddddd|10cccccc|10bbbbbb|11110aaa
    +      // 10cccccc 10dddddd|11110aaa 10bbbbbb
    +      uint16x8_t swap1 = vreinterpretq_u16_u8(vrev16q_u8(in));
    +      // Shift left and insert
    +      // xxxxcccc ccdddddd|xxxxxxxa aabbbbbb
    +      uint16x8_t merge1 = vsliq_n_u16(swap1, vreinterpretq_u16_u8(in), 6);
    +      // Swap 16-bit lanes
    +      // xxxxcccc ccdddddd xxxxxxxa aabbbbbb
    +      // xxxxxxxa aabbbbbb xxxxcccc ccdddddd
    +      uint32x4_t swap2 = vreinterpretq_u32_u16(vrev32q_u16(merge1));
    +      // Shift insert again
    +      // xxxxxxxx xxxaaabb bbbbcccc ccdddddd
    +      uint32x4_t merge2 = vsliq_n_u32(swap2, vreinterpretq_u32_u16(merge1), 12);
    +      // Clear the garbage
    +      // 00000000 000aaabb bbbbcccc ccdddddd
    +      uint32x4_t composed = vandq_u32(merge2, vmovq_n_u32(0x1FFFFF));
    +      // Store
    +      vst1q_u32(utf32_output, composed);
    +
    +      utf32_output += 3; // We wrote 3 32-bit characters.
    +      return 12; // We consumed 12 bytes.
    +    }
    +    // Unlike UTF-16, doing a fast codepath doesn't have nearly as much benefit due to
    +    // surrogates no longer being involved.
    +    uint8x16_t sh = vld1q_u8(reinterpret_cast(simdutf::tables::utf8_to_utf16::shufutf8[idx]));
    +    // 1 byte: 00000000 00000000 00000000 0ddddddd
    +    // 2 byte: 00000000 00000000 110ccccc 10dddddd
    +    // 3 byte: 00000000 1110bbbb 10cccccc 10dddddd
    +    // 4 byte: 11110aaa 10bbbbbb 10cccccc 10dddddd
    +    uint32x4_t perm = vreinterpretq_u32_u8(vqtbl1q_u8(in, sh));
    +    // Ascii
    +    uint32x4_t ascii = vandq_u32(perm, vmovq_n_u32(0x7F));
    +    uint32x4_t middle = vandq_u32(perm, vmovq_n_u32(0x3f00));
    +    // When converting the way we do, the 3 byte prefix will be interpreted as the
    +    // 18th bit being set, since the code would interpret the lead byte (0b1110bbbb)
    +    // as a continuation byte (0b10bbbbbb). To fix this, we can either xor or do an
    +    // 8 bit add of the 6th bit shifted right by 1. Since NEON has shift right accumulate,
    +    // we use that.
    +    //  4 byte   3 byte
    +    // 10bbbbbb 1110bbbb
    +    // 00000000 01000000 6th bit
    +    // 00000000 00100000 shift right
    +    // 10bbbbbb 0000bbbb add
    +    // 00bbbbbb 0000bbbb mask
    +    uint8x16_t correction =
    +        vreinterpretq_u8_u32(vandq_u32(perm, vmovq_n_u32(0x00400000)));
    +    uint32x4_t corrected =
    +        vreinterpretq_u32_u8(vsraq_n_u8(vreinterpretq_u8_u32(perm), correction, 1));
    +    // 00000000 00000000 0000cccc ccdddddd
    +    uint32x4_t cd = vsraq_n_u32(ascii, middle, 2);
    +    // Insert twice
    +    // xxxxxxxx xxxaaabb bbbbxxxx xxxxxxxx
    +    uint32x4_t ab = vbslq_u32(vmovq_n_u32(0x01C0000), vshrq_n_u32(corrected, 6), vshrq_n_u32(corrected, 4));
    +    // 00000000 000aaabb bbbbcccc ccdddddd
    +    uint32x4_t composed = vbslq_u32(vmovq_n_u32(0xFFE00FFF), cd, ab);
    +    // Store
    +    vst1q_u32(utf32_output, composed);
    +    utf32_output += 3; // We wrote 3 32-bit characters.
    +    return consumed;
    +  } else {
    +    // here we know that there is an error but we do not handle errors
    +    return 12;
    +  }
    +}
    +/* end file src/arm64/arm_convert_utf8_to_utf32.cpp */
    +/* begin file src/arm64/arm_convert_utf8_to_latin1.cpp */
    +// Convert up to 16 bytes from utf8 to utf16 using a mask indicating the
    +// end of the code points. Only the least significant 12 bits of the mask
    +// are accessed.
    +// It returns how many bytes were consumed (up to 16, usually 12).
    +size_t convert_masked_utf8_to_latin1(const char *input,
    +                           uint64_t utf8_end_of_code_point_mask,
    +                           char *&latin1_output) {
    +  // we use an approach where we try to process up to 12 input bytes.
    +  // Why 12 input bytes and not 16? Because we are concerned with the size of
    +  // the lookup tables. Also 12 is nicely divisible by two and three.
    +  //
    +  uint8x16_t in = vld1q_u8(reinterpret_cast(input));
    +  const uint16_t input_utf8_end_of_code_point_mask =
    +      utf8_end_of_code_point_mask & 0xfff;
    +  //
    +  // Optimization note: our main path below is load-latency dependent. Thus it is maybe
    +  // beneficial to have fast paths that depend on branch prediction but have less latency.
    +  // This results in more instructions but, potentially, also higher speeds.
     
    -          // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa]
    -          const uint16x8_t s0 = vshrq_n_u16(utf16_packed, 12);
    -          // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000]
    -          const uint16x8_t s1 = vandq_u16(utf16_packed, simdutf_vec(0b0000111111000000));
    -          // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000]
    -          const uint16x8_t s1s = vshlq_n_u16(s1, 2);
    -          // [00bb|bbbb|0000|aaaa]
    -          const uint16x8_t s2 = vorrq_u16(s0, s1s);
    -          // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa]
    -          const uint16x8_t s3 = vorrq_u16(s2, simdutf_vec(0b1100000011100000));
    -          const uint16x8_t v_07ff = vmovq_n_u16((uint16_t)0x07FF);
    -          const uint16x8_t one_or_two_bytes_bytemask = vcleq_u16(utf16_packed, v_07ff);
    -          const uint16x8_t m0 = vbicq_u16(simdutf_vec(0b0100000000000000), one_or_two_bytes_bytemask);
    -          const uint16x8_t s4 = veorq_u16(s3, m0);
    -  #undef simdutf_vec
    +  // We first try a few fast paths.
    +  // The obvious first test is ASCII, which actually consumes the full 16.
    +  if((utf8_end_of_code_point_mask & 0xFFFF) == 0xffff) {
    +    // We process in chunks of 16 bytes
    +    vst1q_u8(reinterpret_cast(latin1_output), in);
    +    latin1_output += 16; // We wrote 16 18-bit characters.
    +    return 16; // We consumed 16 bytes.
    +  }
    +  /// We do not have a fast path available, or the fast path is unimportant, so we fallback.
    +  const uint8_t idx =
    +      simdutf::tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][0];
     
    -          // 4. expand words 16-bit => 32-bit
    -          const uint8x16_t out0 = vreinterpretq_u8_u16(vzip1q_u16(t2, s4));
    -          const uint8x16_t out1 = vreinterpretq_u8_u16(vzip2q_u16(t2, s4));
    +  const uint8_t consumed =
    +      simdutf::tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][1];
    +  // this indicates an invalid input:
    +  if(idx >= 64) { return consumed; }
    +  // Here we should have (idx < 64), if not, there is a bug in the validation or elsewhere.
    +  // SIX (6) input code-code units
    +  // this is a relatively easy scenario
    +  // we process SIX (6) input code-code units. The max length in bytes of six code
    +  // code units spanning between 1 and 2 bytes each is 12 bytes.
    +  // Converts 6 1-2 byte UTF-8 characters to 6 UTF-16 characters.
    +  // This is a relatively easy scenario
    +  // we process SIX (6) input code-code units. The max length in bytes of six code
    +  // code units spanning between 1 and 2 bytes each is 12 bytes.
    +  uint8x16_t sh = vld1q_u8(reinterpret_cast(simdutf::tables::utf8_to_utf16::shufutf8[idx]));
    +  // Shuffle
    +  // 1 byte: 00000000 0bbbbbbb
    +  // 2 byte: 110aaaaa 10bbbbbb
    +  uint16x8_t perm = vreinterpretq_u16_u8(vqtbl1q_u8(in, sh));
    +  // Mask
    +  // 1 byte: 00000000 0bbbbbbb
    +  // 2 byte: 00000000 00bbbbbb
    +  uint16x8_t ascii = vandq_u16(perm, vmovq_n_u16(0x7f)); // 6 or 7 bits
    +  // 1 byte: 00000000 00000000
    +  // 2 byte: 000aaaaa 00000000
    +  uint16x8_t highbyte = vandq_u16(perm, vmovq_n_u16(0x1f00)); // 5 bits
    +  // Combine with a shift right accumulate
    +  // 1 byte: 00000000 0bbbbbbb
    +  // 2 byte: 00000aaa aabbbbbb
    +  uint16x8_t composed = vsraq_n_u16(ascii, highbyte, 2);
    +  // writing 8 bytes even though we only care about the first 6 bytes.
    +  uint8x8_t latin1_packed = vmovn_u16(composed);
    +  vst1_u8(reinterpret_cast(latin1_output), latin1_packed);
    +  latin1_output += 6; // We wrote 6 bytes.
    +  return consumed;
    +}
     
    -          // 5. compress 32-bit words into 1, 2 or 3 bytes -- 2 x shuffle
    -          const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
    -          const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f);
    -  #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -          const uint16x8_t onemask = make_uint16x8_t(0x0001, 0x0004,
    -                                      0x0010, 0x0040,
    -                                      0x0100, 0x0400,
    -                                      0x1000, 0x4000 );
    -          const uint16x8_t twomask = make_uint16x8_t(0x0002, 0x0008,
    -                                      0x0020, 0x0080,
    -                                      0x0200, 0x0800,
    -                                      0x2000, 0x8000 );
    -  #else
    -          const uint16x8_t onemask = { 0x0001, 0x0004,
    -                                      0x0010, 0x0040,
    -                                      0x0100, 0x0400,
    -                                      0x1000, 0x4000 };
    -          const uint16x8_t twomask = { 0x0002, 0x0008,
    -                                      0x0020, 0x0080,
    -                                      0x0200, 0x0800,
    -                                      0x2000, 0x8000 };
    -  #endif
    -          const uint16x8_t combined = vorrq_u16(vandq_u16(one_byte_bytemask, onemask), vandq_u16(one_or_two_bytes_bytemask, twomask));
    -          const uint16_t mask = vaddvq_u16(combined);
    -          // The following fast path may or may not be beneficial.
    -          /*if(mask == 0) {
    -            // We only have three-byte words. Use fast path.
    -            const uint8x16_t shuffle = {2,3,1,6,7,5,10,11,9,14,15,13,0,0,0,0};
    -            const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle);
    -            const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle);
    -            vst1q_u8(utf8_output, utf8_0);
    -            utf8_output += 12;
    -            vst1q_u8(utf8_output, utf8_1);
    -            utf8_output += 12;
    -            buf += 8;
    -            continue;
    -          }*/
    -          const uint8_t mask0 = uint8_t(mask);
    -          const uint8_t* row0 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0];
    -          const uint8x16_t shuffle0 = vld1q_u8(row0 + 1);
    -          const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle0);
    +/* end file src/arm64/arm_convert_utf8_to_latin1.cpp */
     
    -          const uint8_t mask1 = static_cast(mask >> 8);
    -          const uint8_t* row1 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0];
    -          const uint8x16_t shuffle1 = vld1q_u8(row1 + 1);
    -          const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle1);
    +/* begin file src/arm64/arm_convert_utf16_to_latin1.cpp */
     
    -          vst1q_u8(utf8_output, utf8_0);
    -          utf8_output += row0[0];
    -          vst1q_u8(utf8_output, utf8_1);
    -          utf8_output += row1[0];
    +template 
    +std::pair arm_convert_utf16_to_latin1(const char16_t* buf, size_t len, char* latin1_output) {
    +  const char16_t* end = buf + len;
    +  while (buf + 8 <= end) {
    +    uint16x8_t in = vld1q_u16(reinterpret_cast(buf));
    +    if (!match_system(big_endian)) { in = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in))); }
    +    if (vmaxvq_u16(in) <= 0xff) {
    +        // 1. pack the bytes
    +        uint8x8_t latin1_packed = vmovn_u16(in);
    +        // 2. store (8 bytes)
    +        vst1_u8(reinterpret_cast(latin1_output), latin1_packed);
    +        // 3. adjust pointers
    +        buf += 8;
    +        latin1_output += 8;
    +    } else {
    +      return std::make_pair(nullptr, reinterpret_cast(latin1_output));
    +    }
    +  } // while
    +  return std::make_pair(buf, latin1_output);
    +}
     
    -          buf += 8;
    -      }
    -    // At least one 32-bit word will produce a surrogate pair in UTF-16 <=> will produce four UTF-8 bytes.
    +template 
    +std::pair arm_convert_utf16_to_latin1_with_errors(const char16_t* buf, size_t len, char* latin1_output) {
    +  const char16_t* start = buf;
    +  const char16_t* end = buf + len;
    +  while (buf + 8 <= end) {
    +    uint16x8_t in = vld1q_u16(reinterpret_cast(buf));
    +    if (!match_system(big_endian)) { in = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in))); }
    +    if (vmaxvq_u16(in) <= 0xff) {
    +        // 1. pack the bytes
    +        uint8x8_t latin1_packed = vmovn_u16(in);
    +        // 2. store (8 bytes)
    +        vst1_u8(reinterpret_cast(latin1_output), latin1_packed);
    +        // 3. adjust pointers
    +        buf += 8;
    +        latin1_output += 8;
         } else {
           // Let us do a scalar fallback.
    -      // It may seem wasteful to use scalar code, but being efficient with SIMD
    -      // in the presence of surrogate pairs may require non-trivial tables.
    -      size_t forward = 15;
    -      size_t k = 0;
    -      if(size_t(end - buf) < forward + 1) { forward = size_t(end - buf - 1);}
    -      for(; k < forward; k++) {
    -        uint32_t word = buf[k];
    -        if((word & 0xFFFFFF80)==0) {
    -          *utf8_output++ = char(word);
    -        } else if((word & 0xFFFFF800)==0) {
    -          *utf8_output++ = char((word>>6) | 0b11000000);
    -          *utf8_output++ = char((word & 0b111111) | 0b10000000);
    -        } else if((word & 0xFFFF0000)==0) {
    -          if (word >= 0xD800 && word <= 0xDFFF) { return std::make_pair(nullptr, reinterpret_cast(utf8_output)); }
    -          *utf8_output++ = char((word>>12) | 0b11100000);
    -          *utf8_output++ = char(((word>>6) & 0b111111) | 0b10000000);
    -          *utf8_output++ = char((word & 0b111111) | 0b10000000);
    +      for(int k = 0; k < 8; k++) {
    +        uint16_t word = !match_system(big_endian) ? scalar::utf16::swap_bytes(buf[k]) : buf[k];
    +        if(word <= 0xff) {
    +          *latin1_output++ = char(word);
             } else {
    -          if (word > 0x10FFFF) { return std::make_pair(nullptr, reinterpret_cast(utf8_output)); }
    -          *utf8_output++ = char((word>>18) | 0b11110000);
    -          *utf8_output++ = char(((word>>12) & 0b111111) | 0b10000000);
    -          *utf8_output++ = char(((word>>6) & 0b111111) | 0b10000000);
    -          *utf8_output++ = char((word & 0b111111) | 0b10000000);
    +          return std::make_pair(result(error_code::TOO_LARGE, buf - start + k), latin1_output);
             }
           }
    -      buf += k;
         }
       } // while
    -
    -  // check for invalid input
    -  if (vmaxvq_u16(forbidden_bytemask) != 0) {
    -    return std::make_pair(nullptr, reinterpret_cast(utf8_output));
    -  }
    -  return std::make_pair(buf, reinterpret_cast(utf8_output));
    +  return std::make_pair(result(error_code::SUCCESS, buf - start), latin1_output);
     }
    +/* end file src/arm64/arm_convert_utf16_to_latin1.cpp */
    +/* begin file src/arm64/arm_convert_utf16_to_utf8.cpp */
    +/*
    +    The vectorized algorithm works on single SSE register i.e., it
    +    loads eight 16-bit code units.
     
    +    We consider three cases:
    +    1. an input register contains no surrogates and each value
    +       is in range 0x0000 .. 0x07ff.
    +    2. an input register contains no surrogates and values are
    +       is in range 0x0000 .. 0xffff.
    +    3. an input register contains surrogates --- i.e. codepoints
    +       can have 16 or 32 bits.
     
    -std::pair arm_convert_utf32_to_utf8_with_errors(const char32_t* buf, size_t len, char* utf8_out) {
    -  uint8_t * utf8_output = reinterpret_cast(utf8_out);
    -  const char32_t* start = buf;
    -  const char32_t* end = buf + len;
    -
    -  const uint16x8_t v_c080 = vmovq_n_u16((uint16_t)0xc080);
    +    Ad 1.
     
    -  while (buf + 16 <= end) {
    -    uint32x4_t in = vld1q_u32(reinterpret_cast(buf));
    -    uint32x4_t nextin = vld1q_u32(reinterpret_cast(buf+4));
    +    When values are less than 0x0800, it means that a 16-bit code unit
    +    can be converted into: 1) single UTF8 byte (when it's an ASCII
    +    char) or 2) two UTF8 bytes.
     
    -    // Check if no bits set above 16th
    -    if(vmaxvq_u32(vorrq_u32(in, nextin)) <= 0xFFFF) {
    -      // Pack UTF-32 to UTF-16 safely (without surrogate pairs)
    -      // Apply UTF-16 => UTF-8 routine (arm_convert_utf16_to_utf8.cpp)
    -      uint16x8_t utf16_packed = vcombine_u16(vmovn_u32(in), vmovn_u32(nextin));
    -      if(vmaxvq_u16(utf16_packed) <= 0x7F) { // ASCII fast path!!!!
    +    For this case we do only some shuffle to obtain these 2-byte
    +    codes and finally compress the whole SSE register with a single
    +    shuffle.
    +
    +    We need 256-entry lookup table to get a compression pattern
    +    and the number of output bytes in the compressed vector register.
    +    Each entry occupies 17 bytes.
    +
    +    Ad 2.
    +
    +    When values fit in 16-bit code units, but are above 0x07ff, then
    +    a single word may produce one, two or three UTF8 bytes.
    +
    +    We prepare data for all these three cases in two registers.
    +    The first register contains lower two UTF8 bytes (used in all
    +    cases), while the second one contains just the third byte for
    +    the three-UTF8-bytes case.
    +
    +    Finally these two registers are interleaved forming eight-element
    +    array of 32-bit values. The array spans two SSE registers.
    +    The bytes from the registers are compressed using two shuffles.
    +
    +    We need 256-entry lookup table to get a compression pattern
    +    and the number of output bytes in the compressed vector register.
    +    Each entry occupies 17 bytes.
    +
    +
    +    To summarize:
    +    - We need two 256-entry tables that have 8704 bytes in total.
    +*/
    +/*
    +  Returns a pair: the first unprocessed byte from buf and utf8_output
    +  A scalar routing should carry on the conversion of the tail.
    +*/
    +template 
    +std::pair arm_convert_utf16_to_utf8(const char16_t* buf, size_t len, char* utf8_out) {
    +  uint8_t * utf8_output = reinterpret_cast(utf8_out);
    +  const char16_t* end = buf + len;
    +
    +  const uint16x8_t v_f800 = vmovq_n_u16((uint16_t)0xf800);
    +  const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800);
    +  const uint16x8_t v_c080 = vmovq_n_u16((uint16_t)0xc080);
    +  const size_t safety_margin = 12; // to avoid overruns, see issue https://github.com/simdutf/simdutf/issues/92
    +  while (buf + 16 + safety_margin <= end) {
    +    uint16x8_t in = vld1q_u16(reinterpret_cast(buf));
    +    if (!match_system(big_endian)) { in = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in))); }
    +    if(vmaxvq_u16(in) <= 0x7F) { // ASCII fast path!!!!
    +        // It is common enough that we have sequences of 16 consecutive ASCII characters.
    +        uint16x8_t nextin = vld1q_u16(reinterpret_cast(buf) + 8);
    +        if (!match_system(big_endian)) { nextin = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(nextin))); }
    +        if(vmaxvq_u16(nextin) > 0x7F) {
               // 1. pack the bytes
               // obviously suboptimal.
    -          uint8x8_t utf8_packed = vmovn_u16(utf16_packed);
    +          uint8x8_t utf8_packed = vmovn_u16(in);
               // 2. store (8 bytes)
               vst1_u8(utf8_output, utf8_packed);
               // 3. adjust pointers
               buf += 8;
               utf8_output += 8;
    +          in = nextin;
    +        } else {
    +          // 1. pack the bytes
    +          // obviously suboptimal.
    +          uint8x16_t utf8_packed = vmovn_high_u16(vmovn_u16(in), nextin);
    +          // 2. store (16 bytes)
    +          vst1q_u8(utf8_output, utf8_packed);
    +          // 3. adjust pointers
    +          buf += 16;
    +          utf8_output += 16;
               continue; // we are done for this round!
    -      }
    -
    -      if (vmaxvq_u16(utf16_packed) <= 0x7FF) {
    -            // 1. prepare 2-byte values
    -            // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
    -            // expected output   : [110a|aaaa|10bb|bbbb] x 8
    -            const uint16x8_t v_1f00 = vmovq_n_u16((int16_t)0x1f00);
    -            const uint16x8_t v_003f = vmovq_n_u16((int16_t)0x003f);
    -
    -            // t0 = [000a|aaaa|bbbb|bb00]
    -            const uint16x8_t t0 = vshlq_n_u16(utf16_packed, 2);
    -            // t1 = [000a|aaaa|0000|0000]
    -            const uint16x8_t t1 = vandq_u16(t0, v_1f00);
    -            // t2 = [0000|0000|00bb|bbbb]
    -            const uint16x8_t t2 = vandq_u16(utf16_packed, v_003f);
    -            // t3 = [000a|aaaa|00bb|bbbb]
    -            const uint16x8_t t3 = vorrq_u16(t1, t2);
    -            // t4 = [110a|aaaa|10bb|bbbb]
    -            const uint16x8_t t4 = vorrq_u16(t3, v_c080);
    -            // 2. merge ASCII and 2-byte codewords
    -            const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
    -            const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f);
    -            const uint8x16_t utf8_unpacked = vreinterpretq_u8_u16(vbslq_u16(one_byte_bytemask, utf16_packed, t4));
    -            // 3. prepare bitmask for 8-bit lookup
    -  #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -            const uint16x8_t mask = make_uint16x8_t(0x0001, 0x0004,
    -                                      0x0010, 0x0040,
    -                                      0x0002, 0x0008,
    -                                      0x0020, 0x0080);
    -  #else
    -            const uint16x8_t mask = { 0x0001, 0x0004,
    -                                      0x0010, 0x0040,
    -                                      0x0002, 0x0008,
    -                                      0x0020, 0x0080 };
    -  #endif
    -            uint16_t m2 = vaddvq_u16(vandq_u16(one_byte_bytemask, mask));
    -            // 4. pack the bytes
    -            const uint8_t* row = &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0];
    -            const uint8x16_t shuffle = vld1q_u8(row + 1);
    -            const uint8x16_t utf8_packed = vqtbl1q_u8(utf8_unpacked, shuffle);
    +        }
    +    }
     
    -            // 5. store bytes
    -            vst1q_u8(utf8_output, utf8_packed);
    +    if (vmaxvq_u16(in) <= 0x7FF) {
    +          // 1. prepare 2-byte values
    +          // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
    +          // expected output   : [110a|aaaa|10bb|bbbb] x 8
    +          const uint16x8_t v_1f00 = vmovq_n_u16((int16_t)0x1f00);
    +          const uint16x8_t v_003f = vmovq_n_u16((int16_t)0x003f);
     
    -            // 6. adjust pointers
    -            buf += 8;
    -            utf8_output += row[0];
    -            continue;
    +          // t0 = [000a|aaaa|bbbb|bb00]
    +          const uint16x8_t t0 = vshlq_n_u16(in, 2);
    +          // t1 = [000a|aaaa|0000|0000]
    +          const uint16x8_t t1 = vandq_u16(t0, v_1f00);
    +          // t2 = [0000|0000|00bb|bbbb]
    +          const uint16x8_t t2 = vandq_u16(in, v_003f);
    +          // t3 = [000a|aaaa|00bb|bbbb]
    +          const uint16x8_t t3 = vorrq_u16(t1, t2);
    +          // t4 = [110a|aaaa|10bb|bbbb]
    +          const uint16x8_t t4 = vorrq_u16(t3, v_c080);
    +          // 2. merge ASCII and 2-byte codewords
    +          const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
    +          const uint16x8_t one_byte_bytemask = vcleq_u16(in, v_007f);
    +          const uint8x16_t utf8_unpacked = vreinterpretq_u8_u16(vbslq_u16(one_byte_bytemask, in, t4));
    +          // 3. prepare bitmask for 8-bit lookup
    +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    +          const uint16x8_t mask = simdutf_make_uint16x8_t(0x0001, 0x0004,
    +                                    0x0010, 0x0040,
    +                                    0x0002, 0x0008,
    +                                    0x0020, 0x0080);
    +#else
    +          const uint16x8_t mask = { 0x0001, 0x0004,
    +                                    0x0010, 0x0040,
    +                                    0x0002, 0x0008,
    +                                    0x0020, 0x0080 };
    +#endif
    +          uint16_t m2 = vaddvq_u16(vandq_u16(one_byte_bytemask, mask));
    +          // 4. pack the bytes
    +          const uint8_t* row = &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0];
    +          const uint8x16_t shuffle = vld1q_u8(row + 1);
    +          const uint8x16_t utf8_packed = vqtbl1q_u8(utf8_unpacked, shuffle);
     
    -      } else {
    -        // case: words from register produce either 1, 2 or 3 UTF-8 bytes
    +          // 5. store bytes
    +          vst1q_u8(utf8_output, utf8_packed);
     
    -        // check for invalid input
    -        const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800);
    -        const uint16x8_t v_dfff = vmovq_n_u16((uint16_t)0xdfff);
    -        const uint16x8_t forbidden_bytemask = vandq_u16(vcleq_u16(utf16_packed, v_dfff), vcgeq_u16(utf16_packed, v_d800));
    -        if (vmaxvq_u16(forbidden_bytemask) != 0) {
    -          return std::make_pair(result(error_code::SURROGATE, buf - start), reinterpret_cast(utf8_output));
    -        }
    +          // 6. adjust pointers
    +          buf += 8;
    +          utf8_output += row[0];
    +          continue;
     
    -  #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -          const uint16x8_t dup_even = make_uint16x8_t(0x0000, 0x0202, 0x0404, 0x0606,
    -                                      0x0808, 0x0a0a, 0x0c0c, 0x0e0e);
    -  #else
    -          const uint16x8_t dup_even = {0x0000, 0x0202, 0x0404, 0x0606,
    -                                      0x0808, 0x0a0a, 0x0c0c, 0x0e0e};
    -  #endif
    -          /* In this branch we handle three cases:
    -            1. [0000|0000|0ccc|cccc] => [0ccc|cccc]                           - single UFT-8 byte
    -            2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc]              - two UTF-8 bytes
    -            3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three UTF-8 bytes
    +    }
    +    const uint16x8_t surrogates_bytemask = vceqq_u16(vandq_u16(in, v_f800), v_d800);
    +    // It might seem like checking for surrogates_bitmask == 0xc000 could help. However,
    +    // it is likely an uncommon occurrence.
    +    if (vmaxvq_u16(surrogates_bytemask) == 0) {
    +        // case: code units from register produce either 1, 2 or 3 UTF-8 bytes
    +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    +        const uint16x8_t dup_even = simdutf_make_uint16x8_t(0x0000, 0x0202, 0x0404, 0x0606,
    +                                     0x0808, 0x0a0a, 0x0c0c, 0x0e0e);
    +#else
    +        const uint16x8_t dup_even = {0x0000, 0x0202, 0x0404, 0x0606,
    +                                     0x0808, 0x0a0a, 0x0c0c, 0x0e0e};
    +#endif
    +        /* In this branch we handle three cases:
    +           1. [0000|0000|0ccc|cccc] => [0ccc|cccc]                           - single UFT-8 byte
    +           2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc]              - two UTF-8 bytes
    +           3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three UTF-8 bytes
     
    -            We expand the input word (16-bit) into two words (32-bit), thus
    -            we have room for four bytes. However, we need five distinct bit
    -            layouts. Note that the last byte in cases #2 and #3 is the same.
    +          We expand the input word (16-bit) into two code units (32-bit), thus
    +          we have room for four bytes. However, we need five distinct bit
    +          layouts. Note that the last byte in cases #2 and #3 is the same.
     
    -            We precompute byte 1 for case #1 and the common byte for cases #2 & #3
    -            in register t2.
    +          We precompute byte 1 for case #1 and the common byte for cases #2 & #3
    +          in register t2.
     
    -            We precompute byte 1 for case #3 and -- **conditionally** -- precompute
    -            either byte 1 for case #2 or byte 2 for case #3. Note that they
    -            differ by exactly one bit.
    +          We precompute byte 1 for case #3 and -- **conditionally** -- precompute
    +          either byte 1 for case #2 or byte 2 for case #3. Note that they
    +          differ by exactly one bit.
     
    -            Finally from these two words we build proper UTF-8 sequence, taking
    -            into account the case (i.e, the number of bytes to write).
    -          */
    -          /**
    -           * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce:
    -           * t2 => [0ccc|cccc] [10cc|cccc]
    -           * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb])
    -           */
    -  #define simdutf_vec(x) vmovq_n_u16(static_cast(x))
    -          // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc]
    -          const uint16x8_t t0 = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(utf16_packed), vreinterpretq_u8_u16(dup_even)));
    -          // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc]
    -          const uint16x8_t t1 = vandq_u16(t0, simdutf_vec(0b0011111101111111));
    -          // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc]
    -          const uint16x8_t t2 = vorrq_u16 (t1, simdutf_vec(0b1000000000000000));
    +          Finally from these two code units we build proper UTF-8 sequence, taking
    +          into account the case (i.e, the number of bytes to write).
    +        */
    +        /**
    +         * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce:
    +         * t2 => [0ccc|cccc] [10cc|cccc]
    +         * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb])
    +         */
    +#define simdutf_vec(x) vmovq_n_u16(static_cast(x))
    +        // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc]
    +        const uint16x8_t t0 = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(in), vreinterpretq_u8_u16(dup_even)));
    +        // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc]
    +        const uint16x8_t t1 = vandq_u16(t0, simdutf_vec(0b0011111101111111));
    +        // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc]
    +        const uint16x8_t t2 = vorrq_u16 (t1, simdutf_vec(0b1000000000000000));
     
    -          // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa]
    -          const uint16x8_t s0 = vshrq_n_u16(utf16_packed, 12);
    -          // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000]
    -          const uint16x8_t s1 = vandq_u16(utf16_packed, simdutf_vec(0b0000111111000000));
    -          // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000]
    -          const uint16x8_t s1s = vshlq_n_u16(s1, 2);
    -          // [00bb|bbbb|0000|aaaa]
    -          const uint16x8_t s2 = vorrq_u16(s0, s1s);
    -          // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa]
    -          const uint16x8_t s3 = vorrq_u16(s2, simdutf_vec(0b1100000011100000));
    -          const uint16x8_t v_07ff = vmovq_n_u16((uint16_t)0x07FF);
    -          const uint16x8_t one_or_two_bytes_bytemask = vcleq_u16(utf16_packed, v_07ff);
    -          const uint16x8_t m0 = vbicq_u16(simdutf_vec(0b0100000000000000), one_or_two_bytes_bytemask);
    -          const uint16x8_t s4 = veorq_u16(s3, m0);
    -  #undef simdutf_vec
    +        // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa]
    +        const uint16x8_t s0 = vshrq_n_u16(in, 12);
    +        // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000]
    +        const uint16x8_t s1 = vandq_u16(in, simdutf_vec(0b0000111111000000));
    +        // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000]
    +        const uint16x8_t s1s = vshlq_n_u16(s1, 2);
    +        // [00bb|bbbb|0000|aaaa]
    +        const uint16x8_t s2 = vorrq_u16(s0, s1s);
    +        // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa]
    +        const uint16x8_t s3 = vorrq_u16(s2, simdutf_vec(0b1100000011100000));
    +        const uint16x8_t v_07ff = vmovq_n_u16((uint16_t)0x07FF);
    +        const uint16x8_t one_or_two_bytes_bytemask = vcleq_u16(in, v_07ff);
    +        const uint16x8_t m0 = vbicq_u16(simdutf_vec(0b0100000000000000), one_or_two_bytes_bytemask);
    +        const uint16x8_t s4 = veorq_u16(s3, m0);
    +#undef simdutf_vec
     
    -          // 4. expand words 16-bit => 32-bit
    -          const uint8x16_t out0 = vreinterpretq_u8_u16(vzip1q_u16(t2, s4));
    -          const uint8x16_t out1 = vreinterpretq_u8_u16(vzip2q_u16(t2, s4));
    +        // 4. expand code units 16-bit => 32-bit
    +        const uint8x16_t out0 = vreinterpretq_u8_u16(vzip1q_u16(t2, s4));
    +        const uint8x16_t out1 = vreinterpretq_u8_u16(vzip2q_u16(t2, s4));
     
    -          // 5. compress 32-bit words into 1, 2 or 3 bytes -- 2 x shuffle
    -          const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
    -          const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f);
    -  #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -          const uint16x8_t onemask = make_uint16x8_t(0x0001, 0x0004,
    -                                      0x0010, 0x0040,
    -                                      0x0100, 0x0400,
    -                                      0x1000, 0x4000 );
    -          const uint16x8_t twomask = make_uint16x8_t(0x0002, 0x0008,
    -                                      0x0020, 0x0080,
    -                                      0x0200, 0x0800,
    -                                      0x2000, 0x8000 );
    -  #else
    -          const uint16x8_t onemask = { 0x0001, 0x0004,
    -                                      0x0010, 0x0040,
    -                                      0x0100, 0x0400,
    -                                      0x1000, 0x4000 };
    -          const uint16x8_t twomask = { 0x0002, 0x0008,
    -                                      0x0020, 0x0080,
    -                                      0x0200, 0x0800,
    -                                      0x2000, 0x8000 };
    -  #endif
    -          const uint16x8_t combined = vorrq_u16(vandq_u16(one_byte_bytemask, onemask), vandq_u16(one_or_two_bytes_bytemask, twomask));
    -          const uint16_t mask = vaddvq_u16(combined);
    -          // The following fast path may or may not be beneficial.
    -          /*if(mask == 0) {
    -            // We only have three-byte words. Use fast path.
    -            const uint8x16_t shuffle = {2,3,1,6,7,5,10,11,9,14,15,13,0,0,0,0};
    -            const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle);
    -            const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle);
    -            vst1q_u8(utf8_output, utf8_0);
    -            utf8_output += 12;
    -            vst1q_u8(utf8_output, utf8_1);
    -            utf8_output += 12;
    -            buf += 8;
    -            continue;
    -          }*/
    -          const uint8_t mask0 = uint8_t(mask);
    +        // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
    +        const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
    +        const uint16x8_t one_byte_bytemask = vcleq_u16(in, v_007f);
    +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    +        const uint16x8_t onemask = simdutf_make_uint16x8_t(0x0001, 0x0004,
    +                                    0x0010, 0x0040,
    +                                    0x0100, 0x0400,
    +                                    0x1000, 0x4000 );
    +        const uint16x8_t twomask = simdutf_make_uint16x8_t(0x0002, 0x0008,
    +                                    0x0020, 0x0080,
    +                                    0x0200, 0x0800,
    +                                    0x2000, 0x8000 );
    +#else
    +        const uint16x8_t onemask = { 0x0001, 0x0004,
    +                                    0x0010, 0x0040,
    +                                    0x0100, 0x0400,
    +                                    0x1000, 0x4000 };
    +        const uint16x8_t twomask = { 0x0002, 0x0008,
    +                                    0x0020, 0x0080,
    +                                    0x0200, 0x0800,
    +                                    0x2000, 0x8000 };
    +#endif
    +        const uint16x8_t combined = vorrq_u16(vandq_u16(one_byte_bytemask, onemask), vandq_u16(one_or_two_bytes_bytemask, twomask));
    +        const uint16_t mask = vaddvq_u16(combined);
    +        // The following fast path may or may not be beneficial.
    +        /*if(mask == 0) {
    +          // We only have three-byte code units. Use fast path.
    +          const uint8x16_t shuffle = {2,3,1,6,7,5,10,11,9,14,15,13,0,0,0,0};
    +          const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle);
    +          const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle);
    +          vst1q_u8(utf8_output, utf8_0);
    +          utf8_output += 12;
    +          vst1q_u8(utf8_output, utf8_1);
    +          utf8_output += 12;
    +          buf += 8;
    +          continue;
    +        }*/
    +        const uint8_t mask0 = uint8_t(mask);
     
    -          const uint8_t* row0 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0];
    -          const uint8x16_t shuffle0 = vld1q_u8(row0 + 1);
    -          const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle0);
    +        const uint8_t* row0 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0];
    +        const uint8x16_t shuffle0 = vld1q_u8(row0 + 1);
    +        const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle0);
     
    -          const uint8_t mask1 = static_cast(mask >> 8);
    -          const uint8_t* row1 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0];
    -          const uint8x16_t shuffle1 = vld1q_u8(row1 + 1);
    -          const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle1);
    +        const uint8_t mask1 = static_cast(mask >> 8);
    +        const uint8_t* row1 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0];
    +        const uint8x16_t shuffle1 = vld1q_u8(row1 + 1);
    +        const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle1);
     
    -          vst1q_u8(utf8_output, utf8_0);
    -          utf8_output += row0[0];
    -          vst1q_u8(utf8_output, utf8_1);
    -          utf8_output += row1[0];
    +        vst1q_u8(utf8_output, utf8_0);
    +        utf8_output += row0[0];
    +        vst1q_u8(utf8_output, utf8_1);
    +        utf8_output += row1[0];
     
    -          buf += 8;
    -      }
    -    // At least one 32-bit word will produce a surrogate pair in UTF-16 <=> will produce four UTF-8 bytes.
    +        buf += 8;
    +    // surrogate pair(s) in a register
         } else {
           // Let us do a scalar fallback.
           // It may seem wasteful to use scalar code, but being efficient with SIMD
    @@ -13617,269 +14023,1590 @@ std::pair arm_convert_utf32_to_utf8_with_errors(const char32_t* b
           size_t k = 0;
           if(size_t(end - buf) < forward + 1) { forward = size_t(end - buf - 1);}
           for(; k < forward; k++) {
    -        uint32_t word = buf[k];
    -        if((word & 0xFFFFFF80)==0) {
    +        uint16_t word = !match_system(big_endian) ? scalar::utf16::swap_bytes(buf[k]) : buf[k];
    +        if((word & 0xFF80)==0) {
               *utf8_output++ = char(word);
    -        } else if((word & 0xFFFFF800)==0) {
    +        } else if((word & 0xF800)==0) {
               *utf8_output++ = char((word>>6) | 0b11000000);
               *utf8_output++ = char((word & 0b111111) | 0b10000000);
    -        } else if((word & 0xFFFF0000)==0) {
    -          if (word >= 0xD800 && word <= 0xDFFF) { return std::make_pair(result(error_code::SURROGATE, buf - start + k), reinterpret_cast(utf8_output)); }
    +        } else if((word &0xF800 ) != 0xD800) {
               *utf8_output++ = char((word>>12) | 0b11100000);
               *utf8_output++ = char(((word>>6) & 0b111111) | 0b10000000);
               *utf8_output++ = char((word & 0b111111) | 0b10000000);
             } else {
    -          if (word > 0x10FFFF) { return std::make_pair(result(error_code::TOO_LARGE, buf - start + k), reinterpret_cast(utf8_output)); }
    -          *utf8_output++ = char((word>>18) | 0b11110000);
    -          *utf8_output++ = char(((word>>12) & 0b111111) | 0b10000000);
    -          *utf8_output++ = char(((word>>6) & 0b111111) | 0b10000000);
    -          *utf8_output++ = char((word & 0b111111) | 0b10000000);
    +          // must be a surrogate pair
    +          uint16_t diff = uint16_t(word - 0xD800);
    +          uint16_t next_word = !match_system(big_endian) ? scalar::utf16::swap_bytes(buf[k + 1]) : buf[k + 1];
    +          k++;
    +          uint16_t diff2 = uint16_t(next_word - 0xDC00);
    +          if((diff | diff2) > 0x3FF)  { return std::make_pair(nullptr, reinterpret_cast(utf8_output)); }
    +          uint32_t value = (diff << 10) + diff2 + 0x10000;
    +          *utf8_output++ = char((value>>18) | 0b11110000);
    +          *utf8_output++ = char(((value>>12) & 0b111111) | 0b10000000);
    +          *utf8_output++ = char(((value>>6) & 0b111111) | 0b10000000);
    +          *utf8_output++ = char((value & 0b111111) | 0b10000000);
             }
           }
           buf += k;
         }
       } // while
     
    -  return std::make_pair(result(error_code::SUCCESS, buf - start), reinterpret_cast(utf8_output));
    +  return std::make_pair(buf, reinterpret_cast(utf8_output));
     }
    -/* end file src/arm64/arm_convert_utf32_to_utf8.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=arm64/arm_convert_utf32_to_utf16.cpp
    -/* begin file src/arm64/arm_convert_utf32_to_utf16.cpp */
    -template 
    -std::pair arm_convert_utf32_to_utf16(const char32_t* buf, size_t len, char16_t* utf16_out) {
    -  uint16_t * utf16_output = reinterpret_cast(utf16_out);
    -  const char32_t* end = buf + len;
     
    -  uint16x4_t forbidden_bytemask = vmov_n_u16(0x0);
    -
    -  while(buf + 4 <= end) {
    -    uint32x4_t in = vld1q_u32(reinterpret_cast(buf));
     
    -    // Check if no bits set above 16th
    -    if(vmaxvq_u32(in) <= 0xFFFF) {
    -      uint16x4_t utf16_packed = vmovn_u32(in);
    +/*
    +  Returns a pair: a result struct and utf8_output.
    +  If there is an error, the count field of the result is the position of the error.
    +  Otherwise, it is the position of the first unprocessed byte in buf (even if finished).
    +  A scalar routing should carry on the conversion of the tail if needed.
    +*/
    +template 
    +std::pair arm_convert_utf16_to_utf8_with_errors(const char16_t* buf, size_t len, char* utf8_out) {
    +  uint8_t * utf8_output = reinterpret_cast(utf8_out);
    +    const char16_t* start = buf;
    +  const char16_t* end = buf + len;
     
    -      const uint16x4_t v_d800 = vmov_n_u16((uint16_t)0xd800);
    -      const uint16x4_t v_dfff = vmov_n_u16((uint16_t)0xdfff);
    -      forbidden_bytemask = vorr_u16(vand_u16(vcle_u16(utf16_packed, v_dfff), vcge_u16(utf16_packed, v_d800)), forbidden_bytemask);
    +  const uint16x8_t v_f800 = vmovq_n_u16((uint16_t)0xf800);
    +  const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800);
    +  const uint16x8_t v_c080 = vmovq_n_u16((uint16_t)0xc080);
    +  const size_t safety_margin = 12; // to avoid overruns, see issue https://github.com/simdutf/simdutf/issues/92
     
    -      if (!match_system(big_endian)) {
    -        #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -        const uint8x8_t swap = make_uint8x8_t(1, 0, 3, 2, 5, 4, 7, 6);
    -        #else
    -        const uint8x8_t swap = {1, 0, 3, 2, 5, 4, 7, 6};
    -        #endif
    -        utf16_packed = vreinterpret_u16_u8(vtbl1_u8(vreinterpret_u8_u16(utf16_packed), swap));
    -      }
    -      vst1_u16(utf16_output, utf16_packed);
    -      utf16_output += 4;
    -      buf += 4;
    -    } else {
    -      size_t forward = 3;
    -      size_t k = 0;
    -      if(size_t(end - buf) < forward + 1) { forward = size_t(end - buf - 1);}
    -      for(; k < forward; k++) {
    -        uint32_t word = buf[k];
    -        if((word & 0xFFFF0000)==0) {
    -          // will not generate a surrogate pair
    -          if (word >= 0xD800 && word <= 0xDFFF) { return std::make_pair(nullptr, reinterpret_cast(utf16_output)); }
    -          *utf16_output++ = !match_system(big_endian) ? char16_t(word >> 8 | word << 8) : char16_t(word);
    +  while (buf + 16 + safety_margin <= end) {
    +    uint16x8_t in = vld1q_u16(reinterpret_cast(buf));
    +    if (!match_system(big_endian)) { in = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in))); }
    +    if(vmaxvq_u16(in) <= 0x7F) { // ASCII fast path!!!!
    +        // It is common enough that we have sequences of 16 consecutive ASCII characters.
    +        uint16x8_t nextin = vld1q_u16(reinterpret_cast(buf) + 8);
    +        if (!match_system(big_endian)) { nextin = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(nextin))); }
    +        if(vmaxvq_u16(nextin) > 0x7F) {
    +          // 1. pack the bytes
    +          // obviously suboptimal.
    +          uint8x8_t utf8_packed = vmovn_u16(in);
    +          // 2. store (8 bytes)
    +          vst1_u8(utf8_output, utf8_packed);
    +          // 3. adjust pointers
    +          buf += 8;
    +          utf8_output += 8;
    +          in = nextin;
             } else {
    -          // will generate a surrogate pair
    -          if (word > 0x10FFFF) { return std::make_pair(nullptr, reinterpret_cast(utf16_output)); }
    -          word -= 0x10000;
    -          uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10));
    -          uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF));
    -          if (!match_system(big_endian)) {
    -            high_surrogate = uint16_t(high_surrogate >> 8 | high_surrogate << 8);
    -            low_surrogate = uint16_t(low_surrogate << 8 | low_surrogate >> 8);
    -          }
    -          *utf16_output++ = char16_t(high_surrogate);
    -          *utf16_output++ = char16_t(low_surrogate);
    +          // 1. pack the bytes
    +          // obviously suboptimal.
    +          uint8x16_t utf8_packed = vmovn_high_u16(vmovn_u16(in), nextin);
    +          // 2. store (16 bytes)
    +          vst1q_u8(utf8_output, utf8_packed);
    +          // 3. adjust pointers
    +          buf += 16;
    +          utf8_output += 16;
    +          continue; // we are done for this round!
             }
    -      }
    -      buf += k;
         }
    -  }
    -
    -  // check for invalid input
    -  if (vmaxv_u16(forbidden_bytemask) != 0) {
    -    return std::make_pair(nullptr, reinterpret_cast(utf16_output));
    -  }
    -
    -  return std::make_pair(buf, reinterpret_cast(utf16_output));
    -}
     
    +    if (vmaxvq_u16(in) <= 0x7FF) {
    +          // 1. prepare 2-byte values
    +          // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
    +          // expected output   : [110a|aaaa|10bb|bbbb] x 8
    +          const uint16x8_t v_1f00 = vmovq_n_u16((int16_t)0x1f00);
    +          const uint16x8_t v_003f = vmovq_n_u16((int16_t)0x003f);
     
    -template 
    -std::pair arm_convert_utf32_to_utf16_with_errors(const char32_t* buf, size_t len, char16_t* utf16_out) {
    -  uint16_t * utf16_output = reinterpret_cast(utf16_out);
    -  const char32_t* start = buf;
    -  const char32_t* end = buf + len;
    +          // t0 = [000a|aaaa|bbbb|bb00]
    +          const uint16x8_t t0 = vshlq_n_u16(in, 2);
    +          // t1 = [000a|aaaa|0000|0000]
    +          const uint16x8_t t1 = vandq_u16(t0, v_1f00);
    +          // t2 = [0000|0000|00bb|bbbb]
    +          const uint16x8_t t2 = vandq_u16(in, v_003f);
    +          // t3 = [000a|aaaa|00bb|bbbb]
    +          const uint16x8_t t3 = vorrq_u16(t1, t2);
    +          // t4 = [110a|aaaa|10bb|bbbb]
    +          const uint16x8_t t4 = vorrq_u16(t3, v_c080);
    +          // 2. merge ASCII and 2-byte codewords
    +          const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
    +          const uint16x8_t one_byte_bytemask = vcleq_u16(in, v_007f);
    +          const uint8x16_t utf8_unpacked = vreinterpretq_u8_u16(vbslq_u16(one_byte_bytemask, in, t4));
    +          // 3. prepare bitmask for 8-bit lookup
    +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    +          const uint16x8_t mask = simdutf_make_uint16x8_t(0x0001, 0x0004,
    +                                    0x0010, 0x0040,
    +                                    0x0002, 0x0008,
    +                                    0x0020, 0x0080);
    +#else
    +          const uint16x8_t mask = { 0x0001, 0x0004,
    +                                    0x0010, 0x0040,
    +                                    0x0002, 0x0008,
    +                                    0x0020, 0x0080 };
    +#endif
    +          uint16_t m2 = vaddvq_u16(vandq_u16(one_byte_bytemask, mask));
    +          // 4. pack the bytes
    +          const uint8_t* row = &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0];
    +          const uint8x16_t shuffle = vld1q_u8(row + 1);
    +          const uint8x16_t utf8_packed = vqtbl1q_u8(utf8_unpacked, shuffle);
     
    -  while(buf + 4 <= end) {
    -    uint32x4_t in = vld1q_u32(reinterpret_cast(buf));
    +          // 5. store bytes
    +          vst1q_u8(utf8_output, utf8_packed);
     
    -    // Check if no bits set above 16th
    -    if(vmaxvq_u32(in) <= 0xFFFF) {
    -      uint16x4_t utf16_packed = vmovn_u32(in);
    +          // 6. adjust pointers
    +          buf += 8;
    +          utf8_output += row[0];
    +          continue;
     
    -      const uint16x4_t v_d800 = vmov_n_u16((uint16_t)0xd800);
    -      const uint16x4_t v_dfff = vmov_n_u16((uint16_t)0xdfff);
    -      const uint16x4_t forbidden_bytemask = vand_u16(vcle_u16(utf16_packed, v_dfff), vcge_u16(utf16_packed, v_d800));
    -      if (vmaxv_u16(forbidden_bytemask) != 0) {
    -        return std::make_pair(result(error_code::SURROGATE, buf - start), reinterpret_cast(utf16_output));
    -      }
    +    }
    +    const uint16x8_t surrogates_bytemask = vceqq_u16(vandq_u16(in, v_f800), v_d800);
    +    // It might seem like checking for surrogates_bitmask == 0xc000 could help. However,
    +    // it is likely an uncommon occurrence.
    +    if (vmaxvq_u16(surrogates_bytemask) == 0) {
    +        // case: code units from register produce either 1, 2 or 3 UTF-8 bytes
    +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    +        const uint16x8_t dup_even = simdutf_make_uint16x8_t(0x0000, 0x0202, 0x0404, 0x0606,
    +                                     0x0808, 0x0a0a, 0x0c0c, 0x0e0e);
    +#else
    +        const uint16x8_t dup_even = {0x0000, 0x0202, 0x0404, 0x0606,
    +                                     0x0808, 0x0a0a, 0x0c0c, 0x0e0e};
    +#endif
    +        /* In this branch we handle three cases:
    +           1. [0000|0000|0ccc|cccc] => [0ccc|cccc]                           - single UFT-8 byte
    +           2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc]              - two UTF-8 bytes
    +           3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three UTF-8 bytes
     
    -      if (!match_system(big_endian)) {
    -        #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    -        const uint8x8_t swap = make_uint8x8_t(1, 0, 3, 2, 5, 4, 7, 6);
    -        #else
    -        const uint8x8_t swap = {1, 0, 3, 2, 5, 4, 7, 6};
    -        #endif
    -        utf16_packed = vreinterpret_u16_u8(vtbl1_u8(vreinterpret_u8_u16(utf16_packed), swap));
    -      }
    -      vst1_u16(utf16_output, utf16_packed);
    -      utf16_output += 4;
    -      buf += 4;
    +          We expand the input word (16-bit) into two code units (32-bit), thus
    +          we have room for four bytes. However, we need five distinct bit
    +          layouts. Note that the last byte in cases #2 and #3 is the same.
    +
    +          We precompute byte 1 for case #1 and the common byte for cases #2 & #3
    +          in register t2.
    +
    +          We precompute byte 1 for case #3 and -- **conditionally** -- precompute
    +          either byte 1 for case #2 or byte 2 for case #3. Note that they
    +          differ by exactly one bit.
    +
    +          Finally from these two code units we build proper UTF-8 sequence, taking
    +          into account the case (i.e, the number of bytes to write).
    +        */
    +        /**
    +         * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce:
    +         * t2 => [0ccc|cccc] [10cc|cccc]
    +         * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb])
    +         */
    +#define simdutf_vec(x) vmovq_n_u16(static_cast(x))
    +        // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc]
    +        const uint16x8_t t0 = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(in), vreinterpretq_u8_u16(dup_even)));
    +        // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc]
    +        const uint16x8_t t1 = vandq_u16(t0, simdutf_vec(0b0011111101111111));
    +        // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc]
    +        const uint16x8_t t2 = vorrq_u16 (t1, simdutf_vec(0b1000000000000000));
    +
    +        // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa]
    +        const uint16x8_t s0 = vshrq_n_u16(in, 12);
    +        // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000]
    +        const uint16x8_t s1 = vandq_u16(in, simdutf_vec(0b0000111111000000));
    +        // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000]
    +        const uint16x8_t s1s = vshlq_n_u16(s1, 2);
    +        // [00bb|bbbb|0000|aaaa]
    +        const uint16x8_t s2 = vorrq_u16(s0, s1s);
    +        // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa]
    +        const uint16x8_t s3 = vorrq_u16(s2, simdutf_vec(0b1100000011100000));
    +        const uint16x8_t v_07ff = vmovq_n_u16((uint16_t)0x07FF);
    +        const uint16x8_t one_or_two_bytes_bytemask = vcleq_u16(in, v_07ff);
    +        const uint16x8_t m0 = vbicq_u16(simdutf_vec(0b0100000000000000), one_or_two_bytes_bytemask);
    +        const uint16x8_t s4 = veorq_u16(s3, m0);
    +#undef simdutf_vec
    +
    +        // 4. expand code units 16-bit => 32-bit
    +        const uint8x16_t out0 = vreinterpretq_u8_u16(vzip1q_u16(t2, s4));
    +        const uint8x16_t out1 = vreinterpretq_u8_u16(vzip2q_u16(t2, s4));
    +
    +        // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
    +        const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
    +        const uint16x8_t one_byte_bytemask = vcleq_u16(in, v_007f);
    +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    +        const uint16x8_t onemask = simdutf_make_uint16x8_t(0x0001, 0x0004,
    +                                    0x0010, 0x0040,
    +                                    0x0100, 0x0400,
    +                                    0x1000, 0x4000 );
    +        const uint16x8_t twomask = simdutf_make_uint16x8_t(0x0002, 0x0008,
    +                                    0x0020, 0x0080,
    +                                    0x0200, 0x0800,
    +                                    0x2000, 0x8000 );
    +#else
    +        const uint16x8_t onemask = { 0x0001, 0x0004,
    +                                    0x0010, 0x0040,
    +                                    0x0100, 0x0400,
    +                                    0x1000, 0x4000 };
    +        const uint16x8_t twomask = { 0x0002, 0x0008,
    +                                    0x0020, 0x0080,
    +                                    0x0200, 0x0800,
    +                                    0x2000, 0x8000 };
    +#endif
    +        const uint16x8_t combined = vorrq_u16(vandq_u16(one_byte_bytemask, onemask), vandq_u16(one_or_two_bytes_bytemask, twomask));
    +        const uint16_t mask = vaddvq_u16(combined);
    +        // The following fast path may or may not be beneficial.
    +        /*if(mask == 0) {
    +          // We only have three-byte code units. Use fast path.
    +          const uint8x16_t shuffle = {2,3,1,6,7,5,10,11,9,14,15,13,0,0,0,0};
    +          const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle);
    +          const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle);
    +          vst1q_u8(utf8_output, utf8_0);
    +          utf8_output += 12;
    +          vst1q_u8(utf8_output, utf8_1);
    +          utf8_output += 12;
    +          buf += 8;
    +          continue;
    +        }*/
    +        const uint8_t mask0 = uint8_t(mask);
    +
    +        const uint8_t* row0 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0];
    +        const uint8x16_t shuffle0 = vld1q_u8(row0 + 1);
    +        const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle0);
    +
    +        const uint8_t mask1 = static_cast(mask >> 8);
    +        const uint8_t* row1 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0];
    +        const uint8x16_t shuffle1 = vld1q_u8(row1 + 1);
    +        const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle1);
    +
    +        vst1q_u8(utf8_output, utf8_0);
    +        utf8_output += row0[0];
    +        vst1q_u8(utf8_output, utf8_1);
    +        utf8_output += row1[0];
    +
    +        buf += 8;
    +    // surrogate pair(s) in a register
         } else {
    -      size_t forward = 3;
    +      // Let us do a scalar fallback.
    +      // It may seem wasteful to use scalar code, but being efficient with SIMD
    +      // in the presence of surrogate pairs may require non-trivial tables.
    +      size_t forward = 15;
           size_t k = 0;
           if(size_t(end - buf) < forward + 1) { forward = size_t(end - buf - 1);}
           for(; k < forward; k++) {
    -        uint32_t word = buf[k];
    -        if((word & 0xFFFF0000)==0) {
    -          // will not generate a surrogate pair
    -          if (word >= 0xD800 && word <= 0xDFFF) { return std::make_pair(result(error_code::SURROGATE, buf - start + k), reinterpret_cast(utf16_output)); }
    -          *utf16_output++ = !match_system(big_endian) ? char16_t(word >> 8 | word << 8) : char16_t(word);
    +        uint16_t word = !match_system(big_endian) ? scalar::utf16::swap_bytes(buf[k]) : buf[k];
    +        if((word & 0xFF80)==0) {
    +          *utf8_output++ = char(word);
    +        } else if((word & 0xF800)==0) {
    +          *utf8_output++ = char((word>>6) | 0b11000000);
    +          *utf8_output++ = char((word & 0b111111) | 0b10000000);
    +        } else if((word &0xF800 ) != 0xD800) {
    +          *utf8_output++ = char((word>>12) | 0b11100000);
    +          *utf8_output++ = char(((word>>6) & 0b111111) | 0b10000000);
    +          *utf8_output++ = char((word & 0b111111) | 0b10000000);
             } else {
    -          // will generate a surrogate pair
    -          if (word > 0x10FFFF) { return std::make_pair(result(error_code::TOO_LARGE, buf - start + k), reinterpret_cast(utf16_output)); }
    -          word -= 0x10000;
    -          uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10));
    -          uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF));
    -          if (!match_system(big_endian)) {
    -            high_surrogate = uint16_t(high_surrogate >> 8 | high_surrogate << 8);
    -            low_surrogate = uint16_t(low_surrogate << 8 | low_surrogate >> 8);
    -          }
    -          *utf16_output++ = char16_t(high_surrogate);
    -          *utf16_output++ = char16_t(low_surrogate);
    +          // must be a surrogate pair
    +          uint16_t diff = uint16_t(word - 0xD800);
    +          uint16_t next_word = !match_system(big_endian) ? scalar::utf16::swap_bytes(buf[k + 1]) : buf[k + 1];
    +          k++;
    +          uint16_t diff2 = uint16_t(next_word - 0xDC00);
    +          if((diff | diff2) > 0x3FF)  { return std::make_pair(result(error_code::SURROGATE, buf - start + k - 1), reinterpret_cast(utf8_output)); }
    +          uint32_t value = (diff << 10) + diff2 + 0x10000;
    +          *utf8_output++ = char((value>>18) | 0b11110000);
    +          *utf8_output++ = char(((value>>12) & 0b111111) | 0b10000000);
    +          *utf8_output++ = char(((value>>6) & 0b111111) | 0b10000000);
    +          *utf8_output++ = char((value & 0b111111) | 0b10000000);
             }
           }
           buf += k;
         }
    -  }
    +  } // while
     
    -  return std::make_pair(result(error_code::SUCCESS, buf - start), reinterpret_cast(utf16_output));
    +  return std::make_pair(result(error_code::SUCCESS, buf - start), reinterpret_cast(utf8_output));
     }
    -/* end file src/arm64/arm_convert_utf32_to_utf16.cpp */
    -} // unnamed namespace
    -} // namespace arm64
    -} // namespace simdutf
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/buf_block_reader.h
    -/* begin file src/generic/buf_block_reader.h */
    -namespace simdutf {
    -namespace arm64 {
    -namespace {
    +/* end file src/arm64/arm_convert_utf16_to_utf8.cpp */
    +/* begin file src/arm64/arm_convert_utf16_to_utf32.cpp */
    +/*
    +    The vectorized algorithm works on single SSE register i.e., it
    +    loads eight 16-bit code units.
     
    -// Walks through a buffer in block-sized increments, loading the last part with spaces
    -template
    -struct buf_block_reader {
    -public:
    -  simdutf_really_inline buf_block_reader(const uint8_t *_buf, size_t _len);
    -  simdutf_really_inline size_t block_index();
    -  simdutf_really_inline bool has_full_block() const;
    -  simdutf_really_inline const uint8_t *full_block() const;
    -  /**
    -   * Get the last block, padded with spaces.
    -   *
    -   * There will always be a last block, with at least 1 byte, unless len == 0 (in which case this
    -   * function fills the buffer with spaces and returns 0. In particular, if len == STEP_SIZE there
    -   * will be 0 full_blocks and 1 remainder block with STEP_SIZE bytes and no spaces for padding.
    -   *
    -   * @return the number of effective characters in the last block.
    -   */
    -  simdutf_really_inline size_t get_remainder(uint8_t *dst) const;
    -  simdutf_really_inline void advance();
    -private:
    -  const uint8_t *buf;
    -  const size_t len;
    -  const size_t lenminusstep;
    -  size_t idx;
    -};
    +    We consider three cases:
    +    1. an input register contains no surrogates and each value
    +       is in range 0x0000 .. 0x07ff.
    +    2. an input register contains no surrogates and values are
    +       is in range 0x0000 .. 0xffff.
    +    3. an input register contains surrogates --- i.e. codepoints
    +       can have 16 or 32 bits.
     
    -// Routines to print masks and text for debugging bitmask operations
    -simdutf_unused static char * format_input_text_64(const uint8_t *text) {
    -  static char *buf = reinterpret_cast(malloc(sizeof(simd8x64) + 1));
    -  for (size_t i=0; i); i++) {
    -    buf[i] = int8_t(text[i]) < ' ' ? '_' : int8_t(text[i]);
    -  }
    -  buf[sizeof(simd8x64)] = '\0';
    -  return buf;
    -}
    +    Ad 1.
     
    -// Routines to print masks and text for debugging bitmask operations
    -simdutf_unused static char * format_input_text(const simd8x64& in) {
    -  static char *buf = reinterpret_cast(malloc(sizeof(simd8x64) + 1));
    -  in.store(reinterpret_cast(buf));
    -  for (size_t i=0; i); i++) {
    -    if (buf[i] < ' ') { buf[i] = '_'; }
    -  }
    -  buf[sizeof(simd8x64)] = '\0';
    -  return buf;
    -}
    +    When values are less than 0x0800, it means that a 16-bit code unit
    +    can be converted into: 1) single UTF8 byte (when it's an ASCII
    +    char) or 2) two UTF8 bytes.
     
    -simdutf_unused static char * format_mask(uint64_t mask) {
    -  static char *buf = reinterpret_cast(malloc(64 + 1));
    -  for (size_t i=0; i<64; i++) {
    -    buf[i] = (mask & (size_t(1) << i)) ? 'X' : ' ';
    -  }
    -  buf[64] = '\0';
    -  return buf;
    -}
    +    For this case we do only some shuffle to obtain these 2-byte
    +    codes and finally compress the whole SSE register with a single
    +    shuffle.
     
    -template
    -simdutf_really_inline buf_block_reader::buf_block_reader(const uint8_t *_buf, size_t _len) : buf{_buf}, len{_len}, lenminusstep{len < STEP_SIZE ? 0 : len - STEP_SIZE}, idx{0} {}
    +    We need 256-entry lookup table to get a compression pattern
    +    and the number of output bytes in the compressed vector register.
    +    Each entry occupies 17 bytes.
     
    -template
    -simdutf_really_inline size_t buf_block_reader::block_index() { return idx; }
    +    Ad 2.
     
    -template
    -simdutf_really_inline bool buf_block_reader::has_full_block() const {
    -  return idx < lenminusstep;
    -}
    +    When values fit in 16-bit code units, but are above 0x07ff, then
    +    a single word may produce one, two or three UTF8 bytes.
     
    -template
    -simdutf_really_inline const uint8_t *buf_block_reader::full_block() const {
    +    We prepare data for all these three cases in two registers.
    +    The first register contains lower two UTF8 bytes (used in all
    +    cases), while the second one contains just the third byte for
    +    the three-UTF8-bytes case.
    +
    +    Finally these two registers are interleaved forming eight-element
    +    array of 32-bit values. The array spans two SSE registers.
    +    The bytes from the registers are compressed using two shuffles.
    +
    +    We need 256-entry lookup table to get a compression pattern
    +    and the number of output bytes in the compressed vector register.
    +    Each entry occupies 17 bytes.
    +
    +
    +    To summarize:
    +    - We need two 256-entry tables that have 8704 bytes in total.
    +*/
    +/*
    +  Returns a pair: the first unprocessed byte from buf and utf8_output
    +  A scalar routing should carry on the conversion of the tail.
    +*/
    +template 
    +std::pair arm_convert_utf16_to_utf32(const char16_t* buf, size_t len, char32_t* utf32_out) {
    +  uint32_t * utf32_output = reinterpret_cast(utf32_out);
    +  const char16_t* end = buf + len;
    +
    +  const uint16x8_t v_f800 = vmovq_n_u16((uint16_t)0xf800);
    +  const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800);
    +
    +  while (buf + 8 <= end) {
    +    uint16x8_t in = vld1q_u16(reinterpret_cast(buf));
    +    if (!match_system(big_endian)) { in = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in))); }
    +
    +    const uint16x8_t surrogates_bytemask = vceqq_u16(vandq_u16(in, v_f800), v_d800);
    +    // It might seem like checking for surrogates_bitmask == 0xc000 could help. However,
    +    // it is likely an uncommon occurrence.
    +    if (vmaxvq_u16(surrogates_bytemask) == 0) {
    +      // case: no surrogate pairs, extend all 16-bit code units to 32-bit code units
    +      vst1q_u32(utf32_output,  vmovl_u16(vget_low_u16(in)));
    +      vst1q_u32(utf32_output+4,  vmovl_high_u16(in));
    +      utf32_output += 8;
    +      buf += 8;
    +    // surrogate pair(s) in a register
    +    } else {
    +      // Let us do a scalar fallback.
    +      // It may seem wasteful to use scalar code, but being efficient with SIMD
    +      // in the presence of surrogate pairs may require non-trivial tables.
    +      size_t forward = 15;
    +      size_t k = 0;
    +      if(size_t(end - buf) < forward + 1) { forward = size_t(end - buf - 1);}
    +      for(; k < forward; k++) {
    +        uint16_t word = !match_system(big_endian) ? scalar::utf16::swap_bytes(buf[k]) : buf[k];
    +        if((word &0xF800 ) != 0xD800) {
    +          *utf32_output++ = char32_t(word);
    +        } else {
    +          // must be a surrogate pair
    +          uint16_t diff = uint16_t(word - 0xD800);
    +          uint16_t next_word = !match_system(big_endian) ? scalar::utf16::swap_bytes(buf[k + 1]) : buf[k + 1];
    +          k++;
    +          uint16_t diff2 = uint16_t(next_word - 0xDC00);
    +          if((diff | diff2) > 0x3FF)  { return std::make_pair(nullptr, reinterpret_cast(utf32_output)); }
    +          uint32_t value = (diff << 10) + diff2 + 0x10000;
    +          *utf32_output++ = char32_t(value);
    +        }
    +      }
    +      buf += k;
    +    }
    +  } // while
    +  return std::make_pair(buf, reinterpret_cast(utf32_output));
    +}
    +
    +
    +/*
    +  Returns a pair: a result struct and utf8_output.
    +  If there is an error, the count field of the result is the position of the error.
    +  Otherwise, it is the position of the first unprocessed byte in buf (even if finished).
    +  A scalar routing should carry on the conversion of the tail if needed.
    +*/
    +template 
    +std::pair arm_convert_utf16_to_utf32_with_errors(const char16_t* buf, size_t len, char32_t* utf32_out) {
    +  uint32_t * utf32_output = reinterpret_cast(utf32_out);
    +  const char16_t* start = buf;
    +  const char16_t* end = buf + len;
    +
    +  const uint16x8_t v_f800 = vmovq_n_u16((uint16_t)0xf800);
    +  const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800);
    +
    +  while (buf + 8 <= end) {
    +    uint16x8_t in = vld1q_u16(reinterpret_cast(buf));
    +    if (!match_system(big_endian)) { in = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in))); }
    +
    +    const uint16x8_t surrogates_bytemask = vceqq_u16(vandq_u16(in, v_f800), v_d800);
    +    // It might seem like checking for surrogates_bitmask == 0xc000 could help. However,
    +    // it is likely an uncommon occurrence.
    +    if (vmaxvq_u16(surrogates_bytemask) == 0) {
    +      // case: no surrogate pairs, extend all 16-bit code units to 32-bit code units
    +      vst1q_u32(utf32_output,  vmovl_u16(vget_low_u16(in)));
    +      vst1q_u32(utf32_output+4,  vmovl_high_u16(in));
    +      utf32_output += 8;
    +      buf += 8;
    +    // surrogate pair(s) in a register
    +    } else {
    +      // Let us do a scalar fallback.
    +      // It may seem wasteful to use scalar code, but being efficient with SIMD
    +      // in the presence of surrogate pairs may require non-trivial tables.
    +      size_t forward = 15;
    +      size_t k = 0;
    +      if(size_t(end - buf) < forward + 1) { forward = size_t(end - buf - 1);}
    +      for(; k < forward; k++) {
    +        uint16_t word = !match_system(big_endian) ? scalar::utf16::swap_bytes(buf[k]) : buf[k];
    +        if((word &0xF800 ) != 0xD800) {
    +          *utf32_output++ = char32_t(word);
    +        } else {
    +          // must be a surrogate pair
    +          uint16_t diff = uint16_t(word - 0xD800);
    +          uint16_t next_word = !match_system(big_endian) ? scalar::utf16::swap_bytes(buf[k + 1]) : buf[k + 1];
    +          k++;
    +          uint16_t diff2 = uint16_t(next_word - 0xDC00);
    +          if((diff | diff2) > 0x3FF)  { return std::make_pair(result(error_code::SURROGATE, buf - start + k - 1), reinterpret_cast(utf32_output)); }
    +          uint32_t value = (diff << 10) + diff2 + 0x10000;
    +          *utf32_output++ = char32_t(value);
    +        }
    +      }
    +      buf += k;
    +    }
    +  } // while
    +  return std::make_pair(result(error_code::SUCCESS, buf - start), reinterpret_cast(utf32_output));
    +}
    +/* end file src/arm64/arm_convert_utf16_to_utf32.cpp */
    +
    +/* begin file src/arm64/arm_convert_utf32_to_latin1.cpp */
    +std::pair arm_convert_utf32_to_latin1(const char32_t* buf, size_t len, char* latin1_output) {
    +  const char32_t* end = buf + len;
    +  while (buf + 8 <= end) {
    +    uint32x4_t in1 = vld1q_u32(reinterpret_cast(buf));
    +    uint32x4_t in2 = vld1q_u32(reinterpret_cast(buf+4));
    +
    +    uint16x8_t utf16_packed = vcombine_u16(vqmovn_u32(in1), vqmovn_u32(in2));
    +    if (vmaxvq_u16(utf16_packed) <= 0xff) {
    +        // 1. pack the bytes
    +        uint8x8_t latin1_packed = vmovn_u16(utf16_packed);
    +        // 2. store (8 bytes)
    +        vst1_u8(reinterpret_cast(latin1_output), latin1_packed);
    +        // 3. adjust pointers
    +        buf += 8;
    +        latin1_output += 8;
    +    } else {
    +      return std::make_pair(nullptr, reinterpret_cast(latin1_output));
    +    }
    +  } // while
    +  return std::make_pair(buf, latin1_output);
    +}
    +
    +
    +std::pair arm_convert_utf32_to_latin1_with_errors(const char32_t* buf, size_t len, char* latin1_output) {
    +  const char32_t* start = buf;
    +  const char32_t* end = buf + len;
    +
    +  while (buf + 8 <= end) {
    +    uint32x4_t in1 = vld1q_u32(reinterpret_cast(buf));
    +    uint32x4_t in2 = vld1q_u32(reinterpret_cast(buf+4));
    +
    +    uint16x8_t utf16_packed = vcombine_u16(vqmovn_u32(in1), vqmovn_u32(in2));
    +
    +    if (vmaxvq_u16(utf16_packed) <= 0xff) {
    +        // 1. pack the bytes
    +        uint8x8_t latin1_packed = vmovn_u16(utf16_packed);
    +        // 2. store (8 bytes)
    +        vst1_u8(reinterpret_cast(latin1_output), latin1_packed);
    +        // 3. adjust pointers
    +        buf += 8;
    +        latin1_output += 8;
    +    } else {
    +      // Let us do a scalar fallback.
    +      for(int k = 0; k < 8; k++) {
    +        uint32_t word = buf[k];
    +        if(word <= 0xff) {
    +          *latin1_output++ = char(word);
    +        } else {
    +          return std::make_pair(result(error_code::TOO_LARGE, buf - start + k), latin1_output);
    +        }
    +      }
    +    }
    +  } // while
    +  return std::make_pair(result(error_code::SUCCESS, buf - start), latin1_output);
    +}
    +/* end file src/arm64/arm_convert_utf32_to_latin1.cpp */
    +/* begin file src/arm64/arm_convert_utf32_to_utf8.cpp */
    +std::pair arm_convert_utf32_to_utf8(const char32_t* buf, size_t len, char* utf8_out) {
    +  uint8_t * utf8_output = reinterpret_cast(utf8_out);
    +  const char32_t* end = buf + len;
    +
    +  const uint16x8_t v_c080 = vmovq_n_u16((uint16_t)0xc080);
    +
    +  uint16x8_t forbidden_bytemask = vmovq_n_u16(0x0);
    +
    +  while (buf + 8 < end) {
    +    uint32x4_t in = vld1q_u32(reinterpret_cast(buf));
    +    uint32x4_t nextin = vld1q_u32(reinterpret_cast(buf+4));
    +
    +    // Check if no bits set above 16th
    +    if(vmaxvq_u32(vorrq_u32(in, nextin)) <= 0xFFFF) {
    +      // Pack UTF-32 to UTF-16 safely (without surrogate pairs)
    +      // Apply UTF-16 => UTF-8 routine (arm_convert_utf16_to_utf8.cpp)
    +      uint16x8_t utf16_packed = vcombine_u16(vmovn_u32(in), vmovn_u32(nextin));
    +      if(vmaxvq_u16(utf16_packed) <= 0x7F) { // ASCII fast path!!!!
    +        // 1. pack the bytes
    +        // obviously suboptimal.
    +        uint8x8_t utf8_packed = vmovn_u16(utf16_packed);
    +        // 2. store (8 bytes)
    +        vst1_u8(utf8_output, utf8_packed);
    +        // 3. adjust pointers
    +        buf += 8;
    +        utf8_output += 8;
    +        continue; // we are done for this round!
    +      }
    +
    +      if (vmaxvq_u16(utf16_packed) <= 0x7FF) {
    +        // 1. prepare 2-byte values
    +        // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
    +        // expected output   : [110a|aaaa|10bb|bbbb] x 8
    +        const uint16x8_t v_1f00 = vmovq_n_u16((int16_t)0x1f00);
    +        const uint16x8_t v_003f = vmovq_n_u16((int16_t)0x003f);
    +
    +        // t0 = [000a|aaaa|bbbb|bb00]
    +        const uint16x8_t t0 = vshlq_n_u16(utf16_packed, 2);
    +        // t1 = [000a|aaaa|0000|0000]
    +        const uint16x8_t t1 = vandq_u16(t0, v_1f00);
    +        // t2 = [0000|0000|00bb|bbbb]
    +        const uint16x8_t t2 = vandq_u16(utf16_packed, v_003f);
    +        // t3 = [000a|aaaa|00bb|bbbb]
    +        const uint16x8_t t3 = vorrq_u16(t1, t2);
    +        // t4 = [110a|aaaa|10bb|bbbb]
    +        const uint16x8_t t4 = vorrq_u16(t3, v_c080);
    +        // 2. merge ASCII and 2-byte codewords
    +        const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
    +        const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f);
    +        const uint8x16_t utf8_unpacked = vreinterpretq_u8_u16(vbslq_u16(one_byte_bytemask, utf16_packed, t4));
    +        // 3. prepare bitmask for 8-bit lookup
    +  #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    +        const uint16x8_t mask = simdutf_make_uint16x8_t(0x0001, 0x0004,
    +                                  0x0010, 0x0040,
    +                                  0x0002, 0x0008,
    +                                  0x0020, 0x0080);
    +  #else
    +        const uint16x8_t mask = { 0x0001, 0x0004,
    +                                  0x0010, 0x0040,
    +                                  0x0002, 0x0008,
    +                                  0x0020, 0x0080 };
    +  #endif
    +        uint16_t m2 = vaddvq_u16(vandq_u16(one_byte_bytemask, mask));
    +        // 4. pack the bytes
    +        const uint8_t* row = &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0];
    +        const uint8x16_t shuffle = vld1q_u8(row + 1);
    +        const uint8x16_t utf8_packed = vqtbl1q_u8(utf8_unpacked, shuffle);
    +
    +        // 5. store bytes
    +        vst1q_u8(utf8_output, utf8_packed);
    +
    +        // 6. adjust pointers
    +        buf += 8;
    +        utf8_output += row[0];
    +        continue;
    +      } else {
    +        // case: code units from register produce either 1, 2 or 3 UTF-8 bytes
    +        const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800);
    +        const uint16x8_t v_dfff = vmovq_n_u16((uint16_t)0xdfff);
    +        forbidden_bytemask = vorrq_u16(vandq_u16(vcleq_u16(utf16_packed, v_dfff), vcgeq_u16(utf16_packed, v_d800)), forbidden_bytemask);
    +
    +  #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    +          const uint16x8_t dup_even = simdutf_make_uint16x8_t(0x0000, 0x0202, 0x0404, 0x0606,
    +                                      0x0808, 0x0a0a, 0x0c0c, 0x0e0e);
    +  #else
    +          const uint16x8_t dup_even = {0x0000, 0x0202, 0x0404, 0x0606,
    +                                      0x0808, 0x0a0a, 0x0c0c, 0x0e0e};
    +  #endif
    +          /* In this branch we handle three cases:
    +            1. [0000|0000|0ccc|cccc] => [0ccc|cccc]                           - single UFT-8 byte
    +            2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc]              - two UTF-8 bytes
    +            3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three UTF-8 bytes
    +
    +            We expand the input word (16-bit) into two code units (32-bit), thus
    +            we have room for four bytes. However, we need five distinct bit
    +            layouts. Note that the last byte in cases #2 and #3 is the same.
    +
    +            We precompute byte 1 for case #1 and the common byte for cases #2 & #3
    +            in register t2.
    +
    +            We precompute byte 1 for case #3 and -- **conditionally** -- precompute
    +            either byte 1 for case #2 or byte 2 for case #3. Note that they
    +            differ by exactly one bit.
    +
    +            Finally from these two code units we build proper UTF-8 sequence, taking
    +            into account the case (i.e, the number of bytes to write).
    +          */
    +          /**
    +           * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce:
    +           * t2 => [0ccc|cccc] [10cc|cccc]
    +           * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb])
    +           */
    +  #define simdutf_vec(x) vmovq_n_u16(static_cast(x))
    +          // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc]
    +          const uint16x8_t t0 = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(utf16_packed), vreinterpretq_u8_u16(dup_even)));
    +          // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc]
    +          const uint16x8_t t1 = vandq_u16(t0, simdutf_vec(0b0011111101111111));
    +          // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc]
    +          const uint16x8_t t2 = vorrq_u16 (t1, simdutf_vec(0b1000000000000000));
    +
    +          // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa]
    +          const uint16x8_t s0 = vshrq_n_u16(utf16_packed, 12);
    +          // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000]
    +          const uint16x8_t s1 = vandq_u16(utf16_packed, simdutf_vec(0b0000111111000000));
    +          // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000]
    +          const uint16x8_t s1s = vshlq_n_u16(s1, 2);
    +          // [00bb|bbbb|0000|aaaa]
    +          const uint16x8_t s2 = vorrq_u16(s0, s1s);
    +          // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa]
    +          const uint16x8_t s3 = vorrq_u16(s2, simdutf_vec(0b1100000011100000));
    +          const uint16x8_t v_07ff = vmovq_n_u16((uint16_t)0x07FF);
    +          const uint16x8_t one_or_two_bytes_bytemask = vcleq_u16(utf16_packed, v_07ff);
    +          const uint16x8_t m0 = vbicq_u16(simdutf_vec(0b0100000000000000), one_or_two_bytes_bytemask);
    +          const uint16x8_t s4 = veorq_u16(s3, m0);
    +  #undef simdutf_vec
    +
    +          // 4. expand code units 16-bit => 32-bit
    +          const uint8x16_t out0 = vreinterpretq_u8_u16(vzip1q_u16(t2, s4));
    +          const uint8x16_t out1 = vreinterpretq_u8_u16(vzip2q_u16(t2, s4));
    +
    +          // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
    +          const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
    +          const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f);
    +  #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    +          const uint16x8_t onemask = simdutf_make_uint16x8_t(0x0001, 0x0004,
    +                                      0x0010, 0x0040,
    +                                      0x0100, 0x0400,
    +                                      0x1000, 0x4000 );
    +          const uint16x8_t twomask = simdutf_make_uint16x8_t(0x0002, 0x0008,
    +                                      0x0020, 0x0080,
    +                                      0x0200, 0x0800,
    +                                      0x2000, 0x8000 );
    +  #else
    +          const uint16x8_t onemask = { 0x0001, 0x0004,
    +                                      0x0010, 0x0040,
    +                                      0x0100, 0x0400,
    +                                      0x1000, 0x4000 };
    +          const uint16x8_t twomask = { 0x0002, 0x0008,
    +                                      0x0020, 0x0080,
    +                                      0x0200, 0x0800,
    +                                      0x2000, 0x8000 };
    +  #endif
    +          const uint16x8_t combined = vorrq_u16(vandq_u16(one_byte_bytemask, onemask), vandq_u16(one_or_two_bytes_bytemask, twomask));
    +          const uint16_t mask = vaddvq_u16(combined);
    +          // The following fast path may or may not be beneficial.
    +          /*if(mask == 0) {
    +            // We only have three-byte code units. Use fast path.
    +            const uint8x16_t shuffle = {2,3,1,6,7,5,10,11,9,14,15,13,0,0,0,0};
    +            const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle);
    +            const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle);
    +            vst1q_u8(utf8_output, utf8_0);
    +            utf8_output += 12;
    +            vst1q_u8(utf8_output, utf8_1);
    +            utf8_output += 12;
    +            buf += 8;
    +            continue;
    +          }*/
    +          const uint8_t mask0 = uint8_t(mask);
    +          const uint8_t* row0 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0];
    +          const uint8x16_t shuffle0 = vld1q_u8(row0 + 1);
    +          const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle0);
    +
    +          const uint8_t mask1 = static_cast(mask >> 8);
    +          const uint8_t* row1 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0];
    +          const uint8x16_t shuffle1 = vld1q_u8(row1 + 1);
    +          const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle1);
    +
    +          vst1q_u8(utf8_output, utf8_0);
    +          utf8_output += row0[0];
    +          vst1q_u8(utf8_output, utf8_1);
    +          utf8_output += row1[0];
    +
    +          buf += 8;
    +      }
    +    // At least one 32-bit word will produce a surrogate pair in UTF-16 <=> will produce four UTF-8 bytes.
    +    } else {
    +      // Let us do a scalar fallback.
    +      // It may seem wasteful to use scalar code, but being efficient with SIMD
    +      // in the presence of surrogate pairs may require non-trivial tables.
    +      size_t forward = 15;
    +      size_t k = 0;
    +      if(size_t(end - buf) < forward + 1) { forward = size_t(end - buf - 1);}
    +      for(; k < forward; k++) {
    +        uint32_t word = buf[k];
    +        if((word & 0xFFFFFF80)==0) {
    +          *utf8_output++ = char(word);
    +        } else if((word & 0xFFFFF800)==0) {
    +          *utf8_output++ = char((word>>6) | 0b11000000);
    +          *utf8_output++ = char((word & 0b111111) | 0b10000000);
    +        } else if((word & 0xFFFF0000)==0) {
    +          if (word >= 0xD800 && word <= 0xDFFF) { return std::make_pair(nullptr, reinterpret_cast(utf8_output)); }
    +          *utf8_output++ = char((word>>12) | 0b11100000);
    +          *utf8_output++ = char(((word>>6) & 0b111111) | 0b10000000);
    +          *utf8_output++ = char((word & 0b111111) | 0b10000000);
    +        } else {
    +          if (word > 0x10FFFF) { return std::make_pair(nullptr, reinterpret_cast(utf8_output)); }
    +          *utf8_output++ = char((word>>18) | 0b11110000);
    +          *utf8_output++ = char(((word>>12) & 0b111111) | 0b10000000);
    +          *utf8_output++ = char(((word>>6) & 0b111111) | 0b10000000);
    +          *utf8_output++ = char((word & 0b111111) | 0b10000000);
    +        }
    +      }
    +      buf += k;
    +    }
    +  } // while
    +
    +  // check for invalid input
    +  if (vmaxvq_u16(forbidden_bytemask) != 0) {
    +    return std::make_pair(nullptr, reinterpret_cast(utf8_output));
    +  }
    +  return std::make_pair(buf, reinterpret_cast(utf8_output));
    +}
    +
    +
    +std::pair arm_convert_utf32_to_utf8_with_errors(const char32_t* buf, size_t len, char* utf8_out) {
    +  uint8_t * utf8_output = reinterpret_cast(utf8_out);
    +  const char32_t* start = buf;
    +  const char32_t* end = buf + len;
    +
    +  const uint16x8_t v_c080 = vmovq_n_u16((uint16_t)0xc080);
    +
    +  while (buf + 8 < end) {
    +    uint32x4_t in = vld1q_u32(reinterpret_cast(buf));
    +    uint32x4_t nextin = vld1q_u32(reinterpret_cast(buf+4));
    +
    +    // Check if no bits set above 16th
    +    if(vmaxvq_u32(vorrq_u32(in, nextin)) <= 0xFFFF) {
    +      // Pack UTF-32 to UTF-16 safely (without surrogate pairs)
    +      // Apply UTF-16 => UTF-8 routine (arm_convert_utf16_to_utf8.cpp)
    +      uint16x8_t utf16_packed = vcombine_u16(vmovn_u32(in), vmovn_u32(nextin));
    +      if(vmaxvq_u16(utf16_packed) <= 0x7F) { // ASCII fast path!!!!
    +          // 1. pack the bytes
    +          // obviously suboptimal.
    +          uint8x8_t utf8_packed = vmovn_u16(utf16_packed);
    +          // 2. store (8 bytes)
    +          vst1_u8(utf8_output, utf8_packed);
    +          // 3. adjust pointers
    +          buf += 8;
    +          utf8_output += 8;
    +          continue; // we are done for this round!
    +      }
    +
    +      if (vmaxvq_u16(utf16_packed) <= 0x7FF) {
    +        // 1. prepare 2-byte values
    +        // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
    +        // expected output   : [110a|aaaa|10bb|bbbb] x 8
    +        const uint16x8_t v_1f00 = vmovq_n_u16((int16_t)0x1f00);
    +        const uint16x8_t v_003f = vmovq_n_u16((int16_t)0x003f);
    +
    +        // t0 = [000a|aaaa|bbbb|bb00]
    +        const uint16x8_t t0 = vshlq_n_u16(utf16_packed, 2);
    +        // t1 = [000a|aaaa|0000|0000]
    +        const uint16x8_t t1 = vandq_u16(t0, v_1f00);
    +        // t2 = [0000|0000|00bb|bbbb]
    +        const uint16x8_t t2 = vandq_u16(utf16_packed, v_003f);
    +        // t3 = [000a|aaaa|00bb|bbbb]
    +        const uint16x8_t t3 = vorrq_u16(t1, t2);
    +        // t4 = [110a|aaaa|10bb|bbbb]
    +        const uint16x8_t t4 = vorrq_u16(t3, v_c080);
    +        // 2. merge ASCII and 2-byte codewords
    +        const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
    +        const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f);
    +        const uint8x16_t utf8_unpacked = vreinterpretq_u8_u16(vbslq_u16(one_byte_bytemask, utf16_packed, t4));
    +        // 3. prepare bitmask for 8-bit lookup
    +  #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    +        const uint16x8_t mask = simdutf_make_uint16x8_t(0x0001, 0x0004,
    +                                  0x0010, 0x0040,
    +                                  0x0002, 0x0008,
    +                                  0x0020, 0x0080);
    +  #else
    +        const uint16x8_t mask = { 0x0001, 0x0004,
    +                                  0x0010, 0x0040,
    +                                  0x0002, 0x0008,
    +                                  0x0020, 0x0080 };
    +  #endif
    +        uint16_t m2 = vaddvq_u16(vandq_u16(one_byte_bytemask, mask));
    +        // 4. pack the bytes
    +        const uint8_t* row = &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0];
    +        const uint8x16_t shuffle = vld1q_u8(row + 1);
    +        const uint8x16_t utf8_packed = vqtbl1q_u8(utf8_unpacked, shuffle);
    +
    +        // 5. store bytes
    +        vst1q_u8(utf8_output, utf8_packed);
    +
    +        // 6. adjust pointers
    +        buf += 8;
    +        utf8_output += row[0];
    +        continue;
    +      } else {
    +        // case: code units from register produce either 1, 2 or 3 UTF-8 bytes
    +
    +        // check for invalid input
    +        const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800);
    +        const uint16x8_t v_dfff = vmovq_n_u16((uint16_t)0xdfff);
    +        const uint16x8_t forbidden_bytemask = vandq_u16(vcleq_u16(utf16_packed, v_dfff), vcgeq_u16(utf16_packed, v_d800));
    +        if (vmaxvq_u16(forbidden_bytemask) != 0) {
    +          return std::make_pair(result(error_code::SURROGATE, buf - start), reinterpret_cast(utf8_output));
    +        }
    +
    +  #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    +          const uint16x8_t dup_even = simdutf_make_uint16x8_t(0x0000, 0x0202, 0x0404, 0x0606,
    +                                      0x0808, 0x0a0a, 0x0c0c, 0x0e0e);
    +  #else
    +          const uint16x8_t dup_even = {0x0000, 0x0202, 0x0404, 0x0606,
    +                                      0x0808, 0x0a0a, 0x0c0c, 0x0e0e};
    +  #endif
    +          /* In this branch we handle three cases:
    +            1. [0000|0000|0ccc|cccc] => [0ccc|cccc]                           - single UFT-8 byte
    +            2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc]              - two UTF-8 bytes
    +            3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three UTF-8 bytes
    +
    +            We expand the input word (16-bit) into two code units (32-bit), thus
    +            we have room for four bytes. However, we need five distinct bit
    +            layouts. Note that the last byte in cases #2 and #3 is the same.
    +
    +            We precompute byte 1 for case #1 and the common byte for cases #2 & #3
    +            in register t2.
    +
    +            We precompute byte 1 for case #3 and -- **conditionally** -- precompute
    +            either byte 1 for case #2 or byte 2 for case #3. Note that they
    +            differ by exactly one bit.
    +
    +            Finally from these two code units we build proper UTF-8 sequence, taking
    +            into account the case (i.e, the number of bytes to write).
    +          */
    +          /**
    +           * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce:
    +           * t2 => [0ccc|cccc] [10cc|cccc]
    +           * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb])
    +           */
    +  #define simdutf_vec(x) vmovq_n_u16(static_cast(x))
    +          // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc]
    +          const uint16x8_t t0 = vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(utf16_packed), vreinterpretq_u8_u16(dup_even)));
    +          // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc]
    +          const uint16x8_t t1 = vandq_u16(t0, simdutf_vec(0b0011111101111111));
    +          // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc]
    +          const uint16x8_t t2 = vorrq_u16 (t1, simdutf_vec(0b1000000000000000));
    +
    +          // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa]
    +          const uint16x8_t s0 = vshrq_n_u16(utf16_packed, 12);
    +          // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000]
    +          const uint16x8_t s1 = vandq_u16(utf16_packed, simdutf_vec(0b0000111111000000));
    +          // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000]
    +          const uint16x8_t s1s = vshlq_n_u16(s1, 2);
    +          // [00bb|bbbb|0000|aaaa]
    +          const uint16x8_t s2 = vorrq_u16(s0, s1s);
    +          // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa]
    +          const uint16x8_t s3 = vorrq_u16(s2, simdutf_vec(0b1100000011100000));
    +          const uint16x8_t v_07ff = vmovq_n_u16((uint16_t)0x07FF);
    +          const uint16x8_t one_or_two_bytes_bytemask = vcleq_u16(utf16_packed, v_07ff);
    +          const uint16x8_t m0 = vbicq_u16(simdutf_vec(0b0100000000000000), one_or_two_bytes_bytemask);
    +          const uint16x8_t s4 = veorq_u16(s3, m0);
    +  #undef simdutf_vec
    +
    +          // 4. expand code units 16-bit => 32-bit
    +          const uint8x16_t out0 = vreinterpretq_u8_u16(vzip1q_u16(t2, s4));
    +          const uint8x16_t out1 = vreinterpretq_u8_u16(vzip2q_u16(t2, s4));
    +
    +          // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
    +          const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
    +          const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f);
    +  #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
    +          const uint16x8_t onemask = simdutf_make_uint16x8_t(0x0001, 0x0004,
    +                                      0x0010, 0x0040,
    +                                      0x0100, 0x0400,
    +                                      0x1000, 0x4000 );
    +          const uint16x8_t twomask = simdutf_make_uint16x8_t(0x0002, 0x0008,
    +                                      0x0020, 0x0080,
    +                                      0x0200, 0x0800,
    +                                      0x2000, 0x8000 );
    +  #else
    +          const uint16x8_t onemask = { 0x0001, 0x0004,
    +                                      0x0010, 0x0040,
    +                                      0x0100, 0x0400,
    +                                      0x1000, 0x4000 };
    +          const uint16x8_t twomask = { 0x0002, 0x0008,
    +                                      0x0020, 0x0080,
    +                                      0x0200, 0x0800,
    +                                      0x2000, 0x8000 };
    +  #endif
    +          const uint16x8_t combined = vorrq_u16(vandq_u16(one_byte_bytemask, onemask), vandq_u16(one_or_two_bytes_bytemask, twomask));
    +          const uint16_t mask = vaddvq_u16(combined);
    +          // The following fast path may or may not be beneficial.
    +          /*if(mask == 0) {
    +            // We only have three-byte code units. Use fast path.
    +            const uint8x16_t shuffle = {2,3,1,6,7,5,10,11,9,14,15,13,0,0,0,0};
    +            const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle);
    +            const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle);
    +            vst1q_u8(utf8_output, utf8_0);
    +            utf8_output += 12;
    +            vst1q_u8(utf8_output, utf8_1);
    +            utf8_output += 12;
    +            buf += 8;
    +            continue;
    +          }*/
    +          const uint8_t mask0 = uint8_t(mask);
    +
    +          const uint8_t* row0 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0];
    +          const uint8x16_t shuffle0 = vld1q_u8(row0 + 1);
    +          const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle0);
    +
    +          const uint8_t mask1 = static_cast(mask >> 8);
    +          const uint8_t* row1 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0];
    +          const uint8x16_t shuffle1 = vld1q_u8(row1 + 1);
    +          const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle1);
    +
    +          vst1q_u8(utf8_output, utf8_0);
    +          utf8_output += row0[0];
    +          vst1q_u8(utf8_output, utf8_1);
    +          utf8_output += row1[0];
    +
    +          buf += 8;
    +      }
    +    // At least one 32-bit word will produce a surrogate pair in UTF-16 <=> will produce four UTF-8 bytes.
    +    } else {
    +      // Let us do a scalar fallback.
    +      // It may seem wasteful to use scalar code, but being efficient with SIMD
    +      // in the presence of surrogate pairs may require non-trivial tables.
    +      size_t forward = 15;
    +      size_t k = 0;
    +      if(size_t(end - buf) < forward + 1) { forward = size_t(end - buf - 1);}
    +      for(; k < forward; k++) {
    +        uint32_t word = buf[k];
    +        if((word & 0xFFFFFF80)==0) {
    +          *utf8_output++ = char(word);
    +        } else if((word & 0xFFFFF800)==0) {
    +          *utf8_output++ = char((word>>6) | 0b11000000);
    +          *utf8_output++ = char((word & 0b111111) | 0b10000000);
    +        } else if((word & 0xFFFF0000)==0) {
    +          if (word >= 0xD800 && word <= 0xDFFF) { return std::make_pair(result(error_code::SURROGATE, buf - start + k), reinterpret_cast(utf8_output)); }
    +          *utf8_output++ = char((word>>12) | 0b11100000);
    +          *utf8_output++ = char(((word>>6) & 0b111111) | 0b10000000);
    +          *utf8_output++ = char((word & 0b111111) | 0b10000000);
    +        } else {
    +          if (word > 0x10FFFF) { return std::make_pair(result(error_code::TOO_LARGE, buf - start + k), reinterpret_cast(utf8_output)); }
    +          *utf8_output++ = char((word>>18) | 0b11110000);
    +          *utf8_output++ = char(((word>>12) & 0b111111) | 0b10000000);
    +          *utf8_output++ = char(((word>>6) & 0b111111) | 0b10000000);
    +          *utf8_output++ = char((word & 0b111111) | 0b10000000);
    +        }
    +      }
    +      buf += k;
    +    }
    +  } // while
    +
    +  return std::make_pair(result(error_code::SUCCESS, buf - start), reinterpret_cast(utf8_output));
    +}
    +/* end file src/arm64/arm_convert_utf32_to_utf8.cpp */
    +/* begin file src/arm64/arm_convert_utf32_to_utf16.cpp */
    +template 
    +std::pair arm_convert_utf32_to_utf16(const char32_t* buf, size_t len, char16_t* utf16_out) {
    +  uint16_t * utf16_output = reinterpret_cast(utf16_out);
    +  const char32_t* end = buf + len;
    +
    +  uint16x4_t forbidden_bytemask = vmov_n_u16(0x0);
    +
    +  while(buf + 4 <= end) {
    +    uint32x4_t in = vld1q_u32(reinterpret_cast(buf));
    +
    +    // Check if no bits set above 16th
    +    if(vmaxvq_u32(in) <= 0xFFFF) {
    +      uint16x4_t utf16_packed = vmovn_u32(in);
    +
    +      const uint16x4_t v_d800 = vmov_n_u16((uint16_t)0xd800);
    +      const uint16x4_t v_dfff = vmov_n_u16((uint16_t)0xdfff);
    +      forbidden_bytemask = vorr_u16(vand_u16(vcle_u16(utf16_packed, v_dfff), vcge_u16(utf16_packed, v_d800)), forbidden_bytemask);
    +
    +      if (!match_system(big_endian)) { utf16_packed = vreinterpret_u16_u8(vrev16_u8(vreinterpret_u8_u16(utf16_packed))); }
    +      vst1_u16(utf16_output, utf16_packed);
    +      utf16_output += 4;
    +      buf += 4;
    +    } else {
    +      size_t forward = 3;
    +      size_t k = 0;
    +      if(size_t(end - buf) < forward + 1) { forward = size_t(end - buf - 1);}
    +      for(; k < forward; k++) {
    +        uint32_t word = buf[k];
    +        if((word & 0xFFFF0000)==0) {
    +          // will not generate a surrogate pair
    +          if (word >= 0xD800 && word <= 0xDFFF) { return std::make_pair(nullptr, reinterpret_cast(utf16_output)); }
    +          *utf16_output++ = !match_system(big_endian) ? char16_t(word >> 8 | word << 8) : char16_t(word);
    +        } else {
    +          // will generate a surrogate pair
    +          if (word > 0x10FFFF) { return std::make_pair(nullptr, reinterpret_cast(utf16_output)); }
    +          word -= 0x10000;
    +          uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10));
    +          uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF));
    +          if (!match_system(big_endian)) {
    +            high_surrogate = uint16_t(high_surrogate >> 8 | high_surrogate << 8);
    +            low_surrogate = uint16_t(low_surrogate << 8 | low_surrogate >> 8);
    +          }
    +          *utf16_output++ = char16_t(high_surrogate);
    +          *utf16_output++ = char16_t(low_surrogate);
    +        }
    +      }
    +      buf += k;
    +    }
    +  }
    +
    +  // check for invalid input
    +  if (vmaxv_u16(forbidden_bytemask) != 0) {
    +    return std::make_pair(nullptr, reinterpret_cast(utf16_output));
    +  }
    +
    +  return std::make_pair(buf, reinterpret_cast(utf16_output));
    +}
    +
    +
    +template 
    +std::pair arm_convert_utf32_to_utf16_with_errors(const char32_t* buf, size_t len, char16_t* utf16_out) {
    +  uint16_t * utf16_output = reinterpret_cast(utf16_out);
    +  const char32_t* start = buf;
    +  const char32_t* end = buf + len;
    +
    +  while(buf + 4 <= end) {
    +    uint32x4_t in = vld1q_u32(reinterpret_cast(buf));
    +
    +    // Check if no bits set above 16th
    +    if(vmaxvq_u32(in) <= 0xFFFF) {
    +      uint16x4_t utf16_packed = vmovn_u32(in);
    +
    +      const uint16x4_t v_d800 = vmov_n_u16((uint16_t)0xd800);
    +      const uint16x4_t v_dfff = vmov_n_u16((uint16_t)0xdfff);
    +      const uint16x4_t forbidden_bytemask = vand_u16(vcle_u16(utf16_packed, v_dfff), vcge_u16(utf16_packed, v_d800));
    +      if (vmaxv_u16(forbidden_bytemask) != 0) {
    +        return std::make_pair(result(error_code::SURROGATE, buf - start), reinterpret_cast(utf16_output));
    +      }
    +
    +      if (!match_system(big_endian)) { utf16_packed = vreinterpret_u16_u8(vrev16_u8(vreinterpret_u8_u16(utf16_packed))); }
    +      vst1_u16(utf16_output, utf16_packed);
    +      utf16_output += 4;
    +      buf += 4;
    +    } else {
    +      size_t forward = 3;
    +      size_t k = 0;
    +      if(size_t(end - buf) < forward + 1) { forward = size_t(end - buf - 1);}
    +      for(; k < forward; k++) {
    +        uint32_t word = buf[k];
    +        if((word & 0xFFFF0000)==0) {
    +          // will not generate a surrogate pair
    +          if (word >= 0xD800 && word <= 0xDFFF) { return std::make_pair(result(error_code::SURROGATE, buf - start + k), reinterpret_cast(utf16_output)); }
    +          *utf16_output++ = !match_system(big_endian) ? char16_t(word >> 8 | word << 8) : char16_t(word);
    +        } else {
    +          // will generate a surrogate pair
    +          if (word > 0x10FFFF) { return std::make_pair(result(error_code::TOO_LARGE, buf - start + k), reinterpret_cast(utf16_output)); }
    +          word -= 0x10000;
    +          uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10));
    +          uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF));
    +          if (!match_system(big_endian)) {
    +            high_surrogate = uint16_t(high_surrogate >> 8 | high_surrogate << 8);
    +            low_surrogate = uint16_t(low_surrogate << 8 | low_surrogate >> 8);
    +          }
    +          *utf16_output++ = char16_t(high_surrogate);
    +          *utf16_output++ = char16_t(low_surrogate);
    +        }
    +      }
    +      buf += k;
    +    }
    +  }
    +
    +  return std::make_pair(result(error_code::SUCCESS, buf - start), reinterpret_cast(utf16_output));
    +}
    +/* end file src/arm64/arm_convert_utf32_to_utf16.cpp */
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdutf
    +/* begin file src/generic/buf_block_reader.h */
    +namespace simdutf {
    +namespace arm64 {
    +namespace {
    +
    +// Walks through a buffer in block-sized increments, loading the last part with spaces
    +template
    +struct buf_block_reader {
    +public:
    +  simdutf_really_inline buf_block_reader(const uint8_t *_buf, size_t _len);
    +  simdutf_really_inline size_t block_index();
    +  simdutf_really_inline bool has_full_block() const;
    +  simdutf_really_inline const uint8_t *full_block() const;
    +  /**
    +   * Get the last block, padded with spaces.
    +   *
    +   * There will always be a last block, with at least 1 byte, unless len == 0 (in which case this
    +   * function fills the buffer with spaces and returns 0. In particular, if len == STEP_SIZE there
    +   * will be 0 full_blocks and 1 remainder block with STEP_SIZE bytes and no spaces for padding.
    +   *
    +   * @return the number of effective characters in the last block.
    +   */
    +  simdutf_really_inline size_t get_remainder(uint8_t *dst) const;
    +  simdutf_really_inline void advance();
    +private:
    +  const uint8_t *buf;
    +  const size_t len;
    +  const size_t lenminusstep;
    +  size_t idx;
    +};
    +
    +// Routines to print masks and text for debugging bitmask operations
    +simdutf_unused static char * format_input_text_64(const uint8_t *text) {
    +  static char *buf = reinterpret_cast(malloc(sizeof(simd8x64) + 1));
    +  for (size_t i=0; i); i++) {
    +    buf[i] = int8_t(text[i]) < ' ' ? '_' : int8_t(text[i]);
    +  }
    +  buf[sizeof(simd8x64)] = '\0';
    +  return buf;
    +}
    +
    +// Routines to print masks and text for debugging bitmask operations
    +simdutf_unused static char * format_input_text(const simd8x64& in) {
    +  static char *buf = reinterpret_cast(malloc(sizeof(simd8x64) + 1));
    +  in.store(reinterpret_cast(buf));
    +  for (size_t i=0; i); i++) {
    +    if (buf[i] < ' ') { buf[i] = '_'; }
    +  }
    +  buf[sizeof(simd8x64)] = '\0';
    +  return buf;
    +}
    +
    +simdutf_unused static char * format_mask(uint64_t mask) {
    +  static char *buf = reinterpret_cast(malloc(64 + 1));
    +  for (size_t i=0; i<64; i++) {
    +    buf[i] = (mask & (size_t(1) << i)) ? 'X' : ' ';
    +  }
    +  buf[64] = '\0';
    +  return buf;
    +}
    +
    +template
    +simdutf_really_inline buf_block_reader::buf_block_reader(const uint8_t *_buf, size_t _len) : buf{_buf}, len{_len}, lenminusstep{len < STEP_SIZE ? 0 : len - STEP_SIZE}, idx{0} {}
    +
    +template
    +simdutf_really_inline size_t buf_block_reader::block_index() { return idx; }
    +
    +template
    +simdutf_really_inline bool buf_block_reader::has_full_block() const {
    +  return idx < lenminusstep;
    +}
    +
    +template
    +simdutf_really_inline const uint8_t *buf_block_reader::full_block() const {
       return &buf[idx];
     }
     
    -template
    -simdutf_really_inline size_t buf_block_reader::get_remainder(uint8_t *dst) const {
    -  if(len == idx) { return 0; } // memcpy(dst, null, 0) will trigger an error with some sanitizers
    -  std::memset(dst, 0x20, STEP_SIZE); // std::memset STEP_SIZE because it's more efficient to write out 8 or 16 bytes at once.
    -  std::memcpy(dst, buf + idx, len - idx);
    -  return len - idx;
    +template
    +simdutf_really_inline size_t buf_block_reader::get_remainder(uint8_t *dst) const {
    +  if(len == idx) { return 0; } // memcpy(dst, null, 0) will trigger an error with some sanitizers
    +  std::memset(dst, 0x20, STEP_SIZE); // std::memset STEP_SIZE because it's more efficient to write out 8 or 16 bytes at once.
    +  std::memcpy(dst, buf + idx, len - idx);
    +  return len - idx;
    +}
    +
    +template
    +simdutf_really_inline void buf_block_reader::advance() {
    +  idx += STEP_SIZE;
    +}
    +
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdutf
    +/* end file src/generic/buf_block_reader.h */
    +/* begin file src/generic/utf8_validation/utf8_lookup4_algorithm.h */
    +namespace simdutf {
    +namespace arm64 {
    +namespace {
    +namespace utf8_validation {
    +
    +using namespace simd;
    +
    +  simdutf_really_inline simd8 check_special_cases(const simd8 input, const simd8 prev1) {
    +// Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII)
    +// Bit 1 = Too Long (ASCII followed by continuation)
    +// Bit 2 = Overlong 3-byte
    +// Bit 4 = Surrogate
    +// Bit 5 = Overlong 2-byte
    +// Bit 7 = Two Continuations
    +    constexpr const uint8_t TOO_SHORT   = 1<<0; // 11______ 0_______
    +                                                // 11______ 11______
    +    constexpr const uint8_t TOO_LONG    = 1<<1; // 0_______ 10______
    +    constexpr const uint8_t OVERLONG_3  = 1<<2; // 11100000 100_____
    +    constexpr const uint8_t SURROGATE   = 1<<4; // 11101101 101_____
    +    constexpr const uint8_t OVERLONG_2  = 1<<5; // 1100000_ 10______
    +    constexpr const uint8_t TWO_CONTS   = 1<<7; // 10______ 10______
    +    constexpr const uint8_t TOO_LARGE   = 1<<3; // 11110100 1001____
    +                                                // 11110100 101_____
    +                                                // 11110101 1001____
    +                                                // 11110101 101_____
    +                                                // 1111011_ 1001____
    +                                                // 1111011_ 101_____
    +                                                // 11111___ 1001____
    +                                                // 11111___ 101_____
    +    constexpr const uint8_t TOO_LARGE_1000 = 1<<6;
    +                                                // 11110101 1000____
    +                                                // 1111011_ 1000____
    +                                                // 11111___ 1000____
    +    constexpr const uint8_t OVERLONG_4  = 1<<6; // 11110000 1000____
    +
    +    const simd8 byte_1_high = prev1.shr<4>().lookup_16(
    +      // 0_______ ________ 
    +      TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG,
    +      TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG,
    +      // 10______ ________ 
    +      TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS,
    +      // 1100____ ________ 
    +      TOO_SHORT | OVERLONG_2,
    +      // 1101____ ________ 
    +      TOO_SHORT,
    +      // 1110____ ________ 
    +      TOO_SHORT | OVERLONG_3 | SURROGATE,
    +      // 1111____ ________ 
    +      TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4
    +    );
    +    constexpr const uint8_t CARRY = TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 .
    +    const simd8 byte_1_low = (prev1 & 0x0F).lookup_16(
    +      // ____0000 ________
    +      CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4,
    +      // ____0001 ________
    +      CARRY | OVERLONG_2,
    +      // ____001_ ________
    +      CARRY,
    +      CARRY,
    +
    +      // ____0100 ________
    +      CARRY | TOO_LARGE,
    +      // ____0101 ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      // ____011_ ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +
    +      // ____1___ ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      // ____1101 ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000
    +    );
    +    const simd8 byte_2_high = input.shr<4>().lookup_16(
    +      // ________ 0_______ 
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT,
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT,
    +
    +      // ________ 1000____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | OVERLONG_4,
    +      // ________ 1001____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE,
    +      // ________ 101_____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE  | TOO_LARGE,
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE  | TOO_LARGE,
    +
    +      // ________ 11______
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT
    +    );
    +    return (byte_1_high & byte_1_low & byte_2_high);
    +  }
    +  simdutf_really_inline simd8 check_multibyte_lengths(const simd8 input,
    +      const simd8 prev_input, const simd8 sc) {
    +    simd8 prev2 = input.prev<2>(prev_input);
    +    simd8 prev3 = input.prev<3>(prev_input);
    +    simd8 must23 = simd8(must_be_2_3_continuation(prev2, prev3));
    +    simd8 must23_80 = must23 & uint8_t(0x80);
    +    return must23_80 ^ sc;
    +  }
    +
    +  //
    +  // Return nonzero if there are incomplete multibyte characters at the end of the block:
    +  // e.g. if there is a 4-byte character, but it's 3 bytes from the end.
    +  //
    +  simdutf_really_inline simd8 is_incomplete(const simd8 input) {
    +    // If the previous input's last 3 bytes match this, they're too short (they ended at EOF):
    +    // ... 1111____ 111_____ 11______
    +    static const uint8_t max_array[32] = {
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 0b11110000u-1, 0b11100000u-1, 0b11000000u-1
    +    };
    +    const simd8 max_value(&max_array[sizeof(max_array)-sizeof(simd8)]);
    +    return input.gt_bits(max_value);
    +  }
    +
    +  struct utf8_checker {
    +    // If this is nonzero, there has been a UTF-8 error.
    +    simd8 error;
    +    // The last input we received
    +    simd8 prev_input_block;
    +    // Whether the last input we received was incomplete (used for ASCII fast path)
    +    simd8 prev_incomplete;
    +
    +    //
    +    // Check whether the current bytes are valid UTF-8.
    +    //
    +    simdutf_really_inline void check_utf8_bytes(const simd8 input, const simd8 prev_input) {
    +      // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ lead bytes
    +      // (2, 3, 4-byte leads become large positive numbers instead of small negative numbers)
    +      simd8 prev1 = input.prev<1>(prev_input);
    +      simd8 sc = check_special_cases(input, prev1);
    +      this->error |= check_multibyte_lengths(input, prev_input, sc);
    +    }
    +
    +    // The only problem that can happen at EOF is that a multibyte character is too short
    +    // or a byte value too large in the last bytes: check_special_cases only checks for bytes
    +    // too large in the first of two bytes.
    +    simdutf_really_inline void check_eof() {
    +      // If the previous block had incomplete UTF-8 characters at the end, an ASCII block can't
    +      // possibly finish them.
    +      this->error |= this->prev_incomplete;
    +    }
    +
    +    simdutf_really_inline void check_next_input(const simd8x64& input) {
    +      if(simdutf_likely(is_ascii(input))) {
    +        this->error |= this->prev_incomplete;
    +      } else {
    +        // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    +        static_assert((simd8x64::NUM_CHUNKS == 2) || (simd8x64::NUM_CHUNKS == 4),
    +            "We support either two or four chunks per 64-byte block.");
    +        if(simd8x64::NUM_CHUNKS == 2) {
    +          this->check_utf8_bytes(input.chunks[0], this->prev_input_block);
    +          this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +        } else if(simd8x64::NUM_CHUNKS == 4) {
    +          this->check_utf8_bytes(input.chunks[0], this->prev_input_block);
    +          this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +          this->check_utf8_bytes(input.chunks[2], input.chunks[1]);
    +          this->check_utf8_bytes(input.chunks[3], input.chunks[2]);
    +        }
    +        this->prev_incomplete = is_incomplete(input.chunks[simd8x64::NUM_CHUNKS-1]);
    +        this->prev_input_block = input.chunks[simd8x64::NUM_CHUNKS-1];
    +
    +      }
    +    }
    +
    +    // do not forget to call check_eof!
    +    simdutf_really_inline bool errors() const {
    +      return this->error.any_bits_set_anywhere();
    +    }
    +
    +  }; // struct utf8_checker
    +} // namespace utf8_validation
    +
    +using utf8_validation::utf8_checker;
    +
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdutf
    +/* end file src/generic/utf8_validation/utf8_lookup4_algorithm.h */
    +/* begin file src/generic/utf8_validation/utf8_validator.h */
    +namespace simdutf {
    +namespace arm64 {
    +namespace {
    +namespace utf8_validation {
    +
    +/**
    + * Validates that the string is actual UTF-8.
    + */
    +template
    +bool generic_validate_utf8(const uint8_t * input, size_t length) {
    +    checker c{};
    +    buf_block_reader<64> reader(input, length);
    +    while (reader.has_full_block()) {
    +      simd::simd8x64 in(reader.full_block());
    +      c.check_next_input(in);
    +      reader.advance();
    +    }
    +    uint8_t block[64]{};
    +    reader.get_remainder(block);
    +    simd::simd8x64 in(block);
    +    c.check_next_input(in);
    +    reader.advance();
    +    c.check_eof();
    +    return !c.errors();
    +}
    +
    +bool generic_validate_utf8(const char * input, size_t length) {
    +  return generic_validate_utf8(reinterpret_cast(input),length);
     }
     
    -template
    -simdutf_really_inline void buf_block_reader::advance() {
    -  idx += STEP_SIZE;
    +/**
    + * Validates that the string is actual UTF-8 and stops on errors.
    + */
    +template
    +result generic_validate_utf8_with_errors(const uint8_t * input, size_t length) {
    +    checker c{};
    +    buf_block_reader<64> reader(input, length);
    +    size_t count{0};
    +    while (reader.has_full_block()) {
    +      simd::simd8x64 in(reader.full_block());
    +      c.check_next_input(in);
    +      if(c.errors()) {
    +        if (count != 0) { count--; } // Sometimes the error is only detected in the next chunk
    +        result res = scalar::utf8::rewind_and_validate_with_errors(reinterpret_cast(input), reinterpret_cast(input + count), length - count);
    +        res.count += count;
    +        return res;
    +      }
    +      reader.advance();
    +      count += 64;
    +    }
    +    uint8_t block[64]{};
    +    reader.get_remainder(block);
    +    simd::simd8x64 in(block);
    +    c.check_next_input(in);
    +    reader.advance();
    +    c.check_eof();
    +    if (c.errors()) {
    +      if (count != 0) { count--; } // Sometimes the error is only detected in the next chunk
    +      result res = scalar::utf8::rewind_and_validate_with_errors(reinterpret_cast(input), reinterpret_cast(input) + count, length - count);
    +      res.count += count;
    +      return res;
    +    } else {
    +      return result(error_code::SUCCESS, length);
    +    }
    +}
    +
    +result generic_validate_utf8_with_errors(const char * input, size_t length) {
    +  return generic_validate_utf8_with_errors(reinterpret_cast(input),length);
    +}
    +
    +template
    +bool generic_validate_ascii(const uint8_t * input, size_t length) {
    +    buf_block_reader<64> reader(input, length);
    +    uint8_t blocks[64]{};
    +    simd::simd8x64 running_or(blocks);
    +    while (reader.has_full_block()) {
    +      simd::simd8x64 in(reader.full_block());
    +      running_or |= in;
    +      reader.advance();
    +    }
    +    uint8_t block[64]{};
    +    reader.get_remainder(block);
    +    simd::simd8x64 in(block);
    +    running_or |= in;
    +    return running_or.is_ascii();
    +}
    +
    +bool generic_validate_ascii(const char * input, size_t length) {
    +  return generic_validate_ascii(reinterpret_cast(input),length);
    +}
    +
    +template
    +result generic_validate_ascii_with_errors(const uint8_t * input, size_t length) {
    +  buf_block_reader<64> reader(input, length);
    +  size_t count{0};
    +  while (reader.has_full_block()) {
    +    simd::simd8x64 in(reader.full_block());
    +    if (!in.is_ascii()) {
    +      result res = scalar::ascii::validate_with_errors(reinterpret_cast(input + count), length - count);
    +      return result(res.error, count + res.count);
    +    }
    +    reader.advance();
    +
    +    count += 64;
    +  }
    +  uint8_t block[64]{};
    +  reader.get_remainder(block);
    +  simd::simd8x64 in(block);
    +  if (!in.is_ascii()) {
    +    result res = scalar::ascii::validate_with_errors(reinterpret_cast(input + count), length - count);
    +    return result(res.error, count + res.count);
    +  } else {
    +    return result(error_code::SUCCESS, length);
    +  }
    +}
    +
    +result generic_validate_ascii_with_errors(const char * input, size_t length) {
    +  return generic_validate_ascii_with_errors(reinterpret_cast(input),length);
    +}
    +
    +} // namespace utf8_validation
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdutf
    +/* end file src/generic/utf8_validation/utf8_validator.h */
    +// transcoding from UTF-8 to UTF-16
    +/* begin file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */
    +
    +
    +namespace simdutf {
    +namespace arm64 {
    +namespace {
    +namespace utf8_to_utf16 {
    +
    +using namespace simd;
    +
    +template 
    +simdutf_warn_unused size_t convert_valid(const char* input, size_t size,
    +    char16_t* utf16_output) noexcept {
    +  // The implementation is not specific to haswell and should be moved to the generic directory.
    +  size_t pos = 0;
    +  char16_t* start{utf16_output};
    +  const size_t safety_margin = 16; // to avoid overruns!
    +  while(pos + 64 + safety_margin <= size) {
    +    // this loop could be unrolled further. For example, we could process the mask
    +    // far more than 64 bytes.
    +    simd8x64 in(reinterpret_cast(input + pos));
    +    if(in.is_ascii()) {
    +      in.store_ascii_as_utf16(utf16_output);
    +      utf16_output += 64;
    +      pos += 64;
    +    } else {
    +      // Slow path. We hope that the compiler will recognize that this is a slow path.
    +      // Anything that is not a continuation mask is a 'leading byte', that is, the
    +      // start of a new code point.
    +      uint64_t utf8_continuation_mask = in.lt(-65 + 1);
    +      // -65 is 0b10111111 in two-complement's, so largest possible continuation byte
    +      uint64_t utf8_leading_mask = ~utf8_continuation_mask;
    +      // The *start* of code points is not so useful, rather, we want the *end* of code points.
    +      uint64_t utf8_end_of_code_point_mask = utf8_leading_mask>>1;
    +      // We process in blocks of up to 12 bytes except possibly
    +      // for fast paths which may process up to 16 bytes. For the
    +      // slow path to work, we should have at least 12 input bytes left.
    +      size_t max_starting_point = (pos + 64) - 12;
    +      // Next loop is going to run at least five times when using solely
    +      // the slow/regular path, and at least four times if there are fast paths.
    +      while(pos < max_starting_point) {
    +        // Performance note: our ability to compute 'consumed' and
    +        // then shift and recompute is critical. If there is a
    +        // latency of, say, 4 cycles on getting 'consumed', then
    +        // the inner loop might have a total latency of about 6 cycles.
    +        // Yet we process between 6 to 12 inputs bytes, thus we get
    +        // a speed limit between 1 cycle/byte and 0.5 cycle/byte
    +        // for this section of the code. Hence, there is a limit
    +        // to how much we can further increase this latency before
    +        // it seriously harms performance.
    +        //
    +        // Thus we may allow convert_masked_utf8_to_utf16 to process
    +        // more bytes at a time under a fast-path mode where 16 bytes
    +        // are consumed at once (e.g., when encountering ASCII).
    +        size_t consumed = convert_masked_utf8_to_utf16(input + pos,
    +                            utf8_end_of_code_point_mask, utf16_output);
    +        pos += consumed;
    +        utf8_end_of_code_point_mask >>= consumed;
    +      }
    +      // At this point there may remain between 0 and 12 bytes in the
    +      // 64-byte block. These bytes will be processed again. So we have an
    +      // 80% efficiency (in the worst case). In practice we expect an
    +      // 85% to 90% efficiency.
    +    }
    +  }
    +  utf16_output += scalar::utf8_to_utf16::convert_valid(input + pos, size - pos, utf16_output);
    +  return utf16_output - start;
     }
     
    +} // namespace utf8_to_utf16
     } // unnamed namespace
     } // namespace arm64
     } // namespace simdutf
    -/* end file src/generic/buf_block_reader.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_validation/utf8_lookup4_algorithm.h
    -/* begin file src/generic/utf8_validation/utf8_lookup4_algorithm.h */
    +/* end file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */
    +/* begin file src/generic/utf8_to_utf16/utf8_to_utf16.h */
    +
    +
     namespace simdutf {
     namespace arm64 {
     namespace {
    -namespace utf8_validation {
    -
    +namespace utf8_to_utf16 {
     using namespace simd;
     
    +
       simdutf_really_inline simd8 check_special_cases(const simd8 input, const simd8 prev1) {
     // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII)
     // Bit 1 = Too Long (ASCII followed by continuation)
    @@ -13979,31 +15706,12 @@ using namespace simd;
         return must23_80 ^ sc;
       }
     
    -  //
    -  // Return nonzero if there are incomplete multibyte characters at the end of the block:
    -  // e.g. if there is a 4-byte character, but it's 3 bytes from the end.
    -  //
    -  simdutf_really_inline simd8 is_incomplete(const simd8 input) {
    -    // If the previous input's last 3 bytes match this, they're too short (they ended at EOF):
    -    // ... 1111____ 111_____ 11______
    -    static const uint8_t max_array[32] = {
    -      255, 255, 255, 255, 255, 255, 255, 255,
    -      255, 255, 255, 255, 255, 255, 255, 255,
    -      255, 255, 255, 255, 255, 255, 255, 255,
    -      255, 255, 255, 255, 255, 0b11110000u-1, 0b11100000u-1, 0b11000000u-1
    -    };
    -    const simd8 max_value(&max_array[sizeof(max_array)-sizeof(simd8)]);
    -    return input.gt_bits(max_value);
    -  }
     
    -  struct utf8_checker {
    +  struct validating_transcoder {
         // If this is nonzero, there has been a UTF-8 error.
         simd8 error;
    -    // The last input we received
    -    simd8 prev_input_block;
    -    // Whether the last input we received was incomplete (used for ASCII fast path)
    -    simd8 prev_incomplete;
     
    +    validating_transcoder() : error(uint8_t(0)) {}
         //
         // Check whether the current bytes are valid UTF-8.
         //
    @@ -14015,262 +15723,239 @@ using namespace simd;
           this->error |= check_multibyte_lengths(input, prev_input, sc);
         }
     
    -    // The only problem that can happen at EOF is that a multibyte character is too short
    -    // or a byte value too large in the last bytes: check_special_cases only checks for bytes
    -    // too large in the first of two bytes.
    -    simdutf_really_inline void check_eof() {
    -      // If the previous block had incomplete UTF-8 characters at the end, an ASCII block can't
    -      // possibly finish them.
    -      this->error |= this->prev_incomplete;
    -    }
     
    -    simdutf_really_inline void check_next_input(const simd8x64& input) {
    -      if(simdutf_likely(is_ascii(input))) {
    -        this->error |= this->prev_incomplete;
    -      } else {
    -        // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    -        static_assert((simd8x64::NUM_CHUNKS == 2) || (simd8x64::NUM_CHUNKS == 4),
    -            "We support either two or four chunks per 64-byte block.");
    -        if(simd8x64::NUM_CHUNKS == 2) {
    -          this->check_utf8_bytes(input.chunks[0], this->prev_input_block);
    -          this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    -        } else if(simd8x64::NUM_CHUNKS == 4) {
    -          this->check_utf8_bytes(input.chunks[0], this->prev_input_block);
    -          this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    -          this->check_utf8_bytes(input.chunks[2], input.chunks[1]);
    -          this->check_utf8_bytes(input.chunks[3], input.chunks[2]);
    +    template 
    +    simdutf_really_inline size_t convert(const char* in, size_t size, char16_t* utf16_output) {
    +      size_t pos = 0;
    +      char16_t* start{utf16_output};
    +      // In the worst case, we have the haswell kernel which can cause an overflow of
    +      // 8 bytes when calling convert_masked_utf8_to_utf16. If you skip the last 16 bytes,
    +      // and if the data is valid, then it is entirely safe because 16 UTF-8 bytes generate
    +      // much more than 8 bytes. However, you cannot generally assume that you have valid
    +      // UTF-8 input, so we are going to go back from the end counting 8 leading bytes,
    +      // to give us a good margin.
    +      size_t leading_byte = 0;
    +      size_t margin = size;
    +      for(; margin > 0 && leading_byte < 8; margin--) {
    +        leading_byte += (int8_t(in[margin-1]) > -65);
    +      }
    +      // If the input is long enough, then we have that margin-1 is the eight last leading byte.
    +      const size_t safety_margin = size - margin + 1; // to avoid overruns!
    +      while(pos + 64 + safety_margin <= size) {
    +        simd8x64 input(reinterpret_cast(in + pos));
    +        if(input.is_ascii()) {
    +          input.store_ascii_as_utf16(utf16_output);
    +          utf16_output += 64;
    +          pos += 64;
    +        } else {
    +          // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    +          static_assert((simd8x64::NUM_CHUNKS == 2) || (simd8x64::NUM_CHUNKS == 4),
    +              "We support either two or four chunks per 64-byte block.");
    +          auto zero = simd8{uint8_t(0)};
    +          if(simd8x64::NUM_CHUNKS == 2) {
    +            this->check_utf8_bytes(input.chunks[0], zero);
    +            this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +          } else if(simd8x64::NUM_CHUNKS == 4) {
    +            this->check_utf8_bytes(input.chunks[0], zero);
    +            this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +            this->check_utf8_bytes(input.chunks[2], input.chunks[1]);
    +            this->check_utf8_bytes(input.chunks[3], input.chunks[2]);
    +          }
    +          uint64_t utf8_continuation_mask = input.lt(-65 + 1);
    +          uint64_t utf8_leading_mask = ~utf8_continuation_mask;
    +          uint64_t utf8_end_of_code_point_mask = utf8_leading_mask>>1;
    +          // We process in blocks of up to 12 bytes except possibly
    +          // for fast paths which may process up to 16 bytes. For the
    +          // slow path to work, we should have at least 12 input bytes left.
    +          size_t max_starting_point = (pos + 64) - 12;
    +          // Next loop is going to run at least five times.
    +          while(pos < max_starting_point) {
    +            // Performance note: our ability to compute 'consumed' and
    +            // then shift and recompute is critical. If there is a
    +            // latency of, say, 4 cycles on getting 'consumed', then
    +            // the inner loop might have a total latency of about 6 cycles.
    +            // Yet we process between 6 to 12 inputs bytes, thus we get
    +            // a speed limit between 1 cycle/byte and 0.5 cycle/byte
    +            // for this section of the code. Hence, there is a limit
    +            // to how much we can further increase this latency before
    +            // it seriously harms performance.
    +            size_t consumed = convert_masked_utf8_to_utf16(in + pos,
    +                            utf8_end_of_code_point_mask, utf16_output);
    +            pos += consumed;
    +            utf8_end_of_code_point_mask >>= consumed;
    +          }
    +          // At this point there may remain between 0 and 12 bytes in the
    +          // 64-byte block. These bytes will be processed again. So we have an
    +          // 80% efficiency (in the worst case). In practice we expect an
    +          // 85% to 90% efficiency.
             }
    -        this->prev_incomplete = is_incomplete(input.chunks[simd8x64::NUM_CHUNKS-1]);
    -        this->prev_input_block = input.chunks[simd8x64::NUM_CHUNKS-1];
    -
           }
    +      if(errors()) { return 0; }
    +      if(pos < size) {
    +        size_t howmany  = scalar::utf8_to_utf16::convert(in + pos, size - pos, utf16_output);
    +        if(howmany == 0) { return 0; }
    +        utf16_output += howmany;
    +      }
    +      return utf16_output - start;
         }
     
    -    // do not forget to call check_eof!
    -    simdutf_really_inline bool errors() const {
    -      return this->error.any_bits_set_anywhere();
    -    }
    -
    -  }; // struct utf8_checker
    -} // namespace utf8_validation
    -
    -using utf8_validation::utf8_checker;
    -
    -} // unnamed namespace
    -} // namespace arm64
    -} // namespace simdutf
    -/* end file src/generic/utf8_validation/utf8_lookup4_algorithm.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_validation/utf8_validator.h
    -/* begin file src/generic/utf8_validation/utf8_validator.h */
    -namespace simdutf {
    -namespace arm64 {
    -namespace {
    -namespace utf8_validation {
    -
    -/**
    - * Validates that the string is actual UTF-8.
    - */
    -template
    -bool generic_validate_utf8(const uint8_t * input, size_t length) {
    -    checker c{};
    -    buf_block_reader<64> reader(input, length);
    -    while (reader.has_full_block()) {
    -      simd::simd8x64 in(reader.full_block());
    -      c.check_next_input(in);
    -      reader.advance();
    -    }
    -    uint8_t block[64]{};
    -    reader.get_remainder(block);
    -    simd::simd8x64 in(block);
    -    c.check_next_input(in);
    -    reader.advance();
    -    c.check_eof();
    -    return !c.errors();
    -}
    -
    -bool generic_validate_utf8(const char * input, size_t length) {
    -  return generic_validate_utf8(reinterpret_cast(input),length);
    -}
    -
    -/**
    - * Validates that the string is actual UTF-8 and stops on errors.
    - */
    -template
    -result generic_validate_utf8_with_errors(const uint8_t * input, size_t length) {
    -    checker c{};
    -    buf_block_reader<64> reader(input, length);
    -    size_t count{0};
    -    while (reader.has_full_block()) {
    -      simd::simd8x64 in(reader.full_block());
    -      c.check_next_input(in);
    -      if(c.errors()) {
    -        if (count != 0) { count--; } // Sometimes the error is only detected in the next chunk
    -        result res = scalar::utf8::rewind_and_validate_with_errors(reinterpret_cast(input), reinterpret_cast(input + count), length - count);
    -        res.count += count;
    +    template 
    +    simdutf_really_inline result convert_with_errors(const char* in, size_t size, char16_t* utf16_output) {
    +      size_t pos = 0;
    +      char16_t* start{utf16_output};
    +      // In the worst case, we have the haswell kernel which can cause an overflow of
    +      // 8 bytes when calling convert_masked_utf8_to_utf16. If you skip the last 16 bytes,
    +      // and if the data is valid, then it is entirely safe because 16 UTF-8 bytes generate
    +      // much more than 8 bytes. However, you cannot generally assume that you have valid
    +      // UTF-8 input, so we are going to go back from the end counting 8 leading bytes,
    +      // to give us a good margin.
    +      size_t leading_byte = 0;
    +      size_t margin = size;
    +      for(; margin > 0 && leading_byte < 8; margin--) {
    +        leading_byte += (int8_t(in[margin-1]) > -65);
    +      }
    +      // If the input is long enough, then we have that margin-1 is the eight last leading byte.
    +      const size_t safety_margin = size - margin + 1; // to avoid overruns!
    +      while(pos + 64 + safety_margin <= size) {
    +        simd8x64 input(reinterpret_cast(in + pos));
    +        if(input.is_ascii()) {
    +          input.store_ascii_as_utf16(utf16_output);
    +          utf16_output += 64;
    +          pos += 64;
    +        } else {
    +          // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    +          static_assert((simd8x64::NUM_CHUNKS == 2) || (simd8x64::NUM_CHUNKS == 4),
    +              "We support either two or four chunks per 64-byte block.");
    +          auto zero = simd8{uint8_t(0)};
    +          if(simd8x64::NUM_CHUNKS == 2) {
    +            this->check_utf8_bytes(input.chunks[0], zero);
    +            this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +          } else if(simd8x64::NUM_CHUNKS == 4) {
    +            this->check_utf8_bytes(input.chunks[0], zero);
    +            this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +            this->check_utf8_bytes(input.chunks[2], input.chunks[1]);
    +            this->check_utf8_bytes(input.chunks[3], input.chunks[2]);
    +          }
    +          if (errors()) {
    +            // rewind_and_convert_with_errors will seek a potential error from in+pos onward,
    +            // with the ability to go back up to pos bytes, and read size-pos bytes forward.
    +            result res = scalar::utf8_to_utf16::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf16_output);
    +            res.count += pos;
    +            return res;
    +          }
    +          uint64_t utf8_continuation_mask = input.lt(-65 + 1);
    +          uint64_t utf8_leading_mask = ~utf8_continuation_mask;
    +          uint64_t utf8_end_of_code_point_mask = utf8_leading_mask>>1;
    +          // We process in blocks of up to 12 bytes except possibly
    +          // for fast paths which may process up to 16 bytes. For the
    +          // slow path to work, we should have at least 12 input bytes left.
    +          size_t max_starting_point = (pos + 64) - 12;
    +          // Next loop is going to run at least five times.
    +          while(pos < max_starting_point) {
    +            // Performance note: our ability to compute 'consumed' and
    +            // then shift and recompute is critical. If there is a
    +            // latency of, say, 4 cycles on getting 'consumed', then
    +            // the inner loop might have a total latency of about 6 cycles.
    +            // Yet we process between 6 to 12 inputs bytes, thus we get
    +            // a speed limit between 1 cycle/byte and 0.5 cycle/byte
    +            // for this section of the code. Hence, there is a limit
    +            // to how much we can further increase this latency before
    +            // it seriously harms performance.
    +            size_t consumed = convert_masked_utf8_to_utf16(in + pos,
    +                            utf8_end_of_code_point_mask, utf16_output);
    +            pos += consumed;
    +            utf8_end_of_code_point_mask >>= consumed;
    +          }
    +          // At this point there may remain between 0 and 12 bytes in the
    +          // 64-byte block. These bytes will be processed again. So we have an
    +          // 80% efficiency (in the worst case). In practice we expect an
    +          // 85% to 90% efficiency.
    +        }
    +      }
    +      if(errors()) {
    +        // rewind_and_convert_with_errors will seek a potential error from in+pos onward,
    +        // with the ability to go back up to pos bytes, and read size-pos bytes forward.
    +        result res = scalar::utf8_to_utf16::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf16_output);
    +        res.count += pos;
             return res;
           }
    -      reader.advance();
    -      count += 64;
    -    }
    -    uint8_t block[64]{};
    -    reader.get_remainder(block);
    -    simd::simd8x64 in(block);
    -    c.check_next_input(in);
    -    reader.advance();
    -    c.check_eof();
    -    if (c.errors()) {
    -      if (count != 0) { count--; } // Sometimes the error is only detected in the next chunk
    -      result res = scalar::utf8::rewind_and_validate_with_errors(reinterpret_cast(input), reinterpret_cast(input) + count, length - count);
    -      res.count += count;
    -      return res;
    -    } else {
    -      return result(error_code::SUCCESS, length);
    -    }
    -}
    -
    -result generic_validate_utf8_with_errors(const char * input, size_t length) {
    -  return generic_validate_utf8_with_errors(reinterpret_cast(input),length);
    -}
    -
    -template
    -bool generic_validate_ascii(const uint8_t * input, size_t length) {
    -    buf_block_reader<64> reader(input, length);
    -    uint8_t blocks[64]{};
    -    simd::simd8x64 running_or(blocks);
    -    while (reader.has_full_block()) {
    -      simd::simd8x64 in(reader.full_block());
    -      running_or |= in;
    -      reader.advance();
    +      if(pos < size) {
    +        // rewind_and_convert_with_errors will seek a potential error from in+pos onward,
    +        // with the ability to go back up to pos bytes, and read size-pos bytes forward.
    +        result res = scalar::utf8_to_utf16::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf16_output);
    +        if (res.error) {    // In case of error, we want the error position
    +          res.count += pos;
    +          return res;
    +        } else {    // In case of success, we want the number of word written
    +          utf16_output += res.count;
    +        }
    +      }
    +      return result(error_code::SUCCESS, utf16_output - start);
         }
    -    uint8_t block[64]{};
    -    reader.get_remainder(block);
    -    simd::simd8x64 in(block);
    -    running_or |= in;
    -    return running_or.is_ascii();
    -}
    -
    -bool generic_validate_ascii(const char * input, size_t length) {
    -  return generic_validate_ascii(reinterpret_cast(input),length);
    -}
     
    -template
    -result generic_validate_ascii_with_errors(const uint8_t * input, size_t length) {
    -  buf_block_reader<64> reader(input, length);
    -  size_t count{0};
    -  while (reader.has_full_block()) {
    -    simd::simd8x64 in(reader.full_block());
    -    if (!in.is_ascii()) {
    -      result res = scalar::ascii::validate_with_errors(reinterpret_cast(input + count), length - count);
    -      return result(res.error, count + res.count);
    +    simdutf_really_inline bool errors() const {
    +      return this->error.any_bits_set_anywhere();
         }
    -    reader.advance();
    -
    -    count += 64;
    -  }
    -  uint8_t block[64]{};
    -  reader.get_remainder(block);
    -  simd::simd8x64 in(block);
    -  if (!in.is_ascii()) {
    -    result res = scalar::ascii::validate_with_errors(reinterpret_cast(input + count), length - count);
    -    return result(res.error, count + res.count);
    -  } else {
    -    return result(error_code::SUCCESS, length);
    -  }
    -}
    -
    -result generic_validate_ascii_with_errors(const char * input, size_t length) {
    -  return generic_validate_ascii_with_errors(reinterpret_cast(input),length);
    -}
     
    -} // namespace utf8_validation
    +  }; // struct utf8_checker
    +} // utf8_to_utf16 namespace
     } // unnamed namespace
     } // namespace arm64
     } // namespace simdutf
    -/* end file src/generic/utf8_validation/utf8_validator.h */
    -// transcoding from UTF-8 to UTF-16
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_to_utf16/valid_utf8_to_utf16.h
    -/* begin file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */
    -
    +/* end file src/generic/utf8_to_utf16/utf8_to_utf16.h */
    +// transcoding from UTF-8 to UTF-32
    +/* begin file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */
     
     namespace simdutf {
     namespace arm64 {
     namespace {
    -namespace utf8_to_utf16 {
    +namespace utf8_to_utf32 {
     
     using namespace simd;
     
    -template 
    +
     simdutf_warn_unused size_t convert_valid(const char* input, size_t size,
    -    char16_t* utf16_output) noexcept {
    -  // The implementation is not specific to haswell and should be moved to the generic directory.
    +    char32_t* utf32_output) noexcept {
       size_t pos = 0;
    -  char16_t* start{utf16_output};
    +  char32_t* start{utf32_output};
       const size_t safety_margin = 16; // to avoid overruns!
       while(pos + 64 + safety_margin <= size) {
    -    // this loop could be unrolled further. For example, we could process the mask
    -    // far more than 64 bytes.
         simd8x64 in(reinterpret_cast(input + pos));
         if(in.is_ascii()) {
    -      in.store_ascii_as_utf16(utf16_output);
    -      utf16_output += 64;
    +      in.store_ascii_as_utf32(utf32_output);
    +      utf32_output += 64;
           pos += 64;
         } else {
    -      // Slow path. We hope that the compiler will recognize that this is a slow path.
    -      // Anything that is not a continuation mask is a 'leading byte', that is, the
    -      // start of a new code point.
    -      uint64_t utf8_continuation_mask = in.lt(-65 + 1);
    -      // -65 is 0b10111111 in two-complement's, so largest possible continuation byte
    -      uint64_t utf8_leading_mask = ~utf8_continuation_mask;
    -      // The *start* of code points is not so useful, rather, we want the *end* of code points.
    -      uint64_t utf8_end_of_code_point_mask = utf8_leading_mask>>1;
    -      // We process in blocks of up to 12 bytes except possibly
    -      // for fast paths which may process up to 16 bytes. For the
    -      // slow path to work, we should have at least 12 input bytes left.
    -      size_t max_starting_point = (pos + 64) - 12;
    -      // Next loop is going to run at least five times when using solely
    -      // the slow/regular path, and at least four times if there are fast paths.
    -      while(pos < max_starting_point) {
    -        // Performance note: our ability to compute 'consumed' and
    -        // then shift and recompute is critical. If there is a
    -        // latency of, say, 4 cycles on getting 'consumed', then
    -        // the inner loop might have a total latency of about 6 cycles.
    -        // Yet we process between 6 to 12 inputs bytes, thus we get
    -        // a speed limit between 1 cycle/byte and 0.5 cycle/byte
    -        // for this section of the code. Hence, there is a limit
    -        // to how much we can further increase this latency before
    -        // it seriously harms performance.
    -        //
    -        // Thus we may allow convert_masked_utf8_to_utf16 to process
    -        // more bytes at a time under a fast-path mode where 16 bytes
    -        // are consumed at once (e.g., when encountering ASCII).
    -        size_t consumed = convert_masked_utf8_to_utf16(input + pos,
    -                            utf8_end_of_code_point_mask, utf16_output);
    -        pos += consumed;
    -        utf8_end_of_code_point_mask >>= consumed;
    +    // -65 is 0b10111111 in two-complement's, so largest possible continuation byte
    +    uint64_t utf8_continuation_mask = in.lt(-65 + 1);
    +    uint64_t utf8_leading_mask = ~utf8_continuation_mask;
    +    uint64_t utf8_end_of_code_point_mask = utf8_leading_mask>>1;
    +    size_t max_starting_point = (pos + 64) - 12;
    +    while(pos < max_starting_point) {
    +      size_t consumed = convert_masked_utf8_to_utf32(input + pos,
    +                          utf8_end_of_code_point_mask, utf32_output);
    +      pos += consumed;
    +      utf8_end_of_code_point_mask >>= consumed;
           }
    -      // At this point there may remain between 0 and 12 bytes in the
    -      // 64-byte block. These bytes will be processed again. So we have an
    -      // 80% efficiency (in the worst case). In practice we expect an
    -      // 85% to 90% efficiency.
         }
       }
    -  utf16_output += scalar::utf8_to_utf16::convert_valid(input + pos, size - pos, utf16_output);
    -  return utf16_output - start;
    +  utf32_output += scalar::utf8_to_utf32::convert_valid(input + pos, size - pos, utf32_output);
    +  return utf32_output - start;
     }
     
    -} // namespace utf8_to_utf16
    +
    +} // namespace utf8_to_utf32
     } // unnamed namespace
     } // namespace arm64
     } // namespace simdutf
    -/* end file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_to_utf16/utf8_to_utf16.h
    -/* begin file src/generic/utf8_to_utf16/utf8_to_utf16.h */
    +/* end file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */
    +/* begin file src/generic/utf8_to_utf32/utf8_to_utf32.h */
     
     
     namespace simdutf {
     namespace arm64 {
     namespace {
    -namespace utf8_to_utf16 {
    +namespace utf8_to_utf32 {
     using namespace simd;
     
     
    @@ -14391,28 +16076,28 @@ using namespace simd;
         }
     
     
    -    template 
    -    simdutf_really_inline size_t convert(const char* in, size_t size, char16_t* utf16_output) {
    +
    +    simdutf_really_inline size_t convert(const char* in, size_t size, char32_t* utf32_output) {
           size_t pos = 0;
    -      char16_t* start{utf16_output};
    +      char32_t* start{utf32_output};
           // In the worst case, we have the haswell kernel which can cause an overflow of
    -      // 8 bytes when calling convert_masked_utf8_to_utf16. If you skip the last 16 bytes,
    +      // 8 bytes when calling convert_masked_utf8_to_utf32. If you skip the last 16 bytes,
           // and if the data is valid, then it is entirely safe because 16 UTF-8 bytes generate
           // much more than 8 bytes. However, you cannot generally assume that you have valid
    -      // UTF-8 input, so we are going to go back from the end counting 8 leading bytes,
    +      // UTF-8 input, so we are going to go back from the end counting 4 leading bytes,
           // to give us a good margin.
           size_t leading_byte = 0;
           size_t margin = size;
    -      for(; margin > 0 && leading_byte < 8; margin--) {
    +      for(; margin > 0 && leading_byte < 4; margin--) {
             leading_byte += (int8_t(in[margin-1]) > -65);
           }
    -      // If the input is long enough, then we have that margin-1 is the eight last leading byte.
    +      // If the input is long enough, then we have that margin-1 is the fourth last leading byte.
           const size_t safety_margin = size - margin + 1; // to avoid overruns!
           while(pos + 64 + safety_margin <= size) {
             simd8x64 input(reinterpret_cast(in + pos));
             if(input.is_ascii()) {
    -          input.store_ascii_as_utf16(utf16_output);
    -          utf16_output += 64;
    +          input.store_ascii_as_utf32(utf32_output);
    +          utf32_output += 64;
               pos += 64;
             } else {
               // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    @@ -14446,8 +16131,8 @@ using namespace simd;
                 // for this section of the code. Hence, there is a limit
                 // to how much we can further increase this latency before
                 // it seriously harms performance.
    -            size_t consumed = convert_masked_utf8_to_utf16(in + pos,
    -                            utf8_end_of_code_point_mask, utf16_output);
    +            size_t consumed = convert_masked_utf8_to_utf32(in + pos,
    +                            utf8_end_of_code_point_mask, utf32_output);
                 pos += consumed;
                 utf8_end_of_code_point_mask >>= consumed;
               }
    @@ -14459,35 +16144,34 @@ using namespace simd;
           }
           if(errors()) { return 0; }
           if(pos < size) {
    -        size_t howmany  = scalar::utf8_to_utf16::convert(in + pos, size - pos, utf16_output);
    +        size_t howmany  = scalar::utf8_to_utf32::convert(in + pos, size - pos, utf32_output);
             if(howmany == 0) { return 0; }
    -        utf16_output += howmany;
    +        utf32_output += howmany;
           }
    -      return utf16_output - start;
    +      return utf32_output - start;
         }
     
    -    template 
    -    simdutf_really_inline result convert_with_errors(const char* in, size_t size, char16_t* utf16_output) {
    +    simdutf_really_inline result convert_with_errors(const char* in, size_t size, char32_t* utf32_output) {
           size_t pos = 0;
    -      char16_t* start{utf16_output};
    +      char32_t* start{utf32_output};
           // In the worst case, we have the haswell kernel which can cause an overflow of
    -      // 8 bytes when calling convert_masked_utf8_to_utf16. If you skip the last 16 bytes,
    +      // 8 bytes when calling convert_masked_utf8_to_utf32. If you skip the last 16 bytes,
           // and if the data is valid, then it is entirely safe because 16 UTF-8 bytes generate
           // much more than 8 bytes. However, you cannot generally assume that you have valid
    -      // UTF-8 input, so we are going to go back from the end counting 8 leading bytes,
    +      // UTF-8 input, so we are going to go back from the end counting 4 leading bytes,
           // to give us a good margin.
           size_t leading_byte = 0;
           size_t margin = size;
    -      for(; margin > 0 && leading_byte < 8; margin--) {
    +      for(; margin > 0 && leading_byte < 4; margin--) {
             leading_byte += (int8_t(in[margin-1]) > -65);
           }
    -      // If the input is long enough, then we have that margin-1 is the eight last leading byte.
    +      // If the input is long enough, then we have that margin-1 is the fourth last leading byte.
           const size_t safety_margin = size - margin + 1; // to avoid overruns!
           while(pos + 64 + safety_margin <= size) {
             simd8x64 input(reinterpret_cast(in + pos));
             if(input.is_ascii()) {
    -          input.store_ascii_as_utf16(utf16_output);
    -          utf16_output += 64;
    +          input.store_ascii_as_utf32(utf32_output);
    +          utf32_output += 64;
               pos += 64;
             } else {
               // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    @@ -14504,9 +16188,7 @@ using namespace simd;
                 this->check_utf8_bytes(input.chunks[3], input.chunks[2]);
               }
               if (errors()) {
    -            // rewind_and_convert_with_errors will seek a potential error from in+pos onward,
    -            // with the ability to go back up to pos bytes, and read size-pos bytes forward.
    -            result res = scalar::utf8_to_utf16::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf16_output);
    +            result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf32_output);
                 res.count += pos;
                 return res;
               }
    @@ -14528,8 +16210,8 @@ using namespace simd;
                 // for this section of the code. Hence, there is a limit
                 // to how much we can further increase this latency before
                 // it seriously harms performance.
    -            size_t consumed = convert_masked_utf8_to_utf16(in + pos,
    -                            utf8_end_of_code_point_mask, utf16_output);
    +            size_t consumed = convert_masked_utf8_to_utf32(in + pos,
    +                            utf8_end_of_code_point_mask, utf32_output);
                 pos += consumed;
                 utf8_end_of_code_point_mask >>= consumed;
               }
    @@ -14540,24 +16222,20 @@ using namespace simd;
             }
           }
           if(errors()) {
    -        // rewind_and_convert_with_errors will seek a potential error from in+pos onward,
    -        // with the ability to go back up to pos bytes, and read size-pos bytes forward.
    -        result res = scalar::utf8_to_utf16::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf16_output);
    +        result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf32_output);
             res.count += pos;
             return res;
           }
           if(pos < size) {
    -        // rewind_and_convert_with_errors will seek a potential error from in+pos onward,
    -        // with the ability to go back up to pos bytes, and read size-pos bytes forward.
    -        result res = scalar::utf8_to_utf16::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf16_output);
    +        result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf32_output);
             if (res.error) {    // In case of error, we want the error position
               res.count += pos;
               return res;
             } else {    // In case of success, we want the number of word written
    -          utf16_output += res.count;
    +          utf32_output += res.count;
             }
           }
    -      return result(error_code::SUCCESS, utf16_output - start);
    +      return result(error_code::SUCCESS, utf32_output - start);
         }
     
         simdutf_really_inline bool errors() const {
    @@ -14565,70 +16243,131 @@ using namespace simd;
         }
     
       }; // struct utf8_checker
    -} // utf8_to_utf16 namespace
    +} // utf8_to_utf32 namespace
     } // unnamed namespace
     } // namespace arm64
     } // namespace simdutf
    -/* end file src/generic/utf8_to_utf16/utf8_to_utf16.h */
    -// transcoding from UTF-8 to UTF-32
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_to_utf32/valid_utf8_to_utf32.h
    -/* begin file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */
    +/* end file src/generic/utf8_to_utf32/utf8_to_utf32.h */
    +// other functions
    +/* begin file src/generic/utf8.h */
     
     namespace simdutf {
     namespace arm64 {
     namespace {
    -namespace utf8_to_utf32 {
    +namespace utf8 {
     
     using namespace simd;
     
    +simdutf_really_inline size_t count_code_points(const char* in, size_t size) {
    +    size_t pos = 0;
    +    size_t count = 0;
    +    for(;pos + 64 <= size; pos += 64) {
    +      simd8x64 input(reinterpret_cast(in + pos));
    +      uint64_t utf8_continuation_mask = input.gt(-65);
    +      count += count_ones(utf8_continuation_mask);
    +    }
    +    return count + scalar::utf8::count_code_points(in + pos, size - pos);
    +}
     
    -simdutf_warn_unused size_t convert_valid(const char* input, size_t size,
    -    char32_t* utf32_output) noexcept {
    -  size_t pos = 0;
    -  char32_t* start{utf32_output};
    -  const size_t safety_margin = 16; // to avoid overruns!
    -  while(pos + 64 + safety_margin <= size) {
    -    simd8x64 in(reinterpret_cast(input + pos));
    -    if(in.is_ascii()) {
    -      in.store_ascii_as_utf32(utf32_output);
    -      utf32_output += 64;
    -      pos += 64;
    -    } else {
    -    // -65 is 0b10111111 in two-complement's, so largest possible continuation byte
    -    uint64_t utf8_continuation_mask = in.lt(-65 + 1);
    -    uint64_t utf8_leading_mask = ~utf8_continuation_mask;
    -    uint64_t utf8_end_of_code_point_mask = utf8_leading_mask>>1;
    -    size_t max_starting_point = (pos + 64) - 12;
    -    while(pos < max_starting_point) {
    -      size_t consumed = convert_masked_utf8_to_utf32(input + pos,
    -                          utf8_end_of_code_point_mask, utf32_output);
    -      pos += consumed;
    -      utf8_end_of_code_point_mask >>= consumed;
    -      }
    +simdutf_really_inline size_t utf16_length_from_utf8(const char* in, size_t size) {
    +    size_t pos = 0;
    +    size_t count = 0;
    +    // This algorithm could no doubt be improved!
    +    for(;pos + 64 <= size; pos += 64) {
    +      simd8x64 input(reinterpret_cast(in + pos));
    +      uint64_t utf8_continuation_mask = input.lt(-65 + 1);
    +      // We count one word for anything that is not a continuation (so
    +      // leading bytes).
    +      count += 64 - count_ones(utf8_continuation_mask);
    +      int64_t utf8_4byte = input.gteq_unsigned(240);
    +      count += count_ones(utf8_4byte);
         }
    -  }
    -  utf32_output += scalar::utf8_to_utf32::convert_valid(input + pos, size - pos, utf32_output);
    -  return utf32_output - start;
    +    return count + scalar::utf8::utf16_length_from_utf8(in + pos, size - pos);
    +}
    +} // utf8 namespace
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdutf
    +/* end file src/generic/utf8.h */
    +/* begin file src/generic/utf16.h */
    +namespace simdutf {
    +namespace arm64 {
    +namespace {
    +namespace utf16 {
    +
    +template 
    +simdutf_really_inline size_t count_code_points(const char16_t* in, size_t size) {
    +    size_t pos = 0;
    +    size_t count = 0;
    +    for(;pos < size/32*32; pos += 32) {
    +      simd16x32 input(reinterpret_cast(in + pos));
    +      if (!match_system(big_endian)) { input.swap_bytes(); }
    +      uint64_t not_pair = input.not_in_range(0xDC00, 0xDFFF);
    +      count += count_ones(not_pair) / 2;
    +    }
    +    return count + scalar::utf16::count_code_points(in + pos, size - pos);
     }
     
    +template 
    +simdutf_really_inline size_t utf8_length_from_utf16(const char16_t* in, size_t size) {
    +    size_t pos = 0;
    +    size_t count = 0;
    +    // This algorithm could no doubt be improved!
    +    for(;pos < size/32*32; pos += 32) {
    +      simd16x32 input(reinterpret_cast(in + pos));
    +      if (!match_system(big_endian)) { input.swap_bytes(); }
    +      uint64_t ascii_mask = input.lteq(0x7F);
    +      uint64_t twobyte_mask = input.lteq(0x7FF);
    +      uint64_t not_pair_mask = input.not_in_range(0xD800, 0xDFFF);
     
    -} // namespace utf8_to_utf32
    +      size_t ascii_count = count_ones(ascii_mask) / 2;
    +      size_t twobyte_count = count_ones(twobyte_mask & ~ ascii_mask) / 2;
    +      size_t threebyte_count = count_ones(not_pair_mask & ~ twobyte_mask) / 2;
    +      size_t fourbyte_count = 32 - count_ones(not_pair_mask) / 2;
    +      count += 2 * fourbyte_count + 3 * threebyte_count + 2 * twobyte_count + ascii_count;
    +    }
    +    return count + scalar::utf16::utf8_length_from_utf16(in + pos, size - pos);
    +}
    +
    +template 
    +simdutf_really_inline size_t utf32_length_from_utf16(const char16_t* in, size_t size) {
    +    return count_code_points(in, size);
    +}
    +
    +simdutf_really_inline void change_endianness_utf16(const char16_t* in, size_t size, char16_t* output) {
    +  size_t pos = 0;
    +
    +  while (pos < size/32*32) {
    +    simd16x32 input(reinterpret_cast(in + pos));
    +    input.swap_bytes();
    +    input.store(reinterpret_cast(output));
    +    pos += 32;
    +    output += 32;
    +  }
    +
    +  scalar::utf16::change_endianness_utf16(in + pos, size - pos, output);
    +}
    +
    +} // utf16
     } // unnamed namespace
     } // namespace arm64
     } // namespace simdutf
    -/* end file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_to_utf32/utf8_to_utf32.h
    -/* begin file src/generic/utf8_to_utf32/utf8_to_utf32.h */
    +/* end file src/generic/utf16.h */
    +// transcoding from UTF-8 to Latin 1
    +/* begin file src/generic/utf8_to_latin1/utf8_to_latin1.h */
     
     
     namespace simdutf {
     namespace arm64 {
     namespace {
    -namespace utf8_to_utf32 {
    +namespace utf8_to_latin1 {
     using namespace simd;
     
     
       simdutf_really_inline simd8 check_special_cases(const simd8 input, const simd8 prev1) {
    +// For UTF-8 to Latin 1, we can allow any ASCII character, and any continuation byte,
    +// but the non-ASCII leading bytes must be 0b11000011 or 0b11000010 and nothing else.
    +//
     // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII)
     // Bit 1 = Too Long (ASCII followed by continuation)
     // Bit 2 = Overlong 3-byte
    @@ -14655,6 +16394,7 @@ using namespace simd;
                                                     // 1111011_ 1000____
                                                     // 11111___ 1000____
         constexpr const uint8_t OVERLONG_4  = 1<<6; // 11110000 1000____
    +    constexpr const uint8_t FORBIDDEN  = 0xff;
     
         const simd8 byte_1_high = prev1.shr<4>().lookup_16(
           // 0_______ ________ 
    @@ -14665,11 +16405,11 @@ using namespace simd;
           // 1100____ ________ 
           TOO_SHORT | OVERLONG_2,
           // 1101____ ________ 
    -      TOO_SHORT,
    +      FORBIDDEN,
           // 1110____ ________ 
    -      TOO_SHORT | OVERLONG_3 | SURROGATE,
    +      FORBIDDEN,
           // 1111____ ________ 
    -      TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4
    +      FORBIDDEN
         );
         constexpr const uint8_t CARRY = TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 .
         const simd8 byte_1_low = (prev1 & 0x0F).lookup_16(
    @@ -14682,23 +16422,23 @@ using namespace simd;
           CARRY,
     
           // ____0100 ________
    -      CARRY | TOO_LARGE,
    +      FORBIDDEN,
           // ____0101 ________
    -      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      FORBIDDEN,
           // ____011_ ________
    -      CARRY | TOO_LARGE | TOO_LARGE_1000,
    -      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      FORBIDDEN,
    +      FORBIDDEN,
     
           // ____1___ ________
    -      CARRY | TOO_LARGE | TOO_LARGE_1000,
    -      CARRY | TOO_LARGE | TOO_LARGE_1000,
    -      CARRY | TOO_LARGE | TOO_LARGE_1000,
    -      CARRY | TOO_LARGE | TOO_LARGE_1000,
    -      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      FORBIDDEN,
    +      FORBIDDEN,
    +      FORBIDDEN,
    +      FORBIDDEN,
    +      FORBIDDEN,
           // ____1101 ________
    -      CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE,
    -      CARRY | TOO_LARGE | TOO_LARGE_1000,
    -      CARRY | TOO_LARGE | TOO_LARGE_1000
    +      FORBIDDEN,
    +      FORBIDDEN,
    +      FORBIDDEN
         );
         const simd8 byte_2_high = input.shr<4>().lookup_16(
           // ________ 0_______ 
    @@ -14718,15 +16458,6 @@ using namespace simd;
         );
         return (byte_1_high & byte_1_low & byte_2_high);
       }
    -  simdutf_really_inline simd8 check_multibyte_lengths(const simd8 input,
    -      const simd8 prev_input, const simd8 sc) {
    -    simd8 prev2 = input.prev<2>(prev_input);
    -    simd8 prev3 = input.prev<3>(prev_input);
    -    simd8 must23 = simd8(must_be_2_3_continuation(prev2, prev3));
    -    simd8 must23_80 = must23 & uint8_t(0x80);
    -    return must23_80 ^ sc;
    -  }
    -
     
       struct validating_transcoder {
         // If this is nonzero, there has been a UTF-8 error.
    @@ -14740,33 +16471,31 @@ using namespace simd;
           // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ lead bytes
           // (2, 3, 4-byte leads become large positive numbers instead of small negative numbers)
           simd8 prev1 = input.prev<1>(prev_input);
    -      simd8 sc = check_special_cases(input, prev1);
    -      this->error |= check_multibyte_lengths(input, prev_input, sc);
    +      this->error |= check_special_cases(input, prev1);
         }
     
     
    -
    -    simdutf_really_inline size_t convert(const char* in, size_t size, char32_t* utf32_output) {
    +    simdutf_really_inline size_t convert(const char* in, size_t size, char* latin1_output) {
           size_t pos = 0;
    -      char32_t* start{utf32_output};
    +      char* start{latin1_output};
           // In the worst case, we have the haswell kernel which can cause an overflow of
    -      // 8 bytes when calling convert_masked_utf8_to_utf32. If you skip the last 16 bytes,
    +      // 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the last 16 bytes,
           // and if the data is valid, then it is entirely safe because 16 UTF-8 bytes generate
           // much more than 8 bytes. However, you cannot generally assume that you have valid
    -      // UTF-8 input, so we are going to go back from the end counting 4 leading bytes,
    +      // UTF-8 input, so we are going to go back from the end counting 8 leading bytes,
           // to give us a good margin.
           size_t leading_byte = 0;
           size_t margin = size;
    -      for(; margin > 0 && leading_byte < 4; margin--) {
    -        leading_byte += (int8_t(in[margin-1]) > -65);
    +      for(; margin > 0 && leading_byte < 8; margin--) {
    +        leading_byte += (int8_t(in[margin-1]) > -65); //twos complement of -65 is 1011 1111 ...
           }
    -      // If the input is long enough, then we have that margin-1 is the fourth last leading byte.
    +      // If the input is long enough, then we have that margin-1 is the eight last leading byte.
           const size_t safety_margin = size - margin + 1; // to avoid overruns!
           while(pos + 64 + safety_margin <= size) {
             simd8x64 input(reinterpret_cast(in + pos));
             if(input.is_ascii()) {
    -          input.store_ascii_as_utf32(utf32_output);
    -          utf32_output += 64;
    +          input.store((int8_t*)latin1_output);
    +          latin1_output += 64;
               pos += 64;
             } else {
               // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    @@ -14782,7 +16511,7 @@ using namespace simd;
                 this->check_utf8_bytes(input.chunks[2], input.chunks[1]);
                 this->check_utf8_bytes(input.chunks[3], input.chunks[2]);
               }
    -          uint64_t utf8_continuation_mask = input.lt(-65 + 1);
    +          uint64_t utf8_continuation_mask = input.lt(-65 + 1); // -64 is 1100 0000 in twos complement. Note: in this case, we also have ASCII to account for.
               uint64_t utf8_leading_mask = ~utf8_continuation_mask;
               uint64_t utf8_end_of_code_point_mask = utf8_leading_mask>>1;
               // We process in blocks of up to 12 bytes except possibly
    @@ -14800,8 +16529,8 @@ using namespace simd;
                 // for this section of the code. Hence, there is a limit
                 // to how much we can further increase this latency before
                 // it seriously harms performance.
    -            size_t consumed = convert_masked_utf8_to_utf32(in + pos,
    -                            utf8_end_of_code_point_mask, utf32_output);
    +            size_t consumed = convert_masked_utf8_to_latin1(in + pos,
    +                            utf8_end_of_code_point_mask, latin1_output);
                 pos += consumed;
                 utf8_end_of_code_point_mask >>= consumed;
               }
    @@ -14813,34 +16542,34 @@ using namespace simd;
           }
           if(errors()) { return 0; }
           if(pos < size) {
    -        size_t howmany  = scalar::utf8_to_utf32::convert(in + pos, size - pos, utf32_output);
    +        size_t howmany  = scalar::utf8_to_latin1::convert(in + pos, size - pos, latin1_output);
             if(howmany == 0) { return 0; }
    -        utf32_output += howmany;
    +        latin1_output += howmany;
           }
    -      return utf32_output - start;
    +      return latin1_output - start;
         }
     
    -    simdutf_really_inline result convert_with_errors(const char* in, size_t size, char32_t* utf32_output) {
    +    simdutf_really_inline result convert_with_errors(const char* in, size_t size, char* latin1_output) {
           size_t pos = 0;
    -      char32_t* start{utf32_output};
    +      char* start{latin1_output};
           // In the worst case, we have the haswell kernel which can cause an overflow of
    -      // 8 bytes when calling convert_masked_utf8_to_utf32. If you skip the last 16 bytes,
    +      // 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the last 16 bytes,
           // and if the data is valid, then it is entirely safe because 16 UTF-8 bytes generate
           // much more than 8 bytes. However, you cannot generally assume that you have valid
    -      // UTF-8 input, so we are going to go back from the end counting 4 leading bytes,
    +      // UTF-8 input, so we are going to go back from the end counting 8 leading bytes,
           // to give us a good margin.
           size_t leading_byte = 0;
           size_t margin = size;
    -      for(; margin > 0 && leading_byte < 4; margin--) {
    +      for(; margin > 0 && leading_byte < 8; margin--) {
             leading_byte += (int8_t(in[margin-1]) > -65);
           }
    -      // If the input is long enough, then we have that margin-1 is the fourth last leading byte.
    +      // If the input is long enough, then we have that margin-1 is the eight last leading byte.
           const size_t safety_margin = size - margin + 1; // to avoid overruns!
           while(pos + 64 + safety_margin <= size) {
             simd8x64 input(reinterpret_cast(in + pos));
             if(input.is_ascii()) {
    -          input.store_ascii_as_utf32(utf32_output);
    -          utf32_output += 64;
    +          input.store((int8_t*)latin1_output);
    +          latin1_output += 64;
               pos += 64;
             } else {
               // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    @@ -14857,7 +16586,9 @@ using namespace simd;
                 this->check_utf8_bytes(input.chunks[3], input.chunks[2]);
               }
               if (errors()) {
    -            result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf32_output);
    +            // rewind_and_convert_with_errors will seek a potential error from in+pos onward,
    +            // with the ability to go back up to pos bytes, and read size-pos bytes forward.
    +            result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors(pos, in + pos, size - pos, latin1_output);
                 res.count += pos;
                 return res;
               }
    @@ -14879,8 +16610,102 @@ using namespace simd;
                 // for this section of the code. Hence, there is a limit
                 // to how much we can further increase this latency before
                 // it seriously harms performance.
    -            size_t consumed = convert_masked_utf8_to_utf32(in + pos,
    -                            utf8_end_of_code_point_mask, utf32_output);
    +            size_t consumed = convert_masked_utf8_to_latin1(in + pos,
    +                            utf8_end_of_code_point_mask, latin1_output);
    +            pos += consumed;
    +            utf8_end_of_code_point_mask >>= consumed;
    +          }
    +          // At this point there may remain between 0 and 12 bytes in the
    +          // 64-byte block. These bytes will be processed again. So we have an
    +          // 80% efficiency (in the worst case). In practice we expect an
    +          // 85% to 90% efficiency.
    +        }
    +      }
    +      if(errors()) {
    +        // rewind_and_convert_with_errors will seek a potential error from in+pos onward,
    +        // with the ability to go back up to pos bytes, and read size-pos bytes forward.
    +        result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors(pos, in + pos, size - pos, latin1_output);
    +        res.count += pos;
    +        return res;
    +      }
    +      if(pos < size) {
    +        // rewind_and_convert_with_errors will seek a potential error from in+pos onward,
    +        // with the ability to go back up to pos bytes, and read size-pos bytes forward.
    +        result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors(pos, in + pos, size - pos, latin1_output);
    +        if (res.error) {    // In case of error, we want the error position
    +          res.count += pos;
    +          return res;
    +        } else {    // In case of success, we want the number of word written
    +          latin1_output += res.count;
    +        }
    +      }
    +      return result(error_code::SUCCESS, latin1_output - start);
    +    }
    +
    +    simdutf_really_inline bool errors() const {
    +      return this->error.any_bits_set_anywhere();
    +    }
    +
    +  }; // struct utf8_checker
    +} // utf8_to_latin1 namespace
    +} // unnamed namespace
    +} // namespace arm64
    +} // namespace simdutf
    +/* end file src/generic/utf8_to_latin1/utf8_to_latin1.h */
    +/* begin file src/generic/utf8_to_latin1/valid_utf8_to_latin1.h */
    +
    +
    +namespace simdutf {
    +namespace arm64 {
    +namespace {
    +namespace utf8_to_latin1 {
    +using namespace simd;
    +
    +
    +    simdutf_really_inline size_t convert_valid(const char* in, size_t size, char* latin1_output) {
    +      size_t pos = 0;
    +      char* start{latin1_output};
    +      // In the worst case, we have the haswell kernel which can cause an overflow of
    +      // 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the last 16 bytes,
    +      // and if the data is valid, then it is entirely safe because 16 UTF-8 bytes generate
    +      // much more than 8 bytes. However, you cannot generally assume that you have valid
    +      // UTF-8 input, so we are going to go back from the end counting 8 leading bytes,
    +      // to give us a good margin.
    +      size_t leading_byte = 0;
    +      size_t margin = size;
    +      for(; margin > 0 && leading_byte < 8; margin--) {
    +        leading_byte += (int8_t(in[margin-1]) > -65); //twos complement of -65 is 1011 1111 ...
    +      }
    +      // If the input is long enough, then we have that margin-1 is the eight last leading byte.
    +      const size_t safety_margin = size - margin + 1; // to avoid overruns!
    +      while(pos + 64 + safety_margin <= size) {
    +        simd8x64 input(reinterpret_cast(in + pos));
    +        if(input.is_ascii()) {
    +          input.store((int8_t*)latin1_output);
    +          latin1_output += 64;
    +          pos += 64;
    +        } else {
    +          // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    +          uint64_t utf8_continuation_mask = input.lt(-65 + 1); // -64 is 1100 0000 in twos complement. Note: in this case, we also have ASCII to account for.
    +          uint64_t utf8_leading_mask = ~utf8_continuation_mask;
    +          uint64_t utf8_end_of_code_point_mask = utf8_leading_mask>>1;
    +          // We process in blocks of up to 12 bytes except possibly
    +          // for fast paths which may process up to 16 bytes. For the
    +          // slow path to work, we should have at least 12 input bytes left.
    +          size_t max_starting_point = (pos + 64) - 12;
    +          // Next loop is going to run at least five times.
    +          while(pos < max_starting_point) {
    +            // Performance note: our ability to compute 'consumed' and
    +            // then shift and recompute is critical. If there is a
    +            // latency of, say, 4 cycles on getting 'consumed', then
    +            // the inner loop might have a total latency of about 6 cycles.
    +            // Yet we process between 6 to 12 inputs bytes, thus we get
    +            // a speed limit between 1 cycle/byte and 0.5 cycle/byte
    +            // for this section of the code. Hence, there is a limit
    +            // to how much we can further increase this latency before
    +            // it seriously harms performance.
    +            size_t consumed = convert_masked_utf8_to_latin1(in + pos,
    +                            utf8_end_of_code_point_mask, latin1_output);
                 pos += consumed;
                 utf8_end_of_code_point_mask >>= consumed;
               }
    @@ -14890,146 +16715,22 @@ using namespace simd;
               // 85% to 90% efficiency.
             }
           }
    -      if(errors()) {
    -        result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf32_output);
    -        res.count += pos;
    -        return res;
    -      }
           if(pos < size) {
    -        result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf32_output);
    -        if (res.error) {    // In case of error, we want the error position
    -          res.count += pos;
    -          return res;
    -        } else {    // In case of success, we want the number of word written
    -          utf32_output += res.count;
    -        }
    +        size_t howmany  = scalar::utf8_to_latin1::convert_valid(in + pos, size - pos, latin1_output);
    +        latin1_output += howmany;
           }
    -      return result(error_code::SUCCESS, utf32_output - start);
    -    }
    -
    -    simdutf_really_inline bool errors() const {
    -      return this->error.any_bits_set_anywhere();
    -    }
    -
    -  }; // struct utf8_checker
    -} // utf8_to_utf32 namespace
    -} // unnamed namespace
    -} // namespace arm64
    -} // namespace simdutf
    -/* end file src/generic/utf8_to_utf32/utf8_to_utf32.h */
    -// other functions
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8.h
    -/* begin file src/generic/utf8.h */
    -
    -namespace simdutf {
    -namespace arm64 {
    -namespace {
    -namespace utf8 {
    -
    -using namespace simd;
    -
    -simdutf_really_inline size_t count_code_points(const char* in, size_t size) {
    -    size_t pos = 0;
    -    size_t count = 0;
    -    for(;pos + 64 <= size; pos += 64) {
    -      simd8x64 input(reinterpret_cast(in + pos));
    -      uint64_t utf8_continuation_mask = input.lt(-65 + 1);
    -      count += 64 - count_ones(utf8_continuation_mask);
    -    }
    -    return count + scalar::utf8::count_code_points(in + pos, size - pos);
    -}
    -
    -
    -simdutf_really_inline size_t utf16_length_from_utf8(const char* in, size_t size) {
    -    size_t pos = 0;
    -    size_t count = 0;
    -    // This algorithm could no doubt be improved!
    -    for(;pos + 64 <= size; pos += 64) {
    -      simd8x64 input(reinterpret_cast(in + pos));
    -      uint64_t utf8_continuation_mask = input.lt(-65 + 1);
    -      // We count one word for anything that is not a continuation (so
    -      // leading bytes).
    -      count += 64 - count_ones(utf8_continuation_mask);
    -      int64_t utf8_4byte = input.gteq_unsigned(240);
    -      count += count_ones(utf8_4byte);
    -    }
    -    return count + scalar::utf8::utf16_length_from_utf8(in + pos, size - pos);
    -}
    -
    -
    -simdutf_really_inline size_t utf32_length_from_utf8(const char* in, size_t size) {
    -    return count_code_points(in, size);
    -}
    -} // utf8 namespace
    -} // unnamed namespace
    -} // namespace arm64
    -} // namespace simdutf
    -/* end file src/generic/utf8.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf16.h
    -/* begin file src/generic/utf16.h */
    -namespace simdutf {
    -namespace arm64 {
    -namespace {
    -namespace utf16 {
    -
    -template 
    -simdutf_really_inline size_t count_code_points(const char16_t* in, size_t size) {
    -    size_t pos = 0;
    -    size_t count = 0;
    -    for(;pos + 32 <= size; pos += 32) {
    -      simd16x32 input(reinterpret_cast(in + pos));
    -      if (!match_system(big_endian)) input.swap_bytes();
    -      uint64_t not_pair = input.not_in_range(0xDC00, 0xDFFF);
    -      count += count_ones(not_pair) / 2;
    -    }
    -    return count + scalar::utf16::count_code_points(in + pos, size - pos);
    -}
    -
    -template 
    -simdutf_really_inline size_t utf8_length_from_utf16(const char16_t* in, size_t size) {
    -    size_t pos = 0;
    -    size_t count = 0;
    -    // This algorithm could no doubt be improved!
    -    for(;pos + 32 <= size; pos += 32) {
    -      simd16x32 input(reinterpret_cast(in + pos));
    -      if (!match_system(big_endian)) input.swap_bytes();
    -      uint64_t ascii_mask = input.lteq(0x7F);
    -      uint64_t twobyte_mask = input.lteq(0x7FF);
    -      uint64_t not_pair_mask = input.not_in_range(0xD800, 0xDFFF);
    -
    -      size_t ascii_count = count_ones(ascii_mask) / 2;
    -      size_t twobyte_count = count_ones(twobyte_mask & ~ ascii_mask) / 2;
    -      size_t threebyte_count = count_ones(not_pair_mask & ~ twobyte_mask) / 2;
    -      size_t fourbyte_count = 32 - count_ones(not_pair_mask) / 2;
    -      count += 2 * fourbyte_count + 3 * threebyte_count + 2 * twobyte_count + ascii_count;
    +      return latin1_output - start;
         }
    -    return count + scalar::utf16::utf8_length_from_utf16(in + pos, size - pos);
    -}
    -
    -template 
    -simdutf_really_inline size_t utf32_length_from_utf16(const char16_t* in, size_t size) {
    -    return count_code_points(in, size);
    -}
     
    -simdutf_really_inline void change_endianness_utf16(const char16_t* in, size_t size, char16_t* output) {
    -  size_t pos = 0;
    -
    -  while (pos + 32 <= size) {
    -    simd16x32 input(reinterpret_cast(in + pos));
    -    input.swap_bytes();
    -    input.store(reinterpret_cast(output));
    -    pos += 32;
    -    output += 32;
       }
    +}   // utf8_to_latin1 namespace
    +}   // unnamed namespace
    +}   // namespace arm64
    + // namespace simdutf
    +/* end file src/generic/utf8_to_latin1/valid_utf8_to_latin1.h */
     
    -  scalar::utf16::change_endianness_utf16(in + pos, size - pos, output);
    -}
    +// placeholder scalars
     
    -} // utf16
    -} // unnamed namespace
    -} // namespace arm64
    -} // namespace simdutf
    -/* end file src/generic/utf16.h */
     //
     // Implementation-specific overrides
     //
    @@ -15124,6 +16825,65 @@ simdutf_warn_unused result implementation::validate_utf32_with_errors(const char
       }
     }
     
    +simdutf_warn_unused size_t implementation::convert_latin1_to_utf8(const char * buf, size_t len, char* utf8_output) const noexcept {
    +  std::pair ret = arm_convert_latin1_to_utf8(buf, len, utf8_output);
    +  size_t converted_chars = ret.second - utf8_output;
    +
    +  if (ret.first != buf + len) {
    +    const size_t scalar_converted_chars = scalar::latin1_to_utf8::convert(
    +      ret.first, len - (ret.first - buf), ret.second);
    +    converted_chars += scalar_converted_chars;
    +  }
    +  return converted_chars;
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_latin1_to_utf16le(const char* buf, size_t len, char16_t* utf16_output) const noexcept {
    +  std::pair ret = arm_convert_latin1_to_utf16(buf, len, utf16_output);
    +  size_t converted_chars = ret.second - utf16_output;
    +  if (ret.first != buf + len) {
    +    const size_t scalar_converted_chars = scalar::latin1_to_utf16::convert(
    +      ret.first, len - (ret.first - buf), ret.second);
    +    converted_chars += scalar_converted_chars;
    +  }
    +  return converted_chars;
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_latin1_to_utf16be(const char* buf, size_t len, char16_t* utf16_output) const noexcept {
    +  std::pair ret = arm_convert_latin1_to_utf16(buf, len, utf16_output);
    +  size_t converted_chars = ret.second - utf16_output;
    +  if (ret.first != buf + len) {
    +    const size_t scalar_converted_chars = scalar::latin1_to_utf16::convert(
    +      ret.first, len - (ret.first - buf), ret.second);
    +    converted_chars += scalar_converted_chars;
    +  }
    +  return converted_chars;
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_latin1_to_utf32(const char* buf, size_t len, char32_t* utf32_output) const noexcept {
    +  std::pair ret = arm_convert_latin1_to_utf32(buf, len, utf32_output);
    +  size_t converted_chars = ret.second - utf32_output;
    +  if (ret.first != buf + len) {
    +    const size_t scalar_converted_chars = scalar::latin1_to_utf32::convert(
    +      ret.first, len - (ret.first - buf), ret.second);
    +    converted_chars += scalar_converted_chars;
    +  }
    +  return converted_chars;
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_utf8_to_latin1(const char* buf, size_t len, char* latin1_output) const noexcept {
    +  utf8_to_latin1::validating_transcoder converter;
    +  return converter.convert(buf, len, latin1_output);
    +}
    +
    +simdutf_warn_unused result implementation::convert_utf8_to_latin1_with_errors(const char* buf, size_t len, char* latin1_output) const noexcept {
    +  utf8_to_latin1::validating_transcoder converter;
    +  return converter.convert_with_errors(buf, len, latin1_output);
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_latin1(const char* buf, size_t len, char* latin1_output) const noexcept {
    +  return arm64::utf8_to_latin1::convert_valid(buf,len,latin1_output);
    +}
    +
     simdutf_warn_unused size_t implementation::convert_utf8_to_utf16le(const char* buf, size_t len, char16_t* utf16_output) const noexcept {
       utf8_to_utf16::validating_transcoder converter;
       return converter.convert(buf, len, utf16_output);
    @@ -15169,6 +16929,78 @@ simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf32(const cha
       return utf8_to_utf32::convert_valid(input, size,  utf32_output);
     }
     
    +simdutf_warn_unused size_t implementation::convert_utf16le_to_latin1(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  std::pair ret = arm_convert_utf16_to_latin1(buf, len, latin1_output);
    +  if (ret.first == nullptr) { return 0; }
    +  size_t saved_bytes = ret.second - latin1_output;
    +
    +  if (ret.first != buf + len) {
    +    const size_t scalar_saved_bytes = scalar::utf16_to_latin1::convert(
    +                                        ret.first, len - (ret.first - buf), ret.second);
    +    if (scalar_saved_bytes == 0) { return 0; }
    +    saved_bytes += scalar_saved_bytes;
    +  }
    +  return saved_bytes;
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_utf16be_to_latin1(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  std::pair ret = arm_convert_utf16_to_latin1(buf, len, latin1_output);
    +  if (ret.first == nullptr) { return 0; }
    +  size_t saved_bytes = ret.second - latin1_output;
    +
    +  if (ret.first != buf + len) {
    +    const size_t scalar_saved_bytes = scalar::utf16_to_latin1::convert(
    +                                        ret.first, len - (ret.first - buf), ret.second);
    +    if (scalar_saved_bytes == 0) { return 0; }
    +    saved_bytes += scalar_saved_bytes;
    +  }
    +  return saved_bytes;
    +}
    +
    +simdutf_warn_unused result implementation::convert_utf16le_to_latin1_with_errors(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  std::pair ret = arm_convert_utf16_to_latin1_with_errors(buf, len, latin1_output);
    +  if (ret.first.error) { return ret.first; }  // Can return directly since scalar fallback already found correct ret.first.count
    +  if (ret.first.count != len) { // All good so far, but not finished
    +    result scalar_res = scalar::utf16_to_latin1::convert_with_errors(
    +                                        buf + ret.first.count, len - ret.first.count, ret.second);
    +    if (scalar_res.error) {
    +      scalar_res.count += ret.first.count;
    +      return scalar_res;
    +    } else {
    +      ret.second += scalar_res.count;
    +    }
    +  }
    +  ret.first.count = ret.second - latin1_output;   // Set count to the number of 8-bit code units written
    +  return ret.first;
    +}
    +
    +simdutf_warn_unused result implementation::convert_utf16be_to_latin1_with_errors(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  std::pair ret = arm_convert_utf16_to_latin1_with_errors(buf, len, latin1_output);
    +  if (ret.first.error) { return ret.first; }  // Can return directly since scalar fallback already found correct ret.first.count
    +  if (ret.first.count != len) { // All good so far, but not finished
    +    result scalar_res = scalar::utf16_to_latin1::convert_with_errors(
    +                                        buf + ret.first.count, len - ret.first.count, ret.second);
    +    if (scalar_res.error) {
    +      scalar_res.count += ret.first.count;
    +      return scalar_res;
    +    } else {
    +      ret.second += scalar_res.count;
    +    }
    +  }
    +  ret.first.count = ret.second - latin1_output;   // Set count to the number of 8-bit code units written
    +  return ret.first;
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_latin1(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  // optimization opportunity: implement a custom function.
    +  return convert_utf16be_to_latin1(buf, len, latin1_output);
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_latin1(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  // optimization opportunity: implement a custom function.
    +  return convert_utf16le_to_latin1(buf, len, latin1_output);
    +}
    +
     simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8(const char16_t* buf, size_t len, char* utf8_output) const noexcept {
       std::pair ret = arm_convert_utf16_to_utf8(buf, len, utf8_output);
       if (ret.first == nullptr) { return 0; }
    @@ -15196,7 +17028,7 @@ simdutf_warn_unused size_t implementation::convert_utf16be_to_utf8(const char16_
     }
     
     simdutf_warn_unused result implementation::convert_utf16le_to_utf8_with_errors(const char16_t* buf, size_t len, char* utf8_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = arm_convert_utf16_to_utf8_with_errors(buf, len, utf8_output);
       if (ret.first.error) { return ret.first; }  // Can return directly since scalar fallback already found correct ret.first.count
       if (ret.first.count != len) { // All good so far, but not finished
    @@ -15209,12 +17041,12 @@ simdutf_warn_unused result implementation::convert_utf16le_to_utf8_with_errors(c
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf8_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf8_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
     simdutf_warn_unused result implementation::convert_utf16be_to_utf8_with_errors(const char16_t* buf, size_t len, char* utf8_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = arm_convert_utf16_to_utf8_with_errors(buf, len, utf8_output);
       if (ret.first.error) { return ret.first; }  // Can return directly since scalar fallback already found correct ret.first.count
       if (ret.first.count != len) { // All good so far, but not finished
    @@ -15227,7 +17059,7 @@ simdutf_warn_unused result implementation::convert_utf16be_to_utf8_with_errors(c
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf8_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf8_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
    @@ -15253,7 +17085,7 @@ simdutf_warn_unused size_t implementation::convert_utf32_to_utf8(const char32_t*
     }
     
     simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors(const char32_t* buf, size_t len, char* utf8_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = arm_convert_utf32_to_utf8_with_errors(buf, len, utf8_output);
       if (ret.first.count != len) {
         result scalar_res = scalar::utf32_to_utf8::convert_with_errors(
    @@ -15265,7 +17097,7 @@ simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors(con
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf8_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf8_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
    @@ -15296,7 +17128,7 @@ simdutf_warn_unused size_t implementation::convert_utf16be_to_utf32(const char16
     }
     
     simdutf_warn_unused result implementation::convert_utf16le_to_utf32_with_errors(const char16_t* buf, size_t len, char32_t* utf32_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = arm_convert_utf16_to_utf32_with_errors(buf, len, utf32_output);
       if (ret.first.error) { return ret.first; }  // Can return directly since scalar fallback already found correct ret.first.count
       if (ret.first.count != len) { // All good so far, but not finished
    @@ -15309,12 +17141,12 @@ simdutf_warn_unused result implementation::convert_utf16le_to_utf32_with_errors(
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf32_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf32_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
     simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors(const char16_t* buf, size_t len, char32_t* utf32_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = arm_convert_utf16_to_utf32_with_errors(buf, len, utf32_output);
       if (ret.first.error) { return ret.first; }  // Can return directly since scalar fallback already found correct ret.first.count
       if (ret.first.count != len) { // All good so far, but not finished
    @@ -15327,11 +17159,56 @@ simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors(
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf32_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf32_output;   // Set count to the number of 8-bit code units written
    +  return ret.first;
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_utf32_to_latin1(const char32_t* buf, size_t len, char* latin1_output) const noexcept {
    +  std::pair ret = arm_convert_utf32_to_latin1(buf, len, latin1_output);
    +  if (ret.first == nullptr) { return 0; }
    +  size_t saved_bytes = ret.second - latin1_output;
    +
    +  if (ret.first != buf + len) {
    +    const size_t scalar_saved_bytes = scalar::utf32_to_latin1::convert(
    +                                        ret.first, len - (ret.first - buf), ret.second);
    +    if (scalar_saved_bytes == 0) { return 0; }
    +    saved_bytes += scalar_saved_bytes;
    +  }
    +  return saved_bytes;
    +}
    +
    +simdutf_warn_unused result implementation::convert_utf32_to_latin1_with_errors(const char32_t* buf, size_t len, char* latin1_output) const noexcept {
    +  std::pair ret = arm_convert_utf32_to_latin1_with_errors(buf, len, latin1_output);
    +  if (ret.first.error) { return ret.first; }  // Can return directly since scalar fallback already found correct ret.first.count
    +  if (ret.first.count != len) { // All good so far, but not finished
    +    result scalar_res = scalar::utf32_to_latin1::convert_with_errors(
    +                                        buf + ret.first.count, len - ret.first.count, ret.second);
    +    if (scalar_res.error) {
    +      scalar_res.count += ret.first.count;
    +      return scalar_res;
    +    } else {
    +      ret.second += scalar_res.count;
    +    }
    +  }
    +  ret.first.count = ret.second - latin1_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
    +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_latin1(const char32_t* buf, size_t len, char* latin1_output) const noexcept {
    +  std::pair ret = arm_convert_utf32_to_latin1(buf, len, latin1_output);
    +  if (ret.first == nullptr) { return 0; }
    +  size_t saved_bytes = ret.second - latin1_output;
    +
    +  if (ret.first != buf + len) {
    +    const size_t scalar_saved_bytes = scalar::utf32_to_latin1::convert_valid(
    +                                        ret.first, len - (ret.first - buf), ret.second);
    +    saved_bytes += scalar_saved_bytes;
    +  }
    +  return saved_bytes;
    +}
    +
     simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf8(const char32_t* buf, size_t len, char* utf8_output) const noexcept {
    +  // optimization opportunity: implement a custom function.
       return convert_utf32_to_utf8(buf, len, utf8_output);
     }
     
    @@ -15362,7 +17239,7 @@ simdutf_warn_unused size_t implementation::convert_utf32_to_utf16be(const char32
     }
     
     simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors(const char32_t* buf, size_t len, char16_t* utf16_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = arm_convert_utf32_to_utf16_with_errors(buf, len, utf16_output);
       if (ret.first.count != len) {
         result scalar_res = scalar::utf32_to_utf16::convert_with_errors(
    @@ -15374,12 +17251,12 @@ simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors(
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf16_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf16_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
     simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors(const char32_t* buf, size_t len, char16_t* utf16_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = arm_convert_utf32_to_utf16_with_errors(buf, len, utf16_output);
       if (ret.first.count != len) {
         result scalar_res = scalar::utf32_to_utf16::convert_with_errors(
    @@ -15391,7 +17268,7 @@ simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors(
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf16_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf16_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
    @@ -15427,14 +17304,58 @@ simdutf_warn_unused size_t implementation::count_utf8(const char * input, size_t
       return utf8::count_code_points(input, length);
     }
     
    +simdutf_warn_unused size_t implementation::latin1_length_from_utf8(const char* buf, size_t len) const noexcept {
    +  return count_utf8(buf,len);
    +}
    +
    +simdutf_warn_unused size_t implementation::latin1_length_from_utf16(size_t length) const noexcept {
    +  return scalar::utf16::latin1_length_from_utf16(length);
    +}
    +
    +simdutf_warn_unused size_t implementation::latin1_length_from_utf32(size_t length) const noexcept {
    +  return scalar::utf32::latin1_length_from_utf32(length);
    +}
    +
    +simdutf_warn_unused size_t implementation::utf8_length_from_latin1(const char * input, size_t length) const noexcept {
    +  // See https://lemire.me/blog/2023/05/15/computing-the-utf-8-size-of-a-latin-1-string-quickly-arm-neon-edition/
    +  // credit to Pete Cawley
    +  const uint8_t *data = reinterpret_cast(input);
    +  uint64_t result = 0;
    +  const int lanes = sizeof(uint8x16_t);
    +  uint8_t rem = length % lanes;
    +  const uint8_t *simd_end = data + (length / lanes) * lanes;
    +  const uint8x16_t threshold = vdupq_n_u8(0x80);
    +  for (; data < simd_end; data += lanes) {
    +    // load 16 bytes
    +    uint8x16_t input_vec = vld1q_u8(data);
    +    // compare to threshold (0x80)
    +    uint8x16_t withhighbit = vcgeq_u8(input_vec, threshold);
    +    // vertical addition
    +    result -= vaddvq_s8(vreinterpretq_s8_u8(withhighbit));
    +  }
    +  return result + (length / lanes) * lanes + scalar::latin1::utf8_length_from_latin1((const char*)simd_end, rem);
    +}
    +
     simdutf_warn_unused size_t implementation::utf8_length_from_utf16le(const char16_t * input, size_t length) const noexcept {
       return utf16::utf8_length_from_utf16(input, length);
     }
     
    -simdutf_warn_unused size_t implementation::utf8_length_from_utf16be(const char16_t * input, size_t length) const noexcept {
    -  return utf16::utf8_length_from_utf16(input, length);
    +simdutf_warn_unused size_t implementation::utf8_length_from_utf16be(const char16_t * input, size_t length) const noexcept {
    +  return utf16::utf8_length_from_utf16(input, length);
    +}
    +
    +
    +simdutf_warn_unused size_t implementation::utf16_length_from_latin1(size_t length) const noexcept {
    +  return scalar::latin1::utf16_length_from_latin1(length);
    +}
    +
    +
    +simdutf_warn_unused size_t implementation::utf32_length_from_latin1(size_t length) const noexcept {
    +  return scalar::latin1::utf32_length_from_latin1(length);
     }
     
    +
    +
     simdutf_warn_unused size_t implementation::utf32_length_from_utf16le(const char16_t * input, size_t length) const noexcept {
       return utf16::utf32_length_from_utf16(input, length);
     }
    @@ -15494,21 +17415,18 @@ simdutf_warn_unused size_t implementation::utf16_length_from_utf32(const char32_
     }
     
     simdutf_warn_unused size_t implementation::utf32_length_from_utf8(const char * input, size_t length) const noexcept {
    -  return utf8::utf32_length_from_utf8(input, length);
    +  return utf8::count_code_points(input, length);
     }
     
     } // namespace arm64
     } // namespace simdutf
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/arm64/end.h
     /* begin file src/simdutf/arm64/end.h */
     /* end file src/simdutf/arm64/end.h */
     /* end file src/arm64/implementation.cpp */
     #endif
     #if SIMDUTF_IMPLEMENTATION_FALLBACK
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=fallback/implementation.cpp
     /* begin file src/fallback/implementation.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/fallback/begin.h
     /* begin file src/simdutf/fallback/begin.h */
     // redefining SIMDUTF_IMPLEMENTATION to "fallback"
     // #define SIMDUTF_IMPLEMENTATION fallback
    @@ -15521,6 +17439,7 @@ simdutf_warn_unused size_t implementation::utf32_length_from_utf8(const char * i
     
     
     
    +
     namespace simdutf {
     namespace fallback {
     
    @@ -15541,75 +17460,103 @@ simdutf_warn_unused int implementation::detect_encodings(const char * input, siz
     }
     
     simdutf_warn_unused bool implementation::validate_utf8(const char *buf, size_t len) const noexcept {
    -    return scalar::utf8::validate(buf, len);
    +  return scalar::utf8::validate(buf, len);
     }
     
     simdutf_warn_unused result implementation::validate_utf8_with_errors(const char *buf, size_t len) const noexcept {
    -    return scalar::utf8::validate_with_errors(buf, len);
    +  return scalar::utf8::validate_with_errors(buf, len);
     }
     
     simdutf_warn_unused bool implementation::validate_ascii(const char *buf, size_t len) const noexcept {
    -    return scalar::ascii::validate(buf, len);
    +  return scalar::ascii::validate(buf, len);
     }
     
     simdutf_warn_unused result implementation::validate_ascii_with_errors(const char *buf, size_t len) const noexcept {
    -    return scalar::ascii::validate_with_errors(buf, len);
    +  return scalar::ascii::validate_with_errors(buf, len);
     }
     
     simdutf_warn_unused bool implementation::validate_utf16le(const char16_t *buf, size_t len) const noexcept {
    -    return scalar::utf16::validate(buf, len);
    +  return scalar::utf16::validate(buf, len);
     }
     
     simdutf_warn_unused bool implementation::validate_utf16be(const char16_t *buf, size_t len) const noexcept {
    -    return scalar::utf16::validate(buf, len);
    +  return scalar::utf16::validate(buf, len);
     }
     
     simdutf_warn_unused result implementation::validate_utf16le_with_errors(const char16_t *buf, size_t len) const noexcept {
    -    return scalar::utf16::validate_with_errors(buf, len);
    +  return scalar::utf16::validate_with_errors(buf, len);
     }
     
     simdutf_warn_unused result implementation::validate_utf16be_with_errors(const char16_t *buf, size_t len) const noexcept {
    -    return scalar::utf16::validate_with_errors(buf, len);
    +  return scalar::utf16::validate_with_errors(buf, len);
     }
     
     simdutf_warn_unused bool implementation::validate_utf32(const char32_t *buf, size_t len) const noexcept {
    -    return scalar::utf32::validate(buf, len);
    +  return scalar::utf32::validate(buf, len);
     }
     
     simdutf_warn_unused result implementation::validate_utf32_with_errors(const char32_t *buf, size_t len) const noexcept {
    -    return scalar::utf32::validate_with_errors(buf, len);
    +  return scalar::utf32::validate_with_errors(buf, len);
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_latin1_to_utf8(const char * buf, size_t len, char* utf8_output) const noexcept {
    +  return scalar::latin1_to_utf8::convert(buf,len,utf8_output);
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_latin1_to_utf16le(const char* buf, size_t len, char16_t* utf16_output) const noexcept {
    +  return scalar::latin1_to_utf16::convert(buf, len, utf16_output);
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_latin1_to_utf16be(const char* buf, size_t len, char16_t* utf16_output) const noexcept {
    +  return scalar::latin1_to_utf16::convert(buf, len, utf16_output);
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_latin1_to_utf32(const char * buf, size_t len, char32_t* utf32_output) const noexcept {
    +  return scalar::latin1_to_utf32::convert(buf,len,utf32_output);
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_utf8_to_latin1(const char* buf, size_t len, char* latin1_output) const noexcept {
    +  return scalar::utf8_to_latin1::convert(buf, len, latin1_output);
    +}
    +
    +simdutf_warn_unused result implementation::convert_utf8_to_latin1_with_errors(const char* buf, size_t len, char* latin1_output) const noexcept {
    +  return scalar::utf8_to_latin1::convert_with_errors(buf, len, latin1_output);
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_latin1(const char* buf, size_t len, char* latin1_output) const noexcept {
    +  return scalar::utf8_to_latin1::convert_valid(buf, len, latin1_output);
     }
     
     simdutf_warn_unused size_t implementation::convert_utf8_to_utf16le(const char* buf, size_t len, char16_t* utf16_output) const noexcept {
    -   return scalar::utf8_to_utf16::convert(buf, len, utf16_output);
    +  return scalar::utf8_to_utf16::convert(buf, len, utf16_output);
     }
     
     simdutf_warn_unused size_t implementation::convert_utf8_to_utf16be(const char* buf, size_t len, char16_t* utf16_output) const noexcept {
    -   return scalar::utf8_to_utf16::convert(buf, len, utf16_output);
    +  return scalar::utf8_to_utf16::convert(buf, len, utf16_output);
     }
     
     simdutf_warn_unused result implementation::convert_utf8_to_utf16le_with_errors(const char* buf, size_t len, char16_t* utf16_output) const noexcept {
    -   return scalar::utf8_to_utf16::convert_with_errors(buf, len, utf16_output);
    +  return scalar::utf8_to_utf16::convert_with_errors(buf, len, utf16_output);
     }
     
     simdutf_warn_unused result implementation::convert_utf8_to_utf16be_with_errors(const char* buf, size_t len, char16_t* utf16_output) const noexcept {
    -   return scalar::utf8_to_utf16::convert_with_errors(buf, len, utf16_output);
    +  return scalar::utf8_to_utf16::convert_with_errors(buf, len, utf16_output);
     }
     
     simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16le(const char* buf, size_t len, char16_t* utf16_output) const noexcept {
    -   return scalar::utf8_to_utf16::convert_valid(buf, len, utf16_output);
    +  return scalar::utf8_to_utf16::convert_valid(buf, len, utf16_output);
     }
     
     simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16be(const char* buf, size_t len, char16_t* utf16_output) const noexcept {
    -   return scalar::utf8_to_utf16::convert_valid(buf, len, utf16_output);
    +  return scalar::utf8_to_utf16::convert_valid(buf, len, utf16_output);
     }
     
     simdutf_warn_unused size_t implementation::convert_utf8_to_utf32(const char* buf, size_t len, char32_t* utf32_output) const noexcept {
    -   return scalar::utf8_to_utf32::convert(buf, len, utf32_output);
    +  return scalar::utf8_to_utf32::convert(buf, len, utf32_output);
     }
     
     simdutf_warn_unused result implementation::convert_utf8_to_utf32_with_errors(const char* buf, size_t len, char32_t* utf32_output) const noexcept {
    -   return scalar::utf8_to_utf32::convert_with_errors(buf, len, utf32_output);
    +  return scalar::utf8_to_utf32::convert_with_errors(buf, len, utf32_output);
     }
     
     simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf32(const char* input, size_t size,
    @@ -15617,6 +17564,30 @@ simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf32(const cha
       return scalar::utf8_to_utf32::convert_valid(input, size,  utf32_output);
     }
     
    +simdutf_warn_unused size_t implementation::convert_utf16le_to_latin1(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  return scalar::utf16_to_latin1::convert(buf, len, latin1_output);
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_utf16be_to_latin1(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  return scalar::utf16_to_latin1::convert(buf, len, latin1_output);
    +}
    +
    +simdutf_warn_unused result implementation::convert_utf16le_to_latin1_with_errors(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  return scalar::utf16_to_latin1::convert_with_errors(buf, len, latin1_output);
    +}
    +
    +simdutf_warn_unused result implementation::convert_utf16be_to_latin1_with_errors(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  return scalar::utf16_to_latin1::convert_with_errors(buf, len, latin1_output);
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_latin1(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  return scalar::utf16_to_latin1::convert_valid(buf, len, latin1_output);
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_latin1(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  return scalar::utf16_to_latin1::convert_valid(buf, len, latin1_output);
    +}
    +
     simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8(const char16_t* buf, size_t len, char* utf8_output) const noexcept {
       return scalar::utf16_to_utf8::convert(buf, len, utf8_output);
     }
    @@ -15641,6 +17612,18 @@ simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf8(const c
       return scalar::utf16_to_utf8::convert_valid(buf, len, utf8_output);
     }
     
    +simdutf_warn_unused size_t implementation::convert_utf32_to_latin1(const char32_t* buf, size_t len, char* latin1_output) const noexcept {
    +  return scalar::utf32_to_latin1::convert(buf, len, latin1_output);
    +}
    +
    +simdutf_warn_unused result implementation::convert_utf32_to_latin1_with_errors(const char32_t* buf, size_t len, char* latin1_output) const noexcept {
    +  return scalar::utf32_to_latin1::convert_with_errors(buf, len, latin1_output);
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_latin1(const char32_t* buf, size_t len, char* latin1_output) const noexcept {
    +  return scalar::utf32_to_latin1::convert_valid(buf, len, latin1_output);
    +}
    +
     simdutf_warn_unused size_t implementation::convert_utf32_to_utf8(const char32_t* buf, size_t len, char* utf8_output) const noexcept {
       return scalar::utf32_to_utf8::convert(buf, len, utf8_output);
     }
    @@ -15717,6 +17700,22 @@ simdutf_warn_unused size_t implementation::count_utf8(const char * input, size_t
       return scalar::utf8::count_code_points(input, length);
     }
     
    +simdutf_warn_unused size_t implementation::latin1_length_from_utf8(const char* buf, size_t len) const noexcept {
    +  return scalar::utf8::count_code_points(buf,len);
    +}
    +
    +simdutf_warn_unused size_t implementation::latin1_length_from_utf16(size_t length) const noexcept {
    +  return scalar::utf16::latin1_length_from_utf16(length);
    +}
    +
    +simdutf_warn_unused size_t implementation::latin1_length_from_utf32(size_t length) const noexcept {
    +  return length;
    +}
    +
    +simdutf_warn_unused size_t implementation::utf8_length_from_latin1(const char * input, size_t length) const noexcept {
    +  return scalar::latin1::utf8_length_from_latin1(input,length);
    +}
    +
     simdutf_warn_unused size_t implementation::utf8_length_from_utf16le(const char16_t * input, size_t length) const noexcept {
       return scalar::utf16::utf8_length_from_utf16(input, length);
     }
    @@ -15733,6 +17732,10 @@ simdutf_warn_unused size_t implementation::utf32_length_from_utf16be(const char1
       return scalar::utf16::utf32_length_from_utf16(input, length);
     }
     
    +simdutf_warn_unused size_t implementation::utf16_length_from_latin1(size_t length) const noexcept {
    +  return scalar::latin1::utf16_length_from_latin1(length);
    +}
    +
     simdutf_warn_unused size_t implementation::utf16_length_from_utf8(const char * input, size_t length) const noexcept {
       return scalar::utf8::utf16_length_from_utf8(input, length);
     }
    @@ -15745,6 +17748,10 @@ simdutf_warn_unused size_t implementation::utf16_length_from_utf32(const char32_
       return scalar::utf32::utf16_length_from_utf32(input, length);
     }
     
    +simdutf_warn_unused size_t implementation::utf32_length_from_latin1(size_t length) const noexcept {
    +  return scalar::latin1::utf32_length_from_latin1(length);
    +}
    +
     simdutf_warn_unused size_t implementation::utf32_length_from_utf8(const char * input, size_t length) const noexcept {
       return scalar::utf8::count_code_points(input, length);
     }
    @@ -15752,17 +17759,14 @@ simdutf_warn_unused size_t implementation::utf32_length_from_utf8(const char * i
     } // namespace fallback
     } // namespace simdutf
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/fallback/end.h
     /* begin file src/simdutf/fallback/end.h */
     /* end file src/simdutf/fallback/end.h */
     /* end file src/fallback/implementation.cpp */
     #endif
     #if SIMDUTF_IMPLEMENTATION_ICELAKE
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=icelake/implementation.cpp
     /* begin file src/icelake/implementation.cpp */
     
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/icelake/begin.h
     /* begin file src/simdutf/icelake/begin.h */
     // redefining SIMDUTF_IMPLEMENTATION to "icelake"
     // #define SIMDUTF_IMPLEMENTATION icelake
    @@ -15783,7 +17787,6 @@ namespace {
     #ifndef SIMDUTF_ICELAKE_H
     #error "icelake.h must be included"
     #endif
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=icelake/icelake_utf8_common.inl.cpp
     /* begin file src/icelake/icelake_utf8_common.inl.cpp */
     // Common procedures for both validating and non-validating conversions from UTF-8.
     enum block_processing_mode { SIMDUTF_FULL, SIMDUTF_TAIL};
    @@ -15942,7 +17945,7 @@ simdutf_really_inline bool process_block_utf8_to_utf16(const char *&in, char16_t
           {
             // the location of 3-byte sequence start bytes in the input
             __mmask64 m3 = m34 & (b ^ m4);
    -        // words in Wout corresponding to 3-byte sequences.
    +        // code units in Wout corresponding to 3-byte sequences.
             __mmask32 M3 = __mmask32(_pext_u64(m3 << 2, mend));
             __m512i mask_08000800 = _mm512_set1_epi32(0x08000800);
             __mmask32 Msmall800 = _mm512_mask_cmplt_epu16_mask(M3, Wout, mask_08000800);
    @@ -16025,7 +18028,7 @@ simdutf_really_inline bool process_block_utf8_to_utf16(const char *&in, char16_t
         {
           // the location of 3-byte sequence start bytes in the input
           __mmask64 m3 = m34 & (b ^ m4);
    -      // words in Wout corresponding to 3-byte sequences.
    +      // code units in Wout corresponding to 3-byte sequences.
           __mmask32 M3 = __mmask32(_pext_u64(m3 << 2, mend));
           __m512i mask_08000800 = _mm512_set1_epi32(0x08000800);
           __mmask32 Msmall800 = _mm512_mask_cmplt_epu16_mask(M3, Wout, mask_08000800);
    @@ -16075,9 +18078,9 @@ simdutf_really_inline bool process_block_utf8_to_utf16(const char *&in, char16_t
         in += 64 - _lzcnt_u64(_pdep_u64(0xFFFFFFFF, continuation_or_ascii));
       }
       __m512i lead = _mm512_maskz_compress_epi8(leading, leading2byte);          // will contain zero for ascii, and the data
    -  lead = _mm512_cvtepu8_epi16(_mm512_castsi512_si256(lead));                 // ... zero extended into words
    +  lead = _mm512_cvtepu8_epi16(_mm512_castsi512_si256(lead));                 // ... zero extended into code units
       __m512i follow = _mm512_maskz_compress_epi8(continuation_or_ascii, input); // the last bytes of each sequence
    -  follow = _mm512_cvtepu8_epi16(_mm512_castsi512_si256(follow));             // ... zero extended into words
    +  follow = _mm512_cvtepu8_epi16(_mm512_castsi512_si256(follow));             // ... zero extended into code units
       lead = _mm512_slli_epi16(lead, 6);                                         // shifted into position
       __m512i final = _mm512_add_epi16(follow, lead);                            // combining lead and follow
     
    @@ -16100,13 +18103,13 @@ simdutf_really_inline bool process_block_utf8_to_utf16(const char *&in, char16_t
     
     
     /*
    -    utf32_to_utf16_masked converts `count` lower UTF-32 words
    +    utf32_to_utf16_masked converts `count` lower UTF-32 code units
         from input `utf32` into UTF-16. It differs from utf32_to_utf16
         in that it 'masks' the writes.
     
    -    Returns how many 16-bit words were stored.
    +    Returns how many 16-bit code units were stored.
     
    -    byteflip is used for flipping 16-bit words, and it should be
    +    byteflip is used for flipping 16-bit code units, and it should be
             __m512i byteflip = _mm512_setr_epi64(
                 0x0607040502030001,
                 0x0e0f0c0d0a0b0809,
    @@ -16139,7 +18142,7 @@ simdutf_really_inline size_t utf32_to_utf16_masked(const __m512i byteflip, __m51
         }
     
         {
    -        // build surrogate pair words in 32-bit lanes
    +        // build surrogate pair code units in 32-bit lanes
     
             //    t0 = 8 x [000000000000aaaa|aaaaaabbbbbbbbbb]
             const __m512i v_0001_0000 = _mm512_set1_epi32(0x00010000);
    @@ -16160,7 +18163,7 @@ simdutf_really_inline size_t utf32_to_utf16_masked(const __m512i byteflip, __m51
             const __m512i t3 = _mm512_ternarylogic_epi32(t2, v_fc00_fc00, v_d800_dc00, 0xba);
             const __m512i t4 = _mm512_mask_blend_epi32(sp_mask, utf32, t3);
             __m512i t5 = _mm512_ror_epi32(t4, 16);
    -        // Here we want to trim all of the upper 16-bit words from the 2-byte
    +        // Here we want to trim all of the upper 16-bit code units from the 2-byte
             // characters represented as 4-byte values. We can compute it from
             // sp_mask or the following... It can be more optimized!
             const  __mmask32 nonzero = _kor_mask32(0xaaaaaaaa,_mm512_cmpneq_epi16_mask(t5, _mm512_setzero_si512()));
    @@ -16176,12 +18179,12 @@ simdutf_really_inline size_t utf32_to_utf16_masked(const __m512i byteflip, __m51
     }
     
     /*
    -    utf32_to_utf16 converts `count` lower UTF-32 words
    +    utf32_to_utf16 converts `count` lower UTF-32 code units
         from input `utf32` into UTF-16. It may overflow.
     
    -    Returns how many 16-bit words were stored.
    +    Returns how many 16-bit code units were stored.
     
    -    byteflip is used for flipping 16-bit words, and it should be
    +    byteflip is used for flipping 16-bit code units, and it should be
             __m512i byteflip = _mm512_setr_epi64(
                 0x0607040502030001,
                 0x0e0f0c0d0a0b0809,
    @@ -16212,7 +18215,7 @@ simdutf_really_inline size_t utf32_to_utf16(const __m512i byteflip, __m512i utf3
         }
     
         {
    -        // build surrogate pair words in 32-bit lanes
    +        // build surrogate pair code units in 32-bit lanes
     
             //    t0 = 8 x [000000000000aaaa|aaaaaabbbbbbbbbb]
             const __m512i v_0001_0000 = _mm512_set1_epi32(0x00010000);
    @@ -16299,8 +18302,8 @@ __m512i rotate_by_N_epi8(const __m512i input) {
     simdutf_really_inline __m512i expanded_utf8_to_utf32(__m512i char_class, __m512i utf8) {
         /*
             Input:
    -        - utf8: bytes stored at separate 32-bit words
    -        - valid: which words have valid UTF-8 characters
    +        - utf8: bytes stored at separate 32-bit code units
    +        - valid: which code units have valid UTF-8 characters
     
             Bit layout of single word. We show 4 cases for each possible
             UTF-8 character encoding. The `?` denotes bits we must not
    @@ -16448,7 +18451,6 @@ simdutf_really_inline __m512i expand_utf8_to_utf32(__m512i input) {
         return expanded_utf8_to_utf32(char_class, input);
     }
     /* end file src/icelake/icelake_utf8_common.inl.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=icelake/icelake_macros.inl.cpp
     /* begin file src/icelake/icelake_macros.inl.cpp */
     
     /*
    @@ -16584,7 +18586,6 @@ simdutf_really_inline __m512i expand_utf8_to_utf32(__m512i input) {
                     }                                                                         \
             }
     /* end file src/icelake/icelake_macros.inl.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=icelake/icelake_from_valid_utf8.inl.cpp
     /* begin file src/icelake/icelake_from_valid_utf8.inl.cpp */
     // file included directly
     
    @@ -16723,7 +18724,6 @@ std::pair valid_utf8_to_fixed_length(const char* str, size
     
     using utf8_to_utf16_result = std::pair;
     /* end file src/icelake/icelake_from_valid_utf8.inl.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=icelake/icelake_utf8_validation.inl.cpp
     /* begin file src/icelake/icelake_utf8_validation.inl.cpp */
     // file included directly
     
    @@ -16853,14 +18853,13 @@ simdutf_really_inline __m512i check_special_cases(__m512i input, const __m512i p
     
       }; // struct avx512_utf8_checker
     /* end file src/icelake/icelake_utf8_validation.inl.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=icelake/icelake_from_utf8.inl.cpp
     /* begin file src/icelake/icelake_from_utf8.inl.cpp */
     // file included directly
     
     // File contains conversion procedure from possibly invalid UTF-8 strings.
     
     /**
    - * Attempts to convert up to len 1-byte words from in (in UTF-8 format) to
    + * Attempts to convert up to len 1-byte code units from in (in UTF-8 format) to
      * out.
      * Returns the position of the input and output after the processing is
      * completed. Upon error, the output is set to null.
    @@ -17025,20 +19024,425 @@ std::pair validating_utf8_to_fixed_length(const char* str,
         if(checker.errors()) {
             return {ptr, nullptr}; // We found an error.
         }
    -    return {ptr, output};
    -}
    +    return {ptr, output};
    +}
    +
    +// Like validating_utf8_to_fixed_length but returns as soon as an error is identified
    +template 
    +std::tuple validating_utf8_to_fixed_length_with_constant_checks(const char* str, size_t len, OUTPUT* dwords) {
    +    constexpr bool UTF32 = std::is_same::value;
    +    constexpr bool UTF16 = std::is_same::value;
    +    static_assert(UTF32 or UTF16, "output type has to be uint32_t (for UTF-32) or char16_t (for UTF-16)");
    +    static_assert(!(UTF32 and big_endian), "we do not currently support big-endian UTF-32");
    +
    +    const char* ptr = str;
    +    const char* end = ptr + len;
    +    __m512i byteflip = _mm512_setr_epi64(
    +            0x0607040502030001,
    +            0x0e0f0c0d0a0b0809,
    +            0x0607040502030001,
    +            0x0e0f0c0d0a0b0809,
    +            0x0607040502030001,
    +            0x0e0f0c0d0a0b0809,
    +            0x0607040502030001,
    +            0x0e0f0c0d0a0b0809
    +        );
    +    OUTPUT* output = dwords;
    +    avx512_utf8_checker checker{};
    +    /**
    +     * In the main loop, we consume 64 bytes per iteration,
    +     * but we access 64 + 4 bytes.
    +     * We check for ptr + 64 + 64 <= end because
    +     * we want to be do maskless writes without overruns.
    +     */
    +    while (ptr + 64 + 64 <= end) {
    +        const __m512i utf8 = _mm512_loadu_si512((const __m512i*)ptr);
    +        if(checker.check_next_input(utf8)) {
    +            SIMDUTF_ICELAKE_STORE_ASCII(UTF32, utf8, output)
    +            output += 64;
    +            ptr += 64;
    +            continue;
    +        }
    +        if(checker.errors()) {
    +            return {ptr, output, false}; // We found an error.
    +        }
    +        const __m512i lane0 = broadcast_epi128<0>(utf8);
    +        const __m512i lane1 = broadcast_epi128<1>(utf8);
    +        int valid_count0;
    +        __m512i vec0 = expand_and_identify(lane0, lane1, valid_count0);
    +        const __m512i lane2 = broadcast_epi128<2>(utf8);
    +        int valid_count1;
    +        __m512i vec1 = expand_and_identify(lane1, lane2, valid_count1);
    +        if(valid_count0 + valid_count1 <= 16) {
    +            vec0 = _mm512_mask_expand_epi32(vec0, __mmask16(((1<(utf8);
    +        int valid_count2;
    +        __m512i vec2 = expand_and_identify(lane2, lane3, valid_count2);
    +        uint32_t tmp1;
    +        ::memcpy(&tmp1, ptr + 64, sizeof(tmp1));
    +        const __m512i lane4 = _mm512_set1_epi32(tmp1);
    +        int valid_count3;
    +        __m512i vec3 = expand_and_identify(lane3, lane4, valid_count3);
    +        if(valid_count2 + valid_count3 <= 16) {
    +            vec2 = _mm512_mask_expand_epi32(vec2, __mmask16(((1<(utf8);
    +            const __m512i lane1 = broadcast_epi128<1>(utf8);
    +            int valid_count0;
    +            __m512i vec0 = expand_and_identify(lane0, lane1, valid_count0);
    +            const __m512i lane2 = broadcast_epi128<2>(utf8);
    +            int valid_count1;
    +            __m512i vec1 = expand_and_identify(lane1, lane2, valid_count1);
    +            if(valid_count0 + valid_count1 <= 16) {
    +                vec0 = _mm512_mask_expand_epi32(vec0, __mmask16(((1<(utf8);
    +            SIMDUTF_ICELAKE_TRANSCODE16(lane2, lane3, true)
    +
    +            ptr += 3*16;
    +        }
    +        validatedptr += 4*16;
    +    }
    +    {
    +       const __m512i utf8 = _mm512_maskz_loadu_epi8((1ULL<<(end - validatedptr))-1, (const __m512i*)validatedptr);
    +       checker.check_next_input(utf8);
    +    }
    +    checker.check_eof();
    +    if(checker.errors()) {
    +        return {ptr, output, false}; // We found an error.
    +    }
    +    return {ptr, output, true};
    +}
    +/* end file src/icelake/icelake_from_utf8.inl.cpp */
    +/* begin file src/icelake/icelake_convert_utf8_to_latin1.inl.cpp */
    +// file included directly
    +
    +// File contains conversion procedure from possibly invalid UTF-8 strings.
    +
    +// template 
    +template 
    +simdutf_really_inline size_t process_block_from_utf8_to_latin1(const char *buf, size_t len,
    +                                           char *latin_output, __m512i minus64,
    +                                           __m512i one,
    +                                           __mmask64 *next_leading_ptr,
    +                                           __mmask64 *next_bit6_ptr) {
    +  __mmask64 load_mask =
    +      is_remaining ? _bzhi_u64(~0ULL, (unsigned int)len) : ~0ULL;
    +  __m512i input = _mm512_maskz_loadu_epi8(load_mask, (__m512i *)buf);
    +  __mmask64 nonascii = _mm512_movepi8_mask(input);
    +
    +  if (nonascii == 0) {
    +    is_remaining
    +        ? _mm512_mask_storeu_epi8((__m512i *)latin_output, load_mask, input)
    +        : _mm512_storeu_si512((__m512i *)latin_output, input);
    +    return len;
    +  }
    +
    +  __mmask64 leading = _mm512_cmpge_epu8_mask(input, minus64);
    +
    +  __m512i highbits = _mm512_xor_si512(input, _mm512_set1_epi8(-62));
    +  __mmask64 invalid_leading_bytes =
    +      _mm512_mask_cmpgt_epu8_mask(leading, highbits, one);
    +
    +  if (invalid_leading_bytes) {
    +    return 0; // Indicates error
    +  }
    +
    +  __mmask64 leading_shift = (leading << 1) | *next_leading_ptr;
    +  *next_leading_ptr = leading >> 63;
    +
    +  if ((nonascii ^ leading) != leading_shift) {
    +    return 0; // Indicates error
    +  }
    +
    +  __mmask64 bit6 = _mm512_cmpeq_epi8_mask(highbits, one);
    +  input =
    +      _mm512_mask_sub_epi8(input, (bit6 << 1) | *next_bit6_ptr, input, minus64);
    +  *next_bit6_ptr = bit6 >> 63;
    +
    +  __mmask64 retain = ~leading & load_mask;
    +  __m512i output = _mm512_maskz_compress_epi8(retain, input);
    +  int64_t written_out = count_ones(retain);
    +  __mmask64 store_mask = (1ULL << written_out) - 1;
    +
    +  // ***************************
    +  //  Possible optimization? (Nick Nuon)
    +  //  This commented out line is 5% faster but sadly it'll also write past
    +  //  memory bounds for latin1_output: is_remaining ?
    +  //  _mm512_mask_storeu_epi8((__m512i *)latin_output, store_mask, output) :
    +  //  _mm512_storeu_si512((__m512i *)latin_output, output); I tried using
    +  //  _mm512_storeu_si512 and have the next process_block start from the
    +  //  "written_out" point but the compiler shuffles memory in such a way that it
    +  //  is signifcantly slower...
    +  // ****************************
    +  _mm512_mask_storeu_epi8((__m512i *)latin_output, store_mask, output);
    +
    +  return written_out;
    +}
    +
    +size_t utf8_to_latin1_avx512(const char *buf, size_t len, char *latin_output) {
    +  char *start = latin_output;
    +  size_t pos = 0;
    +  __m512i minus64 = _mm512_set1_epi8(-64); // 11111111111 ... 1100 0000
    +  __m512i one = _mm512_set1_epi8(1);
    +  __mmask64 next_leading = 0;
    +  __mmask64 next_bit6 = 0;
    +
    +  while (pos + 64 <= len) {
    +    size_t written = process_block_from_utf8_to_latin1(buf + pos, 64, latin_output, minus64,
    +                                          one, &next_leading, &next_bit6);
    +    if (written == 0) {
    +      return 0; // Indicates error
    +    }
    +    latin_output += written;
    +    pos += 64;
    +  }
    +
    +  if (pos < len) {
    +    size_t remaining = len - pos;
    +    size_t written =
    +        process_block_from_utf8_to_latin1(buf + pos, remaining, latin_output, minus64, one,
    +                            &next_leading, &next_bit6);
    +    if (written == 0) {
    +      return 0; // Indicates error
    +    }
    +    latin_output += written;
    +  }
    +
    +  return (size_t)(latin_output - start);
    +}
    +/* end file src/icelake/icelake_convert_utf8_to_latin1.inl.cpp */
    +/* begin file src/icelake/icelake_convert_valid_utf8_to_latin1.inl.cpp */
    +// file included directly
    +
    +// File contains conversion procedure from valid UTF-8 strings.
    +
    +template 
    +simdutf_really_inline size_t process_valid_block_from_utf8_to_latin1(const char *buf, size_t len,
    +                                                 char *latin_output,
    +                                                 __m512i minus64, __m512i one,
    +                                                 __mmask64 *next_leading_ptr,
    +                                                 __mmask64 *next_bit6_ptr) {
    +  __mmask64 load_mask =
    +      is_remaining ? _bzhi_u64(~0ULL, (unsigned int)len) : ~0ULL;
    +  __m512i input = _mm512_maskz_loadu_epi8(load_mask, (__m512i *)buf);
    +  __mmask64 nonascii = _mm512_movepi8_mask(input);
    +
    +  if (nonascii == 0) {
    +    is_remaining
    +        ? _mm512_mask_storeu_epi8((__m512i *)latin_output, load_mask, input)
    +        : _mm512_storeu_si512((__m512i *)latin_output, input);
    +    return len;
    +  }
    +
    +  __mmask64 leading = _mm512_cmpge_epu8_mask(input, minus64);
    +
    +  __m512i highbits = _mm512_xor_si512(input, _mm512_set1_epi8(-62));
    +
    +  *next_leading_ptr = leading >> 63;
    +
    +  __mmask64 bit6 = _mm512_cmpeq_epi8_mask(highbits, one);
    +  input =
    +      _mm512_mask_sub_epi8(input, (bit6 << 1) | *next_bit6_ptr, input, minus64);
    +  *next_bit6_ptr = bit6 >> 63;
    +
    +  __mmask64 retain = ~leading & load_mask;
    +  __m512i output = _mm512_maskz_compress_epi8(retain, input);
    +  int64_t written_out = count_ones(retain);
    +  __mmask64 store_mask = (1ULL << written_out) - 1;
    +  // Optimization opportunity: sometimes, masked writes are not needed.
    +  _mm512_mask_storeu_epi8((__m512i *)latin_output, store_mask, output);
    +  return written_out;
    +}
    +
    +size_t valid_utf8_to_latin1_avx512(const char *buf, size_t len,
    +                                   char *latin_output) {
    +  char *start = latin_output;
    +  size_t pos = 0;
    +  __m512i minus64 = _mm512_set1_epi8(-64); // 11111111111 ... 1100 0000
    +  __m512i one = _mm512_set1_epi8(1);
    +  __mmask64 next_leading = 0;
    +  __mmask64 next_bit6 = 0;
    +
    +  while (pos + 64 <= len) {
    +    size_t written = process_valid_block_from_utf8_to_latin1(
    +        buf + pos, 64, latin_output, minus64, one, &next_leading, &next_bit6);
    +    latin_output += written;
    +    pos += 64;
    +  }
    +
    +  if (pos < len) {
    +    size_t remaining = len - pos;
    +    size_t written =
    +        process_valid_block_from_utf8_to_latin1(buf + pos, remaining, latin_output, minus64,
    +                                  one, &next_leading, &next_bit6);
    +    latin_output += written;
    +  }
    +
    +  return (size_t)(latin_output - start);
    +}
    +/* end file src/icelake/icelake_convert_valid_utf8_to_latin1.inl.cpp */
    +/* begin file src/icelake/icelake_convert_utf16_to_latin1.inl.cpp */
    +// file included directly
    +template 
    +size_t icelake_convert_utf16_to_latin1(const char16_t *buf, size_t len,
    +                                       char *latin1_output) {
    +  const char16_t *end = buf + len;
    +  __m512i v_0xFF = _mm512_set1_epi16(0xff);
    +  __m512i byteflip = _mm512_setr_epi64(0x0607040502030001, 0x0e0f0c0d0a0b0809,
    +                                       0x0607040502030001, 0x0e0f0c0d0a0b0809,
    +                                       0x0607040502030001, 0x0e0f0c0d0a0b0809,
    +                                       0x0607040502030001, 0x0e0f0c0d0a0b0809);
    +  __m512i shufmask = _mm512_set_epi8(
    +      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +      0, 0, 0, 0, 0, 0, 0, 62, 60, 58, 56, 54, 52, 50, 48, 46, 44, 42, 40, 38,
    +      36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0);
    +  while (buf + 32 <= end) {
    +    __m512i in = _mm512_loadu_si512((__m512i *)buf);
    +    if (big_endian) {
    +      in = _mm512_shuffle_epi8(in, byteflip);
    +    }
    +    if (_mm512_cmpgt_epu16_mask(in, v_0xFF)) {
    +      return 0;
    +    }
    +    _mm256_storeu_si256(
    +        (__m256i *)latin1_output,
    +        _mm512_castsi512_si256(_mm512_permutexvar_epi8(shufmask, in)));
    +    latin1_output += 32;
    +    buf += 32;
    +  }
    +  if (buf < end) {
    +    uint32_t mask(uint32_t(1 << (end - buf)) - 1);
    +    __m512i in = _mm512_maskz_loadu_epi16(mask, buf);
    +    if (big_endian) {
    +      in = _mm512_shuffle_epi8(in, byteflip);
    +    }
    +    if (_mm512_cmpgt_epu16_mask(in, v_0xFF)) {
    +      return 0;
    +    }
    +    _mm256_mask_storeu_epi8(
    +        latin1_output, mask,
    +        _mm512_castsi512_si256(_mm512_permutexvar_epi8(shufmask, in)));
    +  }
    +  return len;
    +}
    +
    +template 
    +std::pair
    +icelake_convert_utf16_to_latin1_with_errors(const char16_t *buf, size_t len,
    +                                            char *latin1_output) {
    +  const char16_t *end = buf + len;
    +  const char16_t *start = buf;
    +  __m512i byteflip = _mm512_setr_epi64(0x0607040502030001, 0x0e0f0c0d0a0b0809,
    +                                       0x0607040502030001, 0x0e0f0c0d0a0b0809,
    +                                       0x0607040502030001, 0x0e0f0c0d0a0b0809,
    +                                       0x0607040502030001, 0x0e0f0c0d0a0b0809);
    +  __m512i v_0xFF = _mm512_set1_epi16(0xff);
    +  __m512i shufmask = _mm512_set_epi8(
    +      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +      0, 0, 0, 0, 0, 0, 0, 62, 60, 58, 56, 54, 52, 50, 48, 46, 44, 42, 40, 38,
    +      36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0);
    +  while (buf + 32 <= end) {
    +    __m512i in = _mm512_loadu_si512((__m512i *)buf);
    +    if (big_endian) {
    +      in = _mm512_shuffle_epi8(in, byteflip);
    +    }
    +    if (_mm512_cmpgt_epu16_mask(in, v_0xFF)) {
    +      uint16_t word;
    +      while ((word = (big_endian ? scalar::utf16::swap_bytes(uint16_t(*buf))
    +                                 : uint16_t(*buf))) <= 0xff) {
    +        *latin1_output++ = uint8_t(word);
    +        buf++;
    +      }
    +      return std::make_pair(result(error_code::TOO_LARGE, buf - start),
    +                            latin1_output);
    +    }
    +    _mm256_storeu_si256(
    +        (__m256i *)latin1_output,
    +        _mm512_castsi512_si256(_mm512_permutexvar_epi8(shufmask, in)));
    +    latin1_output += 32;
    +    buf += 32;
    +  }
    +  if (buf < end) {
    +    uint32_t mask(uint32_t(1 << (end - buf)) - 1);
    +    __m512i in = _mm512_maskz_loadu_epi16(mask, buf);
    +    if (big_endian) {
    +      in = _mm512_shuffle_epi8(in, byteflip);
    +    }
    +    if (_mm512_cmpgt_epu16_mask(in, v_0xFF)) {
     
    -// Like validating_utf8_to_fixed_length but returns as soon as an error is identified
    -template 
    -std::tuple validating_utf8_to_fixed_length_with_constant_checks(const char* str, size_t len, OUTPUT* dwords) {
    -    constexpr bool UTF32 = std::is_same::value;
    -    constexpr bool UTF16 = std::is_same::value;
    -    static_assert(UTF32 or UTF16, "output type has to be uint32_t (for UTF-32) or char16_t (for UTF-16)");
    -    static_assert(!(UTF32 and big_endian), "we do not currently support big-endian UTF-32");
    +      uint16_t word;
    +      while ((word = (big_endian ? scalar::utf16::swap_bytes(uint16_t(*buf))
    +                                 : uint16_t(*buf))) <= 0xff) {
    +        *latin1_output++ = uint8_t(word);
    +        buf++;
    +      }
    +      return std::make_pair(result(error_code::TOO_LARGE, buf - start),
    +                            latin1_output);
    +    }
    +    _mm256_mask_storeu_epi8(
    +        latin1_output, mask,
    +        _mm512_castsi512_si256(_mm512_permutexvar_epi8(shufmask, in)));
    +  }
    +  return std::make_pair(result(error_code::SUCCESS, len), latin1_output);
    +}
    +/* end file src/icelake/icelake_convert_utf16_to_latin1.inl.cpp */
    +/* begin file src/icelake/icelake_convert_utf16_to_utf8.inl.cpp */
    +// file included directly
     
    -    const char* ptr = str;
    -    const char* end = ptr + len;
    -    __m512i byteflip = _mm512_setr_epi64(
    +/**
    + * This function converts the input (inbuf, inlen), assumed to be valid
    + * UTF16 (little endian) into UTF-8 (to outbuf). The number of code units written
    + * is written to 'outlen' and the function reports the number of input word
    + * consumed.
    + */
    +template 
    +size_t utf16_to_utf8_avx512i(const char16_t *inbuf, size_t inlen,
    +                               unsigned char *outbuf, size_t *outlen) {
    +  __m512i in;
    +  __mmask32 inmask = _cvtu32_mask32(0x7fffffff);
    +  __m512i byteflip = _mm512_setr_epi64(
                 0x0607040502030001,
                 0x0e0f0c0d0a0b0809,
                 0x0607040502030001,
    @@ -17048,115 +19452,181 @@ std::tuple validating_utf8_to_fixed_length_with_cons
                 0x0607040502030001,
                 0x0e0f0c0d0a0b0809
             );
    -    OUTPUT* output = dwords;
    -    avx512_utf8_checker checker{};
    -    /**
    -     * In the main loop, we consume 64 bytes per iteration,
    -     * but we access 64 + 4 bytes.
    -     * We check for ptr + 64 + 64 <= end because
    -     * we want to be do maskless writes without overruns.
    -     */
    -    while (ptr + 64 + 64 <= end) {
    -        const __m512i utf8 = _mm512_loadu_si512((const __m512i*)ptr);
    -        if(checker.check_next_input(utf8)) {
    -            SIMDUTF_ICELAKE_STORE_ASCII(UTF32, utf8, output)
    -            output += 64;
    -            ptr += 64;
    -            continue;
    -        }
    -        if(checker.errors()) {
    -            return {ptr, output, false}; // We found an error.
    -        }
    -        const __m512i lane0 = broadcast_epi128<0>(utf8);
    -        const __m512i lane1 = broadcast_epi128<1>(utf8);
    -        int valid_count0;
    -        __m512i vec0 = expand_and_identify(lane0, lane1, valid_count0);
    -        const __m512i lane2 = broadcast_epi128<2>(utf8);
    -        int valid_count1;
    -        __m512i vec1 = expand_and_identify(lane1, lane2, valid_count1);
    -        if(valid_count0 + valid_count1 <= 16) {
    -            vec0 = _mm512_mask_expand_epi32(vec0, __mmask16(((1<(utf8);
    -        int valid_count2;
    -        __m512i vec2 = expand_and_identify(lane2, lane3, valid_count2);
    -        uint32_t tmp1;
    -        ::memcpy(&tmp1, ptr + 64, sizeof(tmp1));
    -        const __m512i lane4 = _mm512_set1_epi32(tmp1);
    -        int valid_count3;
    -        __m512i vec3 = expand_and_identify(lane3, lane4, valid_count3);
    -        if(valid_count2 + valid_count3 <= 16) {
    -            vec2 = _mm512_mask_expand_epi32(vec2, __mmask16(((1<= 32) {
    +    in = _mm512_loadu_si512(inbuf);
    +    if(big_endian) { in = _mm512_shuffle_epi8(in, byteflip); }
    +    inlen -= 31;
    +  lastiteration:
    +    inbuf += 31;
    +
    +  failiteration:
    +    const __mmask32 is234byte = _mm512_mask_cmp_epu16_mask(
    +      inmask, in, _mm512_set1_epi16(0x0080), _MM_CMPINT_NLT);
    +
    +    if (_ktestz_mask32_u8(inmask, is234byte)) {
    +      // fast path for ASCII only
    +      _mm512_mask_cvtepi16_storeu_epi8(outbuf, inmask, in);
    +      outbuf += 31;
    +      carry = 0;
    +
    +      if (inlen < 32) {
    +        goto tail;
    +      } else {
    +        continue;
    +      }
         }
    -    const char* validatedptr = ptr; // validated up to ptr
     
    -    // For the final pass, we validate 64 bytes, but we only transcode
    -    // 3*16 bytes, so we may end up double-validating 16 bytes.
    -    if (ptr + 64 <= end) {
    -        const __m512i utf8 = _mm512_loadu_si512((const __m512i*)ptr);
    -        if(checker.check_next_input(utf8)) {
    -            SIMDUTF_ICELAKE_STORE_ASCII(UTF32, utf8, output)
    -            output += 64;
    -            ptr += 64;
    -        } else if(checker.errors()) {
    -            return {ptr, output, false}; // We found an error.
    -        } else {
    -            const __m512i lane0 = broadcast_epi128<0>(utf8);
    -            const __m512i lane1 = broadcast_epi128<1>(utf8);
    -            int valid_count0;
    -            __m512i vec0 = expand_and_identify(lane0, lane1, valid_count0);
    -            const __m512i lane2 = broadcast_epi128<2>(utf8);
    -            int valid_count1;
    -            __m512i vec1 = expand_and_identify(lane1, lane2, valid_count1);
    -            if(valid_count0 + valid_count1 <= 16) {
    -                vec0 = _mm512_mask_expand_epi32(vec0, __mmask16(((1<> 1);
    +        inlen = _tzcnt_u32(hinolo | lonohi);
    +        inmask = __mmask32(0x7fffffff & ((1 << inlen) - 1));
    +        in = _mm512_maskz_mov_epi16(inmask, in);
    +        adjust = (int)inlen - 31;
    +        inlen = 0;
    +        goto failiteration;
    +      }
    +    }
    +
    +    hi = _mm512_maskz_mov_epi32(_cvtu32_mask16(0x7fff),hi);
    +    carry = carryout;
    +
    +    __m512i mslo =
    +        _mm512_multishift_epi64_epi8(_mm512_set1_epi64(0x20262c3200060c12), lo);
    +
    +    __m512i mshi =
    +        _mm512_multishift_epi64_epi8(_mm512_set1_epi64(0x20262c3200060c12), hi);
    +
    +    const __mmask32 outmask = __mmask32(_kandn_mask64(losurr, inmask));
    +    const __mmask64 outmhi = _kshiftri_mask64(outmask, 16);
    +
    +    const __mmask32 is1byte = __mmask32(_knot_mask64(is234byte));
    +    const __mmask64 is1bhi = _kshiftri_mask64(is1byte, 16);
    +    const __mmask64 is12bhi = _kshiftri_mask64(is12byte, 16);
    +
    +    taglo =
    +        _mm512_mask_mov_epi32(taglo, __mmask16(is12byte), _mm512_set1_epi32(0x80c00000));
    +    taghi =
    +        _mm512_mask_mov_epi32(taghi, __mmask16(is12bhi), _mm512_set1_epi32(0x80c00000));
    +    __m512i magiclo = _mm512_mask_blend_epi32(__mmask16(outmask), _mm512_set1_epi32(0xffffffff),
    +                                      _mm512_set1_epi32(0x00010101));
    +    __m512i magichi = _mm512_mask_blend_epi32(__mmask16(outmhi), _mm512_set1_epi32(0xffffffff),
    +                                      _mm512_set1_epi32(0x00010101));
    +
    +
    +    magiclo = _mm512_mask_blend_epi32(__mmask16(outmask), _mm512_set1_epi32(0xffffffff),
    +                                      _mm512_set1_epi32(0x00010101));
    +    magichi = _mm512_mask_blend_epi32(__mmask16(outmhi), _mm512_set1_epi32(0xffffffff),
    +                                      _mm512_set1_epi32(0x00010101));
    +
    +    mslo = _mm512_ternarylogic_epi32(mslo, _mm512_set1_epi32(0x3f3f3f3f), taglo,
    +                                     0xea); // A&B|C
    +    mshi = _mm512_ternarylogic_epi32(mshi, _mm512_set1_epi32(0x3f3f3f3f), taghi,
    +                                     0xea);
    +    mslo = _mm512_mask_slli_epi32(mslo, __mmask16(is1byte), lo, 24);
     
    -            const __m512i lane3 = broadcast_epi128<3>(utf8);
    -            SIMDUTF_ICELAKE_TRANSCODE16(lane2, lane3, true)
    +    mshi = _mm512_mask_slli_epi32(mshi, __mmask16(is1bhi), hi, 24);
     
    -            ptr += 3*16;
    -        }
    -        validatedptr += 4*16;
    -    }
    -    {
    -       const __m512i utf8 = _mm512_maskz_loadu_epi8((1ULL<<(end - validatedptr))-1, (const __m512i*)validatedptr);
    -       checker.check_next_input(utf8);
    -    }
    -    checker.check_eof();
    -    if(checker.errors()) {
    -        return {ptr, output, false}; // We found an error.
    -    }
    -    return {ptr, output, true};
    +    const __mmask64 wantlo = _mm512_cmp_epu8_mask(mslo, magiclo, _MM_CMPINT_NLT);
    +    const __mmask64 wanthi = _mm512_cmp_epu8_mask(mshi, magichi, _MM_CMPINT_NLT);
    +    const __m512i outlo = _mm512_maskz_compress_epi8(wantlo, mslo);
    +    const __m512i outhi = _mm512_maskz_compress_epi8(wanthi, mshi);
    +    const uint64_t wantlo_uint64 = _cvtmask64_u64(wantlo);
    +    const uint64_t wanthi_uint64 = _cvtmask64_u64(wanthi);
    +
    +    uint64_t advlo = _mm_popcnt_u64(wantlo_uint64);
    +    uint64_t advhi = _mm_popcnt_u64(wanthi_uint64);
    +
    +    _mm512_mask_storeu_epi8(outbuf, _cvtu64_mask64(_pext_u64(wantlo_uint64, wantlo_uint64)), outlo);
    +    _mm512_mask_storeu_epi8(outbuf + advlo, _cvtu64_mask64(_pext_u64(wanthi_uint64, wanthi_uint64)), outhi);
    +    outbuf += advlo + advhi;
    +  }
    +  outbuf -= adjust;
    +
    +tail:
    +  if (inlen != 0) {
    +    // We must have inlen < 31.
    +    inmask = _cvtu32_mask32((1 << inlen) - 1);
    +    in = _mm512_maskz_loadu_epi16(inmask, inbuf);
    +    if(big_endian) { in = _mm512_shuffle_epi8(in, byteflip); }
    +    adjust = inlen - 31;
    +    inlen = 0;
    +    goto lastiteration;
    +  }
    +  *outlen = (outbuf - outbuf_orig) + adjust;
    +  return ((inbuf - inbuf_orig) + adjust);
     }
    -/* end file src/icelake/icelake_from_utf8.inl.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=icelake/icelake_convert_utf16_to_utf32.inl.cpp
    +/* end file src/icelake/icelake_convert_utf16_to_utf8.inl.cpp */
     /* begin file src/icelake/icelake_convert_utf16_to_utf32.inl.cpp */
     // file included directly
     
    @@ -17181,7 +19651,7 @@ std::tuple convert_utf16_to_utf32(const char16
                 0x0607040502030001,
                 0x0e0f0c0d0a0b0809
             );
    -  while (buf + 32 <= end) {
    +  while (std::distance(buf,end) >= 32) {
         // Always safe because buf + 32 <= end so that end - buf >= 32 bytes:
         __m512i in = _mm512_loadu_si512((__m512i*)buf);
         if(big_endian) { in = _mm512_shuffle_epi8(in, byteflip); }
    @@ -17203,7 +19673,7 @@ std::tuple convert_utf16_to_utf32(const char16
                 |1101.11aa.aaaa.aaaa|1101.10bb.bbbb.bbbb|
                     low surrogate      high surrogate
             */
    -        /*  1. Expand all words to 32-bit words
    +        /*  1. Expand all code units to 32-bit code units
                 in  |0000.0000.0000.0000.1101.11aa.aaaa.aaaa|0000.0000.0000.0000.1101.10bb.bbbb.bbbb|
             */
             const __m512i first = _mm512_cvtepu16_epi32(_mm512_castsi512_si256(in));
    @@ -17234,7 +19704,7 @@ std::tuple convert_utf16_to_utf32(const char16
             const __m512i added_second = _mm512_mask_add_epi32(aligned_second, (__mmask16)(H>>16), aligned_second, shifted_second);
             const __m512i utf32_second = _mm512_mask_add_epi32(added_second, (__mmask16)(H>>16), added_second, constant);
     
    -        //  5. Store all valid UTF-32 words (low surrogate positions and 32nd word are invalid)
    +        //  5. Store all valid UTF-32 code units (low surrogate positions and 32nd word are invalid)
             const __mmask32 valid = ~L & 0x7fffffff;
             // We deliberately do a _mm512_maskz_compress_epi32 followed by storeu_epi32
             // to ease performance portability to Zen 4.
    @@ -17248,7 +19718,7 @@ std::tuple convert_utf16_to_utf32(const char16
             //_mm512_storeu_epi32((__m512i *) utf32_output, compressed_second);
             _mm512_mask_storeu_epi32((__m512i *) utf32_output, __mmask16((1<> 30) & 0x1;
           } else {
    @@ -17257,7 +19727,7 @@ std::tuple convert_utf16_to_utf32(const char16
           }
         } else {
           // no surrogates
    -      // extend all thirty-two 16-bit words to thirty-two 32-bit words
    +      // extend all thirty-two 16-bit code units to thirty-two 32-bit code units
           _mm512_storeu_si512((__m512i *)(utf32_output), _mm512_cvtepu16_epi32(_mm512_castsi512_si256(in)));
           _mm512_storeu_si512((__m512i *)(utf32_output) + 1, _mm512_cvtepu16_epi32(_mm512_extracti32x8_epi32(in,1)));
           utf32_output += 32;
    @@ -17268,7 +19738,80 @@ std::tuple convert_utf16_to_utf32(const char16
       return std::make_tuple(buf+carry, utf32_output, true);
     }
     /* end file src/icelake/icelake_convert_utf16_to_utf32.inl.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=icelake/icelake_convert_utf32_to_utf8.inl.cpp
    +/* begin file src/icelake/icelake_convert_utf32_to_latin1.inl.cpp */
    +// file included directly
    +size_t icelake_convert_utf32_to_latin1(const char32_t *buf, size_t len,
    +                                       char *latin1_output) {
    +  const char32_t *end = buf + len;
    +  __m512i v_0xFF = _mm512_set1_epi32(0xff);
    +  __m512i shufmask = _mm512_set_epi8(
    +      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,
    +      56, 52, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0);
    +  while (buf + 16 <= end) {
    +    __m512i in = _mm512_loadu_si512((__m512i *)buf);
    +    if (_mm512_cmpgt_epu32_mask(in, v_0xFF)) {
    +      return 0;
    +    }
    +    _mm_storeu_si128((__m128i *)latin1_output,
    +                     _mm512_castsi512_si128(_mm512_permutexvar_epi8(shufmask, in)));
    +    latin1_output += 16;
    +    buf += 16;
    +  }
    +  if (buf < end) {
    +    uint16_t mask = uint16_t((1 << (end - buf)) - 1);
    +    __m512i in = _mm512_maskz_loadu_epi32(mask, buf);
    +    if (_mm512_cmpgt_epu32_mask(in, v_0xFF)) {
    +      return 0;
    +    }
    +    _mm_mask_storeu_epi8(
    +        latin1_output, mask,
    +        _mm512_castsi512_si128(_mm512_permutexvar_epi8(shufmask, in)));
    +  }
    +  return len;
    +}
    +
    +std::pair
    +icelake_convert_utf32_to_latin1_with_errors(const char32_t *buf, size_t len,
    +                                            char *latin1_output) {
    +  const char32_t *end = buf + len;
    +  const char32_t *start = buf;
    +  __m512i v_0xFF = _mm512_set1_epi32(0xff);
    +  __m512i shufmask = _mm512_set_epi8(
    +      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,
    +      56, 52, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0);
    +  while (buf + 16 <= end) {
    +    __m512i in = _mm512_loadu_si512((__m512i *)buf);
    +    if (_mm512_cmpgt_epu32_mask(in, v_0xFF)) {
    +      while (uint32_t(*buf) <= 0xff) {
    +        *latin1_output++ = uint8_t(*buf++);
    +      }
    +      return std::make_pair(result(error_code::TOO_LARGE, buf - start),
    +                            latin1_output);
    +    }
    +    _mm_storeu_si128((__m128i *)latin1_output,
    +                     _mm512_castsi512_si128(_mm512_permutexvar_epi8(shufmask, in)));
    +    latin1_output += 16;
    +    buf += 16;
    +  }
    +  if (buf < end) {
    +    uint16_t mask = uint16_t((1 << (end - buf)) - 1);
    +    __m512i in = _mm512_maskz_loadu_epi32(mask, buf);
    +    if (_mm512_cmpgt_epu32_mask(in, v_0xFF)) {
    +      while (uint32_t(*buf) <= 0xff) {
    +        *latin1_output++ = uint8_t(*buf++);
    +      }
    +      return std::make_pair(result(error_code::TOO_LARGE, buf - start),
    +                            latin1_output);
    +    }
    +    _mm_mask_storeu_epi8(
    +        latin1_output, mask,
    +        _mm512_castsi512_si128(_mm512_permutexvar_epi8(shufmask, in)));
    +  }
    +  return std::make_pair(result(error_code::SUCCESS, len), latin1_output);
    +}
    +/* end file src/icelake/icelake_convert_utf32_to_latin1.inl.cpp */
     /* begin file src/icelake/icelake_convert_utf32_to_utf8.inl.cpp */
     // file included directly
     
    @@ -17291,7 +19834,7 @@ std::pair avx512_convert_utf32_to_utf8(const char32_t* b
         __m256i nextin = _mm256_loadu_si256((__m256i*)buf+1);
         running_max = _mm256_max_epu32(_mm256_max_epu32(in, running_max), nextin);
     
    -    // Pack 32-bit UTF-32 words to 16-bit UTF-16 words with unsigned saturation
    +    // Pack 32-bit UTF-32 code units to 16-bit UTF-16 code units with unsigned saturation
         __m256i in_16 = _mm256_packus_epi32(_mm256_and_si256(in, v_7fffffff), _mm256_and_si256(nextin, v_7fffffff));
         in_16 = _mm256_permute4x64_epi64(in_16, 0b11011000);
     
    @@ -17362,7 +19905,7 @@ std::pair avx512_convert_utf32_to_utf8(const char32_t* b
         const __m256i saturation_bytemask = _mm256_cmpeq_epi32(_mm256_and_si256(_mm256_or_si256(in, nextin), v_ffff0000), v_0000);
         const uint32_t saturation_bitmask = static_cast(_mm256_movemask_epi8(saturation_bytemask));
         if (saturation_bitmask == 0xffffffff) {
    -      // case: words from register produce either 1, 2 or 3 UTF-8 bytes
    +      // case: code units from register produce either 1, 2 or 3 UTF-8 bytes
           const __m256i v_d800 = _mm256_set1_epi16((uint16_t)0xd800);
           forbidden_bytemask = _mm256_or_si256(forbidden_bytemask, _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_f800), v_d800));
     
    @@ -17376,7 +19919,7 @@ std::pair avx512_convert_utf32_to_utf8(const char32_t* b
             2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc]              - two UTF-8 bytes
             3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three UTF-8 bytes
     
    -        We expand the input word (16-bit) into two words (32-bit), thus
    +        We expand the input word (16-bit) into two code units (32-bit), thus
             we have room for four bytes. However, we need five distinct bit
             layouts. Note that the last byte in cases #2 and #3 is the same.
     
    @@ -17387,7 +19930,7 @@ std::pair avx512_convert_utf32_to_utf8(const char32_t* b
             either byte 1 for case #2 or byte 2 for case #3. Note that they
             differ by exactly one bit.
     
    -        Finally from these two words we build proper UTF-8 sequence, taking
    +        Finally from these two code units we build proper UTF-8 sequence, taking
             into account the case (i.e, the number of bytes to write).
           */
           /**
    @@ -17415,16 +19958,16 @@ std::pair avx512_convert_utf32_to_utf8(const char32_t* b
           const __m256i s4 = _mm256_xor_si256(s3, m0);
     #undef simdutf_vec
     
    -      // 4. expand words 16-bit => 32-bit
    +      // 4. expand code units 16-bit => 32-bit
           const __m256i out0 = _mm256_unpacklo_epi16(t2, s4);
           const __m256i out1 = _mm256_unpackhi_epi16(t2, s4);
     
    -      // 5. compress 32-bit words into 1, 2 or 3 bytes -- 2 x shuffle
    +      // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
           const uint32_t mask = (one_byte_bitmask & 0x55555555) |
                                 (one_or_two_bytes_bitmask & 0xaaaaaaaa);
           // Due to the wider registers, the following path is less likely to be useful.
           /*if(mask == 0) {
    -        // We only have three-byte words. Use fast path.
    +        // We only have three-byte code units. Use fast path.
             const __m256i shuffle = _mm256_setr_epi8(2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1, 2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1);
             const __m256i utf8_0 = _mm256_shuffle_epi8(out0, shuffle);
             const __m256i utf8_1 = _mm256_shuffle_epi8(out1, shuffle);
    @@ -17536,7 +20079,7 @@ std::pair avx512_convert_utf32_to_utf8_with_errors(const char32_t
           return std::make_pair(result(error_code::TOO_LARGE, buf - start), utf8_output);
         }
     
    -    // Pack 32-bit UTF-32 words to 16-bit UTF-16 words with unsigned saturation
    +    // Pack 32-bit UTF-32 code units to 16-bit UTF-16 code units with unsigned saturation
         __m256i in_16 = _mm256_packus_epi32(_mm256_and_si256(in, v_7fffffff), _mm256_and_si256(nextin, v_7fffffff));
         in_16 = _mm256_permute4x64_epi64(in_16, 0b11011000);
     
    @@ -17607,9 +20150,9 @@ std::pair avx512_convert_utf32_to_utf8_with_errors(const char32_t
         const __m256i saturation_bytemask = _mm256_cmpeq_epi32(_mm256_and_si256(_mm256_or_si256(in, nextin), v_ffff0000), v_0000);
         const uint32_t saturation_bitmask = static_cast(_mm256_movemask_epi8(saturation_bytemask));
         if (saturation_bitmask == 0xffffffff) {
    -      // case: words from register produce either 1, 2 or 3 UTF-8 bytes
    +      // case: code units from register produce either 1, 2 or 3 UTF-8 bytes
     
    -      // Check for illegal surrogate words
    +      // Check for illegal surrogate code units
           const __m256i v_d800 = _mm256_set1_epi16((uint16_t)0xd800);
           const __m256i forbidden_bytemask = _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_f800), v_d800);
           if (static_cast(_mm256_movemask_epi8(forbidden_bytemask)) != 0x0) {
    @@ -17626,7 +20169,7 @@ std::pair avx512_convert_utf32_to_utf8_with_errors(const char32_t
             2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc]              - two UTF-8 bytes
             3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three UTF-8 bytes
     
    -        We expand the input word (16-bit) into two words (32-bit), thus
    +        We expand the input word (16-bit) into two code units (32-bit), thus
             we have room for four bytes. However, we need five distinct bit
             layouts. Note that the last byte in cases #2 and #3 is the same.
     
    @@ -17637,7 +20180,7 @@ std::pair avx512_convert_utf32_to_utf8_with_errors(const char32_t
             either byte 1 for case #2 or byte 2 for case #3. Note that they
             differ by exactly one bit.
     
    -        Finally from these two words we build proper UTF-8 sequence, taking
    +        Finally from these two code units we build proper UTF-8 sequence, taking
             into account the case (i.e, the number of bytes to write).
           */
           /**
    @@ -17665,16 +20208,16 @@ std::pair avx512_convert_utf32_to_utf8_with_errors(const char32_t
           const __m256i s4 = _mm256_xor_si256(s3, m0);
     #undef simdutf_vec
     
    -      // 4. expand words 16-bit => 32-bit
    +      // 4. expand code units 16-bit => 32-bit
           const __m256i out0 = _mm256_unpacklo_epi16(t2, s4);
           const __m256i out1 = _mm256_unpackhi_epi16(t2, s4);
     
    -      // 5. compress 32-bit words into 1, 2 or 3 bytes -- 2 x shuffle
    +      // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
           const uint32_t mask = (one_byte_bitmask & 0x55555555) |
                                 (one_or_two_bytes_bitmask & 0xaaaaaaaa);
           // Due to the wider registers, the following path is less likely to be useful.
           /*if(mask == 0) {
    -        // We only have three-byte words. Use fast path.
    +        // We only have three-byte code units. Use fast path.
             const __m256i shuffle = _mm256_setr_epi8(2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1, 2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1);
             const __m256i utf8_0 = _mm256_shuffle_epi8(out0, shuffle);
             const __m256i utf8_1 = _mm256_shuffle_epi8(out1, shuffle);
    @@ -17754,7 +20297,6 @@ std::pair avx512_convert_utf32_to_utf8_with_errors(const char32_t
       return std::make_pair(result(error_code::SUCCESS, buf - start), utf8_output);
     }
     /* end file src/icelake/icelake_convert_utf32_to_utf8.inl.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=icelake/icelake_convert_utf32_to_utf16.inl.cpp
     /* begin file src/icelake/icelake_convert_utf32_to_utf16.inl.cpp */
     // file included directly
     
    @@ -17889,7 +20431,6 @@ std::pair avx512_convert_utf32_to_utf16_with_errors(const cha
       return std::make_pair(result(error_code::SUCCESS, buf - start), utf16_output);
     }
     /* end file src/icelake/icelake_convert_utf32_to_utf16.inl.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=icelake/icelake_ascii_validation.inl.cpp
     /* begin file src/icelake/icelake_ascii_validation.inl.cpp */
     // file included directly
     
    @@ -17908,7 +20449,6 @@ bool validate_ascii(const char* buf, size_t len) {
       return (_mm512_test_epi8_mask(running_or, running_or) == 0);
     }
     /* end file src/icelake/icelake_ascii_validation.inl.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=icelake/icelake_utf32_validation.inl.cpp
     /* begin file src/icelake/icelake_utf32_validation.inl.cpp */
     // file included directly
     
    @@ -17921,225 +20461,192 @@ const char32_t* validate_utf32(const char32_t* buf, size_t len) {
     
         while (buf <= end) {
           __m512i utf32 = _mm512_loadu_si512((const __m512i*)buf);
    -      buf += 16;
    -      currentoffsetmax = _mm512_max_epu32(_mm512_add_epi32(utf32, offset), currentoffsetmax);
    -      currentmax = _mm512_max_epu32(utf32, currentmax);
    -    }
    -
    -    const __m512i standardmax = _mm512_set1_epi32((uint32_t)0x10ffff);
    -    const __m512i standardoffsetmax = _mm512_set1_epi32((uint32_t)0xfffff7ff);
    -    __m512i is_zero = _mm512_xor_si512(_mm512_max_epu32(currentmax, standardmax), standardmax);
    -    if (_mm512_test_epi8_mask(is_zero, is_zero) != 0) {
    -      return nullptr;
    -    }
    -    is_zero = _mm512_xor_si512(_mm512_max_epu32(currentoffsetmax, standardoffsetmax), standardoffsetmax);
    -    if (_mm512_test_epi8_mask(is_zero, is_zero) != 0) {
    -      return nullptr;
    -    }
    -
    -    return buf;
    -}
    -/* end file src/icelake/icelake_utf32_validation.inl.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=icelake/icelake_convert_utf16_to_utf8.inl.cpp
    -/* begin file src/icelake/icelake_convert_utf16_to_utf8.inl.cpp */
    -// file included directly
    -
    -/**
    - * This function converts the input (inbuf, inlen), assumed to be valid
    - * UTF16 (little endian) into UTF-8 (to outbuf). The number of words written
    - * is written to 'outlen' and the function reports the number of input word
    - * consumed.
    - */
    -template 
    -size_t utf16_to_utf8_avx512i(const char16_t *inbuf, size_t inlen,
    -                               unsigned char *outbuf, size_t *outlen) {
    -  __m512i in;
    -  __mmask32 inmask = _cvtu32_mask32(0x7fffffff);
    -  __m512i byteflip = _mm512_setr_epi64(
    -            0x0607040502030001,
    -            0x0e0f0c0d0a0b0809,
    -            0x0607040502030001,
    -            0x0e0f0c0d0a0b0809,
    -            0x0607040502030001,
    -            0x0e0f0c0d0a0b0809,
    -            0x0607040502030001,
    -            0x0e0f0c0d0a0b0809
    -        );
    -  const char16_t * const inbuf_orig = inbuf;
    -  const unsigned char * const outbuf_orig = outbuf;
    -  size_t adjust = 0;
    -  int carry = 0;
    -
    -  while (inlen >= 32) {
    -    in = _mm512_loadu_si512(inbuf);
    -    if(big_endian) { in = _mm512_shuffle_epi8(in, byteflip); }
    -    inlen -= 31;
    -  lastiteration:
    -    inbuf += 31;
    -
    -  failiteration:
    -    const __mmask32 is234byte = _mm512_mask_cmp_epu16_mask(
    -      inmask, in, _mm512_set1_epi16(0x0080), _MM_CMPINT_NLT);
    -
    -    if (_ktestz_mask32_u8(inmask, is234byte)) {
    -      // fast path for ASCII only
    -      _mm512_mask_cvtepi16_storeu_epi8(outbuf, inmask, in);
    -      outbuf += 31;
    -      carry = 0;
    -
    -      if (inlen < 32) {
    -        goto tail;
    -      } else {
    -        continue;
    -      }
    -    }
    -
    -    const __mmask32 is12byte =
    -        _mm512_cmp_epu16_mask(in, _mm512_set1_epi16(0x0800), _MM_CMPINT_LT);
    -
    -    if (_ktestc_mask32_u8(is12byte, inmask)) {
    -      // fast path for 1 and 2 byte only
    -
    -      const __m512i twobytes = _mm512_ternarylogic_epi32(
    -          _mm512_slli_epi16(in, 8), _mm512_srli_epi16(in, 6),
    -          _mm512_set1_epi16(0x3f3f), 0xa8); // (A|B)&C
    -      in = _mm512_mask_add_epi16(in, is234byte, twobytes,
    -                                 _mm512_set1_epi16(int16_t(0x80c0)));
    -      const __m512i cmpmask =
    -          _mm512_mask_blend_epi16(inmask, _mm512_set1_epi16(int16_t(0xffff)),
    -                                  _mm512_set1_epi16(0x0800));
    -      const __mmask64 smoosh = _mm512_cmp_epu8_mask(in, cmpmask, _MM_CMPINT_NLT);
    -      const __m512i out = _mm512_maskz_compress_epi8(smoosh, in);
    -      _mm512_mask_storeu_epi8(outbuf, _cvtu64_mask64(_pext_u64(_cvtmask64_u64(smoosh), _cvtmask64_u64(smoosh))),
    -                              out);
    -      outbuf += 31 + _mm_popcnt_u32(_cvtmask32_u32(is234byte));
    -      carry = 0;
    -
    -      if (inlen < 32) {
    -        goto tail;
    -      } else {
    -        continue;
    -      }
    -    }
    -    __m512i lo = _mm512_cvtepu16_epi32(_mm512_castsi512_si256(in));
    -    __m512i hi = _mm512_cvtepu16_epi32(_mm512_extracti32x8_epi32(in, 1));
    -
    -
    -    __m512i taglo = _mm512_set1_epi32(0x8080e000);
    -    __m512i taghi = taglo;
    -
    -    const __m512i fc00masked = _mm512_and_epi32(in, _mm512_set1_epi16(int16_t(0xfc00)));
    -    const __mmask32 hisurr = _mm512_mask_cmp_epu16_mask(
    -        inmask, fc00masked, _mm512_set1_epi16(int16_t(0xd800)), _MM_CMPINT_EQ);
    -    const __mmask32 losurr = _mm512_cmp_epu16_mask(
    -        fc00masked, _mm512_set1_epi16(int16_t(0xdc00)), _MM_CMPINT_EQ);
    -
    -    int carryout = 0;
    -    if (!_kortestz_mask32_u8(hisurr, losurr)) {
    -      // handle surrogates
    -
    -      __m512i los = _mm512_alignr_epi32(hi, lo, 1);
    -      __m512i his = _mm512_alignr_epi32(lo, hi, 1);
    -
    -      const __mmask32 hisurrhi = _kshiftri_mask32(hisurr, 16);
    -      taglo =
    -          _mm512_mask_mov_epi32(taglo,__mmask16(hisurr), _mm512_set1_epi32(0x808080f0));
    -      taghi =
    -          _mm512_mask_mov_epi32(taghi, __mmask16(hisurrhi), _mm512_set1_epi32(0x808080f0));
    -
    -      lo = _mm512_mask_slli_epi32(lo, __mmask16(hisurr), lo, 10);
    -      hi = _mm512_mask_slli_epi32(hi, __mmask16(hisurrhi), hi, 10);
    -      los = _mm512_add_epi32(los, _mm512_set1_epi32(0xfca02400));
    -      his = _mm512_add_epi32(his, _mm512_set1_epi32(0xfca02400));
    -      lo = _mm512_mask_add_epi32(lo, __mmask16(hisurr), lo, los);
    -      hi = _mm512_mask_add_epi32(hi, __mmask16(hisurrhi), hi, his);
    -
    -      carryout = _cvtu32_mask32(_kshiftri_mask32(hisurr, 30));
    -
    -      const uint32_t  h = _cvtmask32_u32(hisurr);
    -      const uint32_t  l = _cvtmask32_u32(losurr);
    -      // check for mismatched surrogates
    -      if ((h + h + carry) ^ l) {
    -        const uint32_t lonohi = l & ~(h + h + carry);
    -        const uint32_t hinolo = h & ~(l >> 1);
    -        inlen = _tzcnt_u32(hinolo | lonohi);
    -        inmask = __mmask32(0x7fffffff & ((1 << inlen) - 1));
    -        in = _mm512_maskz_mov_epi16(inmask, in);
    -        adjust = (int)inlen - 31;
    -        inlen = 0;
    -        goto failiteration;
    -      }
    -    }
    -
    -    hi = _mm512_maskz_mov_epi32(_cvtu32_mask16(0x7fff),hi);
    -    carry = carryout;
    -
    -    __m512i mslo =
    -        _mm512_multishift_epi64_epi8(_mm512_set1_epi64(0x20262c3200060c12), lo);
    -
    -    __m512i mshi =
    -        _mm512_multishift_epi64_epi8(_mm512_set1_epi64(0x20262c3200060c12), hi);
    -
    -    const __mmask32 outmask = __mmask32(_kandn_mask64(losurr, inmask));
    -    const __mmask64 outmhi = _kshiftri_mask64(outmask, 16);
    -
    -    const __mmask32 is1byte = __mmask32(_knot_mask64(is234byte));
    -    const __mmask64 is1bhi = _kshiftri_mask64(is1byte, 16);
    -    const __mmask64 is12bhi = _kshiftri_mask64(is12byte, 16);
    -
    -    taglo =
    -        _mm512_mask_mov_epi32(taglo, __mmask16(is12byte), _mm512_set1_epi32(0x80c00000));
    -    taghi =
    -        _mm512_mask_mov_epi32(taghi, __mmask16(is12bhi), _mm512_set1_epi32(0x80c00000));
    -    __m512i magiclo = _mm512_mask_blend_epi32(__mmask16(outmask), _mm512_set1_epi32(0xffffffff),
    -                                      _mm512_set1_epi32(0x00010101));
    -    __m512i magichi = _mm512_mask_blend_epi32(__mmask16(outmhi), _mm512_set1_epi32(0xffffffff),
    -                                      _mm512_set1_epi32(0x00010101));
    -
    -
    -    magiclo = _mm512_mask_blend_epi32(__mmask16(outmask), _mm512_set1_epi32(0xffffffff),
    -                                      _mm512_set1_epi32(0x00010101));
    -    magichi = _mm512_mask_blend_epi32(__mmask16(outmhi), _mm512_set1_epi32(0xffffffff),
    -                                      _mm512_set1_epi32(0x00010101));
    -
    -    mslo = _mm512_ternarylogic_epi32(mslo, _mm512_set1_epi32(0x3f3f3f3f), taglo,
    -                                     0xea); // A&B|C
    -    mshi = _mm512_ternarylogic_epi32(mshi, _mm512_set1_epi32(0x3f3f3f3f), taghi,
    -                                     0xea);
    -    mslo = _mm512_mask_slli_epi32(mslo, __mmask16(is1byte), lo, 24);
    -
    -    mshi = _mm512_mask_slli_epi32(mshi, __mmask16(is1bhi), hi, 24);
    -
    -    const __mmask64 wantlo = _mm512_cmp_epu8_mask(mslo, magiclo, _MM_CMPINT_NLT);
    -    const __mmask64 wanthi = _mm512_cmp_epu8_mask(mshi, magichi, _MM_CMPINT_NLT);
    -    const __m512i outlo = _mm512_maskz_compress_epi8(wantlo, mslo);
    -    const __m512i outhi = _mm512_maskz_compress_epi8(wanthi, mshi);
    -    const uint64_t wantlo_uint64 = _cvtmask64_u64(wantlo);
    -    const uint64_t wanthi_uint64 = _cvtmask64_u64(wanthi);
    +      buf += 16;
    +      currentoffsetmax = _mm512_max_epu32(_mm512_add_epi32(utf32, offset), currentoffsetmax);
    +      currentmax = _mm512_max_epu32(utf32, currentmax);
    +    }
     
    -    uint64_t advlo = _mm_popcnt_u64(wantlo_uint64);
    -    uint64_t advhi = _mm_popcnt_u64(wanthi_uint64);
    +    const __m512i standardmax = _mm512_set1_epi32((uint32_t)0x10ffff);
    +    const __m512i standardoffsetmax = _mm512_set1_epi32((uint32_t)0xfffff7ff);
    +    __m512i is_zero = _mm512_xor_si512(_mm512_max_epu32(currentmax, standardmax), standardmax);
    +    if (_mm512_test_epi8_mask(is_zero, is_zero) != 0) {
    +      return nullptr;
    +    }
    +    is_zero = _mm512_xor_si512(_mm512_max_epu32(currentoffsetmax, standardoffsetmax), standardoffsetmax);
    +    if (_mm512_test_epi8_mask(is_zero, is_zero) != 0) {
    +      return nullptr;
    +    }
     
    -    _mm512_mask_storeu_epi8(outbuf, _cvtu64_mask64(_pext_u64(wantlo_uint64, wantlo_uint64)), outlo);
    -    _mm512_mask_storeu_epi8(outbuf + advlo, _cvtu64_mask64(_pext_u64(wanthi_uint64, wanthi_uint64)), outhi);
    -    outbuf += advlo + advhi;
    +    return buf;
    +}
    +/* end file src/icelake/icelake_utf32_validation.inl.cpp */
    +/* begin file src/icelake/icelake_convert_latin1_to_utf8.inl.cpp */
    +// file included directly
    +
    +static inline size_t latin1_to_utf8_avx512_vec(__m512i input, size_t input_len, char *utf8_output, int mask_output) {
    +  __mmask64 nonascii = _mm512_movepi8_mask(input);
    +  size_t output_size = input_len + (size_t)count_ones(nonascii);
    +  
    +  // Mask to denote whether the byte is a leading byte that is not ascii
    +  __mmask64 sixth =
    +      _mm512_cmpge_epu8_mask(input, _mm512_set1_epi8(-64)); //binary representation of -64: 1100 0000
    +  
    +  const uint64_t alternate_bits = UINT64_C(0x5555555555555555);
    +  uint64_t ascii = ~nonascii;
    +  // the bits in ascii are inverted and zeros are interspersed in between them
    +  uint64_t maskA = ~_pdep_u64(ascii, alternate_bits);
    +  uint64_t maskB = ~_pdep_u64(ascii>>32, alternate_bits);
    +  
    +  // interleave bytes from top and bottom halves (abcd...ABCD -> aAbBcCdD)
    +  __m512i input_interleaved = _mm512_permutexvar_epi8(_mm512_set_epi32(
    +    0x3f1f3e1e, 0x3d1d3c1c, 0x3b1b3a1a, 0x39193818,
    +    0x37173616, 0x35153414, 0x33133212, 0x31113010,
    +    0x2f0f2e0e, 0x2d0d2c0c, 0x2b0b2a0a, 0x29092808,
    +    0x27072606, 0x25052404, 0x23032202, 0x21012000
    +  ), input);
    +  
    +  // double size of each byte, and insert the leading byte 1100 0010
    +
    +/* 
    +upscale the bytes to 16-bit value, adding the 0b11000000 leading byte in the process.
    +We adjust for the bytes that have their two most significant bits. This takes care of the first 32 bytes, assuming we interleaved the bytes. */
    +  __m512i outputA = _mm512_shldi_epi16(input_interleaved, _mm512_set1_epi8(-62), 8); 
    +  outputA = _mm512_mask_add_epi16(
    +                                  outputA, 
    +                                 (__mmask32)sixth, 
    +                                  outputA, 
    +                                  _mm512_set1_epi16(1 - 0x4000)); // 1- 0x4000 = 1100 0000 0000 0001????
    +  
    +  // in the second 32-bit half, set first or second option based on whether original input is leading byte (second case) or not (first case)
    +  __m512i leadingB = _mm512_mask_blend_epi16(
    +                                              (__mmask32)(sixth>>32), 
    +                                              _mm512_set1_epi16(0x00c2), // 0000 0000 1101 0010
    +                                              _mm512_set1_epi16(0x40c3));// 0100 0000 1100 0011
    +  __m512i outputB = _mm512_ternarylogic_epi32(
    +                                              input_interleaved, 
    +                                              leadingB, 
    +                                              _mm512_set1_epi16((short)0xff00), 
    +                                              (240 & 170) ^ 204); // (input_interleaved & 0xff00) ^ leadingB
    +  
    +  // prune redundant bytes
    +  outputA = _mm512_maskz_compress_epi8(maskA, outputA);
    +  outputB = _mm512_maskz_compress_epi8(maskB, outputB);
    +  
    +  
    +  size_t output_sizeA = (size_t)count_ones((uint32_t)nonascii) + 32;
    +
    +  if(mask_output) {
    +    if(input_len > 32) { // is the second half of the input vector used?
    +      __mmask64 write_mask = _bzhi_u64(~0ULL, (unsigned int)output_sizeA);
    +      _mm512_mask_storeu_epi8(utf8_output, write_mask, outputA);
    +      utf8_output += output_sizeA;
    +      write_mask = _bzhi_u64(~0ULL, (unsigned int)(output_size - output_sizeA));
    +      _mm512_mask_storeu_epi8(utf8_output, write_mask, outputB);
    +    } else {
    +      __mmask64 write_mask = _bzhi_u64(~0ULL, (unsigned int)output_size);
    +      _mm512_mask_storeu_epi8(utf8_output, write_mask, outputA);
    +    }
    +  } else {
    +    _mm512_storeu_si512(utf8_output, outputA);
    +    utf8_output += output_sizeA;
    +    _mm512_storeu_si512(utf8_output, outputB);
       }
    -  outbuf -= adjust;
    +  return output_size;
    +}
    + 
    +static inline size_t latin1_to_utf8_avx512_branch(__m512i input, char *utf8_output) {
    +  __mmask64 nonascii = _mm512_movepi8_mask(input);
    +  if(nonascii) {
    +    return latin1_to_utf8_avx512_vec(input, 64, utf8_output, 0);
    +  } else {
    +    _mm512_storeu_si512(utf8_output, input);
    +    return 64;
    +  }
    +}
    + 
    +size_t latin1_to_utf8_avx512_start(const char *buf, size_t len, char *utf8_output) {
    +  char *start = utf8_output;
    +  size_t pos = 0;
    +  // if there's at least 128 bytes remaining, we don't need to mask the output
    +  for (; pos + 128 <= len; pos += 64) {
    +    __m512i input = _mm512_loadu_si512((__m512i *)(buf + pos));
    +    utf8_output += latin1_to_utf8_avx512_branch(input, utf8_output);
    +  }
    +  // in the last 128 bytes, the first 64 may require masking the output
    +  if (pos + 64 <= len) {
    +    __m512i input = _mm512_loadu_si512((__m512i *)(buf + pos));
    +    utf8_output += latin1_to_utf8_avx512_vec(input, 64, utf8_output, 1);
    +    pos += 64;
    +  }
    +  // with the last 64 bytes, the input also needs to be masked
    +  if (pos < len) {
    +    __mmask64 load_mask = _bzhi_u64(~0ULL, (unsigned int)(len - pos));
    +    __m512i input = _mm512_maskz_loadu_epi8(load_mask, (__m512i *)(buf + pos));
    +    utf8_output += latin1_to_utf8_avx512_vec(input, len - pos, utf8_output, 1);
    +  }
    +  return (size_t)(utf8_output - start);
    +}
    +/* end file src/icelake/icelake_convert_latin1_to_utf8.inl.cpp */
    +/* begin file src/icelake/icelake_convert_latin1_to_utf16.inl.cpp */
    +// file included directly
    +template 
    +size_t icelake_convert_latin1_to_utf16(const char *latin1_input, size_t len,
    +                                       char16_t *utf16_output) {
    +  size_t rounded_len = len & ~0x1F; // Round down to nearest multiple of 32
    +
    +  __m512i byteflip = _mm512_setr_epi64(0x0607040502030001, 0x0e0f0c0d0a0b0809,
    +                                       0x0607040502030001, 0x0e0f0c0d0a0b0809,
    +                                       0x0607040502030001, 0x0e0f0c0d0a0b0809,
    +                                       0x0607040502030001, 0x0e0f0c0d0a0b0809);
    +  for (size_t i = 0; i < rounded_len; i += 32) {
    +    // Load 32 Latin1 characters into a 256-bit register
    +    __m256i in = _mm256_loadu_si256((__m256i *)&latin1_input[i]);
    +    // Zero extend each set of 8 Latin1 characters to 32 16-bit integers
    +    __m512i out = _mm512_cvtepu8_epi16(in);
    +    if (big_endian) {
    +      out = _mm512_shuffle_epi8(out, byteflip);
    +    }
    +    // Store the results back to memory
    +    _mm512_storeu_si512((__m512i *)&utf16_output[i], out);
    +  }
    +  if (rounded_len != len) {
    +    uint32_t mask = uint32_t(1 << (len - rounded_len)) - 1;
    +    __m256i in = _mm256_maskz_loadu_epi8(mask, latin1_input + rounded_len);
     
    -tail:
    -  if (inlen != 0) {
    -    // We must have inlen < 31.
    -    inmask = _cvtu32_mask32((1 << inlen) - 1);
    -    in = _mm512_maskz_loadu_epi16(inmask, inbuf);
    -    if(big_endian) { in = _mm512_shuffle_epi8(in, byteflip); }
    -    adjust = inlen - 31;
    -    inlen = 0;
    -    goto lastiteration;
    +    // Zero extend each set of 8 Latin1 characters to 32 16-bit integers
    +    __m512i out = _mm512_cvtepu8_epi16(in);
    +    if (big_endian) {
    +      out = _mm512_shuffle_epi8(out, byteflip);
    +    }
    +    // Store the results back to memory
    +    _mm512_mask_storeu_epi16(utf16_output + rounded_len, mask, out);
       }
    -  *outlen = (outbuf - outbuf_orig) + adjust;
    -  return ((inbuf - inbuf_orig) + adjust);
    +
    +  return len;
     }
    -/* end file src/icelake/icelake_convert_utf16_to_utf8.inl.cpp */
    +/* end file src/icelake/icelake_convert_latin1_to_utf16.inl.cpp */
    +/* begin file src/icelake/icelake_convert_latin1_to_utf32.inl.cpp */
    +std::pair avx512_convert_latin1_to_utf32(const char* buf, size_t len, char32_t* utf32_output) {
    +    size_t rounded_len = len & ~0xF;  // Round down to nearest multiple of 16
    +    
    +    for (size_t i = 0; i < rounded_len; i += 16) { 
    +        // Load 16 Latin1 characters into a 128-bit register
    +        __m128i in = _mm_loadu_si128((__m128i*)&buf[i]);
    +        
    +        // Zero extend each set of 8 Latin1 characters to 16 32-bit integers using vpmovzxbd
    +        __m512i out = _mm512_cvtepu8_epi32(in);
    +        
    +        // Store the results back to memory
    +        _mm512_storeu_si512((__m512i*)&utf32_output[i], out);
    +    }
    +
    +    // Return pointers pointing to where we left off
    +    return std::make_pair(buf + rounded_len, utf32_output + rounded_len);
    +}
    +/* end file src/icelake/icelake_convert_latin1_to_utf32.inl.cpp */
    +
    +
    +#include 
     
     } // namespace
     } // namespace icelake
    @@ -18148,7 +20655,6 @@ size_t utf16_to_utf8_avx512i(const char16_t *inbuf, size_t inlen,
     namespace simdutf {
     namespace icelake {
     
    -
     simdutf_warn_unused int
     implementation::detect_encodings(const char *input,
                                      size_t length) const noexcept {
    @@ -18183,7 +20689,7 @@ implementation::detect_encodings(const char *input,
             // be valid UTF-16LE, at least one surrogate must be in the two most
             // significant bytes of a 32-bit word since they always come in pairs in
             // UTF-16LE. Note that we always proceed in multiple of 4 before this
    -        // point so there is no offset in 32-bit words.
    +        // point so there is no offset in 32-bit code units.
     
             if ((surrogates & 0xaaaaaaaa) != 0) {
               is_utf32 = false;
    @@ -18199,7 +20705,7 @@ implementation::detect_encodings(const char *input,
               if (ends_with_high) {
                 buf +=
                     31 *
    -                sizeof(char16_t); // advance only by 31 words so that we start
    +                sizeof(char16_t); // advance only by 31 code units so that we start
                                       // with the high surrogate on the next round.
               } else {
                 buf += 32 * sizeof(char16_t);
    @@ -18226,7 +20732,6 @@ implementation::detect_encodings(const char *input,
               }
               return simdutf::encoding_type::unspecified;
             }
    -        break;
           }
           // If no surrogate, validate under other encodings as well
     
    @@ -18368,7 +20873,7 @@ simdutf_warn_unused bool implementation::validate_utf16le(const char16_t *buf, s
             }
             bool ends_with_high = ((highsurrogates & 0x80000000) != 0);
             if(ends_with_high) {
    -          buf += 31; // advance only by 31 words so that we start with the high surrogate on the next round.
    +          buf += 31; // advance only by 31 code units so that we start with the high surrogate on the next round.
             } else {
               buf += 32;
             }
    @@ -18417,7 +20922,7 @@ simdutf_warn_unused bool implementation::validate_utf16be(const char16_t *buf, s
             }
             bool ends_with_high = ((highsurrogates & 0x80000000) != 0);
             if(ends_with_high) {
    -          buf += 31; // advance only by 31 words so that we start with the high surrogate on the next round.
    +          buf += 31; // advance only by 31 code units so that we start with the high surrogate on the next round.
             } else {
               buf += 32;
             }
    @@ -18459,7 +20964,7 @@ simdutf_warn_unused result implementation::validate_utf16le_with_errors(const ch
             }
             bool ends_with_high = ((highsurrogates & 0x80000000) != 0);
             if(ends_with_high) {
    -          buf += 31; // advance only by 31 words so that we start with the high surrogate on the next round.
    +          buf += 31; // advance only by 31 code units so that we start with the high surrogate on the next round.
             } else {
               buf += 32;
             }
    @@ -18513,7 +21018,7 @@ simdutf_warn_unused result implementation::validate_utf16be_with_errors(const ch
             }
             bool ends_with_high = ((highsurrogates & 0x80000000) != 0);
             if(ends_with_high) {
    -          buf += 31; // advance only by 31 words so that we start with the high surrogate on the next round.
    +          buf += 31; // advance only by 31 code units so that we start with the high surrogate on the next round.
             } else {
               buf += 32;
             }
    @@ -18588,6 +21093,63 @@ simdutf_warn_unused result implementation::validate_utf32_with_errors(const char
         return result(error_code::SUCCESS, len);
     }
     
    +simdutf_warn_unused size_t implementation::convert_latin1_to_utf8(const char * buf, size_t len, char* utf8_output) const noexcept {
    +  return icelake::latin1_to_utf8_avx512_start(buf, len, utf8_output);
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_latin1_to_utf16le(const char* buf, size_t len, char16_t* utf16_output) const noexcept {
    +  return icelake_convert_latin1_to_utf16(buf, len, utf16_output);
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_latin1_to_utf16be(const char* buf, size_t len, char16_t* utf16_output) const noexcept {
    +  return icelake_convert_latin1_to_utf16(buf, len, utf16_output);
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_latin1_to_utf32(const char* buf, size_t len, char32_t* utf32_output) const noexcept {
    +    std::pair ret = avx512_convert_latin1_to_utf32(buf, len, utf32_output);
    +    if (ret.first == nullptr) { return 0; }
    +    size_t converted_chars = ret.second - utf32_output;
    +    if (ret.first != buf + len) {
    +        const size_t scalar_converted_chars = scalar::latin1_to_utf32::convert(
    +                                              ret.first, len - (ret.first - buf), ret.second);
    +        if (scalar_converted_chars == 0) { return 0; }
    +        converted_chars += scalar_converted_chars;
    +    }
    +    return converted_chars;
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_utf8_to_latin1(const char* buf, size_t len, char* latin1_output) const noexcept {
    +  return icelake::utf8_to_latin1_avx512(buf, len, latin1_output);
    +}
    +
    +
    +simdutf_warn_unused result implementation::convert_utf8_to_latin1_with_errors(const char* buf, size_t len, char* latin1_output) const noexcept {
    +  // Initialize output length and input length counters
    +  size_t inlen = 0;
    +
    +  // First, try to convert as much as possible using the SIMD implementation.
    +  inlen = icelake::utf8_to_latin1_avx512(buf, len, latin1_output);
    +  
    +  // If we have completely converted the string
    +  if(inlen == len) {
    +    return {simdutf::SUCCESS, len};
    +  }
    +  
    +  // Else if there are remaining bytes, use the scalar function to process them.
    +  // Note: This is assuming scalar::utf8_to_latin1::convert_with_errors is a function that takes 
    +  // the input buffer, length, and output buffer, and returns a result object with an error code 
    +  // and the number of characters processed.
    +  result res = scalar::utf8_to_latin1::convert_with_errors(buf + inlen, len - inlen, latin1_output + inlen);
    +  res.count += inlen; // Add the number of characters processed by the SIMD implementation
    +
    +  return res;
    +}
    +
    +
    +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_latin1(const char* buf, size_t len, char* latin1_output) const noexcept {
    +  return icelake::valid_utf8_to_latin1_avx512(buf, len, latin1_output);
    +}
    +
     simdutf_warn_unused size_t implementation::convert_utf8_to_utf16le(const char* buf, size_t len, char16_t* utf16_output) const noexcept {
       utf8_to_utf16_result ret = fast_avx512_convert_utf8_to_utf16(buf, len, utf16_output);
       if (ret.second == nullptr) {
    @@ -18767,6 +21329,33 @@ simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf32(const cha
       return saved_bytes;
     }
     
    +
    +simdutf_warn_unused size_t implementation::convert_utf16le_to_latin1(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  return icelake_convert_utf16_to_latin1(buf,len,latin1_output);
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_utf16be_to_latin1(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  return icelake_convert_utf16_to_latin1(buf,len,latin1_output);
    +}
    +
    +simdutf_warn_unused result implementation::convert_utf16le_to_latin1_with_errors(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  return icelake_convert_utf16_to_latin1_with_errors(buf,len,latin1_output).first;
    +}
    +
    +simdutf_warn_unused result implementation::convert_utf16be_to_latin1_with_errors(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  return icelake_convert_utf16_to_latin1_with_errors(buf,len,latin1_output).first;
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_latin1(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  // optimization opportunity: implement custom function
    +  return convert_utf16be_to_latin1(buf, len, latin1_output);
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_latin1(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  // optimization opportunity: implement custom function
    +  return convert_utf16le_to_latin1(buf, len, latin1_output);
    +}
    +
     simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8(const char16_t* buf, size_t len, char* utf8_output) const noexcept {
       size_t outlen;
       size_t inlen = utf16_to_utf8_avx512i(buf, len, (unsigned char*)utf8_output, &outlen);
    @@ -18811,6 +21400,18 @@ simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf8(const c
       return convert_utf16be_to_utf8(buf, len, utf8_output);
     }
     
    +simdutf_warn_unused size_t implementation::convert_utf32_to_latin1(const char32_t* buf, size_t len, char* latin1_output) const noexcept {
    +  return icelake_convert_utf32_to_latin1(buf,len,latin1_output);
    +}
    +
    +simdutf_warn_unused result implementation::convert_utf32_to_latin1_with_errors(const char32_t* buf, size_t len, char* latin1_output) const noexcept {
    +  return icelake_convert_utf32_to_latin1_with_errors(buf,len,latin1_output).first;
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_latin1(const char32_t* buf, size_t len, char* latin1_output) const noexcept {
    +  return icelake_convert_utf32_to_latin1(buf,len,latin1_output);
    +}
    +
     
     simdutf_warn_unused size_t implementation::convert_utf32_to_utf8(const char32_t* buf, size_t len, char* utf8_output) const noexcept {
       std::pair ret = avx512_convert_utf32_to_utf8(buf, len, utf8_output);
    @@ -18826,7 +21427,7 @@ simdutf_warn_unused size_t implementation::convert_utf32_to_utf8(const char32_t*
     }
     
     simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors(const char32_t* buf, size_t len, char* utf8_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = icelake::avx512_convert_utf32_to_utf8_with_errors(buf, len, utf8_output);
       if (ret.first.count != len) {
         result scalar_res = scalar::utf32_to_utf8::convert_with_errors(
    @@ -18838,7 +21439,7 @@ simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors(con
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf8_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf8_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
    @@ -18873,7 +21474,7 @@ simdutf_warn_unused size_t implementation::convert_utf32_to_utf16be(const char32
     }
     
     simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors(const char32_t* buf, size_t len, char16_t* utf16_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = avx512_convert_utf32_to_utf16_with_errors(buf, len, utf16_output);
       if (ret.first.count != len) {
         result scalar_res = scalar::utf32_to_utf16::convert_with_errors(
    @@ -18885,12 +21486,12 @@ simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors(
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf16_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf16_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
     simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors(const char32_t* buf, size_t len, char16_t* utf16_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = avx512_convert_utf32_to_utf16_with_errors(buf, len, utf16_output);
       if (ret.first.count != len) {
         result scalar_res = scalar::utf32_to_utf16::convert_with_errors(
    @@ -18902,7 +21503,7 @@ simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors(
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf16_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf16_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
    @@ -19088,23 +21689,75 @@ simdutf_warn_unused size_t implementation::count_utf16be(const char16_t * input,
     
     
     simdutf_warn_unused size_t implementation::count_utf8(const char * input, size_t length) const noexcept {
    -  const char* end = length >= 64 ? input + length - 64 : nullptr;
    -  const char* ptr = input;
    +  const uint8_t *str = reinterpret_cast(input);
    +  size_t answer =  length / sizeof(__m512i) * sizeof(__m512i); // Number of 512-bit chunks that fits into the length.
    +  size_t i = 0;
    +  __m512i unrolled_popcount{0}; 
     
       const __m512i continuation = _mm512_set1_epi8(char(0b10111111));
     
    -  size_t count{0};
    +  while (i + sizeof(__m512i) <= length) {
    +    size_t iterations = (length - i) / sizeof(__m512i);
     
    -  while (ptr <= end) {
    -    __m512i utf8 = _mm512_loadu_si512((const __m512i*)ptr);
    -    ptr += 64;
    -    uint64_t continuation_bitmask = static_cast(_mm512_cmple_epi8_mask(utf8, continuation));
    -    count += 64 - count_ones(continuation_bitmask);
    +    size_t max_i = i + iterations * sizeof(__m512i) - sizeof(__m512i);
    +    for (; i + 8*sizeof(__m512i) <= max_i; i += 8*sizeof(__m512i)) {
    +        __m512i input1 = _mm512_loadu_si512((const __m512i *)(str + i));
    +        __m512i input2 = _mm512_loadu_si512((const __m512i *)(str + i + sizeof(__m512i)));
    +        __m512i input3 = _mm512_loadu_si512((const __m512i *)(str + i + 2*sizeof(__m512i)));
    +        __m512i input4 = _mm512_loadu_si512((const __m512i *)(str + i + 3*sizeof(__m512i)));
    +        __m512i input5 = _mm512_loadu_si512((const __m512i *)(str + i + 4*sizeof(__m512i)));
    +        __m512i input6 = _mm512_loadu_si512((const __m512i *)(str + i + 5*sizeof(__m512i)));
    +        __m512i input7 = _mm512_loadu_si512((const __m512i *)(str + i + 6*sizeof(__m512i)));
    +        __m512i input8 = _mm512_loadu_si512((const __m512i *)(str + i + 7*sizeof(__m512i)));
    +
    +
    +        __mmask64 mask1 = _mm512_cmple_epi8_mask(input1, continuation);
    +        __mmask64 mask2 = _mm512_cmple_epi8_mask(input2, continuation);
    +        __mmask64 mask3 = _mm512_cmple_epi8_mask(input3, continuation);
    +        __mmask64 mask4 = _mm512_cmple_epi8_mask(input4, continuation);
    +        __mmask64 mask5 = _mm512_cmple_epi8_mask(input5, continuation);
    +        __mmask64 mask6 = _mm512_cmple_epi8_mask(input6, continuation);
    +        __mmask64 mask7 = _mm512_cmple_epi8_mask(input7, continuation);
    +        __mmask64 mask8 = _mm512_cmple_epi8_mask(input8, continuation);
    +
    +        __m512i mask_register = _mm512_set_epi64(mask8, mask7, mask6, mask5, mask4, mask3, mask2, mask1);
    +
    +
    +        unrolled_popcount = _mm512_add_epi64(unrolled_popcount, _mm512_popcnt_epi64(mask_register));
    +    }
    +
    +    for (; i <= max_i; i += sizeof(__m512i)) {
    +      __m512i more_input = _mm512_loadu_si512((const __m512i *)(str + i));
    +      uint64_t continuation_bitmask = static_cast(_mm512_cmple_epi8_mask(more_input, continuation));
    +      answer -= count_ones(continuation_bitmask);
    +    }
       }
     
    -  return count + scalar::utf8::count_code_points(ptr, length - (ptr - input));
    +  __m256i first_half = _mm512_extracti64x4_epi64(unrolled_popcount, 0);
    +  __m256i second_half = _mm512_extracti64x4_epi64(unrolled_popcount, 1);
    +  answer -= (size_t)_mm256_extract_epi64(first_half, 0) +
    +            (size_t)_mm256_extract_epi64(first_half, 1) +
    +            (size_t)_mm256_extract_epi64(first_half, 2) +
    +            (size_t)_mm256_extract_epi64(first_half, 3) +
    +            (size_t)_mm256_extract_epi64(second_half, 0) +
    +            (size_t)_mm256_extract_epi64(second_half, 1) +
    +            (size_t)_mm256_extract_epi64(second_half, 2) +
    +            (size_t)_mm256_extract_epi64(second_half, 3);
    +
    +  return answer + scalar::utf8::count_code_points(reinterpret_cast(str + i), length - i);
    +}
    +
    +simdutf_warn_unused size_t implementation::latin1_length_from_utf8(const char* buf, size_t len) const noexcept {
    +  return count_utf8(buf,len);
    +}
    +
    +simdutf_warn_unused size_t implementation::latin1_length_from_utf16(size_t length) const noexcept {
    +  return scalar::utf16::latin1_length_from_utf16(length);
     }
     
    +simdutf_warn_unused size_t implementation::latin1_length_from_utf32(size_t length) const noexcept {
    +  return scalar::utf32::latin1_length_from_utf32(length);
    +}
     
     simdutf_warn_unused size_t implementation::utf8_length_from_utf16le(const char16_t * input, size_t length) const noexcept {
       const char16_t* end = length >= 32 ? input + length - 32 : nullptr;
    @@ -19183,6 +21836,76 @@ simdutf_warn_unused size_t implementation::utf32_length_from_utf16be(const char1
       return implementation::count_utf16be(input, length);
     }
     
    +simdutf_warn_unused size_t implementation::utf16_length_from_latin1(size_t length) const noexcept {
    +  return scalar::latin1::utf16_length_from_latin1(length);
    +}
    +
    +
    +simdutf_warn_unused size_t implementation::utf32_length_from_latin1(size_t length) const noexcept {
    +  return scalar::latin1::utf32_length_from_latin1(length);
    +}
    +
    +simdutf_warn_unused size_t implementation::utf8_length_from_latin1(const char * input, size_t length) const noexcept {
    +  const uint8_t *str = reinterpret_cast(input);
    +  size_t answer = length / sizeof(__m512i) * sizeof(__m512i);
    +  size_t i = 0;
    +  unsigned char v_0xFF = 0xff;
    +  __m512i eight_64bits = _mm512_setzero_si512();
    +  while (i + sizeof(__m512i) <= length) {
    +    __m512i runner = _mm512_setzero_si512();
    +    size_t iterations = (length - i) / sizeof(__m512i);
    +    if (iterations > 255) {
    +      iterations = 255;
    +    }
    +    size_t max_i = i + iterations * sizeof(__m512i) - sizeof(__m512i);
    +    for (; i + 4*sizeof(__m512i) <= max_i; i += 4*sizeof(__m512i)) {
    +            // Load four __m512i vectors
    +            __m512i input1 = _mm512_loadu_si512((const __m512i *)(str + i));
    +            __m512i input2 = _mm512_loadu_si512((const __m512i *)(str + i + sizeof(__m512i)));
    +            __m512i input3 = _mm512_loadu_si512((const __m512i *)(str + i + 2*sizeof(__m512i)));
    +            __m512i input4 = _mm512_loadu_si512((const __m512i *)(str + i + 3*sizeof(__m512i)));
    +
    +            // Generate four masks
    +            __mmask64 mask1 = _mm512_cmpgt_epi8_mask(_mm512_setzero_si512(), input1);
    +            __mmask64 mask2 = _mm512_cmpgt_epi8_mask(_mm512_setzero_si512(), input2);
    +            __mmask64 mask3 = _mm512_cmpgt_epi8_mask(_mm512_setzero_si512(), input3);
    +            __mmask64 mask4 = _mm512_cmpgt_epi8_mask(_mm512_setzero_si512(), input4);
    +            // Apply the masks and subtract from the runner
    +            __m512i not_ascii1 = _mm512_mask_set1_epi8(_mm512_setzero_si512(), mask1, v_0xFF);
    +            __m512i not_ascii2 = _mm512_mask_set1_epi8(_mm512_setzero_si512(), mask2, v_0xFF);
    +            __m512i not_ascii3 = _mm512_mask_set1_epi8(_mm512_setzero_si512(), mask3, v_0xFF);
    +            __m512i not_ascii4 = _mm512_mask_set1_epi8(_mm512_setzero_si512(), mask4, v_0xFF);
    +
    +            runner = _mm512_sub_epi8(runner, not_ascii1);
    +            runner = _mm512_sub_epi8(runner, not_ascii2);
    +            runner = _mm512_sub_epi8(runner, not_ascii3);
    +            runner = _mm512_sub_epi8(runner, not_ascii4);
    +    }
    +
    +    for (; i <= max_i; i += sizeof(__m512i)) {
    +      __m512i more_input = _mm512_loadu_si512((const __m512i *)(str + i));
    +
    +      __mmask64 mask = _mm512_cmpgt_epi8_mask(_mm512_setzero_si512(), more_input);
    +      __m512i not_ascii = _mm512_mask_set1_epi8(_mm512_setzero_si512(), mask, v_0xFF);
    +      runner = _mm512_sub_epi8(runner, not_ascii);
    +    }
    +
    +    eight_64bits = _mm512_add_epi64(eight_64bits, _mm512_sad_epu8(runner, _mm512_setzero_si512()));
    +  }
    +
    +  __m256i first_half = _mm512_extracti64x4_epi64(eight_64bits, 0);
    +  __m256i second_half = _mm512_extracti64x4_epi64(eight_64bits, 1);
    +  answer += (size_t)_mm256_extract_epi64(first_half, 0) +
    +            (size_t)_mm256_extract_epi64(first_half, 1) +
    +            (size_t)_mm256_extract_epi64(first_half, 2) +
    +            (size_t)_mm256_extract_epi64(first_half, 3) +
    +            (size_t)_mm256_extract_epi64(second_half, 0) +
    +            (size_t)_mm256_extract_epi64(second_half, 1) +
    +            (size_t)_mm256_extract_epi64(second_half, 2) +
    +            (size_t)_mm256_extract_epi64(second_half, 3);
    +  return answer + scalar::latin1::utf8_length_from_latin1(reinterpret_cast(str + i), length - i);
    +}
    +
     simdutf_warn_unused size_t implementation::utf16_length_from_utf8(const char * input, size_t length) const noexcept {
         size_t pos = 0;
         size_t count = 0;
    @@ -19252,7 +21975,6 @@ simdutf_warn_unused size_t implementation::utf32_length_from_utf8(const char * i
     } // namespace icelake
     } // namespace simdutf
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/icelake/end.h
     /* begin file src/simdutf/icelake/end.h */
     #if SIMDUTF_CAN_ALWAYS_RUN_ICELAKE
     // nothing needed.
    @@ -19268,10 +21990,8 @@ SIMDUTF_POP_DISABLE_WARNINGS
     /* end file src/icelake/implementation.cpp */
     #endif
     #if SIMDUTF_IMPLEMENTATION_HASWELL
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=haswell/implementation.cpp
     /* begin file src/haswell/implementation.cpp */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/haswell/begin.h
     /* begin file src/simdutf/haswell/begin.h */
     // redefining SIMDUTF_IMPLEMENTATION to "haswell"
     // #define SIMDUTF_IMPLEMENTATION haswell
    @@ -19314,7 +22034,6 @@ simdutf_really_inline simd8 must_be_2_3_continuation(const simd8
       return simd8(is_third_byte | is_fourth_byte) > int8_t(0);
     }
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=haswell/avx2_detect_encodings.cpp
     /* begin file src/haswell/avx2_detect_encodings.cpp */
     template
     // len is known to be a multiple of 2 when this is called
    @@ -19358,7 +22077,7 @@ int avx2_detect_encodings(const char * buf, size_t len) {
                 // To be valid UTF-32, a surrogate cannot be in the two most significant bytes of any 32-bit word.
                 // On the other hand, to be valid UTF-16LE, at least one surrogate must be in the two most significant
                 // bytes of a 32-bit word since they always come in pairs in UTF-16LE.
    -            // Note that we always proceed in multiple of 4 before this point so there is no offset in 32-bit words.
    +            // Note that we always proceed in multiple of 4 before this point so there is no offset in 32-bit code units.
     
                 if ((surrogates_bitmask0 & 0xaaaaaaaa) != 0) {
                     is_utf32 = false;
    @@ -19504,10 +22223,9 @@ int avx2_detect_encodings(const char * buf, size_t len) {
     }
     /* end file src/haswell/avx2_detect_encodings.cpp */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=haswell/avx2_validate_utf16.cpp
     /* begin file src/haswell/avx2_validate_utf16.cpp */
     /*
    -    In UTF-16 words in range 0xD800 to 0xDFFF have special meaning.
    +    In UTF-16 code units in range 0xD800 to 0xDFFF have special meaning.
     
         In a vectorized algorithm we want to examine the most significant
         nibble in order to select a fast path. If none of highest nibbles
    @@ -19543,7 +22261,7 @@ int avx2_detect_encodings(const char * buf, size_t len) {
           0   0   1   0   1   0   0   0   b = a << 1
           1   1   1   1   1   1   1   0   c = V | a | b
                                       ^
    -                                  the last bit can be zero, we just consume 7 words
    +                                  the last bit can be zero, we just consume 7 code units
                                       and recheck this word in the next iteration
     */
     
    @@ -19589,7 +22307,7 @@ const char16_t* avx2_validate_utf16(const char16_t* input, size_t size) {
                 //
                 //    Fact: high surrogate has 11th bit set (3rd bit in the higher word)
     
    -            // V - non-surrogate words
    +            // V - non-surrogate code units
                 //     V = not surrogates_wordmask
                 const uint32_t V = ~surrogates_bitmask;
     
    @@ -19610,10 +22328,10 @@ const char16_t* avx2_validate_utf16(const char16_t* input, size_t size) {
     
                 if (c == 0xffffffff) {
                     // The whole input register contains valid UTF-16, i.e.,
    -                // either single words or proper surrogate pairs.
    +                // either single code units or proper surrogate pairs.
                     input += simd16::ELEMENTS * 2;
                 } else if (c == 0x7fffffff) {
    -                // The 31 lower words of the input register contains valid UTF-16.
    +                // The 31 lower code units of the input register contains valid UTF-16.
                     // The 31 word may be either a low or high surrogate. It the next
                     // iteration we 1) check if the low surrogate is followed by a high
                     // one, 2) reject sole high surrogate.
    @@ -19667,7 +22385,7 @@ const result avx2_validate_utf16_with_errors(const char16_t* input, size_t size)
                 //
                 //    Fact: high surrogate has 11th bit set (3rd bit in the higher word)
     
    -            // V - non-surrogate words
    +            // V - non-surrogate code units
                 //     V = not surrogates_wordmask
                 const uint32_t V = ~surrogates_bitmask;
     
    @@ -19688,10 +22406,10 @@ const result avx2_validate_utf16_with_errors(const char16_t* input, size_t size)
     
                 if (c == 0xffffffff) {
                     // The whole input register contains valid UTF-16, i.e.,
    -                // either single words or proper surrogate pairs.
    +                // either single code units or proper surrogate pairs.
                     input += simd16::ELEMENTS * 2;
                 } else if (c == 0x7fffffff) {
    -                // The 31 lower words of the input register contains valid UTF-16.
    +                // The 31 lower code units of the input register contains valid UTF-16.
                     // The 31 word may be either a low or high surrogate. It the next
                     // iteration we 1) check if the low surrogate is followed by a high
                     // one, 2) reject sole high surrogate.
    @@ -19705,7 +22423,6 @@ const result avx2_validate_utf16_with_errors(const char16_t* input, size_t size)
         return result(error_code::SUCCESS, input - start);
     }
     /* end file src/haswell/avx2_validate_utf16.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=haswell/avx2_validate_utf32le.cpp
     /* begin file src/haswell/avx2_validate_utf32le.cpp */
     /* Returns:
        - pointer to the last unprocessed character (a scalar fallback should check the rest);
    @@ -19771,7 +22488,145 @@ const result avx2_validate_utf32le_with_errors(const char32_t* input, size_t siz
     }
     /* end file src/haswell/avx2_validate_utf32le.cpp */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=haswell/avx2_convert_utf8_to_utf16.cpp
    +/* begin file src/haswell/avx2_convert_latin1_to_utf8.cpp */
    +std::pair avx2_convert_latin1_to_utf8(const char *latin1_input, size_t len,
    +                           char *utf8_output) {
    +  const char *end = latin1_input + len;
    +  const __m256i v_0000 = _mm256_setzero_si256();
    +  const __m256i v_c080 = _mm256_set1_epi16((int16_t)0xc080);
    +  const __m256i v_ff80 = _mm256_set1_epi16((int16_t)0xff80);
    +  const size_t safety_margin = 12;
    +
    +  while (latin1_input + 16 + safety_margin <= end) {
    +    __m128i in8 = _mm_loadu_si128((__m128i *)latin1_input);
    +    // a single 16-bit UTF-16 word can yield 1, 2 or 3 UTF-8 bytes
    +    const __m128i v_80 = _mm_set1_epi8((char)0x80);
    +    if (_mm_testz_si128(in8, v_80)) { // ASCII fast path!!!!
    +      // 1. store (16 bytes)
    +      _mm_storeu_si128((__m128i *)utf8_output, in8);
    +      // 2. adjust pointers
    +      latin1_input += 16;
    +      utf8_output += 16;
    +      continue; // we are done for this round!
    +    }
    +    // We proceed only with the first 16 bytes.
    +    const __m256i in = _mm256_cvtepu8_epi16((in8));
    +
    +    // 1. prepare 2-byte values
    +    // input 16-bit word : [0000|0000|aabb|bbbb] x 8
    +    // expected output   : [1100|00aa|10bb|bbbb] x 8
    +    const __m256i v_1f00 = _mm256_set1_epi16((int16_t)0x1f00);
    +    const __m256i v_003f = _mm256_set1_epi16((int16_t)0x003f);
    +
    +    // t0 = [0000|00aa|bbbb|bb00]
    +    const __m256i t0 = _mm256_slli_epi16(in, 2);
    +    // t1 = [0000|00aa|0000|0000]
    +    const __m256i t1 = _mm256_and_si256(t0, v_1f00);
    +    // t2 = [0000|0000|00bb|bbbb]
    +    const __m256i t2 = _mm256_and_si256(in, v_003f);
    +    // t3 = [000a|aaaa|00bb|bbbb]
    +    const __m256i t3 = _mm256_or_si256(t1, t2);
    +    // t4 = [1100|00aa|10bb|bbbb]
    +    const __m256i t4 = _mm256_or_si256(t3, v_c080);
    +
    +    // 2. merge ASCII and 2-byte codewords
    +
    +    // no bits set above 7th bit
    +    const __m256i one_byte_bytemask = _mm256_cmpeq_epi16(_mm256_and_si256(in, v_ff80), v_0000);
    +    const uint32_t one_byte_bitmask = static_cast(_mm256_movemask_epi8(one_byte_bytemask));
    +
    +    const __m256i utf8_unpacked = _mm256_blendv_epi8(t4, in, one_byte_bytemask);
    +
    +    // 3. prepare bitmask for 8-bit lookup
    +    const uint32_t M0 = one_byte_bitmask & 0x55555555;
    +    const uint32_t M1 = M0 >> 7;
    +    const uint32_t M2 = (M1 | M0) & 0x00ff00ff;
    +    // 4. pack the bytes
    +
    +    const uint8_t *row =
    +        &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2)][0];
    +    const uint8_t *row_2 =
    +        &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2 >> 16)]
    +                                                            [0];
    +
    +    const __m128i shuffle = _mm_loadu_si128((__m128i *)(row + 1));
    +    const __m128i shuffle_2 = _mm_loadu_si128((__m128i *)(row_2 + 1));
    +
    +    const __m256i utf8_packed = _mm256_shuffle_epi8(
    +        utf8_unpacked, _mm256_setr_m128i(shuffle, shuffle_2));
    +    // 5. store bytes
    +    _mm_storeu_si128((__m128i *)utf8_output,
    +                     _mm256_castsi256_si128(utf8_packed));
    +    utf8_output += row[0];
    +    _mm_storeu_si128((__m128i *)utf8_output,
    +                     _mm256_extractf128_si256(utf8_packed, 1));
    +    utf8_output += row_2[0];
    +
    +    // 6. adjust pointers
    +    latin1_input += 16;
    +    continue;
    +
    +  } // while
    +  return std::make_pair(latin1_input, utf8_output);
    +}
    +/* end file src/haswell/avx2_convert_latin1_to_utf8.cpp */
    +/* begin file src/haswell/avx2_convert_latin1_to_utf16.cpp */
    +template 
    +std::pair avx2_convert_latin1_to_utf16(const char* latin1_input, size_t len, char16_t* utf16_output) {
    +    size_t rounded_len = len & ~0xF; // Round down to nearest multiple of 32
    +
    +    size_t i = 0;
    +    for (; i < rounded_len; i += 16) {
    +        // Load 16 bytes from the address (input + i) into a xmm register
    +        __m128i xmm0 = _mm_loadu_si128(reinterpret_cast(latin1_input + i));
    +
    +        // Zero extend each byte in xmm0 to word and put it in another xmm register
    +        __m128i xmm1 = _mm_cvtepu8_epi16(xmm0);
    +        
    +        // Shift xmm0 to the right by 8 bytes
    +        xmm0 = _mm_srli_si128(xmm0, 8);
    +        
    +        // Zero extend each byte in the shifted xmm0 to word in xmm0
    +        xmm0 = _mm_cvtepu8_epi16(xmm0);
    +
    +        if (big_endian) {
    +            const __m128i swap = _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14);
    +            xmm0 = _mm_shuffle_epi8(xmm0, swap);
    +            xmm1 = _mm_shuffle_epi8(xmm1, swap);
    +        }
    +        
    +        // Store the contents of xmm1 into the address pointed by (output + i)
    +        _mm_storeu_si128(reinterpret_cast<__m128i*>(utf16_output + i), xmm1);
    +        
    +        // Store the contents of xmm0 into the address pointed by (output + i + 8)
    +        _mm_storeu_si128(reinterpret_cast<__m128i*>(utf16_output + i + 8), xmm0);
    +    }
    +
    +    return std::make_pair(latin1_input + rounded_len, utf16_output + rounded_len);
    +
    +}
    +/* end file src/haswell/avx2_convert_latin1_to_utf16.cpp */
    +/* begin file src/haswell/avx2_convert_latin1_to_utf32.cpp */
    +std::pair avx2_convert_latin1_to_utf32(const char* buf, size_t len, char32_t* utf32_output) {
    +    size_t rounded_len = ((len | 7) ^ 7);  // Round down to nearest multiple of 8
    +    
    +    for (size_t i = 0; i < rounded_len; i += 8) { 
    +        // Load 8 Latin1 characters into a 64-bit register
    +        __m128i in = _mm_loadl_epi64((__m128i*)&buf[i]);
    +        
    +        // Zero extend each set of 8 Latin1 characters to 8 32-bit integers using vpmovzxbd
    +        __m256i out = _mm256_cvtepu8_epi32(in);
    +        
    +        // Store the results back to memory
    +        _mm256_storeu_si256((__m256i*)&utf32_output[i], out);
    +    }
    +
    +    // return pointers pointing to where we left off
    +    return std::make_pair(buf + rounded_len, utf32_output + rounded_len);
    +}
    +
    +/* end file src/haswell/avx2_convert_latin1_to_utf32.cpp */
    +
     /* begin file src/haswell/avx2_convert_utf8_to_utf16.cpp */
     // depends on "tables/utf8_to_utf16_tables.h"
     
    @@ -19811,7 +22666,7 @@ size_t convert_masked_utf8_to_utf16(const char *input,
         return 16; // We consumed 16 bytes.
       }
       if(((utf8_end_of_code_point_mask & 0xffff) == 0xaaaa)) {
    -    // We want to take 8 2-byte UTF-8 words and turn them into 8 2-byte UTF-16 words.
    +    // We want to take 8 2-byte UTF-8 code units and turn them into 8 2-byte UTF-16 code units.
         // There is probably a more efficient sequence, but the following might do.
         const __m128i sh = _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14);
         const __m128i perm = _mm_shuffle_epi8(in, sh);
    @@ -19824,7 +22679,7 @@ size_t convert_masked_utf8_to_utf16(const char *input,
         return 16;
       }
       if(input_utf8_end_of_code_point_mask == 0x924) {
    -    // We want to take 4 3-byte UTF-8 words and turn them into 4 2-byte UTF-16 words.
    +    // We want to take 4 3-byte UTF-8 code units and turn them into 4 2-byte UTF-16 code units.
         // There is probably a more efficient sequence, but the following might do.
         const __m128i sh = _mm_setr_epi8(2, 1, 0, -1, 5, 4, 3, -1, 8, 7, 6, -1, 11, 10, 9, -1);
         const __m128i perm = _mm_shuffle_epi8(in, sh);
    @@ -19850,10 +22705,10 @@ size_t convert_masked_utf8_to_utf16(const char *input,
       const uint8_t consumed =
           simdutf::tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][1];
       if (idx < 64) {
    -    // SIX (6) input code-words
    +    // SIX (6) input code-code units
         // this is a relatively easy scenario
    -    // we process SIX (6) input code-words. The max length in bytes of six code
    -    // words spanning between 1 and 2 bytes each is 12 bytes. On processors
    +    // we process SIX (6) input code-code units. The max length in bytes of six code
    +    // code units spanning between 1 and 2 bytes each is 12 bytes. On processors
         // where pdep/pext is fast, we might be able to use a small lookup table.
         const __m128i sh =
             _mm_loadu_si128((const __m128i *)simdutf::tables::utf8_to_utf16::shufutf8[idx]);
    @@ -19865,7 +22720,7 @@ size_t convert_masked_utf8_to_utf16(const char *input,
         _mm_storeu_si128((__m128i *)utf16_output, composed);
         utf16_output += 6; // We wrote 12 bytes, 6 code points. There is a potential overflow of 4 bytes.
       } else if (idx < 145) {
    -    // FOUR (4) input code-words
    +    // FOUR (4) input code-code units
         const __m128i sh =
             _mm_loadu_si128((const __m128i *)simdutf::tables::utf8_to_utf16::shufutf8[idx]);
         const __m128i perm = _mm_shuffle_epi8(in, sh);
    @@ -19884,7 +22739,7 @@ size_t convert_masked_utf8_to_utf16(const char *input,
         _mm_storeu_si128((__m128i *)utf16_output, composed_repacked);
         utf16_output += 4; // Here we overflow by 8 bytes.
       } else if (idx < 209) {
    -    // TWO (2) input code-words
    +    // TWO (2) input code-code units
         //////////////
         // There might be garbage inputs where a leading byte mascarades as a four-byte
         // leading byte (by being followed by 3 continuation byte), but is not greater than
    @@ -19954,7 +22809,6 @@ size_t convert_masked_utf8_to_utf16(const char *input,
       return consumed;
     }
     /* end file src/haswell/avx2_convert_utf8_to_utf16.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=haswell/avx2_convert_utf8_to_utf32.cpp
     /* begin file src/haswell/avx2_convert_utf8_to_utf32.cpp */
     // depends on "tables/utf8_to_utf16_tables.h"
     
    @@ -19987,7 +22841,7 @@ size_t convert_masked_utf8_to_utf32(const char *input,
         return 16; // We consumed 16 bytes.
       }
       if(((utf8_end_of_code_point_mask & 0xffff) == 0xaaaa)) {
    -    // We want to take 8 2-byte UTF-8 words and turn them into 8 4-byte UTF-32 words.
    +    // We want to take 8 2-byte UTF-8 code units and turn them into 8 4-byte UTF-32 code units.
         // There is probably a more efficient sequence, but the following might do.
         const __m128i sh = _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14);
         const __m128i perm = _mm_shuffle_epi8(in, sh);
    @@ -19999,7 +22853,7 @@ size_t convert_masked_utf8_to_utf32(const char *input,
         return 16;
       }
       if(input_utf8_end_of_code_point_mask == 0x924) {
    -    // We want to take 4 3-byte UTF-8 words and turn them into 4 4-byte UTF-32 words.
    +    // We want to take 4 3-byte UTF-8 code units and turn them into 4 4-byte UTF-32 code units.
         // There is probably a more efficient sequence, but the following might do.
         const __m128i sh = _mm_setr_epi8(2, 1, 0, -1, 5, 4, 3, -1, 8, 7, 6, -1, 11, 10, 9, -1);
         const __m128i perm = _mm_shuffle_epi8(in, sh);
    @@ -20024,10 +22878,10 @@ size_t convert_masked_utf8_to_utf32(const char *input,
       const uint8_t consumed =
           tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][1];
       if (idx < 64) {
    -    // SIX (6) input code-words
    +    // SIX (6) input code-code units
         // this is a relatively easy scenario
    -    // we process SIX (6) input code-words. The max length in bytes of six code
    -    // words spanning between 1 and 2 bytes each is 12 bytes. On processors
    +    // we process SIX (6) input code-code units. The max length in bytes of six code
    +    // code units spanning between 1 and 2 bytes each is 12 bytes. On processors
         // where pdep/pext is fast, we might be able to use a small lookup table.
         const __m128i sh =
             _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]);
    @@ -20039,7 +22893,7 @@ size_t convert_masked_utf8_to_utf32(const char *input,
         utf32_output += 6; // We wrote 24 bytes, 6 code points. There is a potential
         // overflow of 32 - 24 = 8 bytes.
       } else if (idx < 145) {
    -    // FOUR (4) input code-words
    +    // FOUR (4) input code-code units
         const __m128i sh =
             _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]);
         const __m128i perm = _mm_shuffle_epi8(in, sh);
    @@ -20056,7 +22910,7 @@ size_t convert_masked_utf8_to_utf32(const char *input,
         _mm_storeu_si128((__m128i *)utf32_output, composed);
         utf32_output += 4;
       } else if (idx < 209) {
    -    // TWO (2) input code-words
    +    // TWO (2) input code-code units
         const __m128i sh =
             _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]);
         const __m128i perm = _mm_shuffle_epi8(in, sh);
    @@ -20083,11 +22937,97 @@ size_t convert_masked_utf8_to_utf32(const char *input,
     }
     /* end file src/haswell/avx2_convert_utf8_to_utf32.cpp */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=haswell/avx2_convert_utf16_to_utf8.cpp
    +/* begin file src/haswell/avx2_convert_utf16_to_latin1.cpp */
    +template 
    +std::pair
    +avx2_convert_utf16_to_latin1(const char16_t *buf, size_t len,
    +                             char *latin1_output) {
    +  const char16_t *end = buf + len;
    +  while (buf + 16 <= end) {
    +    // Load 16 UTF-16 characters into 256-bit AVX2 register
    +    __m256i in = _mm256_loadu_si256(reinterpret_cast(buf));
    +
    +    if (!match_system(big_endian)) {
    +      const __m256i swap = _mm256_setr_epi8(
    +          1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 17, 16, 19, 18,
    +          21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 31, 30);
    +      in = _mm256_shuffle_epi8(in, swap);
    +    }
    +
    +    __m256i high_byte_mask = _mm256_set1_epi16((int16_t)0xFF00);
    +    if (_mm256_testz_si256(in, high_byte_mask)) {
    +      // Pack 16-bit characters into 8-bit and store in latin1_output
    +      __m128i lo = _mm256_extractf128_si256(in, 0);
    +      __m128i hi = _mm256_extractf128_si256(in, 1);
    +      __m128i latin1_packed_lo = _mm_packus_epi16(lo, lo);
    +      __m128i latin1_packed_hi = _mm_packus_epi16(hi, hi);
    +      _mm_storel_epi64(reinterpret_cast<__m128i *>(latin1_output),
    +                       latin1_packed_lo);
    +      _mm_storel_epi64(reinterpret_cast<__m128i *>(latin1_output + 8),
    +                       latin1_packed_hi);
    +      // Adjust pointers for next iteration
    +      buf += 16;
    +      latin1_output += 16;
    +    } else {
    +      return std::make_pair(nullptr, reinterpret_cast(latin1_output));
    +    }
    +  } // while
    +  return std::make_pair(buf, latin1_output);
    +}
    +
    +template 
    +std::pair
    +avx2_convert_utf16_to_latin1_with_errors(const char16_t *buf, size_t len,
    +                                         char *latin1_output) {
    +  const char16_t *start = buf;
    +  const char16_t *end = buf + len;
    +  while (buf + 16 <= end) {
    +    __m256i in = _mm256_loadu_si256(reinterpret_cast(buf));
    +
    +    if (!big_endian) {
    +      const __m256i swap = _mm256_setr_epi8(
    +          1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 17, 16, 19, 18,
    +          21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 31, 30);
    +      in = _mm256_shuffle_epi8(in, swap);
    +    }
    +
    +    __m256i high_byte_mask = _mm256_set1_epi16((int16_t)0xFF00);
    +    if (_mm256_testz_si256(in, high_byte_mask)) {
    +      __m128i lo = _mm256_extractf128_si256(in, 0);
    +      __m128i hi = _mm256_extractf128_si256(in, 1);
    +      __m128i latin1_packed_lo = _mm_packus_epi16(lo, lo);
    +      __m128i latin1_packed_hi = _mm_packus_epi16(hi, hi);
    +      _mm_storel_epi64(reinterpret_cast<__m128i *>(latin1_output),
    +                       latin1_packed_lo);
    +      _mm_storel_epi64(reinterpret_cast<__m128i *>(latin1_output + 8),
    +                       latin1_packed_hi);
    +      buf += 16;
    +      latin1_output += 16;
    +    } else {
    +      // Fallback to scalar code for handling errors
    +      for (int k = 0; k < 16; k++) {
    +        uint16_t word = !match_system(big_endian)
    +                            ? scalar::utf16::swap_bytes(buf[k])
    +                            : buf[k];
    +        if (word <= 0xff) {
    +          *latin1_output++ = char(word);
    +        } else {
    +          return std::make_pair(
    +              result{error_code::TOO_LARGE, (size_t)(buf - start + k)},
    +              latin1_output);
    +        }
    +      }
    +      buf += 16;
    +    }
    +  } // while
    +  return std::make_pair(result{error_code::SUCCESS, (size_t)(buf - start)},
    +                        latin1_output);
    +}
    +/* end file src/haswell/avx2_convert_utf16_to_latin1.cpp */
     /* begin file src/haswell/avx2_convert_utf16_to_utf8.cpp */
     /*
         The vectorized algorithm works on single SSE register i.e., it
    -    loads eight 16-bit words.
    +    loads eight 16-bit code units.
     
         We consider three cases:
         1. an input register contains no surrogates and each value
    @@ -20099,7 +23039,7 @@ size_t convert_masked_utf8_to_utf32(const char *input,
     
         Ad 1.
     
    -    When values are less than 0x0800, it means that a 16-bit words
    +    When values are less than 0x0800, it means that a 16-bit code unit
         can be converted into: 1) single UTF8 byte (when it's an ASCII
         char) or 2) two UTF8 bytes.
     
    @@ -20113,7 +23053,7 @@ size_t convert_masked_utf8_to_utf32(const char *input,
     
         Ad 2.
     
    -    When values fit in 16-bit words, but are above 0x07ff, then
    +    When values fit in 16-bit code units, but are above 0x07ff, then
         a single word may produce one, two or three UTF8 bytes.
     
         We prepare data for all these three cases in two registers.
    @@ -20230,7 +23170,7 @@ std::pair avx2_convert_utf16_to_utf8(const char16_t* buf
         // It might seem like checking for surrogates_bitmask == 0xc000 could help. However,
         // it is likely an uncommon occurrence.
         if (surrogates_bitmask == 0x00000000) {
    -      // case: words from register produce either 1, 2 or 3 UTF-8 bytes
    +      // case: code units from register produce either 1, 2 or 3 UTF-8 bytes
             const __m256i dup_even = _mm256_setr_epi16(0x0000, 0x0202, 0x0404, 0x0606,
                                                     0x0808, 0x0a0a, 0x0c0c, 0x0e0e,
                                                     0x0000, 0x0202, 0x0404, 0x0606,
    @@ -20241,7 +23181,7 @@ std::pair avx2_convert_utf16_to_utf8(const char16_t* buf
                2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc]              - two UTF-8 bytes
                3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three UTF-8 bytes
     
    -          We expand the input word (16-bit) into two words (32-bit), thus
    +          We expand the input word (16-bit) into two code units (32-bit), thus
               we have room for four bytes. However, we need five distinct bit
               layouts. Note that the last byte in cases #2 and #3 is the same.
     
    @@ -20252,7 +23192,7 @@ std::pair avx2_convert_utf16_to_utf8(const char16_t* buf
               either byte 1 for case #2 or byte 2 for case #3. Note that they
               differ by exactly one bit.
     
    -          Finally from these two words we build proper UTF-8 sequence, taking
    +          Finally from these two code units we build proper UTF-8 sequence, taking
               into account the case (i.e, the number of bytes to write).
             */
             /**
    @@ -20280,16 +23220,16 @@ std::pair avx2_convert_utf16_to_utf8(const char16_t* buf
             const __m256i s4 = _mm256_xor_si256(s3, m0);
     #undef simdutf_vec
     
    -        // 4. expand words 16-bit => 32-bit
    +        // 4. expand code units 16-bit => 32-bit
             const __m256i out0 = _mm256_unpacklo_epi16(t2, s4);
             const __m256i out1 = _mm256_unpackhi_epi16(t2, s4);
     
    -        // 5. compress 32-bit words into 1, 2 or 3 bytes -- 2 x shuffle
    +        // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
             const uint32_t mask = (one_byte_bitmask & 0x55555555) |
                                   (one_or_two_bytes_bitmask & 0xaaaaaaaa);
             // Due to the wider registers, the following path is less likely to be useful.
             /*if(mask == 0) {
    -          // We only have three-byte words. Use fast path.
    +          // We only have three-byte code units. Use fast path.
               const __m256i shuffle = _mm256_setr_epi8(2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1, 2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1);
               const __m256i utf8_0 = _mm256_shuffle_epi8(out0, shuffle);
               const __m256i utf8_1 = _mm256_shuffle_epi8(out1, shuffle);
    @@ -20473,7 +23413,7 @@ std::pair avx2_convert_utf16_to_utf8_with_errors(const char16_t*
         // It might seem like checking for surrogates_bitmask == 0xc000 could help. However,
         // it is likely an uncommon occurrence.
         if (surrogates_bitmask == 0x00000000) {
    -      // case: words from register produce either 1, 2 or 3 UTF-8 bytes
    +      // case: code units from register produce either 1, 2 or 3 UTF-8 bytes
             const __m256i dup_even = _mm256_setr_epi16(0x0000, 0x0202, 0x0404, 0x0606,
                                                     0x0808, 0x0a0a, 0x0c0c, 0x0e0e,
                                                     0x0000, 0x0202, 0x0404, 0x0606,
    @@ -20484,7 +23424,7 @@ std::pair avx2_convert_utf16_to_utf8_with_errors(const char16_t*
                2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc]              - two UTF-8 bytes
                3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three UTF-8 bytes
     
    -          We expand the input word (16-bit) into two words (32-bit), thus
    +          We expand the input word (16-bit) into two code units (32-bit), thus
               we have room for four bytes. However, we need five distinct bit
               layouts. Note that the last byte in cases #2 and #3 is the same.
     
    @@ -20495,7 +23435,7 @@ std::pair avx2_convert_utf16_to_utf8_with_errors(const char16_t*
               either byte 1 for case #2 or byte 2 for case #3. Note that they
               differ by exactly one bit.
     
    -          Finally from these two words we build proper UTF-8 sequence, taking
    +          Finally from these two code units we build proper UTF-8 sequence, taking
               into account the case (i.e, the number of bytes to write).
             */
             /**
    @@ -20523,16 +23463,16 @@ std::pair avx2_convert_utf16_to_utf8_with_errors(const char16_t*
             const __m256i s4 = _mm256_xor_si256(s3, m0);
     #undef simdutf_vec
     
    -        // 4. expand words 16-bit => 32-bit
    +        // 4. expand code units 16-bit => 32-bit
             const __m256i out0 = _mm256_unpacklo_epi16(t2, s4);
             const __m256i out1 = _mm256_unpackhi_epi16(t2, s4);
     
    -        // 5. compress 32-bit words into 1, 2 or 3 bytes -- 2 x shuffle
    +        // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
             const uint32_t mask = (one_byte_bitmask & 0x55555555) |
                                   (one_or_two_bytes_bitmask & 0xaaaaaaaa);
             // Due to the wider registers, the following path is less likely to be useful.
             /*if(mask == 0) {
    -          // We only have three-byte words. Use fast path.
    +          // We only have three-byte code units. Use fast path.
               const __m256i shuffle = _mm256_setr_epi8(2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1, 2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1);
               const __m256i utf8_0 = _mm256_shuffle_epi8(out0, shuffle);
               const __m256i utf8_1 = _mm256_shuffle_epi8(out1, shuffle);
    @@ -20616,11 +23556,10 @@ std::pair avx2_convert_utf16_to_utf8_with_errors(const char16_t*
       return std::make_pair(result(error_code::SUCCESS, buf - start), utf8_output);
     }
     /* end file src/haswell/avx2_convert_utf16_to_utf8.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=haswell/avx2_convert_utf16_to_utf32.cpp
     /* begin file src/haswell/avx2_convert_utf16_to_utf32.cpp */
     /*
         The vectorized algorithm works on single SSE register i.e., it
    -    loads eight 16-bit words.
    +    loads eight 16-bit code units.
     
         We consider three cases:
         1. an input register contains no surrogates and each value
    @@ -20632,7 +23571,7 @@ std::pair avx2_convert_utf16_to_utf8_with_errors(const char16_t*
     
         Ad 1.
     
    -    When values are less than 0x0800, it means that a 16-bit words
    +    When values are less than 0x0800, it means that a 16-bit code unit
         can be converted into: 1) single UTF8 byte (when it's an ASCII
         char) or 2) two UTF8 bytes.
     
    @@ -20646,7 +23585,7 @@ std::pair avx2_convert_utf16_to_utf8_with_errors(const char16_t*
     
         Ad 2.
     
    -    When values fit in 16-bit words, but are above 0x07ff, then
    +    When values fit in 16-bit code units, but are above 0x07ff, then
         a single word may produce one, two or three UTF8 bytes.
     
         We prepare data for all these three cases in two registers.
    @@ -20697,7 +23636,7 @@ std::pair avx2_convert_utf16_to_utf32(const char16_t
         // It might seem like checking for surrogates_bitmask == 0xc000 could help. However,
         // it is likely an uncommon occurrence.
         if (surrogates_bitmask == 0x00000000) {
    -      // case: we extend all sixteen 16-bit words to sixteen 32-bit words
    +      // case: we extend all sixteen 16-bit code units to sixteen 32-bit code units
             _mm256_storeu_si256(reinterpret_cast<__m256i *>(utf32_output), _mm256_cvtepu16_epi32(_mm256_castsi256_si128(in)));
             _mm256_storeu_si256(reinterpret_cast<__m256i *>(utf32_output + 8), _mm256_cvtepu16_epi32(_mm256_extractf128_si256(in,1)));
             utf32_output += 16;
    @@ -20765,7 +23704,7 @@ std::pair avx2_convert_utf16_to_utf32_with_errors(const char1
         // It might seem like checking for surrogates_bitmask == 0xc000 could help. However,
         // it is likely an uncommon occurrence.
         if (surrogates_bitmask == 0x00000000) {
    -      // case: we extend all sixteen 16-bit words to sixteen 32-bit words
    +      // case: we extend all sixteen 16-bit code units to sixteen 32-bit code units
             _mm256_storeu_si256(reinterpret_cast<__m256i *>(utf32_output), _mm256_cvtepu16_epi32(_mm256_castsi256_si128(in)));
             _mm256_storeu_si256(reinterpret_cast<__m256i *>(utf32_output + 8), _mm256_cvtepu16_epi32(_mm256_extractf128_si256(in,1)));
             utf32_output += 16;
    @@ -20801,7 +23740,100 @@ std::pair avx2_convert_utf16_to_utf32_with_errors(const char1
     }
     /* end file src/haswell/avx2_convert_utf16_to_utf32.cpp */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=haswell/avx2_convert_utf32_to_utf8.cpp
    +/* begin file src/haswell/avx2_convert_utf32_to_latin1.cpp */
    +std::pair
    +avx2_convert_utf32_to_latin1(const char32_t *buf, size_t len,
    +                             char *latin1_output) {
    +  const size_t rounded_len =
    +  len & ~0x1F; // Round down to nearest multiple of 32
    +
    +  __m256i high_bytes_mask = _mm256_set1_epi32(0xFFFFFF00);
    +
    +  __m256i shufmask = _mm256_set_epi8(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    +                                    -1, 12, 8, 4, 0, -1, -1, -1, -1, -1, -1,
    +                                    -1, -1, -1, -1, -1, -1, 12, 8, 4, 0);
    +
    +  for (size_t i = 0; i < rounded_len; i += 16) {
    +    __m256i in1 = _mm256_loadu_si256((__m256i *)buf);
    +    __m256i in2 = _mm256_loadu_si256((__m256i *)(buf + 8));
    +
    +    __m256i check_combined = _mm256_or_si256(in1, in2);
    +
    +    if (!_mm256_testz_si256(check_combined, high_bytes_mask)) {
    +      return std::make_pair(nullptr, latin1_output);
    +    }
    +
    +    //Turn UTF32 bytes into latin 1 bytes
    +    __m256i shuffled1 = _mm256_shuffle_epi8(in1, shufmask);
    +    __m256i shuffled2 = _mm256_shuffle_epi8(in2, shufmask);
    +
    +    //move Latin1 bytes to their correct spot
    +    __m256i idx1 = _mm256_set_epi32(-1, -1,-1,-1,-1,-1,4,0);
    +    __m256i idx2 = _mm256_set_epi32(-1, -1,-1,-1,4,0,-1,-1);
    +    __m256i reshuffled1 = _mm256_permutevar8x32_epi32(shuffled1, idx1);
    +    __m256i reshuffled2 = _mm256_permutevar8x32_epi32(shuffled2, idx2);
    +
    +    __m256i result = _mm256_or_si256(reshuffled1, reshuffled2);
    +    _mm_storeu_si128((__m128i *)latin1_output,
    +                     _mm256_castsi256_si128(result));
    +
    +    latin1_output += 16;
    +    buf += 16;
    +  }
    +
    +  return std::make_pair(buf, latin1_output);
    +}
    +std::pair
    +avx2_convert_utf32_to_latin1_with_errors(const char32_t *buf, size_t len,
    +                                         char *latin1_output) {
    +    const size_t rounded_len =
    +        len & ~0x1F; // Round down to nearest multiple of 32
    +
    +    __m256i high_bytes_mask = _mm256_set1_epi32(0xFFFFFF00);
    +    __m256i shufmask = _mm256_set_epi8(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    +                                       -1, 12, 8, 4, 0, -1, -1, -1, -1, -1, -1,
    +                                       -1, -1, -1, -1, -1, -1, 12, 8, 4, 0);
    +
    +    const char32_t *start = buf;
    +
    +    for (size_t i = 0; i < rounded_len; i += 16) {
    +        __m256i in1 = _mm256_loadu_si256((__m256i *)buf);
    +        __m256i in2 = _mm256_loadu_si256((__m256i *)(buf + 8));
    +
    +        __m256i check_combined = _mm256_or_si256(in1, in2);
    +
    +        if (!_mm256_testz_si256(check_combined, high_bytes_mask)) {
    +            // Fallback to scalar code for handling errors
    +            for (int k = 0; k < 8; k++) {
    +                char32_t codepoint = buf[k];
    +                if (codepoint <= 0xFF) {
    +                    *latin1_output++ = static_cast(codepoint);
    +                } else {
    +                    return std::make_pair(result(error_code::TOO_LARGE, buf - start + k),
    +                                          latin1_output);
    +                }
    +            }
    +            buf += 8;
    +        } else {
    +            __m256i shuffled1 = _mm256_shuffle_epi8(in1, shufmask);
    +            __m256i shuffled2 = _mm256_shuffle_epi8(in2, shufmask);
    +
    +            __m256i idx1 = _mm256_set_epi32(-1, -1, -1, -1, -1, -1, 4, 0);
    +            __m256i idx2 = _mm256_set_epi32(-1, -1, -1, -1, 4, 0, -1, -1);
    +            __m256i reshuffled1 = _mm256_permutevar8x32_epi32(shuffled1, idx1);
    +            __m256i reshuffled2 = _mm256_permutevar8x32_epi32(shuffled2, idx2);
    +
    +            __m256i result = _mm256_or_si256(reshuffled1, reshuffled2);
    +            _mm_storeu_si128((__m128i *)latin1_output, _mm256_castsi256_si128(result));
    +
    +            latin1_output += 16;
    +            buf += 16;
    +        }
    +    }
    +
    +    return std::make_pair(result(error_code::SUCCESS, buf - start), latin1_output);
    +}
    +/* end file src/haswell/avx2_convert_utf32_to_latin1.cpp */
     /* begin file src/haswell/avx2_convert_utf32_to_utf8.cpp */
     std::pair avx2_convert_utf32_to_utf8(const char32_t* buf, size_t len, char* utf8_output) {
       const char32_t* end = buf + len;
    @@ -20821,7 +23853,7 @@ std::pair avx2_convert_utf32_to_utf8(const char32_t* buf
         __m256i nextin = _mm256_loadu_si256((__m256i*)buf+1);
         running_max = _mm256_max_epu32(_mm256_max_epu32(in, running_max), nextin);
     
    -    // Pack 32-bit UTF-32 words to 16-bit UTF-16 words with unsigned saturation
    +    // Pack 32-bit UTF-32 code units to 16-bit UTF-16 code units with unsigned saturation
         __m256i in_16 = _mm256_packus_epi32(_mm256_and_si256(in, v_7fffffff), _mm256_and_si256(nextin, v_7fffffff));
         in_16 = _mm256_permute4x64_epi64(in_16, 0b11011000);
     
    @@ -20892,7 +23924,7 @@ std::pair avx2_convert_utf32_to_utf8(const char32_t* buf
         const __m256i saturation_bytemask = _mm256_cmpeq_epi32(_mm256_and_si256(_mm256_or_si256(in, nextin), v_ffff0000), v_0000);
         const uint32_t saturation_bitmask = static_cast(_mm256_movemask_epi8(saturation_bytemask));
         if (saturation_bitmask == 0xffffffff) {
    -      // case: words from register produce either 1, 2 or 3 UTF-8 bytes
    +      // case: code units from register produce either 1, 2 or 3 UTF-8 bytes
           const __m256i v_d800 = _mm256_set1_epi16((uint16_t)0xd800);
           forbidden_bytemask = _mm256_or_si256(forbidden_bytemask, _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_f800), v_d800));
     
    @@ -20906,7 +23938,7 @@ std::pair avx2_convert_utf32_to_utf8(const char32_t* buf
             2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc]              - two UTF-8 bytes
             3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three UTF-8 bytes
     
    -        We expand the input word (16-bit) into two words (32-bit), thus
    +        We expand the input word (16-bit) into two code units (32-bit), thus
             we have room for four bytes. However, we need five distinct bit
             layouts. Note that the last byte in cases #2 and #3 is the same.
     
    @@ -20917,7 +23949,7 @@ std::pair avx2_convert_utf32_to_utf8(const char32_t* buf
             either byte 1 for case #2 or byte 2 for case #3. Note that they
             differ by exactly one bit.
     
    -        Finally from these two words we build proper UTF-8 sequence, taking
    +        Finally from these two code units we build proper UTF-8 sequence, taking
             into account the case (i.e, the number of bytes to write).
           */
           /**
    @@ -20945,16 +23977,16 @@ std::pair avx2_convert_utf32_to_utf8(const char32_t* buf
           const __m256i s4 = _mm256_xor_si256(s3, m0);
     #undef simdutf_vec
     
    -      // 4. expand words 16-bit => 32-bit
    +      // 4. expand code units 16-bit => 32-bit
           const __m256i out0 = _mm256_unpacklo_epi16(t2, s4);
           const __m256i out1 = _mm256_unpackhi_epi16(t2, s4);
     
    -      // 5. compress 32-bit words into 1, 2 or 3 bytes -- 2 x shuffle
    +      // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
           const uint32_t mask = (one_byte_bitmask & 0x55555555) |
                                 (one_or_two_bytes_bitmask & 0xaaaaaaaa);
           // Due to the wider registers, the following path is less likely to be useful.
           /*if(mask == 0) {
    -        // We only have three-byte words. Use fast path.
    +        // We only have three-byte code units. Use fast path.
             const __m256i shuffle = _mm256_setr_epi8(2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1, 2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1);
             const __m256i utf8_0 = _mm256_shuffle_epi8(out0, shuffle);
             const __m256i utf8_1 = _mm256_shuffle_epi8(out1, shuffle);
    @@ -21066,7 +24098,7 @@ std::pair avx2_convert_utf32_to_utf8_with_errors(const char32_t*
           return std::make_pair(result(error_code::TOO_LARGE, buf - start), utf8_output);
         }
     
    -    // Pack 32-bit UTF-32 words to 16-bit UTF-16 words with unsigned saturation
    +    // Pack 32-bit UTF-32 code units to 16-bit UTF-16 code units with unsigned saturation
         __m256i in_16 = _mm256_packus_epi32(_mm256_and_si256(in, v_7fffffff), _mm256_and_si256(nextin, v_7fffffff));
         in_16 = _mm256_permute4x64_epi64(in_16, 0b11011000);
     
    @@ -21137,9 +24169,9 @@ std::pair avx2_convert_utf32_to_utf8_with_errors(const char32_t*
         const __m256i saturation_bytemask = _mm256_cmpeq_epi32(_mm256_and_si256(_mm256_or_si256(in, nextin), v_ffff0000), v_0000);
         const uint32_t saturation_bitmask = static_cast(_mm256_movemask_epi8(saturation_bytemask));
         if (saturation_bitmask == 0xffffffff) {
    -      // case: words from register produce either 1, 2 or 3 UTF-8 bytes
    +      // case: code units from register produce either 1, 2 or 3 UTF-8 bytes
     
    -      // Check for illegal surrogate words
    +      // Check for illegal surrogate code units
           const __m256i v_d800 = _mm256_set1_epi16((uint16_t)0xd800);
           const __m256i forbidden_bytemask = _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_f800), v_d800);
           if (static_cast(_mm256_movemask_epi8(forbidden_bytemask)) != 0x0) {
    @@ -21156,7 +24188,7 @@ std::pair avx2_convert_utf32_to_utf8_with_errors(const char32_t*
             2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc]              - two UTF-8 bytes
             3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three UTF-8 bytes
     
    -        We expand the input word (16-bit) into two words (32-bit), thus
    +        We expand the input word (16-bit) into two code units (32-bit), thus
             we have room for four bytes. However, we need five distinct bit
             layouts. Note that the last byte in cases #2 and #3 is the same.
     
    @@ -21167,7 +24199,7 @@ std::pair avx2_convert_utf32_to_utf8_with_errors(const char32_t*
             either byte 1 for case #2 or byte 2 for case #3. Note that they
             differ by exactly one bit.
     
    -        Finally from these two words we build proper UTF-8 sequence, taking
    +        Finally from these two code units we build proper UTF-8 sequence, taking
             into account the case (i.e, the number of bytes to write).
           */
           /**
    @@ -21195,16 +24227,16 @@ std::pair avx2_convert_utf32_to_utf8_with_errors(const char32_t*
           const __m256i s4 = _mm256_xor_si256(s3, m0);
     #undef simdutf_vec
     
    -      // 4. expand words 16-bit => 32-bit
    +      // 4. expand code units 16-bit => 32-bit
           const __m256i out0 = _mm256_unpacklo_epi16(t2, s4);
           const __m256i out1 = _mm256_unpackhi_epi16(t2, s4);
     
    -      // 5. compress 32-bit words into 1, 2 or 3 bytes -- 2 x shuffle
    +      // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
           const uint32_t mask = (one_byte_bitmask & 0x55555555) |
                                 (one_or_two_bytes_bitmask & 0xaaaaaaaa);
           // Due to the wider registers, the following path is less likely to be useful.
           /*if(mask == 0) {
    -        // We only have three-byte words. Use fast path.
    +        // We only have three-byte code units. Use fast path.
             const __m256i shuffle = _mm256_setr_epi8(2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1, 2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1);
             const __m256i utf8_0 = _mm256_shuffle_epi8(out0, shuffle);
             const __m256i utf8_1 = _mm256_shuffle_epi8(out1, shuffle);
    @@ -21284,7 +24316,6 @@ std::pair avx2_convert_utf32_to_utf8_with_errors(const char32_t*
       return std::make_pair(result(error_code::SUCCESS, buf - start), utf8_output);
     }
     /* end file src/haswell/avx2_convert_utf32_to_utf8.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=haswell/avx2_convert_utf32_to_utf16.cpp
     /* begin file src/haswell/avx2_convert_utf32_to_utf16.cpp */
     template 
     std::pair avx2_convert_utf32_to_utf16(const char32_t* buf, size_t len, char16_t* utf16_output) {
    @@ -21415,12 +24446,85 @@ std::pair avx2_convert_utf32_to_utf16_with_errors(const char3
     
       return std::make_pair(result(error_code::SUCCESS, buf - start), utf16_output);
     }
    -/* end file src/haswell/avx2_convert_utf32_to_utf16.cpp */
    +/* end file src/haswell/avx2_convert_utf32_to_utf16.cpp */
    +
    +/* begin file src/haswell/avx2_convert_utf8_to_latin1.cpp */
    +// depends on "tables/utf8_to_utf16_tables.h"
    +
    +// Convert up to 12 bytes from utf8 to latin1 using a mask indicating the
    +// end of the code points. Only the least significant 12 bits of the mask
    +// are accessed.
    +// It returns how many bytes were consumed (up to 12).
    +size_t convert_masked_utf8_to_latin1(const char *input,
    +                           uint64_t utf8_end_of_code_point_mask,
    +                           char *&latin1_output) {
    +  // we use an approach where we try to process up to 12 input bytes.
    +  // Why 12 input bytes and not 16? Because we are concerned with the size of
    +  // the lookup tables. Also 12 is nicely divisible by two and three.
    +  //
    +  //
    +  // Optimization note: our main path below is load-latency dependent. Thus it is maybe
    +  // beneficial to have fast paths that depend on branch prediction but have less latency.
    +  // This results in more instructions but, potentially, also higher speeds.
    +  //
    +  const __m128i in = _mm_loadu_si128((__m128i *)input);
    +  const __m128i in_second_half = _mm_loadu_si128((__m128i *)(input + 16));
    +
    +  const uint16_t input_utf8_end_of_code_point_mask =
    +      utf8_end_of_code_point_mask & 0xfff; //we're only processing 12 bytes in case it`s not all ASCII
    +
    +  if((input_utf8_end_of_code_point_mask & 0xffffffff) == 0xffffffff) {
    +    // Load the next 128 bits.
    +
    +    // Combine the two 128-bit registers into a single 256-bit register.
    +    __m256i in_combined = _mm256_set_m128i(in_second_half, in);
    +
    +    // We process the data in chunks of 32 bytes.
    +    _mm256_storeu_si256(reinterpret_cast<__m256i *>(latin1_output), in_combined);
    +
    +    latin1_output += 32; // We wrote 32 characters.
    +    return 32; // We consumed 32 bytes.
    +  }
    +
    +
    +  if(((utf8_end_of_code_point_mask & 0xffff) == 0xffff)) {
    +    // We process the data in chunks of 16 bytes.
    +    _mm_storeu_si128(reinterpret_cast<__m128i *>(latin1_output), in);
    +    latin1_output += 16; // We wrote 16 characters.
    +    return 16; // We consumed 16 bytes.
    +  }
    +  /// We do not have a fast path available, so we fallback.
    +  const uint8_t idx =
    +      tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][0];
    +  const uint8_t consumed =
    +      tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][1];
    +  // this indicates an invalid input:
    +  if(idx >= 64) { return consumed; }
    +  // Here we should have (idx < 64), if not, there is a bug in the validation or elsewhere.
    +  // SIX (6) input code-code units
    +  // this is a relatively easy scenario
    +  // we process SIX (6) input code-code units. The max length in bytes of six code
    +  // code units spanning between 1 and 2 bytes each is 12 bytes. On processors
    +  // where pdep/pext is fast, we might be able to use a small lookup table.
    +  const __m128i sh =
    +        _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]);
    +  const __m128i perm = _mm_shuffle_epi8(in, sh);
    +  const __m128i ascii = _mm_and_si128(perm, _mm_set1_epi16(0x7f));
    +  const __m128i highbyte = _mm_and_si128(perm, _mm_set1_epi16(0x1f00));
    +  __m128i composed = _mm_or_si128(ascii, _mm_srli_epi16(highbyte, 2));
    +  const __m128i latin1_packed = _mm_packus_epi16(composed,composed);
    +  // writing 8 bytes even though we only care about the first 6 bytes.
    +  // performance note: it would be faster to use _mm_storeu_si128, we should investigate.
    +  _mm_storel_epi64((__m128i *)latin1_output, latin1_packed);
    +  latin1_output += 6; // We wrote 6 bytes.
    +  return consumed;
    +}
    +/* end file src/haswell/avx2_convert_utf8_to_latin1.cpp */
    +
     } // unnamed namespace
     } // namespace haswell
     } // namespace simdutf
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/buf_block_reader.h
     /* begin file src/generic/buf_block_reader.h */
     namespace simdutf {
     namespace haswell {
    @@ -21515,7 +24619,6 @@ simdutf_really_inline void buf_block_reader::advance() {
     } // namespace haswell
     } // namespace simdutf
     /* end file src/generic/buf_block_reader.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_validation/utf8_lookup4_algorithm.h
     /* begin file src/generic/utf8_validation/utf8_lookup4_algorithm.h */
     namespace simdutf {
     namespace haswell {
    @@ -21704,7 +24807,6 @@ using utf8_validation::utf8_checker;
     } // namespace haswell
     } // namespace simdutf
     /* end file src/generic/utf8_validation/utf8_lookup4_algorithm.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_validation/utf8_validator.h
     /* begin file src/generic/utf8_validation/utf8_validator.h */
     namespace simdutf {
     namespace haswell {
    @@ -21832,7 +24934,6 @@ result generic_validate_ascii_with_errors(const char * input, size_t length) {
     } // namespace simdutf
     /* end file src/generic/utf8_validation/utf8_validator.h */
     // transcoding from UTF-8 to UTF-16
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_to_utf16/valid_utf8_to_utf16.h
     /* begin file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */
     
     
    @@ -21907,7 +25008,6 @@ simdutf_warn_unused size_t convert_valid(const char* input, size_t size,
     } // namespace haswell
     } // namespace simdutf
     /* end file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_to_utf16/utf8_to_utf16.h
     /* begin file src/generic/utf8_to_utf16/utf8_to_utf16.h */
     
     
    @@ -22215,7 +25315,6 @@ using namespace simd;
     } // namespace simdutf
     /* end file src/generic/utf8_to_utf16/utf8_to_utf16.h */
     // transcoding from UTF-8 to UTF-32
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_to_utf32/valid_utf8_to_utf32.h
     /* begin file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */
     
     namespace simdutf {
    @@ -22261,7 +25360,6 @@ simdutf_warn_unused size_t convert_valid(const char* input, size_t size,
     } // namespace haswell
     } // namespace simdutf
     /* end file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_to_utf32/utf8_to_utf32.h
     /* begin file src/generic/utf8_to_utf32/utf8_to_utf32.h */
     
     
    @@ -22562,7 +25660,6 @@ using namespace simd;
     } // namespace simdutf
     /* end file src/generic/utf8_to_utf32/utf8_to_utf32.h */
     // other functions
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8.h
     /* begin file src/generic/utf8.h */
     
     namespace simdutf {
    @@ -22577,13 +25674,12 @@ simdutf_really_inline size_t count_code_points(const char* in, size_t size) {
         size_t count = 0;
         for(;pos + 64 <= size; pos += 64) {
           simd8x64 input(reinterpret_cast(in + pos));
    -      uint64_t utf8_continuation_mask = input.lt(-65 + 1);
    -      count += 64 - count_ones(utf8_continuation_mask);
    +      uint64_t utf8_continuation_mask = input.gt(-65);
    +      count += count_ones(utf8_continuation_mask);
         }
         return count + scalar::utf8::count_code_points(in + pos, size - pos);
     }
     
    -
     simdutf_really_inline size_t utf16_length_from_utf8(const char* in, size_t size) {
         size_t pos = 0;
         size_t count = 0;
    @@ -22599,17 +25695,11 @@ simdutf_really_inline size_t utf16_length_from_utf8(const char* in, size_t size)
         }
         return count + scalar::utf8::utf16_length_from_utf8(in + pos, size - pos);
     }
    -
    -
    -simdutf_really_inline size_t utf32_length_from_utf8(const char* in, size_t size) {
    -    return count_code_points(in, size);
    -}
     } // utf8 namespace
     } // unnamed namespace
     } // namespace haswell
     } // namespace simdutf
     /* end file src/generic/utf8.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf16.h
     /* begin file src/generic/utf16.h */
     namespace simdutf {
     namespace haswell {
    @@ -22620,9 +25710,9 @@ template 
     simdutf_really_inline size_t count_code_points(const char16_t* in, size_t size) {
         size_t pos = 0;
         size_t count = 0;
    -    for(;pos + 32 <= size; pos += 32) {
    +    for(;pos < size/32*32; pos += 32) {
           simd16x32 input(reinterpret_cast(in + pos));
    -      if (!match_system(big_endian)) input.swap_bytes();
    +      if (!match_system(big_endian)) { input.swap_bytes(); }
           uint64_t not_pair = input.not_in_range(0xDC00, 0xDFFF);
           count += count_ones(not_pair) / 2;
         }
    @@ -22634,9 +25724,9 @@ simdutf_really_inline size_t utf8_length_from_utf16(const char16_t* in, size_t s
         size_t pos = 0;
         size_t count = 0;
         // This algorithm could no doubt be improved!
    -    for(;pos + 32 <= size; pos += 32) {
    +    for(;pos < size/32*32; pos += 32) {
           simd16x32 input(reinterpret_cast(in + pos));
    -      if (!match_system(big_endian)) input.swap_bytes();
    +      if (!match_system(big_endian)) { input.swap_bytes(); }
           uint64_t ascii_mask = input.lteq(0x7F);
           uint64_t twobyte_mask = input.lteq(0x7FF);
           uint64_t not_pair_mask = input.not_in_range(0xD800, 0xDFFF);
    @@ -22658,7 +25748,7 @@ simdutf_really_inline size_t utf32_length_from_utf16(const char16_t* in, size_t
     simdutf_really_inline void change_endianness_utf16(const char16_t* in, size_t size, char16_t* output) {
       size_t pos = 0;
     
    -  while (pos + 32 <= size) {
    +  while (pos < size/32*32) {
         simd16x32 input(reinterpret_cast(in + pos));
         input.swap_bytes();
         input.store(reinterpret_cast(output));
    @@ -22666,14 +25756,391 @@ simdutf_really_inline void change_endianness_utf16(const char16_t* in, size_t si
         output += 32;
       }
     
    -  scalar::utf16::change_endianness_utf16(in + pos, size - pos, output);
    -}
    +  scalar::utf16::change_endianness_utf16(in + pos, size - pos, output);
    +}
    +
    +} // utf16
    +} // unnamed namespace
    +} // namespace haswell
    +} // namespace simdutf
    +/* end file src/generic/utf16.h */
    +
    +
    +// transcoding from UTF-8 to Latin 1
    +/* begin file src/generic/utf8_to_latin1/utf8_to_latin1.h */
    +
    +
    +namespace simdutf {
    +namespace haswell {
    +namespace {
    +namespace utf8_to_latin1 {
    +using namespace simd;
    +
    +
    +  simdutf_really_inline simd8 check_special_cases(const simd8 input, const simd8 prev1) {
    +// For UTF-8 to Latin 1, we can allow any ASCII character, and any continuation byte,
    +// but the non-ASCII leading bytes must be 0b11000011 or 0b11000010 and nothing else.
    +//
    +// Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII)
    +// Bit 1 = Too Long (ASCII followed by continuation)
    +// Bit 2 = Overlong 3-byte
    +// Bit 4 = Surrogate
    +// Bit 5 = Overlong 2-byte
    +// Bit 7 = Two Continuations
    +    constexpr const uint8_t TOO_SHORT   = 1<<0; // 11______ 0_______
    +                                                // 11______ 11______
    +    constexpr const uint8_t TOO_LONG    = 1<<1; // 0_______ 10______
    +    constexpr const uint8_t OVERLONG_3  = 1<<2; // 11100000 100_____
    +    constexpr const uint8_t SURROGATE   = 1<<4; // 11101101 101_____
    +    constexpr const uint8_t OVERLONG_2  = 1<<5; // 1100000_ 10______
    +    constexpr const uint8_t TWO_CONTS   = 1<<7; // 10______ 10______
    +    constexpr const uint8_t TOO_LARGE   = 1<<3; // 11110100 1001____
    +                                                // 11110100 101_____
    +                                                // 11110101 1001____
    +                                                // 11110101 101_____
    +                                                // 1111011_ 1001____
    +                                                // 1111011_ 101_____
    +                                                // 11111___ 1001____
    +                                                // 11111___ 101_____
    +    constexpr const uint8_t TOO_LARGE_1000 = 1<<6;
    +                                                // 11110101 1000____
    +                                                // 1111011_ 1000____
    +                                                // 11111___ 1000____
    +    constexpr const uint8_t OVERLONG_4  = 1<<6; // 11110000 1000____
    +    constexpr const uint8_t FORBIDDEN  = 0xff;
    +
    +    const simd8 byte_1_high = prev1.shr<4>().lookup_16(
    +      // 0_______ ________ 
    +      TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG,
    +      TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG,
    +      // 10______ ________ 
    +      TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS,
    +      // 1100____ ________ 
    +      TOO_SHORT | OVERLONG_2,
    +      // 1101____ ________ 
    +      FORBIDDEN,
    +      // 1110____ ________ 
    +      FORBIDDEN,
    +      // 1111____ ________ 
    +      FORBIDDEN
    +    );
    +    constexpr const uint8_t CARRY = TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 .
    +    const simd8 byte_1_low = (prev1 & 0x0F).lookup_16(
    +      // ____0000 ________
    +      CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4,
    +      // ____0001 ________
    +      CARRY | OVERLONG_2,
    +      // ____001_ ________
    +      CARRY,
    +      CARRY,
    +
    +      // ____0100 ________
    +      FORBIDDEN,
    +      // ____0101 ________
    +      FORBIDDEN,
    +      // ____011_ ________
    +      FORBIDDEN,
    +      FORBIDDEN,
    +
    +      // ____1___ ________
    +      FORBIDDEN,
    +      FORBIDDEN,
    +      FORBIDDEN,
    +      FORBIDDEN,
    +      FORBIDDEN,
    +      // ____1101 ________
    +      FORBIDDEN,
    +      FORBIDDEN,
    +      FORBIDDEN
    +    );
    +    const simd8 byte_2_high = input.shr<4>().lookup_16(
    +      // ________ 0_______ 
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT,
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT,
    +
    +      // ________ 1000____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | OVERLONG_4,
    +      // ________ 1001____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE,
    +      // ________ 101_____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE  | TOO_LARGE,
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE  | TOO_LARGE,
    +
    +      // ________ 11______
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT
    +    );
    +    return (byte_1_high & byte_1_low & byte_2_high);
    +  }
    +
    +  struct validating_transcoder {
    +    // If this is nonzero, there has been a UTF-8 error.
    +    simd8 error;
    +
    +    validating_transcoder() : error(uint8_t(0)) {}
    +    //
    +    // Check whether the current bytes are valid UTF-8.
    +    //
    +    simdutf_really_inline void check_utf8_bytes(const simd8 input, const simd8 prev_input) {
    +      // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ lead bytes
    +      // (2, 3, 4-byte leads become large positive numbers instead of small negative numbers)
    +      simd8 prev1 = input.prev<1>(prev_input);
    +      this->error |= check_special_cases(input, prev1);
    +    }
    +
    +
    +    simdutf_really_inline size_t convert(const char* in, size_t size, char* latin1_output) {
    +      size_t pos = 0;
    +      char* start{latin1_output};
    +      // In the worst case, we have the haswell kernel which can cause an overflow of
    +      // 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the last 16 bytes,
    +      // and if the data is valid, then it is entirely safe because 16 UTF-8 bytes generate
    +      // much more than 8 bytes. However, you cannot generally assume that you have valid
    +      // UTF-8 input, so we are going to go back from the end counting 8 leading bytes,
    +      // to give us a good margin.
    +      size_t leading_byte = 0;
    +      size_t margin = size;
    +      for(; margin > 0 && leading_byte < 8; margin--) {
    +        leading_byte += (int8_t(in[margin-1]) > -65); //twos complement of -65 is 1011 1111 ...
    +      }
    +      // If the input is long enough, then we have that margin-1 is the eight last leading byte.
    +      const size_t safety_margin = size - margin + 1; // to avoid overruns!
    +      while(pos + 64 + safety_margin <= size) {
    +        simd8x64 input(reinterpret_cast(in + pos));
    +        if(input.is_ascii()) {
    +          input.store((int8_t*)latin1_output);
    +          latin1_output += 64;
    +          pos += 64;
    +        } else {
    +          // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    +          static_assert((simd8x64::NUM_CHUNKS == 2) || (simd8x64::NUM_CHUNKS == 4),
    +              "We support either two or four chunks per 64-byte block.");
    +          auto zero = simd8{uint8_t(0)};
    +          if(simd8x64::NUM_CHUNKS == 2) {
    +            this->check_utf8_bytes(input.chunks[0], zero);
    +            this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +          } else if(simd8x64::NUM_CHUNKS == 4) {
    +            this->check_utf8_bytes(input.chunks[0], zero);
    +            this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +            this->check_utf8_bytes(input.chunks[2], input.chunks[1]);
    +            this->check_utf8_bytes(input.chunks[3], input.chunks[2]);
    +          }
    +          uint64_t utf8_continuation_mask = input.lt(-65 + 1); // -64 is 1100 0000 in twos complement. Note: in this case, we also have ASCII to account for.
    +          uint64_t utf8_leading_mask = ~utf8_continuation_mask;
    +          uint64_t utf8_end_of_code_point_mask = utf8_leading_mask>>1;
    +          // We process in blocks of up to 12 bytes except possibly
    +          // for fast paths which may process up to 16 bytes. For the
    +          // slow path to work, we should have at least 12 input bytes left.
    +          size_t max_starting_point = (pos + 64) - 12;
    +          // Next loop is going to run at least five times.
    +          while(pos < max_starting_point) {
    +            // Performance note: our ability to compute 'consumed' and
    +            // then shift and recompute is critical. If there is a
    +            // latency of, say, 4 cycles on getting 'consumed', then
    +            // the inner loop might have a total latency of about 6 cycles.
    +            // Yet we process between 6 to 12 inputs bytes, thus we get
    +            // a speed limit between 1 cycle/byte and 0.5 cycle/byte
    +            // for this section of the code. Hence, there is a limit
    +            // to how much we can further increase this latency before
    +            // it seriously harms performance.
    +            size_t consumed = convert_masked_utf8_to_latin1(in + pos,
    +                            utf8_end_of_code_point_mask, latin1_output);
    +            pos += consumed;
    +            utf8_end_of_code_point_mask >>= consumed;
    +          }
    +          // At this point there may remain between 0 and 12 bytes in the
    +          // 64-byte block. These bytes will be processed again. So we have an
    +          // 80% efficiency (in the worst case). In practice we expect an
    +          // 85% to 90% efficiency.
    +        }
    +      }
    +      if(errors()) { return 0; }
    +      if(pos < size) {
    +        size_t howmany  = scalar::utf8_to_latin1::convert(in + pos, size - pos, latin1_output);
    +        if(howmany == 0) { return 0; }
    +        latin1_output += howmany;
    +      }
    +      return latin1_output - start;
    +    }
    +
    +    simdutf_really_inline result convert_with_errors(const char* in, size_t size, char* latin1_output) {
    +      size_t pos = 0;
    +      char* start{latin1_output};
    +      // In the worst case, we have the haswell kernel which can cause an overflow of
    +      // 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the last 16 bytes,
    +      // and if the data is valid, then it is entirely safe because 16 UTF-8 bytes generate
    +      // much more than 8 bytes. However, you cannot generally assume that you have valid
    +      // UTF-8 input, so we are going to go back from the end counting 8 leading bytes,
    +      // to give us a good margin.
    +      size_t leading_byte = 0;
    +      size_t margin = size;
    +      for(; margin > 0 && leading_byte < 8; margin--) {
    +        leading_byte += (int8_t(in[margin-1]) > -65);
    +      }
    +      // If the input is long enough, then we have that margin-1 is the eight last leading byte.
    +      const size_t safety_margin = size - margin + 1; // to avoid overruns!
    +      while(pos + 64 + safety_margin <= size) {
    +        simd8x64 input(reinterpret_cast(in + pos));
    +        if(input.is_ascii()) {
    +          input.store((int8_t*)latin1_output);
    +          latin1_output += 64;
    +          pos += 64;
    +        } else {
    +          // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    +          static_assert((simd8x64::NUM_CHUNKS == 2) || (simd8x64::NUM_CHUNKS == 4),
    +              "We support either two or four chunks per 64-byte block.");
    +          auto zero = simd8{uint8_t(0)};
    +          if(simd8x64::NUM_CHUNKS == 2) {
    +            this->check_utf8_bytes(input.chunks[0], zero);
    +            this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +          } else if(simd8x64::NUM_CHUNKS == 4) {
    +            this->check_utf8_bytes(input.chunks[0], zero);
    +            this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +            this->check_utf8_bytes(input.chunks[2], input.chunks[1]);
    +            this->check_utf8_bytes(input.chunks[3], input.chunks[2]);
    +          }
    +          if (errors()) {
    +            // rewind_and_convert_with_errors will seek a potential error from in+pos onward,
    +            // with the ability to go back up to pos bytes, and read size-pos bytes forward.
    +            result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors(pos, in + pos, size - pos, latin1_output);
    +            res.count += pos;
    +            return res;
    +          }
    +          uint64_t utf8_continuation_mask = input.lt(-65 + 1);
    +          uint64_t utf8_leading_mask = ~utf8_continuation_mask;
    +          uint64_t utf8_end_of_code_point_mask = utf8_leading_mask>>1;
    +          // We process in blocks of up to 12 bytes except possibly
    +          // for fast paths which may process up to 16 bytes. For the
    +          // slow path to work, we should have at least 12 input bytes left.
    +          size_t max_starting_point = (pos + 64) - 12;
    +          // Next loop is going to run at least five times.
    +          while(pos < max_starting_point) {
    +            // Performance note: our ability to compute 'consumed' and
    +            // then shift and recompute is critical. If there is a
    +            // latency of, say, 4 cycles on getting 'consumed', then
    +            // the inner loop might have a total latency of about 6 cycles.
    +            // Yet we process between 6 to 12 inputs bytes, thus we get
    +            // a speed limit between 1 cycle/byte and 0.5 cycle/byte
    +            // for this section of the code. Hence, there is a limit
    +            // to how much we can further increase this latency before
    +            // it seriously harms performance.
    +            size_t consumed = convert_masked_utf8_to_latin1(in + pos,
    +                            utf8_end_of_code_point_mask, latin1_output);
    +            pos += consumed;
    +            utf8_end_of_code_point_mask >>= consumed;
    +          }
    +          // At this point there may remain between 0 and 12 bytes in the
    +          // 64-byte block. These bytes will be processed again. So we have an
    +          // 80% efficiency (in the worst case). In practice we expect an
    +          // 85% to 90% efficiency.
    +        }
    +      }
    +      if(errors()) {
    +        // rewind_and_convert_with_errors will seek a potential error from in+pos onward,
    +        // with the ability to go back up to pos bytes, and read size-pos bytes forward.
    +        result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors(pos, in + pos, size - pos, latin1_output);
    +        res.count += pos;
    +        return res;
    +      }
    +      if(pos < size) {
    +        // rewind_and_convert_with_errors will seek a potential error from in+pos onward,
    +        // with the ability to go back up to pos bytes, and read size-pos bytes forward.
    +        result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors(pos, in + pos, size - pos, latin1_output);
    +        if (res.error) {    // In case of error, we want the error position
    +          res.count += pos;
    +          return res;
    +        } else {    // In case of success, we want the number of word written
    +          latin1_output += res.count;
    +        }
    +      }
    +      return result(error_code::SUCCESS, latin1_output - start);
    +    }
    +
    +    simdutf_really_inline bool errors() const {
    +      return this->error.any_bits_set_anywhere();
    +    }
     
    -} // utf16
    +  }; // struct utf8_checker
    +} // utf8_to_latin1 namespace
     } // unnamed namespace
     } // namespace haswell
     } // namespace simdutf
    -/* end file src/generic/utf16.h */
    +/* end file src/generic/utf8_to_latin1/utf8_to_latin1.h */
    +/* begin file src/generic/utf8_to_latin1/valid_utf8_to_latin1.h */
    +
    +
    +namespace simdutf {
    +namespace haswell {
    +namespace {
    +namespace utf8_to_latin1 {
    +using namespace simd;
    +
    +
    +    simdutf_really_inline size_t convert_valid(const char* in, size_t size, char* latin1_output) {
    +      size_t pos = 0;
    +      char* start{latin1_output};
    +      // In the worst case, we have the haswell kernel which can cause an overflow of
    +      // 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the last 16 bytes,
    +      // and if the data is valid, then it is entirely safe because 16 UTF-8 bytes generate
    +      // much more than 8 bytes. However, you cannot generally assume that you have valid
    +      // UTF-8 input, so we are going to go back from the end counting 8 leading bytes,
    +      // to give us a good margin.
    +      size_t leading_byte = 0;
    +      size_t margin = size;
    +      for(; margin > 0 && leading_byte < 8; margin--) {
    +        leading_byte += (int8_t(in[margin-1]) > -65); //twos complement of -65 is 1011 1111 ...
    +      }
    +      // If the input is long enough, then we have that margin-1 is the eight last leading byte.
    +      const size_t safety_margin = size - margin + 1; // to avoid overruns!
    +      while(pos + 64 + safety_margin <= size) {
    +        simd8x64 input(reinterpret_cast(in + pos));
    +        if(input.is_ascii()) {
    +          input.store((int8_t*)latin1_output);
    +          latin1_output += 64;
    +          pos += 64;
    +        } else {
    +          // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    +          uint64_t utf8_continuation_mask = input.lt(-65 + 1); // -64 is 1100 0000 in twos complement. Note: in this case, we also have ASCII to account for.
    +          uint64_t utf8_leading_mask = ~utf8_continuation_mask;
    +          uint64_t utf8_end_of_code_point_mask = utf8_leading_mask>>1;
    +          // We process in blocks of up to 12 bytes except possibly
    +          // for fast paths which may process up to 16 bytes. For the
    +          // slow path to work, we should have at least 12 input bytes left.
    +          size_t max_starting_point = (pos + 64) - 12;
    +          // Next loop is going to run at least five times.
    +          while(pos < max_starting_point) {
    +            // Performance note: our ability to compute 'consumed' and
    +            // then shift and recompute is critical. If there is a
    +            // latency of, say, 4 cycles on getting 'consumed', then
    +            // the inner loop might have a total latency of about 6 cycles.
    +            // Yet we process between 6 to 12 inputs bytes, thus we get
    +            // a speed limit between 1 cycle/byte and 0.5 cycle/byte
    +            // for this section of the code. Hence, there is a limit
    +            // to how much we can further increase this latency before
    +            // it seriously harms performance.
    +            size_t consumed = convert_masked_utf8_to_latin1(in + pos,
    +                            utf8_end_of_code_point_mask, latin1_output);
    +            pos += consumed;
    +            utf8_end_of_code_point_mask >>= consumed;
    +          }
    +          // At this point there may remain between 0 and 12 bytes in the
    +          // 64-byte block. These bytes will be processed again. So we have an
    +          // 80% efficiency (in the worst case). In practice we expect an
    +          // 85% to 90% efficiency.
    +        }
    +      }
    +      if(pos < size) {
    +        size_t howmany  = scalar::utf8_to_latin1::convert_valid(in + pos, size - pos, latin1_output);
    +        latin1_output += howmany;
    +      }
    +      return latin1_output - start;
    +    }
    +
    +  }
    +}   // utf8_to_latin1 namespace
    +}   // unnamed namespace
    +}   // namespace haswell
    + // namespace simdutf
    +/* end file src/generic/utf8_to_latin1/valid_utf8_to_latin1.h */
     
     namespace simdutf {
     namespace haswell {
    @@ -22766,6 +26233,73 @@ simdutf_warn_unused result implementation::validate_utf32_with_errors(const char
       }
     }
     
    +simdutf_warn_unused size_t implementation::convert_latin1_to_utf8(const char * buf, size_t len, char* utf8_output) const noexcept {
    +  std::pair ret = avx2_convert_latin1_to_utf8(buf, len, utf8_output);
    +  size_t converted_chars = ret.second - utf8_output;
    +
    +  if (ret.first != buf + len) {
    +    const size_t scalar_converted_chars = scalar::latin1_to_utf8::convert(
    +      ret.first, len - (ret.first - buf), ret.second);
    +    converted_chars += scalar_converted_chars;
    +  }
    +
    +  return converted_chars;
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_latin1_to_utf16le(const char* buf, size_t len, char16_t* utf16_output) const noexcept {
    +    std::pair ret = avx2_convert_latin1_to_utf16(buf, len, utf16_output);
    +    if (ret.first == nullptr) { return 0; }
    +    size_t converted_chars = ret.second - utf16_output;
    +    if (ret.first != buf + len) {
    +        const size_t scalar_converted_chars = scalar::latin1_to_utf16::convert(
    +                                              ret.first, len - (ret.first - buf), ret.second);
    +        if (scalar_converted_chars == 0) { return 0; }
    +        converted_chars += scalar_converted_chars;
    +    }
    +    return converted_chars;
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_latin1_to_utf16be(const char* buf, size_t len, char16_t* utf16_output) const noexcept {
    +    std::pair ret = avx2_convert_latin1_to_utf16(buf, len, utf16_output);
    +    if (ret.first == nullptr) { return 0; }
    +    size_t converted_chars = ret.second - utf16_output;
    +    if (ret.first != buf + len) {
    +        const size_t scalar_converted_chars = scalar::latin1_to_utf16::convert(
    +                                              ret.first, len - (ret.first - buf), ret.second);
    +        if (scalar_converted_chars == 0) { return 0; }
    +        converted_chars += scalar_converted_chars;
    +    }
    +    return converted_chars;
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_latin1_to_utf32(const char* buf, size_t len, char32_t* utf32_output) const noexcept {
    +    std::pair ret = avx2_convert_latin1_to_utf32(buf, len, utf32_output);
    +    if (ret.first == nullptr) { return 0; }
    +    size_t converted_chars = ret.second - utf32_output;
    +    if (ret.first != buf + len) {
    +        const size_t scalar_converted_chars = scalar::latin1_to_utf32::convert(
    +                                              ret.first, len - (ret.first - buf), ret.second);
    +        if (scalar_converted_chars == 0) { return 0; }
    +        converted_chars += scalar_converted_chars;
    +    }
    +    return converted_chars;
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_utf8_to_latin1(const char* buf, size_t len, char* latin1_output) const noexcept {
    +  utf8_to_latin1::validating_transcoder converter;
    +  return converter.convert(buf, len, latin1_output);
    +}
    +
    +simdutf_warn_unused result implementation::convert_utf8_to_latin1_with_errors(const char* buf, size_t len, char* latin1_output) const noexcept {
    +  utf8_to_latin1::validating_transcoder converter;
    +  return converter.convert_with_errors(buf, len, latin1_output);
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_latin1(const char* input, size_t size,
    +    char* latin1_output) const noexcept {
    +   return utf8_to_latin1::convert_valid(input, size,  latin1_output);
    +}
    +
     simdutf_warn_unused size_t implementation::convert_utf8_to_utf16le(const char* buf, size_t len, char16_t* utf16_output) const noexcept {
       utf8_to_utf16::validating_transcoder converter;
       return converter.convert(buf, len, utf16_output);
    @@ -22811,6 +26345,77 @@ simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf32(const cha
       return utf8_to_utf32::convert_valid(input, size,  utf32_output);
     }
     
    +
    +simdutf_warn_unused size_t implementation::convert_utf16le_to_latin1(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  std::pair ret = haswell::avx2_convert_utf16_to_latin1(buf, len, latin1_output);
    +  if (ret.first == nullptr) { return 0; }
    +  size_t saved_bytes = ret.second - latin1_output;
    +  if (ret.first != buf + len) {
    +    const size_t scalar_saved_bytes = scalar::utf16_to_latin1::convert(
    +                                        ret.first, len - (ret.first - buf), ret.second);
    +    if (scalar_saved_bytes == 0) { return 0; }
    +    saved_bytes += scalar_saved_bytes;
    +  }
    +  return saved_bytes;
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_utf16be_to_latin1(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  std::pair ret = haswell::avx2_convert_utf16_to_latin1(buf, len, latin1_output);
    +  if (ret.first == nullptr) { return 0; }
    +  size_t saved_bytes = ret.second - latin1_output;
    +  if (ret.first != buf + len) {
    +    const size_t scalar_saved_bytes = scalar::utf16_to_latin1::convert(
    +                                        ret.first, len - (ret.first - buf), ret.second);
    +    if (scalar_saved_bytes == 0) { return 0; }
    +    saved_bytes += scalar_saved_bytes;
    +  }
    +  return saved_bytes;
    +}
    +
    +simdutf_warn_unused result implementation::convert_utf16le_to_latin1_with_errors(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  std::pair ret = avx2_convert_utf16_to_latin1_with_errors(buf, len, latin1_output);
    +  if (ret.first.error) { return ret.first; }  // Can return directly since scalar fallback already found correct ret.first.count
    +  if (ret.first.count != len) { // All good so far, but not finished
    +    result scalar_res = scalar::utf16_to_latin1::convert_with_errors(
    +                                        buf + ret.first.count, len - ret.first.count, ret.second);
    +    if (scalar_res.error) {
    +      scalar_res.count += ret.first.count;
    +      return scalar_res;
    +    } else {
    +      ret.second += scalar_res.count;
    +    }
    +  }
    +  ret.first.count = ret.second - latin1_output;   // Set count to the number of 8-bit code units written
    +  return ret.first;
    +}
    +
    +simdutf_warn_unused result implementation::convert_utf16be_to_latin1_with_errors(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  std::pair ret = avx2_convert_utf16_to_latin1_with_errors(buf, len, latin1_output);
    +  if (ret.first.error) { return ret.first; }  // Can return directly since scalar fallback already found correct ret.first.count
    +  if (ret.first.count != len) { // All good so far, but not finished
    +    result scalar_res = scalar::utf16_to_latin1::convert_with_errors(
    +                                        buf + ret.first.count, len - ret.first.count, ret.second);
    +    if (scalar_res.error) {
    +      scalar_res.count += ret.first.count;
    +      return scalar_res;
    +    } else {
    +      ret.second += scalar_res.count;
    +    }
    +  }
    +  ret.first.count = ret.second - latin1_output;   // Set count to the number of 8-bit code units written
    +  return ret.first;
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_latin1(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  // optimization opportunity: implement a custom function
    +  return convert_utf16be_to_latin1(buf, len, latin1_output);
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_latin1(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  // optimization opportunity: implement a custom function
    +  return convert_utf16le_to_latin1(buf, len, latin1_output);
    +}
    +
     simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8(const char16_t* buf, size_t len, char* utf8_output) const noexcept {
       std::pair ret = haswell::avx2_convert_utf16_to_utf8(buf, len, utf8_output);
       if (ret.first == nullptr) { return 0; }
    @@ -22838,7 +26443,7 @@ simdutf_warn_unused size_t implementation::convert_utf16be_to_utf8(const char16_
     }
     
     simdutf_warn_unused result implementation::convert_utf16le_to_utf8_with_errors(const char16_t* buf, size_t len, char* utf8_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = haswell::avx2_convert_utf16_to_utf8_with_errors(buf, len, utf8_output);
       if (ret.first.error) { return ret.first; }  // Can return directly since scalar fallback already found correct ret.first.count
       if (ret.first.count != len) { // All good so far, but not finished
    @@ -22851,12 +26456,12 @@ simdutf_warn_unused result implementation::convert_utf16le_to_utf8_with_errors(c
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf8_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf8_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
     simdutf_warn_unused result implementation::convert_utf16be_to_utf8_with_errors(const char16_t* buf, size_t len, char* utf8_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = haswell::avx2_convert_utf16_to_utf8_with_errors(buf, len, utf8_output);
       if (ret.first.error) { return ret.first; }  // Can return directly since scalar fallback already found correct ret.first.count
       if (ret.first.count != len) { // All good so far, but not finished
    @@ -22869,7 +26474,7 @@ simdutf_warn_unused result implementation::convert_utf16be_to_utf8_with_errors(c
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf8_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf8_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
    @@ -22894,8 +26499,42 @@ simdutf_warn_unused size_t implementation::convert_utf32_to_utf8(const char32_t*
       return saved_bytes;
     }
     
    +simdutf_warn_unused size_t implementation::convert_utf32_to_latin1(const char32_t* buf, size_t len, char* latin1_output) const noexcept {
    +  std::pair ret = avx2_convert_utf32_to_latin1(buf, len, latin1_output);
    +  if (ret.first == nullptr) { return 0; }
    +  size_t saved_bytes = ret.second - latin1_output;
    +  if (ret.first != buf + len) {
    +    const size_t scalar_saved_bytes = scalar::utf32_to_latin1::convert(
    +                                        ret.first, len - (ret.first - buf), ret.second);
    +    if (scalar_saved_bytes == 0) { return 0; }
    +    saved_bytes += scalar_saved_bytes;
    +  }
    +  return saved_bytes;
    +}
    +
    +simdutf_warn_unused result implementation::convert_utf32_to_latin1_with_errors(const char32_t* buf, size_t len, char* latin1_output) const noexcept {
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
    +  std::pair ret = avx2_convert_utf32_to_latin1_with_errors(buf, len, latin1_output);
    +  if (ret.first.count != len) {
    +    result scalar_res = scalar::utf32_to_latin1::convert_with_errors(
    +                                        buf + ret.first.count, len - ret.first.count, ret.second);
    +    if (scalar_res.error) {
    +      scalar_res.count += ret.first.count;
    +      return scalar_res;
    +    } else {
    +      ret.second += scalar_res.count;
    +    }
    +  }
    +  ret.first.count = ret.second - latin1_output;   // Set count to the number of 8-bit code units written
    +  return ret.first;
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_latin1(const char32_t* buf, size_t len, char* latin1_output) const noexcept {
    +  return convert_utf32_to_latin1(buf,len,latin1_output);
    +}
    +
     simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors(const char32_t* buf, size_t len, char* utf8_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = haswell::avx2_convert_utf32_to_utf8_with_errors(buf, len, utf8_output);
       if (ret.first.count != len) {
         result scalar_res = scalar::utf32_to_utf8::convert_with_errors(
    @@ -22907,7 +26546,7 @@ simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors(con
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf8_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf8_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
    @@ -22938,7 +26577,7 @@ simdutf_warn_unused size_t implementation::convert_utf16be_to_utf32(const char16
     }
     
     simdutf_warn_unused result implementation::convert_utf16le_to_utf32_with_errors(const char16_t* buf, size_t len, char32_t* utf32_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = haswell::avx2_convert_utf16_to_utf32_with_errors(buf, len, utf32_output);
       if (ret.first.error) { return ret.first; }  // Can return directly since scalar fallback already found correct ret.first.count
       if (ret.first.count != len) { // All good so far, but not finished
    @@ -22951,12 +26590,12 @@ simdutf_warn_unused result implementation::convert_utf16le_to_utf32_with_errors(
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf32_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf32_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
     simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors(const char16_t* buf, size_t len, char32_t* utf32_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = haswell::avx2_convert_utf16_to_utf32_with_errors(buf, len, utf32_output);
       if (ret.first.error) { return ret.first; }  // Can return directly since scalar fallback already found correct ret.first.count
       if (ret.first.count != len) { // All good so far, but not finished
    @@ -22969,7 +26608,7 @@ simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors(
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf32_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf32_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
    @@ -23004,7 +26643,7 @@ simdutf_warn_unused size_t implementation::convert_utf32_to_utf16be(const char32
     }
     
     simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors(const char32_t* buf, size_t len, char16_t* utf16_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = haswell::avx2_convert_utf32_to_utf16_with_errors(buf, len, utf16_output);
       if (ret.first.count != len) {
         result scalar_res = scalar::utf32_to_utf16::convert_with_errors(
    @@ -23016,12 +26655,12 @@ simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors(
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf16_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf16_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
     simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors(const char32_t* buf, size_t len, char16_t* utf16_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = haswell::avx2_convert_utf32_to_utf16_with_errors(buf, len, utf16_output);
       if (ret.first.count != len) {
         result scalar_res = scalar::utf32_to_utf16::convert_with_errors(
    @@ -23033,7 +26672,7 @@ simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors(
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf16_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf16_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
    @@ -23069,6 +26708,18 @@ simdutf_warn_unused size_t implementation::count_utf8(const char * input, size_t
       return utf8::count_code_points(input, length);
     }
     
    +simdutf_warn_unused size_t implementation::latin1_length_from_utf8(const char* buf, size_t len) const noexcept {
    +  return count_utf8(buf,len);
    +}
    +
    +simdutf_warn_unused size_t implementation::latin1_length_from_utf16(size_t length) const noexcept {
    +  return scalar::utf16::latin1_length_from_utf16(length);
    +}
    +
    +simdutf_warn_unused size_t implementation::latin1_length_from_utf32(size_t length) const noexcept {
    +  return scalar::utf32::latin1_length_from_utf32(length);
    +}
    +
     simdutf_warn_unused size_t implementation::utf8_length_from_utf16le(const char16_t * input, size_t length) const noexcept {
       return utf16::utf8_length_from_utf16(input, length);
     }
    @@ -23085,10 +26736,61 @@ simdutf_warn_unused size_t implementation::utf32_length_from_utf16be(const char1
       return utf16::utf32_length_from_utf16(input, length);
     }
     
    +
    +simdutf_warn_unused size_t implementation::utf16_length_from_latin1(size_t length) const noexcept {
    +  return scalar::latin1::utf16_length_from_latin1(length);
    +}
    +
     simdutf_warn_unused size_t implementation::utf16_length_from_utf8(const char * input, size_t length) const noexcept {
       return utf8::utf16_length_from_utf8(input, length);
     }
     
    +
    +simdutf_warn_unused size_t implementation::utf32_length_from_latin1(size_t length) const noexcept {
    +  return scalar::latin1::utf32_length_from_latin1(length);
    +}
    +
    +simdutf_warn_unused size_t implementation::utf8_length_from_latin1(const char *input, size_t len) const noexcept {
    +  const uint8_t *data = reinterpret_cast(input);
    +  size_t answer = len / sizeof(__m256i) * sizeof(__m256i);
    +  size_t i = 0;
    +  __m256i four_64bits = _mm256_setzero_si256();
    +  while (i + sizeof(__m256i) <= len) {
    +    __m256i runner = _mm256_setzero_si256();
    +    // We can do up to 255 loops without overflow.
    +    size_t iterations = (len - i) / sizeof(__m256i);
    +    if (iterations > 255) {
    +      iterations = 255;
    +    }
    +    size_t max_i = i + iterations * sizeof(__m256i) - sizeof(__m256i);
    +    for (; i + 4*sizeof(__m256i) <= max_i; i += 4*sizeof(__m256i)) {
    +      __m256i input1 = _mm256_loadu_si256((const __m256i *)(data + i));
    +      __m256i input2 = _mm256_loadu_si256((const __m256i *)(data + i + sizeof(__m256i)));
    +      __m256i input3 = _mm256_loadu_si256((const __m256i *)(data + i + 2*sizeof(__m256i)));
    +      __m256i input4 = _mm256_loadu_si256((const __m256i *)(data + i + 3*sizeof(__m256i)));
    +      __m256i input12 = _mm256_add_epi8(_mm256_cmpgt_epi8(_mm256_setzero_si256(), input1),
    +              _mm256_cmpgt_epi8(_mm256_setzero_si256(), input2));
    +      __m256i input23 = _mm256_add_epi8(_mm256_cmpgt_epi8(_mm256_setzero_si256(), input3),
    +              _mm256_cmpgt_epi8(_mm256_setzero_si256(), input4));
    +      __m256i input1234 = _mm256_add_epi8(input12, input23);
    +      runner = _mm256_sub_epi8(
    +          runner, input1234);
    +    }
    +    for (; i <= max_i; i += sizeof(__m256i)) {
    +      __m256i input_256_chunk = _mm256_loadu_si256((const __m256i *)(data + i));
    +      runner = _mm256_sub_epi8(
    +          runner, _mm256_cmpgt_epi8(_mm256_setzero_si256(), input_256_chunk));
    +    }
    +    four_64bits = _mm256_add_epi64(
    +        four_64bits, _mm256_sad_epu8(runner, _mm256_setzero_si256()));
    +  }
    +  answer += _mm256_extract_epi64(four_64bits, 0) +
    +            _mm256_extract_epi64(four_64bits, 1) +
    +            _mm256_extract_epi64(four_64bits, 2) +
    +            _mm256_extract_epi64(four_64bits, 3);
    +  return answer + scalar::latin1::utf8_length_from_latin1(reinterpret_cast(data + i), len - i);
    +}
    +
     simdutf_warn_unused size_t implementation::utf8_length_from_utf32(const char32_t * input, size_t length) const noexcept {
       const __m256i v_00000000 = _mm256_setzero_si256();
       const __m256i v_ffffff80 = _mm256_set1_epi32((uint32_t)0xffffff80);
    @@ -23131,13 +26833,12 @@ simdutf_warn_unused size_t implementation::utf16_length_from_utf32(const char32_
     }
     
     simdutf_warn_unused size_t implementation::utf32_length_from_utf8(const char * input, size_t length) const noexcept {
    -  return scalar::utf8::count_code_points(input, length);
    +  return utf8::count_code_points(input, length);
     }
     
     } // namespace haswell
     } // namespace simdutf
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/haswell/end.h
     /* begin file src/simdutf/haswell/end.h */
     #if SIMDUTF_CAN_ALWAYS_RUN_HASWELL
     // nothing needed.
    @@ -23153,14 +26854,12 @@ SIMDUTF_POP_DISABLE_WARNINGS
     /* end file src/haswell/implementation.cpp */
     #endif
     #if SIMDUTF_IMPLEMENTATION_PPC64
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=ppc64/implementation.cpp
     /* begin file src/ppc64/implementation.cpp */
     
     
     
     
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/ppc64/begin.h
     /* begin file src/simdutf/ppc64/begin.h */
     // redefining SIMDUTF_IMPLEMENTATION to "ppc64"
     // #define SIMDUTF_IMPLEMENTATION ppc64
    @@ -23198,7 +26897,6 @@ simdutf_really_inline simd8 must_be_2_3_continuation(const simd8
     } // namespace ppc64
     } // namespace simdutf
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/buf_block_reader.h
     /* begin file src/generic/buf_block_reader.h */
     namespace simdutf {
     namespace ppc64 {
    @@ -23293,7 +26991,6 @@ simdutf_really_inline void buf_block_reader::advance() {
     } // namespace ppc64
     } // namespace simdutf
     /* end file src/generic/buf_block_reader.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_validation/utf8_lookup4_algorithm.h
     /* begin file src/generic/utf8_validation/utf8_lookup4_algorithm.h */
     namespace simdutf {
     namespace ppc64 {
    @@ -23482,7 +27179,6 @@ using utf8_validation::utf8_checker;
     } // namespace ppc64
     } // namespace simdutf
     /* end file src/generic/utf8_validation/utf8_lookup4_algorithm.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_validation/utf8_validator.h
     /* begin file src/generic/utf8_validation/utf8_validator.h */
     namespace simdutf {
     namespace ppc64 {
    @@ -23610,7 +27306,6 @@ result generic_validate_ascii_with_errors(const char * input, size_t length) {
     } // namespace simdutf
     /* end file src/generic/utf8_validation/utf8_validator.h */
     // transcoding from UTF-8 to UTF-16
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_to_utf16/valid_utf8_to_utf16.h
     /* begin file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */
     
     
    @@ -23685,7 +27380,6 @@ simdutf_warn_unused size_t convert_valid(const char* input, size_t size,
     } // namespace ppc64
     } // namespace simdutf
     /* end file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_to_utf16/utf8_to_utf16.h
     /* begin file src/generic/utf8_to_utf16/utf8_to_utf16.h */
     
     
    @@ -23993,7 +27687,6 @@ using namespace simd;
     } // namespace simdutf
     /* end file src/generic/utf8_to_utf16/utf8_to_utf16.h */
     // transcoding from UTF-8 to UTF-32
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_to_utf32/valid_utf8_to_utf32.h
     /* begin file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */
     
     namespace simdutf {
    @@ -24039,7 +27732,6 @@ simdutf_warn_unused size_t convert_valid(const char* input, size_t size,
     } // namespace ppc64
     } // namespace simdutf
     /* end file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_to_utf32/utf8_to_utf32.h
     /* begin file src/generic/utf8_to_utf32/utf8_to_utf32.h */
     
     
    @@ -24340,7 +28032,6 @@ using namespace simd;
     } // namespace simdutf
     /* end file src/generic/utf8_to_utf32/utf8_to_utf32.h */
     // other functions
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8.h
     /* begin file src/generic/utf8.h */
     
     namespace simdutf {
    @@ -24355,13 +28046,12 @@ simdutf_really_inline size_t count_code_points(const char* in, size_t size) {
         size_t count = 0;
         for(;pos + 64 <= size; pos += 64) {
           simd8x64 input(reinterpret_cast(in + pos));
    -      uint64_t utf8_continuation_mask = input.lt(-65 + 1);
    -      count += 64 - count_ones(utf8_continuation_mask);
    +      uint64_t utf8_continuation_mask = input.gt(-65);
    +      count += count_ones(utf8_continuation_mask);
         }
         return count + scalar::utf8::count_code_points(in + pos, size - pos);
     }
     
    -
     simdutf_really_inline size_t utf16_length_from_utf8(const char* in, size_t size) {
         size_t pos = 0;
         size_t count = 0;
    @@ -24377,17 +28067,11 @@ simdutf_really_inline size_t utf16_length_from_utf8(const char* in, size_t size)
         }
         return count + scalar::utf8::utf16_length_from_utf8(in + pos, size - pos);
     }
    -
    -
    -simdutf_really_inline size_t utf32_length_from_utf8(const char* in, size_t size) {
    -    return count_code_points(in, size);
    -}
     } // utf8 namespace
     } // unnamed namespace
     } // namespace ppc64
     } // namespace simdutf
     /* end file src/generic/utf8.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf16.h
     /* begin file src/generic/utf16.h */
     namespace simdutf {
     namespace ppc64 {
    @@ -24398,9 +28082,9 @@ template 
     simdutf_really_inline size_t count_code_points(const char16_t* in, size_t size) {
         size_t pos = 0;
         size_t count = 0;
    -    for(;pos + 32 <= size; pos += 32) {
    +    for(;pos < size/32*32; pos += 32) {
           simd16x32 input(reinterpret_cast(in + pos));
    -      if (!match_system(big_endian)) input.swap_bytes();
    +      if (!match_system(big_endian)) { input.swap_bytes(); }
           uint64_t not_pair = input.not_in_range(0xDC00, 0xDFFF);
           count += count_ones(not_pair) / 2;
         }
    @@ -24412,9 +28096,9 @@ simdutf_really_inline size_t utf8_length_from_utf16(const char16_t* in, size_t s
         size_t pos = 0;
         size_t count = 0;
         // This algorithm could no doubt be improved!
    -    for(;pos + 32 <= size; pos += 32) {
    +    for(;pos < size/32*32; pos += 32) {
           simd16x32 input(reinterpret_cast(in + pos));
    -      if (!match_system(big_endian)) input.swap_bytes();
    +      if (!match_system(big_endian)) { input.swap_bytes(); }
           uint64_t ascii_mask = input.lteq(0x7F);
           uint64_t twobyte_mask = input.lteq(0x7FF);
           uint64_t not_pair_mask = input.not_in_range(0xD800, 0xDFFF);
    @@ -24436,7 +28120,7 @@ simdutf_really_inline size_t utf32_length_from_utf16(const char16_t* in, size_t
     simdutf_really_inline void change_endianness_utf16(const char16_t* in, size_t size, char16_t* output) {
       size_t pos = 0;
     
    -  while (pos + 32 <= size) {
    +  while (pos < size/32*32) {
         simd16x32 input(reinterpret_cast(in + pos));
         input.swap_bytes();
         input.store(reinterpret_cast(output));
    @@ -24686,15 +28370,12 @@ simdutf_warn_unused size_t implementation::utf32_length_from_utf8(const char * i
     } // namespace ppc64
     } // namespace simdutf
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/ppc64/end.h
     /* begin file src/simdutf/ppc64/end.h */
     /* end file src/simdutf/ppc64/end.h */
     /* end file src/ppc64/implementation.cpp */
     #endif
     #if SIMDUTF_IMPLEMENTATION_WESTMERE
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=westmere/implementation.cpp
     /* begin file src/westmere/implementation.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/westmere/begin.h
     /* begin file src/simdutf/westmere/begin.h */
     // redefining SIMDUTF_IMPLEMENTATION to "westmere"
     // #define SIMDUTF_IMPLEMENTATION westmere
    @@ -24732,7 +28413,84 @@ simdutf_really_inline simd8 must_be_2_3_continuation(const simd8
       return simd8(is_third_byte | is_fourth_byte) > int8_t(0);
     }
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=westmere/sse_detect_encodings.cpp
    +/* begin file src/westmere/internal/loader.cpp */
    +namespace internal {
    +namespace westmere {
    +
    +/* begin file src/westmere/internal/write_v_u16_11bits_to_utf8.cpp */
    +/*
    +* reads a vector of uint16 values
    +* bits after 11th are ignored
    +* first 11 bits are encoded into utf8
    +* !important! utf8_output must have at least 16 writable bytes
    +*/
    +
    +inline void write_v_u16_11bits_to_utf8(
    +  const __m128i v_u16,
    +  char*& utf8_output,
    +  const __m128i one_byte_bytemask,
    +  const uint16_t one_byte_bitmask
    +) {
    +  // 0b1100_0000_1000_0000
    +  const __m128i v_c080 = _mm_set1_epi16((int16_t)0xc080);
    +  // 0b0001_1111_0000_0000
    +  const __m128i v_1f00 = _mm_set1_epi16((int16_t)0x1f00);
    +  // 0b0000_0000_0011_1111
    +  const __m128i v_003f = _mm_set1_epi16((int16_t)0x003f);
    +
    +  // 1. prepare 2-byte values
    +          // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
    +          // expected output   : [110a|aaaa|10bb|bbbb] x 8
    +
    +  // t0 = [000a|aaaa|bbbb|bb00]
    +  const __m128i t0 = _mm_slli_epi16(v_u16, 2);
    +  // t1 = [000a|aaaa|0000|0000]
    +  const __m128i t1 = _mm_and_si128(t0, v_1f00);
    +  // t2 = [0000|0000|00bb|bbbb]
    +  const __m128i t2 = _mm_and_si128(v_u16, v_003f);
    +  // t3 = [000a|aaaa|00bb|bbbb]
    +  const __m128i t3 = _mm_or_si128(t1, t2);
    +  // t4 = [110a|aaaa|10bb|bbbb]
    +  const __m128i t4 = _mm_or_si128(t3, v_c080);
    +
    +  // 2. merge ASCII and 2-byte codewords
    +  const __m128i utf8_unpacked = _mm_blendv_epi8(t4, v_u16, one_byte_bytemask);
    +
    +  // 3. prepare bitmask for 8-bit lookup
    +  //    one_byte_bitmask = hhggffeeddccbbaa -- the bits are doubled (h - MSB, a - LSB)
    +  const uint16_t m0 = one_byte_bitmask & 0x5555;  // m0 = 0h0g0f0e0d0c0b0a
    +  const uint16_t m1 = static_cast(m0 >> 7);                    // m1 = 00000000h0g0f0e0
    +  const uint8_t  m2 = static_cast((m0 | m1) & 0xff);           // m2 =         hdgcfbea
    +  // 4. pack the bytes
    +  const uint8_t* row = &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0];
    +  const __m128i shuffle = _mm_loadu_si128((__m128i*)(row + 1));
    +  const __m128i utf8_packed = _mm_shuffle_epi8(utf8_unpacked, shuffle);
    +
    +  // 5. store bytes
    +  _mm_storeu_si128((__m128i*)utf8_output, utf8_packed);
    +
    +  // 6. adjust pointers
    +  utf8_output += row[0];
    +}
    +
    +inline void write_v_u16_11bits_to_utf8(
    +  const __m128i v_u16,
    +  char*& utf8_output,
    +  const __m128i v_0000,
    +  const __m128i v_ff80
    +) {
    +  // no bits set above 7th bit
    +  const __m128i one_byte_bytemask = _mm_cmpeq_epi16(_mm_and_si128(v_u16, v_ff80), v_0000);
    +  const uint16_t one_byte_bitmask = static_cast(_mm_movemask_epi8(one_byte_bytemask));
    +
    +  write_v_u16_11bits_to_utf8(
    +    v_u16, utf8_output, one_byte_bytemask, one_byte_bitmask);
    +}
    +/* end file src/westmere/internal/write_v_u16_11bits_to_utf8.cpp */
    +
    +} // namespace westmere
    +} // namespace internal
    +/* end file src/westmere/internal/loader.cpp */
     /* begin file src/westmere/sse_detect_encodings.cpp */
     template
     // len is known to be a multiple of 2 when this is called
    @@ -24785,7 +28543,7 @@ int sse_detect_encodings(const char * buf, size_t len) {
                 // To be valid UTF-32, a surrogate cannot be in the two most significant bytes of any 32-bit word.
                 // On the other hand, to be valid UTF-16LE, at least one surrogate must be in the two most significant
                 // bytes of a 32-bit word since they always come in pairs in UTF-16LE.
    -            // Note that we always proceed in multiple of 4 before this point so there is no offset in 32-bit words.
    +            // Note that we always proceed in multiple of 4 before this point so there is no offset in 32-bit code units.
     
                 if (((surrogates_bitmask0 | surrogates_bitmask1) & 0xaaaa) != 0) {
                     is_utf32 = false;
    @@ -24942,10 +28700,9 @@ int sse_detect_encodings(const char * buf, size_t len) {
     }
     /* end file src/westmere/sse_detect_encodings.cpp */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=westmere/sse_validate_utf16.cpp
     /* begin file src/westmere/sse_validate_utf16.cpp */
     /*
    -    In UTF-16 words in range 0xD800 to 0xDFFF have special meaning.
    +    In UTF-16 code units in range 0xD800 to 0xDFFF have special meaning.
     
         In a vectorized algorithm we want to examine the most significant
         nibble in order to select a fast path. If none of highest nibbles
    @@ -24981,7 +28738,7 @@ int sse_detect_encodings(const char * buf, size_t len) {
           0   0   1   0   1   0   0   0   b = a << 1
           1   1   1   1   1   1   1   0   c = V | a | b
                                       ^
    -                                  the last bit can be zero, we just consume 7 words
    +                                  the last bit can be zero, we just consume 7 code units
                                       and recheck this word in the next iteration
     */
     
    @@ -25026,7 +28783,7 @@ const char16_t* sse_validate_utf16(const char16_t* input, size_t size) {
                 //
                 //    Fact: high surrogate has 11th bit set (3rd bit in the higher word)
     
    -            // V - non-surrogate words
    +            // V - non-surrogate code units
                 //     V = not surrogates_wordmask
                 const uint16_t V = static_cast(~surrogates_bitmask);
     
    @@ -25047,10 +28804,10 @@ const char16_t* sse_validate_utf16(const char16_t* input, size_t size) {
     
                 if (c == 0xffff) {
                     // The whole input register contains valid UTF-16, i.e.,
    -                // either single words or proper surrogate pairs.
    +                // either single code units or proper surrogate pairs.
                     input += 16;
                 } else if (c == 0x7fff) {
    -                // The 15 lower words of the input register contains valid UTF-16.
    +                // The 15 lower code units of the input register contains valid UTF-16.
                     // The 15th word may be either a low or high surrogate. It the next
                     // iteration we 1) check if the low surrogate is followed by a high
                     // one, 2) reject sole high surrogate.
    @@ -25104,7 +28861,7 @@ const result sse_validate_utf16_with_errors(const char16_t* input, size_t size)
                 //
                 //    Fact: high surrogate has 11th bit set (3rd bit in the higher word)
     
    -            // V - non-surrogate words
    +            // V - non-surrogate code units
                 //     V = not surrogates_wordmask
                 const uint16_t V = static_cast(~surrogates_bitmask);
     
    @@ -25125,10 +28882,10 @@ const result sse_validate_utf16_with_errors(const char16_t* input, size_t size)
     
                 if (c == 0xffff) {
                     // The whole input register contains valid UTF-16, i.e.,
    -                // either single words or proper surrogate pairs.
    +                // either single code units or proper surrogate pairs.
                     input += 16;
                 } else if (c == 0x7fff) {
    -                // The 15 lower words of the input register contains valid UTF-16.
    +                // The 15 lower code units of the input register contains valid UTF-16.
                     // The 15th word may be either a low or high surrogate. It the next
                     // iteration we 1) check if the low surrogate is followed by a high
                     // one, 2) reject sole high surrogate.
    @@ -25142,7 +28899,6 @@ const result sse_validate_utf16_with_errors(const char16_t* input, size_t size)
         return result(error_code::SUCCESS, input - start);
     }
     /* end file src/westmere/sse_validate_utf16.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=westmere/sse_validate_utf32le.cpp
     /* begin file src/westmere/sse_validate_utf32le.cpp */
     /* Returns:
        - pointer to the last unprocessed character (a scalar fallback should check the rest);
    @@ -25181,34 +28937,171 @@ const result sse_validate_utf32le_with_errors(const char32_t* input, size_t size
         const char32_t* start = input;
         const char32_t* end = input + size;
     
    -    const __m128i standardmax = _mm_set1_epi32(0x10ffff);
    -    const __m128i offset = _mm_set1_epi32(0xffff2000);
    -    const __m128i standardoffsetmax = _mm_set1_epi32(0xfffff7ff);
    -    __m128i currentmax = _mm_setzero_si128();
    -    __m128i currentoffsetmax = _mm_setzero_si128();
    +    const __m128i standardmax = _mm_set1_epi32(0x10ffff);
    +    const __m128i offset = _mm_set1_epi32(0xffff2000);
    +    const __m128i standardoffsetmax = _mm_set1_epi32(0xfffff7ff);
    +    __m128i currentmax = _mm_setzero_si128();
    +    __m128i currentoffsetmax = _mm_setzero_si128();
    +
    +    while (input + 4 < end) {
    +        const __m128i in = _mm_loadu_si128((__m128i *)input);
    +        currentmax = _mm_max_epu32(in,currentmax);
    +        currentoffsetmax = _mm_max_epu32(_mm_add_epi32(in, offset), currentoffsetmax);
    +
    +        __m128i is_zero = _mm_xor_si128(_mm_max_epu32(currentmax, standardmax), standardmax);
    +        if(_mm_test_all_zeros(is_zero, is_zero) == 0) {
    +            return result(error_code::TOO_LARGE, input - start);
    +        }
    +
    +        is_zero = _mm_xor_si128(_mm_max_epu32(currentoffsetmax, standardoffsetmax), standardoffsetmax);
    +        if(_mm_test_all_zeros(is_zero, is_zero) == 0) {
    +            return result(error_code::SURROGATE, input - start);
    +        }
    +        input += 4;
    +    }
    +
    +    return result(error_code::SUCCESS, input - start);
    +}
    +/* end file src/westmere/sse_validate_utf32le.cpp */
    +
    +/* begin file src/westmere/sse_convert_latin1_to_utf8.cpp */
    +std::pair sse_convert_latin1_to_utf8(
    +  const char* latin_input,
    +  const size_t latin_input_length,
    +  char* utf8_output) {
    +  const char* end = latin_input + latin_input_length;
    +
    +  const __m128i v_0000 = _mm_setzero_si128();
    +  // 0b1000_0000
    +  const __m128i v_80 = _mm_set1_epi8((uint8_t)0x80);
    +  // 0b1111_1111_1000_0000
    +  const __m128i v_ff80 = _mm_set1_epi16((uint16_t)0xff80);
    +
    +  const __m128i latin_1_half_into_u16_byte_mask = _mm_setr_epi8(
    +      0, '\x80',
    +      1, '\x80',
    +      2, '\x80',
    +      3, '\x80',
    +      4, '\x80',
    +      5, '\x80',
    +      6, '\x80',
    +      7, '\x80'
    +    );
    +
    +  const __m128i latin_2_half_into_u16_byte_mask = _mm_setr_epi8(
    +      8, '\x80',
    +      9, '\x80',
    +      10, '\x80',
    +      11, '\x80',
    +      12, '\x80',
    +      13, '\x80',
    +      14, '\x80',
    +      15, '\x80'
    +    );
    +
    +  // each latin1 takes 1-2 utf8 bytes
    +  // slow path writes useful 8-15 bytes twice (eagerly writes 16 bytes and then adjust the pointer)
    +  // so the last write can exceed the utf8_output size by 8-1 bytes 
    +  // by reserving 8 extra input bytes, we expect the output to have 8-16 bytes free
    +  while (latin_input + 16 + 8 <= end) {
    +    // Load 16 Latin1 characters (16 bytes) into a 128-bit register
    +    __m128i v_latin = _mm_loadu_si128((__m128i*)latin_input);
    +
    +
    +    if (_mm_testz_si128(v_latin, v_80)) {// ASCII fast path!!!!
    +      _mm_storeu_si128((__m128i*)utf8_output, v_latin);
    +      latin_input += 16;
    +      utf8_output += 16;
    +      continue;
    +    }
    +    
    +
    +    // assuming a/b are bytes and A/B are uint16 of the same value
    +    // aaaa_aaaa_bbbb_bbbb -> AAAA_AAAA
    +    __m128i v_u16_latin_1_half = _mm_shuffle_epi8(v_latin, latin_1_half_into_u16_byte_mask);
    +    // aaaa_aaaa_bbbb_bbbb -> BBBB_BBBB
    +    __m128i v_u16_latin_2_half = _mm_shuffle_epi8(v_latin, latin_2_half_into_u16_byte_mask);
    +
    +
    +    internal::westmere::write_v_u16_11bits_to_utf8(v_u16_latin_1_half, utf8_output, v_0000, v_ff80);
    +    internal::westmere::write_v_u16_11bits_to_utf8(v_u16_latin_2_half, utf8_output, v_0000, v_ff80);
    +    latin_input += 16;
    +  }
    +
    +  if (latin_input + 16 <= end) {
    +    // Load 16 Latin1 characters (16 bytes) into a 128-bit register
    +    __m128i v_latin = _mm_loadu_si128((__m128i*)latin_input);
    +
    +    if (_mm_testz_si128(v_latin, v_80)) {// ASCII fast path!!!!
    +      _mm_storeu_si128((__m128i*)utf8_output, v_latin);
    +      latin_input += 16;
    +      utf8_output += 16;
    +    } else {
    +      // assuming a/b are bytes and A/B are uint16 of the same value
    +      // aaaa_aaaa_bbbb_bbbb -> AAAA_AAAA
    +      __m128i v_u16_latin_1_half = _mm_shuffle_epi8(v_latin, latin_1_half_into_u16_byte_mask);
    +      internal::westmere::write_v_u16_11bits_to_utf8(v_u16_latin_1_half, utf8_output, v_0000, v_ff80);
    +      latin_input += 8;
    +    }
    +  }
    +
    +  return std::make_pair(latin_input, utf8_output);
    +}
    +/* end file src/westmere/sse_convert_latin1_to_utf8.cpp */
    +/* begin file src/westmere/sse_convert_latin1_to_utf16.cpp */
    +template 
    +std::pair sse_convert_latin1_to_utf16(const char *latin1_input, size_t len,
    +                                                              char16_t *utf16_output) {
    +    size_t rounded_len = len & ~0xF; // Round down to nearest multiple of 16
    +    for (size_t i = 0; i < rounded_len; i += 16) {
    +        // Load 16 Latin1 characters into a 128-bit register
    +        __m128i in = _mm_loadu_si128(reinterpret_cast(&latin1_input[i]));
    +        __m128i out1 = big_endian ? _mm_unpacklo_epi8(_mm_setzero_si128(), in)
    +                         : _mm_unpacklo_epi8(in, _mm_setzero_si128());
    +        __m128i out2 = big_endian ? _mm_unpackhi_epi8(_mm_setzero_si128(), in)
    +                         : _mm_unpackhi_epi8(in, _mm_setzero_si128());
    +        // Zero extend each Latin1 character to 16-bit integers and store the results back to memory
    +        _mm_storeu_si128(reinterpret_cast<__m128i*>(&utf16_output[i]), out1);
    +        _mm_storeu_si128(reinterpret_cast<__m128i*>(&utf16_output[i + 8]), out2);
    +    }
    +    // return pointers pointing to where we left off
    +    return std::make_pair(latin1_input + rounded_len, utf16_output + rounded_len);
    +}
    +/* end file src/westmere/sse_convert_latin1_to_utf16.cpp */
    +/* begin file src/westmere/sse_convert_latin1_to_utf32.cpp */
    +std::pair sse_convert_latin1_to_utf32(const char* buf, size_t len, char32_t* utf32_output) {
    +    const char* end = buf + len;
    +
    +    while (buf + 16 <= end) {
    +        // Load 16 Latin1 characters (16 bytes) into a 128-bit register
    +        __m128i in = _mm_loadu_si128((__m128i*)buf);
     
    -    while (input + 4 < end) {
    -        const __m128i in = _mm_loadu_si128((__m128i *)input);
    -        currentmax = _mm_max_epu32(in,currentmax);
    -        currentoffsetmax = _mm_max_epu32(_mm_add_epi32(in, offset), currentoffsetmax);
    +        // Shift input to process next 4 bytes
    +        __m128i in_shifted1 = _mm_srli_si128(in, 4);
    +        __m128i in_shifted2 = _mm_srli_si128(in, 8);
    +        __m128i in_shifted3 = _mm_srli_si128(in, 12);
     
    -        __m128i is_zero = _mm_xor_si128(_mm_max_epu32(currentmax, standardmax), standardmax);
    -        if(_mm_test_all_zeros(is_zero, is_zero) == 0) {
    -            return result(error_code::TOO_LARGE, input - start);
    -        }
    +        // expand 8-bit to 32-bit unit      
    +        __m128i out1 = _mm_cvtepu8_epi32(in);
    +        __m128i out2 = _mm_cvtepu8_epi32(in_shifted1);
    +        __m128i out3 = _mm_cvtepu8_epi32(in_shifted2);
    +        __m128i out4 = _mm_cvtepu8_epi32(in_shifted3);
     
    -        is_zero = _mm_xor_si128(_mm_max_epu32(currentoffsetmax, standardoffsetmax), standardoffsetmax);
    -        if(_mm_test_all_zeros(is_zero, is_zero) == 0) {
    -            return result(error_code::SURROGATE, input - start);
    -        }
    -        input += 4;
    +        _mm_storeu_si128((__m128i*)utf32_output, out1);
    +        _mm_storeu_si128((__m128i*)(utf32_output + 4), out2);
    +        _mm_storeu_si128((__m128i*)(utf32_output + 8), out3);
    +        _mm_storeu_si128((__m128i*)(utf32_output + 12), out4);
    +
    +        utf32_output += 16;
    +        buf += 16;
         }
     
    -    return result(error_code::SUCCESS, input - start);
    +    return std::make_pair(buf, utf32_output);
     }
    -/* end file src/westmere/sse_validate_utf32le.cpp */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=westmere/sse_convert_utf8_to_utf16.cpp
    +/* end file src/westmere/sse_convert_latin1_to_utf32.cpp */
    +
    +
     /* begin file src/westmere/sse_convert_utf8_to_utf16.cpp */
     // depends on "tables/utf8_to_utf16_tables.h"
     
    @@ -25249,7 +29142,7 @@ size_t convert_masked_utf8_to_utf16(const char *input,
         return 16; // We consumed 16 bytes.
       }
       if(((utf8_end_of_code_point_mask & 0xFFFF) == 0xaaaa)) {
    -    // We want to take 8 2-byte UTF-8 words and turn them into 8 2-byte UTF-16 words.
    +    // We want to take 8 2-byte UTF-8 code units and turn them into 8 2-byte UTF-16 code units.
         // There is probably a more efficient sequence, but the following might do.
         const __m128i sh = _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14);
         const __m128i perm = _mm_shuffle_epi8(in, sh);
    @@ -25262,7 +29155,7 @@ size_t convert_masked_utf8_to_utf16(const char *input,
         return 16;
       }
       if(input_utf8_end_of_code_point_mask == 0x924) {
    -    // We want to take 4 3-byte UTF-8 words and turn them into 4 2-byte UTF-16 words.
    +    // We want to take 4 3-byte UTF-8 code units and turn them into 4 2-byte UTF-16 code units.
         // There is probably a more efficient sequence, but the following might do.
         const __m128i sh = _mm_setr_epi8(2, 1, 0, -1, 5, 4, 3, -1, 8, 7, 6, -1, 11, 10, 9, -1);
         const __m128i perm = _mm_shuffle_epi8(in, sh);
    @@ -25289,10 +29182,10 @@ size_t convert_masked_utf8_to_utf16(const char *input,
       const uint8_t consumed =
           tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][1];
       if (idx < 64) {
    -    // SIX (6) input code-words
    +    // SIX (6) input code-code units
         // this is a relatively easy scenario
    -    // we process SIX (6) input code-words. The max length in bytes of six code
    -    // words spanning between 1 and 2 bytes each is 12 bytes. On processors
    +    // we process SIX (6) input code-code units. The max length in bytes of six code
    +    // code units spanning between 1 and 2 bytes each is 12 bytes. On processors
         // where pdep/pext is fast, we might be able to use a small lookup table.
         const __m128i sh =
             _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]);
    @@ -25304,7 +29197,7 @@ size_t convert_masked_utf8_to_utf16(const char *input,
         _mm_storeu_si128((__m128i *)utf16_output, composed);
         utf16_output += 6; // We wrote 12 bytes, 6 code points.
       } else if (idx < 145) {
    -    // FOUR (4) input code-words
    +    // FOUR (4) input code-code units
         const __m128i sh =
             _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]);
         const __m128i perm = _mm_shuffle_epi8(in, sh);
    @@ -25323,7 +29216,7 @@ size_t convert_masked_utf8_to_utf16(const char *input,
         _mm_storeu_si128((__m128i *)utf16_output, composed_repacked);
         utf16_output += 4;
       } else if (idx < 209) {
    -    // TWO (2) input code-words
    +    // TWO (2) input code-code units
         //////////////
         // There might be garbage inputs where a leading byte mascarades as a four-byte
         // leading byte (by being followed by 3 continuation byte), but is not greater than
    @@ -25393,7 +29286,6 @@ size_t convert_masked_utf8_to_utf16(const char *input,
       return consumed;
     }
     /* end file src/westmere/sse_convert_utf8_to_utf16.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=westmere/sse_convert_utf8_to_utf32.cpp
     /* begin file src/westmere/sse_convert_utf8_to_utf32.cpp */
     // depends on "tables/utf8_to_utf16_tables.h"
     
    @@ -25428,7 +29320,7 @@ size_t convert_masked_utf8_to_utf32(const char *input,
         return 16; // We consumed 16 bytes.
       }
       if(((utf8_end_of_code_point_mask & 0xffff) == 0xaaaa)) {
    -    // We want to take 8 2-byte UTF-8 words and turn them into 8 4-byte UTF-32 words.
    +    // We want to take 8 2-byte UTF-8 code units and turn them into 8 4-byte UTF-32 code units.
         // There is probably a more efficient sequence, but the following might do.
         const __m128i sh = _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14);
         const __m128i perm = _mm_shuffle_epi8(in, sh);
    @@ -25441,7 +29333,7 @@ size_t convert_masked_utf8_to_utf32(const char *input,
         return 16;
       }
       if(input_utf8_end_of_code_point_mask == 0x924) {
    -    // We want to take 4 3-byte UTF-8 words and turn them into 4 4-byte UTF-32 words.
    +    // We want to take 4 3-byte UTF-8 code units and turn them into 4 4-byte UTF-32 code units.
         // There is probably a more efficient sequence, but the following might do.
         const __m128i sh = _mm_setr_epi8(2, 1, 0, -1, 5, 4, 3, -1, 8, 7, 6, -1, 11, 10, 9, -1);
         const __m128i perm = _mm_shuffle_epi8(in, sh);
    @@ -25466,10 +29358,10 @@ size_t convert_masked_utf8_to_utf32(const char *input,
       const uint8_t consumed =
           tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][1];
       if (idx < 64) {
    -    // SIX (6) input code-words
    +    // SIX (6) input code-code units
         // this is a relatively easy scenario
    -    // we process SIX (6) input code-words. The max length in bytes of six code
    -    // words spanning between 1 and 2 bytes each is 12 bytes. On processors
    +    // we process SIX (6) input code-code units. The max length in bytes of six code
    +    // code units spanning between 1 and 2 bytes each is 12 bytes. On processors
         // where pdep/pext is fast, we might be able to use a small lookup table.
         const __m128i sh =
             _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]);
    @@ -25481,7 +29373,7 @@ size_t convert_masked_utf8_to_utf32(const char *input,
         _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output+4), _mm_cvtepu16_epi32(_mm_srli_si128(composed,8)));
         utf32_output += 6; // We wrote 12 bytes, 6 code points.
       } else if (idx < 145) {
    -    // FOUR (4) input code-words
    +    // FOUR (4) input code-code units
         const __m128i sh =
             _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]);
         const __m128i perm = _mm_shuffle_epi8(in, sh);
    @@ -25498,7 +29390,7 @@ size_t convert_masked_utf8_to_utf32(const char *input,
         _mm_storeu_si128((__m128i *)utf32_output, composed);
         utf32_output += 4;
       } else if (idx < 209) {
    -    // TWO (2) input code-words
    +    // TWO (2) input code-code units
         const __m128i sh =
             _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]);
         const __m128i perm = _mm_shuffle_epi8(in, sh);
    @@ -25524,12 +29416,129 @@ size_t convert_masked_utf8_to_utf32(const char *input,
       return consumed;
     }
     /* end file src/westmere/sse_convert_utf8_to_utf32.cpp */
    +/* begin file src/westmere/sse_convert_utf8_to_latin1.cpp */
    +// depends on "tables/utf8_to_utf16_tables.h"
    +
    +
    +// Convert up to 12 bytes from utf8 to latin1 using a mask indicating the
    +// end of the code points. Only the least significant 12 bits of the mask
    +// are accessed.
    +// It returns how many bytes were consumed (up to 12).
    +size_t convert_masked_utf8_to_latin1(const char *input,
    +                           uint64_t utf8_end_of_code_point_mask,
    +                           char *&latin1_output) {
    +  // we use an approach where we try to process up to 12 input bytes.
    +  // Why 12 input bytes and not 16? Because we are concerned with the size of
    +  // the lookup tables. Also 12 is nicely divisible by two and three.
    +  //
    +  //
    +  // Optimization note: our main path below is load-latency dependent. Thus it is maybe
    +  // beneficial to have fast paths that depend on branch prediction but have less latency.
    +  // This results in more instructions but, potentially, also higher speeds.
    +  //
    +  const __m128i in = _mm_loadu_si128((__m128i *)input);
    +  const uint16_t input_utf8_end_of_code_point_mask =
    +      utf8_end_of_code_point_mask & 0xfff; //we're only processing 12 bytes in case it`s not all ASCII
    +  if(((utf8_end_of_code_point_mask & 0xffff) == 0xffff)) {
    +    // We process the data in chunks of 16 bytes.
    +    _mm_storeu_si128(reinterpret_cast<__m128i *>(latin1_output), in);
    +    latin1_output += 16; // We wrote 16 characters.
    +    return 16; // We consumed 16 bytes.
    +  }
    +  /// We do not have a fast path available, so we fallback.
    +  const uint8_t idx =
    +      tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][0];
    +  const uint8_t consumed =
    +      tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][1];
    +  // this indicates an invalid input:
    +  if(idx >= 64) { return consumed; }
    +  // Here we should have (idx < 64), if not, there is a bug in the validation or elsewhere.
    +  // SIX (6) input code-code units
    +  // this is a relatively easy scenario
    +  // we process SIX (6) input code-code units. The max length in bytes of six code
    +  // code units spanning between 1 and 2 bytes each is 12 bytes. On processors
    +  // where pdep/pext is fast, we might be able to use a small lookup table.
    +  const __m128i sh =
    +        _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]);
    +  const __m128i perm = _mm_shuffle_epi8(in, sh);
    +  const __m128i ascii = _mm_and_si128(perm, _mm_set1_epi16(0x7f));
    +  const __m128i highbyte = _mm_and_si128(perm, _mm_set1_epi16(0x1f00));
    +  __m128i composed = _mm_or_si128(ascii, _mm_srli_epi16(highbyte, 2));
    +  const __m128i latin1_packed = _mm_packus_epi16(composed,composed);
    +  // writing 8 bytes even though we only care about the first 6 bytes.
    +  // performance note: it would be faster to use _mm_storeu_si128, we should investigate.
    +  _mm_storel_epi64((__m128i *)latin1_output, latin1_packed);
    +  latin1_output += 6; // We wrote 6 bytes.
    +  return consumed;
    +}
    +/* end file src/westmere/sse_convert_utf8_to_latin1.cpp */
    +
    +/* begin file src/westmere/sse_convert_utf16_to_latin1.cpp */
    +template 
    +std::pair sse_convert_utf16_to_latin1(const char16_t* buf, size_t len, char* latin1_output) {
    +  const char16_t* end = buf + len;
    +  while (buf + 8 <= end) {
    +    // Load 8 UTF-16 characters into 128-bit SSE register
    +    __m128i in = _mm_loadu_si128(reinterpret_cast(buf));
    +
    +    if (!match_system(big_endian)) {
    +      const __m128i swap = _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14);
    +      in = _mm_shuffle_epi8(in, swap);
    +    }
    +
    +    __m128i high_byte_mask = _mm_set1_epi16((int16_t)0xFF00);
    +    if (_mm_testz_si128(in, high_byte_mask)) {
    +      // Pack 16-bit characters into 8-bit and store in latin1_output
    +      __m128i latin1_packed = _mm_packus_epi16(in, in);
    +      _mm_storel_epi64(reinterpret_cast<__m128i*>(latin1_output), latin1_packed);
    +      // Adjust pointers for next iteration
    +      buf += 8;
    +      latin1_output += 8;
    +    } else {
    +      return std::make_pair(nullptr, reinterpret_cast(latin1_output));
    +    }
    +  } // while
    +  return std::make_pair(buf, latin1_output);
    +}
    +
    +template 
    +std::pair sse_convert_utf16_to_latin1_with_errors(const char16_t* buf, size_t len, char* latin1_output) {
    +  const char16_t* start = buf;
    +  const char16_t* end = buf + len;
    +  while (buf + 8 <= end) {
    +    __m128i in = _mm_loadu_si128(reinterpret_cast(buf));
    +
    +    if (!big_endian) {
    +      const __m128i swap = _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14);
    +      in = _mm_shuffle_epi8(in, swap);
    +    }
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=westmere/sse_convert_utf16_to_utf8.cpp
    +    __m128i high_byte_mask = _mm_set1_epi16((int16_t)0xFF00);
    +    if (_mm_testz_si128(in, high_byte_mask)) {
    +      __m128i latin1_packed = _mm_packus_epi16(in, in);
    +      _mm_storel_epi64(reinterpret_cast<__m128i*>(latin1_output), latin1_packed);
    +      buf += 8;
    +      latin1_output += 8;
    +    } else {
    +      // Fallback to scalar code for handling errors
    +      for(int k = 0; k < 8; k++) {
    +        uint16_t word = !match_system(big_endian) ? scalar::utf16::swap_bytes(buf[k]) : buf[k];
    +        if(word <= 0xff) {
    +          *latin1_output++ = char(word);
    +        } else {
    +          return std::make_pair(result(error_code::TOO_LARGE, buf - start + k), latin1_output);
    +        }
    +      }
    +      buf += 8;
    +    }
    +  } // while
    +  return std::make_pair(result(error_code::SUCCESS, buf - start), latin1_output);
    +}
    +/* end file src/westmere/sse_convert_utf16_to_latin1.cpp */
     /* begin file src/westmere/sse_convert_utf16_to_utf8.cpp */
     /*
         The vectorized algorithm works on single SSE register i.e., it
    -    loads eight 16-bit words.
    +    loads eight 16-bit code units.
     
         We consider three cases:
         1. an input register contains no surrogates and each value
    @@ -25541,7 +29550,7 @@ size_t convert_masked_utf8_to_utf32(const char *input,
     
         Ad 1.
     
    -    When values are less than 0x0800, it means that a 16-bit words
    +    When values are less than 0x0800, it means that a 16-bit code unit
         can be converted into: 1) single UTF8 byte (when it's an ASCII
         char) or 2) two UTF8 bytes.
     
    @@ -25555,7 +29564,7 @@ size_t convert_masked_utf8_to_utf32(const char *input,
     
         Ad 2.
     
    -    When values fit in 16-bit words, but are above 0x07ff, then
    +    When values fit in 16-bit code units, but are above 0x07ff, then
         a single word may produce one, two or three UTF8 bytes.
     
         We prepare data for all these three cases in two registers.
    @@ -25588,7 +29597,6 @@ std::pair sse_convert_utf16_to_utf8(const char16_t* buf,
       const __m128i v_0000 = _mm_setzero_si128();
       const __m128i v_f800 = _mm_set1_epi16((int16_t)0xf800);
       const __m128i v_d800 = _mm_set1_epi16((int16_t)0xd800);
    -  const __m128i v_c080 = _mm_set1_epi16((int16_t)0xc080);
       const size_t safety_margin = 12; // to avoid overruns, see issue https://github.com/simdutf/simdutf/issues/92
     
       while (buf + 16 + safety_margin <= end) {
    @@ -25637,44 +29645,9 @@ std::pair sse_convert_utf16_to_utf8(const char16_t* buf,
         const uint16_t one_or_two_bytes_bitmask = static_cast(_mm_movemask_epi8(one_or_two_bytes_bytemask));
     
         if (one_or_two_bytes_bitmask == 0xffff) {
    -          // 1. prepare 2-byte values
    -          // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
    -          // expected output   : [110a|aaaa|10bb|bbbb] x 8
    -          const __m128i v_1f00 = _mm_set1_epi16((int16_t)0x1f00);
    -          const __m128i v_003f = _mm_set1_epi16((int16_t)0x003f);
    -
    -          // t0 = [000a|aaaa|bbbb|bb00]
    -          const __m128i t0 = _mm_slli_epi16(in, 2);
    -          // t1 = [000a|aaaa|0000|0000]
    -          const __m128i t1 = _mm_and_si128(t0, v_1f00);
    -          // t2 = [0000|0000|00bb|bbbb]
    -          const __m128i t2 = _mm_and_si128(in, v_003f);
    -          // t3 = [000a|aaaa|00bb|bbbb]
    -          const __m128i t3 = _mm_or_si128(t1, t2);
    -          // t4 = [110a|aaaa|10bb|bbbb]
    -          const __m128i t4 = _mm_or_si128(t3, v_c080);
    -
    -          // 2. merge ASCII and 2-byte codewords
    -          const __m128i utf8_unpacked = _mm_blendv_epi8(t4, in, one_byte_bytemask);
    -
    -          // 3. prepare bitmask for 8-bit lookup
    -          //    one_byte_bitmask = hhggffeeddccbbaa -- the bits are doubled (h - MSB, a - LSB)
    -          const uint16_t m0 = one_byte_bitmask & 0x5555;  // m0 = 0h0g0f0e0d0c0b0a
    -          const uint16_t m1 = static_cast(m0 >> 7);                    // m1 = 00000000h0g0f0e0
    -          const uint8_t  m2 = static_cast((m0 | m1) & 0xff);           // m2 =         hdgcfbea
    -          // 4. pack the bytes
    -          const uint8_t* row = &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0];
    -          const __m128i shuffle = _mm_loadu_si128((__m128i*)(row + 1));
    -          const __m128i utf8_packed = _mm_shuffle_epi8(utf8_unpacked, shuffle);
    -
    -          // 5. store bytes
    -          _mm_storeu_si128((__m128i*)utf8_output, utf8_packed);
    -
    -          // 6. adjust pointers
    -          buf += 8;
    -          utf8_output += row[0];
    -          continue;
    -
    +      internal::westmere::write_v_u16_11bits_to_utf8(in, utf8_output, one_byte_bytemask, one_byte_bitmask);
    +      buf += 8;
    +      continue;
         }
     
         // 1. Check if there are any surrogate word in the input chunk.
    @@ -25688,7 +29661,7 @@ std::pair sse_convert_utf16_to_utf8(const char16_t* buf,
         // It might seem like checking for surrogates_bitmask == 0xc000 could help. However,
         // it is likely an uncommon occurrence.
         if (surrogates_bitmask == 0x0000) {
    -      // case: words from register produce either 1, 2 or 3 UTF-8 bytes
    +      // case: code units from register produce either 1, 2 or 3 UTF-8 bytes
             const __m128i dup_even = _mm_setr_epi16(0x0000, 0x0202, 0x0404, 0x0606,
                                                     0x0808, 0x0a0a, 0x0c0c, 0x0e0e);
     
    @@ -25697,7 +29670,7 @@ std::pair sse_convert_utf16_to_utf8(const char16_t* buf,
                2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc]              - two UTF-8 bytes
                3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three UTF-8 bytes
     
    -          We expand the input word (16-bit) into two words (32-bit), thus
    +          We expand the input word (16-bit) into two code units (32-bit), thus
               we have room for four bytes. However, we need five distinct bit
               layouts. Note that the last byte in cases #2 and #3 is the same.
     
    @@ -25708,7 +29681,7 @@ std::pair sse_convert_utf16_to_utf8(const char16_t* buf,
               either byte 1 for case #2 or byte 2 for case #3. Note that they
               differ by exactly one bit.
     
    -          Finally from these two words we build proper UTF-8 sequence, taking
    +          Finally from these two code units we build proper UTF-8 sequence, taking
               into account the case (i.e, the number of bytes to write).
             */
             /**
    @@ -25736,15 +29709,15 @@ std::pair sse_convert_utf16_to_utf8(const char16_t* buf,
             const __m128i s4 = _mm_xor_si128(s3, m0);
     #undef simdutf_vec
     
    -        // 4. expand words 16-bit => 32-bit
    +        // 4. expand code units 16-bit => 32-bit
             const __m128i out0 = _mm_unpacklo_epi16(t2, s4);
             const __m128i out1 = _mm_unpackhi_epi16(t2, s4);
     
    -        // 5. compress 32-bit words into 1, 2 or 3 bytes -- 2 x shuffle
    +        // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
             const uint16_t mask = (one_byte_bitmask & 0x5555) |
                                   (one_or_two_bytes_bitmask & 0xaaaa);
             if(mask == 0) {
    -          // We only have three-byte words. Use fast path.
    +          // We only have three-byte code units. Use fast path.
               const __m128i shuffle = _mm_setr_epi8(2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1);
               const __m128i utf8_0 = _mm_shuffle_epi8(out0, shuffle);
               const __m128i utf8_1 = _mm_shuffle_epi8(out1, shuffle);
    @@ -25828,7 +29801,6 @@ std::pair sse_convert_utf16_to_utf8_with_errors(const char16_t* b
       const __m128i v_0000 = _mm_setzero_si128();
       const __m128i v_f800 = _mm_set1_epi16((int16_t)0xf800);
       const __m128i v_d800 = _mm_set1_epi16((int16_t)0xd800);
    -  const __m128i v_c080 = _mm_set1_epi16((int16_t)0xc080);
       const size_t safety_margin = 12; // to avoid overruns, see issue https://github.com/simdutf/simdutf/issues/92
     
       while (buf + 16 + safety_margin <= end) {
    @@ -25877,44 +29849,9 @@ std::pair sse_convert_utf16_to_utf8_with_errors(const char16_t* b
         const uint16_t one_or_two_bytes_bitmask = static_cast(_mm_movemask_epi8(one_or_two_bytes_bytemask));
     
         if (one_or_two_bytes_bitmask == 0xffff) {
    -          // 1. prepare 2-byte values
    -          // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
    -          // expected output   : [110a|aaaa|10bb|bbbb] x 8
    -          const __m128i v_1f00 = _mm_set1_epi16((int16_t)0x1f00);
    -          const __m128i v_003f = _mm_set1_epi16((int16_t)0x003f);
    -
    -          // t0 = [000a|aaaa|bbbb|bb00]
    -          const __m128i t0 = _mm_slli_epi16(in, 2);
    -          // t1 = [000a|aaaa|0000|0000]
    -          const __m128i t1 = _mm_and_si128(t0, v_1f00);
    -          // t2 = [0000|0000|00bb|bbbb]
    -          const __m128i t2 = _mm_and_si128(in, v_003f);
    -          // t3 = [000a|aaaa|00bb|bbbb]
    -          const __m128i t3 = _mm_or_si128(t1, t2);
    -          // t4 = [110a|aaaa|10bb|bbbb]
    -          const __m128i t4 = _mm_or_si128(t3, v_c080);
    -
    -          // 2. merge ASCII and 2-byte codewords
    -          const __m128i utf8_unpacked = _mm_blendv_epi8(t4, in, one_byte_bytemask);
    -
    -          // 3. prepare bitmask for 8-bit lookup
    -          //    one_byte_bitmask = hhggffeeddccbbaa -- the bits are doubled (h - MSB, a - LSB)
    -          const uint16_t m0 = one_byte_bitmask & 0x5555;  // m0 = 0h0g0f0e0d0c0b0a
    -          const uint16_t m1 = static_cast(m0 >> 7);                    // m1 = 00000000h0g0f0e0
    -          const uint8_t  m2 = static_cast((m0 | m1) & 0xff);           // m2 =         hdgcfbea
    -          // 4. pack the bytes
    -          const uint8_t* row = &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0];
    -          const __m128i shuffle = _mm_loadu_si128((__m128i*)(row + 1));
    -          const __m128i utf8_packed = _mm_shuffle_epi8(utf8_unpacked, shuffle);
    -
    -          // 5. store bytes
    -          _mm_storeu_si128((__m128i*)utf8_output, utf8_packed);
    -
    -          // 6. adjust pointers
    -          buf += 8;
    -          utf8_output += row[0];
    -          continue;
    -
    +      internal::westmere::write_v_u16_11bits_to_utf8(in, utf8_output, one_byte_bytemask, one_byte_bitmask);
    +      buf += 8;
    +      continue;
         }
     
         // 1. Check if there are any surrogate word in the input chunk.
    @@ -25928,7 +29865,7 @@ std::pair sse_convert_utf16_to_utf8_with_errors(const char16_t* b
         // It might seem like checking for surrogates_bitmask == 0xc000 could help. However,
         // it is likely an uncommon occurrence.
         if (surrogates_bitmask == 0x0000) {
    -      // case: words from register produce either 1, 2 or 3 UTF-8 bytes
    +      // case: code units from register produce either 1, 2 or 3 UTF-8 bytes
             const __m128i dup_even = _mm_setr_epi16(0x0000, 0x0202, 0x0404, 0x0606,
                                                     0x0808, 0x0a0a, 0x0c0c, 0x0e0e);
     
    @@ -25937,7 +29874,7 @@ std::pair sse_convert_utf16_to_utf8_with_errors(const char16_t* b
                2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc]              - two UTF-8 bytes
                3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three UTF-8 bytes
     
    -          We expand the input word (16-bit) into two words (32-bit), thus
    +          We expand the input word (16-bit) into two code units (32-bit), thus
               we have room for four bytes. However, we need five distinct bit
               layouts. Note that the last byte in cases #2 and #3 is the same.
     
    @@ -25948,7 +29885,7 @@ std::pair sse_convert_utf16_to_utf8_with_errors(const char16_t* b
               either byte 1 for case #2 or byte 2 for case #3. Note that they
               differ by exactly one bit.
     
    -          Finally from these two words we build proper UTF-8 sequence, taking
    +          Finally from these two code units we build proper UTF-8 sequence, taking
               into account the case (i.e, the number of bytes to write).
             */
             /**
    @@ -25976,15 +29913,15 @@ std::pair sse_convert_utf16_to_utf8_with_errors(const char16_t* b
             const __m128i s4 = _mm_xor_si128(s3, m0);
     #undef simdutf_vec
     
    -        // 4. expand words 16-bit => 32-bit
    +        // 4. expand code units 16-bit => 32-bit
             const __m128i out0 = _mm_unpacklo_epi16(t2, s4);
             const __m128i out1 = _mm_unpackhi_epi16(t2, s4);
     
    -        // 5. compress 32-bit words into 1, 2 or 3 bytes -- 2 x shuffle
    +        // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
             const uint16_t mask = (one_byte_bitmask & 0x5555) |
                                   (one_or_two_bytes_bitmask & 0xaaaa);
             if(mask == 0) {
    -          // We only have three-byte words. Use fast path.
    +          // We only have three-byte code units. Use fast path.
               const __m128i shuffle = _mm_setr_epi8(2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1);
               const __m128i utf8_0 = _mm_shuffle_epi8(out0, shuffle);
               const __m128i utf8_1 = _mm_shuffle_epi8(out1, shuffle);
    @@ -26053,11 +29990,10 @@ std::pair sse_convert_utf16_to_utf8_with_errors(const char16_t* b
       return std::make_pair(result(error_code::SUCCESS, buf - start), utf8_output);
     }
     /* end file src/westmere/sse_convert_utf16_to_utf8.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=westmere/sse_convert_utf16_to_utf32.cpp
     /* begin file src/westmere/sse_convert_utf16_to_utf32.cpp */
     /*
         The vectorized algorithm works on single SSE register i.e., it
    -    loads eight 16-bit words.
    +    loads eight 16-bit code units.
     
         We consider three cases:
         1. an input register contains no surrogates and each value
    @@ -26069,7 +30005,7 @@ std::pair sse_convert_utf16_to_utf8_with_errors(const char16_t* b
     
         Ad 1.
     
    -    When values are less than 0x0800, it means that a 16-bit words
    +    When values are less than 0x0800, it means that a 16-bit code unit
         can be converted into: 1) single UTF8 byte (when it's an ASCII
         char) or 2) two UTF8 bytes.
     
    @@ -26083,7 +30019,7 @@ std::pair sse_convert_utf16_to_utf8_with_errors(const char16_t* b
     
         Ad 2.
     
    -    When values fit in 16-bit words, but are above 0x07ff, then
    +    When values fit in 16-bit code units, but are above 0x07ff, then
         a single word may produce one, two or three UTF8 bytes.
     
         We prepare data for all these three cases in two registers.
    @@ -26115,7 +30051,7 @@ std::pair sse_convert_utf16_to_utf32(const char16_t*
       const __m128i v_f800 = _mm_set1_epi16((int16_t)0xf800);
       const __m128i v_d800 = _mm_set1_epi16((int16_t)0xd800);
     
    -  while (buf + 16 <= end) {
    +  while (buf + 8 <= end) {
         __m128i in = _mm_loadu_si128((__m128i*)buf);
     
         if (big_endian) {
    @@ -26134,7 +30070,7 @@ std::pair sse_convert_utf16_to_utf32(const char16_t*
         // It might seem like checking for surrogates_bitmask == 0xc000 could help. However,
         // it is likely an uncommon occurrence.
         if (surrogates_bitmask == 0x0000) {
    -      // case: no surrogate pair, extend 16-bit words to 32-bit words
    +      // case: no surrogate pair, extend 16-bit code units to 32-bit code units
             _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output), _mm_cvtepu16_epi32(in));
             _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output+4), _mm_cvtepu16_epi32(_mm_srli_si128(in,8)));
             utf32_output += 8;
    @@ -26183,7 +30119,7 @@ std::pair sse_convert_utf16_to_utf32_with_errors(const char16
       const __m128i v_f800 = _mm_set1_epi16((int16_t)0xf800);
       const __m128i v_d800 = _mm_set1_epi16((int16_t)0xd800);
     
    -  while (buf + 16 <= end) {
    +  while (buf + 8 <= end) {
         __m128i in = _mm_loadu_si128((__m128i*)buf);
     
         if (big_endian) {
    @@ -26202,7 +30138,7 @@ std::pair sse_convert_utf16_to_utf32_with_errors(const char16
         // It might seem like checking for surrogates_bitmask == 0xc000 could help. However,
         // it is likely an uncommon occurrence.
         if (surrogates_bitmask == 0x0000) {
    -      // case: no surrogate pair, extend 16-bit words to 32-bit words
    +      // case: no surrogate pair, extend 16-bit code units to 32-bit code units
             _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output), _mm_cvtepu16_epi32(in));
             _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output+4), _mm_cvtepu16_epi32(_mm_srli_si128(in,8)));
             utf32_output += 8;
    @@ -26237,51 +30173,139 @@ std::pair sse_convert_utf16_to_utf32_with_errors(const char16
     }
     /* end file src/westmere/sse_convert_utf16_to_utf32.cpp */
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=westmere/sse_convert_utf32_to_utf8.cpp
    +/* begin file src/westmere/sse_convert_utf32_to_latin1.cpp */
    +std::pair
    +sse_convert_utf32_to_latin1(const char32_t *buf, size_t len,
    +                            char *latin1_output) {
    +  const size_t rounded_len = len & ~0xF; // Round down to nearest multiple of 16
    +
    +  __m128i high_bytes_mask = _mm_set1_epi32(0xFFFFFF00);
    +  __m128i shufmask =
    +      _mm_set_epi8(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 8, 4, 0);
    +
    +  for (size_t i = 0; i < rounded_len; i += 16) {
    +    __m128i in1 = _mm_loadu_si128((__m128i *)buf);
    +    __m128i in2 = _mm_loadu_si128((__m128i *)(buf + 4));
    +    __m128i in3 = _mm_loadu_si128((__m128i *)(buf + 8));
    +    __m128i in4 = _mm_loadu_si128((__m128i *)(buf + 12));
    +
    +    __m128i check_combined = _mm_or_si128(in1, in2);
    +    check_combined = _mm_or_si128(check_combined, in3);
    +    check_combined = _mm_or_si128(check_combined, in4);
    +
    +    if (!_mm_testz_si128(check_combined, high_bytes_mask)) {
    +      return std::make_pair(nullptr, latin1_output);
    +    }
    +    __m128i pack1 = _mm_unpacklo_epi32(_mm_shuffle_epi8(in1, shufmask), _mm_shuffle_epi8(in2, shufmask));
    +    __m128i pack2 = _mm_unpacklo_epi32(_mm_shuffle_epi8(in3, shufmask), _mm_shuffle_epi8(in4, shufmask));
    +    __m128i pack = _mm_unpacklo_epi64(pack1, pack2);
    +    _mm_storeu_si128((__m128i *)latin1_output, pack);
    +    latin1_output += 16;
    +    buf += 16;
    +  }
    +
    +  return std::make_pair(buf, latin1_output);
    +}
    +
    +std::pair
    +sse_convert_utf32_to_latin1_with_errors(const char32_t *buf, size_t len,
    +                                        char *latin1_output) {
    +  const char32_t *start = buf;
    +  const size_t rounded_len = len & ~0xF; // Round down to nearest multiple of 16
    +
    +  __m128i high_bytes_mask = _mm_set1_epi32(0xFFFFFF00);
    +  __m128i shufmask =
    +      _mm_set_epi8(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 8, 4, 0);
    +
    +  for (size_t i = 0; i < rounded_len; i += 16) {
    +    __m128i in1 = _mm_loadu_si128((__m128i *)buf);
    +    __m128i in2 = _mm_loadu_si128((__m128i *)(buf + 4));
    +    __m128i in3 = _mm_loadu_si128((__m128i *)(buf + 8));
    +    __m128i in4 = _mm_loadu_si128((__m128i *)(buf + 12));
    +
    +    __m128i check_combined = _mm_or_si128(in1, in2);
    +    check_combined = _mm_or_si128(check_combined, in3);
    +    check_combined = _mm_or_si128(check_combined, in4);
    +
    +    if (!_mm_testz_si128(check_combined, high_bytes_mask)) {
    +      // Fallback to scalar code for handling errors
    +      for (int k = 0; k < 16; k++) {
    +        char32_t codepoint = buf[k];
    +        if (codepoint <= 0xff) {
    +          *latin1_output++ = char(codepoint);
    +        } else {
    +          return std::make_pair(result(error_code::TOO_LARGE, buf - start + k),
    +                                latin1_output);
    +        }
    +      }
    +      buf += 16;
    +      continue;
    +    }
    +    __m128i pack1 = _mm_unpacklo_epi32(_mm_shuffle_epi8(in1, shufmask), _mm_shuffle_epi8(in2, shufmask));
    +    __m128i pack2 = _mm_unpacklo_epi32(_mm_shuffle_epi8(in3, shufmask), _mm_shuffle_epi8(in4, shufmask));
    +    __m128i pack = _mm_unpacklo_epi64(pack1, pack2);
    +    _mm_storeu_si128((__m128i *)latin1_output, pack);
    +    latin1_output += 16;
    +    buf += 16;
    +  }
    +
    +  return std::make_pair(result(error_code::SUCCESS, buf - start),
    +                        latin1_output);
    +}
    +/* end file src/westmere/sse_convert_utf32_to_latin1.cpp */
     /* begin file src/westmere/sse_convert_utf32_to_utf8.cpp */
     std::pair sse_convert_utf32_to_utf8(const char32_t* buf, size_t len, char* utf8_output) {
       const char32_t* end = buf + len;
     
    -  const __m128i v_0000 = _mm_setzero_si128();
    -  const __m128i v_f800 = _mm_set1_epi16((uint16_t)0xf800);
    -  const __m128i v_c080 = _mm_set1_epi16((uint16_t)0xc080);
    -  const __m128i v_ff80 = _mm_set1_epi16((uint16_t)0xff80);
    -  const __m128i v_ffff0000 = _mm_set1_epi32((uint32_t)0xffff0000);
    -  const __m128i v_7fffffff = _mm_set1_epi32((uint32_t)0x7fffffff);
    +  const __m128i v_0000 = _mm_setzero_si128();//__m128 = 128 bits
    +  const __m128i v_f800 = _mm_set1_epi16((uint16_t)0xf800); //1111 1000 0000 0000
    +  const __m128i v_c080 = _mm_set1_epi16((uint16_t)0xc080); //1100 0000 1000 0000
    +  const __m128i v_ff80 = _mm_set1_epi16((uint16_t)0xff80); //1111 1111 1000 0000
    +  const __m128i v_ffff0000 = _mm_set1_epi32((uint32_t)0xffff0000); //1111 1111 1111 1111 0000 0000 0000 0000
    +  const __m128i v_7fffffff = _mm_set1_epi32((uint32_t)0x7fffffff); //0111 1111 1111 1111 1111 1111 1111 1111 
       __m128i running_max = _mm_setzero_si128();
       __m128i forbidden_bytemask = _mm_setzero_si128();
       const size_t safety_margin = 12; // to avoid overruns, see issue https://github.com/simdutf/simdutf/issues/92
     
    -  while (buf + 16 + safety_margin <= end) {
    +  while (buf + 16 + safety_margin <= end) { //buf is a char32_t pointer, each char32_t has 4 bytes or 32 bits, thus buf + 16 * char_32t = 512 bits = 64 bytes
         // We load two 16 bytes registers for a total of 32 bytes or 16 characters.
         __m128i in = _mm_loadu_si128((__m128i*)buf);
    -    __m128i nextin = _mm_loadu_si128((__m128i*)buf+1);
    -    running_max = _mm_max_epu32(_mm_max_epu32(in, running_max), nextin);
    -
    -    // Pack 32-bit UTF-32 words to 16-bit UTF-16 words with unsigned saturation
    -    __m128i in_16 = _mm_packus_epi32(_mm_and_si128(in, v_7fffffff), _mm_and_si128(nextin, v_7fffffff));
    +    __m128i nextin = _mm_loadu_si128((__m128i*)buf+1);//These two values can hold only 8 UTF32 chars
    +    running_max = _mm_max_epu32(
    +                                _mm_max_epu32(in, running_max), //take element-wise max char32_t from in and running_max vector
    +                                 nextin); //and take element-wise max element from nextin and running_max vector
    +
    +    // Pack 32-bit UTF-32 code units to 16-bit UTF-16 code units with unsigned saturation
    +    __m128i in_16 = _mm_packus_epi32(
    +                                      _mm_and_si128(in, v_7fffffff), 
    +                                      _mm_and_si128(nextin, v_7fffffff)
    +                                      );//in this context pack the two __m128 into a single 
    +    //By ensuring the highest bit is set to 0(&v_7fffffff), we're making sure all values are interpreted as non-negative, or specifically, the values are within the range of valid Unicode code points.
    +    //remember : having leading byte 0 means a positive number by the two complements system. Unicode is well beneath the range where you'll start getting issues so that's OK. 
     
         // Try to apply UTF-16 => UTF-8 from ./sse_convert_utf16_to_utf8.cpp
     
    -    // Check for ASCII fast path
    -    if(_mm_testz_si128(in_16, v_ff80)) { // ASCII fast path!!!!
    +    // Check for ASCII fast path 
    +
    +    // ASCII fast path!!!!
           // We eagerly load another 32 bytes, hoping that they will be ASCII too.
           // The intuition is that we try to collect 16 ASCII characters which requires
           // a total of 64 bytes of input. If we fail, we just pass thirdin and fourthin
           // as our new inputs.
    +    if(_mm_testz_si128(in_16, v_ff80)) {  //if the first two blocks are ASCII
           __m128i thirdin = _mm_loadu_si128((__m128i*)buf+2);
           __m128i fourthin = _mm_loadu_si128((__m128i*)buf+3);
    -      running_max = _mm_max_epu32(_mm_max_epu32(thirdin, running_max), fourthin);
    -      __m128i nextin_16 = _mm_packus_epi32(_mm_and_si128(thirdin, v_7fffffff), _mm_and_si128(fourthin, v_7fffffff));
    -      if(!_mm_testz_si128(nextin_16, v_ff80)) {
    +      running_max = _mm_max_epu32(_mm_max_epu32(thirdin, running_max), fourthin);//take the running max of all 4 vectors thus far
    +      __m128i nextin_16 = _mm_packus_epi32(_mm_and_si128(thirdin, v_7fffffff), _mm_and_si128(fourthin, v_7fffffff));//pack into 1 vector, now you have two
    +      if(!_mm_testz_si128(nextin_16, v_ff80)) {  //checks if the second packed vector is ASCII, if not:
             // 1. pack the bytes
             // obviously suboptimal.
    -        const __m128i utf8_packed = _mm_packus_epi16(in_16,in_16);
    +        const __m128i utf8_packed = _mm_packus_epi16(in_16,in_16); //creates two copy of in_16 in 1 vector
             // 2. store (16 bytes)
    -        _mm_storeu_si128((__m128i*)utf8_output, utf8_packed);
    +        _mm_storeu_si128((__m128i*)utf8_output, utf8_packed); //put them into the output
             // 3. adjust pointers
    -        buf += 8;
    -        utf8_output += 8;
    +        buf += 8; //the char32_t buffer pointer goes up 8 char32_t chars* 32 bits =  256 bits
    +        utf8_output += 8; //same with output, e.g. lift the first two blocks alone.
             // Proceed with next input
             in_16 = nextin_16;
             // We need to update in and nextin because they are used later.
    @@ -26299,32 +30323,36 @@ std::pair sse_convert_utf32_to_utf8(const char32_t* buf,
           }
         }
     
    -    // no bits set above 7th bit
    -    const __m128i one_byte_bytemask = _mm_cmpeq_epi16(_mm_and_si128(in_16, v_ff80), v_0000);
    -    const uint16_t one_byte_bitmask = static_cast(_mm_movemask_epi8(one_byte_bytemask));
    +    // no bits set above 7th bit -- find out all the ASCII characters
    +    const __m128i one_byte_bytemask = _mm_cmpeq_epi16( // this takes four bytes at a time and compares: 
    +                                                      _mm_and_si128(in_16, v_ff80), // the vector that get only the first 9 bits of each 16-bit/2-byte units
    +                                                       v_0000 //
    +                                                       ); // they should be all zero if they are ASCII. E.g. ASCII in UTF32 is of format 0000 0000 0000 0XXX XXXX
    +    // _mm_cmpeq_epi16 should now return a 1111 1111 1111 1111 for equals, and 0000 0000 0000 0000 if not for each 16-bit/2-byte units
    +    const uint16_t one_byte_bitmask = static_cast(_mm_movemask_epi8(one_byte_bytemask)); // collect the MSB from previous vector and put them into uint16_t mas
     
         // no bits set above 11th bit
         const __m128i one_or_two_bytes_bytemask = _mm_cmpeq_epi16(_mm_and_si128(in_16, v_f800), v_0000);
         const uint16_t one_or_two_bytes_bitmask = static_cast(_mm_movemask_epi8(one_or_two_bytes_bytemask));
     
         if (one_or_two_bytes_bitmask == 0xffff) {
    -      // case: all words either produce 1 or 2 UTF-8 bytes (at least one produces 2 bytes)
    +      // case: all code units either produce 1 or 2 UTF-8 bytes (at least one produces 2 bytes)
           // 1. prepare 2-byte values
           // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
           // expected output   : [110a|aaaa|10bb|bbbb] x 8
    -      const __m128i v_1f00 = _mm_set1_epi16((int16_t)0x1f00);
    -      const __m128i v_003f = _mm_set1_epi16((int16_t)0x003f);
    +      const __m128i v_1f00 = _mm_set1_epi16((int16_t)0x1f00); // 0001 1111 0000 0000
    +      const __m128i v_003f = _mm_set1_epi16((int16_t)0x003f); // 0000 0000 0011 1111
     
           // t0 = [000a|aaaa|bbbb|bb00]
    -      const __m128i t0 = _mm_slli_epi16(in_16, 2);
    +      const __m128i t0 = _mm_slli_epi16(in_16, 2); // shift packed vector by two
           // t1 = [000a|aaaa|0000|0000]
    -      const __m128i t1 = _mm_and_si128(t0, v_1f00);
    +      const __m128i t1 = _mm_and_si128(t0, v_1f00); // potentital first utf8 byte
           // t2 = [0000|0000|00bb|bbbb]
    -      const __m128i t2 = _mm_and_si128(in_16, v_003f);
    +      const __m128i t2 = _mm_and_si128(in_16, v_003f);// potential second utf8 byte 
           // t3 = [000a|aaaa|00bb|bbbb]
    -      const __m128i t3 = _mm_or_si128(t1, t2);
    +      const __m128i t3 = _mm_or_si128(t1, t2); // first and second potential utf8 byte together 
           // t4 = [110a|aaaa|10bb|bbbb]
    -      const __m128i t4 = _mm_or_si128(t3, v_c080);
    +      const __m128i t4 = _mm_or_si128(t3, v_c080); // t3 | 1100 0000 1000 0000 = full potential 2-byte utf8 unit 
     
           // 2. merge ASCII and 2-byte codewords
           const __m128i utf8_unpacked = _mm_blendv_epi8(t4, in_16, one_byte_bytemask);
    @@ -26353,7 +30381,7 @@ std::pair sse_convert_utf32_to_utf8(const char32_t* buf,
         const __m128i saturation_bytemask = _mm_cmpeq_epi32(_mm_and_si128(_mm_or_si128(in, nextin), v_ffff0000), v_0000);
         const uint32_t saturation_bitmask = static_cast(_mm_movemask_epi8(saturation_bytemask));
         if (saturation_bitmask == 0xffff) {
    -      // case: words from register produce either 1, 2 or 3 UTF-8 bytes
    +      // case: code units from register produce either 1, 2 or 3 UTF-8 bytes
           const __m128i v_d800 = _mm_set1_epi16((uint16_t)0xd800);
           forbidden_bytemask = _mm_or_si128(forbidden_bytemask, _mm_cmpeq_epi16(_mm_and_si128(in_16, v_f800), v_d800));
     
    @@ -26365,7 +30393,7 @@ std::pair sse_convert_utf32_to_utf8(const char32_t* buf,
               2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc]              - two UTF-8 bytes
               3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three UTF-8 bytes
     
    -        We expand the input word (16-bit) into two words (32-bit), thus
    +        We expand the input word (16-bit) into two code units (32-bit), thus
             we have room for four bytes. However, we need five distinct bit
             layouts. Note that the last byte in cases #2 and #3 is the same.
     
    @@ -26376,7 +30404,7 @@ std::pair sse_convert_utf32_to_utf8(const char32_t* buf,
             either byte 1 for case #2 or byte 2 for case #3. Note that they
             differ by exactly one bit.
     
    -        Finally from these two words we build proper UTF-8 sequence, taking
    +        Finally from these two code units we build proper UTF-8 sequence, taking
             into account the case (i.e, the number of bytes to write).
           */
           /**
    @@ -26404,15 +30432,15 @@ std::pair sse_convert_utf32_to_utf8(const char32_t* buf,
           const __m128i s4 = _mm_xor_si128(s3, m0);
     #undef simdutf_vec
     
    -      // 4. expand words 16-bit => 32-bit
    +      // 4. expand code units 16-bit => 32-bit
           const __m128i out0 = _mm_unpacklo_epi16(t2, s4);
           const __m128i out1 = _mm_unpackhi_epi16(t2, s4);
     
    -      // 5. compress 32-bit words into 1, 2 or 3 bytes -- 2 x shuffle
    +      // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
           const uint16_t mask = (one_byte_bitmask & 0x5555) |
                                 (one_or_two_bytes_bitmask & 0xaaaa);
           if(mask == 0) {
    -        // We only have three-byte words. Use fast path.
    +        // We only have three-byte code units. Use fast path.
             const __m128i shuffle = _mm_setr_epi8(2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1);
             const __m128i utf8_0 = _mm_shuffle_epi8(out0, shuffle);
             const __m128i utf8_1 = _mm_shuffle_epi8(out1, shuffle);
    @@ -26511,7 +30539,7 @@ std::pair sse_convert_utf32_to_utf8_with_errors(const char32_t* b
           return std::make_pair(result(error_code::TOO_LARGE, buf - start), utf8_output);
         }
     
    -    // Pack 32-bit UTF-32 words to 16-bit UTF-16 words with unsigned saturation
    +    // Pack 32-bit UTF-32 code units to 16-bit UTF-16 code units with unsigned saturation
         __m128i in_16 = _mm_packus_epi32(_mm_and_si128(in, v_7fffffff), _mm_and_si128(nextin, v_7fffffff));
     
         // Try to apply UTF-16 => UTF-8 from ./sse_convert_utf16_to_utf8.cpp
    @@ -26564,7 +30592,7 @@ std::pair sse_convert_utf32_to_utf8_with_errors(const char32_t* b
         const uint16_t one_or_two_bytes_bitmask = static_cast(_mm_movemask_epi8(one_or_two_bytes_bytemask));
     
         if (one_or_two_bytes_bitmask == 0xffff) {
    -      // case: all words either produce 1 or 2 UTF-8 bytes (at least one produces 2 bytes)
    +      // case: all code units either produce 1 or 2 UTF-8 bytes (at least one produces 2 bytes)
           // 1. prepare 2-byte values
           // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
           // expected output   : [110a|aaaa|10bb|bbbb] x 8
    @@ -26610,9 +30638,9 @@ std::pair sse_convert_utf32_to_utf8_with_errors(const char32_t* b
         const uint32_t saturation_bitmask = static_cast(_mm_movemask_epi8(saturation_bytemask));
     
         if (saturation_bitmask == 0xffff) {
    -      // case: words from register produce either 1, 2 or 3 UTF-8 bytes
    +      // case: code units from register produce either 1, 2 or 3 UTF-8 bytes
     
    -      // Check for illegal surrogate words
    +      // Check for illegal surrogate code units
           const __m128i v_d800 = _mm_set1_epi16((uint16_t)0xd800);
           const __m128i forbidden_bytemask = _mm_cmpeq_epi16(_mm_and_si128(in_16, v_f800), v_d800);
           if (static_cast(_mm_movemask_epi8(forbidden_bytemask)) != 0) {
    @@ -26627,7 +30655,7 @@ std::pair sse_convert_utf32_to_utf8_with_errors(const char32_t* b
               2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc]              - two UTF-8 bytes
               3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three UTF-8 bytes
     
    -        We expand the input word (16-bit) into two words (32-bit), thus
    +        We expand the input word (16-bit) into two code units (32-bit), thus
             we have room for four bytes. However, we need five distinct bit
             layouts. Note that the last byte in cases #2 and #3 is the same.
     
    @@ -26638,7 +30666,7 @@ std::pair sse_convert_utf32_to_utf8_with_errors(const char32_t* b
             either byte 1 for case #2 or byte 2 for case #3. Note that they
             differ by exactly one bit.
     
    -        Finally from these two words we build proper UTF-8 sequence, taking
    +        Finally from these two code units we build proper UTF-8 sequence, taking
             into account the case (i.e, the number of bytes to write).
           */
           /**
    @@ -26666,15 +30694,15 @@ std::pair sse_convert_utf32_to_utf8_with_errors(const char32_t* b
           const __m128i s4 = _mm_xor_si128(s3, m0);
     #undef simdutf_vec
     
    -      // 4. expand words 16-bit => 32-bit
    +      // 4. expand code units 16-bit => 32-bit
           const __m128i out0 = _mm_unpacklo_epi16(t2, s4);
           const __m128i out1 = _mm_unpackhi_epi16(t2, s4);
     
    -      // 5. compress 32-bit words into 1, 2 or 3 bytes -- 2 x shuffle
    +      // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
           const uint16_t mask = (one_byte_bitmask & 0x5555) |
                                 (one_or_two_bytes_bitmask & 0xaaaa);
           if(mask == 0) {
    -        // We only have three-byte words. Use fast path.
    +        // We only have three-byte code units. Use fast path.
             const __m128i shuffle = _mm_setr_epi8(2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1);
             const __m128i utf8_0 = _mm_shuffle_epi8(out0, shuffle);
             const __m128i utf8_1 = _mm_shuffle_epi8(out1, shuffle);
    @@ -26735,19 +30763,84 @@ std::pair sse_convert_utf32_to_utf8_with_errors(const char32_t* b
         }
       } // while
     
    -  return std::make_pair(result(error_code::SUCCESS, buf - start), utf8_output);
    +  return std::make_pair(result(error_code::SUCCESS, buf - start), utf8_output);
    +}
    +/* end file src/westmere/sse_convert_utf32_to_utf8.cpp */
    +/* begin file src/westmere/sse_convert_utf32_to_utf16.cpp */
    +template 
    +std::pair sse_convert_utf32_to_utf16(const char32_t* buf, size_t len, char16_t* utf16_output) {
    +
    +  const char32_t* end = buf + len;
    +
    +  const __m128i v_0000 = _mm_setzero_si128();
    +  const __m128i v_ffff0000 = _mm_set1_epi32((int32_t)0xffff0000);
    +  __m128i forbidden_bytemask = _mm_setzero_si128();
    +
    +  while (buf + 8 <= end) {
    +    __m128i in = _mm_loadu_si128((__m128i*)buf);
    +    __m128i nextin = _mm_loadu_si128((__m128i*)buf+1);
    +    const __m128i saturation_bytemask = _mm_cmpeq_epi32(_mm_and_si128(_mm_or_si128(in, nextin), v_ffff0000), v_0000);
    +    const uint32_t saturation_bitmask = static_cast(_mm_movemask_epi8(saturation_bytemask));
    +
    +    // Check if no bits set above 16th
    +    if (saturation_bitmask == 0xffff) {
    +      // Pack UTF-32 to UTF-16
    +      __m128i utf16_packed = _mm_packus_epi32(in, nextin);
    +
    +      const __m128i v_f800 = _mm_set1_epi16((uint16_t)0xf800);
    +      const __m128i v_d800 = _mm_set1_epi16((uint16_t)0xd800);
    +      forbidden_bytemask = _mm_or_si128(forbidden_bytemask, _mm_cmpeq_epi16(_mm_and_si128(utf16_packed, v_f800), v_d800));
    +
    +      if (big_endian) {
    +        const __m128i swap = _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14);
    +        utf16_packed = _mm_shuffle_epi8(utf16_packed, swap);
    +      }
    +
    +      _mm_storeu_si128((__m128i*)utf16_output, utf16_packed);
    +      utf16_output += 8;
    +      buf += 8;
    +    } else {
    +      size_t forward = 7;
    +      size_t k = 0;
    +      if(size_t(end - buf) < forward + 1) { forward = size_t(end - buf - 1);}
    +      for(; k < forward; k++) {
    +        uint32_t word = buf[k];
    +        if((word & 0xFFFF0000)==0) {
    +          // will not generate a surrogate pair
    +          if (word >= 0xD800 && word <= 0xDFFF) { return std::make_pair(nullptr, utf16_output); }
    +          *utf16_output++ = big_endian ? char16_t((uint16_t(word) >> 8) | (uint16_t(word) << 8)) : char16_t(word);
    +        } else {
    +          // will generate a surrogate pair
    +          if (word > 0x10FFFF) { return std::make_pair(nullptr, utf16_output); }
    +          word -= 0x10000;
    +          uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10));
    +          uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF));
    +          if (big_endian) {
    +            high_surrogate = uint16_t((high_surrogate >> 8) | (high_surrogate << 8));
    +            low_surrogate = uint16_t((low_surrogate >> 8) | (low_surrogate << 8));
    +          }
    +          *utf16_output++ = char16_t(high_surrogate);
    +          *utf16_output++ = char16_t(low_surrogate);
    +        }
    +      }
    +      buf += k;
    +    }
    +  }
    +
    +  // check for invalid input
    +  if (static_cast(_mm_movemask_epi8(forbidden_bytemask)) != 0) { return std::make_pair(nullptr, utf16_output); }
    +
    +  return std::make_pair(buf, utf16_output);
     }
    -/* end file src/westmere/sse_convert_utf32_to_utf8.cpp */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=westmere/sse_convert_utf32_to_utf16.cpp
    -/* begin file src/westmere/sse_convert_utf32_to_utf16.cpp */
    -template 
    -std::pair sse_convert_utf32_to_utf16(const char32_t* buf, size_t len, char16_t* utf16_output) {
     
    +
    +template 
    +std::pair sse_convert_utf32_to_utf16_with_errors(const char32_t* buf, size_t len, char16_t* utf16_output) {
    +  const char32_t* start = buf;
       const char32_t* end = buf + len;
     
       const __m128i v_0000 = _mm_setzero_si128();
       const __m128i v_ffff0000 = _mm_set1_epi32((int32_t)0xffff0000);
    -  __m128i forbidden_bytemask = _mm_setzero_si128();
     
       while (buf + 8 <= end) {
         __m128i in = _mm_loadu_si128((__m128i*)buf);
    @@ -26762,7 +30855,10 @@ std::pair sse_convert_utf32_to_utf16(const char32_t*
     
           const __m128i v_f800 = _mm_set1_epi16((uint16_t)0xf800);
           const __m128i v_d800 = _mm_set1_epi16((uint16_t)0xd800);
    -      forbidden_bytemask = _mm_or_si128(forbidden_bytemask, _mm_cmpeq_epi16(_mm_and_si128(utf16_packed, v_f800), v_d800));
    +      const __m128i forbidden_bytemask = _mm_cmpeq_epi16(_mm_and_si128(utf16_packed, v_f800), v_d800);
    +      if (static_cast(_mm_movemask_epi8(forbidden_bytemask)) != 0) {
    +        return std::make_pair(result(error_code::SURROGATE, buf - start), utf16_output);
    +      }
     
           if (big_endian) {
             const __m128i swap = _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14);
    @@ -26780,11 +30876,11 @@ std::pair sse_convert_utf32_to_utf16(const char32_t*
             uint32_t word = buf[k];
             if((word & 0xFFFF0000)==0) {
               // will not generate a surrogate pair
    -          if (word >= 0xD800 && word <= 0xDFFF) { return std::make_pair(nullptr, utf16_output); }
    +          if (word >= 0xD800 && word <= 0xDFFF) { return std::make_pair(result(error_code::SURROGATE, buf - start + k), utf16_output); }
               *utf16_output++ = big_endian ? char16_t((uint16_t(word) >> 8) | (uint16_t(word) << 8)) : char16_t(word);
             } else {
               // will generate a surrogate pair
    -          if (word > 0x10FFFF) { return std::make_pair(nullptr, utf16_output); }
    +          if (word > 0x10FFFF) { return std::make_pair(result(error_code::TOO_LARGE, buf - start + k), utf16_output); }
               word -= 0x10000;
               uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10));
               uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF));
    @@ -26800,187 +30896,507 @@ std::pair sse_convert_utf32_to_utf16(const char32_t*
         }
       }
     
    -  // check for invalid input
    -  if (static_cast(_mm_movemask_epi8(forbidden_bytemask)) != 0) { return std::make_pair(nullptr, utf16_output); }
    +  return std::make_pair(result(error_code::SUCCESS, buf - start), utf16_output);
    +}
    +/* end file src/westmere/sse_convert_utf32_to_utf16.cpp */
     
    -  return std::make_pair(buf, utf16_output);
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdutf
    +
    +/* begin file src/generic/buf_block_reader.h */
    +namespace simdutf {
    +namespace westmere {
    +namespace {
    +
    +// Walks through a buffer in block-sized increments, loading the last part with spaces
    +template
    +struct buf_block_reader {
    +public:
    +  simdutf_really_inline buf_block_reader(const uint8_t *_buf, size_t _len);
    +  simdutf_really_inline size_t block_index();
    +  simdutf_really_inline bool has_full_block() const;
    +  simdutf_really_inline const uint8_t *full_block() const;
    +  /**
    +   * Get the last block, padded with spaces.
    +   *
    +   * There will always be a last block, with at least 1 byte, unless len == 0 (in which case this
    +   * function fills the buffer with spaces and returns 0. In particular, if len == STEP_SIZE there
    +   * will be 0 full_blocks and 1 remainder block with STEP_SIZE bytes and no spaces for padding.
    +   *
    +   * @return the number of effective characters in the last block.
    +   */
    +  simdutf_really_inline size_t get_remainder(uint8_t *dst) const;
    +  simdutf_really_inline void advance();
    +private:
    +  const uint8_t *buf;
    +  const size_t len;
    +  const size_t lenminusstep;
    +  size_t idx;
    +};
    +
    +// Routines to print masks and text for debugging bitmask operations
    +simdutf_unused static char * format_input_text_64(const uint8_t *text) {
    +  static char *buf = reinterpret_cast(malloc(sizeof(simd8x64) + 1));
    +  for (size_t i=0; i); i++) {
    +    buf[i] = int8_t(text[i]) < ' ' ? '_' : int8_t(text[i]);
    +  }
    +  buf[sizeof(simd8x64)] = '\0';
    +  return buf;
     }
     
    +// Routines to print masks and text for debugging bitmask operations
    +simdutf_unused static char * format_input_text(const simd8x64& in) {
    +  static char *buf = reinterpret_cast(malloc(sizeof(simd8x64) + 1));
    +  in.store(reinterpret_cast(buf));
    +  for (size_t i=0; i); i++) {
    +    if (buf[i] < ' ') { buf[i] = '_'; }
    +  }
    +  buf[sizeof(simd8x64)] = '\0';
    +  return buf;
    +}
     
    -template 
    -std::pair sse_convert_utf32_to_utf16_with_errors(const char32_t* buf, size_t len, char16_t* utf16_output) {
    -  const char32_t* start = buf;
    -  const char32_t* end = buf + len;
    +simdutf_unused static char * format_mask(uint64_t mask) {
    +  static char *buf = reinterpret_cast(malloc(64 + 1));
    +  for (size_t i=0; i<64; i++) {
    +    buf[i] = (mask & (size_t(1) << i)) ? 'X' : ' ';
    +  }
    +  buf[64] = '\0';
    +  return buf;
    +}
     
    -  const __m128i v_0000 = _mm_setzero_si128();
    -  const __m128i v_ffff0000 = _mm_set1_epi32((int32_t)0xffff0000);
    +template
    +simdutf_really_inline buf_block_reader::buf_block_reader(const uint8_t *_buf, size_t _len) : buf{_buf}, len{_len}, lenminusstep{len < STEP_SIZE ? 0 : len - STEP_SIZE}, idx{0} {}
     
    -  while (buf + 8 <= end) {
    -    __m128i in = _mm_loadu_si128((__m128i*)buf);
    -    __m128i nextin = _mm_loadu_si128((__m128i*)buf+1);
    -    const __m128i saturation_bytemask = _mm_cmpeq_epi32(_mm_and_si128(_mm_or_si128(in, nextin), v_ffff0000), v_0000);
    -    const uint32_t saturation_bitmask = static_cast(_mm_movemask_epi8(saturation_bytemask));
    +template
    +simdutf_really_inline size_t buf_block_reader::block_index() { return idx; }
     
    -    // Check if no bits set above 16th
    -    if (saturation_bitmask == 0xffff) {
    -      // Pack UTF-32 to UTF-16
    -      __m128i utf16_packed = _mm_packus_epi32(in, nextin);
    +template
    +simdutf_really_inline bool buf_block_reader::has_full_block() const {
    +  return idx < lenminusstep;
    +}
    +
    +template
    +simdutf_really_inline const uint8_t *buf_block_reader::full_block() const {
    +  return &buf[idx];
    +}
    +
    +template
    +simdutf_really_inline size_t buf_block_reader::get_remainder(uint8_t *dst) const {
    +  if(len == idx) { return 0; } // memcpy(dst, null, 0) will trigger an error with some sanitizers
    +  std::memset(dst, 0x20, STEP_SIZE); // std::memset STEP_SIZE because it's more efficient to write out 8 or 16 bytes at once.
    +  std::memcpy(dst, buf + idx, len - idx);
    +  return len - idx;
    +}
    +
    +template
    +simdutf_really_inline void buf_block_reader::advance() {
    +  idx += STEP_SIZE;
    +}
    +
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdutf
    +/* end file src/generic/buf_block_reader.h */
    +/* begin file src/generic/utf8_validation/utf8_lookup4_algorithm.h */
    +namespace simdutf {
    +namespace westmere {
    +namespace {
    +namespace utf8_validation {
    +
    +using namespace simd;
    +
    +  simdutf_really_inline simd8 check_special_cases(const simd8 input, const simd8 prev1) {
    +// Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII)
    +// Bit 1 = Too Long (ASCII followed by continuation)
    +// Bit 2 = Overlong 3-byte
    +// Bit 4 = Surrogate
    +// Bit 5 = Overlong 2-byte
    +// Bit 7 = Two Continuations
    +    constexpr const uint8_t TOO_SHORT   = 1<<0; // 11______ 0_______
    +                                                // 11______ 11______
    +    constexpr const uint8_t TOO_LONG    = 1<<1; // 0_______ 10______
    +    constexpr const uint8_t OVERLONG_3  = 1<<2; // 11100000 100_____
    +    constexpr const uint8_t SURROGATE   = 1<<4; // 11101101 101_____
    +    constexpr const uint8_t OVERLONG_2  = 1<<5; // 1100000_ 10______
    +    constexpr const uint8_t TWO_CONTS   = 1<<7; // 10______ 10______
    +    constexpr const uint8_t TOO_LARGE   = 1<<3; // 11110100 1001____
    +                                                // 11110100 101_____
    +                                                // 11110101 1001____
    +                                                // 11110101 101_____
    +                                                // 1111011_ 1001____
    +                                                // 1111011_ 101_____
    +                                                // 11111___ 1001____
    +                                                // 11111___ 101_____
    +    constexpr const uint8_t TOO_LARGE_1000 = 1<<6;
    +                                                // 11110101 1000____
    +                                                // 1111011_ 1000____
    +                                                // 11111___ 1000____
    +    constexpr const uint8_t OVERLONG_4  = 1<<6; // 11110000 1000____
    +
    +    const simd8 byte_1_high = prev1.shr<4>().lookup_16(
    +      // 0_______ ________ 
    +      TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG,
    +      TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG,
    +      // 10______ ________ 
    +      TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS,
    +      // 1100____ ________ 
    +      TOO_SHORT | OVERLONG_2,
    +      // 1101____ ________ 
    +      TOO_SHORT,
    +      // 1110____ ________ 
    +      TOO_SHORT | OVERLONG_3 | SURROGATE,
    +      // 1111____ ________ 
    +      TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4
    +    );
    +    constexpr const uint8_t CARRY = TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 .
    +    const simd8 byte_1_low = (prev1 & 0x0F).lookup_16(
    +      // ____0000 ________
    +      CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4,
    +      // ____0001 ________
    +      CARRY | OVERLONG_2,
    +      // ____001_ ________
    +      CARRY,
    +      CARRY,
    +
    +      // ____0100 ________
    +      CARRY | TOO_LARGE,
    +      // ____0101 ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      // ____011_ ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +
    +      // ____1___ ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      // ____1101 ________
    +      CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      CARRY | TOO_LARGE | TOO_LARGE_1000
    +    );
    +    const simd8 byte_2_high = input.shr<4>().lookup_16(
    +      // ________ 0_______ 
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT,
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT,
    +
    +      // ________ 1000____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | OVERLONG_4,
    +      // ________ 1001____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE,
    +      // ________ 101_____
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE  | TOO_LARGE,
    +      TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE  | TOO_LARGE,
    +
    +      // ________ 11______
    +      TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT
    +    );
    +    return (byte_1_high & byte_1_low & byte_2_high);
    +  }
    +  simdutf_really_inline simd8 check_multibyte_lengths(const simd8 input,
    +      const simd8 prev_input, const simd8 sc) {
    +    simd8 prev2 = input.prev<2>(prev_input);
    +    simd8 prev3 = input.prev<3>(prev_input);
    +    simd8 must23 = simd8(must_be_2_3_continuation(prev2, prev3));
    +    simd8 must23_80 = must23 & uint8_t(0x80);
    +    return must23_80 ^ sc;
    +  }
    +
    +  //
    +  // Return nonzero if there are incomplete multibyte characters at the end of the block:
    +  // e.g. if there is a 4-byte character, but it's 3 bytes from the end.
    +  //
    +  simdutf_really_inline simd8 is_incomplete(const simd8 input) {
    +    // If the previous input's last 3 bytes match this, they're too short (they ended at EOF):
    +    // ... 1111____ 111_____ 11______
    +    static const uint8_t max_array[32] = {
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 255, 255, 255,
    +      255, 255, 255, 255, 255, 0b11110000u-1, 0b11100000u-1, 0b11000000u-1
    +    };
    +    const simd8 max_value(&max_array[sizeof(max_array)-sizeof(simd8)]);
    +    return input.gt_bits(max_value);
    +  }
     
    -      const __m128i v_f800 = _mm_set1_epi16((uint16_t)0xf800);
    -      const __m128i v_d800 = _mm_set1_epi16((uint16_t)0xd800);
    -      const __m128i forbidden_bytemask = _mm_cmpeq_epi16(_mm_and_si128(utf16_packed, v_f800), v_d800);
    -      if (static_cast(_mm_movemask_epi8(forbidden_bytemask)) != 0) {
    -        return std::make_pair(result(error_code::SURROGATE, buf - start), utf16_output);
    -      }
    +  struct utf8_checker {
    +    // If this is nonzero, there has been a UTF-8 error.
    +    simd8 error;
    +    // The last input we received
    +    simd8 prev_input_block;
    +    // Whether the last input we received was incomplete (used for ASCII fast path)
    +    simd8 prev_incomplete;
     
    -      if (big_endian) {
    -        const __m128i swap = _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14);
    -        utf16_packed = _mm_shuffle_epi8(utf16_packed, swap);
    -      }
    +    //
    +    // Check whether the current bytes are valid UTF-8.
    +    //
    +    simdutf_really_inline void check_utf8_bytes(const simd8 input, const simd8 prev_input) {
    +      // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ lead bytes
    +      // (2, 3, 4-byte leads become large positive numbers instead of small negative numbers)
    +      simd8 prev1 = input.prev<1>(prev_input);
    +      simd8 sc = check_special_cases(input, prev1);
    +      this->error |= check_multibyte_lengths(input, prev_input, sc);
    +    }
     
    -      _mm_storeu_si128((__m128i*)utf16_output, utf16_packed);
    -      utf16_output += 8;
    -      buf += 8;
    -    } else {
    -      size_t forward = 7;
    -      size_t k = 0;
    -      if(size_t(end - buf) < forward + 1) { forward = size_t(end - buf - 1);}
    -      for(; k < forward; k++) {
    -        uint32_t word = buf[k];
    -        if((word & 0xFFFF0000)==0) {
    -          // will not generate a surrogate pair
    -          if (word >= 0xD800 && word <= 0xDFFF) { return std::make_pair(result(error_code::SURROGATE, buf - start + k), utf16_output); }
    -          *utf16_output++ = big_endian ? char16_t((uint16_t(word) >> 8) | (uint16_t(word) << 8)) : char16_t(word);
    -        } else {
    -          // will generate a surrogate pair
    -          if (word > 0x10FFFF) { return std::make_pair(result(error_code::TOO_LARGE, buf - start + k), utf16_output); }
    -          word -= 0x10000;
    -          uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10));
    -          uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF));
    -          if (big_endian) {
    -            high_surrogate = uint16_t((high_surrogate >> 8) | (high_surrogate << 8));
    -            low_surrogate = uint16_t((low_surrogate >> 8) | (low_surrogate << 8));
    -          }
    -          *utf16_output++ = char16_t(high_surrogate);
    -          *utf16_output++ = char16_t(low_surrogate);
    +    // The only problem that can happen at EOF is that a multibyte character is too short
    +    // or a byte value too large in the last bytes: check_special_cases only checks for bytes
    +    // too large in the first of two bytes.
    +    simdutf_really_inline void check_eof() {
    +      // If the previous block had incomplete UTF-8 characters at the end, an ASCII block can't
    +      // possibly finish them.
    +      this->error |= this->prev_incomplete;
    +    }
    +
    +    simdutf_really_inline void check_next_input(const simd8x64& input) {
    +      if(simdutf_likely(is_ascii(input))) {
    +        this->error |= this->prev_incomplete;
    +      } else {
    +        // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    +        static_assert((simd8x64::NUM_CHUNKS == 2) || (simd8x64::NUM_CHUNKS == 4),
    +            "We support either two or four chunks per 64-byte block.");
    +        if(simd8x64::NUM_CHUNKS == 2) {
    +          this->check_utf8_bytes(input.chunks[0], this->prev_input_block);
    +          this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +        } else if(simd8x64::NUM_CHUNKS == 4) {
    +          this->check_utf8_bytes(input.chunks[0], this->prev_input_block);
    +          this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +          this->check_utf8_bytes(input.chunks[2], input.chunks[1]);
    +          this->check_utf8_bytes(input.chunks[3], input.chunks[2]);
             }
    +        this->prev_incomplete = is_incomplete(input.chunks[simd8x64::NUM_CHUNKS-1]);
    +        this->prev_input_block = input.chunks[simd8x64::NUM_CHUNKS-1];
    +
           }
    -      buf += k;
         }
    -  }
     
    -  return std::make_pair(result(error_code::SUCCESS, buf - start), utf16_output);
    -}
    -/* end file src/westmere/sse_convert_utf32_to_utf16.cpp */
    +    // do not forget to call check_eof!
    +    simdutf_really_inline bool errors() const {
    +      return this->error.any_bits_set_anywhere();
    +    }
    +
    +  }; // struct utf8_checker
    +} // namespace utf8_validation
    +
    +using utf8_validation::utf8_checker;
     
     } // unnamed namespace
     } // namespace westmere
     } // namespace simdutf
    -
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/buf_block_reader.h
    -/* begin file src/generic/buf_block_reader.h */
    +/* end file src/generic/utf8_validation/utf8_lookup4_algorithm.h */
    +/* begin file src/generic/utf8_validation/utf8_validator.h */
     namespace simdutf {
     namespace westmere {
     namespace {
    +namespace utf8_validation {
     
    -// Walks through a buffer in block-sized increments, loading the last part with spaces
    -template
    -struct buf_block_reader {
    -public:
    -  simdutf_really_inline buf_block_reader(const uint8_t *_buf, size_t _len);
    -  simdutf_really_inline size_t block_index();
    -  simdutf_really_inline bool has_full_block() const;
    -  simdutf_really_inline const uint8_t *full_block() const;
    -  /**
    -   * Get the last block, padded with spaces.
    -   *
    -   * There will always be a last block, with at least 1 byte, unless len == 0 (in which case this
    -   * function fills the buffer with spaces and returns 0. In particular, if len == STEP_SIZE there
    -   * will be 0 full_blocks and 1 remainder block with STEP_SIZE bytes and no spaces for padding.
    -   *
    -   * @return the number of effective characters in the last block.
    -   */
    -  simdutf_really_inline size_t get_remainder(uint8_t *dst) const;
    -  simdutf_really_inline void advance();
    -private:
    -  const uint8_t *buf;
    -  const size_t len;
    -  const size_t lenminusstep;
    -  size_t idx;
    -};
    -
    -// Routines to print masks and text for debugging bitmask operations
    -simdutf_unused static char * format_input_text_64(const uint8_t *text) {
    -  static char *buf = reinterpret_cast(malloc(sizeof(simd8x64) + 1));
    -  for (size_t i=0; i); i++) {
    -    buf[i] = int8_t(text[i]) < ' ' ? '_' : int8_t(text[i]);
    -  }
    -  buf[sizeof(simd8x64)] = '\0';
    -  return buf;
    +/**
    + * Validates that the string is actual UTF-8.
    + */
    +template
    +bool generic_validate_utf8(const uint8_t * input, size_t length) {
    +    checker c{};
    +    buf_block_reader<64> reader(input, length);
    +    while (reader.has_full_block()) {
    +      simd::simd8x64 in(reader.full_block());
    +      c.check_next_input(in);
    +      reader.advance();
    +    }
    +    uint8_t block[64]{};
    +    reader.get_remainder(block);
    +    simd::simd8x64 in(block);
    +    c.check_next_input(in);
    +    reader.advance();
    +    c.check_eof();
    +    return !c.errors();
     }
     
    -// Routines to print masks and text for debugging bitmask operations
    -simdutf_unused static char * format_input_text(const simd8x64& in) {
    -  static char *buf = reinterpret_cast(malloc(sizeof(simd8x64) + 1));
    -  in.store(reinterpret_cast(buf));
    -  for (size_t i=0; i); i++) {
    -    if (buf[i] < ' ') { buf[i] = '_'; }
    -  }
    -  buf[sizeof(simd8x64)] = '\0';
    -  return buf;
    +bool generic_validate_utf8(const char * input, size_t length) {
    +  return generic_validate_utf8(reinterpret_cast(input),length);
     }
     
    -simdutf_unused static char * format_mask(uint64_t mask) {
    -  static char *buf = reinterpret_cast(malloc(64 + 1));
    -  for (size_t i=0; i<64; i++) {
    -    buf[i] = (mask & (size_t(1) << i)) ? 'X' : ' ';
    -  }
    -  buf[64] = '\0';
    -  return buf;
    +/**
    + * Validates that the string is actual UTF-8 and stops on errors.
    + */
    +template
    +result generic_validate_utf8_with_errors(const uint8_t * input, size_t length) {
    +    checker c{};
    +    buf_block_reader<64> reader(input, length);
    +    size_t count{0};
    +    while (reader.has_full_block()) {
    +      simd::simd8x64 in(reader.full_block());
    +      c.check_next_input(in);
    +      if(c.errors()) {
    +        if (count != 0) { count--; } // Sometimes the error is only detected in the next chunk
    +        result res = scalar::utf8::rewind_and_validate_with_errors(reinterpret_cast(input), reinterpret_cast(input + count), length - count);
    +        res.count += count;
    +        return res;
    +      }
    +      reader.advance();
    +      count += 64;
    +    }
    +    uint8_t block[64]{};
    +    reader.get_remainder(block);
    +    simd::simd8x64 in(block);
    +    c.check_next_input(in);
    +    reader.advance();
    +    c.check_eof();
    +    if (c.errors()) {
    +      if (count != 0) { count--; } // Sometimes the error is only detected in the next chunk
    +      result res = scalar::utf8::rewind_and_validate_with_errors(reinterpret_cast(input), reinterpret_cast(input) + count, length - count);
    +      res.count += count;
    +      return res;
    +    } else {
    +      return result(error_code::SUCCESS, length);
    +    }
     }
     
    -template
    -simdutf_really_inline buf_block_reader::buf_block_reader(const uint8_t *_buf, size_t _len) : buf{_buf}, len{_len}, lenminusstep{len < STEP_SIZE ? 0 : len - STEP_SIZE}, idx{0} {}
    +result generic_validate_utf8_with_errors(const char * input, size_t length) {
    +  return generic_validate_utf8_with_errors(reinterpret_cast(input),length);
    +}
     
    -template
    -simdutf_really_inline size_t buf_block_reader::block_index() { return idx; }
    +template
    +bool generic_validate_ascii(const uint8_t * input, size_t length) {
    +    buf_block_reader<64> reader(input, length);
    +    uint8_t blocks[64]{};
    +    simd::simd8x64 running_or(blocks);
    +    while (reader.has_full_block()) {
    +      simd::simd8x64 in(reader.full_block());
    +      running_or |= in;
    +      reader.advance();
    +    }
    +    uint8_t block[64]{};
    +    reader.get_remainder(block);
    +    simd::simd8x64 in(block);
    +    running_or |= in;
    +    return running_or.is_ascii();
    +}
     
    -template
    -simdutf_really_inline bool buf_block_reader::has_full_block() const {
    -  return idx < lenminusstep;
    +bool generic_validate_ascii(const char * input, size_t length) {
    +  return generic_validate_ascii(reinterpret_cast(input),length);
     }
     
    -template
    -simdutf_really_inline const uint8_t *buf_block_reader::full_block() const {
    -  return &buf[idx];
    +template
    +result generic_validate_ascii_with_errors(const uint8_t * input, size_t length) {
    +  buf_block_reader<64> reader(input, length);
    +  size_t count{0};
    +  while (reader.has_full_block()) {
    +    simd::simd8x64 in(reader.full_block());
    +    if (!in.is_ascii()) {
    +      result res = scalar::ascii::validate_with_errors(reinterpret_cast(input + count), length - count);
    +      return result(res.error, count + res.count);
    +    }
    +    reader.advance();
    +
    +    count += 64;
    +  }
    +  uint8_t block[64]{};
    +  reader.get_remainder(block);
    +  simd::simd8x64 in(block);
    +  if (!in.is_ascii()) {
    +    result res = scalar::ascii::validate_with_errors(reinterpret_cast(input + count), length - count);
    +    return result(res.error, count + res.count);
    +  } else {
    +    return result(error_code::SUCCESS, length);
    +  }
     }
     
    -template
    -simdutf_really_inline size_t buf_block_reader::get_remainder(uint8_t *dst) const {
    -  if(len == idx) { return 0; } // memcpy(dst, null, 0) will trigger an error with some sanitizers
    -  std::memset(dst, 0x20, STEP_SIZE); // std::memset STEP_SIZE because it's more efficient to write out 8 or 16 bytes at once.
    -  std::memcpy(dst, buf + idx, len - idx);
    -  return len - idx;
    +result generic_validate_ascii_with_errors(const char * input, size_t length) {
    +  return generic_validate_ascii_with_errors(reinterpret_cast(input),length);
     }
     
    -template
    -simdutf_really_inline void buf_block_reader::advance() {
    -  idx += STEP_SIZE;
    +} // namespace utf8_validation
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdutf
    +/* end file src/generic/utf8_validation/utf8_validator.h */
    +// transcoding from UTF-8 to UTF-16
    +/* begin file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */
    +
    +
    +namespace simdutf {
    +namespace westmere {
    +namespace {
    +namespace utf8_to_utf16 {
    +
    +using namespace simd;
    +
    +template 
    +simdutf_warn_unused size_t convert_valid(const char* input, size_t size,
    +    char16_t* utf16_output) noexcept {
    +  // The implementation is not specific to haswell and should be moved to the generic directory.
    +  size_t pos = 0;
    +  char16_t* start{utf16_output};
    +  const size_t safety_margin = 16; // to avoid overruns!
    +  while(pos + 64 + safety_margin <= size) {
    +    // this loop could be unrolled further. For example, we could process the mask
    +    // far more than 64 bytes.
    +    simd8x64 in(reinterpret_cast(input + pos));
    +    if(in.is_ascii()) {
    +      in.store_ascii_as_utf16(utf16_output);
    +      utf16_output += 64;
    +      pos += 64;
    +    } else {
    +      // Slow path. We hope that the compiler will recognize that this is a slow path.
    +      // Anything that is not a continuation mask is a 'leading byte', that is, the
    +      // start of a new code point.
    +      uint64_t utf8_continuation_mask = in.lt(-65 + 1);
    +      // -65 is 0b10111111 in two-complement's, so largest possible continuation byte
    +      uint64_t utf8_leading_mask = ~utf8_continuation_mask;
    +      // The *start* of code points is not so useful, rather, we want the *end* of code points.
    +      uint64_t utf8_end_of_code_point_mask = utf8_leading_mask>>1;
    +      // We process in blocks of up to 12 bytes except possibly
    +      // for fast paths which may process up to 16 bytes. For the
    +      // slow path to work, we should have at least 12 input bytes left.
    +      size_t max_starting_point = (pos + 64) - 12;
    +      // Next loop is going to run at least five times when using solely
    +      // the slow/regular path, and at least four times if there are fast paths.
    +      while(pos < max_starting_point) {
    +        // Performance note: our ability to compute 'consumed' and
    +        // then shift and recompute is critical. If there is a
    +        // latency of, say, 4 cycles on getting 'consumed', then
    +        // the inner loop might have a total latency of about 6 cycles.
    +        // Yet we process between 6 to 12 inputs bytes, thus we get
    +        // a speed limit between 1 cycle/byte and 0.5 cycle/byte
    +        // for this section of the code. Hence, there is a limit
    +        // to how much we can further increase this latency before
    +        // it seriously harms performance.
    +        //
    +        // Thus we may allow convert_masked_utf8_to_utf16 to process
    +        // more bytes at a time under a fast-path mode where 16 bytes
    +        // are consumed at once (e.g., when encountering ASCII).
    +        size_t consumed = convert_masked_utf8_to_utf16(input + pos,
    +                            utf8_end_of_code_point_mask, utf16_output);
    +        pos += consumed;
    +        utf8_end_of_code_point_mask >>= consumed;
    +      }
    +      // At this point there may remain between 0 and 12 bytes in the
    +      // 64-byte block. These bytes will be processed again. So we have an
    +      // 80% efficiency (in the worst case). In practice we expect an
    +      // 85% to 90% efficiency.
    +    }
    +  }
    +  utf16_output += scalar::utf8_to_utf16::convert_valid(input + pos, size - pos, utf16_output);
    +  return utf16_output - start;
     }
     
    +} // namespace utf8_to_utf16
     } // unnamed namespace
     } // namespace westmere
     } // namespace simdutf
    -/* end file src/generic/buf_block_reader.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_validation/utf8_lookup4_algorithm.h
    -/* begin file src/generic/utf8_validation/utf8_lookup4_algorithm.h */
    +/* end file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */
    +/* begin file src/generic/utf8_to_utf16/utf8_to_utf16.h */
    +
    +
     namespace simdutf {
     namespace westmere {
     namespace {
    -namespace utf8_validation {
    -
    +namespace utf8_to_utf16 {
     using namespace simd;
     
    +
       simdutf_really_inline simd8 check_special_cases(const simd8 input, const simd8 prev1) {
     // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII)
     // Bit 1 = Too Long (ASCII followed by continuation)
    @@ -27080,31 +31496,12 @@ using namespace simd;
         return must23_80 ^ sc;
       }
     
    -  //
    -  // Return nonzero if there are incomplete multibyte characters at the end of the block:
    -  // e.g. if there is a 4-byte character, but it's 3 bytes from the end.
    -  //
    -  simdutf_really_inline simd8 is_incomplete(const simd8 input) {
    -    // If the previous input's last 3 bytes match this, they're too short (they ended at EOF):
    -    // ... 1111____ 111_____ 11______
    -    static const uint8_t max_array[32] = {
    -      255, 255, 255, 255, 255, 255, 255, 255,
    -      255, 255, 255, 255, 255, 255, 255, 255,
    -      255, 255, 255, 255, 255, 255, 255, 255,
    -      255, 255, 255, 255, 255, 0b11110000u-1, 0b11100000u-1, 0b11000000u-1
    -    };
    -    const simd8 max_value(&max_array[sizeof(max_array)-sizeof(simd8)]);
    -    return input.gt_bits(max_value);
    -  }
     
    -  struct utf8_checker {
    +  struct validating_transcoder {
         // If this is nonzero, there has been a UTF-8 error.
         simd8 error;
    -    // The last input we received
    -    simd8 prev_input_block;
    -    // Whether the last input we received was incomplete (used for ASCII fast path)
    -    simd8 prev_incomplete;
     
    +    validating_transcoder() : error(uint8_t(0)) {}
         //
         // Check whether the current bytes are valid UTF-8.
         //
    @@ -27116,262 +31513,239 @@ using namespace simd;
           this->error |= check_multibyte_lengths(input, prev_input, sc);
         }
     
    -    // The only problem that can happen at EOF is that a multibyte character is too short
    -    // or a byte value too large in the last bytes: check_special_cases only checks for bytes
    -    // too large in the first of two bytes.
    -    simdutf_really_inline void check_eof() {
    -      // If the previous block had incomplete UTF-8 characters at the end, an ASCII block can't
    -      // possibly finish them.
    -      this->error |= this->prev_incomplete;
    +
    +    template 
    +    simdutf_really_inline size_t convert(const char* in, size_t size, char16_t* utf16_output) {
    +      size_t pos = 0;
    +      char16_t* start{utf16_output};
    +      // In the worst case, we have the haswell kernel which can cause an overflow of
    +      // 8 bytes when calling convert_masked_utf8_to_utf16. If you skip the last 16 bytes,
    +      // and if the data is valid, then it is entirely safe because 16 UTF-8 bytes generate
    +      // much more than 8 bytes. However, you cannot generally assume that you have valid
    +      // UTF-8 input, so we are going to go back from the end counting 8 leading bytes,
    +      // to give us a good margin.
    +      size_t leading_byte = 0;
    +      size_t margin = size;
    +      for(; margin > 0 && leading_byte < 8; margin--) {
    +        leading_byte += (int8_t(in[margin-1]) > -65);
    +      }
    +      // If the input is long enough, then we have that margin-1 is the eight last leading byte.
    +      const size_t safety_margin = size - margin + 1; // to avoid overruns!
    +      while(pos + 64 + safety_margin <= size) {
    +        simd8x64 input(reinterpret_cast(in + pos));
    +        if(input.is_ascii()) {
    +          input.store_ascii_as_utf16(utf16_output);
    +          utf16_output += 64;
    +          pos += 64;
    +        } else {
    +          // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    +          static_assert((simd8x64::NUM_CHUNKS == 2) || (simd8x64::NUM_CHUNKS == 4),
    +              "We support either two or four chunks per 64-byte block.");
    +          auto zero = simd8{uint8_t(0)};
    +          if(simd8x64::NUM_CHUNKS == 2) {
    +            this->check_utf8_bytes(input.chunks[0], zero);
    +            this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +          } else if(simd8x64::NUM_CHUNKS == 4) {
    +            this->check_utf8_bytes(input.chunks[0], zero);
    +            this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +            this->check_utf8_bytes(input.chunks[2], input.chunks[1]);
    +            this->check_utf8_bytes(input.chunks[3], input.chunks[2]);
    +          }
    +          uint64_t utf8_continuation_mask = input.lt(-65 + 1);
    +          uint64_t utf8_leading_mask = ~utf8_continuation_mask;
    +          uint64_t utf8_end_of_code_point_mask = utf8_leading_mask>>1;
    +          // We process in blocks of up to 12 bytes except possibly
    +          // for fast paths which may process up to 16 bytes. For the
    +          // slow path to work, we should have at least 12 input bytes left.
    +          size_t max_starting_point = (pos + 64) - 12;
    +          // Next loop is going to run at least five times.
    +          while(pos < max_starting_point) {
    +            // Performance note: our ability to compute 'consumed' and
    +            // then shift and recompute is critical. If there is a
    +            // latency of, say, 4 cycles on getting 'consumed', then
    +            // the inner loop might have a total latency of about 6 cycles.
    +            // Yet we process between 6 to 12 inputs bytes, thus we get
    +            // a speed limit between 1 cycle/byte and 0.5 cycle/byte
    +            // for this section of the code. Hence, there is a limit
    +            // to how much we can further increase this latency before
    +            // it seriously harms performance.
    +            size_t consumed = convert_masked_utf8_to_utf16(in + pos,
    +                            utf8_end_of_code_point_mask, utf16_output);
    +            pos += consumed;
    +            utf8_end_of_code_point_mask >>= consumed;
    +          }
    +          // At this point there may remain between 0 and 12 bytes in the
    +          // 64-byte block. These bytes will be processed again. So we have an
    +          // 80% efficiency (in the worst case). In practice we expect an
    +          // 85% to 90% efficiency.
    +        }
    +      }
    +      if(errors()) { return 0; }
    +      if(pos < size) {
    +        size_t howmany  = scalar::utf8_to_utf16::convert(in + pos, size - pos, utf16_output);
    +        if(howmany == 0) { return 0; }
    +        utf16_output += howmany;
    +      }
    +      return utf16_output - start;
         }
     
    -    simdutf_really_inline void check_next_input(const simd8x64& input) {
    -      if(simdutf_likely(is_ascii(input))) {
    -        this->error |= this->prev_incomplete;
    -      } else {
    -        // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    -        static_assert((simd8x64::NUM_CHUNKS == 2) || (simd8x64::NUM_CHUNKS == 4),
    -            "We support either two or four chunks per 64-byte block.");
    -        if(simd8x64::NUM_CHUNKS == 2) {
    -          this->check_utf8_bytes(input.chunks[0], this->prev_input_block);
    -          this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    -        } else if(simd8x64::NUM_CHUNKS == 4) {
    -          this->check_utf8_bytes(input.chunks[0], this->prev_input_block);
    -          this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    -          this->check_utf8_bytes(input.chunks[2], input.chunks[1]);
    -          this->check_utf8_bytes(input.chunks[3], input.chunks[2]);
    +    template 
    +    simdutf_really_inline result convert_with_errors(const char* in, size_t size, char16_t* utf16_output) {
    +      size_t pos = 0;
    +      char16_t* start{utf16_output};
    +      // In the worst case, we have the haswell kernel which can cause an overflow of
    +      // 8 bytes when calling convert_masked_utf8_to_utf16. If you skip the last 16 bytes,
    +      // and if the data is valid, then it is entirely safe because 16 UTF-8 bytes generate
    +      // much more than 8 bytes. However, you cannot generally assume that you have valid
    +      // UTF-8 input, so we are going to go back from the end counting 8 leading bytes,
    +      // to give us a good margin.
    +      size_t leading_byte = 0;
    +      size_t margin = size;
    +      for(; margin > 0 && leading_byte < 8; margin--) {
    +        leading_byte += (int8_t(in[margin-1]) > -65);
    +      }
    +      // If the input is long enough, then we have that margin-1 is the eight last leading byte.
    +      const size_t safety_margin = size - margin + 1; // to avoid overruns!
    +      while(pos + 64 + safety_margin <= size) {
    +        simd8x64 input(reinterpret_cast(in + pos));
    +        if(input.is_ascii()) {
    +          input.store_ascii_as_utf16(utf16_output);
    +          utf16_output += 64;
    +          pos += 64;
    +        } else {
    +          // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    +          static_assert((simd8x64::NUM_CHUNKS == 2) || (simd8x64::NUM_CHUNKS == 4),
    +              "We support either two or four chunks per 64-byte block.");
    +          auto zero = simd8{uint8_t(0)};
    +          if(simd8x64::NUM_CHUNKS == 2) {
    +            this->check_utf8_bytes(input.chunks[0], zero);
    +            this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +          } else if(simd8x64::NUM_CHUNKS == 4) {
    +            this->check_utf8_bytes(input.chunks[0], zero);
    +            this->check_utf8_bytes(input.chunks[1], input.chunks[0]);
    +            this->check_utf8_bytes(input.chunks[2], input.chunks[1]);
    +            this->check_utf8_bytes(input.chunks[3], input.chunks[2]);
    +          }
    +          if (errors()) {
    +            // rewind_and_convert_with_errors will seek a potential error from in+pos onward,
    +            // with the ability to go back up to pos bytes, and read size-pos bytes forward.
    +            result res = scalar::utf8_to_utf16::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf16_output);
    +            res.count += pos;
    +            return res;
    +          }
    +          uint64_t utf8_continuation_mask = input.lt(-65 + 1);
    +          uint64_t utf8_leading_mask = ~utf8_continuation_mask;
    +          uint64_t utf8_end_of_code_point_mask = utf8_leading_mask>>1;
    +          // We process in blocks of up to 12 bytes except possibly
    +          // for fast paths which may process up to 16 bytes. For the
    +          // slow path to work, we should have at least 12 input bytes left.
    +          size_t max_starting_point = (pos + 64) - 12;
    +          // Next loop is going to run at least five times.
    +          while(pos < max_starting_point) {
    +            // Performance note: our ability to compute 'consumed' and
    +            // then shift and recompute is critical. If there is a
    +            // latency of, say, 4 cycles on getting 'consumed', then
    +            // the inner loop might have a total latency of about 6 cycles.
    +            // Yet we process between 6 to 12 inputs bytes, thus we get
    +            // a speed limit between 1 cycle/byte and 0.5 cycle/byte
    +            // for this section of the code. Hence, there is a limit
    +            // to how much we can further increase this latency before
    +            // it seriously harms performance.
    +            size_t consumed = convert_masked_utf8_to_utf16(in + pos,
    +                            utf8_end_of_code_point_mask, utf16_output);
    +            pos += consumed;
    +            utf8_end_of_code_point_mask >>= consumed;
    +          }
    +          // At this point there may remain between 0 and 12 bytes in the
    +          // 64-byte block. These bytes will be processed again. So we have an
    +          // 80% efficiency (in the worst case). In practice we expect an
    +          // 85% to 90% efficiency.
    +        }
    +      }
    +      if(errors()) {
    +        // rewind_and_convert_with_errors will seek a potential error from in+pos onward,
    +        // with the ability to go back up to pos bytes, and read size-pos bytes forward.
    +        result res = scalar::utf8_to_utf16::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf16_output);
    +        res.count += pos;
    +        return res;
    +      }
    +      if(pos < size) {
    +        // rewind_and_convert_with_errors will seek a potential error from in+pos onward,
    +        // with the ability to go back up to pos bytes, and read size-pos bytes forward.
    +        result res = scalar::utf8_to_utf16::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf16_output);
    +        if (res.error) {    // In case of error, we want the error position
    +          res.count += pos;
    +          return res;
    +        } else {    // In case of success, we want the number of word written
    +          utf16_output += res.count;
             }
    -        this->prev_incomplete = is_incomplete(input.chunks[simd8x64::NUM_CHUNKS-1]);
    -        this->prev_input_block = input.chunks[simd8x64::NUM_CHUNKS-1];
    -
           }
    +      return result(error_code::SUCCESS, utf16_output - start);
         }
     
    -    // do not forget to call check_eof!
         simdutf_really_inline bool errors() const {
           return this->error.any_bits_set_anywhere();
         }
     
       }; // struct utf8_checker
    -} // namespace utf8_validation
    -
    -using utf8_validation::utf8_checker;
    -
    -} // unnamed namespace
    -} // namespace westmere
    -} // namespace simdutf
    -/* end file src/generic/utf8_validation/utf8_lookup4_algorithm.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_validation/utf8_validator.h
    -/* begin file src/generic/utf8_validation/utf8_validator.h */
    -namespace simdutf {
    -namespace westmere {
    -namespace {
    -namespace utf8_validation {
    -
    -/**
    - * Validates that the string is actual UTF-8.
    - */
    -template
    -bool generic_validate_utf8(const uint8_t * input, size_t length) {
    -    checker c{};
    -    buf_block_reader<64> reader(input, length);
    -    while (reader.has_full_block()) {
    -      simd::simd8x64 in(reader.full_block());
    -      c.check_next_input(in);
    -      reader.advance();
    -    }
    -    uint8_t block[64]{};
    -    reader.get_remainder(block);
    -    simd::simd8x64 in(block);
    -    c.check_next_input(in);
    -    reader.advance();
    -    c.check_eof();
    -    return !c.errors();
    -}
    -
    -bool generic_validate_utf8(const char * input, size_t length) {
    -  return generic_validate_utf8(reinterpret_cast(input),length);
    -}
    -
    -/**
    - * Validates that the string is actual UTF-8 and stops on errors.
    - */
    -template
    -result generic_validate_utf8_with_errors(const uint8_t * input, size_t length) {
    -    checker c{};
    -    buf_block_reader<64> reader(input, length);
    -    size_t count{0};
    -    while (reader.has_full_block()) {
    -      simd::simd8x64 in(reader.full_block());
    -      c.check_next_input(in);
    -      if(c.errors()) {
    -        if (count != 0) { count--; } // Sometimes the error is only detected in the next chunk
    -        result res = scalar::utf8::rewind_and_validate_with_errors(reinterpret_cast(input), reinterpret_cast(input + count), length - count);
    -        res.count += count;
    -        return res;
    -      }
    -      reader.advance();
    -      count += 64;
    -    }
    -    uint8_t block[64]{};
    -    reader.get_remainder(block);
    -    simd::simd8x64 in(block);
    -    c.check_next_input(in);
    -    reader.advance();
    -    c.check_eof();
    -    if (c.errors()) {
    -      if (count != 0) { count--; } // Sometimes the error is only detected in the next chunk
    -      result res = scalar::utf8::rewind_and_validate_with_errors(reinterpret_cast(input), reinterpret_cast(input) + count, length - count);
    -      res.count += count;
    -      return res;
    -    } else {
    -      return result(error_code::SUCCESS, length);
    -    }
    -}
    -
    -result generic_validate_utf8_with_errors(const char * input, size_t length) {
    -  return generic_validate_utf8_with_errors(reinterpret_cast(input),length);
    -}
    -
    -template
    -bool generic_validate_ascii(const uint8_t * input, size_t length) {
    -    buf_block_reader<64> reader(input, length);
    -    uint8_t blocks[64]{};
    -    simd::simd8x64 running_or(blocks);
    -    while (reader.has_full_block()) {
    -      simd::simd8x64 in(reader.full_block());
    -      running_or |= in;
    -      reader.advance();
    -    }
    -    uint8_t block[64]{};
    -    reader.get_remainder(block);
    -    simd::simd8x64 in(block);
    -    running_or |= in;
    -    return running_or.is_ascii();
    -}
    -
    -bool generic_validate_ascii(const char * input, size_t length) {
    -  return generic_validate_ascii(reinterpret_cast(input),length);
    -}
    -
    -template
    -result generic_validate_ascii_with_errors(const uint8_t * input, size_t length) {
    -  buf_block_reader<64> reader(input, length);
    -  size_t count{0};
    -  while (reader.has_full_block()) {
    -    simd::simd8x64 in(reader.full_block());
    -    if (!in.is_ascii()) {
    -      result res = scalar::ascii::validate_with_errors(reinterpret_cast(input + count), length - count);
    -      return result(res.error, count + res.count);
    -    }
    -    reader.advance();
    -
    -    count += 64;
    -  }
    -  uint8_t block[64]{};
    -  reader.get_remainder(block);
    -  simd::simd8x64 in(block);
    -  if (!in.is_ascii()) {
    -    result res = scalar::ascii::validate_with_errors(reinterpret_cast(input + count), length - count);
    -    return result(res.error, count + res.count);
    -  } else {
    -    return result(error_code::SUCCESS, length);
    -  }
    -}
    -
    -result generic_validate_ascii_with_errors(const char * input, size_t length) {
    -  return generic_validate_ascii_with_errors(reinterpret_cast(input),length);
    -}
    -
    -} // namespace utf8_validation
    +} // utf8_to_utf16 namespace
     } // unnamed namespace
     } // namespace westmere
     } // namespace simdutf
    -/* end file src/generic/utf8_validation/utf8_validator.h */
    -// transcoding from UTF-8 to UTF-16
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_to_utf16/valid_utf8_to_utf16.h
    -/* begin file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */
    -
    +/* end file src/generic/utf8_to_utf16/utf8_to_utf16.h */
    +// transcoding from UTF-8 to UTF-32
    +/* begin file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */
     
     namespace simdutf {
     namespace westmere {
     namespace {
    -namespace utf8_to_utf16 {
    +namespace utf8_to_utf32 {
     
     using namespace simd;
     
    -template 
    +
     simdutf_warn_unused size_t convert_valid(const char* input, size_t size,
    -    char16_t* utf16_output) noexcept {
    -  // The implementation is not specific to haswell and should be moved to the generic directory.
    +    char32_t* utf32_output) noexcept {
       size_t pos = 0;
    -  char16_t* start{utf16_output};
    +  char32_t* start{utf32_output};
       const size_t safety_margin = 16; // to avoid overruns!
       while(pos + 64 + safety_margin <= size) {
    -    // this loop could be unrolled further. For example, we could process the mask
    -    // far more than 64 bytes.
         simd8x64 in(reinterpret_cast(input + pos));
         if(in.is_ascii()) {
    -      in.store_ascii_as_utf16(utf16_output);
    -      utf16_output += 64;
    +      in.store_ascii_as_utf32(utf32_output);
    +      utf32_output += 64;
           pos += 64;
         } else {
    -      // Slow path. We hope that the compiler will recognize that this is a slow path.
    -      // Anything that is not a continuation mask is a 'leading byte', that is, the
    -      // start of a new code point.
    -      uint64_t utf8_continuation_mask = in.lt(-65 + 1);
    -      // -65 is 0b10111111 in two-complement's, so largest possible continuation byte
    -      uint64_t utf8_leading_mask = ~utf8_continuation_mask;
    -      // The *start* of code points is not so useful, rather, we want the *end* of code points.
    -      uint64_t utf8_end_of_code_point_mask = utf8_leading_mask>>1;
    -      // We process in blocks of up to 12 bytes except possibly
    -      // for fast paths which may process up to 16 bytes. For the
    -      // slow path to work, we should have at least 12 input bytes left.
    -      size_t max_starting_point = (pos + 64) - 12;
    -      // Next loop is going to run at least five times when using solely
    -      // the slow/regular path, and at least four times if there are fast paths.
    -      while(pos < max_starting_point) {
    -        // Performance note: our ability to compute 'consumed' and
    -        // then shift and recompute is critical. If there is a
    -        // latency of, say, 4 cycles on getting 'consumed', then
    -        // the inner loop might have a total latency of about 6 cycles.
    -        // Yet we process between 6 to 12 inputs bytes, thus we get
    -        // a speed limit between 1 cycle/byte and 0.5 cycle/byte
    -        // for this section of the code. Hence, there is a limit
    -        // to how much we can further increase this latency before
    -        // it seriously harms performance.
    -        //
    -        // Thus we may allow convert_masked_utf8_to_utf16 to process
    -        // more bytes at a time under a fast-path mode where 16 bytes
    -        // are consumed at once (e.g., when encountering ASCII).
    -        size_t consumed = convert_masked_utf8_to_utf16(input + pos,
    -                            utf8_end_of_code_point_mask, utf16_output);
    -        pos += consumed;
    -        utf8_end_of_code_point_mask >>= consumed;
    +    // -65 is 0b10111111 in two-complement's, so largest possible continuation byte
    +    uint64_t utf8_continuation_mask = in.lt(-65 + 1);
    +    uint64_t utf8_leading_mask = ~utf8_continuation_mask;
    +    uint64_t utf8_end_of_code_point_mask = utf8_leading_mask>>1;
    +    size_t max_starting_point = (pos + 64) - 12;
    +    while(pos < max_starting_point) {
    +      size_t consumed = convert_masked_utf8_to_utf32(input + pos,
    +                          utf8_end_of_code_point_mask, utf32_output);
    +      pos += consumed;
    +      utf8_end_of_code_point_mask >>= consumed;
           }
    -      // At this point there may remain between 0 and 12 bytes in the
    -      // 64-byte block. These bytes will be processed again. So we have an
    -      // 80% efficiency (in the worst case). In practice we expect an
    -      // 85% to 90% efficiency.
         }
       }
    -  utf16_output += scalar::utf8_to_utf16::convert_valid(input + pos, size - pos, utf16_output);
    -  return utf16_output - start;
    +  utf32_output += scalar::utf8_to_utf32::convert_valid(input + pos, size - pos, utf32_output);
    +  return utf32_output - start;
     }
     
    -} // namespace utf8_to_utf16
    +
    +} // namespace utf8_to_utf32
     } // unnamed namespace
     } // namespace westmere
     } // namespace simdutf
    -/* end file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_to_utf16/utf8_to_utf16.h
    -/* begin file src/generic/utf8_to_utf16/utf8_to_utf16.h */
    +/* end file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */
    +/* begin file src/generic/utf8_to_utf32/utf8_to_utf32.h */
     
     
     namespace simdutf {
     namespace westmere {
     namespace {
    -namespace utf8_to_utf16 {
    +namespace utf8_to_utf32 {
     using namespace simd;
     
     
    @@ -27492,28 +31866,28 @@ using namespace simd;
         }
     
     
    -    template 
    -    simdutf_really_inline size_t convert(const char* in, size_t size, char16_t* utf16_output) {
    +
    +    simdutf_really_inline size_t convert(const char* in, size_t size, char32_t* utf32_output) {
           size_t pos = 0;
    -      char16_t* start{utf16_output};
    +      char32_t* start{utf32_output};
           // In the worst case, we have the haswell kernel which can cause an overflow of
    -      // 8 bytes when calling convert_masked_utf8_to_utf16. If you skip the last 16 bytes,
    +      // 8 bytes when calling convert_masked_utf8_to_utf32. If you skip the last 16 bytes,
           // and if the data is valid, then it is entirely safe because 16 UTF-8 bytes generate
           // much more than 8 bytes. However, you cannot generally assume that you have valid
    -      // UTF-8 input, so we are going to go back from the end counting 8 leading bytes,
    +      // UTF-8 input, so we are going to go back from the end counting 4 leading bytes,
           // to give us a good margin.
           size_t leading_byte = 0;
           size_t margin = size;
    -      for(; margin > 0 && leading_byte < 8; margin--) {
    +      for(; margin > 0 && leading_byte < 4; margin--) {
             leading_byte += (int8_t(in[margin-1]) > -65);
           }
    -      // If the input is long enough, then we have that margin-1 is the eight last leading byte.
    +      // If the input is long enough, then we have that margin-1 is the fourth last leading byte.
           const size_t safety_margin = size - margin + 1; // to avoid overruns!
           while(pos + 64 + safety_margin <= size) {
             simd8x64 input(reinterpret_cast(in + pos));
             if(input.is_ascii()) {
    -          input.store_ascii_as_utf16(utf16_output);
    -          utf16_output += 64;
    +          input.store_ascii_as_utf32(utf32_output);
    +          utf32_output += 64;
               pos += 64;
             } else {
               // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    @@ -27547,8 +31921,8 @@ using namespace simd;
                 // for this section of the code. Hence, there is a limit
                 // to how much we can further increase this latency before
                 // it seriously harms performance.
    -            size_t consumed = convert_masked_utf8_to_utf16(in + pos,
    -                            utf8_end_of_code_point_mask, utf16_output);
    +            size_t consumed = convert_masked_utf8_to_utf32(in + pos,
    +                            utf8_end_of_code_point_mask, utf32_output);
                 pos += consumed;
                 utf8_end_of_code_point_mask >>= consumed;
               }
    @@ -27560,35 +31934,34 @@ using namespace simd;
           }
           if(errors()) { return 0; }
           if(pos < size) {
    -        size_t howmany  = scalar::utf8_to_utf16::convert(in + pos, size - pos, utf16_output);
    +        size_t howmany  = scalar::utf8_to_utf32::convert(in + pos, size - pos, utf32_output);
             if(howmany == 0) { return 0; }
    -        utf16_output += howmany;
    +        utf32_output += howmany;
           }
    -      return utf16_output - start;
    +      return utf32_output - start;
         }
     
    -    template 
    -    simdutf_really_inline result convert_with_errors(const char* in, size_t size, char16_t* utf16_output) {
    +    simdutf_really_inline result convert_with_errors(const char* in, size_t size, char32_t* utf32_output) {
           size_t pos = 0;
    -      char16_t* start{utf16_output};
    +      char32_t* start{utf32_output};
           // In the worst case, we have the haswell kernel which can cause an overflow of
    -      // 8 bytes when calling convert_masked_utf8_to_utf16. If you skip the last 16 bytes,
    +      // 8 bytes when calling convert_masked_utf8_to_utf32. If you skip the last 16 bytes,
           // and if the data is valid, then it is entirely safe because 16 UTF-8 bytes generate
           // much more than 8 bytes. However, you cannot generally assume that you have valid
    -      // UTF-8 input, so we are going to go back from the end counting 8 leading bytes,
    +      // UTF-8 input, so we are going to go back from the end counting 4 leading bytes,
           // to give us a good margin.
           size_t leading_byte = 0;
           size_t margin = size;
    -      for(; margin > 0 && leading_byte < 8; margin--) {
    +      for(; margin > 0 && leading_byte < 4; margin--) {
             leading_byte += (int8_t(in[margin-1]) > -65);
           }
    -      // If the input is long enough, then we have that margin-1 is the eight last leading byte.
    +      // If the input is long enough, then we have that margin-1 is the fourth last leading byte.
           const size_t safety_margin = size - margin + 1; // to avoid overruns!
           while(pos + 64 + safety_margin <= size) {
             simd8x64 input(reinterpret_cast(in + pos));
             if(input.is_ascii()) {
    -          input.store_ascii_as_utf16(utf16_output);
    -          utf16_output += 64;
    +          input.store_ascii_as_utf32(utf32_output);
    +          utf32_output += 64;
               pos += 64;
             } else {
               // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    @@ -27605,9 +31978,7 @@ using namespace simd;
                 this->check_utf8_bytes(input.chunks[3], input.chunks[2]);
               }
               if (errors()) {
    -            // rewind_and_convert_with_errors will seek a potential error from in+pos onward,
    -            // with the ability to go back up to pos bytes, and read size-pos bytes forward.
    -            result res = scalar::utf8_to_utf16::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf16_output);
    +            result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf32_output);
                 res.count += pos;
                 return res;
               }
    @@ -27629,8 +32000,8 @@ using namespace simd;
                 // for this section of the code. Hence, there is a limit
                 // to how much we can further increase this latency before
                 // it seriously harms performance.
    -            size_t consumed = convert_masked_utf8_to_utf16(in + pos,
    -                            utf8_end_of_code_point_mask, utf16_output);
    +            size_t consumed = convert_masked_utf8_to_utf32(in + pos,
    +                            utf8_end_of_code_point_mask, utf32_output);
                 pos += consumed;
                 utf8_end_of_code_point_mask >>= consumed;
               }
    @@ -27641,24 +32012,20 @@ using namespace simd;
             }
           }
           if(errors()) {
    -        // rewind_and_convert_with_errors will seek a potential error from in+pos onward,
    -        // with the ability to go back up to pos bytes, and read size-pos bytes forward.
    -        result res = scalar::utf8_to_utf16::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf16_output);
    +        result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf32_output);
             res.count += pos;
             return res;
           }
           if(pos < size) {
    -        // rewind_and_convert_with_errors will seek a potential error from in+pos onward,
    -        // with the ability to go back up to pos bytes, and read size-pos bytes forward.
    -        result res = scalar::utf8_to_utf16::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf16_output);
    +        result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf32_output);
             if (res.error) {    // In case of error, we want the error position
               res.count += pos;
               return res;
             } else {    // In case of success, we want the number of word written
    -          utf16_output += res.count;
    +          utf32_output += res.count;
             }
           }
    -      return result(error_code::SUCCESS, utf16_output - start);
    +      return result(error_code::SUCCESS, utf32_output - start);
         }
     
         simdutf_really_inline bool errors() const {
    @@ -27666,70 +32033,131 @@ using namespace simd;
         }
     
       }; // struct utf8_checker
    -} // utf8_to_utf16 namespace
    +} // utf8_to_utf32 namespace
     } // unnamed namespace
     } // namespace westmere
     } // namespace simdutf
    -/* end file src/generic/utf8_to_utf16/utf8_to_utf16.h */
    -// transcoding from UTF-8 to UTF-32
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_to_utf32/valid_utf8_to_utf32.h
    -/* begin file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */
    +/* end file src/generic/utf8_to_utf32/utf8_to_utf32.h */
    +// other functions
    +/* begin file src/generic/utf8.h */
     
     namespace simdutf {
     namespace westmere {
     namespace {
    -namespace utf8_to_utf32 {
    +namespace utf8 {
     
     using namespace simd;
     
    +simdutf_really_inline size_t count_code_points(const char* in, size_t size) {
    +    size_t pos = 0;
    +    size_t count = 0;
    +    for(;pos + 64 <= size; pos += 64) {
    +      simd8x64 input(reinterpret_cast(in + pos));
    +      uint64_t utf8_continuation_mask = input.gt(-65);
    +      count += count_ones(utf8_continuation_mask);
    +    }
    +    return count + scalar::utf8::count_code_points(in + pos, size - pos);
    +}
     
    -simdutf_warn_unused size_t convert_valid(const char* input, size_t size,
    -    char32_t* utf32_output) noexcept {
    -  size_t pos = 0;
    -  char32_t* start{utf32_output};
    -  const size_t safety_margin = 16; // to avoid overruns!
    -  while(pos + 64 + safety_margin <= size) {
    -    simd8x64 in(reinterpret_cast(input + pos));
    -    if(in.is_ascii()) {
    -      in.store_ascii_as_utf32(utf32_output);
    -      utf32_output += 64;
    -      pos += 64;
    -    } else {
    -    // -65 is 0b10111111 in two-complement's, so largest possible continuation byte
    -    uint64_t utf8_continuation_mask = in.lt(-65 + 1);
    -    uint64_t utf8_leading_mask = ~utf8_continuation_mask;
    -    uint64_t utf8_end_of_code_point_mask = utf8_leading_mask>>1;
    -    size_t max_starting_point = (pos + 64) - 12;
    -    while(pos < max_starting_point) {
    -      size_t consumed = convert_masked_utf8_to_utf32(input + pos,
    -                          utf8_end_of_code_point_mask, utf32_output);
    -      pos += consumed;
    -      utf8_end_of_code_point_mask >>= consumed;
    -      }
    +simdutf_really_inline size_t utf16_length_from_utf8(const char* in, size_t size) {
    +    size_t pos = 0;
    +    size_t count = 0;
    +    // This algorithm could no doubt be improved!
    +    for(;pos + 64 <= size; pos += 64) {
    +      simd8x64 input(reinterpret_cast(in + pos));
    +      uint64_t utf8_continuation_mask = input.lt(-65 + 1);
    +      // We count one word for anything that is not a continuation (so
    +      // leading bytes).
    +      count += 64 - count_ones(utf8_continuation_mask);
    +      int64_t utf8_4byte = input.gteq_unsigned(240);
    +      count += count_ones(utf8_4byte);
         }
    -  }
    -  utf32_output += scalar::utf8_to_utf32::convert_valid(input + pos, size - pos, utf32_output);
    -  return utf32_output - start;
    +    return count + scalar::utf8::utf16_length_from_utf8(in + pos, size - pos);
     }
    +} // utf8 namespace
    +} // unnamed namespace
    +} // namespace westmere
    +} // namespace simdutf
    +/* end file src/generic/utf8.h */
    +/* begin file src/generic/utf16.h */
    +namespace simdutf {
    +namespace westmere {
    +namespace {
    +namespace utf16 {
     
    +template 
    +simdutf_really_inline size_t count_code_points(const char16_t* in, size_t size) {
    +    size_t pos = 0;
    +    size_t count = 0;
    +    for(;pos < size/32*32; pos += 32) {
    +      simd16x32 input(reinterpret_cast(in + pos));
    +      if (!match_system(big_endian)) { input.swap_bytes(); }
    +      uint64_t not_pair = input.not_in_range(0xDC00, 0xDFFF);
    +      count += count_ones(not_pair) / 2;
    +    }
    +    return count + scalar::utf16::count_code_points(in + pos, size - pos);
    +}
     
    -} // namespace utf8_to_utf32
    +template 
    +simdutf_really_inline size_t utf8_length_from_utf16(const char16_t* in, size_t size) {
    +    size_t pos = 0;
    +    size_t count = 0;
    +    // This algorithm could no doubt be improved!
    +    for(;pos < size/32*32; pos += 32) {
    +      simd16x32 input(reinterpret_cast(in + pos));
    +      if (!match_system(big_endian)) { input.swap_bytes(); }
    +      uint64_t ascii_mask = input.lteq(0x7F);
    +      uint64_t twobyte_mask = input.lteq(0x7FF);
    +      uint64_t not_pair_mask = input.not_in_range(0xD800, 0xDFFF);
    +
    +      size_t ascii_count = count_ones(ascii_mask) / 2;
    +      size_t twobyte_count = count_ones(twobyte_mask & ~ ascii_mask) / 2;
    +      size_t threebyte_count = count_ones(not_pair_mask & ~ twobyte_mask) / 2;
    +      size_t fourbyte_count = 32 - count_ones(not_pair_mask) / 2;
    +      count += 2 * fourbyte_count + 3 * threebyte_count + 2 * twobyte_count + ascii_count;
    +    }
    +    return count + scalar::utf16::utf8_length_from_utf16(in + pos, size - pos);
    +}
    +
    +template 
    +simdutf_really_inline size_t utf32_length_from_utf16(const char16_t* in, size_t size) {
    +    return count_code_points(in, size);
    +}
    +
    +simdutf_really_inline void change_endianness_utf16(const char16_t* in, size_t size, char16_t* output) {
    +  size_t pos = 0;
    +
    +  while (pos < size/32*32) {
    +    simd16x32 input(reinterpret_cast(in + pos));
    +    input.swap_bytes();
    +    input.store(reinterpret_cast(output));
    +    pos += 32;
    +    output += 32;
    +  }
    +
    +  scalar::utf16::change_endianness_utf16(in + pos, size - pos, output);
    +}
    +
    +} // utf16
     } // unnamed namespace
     } // namespace westmere
     } // namespace simdutf
    -/* end file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8_to_utf32/utf8_to_utf32.h
    -/* begin file src/generic/utf8_to_utf32/utf8_to_utf32.h */
    +/* end file src/generic/utf16.h */
    +// transcoding from UTF-8 to Latin 1
    +/* begin file src/generic/utf8_to_latin1/utf8_to_latin1.h */
     
     
     namespace simdutf {
     namespace westmere {
     namespace {
    -namespace utf8_to_utf32 {
    +namespace utf8_to_latin1 {
     using namespace simd;
     
     
       simdutf_really_inline simd8 check_special_cases(const simd8 input, const simd8 prev1) {
    +// For UTF-8 to Latin 1, we can allow any ASCII character, and any continuation byte,
    +// but the non-ASCII leading bytes must be 0b11000011 or 0b11000010 and nothing else.
    +//
     // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII)
     // Bit 1 = Too Long (ASCII followed by continuation)
     // Bit 2 = Overlong 3-byte
    @@ -27756,6 +32184,7 @@ using namespace simd;
                                                     // 1111011_ 1000____
                                                     // 11111___ 1000____
         constexpr const uint8_t OVERLONG_4  = 1<<6; // 11110000 1000____
    +    constexpr const uint8_t FORBIDDEN  = 0xff;
     
         const simd8 byte_1_high = prev1.shr<4>().lookup_16(
           // 0_______ ________ 
    @@ -27766,11 +32195,11 @@ using namespace simd;
           // 1100____ ________ 
           TOO_SHORT | OVERLONG_2,
           // 1101____ ________ 
    -      TOO_SHORT,
    +      FORBIDDEN,
           // 1110____ ________ 
    -      TOO_SHORT | OVERLONG_3 | SURROGATE,
    +      FORBIDDEN,
           // 1111____ ________ 
    -      TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4
    +      FORBIDDEN
         );
         constexpr const uint8_t CARRY = TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 .
         const simd8 byte_1_low = (prev1 & 0x0F).lookup_16(
    @@ -27783,23 +32212,23 @@ using namespace simd;
           CARRY,
     
           // ____0100 ________
    -      CARRY | TOO_LARGE,
    +      FORBIDDEN,
           // ____0101 ________
    -      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      FORBIDDEN,
           // ____011_ ________
    -      CARRY | TOO_LARGE | TOO_LARGE_1000,
    -      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      FORBIDDEN,
    +      FORBIDDEN,
     
           // ____1___ ________
    -      CARRY | TOO_LARGE | TOO_LARGE_1000,
    -      CARRY | TOO_LARGE | TOO_LARGE_1000,
    -      CARRY | TOO_LARGE | TOO_LARGE_1000,
    -      CARRY | TOO_LARGE | TOO_LARGE_1000,
    -      CARRY | TOO_LARGE | TOO_LARGE_1000,
    +      FORBIDDEN,
    +      FORBIDDEN,
    +      FORBIDDEN,
    +      FORBIDDEN,
    +      FORBIDDEN,
           // ____1101 ________
    -      CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE,
    -      CARRY | TOO_LARGE | TOO_LARGE_1000,
    -      CARRY | TOO_LARGE | TOO_LARGE_1000
    +      FORBIDDEN,
    +      FORBIDDEN,
    +      FORBIDDEN
         );
         const simd8 byte_2_high = input.shr<4>().lookup_16(
           // ________ 0_______ 
    @@ -27819,15 +32248,6 @@ using namespace simd;
         );
         return (byte_1_high & byte_1_low & byte_2_high);
       }
    -  simdutf_really_inline simd8 check_multibyte_lengths(const simd8 input,
    -      const simd8 prev_input, const simd8 sc) {
    -    simd8 prev2 = input.prev<2>(prev_input);
    -    simd8 prev3 = input.prev<3>(prev_input);
    -    simd8 must23 = simd8(must_be_2_3_continuation(prev2, prev3));
    -    simd8 must23_80 = must23 & uint8_t(0x80);
    -    return must23_80 ^ sc;
    -  }
    -
     
       struct validating_transcoder {
         // If this is nonzero, there has been a UTF-8 error.
    @@ -27841,33 +32261,31 @@ using namespace simd;
           // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ lead bytes
           // (2, 3, 4-byte leads become large positive numbers instead of small negative numbers)
           simd8 prev1 = input.prev<1>(prev_input);
    -      simd8 sc = check_special_cases(input, prev1);
    -      this->error |= check_multibyte_lengths(input, prev_input, sc);
    +      this->error |= check_special_cases(input, prev1);
         }
     
     
    -
    -    simdutf_really_inline size_t convert(const char* in, size_t size, char32_t* utf32_output) {
    +    simdutf_really_inline size_t convert(const char* in, size_t size, char* latin1_output) {
           size_t pos = 0;
    -      char32_t* start{utf32_output};
    +      char* start{latin1_output};
           // In the worst case, we have the haswell kernel which can cause an overflow of
    -      // 8 bytes when calling convert_masked_utf8_to_utf32. If you skip the last 16 bytes,
    +      // 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the last 16 bytes,
           // and if the data is valid, then it is entirely safe because 16 UTF-8 bytes generate
           // much more than 8 bytes. However, you cannot generally assume that you have valid
    -      // UTF-8 input, so we are going to go back from the end counting 4 leading bytes,
    +      // UTF-8 input, so we are going to go back from the end counting 8 leading bytes,
           // to give us a good margin.
           size_t leading_byte = 0;
           size_t margin = size;
    -      for(; margin > 0 && leading_byte < 4; margin--) {
    -        leading_byte += (int8_t(in[margin-1]) > -65);
    +      for(; margin > 0 && leading_byte < 8; margin--) {
    +        leading_byte += (int8_t(in[margin-1]) > -65); //twos complement of -65 is 1011 1111 ...
           }
    -      // If the input is long enough, then we have that margin-1 is the fourth last leading byte.
    +      // If the input is long enough, then we have that margin-1 is the eight last leading byte.
           const size_t safety_margin = size - margin + 1; // to avoid overruns!
           while(pos + 64 + safety_margin <= size) {
             simd8x64 input(reinterpret_cast(in + pos));
             if(input.is_ascii()) {
    -          input.store_ascii_as_utf32(utf32_output);
    -          utf32_output += 64;
    +          input.store((int8_t*)latin1_output);
    +          latin1_output += 64;
               pos += 64;
             } else {
               // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    @@ -27883,7 +32301,7 @@ using namespace simd;
                 this->check_utf8_bytes(input.chunks[2], input.chunks[1]);
                 this->check_utf8_bytes(input.chunks[3], input.chunks[2]);
               }
    -          uint64_t utf8_continuation_mask = input.lt(-65 + 1);
    +          uint64_t utf8_continuation_mask = input.lt(-65 + 1); // -64 is 1100 0000 in twos complement. Note: in this case, we also have ASCII to account for.
               uint64_t utf8_leading_mask = ~utf8_continuation_mask;
               uint64_t utf8_end_of_code_point_mask = utf8_leading_mask>>1;
               // We process in blocks of up to 12 bytes except possibly
    @@ -27901,8 +32319,8 @@ using namespace simd;
                 // for this section of the code. Hence, there is a limit
                 // to how much we can further increase this latency before
                 // it seriously harms performance.
    -            size_t consumed = convert_masked_utf8_to_utf32(in + pos,
    -                            utf8_end_of_code_point_mask, utf32_output);
    +            size_t consumed = convert_masked_utf8_to_latin1(in + pos,
    +                            utf8_end_of_code_point_mask, latin1_output);
                 pos += consumed;
                 utf8_end_of_code_point_mask >>= consumed;
               }
    @@ -27914,34 +32332,34 @@ using namespace simd;
           }
           if(errors()) { return 0; }
           if(pos < size) {
    -        size_t howmany  = scalar::utf8_to_utf32::convert(in + pos, size - pos, utf32_output);
    +        size_t howmany  = scalar::utf8_to_latin1::convert(in + pos, size - pos, latin1_output);
             if(howmany == 0) { return 0; }
    -        utf32_output += howmany;
    +        latin1_output += howmany;
           }
    -      return utf32_output - start;
    +      return latin1_output - start;
         }
     
    -    simdutf_really_inline result convert_with_errors(const char* in, size_t size, char32_t* utf32_output) {
    +    simdutf_really_inline result convert_with_errors(const char* in, size_t size, char* latin1_output) {
           size_t pos = 0;
    -      char32_t* start{utf32_output};
    +      char* start{latin1_output};
           // In the worst case, we have the haswell kernel which can cause an overflow of
    -      // 8 bytes when calling convert_masked_utf8_to_utf32. If you skip the last 16 bytes,
    +      // 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the last 16 bytes,
           // and if the data is valid, then it is entirely safe because 16 UTF-8 bytes generate
           // much more than 8 bytes. However, you cannot generally assume that you have valid
    -      // UTF-8 input, so we are going to go back from the end counting 4 leading bytes,
    +      // UTF-8 input, so we are going to go back from the end counting 8 leading bytes,
           // to give us a good margin.
           size_t leading_byte = 0;
           size_t margin = size;
    -      for(; margin > 0 && leading_byte < 4; margin--) {
    +      for(; margin > 0 && leading_byte < 8; margin--) {
             leading_byte += (int8_t(in[margin-1]) > -65);
           }
    -      // If the input is long enough, then we have that margin-1 is the fourth last leading byte.
    +      // If the input is long enough, then we have that margin-1 is the eight last leading byte.
           const size_t safety_margin = size - margin + 1; // to avoid overruns!
           while(pos + 64 + safety_margin <= size) {
             simd8x64 input(reinterpret_cast(in + pos));
             if(input.is_ascii()) {
    -          input.store_ascii_as_utf32(utf32_output);
    -          utf32_output += 64;
    +          input.store((int8_t*)latin1_output);
    +          latin1_output += 64;
               pos += 64;
             } else {
               // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    @@ -27958,7 +32376,9 @@ using namespace simd;
                 this->check_utf8_bytes(input.chunks[3], input.chunks[2]);
               }
               if (errors()) {
    -            result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf32_output);
    +            // rewind_and_convert_with_errors will seek a potential error from in+pos onward,
    +            // with the ability to go back up to pos bytes, and read size-pos bytes forward.
    +            result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors(pos, in + pos, size - pos, latin1_output);
                 res.count += pos;
                 return res;
               }
    @@ -27980,8 +32400,8 @@ using namespace simd;
                 // for this section of the code. Hence, there is a limit
                 // to how much we can further increase this latency before
                 // it seriously harms performance.
    -            size_t consumed = convert_masked_utf8_to_utf32(in + pos,
    -                            utf8_end_of_code_point_mask, utf32_output);
    +            size_t consumed = convert_masked_utf8_to_latin1(in + pos,
    +                            utf8_end_of_code_point_mask, latin1_output);
                 pos += consumed;
                 utf8_end_of_code_point_mask >>= consumed;
               }
    @@ -27992,20 +32412,24 @@ using namespace simd;
             }
           }
           if(errors()) {
    -        result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf32_output);
    +        // rewind_and_convert_with_errors will seek a potential error from in+pos onward,
    +        // with the ability to go back up to pos bytes, and read size-pos bytes forward.
    +        result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors(pos, in + pos, size - pos, latin1_output);
             res.count += pos;
             return res;
           }
           if(pos < size) {
    -        result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors(pos, in + pos, size - pos, utf32_output);
    +        // rewind_and_convert_with_errors will seek a potential error from in+pos onward,
    +        // with the ability to go back up to pos bytes, and read size-pos bytes forward.
    +        result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors(pos, in + pos, size - pos, latin1_output);
             if (res.error) {    // In case of error, we want the error position
               res.count += pos;
               return res;
             } else {    // In case of success, we want the number of word written
    -          utf32_output += res.count;
    +          latin1_output += res.count;
             }
           }
    -      return result(error_code::SUCCESS, utf32_output - start);
    +      return result(error_code::SUCCESS, latin1_output - start);
         }
     
         simdutf_really_inline bool errors() const {
    @@ -28013,124 +32437,89 @@ using namespace simd;
         }
     
       }; // struct utf8_checker
    -} // utf8_to_utf32 namespace
    +} // utf8_to_latin1 namespace
     } // unnamed namespace
     } // namespace westmere
     } // namespace simdutf
    -/* end file src/generic/utf8_to_utf32/utf8_to_utf32.h */
    -// other functions
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf8.h
    -/* begin file src/generic/utf8.h */
    -
    -namespace simdutf {
    -namespace westmere {
    -namespace {
    -namespace utf8 {
    -
    -using namespace simd;
    -
    -simdutf_really_inline size_t count_code_points(const char* in, size_t size) {
    -    size_t pos = 0;
    -    size_t count = 0;
    -    for(;pos + 64 <= size; pos += 64) {
    -      simd8x64 input(reinterpret_cast(in + pos));
    -      uint64_t utf8_continuation_mask = input.lt(-65 + 1);
    -      count += 64 - count_ones(utf8_continuation_mask);
    -    }
    -    return count + scalar::utf8::count_code_points(in + pos, size - pos);
    -}
    -
    -
    -simdutf_really_inline size_t utf16_length_from_utf8(const char* in, size_t size) {
    -    size_t pos = 0;
    -    size_t count = 0;
    -    // This algorithm could no doubt be improved!
    -    for(;pos + 64 <= size; pos += 64) {
    -      simd8x64 input(reinterpret_cast(in + pos));
    -      uint64_t utf8_continuation_mask = input.lt(-65 + 1);
    -      // We count one word for anything that is not a continuation (so
    -      // leading bytes).
    -      count += 64 - count_ones(utf8_continuation_mask);
    -      int64_t utf8_4byte = input.gteq_unsigned(240);
    -      count += count_ones(utf8_4byte);
    -    }
    -    return count + scalar::utf8::utf16_length_from_utf8(in + pos, size - pos);
    -}
    +/* end file src/generic/utf8_to_latin1/utf8_to_latin1.h */
    +/* begin file src/generic/utf8_to_latin1/valid_utf8_to_latin1.h */
     
     
    -simdutf_really_inline size_t utf32_length_from_utf8(const char* in, size_t size) {
    -    return count_code_points(in, size);
    -}
    -} // utf8 namespace
    -} // unnamed namespace
    -} // namespace westmere
    -} // namespace simdutf
    -/* end file src/generic/utf8.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=generic/utf16.h
    -/* begin file src/generic/utf16.h */
     namespace simdutf {
     namespace westmere {
     namespace {
    -namespace utf16 {
    -
    -template 
    -simdutf_really_inline size_t count_code_points(const char16_t* in, size_t size) {
    -    size_t pos = 0;
    -    size_t count = 0;
    -    for(;pos + 32 <= size; pos += 32) {
    -      simd16x32 input(reinterpret_cast(in + pos));
    -      if (!match_system(big_endian)) input.swap_bytes();
    -      uint64_t not_pair = input.not_in_range(0xDC00, 0xDFFF);
    -      count += count_ones(not_pair) / 2;
    -    }
    -    return count + scalar::utf16::count_code_points(in + pos, size - pos);
    -}
    +namespace utf8_to_latin1 {
    +using namespace simd;
     
    -template 
    -simdutf_really_inline size_t utf8_length_from_utf16(const char16_t* in, size_t size) {
    -    size_t pos = 0;
    -    size_t count = 0;
    -    // This algorithm could no doubt be improved!
    -    for(;pos + 32 <= size; pos += 32) {
    -      simd16x32 input(reinterpret_cast(in + pos));
    -      if (!match_system(big_endian)) input.swap_bytes();
    -      uint64_t ascii_mask = input.lteq(0x7F);
    -      uint64_t twobyte_mask = input.lteq(0x7FF);
    -      uint64_t not_pair_mask = input.not_in_range(0xD800, 0xDFFF);
     
    -      size_t ascii_count = count_ones(ascii_mask) / 2;
    -      size_t twobyte_count = count_ones(twobyte_mask & ~ ascii_mask) / 2;
    -      size_t threebyte_count = count_ones(not_pair_mask & ~ twobyte_mask) / 2;
    -      size_t fourbyte_count = 32 - count_ones(not_pair_mask) / 2;
    -      count += 2 * fourbyte_count + 3 * threebyte_count + 2 * twobyte_count + ascii_count;
    +    simdutf_really_inline size_t convert_valid(const char* in, size_t size, char* latin1_output) {
    +      size_t pos = 0;
    +      char* start{latin1_output};
    +      // In the worst case, we have the haswell kernel which can cause an overflow of
    +      // 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the last 16 bytes,
    +      // and if the data is valid, then it is entirely safe because 16 UTF-8 bytes generate
    +      // much more than 8 bytes. However, you cannot generally assume that you have valid
    +      // UTF-8 input, so we are going to go back from the end counting 8 leading bytes,
    +      // to give us a good margin.
    +      size_t leading_byte = 0;
    +      size_t margin = size;
    +      for(; margin > 0 && leading_byte < 8; margin--) {
    +        leading_byte += (int8_t(in[margin-1]) > -65); //twos complement of -65 is 1011 1111 ...
    +      }
    +      // If the input is long enough, then we have that margin-1 is the eight last leading byte.
    +      const size_t safety_margin = size - margin + 1; // to avoid overruns!
    +      while(pos + 64 + safety_margin <= size) {
    +        simd8x64 input(reinterpret_cast(in + pos));
    +        if(input.is_ascii()) {
    +          input.store((int8_t*)latin1_output);
    +          latin1_output += 64;
    +          pos += 64;
    +        } else {
    +          // you might think that a for-loop would work, but under Visual Studio, it is not good enough.
    +          uint64_t utf8_continuation_mask = input.lt(-65 + 1); // -64 is 1100 0000 in twos complement. Note: in this case, we also have ASCII to account for.
    +          uint64_t utf8_leading_mask = ~utf8_continuation_mask;
    +          uint64_t utf8_end_of_code_point_mask = utf8_leading_mask>>1;
    +          // We process in blocks of up to 12 bytes except possibly
    +          // for fast paths which may process up to 16 bytes. For the
    +          // slow path to work, we should have at least 12 input bytes left.
    +          size_t max_starting_point = (pos + 64) - 12;
    +          // Next loop is going to run at least five times.
    +          while(pos < max_starting_point) {
    +            // Performance note: our ability to compute 'consumed' and
    +            // then shift and recompute is critical. If there is a
    +            // latency of, say, 4 cycles on getting 'consumed', then
    +            // the inner loop might have a total latency of about 6 cycles.
    +            // Yet we process between 6 to 12 inputs bytes, thus we get
    +            // a speed limit between 1 cycle/byte and 0.5 cycle/byte
    +            // for this section of the code. Hence, there is a limit
    +            // to how much we can further increase this latency before
    +            // it seriously harms performance.
    +            size_t consumed = convert_masked_utf8_to_latin1(in + pos,
    +                            utf8_end_of_code_point_mask, latin1_output);
    +            pos += consumed;
    +            utf8_end_of_code_point_mask >>= consumed;
    +          }
    +          // At this point there may remain between 0 and 12 bytes in the
    +          // 64-byte block. These bytes will be processed again. So we have an
    +          // 80% efficiency (in the worst case). In practice we expect an
    +          // 85% to 90% efficiency.
    +        }
    +      }
    +      if(pos < size) {
    +        size_t howmany  = scalar::utf8_to_latin1::convert_valid(in + pos, size - pos, latin1_output);
    +        latin1_output += howmany;
    +      }
    +      return latin1_output - start;
         }
    -    return count + scalar::utf16::utf8_length_from_utf16(in + pos, size - pos);
    -}
    -
    -template 
    -simdutf_really_inline size_t utf32_length_from_utf16(const char16_t* in, size_t size) {
    -    return count_code_points(in, size);
    -}
    -
    -simdutf_really_inline void change_endianness_utf16(const char16_t* in, size_t size, char16_t* output) {
    -  size_t pos = 0;
     
    -  while (pos + 32 <= size) {
    -    simd16x32 input(reinterpret_cast(in + pos));
    -    input.swap_bytes();
    -    input.store(reinterpret_cast(output));
    -    pos += 32;
    -    output += 32;
       }
    +}   // utf8_to_latin1 namespace
    +}   // unnamed namespace
    +}   // namespace westmere
    + // namespace simdutf
    +/* end file src/generic/utf8_to_latin1/valid_utf8_to_latin1.h */
     
    -  scalar::utf16::change_endianness_utf16(in + pos, size - pos, output);
    -}
     
    -} // utf16
    -} // unnamed namespace
    -} // namespace westmere
    -} // namespace simdutf
    -/* end file src/generic/utf16.h */
     //
     // Implementation-specific overrides
     //
    @@ -28226,6 +32615,74 @@ simdutf_warn_unused result implementation::validate_utf32_with_errors(const char
       }
     }
     
    +simdutf_warn_unused size_t implementation::convert_latin1_to_utf8(const char * buf, size_t len, char* utf8_output) const noexcept {
    +
    +  std::pair ret = sse_convert_latin1_to_utf8(buf, len, utf8_output);
    +  size_t converted_chars = ret.second - utf8_output;
    +
    +  if (ret.first != buf + len) {
    +    const size_t scalar_converted_chars = scalar::latin1_to_utf8::convert(
    +      ret.first, len - (ret.first - buf), ret.second);
    +    converted_chars += scalar_converted_chars;
    +  }
    +
    +  return converted_chars;
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_latin1_to_utf16le(const char* buf, size_t len, char16_t* utf16_output) const noexcept {
    +    std::pair ret = sse_convert_latin1_to_utf16(buf, len, utf16_output);
    +    if (ret.first == nullptr) { return 0; }
    +    size_t converted_chars = ret.second - utf16_output;
    +    if (ret.first != buf + len) {
    +        const size_t scalar_converted_chars = scalar::latin1_to_utf16::convert(
    +                                              ret.first, len - (ret.first - buf), ret.second);
    +        if (scalar_converted_chars == 0) { return 0; }
    +        converted_chars += scalar_converted_chars;
    +    }
    +    return converted_chars;
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_latin1_to_utf16be(const char* buf, size_t len, char16_t* utf16_output) const noexcept {
    +    std::pair ret = sse_convert_latin1_to_utf16(buf, len, utf16_output);
    +    if (ret.first == nullptr) { return 0; }
    +    size_t converted_chars = ret.second - utf16_output;
    +    if (ret.first != buf + len) {
    +        const size_t scalar_converted_chars = scalar::latin1_to_utf16::convert(
    +                                              ret.first, len - (ret.first - buf), ret.second);
    +        if (scalar_converted_chars == 0) { return 0; }
    +        converted_chars += scalar_converted_chars;
    +    }
    +    return converted_chars;
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_latin1_to_utf32(const char* buf, size_t len, char32_t* utf32_output) const noexcept {
    +    std::pair ret = sse_convert_latin1_to_utf32(buf, len, utf32_output);
    +    if (ret.first == nullptr) { return 0; }
    +    size_t converted_chars = ret.second - utf32_output;
    +    if (ret.first != buf + len) {
    +        const size_t scalar_converted_chars = scalar::latin1_to_utf32::convert(
    +                                              ret.first, len - (ret.first - buf), ret.second);
    +        if (scalar_converted_chars == 0) { return 0; }
    +        converted_chars += scalar_converted_chars;
    +    }
    +    return converted_chars;
    +}
    +
    +
    +simdutf_warn_unused size_t implementation::convert_utf8_to_latin1(const char* buf, size_t len, char* latin1_output) const noexcept {
    +  utf8_to_latin1::validating_transcoder converter;
    +  return converter.convert(buf, len, latin1_output);
    +}
    +
    +simdutf_warn_unused result implementation::convert_utf8_to_latin1_with_errors(const char* buf, size_t len, char* latin1_output) const noexcept {
    +  utf8_to_latin1::validating_transcoder converter;
    +  return converter.convert_with_errors(buf, len, latin1_output);
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_latin1(const char* buf, size_t len, char* latin1_output) const noexcept {
    +  return westmere::utf8_to_latin1::convert_valid(buf,len,latin1_output);
    +}
    +
     simdutf_warn_unused size_t implementation::convert_utf8_to_utf16le(const char* buf, size_t len, char16_t* utf16_output) const noexcept {
       utf8_to_utf16::validating_transcoder converter;
       return converter.convert(buf, len, utf16_output);
    @@ -28272,6 +32729,79 @@ simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf32(const cha
       return utf8_to_utf32::convert_valid(input, size,  utf32_output);
     }
     
    +simdutf_warn_unused size_t implementation::convert_utf16le_to_latin1(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  std::pair ret = sse_convert_utf16_to_latin1(buf, len, latin1_output);
    +  if (ret.first == nullptr) { return 0; }
    +  size_t saved_bytes = ret.second - latin1_output;
    +
    +  if (ret.first != buf + len) {
    +    const size_t scalar_saved_bytes = scalar::utf16_to_latin1::convert(
    +                                        ret.first, len - (ret.first - buf), ret.second);
    +    if (scalar_saved_bytes == 0) { return 0; }
    +    saved_bytes += scalar_saved_bytes;
    +  }
    +  return saved_bytes;
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_utf16be_to_latin1(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  std::pair ret = sse_convert_utf16_to_latin1(buf, len, latin1_output);
    +  if (ret.first == nullptr) { return 0; }
    +  size_t saved_bytes = ret.second - latin1_output;
    +
    +  if (ret.first != buf + len) {
    +    const size_t scalar_saved_bytes = scalar::utf16_to_latin1::convert(
    +                                        ret.first, len - (ret.first - buf), ret.second);
    +    if (scalar_saved_bytes == 0) { return 0; }
    +    saved_bytes += scalar_saved_bytes;
    +  }
    +  return saved_bytes;
    +}
    +
    +simdutf_warn_unused result implementation::convert_utf16le_to_latin1_with_errors(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  std::pair ret = sse_convert_utf16_to_latin1_with_errors(buf, len, latin1_output);
    +  if (ret.first.error) { return ret.first; }  // Can return directly since scalar fallback already found correct ret.first.count
    +  if (ret.first.count != len) { // All good so far, but not finished
    +    result scalar_res = scalar::utf16_to_latin1::convert_with_errors(
    +                                        buf + ret.first.count, len - ret.first.count, ret.second);
    +    if (scalar_res.error) {
    +      scalar_res.count += ret.first.count;
    +      return scalar_res;
    +    } else {
    +      ret.second += scalar_res.count;
    +    }
    +  }
    +  ret.first.count = ret.second - latin1_output;   // Set count to the number of 8-bit code units written
    +  return ret.first;
    +}
    +
    +simdutf_warn_unused result implementation::convert_utf16be_to_latin1_with_errors(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  std::pair ret = sse_convert_utf16_to_latin1_with_errors(buf, len, latin1_output);
    +  if (ret.first.error) { return ret.first; }  // Can return directly since scalar fallback already found correct ret.first.count
    +  if (ret.first.count != len) { // All good so far, but not finished
    +    result scalar_res = scalar::utf16_to_latin1::convert_with_errors(
    +                                        buf + ret.first.count, len - ret.first.count, ret.second);
    +    if (scalar_res.error) {
    +      scalar_res.count += ret.first.count;
    +      return scalar_res;
    +    } else {
    +      ret.second += scalar_res.count;
    +    }
    +  }
    +  ret.first.count = ret.second - latin1_output;   // Set count to the number of 8-bit code units written
    +  return ret.first;
    +}
    +
    +
    +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_latin1(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  // optimization opportunity: we could provide an optimized function.
    +  return convert_utf16be_to_latin1(buf, len, latin1_output);
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_latin1(const char16_t* buf, size_t len, char* latin1_output) const noexcept {
    +  // optimization opportunity: we could provide an optimized function.
    +  return convert_utf16le_to_latin1(buf, len, latin1_output);
    +}
    +
     simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8(const char16_t* buf, size_t len, char* utf8_output) const noexcept {
       std::pair ret = sse_convert_utf16_to_utf8(buf, len, utf8_output);
       if (ret.first == nullptr) { return 0; }
    @@ -28299,7 +32829,7 @@ simdutf_warn_unused size_t implementation::convert_utf16be_to_utf8(const char16_
     }
     
     simdutf_warn_unused result implementation::convert_utf16le_to_utf8_with_errors(const char16_t* buf, size_t len, char* utf8_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = westmere::sse_convert_utf16_to_utf8_with_errors(buf, len, utf8_output);
       if (ret.first.error) { return ret.first; }  // Can return directly since scalar fallback already found correct ret.first.count
       if (ret.first.count != len) { // All good so far, but not finished
    @@ -28312,12 +32842,12 @@ simdutf_warn_unused result implementation::convert_utf16le_to_utf8_with_errors(c
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf8_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf8_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
     simdutf_warn_unused result implementation::convert_utf16be_to_utf8_with_errors(const char16_t* buf, size_t len, char* utf8_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = westmere::sse_convert_utf16_to_utf8_with_errors(buf, len, utf8_output);
       if (ret.first.error) { return ret.first; }  // Can return directly since scalar fallback already found correct ret.first.count
       if (ret.first.count != len) { // All good so far, but not finished
    @@ -28330,7 +32860,7 @@ simdutf_warn_unused result implementation::convert_utf16be_to_utf8_with_errors(c
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf8_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf8_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
    @@ -28342,6 +32872,43 @@ simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf8(const c
       return convert_utf16be_to_utf8(buf, len, utf8_output);
     }
     
    +simdutf_warn_unused size_t implementation::convert_utf32_to_latin1(const char32_t* buf, size_t len, char* latin1_output) const noexcept {
    +  std::pair ret = sse_convert_utf32_to_latin1(buf, len, latin1_output);
    +  if (ret.first == nullptr) { return 0; }
    +  size_t saved_bytes = ret.second - latin1_output;
    +  // if (ret.first != buf + len) {
    +  if (ret.first < buf + len) {
    +    const size_t scalar_saved_bytes = scalar::utf32_to_latin1::convert(
    +                                        ret.first, len - (ret.first - buf), ret.second);
    +    if (scalar_saved_bytes == 0) { return 0; }
    +    saved_bytes += scalar_saved_bytes;
    +  }
    +  return saved_bytes;
    +}
    +
    +
    +simdutf_warn_unused result implementation::convert_utf32_to_latin1_with_errors(const char32_t* buf, size_t len, char* latin1_output) const noexcept {
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
    +  std::pair ret = westmere::sse_convert_utf32_to_latin1_with_errors(buf, len, latin1_output);
    +  if (ret.first.count != len) {
    +    result scalar_res = scalar::utf32_to_latin1::convert_with_errors(
    +                                        buf + ret.first.count, len - ret.first.count, ret.second);
    +    if (scalar_res.error) {
    +      scalar_res.count += ret.first.count;
    +      return scalar_res;
    +    } else {
    +      ret.second += scalar_res.count;
    +    }
    +  }
    +  ret.first.count = ret.second - latin1_output;   // Set count to the number of 8-bit code units written
    +  return ret.first;
    +}
    +
    +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_latin1(const char32_t* buf, size_t len, char* latin1_output) const noexcept {
    +  // optimization opportunity: we could provide an optimized function.
    +  return convert_utf32_to_latin1(buf,len,latin1_output);
    +}
    +
     simdutf_warn_unused size_t implementation::convert_utf32_to_utf8(const char32_t* buf, size_t len, char* utf8_output) const noexcept {
       std::pair ret = sse_convert_utf32_to_utf8(buf, len, utf8_output);
       if (ret.first == nullptr) { return 0; }
    @@ -28356,7 +32923,7 @@ simdutf_warn_unused size_t implementation::convert_utf32_to_utf8(const char32_t*
     }
     
     simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors(const char32_t* buf, size_t len, char* utf8_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = westmere::sse_convert_utf32_to_utf8_with_errors(buf, len, utf8_output);
       if (ret.first.count != len) {
         result scalar_res = scalar::utf32_to_utf8::convert_with_errors(
    @@ -28368,7 +32935,7 @@ simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors(con
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf8_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf8_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
    @@ -28399,7 +32966,7 @@ simdutf_warn_unused size_t implementation::convert_utf16be_to_utf32(const char16
     }
     
     simdutf_warn_unused result implementation::convert_utf16le_to_utf32_with_errors(const char16_t* buf, size_t len, char32_t* utf32_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = westmere::sse_convert_utf16_to_utf32_with_errors(buf, len, utf32_output);
       if (ret.first.error) { return ret.first; }  // Can return directly since scalar fallback already found correct ret.first.count
       if (ret.first.count != len) { // All good so far, but not finished
    @@ -28412,12 +32979,12 @@ simdutf_warn_unused result implementation::convert_utf16le_to_utf32_with_errors(
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf32_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf32_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
     simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors(const char16_t* buf, size_t len, char32_t* utf32_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = westmere::sse_convert_utf16_to_utf32_with_errors(buf, len, utf32_output);
       if (ret.first.error) { return ret.first; }  // Can return directly since scalar fallback already found correct ret.first.count
       if (ret.first.count != len) { // All good so far, but not finished
    @@ -28430,7 +32997,7 @@ simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors(
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf32_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf32_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
    @@ -28465,7 +33032,7 @@ simdutf_warn_unused size_t implementation::convert_utf32_to_utf16be(const char32
     }
     
     simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors(const char32_t* buf, size_t len, char16_t* utf16_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = westmere::sse_convert_utf32_to_utf16_with_errors(buf, len, utf16_output);
       if (ret.first.count != len) {
         result scalar_res = scalar::utf32_to_utf16::convert_with_errors(
    @@ -28477,12 +33044,12 @@ simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors(
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf16_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf16_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
     simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors(const char32_t* buf, size_t len, char16_t* utf16_output) const noexcept {
    -  // ret.first.count is always the position in the buffer, not the number of words written even if finished
    +  // ret.first.count is always the position in the buffer, not the number of code units written even if finished
       std::pair ret = westmere::sse_convert_utf32_to_utf16_with_errors(buf, len, utf16_output);
       if (ret.first.count != len) {
         result scalar_res = scalar::utf32_to_utf16::convert_with_errors(
    @@ -28494,7 +33061,7 @@ simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors(
           ret.second += scalar_res.count;
         }
       }
    -  ret.first.count = ret.second - utf16_output;   // Set count to the number of 8-bit words written
    +  ret.first.count = ret.second - utf16_output;   // Set count to the number of 8-bit code units written
       return ret.first;
     }
     
    @@ -28530,6 +33097,18 @@ simdutf_warn_unused size_t implementation::count_utf8(const char * input, size_t
       return utf8::count_code_points(input, length);
     }
     
    +simdutf_warn_unused size_t implementation::latin1_length_from_utf8(const char* buf, size_t len) const noexcept {
    +  return count_utf8(buf,len);
    +}
    +
    +simdutf_warn_unused size_t implementation::latin1_length_from_utf16(size_t length) const noexcept {
    +  return scalar::utf16::latin1_length_from_utf16(length);
    +}
    +
    +simdutf_warn_unused size_t implementation::latin1_length_from_utf32(size_t length) const noexcept {
    +  return scalar::utf32::latin1_length_from_utf32(length);
    +}
    +
     simdutf_warn_unused size_t implementation::utf8_length_from_utf16le(const char16_t * input, size_t length) const noexcept {
       return utf16::utf8_length_from_utf16(input, length);
     }
    @@ -28538,6 +33117,61 @@ simdutf_warn_unused size_t implementation::utf8_length_from_utf16be(const char16
       return utf16::utf8_length_from_utf16(input, length);
     }
     
    +simdutf_warn_unused size_t implementation::utf16_length_from_latin1(size_t length) const noexcept {
    +  return scalar::latin1::utf16_length_from_latin1(length);
    +}
    +
    +simdutf_warn_unused size_t implementation::utf32_length_from_latin1(size_t length) const noexcept {
    +  return scalar::latin1::utf32_length_from_latin1(length);
    +}
    +
    +simdutf_warn_unused size_t implementation::utf8_length_from_latin1(const char * input, size_t len) const noexcept {
    +  const uint8_t *str = reinterpret_cast(input);
    +  size_t answer = len / sizeof(__m128i) * sizeof(__m128i);
    +  size_t i = 0;
    +  __m128i two_64bits = _mm_setzero_si128();
    +  while (i + sizeof(__m128i) <= len) {
    +    __m128i runner = _mm_setzero_si128();
    +    size_t iterations = (len - i) / sizeof(__m128i);
    +    if (iterations > 255) {
    +      iterations = 255;
    +    }
    +    size_t max_i = i + iterations * sizeof(__m128i) - sizeof(__m128i);
    +    for (; i + 4*sizeof(__m128i) <= max_i; i += 4*sizeof(__m128i)) {
    +      __m128i input1 = _mm_loadu_si128((const __m128i *)(str + i));
    +      __m128i input2 = _mm_loadu_si128((const __m128i *)(str + i + sizeof(__m128i)));
    +      __m128i input3 = _mm_loadu_si128((const __m128i *)(str + i + 2*sizeof(__m128i)));
    +      __m128i input4 = _mm_loadu_si128((const __m128i *)(str + i + 3*sizeof(__m128i)));
    +      __m128i input12 = _mm_add_epi8(
    +                                      _mm_cmpgt_epi8(
    +                                                    _mm_setzero_si128(), 
    +                                                    input1),
    +                                      _mm_cmpgt_epi8(
    +                                                    _mm_setzero_si128(),
    +                                                    input2));
    +      __m128i input34 = _mm_add_epi8(
    +                                      _mm_cmpgt_epi8(
    +                                                    _mm_setzero_si128(),
    +                                                    input3),
    +                                      _mm_cmpgt_epi8(
    +                                                    _mm_setzero_si128(),
    +                                                    input4));
    +      __m128i input1234 = _mm_add_epi8(input12, input34);
    +      runner = _mm_sub_epi8(runner, input1234);
    +    }
    +    for (; i <= max_i; i += sizeof(__m128i)) {
    +      __m128i more_input = _mm_loadu_si128((const __m128i *)(str + i));
    +      runner = _mm_sub_epi8(
    +          runner, _mm_cmpgt_epi8(_mm_setzero_si128(), more_input));
    +    }
    +    two_64bits = _mm_add_epi64(
    +        two_64bits, _mm_sad_epu8(runner, _mm_setzero_si128()));
    +  }
    +  answer += _mm_extract_epi64(two_64bits, 0) +
    +            _mm_extract_epi64(two_64bits, 1);
    +  return answer + scalar::latin1::utf8_length_from_latin1(reinterpret_cast(str + i), len - i);
    +}
    +
     simdutf_warn_unused size_t implementation::utf32_length_from_utf16le(const char16_t * input, size_t length) const noexcept {
       return utf16::utf32_length_from_utf16(input, length);
     }
    @@ -28592,13 +33226,12 @@ simdutf_warn_unused size_t implementation::utf16_length_from_utf32(const char32_
     }
     
     simdutf_warn_unused size_t implementation::utf32_length_from_utf8(const char * input, size_t length) const noexcept {
    -  return scalar::utf8::count_code_points(input, length);
    +  return utf8::count_code_points(input, length);
     }
     
     } // namespace westmere
     } // namespace simdutf
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/src, filename=simdutf/westmere/end.h
     /* begin file src/simdutf/westmere/end.h */
     #if SIMDUTF_CAN_ALWAYS_RUN_WESTMERE
     // nothing needed.
    diff --git a/deps/simdutf/simdutf.h b/deps/simdutf/simdutf.h
    index 6ab1c34d7b30a7..f4db9217e2a946 100644
    --- a/deps/simdutf/simdutf.h
    +++ b/deps/simdutf/simdutf.h
    @@ -1,11 +1,9 @@
    -/* auto-generated on 2023-10-08 13:48:09 -0400. Do not edit! */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/include, filename=simdutf.h
    +/* auto-generated on 2023-12-01 13:59:01 -0500. Do not edit! */
     /* begin file include/simdutf.h */
     #ifndef SIMDUTF_H
     #define SIMDUTF_H
     #include 
     
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/include, filename=simdutf/compiler_check.h
     /* begin file include/simdutf/compiler_check.h */
     #ifndef SIMDUTF_COMPILER_CHECK_H
     #define SIMDUTF_COMPILER_CHECK_H
    @@ -43,13 +41,11 @@
     
     #endif // SIMDUTF_COMPILER_CHECK_H
     /* end file include/simdutf/compiler_check.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/include, filename=simdutf/common_defs.h
     /* begin file include/simdutf/common_defs.h */
     #ifndef SIMDUTF_COMMON_DEFS_H
     #define SIMDUTF_COMMON_DEFS_H
     
     #include 
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/include, filename=simdutf/portability.h
     /* begin file include/simdutf/portability.h */
     #ifndef SIMDUTF_PORTABILITY_H
     #define SIMDUTF_PORTABILITY_H
    @@ -167,11 +163,8 @@
     
     #ifdef SIMDUTF_IS_32BITS
     #ifndef SIMDUTF_NO_PORTABILITY_WARNING
    -#pragma message("The simdutf library is designed \
    -for 64-bit processors and it seems that you are not \
    -compiling for a known 64-bit platform. All fast kernels \
    -will be disabled and performance may be poor. Please \
    -use a 64-bit target such as x64, 64-bit ARM or 64-bit PPC.")
    +// In the future, we may want to warn users of 32-bit systems that
    +// the simdutf does not support accelerated kernels for such systems.
     #endif // SIMDUTF_NO_PORTABILITY_WARNING
     #endif // SIMDUTF_IS_32BITS
     
    @@ -280,7 +273,6 @@ use a 64-bit target such as x64, 64-bit ARM or 64-bit PPC.")
     
     #endif // SIMDUTF_PORTABILITY_H
     /* end file include/simdutf/portability.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/include, filename=simdutf/avx512.h
     /* begin file include/simdutf/avx512.h */
     #ifndef SIMDUTF_AVX512_H_
     #define SIMDUTF_AVX512_H_
    @@ -483,7 +475,6 @@ use a 64-bit target such as x64, 64-bit ARM or 64-bit PPC.")
     
     #endif // SIMDUTF_COMMON_DEFS_H
     /* end file include/simdutf/common_defs.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/include, filename=simdutf/encoding_types.h
     /* begin file include/simdutf/encoding_types.h */
     #include 
     
    @@ -495,13 +486,14 @@ enum encoding_type {
             UTF16_BE = 4,   // BOM 0xfe 0xff
             UTF32_LE = 8,   // BOM 0xff 0xfe 0x00 0x00
             UTF32_BE = 16,   // BOM 0x00 0x00 0xfe 0xff
    +        Latin1 = 32,
     
             unspecified = 0
     };
     
     enum endianness {
    -        LITTLE,
    -        BIG
    +        LITTLE = 0,
    +        BIG = 1
     };
     
     bool match_system(endianness e);
    @@ -514,7 +506,7 @@ namespace BOM {
     /**
      * Checks for a BOM. If not, returns unspecified
      * @param input         the string to process
    - * @param length        the length of the string in words
    + * @param length        the length of the string in code units
      * @return the corresponding encoding
      */
     
    @@ -531,10 +523,9 @@ size_t bom_byte_size(encoding_type bom);
     } // BOM namespace
     } // simdutf namespace
     /* end file include/simdutf/encoding_types.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/include, filename=simdutf/error.h
     /* begin file include/simdutf/error.h */
    -#ifndef ERROR_H
    -#define ERROR_H
    +#ifndef SIMDUTF_ERROR_H
    +#define SIMDUTF_ERROR_H
     namespace simdutf {
     
     enum error_code {
    @@ -545,15 +536,16 @@ enum error_code {
       TOO_LONG,     // We either have too many consecutive continuation bytes or the string starts with a continuation byte.
       OVERLONG,     // The decoded character must be above U+7F for two-byte characters, U+7FF for three-byte characters,
                     // and U+FFFF for four-byte characters.
    -  TOO_LARGE,    // The decoded character must be less than or equal to U+10FFFF OR less than or equal than U+7F for ASCII.
    +  TOO_LARGE,    // The decoded character must be less than or equal to U+10FFFF,less than or equal than U+7F for ASCII OR less than equal than U+FF for Latin1
       SURROGATE,    // The decoded character must be not be in U+D800...DFFF (UTF-8 or UTF-32) OR
    -                // a high surrogate must be followed by a low surrogate and a low surrogate must be preceded by a high surrogate (UTF-16)
    +                // a high surrogate must be followed by a low surrogate and a low surrogate must be preceded by a high surrogate (UTF-16) OR
    +                // there must be no surrogate at all (Latin1)
       OTHER         // Not related to validation/transcoding.
     };
     
     struct result {
       error_code error;
    -  size_t count;     // In case of error, indicates the position of the error. In case of success, indicates the number of words validated/written.
    +  size_t count;     // In case of error, indicates the position of the error. In case of success, indicates the number of code units validated/written.
     
       simdutf_really_inline result();
     
    @@ -568,7 +560,6 @@ SIMDUTF_PUSH_DISABLE_WARNINGS
     SIMDUTF_DISABLE_UNDESIRED_WARNINGS
     
     // Public API
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/include, filename=simdutf/simdutf_version.h
     /* begin file include/simdutf/simdutf_version.h */
     // /include/simdutf/simdutf_version.h automatically generated by release.py,
     // do not change by hand
    @@ -576,28 +567,27 @@ SIMDUTF_DISABLE_UNDESIRED_WARNINGS
     #define SIMDUTF_SIMDUTF_VERSION_H
     
     /** The version of simdutf being used (major.minor.revision) */
    -#define SIMDUTF_VERSION "3.2.18"
    +#define SIMDUTF_VERSION "4.0.8"
     
     namespace simdutf {
     enum {
       /**
        * The major version (MAJOR.minor.revision) of simdutf being used.
        */
    -  SIMDUTF_VERSION_MAJOR = 3,
    +  SIMDUTF_VERSION_MAJOR = 4,
       /**
        * The minor version (major.MINOR.revision) of simdutf being used.
        */
    -  SIMDUTF_VERSION_MINOR = 2,
    +  SIMDUTF_VERSION_MINOR = 0,
       /**
        * The revision (major.minor.REVISION) of simdutf being used.
        */
    -  SIMDUTF_VERSION_REVISION = 18
    +  SIMDUTF_VERSION_REVISION = 8
     };
     } // namespace simdutf
     
     #endif // SIMDUTF_SIMDUTF_VERSION_H
     /* end file include/simdutf/simdutf_version.h */
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/include, filename=simdutf/implementation.h
     /* begin file include/simdutf/implementation.h */
     #ifndef SIMDUTF_IMPLEMENTATION_H
     #define SIMDUTF_IMPLEMENTATION_H
    @@ -607,7 +597,6 @@ enum {
     #endif
     #include 
     #include 
    -// dofile: invoked with prepath=/Users/dlemire/CVS/github/simdutf/include, filename=simdutf/internal/isadetection.h
     /* begin file include/simdutf/internal/isadetection.h */
     /* From
     https://github.com/endorno/pytorch/blob/master/torch/lib/TH/generic/simd/simd.h
    @@ -685,7 +674,8 @@ enum instruction_set {
       AVX512CD = 0x2000,
       AVX512BW = 0x4000,
       AVX512VL = 0x8000,
    -  AVX512VBMI2 = 0x10000
    +  AVX512VBMI2 = 0x10000,
    +  AVX512VPOPCNTDQ = 0x2000
     };
     
     #if defined(__PPC64__)
    @@ -840,6 +830,9 @@ static inline uint32_t detect_supported_architectures() {
       if (ecx & cpuid_bit::ecx::avx512vbmi2) {
         host_isa |= instruction_set::AVX512VBMI2;
       }
    +  if (ecx & cpuid_bit::ecx::avx512vpopcnt) {
    +    host_isa |= instruction_set::AVX512VPOPCNTDQ;
    +  }
       return host_isa;
     }
     #else // fallback
    @@ -892,7 +885,6 @@ simdutf_really_inline simdutf_warn_unused int detect_encodings(const uint8_t * i
       return detect_encodings(reinterpret_cast(input), length);
     }
     
    -
     /**
      * Validate the UTF-8 string. This function may be best when you expect
      * the input to be almost always valid. Otherwise, consider using
    @@ -913,7 +905,7 @@ simdutf_warn_unused bool validate_utf8(const char *buf, size_t len) noexcept;
      *
      * @param buf the UTF-8 string to validate.
      * @param len the length of the string in bytes.
    - * @return a result pair struct with an error code and either the position of the error if any or the number of words validated if successful.
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of code units validated if successful.
      */
     simdutf_warn_unused result validate_utf8_with_errors(const char *buf, size_t len) noexcept;
     
    @@ -936,7 +928,7 @@ simdutf_warn_unused bool validate_ascii(const char *buf, size_t len) noexcept;
      *
      * @param buf the ASCII string to validate.
      * @param len the length of the string in bytes.
    - * @return a result pair struct with an error code and either the position of the error if any or the number of words validated if successful.
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of code units validated if successful.
      */
     simdutf_warn_unused result validate_ascii_with_errors(const char *buf, size_t len) noexcept;
     
    @@ -950,7 +942,7 @@ simdutf_warn_unused result validate_ascii_with_errors(const char *buf, size_t le
      * This function is not BOM-aware.
      *
      * @param buf the UTF-16 string to validate.
    - * @param len the length of the string in number of 2-byte words (char16_t).
    + * @param len the length of the string in number of 2-byte code units (char16_t).
      * @return true if and only if the string is valid UTF-16.
      */
     simdutf_warn_unused bool validate_utf16(const char16_t *buf, size_t len) noexcept;
    @@ -965,7 +957,7 @@ simdutf_warn_unused bool validate_utf16(const char16_t *buf, size_t len) noexcep
      * This function is not BOM-aware.
      *
      * @param buf the UTF-16LE string to validate.
    - * @param len the length of the string in number of 2-byte words (char16_t).
    + * @param len the length of the string in number of 2-byte code units (char16_t).
      * @return true if and only if the string is valid UTF-16LE.
      */
     simdutf_warn_unused bool validate_utf16le(const char16_t *buf, size_t len) noexcept;
    @@ -980,7 +972,7 @@ simdutf_warn_unused bool validate_utf16le(const char16_t *buf, size_t len) noexc
      * This function is not BOM-aware.
      *
      * @param buf the UTF-16BE string to validate.
    - * @param len the length of the string in number of 2-byte words (char16_t).
    + * @param len the length of the string in number of 2-byte code units (char16_t).
      * @return true if and only if the string is valid UTF-16BE.
      */
     simdutf_warn_unused bool validate_utf16be(const char16_t *buf, size_t len) noexcept;
    @@ -994,8 +986,8 @@ simdutf_warn_unused bool validate_utf16be(const char16_t *buf, size_t len) noexc
      * This function is not BOM-aware.
      *
      * @param buf the UTF-16 string to validate.
    - * @param len the length of the string in number of 2-byte words (char16_t).
    - * @return a result pair struct with an error code and either the position of the error if any or the number of words validated if successful.
    + * @param len the length of the string in number of 2-byte code units (char16_t).
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of code units validated if successful.
      */
     simdutf_warn_unused result validate_utf16_with_errors(const char16_t *buf, size_t len) noexcept;
     
    @@ -1008,8 +1000,8 @@ simdutf_warn_unused result validate_utf16_with_errors(const char16_t *buf, size_
      * This function is not BOM-aware.
      *
      * @param buf the UTF-16LE string to validate.
    - * @param len the length of the string in number of 2-byte words (char16_t).
    - * @return a result pair struct with an error code and either the position of the error if any or the number of words validated if successful.
    + * @param len the length of the string in number of 2-byte code units (char16_t).
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of code units validated if successful.
      */
     simdutf_warn_unused result validate_utf16le_with_errors(const char16_t *buf, size_t len) noexcept;
     
    @@ -1022,8 +1014,8 @@ simdutf_warn_unused result validate_utf16le_with_errors(const char16_t *buf, siz
      * This function is not BOM-aware.
      *
      * @param buf the UTF-16BE string to validate.
    - * @param len the length of the string in number of 2-byte words (char16_t).
    - * @return a result pair struct with an error code and either the position of the error if any or the number of words validated if successful.
    + * @param len the length of the string in number of 2-byte code units (char16_t).
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of code units validated if successful.
      */
     simdutf_warn_unused result validate_utf16be_with_errors(const char16_t *buf, size_t len) noexcept;
     
    @@ -1037,7 +1029,7 @@ simdutf_warn_unused result validate_utf16be_with_errors(const char16_t *buf, siz
      * This function is not BOM-aware.
      *
      * @param buf the UTF-32 string to validate.
    - * @param len the length of the string in number of 4-byte words (char32_t).
    + * @param len the length of the string in number of 4-byte code units (char32_t).
      * @return true if and only if the string is valid UTF-32.
      */
     simdutf_warn_unused bool validate_utf32(const char32_t *buf, size_t len) noexcept;
    @@ -1051,13 +1043,75 @@ simdutf_warn_unused bool validate_utf32(const char32_t *buf, size_t len) noexcep
      * This function is not BOM-aware.
      *
      * @param buf the UTF-32 string to validate.
    - * @param len the length of the string in number of 4-byte words (char32_t).
    - * @return a result pair struct with an error code and either the position of the error if any or the number of words validated if successful.
    + * @param len the length of the string in number of 4-byte code units (char32_t).
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of code units validated if successful.
      */
     simdutf_warn_unused result validate_utf32_with_errors(const char32_t *buf, size_t len) noexcept;
     
    +  /**
    +   * Convert Latin1 string into UTF8 string.
    +   *
    +   * This function is suitable to work with inputs from untrusted sources.
    +   *
    +   * @param input         the Latin1 string to convert
    +   * @param length        the length of the string in bytes
    +   * @param latin1_output  the pointer to buffer that can hold conversion result
    +   * @return the number of written char; 0 if conversion is not possible
    +   */
    +  simdutf_warn_unused size_t convert_latin1_to_utf8(const char * input, size_t length, char* utf8_output) noexcept;
    +
    +
    +    /**
    +   * Convert possibly Latin1 string into UTF-16LE string.
    +   *
    +   * This function is suitable to work with inputs from untrusted sources.
    +   *
    +   * @param input         the Latin1  string to convert
    +   * @param length        the length of the string in bytes
    +   * @param utf16_buffer  the pointer to buffer that can hold conversion result
    +   * @return the number of written char16_t; 0 if conversion is not possible
    +   */
    +  simdutf_warn_unused size_t convert_latin1_to_utf16le(const char * input, size_t length, char16_t* utf16_output) noexcept;
    +
    +  /**
    +   * Convert Latin1 string into UTF-16BE string.
    +   *
    +   * This function is suitable to work with inputs from untrusted sources.
    +   *
    +   * @param input         the Latin1 string to convert
    +   * @param length        the length of the string in bytes
    +   * @param utf16_buffer  the pointer to buffer that can hold conversion result
    +   * @return the number of written char16_t; 0 if conversion is not possible
    +   */
    +  simdutf_warn_unused size_t convert_latin1_to_utf16be(const char * input, size_t length, char16_t* utf16_output) noexcept;
    +
    +  /**
    +   * Convert Latin1 string into UTF-32 string.
    +   *
    +   * This function is suitable to work with inputs from untrusted sources.
    +   *
    +   * @param input         the Latin1 string to convert
    +   * @param length        the length of the string in bytes
    +   * @param utf32_buffer  the pointer to buffer that can hold conversion result
    +   * @return the number of written char32_t; 0 if conversion is not possible
    +   */
    +  simdutf_warn_unused size_t convert_latin1_to_utf32(const char * input, size_t length, char32_t* utf32_buffer) noexcept;
    +
    + /**
    +   * Convert possibly broken UTF-8 string into latin1 string.
    +   *
    +   * During the conversion also validation of the input string is done.
    +   * This function is suitable to work with inputs from untrusted sources.
    +   *
    +   * @param input         the UTF-8 string to convert
    +   * @param length        the length of the string in bytes
    +   * @param latin1_output  the pointer to buffer that can hold conversion result
    +   * @return the number of written char; 0 if the input was not valid UTF-8 string
    +   */
    +  simdutf_warn_unused size_t convert_utf8_to_latin1(const char * input, size_t length, char* latin1_output) noexcept;
    +
     /**
    - * Using native endianness; Convert possibly broken UTF-8 string into UTF-16 string.
    + * Using native endianness, convert possibly broken UTF-8 string into a UTF-16 string.
      *
      * During the conversion also validation of the input string is done.
      * This function is suitable to work with inputs from untrusted sources.
    @@ -1069,6 +1123,17 @@ simdutf_warn_unused result validate_utf32_with_errors(const char32_t *buf, size_
      */
     simdutf_warn_unused size_t convert_utf8_to_utf16(const char * input, size_t length, char16_t* utf16_output) noexcept;
     
    +
    +/**
    + * Using native endianness, convert a Latin1 string into a UTF-16 string.
    + *
    + * @param input         the UTF-8 string to convert
    + * @param length        the length of the string in bytes
    + * @param utf16_buffer  the pointer to buffer that can hold conversion result
    + * @return the number of written char16_t.
    + */
    +simdutf_warn_unused size_t convert_latin1_to_utf16(const char * input, size_t length, char16_t* utf16_output) noexcept;
    +
     /**
      * Convert possibly broken UTF-8 string into UTF-16LE string.
      *
    @@ -1095,8 +1160,22 @@ simdutf_warn_unused size_t convert_utf8_to_utf16le(const char * input, size_t le
      */
     simdutf_warn_unused size_t convert_utf8_to_utf16be(const char * input, size_t length, char16_t* utf16_output) noexcept;
     
    +
    +  /**
    +   * Convert possibly broken UTF-8 string into latin1 string with errors.
    +   *
    +   * During the conversion also validation of the input string is done.
    +   * This function is suitable to work with inputs from untrusted sources.
    +   *
    +   * @param input         the UTF-8 string to convert
    +   * @param length        the length of the string in bytes
    +   * @param latin1_output  the pointer to buffer that can hold conversion result
    +   * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of code units validated if successful.
    +   */
    +  simdutf_warn_unused result convert_utf8_to_latin1_with_errors(const char * input, size_t length, char* latin1_output) noexcept;
    +
     /**
    - * Using native endianness; Convert possibly broken UTF-8 string into UTF-16
    + * Using native endianness, convert possibly broken UTF-8 string into UTF-16
      * string and stop on error.
      *
      * During the conversion also validation of the input string is done.
    @@ -1105,7 +1184,7 @@ simdutf_warn_unused size_t convert_utf8_to_utf16be(const char * input, size_t le
      * @param input         the UTF-8 string to convert
      * @param length        the length of the string in bytes
      * @param utf16_buffer  the pointer to buffer that can hold conversion result
    - * @return a result pair struct with an error code and either the position of the error if any or the number of char16_t written if successful.
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char16_t written if successful.
      */
     simdutf_warn_unused result convert_utf8_to_utf16_with_errors(const char * input, size_t length, char16_t* utf16_output) noexcept;
     
    @@ -1118,7 +1197,7 @@ simdutf_warn_unused result convert_utf8_to_utf16_with_errors(const char * input,
      * @param input         the UTF-8 string to convert
      * @param length        the length of the string in bytes
      * @param utf16_buffer  the pointer to buffer that can hold conversion result
    - * @return a result pair struct with an error code and either the position of the error if any or the number of char16_t written if successful.
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char16_t written if successful.
      */
     simdutf_warn_unused result convert_utf8_to_utf16le_with_errors(const char * input, size_t length, char16_t* utf16_output) noexcept;
     
    @@ -1131,7 +1210,7 @@ simdutf_warn_unused result convert_utf8_to_utf16le_with_errors(const char * inpu
      * @param input         the UTF-8 string to convert
      * @param length        the length of the string in bytes
      * @param utf16_buffer  the pointer to buffer that can hold conversion result
    - * @return a result pair struct with an error code and either the position of the error if any or the number of char16_t written if successful.
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char16_t written if successful.
      */
     simdutf_warn_unused result convert_utf8_to_utf16be_with_errors(const char * input, size_t length, char16_t* utf16_output) noexcept;
     
    @@ -1157,12 +1236,27 @@ simdutf_warn_unused size_t convert_utf8_to_utf32(const char * input, size_t leng
      * @param input         the UTF-8 string to convert
      * @param length        the length of the string in bytes
      * @param utf32_buffer  the pointer to buffer that can hold conversion result
    - * @return a result pair struct with an error code and either the position of the error if any or the number of char32_t written if successful.
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char32_t written if successful.
      */
     simdutf_warn_unused result convert_utf8_to_utf32_with_errors(const char * input, size_t length, char32_t* utf32_output) noexcept;
     
    +    /**
    +   * Convert valid UTF-8 string into latin1 string.
    +   *
    +   * This function assumes that the input string is valid UTF-8.
    +   *
    +   * This function is not BOM-aware.
    +   *
    +   * @param input         the UTF-8 string to convert
    +   * @param length        the length of the string in bytes
    +   * @param latin1_output  the pointer to buffer that can hold conversion result
    +   * @return the number of written char; 0 if the input was not valid UTF-8 string
    +   */
    +  simdutf_warn_unused size_t convert_valid_utf8_to_latin1(const char * input, size_t length, char* latin1_output) noexcept;
    +
    +
     /**
    - * Using native endianness; Convert valid UTF-8 string into UTF-16 string.
    + * Using native endianness, convert valid UTF-8 string into a UTF-16 string.
      *
      * This function assumes that the input string is valid UTF-8.
      *
    @@ -1209,8 +1303,31 @@ simdutf_warn_unused size_t convert_valid_utf8_to_utf16be(const char * input, siz
      */
     simdutf_warn_unused size_t convert_valid_utf8_to_utf32(const char * input, size_t length, char32_t* utf32_buffer) noexcept;
     
    +
    +/**
    + * Return the number of bytes that this Latin1 string would require in UTF-8 format.
    + *
    + * @param input         the Latin1 string to convert
    + * @param length        the length of the string bytes
    + * @return the number of bytes required to encode the Latin1 string as UTF-8
    + */
    +simdutf_warn_unused size_t utf8_length_from_latin1(const char * input, size_t length) noexcept;
    +
     /**
    - * Compute the number of 2-byte words that this UTF-8 string would require in UTF-16LE format.
    + * Compute the number of bytes that this UTF-8 string would require in Latin1 format.
    + *
    + * This function does not validate the input.
    + *
    + * This function is not BOM-aware.
    + *
    + * @param input         the UTF-8 string to convert
    + * @param length        the length of the string in byte
    + * @return the number of bytes required to encode the UTF-8 string as Latin1
    + */
    +simdutf_warn_unused size_t latin1_length_from_utf8(const char * input, size_t length) noexcept;
    +
    +/**
    + * Compute the number of 2-byte code units that this UTF-8 string would require in UTF-16LE format.
      *
      * This function does not validate the input.
      *
    @@ -1218,12 +1335,12 @@ simdutf_warn_unused size_t convert_valid_utf8_to_utf32(const char * input, size_
      *
      * @param input         the UTF-8 string to process
      * @param length        the length of the string in bytes
    - * @return the number of char16_t words required to encode the UTF-8 string as UTF-16LE
    + * @return the number of char16_t code units required to encode the UTF-8 string as UTF-16LE
      */
     simdutf_warn_unused size_t utf16_length_from_utf8(const char * input, size_t length) noexcept;
     
     /**
    - * Compute the number of 4-byte words that this UTF-8 string would require in UTF-32 format.
    + * Compute the number of 4-byte code units that this UTF-8 string would require in UTF-32 format.
      *
      * This function is equivalent to count_utf8
      *
    @@ -1233,12 +1350,12 @@ simdutf_warn_unused size_t utf16_length_from_utf8(const char * input, size_t len
      *
      * @param input         the UTF-8 string to process
      * @param length        the length of the string in bytes
    - * @return the number of char32_t words required to encode the UTF-8 string as UTF-32
    + * @return the number of char32_t code units required to encode the UTF-8 string as UTF-32
      */
     simdutf_warn_unused size_t utf32_length_from_utf8(const char * input, size_t length) noexcept;
     
     /**
    - * Using native endianness; Convert possibly broken UTF-16 string into UTF-8 string.
    + * Using native endianness, convert possibly broken UTF-16 string into UTF-8 string.
      *
      * During the conversion also validation of the input string is done.
      * This function is suitable to work with inputs from untrusted sources.
    @@ -1246,12 +1363,60 @@ simdutf_warn_unused size_t utf32_length_from_utf8(const char * input, size_t len
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16 string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @param utf8_buffer   the pointer to buffer that can hold conversion result
    - * @return number of written words; 0 if input is not a valid UTF-16LE string
    + * @return number of written code units; 0 if input is not a valid UTF-16LE string
      */
     simdutf_warn_unused size_t convert_utf16_to_utf8(const char16_t * input, size_t length, char* utf8_buffer) noexcept;
     
    +
    +
    +/**
    + * Using native endianness, convert possibly broken UTF-16 string into Latin1 string.
    + *
    + * During the conversion also validation of the input string is done.
    + * This function is suitable to work with inputs from untrusted sources.
    + *
    + * This function is not BOM-aware.
    + *
    + * @param input         the UTF-16 string to convert
    + * @param length        the length of the string in 2-byte code units (char16_t)
    + * @param latin1_buffer   the pointer to buffer that can hold conversion result
    + * @return number of written code units; 0 if input is not a valid UTF-16LE string
    + */
    +simdutf_warn_unused size_t convert_utf16_to_latin1(const char16_t * input, size_t length, char* latin1_buffer) noexcept;
    +
    +/**
    + * Convert possibly broken UTF-16LE string into Latin1 string.
    + *
    + * During the conversion also validation of the input string is done.
    + * This function is suitable to work with inputs from untrusted sources.
    + *
    + * This function is not BOM-aware.
    + *
    + * @param input         the UTF-16LE string to convert
    + * @param length        the length of the string in 2-byte code units (char16_t)
    + * @param latin1_buffer   the pointer to buffer that can hold conversion result
    + * @return number of written code units; 0 if input is not a valid UTF-16LE string
    + */
    +simdutf_warn_unused size_t convert_utf16le_to_latin1(const char16_t * input, size_t length, char* latin1_buffer) noexcept;
    +
    +/**
    + * Convert possibly broken UTF-16BE string into Latin1 string.
    + *
    + * During the conversion also validation of the input string is done.
    + * This function is suitable to work with inputs from untrusted sources.
    + *
    + * This function is not BOM-aware.
    + *
    + * @param input         the UTF-16BE string to convert
    + * @param length        the length of the string in 2-byte code units (char16_t)
    + * @param latin1_buffer   the pointer to buffer that can hold conversion result
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char written if successful.
    + */
    +simdutf_warn_unused size_t convert_utf16be_to_latin1(const char16_t * input, size_t length, char* latin1_buffer) noexcept;
    +
    +
     /**
      * Convert possibly broken UTF-16LE string into UTF-8 string.
      *
    @@ -1261,9 +1426,9 @@ simdutf_warn_unused size_t convert_utf16_to_utf8(const char16_t * input, size_t
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16LE string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @param utf8_buffer   the pointer to buffer that can hold conversion result
    - * @return number of written words; 0 if input is not a valid UTF-16LE string
    + * @return number of written code units; 0 if input is not a valid UTF-16LE string
      */
     simdutf_warn_unused size_t convert_utf16le_to_utf8(const char16_t * input, size_t length, char* utf8_buffer) noexcept;
     
    @@ -1276,14 +1441,57 @@ simdutf_warn_unused size_t convert_utf16le_to_utf8(const char16_t * input, size_
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16BE string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @param utf8_buffer   the pointer to buffer that can hold conversion result
    - * @return number of written words; 0 if input is not a valid UTF-16LE string
    + * @return number of written code units; 0 if input is not a valid UTF-16LE string
      */
     simdutf_warn_unused size_t convert_utf16be_to_utf8(const char16_t * input, size_t length, char* utf8_buffer) noexcept;
     
     /**
    - * Using native endianness; Convert possibly broken UTF-16 string into UTF-8 string and stop on error.
    + * Using native endianness, convert possibly broken UTF-16 string into Latin1 string.
    + *
    + * During the conversion also validation of the input string is done.
    + * This function is suitable to work with inputs from untrusted sources.
    + * This function is not BOM-aware.
    + *
    + * @param input         the UTF-16 string to convert
    + * @param length        the length of the string in 2-byte code units (char16_t)
    + * @param latin1_buffer   the pointer to buffer that can hold conversion result
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char written if successful.
    + */
    +simdutf_warn_unused result convert_utf16_to_latin1_with_errors(const char16_t * input, size_t length, char* latin1_buffer) noexcept;
    +
    +/**
    + * Convert possibly broken UTF-16LE string into Latin1 string.
    + *
    + * During the conversion also validation of the input string is done.
    + * This function is suitable to work with inputs from untrusted sources.
    + * This function is not BOM-aware.
    + *
    + * @param input         the UTF-16LE string to convert
    + * @param length        the length of the string in 2-byte code units (char16_t)
    + * @param latin1_buffer   the pointer to buffer that can hold conversion result
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char written if successful.
    + */
    +simdutf_warn_unused result convert_utf16le_to_latin1_with_errors(const char16_t * input, size_t length, char* latin1_buffer) noexcept;
    +
    +/**
    + * Convert possibly broken UTF-16BE string into Latin1 string.
    + *
    + * During the conversion also validation of the input string is done.
    + * This function is suitable to work with inputs from untrusted sources.
    + * This function is not BOM-aware.
    + *
    + * @param input         the UTF-16BE string to convert
    + * @param length        the length of the string in 2-byte code units (char16_t)
    + * @param latin1_buffer   the pointer to buffer that can hold conversion result
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char written if successful.
    + */
    +simdutf_warn_unused result convert_utf16be_to_latin1_with_errors(const char16_t * input, size_t length, char* latin1_buffer) noexcept;
    +
    +
    +/**
    + * Using native endianness, convert possibly broken UTF-16 string into UTF-8 string and stop on error.
      *
      * During the conversion also validation of the input string is done.
      * This function is suitable to work with inputs from untrusted sources.
    @@ -1291,9 +1499,9 @@ simdutf_warn_unused size_t convert_utf16be_to_utf8(const char16_t * input, size_
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16 string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @param utf8_buffer   the pointer to buffer that can hold conversion result
    - * @return a result pair struct with an error code and either the position of the error if any or the number of char written if successful.
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char written if successful.
      */
     simdutf_warn_unused result convert_utf16_to_utf8_with_errors(const char16_t * input, size_t length, char* utf8_buffer) noexcept;
     
    @@ -1306,9 +1514,9 @@ simdutf_warn_unused result convert_utf16_to_utf8_with_errors(const char16_t * in
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16LE string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @param utf8_buffer   the pointer to buffer that can hold conversion result
    - * @return a result pair struct with an error code and either the position of the error if any or the number of char written if successful.
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char written if successful.
      */
     simdutf_warn_unused result convert_utf16le_to_utf8_with_errors(const char16_t * input, size_t length, char* utf8_buffer) noexcept;
     
    @@ -1321,26 +1529,70 @@ simdutf_warn_unused result convert_utf16le_to_utf8_with_errors(const char16_t *
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16BE string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @param utf8_buffer   the pointer to buffer that can hold conversion result
    - * @return a result pair struct with an error code and either the position of the error if any or the number of char written if successful.
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char written if successful.
      */
     simdutf_warn_unused result convert_utf16be_to_utf8_with_errors(const char16_t * input, size_t length, char* utf8_buffer) noexcept;
     
     /**
    - * Using native endianness; Convert valid UTF-16 string into UTF-8 string.
    + * Using native endianness, convert valid UTF-16 string into UTF-8 string.
      *
      * This function assumes that the input string is valid UTF-16LE.
      *
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16 string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @param utf8_buffer   the pointer to buffer that can hold the conversion result
    - * @return number of written words; 0 if conversion is not possible
    + * @return number of written code units; 0 if conversion is not possible
      */
     simdutf_warn_unused size_t convert_valid_utf16_to_utf8(const char16_t * input, size_t length, char* utf8_buffer) noexcept;
     
    +
    +/**
    + * Using native endianness, convert UTF-16 string into Latin1 string.
    + *
    + * This function assumes that the input string is valid UTF-8.
    + *
    + * This function is not BOM-aware.
    + *
    + * @param input         the UTF-16 string to convert
    + * @param length        the length of the string in 2-byte code units (char16_t)
    + * @param latin1_buffer   the pointer to buffer that can hold conversion result
    + * @return number of written code units; 0 if conversion is not possible
    + */
    +simdutf_warn_unused size_t convert_valid_utf16_to_latin1(const char16_t * input, size_t length, char* latin1_buffer) noexcept;
    +
    +/**
    + * Convert valid UTF-16LE string into Latin1 string.
    + *
    + * This function assumes that the input string is valid UTF-16LE.
    + *
    + * This function is not BOM-aware.
    + *
    + * @param input         the UTF-16LE string to convert
    + * @param length        the length of the string in 2-byte code units (char16_t)
    + * @param latin1_buffer   the pointer to buffer that can hold conversion result
    + * @return number of written code units; 0 if conversion is not possible
    + */
    +simdutf_warn_unused size_t convert_valid_utf16le_to_latin1(const char16_t * input, size_t length, char* latin1_buffer) noexcept;
    +
    +/**
    + * Convert valid UTF-16BE string into Latin1 string.
    + *
    + * This function assumes that the input string is valid UTF-16BE.
    + *
    + * This function is not BOM-aware.
    + *
    + * @param input         the UTF-16BE string to convert
    + * @param length        the length of the string in 2-byte code units (char16_t)
    + * @param latin1_buffer   the pointer to buffer that can hold conversion result
    + * @return number of written code units; 0 if conversion is not possible
    + */
    +simdutf_warn_unused size_t convert_valid_utf16be_to_latin1(const char16_t * input, size_t length, char* latin1_buffer) noexcept;
    +
    +
     /**
      * Convert valid UTF-16LE string into UTF-8 string.
      *
    @@ -1349,9 +1601,9 @@ simdutf_warn_unused size_t convert_valid_utf16_to_utf8(const char16_t * input, s
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16LE string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @param utf8_buffer   the pointer to buffer that can hold the conversion result
    - * @return number of written words; 0 if conversion is not possible
    + * @return number of written code units; 0 if conversion is not possible
      */
     simdutf_warn_unused size_t convert_valid_utf16le_to_utf8(const char16_t * input, size_t length, char* utf8_buffer) noexcept;
     
    @@ -1363,14 +1615,14 @@ simdutf_warn_unused size_t convert_valid_utf16le_to_utf8(const char16_t * input,
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16BE string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @param utf8_buffer   the pointer to buffer that can hold the conversion result
    - * @return number of written words; 0 if conversion is not possible
    + * @return number of written code units; 0 if conversion is not possible
      */
     simdutf_warn_unused size_t convert_valid_utf16be_to_utf8(const char16_t * input, size_t length, char* utf8_buffer) noexcept;
     
     /**
    - * Using native endianness; Convert possibly broken UTF-16 string into UTF-32 string.
    + * Using native endianness, convert possibly broken UTF-16 string into UTF-32 string.
      *
      * During the conversion also validation of the input string is done.
      * This function is suitable to work with inputs from untrusted sources.
    @@ -1378,9 +1630,9 @@ simdutf_warn_unused size_t convert_valid_utf16be_to_utf8(const char16_t * input,
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16 string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @param utf32_buffer   the pointer to buffer that can hold conversion result
    - * @return number of written words; 0 if input is not a valid UTF-16LE string
    + * @return number of written code units; 0 if input is not a valid UTF-16LE string
      */
     simdutf_warn_unused size_t convert_utf16_to_utf32(const char16_t * input, size_t length, char32_t* utf32_buffer) noexcept;
     
    @@ -1393,9 +1645,9 @@ simdutf_warn_unused size_t convert_utf16_to_utf32(const char16_t * input, size_t
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16LE string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @param utf32_buffer   the pointer to buffer that can hold conversion result
    - * @return number of written words; 0 if input is not a valid UTF-16LE string
    + * @return number of written code units; 0 if input is not a valid UTF-16LE string
      */
     simdutf_warn_unused size_t convert_utf16le_to_utf32(const char16_t * input, size_t length, char32_t* utf32_buffer) noexcept;
     
    @@ -1408,14 +1660,14 @@ simdutf_warn_unused size_t convert_utf16le_to_utf32(const char16_t * input, size
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16BE string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @param utf32_buffer   the pointer to buffer that can hold conversion result
    - * @return number of written words; 0 if input is not a valid UTF-16LE string
    + * @return number of written code units; 0 if input is not a valid UTF-16LE string
      */
     simdutf_warn_unused size_t convert_utf16be_to_utf32(const char16_t * input, size_t length, char32_t* utf32_buffer) noexcept;
     
     /**
    - * Using native endianness; Convert possibly broken UTF-16 string into
    + * Using native endianness, convert possibly broken UTF-16 string into
      * UTF-32 string and stop on error.
      *
      * During the conversion also validation of the input string is done.
    @@ -1424,9 +1676,9 @@ simdutf_warn_unused size_t convert_utf16be_to_utf32(const char16_t * input, size
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16 string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @param utf32_buffer   the pointer to buffer that can hold conversion result
    - * @return a result pair struct with an error code and either the position of the error if any or the number of char32_t written if successful.
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char32_t written if successful.
      */
     simdutf_warn_unused result convert_utf16_to_utf32_with_errors(const char16_t * input, size_t length, char32_t* utf32_buffer) noexcept;
     
    @@ -1439,9 +1691,9 @@ simdutf_warn_unused result convert_utf16_to_utf32_with_errors(const char16_t * i
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16LE string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @param utf32_buffer   the pointer to buffer that can hold conversion result
    - * @return a result pair struct with an error code and either the position of the error if any or the number of char32_t written if successful.
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char32_t written if successful.
      */
     simdutf_warn_unused result convert_utf16le_to_utf32_with_errors(const char16_t * input, size_t length, char32_t* utf32_buffer) noexcept;
     
    @@ -1454,23 +1706,23 @@ simdutf_warn_unused result convert_utf16le_to_utf32_with_errors(const char16_t *
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16BE string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @param utf32_buffer   the pointer to buffer that can hold conversion result
    - * @return a result pair struct with an error code and either the position of the error if any or the number of char32_t written if successful.
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char32_t written if successful.
      */
     simdutf_warn_unused result convert_utf16be_to_utf32_with_errors(const char16_t * input, size_t length, char32_t* utf32_buffer) noexcept;
     
     /**
    - * Using native endianness; Convert valid UTF-16 string into UTF-32 string.
    + * Using native endianness, convert valid UTF-16 string into UTF-32 string.
      *
      * This function assumes that the input string is valid UTF-16 (native endianness).
      *
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16 string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @param utf32_buffer   the pointer to buffer that can hold the conversion result
    - * @return number of written words; 0 if conversion is not possible
    + * @return number of written code units; 0 if conversion is not possible
      */
     simdutf_warn_unused size_t convert_valid_utf16_to_utf32(const char16_t * input, size_t length, char32_t* utf32_buffer) noexcept;
     
    @@ -1482,9 +1734,9 @@ simdutf_warn_unused size_t convert_valid_utf16_to_utf32(const char16_t * input,
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16LE string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @param utf32_buffer   the pointer to buffer that can hold the conversion result
    - * @return number of written words; 0 if conversion is not possible
    + * @return number of written code units; 0 if conversion is not possible
      */
     simdutf_warn_unused size_t convert_valid_utf16le_to_utf32(const char16_t * input, size_t length, char32_t* utf32_buffer) noexcept;
     
    @@ -1496,12 +1748,26 @@ simdutf_warn_unused size_t convert_valid_utf16le_to_utf32(const char16_t * input
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16BE string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @param utf32_buffer   the pointer to buffer that can hold the conversion result
    - * @return number of written words; 0 if conversion is not possible
    + * @return number of written code units; 0 if conversion is not possible
      */
     simdutf_warn_unused size_t convert_valid_utf16be_to_utf32(const char16_t * input, size_t length, char32_t* utf32_buffer) noexcept;
     
    +
    +/*
    + * Compute the number of bytes that this UTF-16LE/BE string would require in Latin1 format.
    + *
    + * This function does not validate the input.
    + *
    + * This function is not BOM-aware.
    + *
    + * @param length        the length of the string in 2-byte code units (char16_t)
    + * @return the number of bytes required to encode the UTF-16LE string as Latin1
    + */
    +simdutf_warn_unused size_t latin1_length_from_utf16(size_t length) noexcept;
    +
    +
     /**
      * Using native endianness; Compute the number of bytes that this UTF-16
      * string would require in UTF-8 format.
    @@ -1509,7 +1775,7 @@ simdutf_warn_unused size_t convert_valid_utf16be_to_utf32(const char16_t * input
      * This function does not validate the input.
      *
      * @param input         the UTF-16 string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @return the number of bytes required to encode the UTF-16LE string as UTF-8
      */
     simdutf_warn_unused size_t utf8_length_from_utf16(const char16_t * input, size_t length) noexcept;
    @@ -1520,7 +1786,7 @@ simdutf_warn_unused size_t utf8_length_from_utf16(const char16_t * input, size_t
      * This function does not validate the input.
      *
      * @param input         the UTF-16LE string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @return the number of bytes required to encode the UTF-16LE string as UTF-8
      */
     simdutf_warn_unused size_t utf8_length_from_utf16le(const char16_t * input, size_t length) noexcept;
    @@ -1531,7 +1797,7 @@ simdutf_warn_unused size_t utf8_length_from_utf16le(const char16_t * input, size
      * This function does not validate the input.
      *
      * @param input         the UTF-16BE string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @return the number of bytes required to encode the UTF-16BE string as UTF-8
      */
     simdutf_warn_unused size_t utf8_length_from_utf16be(const char16_t * input, size_t length) noexcept;
    @@ -1545,9 +1811,9 @@ simdutf_warn_unused size_t utf8_length_from_utf16be(const char16_t * input, size
      * This function is not BOM-aware.
      *
      * @param input         the UTF-32 string to convert
    - * @param length        the length of the string in 4-byte words (char32_t)
    + * @param length        the length of the string in 4-byte code units (char32_t)
      * @param utf8_buffer   the pointer to buffer that can hold conversion result
    - * @return number of written words; 0 if input is not a valid UTF-32 string
    + * @return number of written code units; 0 if input is not a valid UTF-32 string
      */
     simdutf_warn_unused size_t convert_utf32_to_utf8(const char32_t * input, size_t length, char* utf8_buffer) noexcept;
     
    @@ -1560,9 +1826,9 @@ simdutf_warn_unused size_t convert_utf32_to_utf8(const char32_t * input, size_t
      * This function is not BOM-aware.
      *
      * @param input         the UTF-32 string to convert
    - * @param length        the length of the string in 4-byte words (char32_t)
    + * @param length        the length of the string in 4-byte code units (char32_t)
      * @param utf8_buffer   the pointer to buffer that can hold conversion result
    - * @return a result pair struct with an error code and either the position of the error if any or the number of char written if successful.
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char written if successful.
      */
     simdutf_warn_unused result convert_utf32_to_utf8_with_errors(const char32_t * input, size_t length, char* utf8_buffer) noexcept;
     
    @@ -1574,14 +1840,14 @@ simdutf_warn_unused result convert_utf32_to_utf8_with_errors(const char32_t * in
      * This function is not BOM-aware.
      *
      * @param input         the UTF-32 string to convert
    - * @param length        the length of the string in 4-byte words (char32_t)
    + * @param length        the length of the string in 4-byte code units (char32_t)
      * @param utf8_buffer   the pointer to buffer that can hold the conversion result
    - * @return number of written words; 0 if conversion is not possible
    + * @return number of written code units; 0 if conversion is not possible
      */
     simdutf_warn_unused size_t convert_valid_utf32_to_utf8(const char32_t * input, size_t length, char* utf8_buffer) noexcept;
     
     /**
    - * Using native endianness; Convert possibly broken UTF-32 string into UTF-16 string.
    + * Using native endianness, convert possibly broken UTF-32 string into a UTF-16 string.
      *
      * During the conversion also validation of the input string is done.
      * This function is suitable to work with inputs from untrusted sources.
    @@ -1589,9 +1855,9 @@ simdutf_warn_unused size_t convert_valid_utf32_to_utf8(const char32_t * input, s
      * This function is not BOM-aware.
      *
      * @param input         the UTF-32 string to convert
    - * @param length        the length of the string in 4-byte words (char32_t)
    + * @param length        the length of the string in 4-byte code units (char32_t)
      * @param utf16_buffer   the pointer to buffer that can hold conversion result
    - * @return number of written words; 0 if input is not a valid UTF-32 string
    + * @return number of written code units; 0 if input is not a valid UTF-32 string
      */
     simdutf_warn_unused size_t convert_utf32_to_utf16(const char32_t * input, size_t length, char16_t* utf16_buffer) noexcept;
     
    @@ -1604,12 +1870,57 @@ simdutf_warn_unused size_t convert_utf32_to_utf16(const char32_t * input, size_t
      * This function is not BOM-aware.
      *
      * @param input         the UTF-32 string to convert
    - * @param length        the length of the string in 4-byte words (char32_t)
    + * @param length        the length of the string in 4-byte code units (char32_t)
      * @param utf16_buffer   the pointer to buffer that can hold conversion result
    - * @return number of written words; 0 if input is not a valid UTF-32 string
    + * @return number of written code units; 0 if input is not a valid UTF-32 string
      */
     simdutf_warn_unused size_t convert_utf32_to_utf16le(const char32_t * input, size_t length, char16_t* utf16_buffer) noexcept;
     
    +/**
    + * Convert possibly broken UTF-32 string into Latin1 string.
    + *
    + * During the conversion also validation of the input string is done.
    + * This function is suitable to work with inputs from untrusted sources.
    + *
    + * This function is not BOM-aware.
    + *
    + * @param input         the UTF-32 string to convert
    + * @param length        the length of the string in 4-byte code units (char32_t)
    + * @param latin1_buffer   the pointer to buffer that can hold conversion result
    + * @return number of written code units; 0 if input is not a valid UTF-32 string
    + */
    +simdutf_warn_unused size_t convert_utf32_to_latin1(const char32_t * input, size_t length, char* latin1_buffer) noexcept;
    +
    +
    +/**
    + * Convert possibly broken UTF-32 string into Latin1 string and stop on error.
    + *
    + * During the conversion also validation of the input string is done.
    + * This function is suitable to work with inputs from untrusted sources.
    + *
    + * This function is not BOM-aware.
    + *
    + * @param input         the UTF-32 string to convert
    + * @param length        the length of the string in 4-byte code units (char32_t)
    + * @param latin1_buffer   the pointer to buffer that can hold conversion result
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char written if successful.
    + */
    +simdutf_warn_unused result convert_utf32_to_latin1_with_errors(const char32_t * input, size_t length, char* latin1_buffer) noexcept;
    +
    +/**
    + * Convert valid UTF-32 string into Latin1 string.
    + *
    + * This function assumes that the input string is valid UTF-32.
    + *
    + * This function is not BOM-aware.
    + *
    + * @param input         the UTF-32 string to convert
    + * @param length        the length of the string in 4-byte code units (char32_t)
    + * @param latin1_buffer   the pointer to buffer that can hold the conversion result
    + * @return number of written code units; 0 if conversion is not possible
    + */
    +simdutf_warn_unused size_t convert_valid_utf32_to_latin1(const char32_t * input, size_t length, char* latin1_buffer) noexcept;
    +
     /**
      * Convert possibly broken UTF-32 string into UTF-16BE string.
      *
    @@ -1619,14 +1930,14 @@ simdutf_warn_unused size_t convert_utf32_to_utf16le(const char32_t * input, size
      * This function is not BOM-aware.
      *
      * @param input         the UTF-32 string to convert
    - * @param length        the length of the string in 4-byte words (char32_t)
    + * @param length        the length of the string in 4-byte code units (char32_t)
      * @param utf16_buffer   the pointer to buffer that can hold conversion result
    - * @return number of written words; 0 if input is not a valid UTF-32 string
    + * @return number of written code units; 0 if input is not a valid UTF-32 string
      */
     simdutf_warn_unused size_t convert_utf32_to_utf16be(const char32_t * input, size_t length, char16_t* utf16_buffer) noexcept;
     
     /**
    - * Using native endianness; Convert possibly broken UTF-32 string into UTF-16
    + * Using native endianness, convert possibly broken UTF-32 string into UTF-16
      * string and stop on error.
      *
      * During the conversion also validation of the input string is done.
    @@ -1635,9 +1946,9 @@ simdutf_warn_unused size_t convert_utf32_to_utf16be(const char32_t * input, size
      * This function is not BOM-aware.
      *
      * @param input         the UTF-32 string to convert
    - * @param length        the length of the string in 4-byte words (char32_t)
    + * @param length        the length of the string in 4-byte code units (char32_t)
      * @param utf16_buffer   the pointer to buffer that can hold conversion result
    - * @return a result pair struct with an error code and either the position of the error if any or the number of char16_t written if successful.
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char16_t written if successful.
      */
     simdutf_warn_unused result convert_utf32_to_utf16_with_errors(const char32_t * input, size_t length, char16_t* utf16_buffer) noexcept;
     
    @@ -1650,9 +1961,9 @@ simdutf_warn_unused result convert_utf32_to_utf16_with_errors(const char32_t * i
      * This function is not BOM-aware.
      *
      * @param input         the UTF-32 string to convert
    - * @param length        the length of the string in 4-byte words (char32_t)
    + * @param length        the length of the string in 4-byte code units (char32_t)
      * @param utf16_buffer   the pointer to buffer that can hold conversion result
    - * @return a result pair struct with an error code and either the position of the error if any or the number of char16_t written if successful.
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char16_t written if successful.
      */
     simdutf_warn_unused result convert_utf32_to_utf16le_with_errors(const char32_t * input, size_t length, char16_t* utf16_buffer) noexcept;
     
    @@ -1665,23 +1976,23 @@ simdutf_warn_unused result convert_utf32_to_utf16le_with_errors(const char32_t *
      * This function is not BOM-aware.
      *
      * @param input         the UTF-32 string to convert
    - * @param length        the length of the string in 4-byte words (char32_t)
    + * @param length        the length of the string in 4-byte code units (char32_t)
      * @param utf16_buffer   the pointer to buffer that can hold conversion result
    - * @return a result pair struct with an error code and either the position of the error if any or the number of char16_t written if successful.
    + * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char16_t written if successful.
      */
     simdutf_warn_unused result convert_utf32_to_utf16be_with_errors(const char32_t * input, size_t length, char16_t* utf16_buffer) noexcept;
     
     /**
    - * Using native endianness; Convert valid UTF-32 string into UTF-16 string.
    + * Using native endianness, convert valid UTF-32 string into a UTF-16 string.
      *
      * This function assumes that the input string is valid UTF-32.
      *
      * This function is not BOM-aware.
      *
      * @param input         the UTF-32 string to convert
    - * @param length        the length of the string in 4-byte words (char32_t)
    + * @param length        the length of the string in 4-byte code units (char32_t)
      * @param utf16_buffer   the pointer to buffer that can hold the conversion result
    - * @return number of written words; 0 if conversion is not possible
    + * @return number of written code units; 0 if conversion is not possible
      */
     simdutf_warn_unused size_t convert_valid_utf32_to_utf16(const char32_t * input, size_t length, char16_t* utf16_buffer) noexcept;
     
    @@ -1693,9 +2004,9 @@ simdutf_warn_unused size_t convert_valid_utf32_to_utf16(const char32_t * input,
      * This function is not BOM-aware.
      *
      * @param input         the UTF-32 string to convert
    - * @param length        the length of the string in 4-byte words (char32_t)
    + * @param length        the length of the string in 4-byte code units (char32_t)
      * @param utf16_buffer   the pointer to buffer that can hold the conversion result
    - * @return number of written words; 0 if conversion is not possible
    + * @return number of written code units; 0 if conversion is not possible
      */
     simdutf_warn_unused size_t convert_valid_utf32_to_utf16le(const char32_t * input, size_t length, char16_t* utf16_buffer) noexcept;
     
    @@ -1707,9 +2018,9 @@ simdutf_warn_unused size_t convert_valid_utf32_to_utf16le(const char32_t * input
      * This function is not BOM-aware.
      *
      * @param input         the UTF-32 string to convert
    - * @param length        the length of the string in 4-byte words (char32_t)
    + * @param length        the length of the string in 4-byte code units (char32_t)
      * @param utf16_buffer   the pointer to buffer that can hold the conversion result
    - * @return number of written words; 0 if conversion is not possible
    + * @return number of written code units; 0 if conversion is not possible
      */
     simdutf_warn_unused size_t convert_valid_utf32_to_utf16be(const char32_t * input, size_t length, char16_t* utf16_buffer) noexcept;
     
    @@ -1722,7 +2033,7 @@ simdutf_warn_unused size_t convert_valid_utf32_to_utf16be(const char32_t * input
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16 string to process
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @param output        the pointer to buffer that can hold the conversion result
      */
     void change_endianness_utf16(const char16_t * input, size_t length, char16_t * output) noexcept;
    @@ -1733,18 +2044,18 @@ void change_endianness_utf16(const char16_t * input, size_t length, char16_t * o
      * This function does not validate the input.
      *
      * @param input         the UTF-32 string to convert
    - * @param length        the length of the string in 4-byte words (char32_t)
    + * @param length        the length of the string in 4-byte code units (char32_t)
      * @return the number of bytes required to encode the UTF-32 string as UTF-8
      */
     simdutf_warn_unused size_t utf8_length_from_utf32(const char32_t * input, size_t length) noexcept;
     
     /**
    - * Compute the number of two-byte words that this UTF-32 string would require in UTF-16 format.
    + * Compute the number of two-byte code units that this UTF-32 string would require in UTF-16 format.
      *
      * This function does not validate the input.
      *
      * @param input         the UTF-32 string to convert
    - * @param length        the length of the string in 4-byte words (char32_t)
    + * @param length        the length of the string in 4-byte code units (char32_t)
      * @return the number of bytes required to encode the UTF-32 string as UTF-16
      */
     simdutf_warn_unused size_t utf16_length_from_utf32(const char32_t * input, size_t length) noexcept;
    @@ -1760,7 +2071,7 @@ simdutf_warn_unused size_t utf16_length_from_utf32(const char32_t * input, size_
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16 string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @return the number of bytes required to encode the UTF-16LE string as UTF-32
      */
     simdutf_warn_unused size_t utf32_length_from_utf16(const char16_t * input, size_t length) noexcept;
    @@ -1775,7 +2086,7 @@ simdutf_warn_unused size_t utf32_length_from_utf16(const char16_t * input, size_
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16LE string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @return the number of bytes required to encode the UTF-16LE string as UTF-32
      */
     simdutf_warn_unused size_t utf32_length_from_utf16le(const char16_t * input, size_t length) noexcept;
    @@ -1790,7 +2101,7 @@ simdutf_warn_unused size_t utf32_length_from_utf16le(const char16_t * input, siz
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16BE string to convert
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @return the number of bytes required to encode the UTF-16BE string as UTF-32
      */
     simdutf_warn_unused size_t utf32_length_from_utf16be(const char16_t * input, size_t length) noexcept;
    @@ -1804,7 +2115,7 @@ simdutf_warn_unused size_t utf32_length_from_utf16be(const char16_t * input, siz
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16 string to process
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @return number of code points
      */
     simdutf_warn_unused size_t count_utf16(const char16_t * input, size_t length) noexcept;
    @@ -1818,7 +2129,7 @@ simdutf_warn_unused size_t count_utf16(const char16_t * input, size_t length) no
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16LE string to process
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @return number of code points
      */
     simdutf_warn_unused size_t count_utf16le(const char16_t * input, size_t length) noexcept;
    @@ -1832,7 +2143,7 @@ simdutf_warn_unused size_t count_utf16le(const char16_t * input, size_t length)
      * This function is not BOM-aware.
      *
      * @param input         the UTF-16BE string to process
    - * @param length        the length of the string in 2-byte words (char16_t)
    + * @param length        the length of the string in 2-byte code units (char16_t)
      * @return number of code points
      */
     simdutf_warn_unused size_t count_utf16be(const char16_t * input, size_t length) noexcept;
    @@ -1849,6 +2160,68 @@ simdutf_warn_unused size_t count_utf16be(const char16_t * input, size_t length)
      */
     simdutf_warn_unused size_t count_utf8(const char * input, size_t length) noexcept;
     
    +/**
    + * Given a valid UTF-8 string having a possibly truncated last character,
    + * this function checks the end of string. If the last character is truncated (or partial),
    + * then it returns a shorter length (shorter by 1 to 3 bytes) so that the short UTF-8
    + * strings only contain complete characters. If there is no truncated character,
    + * the original length is returned.
    + *
    + * This function assumes that the input string is valid UTF-8, but possibly truncated.
    + *
    + * @param input         the UTF-8 string to process
    + * @param length        the length of the string in bytes
    + * @return the length of the string in bytes, possibly shorter by 1 to 3 bytes
    + */
    +simdutf_warn_unused size_t trim_partial_utf8(const char *input, size_t length);
    +
    +/**
    + * Given a valid UTF-16BE string having a possibly truncated last character,
    + * this function checks the end of string. If the last character is truncated (or partial),
    + * then it returns a shorter length (shorter by 1 unit) so that the short UTF-16BE
    + * strings only contain complete characters. If there is no truncated character,
    + * the original length is returned.
    + *
    + * This function assumes that the input string is valid UTF-16BE, but possibly truncated.
    + *
    + * @param input         the UTF-16BE string to process
    + * @param length        the length of the string in bytes
    + * @return the length of the string in bytes, possibly shorter by 1 unit
    + */
    +simdutf_warn_unused size_t trim_partial_utf16be(const char16_t* input, size_t length);
    +
    +/**
    + * Given a valid UTF-16LE string having a possibly truncated last character,
    + * this function checks the end of string. If the last character is truncated (or partial),
    + * then it returns a shorter length (shorter by 1 unit) so that the short UTF-16LE
    + * strings only contain complete characters. If there is no truncated character,
    + * the original length is returned.
    + *
    + * This function assumes that the input string is valid UTF-16LE, but possibly truncated.
    + *
    + * @param input         the UTF-16LE string to process
    + * @param length        the length of the string in bytes
    + * @return the length of the string in unit, possibly shorter by 1 unit
    + */
    +simdutf_warn_unused size_t trim_partial_utf16le(const char16_t* input, size_t length);
    +
    +
    +/**
    + * Given a valid UTF-16 string having a possibly truncated last character,
    + * this function checks the end of string. If the last character is truncated (or partial),
    + * then it returns a shorter length (shorter by 1 unit) so that the short UTF-16
    + * strings only contain complete characters. If there is no truncated character,
    + * the original length is returned.
    + *
    + * This function assumes that the input string is valid UTF-16, but possibly truncated.
    + * We use the native endianness.
    + *
    + * @param input         the UTF-16 string to process
    + * @param length        the length of the string in bytes
    + * @return the length of the string in unit, possibly shorter by 1 unit
    + */
    +simdutf_warn_unused size_t trim_partial_utf16(const char16_t* input, size_t length);
    +
     /**
      * An implementation of simdutf for a particular CPU architecture.
      *
    @@ -1932,7 +2305,7 @@ class implementation {
        *
        * @param buf the UTF-8 string to validate.
        * @param len the length of the string in bytes.
    -   * @return a result pair struct with an error code and either the position of the error if any or the number of words validated if successful.
    +   * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of code units validated if successful.
        */
       simdutf_warn_unused virtual result validate_utf8_with_errors(const char *buf, size_t len) const noexcept = 0;
     
    @@ -1954,7 +2327,7 @@ class implementation {
        *
        * @param buf the ASCII string to validate.
        * @param len the length of the string in bytes.
    -   * @return a result pair struct with an error code and either the position of the error if any or the number of words validated if successful.
    +   * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of code units validated if successful.
        */
       simdutf_warn_unused virtual result validate_ascii_with_errors(const char *buf, size_t len) const noexcept = 0;
     
    @@ -1968,7 +2341,7 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param buf the UTF-16LE string to validate.
    -   * @param len the length of the string in number of 2-byte words (char16_t).
    +   * @param len the length of the string in number of 2-byte code units (char16_t).
        * @return true if and only if the string is valid UTF-16LE.
        */
       simdutf_warn_unused virtual bool validate_utf16le(const char16_t *buf, size_t len) const noexcept = 0;
    @@ -1983,7 +2356,7 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param buf the UTF-16BE string to validate.
    -   * @param len the length of the string in number of 2-byte words (char16_t).
    +   * @param len the length of the string in number of 2-byte code units (char16_t).
        * @return true if and only if the string is valid UTF-16BE.
        */
       simdutf_warn_unused virtual bool validate_utf16be(const char16_t *buf, size_t len) const noexcept = 0;
    @@ -1997,8 +2370,8 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param buf the UTF-16LE string to validate.
    -   * @param len the length of the string in number of 2-byte words (char16_t).
    -   * @return a result pair struct with an error code and either the position of the error if any or the number of words validated if successful.
    +   * @param len the length of the string in number of 2-byte code units (char16_t).
    +   * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of code units validated if successful.
        */
       simdutf_warn_unused virtual result validate_utf16le_with_errors(const char16_t *buf, size_t len) const noexcept = 0;
     
    @@ -2011,8 +2384,8 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param buf the UTF-16BE string to validate.
    -   * @param len the length of the string in number of 2-byte words (char16_t).
    -   * @return a result pair struct with an error code and either the position of the error if any or the number of words validated if successful.
    +   * @param len the length of the string in number of 2-byte code units (char16_t).
    +   * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of code units validated if successful.
        */
       simdutf_warn_unused virtual result validate_utf16be_with_errors(const char16_t *buf, size_t len) const noexcept = 0;
     
    @@ -2024,7 +2397,7 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param buf the UTF-32 string to validate.
    -   * @param len the length of the string in number of 4-byte words (char32_t).
    +   * @param len the length of the string in number of 4-byte code units (char32_t).
        * @return true if and only if the string is valid UTF-32.
        */
       simdutf_warn_unused virtual bool validate_utf32(const char32_t *buf, size_t len) const noexcept = 0;
    @@ -2037,11 +2410,101 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param buf the UTF-32 string to validate.
    -   * @param len the length of the string in number of 4-byte words (char32_t).
    -   * @return a result pair struct with an error code and either the position of the error if any or the number of words validated if successful.
    +   * @param len the length of the string in number of 4-byte code units (char32_t).
    +   * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of code units validated if successful.
        */
       simdutf_warn_unused virtual result validate_utf32_with_errors(const char32_t *buf, size_t len) const noexcept = 0;
     
    +  /**
    +   * Convert Latin1 string into UTF8 string.
    +   *
    +   * This function is suitable to work with inputs from untrusted sources.
    +   *
    +   * @param input         the Latin1 string to convert
    +   * @param length        the length of the string in bytes
    +   * @param latin1_output  the pointer to buffer that can hold conversion result
    +   * @return the number of written char; 0 if conversion is not possible
    +   */
    +  simdutf_warn_unused virtual size_t convert_latin1_to_utf8(const char * input, size_t length, char* utf8_output) const noexcept = 0;
    +
    +
    +    /**
    +   * Convert possibly Latin1 string into UTF-16LE string.
    +   *
    +   * This function is suitable to work with inputs from untrusted sources.
    +   *
    +   * @param input         the Latin1  string to convert
    +   * @param length        the length of the string in bytes
    +   * @param utf16_buffer  the pointer to buffer that can hold conversion result
    +   * @return the number of written char16_t; 0 if conversion is not possible
    +   */
    +  simdutf_warn_unused virtual size_t convert_latin1_to_utf16le(const char * input, size_t length, char16_t* utf16_output) const noexcept = 0;
    +
    +  /**
    +   * Convert Latin1 string into UTF-16BE string.
    +   *
    +   * This function is suitable to work with inputs from untrusted sources.
    +   *
    +   * @param input         the Latin1 string to convert
    +   * @param length        the length of the string in bytes
    +   * @param utf16_buffer  the pointer to buffer that can hold conversion result
    +   * @return the number of written char16_t; 0 if conversion is not possible
    +   */
    +  simdutf_warn_unused virtual size_t convert_latin1_to_utf16be(const char * input, size_t length, char16_t* utf16_output) const noexcept = 0;
    +
    +  /**
    +   * Convert Latin1 string into UTF-32 string.
    +   *
    +   * This function is suitable to work with inputs from untrusted sources.
    +   *
    +   * @param input         the Latin1 string to convert
    +   * @param length        the length of the string in bytes
    +   * @param utf32_buffer  the pointer to buffer that can hold conversion result
    +   * @return the number of written char32_t; 0 if conversion is not possible
    +   */
    +  simdutf_warn_unused virtual size_t convert_latin1_to_utf32(const char * input, size_t length, char32_t* utf32_buffer) const noexcept = 0;
    +
    + /**
    +   * Convert possibly broken UTF-8 string into latin1 string.
    +   *
    +   * During the conversion also validation of the input string is done.
    +   * This function is suitable to work with inputs from untrusted sources.
    +   *
    +   * @param input         the UTF-8 string to convert
    +   * @param length        the length of the string in bytes
    +   * @param latin1_output  the pointer to buffer that can hold conversion result
    +   * @return the number of written char; 0 if the input was not valid UTF-8 string
    +   */
    +  simdutf_warn_unused virtual size_t convert_utf8_to_latin1(const char * input, size_t length, char* latin1_output) const noexcept = 0;
    +
    +  /**
    +   * Convert possibly broken UTF-8 string into latin1 string with errors
    +   *
    +   * During the conversion also validation of the input string is done.
    +   * This function is suitable to work with inputs from untrusted sources.
    +   *
    +   * @param input         the UTF-8 string to convert
    +   * @param length        the length of the string in bytes
    +   * @param latin1_output  the pointer to buffer that can hold conversion result
    +   * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of code units validated if successful.
    +   */
    +  simdutf_warn_unused virtual result convert_utf8_to_latin1_with_errors(const char * input, size_t length, char* latin1_output) const noexcept = 0;
    +
    +    /**
    +   * Convert valid UTF-8 string into latin1 string.
    +   *
    +   * This function assumes that the input string is valid UTF-8.
    +   *
    +   * This function is not BOM-aware.
    +   *
    +   * @param input         the UTF-8 string to convert
    +   * @param length        the length of the string in bytes
    +   * @param latin1_output  the pointer to buffer that can hold conversion result
    +   * @return the number of written char; 0 if the input was not valid UTF-8 string
    +   */
    +  simdutf_warn_unused virtual size_t convert_valid_utf8_to_latin1(const char * input, size_t length, char* latin1_output) const noexcept = 0;
    +
    +
       /**
        * Convert possibly broken UTF-8 string into UTF-16LE string.
        *
    @@ -2077,7 +2540,7 @@ class implementation {
        * @param input         the UTF-8 string to convert
        * @param length        the length of the string in bytes
        * @param utf16_buffer  the pointer to buffer that can hold conversion result
    -   * @return a result pair struct with an error code and either the position of the error if any or the number of words validated if successful.
    +   * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of code units validated if successful.
        */
       simdutf_warn_unused virtual result convert_utf8_to_utf16le_with_errors(const char * input, size_t length, char16_t* utf16_output) const noexcept = 0;
     
    @@ -2090,7 +2553,7 @@ class implementation {
        * @param input         the UTF-8 string to convert
        * @param length        the length of the string in bytes
        * @param utf16_buffer  the pointer to buffer that can hold conversion result
    -   * @return a result pair struct with an error code and either the position of the error if any or the number of words validated if successful.
    +   * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of code units validated if successful.
        */
       simdutf_warn_unused virtual result convert_utf8_to_utf16be_with_errors(const char * input, size_t length, char16_t* utf16_output) const noexcept = 0;
     
    @@ -2116,7 +2579,7 @@ class implementation {
        * @param input         the UTF-8 string to convert
        * @param length        the length of the string in bytes
        * @param utf32_buffer  the pointer to buffer that can hold conversion result
    -   * @return a result pair struct with an error code and either the position of the error if any or the number of char32_t written if successful.
    +   * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char32_t written if successful.
        */
       simdutf_warn_unused virtual result convert_utf8_to_utf32_with_errors(const char * input, size_t length, char32_t* utf32_output) const noexcept = 0;
     
    @@ -2157,18 +2620,18 @@ class implementation {
       simdutf_warn_unused virtual size_t convert_valid_utf8_to_utf32(const char * input, size_t length, char32_t* utf32_buffer) const noexcept = 0;
     
       /**
    -   * Compute the number of 2-byte words that this UTF-8 string would require in UTF-16LE format.
    +   * Compute the number of 2-byte code units that this UTF-8 string would require in UTF-16LE format.
        *
        * This function does not validate the input.
        *
        * @param input         the UTF-8 string to process
        * @param length        the length of the string in bytes
    -   * @return the number of char16_t words required to encode the UTF-8 string as UTF-16LE
    +   * @return the number of char16_t code units required to encode the UTF-8 string as UTF-16LE
        */
       simdutf_warn_unused virtual size_t utf16_length_from_utf8(const char * input, size_t length) const noexcept = 0;
     
        /**
    -   * Compute the number of 4-byte words that this UTF-8 string would require in UTF-32 format.
    +   * Compute the number of 4-byte code units that this UTF-8 string would require in UTF-32 format.
        *
        * This function is equivalent to count_utf8.
        *
    @@ -2176,10 +2639,96 @@ class implementation {
        *
        * @param input         the UTF-8 string to process
        * @param length        the length of the string in bytes
    -   * @return the number of char32_t words required to encode the UTF-8 string as UTF-32
    +   * @return the number of char32_t code units required to encode the UTF-8 string as UTF-32
        */
       simdutf_warn_unused virtual size_t utf32_length_from_utf8(const char * input, size_t length) const noexcept = 0;
     
    +  /**
    +   * Convert possibly broken UTF-16LE string into Latin1 string.
    +   *
    +   * During the conversion also validation of the input string is done.
    +   * This function is suitable to work with inputs from untrusted sources.
    +   *
    +   * This function is not BOM-aware.
    +   *
    +   * @param input         the UTF-16LE string to convert
    +   * @param length        the length of the string in 2-byte code units (char16_t)
    +   * @param latin1_buffer   the pointer to buffer that can hold conversion result
    +   * @return number of written code units; 0 if input is not a valid UTF-16LE string
    +   */
    +  simdutf_warn_unused virtual size_t convert_utf16le_to_latin1(const char16_t * input, size_t length, char* latin1_buffer) const noexcept = 0;
    +
    +  /**
    +   * Convert possibly broken UTF-16BE string into Latin1 string.
    +   *
    +   * During the conversion also validation of the input string is done.
    +   * This function is suitable to work with inputs from untrusted sources.
    +   *
    +   * This function is not BOM-aware.
    +   *
    +   * @param input         the UTF-16BE string to convert
    +   * @param length        the length of the string in 2-byte code units (char16_t)
    +   * @param latin1_buffer   the pointer to buffer that can hold conversion result
    +   * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char written if successful.
    +   */
    +  simdutf_warn_unused virtual size_t convert_utf16be_to_latin1(const char16_t * input, size_t length, char* latin1_buffer) const noexcept = 0;
    +
    +  /**
    +   * Convert possibly broken UTF-16LE string into Latin1 string.
    +   *
    +   * During the conversion also validation of the input string is done.
    +   * This function is suitable to work with inputs from untrusted sources.
    +   * This function is not BOM-aware.
    +   *
    +   * @param input         the UTF-16LE string to convert
    +   * @param length        the length of the string in 2-byte code units (char16_t)
    +   * @param latin1_buffer   the pointer to buffer that can hold conversion result
    +   * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char written if successful.
    +   */
    +  simdutf_warn_unused virtual result convert_utf16le_to_latin1_with_errors(const char16_t * input, size_t length, char* latin1_buffer) const noexcept = 0;
    +
    +  /**
    +   * Convert possibly broken UTF-16BE string into Latin1 string.
    +   *
    +   * During the conversion also validation of the input string is done.
    +   * This function is suitable to work with inputs from untrusted sources.
    +   * This function is not BOM-aware.
    +   *
    +   * @param input         the UTF-16BE string to convert
    +   * @param length        the length of the string in 2-byte code units (char16_t)
    +   * @param latin1_buffer   the pointer to buffer that can hold conversion result
    +   * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char written if successful.
    +   */
    +  simdutf_warn_unused virtual result convert_utf16be_to_latin1_with_errors(const char16_t * input, size_t length, char* latin1_buffer) const noexcept = 0;
    +
    +  /**
    +   * Convert valid UTF-16LE string into Latin1 string.
    +   *
    +   * This function assumes that the input string is valid UTF-8.
    +
    +   * This function is not BOM-aware.
    +   *
    +   * @param input         the UTF-16LE string to convert
    +   * @param length        the length of the string in 2-byte code units (char16_t)
    +   * @param latin1_buffer   the pointer to buffer that can hold conversion result
    +   * @return number of written code units; 0 if conversion is not possible
    +   */
    +  simdutf_warn_unused virtual size_t convert_valid_utf16le_to_latin1(const char16_t * input, size_t length, char* latin1_buffer) const noexcept = 0;
    +
    +  /**
    +   * Convert valid UTF-16BE string into Latin1 string.
    +   *
    +   * This function assumes that the input string is valid UTF-8.
    +   *
    +   * This function is not BOM-aware.
    +   *
    +   * @param input         the UTF-16BE string to convert
    +   * @param length        the length of the string in 2-byte code units (char16_t)
    +   * @param latin1_buffer   the pointer to buffer that can hold conversion result
    +   * @return number of written code units; 0 if conversion is not possible
    +   */
    +  simdutf_warn_unused virtual size_t convert_valid_utf16be_to_latin1(const char16_t * input, size_t length, char* latin1_buffer) const noexcept = 0;
    +
       /**
        * Convert possibly broken UTF-16LE string into UTF-8 string.
        *
    @@ -2189,9 +2738,9 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-16LE string to convert
    -   * @param length        the length of the string in 2-byte words (char16_t)
    +   * @param length        the length of the string in 2-byte code units (char16_t)
        * @param utf8_buffer   the pointer to buffer that can hold conversion result
    -   * @return number of written words; 0 if input is not a valid UTF-16LE string
    +   * @return number of written code units; 0 if input is not a valid UTF-16LE string
        */
       simdutf_warn_unused virtual size_t convert_utf16le_to_utf8(const char16_t * input, size_t length, char* utf8_buffer) const noexcept = 0;
     
    @@ -2204,9 +2753,9 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-16BE string to convert
    -   * @param length        the length of the string in 2-byte words (char16_t)
    +   * @param length        the length of the string in 2-byte code units (char16_t)
        * @param utf8_buffer   the pointer to buffer that can hold conversion result
    -   * @return number of written words; 0 if input is not a valid UTF-16BE string
    +   * @return number of written code units; 0 if input is not a valid UTF-16BE string
        */
       simdutf_warn_unused virtual size_t convert_utf16be_to_utf8(const char16_t * input, size_t length, char* utf8_buffer) const noexcept = 0;
     
    @@ -2219,9 +2768,9 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-16LE string to convert
    -   * @param length        the length of the string in 2-byte words (char16_t)
    +   * @param length        the length of the string in 2-byte code units (char16_t)
        * @param utf8_buffer   the pointer to buffer that can hold conversion result
    -   * @return a result pair struct with an error code and either the position of the error if any or the number of char written if successful.
    +   * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char written if successful.
        */
       simdutf_warn_unused virtual result convert_utf16le_to_utf8_with_errors(const char16_t * input, size_t length, char* utf8_buffer) const noexcept = 0;
     
    @@ -2234,9 +2783,9 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-16BE string to convert
    -   * @param length        the length of the string in 2-byte words (char16_t)
    +   * @param length        the length of the string in 2-byte code units (char16_t)
        * @param utf8_buffer   the pointer to buffer that can hold conversion result
    -   * @return a result pair struct with an error code and either the position of the error if any or the number of char written if successful.
    +   * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char written if successful.
        */
       simdutf_warn_unused virtual result convert_utf16be_to_utf8_with_errors(const char16_t * input, size_t length, char* utf8_buffer) const noexcept = 0;
     
    @@ -2248,9 +2797,9 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-16LE string to convert
    -   * @param length        the length of the string in 2-byte words (char16_t)
    +   * @param length        the length of the string in 2-byte code units (char16_t)
        * @param utf8_buffer   the pointer to buffer that can hold the conversion result
    -   * @return number of written words; 0 if conversion is not possible
    +   * @return number of written code units; 0 if conversion is not possible
        */
       simdutf_warn_unused virtual size_t convert_valid_utf16le_to_utf8(const char16_t * input, size_t length, char* utf8_buffer) const noexcept = 0;
     
    @@ -2262,9 +2811,9 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-16BE string to convert
    -   * @param length        the length of the string in 2-byte words (char16_t)
    +   * @param length        the length of the string in 2-byte code units (char16_t)
        * @param utf8_buffer   the pointer to buffer that can hold the conversion result
    -   * @return number of written words; 0 if conversion is not possible
    +   * @return number of written code units; 0 if conversion is not possible
        */
       simdutf_warn_unused virtual size_t convert_valid_utf16be_to_utf8(const char16_t * input, size_t length, char* utf8_buffer) const noexcept = 0;
     
    @@ -2277,9 +2826,9 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-16LE string to convert
    -   * @param length        the length of the string in 2-byte words (char16_t)
    +   * @param length        the length of the string in 2-byte code units (char16_t)
        * @param utf32_buffer   the pointer to buffer that can hold conversion result
    -   * @return number of written words; 0 if input is not a valid UTF-16LE string
    +   * @return number of written code units; 0 if input is not a valid UTF-16LE string
        */
       simdutf_warn_unused virtual size_t convert_utf16le_to_utf32(const char16_t * input, size_t length, char32_t* utf32_buffer) const noexcept = 0;
     
    @@ -2292,9 +2841,9 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-16BE string to convert
    -   * @param length        the length of the string in 2-byte words (char16_t)
    +   * @param length        the length of the string in 2-byte code units (char16_t)
        * @param utf32_buffer   the pointer to buffer that can hold conversion result
    -   * @return number of written words; 0 if input is not a valid UTF-16BE string
    +   * @return number of written code units; 0 if input is not a valid UTF-16BE string
        */
       simdutf_warn_unused virtual size_t convert_utf16be_to_utf32(const char16_t * input, size_t length, char32_t* utf32_buffer) const noexcept = 0;
     
    @@ -2307,9 +2856,9 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-16LE string to convert
    -   * @param length        the length of the string in 2-byte words (char16_t)
    +   * @param length        the length of the string in 2-byte code units (char16_t)
        * @param utf32_buffer   the pointer to buffer that can hold conversion result
    -   * @return a result pair struct with an error code and either the position of the error if any or the number of char32_t written if successful.
    +   * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char32_t written if successful.
        */
       simdutf_warn_unused virtual result convert_utf16le_to_utf32_with_errors(const char16_t * input, size_t length, char32_t* utf32_buffer) const noexcept = 0;
     
    @@ -2322,9 +2871,9 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-16BE string to convert
    -   * @param length        the length of the string in 2-byte words (char16_t)
    +   * @param length        the length of the string in 2-byte code units (char16_t)
        * @param utf32_buffer   the pointer to buffer that can hold conversion result
    -   * @return a result pair struct with an error code and either the position of the error if any or the number of char32_t written if successful.
    +   * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char32_t written if successful.
        */
       simdutf_warn_unused virtual result convert_utf16be_to_utf32_with_errors(const char16_t * input, size_t length, char32_t* utf32_buffer) const noexcept = 0;
     
    @@ -2336,9 +2885,9 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-16LE string to convert
    -   * @param length        the length of the string in 2-byte words (char16_t)
    +   * @param length        the length of the string in 2-byte code units (char16_t)
        * @param utf32_buffer   the pointer to buffer that can hold the conversion result
    -   * @return number of written words; 0 if conversion is not possible
    +   * @return number of written code units; 0 if conversion is not possible
        */
       simdutf_warn_unused virtual size_t convert_valid_utf16le_to_utf32(const char16_t * input, size_t length, char32_t* utf32_buffer) const noexcept = 0;
     
    @@ -2350,9 +2899,9 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-16BE string to convert
    -   * @param length        the length of the string in 2-byte words (char16_t)
    +   * @param length        the length of the string in 2-byte code units (char16_t)
        * @param utf32_buffer   the pointer to buffer that can hold the conversion result
    -   * @return number of written words; 0 if conversion is not possible
    +   * @return number of written code units; 0 if conversion is not possible
        */
       simdutf_warn_unused virtual size_t convert_valid_utf16be_to_utf32(const char16_t * input, size_t length, char32_t* utf32_buffer) const noexcept = 0;
     
    @@ -2364,7 +2913,7 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-16LE string to convert
    -   * @param length        the length of the string in 2-byte words (char16_t)
    +   * @param length        the length of the string in 2-byte code units (char16_t)
        * @return the number of bytes required to encode the UTF-16LE string as UTF-8
        */
       simdutf_warn_unused virtual size_t utf8_length_from_utf16le(const char16_t * input, size_t length) const noexcept = 0;
    @@ -2377,11 +2926,57 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-16BE string to convert
    -   * @param length        the length of the string in 2-byte words (char16_t)
    +   * @param length        the length of the string in 2-byte code units (char16_t)
        * @return the number of bytes required to encode the UTF-16BE string as UTF-8
        */
       simdutf_warn_unused virtual size_t utf8_length_from_utf16be(const char16_t * input, size_t length) const noexcept = 0;
     
    +  /**
    +   * Convert possibly broken UTF-32 string into Latin1 string.
    +   *
    +   * During the conversion also validation of the input string is done.
    +   * This function is suitable to work with inputs from untrusted sources.
    +   *
    +   * This function is not BOM-aware.
    +   *
    +   * @param input         the UTF-32 string to convert
    +   * @param length        the length of the string in 4-byte code units (char32_t)
    +   * @param latin1_buffer   the pointer to buffer that can hold conversion result
    +   * @return number of written code units; 0 if input is not a valid UTF-32 string
    +   */
    +
    +  simdutf_warn_unused virtual size_t convert_utf32_to_latin1(const char32_t * input, size_t length, char* latin1_buffer) const noexcept = 0;
    +
    +  /**
    +   * Convert possibly broken UTF-32 string into Latin1 string and stop on error.
    +   *
    +   * During the conversion also validation of the input string is done.
    +   * This function is suitable to work with inputs from untrusted sources.
    +   *
    +   * This function is not BOM-aware.
    +   *
    +   * @param input         the UTF-32 string to convert
    +   * @param length        the length of the string in 4-byte code units (char32_t)
    +   * @param latin1_buffer   the pointer to buffer that can hold conversion result
    +   * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char written if successful.
    +   */
    +
    +  simdutf_warn_unused virtual result convert_utf32_to_latin1_with_errors(const char32_t * input, size_t length, char* latin1_buffer) const noexcept = 0;
    +
    +  /**
    +   * Convert valid UTF-32 string into Latin1 string.
    +   *
    +   * This function assumes that the input string is valid UTF-32.
    +   *
    +   * This function is not BOM-aware.
    +   *
    +   * @param input         the UTF-32 string to convert
    +   * @param length        the length of the string in 4-byte code units (char32_t)
    +   * @param latin1_buffer   the pointer to buffer that can hold the conversion result
    +   * @return number of written code units; 0 if conversion is not possible
    +   */
    +  simdutf_warn_unused virtual size_t convert_valid_utf32_to_latin1(const char32_t * input, size_t length, char* latin1_buffer) const noexcept = 0;
    +
       /**
        * Convert possibly broken UTF-32 string into UTF-8 string.
        *
    @@ -2391,9 +2986,9 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-32 string to convert
    -   * @param length        the length of the string in 4-byte words (char32_t)
    +   * @param length        the length of the string in 4-byte code units (char32_t)
        * @param utf8_buffer   the pointer to buffer that can hold conversion result
    -   * @return number of written words; 0 if input is not a valid UTF-32 string
    +   * @return number of written code units; 0 if input is not a valid UTF-32 string
        */
       simdutf_warn_unused virtual size_t convert_utf32_to_utf8(const char32_t * input, size_t length, char* utf8_buffer) const noexcept = 0;
     
    @@ -2406,9 +3001,9 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-32 string to convert
    -   * @param length        the length of the string in 4-byte words (char32_t)
    +   * @param length        the length of the string in 4-byte code units (char32_t)
        * @param utf8_buffer   the pointer to buffer that can hold conversion result
    -   * @return a result pair struct with an error code and either the position of the error if any or the number of char written if successful.
    +   * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char written if successful.
        */
       simdutf_warn_unused virtual result convert_utf32_to_utf8_with_errors(const char32_t * input, size_t length, char* utf8_buffer) const noexcept = 0;
     
    @@ -2420,12 +3015,23 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-32 string to convert
    -   * @param length        the length of the string in 4-byte words (char32_t)
    +   * @param length        the length of the string in 4-byte code units (char32_t)
        * @param utf8_buffer   the pointer to buffer that can hold the conversion result
    -   * @return number of written words; 0 if conversion is not possible
    +   * @return number of written code units; 0 if conversion is not possible
        */
       simdutf_warn_unused virtual size_t convert_valid_utf32_to_utf8(const char32_t * input, size_t length, char* utf8_buffer) const noexcept = 0;
     
    +
    +    /**
    +   * Return the number of bytes that this UTF-16 string would require in Latin1 format.
    +   *
    +   *
    +   * @param input         the UTF-16 string to convert
    +   * @param length        the length of the string in 2-byte code units (char16_t)
    +   * @return the number of bytes required to encode the UTF-16 string as Latin1
    +   */
    +    simdutf_warn_unused virtual size_t utf16_length_from_latin1(size_t length) const noexcept = 0;
    +
       /**
        * Convert possibly broken UTF-32 string into UTF-16LE string.
        *
    @@ -2435,9 +3041,9 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-32 string to convert
    -   * @param length        the length of the string in 4-byte words (char32_t)
    +   * @param length        the length of the string in 4-byte code units (char32_t)
        * @param utf16_buffer   the pointer to buffer that can hold conversion result
    -   * @return number of written words; 0 if input is not a valid UTF-32 string
    +   * @return number of written code units; 0 if input is not a valid UTF-32 string
        */
       simdutf_warn_unused virtual size_t convert_utf32_to_utf16le(const char32_t * input, size_t length, char16_t* utf16_buffer) const noexcept = 0;
     
    @@ -2450,9 +3056,9 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-32 string to convert
    -   * @param length        the length of the string in 4-byte words (char32_t)
    +   * @param length        the length of the string in 4-byte code units (char32_t)
        * @param utf16_buffer   the pointer to buffer that can hold conversion result
    -   * @return number of written words; 0 if input is not a valid UTF-32 string
    +   * @return number of written code units; 0 if input is not a valid UTF-32 string
        */
       simdutf_warn_unused virtual size_t convert_utf32_to_utf16be(const char32_t * input, size_t length, char16_t* utf16_buffer) const noexcept = 0;
     
    @@ -2465,9 +3071,9 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-32 string to convert
    -   * @param length        the length of the string in 4-byte words (char32_t)
    +   * @param length        the length of the string in 4-byte code units (char32_t)
        * @param utf16_buffer   the pointer to buffer that can hold conversion result
    -   * @return a result pair struct with an error code and either the position of the error if any or the number of char16_t written if successful.
    +   * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char16_t written if successful.
        */
       simdutf_warn_unused virtual result convert_utf32_to_utf16le_with_errors(const char32_t * input, size_t length, char16_t* utf16_buffer) const noexcept = 0;
     
    @@ -2480,9 +3086,9 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-32 string to convert
    -   * @param length        the length of the string in 4-byte words (char32_t)
    +   * @param length        the length of the string in 4-byte code units (char32_t)
        * @param utf16_buffer   the pointer to buffer that can hold conversion result
    -   * @return a result pair struct with an error code and either the position of the error if any or the number of char16_t written if successful.
    +   * @return a result pair struct (of type simdutf::error containing the two fields error and count) with an error code and either position of the error (in the input in code units) if any, or the number of char16_t written if successful.
        */
       simdutf_warn_unused virtual result convert_utf32_to_utf16be_with_errors(const char32_t * input, size_t length, char16_t* utf16_buffer) const noexcept = 0;
     
    @@ -2494,9 +3100,9 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-32 string to convert
    -   * @param length        the length of the string in 4-byte words (char32_t)
    +   * @param length        the length of the string in 4-byte code units (char32_t)
        * @param utf16_buffer   the pointer to buffer that can hold the conversion result
    -   * @return number of written words; 0 if conversion is not possible
    +   * @return number of written code units; 0 if conversion is not possible
        */
       simdutf_warn_unused virtual size_t convert_valid_utf32_to_utf16le(const char32_t * input, size_t length, char16_t* utf16_buffer) const noexcept = 0;
     
    @@ -2508,9 +3114,9 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-32 string to convert
    -   * @param length        the length of the string in 4-byte words (char32_t)
    +   * @param length        the length of the string in 4-byte code units (char32_t)
        * @param utf16_buffer   the pointer to buffer that can hold the conversion result
    -   * @return number of written words; 0 if conversion is not possible
    +   * @return number of written code units; 0 if conversion is not possible
        */
       simdutf_warn_unused virtual size_t convert_valid_utf32_to_utf16be(const char32_t * input, size_t length, char16_t* utf16_buffer) const noexcept = 0;
     
    @@ -2523,33 +3129,88 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-16 string to process
    -   * @param length        the length of the string in 2-byte words (char16_t)
    +   * @param length        the length of the string in 2-byte code units (char16_t)
        * @param output        the pointer to buffer that can hold the conversion result
        */
       virtual void change_endianness_utf16(const char16_t * input, size_t length, char16_t * output) const noexcept = 0;
     
    + /**
    +   * Return the number of bytes that this Latin1 string would require in UTF-8 format.
    +   *
    +   * @param input         the Latin1 string to convert
    +   * @param length        the length of the string bytes
    +   * @return the number of bytes required to encode the Latin1 string as UTF-8
    +   */
    +    simdutf_warn_unused virtual size_t utf8_length_from_latin1(const char * input, size_t length) const noexcept = 0;
    +
       /**
        * Compute the number of bytes that this UTF-32 string would require in UTF-8 format.
        *
        * This function does not validate the input.
        *
        * @param input         the UTF-32 string to convert
    -   * @param length        the length of the string in 4-byte words (char32_t)
    +   * @param length        the length of the string in 4-byte code units (char32_t)
        * @return the number of bytes required to encode the UTF-32 string as UTF-8
        */
       simdutf_warn_unused virtual size_t utf8_length_from_utf32(const char32_t * input, size_t length) const noexcept = 0;
     
       /**
    -   * Compute the number of two-byte words that this UTF-32 string would require in UTF-16 format.
    +   * Compute the number of bytes that this UTF-32 string would require in Latin1 format.
    +   *
    +   * This function does not validate the input.
    +   *
    +   * @param length        the length of the string in 4-byte code units (char32_t)
    +   * @return the number of bytes required to encode the UTF-32 string as Latin1
    +   */
    +  simdutf_warn_unused virtual size_t latin1_length_from_utf32(size_t length) const noexcept = 0;
    +
    +  /**
    +   * Compute the number of bytes that this UTF-8 string would require in Latin1 format.
    +   *
    +   * This function does not validate the input.
    +   *
    +   * @param input         the UTF-8 string to convert
    +   * @param length        the length of the string in byte
    +   * @return the number of bytes required to encode the UTF-8 string as Latin1
    +   */
    +  simdutf_warn_unused virtual size_t latin1_length_from_utf8(const char * input, size_t length) const noexcept = 0;
    +
    +  /*
    +   * Compute the number of bytes that this UTF-16LE/BE string would require in Latin1 format.
    +   *
    +   * This function does not validate the input.
    +   *
    +   * This function is not BOM-aware.
    +   *
    +   * @param input         the UTF-16LE string to convert
    +   * @param length        the length of the string in 2-byte code units (char16_t)
    +   * @return the number of bytes required to encode the UTF-16LE string as Latin1
    +   */
    +  simdutf_warn_unused virtual size_t latin1_length_from_utf16(size_t length) const noexcept = 0;
    +
    +  /**
    +   * Compute the number of two-byte code units that this UTF-32 string would require in UTF-16 format.
        *
        * This function does not validate the input.
        *
        * @param input         the UTF-32 string to convert
    -   * @param length        the length of the string in 4-byte words (char32_t)
    +   * @param length        the length of the string in 4-byte code units (char32_t)
        * @return the number of bytes required to encode the UTF-32 string as UTF-16
        */
       simdutf_warn_unused virtual size_t utf16_length_from_utf32(const char32_t * input, size_t length) const noexcept = 0;
     
    +
    +    /**
    +   * Return the number of bytes that this UTF-32 string would require in Latin1 format.
    +   *
    +   * This function does not validate the input.
    +   *
    +   * @param input         the UTF-32 string to convert
    +   * @param length        the length of the string in 4-byte code units (char32_t)
    +   * @return the number of bytes required to encode the UTF-32 string as Latin1
    +   */
    +    simdutf_warn_unused virtual size_t utf32_length_from_latin1(size_t length) const noexcept = 0;
    +
       /*
        * Compute the number of bytes that this UTF-16LE string would require in UTF-32 format.
        *
    @@ -2560,7 +3221,7 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-16LE string to convert
    -   * @param length        the length of the string in 2-byte words (char16_t)
    +   * @param length        the length of the string in 2-byte code units (char16_t)
        * @return the number of bytes required to encode the UTF-16LE string as UTF-32
        */
       simdutf_warn_unused virtual size_t utf32_length_from_utf16le(const char16_t * input, size_t length) const noexcept = 0;
    @@ -2575,7 +3236,7 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-16BE string to convert
    -   * @param length        the length of the string in 2-byte words (char16_t)
    +   * @param length        the length of the string in 2-byte code units (char16_t)
        * @return the number of bytes required to encode the UTF-16BE string as UTF-32
        */
       simdutf_warn_unused virtual size_t utf32_length_from_utf16be(const char16_t * input, size_t length) const noexcept = 0;
    @@ -2589,7 +3250,7 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-16LE string to process
    -   * @param length        the length of the string in 2-byte words (char16_t)
    +   * @param length        the length of the string in 2-byte code units (char16_t)
        * @return number of code points
        */
       simdutf_warn_unused virtual size_t count_utf16le(const char16_t * input, size_t length) const noexcept = 0;
    @@ -2603,7 +3264,7 @@ class implementation {
        * This function is not BOM-aware.
        *
        * @param input         the UTF-16BE string to process
    -   * @param length        the length of the string in 2-byte words (char16_t)
    +   * @param length        the length of the string in 2-byte code units (char16_t)
        * @return number of code points
        */
       simdutf_warn_unused virtual size_t count_utf16be(const char16_t * input, size_t length) const noexcept = 0;
    diff --git a/deps/simdutf/unofficial.gni b/deps/simdutf/unofficial.gni
    new file mode 100644
    index 00000000000000..544466c5344fa8
    --- /dev/null
    +++ b/deps/simdutf/unofficial.gni
    @@ -0,0 +1,32 @@
    +# This file is used by GN for building, which is NOT the build system used for
    +# building official binaries.
    +# Please edit the gyp files if you are making changes to build system.
    +
    +# The actual configurations are put inside a template in unofficial.gni to
    +# prevent accidental edits from contributors.
    +template("simdutf_gn_build") {
    +  config("simdutf_config") {
    +    include_dirs = [ "." ]
    +  }
    +
    +  gypi_values = exec_script("../../tools/gypi_to_gn.py",
    +                            [ rebase_path("simdutf.gyp") ],
    +                            "scope",
    +                            [ "simdutf.gyp" ])
    +
    +  source_set(target_name) {
    +    forward_variables_from(invoker, "*")
    +    public_configs = [ ":simdutf_config" ]
    +    sources = gypi_values.simdutf_sources
    +    if (is_clang || !is_win) {
    +      cflags_cc = [
    +        "-Wno-#pragma-messages",
    +        "-Wno-ambiguous-reversed-operator",
    +        "-Wno-unreachable-code-break",
    +        "-Wno-unused-const-variable",
    +        "-Wno-unused-function",
    +        "-Wno-c++98-compat-extra-semi",
    +      ]
    +    }
    +  }
    +}
    diff --git a/deps/undici/src/docs/api/Client.md b/deps/undici/src/docs/api/Client.md
    index 42668389a94225..b9e26f09752bd5 100644
    --- a/deps/undici/src/docs/api/Client.md
    +++ b/deps/undici/src/docs/api/Client.md
    @@ -33,7 +33,7 @@ Returns: `Client`
     * **autoSelectFamily**: `boolean` (optional) - Default: depends on local Node version, on Node 18.13.0 and above is `false`. Enables a family autodetection algorithm that loosely implements section 5 of [RFC 8305](https://tools.ietf.org/html/rfc8305#section-5). See [here](https://nodejs.org/api/net.html#socketconnectoptions-connectlistener) for more details. This option is ignored if not supported by the current Node version.
     * **autoSelectFamilyAttemptTimeout**: `number` - Default: depends on local Node version, on Node 18.13.0 and above is `250`. The amount of time in milliseconds to wait for a connection attempt to finish before trying the next address when using the `autoSelectFamily` option. See [here](https://nodejs.org/api/net.html#socketconnectoptions-connectlistener) for more details.
     * **allowH2**: `boolean` - Default: `false`. Enables support for H2 if the server has assigned bigger priority to it through ALPN negotiation.
    -* **maxConcurrentStreams**: `number` - Default: `100`. Dictates the maximum number of concurrent streams for a single H2 session. It can be overriden by a SETTINGS remote frame.
    +* **maxConcurrentStreams**: `number` - Default: `100`. Dictates the maximum number of concurrent streams for a single H2 session. It can be overridden by a SETTINGS remote frame.
     
     #### Parameter: `ConnectOptions`
     
    diff --git a/deps/undici/src/docs/api/DispatchInterceptor.md b/deps/undici/src/docs/api/DispatchInterceptor.md
    index 652b2e86bf9920..7dfc260e32a9c8 100644
    --- a/deps/undici/src/docs/api/DispatchInterceptor.md
    +++ b/deps/undici/src/docs/api/DispatchInterceptor.md
    @@ -1,4 +1,4 @@
    -#Interface: DispatchInterceptor
    +# Interface: DispatchInterceptor
     
     Extends: `Function`
     
    diff --git a/deps/undici/src/docs/api/MockPool.md b/deps/undici/src/docs/api/MockPool.md
    index de53914002eca3..96a986f57bb389 100644
    --- a/deps/undici/src/docs/api/MockPool.md
    +++ b/deps/undici/src/docs/api/MockPool.md
    @@ -35,8 +35,7 @@ const mockPool = mockAgent.get('http://localhost:3000')
     
     ### `MockPool.intercept(options)`
     
    -This method defines the interception rules for matching against requests for a MockPool or MockPool. We can intercept multiple times on a single instance, but each intercept is only used once. 
    -For example if you expect to make 2 requests inside a test, you need to call `intercept()` twice. Assuming you use `disableNetConnect()` you will get `MockNotMatchedError` on the second request when you only call `intercept()` once.
    +This method defines the interception rules for matching against requests for a MockPool or MockPool. We can intercept multiple times on a single instance, but each intercept is only used once. For example if you expect to make 2 requests inside a test, you need to call `intercept()` twice. Assuming you use `disableNetConnect()` you will get `MockNotMatchedError` on the second request when you only call `intercept()` once.
     
     When defining interception rules, all the rules must pass for a request to be intercepted. If a request is not intercepted, a real request will be attempted.
     
    @@ -54,11 +53,11 @@ Returns: `MockInterceptor` corresponding to the input options.
     
     ### Parameter: `MockPoolInterceptOptions`
     
    -* **path** `string | RegExp | (path: string) => boolean` - a matcher for the HTTP request path.
    +* **path** `string | RegExp | (path: string) => boolean` - a matcher for the HTTP request path. When a `RegExp` or callback is used, it will match against the request path including all query parameters in alphabetical order. When a `string` is provided, the query parameters can be conveniently specified through the `MockPoolInterceptOptions.query` setting.
     * **method** `string | RegExp | (method: string) => boolean` - (optional) - a matcher for the HTTP request method. Defaults to `GET`.
     * **body** `string | RegExp | (body: string) => boolean` - (optional) - a matcher for the HTTP request body.
     * **headers** `Record boolean`> - (optional) - a matcher for the HTTP request headers. To be intercepted, a request must match all defined headers. Extra headers not defined here may (or may not) be included in the request and do not affect the interception in any way.
    -* **query** `Record | null` - (optional) - a matcher for the HTTP request query string params.
    +* **query** `Record | null` - (optional) - a matcher for the HTTP request query string params. Only applies when a `string` was provided for `MockPoolInterceptOptions.path`.
     
     ### Return: `MockInterceptor`
     
    @@ -458,6 +457,41 @@ const result3 = await request('http://localhost:3000/foo')
     // Will not match and make attempt a real request
     ```
     
    +#### Example - Mocked request with path callback
    +
    +```js
    +import { MockAgent, setGlobalDispatcher, request } from 'undici'
    +import querystring from 'querystring'
    +
    +const mockAgent = new MockAgent()
    +setGlobalDispatcher(mockAgent)
    +
    +const mockPool = mockAgent.get('http://localhost:3000')
    +
    +const matchPath = requestPath => {
    +  const [pathname, search] = requestPath.split('?')
    +  const requestQuery = querystring.parse(search)
    +
    +  if (!pathname.startsWith('/foo')) {
    +    return false
    +  }
    +
    +  if (!Object.keys(requestQuery).includes('foo') || requestQuery.foo !== 'bar') {
    +    return false
    +  }
    +
    +  return true
    +}
    +
    +mockPool.intercept({
    +  path: matchPath,
    +  method: 'GET'
    +}).reply(200, 'foo')
    +
    +const result = await request('http://localhost:3000/foo?foo=bar')
    +// Will match and return mocked data
    +```
    +
     ### `MockPool.close()`
     
     Closes the mock pool and de-registers from associated MockAgent.
    diff --git a/deps/undici/src/docs/api/RetryHandler.md b/deps/undici/src/docs/api/RetryHandler.md
    new file mode 100644
    index 00000000000000..2323ce47911e79
    --- /dev/null
    +++ b/deps/undici/src/docs/api/RetryHandler.md
    @@ -0,0 +1,108 @@
    +# Class: RetryHandler
    +
    +Extends: `undici.DispatcherHandlers`
    +
    +A handler class that implements the retry logic for a request.
    +
    +## `new RetryHandler(dispatchOptions, retryHandlers, [retryOptions])`
    +
    +Arguments:
    +
    +- **options** `Dispatch.DispatchOptions & RetryOptions` (required) - It is an intersection of `Dispatcher.DispatchOptions` and `RetryOptions`.
    +- **retryHandlers** `RetryHandlers` (required) - Object containing the `dispatch` to be used on every retry, and `handler` for handling the `dispatch` lifecycle.
    +
    +Returns: `retryHandler`
    +
    +### Parameter: `Dispatch.DispatchOptions & RetryOptions`
    +
    +Extends: [`Dispatch.DispatchOptions`](Dispatcher.md#parameter-dispatchoptions).
    +
    +#### `RetryOptions`
    +
    +- **retry** `(err: Error, context: RetryContext, callback: (err?: Error | null) => void) => void` (optional) - Function to be called after every retry. It should pass error if no more retries should be performed.
    +- **maxRetries** `number` (optional) - Maximum number of retries. Default: `5`
    +- **maxTimeout** `number` (optional) - Maximum number of milliseconds to wait before retrying. Default: `30000` (30 seconds)
    +- **minTimeout** `number` (optional) - Minimum number of milliseconds to wait before retrying. Default: `500` (half a second)
    +- **timeoutFactor** `number` (optional) - Factor to multiply the timeout by for each retry attempt. Default: `2`
    +- **retryAfter** `boolean` (optional) - It enables automatic retry after the `Retry-After` header is received. Default: `true`
    +-
    +- **methods** `string[]` (optional) - Array of HTTP methods to retry. Default: `['GET', 'PUT', 'HEAD', 'OPTIONS', 'DELETE']`
    +- **statusCodes** `number[]` (optional) - Array of HTTP status codes to retry. Default: `[429, 500, 502, 503, 504]`
    +- **errorCodes** `string[]` (optional) - Array of Error codes to retry. Default: `['ECONNRESET', 'ECONNREFUSED', 'ENOTFOUND', 'ENETDOWN','ENETUNREACH', 'EHOSTDOWN',
    +
    +**`RetryContext`**
    +
    +- `state`: `RetryState` - Current retry state. It can be mutated.
    +- `opts`: `Dispatch.DispatchOptions & RetryOptions` - Options passed to the retry handler.
    +
    +### Parameter `RetryHandlers`
    +
    +- **dispatch** `(options: Dispatch.DispatchOptions, handlers: Dispatch.DispatchHandlers) => Promise` (required) - Dispatch function to be called after every retry.
    +- **handler** Extends [`Dispatch.DispatchHandlers`](Dispatcher.md#dispatcherdispatchoptions-handler) (required) - Handler function to be called after the request is successful or the retries are exhausted.
    +
    +Examples:
    +
    +```js
    +const client = new Client(`http://localhost:${server.address().port}`);
    +const chunks = [];
    +const handler = new RetryHandler(
    +  {
    +    ...dispatchOptions,
    +    retryOptions: {
    +      // custom retry function
    +      retry: function (err, state, callback) {
    +        counter++;
    +
    +        if (err.code && err.code === "UND_ERR_DESTROYED") {
    +          callback(err);
    +          return;
    +        }
    +
    +        if (err.statusCode === 206) {
    +          callback(err);
    +          return;
    +        }
    +
    +        setTimeout(() => callback(null), 1000);
    +      },
    +    },
    +  },
    +  {
    +    dispatch: (...args) => {
    +      return client.dispatch(...args);
    +    },
    +    handler: {
    +      onConnect() {},
    +      onBodySent() {},
    +      onHeaders(status, _rawHeaders, resume, _statusMessage) {
    +        // do something with headers
    +      },
    +      onData(chunk) {
    +        chunks.push(chunk);
    +        return true;
    +      },
    +      onComplete() {},
    +      onError() {
    +        // handle error properly
    +      },
    +    },
    +  }
    +);
    +```
    +
    +#### Example - Basic RetryHandler with defaults
    +
    +```js
    +const client = new Client(`http://localhost:${server.address().port}`);
    +const handler = new RetryHandler(dispatchOptions, {
    +  dispatch: client.dispatch.bind(client),
    +  handler: {
    +    onConnect() {},
    +    onBodySent() {},
    +    onHeaders(status, _rawHeaders, resume, _statusMessage) {},
    +    onData(chunk) {},
    +    onComplete() {},
    +    onError(err) {},
    +  },
    +});
    +```
    diff --git a/deps/undici/src/index-fetch.js b/deps/undici/src/index-fetch.js
    index 23ac530600769e..ba31a65f25c184 100644
    --- a/deps/undici/src/index-fetch.js
    +++ b/deps/undici/src/index-fetch.js
    @@ -2,13 +2,11 @@
     
     const fetchImpl = require('./lib/fetch').fetch
     
    -module.exports.fetch = async function fetch (resource, init = undefined) {
    -  try {
    -    return await fetchImpl(resource, init)
    -  } catch (err) {
    +module.exports.fetch = function fetch (resource, init = undefined) {
    +  return fetchImpl(resource, init).catch((err) => {
         Error.captureStackTrace(err, this)
         throw err
    -  }
    +  })
     }
     module.exports.FormData = require('./lib/fetch/formdata').FormData
     module.exports.Headers = require('./lib/fetch/headers').Headers
    diff --git a/deps/undici/src/index.js b/deps/undici/src/index.js
    index 7c0c8adcd6c809..26302cc8efa62b 100644
    --- a/deps/undici/src/index.js
    +++ b/deps/undici/src/index.js
    @@ -15,6 +15,7 @@ const MockAgent = require('./lib/mock/mock-agent')
     const MockPool = require('./lib/mock/mock-pool')
     const mockErrors = require('./lib/mock/mock-errors')
     const ProxyAgent = require('./lib/proxy-agent')
    +const RetryHandler = require('./lib/handler/RetryHandler')
     const { getGlobalDispatcher, setGlobalDispatcher } = require('./lib/global')
     const DecoratorHandler = require('./lib/handler/DecoratorHandler')
     const RedirectHandler = require('./lib/handler/RedirectHandler')
    @@ -36,6 +37,7 @@ module.exports.Pool = Pool
     module.exports.BalancedPool = BalancedPool
     module.exports.Agent = Agent
     module.exports.ProxyAgent = ProxyAgent
    +module.exports.RetryHandler = RetryHandler
     
     module.exports.DecoratorHandler = DecoratorHandler
     module.exports.RedirectHandler = RedirectHandler
    diff --git a/deps/undici/src/lib/api/api-request.js b/deps/undici/src/lib/api/api-request.js
    index f130ecc9867a88..d4281ce2449f16 100644
    --- a/deps/undici/src/lib/api/api-request.js
    +++ b/deps/undici/src/lib/api/api-request.js
    @@ -177,3 +177,4 @@ function request (opts, callback) {
     }
     
     module.exports = request
    +module.exports.RequestHandler = RequestHandler
    diff --git a/deps/undici/src/lib/api/api-stream.js b/deps/undici/src/lib/api/api-stream.js
    index 3a8e71a5730eee..c571a6f79a7d06 100644
    --- a/deps/undici/src/lib/api/api-stream.js
    +++ b/deps/undici/src/lib/api/api-stream.js
    @@ -104,6 +104,10 @@ class StreamHandler extends AsyncResource {
             { callback, body: res, contentType, statusCode, statusMessage, headers }
           )
         } else {
    +      if (factory === null) {
    +        return
    +      }
    +
           res = this.runInAsyncScope(factory, null, {
             statusCode,
             headers,
    @@ -152,7 +156,7 @@ class StreamHandler extends AsyncResource {
       onData (chunk) {
         const { res } = this
     
    -    return res.write(chunk)
    +    return res ? res.write(chunk) : true
       }
     
       onComplete (trailers) {
    @@ -160,6 +164,10 @@ class StreamHandler extends AsyncResource {
     
         removeSignal(this)
     
    +    if (!res) {
    +      return
    +    }
    +
         this.trailers = util.parseHeaders(trailers)
     
         res.end()
    diff --git a/deps/undici/src/lib/api/readable.js b/deps/undici/src/lib/api/readable.js
    index 508fbdef928618..5269dfae50cbad 100644
    --- a/deps/undici/src/lib/api/readable.js
    +++ b/deps/undici/src/lib/api/readable.js
    @@ -16,6 +16,8 @@ const kBody = Symbol('kBody')
     const kAbort = Symbol('abort')
     const kContentType = Symbol('kContentType')
     
    +const noop = () => {}
    +
     module.exports = class BodyReadable extends Readable {
       constructor ({
         resume,
    @@ -149,37 +151,50 @@ module.exports = class BodyReadable extends Readable {
         return this[kBody]
       }
     
    -  async dump (opts) {
    +  dump (opts) {
         let limit = opts && Number.isFinite(opts.limit) ? opts.limit : 262144
         const signal = opts && opts.signal
    -    const abortFn = () => {
    -      this.destroy()
    -    }
    -    let signalListenerCleanup
    +
         if (signal) {
    -      if (typeof signal !== 'object' || !('aborted' in signal)) {
    -        throw new InvalidArgumentError('signal must be an AbortSignal')
    -      }
    -      util.throwIfAborted(signal)
    -      signalListenerCleanup = util.addAbortListener(signal, abortFn)
    -    }
    -    try {
    -      for await (const chunk of this) {
    -        util.throwIfAborted(signal)
    -        limit -= Buffer.byteLength(chunk)
    -        if (limit < 0) {
    -          return
    +      try {
    +        if (typeof signal !== 'object' || !('aborted' in signal)) {
    +          throw new InvalidArgumentError('signal must be an AbortSignal')
             }
    +        util.throwIfAborted(signal)
    +      } catch (err) {
    +        return Promise.reject(err)
           }
    -    } catch {
    -      util.throwIfAborted(signal)
    -    } finally {
    -      if (typeof signalListenerCleanup === 'function') {
    -        signalListenerCleanup()
    -      } else if (signalListenerCleanup) {
    -        signalListenerCleanup[Symbol.dispose]()
    -      }
         }
    +
    +    if (this.closed) {
    +      return Promise.resolve(null)
    +    }
    +
    +    return new Promise((resolve, reject) => {
    +      const signalListenerCleanup = signal
    +        ? util.addAbortListener(signal, () => {
    +          this.destroy()
    +        })
    +        : noop
    +
    +      this
    +        .on('close', function () {
    +          signalListenerCleanup()
    +          if (signal && signal.aborted) {
    +            reject(signal.reason || Object.assign(new Error('The operation was aborted'), { name: 'AbortError' }))
    +          } else {
    +            resolve(null)
    +          }
    +        })
    +        .on('error', noop)
    +        .on('data', function (chunk) {
    +          limit -= chunk.length
    +          if (limit <= 0) {
    +            this.destroy()
    +          }
    +        })
    +        .resume()
    +    })
       }
     }
     
    @@ -268,7 +283,7 @@ function consumeEnd (consume) {
             pos += buf.byteLength
           }
     
    -      resolve(dst)
    +      resolve(dst.buffer)
         } else if (type === 'blob') {
           if (!Blob) {
             Blob = require('buffer').Blob
    diff --git a/deps/undici/src/lib/cache/symbols.js b/deps/undici/src/lib/cache/symbols.js
    index f9b19740af8281..40448d6001e0f6 100644
    --- a/deps/undici/src/lib/cache/symbols.js
    +++ b/deps/undici/src/lib/cache/symbols.js
    @@ -1,5 +1,5 @@
     'use strict'
     
     module.exports = {
    -  kConstruct: Symbol('constructable')
    +  kConstruct: require('../core/symbols').kConstruct
     }
    diff --git a/deps/undici/src/lib/client.js b/deps/undici/src/lib/client.js
    index 065fb563380dcc..22cb39039da7fb 100644
    --- a/deps/undici/src/lib/client.js
    +++ b/deps/undici/src/lib/client.js
    @@ -917,11 +917,9 @@ class Parser {
           socket[kReset] = true
         }
     
    -    let pause
    -    try {
    -      pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false
    -    } catch (err) {
    -      util.destroy(socket, err)
    +    const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false
    +
    +    if (request.aborted) {
           return -1
         }
     
    @@ -968,13 +966,8 @@ class Parser {
     
         this.bytesRead += buf.length
     
    -    try {
    -      if (request.onData(buf) === false) {
    -        return constants.ERROR.PAUSED
    -      }
    -    } catch (err) {
    -      util.destroy(socket, err)
    -      return -1
    +    if (request.onData(buf) === false) {
    +      return constants.ERROR.PAUSED
         }
       }
     
    @@ -1015,11 +1008,7 @@ class Parser {
           return -1
         }
     
    -    try {
    -      request.onComplete(headers)
    -    } catch (err) {
    -      errorRequest(client, request, err)
    -    }
    +    request.onComplete(headers)
     
         client[kQueue][client[kRunningIdx]++] = null
     
    @@ -1070,7 +1059,9 @@ function onParserTimeout (parser) {
     
     function onSocketReadable () {
       const { [kParser]: parser } = this
    -  parser.readMore()
    +  if (parser) {
    +    parser.readMore()
    +  }
     }
     
     function onSocketError (err) {
    @@ -1181,7 +1172,7 @@ async function connect (client) {
         const idx = hostname.indexOf(']')
     
         assert(idx !== -1)
    -    const ip = hostname.substr(1, idx - 1)
    +    const ip = hostname.substring(1, idx)
     
         assert(net.isIP(ip))
         hostname = ip
    @@ -1460,23 +1451,7 @@ function _resume (client, sync) {
           return
         }
     
    -    if (util.isStream(request.body) && util.bodyLength(request.body) === 0) {
    -      request.body
    -        .on('data', /* istanbul ignore next */ function () {
    -          /* istanbul ignore next */
    -          assert(false)
    -        })
    -        .on('error', function (err) {
    -          errorRequest(client, request, err)
    -        })
    -        .on('end', function () {
    -          util.destroy(this)
    -        })
    -
    -      request.body = null
    -    }
    -
    -    if (client[kRunning] > 0 &&
    +    if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 &&
           (util.isStream(request.body) || util.isAsyncIterable(request.body))) {
           // Request with stream or iterator body can error while other requests
           // are inflight and indirectly error those as well.
    @@ -1497,6 +1472,11 @@ function _resume (client, sync) {
       }
     }
     
    +// https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2
    +function shouldSendContentLength (method) {
    +  return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT'
    +}
    +
     function write (client, request) {
       if (client[kHTTPConnVersion] === 'h2') {
         writeH2(client, client[kHTTP2Session], request)
    @@ -1525,7 +1505,9 @@ function write (client, request) {
         body.read(0)
       }
     
    -  let contentLength = util.bodyLength(body)
    +  const bodyLength = util.bodyLength(body)
    +
    +  let contentLength = bodyLength
     
       if (contentLength === null) {
         contentLength = request.contentLength
    @@ -1540,7 +1522,9 @@ function write (client, request) {
         contentLength = null
       }
     
    -  if (request.contentLength !== null && request.contentLength !== contentLength) {
    +  // https://github.com/nodejs/undici/issues/2046
    +  // A user agent may send a Content-Length header with 0 value, this should be allowed.
    +  if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) {
         if (client[kStrictContentLength]) {
           errorRequest(client, request, new RequestContentLengthMismatchError())
           return false
    @@ -1621,7 +1605,7 @@ function write (client, request) {
       }
     
       /* istanbul ignore else: assertion */
    -  if (!body) {
    +  if (!body || bodyLength === 0) {
         if (contentLength === 0) {
           socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1')
         } else {
    @@ -1687,6 +1671,7 @@ function writeH2 (client, session, request) {
         return false
       }
     
    +  /** @type {import('node:http2').ClientHttp2Stream} */
       let stream
       const h2State = client[kHTTP2SessionState]
     
    @@ -1761,7 +1746,9 @@ function writeH2 (client, session, request) {
         contentLength = null
       }
     
    -  if (request.contentLength != null && request.contentLength !== contentLength) {
    +  // https://github.com/nodejs/undici/issues/2046
    +  // A user agent may send a Content-Length header with 0 value, this should be allowed.
    +  if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) {
         if (client[kStrictContentLength]) {
           errorRequest(client, request, new RequestContentLengthMismatchError())
           return false
    @@ -1780,14 +1767,10 @@ function writeH2 (client, session, request) {
       const shouldEndStream = method === 'GET' || method === 'HEAD'
       if (expectContinue) {
         headers[HTTP2_HEADER_EXPECT] = '100-continue'
    -    /**
    -     * @type {import('node:http2').ClientHttp2Stream}
    -     */
         stream = session.request(headers, { endStream: shouldEndStream, signal })
     
         stream.once('continue', writeBodyH2)
       } else {
    -    /** @type {import('node:http2').ClientHttp2Stream} */
         stream = session.request(headers, {
           endStream: shouldEndStream,
           signal
    @@ -1799,7 +1782,9 @@ function writeH2 (client, session, request) {
       ++h2State.openStreams
     
       stream.once('response', headers => {
    -    if (request.onHeaders(Number(headers[HTTP2_HEADER_STATUS]), headers, stream.resume.bind(stream), '') === false) {
    +    const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers
    +
    +    if (request.onHeaders(Number(statusCode), realHeaders, stream.resume.bind(stream), '') === false) {
           stream.pause()
         }
       })
    @@ -1809,13 +1794,17 @@ function writeH2 (client, session, request) {
       })
     
       stream.on('data', (chunk) => {
    -    if (request.onData(chunk) === false) stream.pause()
    +    if (request.onData(chunk) === false) {
    +      stream.pause()
    +    }
       })
     
       stream.once('close', () => {
         h2State.openStreams -= 1
         // TODO(HTTP/2): unref only if current streams count is 0
    -    if (h2State.openStreams === 0) session.unref()
    +    if (h2State.openStreams === 0) {
    +      session.unref()
    +    }
       })
     
       stream.once('error', function (err) {
    @@ -1975,7 +1964,11 @@ function writeStream ({ h2stream, body, client, request, socket, contentLength,
         }
       }
       const onAbort = function () {
    -    onFinished(new RequestAbortedError())
    +    if (finished) {
    +      return
    +    }
    +    const err = new RequestAbortedError()
    +    queueMicrotask(() => onFinished(err))
       }
       const onFinished = function (err) {
         if (finished) {
    diff --git a/deps/undici/src/lib/core/errors.js b/deps/undici/src/lib/core/errors.js
    index 653782d9b5e0e6..7af704b462a41e 100644
    --- a/deps/undici/src/lib/core/errors.js
    +++ b/deps/undici/src/lib/core/errors.js
    @@ -193,6 +193,19 @@ class ResponseExceededMaxSizeError extends UndiciError {
       }
     }
     
    +class RequestRetryError extends UndiciError {
    +  constructor (message, code, { headers, data }) {
    +    super(message)
    +    Error.captureStackTrace(this, RequestRetryError)
    +    this.name = 'RequestRetryError'
    +    this.message = message || 'Request retry error'
    +    this.code = 'UND_ERR_REQ_RETRY'
    +    this.statusCode = code
    +    this.data = data
    +    this.headers = headers
    +  }
    +}
    +
     module.exports = {
       HTTPParserError,
       UndiciError,
    @@ -212,5 +225,6 @@ module.exports = {
       NotSupportedError,
       ResponseContentLengthMismatchError,
       BalancedPoolMissingUpstreamError,
    -  ResponseExceededMaxSizeError
    +  ResponseExceededMaxSizeError,
    +  RequestRetryError
     }
    diff --git a/deps/undici/src/lib/core/request.js b/deps/undici/src/lib/core/request.js
    index 50be01c0dc8355..3697e6a3acccd5 100644
    --- a/deps/undici/src/lib/core/request.js
    +++ b/deps/undici/src/lib/core/request.js
    @@ -112,10 +112,29 @@ class Request {
     
         this.method = method
     
    +    this.abort = null
    +
         if (body == null) {
           this.body = null
         } else if (util.isStream(body)) {
           this.body = body
    +
    +      const rState = this.body._readableState
    +      if (!rState || !rState.autoDestroy) {
    +        this.endHandler = function autoDestroy () {
    +          util.destroy(this)
    +        }
    +        this.body.on('end', this.endHandler)
    +      }
    +
    +      this.errorHandler = err => {
    +        if (this.abort) {
    +          this.abort(err)
    +        } else {
    +          this.error = err
    +        }
    +      }
    +      this.body.on('error', this.errorHandler)
         } else if (util.isBuffer(body)) {
           this.body = body.byteLength ? body : null
         } else if (ArrayBuffer.isView(body)) {
    @@ -211,9 +230,9 @@ class Request {
       onBodySent (chunk) {
         if (this[kHandler].onBodySent) {
           try {
    -        this[kHandler].onBodySent(chunk)
    +        return this[kHandler].onBodySent(chunk)
           } catch (err) {
    -        this.onError(err)
    +        this.abort(err)
           }
         }
       }
    @@ -222,13 +241,26 @@ class Request {
         if (channels.bodySent.hasSubscribers) {
           channels.bodySent.publish({ request: this })
         }
    +
    +    if (this[kHandler].onRequestSent) {
    +      try {
    +        return this[kHandler].onRequestSent()
    +      } catch (err) {
    +        this.abort(err)
    +      }
    +    }
       }
     
       onConnect (abort) {
         assert(!this.aborted)
         assert(!this.completed)
     
    -    return this[kHandler].onConnect(abort)
    +    if (this.error) {
    +      abort(this.error)
    +    } else {
    +      this.abort = abort
    +      return this[kHandler].onConnect(abort)
    +    }
       }
     
       onHeaders (statusCode, headers, resume, statusText) {
    @@ -239,14 +271,23 @@ class Request {
           channels.headers.publish({ request: this, response: { statusCode, headers, statusText } })
         }
     
    -    return this[kHandler].onHeaders(statusCode, headers, resume, statusText)
    +    try {
    +      return this[kHandler].onHeaders(statusCode, headers, resume, statusText)
    +    } catch (err) {
    +      this.abort(err)
    +    }
       }
     
       onData (chunk) {
         assert(!this.aborted)
         assert(!this.completed)
     
    -    return this[kHandler].onData(chunk)
    +    try {
    +      return this[kHandler].onData(chunk)
    +    } catch (err) {
    +      this.abort(err)
    +      return false
    +    }
       }
     
       onUpgrade (statusCode, headers, socket) {
    @@ -257,16 +298,26 @@ class Request {
       }
     
       onComplete (trailers) {
    +    this.onFinally()
    +
         assert(!this.aborted)
     
         this.completed = true
         if (channels.trailers.hasSubscribers) {
           channels.trailers.publish({ request: this, trailers })
         }
    -    return this[kHandler].onComplete(trailers)
    +
    +    try {
    +      return this[kHandler].onComplete(trailers)
    +    } catch (err) {
    +      // TODO (fix): This might be a bad idea?
    +      this.onError(err)
    +    }
       }
     
       onError (error) {
    +    this.onFinally()
    +
         if (channels.error.hasSubscribers) {
           channels.error.publish({ request: this, error })
         }
    @@ -275,9 +326,22 @@ class Request {
           return
         }
         this.aborted = true
    +
         return this[kHandler].onError(error)
       }
     
    +  onFinally () {
    +    if (this.errorHandler) {
    +      this.body.off('error', this.errorHandler)
    +      this.errorHandler = null
    +    }
    +
    +    if (this.endHandler) {
    +      this.body.off('end', this.endHandler)
    +      this.endHandler = null
    +    }
    +  }
    +
       // TODO: adjust to support H2
       addHeader (key, value) {
         processHeader(this, key, value)
    diff --git a/deps/undici/src/lib/core/symbols.js b/deps/undici/src/lib/core/symbols.js
    index c2492f4355fd2a..68d8566fac03de 100644
    --- a/deps/undici/src/lib/core/symbols.js
    +++ b/deps/undici/src/lib/core/symbols.js
    @@ -57,5 +57,7 @@ module.exports = {
       kHTTP2BuildRequest: Symbol('http2 build request'),
       kHTTP1BuildRequest: Symbol('http1 build request'),
       kHTTP2CopyHeaders: Symbol('http2 copy headers'),
    -  kHTTPConnVersion: Symbol('http connection version')
    +  kHTTPConnVersion: Symbol('http connection version'),
    +  kRetryHandlerDefaultRetry: Symbol('retry agent default retry'),
    +  kConstruct: Symbol('constructable')
     }
    diff --git a/deps/undici/src/lib/core/util.js b/deps/undici/src/lib/core/util.js
    index 769811f57f7b8c..8d5450ba0c0c0c 100644
    --- a/deps/undici/src/lib/core/util.js
    +++ b/deps/undici/src/lib/core/util.js
    @@ -125,13 +125,13 @@ function getHostname (host) {
         const idx = host.indexOf(']')
     
         assert(idx !== -1)
    -    return host.substr(1, idx - 1)
    +    return host.substring(1, idx)
       }
     
       const idx = host.indexOf(':')
       if (idx === -1) return host
     
    -  return host.substr(0, idx)
    +  return host.substring(0, idx)
     }
     
     // IP addresses are not valid server names per RFC6066
    @@ -190,7 +190,7 @@ function isReadableAborted (stream) {
     }
     
     function destroy (stream, err) {
    -  if (!isStream(stream) || isDestroyed(stream)) {
    +  if (stream == null || !isStream(stream) || isDestroyed(stream)) {
         return
       }
     
    @@ -228,7 +228,7 @@ function parseHeaders (headers, obj = {}) {
     
         if (!val) {
           if (Array.isArray(headers[i + 1])) {
    -        obj[key] = headers[i + 1]
    +        obj[key] = headers[i + 1].map(x => x.toString('utf8'))
           } else {
             obj[key] = headers[i + 1].toString('utf8')
           }
    @@ -431,16 +431,7 @@ function throwIfAborted (signal) {
       }
     }
     
    -let events
     function addAbortListener (signal, listener) {
    -  if (typeof Symbol.dispose === 'symbol') {
    -    if (!events) {
    -      events = require('events')
    -    }
    -    if (typeof events.addAbortListener === 'function' && 'aborted' in signal) {
    -      return events.addAbortListener(signal, listener)
    -    }
    -  }
       if ('addEventListener' in signal) {
         signal.addEventListener('abort', listener, { once: true })
         return () => signal.removeEventListener('abort', listener)
    @@ -464,6 +455,21 @@ function toUSVString (val) {
       return `${val}`
     }
     
    +// Parsed accordingly to RFC 9110
    +// https://www.rfc-editor.org/rfc/rfc9110#field.content-range
    +function parseRangeHeader (range) {
    +  if (range == null || range === '') return { start: 0, end: null, size: null }
    +
    +  const m = range ? range.match(/^bytes (\d+)-(\d+)\/(\d+)?$/) : null
    +  return m
    +    ? {
    +        start: parseInt(m[1]),
    +        end: m[2] ? parseInt(m[2]) : null,
    +        size: m[3] ? parseInt(m[3]) : null
    +      }
    +    : null
    +}
    +
     const kEnumerableProperty = Object.create(null)
     kEnumerableProperty.enumerable = true
     
    @@ -497,7 +503,9 @@ module.exports = {
       buildURL,
       throwIfAborted,
       addAbortListener,
    +  parseRangeHeader,
       nodeMajor,
       nodeMinor,
    -  nodeHasAutoSelectFamily: nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 13)
    +  nodeHasAutoSelectFamily: nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 13),
    +  safeHTTPMethods: ['GET', 'HEAD', 'OPTIONS', 'TRACE']
     }
    diff --git a/deps/undici/src/lib/fetch/body.js b/deps/undici/src/lib/fetch/body.js
    index 1d9f17d7e330c6..fd8481b796d847 100644
    --- a/deps/undici/src/lib/fetch/body.js
    +++ b/deps/undici/src/lib/fetch/body.js
    @@ -26,6 +26,8 @@ let ReadableStream = globalThis.ReadableStream
     
     /** @type {globalThis['File']} */
     const File = NativeFile ?? UndiciFile
    +const textEncoder = new TextEncoder()
    +const textDecoder = new TextDecoder()
     
     // https://fetch.spec.whatwg.org/#concept-bodyinit-extract
     function extractBody (object, keepalive = false) {
    @@ -49,7 +51,7 @@ function extractBody (object, keepalive = false) {
         stream = new ReadableStream({
           async pull (controller) {
             controller.enqueue(
    -          typeof source === 'string' ? new TextEncoder().encode(source) : source
    +          typeof source === 'string' ? textEncoder.encode(source) : source
             )
             queueMicrotask(() => readableStreamClose(controller))
           },
    @@ -119,7 +121,6 @@ function extractBody (object, keepalive = false) {
         // - That the content-length is calculated in advance.
         // - And that all parts are pre-encoded and ready to be sent.
     
    -    const enc = new TextEncoder()
         const blobParts = []
         const rn = new Uint8Array([13, 10]) // '\r\n'
         length = 0
    @@ -127,13 +128,13 @@ function extractBody (object, keepalive = false) {
     
         for (const [name, value] of object) {
           if (typeof value === 'string') {
    -        const chunk = enc.encode(prefix +
    +        const chunk = textEncoder.encode(prefix +
               `; name="${escape(normalizeLinefeeds(name))}"` +
               `\r\n\r\n${normalizeLinefeeds(value)}\r\n`)
             blobParts.push(chunk)
             length += chunk.byteLength
           } else {
    -        const chunk = enc.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` +
    +        const chunk = textEncoder.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` +
               (value.name ? `; filename="${escape(value.name)}"` : '') + '\r\n' +
               `Content-Type: ${
                 value.type || 'application/octet-stream'
    @@ -147,7 +148,7 @@ function extractBody (object, keepalive = false) {
           }
         }
     
    -    const chunk = enc.encode(`--${boundary}--`)
    +    const chunk = textEncoder.encode(`--${boundary}--`)
         blobParts.push(chunk)
         length += chunk.byteLength
         if (hasUnknownSizeValue) {
    @@ -443,14 +444,16 @@ function bodyMixinMethods (instance) {
               let text = ''
               // application/x-www-form-urlencoded parser will keep the BOM.
               // https://url.spec.whatwg.org/#concept-urlencoded-parser
    -          const textDecoder = new TextDecoder('utf-8', { ignoreBOM: true })
    +          // Note that streaming decoder is stateful and cannot be reused
    +          const streamingDecoder = new TextDecoder('utf-8', { ignoreBOM: true })
    +
               for await (const chunk of consumeBody(this[kState].body)) {
                 if (!isUint8Array(chunk)) {
                   throw new TypeError('Expected Uint8Array chunk')
                 }
    -            text += textDecoder.decode(chunk, { stream: true })
    +            text += streamingDecoder.decode(chunk, { stream: true })
               }
    -          text += textDecoder.decode()
    +          text += streamingDecoder.decode()
               entries = new URLSearchParams(text)
             } catch (err) {
               // istanbul ignore next: Unclear when new URLSearchParams can fail on a string.
    @@ -565,7 +568,7 @@ function utf8DecodeBytes (buffer) {
     
       // 3. Process a queue with an instance of UTF-8’s
       //    decoder, ioQueue, output, and "replacement".
    -  const output = new TextDecoder().decode(buffer)
    +  const output = textDecoder.decode(buffer)
     
       // 4. Return output.
       return output
    diff --git a/deps/undici/src/lib/fetch/constants.js b/deps/undici/src/lib/fetch/constants.js
    index a5294a994fbc45..218fcbee4da4c7 100644
    --- a/deps/undici/src/lib/fetch/constants.js
    +++ b/deps/undici/src/lib/fetch/constants.js
    @@ -3,10 +3,12 @@
     const { MessageChannel, receiveMessageOnPort } = require('worker_threads')
     
     const corsSafeListedMethods = ['GET', 'HEAD', 'POST']
    +const corsSafeListedMethodsSet = new Set(corsSafeListedMethods)
     
     const nullBodyStatus = [101, 204, 205, 304]
     
     const redirectStatus = [301, 302, 303, 307, 308]
    +const redirectStatusSet = new Set(redirectStatus)
     
     // https://fetch.spec.whatwg.org/#block-bad-port
     const badPorts = [
    @@ -18,6 +20,8 @@ const badPorts = [
       '10080'
     ]
     
    +const badPortsSet = new Set(badPorts)
    +
     // https://w3c.github.io/webappsec-referrer-policy/#referrer-policies
     const referrerPolicy = [
       '',
    @@ -30,10 +34,12 @@ const referrerPolicy = [
       'strict-origin-when-cross-origin',
       'unsafe-url'
     ]
    +const referrerPolicySet = new Set(referrerPolicy)
     
     const requestRedirect = ['follow', 'manual', 'error']
     
     const safeMethods = ['GET', 'HEAD', 'OPTIONS', 'TRACE']
    +const safeMethodsSet = new Set(safeMethods)
     
     const requestMode = ['navigate', 'same-origin', 'no-cors', 'cors']
     
    @@ -68,6 +74,7 @@ const requestDuplex = [
     
     // http://fetch.spec.whatwg.org/#forbidden-method
     const forbiddenMethods = ['CONNECT', 'TRACE', 'TRACK']
    +const forbiddenMethodsSet = new Set(forbiddenMethods)
     
     const subresource = [
       'audio',
    @@ -83,6 +90,7 @@ const subresource = [
       'xslt',
       ''
     ]
    +const subresourceSet = new Set(subresource)
     
     /** @type {globalThis['DOMException']} */
     const DOMException = globalThis.DOMException ?? (() => {
    @@ -132,5 +140,12 @@ module.exports = {
       nullBodyStatus,
       safeMethods,
       badPorts,
    -  requestDuplex
    +  requestDuplex,
    +  subresourceSet,
    +  badPortsSet,
    +  redirectStatusSet,
    +  corsSafeListedMethodsSet,
    +  safeMethodsSet,
    +  forbiddenMethodsSet,
    +  referrerPolicySet
     }
    diff --git a/deps/undici/src/lib/fetch/dataURL.js b/deps/undici/src/lib/fetch/dataURL.js
    index 6df4fcc8cc6375..7b6a606106dd69 100644
    --- a/deps/undici/src/lib/fetch/dataURL.js
    +++ b/deps/undici/src/lib/fetch/dataURL.js
    @@ -119,17 +119,14 @@ function dataURLProcessor (dataURL) {
      * @param {boolean} excludeFragment
      */
     function URLSerializer (url, excludeFragment = false) {
    -  const href = url.href
    -
       if (!excludeFragment) {
    -    return href
    +    return url.href
       }
     
    -  const hash = href.lastIndexOf('#')
    -  if (hash === -1) {
    -    return href
    -  }
    -  return href.slice(0, hash)
    +  const href = url.href
    +  const hashLength = url.hash.length
    +
    +  return hashLength === 0 ? href : href.substring(0, href.length - hashLength)
     }
     
     // https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points
    diff --git a/deps/undici/src/lib/fetch/file.js b/deps/undici/src/lib/fetch/file.js
    index 81bb7b2441aaa2..3133d255ecdcdb 100644
    --- a/deps/undici/src/lib/fetch/file.js
    +++ b/deps/undici/src/lib/fetch/file.js
    @@ -7,6 +7,7 @@ const { isBlobLike } = require('./util')
     const { webidl } = require('./webidl')
     const { parseMIMEType, serializeAMimeType } = require('./dataURL')
     const { kEnumerableProperty } = require('../core/util')
    +const encoder = new TextEncoder()
     
     class File extends Blob {
       constructor (fileBits, fileName, options = {}) {
    @@ -280,7 +281,7 @@ function processBlobParts (parts, options) {
           }
     
           // 3. Append the result of UTF-8 encoding s to bytes.
    -      bytes.push(new TextEncoder().encode(s))
    +      bytes.push(encoder.encode(s))
         } else if (
           types.isAnyArrayBuffer(element) ||
           types.isTypedArray(element)
    diff --git a/deps/undici/src/lib/fetch/headers.js b/deps/undici/src/lib/fetch/headers.js
    index aa5e73e5d27542..2f1c0be5a47309 100644
    --- a/deps/undici/src/lib/fetch/headers.js
    +++ b/deps/undici/src/lib/fetch/headers.js
    @@ -2,7 +2,7 @@
     
     'use strict'
     
    -const { kHeadersList } = require('../core/symbols')
    +const { kHeadersList, kConstruct } = require('../core/symbols')
     const { kGuard } = require('./symbols')
     const { kEnumerableProperty } = require('../core/util')
     const {
    @@ -16,6 +16,13 @@ const assert = require('assert')
     const kHeadersMap = Symbol('headers map')
     const kHeadersSortedMap = Symbol('headers map sorted')
     
    +/**
    + * @param {number} code
    + */
    +function isHTTPWhiteSpaceCharCode (code) {
    +  return code === 0x00a || code === 0x00d || code === 0x009 || code === 0x020
    +}
    +
     /**
      * @see https://fetch.spec.whatwg.org/#concept-header-value-normalize
      * @param {string} potentialValue
    @@ -24,12 +31,12 @@ function headerValueNormalize (potentialValue) {
       //  To normalize a byte sequence potentialValue, remove
       //  any leading and trailing HTTP whitespace bytes from
       //  potentialValue.
    +  let i = 0; let j = potentialValue.length
     
    -  // Trimming the end with `.replace()` and a RegExp is typically subject to
    -  // ReDoS. This is safer and faster.
    -  let i = potentialValue.length
    -  while (/[\r\n\t ]/.test(potentialValue.charAt(--i)));
    -  return potentialValue.slice(0, i + 1).replace(/^[\r\n\t ]+/, '')
    +  while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(j - 1))) --j
    +  while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(i))) ++i
    +
    +  return i === 0 && j === potentialValue.length ? potentialValue : potentialValue.substring(i, j)
     }
     
     function fill (headers, object) {
    @@ -38,7 +45,8 @@ function fill (headers, object) {
       // 1. If object is a sequence, then for each header in object:
       // Note: webidl conversion to array has already been done.
       if (Array.isArray(object)) {
    -    for (const header of object) {
    +    for (let i = 0; i < object.length; ++i) {
    +      const header = object[i]
           // 1. If header does not contain exactly two items, then throw a TypeError.
           if (header.length !== 2) {
             throw webidl.errors.exception({
    @@ -48,15 +56,16 @@ function fill (headers, object) {
           }
     
           // 2. Append (header’s first item, header’s second item) to headers.
    -      headers.append(header[0], header[1])
    +      appendHeader(headers, header[0], header[1])
         }
       } else if (typeof object === 'object' && object !== null) {
         // Note: null should throw
     
         // 2. Otherwise, object is a record, then for each key → value in object,
         //    append (key, value) to headers
    -    for (const [key, value] of Object.entries(object)) {
    -      headers.append(key, value)
    +    const keys = Object.keys(object)
    +    for (let i = 0; i < keys.length; ++i) {
    +      appendHeader(headers, keys[i], object[keys[i]])
         }
       } else {
         throw webidl.errors.conversionFailed({
    @@ -67,6 +76,50 @@ function fill (headers, object) {
       }
     }
     
    +/**
    + * @see https://fetch.spec.whatwg.org/#concept-headers-append
    + */
    +function appendHeader (headers, name, value) {
    +  // 1. Normalize value.
    +  value = headerValueNormalize(value)
    +
    +  // 2. If name is not a header name or value is not a
    +  //    header value, then throw a TypeError.
    +  if (!isValidHeaderName(name)) {
    +    throw webidl.errors.invalidArgument({
    +      prefix: 'Headers.append',
    +      value: name,
    +      type: 'header name'
    +    })
    +  } else if (!isValidHeaderValue(value)) {
    +    throw webidl.errors.invalidArgument({
    +      prefix: 'Headers.append',
    +      value,
    +      type: 'header value'
    +    })
    +  }
    +
    +  // 3. If headers’s guard is "immutable", then throw a TypeError.
    +  // 4. Otherwise, if headers’s guard is "request" and name is a
    +  //    forbidden header name, return.
    +  // Note: undici does not implement forbidden header names
    +  if (headers[kGuard] === 'immutable') {
    +    throw new TypeError('immutable')
    +  } else if (headers[kGuard] === 'request-no-cors') {
    +    // 5. Otherwise, if headers’s guard is "request-no-cors":
    +    // TODO
    +  }
    +
    +  // 6. Otherwise, if headers’s guard is "response" and name is a
    +  //    forbidden response-header name, return.
    +
    +  // 7. Append (name, value) to headers’s header list.
    +  return headers[kHeadersList].append(name, value)
    +
    +  // 8. If headers’s guard is "request-no-cors", then remove
    +  //    privileged no-CORS request headers from headers
    +}
    +
     class HeadersList {
       /** @type {[string, string][]|null} */
       cookies = null
    @@ -75,7 +128,7 @@ class HeadersList {
         if (init instanceof HeadersList) {
           this[kHeadersMap] = new Map(init[kHeadersMap])
           this[kHeadersSortedMap] = init[kHeadersSortedMap]
    -      this.cookies = init.cookies
    +      this.cookies = init.cookies === null ? null : [...init.cookies]
         } else {
           this[kHeadersMap] = new Map(init)
           this[kHeadersSortedMap] = null
    @@ -137,7 +190,7 @@ class HeadersList {
         //    the first such header to value and remove the
         //    others.
         // 2. Otherwise, append header (name, value) to list.
    -    return this[kHeadersMap].set(lowercaseName, { name, value })
    +    this[kHeadersMap].set(lowercaseName, { name, value })
       }
     
       // https://fetch.spec.whatwg.org/#concept-header-list-delete
    @@ -150,20 +203,18 @@ class HeadersList {
           this.cookies = null
         }
     
    -    return this[kHeadersMap].delete(name)
    +    this[kHeadersMap].delete(name)
       }
     
       // https://fetch.spec.whatwg.org/#concept-header-list-get
       get (name) {
    -    // 1. If list does not contain name, then return null.
    -    if (!this.contains(name)) {
    -      return null
    -    }
    +    const value = this[kHeadersMap].get(name.toLowerCase())
     
    +    // 1. If list does not contain name, then return null.
         // 2. Return the values of all headers in list whose name
         //    is a byte-case-insensitive match for name,
         //    separated from each other by 0x2C 0x20, in order.
    -    return this[kHeadersMap].get(name.toLowerCase())?.value ?? null
    +    return value === undefined ? null : value.value
       }
     
       * [Symbol.iterator] () {
    @@ -189,6 +240,9 @@ class HeadersList {
     // https://fetch.spec.whatwg.org/#headers-class
     class Headers {
       constructor (init = undefined) {
    +    if (init === kConstruct) {
    +      return
    +    }
         this[kHeadersList] = new HeadersList()
     
         // The new Headers(init) constructor steps are:
    @@ -212,43 +266,7 @@ class Headers {
         name = webidl.converters.ByteString(name)
         value = webidl.converters.ByteString(value)
     
    -    // 1. Normalize value.
    -    value = headerValueNormalize(value)
    -
    -    // 2. If name is not a header name or value is not a
    -    //    header value, then throw a TypeError.
    -    if (!isValidHeaderName(name)) {
    -      throw webidl.errors.invalidArgument({
    -        prefix: 'Headers.append',
    -        value: name,
    -        type: 'header name'
    -      })
    -    } else if (!isValidHeaderValue(value)) {
    -      throw webidl.errors.invalidArgument({
    -        prefix: 'Headers.append',
    -        value,
    -        type: 'header value'
    -      })
    -    }
    -
    -    // 3. If headers’s guard is "immutable", then throw a TypeError.
    -    // 4. Otherwise, if headers’s guard is "request" and name is a
    -    //    forbidden header name, return.
    -    // Note: undici does not implement forbidden header names
    -    if (this[kGuard] === 'immutable') {
    -      throw new TypeError('immutable')
    -    } else if (this[kGuard] === 'request-no-cors') {
    -      // 5. Otherwise, if headers’s guard is "request-no-cors":
    -      // TODO
    -    }
    -
    -    // 6. Otherwise, if headers’s guard is "response" and name is a
    -    //    forbidden response-header name, return.
    -
    -    // 7. Append (name, value) to headers’s header list.
    -    // 8. If headers’s guard is "request-no-cors", then remove
    -    //    privileged no-CORS request headers from headers
    -    return this[kHeadersList].append(name, value)
    +    return appendHeader(this, name, value)
       }
     
       // https://fetch.spec.whatwg.org/#dom-headers-delete
    @@ -293,7 +311,7 @@ class Headers {
         // 7. Delete name from this’s header list.
         // 8. If this’s guard is "request-no-cors", then remove
         //    privileged no-CORS request headers from this.
    -    return this[kHeadersList].delete(name)
    +    this[kHeadersList].delete(name)
       }
     
       // https://fetch.spec.whatwg.org/#dom-headers-get
    @@ -386,7 +404,7 @@ class Headers {
         // 7. Set (name, value) in this’s header list.
         // 8. If this’s guard is "request-no-cors", then remove
         //    privileged no-CORS request headers from this
    -    return this[kHeadersList].set(name, value)
    +    this[kHeadersList].set(name, value)
       }
     
       // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie
    @@ -422,7 +440,8 @@ class Headers {
         const cookies = this[kHeadersList].cookies
     
         // 3. For each name of names:
    -    for (const [name, value] of names) {
    +    for (let i = 0; i < names.length; ++i) {
    +      const [name, value] = names[i]
           // 1. If name is `set-cookie`, then:
           if (name === 'set-cookie') {
             // 1. Let values be a list of all values of headers in list whose name
    @@ -430,8 +449,8 @@ class Headers {
     
             // 2. For each value of values:
             // 1. Append (name, value) to headers.
    -        for (const value of cookies) {
    -          headers.push([name, value])
    +        for (let j = 0; j < cookies.length; ++j) {
    +          headers.push([name, cookies[j]])
             }
           } else {
             // 2. Otherwise:
    @@ -455,6 +474,12 @@ class Headers {
       keys () {
         webidl.brandCheck(this, Headers)
     
    +    if (this[kGuard] === 'immutable') {
    +      const value = this[kHeadersSortedMap]
    +      return makeIterator(() => value, 'Headers',
    +        'key')
    +    }
    +
         return makeIterator(
           () => [...this[kHeadersSortedMap].values()],
           'Headers',
    @@ -465,6 +490,12 @@ class Headers {
       values () {
         webidl.brandCheck(this, Headers)
     
    +    if (this[kGuard] === 'immutable') {
    +      const value = this[kHeadersSortedMap]
    +      return makeIterator(() => value, 'Headers',
    +        'value')
    +    }
    +
         return makeIterator(
           () => [...this[kHeadersSortedMap].values()],
           'Headers',
    @@ -475,6 +506,12 @@ class Headers {
       entries () {
         webidl.brandCheck(this, Headers)
     
    +    if (this[kGuard] === 'immutable') {
    +      const value = this[kHeadersSortedMap]
    +      return makeIterator(() => value, 'Headers',
    +        'key+value')
    +    }
    +
         return makeIterator(
           () => [...this[kHeadersSortedMap].values()],
           'Headers',
    diff --git a/deps/undici/src/lib/fetch/index.js b/deps/undici/src/lib/fetch/index.js
    index 5323c30abc8791..17c3d87ea62727 100644
    --- a/deps/undici/src/lib/fetch/index.js
    +++ b/deps/undici/src/lib/fetch/index.js
    @@ -46,11 +46,11 @@ const { kState, kHeaders, kGuard, kRealm } = require('./symbols')
     const assert = require('assert')
     const { safelyExtractBody } = require('./body')
     const {
    -  redirectStatus,
    +  redirectStatusSet,
       nullBodyStatus,
    -  safeMethods,
    +  safeMethodsSet,
       requestBodyHeader,
    -  subresource,
    +  subresourceSet,
       DOMException
     } = require('./constants')
     const { kHeadersList } = require('../core/symbols')
    @@ -62,6 +62,7 @@ const { TransformStream } = require('stream/web')
     const { getGlobalDispatcher } = require('../global')
     const { webidl } = require('./webidl')
     const { STATUS_CODES } = require('http')
    +const GET_OR_HEAD = ['GET', 'HEAD']
     
     /** @type {import('buffer').resolveObjectURL} */
     let resolveObjectURL
    @@ -121,7 +122,7 @@ class Fetch extends EE {
     }
     
     // https://fetch.spec.whatwg.org/#fetch-method
    -async function fetch (input, init = {}) {
    +function fetch (input, init = {}) {
       webidl.argumentLengthCheck(arguments, 1, { header: 'globalThis.fetch' })
     
       // 1. Let p be a new promise.
    @@ -204,7 +205,7 @@ async function fetch (input, init = {}) {
       const processResponse = (response) => {
         // 1. If locallyAborted is true, terminate these substeps.
         if (locallyAborted) {
    -      return
    +      return Promise.resolve()
         }
     
         // 2. If response’s aborted flag is set, then:
    @@ -217,7 +218,7 @@ async function fetch (input, init = {}) {
           //    deserializedError.
     
           abortFetch(p, request, responseObject, controller.serializedAbortReason)
    -      return
    +      return Promise.resolve()
         }
     
         // 3. If response is a network error, then reject p with a TypeError
    @@ -226,7 +227,7 @@ async function fetch (input, init = {}) {
           p.reject(
             Object.assign(new TypeError('fetch failed'), { cause: response.error })
           )
    -      return
    +      return Promise.resolve()
         }
     
         // 4. Set responseObject to the result of creating a Response object,
    @@ -285,7 +286,7 @@ function finalizeAndReportTiming (response, initiatorType = 'other') {
       }
     
       // 8. If response’s timing allow passed flag is not set, then:
    -  if (!timingInfo.timingAllowPassed) {
    +  if (!response.timingAllowPassed) {
         //  1. Set timingInfo to a the result of creating an opaque timing info for timingInfo.
         timingInfo = createOpaqueTimingInfo({
           startTime: timingInfo.startTime
    @@ -509,7 +510,7 @@ function fetching ({
       }
     
       // 15. If request is a subresource request, then:
    -  if (subresource.includes(request.destination)) {
    +  if (subresourceSet.has(request.destination)) {
         // TODO
       }
     
    @@ -776,13 +777,13 @@ async function mainFetch (fetchParams, recursive = false) {
     
     // https://fetch.spec.whatwg.org/#concept-scheme-fetch
     // given a fetch params fetchParams
    -async function schemeFetch (fetchParams) {
    +function schemeFetch (fetchParams) {
       // Note: since the connection is destroyed on redirect, which sets fetchParams to a
       // cancelled state, we do not want this condition to trigger *unless* there have been
       // no redirects. See https://github.com/nodejs/undici/issues/1776
       // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams.
       if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) {
    -    return makeAppropriateNetworkError(fetchParams)
    +    return Promise.resolve(makeAppropriateNetworkError(fetchParams))
       }
     
       // 2. Let request be fetchParams’s request.
    @@ -798,7 +799,7 @@ async function schemeFetch (fetchParams) {
           // and body is the empty byte sequence as a body.
     
           // Otherwise, return a network error.
    -      return makeNetworkError('about scheme is not supported')
    +      return Promise.resolve(makeNetworkError('about scheme is not supported'))
         }
         case 'blob:': {
           if (!resolveObjectURL) {
    @@ -811,7 +812,7 @@ async function schemeFetch (fetchParams) {
           // https://github.com/web-platform-tests/wpt/blob/7b0ebaccc62b566a1965396e5be7bb2bc06f841f/FileAPI/url/resources/fetch-tests.js#L52-L56
           // Buffer.resolveObjectURL does not ignore URL queries.
           if (blobURLEntry.search.length !== 0) {
    -        return makeNetworkError('NetworkError when attempting to fetch resource.')
    +        return Promise.resolve(makeNetworkError('NetworkError when attempting to fetch resource.'))
           }
     
           const blobURLEntryObject = resolveObjectURL(blobURLEntry.toString())
    @@ -819,7 +820,7 @@ async function schemeFetch (fetchParams) {
           // 2. If request’s method is not `GET`, blobURLEntry is null, or blobURLEntry’s
           //    object is not a Blob object, then return a network error.
           if (request.method !== 'GET' || !isBlobLike(blobURLEntryObject)) {
    -        return makeNetworkError('invalid method')
    +        return Promise.resolve(makeNetworkError('invalid method'))
           }
     
           // 3. Let bodyWithType be the result of safely extracting blobURLEntry’s object.
    @@ -846,7 +847,7 @@ async function schemeFetch (fetchParams) {
     
           response.body = body
     
    -      return response
    +      return Promise.resolve(response)
         }
         case 'data:': {
           // 1. Let dataURLStruct be the result of running the
    @@ -857,7 +858,7 @@ async function schemeFetch (fetchParams) {
           // 2. If dataURLStruct is failure, then return a
           //    network error.
           if (dataURLStruct === 'failure') {
    -        return makeNetworkError('failed to fetch the data URL')
    +        return Promise.resolve(makeNetworkError('failed to fetch the data URL'))
           }
     
           // 3. Let mimeType be dataURLStruct’s MIME type, serialized.
    @@ -866,28 +867,28 @@ async function schemeFetch (fetchParams) {
           // 4. Return a response whose status message is `OK`,
           //    header list is « (`Content-Type`, mimeType) »,
           //    and body is dataURLStruct’s body as a body.
    -      return makeResponse({
    +      return Promise.resolve(makeResponse({
             statusText: 'OK',
             headersList: [
               ['content-type', { name: 'Content-Type', value: mimeType }]
             ],
             body: safelyExtractBody(dataURLStruct.body)[0]
    -      })
    +      }))
         }
         case 'file:': {
           // For now, unfortunate as it is, file URLs are left as an exercise for the reader.
           // When in doubt, return a network error.
    -      return makeNetworkError('not implemented... yet...')
    +      return Promise.resolve(makeNetworkError('not implemented... yet...'))
         }
         case 'http:':
         case 'https:': {
           // Return the result of running HTTP fetch given fetchParams.
     
    -      return await httpFetch(fetchParams)
    +      return httpFetch(fetchParams)
             .catch((err) => makeNetworkError(err))
         }
         default: {
    -      return makeNetworkError('unknown scheme')
    +      return Promise.resolve(makeNetworkError('unknown scheme'))
         }
       }
     }
    @@ -906,7 +907,7 @@ function finalizeResponse (fetchParams, response) {
     }
     
     // https://fetch.spec.whatwg.org/#fetch-finale
    -async function fetchFinale (fetchParams, response) {
    +function fetchFinale (fetchParams, response) {
       // 1. If response is a network error, then:
       if (response.type === 'error') {
         // 1. Set response’s URL list to « fetchParams’s request’s URL list[0] ».
    @@ -990,8 +991,9 @@ async function fetchFinale (fetchParams, response) {
         } else {
           // 4. Otherwise, fully read response’s body given processBody, processBodyError,
           // and fetchParams’s task destination.
    -      await fullyReadBody(response.body, processBody, processBodyError)
    +      return fullyReadBody(response.body, processBody, processBodyError)
         }
    +    return Promise.resolve()
       }
     }
     
    @@ -1062,7 +1064,7 @@ async function httpFetch (fetchParams) {
       }
     
       // 8. If actualResponse’s status is a redirect status, then:
    -  if (redirectStatus.includes(actualResponse.status)) {
    +  if (redirectStatusSet.has(actualResponse.status)) {
         // 1. If actualResponse’s status is not 303, request’s body is not null,
         // and the connection uses HTTP/2, then user agents may, and are even
         // encouraged to, transmit an RST_STREAM frame.
    @@ -1099,7 +1101,7 @@ async function httpFetch (fetchParams) {
     }
     
     // https://fetch.spec.whatwg.org/#http-redirect-fetch
    -async function httpRedirectFetch (fetchParams, response) {
    +function httpRedirectFetch (fetchParams, response) {
       // 1. Let request be fetchParams’s request.
       const request = fetchParams.request
     
    @@ -1125,18 +1127,18 @@ async function httpRedirectFetch (fetchParams, response) {
         }
       } catch (err) {
         // 5. If locationURL is failure, then return a network error.
    -    return makeNetworkError(err)
    +    return Promise.resolve(makeNetworkError(err))
       }
     
       // 6. If locationURL’s scheme is not an HTTP(S) scheme, then return a network
       // error.
       if (!urlIsHttpHttpsScheme(locationURL)) {
    -    return makeNetworkError('URL scheme must be a HTTP(S) scheme')
    +    return Promise.resolve(makeNetworkError('URL scheme must be a HTTP(S) scheme'))
       }
     
       // 7. If request’s redirect count is 20, then return a network error.
       if (request.redirectCount === 20) {
    -    return makeNetworkError('redirect count exceeded')
    +    return Promise.resolve(makeNetworkError('redirect count exceeded'))
       }
     
       // 8. Increase request’s redirect count by 1.
    @@ -1150,7 +1152,7 @@ async function httpRedirectFetch (fetchParams, response) {
         (locationURL.username || locationURL.password) &&
         !sameOrigin(request, locationURL)
       ) {
    -    return makeNetworkError('cross origin not allowed for request mode "cors"')
    +    return Promise.resolve(makeNetworkError('cross origin not allowed for request mode "cors"'))
       }
     
       // 10. If request’s response tainting is "cors" and locationURL includes
    @@ -1159,9 +1161,9 @@ async function httpRedirectFetch (fetchParams, response) {
         request.responseTainting === 'cors' &&
         (locationURL.username || locationURL.password)
       ) {
    -    return makeNetworkError(
    +    return Promise.resolve(makeNetworkError(
           'URL cannot contain credentials for request mode "cors"'
    -    )
    +    ))
       }
     
       // 11. If actualResponse’s status is not 303, request’s body is non-null,
    @@ -1171,7 +1173,7 @@ async function httpRedirectFetch (fetchParams, response) {
         request.body != null &&
         request.body.source == null
       ) {
    -    return makeNetworkError()
    +    return Promise.resolve(makeNetworkError())
       }
     
       // 12. If one of the following is true
    @@ -1180,7 +1182,7 @@ async function httpRedirectFetch (fetchParams, response) {
       if (
         ([301, 302].includes(actualResponse.status) && request.method === 'POST') ||
         (actualResponse.status === 303 &&
    -      !['GET', 'HEAD'].includes(request.method))
    +      !GET_OR_HEAD.includes(request.method))
       ) {
         // then:
         // 1. Set request’s method to `GET` and request’s body to null.
    @@ -1464,7 +1466,7 @@ async function httpNetworkOrCacheFetch (
         // responses in httpCache, as per the "Invalidation" chapter of HTTP
         // Caching, and set storedResponse to null. [HTTP-CACHING]
         if (
    -      !safeMethods.includes(httpRequest.method) &&
    +      !safeMethodsSet.has(httpRequest.method) &&
           forwardResponse.status >= 200 &&
           forwardResponse.status <= 399
         ) {
    @@ -1955,7 +1957,7 @@ async function httpNetworkFetch (
             path: url.pathname + url.search,
             origin: url.origin,
             method: request.method,
    -        body: fetchParams.controller.dispatcher.isMockActive ? request.body && request.body.source : body,
    +        body: fetchParams.controller.dispatcher.isMockActive ? request.body && (request.body.source || request.body.stream) : body,
             headers: request.headersList.entries,
             maxRedirections: 0,
             upgrade: request.mode === 'websocket' ? 'websocket' : undefined
    @@ -2000,7 +2002,7 @@ async function httpNetworkFetch (
                     location = val
                   }
     
    -              headers.append(key, val)
    +              headers[kHeadersList].append(key, val)
                 }
               } else {
                 const keys = Object.keys(headersList)
    @@ -2014,7 +2016,7 @@ async function httpNetworkFetch (
                     location = val
                   }
     
    -              headers.append(key, val)
    +              headers[kHeadersList].append(key, val)
                 }
               }
     
    @@ -2024,7 +2026,7 @@ async function httpNetworkFetch (
     
               const willFollow = request.redirect === 'follow' &&
                 location &&
    -            redirectStatus.includes(status)
    +            redirectStatusSet.has(status)
     
               // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding
               if (request.method !== 'HEAD' && request.method !== 'CONNECT' && !nullBodyStatus.includes(status) && !willFollow) {
    @@ -2118,7 +2120,7 @@ async function httpNetworkFetch (
                 const key = headersList[n + 0].toString('latin1')
                 const val = headersList[n + 1].toString('latin1')
     
    -            headers.append(key, val)
    +            headers[kHeadersList].append(key, val)
               }
     
               resolve({
    diff --git a/deps/undici/src/lib/fetch/request.js b/deps/undici/src/lib/fetch/request.js
    index 912bd5b8c988af..6fe4dff64c4472 100644
    --- a/deps/undici/src/lib/fetch/request.js
    +++ b/deps/undici/src/lib/fetch/request.js
    @@ -10,11 +10,12 @@ const {
       isValidHTTPToken,
       sameOrigin,
       normalizeMethod,
    -  makePolicyContainer
    +  makePolicyContainer,
    +  normalizeMethodRecord
     } = require('./util')
     const {
    -  forbiddenMethods,
    -  corsSafeListedMethods,
    +  forbiddenMethodsSet,
    +  corsSafeListedMethodsSet,
       referrerPolicy,
       requestRedirect,
       requestMode,
    @@ -27,13 +28,12 @@ const { kHeaders, kSignal, kState, kGuard, kRealm } = require('./symbols')
     const { webidl } = require('./webidl')
     const { getGlobalOrigin } = require('./global')
     const { URLSerializer } = require('./dataURL')
    -const { kHeadersList } = require('../core/symbols')
    +const { kHeadersList, kConstruct } = require('../core/symbols')
     const assert = require('assert')
     const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = require('events')
     
     let TransformStream = globalThis.TransformStream
     
    -const kInit = Symbol('init')
     const kAbortController = Symbol('abortController')
     
     const requestFinalizer = new FinalizationRegistry(({ signal, abort }) => {
    @@ -44,7 +44,7 @@ const requestFinalizer = new FinalizationRegistry(({ signal, abort }) => {
     class Request {
       // https://fetch.spec.whatwg.org/#dom-request
       constructor (input, init = {}) {
    -    if (input === kInit) {
    +    if (input === kConstruct) {
           return
         }
     
    @@ -183,8 +183,10 @@ class Request {
           urlList: [...request.urlList]
         })
     
    +    const initHasKey = Object.keys(init).length !== 0
    +
         // 13. If init is not empty, then:
    -    if (Object.keys(init).length > 0) {
    +    if (initHasKey) {
           // 1. If request’s mode is "navigate", then set it to "same-origin".
           if (request.mode === 'navigate') {
             request.mode = 'same-origin'
    @@ -299,7 +301,7 @@ class Request {
         }
     
         // 23. If init["integrity"] exists, then set request’s integrity metadata to it.
    -    if (init.integrity !== undefined && init.integrity != null) {
    +    if (init.integrity != null) {
           request.integrity = String(init.integrity)
         }
     
    @@ -315,16 +317,16 @@ class Request {
     
           // 2. If method is not a method or method is a forbidden method, then
           // throw a TypeError.
    -      if (!isValidHTTPToken(init.method)) {
    -        throw TypeError(`'${init.method}' is not a valid HTTP method.`)
    +      if (!isValidHTTPToken(method)) {
    +        throw new TypeError(`'${method}' is not a valid HTTP method.`)
           }
     
    -      if (forbiddenMethods.indexOf(method.toUpperCase()) !== -1) {
    -        throw TypeError(`'${init.method}' HTTP method is unsupported.`)
    +      if (forbiddenMethodsSet.has(method.toUpperCase())) {
    +        throw new TypeError(`'${method}' HTTP method is unsupported.`)
           }
     
           // 3. Normalize method.
    -      method = normalizeMethod(init.method)
    +      method = normalizeMethodRecord[method] ?? normalizeMethod(method)
     
           // 4. Set request’s method to method.
           request.method = method
    @@ -395,7 +397,7 @@ class Request {
         // 30. Set this’s headers to a new Headers object with this’s relevant
         // Realm, whose header list is request’s header list and guard is
         // "request".
    -    this[kHeaders] = new Headers()
    +    this[kHeaders] = new Headers(kConstruct)
         this[kHeaders][kHeadersList] = request.headersList
         this[kHeaders][kGuard] = 'request'
         this[kHeaders][kRealm] = this[kRealm]
    @@ -404,7 +406,7 @@ class Request {
         if (mode === 'no-cors') {
           // 1. If this’s request’s method is not a CORS-safelisted method,
           // then throw a TypeError.
    -      if (!corsSafeListedMethods.includes(request.method)) {
    +      if (!corsSafeListedMethodsSet.has(request.method)) {
             throw new TypeError(
               `'${request.method} is unsupported in no-cors mode.`
             )
    @@ -415,25 +417,25 @@ class Request {
         }
     
         // 32. If init is not empty, then:
    -    if (Object.keys(init).length !== 0) {
    +    if (initHasKey) {
    +      /** @type {HeadersList} */
    +      const headersList = this[kHeaders][kHeadersList]
           // 1. Let headers be a copy of this’s headers and its associated header
           // list.
    -      let headers = new Headers(this[kHeaders])
    -
           // 2. If init["headers"] exists, then set headers to init["headers"].
    -      if (init.headers !== undefined) {
    -        headers = init.headers
    -      }
    +      const headers = init.headers !== undefined ? init.headers : new HeadersList(headersList)
     
           // 3. Empty this’s headers’s header list.
    -      this[kHeaders][kHeadersList].clear()
    +      headersList.clear()
     
           // 4. If headers is a Headers object, then for each header in its header
           // list, append header’s name/header’s value to this’s headers.
    -      if (headers.constructor.name === 'Headers') {
    +      if (headers instanceof HeadersList) {
             for (const [key, val] of headers) {
    -          this[kHeaders].append(key, val)
    +          headersList.append(key, val)
             }
    +        // Note: Copy the `set-cookie` meta-data.
    +        headersList.cookies = headers.cookies
           } else {
             // 5. Otherwise, fill this’s headers with headers.
             fillHeaders(this[kHeaders], headers)
    @@ -722,10 +724,10 @@ class Request {
     
         // 3. Let clonedRequestObject be the result of creating a Request object,
         // given clonedRequest, this’s headers’s guard, and this’s relevant Realm.
    -    const clonedRequestObject = new Request(kInit)
    +    const clonedRequestObject = new Request(kConstruct)
         clonedRequestObject[kState] = clonedRequest
         clonedRequestObject[kRealm] = this[kRealm]
    -    clonedRequestObject[kHeaders] = new Headers()
    +    clonedRequestObject[kHeaders] = new Headers(kConstruct)
         clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList
         clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard]
         clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm]
    diff --git a/deps/undici/src/lib/fetch/response.js b/deps/undici/src/lib/fetch/response.js
    index 88deb71a06285e..73386123e33c8d 100644
    --- a/deps/undici/src/lib/fetch/response.js
    +++ b/deps/undici/src/lib/fetch/response.js
    @@ -14,7 +14,7 @@ const {
       isomorphicEncode
     } = require('./util')
     const {
    -  redirectStatus,
    +  redirectStatusSet,
       nullBodyStatus,
       DOMException
     } = require('./constants')
    @@ -23,11 +23,12 @@ const { webidl } = require('./webidl')
     const { FormData } = require('./formdata')
     const { getGlobalOrigin } = require('./global')
     const { URLSerializer } = require('./dataURL')
    -const { kHeadersList } = require('../core/symbols')
    +const { kHeadersList, kConstruct } = require('../core/symbols')
     const assert = require('assert')
     const { types } = require('util')
     
     const ReadableStream = globalThis.ReadableStream || require('stream/web').ReadableStream
    +const textEncoder = new TextEncoder('utf-8')
     
     // https://fetch.spec.whatwg.org/#response-class
     class Response {
    @@ -57,7 +58,7 @@ class Response {
         }
     
         // 1. Let bytes the result of running serialize a JavaScript value to JSON bytes on data.
    -    const bytes = new TextEncoder('utf-8').encode(
    +    const bytes = textEncoder.encode(
           serializeJavascriptValueToJSONString(data)
         )
     
    @@ -102,7 +103,7 @@ class Response {
         }
     
         // 3. If status is not a redirect status, then throw a RangeError.
    -    if (!redirectStatus.includes(status)) {
    +    if (!redirectStatusSet.has(status)) {
           throw new RangeError('Invalid status code ' + status)
         }
     
    @@ -143,7 +144,7 @@ class Response {
         // 2. Set this’s headers to a new Headers object with this’s relevant
         // Realm, whose header list is this’s response’s header list and guard
         // is "response".
    -    this[kHeaders] = new Headers()
    +    this[kHeaders] = new Headers(kConstruct)
         this[kHeaders][kGuard] = 'response'
         this[kHeaders][kHeadersList] = this[kState].headersList
         this[kHeaders][kRealm] = this[kRealm]
    @@ -513,11 +514,7 @@ webidl.converters.XMLHttpRequestBodyInit = function (V) {
         return webidl.converters.Blob(V, { strict: false })
       }
     
    -  if (
    -    types.isAnyArrayBuffer(V) ||
    -    types.isTypedArray(V) ||
    -    types.isDataView(V)
    -  ) {
    +  if (types.isArrayBuffer(V) || types.isTypedArray(V) || types.isDataView(V)) {
         return webidl.converters.BufferSource(V)
       }
     
    diff --git a/deps/undici/src/lib/fetch/util.js b/deps/undici/src/lib/fetch/util.js
    index fcbba84bc9a8b0..b12142c7f42505 100644
    --- a/deps/undici/src/lib/fetch/util.js
    +++ b/deps/undici/src/lib/fetch/util.js
    @@ -1,6 +1,6 @@
     'use strict'
     
    -const { redirectStatus, badPorts, referrerPolicy: referrerPolicyTokens } = require('./constants')
    +const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = require('./constants')
     const { getGlobalOrigin } = require('./global')
     const { performance } = require('perf_hooks')
     const { isBlobLike, toUSVString, ReadableStreamFrom } = require('../core/util')
    @@ -29,7 +29,7 @@ function responseURL (response) {
     // https://fetch.spec.whatwg.org/#concept-response-location-url
     function responseLocationURL (response, requestFragment) {
       // 1. If response’s status is not a redirect status, then return null.
    -  if (!redirectStatus.includes(response.status)) {
    +  if (!redirectStatusSet.has(response.status)) {
         return null
       }
     
    @@ -64,7 +64,7 @@ function requestBadPort (request) {
     
       // 2. If url’s scheme is an HTTP(S) scheme and url’s port is a bad port,
       // then return blocked.
    -  if (urlIsHttpHttpsScheme(url) && badPorts.includes(url.port)) {
    +  if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) {
         return 'blocked'
       }
     
    @@ -103,52 +103,57 @@ function isValidReasonPhrase (statusText) {
       return true
     }
     
    -function isTokenChar (c) {
    -  return !(
    -    c >= 0x7f ||
    -    c <= 0x20 ||
    -    c === '(' ||
    -    c === ')' ||
    -    c === '<' ||
    -    c === '>' ||
    -    c === '@' ||
    -    c === ',' ||
    -    c === ';' ||
    -    c === ':' ||
    -    c === '\\' ||
    -    c === '"' ||
    -    c === '/' ||
    -    c === '[' ||
    -    c === ']' ||
    -    c === '?' ||
    -    c === '=' ||
    -    c === '{' ||
    -    c === '}'
    -  )
    +/**
    + * @see https://tools.ietf.org/html/rfc7230#section-3.2.6
    + * @param {number} c
    + */
    +function isTokenCharCode (c) {
    +  switch (c) {
    +    case 0x22:
    +    case 0x28:
    +    case 0x29:
    +    case 0x2c:
    +    case 0x2f:
    +    case 0x3a:
    +    case 0x3b:
    +    case 0x3c:
    +    case 0x3d:
    +    case 0x3e:
    +    case 0x3f:
    +    case 0x40:
    +    case 0x5b:
    +    case 0x5c:
    +    case 0x5d:
    +    case 0x7b:
    +    case 0x7d:
    +      // DQUOTE and "(),/:;<=>?@[\]{}"
    +      return false
    +    default:
    +      // VCHAR %x21-7E
    +      return c >= 0x21 && c <= 0x7e
    +  }
     }
     
    -// See RFC 7230, Section 3.2.6.
    -// https://github.com/chromium/chromium/blob/d7da0240cae77824d1eda25745c4022757499131/third_party/blink/renderer/platform/network/http_parsers.cc#L321
    +/**
    + * @param {string} characters
    + */
     function isValidHTTPToken (characters) {
    -  if (!characters || typeof characters !== 'string') {
    +  if (characters.length === 0) {
         return false
       }
       for (let i = 0; i < characters.length; ++i) {
    -    const c = characters.charCodeAt(i)
    -    if (c > 0x7f || !isTokenChar(c)) {
    +    if (!isTokenCharCode(characters.charCodeAt(i))) {
           return false
         }
       }
       return true
     }
     
    -// https://fetch.spec.whatwg.org/#header-name
    -// https://github.com/chromium/chromium/blob/b3d37e6f94f87d59e44662d6078f6a12de845d17/net/http/http_util.cc#L342
    +/**
    + * @see https://fetch.spec.whatwg.org/#header-name
    + * @param {string} potentialValue
    + */
     function isValidHeaderName (potentialValue) {
    -  if (potentialValue.length === 0) {
    -    return false
    -  }
    -
       return isValidHTTPToken(potentialValue)
     }
     
    @@ -206,7 +211,7 @@ function setRequestReferrerPolicyOnRedirect (request, actualResponse) {
         // The left-most policy is the fallback.
         for (let i = policyHeader.length; i !== 0; i--) {
           const token = policyHeader[i - 1].trim()
    -      if (referrerPolicyTokens.includes(token)) {
    +      if (referrerPolicyTokens.has(token)) {
             policy = token
             break
           }
    @@ -693,11 +698,30 @@ function isCancelled (fetchParams) {
         fetchParams.controller.state === 'terminated'
     }
     
    -// https://fetch.spec.whatwg.org/#concept-method-normalize
    +const normalizeMethodRecord = {
    +  delete: 'DELETE',
    +  DELETE: 'DELETE',
    +  get: 'GET',
    +  GET: 'GET',
    +  head: 'HEAD',
    +  HEAD: 'HEAD',
    +  options: 'OPTIONS',
    +  OPTIONS: 'OPTIONS',
    +  post: 'POST',
    +  POST: 'POST',
    +  put: 'PUT',
    +  PUT: 'PUT'
    +}
    +
    +// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`.
    +Object.setPrototypeOf(normalizeMethodRecord, null)
    +
    +/**
    + * @see https://fetch.spec.whatwg.org/#concept-method-normalize
    + * @param {string} method
    + */
     function normalizeMethod (method) {
    -  return /^(DELETE|GET|HEAD|OPTIONS|POST|PUT)$/i.test(method)
    -    ? method.toUpperCase()
    -    : method
    +  return normalizeMethodRecord[method.toLowerCase()] ?? method
     }
     
     // https://infra.spec.whatwg.org/#serialize-a-javascript-value-to-a-json-string
    @@ -1042,5 +1066,6 @@ module.exports = {
       urlIsLocal,
       urlHasHttpsScheme,
       urlIsHttpHttpsScheme,
    -  readAllBytes
    +  readAllBytes,
    +  normalizeMethodRecord
     }
    diff --git a/deps/undici/src/lib/fetch/webidl.js b/deps/undici/src/lib/fetch/webidl.js
    index 38a05e657594aa..6fcf2ab6ad4c49 100644
    --- a/deps/undici/src/lib/fetch/webidl.js
    +++ b/deps/undici/src/lib/fetch/webidl.js
    @@ -427,12 +427,10 @@ webidl.converters.ByteString = function (V) {
       // 2. If the value of any element of x is greater than
       //    255, then throw a TypeError.
       for (let index = 0; index < x.length; index++) {
    -    const charCode = x.charCodeAt(index)
    -
    -    if (charCode > 255) {
    +    if (x.charCodeAt(index) > 255) {
           throw new TypeError(
             'Cannot convert argument to a ByteString because the character at ' +
    -        `index ${index} has a value of ${charCode} which is greater than 255.`
    +        `index ${index} has a value of ${x.charCodeAt(index)} which is greater than 255.`
           )
         }
       }
    diff --git a/deps/undici/src/lib/handler/RetryHandler.js b/deps/undici/src/lib/handler/RetryHandler.js
    new file mode 100644
    index 00000000000000..371044719fd33d
    --- /dev/null
    +++ b/deps/undici/src/lib/handler/RetryHandler.js
    @@ -0,0 +1,336 @@
    +const assert = require('assert')
    +
    +const { kRetryHandlerDefaultRetry } = require('../core/symbols')
    +const { RequestRetryError } = require('../core/errors')
    +const { isDisturbed, parseHeaders, parseRangeHeader } = require('../core/util')
    +
    +function calculateRetryAfterHeader (retryAfter) {
    +  const current = Date.now()
    +  const diff = new Date(retryAfter).getTime() - current
    +
    +  return diff
    +}
    +
    +class RetryHandler {
    +  constructor (opts, handlers) {
    +    const { retryOptions, ...dispatchOpts } = opts
    +    const {
    +      // Retry scoped
    +      retry: retryFn,
    +      maxRetries,
    +      maxTimeout,
    +      minTimeout,
    +      timeoutFactor,
    +      // Response scoped
    +      methods,
    +      errorCodes,
    +      retryAfter,
    +      statusCodes
    +    } = retryOptions ?? {}
    +
    +    this.dispatch = handlers.dispatch
    +    this.handler = handlers.handler
    +    this.opts = dispatchOpts
    +    this.abort = null
    +    this.aborted = false
    +    this.retryOpts = {
    +      retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry],
    +      retryAfter: retryAfter ?? true,
    +      maxTimeout: maxTimeout ?? 30 * 1000, // 30s,
    +      timeout: minTimeout ?? 500, // .5s
    +      timeoutFactor: timeoutFactor ?? 2,
    +      maxRetries: maxRetries ?? 5,
    +      // What errors we should retry
    +      methods: methods ?? ['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE', 'TRACE'],
    +      // Indicates which errors to retry
    +      statusCodes: statusCodes ?? [500, 502, 503, 504, 429],
    +      // List of errors to retry
    +      errorCodes: errorCodes ?? [
    +        'ECONNRESET',
    +        'ECONNREFUSED',
    +        'ENOTFOUND',
    +        'ENETDOWN',
    +        'ENETUNREACH',
    +        'EHOSTDOWN',
    +        'EHOSTUNREACH',
    +        'EPIPE'
    +      ]
    +    }
    +
    +    this.retryCount = 0
    +    this.start = 0
    +    this.end = null
    +    this.etag = null
    +    this.resume = null
    +
    +    // Handle possible onConnect duplication
    +    this.handler.onConnect(reason => {
    +      this.aborted = true
    +      if (this.abort) {
    +        this.abort(reason)
    +      } else {
    +        this.reason = reason
    +      }
    +    })
    +  }
    +
    +  onRequestSent () {
    +    if (this.handler.onRequestSent) {
    +      this.handler.onRequestSent()
    +    }
    +  }
    +
    +  onUpgrade (statusCode, headers, socket) {
    +    if (this.handler.onUpgrade) {
    +      this.handler.onUpgrade(statusCode, headers, socket)
    +    }
    +  }
    +
    +  onConnect (abort) {
    +    if (this.aborted) {
    +      abort(this.reason)
    +    } else {
    +      this.abort = abort
    +    }
    +  }
    +
    +  onBodySent (chunk) {
    +    if (this.handler.onBodySent) return this.handler.onBodySent(chunk)
    +  }
    +
    +  static [kRetryHandlerDefaultRetry] (err, { state, opts }, cb) {
    +    const { statusCode, code, headers } = err
    +    const { method, retryOptions } = opts
    +    const {
    +      maxRetries,
    +      timeout,
    +      maxTimeout,
    +      timeoutFactor,
    +      statusCodes,
    +      errorCodes,
    +      methods
    +    } = retryOptions
    +    let { counter, currentTimeout } = state
    +
    +    currentTimeout =
    +      currentTimeout != null && currentTimeout > 0 ? currentTimeout : timeout
    +
    +    // Any code that is not a Undici's originated and allowed to retry
    +    if (
    +      code &&
    +      code !== 'UND_ERR_REQ_RETRY' &&
    +      code !== 'UND_ERR_SOCKET' &&
    +      !errorCodes.includes(code)
    +    ) {
    +      cb(err)
    +      return
    +    }
    +
    +    // If a set of method are provided and the current method is not in the list
    +    if (Array.isArray(methods) && !methods.includes(method)) {
    +      cb(err)
    +      return
    +    }
    +
    +    // If a set of status code are provided and the current status code is not in the list
    +    if (
    +      statusCode != null &&
    +      Array.isArray(statusCodes) &&
    +      !statusCodes.includes(statusCode)
    +    ) {
    +      cb(err)
    +      return
    +    }
    +
    +    // If we reached the max number of retries
    +    if (counter > maxRetries) {
    +      cb(err)
    +      return
    +    }
    +
    +    let retryAfterHeader = headers != null && headers['retry-after']
    +    if (retryAfterHeader) {
    +      retryAfterHeader = Number(retryAfterHeader)
    +      retryAfterHeader = isNaN(retryAfterHeader)
    +        ? calculateRetryAfterHeader(retryAfterHeader)
    +        : retryAfterHeader * 1e3 // Retry-After is in seconds
    +    }
    +
    +    const retryTimeout =
    +      retryAfterHeader > 0
    +        ? Math.min(retryAfterHeader, maxTimeout)
    +        : Math.min(currentTimeout * timeoutFactor ** counter, maxTimeout)
    +
    +    state.currentTimeout = retryTimeout
    +
    +    setTimeout(() => cb(null), retryTimeout)
    +  }
    +
    +  onHeaders (statusCode, rawHeaders, resume, statusMessage) {
    +    const headers = parseHeaders(rawHeaders)
    +
    +    this.retryCount += 1
    +
    +    if (statusCode >= 300) {
    +      this.abort(
    +        new RequestRetryError('Request failed', statusCode, {
    +          headers,
    +          count: this.retryCount
    +        })
    +      )
    +      return false
    +    }
    +
    +    // Checkpoint for resume from where we left it
    +    if (this.resume != null) {
    +      this.resume = null
    +
    +      if (statusCode !== 206) {
    +        return true
    +      }
    +
    +      const contentRange = parseRangeHeader(headers['content-range'])
    +      // If no content range
    +      if (!contentRange) {
    +        this.abort(
    +          new RequestRetryError('Content-Range mismatch', statusCode, {
    +            headers,
    +            count: this.retryCount
    +          })
    +        )
    +        return false
    +      }
    +
    +      // Let's start with a weak etag check
    +      if (this.etag != null && this.etag !== headers.etag) {
    +        this.abort(
    +          new RequestRetryError('ETag mismatch', statusCode, {
    +            headers,
    +            count: this.retryCount
    +          })
    +        )
    +        return false
    +      }
    +
    +      const { start, size, end = size } = contentRange
    +
    +      assert(this.start === start, 'content-range mismatch')
    +      assert(this.end == null || this.end === end, 'content-range mismatch')
    +
    +      this.resume = resume
    +      return true
    +    }
    +
    +    if (this.end == null) {
    +      if (statusCode === 206) {
    +        // First time we receive 206
    +        const range = parseRangeHeader(headers['content-range'])
    +
    +        if (range == null) {
    +          return this.handler.onHeaders(
    +            statusCode,
    +            rawHeaders,
    +            resume,
    +            statusMessage
    +          )
    +        }
    +
    +        const { start, size, end = size } = range
    +
    +        assert(
    +          start != null && Number.isFinite(start) && this.start !== start,
    +          'content-range mismatch'
    +        )
    +        assert(Number.isFinite(start))
    +        assert(
    +          end != null && Number.isFinite(end) && this.end !== end,
    +          'invalid content-length'
    +        )
    +
    +        this.start = start
    +        this.end = end
    +      }
    +
    +      // We make our best to checkpoint the body for further range headers
    +      if (this.end == null) {
    +        const contentLength = headers['content-length']
    +        this.end = contentLength != null ? Number(contentLength) : null
    +      }
    +
    +      assert(Number.isFinite(this.start))
    +      assert(
    +        this.end == null || Number.isFinite(this.end),
    +        'invalid content-length'
    +      )
    +
    +      this.resume = resume
    +      this.etag = headers.etag != null ? headers.etag : null
    +
    +      return this.handler.onHeaders(
    +        statusCode,
    +        rawHeaders,
    +        resume,
    +        statusMessage
    +      )
    +    }
    +
    +    const err = new RequestRetryError('Request failed', statusCode, {
    +      headers,
    +      count: this.retryCount
    +    })
    +
    +    this.abort(err)
    +
    +    return false
    +  }
    +
    +  onData (chunk) {
    +    this.start += chunk.length
    +
    +    return this.handler.onData(chunk)
    +  }
    +
    +  onComplete (rawTrailers) {
    +    this.retryCount = 0
    +    return this.handler.onComplete(rawTrailers)
    +  }
    +
    +  onError (err) {
    +    if (this.aborted || isDisturbed(this.opts.body)) {
    +      return this.handler.onError(err)
    +    }
    +
    +    this.retryOpts.retry(
    +      err,
    +      {
    +        state: { counter: this.retryCount++, currentTimeout: this.retryAfter },
    +        opts: { retryOptions: this.retryOpts, ...this.opts }
    +      },
    +      onRetry.bind(this)
    +    )
    +
    +    function onRetry (err) {
    +      if (err != null || this.aborted || isDisturbed(this.opts.body)) {
    +        return this.handler.onError(err)
    +      }
    +
    +      if (this.start !== 0) {
    +        this.opts = {
    +          ...this.opts,
    +          headers: {
    +            ...this.opts.headers,
    +            range: `bytes=${this.start}-${this.end ?? ''}`
    +          }
    +        }
    +      }
    +
    +      try {
    +        this.dispatch(this.opts, this)
    +      } catch (err) {
    +        this.handler.onError(err)
    +      }
    +    }
    +  }
    +}
    +
    +module.exports = RetryHandler
    diff --git a/deps/undici/src/lib/pool.js b/deps/undici/src/lib/pool.js
    index 08509958069a4f..e3cd3399e6b544 100644
    --- a/deps/undici/src/lib/pool.js
    +++ b/deps/undici/src/lib/pool.js
    @@ -57,7 +57,7 @@ class Pool extends PoolBase {
             maxCachedSessions,
             allowH2,
             socketPath,
    -        timeout: connectTimeout == null ? 10e3 : connectTimeout,
    +        timeout: connectTimeout,
             ...(util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),
             ...connect
           })
    diff --git a/deps/undici/src/lib/proxy-agent.js b/deps/undici/src/lib/proxy-agent.js
    index c710948cc5bbca..e3c0f6f3d46d90 100644
    --- a/deps/undici/src/lib/proxy-agent.js
    +++ b/deps/undici/src/lib/proxy-agent.js
    @@ -65,6 +65,9 @@ class ProxyAgent extends DispatcherBase {
         this[kProxyTls] = opts.proxyTls
         this[kProxyHeaders] = opts.headers || {}
     
    +    const resolvedUrl = new URL(opts.uri)
    +    const { origin, port, host, username, password } = resolvedUrl
    +
         if (opts.auth && opts.token) {
           throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token')
         } else if (opts.auth) {
    @@ -72,11 +75,10 @@ class ProxyAgent extends DispatcherBase {
           this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}`
         } else if (opts.token) {
           this[kProxyHeaders]['proxy-authorization'] = opts.token
    +    } else if (username && password) {
    +      this[kProxyHeaders]['proxy-authorization'] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString('base64')}`
         }
     
    -    const resolvedUrl = new URL(opts.uri)
    -    const { origin, port, host } = resolvedUrl
    -
         const connect = buildConnector({ ...opts.proxyTls })
         this[kConnectEndpoint] = buildConnector({ ...opts.requestTls })
         this[kClient] = clientFactory(resolvedUrl, { connect })
    @@ -100,7 +102,7 @@ class ProxyAgent extends DispatcherBase {
               })
               if (statusCode !== 200) {
                 socket.on('error', () => {}).destroy()
    -            callback(new RequestAbortedError('Proxy response !== 200 when HTTP Tunneling'))
    +            callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`))
               }
               if (opts.protocol !== 'https:') {
                 callback(null, socket)
    diff --git a/deps/undici/src/node_modules/@fastify/busboy/lib/utils/decodeText.js b/deps/undici/src/node_modules/@fastify/busboy/lib/utils/decodeText.js
    index ee376062c1843f..be35d6b1052b0b 100644
    --- a/deps/undici/src/node_modules/@fastify/busboy/lib/utils/decodeText.js
    +++ b/deps/undici/src/node_modules/@fastify/busboy/lib/utils/decodeText.js
    @@ -7,18 +7,106 @@ const textDecoders = new Map([
       ['utf8', utf8Decoder]
     ])
     
    -function decodeText (text, textEncoding, destEncoding) {
    -  if (text) {
    -    if (textDecoders.has(destEncoding)) {
    -      try {
    -        return textDecoders.get(destEncoding).decode(Buffer.from(text, textEncoding))
    -      } catch (e) { }
    -    } else {
    +function getDecoder (charset) {
    +  let lc
    +  while (true) {
    +    switch (charset) {
    +      case 'utf-8':
    +      case 'utf8':
    +        return decoders.utf8
    +      case 'latin1':
    +      case 'ascii': // TODO: Make these a separate, strict decoder?
    +      case 'us-ascii':
    +      case 'iso-8859-1':
    +      case 'iso8859-1':
    +      case 'iso88591':
    +      case 'iso_8859-1':
    +      case 'windows-1252':
    +      case 'iso_8859-1:1987':
    +      case 'cp1252':
    +      case 'x-cp1252':
    +        return decoders.latin1
    +      case 'utf16le':
    +      case 'utf-16le':
    +      case 'ucs2':
    +      case 'ucs-2':
    +        return decoders.utf16le
    +      case 'base64':
    +        return decoders.base64
    +      default:
    +        if (lc === undefined) {
    +          lc = true
    +          charset = charset.toLowerCase()
    +          continue
    +        }
    +        return decoders.other.bind(charset)
    +    }
    +  }
    +}
    +
    +const decoders = {
    +  utf8: (data, sourceEncoding) => {
    +    if (data.length === 0) {
    +      return ''
    +    }
    +    if (typeof data === 'string') {
    +      data = Buffer.from(data, sourceEncoding)
    +    }
    +    return data.utf8Slice(0, data.length)
    +  },
    +
    +  latin1: (data, sourceEncoding) => {
    +    if (data.length === 0) {
    +      return ''
    +    }
    +    if (typeof data === 'string') {
    +      return data
    +    }
    +    return data.latin1Slice(0, data.length)
    +  },
    +
    +  utf16le: (data, sourceEncoding) => {
    +    if (data.length === 0) {
    +      return ''
    +    }
    +    if (typeof data === 'string') {
    +      data = Buffer.from(data, sourceEncoding)
    +    }
    +    return data.ucs2Slice(0, data.length)
    +  },
    +
    +  base64: (data, sourceEncoding) => {
    +    if (data.length === 0) {
    +      return ''
    +    }
    +    if (typeof data === 'string') {
    +      data = Buffer.from(data, sourceEncoding)
    +    }
    +    return data.base64Slice(0, data.length)
    +  },
    +
    +  other: (data, sourceEncoding) => {
    +    if (data.length === 0) {
    +      return ''
    +    }
    +    if (typeof data === 'string') {
    +      data = Buffer.from(data, sourceEncoding)
    +    }
    +
    +    if (textDecoders.has(this.toString())) {
           try {
    -        textDecoders.set(destEncoding, new TextDecoder(destEncoding))
    -        return textDecoders.get(destEncoding).decode(Buffer.from(text, textEncoding))
    +        return textDecoders.get(this).decode(data)
           } catch (e) { }
         }
    +    return typeof data === 'string'
    +      ? data
    +      : data.toString()
    +  }
    +}
    +
    +function decodeText (text, sourceEncoding, destEncoding) {
    +  if (text) {
    +    return getDecoder(destEncoding)(text, sourceEncoding)
       }
       return text
     }
    diff --git a/deps/undici/src/node_modules/@fastify/busboy/lib/utils/parseParams.js b/deps/undici/src/node_modules/@fastify/busboy/lib/utils/parseParams.js
    index f9214180fa79d5..1698e62e68ab82 100644
    --- a/deps/undici/src/node_modules/@fastify/busboy/lib/utils/parseParams.js
    +++ b/deps/undici/src/node_modules/@fastify/busboy/lib/utils/parseParams.js
    @@ -1,23 +1,130 @@
    +/* eslint-disable object-property-newline */
     'use strict'
     
     const decodeText = require('./decodeText')
     
    -const RE_ENCODED = /%([a-fA-F0-9]{2})/g
    +const RE_ENCODED = /%[a-fA-F0-9][a-fA-F0-9]/g
     
    -function encodedReplacer (match, byte) {
    -  return String.fromCharCode(parseInt(byte, 16))
    +const EncodedLookup = {
    +  '%00': '\x00', '%01': '\x01', '%02': '\x02', '%03': '\x03', '%04': '\x04',
    +  '%05': '\x05', '%06': '\x06', '%07': '\x07', '%08': '\x08', '%09': '\x09',
    +  '%0a': '\x0a', '%0A': '\x0a', '%0b': '\x0b', '%0B': '\x0b', '%0c': '\x0c',
    +  '%0C': '\x0c', '%0d': '\x0d', '%0D': '\x0d', '%0e': '\x0e', '%0E': '\x0e',
    +  '%0f': '\x0f', '%0F': '\x0f', '%10': '\x10', '%11': '\x11', '%12': '\x12',
    +  '%13': '\x13', '%14': '\x14', '%15': '\x15', '%16': '\x16', '%17': '\x17',
    +  '%18': '\x18', '%19': '\x19', '%1a': '\x1a', '%1A': '\x1a', '%1b': '\x1b',
    +  '%1B': '\x1b', '%1c': '\x1c', '%1C': '\x1c', '%1d': '\x1d', '%1D': '\x1d',
    +  '%1e': '\x1e', '%1E': '\x1e', '%1f': '\x1f', '%1F': '\x1f', '%20': '\x20',
    +  '%21': '\x21', '%22': '\x22', '%23': '\x23', '%24': '\x24', '%25': '\x25',
    +  '%26': '\x26', '%27': '\x27', '%28': '\x28', '%29': '\x29', '%2a': '\x2a',
    +  '%2A': '\x2a', '%2b': '\x2b', '%2B': '\x2b', '%2c': '\x2c', '%2C': '\x2c',
    +  '%2d': '\x2d', '%2D': '\x2d', '%2e': '\x2e', '%2E': '\x2e', '%2f': '\x2f',
    +  '%2F': '\x2f', '%30': '\x30', '%31': '\x31', '%32': '\x32', '%33': '\x33',
    +  '%34': '\x34', '%35': '\x35', '%36': '\x36', '%37': '\x37', '%38': '\x38',
    +  '%39': '\x39', '%3a': '\x3a', '%3A': '\x3a', '%3b': '\x3b', '%3B': '\x3b',
    +  '%3c': '\x3c', '%3C': '\x3c', '%3d': '\x3d', '%3D': '\x3d', '%3e': '\x3e',
    +  '%3E': '\x3e', '%3f': '\x3f', '%3F': '\x3f', '%40': '\x40', '%41': '\x41',
    +  '%42': '\x42', '%43': '\x43', '%44': '\x44', '%45': '\x45', '%46': '\x46',
    +  '%47': '\x47', '%48': '\x48', '%49': '\x49', '%4a': '\x4a', '%4A': '\x4a',
    +  '%4b': '\x4b', '%4B': '\x4b', '%4c': '\x4c', '%4C': '\x4c', '%4d': '\x4d',
    +  '%4D': '\x4d', '%4e': '\x4e', '%4E': '\x4e', '%4f': '\x4f', '%4F': '\x4f',
    +  '%50': '\x50', '%51': '\x51', '%52': '\x52', '%53': '\x53', '%54': '\x54',
    +  '%55': '\x55', '%56': '\x56', '%57': '\x57', '%58': '\x58', '%59': '\x59',
    +  '%5a': '\x5a', '%5A': '\x5a', '%5b': '\x5b', '%5B': '\x5b', '%5c': '\x5c',
    +  '%5C': '\x5c', '%5d': '\x5d', '%5D': '\x5d', '%5e': '\x5e', '%5E': '\x5e',
    +  '%5f': '\x5f', '%5F': '\x5f', '%60': '\x60', '%61': '\x61', '%62': '\x62',
    +  '%63': '\x63', '%64': '\x64', '%65': '\x65', '%66': '\x66', '%67': '\x67',
    +  '%68': '\x68', '%69': '\x69', '%6a': '\x6a', '%6A': '\x6a', '%6b': '\x6b',
    +  '%6B': '\x6b', '%6c': '\x6c', '%6C': '\x6c', '%6d': '\x6d', '%6D': '\x6d',
    +  '%6e': '\x6e', '%6E': '\x6e', '%6f': '\x6f', '%6F': '\x6f', '%70': '\x70',
    +  '%71': '\x71', '%72': '\x72', '%73': '\x73', '%74': '\x74', '%75': '\x75',
    +  '%76': '\x76', '%77': '\x77', '%78': '\x78', '%79': '\x79', '%7a': '\x7a',
    +  '%7A': '\x7a', '%7b': '\x7b', '%7B': '\x7b', '%7c': '\x7c', '%7C': '\x7c',
    +  '%7d': '\x7d', '%7D': '\x7d', '%7e': '\x7e', '%7E': '\x7e', '%7f': '\x7f',
    +  '%7F': '\x7f', '%80': '\x80', '%81': '\x81', '%82': '\x82', '%83': '\x83',
    +  '%84': '\x84', '%85': '\x85', '%86': '\x86', '%87': '\x87', '%88': '\x88',
    +  '%89': '\x89', '%8a': '\x8a', '%8A': '\x8a', '%8b': '\x8b', '%8B': '\x8b',
    +  '%8c': '\x8c', '%8C': '\x8c', '%8d': '\x8d', '%8D': '\x8d', '%8e': '\x8e',
    +  '%8E': '\x8e', '%8f': '\x8f', '%8F': '\x8f', '%90': '\x90', '%91': '\x91',
    +  '%92': '\x92', '%93': '\x93', '%94': '\x94', '%95': '\x95', '%96': '\x96',
    +  '%97': '\x97', '%98': '\x98', '%99': '\x99', '%9a': '\x9a', '%9A': '\x9a',
    +  '%9b': '\x9b', '%9B': '\x9b', '%9c': '\x9c', '%9C': '\x9c', '%9d': '\x9d',
    +  '%9D': '\x9d', '%9e': '\x9e', '%9E': '\x9e', '%9f': '\x9f', '%9F': '\x9f',
    +  '%a0': '\xa0', '%A0': '\xa0', '%a1': '\xa1', '%A1': '\xa1', '%a2': '\xa2',
    +  '%A2': '\xa2', '%a3': '\xa3', '%A3': '\xa3', '%a4': '\xa4', '%A4': '\xa4',
    +  '%a5': '\xa5', '%A5': '\xa5', '%a6': '\xa6', '%A6': '\xa6', '%a7': '\xa7',
    +  '%A7': '\xa7', '%a8': '\xa8', '%A8': '\xa8', '%a9': '\xa9', '%A9': '\xa9',
    +  '%aa': '\xaa', '%Aa': '\xaa', '%aA': '\xaa', '%AA': '\xaa', '%ab': '\xab',
    +  '%Ab': '\xab', '%aB': '\xab', '%AB': '\xab', '%ac': '\xac', '%Ac': '\xac',
    +  '%aC': '\xac', '%AC': '\xac', '%ad': '\xad', '%Ad': '\xad', '%aD': '\xad',
    +  '%AD': '\xad', '%ae': '\xae', '%Ae': '\xae', '%aE': '\xae', '%AE': '\xae',
    +  '%af': '\xaf', '%Af': '\xaf', '%aF': '\xaf', '%AF': '\xaf', '%b0': '\xb0',
    +  '%B0': '\xb0', '%b1': '\xb1', '%B1': '\xb1', '%b2': '\xb2', '%B2': '\xb2',
    +  '%b3': '\xb3', '%B3': '\xb3', '%b4': '\xb4', '%B4': '\xb4', '%b5': '\xb5',
    +  '%B5': '\xb5', '%b6': '\xb6', '%B6': '\xb6', '%b7': '\xb7', '%B7': '\xb7',
    +  '%b8': '\xb8', '%B8': '\xb8', '%b9': '\xb9', '%B9': '\xb9', '%ba': '\xba',
    +  '%Ba': '\xba', '%bA': '\xba', '%BA': '\xba', '%bb': '\xbb', '%Bb': '\xbb',
    +  '%bB': '\xbb', '%BB': '\xbb', '%bc': '\xbc', '%Bc': '\xbc', '%bC': '\xbc',
    +  '%BC': '\xbc', '%bd': '\xbd', '%Bd': '\xbd', '%bD': '\xbd', '%BD': '\xbd',
    +  '%be': '\xbe', '%Be': '\xbe', '%bE': '\xbe', '%BE': '\xbe', '%bf': '\xbf',
    +  '%Bf': '\xbf', '%bF': '\xbf', '%BF': '\xbf', '%c0': '\xc0', '%C0': '\xc0',
    +  '%c1': '\xc1', '%C1': '\xc1', '%c2': '\xc2', '%C2': '\xc2', '%c3': '\xc3',
    +  '%C3': '\xc3', '%c4': '\xc4', '%C4': '\xc4', '%c5': '\xc5', '%C5': '\xc5',
    +  '%c6': '\xc6', '%C6': '\xc6', '%c7': '\xc7', '%C7': '\xc7', '%c8': '\xc8',
    +  '%C8': '\xc8', '%c9': '\xc9', '%C9': '\xc9', '%ca': '\xca', '%Ca': '\xca',
    +  '%cA': '\xca', '%CA': '\xca', '%cb': '\xcb', '%Cb': '\xcb', '%cB': '\xcb',
    +  '%CB': '\xcb', '%cc': '\xcc', '%Cc': '\xcc', '%cC': '\xcc', '%CC': '\xcc',
    +  '%cd': '\xcd', '%Cd': '\xcd', '%cD': '\xcd', '%CD': '\xcd', '%ce': '\xce',
    +  '%Ce': '\xce', '%cE': '\xce', '%CE': '\xce', '%cf': '\xcf', '%Cf': '\xcf',
    +  '%cF': '\xcf', '%CF': '\xcf', '%d0': '\xd0', '%D0': '\xd0', '%d1': '\xd1',
    +  '%D1': '\xd1', '%d2': '\xd2', '%D2': '\xd2', '%d3': '\xd3', '%D3': '\xd3',
    +  '%d4': '\xd4', '%D4': '\xd4', '%d5': '\xd5', '%D5': '\xd5', '%d6': '\xd6',
    +  '%D6': '\xd6', '%d7': '\xd7', '%D7': '\xd7', '%d8': '\xd8', '%D8': '\xd8',
    +  '%d9': '\xd9', '%D9': '\xd9', '%da': '\xda', '%Da': '\xda', '%dA': '\xda',
    +  '%DA': '\xda', '%db': '\xdb', '%Db': '\xdb', '%dB': '\xdb', '%DB': '\xdb',
    +  '%dc': '\xdc', '%Dc': '\xdc', '%dC': '\xdc', '%DC': '\xdc', '%dd': '\xdd',
    +  '%Dd': '\xdd', '%dD': '\xdd', '%DD': '\xdd', '%de': '\xde', '%De': '\xde',
    +  '%dE': '\xde', '%DE': '\xde', '%df': '\xdf', '%Df': '\xdf', '%dF': '\xdf',
    +  '%DF': '\xdf', '%e0': '\xe0', '%E0': '\xe0', '%e1': '\xe1', '%E1': '\xe1',
    +  '%e2': '\xe2', '%E2': '\xe2', '%e3': '\xe3', '%E3': '\xe3', '%e4': '\xe4',
    +  '%E4': '\xe4', '%e5': '\xe5', '%E5': '\xe5', '%e6': '\xe6', '%E6': '\xe6',
    +  '%e7': '\xe7', '%E7': '\xe7', '%e8': '\xe8', '%E8': '\xe8', '%e9': '\xe9',
    +  '%E9': '\xe9', '%ea': '\xea', '%Ea': '\xea', '%eA': '\xea', '%EA': '\xea',
    +  '%eb': '\xeb', '%Eb': '\xeb', '%eB': '\xeb', '%EB': '\xeb', '%ec': '\xec',
    +  '%Ec': '\xec', '%eC': '\xec', '%EC': '\xec', '%ed': '\xed', '%Ed': '\xed',
    +  '%eD': '\xed', '%ED': '\xed', '%ee': '\xee', '%Ee': '\xee', '%eE': '\xee',
    +  '%EE': '\xee', '%ef': '\xef', '%Ef': '\xef', '%eF': '\xef', '%EF': '\xef',
    +  '%f0': '\xf0', '%F0': '\xf0', '%f1': '\xf1', '%F1': '\xf1', '%f2': '\xf2',
    +  '%F2': '\xf2', '%f3': '\xf3', '%F3': '\xf3', '%f4': '\xf4', '%F4': '\xf4',
    +  '%f5': '\xf5', '%F5': '\xf5', '%f6': '\xf6', '%F6': '\xf6', '%f7': '\xf7',
    +  '%F7': '\xf7', '%f8': '\xf8', '%F8': '\xf8', '%f9': '\xf9', '%F9': '\xf9',
    +  '%fa': '\xfa', '%Fa': '\xfa', '%fA': '\xfa', '%FA': '\xfa', '%fb': '\xfb',
    +  '%Fb': '\xfb', '%fB': '\xfb', '%FB': '\xfb', '%fc': '\xfc', '%Fc': '\xfc',
    +  '%fC': '\xfc', '%FC': '\xfc', '%fd': '\xfd', '%Fd': '\xfd', '%fD': '\xfd',
    +  '%FD': '\xfd', '%fe': '\xfe', '%Fe': '\xfe', '%fE': '\xfe', '%FE': '\xfe',
    +  '%ff': '\xff', '%Ff': '\xff', '%fF': '\xff', '%FF': '\xff'
     }
     
    +function encodedReplacer (match) {
    +  return EncodedLookup[match]
    +}
    +
    +const STATE_KEY = 0
    +const STATE_VALUE = 1
    +const STATE_CHARSET = 2
    +const STATE_LANG = 3
    +
     function parseParams (str) {
       const res = []
    -  let state = 'key'
    +  let state = STATE_KEY
       let charset = ''
       let inquote = false
       let escaping = false
       let p = 0
       let tmp = ''
    +  const len = str.length
     
    -  for (var i = 0, len = str.length; i < len; ++i) { // eslint-disable-line no-var
    +  for (var i = 0; i < len; ++i) { // eslint-disable-line no-var
         const char = str[i]
         if (char === '\\' && inquote) {
           if (escaping) { escaping = false } else {
    @@ -28,29 +135,31 @@ function parseParams (str) {
           if (!escaping) {
             if (inquote) {
               inquote = false
    -          state = 'key'
    +          state = STATE_KEY
             } else { inquote = true }
             continue
           } else { escaping = false }
         } else {
           if (escaping && inquote) { tmp += '\\' }
           escaping = false
    -      if ((state === 'charset' || state === 'lang') && char === "'") {
    -        if (state === 'charset') {
    -          state = 'lang'
    +      if ((state === STATE_CHARSET || state === STATE_LANG) && char === "'") {
    +        if (state === STATE_CHARSET) {
    +          state = STATE_LANG
               charset = tmp.substring(1)
    -        } else { state = 'value' }
    +        } else { state = STATE_VALUE }
             tmp = ''
             continue
    -      } else if (state === 'key' &&
    +      } else if (state === STATE_KEY &&
             (char === '*' || char === '=') &&
             res.length) {
    -        if (char === '*') { state = 'charset' } else { state = 'value' }
    +        state = char === '*'
    +          ? STATE_CHARSET
    +          : STATE_VALUE
             res[p] = [tmp, undefined]
             tmp = ''
             continue
           } else if (!inquote && char === ';') {
    -        state = 'key'
    +        state = STATE_KEY
             if (charset) {
               if (tmp.length) {
                 tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer),
    diff --git a/deps/undici/src/node_modules/@fastify/busboy/package.json b/deps/undici/src/node_modules/@fastify/busboy/package.json
    index 3288ee06872612..4be895c108c837 100644
    --- a/deps/undici/src/node_modules/@fastify/busboy/package.json
    +++ b/deps/undici/src/node_modules/@fastify/busboy/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@fastify/busboy",
    -  "version": "2.0.0",
    +  "version": "2.1.0",
       "private": false,
       "author": "Brian White ",
       "contributors": [
    @@ -17,6 +17,7 @@
       ],
       "description": "A streaming parser for HTML form data for node.js",
       "main": "lib/main",
    +  "type": "commonjs",
       "types": "lib/main.d.ts",
       "scripts": {
         "bench:busboy": "cd benchmarks && npm install && npm run benchmark-fastify",
    @@ -26,7 +27,7 @@
         "lint:everything": "npm run lint && npm run test:types",
         "lint:fix": "standard --fix",
         "lint:standard": "standard --verbose | snazzy",
    -    "test:mocha": "mocha test",
    +    "test:mocha": "tap",
         "test:types": "tsd",
         "test:coverage": "nyc npm run test",
         "test": "npm run test:mocha"
    @@ -37,15 +38,11 @@
       "devDependencies": {
         "@types/node": "^20.1.0",
         "busboy": "^1.0.0",
    -    "chai": "^4.3.6",
    -    "eslint": "^8.23.0",
    -    "eslint-config-standard": "^17.0.0",
    -    "eslint-plugin-n": "^16.0.0",
    -    "mocha": "^10.0.0",
    -    "nyc": "^15.1.0",
         "photofinish": "^1.8.0",
         "snazzy": "^9.0.0",
         "standard": "^17.0.0",
    +    "tap": "^16.3.8",
    +    "tinybench": "^2.5.1",
         "tsd": "^0.29.0",
         "typescript": "^5.0.2"
       },
    diff --git a/deps/undici/src/package-lock.json b/deps/undici/src/package-lock.json
    new file mode 100644
    index 00000000000000..a9f655fb0bf7ab
    --- /dev/null
    +++ b/deps/undici/src/package-lock.json
    @@ -0,0 +1,16216 @@
    +{
    +  "name": "undici",
    +  "version": "5.28.2",
    +  "lockfileVersion": 3,
    +  "requires": true,
    +  "packages": {
    +    "": {
    +      "name": "undici",
    +      "version": "5.28.2",
    +      "license": "MIT",
    +      "dependencies": {
    +        "@fastify/busboy": "^2.0.0"
    +      },
    +      "devDependencies": {
    +        "@sinonjs/fake-timers": "^11.1.0",
    +        "@types/node": "^18.0.3",
    +        "abort-controller": "^3.0.0",
    +        "atomic-sleep": "^1.0.0",
    +        "chai": "^4.3.4",
    +        "chai-as-promised": "^7.1.1",
    +        "chai-iterator": "^3.0.2",
    +        "chai-string": "^1.5.0",
    +        "concurrently": "^8.0.1",
    +        "cronometro": "^1.0.5",
    +        "delay": "^5.0.0",
    +        "dns-packet": "^5.4.0",
    +        "docsify-cli": "^4.4.3",
    +        "form-data": "^4.0.0",
    +        "formdata-node": "^6.0.3",
    +        "https-pem": "^3.0.0",
    +        "husky": "^8.0.1",
    +        "import-fresh": "^3.3.0",
    +        "jest": "^29.0.2",
    +        "jsdom": "^23.0.0",
    +        "jsfuzz": "^1.0.15",
    +        "mocha": "^10.0.0",
    +        "mockttp": "^3.9.2",
    +        "p-timeout": "^3.2.0",
    +        "pre-commit": "^1.2.2",
    +        "proxy": "^1.0.2",
    +        "proxyquire": "^2.1.3",
    +        "semver": "^7.5.4",
    +        "sinon": "^17.0.1",
    +        "snazzy": "^9.0.0",
    +        "standard": "^17.0.0",
    +        "table": "^6.8.0",
    +        "tap": "^16.1.0",
    +        "tsd": "^0.29.0",
    +        "typescript": "^5.0.2",
    +        "wait-on": "^7.0.1",
    +        "ws": "^8.11.0"
    +      },
    +      "engines": {
    +        "node": ">=14.0"
    +      }
    +    },
    +    "node_modules/@aashutoshrathi/word-wrap": {
    +      "version": "1.2.6",
    +      "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
    +      "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/@ampproject/remapping": {
    +      "version": "2.2.1",
    +      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
    +      "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jridgewell/gen-mapping": "^0.3.0",
    +        "@jridgewell/trace-mapping": "^0.3.9"
    +      },
    +      "engines": {
    +        "node": ">=6.0.0"
    +      }
    +    },
    +    "node_modules/@assemblyscript/loader": {
    +      "version": "0.19.23",
    +      "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.19.23.tgz",
    +      "integrity": "sha512-ulkCYfFbYj01ie1MDOyxv2F6SpRN1TOj7fQxbP07D6HmeR+gr2JLSmINKjga2emB+b1L2KGrFKBTc+e00p54nw==",
    +      "dev": true
    +    },
    +    "node_modules/@babel/code-frame": {
    +      "version": "7.23.5",
    +      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
    +      "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/highlight": "^7.23.4",
    +        "chalk": "^2.4.2"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/@babel/code-frame/node_modules/ansi-styles": {
    +      "version": "3.2.1",
    +      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
    +      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
    +      "dev": true,
    +      "dependencies": {
    +        "color-convert": "^1.9.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/@babel/code-frame/node_modules/chalk": {
    +      "version": "2.4.2",
    +      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
    +      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-styles": "^3.2.1",
    +        "escape-string-regexp": "^1.0.5",
    +        "supports-color": "^5.3.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/@babel/code-frame/node_modules/color-convert": {
    +      "version": "1.9.3",
    +      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
    +      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
    +      "dev": true,
    +      "dependencies": {
    +        "color-name": "1.1.3"
    +      }
    +    },
    +    "node_modules/@babel/code-frame/node_modules/color-name": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
    +      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
    +      "dev": true
    +    },
    +    "node_modules/@babel/code-frame/node_modules/escape-string-regexp": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
    +      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.8.0"
    +      }
    +    },
    +    "node_modules/@babel/code-frame/node_modules/has-flag": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
    +      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/@babel/code-frame/node_modules/supports-color": {
    +      "version": "5.5.0",
    +      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
    +      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-flag": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/@babel/compat-data": {
    +      "version": "7.23.5",
    +      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz",
    +      "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/@babel/core": {
    +      "version": "7.23.5",
    +      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.5.tgz",
    +      "integrity": "sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==",
    +      "dev": true,
    +      "dependencies": {
    +        "@ampproject/remapping": "^2.2.0",
    +        "@babel/code-frame": "^7.23.5",
    +        "@babel/generator": "^7.23.5",
    +        "@babel/helper-compilation-targets": "^7.22.15",
    +        "@babel/helper-module-transforms": "^7.23.3",
    +        "@babel/helpers": "^7.23.5",
    +        "@babel/parser": "^7.23.5",
    +        "@babel/template": "^7.22.15",
    +        "@babel/traverse": "^7.23.5",
    +        "@babel/types": "^7.23.5",
    +        "convert-source-map": "^2.0.0",
    +        "debug": "^4.1.0",
    +        "gensync": "^1.0.0-beta.2",
    +        "json5": "^2.2.3",
    +        "semver": "^6.3.1"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/babel"
    +      }
    +    },
    +    "node_modules/@babel/core/node_modules/debug": {
    +      "version": "4.3.4",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
    +      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/@babel/core/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/@babel/core/node_modules/semver": {
    +      "version": "6.3.1",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
    +      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
    +      "dev": true,
    +      "bin": {
    +        "semver": "bin/semver.js"
    +      }
    +    },
    +    "node_modules/@babel/generator": {
    +      "version": "7.23.5",
    +      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz",
    +      "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/types": "^7.23.5",
    +        "@jridgewell/gen-mapping": "^0.3.2",
    +        "@jridgewell/trace-mapping": "^0.3.17",
    +        "jsesc": "^2.5.1"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/@babel/helper-compilation-targets": {
    +      "version": "7.22.15",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz",
    +      "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/compat-data": "^7.22.9",
    +        "@babel/helper-validator-option": "^7.22.15",
    +        "browserslist": "^4.21.9",
    +        "lru-cache": "^5.1.1",
    +        "semver": "^6.3.1"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
    +      "version": "6.3.1",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
    +      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
    +      "dev": true,
    +      "bin": {
    +        "semver": "bin/semver.js"
    +      }
    +    },
    +    "node_modules/@babel/helper-environment-visitor": {
    +      "version": "7.22.20",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
    +      "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/@babel/helper-function-name": {
    +      "version": "7.23.0",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
    +      "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/template": "^7.22.15",
    +        "@babel/types": "^7.23.0"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/@babel/helper-hoist-variables": {
    +      "version": "7.22.5",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
    +      "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/types": "^7.22.5"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/@babel/helper-module-imports": {
    +      "version": "7.22.15",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
    +      "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/types": "^7.22.15"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/@babel/helper-module-transforms": {
    +      "version": "7.23.3",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz",
    +      "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/helper-environment-visitor": "^7.22.20",
    +        "@babel/helper-module-imports": "^7.22.15",
    +        "@babel/helper-simple-access": "^7.22.5",
    +        "@babel/helper-split-export-declaration": "^7.22.6",
    +        "@babel/helper-validator-identifier": "^7.22.20"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0"
    +      }
    +    },
    +    "node_modules/@babel/helper-plugin-utils": {
    +      "version": "7.22.5",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
    +      "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/@babel/helper-simple-access": {
    +      "version": "7.22.5",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
    +      "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/types": "^7.22.5"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/@babel/helper-split-export-declaration": {
    +      "version": "7.22.6",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
    +      "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/types": "^7.22.5"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/@babel/helper-string-parser": {
    +      "version": "7.23.4",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz",
    +      "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/@babel/helper-validator-identifier": {
    +      "version": "7.22.20",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
    +      "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/@babel/helper-validator-option": {
    +      "version": "7.23.5",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz",
    +      "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/@babel/helpers": {
    +      "version": "7.23.5",
    +      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.5.tgz",
    +      "integrity": "sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/template": "^7.22.15",
    +        "@babel/traverse": "^7.23.5",
    +        "@babel/types": "^7.23.5"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/@babel/highlight": {
    +      "version": "7.23.4",
    +      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
    +      "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/helper-validator-identifier": "^7.22.20",
    +        "chalk": "^2.4.2",
    +        "js-tokens": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/@babel/highlight/node_modules/ansi-styles": {
    +      "version": "3.2.1",
    +      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
    +      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
    +      "dev": true,
    +      "dependencies": {
    +        "color-convert": "^1.9.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/@babel/highlight/node_modules/chalk": {
    +      "version": "2.4.2",
    +      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
    +      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-styles": "^3.2.1",
    +        "escape-string-regexp": "^1.0.5",
    +        "supports-color": "^5.3.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/@babel/highlight/node_modules/color-convert": {
    +      "version": "1.9.3",
    +      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
    +      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
    +      "dev": true,
    +      "dependencies": {
    +        "color-name": "1.1.3"
    +      }
    +    },
    +    "node_modules/@babel/highlight/node_modules/color-name": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
    +      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
    +      "dev": true
    +    },
    +    "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
    +      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.8.0"
    +      }
    +    },
    +    "node_modules/@babel/highlight/node_modules/has-flag": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
    +      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/@babel/highlight/node_modules/supports-color": {
    +      "version": "5.5.0",
    +      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
    +      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-flag": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/@babel/parser": {
    +      "version": "7.23.5",
    +      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz",
    +      "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==",
    +      "dev": true,
    +      "bin": {
    +        "parser": "bin/babel-parser.js"
    +      },
    +      "engines": {
    +        "node": ">=6.0.0"
    +      }
    +    },
    +    "node_modules/@babel/plugin-syntax-async-generators": {
    +      "version": "7.8.4",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
    +      "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/helper-plugin-utils": "^7.8.0"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0-0"
    +      }
    +    },
    +    "node_modules/@babel/plugin-syntax-bigint": {
    +      "version": "7.8.3",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
    +      "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/helper-plugin-utils": "^7.8.0"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0-0"
    +      }
    +    },
    +    "node_modules/@babel/plugin-syntax-class-properties": {
    +      "version": "7.12.13",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
    +      "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/helper-plugin-utils": "^7.12.13"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0-0"
    +      }
    +    },
    +    "node_modules/@babel/plugin-syntax-import-meta": {
    +      "version": "7.10.4",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
    +      "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/helper-plugin-utils": "^7.10.4"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0-0"
    +      }
    +    },
    +    "node_modules/@babel/plugin-syntax-json-strings": {
    +      "version": "7.8.3",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
    +      "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/helper-plugin-utils": "^7.8.0"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0-0"
    +      }
    +    },
    +    "node_modules/@babel/plugin-syntax-jsx": {
    +      "version": "7.23.3",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz",
    +      "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/helper-plugin-utils": "^7.22.5"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0-0"
    +      }
    +    },
    +    "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
    +      "version": "7.10.4",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
    +      "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/helper-plugin-utils": "^7.10.4"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0-0"
    +      }
    +    },
    +    "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
    +      "version": "7.8.3",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
    +      "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/helper-plugin-utils": "^7.8.0"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0-0"
    +      }
    +    },
    +    "node_modules/@babel/plugin-syntax-numeric-separator": {
    +      "version": "7.10.4",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
    +      "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/helper-plugin-utils": "^7.10.4"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0-0"
    +      }
    +    },
    +    "node_modules/@babel/plugin-syntax-object-rest-spread": {
    +      "version": "7.8.3",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
    +      "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/helper-plugin-utils": "^7.8.0"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0-0"
    +      }
    +    },
    +    "node_modules/@babel/plugin-syntax-optional-catch-binding": {
    +      "version": "7.8.3",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
    +      "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/helper-plugin-utils": "^7.8.0"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0-0"
    +      }
    +    },
    +    "node_modules/@babel/plugin-syntax-optional-chaining": {
    +      "version": "7.8.3",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
    +      "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/helper-plugin-utils": "^7.8.0"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0-0"
    +      }
    +    },
    +    "node_modules/@babel/plugin-syntax-top-level-await": {
    +      "version": "7.14.5",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
    +      "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/helper-plugin-utils": "^7.14.5"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0-0"
    +      }
    +    },
    +    "node_modules/@babel/plugin-syntax-typescript": {
    +      "version": "7.23.3",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz",
    +      "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/helper-plugin-utils": "^7.22.5"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0-0"
    +      }
    +    },
    +    "node_modules/@babel/runtime": {
    +      "version": "7.23.5",
    +      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz",
    +      "integrity": "sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==",
    +      "dev": true,
    +      "dependencies": {
    +        "regenerator-runtime": "^0.14.0"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/@babel/template": {
    +      "version": "7.22.15",
    +      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
    +      "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/code-frame": "^7.22.13",
    +        "@babel/parser": "^7.22.15",
    +        "@babel/types": "^7.22.15"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/@babel/traverse": {
    +      "version": "7.23.5",
    +      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz",
    +      "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/code-frame": "^7.23.5",
    +        "@babel/generator": "^7.23.5",
    +        "@babel/helper-environment-visitor": "^7.22.20",
    +        "@babel/helper-function-name": "^7.23.0",
    +        "@babel/helper-hoist-variables": "^7.22.5",
    +        "@babel/helper-split-export-declaration": "^7.22.6",
    +        "@babel/parser": "^7.23.5",
    +        "@babel/types": "^7.23.5",
    +        "debug": "^4.1.0",
    +        "globals": "^11.1.0"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/@babel/traverse/node_modules/debug": {
    +      "version": "4.3.4",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
    +      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/@babel/traverse/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/@babel/types": {
    +      "version": "7.23.5",
    +      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz",
    +      "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/helper-string-parser": "^7.23.4",
    +        "@babel/helper-validator-identifier": "^7.22.20",
    +        "to-fast-properties": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/@bcoe/v8-coverage": {
    +      "version": "0.2.3",
    +      "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
    +      "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
    +      "dev": true
    +    },
    +    "node_modules/@eslint-community/eslint-utils": {
    +      "version": "4.4.0",
    +      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
    +      "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
    +      "dev": true,
    +      "dependencies": {
    +        "eslint-visitor-keys": "^3.3.0"
    +      },
    +      "engines": {
    +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    +      },
    +      "peerDependencies": {
    +        "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
    +      }
    +    },
    +    "node_modules/@eslint-community/regexpp": {
    +      "version": "4.10.0",
    +      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
    +      "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
    +      "dev": true,
    +      "engines": {
    +        "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
    +      }
    +    },
    +    "node_modules/@eslint/eslintrc": {
    +      "version": "2.1.4",
    +      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
    +      "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ajv": "^6.12.4",
    +        "debug": "^4.3.2",
    +        "espree": "^9.6.0",
    +        "globals": "^13.19.0",
    +        "ignore": "^5.2.0",
    +        "import-fresh": "^3.2.1",
    +        "js-yaml": "^4.1.0",
    +        "minimatch": "^3.1.2",
    +        "strip-json-comments": "^3.1.1"
    +      },
    +      "engines": {
    +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    +      },
    +      "funding": {
    +        "url": "https://opencollective.com/eslint"
    +      }
    +    },
    +    "node_modules/@eslint/eslintrc/node_modules/argparse": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
    +      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
    +      "dev": true
    +    },
    +    "node_modules/@eslint/eslintrc/node_modules/debug": {
    +      "version": "4.3.4",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
    +      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/@eslint/eslintrc/node_modules/globals": {
    +      "version": "13.23.0",
    +      "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz",
    +      "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==",
    +      "dev": true,
    +      "dependencies": {
    +        "type-fest": "^0.20.2"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
    +      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
    +      "dev": true,
    +      "dependencies": {
    +        "argparse": "^2.0.1"
    +      },
    +      "bin": {
    +        "js-yaml": "bin/js-yaml.js"
    +      }
    +    },
    +    "node_modules/@eslint/eslintrc/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/@eslint/eslintrc/node_modules/type-fest": {
    +      "version": "0.20.2",
    +      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
    +      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/@eslint/js": {
    +      "version": "8.55.0",
    +      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz",
    +      "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==",
    +      "dev": true,
    +      "engines": {
    +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    +      }
    +    },
    +    "node_modules/@fastify/busboy": {
    +      "version": "2.1.0",
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=14"
    +      }
    +    },
    +    "node_modules/@graphql-tools/merge": {
    +      "version": "8.3.1",
    +      "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.3.1.tgz",
    +      "integrity": "sha512-BMm99mqdNZbEYeTPK3it9r9S6rsZsQKtlqJsSBknAclXq2pGEfOxjcIZi+kBSkHZKPKCRrYDd5vY0+rUmIHVLg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@graphql-tools/utils": "8.9.0",
    +        "tslib": "^2.4.0"
    +      },
    +      "peerDependencies": {
    +        "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
    +      }
    +    },
    +    "node_modules/@graphql-tools/merge/node_modules/@graphql-tools/utils": {
    +      "version": "8.9.0",
    +      "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.9.0.tgz",
    +      "integrity": "sha512-pjJIWH0XOVnYGXCqej8g/u/tsfV4LvLlj0eATKQu5zwnxd/TiTHq7Cg313qUPTFFHZ3PP5wJ15chYVtLDwaymg==",
    +      "dev": true,
    +      "dependencies": {
    +        "tslib": "^2.4.0"
    +      },
    +      "peerDependencies": {
    +        "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
    +      }
    +    },
    +    "node_modules/@graphql-tools/schema": {
    +      "version": "8.5.1",
    +      "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-8.5.1.tgz",
    +      "integrity": "sha512-0Esilsh0P/qYcB5DKQpiKeQs/jevzIadNTaT0jeWklPMwNbT7yMX4EqZany7mbeRRlSRwMzNzL5olyFdffHBZg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@graphql-tools/merge": "8.3.1",
    +        "@graphql-tools/utils": "8.9.0",
    +        "tslib": "^2.4.0",
    +        "value-or-promise": "1.0.11"
    +      },
    +      "peerDependencies": {
    +        "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
    +      }
    +    },
    +    "node_modules/@graphql-tools/schema/node_modules/@graphql-tools/utils": {
    +      "version": "8.9.0",
    +      "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.9.0.tgz",
    +      "integrity": "sha512-pjJIWH0XOVnYGXCqej8g/u/tsfV4LvLlj0eATKQu5zwnxd/TiTHq7Cg313qUPTFFHZ3PP5wJ15chYVtLDwaymg==",
    +      "dev": true,
    +      "dependencies": {
    +        "tslib": "^2.4.0"
    +      },
    +      "peerDependencies": {
    +        "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
    +      }
    +    },
    +    "node_modules/@graphql-tools/utils": {
    +      "version": "8.13.1",
    +      "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.13.1.tgz",
    +      "integrity": "sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==",
    +      "dev": true,
    +      "dependencies": {
    +        "tslib": "^2.4.0"
    +      },
    +      "peerDependencies": {
    +        "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
    +      }
    +    },
    +    "node_modules/@hapi/hoek": {
    +      "version": "9.3.0",
    +      "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
    +      "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==",
    +      "dev": true
    +    },
    +    "node_modules/@hapi/topo": {
    +      "version": "5.1.0",
    +      "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
    +      "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@hapi/hoek": "^9.0.0"
    +      }
    +    },
    +    "node_modules/@httptoolkit/httpolyglot": {
    +      "version": "2.1.1",
    +      "resolved": "https://registry.npmjs.org/@httptoolkit/httpolyglot/-/httpolyglot-2.1.1.tgz",
    +      "integrity": "sha512-TvJOb/9dYmOD1U8sErFKCy5BxQc7kbLuvvRLfsTr+NN9kQGNGRNyenC00mJxUn2ld/WtxPMNup3JICHPUOPXDg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/node": "^16.7.10"
    +      },
    +      "engines": {
    +        "node": ">=12.0.0"
    +      }
    +    },
    +    "node_modules/@httptoolkit/httpolyglot/node_modules/@types/node": {
    +      "version": "16.18.66",
    +      "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.66.tgz",
    +      "integrity": "sha512-sePmD/imfKvC4re/Wwos1NEcXYm6O96CAG5gQVY53nmDb8ePQ4qPku6uruN7n6TJ0t5FhcoUc2+yvE2/UZVDZw==",
    +      "dev": true
    +    },
    +    "node_modules/@httptoolkit/subscriptions-transport-ws": {
    +      "version": "0.11.2",
    +      "resolved": "https://registry.npmjs.org/@httptoolkit/subscriptions-transport-ws/-/subscriptions-transport-ws-0.11.2.tgz",
    +      "integrity": "sha512-YB+gYYVjgYUeJrGkfS91ABeNWCFU7EVcn9Cflf2UXjsIiPJEI6yPxujPcjKv9wIJpM+33KQW/qVEmc+BdIDK2w==",
    +      "dev": true,
    +      "dependencies": {
    +        "backo2": "^1.0.2",
    +        "eventemitter3": "^3.1.0",
    +        "iterall": "^1.2.1",
    +        "symbol-observable": "^1.0.4",
    +        "ws": "^8.8.0"
    +      },
    +      "peerDependencies": {
    +        "graphql": "^15.7.2 || ^16.0.0"
    +      }
    +    },
    +    "node_modules/@httptoolkit/websocket-stream": {
    +      "version": "6.0.1",
    +      "resolved": "https://registry.npmjs.org/@httptoolkit/websocket-stream/-/websocket-stream-6.0.1.tgz",
    +      "integrity": "sha512-A0NOZI+Glp3Xgcz6Na7i7o09+/+xm2m0UCU8gdtM2nIv6/cjLmhMZMqehSpTlgbx9omtLmV8LVqOskPEyWnmZQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/ws": "*",
    +        "duplexify": "^3.5.1",
    +        "inherits": "^2.0.1",
    +        "isomorphic-ws": "^4.0.1",
    +        "readable-stream": "^2.3.3",
    +        "safe-buffer": "^5.1.2",
    +        "ws": "*",
    +        "xtend": "^4.0.0"
    +      }
    +    },
    +    "node_modules/@humanwhocodes/config-array": {
    +      "version": "0.11.13",
    +      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
    +      "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@humanwhocodes/object-schema": "^2.0.1",
    +        "debug": "^4.1.1",
    +        "minimatch": "^3.0.5"
    +      },
    +      "engines": {
    +        "node": ">=10.10.0"
    +      }
    +    },
    +    "node_modules/@humanwhocodes/config-array/node_modules/debug": {
    +      "version": "4.3.4",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
    +      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/@humanwhocodes/config-array/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/@humanwhocodes/module-importer": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
    +      "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=12.22"
    +      },
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/nzakas"
    +      }
    +    },
    +    "node_modules/@humanwhocodes/object-schema": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz",
    +      "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==",
    +      "dev": true
    +    },
    +    "node_modules/@istanbuljs/load-nyc-config": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
    +      "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "camelcase": "^5.3.1",
    +        "find-up": "^4.1.0",
    +        "get-package-type": "^0.1.0",
    +        "js-yaml": "^3.13.1",
    +        "resolve-from": "^5.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
    +      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/@istanbuljs/schema": {
    +      "version": "0.1.3",
    +      "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
    +      "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/@jest/console": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz",
    +      "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/types": "^29.6.3",
    +        "@types/node": "*",
    +        "chalk": "^4.0.0",
    +        "jest-message-util": "^29.7.0",
    +        "jest-util": "^29.7.0",
    +        "slash": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/@jest/core": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz",
    +      "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/console": "^29.7.0",
    +        "@jest/reporters": "^29.7.0",
    +        "@jest/test-result": "^29.7.0",
    +        "@jest/transform": "^29.7.0",
    +        "@jest/types": "^29.6.3",
    +        "@types/node": "*",
    +        "ansi-escapes": "^4.2.1",
    +        "chalk": "^4.0.0",
    +        "ci-info": "^3.2.0",
    +        "exit": "^0.1.2",
    +        "graceful-fs": "^4.2.9",
    +        "jest-changed-files": "^29.7.0",
    +        "jest-config": "^29.7.0",
    +        "jest-haste-map": "^29.7.0",
    +        "jest-message-util": "^29.7.0",
    +        "jest-regex-util": "^29.6.3",
    +        "jest-resolve": "^29.7.0",
    +        "jest-resolve-dependencies": "^29.7.0",
    +        "jest-runner": "^29.7.0",
    +        "jest-runtime": "^29.7.0",
    +        "jest-snapshot": "^29.7.0",
    +        "jest-util": "^29.7.0",
    +        "jest-validate": "^29.7.0",
    +        "jest-watcher": "^29.7.0",
    +        "micromatch": "^4.0.4",
    +        "pretty-format": "^29.7.0",
    +        "slash": "^3.0.0",
    +        "strip-ansi": "^6.0.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      },
    +      "peerDependencies": {
    +        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "node-notifier": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/@jest/environment": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
    +      "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/fake-timers": "^29.7.0",
    +        "@jest/types": "^29.6.3",
    +        "@types/node": "*",
    +        "jest-mock": "^29.7.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/@jest/expect": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz",
    +      "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "expect": "^29.7.0",
    +        "jest-snapshot": "^29.7.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/@jest/expect-utils": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz",
    +      "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
    +      "dev": true,
    +      "dependencies": {
    +        "jest-get-type": "^29.6.3"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/@jest/fake-timers": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz",
    +      "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/types": "^29.6.3",
    +        "@sinonjs/fake-timers": "^10.0.2",
    +        "@types/node": "*",
    +        "jest-message-util": "^29.7.0",
    +        "jest-mock": "^29.7.0",
    +        "jest-util": "^29.7.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/@jest/fake-timers/node_modules/@sinonjs/fake-timers": {
    +      "version": "10.3.0",
    +      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
    +      "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@sinonjs/commons": "^3.0.0"
    +      }
    +    },
    +    "node_modules/@jest/globals": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz",
    +      "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/environment": "^29.7.0",
    +        "@jest/expect": "^29.7.0",
    +        "@jest/types": "^29.6.3",
    +        "jest-mock": "^29.7.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/@jest/reporters": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz",
    +      "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@bcoe/v8-coverage": "^0.2.3",
    +        "@jest/console": "^29.7.0",
    +        "@jest/test-result": "^29.7.0",
    +        "@jest/transform": "^29.7.0",
    +        "@jest/types": "^29.6.3",
    +        "@jridgewell/trace-mapping": "^0.3.18",
    +        "@types/node": "*",
    +        "chalk": "^4.0.0",
    +        "collect-v8-coverage": "^1.0.0",
    +        "exit": "^0.1.2",
    +        "glob": "^7.1.3",
    +        "graceful-fs": "^4.2.9",
    +        "istanbul-lib-coverage": "^3.0.0",
    +        "istanbul-lib-instrument": "^6.0.0",
    +        "istanbul-lib-report": "^3.0.0",
    +        "istanbul-lib-source-maps": "^4.0.0",
    +        "istanbul-reports": "^3.1.3",
    +        "jest-message-util": "^29.7.0",
    +        "jest-util": "^29.7.0",
    +        "jest-worker": "^29.7.0",
    +        "slash": "^3.0.0",
    +        "string-length": "^4.0.1",
    +        "strip-ansi": "^6.0.0",
    +        "v8-to-istanbul": "^9.0.1"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      },
    +      "peerDependencies": {
    +        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "node-notifier": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/@jest/schemas": {
    +      "version": "29.6.3",
    +      "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
    +      "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@sinclair/typebox": "^0.27.8"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/@jest/source-map": {
    +      "version": "29.6.3",
    +      "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz",
    +      "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jridgewell/trace-mapping": "^0.3.18",
    +        "callsites": "^3.0.0",
    +        "graceful-fs": "^4.2.9"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/@jest/test-result": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz",
    +      "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/console": "^29.7.0",
    +        "@jest/types": "^29.6.3",
    +        "@types/istanbul-lib-coverage": "^2.0.0",
    +        "collect-v8-coverage": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/@jest/test-sequencer": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz",
    +      "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/test-result": "^29.7.0",
    +        "graceful-fs": "^4.2.9",
    +        "jest-haste-map": "^29.7.0",
    +        "slash": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/@jest/transform": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz",
    +      "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/core": "^7.11.6",
    +        "@jest/types": "^29.6.3",
    +        "@jridgewell/trace-mapping": "^0.3.18",
    +        "babel-plugin-istanbul": "^6.1.1",
    +        "chalk": "^4.0.0",
    +        "convert-source-map": "^2.0.0",
    +        "fast-json-stable-stringify": "^2.1.0",
    +        "graceful-fs": "^4.2.9",
    +        "jest-haste-map": "^29.7.0",
    +        "jest-regex-util": "^29.6.3",
    +        "jest-util": "^29.7.0",
    +        "micromatch": "^4.0.4",
    +        "pirates": "^4.0.4",
    +        "slash": "^3.0.0",
    +        "write-file-atomic": "^4.0.2"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/@jest/types": {
    +      "version": "29.6.3",
    +      "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
    +      "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/schemas": "^29.6.3",
    +        "@types/istanbul-lib-coverage": "^2.0.0",
    +        "@types/istanbul-reports": "^3.0.0",
    +        "@types/node": "*",
    +        "@types/yargs": "^17.0.8",
    +        "chalk": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/@jridgewell/gen-mapping": {
    +      "version": "0.3.3",
    +      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
    +      "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jridgewell/set-array": "^1.0.1",
    +        "@jridgewell/sourcemap-codec": "^1.4.10",
    +        "@jridgewell/trace-mapping": "^0.3.9"
    +      },
    +      "engines": {
    +        "node": ">=6.0.0"
    +      }
    +    },
    +    "node_modules/@jridgewell/resolve-uri": {
    +      "version": "3.1.1",
    +      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
    +      "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6.0.0"
    +      }
    +    },
    +    "node_modules/@jridgewell/set-array": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
    +      "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6.0.0"
    +      }
    +    },
    +    "node_modules/@jridgewell/sourcemap-codec": {
    +      "version": "1.4.15",
    +      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
    +      "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
    +      "dev": true
    +    },
    +    "node_modules/@jridgewell/trace-mapping": {
    +      "version": "0.3.20",
    +      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz",
    +      "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jridgewell/resolve-uri": "^3.1.0",
    +        "@jridgewell/sourcemap-codec": "^1.4.14"
    +      }
    +    },
    +    "node_modules/@leichtgewicht/ip-codec": {
    +      "version": "2.0.4",
    +      "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz",
    +      "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==",
    +      "dev": true
    +    },
    +    "node_modules/@nodelib/fs.scandir": {
    +      "version": "2.1.5",
    +      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
    +      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
    +      "dev": true,
    +      "dependencies": {
    +        "@nodelib/fs.stat": "2.0.5",
    +        "run-parallel": "^1.1.9"
    +      },
    +      "engines": {
    +        "node": ">= 8"
    +      }
    +    },
    +    "node_modules/@nodelib/fs.stat": {
    +      "version": "2.0.5",
    +      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
    +      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 8"
    +      }
    +    },
    +    "node_modules/@nodelib/fs.walk": {
    +      "version": "1.2.8",
    +      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
    +      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@nodelib/fs.scandir": "2.1.5",
    +        "fastq": "^1.6.0"
    +      },
    +      "engines": {
    +        "node": ">= 8"
    +      }
    +    },
    +    "node_modules/@sideway/address": {
    +      "version": "4.1.4",
    +      "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
    +      "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@hapi/hoek": "^9.0.0"
    +      }
    +    },
    +    "node_modules/@sideway/formula": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz",
    +      "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==",
    +      "dev": true
    +    },
    +    "node_modules/@sideway/pinpoint": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
    +      "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
    +      "dev": true
    +    },
    +    "node_modules/@sinclair/typebox": {
    +      "version": "0.27.8",
    +      "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
    +      "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
    +      "dev": true
    +    },
    +    "node_modules/@sindresorhus/is": {
    +      "version": "0.14.0",
    +      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
    +      "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/@sinonjs/commons": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz",
    +      "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==",
    +      "dev": true,
    +      "dependencies": {
    +        "type-detect": "4.0.8"
    +      }
    +    },
    +    "node_modules/@sinonjs/fake-timers": {
    +      "version": "11.2.2",
    +      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz",
    +      "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@sinonjs/commons": "^3.0.0"
    +      }
    +    },
    +    "node_modules/@sinonjs/samsam": {
    +      "version": "8.0.0",
    +      "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz",
    +      "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==",
    +      "dev": true,
    +      "dependencies": {
    +        "@sinonjs/commons": "^2.0.0",
    +        "lodash.get": "^4.4.2",
    +        "type-detect": "^4.0.8"
    +      }
    +    },
    +    "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz",
    +      "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==",
    +      "dev": true,
    +      "dependencies": {
    +        "type-detect": "4.0.8"
    +      }
    +    },
    +    "node_modules/@sinonjs/text-encoding": {
    +      "version": "0.7.2",
    +      "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz",
    +      "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==",
    +      "dev": true
    +    },
    +    "node_modules/@szmarczak/http-timer": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
    +      "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
    +      "dev": true,
    +      "dependencies": {
    +        "defer-to-connect": "^1.0.1"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/@tootallnate/quickjs-emscripten": {
    +      "version": "0.23.0",
    +      "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz",
    +      "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==",
    +      "dev": true
    +    },
    +    "node_modules/@tsd/typescript": {
    +      "version": "5.2.2",
    +      "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-5.2.2.tgz",
    +      "integrity": "sha512-VtjHPAKJqLJoHHKBDNofzvQB2+ZVxjXU/Gw6INAS9aINLQYVsxfzrQ2s84huCeYWZRTtrr7R0J7XgpZHjNwBCw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=14.17"
    +      }
    +    },
    +    "node_modules/@types/babel__core": {
    +      "version": "7.20.5",
    +      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
    +      "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/parser": "^7.20.7",
    +        "@babel/types": "^7.20.7",
    +        "@types/babel__generator": "*",
    +        "@types/babel__template": "*",
    +        "@types/babel__traverse": "*"
    +      }
    +    },
    +    "node_modules/@types/babel__generator": {
    +      "version": "7.6.7",
    +      "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz",
    +      "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/types": "^7.0.0"
    +      }
    +    },
    +    "node_modules/@types/babel__template": {
    +      "version": "7.4.4",
    +      "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
    +      "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/parser": "^7.1.0",
    +        "@babel/types": "^7.0.0"
    +      }
    +    },
    +    "node_modules/@types/babel__traverse": {
    +      "version": "7.20.4",
    +      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz",
    +      "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/types": "^7.20.7"
    +      }
    +    },
    +    "node_modules/@types/cors": {
    +      "version": "2.8.17",
    +      "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz",
    +      "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/node": "*"
    +      }
    +    },
    +    "node_modules/@types/escodegen": {
    +      "version": "0.0.6",
    +      "resolved": "https://registry.npmjs.org/@types/escodegen/-/escodegen-0.0.6.tgz",
    +      "integrity": "sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==",
    +      "dev": true
    +    },
    +    "node_modules/@types/eslint": {
    +      "version": "7.29.0",
    +      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz",
    +      "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/estree": "*",
    +        "@types/json-schema": "*"
    +      }
    +    },
    +    "node_modules/@types/esprima": {
    +      "version": "4.0.6",
    +      "resolved": "https://registry.npmjs.org/@types/esprima/-/esprima-4.0.6.tgz",
    +      "integrity": "sha512-lIk+kSt9lGv5hxK6aZNjiUEGZqKmOTpmg0tKiJQI+Ow98fLillxsiZNik5+RcP7mXL929KiTH/D9jGtpDlMbVw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/estree": "*"
    +      }
    +    },
    +    "node_modules/@types/estraverse": {
    +      "version": "0.0.6",
    +      "resolved": "https://registry.npmjs.org/@types/estraverse/-/estraverse-0.0.6.tgz",
    +      "integrity": "sha512-ZwPw+fR4vniKCn94+Qtn4dKeew/5tFaTrwaEViLg5Ah/pSASj/D2taHo2RSbGIPWEPuD9DqyVtLGGT2X4OR5hQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/estree": "*"
    +      }
    +    },
    +    "node_modules/@types/estree": {
    +      "version": "0.0.39",
    +      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
    +      "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
    +      "dev": true
    +    },
    +    "node_modules/@types/graceful-fs": {
    +      "version": "4.1.9",
    +      "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
    +      "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/node": "*"
    +      }
    +    },
    +    "node_modules/@types/istanbul-lib-coverage": {
    +      "version": "2.0.6",
    +      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
    +      "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
    +      "dev": true
    +    },
    +    "node_modules/@types/istanbul-lib-report": {
    +      "version": "3.0.3",
    +      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
    +      "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/istanbul-lib-coverage": "*"
    +      }
    +    },
    +    "node_modules/@types/istanbul-reports": {
    +      "version": "3.0.4",
    +      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
    +      "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/istanbul-lib-report": "*"
    +      }
    +    },
    +    "node_modules/@types/json-schema": {
    +      "version": "7.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
    +      "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
    +      "dev": true
    +    },
    +    "node_modules/@types/json5": {
    +      "version": "0.0.29",
    +      "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
    +      "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
    +      "dev": true
    +    },
    +    "node_modules/@types/minimist": {
    +      "version": "1.2.5",
    +      "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz",
    +      "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==",
    +      "dev": true
    +    },
    +    "node_modules/@types/node": {
    +      "version": "18.19.1",
    +      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.1.tgz",
    +      "integrity": "sha512-mZJ9V11gG5Vp0Ox2oERpeFDl+JvCwK24PGy76vVY/UgBtjwJWc5rYBThFxmbnYOm9UPZNm6wEl/sxHt2SU7x9A==",
    +      "dev": true,
    +      "dependencies": {
    +        "undici-types": "~5.26.4"
    +      }
    +    },
    +    "node_modules/@types/node-forge": {
    +      "version": "1.3.10",
    +      "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.10.tgz",
    +      "integrity": "sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/node": "*"
    +      }
    +    },
    +    "node_modules/@types/normalize-package-data": {
    +      "version": "2.4.4",
    +      "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
    +      "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
    +      "dev": true
    +    },
    +    "node_modules/@types/stack-utils": {
    +      "version": "2.0.3",
    +      "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
    +      "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
    +      "dev": true
    +    },
    +    "node_modules/@types/ws": {
    +      "version": "8.5.10",
    +      "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz",
    +      "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/node": "*"
    +      }
    +    },
    +    "node_modules/@types/yargs": {
    +      "version": "17.0.32",
    +      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz",
    +      "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/yargs-parser": "*"
    +      }
    +    },
    +    "node_modules/@types/yargs-parser": {
    +      "version": "21.0.3",
    +      "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
    +      "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
    +      "dev": true
    +    },
    +    "node_modules/@ungap/structured-clone": {
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
    +      "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
    +      "dev": true
    +    },
    +    "node_modules/abort-controller": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
    +      "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
    +      "dev": true,
    +      "dependencies": {
    +        "event-target-shim": "^5.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6.5"
    +      }
    +    },
    +    "node_modules/accepts": {
    +      "version": "1.3.8",
    +      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
    +      "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
    +      "dev": true,
    +      "dependencies": {
    +        "mime-types": "~2.1.34",
    +        "negotiator": "0.6.3"
    +      },
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/acorn": {
    +      "version": "8.11.2",
    +      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz",
    +      "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==",
    +      "dev": true,
    +      "bin": {
    +        "acorn": "bin/acorn"
    +      },
    +      "engines": {
    +        "node": ">=0.4.0"
    +      }
    +    },
    +    "node_modules/acorn-jsx": {
    +      "version": "5.3.2",
    +      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
    +      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
    +      "dev": true,
    +      "peerDependencies": {
    +        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
    +      }
    +    },
    +    "node_modules/acquerello": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/acquerello/-/acquerello-1.1.2.tgz",
    +      "integrity": "sha512-V/ynq+ekRAls3iWOQMxA8G9pi40aTL9mheHHxA8x8oowZVjY7bROD99t+TSOKKp3BviACYOsNMlL+b+8jZ7ImQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 18.18.0"
    +      }
    +    },
    +    "node_modules/agent-base": {
    +      "version": "7.1.0",
    +      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
    +      "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
    +      "dev": true,
    +      "dependencies": {
    +        "debug": "^4.3.4"
    +      },
    +      "engines": {
    +        "node": ">= 14"
    +      }
    +    },
    +    "node_modules/agent-base/node_modules/debug": {
    +      "version": "4.3.4",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
    +      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/agent-base/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/aggregate-error": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
    +      "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
    +      "dev": true,
    +      "dependencies": {
    +        "clean-stack": "^2.0.0",
    +        "indent-string": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/ajv": {
    +      "version": "6.12.6",
    +      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
    +      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
    +      "dev": true,
    +      "dependencies": {
    +        "fast-deep-equal": "^3.1.1",
    +        "fast-json-stable-stringify": "^2.0.0",
    +        "json-schema-traverse": "^0.4.1",
    +        "uri-js": "^4.2.2"
    +      },
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/epoberezkin"
    +      }
    +    },
    +    "node_modules/ansi-align": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
    +      "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
    +      "dev": true,
    +      "dependencies": {
    +        "string-width": "^4.1.0"
    +      }
    +    },
    +    "node_modules/ansi-colors": {
    +      "version": "4.1.3",
    +      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
    +      "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/ansi-escapes": {
    +      "version": "4.3.2",
    +      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
    +      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "type-fest": "^0.21.3"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/ansi-regex": {
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
    +      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/ansi-styles": {
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
    +      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
    +      "dev": true,
    +      "dependencies": {
    +        "color-convert": "^2.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
    +      }
    +    },
    +    "node_modules/anymatch": {
    +      "version": "3.1.3",
    +      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
    +      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
    +      "dev": true,
    +      "dependencies": {
    +        "normalize-path": "^3.0.0",
    +        "picomatch": "^2.0.4"
    +      },
    +      "engines": {
    +        "node": ">= 8"
    +      }
    +    },
    +    "node_modules/append-transform": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz",
    +      "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==",
    +      "dev": true,
    +      "dependencies": {
    +        "default-require-extensions": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/archy": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
    +      "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==",
    +      "dev": true
    +    },
    +    "node_modules/argparse": {
    +      "version": "1.0.10",
    +      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
    +      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
    +      "dev": true,
    +      "dependencies": {
    +        "sprintf-js": "~1.0.2"
    +      }
    +    },
    +    "node_modules/args": {
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/args/-/args-5.0.1.tgz",
    +      "integrity": "sha512-1kqmFCFsPffavQFGt8OxJdIcETti99kySRUPMpOhaGjL6mRJn8HFU1OxKY5bMqfZKUwTQc1mZkAjmGYaVOHFtQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "camelcase": "5.0.0",
    +        "chalk": "2.4.2",
    +        "leven": "2.1.0",
    +        "mri": "1.1.4"
    +      },
    +      "engines": {
    +        "node": ">= 6.0.0"
    +      }
    +    },
    +    "node_modules/args/node_modules/ansi-styles": {
    +      "version": "3.2.1",
    +      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
    +      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
    +      "dev": true,
    +      "dependencies": {
    +        "color-convert": "^1.9.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/args/node_modules/camelcase": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz",
    +      "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/args/node_modules/chalk": {
    +      "version": "2.4.2",
    +      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
    +      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-styles": "^3.2.1",
    +        "escape-string-regexp": "^1.0.5",
    +        "supports-color": "^5.3.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/args/node_modules/color-convert": {
    +      "version": "1.9.3",
    +      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
    +      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
    +      "dev": true,
    +      "dependencies": {
    +        "color-name": "1.1.3"
    +      }
    +    },
    +    "node_modules/args/node_modules/color-name": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
    +      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
    +      "dev": true
    +    },
    +    "node_modules/args/node_modules/escape-string-regexp": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
    +      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.8.0"
    +      }
    +    },
    +    "node_modules/args/node_modules/has-flag": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
    +      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/args/node_modules/leven": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz",
    +      "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/args/node_modules/supports-color": {
    +      "version": "5.5.0",
    +      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
    +      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-flag": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/array-buffer-byte-length": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz",
    +      "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "is-array-buffer": "^3.0.1"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/array-flatten": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
    +      "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
    +      "dev": true
    +    },
    +    "node_modules/array-includes": {
    +      "version": "3.1.7",
    +      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz",
    +      "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.2.0",
    +        "es-abstract": "^1.22.1",
    +        "get-intrinsic": "^1.2.1",
    +        "is-string": "^1.0.7"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/array-union": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
    +      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/array.prototype.findlastindex": {
    +      "version": "1.2.3",
    +      "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz",
    +      "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.2.0",
    +        "es-abstract": "^1.22.1",
    +        "es-shim-unscopables": "^1.0.0",
    +        "get-intrinsic": "^1.2.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/array.prototype.flat": {
    +      "version": "1.3.2",
    +      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
    +      "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.2.0",
    +        "es-abstract": "^1.22.1",
    +        "es-shim-unscopables": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/array.prototype.flatmap": {
    +      "version": "1.3.2",
    +      "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
    +      "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.2.0",
    +        "es-abstract": "^1.22.1",
    +        "es-shim-unscopables": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/array.prototype.tosorted": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz",
    +      "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.2.0",
    +        "es-abstract": "^1.22.1",
    +        "es-shim-unscopables": "^1.0.0",
    +        "get-intrinsic": "^1.2.1"
    +      }
    +    },
    +    "node_modules/arraybuffer.prototype.slice": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz",
    +      "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==",
    +      "dev": true,
    +      "dependencies": {
    +        "array-buffer-byte-length": "^1.0.0",
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.2.0",
    +        "es-abstract": "^1.22.1",
    +        "get-intrinsic": "^1.2.1",
    +        "is-array-buffer": "^3.0.2",
    +        "is-shared-array-buffer": "^1.0.2"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/arrify": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
    +      "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/assertion-error": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
    +      "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
    +      "dev": true,
    +      "engines": {
    +        "node": "*"
    +      }
    +    },
    +    "node_modules/ast-types": {
    +      "version": "0.13.4",
    +      "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
    +      "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==",
    +      "dev": true,
    +      "dependencies": {
    +        "tslib": "^2.0.1"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/astral-regex": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
    +      "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/async": {
    +      "version": "2.6.4",
    +      "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
    +      "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
    +      "dev": true,
    +      "dependencies": {
    +        "lodash": "^4.17.14"
    +      }
    +    },
    +    "node_modules/async-hook-domain": {
    +      "version": "2.0.4",
    +      "resolved": "https://registry.npmjs.org/async-hook-domain/-/async-hook-domain-2.0.4.tgz",
    +      "integrity": "sha512-14LjCmlK1PK8eDtTezR6WX8TMaYNIzBIsd2D1sGoGjgx0BuNMMoSdk7i/drlbtamy0AWv9yv2tkB+ASdmeqFIw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/asynciterator.prototype": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz",
    +      "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-symbols": "^1.0.3"
    +      }
    +    },
    +    "node_modules/asynckit": {
    +      "version": "0.4.0",
    +      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
    +      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
    +      "dev": true
    +    },
    +    "node_modules/atomic-sleep": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz",
    +      "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8.0.0"
    +      }
    +    },
    +    "node_modules/available-typed-arrays": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
    +      "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/axios": {
    +      "version": "1.6.2",
    +      "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz",
    +      "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==",
    +      "dev": true,
    +      "dependencies": {
    +        "follow-redirects": "^1.15.0",
    +        "form-data": "^4.0.0",
    +        "proxy-from-env": "^1.1.0"
    +      }
    +    },
    +    "node_modules/babel-jest": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz",
    +      "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/transform": "^29.7.0",
    +        "@types/babel__core": "^7.1.14",
    +        "babel-plugin-istanbul": "^6.1.1",
    +        "babel-preset-jest": "^29.6.3",
    +        "chalk": "^4.0.0",
    +        "graceful-fs": "^4.2.9",
    +        "slash": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.8.0"
    +      }
    +    },
    +    "node_modules/babel-plugin-istanbul": {
    +      "version": "6.1.1",
    +      "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
    +      "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/helper-plugin-utils": "^7.0.0",
    +        "@istanbuljs/load-nyc-config": "^1.0.0",
    +        "@istanbuljs/schema": "^0.1.2",
    +        "istanbul-lib-instrument": "^5.0.4",
    +        "test-exclude": "^6.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": {
    +      "version": "5.2.1",
    +      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
    +      "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/core": "^7.12.3",
    +        "@babel/parser": "^7.14.7",
    +        "@istanbuljs/schema": "^0.1.2",
    +        "istanbul-lib-coverage": "^3.2.0",
    +        "semver": "^6.3.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/babel-plugin-istanbul/node_modules/semver": {
    +      "version": "6.3.1",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
    +      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
    +      "dev": true,
    +      "bin": {
    +        "semver": "bin/semver.js"
    +      }
    +    },
    +    "node_modules/babel-plugin-jest-hoist": {
    +      "version": "29.6.3",
    +      "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz",
    +      "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/template": "^7.3.3",
    +        "@babel/types": "^7.3.3",
    +        "@types/babel__core": "^7.1.14",
    +        "@types/babel__traverse": "^7.0.6"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/babel-preset-current-node-syntax": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
    +      "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/plugin-syntax-async-generators": "^7.8.4",
    +        "@babel/plugin-syntax-bigint": "^7.8.3",
    +        "@babel/plugin-syntax-class-properties": "^7.8.3",
    +        "@babel/plugin-syntax-import-meta": "^7.8.3",
    +        "@babel/plugin-syntax-json-strings": "^7.8.3",
    +        "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
    +        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
    +        "@babel/plugin-syntax-numeric-separator": "^7.8.3",
    +        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
    +        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
    +        "@babel/plugin-syntax-optional-chaining": "^7.8.3",
    +        "@babel/plugin-syntax-top-level-await": "^7.8.3"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0"
    +      }
    +    },
    +    "node_modules/babel-preset-jest": {
    +      "version": "29.6.3",
    +      "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz",
    +      "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==",
    +      "dev": true,
    +      "dependencies": {
    +        "babel-plugin-jest-hoist": "^29.6.3",
    +        "babel-preset-current-node-syntax": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0"
    +      }
    +    },
    +    "node_modules/backo2": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
    +      "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==",
    +      "dev": true
    +    },
    +    "node_modules/balanced-match": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
    +      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
    +      "dev": true
    +    },
    +    "node_modules/base64-arraybuffer": {
    +      "version": "0.1.5",
    +      "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
    +      "integrity": "sha512-437oANT9tP582zZMwSvZGy2nmSeAb8DW2me3y+Uv1Wp2Rulr8Mqlyrv3E7MLxmsiaPSMMDmiDVzgE+e8zlMx9g==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.6.0"
    +      }
    +    },
    +    "node_modules/base64-js": {
    +      "version": "1.5.1",
    +      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
    +      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/feross"
    +        },
    +        {
    +          "type": "patreon",
    +          "url": "https://www.patreon.com/feross"
    +        },
    +        {
    +          "type": "consulting",
    +          "url": "https://feross.org/support"
    +        }
    +      ]
    +    },
    +    "node_modules/basic-auth-parser": {
    +      "version": "0.0.2",
    +      "resolved": "https://registry.npmjs.org/basic-auth-parser/-/basic-auth-parser-0.0.2.tgz",
    +      "integrity": "sha512-Y7OBvWn+JnW45JWHLY6ybYub2k9cXCMrtCyO1Hds2s6eqClqWhPnOQpgXUPjAiMHj+A8TEPIQQ1dYENnJoBOHQ==",
    +      "dev": true
    +    },
    +    "node_modules/basic-ftp": {
    +      "version": "5.0.3",
    +      "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz",
    +      "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10.0.0"
    +      }
    +    },
    +    "node_modules/binary-extensions": {
    +      "version": "2.2.0",
    +      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
    +      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/bind-obj-methods": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-3.0.0.tgz",
    +      "integrity": "sha512-nLEaaz3/sEzNSyPWRsN9HNsqwk1AUyECtGj+XwGdIi3xABnEqecvXtIJ0wehQXuuER5uZ/5fTs2usONgYjG+iw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/body-parser": {
    +      "version": "1.20.2",
    +      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
    +      "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
    +      "dev": true,
    +      "dependencies": {
    +        "bytes": "3.1.2",
    +        "content-type": "~1.0.5",
    +        "debug": "2.6.9",
    +        "depd": "2.0.0",
    +        "destroy": "1.2.0",
    +        "http-errors": "2.0.0",
    +        "iconv-lite": "0.4.24",
    +        "on-finished": "2.4.1",
    +        "qs": "6.11.0",
    +        "raw-body": "2.5.2",
    +        "type-is": "~1.6.18",
    +        "unpipe": "1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.8",
    +        "npm": "1.2.8000 || >= 1.4.16"
    +      }
    +    },
    +    "node_modules/body-parser/node_modules/on-finished": {
    +      "version": "2.4.1",
    +      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
    +      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
    +      "dev": true,
    +      "dependencies": {
    +        "ee-first": "1.1.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/boxen": {
    +      "version": "4.2.0",
    +      "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz",
    +      "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-align": "^3.0.0",
    +        "camelcase": "^5.3.1",
    +        "chalk": "^3.0.0",
    +        "cli-boxes": "^2.2.0",
    +        "string-width": "^4.1.0",
    +        "term-size": "^2.1.0",
    +        "type-fest": "^0.8.1",
    +        "widest-line": "^3.1.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/boxen/node_modules/chalk": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
    +      "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-styles": "^4.1.0",
    +        "supports-color": "^7.1.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/boxen/node_modules/supports-color": {
    +      "version": "7.2.0",
    +      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
    +      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-flag": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/boxen/node_modules/type-fest": {
    +      "version": "0.8.1",
    +      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
    +      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/brace-expansion": {
    +      "version": "1.1.11",
    +      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
    +      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
    +      "dev": true,
    +      "dependencies": {
    +        "balanced-match": "^1.0.0",
    +        "concat-map": "0.0.1"
    +      }
    +    },
    +    "node_modules/braces": {
    +      "version": "3.0.2",
    +      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
    +      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
    +      "dev": true,
    +      "dependencies": {
    +        "fill-range": "^7.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/brotli-wasm": {
    +      "version": "1.3.1",
    +      "resolved": "https://registry.npmjs.org/brotli-wasm/-/brotli-wasm-1.3.1.tgz",
    +      "integrity": "sha512-Vp+v3QXddvy39Ycbmvd3/Y1kUvKhwtnprzeABcKWN4jmyg6W3W5MhGPCfXBMHeSQnizgpV59iWmkSRp7ykOnDQ==",
    +      "dev": true
    +    },
    +    "node_modules/browser-stdout": {
    +      "version": "1.3.1",
    +      "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
    +      "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
    +      "dev": true
    +    },
    +    "node_modules/browserslist": {
    +      "version": "4.22.1",
    +      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz",
    +      "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "opencollective",
    +          "url": "https://opencollective.com/browserslist"
    +        },
    +        {
    +          "type": "tidelift",
    +          "url": "https://tidelift.com/funding/github/npm/browserslist"
    +        },
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/ai"
    +        }
    +      ],
    +      "dependencies": {
    +        "caniuse-lite": "^1.0.30001541",
    +        "electron-to-chromium": "^1.4.535",
    +        "node-releases": "^2.0.13",
    +        "update-browserslist-db": "^1.0.13"
    +      },
    +      "bin": {
    +        "browserslist": "cli.js"
    +      },
    +      "engines": {
    +        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
    +      }
    +    },
    +    "node_modules/bser": {
    +      "version": "2.1.1",
    +      "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
    +      "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "node-int64": "^0.4.0"
    +      }
    +    },
    +    "node_modules/buffer-from": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
    +      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
    +      "dev": true
    +    },
    +    "node_modules/builtins": {
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz",
    +      "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "semver": "^7.0.0"
    +      }
    +    },
    +    "node_modules/bytes": {
    +      "version": "3.1.2",
    +      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
    +      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/cacheable-lookup": {
    +      "version": "6.1.0",
    +      "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz",
    +      "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10.6.0"
    +      }
    +    },
    +    "node_modules/cacheable-request": {
    +      "version": "6.1.0",
    +      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
    +      "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
    +      "dev": true,
    +      "dependencies": {
    +        "clone-response": "^1.0.2",
    +        "get-stream": "^5.1.0",
    +        "http-cache-semantics": "^4.0.0",
    +        "keyv": "^3.0.0",
    +        "lowercase-keys": "^2.0.0",
    +        "normalize-url": "^4.1.0",
    +        "responselike": "^1.0.2"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/cacheable-request/node_modules/get-stream": {
    +      "version": "5.2.0",
    +      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
    +      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
    +      "dev": true,
    +      "dependencies": {
    +        "pump": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/cacheable-request/node_modules/json-buffer": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
    +      "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==",
    +      "dev": true
    +    },
    +    "node_modules/cacheable-request/node_modules/keyv": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
    +      "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
    +      "dev": true,
    +      "dependencies": {
    +        "json-buffer": "3.0.0"
    +      }
    +    },
    +    "node_modules/cacheable-request/node_modules/lowercase-keys": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
    +      "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/caching-transform": {
    +      "version": "3.0.2",
    +      "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz",
    +      "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==",
    +      "dev": true,
    +      "dependencies": {
    +        "hasha": "^3.0.0",
    +        "make-dir": "^2.0.0",
    +        "package-hash": "^3.0.0",
    +        "write-file-atomic": "^2.4.2"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/caching-transform/node_modules/make-dir": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
    +      "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
    +      "dev": true,
    +      "dependencies": {
    +        "pify": "^4.0.1",
    +        "semver": "^5.6.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/caching-transform/node_modules/pify": {
    +      "version": "4.0.1",
    +      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
    +      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/caching-transform/node_modules/semver": {
    +      "version": "5.7.2",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
    +      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
    +      "dev": true,
    +      "bin": {
    +        "semver": "bin/semver"
    +      }
    +    },
    +    "node_modules/caching-transform/node_modules/write-file-atomic": {
    +      "version": "2.4.3",
    +      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
    +      "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "graceful-fs": "^4.1.11",
    +        "imurmurhash": "^0.1.4",
    +        "signal-exit": "^3.0.2"
    +      }
    +    },
    +    "node_modules/call-bind": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
    +      "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "function-bind": "^1.1.2",
    +        "get-intrinsic": "^1.2.1",
    +        "set-function-length": "^1.1.1"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/callsites": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
    +      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/camelcase": {
    +      "version": "5.3.1",
    +      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
    +      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/camelcase-keys": {
    +      "version": "6.2.2",
    +      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
    +      "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
    +      "dev": true,
    +      "dependencies": {
    +        "camelcase": "^5.3.1",
    +        "map-obj": "^4.0.0",
    +        "quick-lru": "^4.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/camelcase-keys/node_modules/quick-lru": {
    +      "version": "4.0.1",
    +      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
    +      "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/caniuse-lite": {
    +      "version": "1.0.30001565",
    +      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001565.tgz",
    +      "integrity": "sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "opencollective",
    +          "url": "https://opencollective.com/browserslist"
    +        },
    +        {
    +          "type": "tidelift",
    +          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
    +        },
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/ai"
    +        }
    +      ]
    +    },
    +    "node_modules/chai": {
    +      "version": "4.3.10",
    +      "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz",
    +      "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==",
    +      "dev": true,
    +      "dependencies": {
    +        "assertion-error": "^1.1.0",
    +        "check-error": "^1.0.3",
    +        "deep-eql": "^4.1.3",
    +        "get-func-name": "^2.0.2",
    +        "loupe": "^2.3.6",
    +        "pathval": "^1.1.1",
    +        "type-detect": "^4.0.8"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/chai-as-promised": {
    +      "version": "7.1.1",
    +      "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz",
    +      "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==",
    +      "dev": true,
    +      "dependencies": {
    +        "check-error": "^1.0.2"
    +      },
    +      "peerDependencies": {
    +        "chai": ">= 2.1.2 < 5"
    +      }
    +    },
    +    "node_modules/chai-iterator": {
    +      "version": "3.0.2",
    +      "resolved": "https://registry.npmjs.org/chai-iterator/-/chai-iterator-3.0.2.tgz",
    +      "integrity": "sha512-7ZKEmBJRNSYUBMK0QC1sTzyhHHS67d1R3W3uu9MdehvPPzOEOrtmI6lmTO3CxiuMbeEEDozF1pnlEMraxKXLcg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependencies": {
    +        "chai": "4.x"
    +      }
    +    },
    +    "node_modules/chai-string": {
    +      "version": "1.5.0",
    +      "resolved": "https://registry.npmjs.org/chai-string/-/chai-string-1.5.0.tgz",
    +      "integrity": "sha512-sydDC3S3pNAQMYwJrs6dQX0oBQ6KfIPuOZ78n7rocW0eJJlsHPh2t3kwW7xfwYA/1Bf6/arGtSUo16rxR2JFlw==",
    +      "dev": true,
    +      "peerDependencies": {
    +        "chai": "^4.1.2"
    +      }
    +    },
    +    "node_modules/chalk": {
    +      "version": "4.1.2",
    +      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
    +      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-styles": "^4.1.0",
    +        "supports-color": "^7.1.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/chalk/chalk?sponsor=1"
    +      }
    +    },
    +    "node_modules/chalk/node_modules/supports-color": {
    +      "version": "7.2.0",
    +      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
    +      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-flag": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/char-regex": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
    +      "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/check-error": {
    +      "version": "1.0.3",
    +      "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
    +      "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
    +      "dev": true,
    +      "dependencies": {
    +        "get-func-name": "^2.0.2"
    +      },
    +      "engines": {
    +        "node": "*"
    +      }
    +    },
    +    "node_modules/chokidar": {
    +      "version": "3.5.3",
    +      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
    +      "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "individual",
    +          "url": "https://paulmillr.com/funding/"
    +        }
    +      ],
    +      "dependencies": {
    +        "anymatch": "~3.1.2",
    +        "braces": "~3.0.2",
    +        "glob-parent": "~5.1.2",
    +        "is-binary-path": "~2.1.0",
    +        "is-glob": "~4.0.1",
    +        "normalize-path": "~3.0.0",
    +        "readdirp": "~3.6.0"
    +      },
    +      "engines": {
    +        "node": ">= 8.10.0"
    +      },
    +      "optionalDependencies": {
    +        "fsevents": "~2.3.2"
    +      }
    +    },
    +    "node_modules/ci-info": {
    +      "version": "3.9.0",
    +      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
    +      "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/sibiraj-s"
    +        }
    +      ],
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/cjs-module-lexer": {
    +      "version": "1.2.3",
    +      "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz",
    +      "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==",
    +      "dev": true
    +    },
    +    "node_modules/clean-stack": {
    +      "version": "2.2.0",
    +      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
    +      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/cli-boxes": {
    +      "version": "2.2.1",
    +      "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
    +      "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/cliui": {
    +      "version": "7.0.4",
    +      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
    +      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "string-width": "^4.2.0",
    +        "strip-ansi": "^6.0.0",
    +        "wrap-ansi": "^7.0.0"
    +      }
    +    },
    +    "node_modules/clone-response": {
    +      "version": "1.0.3",
    +      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
    +      "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
    +      "dev": true,
    +      "dependencies": {
    +        "mimic-response": "^1.0.0"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/co": {
    +      "version": "4.6.0",
    +      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
    +      "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
    +      "dev": true,
    +      "engines": {
    +        "iojs": ">= 1.0.0",
    +        "node": ">= 0.12.0"
    +      }
    +    },
    +    "node_modules/collect-v8-coverage": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz",
    +      "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==",
    +      "dev": true
    +    },
    +    "node_modules/color-convert": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
    +      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "color-name": "~1.1.4"
    +      },
    +      "engines": {
    +        "node": ">=7.0.0"
    +      }
    +    },
    +    "node_modules/color-name": {
    +      "version": "1.1.4",
    +      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
    +      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
    +      "dev": true
    +    },
    +    "node_modules/color-support": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
    +      "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
    +      "dev": true,
    +      "bin": {
    +        "color-support": "bin.js"
    +      }
    +    },
    +    "node_modules/combined-stream": {
    +      "version": "1.0.8",
    +      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
    +      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
    +      "dev": true,
    +      "dependencies": {
    +        "delayed-stream": "~1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/common-tags": {
    +      "version": "1.8.2",
    +      "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
    +      "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4.0.0"
    +      }
    +    },
    +    "node_modules/commondir": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
    +      "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
    +      "dev": true
    +    },
    +    "node_modules/concat-map": {
    +      "version": "0.0.1",
    +      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
    +      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
    +      "dev": true
    +    },
    +    "node_modules/concat-stream": {
    +      "version": "1.6.2",
    +      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
    +      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
    +      "dev": true,
    +      "engines": [
    +        "node >= 0.8"
    +      ],
    +      "dependencies": {
    +        "buffer-from": "^1.0.0",
    +        "inherits": "^2.0.3",
    +        "readable-stream": "^2.2.2",
    +        "typedarray": "^0.0.6"
    +      }
    +    },
    +    "node_modules/concurrently": {
    +      "version": "8.2.2",
    +      "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz",
    +      "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==",
    +      "dev": true,
    +      "dependencies": {
    +        "chalk": "^4.1.2",
    +        "date-fns": "^2.30.0",
    +        "lodash": "^4.17.21",
    +        "rxjs": "^7.8.1",
    +        "shell-quote": "^1.8.1",
    +        "spawn-command": "0.0.2",
    +        "supports-color": "^8.1.1",
    +        "tree-kill": "^1.2.2",
    +        "yargs": "^17.7.2"
    +      },
    +      "bin": {
    +        "conc": "dist/bin/concurrently.js",
    +        "concurrently": "dist/bin/concurrently.js"
    +      },
    +      "engines": {
    +        "node": "^14.13.0 || >=16.0.0"
    +      },
    +      "funding": {
    +        "url": "https://github.com/open-cli-tools/concurrently?sponsor=1"
    +      }
    +    },
    +    "node_modules/configstore": {
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
    +      "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
    +      "dev": true,
    +      "dependencies": {
    +        "dot-prop": "^5.2.0",
    +        "graceful-fs": "^4.1.2",
    +        "make-dir": "^3.0.0",
    +        "unique-string": "^2.0.0",
    +        "write-file-atomic": "^3.0.0",
    +        "xdg-basedir": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/configstore/node_modules/write-file-atomic": {
    +      "version": "3.0.3",
    +      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
    +      "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "imurmurhash": "^0.1.4",
    +        "is-typedarray": "^1.0.0",
    +        "signal-exit": "^3.0.2",
    +        "typedarray-to-buffer": "^3.1.5"
    +      }
    +    },
    +    "node_modules/connect": {
    +      "version": "3.7.0",
    +      "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
    +      "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "debug": "2.6.9",
    +        "finalhandler": "1.1.2",
    +        "parseurl": "~1.3.3",
    +        "utils-merge": "1.0.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.10.0"
    +      }
    +    },
    +    "node_modules/connect-history-api-fallback": {
    +      "version": "1.6.0",
    +      "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
    +      "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.8"
    +      }
    +    },
    +    "node_modules/connect-livereload": {
    +      "version": "0.6.1",
    +      "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.6.1.tgz",
    +      "integrity": "sha512-3R0kMOdL7CjJpU66fzAkCe6HNtd3AavCS4m+uW4KtJjrdGPT0SQEZieAYd+cm+lJoBznNQ4lqipYWkhBMgk00g==",
    +      "dev": true,
    +      "engines": {
    +        "node": "*"
    +      }
    +    },
    +    "node_modules/content-disposition": {
    +      "version": "0.5.4",
    +      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
    +      "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "safe-buffer": "5.2.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/content-type": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
    +      "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/convert-source-map": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
    +      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
    +      "dev": true
    +    },
    +    "node_modules/cookie": {
    +      "version": "0.5.0",
    +      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
    +      "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/cookie-signature": {
    +      "version": "1.0.6",
    +      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
    +      "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
    +      "dev": true
    +    },
    +    "node_modules/core-util-is": {
    +      "version": "1.0.3",
    +      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
    +      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
    +      "dev": true
    +    },
    +    "node_modules/cors": {
    +      "version": "2.8.5",
    +      "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
    +      "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
    +      "dev": true,
    +      "dependencies": {
    +        "object-assign": "^4",
    +        "vary": "^1"
    +      },
    +      "engines": {
    +        "node": ">= 0.10"
    +      }
    +    },
    +    "node_modules/cors-gate": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/cors-gate/-/cors-gate-1.1.3.tgz",
    +      "integrity": "sha512-RFqvbbpj02lqKDhqasBEkgzmT3RseCH3DKy5sT2W9S1mhctABKQP3ktKcnKN0h8t4pJ2SneI3hPl3TGNi/VmZA==",
    +      "dev": true
    +    },
    +    "node_modules/cp-file": {
    +      "version": "7.0.0",
    +      "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-7.0.0.tgz",
    +      "integrity": "sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw==",
    +      "dev": true,
    +      "dependencies": {
    +        "graceful-fs": "^4.1.2",
    +        "make-dir": "^3.0.0",
    +        "nested-error-stacks": "^2.0.0",
    +        "p-event": "^4.1.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/create-jest": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz",
    +      "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/types": "^29.6.3",
    +        "chalk": "^4.0.0",
    +        "exit": "^0.1.2",
    +        "graceful-fs": "^4.2.9",
    +        "jest-config": "^29.7.0",
    +        "jest-util": "^29.7.0",
    +        "prompts": "^2.0.1"
    +      },
    +      "bin": {
    +        "create-jest": "bin/create-jest.js"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/cronometro": {
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/cronometro/-/cronometro-1.2.0.tgz",
    +      "integrity": "sha512-QeNGCuvNFimu4IJhZSL4oNopAmxfjRkSqh4rci4PZuNWKLRhqPC0oemw6gdbfgz0evqxOOS3uwtSt2FMR8dDXw==",
    +      "dev": true,
    +      "dependencies": {
    +        "acquerello": "^1.1.2",
    +        "hdr-histogram-js": "^3.0.0",
    +        "table": "^6.8.1"
    +      },
    +      "engines": {
    +        "node": ">= 18.18.0"
    +      }
    +    },
    +    "node_modules/cross-fetch": {
    +      "version": "3.1.8",
    +      "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz",
    +      "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==",
    +      "dev": true,
    +      "dependencies": {
    +        "node-fetch": "^2.6.12"
    +      }
    +    },
    +    "node_modules/cross-spawn": {
    +      "version": "7.0.3",
    +      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
    +      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
    +      "dev": true,
    +      "dependencies": {
    +        "path-key": "^3.1.0",
    +        "shebang-command": "^2.0.0",
    +        "which": "^2.0.1"
    +      },
    +      "engines": {
    +        "node": ">= 8"
    +      }
    +    },
    +    "node_modules/crypto-random-string": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
    +      "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/cssstyle": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz",
    +      "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==",
    +      "dev": true,
    +      "dependencies": {
    +        "rrweb-cssom": "^0.6.0"
    +      },
    +      "engines": {
    +        "node": ">=14"
    +      }
    +    },
    +    "node_modules/data-uri-to-buffer": {
    +      "version": "6.0.1",
    +      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.1.tgz",
    +      "integrity": "sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 14"
    +      }
    +    },
    +    "node_modules/data-urls": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz",
    +      "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==",
    +      "dev": true,
    +      "dependencies": {
    +        "whatwg-mimetype": "^4.0.0",
    +        "whatwg-url": "^14.0.0"
    +      },
    +      "engines": {
    +        "node": ">=18"
    +      }
    +    },
    +    "node_modules/date-fns": {
    +      "version": "2.30.0",
    +      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
    +      "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/runtime": "^7.21.0"
    +      },
    +      "engines": {
    +        "node": ">=0.11"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/date-fns"
    +      }
    +    },
    +    "node_modules/debug": {
    +      "version": "2.6.9",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
    +      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.0.0"
    +      }
    +    },
    +    "node_modules/decamelize": {
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
    +      "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/decamelize-keys": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
    +      "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
    +      "dev": true,
    +      "dependencies": {
    +        "decamelize": "^1.1.0",
    +        "map-obj": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">=0.10.0"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/decamelize-keys/node_modules/map-obj": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
    +      "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/decimal.js": {
    +      "version": "10.4.3",
    +      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
    +      "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
    +      "dev": true
    +    },
    +    "node_modules/decompress-response": {
    +      "version": "3.3.0",
    +      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
    +      "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==",
    +      "dev": true,
    +      "dependencies": {
    +        "mimic-response": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/dedent": {
    +      "version": "1.5.1",
    +      "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz",
    +      "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==",
    +      "dev": true,
    +      "peerDependencies": {
    +        "babel-plugin-macros": "^3.1.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "babel-plugin-macros": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/deep-eql": {
    +      "version": "4.1.3",
    +      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
    +      "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
    +      "dev": true,
    +      "dependencies": {
    +        "type-detect": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/deep-equal": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz",
    +      "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-arguments": "^1.1.1",
    +        "is-date-object": "^1.0.5",
    +        "is-regex": "^1.1.4",
    +        "object-is": "^1.1.5",
    +        "object-keys": "^1.1.1",
    +        "regexp.prototype.flags": "^1.5.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/deep-extend": {
    +      "version": "0.6.0",
    +      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
    +      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4.0.0"
    +      }
    +    },
    +    "node_modules/deep-is": {
    +      "version": "0.1.4",
    +      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
    +      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
    +      "dev": true
    +    },
    +    "node_modules/deepmerge": {
    +      "version": "4.3.1",
    +      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
    +      "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/default-require-extensions": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz",
    +      "integrity": "sha512-B0n2zDIXpzLzKeoEozorDSa1cHc1t0NjmxP0zuAxbizNU2MBqYJJKYXrrFdKuQliojXynrxgd7l4ahfg/+aA5g==",
    +      "dev": true,
    +      "dependencies": {
    +        "strip-bom": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/default-require-extensions/node_modules/strip-bom": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
    +      "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/defer-to-connect": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
    +      "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
    +      "dev": true
    +    },
    +    "node_modules/define-data-property": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
    +      "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "get-intrinsic": "^1.2.1",
    +        "gopd": "^1.0.1",
    +        "has-property-descriptors": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      }
    +    },
    +    "node_modules/define-properties": {
    +      "version": "1.2.1",
    +      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
    +      "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
    +      "dev": true,
    +      "dependencies": {
    +        "define-data-property": "^1.0.1",
    +        "has-property-descriptors": "^1.0.0",
    +        "object-keys": "^1.1.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/degenerator": {
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz",
    +      "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ast-types": "^0.13.4",
    +        "escodegen": "^2.1.0",
    +        "esprima": "^4.0.1"
    +      },
    +      "engines": {
    +        "node": ">= 14"
    +      }
    +    },
    +    "node_modules/degenerator/node_modules/escodegen": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
    +      "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
    +      "dev": true,
    +      "dependencies": {
    +        "esprima": "^4.0.1",
    +        "estraverse": "^5.2.0",
    +        "esutils": "^2.0.2"
    +      },
    +      "bin": {
    +        "escodegen": "bin/escodegen.js",
    +        "esgenerate": "bin/esgenerate.js"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "optionalDependencies": {
    +        "source-map": "~0.6.1"
    +      }
    +    },
    +    "node_modules/degenerator/node_modules/estraverse": {
    +      "version": "5.3.0",
    +      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
    +      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4.0"
    +      }
    +    },
    +    "node_modules/delay": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz",
    +      "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/delayed-stream": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
    +      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.4.0"
    +      }
    +    },
    +    "node_modules/depd": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
    +      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/destroy": {
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
    +      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.8",
    +        "npm": "1.2.8000 || >= 1.4.16"
    +      }
    +    },
    +    "node_modules/destroyable-server": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/destroyable-server/-/destroyable-server-1.0.0.tgz",
    +      "integrity": "sha512-78rUr9j0b4bRWO0eBtqKqmb43htBwNbofRRukpo+R7PZqHD6llb7aQoNVt81U9NQGhINRKBHz7lkrxZJj9vyog==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/node": "*"
    +      },
    +      "engines": {
    +        "node": ">=12.0.0"
    +      }
    +    },
    +    "node_modules/detect-newline": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
    +      "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/diff": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
    +      "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.3.1"
    +      }
    +    },
    +    "node_modules/diff-sequences": {
    +      "version": "29.6.3",
    +      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
    +      "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
    +      "dev": true,
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/dir-glob": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
    +      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
    +      "dev": true,
    +      "dependencies": {
    +        "path-type": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/dns-packet": {
    +      "version": "5.6.1",
    +      "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz",
    +      "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@leichtgewicht/ip-codec": "^2.0.1"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/docsify": {
    +      "version": "4.13.1",
    +      "resolved": "https://registry.npmjs.org/docsify/-/docsify-4.13.1.tgz",
    +      "integrity": "sha512-BsDypTBhw0mfslw9kZgAspCMZSM+sUIIDg5K/t1hNLkvbem9h64ZQc71e1IpY+iWsi/KdeqfazDfg52y2Lmm0A==",
    +      "dev": true,
    +      "hasInstallScript": true,
    +      "dependencies": {
    +        "marked": "^1.2.9",
    +        "medium-zoom": "^1.0.6",
    +        "opencollective-postinstall": "^2.0.2",
    +        "prismjs": "^1.27.0",
    +        "strip-indent": "^3.0.0",
    +        "tinydate": "^1.3.0",
    +        "tweezer.js": "^1.4.0"
    +      }
    +    },
    +    "node_modules/docsify-cli": {
    +      "version": "4.4.4",
    +      "resolved": "https://registry.npmjs.org/docsify-cli/-/docsify-cli-4.4.4.tgz",
    +      "integrity": "sha512-NAZgg6b0BsDuq/Pe+P19Qb2J1d+ZVbS0eGkeCNxyu4F9/CQSsRqZqAvPJ9/0I+BCHn4sgftA2jluqhQVzKzrSA==",
    +      "dev": true,
    +      "dependencies": {
    +        "chalk": "^2.4.2",
    +        "connect": "^3.6.0",
    +        "connect-history-api-fallback": "^1.6.0",
    +        "connect-livereload": "^0.6.0",
    +        "cp-file": "^7.0.0",
    +        "docsify": "^4.12.2",
    +        "docsify-server-renderer": ">=4.10.0",
    +        "enquirer": "^2.3.6",
    +        "fs-extra": "^8.1.0",
    +        "get-port": "^5.0.0",
    +        "livereload": "^0.9.2",
    +        "lru-cache": "^5.1.1",
    +        "open": "^6.4.0",
    +        "serve-static": "^1.12.1",
    +        "update-notifier": "^4.1.0",
    +        "yargonaut": "^1.1.2",
    +        "yargs": "^15.3.0"
    +      },
    +      "bin": {
    +        "docsify": "bin/docsify"
    +      },
    +      "engines": {
    +        "node": ">= 10",
    +        "npm": ">= 6"
    +      }
    +    },
    +    "node_modules/docsify-cli/node_modules/ansi-styles": {
    +      "version": "3.2.1",
    +      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
    +      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
    +      "dev": true,
    +      "dependencies": {
    +        "color-convert": "^1.9.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/docsify-cli/node_modules/chalk": {
    +      "version": "2.4.2",
    +      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
    +      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-styles": "^3.2.1",
    +        "escape-string-regexp": "^1.0.5",
    +        "supports-color": "^5.3.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/docsify-cli/node_modules/cliui": {
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
    +      "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "string-width": "^4.2.0",
    +        "strip-ansi": "^6.0.0",
    +        "wrap-ansi": "^6.2.0"
    +      }
    +    },
    +    "node_modules/docsify-cli/node_modules/color-convert": {
    +      "version": "1.9.3",
    +      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
    +      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
    +      "dev": true,
    +      "dependencies": {
    +        "color-name": "1.1.3"
    +      }
    +    },
    +    "node_modules/docsify-cli/node_modules/color-name": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
    +      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
    +      "dev": true
    +    },
    +    "node_modules/docsify-cli/node_modules/escape-string-regexp": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
    +      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.8.0"
    +      }
    +    },
    +    "node_modules/docsify-cli/node_modules/has-flag": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
    +      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/docsify-cli/node_modules/supports-color": {
    +      "version": "5.5.0",
    +      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
    +      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-flag": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/docsify-cli/node_modules/wrap-ansi": {
    +      "version": "6.2.0",
    +      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
    +      "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-styles": "^4.0.0",
    +        "string-width": "^4.1.0",
    +        "strip-ansi": "^6.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/docsify-cli/node_modules/wrap-ansi/node_modules/ansi-styles": {
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
    +      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
    +      "dev": true,
    +      "dependencies": {
    +        "color-convert": "^2.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
    +      }
    +    },
    +    "node_modules/docsify-cli/node_modules/wrap-ansi/node_modules/color-convert": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
    +      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "color-name": "~1.1.4"
    +      },
    +      "engines": {
    +        "node": ">=7.0.0"
    +      }
    +    },
    +    "node_modules/docsify-cli/node_modules/wrap-ansi/node_modules/color-name": {
    +      "version": "1.1.4",
    +      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
    +      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
    +      "dev": true
    +    },
    +    "node_modules/docsify-cli/node_modules/y18n": {
    +      "version": "4.0.3",
    +      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
    +      "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
    +      "dev": true
    +    },
    +    "node_modules/docsify-cli/node_modules/yargs": {
    +      "version": "15.4.1",
    +      "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
    +      "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
    +      "dev": true,
    +      "dependencies": {
    +        "cliui": "^6.0.0",
    +        "decamelize": "^1.2.0",
    +        "find-up": "^4.1.0",
    +        "get-caller-file": "^2.0.1",
    +        "require-directory": "^2.1.1",
    +        "require-main-filename": "^2.0.0",
    +        "set-blocking": "^2.0.0",
    +        "string-width": "^4.2.0",
    +        "which-module": "^2.0.0",
    +        "y18n": "^4.0.0",
    +        "yargs-parser": "^18.1.2"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/docsify-cli/node_modules/yargs-parser": {
    +      "version": "18.1.3",
    +      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
    +      "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "camelcase": "^5.0.0",
    +        "decamelize": "^1.2.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/docsify-server-renderer": {
    +      "version": "4.13.1",
    +      "resolved": "https://registry.npmjs.org/docsify-server-renderer/-/docsify-server-renderer-4.13.1.tgz",
    +      "integrity": "sha512-XNJeCK3zp+mVO7JZFn0bH4hNBAMMC1MbuCU7CBsjLHYn4NHrjIgCBGmylzEan3/4Qm6kbSzQx8XzUK5T7GQxHw==",
    +      "dev": true,
    +      "dependencies": {
    +        "debug": "^4.3.3",
    +        "docsify": "^4.12.4",
    +        "node-fetch": "^2.6.6",
    +        "resolve-pathname": "^3.0.0"
    +      }
    +    },
    +    "node_modules/docsify-server-renderer/node_modules/debug": {
    +      "version": "4.3.4",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
    +      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/docsify-server-renderer/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/doctrine": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
    +      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
    +      "dev": true,
    +      "dependencies": {
    +        "esutils": "^2.0.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0.0"
    +      }
    +    },
    +    "node_modules/dot-prop": {
    +      "version": "5.3.0",
    +      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
    +      "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-obj": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/duplexer3": {
    +      "version": "0.1.5",
    +      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz",
    +      "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==",
    +      "dev": true
    +    },
    +    "node_modules/duplexify": {
    +      "version": "3.7.1",
    +      "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
    +      "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
    +      "dev": true,
    +      "dependencies": {
    +        "end-of-stream": "^1.0.0",
    +        "inherits": "^2.0.1",
    +        "readable-stream": "^2.0.0",
    +        "stream-shift": "^1.0.0"
    +      }
    +    },
    +    "node_modules/ee-first": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
    +      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
    +      "dev": true
    +    },
    +    "node_modules/electron-to-chromium": {
    +      "version": "1.4.601",
    +      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.601.tgz",
    +      "integrity": "sha512-SpwUMDWe9tQu8JX5QCO1+p/hChAi9AE9UpoC3rcHVc+gdCGlbT3SGb5I1klgb952HRIyvt9wZhSz9bNBYz9swA==",
    +      "dev": true
    +    },
    +    "node_modules/emittery": {
    +      "version": "0.13.1",
    +      "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
    +      "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=12"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sindresorhus/emittery?sponsor=1"
    +      }
    +    },
    +    "node_modules/emoji-regex": {
    +      "version": "8.0.0",
    +      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
    +      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
    +      "dev": true
    +    },
    +    "node_modules/encodeurl": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
    +      "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/end-of-stream": {
    +      "version": "1.4.4",
    +      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
    +      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "once": "^1.4.0"
    +      }
    +    },
    +    "node_modules/enquirer": {
    +      "version": "2.4.1",
    +      "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz",
    +      "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-colors": "^4.1.1",
    +        "strip-ansi": "^6.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8.6"
    +      }
    +    },
    +    "node_modules/entities": {
    +      "version": "4.5.0",
    +      "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
    +      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.12"
    +      },
    +      "funding": {
    +        "url": "https://github.com/fb55/entities?sponsor=1"
    +      }
    +    },
    +    "node_modules/error-ex": {
    +      "version": "1.3.2",
    +      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
    +      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-arrayish": "^0.2.1"
    +      }
    +    },
    +    "node_modules/es-abstract": {
    +      "version": "1.22.3",
    +      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz",
    +      "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==",
    +      "dev": true,
    +      "dependencies": {
    +        "array-buffer-byte-length": "^1.0.0",
    +        "arraybuffer.prototype.slice": "^1.0.2",
    +        "available-typed-arrays": "^1.0.5",
    +        "call-bind": "^1.0.5",
    +        "es-set-tostringtag": "^2.0.1",
    +        "es-to-primitive": "^1.2.1",
    +        "function.prototype.name": "^1.1.6",
    +        "get-intrinsic": "^1.2.2",
    +        "get-symbol-description": "^1.0.0",
    +        "globalthis": "^1.0.3",
    +        "gopd": "^1.0.1",
    +        "has-property-descriptors": "^1.0.0",
    +        "has-proto": "^1.0.1",
    +        "has-symbols": "^1.0.3",
    +        "hasown": "^2.0.0",
    +        "internal-slot": "^1.0.5",
    +        "is-array-buffer": "^3.0.2",
    +        "is-callable": "^1.2.7",
    +        "is-negative-zero": "^2.0.2",
    +        "is-regex": "^1.1.4",
    +        "is-shared-array-buffer": "^1.0.2",
    +        "is-string": "^1.0.7",
    +        "is-typed-array": "^1.1.12",
    +        "is-weakref": "^1.0.2",
    +        "object-inspect": "^1.13.1",
    +        "object-keys": "^1.1.1",
    +        "object.assign": "^4.1.4",
    +        "regexp.prototype.flags": "^1.5.1",
    +        "safe-array-concat": "^1.0.1",
    +        "safe-regex-test": "^1.0.0",
    +        "string.prototype.trim": "^1.2.8",
    +        "string.prototype.trimend": "^1.0.7",
    +        "string.prototype.trimstart": "^1.0.7",
    +        "typed-array-buffer": "^1.0.0",
    +        "typed-array-byte-length": "^1.0.0",
    +        "typed-array-byte-offset": "^1.0.0",
    +        "typed-array-length": "^1.0.4",
    +        "unbox-primitive": "^1.0.2",
    +        "which-typed-array": "^1.1.13"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/es-iterator-helpers": {
    +      "version": "1.0.15",
    +      "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz",
    +      "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==",
    +      "dev": true,
    +      "dependencies": {
    +        "asynciterator.prototype": "^1.0.0",
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.2.1",
    +        "es-abstract": "^1.22.1",
    +        "es-set-tostringtag": "^2.0.1",
    +        "function-bind": "^1.1.1",
    +        "get-intrinsic": "^1.2.1",
    +        "globalthis": "^1.0.3",
    +        "has-property-descriptors": "^1.0.0",
    +        "has-proto": "^1.0.1",
    +        "has-symbols": "^1.0.3",
    +        "internal-slot": "^1.0.5",
    +        "iterator.prototype": "^1.1.2",
    +        "safe-array-concat": "^1.0.1"
    +      }
    +    },
    +    "node_modules/es-set-tostringtag": {
    +      "version": "2.0.2",
    +      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz",
    +      "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "get-intrinsic": "^1.2.2",
    +        "has-tostringtag": "^1.0.0",
    +        "hasown": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      }
    +    },
    +    "node_modules/es-shim-unscopables": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
    +      "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
    +      "dev": true,
    +      "dependencies": {
    +        "hasown": "^2.0.0"
    +      }
    +    },
    +    "node_modules/es-to-primitive": {
    +      "version": "1.2.1",
    +      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
    +      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-callable": "^1.1.4",
    +        "is-date-object": "^1.0.1",
    +        "is-symbol": "^1.0.2"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/es6-error": {
    +      "version": "4.1.1",
    +      "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
    +      "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
    +      "dev": true
    +    },
    +    "node_modules/escalade": {
    +      "version": "3.1.1",
    +      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
    +      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/escape-goat": {
    +      "version": "2.1.1",
    +      "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
    +      "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/escape-html": {
    +      "version": "1.0.3",
    +      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
    +      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
    +      "dev": true
    +    },
    +    "node_modules/escape-string-regexp": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
    +      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/escodegen": {
    +      "version": "1.14.3",
    +      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
    +      "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
    +      "dev": true,
    +      "dependencies": {
    +        "esprima": "^4.0.1",
    +        "estraverse": "^4.2.0",
    +        "esutils": "^2.0.2",
    +        "optionator": "^0.8.1"
    +      },
    +      "bin": {
    +        "escodegen": "bin/escodegen.js",
    +        "esgenerate": "bin/esgenerate.js"
    +      },
    +      "engines": {
    +        "node": ">=4.0"
    +      },
    +      "optionalDependencies": {
    +        "source-map": "~0.6.1"
    +      }
    +    },
    +    "node_modules/eslint": {
    +      "version": "8.55.0",
    +      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz",
    +      "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@eslint-community/eslint-utils": "^4.2.0",
    +        "@eslint-community/regexpp": "^4.6.1",
    +        "@eslint/eslintrc": "^2.1.4",
    +        "@eslint/js": "8.55.0",
    +        "@humanwhocodes/config-array": "^0.11.13",
    +        "@humanwhocodes/module-importer": "^1.0.1",
    +        "@nodelib/fs.walk": "^1.2.8",
    +        "@ungap/structured-clone": "^1.2.0",
    +        "ajv": "^6.12.4",
    +        "chalk": "^4.0.0",
    +        "cross-spawn": "^7.0.2",
    +        "debug": "^4.3.2",
    +        "doctrine": "^3.0.0",
    +        "escape-string-regexp": "^4.0.0",
    +        "eslint-scope": "^7.2.2",
    +        "eslint-visitor-keys": "^3.4.3",
    +        "espree": "^9.6.1",
    +        "esquery": "^1.4.2",
    +        "esutils": "^2.0.2",
    +        "fast-deep-equal": "^3.1.3",
    +        "file-entry-cache": "^6.0.1",
    +        "find-up": "^5.0.0",
    +        "glob-parent": "^6.0.2",
    +        "globals": "^13.19.0",
    +        "graphemer": "^1.4.0",
    +        "ignore": "^5.2.0",
    +        "imurmurhash": "^0.1.4",
    +        "is-glob": "^4.0.0",
    +        "is-path-inside": "^3.0.3",
    +        "js-yaml": "^4.1.0",
    +        "json-stable-stringify-without-jsonify": "^1.0.1",
    +        "levn": "^0.4.1",
    +        "lodash.merge": "^4.6.2",
    +        "minimatch": "^3.1.2",
    +        "natural-compare": "^1.4.0",
    +        "optionator": "^0.9.3",
    +        "strip-ansi": "^6.0.1",
    +        "text-table": "^0.2.0"
    +      },
    +      "bin": {
    +        "eslint": "bin/eslint.js"
    +      },
    +      "engines": {
    +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    +      },
    +      "funding": {
    +        "url": "https://opencollective.com/eslint"
    +      }
    +    },
    +    "node_modules/eslint-config-standard": {
    +      "version": "17.1.0",
    +      "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz",
    +      "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/feross"
    +        },
    +        {
    +          "type": "patreon",
    +          "url": "https://www.patreon.com/feross"
    +        },
    +        {
    +          "type": "consulting",
    +          "url": "https://feross.org/support"
    +        }
    +      ],
    +      "engines": {
    +        "node": ">=12.0.0"
    +      },
    +      "peerDependencies": {
    +        "eslint": "^8.0.1",
    +        "eslint-plugin-import": "^2.25.2",
    +        "eslint-plugin-n": "^15.0.0 || ^16.0.0 ",
    +        "eslint-plugin-promise": "^6.0.0"
    +      }
    +    },
    +    "node_modules/eslint-config-standard-jsx": {
    +      "version": "11.0.0",
    +      "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz",
    +      "integrity": "sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/feross"
    +        },
    +        {
    +          "type": "patreon",
    +          "url": "https://www.patreon.com/feross"
    +        },
    +        {
    +          "type": "consulting",
    +          "url": "https://feross.org/support"
    +        }
    +      ],
    +      "peerDependencies": {
    +        "eslint": "^8.8.0",
    +        "eslint-plugin-react": "^7.28.0"
    +      }
    +    },
    +    "node_modules/eslint-formatter-pretty": {
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-4.1.0.tgz",
    +      "integrity": "sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/eslint": "^7.2.13",
    +        "ansi-escapes": "^4.2.1",
    +        "chalk": "^4.1.0",
    +        "eslint-rule-docs": "^1.1.5",
    +        "log-symbols": "^4.0.0",
    +        "plur": "^4.0.0",
    +        "string-width": "^4.2.0",
    +        "supports-hyperlinks": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/eslint-import-resolver-node": {
    +      "version": "0.3.9",
    +      "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
    +      "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
    +      "dev": true,
    +      "dependencies": {
    +        "debug": "^3.2.7",
    +        "is-core-module": "^2.13.0",
    +        "resolve": "^1.22.4"
    +      }
    +    },
    +    "node_modules/eslint-import-resolver-node/node_modules/debug": {
    +      "version": "3.2.7",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
    +      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "^2.1.1"
    +      }
    +    },
    +    "node_modules/eslint-import-resolver-node/node_modules/ms": {
    +      "version": "2.1.3",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
    +      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
    +      "dev": true
    +    },
    +    "node_modules/eslint-module-utils": {
    +      "version": "2.8.0",
    +      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz",
    +      "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==",
    +      "dev": true,
    +      "dependencies": {
    +        "debug": "^3.2.7"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      },
    +      "peerDependenciesMeta": {
    +        "eslint": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/eslint-module-utils/node_modules/debug": {
    +      "version": "3.2.7",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
    +      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "^2.1.1"
    +      }
    +    },
    +    "node_modules/eslint-module-utils/node_modules/ms": {
    +      "version": "2.1.3",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
    +      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
    +      "dev": true
    +    },
    +    "node_modules/eslint-plugin-es": {
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz",
    +      "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "eslint-utils": "^2.0.0",
    +        "regexpp": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8.10.0"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/mysticatea"
    +      },
    +      "peerDependencies": {
    +        "eslint": ">=4.19.1"
    +      }
    +    },
    +    "node_modules/eslint-plugin-es/node_modules/eslint-utils": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
    +      "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
    +      "dev": true,
    +      "dependencies": {
    +        "eslint-visitor-keys": "^1.1.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/mysticatea"
    +      }
    +    },
    +    "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": {
    +      "version": "1.3.0",
    +      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
    +      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/eslint-plugin-import": {
    +      "version": "2.29.0",
    +      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz",
    +      "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==",
    +      "dev": true,
    +      "dependencies": {
    +        "array-includes": "^3.1.7",
    +        "array.prototype.findlastindex": "^1.2.3",
    +        "array.prototype.flat": "^1.3.2",
    +        "array.prototype.flatmap": "^1.3.2",
    +        "debug": "^3.2.7",
    +        "doctrine": "^2.1.0",
    +        "eslint-import-resolver-node": "^0.3.9",
    +        "eslint-module-utils": "^2.8.0",
    +        "hasown": "^2.0.0",
    +        "is-core-module": "^2.13.1",
    +        "is-glob": "^4.0.3",
    +        "minimatch": "^3.1.2",
    +        "object.fromentries": "^2.0.7",
    +        "object.groupby": "^1.0.1",
    +        "object.values": "^1.1.7",
    +        "semver": "^6.3.1",
    +        "tsconfig-paths": "^3.14.2"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      },
    +      "peerDependencies": {
    +        "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
    +      }
    +    },
    +    "node_modules/eslint-plugin-import/node_modules/debug": {
    +      "version": "3.2.7",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
    +      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "^2.1.1"
    +      }
    +    },
    +    "node_modules/eslint-plugin-import/node_modules/doctrine": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
    +      "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
    +      "dev": true,
    +      "dependencies": {
    +        "esutils": "^2.0.2"
    +      },
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/eslint-plugin-import/node_modules/ms": {
    +      "version": "2.1.3",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
    +      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
    +      "dev": true
    +    },
    +    "node_modules/eslint-plugin-import/node_modules/semver": {
    +      "version": "6.3.1",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
    +      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
    +      "dev": true,
    +      "bin": {
    +        "semver": "bin/semver.js"
    +      }
    +    },
    +    "node_modules/eslint-plugin-n": {
    +      "version": "15.7.0",
    +      "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz",
    +      "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "builtins": "^5.0.1",
    +        "eslint-plugin-es": "^4.1.0",
    +        "eslint-utils": "^3.0.0",
    +        "ignore": "^5.1.1",
    +        "is-core-module": "^2.11.0",
    +        "minimatch": "^3.1.2",
    +        "resolve": "^1.22.1",
    +        "semver": "^7.3.8"
    +      },
    +      "engines": {
    +        "node": ">=12.22.0"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/mysticatea"
    +      },
    +      "peerDependencies": {
    +        "eslint": ">=7.0.0"
    +      }
    +    },
    +    "node_modules/eslint-plugin-promise": {
    +      "version": "6.1.1",
    +      "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz",
    +      "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==",
    +      "dev": true,
    +      "engines": {
    +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    +      },
    +      "peerDependencies": {
    +        "eslint": "^7.0.0 || ^8.0.0"
    +      }
    +    },
    +    "node_modules/eslint-plugin-react": {
    +      "version": "7.33.2",
    +      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz",
    +      "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==",
    +      "dev": true,
    +      "dependencies": {
    +        "array-includes": "^3.1.6",
    +        "array.prototype.flatmap": "^1.3.1",
    +        "array.prototype.tosorted": "^1.1.1",
    +        "doctrine": "^2.1.0",
    +        "es-iterator-helpers": "^1.0.12",
    +        "estraverse": "^5.3.0",
    +        "jsx-ast-utils": "^2.4.1 || ^3.0.0",
    +        "minimatch": "^3.1.2",
    +        "object.entries": "^1.1.6",
    +        "object.fromentries": "^2.0.6",
    +        "object.hasown": "^1.1.2",
    +        "object.values": "^1.1.6",
    +        "prop-types": "^15.8.1",
    +        "resolve": "^2.0.0-next.4",
    +        "semver": "^6.3.1",
    +        "string.prototype.matchall": "^4.0.8"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      },
    +      "peerDependencies": {
    +        "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
    +      }
    +    },
    +    "node_modules/eslint-plugin-react/node_modules/doctrine": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
    +      "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
    +      "dev": true,
    +      "dependencies": {
    +        "esutils": "^2.0.2"
    +      },
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/eslint-plugin-react/node_modules/estraverse": {
    +      "version": "5.3.0",
    +      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
    +      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4.0"
    +      }
    +    },
    +    "node_modules/eslint-plugin-react/node_modules/resolve": {
    +      "version": "2.0.0-next.5",
    +      "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
    +      "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-core-module": "^2.13.0",
    +        "path-parse": "^1.0.7",
    +        "supports-preserve-symlinks-flag": "^1.0.0"
    +      },
    +      "bin": {
    +        "resolve": "bin/resolve"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/eslint-plugin-react/node_modules/semver": {
    +      "version": "6.3.1",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
    +      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
    +      "dev": true,
    +      "bin": {
    +        "semver": "bin/semver.js"
    +      }
    +    },
    +    "node_modules/eslint-rule-docs": {
    +      "version": "1.1.235",
    +      "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.235.tgz",
    +      "integrity": "sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==",
    +      "dev": true
    +    },
    +    "node_modules/eslint-scope": {
    +      "version": "7.2.2",
    +      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
    +      "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
    +      "dev": true,
    +      "dependencies": {
    +        "esrecurse": "^4.3.0",
    +        "estraverse": "^5.2.0"
    +      },
    +      "engines": {
    +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    +      },
    +      "funding": {
    +        "url": "https://opencollective.com/eslint"
    +      }
    +    },
    +    "node_modules/eslint-scope/node_modules/estraverse": {
    +      "version": "5.3.0",
    +      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
    +      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4.0"
    +      }
    +    },
    +    "node_modules/eslint-utils": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
    +      "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
    +      "dev": true,
    +      "dependencies": {
    +        "eslint-visitor-keys": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/mysticatea"
    +      },
    +      "peerDependencies": {
    +        "eslint": ">=5"
    +      }
    +    },
    +    "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
    +      "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/eslint-visitor-keys": {
    +      "version": "3.4.3",
    +      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
    +      "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
    +      "dev": true,
    +      "engines": {
    +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    +      },
    +      "funding": {
    +        "url": "https://opencollective.com/eslint"
    +      }
    +    },
    +    "node_modules/eslint/node_modules/argparse": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
    +      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
    +      "dev": true
    +    },
    +    "node_modules/eslint/node_modules/debug": {
    +      "version": "4.3.4",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
    +      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/eslint/node_modules/find-up": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
    +      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
    +      "dev": true,
    +      "dependencies": {
    +        "locate-path": "^6.0.0",
    +        "path-exists": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/eslint/node_modules/glob-parent": {
    +      "version": "6.0.2",
    +      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
    +      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-glob": "^4.0.3"
    +      },
    +      "engines": {
    +        "node": ">=10.13.0"
    +      }
    +    },
    +    "node_modules/eslint/node_modules/globals": {
    +      "version": "13.23.0",
    +      "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz",
    +      "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==",
    +      "dev": true,
    +      "dependencies": {
    +        "type-fest": "^0.20.2"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/eslint/node_modules/js-yaml": {
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
    +      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
    +      "dev": true,
    +      "dependencies": {
    +        "argparse": "^2.0.1"
    +      },
    +      "bin": {
    +        "js-yaml": "bin/js-yaml.js"
    +      }
    +    },
    +    "node_modules/eslint/node_modules/levn": {
    +      "version": "0.4.1",
    +      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
    +      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "prelude-ls": "^1.2.1",
    +        "type-check": "~0.4.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.8.0"
    +      }
    +    },
    +    "node_modules/eslint/node_modules/locate-path": {
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
    +      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-locate": "^5.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/eslint/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/eslint/node_modules/optionator": {
    +      "version": "0.9.3",
    +      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
    +      "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@aashutoshrathi/word-wrap": "^1.2.3",
    +        "deep-is": "^0.1.3",
    +        "fast-levenshtein": "^2.0.6",
    +        "levn": "^0.4.1",
    +        "prelude-ls": "^1.2.1",
    +        "type-check": "^0.4.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.8.0"
    +      }
    +    },
    +    "node_modules/eslint/node_modules/p-locate": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
    +      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-limit": "^3.0.2"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/eslint/node_modules/prelude-ls": {
    +      "version": "1.2.1",
    +      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
    +      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.8.0"
    +      }
    +    },
    +    "node_modules/eslint/node_modules/type-check": {
    +      "version": "0.4.0",
    +      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
    +      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
    +      "dev": true,
    +      "dependencies": {
    +        "prelude-ls": "^1.2.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.8.0"
    +      }
    +    },
    +    "node_modules/eslint/node_modules/type-fest": {
    +      "version": "0.20.2",
    +      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
    +      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/espree": {
    +      "version": "9.6.1",
    +      "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
    +      "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "acorn": "^8.9.0",
    +        "acorn-jsx": "^5.3.2",
    +        "eslint-visitor-keys": "^3.4.1"
    +      },
    +      "engines": {
    +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    +      },
    +      "funding": {
    +        "url": "https://opencollective.com/eslint"
    +      }
    +    },
    +    "node_modules/esprima": {
    +      "version": "4.0.1",
    +      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
    +      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
    +      "dev": true,
    +      "bin": {
    +        "esparse": "bin/esparse.js",
    +        "esvalidate": "bin/esvalidate.js"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/esquery": {
    +      "version": "1.5.0",
    +      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
    +      "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
    +      "dev": true,
    +      "dependencies": {
    +        "estraverse": "^5.1.0"
    +      },
    +      "engines": {
    +        "node": ">=0.10"
    +      }
    +    },
    +    "node_modules/esquery/node_modules/estraverse": {
    +      "version": "5.3.0",
    +      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
    +      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4.0"
    +      }
    +    },
    +    "node_modules/esrecurse": {
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
    +      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
    +      "dev": true,
    +      "dependencies": {
    +        "estraverse": "^5.2.0"
    +      },
    +      "engines": {
    +        "node": ">=4.0"
    +      }
    +    },
    +    "node_modules/esrecurse/node_modules/estraverse": {
    +      "version": "5.3.0",
    +      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
    +      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4.0"
    +      }
    +    },
    +    "node_modules/estraverse": {
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
    +      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4.0"
    +      }
    +    },
    +    "node_modules/esutils": {
    +      "version": "2.0.3",
    +      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
    +      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/etag": {
    +      "version": "1.8.1",
    +      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
    +      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/event-target-shim": {
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
    +      "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/eventemitter3": {
    +      "version": "3.1.2",
    +      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz",
    +      "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==",
    +      "dev": true
    +    },
    +    "node_modules/events-to-array": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz",
    +      "integrity": "sha512-inRWzRY7nG+aXZxBzEqYKB3HPgwflZRopAjDCHv0whhRx+MTUr1ei0ICZUypdyE0HRm4L2d5VEcIqLD6yl+BFA==",
    +      "dev": true
    +    },
    +    "node_modules/execa": {
    +      "version": "5.1.1",
    +      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
    +      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
    +      "dev": true,
    +      "dependencies": {
    +        "cross-spawn": "^7.0.3",
    +        "get-stream": "^6.0.0",
    +        "human-signals": "^2.1.0",
    +        "is-stream": "^2.0.0",
    +        "merge-stream": "^2.0.0",
    +        "npm-run-path": "^4.0.1",
    +        "onetime": "^5.1.2",
    +        "signal-exit": "^3.0.3",
    +        "strip-final-newline": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sindresorhus/execa?sponsor=1"
    +      }
    +    },
    +    "node_modules/exit": {
    +      "version": "0.1.2",
    +      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
    +      "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.8.0"
    +      }
    +    },
    +    "node_modules/expect": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
    +      "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/expect-utils": "^29.7.0",
    +        "jest-get-type": "^29.6.3",
    +        "jest-matcher-utils": "^29.7.0",
    +        "jest-message-util": "^29.7.0",
    +        "jest-util": "^29.7.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/express": {
    +      "version": "4.18.2",
    +      "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
    +      "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "accepts": "~1.3.8",
    +        "array-flatten": "1.1.1",
    +        "body-parser": "1.20.1",
    +        "content-disposition": "0.5.4",
    +        "content-type": "~1.0.4",
    +        "cookie": "0.5.0",
    +        "cookie-signature": "1.0.6",
    +        "debug": "2.6.9",
    +        "depd": "2.0.0",
    +        "encodeurl": "~1.0.2",
    +        "escape-html": "~1.0.3",
    +        "etag": "~1.8.1",
    +        "finalhandler": "1.2.0",
    +        "fresh": "0.5.2",
    +        "http-errors": "2.0.0",
    +        "merge-descriptors": "1.0.1",
    +        "methods": "~1.1.2",
    +        "on-finished": "2.4.1",
    +        "parseurl": "~1.3.3",
    +        "path-to-regexp": "0.1.7",
    +        "proxy-addr": "~2.0.7",
    +        "qs": "6.11.0",
    +        "range-parser": "~1.2.1",
    +        "safe-buffer": "5.2.1",
    +        "send": "0.18.0",
    +        "serve-static": "1.15.0",
    +        "setprototypeof": "1.2.0",
    +        "statuses": "2.0.1",
    +        "type-is": "~1.6.18",
    +        "utils-merge": "1.0.1",
    +        "vary": "~1.1.2"
    +      },
    +      "engines": {
    +        "node": ">= 0.10.0"
    +      }
    +    },
    +    "node_modules/express/node_modules/body-parser": {
    +      "version": "1.20.1",
    +      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
    +      "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
    +      "dev": true,
    +      "dependencies": {
    +        "bytes": "3.1.2",
    +        "content-type": "~1.0.4",
    +        "debug": "2.6.9",
    +        "depd": "2.0.0",
    +        "destroy": "1.2.0",
    +        "http-errors": "2.0.0",
    +        "iconv-lite": "0.4.24",
    +        "on-finished": "2.4.1",
    +        "qs": "6.11.0",
    +        "raw-body": "2.5.1",
    +        "type-is": "~1.6.18",
    +        "unpipe": "1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.8",
    +        "npm": "1.2.8000 || >= 1.4.16"
    +      }
    +    },
    +    "node_modules/express/node_modules/finalhandler": {
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
    +      "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
    +      "dev": true,
    +      "dependencies": {
    +        "debug": "2.6.9",
    +        "encodeurl": "~1.0.2",
    +        "escape-html": "~1.0.3",
    +        "on-finished": "2.4.1",
    +        "parseurl": "~1.3.3",
    +        "statuses": "2.0.1",
    +        "unpipe": "~1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/express/node_modules/on-finished": {
    +      "version": "2.4.1",
    +      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
    +      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
    +      "dev": true,
    +      "dependencies": {
    +        "ee-first": "1.1.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/express/node_modules/raw-body": {
    +      "version": "2.5.1",
    +      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
    +      "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
    +      "dev": true,
    +      "dependencies": {
    +        "bytes": "3.1.2",
    +        "http-errors": "2.0.0",
    +        "iconv-lite": "0.4.24",
    +        "unpipe": "1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/express/node_modules/statuses": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
    +      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/fast-deep-equal": {
    +      "version": "3.1.3",
    +      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
    +      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
    +      "dev": true
    +    },
    +    "node_modules/fast-glob": {
    +      "version": "3.3.2",
    +      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
    +      "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
    +      "dev": true,
    +      "dependencies": {
    +        "@nodelib/fs.stat": "^2.0.2",
    +        "@nodelib/fs.walk": "^1.2.3",
    +        "glob-parent": "^5.1.2",
    +        "merge2": "^1.3.0",
    +        "micromatch": "^4.0.4"
    +      },
    +      "engines": {
    +        "node": ">=8.6.0"
    +      }
    +    },
    +    "node_modules/fast-json-stable-stringify": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
    +      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
    +      "dev": true
    +    },
    +    "node_modules/fast-levenshtein": {
    +      "version": "2.0.6",
    +      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
    +      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
    +      "dev": true
    +    },
    +    "node_modules/fastq": {
    +      "version": "1.15.0",
    +      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
    +      "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
    +      "dev": true,
    +      "dependencies": {
    +        "reusify": "^1.0.4"
    +      }
    +    },
    +    "node_modules/fb-watchman": {
    +      "version": "2.0.2",
    +      "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
    +      "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
    +      "dev": true,
    +      "dependencies": {
    +        "bser": "2.1.1"
    +      }
    +    },
    +    "node_modules/figlet": {
    +      "version": "1.7.0",
    +      "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.7.0.tgz",
    +      "integrity": "sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg==",
    +      "dev": true,
    +      "bin": {
    +        "figlet": "bin/index.js"
    +      },
    +      "engines": {
    +        "node": ">= 0.4.0"
    +      }
    +    },
    +    "node_modules/file-entry-cache": {
    +      "version": "6.0.1",
    +      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
    +      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
    +      "dev": true,
    +      "dependencies": {
    +        "flat-cache": "^3.0.4"
    +      },
    +      "engines": {
    +        "node": "^10.12.0 || >=12.0.0"
    +      }
    +    },
    +    "node_modules/fill-keys": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz",
    +      "integrity": "sha512-tcgI872xXjwFF4xgQmLxi76GnwJG3g/3isB1l4/G5Z4zrbddGpBjqZCO9oEAcB5wX0Hj/5iQB3toxfO7in1hHA==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-object": "~1.0.1",
    +        "merge-descriptors": "~1.0.0"
    +      },
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/fill-range": {
    +      "version": "7.0.1",
    +      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
    +      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "to-regex-range": "^5.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/finalhandler": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
    +      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
    +      "dev": true,
    +      "dependencies": {
    +        "debug": "2.6.9",
    +        "encodeurl": "~1.0.2",
    +        "escape-html": "~1.0.3",
    +        "on-finished": "~2.3.0",
    +        "parseurl": "~1.3.3",
    +        "statuses": "~1.5.0",
    +        "unpipe": "~1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/find-cache-dir": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
    +      "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "commondir": "^1.0.1",
    +        "make-dir": "^2.0.0",
    +        "pkg-dir": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/find-cache-dir/node_modules/find-up": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
    +      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
    +      "dev": true,
    +      "dependencies": {
    +        "locate-path": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/find-cache-dir/node_modules/locate-path": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
    +      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-locate": "^3.0.0",
    +        "path-exists": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/find-cache-dir/node_modules/make-dir": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
    +      "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
    +      "dev": true,
    +      "dependencies": {
    +        "pify": "^4.0.1",
    +        "semver": "^5.6.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/find-cache-dir/node_modules/p-limit": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
    +      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-try": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/find-cache-dir/node_modules/p-locate": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
    +      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-limit": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/find-cache-dir/node_modules/path-exists": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
    +      "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/find-cache-dir/node_modules/pify": {
    +      "version": "4.0.1",
    +      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
    +      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/find-cache-dir/node_modules/pkg-dir": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
    +      "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
    +      "dev": true,
    +      "dependencies": {
    +        "find-up": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/find-cache-dir/node_modules/semver": {
    +      "version": "5.7.2",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
    +      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
    +      "dev": true,
    +      "bin": {
    +        "semver": "bin/semver"
    +      }
    +    },
    +    "node_modules/find-up": {
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
    +      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
    +      "dev": true,
    +      "dependencies": {
    +        "locate-path": "^5.0.0",
    +        "path-exists": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/findit": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz",
    +      "integrity": "sha512-ENZS237/Hr8bjczn5eKuBohLgaD0JyUd0arxretR1f9RO46vZHA1b2y0VorgGV3WaOT3c+78P8h7v4JGJ1i/rg==",
    +      "dev": true
    +    },
    +    "node_modules/flat": {
    +      "version": "5.0.2",
    +      "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
    +      "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
    +      "dev": true,
    +      "bin": {
    +        "flat": "cli.js"
    +      }
    +    },
    +    "node_modules/flat-cache": {
    +      "version": "3.2.0",
    +      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
    +      "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
    +      "dev": true,
    +      "dependencies": {
    +        "flatted": "^3.2.9",
    +        "keyv": "^4.5.3",
    +        "rimraf": "^3.0.2"
    +      },
    +      "engines": {
    +        "node": "^10.12.0 || >=12.0.0"
    +      }
    +    },
    +    "node_modules/flat-cache/node_modules/rimraf": {
    +      "version": "3.0.2",
    +      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
    +      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
    +      "dev": true,
    +      "dependencies": {
    +        "glob": "^7.1.3"
    +      },
    +      "bin": {
    +        "rimraf": "bin.js"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/isaacs"
    +      }
    +    },
    +    "node_modules/flatted": {
    +      "version": "3.2.9",
    +      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
    +      "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
    +      "dev": true
    +    },
    +    "node_modules/follow-redirects": {
    +      "version": "1.15.3",
    +      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz",
    +      "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "individual",
    +          "url": "https://github.com/sponsors/RubenVerborgh"
    +        }
    +      ],
    +      "engines": {
    +        "node": ">=4.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "debug": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/for-each": {
    +      "version": "0.3.3",
    +      "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
    +      "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-callable": "^1.1.3"
    +      }
    +    },
    +    "node_modules/foreground-child": {
    +      "version": "1.5.6",
    +      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz",
    +      "integrity": "sha512-3TOY+4TKV0Ml83PXJQY+JFQaHNV38lzQDIzzXYg1kWdBLenGgoZhAs0CKgzI31vi2pWEpQMq/Yi4bpKwCPkw7g==",
    +      "dev": true,
    +      "dependencies": {
    +        "cross-spawn": "^4",
    +        "signal-exit": "^3.0.0"
    +      }
    +    },
    +    "node_modules/foreground-child/node_modules/cross-spawn": {
    +      "version": "4.0.2",
    +      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz",
    +      "integrity": "sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==",
    +      "dev": true,
    +      "dependencies": {
    +        "lru-cache": "^4.0.1",
    +        "which": "^1.2.9"
    +      }
    +    },
    +    "node_modules/foreground-child/node_modules/lru-cache": {
    +      "version": "4.1.5",
    +      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
    +      "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
    +      "dev": true,
    +      "dependencies": {
    +        "pseudomap": "^1.0.2",
    +        "yallist": "^2.1.2"
    +      }
    +    },
    +    "node_modules/foreground-child/node_modules/which": {
    +      "version": "1.3.1",
    +      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
    +      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "isexe": "^2.0.0"
    +      },
    +      "bin": {
    +        "which": "bin/which"
    +      }
    +    },
    +    "node_modules/foreground-child/node_modules/yallist": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
    +      "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
    +      "dev": true
    +    },
    +    "node_modules/form-data": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
    +      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
    +      "dev": true,
    +      "dependencies": {
    +        "asynckit": "^0.4.0",
    +        "combined-stream": "^1.0.8",
    +        "mime-types": "^2.1.12"
    +      },
    +      "engines": {
    +        "node": ">= 6"
    +      }
    +    },
    +    "node_modules/formdata-node": {
    +      "version": "6.0.3",
    +      "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-6.0.3.tgz",
    +      "integrity": "sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 18"
    +      }
    +    },
    +    "node_modules/forwarded": {
    +      "version": "0.2.0",
    +      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
    +      "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/fresh": {
    +      "version": "0.5.2",
    +      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
    +      "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/fromentries": {
    +      "version": "1.3.2",
    +      "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz",
    +      "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/feross"
    +        },
    +        {
    +          "type": "patreon",
    +          "url": "https://www.patreon.com/feross"
    +        },
    +        {
    +          "type": "consulting",
    +          "url": "https://feross.org/support"
    +        }
    +      ]
    +    },
    +    "node_modules/fs-exists-cached": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz",
    +      "integrity": "sha512-kSxoARUDn4F2RPXX48UXnaFKwVU7Ivd/6qpzZL29MCDmr9sTvybv4gFCp+qaI4fM9m0z9fgz/yJvi56GAz+BZg==",
    +      "dev": true
    +    },
    +    "node_modules/fs-extra": {
    +      "version": "8.1.0",
    +      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
    +      "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
    +      "dev": true,
    +      "dependencies": {
    +        "graceful-fs": "^4.2.0",
    +        "jsonfile": "^4.0.0",
    +        "universalify": "^0.1.0"
    +      },
    +      "engines": {
    +        "node": ">=6 <7 || >=8"
    +      }
    +    },
    +    "node_modules/fs.realpath": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
    +      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
    +      "dev": true
    +    },
    +    "node_modules/fsevents": {
    +      "version": "2.3.3",
    +      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
    +      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
    +      "dev": true,
    +      "hasInstallScript": true,
    +      "optional": true,
    +      "os": [
    +        "darwin"
    +      ],
    +      "engines": {
    +        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
    +      }
    +    },
    +    "node_modules/function-bind": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
    +      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
    +      "dev": true,
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/function-loop": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-2.0.1.tgz",
    +      "integrity": "sha512-ktIR+O6i/4h+j/ZhZJNdzeI4i9lEPeEK6UPR2EVyTVBqOwcU3Za9xYKLH64ZR9HmcROyRrOkizNyjjtWJzDDkQ==",
    +      "dev": true
    +    },
    +    "node_modules/function.prototype.name": {
    +      "version": "1.1.6",
    +      "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
    +      "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.2.0",
    +        "es-abstract": "^1.22.1",
    +        "functions-have-names": "^1.2.3"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/functions-have-names": {
    +      "version": "1.2.3",
    +      "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
    +      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
    +      "dev": true,
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/gensync": {
    +      "version": "1.0.0-beta.2",
    +      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
    +      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/get-caller-file": {
    +      "version": "2.0.5",
    +      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
    +      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
    +      "dev": true,
    +      "engines": {
    +        "node": "6.* || 8.* || >= 10.*"
    +      }
    +    },
    +    "node_modules/get-func-name": {
    +      "version": "2.0.2",
    +      "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
    +      "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": "*"
    +      }
    +    },
    +    "node_modules/get-intrinsic": {
    +      "version": "1.2.2",
    +      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
    +      "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
    +      "dev": true,
    +      "dependencies": {
    +        "function-bind": "^1.1.2",
    +        "has-proto": "^1.0.1",
    +        "has-symbols": "^1.0.3",
    +        "hasown": "^2.0.0"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/get-package-type": {
    +      "version": "0.1.0",
    +      "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
    +      "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8.0.0"
    +      }
    +    },
    +    "node_modules/get-port": {
    +      "version": "5.1.1",
    +      "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz",
    +      "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/get-stdin": {
    +      "version": "8.0.0",
    +      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
    +      "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/get-stream": {
    +      "version": "6.0.1",
    +      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
    +      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/get-symbol-description": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
    +      "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "get-intrinsic": "^1.1.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/get-uri": {
    +      "version": "6.0.2",
    +      "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.2.tgz",
    +      "integrity": "sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw==",
    +      "dev": true,
    +      "dependencies": {
    +        "basic-ftp": "^5.0.2",
    +        "data-uri-to-buffer": "^6.0.0",
    +        "debug": "^4.3.4",
    +        "fs-extra": "^8.1.0"
    +      },
    +      "engines": {
    +        "node": ">= 14"
    +      }
    +    },
    +    "node_modules/get-uri/node_modules/debug": {
    +      "version": "4.3.4",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
    +      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/get-uri/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/glob": {
    +      "version": "7.2.3",
    +      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
    +      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "fs.realpath": "^1.0.0",
    +        "inflight": "^1.0.4",
    +        "inherits": "2",
    +        "minimatch": "^3.1.1",
    +        "once": "^1.3.0",
    +        "path-is-absolute": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": "*"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/isaacs"
    +      }
    +    },
    +    "node_modules/glob-parent": {
    +      "version": "5.1.2",
    +      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
    +      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-glob": "^4.0.1"
    +      },
    +      "engines": {
    +        "node": ">= 6"
    +      }
    +    },
    +    "node_modules/global-dirs": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz",
    +      "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ini": "1.3.7"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/globals": {
    +      "version": "11.12.0",
    +      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
    +      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/globalthis": {
    +      "version": "1.0.3",
    +      "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
    +      "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
    +      "dev": true,
    +      "dependencies": {
    +        "define-properties": "^1.1.3"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/globby": {
    +      "version": "11.1.0",
    +      "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
    +      "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
    +      "dev": true,
    +      "dependencies": {
    +        "array-union": "^2.1.0",
    +        "dir-glob": "^3.0.1",
    +        "fast-glob": "^3.2.9",
    +        "ignore": "^5.2.0",
    +        "merge2": "^1.4.1",
    +        "slash": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/gopd": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
    +      "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
    +      "dev": true,
    +      "dependencies": {
    +        "get-intrinsic": "^1.1.3"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/got": {
    +      "version": "9.6.0",
    +      "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
    +      "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "@sindresorhus/is": "^0.14.0",
    +        "@szmarczak/http-timer": "^1.1.2",
    +        "cacheable-request": "^6.0.0",
    +        "decompress-response": "^3.3.0",
    +        "duplexer3": "^0.1.4",
    +        "get-stream": "^4.1.0",
    +        "lowercase-keys": "^1.0.1",
    +        "mimic-response": "^1.0.1",
    +        "p-cancelable": "^1.0.0",
    +        "to-readable-stream": "^1.0.0",
    +        "url-parse-lax": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8.6"
    +      }
    +    },
    +    "node_modules/got/node_modules/get-stream": {
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
    +      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
    +      "dev": true,
    +      "dependencies": {
    +        "pump": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/graceful-fs": {
    +      "version": "4.2.11",
    +      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
    +      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
    +      "dev": true
    +    },
    +    "node_modules/graphemer": {
    +      "version": "1.4.0",
    +      "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
    +      "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
    +      "dev": true
    +    },
    +    "node_modules/graphql": {
    +      "version": "15.8.0",
    +      "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz",
    +      "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 10.x"
    +      }
    +    },
    +    "node_modules/graphql-http": {
    +      "version": "1.22.0",
    +      "resolved": "https://registry.npmjs.org/graphql-http/-/graphql-http-1.22.0.tgz",
    +      "integrity": "sha512-9RBUlGJWBFqz9LwfpmAbjJL/8j/HCNkZwPBU5+Bfmwez+1Ay43DocMNQYpIWsWqH0Ftv6PTNAh2aRnnMCBJgLw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=12"
    +      },
    +      "peerDependencies": {
    +        "graphql": ">=0.11 <=16"
    +      }
    +    },
    +    "node_modules/graphql-subscriptions": {
    +      "version": "1.2.1",
    +      "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.2.1.tgz",
    +      "integrity": "sha512-95yD/tKi24q8xYa7Q9rhQN16AYj5wPbrb8tmHGM3WRc9EBmWrG/0kkMl+tQG8wcEuE9ibR4zyOM31p5Sdr2v4g==",
    +      "dev": true,
    +      "dependencies": {
    +        "iterall": "^1.3.0"
    +      },
    +      "peerDependencies": {
    +        "graphql": "^0.10.5 || ^0.11.3 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0"
    +      }
    +    },
    +    "node_modules/graphql-tag": {
    +      "version": "2.12.6",
    +      "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz",
    +      "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==",
    +      "dev": true,
    +      "dependencies": {
    +        "tslib": "^2.1.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "peerDependencies": {
    +        "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0"
    +      }
    +    },
    +    "node_modules/hard-rejection": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
    +      "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/has-ansi": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
    +      "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-regex": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/has-ansi/node_modules/ansi-regex": {
    +      "version": "2.1.1",
    +      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
    +      "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/has-bigints": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
    +      "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
    +      "dev": true,
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/has-flag": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
    +      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/has-property-descriptors": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
    +      "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
    +      "dev": true,
    +      "dependencies": {
    +        "get-intrinsic": "^1.2.2"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/has-proto": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
    +      "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/has-symbols": {
    +      "version": "1.0.3",
    +      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
    +      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/has-tostringtag": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
    +      "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-symbols": "^1.0.2"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/has-yarn": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
    +      "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/hasha": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz",
    +      "integrity": "sha512-w0Kz8lJFBoyaurBiNrIvxPqr/gJ6fOfSkpAPOepN3oECqGJag37xPbOv57izi/KP8auHgNYxn5fXtAb+1LsJ6w==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-stream": "^1.0.1"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/hasha/node_modules/is-stream": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
    +      "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/hasown": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
    +      "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
    +      "dev": true,
    +      "dependencies": {
    +        "function-bind": "^1.1.2"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      }
    +    },
    +    "node_modules/hdr-histogram-js": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-3.0.0.tgz",
    +      "integrity": "sha512-/EpvQI2/Z98mNFYEnlqJ8Ogful8OpArLG/6Tf2bPnkutBVLIeMVNHjk1ZDfshF2BUweipzbk+dB1hgSB7SIakw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@assemblyscript/loader": "^0.19.21",
    +        "base64-js": "^1.2.0",
    +        "pako": "^1.0.3"
    +      },
    +      "engines": {
    +        "node": ">=14"
    +      }
    +    },
    +    "node_modules/he": {
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
    +      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
    +      "dev": true,
    +      "bin": {
    +        "he": "bin/he"
    +      }
    +    },
    +    "node_modules/hosted-git-info": {
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
    +      "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
    +      "dev": true,
    +      "dependencies": {
    +        "lru-cache": "^6.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/hosted-git-info/node_modules/lru-cache": {
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
    +      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
    +      "dev": true,
    +      "dependencies": {
    +        "yallist": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/hosted-git-info/node_modules/yallist": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
    +      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
    +      "dev": true
    +    },
    +    "node_modules/html-encoding-sniffer": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz",
    +      "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "whatwg-encoding": "^3.1.1"
    +      },
    +      "engines": {
    +        "node": ">=18"
    +      }
    +    },
    +    "node_modules/html-escaper": {
    +      "version": "2.0.2",
    +      "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
    +      "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
    +      "dev": true
    +    },
    +    "node_modules/http-cache-semantics": {
    +      "version": "4.1.1",
    +      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
    +      "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
    +      "dev": true
    +    },
    +    "node_modules/http-encoding": {
    +      "version": "1.5.1",
    +      "resolved": "https://registry.npmjs.org/http-encoding/-/http-encoding-1.5.1.tgz",
    +      "integrity": "sha512-2m4JnG1Z5RX5pRMdccyp6rX1jVo4LO+ussQzWdwR4AmrWhtX0KP1NyslVAFAspQwMxt2P00CCWXIBKj7ILZLpQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "brotli-wasm": "^1.1.0",
    +        "pify": "^5.0.0",
    +        "zstd-codec": "^0.1.4"
    +      }
    +    },
    +    "node_modules/http-errors": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
    +      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "depd": "2.0.0",
    +        "inherits": "2.0.4",
    +        "setprototypeof": "1.2.0",
    +        "statuses": "2.0.1",
    +        "toidentifier": "1.0.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/http-errors/node_modules/statuses": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
    +      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/http-proxy-agent": {
    +      "version": "7.0.0",
    +      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz",
    +      "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "agent-base": "^7.1.0",
    +        "debug": "^4.3.4"
    +      },
    +      "engines": {
    +        "node": ">= 14"
    +      }
    +    },
    +    "node_modules/http-proxy-agent/node_modules/debug": {
    +      "version": "4.3.4",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
    +      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/http-proxy-agent/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/http2-wrapper": {
    +      "version": "2.2.1",
    +      "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz",
    +      "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "quick-lru": "^5.1.1",
    +        "resolve-alpn": "^1.2.0"
    +      },
    +      "engines": {
    +        "node": ">=10.19.0"
    +      }
    +    },
    +    "node_modules/https-pem": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/https-pem/-/https-pem-3.0.0.tgz",
    +      "integrity": "sha512-JqYVRTpk1WeXziwBaTX6eyXod6Dt70d/kehtY3DR6ygl+11XgcksTjSl4NjZbNCKK3rpTB1qH9hnu75RSOFUWQ==",
    +      "dev": true,
    +      "hasInstallScript": true,
    +      "dependencies": {
    +        "selfsigned": "^2.0.1"
    +      }
    +    },
    +    "node_modules/https-proxy-agent": {
    +      "version": "7.0.2",
    +      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
    +      "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==",
    +      "dev": true,
    +      "dependencies": {
    +        "agent-base": "^7.0.2",
    +        "debug": "4"
    +      },
    +      "engines": {
    +        "node": ">= 14"
    +      }
    +    },
    +    "node_modules/https-proxy-agent/node_modules/debug": {
    +      "version": "4.3.4",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
    +      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/https-proxy-agent/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/human-signals": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
    +      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10.17.0"
    +      }
    +    },
    +    "node_modules/husky": {
    +      "version": "8.0.3",
    +      "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz",
    +      "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==",
    +      "dev": true,
    +      "bin": {
    +        "husky": "lib/bin.js"
    +      },
    +      "engines": {
    +        "node": ">=14"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/typicode"
    +      }
    +    },
    +    "node_modules/iconv-lite": {
    +      "version": "0.4.24",
    +      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
    +      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
    +      "dev": true,
    +      "dependencies": {
    +        "safer-buffer": ">= 2.1.2 < 3"
    +      },
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/ignore": {
    +      "version": "5.3.0",
    +      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz",
    +      "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 4"
    +      }
    +    },
    +    "node_modules/import-fresh": {
    +      "version": "3.3.0",
    +      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
    +      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
    +      "dev": true,
    +      "dependencies": {
    +        "parent-module": "^1.0.0",
    +        "resolve-from": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/import-lazy": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
    +      "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/import-local": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
    +      "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
    +      "dev": true,
    +      "dependencies": {
    +        "pkg-dir": "^4.2.0",
    +        "resolve-cwd": "^3.0.0"
    +      },
    +      "bin": {
    +        "import-local-fixture": "fixtures/cli.js"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/imurmurhash": {
    +      "version": "0.1.4",
    +      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
    +      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.8.19"
    +      }
    +    },
    +    "node_modules/indent-string": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
    +      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/inflight": {
    +      "version": "1.0.6",
    +      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
    +      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
    +      "dev": true,
    +      "dependencies": {
    +        "once": "^1.3.0",
    +        "wrappy": "1"
    +      }
    +    },
    +    "node_modules/inherits": {
    +      "version": "2.0.4",
    +      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
    +      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
    +      "dev": true
    +    },
    +    "node_modules/ini": {
    +      "version": "1.3.7",
    +      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz",
    +      "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==",
    +      "dev": true
    +    },
    +    "node_modules/internal-slot": {
    +      "version": "1.0.6",
    +      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz",
    +      "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==",
    +      "dev": true,
    +      "dependencies": {
    +        "get-intrinsic": "^1.2.2",
    +        "hasown": "^2.0.0",
    +        "side-channel": "^1.0.4"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      }
    +    },
    +    "node_modules/inversify": {
    +      "version": "5.1.1",
    +      "resolved": "https://registry.npmjs.org/inversify/-/inversify-5.1.1.tgz",
    +      "integrity": "sha512-j8grHGDzv1v+8T1sAQ+3boTCntFPfvxLCkNcxB1J8qA0lUN+fAlSyYd+RXKvaPRL4AGyPxViutBEJHNXOyUdFQ==",
    +      "dev": true
    +    },
    +    "node_modules/ip": {
    +      "version": "1.1.8",
    +      "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
    +      "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==",
    +      "dev": true
    +    },
    +    "node_modules/ipaddr.js": {
    +      "version": "1.9.1",
    +      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
    +      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.10"
    +      }
    +    },
    +    "node_modules/irregular-plurals": {
    +      "version": "3.5.0",
    +      "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz",
    +      "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/is-arguments": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
    +      "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "has-tostringtag": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-array-buffer": {
    +      "version": "3.0.2",
    +      "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
    +      "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "get-intrinsic": "^1.2.0",
    +        "is-typed-array": "^1.1.10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-arrayish": {
    +      "version": "0.2.1",
    +      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
    +      "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
    +      "dev": true
    +    },
    +    "node_modules/is-async-function": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
    +      "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-tostringtag": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-bigint": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
    +      "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-bigints": "^1.0.1"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-binary-path": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
    +      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
    +      "dev": true,
    +      "dependencies": {
    +        "binary-extensions": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/is-boolean-object": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
    +      "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "has-tostringtag": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-callable": {
    +      "version": "1.2.7",
    +      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
    +      "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-ci": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
    +      "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
    +      "dev": true,
    +      "dependencies": {
    +        "ci-info": "^2.0.0"
    +      },
    +      "bin": {
    +        "is-ci": "bin.js"
    +      }
    +    },
    +    "node_modules/is-ci/node_modules/ci-info": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
    +      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
    +      "dev": true
    +    },
    +    "node_modules/is-core-module": {
    +      "version": "2.13.1",
    +      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
    +      "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
    +      "dev": true,
    +      "dependencies": {
    +        "hasown": "^2.0.0"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-date-object": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
    +      "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-tostringtag": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-extglob": {
    +      "version": "2.1.1",
    +      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
    +      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/is-finalizationregistry": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz",
    +      "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-fullwidth-code-point": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
    +      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/is-generator-fn": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
    +      "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/is-generator-function": {
    +      "version": "1.0.10",
    +      "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
    +      "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-tostringtag": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-glob": {
    +      "version": "4.0.3",
    +      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
    +      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-extglob": "^2.1.1"
    +      },
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/is-installed-globally": {
    +      "version": "0.3.2",
    +      "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz",
    +      "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==",
    +      "dev": true,
    +      "dependencies": {
    +        "global-dirs": "^2.0.1",
    +        "is-path-inside": "^3.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/is-map": {
    +      "version": "2.0.2",
    +      "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
    +      "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
    +      "dev": true,
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-negative-zero": {
    +      "version": "2.0.2",
    +      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
    +      "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-npm": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz",
    +      "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/is-number": {
    +      "version": "7.0.0",
    +      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
    +      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.12.0"
    +      }
    +    },
    +    "node_modules/is-number-object": {
    +      "version": "1.0.7",
    +      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
    +      "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-tostringtag": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-obj": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
    +      "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/is-object": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz",
    +      "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==",
    +      "dev": true,
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-path-inside": {
    +      "version": "3.0.3",
    +      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
    +      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/is-plain-obj": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
    +      "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/is-potential-custom-element-name": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
    +      "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
    +      "dev": true
    +    },
    +    "node_modules/is-regex": {
    +      "version": "1.1.4",
    +      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
    +      "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "has-tostringtag": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-set": {
    +      "version": "2.0.2",
    +      "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
    +      "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
    +      "dev": true,
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-shared-array-buffer": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
    +      "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-stream": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
    +      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/is-string": {
    +      "version": "1.0.7",
    +      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
    +      "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-tostringtag": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-symbol": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
    +      "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-symbols": "^1.0.2"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-typed-array": {
    +      "version": "1.1.12",
    +      "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz",
    +      "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==",
    +      "dev": true,
    +      "dependencies": {
    +        "which-typed-array": "^1.1.11"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-typedarray": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
    +      "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
    +      "dev": true
    +    },
    +    "node_modules/is-unicode-supported": {
    +      "version": "0.1.0",
    +      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
    +      "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/is-weakmap": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
    +      "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
    +      "dev": true,
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-weakref": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
    +      "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-weakset": {
    +      "version": "2.0.2",
    +      "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
    +      "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "get-intrinsic": "^1.1.1"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/is-windows": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
    +      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/is-wsl": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
    +      "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/is-yarn-global": {
    +      "version": "0.3.0",
    +      "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
    +      "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
    +      "dev": true
    +    },
    +    "node_modules/isarray": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
    +      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
    +      "dev": true
    +    },
    +    "node_modules/isexe": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
    +      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
    +      "dev": true
    +    },
    +    "node_modules/isomorphic-ws": {
    +      "version": "4.0.1",
    +      "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz",
    +      "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==",
    +      "dev": true,
    +      "peerDependencies": {
    +        "ws": "*"
    +      }
    +    },
    +    "node_modules/istanbul-lib-coverage": {
    +      "version": "3.2.2",
    +      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
    +      "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/istanbul-lib-hook": {
    +      "version": "2.0.7",
    +      "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz",
    +      "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==",
    +      "dev": true,
    +      "dependencies": {
    +        "append-transform": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/istanbul-lib-instrument": {
    +      "version": "6.0.1",
    +      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz",
    +      "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/core": "^7.12.3",
    +        "@babel/parser": "^7.14.7",
    +        "@istanbuljs/schema": "^0.1.2",
    +        "istanbul-lib-coverage": "^3.2.0",
    +        "semver": "^7.5.4"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/istanbul-lib-processinfo": {
    +      "version": "2.0.3",
    +      "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz",
    +      "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==",
    +      "dev": true,
    +      "dependencies": {
    +        "archy": "^1.0.0",
    +        "cross-spawn": "^7.0.3",
    +        "istanbul-lib-coverage": "^3.2.0",
    +        "p-map": "^3.0.0",
    +        "rimraf": "^3.0.0",
    +        "uuid": "^8.3.2"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/istanbul-lib-processinfo/node_modules/rimraf": {
    +      "version": "3.0.2",
    +      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
    +      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
    +      "dev": true,
    +      "dependencies": {
    +        "glob": "^7.1.3"
    +      },
    +      "bin": {
    +        "rimraf": "bin.js"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/isaacs"
    +      }
    +    },
    +    "node_modules/istanbul-lib-report": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
    +      "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
    +      "dev": true,
    +      "dependencies": {
    +        "istanbul-lib-coverage": "^3.0.0",
    +        "make-dir": "^4.0.0",
    +        "supports-color": "^7.1.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/istanbul-lib-report/node_modules/make-dir": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
    +      "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
    +      "dev": true,
    +      "dependencies": {
    +        "semver": "^7.5.3"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/istanbul-lib-report/node_modules/supports-color": {
    +      "version": "7.2.0",
    +      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
    +      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-flag": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/istanbul-lib-source-maps": {
    +      "version": "4.0.1",
    +      "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
    +      "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
    +      "dev": true,
    +      "dependencies": {
    +        "debug": "^4.1.1",
    +        "istanbul-lib-coverage": "^3.0.0",
    +        "source-map": "^0.6.1"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/istanbul-lib-source-maps/node_modules/debug": {
    +      "version": "4.3.4",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
    +      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/istanbul-lib-source-maps/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/istanbul-reports": {
    +      "version": "3.1.6",
    +      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz",
    +      "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==",
    +      "dev": true,
    +      "dependencies": {
    +        "html-escaper": "^2.0.0",
    +        "istanbul-lib-report": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/iterall": {
    +      "version": "1.3.0",
    +      "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz",
    +      "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==",
    +      "dev": true
    +    },
    +    "node_modules/iterator.prototype": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz",
    +      "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==",
    +      "dev": true,
    +      "dependencies": {
    +        "define-properties": "^1.2.1",
    +        "get-intrinsic": "^1.2.1",
    +        "has-symbols": "^1.0.3",
    +        "reflect.getprototypeof": "^1.0.4",
    +        "set-function-name": "^2.0.1"
    +      }
    +    },
    +    "node_modules/jackspeak": {
    +      "version": "1.4.2",
    +      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-1.4.2.tgz",
    +      "integrity": "sha512-GHeGTmnuaHnvS+ZctRB01bfxARuu9wW83ENbuiweu07SFcVlZrJpcshSre/keGT7YGBhLHg/+rXCNSrsEHKU4Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "cliui": "^7.0.4"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/jest": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz",
    +      "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/core": "^29.7.0",
    +        "@jest/types": "^29.6.3",
    +        "import-local": "^3.0.2",
    +        "jest-cli": "^29.7.0"
    +      },
    +      "bin": {
    +        "jest": "bin/jest.js"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      },
    +      "peerDependencies": {
    +        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "node-notifier": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/jest-changed-files": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz",
    +      "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==",
    +      "dev": true,
    +      "dependencies": {
    +        "execa": "^5.0.0",
    +        "jest-util": "^29.7.0",
    +        "p-limit": "^3.1.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/jest-circus": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz",
    +      "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/environment": "^29.7.0",
    +        "@jest/expect": "^29.7.0",
    +        "@jest/test-result": "^29.7.0",
    +        "@jest/types": "^29.6.3",
    +        "@types/node": "*",
    +        "chalk": "^4.0.0",
    +        "co": "^4.6.0",
    +        "dedent": "^1.0.0",
    +        "is-generator-fn": "^2.0.0",
    +        "jest-each": "^29.7.0",
    +        "jest-matcher-utils": "^29.7.0",
    +        "jest-message-util": "^29.7.0",
    +        "jest-runtime": "^29.7.0",
    +        "jest-snapshot": "^29.7.0",
    +        "jest-util": "^29.7.0",
    +        "p-limit": "^3.1.0",
    +        "pretty-format": "^29.7.0",
    +        "pure-rand": "^6.0.0",
    +        "slash": "^3.0.0",
    +        "stack-utils": "^2.0.3"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/jest-cli": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz",
    +      "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/core": "^29.7.0",
    +        "@jest/test-result": "^29.7.0",
    +        "@jest/types": "^29.6.3",
    +        "chalk": "^4.0.0",
    +        "create-jest": "^29.7.0",
    +        "exit": "^0.1.2",
    +        "import-local": "^3.0.2",
    +        "jest-config": "^29.7.0",
    +        "jest-util": "^29.7.0",
    +        "jest-validate": "^29.7.0",
    +        "yargs": "^17.3.1"
    +      },
    +      "bin": {
    +        "jest": "bin/jest.js"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      },
    +      "peerDependencies": {
    +        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "node-notifier": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/jest-config": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz",
    +      "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/core": "^7.11.6",
    +        "@jest/test-sequencer": "^29.7.0",
    +        "@jest/types": "^29.6.3",
    +        "babel-jest": "^29.7.0",
    +        "chalk": "^4.0.0",
    +        "ci-info": "^3.2.0",
    +        "deepmerge": "^4.2.2",
    +        "glob": "^7.1.3",
    +        "graceful-fs": "^4.2.9",
    +        "jest-circus": "^29.7.0",
    +        "jest-environment-node": "^29.7.0",
    +        "jest-get-type": "^29.6.3",
    +        "jest-regex-util": "^29.6.3",
    +        "jest-resolve": "^29.7.0",
    +        "jest-runner": "^29.7.0",
    +        "jest-util": "^29.7.0",
    +        "jest-validate": "^29.7.0",
    +        "micromatch": "^4.0.4",
    +        "parse-json": "^5.2.0",
    +        "pretty-format": "^29.7.0",
    +        "slash": "^3.0.0",
    +        "strip-json-comments": "^3.1.1"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      },
    +      "peerDependencies": {
    +        "@types/node": "*",
    +        "ts-node": ">=9.0.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "@types/node": {
    +          "optional": true
    +        },
    +        "ts-node": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/jest-diff": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
    +      "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
    +      "dev": true,
    +      "dependencies": {
    +        "chalk": "^4.0.0",
    +        "diff-sequences": "^29.6.3",
    +        "jest-get-type": "^29.6.3",
    +        "pretty-format": "^29.7.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/jest-docblock": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz",
    +      "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==",
    +      "dev": true,
    +      "dependencies": {
    +        "detect-newline": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/jest-each": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz",
    +      "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/types": "^29.6.3",
    +        "chalk": "^4.0.0",
    +        "jest-get-type": "^29.6.3",
    +        "jest-util": "^29.7.0",
    +        "pretty-format": "^29.7.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/jest-environment-node": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz",
    +      "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/environment": "^29.7.0",
    +        "@jest/fake-timers": "^29.7.0",
    +        "@jest/types": "^29.6.3",
    +        "@types/node": "*",
    +        "jest-mock": "^29.7.0",
    +        "jest-util": "^29.7.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/jest-get-type": {
    +      "version": "29.6.3",
    +      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
    +      "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
    +      "dev": true,
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/jest-haste-map": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz",
    +      "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/types": "^29.6.3",
    +        "@types/graceful-fs": "^4.1.3",
    +        "@types/node": "*",
    +        "anymatch": "^3.0.3",
    +        "fb-watchman": "^2.0.0",
    +        "graceful-fs": "^4.2.9",
    +        "jest-regex-util": "^29.6.3",
    +        "jest-util": "^29.7.0",
    +        "jest-worker": "^29.7.0",
    +        "micromatch": "^4.0.4",
    +        "walker": "^1.0.8"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      },
    +      "optionalDependencies": {
    +        "fsevents": "^2.3.2"
    +      }
    +    },
    +    "node_modules/jest-leak-detector": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz",
    +      "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==",
    +      "dev": true,
    +      "dependencies": {
    +        "jest-get-type": "^29.6.3",
    +        "pretty-format": "^29.7.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/jest-matcher-utils": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz",
    +      "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==",
    +      "dev": true,
    +      "dependencies": {
    +        "chalk": "^4.0.0",
    +        "jest-diff": "^29.7.0",
    +        "jest-get-type": "^29.6.3",
    +        "pretty-format": "^29.7.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/jest-message-util": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
    +      "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/code-frame": "^7.12.13",
    +        "@jest/types": "^29.6.3",
    +        "@types/stack-utils": "^2.0.0",
    +        "chalk": "^4.0.0",
    +        "graceful-fs": "^4.2.9",
    +        "micromatch": "^4.0.4",
    +        "pretty-format": "^29.7.0",
    +        "slash": "^3.0.0",
    +        "stack-utils": "^2.0.3"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/jest-mock": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
    +      "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/types": "^29.6.3",
    +        "@types/node": "*",
    +        "jest-util": "^29.7.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/jest-pnp-resolver": {
    +      "version": "1.2.3",
    +      "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
    +      "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      },
    +      "peerDependencies": {
    +        "jest-resolve": "*"
    +      },
    +      "peerDependenciesMeta": {
    +        "jest-resolve": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/jest-regex-util": {
    +      "version": "29.6.3",
    +      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz",
    +      "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==",
    +      "dev": true,
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/jest-resolve": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz",
    +      "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==",
    +      "dev": true,
    +      "dependencies": {
    +        "chalk": "^4.0.0",
    +        "graceful-fs": "^4.2.9",
    +        "jest-haste-map": "^29.7.0",
    +        "jest-pnp-resolver": "^1.2.2",
    +        "jest-util": "^29.7.0",
    +        "jest-validate": "^29.7.0",
    +        "resolve": "^1.20.0",
    +        "resolve.exports": "^2.0.0",
    +        "slash": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/jest-resolve-dependencies": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz",
    +      "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==",
    +      "dev": true,
    +      "dependencies": {
    +        "jest-regex-util": "^29.6.3",
    +        "jest-snapshot": "^29.7.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/jest-runner": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz",
    +      "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/console": "^29.7.0",
    +        "@jest/environment": "^29.7.0",
    +        "@jest/test-result": "^29.7.0",
    +        "@jest/transform": "^29.7.0",
    +        "@jest/types": "^29.6.3",
    +        "@types/node": "*",
    +        "chalk": "^4.0.0",
    +        "emittery": "^0.13.1",
    +        "graceful-fs": "^4.2.9",
    +        "jest-docblock": "^29.7.0",
    +        "jest-environment-node": "^29.7.0",
    +        "jest-haste-map": "^29.7.0",
    +        "jest-leak-detector": "^29.7.0",
    +        "jest-message-util": "^29.7.0",
    +        "jest-resolve": "^29.7.0",
    +        "jest-runtime": "^29.7.0",
    +        "jest-util": "^29.7.0",
    +        "jest-watcher": "^29.7.0",
    +        "jest-worker": "^29.7.0",
    +        "p-limit": "^3.1.0",
    +        "source-map-support": "0.5.13"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/jest-runtime": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz",
    +      "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/environment": "^29.7.0",
    +        "@jest/fake-timers": "^29.7.0",
    +        "@jest/globals": "^29.7.0",
    +        "@jest/source-map": "^29.6.3",
    +        "@jest/test-result": "^29.7.0",
    +        "@jest/transform": "^29.7.0",
    +        "@jest/types": "^29.6.3",
    +        "@types/node": "*",
    +        "chalk": "^4.0.0",
    +        "cjs-module-lexer": "^1.0.0",
    +        "collect-v8-coverage": "^1.0.0",
    +        "glob": "^7.1.3",
    +        "graceful-fs": "^4.2.9",
    +        "jest-haste-map": "^29.7.0",
    +        "jest-message-util": "^29.7.0",
    +        "jest-mock": "^29.7.0",
    +        "jest-regex-util": "^29.6.3",
    +        "jest-resolve": "^29.7.0",
    +        "jest-snapshot": "^29.7.0",
    +        "jest-util": "^29.7.0",
    +        "slash": "^3.0.0",
    +        "strip-bom": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/jest-snapshot": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz",
    +      "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/core": "^7.11.6",
    +        "@babel/generator": "^7.7.2",
    +        "@babel/plugin-syntax-jsx": "^7.7.2",
    +        "@babel/plugin-syntax-typescript": "^7.7.2",
    +        "@babel/types": "^7.3.3",
    +        "@jest/expect-utils": "^29.7.0",
    +        "@jest/transform": "^29.7.0",
    +        "@jest/types": "^29.6.3",
    +        "babel-preset-current-node-syntax": "^1.0.0",
    +        "chalk": "^4.0.0",
    +        "expect": "^29.7.0",
    +        "graceful-fs": "^4.2.9",
    +        "jest-diff": "^29.7.0",
    +        "jest-get-type": "^29.6.3",
    +        "jest-matcher-utils": "^29.7.0",
    +        "jest-message-util": "^29.7.0",
    +        "jest-util": "^29.7.0",
    +        "natural-compare": "^1.4.0",
    +        "pretty-format": "^29.7.0",
    +        "semver": "^7.5.3"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/jest-util": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
    +      "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/types": "^29.6.3",
    +        "@types/node": "*",
    +        "chalk": "^4.0.0",
    +        "ci-info": "^3.2.0",
    +        "graceful-fs": "^4.2.9",
    +        "picomatch": "^2.2.3"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/jest-validate": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
    +      "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/types": "^29.6.3",
    +        "camelcase": "^6.2.0",
    +        "chalk": "^4.0.0",
    +        "jest-get-type": "^29.6.3",
    +        "leven": "^3.1.0",
    +        "pretty-format": "^29.7.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/jest-validate/node_modules/camelcase": {
    +      "version": "6.3.0",
    +      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
    +      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/jest-watcher": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz",
    +      "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/test-result": "^29.7.0",
    +        "@jest/types": "^29.6.3",
    +        "@types/node": "*",
    +        "ansi-escapes": "^4.2.1",
    +        "chalk": "^4.0.0",
    +        "emittery": "^0.13.1",
    +        "jest-util": "^29.7.0",
    +        "string-length": "^4.0.1"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/jest-worker": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
    +      "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/node": "*",
    +        "jest-util": "^29.7.0",
    +        "merge-stream": "^2.0.0",
    +        "supports-color": "^8.0.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/joi": {
    +      "version": "17.11.0",
    +      "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz",
    +      "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@hapi/hoek": "^9.0.0",
    +        "@hapi/topo": "^5.0.0",
    +        "@sideway/address": "^4.1.3",
    +        "@sideway/formula": "^3.0.1",
    +        "@sideway/pinpoint": "^2.0.0"
    +      }
    +    },
    +    "node_modules/js-tokens": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
    +      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
    +      "dev": true
    +    },
    +    "node_modules/js-yaml": {
    +      "version": "3.14.1",
    +      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
    +      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
    +      "dev": true,
    +      "dependencies": {
    +        "argparse": "^1.0.7",
    +        "esprima": "^4.0.0"
    +      },
    +      "bin": {
    +        "js-yaml": "bin/js-yaml.js"
    +      }
    +    },
    +    "node_modules/jsdom": {
    +      "version": "23.0.1",
    +      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-23.0.1.tgz",
    +      "integrity": "sha512-2i27vgvlUsGEBO9+/kJQRbtqtm+191b5zAZrU/UezVmnC2dlDAFLgDYJvAEi94T4kjsRKkezEtLQTgsNEsW2lQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "cssstyle": "^3.0.0",
    +        "data-urls": "^5.0.0",
    +        "decimal.js": "^10.4.3",
    +        "form-data": "^4.0.0",
    +        "html-encoding-sniffer": "^4.0.0",
    +        "http-proxy-agent": "^7.0.0",
    +        "https-proxy-agent": "^7.0.2",
    +        "is-potential-custom-element-name": "^1.0.1",
    +        "nwsapi": "^2.2.7",
    +        "parse5": "^7.1.2",
    +        "rrweb-cssom": "^0.6.0",
    +        "saxes": "^6.0.0",
    +        "symbol-tree": "^3.2.4",
    +        "tough-cookie": "^4.1.3",
    +        "w3c-xmlserializer": "^5.0.0",
    +        "webidl-conversions": "^7.0.0",
    +        "whatwg-encoding": "^3.1.1",
    +        "whatwg-mimetype": "^4.0.0",
    +        "whatwg-url": "^14.0.0",
    +        "ws": "^8.14.2",
    +        "xml-name-validator": "^5.0.0"
    +      },
    +      "engines": {
    +        "node": ">=18"
    +      },
    +      "peerDependencies": {
    +        "canvas": "^2.11.2"
    +      },
    +      "peerDependenciesMeta": {
    +        "canvas": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/jsesc": {
    +      "version": "2.5.2",
    +      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
    +      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
    +      "dev": true,
    +      "bin": {
    +        "jsesc": "bin/jsesc"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/jsfuzz": {
    +      "version": "1.0.15",
    +      "resolved": "https://registry.npmjs.org/jsfuzz/-/jsfuzz-1.0.15.tgz",
    +      "integrity": "sha512-NjzL5VD/AXTfVGfCyigbXuuGh+PLbVRnLSQQM0m8SL6hiBGMclm7ylAAxQZdNhE706YWCEBh0RzfTZl+zEnlMg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/escodegen": "^0.0.6",
    +        "@types/esprima": "^4.0.2",
    +        "@types/estraverse": "^0.0.6",
    +        "@types/estree": "^0.0.39",
    +        "deep-equal": "^1.1.0",
    +        "escodegen": "^1.12.0",
    +        "esprima": "^4.0.1",
    +        "estraverse": "^4.3.0",
    +        "inversify": "^5.0.1",
    +        "nyc": "^14.1.1",
    +        "pidusage": "^2.0.17",
    +        "reflect-metadata": "^0.1.13",
    +        "yargs": "^14.2.0"
    +      },
    +      "bin": {
    +        "jsfuzz": "build/src/index.js"
    +      }
    +    },
    +    "node_modules/jsfuzz/node_modules/ansi-regex": {
    +      "version": "4.1.1",
    +      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
    +      "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/jsfuzz/node_modules/ansi-styles": {
    +      "version": "3.2.1",
    +      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
    +      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
    +      "dev": true,
    +      "dependencies": {
    +        "color-convert": "^1.9.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/jsfuzz/node_modules/cliui": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
    +      "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
    +      "dev": true,
    +      "dependencies": {
    +        "string-width": "^3.1.0",
    +        "strip-ansi": "^5.2.0",
    +        "wrap-ansi": "^5.1.0"
    +      }
    +    },
    +    "node_modules/jsfuzz/node_modules/color-convert": {
    +      "version": "1.9.3",
    +      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
    +      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
    +      "dev": true,
    +      "dependencies": {
    +        "color-name": "1.1.3"
    +      }
    +    },
    +    "node_modules/jsfuzz/node_modules/color-name": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
    +      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
    +      "dev": true
    +    },
    +    "node_modules/jsfuzz/node_modules/emoji-regex": {
    +      "version": "7.0.3",
    +      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
    +      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
    +      "dev": true
    +    },
    +    "node_modules/jsfuzz/node_modules/find-up": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
    +      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
    +      "dev": true,
    +      "dependencies": {
    +        "locate-path": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/jsfuzz/node_modules/is-fullwidth-code-point": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
    +      "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/jsfuzz/node_modules/locate-path": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
    +      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-locate": "^3.0.0",
    +        "path-exists": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/jsfuzz/node_modules/p-limit": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
    +      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-try": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/jsfuzz/node_modules/p-locate": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
    +      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-limit": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/jsfuzz/node_modules/path-exists": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
    +      "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/jsfuzz/node_modules/string-width": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
    +      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
    +      "dev": true,
    +      "dependencies": {
    +        "emoji-regex": "^7.0.1",
    +        "is-fullwidth-code-point": "^2.0.0",
    +        "strip-ansi": "^5.1.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/jsfuzz/node_modules/strip-ansi": {
    +      "version": "5.2.0",
    +      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
    +      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-regex": "^4.1.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/jsfuzz/node_modules/wrap-ansi": {
    +      "version": "5.1.0",
    +      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
    +      "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-styles": "^3.2.0",
    +        "string-width": "^3.0.0",
    +        "strip-ansi": "^5.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/jsfuzz/node_modules/y18n": {
    +      "version": "4.0.3",
    +      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
    +      "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
    +      "dev": true
    +    },
    +    "node_modules/jsfuzz/node_modules/yargs": {
    +      "version": "14.2.3",
    +      "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz",
    +      "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==",
    +      "dev": true,
    +      "dependencies": {
    +        "cliui": "^5.0.0",
    +        "decamelize": "^1.2.0",
    +        "find-up": "^3.0.0",
    +        "get-caller-file": "^2.0.1",
    +        "require-directory": "^2.1.1",
    +        "require-main-filename": "^2.0.0",
    +        "set-blocking": "^2.0.0",
    +        "string-width": "^3.0.0",
    +        "which-module": "^2.0.0",
    +        "y18n": "^4.0.0",
    +        "yargs-parser": "^15.0.1"
    +      }
    +    },
    +    "node_modules/jsfuzz/node_modules/yargs-parser": {
    +      "version": "15.0.3",
    +      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz",
    +      "integrity": "sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==",
    +      "dev": true,
    +      "dependencies": {
    +        "camelcase": "^5.0.0",
    +        "decamelize": "^1.2.0"
    +      }
    +    },
    +    "node_modules/json-buffer": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
    +      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
    +      "dev": true
    +    },
    +    "node_modules/json-parse-better-errors": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
    +      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
    +      "dev": true
    +    },
    +    "node_modules/json-parse-even-better-errors": {
    +      "version": "2.3.1",
    +      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
    +      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
    +      "dev": true
    +    },
    +    "node_modules/json-schema-traverse": {
    +      "version": "0.4.1",
    +      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
    +      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
    +      "dev": true
    +    },
    +    "node_modules/json-stable-stringify-without-jsonify": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
    +      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
    +      "dev": true
    +    },
    +    "node_modules/json5": {
    +      "version": "2.2.3",
    +      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
    +      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
    +      "dev": true,
    +      "bin": {
    +        "json5": "lib/cli.js"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/jsonfile": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
    +      "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
    +      "dev": true,
    +      "optionalDependencies": {
    +        "graceful-fs": "^4.1.6"
    +      }
    +    },
    +    "node_modules/jsx-ast-utils": {
    +      "version": "3.3.5",
    +      "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
    +      "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "array-includes": "^3.1.6",
    +        "array.prototype.flat": "^1.3.1",
    +        "object.assign": "^4.1.4",
    +        "object.values": "^1.1.6"
    +      },
    +      "engines": {
    +        "node": ">=4.0"
    +      }
    +    },
    +    "node_modules/just-extend": {
    +      "version": "4.2.1",
    +      "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz",
    +      "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==",
    +      "dev": true
    +    },
    +    "node_modules/keyv": {
    +      "version": "4.5.4",
    +      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
    +      "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
    +      "dev": true,
    +      "dependencies": {
    +        "json-buffer": "3.0.1"
    +      }
    +    },
    +    "node_modules/kind-of": {
    +      "version": "6.0.3",
    +      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
    +      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/kleur": {
    +      "version": "3.0.3",
    +      "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
    +      "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/latest-version": {
    +      "version": "5.1.0",
    +      "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
    +      "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
    +      "dev": true,
    +      "dependencies": {
    +        "package-json": "^6.3.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/leven": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
    +      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/levn": {
    +      "version": "0.3.0",
    +      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
    +      "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
    +      "dev": true,
    +      "dependencies": {
    +        "prelude-ls": "~1.1.2",
    +        "type-check": "~0.3.2"
    +      },
    +      "engines": {
    +        "node": ">= 0.8.0"
    +      }
    +    },
    +    "node_modules/libtap": {
    +      "version": "1.4.1",
    +      "resolved": "https://registry.npmjs.org/libtap/-/libtap-1.4.1.tgz",
    +      "integrity": "sha512-S9v19shLTigoMn3c02V7LZ4t09zxmVP3r3RbEAwuHFYeKgF+ESFJxoQ0PMFKW4XdgQhcjVBEwDoopG6WROq/gw==",
    +      "dev": true,
    +      "dependencies": {
    +        "async-hook-domain": "^2.0.4",
    +        "bind-obj-methods": "^3.0.0",
    +        "diff": "^4.0.2",
    +        "function-loop": "^2.0.1",
    +        "minipass": "^3.1.5",
    +        "own-or": "^1.0.0",
    +        "own-or-env": "^1.0.2",
    +        "signal-exit": "^3.0.4",
    +        "stack-utils": "^2.0.4",
    +        "tap-parser": "^11.0.0",
    +        "tap-yaml": "^1.0.0",
    +        "tcompare": "^5.0.6",
    +        "trivial-deferred": "^1.0.1"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/isaacs"
    +      }
    +    },
    +    "node_modules/libtap/node_modules/diff": {
    +      "version": "4.0.2",
    +      "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
    +      "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.3.1"
    +      }
    +    },
    +    "node_modules/lines-and-columns": {
    +      "version": "1.2.4",
    +      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
    +      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
    +      "dev": true
    +    },
    +    "node_modules/livereload": {
    +      "version": "0.9.3",
    +      "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.3.tgz",
    +      "integrity": "sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw==",
    +      "dev": true,
    +      "dependencies": {
    +        "chokidar": "^3.5.0",
    +        "livereload-js": "^3.3.1",
    +        "opts": ">= 1.2.0",
    +        "ws": "^7.4.3"
    +      },
    +      "bin": {
    +        "livereload": "bin/livereload.js"
    +      },
    +      "engines": {
    +        "node": ">=8.0.0"
    +      }
    +    },
    +    "node_modules/livereload-js": {
    +      "version": "3.4.1",
    +      "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.4.1.tgz",
    +      "integrity": "sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g==",
    +      "dev": true
    +    },
    +    "node_modules/livereload/node_modules/ws": {
    +      "version": "7.5.9",
    +      "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
    +      "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8.3.0"
    +      },
    +      "peerDependencies": {
    +        "bufferutil": "^4.0.1",
    +        "utf-8-validate": "^5.0.2"
    +      },
    +      "peerDependenciesMeta": {
    +        "bufferutil": {
    +          "optional": true
    +        },
    +        "utf-8-validate": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/load-json-file": {
    +      "version": "5.3.0",
    +      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz",
    +      "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==",
    +      "dev": true,
    +      "dependencies": {
    +        "graceful-fs": "^4.1.15",
    +        "parse-json": "^4.0.0",
    +        "pify": "^4.0.1",
    +        "strip-bom": "^3.0.0",
    +        "type-fest": "^0.3.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/load-json-file/node_modules/parse-json": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
    +      "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
    +      "dev": true,
    +      "dependencies": {
    +        "error-ex": "^1.3.1",
    +        "json-parse-better-errors": "^1.0.1"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/load-json-file/node_modules/pify": {
    +      "version": "4.0.1",
    +      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
    +      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/load-json-file/node_modules/strip-bom": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
    +      "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/load-json-file/node_modules/type-fest": {
    +      "version": "0.3.1",
    +      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz",
    +      "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/locate-path": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
    +      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-locate": "^4.1.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/lodash": {
    +      "version": "4.17.21",
    +      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
    +      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
    +      "dev": true
    +    },
    +    "node_modules/lodash.flattendeep": {
    +      "version": "4.4.0",
    +      "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
    +      "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==",
    +      "dev": true
    +    },
    +    "node_modules/lodash.get": {
    +      "version": "4.4.2",
    +      "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
    +      "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
    +      "dev": true
    +    },
    +    "node_modules/lodash.merge": {
    +      "version": "4.6.2",
    +      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
    +      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
    +      "dev": true
    +    },
    +    "node_modules/lodash.truncate": {
    +      "version": "4.4.2",
    +      "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
    +      "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
    +      "dev": true
    +    },
    +    "node_modules/log-symbols": {
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
    +      "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
    +      "dev": true,
    +      "dependencies": {
    +        "chalk": "^4.1.0",
    +        "is-unicode-supported": "^0.1.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/loose-envify": {
    +      "version": "1.4.0",
    +      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
    +      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "js-tokens": "^3.0.0 || ^4.0.0"
    +      },
    +      "bin": {
    +        "loose-envify": "cli.js"
    +      }
    +    },
    +    "node_modules/loupe": {
    +      "version": "2.3.7",
    +      "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz",
    +      "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
    +      "dev": true,
    +      "dependencies": {
    +        "get-func-name": "^2.0.1"
    +      }
    +    },
    +    "node_modules/lowercase-keys": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
    +      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/lru-cache": {
    +      "version": "5.1.1",
    +      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
    +      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
    +      "dev": true,
    +      "dependencies": {
    +        "yallist": "^3.0.2"
    +      }
    +    },
    +    "node_modules/make-dir": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
    +      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
    +      "dev": true,
    +      "dependencies": {
    +        "semver": "^6.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/make-dir/node_modules/semver": {
    +      "version": "6.3.1",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
    +      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
    +      "dev": true,
    +      "bin": {
    +        "semver": "bin/semver.js"
    +      }
    +    },
    +    "node_modules/makeerror": {
    +      "version": "1.0.12",
    +      "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
    +      "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
    +      "dev": true,
    +      "dependencies": {
    +        "tmpl": "1.0.5"
    +      }
    +    },
    +    "node_modules/map-obj": {
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
    +      "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/marked": {
    +      "version": "1.2.9",
    +      "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.9.tgz",
    +      "integrity": "sha512-H8lIX2SvyitGX+TRdtS06m1jHMijKN/XjfH6Ooii9fvxMlh8QdqBfBDkGUpMWH2kQNrtixjzYUa3SH8ROTgRRw==",
    +      "dev": true,
    +      "bin": {
    +        "marked": "bin/marked"
    +      },
    +      "engines": {
    +        "node": ">= 8.16.2"
    +      }
    +    },
    +    "node_modules/media-typer": {
    +      "version": "0.3.0",
    +      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
    +      "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/medium-zoom": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/medium-zoom/-/medium-zoom-1.1.0.tgz",
    +      "integrity": "sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==",
    +      "dev": true
    +    },
    +    "node_modules/meow": {
    +      "version": "9.0.0",
    +      "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
    +      "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/minimist": "^1.2.0",
    +        "camelcase-keys": "^6.2.2",
    +        "decamelize": "^1.2.0",
    +        "decamelize-keys": "^1.1.0",
    +        "hard-rejection": "^2.1.0",
    +        "minimist-options": "4.1.0",
    +        "normalize-package-data": "^3.0.0",
    +        "read-pkg-up": "^7.0.1",
    +        "redent": "^3.0.0",
    +        "trim-newlines": "^3.0.0",
    +        "type-fest": "^0.18.0",
    +        "yargs-parser": "^20.2.3"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/meow/node_modules/type-fest": {
    +      "version": "0.18.1",
    +      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
    +      "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/merge-descriptors": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
    +      "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
    +      "dev": true
    +    },
    +    "node_modules/merge-source-map": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz",
    +      "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==",
    +      "dev": true,
    +      "dependencies": {
    +        "source-map": "^0.6.1"
    +      }
    +    },
    +    "node_modules/merge-stream": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
    +      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
    +      "dev": true
    +    },
    +    "node_modules/merge2": {
    +      "version": "1.4.1",
    +      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
    +      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 8"
    +      }
    +    },
    +    "node_modules/methods": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
    +      "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/micromatch": {
    +      "version": "4.0.5",
    +      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
    +      "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
    +      "dev": true,
    +      "dependencies": {
    +        "braces": "^3.0.2",
    +        "picomatch": "^2.3.1"
    +      },
    +      "engines": {
    +        "node": ">=8.6"
    +      }
    +    },
    +    "node_modules/mime": {
    +      "version": "1.6.0",
    +      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
    +      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
    +      "dev": true,
    +      "bin": {
    +        "mime": "cli.js"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/mime-db": {
    +      "version": "1.52.0",
    +      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
    +      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/mime-types": {
    +      "version": "2.1.35",
    +      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
    +      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
    +      "dev": true,
    +      "dependencies": {
    +        "mime-db": "1.52.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/mimic-fn": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
    +      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/mimic-response": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
    +      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/min-indent": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
    +      "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/minimatch": {
    +      "version": "3.1.2",
    +      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
    +      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
    +      "dev": true,
    +      "dependencies": {
    +        "brace-expansion": "^1.1.7"
    +      },
    +      "engines": {
    +        "node": "*"
    +      }
    +    },
    +    "node_modules/minimist": {
    +      "version": "1.2.8",
    +      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
    +      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
    +      "dev": true,
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/minimist-options": {
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
    +      "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
    +      "dev": true,
    +      "dependencies": {
    +        "arrify": "^1.0.1",
    +        "is-plain-obj": "^1.1.0",
    +        "kind-of": "^6.0.3"
    +      },
    +      "engines": {
    +        "node": ">= 6"
    +      }
    +    },
    +    "node_modules/minipass": {
    +      "version": "3.3.6",
    +      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
    +      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
    +      "dev": true,
    +      "dependencies": {
    +        "yallist": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/minipass/node_modules/yallist": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
    +      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
    +      "dev": true
    +    },
    +    "node_modules/mkdirp": {
    +      "version": "0.5.6",
    +      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
    +      "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
    +      "dev": true,
    +      "dependencies": {
    +        "minimist": "^1.2.6"
    +      },
    +      "bin": {
    +        "mkdirp": "bin/cmd.js"
    +      }
    +    },
    +    "node_modules/mocha": {
    +      "version": "10.2.0",
    +      "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz",
    +      "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-colors": "4.1.1",
    +        "browser-stdout": "1.3.1",
    +        "chokidar": "3.5.3",
    +        "debug": "4.3.4",
    +        "diff": "5.0.0",
    +        "escape-string-regexp": "4.0.0",
    +        "find-up": "5.0.0",
    +        "glob": "7.2.0",
    +        "he": "1.2.0",
    +        "js-yaml": "4.1.0",
    +        "log-symbols": "4.1.0",
    +        "minimatch": "5.0.1",
    +        "ms": "2.1.3",
    +        "nanoid": "3.3.3",
    +        "serialize-javascript": "6.0.0",
    +        "strip-json-comments": "3.1.1",
    +        "supports-color": "8.1.1",
    +        "workerpool": "6.2.1",
    +        "yargs": "16.2.0",
    +        "yargs-parser": "20.2.4",
    +        "yargs-unparser": "2.0.0"
    +      },
    +      "bin": {
    +        "_mocha": "bin/_mocha",
    +        "mocha": "bin/mocha.js"
    +      },
    +      "engines": {
    +        "node": ">= 14.0.0"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/mochajs"
    +      }
    +    },
    +    "node_modules/mocha/node_modules/ansi-colors": {
    +      "version": "4.1.1",
    +      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
    +      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/mocha/node_modules/argparse": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
    +      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
    +      "dev": true
    +    },
    +    "node_modules/mocha/node_modules/debug": {
    +      "version": "4.3.4",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
    +      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/mocha/node_modules/debug/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/mocha/node_modules/find-up": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
    +      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
    +      "dev": true,
    +      "dependencies": {
    +        "locate-path": "^6.0.0",
    +        "path-exists": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/mocha/node_modules/glob": {
    +      "version": "7.2.0",
    +      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
    +      "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "fs.realpath": "^1.0.0",
    +        "inflight": "^1.0.4",
    +        "inherits": "2",
    +        "minimatch": "^3.0.4",
    +        "once": "^1.3.0",
    +        "path-is-absolute": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": "*"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/isaacs"
    +      }
    +    },
    +    "node_modules/mocha/node_modules/glob/node_modules/minimatch": {
    +      "version": "3.1.2",
    +      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
    +      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
    +      "dev": true,
    +      "dependencies": {
    +        "brace-expansion": "^1.1.7"
    +      },
    +      "engines": {
    +        "node": "*"
    +      }
    +    },
    +    "node_modules/mocha/node_modules/js-yaml": {
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
    +      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
    +      "dev": true,
    +      "dependencies": {
    +        "argparse": "^2.0.1"
    +      },
    +      "bin": {
    +        "js-yaml": "bin/js-yaml.js"
    +      }
    +    },
    +    "node_modules/mocha/node_modules/locate-path": {
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
    +      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-locate": "^5.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/mocha/node_modules/minimatch": {
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
    +      "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
    +      "dev": true,
    +      "dependencies": {
    +        "brace-expansion": "^2.0.1"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/mocha/node_modules/minimatch/node_modules/brace-expansion": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
    +      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
    +      "dev": true,
    +      "dependencies": {
    +        "balanced-match": "^1.0.0"
    +      }
    +    },
    +    "node_modules/mocha/node_modules/ms": {
    +      "version": "2.1.3",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
    +      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
    +      "dev": true
    +    },
    +    "node_modules/mocha/node_modules/p-locate": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
    +      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-limit": "^3.0.2"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/mocha/node_modules/yargs": {
    +      "version": "16.2.0",
    +      "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
    +      "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
    +      "dev": true,
    +      "dependencies": {
    +        "cliui": "^7.0.2",
    +        "escalade": "^3.1.1",
    +        "get-caller-file": "^2.0.5",
    +        "require-directory": "^2.1.1",
    +        "string-width": "^4.2.0",
    +        "y18n": "^5.0.5",
    +        "yargs-parser": "^20.2.2"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/mockttp": {
    +      "version": "3.9.4",
    +      "resolved": "https://registry.npmjs.org/mockttp/-/mockttp-3.9.4.tgz",
    +      "integrity": "sha512-EagdyT83RqAKWB2c+g3NdL1hEBcXl4Oeg6zIWDk9mq6JCAqsaIHySE78lvgGja2QjWOgosQaS1YtCaWkKaCFkw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@graphql-tools/schema": "^8.5.0",
    +        "@graphql-tools/utils": "^8.8.0",
    +        "@httptoolkit/httpolyglot": "^2.1.1",
    +        "@httptoolkit/subscriptions-transport-ws": "^0.11.2",
    +        "@httptoolkit/websocket-stream": "^6.0.1",
    +        "@types/cors": "^2.8.6",
    +        "@types/node": "*",
    +        "base64-arraybuffer": "^0.1.5",
    +        "body-parser": "^1.15.2",
    +        "cacheable-lookup": "^6.0.0",
    +        "common-tags": "^1.8.0",
    +        "connect": "^3.7.0",
    +        "cors": "^2.8.4",
    +        "cors-gate": "^1.1.3",
    +        "cross-fetch": "^3.1.5",
    +        "destroyable-server": "^1.0.0",
    +        "express": "^4.14.0",
    +        "graphql": "^14.0.2 || ^15.5",
    +        "graphql-http": "^1.22.0",
    +        "graphql-subscriptions": "^1.1.0",
    +        "graphql-tag": "^2.12.6",
    +        "http-encoding": "^1.5.1",
    +        "http2-wrapper": "^2.2.0",
    +        "https-proxy-agent": "^5.0.1",
    +        "isomorphic-ws": "^4.0.1",
    +        "lodash": "^4.16.4",
    +        "lru-cache": "^7.14.0",
    +        "native-duplexpair": "^1.0.0",
    +        "node-forge": "^1.2.1",
    +        "pac-proxy-agent": "^7.0.0",
    +        "parse-multipart-data": "^1.4.0",
    +        "performance-now": "^2.1.0",
    +        "portfinder": "1.0.28",
    +        "read-tls-client-hello": "^1.0.0",
    +        "semver": "^7.5.3",
    +        "socks-proxy-agent": "^7.0.0",
    +        "typed-error": "^3.0.2",
    +        "uuid": "^8.3.2",
    +        "ws": "^8.8.0"
    +      },
    +      "bin": {
    +        "mockttp": "dist/admin/admin-bin.js"
    +      },
    +      "engines": {
    +        "node": ">=14.14.0"
    +      }
    +    },
    +    "node_modules/mockttp/node_modules/agent-base": {
    +      "version": "6.0.2",
    +      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
    +      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "debug": "4"
    +      },
    +      "engines": {
    +        "node": ">= 6.0.0"
    +      }
    +    },
    +    "node_modules/mockttp/node_modules/debug": {
    +      "version": "4.3.4",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
    +      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/mockttp/node_modules/https-proxy-agent": {
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
    +      "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
    +      "dev": true,
    +      "dependencies": {
    +        "agent-base": "6",
    +        "debug": "4"
    +      },
    +      "engines": {
    +        "node": ">= 6"
    +      }
    +    },
    +    "node_modules/mockttp/node_modules/lru-cache": {
    +      "version": "7.18.3",
    +      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
    +      "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=12"
    +      }
    +    },
    +    "node_modules/mockttp/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/module-not-found-error": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz",
    +      "integrity": "sha512-pEk4ECWQXV6z2zjhRZUongnLJNUeGQJ3w6OQ5ctGwD+i5o93qjRQUk2Rt6VdNeu3sEP0AB4LcfvdebpxBRVr4g==",
    +      "dev": true
    +    },
    +    "node_modules/mri": {
    +      "version": "1.1.4",
    +      "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz",
    +      "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/ms": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    +      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
    +      "dev": true
    +    },
    +    "node_modules/nanoid": {
    +      "version": "3.3.3",
    +      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz",
    +      "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==",
    +      "dev": true,
    +      "bin": {
    +        "nanoid": "bin/nanoid.cjs"
    +      },
    +      "engines": {
    +        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
    +      }
    +    },
    +    "node_modules/native-duplexpair": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz",
    +      "integrity": "sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA==",
    +      "dev": true
    +    },
    +    "node_modules/natural-compare": {
    +      "version": "1.4.0",
    +      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
    +      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
    +      "dev": true
    +    },
    +    "node_modules/negotiator": {
    +      "version": "0.6.3",
    +      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
    +      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/nested-error-stacks": {
    +      "version": "2.1.1",
    +      "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz",
    +      "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==",
    +      "dev": true
    +    },
    +    "node_modules/netmask": {
    +      "version": "2.0.2",
    +      "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz",
    +      "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.4.0"
    +      }
    +    },
    +    "node_modules/nise": {
    +      "version": "5.1.5",
    +      "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz",
    +      "integrity": "sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@sinonjs/commons": "^2.0.0",
    +        "@sinonjs/fake-timers": "^10.0.2",
    +        "@sinonjs/text-encoding": "^0.7.1",
    +        "just-extend": "^4.0.2",
    +        "path-to-regexp": "^1.7.0"
    +      }
    +    },
    +    "node_modules/nise/node_modules/@sinonjs/commons": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz",
    +      "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==",
    +      "dev": true,
    +      "dependencies": {
    +        "type-detect": "4.0.8"
    +      }
    +    },
    +    "node_modules/nise/node_modules/@sinonjs/fake-timers": {
    +      "version": "10.3.0",
    +      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
    +      "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@sinonjs/commons": "^3.0.0"
    +      }
    +    },
    +    "node_modules/nise/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz",
    +      "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==",
    +      "dev": true,
    +      "dependencies": {
    +        "type-detect": "4.0.8"
    +      }
    +    },
    +    "node_modules/nise/node_modules/isarray": {
    +      "version": "0.0.1",
    +      "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
    +      "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
    +      "dev": true
    +    },
    +    "node_modules/nise/node_modules/path-to-regexp": {
    +      "version": "1.8.0",
    +      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
    +      "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
    +      "dev": true,
    +      "dependencies": {
    +        "isarray": "0.0.1"
    +      }
    +    },
    +    "node_modules/node-fetch": {
    +      "version": "2.7.0",
    +      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
    +      "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
    +      "dev": true,
    +      "dependencies": {
    +        "whatwg-url": "^5.0.0"
    +      },
    +      "engines": {
    +        "node": "4.x || >=6.0.0"
    +      },
    +      "peerDependencies": {
    +        "encoding": "^0.1.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "encoding": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/node-fetch/node_modules/tr46": {
    +      "version": "0.0.3",
    +      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
    +      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
    +      "dev": true
    +    },
    +    "node_modules/node-fetch/node_modules/webidl-conversions": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
    +      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
    +      "dev": true
    +    },
    +    "node_modules/node-fetch/node_modules/whatwg-url": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
    +      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
    +      "dev": true,
    +      "dependencies": {
    +        "tr46": "~0.0.3",
    +        "webidl-conversions": "^3.0.0"
    +      }
    +    },
    +    "node_modules/node-forge": {
    +      "version": "1.3.1",
    +      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
    +      "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 6.13.0"
    +      }
    +    },
    +    "node_modules/node-int64": {
    +      "version": "0.4.0",
    +      "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
    +      "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
    +      "dev": true
    +    },
    +    "node_modules/node-preload": {
    +      "version": "0.2.1",
    +      "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz",
    +      "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "process-on-spawn": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/node-releases": {
    +      "version": "2.0.14",
    +      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
    +      "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
    +      "dev": true
    +    },
    +    "node_modules/normalize-package-data": {
    +      "version": "3.0.3",
    +      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
    +      "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
    +      "dev": true,
    +      "dependencies": {
    +        "hosted-git-info": "^4.0.1",
    +        "is-core-module": "^2.5.0",
    +        "semver": "^7.3.4",
    +        "validate-npm-package-license": "^3.0.1"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/normalize-path": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
    +      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/normalize-url": {
    +      "version": "4.5.1",
    +      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
    +      "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/npm-run-path": {
    +      "version": "4.0.1",
    +      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
    +      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
    +      "dev": true,
    +      "dependencies": {
    +        "path-key": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/nwsapi": {
    +      "version": "2.2.7",
    +      "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz",
    +      "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==",
    +      "dev": true
    +    },
    +    "node_modules/nyc": {
    +      "version": "14.1.1",
    +      "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz",
    +      "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==",
    +      "dev": true,
    +      "dependencies": {
    +        "archy": "^1.0.0",
    +        "caching-transform": "^3.0.2",
    +        "convert-source-map": "^1.6.0",
    +        "cp-file": "^6.2.0",
    +        "find-cache-dir": "^2.1.0",
    +        "find-up": "^3.0.0",
    +        "foreground-child": "^1.5.6",
    +        "glob": "^7.1.3",
    +        "istanbul-lib-coverage": "^2.0.5",
    +        "istanbul-lib-hook": "^2.0.7",
    +        "istanbul-lib-instrument": "^3.3.0",
    +        "istanbul-lib-report": "^2.0.8",
    +        "istanbul-lib-source-maps": "^3.0.6",
    +        "istanbul-reports": "^2.2.4",
    +        "js-yaml": "^3.13.1",
    +        "make-dir": "^2.1.0",
    +        "merge-source-map": "^1.1.0",
    +        "resolve-from": "^4.0.0",
    +        "rimraf": "^2.6.3",
    +        "signal-exit": "^3.0.2",
    +        "spawn-wrap": "^1.4.2",
    +        "test-exclude": "^5.2.3",
    +        "uuid": "^3.3.2",
    +        "yargs": "^13.2.2",
    +        "yargs-parser": "^13.0.0"
    +      },
    +      "bin": {
    +        "nyc": "bin/nyc.js"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/ansi-regex": {
    +      "version": "4.1.1",
    +      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
    +      "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/ansi-styles": {
    +      "version": "3.2.1",
    +      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
    +      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
    +      "dev": true,
    +      "dependencies": {
    +        "color-convert": "^1.9.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/cliui": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
    +      "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
    +      "dev": true,
    +      "dependencies": {
    +        "string-width": "^3.1.0",
    +        "strip-ansi": "^5.2.0",
    +        "wrap-ansi": "^5.1.0"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/color-convert": {
    +      "version": "1.9.3",
    +      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
    +      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
    +      "dev": true,
    +      "dependencies": {
    +        "color-name": "1.1.3"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/color-name": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
    +      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
    +      "dev": true
    +    },
    +    "node_modules/nyc/node_modules/convert-source-map": {
    +      "version": "1.9.0",
    +      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
    +      "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
    +      "dev": true
    +    },
    +    "node_modules/nyc/node_modules/cp-file": {
    +      "version": "6.2.0",
    +      "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz",
    +      "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==",
    +      "dev": true,
    +      "dependencies": {
    +        "graceful-fs": "^4.1.2",
    +        "make-dir": "^2.0.0",
    +        "nested-error-stacks": "^2.0.0",
    +        "pify": "^4.0.1",
    +        "safe-buffer": "^5.0.1"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/debug": {
    +      "version": "4.3.4",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
    +      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/nyc/node_modules/emoji-regex": {
    +      "version": "7.0.3",
    +      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
    +      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
    +      "dev": true
    +    },
    +    "node_modules/nyc/node_modules/find-up": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
    +      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
    +      "dev": true,
    +      "dependencies": {
    +        "locate-path": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/has-flag": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
    +      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/hosted-git-info": {
    +      "version": "2.8.9",
    +      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
    +      "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
    +      "dev": true
    +    },
    +    "node_modules/nyc/node_modules/is-fullwidth-code-point": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
    +      "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/istanbul-lib-coverage": {
    +      "version": "2.0.5",
    +      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
    +      "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/istanbul-lib-instrument": {
    +      "version": "3.3.0",
    +      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz",
    +      "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/generator": "^7.4.0",
    +        "@babel/parser": "^7.4.3",
    +        "@babel/template": "^7.4.0",
    +        "@babel/traverse": "^7.4.3",
    +        "@babel/types": "^7.4.0",
    +        "istanbul-lib-coverage": "^2.0.5",
    +        "semver": "^6.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/istanbul-lib-report": {
    +      "version": "2.0.8",
    +      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz",
    +      "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "istanbul-lib-coverage": "^2.0.5",
    +        "make-dir": "^2.1.0",
    +        "supports-color": "^6.1.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/istanbul-lib-source-maps": {
    +      "version": "3.0.6",
    +      "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz",
    +      "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==",
    +      "dev": true,
    +      "dependencies": {
    +        "debug": "^4.1.1",
    +        "istanbul-lib-coverage": "^2.0.5",
    +        "make-dir": "^2.1.0",
    +        "rimraf": "^2.6.3",
    +        "source-map": "^0.6.1"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/istanbul-reports": {
    +      "version": "2.2.7",
    +      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz",
    +      "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==",
    +      "dev": true,
    +      "dependencies": {
    +        "html-escaper": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/load-json-file": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
    +      "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==",
    +      "dev": true,
    +      "dependencies": {
    +        "graceful-fs": "^4.1.2",
    +        "parse-json": "^4.0.0",
    +        "pify": "^3.0.0",
    +        "strip-bom": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/load-json-file/node_modules/pify": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
    +      "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/locate-path": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
    +      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-locate": "^3.0.0",
    +        "path-exists": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/make-dir": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
    +      "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
    +      "dev": true,
    +      "dependencies": {
    +        "pify": "^4.0.1",
    +        "semver": "^5.6.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/make-dir/node_modules/semver": {
    +      "version": "5.7.2",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
    +      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
    +      "dev": true,
    +      "bin": {
    +        "semver": "bin/semver"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/nyc/node_modules/normalize-package-data": {
    +      "version": "2.5.0",
    +      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
    +      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
    +      "dev": true,
    +      "dependencies": {
    +        "hosted-git-info": "^2.1.4",
    +        "resolve": "^1.10.0",
    +        "semver": "2 || 3 || 4 || 5",
    +        "validate-npm-package-license": "^3.0.1"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/normalize-package-data/node_modules/semver": {
    +      "version": "5.7.2",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
    +      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
    +      "dev": true,
    +      "bin": {
    +        "semver": "bin/semver"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/p-limit": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
    +      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-try": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/p-locate": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
    +      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-limit": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/parse-json": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
    +      "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
    +      "dev": true,
    +      "dependencies": {
    +        "error-ex": "^1.3.1",
    +        "json-parse-better-errors": "^1.0.1"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/path-exists": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
    +      "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/path-type": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
    +      "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
    +      "dev": true,
    +      "dependencies": {
    +        "pify": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/path-type/node_modules/pify": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
    +      "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/pify": {
    +      "version": "4.0.1",
    +      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
    +      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/read-pkg": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
    +      "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==",
    +      "dev": true,
    +      "dependencies": {
    +        "load-json-file": "^4.0.0",
    +        "normalize-package-data": "^2.3.2",
    +        "path-type": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/read-pkg-up": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz",
    +      "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==",
    +      "dev": true,
    +      "dependencies": {
    +        "find-up": "^3.0.0",
    +        "read-pkg": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/semver": {
    +      "version": "6.3.1",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
    +      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
    +      "dev": true,
    +      "bin": {
    +        "semver": "bin/semver.js"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/string-width": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
    +      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
    +      "dev": true,
    +      "dependencies": {
    +        "emoji-regex": "^7.0.1",
    +        "is-fullwidth-code-point": "^2.0.0",
    +        "strip-ansi": "^5.1.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/strip-ansi": {
    +      "version": "5.2.0",
    +      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
    +      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-regex": "^4.1.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/strip-bom": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
    +      "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/supports-color": {
    +      "version": "6.1.0",
    +      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
    +      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-flag": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/test-exclude": {
    +      "version": "5.2.3",
    +      "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz",
    +      "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==",
    +      "dev": true,
    +      "dependencies": {
    +        "glob": "^7.1.3",
    +        "minimatch": "^3.0.4",
    +        "read-pkg-up": "^4.0.0",
    +        "require-main-filename": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/uuid": {
    +      "version": "3.4.0",
    +      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
    +      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
    +      "deprecated": "Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.",
    +      "dev": true,
    +      "bin": {
    +        "uuid": "bin/uuid"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/wrap-ansi": {
    +      "version": "5.1.0",
    +      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
    +      "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-styles": "^3.2.0",
    +        "string-width": "^3.0.0",
    +        "strip-ansi": "^5.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/y18n": {
    +      "version": "4.0.3",
    +      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
    +      "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
    +      "dev": true
    +    },
    +    "node_modules/nyc/node_modules/yargs": {
    +      "version": "13.3.2",
    +      "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
    +      "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
    +      "dev": true,
    +      "dependencies": {
    +        "cliui": "^5.0.0",
    +        "find-up": "^3.0.0",
    +        "get-caller-file": "^2.0.1",
    +        "require-directory": "^2.1.1",
    +        "require-main-filename": "^2.0.0",
    +        "set-blocking": "^2.0.0",
    +        "string-width": "^3.0.0",
    +        "which-module": "^2.0.0",
    +        "y18n": "^4.0.0",
    +        "yargs-parser": "^13.1.2"
    +      }
    +    },
    +    "node_modules/nyc/node_modules/yargs-parser": {
    +      "version": "13.1.2",
    +      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
    +      "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
    +      "dev": true,
    +      "dependencies": {
    +        "camelcase": "^5.0.0",
    +        "decamelize": "^1.2.0"
    +      }
    +    },
    +    "node_modules/object-assign": {
    +      "version": "4.1.1",
    +      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
    +      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/object-inspect": {
    +      "version": "1.13.1",
    +      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
    +      "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
    +      "dev": true,
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/object-is": {
    +      "version": "1.1.5",
    +      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
    +      "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.1.3"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/object-keys": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
    +      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.4"
    +      }
    +    },
    +    "node_modules/object.assign": {
    +      "version": "4.1.5",
    +      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
    +      "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.5",
    +        "define-properties": "^1.2.1",
    +        "has-symbols": "^1.0.3",
    +        "object-keys": "^1.1.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/object.entries": {
    +      "version": "1.1.7",
    +      "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz",
    +      "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.2.0",
    +        "es-abstract": "^1.22.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      }
    +    },
    +    "node_modules/object.fromentries": {
    +      "version": "2.0.7",
    +      "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz",
    +      "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.2.0",
    +        "es-abstract": "^1.22.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/object.groupby": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz",
    +      "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.2.0",
    +        "es-abstract": "^1.22.1",
    +        "get-intrinsic": "^1.2.1"
    +      }
    +    },
    +    "node_modules/object.hasown": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz",
    +      "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==",
    +      "dev": true,
    +      "dependencies": {
    +        "define-properties": "^1.2.0",
    +        "es-abstract": "^1.22.1"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/object.values": {
    +      "version": "1.1.7",
    +      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz",
    +      "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.2.0",
    +        "es-abstract": "^1.22.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/on-finished": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
    +      "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
    +      "dev": true,
    +      "dependencies": {
    +        "ee-first": "1.1.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/once": {
    +      "version": "1.4.0",
    +      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
    +      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
    +      "dev": true,
    +      "dependencies": {
    +        "wrappy": "1"
    +      }
    +    },
    +    "node_modules/onetime": {
    +      "version": "5.1.2",
    +      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
    +      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
    +      "dev": true,
    +      "dependencies": {
    +        "mimic-fn": "^2.1.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/open": {
    +      "version": "6.4.0",
    +      "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz",
    +      "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-wsl": "^1.1.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/opencollective-postinstall": {
    +      "version": "2.0.3",
    +      "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
    +      "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==",
    +      "dev": true,
    +      "bin": {
    +        "opencollective-postinstall": "index.js"
    +      }
    +    },
    +    "node_modules/opener": {
    +      "version": "1.5.2",
    +      "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
    +      "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
    +      "dev": true,
    +      "bin": {
    +        "opener": "bin/opener-bin.js"
    +      }
    +    },
    +    "node_modules/optionator": {
    +      "version": "0.8.3",
    +      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
    +      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
    +      "dev": true,
    +      "dependencies": {
    +        "deep-is": "~0.1.3",
    +        "fast-levenshtein": "~2.0.6",
    +        "levn": "~0.3.0",
    +        "prelude-ls": "~1.1.2",
    +        "type-check": "~0.3.2",
    +        "word-wrap": "~1.2.3"
    +      },
    +      "engines": {
    +        "node": ">= 0.8.0"
    +      }
    +    },
    +    "node_modules/opts": {
    +      "version": "2.0.2",
    +      "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz",
    +      "integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==",
    +      "dev": true
    +    },
    +    "node_modules/os-homedir": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
    +      "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/os-shim": {
    +      "version": "0.1.3",
    +      "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz",
    +      "integrity": "sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.4.0"
    +      }
    +    },
    +    "node_modules/own-or": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz",
    +      "integrity": "sha512-NfZr5+Tdf6MB8UI9GLvKRs4cXY8/yB0w3xtt84xFdWy8hkGjn+JFc60VhzS/hFRfbyxFcGYMTjnF4Me+RbbqrA==",
    +      "dev": true
    +    },
    +    "node_modules/own-or-env": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.2.tgz",
    +      "integrity": "sha512-NQ7v0fliWtK7Lkb+WdFqe6ky9XAzYmlkXthQrBbzlYbmFKoAYbDDcwmOm6q8kOuwSRXW8bdL5ORksploUJmWgw==",
    +      "dev": true,
    +      "dependencies": {
    +        "own-or": "^1.0.0"
    +      }
    +    },
    +    "node_modules/p-cancelable": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
    +      "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/p-event": {
    +      "version": "4.2.0",
    +      "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz",
    +      "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-timeout": "^3.1.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/p-finally": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
    +      "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/p-limit": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
    +      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "yocto-queue": "^0.1.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/p-locate": {
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
    +      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-limit": "^2.2.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/p-locate/node_modules/p-limit": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
    +      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-try": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/p-map": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
    +      "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "aggregate-error": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/p-timeout": {
    +      "version": "3.2.0",
    +      "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
    +      "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-finally": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/p-try": {
    +      "version": "2.2.0",
    +      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
    +      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/pac-proxy-agent": {
    +      "version": "7.0.1",
    +      "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz",
    +      "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==",
    +      "dev": true,
    +      "dependencies": {
    +        "@tootallnate/quickjs-emscripten": "^0.23.0",
    +        "agent-base": "^7.0.2",
    +        "debug": "^4.3.4",
    +        "get-uri": "^6.0.1",
    +        "http-proxy-agent": "^7.0.0",
    +        "https-proxy-agent": "^7.0.2",
    +        "pac-resolver": "^7.0.0",
    +        "socks-proxy-agent": "^8.0.2"
    +      },
    +      "engines": {
    +        "node": ">= 14"
    +      }
    +    },
    +    "node_modules/pac-proxy-agent/node_modules/debug": {
    +      "version": "4.3.4",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
    +      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/pac-proxy-agent/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": {
    +      "version": "8.0.2",
    +      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz",
    +      "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==",
    +      "dev": true,
    +      "dependencies": {
    +        "agent-base": "^7.0.2",
    +        "debug": "^4.3.4",
    +        "socks": "^2.7.1"
    +      },
    +      "engines": {
    +        "node": ">= 14"
    +      }
    +    },
    +    "node_modules/pac-resolver": {
    +      "version": "7.0.0",
    +      "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.0.tgz",
    +      "integrity": "sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==",
    +      "dev": true,
    +      "dependencies": {
    +        "degenerator": "^5.0.0",
    +        "ip": "^1.1.8",
    +        "netmask": "^2.0.2"
    +      },
    +      "engines": {
    +        "node": ">= 14"
    +      }
    +    },
    +    "node_modules/package-hash": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz",
    +      "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==",
    +      "dev": true,
    +      "dependencies": {
    +        "graceful-fs": "^4.1.15",
    +        "hasha": "^3.0.0",
    +        "lodash.flattendeep": "^4.4.0",
    +        "release-zalgo": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/package-json": {
    +      "version": "6.5.0",
    +      "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
    +      "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "got": "^9.6.0",
    +        "registry-auth-token": "^4.0.0",
    +        "registry-url": "^5.0.0",
    +        "semver": "^6.2.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/package-json/node_modules/semver": {
    +      "version": "6.3.1",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
    +      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
    +      "dev": true,
    +      "bin": {
    +        "semver": "bin/semver.js"
    +      }
    +    },
    +    "node_modules/pako": {
    +      "version": "1.0.11",
    +      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
    +      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
    +      "dev": true
    +    },
    +    "node_modules/parent-module": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
    +      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
    +      "dev": true,
    +      "dependencies": {
    +        "callsites": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/parent-require": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/parent-require/-/parent-require-1.0.0.tgz",
    +      "integrity": "sha512-2MXDNZC4aXdkkap+rBBMv0lUsfJqvX5/2FiYYnfCnorZt3Pk06/IOR5KeaoghgS2w07MLWgjbsnyaq6PdHn2LQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.4.0"
    +      }
    +    },
    +    "node_modules/parse-json": {
    +      "version": "5.2.0",
    +      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
    +      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/code-frame": "^7.0.0",
    +        "error-ex": "^1.3.1",
    +        "json-parse-even-better-errors": "^2.3.0",
    +        "lines-and-columns": "^1.1.6"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/parse-multipart-data": {
    +      "version": "1.5.0",
    +      "resolved": "https://registry.npmjs.org/parse-multipart-data/-/parse-multipart-data-1.5.0.tgz",
    +      "integrity": "sha512-ck5zaMF0ydjGfejNMnlo5YU2oJ+pT+80Jb1y4ybanT27j+zbVP/jkYmCrUGsEln0Ox/hZmuvgy8Ra7AxbXP2Mw==",
    +      "dev": true
    +    },
    +    "node_modules/parse5": {
    +      "version": "7.1.2",
    +      "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
    +      "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
    +      "dev": true,
    +      "dependencies": {
    +        "entities": "^4.4.0"
    +      },
    +      "funding": {
    +        "url": "https://github.com/inikulin/parse5?sponsor=1"
    +      }
    +    },
    +    "node_modules/parseurl": {
    +      "version": "1.3.3",
    +      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
    +      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/path-exists": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
    +      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/path-is-absolute": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
    +      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/path-key": {
    +      "version": "3.1.1",
    +      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
    +      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/path-parse": {
    +      "version": "1.0.7",
    +      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
    +      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
    +      "dev": true
    +    },
    +    "node_modules/path-to-regexp": {
    +      "version": "0.1.7",
    +      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
    +      "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
    +      "dev": true
    +    },
    +    "node_modules/path-type": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
    +      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/pathval": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
    +      "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": "*"
    +      }
    +    },
    +    "node_modules/performance-now": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
    +      "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
    +      "dev": true
    +    },
    +    "node_modules/picocolors": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
    +      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
    +      "dev": true
    +    },
    +    "node_modules/picomatch": {
    +      "version": "2.3.1",
    +      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
    +      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8.6"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/jonschlinkert"
    +      }
    +    },
    +    "node_modules/pidusage": {
    +      "version": "2.0.21",
    +      "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.21.tgz",
    +      "integrity": "sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==",
    +      "dev": true,
    +      "dependencies": {
    +        "safe-buffer": "^5.2.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/pify": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz",
    +      "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/pirates": {
    +      "version": "4.0.6",
    +      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
    +      "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 6"
    +      }
    +    },
    +    "node_modules/pkg-conf": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz",
    +      "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "find-up": "^3.0.0",
    +        "load-json-file": "^5.2.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/pkg-conf/node_modules/find-up": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
    +      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
    +      "dev": true,
    +      "dependencies": {
    +        "locate-path": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/pkg-conf/node_modules/locate-path": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
    +      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-locate": "^3.0.0",
    +        "path-exists": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/pkg-conf/node_modules/p-limit": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
    +      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-try": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/pkg-conf/node_modules/p-locate": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
    +      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "p-limit": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/pkg-conf/node_modules/path-exists": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
    +      "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/pkg-dir": {
    +      "version": "4.2.0",
    +      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
    +      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "find-up": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/plur": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz",
    +      "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==",
    +      "dev": true,
    +      "dependencies": {
    +        "irregular-plurals": "^3.2.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/portfinder": {
    +      "version": "1.0.28",
    +      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
    +      "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
    +      "dev": true,
    +      "dependencies": {
    +        "async": "^2.6.2",
    +        "debug": "^3.1.1",
    +        "mkdirp": "^0.5.5"
    +      },
    +      "engines": {
    +        "node": ">= 0.12.0"
    +      }
    +    },
    +    "node_modules/portfinder/node_modules/debug": {
    +      "version": "3.2.7",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
    +      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "^2.1.1"
    +      }
    +    },
    +    "node_modules/portfinder/node_modules/ms": {
    +      "version": "2.1.3",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
    +      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
    +      "dev": true
    +    },
    +    "node_modules/pre-commit": {
    +      "version": "1.2.2",
    +      "resolved": "https://registry.npmjs.org/pre-commit/-/pre-commit-1.2.2.tgz",
    +      "integrity": "sha512-qokTiqxD6GjODy5ETAIgzsRgnBWWQHQH2ghy86PU7mIn/wuWeTwF3otyNQZxWBwVn8XNr8Tdzj/QfUXpH+gRZA==",
    +      "dev": true,
    +      "hasInstallScript": true,
    +      "dependencies": {
    +        "cross-spawn": "^5.0.1",
    +        "spawn-sync": "^1.0.15",
    +        "which": "1.2.x"
    +      }
    +    },
    +    "node_modules/pre-commit/node_modules/cross-spawn": {
    +      "version": "5.1.0",
    +      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
    +      "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==",
    +      "dev": true,
    +      "dependencies": {
    +        "lru-cache": "^4.0.1",
    +        "shebang-command": "^1.2.0",
    +        "which": "^1.2.9"
    +      }
    +    },
    +    "node_modules/pre-commit/node_modules/lru-cache": {
    +      "version": "4.1.5",
    +      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
    +      "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
    +      "dev": true,
    +      "dependencies": {
    +        "pseudomap": "^1.0.2",
    +        "yallist": "^2.1.2"
    +      }
    +    },
    +    "node_modules/pre-commit/node_modules/shebang-command": {
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
    +      "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
    +      "dev": true,
    +      "dependencies": {
    +        "shebang-regex": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/pre-commit/node_modules/shebang-regex": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
    +      "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/pre-commit/node_modules/which": {
    +      "version": "1.2.14",
    +      "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz",
    +      "integrity": "sha512-16uPglFkRPzgiUXYMi1Jf8Z5EzN1iB4V0ZtMXcHZnwsBtQhhHeCqoWw7tsUY42hJGNDWtUsVLTjakIa5BgAxCw==",
    +      "dev": true,
    +      "dependencies": {
    +        "isexe": "^2.0.0"
    +      },
    +      "bin": {
    +        "which": "bin/which"
    +      }
    +    },
    +    "node_modules/pre-commit/node_modules/yallist": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
    +      "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
    +      "dev": true
    +    },
    +    "node_modules/prelude-ls": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
    +      "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.8.0"
    +      }
    +    },
    +    "node_modules/prepend-http": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
    +      "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/pretty-format": {
    +      "version": "29.7.0",
    +      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
    +      "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/schemas": "^29.6.3",
    +        "ansi-styles": "^5.0.0",
    +        "react-is": "^18.0.0"
    +      },
    +      "engines": {
    +        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
    +      }
    +    },
    +    "node_modules/pretty-format/node_modules/ansi-styles": {
    +      "version": "5.2.0",
    +      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
    +      "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
    +      }
    +    },
    +    "node_modules/prismjs": {
    +      "version": "1.29.0",
    +      "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
    +      "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/process-nextick-args": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
    +      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
    +      "dev": true
    +    },
    +    "node_modules/process-on-spawn": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz",
    +      "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==",
    +      "dev": true,
    +      "dependencies": {
    +        "fromentries": "^1.2.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/prompts": {
    +      "version": "2.4.2",
    +      "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
    +      "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "kleur": "^3.0.3",
    +        "sisteransi": "^1.0.5"
    +      },
    +      "engines": {
    +        "node": ">= 6"
    +      }
    +    },
    +    "node_modules/prop-types": {
    +      "version": "15.8.1",
    +      "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
    +      "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
    +      "dev": true,
    +      "dependencies": {
    +        "loose-envify": "^1.4.0",
    +        "object-assign": "^4.1.1",
    +        "react-is": "^16.13.1"
    +      }
    +    },
    +    "node_modules/prop-types/node_modules/react-is": {
    +      "version": "16.13.1",
    +      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
    +      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
    +      "dev": true
    +    },
    +    "node_modules/proxy": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/proxy/-/proxy-1.0.2.tgz",
    +      "integrity": "sha512-KNac2ueWRpjbUh77OAFPZuNdfEqNynm9DD4xHT14CccGpW8wKZwEkN0yjlb7X9G9Z9F55N0Q+1z+WfgAhwYdzQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "args": "5.0.1",
    +        "basic-auth-parser": "0.0.2",
    +        "debug": "^4.1.1"
    +      },
    +      "bin": {
    +        "proxy": "bin/proxy.js"
    +      }
    +    },
    +    "node_modules/proxy-addr": {
    +      "version": "2.0.7",
    +      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
    +      "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
    +      "dev": true,
    +      "dependencies": {
    +        "forwarded": "0.2.0",
    +        "ipaddr.js": "1.9.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.10"
    +      }
    +    },
    +    "node_modules/proxy-from-env": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
    +      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
    +      "dev": true
    +    },
    +    "node_modules/proxy/node_modules/debug": {
    +      "version": "4.3.4",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
    +      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/proxy/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/proxyquire": {
    +      "version": "2.1.3",
    +      "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz",
    +      "integrity": "sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==",
    +      "dev": true,
    +      "dependencies": {
    +        "fill-keys": "^1.0.2",
    +        "module-not-found-error": "^1.0.1",
    +        "resolve": "^1.11.1"
    +      }
    +    },
    +    "node_modules/pseudomap": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
    +      "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==",
    +      "dev": true
    +    },
    +    "node_modules/psl": {
    +      "version": "1.9.0",
    +      "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
    +      "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
    +      "dev": true
    +    },
    +    "node_modules/pump": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
    +      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
    +      "dev": true,
    +      "dependencies": {
    +        "end-of-stream": "^1.1.0",
    +        "once": "^1.3.1"
    +      }
    +    },
    +    "node_modules/punycode": {
    +      "version": "2.3.1",
    +      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
    +      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/pupa": {
    +      "version": "2.1.1",
    +      "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz",
    +      "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==",
    +      "dev": true,
    +      "dependencies": {
    +        "escape-goat": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/pure-rand": {
    +      "version": "6.0.4",
    +      "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz",
    +      "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "individual",
    +          "url": "https://github.com/sponsors/dubzzz"
    +        },
    +        {
    +          "type": "opencollective",
    +          "url": "https://opencollective.com/fast-check"
    +        }
    +      ]
    +    },
    +    "node_modules/qs": {
    +      "version": "6.11.0",
    +      "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
    +      "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "side-channel": "^1.0.4"
    +      },
    +      "engines": {
    +        "node": ">=0.6"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/querystringify": {
    +      "version": "2.2.0",
    +      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
    +      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
    +      "dev": true
    +    },
    +    "node_modules/queue-microtask": {
    +      "version": "1.2.3",
    +      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
    +      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/feross"
    +        },
    +        {
    +          "type": "patreon",
    +          "url": "https://www.patreon.com/feross"
    +        },
    +        {
    +          "type": "consulting",
    +          "url": "https://feross.org/support"
    +        }
    +      ]
    +    },
    +    "node_modules/quick-lru": {
    +      "version": "5.1.1",
    +      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
    +      "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/randombytes": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
    +      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "safe-buffer": "^5.1.0"
    +      }
    +    },
    +    "node_modules/range-parser": {
    +      "version": "1.2.1",
    +      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
    +      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/raw-body": {
    +      "version": "2.5.2",
    +      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
    +      "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
    +      "dev": true,
    +      "dependencies": {
    +        "bytes": "3.1.2",
    +        "http-errors": "2.0.0",
    +        "iconv-lite": "0.4.24",
    +        "unpipe": "1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/rc": {
    +      "version": "1.2.8",
    +      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
    +      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
    +      "dev": true,
    +      "dependencies": {
    +        "deep-extend": "^0.6.0",
    +        "ini": "~1.3.0",
    +        "minimist": "^1.2.0",
    +        "strip-json-comments": "~2.0.1"
    +      },
    +      "bin": {
    +        "rc": "cli.js"
    +      }
    +    },
    +    "node_modules/rc/node_modules/strip-json-comments": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
    +      "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/react-is": {
    +      "version": "18.2.0",
    +      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
    +      "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
    +      "dev": true
    +    },
    +    "node_modules/read-pkg": {
    +      "version": "5.2.0",
    +      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
    +      "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/normalize-package-data": "^2.4.0",
    +        "normalize-package-data": "^2.5.0",
    +        "parse-json": "^5.0.0",
    +        "type-fest": "^0.6.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/read-pkg-up": {
    +      "version": "7.0.1",
    +      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
    +      "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
    +      "dev": true,
    +      "dependencies": {
    +        "find-up": "^4.1.0",
    +        "read-pkg": "^5.2.0",
    +        "type-fest": "^0.8.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/read-pkg-up/node_modules/type-fest": {
    +      "version": "0.8.1",
    +      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
    +      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/read-pkg/node_modules/hosted-git-info": {
    +      "version": "2.8.9",
    +      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
    +      "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
    +      "dev": true
    +    },
    +    "node_modules/read-pkg/node_modules/normalize-package-data": {
    +      "version": "2.5.0",
    +      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
    +      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
    +      "dev": true,
    +      "dependencies": {
    +        "hosted-git-info": "^2.1.4",
    +        "resolve": "^1.10.0",
    +        "semver": "2 || 3 || 4 || 5",
    +        "validate-npm-package-license": "^3.0.1"
    +      }
    +    },
    +    "node_modules/read-pkg/node_modules/semver": {
    +      "version": "5.7.2",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
    +      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
    +      "dev": true,
    +      "bin": {
    +        "semver": "bin/semver"
    +      }
    +    },
    +    "node_modules/read-pkg/node_modules/type-fest": {
    +      "version": "0.6.0",
    +      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
    +      "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/read-tls-client-hello": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/read-tls-client-hello/-/read-tls-client-hello-1.0.1.tgz",
    +      "integrity": "sha512-OvSzfVv6Y656ekUxB7aDhWkLW7y1ck16ChfLFNJhKNADFNweH2fvyiEZkGmmdtXbOtlNuH2zVXZoFCW349M+GA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/node": "*"
    +      },
    +      "engines": {
    +        "node": ">=12.0.0"
    +      }
    +    },
    +    "node_modules/readable-stream": {
    +      "version": "2.3.8",
    +      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
    +      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
    +      "dev": true,
    +      "dependencies": {
    +        "core-util-is": "~1.0.0",
    +        "inherits": "~2.0.3",
    +        "isarray": "~1.0.0",
    +        "process-nextick-args": "~2.0.0",
    +        "safe-buffer": "~5.1.1",
    +        "string_decoder": "~1.1.1",
    +        "util-deprecate": "~1.0.1"
    +      }
    +    },
    +    "node_modules/readable-stream/node_modules/safe-buffer": {
    +      "version": "5.1.2",
    +      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
    +      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
    +      "dev": true
    +    },
    +    "node_modules/readdirp": {
    +      "version": "3.6.0",
    +      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
    +      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
    +      "dev": true,
    +      "dependencies": {
    +        "picomatch": "^2.2.1"
    +      },
    +      "engines": {
    +        "node": ">=8.10.0"
    +      }
    +    },
    +    "node_modules/redent": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
    +      "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
    +      "dev": true,
    +      "dependencies": {
    +        "indent-string": "^4.0.0",
    +        "strip-indent": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/reflect-metadata": {
    +      "version": "0.1.13",
    +      "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz",
    +      "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==",
    +      "dev": true
    +    },
    +    "node_modules/reflect.getprototypeof": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz",
    +      "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.2.0",
    +        "es-abstract": "^1.22.1",
    +        "get-intrinsic": "^1.2.1",
    +        "globalthis": "^1.0.3",
    +        "which-builtin-type": "^1.1.3"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/regenerator-runtime": {
    +      "version": "0.14.0",
    +      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
    +      "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==",
    +      "dev": true
    +    },
    +    "node_modules/regexp.prototype.flags": {
    +      "version": "1.5.1",
    +      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz",
    +      "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.2.0",
    +        "set-function-name": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/regexpp": {
    +      "version": "3.2.0",
    +      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
    +      "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/mysticatea"
    +      }
    +    },
    +    "node_modules/registry-auth-token": {
    +      "version": "4.2.2",
    +      "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz",
    +      "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==",
    +      "dev": true,
    +      "dependencies": {
    +        "rc": "1.2.8"
    +      },
    +      "engines": {
    +        "node": ">=6.0.0"
    +      }
    +    },
    +    "node_modules/registry-url": {
    +      "version": "5.1.0",
    +      "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
    +      "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
    +      "dev": true,
    +      "dependencies": {
    +        "rc": "^1.2.8"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/release-zalgo": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz",
    +      "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==",
    +      "dev": true,
    +      "dependencies": {
    +        "es6-error": "^4.0.1"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/require-directory": {
    +      "version": "2.1.1",
    +      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
    +      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/require-from-string": {
    +      "version": "2.0.2",
    +      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
    +      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/require-main-filename": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
    +      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
    +      "dev": true
    +    },
    +    "node_modules/requires-port": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
    +      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
    +      "dev": true
    +    },
    +    "node_modules/resolve": {
    +      "version": "1.22.8",
    +      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
    +      "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-core-module": "^2.13.0",
    +        "path-parse": "^1.0.7",
    +        "supports-preserve-symlinks-flag": "^1.0.0"
    +      },
    +      "bin": {
    +        "resolve": "bin/resolve"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/resolve-alpn": {
    +      "version": "1.2.1",
    +      "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
    +      "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
    +      "dev": true
    +    },
    +    "node_modules/resolve-cwd": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
    +      "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
    +      "dev": true,
    +      "dependencies": {
    +        "resolve-from": "^5.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/resolve-cwd/node_modules/resolve-from": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
    +      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/resolve-from": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
    +      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/resolve-pathname": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz",
    +      "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==",
    +      "dev": true
    +    },
    +    "node_modules/resolve.exports": {
    +      "version": "2.0.2",
    +      "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz",
    +      "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/responselike": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
    +      "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "lowercase-keys": "^1.0.0"
    +      }
    +    },
    +    "node_modules/reusify": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
    +      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
    +      "dev": true,
    +      "engines": {
    +        "iojs": ">=1.0.0",
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/rimraf": {
    +      "version": "2.7.1",
    +      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
    +      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
    +      "dev": true,
    +      "dependencies": {
    +        "glob": "^7.1.3"
    +      },
    +      "bin": {
    +        "rimraf": "bin.js"
    +      }
    +    },
    +    "node_modules/rrweb-cssom": {
    +      "version": "0.6.0",
    +      "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz",
    +      "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==",
    +      "dev": true
    +    },
    +    "node_modules/run-parallel": {
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
    +      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/feross"
    +        },
    +        {
    +          "type": "patreon",
    +          "url": "https://www.patreon.com/feross"
    +        },
    +        {
    +          "type": "consulting",
    +          "url": "https://feross.org/support"
    +        }
    +      ],
    +      "dependencies": {
    +        "queue-microtask": "^1.2.2"
    +      }
    +    },
    +    "node_modules/rxjs": {
    +      "version": "7.8.1",
    +      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
    +      "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
    +      "dev": true,
    +      "dependencies": {
    +        "tslib": "^2.1.0"
    +      }
    +    },
    +    "node_modules/safe-array-concat": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz",
    +      "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "get-intrinsic": "^1.2.1",
    +        "has-symbols": "^1.0.3",
    +        "isarray": "^2.0.5"
    +      },
    +      "engines": {
    +        "node": ">=0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/safe-array-concat/node_modules/isarray": {
    +      "version": "2.0.5",
    +      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
    +      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
    +      "dev": true
    +    },
    +    "node_modules/safe-buffer": {
    +      "version": "5.2.1",
    +      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
    +      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/feross"
    +        },
    +        {
    +          "type": "patreon",
    +          "url": "https://www.patreon.com/feross"
    +        },
    +        {
    +          "type": "consulting",
    +          "url": "https://feross.org/support"
    +        }
    +      ]
    +    },
    +    "node_modules/safe-regex-test": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
    +      "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "get-intrinsic": "^1.1.3",
    +        "is-regex": "^1.1.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/safer-buffer": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
    +      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
    +      "dev": true
    +    },
    +    "node_modules/saxes": {
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
    +      "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
    +      "dev": true,
    +      "dependencies": {
    +        "xmlchars": "^2.2.0"
    +      },
    +      "engines": {
    +        "node": ">=v12.22.7"
    +      }
    +    },
    +    "node_modules/selfsigned": {
    +      "version": "2.4.1",
    +      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz",
    +      "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/node-forge": "^1.3.0",
    +        "node-forge": "^1"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/semver": {
    +      "version": "7.5.4",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
    +      "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
    +      "dev": true,
    +      "dependencies": {
    +        "lru-cache": "^6.0.0"
    +      },
    +      "bin": {
    +        "semver": "bin/semver.js"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/semver-diff": {
    +      "version": "3.1.1",
    +      "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
    +      "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
    +      "dev": true,
    +      "dependencies": {
    +        "semver": "^6.3.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/semver-diff/node_modules/semver": {
    +      "version": "6.3.1",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
    +      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
    +      "dev": true,
    +      "bin": {
    +        "semver": "bin/semver.js"
    +      }
    +    },
    +    "node_modules/semver/node_modules/lru-cache": {
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
    +      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
    +      "dev": true,
    +      "dependencies": {
    +        "yallist": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/semver/node_modules/yallist": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
    +      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
    +      "dev": true
    +    },
    +    "node_modules/send": {
    +      "version": "0.18.0",
    +      "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
    +      "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
    +      "dev": true,
    +      "dependencies": {
    +        "debug": "2.6.9",
    +        "depd": "2.0.0",
    +        "destroy": "1.2.0",
    +        "encodeurl": "~1.0.2",
    +        "escape-html": "~1.0.3",
    +        "etag": "~1.8.1",
    +        "fresh": "0.5.2",
    +        "http-errors": "2.0.0",
    +        "mime": "1.6.0",
    +        "ms": "2.1.3",
    +        "on-finished": "2.4.1",
    +        "range-parser": "~1.2.1",
    +        "statuses": "2.0.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.8.0"
    +      }
    +    },
    +    "node_modules/send/node_modules/ms": {
    +      "version": "2.1.3",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
    +      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
    +      "dev": true
    +    },
    +    "node_modules/send/node_modules/on-finished": {
    +      "version": "2.4.1",
    +      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
    +      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
    +      "dev": true,
    +      "dependencies": {
    +        "ee-first": "1.1.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/send/node_modules/statuses": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
    +      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/serialize-javascript": {
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
    +      "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
    +      "dev": true,
    +      "dependencies": {
    +        "randombytes": "^2.1.0"
    +      }
    +    },
    +    "node_modules/serve-static": {
    +      "version": "1.15.0",
    +      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
    +      "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
    +      "dev": true,
    +      "dependencies": {
    +        "encodeurl": "~1.0.2",
    +        "escape-html": "~1.0.3",
    +        "parseurl": "~1.3.3",
    +        "send": "0.18.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.8.0"
    +      }
    +    },
    +    "node_modules/set-blocking": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
    +      "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
    +      "dev": true
    +    },
    +    "node_modules/set-function-length": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
    +      "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "define-data-property": "^1.1.1",
    +        "get-intrinsic": "^1.2.1",
    +        "gopd": "^1.0.1",
    +        "has-property-descriptors": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      }
    +    },
    +    "node_modules/set-function-name": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
    +      "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
    +      "dev": true,
    +      "dependencies": {
    +        "define-data-property": "^1.0.1",
    +        "functions-have-names": "^1.2.3",
    +        "has-property-descriptors": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      }
    +    },
    +    "node_modules/setprototypeof": {
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
    +      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
    +      "dev": true
    +    },
    +    "node_modules/shebang-command": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
    +      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
    +      "dev": true,
    +      "dependencies": {
    +        "shebang-regex": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/shebang-regex": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
    +      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/shell-quote": {
    +      "version": "1.8.1",
    +      "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
    +      "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
    +      "dev": true,
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/side-channel": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
    +      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.0",
    +        "get-intrinsic": "^1.0.2",
    +        "object-inspect": "^1.9.0"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/signal-exit": {
    +      "version": "3.0.7",
    +      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
    +      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
    +      "dev": true
    +    },
    +    "node_modules/sinon": {
    +      "version": "17.0.1",
    +      "resolved": "https://registry.npmjs.org/sinon/-/sinon-17.0.1.tgz",
    +      "integrity": "sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==",
    +      "dev": true,
    +      "dependencies": {
    +        "@sinonjs/commons": "^3.0.0",
    +        "@sinonjs/fake-timers": "^11.2.2",
    +        "@sinonjs/samsam": "^8.0.0",
    +        "diff": "^5.1.0",
    +        "nise": "^5.1.5",
    +        "supports-color": "^7.2.0"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/sinon"
    +      }
    +    },
    +    "node_modules/sinon/node_modules/diff": {
    +      "version": "5.1.0",
    +      "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz",
    +      "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.3.1"
    +      }
    +    },
    +    "node_modules/sinon/node_modules/supports-color": {
    +      "version": "7.2.0",
    +      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
    +      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-flag": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/sisteransi": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
    +      "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
    +      "dev": true
    +    },
    +    "node_modules/slash": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
    +      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/slice-ansi": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
    +      "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-styles": "^4.0.0",
    +        "astral-regex": "^2.0.0",
    +        "is-fullwidth-code-point": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/chalk/slice-ansi?sponsor=1"
    +      }
    +    },
    +    "node_modules/smart-buffer": {
    +      "version": "4.2.0",
    +      "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
    +      "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 6.0.0",
    +        "npm": ">= 3.0.0"
    +      }
    +    },
    +    "node_modules/snazzy": {
    +      "version": "9.0.0",
    +      "resolved": "https://registry.npmjs.org/snazzy/-/snazzy-9.0.0.tgz",
    +      "integrity": "sha512-8QZmJb11OiYaUP90Nnjqcj/LEpO8CLgChnP87Wqjv5tNB4djwHaz27VO2usSRR0NmViapeGW04p0aWAMhxxLXg==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/feross"
    +        },
    +        {
    +          "type": "patreon",
    +          "url": "https://www.patreon.com/feross"
    +        },
    +        {
    +          "type": "consulting",
    +          "url": "https://feross.org/support"
    +        }
    +      ],
    +      "dependencies": {
    +        "chalk": "^4.1.0",
    +        "inherits": "^2.0.4",
    +        "minimist": "^1.2.5",
    +        "readable-stream": "^3.6.0",
    +        "standard-json": "^1.1.0",
    +        "strip-ansi": "^6.0.0",
    +        "text-table": "^0.2.0"
    +      },
    +      "bin": {
    +        "snazzy": "bin/cmd.js"
    +      }
    +    },
    +    "node_modules/snazzy/node_modules/readable-stream": {
    +      "version": "3.6.2",
    +      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
    +      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
    +      "dev": true,
    +      "dependencies": {
    +        "inherits": "^2.0.3",
    +        "string_decoder": "^1.1.1",
    +        "util-deprecate": "^1.0.1"
    +      },
    +      "engines": {
    +        "node": ">= 6"
    +      }
    +    },
    +    "node_modules/socks": {
    +      "version": "2.7.1",
    +      "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
    +      "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ip": "^2.0.0",
    +        "smart-buffer": "^4.2.0"
    +      },
    +      "engines": {
    +        "node": ">= 10.13.0",
    +        "npm": ">= 3.0.0"
    +      }
    +    },
    +    "node_modules/socks-proxy-agent": {
    +      "version": "7.0.0",
    +      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz",
    +      "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==",
    +      "dev": true,
    +      "dependencies": {
    +        "agent-base": "^6.0.2",
    +        "debug": "^4.3.3",
    +        "socks": "^2.6.2"
    +      },
    +      "engines": {
    +        "node": ">= 10"
    +      }
    +    },
    +    "node_modules/socks-proxy-agent/node_modules/agent-base": {
    +      "version": "6.0.2",
    +      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
    +      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "debug": "4"
    +      },
    +      "engines": {
    +        "node": ">= 6.0.0"
    +      }
    +    },
    +    "node_modules/socks-proxy-agent/node_modules/debug": {
    +      "version": "4.3.4",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
    +      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/socks-proxy-agent/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/socks/node_modules/ip": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
    +      "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==",
    +      "dev": true
    +    },
    +    "node_modules/source-map": {
    +      "version": "0.6.1",
    +      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
    +      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/source-map-support": {
    +      "version": "0.5.13",
    +      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
    +      "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
    +      "dev": true,
    +      "dependencies": {
    +        "buffer-from": "^1.0.0",
    +        "source-map": "^0.6.0"
    +      }
    +    },
    +    "node_modules/spawn-command": {
    +      "version": "0.0.2",
    +      "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz",
    +      "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==",
    +      "dev": true
    +    },
    +    "node_modules/spawn-sync": {
    +      "version": "1.0.15",
    +      "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz",
    +      "integrity": "sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==",
    +      "dev": true,
    +      "hasInstallScript": true,
    +      "dependencies": {
    +        "concat-stream": "^1.4.7",
    +        "os-shim": "^0.1.2"
    +      }
    +    },
    +    "node_modules/spawn-wrap": {
    +      "version": "1.4.3",
    +      "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.3.tgz",
    +      "integrity": "sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw==",
    +      "dev": true,
    +      "dependencies": {
    +        "foreground-child": "^1.5.6",
    +        "mkdirp": "^0.5.0",
    +        "os-homedir": "^1.0.1",
    +        "rimraf": "^2.6.2",
    +        "signal-exit": "^3.0.2",
    +        "which": "^1.3.0"
    +      }
    +    },
    +    "node_modules/spawn-wrap/node_modules/which": {
    +      "version": "1.3.1",
    +      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
    +      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "isexe": "^2.0.0"
    +      },
    +      "bin": {
    +        "which": "bin/which"
    +      }
    +    },
    +    "node_modules/spdx-correct": {
    +      "version": "3.2.0",
    +      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
    +      "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
    +      "dev": true,
    +      "dependencies": {
    +        "spdx-expression-parse": "^3.0.0",
    +        "spdx-license-ids": "^3.0.0"
    +      }
    +    },
    +    "node_modules/spdx-exceptions": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
    +      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
    +      "dev": true
    +    },
    +    "node_modules/spdx-expression-parse": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
    +      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "spdx-exceptions": "^2.1.0",
    +        "spdx-license-ids": "^3.0.0"
    +      }
    +    },
    +    "node_modules/spdx-license-ids": {
    +      "version": "3.0.16",
    +      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz",
    +      "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==",
    +      "dev": true
    +    },
    +    "node_modules/sprintf-js": {
    +      "version": "1.0.3",
    +      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
    +      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
    +      "dev": true
    +    },
    +    "node_modules/stack-utils": {
    +      "version": "2.0.6",
    +      "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
    +      "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "escape-string-regexp": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/stack-utils/node_modules/escape-string-regexp": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
    +      "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/standard": {
    +      "version": "17.1.0",
    +      "resolved": "https://registry.npmjs.org/standard/-/standard-17.1.0.tgz",
    +      "integrity": "sha512-jaDqlNSzLtWYW4lvQmU0EnxWMUGQiwHasZl5ZEIwx3S/ijZDjZOzs1y1QqKwKs5vqnFpGtizo4NOYX2s0Voq/g==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/feross"
    +        },
    +        {
    +          "type": "patreon",
    +          "url": "https://www.patreon.com/feross"
    +        },
    +        {
    +          "type": "consulting",
    +          "url": "https://feross.org/support"
    +        }
    +      ],
    +      "dependencies": {
    +        "eslint": "^8.41.0",
    +        "eslint-config-standard": "17.1.0",
    +        "eslint-config-standard-jsx": "^11.0.0",
    +        "eslint-plugin-import": "^2.27.5",
    +        "eslint-plugin-n": "^15.7.0",
    +        "eslint-plugin-promise": "^6.1.1",
    +        "eslint-plugin-react": "^7.32.2",
    +        "standard-engine": "^15.0.0",
    +        "version-guard": "^1.1.1"
    +      },
    +      "bin": {
    +        "standard": "bin/cmd.cjs"
    +      },
    +      "engines": {
    +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    +      }
    +    },
    +    "node_modules/standard-engine": {
    +      "version": "15.1.0",
    +      "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-15.1.0.tgz",
    +      "integrity": "sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/feross"
    +        },
    +        {
    +          "type": "patreon",
    +          "url": "https://www.patreon.com/feross"
    +        },
    +        {
    +          "type": "consulting",
    +          "url": "https://feross.org/support"
    +        }
    +      ],
    +      "dependencies": {
    +        "get-stdin": "^8.0.0",
    +        "minimist": "^1.2.6",
    +        "pkg-conf": "^3.1.0",
    +        "xdg-basedir": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    +      }
    +    },
    +    "node_modules/standard-json": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/standard-json/-/standard-json-1.1.0.tgz",
    +      "integrity": "sha512-nkonX+n5g3pyVBvJZmvRlFtT/7JyLbNh4CtrYC3Qfxihgs8PKX52f6ONKQXORStuBWJ5PI83EUrNXme7LKfiTQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "concat-stream": "^2.0.0"
    +      },
    +      "bin": {
    +        "standard-json": "bin.js"
    +      }
    +    },
    +    "node_modules/standard-json/node_modules/concat-stream": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
    +      "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
    +      "dev": true,
    +      "engines": [
    +        "node >= 6.0"
    +      ],
    +      "dependencies": {
    +        "buffer-from": "^1.0.0",
    +        "inherits": "^2.0.3",
    +        "readable-stream": "^3.0.2",
    +        "typedarray": "^0.0.6"
    +      }
    +    },
    +    "node_modules/standard-json/node_modules/readable-stream": {
    +      "version": "3.6.2",
    +      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
    +      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
    +      "dev": true,
    +      "dependencies": {
    +        "inherits": "^2.0.3",
    +        "string_decoder": "^1.1.1",
    +        "util-deprecate": "^1.0.1"
    +      },
    +      "engines": {
    +        "node": ">= 6"
    +      }
    +    },
    +    "node_modules/statuses": {
    +      "version": "1.5.0",
    +      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
    +      "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/stream-shift": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
    +      "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
    +      "dev": true
    +    },
    +    "node_modules/string_decoder": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
    +      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
    +      "dev": true,
    +      "dependencies": {
    +        "safe-buffer": "~5.1.0"
    +      }
    +    },
    +    "node_modules/string_decoder/node_modules/safe-buffer": {
    +      "version": "5.1.2",
    +      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
    +      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
    +      "dev": true
    +    },
    +    "node_modules/string-length": {
    +      "version": "4.0.2",
    +      "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
    +      "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "char-regex": "^1.0.2",
    +        "strip-ansi": "^6.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/string-width": {
    +      "version": "4.2.3",
    +      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
    +      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
    +      "dev": true,
    +      "dependencies": {
    +        "emoji-regex": "^8.0.0",
    +        "is-fullwidth-code-point": "^3.0.0",
    +        "strip-ansi": "^6.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/string.prototype.matchall": {
    +      "version": "4.0.10",
    +      "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz",
    +      "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.2.0",
    +        "es-abstract": "^1.22.1",
    +        "get-intrinsic": "^1.2.1",
    +        "has-symbols": "^1.0.3",
    +        "internal-slot": "^1.0.5",
    +        "regexp.prototype.flags": "^1.5.0",
    +        "set-function-name": "^2.0.0",
    +        "side-channel": "^1.0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/string.prototype.trim": {
    +      "version": "1.2.8",
    +      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz",
    +      "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.2.0",
    +        "es-abstract": "^1.22.1"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/string.prototype.trimend": {
    +      "version": "1.0.7",
    +      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz",
    +      "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.2.0",
    +        "es-abstract": "^1.22.1"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/string.prototype.trimstart": {
    +      "version": "1.0.7",
    +      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz",
    +      "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.2.0",
    +        "es-abstract": "^1.22.1"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/strip-ansi": {
    +      "version": "6.0.1",
    +      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
    +      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-regex": "^5.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/strip-bom": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
    +      "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/strip-final-newline": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
    +      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/strip-indent": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
    +      "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "min-indent": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/strip-json-comments": {
    +      "version": "3.1.1",
    +      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
    +      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/supports-color": {
    +      "version": "8.1.1",
    +      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
    +      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-flag": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/chalk/supports-color?sponsor=1"
    +      }
    +    },
    +    "node_modules/supports-hyperlinks": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
    +      "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-flag": "^4.0.0",
    +        "supports-color": "^7.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/supports-hyperlinks/node_modules/supports-color": {
    +      "version": "7.2.0",
    +      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
    +      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-flag": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/supports-preserve-symlinks-flag": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
    +      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/symbol-observable": {
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
    +      "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/symbol-tree": {
    +      "version": "3.2.4",
    +      "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
    +      "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
    +      "dev": true
    +    },
    +    "node_modules/table": {
    +      "version": "6.8.1",
    +      "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz",
    +      "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==",
    +      "dev": true,
    +      "dependencies": {
    +        "ajv": "^8.0.1",
    +        "lodash.truncate": "^4.4.2",
    +        "slice-ansi": "^4.0.0",
    +        "string-width": "^4.2.3",
    +        "strip-ansi": "^6.0.1"
    +      },
    +      "engines": {
    +        "node": ">=10.0.0"
    +      }
    +    },
    +    "node_modules/table/node_modules/ajv": {
    +      "version": "8.12.0",
    +      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
    +      "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
    +      "dev": true,
    +      "dependencies": {
    +        "fast-deep-equal": "^3.1.1",
    +        "json-schema-traverse": "^1.0.0",
    +        "require-from-string": "^2.0.2",
    +        "uri-js": "^4.2.2"
    +      },
    +      "funding": {
    +        "type": "github",
    +        "url": "https://github.com/sponsors/epoberezkin"
    +      }
    +    },
    +    "node_modules/table/node_modules/json-schema-traverse": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
    +      "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
    +      "dev": true
    +    },
    +    "node_modules/tap": {
    +      "version": "16.3.9",
    +      "resolved": "https://registry.npmjs.org/tap/-/tap-16.3.9.tgz",
    +      "integrity": "sha512-KKmu12hRJhb/kGvVV/UKBOJ90sNoGbcXF0E+VmNqej1DqaCmZHyOXR8R7E66qg2Wor33XhSHGrku5MPYWSRNWw==",
    +      "bundleDependencies": [
    +        "ink",
    +        "treport",
    +        "@types/react",
    +        "@isaacs/import-jsx",
    +        "react"
    +      ],
    +      "dev": true,
    +      "dependencies": {
    +        "@isaacs/import-jsx": "^4.0.1",
    +        "@types/react": "^17.0.52",
    +        "chokidar": "^3.3.0",
    +        "findit": "^2.0.0",
    +        "foreground-child": "^2.0.0",
    +        "fs-exists-cached": "^1.0.0",
    +        "glob": "^7.2.3",
    +        "ink": "^3.2.0",
    +        "isexe": "^2.0.0",
    +        "istanbul-lib-processinfo": "^2.0.3",
    +        "jackspeak": "^1.4.2",
    +        "libtap": "^1.4.0",
    +        "minipass": "^3.3.4",
    +        "mkdirp": "^1.0.4",
    +        "nyc": "^15.1.0",
    +        "opener": "^1.5.1",
    +        "react": "^17.0.2",
    +        "rimraf": "^3.0.0",
    +        "signal-exit": "^3.0.6",
    +        "source-map-support": "^0.5.16",
    +        "tap-mocha-reporter": "^5.0.3",
    +        "tap-parser": "^11.0.2",
    +        "tap-yaml": "^1.0.2",
    +        "tcompare": "^5.0.7",
    +        "treport": "^3.0.4",
    +        "which": "^2.0.2"
    +      },
    +      "bin": {
    +        "tap": "bin/run.js"
    +      },
    +      "engines": {
    +        "node": ">=12"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/isaacs"
    +      },
    +      "peerDependencies": {
    +        "coveralls": "^3.1.1",
    +        "flow-remove-types": ">=2.112.0",
    +        "ts-node": ">=8.5.2",
    +        "typescript": ">=3.7.2"
    +      },
    +      "peerDependenciesMeta": {
    +        "coveralls": {
    +          "optional": true
    +        },
    +        "flow-remove-types": {
    +          "optional": true
    +        },
    +        "ts-node": {
    +          "optional": true
    +        },
    +        "typescript": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/tap-mocha-reporter": {
    +      "version": "5.0.4",
    +      "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-5.0.4.tgz",
    +      "integrity": "sha512-J+YMO8B7lq1O6Zxd/jeuG27vJ+Y4tLiRMKPSb7KR6FVh86k3Rq1TwYc2GKPyIjCbzzdMdReh3Vfz9L5cg1Z2Bw==",
    +      "dev": true,
    +      "dependencies": {
    +        "color-support": "^1.1.0",
    +        "debug": "^4.1.1",
    +        "diff": "^4.0.1",
    +        "escape-string-regexp": "^2.0.0",
    +        "glob": "^7.0.5",
    +        "tap-parser": "^11.0.0",
    +        "tap-yaml": "^1.0.0",
    +        "unicode-length": "^2.0.2"
    +      },
    +      "bin": {
    +        "tap-mocha-reporter": "index.js"
    +      },
    +      "engines": {
    +        "node": ">= 8"
    +      }
    +    },
    +    "node_modules/tap-mocha-reporter/node_modules/debug": {
    +      "version": "4.3.4",
    +      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
    +      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/tap-mocha-reporter/node_modules/diff": {
    +      "version": "4.0.2",
    +      "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
    +      "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.3.1"
    +      }
    +    },
    +    "node_modules/tap-mocha-reporter/node_modules/escape-string-regexp": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
    +      "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap-mocha-reporter/node_modules/ms": {
    +      "version": "2.1.2",
    +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
    +      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
    +      "dev": true
    +    },
    +    "node_modules/tap-parser": {
    +      "version": "11.0.2",
    +      "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-11.0.2.tgz",
    +      "integrity": "sha512-6qGlC956rcORw+fg7Fv1iCRAY8/bU9UabUAhs3mXRH6eRmVZcNPLheSXCYaVaYeSwx5xa/1HXZb1537YSvwDZg==",
    +      "dev": true,
    +      "dependencies": {
    +        "events-to-array": "^1.0.1",
    +        "minipass": "^3.1.6",
    +        "tap-yaml": "^1.0.0"
    +      },
    +      "bin": {
    +        "tap-parser": "bin/cmd.js"
    +      },
    +      "engines": {
    +        "node": ">= 8"
    +      }
    +    },
    +    "node_modules/tap-yaml": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-1.0.2.tgz",
    +      "integrity": "sha512-GegASpuqBnRNdT1U+yuUPZ8rEU64pL35WPBpCISWwff4dErS2/438barz7WFJl4Nzh3Y05tfPidZnH+GaV1wMg==",
    +      "dev": true,
    +      "dependencies": {
    +        "yaml": "^1.10.2"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@ampproject/remapping": {
    +      "version": "2.2.1",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "Apache-2.0",
    +      "dependencies": {
    +        "@jridgewell/gen-mapping": "^0.3.0",
    +        "@jridgewell/trace-mapping": "^0.3.9"
    +      },
    +      "engines": {
    +        "node": ">=6.0.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/code-frame": {
    +      "version": "7.22.5",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@babel/highlight": "^7.22.5"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/compat-data": {
    +      "version": "7.22.9",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/core": {
    +      "version": "7.22.9",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@ampproject/remapping": "^2.2.0",
    +        "@babel/code-frame": "^7.22.5",
    +        "@babel/generator": "^7.22.9",
    +        "@babel/helper-compilation-targets": "^7.22.9",
    +        "@babel/helper-module-transforms": "^7.22.9",
    +        "@babel/helpers": "^7.22.6",
    +        "@babel/parser": "^7.22.7",
    +        "@babel/template": "^7.22.5",
    +        "@babel/traverse": "^7.22.8",
    +        "@babel/types": "^7.22.5",
    +        "convert-source-map": "^1.7.0",
    +        "debug": "^4.1.0",
    +        "gensync": "^1.0.0-beta.2",
    +        "json5": "^2.2.2",
    +        "semver": "^6.3.1"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/babel"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/generator": {
    +      "version": "7.22.9",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@babel/types": "^7.22.5",
    +        "@jridgewell/gen-mapping": "^0.3.2",
    +        "@jridgewell/trace-mapping": "^0.3.17",
    +        "jsesc": "^2.5.1"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/helper-annotate-as-pure": {
    +      "version": "7.22.5",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@babel/types": "^7.22.5"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/helper-compilation-targets": {
    +      "version": "7.22.9",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@babel/compat-data": "^7.22.9",
    +        "@babel/helper-validator-option": "^7.22.5",
    +        "browserslist": "^4.21.9",
    +        "lru-cache": "^5.1.1",
    +        "semver": "^6.3.1"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/helper-environment-visitor": {
    +      "version": "7.22.5",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/helper-function-name": {
    +      "version": "7.22.5",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@babel/template": "^7.22.5",
    +        "@babel/types": "^7.22.5"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/helper-hoist-variables": {
    +      "version": "7.22.5",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@babel/types": "^7.22.5"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/helper-module-imports": {
    +      "version": "7.22.5",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@babel/types": "^7.22.5"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/helper-module-transforms": {
    +      "version": "7.22.9",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@babel/helper-environment-visitor": "^7.22.5",
    +        "@babel/helper-module-imports": "^7.22.5",
    +        "@babel/helper-simple-access": "^7.22.5",
    +        "@babel/helper-split-export-declaration": "^7.22.6",
    +        "@babel/helper-validator-identifier": "^7.22.5"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/helper-plugin-utils": {
    +      "version": "7.22.5",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/helper-simple-access": {
    +      "version": "7.22.5",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@babel/types": "^7.22.5"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/helper-split-export-declaration": {
    +      "version": "7.22.6",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@babel/types": "^7.22.5"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/helper-string-parser": {
    +      "version": "7.22.5",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/helper-validator-identifier": {
    +      "version": "7.22.5",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/helper-validator-option": {
    +      "version": "7.22.5",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/helpers": {
    +      "version": "7.22.6",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@babel/template": "^7.22.5",
    +        "@babel/traverse": "^7.22.6",
    +        "@babel/types": "^7.22.5"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/highlight": {
    +      "version": "7.22.5",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@babel/helper-validator-identifier": "^7.22.5",
    +        "chalk": "^2.0.0",
    +        "js-tokens": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/parser": {
    +      "version": "7.22.7",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "bin": {
    +        "parser": "bin/babel-parser.js"
    +      },
    +      "engines": {
    +        "node": ">=6.0.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/plugin-proposal-object-rest-spread": {
    +      "version": "7.20.7",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@babel/compat-data": "^7.20.5",
    +        "@babel/helper-compilation-targets": "^7.20.7",
    +        "@babel/helper-plugin-utils": "^7.20.2",
    +        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
    +        "@babel/plugin-transform-parameters": "^7.20.7"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0-0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/plugin-syntax-jsx": {
    +      "version": "7.22.5",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@babel/helper-plugin-utils": "^7.22.5"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0-0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/plugin-syntax-object-rest-spread": {
    +      "version": "7.8.3",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@babel/helper-plugin-utils": "^7.8.0"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0-0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/plugin-transform-destructuring": {
    +      "version": "7.22.5",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@babel/helper-plugin-utils": "^7.22.5"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0-0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/plugin-transform-parameters": {
    +      "version": "7.22.5",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@babel/helper-plugin-utils": "^7.22.5"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0-0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/plugin-transform-react-jsx": {
    +      "version": "7.22.5",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@babel/helper-annotate-as-pure": "^7.22.5",
    +        "@babel/helper-module-imports": "^7.22.5",
    +        "@babel/helper-plugin-utils": "^7.22.5",
    +        "@babel/plugin-syntax-jsx": "^7.22.5",
    +        "@babel/types": "^7.22.5"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0-0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/template": {
    +      "version": "7.22.5",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@babel/code-frame": "^7.22.5",
    +        "@babel/parser": "^7.22.5",
    +        "@babel/types": "^7.22.5"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/traverse": {
    +      "version": "7.22.8",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@babel/code-frame": "^7.22.5",
    +        "@babel/generator": "^7.22.7",
    +        "@babel/helper-environment-visitor": "^7.22.5",
    +        "@babel/helper-function-name": "^7.22.5",
    +        "@babel/helper-hoist-variables": "^7.22.5",
    +        "@babel/helper-split-export-declaration": "^7.22.6",
    +        "@babel/parser": "^7.22.7",
    +        "@babel/types": "^7.22.5",
    +        "debug": "^4.1.0",
    +        "globals": "^11.1.0"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@babel/types": {
    +      "version": "7.22.5",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@babel/helper-string-parser": "^7.22.5",
    +        "@babel/helper-validator-identifier": "^7.22.5",
    +        "to-fast-properties": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@isaacs/import-jsx": {
    +      "version": "4.0.1",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@babel/core": "^7.5.5",
    +        "@babel/plugin-proposal-object-rest-spread": "^7.5.5",
    +        "@babel/plugin-transform-destructuring": "^7.5.0",
    +        "@babel/plugin-transform-react-jsx": "^7.3.0",
    +        "caller-path": "^3.0.1",
    +        "find-cache-dir": "^3.2.0",
    +        "make-dir": "^3.0.2",
    +        "resolve-from": "^3.0.0",
    +        "rimraf": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@jridgewell/gen-mapping": {
    +      "version": "0.3.3",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@jridgewell/set-array": "^1.0.1",
    +        "@jridgewell/sourcemap-codec": "^1.4.10",
    +        "@jridgewell/trace-mapping": "^0.3.9"
    +      },
    +      "engines": {
    +        "node": ">=6.0.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@jridgewell/resolve-uri": {
    +      "version": "3.1.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=6.0.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@jridgewell/set-array": {
    +      "version": "1.1.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=6.0.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@jridgewell/sourcemap-codec": {
    +      "version": "1.4.15",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT"
    +    },
    +    "node_modules/tap/node_modules/@jridgewell/trace-mapping": {
    +      "version": "0.3.18",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@jridgewell/resolve-uri": "3.1.0",
    +        "@jridgewell/sourcemap-codec": "1.4.14"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": {
    +      "version": "1.4.14",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT"
    +    },
    +    "node_modules/tap/node_modules/@types/prop-types": {
    +      "version": "15.7.5",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT"
    +    },
    +    "node_modules/tap/node_modules/@types/react": {
    +      "version": "17.0.62",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@types/prop-types": "*",
    +        "@types/scheduler": "*",
    +        "csstype": "^3.0.2"
    +      }
    +    },
    +    "node_modules/tap/node_modules/@types/scheduler": {
    +      "version": "0.16.3",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT"
    +    },
    +    "node_modules/tap/node_modules/@types/yoga-layout": {
    +      "version": "1.9.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT"
    +    },
    +    "node_modules/tap/node_modules/ansi-escapes": {
    +      "version": "4.3.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "type-fest": "^0.21.3"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/tap/node_modules/ansi-escapes/node_modules/type-fest": {
    +      "version": "0.21.3",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "(MIT OR CC0-1.0)",
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/tap/node_modules/ansi-regex": {
    +      "version": "5.0.1",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/ansi-styles": {
    +      "version": "3.2.1",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "color-convert": "^1.9.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/tap/node_modules/ansicolors": {
    +      "version": "0.3.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT"
    +    },
    +    "node_modules/tap/node_modules/append-transform": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz",
    +      "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==",
    +      "dev": true,
    +      "dependencies": {
    +        "default-require-extensions": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/astral-regex": {
    +      "version": "2.0.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/auto-bind": {
    +      "version": "4.0.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/tap/node_modules/balanced-match": {
    +      "version": "1.0.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT"
    +    },
    +    "node_modules/tap/node_modules/brace-expansion": {
    +      "version": "1.1.11",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "balanced-match": "^1.0.0",
    +        "concat-map": "0.0.1"
    +      }
    +    },
    +    "node_modules/tap/node_modules/browserslist": {
    +      "version": "4.21.9",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "opencollective",
    +          "url": "https://opencollective.com/browserslist"
    +        },
    +        {
    +          "type": "tidelift",
    +          "url": "https://tidelift.com/funding/github/npm/browserslist"
    +        },
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/ai"
    +        }
    +      ],
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "caniuse-lite": "^1.0.30001503",
    +        "electron-to-chromium": "^1.4.431",
    +        "node-releases": "^2.0.12",
    +        "update-browserslist-db": "^1.0.11"
    +      },
    +      "bin": {
    +        "browserslist": "cli.js"
    +      },
    +      "engines": {
    +        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
    +      }
    +    },
    +    "node_modules/tap/node_modules/caching-transform": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz",
    +      "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==",
    +      "dev": true,
    +      "dependencies": {
    +        "hasha": "^5.0.0",
    +        "make-dir": "^3.0.0",
    +        "package-hash": "^4.0.0",
    +        "write-file-atomic": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/caller-callsite": {
    +      "version": "4.1.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "callsites": "^3.1.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/caller-path": {
    +      "version": "3.0.1",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "caller-callsite": "^4.1.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/callsites": {
    +      "version": "3.1.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/tap/node_modules/caniuse-lite": {
    +      "version": "1.0.30001517",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "opencollective",
    +          "url": "https://opencollective.com/browserslist"
    +        },
    +        {
    +          "type": "tidelift",
    +          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
    +        },
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/ai"
    +        }
    +      ],
    +      "inBundle": true,
    +      "license": "CC-BY-4.0"
    +    },
    +    "node_modules/tap/node_modules/cardinal": {
    +      "version": "2.1.1",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "ansicolors": "~0.3.2",
    +        "redeyed": "~2.1.0"
    +      },
    +      "bin": {
    +        "cdl": "bin/cdl.js"
    +      }
    +    },
    +    "node_modules/tap/node_modules/chalk": {
    +      "version": "2.4.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "ansi-styles": "^3.2.1",
    +        "escape-string-regexp": "^1.0.5",
    +        "supports-color": "^5.3.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/tap/node_modules/ci-info": {
    +      "version": "2.0.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT"
    +    },
    +    "node_modules/tap/node_modules/cli-boxes": {
    +      "version": "2.2.1",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=6"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/tap/node_modules/cli-cursor": {
    +      "version": "3.1.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "restore-cursor": "^3.1.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/cli-truncate": {
    +      "version": "2.1.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "slice-ansi": "^3.0.0",
    +        "string-width": "^4.2.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/tap/node_modules/cliui": {
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
    +      "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "string-width": "^4.2.0",
    +        "strip-ansi": "^6.0.0",
    +        "wrap-ansi": "^6.2.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/code-excerpt": {
    +      "version": "3.0.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "convert-to-spaces": "^1.0.1"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/tap/node_modules/color-convert": {
    +      "version": "1.9.3",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "color-name": "1.1.3"
    +      }
    +    },
    +    "node_modules/tap/node_modules/color-name": {
    +      "version": "1.1.3",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT"
    +    },
    +    "node_modules/tap/node_modules/commondir": {
    +      "version": "1.0.1",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT"
    +    },
    +    "node_modules/tap/node_modules/concat-map": {
    +      "version": "0.0.1",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT"
    +    },
    +    "node_modules/tap/node_modules/convert-source-map": {
    +      "version": "1.9.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT"
    +    },
    +    "node_modules/tap/node_modules/convert-to-spaces": {
    +      "version": "1.0.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">= 4"
    +      }
    +    },
    +    "node_modules/tap/node_modules/csstype": {
    +      "version": "3.1.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT"
    +    },
    +    "node_modules/tap/node_modules/debug": {
    +      "version": "4.3.4",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "ms": "2.1.2"
    +      },
    +      "engines": {
    +        "node": ">=6.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "supports-color": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/tap/node_modules/default-require-extensions": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz",
    +      "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==",
    +      "dev": true,
    +      "dependencies": {
    +        "strip-bom": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/tap/node_modules/electron-to-chromium": {
    +      "version": "1.4.477",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "ISC"
    +    },
    +    "node_modules/tap/node_modules/emoji-regex": {
    +      "version": "8.0.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT"
    +    },
    +    "node_modules/tap/node_modules/escalade": {
    +      "version": "3.1.1",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/tap/node_modules/escape-string-regexp": {
    +      "version": "1.0.5",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=0.8.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/esprima": {
    +      "version": "4.0.1",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "BSD-2-Clause",
    +      "bin": {
    +        "esparse": "bin/esparse.js",
    +        "esvalidate": "bin/esvalidate.js"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/tap/node_modules/events-to-array": {
    +      "version": "1.1.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "ISC"
    +    },
    +    "node_modules/tap/node_modules/find-cache-dir": {
    +      "version": "3.3.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "commondir": "^1.0.1",
    +        "make-dir": "^3.0.2",
    +        "pkg-dir": "^4.1.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
    +      }
    +    },
    +    "node_modules/tap/node_modules/find-up": {
    +      "version": "4.1.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "locate-path": "^5.0.0",
    +        "path-exists": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/foreground-child": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
    +      "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
    +      "dev": true,
    +      "dependencies": {
    +        "cross-spawn": "^7.0.0",
    +        "signal-exit": "^3.0.2"
    +      },
    +      "engines": {
    +        "node": ">=8.0.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/fs.realpath": {
    +      "version": "1.0.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "ISC"
    +    },
    +    "node_modules/tap/node_modules/gensync": {
    +      "version": "1.0.0-beta.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=6.9.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/glob": {
    +      "version": "7.2.3",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "ISC",
    +      "dependencies": {
    +        "fs.realpath": "^1.0.0",
    +        "inflight": "^1.0.4",
    +        "inherits": "2",
    +        "minimatch": "^3.1.1",
    +        "once": "^1.3.0",
    +        "path-is-absolute": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": "*"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/isaacs"
    +      }
    +    },
    +    "node_modules/tap/node_modules/globals": {
    +      "version": "11.12.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/tap/node_modules/has-flag": {
    +      "version": "3.0.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/tap/node_modules/hasha": {
    +      "version": "5.2.2",
    +      "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz",
    +      "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-stream": "^2.0.0",
    +        "type-fest": "^0.8.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/tap/node_modules/hasha/node_modules/type-fest": {
    +      "version": "0.8.1",
    +      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
    +      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/indent-string": {
    +      "version": "4.0.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/inflight": {
    +      "version": "1.0.6",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "ISC",
    +      "dependencies": {
    +        "once": "^1.3.0",
    +        "wrappy": "1"
    +      }
    +    },
    +    "node_modules/tap/node_modules/inherits": {
    +      "version": "2.0.4",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "ISC"
    +    },
    +    "node_modules/tap/node_modules/ink": {
    +      "version": "3.2.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "ansi-escapes": "^4.2.1",
    +        "auto-bind": "4.0.0",
    +        "chalk": "^4.1.0",
    +        "cli-boxes": "^2.2.0",
    +        "cli-cursor": "^3.1.0",
    +        "cli-truncate": "^2.1.0",
    +        "code-excerpt": "^3.0.0",
    +        "indent-string": "^4.0.0",
    +        "is-ci": "^2.0.0",
    +        "lodash": "^4.17.20",
    +        "patch-console": "^1.0.0",
    +        "react-devtools-core": "^4.19.1",
    +        "react-reconciler": "^0.26.2",
    +        "scheduler": "^0.20.2",
    +        "signal-exit": "^3.0.2",
    +        "slice-ansi": "^3.0.0",
    +        "stack-utils": "^2.0.2",
    +        "string-width": "^4.2.2",
    +        "type-fest": "^0.12.0",
    +        "widest-line": "^3.1.0",
    +        "wrap-ansi": "^6.2.0",
    +        "ws": "^7.5.5",
    +        "yoga-layout-prebuilt": "^1.9.6"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "peerDependencies": {
    +        "@types/react": ">=16.8.0",
    +        "react": ">=16.8.0"
    +      },
    +      "peerDependenciesMeta": {
    +        "@types/react": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/tap/node_modules/ink/node_modules/ansi-styles": {
    +      "version": "4.3.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "color-convert": "^2.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
    +      }
    +    },
    +    "node_modules/tap/node_modules/ink/node_modules/chalk": {
    +      "version": "4.1.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "ansi-styles": "^4.1.0",
    +        "supports-color": "^7.1.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/chalk/chalk?sponsor=1"
    +      }
    +    },
    +    "node_modules/tap/node_modules/ink/node_modules/color-convert": {
    +      "version": "2.0.1",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "color-name": "~1.1.4"
    +      },
    +      "engines": {
    +        "node": ">=7.0.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/ink/node_modules/color-name": {
    +      "version": "1.1.4",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT"
    +    },
    +    "node_modules/tap/node_modules/ink/node_modules/has-flag": {
    +      "version": "4.0.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/ink/node_modules/supports-color": {
    +      "version": "7.2.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "has-flag": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/is-ci": {
    +      "version": "2.0.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "ci-info": "^2.0.0"
    +      },
    +      "bin": {
    +        "is-ci": "bin.js"
    +      }
    +    },
    +    "node_modules/tap/node_modules/is-fullwidth-code-point": {
    +      "version": "3.0.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/istanbul-lib-hook": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz",
    +      "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "append-transform": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/istanbul-lib-instrument": {
    +      "version": "4.0.3",
    +      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
    +      "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/core": "^7.7.5",
    +        "@istanbuljs/schema": "^0.1.2",
    +        "istanbul-lib-coverage": "^3.0.0",
    +        "semver": "^6.3.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/js-tokens": {
    +      "version": "4.0.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT"
    +    },
    +    "node_modules/tap/node_modules/jsesc": {
    +      "version": "2.5.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "bin": {
    +        "jsesc": "bin/jsesc"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/tap/node_modules/json5": {
    +      "version": "2.2.3",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "bin": {
    +        "json5": "lib/cli.js"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/tap/node_modules/locate-path": {
    +      "version": "5.0.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "p-locate": "^4.1.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/lodash": {
    +      "version": "4.17.21",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT"
    +    },
    +    "node_modules/tap/node_modules/loose-envify": {
    +      "version": "1.4.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "js-tokens": "^3.0.0 || ^4.0.0"
    +      },
    +      "bin": {
    +        "loose-envify": "cli.js"
    +      }
    +    },
    +    "node_modules/tap/node_modules/lru-cache": {
    +      "version": "5.1.1",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "ISC",
    +      "dependencies": {
    +        "yallist": "^3.0.2"
    +      }
    +    },
    +    "node_modules/tap/node_modules/make-dir": {
    +      "version": "3.1.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "semver": "^6.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/tap/node_modules/mimic-fn": {
    +      "version": "2.1.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/tap/node_modules/minimatch": {
    +      "version": "3.1.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "ISC",
    +      "dependencies": {
    +        "brace-expansion": "^1.1.7"
    +      },
    +      "engines": {
    +        "node": "*"
    +      }
    +    },
    +    "node_modules/tap/node_modules/minipass": {
    +      "version": "3.3.6",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "ISC",
    +      "dependencies": {
    +        "yallist": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/minipass/node_modules/yallist": {
    +      "version": "4.0.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "ISC"
    +    },
    +    "node_modules/tap/node_modules/mkdirp": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
    +      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
    +      "dev": true,
    +      "bin": {
    +        "mkdirp": "bin/cmd.js"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/tap/node_modules/ms": {
    +      "version": "2.1.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT"
    +    },
    +    "node_modules/tap/node_modules/node-releases": {
    +      "version": "2.0.13",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT"
    +    },
    +    "node_modules/tap/node_modules/nyc": {
    +      "version": "15.1.0",
    +      "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz",
    +      "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==",
    +      "dev": true,
    +      "dependencies": {
    +        "@istanbuljs/load-nyc-config": "^1.0.0",
    +        "@istanbuljs/schema": "^0.1.2",
    +        "caching-transform": "^4.0.0",
    +        "convert-source-map": "^1.7.0",
    +        "decamelize": "^1.2.0",
    +        "find-cache-dir": "^3.2.0",
    +        "find-up": "^4.1.0",
    +        "foreground-child": "^2.0.0",
    +        "get-package-type": "^0.1.0",
    +        "glob": "^7.1.6",
    +        "istanbul-lib-coverage": "^3.0.0",
    +        "istanbul-lib-hook": "^3.0.0",
    +        "istanbul-lib-instrument": "^4.0.0",
    +        "istanbul-lib-processinfo": "^2.0.2",
    +        "istanbul-lib-report": "^3.0.0",
    +        "istanbul-lib-source-maps": "^4.0.0",
    +        "istanbul-reports": "^3.0.2",
    +        "make-dir": "^3.0.0",
    +        "node-preload": "^0.2.1",
    +        "p-map": "^3.0.0",
    +        "process-on-spawn": "^1.0.0",
    +        "resolve-from": "^5.0.0",
    +        "rimraf": "^3.0.0",
    +        "signal-exit": "^3.0.2",
    +        "spawn-wrap": "^2.0.0",
    +        "test-exclude": "^6.0.0",
    +        "yargs": "^15.0.2"
    +      },
    +      "bin": {
    +        "nyc": "bin/nyc.js"
    +      },
    +      "engines": {
    +        "node": ">=8.9"
    +      }
    +    },
    +    "node_modules/tap/node_modules/nyc/node_modules/resolve-from": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
    +      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/object-assign": {
    +      "version": "4.1.1",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/once": {
    +      "version": "1.4.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "ISC",
    +      "dependencies": {
    +        "wrappy": "1"
    +      }
    +    },
    +    "node_modules/tap/node_modules/onetime": {
    +      "version": "5.1.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "mimic-fn": "^2.1.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/tap/node_modules/p-limit": {
    +      "version": "2.3.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "p-try": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/tap/node_modules/p-locate": {
    +      "version": "4.1.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "p-limit": "^2.2.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/p-try": {
    +      "version": "2.2.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/tap/node_modules/package-hash": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz",
    +      "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "graceful-fs": "^4.1.15",
    +        "hasha": "^5.0.0",
    +        "lodash.flattendeep": "^4.4.0",
    +        "release-zalgo": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/patch-console": {
    +      "version": "1.0.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/tap/node_modules/path-exists": {
    +      "version": "4.0.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/path-is-absolute": {
    +      "version": "1.0.1",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/picocolors": {
    +      "version": "1.0.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "ISC"
    +    },
    +    "node_modules/tap/node_modules/pkg-dir": {
    +      "version": "4.2.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "find-up": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/punycode": {
    +      "version": "2.3.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/tap/node_modules/react": {
    +      "version": "17.0.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "loose-envify": "^1.1.0",
    +        "object-assign": "^4.1.1"
    +      },
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/react-devtools-core": {
    +      "version": "4.28.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "shell-quote": "^1.6.1",
    +        "ws": "^7"
    +      }
    +    },
    +    "node_modules/tap/node_modules/react-reconciler": {
    +      "version": "0.26.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "loose-envify": "^1.1.0",
    +        "object-assign": "^4.1.1",
    +        "scheduler": "^0.20.2"
    +      },
    +      "engines": {
    +        "node": ">=0.10.0"
    +      },
    +      "peerDependencies": {
    +        "react": "^17.0.2"
    +      }
    +    },
    +    "node_modules/tap/node_modules/redeyed": {
    +      "version": "2.1.1",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "esprima": "~4.0.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/resolve-from": {
    +      "version": "3.0.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/tap/node_modules/restore-cursor": {
    +      "version": "3.1.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "onetime": "^5.1.0",
    +        "signal-exit": "^3.0.2"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/rimraf": {
    +      "version": "3.0.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "ISC",
    +      "dependencies": {
    +        "glob": "^7.1.3"
    +      },
    +      "bin": {
    +        "rimraf": "bin.js"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/isaacs"
    +      }
    +    },
    +    "node_modules/tap/node_modules/scheduler": {
    +      "version": "0.20.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "loose-envify": "^1.1.0",
    +        "object-assign": "^4.1.1"
    +      }
    +    },
    +    "node_modules/tap/node_modules/semver": {
    +      "version": "6.3.1",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "ISC",
    +      "bin": {
    +        "semver": "bin/semver.js"
    +      }
    +    },
    +    "node_modules/tap/node_modules/shell-quote": {
    +      "version": "1.8.1",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/tap/node_modules/signal-exit": {
    +      "version": "3.0.7",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "ISC"
    +    },
    +    "node_modules/tap/node_modules/slice-ansi": {
    +      "version": "3.0.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "ansi-styles": "^4.0.0",
    +        "astral-regex": "^2.0.0",
    +        "is-fullwidth-code-point": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/slice-ansi/node_modules/ansi-styles": {
    +      "version": "4.3.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "color-convert": "^2.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
    +      }
    +    },
    +    "node_modules/tap/node_modules/slice-ansi/node_modules/color-convert": {
    +      "version": "2.0.1",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "color-name": "~1.1.4"
    +      },
    +      "engines": {
    +        "node": ">=7.0.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/slice-ansi/node_modules/color-name": {
    +      "version": "1.1.4",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT"
    +    },
    +    "node_modules/tap/node_modules/source-map-support": {
    +      "version": "0.5.21",
    +      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
    +      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
    +      "dev": true,
    +      "dependencies": {
    +        "buffer-from": "^1.0.0",
    +        "source-map": "^0.6.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/spawn-wrap": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz",
    +      "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==",
    +      "dev": true,
    +      "dependencies": {
    +        "foreground-child": "^2.0.0",
    +        "is-windows": "^1.0.2",
    +        "make-dir": "^3.0.0",
    +        "rimraf": "^3.0.0",
    +        "signal-exit": "^3.0.2",
    +        "which": "^2.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/stack-utils": {
    +      "version": "2.0.6",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "escape-string-regexp": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/tap/node_modules/stack-utils/node_modules/escape-string-regexp": {
    +      "version": "2.0.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/string-width": {
    +      "version": "4.2.3",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "emoji-regex": "^8.0.0",
    +        "is-fullwidth-code-point": "^3.0.0",
    +        "strip-ansi": "^6.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/strip-ansi": {
    +      "version": "6.0.1",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "ansi-regex": "^5.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/supports-color": {
    +      "version": "5.5.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "has-flag": "^3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/tap/node_modules/tap-parser": {
    +      "version": "11.0.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "events-to-array": "^1.0.1",
    +        "minipass": "^3.1.6",
    +        "tap-yaml": "^1.0.0"
    +      },
    +      "bin": {
    +        "tap-parser": "bin/cmd.js"
    +      },
    +      "engines": {
    +        "node": ">= 8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/tap-yaml": {
    +      "version": "1.0.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "ISC",
    +      "dependencies": {
    +        "yaml": "^1.10.2"
    +      }
    +    },
    +    "node_modules/tap/node_modules/to-fast-properties": {
    +      "version": "2.0.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/tap/node_modules/treport": {
    +      "version": "3.0.4",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "ISC",
    +      "dependencies": {
    +        "@isaacs/import-jsx": "^4.0.1",
    +        "cardinal": "^2.1.1",
    +        "chalk": "^3.0.0",
    +        "ink": "^3.2.0",
    +        "ms": "^2.1.2",
    +        "tap-parser": "^11.0.0",
    +        "tap-yaml": "^1.0.0",
    +        "unicode-length": "^2.0.2"
    +      },
    +      "peerDependencies": {
    +        "react": "^17.0.2"
    +      }
    +    },
    +    "node_modules/tap/node_modules/treport/node_modules/ansi-styles": {
    +      "version": "4.3.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "color-convert": "^2.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
    +      }
    +    },
    +    "node_modules/tap/node_modules/treport/node_modules/chalk": {
    +      "version": "3.0.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "ansi-styles": "^4.1.0",
    +        "supports-color": "^7.1.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/treport/node_modules/color-convert": {
    +      "version": "2.0.1",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "color-name": "~1.1.4"
    +      },
    +      "engines": {
    +        "node": ">=7.0.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/treport/node_modules/color-name": {
    +      "version": "1.1.4",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT"
    +    },
    +    "node_modules/tap/node_modules/treport/node_modules/has-flag": {
    +      "version": "4.0.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/treport/node_modules/supports-color": {
    +      "version": "7.2.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "has-flag": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/type-fest": {
    +      "version": "0.12.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "(MIT OR CC0-1.0)",
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/tap/node_modules/unicode-length": {
    +      "version": "2.1.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "punycode": "^2.0.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/update-browserslist-db": {
    +      "version": "1.0.11",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "opencollective",
    +          "url": "https://opencollective.com/browserslist"
    +        },
    +        {
    +          "type": "tidelift",
    +          "url": "https://tidelift.com/funding/github/npm/browserslist"
    +        },
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/ai"
    +        }
    +      ],
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "escalade": "^3.1.1",
    +        "picocolors": "^1.0.0"
    +      },
    +      "bin": {
    +        "update-browserslist-db": "cli.js"
    +      },
    +      "peerDependencies": {
    +        "browserslist": ">= 4.21.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/widest-line": {
    +      "version": "3.1.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "string-width": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/wrap-ansi": {
    +      "version": "6.2.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "ansi-styles": "^4.0.0",
    +        "string-width": "^4.1.0",
    +        "strip-ansi": "^6.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/wrap-ansi/node_modules/ansi-styles": {
    +      "version": "4.3.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "color-convert": "^2.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
    +      }
    +    },
    +    "node_modules/tap/node_modules/wrap-ansi/node_modules/color-convert": {
    +      "version": "2.0.1",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "color-name": "~1.1.4"
    +      },
    +      "engines": {
    +        "node": ">=7.0.0"
    +      }
    +    },
    +    "node_modules/tap/node_modules/wrap-ansi/node_modules/color-name": {
    +      "version": "1.1.4",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT"
    +    },
    +    "node_modules/tap/node_modules/wrappy": {
    +      "version": "1.0.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "ISC"
    +    },
    +    "node_modules/tap/node_modules/write-file-atomic": {
    +      "version": "3.0.3",
    +      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
    +      "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "imurmurhash": "^0.1.4",
    +        "is-typedarray": "^1.0.0",
    +        "signal-exit": "^3.0.2",
    +        "typedarray-to-buffer": "^3.1.5"
    +      }
    +    },
    +    "node_modules/tap/node_modules/ws": {
    +      "version": "7.5.9",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "engines": {
    +        "node": ">=8.3.0"
    +      },
    +      "peerDependencies": {
    +        "bufferutil": "^4.0.1",
    +        "utf-8-validate": "^5.0.2"
    +      },
    +      "peerDependenciesMeta": {
    +        "bufferutil": {
    +          "optional": true
    +        },
    +        "utf-8-validate": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/tap/node_modules/y18n": {
    +      "version": "4.0.3",
    +      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
    +      "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
    +      "dev": true
    +    },
    +    "node_modules/tap/node_modules/yallist": {
    +      "version": "3.1.1",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "ISC"
    +    },
    +    "node_modules/tap/node_modules/yaml": {
    +      "version": "1.10.2",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "ISC",
    +      "engines": {
    +        "node": ">= 6"
    +      }
    +    },
    +    "node_modules/tap/node_modules/yargs": {
    +      "version": "15.4.1",
    +      "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
    +      "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
    +      "dev": true,
    +      "dependencies": {
    +        "cliui": "^6.0.0",
    +        "decamelize": "^1.2.0",
    +        "find-up": "^4.1.0",
    +        "get-caller-file": "^2.0.1",
    +        "require-directory": "^2.1.1",
    +        "require-main-filename": "^2.0.0",
    +        "set-blocking": "^2.0.0",
    +        "string-width": "^4.2.0",
    +        "which-module": "^2.0.0",
    +        "y18n": "^4.0.0",
    +        "yargs-parser": "^18.1.2"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tap/node_modules/yargs-parser": {
    +      "version": "18.1.3",
    +      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
    +      "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "camelcase": "^5.0.0",
    +        "decamelize": "^1.2.0"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/tap/node_modules/yoga-layout-prebuilt": {
    +      "version": "1.10.0",
    +      "dev": true,
    +      "inBundle": true,
    +      "license": "MIT",
    +      "dependencies": {
    +        "@types/yoga-layout": "1.9.2"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/tcompare": {
    +      "version": "5.0.7",
    +      "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-5.0.7.tgz",
    +      "integrity": "sha512-d9iddt6YYGgyxJw5bjsN7UJUO1kGOtjSlNy/4PoGYAjQS5pAT/hzIoLf1bZCw+uUxRmZJh7Yy1aA7xKVRT9B4w==",
    +      "dev": true,
    +      "dependencies": {
    +        "diff": "^4.0.2"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/tcompare/node_modules/diff": {
    +      "version": "4.0.2",
    +      "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
    +      "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.3.1"
    +      }
    +    },
    +    "node_modules/term-size": {
    +      "version": "2.2.1",
    +      "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz",
    +      "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/test-exclude": {
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
    +      "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
    +      "dev": true,
    +      "dependencies": {
    +        "@istanbuljs/schema": "^0.1.2",
    +        "glob": "^7.1.4",
    +        "minimatch": "^3.0.4"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/text-table": {
    +      "version": "0.2.0",
    +      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
    +      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
    +      "dev": true
    +    },
    +    "node_modules/tinydate": {
    +      "version": "1.3.0",
    +      "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.3.0.tgz",
    +      "integrity": "sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/tmpl": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
    +      "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
    +      "dev": true
    +    },
    +    "node_modules/to-fast-properties": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
    +      "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/to-readable-stream": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
    +      "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/to-regex-range": {
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
    +      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-number": "^7.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8.0"
    +      }
    +    },
    +    "node_modules/toidentifier": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
    +      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.6"
    +      }
    +    },
    +    "node_modules/tough-cookie": {
    +      "version": "4.1.3",
    +      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz",
    +      "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
    +      "dev": true,
    +      "dependencies": {
    +        "psl": "^1.1.33",
    +        "punycode": "^2.1.1",
    +        "universalify": "^0.2.0",
    +        "url-parse": "^1.5.3"
    +      },
    +      "engines": {
    +        "node": ">=6"
    +      }
    +    },
    +    "node_modules/tough-cookie/node_modules/universalify": {
    +      "version": "0.2.0",
    +      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
    +      "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 4.0.0"
    +      }
    +    },
    +    "node_modules/tr46": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz",
    +      "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==",
    +      "dev": true,
    +      "dependencies": {
    +        "punycode": "^2.3.1"
    +      },
    +      "engines": {
    +        "node": ">=18"
    +      }
    +    },
    +    "node_modules/tree-kill": {
    +      "version": "1.2.2",
    +      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
    +      "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
    +      "dev": true,
    +      "bin": {
    +        "tree-kill": "cli.js"
    +      }
    +    },
    +    "node_modules/trim-newlines": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
    +      "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/trivial-deferred": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.1.2.tgz",
    +      "integrity": "sha512-vDPiDBC3hyP6O4JrJYMImW3nl3c03Tsj9fEXc7Qc/XKa1O7gf5ZtFfIR/E0dun9SnDHdwjna1Z2rSzYgqpxh/g==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 8"
    +      }
    +    },
    +    "node_modules/tsconfig-paths": {
    +      "version": "3.14.2",
    +      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz",
    +      "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/json5": "^0.0.29",
    +        "json5": "^1.0.2",
    +        "minimist": "^1.2.6",
    +        "strip-bom": "^3.0.0"
    +      }
    +    },
    +    "node_modules/tsconfig-paths/node_modules/json5": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
    +      "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
    +      "dev": true,
    +      "dependencies": {
    +        "minimist": "^1.2.0"
    +      },
    +      "bin": {
    +        "json5": "lib/cli.js"
    +      }
    +    },
    +    "node_modules/tsconfig-paths/node_modules/strip-bom": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
    +      "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/tsd": {
    +      "version": "0.29.0",
    +      "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.29.0.tgz",
    +      "integrity": "sha512-5B7jbTj+XLMg6rb9sXRBGwzv7h8KJlGOkTHxY63eWpZJiQ5vJbXEjL0u7JkIxwi5EsrRE1kRVUWmy6buK/ii8A==",
    +      "dev": true,
    +      "dependencies": {
    +        "@tsd/typescript": "~5.2.2",
    +        "eslint-formatter-pretty": "^4.1.0",
    +        "globby": "^11.0.1",
    +        "jest-diff": "^29.0.3",
    +        "meow": "^9.0.0",
    +        "path-exists": "^4.0.0",
    +        "read-pkg-up": "^7.0.0"
    +      },
    +      "bin": {
    +        "tsd": "dist/cli.js"
    +      },
    +      "engines": {
    +        "node": ">=14.16"
    +      }
    +    },
    +    "node_modules/tslib": {
    +      "version": "2.6.2",
    +      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
    +      "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
    +      "dev": true
    +    },
    +    "node_modules/tweezer.js": {
    +      "version": "1.5.0",
    +      "resolved": "https://registry.npmjs.org/tweezer.js/-/tweezer.js-1.5.0.tgz",
    +      "integrity": "sha512-aSiJz7rGWNAQq7hjMK9ZYDuEawXupcCWgl3woQQSoDP2Oh8O4srWb/uO1PzzHIsrPEOqrjJ2sUb9FERfzuBabQ==",
    +      "dev": true
    +    },
    +    "node_modules/type-check": {
    +      "version": "0.3.2",
    +      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
    +      "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
    +      "dev": true,
    +      "dependencies": {
    +        "prelude-ls": "~1.1.2"
    +      },
    +      "engines": {
    +        "node": ">= 0.8.0"
    +      }
    +    },
    +    "node_modules/type-detect": {
    +      "version": "4.0.8",
    +      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
    +      "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/type-fest": {
    +      "version": "0.21.3",
    +      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
    +      "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/type-is": {
    +      "version": "1.6.18",
    +      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
    +      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
    +      "dev": true,
    +      "dependencies": {
    +        "media-typer": "0.3.0",
    +        "mime-types": "~2.1.24"
    +      },
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
    +    "node_modules/typed-array-buffer": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz",
    +      "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "get-intrinsic": "^1.2.1",
    +        "is-typed-array": "^1.1.10"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      }
    +    },
    +    "node_modules/typed-array-byte-length": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz",
    +      "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "for-each": "^0.3.3",
    +        "has-proto": "^1.0.1",
    +        "is-typed-array": "^1.1.10"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/typed-array-byte-offset": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz",
    +      "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==",
    +      "dev": true,
    +      "dependencies": {
    +        "available-typed-arrays": "^1.0.5",
    +        "call-bind": "^1.0.2",
    +        "for-each": "^0.3.3",
    +        "has-proto": "^1.0.1",
    +        "is-typed-array": "^1.1.10"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/typed-array-length": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
    +      "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "for-each": "^0.3.3",
    +        "is-typed-array": "^1.1.9"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/typed-error": {
    +      "version": "3.2.2",
    +      "resolved": "https://registry.npmjs.org/typed-error/-/typed-error-3.2.2.tgz",
    +      "integrity": "sha512-Z48LU67/qJ+vyA7lh3ozELqpTp3pvQoY5RtLi5wQ/UGSrEidBhlVSqhjr8B3iqbGpjqAoJYrtSYXWMDtidWGkA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6.0.0",
    +        "npm": ">=3.0.0"
    +      }
    +    },
    +    "node_modules/typedarray": {
    +      "version": "0.0.6",
    +      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
    +      "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
    +      "dev": true
    +    },
    +    "node_modules/typedarray-to-buffer": {
    +      "version": "3.1.5",
    +      "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
    +      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-typedarray": "^1.0.0"
    +      }
    +    },
    +    "node_modules/typescript": {
    +      "version": "5.3.2",
    +      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz",
    +      "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==",
    +      "dev": true,
    +      "bin": {
    +        "tsc": "bin/tsc",
    +        "tsserver": "bin/tsserver"
    +      },
    +      "engines": {
    +        "node": ">=14.17"
    +      }
    +    },
    +    "node_modules/unbox-primitive": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
    +      "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
    +        "has-bigints": "^1.0.2",
    +        "has-symbols": "^1.0.3",
    +        "which-boxed-primitive": "^1.0.2"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/undici-types": {
    +      "version": "5.26.5",
    +      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
    +      "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
    +      "dev": true
    +    },
    +    "node_modules/unicode-length": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-2.1.0.tgz",
    +      "integrity": "sha512-4bV582zTV9Q02RXBxSUMiuN/KHo5w4aTojuKTNT96DIKps/SIawFp7cS5Mu25VuY1AioGXrmYyzKZUzh8OqoUw==",
    +      "dev": true,
    +      "dependencies": {
    +        "punycode": "^2.0.0"
    +      }
    +    },
    +    "node_modules/unique-string": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
    +      "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
    +      "dev": true,
    +      "dependencies": {
    +        "crypto-random-string": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/universalify": {
    +      "version": "0.1.2",
    +      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
    +      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 4.0.0"
    +      }
    +    },
    +    "node_modules/unpipe": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
    +      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/update-browserslist-db": {
    +      "version": "1.0.13",
    +      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
    +      "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "opencollective",
    +          "url": "https://opencollective.com/browserslist"
    +        },
    +        {
    +          "type": "tidelift",
    +          "url": "https://tidelift.com/funding/github/npm/browserslist"
    +        },
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/ai"
    +        }
    +      ],
    +      "dependencies": {
    +        "escalade": "^3.1.1",
    +        "picocolors": "^1.0.0"
    +      },
    +      "bin": {
    +        "update-browserslist-db": "cli.js"
    +      },
    +      "peerDependencies": {
    +        "browserslist": ">= 4.21.0"
    +      }
    +    },
    +    "node_modules/update-notifier": {
    +      "version": "4.1.3",
    +      "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz",
    +      "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==",
    +      "dev": true,
    +      "dependencies": {
    +        "boxen": "^4.2.0",
    +        "chalk": "^3.0.0",
    +        "configstore": "^5.0.1",
    +        "has-yarn": "^2.1.0",
    +        "import-lazy": "^2.1.0",
    +        "is-ci": "^2.0.0",
    +        "is-installed-globally": "^0.3.1",
    +        "is-npm": "^4.0.0",
    +        "is-yarn-global": "^0.3.0",
    +        "latest-version": "^5.0.0",
    +        "pupa": "^2.0.1",
    +        "semver-diff": "^3.1.1",
    +        "xdg-basedir": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      },
    +      "funding": {
    +        "url": "https://github.com/yeoman/update-notifier?sponsor=1"
    +      }
    +    },
    +    "node_modules/update-notifier/node_modules/chalk": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
    +      "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-styles": "^4.1.0",
    +        "supports-color": "^7.1.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/update-notifier/node_modules/supports-color": {
    +      "version": "7.2.0",
    +      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
    +      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-flag": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/uri-js": {
    +      "version": "4.4.1",
    +      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
    +      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
    +      "dev": true,
    +      "dependencies": {
    +        "punycode": "^2.1.0"
    +      }
    +    },
    +    "node_modules/url-parse": {
    +      "version": "1.5.10",
    +      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
    +      "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "querystringify": "^2.1.1",
    +        "requires-port": "^1.0.0"
    +      }
    +    },
    +    "node_modules/url-parse-lax": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
    +      "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "prepend-http": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=4"
    +      }
    +    },
    +    "node_modules/util-deprecate": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
    +      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
    +      "dev": true
    +    },
    +    "node_modules/utils-merge": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
    +      "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.4.0"
    +      }
    +    },
    +    "node_modules/uuid": {
    +      "version": "8.3.2",
    +      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
    +      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
    +      "dev": true,
    +      "bin": {
    +        "uuid": "dist/bin/uuid"
    +      }
    +    },
    +    "node_modules/v8-to-istanbul": {
    +      "version": "9.2.0",
    +      "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz",
    +      "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jridgewell/trace-mapping": "^0.3.12",
    +        "@types/istanbul-lib-coverage": "^2.0.1",
    +        "convert-source-map": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10.12.0"
    +      }
    +    },
    +    "node_modules/validate-npm-package-license": {
    +      "version": "3.0.4",
    +      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
    +      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
    +      "dev": true,
    +      "dependencies": {
    +        "spdx-correct": "^3.0.0",
    +        "spdx-expression-parse": "^3.0.0"
    +      }
    +    },
    +    "node_modules/value-or-promise": {
    +      "version": "1.0.11",
    +      "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.11.tgz",
    +      "integrity": "sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=12"
    +      }
    +    },
    +    "node_modules/vary": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
    +      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.8"
    +      }
    +    },
    +    "node_modules/version-guard": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/version-guard/-/version-guard-1.1.1.tgz",
    +      "integrity": "sha512-MGQLX89UxmYHgDvcXyjBI0cbmoW+t/dANDppNPrno64rYr8nH4SHSuElQuSYdXGEs0mUzdQe1BY+FhVPNsAmJQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.48"
    +      }
    +    },
    +    "node_modules/w3c-xmlserializer": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
    +      "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==",
    +      "dev": true,
    +      "dependencies": {
    +        "xml-name-validator": "^5.0.0"
    +      },
    +      "engines": {
    +        "node": ">=18"
    +      }
    +    },
    +    "node_modules/wait-on": {
    +      "version": "7.2.0",
    +      "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz",
    +      "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "axios": "^1.6.1",
    +        "joi": "^17.11.0",
    +        "lodash": "^4.17.21",
    +        "minimist": "^1.2.8",
    +        "rxjs": "^7.8.1"
    +      },
    +      "bin": {
    +        "wait-on": "bin/wait-on"
    +      },
    +      "engines": {
    +        "node": ">=12.0.0"
    +      }
    +    },
    +    "node_modules/walker": {
    +      "version": "1.0.8",
    +      "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
    +      "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "makeerror": "1.0.12"
    +      }
    +    },
    +    "node_modules/webidl-conversions": {
    +      "version": "7.0.0",
    +      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
    +      "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=12"
    +      }
    +    },
    +    "node_modules/whatwg-encoding": {
    +      "version": "3.1.1",
    +      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
    +      "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "iconv-lite": "0.6.3"
    +      },
    +      "engines": {
    +        "node": ">=18"
    +      }
    +    },
    +    "node_modules/whatwg-encoding/node_modules/iconv-lite": {
    +      "version": "0.6.3",
    +      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
    +      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
    +      "dev": true,
    +      "dependencies": {
    +        "safer-buffer": ">= 2.1.2 < 3.0.0"
    +      },
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/whatwg-mimetype": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
    +      "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=18"
    +      }
    +    },
    +    "node_modules/whatwg-url": {
    +      "version": "14.0.0",
    +      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz",
    +      "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==",
    +      "dev": true,
    +      "dependencies": {
    +        "tr46": "^5.0.0",
    +        "webidl-conversions": "^7.0.0"
    +      },
    +      "engines": {
    +        "node": ">=18"
    +      }
    +    },
    +    "node_modules/which": {
    +      "version": "2.0.2",
    +      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
    +      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
    +      "dev": true,
    +      "dependencies": {
    +        "isexe": "^2.0.0"
    +      },
    +      "bin": {
    +        "node-which": "bin/node-which"
    +      },
    +      "engines": {
    +        "node": ">= 8"
    +      }
    +    },
    +    "node_modules/which-boxed-primitive": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
    +      "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-bigint": "^1.0.1",
    +        "is-boolean-object": "^1.1.0",
    +        "is-number-object": "^1.0.4",
    +        "is-string": "^1.0.5",
    +        "is-symbol": "^1.0.3"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/which-builtin-type": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz",
    +      "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==",
    +      "dev": true,
    +      "dependencies": {
    +        "function.prototype.name": "^1.1.5",
    +        "has-tostringtag": "^1.0.0",
    +        "is-async-function": "^2.0.0",
    +        "is-date-object": "^1.0.5",
    +        "is-finalizationregistry": "^1.0.2",
    +        "is-generator-function": "^1.0.10",
    +        "is-regex": "^1.1.4",
    +        "is-weakref": "^1.0.2",
    +        "isarray": "^2.0.5",
    +        "which-boxed-primitive": "^1.0.2",
    +        "which-collection": "^1.0.1",
    +        "which-typed-array": "^1.1.9"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/which-builtin-type/node_modules/isarray": {
    +      "version": "2.0.5",
    +      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
    +      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
    +      "dev": true
    +    },
    +    "node_modules/which-collection": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
    +      "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
    +      "dev": true,
    +      "dependencies": {
    +        "is-map": "^2.0.1",
    +        "is-set": "^2.0.1",
    +        "is-weakmap": "^2.0.1",
    +        "is-weakset": "^2.0.1"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/which-module": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
    +      "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==",
    +      "dev": true
    +    },
    +    "node_modules/which-typed-array": {
    +      "version": "1.1.13",
    +      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz",
    +      "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==",
    +      "dev": true,
    +      "dependencies": {
    +        "available-typed-arrays": "^1.0.5",
    +        "call-bind": "^1.0.4",
    +        "for-each": "^0.3.3",
    +        "gopd": "^1.0.1",
    +        "has-tostringtag": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/widest-line": {
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
    +      "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
    +      "dev": true,
    +      "dependencies": {
    +        "string-width": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/word-wrap": {
    +      "version": "1.2.5",
    +      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
    +      "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/workerpool": {
    +      "version": "6.2.1",
    +      "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz",
    +      "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==",
    +      "dev": true
    +    },
    +    "node_modules/wrap-ansi": {
    +      "version": "7.0.0",
    +      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
    +      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-styles": "^4.0.0",
    +        "string-width": "^4.1.0",
    +        "strip-ansi": "^6.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
    +      }
    +    },
    +    "node_modules/wrappy": {
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
    +      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
    +      "dev": true
    +    },
    +    "node_modules/write-file-atomic": {
    +      "version": "4.0.2",
    +      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
    +      "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
    +      "dev": true,
    +      "dependencies": {
    +        "imurmurhash": "^0.1.4",
    +        "signal-exit": "^3.0.7"
    +      },
    +      "engines": {
    +        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
    +      }
    +    },
    +    "node_modules/ws": {
    +      "version": "8.14.2",
    +      "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz",
    +      "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10.0.0"
    +      },
    +      "peerDependencies": {
    +        "bufferutil": "^4.0.1",
    +        "utf-8-validate": ">=5.0.2"
    +      },
    +      "peerDependenciesMeta": {
    +        "bufferutil": {
    +          "optional": true
    +        },
    +        "utf-8-validate": {
    +          "optional": true
    +        }
    +      }
    +    },
    +    "node_modules/xdg-basedir": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
    +      "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/xml-name-validator": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
    +      "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=18"
    +      }
    +    },
    +    "node_modules/xmlchars": {
    +      "version": "2.2.0",
    +      "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
    +      "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
    +      "dev": true
    +    },
    +    "node_modules/xtend": {
    +      "version": "4.0.2",
    +      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
    +      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.4"
    +      }
    +    },
    +    "node_modules/y18n": {
    +      "version": "5.0.8",
    +      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
    +      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/yallist": {
    +      "version": "3.1.1",
    +      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
    +      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
    +      "dev": true
    +    },
    +    "node_modules/yaml": {
    +      "version": "1.10.2",
    +      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
    +      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 6"
    +      }
    +    },
    +    "node_modules/yargonaut": {
    +      "version": "1.1.4",
    +      "resolved": "https://registry.npmjs.org/yargonaut/-/yargonaut-1.1.4.tgz",
    +      "integrity": "sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA==",
    +      "dev": true,
    +      "dependencies": {
    +        "chalk": "^1.1.1",
    +        "figlet": "^1.1.1",
    +        "parent-require": "^1.0.0"
    +      }
    +    },
    +    "node_modules/yargonaut/node_modules/ansi-regex": {
    +      "version": "2.1.1",
    +      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
    +      "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/yargonaut/node_modules/ansi-styles": {
    +      "version": "2.2.1",
    +      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
    +      "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/yargonaut/node_modules/chalk": {
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
    +      "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-styles": "^2.2.1",
    +        "escape-string-regexp": "^1.0.2",
    +        "has-ansi": "^2.0.0",
    +        "strip-ansi": "^3.0.0",
    +        "supports-color": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/yargonaut/node_modules/escape-string-regexp": {
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
    +      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.8.0"
    +      }
    +    },
    +    "node_modules/yargonaut/node_modules/strip-ansi": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
    +      "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-regex": "^2.0.0"
    +      },
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
    +    "node_modules/yargonaut/node_modules/supports-color": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
    +      "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.8.0"
    +      }
    +    },
    +    "node_modules/yargs": {
    +      "version": "17.7.2",
    +      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
    +      "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
    +      "dev": true,
    +      "dependencies": {
    +        "cliui": "^8.0.1",
    +        "escalade": "^3.1.1",
    +        "get-caller-file": "^2.0.5",
    +        "require-directory": "^2.1.1",
    +        "string-width": "^4.2.3",
    +        "y18n": "^5.0.5",
    +        "yargs-parser": "^21.1.1"
    +      },
    +      "engines": {
    +        "node": ">=12"
    +      }
    +    },
    +    "node_modules/yargs-parser": {
    +      "version": "20.2.4",
    +      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
    +      "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/yargs-unparser": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
    +      "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
    +      "dev": true,
    +      "dependencies": {
    +        "camelcase": "^6.0.0",
    +        "decamelize": "^4.0.0",
    +        "flat": "^5.0.2",
    +        "is-plain-obj": "^2.1.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/yargs-unparser/node_modules/camelcase": {
    +      "version": "6.3.0",
    +      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
    +      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/yargs-unparser/node_modules/decamelize": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
    +      "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/yargs-unparser/node_modules/is-plain-obj": {
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
    +      "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/yargs/node_modules/cliui": {
    +      "version": "8.0.1",
    +      "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
    +      "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "string-width": "^4.2.0",
    +        "strip-ansi": "^6.0.1",
    +        "wrap-ansi": "^7.0.0"
    +      },
    +      "engines": {
    +        "node": ">=12"
    +      }
    +    },
    +    "node_modules/yargs/node_modules/yargs-parser": {
    +      "version": "21.1.1",
    +      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
    +      "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=12"
    +      }
    +    },
    +    "node_modules/yocto-queue": {
    +      "version": "0.1.0",
    +      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
    +      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/zstd-codec": {
    +      "version": "0.1.4",
    +      "resolved": "https://registry.npmjs.org/zstd-codec/-/zstd-codec-0.1.4.tgz",
    +      "integrity": "sha512-KYnWoFWgGtWyQEKNnUcb3u8ZtKO8dn5d8u+oGpxPlopqsPyv60U8suDyfk7Z7UtAO6Sk5i1aVcAs9RbaB1n36A==",
    +      "dev": true
    +    }
    +  }
    +}
    diff --git a/deps/undici/src/package.json b/deps/undici/src/package.json
    index 67046ad68a3541..2b64daf41e2822 100644
    --- a/deps/undici/src/package.json
    +++ b/deps/undici/src/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "undici",
    -  "version": "5.26.3",
    +  "version": "5.28.2",
       "description": "An HTTP/1.1 client, written from scratch for Node.js",
       "homepage": "https://undici.nodejs.org",
       "bugs": {
    @@ -67,11 +67,10 @@
         "index-fetch.js",
         "lib",
         "types",
    -    "docs",
    -    "scripts/esbuild-build.mjs"
    +    "docs"
       ],
       "scripts": {
    -    "build:node": "node scripts/esbuild-build.mjs",
    +    "build:node": "npx esbuild@0.19.4 index-fetch.js --bundle --platform=node --outfile=undici-fetch.js --define:esbuildDetection=1 --keep-names",
         "prebuild:wasm": "node build/wasm.js --prebuild",
         "build:wasm": "node build/wasm.js --docker",
         "lint": "standard | snazzy",
    @@ -85,7 +84,7 @@
         "test:tdd": "tap test/*.js test/diagnostics-channel/*.js -w",
         "test:typescript": "node scripts/verifyVersion.js 14 || tsd && tsc --skipLibCheck test/imports/undici-import.ts",
         "test:websocket": "node scripts/verifyVersion.js 18 || tap test/websocket/*.js",
    -    "test:wpt": "node scripts/verifyVersion 18 || (node test/wpt/start-fetch.mjs && node test/wpt/start-FileAPI.mjs && node test/wpt/start-mimesniff.mjs && node test/wpt/start-xhr.mjs && node --no-warnings test/wpt/start-websockets.mjs)",
    +    "test:wpt": "node scripts/verifyVersion 18 || (node test/wpt/start-fetch.mjs && node test/wpt/start-FileAPI.mjs && node test/wpt/start-mimesniff.mjs && node test/wpt/start-xhr.mjs && node test/wpt/start-websockets.mjs)",
         "coverage": "nyc --reporter=text --reporter=html npm run test",
         "coverage:ci": "nyc --reporter=lcov npm run test",
         "bench": "PORT=3042 concurrently -k -s first npm:bench:server npm:bench:run",
    @@ -110,22 +109,22 @@
         "delay": "^5.0.0",
         "dns-packet": "^5.4.0",
         "docsify-cli": "^4.4.3",
    -    "esbuild": "^0.19.4",
         "form-data": "^4.0.0",
    -    "formdata-node": "^4.3.1",
    +    "formdata-node": "^6.0.3",
         "https-pem": "^3.0.0",
         "husky": "^8.0.1",
         "import-fresh": "^3.3.0",
         "jest": "^29.0.2",
    -    "jsdom": "^22.1.0",
    +    "jsdom": "^23.0.0",
         "jsfuzz": "^1.0.15",
         "mocha": "^10.0.0",
    +    "mockttp": "^3.9.2",
         "p-timeout": "^3.2.0",
         "pre-commit": "^1.2.2",
         "proxy": "^1.0.2",
         "proxyquire": "^2.1.3",
         "semver": "^7.5.4",
    -    "sinon": "^16.1.0",
    +    "sinon": "^17.0.1",
         "snazzy": "^9.0.0",
         "standard": "^17.0.0",
         "table": "^6.8.0",
    diff --git a/deps/undici/src/scripts/esbuild-build.mjs b/deps/undici/src/scripts/esbuild-build.mjs
    deleted file mode 100644
    index ca5886c1a2b861..00000000000000
    --- a/deps/undici/src/scripts/esbuild-build.mjs
    +++ /dev/null
    @@ -1,24 +0,0 @@
    -import * as esbuild from 'esbuild'
    -import fs from 'node:fs'
    -
    -const bundle = {
    -  name: 'bundle',
    -  setup (build) {
    -    build.onLoad({ filter: /lib(\/|\\)fetch(\/|\\)index.js/ }, async (args) => {
    -      const text = await fs.promises.readFile(args.path, 'utf8')
    -
    -      return {
    -        contents: `var esbuildDetection = 1;${text}`,
    -        loader: 'js'
    -      }
    -    })
    -  }
    -}
    -
    -await esbuild.build({
    -  entryPoints: ['index-fetch.js'],
    -  bundle: true,
    -  outfile: 'undici-fetch.js',
    -  plugins: [bundle],
    -  platform: 'node'
    -})
    diff --git a/deps/undici/src/types/client.d.ts b/deps/undici/src/types/client.d.ts
    index 74948b15f3841f..56e78cc9765bf2 100644
    --- a/deps/undici/src/types/client.d.ts
    +++ b/deps/undici/src/types/client.d.ts
    @@ -77,7 +77,7 @@ export declare namespace Client {
         */
         allowH2?: boolean;
         /**
    -     * @description Dictates the maximum number of concurrent streams for a single H2 session. It can be overriden by a SETTINGS remote frame.
    +     * @description Dictates the maximum number of concurrent streams for a single H2 session. It can be overridden by a SETTINGS remote frame.
          * @default 100
         */
         maxConcurrentStreams?: number
    diff --git a/deps/undici/src/types/dispatcher.d.ts b/deps/undici/src/types/dispatcher.d.ts
    index 816db19d20d878..efc53eea79114e 100644
    --- a/deps/undici/src/types/dispatcher.d.ts
    +++ b/deps/undici/src/types/dispatcher.d.ts
    @@ -211,7 +211,7 @@ declare namespace Dispatcher {
         /** Invoked when request is upgraded either due to a `Upgrade` header or `CONNECT` method. */
         onUpgrade?(statusCode: number, headers: Buffer[] | string[] | null, socket: Duplex): void;
         /** Invoked when statusCode and headers have been received. May be invoked multiple times due to 1xx informational headers. */
    -    onHeaders?(statusCode: number, headers: Buffer[] | string[] | null, resume: () => void): boolean;
    +    onHeaders?(statusCode: number, headers: Buffer[] | string[] | null, resume: () => void, statusText: string): boolean;
         /** Invoked when response payload data is received. */
         onData?(chunk: Buffer): boolean;
         /** Invoked when response payload and trailers have been received and the request has completed. */
    diff --git a/deps/undici/src/types/fetch.d.ts b/deps/undici/src/types/fetch.d.ts
    index fa4619c9182739..440f2b003978fe 100644
    --- a/deps/undici/src/types/fetch.d.ts
    +++ b/deps/undici/src/types/fetch.d.ts
    @@ -108,7 +108,7 @@ export interface RequestInit {
       body?: BodyInit
       redirect?: RequestRedirect
       integrity?: string
    -  signal?: AbortSignal
    +  signal?: AbortSignal | null
       credentials?: RequestCredentials
       mode?: RequestMode
       referrer?: string
    diff --git a/deps/undici/src/types/index.d.ts b/deps/undici/src/types/index.d.ts
    index c7532d69a073cc..0ea8bdc217dbc5 100644
    --- a/deps/undici/src/types/index.d.ts
    +++ b/deps/undici/src/types/index.d.ts
    @@ -14,6 +14,7 @@ import MockPool from'./mock-pool'
     import MockAgent from'./mock-agent'
     import mockErrors from'./mock-errors'
     import ProxyAgent from'./proxy-agent'
    +import RetryHandler from'./retry-handler'
     import { request, pipeline, stream, connect, upgrade } from './api'
     
     export * from './cookies'
    @@ -27,7 +28,7 @@ export * from './content-type'
     export * from './cache'
     export { Interceptable } from './mock-interceptor'
     
    -export { Dispatcher, BalancedPool, Pool, Client, buildConnector, errors, Agent, request, stream, pipeline, connect, upgrade, setGlobalDispatcher, getGlobalDispatcher, setGlobalOrigin, getGlobalOrigin, MockClient, MockPool, MockAgent, mockErrors, ProxyAgent, RedirectHandler, DecoratorHandler }
    +export { Dispatcher, BalancedPool, Pool, Client, buildConnector, errors, Agent, request, stream, pipeline, connect, upgrade, setGlobalDispatcher, getGlobalDispatcher, setGlobalOrigin, getGlobalOrigin, MockClient, MockPool, MockAgent, mockErrors, ProxyAgent, RedirectHandler, DecoratorHandler, RetryHandler }
     export default Undici
     
     declare namespace Undici {
    @@ -35,6 +36,7 @@ declare namespace Undici {
       var Pool: typeof import('./pool').default;
       var RedirectHandler: typeof import ('./handlers').RedirectHandler
       var DecoratorHandler: typeof import ('./handlers').DecoratorHandler
    +  var RetryHandler: typeof import ('./retry-handler').default
       var createRedirectInterceptor: typeof import ('./interceptors').createRedirectInterceptor
       var BalancedPool: typeof import('./balanced-pool').default;
       var Client: typeof import('./client').default;
    @@ -53,5 +55,11 @@ declare namespace Undici {
       var MockAgent: typeof import('./mock-agent').default;
       var mockErrors: typeof import('./mock-errors').default;
       var fetch: typeof import('./fetch').fetch;
    +  var Headers: typeof import('./fetch').Headers;
    +  var Response: typeof import('./fetch').Response;
    +  var Request: typeof import('./fetch').Request;
    +  var FormData: typeof import('./formdata').FormData;
    +  var File: typeof import('./file').File;
    +  var FileReader: typeof import('./filereader').FileReader;
       var caches: typeof import('./cache').caches;
     }
    diff --git a/deps/undici/src/types/retry-handler.d.ts b/deps/undici/src/types/retry-handler.d.ts
    new file mode 100644
    index 00000000000000..0528eb442799cc
    --- /dev/null
    +++ b/deps/undici/src/types/retry-handler.d.ts
    @@ -0,0 +1,116 @@
    +import Dispatcher from "./dispatcher";
    +
    +export default RetryHandler;
    +
    +declare class RetryHandler implements Dispatcher.DispatchHandlers {
    +  constructor(
    +    options: Dispatcher.DispatchOptions & {
    +      retryOptions?: RetryHandler.RetryOptions;
    +    },
    +    retryHandlers: RetryHandler.RetryHandlers
    +  );
    +}
    +
    +declare namespace RetryHandler {
    +  export type RetryState = { counter: number; currentTimeout: number };
    +
    +  export type RetryContext = {
    +    state: RetryState;
    +    opts: Dispatcher.DispatchOptions & {
    +      retryOptions?: RetryHandler.RetryOptions;
    +    };
    +  }
    +
    +  export type OnRetryCallback = (result?: Error | null) => void;
    +
    +  export type RetryCallback = (
    +    err: Error,
    +    context: {
    +      state: RetryState;
    +      opts: Dispatcher.DispatchOptions & {
    +        retryOptions?: RetryHandler.RetryOptions;
    +      };
    +    },
    +    callback: OnRetryCallback
    +  ) => number | null;
    +
    +  export interface RetryOptions {
    +    /**
    +     * Callback to be invoked on every retry iteration.
    +     * It receives the error, current state of the retry object and the options object
    +     * passed when instantiating the retry handler.
    +     *
    +     * @type {RetryCallback}
    +     * @memberof RetryOptions
    +     */
    +    retry?: RetryCallback;
    +    /**
    +     * Maximum number of retries to allow.
    +     *
    +     * @type {number}
    +     * @memberof RetryOptions
    +     * @default 5
    +     */
    +    maxRetries?: number;
    +    /**
    +     * Max number of milliseconds allow between retries
    +     *
    +     * @type {number}
    +     * @memberof RetryOptions
    +     * @default 30000
    +     */
    +    maxTimeout?: number;
    +    /**
    +     * Initial number of milliseconds to wait before retrying for the first time.
    +     *
    +     * @type {number}
    +     * @memberof RetryOptions
    +     * @default 500
    +     */
    +    minTimeout?: number;
    +    /**
    +     * Factior to multiply the timeout factor between retries.
    +     *
    +     * @type {number}
    +     * @memberof RetryOptions
    +     * @default 2
    +     */
    +    timeoutFactor?: number;
    +    /**
    +     * It enables to automatically infer timeout between retries based on the `Retry-After` header.
    +     *
    +     * @type {boolean}
    +     * @memberof RetryOptions
    +     * @default true
    +     */
    +    retryAfter?: boolean;
    +    /**
    +     * HTTP methods to retry.
    +     *
    +     * @type {Dispatcher.HttpMethod[]}
    +     * @memberof RetryOptions
    +     * @default ['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE', 'TRACE'],
    +     */
    +    methods?: Dispatcher.HttpMethod[];
    +    /**
    +     * Error codes to be retried. e.g. `ECONNRESET`, `ENOTFOUND`, `ETIMEDOUT`, `ECONNREFUSED`, etc.
    +     *
    +     * @type {string[]}
    +     * @default ['ECONNRESET','ECONNREFUSED','ENOTFOUND','ENETDOWN','ENETUNREACH','EHOSTDOWN','EHOSTUNREACH','EPIPE']
    +     */
    +    errorCodes?: string[];
    +    /**
    +     * HTTP status codes to be retried.
    +     *
    +     * @type {number[]}
    +     * @memberof RetryOptions
    +     * @default [500, 502, 503, 504, 429],
    +     */
    +    statusCodes?: number[];
    +  }
    +
    +  export interface RetryHandlers {
    +    dispatch: Dispatcher["dispatch"];
    +    handler: Dispatcher.DispatchHandlers;
    +  }
    +}
    diff --git a/deps/undici/undici.js b/deps/undici/undici.js
    index 0c3dc7ebfc149b..847a8814336f5a 100644
    --- a/deps/undici/undici.js
    +++ b/deps/undici/undici.js
    @@ -1,5 +1,7 @@
     "use strict";
    +var __defProp = Object.defineProperty;
     var __getOwnPropNames = Object.getOwnPropertyNames;
    +var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
     var __commonJS = (cb, mod) => function __require() {
       return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
     };
    @@ -66,7 +68,9 @@ var require_symbols = __commonJS({
           kHTTP2BuildRequest: Symbol("http2 build request"),
           kHTTP1BuildRequest: Symbol("http1 build request"),
           kHTTP2CopyHeaders: Symbol("http2 copy headers"),
    -      kHTTPConnVersion: Symbol("http connection version")
    +      kHTTPConnVersion: Symbol("http connection version"),
    +      kRetryHandlerDefaultRetry: Symbol("retry agent default retry"),
    +      kConstruct: Symbol("constructable")
         };
       }
     });
    @@ -91,6 +95,9 @@ var require_errors = __commonJS({
       "lib/core/errors.js"(exports2, module2) {
         "use strict";
         var UndiciError = class extends Error {
    +      static {
    +        __name(this, "UndiciError");
    +      }
           constructor(message) {
             super(message);
             this.name = "UndiciError";
    @@ -98,6 +105,9 @@ var require_errors = __commonJS({
           }
         };
         var ConnectTimeoutError = class _ConnectTimeoutError extends UndiciError {
    +      static {
    +        __name(this, "ConnectTimeoutError");
    +      }
           constructor(message) {
             super(message);
             Error.captureStackTrace(this, _ConnectTimeoutError);
    @@ -107,6 +117,9 @@ var require_errors = __commonJS({
           }
         };
         var HeadersTimeoutError = class _HeadersTimeoutError extends UndiciError {
    +      static {
    +        __name(this, "HeadersTimeoutError");
    +      }
           constructor(message) {
             super(message);
             Error.captureStackTrace(this, _HeadersTimeoutError);
    @@ -116,6 +129,9 @@ var require_errors = __commonJS({
           }
         };
         var HeadersOverflowError = class _HeadersOverflowError extends UndiciError {
    +      static {
    +        __name(this, "HeadersOverflowError");
    +      }
           constructor(message) {
             super(message);
             Error.captureStackTrace(this, _HeadersOverflowError);
    @@ -125,6 +141,9 @@ var require_errors = __commonJS({
           }
         };
         var BodyTimeoutError = class _BodyTimeoutError extends UndiciError {
    +      static {
    +        __name(this, "BodyTimeoutError");
    +      }
           constructor(message) {
             super(message);
             Error.captureStackTrace(this, _BodyTimeoutError);
    @@ -134,6 +153,9 @@ var require_errors = __commonJS({
           }
         };
         var ResponseStatusCodeError = class _ResponseStatusCodeError extends UndiciError {
    +      static {
    +        __name(this, "ResponseStatusCodeError");
    +      }
           constructor(message, statusCode, headers, body) {
             super(message);
             Error.captureStackTrace(this, _ResponseStatusCodeError);
    @@ -147,6 +169,9 @@ var require_errors = __commonJS({
           }
         };
         var InvalidArgumentError = class _InvalidArgumentError extends UndiciError {
    +      static {
    +        __name(this, "InvalidArgumentError");
    +      }
           constructor(message) {
             super(message);
             Error.captureStackTrace(this, _InvalidArgumentError);
    @@ -156,6 +181,9 @@ var require_errors = __commonJS({
           }
         };
         var InvalidReturnValueError = class _InvalidReturnValueError extends UndiciError {
    +      static {
    +        __name(this, "InvalidReturnValueError");
    +      }
           constructor(message) {
             super(message);
             Error.captureStackTrace(this, _InvalidReturnValueError);
    @@ -165,6 +193,9 @@ var require_errors = __commonJS({
           }
         };
         var RequestAbortedError = class _RequestAbortedError extends UndiciError {
    +      static {
    +        __name(this, "RequestAbortedError");
    +      }
           constructor(message) {
             super(message);
             Error.captureStackTrace(this, _RequestAbortedError);
    @@ -174,6 +205,9 @@ var require_errors = __commonJS({
           }
         };
         var InformationalError = class _InformationalError extends UndiciError {
    +      static {
    +        __name(this, "InformationalError");
    +      }
           constructor(message) {
             super(message);
             Error.captureStackTrace(this, _InformationalError);
    @@ -183,6 +217,9 @@ var require_errors = __commonJS({
           }
         };
         var RequestContentLengthMismatchError = class _RequestContentLengthMismatchError extends UndiciError {
    +      static {
    +        __name(this, "RequestContentLengthMismatchError");
    +      }
           constructor(message) {
             super(message);
             Error.captureStackTrace(this, _RequestContentLengthMismatchError);
    @@ -192,6 +229,9 @@ var require_errors = __commonJS({
           }
         };
         var ResponseContentLengthMismatchError = class _ResponseContentLengthMismatchError extends UndiciError {
    +      static {
    +        __name(this, "ResponseContentLengthMismatchError");
    +      }
           constructor(message) {
             super(message);
             Error.captureStackTrace(this, _ResponseContentLengthMismatchError);
    @@ -201,6 +241,9 @@ var require_errors = __commonJS({
           }
         };
         var ClientDestroyedError = class _ClientDestroyedError extends UndiciError {
    +      static {
    +        __name(this, "ClientDestroyedError");
    +      }
           constructor(message) {
             super(message);
             Error.captureStackTrace(this, _ClientDestroyedError);
    @@ -210,6 +253,9 @@ var require_errors = __commonJS({
           }
         };
         var ClientClosedError = class _ClientClosedError extends UndiciError {
    +      static {
    +        __name(this, "ClientClosedError");
    +      }
           constructor(message) {
             super(message);
             Error.captureStackTrace(this, _ClientClosedError);
    @@ -219,6 +265,9 @@ var require_errors = __commonJS({
           }
         };
         var SocketError = class _SocketError extends UndiciError {
    +      static {
    +        __name(this, "SocketError");
    +      }
           constructor(message, socket) {
             super(message);
             Error.captureStackTrace(this, _SocketError);
    @@ -229,6 +278,9 @@ var require_errors = __commonJS({
           }
         };
         var NotSupportedError = class _NotSupportedError extends UndiciError {
    +      static {
    +        __name(this, "NotSupportedError");
    +      }
           constructor(message) {
             super(message);
             Error.captureStackTrace(this, _NotSupportedError);
    @@ -238,6 +290,9 @@ var require_errors = __commonJS({
           }
         };
         var BalancedPoolMissingUpstreamError = class extends UndiciError {
    +      static {
    +        __name(this, "BalancedPoolMissingUpstreamError");
    +      }
           constructor(message) {
             super(message);
             Error.captureStackTrace(this, NotSupportedError);
    @@ -247,6 +302,9 @@ var require_errors = __commonJS({
           }
         };
         var HTTPParserError = class _HTTPParserError extends Error {
    +      static {
    +        __name(this, "HTTPParserError");
    +      }
           constructor(message, code, data) {
             super(message);
             Error.captureStackTrace(this, _HTTPParserError);
    @@ -256,6 +314,9 @@ var require_errors = __commonJS({
           }
         };
         var ResponseExceededMaxSizeError = class _ResponseExceededMaxSizeError extends UndiciError {
    +      static {
    +        __name(this, "ResponseExceededMaxSizeError");
    +      }
           constructor(message) {
             super(message);
             Error.captureStackTrace(this, _ResponseExceededMaxSizeError);
    @@ -264,6 +325,21 @@ var require_errors = __commonJS({
             this.code = "UND_ERR_RES_EXCEEDED_MAX_SIZE";
           }
         };
    +    var RequestRetryError = class _RequestRetryError extends UndiciError {
    +      static {
    +        __name(this, "RequestRetryError");
    +      }
    +      constructor(message, code, { headers, data }) {
    +        super(message);
    +        Error.captureStackTrace(this, _RequestRetryError);
    +        this.name = "RequestRetryError";
    +        this.message = message || "Request retry error";
    +        this.code = "UND_ERR_REQ_RETRY";
    +        this.statusCode = code;
    +        this.data = data;
    +        this.headers = headers;
    +      }
    +    };
         module2.exports = {
           HTTPParserError,
           UndiciError,
    @@ -283,7 +359,8 @@ var require_errors = __commonJS({
           NotSupportedError,
           ResponseContentLengthMismatchError,
           BalancedPoolMissingUpstreamError,
    -      ResponseExceededMaxSizeError
    +      ResponseExceededMaxSizeError,
    +      RequestRetryError
         };
       }
     });
    @@ -304,12 +381,15 @@ var require_util = __commonJS({
         var [nodeMajor, nodeMinor] = process.versions.node.split(".").map((v) => Number(v));
         function nop() {
         }
    +    __name(nop, "nop");
         function isStream(obj) {
           return obj && typeof obj === "object" && typeof obj.pipe === "function" && typeof obj.on === "function";
         }
    +    __name(isStream, "isStream");
         function isBlobLike(object) {
           return Blob2 && object instanceof Blob2 || object && typeof object === "object" && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && /^(Blob|File)$/.test(object[Symbol.toStringTag]);
         }
    +    __name(isBlobLike, "isBlobLike");
         function buildURL(url, queryParams) {
           if (url.includes("?") || url.includes("#")) {
             throw new Error('Query params cannot be passed when url already contains "?" or "#".');
    @@ -320,6 +400,7 @@ var require_util = __commonJS({
           }
           return url;
         }
    +    __name(buildURL, "buildURL");
         function parseURL(url) {
           if (typeof url === "string") {
             url = new URL(url);
    @@ -363,6 +444,7 @@ var require_util = __commonJS({
           }
           return url;
         }
    +    __name(parseURL, "parseURL");
         function parseOrigin(url) {
           url = parseURL(url);
           if (url.pathname !== "/" || url.search || url.hash) {
    @@ -370,17 +452,19 @@ var require_util = __commonJS({
           }
           return url;
         }
    +    __name(parseOrigin, "parseOrigin");
         function getHostname(host) {
           if (host[0] === "[") {
             const idx2 = host.indexOf("]");
             assert(idx2 !== -1);
    -        return host.substr(1, idx2 - 1);
    +        return host.substring(1, idx2);
           }
           const idx = host.indexOf(":");
           if (idx === -1)
             return host;
    -      return host.substr(0, idx);
    +      return host.substring(0, idx);
         }
    +    __name(getHostname, "getHostname");
         function getServerName(host) {
           if (!host) {
             return null;
    @@ -392,15 +476,19 @@ var require_util = __commonJS({
           }
           return servername;
         }
    +    __name(getServerName, "getServerName");
         function deepClone(obj) {
           return JSON.parse(JSON.stringify(obj));
         }
    +    __name(deepClone, "deepClone");
         function isAsyncIterable(obj) {
           return !!(obj != null && typeof obj[Symbol.asyncIterator] === "function");
         }
    +    __name(isAsyncIterable, "isAsyncIterable");
         function isIterable(obj) {
           return !!(obj != null && (typeof obj[Symbol.iterator] === "function" || typeof obj[Symbol.asyncIterator] === "function"));
         }
    +    __name(isIterable, "isIterable");
         function bodyLength(body) {
           if (body == null) {
             return 0;
    @@ -414,15 +502,18 @@ var require_util = __commonJS({
           }
           return null;
         }
    +    __name(bodyLength, "bodyLength");
         function isDestroyed(stream2) {
           return !stream2 || !!(stream2.destroyed || stream2[kDestroyed]);
         }
    +    __name(isDestroyed, "isDestroyed");
         function isReadableAborted(stream2) {
           const state = stream2 && stream2._readableState;
           return isDestroyed(stream2) && state && !state.endEmitted;
         }
    +    __name(isReadableAborted, "isReadableAborted");
         function destroy(stream2, err) {
    -      if (!isStream(stream2) || isDestroyed(stream2)) {
    +      if (stream2 == null || !isStream(stream2) || isDestroyed(stream2)) {
             return;
           }
           if (typeof stream2.destroy === "function") {
    @@ -439,11 +530,13 @@ var require_util = __commonJS({
             stream2[kDestroyed] = true;
           }
         }
    +    __name(destroy, "destroy");
         var KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/;
         function parseKeepAliveTimeout(val) {
           const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR);
           return m ? parseInt(m[1], 10) * 1e3 : null;
         }
    +    __name(parseKeepAliveTimeout, "parseKeepAliveTimeout");
         function parseHeaders(headers, obj = {}) {
           if (!Array.isArray(headers))
             return headers;
    @@ -452,7 +545,7 @@ var require_util = __commonJS({
             let val = obj[key];
             if (!val) {
               if (Array.isArray(headers[i + 1])) {
    -            obj[key] = headers[i + 1];
    +            obj[key] = headers[i + 1].map((x) => x.toString("utf8"));
               } else {
                 obj[key] = headers[i + 1].toString("utf8");
               }
    @@ -469,6 +562,7 @@ var require_util = __commonJS({
           }
           return obj;
         }
    +    __name(parseHeaders, "parseHeaders");
         function parseRawHeaders(headers) {
           const ret = [];
           let hasContentLength = false;
    @@ -490,9 +584,11 @@ var require_util = __commonJS({
           }
           return ret;
         }
    +    __name(parseRawHeaders, "parseRawHeaders");
         function isBuffer(buffer) {
           return buffer instanceof Uint8Array || Buffer.isBuffer(buffer);
         }
    +    __name(isBuffer, "isBuffer");
         function validateHandler(handler, method, upgrade) {
           if (!handler || typeof handler !== "object") {
             throw new InvalidArgumentError("handler must be an object");
    @@ -522,19 +618,23 @@ var require_util = __commonJS({
             }
           }
         }
    +    __name(validateHandler, "validateHandler");
         function isDisturbed(body) {
           return !!(body && (stream.isDisturbed ? stream.isDisturbed(body) || body[kBodyUsed] : body[kBodyUsed] || body.readableDidRead || body._readableState && body._readableState.dataEmitted || isReadableAborted(body)));
         }
    +    __name(isDisturbed, "isDisturbed");
         function isErrored(body) {
           return !!(body && (stream.isErrored ? stream.isErrored(body) : /state: 'errored'/.test(
             nodeUtil.inspect(body)
           )));
         }
    +    __name(isErrored, "isErrored");
         function isReadable(body) {
           return !!(body && (stream.isReadable ? stream.isReadable(body) : /state: 'readable'/.test(
             nodeUtil.inspect(body)
           )));
         }
    +    __name(isReadable, "isReadable");
         function getSocketInfo(socket) {
           return {
             localAddress: socket.localAddress,
    @@ -547,11 +647,13 @@ var require_util = __commonJS({
             bytesRead: socket.bytesRead
           };
         }
    +    __name(getSocketInfo, "getSocketInfo");
         async function* convertIterableToBuffer(iterable) {
           for await (const chunk of iterable) {
             yield Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
           }
         }
    +    __name(convertIterableToBuffer, "convertIterableToBuffer");
         var ReadableStream;
         function ReadableStreamFrom(iterable) {
           if (!ReadableStream) {
    @@ -585,9 +687,11 @@ var require_util = __commonJS({
             0
           );
         }
    +    __name(ReadableStreamFrom, "ReadableStreamFrom");
         function isFormDataLike(object) {
           return object && typeof object === "object" && typeof object.append === "function" && typeof object.delete === "function" && typeof object.get === "function" && typeof object.getAll === "function" && typeof object.has === "function" && typeof object.set === "function" && object[Symbol.toStringTag] === "FormData";
         }
    +    __name(isFormDataLike, "isFormDataLike");
         function throwIfAborted(signal) {
           if (!signal) {
             return;
    @@ -602,16 +706,8 @@ var require_util = __commonJS({
             }
           }
         }
    -    var events;
    +    __name(throwIfAborted, "throwIfAborted");
         function addAbortListener(signal, listener) {
    -      if (typeof Symbol.dispose === "symbol") {
    -        if (!events) {
    -          events = require("events");
    -        }
    -        if (typeof events.addAbortListener === "function" && "aborted" in signal) {
    -          return events.addAbortListener(signal, listener);
    -        }
    -      }
           if ("addEventListener" in signal) {
             signal.addEventListener("abort", listener, { once: true });
             return () => signal.removeEventListener("abort", listener);
    @@ -619,6 +715,7 @@ var require_util = __commonJS({
           signal.addListener("abort", listener);
           return () => signal.removeListener("abort", listener);
         }
    +    __name(addAbortListener, "addAbortListener");
         var hasToWellFormed = !!String.prototype.toWellFormed;
         function toUSVString(val) {
           if (hasToWellFormed) {
    @@ -628,6 +725,18 @@ var require_util = __commonJS({
           }
           return `${val}`;
         }
    +    __name(toUSVString, "toUSVString");
    +    function parseRangeHeader(range) {
    +      if (range == null || range === "")
    +        return { start: 0, end: null, size: null };
    +      const m = range ? range.match(/^bytes (\d+)-(\d+)\/(\d+)?$/) : null;
    +      return m ? {
    +        start: parseInt(m[1]),
    +        end: m[2] ? parseInt(m[2]) : null,
    +        size: m[3] ? parseInt(m[3]) : null
    +      } : null;
    +    }
    +    __name(parseRangeHeader, "parseRangeHeader");
         var kEnumerableProperty = /* @__PURE__ */ Object.create(null);
         kEnumerableProperty.enumerable = true;
         module2.exports = {
    @@ -660,9 +769,11 @@ var require_util = __commonJS({
           buildURL,
           throwIfAborted,
           addAbortListener,
    +      parseRangeHeader,
           nodeMajor,
           nodeMinor,
    -      nodeHasAutoSelectFamily: nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 13
    +      nodeHasAutoSelectFamily: nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 13,
    +      safeHTTPMethods: ["GET", "HEAD", "OPTIONS", "TRACE"]
         };
       }
     });
    @@ -673,8 +784,10 @@ var require_constants = __commonJS({
         "use strict";
         var { MessageChannel, receiveMessageOnPort } = require("worker_threads");
         var corsSafeListedMethods = ["GET", "HEAD", "POST"];
    +    var corsSafeListedMethodsSet = new Set(corsSafeListedMethods);
         var nullBodyStatus = [101, 204, 205, 304];
         var redirectStatus = [301, 302, 303, 307, 308];
    +    var redirectStatusSet = new Set(redirectStatus);
         var badPorts = [
           "1",
           "7",
    @@ -757,6 +870,7 @@ var require_constants = __commonJS({
           "6697",
           "10080"
         ];
    +    var badPortsSet = new Set(badPorts);
         var referrerPolicy = [
           "",
           "no-referrer",
    @@ -768,8 +882,10 @@ var require_constants = __commonJS({
           "strict-origin-when-cross-origin",
           "unsafe-url"
         ];
    +    var referrerPolicySet = new Set(referrerPolicy);
         var requestRedirect = ["follow", "manual", "error"];
         var safeMethods = ["GET", "HEAD", "OPTIONS", "TRACE"];
    +    var safeMethodsSet = new Set(safeMethods);
         var requestMode = ["navigate", "same-origin", "no-cors", "cors"];
         var requestCredentials = ["omit", "same-origin", "include"];
         var requestCache = [
    @@ -795,6 +911,7 @@ var require_constants = __commonJS({
           "half"
         ];
         var forbiddenMethods = ["CONNECT", "TRACE", "TRACK"];
    +    var forbiddenMethodsSet = new Set(forbiddenMethods);
         var subresource = [
           "audio",
           "audioworklet",
    @@ -809,6 +926,7 @@ var require_constants = __commonJS({
           "xslt",
           ""
         ];
    +    var subresourceSet = new Set(subresource);
         var DOMException = globalThis.DOMException ?? (() => {
           try {
             atob("~");
    @@ -819,7 +937,7 @@ var require_constants = __commonJS({
         var channel;
         var structuredClone = globalThis.structuredClone ?? // https://github.com/nodejs/node/blob/b27ae24dcc4251bad726d9d84baf678d1f707fed/lib/internal/structured_clone.js
         // structuredClone was added in v17.0.0, but fetch supports v16.8
    -    function structuredClone2(value, options = void 0) {
    +    /* @__PURE__ */ __name(function structuredClone2(value, options = void 0) {
           if (arguments.length === 0) {
             throw new TypeError("missing argument");
           }
    @@ -830,7 +948,7 @@ var require_constants = __commonJS({
           channel.port2.unref();
           channel.port1.postMessage(value, options?.transfer);
           return receiveMessageOnPort(channel.port2).message;
    -    };
    +    }, "structuredClone");
         module2.exports = {
           DOMException,
           structuredClone,
    @@ -847,7 +965,14 @@ var require_constants = __commonJS({
           nullBodyStatus,
           safeMethods,
           badPorts,
    -      requestDuplex
    +      requestDuplex,
    +      subresourceSet,
    +      badPortsSet,
    +      redirectStatusSet,
    +      corsSafeListedMethodsSet,
    +      safeMethodsSet,
    +      forbiddenMethodsSet,
    +      referrerPolicySet
         };
       }
     });
    @@ -860,6 +985,7 @@ var require_global = __commonJS({
         function getGlobalOrigin() {
           return globalThis[globalOrigin];
         }
    +    __name(getGlobalOrigin, "getGlobalOrigin");
         function setGlobalOrigin(newOrigin) {
           if (newOrigin === void 0) {
             Object.defineProperty(globalThis, globalOrigin, {
    @@ -881,6 +1007,7 @@ var require_global = __commonJS({
             configurable: false
           });
         }
    +    __name(setGlobalOrigin, "setGlobalOrigin");
         module2.exports = {
           getGlobalOrigin,
           setGlobalOrigin
    @@ -892,7 +1019,7 @@ var require_global = __commonJS({
     var require_util2 = __commonJS({
       "lib/fetch/util.js"(exports2, module2) {
         "use strict";
    -    var { redirectStatus, badPorts, referrerPolicy: referrerPolicyTokens } = require_constants();
    +    var { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = require_constants();
         var { getGlobalOrigin } = require_global();
         var { performance: performance2 } = require("perf_hooks");
         var { isBlobLike, toUSVString, ReadableStreamFrom } = require_util();
    @@ -908,8 +1035,9 @@ var require_util2 = __commonJS({
           const length = urlList.length;
           return length === 0 ? null : urlList[length - 1].toString();
         }
    +    __name(responseURL, "responseURL");
         function responseLocationURL(response, requestFragment) {
    -      if (!redirectStatus.includes(response.status)) {
    +      if (!redirectStatusSet.has(response.status)) {
             return null;
           }
           let location = response.headersList.get("location");
    @@ -921,19 +1049,23 @@ var require_util2 = __commonJS({
           }
           return location;
         }
    +    __name(responseLocationURL, "responseLocationURL");
         function requestCurrentURL(request) {
           return request.urlList[request.urlList.length - 1];
         }
    +    __name(requestCurrentURL, "requestCurrentURL");
         function requestBadPort(request) {
           const url = requestCurrentURL(request);
    -      if (urlIsHttpHttpsScheme(url) && badPorts.includes(url.port)) {
    +      if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) {
             return "blocked";
           }
           return "allowed";
         }
    +    __name(requestBadPort, "requestBadPort");
         function isErrorLike(object) {
           return object instanceof Error || (object?.constructor?.name === "Error" || object?.constructor?.name === "DOMException");
         }
    +    __name(isErrorLike, "isErrorLike");
         function isValidReasonPhrase(statusText) {
           for (let i = 0; i < statusText.length; ++i) {
             const c = statusText.charCodeAt(i);
    @@ -945,27 +1077,48 @@ var require_util2 = __commonJS({
           }
           return true;
         }
    -    function isTokenChar(c) {
    -      return !(c >= 127 || c <= 32 || c === "(" || c === ")" || c === "<" || c === ">" || c === "@" || c === "," || c === ";" || c === ":" || c === "\\" || c === '"' || c === "/" || c === "[" || c === "]" || c === "?" || c === "=" || c === "{" || c === "}");
    +    __name(isValidReasonPhrase, "isValidReasonPhrase");
    +    function isTokenCharCode(c) {
    +      switch (c) {
    +        case 34:
    +        case 40:
    +        case 41:
    +        case 44:
    +        case 47:
    +        case 58:
    +        case 59:
    +        case 60:
    +        case 61:
    +        case 62:
    +        case 63:
    +        case 64:
    +        case 91:
    +        case 92:
    +        case 93:
    +        case 123:
    +        case 125:
    +          return false;
    +        default:
    +          return c >= 33 && c <= 126;
    +      }
         }
    +    __name(isTokenCharCode, "isTokenCharCode");
         function isValidHTTPToken(characters) {
    -      if (!characters || typeof characters !== "string") {
    +      if (characters.length === 0) {
             return false;
           }
           for (let i = 0; i < characters.length; ++i) {
    -        const c = characters.charCodeAt(i);
    -        if (c > 127 || !isTokenChar(c)) {
    +        if (!isTokenCharCode(characters.charCodeAt(i))) {
               return false;
             }
           }
           return true;
         }
    +    __name(isValidHTTPToken, "isValidHTTPToken");
         function isValidHeaderName(potentialValue) {
    -      if (potentialValue.length === 0) {
    -        return false;
    -      }
           return isValidHTTPToken(potentialValue);
         }
    +    __name(isValidHeaderName, "isValidHeaderName");
         function isValidHeaderValue(potentialValue) {
           if (potentialValue.startsWith("	") || potentialValue.startsWith(" ") || potentialValue.endsWith("	") || potentialValue.endsWith(" ")) {
             return false;
    @@ -975,6 +1128,7 @@ var require_util2 = __commonJS({
           }
           return true;
         }
    +    __name(isValidHeaderValue, "isValidHeaderValue");
         function setRequestReferrerPolicyOnRedirect(request, actualResponse) {
           const { headersList } = actualResponse;
           const policyHeader = (headersList.get("referrer-policy") ?? "").split(",");
    @@ -982,7 +1136,7 @@ var require_util2 = __commonJS({
           if (policyHeader.length > 0) {
             for (let i = policyHeader.length; i !== 0; i--) {
               const token = policyHeader[i - 1].trim();
    -          if (referrerPolicyTokens.includes(token)) {
    +          if (referrerPolicyTokens.has(token)) {
                 policy = token;
                 break;
               }
    @@ -992,20 +1146,25 @@ var require_util2 = __commonJS({
             request.referrerPolicy = policy;
           }
         }
    +    __name(setRequestReferrerPolicyOnRedirect, "setRequestReferrerPolicyOnRedirect");
         function crossOriginResourcePolicyCheck() {
           return "allowed";
         }
    +    __name(crossOriginResourcePolicyCheck, "crossOriginResourcePolicyCheck");
         function corsCheck() {
           return "success";
         }
    +    __name(corsCheck, "corsCheck");
         function TAOCheck() {
           return "success";
         }
    +    __name(TAOCheck, "TAOCheck");
         function appendFetchMetadata(httpRequest) {
           let header = null;
           header = httpRequest.mode;
           httpRequest.headersList.set("sec-fetch-mode", header);
         }
    +    __name(appendFetchMetadata, "appendFetchMetadata");
         function appendRequestOriginHeader(request) {
           let serializedOrigin = request.origin;
           if (request.responseTainting === "cors" || request.mode === "websocket") {
    @@ -1036,9 +1195,11 @@ var require_util2 = __commonJS({
             }
           }
         }
    +    __name(appendRequestOriginHeader, "appendRequestOriginHeader");
         function coarsenedSharedCurrentTime(crossOriginIsolatedCapability) {
           return performance2.now();
         }
    +    __name(coarsenedSharedCurrentTime, "coarsenedSharedCurrentTime");
         function createOpaqueTimingInfo(timingInfo) {
           return {
             startTime: timingInfo.startTime ?? 0,
    @@ -1054,16 +1215,19 @@ var require_util2 = __commonJS({
             finalConnectionTimingInfo: null
           };
         }
    +    __name(createOpaqueTimingInfo, "createOpaqueTimingInfo");
         function makePolicyContainer() {
           return {
             referrerPolicy: "strict-origin-when-cross-origin"
           };
         }
    +    __name(makePolicyContainer, "makePolicyContainer");
         function clonePolicyContainer(policyContainer) {
           return {
             referrerPolicy: policyContainer.referrerPolicy
           };
         }
    +    __name(clonePolicyContainer, "clonePolicyContainer");
         function determineRequestsReferrer(request) {
           const policy = request.referrerPolicy;
           assert(policy);
    @@ -1109,6 +1273,7 @@ var require_util2 = __commonJS({
               return isNonPotentiallyTrustWorthy ? "no-referrer" : referrerOrigin;
           }
         }
    +    __name(determineRequestsReferrer, "determineRequestsReferrer");
         function stripURLForReferrer(url, originOnly) {
           assert(url instanceof URL);
           if (url.protocol === "file:" || url.protocol === "about:" || url.protocol === "blank:") {
    @@ -1123,6 +1288,7 @@ var require_util2 = __commonJS({
           }
           return url;
         }
    +    __name(stripURLForReferrer, "stripURLForReferrer");
         function isURLPotentiallyTrustworthy(url) {
           if (!(url instanceof URL)) {
             return false;
    @@ -1147,7 +1313,9 @@ var require_util2 = __commonJS({
             }
             return false;
           }
    +      __name(isOriginPotentiallyTrustworthy, "isOriginPotentiallyTrustworthy");
         }
    +    __name(isURLPotentiallyTrustworthy, "isURLPotentiallyTrustworthy");
         function bytesMatch(bytes, metadataList) {
           if (crypto === void 0) {
             return true;
    @@ -1185,6 +1353,7 @@ var require_util2 = __commonJS({
           }
           return false;
         }
    +    __name(bytesMatch, "bytesMatch");
         var parseHashWithOptions = /((?sha256|sha384|sha512)-(?[A-z0-9+/]{1}.*={0,2}))( +[\x21-\x7e]?)?/i;
         function parseMetadata(metadata) {
           const result = [];
    @@ -1206,8 +1375,10 @@ var require_util2 = __commonJS({
           }
           return result;
         }
    +    __name(parseMetadata, "parseMetadata");
         function tryUpgradeRequestToAPotentiallyTrustworthyURL(request) {
         }
    +    __name(tryUpgradeRequestToAPotentiallyTrustworthyURL, "tryUpgradeRequestToAPotentiallyTrustworthyURL");
         function sameOrigin(A, B) {
           if (A.origin === B.origin && A.origin === "null") {
             return true;
    @@ -1217,6 +1388,7 @@ var require_util2 = __commonJS({
           }
           return false;
         }
    +    __name(sameOrigin, "sameOrigin");
         function createDeferredPromise() {
           let res;
           let rej;
    @@ -1226,15 +1398,34 @@ var require_util2 = __commonJS({
           });
           return { promise, resolve: res, reject: rej };
         }
    +    __name(createDeferredPromise, "createDeferredPromise");
         function isAborted(fetchParams) {
           return fetchParams.controller.state === "aborted";
         }
    +    __name(isAborted, "isAborted");
         function isCancelled(fetchParams) {
           return fetchParams.controller.state === "aborted" || fetchParams.controller.state === "terminated";
         }
    +    __name(isCancelled, "isCancelled");
    +    var normalizeMethodRecord = {
    +      delete: "DELETE",
    +      DELETE: "DELETE",
    +      get: "GET",
    +      GET: "GET",
    +      head: "HEAD",
    +      HEAD: "HEAD",
    +      options: "OPTIONS",
    +      OPTIONS: "OPTIONS",
    +      post: "POST",
    +      POST: "POST",
    +      put: "PUT",
    +      PUT: "PUT"
    +    };
    +    Object.setPrototypeOf(normalizeMethodRecord, null);
         function normalizeMethod(method) {
    -      return /^(DELETE|GET|HEAD|OPTIONS|POST|PUT)$/i.test(method) ? method.toUpperCase() : method;
    +      return normalizeMethodRecord[method.toLowerCase()] ?? method;
         }
    +    __name(normalizeMethod, "normalizeMethod");
         function serializeJavascriptValueToJSONString(value) {
           const result = JSON.stringify(value);
           if (result === void 0) {
    @@ -1243,6 +1434,7 @@ var require_util2 = __commonJS({
           assert(typeof result === "string");
           return result;
         }
    +    __name(serializeJavascriptValueToJSONString, "serializeJavascriptValueToJSONString");
         var esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()));
         function makeIterator(iterator, name, kind) {
           const object = {
    @@ -1274,6 +1466,7 @@ var require_util2 = __commonJS({
           Object.setPrototypeOf(i, esIteratorPrototype);
           return Object.setPrototypeOf({}, i);
         }
    +    __name(makeIterator, "makeIterator");
         function iteratorResult(pair, kind) {
           let result;
           switch (kind) {
    @@ -1292,6 +1485,7 @@ var require_util2 = __commonJS({
           }
           return { value: result, done: false };
         }
    +    __name(iteratorResult, "iteratorResult");
         async function fullyReadBody(body, processBody, processBodyError) {
           const successSteps = processBody;
           const errorSteps = processBodyError;
    @@ -1309,6 +1503,7 @@ var require_util2 = __commonJS({
             errorSteps(e);
           }
         }
    +    __name(fullyReadBody, "fullyReadBody");
         var ReadableStream = globalThis.ReadableStream;
         function isReadableStreamLike(stream) {
           if (!ReadableStream) {
    @@ -1316,6 +1511,7 @@ var require_util2 = __commonJS({
           }
           return stream instanceof ReadableStream || stream[Symbol.toStringTag] === "ReadableStream" && typeof stream.tee === "function";
         }
    +    __name(isReadableStreamLike, "isReadableStreamLike");
         var MAXIMUM_ARGUMENT_LENGTH = 65535;
         function isomorphicDecode(input) {
           if (input.length < MAXIMUM_ARGUMENT_LENGTH) {
    @@ -1323,6 +1519,7 @@ var require_util2 = __commonJS({
           }
           return input.reduce((previous, current) => previous + String.fromCharCode(current), "");
         }
    +    __name(isomorphicDecode, "isomorphicDecode");
         function readableStreamClose(controller) {
           try {
             controller.close();
    @@ -1332,12 +1529,14 @@ var require_util2 = __commonJS({
             }
           }
         }
    +    __name(readableStreamClose, "readableStreamClose");
         function isomorphicEncode(input) {
           for (let i = 0; i < input.length; i++) {
             assert(input.charCodeAt(i) <= 255);
           }
           return input;
         }
    +    __name(isomorphicEncode, "isomorphicEncode");
         async function readAllBytes(reader) {
           const bytes = [];
           let byteLength = 0;
    @@ -1353,22 +1552,26 @@ var require_util2 = __commonJS({
             byteLength += chunk.length;
           }
         }
    +    __name(readAllBytes, "readAllBytes");
         function urlIsLocal(url) {
           assert("protocol" in url);
           const protocol = url.protocol;
           return protocol === "about:" || protocol === "blob:" || protocol === "data:";
         }
    +    __name(urlIsLocal, "urlIsLocal");
         function urlHasHttpsScheme(url) {
           if (typeof url === "string") {
             return url.startsWith("https:");
           }
           return url.protocol === "https:";
         }
    +    __name(urlHasHttpsScheme, "urlHasHttpsScheme");
         function urlIsHttpHttpsScheme(url) {
           assert("protocol" in url);
           const protocol = url.protocol;
           return protocol === "http:" || protocol === "https:";
         }
    +    __name(urlIsHttpHttpsScheme, "urlIsHttpHttpsScheme");
         var hasOwn = Object.hasOwn || ((dict, key) => Object.prototype.hasOwnProperty.call(dict, key));
         module2.exports = {
           isAborted,
    @@ -1413,7 +1616,8 @@ var require_util2 = __commonJS({
           urlIsLocal,
           urlHasHttpsScheme,
           urlIsHttpHttpsScheme,
    -      readAllBytes
    +      readAllBytes,
    +      normalizeMethodRecord
         };
       }
     });
    @@ -1680,10 +1884,9 @@ var require_webidl = __commonJS({
         webidl.converters.ByteString = function(V) {
           const x = webidl.converters.DOMString(V);
           for (let index = 0; index < x.length; index++) {
    -        const charCode = x.charCodeAt(index);
    -        if (charCode > 255) {
    +        if (x.charCodeAt(index) > 255) {
               throw new TypeError(
    -            `Cannot convert argument to a ByteString because the character at index ${index} has a value of ${charCode} which is greater than 255.`
    +            `Cannot convert argument to a ByteString because the character at index ${index} has a value of ${x.charCodeAt(index)} which is greater than 255.`
               );
             }
           }
    @@ -1792,7 +1995,7 @@ var require_webidl = __commonJS({
     var require_headers = __commonJS({
       "lib/fetch/headers.js"(exports2, module2) {
         "use strict";
    -    var { kHeadersList } = require_symbols();
    +    var { kHeadersList, kConstruct } = require_symbols();
         var { kGuard } = require_symbols2();
         var { kEnumerableProperty } = require_util();
         var {
    @@ -1804,26 +2007,36 @@ var require_headers = __commonJS({
         var assert = require("assert");
         var kHeadersMap = Symbol("headers map");
         var kHeadersSortedMap = Symbol("headers map sorted");
    -    function headerValueNormalize(potentialValue) {
    -      let i = potentialValue.length;
    -      while (/[\r\n\t ]/.test(potentialValue.charAt(--i)))
    -        ;
    -      return potentialValue.slice(0, i + 1).replace(/^[\r\n\t ]+/, "");
    +    function isHTTPWhiteSpaceCharCode(code) {
    +      return code === 10 || code === 13 || code === 9 || code === 32;
         }
    +    __name(isHTTPWhiteSpaceCharCode, "isHTTPWhiteSpaceCharCode");
    +    function headerValueNormalize(potentialValue) {
    +      let i = 0;
    +      let j = potentialValue.length;
    +      while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(j - 1)))
    +        --j;
    +      while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(i)))
    +        ++i;
    +      return i === 0 && j === potentialValue.length ? potentialValue : potentialValue.substring(i, j);
    +    }
    +    __name(headerValueNormalize, "headerValueNormalize");
         function fill(headers, object) {
           if (Array.isArray(object)) {
    -        for (const header of object) {
    +        for (let i = 0; i < object.length; ++i) {
    +          const header = object[i];
               if (header.length !== 2) {
                 throw webidl.errors.exception({
                   header: "Headers constructor",
                   message: `expected name/value pair to be length 2, found ${header.length}.`
                 });
               }
    -          headers.append(header[0], header[1]);
    +          appendHeader(headers, header[0], header[1]);
             }
           } else if (typeof object === "object" && object !== null) {
    -        for (const [key, value] of Object.entries(object)) {
    -          headers.append(key, value);
    +        const keys = Object.keys(object);
    +        for (let i = 0; i < keys.length; ++i) {
    +          appendHeader(headers, keys[i], object[keys[i]]);
             }
           } else {
             throw webidl.errors.conversionFailed({
    @@ -1833,14 +2046,40 @@ var require_headers = __commonJS({
             });
           }
         }
    +    __name(fill, "fill");
    +    function appendHeader(headers, name, value) {
    +      value = headerValueNormalize(value);
    +      if (!isValidHeaderName(name)) {
    +        throw webidl.errors.invalidArgument({
    +          prefix: "Headers.append",
    +          value: name,
    +          type: "header name"
    +        });
    +      } else if (!isValidHeaderValue(value)) {
    +        throw webidl.errors.invalidArgument({
    +          prefix: "Headers.append",
    +          value,
    +          type: "header value"
    +        });
    +      }
    +      if (headers[kGuard] === "immutable") {
    +        throw new TypeError("immutable");
    +      } else if (headers[kGuard] === "request-no-cors") {
    +      }
    +      return headers[kHeadersList].append(name, value);
    +    }
    +    __name(appendHeader, "appendHeader");
         var HeadersList = class _HeadersList {
    +      static {
    +        __name(this, "HeadersList");
    +      }
           /** @type {[string, string][]|null} */
           cookies = null;
           constructor(init) {
             if (init instanceof _HeadersList) {
               this[kHeadersMap] = new Map(init[kHeadersMap]);
               this[kHeadersSortedMap] = init[kHeadersSortedMap];
    -          this.cookies = init.cookies;
    +          this.cookies = init.cookies === null ? null : [...init.cookies];
             } else {
               this[kHeadersMap] = new Map(init);
               this[kHeadersSortedMap] = null;
    @@ -1882,7 +2121,7 @@ var require_headers = __commonJS({
             if (lowercaseName === "set-cookie") {
               this.cookies = [value];
             }
    -        return this[kHeadersMap].set(lowercaseName, { name, value });
    +        this[kHeadersMap].set(lowercaseName, { name, value });
           }
           // https://fetch.spec.whatwg.org/#concept-header-list-delete
           delete(name) {
    @@ -1891,14 +2130,12 @@ var require_headers = __commonJS({
             if (name === "set-cookie") {
               this.cookies = null;
             }
    -        return this[kHeadersMap].delete(name);
    +        this[kHeadersMap].delete(name);
           }
           // https://fetch.spec.whatwg.org/#concept-header-list-get
           get(name) {
    -        if (!this.contains(name)) {
    -          return null;
    -        }
    -        return this[kHeadersMap].get(name.toLowerCase())?.value ?? null;
    +        const value = this[kHeadersMap].get(name.toLowerCase());
    +        return value === void 0 ? null : value.value;
           }
           *[Symbol.iterator]() {
             for (const [name, { value }] of this[kHeadersMap]) {
    @@ -1916,7 +2153,13 @@ var require_headers = __commonJS({
           }
         };
         var Headers = class _Headers {
    +      static {
    +        __name(this, "Headers");
    +      }
           constructor(init = void 0) {
    +        if (init === kConstruct) {
    +          return;
    +        }
             this[kHeadersList] = new HeadersList();
             this[kGuard] = "none";
             if (init !== void 0) {
    @@ -1930,25 +2173,7 @@ var require_headers = __commonJS({
             webidl.argumentLengthCheck(arguments, 2, { header: "Headers.append" });
             name = webidl.converters.ByteString(name);
             value = webidl.converters.ByteString(value);
    -        value = headerValueNormalize(value);
    -        if (!isValidHeaderName(name)) {
    -          throw webidl.errors.invalidArgument({
    -            prefix: "Headers.append",
    -            value: name,
    -            type: "header name"
    -          });
    -        } else if (!isValidHeaderValue(value)) {
    -          throw webidl.errors.invalidArgument({
    -            prefix: "Headers.append",
    -            value,
    -            type: "header value"
    -          });
    -        }
    -        if (this[kGuard] === "immutable") {
    -          throw new TypeError("immutable");
    -        } else if (this[kGuard] === "request-no-cors") {
    -        }
    -        return this[kHeadersList].append(name, value);
    +        return appendHeader(this, name, value);
           }
           // https://fetch.spec.whatwg.org/#dom-headers-delete
           delete(name) {
    @@ -1969,7 +2194,7 @@ var require_headers = __commonJS({
             if (!this[kHeadersList].contains(name)) {
               return;
             }
    -        return this[kHeadersList].delete(name);
    +        this[kHeadersList].delete(name);
           }
           // https://fetch.spec.whatwg.org/#dom-headers-get
           get(name) {
    @@ -2023,7 +2248,7 @@ var require_headers = __commonJS({
               throw new TypeError("immutable");
             } else if (this[kGuard] === "request-no-cors") {
             }
    -        return this[kHeadersList].set(name, value);
    +        this[kHeadersList].set(name, value);
           }
           // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie
           getSetCookie() {
    @@ -2042,10 +2267,11 @@ var require_headers = __commonJS({
             const headers = [];
             const names = [...this[kHeadersList]].sort((a, b) => a[0] < b[0] ? -1 : 1);
             const cookies = this[kHeadersList].cookies;
    -        for (const [name, value] of names) {
    +        for (let i = 0; i < names.length; ++i) {
    +          const [name, value] = names[i];
               if (name === "set-cookie") {
    -            for (const value2 of cookies) {
    -              headers.push([name, value2]);
    +            for (let j = 0; j < cookies.length; ++j) {
    +              headers.push([name, cookies[j]]);
                 }
               } else {
                 assert(value !== null);
    @@ -2057,6 +2283,14 @@ var require_headers = __commonJS({
           }
           keys() {
             webidl.brandCheck(this, _Headers);
    +        if (this[kGuard] === "immutable") {
    +          const value = this[kHeadersSortedMap];
    +          return makeIterator(
    +            () => value,
    +            "Headers",
    +            "key"
    +          );
    +        }
             return makeIterator(
               () => [...this[kHeadersSortedMap].values()],
               "Headers",
    @@ -2065,6 +2299,14 @@ var require_headers = __commonJS({
           }
           values() {
             webidl.brandCheck(this, _Headers);
    +        if (this[kGuard] === "immutable") {
    +          const value = this[kHeadersSortedMap];
    +          return makeIterator(
    +            () => value,
    +            "Headers",
    +            "value"
    +          );
    +        }
             return makeIterator(
               () => [...this[kHeadersSortedMap].values()],
               "Headers",
    @@ -2073,6 +2315,14 @@ var require_headers = __commonJS({
           }
           entries() {
             webidl.brandCheck(this, _Headers);
    +        if (this[kGuard] === "immutable") {
    +          const value = this[kHeadersSortedMap];
    +          return makeIterator(
    +            () => value,
    +            "Headers",
    +            "key+value"
    +          );
    +        }
             return makeIterator(
               () => [...this[kHeadersSortedMap].values()],
               "Headers",
    @@ -2170,6 +2420,7 @@ var require_sbmh = __commonJS({
             this._occ[needle[i]] = needleLength - 1 - i;
           }
         }
    +    __name(SBMH, "SBMH");
         inherits(SBMH, EventEmitter);
         SBMH.prototype.reset = function() {
           this._lookbehind_size = 0;
    @@ -2285,6 +2536,7 @@ var require_PartStream = __commonJS({
         function PartStream(opts) {
           ReadableStream.call(this, opts);
         }
    +    __name(PartStream, "PartStream");
         inherits(PartStream, ReadableStream);
         PartStream.prototype._read = function(n) {
         };
    @@ -2296,7 +2548,7 @@ var require_PartStream = __commonJS({
     var require_getLimit = __commonJS({
       "node_modules/@fastify/busboy/lib/utils/getLimit.js"(exports2, module2) {
         "use strict";
    -    module2.exports = function getLimit(limits, name, defaultLimit) {
    +    module2.exports = /* @__PURE__ */ __name(function getLimit(limits, name, defaultLimit) {
           if (!limits || limits[name] === void 0 || limits[name] === null) {
             return defaultLimit;
           }
    @@ -2304,7 +2556,7 @@ var require_getLimit = __commonJS({
             throw new TypeError("Limit " + name + " is not a valid number");
           }
           return limits[name];
    -    };
    +    }, "getLimit");
       }
     });
     
    @@ -2348,6 +2600,7 @@ var require_HeaderParser = __commonJS({
             }
           });
         }
    +    __name(HeaderParser, "HeaderParser");
         inherits(HeaderParser, EventEmitter);
         HeaderParser.prototype.push = function(data) {
           const r = this.ss.push(data);
    @@ -2420,8 +2673,8 @@ var require_Dicer = __commonJS({
         var DASH = 45;
         var B_ONEDASH = Buffer.from("-");
         var B_CRLF = Buffer.from("\r\n");
    -    var EMPTY_FN = function() {
    -    };
    +    var EMPTY_FN = /* @__PURE__ */ __name(function() {
    +    }, "EMPTY_FN");
         function Dicer(cfg) {
           if (!(this instanceof Dicer)) {
             return new Dicer(cfg);
    @@ -2456,6 +2709,7 @@ var require_Dicer = __commonJS({
             self._part.emit("header", header);
           });
         }
    +    __name(Dicer, "Dicer");
         inherits(Dicer, WritableStream);
         Dicer.prototype.emit = function(ev) {
           if (ev === "finish" && !this._realFinish) {
    @@ -2657,23 +2911,103 @@ var require_decodeText = __commonJS({
           ["utf-8", utf8Decoder],
           ["utf8", utf8Decoder]
         ]);
    -    function decodeText(text, textEncoding, destEncoding) {
    -      if (text) {
    -        if (textDecoders.has(destEncoding)) {
    -          try {
    -            return textDecoders.get(destEncoding).decode(Buffer.from(text, textEncoding));
    -          } catch (e) {
    -          }
    -        } else {
    +    function getDecoder(charset) {
    +      let lc;
    +      while (true) {
    +        switch (charset) {
    +          case "utf-8":
    +          case "utf8":
    +            return decoders.utf8;
    +          case "latin1":
    +          case "ascii":
    +          case "us-ascii":
    +          case "iso-8859-1":
    +          case "iso8859-1":
    +          case "iso88591":
    +          case "iso_8859-1":
    +          case "windows-1252":
    +          case "iso_8859-1:1987":
    +          case "cp1252":
    +          case "x-cp1252":
    +            return decoders.latin1;
    +          case "utf16le":
    +          case "utf-16le":
    +          case "ucs2":
    +          case "ucs-2":
    +            return decoders.utf16le;
    +          case "base64":
    +            return decoders.base64;
    +          default:
    +            if (lc === void 0) {
    +              lc = true;
    +              charset = charset.toLowerCase();
    +              continue;
    +            }
    +            return decoders.other.bind(charset);
    +        }
    +      }
    +    }
    +    __name(getDecoder, "getDecoder");
    +    var decoders = {
    +      utf8: (data, sourceEncoding) => {
    +        if (data.length === 0) {
    +          return "";
    +        }
    +        if (typeof data === "string") {
    +          data = Buffer.from(data, sourceEncoding);
    +        }
    +        return data.utf8Slice(0, data.length);
    +      },
    +      latin1: (data, sourceEncoding) => {
    +        if (data.length === 0) {
    +          return "";
    +        }
    +        if (typeof data === "string") {
    +          return data;
    +        }
    +        return data.latin1Slice(0, data.length);
    +      },
    +      utf16le: (data, sourceEncoding) => {
    +        if (data.length === 0) {
    +          return "";
    +        }
    +        if (typeof data === "string") {
    +          data = Buffer.from(data, sourceEncoding);
    +        }
    +        return data.ucs2Slice(0, data.length);
    +      },
    +      base64: (data, sourceEncoding) => {
    +        if (data.length === 0) {
    +          return "";
    +        }
    +        if (typeof data === "string") {
    +          data = Buffer.from(data, sourceEncoding);
    +        }
    +        return data.base64Slice(0, data.length);
    +      },
    +      other: (data, sourceEncoding) => {
    +        if (data.length === 0) {
    +          return "";
    +        }
    +        if (typeof data === "string") {
    +          data = Buffer.from(data, sourceEncoding);
    +        }
    +        if (textDecoders.has(exports2.toString())) {
               try {
    -            textDecoders.set(destEncoding, new TextDecoder(destEncoding));
    -            return textDecoders.get(destEncoding).decode(Buffer.from(text, textEncoding));
    +            return textDecoders.get(exports2).decode(data);
               } catch (e) {
               }
             }
    +        return typeof data === "string" ? data : data.toString();
    +      }
    +    };
    +    function decodeText(text, sourceEncoding, destEncoding) {
    +      if (text) {
    +        return getDecoder(destEncoding)(text, sourceEncoding);
           }
           return text;
         }
    +    __name(decodeText, "decodeText");
         module2.exports = decodeText;
       }
     });
    @@ -2683,19 +3017,511 @@ var require_parseParams = __commonJS({
       "node_modules/@fastify/busboy/lib/utils/parseParams.js"(exports2, module2) {
         "use strict";
         var decodeText = require_decodeText();
    -    var RE_ENCODED = /%([a-fA-F0-9]{2})/g;
    -    function encodedReplacer(match, byte) {
    -      return String.fromCharCode(parseInt(byte, 16));
    -    }
    +    var RE_ENCODED = /%[a-fA-F0-9][a-fA-F0-9]/g;
    +    var EncodedLookup = {
    +      "%00": "\0",
    +      "%01": "",
    +      "%02": "",
    +      "%03": "",
    +      "%04": "",
    +      "%05": "",
    +      "%06": "",
    +      "%07": "\x07",
    +      "%08": "\b",
    +      "%09": "	",
    +      "%0a": "\n",
    +      "%0A": "\n",
    +      "%0b": "\v",
    +      "%0B": "\v",
    +      "%0c": "\f",
    +      "%0C": "\f",
    +      "%0d": "\r",
    +      "%0D": "\r",
    +      "%0e": "",
    +      "%0E": "",
    +      "%0f": "",
    +      "%0F": "",
    +      "%10": "",
    +      "%11": "",
    +      "%12": "",
    +      "%13": "",
    +      "%14": "",
    +      "%15": "",
    +      "%16": "",
    +      "%17": "",
    +      "%18": "",
    +      "%19": "",
    +      "%1a": "",
    +      "%1A": "",
    +      "%1b": "\x1B",
    +      "%1B": "\x1B",
    +      "%1c": "",
    +      "%1C": "",
    +      "%1d": "",
    +      "%1D": "",
    +      "%1e": "",
    +      "%1E": "",
    +      "%1f": "",
    +      "%1F": "",
    +      "%20": " ",
    +      "%21": "!",
    +      "%22": '"',
    +      "%23": "#",
    +      "%24": "$",
    +      "%25": "%",
    +      "%26": "&",
    +      "%27": "'",
    +      "%28": "(",
    +      "%29": ")",
    +      "%2a": "*",
    +      "%2A": "*",
    +      "%2b": "+",
    +      "%2B": "+",
    +      "%2c": ",",
    +      "%2C": ",",
    +      "%2d": "-",
    +      "%2D": "-",
    +      "%2e": ".",
    +      "%2E": ".",
    +      "%2f": "/",
    +      "%2F": "/",
    +      "%30": "0",
    +      "%31": "1",
    +      "%32": "2",
    +      "%33": "3",
    +      "%34": "4",
    +      "%35": "5",
    +      "%36": "6",
    +      "%37": "7",
    +      "%38": "8",
    +      "%39": "9",
    +      "%3a": ":",
    +      "%3A": ":",
    +      "%3b": ";",
    +      "%3B": ";",
    +      "%3c": "<",
    +      "%3C": "<",
    +      "%3d": "=",
    +      "%3D": "=",
    +      "%3e": ">",
    +      "%3E": ">",
    +      "%3f": "?",
    +      "%3F": "?",
    +      "%40": "@",
    +      "%41": "A",
    +      "%42": "B",
    +      "%43": "C",
    +      "%44": "D",
    +      "%45": "E",
    +      "%46": "F",
    +      "%47": "G",
    +      "%48": "H",
    +      "%49": "I",
    +      "%4a": "J",
    +      "%4A": "J",
    +      "%4b": "K",
    +      "%4B": "K",
    +      "%4c": "L",
    +      "%4C": "L",
    +      "%4d": "M",
    +      "%4D": "M",
    +      "%4e": "N",
    +      "%4E": "N",
    +      "%4f": "O",
    +      "%4F": "O",
    +      "%50": "P",
    +      "%51": "Q",
    +      "%52": "R",
    +      "%53": "S",
    +      "%54": "T",
    +      "%55": "U",
    +      "%56": "V",
    +      "%57": "W",
    +      "%58": "X",
    +      "%59": "Y",
    +      "%5a": "Z",
    +      "%5A": "Z",
    +      "%5b": "[",
    +      "%5B": "[",
    +      "%5c": "\\",
    +      "%5C": "\\",
    +      "%5d": "]",
    +      "%5D": "]",
    +      "%5e": "^",
    +      "%5E": "^",
    +      "%5f": "_",
    +      "%5F": "_",
    +      "%60": "`",
    +      "%61": "a",
    +      "%62": "b",
    +      "%63": "c",
    +      "%64": "d",
    +      "%65": "e",
    +      "%66": "f",
    +      "%67": "g",
    +      "%68": "h",
    +      "%69": "i",
    +      "%6a": "j",
    +      "%6A": "j",
    +      "%6b": "k",
    +      "%6B": "k",
    +      "%6c": "l",
    +      "%6C": "l",
    +      "%6d": "m",
    +      "%6D": "m",
    +      "%6e": "n",
    +      "%6E": "n",
    +      "%6f": "o",
    +      "%6F": "o",
    +      "%70": "p",
    +      "%71": "q",
    +      "%72": "r",
    +      "%73": "s",
    +      "%74": "t",
    +      "%75": "u",
    +      "%76": "v",
    +      "%77": "w",
    +      "%78": "x",
    +      "%79": "y",
    +      "%7a": "z",
    +      "%7A": "z",
    +      "%7b": "{",
    +      "%7B": "{",
    +      "%7c": "|",
    +      "%7C": "|",
    +      "%7d": "}",
    +      "%7D": "}",
    +      "%7e": "~",
    +      "%7E": "~",
    +      "%7f": "\x7F",
    +      "%7F": "\x7F",
    +      "%80": "\x80",
    +      "%81": "\x81",
    +      "%82": "\x82",
    +      "%83": "\x83",
    +      "%84": "\x84",
    +      "%85": "\x85",
    +      "%86": "\x86",
    +      "%87": "\x87",
    +      "%88": "\x88",
    +      "%89": "\x89",
    +      "%8a": "\x8A",
    +      "%8A": "\x8A",
    +      "%8b": "\x8B",
    +      "%8B": "\x8B",
    +      "%8c": "\x8C",
    +      "%8C": "\x8C",
    +      "%8d": "\x8D",
    +      "%8D": "\x8D",
    +      "%8e": "\x8E",
    +      "%8E": "\x8E",
    +      "%8f": "\x8F",
    +      "%8F": "\x8F",
    +      "%90": "\x90",
    +      "%91": "\x91",
    +      "%92": "\x92",
    +      "%93": "\x93",
    +      "%94": "\x94",
    +      "%95": "\x95",
    +      "%96": "\x96",
    +      "%97": "\x97",
    +      "%98": "\x98",
    +      "%99": "\x99",
    +      "%9a": "\x9A",
    +      "%9A": "\x9A",
    +      "%9b": "\x9B",
    +      "%9B": "\x9B",
    +      "%9c": "\x9C",
    +      "%9C": "\x9C",
    +      "%9d": "\x9D",
    +      "%9D": "\x9D",
    +      "%9e": "\x9E",
    +      "%9E": "\x9E",
    +      "%9f": "\x9F",
    +      "%9F": "\x9F",
    +      "%a0": "\xA0",
    +      "%A0": "\xA0",
    +      "%a1": "\xA1",
    +      "%A1": "\xA1",
    +      "%a2": "\xA2",
    +      "%A2": "\xA2",
    +      "%a3": "\xA3",
    +      "%A3": "\xA3",
    +      "%a4": "\xA4",
    +      "%A4": "\xA4",
    +      "%a5": "\xA5",
    +      "%A5": "\xA5",
    +      "%a6": "\xA6",
    +      "%A6": "\xA6",
    +      "%a7": "\xA7",
    +      "%A7": "\xA7",
    +      "%a8": "\xA8",
    +      "%A8": "\xA8",
    +      "%a9": "\xA9",
    +      "%A9": "\xA9",
    +      "%aa": "\xAA",
    +      "%Aa": "\xAA",
    +      "%aA": "\xAA",
    +      "%AA": "\xAA",
    +      "%ab": "\xAB",
    +      "%Ab": "\xAB",
    +      "%aB": "\xAB",
    +      "%AB": "\xAB",
    +      "%ac": "\xAC",
    +      "%Ac": "\xAC",
    +      "%aC": "\xAC",
    +      "%AC": "\xAC",
    +      "%ad": "\xAD",
    +      "%Ad": "\xAD",
    +      "%aD": "\xAD",
    +      "%AD": "\xAD",
    +      "%ae": "\xAE",
    +      "%Ae": "\xAE",
    +      "%aE": "\xAE",
    +      "%AE": "\xAE",
    +      "%af": "\xAF",
    +      "%Af": "\xAF",
    +      "%aF": "\xAF",
    +      "%AF": "\xAF",
    +      "%b0": "\xB0",
    +      "%B0": "\xB0",
    +      "%b1": "\xB1",
    +      "%B1": "\xB1",
    +      "%b2": "\xB2",
    +      "%B2": "\xB2",
    +      "%b3": "\xB3",
    +      "%B3": "\xB3",
    +      "%b4": "\xB4",
    +      "%B4": "\xB4",
    +      "%b5": "\xB5",
    +      "%B5": "\xB5",
    +      "%b6": "\xB6",
    +      "%B6": "\xB6",
    +      "%b7": "\xB7",
    +      "%B7": "\xB7",
    +      "%b8": "\xB8",
    +      "%B8": "\xB8",
    +      "%b9": "\xB9",
    +      "%B9": "\xB9",
    +      "%ba": "\xBA",
    +      "%Ba": "\xBA",
    +      "%bA": "\xBA",
    +      "%BA": "\xBA",
    +      "%bb": "\xBB",
    +      "%Bb": "\xBB",
    +      "%bB": "\xBB",
    +      "%BB": "\xBB",
    +      "%bc": "\xBC",
    +      "%Bc": "\xBC",
    +      "%bC": "\xBC",
    +      "%BC": "\xBC",
    +      "%bd": "\xBD",
    +      "%Bd": "\xBD",
    +      "%bD": "\xBD",
    +      "%BD": "\xBD",
    +      "%be": "\xBE",
    +      "%Be": "\xBE",
    +      "%bE": "\xBE",
    +      "%BE": "\xBE",
    +      "%bf": "\xBF",
    +      "%Bf": "\xBF",
    +      "%bF": "\xBF",
    +      "%BF": "\xBF",
    +      "%c0": "\xC0",
    +      "%C0": "\xC0",
    +      "%c1": "\xC1",
    +      "%C1": "\xC1",
    +      "%c2": "\xC2",
    +      "%C2": "\xC2",
    +      "%c3": "\xC3",
    +      "%C3": "\xC3",
    +      "%c4": "\xC4",
    +      "%C4": "\xC4",
    +      "%c5": "\xC5",
    +      "%C5": "\xC5",
    +      "%c6": "\xC6",
    +      "%C6": "\xC6",
    +      "%c7": "\xC7",
    +      "%C7": "\xC7",
    +      "%c8": "\xC8",
    +      "%C8": "\xC8",
    +      "%c9": "\xC9",
    +      "%C9": "\xC9",
    +      "%ca": "\xCA",
    +      "%Ca": "\xCA",
    +      "%cA": "\xCA",
    +      "%CA": "\xCA",
    +      "%cb": "\xCB",
    +      "%Cb": "\xCB",
    +      "%cB": "\xCB",
    +      "%CB": "\xCB",
    +      "%cc": "\xCC",
    +      "%Cc": "\xCC",
    +      "%cC": "\xCC",
    +      "%CC": "\xCC",
    +      "%cd": "\xCD",
    +      "%Cd": "\xCD",
    +      "%cD": "\xCD",
    +      "%CD": "\xCD",
    +      "%ce": "\xCE",
    +      "%Ce": "\xCE",
    +      "%cE": "\xCE",
    +      "%CE": "\xCE",
    +      "%cf": "\xCF",
    +      "%Cf": "\xCF",
    +      "%cF": "\xCF",
    +      "%CF": "\xCF",
    +      "%d0": "\xD0",
    +      "%D0": "\xD0",
    +      "%d1": "\xD1",
    +      "%D1": "\xD1",
    +      "%d2": "\xD2",
    +      "%D2": "\xD2",
    +      "%d3": "\xD3",
    +      "%D3": "\xD3",
    +      "%d4": "\xD4",
    +      "%D4": "\xD4",
    +      "%d5": "\xD5",
    +      "%D5": "\xD5",
    +      "%d6": "\xD6",
    +      "%D6": "\xD6",
    +      "%d7": "\xD7",
    +      "%D7": "\xD7",
    +      "%d8": "\xD8",
    +      "%D8": "\xD8",
    +      "%d9": "\xD9",
    +      "%D9": "\xD9",
    +      "%da": "\xDA",
    +      "%Da": "\xDA",
    +      "%dA": "\xDA",
    +      "%DA": "\xDA",
    +      "%db": "\xDB",
    +      "%Db": "\xDB",
    +      "%dB": "\xDB",
    +      "%DB": "\xDB",
    +      "%dc": "\xDC",
    +      "%Dc": "\xDC",
    +      "%dC": "\xDC",
    +      "%DC": "\xDC",
    +      "%dd": "\xDD",
    +      "%Dd": "\xDD",
    +      "%dD": "\xDD",
    +      "%DD": "\xDD",
    +      "%de": "\xDE",
    +      "%De": "\xDE",
    +      "%dE": "\xDE",
    +      "%DE": "\xDE",
    +      "%df": "\xDF",
    +      "%Df": "\xDF",
    +      "%dF": "\xDF",
    +      "%DF": "\xDF",
    +      "%e0": "\xE0",
    +      "%E0": "\xE0",
    +      "%e1": "\xE1",
    +      "%E1": "\xE1",
    +      "%e2": "\xE2",
    +      "%E2": "\xE2",
    +      "%e3": "\xE3",
    +      "%E3": "\xE3",
    +      "%e4": "\xE4",
    +      "%E4": "\xE4",
    +      "%e5": "\xE5",
    +      "%E5": "\xE5",
    +      "%e6": "\xE6",
    +      "%E6": "\xE6",
    +      "%e7": "\xE7",
    +      "%E7": "\xE7",
    +      "%e8": "\xE8",
    +      "%E8": "\xE8",
    +      "%e9": "\xE9",
    +      "%E9": "\xE9",
    +      "%ea": "\xEA",
    +      "%Ea": "\xEA",
    +      "%eA": "\xEA",
    +      "%EA": "\xEA",
    +      "%eb": "\xEB",
    +      "%Eb": "\xEB",
    +      "%eB": "\xEB",
    +      "%EB": "\xEB",
    +      "%ec": "\xEC",
    +      "%Ec": "\xEC",
    +      "%eC": "\xEC",
    +      "%EC": "\xEC",
    +      "%ed": "\xED",
    +      "%Ed": "\xED",
    +      "%eD": "\xED",
    +      "%ED": "\xED",
    +      "%ee": "\xEE",
    +      "%Ee": "\xEE",
    +      "%eE": "\xEE",
    +      "%EE": "\xEE",
    +      "%ef": "\xEF",
    +      "%Ef": "\xEF",
    +      "%eF": "\xEF",
    +      "%EF": "\xEF",
    +      "%f0": "\xF0",
    +      "%F0": "\xF0",
    +      "%f1": "\xF1",
    +      "%F1": "\xF1",
    +      "%f2": "\xF2",
    +      "%F2": "\xF2",
    +      "%f3": "\xF3",
    +      "%F3": "\xF3",
    +      "%f4": "\xF4",
    +      "%F4": "\xF4",
    +      "%f5": "\xF5",
    +      "%F5": "\xF5",
    +      "%f6": "\xF6",
    +      "%F6": "\xF6",
    +      "%f7": "\xF7",
    +      "%F7": "\xF7",
    +      "%f8": "\xF8",
    +      "%F8": "\xF8",
    +      "%f9": "\xF9",
    +      "%F9": "\xF9",
    +      "%fa": "\xFA",
    +      "%Fa": "\xFA",
    +      "%fA": "\xFA",
    +      "%FA": "\xFA",
    +      "%fb": "\xFB",
    +      "%Fb": "\xFB",
    +      "%fB": "\xFB",
    +      "%FB": "\xFB",
    +      "%fc": "\xFC",
    +      "%Fc": "\xFC",
    +      "%fC": "\xFC",
    +      "%FC": "\xFC",
    +      "%fd": "\xFD",
    +      "%Fd": "\xFD",
    +      "%fD": "\xFD",
    +      "%FD": "\xFD",
    +      "%fe": "\xFE",
    +      "%Fe": "\xFE",
    +      "%fE": "\xFE",
    +      "%FE": "\xFE",
    +      "%ff": "\xFF",
    +      "%Ff": "\xFF",
    +      "%fF": "\xFF",
    +      "%FF": "\xFF"
    +    };
    +    function encodedReplacer(match) {
    +      return EncodedLookup[match];
    +    }
    +    __name(encodedReplacer, "encodedReplacer");
    +    var STATE_KEY = 0;
    +    var STATE_VALUE = 1;
    +    var STATE_CHARSET = 2;
    +    var STATE_LANG = 3;
         function parseParams(str) {
           const res = [];
    -      let state = "key";
    +      let state = STATE_KEY;
           let charset = "";
           let inquote = false;
           let escaping = false;
           let p = 0;
           let tmp = "";
    -      for (var i = 0, len = str.length; i < len; ++i) {
    +      const len = str.length;
    +      for (var i = 0; i < len; ++i) {
             const char = str[i];
             if (char === "\\" && inquote) {
               if (escaping) {
    @@ -2708,7 +3534,7 @@ var require_parseParams = __commonJS({
               if (!escaping) {
                 if (inquote) {
                   inquote = false;
    -              state = "key";
    +              state = STATE_KEY;
                 } else {
                   inquote = true;
                 }
    @@ -2721,26 +3547,22 @@ var require_parseParams = __commonJS({
                 tmp += "\\";
               }
               escaping = false;
    -          if ((state === "charset" || state === "lang") && char === "'") {
    -            if (state === "charset") {
    -              state = "lang";
    +          if ((state === STATE_CHARSET || state === STATE_LANG) && char === "'") {
    +            if (state === STATE_CHARSET) {
    +              state = STATE_LANG;
                   charset = tmp.substring(1);
                 } else {
    -              state = "value";
    +              state = STATE_VALUE;
                 }
                 tmp = "";
                 continue;
    -          } else if (state === "key" && (char === "*" || char === "=") && res.length) {
    -            if (char === "*") {
    -              state = "charset";
    -            } else {
    -              state = "value";
    -            }
    +          } else if (state === STATE_KEY && (char === "*" || char === "=") && res.length) {
    +            state = char === "*" ? STATE_CHARSET : STATE_VALUE;
                 res[p] = [tmp, void 0];
                 tmp = "";
                 continue;
               } else if (!inquote && char === ";") {
    -            state = "key";
    +            state = STATE_KEY;
                 if (charset) {
                   if (tmp.length) {
                     tmp = decodeText(
    @@ -2785,6 +3607,7 @@ var require_parseParams = __commonJS({
           }
           return res;
         }
    +    __name(parseParams, "parseParams");
         module2.exports = parseParams;
       }
     });
    @@ -2793,7 +3616,7 @@ var require_parseParams = __commonJS({
     var require_basename = __commonJS({
       "node_modules/@fastify/busboy/lib/utils/basename.js"(exports2, module2) {
         "use strict";
    -    module2.exports = function basename(path) {
    +    module2.exports = /* @__PURE__ */ __name(function basename(path) {
           if (typeof path !== "string") {
             return "";
           }
    @@ -2806,7 +3629,7 @@ var require_basename = __commonJS({
             }
           }
           return path === ".." || path === "." ? "" : path;
    -    };
    +    }, "basename");
       }
     });
     
    @@ -2850,6 +3673,7 @@ var require_multipart = __commonJS({
               self.end();
             }
           }
    +      __name(checkFinished, "checkFinished");
           if (typeof boundary !== "string") {
             throw new Error("Multipart: Boundary not found");
           }
    @@ -2886,7 +3710,7 @@ var require_multipart = __commonJS({
               self._cb = void 0;
               cb();
             }
    -      }).on("part", function onPart(part) {
    +      }).on("part", /* @__PURE__ */ __name(function onPart(part) {
             if (++self._nparts > partsLimit) {
               self.parser.removeListener("part", onPart);
               self.parser.on("part", skipPart);
    @@ -2987,7 +3811,7 @@ var require_multipart = __commonJS({
                   }
                 };
                 boy.emit("file", fieldname, file, filename, encoding, contype);
    -            onData = function(data) {
    +            onData = /* @__PURE__ */ __name(function(data) {
                   if ((nsize += data.length) > fileSizeLimit) {
                     const extralen = fileSizeLimit - nsize + data.length;
                     if (extralen > 0) {
    @@ -3002,11 +3826,11 @@ var require_multipart = __commonJS({
                     self._pause = true;
                   }
                   file.bytesRead = nsize;
    -            };
    -            onEnd = function() {
    +            }, "onData");
    +            onEnd = /* @__PURE__ */ __name(function() {
                   curFile = void 0;
                   file.push(null);
    -            };
    +            }, "onEnd");
               } else {
                 if (nfields === fieldsLimit) {
                   if (!boy.hitFieldsLimit) {
    @@ -3020,7 +3844,7 @@ var require_multipart = __commonJS({
                 let buffer = "";
                 let truncated = false;
                 curField = part;
    -            onData = function(data) {
    +            onData = /* @__PURE__ */ __name(function(data) {
                   if ((nsize += data.length) > fieldSizeLimit) {
                     const extralen = fieldSizeLimit - (nsize - data.length);
                     buffer += data.toString("binary", 0, extralen);
    @@ -3029,8 +3853,8 @@ var require_multipart = __commonJS({
                   } else {
                     buffer += data.toString("binary");
                   }
    -            };
    -            onEnd = function() {
    +            }, "onData");
    +            onEnd = /* @__PURE__ */ __name(function() {
                   curField = void 0;
                   if (buffer.length) {
                     buffer = decodeText(buffer, "binary", charset);
    @@ -3038,7 +3862,7 @@ var require_multipart = __commonJS({
                   boy.emit("field", fieldname, buffer, false, truncated, encoding, contype);
                   --nends;
                   checkFinished();
    -            };
    +            }, "onEnd");
               }
               part._readableState.sync = false;
               part.on("data", onData);
    @@ -3048,13 +3872,14 @@ var require_multipart = __commonJS({
                 curFile.emit("error", err);
               }
             });
    -      }).on("error", function(err) {
    +      }, "onPart")).on("error", function(err) {
             boy.emit("error", err);
           }).on("finish", function() {
             finished = true;
             checkFinished();
           });
         }
    +    __name(Multipart, "Multipart");
         Multipart.prototype.write = function(chunk, cb) {
           const r = this.parser.write(chunk);
           if (r && !this._pause) {
    @@ -3078,11 +3903,13 @@ var require_multipart = __commonJS({
         function skipPart(part) {
           part.resume();
         }
    +    __name(skipPart, "skipPart");
         function FileStream(opts) {
           Readable.call(this, opts);
           this.bytesRead = 0;
           this.truncated = false;
         }
    +    __name(FileStream, "FileStream");
         inherits(FileStream, Readable);
         FileStream.prototype._read = function(n) {
         };
    @@ -3228,6 +4055,7 @@ var require_Decoder = __commonJS({
         function Decoder() {
           this.buffer = void 0;
         }
    +    __name(Decoder, "Decoder");
         Decoder.prototype.write = function(str) {
           str = str.replace(RE_PLUS, " ");
           let res = "";
    @@ -3308,6 +4136,7 @@ var require_urlencoded = __commonJS({
           this._valTrunc = false;
           this._hitLimit = false;
         }
    +    __name(UrlEncoded, "UrlEncoded");
         UrlEncoded.prototype.write = function(data, cb) {
           if (this._fields === this.fieldsLimit) {
             if (!this.boy.hitFieldsLimit) {
    @@ -3520,6 +4349,7 @@ var require_main = __commonJS({
           this._parser = this.getParserByHeaders(headers);
           this._finished = false;
         }
    +    __name(Busboy, "Busboy");
         inherits(Busboy, WritableStream);
         Busboy.prototype.emit = function(ev) {
           if (ev === "finish") {
    @@ -3610,17 +4440,16 @@ var require_dataURL = __commonJS({
           }
           return { mimeType: mimeTypeRecord, body };
         }
    +    __name(dataURLProcessor, "dataURLProcessor");
         function URLSerializer(url, excludeFragment = false) {
    -      const href = url.href;
           if (!excludeFragment) {
    -        return href;
    +        return url.href;
           }
    -      const hash = href.lastIndexOf("#");
    -      if (hash === -1) {
    -        return href;
    -      }
    -      return href.slice(0, hash);
    +      const href = url.href;
    +      const hashLength = url.hash.length;
    +      return hashLength === 0 ? href : href.substring(0, href.length - hashLength);
         }
    +    __name(URLSerializer, "URLSerializer");
         function collectASequenceOfCodePoints(condition, input, position) {
           let result = "";
           while (position.position < input.length && condition(input[position.position])) {
    @@ -3629,6 +4458,7 @@ var require_dataURL = __commonJS({
           }
           return result;
         }
    +    __name(collectASequenceOfCodePoints, "collectASequenceOfCodePoints");
         function collectASequenceOfCodePointsFast(char, input, position) {
           const idx = input.indexOf(char, position.position);
           const start = position.position;
    @@ -3639,10 +4469,12 @@ var require_dataURL = __commonJS({
           position.position = idx;
           return input.slice(start, position.position);
         }
    +    __name(collectASequenceOfCodePointsFast, "collectASequenceOfCodePointsFast");
         function stringPercentDecode(input) {
           const bytes = encoder.encode(input);
           return percentDecode(bytes);
         }
    +    __name(stringPercentDecode, "stringPercentDecode");
         function percentDecode(input) {
           const output = [];
           for (let i = 0; i < input.length; i++) {
    @@ -3660,6 +4492,7 @@ var require_dataURL = __commonJS({
           }
           return Uint8Array.from(output);
         }
    +    __name(percentDecode, "percentDecode");
         function parseMIMEType(input) {
           input = removeHTTPWhitespace(input, true, true);
           const position = { position: 0 };
    @@ -3742,6 +4575,7 @@ var require_dataURL = __commonJS({
           }
           return mimeType;
         }
    +    __name(parseMIMEType, "parseMIMEType");
         function forgivingBase64(data) {
           data = data.replace(/[\u0009\u000A\u000C\u000D\u0020]/g, "");
           if (data.length % 4 === 0) {
    @@ -3760,6 +4594,7 @@ var require_dataURL = __commonJS({
           }
           return bytes;
         }
    +    __name(forgivingBase64, "forgivingBase64");
         function collectAnHTTPQuotedString(input, position, extractValue) {
           const positionStart = position.position;
           let value = "";
    @@ -3793,6 +4628,7 @@ var require_dataURL = __commonJS({
           }
           return input.slice(positionStart, position.position);
         }
    +    __name(collectAnHTTPQuotedString, "collectAnHTTPQuotedString");
         function serializeAMimeType(mimeType) {
           assert(mimeType !== "failure");
           const { parameters, essence } = mimeType;
    @@ -3810,9 +4646,11 @@ var require_dataURL = __commonJS({
           }
           return serialization;
         }
    +    __name(serializeAMimeType, "serializeAMimeType");
         function isHTTPWhiteSpace(char) {
           return char === "\r" || char === "\n" || char === "	" || char === " ";
         }
    +    __name(isHTTPWhiteSpace, "isHTTPWhiteSpace");
         function removeHTTPWhitespace(str, leading = true, trailing = true) {
           let lead = 0;
           let trail = str.length - 1;
    @@ -3826,9 +4664,11 @@ var require_dataURL = __commonJS({
           }
           return str.slice(lead, trail + 1);
         }
    +    __name(removeHTTPWhitespace, "removeHTTPWhitespace");
         function isASCIIWhitespace(char) {
           return char === "\r" || char === "\n" || char === "	" || char === "\f" || char === " ";
         }
    +    __name(isASCIIWhitespace, "isASCIIWhitespace");
         function removeASCIIWhitespace(str, leading = true, trailing = true) {
           let lead = 0;
           let trail = str.length - 1;
    @@ -3842,6 +4682,7 @@ var require_dataURL = __commonJS({
           }
           return str.slice(lead, trail + 1);
         }
    +    __name(removeASCIIWhitespace, "removeASCIIWhitespace");
         module2.exports = {
           dataURLProcessor,
           URLSerializer,
    @@ -3866,7 +4707,11 @@ var require_file = __commonJS({
         var { webidl } = require_webidl();
         var { parseMIMEType, serializeAMimeType } = require_dataURL();
         var { kEnumerableProperty } = require_util();
    +    var encoder = new TextEncoder();
         var File = class _File extends Blob2 {
    +      static {
    +        __name(this, "File");
    +      }
           constructor(fileBits, fileName, options = {}) {
             webidl.argumentLengthCheck(arguments, 2, { header: "File constructor" });
             fileBits = webidl.converters["sequence"](fileBits);
    @@ -3907,6 +4752,9 @@ var require_file = __commonJS({
           }
         };
         var FileLike = class _FileLike {
    +      static {
    +        __name(this, "FileLike");
    +      }
           constructor(blobLike, fileName, options = {}) {
             const n = fileName;
             const t = options.type;
    @@ -4011,7 +4859,7 @@ var require_file = __commonJS({
               if (options.endings === "native") {
                 s = convertLineEndingsNative(s);
               }
    -          bytes.push(new TextEncoder().encode(s));
    +          bytes.push(encoder.encode(s));
             } else if (types.isAnyArrayBuffer(element) || types.isTypedArray(element)) {
               if (!element.buffer) {
                 bytes.push(new Uint8Array(element));
    @@ -4026,6 +4874,7 @@ var require_file = __commonJS({
           }
           return bytes;
         }
    +    __name(processBlobParts, "processBlobParts");
         function convertLineEndingsNative(s) {
           let nativeLineEnding = "\n";
           if (process.platform === "win32") {
    @@ -4033,9 +4882,11 @@ var require_file = __commonJS({
           }
           return s.replace(/\r?\n/g, nativeLineEnding);
         }
    +    __name(convertLineEndingsNative, "convertLineEndingsNative");
         function isFileLike(object) {
           return NativeFile && object instanceof NativeFile || object instanceof File || object && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && object[Symbol.toStringTag] === "File";
         }
    +    __name(isFileLike, "isFileLike");
         module2.exports = { File, FileLike, isFileLike };
       }
     });
    @@ -4051,6 +4902,9 @@ var require_formdata = __commonJS({
         var { Blob: Blob2, File: NativeFile } = require("buffer");
         var File = NativeFile ?? UndiciFile;
         var FormData = class _FormData {
    +      static {
    +        __name(this, "FormData");
    +      }
           constructor(form) {
             if (form !== void 0) {
               throw webidl.errors.conversionFailed({
    @@ -4192,6 +5046,7 @@ var require_formdata = __commonJS({
           }
           return { name, value };
         }
    +    __name(makeEntry, "makeEntry");
         module2.exports = { FormData };
       }
     });
    @@ -4223,6 +5078,8 @@ var require_body = __commonJS({
         var { parseMIMEType, serializeAMimeType } = require_dataURL();
         var ReadableStream = globalThis.ReadableStream;
         var File = NativeFile ?? UndiciFile;
    +    var textEncoder = new TextEncoder();
    +    var textDecoder = new TextDecoder();
         function extractBody(object, keepalive = false) {
           if (!ReadableStream) {
             ReadableStream = require("stream/web").ReadableStream;
    @@ -4236,7 +5093,7 @@ var require_body = __commonJS({
             stream = new ReadableStream({
               async pull(controller) {
                 controller.enqueue(
    -              typeof source === "string" ? new TextEncoder().encode(source) : source
    +              typeof source === "string" ? textEncoder.encode(source) : source
                 );
                 queueMicrotask(() => readableStreamClose(controller));
               },
    @@ -4264,23 +5121,22 @@ var require_body = __commonJS({
             const boundary = `----formdata-undici-0${`${Math.floor(Math.random() * 1e11)}`.padStart(11, "0")}`;
             const prefix = `--${boundary}\r
     Content-Disposition: form-data`;
    -        const escape = (str) => str.replace(/\n/g, "%0A").replace(/\r/g, "%0D").replace(/"/g, "%22");
    -        const normalizeLinefeeds = (value) => value.replace(/\r?\n|\r/g, "\r\n");
    -        const enc = new TextEncoder();
    +        const escape = /* @__PURE__ */ __name((str) => str.replace(/\n/g, "%0A").replace(/\r/g, "%0D").replace(/"/g, "%22"), "escape");
    +        const normalizeLinefeeds = /* @__PURE__ */ __name((value) => value.replace(/\r?\n|\r/g, "\r\n"), "normalizeLinefeeds");
             const blobParts = [];
             const rn = new Uint8Array([13, 10]);
             length = 0;
             let hasUnknownSizeValue = false;
             for (const [name, value] of object) {
               if (typeof value === "string") {
    -            const chunk2 = enc.encode(prefix + `; name="${escape(normalizeLinefeeds(name))}"\r
    +            const chunk2 = textEncoder.encode(prefix + `; name="${escape(normalizeLinefeeds(name))}"\r
     \r
     ${normalizeLinefeeds(value)}\r
     `);
                 blobParts.push(chunk2);
                 length += chunk2.byteLength;
               } else {
    -            const chunk2 = enc.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` + (value.name ? `; filename="${escape(value.name)}"` : "") + `\r
    +            const chunk2 = textEncoder.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` + (value.name ? `; filename="${escape(value.name)}"` : "") + `\r
     Content-Type: ${value.type || "application/octet-stream"}\r
     \r
     `);
    @@ -4292,14 +5148,14 @@ Content-Type: ${value.type || "application/octet-stream"}\r
                 }
               }
             }
    -        const chunk = enc.encode(`--${boundary}--`);
    +        const chunk = textEncoder.encode(`--${boundary}--`);
             blobParts.push(chunk);
             length += chunk.byteLength;
             if (hasUnknownSizeValue) {
               length = null;
             }
             source = object;
    -        action = async function* () {
    +        action = /* @__PURE__ */ __name(async function* () {
               for (const part of blobParts) {
                 if (part.stream) {
                   yield* part.stream();
    @@ -4307,7 +5163,7 @@ Content-Type: ${value.type || "application/octet-stream"}\r
                   yield part;
                 }
               }
    -        };
    +        }, "action");
             type = "multipart/form-data; boundary=" + boundary;
           } else if (isBlobLike(object)) {
             source = object;
    @@ -4357,6 +5213,7 @@ Content-Type: ${value.type || "application/octet-stream"}\r
           const body = { stream, source, length };
           return [body, type];
         }
    +    __name(extractBody, "extractBody");
         function safelyExtractBody(object, keepalive = false) {
           if (!ReadableStream) {
             ReadableStream = require("stream/web").ReadableStream;
    @@ -4367,6 +5224,7 @@ Content-Type: ${value.type || "application/octet-stream"}\r
           }
           return extractBody(object, keepalive);
         }
    +    __name(safelyExtractBody, "safelyExtractBody");
         function cloneBody(body) {
           const [out1, out2] = body.stream.tee();
           const out2Clone = structuredClone(out2, { transfer: [out2] });
    @@ -4378,6 +5236,7 @@ Content-Type: ${value.type || "application/octet-stream"}\r
             source: body.source
           };
         }
    +    __name(cloneBody, "cloneBody");
         async function* consumeBody(body) {
           if (body) {
             if (isUint8Array(body)) {
    @@ -4395,11 +5254,13 @@ Content-Type: ${value.type || "application/octet-stream"}\r
             }
           }
         }
    +    __name(consumeBody, "consumeBody");
         function throwIfAborted(state) {
           if (state.aborted) {
             throw new DOMException("The operation was aborted.", "AbortError");
           }
         }
    +    __name(throwIfAborted, "throwIfAborted");
         function bodyMixinMethods(instance) {
           const methods = {
             blob() {
    @@ -4482,14 +5343,14 @@ Content-Type: ${value.type || "application/octet-stream"}\r
                 let entries;
                 try {
                   let text = "";
    -              const textDecoder = new TextDecoder("utf-8", { ignoreBOM: true });
    +              const streamingDecoder = new TextDecoder("utf-8", { ignoreBOM: true });
                   for await (const chunk of consumeBody(this[kState].body)) {
                     if (!isUint8Array(chunk)) {
                       throw new TypeError("Expected Uint8Array chunk");
                     }
    -                text += textDecoder.decode(chunk, { stream: true });
    +                text += streamingDecoder.decode(chunk, { stream: true });
                   }
    -              text += textDecoder.decode();
    +              text += streamingDecoder.decode();
                   entries = new URLSearchParams(text);
                 } catch (err) {
                   throw Object.assign(new TypeError(), { cause: err });
    @@ -4511,9 +5372,11 @@ Content-Type: ${value.type || "application/octet-stream"}\r
           };
           return methods;
         }
    +    __name(bodyMixinMethods, "bodyMixinMethods");
         function mixinBody(prototype) {
           Object.assign(prototype.prototype, bodyMixinMethods(prototype));
         }
    +    __name(mixinBody, "mixinBody");
         async function specConsumeBody(object, convertBytesToJSValue, instance) {
           webidl.brandCheck(object, instance);
           throwIfAborted(object[kState]);
    @@ -4521,14 +5384,14 @@ Content-Type: ${value.type || "application/octet-stream"}\r
             throw new TypeError("Body is unusable");
           }
           const promise = createDeferredPromise();
    -      const errorSteps = (error) => promise.reject(error);
    -      const successSteps = (data) => {
    +      const errorSteps = /* @__PURE__ */ __name((error) => promise.reject(error), "errorSteps");
    +      const successSteps = /* @__PURE__ */ __name((data) => {
             try {
               promise.resolve(convertBytesToJSValue(data));
             } catch (e) {
               errorSteps(e);
             }
    -      };
    +      }, "successSteps");
           if (object[kState].body == null) {
             successSteps(new Uint8Array());
             return promise.promise;
    @@ -4536,9 +5399,11 @@ Content-Type: ${value.type || "application/octet-stream"}\r
           await fullyReadBody(object[kState].body, successSteps, errorSteps);
           return promise.promise;
         }
    +    __name(specConsumeBody, "specConsumeBody");
         function bodyUnusable(body) {
           return body != null && (body.stream.locked || util.isDisturbed(body.stream));
         }
    +    __name(bodyUnusable, "bodyUnusable");
         function utf8DecodeBytes(buffer) {
           if (buffer.length === 0) {
             return "";
    @@ -4546,12 +5411,14 @@ Content-Type: ${value.type || "application/octet-stream"}\r
           if (buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191) {
             buffer = buffer.subarray(3);
           }
    -      const output = new TextDecoder().decode(buffer);
    +      const output = textDecoder.decode(buffer);
           return output;
         }
    +    __name(utf8DecodeBytes, "utf8DecodeBytes");
         function parseJSONFromBytes(bytes) {
           return JSON.parse(utf8DecodeBytes(bytes));
         }
    +    __name(parseJSONFromBytes, "parseJSONFromBytes");
         function bodyMimeType(object) {
           const { headersList } = object[kState];
           const contentType = headersList.get("content-type");
    @@ -4560,6 +5427,7 @@ Content-Type: ${value.type || "application/octet-stream"}\r
           }
           return parseMIMEType(contentType);
         }
    +    __name(bodyMimeType, "bodyMimeType");
         module2.exports = {
           extractBody,
           safelyExtractBody,
    @@ -4587,7 +5455,7 @@ var require_response = __commonJS({
           isomorphicEncode
         } = require_util2();
         var {
    -      redirectStatus,
    +      redirectStatusSet,
           nullBodyStatus,
           DOMException
         } = require_constants();
    @@ -4596,11 +5464,15 @@ var require_response = __commonJS({
         var { FormData } = require_formdata();
         var { getGlobalOrigin } = require_global();
         var { URLSerializer } = require_dataURL();
    -    var { kHeadersList } = require_symbols();
    +    var { kHeadersList, kConstruct } = require_symbols();
         var assert = require("assert");
         var { types } = require("util");
         var ReadableStream = globalThis.ReadableStream || require("stream/web").ReadableStream;
    +    var textEncoder = new TextEncoder("utf-8");
         var Response = class _Response {
    +      static {
    +        __name(this, "Response");
    +      }
           // Creates network error Response.
           static error() {
             const relevantRealm = { settingsObject: {} };
    @@ -4618,7 +5490,7 @@ var require_response = __commonJS({
             if (init !== null) {
               init = webidl.converters.ResponseInit(init);
             }
    -        const bytes = new TextEncoder("utf-8").encode(
    +        const bytes = textEncoder.encode(
               serializeJavascriptValueToJSONString(data)
             );
             const body = extractBody(bytes);
    @@ -4644,7 +5516,7 @@ var require_response = __commonJS({
                 cause: err
               });
             }
    -        if (!redirectStatus.includes(status)) {
    +        if (!redirectStatusSet.has(status)) {
               throw new RangeError("Invalid status code " + status);
             }
             const responseObject = new _Response();
    @@ -4664,7 +5536,7 @@ var require_response = __commonJS({
             init = webidl.converters.ResponseInit(init);
             this[kRealm] = { settingsObject: {} };
             this[kState] = makeResponse({});
    -        this[kHeaders] = new Headers();
    +        this[kHeaders] = new Headers(kConstruct);
             this[kHeaders][kGuard] = "response";
             this[kHeaders][kHeadersList] = this[kState].headersList;
             this[kHeaders][kRealm] = this[kRealm];
    @@ -4777,6 +5649,7 @@ var require_response = __commonJS({
           }
           return newResponse;
         }
    +    __name(cloneResponse, "cloneResponse");
         function makeResponse(init) {
           return {
             aborted: false,
    @@ -4793,6 +5666,7 @@ var require_response = __commonJS({
             urlList: init.urlList ? [...init.urlList] : []
           };
         }
    +    __name(makeResponse, "makeResponse");
         function makeNetworkError(reason) {
           const isError = isErrorLike(reason);
           return makeResponse({
    @@ -4802,6 +5676,7 @@ var require_response = __commonJS({
             aborted: reason && reason.name === "AbortError"
           });
         }
    +    __name(makeNetworkError, "makeNetworkError");
         function makeFilteredResponse(response, state) {
           state = {
             internalResponse: response,
    @@ -4818,6 +5693,7 @@ var require_response = __commonJS({
             }
           });
         }
    +    __name(makeFilteredResponse, "makeFilteredResponse");
         function filterResponse(response, type) {
           if (type === "basic") {
             return makeFilteredResponse(response, {
    @@ -4849,10 +5725,12 @@ var require_response = __commonJS({
             assert(false);
           }
         }
    +    __name(filterResponse, "filterResponse");
         function makeAppropriateNetworkError(fetchParams, err = null) {
           assert(isCancelled(fetchParams));
           return isAborted(fetchParams) ? makeNetworkError(Object.assign(new DOMException("The operation was aborted.", "AbortError"), { cause: err })) : makeNetworkError(Object.assign(new DOMException("Request was cancelled."), { cause: err }));
         }
    +    __name(makeAppropriateNetworkError, "makeAppropriateNetworkError");
         function initializeResponse(response, init, body) {
           if (init.status !== null && (init.status < 200 || init.status > 599)) {
             throw new RangeError('init["status"] must be in the range of 200 to 599, inclusive.');
    @@ -4884,6 +5762,7 @@ var require_response = __commonJS({
             }
           }
         }
    +    __name(initializeResponse, "initializeResponse");
         webidl.converters.ReadableStream = webidl.interfaceConverter(
           ReadableStream
         );
    @@ -4900,7 +5779,7 @@ var require_response = __commonJS({
           if (isBlobLike(V)) {
             return webidl.converters.Blob(V, { strict: false });
           }
    -      if (types.isAnyArrayBuffer(V) || types.isTypedArray(V) || types.isDataView(V)) {
    +      if (types.isArrayBuffer(V) || types.isTypedArray(V) || types.isDataView(V)) {
             return webidl.converters.BufferSource(V);
           }
           if (util.isFormDataLike(V)) {
    @@ -4953,6 +5832,9 @@ var require_dispatcher_weakref = __commonJS({
         "use strict";
         var { kConnected, kSize } = require_symbols();
         var CompatWeakRef = class {
    +      static {
    +        __name(this, "CompatWeakRef");
    +      }
           constructor(value) {
             this.value = value;
           }
    @@ -4961,6 +5843,9 @@ var require_dispatcher_weakref = __commonJS({
           }
         };
         var CompatFinalizer = class {
    +      static {
    +        __name(this, "CompatFinalizer");
    +      }
           constructor(finalizer) {
             this.finalizer = finalizer;
           }
    @@ -5001,11 +5886,12 @@ var require_request = __commonJS({
           isValidHTTPToken,
           sameOrigin,
           normalizeMethod,
    -      makePolicyContainer
    +      makePolicyContainer,
    +      normalizeMethodRecord
         } = require_util2();
         var {
    -      forbiddenMethods,
    -      corsSafeListedMethods,
    +      forbiddenMethodsSet,
    +      corsSafeListedMethodsSet,
           referrerPolicy,
           requestRedirect,
           requestMode,
    @@ -5018,19 +5904,21 @@ var require_request = __commonJS({
         var { webidl } = require_webidl();
         var { getGlobalOrigin } = require_global();
         var { URLSerializer } = require_dataURL();
    -    var { kHeadersList } = require_symbols();
    +    var { kHeadersList, kConstruct } = require_symbols();
         var assert = require("assert");
         var { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = require("events");
         var TransformStream = globalThis.TransformStream;
    -    var kInit = Symbol("init");
         var kAbortController = Symbol("abortController");
         var requestFinalizer = new FinalizationRegistry(({ signal, abort }) => {
           signal.removeEventListener("abort", abort);
         });
         var Request = class _Request {
    +      static {
    +        __name(this, "Request");
    +      }
           // https://fetch.spec.whatwg.org/#dom-request
           constructor(input, init = {}) {
    -        if (input === kInit) {
    +        if (input === kConstruct) {
               return;
             }
             webidl.argumentLengthCheck(arguments, 1, { header: "Request constructor" });
    @@ -5122,7 +6010,8 @@ var require_request = __commonJS({
               // URL list A clone of request’s URL list.
               urlList: [...request.urlList]
             });
    -        if (Object.keys(init).length > 0) {
    +        const initHasKey = Object.keys(init).length !== 0;
    +        if (initHasKey) {
               if (request.mode === "navigate") {
                 request.mode = "same-origin";
               }
    @@ -5184,7 +6073,7 @@ var require_request = __commonJS({
             if (init.redirect !== void 0) {
               request.redirect = init.redirect;
             }
    -        if (init.integrity !== void 0 && init.integrity != null) {
    +        if (init.integrity != null) {
               request.integrity = String(init.integrity);
             }
             if (init.keepalive !== void 0) {
    @@ -5192,13 +6081,13 @@ var require_request = __commonJS({
             }
             if (init.method !== void 0) {
               let method = init.method;
    -          if (!isValidHTTPToken(init.method)) {
    -            throw TypeError(`'${init.method}' is not a valid HTTP method.`);
    +          if (!isValidHTTPToken(method)) {
    +            throw new TypeError(`'${method}' is not a valid HTTP method.`);
               }
    -          if (forbiddenMethods.indexOf(method.toUpperCase()) !== -1) {
    -            throw TypeError(`'${init.method}' HTTP method is unsupported.`);
    +          if (forbiddenMethodsSet.has(method.toUpperCase())) {
    +            throw new TypeError(`'${method}' HTTP method is unsupported.`);
               }
    -          method = normalizeMethod(init.method);
    +          method = normalizeMethodRecord[method] ?? normalizeMethod(method);
               request.method = method;
             }
             if (init.signal !== void 0) {
    @@ -5219,12 +6108,12 @@ var require_request = __commonJS({
               } else {
                 this[kAbortController] = ac;
                 const acRef = new WeakRef(ac);
    -            const abort = function() {
    +            const abort = /* @__PURE__ */ __name(function() {
                   const ac2 = acRef.deref();
                   if (ac2 !== void 0) {
                     ac2.abort(this.reason);
                   }
    -            };
    +            }, "abort");
                 try {
                   if (typeof getMaxListeners === "function" && getMaxListeners(signal) === defaultMaxListeners) {
                     setMaxListeners(100, signal);
    @@ -5237,28 +6126,27 @@ var require_request = __commonJS({
                 requestFinalizer.register(ac, { signal, abort });
               }
             }
    -        this[kHeaders] = new Headers();
    +        this[kHeaders] = new Headers(kConstruct);
             this[kHeaders][kHeadersList] = request.headersList;
             this[kHeaders][kGuard] = "request";
             this[kHeaders][kRealm] = this[kRealm];
             if (mode === "no-cors") {
    -          if (!corsSafeListedMethods.includes(request.method)) {
    +          if (!corsSafeListedMethodsSet.has(request.method)) {
                 throw new TypeError(
                   `'${request.method} is unsupported in no-cors mode.`
                 );
               }
               this[kHeaders][kGuard] = "request-no-cors";
             }
    -        if (Object.keys(init).length !== 0) {
    -          let headers = new Headers(this[kHeaders]);
    -          if (init.headers !== void 0) {
    -            headers = init.headers;
    -          }
    -          this[kHeaders][kHeadersList].clear();
    -          if (headers.constructor.name === "Headers") {
    +        if (initHasKey) {
    +          const headersList = this[kHeaders][kHeadersList];
    +          const headers = init.headers !== void 0 ? init.headers : new HeadersList(headersList);
    +          headersList.clear();
    +          if (headers instanceof HeadersList) {
                 for (const [key, val] of headers) {
    -              this[kHeaders].append(key, val);
    +              headersList.append(key, val);
                 }
    +            headersList.cookies = headers.cookies;
               } else {
                 fillHeaders(this[kHeaders], headers);
               }
    @@ -5434,10 +6322,10 @@ var require_request = __commonJS({
               throw new TypeError("unusable");
             }
             const clonedRequest = cloneRequest(this[kState]);
    -        const clonedRequestObject = new _Request(kInit);
    +        const clonedRequestObject = new _Request(kConstruct);
             clonedRequestObject[kState] = clonedRequest;
             clonedRequestObject[kRealm] = this[kRealm];
    -        clonedRequestObject[kHeaders] = new Headers();
    +        clonedRequestObject[kHeaders] = new Headers(kConstruct);
             clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList;
             clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard];
             clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm];
    @@ -5500,6 +6388,7 @@ var require_request = __commonJS({
           request.url = request.urlList[0];
           return request;
         }
    +    __name(makeRequest, "makeRequest");
         function cloneRequest(request) {
           const newRequest = makeRequest({ ...request, body: null });
           if (request.body != null) {
    @@ -5507,6 +6396,7 @@ var require_request = __commonJS({
           }
           return newRequest;
         }
    +    __name(cloneRequest, "cloneRequest");
         Object.defineProperties(Request.prototype, {
           method: kEnumerableProperty,
           url: kEnumerableProperty,
    @@ -5634,6 +6524,9 @@ var require_dispatcher = __commonJS({
         "use strict";
         var EventEmitter = require("events");
         var Dispatcher = class extends EventEmitter {
    +      static {
    +        __name(this, "Dispatcher");
    +      }
           dispatch() {
             throw new Error("not implemented");
           }
    @@ -5665,6 +6558,9 @@ var require_dispatcher_base = __commonJS({
         var kOnClosed = Symbol("onClosed");
         var kInterceptedDispatch = Symbol("Intercepted Dispatch");
         var DispatcherBase = class extends Dispatcher {
    +      static {
    +        __name(this, "DispatcherBase");
    +      }
           constructor() {
             super();
             this[kDestroyed] = false;
    @@ -5717,13 +6613,13 @@ var require_dispatcher_base = __commonJS({
             }
             this[kClosed] = true;
             this[kOnClosed].push(callback);
    -        const onClosed = () => {
    +        const onClosed = /* @__PURE__ */ __name(() => {
               const callbacks = this[kOnClosed];
               this[kOnClosed] = null;
               for (let i = 0; i < callbacks.length; i++) {
                 callbacks[i](null, null);
               }
    -        };
    +        }, "onClosed");
             this[kClose]().then(() => this.destroy()).then(() => {
               queueMicrotask(onClosed);
             });
    @@ -5760,13 +6656,13 @@ var require_dispatcher_base = __commonJS({
             this[kDestroyed] = true;
             this[kOnDestroyed] = this[kOnDestroyed] || [];
             this[kOnDestroyed].push(callback);
    -        const onDestroyed = () => {
    +        const onDestroyed = /* @__PURE__ */ __name(() => {
               const callbacks = this[kOnDestroyed];
               this[kOnDestroyed] = null;
               for (let i = 0; i < callbacks.length; i++) {
                 callbacks[i](null, null);
               }
    -        };
    +        }, "onDestroyed");
             this[kDestroy](err).then(() => {
               queueMicrotask(onDestroyed);
             });
    @@ -5818,6 +6714,9 @@ var require_fixed_queue = __commonJS({
         var kSize = 2048;
         var kMask = kSize - 1;
         var FixedCircularBuffer = class {
    +      static {
    +        __name(this, "FixedCircularBuffer");
    +      }
           constructor() {
             this.bottom = 0;
             this.top = 0;
    @@ -5844,6 +6743,9 @@ var require_fixed_queue = __commonJS({
           }
         };
         module2.exports = class FixedQueue {
    +      static {
    +        __name(this, "FixedQueue");
    +      }
           constructor() {
             this.head = this.tail = new FixedCircularBuffer();
           }
    @@ -5874,6 +6776,9 @@ var require_pool_stats = __commonJS({
         var { kFree, kConnected, kPending, kQueued, kRunning, kSize } = require_symbols();
         var kPool = Symbol("pool");
         var PoolStats = class {
    +      static {
    +        __name(this, "PoolStats");
    +      }
           constructor(pool) {
             this[kPool] = pool;
           }
    @@ -5921,13 +6826,16 @@ var require_pool_base = __commonJS({
         var kRemoveClient = Symbol("remove client");
         var kStats = Symbol("stats");
         var PoolBase = class extends DispatcherBase {
    +      static {
    +        __name(this, "PoolBase");
    +      }
           constructor() {
             super();
             this[kQueue] = new FixedQueue();
             this[kClients] = [];
             this[kQueued] = 0;
             const pool = this;
    -        this[kOnDrain] = function onDrain(origin, targets) {
    +        this[kOnDrain] = /* @__PURE__ */ __name(function onDrain(origin, targets) {
               const queue = pool[kQueue];
               let needDrain = false;
               while (!needDrain) {
    @@ -5946,7 +6854,7 @@ var require_pool_base = __commonJS({
               if (pool[kClosedResolve] && queue.isEmpty()) {
                 Promise.all(pool[kClients].map((c) => c.close())).then(pool[kClosedResolve]);
               }
    -        };
    +        }, "onDrain");
             this[kOnConnect] = (origin, targets) => {
               pool.emit("connect", origin, [pool, ...targets]);
             };
    @@ -6090,6 +6998,7 @@ var require_timers = __commonJS({
             refreshTimeout();
           }
         }
    +    __name(onTimeout, "onTimeout");
         function refreshTimeout() {
           if (fastNowTimeout && fastNowTimeout.refresh) {
             fastNowTimeout.refresh();
    @@ -6101,7 +7010,11 @@ var require_timers = __commonJS({
             }
           }
         }
    +    __name(refreshTimeout, "refreshTimeout");
         var Timeout = class {
    +      static {
    +        __name(this, "Timeout");
    +      }
           constructor(callback, delay, opaque) {
             this.callback = callback;
             this.delay = delay;
    @@ -6169,6 +7082,9 @@ var require_request2 = __commonJS({
           channels.error = { hasSubscribers: false };
         }
         var Request = class _Request {
    +      static {
    +        __name(this, "Request");
    +      }
           constructor(origin, {
             path,
             method,
    @@ -6215,10 +7131,26 @@ var require_request2 = __commonJS({
             this.bodyTimeout = bodyTimeout;
             this.throwOnError = throwOnError === true;
             this.method = method;
    +        this.abort = null;
             if (body == null) {
               this.body = null;
             } else if (util.isStream(body)) {
               this.body = body;
    +          const rState = this.body._readableState;
    +          if (!rState || !rState.autoDestroy) {
    +            this.endHandler = /* @__PURE__ */ __name(function autoDestroy() {
    +              util.destroy(this);
    +            }, "autoDestroy");
    +            this.body.on("end", this.endHandler);
    +          }
    +          this.errorHandler = (err) => {
    +            if (this.abort) {
    +              this.abort(err);
    +            } else {
    +              this.error = err;
    +            }
    +          };
    +          this.body.on("error", this.errorHandler);
             } else if (util.isBuffer(body)) {
               this.body = body.byteLength ? body : null;
             } else if (ArrayBuffer.isView(body)) {
    @@ -6291,9 +7223,9 @@ var require_request2 = __commonJS({
           onBodySent(chunk) {
             if (this[kHandler].onBodySent) {
               try {
    -            this[kHandler].onBodySent(chunk);
    +            return this[kHandler].onBodySent(chunk);
               } catch (err) {
    -            this.onError(err);
    +            this.abort(err);
               }
             }
           }
    @@ -6301,11 +7233,23 @@ var require_request2 = __commonJS({
             if (channels.bodySent.hasSubscribers) {
               channels.bodySent.publish({ request: this });
             }
    +        if (this[kHandler].onRequestSent) {
    +          try {
    +            return this[kHandler].onRequestSent();
    +          } catch (err) {
    +            this.abort(err);
    +          }
    +        }
           }
           onConnect(abort) {
             assert(!this.aborted);
             assert(!this.completed);
    -        return this[kHandler].onConnect(abort);
    +        if (this.error) {
    +          abort(this.error);
    +        } else {
    +          this.abort = abort;
    +          return this[kHandler].onConnect(abort);
    +        }
           }
           onHeaders(statusCode, headers, resume, statusText) {
             assert(!this.aborted);
    @@ -6313,12 +7257,21 @@ var require_request2 = __commonJS({
             if (channels.headers.hasSubscribers) {
               channels.headers.publish({ request: this, response: { statusCode, headers, statusText } });
             }
    -        return this[kHandler].onHeaders(statusCode, headers, resume, statusText);
    +        try {
    +          return this[kHandler].onHeaders(statusCode, headers, resume, statusText);
    +        } catch (err) {
    +          this.abort(err);
    +        }
           }
           onData(chunk) {
             assert(!this.aborted);
             assert(!this.completed);
    -        return this[kHandler].onData(chunk);
    +        try {
    +          return this[kHandler].onData(chunk);
    +        } catch (err) {
    +          this.abort(err);
    +          return false;
    +        }
           }
           onUpgrade(statusCode, headers, socket) {
             assert(!this.aborted);
    @@ -6326,14 +7279,20 @@ var require_request2 = __commonJS({
             return this[kHandler].onUpgrade(statusCode, headers, socket);
           }
           onComplete(trailers) {
    +        this.onFinally();
             assert(!this.aborted);
             this.completed = true;
             if (channels.trailers.hasSubscribers) {
               channels.trailers.publish({ request: this, trailers });
             }
    -        return this[kHandler].onComplete(trailers);
    +        try {
    +          return this[kHandler].onComplete(trailers);
    +        } catch (err) {
    +          this.onError(err);
    +        }
           }
           onError(error) {
    +        this.onFinally();
             if (channels.error.hasSubscribers) {
               channels.error.publish({ request: this, error });
             }
    @@ -6343,6 +7302,16 @@ var require_request2 = __commonJS({
             this.aborted = true;
             return this[kHandler].onError(error);
           }
    +      onFinally() {
    +        if (this.errorHandler) {
    +          this.body.off("error", this.errorHandler);
    +          this.errorHandler = null;
    +        }
    +        if (this.endHandler) {
    +          this.body.off("end", this.endHandler);
    +          this.endHandler = null;
    +        }
    +      }
           // TODO: adjust to support H2
           addHeader(key, value) {
             processHeader(this, key, value);
    @@ -6400,6 +7369,7 @@ var require_request2 = __commonJS({
           return skipAppend ? val : `${key}: ${val}\r
     `;
         }
    +    __name(processHeaderValue, "processHeaderValue");
         function processHeader(request, key, val, skipAppend = false) {
           if (val && (typeof val === "object" && !Array.isArray(val))) {
             throw new InvalidArgumentError(`invalid ${key} header`);
    @@ -6459,6 +7429,7 @@ var require_request2 = __commonJS({
             }
           }
         }
    +    __name(processHeader, "processHeader");
         module2.exports = Request;
       }
     });
    @@ -6475,6 +7446,9 @@ var require_connect = __commonJS({
         var SessionCache;
         if (global.FinalizationRegistry && !process.env.NODE_V8_COVERAGE) {
           SessionCache = class WeakSessionCache {
    +        static {
    +          __name(this, "WeakSessionCache");
    +        }
             constructor(maxCachedSessions) {
               this._maxCachedSessions = maxCachedSessions;
               this._sessionCache = /* @__PURE__ */ new Map();
    @@ -6502,6 +7476,9 @@ var require_connect = __commonJS({
           };
         } else {
           SessionCache = class SimpleSessionCache {
    +        static {
    +          __name(this, "SimpleSessionCache");
    +        }
             constructor(maxCachedSessions) {
               this._maxCachedSessions = maxCachedSessions;
               this._sessionCache = /* @__PURE__ */ new Map();
    @@ -6529,7 +7506,7 @@ var require_connect = __commonJS({
           const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions);
           timeout = timeout == null ? 1e4 : timeout;
           allowH2 = allowH2 != null ? allowH2 : false;
    -      return function connect({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) {
    +      return /* @__PURE__ */ __name(function connect({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) {
             let socket;
             if (protocol === "https:") {
               if (!tls) {
    @@ -6588,8 +7565,9 @@ var require_connect = __commonJS({
               }
             });
             return socket;
    -      };
    +      }, "connect");
         }
    +    __name(buildConnector, "buildConnector");
         function setupTimeout(onConnectTimeout2, timeout) {
           if (!timeout) {
             return () => {
    @@ -6612,9 +7590,11 @@ var require_connect = __commonJS({
             clearImmediate(s2);
           };
         }
    +    __name(setupTimeout, "setupTimeout");
         function onConnectTimeout(socket) {
           util.destroy(socket, new ConnectTimeoutError());
         }
    +    __name(onConnectTimeout, "onConnectTimeout");
         module2.exports = buildConnector;
       }
     });
    @@ -6635,6 +7615,7 @@ var require_utils = __commonJS({
           });
           return res;
         }
    +    __name(enumToMap, "enumToMap");
         exports2.enumToMap = enumToMap;
       }
     });
    @@ -6972,6 +7953,9 @@ var require_RedirectHandler = __commonJS({
         var redirectableStatusCodes = [300, 301, 302, 303, 307, 308];
         var kBody = Symbol("body");
         var BodyAsyncIterable = class {
    +      static {
    +        __name(this, "BodyAsyncIterable");
    +      }
           constructor(body) {
             this[kBody] = body;
             this[kBodyUsed] = false;
    @@ -6983,6 +7967,9 @@ var require_RedirectHandler = __commonJS({
           }
         };
         var RedirectHandler = class {
    +      static {
    +        __name(this, "RedirectHandler");
    +      }
           constructor(dispatch, maxRedirections, opts, handler) {
             if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) {
               throw new InvalidArgumentError("maxRedirections must be a positive number");
    @@ -7074,9 +8061,11 @@ var require_RedirectHandler = __commonJS({
             }
           }
         }
    +    __name(parseLocation, "parseLocation");
         function shouldRemoveHeader(header, removeContent, unknownOrigin) {
           return header.length === 4 && header.toString().toLowerCase() === "host" || removeContent && header.toString().toLowerCase().indexOf("content-") === 0 || unknownOrigin && header.length === 13 && header.toString().toLowerCase() === "authorization" || unknownOrigin && header.length === 6 && header.toString().toLowerCase() === "cookie";
         }
    +    __name(shouldRemoveHeader, "shouldRemoveHeader");
         function cleanRequestHeaders(headers, removeContent, unknownOrigin) {
           const ret = [];
           if (Array.isArray(headers)) {
    @@ -7096,6 +8085,7 @@ var require_RedirectHandler = __commonJS({
           }
           return ret;
         }
    +    __name(cleanRequestHeaders, "cleanRequestHeaders");
         module2.exports = RedirectHandler;
       }
     });
    @@ -7107,7 +8097,7 @@ var require_redirectInterceptor = __commonJS({
         var RedirectHandler = require_RedirectHandler();
         function createRedirectInterceptor({ maxRedirections: defaultMaxRedirections }) {
           return (dispatch) => {
    -        return function Intercept(opts, handler) {
    +        return /* @__PURE__ */ __name(function Intercept(opts, handler) {
               const { maxRedirections = defaultMaxRedirections } = opts;
               if (!maxRedirections) {
                 return dispatch(opts, handler);
    @@ -7115,9 +8105,10 @@ var require_redirectInterceptor = __commonJS({
               const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler);
               opts = { ...opts, maxRedirections: 0 };
               return dispatch(opts, redirectHandler);
    -        };
    +        }, "Intercept");
           };
         }
    +    __name(createRedirectInterceptor, "createRedirectInterceptor");
         module2.exports = createRedirectInterceptor;
       }
     });
    @@ -7249,6 +8240,9 @@ var require_client = __commonJS({
           channels.connected = { hasSubscribers: false };
         }
         var Client = class extends DispatcherBase {
    +      static {
    +        __name(this, "Client");
    +      }
           /**
            *
            * @param {string|URL} url
    @@ -7456,13 +8450,13 @@ var require_client = __commonJS({
                 const request = requests[i];
                 errorRequest(this, request, err);
               }
    -          const callback = () => {
    +          const callback = /* @__PURE__ */ __name(() => {
                 if (this[kClosedResolve]) {
                   this[kClosedResolve]();
                   this[kClosedResolve] = null;
                 }
                 resolve();
    -          };
    +          }, "callback");
               if (this[kHTTP2Session] != null) {
                 util.destroy(this[kHTTP2Session], err);
                 this[kHTTP2Session] = null;
    @@ -7482,6 +8476,7 @@ var require_client = __commonJS({
           this[kSocket][kError] = err;
           onError(this[kClient], err);
         }
    +    __name(onHttp2SessionError, "onHttp2SessionError");
         function onHttp2FrameError(type, code, id) {
           const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`);
           if (id === 0) {
    @@ -7489,10 +8484,12 @@ var require_client = __commonJS({
             onError(this[kClient], err);
           }
         }
    +    __name(onHttp2FrameError, "onHttp2FrameError");
         function onHttp2SessionEnd() {
           util.destroy(this, new SocketError("other side closed"));
           util.destroy(this[kSocket], new SocketError("other side closed"));
         }
    +    __name(onHttp2SessionEnd, "onHttp2SessionEnd");
         function onHTTP2GoAway(code) {
           const client = this[kClient];
           const err = new InformationalError(`HTTP/2: "GOAWAY" frame received with code ${code}`);
    @@ -7520,6 +8517,7 @@ var require_client = __commonJS({
           );
           resume(client);
         }
    +    __name(onHTTP2GoAway, "onHTTP2GoAway");
         var constants = require_constants2();
         var createRedirectInterceptor = require_redirectInterceptor();
         var EMPTY_BUF = Buffer.alloc(0);
    @@ -7573,6 +8571,7 @@ var require_client = __commonJS({
             }
           });
         }
    +    __name(lazyllhttp, "lazyllhttp");
         var llhttpInstance = null;
         var llhttpPromise = lazyllhttp();
         llhttpPromise.catch();
    @@ -7584,6 +8583,9 @@ var require_client = __commonJS({
         var TIMEOUT_BODY = 2;
         var TIMEOUT_IDLE = 3;
         var Parser = class {
    +      static {
    +        __name(this, "Parser");
    +      }
           constructor(client, socket, { exports: exports3 }) {
             assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0);
             this.llhttp = exports3;
    @@ -7847,11 +8849,8 @@ var require_client = __commonJS({
             } else {
               socket[kReset] = true;
             }
    -        let pause;
    -        try {
    -          pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false;
    -        } catch (err) {
    -          util.destroy(socket, err);
    +        const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false;
    +        if (request.aborted) {
               return -1;
             }
             if (request.method === "HEAD") {
    @@ -7885,13 +8884,8 @@ var require_client = __commonJS({
               return -1;
             }
             this.bytesRead += buf.length;
    -        try {
    -          if (request.onData(buf) === false) {
    -            return constants.ERROR.PAUSED;
    -          }
    -        } catch (err) {
    -          util.destroy(socket, err);
    -          return -1;
    +        if (request.onData(buf) === false) {
    +          return constants.ERROR.PAUSED;
             }
           }
           onMessageComplete() {
    @@ -7921,11 +8915,7 @@ var require_client = __commonJS({
               util.destroy(socket, new ResponseContentLengthMismatchError());
               return -1;
             }
    -        try {
    -          request.onComplete(headers);
    -        } catch (err) {
    -          errorRequest(client, request, err);
    -        }
    +        request.onComplete(headers);
             client[kQueue][client[kRunningIdx]++] = null;
             if (socket[kWriting]) {
               assert.strictEqual(client[kRunning], 0);
    @@ -7960,10 +8950,14 @@ var require_client = __commonJS({
             util.destroy(socket, new InformationalError("socket idle timeout"));
           }
         }
    +    __name(onParserTimeout, "onParserTimeout");
         function onSocketReadable() {
           const { [kParser]: parser } = this;
    -      parser.readMore();
    +      if (parser) {
    +        parser.readMore();
    +      }
         }
    +    __name(onSocketReadable, "onSocketReadable");
         function onSocketError(err) {
           const { [kClient]: client, [kParser]: parser } = this;
           assert(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID");
    @@ -7976,6 +8970,7 @@ var require_client = __commonJS({
           this[kError] = err;
           onError(this[kClient], err);
         }
    +    __name(onSocketError, "onSocketError");
         function onError(client, err) {
           if (client[kRunning] === 0 && err.code !== "UND_ERR_INFO" && err.code !== "UND_ERR_SOCKET") {
             assert(client[kPendingIdx] === client[kRunningIdx]);
    @@ -7987,6 +8982,7 @@ var require_client = __commonJS({
             assert(client[kSize] === 0);
           }
         }
    +    __name(onError, "onError");
         function onSocketEnd() {
           const { [kParser]: parser, [kClient]: client } = this;
           if (client[kHTTPConnVersion] !== "h2") {
    @@ -7997,6 +8993,7 @@ var require_client = __commonJS({
           }
           util.destroy(this, new SocketError("other side closed", util.getSocketInfo(this)));
         }
    +    __name(onSocketEnd, "onSocketEnd");
         function onSocketClose() {
           const { [kClient]: client, [kParser]: parser } = this;
           if (client[kHTTPConnVersion] === "h1" && parser) {
    @@ -8025,6 +9022,7 @@ var require_client = __commonJS({
           client.emit("disconnect", client[kUrl], [client], err);
           resume(client);
         }
    +    __name(onSocketClose, "onSocketClose");
         async function connect(client) {
           assert(!client[kConnecting]);
           assert(!client[kSocket]);
    @@ -8032,7 +9030,7 @@ var require_client = __commonJS({
           if (hostname[0] === "[") {
             const idx = hostname.indexOf("]");
             assert(idx !== -1);
    -        const ip = hostname.substr(1, idx - 1);
    +        const ip = hostname.substring(1, idx);
             assert(net.isIP(ip));
             hostname = ip;
           }
    @@ -8161,10 +9159,12 @@ var require_client = __commonJS({
           }
           resume(client);
         }
    +    __name(connect, "connect");
         function emitDrain(client) {
           client[kNeedDrain] = 0;
           client.emit("drain", client[kUrl], [client]);
         }
    +    __name(emitDrain, "emitDrain");
         function resume(client, sync) {
           if (client[kResuming] === 2) {
             return;
    @@ -8178,6 +9178,7 @@ var require_client = __commonJS({
             client[kRunningIdx] = 0;
           }
         }
    +    __name(resume, "resume");
         function _resume(client, sync) {
           while (true) {
             if (client.destroyed) {
    @@ -8256,21 +9257,7 @@ var require_client = __commonJS({
             if (client[kRunning] > 0 && (request.upgrade || request.method === "CONNECT")) {
               return;
             }
    -        if (util.isStream(request.body) && util.bodyLength(request.body) === 0) {
    -          request.body.on(
    -            "data",
    -            /* istanbul ignore next */
    -            function() {
    -              assert(false);
    -            }
    -          ).on("error", function(err) {
    -            errorRequest(client, request, err);
    -          }).on("end", function() {
    -            util.destroy(this);
    -          });
    -          request.body = null;
    -        }
    -        if (client[kRunning] > 0 && (util.isStream(request.body) || util.isAsyncIterable(request.body))) {
    +        if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 && (util.isStream(request.body) || util.isAsyncIterable(request.body))) {
               return;
             }
             if (!request.aborted && write(client, request)) {
    @@ -8280,6 +9267,11 @@ var require_client = __commonJS({
             }
           }
         }
    +    __name(_resume, "_resume");
    +    function shouldSendContentLength(method) {
    +      return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT";
    +    }
    +    __name(shouldSendContentLength, "shouldSendContentLength");
         function write(client, request) {
           if (client[kHTTPConnVersion] === "h2") {
             writeH2(client, client[kHTTP2Session], request);
    @@ -8290,14 +9282,15 @@ var require_client = __commonJS({
           if (body && typeof body.read === "function") {
             body.read(0);
           }
    -      let contentLength = util.bodyLength(body);
    +      const bodyLength = util.bodyLength(body);
    +      let contentLength = bodyLength;
           if (contentLength === null) {
             contentLength = request.contentLength;
           }
           if (contentLength === 0 && !expectsPayload) {
             contentLength = null;
           }
    -      if (request.contentLength !== null && request.contentLength !== contentLength) {
    +      if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) {
             if (client[kStrictContentLength]) {
               errorRequest(client, request, new RequestContentLengthMismatchError());
               return false;
    @@ -8357,7 +9350,7 @@ upgrade: ${upgrade}\r
           if (channels.sendHeaders.hasSubscribers) {
             channels.sendHeaders.publish({ request, headers: header, socket });
           }
    -      if (!body) {
    +      if (!body || bodyLength === 0) {
             if (contentLength === 0) {
               socket.write(`${header}content-length: 0\r
     \r
    @@ -8396,6 +9389,7 @@ upgrade: ${upgrade}\r
           }
           return true;
         }
    +    __name(write, "write");
         function writeH2(client, session, request) {
           const { body, method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request;
           let headers;
    @@ -8456,7 +9450,7 @@ upgrade: ${upgrade}\r
           if (contentLength === 0 || !expectsPayload) {
             contentLength = null;
           }
    -      if (request.contentLength != null && request.contentLength !== contentLength) {
    +      if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) {
             if (client[kStrictContentLength]) {
               errorRequest(client, request, new RequestContentLengthMismatchError());
               return false;
    @@ -8482,7 +9476,8 @@ upgrade: ${upgrade}\r
           }
           ++h2State.openStreams;
           stream.once("response", (headers2) => {
    -        if (request.onHeaders(Number(headers2[HTTP2_HEADER_STATUS]), headers2, stream.resume.bind(stream), "") === false) {
    +        const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2;
    +        if (request.onHeaders(Number(statusCode), realHeaders, stream.resume.bind(stream), "") === false) {
               stream.pause();
             }
           });
    @@ -8490,13 +9485,15 @@ upgrade: ${upgrade}\r
             request.onComplete([]);
           });
           stream.on("data", (chunk) => {
    -        if (request.onData(chunk) === false)
    +        if (request.onData(chunk) === false) {
               stream.pause();
    +        }
           });
           stream.once("close", () => {
             h2State.openStreams -= 1;
    -        if (h2State.openStreams === 0)
    +        if (h2State.openStreams === 0) {
               session.unref();
    +        }
           });
           stream.once("error", function(err) {
             if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) {
    @@ -8574,13 +9571,16 @@ upgrade: ${upgrade}\r
               assert(false);
             }
           }
    +      __name(writeBodyH2, "writeBodyH2");
         }
    +    __name(writeH2, "writeH2");
         function writeStream({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) {
           assert(contentLength !== 0 || client[kRunning] === 0, "stream body cannot be pipelined");
           if (client[kHTTPConnVersion] === "h2") {
             let onPipeData = function(chunk) {
               request.onBodySent(chunk);
             };
    +        __name(onPipeData, "onPipeData");
             const pipe = pipeline(
               body,
               h2stream,
    @@ -8602,7 +9602,7 @@ upgrade: ${upgrade}\r
           }
           let finished = false;
           const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header });
    -      const onData = function(chunk) {
    +      const onData = /* @__PURE__ */ __name(function(chunk) {
             if (finished) {
               return;
             }
    @@ -8613,19 +9613,23 @@ upgrade: ${upgrade}\r
             } catch (err) {
               util.destroy(this, err);
             }
    -      };
    -      const onDrain = function() {
    +      }, "onData");
    +      const onDrain = /* @__PURE__ */ __name(function() {
             if (finished) {
               return;
             }
             if (body.resume) {
               body.resume();
             }
    -      };
    -      const onAbort = function() {
    -        onFinished(new RequestAbortedError());
    -      };
    -      const onFinished = function(err) {
    +      }, "onDrain");
    +      const onAbort = /* @__PURE__ */ __name(function() {
    +        if (finished) {
    +          return;
    +        }
    +        const err = new RequestAbortedError();
    +        queueMicrotask(() => onFinished(err));
    +      }, "onAbort");
    +      const onFinished = /* @__PURE__ */ __name(function(err) {
             if (finished) {
               return;
             }
    @@ -8646,13 +9650,14 @@ upgrade: ${upgrade}\r
             } else {
               util.destroy(body);
             }
    -      };
    +      }, "onFinished");
           body.on("data", onData).on("end", onFinished).on("error", onFinished).on("close", onAbort);
           if (body.resume) {
             body.resume();
           }
           socket.on("drain", onDrain).on("error", onFinished);
         }
    +    __name(writeStream, "writeStream");
         async function writeBlob({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) {
           assert(contentLength === body.size, "blob body must have content length");
           const isH2 = client[kHTTPConnVersion] === "h2";
    @@ -8683,6 +9688,7 @@ upgrade: ${upgrade}\r
             util.destroy(isH2 ? h2stream : socket, err);
           }
         }
    +    __name(writeBlob, "writeBlob");
         async function writeIterable({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) {
           assert(contentLength !== 0 || client[kRunning] === 0, "iterator body cannot be pipelined");
           let callback = null;
    @@ -8693,14 +9699,15 @@ upgrade: ${upgrade}\r
               cb();
             }
           }
    -      const waitForDrain = () => new Promise((resolve, reject) => {
    +      __name(onDrain, "onDrain");
    +      const waitForDrain = /* @__PURE__ */ __name(() => new Promise((resolve, reject) => {
             assert(callback === null);
             if (socket[kError]) {
               reject(socket[kError]);
             } else {
               callback = resolve;
             }
    -      });
    +      }), "waitForDrain");
           if (client[kHTTPConnVersion] === "h2") {
             h2stream.on("close", onDrain).on("drain", onDrain);
             try {
    @@ -8741,7 +9748,11 @@ upgrade: ${upgrade}\r
             socket.off("close", onDrain).off("drain", onDrain);
           }
         }
    +    __name(writeIterable, "writeIterable");
         var AsyncWriter = class {
    +      static {
    +        __name(this, "AsyncWriter");
    +      }
           constructor({ socket, request, contentLength, client, expectsPayload, header }) {
             this.socket = socket;
             this.request = request;
    @@ -8855,6 +9866,7 @@ ${len.toString(16)}\r
             client.emit("error", err2);
           }
         }
    +    __name(errorRequest, "errorRequest");
         module2.exports = Client;
       }
     });
    @@ -8883,7 +9895,11 @@ var require_pool = __commonJS({
         function defaultFactory(origin, opts) {
           return new Client(origin, opts);
         }
    +    __name(defaultFactory, "defaultFactory");
         var Pool = class extends PoolBase {
    +      static {
    +        __name(this, "Pool");
    +      }
           constructor(origin, {
             connections,
             factory = defaultFactory,
    @@ -8913,7 +9929,7 @@ var require_pool = __commonJS({
                 maxCachedSessions,
                 allowH2,
                 socketPath,
    -            timeout: connectTimeout == null ? 1e4 : connectTimeout,
    +            timeout: connectTimeout,
                 ...util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0,
                 ...connect
               });
    @@ -8964,7 +9980,11 @@ var require_agent = __commonJS({
         function defaultFactory(origin, opts) {
           return opts && opts.connections === 1 ? new Client(origin, opts) : new Pool(origin, opts);
         }
    +    __name(defaultFactory, "defaultFactory");
         var Agent = class extends DispatcherBase {
    +      static {
    +        __name(this, "Agent");
    +      }
           constructor({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) {
             super();
             if (typeof factory !== "function") {
    @@ -9080,9 +10100,11 @@ var require_global2 = __commonJS({
             configurable: false
           });
         }
    +    __name(setGlobalDispatcher, "setGlobalDispatcher");
         function getGlobalDispatcher() {
           return globalThis[globalDispatcher];
         }
    +    __name(getGlobalDispatcher, "getGlobalDispatcher");
         module2.exports = {
           setGlobalDispatcher,
           getGlobalDispatcher
    @@ -9093,7 +10115,7 @@ var require_global2 = __commonJS({
     // lib/fetch/index.js
     var require_fetch = __commonJS({
       "lib/fetch/index.js"(exports2, module2) {
    -    var esbuildDetection = 1;
    +    "use strict";
         var {
           Response,
           makeNetworkError,
    @@ -9138,11 +10160,11 @@ var require_fetch = __commonJS({
         var assert = require("assert");
         var { safelyExtractBody } = require_body();
         var {
    -      redirectStatus,
    +      redirectStatusSet,
           nullBodyStatus,
    -      safeMethods,
    +      safeMethodsSet,
           requestBodyHeader,
    -      subresource,
    +      subresourceSet,
           DOMException
         } = require_constants();
         var { kHeadersList } = require_symbols();
    @@ -9154,9 +10176,13 @@ var require_fetch = __commonJS({
         var { getGlobalDispatcher } = require_global2();
         var { webidl } = require_webidl();
         var { STATUS_CODES } = require("http");
    +    var GET_OR_HEAD = ["GET", "HEAD"];
         var resolveObjectURL;
         var ReadableStream = globalThis.ReadableStream;
         var Fetch = class extends EE {
    +      static {
    +        __name(this, "Fetch");
    +      }
           constructor(dispatcher) {
             super();
             this.dispatcher = dispatcher;
    @@ -9187,7 +10213,7 @@ var require_fetch = __commonJS({
             this.emit("terminated", error);
           }
         };
    -    async function fetch2(input, init = {}) {
    +    function fetch2(input, init = {}) {
           webidl.argumentLengthCheck(arguments, 1, { header: "globalThis.fetch" });
           const p = createDeferredPromise();
           let requestObject;
    @@ -9219,20 +10245,20 @@ var require_fetch = __commonJS({
               abortFetch(p, request, responseObject, requestObject.signal.reason);
             }
           );
    -      const handleFetchDone = (response) => finalizeAndReportTiming(response, "fetch");
    -      const processResponse = (response) => {
    +      const handleFetchDone = /* @__PURE__ */ __name((response) => finalizeAndReportTiming(response, "fetch"), "handleFetchDone");
    +      const processResponse = /* @__PURE__ */ __name((response) => {
             if (locallyAborted) {
    -          return;
    +          return Promise.resolve();
             }
             if (response.aborted) {
               abortFetch(p, request, responseObject, controller.serializedAbortReason);
    -          return;
    +          return Promise.resolve();
             }
             if (response.type === "error") {
               p.reject(
                 Object.assign(new TypeError("fetch failed"), { cause: response.error })
               );
    -          return;
    +          return Promise.resolve();
             }
             responseObject = new Response();
             responseObject[kState] = response;
    @@ -9241,7 +10267,7 @@ var require_fetch = __commonJS({
             responseObject[kHeaders][kGuard] = "immutable";
             responseObject[kHeaders][kRealm] = relevantRealm;
             p.resolve(responseObject);
    -      };
    +      }, "processResponse");
           controller = fetching({
             request,
             processResponseEndOfBody: handleFetchDone,
    @@ -9251,6 +10277,7 @@ var require_fetch = __commonJS({
           });
           return p.promise;
         }
    +    __name(fetch2, "fetch");
         function finalizeAndReportTiming(response, initiatorType = "other") {
           if (response.type === "error" && response.aborted) {
             return;
    @@ -9267,7 +10294,7 @@ var require_fetch = __commonJS({
           if (timingInfo === null) {
             return;
           }
    -      if (!timingInfo.timingAllowPassed) {
    +      if (!response.timingAllowPassed) {
             timingInfo = createOpaqueTimingInfo({
               startTime: timingInfo.startTime
             });
    @@ -9283,11 +10310,13 @@ var require_fetch = __commonJS({
             cacheState
           );
         }
    +    __name(finalizeAndReportTiming, "finalizeAndReportTiming");
         function markResourceTiming(timingInfo, originalURL, initiatorType, globalThis2, cacheState) {
           if (nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 2) {
             performance.markResourceTiming(timingInfo, originalURL.href, initiatorType, globalThis2, cacheState);
           }
         }
    +    __name(markResourceTiming, "markResourceTiming");
         function abortFetch(p, request, responseObject, error) {
           if (!error) {
             error = new DOMException("The operation was aborted.", "AbortError");
    @@ -9314,6 +10343,7 @@ var require_fetch = __commonJS({
             });
           }
         }
    +    __name(abortFetch, "abortFetch");
         function fetching({
           request,
           processRequestBodyChunkLength,
    @@ -9372,13 +10402,14 @@ var require_fetch = __commonJS({
           }
           if (request.priority === null) {
           }
    -      if (subresource.includes(request.destination)) {
    +      if (subresourceSet.has(request.destination)) {
           }
           mainFetch(fetchParams).catch((err) => {
             fetchParams.controller.terminate(err);
           });
           return fetchParams.controller;
         }
    +    __name(fetching, "fetching");
         async function mainFetch(fetchParams, recursive = false) {
           const request = fetchParams.request;
           let response = null;
    @@ -9458,33 +10489,34 @@ var require_fetch = __commonJS({
             fetchParams.controller.dump = true;
           }
           if (request.integrity) {
    -        const processBodyError = (reason) => fetchFinale(fetchParams, makeNetworkError(reason));
    +        const processBodyError = /* @__PURE__ */ __name((reason) => fetchFinale(fetchParams, makeNetworkError(reason)), "processBodyError");
             if (request.responseTainting === "opaque" || response.body == null) {
               processBodyError(response.error);
               return;
             }
    -        const processBody = (bytes) => {
    +        const processBody = /* @__PURE__ */ __name((bytes) => {
               if (!bytesMatch(bytes, request.integrity)) {
                 processBodyError("integrity mismatch");
                 return;
               }
               response.body = safelyExtractBody(bytes)[0];
               fetchFinale(fetchParams, response);
    -        };
    +        }, "processBody");
             await fullyReadBody(response.body, processBody, processBodyError);
           } else {
             fetchFinale(fetchParams, response);
           }
         }
    -    async function schemeFetch(fetchParams) {
    +    __name(mainFetch, "mainFetch");
    +    function schemeFetch(fetchParams) {
           if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) {
    -        return makeAppropriateNetworkError(fetchParams);
    +        return Promise.resolve(makeAppropriateNetworkError(fetchParams));
           }
           const { request } = fetchParams;
           const { protocol: scheme } = requestCurrentURL(request);
           switch (scheme) {
             case "about:": {
    -          return makeNetworkError("about scheme is not supported");
    +          return Promise.resolve(makeNetworkError("about scheme is not supported"));
             }
             case "blob:": {
               if (!resolveObjectURL) {
    @@ -9492,11 +10524,11 @@ var require_fetch = __commonJS({
               }
               const blobURLEntry = requestCurrentURL(request);
               if (blobURLEntry.search.length !== 0) {
    -            return makeNetworkError("NetworkError when attempting to fetch resource.");
    +            return Promise.resolve(makeNetworkError("NetworkError when attempting to fetch resource."));
               }
               const blobURLEntryObject = resolveObjectURL(blobURLEntry.toString());
               if (request.method !== "GET" || !isBlobLike(blobURLEntryObject)) {
    -            return makeNetworkError("invalid method");
    +            return Promise.resolve(makeNetworkError("invalid method"));
               }
               const bodyWithType = safelyExtractBody(blobURLEntryObject);
               const body = bodyWithType[0];
    @@ -9510,63 +10542,65 @@ var require_fetch = __commonJS({
                 ]
               });
               response.body = body;
    -          return response;
    +          return Promise.resolve(response);
             }
             case "data:": {
               const currentURL = requestCurrentURL(request);
               const dataURLStruct = dataURLProcessor(currentURL);
               if (dataURLStruct === "failure") {
    -            return makeNetworkError("failed to fetch the data URL");
    +            return Promise.resolve(makeNetworkError("failed to fetch the data URL"));
               }
               const mimeType = serializeAMimeType(dataURLStruct.mimeType);
    -          return makeResponse({
    +          return Promise.resolve(makeResponse({
                 statusText: "OK",
                 headersList: [
                   ["content-type", { name: "Content-Type", value: mimeType }]
                 ],
                 body: safelyExtractBody(dataURLStruct.body)[0]
    -          });
    +          }));
             }
             case "file:": {
    -          return makeNetworkError("not implemented... yet...");
    +          return Promise.resolve(makeNetworkError("not implemented... yet..."));
             }
             case "http:":
             case "https:": {
    -          return await httpFetch(fetchParams).catch((err) => makeNetworkError(err));
    +          return httpFetch(fetchParams).catch((err) => makeNetworkError(err));
             }
             default: {
    -          return makeNetworkError("unknown scheme");
    +          return Promise.resolve(makeNetworkError("unknown scheme"));
             }
           }
         }
    +    __name(schemeFetch, "schemeFetch");
         function finalizeResponse(fetchParams, response) {
           fetchParams.request.done = true;
           if (fetchParams.processResponseDone != null) {
             queueMicrotask(() => fetchParams.processResponseDone(response));
           }
         }
    -    async function fetchFinale(fetchParams, response) {
    +    __name(finalizeResponse, "finalizeResponse");
    +    function fetchFinale(fetchParams, response) {
           if (response.type === "error") {
             response.urlList = [fetchParams.request.urlList[0]];
             response.timingInfo = createOpaqueTimingInfo({
               startTime: fetchParams.timingInfo.startTime
             });
           }
    -      const processResponseEndOfBody = () => {
    +      const processResponseEndOfBody = /* @__PURE__ */ __name(() => {
             fetchParams.request.done = true;
             if (fetchParams.processResponseEndOfBody != null) {
               queueMicrotask(() => fetchParams.processResponseEndOfBody(response));
             }
    -      };
    +      }, "processResponseEndOfBody");
           if (fetchParams.processResponse != null) {
             queueMicrotask(() => fetchParams.processResponse(response));
           }
           if (response.body == null) {
             processResponseEndOfBody();
           } else {
    -        const identityTransformAlgorithm = (chunk, controller) => {
    +        const identityTransformAlgorithm = /* @__PURE__ */ __name((chunk, controller) => {
               controller.enqueue(chunk);
    -        };
    +        }, "identityTransformAlgorithm");
             const transformStream = new TransformStream({
               start() {
               },
    @@ -9584,15 +10618,17 @@ var require_fetch = __commonJS({
             response.body = { stream: response.body.stream.pipeThrough(transformStream) };
           }
           if (fetchParams.processResponseConsumeBody != null) {
    -        const processBody = (nullOrBytes) => fetchParams.processResponseConsumeBody(response, nullOrBytes);
    -        const processBodyError = (failure) => fetchParams.processResponseConsumeBody(response, failure);
    +        const processBody = /* @__PURE__ */ __name((nullOrBytes) => fetchParams.processResponseConsumeBody(response, nullOrBytes), "processBody");
    +        const processBodyError = /* @__PURE__ */ __name((failure) => fetchParams.processResponseConsumeBody(response, failure), "processBodyError");
             if (response.body == null) {
               queueMicrotask(() => processBody(null));
             } else {
    -          await fullyReadBody(response.body, processBody, processBodyError);
    +          return fullyReadBody(response.body, processBody, processBodyError);
             }
    +        return Promise.resolve();
           }
         }
    +    __name(fetchFinale, "fetchFinale");
         async function httpFetch(fetchParams) {
           const request = fetchParams.request;
           let response = null;
    @@ -9620,7 +10656,7 @@ var require_fetch = __commonJS({
           ) === "blocked") {
             return makeNetworkError("blocked");
           }
    -      if (redirectStatus.includes(actualResponse.status)) {
    +      if (redirectStatusSet.has(actualResponse.status)) {
             if (request.redirect !== "manual") {
               fetchParams.controller.connection.destroy();
             }
    @@ -9637,7 +10673,8 @@ var require_fetch = __commonJS({
           response.timingInfo = timingInfo;
           return response;
         }
    -    async function httpRedirectFetch(fetchParams, response) {
    +    __name(httpFetch, "httpFetch");
    +    function httpRedirectFetch(fetchParams, response) {
           const request = fetchParams.request;
           const actualResponse = response.internalResponse ? response.internalResponse : response;
           let locationURL;
    @@ -9650,27 +10687,27 @@ var require_fetch = __commonJS({
               return response;
             }
           } catch (err) {
    -        return makeNetworkError(err);
    +        return Promise.resolve(makeNetworkError(err));
           }
           if (!urlIsHttpHttpsScheme(locationURL)) {
    -        return makeNetworkError("URL scheme must be a HTTP(S) scheme");
    +        return Promise.resolve(makeNetworkError("URL scheme must be a HTTP(S) scheme"));
           }
           if (request.redirectCount === 20) {
    -        return makeNetworkError("redirect count exceeded");
    +        return Promise.resolve(makeNetworkError("redirect count exceeded"));
           }
           request.redirectCount += 1;
           if (request.mode === "cors" && (locationURL.username || locationURL.password) && !sameOrigin(request, locationURL)) {
    -        return makeNetworkError('cross origin not allowed for request mode "cors"');
    +        return Promise.resolve(makeNetworkError('cross origin not allowed for request mode "cors"'));
           }
           if (request.responseTainting === "cors" && (locationURL.username || locationURL.password)) {
    -        return makeNetworkError(
    +        return Promise.resolve(makeNetworkError(
               'URL cannot contain credentials for request mode "cors"'
    -        );
    +        ));
           }
           if (actualResponse.status !== 303 && request.body != null && request.body.source == null) {
    -        return makeNetworkError();
    +        return Promise.resolve(makeNetworkError());
           }
    -      if ([301, 302].includes(actualResponse.status) && request.method === "POST" || actualResponse.status === 303 && !["GET", "HEAD"].includes(request.method)) {
    +      if ([301, 302].includes(actualResponse.status) && request.method === "POST" || actualResponse.status === 303 && !GET_OR_HEAD.includes(request.method)) {
             request.method = "GET";
             request.body = null;
             for (const headerName of requestBodyHeader) {
    @@ -9695,6 +10732,7 @@ var require_fetch = __commonJS({
           setRequestReferrerPolicyOnRedirect(request, actualResponse);
           return mainFetch(fetchParams, true);
         }
    +    __name(httpRedirectFetch, "httpRedirectFetch");
         async function httpNetworkOrCacheFetch(fetchParams, isAuthenticationFetch = false, isNewConnectionFetch = false) {
           const request = fetchParams.request;
           let httpFetchParams = null;
    @@ -9730,7 +10768,7 @@ var require_fetch = __commonJS({
           appendRequestOriginHeader(httpRequest);
           appendFetchMetadata(httpRequest);
           if (!httpRequest.headersList.contains("user-agent")) {
    -        httpRequest.headersList.append("user-agent", typeof esbuildDetection === "undefined" ? "undici" : "node");
    +        httpRequest.headersList.append("user-agent", false ? "undici" : "node");
           }
           if (httpRequest.cache === "default" && (httpRequest.headersList.contains("if-modified-since") || httpRequest.headersList.contains("if-none-match") || httpRequest.headersList.contains("if-unmodified-since") || httpRequest.headersList.contains("if-match") || httpRequest.headersList.contains("if-range"))) {
             httpRequest.cache = "no-store";
    @@ -9773,7 +10811,7 @@ var require_fetch = __commonJS({
               includeCredentials,
               isNewConnectionFetch
             );
    -        if (!safeMethods.includes(httpRequest.method) && forwardResponse.status >= 200 && forwardResponse.status <= 399) {
    +        if (!safeMethodsSet.has(httpRequest.method) && forwardResponse.status >= 200 && forwardResponse.status <= 399) {
             }
             if (revalidatingFlag && forwardResponse.status === 304) {
             }
    @@ -9815,6 +10853,7 @@ var require_fetch = __commonJS({
           }
           return response;
         }
    +    __name(httpNetworkOrCacheFetch, "httpNetworkOrCacheFetch");
         async function httpNetworkFetch(fetchParams, includeCredentials = false, forceNewConnection = false) {
           assert(!fetchParams.controller.connection || fetchParams.controller.connection.destroyed);
           fetchParams.controller.connection = {
    @@ -9842,22 +10881,22 @@ var require_fetch = __commonJS({
           if (request.body == null && fetchParams.processRequestEndOfBody) {
             queueMicrotask(() => fetchParams.processRequestEndOfBody());
           } else if (request.body != null) {
    -        const processBodyChunk = async function* (bytes) {
    +        const processBodyChunk = /* @__PURE__ */ __name(async function* (bytes) {
               if (isCancelled(fetchParams)) {
                 return;
               }
               yield bytes;
               fetchParams.processRequestBodyChunkLength?.(bytes.byteLength);
    -        };
    -        const processEndOfBody = () => {
    +        }, "processBodyChunk");
    +        const processEndOfBody = /* @__PURE__ */ __name(() => {
               if (isCancelled(fetchParams)) {
                 return;
               }
               if (fetchParams.processRequestEndOfBody) {
                 fetchParams.processRequestEndOfBody();
               }
    -        };
    -        const processBodyError = (e) => {
    +        }, "processEndOfBody");
    +        const processBodyError = /* @__PURE__ */ __name((e) => {
               if (isCancelled(fetchParams)) {
                 return;
               }
    @@ -9866,7 +10905,7 @@ var require_fetch = __commonJS({
               } else {
                 fetchParams.controller.terminate(e);
               }
    -        };
    +        }, "processBodyError");
             requestBody = async function* () {
               try {
                 for await (const bytes of request.body.stream) {
    @@ -9894,12 +10933,12 @@ var require_fetch = __commonJS({
             }
             return makeNetworkError(err);
           }
    -      const pullAlgorithm = () => {
    +      const pullAlgorithm = /* @__PURE__ */ __name(() => {
             fetchParams.controller.resume();
    -      };
    -      const cancelAlgorithm = (reason) => {
    +      }, "pullAlgorithm");
    +      const cancelAlgorithm = /* @__PURE__ */ __name((reason) => {
             fetchParams.controller.abort(reason);
    -      };
    +      }, "cancelAlgorithm");
           if (!ReadableStream) {
             ReadableStream = require("stream/web").ReadableStream;
           }
    @@ -9979,6 +11018,7 @@ var require_fetch = __commonJS({
             }
             fetchParams.controller.connection.destroy();
           }
    +      __name(onAborted, "onAborted");
           return response;
           async function dispatch({ body }) {
             const url = requestCurrentURL(request);
    @@ -9988,7 +11028,7 @@ var require_fetch = __commonJS({
                 path: url.pathname + url.search,
                 origin: url.origin,
                 method: request.method,
    -            body: fetchParams.controller.dispatcher.isMockActive ? request.body && request.body.source : body,
    +            body: fetchParams.controller.dispatcher.isMockActive ? request.body && (request.body.source || request.body.stream) : body,
                 headers: request.headersList.entries,
                 maxRedirections: 0,
                 upgrade: request.mode === "websocket" ? "websocket" : void 0
    @@ -10021,7 +11061,7 @@ var require_fetch = __commonJS({
                       } else if (key.toLowerCase() === "location") {
                         location = val;
                       }
    -                  headers.append(key, val);
    +                  headers[kHeadersList].append(key, val);
                     }
                   } else {
                     const keys = Object.keys(headersList);
    @@ -10032,12 +11072,12 @@ var require_fetch = __commonJS({
                       } else if (key.toLowerCase() === "location") {
                         location = val;
                       }
    -                  headers.append(key, val);
    +                  headers[kHeadersList].append(key, val);
                     }
                   }
                   this.body = new Readable({ read: resume });
                   const decoders = [];
    -              const willFollow = request.redirect === "follow" && location && redirectStatus.includes(status);
    +              const willFollow = request.redirect === "follow" && location && redirectStatusSet.has(status);
                   if (request.method !== "HEAD" && request.method !== "CONNECT" && !nullBodyStatus.includes(status) && !willFollow) {
                     for (const coding of codings) {
                       if (coding === "x-gzip" || coding === "gzip") {
    @@ -10100,7 +11140,7 @@ var require_fetch = __commonJS({
                   for (let n = 0; n < headersList.length; n += 2) {
                     const key = headersList[n + 0].toString("latin1");
                     const val = headersList[n + 1].toString("latin1");
    -                headers.append(key, val);
    +                headers[kHeadersList].append(key, val);
                   }
                   resolve({
                     status,
    @@ -10113,7 +11153,9 @@ var require_fetch = __commonJS({
               }
             ));
           }
    +      __name(dispatch, "dispatch");
         }
    +    __name(httpNetworkFetch, "httpNetworkFetch");
         module2.exports = {
           fetch: fetch2,
           Fetch,
    @@ -10192,6 +11234,9 @@ var require_events = __commonJS({
         var { kEnumerableProperty } = require_util();
         var { MessagePort } = require("worker_threads");
         var MessageEvent = class _MessageEvent extends Event {
    +      static {
    +        __name(this, "MessageEvent");
    +      }
           #eventInit;
           constructor(type, eventInitDict = {}) {
             webidl.argumentLengthCheck(arguments, 1, { header: "MessageEvent constructor" });
    @@ -10238,6 +11283,9 @@ var require_events = __commonJS({
           }
         };
         var CloseEvent = class _CloseEvent extends Event {
    +      static {
    +        __name(this, "CloseEvent");
    +      }
           #eventInit;
           constructor(type, eventInitDict = {}) {
             webidl.argumentLengthCheck(arguments, 1, { header: "CloseEvent constructor" });
    @@ -10260,6 +11308,9 @@ var require_events = __commonJS({
           }
         };
         var ErrorEvent = class _ErrorEvent extends Event {
    +      static {
    +        __name(this, "ErrorEvent");
    +      }
           #eventInit;
           constructor(type, eventInitDict) {
             webidl.argumentLengthCheck(arguments, 1, { header: "ErrorEvent constructor" });
    @@ -10437,16 +11488,20 @@ var require_util3 = __commonJS({
         function isEstablished(ws) {
           return ws[kReadyState] === states.OPEN;
         }
    +    __name(isEstablished, "isEstablished");
         function isClosing(ws) {
           return ws[kReadyState] === states.CLOSING;
         }
    +    __name(isClosing, "isClosing");
         function isClosed(ws) {
           return ws[kReadyState] === states.CLOSED;
         }
    +    __name(isClosed, "isClosed");
         function fireEvent(e, target, eventConstructor = Event, eventInitDict) {
           const event = new eventConstructor(e, eventInitDict);
           target.dispatchEvent(event);
         }
    +    __name(fireEvent, "fireEvent");
         function websocketMessageReceived(ws, type, data) {
           if (ws[kReadyState] !== states.OPEN) {
             return;
    @@ -10471,6 +11526,7 @@ var require_util3 = __commonJS({
             data: dataForEvent
           });
         }
    +    __name(websocketMessageReceived, "websocketMessageReceived");
         function isValidSubprotocol(protocol) {
           if (protocol.length === 0) {
             return false;
    @@ -10484,6 +11540,7 @@ var require_util3 = __commonJS({
           }
           return true;
         }
    +    __name(isValidSubprotocol, "isValidSubprotocol");
         function isValidStatusCode(code) {
           if (code >= 1e3 && code < 1015) {
             return code !== 1004 && // reserved
    @@ -10492,6 +11549,7 @@ var require_util3 = __commonJS({
           }
           return code >= 3e3 && code <= 4999;
         }
    +    __name(isValidStatusCode, "isValidStatusCode");
         function failWebsocketConnection(ws, reason) {
           const { [kController]: controller, [kResponse]: response } = ws;
           controller.abort();
    @@ -10504,6 +11562,7 @@ var require_util3 = __commonJS({
             });
           }
         }
    +    __name(failWebsocketConnection, "failWebsocketConnection");
         module2.exports = {
           isEstablished,
           isClosing,
    @@ -10620,11 +11679,13 @@ var require_connection = __commonJS({
           });
           return controller;
         }
    +    __name(establishWebSocketConnection, "establishWebSocketConnection");
         function onSocketData(chunk) {
           if (!this.ws[kByteParser].write(chunk)) {
             this.pause();
           }
         }
    +    __name(onSocketData, "onSocketData");
         function onSocketClose() {
           const { ws } = this;
           const wasClean = ws[kSentClose] && ws[kReceivedClose];
    @@ -10651,6 +11712,7 @@ var require_connection = __commonJS({
             });
           }
         }
    +    __name(onSocketClose, "onSocketClose");
         function onSocketError(error) {
           const { ws } = this;
           ws[kReadyState] = states.CLOSING;
    @@ -10659,6 +11721,7 @@ var require_connection = __commonJS({
           }
           this.destroy();
         }
    +    __name(onSocketError, "onSocketError");
         module2.exports = {
           establishWebSocketConnection
         };
    @@ -10676,6 +11739,9 @@ var require_frame = __commonJS({
         } catch {
         }
         var WebsocketFrameSend = class {
    +      static {
    +        __name(this, "WebsocketFrameSend");
    +      }
           /**
            * @param {Buffer|undefined} data
            */
    @@ -10736,6 +11802,9 @@ var require_receiver = __commonJS({
         channels.ping = diagnosticsChannel.channel("undici:websocket:ping");
         channels.pong = diagnosticsChannel.channel("undici:websocket:pong");
         var ByteParser = class extends Writable {
    +      static {
    +        __name(this, "ByteParser");
    +      }
           #buffers = [];
           #byteOffset = 0;
           #state = parserStates.INFO;
    @@ -10985,6 +12054,9 @@ var require_websocket = __commonJS({
         var { types } = require("util");
         var experimentalWarned = false;
         var WebSocket = class _WebSocket extends EventTarget {
    +      static {
    +        __name(this, "WebSocket");
    +      }
           #events = {
             open: null,
             error: null,
    @@ -11260,9 +12332,9 @@ var require_websocket = __commonJS({
           #onConnectionEstablished(response) {
             this[kResponse] = response;
             const parser = new ByteParser(this);
    -        parser.on("drain", function onParserDrain() {
    +        parser.on("drain", /* @__PURE__ */ __name(function onParserDrain() {
               this.ws[kResponse].socket.resume();
    -        });
    +        }, "onParserDrain"));
             response.socket.ws = this;
             this[kByteParser] = parser;
             this[kReadyState] = states.OPEN;
    @@ -11365,14 +12437,12 @@ var require_websocket = __commonJS({
     
     // index-fetch.js
     var fetchImpl = require_fetch().fetch;
    -module.exports.fetch = async function fetch(resource, init = void 0) {
    -  try {
    -    return await fetchImpl(resource, init);
    -  } catch (err) {
    +module.exports.fetch = /* @__PURE__ */ __name(function fetch(resource, init = void 0) {
    +  return fetchImpl(resource, init).catch((err) => {
         Error.captureStackTrace(err, this);
         throw err;
    -  }
    -};
    +  });
    +}, "fetch");
     module.exports.FormData = require_formdata().FormData;
     module.exports.Headers = require_headers().Headers;
     module.exports.Response = require_response().Response;
    diff --git a/deps/uv/AUTHORS b/deps/uv/AUTHORS
    index 9b89421c42877e..6bf1a9fa2f96fa 100644
    --- a/deps/uv/AUTHORS
    +++ b/deps/uv/AUTHORS
    @@ -548,3 +548,15 @@ liuxiang88 <94350585+liuxiang88@users.noreply.github.com>
     Jeffrey H. Johnson 
     Abdirahim Musse <33973272+abmusse@users.noreply.github.com>
     小明 <7737673+caobug@users.noreply.github.com>
    +Shuduo Sang 
    +Keith Winstein 
    +michalbiesek 
    +Alois Klink 
    +SmorkalovG 
    +Pleuvens 
    +jolai <58589285+laijonathan@users.noreply.github.com>
    +Julien Roncaglia 
    +prubel 
    +Per Allansson <65364157+per-allansson@users.noreply.github.com>
    +Matheus Izvekov 
    +Christian Heimlich 
    diff --git a/deps/uv/BUILD.gn b/deps/uv/BUILD.gn
    new file mode 100644
    index 00000000000000..8e6ac27048b596
    --- /dev/null
    +++ b/deps/uv/BUILD.gn
    @@ -0,0 +1,14 @@
    +##############################################################################
    +#                                                                            #
    +#                       DO NOT EDIT THIS FILE!                               #
    +#                                                                            #
    +##############################################################################
    +
    +# This file is used by GN for building, which is NOT the build system used for
    +# building official binaries.
    +# Please modify the gyp files if you are making changes to build system.
    +
    +import("unofficial.gni")
    +
    +uv_gn_build("uv") {
    +}
    diff --git a/deps/uv/CMakeLists.txt b/deps/uv/CMakeLists.txt
    index 93733dd0478343..72377851b69f74 100644
    --- a/deps/uv/CMakeLists.txt
    +++ b/deps/uv/CMakeLists.txt
    @@ -1,4 +1,4 @@
    -cmake_minimum_required(VERSION 3.4)
    +cmake_minimum_required(VERSION 3.9)
     
     if(POLICY CMP0091)
       cmake_policy(SET CMP0091 NEW) # Enable MSVC_RUNTIME_LIBRARY setting
    @@ -186,7 +186,8 @@ if(WIN32)
            ws2_32
            dbghelp
            ole32
    -       uuid)
    +       uuid
    +       shell32)
       list(APPEND uv_sources
            src/win/async.c
            src/win/core.c
    @@ -477,7 +478,7 @@ if(CMAKE_SYSTEM_NAME STREQUAL "OS390")
     endif()
     target_link_libraries(uv_a ${uv_libraries})
     set_target_properties(uv_a PROPERTIES OUTPUT_NAME "uv")
    -if(MSVC)
    +if(WIN32)
       set_target_properties(uv_a PROPERTIES PREFIX "lib")
     endif()
     
    diff --git a/deps/uv/ChangeLog b/deps/uv/ChangeLog
    index e2cd8825222e31..f40fcc600bbc34 100644
    --- a/deps/uv/ChangeLog
    +++ b/deps/uv/ChangeLog
    @@ -1,4 +1,113 @@
    -2023.06.30, Version 1.46.0 (Stable)
    +2023.11.06, Version 1.47.0 (Stable)
    +
    +Changes since version 1.46.0:
    +
    +* test: fix license blurb (Ben Noordhuis)
    +
    +* linux: fix harmless warn_unused_result warning (Shuduo Sang)
    +
    +* darwin: fix build warnings (小明)
    +
    +* linux: don't use io_uring on pre-5.10.186 kernels (Ben Noordhuis)
    +
    +* fs: fix WTF-8 decoding issue (Jameson Nash)
    +
    +* test: enable disabled tcp_connect6_error_fault (Ben Noordhuis)
    +
    +* test: enable disabled fs_link (Ben Noordhuis)
    +
    +* test: enable disabled spawn_same_stdout_stderr (Ben Noordhuis)
    +
    +* linux: handle UNAME26 personality (Ben Noordhuis)
    +
    +* build: move cmake_minimum_required version to 3.9 (Keith Winstein)
    +
    +* unix: set ipv6 scope id for link-local addresses (Ben Noordhuis)
    +
    +* unix: match kqueue and epoll code (Trevor Norris)
    +
    +* win,spawn: allow `%PATH%` to be unset (Kyle Edwards)
    +
    +* doc: switch to Furo, a more modern Sphinx theme (Saúl Ibarra Corretgé)
    +
    +* darwin: make TCP_KEEPINTVL and TCP_KEEPCNT available (小明)
    +
    +* win,fs: avoid winapi macro redefinition (Brad King)
    +
    +* linux: add missing riscv syscall numbers (michalbiesek)
    +
    +* doc: fix broken "Shared library" Wikipedia link (Alois Klink)
    +
    +* unix: get mainline kernel version in Ubuntu (Santiago Gimeno)
    +
    +* unix: get mainline kernel version in Debian (Ben Noordhuis)
    +
    +* build: fix qemu install in CI-unix workflow (Santiago Gimeno)
    +
    +* unix: disable io_uring close on selected kernels (Santiago Gimeno)
    +
    +* test: skip tests when ipv6 is not available (Santiago Gimeno)
    +
    +* ibmi: implement ifaddrs, getifaddrs, freeifaddrs (Abdirahim Musse)
    +
    +* unix: reset signal counters after fork (SmorkalovG)
    +
    +* win,process: avoid assert after spawning Store app (Jameson Nash)
    +
    +* unix: remove pread/preadv conditionals (Ben Noordhuis)
    +
    +* unix: remove pwrite/pwritev conditionals (Ben Noordhuis)
    +
    +* darwin: remove workaround for data corruption bug (Ben Noordhuis)
    +
    +* src: default to stream=stderr in handle printer (Ben Noordhuis)
    +
    +* test: switch to new-style ASSERT_EQ macros (Pleuvens)
    +
    +* zos: correctly get cpu model in uv_cpu_info() (jolai)
    +
    +* test: fix get_passwd2 on IBM i (Abdirahim Musse)
    +
    +* unix: don't malloc on sync uv_fs_read (Ben Noordhuis)
    +
    +* freebsd: get fs event path with fcntl(F_KINFO) (David Carlier)
    +
    +* test: switch from ASSERT_* to ASSERT_PTR_* (Pleuvens)
    +
    +* darwin: workaround apple pthread_cond_wait bug (Julien Roncaglia)
    +
    +* doc: uv_close should be called after exit callback (Pleuvens)
    +
    +* test: 192.0.2.0/24 is the actual -TEST-NET-1 (prubel)
    +
    +* unix: add back preadv/pwritev fallback (Ben Noordhuis)
    +
    +* unix: rename variable for consistency (Ben Noordhuis)
    +
    +* unix: merge read/write code into single functions (Ben Noordhuis)
    +
    +* doc: filename arg to uv_fs_event_cb can be NULL (Ben Noordhuis)
    +
    +* build,win: we need to link against shell32.lib (Per Allansson)
    +
    +* unix: no preadv/pwritev workaround if not needed (Jeffrey H. Johnson)
    +
    +* build: add CI for Windows ARM64 (build only) (Per Allansson)
    +
    +* linux: disable io_uring on 32 bits arm systems (Ben Noordhuis)
    +
    +* build: run sanitizers on macos ci (Ben Noordhuis)
    +
    +* misc: export WTF8 conversion utilities (Jameson Nash)
    +
    +* build: fix libuv.a file name for cmake (Jameson Nash)
    +
    +* build: add windows ubsan and clang ci (Matheus Izvekov)
    +
    +* win: improve accuracy of ProductName between arch (Christian Heimlich)
    +
    +
    +2023.06.30, Version 1.46.0 (Stable), f0bb7e40f0508bedf6fad33769b3f87bb8aedfa6
     
     Changes since version 1.45.0:
     
    diff --git a/deps/uv/configure.ac b/deps/uv/configure.ac
    index deb083605de639..0a1042ce3d384f 100644
    --- a/deps/uv/configure.ac
    +++ b/deps/uv/configure.ac
    @@ -13,7 +13,7 @@
     # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     
     AC_PREREQ(2.57)
    -AC_INIT([libuv], [1.46.0], [https://github.com/libuv/libuv/issues])
    +AC_INIT([libuv], [1.47.0], [https://github.com/libuv/libuv/issues])
     AC_CONFIG_MACRO_DIR([m4])
     m4_include([m4/libuv-extra-automake-flags.m4])
     m4_include([m4/as_case.m4])
    @@ -74,7 +74,7 @@ AM_CONDITIONAL([OS400],    [AS_CASE([$host_os],[os400],         [true], [false])
     AM_CONDITIONAL([SUNOS],    [AS_CASE([$host_os],[solaris*],      [true], [false])])
     AM_CONDITIONAL([WINNT],    [AS_CASE([$host_os],[mingw*],        [true], [false])])
     AS_CASE([$host_os],[mingw*], [
    -    LIBS="$LIBS -lws2_32 -lpsapi -liphlpapi -lshell32 -luserenv -luser32 -ldbghelp -lole32 -luuid"
    +    LIBS="$LIBS -lws2_32 -lpsapi -liphlpapi -lshell32 -luserenv -luser32 -ldbghelp -lole32 -luuid -lshell32"
     ])
     AS_CASE([$host_os], [solaris2.10], [
         CFLAGS="$CFLAGS -DSUNOS_NO_IFADDRS"
    diff --git a/deps/uv/docs/requirements.txt b/deps/uv/docs/requirements.txt
    index b037de46595389..2e310ebe7283af 100644
    --- a/deps/uv/docs/requirements.txt
    +++ b/deps/uv/docs/requirements.txt
    @@ -1,27 +1,36 @@
     # primary
    -sphinx==6.1.3
    +furo==2023.5.20
    +Sphinx==6.1.3
     
     # dependencies
     alabaster==0.7.13
     Babel==2.11.0
    +beautifulsoup4==4.12.2
     certifi==2022.12.7
     charset-normalizer==3.0.1
    +colorama==0.4.6
     docutils==0.19
     idna==3.4
     imagesize==1.4.1
     importlib-metadata==6.0.0
     Jinja2==3.1.2
    +livereload==2.6.3
     MarkupSafe==2.1.2
     packaging==23.0
     Pygments==2.14.0
     pytz==2022.7.1
     requests==2.28.2
    +six==1.16.0
     snowballstemmer==2.2.0
    -sphinxcontrib-applehelp==1.0.3
    +soupsieve==2.4.1
    +sphinx-autobuild==2021.3.14
    +sphinx-basic-ng==1.0.0b2
     sphinxcontrib-devhelp==1.0.2
     sphinxcontrib-htmlhelp==2.0.0
     sphinxcontrib-jsmath==1.0.1
     sphinxcontrib-qthelp==1.0.3
     sphinxcontrib-serializinghtml==1.1.5
    +sphinxcontrib.applehelp==1.0.3
    +tornado==6.3.2
     urllib3==1.26.14
     zipp==3.11.0
    diff --git a/deps/uv/docs/src/conf.py b/deps/uv/docs/src/conf.py
    index f6f43253d364c5..354759a23c507a 100644
    --- a/deps/uv/docs/src/conf.py
    +++ b/deps/uv/docs/src/conf.py
    @@ -118,7 +118,7 @@ def get_libuv_version():
     
     # The theme to use for HTML and HTML Help pages.  See the documentation for
     # a list of builtin themes.
    -html_theme = 'nature'
    +html_theme = 'furo'
     
     # Theme options are theme-specific and customize the look and feel of a theme
     # further.  For a list of options available for each theme, see the
    diff --git a/deps/uv/docs/src/fs_event.rst b/deps/uv/docs/src/fs_event.rst
    index e28ec625ed6b56..54a776ae6f1453 100644
    --- a/deps/uv/docs/src/fs_event.rst
    +++ b/deps/uv/docs/src/fs_event.rst
    @@ -39,8 +39,12 @@ Data types
     .. c:type:: void (*uv_fs_event_cb)(uv_fs_event_t* handle, const char* filename, int events, int status)
     
         Callback passed to :c:func:`uv_fs_event_start` which will be called repeatedly
    -    after the handle is started. If the handle was started with a directory the
    -    `filename` parameter will be a relative path to a file contained in the directory.
    +    after the handle is started.
    +
    +    If the handle was started with a directory the `filename` parameter will
    +    be a relative path to a file contained in the directory, or `NULL` if the
    +    file name cannot be determined.
    +
         The `events` parameter is an ORed mask of :c:type:`uv_fs_event` elements.
     
     .. c:type:: uv_fs_event
    diff --git a/deps/uv/docs/src/misc.rst b/deps/uv/docs/src/misc.rst
    index 8c3a00e934c97e..989618304d16e5 100644
    --- a/deps/uv/docs/src/misc.rst
    +++ b/deps/uv/docs/src/misc.rst
    @@ -839,3 +839,50 @@ API
         Causes the calling thread to sleep for `msec` milliseconds.
     
         .. versionadded:: 1.34.0
    +
    +String manipulation functions
    +-----------------------------
    +
    +These string utilities are needed internally for dealing with Windows, and are
    +exported to allow clients to work uniformly with this data when the libuv API
    +is not complete.
    +
    +.. c:function:: size_t uv_utf16_length_as_wtf8(const uint16_t* utf16, ssize_t utf16_len)
    +
    +    Get the length of a UTF-16 (or UCS-2) `utf16` value after converting it to
    +    WTF-8. If `utf16` is NUL terminated, `utf16_len` can be set to -1,
    +    otherwise it must be specified.
    +
    +    .. versionadded:: 1.47.0
    +
    +.. c:function:: int uv_utf16_to_wtf8(const uint16_t* utf16, ssize_t utf16_len, char** wtf8_ptr, size_t* wtf8_len_ptr)
    +
    +    Convert UTF-16 (or UCS-2) data in `utf16` to WTF-8 data in `*wtf8_ptr`. The
    +    `utf16_len` count (in characters) gives the length of `utf16`. If `utf16`
    +    is NUL terminated, `utf16_len` can be set to -1, otherwise it must be
    +    specified. If `wtf8_ptr` is `NULL`, no result will be computed, but the
    +    length (equal to `uv_utf16_length_as_wtf8`) will be stored in `wtf8_ptr`.
    +    If `*wtf8_ptr` is `NULL`, space for the conversion will be allocated and
    +    returned in `wtf8_ptr` and the length will be returned in `wtf8_len_ptr`.
    +    Otherwise, the length of `*wtf8_ptr` must be passed in `wtf8_len_ptr`. The
    +    `wtf8_ptr` must contain an extra space for an extra NUL after the result.
    +    If the result is truncated, `UV_ENOBUFS` will be returned and
    +    `wtf8_len_ptr` will be the length of the required `wtf8_ptr` to contain the
    +    whole result.
    +
    +    .. versionadded:: 1.47.0
    +
    +.. c:function:: ssize_t uv_wtf8_length_as_utf16(const char* wtf8)
    +
    +    Get the length in characters of a NUL-terminated WTF-8 `wtf8` value
    +    after converting it to UTF-16 (or UCS-2), including NUL terminator.
    +
    +    .. versionadded:: 1.47.0
    +
    +.. c:function:: void uv_wtf8_to_utf16(const char* utf8, uint16_t* utf16, size_t utf16_len)
    +
    +    Convert NUL-terminated WTF-8 data in `wtf8` to UTF-16 (or UCS-2) data
    +    in `utf16`. The `utf16_len` count (in characters) must include space
    +    for the NUL terminator.
    +
    +    .. versionadded:: 1.47.0
    diff --git a/deps/uv/include/uv.h b/deps/uv/include/uv.h
    index 02397dd0fdd43d..5642101c10c351 100644
    --- a/deps/uv/include/uv.h
    +++ b/deps/uv/include/uv.h
    @@ -1885,6 +1885,18 @@ struct uv_loop_s {
     UV_EXTERN void* uv_loop_get_data(const uv_loop_t*);
     UV_EXTERN void uv_loop_set_data(uv_loop_t*, void* data);
     
    +/* String utilities needed internally for dealing with Windows. */
    +size_t uv_utf16_length_as_wtf8(const uint16_t* utf16,
    +                               ssize_t utf16_len);
    +int uv_utf16_to_wtf8(const uint16_t* utf16,
    +                     ssize_t utf16_len,
    +                     char** wtf8_ptr,
    +                     size_t* wtf8_len_ptr);
    +ssize_t uv_wtf8_length_as_utf16(const char* wtf8);
    +void uv_wtf8_to_utf16(const char* wtf8,
    +                      uint16_t* utf16,
    +                      size_t utf16_len);
    +
     /* Don't export the private CPP symbols. */
     #undef UV_HANDLE_TYPE_PRIVATE
     #undef UV_REQ_TYPE_PRIVATE
    diff --git a/deps/uv/include/uv/version.h b/deps/uv/include/uv/version.h
    index 24fac8d8aa76f7..b17220fcf9090e 100644
    --- a/deps/uv/include/uv/version.h
    +++ b/deps/uv/include/uv/version.h
    @@ -31,7 +31,7 @@
      */
     
     #define UV_VERSION_MAJOR 1
    -#define UV_VERSION_MINOR 46
    +#define UV_VERSION_MINOR 47
     #define UV_VERSION_PATCH 0
     #define UV_VERSION_IS_RELEASE 1
     #define UV_VERSION_SUFFIX ""
    diff --git a/deps/uv/src/idna.c b/deps/uv/src/idna.c
    index 93d982ca018f2d..1c0a60cf3e3bec 100644
    --- a/deps/uv/src/idna.c
    +++ b/deps/uv/src/idna.c
    @@ -1,4 +1,4 @@
    -/* Copyright (c) 2011, 2018 Ben Noordhuis 
    +/* Copyright libuv contributors. All rights reserved.
      *
      * Permission to use, copy, modify, and/or distribute this software for any
      * purpose with or without fee is hereby granted, provided that the above
    @@ -18,11 +18,56 @@
      */
     
     #include "uv.h"
    +#include "uv-common.h"
     #include "idna.h"
     #include 
     #include 
     #include  /* UINT_MAX */
     
    +
    +static int32_t uv__wtf8_decode1(const char** input) {
    +  uint32_t code_point;
    +  uint8_t b1;
    +  uint8_t b2;
    +  uint8_t b3;
    +  uint8_t b4;
    +
    +  b1 = **input;
    +  if (b1 <= 0x7F)
    +    return b1; /* ASCII code point */
    +  if (b1 < 0xC2)
    +    return -1; /* invalid: continuation byte */
    +  code_point = b1;
    +
    +  b2 = *++*input;
    +  if ((b2 & 0xC0) != 0x80)
    +    return -1; /* invalid: not a continuation byte */
    +  code_point = (code_point << 6) | (b2 & 0x3F);
    +  if (b1 <= 0xDF)
    +    return 0x7FF & code_point; /* two-byte character */
    +
    +  b3 = *++*input;
    +  if ((b3 & 0xC0) != 0x80)
    +    return -1; /* invalid: not a continuation byte */
    +  code_point = (code_point << 6) | (b3 & 0x3F);
    +  if (b1 <= 0xEF)
    +    return 0xFFFF & code_point; /* three-byte character */
    +
    +  b4 = *++*input;
    +  if ((b4 & 0xC0) != 0x80)
    +    return -1; /* invalid: not a continuation byte */
    +  code_point = (code_point << 6) | (b4 & 0x3F);
    +  if (b1 <= 0xF4) {
    +    code_point &= 0x1FFFFF;
    +    if (code_point <= 0x10FFFF)
    +      return code_point; /* four-byte character */
    +  }
    +
    +  /* code point too large */
    +  return -1;
    +}
    +
    +
     static unsigned uv__utf8_decode1_slow(const char** p,
                                           const char* pe,
                                           unsigned a) {
    @@ -89,6 +134,7 @@ static unsigned uv__utf8_decode1_slow(const char** p,
       return a;
     }
     
    +
     unsigned uv__utf8_decode1(const char** p, const char* pe) {
       unsigned a;
     
    @@ -102,6 +148,7 @@ unsigned uv__utf8_decode1(const char** p, const char* pe) {
       return uv__utf8_decode1_slow(p, pe, a);
     }
     
    +
     static int uv__idna_toascii_label(const char* s, const char* se,
                                       char** d, char* de) {
       static const char alphabet[] = "abcdefghijklmnopqrstuvwxyz0123456789";
    @@ -267,7 +314,8 @@ static int uv__idna_toascii_label(const char* s, const char* se,
       return 0;
     }
     
    -long uv__idna_toascii(const char* s, const char* se, char* d, char* de) {
    +
    +ssize_t uv__idna_toascii(const char* s, const char* se, char* d, char* de) {
       const char* si;
       const char* st;
       unsigned c;
    @@ -313,3 +361,195 @@ long uv__idna_toascii(const char* s, const char* se, char* d, char* de) {
     
       return d - ds;  /* Number of bytes written. */
     }
    +
    +
    +ssize_t uv_wtf8_length_as_utf16(const char* source_ptr) {
    +  size_t w_target_len = 0;
    +  int32_t code_point;
    +
    +  do {
    +    code_point = uv__wtf8_decode1(&source_ptr);
    +    if (code_point < 0)
    +      return -1;
    +    if (code_point > 0xFFFF)
    +      w_target_len++;
    +    w_target_len++;
    +  } while (*source_ptr++);
    +
    +  return w_target_len;
    +}
    +
    +
    +void uv_wtf8_to_utf16(const char* source_ptr,
    +                      uint16_t* w_target,
    +                      size_t w_target_len) {
    +  int32_t code_point;
    +
    +  do {
    +    code_point = uv__wtf8_decode1(&source_ptr);
    +    /* uv_wtf8_length_as_utf16 should have been called and checked first. */
    +    assert(code_point >= 0);
    +    if (code_point > 0x10000) {
    +      assert(code_point < 0x10FFFF);
    +      *w_target++ = (((code_point - 0x10000) >> 10) + 0xD800);
    +      *w_target++ = ((code_point - 0x10000) & 0x3FF) + 0xDC00;
    +      w_target_len -= 2;
    +    } else {
    +      *w_target++ = code_point;
    +      w_target_len -= 1;
    +    }
    +  } while (*source_ptr++);
    +
    +  assert(w_target_len == 0);
    +}
    +
    +
    +static int32_t uv__get_surrogate_value(const uint16_t* w_source_ptr,
    +                                       ssize_t w_source_len) {
    +  uint16_t u;
    +  uint16_t next;
    +
    +  u = w_source_ptr[0];
    +  if (u >= 0xD800 && u <= 0xDBFF && w_source_len != 1) {
    +    next = w_source_ptr[1];
    +    if (next >= 0xDC00 && next <= 0xDFFF)
    +      return 0x10000 + ((u - 0xD800) << 10) + (next - 0xDC00);
    +  }
    +  return u;
    +}
    +
    +
    +size_t uv_utf16_length_as_wtf8(const uint16_t* w_source_ptr,
    +                               ssize_t w_source_len) {
    +  size_t target_len;
    +  int32_t code_point;
    +
    +  target_len = 0;
    +  while (w_source_len) {
    +    code_point = uv__get_surrogate_value(w_source_ptr, w_source_len);
    +    /* Can be invalid UTF-8 but must be valid WTF-8. */
    +    assert(code_point >= 0);
    +    if (w_source_len < 0 && code_point == 0)
    +      break;
    +    if (code_point < 0x80)
    +      target_len += 1;
    +    else if (code_point < 0x800)
    +      target_len += 2;
    +    else if (code_point < 0x10000)
    +      target_len += 3;
    +    else {
    +      target_len += 4;
    +      w_source_ptr++;
    +      if (w_source_len > 0)
    +        w_source_len--;
    +    }
    +    w_source_ptr++;
    +    if (w_source_len > 0)
    +      w_source_len--;
    +  }
    +
    +  return target_len;
    +}
    +
    +
    +int uv_utf16_to_wtf8(const uint16_t* w_source_ptr,
    +                     ssize_t w_source_len,
    +                     char** target_ptr,
    +                     size_t* target_len_ptr) {
    +  size_t target_len;
    +  char* target;
    +  char* target_end;
    +  int32_t code_point;
    +
    +  /* If *target_ptr is provided, then *target_len_ptr must be its length
    +   * (excluding space for NUL), otherwise we will compute the target_len_ptr
    +   * length and may return a new allocation in *target_ptr if target_ptr is
    +   * provided. */
    +  if (target_ptr == NULL || *target_ptr == NULL) {
    +    target_len = uv_utf16_length_as_wtf8(w_source_ptr, w_source_len);
    +    if (target_len_ptr != NULL)
    +      *target_len_ptr = target_len;
    +  } else {
    +    target_len = *target_len_ptr;
    +  }
    +
    +  if (target_ptr == NULL)
    +    return 0;
    +
    +  if (*target_ptr == NULL) {
    +    target = uv__malloc(target_len + 1);
    +    if (target == NULL) {
    +      return UV_ENOMEM;
    +    }
    +    *target_ptr = target;
    +  } else {
    +    target = *target_ptr;
    +  }
    +
    +  target_end = target + target_len;
    +
    +  while (target != target_end && w_source_len) {
    +    code_point = uv__get_surrogate_value(w_source_ptr, w_source_len);
    +    /* Can be invalid UTF-8 but must be valid WTF-8. */
    +    assert(code_point >= 0);
    +    if (w_source_len < 0 && code_point == 0) {
    +      w_source_len = 0;
    +      break;
    +    }
    +    if (code_point < 0x80) {
    +      *target++ = code_point;
    +    } else if (code_point < 0x800) {
    +      *target++ = 0xC0 | (code_point >> 6);
    +      if (target == target_end)
    +        break;
    +      *target++ = 0x80 | (code_point & 0x3F);
    +    } else if (code_point < 0x10000) {
    +      *target++ = 0xE0 | (code_point >> 12);
    +      if (target == target_end)
    +        break;
    +      *target++ = 0x80 | ((code_point >> 6) & 0x3F);
    +      if (target == target_end)
    +        break;
    +      *target++ = 0x80 | (code_point & 0x3F);
    +    } else {
    +      *target++ = 0xF0 | (code_point >> 18);
    +      if (target == target_end)
    +        break;
    +      *target++ = 0x80 | ((code_point >> 12) & 0x3F);
    +      if (target == target_end)
    +        break;
    +      *target++ = 0x80 | ((code_point >> 6) & 0x3F);
    +      if (target == target_end)
    +        break;
    +      *target++ = 0x80 | (code_point & 0x3F);
    +      /* uv__get_surrogate_value consumed 2 input characters */
    +      w_source_ptr++;
    +      if (w_source_len > 0)
    +        w_source_len--;
    +    }
    +    target_len = target - *target_ptr;
    +    w_source_ptr++;
    +    if (w_source_len > 0)
    +      w_source_len--;
    +  }
    +
    +  if (target != target_end && target_len_ptr != NULL)
    +    /* Did not fill all of the provided buffer, so update the target_len_ptr
    +     * output with the space used. */
    +    *target_len_ptr = target - *target_ptr;
    +
    +  /* Check if input fit into target exactly. */
    +  if (w_source_len < 0 && target == target_end && w_source_ptr[0] == 0)
    +    w_source_len = 0;
    +
    +  *target++ = '\0';
    +
    +  /* Characters remained after filling the buffer, compute the remaining length now. */
    +  if (w_source_len) {
    +    if (target_len_ptr != NULL)
    +      *target_len_ptr = target_len + uv_utf16_length_as_wtf8(w_source_ptr, w_source_len);
    +    return UV_ENOBUFS;
    +  }
    +
    +  return 0;
    +}
    diff --git a/deps/uv/src/idna.h b/deps/uv/src/idna.h
    index 8e0c592fe139e5..ea6b4df9671fcc 100644
    --- a/deps/uv/src/idna.h
    +++ b/deps/uv/src/idna.h
    @@ -1,4 +1,4 @@
    -/* Copyright (c) 2011, 2018 Ben Noordhuis 
    +/* Copyright libuv contributors. All rights reserved.
      *
      * Permission to use, copy, modify, and/or distribute this software for any
      * purpose with or without fee is hereby granted, provided that the above
    @@ -26,6 +26,6 @@ unsigned uv__utf8_decode1(const char** p, const char* pe);
      * is the number of bytes written to |d|, including the trailing nul byte.
      * A return value < 0 is a libuv error code. |s| and |d| can not overlap.
      */
    -long uv__idna_toascii(const char* s, const char* se, char* d, char* de);
    +ssize_t uv__idna_toascii(const char* s, const char* se, char* d, char* de);
     
     #endif  /* UV_SRC_IDNA_H_ */
    diff --git a/deps/uv/src/unix/darwin.c b/deps/uv/src/unix/darwin.c
    index 90790d701c4327..5e764a65ee4c71 100644
    --- a/deps/uv/src/unix/darwin.c
    +++ b/deps/uv/src/unix/darwin.c
    @@ -209,7 +209,7 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
       if (cpuspeed == 0)
         /* If sysctl hw.cputype == CPU_TYPE_ARM64, the correct value is unavailable
          * from Apple, but we can hard-code it here to a plausible value. */
    -    cpuspeed = 2400000000;
    +    cpuspeed = 2400000000U;
     
       if (host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &numcpus,
                               (processor_info_array_t*)&info,
    @@ -235,7 +235,7 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
         cpu_info->cpu_times.irq = 0;
     
         cpu_info->model = uv__strdup(model);
    -    cpu_info->speed = cpuspeed/1000000;
    +    cpu_info->speed = (int)(cpuspeed / 1000000);
       }
       vm_deallocate(mach_task_self(), (vm_address_t)info, msg_type);
     
    diff --git a/deps/uv/src/unix/fs.c b/deps/uv/src/unix/fs.c
    index 6b051c124f2fd9..891306daedcc6a 100644
    --- a/deps/uv/src/unix/fs.c
    +++ b/deps/uv/src/unix/fs.c
    @@ -41,25 +41,10 @@
     #include 
     #include 
     #include 
    -#include 
     #include 
     #include 
     #include 
     
    -#if defined(__DragonFly__)        ||                                      \
    -    defined(__FreeBSD__)          ||                                      \
    -    defined(__OpenBSD__)          ||                                      \
    -    defined(__NetBSD__)
    -# define HAVE_PREADV 1
    -#else
    -# define HAVE_PREADV 0
    -#endif
    -
    -/* preadv() and pwritev() were added in Android N (level 24) */
    -#if defined(__linux__) && !(defined(__ANDROID__) && __ANDROID_API__ < 24)
    -# define TRY_PREADV 1
    -#endif
    -
     #if defined(__linux__)
     # include 
     #endif
    @@ -97,6 +82,15 @@
     # include 
     #endif
     
    +#if defined(__CYGWIN__) ||                                                    \
    +    (defined(__HAIKU__) && B_HAIKU_VERSION < B_HAIKU_VERSION_1_PRE_BETA_5) || \
    +    (defined(__sun) && !defined(__illumos__))
    +#define preadv(fd, bufs, nbufs, off)                                          \
    +  pread(fd, (bufs)->iov_base, (bufs)->iov_len, off)
    +#define pwritev(fd, bufs, nbufs, off)                                         \
    +  pwrite(fd, (bufs)->iov_base, (bufs)->iov_len, off)
    +#endif
    +
     #if defined(_AIX) && _XOPEN_SOURCE <= 600
     extern char *mkdtemp(char *template); /* See issue #740 on AIX < 7 */
     #endif
    @@ -410,123 +404,57 @@ static ssize_t uv__fs_open(uv_fs_t* req) {
     }
     
     
    -#if !HAVE_PREADV
    -static ssize_t uv__fs_preadv(uv_file fd,
    -                             uv_buf_t* bufs,
    -                             unsigned int nbufs,
    -                             off_t off) {
    -  uv_buf_t* buf;
    -  uv_buf_t* end;
    -  ssize_t result;
    -  ssize_t rc;
    -  size_t pos;
    -
    -  assert(nbufs > 0);
    -
    -  result = 0;
    -  pos = 0;
    -  buf = bufs + 0;
    -  end = bufs + nbufs;
    -
    -  for (;;) {
    -    do
    -      rc = pread(fd, buf->base + pos, buf->len - pos, off + result);
    -    while (rc == -1 && errno == EINTR);
    -
    -    if (rc == 0)
    -      break;
    -
    -    if (rc == -1 && result == 0)
    -      return UV__ERR(errno);
    -
    -    if (rc == -1)
    -      break;  /* We read some data so return that, ignore the error. */
    -
    -    pos += rc;
    -    result += rc;
    -
    -    if (pos < buf->len)
    -      continue;
    -
    -    pos = 0;
    -    buf += 1;
    -
    -    if (buf == end)
    -      break;
    -  }
    -
    -  return result;
    -}
    -#endif
    -
    -
     static ssize_t uv__fs_read(uv_fs_t* req) {
    -#if TRY_PREADV
    -  static _Atomic int no_preadv;
    -#endif
    +  const struct iovec* bufs;
       unsigned int iovmax;
    -  ssize_t result;
    +  size_t nbufs;
    +  ssize_t r;
    +  off_t off;
    +  int fd;
    +
    +  fd = req->file;
    +  off = req->off;
    +  bufs = (const struct iovec*) req->bufs;
    +  nbufs = req->nbufs;
     
       iovmax = uv__getiovmax();
    -  if (req->nbufs > iovmax)
    -    req->nbufs = iovmax;
    -
    -  if (req->off < 0) {
    -    if (req->nbufs == 1)
    -      result = read(req->file, req->bufs[0].base, req->bufs[0].len);
    -    else
    -      result = readv(req->file, (struct iovec*) req->bufs, req->nbufs);
    +  if (nbufs > iovmax)
    +    nbufs = iovmax;
    +
    +  r = 0;
    +  if (off < 0) {
    +    if (nbufs == 1)
    +      r = read(fd, bufs->iov_base, bufs->iov_len);
    +    else if (nbufs > 1)
    +      r = readv(fd, bufs, nbufs);
       } else {
    -    if (req->nbufs == 1) {
    -      result = pread(req->file, req->bufs[0].base, req->bufs[0].len, req->off);
    -      goto done;
    -    }
    -
    -#if HAVE_PREADV
    -    result = preadv(req->file, (struct iovec*) req->bufs, req->nbufs, req->off);
    -#else
    -# if TRY_PREADV
    -    if (atomic_load_explicit(&no_preadv, memory_order_relaxed)) retry:
    -# endif
    -    {
    -      result = uv__fs_preadv(req->file, req->bufs, req->nbufs, req->off);
    -    }
    -# if TRY_PREADV
    -    else {
    -      result = preadv(req->file,
    -                      (struct iovec*) req->bufs,
    -                      req->nbufs,
    -                      req->off);
    -      if (result == -1 && errno == ENOSYS) {
    -        atomic_store_explicit(&no_preadv, 1, memory_order_relaxed);
    -        goto retry;
    -      }
    -    }
    -# endif
    -#endif
    +    if (nbufs == 1)
    +      r = pread(fd, bufs->iov_base, bufs->iov_len, off);
    +    else if (nbufs > 1)
    +      r = preadv(fd, bufs, nbufs, off);
       }
     
    -done:
    -  /* Early cleanup of bufs allocation, since we're done with it. */
    -  if (req->bufs != req->bufsml)
    -    uv__free(req->bufs);
    -
    -  req->bufs = NULL;
    -  req->nbufs = 0;
    -
     #ifdef __PASE__
       /* PASE returns EOPNOTSUPP when reading a directory, convert to EISDIR */
    -  if (result == -1 && errno == EOPNOTSUPP) {
    +  if (r == -1 && errno == EOPNOTSUPP) {
         struct stat buf;
         ssize_t rc;
    -    rc = uv__fstat(req->file, &buf);
    +    rc = uv__fstat(fd, &buf);
         if (rc == 0 && S_ISDIR(buf.st_mode)) {
           errno = EISDIR;
         }
       }
     #endif
     
    -  return result;
    +  /* We don't own the buffer list in the synchronous case. */
    +  if (req->cb != NULL)
    +    if (req->bufs != req->bufsml)
    +      uv__free(req->bufs);
    +
    +  req->bufs = NULL;
    +  req->nbufs = 0;
    +
    +  return r;
     }
     
     
    @@ -1161,65 +1089,34 @@ static ssize_t uv__fs_lutime(uv_fs_t* req) {
     
     
     static ssize_t uv__fs_write(uv_fs_t* req) {
    -#if TRY_PREADV
    -  static _Atomic int no_pwritev;
    -#endif
    +  const struct iovec* bufs;
    +  size_t nbufs;
       ssize_t r;
    +  off_t off;
    +  int fd;
     
    -  /* Serialize writes on OS X, concurrent write() and pwrite() calls result in
    -   * data loss. We can't use a per-file descriptor lock, the descriptor may be
    -   * a dup().
    -   */
    -#if defined(__APPLE__)
    -  static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
    -
    -  if (pthread_mutex_lock(&lock))
    -    abort();
    -#endif
    +  fd = req->file;
    +  off = req->off;
    +  bufs = (const struct iovec*) req->bufs;
    +  nbufs = req->nbufs;
     
    -  if (req->off < 0) {
    -    if (req->nbufs == 1)
    -      r = write(req->file, req->bufs[0].base, req->bufs[0].len);
    -    else
    -      r = writev(req->file, (struct iovec*) req->bufs, req->nbufs);
    +  r = 0;
    +  if (off < 0) {
    +    if (nbufs == 1)
    +      r = write(fd, bufs->iov_base, bufs->iov_len);
    +    else if (nbufs > 1)
    +      r = writev(fd, bufs, nbufs);
       } else {
    -    if (req->nbufs == 1) {
    -      r = pwrite(req->file, req->bufs[0].base, req->bufs[0].len, req->off);
    -      goto done;
    -    }
    -#if HAVE_PREADV
    -    r = pwritev(req->file, (struct iovec*) req->bufs, req->nbufs, req->off);
    -#else
    -# if TRY_PREADV
    -    if (atomic_load_explicit(&no_pwritev, memory_order_relaxed)) retry:
    -# endif
    -    {
    -      r = pwrite(req->file, req->bufs[0].base, req->bufs[0].len, req->off);
    -    }
    -# if TRY_PREADV
    -    else {
    -      r = pwritev(req->file,
    -                  (struct iovec*) req->bufs,
    -                  req->nbufs,
    -                  req->off);
    -      if (r == -1 && errno == ENOSYS) {
    -        atomic_store_explicit(&no_pwritev, 1, memory_order_relaxed);
    -        goto retry;
    -      }
    -    }
    -# endif
    -#endif
    +    if (nbufs == 1)
    +      r = pwrite(fd, bufs->iov_base, bufs->iov_len, off);
    +    else if (nbufs > 1)
    +      r = pwritev(fd, bufs, nbufs, off);
       }
     
    -done:
    -#if defined(__APPLE__)
    -  if (pthread_mutex_unlock(&lock))
    -    abort();
    -#endif
    -
       return r;
     }
     
    +
     static ssize_t uv__fs_copyfile(uv_fs_t* req) {
       uv_fs_t fs_req;
       uv_file srcfd;
    @@ -1979,9 +1876,14 @@ int uv_fs_read(uv_loop_t* loop, uv_fs_t* req,
       if (bufs == NULL || nbufs == 0)
         return UV_EINVAL;
     
    +  req->off = off;
       req->file = file;
    -
    +  req->bufs = (uv_buf_t*) bufs;  /* Safe, doesn't mutate |bufs| */
       req->nbufs = nbufs;
    +
    +  if (cb == NULL)
    +    goto post;
    +
       req->bufs = req->bufsml;
       if (nbufs > ARRAY_SIZE(req->bufsml))
         req->bufs = uv__malloc(nbufs * sizeof(*bufs));
    @@ -1991,12 +1893,10 @@ int uv_fs_read(uv_loop_t* loop, uv_fs_t* req,
     
       memcpy(req->bufs, bufs, nbufs * sizeof(*bufs));
     
    -  req->off = off;
    -
    -  if (cb != NULL)
    -    if (uv__iou_fs_read_or_write(loop, req, /* is_read */ 1))
    -      return 0;
    +  if (uv__iou_fs_read_or_write(loop, req, /* is_read */ 1))
    +    return 0;
     
    +post:
       POST;
     }
     
    diff --git a/deps/uv/src/unix/kqueue.c b/deps/uv/src/unix/kqueue.c
    index b78242d3be4e3c..94ace58680cf39 100644
    --- a/deps/uv/src/unix/kqueue.c
    +++ b/deps/uv/src/unix/kqueue.c
    @@ -30,6 +30,9 @@
     #include 
     #include 
     #include 
    +#if defined(__FreeBSD__)
    +#include 
    +#endif
     #include 
     #include 
     #include 
    @@ -262,6 +265,9 @@ void uv__io_poll(uv_loop_t* loop, int timeout) {
     
         if (nfds == -1)
           assert(errno == EINTR);
    +    else if (nfds == 0)
    +      /* Unlimited timeout should only return with events or signal. */
    +      assert(timeout != -1);
     
         if (pset != NULL)
           pthread_sigmask(SIG_UNBLOCK, pset, NULL);
    @@ -286,8 +292,6 @@ void uv__io_poll(uv_loop_t* loop, int timeout) {
             timeout = user_timeout;
             reset_timeout = 0;
           } else if (nfds == 0) {
    -        /* Reached the user timeout value. */
    -        assert(timeout != -1);
             return;
           }
     
    @@ -479,6 +483,16 @@ static void uv__fs_event(uv_loop_t* loop, uv__io_t* w, unsigned int fflags) {
        */
       if (fcntl(handle->event_watcher.fd, F_GETPATH, pathbuf) == 0)
         path = uv__basename_r(pathbuf);
    +#elif defined(F_KINFO)
    +  /* We try to get the file info reference from the file descriptor.
    +   * the struct's kf_structsize must be initialised beforehand
    +   * whether with the KINFO_FILE_SIZE constant or this way.
    +   */
    +  struct kinfo_file kf;
    +  kf.kf_structsize = sizeof(kf);
    +
    +  if (fcntl(handle->event_watcher.fd, F_KINFO, &kf) == 0)
    +    path = uv__basename_r(kf.kf_path);
     #endif
       handle->cb(handle, path, events, 0);
     
    diff --git a/deps/uv/src/unix/linux.c b/deps/uv/src/unix/linux.c
    index 48b9c2c43e1040..8eeb352e6238a9 100644
    --- a/deps/uv/src/unix/linux.c
    +++ b/deps/uv/src/unix/linux.c
    @@ -79,6 +79,8 @@
     #  define __NR_copy_file_range 379
     # elif defined(__arc__)
     #  define __NR_copy_file_range 285
    +# elif defined(__riscv)
    +#  define __NR_copy_file_range 285
     # endif
     #endif /* __NR_copy_file_range */
     
    @@ -95,6 +97,8 @@
     #  define __NR_statx 383
     # elif defined(__s390__)
     #  define __NR_statx 379
    +# elif defined(__riscv)
    +#  define __NR_statx 291
     # endif
     #endif /* __NR_statx */
     
    @@ -111,6 +115,8 @@
     #  define __NR_getrandom 359
     # elif defined(__s390__)
     #  define __NR_getrandom 349
    +# elif defined(__riscv)
    +#  define __NR_getrandom 278
     # endif
     #endif /* __NR_getrandom */
     
    @@ -317,17 +323,64 @@ unsigned uv__kernel_version(void) {
       unsigned major;
       unsigned minor;
       unsigned patch;
    +  char v_sig[256];
    +  char* needle;
     
       version = atomic_load_explicit(&cached_version, memory_order_relaxed);
       if (version != 0)
         return version;
     
    +  /* Check /proc/version_signature first as it's the way to get the mainline
    +   * kernel version in Ubuntu. The format is:
    +   *   Ubuntu ubuntu_kernel_version mainline_kernel_version
    +   * For example:
    +   *   Ubuntu 5.15.0-79.86-generic 5.15.111
    +   */
    +  if (0 == uv__slurp("/proc/version_signature", v_sig, sizeof(v_sig)))
    +    if (3 == sscanf(v_sig, "Ubuntu %*s %u.%u.%u", &major, &minor, &patch))
    +      goto calculate_version;
    +
       if (-1 == uname(&u))
         return 0;
     
    +  /* In Debian we need to check `version` instead of `release` to extract the
    +   * mainline kernel version. This is an example of how it looks like:
    +   *  #1 SMP Debian 5.10.46-4 (2021-08-03)
    +   */
    +  needle = strstr(u.version, "Debian ");
    +  if (needle != NULL)
    +    if (3 == sscanf(needle, "Debian %u.%u.%u", &major, &minor, &patch))
    +      goto calculate_version;
    +
       if (3 != sscanf(u.release, "%u.%u.%u", &major, &minor, &patch))
         return 0;
     
    +  /* Handle it when the process runs under the UNAME26 personality:
    +   *
    +   * - kernels >= 3.x identify as 2.6.40+x
    +   * - kernels >= 4.x identify as 2.6.60+x
    +   *
    +   * UNAME26 is a poorly conceived hack that doesn't let us distinguish
    +   * between 4.x kernels and 5.x/6.x kernels so we conservatively assume
    +   * that 2.6.60+x means 4.x.
    +   *
    +   * Fun fact of the day: it's technically possible to observe the actual
    +   * kernel version for a brief moment because uname() first copies out the
    +   * real release string before overwriting it with the backcompat string.
    +   */
    +  if (major == 2 && minor == 6) {
    +    if (patch >= 60) {
    +      major = 4;
    +      minor = patch - 60;
    +      patch = 0;
    +    } else if (patch >= 40) {
    +      major = 3;
    +      minor = patch - 40;
    +      patch = 0;
    +    }
    +  }
    +
    +calculate_version:
       version = major * 65536 + minor * 256 + patch;
       atomic_store_explicit(&cached_version, version, memory_order_relaxed);
     
    @@ -422,6 +475,9 @@ int uv__io_uring_register(int fd, unsigned opcode, void* arg, unsigned nargs) {
     static int uv__use_io_uring(void) {
     #if defined(__ANDROID_API__)
       return 0;  /* Possibly available but blocked by seccomp. */
    +#elif defined(__arm__) && __SIZEOF_POINTER__ == 4
    +  /* See https://github.com/libuv/libuv/issues/4158. */
    +  return 0;  /* All 32 bits kernels appear buggy. */
     #else
       /* Ternary: unknown=0, yes=1, no=-1 */
       static _Atomic int use_io_uring;
    @@ -431,8 +487,14 @@ static int uv__use_io_uring(void) {
       use = atomic_load_explicit(&use_io_uring, memory_order_relaxed);
     
       if (use == 0) {
    +    /* Older kernels have a bug where the sqpoll thread uses 100% CPU. */
    +    use = uv__kernel_version() >= /* 5.10.186 */ 0x050ABA ? 1 : -1;
    +
    +    /* But users can still enable it if they so desire. */
         val = getenv("UV_USE_IO_URING");
    -    use = val == NULL || atoi(val) ? 1 : -1;
    +    if (val != NULL)
    +      use = atoi(val) ? 1 : -1;
    +
         atomic_store_explicit(&use_io_uring, use, memory_order_relaxed);
       }
     
    @@ -756,7 +818,9 @@ static void uv__iou_submit(struct uv__iou* iou) {
     int uv__iou_fs_close(uv_loop_t* loop, uv_fs_t* req) {
       struct uv__io_uring_sqe* sqe;
       struct uv__iou* iou;
    +  int kv;
     
    +  kv = uv__kernel_version();
       /* Work around a poorly understood bug in older kernels where closing a file
        * descriptor pointing to /foo/bar results in ETXTBSY errors when trying to
        * execve("/foo/bar") later on. The bug seems to have been fixed somewhere
    @@ -764,10 +828,17 @@ int uv__iou_fs_close(uv_loop_t* loop, uv_fs_t* req) {
        * but good candidates are the several data race fixes. Interestingly, it
        * seems to manifest only when running under Docker so the possibility of
        * a Docker bug can't be completely ruled out either. Yay, computers.
    +   * Also, disable on non-longterm versions between 5.16.0 (non-longterm) and
    +   * 6.1.0 (longterm). Starting with longterm 6.1.x, the issue seems to be
    +   * solved.
        */
    -  if (uv__kernel_version() < /* 5.15.90 */ 0x050F5A)
    +  if (kv < /* 5.15.90 */ 0x050F5A)
    +    return 0;
    +
    +  if (kv >= /* 5.16.0 */ 0x050A00 && kv < /* 6.1.0 */ 0x060100)
         return 0;
     
    +
       iou = &uv__get_internal_fields(loop)->iou;
     
       sqe = uv__iou_get_sqe(iou, loop, req);
    @@ -1364,41 +1435,20 @@ void uv__io_poll(uv_loop_t* loop, int timeout) {
          */
         SAVE_ERRNO(uv__update_time(loop));
     
    -    if (nfds == 0) {
    +    if (nfds == -1)
    +      assert(errno == EINTR);
    +    else if (nfds == 0)
    +      /* Unlimited timeout should only return with events or signal. */
           assert(timeout != -1);
     
    +    if (nfds == 0 || nfds == -1) {
           if (reset_timeout != 0) {
             timeout = user_timeout;
             reset_timeout = 0;
    +      } else if (nfds == 0) {
    +        return;
           }
     
    -      if (timeout == -1)
    -        continue;
    -
    -      if (timeout == 0)
    -        break;
    -
    -      /* We may have been inside the system call for longer than |timeout|
    -       * milliseconds so we need to update the timestamp to avoid drift.
    -       */
    -      goto update_timeout;
    -    }
    -
    -    if (nfds == -1) {
    -      if (errno != EINTR)
    -        abort();
    -
    -      if (reset_timeout != 0) {
    -        timeout = user_timeout;
    -        reset_timeout = 0;
    -      }
    -
    -      if (timeout == -1)
    -        continue;
    -
    -      if (timeout == 0)
    -        break;
    -
           /* Interrupted by a signal. Update timeout and poll again. */
           goto update_timeout;
         }
    @@ -1509,13 +1559,13 @@ void uv__io_poll(uv_loop_t* loop, int timeout) {
           break;
         }
     
    +update_timeout:
         if (timeout == 0)
           break;
     
         if (timeout == -1)
           continue;
     
    -update_timeout:
         assert(timeout > 0);
     
         real_timeout -= (loop->time - base);
    @@ -1718,7 +1768,8 @@ int uv_cpu_info(uv_cpu_info_t** ci, int* count) {
         return UV__ERR(errno);
       }
     
    -  fgets(buf, sizeof(buf), fp);  /* Skip first line. */
    +  if (NULL == fgets(buf, sizeof(buf), fp))
    +    abort();
     
       for (;;) {
         memset(&t, 0, sizeof(t));
    @@ -1729,7 +1780,8 @@ int uv_cpu_info(uv_cpu_info_t** ci, int* count) {
         if (n != 7)
           break;
     
    -    fgets(buf, sizeof(buf), fp);  /* Skip rest of line. */
    +    if (NULL == fgets(buf, sizeof(buf), fp))
    +      abort();
     
         if (cpu >= ARRAY_SIZE(*cpus))
           continue;
    @@ -1809,7 +1861,8 @@ int uv_cpu_info(uv_cpu_info_t** ci, int* count) {
         if (fp == NULL)
           continue;
     
    -    fscanf(fp, "%llu", &(*cpus)[cpu].freq);
    +    if (1 != fscanf(fp, "%llu", &(*cpus)[cpu].freq))
    +      abort();
         fclose(fp);
         fp = NULL;
       }
    diff --git a/deps/uv/src/unix/os390.c b/deps/uv/src/unix/os390.c
    index bbd37692d1d0da..1b277292aebffb 100644
    --- a/deps/uv/src/unix/os390.c
    +++ b/deps/uv/src/unix/os390.c
    @@ -19,6 +19,7 @@
      * IN THE SOFTWARE.
      */
     
    +#include "uv.h"
     #include "internal.h"
     #include 
     #include 
    @@ -30,6 +31,7 @@
     #include 
     #include 
     #include "zos-base.h"
    +#include "zos-sys-info.h"
     #if defined(__clang__)
     #include "csrsic.h"
     #else
    @@ -66,9 +68,6 @@
     /* Total number of frames currently on all available frame queues. */
     #define RCEAFC_OFFSET     0x088
     
    -/* CPC model length from the CSRSI Service. */
    -#define CPCMODEL_LENGTH   16
    -
     /* Pointer to the home (current) ASCB. */
     #define PSAAOLD           0x224
     
    @@ -258,9 +257,12 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) {
       idx = 0;
       while (idx < *count) {
         cpu_info->speed = *(int*)(info.siv1v2si22v1.si22v1cpucapability);
    -    cpu_info->model = uv__malloc(CPCMODEL_LENGTH + 1);
    -    memset(cpu_info->model, '\0', CPCMODEL_LENGTH + 1);
    -    memcpy(cpu_info->model, info.siv1v2si11v1.si11v1cpcmodel, CPCMODEL_LENGTH);
    +    cpu_info->model = uv__malloc(ZOSCPU_MODEL_LENGTH + 1);
    +    if (cpu_info->model == NULL) {
    +      uv_free_cpu_info(*cpu_infos, idx);
    +      return UV_ENOMEM; 
    +    }
    +    __get_cpu_model(cpu_info->model, ZOSCPU_MODEL_LENGTH + 1);
         cpu_info->cpu_times.user = cpu_usage_avg;
         /* TODO: implement the following */
         cpu_info->cpu_times.sys = 0;
    diff --git a/deps/uv/src/unix/signal.c b/deps/uv/src/unix/signal.c
    index 63aba5a60e06b9..bc4206e6d864c8 100644
    --- a/deps/uv/src/unix/signal.c
    +++ b/deps/uv/src/unix/signal.c
    @@ -279,6 +279,8 @@ static int uv__signal_loop_once_init(uv_loop_t* loop) {
     
     
     int uv__signal_loop_fork(uv_loop_t* loop) {
    +  struct uv__queue* q;
    +
       if (loop->signal_pipefd[0] == -1)
         return 0;
       uv__io_stop(loop, &loop->signal_io_watcher, POLLIN);
    @@ -286,6 +288,19 @@ int uv__signal_loop_fork(uv_loop_t* loop) {
       uv__close(loop->signal_pipefd[1]);
       loop->signal_pipefd[0] = -1;
       loop->signal_pipefd[1] = -1;
    +
    +  uv__queue_foreach(q, &loop->handle_queue) {
    +    uv_handle_t* handle = uv__queue_data(q, uv_handle_t, handle_queue);
    +    uv_signal_t* sh;
    +
    +    if (handle->type != UV_SIGNAL)
    +      continue;
    +
    +    sh = (uv_signal_t*) handle;
    +    sh->caught_signals = 0;
    +    sh->dispatched_signals = 0;
    +  }
    +
       return uv__signal_loop_once_init(loop);
     }
     
    diff --git a/deps/uv/src/unix/tcp.c b/deps/uv/src/unix/tcp.c
    index d6c848f4610132..a02b6bbf88ef3a 100644
    --- a/deps/uv/src/unix/tcp.c
    +++ b/deps/uv/src/unix/tcp.c
    @@ -27,6 +27,13 @@
     #include 
     #include 
     
    +#include 
    +#include 
    +
    +/* ifaddrs is not implemented on AIX and IBM i PASE */
    +#if !defined(_AIX)
    +#include 
    +#endif
     
     static int maybe_bind_socket(int fd) {
       union uv__sockaddr s;
    @@ -198,11 +205,55 @@ int uv__tcp_bind(uv_tcp_t* tcp,
     }
     
     
    +static int uv__is_ipv6_link_local(const struct sockaddr* addr) {
    +  const struct sockaddr_in6* a6;
    +  uint8_t b[2];
    +
    +  if (addr->sa_family != AF_INET6)
    +    return 0;
    +
    +  a6 = (const struct sockaddr_in6*) addr;
    +  memcpy(b, &a6->sin6_addr, sizeof(b));
    +
    +  return b[0] == 0xFE && b[1] == 0x80;
    +}
    +
    +
    +static int uv__ipv6_link_local_scope_id(void) {
    +/* disable link local on AIX & PASE for now */
    +#if defined(_AIX)
    +  return 0;
    +#else
    +  struct sockaddr_in6* a6;
    +  struct ifaddrs* ifa;
    +  struct ifaddrs* p;
    +  int rv;
    +
    +  if (getifaddrs(&ifa))
    +    return 0;
    +
    +  for (p = ifa; p != NULL; p = p->ifa_next)
    +    if (uv__is_ipv6_link_local(p->ifa_addr))
    +      break;
    +
    +  rv = 0;
    +  if (p != NULL) {
    +    a6 = (struct sockaddr_in6*) p->ifa_addr;
    +    rv = a6->sin6_scope_id;
    +  }
    +
    +  freeifaddrs(ifa);
    +  return rv;
    +#endif
    +}
    +
    +
     int uv__tcp_connect(uv_connect_t* req,
                         uv_tcp_t* handle,
                         const struct sockaddr* addr,
                         unsigned int addrlen,
                         uv_connect_cb cb) {
    +  struct sockaddr_in6 tmp6;
       int err;
       int r;
     
    @@ -220,6 +271,14 @@ int uv__tcp_connect(uv_connect_t* req,
       if (err)
         return err;
     
    +  if (uv__is_ipv6_link_local(addr)) {
    +    memcpy(&tmp6, addr, sizeof(tmp6));
    +    if (tmp6.sin6_scope_id == 0) {
    +      tmp6.sin6_scope_id = uv__ipv6_link_local_scope_id();
    +      addr = (void*) &tmp6;
    +    }
    +  }
    +
       do {
         errno = 0;
         r = connect(uv__stream_fd(handle), addr, addrlen);
    @@ -374,28 +433,39 @@ int uv__tcp_nodelay(int fd, int on) {
     
     
     int uv__tcp_keepalive(int fd, int on, unsigned int delay) {
    +  int intvl;
    +  int cnt;
    +
    +  (void) &intvl;
    +  (void) &cnt;
    +    
       if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on)))
         return UV__ERR(errno);
     
    +  if (!on)
    +    return 0;
    +
     #ifdef TCP_KEEPIDLE
    -  if (on) {
    -    int intvl = 1;  /*  1 second; same as default on Win32 */
    -    int cnt = 10;  /* 10 retries; same as hardcoded on Win32 */
    -    if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &delay, sizeof(delay)))
    -      return UV__ERR(errno);
    -    if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &intvl, sizeof(intvl)))
    -      return UV__ERR(errno);
    -    if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, &cnt, sizeof(cnt)))
    -      return UV__ERR(errno);
    -  }
    +  if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &delay, sizeof(delay)))
    +    return UV__ERR(errno);
    +/* Solaris/SmartOS, if you don't support keep-alive,
    + * then don't advertise it in your system headers...
    + */
    +/* FIXME(bnoordhuis) That's possibly because sizeof(delay) should be 1. */
    +#elif defined(TCP_KEEPALIVE) && !defined(__sun)
    +  if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPALIVE, &delay, sizeof(delay)))
    +    return UV__ERR(errno);
     #endif
     
    -  /* Solaris/SmartOS, if you don't support keep-alive,
    -   * then don't advertise it in your system headers...
    -   */
    -  /* FIXME(bnoordhuis) That's possibly because sizeof(delay) should be 1. */
    -#if defined(TCP_KEEPALIVE) && !defined(__sun)
    -  if (on && setsockopt(fd, IPPROTO_TCP, TCP_KEEPALIVE, &delay, sizeof(delay)))
    +#ifdef TCP_KEEPINTVL
    +  intvl = 1;  /*  1 second; same as default on Win32 */
    +  if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &intvl, sizeof(intvl)))
    +    return UV__ERR(errno);
    +#endif
    +
    +#ifdef TCP_KEEPCNT
    +  cnt = 10;  /* 10 retries; same as hardcoded on Win32 */
    +  if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, &cnt, sizeof(cnt)))
         return UV__ERR(errno);
     #endif
     
    diff --git a/deps/uv/src/unix/thread.c b/deps/uv/src/unix/thread.c
    index 4d6f4b8232ec6d..f05e6fe0f7dd5a 100644
    --- a/deps/uv/src/unix/thread.c
    +++ b/deps/uv/src/unix/thread.c
    @@ -789,11 +789,33 @@ void uv_cond_broadcast(uv_cond_t* cond) {
         abort();
     }
     
    +#if defined(__APPLE__) && defined(__MACH__)
    +
    +void uv_cond_wait(uv_cond_t* cond, uv_mutex_t* mutex) {
    +  int r;
    +
    +  errno = 0;
    +  r = pthread_cond_wait(cond, mutex);
    +
    +  /* Workaround for a bug in OS X at least up to 13.6
    +   * See https://github.com/libuv/libuv/issues/4165
    +   */
    +  if (r == EINVAL)
    +    if (errno == EBUSY)
    +      return;
    +
    +  if (r)
    +    abort();
    +}
    +
    +#else /* !(defined(__APPLE__) && defined(__MACH__)) */
    +
     void uv_cond_wait(uv_cond_t* cond, uv_mutex_t* mutex) {
       if (pthread_cond_wait(cond, mutex))
         abort();
     }
     
    +#endif
     
     int uv_cond_timedwait(uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout) {
       int r;
    diff --git a/deps/uv/src/uv-common.c b/deps/uv/src/uv-common.c
    index 916f3f4e00664a..2200fe3f0a41e2 100644
    --- a/deps/uv/src/uv-common.c
    +++ b/deps/uv/src/uv-common.c
    @@ -559,6 +559,9 @@ static void uv__print_handles(uv_loop_t* loop, int only_active, FILE* stream) {
       if (loop == NULL)
         loop = uv_default_loop();
     
    +  if (stream == NULL)
    +    stream = stderr;
    +
       uv__queue_foreach(q, &loop->handle_queue) {
         h = uv__queue_data(q, uv_handle_t, handle_queue);
     
    diff --git a/deps/uv/src/win/dl.c b/deps/uv/src/win/dl.c
    index 676be4dc7b5b8a..7880c9595be1f6 100644
    --- a/deps/uv/src/win/dl.c
    +++ b/deps/uv/src/win/dl.c
    @@ -27,18 +27,17 @@ static int uv__dlerror(uv_lib_t* lib, const char* filename, DWORD errorno);
     
     int uv_dlopen(const char* filename, uv_lib_t* lib) {
       WCHAR filename_w[32768];
    +  ssize_t r;
     
       lib->handle = NULL;
       lib->errmsg = NULL;
     
    -  if (!MultiByteToWideChar(CP_UTF8,
    -                           0,
    -                           filename,
    -                           -1,
    -                           filename_w,
    -                           ARRAY_SIZE(filename_w))) {
    -    return uv__dlerror(lib, filename, GetLastError());
    -  }
    +  r = uv_wtf8_length_as_utf16(filename);
    +  if (r < 0)
    +    return uv__dlerror(lib, filename, ERROR_NO_UNICODE_TRANSLATION);
    +  if ((size_t) r > ARRAY_SIZE(filename_w))
    +    return uv__dlerror(lib, filename, ERROR_INSUFFICIENT_BUFFER);
    +  uv_wtf8_to_utf16(filename, filename_w, r);
     
       lib->handle = LoadLibraryExW(filename_w, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
       if (lib->handle == NULL) {
    diff --git a/deps/uv/src/win/fs-event.c b/deps/uv/src/win/fs-event.c
    index 6758c7c78bc1d6..4a0ca1f70a22b6 100644
    --- a/deps/uv/src/win/fs-event.c
    +++ b/deps/uv/src/win/fs-event.c
    @@ -157,7 +157,8 @@ int uv_fs_event_start(uv_fs_event_t* handle,
                           uv_fs_event_cb cb,
                           const char* path,
                           unsigned int flags) {
    -  int name_size, is_path_dir, size;
    +  int is_path_dir;
    +  size_t size;
       DWORD attr, last_error;
       WCHAR* dir = NULL, *dir_to_watch, *pathw = NULL;
       DWORD short_path_buffer_len;
    @@ -176,23 +177,9 @@ int uv_fs_event_start(uv_fs_event_t* handle,
     
       uv__handle_start(handle);
     
    -  /* Convert name to UTF16. */
    -
    -  name_size = MultiByteToWideChar(CP_UTF8, 0, path, -1, NULL, 0) *
    -              sizeof(WCHAR);
    -  pathw = (WCHAR*)uv__malloc(name_size);
    -  if (!pathw) {
    -    uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc");
    -  }
    -
    -  if (!MultiByteToWideChar(CP_UTF8,
    -                           0,
    -                           path,
    -                           -1,
    -                           pathw,
    -                           name_size / sizeof(WCHAR))) {
    -    return uv_translate_sys_error(GetLastError());
    -  }
    +  last_error = uv__convert_utf8_to_utf16(path, &pathw);
    +  if (last_error)
    +    goto error_uv;
     
       /* Determine whether path is a file or a directory. */
       attr = GetFileAttributesW(pathw);
    @@ -333,6 +320,9 @@ int uv_fs_event_start(uv_fs_event_t* handle,
       return 0;
     
     error:
    +  last_error = uv_translate_sys_error(last_error);
    +
    +error_uv:
       if (handle->path) {
         uv__free(handle->path);
         handle->path = NULL;
    @@ -365,7 +355,7 @@ int uv_fs_event_start(uv_fs_event_t* handle,
     
       uv__free(short_path);
     
    -  return uv_translate_sys_error(last_error);
    +  return last_error;
     }
     
     
    diff --git a/deps/uv/src/win/fs.c b/deps/uv/src/win/fs.c
    index fc209c54f470ed..99c8a2bf8bf124 100644
    --- a/deps/uv/src/win/fs.c
    +++ b/deps/uv/src/win/fs.c
    @@ -31,13 +31,16 @@
     #include 
     
     #include "uv.h"
    +
    +/*  requires , included via "uv.h" above, but needs to
    +   be included before our "winapi.h", included via "internal.h" below. */
    +#include 
    +
     #include "internal.h"
     #include "req-inl.h"
     #include "handle-inl.h"
     #include "fs-fd-hash-inl.h"
     
    -#include 
    -
     
     #define UV_FS_FREE_PATHS         0x0002
     #define UV_FS_FREE_PTR           0x0008
    @@ -144,279 +147,6 @@ void uv__fs_init(void) {
     }
     
     
    -static int32_t fs__decode_wtf8_char(const char** input) {
    -  uint32_t code_point;
    -  uint8_t b1;
    -  uint8_t b2;
    -  uint8_t b3;
    -  uint8_t b4;
    -
    -  b1 = **input;
    -  if (b1 <= 0x7F)
    -    return b1; /* ASCII code point */
    -  if (b1 < 0xC2)
    -    return -1; /* invalid: continuation byte */
    -  code_point = b1;
    -
    -  b2 = *++*input;
    -  if ((b2 & 0xC0) != 0x80)
    -    return -1; /* invalid: not a continuation byte */
    -  code_point = (code_point << 6) | (b2 & 0x3F);
    -  if (b1 <= 0xDF)
    -    return 0x7FF & code_point; /* two-byte character */
    -
    -  b3 = *++*input;
    -  if ((b3 & 0xC0) != 0x80)
    -    return -1; /* invalid: not a continuation byte */
    -  code_point = (code_point << 6) | (b3 & 0x3F);
    -  if (b1 <= 0xEF)
    -    return 0xFFFF & code_point; /* three-byte character */
    -
    -  b4 = *++*input;
    -  if ((b4 & 0xC0) != 0x80)
    -    return -1; /* invalid: not a continuation byte */
    -  code_point = (code_point << 6) | (b4 & 0x3F);
    -  if (b1 <= 0xF4)
    -    if (code_point <= 0x10FFFF)
    -      return code_point; /* four-byte character */
    -
    -  /* code point too large */
    -  return -1;
    -}
    -
    -
    -static ssize_t fs__get_length_wtf8(const char* source_ptr) {
    -  size_t w_target_len = 0;
    -  int32_t code_point;
    -
    -  do {
    -    code_point = fs__decode_wtf8_char(&source_ptr);
    -    if (code_point < 0)
    -      return -1;
    -    if (code_point > 0xFFFF)
    -      w_target_len++;
    -    w_target_len++;
    -  } while (*source_ptr++);
    -  return w_target_len;
    -}
    -
    -
    -static void fs__wtf8_to_wide(const char* source_ptr, WCHAR* w_target) {
    -  int32_t code_point;
    -
    -  do {
    -    code_point = fs__decode_wtf8_char(&source_ptr);
    -    /* fs__get_length_wtf8 should have been called and checked first. */
    -    assert(code_point >= 0);
    -    if (code_point > 0x10000) {
    -      assert(code_point < 0x10FFFF);
    -      *w_target++ = (((code_point - 0x10000) >> 10) + 0xD800);
    -      *w_target++ = ((code_point - 0x10000) & 0x3FF) + 0xDC00;
    -    } else {
    -      *w_target++ = code_point;
    -    }
    -  } while (*source_ptr++);
    -}
    -
    -
    -INLINE static int fs__capture_path(uv_fs_t* req, const char* path,
    -    const char* new_path, const int copy_path) {
    -  WCHAR* buf;
    -  WCHAR* pos;
    -  size_t buf_sz = 0;
    -  size_t path_len = 0;
    -  ssize_t pathw_len = 0;
    -  ssize_t new_pathw_len = 0;
    -
    -  /* new_path can only be set if path is also set. */
    -  assert(new_path == NULL || path != NULL);
    -
    -  if (path != NULL) {
    -    pathw_len = fs__get_length_wtf8(path);
    -    if (pathw_len < 0)
    -      return ERROR_INVALID_NAME;
    -    buf_sz += pathw_len * sizeof(WCHAR);
    -  }
    -
    -  if (path != NULL && copy_path) {
    -    path_len = 1 + strlen(path);
    -    buf_sz += path_len;
    -  }
    -
    -  if (new_path != NULL) {
    -    new_pathw_len = fs__get_length_wtf8(new_path);
    -    if (new_pathw_len < 0)
    -      return ERROR_INVALID_NAME;
    -    buf_sz += new_pathw_len * sizeof(WCHAR);
    -  }
    -
    -
    -  if (buf_sz == 0) {
    -    req->file.pathw = NULL;
    -    req->fs.info.new_pathw = NULL;
    -    req->path = NULL;
    -    return 0;
    -  }
    -
    -  buf = uv__malloc(buf_sz);
    -  if (buf == NULL) {
    -    return ERROR_OUTOFMEMORY;
    -  }
    -
    -  pos = buf;
    -
    -  if (path != NULL) {
    -    fs__wtf8_to_wide(path, pos);
    -    req->file.pathw = pos;
    -    pos += pathw_len;
    -  } else {
    -    req->file.pathw = NULL;
    -  }
    -
    -  if (new_path != NULL) {
    -    fs__wtf8_to_wide(new_path, pos);
    -    req->fs.info.new_pathw = pos;
    -    pos += new_pathw_len;
    -  } else {
    -    req->fs.info.new_pathw = NULL;
    -  }
    -
    -  req->path = path;
    -  if (path != NULL && copy_path) {
    -    memcpy(pos, path, path_len);
    -    assert(path_len == buf_sz - (pos - buf) * sizeof(WCHAR));
    -    req->path = (char*) pos;
    -  }
    -
    -  req->flags |= UV_FS_FREE_PATHS;
    -
    -  return 0;
    -}
    -
    -
    -
    -INLINE static void uv__fs_req_init(uv_loop_t* loop, uv_fs_t* req,
    -    uv_fs_type fs_type, const uv_fs_cb cb) {
    -  uv__once_init();
    -  UV_REQ_INIT(req, UV_FS);
    -  req->loop = loop;
    -  req->flags = 0;
    -  req->fs_type = fs_type;
    -  req->sys_errno_ = 0;
    -  req->result = 0;
    -  req->ptr = NULL;
    -  req->path = NULL;
    -  req->cb = cb;
    -  memset(&req->fs, 0, sizeof(req->fs));
    -}
    -
    -
    -static int32_t fs__get_surrogate_value(const WCHAR* w_source_ptr,
    -                                       size_t w_source_len) {
    -  WCHAR u;
    -  WCHAR next;
    -
    -  u = w_source_ptr[0];
    -  if (u >= 0xD800 && u <= 0xDBFF && w_source_len > 1) {
    -    next = w_source_ptr[1];
    -    if (next >= 0xDC00 && next <= 0xDFFF)
    -      return 0x10000 + ((u - 0xD800) << 10) + (next - 0xDC00);
    -  }
    -  return u;
    -}
    -
    -
    -static size_t fs__get_length_wide(const WCHAR* w_source_ptr,
    -                                  size_t w_source_len) {
    -  size_t target_len;
    -  int32_t code_point;
    -
    -  target_len = 0;
    -  for (; w_source_len; w_source_len--, w_source_ptr++) {
    -    code_point = fs__get_surrogate_value(w_source_ptr, w_source_len);
    -    /* Can be invalid UTF-8 but must be valid WTF-8. */
    -    assert(code_point >= 0);
    -    if (code_point < 0x80)
    -      target_len += 1;
    -    else if (code_point < 0x800)
    -      target_len += 2;
    -    else if (code_point < 0x10000)
    -      target_len += 3;
    -    else {
    -      target_len += 4;
    -      w_source_ptr++;
    -      w_source_len--;
    -    }
    -  }
    -  return target_len;
    -}
    -
    -
    -static int fs__wide_to_wtf8(WCHAR* w_source_ptr,
    -                            size_t w_source_len,
    -                            char** target_ptr,
    -                            size_t* target_len_ptr) {
    -  size_t target_len;
    -  char* target;
    -  int32_t code_point;
    -
    -  /* If *target_ptr is provided, then *target_len_ptr must be its length
    -   * (excluding space for null), otherwise we will compute the target_len_ptr
    -   * length and may return a new allocation in *target_ptr if target_ptr is
    -   * provided. */
    -  if (target_ptr == NULL || *target_ptr == NULL) {
    -    target_len = fs__get_length_wide(w_source_ptr, w_source_len);
    -    if (target_len_ptr != NULL)
    -      *target_len_ptr = target_len;
    -  } else {
    -    target_len = *target_len_ptr;
    -  }
    -
    -  if (target_ptr == NULL)
    -    return 0;
    -
    -  if (*target_ptr == NULL) {
    -    target = uv__malloc(target_len + 1);
    -    if (target == NULL) {
    -      SetLastError(ERROR_OUTOFMEMORY);
    -      return -1;
    -    }
    -    *target_ptr = target;
    -  } else {
    -    target = *target_ptr;
    -  }
    -
    -  for (; w_source_len; w_source_len--, w_source_ptr++) {
    -    code_point = fs__get_surrogate_value(w_source_ptr, w_source_len);
    -    /* Can be invalid UTF-8 but must be valid WTF-8. */
    -    assert(code_point >= 0);
    -
    -    if (code_point < 0x80) {
    -      *target++ = code_point;
    -    } else if (code_point < 0x800) {
    -      *target++ = 0xC0 | (code_point >> 6);
    -      *target++ = 0x80 | (code_point & 0x3F);
    -    } else if (code_point < 0x10000) {
    -      *target++ = 0xE0 | (code_point >> 12);
    -      *target++ = 0x80 | ((code_point >> 6) & 0x3F);
    -      *target++ = 0x80 | (code_point & 0x3F);
    -    } else {
    -      *target++ = 0xF0 | (code_point >> 18);
    -      *target++ = 0x80 | ((code_point >> 12) & 0x3F);
    -      *target++ = 0x80 | ((code_point >> 6) & 0x3F);
    -      *target++ = 0x80 | (code_point & 0x3F);
    -      w_source_ptr++;
    -      w_source_len--;
    -    }
    -  }
    -  assert((size_t) (target - *target_ptr) == target_len);
    -
    -  *target++ = '\0';
    -
    -  return 0;
    -}
    -
    -
     INLINE static int fs__readlink_handle(HANDLE handle,
                                           char** target_ptr,
                                           size_t* target_len_ptr) {
    @@ -550,7 +280,98 @@ INLINE static int fs__readlink_handle(HANDLE handle,
       }
     
       assert(target_ptr == NULL || *target_ptr == NULL);
    -  return fs__wide_to_wtf8(w_target, w_target_len, target_ptr, target_len_ptr);
    +  return uv_utf16_to_wtf8(w_target, w_target_len, target_ptr, target_len_ptr);
    +}
    +
    +
    +INLINE static int fs__capture_path(uv_fs_t* req, const char* path,
    +    const char* new_path, const int copy_path) {
    +  WCHAR* buf;
    +  WCHAR* pos;
    +  size_t buf_sz = 0;
    +  size_t path_len = 0;
    +  ssize_t pathw_len = 0;
    +  ssize_t new_pathw_len = 0;
    +
    +  /* new_path can only be set if path is also set. */
    +  assert(new_path == NULL || path != NULL);
    +
    +  if (path != NULL) {
    +    pathw_len = uv_wtf8_length_as_utf16(path);
    +    if (pathw_len < 0)
    +      return ERROR_INVALID_NAME;
    +    buf_sz += pathw_len * sizeof(WCHAR);
    +  }
    +
    +  if (path != NULL && copy_path) {
    +    path_len = 1 + strlen(path);
    +    buf_sz += path_len;
    +  }
    +
    +  if (new_path != NULL) {
    +    new_pathw_len = uv_wtf8_length_as_utf16(new_path);
    +    if (new_pathw_len < 0)
    +      return ERROR_INVALID_NAME;
    +    buf_sz += new_pathw_len * sizeof(WCHAR);
    +  }
    +
    +
    +  if (buf_sz == 0) {
    +    req->file.pathw = NULL;
    +    req->fs.info.new_pathw = NULL;
    +    req->path = NULL;
    +    return 0;
    +  }
    +
    +  buf = uv__malloc(buf_sz);
    +  if (buf == NULL) {
    +    return ERROR_OUTOFMEMORY;
    +  }
    +
    +  pos = buf;
    +
    +  if (path != NULL) {
    +    uv_wtf8_to_utf16(path, pos, pathw_len);
    +    req->file.pathw = pos;
    +    pos += pathw_len;
    +  } else {
    +    req->file.pathw = NULL;
    +  }
    +
    +  if (new_path != NULL) {
    +    uv_wtf8_to_utf16(new_path, pos, new_pathw_len);
    +    req->fs.info.new_pathw = pos;
    +    pos += new_pathw_len;
    +  } else {
    +    req->fs.info.new_pathw = NULL;
    +  }
    +
    +  req->path = path;
    +  if (path != NULL && copy_path) {
    +    memcpy(pos, path, path_len);
    +    assert(path_len == buf_sz - (pos - buf) * sizeof(WCHAR));
    +    req->path = (char*) pos;
    +  }
    +
    +  req->flags |= UV_FS_FREE_PATHS;
    +
    +  return 0;
    +}
    +
    +
    +INLINE static void uv__fs_req_init(uv_loop_t* loop, uv_fs_t* req,
    +    uv_fs_type fs_type, const uv_fs_cb cb) {
    +  uv__once_init();
    +  UV_REQ_INIT(req, UV_FS);
    +  req->loop = loop;
    +  req->flags = 0;
    +  req->fs_type = fs_type;
    +  req->sys_errno_ = 0;
    +  req->result = 0;
    +  req->ptr = NULL;
    +  req->path = NULL;
    +  req->cb = cb;
    +  memset(&req->fs, 0, sizeof(req->fs));
     }
     
     
    @@ -1569,7 +1390,7 @@ void fs__scandir(uv_fs_t* req) {
             continue;
     
           /* Compute the space required to store the filename as WTF-8. */
    -      wtf8_len = fs__get_length_wide(&info->FileName[0], wchar_len);
    +      wtf8_len = uv_utf16_length_as_wtf8(&info->FileName[0], wchar_len);
     
           /* Resize the dirent array if needed. */
           if (dirents_used >= dirents_size) {
    @@ -1597,8 +1418,8 @@ void fs__scandir(uv_fs_t* req) {
     
           /* Convert file name to UTF-8. */
           wtf8 = &dirent->d_name[0];
    -      if (fs__wide_to_wtf8(&info->FileName[0], wchar_len, &wtf8, &wtf8_len) == -1)
    -        goto win32_error;
    +      if (uv_utf16_to_wtf8(&info->FileName[0], wchar_len, &wtf8, &wtf8_len) != 0)
    +        goto out_of_memory_error;
     
           /* Fill out the type field. */
           if (info->FileAttributes & FILE_ATTRIBUTE_DEVICE)
    @@ -2824,7 +2645,7 @@ static ssize_t fs__realpath_handle(HANDLE handle, char** realpath_ptr) {
       }
     
       assert(*realpath_ptr == NULL);
    -  r = fs__wide_to_wtf8(w_realpath_ptr, w_realpath_len, realpath_ptr, NULL);
    +  r = uv_utf16_to_wtf8(w_realpath_ptr, w_realpath_len, realpath_ptr, NULL);
       uv__free(w_realpath_buf);
       return r;
     }
    diff --git a/deps/uv/src/win/getaddrinfo.c b/deps/uv/src/win/getaddrinfo.c
    index dfab860a735e47..8b8406ada8e743 100644
    --- a/deps/uv/src/win/getaddrinfo.c
    +++ b/deps/uv/src/win/getaddrinfo.c
    @@ -104,13 +104,14 @@ static void uv__getaddrinfo_work(struct uv__work* w) {
      */
     static void uv__getaddrinfo_done(struct uv__work* w, int status) {
       uv_getaddrinfo_t* req;
    -  int addrinfo_len = 0;
    -  int name_len = 0;
    +  size_t addrinfo_len = 0;
    +  ssize_t name_len = 0;
       size_t addrinfo_struct_len = ALIGNED_SIZE(sizeof(struct addrinfo));
       struct addrinfoW* addrinfow_ptr;
       struct addrinfo* addrinfo_ptr;
       char* alloc_ptr = NULL;
       char* cur_ptr = NULL;
    +  int r;
     
       req = container_of(w, uv_getaddrinfo_t, work_req);
     
    @@ -131,19 +132,12 @@ static void uv__getaddrinfo_done(struct uv__work* w, int status) {
           addrinfo_len += addrinfo_struct_len +
               ALIGNED_SIZE(addrinfow_ptr->ai_addrlen);
           if (addrinfow_ptr->ai_canonname != NULL) {
    -        name_len = WideCharToMultiByte(CP_UTF8,
    -                                       0,
    -                                       addrinfow_ptr->ai_canonname,
    -                                       -1,
    -                                       NULL,
    -                                       0,
    -                                       NULL,
    -                                       NULL);
    -        if (name_len == 0) {
    -          req->retcode = uv_translate_sys_error(GetLastError());
    +        name_len = uv_utf16_length_as_wtf8(addrinfow_ptr->ai_canonname, -1);
    +        if (name_len < 0) {
    +          req->retcode = name_len;
               goto complete;
             }
    -        addrinfo_len += ALIGNED_SIZE(name_len);
    +        addrinfo_len += ALIGNED_SIZE(name_len + 1);
           }
           addrinfow_ptr = addrinfow_ptr->ai_next;
         }
    @@ -182,27 +176,14 @@ static void uv__getaddrinfo_done(struct uv__work* w, int status) {
     
             /* convert canonical name to UTF-8 */
             if (addrinfow_ptr->ai_canonname != NULL) {
    -          name_len = WideCharToMultiByte(CP_UTF8,
    -                                         0,
    -                                         addrinfow_ptr->ai_canonname,
    -                                         -1,
    -                                         NULL,
    -                                         0,
    -                                         NULL,
    -                                         NULL);
    -          assert(name_len > 0);
    -          assert(cur_ptr + name_len <= alloc_ptr + addrinfo_len);
    -          name_len = WideCharToMultiByte(CP_UTF8,
    -                                         0,
    -                                         addrinfow_ptr->ai_canonname,
    -                                         -1,
    -                                         cur_ptr,
    -                                         name_len,
    -                                         NULL,
    -                                         NULL);
    -          assert(name_len > 0);
    +          name_len = alloc_ptr + addrinfo_len - cur_ptr;
    +          r = uv__copy_utf16_to_utf8(addrinfow_ptr->ai_canonname,
    +                                     -1,
    +                                     cur_ptr,
    +                                     (size_t*)&name_len);
    +          assert(r == 0);
               addrinfo_ptr->ai_canonname = cur_ptr;
    -          cur_ptr += ALIGNED_SIZE(name_len);
    +          cur_ptr += ALIGNED_SIZE(name_len + 1);
             }
             assert(cur_ptr <= alloc_ptr + addrinfo_len);
     
    @@ -261,12 +242,11 @@ int uv_getaddrinfo(uv_loop_t* loop,
                        const char* service,
                        const struct addrinfo* hints) {
       char hostname_ascii[256];
    -  int nodesize = 0;
    -  int servicesize = 0;
    -  int hintssize = 0;
    +  size_t nodesize = 0;
    +  size_t servicesize = 0;
    +  size_t hintssize = 0;
       char* alloc_ptr = NULL;
    -  int err;
    -  long rc;
    +  ssize_t rc;
     
       if (req == NULL || (node == NULL && service == NULL)) {
         return UV_EINVAL;
    @@ -286,56 +266,36 @@ int uv_getaddrinfo(uv_loop_t* loop,
                               hostname_ascii + sizeof(hostname_ascii));
         if (rc < 0)
           return rc;
    -    nodesize = ALIGNED_SIZE(MultiByteToWideChar(CP_UTF8, 0, hostname_ascii,
    -                                                -1, NULL, 0) * sizeof(WCHAR));
    -    if (nodesize == 0) {
    -      err = GetLastError();
    -      goto error;
    -    }
    +    nodesize = strlen(hostname_ascii) + 1;
         node = hostname_ascii;
       }
     
       if (service != NULL) {
    -    servicesize = ALIGNED_SIZE(MultiByteToWideChar(CP_UTF8,
    -                                                   0,
    -                                                   service,
    -                                                   -1,
    -                                                   NULL,
    -                                                   0) *
    -                               sizeof(WCHAR));
    -    if (servicesize == 0) {
    -      err = GetLastError();
    -      goto error;
    -    }
    +    rc = uv_wtf8_length_as_utf16(service);
    +    if (rc < 0)
    +       return rc;
    +    servicesize = rc;
       }
       if (hints != NULL) {
         hintssize = ALIGNED_SIZE(sizeof(struct addrinfoW));
       }
     
       /* allocate memory for inputs, and partition it as needed */
    -  alloc_ptr = (char*)uv__malloc(nodesize + servicesize + hintssize);
    -  if (!alloc_ptr) {
    -    err = WSAENOBUFS;
    -    goto error;
    -  }
    +  alloc_ptr = uv__malloc(ALIGNED_SIZE(nodesize * sizeof(WCHAR)) +
    +                         ALIGNED_SIZE(servicesize * sizeof(WCHAR)) +
    +                         hintssize);
    +  if (!alloc_ptr)
    +    return UV_ENOMEM;
     
       /* save alloc_ptr now so we can free if error */
    -  req->alloc = (void*)alloc_ptr;
    +  req->alloc = (void*) alloc_ptr;
     
       /* Convert node string to UTF16 into allocated memory and save pointer in the
    -   * request. */
    +   * request. The node here has been converted to ascii. */
       if (node != NULL) {
    -    req->node = (WCHAR*)alloc_ptr;
    -    if (MultiByteToWideChar(CP_UTF8,
    -                            0,
    -                            node,
    -                            -1,
    -                            (WCHAR*) alloc_ptr,
    -                            nodesize / sizeof(WCHAR)) == 0) {
    -      err = GetLastError();
    -      goto error;
    -    }
    -    alloc_ptr += nodesize;
    +    req->node = (WCHAR*) alloc_ptr;
    +    uv_wtf8_to_utf16(node, (WCHAR*) alloc_ptr, nodesize);
    +    alloc_ptr += ALIGNED_SIZE(nodesize * sizeof(WCHAR));
       } else {
         req->node = NULL;
       }
    @@ -343,24 +303,16 @@ int uv_getaddrinfo(uv_loop_t* loop,
       /* Convert service string to UTF16 into allocated memory and save pointer in
        * the req. */
       if (service != NULL) {
    -    req->service = (WCHAR*)alloc_ptr;
    -    if (MultiByteToWideChar(CP_UTF8,
    -                            0,
    -                            service,
    -                            -1,
    -                            (WCHAR*) alloc_ptr,
    -                            servicesize / sizeof(WCHAR)) == 0) {
    -      err = GetLastError();
    -      goto error;
    -    }
    -    alloc_ptr += servicesize;
    +    req->service = (WCHAR*) alloc_ptr;
    +    uv_wtf8_to_utf16(service, (WCHAR*) alloc_ptr, servicesize);
    +    alloc_ptr += ALIGNED_SIZE(servicesize * sizeof(WCHAR));
       } else {
         req->service = NULL;
       }
     
       /* copy hints to allocated memory and save pointer in req */
       if (hints != NULL) {
    -    req->addrinfow = (struct addrinfoW*)alloc_ptr;
    +    req->addrinfow = (struct addrinfoW*) alloc_ptr;
         req->addrinfow->ai_family = hints->ai_family;
         req->addrinfow->ai_socktype = hints->ai_socktype;
         req->addrinfow->ai_protocol = hints->ai_protocol;
    @@ -387,19 +339,11 @@ int uv_getaddrinfo(uv_loop_t* loop,
         uv__getaddrinfo_done(&req->work_req, 0);
         return req->retcode;
       }
    -
    -error:
    -  if (req != NULL) {
    -    uv__free(req->alloc);
    -    req->alloc = NULL;
    -  }
    -  return uv_translate_sys_error(err);
     }
     
     int uv_if_indextoname(unsigned int ifindex, char* buffer, size_t* size) {
       NET_LUID luid;
       wchar_t wname[NDIS_IF_MAX_STRING_SIZE + 1]; /* Add one for the NUL. */
    -  DWORD bufsize;
       int r;
     
       if (buffer == NULL || size == NULL || *size == 0)
    @@ -415,31 +359,7 @@ int uv_if_indextoname(unsigned int ifindex, char* buffer, size_t* size) {
       if (r != 0)
         return uv_translate_sys_error(r);
     
    -  /* Check how much space we need */
    -  bufsize = WideCharToMultiByte(CP_UTF8, 0, wname, -1, NULL, 0, NULL, NULL);
    -
    -  if (bufsize == 0) {
    -    return uv_translate_sys_error(GetLastError());
    -  } else if (bufsize > *size) {
    -    *size = bufsize;
    -    return UV_ENOBUFS;
    -  }
    -
    -  /* Convert to UTF-8 */
    -  bufsize = WideCharToMultiByte(CP_UTF8,
    -                                0,
    -                                wname,
    -                                -1,
    -                                buffer,
    -                                *size,
    -                                NULL,
    -                                NULL);
    -
    -  if (bufsize == 0)
    -    return uv_translate_sys_error(GetLastError());
    -
    -  *size = bufsize - 1;
    -  return 0;
    +  return uv__copy_utf16_to_utf8(wname, -1, buffer, size);
     }
     
     int uv_if_indextoiid(unsigned int ifindex, char* buffer, size_t* size) {
    diff --git a/deps/uv/src/win/getnameinfo.c b/deps/uv/src/win/getnameinfo.c
    index b3773380c21d70..32863176ef6403 100644
    --- a/deps/uv/src/win/getnameinfo.c
    +++ b/deps/uv/src/win/getnameinfo.c
    @@ -42,6 +42,7 @@ static void uv__getnameinfo_work(struct uv__work* w) {
       uv_getnameinfo_t* req;
       WCHAR host[NI_MAXHOST];
       WCHAR service[NI_MAXSERV];
    +  size_t size;
       int ret;
     
       req = container_of(w, uv_getnameinfo_t, work_req);
    @@ -57,29 +58,17 @@ static void uv__getnameinfo_work(struct uv__work* w) {
         return;
       }
     
    -  ret = WideCharToMultiByte(CP_UTF8,
    -                            0,
    -                            host,
    -                            -1,
    -                            req->host,
    -                            sizeof(req->host),
    -                            NULL,
    -                            NULL);
    -  if (ret == 0) {
    -    req->retcode = uv_translate_sys_error(GetLastError());
    +  size = sizeof(req->host);
    +  ret = uv__copy_utf16_to_utf8(host, -1, req->host, &size);
    +  if (ret < 0) {
    +    req->retcode = ret;
         return;
       }
     
    -  ret = WideCharToMultiByte(CP_UTF8,
    -                            0,
    -                            service,
    -                            -1,
    -                            req->service,
    -                            sizeof(req->service),
    -                            NULL,
    -                            NULL);
    -  if (ret == 0) {
    -    req->retcode = uv_translate_sys_error(GetLastError());
    +  size = sizeof(req->service);
    +  ret = uv__copy_utf16_to_utf8(service, -1, req->service, &size);
    +  if (ret < 0) {
    +    req->retcode = ret;
       }
     }
     
    diff --git a/deps/uv/src/win/internal.h b/deps/uv/src/win/internal.h
    index 9672fbc6826397..867dea5e0ed34f 100644
    --- a/deps/uv/src/win/internal.h
    +++ b/deps/uv/src/win/internal.h
    @@ -257,8 +257,9 @@ void uv__util_init(void);
     
     uint64_t uv__hrtime(unsigned int scale);
     __declspec(noreturn) void uv_fatal_error(const int errorno, const char* syscall);
    -int uv__convert_utf16_to_utf8(const WCHAR* utf16, int utf16len, char** utf8);
    -int uv__convert_utf8_to_utf16(const char* utf8, int utf8len, WCHAR** utf16);
    +int uv__convert_utf16_to_utf8(const WCHAR* utf16, size_t utf16len, char** utf8);
    +int uv__copy_utf16_to_utf8(const WCHAR* utf16, size_t utf16len, char* utf8, size_t *size);
    +int uv__convert_utf8_to_utf16(const char* utf8, WCHAR** utf16);
     
     typedef int (WINAPI *uv__peersockfunc)(SOCKET, struct sockaddr*, int*);
     
    diff --git a/deps/uv/src/win/pipe.c b/deps/uv/src/win/pipe.c
    index f0cac3822564e1..cec72ff750b5a1 100644
    --- a/deps/uv/src/win/pipe.c
    +++ b/deps/uv/src/win/pipe.c
    @@ -49,7 +49,7 @@ static const int default_pending_pipe_instances = 4;
     
     /* Pipe prefix */
     static char pipe_prefix[] = "\\\\?\\pipe";
    -static const int pipe_prefix_len = sizeof(pipe_prefix) - 1;
    +static const size_t pipe_prefix_len = sizeof(pipe_prefix) - 1;
     
     /* IPC incoming xfer queue item. */
     typedef struct {
    @@ -703,7 +703,7 @@ int uv_pipe_bind2(uv_pipe_t* handle,
                       size_t namelen,
                       unsigned int flags) {
       uv_loop_t* loop = handle->loop;
    -  int i, err, nameSize;
    +  int i, err;
       uv_pipe_accept_t* req;
     
       if (flags & ~UV_PIPE_NO_TRUNCATE) {
    @@ -742,9 +742,8 @@ int uv_pipe_bind2(uv_pipe_t* handle,
     
       handle->pipe.serv.accept_reqs = (uv_pipe_accept_t*)
         uv__malloc(sizeof(uv_pipe_accept_t) * handle->pipe.serv.pending_instances);
    -  if (!handle->pipe.serv.accept_reqs) {
    -    uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc");
    -  }
    +  if (!handle->pipe.serv.accept_reqs)
    +    return UV_ENOMEM;
     
       for (i = 0; i < handle->pipe.serv.pending_instances; i++) {
         req = &handle->pipe.serv.accept_reqs[i];
    @@ -754,22 +753,9 @@ int uv_pipe_bind2(uv_pipe_t* handle,
         req->next_pending = NULL;
       }
     
    -  /* Convert name to UTF16. */
    -  nameSize = MultiByteToWideChar(CP_UTF8, 0, name, -1, NULL, 0) * sizeof(WCHAR);
    -  handle->name = uv__malloc(nameSize);
    -  if (!handle->name) {
    -    uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc");
    -  }
    -
    -  if (!MultiByteToWideChar(CP_UTF8,
    -                           0,
    -                           name,
    -                           -1,
    -                           handle->name,
    -                           nameSize / sizeof(WCHAR))) {
    -    err = GetLastError();
    -    goto error;
    -  }
    +  err = uv__convert_utf8_to_utf16(name, &handle->name);
    +  if (err)
    +    return err;
     
       /*
        * Attempt to create the first pipe with FILE_FLAG_FIRST_PIPE_INSTANCE.
    @@ -795,10 +781,8 @@ int uv_pipe_bind2(uv_pipe_t* handle,
       return 0;
     
     error:
    -  if (handle->name) {
    -    uv__free(handle->name);
    -    handle->name = NULL;
    -  }
    +  uv__free(handle->name);
    +  handle->name = NULL;
     
       return uv_translate_sys_error(err);
     }
    @@ -861,7 +845,8 @@ int uv_pipe_connect2(uv_connect_t* req,
                          unsigned int flags,
                          uv_connect_cb cb) {
       uv_loop_t* loop = handle->loop;
    -  int err, nameSize;
    +  int err;
    +  size_t nameSize;
       HANDLE pipeHandle = INVALID_HANDLE_VALUE;
       DWORD duplex_flags;
     
    @@ -904,26 +889,16 @@ int uv_pipe_connect2(uv_connect_t* req,
       }
       uv__pipe_connection_init(handle);
     
    -  /* Convert name to UTF16. */
    -  nameSize = MultiByteToWideChar(CP_UTF8, 0, name, -1, NULL, 0) * sizeof(WCHAR);
    -  handle->name = uv__malloc(nameSize);
    -  if (!handle->name) {
    -    uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc");
    -  }
    -
    -  if (!MultiByteToWideChar(CP_UTF8,
    -                           0,
    -                           name,
    -                           -1,
    -                           handle->name,
    -                           nameSize / sizeof(WCHAR))) {
    -    err = GetLastError();
    +  err = uv__convert_utf8_to_utf16(name, &handle->name);
    +  if (err) {
    +    err = ERROR_NO_UNICODE_TRANSLATION;
         goto error;
       }
     
       pipeHandle = open_named_pipe(handle->name, &duplex_flags);
       if (pipeHandle == INVALID_HANDLE_VALUE) {
         if (GetLastError() == ERROR_PIPE_BUSY) {
    +      nameSize = (wcslen(handle->name) + 1) * sizeof(WCHAR);
           req->u.connect.name = uv__malloc(nameSize);
           if (!req->u.connect.name) {
             uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc");
    @@ -2439,7 +2414,6 @@ static int uv__pipe_getname(const uv_pipe_t* handle, char* buffer, size_t* size)
       FILE_NAME_INFORMATION tmp_name_info;
       FILE_NAME_INFORMATION* name_info;
       WCHAR* name_buf;
    -  unsigned int addrlen;
       unsigned int name_size;
       unsigned int name_len;
       int err;
    @@ -2450,46 +2424,7 @@ static int uv__pipe_getname(const uv_pipe_t* handle, char* buffer, size_t* size)
       if (handle->name != NULL) {
         /* The user might try to query the name before we are connected,
          * and this is just easier to return the cached value if we have it. */
    -    name_buf = handle->name;
    -    name_len = wcslen(name_buf);
    -
    -    /* check how much space we need */
    -    addrlen = WideCharToMultiByte(CP_UTF8,
    -                                  0,
    -                                  name_buf,
    -                                  name_len,
    -                                  NULL,
    -                                  0,
    -                                  NULL,
    -                                  NULL);
    -    if (!addrlen) {
    -      *size = 0;
    -      err = uv_translate_sys_error(GetLastError());
    -      return err;
    -    } else if (addrlen >= *size) {
    -      *size = addrlen + 1;
    -      err = UV_ENOBUFS;
    -      goto error;
    -    }
    -
    -    addrlen = WideCharToMultiByte(CP_UTF8,
    -                                  0,
    -                                  name_buf,
    -                                  name_len,
    -                                  buffer,
    -                                  addrlen,
    -                                  NULL,
    -                                  NULL);
    -    if (!addrlen) {
    -      *size = 0;
    -      err = uv_translate_sys_error(GetLastError());
    -      return err;
    -    }
    -
    -    *size = addrlen;
    -    buffer[addrlen] = '\0';
    -
    -    return 0;
    +    return uv__copy_utf16_to_utf8(handle->name, -1, buffer, size);
       }
     
       if (handle->handle == INVALID_HANDLE_VALUE) {
    @@ -2517,8 +2452,7 @@ static int uv__pipe_getname(const uv_pipe_t* handle, char* buffer, size_t* size)
         name_info = uv__malloc(name_size);
         if (!name_info) {
           *size = 0;
    -      err = UV_ENOMEM;
    -      goto cleanup;
    +      return UV_ENOMEM;
         }
     
         nt_status = pNtQueryInformationFile(handle->handle,
    @@ -2551,51 +2485,19 @@ static int uv__pipe_getname(const uv_pipe_t* handle, char* buffer, size_t* size)
     
       name_len /= sizeof(WCHAR);
     
    -  /* check how much space we need */
    -  addrlen = WideCharToMultiByte(CP_UTF8,
    -                                0,
    -                                name_buf,
    -                                name_len,
    -                                NULL,
    -                                0,
    -                                NULL,
    -                                NULL);
    -  if (!addrlen) {
    +  /* "\\\\.\\pipe" + name */
    +  if (*size < pipe_prefix_len) {
         *size = 0;
    -    err = uv_translate_sys_error(GetLastError());
    -    goto error;
    -  } else if (pipe_prefix_len + addrlen >= *size) {
    -    /* "\\\\.\\pipe" + name */
    -    *size = pipe_prefix_len + addrlen + 1;
    -    err = UV_ENOBUFS;
    -    goto error;
       }
    -
    -  memcpy(buffer, pipe_prefix, pipe_prefix_len);
    -  addrlen = WideCharToMultiByte(CP_UTF8,
    -                                0,
    -                                name_buf,
    -                                name_len,
    -                                buffer+pipe_prefix_len,
    -                                *size-pipe_prefix_len,
    -                                NULL,
    -                                NULL);
    -  if (!addrlen) {
    -    *size = 0;
    -    err = uv_translate_sys_error(GetLastError());
    -    goto error;
    +  else {
    +    memcpy(buffer, pipe_prefix, pipe_prefix_len);
    +    *size -= pipe_prefix_len;
       }
    -
    -  addrlen += pipe_prefix_len;
    -  *size = addrlen;
    -  buffer[addrlen] = '\0';
    -
    -  err = 0;
    +  err = uv__copy_utf16_to_utf8(name_buf, name_len, buffer+pipe_prefix_len, size);
    +  *size += pipe_prefix_len;
     
     error:
       uv__free(name_info);
    -
    -cleanup:
       return err;
     }
     
    diff --git a/deps/uv/src/win/process.c b/deps/uv/src/win/process.c
    index 3e451e2291d6ed..43059858f3112e 100644
    --- a/deps/uv/src/win/process.c
    +++ b/deps/uv/src/win/process.c
    @@ -105,38 +105,26 @@ static void uv__init_global_job_handle(void) {
                                    &info,
                                    sizeof info))
         uv_fatal_error(GetLastError(), "SetInformationJobObject");
    -}
    -
     
    -static int uv__utf8_to_utf16_alloc(const char* s, WCHAR** ws_ptr) {
    -  int ws_len, r;
    -  WCHAR* ws;
    -
    -  ws_len = MultiByteToWideChar(CP_UTF8,
    -                               0,
    -                               s,
    -                               -1,
    -                               NULL,
    -                               0);
    -  if (ws_len <= 0) {
    -    return GetLastError();
    -  }
     
    -  ws = (WCHAR*) uv__malloc(ws_len * sizeof(WCHAR));
    -  if (ws == NULL) {
    -    return ERROR_OUTOFMEMORY;
    +  if (!AssignProcessToJobObject(uv_global_job_handle_, GetCurrentProcess())) {
    +    /* Make sure this handle is functional. The Windows kernel has a bug that
    +     * if the first use of AssignProcessToJobObject is for a Windows Store
    +     * program, subsequent attempts to use the handle with fail with
    +     * INVALID_PARAMETER (87). This is possibly because all uses of the handle
    +     * must be for the same Terminal Services session. We can ensure it is tied
    +     * to our current session now by adding ourself to it. We could remove
    +     * ourself afterwards, but there doesn't seem to be a reason to.
    +     */
    +    DWORD err = GetLastError();
    +    if (err != ERROR_ACCESS_DENIED)
    +      uv_fatal_error(err, "AssignProcessToJobObject");
       }
    +}
     
    -  r = MultiByteToWideChar(CP_UTF8,
    -                          0,
    -                          s,
    -                          -1,
    -                          ws,
    -                          ws_len);
    -  assert(r == ws_len);
     
    -  *ws_ptr = ws;
    -  return 0;
    +static int uv__utf8_to_utf16_alloc(const char* s, WCHAR** ws_ptr) {
    +  return uv__convert_utf8_to_utf16(s, ws_ptr);
     }
     
     
    @@ -396,7 +384,7 @@ static WCHAR* search_path(const WCHAR *file,
                                       name_has_ext);
     
         while (result == NULL) {
    -      if (*dir_end == L'\0') {
    +      if (dir_end == NULL || *dir_end == L'\0') {
             break;
           }
     
    @@ -539,21 +527,15 @@ int make_program_args(char** args, int verbatim_arguments, WCHAR** dst_ptr) {
     
       /* Count the required size. */
       for (arg = args; *arg; arg++) {
    -    DWORD arg_len;
    -
    -    arg_len = MultiByteToWideChar(CP_UTF8,
    -                                  0,
    -                                  *arg,
    -                                  -1,
    -                                  NULL,
    -                                  0);
    -    if (arg_len == 0) {
    -      return GetLastError();
    -    }
    +    ssize_t arg_len;
    +
    +    arg_len = uv_wtf8_length_as_utf16(*arg);
    +    if (arg_len < 0)
    +      return arg_len;
     
         dst_len += arg_len;
     
    -    if (arg_len > temp_buffer_len)
    +    if ((size_t) arg_len > temp_buffer_len)
           temp_buffer_len = arg_len;
     
         arg_count++;
    @@ -564,34 +546,28 @@ int make_program_args(char** args, int verbatim_arguments, WCHAR** dst_ptr) {
       dst_len = dst_len * 2 + arg_count * 2;
     
       /* Allocate buffer for the final command line. */
    -  dst = (WCHAR*) uv__malloc(dst_len * sizeof(WCHAR));
    +  dst = uv__malloc(dst_len * sizeof(WCHAR));
       if (dst == NULL) {
    -    err = ERROR_OUTOFMEMORY;
    +    err = UV_ENOMEM;
         goto error;
       }
     
       /* Allocate temporary working buffer. */
    -  temp_buffer = (WCHAR*) uv__malloc(temp_buffer_len * sizeof(WCHAR));
    +  temp_buffer = uv__malloc(temp_buffer_len * sizeof(WCHAR));
       if (temp_buffer == NULL) {
    -    err = ERROR_OUTOFMEMORY;
    +    err = UV_ENOMEM;
         goto error;
       }
     
       pos = dst;
       for (arg = args; *arg; arg++) {
    -    DWORD arg_len;
    +    ssize_t arg_len;
     
         /* Convert argument to wide char. */
    -    arg_len = MultiByteToWideChar(CP_UTF8,
    -                                  0,
    -                                  *arg,
    -                                  -1,
    -                                  temp_buffer,
    -                                  (int) (dst + dst_len - pos));
    -    if (arg_len == 0) {
    -      err = GetLastError();
    -      goto error;
    -    }
    +    arg_len = uv_wtf8_length_as_utf16(*arg);
    +    assert(arg_len > 0);
    +    assert(temp_buffer_len >= (size_t) arg_len);
    +    uv_wtf8_to_utf16(*arg, temp_buffer, arg_len);
     
         if (verbatim_arguments) {
           /* Copy verbatim. */
    @@ -603,6 +579,7 @@ int make_program_args(char** args, int verbatim_arguments, WCHAR** dst_ptr) {
         }
     
         *pos++ = *(arg + 1) ? L' ' : L'\0';
    +    assert(pos <= dst + dst_len);
       }
     
       uv__free(temp_buffer);
    @@ -688,55 +665,43 @@ int make_program_env(char* env_block[], WCHAR** dst_ptr) {
       WCHAR* ptr;
       char** env;
       size_t env_len = 0;
    -  int len;
    +  size_t len;
       size_t i;
    -  DWORD var_size;
    +  size_t var_size;
       size_t env_block_count = 1; /* 1 for null-terminator */
       WCHAR* dst_copy;
       WCHAR** ptr_copy;
       WCHAR** env_copy;
    -  DWORD required_vars_value_len[ARRAY_SIZE(required_vars)];
    +  size_t required_vars_value_len[ARRAY_SIZE(required_vars)];
     
       /* first pass: determine size in UTF-16 */
       for (env = env_block; *env; env++) {
    -    int len;
    +    ssize_t len;
         if (strchr(*env, '=')) {
    -      len = MultiByteToWideChar(CP_UTF8,
    -                                0,
    -                                *env,
    -                                -1,
    -                                NULL,
    -                                0);
    -      if (len <= 0) {
    -        return GetLastError();
    -      }
    +      len = uv_wtf8_length_as_utf16(*env);
    +      if (len < 0)
    +        return len;
           env_len += len;
           env_block_count++;
         }
       }
     
       /* second pass: copy to UTF-16 environment block */
    -  dst_copy = (WCHAR*)uv__malloc(env_len * sizeof(WCHAR));
    +  dst_copy = uv__malloc(env_len * sizeof(WCHAR));
       if (dst_copy == NULL && env_len > 0) {
    -    return ERROR_OUTOFMEMORY;
    +    return UV_ENOMEM;
       }
       env_copy = alloca(env_block_count * sizeof(WCHAR*));
     
       ptr = dst_copy;
       ptr_copy = env_copy;
       for (env = env_block; *env; env++) {
    +    ssize_t len;
         if (strchr(*env, '=')) {
    -      len = MultiByteToWideChar(CP_UTF8,
    -                                0,
    -                                *env,
    -                                -1,
    -                                ptr,
    -                                (int) (env_len - (ptr - dst_copy)));
    -      if (len <= 0) {
    -        DWORD err = GetLastError();
    -        uv__free(dst_copy);
    -        return err;
    -      }
    +      len = uv_wtf8_length_as_utf16(*env);
    +      assert(len > 0);
    +      assert((size_t) len <= env_len - (ptr - dst_copy));
    +      uv_wtf8_to_utf16(*env, ptr, len);
           *ptr_copy++ = ptr;
           ptr += len;
         }
    @@ -754,7 +719,7 @@ int make_program_env(char* env_block[], WCHAR** dst_ptr) {
           cmp = -1;
         } else {
           cmp = env_strncmp(required_vars[i].wide_eq,
    -                       required_vars[i].len,
    +                        required_vars[i].len,
                             *ptr_copy);
         }
         if (cmp < 0) {
    @@ -777,7 +742,7 @@ int make_program_env(char* env_block[], WCHAR** dst_ptr) {
       dst = uv__malloc((1+env_len) * sizeof(WCHAR));
       if (!dst) {
         uv__free(dst_copy);
    -    return ERROR_OUTOFMEMORY;
    +    return UV_ENOMEM;
       }
     
       for (ptr = dst, ptr_copy = env_copy, i = 0;
    @@ -975,26 +940,26 @@ int uv_spawn(uv_loop_t* loop,
     
       err = uv__utf8_to_utf16_alloc(options->file, &application);
       if (err)
    -    goto done;
    +    goto done_uv;
     
       err = make_program_args(
           options->args,
           options->flags & UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS,
           &arguments);
       if (err)
    -    goto done;
    +    goto done_uv;
     
       if (options->env) {
          err = make_program_env(options->env, &env);
          if (err)
    -       goto done;
    +       goto done_uv;
       }
     
       if (options->cwd) {
         /* Explicit cwd */
         err = uv__utf8_to_utf16_alloc(options->cwd, &cwd);
         if (err)
    -      goto done;
    +      goto done_uv;
     
       } else {
         /* Inherit cwd */
    @@ -1025,22 +990,19 @@ int uv_spawn(uv_loop_t* loop,
         DWORD path_len, r;
     
         path_len = GetEnvironmentVariableW(L"PATH", NULL, 0);
    -    if (path_len == 0) {
    -      err = GetLastError();
    -      goto done;
    -    }
    -
    -    alloc_path = (WCHAR*) uv__malloc(path_len * sizeof(WCHAR));
    -    if (alloc_path == NULL) {
    -      err = ERROR_OUTOFMEMORY;
    -      goto done;
    -    }
    -    path = alloc_path;
    +    if (path_len != 0) {
    +      alloc_path = (WCHAR*) uv__malloc(path_len * sizeof(WCHAR));
    +      if (alloc_path == NULL) {
    +        err = ERROR_OUTOFMEMORY;
    +        goto done;
    +      }
    +      path = alloc_path;
     
    -    r = GetEnvironmentVariableW(L"PATH", path, path_len);
    -    if (r == 0 || r >= path_len) {
    -      err = GetLastError();
    -      goto done;
    +      r = GetEnvironmentVariableW(L"PATH", path, path_len);
    +      if (r == 0 || r >= path_len) {
    +        err = GetLastError();
    +        goto done;
    +      }
         }
       }
     
    @@ -1102,6 +1064,7 @@ int uv_spawn(uv_loop_t* loop,
          * breakaway.
          */
         process_flags |= DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP;
    +    process_flags |= CREATE_SUSPENDED;
       }
     
       if (!CreateProcessW(application_path,
    @@ -1119,11 +1082,6 @@ int uv_spawn(uv_loop_t* loop,
         goto done;
       }
     
    -  /* Spawn succeeded. Beyond this point, failure is reported asynchronously. */
    -
    -  process->process_handle = info.hProcess;
    -  process->pid = info.dwProcessId;
    -
       /* If the process isn't spawned as detached, assign to the global job object
        * so windows will kill it when the parent process dies. */
       if (!(options->flags & UV_PROCESS_DETACHED)) {
    @@ -1146,6 +1104,19 @@ int uv_spawn(uv_loop_t* loop,
         }
       }
     
    +  if (process_flags & CREATE_SUSPENDED) {
    +    if (ResumeThread(info.hThread) == ((DWORD)-1)) {
    +      err = GetLastError();
    +      TerminateProcess(info.hProcess, 1);
    +      goto done;
    +    }
    +  }
    +
    +  /* Spawn succeeded. Beyond this point, failure is reported asynchronously. */
    +
    +  process->process_handle = info.hProcess;
    +  process->pid = info.dwProcessId;
    +
       /* Set IPC pid to all IPC pipes. */
       for (i = 0; i < options->stdio_count; i++) {
         const uv_stdio_container_t* fdopt = &options->stdio[i];
    @@ -1173,8 +1144,13 @@ int uv_spawn(uv_loop_t* loop,
        * made or the handle is closed, whichever happens first. */
       uv__handle_start(process);
     
    +  goto done_uv;
    +
       /* Cleanup, whether we succeeded or failed. */
      done:
    +  err = uv_translate_sys_error(err);
    +
    + done_uv:
       uv__free(application);
       uv__free(application_path);
       uv__free(arguments);
    @@ -1188,7 +1164,7 @@ int uv_spawn(uv_loop_t* loop,
         child_stdio_buffer = NULL;
       }
     
    -  return uv_translate_sys_error(err);
    +  return err;
     }
     
     
    diff --git a/deps/uv/src/win/tty.c b/deps/uv/src/win/tty.c
    index 7e1f15544b1773..ac836930d6f3a1 100644
    --- a/deps/uv/src/win/tty.c
    +++ b/deps/uv/src/win/tty.c
    @@ -482,9 +482,11 @@ static DWORD CALLBACK uv_tty_line_read_thread(void* data) {
       uv_loop_t* loop;
       uv_tty_t* handle;
       uv_req_t* req;
    -  DWORD bytes, read_bytes;
    +  DWORD bytes;
    +  size_t read_bytes;
       WCHAR utf16[MAX_INPUT_BUFFER_LENGTH / 3];
    -  DWORD chars, read_chars;
    +  DWORD chars;
    +  DWORD read_chars;
       LONG status;
       COORD pos;
       BOOL read_console_success;
    @@ -525,16 +527,13 @@ static DWORD CALLBACK uv_tty_line_read_thread(void* data) {
                                           NULL);
     
       if (read_console_success) {
    -    read_bytes = WideCharToMultiByte(CP_UTF8,
    -                                     0,
    -                                     utf16,
    -                                     read_chars,
    -                                     handle->tty.rd.read_line_buffer.base,
    -                                     bytes,
    -                                     NULL,
    -                                     NULL);
    +    read_bytes = bytes;
    +    uv_utf16_to_wtf8(utf16,
    +                     read_chars,
    +                     &handle->tty.rd.read_line_buffer.base,
    +                     &read_bytes);
         SET_REQ_SUCCESS(req);
    -    req->u.io.overlapped.InternalHigh = read_bytes;
    +    req->u.io.overlapped.InternalHigh = (DWORD) read_bytes;
       } else {
         SET_REQ_ERROR(req, GetLastError());
       }
    @@ -798,7 +797,9 @@ void uv_process_tty_read_raw_req(uv_loop_t* loop, uv_tty_t* handle,
           }
     
           if (KEV.uChar.UnicodeChar != 0) {
    -        int prefix_len, char_len;
    +        int prefix_len;
    +        size_t char_len;
    +        char* last_key_buf;
     
             /* Character key pressed */
             if (KEV.uChar.UnicodeChar >= 0xD800 &&
    @@ -819,38 +820,31 @@ void uv_process_tty_read_raw_req(uv_loop_t* loop, uv_tty_t* handle,
               prefix_len = 0;
             }
     
    -        if (KEV.uChar.UnicodeChar >= 0xDC00 &&
    -            KEV.uChar.UnicodeChar < 0xE000) {
    +        char_len = sizeof handle->tty.rd.last_key;
    +        last_key_buf = &handle->tty.rd.last_key[prefix_len];
    +        if (handle->tty.rd.last_utf16_high_surrogate) {
               /* UTF-16 surrogate pair */
               WCHAR utf16_buffer[2];
               utf16_buffer[0] = handle->tty.rd.last_utf16_high_surrogate;
               utf16_buffer[1] = KEV.uChar.UnicodeChar;
    -          char_len = WideCharToMultiByte(CP_UTF8,
    -                                         0,
    -                                         utf16_buffer,
    -                                         2,
    -                                         &handle->tty.rd.last_key[prefix_len],
    -                                         sizeof handle->tty.rd.last_key,
    -                                         NULL,
    -                                         NULL);
    +          if (uv_utf16_to_wtf8(utf16_buffer,
    +                               2,
    +                               &last_key_buf,
    +                               &char_len))
    +            char_len = 0;
    +          handle->tty.rd.last_utf16_high_surrogate = 0;
             } else {
               /* Single UTF-16 character */
    -          char_len = WideCharToMultiByte(CP_UTF8,
    -                                         0,
    -                                         &KEV.uChar.UnicodeChar,
    -                                         1,
    -                                         &handle->tty.rd.last_key[prefix_len],
    -                                         sizeof handle->tty.rd.last_key,
    -                                         NULL,
    -                                         NULL);
    +          if (uv_utf16_to_wtf8(&KEV.uChar.UnicodeChar,
    +                               1,
    +                               &last_key_buf,
    +                               &char_len))
    +            char_len = 0;
             }
     
    -        /* Whatever happened, the last character wasn't a high surrogate. */
    -        handle->tty.rd.last_utf16_high_surrogate = 0;
    -
             /* If the utf16 character(s) couldn't be converted something must be
              * wrong. */
    -        if (!char_len) {
    +        if (char_len == 0) {
               handle->flags &= ~UV_HANDLE_READING;
               DECREASE_ACTIVE_COUNT(loop, handle);
               handle->read_cb((uv_stream_t*) handle,
    diff --git a/deps/uv/src/win/util.c b/deps/uv/src/win/util.c
    index f6ec79cd57b501..91d88a54fb24a6 100644
    --- a/deps/uv/src/win/util.c
    +++ b/deps/uv/src/win/util.c
    @@ -95,7 +95,7 @@ void uv__util_init(void) {
     
     
     int uv_exepath(char* buffer, size_t* size_ptr) {
    -  int utf8_len, utf16_buffer_len, utf16_len;
    +  size_t utf8_len, utf16_buffer_len, utf16_len;
       WCHAR* utf16_buffer;
       int err;
     
    @@ -123,25 +123,17 @@ int uv_exepath(char* buffer, size_t* size_ptr) {
       }
     
       /* Convert to UTF-8 */
    -  utf8_len = WideCharToMultiByte(CP_UTF8,
    -                                 0,
    -                                 utf16_buffer,
    -                                 -1,
    -                                 buffer,
    -                                 (int) *size_ptr,
    -                                 NULL,
    -                                 NULL);
    -  if (utf8_len == 0) {
    -    err = GetLastError();
    -    goto error;
    +  utf8_len = *size_ptr - 1; /* Reserve space for NUL */
    +  err = uv_utf16_to_wtf8(utf16_buffer, utf16_len, &buffer, &utf8_len);
    +  if (err == UV_ENOBUFS) {
    +    utf8_len = *size_ptr - 1;
    +    err = 0;
       }
    +  *size_ptr = utf8_len;
     
       uv__free(utf16_buffer);
     
    -  /* utf8_len *does* include the terminating null at this point, but the
    -   * returned size shouldn't. */
    -  *size_ptr = utf8_len - 1;
    -  return 0;
    +  return err;
     
      error:
       uv__free(utf16_buffer);
    @@ -204,45 +196,14 @@ int uv_cwd(char* buffer, size_t* size) {
       }
     
       r = uv__cwd(&utf16_buffer, &utf16_len);
    -  if (r < 0) {
    +  if (r < 0)
         return r;
    -  }
     
    -  /* Check how much space we need */
    -  r = WideCharToMultiByte(CP_UTF8,
    -                          0,
    -                          utf16_buffer,
    -                          -1,
    -                          NULL,
    -                          0,
    -                          NULL,
    -                          NULL);
    -  if (r == 0) {
    -    uv__free(utf16_buffer);
    -    return uv_translate_sys_error(GetLastError());
    -  } else if (r > (int) *size) {
    -    uv__free(utf16_buffer);
    -    *size = r;
    -    return UV_ENOBUFS;
    -  }
    +  r = uv__copy_utf16_to_utf8(utf16_buffer, utf16_len, buffer, size);
     
    -  /* Convert to UTF-8 */
    -  r = WideCharToMultiByte(CP_UTF8,
    -                          0,
    -                          utf16_buffer,
    -                          -1,
    -                          buffer,
    -                          *size > INT_MAX ? INT_MAX : (int) *size,
    -                          NULL,
    -                          NULL);
       uv__free(utf16_buffer);
     
    -  if (r == 0) {
    -    return uv_translate_sys_error(GetLastError());
    -  }
    -
    -  *size = r - 1;
    -  return 0;
    +  return r;
     }
     
     
    @@ -252,33 +213,10 @@ int uv_chdir(const char* dir) {
       WCHAR drive_letter, env_var[4];
       int r;
     
    -  if (dir == NULL) {
    -    return UV_EINVAL;
    -  }
    -
    -  utf16_len = MultiByteToWideChar(CP_UTF8,
    -                                  0,
    -                                  dir,
    -                                  -1,
    -                                  NULL,
    -                                  0);
    -  if (utf16_len == 0) {
    -    return uv_translate_sys_error(GetLastError());
    -  }
    -  utf16_buffer = uv__malloc(utf16_len * sizeof(WCHAR));
    -  if (utf16_buffer == NULL) {
    -    return UV_ENOMEM;
    -  }
    -
    -  if (MultiByteToWideChar(CP_UTF8,
    -                          0,
    -                          dir,
    -                          -1,
    -                          utf16_buffer,
    -                          utf16_len) == 0) {
    -    uv__free(utf16_buffer);
    -    return uv_translate_sys_error(GetLastError());
    -  }
    +  /* Convert to UTF-16 */
    +  r = uv__convert_utf8_to_utf16(dir, &utf16_buffer);
    +  if (r)
    +    return r;
     
       if (!SetCurrentDirectoryW(utf16_buffer)) {
         uv__free(utf16_buffer);
    @@ -416,29 +354,14 @@ int uv_set_process_title(const char* title) {
     
       uv__once_init();
     
    -  /* Find out how big the buffer for the wide-char title must be */
    -  length = MultiByteToWideChar(CP_UTF8, 0, title, -1, NULL, 0);
    -  if (!length) {
    -    err = GetLastError();
    -    goto done;
    -  }
    -
    -  /* Convert to wide-char string */
    -  title_w = (WCHAR*)uv__malloc(sizeof(WCHAR) * length);
    -  if (!title_w) {
    -    uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc");
    -  }
    -
    -  length = MultiByteToWideChar(CP_UTF8, 0, title, -1, title_w, length);
    -  if (!length) {
    -    err = GetLastError();
    -    goto done;
    -  }
    +  err = uv__convert_utf8_to_utf16(title, &title_w);
    +  if (err)
    +    return err;
     
       /* If the title must be truncated insert a \0 terminator there */
    -  if (length > MAX_TITLE_LENGTH) {
    +  length = wcslen(title_w);
    +  if (length >= MAX_TITLE_LENGTH)
         title_w[MAX_TITLE_LENGTH - 1] = L'\0';
    -  }
     
       if (!SetConsoleTitleW(title_w)) {
         err = GetLastError();
    @@ -460,20 +383,19 @@ int uv_set_process_title(const char* title) {
     
     static int uv__get_process_title(void) {
       WCHAR title_w[MAX_TITLE_LENGTH];
    +  DWORD wlen;
     
    -  if (!GetConsoleTitleW(title_w, sizeof(title_w) / sizeof(WCHAR))) {
    -    return -1;
    -  }
    -
    -  if (uv__convert_utf16_to_utf8(title_w, -1, &process_title) != 0)
    -    return -1;
    +  wlen = GetConsoleTitleW(title_w, sizeof(title_w) / sizeof(WCHAR));
    +  if (wlen == 0)
    +    return uv_translate_sys_error(GetLastError());
     
    -  return 0;
    +  return uv__convert_utf16_to_utf8(title_w, wlen, &process_title);
     }
     
     
     int uv_get_process_title(char* buffer, size_t size) {
       size_t len;
    +  int r;
     
       if (buffer == NULL || size == 0)
         return UV_EINVAL;
    @@ -485,9 +407,12 @@ int uv_get_process_title(char* buffer, size_t size) {
        * If the process_title was never read before nor explicitly set,
        * we must query it with getConsoleTitleW
        */
    -  if (!process_title && uv__get_process_title() == -1) {
    -    LeaveCriticalSection(&process_title_lock);
    -    return uv_translate_sys_error(GetLastError());
    +  if (process_title == NULL) {
    +    r = uv__get_process_title();
    +    if (r) {
    +      LeaveCriticalSection(&process_title_lock);
    +      return r;
    +    }
       }
     
       assert(process_title);
    @@ -833,19 +758,8 @@ int uv_interface_addresses(uv_interface_address_t** addresses_ptr,
           continue;
     
         /* Compute the size of the interface name. */
    -    name_size = WideCharToMultiByte(CP_UTF8,
    -                                    0,
    -                                    adapter->FriendlyName,
    -                                    -1,
    -                                    NULL,
    -                                    0,
    -                                    NULL,
    -                                    FALSE);
    -    if (name_size <= 0) {
    -      uv__free(win_address_buf);
    -      return uv_translate_sys_error(GetLastError());
    -    }
    -    uv_address_buf_size += name_size;
    +    name_size = uv_utf16_length_as_wtf8(adapter->FriendlyName, -1);
    +    uv_address_buf_size += name_size + 1;
     
         /* Count the number of addresses associated with this interface, and
          * compute the size. */
    @@ -875,30 +789,25 @@ int uv_interface_addresses(uv_interface_address_t** addresses_ptr,
            adapter != NULL;
            adapter = adapter->Next) {
         IP_ADAPTER_UNICAST_ADDRESS* unicast_address;
    -    int name_size;
    -    size_t max_name_size;
    +    size_t name_size;
    +    int r;
     
         if (adapter->OperStatus != IfOperStatusUp ||
             adapter->FirstUnicastAddress == NULL)
           continue;
     
         /* Convert the interface name to UTF8. */
    -    max_name_size = (char*) uv_address_buf + uv_address_buf_size - name_buf;
    -    if (max_name_size > (size_t) INT_MAX)
    -      max_name_size = INT_MAX;
    -    name_size = WideCharToMultiByte(CP_UTF8,
    -                                    0,
    -                                    adapter->FriendlyName,
    -                                    -1,
    -                                    name_buf,
    -                                    (int) max_name_size,
    -                                    NULL,
    -                                    FALSE);
    -    if (name_size <= 0) {
    +    name_size = (char*) uv_address_buf + uv_address_buf_size - name_buf;
    +    r = uv__copy_utf16_to_utf8(adapter->FriendlyName,
    +                               -1,
    +                               name_buf,
    +                               &name_size);
    +    if (r) {
           uv__free(win_address_buf);
           uv__free(uv_address_buf);
    -      return uv_translate_sys_error(GetLastError());
    +      return r;
         }
    +    name_size += 1; /* Add NUL byte. */
     
         /* Add an uv_interface_address_t element for every unicast address. */
         for (unicast_address = (IP_ADAPTER_UNICAST_ADDRESS*)
    @@ -1061,7 +970,6 @@ int uv_os_homedir(char* buffer, size_t* size) {
     
     int uv_os_tmpdir(char* buffer, size_t* size) {
       wchar_t *path;
    -  DWORD bufsize;
       size_t len;
     
       if (buffer == NULL || size == NULL || *size == 0)
    @@ -1078,7 +986,7 @@ int uv_os_tmpdir(char* buffer, size_t* size) {
       if (path == NULL) {
         return UV_ENOMEM;
       }
    -  len  = GetTempPathW(len, path);
    +  len = GetTempPathW(len, path);
     
       if (len == 0) {
         uv__free(path);
    @@ -1093,34 +1001,7 @@ int uv_os_tmpdir(char* buffer, size_t* size) {
         path[len] = L'\0';
       }
     
    -  /* Check how much space we need */
    -  bufsize = WideCharToMultiByte(CP_UTF8, 0, path, -1, NULL, 0, NULL, NULL);
    -
    -  if (bufsize == 0) {
    -    uv__free(path);
    -    return uv_translate_sys_error(GetLastError());
    -  } else if (bufsize > *size) {
    -    uv__free(path);
    -    *size = bufsize;
    -    return UV_ENOBUFS;
    -  }
    -
    -  /* Convert to UTF-8 */
    -  bufsize = WideCharToMultiByte(CP_UTF8,
    -                                0,
    -                                path,
    -                                -1,
    -                                buffer,
    -                                *size,
    -                                NULL,
    -                                NULL);
    -  uv__free(path);
    -
    -  if (bufsize == 0)
    -    return uv_translate_sys_error(GetLastError());
    -
    -  *size = bufsize - 1;
    -  return 0;
    +  return uv__copy_utf16_to_utf8(path, len, buffer, size);
     }
     
     
    @@ -1131,95 +1012,71 @@ int uv_os_tmpdir(char* buffer, size_t* size) {
      * If utf16 is null terminated, utf16len can be set to -1, otherwise it must
      * be specified.
      */
    -int uv__convert_utf16_to_utf8(const WCHAR* utf16, int utf16len, char** utf8) {
    -  DWORD bufsize;
    +int uv__convert_utf16_to_utf8(const WCHAR* utf16, size_t utf16len, char** utf8) {
    +  size_t utf8_len = 0;
     
       if (utf16 == NULL)
         return UV_EINVAL;
     
    -  /* Check how much space we need */
    -  bufsize = WideCharToMultiByte(CP_UTF8,
    -                                0,
    -                                utf16,
    -                                utf16len,
    -                                NULL,
    -                                0,
    -                                NULL,
    -                                NULL);
    -
    -  if (bufsize == 0)
    -    return uv_translate_sys_error(GetLastError());
    -
    -  /* Allocate the destination buffer adding an extra byte for the terminating
    -   * NULL. If utf16len is not -1 WideCharToMultiByte will not add it, so
    -   * we do it ourselves always, just in case. */
    -  *utf8 = uv__malloc(bufsize + 1);
    -
    -  if (*utf8 == NULL)
    -    return UV_ENOMEM;
    -
    -  /* Convert to UTF-8 */
    -  bufsize = WideCharToMultiByte(CP_UTF8,
    -                                0,
    -                                utf16,
    -                                utf16len,
    -                                *utf8,
    -                                bufsize,
    -                                NULL,
    -                                NULL);
    -
    -  if (bufsize == 0) {
    -    uv__free(*utf8);
    -    *utf8 = NULL;
    -    return uv_translate_sys_error(GetLastError());
    -  }
    -
    -  (*utf8)[bufsize] = '\0';
    -  return 0;
    +   *utf8 = NULL;
    +   return uv_utf16_to_wtf8(utf16, utf16len, utf8, &utf8_len);
     }
     
     
     /*
      * Converts a UTF-8 string into a UTF-16 one. The resulting string is
      * null-terminated.
    - *
    - * If utf8 is null terminated, utf8len can be set to -1, otherwise it must
    - * be specified.
      */
    -int uv__convert_utf8_to_utf16(const char* utf8, int utf8len, WCHAR** utf16) {
    +int uv__convert_utf8_to_utf16(const char* utf8, WCHAR** utf16) {
       int bufsize;
     
       if (utf8 == NULL)
         return UV_EINVAL;
     
    -  /* Check how much space we need */
    -  bufsize = MultiByteToWideChar(CP_UTF8, 0, utf8, utf8len, NULL, 0);
    -
    -  if (bufsize == 0)
    -    return uv_translate_sys_error(GetLastError());
    +  /* Check how much space we need (including NUL). */
    +  bufsize = uv_wtf8_length_as_utf16(utf8);
    +  if (bufsize < 0)
    +    return UV__EINVAL;
     
    -  /* Allocate the destination buffer adding an extra byte for the terminating
    -   * NULL. If utf8len is not -1 MultiByteToWideChar will not add it, so
    -   * we do it ourselves always, just in case. */
    -  *utf16 = uv__malloc(sizeof(WCHAR) * (bufsize + 1));
    +  /* Allocate the destination buffer. */
    +  *utf16 = uv__malloc(sizeof(WCHAR) * bufsize);
     
       if (*utf16 == NULL)
         return UV_ENOMEM;
     
       /* Convert to UTF-16 */
    -  bufsize = MultiByteToWideChar(CP_UTF8, 0, utf8, utf8len, *utf16, bufsize);
    +  uv_wtf8_to_utf16(utf8, *utf16, bufsize);
     
    -  if (bufsize == 0) {
    -    uv__free(*utf16);
    -    *utf16 = NULL;
    -    return uv_translate_sys_error(GetLastError());
    -  }
    -
    -  (*utf16)[bufsize] = L'\0';
       return 0;
     }
     
     
    +/*
    + * Converts a UTF-16 string into a UTF-8 one in an existing buffer. The
    + * resulting string is null-terminated.
    + *
    + * If utf16 is null terminated, utf16len can be set to -1, otherwise it must
    + * be specified.
    + */
    +int uv__copy_utf16_to_utf8(const WCHAR* utf16buffer, size_t utf16len, char* utf8, size_t *size) {
    +  int r;
    +
    +  if (utf8 == NULL || size == NULL)
    +    return UV_EINVAL;
    +
    +  if (*size == 0) {
    +    *size = uv_utf16_length_as_wtf8(utf16buffer, utf16len);
    +    r = UV_ENOBUFS;
    +  } else {
    +    *size -= 1; /* Reserve space for NUL. */
    +    r = uv_utf16_to_wtf8(utf16buffer, utf16len, &utf8, size);
    +  }
    +  if (r == UV_ENOBUFS)
    +    *size += 1; /* Add space for NUL. */
    +  return r;
    +}
    +
    +
     static int uv__getpwuid_r(uv_passwd_t* pwd) {
       HANDLE token;
       wchar_t username[UNLEN + 1];
    @@ -1384,14 +1241,13 @@ int uv_os_getenv(const char* name, char* buffer, size_t* size) {
       wchar_t* var;
       DWORD varlen;
       wchar_t* name_w;
    -  DWORD bufsize;
       size_t len;
       int r;
     
       if (name == NULL || buffer == NULL || size == NULL || *size == 0)
         return UV_EINVAL;
     
    -  r = uv__convert_utf8_to_utf16(name, -1, &name_w);
    +  r = uv__convert_utf8_to_utf16(name, &name_w);
     
       if (r != 0)
         return r;
    @@ -1432,35 +1288,7 @@ int uv_os_getenv(const char* name, char* buffer, size_t* size) {
         }
       }
     
    -  /* Check how much space we need */
    -  bufsize = WideCharToMultiByte(CP_UTF8, 0, var, -1, NULL, 0, NULL, NULL);
    -
    -  if (bufsize == 0) {
    -    r = uv_translate_sys_error(GetLastError());
    -    goto fail;
    -  } else if (bufsize > *size) {
    -    *size = bufsize;
    -    r = UV_ENOBUFS;
    -    goto fail;
    -  }
    -
    -  /* Convert to UTF-8 */
    -  bufsize = WideCharToMultiByte(CP_UTF8,
    -                                0,
    -                                var,
    -                                -1,
    -                                buffer,
    -                                *size,
    -                                NULL,
    -                                NULL);
    -
    -  if (bufsize == 0) {
    -    r = uv_translate_sys_error(GetLastError());
    -    goto fail;
    -  }
    -
    -  *size = bufsize - 1;
    -  r = 0;
    +  r = uv__copy_utf16_to_utf8(var, len, buffer, size);
     
     fail:
     
    @@ -1482,12 +1310,12 @@ int uv_os_setenv(const char* name, const char* value) {
       if (name == NULL || value == NULL)
         return UV_EINVAL;
     
    -  r = uv__convert_utf8_to_utf16(name, -1, &name_w);
    +  r = uv__convert_utf8_to_utf16(name, &name_w);
     
       if (r != 0)
         return r;
     
    -  r = uv__convert_utf8_to_utf16(value, -1, &value_w);
    +  r = uv__convert_utf8_to_utf16(value, &value_w);
     
       if (r != 0) {
         uv__free(name_w);
    @@ -1512,7 +1340,7 @@ int uv_os_unsetenv(const char* name) {
       if (name == NULL)
         return UV_EINVAL;
     
    -  r = uv__convert_utf8_to_utf16(name, -1, &name_w);
    +  r = uv__convert_utf8_to_utf16(name, &name_w);
     
       if (r != 0)
         return r;
    @@ -1529,9 +1357,6 @@ int uv_os_unsetenv(const char* name) {
     
     int uv_os_gethostname(char* buffer, size_t* size) {
       WCHAR buf[UV_MAXHOSTNAMESIZE];
    -  size_t len;
    -  char* utf8_str;
    -  int convert_result;
     
       if (buffer == NULL || size == NULL || *size == 0)
         return UV_EINVAL;
    @@ -1544,22 +1369,7 @@ int uv_os_gethostname(char* buffer, size_t* size) {
       if (pGetHostNameW(buf, UV_MAXHOSTNAMESIZE) != 0)
         return uv_translate_sys_error(WSAGetLastError());
     
    -  convert_result = uv__convert_utf16_to_utf8(buf, -1, &utf8_str);
    -
    -  if (convert_result != 0)
    -    return convert_result;
    -
    -  len = strlen(utf8_str);
    -  if (len >= *size) {
    -    *size = len + 1;
    -    uv__free(utf8_str);
    -    return UV_ENOBUFS;
    -  }
    -
    -  memcpy(buffer, utf8_str, len + 1);
    -  uv__free(utf8_str);
    -  *size = len;
    -  return 0;
    +  return uv__copy_utf16_to_utf8(buf, -1, buffer, size);
     }
     
     
    @@ -1665,7 +1475,7 @@ int uv_os_uname(uv_utsname_t* buffer) {
       HKEY registry_key;
       WCHAR product_name_w[256];
       DWORD product_name_w_size;
    -  int version_size;
    +  size_t version_size;
       int processor_level;
       int r;
     
    @@ -1696,7 +1506,7 @@ int uv_os_uname(uv_utsname_t* buffer) {
       r = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
                         L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",
                         0,
    -                    KEY_QUERY_VALUE,
    +                    KEY_QUERY_VALUE | KEY_WOW64_64KEY,
                         ®istry_key);
     
       if (r == ERROR_SUCCESS) {
    @@ -1727,37 +1537,29 @@ int uv_os_uname(uv_utsname_t* buffer) {
             }
           }
     
    -      version_size = WideCharToMultiByte(CP_UTF8,
    -                                         0,
    -                                         product_name_w,
    -                                         -1,
    -                                         buffer->version,
    -                                         sizeof(buffer->version),
    -                                         NULL,
    -                                         NULL);
    -      if (version_size == 0) {
    -        r = uv_translate_sys_error(GetLastError());
    +      version_size = sizeof(buffer->version);
    +      r = uv__copy_utf16_to_utf8(product_name_w,
    +                                 -1,
    +                                 buffer->version,
    +                                 &version_size);
    +      if (r)
             goto error;
    -      }
         }
       }
     
       /* Append service pack information to the version if present. */
       if (os_info.szCSDVersion[0] != L'\0') {
         if (version_size > 0)
    -      buffer->version[version_size - 1] = ' ';
    -
    -    if (WideCharToMultiByte(CP_UTF8,
    -                            0,
    -                            os_info.szCSDVersion,
    -                            -1,
    -                            buffer->version + version_size,
    -                            sizeof(buffer->version) - version_size,
    -                            NULL,
    -                            NULL) == 0) {
    -      r = uv_translate_sys_error(GetLastError());
    +      buffer->version[version_size++] = ' ';
    +
    +    version_size = sizeof(buffer->version) - version_size;
    +    r = uv__copy_utf16_to_utf8(os_info.szCSDVersion,
    +                               -1,
    +                               buffer->version + 
    +                                 sizeof(buffer->version) - version_size,
    +                               &version_size);
    +    if (r)
           goto error;
    -    }
       }
     
       /* Populate the sysname field. */
    diff --git a/deps/uv/test/benchmark-async-pummel.c b/deps/uv/test/benchmark-async-pummel.c
    index bec91850616150..68864c842e5b09 100644
    --- a/deps/uv/test/benchmark-async-pummel.c
    +++ b/deps/uv/test/benchmark-async-pummel.c
    @@ -71,21 +71,21 @@ static int test_async_pummel(int nthreads) {
       tids = calloc(nthreads, sizeof(tids[0]));
       ASSERT_NOT_NULL(tids);
     
    -  ASSERT(0 == uv_async_init(uv_default_loop(), &handle, async_cb));
    +  ASSERT_OK(uv_async_init(uv_default_loop(), &handle, async_cb));
       ACCESS_ONCE(const char*, handle.data) = running;
     
       for (i = 0; i < nthreads; i++)
    -    ASSERT(0 == uv_thread_create(tids + i, pummel, &handle));
    +    ASSERT_OK(uv_thread_create(tids + i, pummel, &handle));
     
       time = uv_hrtime();
     
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
       time = uv_hrtime() - time;
       done = 1;
     
       for (i = 0; i < nthreads; i++)
    -    ASSERT(0 == uv_thread_join(tids + i));
    +    ASSERT_OK(uv_thread_join(tids + i));
     
       printf("async_pummel_%d: %s callbacks in %.2f seconds (%s/sec)\n",
              nthreads,
    diff --git a/deps/uv/test/benchmark-async.c b/deps/uv/test/benchmark-async.c
    index d4b7c8bd91482f..5544c46b3b28ff 100644
    --- a/deps/uv/test/benchmark-async.c
    +++ b/deps/uv/test/benchmark-async.c
    @@ -43,7 +43,7 @@ struct ctx {
     static void worker_async_cb(uv_async_t* handle) {
       struct ctx* ctx = container_of(handle, struct ctx, worker_async);
     
    -  ASSERT(0 == uv_async_send(&ctx->main_async));
    +  ASSERT_OK(uv_async_send(&ctx->main_async));
       ctx->worker_sent++;
       ctx->worker_seen++;
     
    @@ -55,7 +55,7 @@ static void worker_async_cb(uv_async_t* handle) {
     static void main_async_cb(uv_async_t* handle) {
       struct ctx* ctx = container_of(handle, struct ctx, main_async);
     
    -  ASSERT(0 == uv_async_send(&ctx->worker_async));
    +  ASSERT_OK(uv_async_send(&ctx->worker_async));
       ctx->main_sent++;
       ctx->main_seen++;
     
    @@ -66,8 +66,8 @@ static void main_async_cb(uv_async_t* handle) {
     
     static void worker(void* arg) {
       struct ctx* ctx = arg;
    -  ASSERT(0 == uv_async_send(&ctx->main_async));
    -  ASSERT(0 == uv_run(&ctx->loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_async_send(&ctx->main_async));
    +  ASSERT_OK(uv_run(&ctx->loop, UV_RUN_DEFAULT));
       uv_loop_close(&ctx->loop);
     }
     
    @@ -85,29 +85,29 @@ static int test_async(int nthreads) {
       for (i = 0; i < nthreads; i++) {
         ctx = threads + i;
         ctx->nthreads = nthreads;
    -    ASSERT(0 == uv_loop_init(&ctx->loop));
    -    ASSERT(0 == uv_async_init(&ctx->loop, &ctx->worker_async, worker_async_cb));
    -    ASSERT(0 == uv_async_init(uv_default_loop(),
    -                              &ctx->main_async,
    -                              main_async_cb));
    -    ASSERT(0 == uv_thread_create(&ctx->thread, worker, ctx));
    +    ASSERT_OK(uv_loop_init(&ctx->loop));
    +    ASSERT_OK(uv_async_init(&ctx->loop, &ctx->worker_async, worker_async_cb));
    +    ASSERT_OK(uv_async_init(uv_default_loop(),
    +                            &ctx->main_async,
    +                            main_async_cb));
    +    ASSERT_OK(uv_thread_create(&ctx->thread, worker, ctx));
       }
     
       time = uv_hrtime();
     
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
       for (i = 0; i < nthreads; i++)
    -    ASSERT(0 == uv_thread_join(&threads[i].thread));
    +    ASSERT_OK(uv_thread_join(&threads[i].thread));
     
       time = uv_hrtime() - time;
     
       for (i = 0; i < nthreads; i++) {
         ctx = threads + i;
    -    ASSERT(ctx->worker_sent == NUM_PINGS);
    -    ASSERT(ctx->worker_seen == NUM_PINGS);
    -    ASSERT(ctx->main_sent == (unsigned int) NUM_PINGS);
    -    ASSERT(ctx->main_seen == (unsigned int) NUM_PINGS);
    +    ASSERT_EQ(ctx->worker_sent, NUM_PINGS);
    +    ASSERT_EQ(ctx->worker_seen, NUM_PINGS);
    +    ASSERT_EQ(ctx->main_sent, (unsigned int) NUM_PINGS);
    +    ASSERT_EQ(ctx->main_seen, (unsigned int) NUM_PINGS);
       }
     
       printf("async%d: %.2f sec (%s/sec)\n",
    diff --git a/deps/uv/test/benchmark-getaddrinfo.c b/deps/uv/test/benchmark-getaddrinfo.c
    index 1ef7b1ef095937..cb4d2bc935a763 100644
    --- a/deps/uv/test/benchmark-getaddrinfo.c
    +++ b/deps/uv/test/benchmark-getaddrinfo.c
    @@ -43,7 +43,7 @@ static void getaddrinfo_initiate(uv_getaddrinfo_t* handle);
     
     static void getaddrinfo_cb(uv_getaddrinfo_t* handle, int status,
         struct addrinfo* res) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       calls_completed++;
       if (calls_initiated < TOTAL_CALLS) {
         getaddrinfo_initiate(handle);
    @@ -59,7 +59,7 @@ static void getaddrinfo_initiate(uv_getaddrinfo_t* handle) {
       calls_initiated++;
     
       r = uv_getaddrinfo(loop, handle, &getaddrinfo_cb, name, NULL, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -80,8 +80,8 @@ BENCHMARK_IMPL(getaddrinfo) {
       uv_update_time(loop);
       end_time = uv_now(loop);
     
    -  ASSERT(calls_initiated == TOTAL_CALLS);
    -  ASSERT(calls_completed == TOTAL_CALLS);
    +  ASSERT_EQ(calls_initiated, TOTAL_CALLS);
    +  ASSERT_EQ(calls_completed, TOTAL_CALLS);
     
       fprintf(stderr, "getaddrinfo: %.0f req/s\n",
               (double) calls_completed / (double) (end_time - start_time) * 1000.0);
    diff --git a/deps/uv/test/benchmark-loop-count.c b/deps/uv/test/benchmark-loop-count.c
    index 72f25b56ba5f31..0db4aa567a90f0 100644
    --- a/deps/uv/test/benchmark-loop-count.c
    +++ b/deps/uv/test/benchmark-loop-count.c
    @@ -74,7 +74,7 @@ BENCHMARK_IMPL(loop_count) {
       uv_run(loop, UV_RUN_DEFAULT);
       ns = uv_hrtime() - ns;
     
    -  ASSERT(ticks == NUM_TICKS);
    +  ASSERT_UINT64_EQ(ticks, NUM_TICKS);
     
       fprintf(stderr, "loop_count: %d ticks in %.2fs (%.0f/s)\n",
               NUM_TICKS,
    diff --git a/deps/uv/test/benchmark-million-async.c b/deps/uv/test/benchmark-million-async.c
    index 30c21c38af15c4..13b52d488d0f5f 100644
    --- a/deps/uv/test/benchmark-million-async.c
    +++ b/deps/uv/test/benchmark-million-async.c
    @@ -60,7 +60,7 @@ static void timer_cb(uv_timer_t* handle) {
       unsigned i;
     
       done = 1;
    -  ASSERT(0 == uv_thread_join(&thread_id));
    +  ASSERT_OK(uv_thread_join(&thread_id));
     
       for (i = 0; i < ARRAY_SIZE(container->async_handles); i++) {
         uv_async_t* handle = container->async_handles + i;
    @@ -93,14 +93,14 @@ BENCHMARK_IMPL(million_async) {
     
       for (i = 0; i < ARRAY_SIZE(container->async_handles); i++) {
         handle = container->async_handles + i;
    -    ASSERT(0 == uv_async_init(loop, handle, async_cb));
    +    ASSERT_OK(uv_async_init(loop, handle, async_cb));
         handle->data = NULL;
       }
     
    -  ASSERT(0 == uv_timer_init(loop, &timer_handle));
    -  ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, timeout, 0));
    -  ASSERT(0 == uv_thread_create(&thread_id, thread_cb, NULL));
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_timer_init(loop, &timer_handle));
    +  ASSERT_OK(uv_timer_start(&timer_handle, timer_cb, timeout, 0));
    +  ASSERT_OK(uv_thread_create(&thread_id, thread_cb, NULL));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
       printf("%s async events in %.1f seconds (%s/s, %s unique handles seen)\n",
               fmt(&fmtbuf[0], container->async_events),
               timeout / 1000.,
    diff --git a/deps/uv/test/benchmark-million-timers.c b/deps/uv/test/benchmark-million-timers.c
    index b35fd5e788224d..fd999c469766f2 100644
    --- a/deps/uv/test/benchmark-million-timers.c
    +++ b/deps/uv/test/benchmark-million-timers.c
    @@ -57,22 +57,22 @@ BENCHMARK_IMPL(million_timers) {
       before_all = uv_hrtime();
       for (i = 0; i < NUM_TIMERS; i++) {
         if (i % 1000 == 0) timeout++;
    -    ASSERT(0 == uv_timer_init(loop, timers + i));
    -    ASSERT(0 == uv_timer_start(timers + i, timer_cb, timeout, 0));
    +    ASSERT_OK(uv_timer_init(loop, timers + i));
    +    ASSERT_OK(uv_timer_start(timers + i, timer_cb, timeout, 0));
       }
     
       before_run = uv_hrtime();
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
       after_run = uv_hrtime();
     
       for (i = 0; i < NUM_TIMERS; i++)
         uv_close((uv_handle_t*) (timers + i), close_cb);
     
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
       after_all = uv_hrtime();
     
    -  ASSERT(timer_cb_called == NUM_TIMERS);
    -  ASSERT(close_cb_called == NUM_TIMERS);
    +  ASSERT_EQ(timer_cb_called, NUM_TIMERS);
    +  ASSERT_EQ(close_cb_called, NUM_TIMERS);
       free(timers);
     
       fprintf(stderr, "%.2f seconds total\n", (after_all - before_all) / 1e9);
    diff --git a/deps/uv/test/benchmark-multi-accept.c b/deps/uv/test/benchmark-multi-accept.c
    index e2026276721b4e..1d19e330b2b7c7 100644
    --- a/deps/uv/test/benchmark-multi-accept.c
    +++ b/deps/uv/test/benchmark-multi-accept.c
    @@ -117,19 +117,19 @@ static void ipc_connection_cb(uv_stream_t* ipc_pipe, int status) {
       ASSERT_NOT_NULL(pc);
     
       if (ipc_pipe->type == UV_TCP)
    -    ASSERT(0 == uv_tcp_init(loop, (uv_tcp_t*) &pc->peer_handle));
    +    ASSERT_OK(uv_tcp_init(loop, (uv_tcp_t*) &pc->peer_handle));
       else if (ipc_pipe->type == UV_NAMED_PIPE)
    -    ASSERT(0 == uv_pipe_init(loop, (uv_pipe_t*) &pc->peer_handle, 1));
    +    ASSERT_OK(uv_pipe_init(loop, (uv_pipe_t*) &pc->peer_handle, 1));
       else
         ASSERT(0);
     
    -  ASSERT(0 == uv_accept(ipc_pipe, (uv_stream_t*) &pc->peer_handle));
    -  ASSERT(0 == uv_write2(&pc->write_req,
    -                        (uv_stream_t*) &pc->peer_handle,
    -                        &buf,
    -                        1,
    -                        (uv_stream_t*) &sc->server_handle,
    -                        ipc_write_cb));
    +  ASSERT_OK(uv_accept(ipc_pipe, (uv_stream_t*) &pc->peer_handle));
    +  ASSERT_OK(uv_write2(&pc->write_req,
    +                      (uv_stream_t*) &pc->peer_handle,
    +                      &buf,
    +                      1,
    +                      (uv_stream_t*) &sc->server_handle,
    +                      ipc_write_cb));
     
       if (--sc->num_connects == 0)
         uv_close((uv_handle_t*) ipc_pipe, NULL);
    @@ -153,10 +153,10 @@ static void ipc_close_cb(uv_handle_t* handle) {
     static void ipc_connect_cb(uv_connect_t* req, int status) {
       struct ipc_client_ctx* ctx;
       ctx = container_of(req, struct ipc_client_ctx, connect_req);
    -  ASSERT(0 == status);
    -  ASSERT(0 == uv_read_start((uv_stream_t*) &ctx->ipc_pipe,
    -                            ipc_alloc_cb,
    -                            ipc_read_cb));
    +  ASSERT_OK(status);
    +  ASSERT_OK(uv_read_start((uv_stream_t*) &ctx->ipc_pipe,
    +                          ipc_alloc_cb,
    +                          ipc_read_cb));
     }
     
     
    @@ -182,16 +182,16 @@ static void ipc_read_cb(uv_stream_t* handle,
       ctx = container_of(ipc_pipe, struct ipc_client_ctx, ipc_pipe);
       loop = ipc_pipe->loop;
     
    -  ASSERT(1 == uv_pipe_pending_count(ipc_pipe));
    +  ASSERT_EQ(1, uv_pipe_pending_count(ipc_pipe));
       type = uv_pipe_pending_type(ipc_pipe);
       if (type == UV_TCP)
    -    ASSERT(0 == uv_tcp_init(loop, (uv_tcp_t*) ctx->server_handle));
    +    ASSERT_OK(uv_tcp_init(loop, (uv_tcp_t*) ctx->server_handle));
       else if (type == UV_NAMED_PIPE)
    -    ASSERT(0 == uv_pipe_init(loop, (uv_pipe_t*) ctx->server_handle, 0));
    +    ASSERT_OK(uv_pipe_init(loop, (uv_pipe_t*) ctx->server_handle, 0));
       else
         ASSERT(0);
     
    -  ASSERT(0 == uv_accept(handle, ctx->server_handle));
    +  ASSERT_OK(uv_accept(handle, ctx->server_handle));
       uv_close((uv_handle_t*) &ctx->ipc_pipe, NULL);
     }
     
    @@ -211,10 +211,10 @@ static void send_listen_handles(uv_handle_type type,
       ctx.num_connects = num_servers;
     
       if (type == UV_TCP) {
    -    ASSERT(0 == uv_tcp_init(loop, (uv_tcp_t*) &ctx.server_handle));
    -    ASSERT(0 == uv_tcp_bind((uv_tcp_t*) &ctx.server_handle,
    -                            (const struct sockaddr*) &listen_addr,
    -                            0));
    +    ASSERT_OK(uv_tcp_init(loop, (uv_tcp_t*) &ctx.server_handle));
    +    ASSERT_OK(uv_tcp_bind((uv_tcp_t*) &ctx.server_handle,
    +                          (const struct sockaddr*) &listen_addr,
    +                          0));
       }
       else
         ASSERT(0);
    @@ -223,16 +223,16 @@ static void send_listen_handles(uv_handle_type type,
        * If we accept a connection then the connected pipe must be initialized
        * with ipc=1.
        */
    -  ASSERT(0 == uv_pipe_init(loop, &ctx.ipc_pipe, 0));
    -  ASSERT(0 == uv_pipe_bind(&ctx.ipc_pipe, IPC_PIPE_NAME));
    -  ASSERT(0 == uv_listen((uv_stream_t*) &ctx.ipc_pipe, 128, ipc_connection_cb));
    +  ASSERT_OK(uv_pipe_init(loop, &ctx.ipc_pipe, 0));
    +  ASSERT_OK(uv_pipe_bind(&ctx.ipc_pipe, IPC_PIPE_NAME));
    +  ASSERT_OK(uv_listen((uv_stream_t*) &ctx.ipc_pipe, 128, ipc_connection_cb));
     
       for (i = 0; i < num_servers; i++)
         uv_sem_post(&servers[i].semaphore);
     
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
       uv_close((uv_handle_t*) &ctx.server_handle, NULL);
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
     
       for (i = 0; i < num_servers; i++)
         uv_sem_wait(&servers[i].semaphore);
    @@ -245,12 +245,12 @@ static void get_listen_handle(uv_loop_t* loop, uv_stream_t* server_handle) {
       ctx.server_handle = server_handle;
       ctx.server_handle->data = "server handle";
     
    -  ASSERT(0 == uv_pipe_init(loop, &ctx.ipc_pipe, 1));
    +  ASSERT_OK(uv_pipe_init(loop, &ctx.ipc_pipe, 1));
       uv_pipe_connect(&ctx.connect_req,
                       &ctx.ipc_pipe,
                       IPC_PIPE_NAME,
                       ipc_connect_cb);
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
     }
     
     
    @@ -259,9 +259,9 @@ static void server_cb(void *arg) {
       uv_loop_t loop;
     
       ctx = arg;
    -  ASSERT(0 == uv_loop_init(&loop));
    +  ASSERT_OK(uv_loop_init(&loop));
     
    -  ASSERT(0 == uv_async_init(&loop, &ctx->async_handle, sv_async_cb));
    +  ASSERT_OK(uv_async_init(&loop, &ctx->async_handle, sv_async_cb));
       uv_unref((uv_handle_t*) &ctx->async_handle);
     
       /* Wait until the main thread is ready. */
    @@ -270,10 +270,10 @@ static void server_cb(void *arg) {
       uv_sem_post(&ctx->semaphore);
     
       /* Now start the actual benchmark. */
    -  ASSERT(0 == uv_listen((uv_stream_t*) &ctx->server_handle,
    -                        128,
    -                        sv_connection_cb));
    -  ASSERT(0 == uv_run(&loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_listen((uv_stream_t*) &ctx->server_handle,
    +                      128,
    +                      sv_connection_cb));
    +  ASSERT_OK(uv_run(&loop, UV_RUN_DEFAULT));
     
       uv_loop_close(&loop);
     }
    @@ -292,20 +292,20 @@ static void sv_connection_cb(uv_stream_t* server_handle, int status) {
       struct server_ctx* ctx;
     
       ctx = container_of(server_handle, struct server_ctx, server_handle);
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
       storage = malloc(sizeof(*storage));
       ASSERT_NOT_NULL(storage);
     
       if (server_handle->type == UV_TCP)
    -    ASSERT(0 == uv_tcp_init(server_handle->loop, (uv_tcp_t*) storage));
    +    ASSERT_OK(uv_tcp_init(server_handle->loop, (uv_tcp_t*) storage));
       else if (server_handle->type == UV_NAMED_PIPE)
    -    ASSERT(0 == uv_pipe_init(server_handle->loop, (uv_pipe_t*) storage, 0));
    +    ASSERT_OK(uv_pipe_init(server_handle->loop, (uv_pipe_t*) storage, 0));
       else
         ASSERT(0);
     
    -  ASSERT(0 == uv_accept(server_handle, (uv_stream_t*) storage));
    -  ASSERT(0 == uv_read_start((uv_stream_t*) storage, sv_alloc_cb, sv_read_cb));
    +  ASSERT_OK(uv_accept(server_handle, (uv_stream_t*) storage));
    +  ASSERT_OK(uv_read_start((uv_stream_t*) storage, sv_alloc_cb, sv_read_cb));
       ctx->num_connects++;
     }
     
    @@ -322,7 +322,7 @@ static void sv_alloc_cb(uv_handle_t* handle,
     static void sv_read_cb(uv_stream_t* handle,
                            ssize_t nread,
                            const uv_buf_t* buf) {
    -  ASSERT(nread == UV_EOF);
    +  ASSERT_EQ(nread, UV_EOF);
       uv_close((uv_handle_t*) handle, (uv_close_cb) free);
     }
     
    @@ -330,7 +330,7 @@ static void sv_read_cb(uv_stream_t* handle,
     static void cl_connect_cb(uv_connect_t* req, int status) {
       struct client_ctx* ctx = container_of(req, struct client_ctx, connect_req);
       uv_idle_start(&ctx->idle_handle, cl_idle_cb);
    -  ASSERT(0 == status);
    +  ASSERT_OK(status);
     }
     
     
    @@ -351,11 +351,11 @@ static void cl_close_cb(uv_handle_t* handle) {
         return;
       }
     
    -  ASSERT(0 == uv_tcp_init(handle->loop, (uv_tcp_t*) &ctx->client_handle));
    -  ASSERT(0 == uv_tcp_connect(&ctx->connect_req,
    -                             (uv_tcp_t*) &ctx->client_handle,
    -                             (const struct sockaddr*) &listen_addr,
    -                             cl_connect_cb));
    +  ASSERT_OK(uv_tcp_init(handle->loop, (uv_tcp_t*) &ctx->client_handle));
    +  ASSERT_OK(uv_tcp_connect(&ctx->connect_req,
    +                           (uv_tcp_t*) &ctx->client_handle,
    +                           (const struct sockaddr*) &listen_addr,
    +                           cl_connect_cb));
     }
     
     
    @@ -367,7 +367,7 @@ static int test_tcp(unsigned int num_servers, unsigned int num_clients) {
       unsigned int i;
       double time;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &listen_addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &listen_addr));
       loop = uv_default_loop();
     
       servers = calloc(num_servers, sizeof(servers[0]));
    @@ -381,8 +381,8 @@ static int test_tcp(unsigned int num_servers, unsigned int num_clients) {
        */
       for (i = 0; i < num_servers; i++) {
         struct server_ctx* ctx = servers + i;
    -    ASSERT(0 == uv_sem_init(&ctx->semaphore, 0));
    -    ASSERT(0 == uv_thread_create(&ctx->thread_id, server_cb, ctx));
    +    ASSERT_OK(uv_sem_init(&ctx->semaphore, 0));
    +    ASSERT_OK(uv_thread_create(&ctx->thread_id, server_cb, ctx));
       }
     
       send_listen_handles(UV_TCP, num_servers, servers);
    @@ -392,17 +392,17 @@ static int test_tcp(unsigned int num_servers, unsigned int num_clients) {
         ctx->num_connects = NUM_CONNECTS / num_clients;
         handle = (uv_tcp_t*) &ctx->client_handle;
         handle->data = "client handle";
    -    ASSERT(0 == uv_tcp_init(loop, handle));
    -    ASSERT(0 == uv_tcp_connect(&ctx->connect_req,
    -                               handle,
    -                               (const struct sockaddr*) &listen_addr,
    -                               cl_connect_cb));
    -    ASSERT(0 == uv_idle_init(loop, &ctx->idle_handle));
    +    ASSERT_OK(uv_tcp_init(loop, handle));
    +    ASSERT_OK(uv_tcp_connect(&ctx->connect_req,
    +                             handle,
    +                             (const struct sockaddr*) &listen_addr,
    +                             cl_connect_cb));
    +    ASSERT_OK(uv_idle_init(loop, &ctx->idle_handle));
       }
     
       {
         uint64_t t = uv_hrtime();
    -    ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    +    ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
         t = uv_hrtime() - t;
         time = t / 1e9;
       }
    @@ -410,7 +410,7 @@ static int test_tcp(unsigned int num_servers, unsigned int num_clients) {
       for (i = 0; i < num_servers; i++) {
         struct server_ctx* ctx = servers + i;
         uv_async_send(&ctx->async_handle);
    -    ASSERT(0 == uv_thread_join(&ctx->thread_id));
    +    ASSERT_OK(uv_thread_join(&ctx->thread_id));
         uv_sem_destroy(&ctx->semaphore);
       }
     
    diff --git a/deps/uv/test/benchmark-ping-pongs.c b/deps/uv/test/benchmark-ping-pongs.c
    index 0357704e66e3c9..fd5f40b91030d6 100644
    --- a/deps/uv/test/benchmark-ping-pongs.c
    +++ b/deps/uv/test/benchmark-ping-pongs.c
    @@ -90,7 +90,7 @@ static void pinger_close_cb(uv_handle_t* handle) {
     
     
     static void pinger_write_cb(uv_write_t* req, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
       free(req);
     }
    @@ -110,14 +110,14 @@ static void pinger_write_ping(pinger_t* pinger) {
     
     
     static void pinger_shutdown_cb(uv_shutdown_t* req, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       pinger_shutdown_cb_called++;
     
       /*
        * The close callback has not been triggered yet. We must wait for EOF
        * until we close the connection.
        */
    -  ASSERT(completed_pingers == 0);
    +  ASSERT_OK(completed_pingers);
     }
     
     
    @@ -130,13 +130,13 @@ static void pinger_read_cb(uv_stream_t* tcp,
       pinger = (pinger_t*)tcp->data;
     
       if (nread < 0) {
    -    ASSERT(nread == UV_EOF);
    +    ASSERT_EQ(nread, UV_EOF);
     
         if (buf->base) {
           buf_free(buf);
         }
     
    -    ASSERT(pinger_shutdown_cb_called == 1);
    +    ASSERT_EQ(1, pinger_shutdown_cb_called);
         uv_close((uv_handle_t*)tcp, pinger_close_cb);
     
         return;
    @@ -144,7 +144,7 @@ static void pinger_read_cb(uv_stream_t* tcp,
     
       /* Now we count the pings */
       for (i = 0; i < nread; i++) {
    -    ASSERT(buf->base[i] == PING[pinger->state]);
    +    ASSERT_EQ(buf->base[i], PING[pinger->state]);
         pinger->state = (pinger->state + 1) % (sizeof(PING) - 1);
         if (pinger->state == 0) {
           pinger->pongs++;
    @@ -166,7 +166,7 @@ static void pinger_read_cb(uv_stream_t* tcp,
     static void pinger_connect_cb(uv_connect_t* req, int status) {
       pinger_t *pinger = (pinger_t*)req->handle->data;
     
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
       pinger_write_ping(pinger);
     
    @@ -182,8 +182,8 @@ static void pinger_new(void) {
       pinger_t *pinger;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", 0, &client_addr));
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &server_addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", 0, &client_addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &server_addr));
       pinger = malloc(sizeof(*pinger));
       pinger->state = 0;
       pinger->pongs = 0;
    @@ -194,9 +194,9 @@ static void pinger_new(void) {
     
       pinger->tcp.data = pinger;
     
    -  ASSERT(0 == uv_tcp_bind(&pinger->tcp,
    -                          (const struct sockaddr*) &client_addr,
    -                          0));
    +  ASSERT_OK(uv_tcp_bind(&pinger->tcp,
    +                        (const struct sockaddr*) &client_addr,
    +                        0));
     
       r = uv_tcp_connect(&pinger->connect_req,
                          &pinger->tcp,
    @@ -214,7 +214,7 @@ BENCHMARK_IMPL(ping_pongs) {
       pinger_new();
       uv_run(loop, UV_RUN_DEFAULT);
     
    -  ASSERT(completed_pingers == 1);
    +  ASSERT_EQ(1, completed_pingers);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/benchmark-ping-udp.c b/deps/uv/test/benchmark-ping-udp.c
    index 3db8765bf9cf4c..2d2fe9c633926d 100644
    --- a/deps/uv/test/benchmark-ping-udp.c
    +++ b/deps/uv/test/benchmark-ping-udp.c
    @@ -95,11 +95,11 @@ static void pinger_read_cb(uv_udp_t* udp,
       pinger = (pinger_t*)udp->data;
     
       /* No data here means something went wrong */
    -  ASSERT(nread > 0);
    +  ASSERT_GT(nread, 0);
     
       /* Now we count the pings */
       for (i = 0; i < nread; i++) {
    -    ASSERT(buf->base[i] == PING[pinger->state]);
    +    ASSERT_EQ(buf->base[i], PING[pinger->state]);
         pinger->state = (pinger->state + 1) % (sizeof(PING) - 1);
         if (pinger->state == 0) {
           pinger->pongs++;
    @@ -119,15 +119,15 @@ static void udp_pinger_new(void) {
       pinger_t* pinger = malloc(sizeof(*pinger));
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &pinger->server_addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &pinger->server_addr));
       pinger->state = 0;
       pinger->pongs = 0;
     
       /* Try to do NUM_PINGS ping-pongs (connection-less). */
       r = uv_udp_init(loop, &pinger->udp);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_udp_bind(&pinger->udp, (const struct sockaddr*) &pinger->server_addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       pinger->udp.data = pinger;
     
    @@ -148,7 +148,7 @@ static int ping_udp(unsigned pingers) {
         udp_pinger_new();
       }
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(completed_pingers >= 1);
    +  ASSERT_GE(completed_pingers, 1);
     
       fprintf(stderr, "ping_pongs: %d pingers, ~ %lu roundtrips/s\n",
               completed_pingers, completed_pings / (TIME/1000));
    diff --git a/deps/uv/test/benchmark-pound.c b/deps/uv/test/benchmark-pound.c
    index acfe4497a2ed48..83ce522779a28b 100644
    --- a/deps/uv/test/benchmark-pound.c
    +++ b/deps/uv/test/benchmark-pound.c
    @@ -115,7 +115,7 @@ static void connect_cb(uv_connect_t* req, int status) {
       }
     
       ASSERT_NOT_NULL(req);
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
       conn = (conn_rec*)req->data;
       ASSERT_NOT_NULL(conn);
    @@ -125,13 +125,13 @@ static void connect_cb(uv_connect_t* req, int status) {
     #endif
     
       r = uv_read_start(&conn->stream, alloc_cb, read_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       buf.base = buffer;
       buf.len = sizeof(buffer) - 1;
     
       r = uv_write(&conn->write_req, &conn->stream, &buf, 1, after_write);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -200,9 +200,9 @@ static void tcp_make_connect(conn_rec* p) {
       tp = (tcp_conn_rec*) p;
     
       r = uv_tcp_init(loop, (uv_tcp_t*)&p->stream);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       r = uv_tcp_connect(&tp->conn_req,
                          (uv_tcp_t*) &p->stream,
    @@ -227,7 +227,7 @@ static void pipe_make_connect(conn_rec* p) {
       int r;
     
       r = uv_pipe_init(loop, (uv_pipe_t*)&p->stream, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_pipe_connect(&((pipe_conn_rec*) p)->conn_req,
                       (uv_pipe_t*) &p->stream,
    diff --git a/deps/uv/test/benchmark-pump.c b/deps/uv/test/benchmark-pump.c
    index 316c680996065e..8797668ee930ef 100644
    --- a/deps/uv/test/benchmark-pump.c
    +++ b/deps/uv/test/benchmark-pump.c
    @@ -159,9 +159,9 @@ static void start_stats_collection(void) {
       /* Show-stats timer */
       stats_left = STATS_COUNT;
       r = uv_timer_init(loop, &timer_handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_timer_start(&timer_handle, show_stats, STATS_INTERVAL, STATS_INTERVAL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_update_time(loop);
       start_time = uv_now(loop);
    @@ -170,7 +170,7 @@ static void start_stats_collection(void) {
     
     static void read_cb(uv_stream_t* stream, ssize_t bytes, const uv_buf_t* buf) {
       if (nrecv_total == 0) {
    -    ASSERT(start_time == 0);
    +    ASSERT_OK(start_time);
         uv_update_time(loop);
         start_time = uv_now(loop);
       }
    @@ -188,7 +188,7 @@ static void read_cb(uv_stream_t* stream, ssize_t bytes, const uv_buf_t* buf) {
     
     
     static void write_cb(uv_write_t* req, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
       req_free((uv_req_t*) req);
     
    @@ -209,7 +209,7 @@ static void do_write(uv_stream_t* stream) {
     
       req = (uv_write_t*) req_alloc();
       r = uv_write(req, stream, &buf, 1, write_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -220,7 +220,7 @@ static void connect_cb(uv_connect_t* req, int status) {
         fprintf(stderr, "%s", uv_strerror(status));
         fflush(stderr);
       }
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
       write_sockets++;
       req_free((uv_req_t*) req);
    @@ -253,19 +253,19 @@ static void maybe_connect_some(void) {
           tcp = &tcp_write_handles[max_connect_socket++];
     
           r = uv_tcp_init(loop, tcp);
    -      ASSERT(r == 0);
    +      ASSERT_OK(r);
     
           req = (uv_connect_t*) req_alloc();
           r = uv_tcp_connect(req,
                              tcp,
                              (const struct sockaddr*) &connect_addr,
                              connect_cb);
    -      ASSERT(r == 0);
    +      ASSERT_OK(r);
         } else {
           pipe = &pipe_write_handles[max_connect_socket++];
     
           r = uv_pipe_init(loop, pipe, 0);
    -      ASSERT(r == 0);
    +      ASSERT_OK(r);
     
           req = (uv_connect_t*) req_alloc();
           uv_pipe_connect(req, pipe, TEST_PIPENAME, connect_cb);
    @@ -278,24 +278,24 @@ static void connection_cb(uv_stream_t* s, int status) {
       uv_stream_t* stream;
       int r;
     
    -  ASSERT(server == s);
    -  ASSERT(status == 0);
    +  ASSERT_PTR_EQ(server, s);
    +  ASSERT_OK(status);
     
       if (type == TCP) {
         stream = (uv_stream_t*)malloc(sizeof(uv_tcp_t));
         r = uv_tcp_init(loop, (uv_tcp_t*)stream);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       } else {
         stream = (uv_stream_t*)malloc(sizeof(uv_pipe_t));
         r = uv_pipe_init(loop, (uv_pipe_t*)stream, 0);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     
       r = uv_accept(s, stream);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_read_start(stream, buf_alloc, read_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       read_sockets++;
       max_read_sockets++;
    @@ -379,16 +379,16 @@ HELPER_IMPL(tcp_pump_server) {
       type = TCP;
       loop = uv_default_loop();
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &listen_addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &listen_addr));
     
       /* Server */
       server = (uv_stream_t*)&tcpServer;
       r = uv_tcp_init(loop, &tcpServer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_tcp_bind(&tcpServer, (const struct sockaddr*) &listen_addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_listen((uv_stream_t*)&tcpServer, MAX_WRITE_HANDLES, connection_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       notify_parent_process();
       uv_run(loop, UV_RUN_DEFAULT);
    @@ -406,11 +406,11 @@ HELPER_IMPL(pipe_pump_server) {
       /* Server */
       server = (uv_stream_t*)&pipeServer;
       r = uv_pipe_init(loop, &pipeServer, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_pipe_bind(&pipeServer, TEST_PIPENAME);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_listen((uv_stream_t*)&pipeServer, MAX_WRITE_HANDLES, connection_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       notify_parent_process();
       uv_run(loop, UV_RUN_DEFAULT);
    @@ -421,13 +421,13 @@ HELPER_IMPL(pipe_pump_server) {
     
     
     static void tcp_pump(int n) {
    -  ASSERT(n <= MAX_WRITE_HANDLES);
    +  ASSERT_LE(n, MAX_WRITE_HANDLES);
       TARGET_CONNECTIONS = n;
       type = TCP;
     
       loop = uv_default_loop();
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &connect_addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &connect_addr));
     
       /* Start making connections */
       maybe_connect_some();
    @@ -439,7 +439,7 @@ static void tcp_pump(int n) {
     
     
     static void pipe_pump(int n) {
    -  ASSERT(n <= MAX_WRITE_HANDLES);
    +  ASSERT_LE(n, MAX_WRITE_HANDLES);
       TARGET_CONNECTIONS = n;
       type = PIPE;
     
    diff --git a/deps/uv/test/benchmark-queue-work.c b/deps/uv/test/benchmark-queue-work.c
    index 6e7b74becf63b4..5ae0883101fed8 100644
    --- a/deps/uv/test/benchmark-queue-work.c
    +++ b/deps/uv/test/benchmark-queue-work.c
    @@ -40,7 +40,7 @@ static void work_cb(uv_work_t* req) {
     static void after_work_cb(uv_work_t* req, int status) {
       events++;
       if (!done)
    -    ASSERT_EQ(0, uv_queue_work(req->loop, req, work_cb, after_work_cb));
    +    ASSERT_OK(uv_queue_work(req->loop, req, work_cb, after_work_cb));
     }
     
     static void timer_cb(uv_timer_t* handle) { done = 1; }
    @@ -55,11 +55,11 @@ BENCHMARK_IMPL(queue_work) {
       loop = uv_default_loop();
       timeout = 5000;
     
    -  ASSERT_EQ(0, uv_timer_init(loop, &timer_handle));
    -  ASSERT_EQ(0, uv_timer_start(&timer_handle, timer_cb, timeout, 0));
    +  ASSERT_OK(uv_timer_init(loop, &timer_handle));
    +  ASSERT_OK(uv_timer_start(&timer_handle, timer_cb, timeout, 0));
     
    -  ASSERT_EQ(0, uv_queue_work(loop, &work, work_cb, after_work_cb));
    -  ASSERT_EQ(0, uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_queue_work(loop, &work, work_cb, after_work_cb));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
     
       printf("%s async jobs in %.1f seconds (%s/s)\n",
              fmt(&fmtbuf[0], events),
    diff --git a/deps/uv/test/benchmark-spawn.c b/deps/uv/test/benchmark-spawn.c
    index bdaf6c1a254e19..ef27b385e7a04f 100644
    --- a/deps/uv/test/benchmark-spawn.c
    +++ b/deps/uv/test/benchmark-spawn.c
    @@ -58,7 +58,7 @@ static void maybe_spawn(void) {
     
     
     static void process_close_cb(uv_handle_t* handle) {
    -  ASSERT(process_open == 1);
    +  ASSERT_EQ(1, process_open);
       process_open = 0;
       maybe_spawn();
     }
    @@ -67,8 +67,8 @@ static void process_close_cb(uv_handle_t* handle) {
     static void exit_cb(uv_process_t* process,
                         int64_t exit_status,
                         int term_signal) {
    -  ASSERT(exit_status == 42);
    -  ASSERT(term_signal == 0);
    +  ASSERT_EQ(42, exit_status);
    +  ASSERT_OK(term_signal);
       uv_close((uv_handle_t*)process, process_close_cb);
     }
     
    @@ -82,7 +82,7 @@ static void on_alloc(uv_handle_t* handle,
     
     
     static void pipe_close_cb(uv_handle_t* pipe) {
    -  ASSERT(pipe_open == 1);
    +  ASSERT_EQ(1, pipe_open);
       pipe_open = 0;
       maybe_spawn();
     }
    @@ -90,7 +90,7 @@ static void pipe_close_cb(uv_handle_t* pipe) {
     
     static void on_read(uv_stream_t* pipe, ssize_t nread, const uv_buf_t* buf) {
       if (nread > 0) {
    -    ASSERT(pipe_open == 1);
    +    ASSERT_EQ(1, pipe_open);
         output_used += nread;
       } else if (nread < 0) {
         if (nread == UV_EOF) {
    @@ -104,8 +104,8 @@ static void spawn(void) {
       uv_stdio_container_t stdio[2];
       int r;
     
    -  ASSERT(process_open == 0);
    -  ASSERT(pipe_open == 0);
    +  ASSERT_OK(process_open);
    +  ASSERT_OK(pipe_open);
     
       args[0] = exepath;
       args[1] = "spawn_helper";
    @@ -123,14 +123,14 @@ static void spawn(void) {
       options.stdio[1].data.stream = (uv_stream_t*)&out;
     
       r = uv_spawn(loop, &process, &options);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       process_open = 1;
       pipe_open = 1;
       output_used = 0;
     
       r = uv_read_start((uv_stream_t*) &out, on_alloc, on_read);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -141,7 +141,7 @@ BENCHMARK_IMPL(spawn) {
       loop = uv_default_loop();
     
       r = uv_exepath(exepath, &exepath_size);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       exepath[exepath_size] = '\0';
     
       uv_update_time(loop);
    @@ -150,7 +150,7 @@ BENCHMARK_IMPL(spawn) {
       spawn();
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_update_time(loop);
       end_time = uv_now(loop);
    diff --git a/deps/uv/test/benchmark-tcp-write-batch.c b/deps/uv/test/benchmark-tcp-write-batch.c
    index aedefb742559c5..9dfcf14eb09e16 100644
    --- a/deps/uv/test/benchmark-tcp-write-batch.c
    +++ b/deps/uv/test/benchmark-tcp-write-batch.c
    @@ -55,16 +55,16 @@ static void connect_cb(uv_connect_t* req, int status) {
       int i;
       int r;
     
    -  ASSERT(req->handle == (uv_stream_t*)&tcp_client);
    +  ASSERT_PTR_EQ(req->handle, (uv_stream_t*)&tcp_client);
     
       for (i = 0; i < NUM_WRITE_REQS; i++) {
         w = &write_reqs[i];
         r = uv_write(&w->req, req->handle, &w->buf, 1, write_cb);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     
       r = uv_shutdown(&shutdown_req, req->handle, shutdown_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       connect_cb_called++;
     }
    @@ -72,14 +72,14 @@ static void connect_cb(uv_connect_t* req, int status) {
     
     static void write_cb(uv_write_t* req, int status) {
       ASSERT_NOT_NULL(req);
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       write_cb_called++;
     }
     
     
     static void shutdown_cb(uv_shutdown_t* req, int status) {
    -  ASSERT(req->handle == (uv_stream_t*)&tcp_client);
    -  ASSERT(req->handle->write_queue_size == 0);
    +  ASSERT_PTR_EQ(req->handle, (uv_stream_t*)&tcp_client);
    +  ASSERT_OK(req->handle->write_queue_size);
     
       uv_close((uv_handle_t*)req->handle, close_cb);
       free(write_reqs);
    @@ -89,7 +89,7 @@ static void shutdown_cb(uv_shutdown_t* req, int status) {
     
     
     static void close_cb(uv_handle_t* handle) {
    -  ASSERT(handle == (uv_handle_t*)&tcp_client);
    +  ASSERT_PTR_EQ(handle, (uv_handle_t*)&tcp_client);
       close_cb_called++;
     }
     
    @@ -112,28 +112,28 @@ BENCHMARK_IMPL(tcp_write_batch) {
       }
     
       loop = uv_default_loop();
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       r = uv_tcp_init(loop, &tcp_client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_connect(&connect_req,
                          &tcp_client,
                          (const struct sockaddr*) &addr,
                          connect_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       start = uv_hrtime();
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       stop = uv_hrtime();
     
    -  ASSERT(connect_cb_called == 1);
    -  ASSERT(write_cb_called == NUM_WRITE_REQS);
    -  ASSERT(shutdown_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, connect_cb_called);
    +  ASSERT_EQ(write_cb_called, NUM_WRITE_REQS);
    +  ASSERT_EQ(1, shutdown_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       printf("%ld write requests in %.2fs.\n",
              (long)NUM_WRITE_REQS,
    diff --git a/deps/uv/test/benchmark-thread.c b/deps/uv/test/benchmark-thread.c
    index b37a7fd6d01c92..b339e7caad920d 100644
    --- a/deps/uv/test/benchmark-thread.c
    +++ b/deps/uv/test/benchmark-thread.c
    @@ -31,7 +31,7 @@ static volatile int num_threads;
     
     
     static void thread_entry(void* arg) {
    -  ASSERT(arg == (void *) 42);
    +  ASSERT_PTR_EQ(arg, (void *) 42);
       num_threads++;
       /* FIXME write barrier? */
     }
    @@ -47,15 +47,15 @@ BENCHMARK_IMPL(thread_create) {
     
       for (i = 0; i < NUM_THREADS; i++) {
         r = uv_thread_create(&tid, thread_entry, (void *) 42);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
         r = uv_thread_join(&tid);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     
       duration = (uv_hrtime() - start_time) / 1e9;
     
    -  ASSERT(num_threads == NUM_THREADS);
    +  ASSERT_EQ(num_threads, NUM_THREADS);
     
       printf("%d threads created in %.2f seconds (%.0f/s)\n",
           NUM_THREADS, duration, NUM_THREADS / duration);
    diff --git a/deps/uv/test/benchmark-udp-pummel.c b/deps/uv/test/benchmark-udp-pummel.c
    index f89913b6cebad0..7b7e1afad7d491 100644
    --- a/deps/uv/test/benchmark-udp-pummel.c
    +++ b/deps/uv/test/benchmark-udp-pummel.c
    @@ -63,7 +63,7 @@ static void alloc_cb(uv_handle_t* handle,
                          size_t suggested_size,
                          uv_buf_t* buf) {
       static char slab[65536];
    -  ASSERT(suggested_size <= sizeof(slab));
    +  ASSERT_LE(suggested_size, sizeof(slab));
       buf->base = slab;
       buf->len = sizeof(slab);
     }
    @@ -75,7 +75,7 @@ static void send_cb(uv_udp_send_t* req, int status) {
       ASSERT_NOT_NULL(req);
     
       if (status != 0) {
    -    ASSERT(status == UV_ECANCELED);
    +    ASSERT_EQ(status, UV_ECANCELED);
         return;
       }
     
    @@ -83,7 +83,7 @@ static void send_cb(uv_udp_send_t* req, int status) {
         return;
     
       s = container_of(req, struct sender_state, send_req);
    -  ASSERT(req->handle == &s->udp_handle);
    +  ASSERT_PTR_EQ(req->handle, &s->udp_handle);
     
       if (timed)
         goto send;
    @@ -96,12 +96,12 @@ static void send_cb(uv_udp_send_t* req, int status) {
       packet_counter--;
     
     send:
    -  ASSERT(0 == uv_udp_send(&s->send_req,
    -                          &s->udp_handle,
    -                          bufs,
    -                          ARRAY_SIZE(bufs),
    -                          (const struct sockaddr*) &s->addr,
    -                          send_cb));
    +  ASSERT_OK(uv_udp_send(&s->send_req,
    +                        &s->udp_handle,
    +                        bufs,
    +                        ARRAY_SIZE(bufs),
    +                        (const struct sockaddr*) &s->addr,
    +                        send_cb));
       send_cb_called++;
     }
     
    @@ -115,11 +115,11 @@ static void recv_cb(uv_udp_t* handle,
         return;
     
       if (nread < 0) {
    -    ASSERT(nread == UV_ECANCELED);
    +    ASSERT_EQ(nread, UV_ECANCELED);
         return;
       }
     
    -  ASSERT(addr->sa_family == AF_INET);
    +  ASSERT_EQ(addr->sa_family, AF_INET);
       ASSERT(!memcmp(buf->base, EXPECTED, nread));
     
       recv_cb_called++;
    @@ -153,8 +153,8 @@ static int pummel(unsigned int n_senders,
       uv_loop_t* loop;
       unsigned int i;
     
    -  ASSERT(n_senders <= ARRAY_SIZE(senders));
    -  ASSERT(n_receivers <= ARRAY_SIZE(receivers));
    +  ASSERT_LE(n_senders, ARRAY_SIZE(senders));
    +  ASSERT_LE(n_receivers, ARRAY_SIZE(receivers));
     
       loop = uv_default_loop();
     
    @@ -162,8 +162,8 @@ static int pummel(unsigned int n_senders,
       n_receivers_ = n_receivers;
     
       if (timeout) {
    -    ASSERT(0 == uv_timer_init(loop, &timer_handle));
    -    ASSERT(0 == uv_timer_start(&timer_handle, timeout_cb, timeout, 0));
    +    ASSERT_OK(uv_timer_init(loop, &timer_handle));
    +    ASSERT_OK(uv_timer_start(&timer_handle, timeout_cb, timeout, 0));
         /* Timer should not keep loop alive. */
         uv_unref((uv_handle_t*)&timer_handle);
         timed = 1;
    @@ -172,10 +172,10 @@ static int pummel(unsigned int n_senders,
       for (i = 0; i < n_receivers; i++) {
         struct receiver_state* s = receivers + i;
         struct sockaddr_in addr;
    -    ASSERT(0 == uv_ip4_addr("0.0.0.0", BASE_PORT + i, &addr));
    -    ASSERT(0 == uv_udp_init(loop, &s->udp_handle));
    -    ASSERT(0 == uv_udp_bind(&s->udp_handle, (const struct sockaddr*) &addr, 0));
    -    ASSERT(0 == uv_udp_recv_start(&s->udp_handle, alloc_cb, recv_cb));
    +    ASSERT_OK(uv_ip4_addr("0.0.0.0", BASE_PORT + i, &addr));
    +    ASSERT_OK(uv_udp_init(loop, &s->udp_handle));
    +    ASSERT_OK(uv_udp_bind(&s->udp_handle, (const struct sockaddr*) &addr, 0));
    +    ASSERT_OK(uv_udp_recv_start(&s->udp_handle, alloc_cb, recv_cb));
         uv_unref((uv_handle_t*)&s->udp_handle);
       }
     
    @@ -187,20 +187,20 @@ static int pummel(unsigned int n_senders,
     
       for (i = 0; i < n_senders; i++) {
         struct sender_state* s = senders + i;
    -    ASSERT(0 == uv_ip4_addr("127.0.0.1",
    -                            BASE_PORT + (i % n_receivers),
    -                            &s->addr));
    -    ASSERT(0 == uv_udp_init(loop, &s->udp_handle));
    -    ASSERT(0 == uv_udp_send(&s->send_req,
    -                            &s->udp_handle,
    -                            bufs,
    -                            ARRAY_SIZE(bufs),
    -                            (const struct sockaddr*) &s->addr,
    -                            send_cb));
    +    ASSERT_OK(uv_ip4_addr("127.0.0.1",
    +                          BASE_PORT + (i % n_receivers),
    +                          &s->addr));
    +    ASSERT_OK(uv_udp_init(loop, &s->udp_handle));
    +    ASSERT_OK(uv_udp_send(&s->send_req,
    +                          &s->udp_handle,
    +                          bufs,
    +                          ARRAY_SIZE(bufs),
    +                          (const struct sockaddr*) &s->addr,
    +                          send_cb));
       }
     
       duration = uv_hrtime();
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
       duration = uv_hrtime() - duration;
       /* convert from nanoseconds to milliseconds */
       duration = duration / (uint64_t) 1e6;
    diff --git a/deps/uv/test/blackhole-server.c b/deps/uv/test/blackhole-server.c
    index 0a8758e1a1733b..79d6146f47920d 100644
    --- a/deps/uv/test/blackhole-server.c
    +++ b/deps/uv/test/blackhole-server.c
    @@ -43,20 +43,20 @@ static void connection_cb(uv_stream_t* stream, int status) {
       conn_rec* conn;
       int r;
     
    -  ASSERT(status == 0);
    -  ASSERT(stream == (uv_stream_t*)&tcp_server);
    +  ASSERT_OK(status);
    +  ASSERT_PTR_EQ(stream, (uv_stream_t*)&tcp_server);
     
       conn = malloc(sizeof *conn);
       ASSERT_NOT_NULL(conn);
     
       r = uv_tcp_init(stream->loop, &conn->handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_accept(stream, (uv_stream_t*)&conn->handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_read_start((uv_stream_t*)&conn->handle, alloc_cb, read_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -76,12 +76,12 @@ static void read_cb(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) {
       if (nread >= 0)
         return;
     
    -  ASSERT(nread == UV_EOF);
    +  ASSERT_EQ(nread, UV_EOF);
     
       conn = container_of(stream, conn_rec, handle);
     
       r = uv_shutdown(&conn->shutdown_req, stream, shutdown_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -103,16 +103,16 @@ HELPER_IMPL(tcp4_blackhole_server) {
       int r;
     
       loop = uv_default_loop();
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       r = uv_tcp_init(loop, &tcp_server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_listen((uv_stream_t*)&tcp_server, 128, connection_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       notify_parent_process();
       r = uv_run(loop, UV_RUN_DEFAULT);
    diff --git a/deps/uv/test/echo-server.c b/deps/uv/test/echo-server.c
    index 058c9925475c94..572f87df51ed7f 100644
    --- a/deps/uv/test/echo-server.c
    +++ b/deps/uv/test/echo-server.c
    @@ -65,14 +65,14 @@ static void after_write(uv_write_t* req, int status) {
     
     
     static void after_shutdown(uv_shutdown_t* req, int status) {
    -  ASSERT_EQ(status, 0);
    +  ASSERT_OK(status);
       uv_close((uv_handle_t*) req->handle, on_close);
       free(req);
     }
     
     
     static void on_shutdown(uv_shutdown_t* req, int status) {
    -  ASSERT_EQ(status, 0);
    +  ASSERT_OK(status);
       free(req);
     }
     
    @@ -92,7 +92,7 @@ static void after_read(uv_stream_t* handle,
         free(buf->base);
         sreq = malloc(sizeof* sreq);
         if (uv_is_writable(handle)) {
    -      ASSERT_EQ(0, uv_shutdown(sreq, handle, after_shutdown));
    +      ASSERT_OK(uv_shutdown(sreq, handle, after_shutdown));
         }
         return;
       }
    @@ -118,7 +118,7 @@ static void after_read(uv_stream_t* handle,
             if (i + 2 < nread && buf->base[i + 2] == 'H')
               reset = 1;
             if (reset && handle->type == UV_TCP)
    -          ASSERT_EQ(0, uv_tcp_close_reset((uv_tcp_t*) handle, on_close));
    +          ASSERT_OK(uv_tcp_close_reset((uv_tcp_t*) handle, on_close));
             else if (shutdown)
               break;
             else
    @@ -141,7 +141,7 @@ static void after_read(uv_stream_t* handle,
       }
     
       if (shutdown)
    -    ASSERT_EQ(0, uv_shutdown(malloc(sizeof* sreq), handle, on_shutdown));
    +    ASSERT_OK(uv_shutdown(malloc(sizeof* sreq), handle, on_shutdown));
     }
     
     
    @@ -173,21 +173,21 @@ static void on_connection(uv_stream_t* server, int status) {
       if (status != 0) {
         fprintf(stderr, "Connect error %s\n", uv_err_name(status));
       }
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
       switch (serverType) {
       case TCP:
         stream = malloc(sizeof(uv_tcp_t));
         ASSERT_NOT_NULL(stream);
         r = uv_tcp_init(loop, (uv_tcp_t*)stream);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         break;
     
       case PIPE:
         stream = malloc(sizeof(uv_pipe_t));
         ASSERT_NOT_NULL(stream);
         r = uv_pipe_init(loop, (uv_pipe_t*)stream, 0);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         break;
     
       default:
    @@ -199,15 +199,15 @@ static void on_connection(uv_stream_t* server, int status) {
       stream->data = server;
     
       r = uv_accept(server, stream);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_read_start(stream, echo_alloc, after_read);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
     static void on_server_close(uv_handle_t* handle) {
    -  ASSERT(handle == server);
    +  ASSERT_PTR_EQ(handle, server);
     }
     
     static uv_udp_send_t* send_alloc(void) {
    @@ -221,7 +221,7 @@ static uv_udp_send_t* send_alloc(void) {
     
     static void on_send(uv_udp_send_t* req, int status) {
       ASSERT_NOT_NULL(req);
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       req->data = send_freelist;
       send_freelist = req;
     }
    @@ -239,20 +239,20 @@ static void on_recv(uv_udp_t* handle,
         return;
       }
     
    -  ASSERT(nread > 0);
    -  ASSERT(addr->sa_family == AF_INET);
    +  ASSERT_GT(nread, 0);
    +  ASSERT_EQ(addr->sa_family, AF_INET);
     
       req = send_alloc();
       ASSERT_NOT_NULL(req);
       sndbuf = uv_buf_init(rcvbuf->base, nread);
    -  ASSERT(0 <= uv_udp_send(req, handle, &sndbuf, 1, addr, on_send));
    +  ASSERT_LE(0, uv_udp_send(req, handle, &sndbuf, 1, addr, on_send));
     }
     
     static int tcp4_echo_start(int port) {
       struct sockaddr_in addr;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", port, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", port, &addr));
     
       server = (uv_handle_t*)&tcpServer;
       serverType = TCP;
    @@ -286,7 +286,7 @@ static int tcp6_echo_start(int port) {
       struct sockaddr_in6 addr6;
       int r;
     
    -  ASSERT(0 == uv_ip6_addr("::1", port, &addr6));
    +  ASSERT_OK(uv_ip6_addr("::1", port, &addr6));
     
       server = (uv_handle_t*)&tcpServer;
       serverType = TCP;
    @@ -321,7 +321,7 @@ static int udp4_echo_start(int port) {
       struct sockaddr_in addr;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", port, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", port, &addr));
       server = (uv_handle_t*)&udpServer;
       serverType = UDP;
     
    diff --git a/deps/uv/test/run-tests.c b/deps/uv/test/run-tests.c
    index d8cfe297c49524..97fec52f1d8b06 100644
    --- a/deps/uv/test/run-tests.c
    +++ b/deps/uv/test/run-tests.c
    @@ -145,7 +145,7 @@ static int maybe_run_test(int argc, char **argv) {
       if (strcmp(argv[1], "spawn_helper3") == 0) {
         char buffer[256];
         notify_parent_process();
    -    ASSERT(buffer == fgets(buffer, sizeof(buffer) - 1, stdin));
    +    ASSERT_PTR_EQ(buffer, fgets(buffer, sizeof(buffer) - 1, stdin));
         buffer[sizeof(buffer) - 1] = '\0';
         fputs(buffer, stdout);
         return 1;
    @@ -183,10 +183,10 @@ static int maybe_run_test(int argc, char **argv) {
         notify_parent_process();
     
         r = fprintf(stdout, "hello world\n");
    -    ASSERT(r > 0);
    +    ASSERT_GT(r, 0);
     
         r = fprintf(stderr, "hello errworld\n");
    -    ASSERT(r > 0);
    +    ASSERT_GT(r, 0);
     
         return 1;
       }
    @@ -202,7 +202,7 @@ static int maybe_run_test(int argc, char **argv) {
         ASSERT_NOT_NULL(test);
     
         r = fprintf(stdout, "%s", test);
    -    ASSERT(r > 0);
    +    ASSERT_GT(r, 0);
     
         return 1;
       }
    @@ -216,23 +216,24 @@ static int maybe_run_test(int argc, char **argv) {
         sCompareObjectHandles pCompareObjectHandles; /* function introduced in Windows 10 */
     #endif
         notify_parent_process();
    -    ASSERT(sizeof(closed_fd) == read(0, &closed_fd, sizeof(closed_fd)));
    -    ASSERT(sizeof(open_fd) == read(0, &open_fd, sizeof(open_fd)));
    +    ASSERT_EQ(sizeof(closed_fd), read(0, &closed_fd, sizeof(closed_fd)));
    +    ASSERT_EQ(sizeof(open_fd), read(0, &open_fd, sizeof(open_fd)));
     #ifdef _WIN32
    -    ASSERT((intptr_t) closed_fd > 0);
    -    ASSERT((intptr_t) open_fd > 0);
    -    ASSERT(0 != GetHandleInformation(open_fd, &flags));
    +    ASSERT_GT((intptr_t) closed_fd, 0);
    +    ASSERT_GT((intptr_t) open_fd, 0);
    +    ASSERT_NE(0, GetHandleInformation(open_fd, &flags));
         kernelbase_module = GetModuleHandleA("kernelbase.dll");
         pCompareObjectHandles = (sCompareObjectHandles)
             GetProcAddress(kernelbase_module, "CompareObjectHandles");
    -    ASSERT(pCompareObjectHandles == NULL || !pCompareObjectHandles(open_fd, closed_fd));
    +    ASSERT_NE(pCompareObjectHandles == NULL || \
    +              !pCompareObjectHandles(open_fd, closed_fd), 0);
     #else
    -    ASSERT(open_fd > 2);
    -    ASSERT(closed_fd > 2);
    +    ASSERT_GT(open_fd, 2);
    +    ASSERT_GT(closed_fd, 2);
     # if defined(__PASE__)  /* On IBMi PASE, write() returns 1 */
    -    ASSERT(1 == write(closed_fd, "x", 1));
    +    ASSERT_EQ(1, write(closed_fd, "x", 1));
     # else
    -    ASSERT(-1 == write(closed_fd, "x", 1));
    +    ASSERT_EQ(-1, write(closed_fd, "x", 1));
     # endif  /* !__PASE__ */
     #endif
         return 1;
    @@ -249,8 +250,8 @@ static int maybe_run_test(int argc, char **argv) {
         uv_uid_t uid = atoi(argv[2]);
         uv_gid_t gid = atoi(argv[3]);
     
    -    ASSERT(uid == getuid());
    -    ASSERT(gid == getgid());
    +    ASSERT_EQ(uid, getuid());
    +    ASSERT_EQ(gid, getgid());
         notify_parent_process();
     
         return 1;
    diff --git a/deps/uv/test/runner-win.c b/deps/uv/test/runner-win.c
    index 8c2a00b8a620c2..61d6f1431be9e3 100644
    --- a/deps/uv/test/runner-win.c
    +++ b/deps/uv/test/runner-win.c
    @@ -185,7 +185,7 @@ int process_wait(process_info_t *vec, int n, int timeout) {
       if (n == 0)
         return 0;
     
    -  ASSERT(n <= MAXIMUM_WAIT_OBJECTS);
    +  ASSERT_LE(n, MAXIMUM_WAIT_OBJECTS);
     
       for (i = 0; i < n; i++)
         handles[i] = vec[i].process;
    @@ -245,7 +245,7 @@ int process_read_last_line(process_info_t *p,
       DWORD start;
       OVERLAPPED overlapped;
     
    -  ASSERT(buffer_len > 0);
    +  ASSERT_GT(buffer_len, 0);
     
       size = GetFileSize(p->stdio_out, NULL);
       if (size == INVALID_FILE_SIZE)
    diff --git a/deps/uv/test/task.h b/deps/uv/test/task.h
    index fa6cc0ed535a5c..8b8353263da90f 100644
    --- a/deps/uv/test/task.h
    +++ b/deps/uv/test/task.h
    @@ -244,13 +244,16 @@ typedef enum {
     #define ASSERT_PTR_NE(a, b) \
       ASSERT_BASE(a, !=, b, void*, "p")
     
    +#define ASSERT_PTR_LT(a, b) \
    +  ASSERT_BASE(a, <, b, void*, "p")
    +
     /* This macro cleans up the event loop. This is used to avoid valgrind
      * warnings about memory being "leaked" by the event loop.
      */
     #define MAKE_VALGRIND_HAPPY(loop)                   \
       do {                                              \
         close_loop(loop);                               \
    -    ASSERT(0 == uv_loop_close(loop));               \
    +    ASSERT_EQ(0, uv_loop_close(loop));              \
         uv_library_shutdown();                          \
       } while (0)
     
    diff --git a/deps/uv/test/test-active.c b/deps/uv/test/test-active.c
    index aaff97087b190d..fadbd10d228db8 100644
    --- a/deps/uv/test/test-active.c
    +++ b/deps/uv/test/test-active.c
    @@ -45,39 +45,39 @@ TEST_IMPL(active) {
       uv_timer_t timer;
     
       r = uv_timer_init(uv_default_loop(), &timer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* uv_is_active() and uv_is_closing() should always return either 0 or 1. */
    -  ASSERT(0 == uv_is_active((uv_handle_t*) &timer));
    -  ASSERT(0 == uv_is_closing((uv_handle_t*) &timer));
    +  ASSERT_OK(uv_is_active((uv_handle_t*) &timer));
    +  ASSERT_OK(uv_is_closing((uv_handle_t*) &timer));
     
       r = uv_timer_start(&timer, timer_cb, 1000, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(1 == uv_is_active((uv_handle_t*) &timer));
    -  ASSERT(0 == uv_is_closing((uv_handle_t*) &timer));
    +  ASSERT_EQ(1, uv_is_active((uv_handle_t*) &timer));
    +  ASSERT_OK(uv_is_closing((uv_handle_t*) &timer));
     
       r = uv_timer_stop(&timer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(0 == uv_is_active((uv_handle_t*) &timer));
    -  ASSERT(0 == uv_is_closing((uv_handle_t*) &timer));
    +  ASSERT_OK(uv_is_active((uv_handle_t*) &timer));
    +  ASSERT_OK(uv_is_closing((uv_handle_t*) &timer));
     
       r = uv_timer_start(&timer, timer_cb, 1000, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(1 == uv_is_active((uv_handle_t*) &timer));
    -  ASSERT(0 == uv_is_closing((uv_handle_t*) &timer));
    +  ASSERT_EQ(1, uv_is_active((uv_handle_t*) &timer));
    +  ASSERT_OK(uv_is_closing((uv_handle_t*) &timer));
     
       uv_close((uv_handle_t*) &timer, close_cb);
     
    -  ASSERT(0 == uv_is_active((uv_handle_t*) &timer));
    -  ASSERT(1 == uv_is_closing((uv_handle_t*) &timer));
    +  ASSERT_OK(uv_is_active((uv_handle_t*) &timer));
    +  ASSERT_EQ(1, uv_is_closing((uv_handle_t*) &timer));
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-async-null-cb.c b/deps/uv/test/test-async-null-cb.c
    index 1bdd0e032497a9..ac9fc899c7aa4b 100644
    --- a/deps/uv/test/test-async-null-cb.c
    +++ b/deps/uv/test/test-async-null-cb.c
    @@ -36,7 +36,7 @@ static void thread_cb(void* dummy) {
     
     
     static void check_cb(uv_check_t* handle) {
    -  ASSERT(check_cb_called == 0);
    +  ASSERT_OK(check_cb_called);
       uv_close((uv_handle_t*) &async_handle, NULL);
       uv_close((uv_handle_t*) &check_handle, NULL);
       check_cb_called++;
    @@ -52,13 +52,13 @@ TEST_IMPL(async_null_cb) {
        */
       memset(&async_handle, 0xff, sizeof(async_handle));
     
    -  ASSERT(0 == uv_async_init(uv_default_loop(), &async_handle, NULL));
    -  ASSERT(0 == uv_check_init(uv_default_loop(), &check_handle));
    -  ASSERT(0 == uv_check_start(&check_handle, check_cb));
    -  ASSERT(0 == uv_thread_create(&thread, thread_cb, NULL));
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    -  ASSERT(0 == uv_thread_join(&thread));
    -  ASSERT(1 == check_cb_called);
    +  ASSERT_OK(uv_async_init(uv_default_loop(), &async_handle, NULL));
    +  ASSERT_OK(uv_check_init(uv_default_loop(), &check_handle));
    +  ASSERT_OK(uv_check_start(&check_handle, check_cb));
    +  ASSERT_OK(uv_thread_create(&thread, thread_cb, NULL));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_thread_join(&thread));
    +  ASSERT_EQ(1, check_cb_called);
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
     }
    diff --git a/deps/uv/test/test-async.c b/deps/uv/test/test-async.c
    index 73664ea5d67efa..935436ec0930b4 100644
    --- a/deps/uv/test/test-async.c
    +++ b/deps/uv/test/test-async.c
    @@ -49,7 +49,7 @@ static void thread_cb(void *arg) {
         }
     
         r = uv_async_send(&async);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
         /* Work around a bug in Valgrind.
          *
    @@ -78,7 +78,7 @@ static void close_cb(uv_handle_t* handle) {
     static void async_cb(uv_async_t* handle) {
       int n;
     
    -  ASSERT(handle == &async);
    +  ASSERT_PTR_EQ(handle, &async);
     
       uv_mutex_lock(&mutex);
       n = ++async_cb_called;
    @@ -94,13 +94,13 @@ static void async_cb(uv_async_t* handle) {
     static void prepare_cb(uv_prepare_t* handle) {
       int r;
     
    -  ASSERT(handle == &prepare);
    +  ASSERT_PTR_EQ(handle, &prepare);
     
       if (prepare_cb_called++)
         return;
     
       r = uv_thread_create(&thread, thread_cb, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_mutex_unlock(&mutex);
     }
     
    @@ -109,25 +109,25 @@ TEST_IMPL(async) {
       int r;
     
       r = uv_mutex_init(&mutex);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_mutex_lock(&mutex);
     
       r = uv_prepare_init(uv_default_loop(), &prepare);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_prepare_start(&prepare, prepare_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_async_init(uv_default_loop(), &async, async_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(prepare_cb_called > 0);
    -  ASSERT(async_cb_called == 3);
    -  ASSERT(close_cb_called == 2);
    +  ASSERT_GT(prepare_cb_called, 0);
    +  ASSERT_EQ(3, async_cb_called);
    +  ASSERT_EQ(2, close_cb_called);
     
    -  ASSERT(0 == uv_thread_join(&thread));
    +  ASSERT_OK(uv_thread_join(&thread));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-barrier.c b/deps/uv/test/test-barrier.c
    index c780f0cf2dd48b..5e904c40bc4f05 100644
    --- a/deps/uv/test/test-barrier.c
    +++ b/deps/uv/test/test-barrier.c
    @@ -53,13 +53,13 @@ TEST_IMPL(barrier_1) {
       memset(&wc, 0, sizeof(wc));
       wc.niter = 1;
     
    -  ASSERT_EQ(0, uv_barrier_init(&wc.barrier, 2));
    -  ASSERT_EQ(0, uv_thread_create(&thread, worker, &wc));
    +  ASSERT_OK(uv_barrier_init(&wc.barrier, 2));
    +  ASSERT_OK(uv_thread_create(&thread, worker, &wc));
     
       uv_sleep(100);
       wc.main_barrier_wait_rval = uv_barrier_wait(&wc.barrier);
     
    -  ASSERT_EQ(0, uv_thread_join(&thread));
    +  ASSERT_OK(uv_thread_join(&thread));
       uv_barrier_destroy(&wc.barrier);
     
       ASSERT_EQ(1, (wc.main_barrier_wait_rval ^ wc.worker_barrier_wait_rval));
    @@ -76,12 +76,12 @@ TEST_IMPL(barrier_2) {
       wc.delay = 100;
       wc.niter = 1;
     
    -  ASSERT_EQ(0, uv_barrier_init(&wc.barrier, 2));
    -  ASSERT_EQ(0, uv_thread_create(&thread, worker, &wc));
    +  ASSERT_OK(uv_barrier_init(&wc.barrier, 2));
    +  ASSERT_OK(uv_thread_create(&thread, worker, &wc));
     
       wc.main_barrier_wait_rval = uv_barrier_wait(&wc.barrier);
     
    -  ASSERT_EQ(0, uv_thread_join(&thread));
    +  ASSERT_OK(uv_thread_join(&thread));
       uv_barrier_destroy(&wc.barrier);
     
       ASSERT_EQ(1, (wc.main_barrier_wait_rval ^ wc.worker_barrier_wait_rval));
    @@ -98,13 +98,13 @@ TEST_IMPL(barrier_3) {
       memset(&wc, 0, sizeof(wc));
       wc.niter = 5;
     
    -  ASSERT_EQ(0, uv_barrier_init(&wc.barrier, 2));
    -  ASSERT_EQ(0, uv_thread_create(&thread, worker, &wc));
    +  ASSERT_OK(uv_barrier_init(&wc.barrier, 2));
    +  ASSERT_OK(uv_thread_create(&thread, worker, &wc));
     
       for (i = 0; i < wc.niter; i++)
         wc.main_barrier_wait_rval += uv_barrier_wait(&wc.barrier);
     
    -  ASSERT_EQ(0, uv_thread_join(&thread));
    +  ASSERT_OK(uv_thread_join(&thread));
       uv_barrier_destroy(&wc.barrier);
     
       ASSERT_EQ(wc.niter, wc.main_barrier_wait_rval + wc.worker_barrier_wait_rval);
    @@ -133,10 +133,10 @@ TEST_IMPL(barrier_serial_thread) {
       uv_barrier_t barrier;
       unsigned i;
     
    -  ASSERT_EQ(0, uv_barrier_init(&barrier, ARRAY_SIZE(threads) + 1));
    +  ASSERT_OK(uv_barrier_init(&barrier, ARRAY_SIZE(threads) + 1));
     
       for (i = 0; i < ARRAY_SIZE(threads); ++i)
    -    ASSERT_EQ(0, uv_thread_create(&threads[i], serial_worker, &barrier));
    +    ASSERT_OK(uv_thread_create(&threads[i], serial_worker, &barrier));
     
       for (i = 0; i < 5; i++)
         uv_barrier_wait(&barrier);
    @@ -144,7 +144,7 @@ TEST_IMPL(barrier_serial_thread) {
         uv_barrier_destroy(&barrier);
     
       for (i = 0; i < ARRAY_SIZE(threads); ++i)
    -    ASSERT_EQ(0, uv_thread_join(&threads[i]));
    +    ASSERT_OK(uv_thread_join(&threads[i]));
     
       return 0;
     }
    @@ -153,7 +153,7 @@ TEST_IMPL(barrier_serial_thread) {
     TEST_IMPL(barrier_serial_thread_single) {
       uv_barrier_t barrier;
     
    -  ASSERT_EQ(0, uv_barrier_init(&barrier, 1));
    +  ASSERT_OK(uv_barrier_init(&barrier, 1));
       ASSERT_LT(0, uv_barrier_wait(&barrier));
       uv_barrier_destroy(&barrier);
       return 0;
    diff --git a/deps/uv/test/test-callback-stack.c b/deps/uv/test/test-callback-stack.c
    index 5dad8d75d2aa9a..dfd102c0247cde 100644
    --- a/deps/uv/test/test-callback-stack.c
    +++ b/deps/uv/test/test-callback-stack.c
    @@ -60,7 +60,7 @@ static void close_cb(uv_handle_t* handle) {
     
     
     static void shutdown_cb(uv_shutdown_t* req, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       ASSERT(nested == 0 && "shutdown_cb must be called from a fresh stack");
     
       shutdown_cb_called++;
    @@ -77,7 +77,7 @@ static void read_cb(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf) {
         return;
     
       } else if (nread < 0) {
    -    ASSERT(nread == UV_EOF);
    +    ASSERT_EQ(nread, UV_EOF);
     
         nested++;
         uv_close((uv_handle_t*)tcp, close_cb);
    @@ -105,7 +105,7 @@ static void read_cb(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf) {
     
     
     static void timer_cb(uv_timer_t* handle) {
    -  ASSERT(handle == &timer);
    +  ASSERT_PTR_EQ(handle, &timer);
       ASSERT(nested == 0 && "timer_cb must be called from a fresh stack");
     
       puts("Timeout complete. Now read data...");
    @@ -125,7 +125,7 @@ static void timer_cb(uv_timer_t* handle) {
     static void write_cb(uv_write_t* req, int status) {
       int r;
     
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       ASSERT(nested == 0 && "write_cb must be called from a fresh stack");
     
       puts("Data written. 500ms timeout...");
    @@ -136,9 +136,9 @@ static void write_cb(uv_write_t* req, int status) {
        * for the backend to use dirty stack for calling read_cb. */
       nested++;
       r = uv_timer_init(uv_default_loop(), &timer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_timer_start(&timer, timer_cb, 500, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       nested--;
     
       write_cb_called++;
    @@ -150,7 +150,7 @@ static void connect_cb(uv_connect_t* req, int status) {
     
       puts("Connected. Write some data to echo server...");
     
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       ASSERT(nested == 0 && "connect_cb must be called from a fresh stack");
     
       nested++;
    @@ -171,7 +171,7 @@ static void connect_cb(uv_connect_t* req, int status) {
     TEST_IMPL(callback_stack) {
       struct sockaddr_in addr;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       if (uv_tcp_init(uv_default_loop(), &client)) {
         FATAL("uv_tcp_init failed");
    @@ -191,13 +191,18 @@ TEST_IMPL(callback_stack) {
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(nested == 0);
    -  ASSERT(connect_cb_called == 1 && "connect_cb must be called exactly once");
    -  ASSERT(write_cb_called == 1 && "write_cb must be called exactly once");
    -  ASSERT(timer_cb_called == 1 && "timer_cb must be called exactly once");
    -  ASSERT(bytes_received == sizeof MESSAGE);
    -  ASSERT(shutdown_cb_called == 1 && "shutdown_cb must be called exactly once");
    -  ASSERT(close_cb_called == 2 && "close_cb must be called exactly twice");
    +  ASSERT_OK(nested);
    +  ASSERT_NE(connect_cb_called == 1 && \
    +            "connect_cb must be called exactly once", 0);
    +  ASSERT_NE(write_cb_called == 1 && "write_cb must be called exactly once",
    +            0);
    +  ASSERT_NE(timer_cb_called == 1 && "timer_cb must be called exactly once",
    +            0);
    +  ASSERT_EQ(bytes_received, sizeof MESSAGE);
    +  ASSERT_NE(shutdown_cb_called == 1 && \
    +            "shutdown_cb must be called exactly once", 0);
    +  ASSERT_NE(close_cb_called == 2 && "close_cb must be called exactly twice",
    +            0);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-close-fd.c b/deps/uv/test/test-close-fd.c
    index d8e12653f77feb..c072fdbb79ac4c 100644
    --- a/deps/uv/test/test-close-fd.c
    +++ b/deps/uv/test/test-close-fd.c
    @@ -36,11 +36,11 @@ static void alloc_cb(uv_handle_t* handle, size_t size, uv_buf_t* buf) {
     static void read_cb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) {
       switch (++read_cb_called) {
       case 1:
    -    ASSERT(nread == 1);
    +    ASSERT_EQ(1, nread);
         uv_read_stop(handle);
         break;
       case 2:
    -    ASSERT(nread == UV_EOF);
    +    ASSERT_EQ(nread, UV_EOF);
         uv_close((uv_handle_t *) handle, NULL);
         break;
       default:
    @@ -55,29 +55,29 @@ TEST_IMPL(close_fd) {
       uv_file fd[2];
       bufs[0] = uv_buf_init("", 1);
     
    -  ASSERT(0 == uv_pipe(fd, 0, 0));
    -  ASSERT(0 == uv_pipe_init(uv_default_loop(), &pipe_handle, 0));
    -  ASSERT(0 == uv_pipe_open(&pipe_handle, fd[0]));
    +  ASSERT_OK(uv_pipe(fd, 0, 0));
    +  ASSERT_OK(uv_pipe_init(uv_default_loop(), &pipe_handle, 0));
    +  ASSERT_OK(uv_pipe_open(&pipe_handle, fd[0]));
       /* uv_pipe_open() takes ownership of the file descriptor. */
       fd[0] = -1;
     
    -  ASSERT(1 == uv_fs_write(NULL, &req, fd[1], bufs, 1, -1, NULL));
    -  ASSERT(1 == req.result);
    +  ASSERT_EQ(1, uv_fs_write(NULL, &req, fd[1], bufs, 1, -1, NULL));
    +  ASSERT_EQ(1, req.result);
       uv_fs_req_cleanup(&req);
     #ifdef _WIN32
    -  ASSERT(0 == _close(fd[1]));
    +  ASSERT_OK(_close(fd[1]));
     #else
    -  ASSERT(0 == close(fd[1]));
    +  ASSERT_OK(close(fd[1]));
     #endif
       fd[1] = -1;
    -  ASSERT(0 == uv_read_start((uv_stream_t *) &pipe_handle, alloc_cb, read_cb));
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    -  ASSERT(1 == read_cb_called);
    -  ASSERT(0 == uv_is_active((const uv_handle_t *) &pipe_handle));
    -  ASSERT(0 == uv_read_start((uv_stream_t *) &pipe_handle, alloc_cb, read_cb));
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    -  ASSERT(2 == read_cb_called);
    -  ASSERT(0 != uv_is_closing((const uv_handle_t *) &pipe_handle));
    +  ASSERT_OK(uv_read_start((uv_stream_t *) &pipe_handle, alloc_cb, read_cb));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_EQ(1, read_cb_called);
    +  ASSERT_OK(uv_is_active((const uv_handle_t *) &pipe_handle));
    +  ASSERT_OK(uv_read_start((uv_stream_t *) &pipe_handle, alloc_cb, read_cb));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_EQ(2, read_cb_called);
    +  ASSERT_NE(0, uv_is_closing((const uv_handle_t *) &pipe_handle));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-close-order.c b/deps/uv/test/test-close-order.c
    index 768e1ceedbe474..e1aae93b7a8fbf 100644
    --- a/deps/uv/test/test-close-order.c
    +++ b/deps/uv/test/test-close-order.c
    @@ -39,9 +39,9 @@ static void close_cb(uv_handle_t* handle) {
     
     /* check_cb should run before any close_cb */
     static void check_cb(uv_check_t* handle) {
    -  ASSERT(check_cb_called == 0);
    -  ASSERT(timer_cb_called == 1);
    -  ASSERT(close_cb_called == 0);
    +  ASSERT_OK(check_cb_called);
    +  ASSERT_EQ(1, timer_cb_called);
    +  ASSERT_OK(close_cb_called);
       uv_close((uv_handle_t*) handle, close_cb);
       uv_close((uv_handle_t*) &timer_handle2, close_cb);
       check_cb_called++;
    @@ -65,15 +65,15 @@ TEST_IMPL(close_order) {
       uv_timer_init(loop, &timer_handle2);
       uv_timer_start(&timer_handle2, timer_cb, 100000, 0);
     
    -  ASSERT(check_cb_called == 0);
    -  ASSERT(close_cb_called == 0);
    -  ASSERT(timer_cb_called == 0);
    +  ASSERT_OK(check_cb_called);
    +  ASSERT_OK(close_cb_called);
    +  ASSERT_OK(timer_cb_called);
     
       uv_run(loop, UV_RUN_DEFAULT);
     
    -  ASSERT(check_cb_called == 1);
    -  ASSERT(close_cb_called == 3);
    -  ASSERT(timer_cb_called == 1);
    +  ASSERT_EQ(1, check_cb_called);
    +  ASSERT_EQ(3, close_cb_called);
    +  ASSERT_EQ(1, timer_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-condvar.c b/deps/uv/test/test-condvar.c
    index 61592d0e2d159a..2711f8cc1b3678 100644
    --- a/deps/uv/test/test-condvar.c
    +++ b/deps/uv/test/test-condvar.c
    @@ -55,10 +55,10 @@ void worker_config_init(worker_config* wc,
       wc->use_broadcast = use_broadcast;
     
       /* Init. */
    -  ASSERT(0 == uv_sem_init(&wc->sem_waiting, 0));
    -  ASSERT(0 == uv_sem_init(&wc->sem_signaled, 0));
    -  ASSERT(0 == uv_cond_init(&wc->cond));
    -  ASSERT(0 == uv_mutex_init(&wc->mutex));
    +  ASSERT_OK(uv_sem_init(&wc->sem_waiting, 0));
    +  ASSERT_OK(uv_sem_init(&wc->sem_signaled, 0));
    +  ASSERT_OK(uv_cond_init(&wc->cond));
    +  ASSERT_OK(uv_mutex_init(&wc->mutex));
     }
     
     void worker_config_destroy(worker_config* wc) {
    @@ -87,7 +87,7 @@ static void condvar_signal(worker_config* c, int* flag) {
       uv_mutex_lock(&c->mutex);
     
       /* Help waiter differentiate between spurious and legitimate wakeup. */
    -  ASSERT(*flag == 0);
    +  ASSERT_OK(*flag);
       *flag = 1;
     
       if (c->use_broadcast)
    @@ -113,7 +113,7 @@ static int condvar_wait(worker_config* c, const int* flag) {
       do {
         uv_cond_wait(&c->cond, &c->mutex);
       } while (*flag == 0);
    -  ASSERT(*flag == 1);
    +  ASSERT_EQ(1, *flag);
     
       uv_mutex_unlock(&c->mutex);
     
    @@ -130,13 +130,13 @@ TEST_IMPL(condvar_1) {
     
       /* Helper signal-then-wait. */
       worker_config_init(&wc, 0, condvar_signal, condvar_wait);
    -  ASSERT(0 == uv_thread_create(&thread, worker, &wc));
    +  ASSERT_OK(uv_thread_create(&thread, worker, &wc));
     
       /* We wait-then-signal. */
    -  ASSERT(0 == wc.wait_cond(&wc, &wc.posted_1));
    +  ASSERT_OK(wc.wait_cond(&wc, &wc.posted_1));
       wc.signal_cond(&wc, &wc.posted_2);
     
    -  ASSERT(0 == uv_thread_join(&thread));
    +  ASSERT_OK(uv_thread_join(&thread));
       worker_config_destroy(&wc);
     
       return 0;
    @@ -149,13 +149,13 @@ TEST_IMPL(condvar_2) {
     
       /* Helper to signal-then-wait. */
       worker_config_init(&wc, 1, condvar_signal, condvar_wait);
    -  ASSERT(0 == uv_thread_create(&thread, worker, &wc));
    +  ASSERT_OK(uv_thread_create(&thread, worker, &wc));
     
       /* We wait-then-signal. */
    -  ASSERT(0 == wc.wait_cond(&wc, &wc.posted_1));
    +  ASSERT_OK(wc.wait_cond(&wc, &wc.posted_1));
       wc.signal_cond(&wc, &wc.posted_2);
     
    -  ASSERT(0 == uv_thread_join(&thread));
    +  ASSERT_OK(uv_thread_join(&thread));
       worker_config_destroy(&wc);
     
       return 0;
    @@ -176,9 +176,9 @@ static int condvar_timedwait(worker_config* c, const int* flag) {
       /* Wait until I get a non-spurious signal. */
       do {
         r = uv_cond_timedwait(&c->cond, &c->mutex, (uint64_t)(1 * 1e9)); /* 1 s */
    -    ASSERT(r == 0); /* Should not time out. */
    +    ASSERT_OK(r); /* Should not time out. */
       } while (*flag == 0);
    -  ASSERT(*flag == 1);
    +  ASSERT_EQ(1, *flag);
     
       uv_mutex_unlock(&c->mutex);
     
    @@ -194,13 +194,13 @@ TEST_IMPL(condvar_3) {
     
       /* Helper to signal-then-wait. */
       worker_config_init(&wc, 0, condvar_signal, condvar_timedwait);
    -  ASSERT(0 == uv_thread_create(&thread, worker, &wc));
    +  ASSERT_OK(uv_thread_create(&thread, worker, &wc));
     
       /* We wait-then-signal. */
       wc.wait_cond(&wc, &wc.posted_1);
       wc.signal_cond(&wc, &wc.posted_2);
     
    -  ASSERT(0 == uv_thread_join(&thread));
    +  ASSERT_OK(uv_thread_join(&thread));
       worker_config_destroy(&wc);
     
       return 0;
    @@ -213,13 +213,13 @@ TEST_IMPL(condvar_4) {
     
       /* Helper to signal-then-wait. */
       worker_config_init(&wc, 1, condvar_signal, condvar_timedwait);
    -  ASSERT(0 == uv_thread_create(&thread, worker, &wc));
    +  ASSERT_OK(uv_thread_create(&thread, worker, &wc));
     
       /* We wait-then-signal. */
       wc.wait_cond(&wc, &wc.posted_1);
       wc.signal_cond(&wc, &wc.posted_2);
     
    -  ASSERT(0 == uv_thread_join(&thread));
    +  ASSERT_OK(uv_thread_join(&thread));
       worker_config_destroy(&wc);
     
       return 0;
    diff --git a/deps/uv/test/test-connect-unspecified.c b/deps/uv/test/test-connect-unspecified.c
    index ecbe98538edc9d..73e59a9972b670 100644
    --- a/deps/uv/test/test-connect-unspecified.c
    +++ b/deps/uv/test/test-connect-unspecified.c
    @@ -23,11 +23,11 @@
     #include "task.h"
     
     static void connect_4(uv_connect_t* req, int status) {
    -  ASSERT(status != UV_EADDRNOTAVAIL);
    +  ASSERT_NE(status, UV_EADDRNOTAVAIL);
     }
     
     static void connect_6(uv_connect_t* req, int status) {
    -  ASSERT(status != UV_EADDRNOTAVAIL);
    +  ASSERT_NE(status, UV_EADDRNOTAVAIL);
     }
     
     TEST_IMPL(connect_unspecified) {
    @@ -41,23 +41,23 @@ TEST_IMPL(connect_unspecified) {
     
       loop = uv_default_loop();
     
    -  ASSERT(uv_tcp_init(loop, &socket4) == 0);
    -  ASSERT(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr4) == 0);
    -  ASSERT(uv_tcp_connect(&connect4,
    -                        &socket4,
    -                        (const struct sockaddr*) &addr4,
    -                        connect_4) == 0);
    +  ASSERT_OK(uv_tcp_init(loop, &socket4));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr4));
    +  ASSERT_OK(uv_tcp_connect(&connect4,
    +                           &socket4,
    +                           (const struct sockaddr*) &addr4,
    +                           connect_4));
     
       if (can_ipv6()) {
    -    ASSERT(uv_tcp_init(loop, &socket6) == 0);
    -    ASSERT(uv_ip6_addr("::", TEST_PORT, &addr6) == 0);
    -    ASSERT(uv_tcp_connect(&connect6,
    -                          &socket6,
    -                          (const struct sockaddr*) &addr6,
    -                          connect_6) == 0);
    +    ASSERT_OK(uv_tcp_init(loop, &socket6));
    +    ASSERT_OK(uv_ip6_addr("::", TEST_PORT, &addr6));
    +    ASSERT_OK(uv_tcp_connect(&connect6,
    +                             &socket6,
    +                             (const struct sockaddr*) &addr6,
    +                             connect_6));
       }
     
    -  ASSERT(uv_run(loop, UV_RUN_DEFAULT) == 0);
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-connection-fail.c b/deps/uv/test/test-connection-fail.c
    index aa7db30d85a2d1..9efd3ac907a035 100644
    --- a/deps/uv/test/test-connection-fail.c
    +++ b/deps/uv/test/test-connection-fail.c
    @@ -54,8 +54,8 @@ static void timer_cb(uv_timer_t* handle) {
        * but libuv hasn't automatically closed the socket. The user must
        * uv_close the handle manually.
        */
    -  ASSERT(close_cb_calls == 0);
    -  ASSERT(connect_cb_calls == 1);
    +  ASSERT_OK(close_cb_calls);
    +  ASSERT_EQ(1, connect_cb_calls);
     
       /* Close the tcp handle. */
       uv_close((uv_handle_t*)&tcp, on_close);
    @@ -66,22 +66,22 @@ static void timer_cb(uv_timer_t* handle) {
     
     
     static void on_connect_with_close(uv_connect_t *req, int status) {
    -  ASSERT((uv_stream_t*) &tcp == req->handle);
    -  ASSERT(status == UV_ECONNREFUSED);
    +  ASSERT_PTR_EQ((uv_stream_t*) &tcp, req->handle);
    +  ASSERT_EQ(status, UV_ECONNREFUSED);
       connect_cb_calls++;
     
    -  ASSERT(close_cb_calls == 0);
    +  ASSERT_OK(close_cb_calls);
       uv_close((uv_handle_t*)req->handle, on_close);
     }
     
     
     static void on_connect_without_close(uv_connect_t *req, int status) {
    -  ASSERT(status == UV_ECONNREFUSED);
    +  ASSERT_EQ(status, UV_ECONNREFUSED);
       connect_cb_calls++;
     
       uv_timer_start(&timer, timer_cb, 100, 0);
     
    -  ASSERT(close_cb_calls == 0);
    +  ASSERT_OK(close_cb_calls);
     }
     
     
    @@ -89,10 +89,10 @@ static void connection_fail(uv_connect_cb connect_cb) {
       struct sockaddr_in client_addr, server_addr;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", 0, &client_addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", 0, &client_addr));
     
       /* There should be no servers listening on this port. */
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &server_addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &server_addr));
     
       /* Try to connect to the server and do NUM_PINGS ping-pongs. */
       r = uv_tcp_init(uv_default_loop(), &tcp);
    @@ -100,7 +100,7 @@ static void connection_fail(uv_connect_cb connect_cb) {
     
       /* We are never doing multiple reads/connects at a time anyway. so these
        * handles can be pre-initialized. */
    -  ASSERT(0 == uv_tcp_bind(&tcp, (const struct sockaddr*) &client_addr, 0));
    +  ASSERT_OK(uv_tcp_bind(&tcp, (const struct sockaddr*) &client_addr, 0));
     
       r = uv_tcp_connect(&req,
                          &tcp,
    @@ -110,8 +110,8 @@ static void connection_fail(uv_connect_cb connect_cb) {
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(connect_cb_calls == 1);
    -  ASSERT(close_cb_calls == 1);
    +  ASSERT_EQ(1, connect_cb_calls);
    +  ASSERT_EQ(1, close_cb_calls);
     }
     
     
    @@ -127,8 +127,8 @@ TEST_IMPL(connection_fail) {
     
       connection_fail(on_connect_with_close);
     
    -  ASSERT(timer_close_cb_calls == 0);
    -  ASSERT(timer_cb_calls == 0);
    +  ASSERT_OK(timer_close_cb_calls);
    +  ASSERT_OK(timer_cb_calls);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -149,12 +149,12 @@ TEST_IMPL(connection_fail_doesnt_auto_close) {
       int r;
     
       r = uv_timer_init(uv_default_loop(), &timer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       connection_fail(on_connect_without_close);
     
    -  ASSERT(timer_close_cb_calls == 1);
    -  ASSERT(timer_cb_calls == 1);
    +  ASSERT_EQ(1, timer_close_cb_calls);
    +  ASSERT_EQ(1, timer_cb_calls);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-cwd-and-chdir.c b/deps/uv/test/test-cwd-and-chdir.c
    index faeed021030e83..e4a0eef07670cd 100644
    --- a/deps/uv/test/test-cwd-and-chdir.c
    +++ b/deps/uv/test/test-cwd-and-chdir.c
    @@ -34,24 +34,24 @@ TEST_IMPL(cwd_and_chdir) {
     
       size1 = 1;
       err = uv_cwd(buffer_orig, &size1);
    -  ASSERT(err == UV_ENOBUFS);
    -  ASSERT(size1 > 1);
    +  ASSERT_EQ(err, UV_ENOBUFS);
    +  ASSERT_GT(size1, 1);
     
       size1 = sizeof buffer_orig;
       err = uv_cwd(buffer_orig, &size1);
    -  ASSERT(err == 0);
    -  ASSERT(size1 > 0);
    -  ASSERT(buffer_orig[size1] != '/');
    +  ASSERT_OK(err);
    +  ASSERT_GT(size1, 0);
    +  ASSERT_NE(buffer_orig[size1], '/');
     
       err = uv_chdir(buffer_orig);
    -  ASSERT(err == 0);
    +  ASSERT_OK(err);
     
       size2 = sizeof buffer_new;
       err = uv_cwd(buffer_new, &size2);
    -  ASSERT(err == 0);
    +  ASSERT_OK(err);
     
    -  ASSERT(size1 == size2);
    -  ASSERT(strcmp(buffer_orig, buffer_new) == 0);
    +  ASSERT_EQ(size1, size2);
    +  ASSERT_OK(strcmp(buffer_orig, buffer_new));
     
       return 0;
     }
    diff --git a/deps/uv/test/test-default-loop-close.c b/deps/uv/test/test-default-loop-close.c
    index 8d960e1130a7cb..d08a33ea551d34 100644
    --- a/deps/uv/test/test-default-loop-close.c
    +++ b/deps/uv/test/test-default-loop-close.c
    @@ -39,19 +39,19 @@ TEST_IMPL(default_loop_close) {
       loop = uv_default_loop();
       ASSERT_NOT_NULL(loop);
     
    -  ASSERT(0 == uv_timer_init(loop, &timer_handle));
    -  ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, 1, 0));
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -  ASSERT(1 == timer_cb_called);
    -  ASSERT(0 == uv_loop_close(loop));
    +  ASSERT_OK(uv_timer_init(loop, &timer_handle));
    +  ASSERT_OK(uv_timer_start(&timer_handle, timer_cb, 1, 0));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(1, timer_cb_called);
    +  ASSERT_OK(uv_loop_close(loop));
     
       loop = uv_default_loop();
       ASSERT_NOT_NULL(loop);
     
    -  ASSERT(0 == uv_timer_init(loop, &timer_handle));
    -  ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, 1, 0));
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -  ASSERT(2 == timer_cb_called);
    +  ASSERT_OK(uv_timer_init(loop, &timer_handle));
    +  ASSERT_OK(uv_timer_start(&timer_handle, timer_cb, 1, 0));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(2, timer_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-delayed-accept.c b/deps/uv/test/test-delayed-accept.c
    index c1d6ce0b45b203..f7cf80ab7b369c 100644
    --- a/deps/uv/test/test-delayed-accept.c
    +++ b/deps/uv/test/test-delayed-accept.c
    @@ -54,11 +54,11 @@ static void do_accept(uv_timer_t* timer_handle) {
       ASSERT_NOT_NULL(accepted_handle);
     
       r = uv_tcp_init(uv_default_loop(), accepted_handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       server = (uv_tcp_t*)timer_handle->data;
       r = uv_accept((uv_stream_t*)server, (uv_stream_t*)accepted_handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       do_accept_called++;
     
    @@ -79,19 +79,19 @@ static void connection_cb(uv_stream_t* tcp, int status) {
       int r;
       uv_timer_t* timer_handle;
     
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
       timer_handle = (uv_timer_t*)malloc(sizeof *timer_handle);
       ASSERT_NOT_NULL(timer_handle);
     
       /* Accept the client after 1 second */
       r = uv_timer_init(uv_default_loop(), timer_handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       timer_handle->data = tcp;
     
       r = uv_timer_start(timer_handle, do_accept, 1000, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       connection_cb_called++;
     }
    @@ -102,16 +102,16 @@ static void start_server(void) {
       uv_tcp_t* server = (uv_tcp_t*)malloc(sizeof *server);
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
       ASSERT_NOT_NULL(server);
     
       r = uv_tcp_init(uv_default_loop(), server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_tcp_bind(server, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_listen((uv_stream_t*)server, 128, connection_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -123,10 +123,10 @@ static void read_cb(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf) {
       }
     
       if (nread >= 0) {
    -    ASSERT(nread == 0);
    +    ASSERT_OK(nread);
       } else {
         ASSERT_NOT_NULL(tcp);
    -    ASSERT(nread == UV_EOF);
    +    ASSERT_EQ(nread, UV_EOF);
         uv_close((uv_handle_t*)tcp, close_cb);
       }
     }
    @@ -136,12 +136,12 @@ static void connect_cb(uv_connect_t* req, int status) {
       int r;
     
       ASSERT_NOT_NULL(req);
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
       /* Not that the server will send anything, but otherwise we'll never know
        * when the server closes the connection. */
       r = uv_read_start((uv_stream_t*)(req->handle), alloc_cb, read_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       connect_cb_called++;
     
    @@ -155,18 +155,18 @@ static void client_connect(void) {
       uv_connect_t* connect_req = malloc(sizeof *connect_req);
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
       ASSERT_NOT_NULL(client);
       ASSERT_NOT_NULL(connect_req);
     
       r = uv_tcp_init(uv_default_loop(), client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_connect(connect_req,
                          client,
                          (const struct sockaddr*) &addr,
                          connect_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -179,10 +179,10 @@ TEST_IMPL(delayed_accept) {
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(connection_cb_called == 2);
    -  ASSERT(do_accept_called == 2);
    -  ASSERT(connect_cb_called == 2);
    -  ASSERT(close_cb_called == 7);
    +  ASSERT_EQ(2, connection_cb_called);
    +  ASSERT_EQ(2, do_accept_called);
    +  ASSERT_EQ(2, connect_cb_called);
    +  ASSERT_EQ(7, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-dlerror.c b/deps/uv/test/test-dlerror.c
    index 631e67cc5f3e89..dec0da3afc8533 100644
    --- a/deps/uv/test/test-dlerror.c
    +++ b/deps/uv/test/test-dlerror.c
    @@ -38,7 +38,7 @@ TEST_IMPL(dlerror) {
       ASSERT_NOT_NULL(strstr(msg, dlerror_no_error));
     
       r = uv_dlopen(path, &lib);
    -  ASSERT(r == -1);
    +  ASSERT_EQ(r, -1);
     
       msg = uv_dlerror(&lib);
       ASSERT_NOT_NULL(msg);
    diff --git a/deps/uv/test/test-eintr-handling.c b/deps/uv/test/test-eintr-handling.c
    index d37aba4aa529ba..1f75e77e251bf1 100644
    --- a/deps/uv/test/test-eintr-handling.c
    +++ b/deps/uv/test/test-eintr-handling.c
    @@ -48,13 +48,13 @@ struct thread_ctx {
     
     static void thread_main(void* arg) {
       int nwritten;
    -  ASSERT(0 == kill(getpid(), SIGUSR1));
    +  ASSERT_OK(kill(getpid(), SIGUSR1));
     
       do
         nwritten = write(pipe_fds[1], test_buf, sizeof(test_buf));
       while (nwritten == -1 && errno == EINTR);
     
    -  ASSERT(nwritten == sizeof(test_buf));
    +  ASSERT_EQ(nwritten, sizeof(test_buf));
     }
     
     static void sig_func(uv_signal_t* handle, int signum) {
    @@ -70,24 +70,24 @@ TEST_IMPL(eintr_handling) {
       iov = uv_buf_init(buf, sizeof(buf));
       loop = uv_default_loop();
     
    -  ASSERT(0 == uv_signal_init(loop, &signal));
    -  ASSERT(0 == uv_signal_start(&signal, sig_func, SIGUSR1));
    +  ASSERT_OK(uv_signal_init(loop, &signal));
    +  ASSERT_OK(uv_signal_start(&signal, sig_func, SIGUSR1));
     
    -  ASSERT(0 == pipe(pipe_fds));
    -  ASSERT(0 == uv_thread_create(&thread, thread_main, &ctx));
    +  ASSERT_OK(pipe(pipe_fds));
    +  ASSERT_OK(uv_thread_create(&thread, thread_main, &ctx));
     
       nread = uv_fs_read(loop, &read_req, pipe_fds[0], &iov, 1, -1, NULL);
     
    -  ASSERT(nread == sizeof(test_buf));
    -  ASSERT(0 == strcmp(buf, test_buf));
    +  ASSERT_EQ(nread, sizeof(test_buf));
    +  ASSERT_OK(strcmp(buf, test_buf));
     
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
     
    -  ASSERT(0 == close(pipe_fds[0]));
    -  ASSERT(0 == close(pipe_fds[1]));
    +  ASSERT_OK(close(pipe_fds[0]));
    +  ASSERT_OK(close(pipe_fds[1]));
       uv_close((uv_handle_t*) &signal, NULL);
     
    -  ASSERT_EQ(0, uv_thread_join(&thread));
    +  ASSERT_OK(uv_thread_join(&thread));
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-embed.c b/deps/uv/test/test-embed.c
    index bbe56e176db17a..6e9917239aa562 100644
    --- a/deps/uv/test/test-embed.c
    +++ b/deps/uv/test/test-embed.c
    @@ -36,7 +36,7 @@ static uv_barrier_t barrier;
     static void thread_main(void* arg) {
       ASSERT_LE(0, uv_barrier_wait(&barrier));
       uv_sleep(250);
    -  ASSERT_EQ(0, uv_async_send(&async));
    +  ASSERT_OK(uv_async_send(&async));
     }
     
     
    @@ -50,9 +50,9 @@ TEST_IMPL(embed) {
       uv_loop_t* loop;
     
       loop = uv_default_loop();
    -  ASSERT_EQ(0, uv_async_init(loop, &async, async_cb));
    -  ASSERT_EQ(0, uv_barrier_init(&barrier, 2));
    -  ASSERT_EQ(0, uv_thread_create(&thread, thread_main, NULL));
    +  ASSERT_OK(uv_async_init(loop, &async, async_cb));
    +  ASSERT_OK(uv_barrier_init(&barrier, 2));
    +  ASSERT_OK(uv_thread_create(&thread, thread_main, NULL));
       ASSERT_LE(0, uv_barrier_wait(&barrier));
     
       while (uv_loop_alive(loop)) {
    @@ -71,7 +71,7 @@ TEST_IMPL(embed) {
     #endif
       }
     
    -  ASSERT_EQ(0, uv_thread_join(&thread));
    +  ASSERT_OK(uv_thread_join(&thread));
       uv_barrier_destroy(&barrier);
     
       MAKE_VALGRIND_HAPPY(loop);
    diff --git a/deps/uv/test/test-emfile.c b/deps/uv/test/test-emfile.c
    index 343c9521dc7eba..ef2338cdfbb165 100644
    --- a/deps/uv/test/test-emfile.c
    +++ b/deps/uv/test/test-emfile.c
    @@ -54,37 +54,37 @@ TEST_IMPL(emfile) {
       /* Lower the file descriptor limit and use up all fds save one. */
       limits.rlim_cur = limits.rlim_max = maxfd + 1;
       if (setrlimit(RLIMIT_NOFILE, &limits)) {
    -    ASSERT(errno == EPERM);  /* Valgrind blocks the setrlimit() call. */
    +    ASSERT_EQ(errno, EPERM);  /* Valgrind blocks the setrlimit() call. */
         RETURN_SKIP("setrlimit(RLIMIT_NOFILE) failed, running under valgrind?");
       }
     
       loop = uv_default_loop();
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    -  ASSERT(0 == uv_tcp_init(loop, &server_handle));
    -  ASSERT(0 == uv_tcp_init(loop, &client_handle));
    -  ASSERT(0 == uv_tcp_bind(&server_handle, (const struct sockaddr*) &addr, 0));
    -  ASSERT(0 == uv_listen((uv_stream_t*) &server_handle, 8, connection_cb));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_tcp_init(loop, &server_handle));
    +  ASSERT_OK(uv_tcp_init(loop, &client_handle));
    +  ASSERT_OK(uv_tcp_bind(&server_handle, (const struct sockaddr*) &addr, 0));
    +  ASSERT_OK(uv_listen((uv_stream_t*) &server_handle, 8, connection_cb));
     
       /* Remember the first one so we can clean up afterwards. */
       do
         first_fd = dup(0);
       while (first_fd == -1 && errno == EINTR);
    -  ASSERT(first_fd > 0);
    +  ASSERT_GT(first_fd, 0);
     
       while (dup(0) != -1 || errno == EINTR);
    -  ASSERT(errno == EMFILE);
    +  ASSERT_EQ(errno, EMFILE);
       close(maxfd);
     
       /* Now connect and use up the last available file descriptor.  The EMFILE
        * handling logic in src/unix/stream.c should ensure that connect_cb() runs
        * whereas connection_cb() should *not* run.
        */
    -  ASSERT(0 == uv_tcp_connect(&connect_req,
    -                             &client_handle,
    -                             (const struct sockaddr*) &addr,
    -                             connect_cb));
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -  ASSERT(1 == connect_cb_called);
    +  ASSERT_OK(uv_tcp_connect(&connect_req,
    +                           &client_handle,
    +                           (const struct sockaddr*) &addr,
    +                           connect_cb));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(1, connect_cb_called);
     
       /* Close the dups again. Ignore errors in the unlikely event that the
        * file descriptors were not contiguous.
    @@ -108,7 +108,7 @@ static void connect_cb(uv_connect_t* req, int status) {
       /* |status| should equal 0 because the connection should have been accepted,
        * it's just that the server immediately closes it again.
        */
    -  ASSERT(0 == status);
    +  ASSERT_OK(status);
       connect_cb_called += 1;
       uv_close((uv_handle_t*) &server_handle, NULL);
       uv_close((uv_handle_t*) &client_handle, NULL);
    diff --git a/deps/uv/test/test-env-vars.c b/deps/uv/test/test-env-vars.c
    index 8118e3da5d7c59..016f0733c6e424 100644
    --- a/deps/uv/test/test-env-vars.c
    +++ b/deps/uv/test/test-env-vars.c
    @@ -35,83 +35,83 @@ TEST_IMPL(env_vars) {
     
       /* Reject invalid inputs when setting an environment variable */
       r = uv_os_setenv(NULL, "foo");
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       r = uv_os_setenv(name, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       r = uv_os_setenv(NULL, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       /* Reject invalid inputs when retrieving an environment variable */
       size = BUF_SIZE;
       r = uv_os_getenv(NULL, buf, &size);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       r = uv_os_getenv(name, NULL, &size);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       r = uv_os_getenv(name, buf, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       size = 0;
       r = uv_os_getenv(name, buf, &size);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       /* Reject invalid inputs when deleting an environment variable */
       r = uv_os_unsetenv(NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       /* Successfully set an environment variable */
       r = uv_os_setenv(name, "123456789");
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Successfully read an environment variable */
       size = BUF_SIZE;
       buf[0] = '\0';
       r = uv_os_getenv(name, buf, &size);
    -  ASSERT(r == 0);
    -  ASSERT(strcmp(buf, "123456789") == 0);
    -  ASSERT(size == BUF_SIZE - 1);
    +  ASSERT_OK(r);
    +  ASSERT_OK(strcmp(buf, "123456789"));
    +  ASSERT_EQ(size, BUF_SIZE - 1);
     
       /* Return UV_ENOBUFS if the buffer cannot hold the environment variable */
       size = BUF_SIZE - 1;
       buf[0] = '\0';
       r = uv_os_getenv(name, buf, &size);
    -  ASSERT(r == UV_ENOBUFS);
    -  ASSERT(size == BUF_SIZE);
    +  ASSERT_EQ(r, UV_ENOBUFS);
    +  ASSERT_EQ(size, BUF_SIZE);
     
       /* Successfully delete an environment variable */
       r = uv_os_unsetenv(name);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Return UV_ENOENT retrieving an environment variable that does not exist */
       r = uv_os_getenv(name, buf, &size);
    -  ASSERT(r == UV_ENOENT);
    +  ASSERT_EQ(r, UV_ENOENT);
     
       /* Successfully delete an environment variable that does not exist */
       r = uv_os_unsetenv(name);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Setting an environment variable to the empty string does not delete it. */
       r = uv_os_setenv(name, "");
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       size = BUF_SIZE;
       r = uv_os_getenv(name, buf, &size);
    -  ASSERT(r == 0);
    -  ASSERT(size == 0);
    -  ASSERT(strlen(buf) == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(size);
    +  ASSERT_OK(strlen(buf));
     
       /* Check getting all env variables. */
       r = uv_os_setenv(name, "123456789");
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_os_setenv(name2, "");
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     #ifdef _WIN32
       /* Create a special environment variable on Windows in case there are no
          naturally occurring ones. */
       r = uv_os_setenv("=Z:", "\\");
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     #endif
     
       r = uv_os_environ(&envitems, &envcount);
    -  ASSERT(r == 0);
    -  ASSERT(envcount > 0);
    +  ASSERT_OK(r);
    +  ASSERT_GT(envcount, 0);
     
       found = 0;
       found_win_special = 0;
    @@ -120,16 +120,16 @@ TEST_IMPL(env_vars) {
         /* printf("Env: %s = %s\n", envitems[i].name, envitems[i].value); */
         if (strcmp(envitems[i].name, name) == 0) {
           found++;
    -      ASSERT(strcmp(envitems[i].value, "123456789") == 0);
    +      ASSERT_OK(strcmp(envitems[i].value, "123456789"));
         } else if (strcmp(envitems[i].name, name2) == 0) {
           found++;
    -      ASSERT(strlen(envitems[i].value) == 0);
    +      ASSERT_OK(strlen(envitems[i].value));
         } else if (envitems[i].name[0] == '=') {
           found_win_special++;
         }
       }
     
    -  ASSERT(found == 2);
    +  ASSERT_EQ(2, found);
     #ifdef _WIN32
       ASSERT_GT(found_win_special, 0);
     #else
    @@ -140,10 +140,10 @@ TEST_IMPL(env_vars) {
       uv_os_free_environ(envitems, envcount);
     
       r = uv_os_unsetenv(name);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_os_unsetenv(name2);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       for (i = 1; i <= 4; i++) {
         size_t n;
    @@ -158,14 +158,14 @@ TEST_IMPL(env_vars) {
         memset(p, 'x', n);
         p[n] = '\0';
     
    -    ASSERT_EQ(0, uv_os_setenv(name, p));
    -    ASSERT_EQ(0, uv_os_getenv(name, p, &size));
    +    ASSERT_OK(uv_os_setenv(name, p));
    +    ASSERT_OK(uv_os_getenv(name, p, &size));
         ASSERT_EQ(n, size);
     
         for (n = 0; n < size; n++)
           ASSERT_EQ('x', p[n]);
     
    -    ASSERT_EQ(0, uv_os_unsetenv(name));
    +    ASSERT_OK(uv_os_unsetenv(name));
         free(p);
       }
     
    diff --git a/deps/uv/test/test-error.c b/deps/uv/test/test-error.c
    index f0fb864607f36c..2c6d0ca49790e0 100644
    --- a/deps/uv/test/test-error.c
    +++ b/deps/uv/test/test-error.c
    @@ -51,8 +51,8 @@ TEST_IMPL(error_message) {
       }
     
       ASSERT_NULL(strstr(uv_strerror(UV_EINVAL), "Success"));
    -  ASSERT(strcmp(uv_strerror(1337), "Unknown error") == 0);
    -  ASSERT(strcmp(uv_strerror(-1337), "Unknown error") == 0);
    +  ASSERT_OK(strcmp(uv_strerror(1337), "Unknown error"));
    +  ASSERT_OK(strcmp(uv_strerror(-1337), "Unknown error"));
     
       ASSERT_NULL(strstr(uv_strerror_r(UV_EINVAL, buf, sizeof(buf)), "Success"));
       ASSERT_NOT_NULL(strstr(uv_strerror_r(1337, buf, sizeof(buf)), "1337"));
    @@ -64,19 +64,19 @@ TEST_IMPL(error_message) {
     
     TEST_IMPL(sys_error) {
     #if defined(_WIN32)
    -  ASSERT(uv_translate_sys_error(ERROR_NOACCESS) == UV_EACCES);
    -  ASSERT(uv_translate_sys_error(ERROR_ELEVATION_REQUIRED) == UV_EACCES);
    -  ASSERT(uv_translate_sys_error(WSAEADDRINUSE) == UV_EADDRINUSE);
    -  ASSERT(uv_translate_sys_error(ERROR_BAD_PIPE) == UV_EPIPE);
    +  ASSERT_EQ(uv_translate_sys_error(ERROR_NOACCESS), UV_EACCES);
    +  ASSERT_EQ(uv_translate_sys_error(ERROR_ELEVATION_REQUIRED), UV_EACCES);
    +  ASSERT_EQ(uv_translate_sys_error(WSAEADDRINUSE), UV_EADDRINUSE);
    +  ASSERT_EQ(uv_translate_sys_error(ERROR_BAD_PIPE), UV_EPIPE);
     #else
    -  ASSERT(uv_translate_sys_error(EPERM) == UV_EPERM);
    -  ASSERT(uv_translate_sys_error(EPIPE) == UV_EPIPE);
    -  ASSERT(uv_translate_sys_error(EINVAL) == UV_EINVAL);
    +  ASSERT_EQ(uv_translate_sys_error(EPERM), UV_EPERM);
    +  ASSERT_EQ(uv_translate_sys_error(EPIPE), UV_EPIPE);
    +  ASSERT_EQ(uv_translate_sys_error(EINVAL), UV_EINVAL);
     #endif
    -  ASSERT(uv_translate_sys_error(UV_EINVAL) == UV_EINVAL);
    -  ASSERT(uv_translate_sys_error(UV_ERANGE) == UV_ERANGE);
    -  ASSERT(uv_translate_sys_error(UV_EACCES) == UV_EACCES);
    -  ASSERT(uv_translate_sys_error(0) == 0);
    +  ASSERT_EQ(uv_translate_sys_error(UV_EINVAL), UV_EINVAL);
    +  ASSERT_EQ(uv_translate_sys_error(UV_ERANGE), UV_ERANGE);
    +  ASSERT_EQ(uv_translate_sys_error(UV_EACCES), UV_EACCES);
    +  ASSERT_OK(uv_translate_sys_error(0));
     
       return 0;
     }
    diff --git a/deps/uv/test/test-fork.c b/deps/uv/test/test-fork.c
    index 29ed132a488f7d..fe42f03daf515d 100644
    --- a/deps/uv/test/test-fork.c
    +++ b/deps/uv/test/test-fork.c
    @@ -51,12 +51,12 @@ static char socket_cb_read_buf[1024];
     static void socket_cb(uv_poll_t* poll, int status, int events) {
       ssize_t cnt;
       socket_cb_called++;
    -  ASSERT(0 == status);
    +  ASSERT_OK(status);
       printf("Socket cb got events %d\n", events);
    -  ASSERT(UV_READABLE == (events & UV_READABLE));
    +  ASSERT_EQ(UV_READABLE, (events & UV_READABLE));
       if (socket_cb_read_fd) {
         cnt = read(socket_cb_read_fd, socket_cb_read_buf, socket_cb_read_size);
    -    ASSERT(cnt == socket_cb_read_size);
    +    ASSERT_EQ(cnt, socket_cb_read_size);
       }
       uv_close((uv_handle_t*) poll, NULL);
     }
    @@ -66,15 +66,15 @@ static void run_timer_loop_once(void) {
       uv_loop_t loop;
       uv_timer_t timer_handle;
     
    -  ASSERT_EQ(0, uv_loop_init(&loop));
    +  ASSERT_OK(uv_loop_init(&loop));
     
       timer_cb_called = 0; /* Reset for the child. */
     
    -  ASSERT(0 == uv_timer_init(&loop, &timer_handle));
    -  ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, 1, 0));
    -  ASSERT(0 == uv_run(&loop, UV_RUN_DEFAULT));
    -  ASSERT(1 == timer_cb_called);
    -  ASSERT_EQ(0, uv_loop_close(&loop));
    +  ASSERT_OK(uv_timer_init(&loop, &timer_handle));
    +  ASSERT_OK(uv_timer_start(&timer_handle, timer_cb, 1, 0));
    +  ASSERT_OK(uv_run(&loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(1, timer_cb_called);
    +  ASSERT_OK(uv_loop_close(&loop));
     }
     
     
    @@ -87,10 +87,10 @@ static void assert_wait_child(pid_t child_pid) {
       if (waited_pid == -1) {
         perror("Failed to wait");
       }
    -  ASSERT(child_pid == waited_pid);
    +  ASSERT_EQ(child_pid, waited_pid);
       ASSERT(WIFEXITED(child_stat)); /* Clean exit, not a signal. */
       ASSERT(!WIFSIGNALED(child_stat));
    -  ASSERT(0 == WEXITSTATUS(child_stat));
    +  ASSERT_OK(WEXITSTATUS(child_stat));
     }
     
     
    @@ -109,14 +109,14 @@ TEST_IMPL(fork_timer) {
     #else
       child_pid = fork();
     #endif
    -  ASSERT(child_pid != -1);
    +  ASSERT_NE(child_pid, -1);
     
       if (child_pid != 0) {
         /* parent */
         assert_wait_child(child_pid);
       } else {
         /* child */
    -    ASSERT(0 == uv_loop_fork(uv_default_loop()));
    +    ASSERT_OK(uv_loop_fork(uv_default_loop()));
         run_timer_loop_once();
       }
     
    @@ -135,30 +135,30 @@ TEST_IMPL(fork_socketpair) {
       /* Prime the loop. */
       run_timer_loop_once();
     
    -  ASSERT(0 == socketpair(AF_UNIX, SOCK_STREAM, 0, socket_fds));
    +  ASSERT_OK(socketpair(AF_UNIX, SOCK_STREAM, 0, socket_fds));
     
       /* Create the server watcher in the parent, use it in the child. */
    -  ASSERT(0 == uv_poll_init(uv_default_loop(), &poll_handle, socket_fds[0]));
    +  ASSERT_OK(uv_poll_init(uv_default_loop(), &poll_handle, socket_fds[0]));
     
     #if defined(__APPLE__) && (TARGET_OS_TV || TARGET_OS_WATCH)
       child_pid = -1;
     #else
       child_pid = fork();
     #endif
    -  ASSERT(child_pid != -1);
    +  ASSERT_NE(child_pid, -1);
     
       if (child_pid != 0) {
         /* parent */
    -    ASSERT(3 == send(socket_fds[1], "hi\n", 3, 0));
    +    ASSERT_EQ(3, send(socket_fds[1], "hi\n", 3, 0));
         assert_wait_child(child_pid);
       } else {
         /* child */
    -    ASSERT(0 == uv_loop_fork(uv_default_loop()));
    -    ASSERT(0 == socket_cb_called);
    -    ASSERT(0 == uv_poll_start(&poll_handle, UV_READABLE, socket_cb));
    +    ASSERT_OK(uv_loop_fork(uv_default_loop()));
    +    ASSERT_OK(socket_cb_called);
    +    ASSERT_OK(uv_poll_start(&poll_handle, UV_READABLE, socket_cb));
         printf("Going to run the loop in the child\n");
    -    ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    -    ASSERT(1 == socket_cb_called);
    +    ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +    ASSERT_EQ(1, socket_cb_called);
       }
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
    @@ -176,57 +176,57 @@ TEST_IMPL(fork_socketpair_started) {
       char sync_buf[1];
       uv_poll_t poll_handle;
     
    -  ASSERT(0 == pipe(sync_pipe));
    +  ASSERT_OK(pipe(sync_pipe));
     
       /* Prime the loop. */
       run_timer_loop_once();
     
    -  ASSERT(0 == socketpair(AF_UNIX, SOCK_STREAM, 0, socket_fds));
    +  ASSERT_OK(socketpair(AF_UNIX, SOCK_STREAM, 0, socket_fds));
     
       /* Create and start the server watcher in the parent, use it in the child. */
    -  ASSERT(0 == uv_poll_init(uv_default_loop(), &poll_handle, socket_fds[0]));
    -  ASSERT(0 == uv_poll_start(&poll_handle, UV_READABLE, socket_cb));
    +  ASSERT_OK(uv_poll_init(uv_default_loop(), &poll_handle, socket_fds[0]));
    +  ASSERT_OK(uv_poll_start(&poll_handle, UV_READABLE, socket_cb));
     
       /* Run the loop AFTER the poll watcher is registered to make sure it
          gets passed to the kernel. Use NOWAIT and expect a non-zero
          return to prove the poll watcher is active.
       */
    -  ASSERT(1 == uv_run(uv_default_loop(), UV_RUN_NOWAIT));
    +  ASSERT_EQ(1, uv_run(uv_default_loop(), UV_RUN_NOWAIT));
     
     #if defined(__APPLE__) && (TARGET_OS_TV || TARGET_OS_WATCH)
       child_pid = -1;
     #else
       child_pid = fork();
     #endif
    -  ASSERT(child_pid != -1);
    +  ASSERT_NE(child_pid, -1);
     
       if (child_pid != 0) {
         /* parent */
    -    ASSERT(0 == uv_poll_stop(&poll_handle));
    +    ASSERT_OK(uv_poll_stop(&poll_handle));
         uv_close((uv_handle_t*)&poll_handle, NULL);
    -    ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    -    ASSERT(0 == socket_cb_called);
    -    ASSERT(1 == write(sync_pipe[1], "1", 1)); /* alert child */
    -    ASSERT(3 == send(socket_fds[1], "hi\n", 3, 0));
    +    ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +    ASSERT_OK(socket_cb_called);
    +    ASSERT_EQ(1, write(sync_pipe[1], "1", 1)); /* alert child */
    +    ASSERT_EQ(3, send(socket_fds[1], "hi\n", 3, 0));
     
    -    ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    -    ASSERT(0 == socket_cb_called);
    +    ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +    ASSERT_OK(socket_cb_called);
     
         assert_wait_child(child_pid);
       } else {
         /* child */
         printf("Child is %d\n", getpid());
    -    ASSERT(1 == read(sync_pipe[0], sync_buf, 1)); /* wait for parent */
    -    ASSERT(0 == uv_loop_fork(uv_default_loop()));
    -    ASSERT(0 == socket_cb_called);
    +    ASSERT_EQ(1, read(sync_pipe[0], sync_buf, 1)); /* wait for parent */
    +    ASSERT_OK(uv_loop_fork(uv_default_loop()));
    +    ASSERT_OK(socket_cb_called);
     
         printf("Going to run the loop in the child\n");
         socket_cb_read_fd = socket_fds[0];
         socket_cb_read_size = 3;
    -    ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    -    ASSERT(1 == socket_cb_called);
    +    ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +    ASSERT_EQ(1, socket_cb_called);
         printf("Buf %s\n", socket_cb_read_buf);
    -    ASSERT(0 == strcmp("hi\n", socket_cb_read_buf));
    +    ASSERT_OK(strcmp("hi\n", socket_cb_read_buf));
       }
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
    @@ -253,41 +253,43 @@ TEST_IMPL(fork_signal_to_child) {
     
       fork_signal_cb_called = 0;    /* reset */
     
    -  ASSERT(0 == pipe(sync_pipe));
    +  ASSERT_OK(pipe(sync_pipe));
     
       /* Prime the loop. */
       run_timer_loop_once();
     
    -  ASSERT(0 == uv_signal_init(uv_default_loop(), &signal_handle));
    -  ASSERT(0 == uv_signal_start(&signal_handle, fork_signal_to_child_cb, SIGUSR1));
    +  ASSERT_OK(uv_signal_init(uv_default_loop(), &signal_handle));
    +  ASSERT_OK(uv_signal_start(&signal_handle,
    +                            fork_signal_to_child_cb,
    +                            SIGUSR1));
     
     #if defined(__APPLE__) && (TARGET_OS_TV || TARGET_OS_WATCH)
       child_pid = -1;
     #else
       child_pid = fork();
     #endif
    -  ASSERT(child_pid != -1);
    +  ASSERT_NE(child_pid, -1);
     
       if (child_pid != 0) {
         /* parent */
    -    ASSERT(1 == read(sync_pipe[0], sync_buf, 1)); /* wait for child */
    -    ASSERT(0 == kill(child_pid, SIGUSR1));
    +    ASSERT_EQ(1, read(sync_pipe[0], sync_buf, 1)); /* wait for child */
    +    ASSERT_OK(kill(child_pid, SIGUSR1));
         /* Run the loop, make sure we don't get the signal. */
         printf("Running loop in parent\n");
         uv_unref((uv_handle_t*)&signal_handle);
    -    ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_NOWAIT));
    -    ASSERT(0 == fork_signal_cb_called);
    +    ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_NOWAIT));
    +    ASSERT_OK(fork_signal_cb_called);
         printf("Waiting for child in parent\n");
         assert_wait_child(child_pid);
       } else {
         /* child */
    -    ASSERT(0 == uv_loop_fork(uv_default_loop()));
    -    ASSERT(1 == write(sync_pipe[1], "1", 1)); /* alert parent */
    +    ASSERT_OK(uv_loop_fork(uv_default_loop()));
    +    ASSERT_EQ(1, write(sync_pipe[1], "1", 1)); /* alert parent */
         /* Get the signal. */
    -    ASSERT(0 != uv_loop_alive(uv_default_loop()));
    +    ASSERT_NE(0, uv_loop_alive(uv_default_loop()));
         printf("Running loop in child\n");
    -    ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_ONCE));
    -    ASSERT(SIGUSR1 == fork_signal_cb_called);
    +    ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_ONCE));
    +    ASSERT_EQ(SIGUSR1, fork_signal_cb_called);
       }
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
    @@ -308,47 +310,49 @@ TEST_IMPL(fork_signal_to_child_closed) {
     
       fork_signal_cb_called = 0;    /* reset */
     
    -  ASSERT(0 == pipe(sync_pipe));
    -  ASSERT(0 == pipe(sync_pipe2));
    +  ASSERT_OK(pipe(sync_pipe));
    +  ASSERT_OK(pipe(sync_pipe2));
     
       /* Prime the loop. */
       run_timer_loop_once();
     
    -  ASSERT(0 == uv_signal_init(uv_default_loop(), &signal_handle));
    -  ASSERT(0 == uv_signal_start(&signal_handle, fork_signal_to_child_cb, SIGUSR1));
    +  ASSERT_OK(uv_signal_init(uv_default_loop(), &signal_handle));
    +  ASSERT_OK(uv_signal_start(&signal_handle,
    +                            fork_signal_to_child_cb,
    +                            SIGUSR1));
     
     #if defined(__APPLE__) && (TARGET_OS_TV || TARGET_OS_WATCH)
       child_pid = -1;
     #else
       child_pid = fork();
     #endif
    -  ASSERT(child_pid != -1);
    +  ASSERT_NE(child_pid, -1);
     
       if (child_pid != 0) {
         /* parent */
         printf("Wating on child in parent\n");
    -    ASSERT(1 == read(sync_pipe[0], sync_buf, 1)); /* wait for child */
    +    ASSERT_EQ(1, read(sync_pipe[0], sync_buf, 1)); /* wait for child */
         printf("Parent killing child\n");
    -    ASSERT(0 == kill(child_pid, SIGUSR1));
    +    ASSERT_OK(kill(child_pid, SIGUSR1));
         /* Run the loop, make sure we don't get the signal. */
         printf("Running loop in parent\n");
         uv_unref((uv_handle_t*)&signal_handle); /* so the loop can exit;
                                                    we *shouldn't* get any signals */
         run_timer_loop_once(); /* but while we share a pipe, we do, so
                                   have something active. */
    -    ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_ONCE));
    +    ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_ONCE));
         printf("Signal in parent %d\n", fork_signal_cb_called);
    -    ASSERT(0 == fork_signal_cb_called);
    -    ASSERT(1 == write(sync_pipe2[1], "1", 1)); /* alert child */
    +    ASSERT_OK(fork_signal_cb_called);
    +    ASSERT_EQ(1, write(sync_pipe2[1], "1", 1)); /* alert child */
         printf("Waiting for child in parent\n");
         assert_wait_child(child_pid);
       } else {
         /* Child. Our signal handler should still be installed. */
    -    ASSERT(0 == uv_loop_fork(uv_default_loop()));
    +    ASSERT_OK(uv_loop_fork(uv_default_loop()));
         printf("Checking loop in child\n");
    -    ASSERT(0 != uv_loop_alive(uv_default_loop()));
    +    ASSERT_NE(0, uv_loop_alive(uv_default_loop()));
         printf("Alerting parent in child\n");
    -    ASSERT(1 == write(sync_pipe[1], "1", 1)); /* alert parent */
    +    ASSERT_EQ(1, write(sync_pipe[1], "1", 1)); /* alert parent */
         /* Don't run the loop. Wait for the parent to call us */
         printf("Waiting on parent in child\n");
         /* Wait for parent. read may fail if the parent tripped an ASSERT
    @@ -356,7 +360,7 @@ TEST_IMPL(fork_signal_to_child_closed) {
         */
         r = read(sync_pipe2[0], sync_buf, 1);
         ASSERT(-1 <= r && r <= 1);
    -    ASSERT(0 == fork_signal_cb_called);
    +    ASSERT_OK(fork_signal_cb_called);
         printf("Exiting child \n");
         /* Note that we're deliberately not running the loop
          * in the child, and also not closing the loop's handles,
    @@ -371,6 +375,47 @@ TEST_IMPL(fork_signal_to_child_closed) {
       return 0;
     }
     
    +static void fork_signal_cb(uv_signal_t* h, int s) {
    +  fork_signal_cb_called = s;
    +}
    +static void empty_close_cb(uv_handle_t* h){}
    +
    +TEST_IMPL(fork_close_signal_in_child) {
    +  uv_loop_t loop;
    +  uv_signal_t signal_handle;
    +  pid_t child_pid;
    +
    +  ASSERT_OK(uv_loop_init(&loop));
    +  ASSERT_OK(uv_signal_init(&loop, &signal_handle));
    +  ASSERT_OK(uv_signal_start(&signal_handle, &fork_signal_cb, SIGHUP));
    +
    +  ASSERT_OK(kill(getpid(), SIGHUP));
    +  child_pid = fork();
    +  ASSERT_NE(child_pid, -1);
    +  ASSERT_OK(fork_signal_cb_called);
    +
    +  if (!child_pid) {
    +    uv_loop_fork(&loop);
    +    uv_close((uv_handle_t*)&signal_handle, &empty_close_cb);
    +    uv_run(&loop, UV_RUN_DEFAULT);
    +    /* Child doesn't receive the signal */
    +    ASSERT_OK(fork_signal_cb_called);
    +  } else {
    +    /* Parent. Runing once to receive the signal */
    +    uv_run(&loop, UV_RUN_ONCE);
    +    ASSERT_EQ(SIGHUP, fork_signal_cb_called);
    +
    +    /* loop should stop after closing the only handle */
    +    uv_close((uv_handle_t*)&signal_handle, &empty_close_cb);
    +    ASSERT_OK(uv_run(&loop, UV_RUN_DEFAULT));
    +
    +    assert_wait_child(child_pid);
    +  }
    +
    +  MAKE_VALGRIND_HAPPY(&loop);
    +  return 0;
    +}
    +
     
     static void create_file(const char* name) {
       int r;
    @@ -378,11 +423,11 @@ static void create_file(const char* name) {
       uv_fs_t req;
     
       r = uv_fs_open(NULL, &req, name, O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    +  ASSERT_GE(r, 0);
       file = r;
       uv_fs_req_cleanup(&req);
       r = uv_fs_close(NULL, &req, file, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&req);
     }
     
    @@ -394,17 +439,17 @@ static void touch_file(const char* name) {
       uv_buf_t buf;
     
       r = uv_fs_open(NULL, &req, name, O_RDWR, 0, NULL);
    -  ASSERT(r >= 0);
    +  ASSERT_GE(r, 0);
       file = r;
       uv_fs_req_cleanup(&req);
     
       buf = uv_buf_init("foo", 4);
       r = uv_fs_write(NULL, &req, file, &buf, 1, -1, NULL);
    -  ASSERT(r >= 0);
    +  ASSERT_GE(r, 0);
       uv_fs_req_cleanup(&req);
     
       r = uv_fs_close(NULL, &req, file, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&req);
     }
     
    @@ -424,11 +469,11 @@ static void fs_event_cb_file_current_dir(uv_fs_event_t* handle,
                                              const char* filename,
                                              int events,
                                              int status) {
    -  ASSERT(fs_event_cb_called == 0);
    +  ASSERT_OK(fs_event_cb_called);
       ++fs_event_cb_called;
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     #if defined(__APPLE__) || defined(__linux__)
    -  ASSERT(strcmp(filename, "watch_file") == 0);
    +  ASSERT_OK(strcmp(filename, "watch_file"));
     #else
       ASSERT(filename == NULL || strcmp(filename, "watch_file") == 0);
     #endif
    @@ -446,28 +491,28 @@ static void assert_watch_file_current_dir(uv_loop_t* const loop, int file_or_dir
       create_file("watch_file");
     
       r = uv_fs_event_init(loop, &fs_event);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       /* watching a dir is the only way to get fsevents involved on apple
          platforms */
       r = uv_fs_event_start(&fs_event,
                             fs_event_cb_file_current_dir,
                             file_or_dir == 1 ? "." : "watch_file",
                             0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_timer_init(loop, &timer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_timer_start(&timer, timer_cb_touch, 100, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(timer_cb_touch_called == 0);
    -  ASSERT(fs_event_cb_called == 0);
    +  ASSERT_OK(timer_cb_touch_called);
    +  ASSERT_OK(fs_event_cb_called);
     
       uv_run(loop, UV_RUN_DEFAULT);
     
    -  ASSERT(timer_cb_touch_called == 1);
    -  ASSERT(fs_event_cb_called == 1);
    +  ASSERT_EQ(1, timer_cb_touch_called);
    +  ASSERT_EQ(1, fs_event_cb_called);
     
       /* Cleanup */
       remove("watch_file");
    @@ -492,7 +537,7 @@ static int _do_fork_fs_events_child(int file_or_dir) {
     #else
       child_pid = fork();
     #endif
    -  ASSERT(child_pid != -1);
    +  ASSERT_NE(child_pid, -1);
     
       if (child_pid != 0) {
         /* parent */
    @@ -508,10 +553,10 @@ static int _do_fork_fs_events_child(int file_or_dir) {
         uv_loop_init(&loop);
         printf("Child first watch\n");
         assert_watch_file_current_dir(&loop, file_or_dir);
    -    ASSERT(0 == uv_loop_close(&loop));
    +    ASSERT_OK(uv_loop_close(&loop));
         printf("Child second watch default loop\n");
         /* Ee can watch in the default loop. */
    -    ASSERT(0 == uv_loop_fork(uv_default_loop()));
    +    ASSERT_OK(uv_loop_fork(uv_default_loop()));
         /* On some platforms (OS X), if we don't update the time now,
          * the timer cb fires before the event loop enters uv__io_poll,
          * instead of after, meaning we don't see the change! This may be
    @@ -524,7 +569,7 @@ static int _do_fork_fs_events_child(int file_or_dir) {
            especially important on Apple platforms where if we're not
            careful trying to touch the CFRunLoop, even just to shut it
            down, that we allocated in the FS_TEST_DIR case would crash. */
    -    ASSERT(0 == uv_loop_close(uv_default_loop()));
    +    ASSERT_OK(uv_loop_close(uv_default_loop()));
     
         printf("Exiting child \n");
       }
    @@ -587,40 +632,40 @@ TEST_IMPL(fork_fs_events_file_parent_child) {
       create_file("watch_file");
     
       r = uv_fs_event_init(loop, &fs_event);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fs_event_start(&fs_event,
                             fs_event_cb_file_current_dir,
                             "watch_file",
                             0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_timer_init(loop, &timer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
     #if defined(__APPLE__) && (TARGET_OS_TV || TARGET_OS_WATCH)
       child_pid = -1;
     #else
       child_pid = fork();
     #endif
    -  ASSERT(child_pid != -1);
    +  ASSERT_NE(child_pid, -1);
       if (child_pid != 0) {
         /* parent */
         assert_wait_child(child_pid);
       } else {
         /* child */
         printf("Running child\n");
    -    ASSERT(0 == uv_loop_fork(loop));
    +    ASSERT_OK(uv_loop_fork(loop));
     
         r = uv_timer_start(&timer, timer_cb_touch, 100, 0);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
    -    ASSERT(timer_cb_touch_called == 0);
    -    ASSERT(fs_event_cb_called == 0);
    +    ASSERT_OK(timer_cb_touch_called);
    +    ASSERT_OK(fs_event_cb_called);
         printf("Running loop in child \n");
         uv_run(loop, UV_RUN_DEFAULT);
     
    -    ASSERT(timer_cb_touch_called == 1);
    -    ASSERT(fs_event_cb_called == 1);
    +    ASSERT_EQ(1, timer_cb_touch_called);
    +    ASSERT_EQ(1, fs_event_cb_called);
     
         /* Cleanup */
         remove("watch_file");
    @@ -646,7 +691,7 @@ static void work_cb(uv_work_t* req) {
     
     
     static void after_work_cb(uv_work_t* req, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       after_work_cb_count++;
     }
     
    @@ -655,16 +700,16 @@ static void assert_run_work(uv_loop_t* const loop) {
       uv_work_t work_req;
       int r;
     
    -  ASSERT(work_cb_count == 0);
    -  ASSERT(after_work_cb_count == 0);
    +  ASSERT_OK(work_cb_count);
    +  ASSERT_OK(after_work_cb_count);
       printf("Queue in %d\n", getpid());
       r = uv_queue_work(loop, &work_req, work_cb, after_work_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       printf("Running in %d\n", getpid());
       uv_run(loop, UV_RUN_DEFAULT);
     
    -  ASSERT(work_cb_count == 1);
    -  ASSERT(after_work_cb_count == 1);
    +  ASSERT_EQ(1, work_cb_count);
    +  ASSERT_EQ(1, after_work_cb_count);
     
       /* cleanup  */
       work_cb_count = 0;
    @@ -691,7 +736,7 @@ TEST_IMPL(fork_threadpool_queue_work_simple) {
     #else
       child_pid = fork();
     #endif
    -  ASSERT(child_pid != -1);
    +  ASSERT_NE(child_pid, -1);
     
       if (child_pid != 0) {
         /* Parent. We can still run work. */
    @@ -706,7 +751,7 @@ TEST_IMPL(fork_threadpool_queue_work_simple) {
         uv_loop_close(&loop);
         printf("Child second watch default loop\n");
         /* We can work in the default loop. */
    -    ASSERT(0 == uv_loop_fork(uv_default_loop()));
    +    ASSERT_OK(uv_loop_fork(uv_default_loop()));
         assert_run_work(uv_default_loop());
         printf("Exiting child \n");
       }
    diff --git a/deps/uv/test/test-fs-copyfile.c b/deps/uv/test/test-fs-copyfile.c
    index d7f04cf4cddea8..3f159aeb68fa89 100644
    --- a/deps/uv/test/test-fs-copyfile.c
    +++ b/deps/uv/test/test-fs-copyfile.c
    @@ -48,19 +48,19 @@ static void handle_result(uv_fs_t* req) {
       uint64_t mode;
       int r;
     
    -  ASSERT(req->fs_type == UV_FS_COPYFILE);
    -  ASSERT(req->result == 0);
    +  ASSERT_EQ(req->fs_type, UV_FS_COPYFILE);
    +  ASSERT_OK(req->result);
     
       /* Verify that the file size and mode are the same. */
       r = uv_fs_stat(NULL, &stat_req, req->path, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       size = stat_req.statbuf.st_size;
       mode = stat_req.statbuf.st_mode;
       uv_fs_req_cleanup(&stat_req);
       r = uv_fs_stat(NULL, &stat_req, dst, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(stat_req.statbuf.st_size == size);
    -  ASSERT(stat_req.statbuf.st_mode == mode);
    +  ASSERT_OK(r);
    +  ASSERT_EQ(stat_req.statbuf.st_size, size);
    +  ASSERT_EQ(stat_req.statbuf.st_mode, mode);
       uv_fs_req_cleanup(&stat_req);
       uv_fs_req_cleanup(req);
       result_check_count++;
    @@ -77,7 +77,7 @@ static void touch_file(const char* name, unsigned int size) {
       r = uv_fs_open(NULL, &req, name, O_WRONLY | O_CREAT | O_TRUNC,
                      S_IWUSR | S_IRUSR, NULL);
       uv_fs_req_cleanup(&req);
    -  ASSERT(r >= 0);
    +  ASSERT_GE(r, 0);
       file = r;
     
       buf = uv_buf_init("a", 1);
    @@ -86,12 +86,12 @@ static void touch_file(const char* name, unsigned int size) {
       for (i = 0; i < size; i++) {
         r = uv_fs_write(NULL, &req, file, &buf, 1, i, NULL);
         uv_fs_req_cleanup(&req);
    -    ASSERT(r >= 0);
    +    ASSERT_GE(r, 0);
       }
     
       r = uv_fs_close(NULL, &req, file, NULL);
       uv_fs_req_cleanup(&req);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -105,102 +105,102 @@ TEST_IMPL(fs_copyfile) {
     
       /* Fails with EINVAL if bad flags are passed. */
       r = uv_fs_copyfile(NULL, &req, src, dst, -1, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       uv_fs_req_cleanup(&req);
     
       /* Fails with ENOENT if source does not exist. */
       unlink(src);
       unlink(dst);
       r = uv_fs_copyfile(NULL, &req, src, dst, 0, NULL);
    -  ASSERT(req.result == UV_ENOENT);
    -  ASSERT(r == UV_ENOENT);
    +  ASSERT_EQ(req.result, UV_ENOENT);
    +  ASSERT_EQ(r, UV_ENOENT);
       uv_fs_req_cleanup(&req);
       /* The destination should not exist. */
       r = uv_fs_stat(NULL, &req, dst, NULL);
    -  ASSERT(r != 0);
    +  ASSERT(r);
       uv_fs_req_cleanup(&req);
     
       /* Succeeds if src and dst files are identical. */
       touch_file(src, 12);
       r = uv_fs_copyfile(NULL, &req, src, src, 0, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&req);
       /* Verify that the src file did not get truncated. */
       r = uv_fs_stat(NULL, &req, src, NULL);
    -  ASSERT_EQ(r, 0);
    -  ASSERT_EQ(req.statbuf.st_size, 12);
    +  ASSERT_OK(r);
    +  ASSERT_EQ(12, req.statbuf.st_size);
       uv_fs_req_cleanup(&req);
       unlink(src);
     
       /* Copies file synchronously. Creates new file. */
       unlink(dst);
       r = uv_fs_copyfile(NULL, &req, fixture, dst, 0, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       handle_result(&req);
     
       /* Copies a file of size zero. */
       unlink(dst);
       touch_file(src, 0);
       r = uv_fs_copyfile(NULL, &req, src, dst, 0, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       handle_result(&req);
     
       /* Copies file synchronously. Overwrites existing file. */
       r = uv_fs_copyfile(NULL, &req, fixture, dst, 0, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       handle_result(&req);
     
       /* Fails to overwrites existing file. */
    -  ASSERT_EQ(uv_fs_chmod(NULL, &req, dst, 0644, NULL), 0);
    +  ASSERT_OK(uv_fs_chmod(NULL, &req, dst, 0644, NULL));
       uv_fs_req_cleanup(&req);
       r = uv_fs_copyfile(NULL, &req, fixture, dst, UV_FS_COPYFILE_EXCL, NULL);
    -  ASSERT(r == UV_EEXIST);
    +  ASSERT_EQ(r, UV_EEXIST);
       uv_fs_req_cleanup(&req);
     
       /* Truncates when an existing destination is larger than the source file. */
    -  ASSERT_EQ(uv_fs_chmod(NULL, &req, dst, 0644, NULL), 0);
    +  ASSERT_OK(uv_fs_chmod(NULL, &req, dst, 0644, NULL));
       uv_fs_req_cleanup(&req);
       touch_file(src, 1);
       r = uv_fs_copyfile(NULL, &req, src, dst, 0, NULL);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
       handle_result(&req);
     
       /* Copies a larger file. */
       unlink(dst);
       touch_file(src, 4096 * 2);
       r = uv_fs_copyfile(NULL, &req, src, dst, 0, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       handle_result(&req);
       unlink(src);
     
       /* Copies file asynchronously */
       unlink(dst);
       r = uv_fs_copyfile(loop, &req, fixture, dst, 0, handle_result);
    -  ASSERT(r == 0);
    -  ASSERT(result_check_count == 5);
    +  ASSERT_OK(r);
    +  ASSERT_EQ(5, result_check_count);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(result_check_count == 6);
    +  ASSERT_EQ(6, result_check_count);
       /* Ensure file is user-writable (not copied from src). */
    -  ASSERT_EQ(uv_fs_chmod(NULL, &req, dst, 0644, NULL), 0);
    +  ASSERT_OK(uv_fs_chmod(NULL, &req, dst, 0644, NULL));
       uv_fs_req_cleanup(&req);
     
       /* If the flags are invalid, the loop should not be kept open */
       unlink(dst);
       r = uv_fs_copyfile(loop, &req, fixture, dst, -1, fail_cb);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       uv_run(loop, UV_RUN_DEFAULT);
     
       /* Copies file using UV_FS_COPYFILE_FICLONE. */
       unlink(dst);
       r = uv_fs_copyfile(NULL, &req, fixture, dst, UV_FS_COPYFILE_FICLONE, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       handle_result(&req);
     
       /* Copies file using UV_FS_COPYFILE_FICLONE_FORCE. */
       unlink(dst);
       r = uv_fs_copyfile(NULL, &req, fixture, dst, UV_FS_COPYFILE_FICLONE_FORCE,
                          NULL);
    -  ASSERT(r <= 0);
    +  ASSERT_LE(r, 0);
     
       if (r == 0)
         handle_result(&req);
    @@ -213,8 +213,8 @@ TEST_IMPL(fs_copyfile) {
       r = uv_fs_copyfile(NULL, &req, fixture, dst, 0, NULL);
       /* On IBMi PASE, qsecofr users can overwrite read-only files */
     # ifndef __PASE__
    -  ASSERT(req.result == UV_EACCES);
    -  ASSERT(r == UV_EACCES);
    +  ASSERT_EQ(req.result, UV_EACCES);
    +  ASSERT_EQ(r, UV_EACCES);
     # endif
       uv_fs_req_cleanup(&req);
     #endif
    diff --git a/deps/uv/test/test-fs-event.c b/deps/uv/test/test-fs-event.c
    index 9f231ebfc01e9a..7b5c0d8eb3d967 100644
    --- a/deps/uv/test/test-fs-event.c
    +++ b/deps/uv/test/test-fs-event.c
    @@ -81,11 +81,11 @@ static void create_file(const char* name) {
       uv_fs_t req;
     
       r = uv_fs_open(NULL, &req, name, O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    +  ASSERT_GE(r, 0);
       file = r;
       uv_fs_req_cleanup(&req);
       r = uv_fs_close(NULL, &req, file, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&req);
     }
     
    @@ -96,17 +96,17 @@ static void touch_file(const char* name) {
       uv_buf_t buf;
     
       r = uv_fs_open(NULL, &req, name, O_RDWR, 0, NULL);
    -  ASSERT(r >= 0);
    +  ASSERT_GE(r, 0);
       file = r;
       uv_fs_req_cleanup(&req);
     
       buf = uv_buf_init("foo", 4);
       r = uv_fs_write(NULL, &req, file, &buf, 1, -1, NULL);
    -  ASSERT(r >= 0);
    +  ASSERT_GE(r, 0);
       uv_fs_req_cleanup(&req);
     
       r = uv_fs_close(NULL, &req, file, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&req);
     }
     
    @@ -125,15 +125,15 @@ static void fail_cb(uv_fs_event_t* handle,
     static void fs_event_cb_dir(uv_fs_event_t* handle, const char* filename,
       int events, int status) {
       ++fs_event_cb_called;
    -  ASSERT(handle == &fs_event);
    -  ASSERT(status == 0);
    -  ASSERT(events == UV_CHANGE);
    +  ASSERT_PTR_EQ(handle, &fs_event);
    +  ASSERT_OK(status);
    +  ASSERT_EQ(events, UV_CHANGE);
       #if defined(__APPLE__) || defined(_WIN32) || defined(__linux__)
    -  ASSERT(strcmp(filename, "file1") == 0);
    +  ASSERT_OK(strcmp(filename, "file1"));
       #else
       ASSERT(filename == NULL || strcmp(filename, "file1") == 0);
       #endif
    -  ASSERT(0 == uv_fs_event_stop(handle));
    +  ASSERT_OK(uv_fs_event_stop(handle));
       uv_close((uv_handle_t*)handle, close_cb);
     }
     
    @@ -148,7 +148,7 @@ static const char* fs_event_get_filename(int i) {
     
     static void fs_event_create_files(uv_timer_t* handle) {
       /* Make sure we're not attempting to create files we do not intend */
    -  ASSERT(fs_event_created < fs_event_file_count);
    +  ASSERT_LT(fs_event_created, fs_event_file_count);
     
       /* Create the file */
       create_file(fs_event_get_filename(fs_event_created));
    @@ -156,7 +156,7 @@ static void fs_event_create_files(uv_timer_t* handle) {
       if (++fs_event_created < fs_event_file_count) {
         /* Create another file on a different event loop tick.  We do it this way
          * to avoid fs events coalescing into one fs event. */
    -    ASSERT_EQ(0, uv_timer_start(&timer, fs_event_create_files, 100, 0));
    +    ASSERT_OK(uv_timer_start(&timer, fs_event_create_files, 100, 0));
       }
     }
     
    @@ -170,19 +170,19 @@ static void fs_event_unlink_files(uv_timer_t* handle) {
         for (i = 0; i < 16; i++) {
           r = remove(fs_event_get_filename(i));
           if (handle != NULL)
    -        ASSERT(r == 0);
    +        ASSERT_OK(r);
         }
       } else {
         /* Make sure we're not attempting to remove files we do not intend */
    -    ASSERT(fs_event_removed < fs_event_file_count);
    +    ASSERT_LT(fs_event_removed, fs_event_file_count);
     
         /* Remove the file */
    -    ASSERT(0 == remove(fs_event_get_filename(fs_event_removed)));
    +    ASSERT_OK(remove(fs_event_get_filename(fs_event_removed)));
     
         if (++fs_event_removed < fs_event_file_count) {
           /* Remove another file on a different event loop tick.  We do it this way
            * to avoid fs events coalescing into one fs event. */
    -      ASSERT(0 == uv_timer_start(&timer, fs_event_unlink_files, 1, 0));
    +      ASSERT_OK(uv_timer_start(&timer, fs_event_unlink_files, 1, 0));
         }
       }
     }
    @@ -192,19 +192,19 @@ static void fs_event_cb_dir_multi_file(uv_fs_event_t* handle,
                                            int events,
                                            int status) {
       fs_event_cb_called++;
    -  ASSERT(handle == &fs_event);
    -  ASSERT(status == 0);
    +  ASSERT_PTR_EQ(handle, &fs_event);
    +  ASSERT_OK(status);
       ASSERT(events == UV_CHANGE || events == UV_RENAME);
       #if defined(__APPLE__) || defined(_WIN32) || defined(__linux__)
    -  ASSERT(strncmp(filename, file_prefix, sizeof(file_prefix) - 1) == 0);
    +  ASSERT_OK(strncmp(filename, file_prefix, sizeof(file_prefix) - 1));
       #else
    -  ASSERT(filename == NULL ||
    -         strncmp(filename, file_prefix, sizeof(file_prefix) - 1) == 0);
    +  ASSERT_NE(filename == NULL ||
    +            strncmp(filename, file_prefix, sizeof(file_prefix) - 1) == 0, 0);
       #endif
     
       if (fs_event_created + fs_event_removed == fs_event_file_count) {
         /* Once we've processed all create events, delete all files */
    -    ASSERT(0 == uv_timer_start(&timer, fs_event_unlink_files, 1, 0));
    +    ASSERT_OK(uv_timer_start(&timer, fs_event_unlink_files, 1, 0));
       } else if (fs_event_cb_called == 2 * fs_event_file_count) {
         /* Once we've processed all create and delete events, stop watching */
         uv_close((uv_handle_t*) &timer, close_cb);
    @@ -224,7 +224,7 @@ static const char* fs_event_get_filename_in_subdir(int i) {
     
     static void fs_event_create_files_in_subdir(uv_timer_t* handle) {
       /* Make sure we're not attempting to create files we do not intend */
    -  ASSERT(fs_event_created < fs_event_file_count);
    +  ASSERT_LT(fs_event_created, fs_event_file_count);
     
       /* Create the file */
       create_file(fs_event_get_filename_in_subdir(fs_event_created));
    @@ -232,8 +232,7 @@ static void fs_event_create_files_in_subdir(uv_timer_t* handle) {
       if (++fs_event_created < fs_event_file_count) {
         /* Create another file on a different event loop tick.  We do it this way
          * to avoid fs events coalescing into one fs event. */
    -    ASSERT_EQ(0,
    -              uv_timer_start(&timer, fs_event_create_files_in_subdir, 100, 0));
    +    ASSERT_OK(uv_timer_start(&timer, fs_event_create_files_in_subdir, 100, 0));
       }
     }
     
    @@ -247,19 +246,22 @@ static void fs_event_unlink_files_in_subdir(uv_timer_t* handle) {
         for (i = 0; i < 16; i++) {
           r = remove(fs_event_get_filename_in_subdir(i));
           if (handle != NULL)
    -        ASSERT(r == 0);
    +        ASSERT_OK(r);
         }
       } else {
         /* Make sure we're not attempting to remove files we do not intend */
    -    ASSERT(fs_event_removed < fs_event_file_count);
    +    ASSERT_LT(fs_event_removed, fs_event_file_count);
     
         /* Remove the file */
    -    ASSERT(0 == remove(fs_event_get_filename_in_subdir(fs_event_removed)));
    +    ASSERT_OK(remove(fs_event_get_filename_in_subdir(fs_event_removed)));
     
         if (++fs_event_removed < fs_event_file_count) {
           /* Remove another file on a different event loop tick.  We do it this way
            * to avoid fs events coalescing into one fs event. */
    -      ASSERT(0 == uv_timer_start(&timer, fs_event_unlink_files_in_subdir, 1, 0));
    +      ASSERT_OK(uv_timer_start(&timer,
    +                               fs_event_unlink_files_in_subdir,
    +                               1,
    +                               0));
         }
       }
     }
    @@ -283,27 +285,30 @@ static void fs_event_cb_dir_multi_file_in_subdir(uv_fs_event_t* handle,
         return;
     
       fs_multievent_cb_called++;
    -  ASSERT(handle == &fs_event);
    -  ASSERT(status == 0);
    +  ASSERT_PTR_EQ(handle, &fs_event);
    +  ASSERT_OK(status);
       ASSERT(events == UV_CHANGE || events == UV_RENAME);
       #if defined(__APPLE__) || defined(_WIN32) || defined(__linux__)
    -  ASSERT(strncmp(filename,
    -                 file_prefix_in_subdir,
    -                 sizeof(file_prefix_in_subdir) - 1) == 0);
    +  ASSERT_OK(strncmp(filename,
    +                    file_prefix_in_subdir,
    +                    sizeof(file_prefix_in_subdir) - 1));
       #else
    -  ASSERT(filename == NULL ||
    -         strncmp(filename,
    -                 file_prefix_in_subdir,
    -                 sizeof(file_prefix_in_subdir) - 1) == 0);
    +  ASSERT_NE(filename == NULL ||
    +            strncmp(filename,
    +                    file_prefix_in_subdir,
    +                    sizeof(file_prefix_in_subdir) - 1) == 0, 0);
       #endif
     
       if (fs_event_created == fs_event_file_count &&
           fs_multievent_cb_called == fs_event_created) {
         /* Once we've processed all create events, delete all files */
    -    ASSERT(0 == uv_timer_start(&timer, fs_event_unlink_files_in_subdir, 1, 0));
    +    ASSERT_OK(uv_timer_start(&timer,
    +                             fs_event_unlink_files_in_subdir,
    +                             1,
    +                             0));
       } else if (fs_multievent_cb_called == 2 * fs_event_file_count) {
         /* Once we've processed all create and delete events, stop watching */
    -    ASSERT(fs_event_removed == fs_event_file_count);
    +    ASSERT_EQ(fs_event_removed, fs_event_file_count);
         uv_close((uv_handle_t*) &timer, close_cb);
         uv_close((uv_handle_t*) handle, close_cb);
       }
    @@ -313,15 +318,15 @@ static void fs_event_cb_dir_multi_file_in_subdir(uv_fs_event_t* handle,
     static void fs_event_cb_file(uv_fs_event_t* handle, const char* filename,
       int events, int status) {
       ++fs_event_cb_called;
    -  ASSERT(handle == &fs_event);
    -  ASSERT(status == 0);
    -  ASSERT(events == UV_CHANGE);
    +  ASSERT_PTR_EQ(handle, &fs_event);
    +  ASSERT_OK(status);
    +  ASSERT_EQ(events, UV_CHANGE);
       #if defined(__APPLE__) || defined(_WIN32) || defined(__linux__)
    -  ASSERT(strcmp(filename, "file2") == 0);
    +  ASSERT_OK(strcmp(filename, "file2"));
       #else
       ASSERT(filename == NULL || strcmp(filename, "file2") == 0);
       #endif
    -  ASSERT(0 == uv_fs_event_stop(handle));
    +  ASSERT_OK(uv_fs_event_stop(handle));
       uv_close((uv_handle_t*)handle, close_cb);
     }
     
    @@ -329,11 +334,11 @@ static void fs_event_cb_file_current_dir(uv_fs_event_t* handle,
       const char* filename, int events, int status) {
       ++fs_event_cb_called;
     
    -  ASSERT(handle == &fs_event);
    -  ASSERT(status == 0);
    -  ASSERT(events == UV_CHANGE);
    +  ASSERT_PTR_EQ(handle, &fs_event);
    +  ASSERT_OK(status);
    +  ASSERT_EQ(events, UV_CHANGE);
       #if defined(__APPLE__) || defined(_WIN32) || defined(__linux__)
    -  ASSERT(strcmp(filename, "watch_file") == 0);
    +  ASSERT_OK(strcmp(filename, "watch_file"));
       #else
       ASSERT(filename == NULL || strcmp(filename, "watch_file") == 0);
       #endif
    @@ -366,7 +371,7 @@ static void timer_cb_exact(uv_timer_t* handle) {
       } else {
         uv_close((uv_handle_t*)handle, NULL);
         r = uv_fs_event_stop(&fs_event);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         uv_close((uv_handle_t*) &fs_event, NULL);
       }
     
    @@ -384,9 +389,9 @@ static void fs_event_cb_close(uv_fs_event_t* handle,
                                   const char* filename,
                                   int events,
                                   int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
    -  ASSERT(fs_event_cb_called < 3);
    +  ASSERT_LT(fs_event_cb_called, 3);
       ++fs_event_cb_called;
     
       if (fs_event_cb_called == 3) {
    @@ -400,6 +405,8 @@ TEST_IMPL(fs_event_watch_dir) {
       RETURN_SKIP(NO_FS_EVENTS);
     #elif defined(__MVS__)
       RETURN_SKIP("Directory watching not supported on this platform.");
    +#elif defined(__APPLE__) && defined(__TSAN__)
    +  RETURN_SKIP("Times out under TSAN.");
     #endif
     
       uv_loop_t* loop = uv_default_loop();
    @@ -413,18 +420,18 @@ TEST_IMPL(fs_event_watch_dir) {
       create_dir("watch_dir");
     
       r = uv_fs_event_init(loop, &fs_event);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fs_event_start(&fs_event, fs_event_cb_dir_multi_file, "watch_dir", 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_timer_init(loop, &timer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_timer_start(&timer, fs_event_create_files, 100, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_run(loop, UV_RUN_DEFAULT);
     
    -  ASSERT(fs_event_cb_called == fs_event_created + fs_event_removed);
    -  ASSERT(close_cb_called == 2);
    +  ASSERT_EQ(fs_event_cb_called, fs_event_created + fs_event_removed);
    +  ASSERT_EQ(2, close_cb_called);
     
       /* Cleanup */
       fs_event_unlink_files(NULL);
    @@ -438,7 +445,9 @@ TEST_IMPL(fs_event_watch_dir) {
     
     
     TEST_IMPL(fs_event_watch_dir_recursive) {
    -#if defined(__APPLE__) || defined(_WIN32)
    +#if defined(__APPLE__) && defined(__TSAN__)
    +  RETURN_SKIP("Times out under TSAN.");
    +#elif defined(__APPLE__) || defined(_WIN32)
       uv_loop_t* loop;
       int r;
       uv_fs_event_t fs_event_root;
    @@ -454,27 +463,27 @@ TEST_IMPL(fs_event_watch_dir_recursive) {
       create_dir("watch_dir/subdir");
     
       r = uv_fs_event_init(loop, &fs_event);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fs_event_start(&fs_event,
                             fs_event_cb_dir_multi_file_in_subdir,
                             "watch_dir",
                             UV_FS_EVENT_RECURSIVE);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_timer_init(loop, &timer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_timer_start(&timer, fs_event_create_files_in_subdir, 100, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
     #ifndef _WIN32
       /* Also try to watch the root directory.
        * This will be noisier, so we're just checking for any couple events to happen. */
       r = uv_fs_event_init(loop, &fs_event_root);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fs_event_start(&fs_event_root,
                             fs_event_cb_close,
                             "/",
                             UV_FS_EVENT_RECURSIVE);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     #else
       fs_event_cb_called += 3;
       close_cb_called += 1;
    @@ -483,9 +492,9 @@ TEST_IMPL(fs_event_watch_dir_recursive) {
     
       uv_run(loop, UV_RUN_DEFAULT);
     
    -  ASSERT(fs_multievent_cb_called == fs_event_created + fs_event_removed);
    -  ASSERT(fs_event_cb_called == 3);
    -  ASSERT(close_cb_called == 3);
    +  ASSERT_EQ(fs_multievent_cb_called, fs_event_created + fs_event_removed);
    +  ASSERT_EQ(3, fs_event_cb_called);
    +  ASSERT_EQ(3, close_cb_called);
     
       /* Cleanup */
       fs_event_unlink_files_in_subdir(NULL);
    @@ -522,19 +531,19 @@ TEST_IMPL(fs_event_watch_dir_short_path) {
       has_shortnames = uv_fs_stat(NULL, &req, "watch_~1", NULL) != UV_ENOENT;
       if (has_shortnames) {
         r = uv_fs_event_init(loop, &fs_event);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         r = uv_fs_event_start(&fs_event, fs_event_cb_dir, "watch_~1", 0);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         r = uv_timer_init(loop, &timer);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         r = uv_timer_start(&timer, timer_cb_file, 100, 0);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
         uv_run(loop, UV_RUN_DEFAULT);
     
    -    ASSERT(fs_event_cb_called == 1);
    -    ASSERT(timer_cb_called == 1);
    -    ASSERT(close_cb_called == 1);
    +    ASSERT_EQ(1, fs_event_cb_called);
    +    ASSERT_EQ(1, timer_cb_called);
    +    ASSERT_EQ(1, close_cb_called);
       }
     
       /* Cleanup */
    @@ -568,19 +577,19 @@ TEST_IMPL(fs_event_watch_file) {
       create_file("watch_dir/file2");
     
       r = uv_fs_event_init(loop, &fs_event);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fs_event_start(&fs_event, fs_event_cb_file, "watch_dir/file2", 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_timer_init(loop, &timer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_timer_start(&timer, timer_cb_file, 100, 100);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_run(loop, UV_RUN_DEFAULT);
     
    -  ASSERT(fs_event_cb_called == 1);
    -  ASSERT(timer_cb_called == 2);
    -  ASSERT(close_cb_called == 2);
    +  ASSERT_EQ(1, fs_event_cb_called);
    +  ASSERT_EQ(2, timer_cb_called);
    +  ASSERT_EQ(2, close_cb_called);
     
       /* Cleanup */
       remove("watch_dir/file2");
    @@ -624,16 +633,16 @@ TEST_IMPL(fs_event_watch_file_exact_path) {
     #endif
     
       r = uv_fs_event_init(loop, &fs_event);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fs_event_start(&fs_event, fs_event_fail, "watch_dir/file.jsx", 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_timer_init(loop, &timer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_timer_start(&timer, timer_cb_exact, 100, 100);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    -  ASSERT(timer_cb_exact_called == 2);
    +  ASSERT_OK(r);
    +  ASSERT_EQ(2, timer_cb_exact_called);
     
       /* Cleanup */
       remove("watch_dir/file.js");
    @@ -656,13 +665,13 @@ TEST_IMPL(fs_event_watch_file_twice) {
       loop = uv_default_loop();
       timer.data = watchers;
     
    -  ASSERT(0 == uv_fs_event_init(loop, watchers + 0));
    -  ASSERT(0 == uv_fs_event_start(watchers + 0, fail_cb, path, 0));
    -  ASSERT(0 == uv_fs_event_init(loop, watchers + 1));
    -  ASSERT(0 == uv_fs_event_start(watchers + 1, fail_cb, path, 0));
    -  ASSERT(0 == uv_timer_init(loop, &timer));
    -  ASSERT(0 == uv_timer_start(&timer, timer_cb_watch_twice, 10, 0));
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_fs_event_init(loop, watchers + 0));
    +  ASSERT_OK(uv_fs_event_start(watchers + 0, fail_cb, path, 0));
    +  ASSERT_OK(uv_fs_event_init(loop, watchers + 1));
    +  ASSERT_OK(uv_fs_event_start(watchers + 1, fail_cb, path, 0));
    +  ASSERT_OK(uv_timer_init(loop, &timer));
    +  ASSERT_OK(uv_timer_start(&timer, timer_cb_watch_twice, 10, 0));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -690,31 +699,31 @@ TEST_IMPL(fs_event_watch_file_current_dir) {
     #endif
     
       r = uv_fs_event_init(loop, &fs_event);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fs_event_start(&fs_event,
                             fs_event_cb_file_current_dir,
                             "watch_file",
                             0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
     
       r = uv_timer_init(loop, &timer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       timer.data = "watch_file";
       r = uv_timer_start(&timer, timer_cb_touch, 1100, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(timer_cb_touch_called == 0);
    -  ASSERT(fs_event_cb_called == 0);
    -  ASSERT(close_cb_called == 0);
    +  ASSERT_OK(timer_cb_touch_called);
    +  ASSERT_OK(fs_event_cb_called);
    +  ASSERT_OK(close_cb_called);
     
       uv_run(loop, UV_RUN_DEFAULT);
     
    -  ASSERT(timer_cb_touch_called == 1);
    +  ASSERT_EQ(1, timer_cb_touch_called);
       /* FSEvents on macOS sometimes sends one change event, sometimes two. */
       ASSERT_NE(0, fs_event_cb_called);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
     
       /* Cleanup */
       remove("watch_file");
    @@ -737,11 +746,11 @@ TEST_IMPL(fs_event_watch_file_root_dir) {
       loop = uv_default_loop();
     
       r = uv_fs_event_init(loop, &fs_event);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fs_event_start(&fs_event, fail_cb, path, 0);
       if (r == UV_ENOENT)
         RETURN_SKIP("bootsect.bak doesn't exist in system root.\n");
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_close((uv_handle_t*) &fs_event, NULL);
     
    @@ -765,20 +774,20 @@ TEST_IMPL(fs_event_no_callback_after_close) {
       create_file("watch_dir/file1");
     
       r = uv_fs_event_init(loop, &fs_event);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fs_event_start(&fs_event,
                             fs_event_cb_file,
                             "watch_dir/file1",
                             0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
     
       uv_close((uv_handle_t*)&fs_event, close_cb);
       touch_file("watch_dir/file1");
       uv_run(loop, UV_RUN_DEFAULT);
     
    -  ASSERT(fs_event_cb_called == 0);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_OK(fs_event_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       /* Cleanup */
       remove("watch_dir/file1");
    @@ -803,19 +812,19 @@ TEST_IMPL(fs_event_no_callback_on_close) {
       create_file("watch_dir/file1");
     
       r = uv_fs_event_init(loop, &fs_event);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fs_event_start(&fs_event,
                             fs_event_cb_file,
                             "watch_dir/file1",
                             0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_close((uv_handle_t*)&fs_event, close_cb);
     
       uv_run(loop, UV_RUN_DEFAULT);
     
    -  ASSERT(fs_event_cb_called == 0);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_OK(fs_event_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       /* Cleanup */
       remove("watch_dir/file1");
    @@ -830,9 +839,9 @@ static void timer_cb(uv_timer_t* handle) {
       int r;
     
       r = uv_fs_event_init(handle->loop, &fs_event);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fs_event_start(&fs_event, fs_event_fail, ".", 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_close((uv_handle_t*)&fs_event, close_cb);
       uv_close((uv_handle_t*)handle, close_cb);
    @@ -850,14 +859,14 @@ TEST_IMPL(fs_event_immediate_close) {
       loop = uv_default_loop();
     
       r = uv_timer_init(loop, &timer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_timer_start(&timer, timer_cb, 1, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_run(loop, UV_RUN_DEFAULT);
     
    -  ASSERT(close_cb_called == 2);
    +  ASSERT_EQ(2, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -877,9 +886,9 @@ TEST_IMPL(fs_event_close_with_pending_event) {
       create_file("watch_dir/file");
     
       r = uv_fs_event_init(loop, &fs_event);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fs_event_start(&fs_event, fs_event_fail, "watch_dir", 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Generate an fs event. */
       touch_file("watch_dir/file");
    @@ -888,7 +897,7 @@ TEST_IMPL(fs_event_close_with_pending_event) {
     
       uv_run(loop, UV_RUN_DEFAULT);
     
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
     
       /* Clean up */
       remove("watch_dir/file");
    @@ -911,9 +920,9 @@ TEST_IMPL(fs_event_close_with_pending_delete_event) {
       create_file("watch_dir/file");
     
       r = uv_fs_event_init(loop, &fs_event);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fs_event_start(&fs_event, fs_event_fail, "watch_dir/file", 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Generate an fs event. */
       remove("watch_dir/file");
    @@ -927,7 +936,7 @@ TEST_IMPL(fs_event_close_with_pending_delete_event) {
     
       uv_run(loop, UV_RUN_DEFAULT);
     
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
     
       /* Clean up */
       remove("watch_dir/");
    @@ -941,6 +950,8 @@ TEST_IMPL(fs_event_close_in_callback) {
       RETURN_SKIP(NO_FS_EVENTS);
     #elif defined(__MVS__)
       RETURN_SKIP("Directory watching not supported on this platform.");
    +#elif defined(__APPLE__) && defined(__TSAN__)
    +  RETURN_SKIP("Times out under TSAN.");
     #endif
       uv_loop_t* loop;
       int r;
    @@ -951,14 +962,14 @@ TEST_IMPL(fs_event_close_in_callback) {
       create_dir("watch_dir");
     
       r = uv_fs_event_init(loop, &fs_event);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fs_event_start(&fs_event, fs_event_cb_close, "watch_dir", 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_timer_init(loop, &timer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_timer_start(&timer, fs_event_create_files, 100, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_run(loop, UV_RUN_DEFAULT);
     
    @@ -966,8 +977,8 @@ TEST_IMPL(fs_event_close_in_callback) {
     
       uv_run(loop, UV_RUN_ONCE);
     
    -  ASSERT(close_cb_called == 2);
    -  ASSERT(fs_event_cb_called == 3);
    +  ASSERT_EQ(2, close_cb_called);
    +  ASSERT_EQ(3, fs_event_cb_called);
     
       /* Clean up */
       fs_event_unlink_files(NULL);
    @@ -991,21 +1002,21 @@ TEST_IMPL(fs_event_start_and_close) {
       create_dir("watch_dir");
     
       r = uv_fs_event_init(loop, &fs_event1);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fs_event_start(&fs_event1, fs_event_cb_dir, "watch_dir", 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_fs_event_init(loop, &fs_event2);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fs_event_start(&fs_event2, fs_event_cb_dir, "watch_dir", 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_close((uv_handle_t*) &fs_event2, close_cb);
       uv_close((uv_handle_t*) &fs_event1, close_cb);
     
       uv_run(loop, UV_RUN_DEFAULT);
     
    -  ASSERT(close_cb_called == 2);
    +  ASSERT_EQ(2, close_cb_called);
     
       remove("watch_dir/");
       MAKE_VALGRIND_HAPPY(loop);
    @@ -1035,28 +1046,28 @@ TEST_IMPL(fs_event_getpath) {
     
       for (i = 0; i < ARRAY_SIZE(watch_dir); i++) {
         r = uv_fs_event_init(loop, &fs_event);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         len = sizeof buf;
         r = uv_fs_event_getpath(&fs_event, buf, &len);
    -    ASSERT(r == UV_EINVAL);
    +    ASSERT_EQ(r, UV_EINVAL);
         r = uv_fs_event_start(&fs_event, fail_cb, watch_dir[i], 0);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         len = 0;
         r = uv_fs_event_getpath(&fs_event, buf, &len);
    -    ASSERT(r == UV_ENOBUFS);
    -    ASSERT(len < sizeof buf); /* sanity check */
    -    ASSERT(len == strlen(watch_dir[i]) + 1);
    +    ASSERT_EQ(r, UV_ENOBUFS);
    +    ASSERT_LT(len, sizeof buf); /* sanity check */
    +    ASSERT_EQ(len, strlen(watch_dir[i]) + 1);
         r = uv_fs_event_getpath(&fs_event, buf, &len);
    -    ASSERT(r == 0);
    -    ASSERT(len == strlen(watch_dir[i]));
    +    ASSERT_OK(r);
    +    ASSERT_EQ(len, strlen(watch_dir[i]));
         ASSERT(strcmp(buf, watch_dir[i]) == 0);
         r = uv_fs_event_stop(&fs_event);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         uv_close((uv_handle_t*) &fs_event, close_cb);
     
         uv_run(loop, UV_RUN_DEFAULT);
     
    -    ASSERT(close_cb_called == 1);
    +    ASSERT_EQ(1, close_cb_called);
         close_cb_called = 0;
       }
     
    @@ -1108,43 +1119,43 @@ TEST_IMPL(fs_event_error_reporting) {
        */
       for (i = 0; i < ARRAY_SIZE(loops); i++) {
         loop = &loops[i];
    -    ASSERT(0 == uv_loop_init(loop));
    +    ASSERT_OK(uv_loop_init(loop));
         event = &events[i];
     
         timer_cb_called = 0;
         close_cb_called = 0;
    -    ASSERT(0 == uv_fs_event_init(loop, event));
    -    ASSERT(0 == uv_fs_event_start(event,
    -                                  fs_event_error_report_cb,
    -                                  "watch_dir",
    -                                  0));
    +    ASSERT_OK(uv_fs_event_init(loop, event));
    +    ASSERT_OK(uv_fs_event_start(event,
    +                                fs_event_error_report_cb,
    +                                "watch_dir",
    +                                0));
         uv_unref((uv_handle_t*) event);
     
         /* Let loop run for some time */
    -    ASSERT(0 == uv_timer_init(loop, &timer));
    -    ASSERT(0 == uv_timer_start(&timer, timer_cb_nop, 2, 0));
    +    ASSERT_OK(uv_timer_init(loop, &timer));
    +    ASSERT_OK(uv_timer_start(&timer, timer_cb_nop, 2, 0));
         uv_run(loop, UV_RUN_DEFAULT);
    -    ASSERT(1 == timer_cb_called);
    -    ASSERT(1 == close_cb_called);
    +    ASSERT_EQ(1, timer_cb_called);
    +    ASSERT_EQ(1, close_cb_called);
         if (fs_event_error_reported != 0)
           break;
       }
     
       /* At least one loop should fail */
    -  ASSERT(fs_event_error_reported == UV_EMFILE);
    +  ASSERT_EQ(fs_event_error_reported, UV_EMFILE);
     
       /* Stop and close all events, and destroy loops */
       do {
         loop = &loops[i];
         event = &events[i];
     
    -    ASSERT(0 == uv_fs_event_stop(event));
    +    ASSERT_OK(uv_fs_event_stop(event));
         uv_ref((uv_handle_t*) event);
         uv_close((uv_handle_t*) event, fs_event_error_report_close_cb);
     
         close_cb_called = 0;
         uv_run(loop, UV_RUN_DEFAULT);
    -    ASSERT(close_cb_called == 1);
    +    ASSERT_EQ(1, close_cb_called);
     
         uv_loop_close(loop);
       } while (i-- != 0);
    @@ -1175,13 +1186,13 @@ TEST_IMPL(fs_event_watch_invalid_path) {
     
       loop = uv_default_loop();
       r = uv_fs_event_init(loop, &fs_event);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fs_event_start(&fs_event, fs_event_cb_file, "<:;", 0);
    -  ASSERT(r != 0);
    -  ASSERT(uv_is_active((uv_handle_t*) &fs_event) == 0);
    +  ASSERT(r);
    +  ASSERT_OK(uv_is_active((uv_handle_t*) &fs_event));
       r = uv_fs_event_start(&fs_event, fs_event_cb_file, "", 0);
    -  ASSERT(r != 0);
    -  ASSERT(uv_is_active((uv_handle_t*) &fs_event) == 0);
    +  ASSERT(r);
    +  ASSERT_OK(uv_is_active((uv_handle_t*) &fs_event));
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
     }
    @@ -1206,24 +1217,24 @@ TEST_IMPL(fs_event_stop_in_cb) {
       remove(path);
       create_file(path);
     
    -  ASSERT_EQ(0, uv_fs_event_init(uv_default_loop(), &fs));
    -  ASSERT_EQ(0, uv_fs_event_start(&fs, fs_event_cb_stop, path, 0));
    +  ASSERT_OK(uv_fs_event_init(uv_default_loop(), &fs));
    +  ASSERT_OK(uv_fs_event_start(&fs, fs_event_cb_stop, path, 0));
     
       /* Note: timer_cb_touch() closes the handle. */
       timer.data = path;
    -  ASSERT_EQ(0, uv_timer_init(uv_default_loop(), &timer));
    -  ASSERT_EQ(0, uv_timer_start(&timer, timer_cb_touch, 100, 0));
    +  ASSERT_OK(uv_timer_init(uv_default_loop(), &timer));
    +  ASSERT_OK(uv_timer_start(&timer, timer_cb_touch, 100, 0));
     
    -  ASSERT_EQ(0, fs_event_cb_stop_calls);
    -  ASSERT_EQ(0, timer_cb_touch_called);
    +  ASSERT_OK(fs_event_cb_stop_calls);
    +  ASSERT_OK(timer_cb_touch_called);
     
    -  ASSERT_EQ(0, uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
       ASSERT_EQ(1, fs_event_cb_stop_calls);
       ASSERT_EQ(1, timer_cb_touch_called);
     
       uv_close((uv_handle_t*) &fs, NULL);
    -  ASSERT_EQ(0, uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
       ASSERT_EQ(1, fs_event_cb_stop_calls);
     
       remove(path);
    diff --git a/deps/uv/test/test-fs-fd-hash.c b/deps/uv/test/test-fs-fd-hash.c
    index 8b4bc0351b334e..4ed3d548e62171 100644
    --- a/deps/uv/test/test-fs-fd-hash.c
    +++ b/deps/uv/test/test-fs-fd-hash.c
    @@ -43,7 +43,7 @@ void assert_nonexistent(int fd) {
     void assert_existent(int fd) {
       struct uv__fd_info_s info = { 0 };
       ASSERT(uv__fd_hash_get(fd, &info));
    -  ASSERT(info.flags == fd + FD_DIFF);
    +  ASSERT_EQ(info.flags, fd + FD_DIFF);
     }
     
     void assert_insertion(int fd) {
    @@ -58,7 +58,7 @@ void assert_removal(int fd) {
       struct uv__fd_info_s info = { 0 };
       assert_existent(fd);
       uv__fd_hash_remove(fd, &info);
    -  ASSERT(info.flags == fd + FD_DIFF);
    +  ASSERT_EQ(info.flags, fd + FD_DIFF);
       assert_nonexistent(fd);
     }
     
    @@ -106,7 +106,7 @@ TEST_IMPL(fs_fd_hash) {
       {
         struct uv__fd_info_s info = { 0 };
         ASSERT(uv__fd_hash_get(0, &info));
    -    ASSERT(info.flags == FD_DIFF + FD_DIFF);
    +    ASSERT_EQ(info.flags, FD_DIFF + FD_DIFF);
       }
       {
         /* Leave as it was, will be again tested below */
    diff --git a/deps/uv/test/test-fs-open-flags.c b/deps/uv/test/test-fs-open-flags.c
    index ea9be25afc1593..e64ac20d72b5f4 100644
    --- a/deps/uv/test/test-fs-open-flags.c
    +++ b/deps/uv/test/test-fs-open-flags.c
    @@ -68,8 +68,8 @@ static void setup(void) {
       uv_fs_req_cleanup(&rmdir_req);
     
       r = uv_fs_mkdir(NULL, &mkdir_req, empty_dir, 0755, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(mkdir_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(mkdir_req.result);
       uv_fs_req_cleanup(&mkdir_req);
     }
     
    @@ -89,13 +89,13 @@ static void refresh(void) {
     
       r = uv_fs_open(NULL, &open_req, empty_file,
         UV_FS_O_TRUNC | UV_FS_O_CREAT | UV_FS_O_WRONLY, S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req.result, 0);
       uv_fs_req_cleanup(&open_req);
     
       r = uv_fs_close(NULL, &close_req, open_req.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       /* dummy_file */
    @@ -103,19 +103,19 @@ static void refresh(void) {
     
       r = uv_fs_open(NULL, &open_req, dummy_file,
         UV_FS_O_TRUNC | UV_FS_O_CREAT | UV_FS_O_WRONLY, S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req.result, 0);
       uv_fs_req_cleanup(&open_req);
     
       iov = uv_buf_init("a", 1);
       r = uv_fs_write(NULL, &write_req, open_req.result, &iov, 1, -1, NULL);
    -  ASSERT(r == 1);
    -  ASSERT(write_req.result == 1);
    +  ASSERT_EQ(1, r);
    +  ASSERT_EQ(1, write_req.result);
       uv_fs_req_cleanup(&write_req);
     
       r = uv_fs_close(NULL, &close_req, open_req.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     }
     
    @@ -131,14 +131,14 @@ static void openFail(char *file, int error) {
       refresh();
     
       r = uv_fs_open(NULL, &open_req, file, flags, S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r == error);
    -  ASSERT(open_req.result == error);
    +  ASSERT_EQ(r, error);
    +  ASSERT_EQ(open_req.result, error);
       uv_fs_req_cleanup(&open_req);
     
       /* Ensure the first call does not create the file */
       r = uv_fs_open(NULL, &open_req, file, flags, S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r == error);
    -  ASSERT(open_req.result == error);
    +  ASSERT_EQ(r, error);
    +  ASSERT_EQ(open_req.result, error);
       uv_fs_req_cleanup(&open_req);
     
       cleanup();
    @@ -150,8 +150,8 @@ static void refreshOpen(char *file) {
       refresh();
     
       r = uv_fs_open(NULL, &open_req, file, flags, S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req.result, 0);
       uv_fs_req_cleanup(&open_req);
     }
     
    @@ -162,37 +162,37 @@ static void writeExpect(char *file, char *expected, int size) {
     
       iov = uv_buf_init("b", 1);
       r = uv_fs_write(NULL, &write_req, open_req.result, &iov, 1, -1, NULL);
    -  ASSERT(r == 1);
    -  ASSERT(write_req.result == 1);
    +  ASSERT_EQ(1, r);
    +  ASSERT_EQ(1, write_req.result);
       uv_fs_req_cleanup(&write_req);
     
       iov = uv_buf_init("c", 1);
       r = uv_fs_write(NULL, &write_req, open_req.result, &iov, 1, -1, NULL);
    -  ASSERT(r == 1);
    -  ASSERT(write_req.result == 1);
    +  ASSERT_EQ(1, r);
    +  ASSERT_EQ(1, write_req.result);
       uv_fs_req_cleanup(&write_req);
     
       r = uv_fs_close(NULL, &close_req, open_req.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       /* Check contents */
       r = uv_fs_open(NULL, &open_req, file, UV_FS_O_RDONLY, S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req.result, 0);
       uv_fs_req_cleanup(&open_req);
     
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL, &read_req, open_req.result, &iov, 1, -1, NULL);
    -  ASSERT(r == size);
    -  ASSERT(read_req.result == size);
    -  ASSERT(strncmp(buf, expected, size) == 0);
    +  ASSERT_EQ(r, size);
    +  ASSERT_EQ(read_req.result, size);
    +  ASSERT_OK(strncmp(buf, expected, size));
       uv_fs_req_cleanup(&read_req);
     
       r = uv_fs_close(NULL, &close_req, open_req.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       cleanup();
    @@ -205,19 +205,19 @@ static void writeFail(char *file, int error) {
     
       iov = uv_buf_init("z", 1);
       r = uv_fs_write(NULL, &write_req, open_req.result, &iov, 1, -1, NULL);
    -  ASSERT(r == error);
    -  ASSERT(write_req.result == error);
    +  ASSERT_EQ(r, error);
    +  ASSERT_EQ(write_req.result, error);
       uv_fs_req_cleanup(&write_req);
     
       iov = uv_buf_init("z", 1);
       r = uv_fs_write(NULL, &write_req, open_req.result, &iov, 1, -1, NULL);
    -  ASSERT(r == error);
    -  ASSERT(write_req.result == error);
    +  ASSERT_EQ(r, error);
    +  ASSERT_EQ(write_req.result, error);
       uv_fs_req_cleanup(&write_req);
     
       r = uv_fs_close(NULL, &close_req, open_req.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       cleanup();
    @@ -230,14 +230,14 @@ static void readExpect(char *file, char *expected, int size) {
     
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL, &read_req, open_req.result, &iov, 1, -1, NULL);
    -  ASSERT(r == size);
    -  ASSERT(read_req.result == size);
    -  ASSERT(strncmp(buf, expected, size) == 0);
    +  ASSERT_EQ(r, size);
    +  ASSERT_EQ(read_req.result, size);
    +  ASSERT_OK(strncmp(buf, expected, size));
       uv_fs_req_cleanup(&read_req);
     
       r = uv_fs_close(NULL, &close_req, open_req.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       cleanup();
    @@ -250,19 +250,19 @@ static void readFail(char *file, int error) {
     
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL, &read_req, open_req.result, &iov, 1, -1, NULL);
    -  ASSERT(r == error);
    -  ASSERT(read_req.result == error);
    +  ASSERT_EQ(r, error);
    +  ASSERT_EQ(read_req.result, error);
       uv_fs_req_cleanup(&read_req);
     
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL, &read_req, open_req.result, &iov, 1, -1, NULL);
    -  ASSERT(r == error);
    -  ASSERT(read_req.result == error);
    +  ASSERT_EQ(r, error);
    +  ASSERT_EQ(read_req.result, error);
       uv_fs_req_cleanup(&read_req);
     
       r = uv_fs_close(NULL, &close_req, open_req.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       cleanup();
    diff --git a/deps/uv/test/test-fs-poll.c b/deps/uv/test/test-fs-poll.c
    index af486023d10c87..5f95baf3d3f464 100644
    --- a/deps/uv/test/test-fs-poll.c
    +++ b/deps/uv/test/test-fs-poll.c
    @@ -103,44 +103,44 @@ static void poll_cb(uv_fs_poll_t* handle,
     
       memset(&zero_statbuf, 0, sizeof(zero_statbuf));
     
    -  ASSERT(handle == &poll_handle);
    -  ASSERT(1 == uv_is_active((uv_handle_t*) handle));
    +  ASSERT_PTR_EQ(handle, &poll_handle);
    +  ASSERT_EQ(1, uv_is_active((uv_handle_t*) handle));
       ASSERT_NOT_NULL(prev);
       ASSERT_NOT_NULL(curr);
     
       switch (poll_cb_called++) {
       case 0:
    -    ASSERT(status == UV_ENOENT);
    -    ASSERT(0 == memcmp(prev, &zero_statbuf, sizeof(zero_statbuf)));
    -    ASSERT(0 == memcmp(curr, &zero_statbuf, sizeof(zero_statbuf)));
    +    ASSERT_EQ(status, UV_ENOENT);
    +    ASSERT_OK(memcmp(prev, &zero_statbuf, sizeof(zero_statbuf)));
    +    ASSERT_OK(memcmp(curr, &zero_statbuf, sizeof(zero_statbuf)));
         touch_file(FIXTURE);
         break;
     
       case 1:
    -    ASSERT(status == 0);
    -    ASSERT(0 == memcmp(prev, &zero_statbuf, sizeof(zero_statbuf)));
    -    ASSERT(0 != memcmp(curr, &zero_statbuf, sizeof(zero_statbuf)));
    -    ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, 20, 0));
    +    ASSERT_OK(status);
    +    ASSERT_OK(memcmp(prev, &zero_statbuf, sizeof(zero_statbuf)));
    +    ASSERT_NE(0, memcmp(curr, &zero_statbuf, sizeof(zero_statbuf)));
    +    ASSERT_OK(uv_timer_start(&timer_handle, timer_cb, 20, 0));
         break;
     
       case 2:
    -    ASSERT(status == 0);
    -    ASSERT(0 != memcmp(prev, &zero_statbuf, sizeof(zero_statbuf)));
    -    ASSERT(0 != memcmp(curr, &zero_statbuf, sizeof(zero_statbuf)));
    -    ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, 200, 0));
    +    ASSERT_OK(status);
    +    ASSERT_NE(0, memcmp(prev, &zero_statbuf, sizeof(zero_statbuf)));
    +    ASSERT_NE(0, memcmp(curr, &zero_statbuf, sizeof(zero_statbuf)));
    +    ASSERT_OK(uv_timer_start(&timer_handle, timer_cb, 200, 0));
         break;
     
       case 3:
    -    ASSERT(status == 0);
    -    ASSERT(0 != memcmp(prev, &zero_statbuf, sizeof(zero_statbuf)));
    -    ASSERT(0 != memcmp(curr, &zero_statbuf, sizeof(zero_statbuf)));
    +    ASSERT_OK(status);
    +    ASSERT_NE(0, memcmp(prev, &zero_statbuf, sizeof(zero_statbuf)));
    +    ASSERT_NE(0, memcmp(curr, &zero_statbuf, sizeof(zero_statbuf)));
         remove(FIXTURE);
         break;
     
       case 4:
    -    ASSERT(status == UV_ENOENT);
    -    ASSERT(0 != memcmp(prev, &zero_statbuf, sizeof(zero_statbuf)));
    -    ASSERT(0 == memcmp(curr, &zero_statbuf, sizeof(zero_statbuf)));
    +    ASSERT_EQ(status, UV_ENOENT);
    +    ASSERT_NE(0, memcmp(prev, &zero_statbuf, sizeof(zero_statbuf)));
    +    ASSERT_OK(memcmp(curr, &zero_statbuf, sizeof(zero_statbuf)));
         uv_close((uv_handle_t*)handle, close_cb);
         break;
     
    @@ -155,14 +155,14 @@ TEST_IMPL(fs_poll) {
     
       remove(FIXTURE);
     
    -  ASSERT(0 == uv_timer_init(loop, &timer_handle));
    -  ASSERT(0 == uv_fs_poll_init(loop, &poll_handle));
    -  ASSERT(0 == uv_fs_poll_start(&poll_handle, poll_cb, FIXTURE, 100));
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_timer_init(loop, &timer_handle));
    +  ASSERT_OK(uv_fs_poll_init(loop, &poll_handle));
    +  ASSERT_OK(uv_fs_poll_start(&poll_handle, poll_cb, FIXTURE, 100));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
     
    -  ASSERT(poll_cb_called == 5);
    -  ASSERT(timer_cb_called == 2);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(5, poll_cb_called);
    +  ASSERT_EQ(2, timer_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -176,21 +176,21 @@ TEST_IMPL(fs_poll_getpath) {
     
       remove(FIXTURE);
     
    -  ASSERT(0 == uv_fs_poll_init(loop, &poll_handle));
    +  ASSERT_OK(uv_fs_poll_init(loop, &poll_handle));
       len = sizeof buf;
    -  ASSERT(UV_EINVAL == uv_fs_poll_getpath(&poll_handle, buf, &len));
    -  ASSERT(0 == uv_fs_poll_start(&poll_handle, poll_cb_fail, FIXTURE, 100));
    +  ASSERT_EQ(UV_EINVAL, uv_fs_poll_getpath(&poll_handle, buf, &len));
    +  ASSERT_OK(uv_fs_poll_start(&poll_handle, poll_cb_fail, FIXTURE, 100));
       len = sizeof buf;
    -  ASSERT(0 == uv_fs_poll_getpath(&poll_handle, buf, &len));
    -  ASSERT(buf[len - 1] != 0);
    -  ASSERT(buf[len] == '\0');
    -  ASSERT(0 == memcmp(buf, FIXTURE, len));
    +  ASSERT_OK(uv_fs_poll_getpath(&poll_handle, buf, &len));
    +  ASSERT_NE(0, buf[len - 1]);
    +  ASSERT_EQ(buf[len], '\0');
    +  ASSERT_OK(memcmp(buf, FIXTURE, len));
     
       uv_close((uv_handle_t*) &poll_handle, close_cb);
     
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
     
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -203,14 +203,14 @@ TEST_IMPL(fs_poll_close_request) {
     
       remove(FIXTURE);
     
    -  ASSERT(0 == uv_loop_init(&loop));
    +  ASSERT_OK(uv_loop_init(&loop));
     
    -  ASSERT(0 == uv_fs_poll_init(&loop, &poll_handle));
    -  ASSERT(0 == uv_fs_poll_start(&poll_handle, poll_cb_fail, FIXTURE, 100));
    +  ASSERT_OK(uv_fs_poll_init(&loop, &poll_handle));
    +  ASSERT_OK(uv_fs_poll_start(&poll_handle, poll_cb_fail, FIXTURE, 100));
       uv_close((uv_handle_t*) &poll_handle, close_cb);
       while (close_cb_called == 0)
         uv_run(&loop, UV_RUN_ONCE);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(&loop);
       return 0;
    @@ -223,18 +223,18 @@ TEST_IMPL(fs_poll_close_request_multi_start_stop) {
     
       remove(FIXTURE);
     
    -  ASSERT(0 == uv_loop_init(&loop));
    +  ASSERT_OK(uv_loop_init(&loop));
     
    -  ASSERT(0 == uv_fs_poll_init(&loop, &poll_handle));
    +  ASSERT_OK(uv_fs_poll_init(&loop, &poll_handle));
     
       for (i = 0; i < 10; ++i) {
    -    ASSERT(0 == uv_fs_poll_start(&poll_handle, poll_cb_fail, FIXTURE, 100));
    -    ASSERT(0 == uv_fs_poll_stop(&poll_handle));
    +    ASSERT_OK(uv_fs_poll_start(&poll_handle, poll_cb_fail, FIXTURE, 100));
    +    ASSERT_OK(uv_fs_poll_stop(&poll_handle));
       }
       uv_close((uv_handle_t*) &poll_handle, close_cb);
       while (close_cb_called == 0)
         uv_run(&loop, UV_RUN_ONCE);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(&loop);
       return 0;
    @@ -247,18 +247,18 @@ TEST_IMPL(fs_poll_close_request_multi_stop_start) {
     
       remove(FIXTURE);
     
    -  ASSERT(0 == uv_loop_init(&loop));
    +  ASSERT_OK(uv_loop_init(&loop));
     
    -  ASSERT(0 == uv_fs_poll_init(&loop, &poll_handle));
    +  ASSERT_OK(uv_fs_poll_init(&loop, &poll_handle));
     
       for (i = 0; i < 10; ++i) {
    -    ASSERT(0 == uv_fs_poll_stop(&poll_handle));
    -    ASSERT(0 == uv_fs_poll_start(&poll_handle, poll_cb_fail, FIXTURE, 100));
    +    ASSERT_OK(uv_fs_poll_stop(&poll_handle));
    +    ASSERT_OK(uv_fs_poll_start(&poll_handle, poll_cb_fail, FIXTURE, 100));
       }
       uv_close((uv_handle_t*) &poll_handle, close_cb);
       while (close_cb_called == 0)
         uv_run(&loop, UV_RUN_ONCE);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(&loop);
       return 0;
    @@ -271,21 +271,21 @@ TEST_IMPL(fs_poll_close_request_stop_when_active) {
     
       remove(FIXTURE);
     
    -  ASSERT(0 == uv_loop_init(&loop));
    +  ASSERT_OK(uv_loop_init(&loop));
     
       /* Set up all handles. */
    -  ASSERT(0 == uv_fs_poll_init(&loop, &poll_handle));
    -  ASSERT(0 == uv_fs_poll_start(&poll_handle, poll_cb_noop, FIXTURE, 100));
    +  ASSERT_OK(uv_fs_poll_init(&loop, &poll_handle));
    +  ASSERT_OK(uv_fs_poll_start(&poll_handle, poll_cb_noop, FIXTURE, 100));
       uv_run(&loop, UV_RUN_ONCE);
     
       /* Close the timer handle, and do not crash. */
    -  ASSERT(0 == uv_fs_poll_stop(&poll_handle));
    +  ASSERT_OK(uv_fs_poll_stop(&poll_handle));
       uv_run(&loop, UV_RUN_ONCE);
     
       /* Clean up after the test. */
       uv_close((uv_handle_t*) &poll_handle, close_cb);
       uv_run(&loop, UV_RUN_ONCE);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(&loop);
       return 0;
    diff --git a/deps/uv/test/test-fs-readdir.c b/deps/uv/test/test-fs-readdir.c
    index 43c9edf178be98..b6b5b7ff2c1d71 100644
    --- a/deps/uv/test/test-fs-readdir.c
    +++ b/deps/uv/test/test-fs-readdir.c
    @@ -47,9 +47,9 @@ static void cleanup_test_files(void) {
     }
     
     static void empty_closedir_cb(uv_fs_t* req) {
    -  ASSERT(req == &closedir_req);
    -  ASSERT(req->fs_type == UV_FS_CLOSEDIR);
    -  ASSERT(req->result == 0);
    +  ASSERT_PTR_EQ(req, &closedir_req);
    +  ASSERT_EQ(req->fs_type, UV_FS_CLOSEDIR);
    +  ASSERT_OK(req->result);
       ++empty_closedir_cb_count;
       uv_fs_req_cleanup(req);
     }
    @@ -58,25 +58,25 @@ static void empty_readdir_cb(uv_fs_t* req) {
       uv_dir_t* dir;
       int r;
     
    -  ASSERT(req == &readdir_req);
    -  ASSERT(req->fs_type == UV_FS_READDIR);
    -  ASSERT(req->result == 0);
    +  ASSERT_PTR_EQ(req, &readdir_req);
    +  ASSERT_EQ(req->fs_type, UV_FS_READDIR);
    +  ASSERT_OK(req->result);
       dir = req->ptr;
       uv_fs_req_cleanup(req);
       r = uv_fs_closedir(uv_default_loop(),
                          &closedir_req,
                          dir,
                          empty_closedir_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     static void empty_opendir_cb(uv_fs_t* req) {
       uv_dir_t* dir;
       int r;
     
    -  ASSERT(req == &opendir_req);
    -  ASSERT(req->fs_type == UV_FS_OPENDIR);
    -  ASSERT(req->result == 0);
    +  ASSERT_PTR_EQ(req, &opendir_req);
    +  ASSERT_EQ(req->fs_type, UV_FS_OPENDIR);
    +  ASSERT_OK(req->result);
       ASSERT_NOT_NULL(req->ptr);
       dir = req->ptr;
       dir->dirents = dirents;
    @@ -85,7 +85,7 @@ static void empty_opendir_cb(uv_fs_t* req) {
                         &readdir_req,
                         dir,
                         empty_readdir_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(req);
       ++empty_opendir_cb_count;
     }
    @@ -115,9 +115,9 @@ TEST_IMPL(fs_readdir_empty_dir) {
                         &opendir_req,
                         path,
                         NULL);
    -  ASSERT(r == 0);
    -  ASSERT(opendir_req.fs_type == UV_FS_OPENDIR);
    -  ASSERT(opendir_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_EQ(opendir_req.fs_type, UV_FS_OPENDIR);
    +  ASSERT_OK(opendir_req.result);
       ASSERT_NOT_NULL(opendir_req.ptr);
       dir = opendir_req.ptr;
       uv_fs_req_cleanup(&opendir_req);
    @@ -130,13 +130,13 @@ TEST_IMPL(fs_readdir_empty_dir) {
                                       &readdir_req,
                                       dir,
                                       NULL);
    -  ASSERT(nb_entries_read == 0);
    +  ASSERT_OK(nb_entries_read);
       uv_fs_req_cleanup(&readdir_req);
     
       /* Fill the req to ensure that required fields are cleaned up. */
       memset(&closedir_req, 0xdb, sizeof(closedir_req));
       uv_fs_closedir(uv_default_loop(), &closedir_req, dir, NULL);
    -  ASSERT(closedir_req.result == 0);
    +  ASSERT_OK(closedir_req.result);
       uv_fs_req_cleanup(&closedir_req);
     
       /* Testing the asynchronous flavor. */
    @@ -147,13 +147,13 @@ TEST_IMPL(fs_readdir_empty_dir) {
       memset(&closedir_req, 0xdb, sizeof(closedir_req));
     
       r = uv_fs_opendir(uv_default_loop(), &opendir_req, path, empty_opendir_cb);
    -  ASSERT(r == 0);
    -  ASSERT(empty_opendir_cb_count == 0);
    -  ASSERT(empty_closedir_cb_count == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(empty_opendir_cb_count);
    +  ASSERT_OK(empty_closedir_cb_count);
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    -  ASSERT(empty_opendir_cb_count == 1);
    -  ASSERT(empty_closedir_cb_count == 1);
    +  ASSERT_OK(r);
    +  ASSERT_EQ(1, empty_opendir_cb_count);
    +  ASSERT_EQ(1, empty_closedir_cb_count);
       uv_fs_rmdir(uv_default_loop(), &rmdir_req, path, NULL);
       uv_fs_req_cleanup(&rmdir_req);
       MAKE_VALGRIND_HAPPY(uv_default_loop());
    @@ -168,9 +168,9 @@ TEST_IMPL(fs_readdir_empty_dir) {
     static int non_existing_opendir_cb_count;
     
     static void non_existing_opendir_cb(uv_fs_t* req) {
    -  ASSERT(req == &opendir_req);
    -  ASSERT(req->fs_type == UV_FS_OPENDIR);
    -  ASSERT(req->result == UV_ENOENT);
    +  ASSERT_PTR_EQ(req, &opendir_req);
    +  ASSERT_EQ(req->fs_type, UV_FS_OPENDIR);
    +  ASSERT_EQ(req->result, UV_ENOENT);
       ASSERT_NULL(req->ptr);
     
       uv_fs_req_cleanup(req);
    @@ -188,9 +188,9 @@ TEST_IMPL(fs_readdir_non_existing_dir) {
     
       /* Testing the synchronous flavor. */
       r = uv_fs_opendir(uv_default_loop(), &opendir_req, path, NULL);
    -  ASSERT(r == UV_ENOENT);
    -  ASSERT(opendir_req.fs_type == UV_FS_OPENDIR);
    -  ASSERT(opendir_req.result == UV_ENOENT);
    +  ASSERT_EQ(r, UV_ENOENT);
    +  ASSERT_EQ(opendir_req.fs_type, UV_FS_OPENDIR);
    +  ASSERT_EQ(opendir_req.result, UV_ENOENT);
       ASSERT_NULL(opendir_req.ptr);
       uv_fs_req_cleanup(&opendir_req);
     
    @@ -202,11 +202,11 @@ TEST_IMPL(fs_readdir_non_existing_dir) {
                         &opendir_req,
                         path,
                         non_existing_opendir_cb);
    -  ASSERT(r == 0);
    -  ASSERT(non_existing_opendir_cb_count == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(non_existing_opendir_cb_count);
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    -  ASSERT(non_existing_opendir_cb_count == 1);
    +  ASSERT_OK(r);
    +  ASSERT_EQ(1, non_existing_opendir_cb_count);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -220,9 +220,9 @@ TEST_IMPL(fs_readdir_non_existing_dir) {
     static int file_opendir_cb_count;
     
     static void file_opendir_cb(uv_fs_t* req) {
    -  ASSERT(req == &opendir_req);
    -  ASSERT(req->fs_type == UV_FS_OPENDIR);
    -  ASSERT(req->result == UV_ENOTDIR);
    +  ASSERT_PTR_EQ(req, &opendir_req);
    +  ASSERT_EQ(req->fs_type, UV_FS_OPENDIR);
    +  ASSERT_EQ(req->result, UV_ENOTDIR);
       ASSERT_NULL(req->ptr);
     
       uv_fs_req_cleanup(req);
    @@ -241,9 +241,9 @@ TEST_IMPL(fs_readdir_file) {
       /* Testing the synchronous flavor. */
       r = uv_fs_opendir(uv_default_loop(), &opendir_req, path, NULL);
     
    -  ASSERT(r == UV_ENOTDIR);
    -  ASSERT(opendir_req.fs_type == UV_FS_OPENDIR);
    -  ASSERT(opendir_req.result == UV_ENOTDIR);
    +  ASSERT_EQ(r, UV_ENOTDIR);
    +  ASSERT_EQ(opendir_req.fs_type, UV_FS_OPENDIR);
    +  ASSERT_EQ(opendir_req.result, UV_ENOTDIR);
       ASSERT_NULL(opendir_req.ptr);
     
       uv_fs_req_cleanup(&opendir_req);
    @@ -253,11 +253,11 @@ TEST_IMPL(fs_readdir_file) {
     
       /* Testing the async flavor. */
       r = uv_fs_opendir(uv_default_loop(), &opendir_req, path, file_opendir_cb);
    -  ASSERT(r == 0);
    -  ASSERT(file_opendir_cb_count == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(file_opendir_cb_count);
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    -  ASSERT(file_opendir_cb_count == 1);
    +  ASSERT_OK(r);
    +  ASSERT_EQ(1, file_opendir_cb_count);
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
     }
    @@ -273,8 +273,8 @@ static int non_empty_readdir_cb_count;
     static int non_empty_closedir_cb_count;
     
     static void non_empty_closedir_cb(uv_fs_t* req) {
    -  ASSERT(req == &closedir_req);
    -  ASSERT(req->result == 0);
    +  ASSERT_PTR_EQ(req, &closedir_req);
    +  ASSERT_OK(req->result);
       uv_fs_req_cleanup(req);
       ++non_empty_closedir_cb_count;
     }
    @@ -282,30 +282,30 @@ static void non_empty_closedir_cb(uv_fs_t* req) {
     static void non_empty_readdir_cb(uv_fs_t* req) {
       uv_dir_t* dir;
     
    -  ASSERT(req == &readdir_req);
    -  ASSERT(req->fs_type == UV_FS_READDIR);
    +  ASSERT_PTR_EQ(req, &readdir_req);
    +  ASSERT_EQ(req->fs_type, UV_FS_READDIR);
       dir = req->ptr;
     
       if (req->result == 0) {
         uv_fs_req_cleanup(req);
    -    ASSERT(non_empty_readdir_cb_count == 3);
    +    ASSERT_EQ(3, non_empty_readdir_cb_count);
         uv_fs_closedir(uv_default_loop(),
                        &closedir_req,
                        dir,
                        non_empty_closedir_cb);
       } else {
    -    ASSERT(req->result == 1);
    -    ASSERT(dir->dirents == dirents);
    +    ASSERT_EQ(1, req->result);
    +    ASSERT_PTR_EQ(dir->dirents, dirents);
         ASSERT(strcmp(dirents[0].name, "file1") == 0 ||
                strcmp(dirents[0].name, "file2") == 0 ||
                strcmp(dirents[0].name, "test_subdir") == 0);
     #ifdef HAVE_DIRENT_TYPES
         if (!strcmp(dirents[0].name, "test_subdir"))
    -      ASSERT(dirents[0].type == UV_DIRENT_DIR);
    +      ASSERT_EQ(dirents[0].type, UV_DIRENT_DIR);
         else
    -      ASSERT(dirents[0].type == UV_DIRENT_FILE);
    +      ASSERT_EQ(dirents[0].type, UV_DIRENT_FILE);
     #else
    -    ASSERT(dirents[0].type == UV_DIRENT_UNKNOWN);
    +    ASSERT_EQ(dirents[0].type, UV_DIRENT_UNKNOWN);
     #endif /* HAVE_DIRENT_TYPES */
     
         ++non_empty_readdir_cb_count;
    @@ -323,9 +323,9 @@ static void non_empty_opendir_cb(uv_fs_t* req) {
       uv_dir_t* dir;
       int r;
     
    -  ASSERT(req == &opendir_req);
    -  ASSERT(req->fs_type == UV_FS_OPENDIR);
    -  ASSERT(req->result == 0);
    +  ASSERT_PTR_EQ(req, &opendir_req);
    +  ASSERT_EQ(req->fs_type, UV_FS_OPENDIR);
    +  ASSERT_OK(req->result);
       ASSERT_NOT_NULL(req->ptr);
     
       dir = req->ptr;
    @@ -336,7 +336,7 @@ static void non_empty_opendir_cb(uv_fs_t* req) {
                         &readdir_req,
                         dir,
                         non_empty_readdir_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(req);
       ++non_empty_opendir_cb_count;
     }
    @@ -353,7 +353,7 @@ TEST_IMPL(fs_readdir_non_empty_dir) {
       cleanup_test_files();
     
       r = uv_fs_mkdir(uv_default_loop(), &mkdir_req, "test_dir", 0755, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Create two files synchronously. */
       r = uv_fs_open(uv_default_loop(),
    @@ -361,13 +361,13 @@ TEST_IMPL(fs_readdir_non_empty_dir) {
                      "test_dir/file1",
                      O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR,
                      NULL);
    -  ASSERT(r >= 0);
    +  ASSERT_GE(r, 0);
       uv_fs_req_cleanup(&create_req);
       r = uv_fs_close(uv_default_loop(),
                       &close_req,
                       create_req.result,
                       NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&close_req);
     
       r = uv_fs_open(uv_default_loop(),
    @@ -375,13 +375,13 @@ TEST_IMPL(fs_readdir_non_empty_dir) {
                      "test_dir/file2",
                      O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR,
                      NULL);
    -  ASSERT(r >= 0);
    +  ASSERT_GE(r, 0);
       uv_fs_req_cleanup(&create_req);
       r = uv_fs_close(uv_default_loop(),
                       &close_req,
                       create_req.result,
                       NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&close_req);
     
       r = uv_fs_mkdir(uv_default_loop(),
    @@ -389,7 +389,7 @@ TEST_IMPL(fs_readdir_non_empty_dir) {
                       "test_dir/test_subdir",
                       0755,
                       NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&mkdir_req);
     
       /* Fill the req to ensure that required fields are cleaned up. */
    @@ -397,9 +397,9 @@ TEST_IMPL(fs_readdir_non_empty_dir) {
     
       /* Testing the synchronous flavor. */
       r = uv_fs_opendir(uv_default_loop(), &opendir_req, "test_dir", NULL);
    -  ASSERT(r == 0);
    -  ASSERT(opendir_req.fs_type == UV_FS_OPENDIR);
    -  ASSERT(opendir_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_EQ(opendir_req.fs_type, UV_FS_OPENDIR);
    +  ASSERT_OK(opendir_req.result);
       ASSERT_NOT_NULL(opendir_req.ptr);
     
       entries_count = 0;
    @@ -417,23 +417,23 @@ TEST_IMPL(fs_readdir_non_empty_dir) {
              strcmp(dirents[0].name, "test_subdir") == 0);
     #ifdef HAVE_DIRENT_TYPES
         if (!strcmp(dirents[0].name, "test_subdir"))
    -      ASSERT(dirents[0].type == UV_DIRENT_DIR);
    +      ASSERT_EQ(dirents[0].type, UV_DIRENT_DIR);
         else
    -      ASSERT(dirents[0].type == UV_DIRENT_FILE);
    +      ASSERT_EQ(dirents[0].type, UV_DIRENT_FILE);
     #else
    -    ASSERT(dirents[0].type == UV_DIRENT_UNKNOWN);
    +    ASSERT_EQ(dirents[0].type, UV_DIRENT_UNKNOWN);
     #endif /* HAVE_DIRENT_TYPES */
         uv_fs_req_cleanup(&readdir_req);
         ++entries_count;
       }
     
    -  ASSERT(entries_count == 3);
    +  ASSERT_EQ(3, entries_count);
       uv_fs_req_cleanup(&readdir_req);
     
       /* Fill the req to ensure that required fields are cleaned up. */
       memset(&closedir_req, 0xdb, sizeof(closedir_req));
       uv_fs_closedir(uv_default_loop(), &closedir_req, dir, NULL);
    -  ASSERT(closedir_req.result == 0);
    +  ASSERT_OK(closedir_req.result);
       uv_fs_req_cleanup(&closedir_req);
     
       /* Testing the asynchronous flavor. */
    @@ -445,13 +445,13 @@ TEST_IMPL(fs_readdir_non_empty_dir) {
                         &opendir_req,
                         "test_dir",
                         non_empty_opendir_cb);
    -  ASSERT(r == 0);
    -  ASSERT(non_empty_opendir_cb_count == 0);
    -  ASSERT(non_empty_closedir_cb_count == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(non_empty_opendir_cb_count);
    +  ASSERT_OK(non_empty_closedir_cb_count);
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    -  ASSERT(non_empty_opendir_cb_count == 1);
    -  ASSERT(non_empty_closedir_cb_count == 1);
    +  ASSERT_OK(r);
    +  ASSERT_EQ(1, non_empty_opendir_cb_count);
    +  ASSERT_EQ(1, non_empty_closedir_cb_count);
     
       uv_fs_rmdir(uv_default_loop(), &rmdir_req, "test_subdir", NULL);
       uv_fs_req_cleanup(&rmdir_req);
    diff --git a/deps/uv/test/test-fs.c b/deps/uv/test/test-fs.c
    index e687dde3e2577f..1acdc5c67082c7 100644
    --- a/deps/uv/test/test-fs.c
    +++ b/deps/uv/test/test-fs.c
    @@ -170,8 +170,8 @@ static void check_permission(const char* filename, unsigned int mode) {
       uv_stat_t* s;
     
       r = uv_fs_stat(NULL, &req, filename, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
     
       s = &req.statbuf;
     #if defined(_WIN32) || defined(__CYGWIN__) || defined(__MSYS__)
    @@ -195,24 +195,24 @@ static void dummy_cb(uv_fs_t* req) {
     
     
     static void link_cb(uv_fs_t* req) {
    -  ASSERT(req->fs_type == UV_FS_LINK);
    -  ASSERT(req->result == 0);
    +  ASSERT_EQ(req->fs_type, UV_FS_LINK);
    +  ASSERT_OK(req->result);
       link_cb_count++;
       uv_fs_req_cleanup(req);
     }
     
     
     static void symlink_cb(uv_fs_t* req) {
    -  ASSERT(req->fs_type == UV_FS_SYMLINK);
    -  ASSERT(req->result == 0);
    +  ASSERT_EQ(req->fs_type, UV_FS_SYMLINK);
    +  ASSERT_OK(req->result);
       symlink_cb_count++;
       uv_fs_req_cleanup(req);
     }
     
     static void readlink_cb(uv_fs_t* req) {
    -  ASSERT(req->fs_type == UV_FS_READLINK);
    -  ASSERT(req->result == 0);
    -  ASSERT(strcmp(req->ptr, "test_file_symlink2") == 0);
    +  ASSERT_EQ(req->fs_type, UV_FS_READLINK);
    +  ASSERT_OK(req->result);
    +  ASSERT_OK(strcmp(req->ptr, "test_file_symlink2"));
       readlink_cb_count++;
       uv_fs_req_cleanup(req);
     }
    @@ -221,16 +221,16 @@ static void readlink_cb(uv_fs_t* req) {
     static void realpath_cb(uv_fs_t* req) {
       char test_file_abs_buf[PATHMAX];
       size_t test_file_abs_size = sizeof(test_file_abs_buf);
    -  ASSERT(req->fs_type == UV_FS_REALPATH);
    -  ASSERT(req->result == 0);
    +  ASSERT_EQ(req->fs_type, UV_FS_REALPATH);
    +  ASSERT_OK(req->result);
     
       uv_cwd(test_file_abs_buf, &test_file_abs_size);
     #ifdef _WIN32
       strcat(test_file_abs_buf, "\\test_file");
    -  ASSERT(stricmp(req->ptr, test_file_abs_buf) == 0);
    +  ASSERT_OK(stricmp(req->ptr, test_file_abs_buf));
     #else
       strcat(test_file_abs_buf, "/test_file");
    -  ASSERT(strcmp(req->ptr, test_file_abs_buf) == 0);
    +  ASSERT_OK(strcmp(req->ptr, test_file_abs_buf));
     #endif
       realpath_cb_count++;
       uv_fs_req_cleanup(req);
    @@ -238,15 +238,15 @@ static void realpath_cb(uv_fs_t* req) {
     
     
     static void access_cb(uv_fs_t* req) {
    -  ASSERT(req->fs_type == UV_FS_ACCESS);
    +  ASSERT_EQ(req->fs_type, UV_FS_ACCESS);
       access_cb_count++;
       uv_fs_req_cleanup(req);
     }
     
     
     static void fchmod_cb(uv_fs_t* req) {
    -  ASSERT(req->fs_type == UV_FS_FCHMOD);
    -  ASSERT(req->result == 0);
    +  ASSERT_EQ(req->fs_type, UV_FS_FCHMOD);
    +  ASSERT_OK(req->result);
       fchmod_cb_count++;
       uv_fs_req_cleanup(req);
       check_permission("test_file", *(int*)req->data);
    @@ -254,8 +254,8 @@ static void fchmod_cb(uv_fs_t* req) {
     
     
     static void chmod_cb(uv_fs_t* req) {
    -  ASSERT(req->fs_type == UV_FS_CHMOD);
    -  ASSERT(req->result == 0);
    +  ASSERT_EQ(req->fs_type, UV_FS_CHMOD);
    +  ASSERT_OK(req->result);
       chmod_cb_count++;
       uv_fs_req_cleanup(req);
       check_permission("test_file", *(int*)req->data);
    @@ -263,42 +263,42 @@ static void chmod_cb(uv_fs_t* req) {
     
     
     static void fchown_cb(uv_fs_t* req) {
    -  ASSERT(req->fs_type == UV_FS_FCHOWN);
    -  ASSERT(req->result == 0);
    +  ASSERT_EQ(req->fs_type, UV_FS_FCHOWN);
    +  ASSERT_OK(req->result);
       fchown_cb_count++;
       uv_fs_req_cleanup(req);
     }
     
     
     static void chown_cb(uv_fs_t* req) {
    -  ASSERT(req->fs_type == UV_FS_CHOWN);
    -  ASSERT(req->result == 0);
    +  ASSERT_EQ(req->fs_type, UV_FS_CHOWN);
    +  ASSERT_OK(req->result);
       chown_cb_count++;
       uv_fs_req_cleanup(req);
     }
     
     static void lchown_cb(uv_fs_t* req) {
    -  ASSERT(req->fs_type == UV_FS_LCHOWN);
    -  ASSERT(req->result == 0);
    +  ASSERT_EQ(req->fs_type, UV_FS_LCHOWN);
    +  ASSERT_OK(req->result);
       lchown_cb_count++;
       uv_fs_req_cleanup(req);
     }
     
     static void chown_root_cb(uv_fs_t* req) {
    -  ASSERT(req->fs_type == UV_FS_CHOWN);
    +  ASSERT_EQ(req->fs_type, UV_FS_CHOWN);
     #if defined(_WIN32) || defined(__MSYS__)
       /* On windows, chown is a no-op and always succeeds. */
    -  ASSERT(req->result == 0);
    +  ASSERT_OK(req->result);
     #else
       /* On unix, chown'ing the root directory is not allowed -
        * unless you're root, of course.
        */
       if (geteuid() == 0)
    -    ASSERT(req->result == 0);
    +    ASSERT_OK(req->result);
       else
     #   if defined(__CYGWIN__)
         /* On Cygwin, uid 0 is invalid (no root). */
    -    ASSERT(req->result == UV_EINVAL);
    +    ASSERT_EQ(req->result, UV_EINVAL);
     #   elif defined(__PASE__)
         /* On IBMi PASE, there is no root user. uid 0 is user qsecofr.
          * User may grant qsecofr's privileges, including changing 
    @@ -306,7 +306,7 @@ static void chown_root_cb(uv_fs_t* req) {
          */
         ASSERT(req->result == 0 || req->result == UV_EPERM);
     #   else
    -    ASSERT(req->result == UV_EPERM);
    +    ASSERT_EQ(req->result, UV_EPERM);
     #   endif
     #endif
       chown_cb_count++;
    @@ -314,18 +314,18 @@ static void chown_root_cb(uv_fs_t* req) {
     }
     
     static void unlink_cb(uv_fs_t* req) {
    -  ASSERT(req == &unlink_req);
    -  ASSERT(req->fs_type == UV_FS_UNLINK);
    -  ASSERT(req->result == 0);
    +  ASSERT_PTR_EQ(req, &unlink_req);
    +  ASSERT_EQ(req->fs_type, UV_FS_UNLINK);
    +  ASSERT_OK(req->result);
       unlink_cb_count++;
       uv_fs_req_cleanup(req);
     }
     
     static void fstat_cb(uv_fs_t* req) {
       uv_stat_t* s = req->ptr;
    -  ASSERT(req->fs_type == UV_FS_FSTAT);
    -  ASSERT(req->result == 0);
    -  ASSERT(s->st_size == sizeof(test_buf));
    +  ASSERT_EQ(req->fs_type, UV_FS_FSTAT);
    +  ASSERT_OK(req->result);
    +  ASSERT_EQ(s->st_size, sizeof(test_buf));
       uv_fs_req_cleanup(req);
       fstat_cb_count++;
     }
    @@ -334,29 +334,29 @@ static void fstat_cb(uv_fs_t* req) {
     static void statfs_cb(uv_fs_t* req) {
       uv_statfs_t* stats;
     
    -  ASSERT(req->fs_type == UV_FS_STATFS);
    -  ASSERT(req->result == 0);
    +  ASSERT_EQ(req->fs_type, UV_FS_STATFS);
    +  ASSERT_OK(req->result);
       ASSERT_NOT_NULL(req->ptr);
       stats = req->ptr;
     
     #if defined(_WIN32) || defined(__sun) || defined(_AIX) || defined(__MVS__) || \
       defined(__OpenBSD__) || defined(__NetBSD__)
    -  ASSERT(stats->f_type == 0);
    +  ASSERT_OK(stats->f_type);
     #else
    -  ASSERT(stats->f_type > 0);
    +  ASSERT_GT(stats->f_type, 0);
     #endif
     
    -  ASSERT(stats->f_bsize > 0);
    -  ASSERT(stats->f_blocks > 0);
    -  ASSERT(stats->f_bfree <= stats->f_blocks);
    -  ASSERT(stats->f_bavail <= stats->f_bfree);
    +  ASSERT_GT(stats->f_bsize, 0);
    +  ASSERT_GT(stats->f_blocks, 0);
    +  ASSERT_LE(stats->f_bfree, stats->f_blocks);
    +  ASSERT_LE(stats->f_bavail, stats->f_bfree);
     
     #ifdef _WIN32
    -  ASSERT(stats->f_files == 0);
    -  ASSERT(stats->f_ffree == 0);
    +  ASSERT_OK(stats->f_files);
    +  ASSERT_OK(stats->f_ffree);
     #else
       /* There is no assertion for stats->f_files that makes sense, so ignore it. */
    -  ASSERT(stats->f_ffree <= stats->f_files);
    +  ASSERT_LE(stats->f_ffree, stats->f_files);
     #endif
       uv_fs_req_cleanup(req);
       ASSERT_NULL(req->ptr);
    @@ -366,27 +366,27 @@ static void statfs_cb(uv_fs_t* req) {
     
     static void close_cb(uv_fs_t* req) {
       int r;
    -  ASSERT(req == &close_req);
    -  ASSERT(req->fs_type == UV_FS_CLOSE);
    -  ASSERT(req->result == 0);
    +  ASSERT_PTR_EQ(req, &close_req);
    +  ASSERT_EQ(req->fs_type, UV_FS_CLOSE);
    +  ASSERT_OK(req->result);
       close_cb_count++;
       uv_fs_req_cleanup(req);
       if (close_cb_count == 3) {
         r = uv_fs_unlink(loop, &unlink_req, "test_file2", unlink_cb);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     }
     
     
     static void ftruncate_cb(uv_fs_t* req) {
       int r;
    -  ASSERT(req == &ftruncate_req);
    -  ASSERT(req->fs_type == UV_FS_FTRUNCATE);
    -  ASSERT(req->result == 0);
    +  ASSERT_PTR_EQ(req, &ftruncate_req);
    +  ASSERT_EQ(req->fs_type, UV_FS_FTRUNCATE);
    +  ASSERT_OK(req->result);
       ftruncate_cb_count++;
       uv_fs_req_cleanup(req);
       r = uv_fs_close(loop, &close_req, open_req1.result, close_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     static void fail_cb(uv_fs_t* req) {
    @@ -395,45 +395,45 @@ static void fail_cb(uv_fs_t* req) {
     
     static void read_cb(uv_fs_t* req) {
       int r;
    -  ASSERT(req == &read_req);
    -  ASSERT(req->fs_type == UV_FS_READ);
    -  ASSERT(req->result >= 0);  /* FIXME(bnoordhuis) Check if requested size? */
    +  ASSERT_PTR_EQ(req, &read_req);
    +  ASSERT_EQ(req->fs_type, UV_FS_READ);
    +  ASSERT_GE(req->result, 0);  /* FIXME(bnoordhuis) Check if requested size? */
       read_cb_count++;
       uv_fs_req_cleanup(req);
       if (read_cb_count == 1) {
    -    ASSERT(strcmp(buf, test_buf) == 0);
    +    ASSERT_OK(strcmp(buf, test_buf));
         r = uv_fs_ftruncate(loop, &ftruncate_req, open_req1.result, 7,
             ftruncate_cb);
       } else {
    -    ASSERT(strcmp(buf, "test-bu") == 0);
    +    ASSERT_OK(strcmp(buf, "test-bu"));
         r = uv_fs_close(loop, &close_req, open_req1.result, close_cb);
       }
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
     static void open_cb(uv_fs_t* req) {
       int r;
    -  ASSERT(req == &open_req1);
    -  ASSERT(req->fs_type == UV_FS_OPEN);
    +  ASSERT_PTR_EQ(req, &open_req1);
    +  ASSERT_EQ(req->fs_type, UV_FS_OPEN);
       if (req->result < 0) {
         fprintf(stderr, "async open error: %d\n", (int) req->result);
         ASSERT(0);
       }
       open_cb_count++;
       ASSERT(req->path);
    -  ASSERT(memcmp(req->path, "test_file2\0", 11) == 0);
    +  ASSERT_OK(memcmp(req->path, "test_file2\0", 11));
       uv_fs_req_cleanup(req);
       memset(buf, 0, sizeof(buf));
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(loop, &read_req, open_req1.result, &iov, 1, -1,
           read_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
     static void open_cb_simple(uv_fs_t* req) {
    -  ASSERT(req->fs_type == UV_FS_OPEN);
    +  ASSERT_EQ(req->fs_type, UV_FS_OPEN);
       if (req->result < 0) {
         fprintf(stderr, "async open error: %d\n", (int) req->result);
         ASSERT(0);
    @@ -446,69 +446,69 @@ static void open_cb_simple(uv_fs_t* req) {
     
     static void fsync_cb(uv_fs_t* req) {
       int r;
    -  ASSERT(req == &fsync_req);
    -  ASSERT(req->fs_type == UV_FS_FSYNC);
    -  ASSERT(req->result == 0);
    +  ASSERT_PTR_EQ(req, &fsync_req);
    +  ASSERT_EQ(req->fs_type, UV_FS_FSYNC);
    +  ASSERT_OK(req->result);
       fsync_cb_count++;
       uv_fs_req_cleanup(req);
       r = uv_fs_close(loop, &close_req, open_req1.result, close_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
     static void fdatasync_cb(uv_fs_t* req) {
       int r;
    -  ASSERT(req == &fdatasync_req);
    -  ASSERT(req->fs_type == UV_FS_FDATASYNC);
    -  ASSERT(req->result == 0);
    +  ASSERT_PTR_EQ(req, &fdatasync_req);
    +  ASSERT_EQ(req->fs_type, UV_FS_FDATASYNC);
    +  ASSERT_OK(req->result);
       fdatasync_cb_count++;
       uv_fs_req_cleanup(req);
       r = uv_fs_fsync(loop, &fsync_req, open_req1.result, fsync_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
     static void write_cb(uv_fs_t* req) {
       int r;
    -  ASSERT(req == &write_req);
    -  ASSERT(req->fs_type == UV_FS_WRITE);
    -  ASSERT(req->result >= 0);  /* FIXME(bnoordhuis) Check if requested size? */
    +  ASSERT_PTR_EQ(req, &write_req);
    +  ASSERT_EQ(req->fs_type, UV_FS_WRITE);
    +  ASSERT_GE(req->result, 0);  /* FIXME(bnoordhuis) Check if requested size? */
       write_cb_count++;
       uv_fs_req_cleanup(req);
       r = uv_fs_fdatasync(loop, &fdatasync_req, open_req1.result, fdatasync_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
     static void create_cb(uv_fs_t* req) {
       int r;
    -  ASSERT(req == &open_req1);
    -  ASSERT(req->fs_type == UV_FS_OPEN);
    -  ASSERT(req->result >= 0);
    +  ASSERT_PTR_EQ(req, &open_req1);
    +  ASSERT_EQ(req->fs_type, UV_FS_OPEN);
    +  ASSERT_GE(req->result, 0);
       create_cb_count++;
       uv_fs_req_cleanup(req);
       iov = uv_buf_init(test_buf, sizeof(test_buf));
       r = uv_fs_write(loop, &write_req, req->result, &iov, 1, -1, write_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
     static void rename_cb(uv_fs_t* req) {
    -  ASSERT(req == &rename_req);
    -  ASSERT(req->fs_type == UV_FS_RENAME);
    -  ASSERT(req->result == 0);
    +  ASSERT_PTR_EQ(req, &rename_req);
    +  ASSERT_EQ(req->fs_type, UV_FS_RENAME);
    +  ASSERT_OK(req->result);
       rename_cb_count++;
       uv_fs_req_cleanup(req);
     }
     
     
     static void mkdir_cb(uv_fs_t* req) {
    -  ASSERT(req == &mkdir_req);
    -  ASSERT(req->fs_type == UV_FS_MKDIR);
    -  ASSERT(req->result == 0);
    +  ASSERT_PTR_EQ(req, &mkdir_req);
    +  ASSERT_EQ(req->fs_type, UV_FS_MKDIR);
    +  ASSERT_OK(req->result);
       mkdir_cb_count++;
       ASSERT(req->path);
    -  ASSERT(memcmp(req->path, "test_dir\0", 9) == 0);
    +  ASSERT_OK(memcmp(req->path, "test_dir\0", 9));
       uv_fs_req_cleanup(req);
     }
     
    @@ -516,24 +516,24 @@ static void mkdir_cb(uv_fs_t* req) {
     static void check_mkdtemp_result(uv_fs_t* req) {
       int r;
     
    -  ASSERT(req->fs_type == UV_FS_MKDTEMP);
    -  ASSERT(req->result == 0);
    +  ASSERT_EQ(req->fs_type, UV_FS_MKDTEMP);
    +  ASSERT_OK(req->result);
       ASSERT(req->path);
    -  ASSERT(strlen(req->path) == 15);
    -  ASSERT(memcmp(req->path, "test_dir_", 9) == 0);
    -  ASSERT(memcmp(req->path + 9, "XXXXXX", 6) != 0);
    +  ASSERT_EQ(15, strlen(req->path));
    +  ASSERT_OK(memcmp(req->path, "test_dir_", 9));
    +  ASSERT_NE(0, memcmp(req->path + 9, "XXXXXX", 6));
       check_permission(req->path, 0700);
     
       /* Check if req->path is actually a directory */
       r = uv_fs_stat(NULL, &stat_req, req->path, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       ASSERT(((uv_stat_t*)stat_req.ptr)->st_mode & S_IFDIR);
       uv_fs_req_cleanup(&stat_req);
     }
     
     
     static void mkdtemp_cb(uv_fs_t* req) {
    -  ASSERT(req == &mkdtemp_req1);
    +  ASSERT_PTR_EQ(req, &mkdtemp_req1);
       check_mkdtemp_result(req);
       mkdtemp_cb_count++;
     }
    @@ -542,36 +542,36 @@ static void mkdtemp_cb(uv_fs_t* req) {
     static void check_mkstemp_result(uv_fs_t* req) {
       int r;
     
    -  ASSERT(req->fs_type == UV_FS_MKSTEMP);
    -  ASSERT(req->result >= 0);
    +  ASSERT_EQ(req->fs_type, UV_FS_MKSTEMP);
    +  ASSERT_GE(req->result, 0);
       ASSERT(req->path);
    -  ASSERT(strlen(req->path) == 16);
    -  ASSERT(memcmp(req->path, "test_file_", 10) == 0);
    -  ASSERT(memcmp(req->path + 10, "XXXXXX", 6) != 0);
    +  ASSERT_EQ(16, strlen(req->path));
    +  ASSERT_OK(memcmp(req->path, "test_file_", 10));
    +  ASSERT_NE(0, memcmp(req->path + 10, "XXXXXX", 6));
       check_permission(req->path, 0600);
     
       /* Check if req->path is actually a file */
       r = uv_fs_stat(NULL, &stat_req, req->path, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       ASSERT(stat_req.statbuf.st_mode & S_IFREG);
       uv_fs_req_cleanup(&stat_req);
     }
     
     
     static void mkstemp_cb(uv_fs_t* req) {
    -  ASSERT(req == &mkstemp_req1);
    +  ASSERT_PTR_EQ(req, &mkstemp_req1);
       check_mkstemp_result(req);
       mkstemp_cb_count++;
     }
     
     
     static void rmdir_cb(uv_fs_t* req) {
    -  ASSERT(req == &rmdir_req);
    -  ASSERT(req->fs_type == UV_FS_RMDIR);
    -  ASSERT(req->result == 0);
    +  ASSERT_PTR_EQ(req, &rmdir_req);
    +  ASSERT_EQ(req->fs_type, UV_FS_RMDIR);
    +  ASSERT_OK(req->result);
       rmdir_cb_count++;
       ASSERT(req->path);
    -  ASSERT(memcmp(req->path, "test_dir\0", 9) == 0);
    +  ASSERT_OK(memcmp(req->path, "test_dir\0", 9));
       uv_fs_req_cleanup(req);
     }
     
    @@ -588,21 +588,21 @@ static void assert_is_file_type(uv_dirent_t dent) {
        *     https://github.com/libuv/libuv/issues/501
        */
       #if defined(__APPLE__) || defined(_WIN32)
    -    ASSERT(dent.type == UV_DIRENT_FILE);
    +    ASSERT_EQ(dent.type, UV_DIRENT_FILE);
       #else
         ASSERT(dent.type == UV_DIRENT_FILE || dent.type == UV_DIRENT_UNKNOWN);
       #endif
     #else
    -  ASSERT(dent.type == UV_DIRENT_UNKNOWN);
    +  ASSERT_EQ(dent.type, UV_DIRENT_UNKNOWN);
     #endif
     }
     
     
     static void scandir_cb(uv_fs_t* req) {
       uv_dirent_t dent;
    -  ASSERT(req == &scandir_req);
    -  ASSERT(req->fs_type == UV_FS_SCANDIR);
    -  ASSERT(req->result == 2);
    +  ASSERT_PTR_EQ(req, &scandir_req);
    +  ASSERT_EQ(req->fs_type, UV_FS_SCANDIR);
    +  ASSERT_EQ(2, req->result);
       ASSERT(req->ptr);
     
       while (UV_EOF != uv_fs_scandir_next(req, &dent)) {
    @@ -611,7 +611,7 @@ static void scandir_cb(uv_fs_t* req) {
       }
       scandir_cb_count++;
       ASSERT(req->path);
    -  ASSERT(memcmp(req->path, "test_dir\0", 9) == 0);
    +  ASSERT_OK(memcmp(req->path, "test_dir\0", 9));
       uv_fs_req_cleanup(req);
       ASSERT(!req->ptr);
     }
    @@ -620,11 +620,11 @@ static void scandir_cb(uv_fs_t* req) {
     static void empty_scandir_cb(uv_fs_t* req) {
       uv_dirent_t dent;
     
    -  ASSERT(req == &scandir_req);
    -  ASSERT(req->fs_type == UV_FS_SCANDIR);
    -  ASSERT(req->result == 0);
    +  ASSERT_PTR_EQ(req, &scandir_req);
    +  ASSERT_EQ(req->fs_type, UV_FS_SCANDIR);
    +  ASSERT_OK(req->result);
       ASSERT_NULL(req->ptr);
    -  ASSERT(UV_EOF == uv_fs_scandir_next(req, &dent));
    +  ASSERT_EQ(UV_EOF, uv_fs_scandir_next(req, &dent));
       uv_fs_req_cleanup(req);
       scandir_cb_count++;
     }
    @@ -632,20 +632,20 @@ static void empty_scandir_cb(uv_fs_t* req) {
     static void non_existent_scandir_cb(uv_fs_t* req) {
       uv_dirent_t dent;
     
    -  ASSERT(req == &scandir_req);
    -  ASSERT(req->fs_type == UV_FS_SCANDIR);
    -  ASSERT(req->result == UV_ENOENT);
    +  ASSERT_PTR_EQ(req, &scandir_req);
    +  ASSERT_EQ(req->fs_type, UV_FS_SCANDIR);
    +  ASSERT_EQ(req->result, UV_ENOENT);
       ASSERT_NULL(req->ptr);
    -  ASSERT(UV_ENOENT == uv_fs_scandir_next(req, &dent));
    +  ASSERT_EQ(UV_ENOENT, uv_fs_scandir_next(req, &dent));
       uv_fs_req_cleanup(req);
       scandir_cb_count++;
     }
     
     
     static void file_scandir_cb(uv_fs_t* req) {
    -  ASSERT(req == &scandir_req);
    -  ASSERT(req->fs_type == UV_FS_SCANDIR);
    -  ASSERT(req->result == UV_ENOTDIR);
    +  ASSERT_PTR_EQ(req, &scandir_req);
    +  ASSERT_EQ(req->fs_type, UV_FS_SCANDIR);
    +  ASSERT_EQ(req->result, UV_ENOTDIR);
       ASSERT_NULL(req->ptr);
       uv_fs_req_cleanup(req);
       scandir_cb_count++;
    @@ -653,9 +653,9 @@ static void file_scandir_cb(uv_fs_t* req) {
     
     
     static void stat_cb(uv_fs_t* req) {
    -  ASSERT(req == &stat_req);
    +  ASSERT_PTR_EQ(req, &stat_req);
       ASSERT(req->fs_type == UV_FS_STAT || req->fs_type == UV_FS_LSTAT);
    -  ASSERT(req->result == 0);
    +  ASSERT_OK(req->result);
       ASSERT(req->ptr);
       stat_cb_count++;
       uv_fs_req_cleanup(req);
    @@ -664,7 +664,7 @@ static void stat_cb(uv_fs_t* req) {
     
     static void stat_batch_cb(uv_fs_t* req) {
       ASSERT(req->fs_type == UV_FS_STAT || req->fs_type == UV_FS_LSTAT);
    -  ASSERT(req->result == 0);
    +  ASSERT_OK(req->result);
       ASSERT(req->ptr);
       stat_cb_count++;
       uv_fs_req_cleanup(req);
    @@ -673,40 +673,40 @@ static void stat_batch_cb(uv_fs_t* req) {
     
     
     static void sendfile_cb(uv_fs_t* req) {
    -  ASSERT(req == &sendfile_req);
    -  ASSERT(req->fs_type == UV_FS_SENDFILE);
    -  ASSERT(req->result == 65545);
    +  ASSERT_PTR_EQ(req, &sendfile_req);
    +  ASSERT_EQ(req->fs_type, UV_FS_SENDFILE);
    +  ASSERT_EQ(65545, req->result);
       sendfile_cb_count++;
       uv_fs_req_cleanup(req);
     }
     
     
     static void sendfile_nodata_cb(uv_fs_t* req) {
    -  ASSERT(req == &sendfile_req);
    -  ASSERT(req->fs_type == UV_FS_SENDFILE);
    -  ASSERT(req->result == 0);
    +  ASSERT_PTR_EQ(req, &sendfile_req);
    +  ASSERT_EQ(req->fs_type, UV_FS_SENDFILE);
    +  ASSERT_OK(req->result);
       sendfile_cb_count++;
       uv_fs_req_cleanup(req);
     }
     
     
     static void open_noent_cb(uv_fs_t* req) {
    -  ASSERT(req->fs_type == UV_FS_OPEN);
    -  ASSERT(req->result == UV_ENOENT);
    +  ASSERT_EQ(req->fs_type, UV_FS_OPEN);
    +  ASSERT_EQ(req->result, UV_ENOENT);
       open_cb_count++;
       uv_fs_req_cleanup(req);
     }
     
     static void open_nametoolong_cb(uv_fs_t* req) {
    -  ASSERT(req->fs_type == UV_FS_OPEN);
    -  ASSERT(req->result == UV_ENAMETOOLONG);
    +  ASSERT_EQ(req->fs_type, UV_FS_OPEN);
    +  ASSERT_EQ(req->result, UV_ENAMETOOLONG);
       open_cb_count++;
       uv_fs_req_cleanup(req);
     }
     
     static void open_loop_cb(uv_fs_t* req) {
    -  ASSERT(req->fs_type == UV_FS_OPEN);
    -  ASSERT(req->result == UV_ELOOP);
    +  ASSERT_EQ(req->fs_type, UV_FS_OPEN);
    +  ASSERT_EQ(req->result, UV_ELOOP);
       open_cb_count++;
       uv_fs_req_cleanup(req);
     }
    @@ -719,16 +719,16 @@ TEST_IMPL(fs_file_noent) {
       loop = uv_default_loop();
     
       r = uv_fs_open(NULL, &req, "does_not_exist", O_RDONLY, 0, NULL);
    -  ASSERT(r == UV_ENOENT);
    -  ASSERT(req.result == UV_ENOENT);
    +  ASSERT_EQ(r, UV_ENOENT);
    +  ASSERT_EQ(req.result, UV_ENOENT);
       uv_fs_req_cleanup(&req);
     
       r = uv_fs_open(loop, &req, "does_not_exist", O_RDONLY, 0, open_noent_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(open_cb_count == 0);
    +  ASSERT_OK(open_cb_count);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(open_cb_count == 1);
    +  ASSERT_EQ(1, open_cb_count);
     
       /* TODO add EACCES test */
     
    @@ -747,16 +747,16 @@ TEST_IMPL(fs_file_nametoolong) {
       name[TOO_LONG_NAME_LENGTH] = 0;
     
       r = uv_fs_open(NULL, &req, name, O_RDONLY, 0, NULL);
    -  ASSERT(r == UV_ENAMETOOLONG);
    -  ASSERT(req.result == UV_ENAMETOOLONG);
    +  ASSERT_EQ(r, UV_ENAMETOOLONG);
    +  ASSERT_EQ(req.result, UV_ENAMETOOLONG);
       uv_fs_req_cleanup(&req);
     
       r = uv_fs_open(loop, &req, name, O_RDONLY, 0, open_nametoolong_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(open_cb_count == 0);
    +  ASSERT_OK(open_cb_count);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(open_cb_count == 1);
    +  ASSERT_EQ(1, open_cb_count);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -783,20 +783,20 @@ TEST_IMPL(fs_file_loop) {
       if (r == UV_ENOENT)
         return 0;
     #endif
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&req);
     
       r = uv_fs_open(NULL, &req, "test_symlink", O_RDONLY, 0, NULL);
    -  ASSERT(r == UV_ELOOP);
    -  ASSERT(req.result == UV_ELOOP);
    +  ASSERT_EQ(r, UV_ELOOP);
    +  ASSERT_EQ(req.result, UV_ELOOP);
       uv_fs_req_cleanup(&req);
     
       r = uv_fs_open(loop, &req, "test_symlink", O_RDONLY, 0, open_loop_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(open_cb_count == 0);
    +  ASSERT_OK(open_cb_count);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(open_cb_count == 1);
    +  ASSERT_EQ(1, open_cb_count);
     
       unlink("test_symlink");
     
    @@ -817,9 +817,9 @@ static void check_utime(const char* path,
       else
         r = uv_fs_stat(loop, &req, path, NULL);
     
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
    -  ASSERT_EQ(req.result, 0);
    +  ASSERT_OK(req.result);
       s = &req.statbuf;
     
       if (s->st_atim.tv_nsec == 0 && s->st_mtim.tv_nsec == 0) {
    @@ -868,9 +868,9 @@ static void check_utime(const char* path,
     static void utime_cb(uv_fs_t* req) {
       utime_check_t* c;
     
    -  ASSERT(req == &utime_req);
    -  ASSERT(req->result == 0);
    -  ASSERT(req->fs_type == UV_FS_UTIME);
    +  ASSERT_PTR_EQ(req, &utime_req);
    +  ASSERT_OK(req->result);
    +  ASSERT_EQ(req->fs_type, UV_FS_UTIME);
     
       c = req->data;
       check_utime(c->path, c->atime, c->mtime, /* test_lutime */ 0);
    @@ -883,9 +883,9 @@ static void utime_cb(uv_fs_t* req) {
     static void futime_cb(uv_fs_t* req) {
       utime_check_t* c;
     
    -  ASSERT(req == &futime_req);
    -  ASSERT(req->result == 0);
    -  ASSERT(req->fs_type == UV_FS_FUTIME);
    +  ASSERT_PTR_EQ(req, &futime_req);
    +  ASSERT_OK(req->result);
    +  ASSERT_EQ(req->fs_type, UV_FS_FUTIME);
     
       c = req->data;
       check_utime(c->path, c->atime, c->mtime, /* test_lutime */ 0);
    @@ -898,8 +898,8 @@ static void futime_cb(uv_fs_t* req) {
     static void lutime_cb(uv_fs_t* req) {
       utime_check_t* c;
     
    -  ASSERT(req->result == 0);
    -  ASSERT(req->fs_type == UV_FS_LUTIME);
    +  ASSERT_OK(req->result);
    +  ASSERT_EQ(req->fs_type, UV_FS_LUTIME);
     
       c = req->data;
       check_utime(c->path, c->atime, c->mtime, /* test_lutime */ 1);
    @@ -920,48 +920,48 @@ TEST_IMPL(fs_file_async) {
     
       r = uv_fs_open(loop, &open_req1, "test_file", O_WRONLY | O_CREAT,
           S_IRUSR | S_IWUSR, create_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
     
    -  ASSERT(create_cb_count == 1);
    -  ASSERT(write_cb_count == 1);
    -  ASSERT(fsync_cb_count == 1);
    -  ASSERT(fdatasync_cb_count == 1);
    -  ASSERT(close_cb_count == 1);
    +  ASSERT_EQ(1, create_cb_count);
    +  ASSERT_EQ(1, write_cb_count);
    +  ASSERT_EQ(1, fsync_cb_count);
    +  ASSERT_EQ(1, fdatasync_cb_count);
    +  ASSERT_EQ(1, close_cb_count);
     
       r = uv_fs_rename(loop, &rename_req, "test_file", "test_file2", rename_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(create_cb_count == 1);
    -  ASSERT(write_cb_count == 1);
    -  ASSERT(close_cb_count == 1);
    -  ASSERT(rename_cb_count == 1);
    +  ASSERT_EQ(1, create_cb_count);
    +  ASSERT_EQ(1, write_cb_count);
    +  ASSERT_EQ(1, close_cb_count);
    +  ASSERT_EQ(1, rename_cb_count);
     
       r = uv_fs_open(loop, &open_req1, "test_file2", O_RDWR, 0, open_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(open_cb_count == 1);
    -  ASSERT(read_cb_count == 1);
    -  ASSERT(close_cb_count == 2);
    -  ASSERT(rename_cb_count == 1);
    -  ASSERT(create_cb_count == 1);
    -  ASSERT(write_cb_count == 1);
    -  ASSERT(ftruncate_cb_count == 1);
    +  ASSERT_EQ(1, open_cb_count);
    +  ASSERT_EQ(1, read_cb_count);
    +  ASSERT_EQ(2, close_cb_count);
    +  ASSERT_EQ(1, rename_cb_count);
    +  ASSERT_EQ(1, create_cb_count);
    +  ASSERT_EQ(1, write_cb_count);
    +  ASSERT_EQ(1, ftruncate_cb_count);
     
       r = uv_fs_open(loop, &open_req1, "test_file2", O_RDONLY, 0, open_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(open_cb_count == 2);
    -  ASSERT(read_cb_count == 2);
    -  ASSERT(close_cb_count == 3);
    -  ASSERT(rename_cb_count == 1);
    -  ASSERT(unlink_cb_count == 1);
    -  ASSERT(create_cb_count == 1);
    -  ASSERT(write_cb_count == 1);
    -  ASSERT(ftruncate_cb_count == 1);
    +  ASSERT_EQ(2, open_cb_count);
    +  ASSERT_EQ(2, read_cb_count);
    +  ASSERT_EQ(3, close_cb_count);
    +  ASSERT_EQ(1, rename_cb_count);
    +  ASSERT_EQ(1, unlink_cb_count);
    +  ASSERT_EQ(1, create_cb_count);
    +  ASSERT_EQ(1, write_cb_count);
    +  ASSERT_EQ(1, ftruncate_cb_count);
     
       /* Cleanup. */
       unlink("test_file");
    @@ -983,70 +983,70 @@ static void fs_file_sync(int add_flags) {
     
       r = uv_fs_open(loop, &open_req1, "test_file",
           O_WRONLY | O_CREAT | add_flags, S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
       iov = uv_buf_init(test_buf, sizeof(test_buf));
       r = uv_fs_write(NULL, &write_req, open_req1.result, &iov, 1, -1, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(write_req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(write_req.result, 0);
       uv_fs_req_cleanup(&write_req);
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       r = uv_fs_open(NULL, &open_req1, "test_file", O_RDWR | add_flags, 0, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL, &read_req, open_req1.result, &iov, 1, -1, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(read_req.result >= 0);
    -  ASSERT(strcmp(buf, test_buf) == 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(read_req.result, 0);
    +  ASSERT_OK(strcmp(buf, test_buf));
       uv_fs_req_cleanup(&read_req);
     
       r = uv_fs_ftruncate(NULL, &ftruncate_req, open_req1.result, 7, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(ftruncate_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(ftruncate_req.result);
       uv_fs_req_cleanup(&ftruncate_req);
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       r = uv_fs_rename(NULL, &rename_req, "test_file", "test_file2", NULL);
    -  ASSERT(r == 0);
    -  ASSERT(rename_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(rename_req.result);
       uv_fs_req_cleanup(&rename_req);
     
       r = uv_fs_open(NULL, &open_req1, "test_file2", O_RDONLY | add_flags, 0,
           NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
       memset(buf, 0, sizeof(buf));
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL, &read_req, open_req1.result, &iov, 1, -1, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(read_req.result >= 0);
    -  ASSERT(strcmp(buf, "test-bu") == 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(read_req.result, 0);
    +  ASSERT_OK(strcmp(buf, "test-bu"));
       uv_fs_req_cleanup(&read_req);
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       r = uv_fs_unlink(NULL, &unlink_req, "test_file2", NULL);
    -  ASSERT(r == 0);
    -  ASSERT(unlink_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(unlink_req.result);
       uv_fs_req_cleanup(&unlink_req);
     
       /* Cleanup */
    @@ -1072,19 +1072,19 @@ static void fs_file_write_null_buffer(int add_flags) {
     
       r = uv_fs_open(NULL, &open_req1, "test_file",
           O_WRONLY | O_CREAT | add_flags, S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
       iov = uv_buf_init(NULL, 0);
       r = uv_fs_write(NULL, &write_req, open_req1.result, &iov, 1, -1, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(write_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(write_req.result);
       uv_fs_req_cleanup(&write_req);
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       unlink("test_file");
    @@ -1110,38 +1110,38 @@ TEST_IMPL(fs_async_dir) {
       loop = uv_default_loop();
     
       r = uv_fs_mkdir(loop, &mkdir_req, "test_dir", 0755, mkdir_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(mkdir_cb_count == 1);
    +  ASSERT_EQ(1, mkdir_cb_count);
     
       /* Create 2 files synchronously. */
       r = uv_fs_open(NULL, &open_req1, "test_dir/file1", O_WRONLY | O_CREAT,
           S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    +  ASSERT_GE(r, 0);
       uv_fs_req_cleanup(&open_req1);
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&close_req);
     
       r = uv_fs_open(NULL, &open_req1, "test_dir/file2", O_WRONLY | O_CREAT,
           S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    +  ASSERT_GE(r, 0);
       uv_fs_req_cleanup(&open_req1);
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&close_req);
     
       r = uv_fs_scandir(loop, &scandir_req, "test_dir", 0, scandir_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(scandir_cb_count == 1);
    +  ASSERT_EQ(1, scandir_cb_count);
     
       /* sync uv_fs_scandir */
       r = uv_fs_scandir(NULL, &scandir_req, "test_dir", 0, NULL);
    -  ASSERT(r == 2);
    -  ASSERT(scandir_req.result == 2);
    +  ASSERT_EQ(2, r);
    +  ASSERT_EQ(2, scandir_req.result);
       ASSERT(scandir_req.ptr);
       while (UV_EOF != uv_fs_scandir_next(&scandir_req, &dent)) {
         ASSERT(strcmp(dent.name, "file1") == 0 || strcmp(dent.name, "file2") == 0);
    @@ -1151,37 +1151,37 @@ TEST_IMPL(fs_async_dir) {
       ASSERT(!scandir_req.ptr);
     
       r = uv_fs_stat(loop, &stat_req, "test_dir", stat_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
     
       r = uv_fs_stat(loop, &stat_req, "test_dir/", stat_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
     
       r = uv_fs_lstat(loop, &stat_req, "test_dir", stat_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
     
       r = uv_fs_lstat(loop, &stat_req, "test_dir/", stat_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
     
    -  ASSERT(stat_cb_count == 4);
    +  ASSERT_EQ(4, stat_cb_count);
     
       r = uv_fs_unlink(loop, &unlink_req, "test_dir/file1", unlink_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(unlink_cb_count == 1);
    +  ASSERT_EQ(1, unlink_cb_count);
     
       r = uv_fs_unlink(loop, &unlink_req, "test_dir/file2", unlink_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(unlink_cb_count == 2);
    +  ASSERT_EQ(2, unlink_cb_count);
     
       r = uv_fs_rmdir(loop, &rmdir_req, "test_dir", rmdir_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(rmdir_cb_count == 1);
    +  ASSERT_EQ(1, rmdir_cb_count);
     
       /* Cleanup */
       unlink("test_dir/file1");
    @@ -1206,58 +1206,58 @@ static int test_sendfile(void (*setup)(int), uv_fs_cb cb, off_t expected_size) {
       unlink("test_file2");
     
       f = open("test_file", O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR);
    -  ASSERT(f != -1);
    +  ASSERT_NE(f, -1);
     
       if (setup != NULL)
         setup(f);
     
       r = close(f);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Test starts here. */
       r = uv_fs_open(NULL, &open_req1, "test_file", O_RDWR, 0, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
       r = uv_fs_open(NULL, &open_req2, "test_file2", O_WRONLY | O_CREAT,
           S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req2.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req2.result, 0);
       uv_fs_req_cleanup(&open_req2);
     
       r = uv_fs_sendfile(loop, &sendfile_req, open_req2.result, open_req1.result,
           1, 131072, cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
     
    -  ASSERT(sendfile_cb_count == 1);
    +  ASSERT_EQ(1, sendfile_cb_count);
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&close_req);
       r = uv_fs_close(NULL, &close_req, open_req2.result, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&close_req);
     
       memset(&s1, 0, sizeof(s1));
       memset(&s2, 0, sizeof(s2));
    -  ASSERT(0 == stat("test_file", &s1));
    -  ASSERT(0 == stat("test_file2", &s2));
    -  ASSERT(s2.st_size == expected_size);
    +  ASSERT_OK(stat("test_file", &s1));
    +  ASSERT_OK(stat("test_file2", &s2));
    +  ASSERT_EQ(s2.st_size, expected_size);
     
       if (expected_size > 0) {
         ASSERT_UINT64_EQ(s1.st_size, s2.st_size + 1);
         r = uv_fs_open(NULL, &open_req1, "test_file2", O_RDWR, 0, NULL);
    -    ASSERT(r >= 0);
    -    ASSERT(open_req1.result >= 0);
    +    ASSERT_GE(r, 0);
    +    ASSERT_GE(open_req1.result, 0);
         uv_fs_req_cleanup(&open_req1);
     
         memset(buf1, 0, sizeof(buf1));
         iov = uv_buf_init(buf1, sizeof(buf1));
         r = uv_fs_read(NULL, &req, open_req1.result, &iov, 1, -1, NULL);
    -    ASSERT(r >= 0);
    -    ASSERT(req.result >= 0);
    +    ASSERT_GE(r, 0);
    +    ASSERT_GE(req.result, 0);
         ASSERT_EQ(buf1[0], 'e'); /* 'e' from begin */
         uv_fs_req_cleanup(&req);
       } else {
    @@ -1274,9 +1274,9 @@ static int test_sendfile(void (*setup)(int), uv_fs_cb cb, off_t expected_size) {
     
     
     static void sendfile_setup(int f) {
    -  ASSERT(6 == write(f, "begin\n", 6));
    -  ASSERT(65542 == lseek(f, 65536, SEEK_CUR));
    -  ASSERT(4 == write(f, "end\n", 4));
    +  ASSERT_EQ(6, write(f, "begin\n", 6));
    +  ASSERT_EQ(65542, lseek(f, 65536, SEEK_CUR));
    +  ASSERT_EQ(4, write(f, "end\n", 4));
     }
     
     
    @@ -1297,18 +1297,18 @@ TEST_IMPL(fs_mkdtemp) {
       loop = uv_default_loop();
     
       r = uv_fs_mkdtemp(loop, &mkdtemp_req1, path_template, mkdtemp_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(mkdtemp_cb_count == 1);
    +  ASSERT_EQ(1, mkdtemp_cb_count);
     
       /* sync mkdtemp */
       r = uv_fs_mkdtemp(NULL, &mkdtemp_req2, path_template, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       check_mkdtemp_result(&mkdtemp_req2);
     
       /* mkdtemp return different values on subsequent calls */
    -  ASSERT(strcmp(mkdtemp_req1.path, mkdtemp_req2.path) != 0);
    +  ASSERT_NE(0, strcmp(mkdtemp_req1.path, mkdtemp_req2.path));
     
       /* Cleanup */
       rmdir(mkdtemp_req1.path);
    @@ -1330,32 +1330,32 @@ TEST_IMPL(fs_mkstemp) {
       loop = uv_default_loop();
     
       r = uv_fs_mkstemp(loop, &mkstemp_req1, path_template, mkstemp_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(mkstemp_cb_count == 1);
    +  ASSERT_EQ(1, mkstemp_cb_count);
     
       /* sync mkstemp */
       r = uv_fs_mkstemp(NULL, &mkstemp_req2, path_template, NULL);
    -  ASSERT(r >= 0);
    +  ASSERT_GE(r, 0);
       check_mkstemp_result(&mkstemp_req2);
     
       /* mkstemp return different values on subsequent calls */
    -  ASSERT(strcmp(mkstemp_req1.path, mkstemp_req2.path) != 0);
    +  ASSERT_NE(0, strcmp(mkstemp_req1.path, mkstemp_req2.path));
     
       /* invalid template returns EINVAL */
       ASSERT_EQ(UV_EINVAL, uv_fs_mkstemp(NULL, &mkstemp_req3, "test_file", NULL));
     
       /* Make sure that path is empty string */
    -  ASSERT_EQ(0, strlen(mkstemp_req3.path));
    +  ASSERT_OK(strlen(mkstemp_req3.path));
     
       uv_fs_req_cleanup(&mkstemp_req3);
     
       /* We can write to the opened file */
       iov = uv_buf_init(test_buf, sizeof(test_buf));
       r = uv_fs_write(NULL, &req, mkstemp_req1.result, &iov, 1, -1, NULL);
    -  ASSERT(r == sizeof(test_buf));
    -  ASSERT(req.result == sizeof(test_buf));
    +  ASSERT_EQ(r, sizeof(test_buf));
    +  ASSERT_EQ(req.result, sizeof(test_buf));
       uv_fs_req_cleanup(&req);
     
       /* Cleanup */
    @@ -1365,15 +1365,15 @@ TEST_IMPL(fs_mkstemp) {
       uv_fs_req_cleanup(&req);
     
       fd = uv_fs_open(NULL, &req, mkstemp_req1.path , O_RDONLY, 0, NULL);
    -  ASSERT(fd >= 0);
    +  ASSERT_GE(fd, 0);
       uv_fs_req_cleanup(&req);
     
       memset(buf, 0, sizeof(buf));
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL, &req, fd, &iov, 1, -1, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(req.result >= 0);
    -  ASSERT(strcmp(buf, test_buf) == 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(req.result, 0);
    +  ASSERT_OK(strcmp(buf, test_buf));
       uv_fs_req_cleanup(&req);
     
       uv_fs_close(NULL, &req, fd, NULL);
    @@ -1412,20 +1412,20 @@ TEST_IMPL(fs_fstat) {
     
       r = uv_fs_open(NULL, &req, "test_file", O_RDWR | O_CREAT,
           S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(req.result, 0);
       file = req.result;
       uv_fs_req_cleanup(&req);
     
     #ifndef _WIN32
       memset(&t, 0, sizeof(t));
    -  ASSERT(0 == fstat(file, &t));
    -  ASSERT(0 == uv_fs_fstat(NULL, &req, file, NULL));
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(fstat(file, &t));
    +  ASSERT_OK(uv_fs_fstat(NULL, &req, file, NULL));
    +  ASSERT_OK(req.result);
       s = req.ptr;
     # if defined(__APPLE__)
    -  ASSERT(s->st_birthtim.tv_sec == t.st_birthtimespec.tv_sec);
    -  ASSERT(s->st_birthtim.tv_nsec == t.st_birthtimespec.tv_nsec);
    +  ASSERT_EQ(s->st_birthtim.tv_sec, t.st_birthtimespec.tv_sec);
    +  ASSERT_EQ(s->st_birthtim.tv_nsec, t.st_birthtimespec.tv_nsec);
     # elif defined(__linux__)
       /* If statx() is supported, the birth time should be equal to the change time
        * because we just created the file. On older kernels, it's set to zero.
    @@ -1439,53 +1439,53 @@ TEST_IMPL(fs_fstat) {
     
       iov = uv_buf_init(test_buf, sizeof(test_buf));
       r = uv_fs_write(NULL, &req, file, &iov, 1, -1, NULL);
    -  ASSERT(r == sizeof(test_buf));
    -  ASSERT(req.result == sizeof(test_buf));
    +  ASSERT_EQ(r, sizeof(test_buf));
    +  ASSERT_EQ(req.result, sizeof(test_buf));
       uv_fs_req_cleanup(&req);
     
       memset(&req.statbuf, 0xaa, sizeof(req.statbuf));
       r = uv_fs_fstat(NULL, &req, file, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
       s = req.ptr;
    -  ASSERT(s->st_size == sizeof(test_buf));
    +  ASSERT_EQ(s->st_size, sizeof(test_buf));
     
     #ifndef _WIN32
       r = fstat(file, &t);
    -  ASSERT(r == 0);
    -
    -  ASSERT(s->st_dev == (uint64_t) t.st_dev);
    -  ASSERT(s->st_mode == (uint64_t) t.st_mode);
    -  ASSERT(s->st_nlink == (uint64_t) t.st_nlink);
    -  ASSERT(s->st_uid == (uint64_t) t.st_uid);
    -  ASSERT(s->st_gid == (uint64_t) t.st_gid);
    -  ASSERT(s->st_rdev == (uint64_t) t.st_rdev);
    -  ASSERT(s->st_ino == (uint64_t) t.st_ino);
    -  ASSERT(s->st_size == (uint64_t) t.st_size);
    -  ASSERT(s->st_blksize == (uint64_t) t.st_blksize);
    -  ASSERT(s->st_blocks == (uint64_t) t.st_blocks);
    +  ASSERT_OK(r);
    +
    +  ASSERT_EQ(s->st_dev, (uint64_t) t.st_dev);
    +  ASSERT_EQ(s->st_mode, (uint64_t) t.st_mode);
    +  ASSERT_EQ(s->st_nlink, (uint64_t) t.st_nlink);
    +  ASSERT_EQ(s->st_uid, (uint64_t) t.st_uid);
    +  ASSERT_EQ(s->st_gid, (uint64_t) t.st_gid);
    +  ASSERT_EQ(s->st_rdev, (uint64_t) t.st_rdev);
    +  ASSERT_EQ(s->st_ino, (uint64_t) t.st_ino);
    +  ASSERT_EQ(s->st_size, (uint64_t) t.st_size);
    +  ASSERT_EQ(s->st_blksize, (uint64_t) t.st_blksize);
    +  ASSERT_EQ(s->st_blocks, (uint64_t) t.st_blocks);
     #if defined(__APPLE__)
    -  ASSERT(s->st_atim.tv_sec == t.st_atimespec.tv_sec);
    -  ASSERT(s->st_atim.tv_nsec == t.st_atimespec.tv_nsec);
    -  ASSERT(s->st_mtim.tv_sec == t.st_mtimespec.tv_sec);
    -  ASSERT(s->st_mtim.tv_nsec == t.st_mtimespec.tv_nsec);
    -  ASSERT(s->st_ctim.tv_sec == t.st_ctimespec.tv_sec);
    -  ASSERT(s->st_ctim.tv_nsec == t.st_ctimespec.tv_nsec);
    +  ASSERT_EQ(s->st_atim.tv_sec, t.st_atimespec.tv_sec);
    +  ASSERT_EQ(s->st_atim.tv_nsec, t.st_atimespec.tv_nsec);
    +  ASSERT_EQ(s->st_mtim.tv_sec, t.st_mtimespec.tv_sec);
    +  ASSERT_EQ(s->st_mtim.tv_nsec, t.st_mtimespec.tv_nsec);
    +  ASSERT_EQ(s->st_ctim.tv_sec, t.st_ctimespec.tv_sec);
    +  ASSERT_EQ(s->st_ctim.tv_nsec, t.st_ctimespec.tv_nsec);
     #elif defined(_AIX)    || \
           defined(__MVS__)
    -  ASSERT(s->st_atim.tv_sec == t.st_atime);
    -  ASSERT(s->st_atim.tv_nsec == 0);
    -  ASSERT(s->st_mtim.tv_sec == t.st_mtime);
    -  ASSERT(s->st_mtim.tv_nsec == 0);
    -  ASSERT(s->st_ctim.tv_sec == t.st_ctime);
    -  ASSERT(s->st_ctim.tv_nsec == 0);
    +  ASSERT_EQ(s->st_atim.tv_sec, t.st_atime);
    +  ASSERT_OK(s->st_atim.tv_nsec);
    +  ASSERT_EQ(s->st_mtim.tv_sec, t.st_mtime);
    +  ASSERT_OK(s->st_mtim.tv_nsec);
    +  ASSERT_EQ(s->st_ctim.tv_sec, t.st_ctime);
    +  ASSERT_OK(s->st_ctim.tv_nsec);
     #elif defined(__ANDROID__)
    -  ASSERT(s->st_atim.tv_sec == t.st_atime);
    -  ASSERT(s->st_atim.tv_nsec == t.st_atimensec);
    -  ASSERT(s->st_mtim.tv_sec == t.st_mtime);
    -  ASSERT(s->st_mtim.tv_nsec == t.st_mtimensec);
    -  ASSERT(s->st_ctim.tv_sec == t.st_ctime);
    -  ASSERT(s->st_ctim.tv_nsec == t.st_ctimensec);
    +  ASSERT_EQ(s->st_atim.tv_sec, t.st_atime);
    +  ASSERT_EQ(s->st_atim.tv_nsec, t.st_atimensec);
    +  ASSERT_EQ(s->st_mtim.tv_sec, t.st_mtime);
    +  ASSERT_EQ(s->st_mtim.tv_nsec, t.st_mtimensec);
    +  ASSERT_EQ(s->st_ctim.tv_sec, t.st_ctime);
    +  ASSERT_EQ(s->st_ctim.tv_nsec, t.st_ctimensec);
     #elif defined(__sun)           || \
           defined(__DragonFly__)   || \
           defined(__FreeBSD__)     || \
    @@ -1496,47 +1496,47 @@ TEST_IMPL(fs_fstat) {
           defined(_SVID_SOURCE)    || \
           defined(_XOPEN_SOURCE)   || \
           defined(_DEFAULT_SOURCE)
    -  ASSERT(s->st_atim.tv_sec == t.st_atim.tv_sec);
    -  ASSERT(s->st_atim.tv_nsec == t.st_atim.tv_nsec);
    -  ASSERT(s->st_mtim.tv_sec == t.st_mtim.tv_sec);
    -  ASSERT(s->st_mtim.tv_nsec == t.st_mtim.tv_nsec);
    -  ASSERT(s->st_ctim.tv_sec == t.st_ctim.tv_sec);
    -  ASSERT(s->st_ctim.tv_nsec == t.st_ctim.tv_nsec);
    +  ASSERT_EQ(s->st_atim.tv_sec, t.st_atim.tv_sec);
    +  ASSERT_EQ(s->st_atim.tv_nsec, t.st_atim.tv_nsec);
    +  ASSERT_EQ(s->st_mtim.tv_sec, t.st_mtim.tv_sec);
    +  ASSERT_EQ(s->st_mtim.tv_nsec, t.st_mtim.tv_nsec);
    +  ASSERT_EQ(s->st_ctim.tv_sec, t.st_ctim.tv_sec);
    +  ASSERT_EQ(s->st_ctim.tv_nsec, t.st_ctim.tv_nsec);
     # if defined(__FreeBSD__)    || \
          defined(__NetBSD__)
    -  ASSERT(s->st_birthtim.tv_sec == t.st_birthtim.tv_sec);
    -  ASSERT(s->st_birthtim.tv_nsec == t.st_birthtim.tv_nsec);
    +  ASSERT_EQ(s->st_birthtim.tv_sec, t.st_birthtim.tv_sec);
    +  ASSERT_EQ(s->st_birthtim.tv_nsec, t.st_birthtim.tv_nsec);
     # endif
     #else
    -  ASSERT(s->st_atim.tv_sec == t.st_atime);
    -  ASSERT(s->st_atim.tv_nsec == 0);
    -  ASSERT(s->st_mtim.tv_sec == t.st_mtime);
    -  ASSERT(s->st_mtim.tv_nsec == 0);
    -  ASSERT(s->st_ctim.tv_sec == t.st_ctime);
    -  ASSERT(s->st_ctim.tv_nsec == 0);
    +  ASSERT_EQ(s->st_atim.tv_sec, t.st_atime);
    +  ASSERT_OK(s->st_atim.tv_nsec);
    +  ASSERT_EQ(s->st_mtim.tv_sec, t.st_mtime);
    +  ASSERT_OK(s->st_mtim.tv_nsec);
    +  ASSERT_EQ(s->st_ctim.tv_sec, t.st_ctime);
    +  ASSERT_OK(s->st_ctim.tv_nsec);
     #endif
     #endif
     
     #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__)
    -  ASSERT(s->st_flags == t.st_flags);
    -  ASSERT(s->st_gen == t.st_gen);
    +  ASSERT_EQ(s->st_flags, t.st_flags);
    +  ASSERT_EQ(s->st_gen, t.st_gen);
     #else
    -  ASSERT(s->st_flags == 0);
    -  ASSERT(s->st_gen == 0);
    +  ASSERT_OK(s->st_flags);
    +  ASSERT_OK(s->st_gen);
     #endif
     
       uv_fs_req_cleanup(&req);
     
       /* Now do the uv_fs_fstat call asynchronously */
       r = uv_fs_fstat(loop, &req, file, fstat_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(fstat_cb_count == 1);
    +  ASSERT_EQ(1, fstat_cb_count);
     
     
       r = uv_fs_close(NULL, &req, file, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
       uv_fs_req_cleanup(&req);
     
       /*
    @@ -1564,8 +1564,8 @@ TEST_IMPL(fs_fstat_stdio) {
     
       for (fd = 0; fd <= 2; ++fd) {
         res = uv_fs_fstat(NULL, &req, fd, NULL);
    -    ASSERT(res == 0);
    -    ASSERT(req.result == 0);
    +    ASSERT_OK(res);
    +    ASSERT_OK(req.result);
     
     #ifdef _WIN32
         st = req.ptr;
    @@ -1573,9 +1573,11 @@ TEST_IMPL(fs_fstat_stdio) {
         switch (ft) {
         case UV_TTY:
         case UV_NAMED_PIPE:
    -      ASSERT(st->st_mode == (ft == UV_TTY ? S_IFCHR : S_IFIFO));
    -      ASSERT(st->st_nlink == 1);
    -      ASSERT(st->st_rdev == (ft == UV_TTY ? FILE_DEVICE_CONSOLE : FILE_DEVICE_NAMED_PIPE) << 16);
    +      ASSERT_EQ(st->st_mode, (ft == UV_TTY ? S_IFCHR : S_IFIFO));
    +      ASSERT_EQ(1, st->st_nlink);
    +      ASSERT_EQ(st->st_rdev,
    +                (ft == UV_TTY ? FILE_DEVICE_CONSOLE : FILE_DEVICE_NAMED_PIPE)
    +                << 16);
           break;
         default:
           break;
    @@ -1603,52 +1605,52 @@ TEST_IMPL(fs_access) {
     
       /* File should not exist */
       r = uv_fs_access(NULL, &req, "test_file", F_OK, NULL);
    -  ASSERT(r < 0);
    -  ASSERT(req.result < 0);
    +  ASSERT_LT(r, 0);
    +  ASSERT_LT(req.result, 0);
       uv_fs_req_cleanup(&req);
     
       /* File should not exist */
       r = uv_fs_access(loop, &req, "test_file", F_OK, access_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(access_cb_count == 1);
    +  ASSERT_EQ(1, access_cb_count);
       access_cb_count = 0; /* reset for the next test */
     
       /* Create file */
       r = uv_fs_open(NULL, &req, "test_file", O_RDWR | O_CREAT,
                      S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(req.result, 0);
       file = req.result;
       uv_fs_req_cleanup(&req);
     
       /* File should exist */
       r = uv_fs_access(NULL, &req, "test_file", F_OK, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
       uv_fs_req_cleanup(&req);
     
       /* File should exist */
       r = uv_fs_access(loop, &req, "test_file", F_OK, access_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(access_cb_count == 1);
    +  ASSERT_EQ(1, access_cb_count);
       access_cb_count = 0; /* reset for the next test */
     
       /* Close file */
       r = uv_fs_close(NULL, &req, file, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
       uv_fs_req_cleanup(&req);
     
       /* Directory access */
       r = uv_fs_mkdir(NULL, &req, "test_dir", 0777, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&req);
     
       r = uv_fs_access(NULL, &req, "test_dir", W_OK, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
       uv_fs_req_cleanup(&req);
     
       /*
    @@ -1678,22 +1680,22 @@ TEST_IMPL(fs_chmod) {
     
       r = uv_fs_open(NULL, &req, "test_file", O_RDWR | O_CREAT,
           S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(req.result, 0);
       file = req.result;
       uv_fs_req_cleanup(&req);
     
       iov = uv_buf_init(test_buf, sizeof(test_buf));
       r = uv_fs_write(NULL, &req, file, &iov, 1, -1, NULL);
    -  ASSERT(r == sizeof(test_buf));
    -  ASSERT(req.result == sizeof(test_buf));
    +  ASSERT_EQ(r, sizeof(test_buf));
    +  ASSERT_EQ(req.result, sizeof(test_buf));
       uv_fs_req_cleanup(&req);
     
     #ifndef _WIN32
       /* Make the file write-only */
       r = uv_fs_chmod(NULL, &req, "test_file", 0200, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
       uv_fs_req_cleanup(&req);
     
       check_permission("test_file", 0200);
    @@ -1701,16 +1703,16 @@ TEST_IMPL(fs_chmod) {
     
       /* Make the file read-only */
       r = uv_fs_chmod(NULL, &req, "test_file", 0400, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
       uv_fs_req_cleanup(&req);
     
       check_permission("test_file", 0400);
     
       /* Make the file read+write with sync uv_fs_fchmod */
       r = uv_fs_fchmod(NULL, &req, file, 0600, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
       uv_fs_req_cleanup(&req);
     
       check_permission("test_file", 0600);
    @@ -1722,9 +1724,9 @@ TEST_IMPL(fs_chmod) {
         req.data = &mode;
       }
       r = uv_fs_chmod(loop, &req, "test_file", 0200, chmod_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(chmod_cb_count == 1);
    +  ASSERT_EQ(1, chmod_cb_count);
       chmod_cb_count = 0; /* reset for the next test */
     #endif
     
    @@ -1734,9 +1736,9 @@ TEST_IMPL(fs_chmod) {
         req.data = &mode;
       }
       r = uv_fs_chmod(loop, &req, "test_file", 0400, chmod_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(chmod_cb_count == 1);
    +  ASSERT_EQ(1, chmod_cb_count);
     
       /* async fchmod */
       {
    @@ -1744,9 +1746,9 @@ TEST_IMPL(fs_chmod) {
         req.data = &mode;
       }
       r = uv_fs_fchmod(loop, &req, file, 0600, fchmod_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(fchmod_cb_count == 1);
    +  ASSERT_EQ(1, fchmod_cb_count);
     
       uv_fs_close(loop, &req, file, NULL);
     
    @@ -1780,31 +1782,31 @@ TEST_IMPL(fs_unlink_readonly) {
                      O_RDWR | O_CREAT,
                      S_IWUSR | S_IRUSR,
                      NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(req.result, 0);
       file = req.result;
       uv_fs_req_cleanup(&req);
     
       iov = uv_buf_init(test_buf, sizeof(test_buf));
       r = uv_fs_write(NULL, &req, file, &iov, 1, -1, NULL);
    -  ASSERT(r == sizeof(test_buf));
    -  ASSERT(req.result == sizeof(test_buf));
    +  ASSERT_EQ(r, sizeof(test_buf));
    +  ASSERT_EQ(req.result, sizeof(test_buf));
       uv_fs_req_cleanup(&req);
     
       uv_fs_close(loop, &req, file, NULL);
     
       /* Make the file read-only */
       r = uv_fs_chmod(NULL, &req, "test_file", 0400, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
       uv_fs_req_cleanup(&req);
     
       check_permission("test_file", 0400);
     
       /* Try to unlink the file */
       r = uv_fs_unlink(NULL, &req, "test_file", NULL);
    -  ASSERT(r == 0);
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
       uv_fs_req_cleanup(&req);
     
       /*
    @@ -1839,30 +1841,30 @@ TEST_IMPL(fs_unlink_archive_readonly) {
                      O_RDWR | O_CREAT,
                      S_IWUSR | S_IRUSR,
                      NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(req.result, 0);
       file = req.result;
       uv_fs_req_cleanup(&req);
     
       iov = uv_buf_init(test_buf, sizeof(test_buf));
       r = uv_fs_write(NULL, &req, file, &iov, 1, -1, NULL);
    -  ASSERT(r == sizeof(test_buf));
    -  ASSERT(req.result == sizeof(test_buf));
    +  ASSERT_EQ(r, sizeof(test_buf));
    +  ASSERT_EQ(req.result, sizeof(test_buf));
       uv_fs_req_cleanup(&req);
     
       uv_fs_close(loop, &req, file, NULL);
     
       /* Make the file read-only and clear archive flag */
       r = SetFileAttributes("test_file", FILE_ATTRIBUTE_READONLY);
    -  ASSERT(r != 0);
    +  ASSERT(r);
       uv_fs_req_cleanup(&req);
     
       check_permission("test_file", 0400);
     
       /* Try to unlink the file */
       r = uv_fs_unlink(NULL, &req, "test_file", NULL);
    -  ASSERT(r == 0);
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
       uv_fs_req_cleanup(&req);
     
       /*
    @@ -1894,69 +1896,69 @@ TEST_IMPL(fs_chown) {
     
       r = uv_fs_open(NULL, &req, "test_file", O_RDWR | O_CREAT,
           S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(req.result, 0);
       file = req.result;
       uv_fs_req_cleanup(&req);
     
       /* sync chown */
       r = uv_fs_chown(NULL, &req, "test_file", -1, -1, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
       uv_fs_req_cleanup(&req);
     
       /* sync fchown */
       r = uv_fs_fchown(NULL, &req, file, -1, -1, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
       uv_fs_req_cleanup(&req);
     
       /* async chown */
       r = uv_fs_chown(loop, &req, "test_file", -1, -1, chown_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(chown_cb_count == 1);
    +  ASSERT_EQ(1, chown_cb_count);
     
     #ifndef __MVS__
       /* chown to root (fail) */
       chown_cb_count = 0;
       r = uv_fs_chown(loop, &req, "test_file", 0, 0, chown_root_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(chown_cb_count == 1);
    +  ASSERT_EQ(1, chown_cb_count);
     #endif
     
       /* async fchown */
       r = uv_fs_fchown(loop, &req, file, -1, -1, fchown_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(fchown_cb_count == 1);
    +  ASSERT_EQ(1, fchown_cb_count);
     
     #ifndef __HAIKU__
       /* Haiku doesn't support hardlink */
       /* sync link */
       r = uv_fs_link(NULL, &req, "test_file", "test_file_link", NULL);
    -  ASSERT(r == 0);
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
       uv_fs_req_cleanup(&req);
     
       /* sync lchown */
       r = uv_fs_lchown(NULL, &req, "test_file_link", -1, -1, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
       uv_fs_req_cleanup(&req);
     
       /* async lchown */
       r = uv_fs_lchown(loop, &req, "test_file_link", -1, -1, lchown_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(lchown_cb_count == 1);
    +  ASSERT_EQ(1, lchown_cb_count);
     #endif
     
       /* Close file */
       r = uv_fs_close(NULL, &req, file, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
       uv_fs_req_cleanup(&req);
     
       /*
    @@ -1989,58 +1991,58 @@ TEST_IMPL(fs_link) {
     
       r = uv_fs_open(NULL, &req, "test_file", O_RDWR | O_CREAT,
           S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(req.result, 0);
       file = req.result;
       uv_fs_req_cleanup(&req);
     
       iov = uv_buf_init(test_buf, sizeof(test_buf));
       r = uv_fs_write(NULL, &req, file, &iov, 1, -1, NULL);
    -  ASSERT(r == sizeof(test_buf));
    -  ASSERT(req.result == sizeof(test_buf));
    +  ASSERT_EQ(r, sizeof(test_buf));
    +  ASSERT_EQ(req.result, sizeof(test_buf));
       uv_fs_req_cleanup(&req);
     
       uv_fs_close(loop, &req, file, NULL);
     
       /* sync link */
       r = uv_fs_link(NULL, &req, "test_file", "test_file_link", NULL);
    -  ASSERT(r == 0);
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
       uv_fs_req_cleanup(&req);
     
       r = uv_fs_open(NULL, &req, "test_file_link", O_RDWR, 0, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(req.result, 0);
       link = req.result;
       uv_fs_req_cleanup(&req);
     
       memset(buf, 0, sizeof(buf));
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL, &req, link, &iov, 1, 0, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(req.result >= 0);
    -  ASSERT(strcmp(buf, test_buf) == 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(req.result, 0);
    +  ASSERT_OK(strcmp(buf, test_buf));
     
       close(link);
     
       /* async link */
       r = uv_fs_link(loop, &req, "test_file", "test_file_link2", link_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(link_cb_count == 1);
    +  ASSERT_EQ(1, link_cb_count);
     
       r = uv_fs_open(NULL, &req, "test_file_link2", O_RDWR, 0, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(req.result, 0);
       link = req.result;
       uv_fs_req_cleanup(&req);
     
       memset(buf, 0, sizeof(buf));
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL, &req, link, &iov, 1, 0, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(req.result >= 0);
    -  ASSERT(strcmp(buf, test_buf) == 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(req.result, 0);
    +  ASSERT_OK(strcmp(buf, test_buf));
     
       uv_fs_close(loop, &req, link, NULL);
     
    @@ -2066,16 +2068,16 @@ TEST_IMPL(fs_readlink) {
         uv_fs_t req;
     
         loop = uv_default_loop();
    -    ASSERT(0 == uv_fs_readlink(loop, &req, "no_such_file", dummy_cb));
    -    ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -    ASSERT(dummy_cb_count == 1);
    +    ASSERT_OK(uv_fs_readlink(loop, &req, "no_such_file", dummy_cb));
    +    ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +    ASSERT_EQ(1, dummy_cb_count);
         ASSERT_NULL(req.ptr);
    -    ASSERT(req.result == UV_ENOENT);
    +    ASSERT_EQ(req.result, UV_ENOENT);
         uv_fs_req_cleanup(&req);
     
    -    ASSERT(UV_ENOENT == uv_fs_readlink(NULL, &req, "no_such_file", NULL));
    +    ASSERT_EQ(UV_ENOENT, uv_fs_readlink(NULL, &req, "no_such_file", NULL));
         ASSERT_NULL(req.ptr);
    -    ASSERT(req.result == UV_ENOENT);
    +    ASSERT_EQ(req.result, UV_ENOENT);
         uv_fs_req_cleanup(&req);
       }
     
    @@ -2096,8 +2098,8 @@ TEST_IMPL(fs_readlink) {
         uv_fs_req_cleanup(&req);
     
         r = uv_fs_close(NULL, &req, file, NULL);
    -    ASSERT_EQ(r, 0);
    -    ASSERT_EQ(req.result, 0);
    +    ASSERT_OK(r);
    +    ASSERT_OK(req.result);
         uv_fs_req_cleanup(&req);
     
         /* Test */
    @@ -2118,16 +2120,16 @@ TEST_IMPL(fs_realpath) {
       uv_fs_t req;
     
       loop = uv_default_loop();
    -  ASSERT(0 == uv_fs_realpath(loop, &req, "no_such_file", dummy_cb));
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -  ASSERT(dummy_cb_count == 1);
    +  ASSERT_OK(uv_fs_realpath(loop, &req, "no_such_file", dummy_cb));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(1, dummy_cb_count);
       ASSERT_NULL(req.ptr);
    -  ASSERT(req.result == UV_ENOENT);
    +  ASSERT_EQ(req.result, UV_ENOENT);
       uv_fs_req_cleanup(&req);
     
    -  ASSERT(UV_ENOENT == uv_fs_realpath(NULL, &req, "no_such_file", NULL));
    +  ASSERT_EQ(UV_ENOENT, uv_fs_realpath(NULL, &req, "no_such_file", NULL));
       ASSERT_NULL(req.ptr);
    -  ASSERT(req.result == UV_ENOENT);
    +  ASSERT_EQ(req.result, UV_ENOENT);
       uv_fs_req_cleanup(&req);
     
       MAKE_VALGRIND_HAPPY(loop);
    @@ -2162,15 +2164,15 @@ TEST_IMPL(fs_symlink) {
     
       r = uv_fs_open(NULL, &req, "test_file", O_RDWR | O_CREAT,
           S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(req.result, 0);
       file = req.result;
       uv_fs_req_cleanup(&req);
     
       iov = uv_buf_init(test_buf, sizeof(test_buf));
       r = uv_fs_write(NULL, &req, file, &iov, 1, -1, NULL);
    -  ASSERT(r == sizeof(test_buf));
    -  ASSERT(req.result == sizeof(test_buf));
    +  ASSERT_EQ(r, sizeof(test_buf));
    +  ASSERT_EQ(req.result, sizeof(test_buf));
       uv_fs_req_cleanup(&req);
     
       uv_fs_close(loop, &req, file, NULL);
    @@ -2194,22 +2196,22 @@ TEST_IMPL(fs_symlink) {
         }
       }
     #endif
    -  ASSERT(r == 0);
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
       uv_fs_req_cleanup(&req);
     
       r = uv_fs_open(NULL, &req, "test_file_symlink", O_RDWR, 0, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(req.result, 0);
       link = req.result;
       uv_fs_req_cleanup(&req);
     
       memset(buf, 0, sizeof(buf));
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL, &req, link, &iov, 1, 0, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(req.result >= 0);
    -  ASSERT(strcmp(buf, test_buf) == 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(req.result, 0);
    +  ASSERT_OK(strcmp(buf, test_buf));
     
       uv_fs_close(loop, &req, link, NULL);
     
    @@ -2219,7 +2221,7 @@ TEST_IMPL(fs_symlink) {
                         "test_file_symlink_symlink",
                         0,
                         NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&req);
     
     #if defined(__MSYS__)
    @@ -2227,16 +2229,16 @@ TEST_IMPL(fs_symlink) {
     #endif
     
       r = uv_fs_readlink(NULL, &req, "test_file_symlink_symlink", NULL);
    -  ASSERT(r == 0);
    -  ASSERT(strcmp(req.ptr, "test_file_symlink") == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(strcmp(req.ptr, "test_file_symlink"));
       uv_fs_req_cleanup(&req);
     
       r = uv_fs_realpath(NULL, &req, "test_file_symlink_symlink", NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     #ifdef _WIN32
    -  ASSERT(stricmp(req.ptr, test_file_abs_buf) == 0);
    +  ASSERT_OK(stricmp(req.ptr, test_file_abs_buf));
     #else
    -  ASSERT(strcmp(req.ptr, test_file_abs_buf) == 0);
    +  ASSERT_OK(strcmp(req.ptr, test_file_abs_buf));
     #endif
       uv_fs_req_cleanup(&req);
     
    @@ -2247,22 +2249,22 @@ TEST_IMPL(fs_symlink) {
                         "test_file_symlink2",
                         0,
                         symlink_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(symlink_cb_count == 1);
    +  ASSERT_EQ(1, symlink_cb_count);
     
       r = uv_fs_open(NULL, &req, "test_file_symlink2", O_RDWR, 0, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(req.result, 0);
       link = req.result;
       uv_fs_req_cleanup(&req);
     
       memset(buf, 0, sizeof(buf));
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL, &req, link, &iov, 1, 0, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(req.result >= 0);
    -  ASSERT(strcmp(buf, test_buf) == 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(req.result, 0);
    +  ASSERT_OK(strcmp(buf, test_buf));
     
       uv_fs_close(loop, &req, link, NULL);
     
    @@ -2272,18 +2274,18 @@ TEST_IMPL(fs_symlink) {
                         "test_file_symlink2_symlink",
                         0,
                         NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&req);
     
       r = uv_fs_readlink(loop, &req, "test_file_symlink2_symlink", readlink_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(readlink_cb_count == 1);
    +  ASSERT_EQ(1, readlink_cb_count);
     
       r = uv_fs_realpath(loop, &req, "test_file", realpath_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(realpath_cb_count == 1);
    +  ASSERT_EQ(1, realpath_cb_count);
     
       /*
        * Run the loop just to check we don't have make any extraneous uv_ref()
    @@ -2344,71 +2346,71 @@ int test_symlink_dir_impl(int type) {
                     "creation of directory symlinks");
       }
       fprintf(stderr, "r == %i\n", r);
    -  ASSERT(r == 0);
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
       uv_fs_req_cleanup(&req);
     
       r = uv_fs_stat(NULL, &req, "test_dir_symlink", NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       ASSERT(((uv_stat_t*)req.ptr)->st_mode & S_IFDIR);
       uv_fs_req_cleanup(&req);
     
       r = uv_fs_lstat(NULL, &req, "test_dir_symlink", NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     #if defined(__MSYS__)
       RETURN_SKIP("symlink reading is not supported on MSYS2");
     #endif
       ASSERT(((uv_stat_t*)req.ptr)->st_mode & S_IFLNK);
     #ifdef _WIN32
    -  ASSERT(((uv_stat_t*)req.ptr)->st_size == strlen(test_dir + 4));
    +  ASSERT_EQ(((uv_stat_t*)req.ptr)->st_size, strlen(test_dir + 4));
     #else
     # ifdef __PASE__
       /* On IBMi PASE, st_size returns the length of the symlink itself. */
    -  ASSERT(((uv_stat_t*)req.ptr)->st_size == strlen("test_dir_symlink"));
    +  ASSERT_EQ(((uv_stat_t*)req.ptr)->st_size, strlen("test_dir_symlink"));
     # else
    -  ASSERT(((uv_stat_t*)req.ptr)->st_size == strlen(test_dir));
    +  ASSERT_EQ(((uv_stat_t*)req.ptr)->st_size, strlen(test_dir));
     # endif
     #endif
       uv_fs_req_cleanup(&req);
     
       r = uv_fs_readlink(NULL, &req, "test_dir_symlink", NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     #ifdef _WIN32
    -  ASSERT(strcmp(req.ptr, test_dir + 4) == 0);
    +  ASSERT_OK(strcmp(req.ptr, test_dir + 4));
     #else
    -  ASSERT(strcmp(req.ptr, test_dir) == 0);
    +  ASSERT_OK(strcmp(req.ptr, test_dir));
     #endif
       uv_fs_req_cleanup(&req);
     
       r = uv_fs_realpath(NULL, &req, "test_dir_symlink", NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     #ifdef _WIN32
    -  ASSERT(strlen(req.ptr) == test_dir_abs_size - 5);
    -  ASSERT(strnicmp(req.ptr, test_dir + 4, test_dir_abs_size - 5) == 0);
    +  ASSERT_EQ(strlen(req.ptr), test_dir_abs_size - 5);
    +  ASSERT_OK(strnicmp(req.ptr, test_dir + 4, test_dir_abs_size - 5));
     #else
    -  ASSERT(strcmp(req.ptr, test_dir_abs_buf) == 0);
    +  ASSERT_OK(strcmp(req.ptr, test_dir_abs_buf));
     #endif
       uv_fs_req_cleanup(&req);
     
       r = uv_fs_open(NULL, &open_req1, "test_dir/file1", O_WRONLY | O_CREAT,
           S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    +  ASSERT_GE(r, 0);
       uv_fs_req_cleanup(&open_req1);
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&close_req);
     
       r = uv_fs_open(NULL, &open_req1, "test_dir/file2", O_WRONLY | O_CREAT,
           S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    +  ASSERT_GE(r, 0);
       uv_fs_req_cleanup(&open_req1);
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&close_req);
     
       r = uv_fs_scandir(NULL, &scandir_req, "test_dir_symlink", 0, NULL);
    -  ASSERT(r == 2);
    -  ASSERT(scandir_req.result == 2);
    +  ASSERT_EQ(2, r);
    +  ASSERT_EQ(2, scandir_req.result);
       ASSERT(scandir_req.ptr);
       while (UV_EOF != uv_fs_scandir_next(&scandir_req, &dent)) {
         ASSERT(strcmp(dent.name, "file1") == 0 || strcmp(dent.name, "file2") == 0);
    @@ -2419,16 +2421,16 @@ int test_symlink_dir_impl(int type) {
     
       /* unlink will remove the directory symlink */
       r = uv_fs_unlink(NULL, &req, "test_dir_symlink", NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&req);
     
       r = uv_fs_scandir(NULL, &scandir_req, "test_dir_symlink", 0, NULL);
    -  ASSERT(r == UV_ENOENT);
    +  ASSERT_EQ(r, UV_ENOENT);
       uv_fs_req_cleanup(&scandir_req);
     
       r = uv_fs_scandir(NULL, &scandir_req, "test_dir", 0, NULL);
    -  ASSERT(r == 2);
    -  ASSERT(scandir_req.result == 2);
    +  ASSERT_EQ(2, r);
    +  ASSERT_EQ(2, scandir_req.result);
       ASSERT(scandir_req.ptr);
       while (UV_EOF != uv_fs_scandir_next(&scandir_req, &dent)) {
         ASSERT(strcmp(dent.name, "file1") == 0 || strcmp(dent.name, "file2") == 0);
    @@ -2481,7 +2483,7 @@ TEST_IMPL(fs_non_symlink_reparse_point) {
                                FILE_FLAG_OPEN_REPARSE_POINT |
                                  FILE_FLAG_BACKUP_SEMANTICS,
                                NULL);
    -  ASSERT(file_handle != INVALID_HANDLE_VALUE);
    +  ASSERT_PTR_NE(file_handle, INVALID_HANDLE_VALUE);
     
       memset(&reparse_buffer, 0, REPARSE_GUID_DATA_BUFFER_HEADER_SIZE);
       reparse_buffer.ReparseTag = REPARSE_TAG;
    @@ -2496,7 +2498,7 @@ TEST_IMPL(fs_non_symlink_reparse_point) {
                           0,
                           &bytes_returned,
                           NULL);
    -  ASSERT(r != 0);
    +  ASSERT(r);
     
       CloseHandle(file_handle);
     
    @@ -2510,11 +2512,11 @@ TEST_IMPL(fs_non_symlink_reparse_point) {
       shared via SMB as "Macintosh HD".
     
       r = uv_fs_stat(NULL, &req, "\\\\\\Macintosh HD\\.DS_Store", NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&req);
     
       r = uv_fs_lstat(NULL, &req, "\\\\\\Macintosh HD\\.DS_Store", NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&req);
     */
     
    @@ -2525,25 +2527,25 @@ TEST_IMPL(fs_non_symlink_reparse_point) {
       the scope of this test.
     
       r = uv_fs_stat(NULL, &req, "test_dir/test_file", NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&req);
     
       r = uv_fs_lstat(NULL, &req, "test_dir/test_file", NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&req);
     */
     
       r = uv_fs_scandir(NULL, &scandir_req, "test_dir", 0, NULL);
    -  ASSERT(r == 1);
    -  ASSERT(scandir_req.result == 1);
    +  ASSERT_EQ(1, r);
    +  ASSERT_EQ(1, scandir_req.result);
       ASSERT(scandir_req.ptr);
       while (UV_EOF != uv_fs_scandir_next(&scandir_req, &dent)) {
    -    ASSERT(strcmp(dent.name, "test_file") == 0);
    +    ASSERT_OK(strcmp(dent.name, "test_file"));
         /* uv_fs_scandir incorrectly identifies non-symlink reparse points
            as links because it doesn't open the file and verify the reparse
            point tag. The PowerShell Get-ChildItem command shares this
            behavior, so it's reasonable to leave it as is. */
    -    ASSERT(dent.type == UV_DIRENT_LINK);
    +    ASSERT_EQ(dent.type, UV_DIRENT_LINK);
       }
       uv_fs_req_cleanup(&scandir_req);
       ASSERT(!scandir_req.ptr);
    @@ -2575,7 +2577,7 @@ TEST_IMPL(fs_lstat_windows_store_apps) {
         MAKE_VALGRIND_HAPPY(loop);
         return TEST_SKIP;
       }
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
       r = snprintf(windowsapps_path,
                   sizeof(localappdata),
                   "%s\\Microsoft\\WindowsApps",
    @@ -2601,7 +2603,7 @@ TEST_IMPL(fs_lstat_windows_store_apps) {
                      dirent.name) < 0) {
           continue;
         }
    -    ASSERT_EQ(uv_fs_lstat(loop, &stat_req, file_path, NULL), 0);
    +    ASSERT_OK(uv_fs_lstat(loop, &stat_req, file_path, NULL));
       }
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -2621,16 +2623,16 @@ TEST_IMPL(fs_utime) {
       loop = uv_default_loop();
       unlink(path);
       r = uv_fs_open(NULL, &req, path, O_RDWR | O_CREAT, S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(req.result, 0);
       uv_fs_req_cleanup(&req);
       uv_fs_close(loop, &req, r, NULL);
     
       atime = mtime = 400497753.25; /* 1982-09-10 11:22:33.25 */
     
       r = uv_fs_utime(NULL, &req, path, atime, mtime, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
       uv_fs_req_cleanup(&req);
     
       check_utime(path, atime, mtime, /* test_lutime */ 0);
    @@ -2643,9 +2645,9 @@ TEST_IMPL(fs_utime) {
       /* async utime */
       utime_req.data = &checkme;
       r = uv_fs_utime(loop, &utime_req, path, atime, mtime, utime_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(utime_cb_count == 1);
    +  ASSERT_EQ(1, utime_cb_count);
     
       /* Cleanup. */
       unlink(path);
    @@ -2668,7 +2670,7 @@ TEST_IMPL(fs_utime_round) {
       ASSERT_GE(r, 0);
       ASSERT_GE(req.result, 0);
       uv_fs_req_cleanup(&req);
    -  ASSERT_EQ(0, uv_fs_close(loop, &req, r, NULL));
    +  ASSERT_OK(uv_fs_close(loop, &req, r, NULL));
     
       atime = mtime = -14245440.25;  /* 1969-07-20T02:56:00.25Z */
     
    @@ -2683,8 +2685,8 @@ TEST_IMPL(fs_utime_round) {
         RETURN_SKIP("utime on some OS (z/OS, IBM i PASE, AIX) or filesystems may reject pre-epoch timestamps");
       }
     #endif
    -  ASSERT_EQ(0, r);
    -  ASSERT_EQ(0, req.result);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
       uv_fs_req_cleanup(&req);
       check_utime(path, atime, mtime, /* test_lutime */ 0);
       unlink(path);
    @@ -2699,26 +2701,26 @@ TEST_IMPL(fs_stat_root) {
       int r;
     
       r = uv_fs_stat(NULL, &stat_req, "\\", NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_fs_stat(NULL, &stat_req, "..\\..\\..\\..\\..\\..\\..", NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_fs_stat(NULL, &stat_req, "..", NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_fs_stat(NULL, &stat_req, "..\\", NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* stats the current directory on c: */
       r = uv_fs_stat(NULL, &stat_req, "c:", NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_fs_stat(NULL, &stat_req, "c:\\", NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_fs_stat(NULL, &stat_req, "\\\\?\\C:\\", NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -2742,26 +2744,26 @@ TEST_IMPL(fs_futime) {
       loop = uv_default_loop();
       unlink(path);
       r = uv_fs_open(NULL, &req, path, O_RDWR | O_CREAT, S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(req.result, 0);
       uv_fs_req_cleanup(&req);
       uv_fs_close(loop, &req, r, NULL);
     
       atime = mtime = 400497753.25; /* 1982-09-10 11:22:33.25 */
     
       r = uv_fs_open(NULL, &req, path, O_RDWR, 0, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(req.result, 0);
       file = req.result; /* FIXME probably not how it's supposed to be used */
       uv_fs_req_cleanup(&req);
     
       r = uv_fs_futime(NULL, &req, file, atime, mtime, NULL);
     #if defined(__CYGWIN__) || defined(__MSYS__)
    -  ASSERT(r == UV_ENOSYS);
    +  ASSERT_EQ(r, UV_ENOSYS);
       RETURN_SKIP("futime not supported on Cygwin");
     #else
    -  ASSERT(r == 0);
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
     #endif
       uv_fs_req_cleanup(&req);
     
    @@ -2776,9 +2778,9 @@ TEST_IMPL(fs_futime) {
       /* async futime */
       futime_req.data = &checkme;
       r = uv_fs_futime(loop, &futime_req, file, atime, mtime, futime_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(futime_cb_count == 1);
    +  ASSERT_EQ(1, futime_cb_count);
     
       /* Cleanup. */
       unlink(path);
    @@ -2819,8 +2821,8 @@ TEST_IMPL(fs_lutime) {
             "Symlink creation requires elevated console (with admin rights)");
       }
     #endif
    -  ASSERT_EQ(s, 0);
    -  ASSERT_EQ(req.result, 0);
    +  ASSERT_OK(s);
    +  ASSERT_OK(req.result);
       uv_fs_req_cleanup(&req);
     
       /* Test the synchronous version. */
    @@ -2837,9 +2839,9 @@ TEST_IMPL(fs_lutime) {
       ASSERT_EQ(r, UV_ENOSYS);
       RETURN_SKIP("lutime is not implemented for z/OS and AIX versions below 7.1");
     #endif
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
       lutime_cb(&req);
    -  ASSERT_EQ(lutime_cb_count, 1);
    +  ASSERT_EQ(1, lutime_cb_count);
     
       /* Test the asynchronous version. */
       atime = mtime = 1291404900; /* 2010-12-03 20:35:00 */
    @@ -2849,9 +2851,9 @@ TEST_IMPL(fs_lutime) {
       checkme.path = symlink_path;
     
       r = uv_fs_lutime(loop, &req, symlink_path, atime, mtime, lutime_cb);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT_EQ(lutime_cb_count, 2);
    +  ASSERT_EQ(2, lutime_cb_count);
     
       /* Cleanup. */
       unlink(path);
    @@ -2869,8 +2871,8 @@ TEST_IMPL(fs_stat_missing_path) {
       loop = uv_default_loop();
     
       r = uv_fs_stat(NULL, &req, "non_existent_file", NULL);
    -  ASSERT(r == UV_ENOENT);
    -  ASSERT(req.result == UV_ENOENT);
    +  ASSERT_EQ(r, UV_ENOENT);
    +  ASSERT_EQ(req.result, UV_ENOENT);
       uv_fs_req_cleanup(&req);
     
       MAKE_VALGRIND_HAPPY(loop);
    @@ -2894,18 +2896,18 @@ TEST_IMPL(fs_scandir_empty_dir) {
       memset(&req, 0xdb, sizeof(req));
     
       r = uv_fs_scandir(NULL, &req, path, 0, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(req.result);
       ASSERT_NULL(req.ptr);
    -  ASSERT(UV_EOF == uv_fs_scandir_next(&req, &dent));
    +  ASSERT_EQ(UV_EOF, uv_fs_scandir_next(&req, &dent));
       uv_fs_req_cleanup(&req);
     
       r = uv_fs_scandir(loop, &scandir_req, path, 0, empty_scandir_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(scandir_cb_count == 0);
    +  ASSERT_OK(scandir_cb_count);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(scandir_cb_count == 1);
    +  ASSERT_EQ(1, scandir_cb_count);
     
       uv_fs_rmdir(NULL, &req, path, NULL);
       uv_fs_req_cleanup(&req);
    @@ -2931,18 +2933,18 @@ TEST_IMPL(fs_scandir_non_existent_dir) {
       memset(&req, 0xdb, sizeof(req));
     
       r = uv_fs_scandir(NULL, &req, path, 0, NULL);
    -  ASSERT(r == UV_ENOENT);
    -  ASSERT(req.result == UV_ENOENT);
    +  ASSERT_EQ(r, UV_ENOENT);
    +  ASSERT_EQ(req.result, UV_ENOENT);
       ASSERT_NULL(req.ptr);
    -  ASSERT(UV_ENOENT == uv_fs_scandir_next(&req, &dent));
    +  ASSERT_EQ(UV_ENOENT, uv_fs_scandir_next(&req, &dent));
       uv_fs_req_cleanup(&req);
     
       r = uv_fs_scandir(loop, &scandir_req, path, 0, non_existent_scandir_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(scandir_cb_count == 0);
    +  ASSERT_OK(scandir_cb_count);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(scandir_cb_count == 1);
    +  ASSERT_EQ(1, scandir_cb_count);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -2956,15 +2958,15 @@ TEST_IMPL(fs_scandir_file) {
       loop = uv_default_loop();
     
       r = uv_fs_scandir(NULL, &scandir_req, path, 0, NULL);
    -  ASSERT(r == UV_ENOTDIR);
    +  ASSERT_EQ(r, UV_ENOTDIR);
       uv_fs_req_cleanup(&scandir_req);
     
       r = uv_fs_scandir(loop, &scandir_req, path, 0, file_scandir_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(scandir_cb_count == 0);
    +  ASSERT_OK(scandir_cb_count);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(scandir_cb_count == 1);
    +  ASSERT_EQ(1, scandir_cb_count);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -2998,21 +3000,21 @@ TEST_IMPL(fs_open_dir) {
       loop = uv_default_loop();
     
       r = uv_fs_open(NULL, &req, path, O_RDONLY, 0, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(req.result, 0);
       ASSERT_NULL(req.ptr);
       file = r;
       uv_fs_req_cleanup(&req);
     
       r = uv_fs_close(NULL, &req, file, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_fs_open(loop, &req, path, O_RDONLY, 0, open_cb_simple);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(open_cb_count == 0);
    +  ASSERT_OK(open_cb_count);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(open_cb_count == 1);
    +  ASSERT_EQ(1, open_cb_count);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -3029,57 +3031,57 @@ static void fs_file_open_append(int add_flags) {
     
       r = uv_fs_open(NULL, &open_req1, "test_file",
           O_WRONLY | O_CREAT | add_flags, S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
       iov = uv_buf_init(test_buf, sizeof(test_buf));
       r = uv_fs_write(NULL, &write_req, open_req1.result, &iov, 1, -1, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(write_req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(write_req.result, 0);
       uv_fs_req_cleanup(&write_req);
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       r = uv_fs_open(NULL, &open_req1, "test_file",
           O_RDWR | O_APPEND | add_flags, 0, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
       iov = uv_buf_init(test_buf, sizeof(test_buf));
       r = uv_fs_write(NULL, &write_req, open_req1.result, &iov, 1, -1, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(write_req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(write_req.result, 0);
       uv_fs_req_cleanup(&write_req);
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       r = uv_fs_open(NULL, &open_req1, "test_file", O_RDONLY | add_flags,
           S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL, &read_req, open_req1.result, &iov, 1, -1, NULL);
       printf("read = %d\n", r);
    -  ASSERT(r == 26);
    -  ASSERT(read_req.result == 26);
    -  ASSERT(memcmp(buf,
    -                "test-buffer\n\0test-buffer\n\0",
    -                sizeof("test-buffer\n\0test-buffer\n\0") - 1) == 0);
    +  ASSERT_EQ(26, r);
    +  ASSERT_EQ(26, read_req.result);
    +  ASSERT_OK(memcmp(buf,
    +                   "test-buffer\n\0test-buffer\n\0",
    +                   sizeof("test-buffer\n\0test-buffer\n\0") - 1));
       uv_fs_req_cleanup(&read_req);
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       /* Cleanup */
    @@ -3105,53 +3107,53 @@ TEST_IMPL(fs_rename_to_existing_file) {
     
       r = uv_fs_open(NULL, &open_req1, "test_file", O_WRONLY | O_CREAT,
           S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
       iov = uv_buf_init(test_buf, sizeof(test_buf));
       r = uv_fs_write(NULL, &write_req, open_req1.result, &iov, 1, -1, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(write_req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(write_req.result, 0);
       uv_fs_req_cleanup(&write_req);
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       r = uv_fs_open(NULL, &open_req1, "test_file2", O_WRONLY | O_CREAT,
           S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       r = uv_fs_rename(NULL, &rename_req, "test_file", "test_file2", NULL);
    -  ASSERT(r == 0);
    -  ASSERT(rename_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(rename_req.result);
       uv_fs_req_cleanup(&rename_req);
     
       r = uv_fs_open(NULL, &open_req1, "test_file2", O_RDONLY, 0, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
       memset(buf, 0, sizeof(buf));
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL, &read_req, open_req1.result, &iov, 1, -1, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(read_req.result >= 0);
    -  ASSERT(strcmp(buf, test_buf) == 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(read_req.result, 0);
    +  ASSERT_OK(strcmp(buf, test_buf));
       uv_fs_req_cleanup(&read_req);
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       /* Cleanup */
    @@ -3167,49 +3169,49 @@ static void fs_read_bufs(int add_flags) {
       char scratch[768];
       uv_buf_t bufs[4];
     
    -  ASSERT(0 <= uv_fs_open(NULL, &open_req1,
    -                         "test/fixtures/lorem_ipsum.txt",
    -                         O_RDONLY | add_flags, 0, NULL));
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_LE(0, uv_fs_open(NULL, &open_req1,
    +                          "test/fixtures/lorem_ipsum.txt",
    +                          O_RDONLY | add_flags, 0, NULL));
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
    -  ASSERT(UV_EINVAL == uv_fs_read(NULL, &read_req, open_req1.result,
    -                                 NULL, 0, 0, NULL));
    -  ASSERT(UV_EINVAL == uv_fs_read(NULL, &read_req, open_req1.result,
    -                                 NULL, 1, 0, NULL));
    -  ASSERT(UV_EINVAL == uv_fs_read(NULL, &read_req, open_req1.result,
    -                                 bufs, 0, 0, NULL));
    +  ASSERT_EQ(UV_EINVAL, uv_fs_read(NULL, &read_req, open_req1.result,
    +                                  NULL, 0, 0, NULL));
    +  ASSERT_EQ(UV_EINVAL, uv_fs_read(NULL, &read_req, open_req1.result,
    +                                  NULL, 1, 0, NULL));
    +  ASSERT_EQ(UV_EINVAL, uv_fs_read(NULL, &read_req, open_req1.result,
    +                                  bufs, 0, 0, NULL));
     
       bufs[0] = uv_buf_init(scratch + 0, 256);
       bufs[1] = uv_buf_init(scratch + 256, 256);
       bufs[2] = uv_buf_init(scratch + 512, 128);
       bufs[3] = uv_buf_init(scratch + 640, 128);
     
    -  ASSERT(446 == uv_fs_read(NULL,
    -                           &read_req,
    -                           open_req1.result,
    -                           bufs + 0,
    -                           2,  /* 2x 256 bytes. */
    -                           0,  /* Positional read. */
    -                           NULL));
    -  ASSERT(read_req.result == 446);
    +  ASSERT_EQ(446, uv_fs_read(NULL,
    +                            &read_req,
    +                            open_req1.result,
    +                            bufs + 0,
    +                            2,  /* 2x 256 bytes. */
    +                            0,  /* Positional read. */
    +                            NULL));
    +  ASSERT_EQ(446, read_req.result);
       uv_fs_req_cleanup(&read_req);
     
    -  ASSERT(190 == uv_fs_read(NULL,
    -                           &read_req,
    -                           open_req1.result,
    -                           bufs + 2,
    -                           2,  /* 2x 128 bytes. */
    -                           256,  /* Positional read. */
    -                           NULL));
    -  ASSERT(read_req.result == /* 446 - 256 */ 190);
    +  ASSERT_EQ(190, uv_fs_read(NULL,
    +                            &read_req,
    +                            open_req1.result,
    +                            bufs + 2,
    +                            2,  /* 2x 128 bytes. */
    +                            256,  /* Positional read. */
    +                            NULL));
    +  ASSERT_EQ(read_req.result, /* 446 - 256 */ 190);
       uv_fs_req_cleanup(&read_req);
     
    -  ASSERT(0 == memcmp(bufs[1].base + 0, bufs[2].base, 128));
    -  ASSERT(0 == memcmp(bufs[1].base + 128, bufs[3].base, 190 - 128));
    +  ASSERT_OK(memcmp(bufs[1].base + 0, bufs[2].base, 128));
    +  ASSERT_OK(memcmp(bufs[1].base + 128, bufs[3].base, 190 - 128));
     
    -  ASSERT(0 == uv_fs_close(NULL, &close_req, open_req1.result, NULL));
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(uv_fs_close(NULL, &close_req, open_req1.result, NULL));
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     }
     TEST_IMPL(fs_read_bufs) {
    @@ -3234,45 +3236,45 @@ static void fs_read_file_eof(int add_flags) {
     
       r = uv_fs_open(NULL, &open_req1, "test_file",
           O_WRONLY | O_CREAT | add_flags, S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
       iov = uv_buf_init(test_buf, sizeof(test_buf));
       r = uv_fs_write(NULL, &write_req, open_req1.result, &iov, 1, -1, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(write_req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(write_req.result, 0);
       uv_fs_req_cleanup(&write_req);
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       r = uv_fs_open(NULL, &open_req1, "test_file", O_RDONLY | add_flags, 0,
           NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
       memset(buf, 0, sizeof(buf));
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL, &read_req, open_req1.result, &iov, 1, -1, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(read_req.result >= 0);
    -  ASSERT(strcmp(buf, test_buf) == 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(read_req.result, 0);
    +  ASSERT_OK(strcmp(buf, test_buf));
       uv_fs_req_cleanup(&read_req);
     
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL, &read_req, open_req1.result, &iov, 1,
                      read_req.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(read_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(read_req.result);
       uv_fs_req_cleanup(&read_req);
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       /* Cleanup */
    @@ -3298,26 +3300,26 @@ static void fs_write_multiple_bufs(int add_flags) {
     
       r = uv_fs_open(NULL, &open_req1, "test_file",
           O_WRONLY | O_CREAT | add_flags, S_IWUSR | S_IRUSR, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
       iovs[0] = uv_buf_init(test_buf, sizeof(test_buf));
       iovs[1] = uv_buf_init(test_buf2, sizeof(test_buf2));
       r = uv_fs_write(NULL, &write_req, open_req1.result, iovs, 2, 0, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(write_req.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(write_req.result, 0);
       uv_fs_req_cleanup(&write_req);
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       r = uv_fs_open(NULL, &open_req1, "test_file", O_RDONLY | add_flags, 0,
           NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
       memset(buf, 0, sizeof(buf));
    @@ -3325,48 +3327,48 @@ static void fs_write_multiple_bufs(int add_flags) {
       /* Read the strings back to separate buffers. */
       iovs[0] = uv_buf_init(buf, sizeof(test_buf));
       iovs[1] = uv_buf_init(buf2, sizeof(test_buf2));
    -  ASSERT(lseek(open_req1.result, 0, SEEK_CUR) == 0);
    +  ASSERT_OK(lseek(open_req1.result, 0, SEEK_CUR));
       r = uv_fs_read(NULL, &read_req, open_req1.result, iovs, 2, -1, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(read_req.result == sizeof(test_buf) + sizeof(test_buf2));
    -  ASSERT(strcmp(buf, test_buf) == 0);
    -  ASSERT(strcmp(buf2, test_buf2) == 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_EQ(read_req.result, sizeof(test_buf) + sizeof(test_buf2));
    +  ASSERT_OK(strcmp(buf, test_buf));
    +  ASSERT_OK(strcmp(buf2, test_buf2));
       uv_fs_req_cleanup(&read_req);
     
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL, &read_req, open_req1.result, &iov, 1, -1, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(read_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(read_req.result);
       uv_fs_req_cleanup(&read_req);
     
       /* Read the strings back to separate buffers. */
       iovs[0] = uv_buf_init(buf, sizeof(test_buf));
       iovs[1] = uv_buf_init(buf2, sizeof(test_buf2));
       r = uv_fs_read(NULL, &read_req, open_req1.result, iovs, 2, 0, NULL);
    -  ASSERT(r >= 0);
    +  ASSERT_GE(r, 0);
       if (read_req.result == sizeof(test_buf)) {
         /* Infer that preadv is not available. */
         uv_fs_req_cleanup(&read_req);
         r = uv_fs_read(NULL, &read_req, open_req1.result, &iovs[1], 1, read_req.result, NULL);
    -    ASSERT(r >= 0);
    -    ASSERT(read_req.result == sizeof(test_buf2));
    +    ASSERT_GE(r, 0);
    +    ASSERT_EQ(read_req.result, sizeof(test_buf2));
       } else {
    -    ASSERT(read_req.result == sizeof(test_buf) + sizeof(test_buf2));
    +    ASSERT_EQ(read_req.result, sizeof(test_buf) + sizeof(test_buf2));
       }
    -  ASSERT(strcmp(buf, test_buf) == 0);
    -  ASSERT(strcmp(buf2, test_buf2) == 0);
    +  ASSERT_OK(strcmp(buf, test_buf));
    +  ASSERT_OK(strcmp(buf2, test_buf2));
       uv_fs_req_cleanup(&read_req);
     
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL, &read_req, open_req1.result, &iov, 1,
                      sizeof(test_buf) + sizeof(test_buf2), NULL);
    -  ASSERT(r == 0);
    -  ASSERT(read_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(read_req.result);
       uv_fs_req_cleanup(&read_req);
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       /* Cleanup */
    @@ -3406,8 +3408,8 @@ static void fs_write_alotof_bufs(int add_flags) {
                      O_RDWR | O_CREAT | add_flags,
                      S_IWUSR | S_IRUSR,
                      NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
       for (index = 0; index < iovcount; ++index)
    @@ -3420,8 +3422,8 @@ static void fs_write_alotof_bufs(int add_flags) {
                       iovcount,
                       -1,
                       NULL);
    -  ASSERT(r >= 0);
    -  ASSERT((size_t)write_req.result == sizeof(test_buf) * iovcount);
    +  ASSERT_GE(r, 0);
    +  ASSERT_EQ((size_t)write_req.result, sizeof(test_buf) * iovcount);
       uv_fs_req_cleanup(&write_req);
     
       /* Read the strings back to separate buffers. */
    @@ -3433,31 +3435,32 @@ static void fs_write_alotof_bufs(int add_flags) {
                                   sizeof(test_buf));
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       r = uv_fs_open(NULL, &open_req1, "test_file", O_RDONLY | add_flags, 0,
         NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
       r = uv_fs_read(NULL, &read_req, open_req1.result, iovs, iovcount, -1, NULL);
       if (iovcount > iovmax)
         iovcount = iovmax;
    -  ASSERT(r >= 0);
    -  ASSERT((size_t)read_req.result == sizeof(test_buf) * iovcount);
    +  ASSERT_GE(r, 0);
    +  ASSERT_EQ((size_t)read_req.result, sizeof(test_buf) * iovcount);
     
       for (index = 0; index < iovcount; ++index)
    -    ASSERT(strncmp(buffer + index * sizeof(test_buf),
    -                   test_buf,
    -                   sizeof(test_buf)) == 0);
    +    ASSERT_OK(strncmp(buffer + index * sizeof(test_buf),
    +                      test_buf,
    +                      sizeof(test_buf)));
     
       uv_fs_req_cleanup(&read_req);
       free(buffer);
     
    -  ASSERT(lseek(open_req1.result, write_req.result, SEEK_SET) == write_req.result);
    +  ASSERT_EQ(lseek(open_req1.result, write_req.result, SEEK_SET),
    +            write_req.result);
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL,
                      &read_req,
    @@ -3466,13 +3469,13 @@ static void fs_write_alotof_bufs(int add_flags) {
                      1,
                      -1,
                      NULL);
    -  ASSERT(r == 0);
    -  ASSERT(read_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(read_req.result);
       uv_fs_req_cleanup(&read_req);
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       /* Cleanup */
    @@ -3518,14 +3521,14 @@ static void fs_write_alotof_bufs_with_offset(int add_flags) {
                      O_RDWR | O_CREAT | add_flags,
                      S_IWUSR | S_IRUSR,
                      NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
       iov = uv_buf_init(filler, filler_len);
       r = uv_fs_write(NULL, &write_req, open_req1.result, &iov, 1, -1, NULL);
    -  ASSERT(r == filler_len);
    -  ASSERT(write_req.result == filler_len);
    +  ASSERT_EQ(r, filler_len);
    +  ASSERT_EQ(write_req.result, filler_len);
       uv_fs_req_cleanup(&write_req);
       offset = (int64_t)r;
     
    @@ -3539,8 +3542,8 @@ static void fs_write_alotof_bufs_with_offset(int add_flags) {
                       iovcount,
                       offset,
                       NULL);
    -  ASSERT(r >= 0);
    -  ASSERT((size_t)write_req.result == sizeof(test_buf) * iovcount);
    +  ASSERT_GE(r, 0);
    +  ASSERT_EQ((size_t)write_req.result, sizeof(test_buf) * iovcount);
       uv_fs_req_cleanup(&write_req);
     
       /* Read the strings back to separate buffers. */
    @@ -3553,25 +3556,25 @@ static void fs_write_alotof_bufs_with_offset(int add_flags) {
     
       r = uv_fs_read(NULL, &read_req, open_req1.result,
                      iovs, iovcount, offset, NULL);
    -  ASSERT(r >= 0);
    +  ASSERT_GE(r, 0);
       if (r == sizeof(test_buf))
         iovcount = 1; /* Infer that preadv is not available. */
       else if (iovcount > iovmax)
         iovcount = iovmax;
    -  ASSERT((size_t)read_req.result == sizeof(test_buf) * iovcount);
    +  ASSERT_EQ((size_t)read_req.result, sizeof(test_buf) * iovcount);
     
       for (index = 0; index < iovcount; ++index)
    -    ASSERT(strncmp(buffer + index * sizeof(test_buf),
    -                   test_buf,
    -                   sizeof(test_buf)) == 0);
    +    ASSERT_OK(strncmp(buffer + index * sizeof(test_buf),
    +                      test_buf,
    +                      sizeof(test_buf)));
     
       uv_fs_req_cleanup(&read_req);
       free(buffer);
     
       r = uv_fs_stat(NULL, &stat_req, "test_file", NULL);
    -  ASSERT(r == 0);
    -  ASSERT((int64_t)((uv_stat_t*)stat_req.ptr)->st_size ==
    -         offset + (int64_t)write_req.result);
    +  ASSERT_OK(r);
    +  ASSERT_EQ((int64_t)((uv_stat_t*)stat_req.ptr)->st_size,
    +            offset + (int64_t)write_req.result);
       uv_fs_req_cleanup(&stat_req);
     
       iov = uv_buf_init(buf, sizeof(buf));
    @@ -3582,13 +3585,13 @@ static void fs_write_alotof_bufs_with_offset(int add_flags) {
                      1,
                      offset + write_req.result,
                      NULL);
    -  ASSERT(r == 0);
    -  ASSERT(read_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(read_req.result);
       uv_fs_req_cleanup(&read_req);
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       /* Cleanup */
    @@ -3611,9 +3614,9 @@ TEST_IMPL(fs_read_dir) {
       /* Setup */
       rmdir("test_dir");
       r = uv_fs_mkdir(loop, &mkdir_req, "test_dir", 0755, mkdir_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(mkdir_cb_count == 1);
    +  ASSERT_EQ(1, mkdir_cb_count);
       /* Setup Done Here */
     
       /* Get a file descriptor for the directory */
    @@ -3623,7 +3626,7 @@ TEST_IMPL(fs_read_dir) {
                      UV_FS_O_RDONLY | UV_FS_O_DIRECTORY,
                      S_IWUSR | S_IRUSR,
                      NULL);
    -  ASSERT(r >= 0);
    +  ASSERT_GE(r, 0);
       uv_fs_req_cleanup(&open_req1);
     
       /* Try to read data from the directory */
    @@ -3643,12 +3646,12 @@ TEST_IMPL(fs_read_dir) {
        */
       ASSERT((r >= 0) || (r == UV_EISDIR));
     #else
    -  ASSERT(r == UV_EISDIR);
    +  ASSERT_EQ(r, UV_EISDIR);
     #endif
       uv_fs_req_cleanup(&read_req);
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&close_req);
     
       /* Cleanup */
    @@ -3695,7 +3698,7 @@ static void thread_main(void* arg) {
         if (ctx->doread) {
           result = write(ctx->fd, data, nbytes);
           /* Should not see EINTR (or other errors) */
    -      ASSERT(result == nbytes);
    +      ASSERT_EQ(result, nbytes);
         } else {
           result = read(ctx->fd, data, nbytes);
           /* Should not see EINTR (or other errors),
    @@ -3757,13 +3760,13 @@ static void test_fs_partial(int doread) {
     
       loop = uv_default_loop();
     
    -  ASSERT(0 == uv_signal_init(loop, &signal));
    -  ASSERT(0 == uv_signal_start(&signal, sig_func, SIGUSR1));
    +  ASSERT_OK(uv_signal_init(loop, &signal));
    +  ASSERT_OK(uv_signal_start(&signal, sig_func, SIGUSR1));
     
    -  ASSERT(0 == pipe(pipe_fds));
    +  ASSERT_OK(pipe(pipe_fds));
     
       ctx.fd = pipe_fds[doread];
    -  ASSERT(0 == uv_thread_create(&thread, thread_main, &ctx));
    +  ASSERT_OK(uv_thread_create(&thread, thread_main, &ctx));
     
       if (doread) {
         uv_buf_t* read_iovs;
    @@ -3780,34 +3783,34 @@ static void test_fs_partial(int doread) {
             iovcount -= read_iovcount;
             nread += result;
           } else {
    -        ASSERT(result == UV_EINTR);
    +        ASSERT_EQ(result, UV_EINTR);
           }
           uv_fs_req_cleanup(&read_req);
         }
       } else {
         int result;
         result = uv_fs_write(loop, &write_req, pipe_fds[1], iovs, iovcount, -1, NULL);
    -    ASSERT(write_req.result == result);
    -    ASSERT(result == ctx.size);
    +    ASSERT_EQ(write_req.result, result);
    +    ASSERT_EQ(result, ctx.size);
         uv_fs_req_cleanup(&write_req);
       }
     
    -  ASSERT(0 == uv_thread_join(&thread));
    +  ASSERT_OK(uv_thread_join(&thread));
     
       ASSERT_MEM_EQ(buffer, ctx.data, ctx.size);
     
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
     
    -  ASSERT(0 == close(pipe_fds[1]));
    +  ASSERT_OK(close(pipe_fds[1]));
       uv_close((uv_handle_t*) &signal, NULL);
     
       { /* Make sure we read everything that we wrote. */
           int result;
           result = uv_fs_read(loop, &read_req, pipe_fds[0], iovs, 1, -1, NULL);
    -      ASSERT(result == 0);
    +      ASSERT_OK(result);
           uv_fs_req_cleanup(&read_req);
       }
    -  ASSERT(0 == close(pipe_fds[0]));
    +  ASSERT_OK(close(pipe_fds[0]));
     
       free(iovs);
       free(buffer);
    @@ -3832,13 +3835,13 @@ TEST_IMPL(fs_read_write_null_arguments) {
       int r;
     
       r = uv_fs_read(NULL, &read_req, 0, NULL, 0, -1, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       uv_fs_req_cleanup(&read_req);
     
       r = uv_fs_write(NULL, &write_req, 0, NULL, 0, -1, NULL);
       /* Validate some memory management on failed input validation before sending
          fs work to the thread pool. */
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       ASSERT_NULL(write_req.path);
       ASSERT_NULL(write_req.ptr);
     #ifdef _WIN32
    @@ -3853,36 +3856,36 @@ TEST_IMPL(fs_read_write_null_arguments) {
     
       iov = uv_buf_init(NULL, 0);
       r = uv_fs_read(NULL, &read_req, 0, &iov, 0, -1, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       uv_fs_req_cleanup(&read_req);
     
       iov = uv_buf_init(NULL, 0);
       r = uv_fs_write(NULL, &write_req, 0, &iov, 0, -1, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       uv_fs_req_cleanup(&write_req);
     
       /* If the arguments are invalid, the loop should not be kept open */
       loop = uv_default_loop();
     
       r = uv_fs_read(loop, &read_req, 0, NULL, 0, -1, fail_cb);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       uv_run(loop, UV_RUN_DEFAULT);
       uv_fs_req_cleanup(&read_req);
     
       r = uv_fs_write(loop, &write_req, 0, NULL, 0, -1, fail_cb);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       uv_run(loop, UV_RUN_DEFAULT);
       uv_fs_req_cleanup(&write_req);
     
       iov = uv_buf_init(NULL, 0);
       r = uv_fs_read(loop, &read_req, 0, &iov, 0, -1, fail_cb);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       uv_run(loop, UV_RUN_DEFAULT);
       uv_fs_req_cleanup(&read_req);
     
       iov = uv_buf_init(NULL, 0);
       r = uv_fs_write(loop, &write_req, 0, &iov, 0, -1, fail_cb);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       uv_run(loop, UV_RUN_DEFAULT);
       uv_fs_req_cleanup(&write_req);
     
    @@ -3906,20 +3909,20 @@ TEST_IMPL(get_osfhandle_valid_handle) {
                      O_RDWR | O_CREAT,
                      S_IWUSR | S_IRUSR,
                      NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
       fd = uv_get_osfhandle(open_req1.result);
     #ifdef _WIN32
    -  ASSERT(fd != INVALID_HANDLE_VALUE);
    +  ASSERT_PTR_NE(fd, INVALID_HANDLE_VALUE);
     #else
    -  ASSERT(fd >= 0);
    +  ASSERT_GE(fd, 0);
     #endif
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       /* Cleanup. */
    @@ -3945,27 +3948,27 @@ TEST_IMPL(open_osfhandle_valid_handle) {
                      O_RDWR | O_CREAT,
                      S_IWUSR | S_IRUSR,
                      NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
       handle = uv_get_osfhandle(open_req1.result);
     #ifdef _WIN32
    -  ASSERT(handle != INVALID_HANDLE_VALUE);
    +  ASSERT_PTR_NE(handle, INVALID_HANDLE_VALUE);
     #else
    -  ASSERT(handle >= 0);
    +  ASSERT_GE(handle, 0);
     #endif
     
       fd = uv_open_osfhandle(handle);
     #ifdef _WIN32
    -  ASSERT(fd > 0);
    +  ASSERT_GT(fd, 0);
     #else
    -  ASSERT(fd == open_req1.result);
    +  ASSERT_EQ(fd, open_req1.result);
     #endif
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       /* Cleanup. */
    @@ -3988,24 +3991,24 @@ TEST_IMPL(fs_file_pos_after_op_with_offset) {
                      O_RDWR | O_CREAT,
                      S_IWUSR | S_IRUSR,
                      NULL);
    -  ASSERT(r > 0);
    +  ASSERT_GT(r, 0);
       uv_fs_req_cleanup(&open_req1);
     
       iov = uv_buf_init(test_buf, sizeof(test_buf));
       r = uv_fs_write(NULL, &write_req, open_req1.result, &iov, 1, 0, NULL);
    -  ASSERT(r == sizeof(test_buf));
    -  ASSERT(lseek(open_req1.result, 0, SEEK_CUR) == 0);
    +  ASSERT_EQ(r, sizeof(test_buf));
    +  ASSERT_OK(lseek(open_req1.result, 0, SEEK_CUR));
       uv_fs_req_cleanup(&write_req);
     
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL, &read_req, open_req1.result, &iov, 1, 0, NULL);
    -  ASSERT(r == sizeof(test_buf));
    -  ASSERT(strcmp(buf, test_buf) == 0);
    -  ASSERT(lseek(open_req1.result, 0, SEEK_CUR) == 0);
    +  ASSERT_EQ(r, sizeof(test_buf));
    +  ASSERT_OK(strcmp(buf, test_buf));
    +  ASSERT_OK(lseek(open_req1.result, 0, SEEK_CUR));
       uv_fs_req_cleanup(&read_req);
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&close_req);
     
       /* Cleanup */
    @@ -4021,30 +4024,30 @@ static void fs_file_pos_common(void) {
     
       iov = uv_buf_init("abc", 3);
       r = uv_fs_write(NULL, &write_req, open_req1.result, &iov, 1, -1, NULL);
    -  ASSERT(r == 3);
    +  ASSERT_EQ(3, r);
       uv_fs_req_cleanup(&write_req);
     
       /* Read with offset should not change the position */
       iov = uv_buf_init(buf, 1);
       r = uv_fs_read(NULL, &read_req, open_req1.result, &iov, 1, 1, NULL);
    -  ASSERT(r == 1);
    -  ASSERT(buf[0] == 'b');
    +  ASSERT_EQ(1, r);
    +  ASSERT_EQ(buf[0], 'b');
       uv_fs_req_cleanup(&read_req);
     
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL, &read_req, open_req1.result, &iov, 1, -1, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&read_req);
     
       /* Write without offset should change the position */
       iov = uv_buf_init("d", 1);
       r = uv_fs_write(NULL, &write_req, open_req1.result, &iov, 1, -1, NULL);
    -  ASSERT(r == 1);
    +  ASSERT_EQ(1, r);
       uv_fs_req_cleanup(&write_req);
     
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL, &read_req, open_req1.result, &iov, 1, -1, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&read_req);
     }
     
    @@ -4053,23 +4056,23 @@ static void fs_file_pos_close_check(const char *contents, int size) {
     
       /* Close */
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&close_req);
     
       /* Confirm file contents */
       r = uv_fs_open(NULL, &open_req1, "test_file", O_RDONLY, 0, NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL, &read_req, open_req1.result, &iov, 1, -1, NULL);
    -  ASSERT(r == size);
    -  ASSERT(strncmp(buf, contents, size) == 0);
    +  ASSERT_EQ(r, size);
    +  ASSERT_OK(strncmp(buf, contents, size));
       uv_fs_req_cleanup(&read_req);
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&close_req);
     
       /* Cleanup */
    @@ -4088,7 +4091,7 @@ static void fs_file_pos_write(int add_flags) {
                      O_TRUNC | O_CREAT | O_RDWR | add_flags,
                      S_IWUSR | S_IRUSR,
                      NULL);
    -  ASSERT(r > 0);
    +  ASSERT_GT(r, 0);
       uv_fs_req_cleanup(&open_req1);
     
       fs_file_pos_common();
    @@ -4096,12 +4099,12 @@ static void fs_file_pos_write(int add_flags) {
       /* Write with offset should not change the position */
       iov = uv_buf_init("e", 1);
       r = uv_fs_write(NULL, &write_req, open_req1.result, &iov, 1, 1, NULL);
    -  ASSERT(r == 1);
    +  ASSERT_EQ(1, r);
       uv_fs_req_cleanup(&write_req);
     
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL, &read_req, open_req1.result, &iov, 1, -1, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&read_req);
     
       fs_file_pos_close_check("aecd", 4);
    @@ -4126,7 +4129,7 @@ static void fs_file_pos_append(int add_flags) {
                      O_APPEND | O_CREAT | O_RDWR | add_flags,
                      S_IWUSR | S_IRUSR,
                      NULL);
    -  ASSERT(r > 0);
    +  ASSERT_GT(r, 0);
       uv_fs_req_cleanup(&open_req1);
     
       fs_file_pos_common();
    @@ -4135,13 +4138,13 @@ static void fs_file_pos_append(int add_flags) {
        * but does not change the position */
       iov = uv_buf_init("e", 1);
       r = uv_fs_write(NULL, &write_req, open_req1.result, &iov, 1, 1, NULL);
    -  ASSERT(r == 1);
    +  ASSERT_EQ(1, r);
       uv_fs_req_cleanup(&write_req);
     
       iov = uv_buf_init(buf, sizeof(buf));
       r = uv_fs_read(NULL, &read_req, open_req1.result, &iov, 1, -1, NULL);
    -  ASSERT(r == 1);
    -  ASSERT(buf[0] == 'e');
    +  ASSERT_EQ(1, r);
    +  ASSERT_EQ(buf[0], 'e');
       uv_fs_req_cleanup(&read_req);
     
       fs_file_pos_close_check("abcde", 5);
    @@ -4160,97 +4163,97 @@ TEST_IMPL(fs_null_req) {
       int r;
     
       r = uv_fs_open(NULL, NULL, NULL, 0, 0, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_close(NULL, NULL, 0, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_read(NULL, NULL, 0, NULL, 0, -1, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_write(NULL, NULL, 0, NULL, 0, -1, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_unlink(NULL, NULL, NULL, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_mkdir(NULL, NULL, NULL, 0, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_mkdtemp(NULL, NULL, NULL, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_mkstemp(NULL, NULL, NULL, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_rmdir(NULL, NULL, NULL, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_scandir(NULL, NULL, NULL, 0, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_link(NULL, NULL, NULL, NULL, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_symlink(NULL, NULL, NULL, NULL, 0, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_readlink(NULL, NULL, NULL, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_realpath(NULL, NULL, NULL, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_chown(NULL, NULL, NULL, 0, 0, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_fchown(NULL, NULL, 0, 0, 0, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_stat(NULL, NULL, NULL, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_lstat(NULL, NULL, NULL, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_fstat(NULL, NULL, 0, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_rename(NULL, NULL, NULL, NULL, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_fsync(NULL, NULL, 0, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_fdatasync(NULL, NULL, 0, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_ftruncate(NULL, NULL, 0, 0, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_copyfile(NULL, NULL, NULL, NULL, 0, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_sendfile(NULL, NULL, 0, 0, 0, 0, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_access(NULL, NULL, NULL, 0, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_chmod(NULL, NULL, NULL, 0, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_fchmod(NULL, NULL, 0, 0, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_utime(NULL, NULL, NULL, 0.0, 0.0, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_futime(NULL, NULL, 0, 0.0, 0.0, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_fs_statfs(NULL, NULL, NULL, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       /* This should be a no-op. */
       uv_fs_req_cleanup(NULL);
    @@ -4265,7 +4268,7 @@ TEST_IMPL(fs_exclusive_sharing_mode) {
       /* Setup. */
       unlink("test_file");
     
    -  ASSERT(UV_FS_O_EXLOCK > 0);
    +  ASSERT_GT(UV_FS_O_EXLOCK, 0);
     
       r = uv_fs_open(NULL,
                      &open_req1,
    @@ -4273,8 +4276,8 @@ TEST_IMPL(fs_exclusive_sharing_mode) {
                      O_RDWR | O_CREAT | UV_FS_O_EXLOCK,
                      S_IWUSR | S_IRUSR,
                      NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
       r = uv_fs_open(NULL,
    @@ -4283,13 +4286,13 @@ TEST_IMPL(fs_exclusive_sharing_mode) {
                      O_RDONLY | UV_FS_O_EXLOCK,
                      S_IWUSR | S_IRUSR,
                      NULL);
    -  ASSERT(r < 0);
    -  ASSERT(open_req2.result < 0);
    +  ASSERT_LT(r, 0);
    +  ASSERT_LT(open_req2.result, 0);
       uv_fs_req_cleanup(&open_req2);
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       r = uv_fs_open(NULL,
    @@ -4298,13 +4301,13 @@ TEST_IMPL(fs_exclusive_sharing_mode) {
                      O_RDONLY | UV_FS_O_EXLOCK,
                      S_IWUSR | S_IRUSR,
                      NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req2.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req2.result, 0);
       uv_fs_req_cleanup(&open_req2);
     
       r = uv_fs_close(NULL, &close_req, open_req2.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       /* Cleanup */
    @@ -4322,10 +4325,10 @@ TEST_IMPL(fs_file_flag_no_buffering) {
       /* Setup. */
       unlink("test_file");
     
    -  ASSERT(UV_FS_O_APPEND > 0);
    -  ASSERT(UV_FS_O_CREAT > 0);
    -  ASSERT(UV_FS_O_DIRECT > 0);
    -  ASSERT(UV_FS_O_RDWR > 0);
    +  ASSERT_GT(UV_FS_O_APPEND, 0);
    +  ASSERT_GT(UV_FS_O_CREAT, 0);
    +  ASSERT_GT(UV_FS_O_DIRECT, 0);
    +  ASSERT_GT(UV_FS_O_RDWR, 0);
     
       /* FILE_APPEND_DATA must be excluded from FILE_GENERIC_WRITE: */
       r = uv_fs_open(NULL,
    @@ -4334,13 +4337,13 @@ TEST_IMPL(fs_file_flag_no_buffering) {
                      UV_FS_O_RDWR | UV_FS_O_CREAT | UV_FS_O_DIRECT,
                      S_IWUSR | S_IRUSR,
                      NULL);
    -  ASSERT(r >= 0);
    -  ASSERT(open_req1.result >= 0);
    +  ASSERT_GE(r, 0);
    +  ASSERT_GE(open_req1.result, 0);
       uv_fs_req_cleanup(&open_req1);
     
       r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(close_req.result == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(close_req.result);
       uv_fs_req_cleanup(&close_req);
     
       /* FILE_APPEND_DATA and FILE_FLAG_NO_BUFFERING are mutually exclusive: */
    @@ -4350,8 +4353,8 @@ TEST_IMPL(fs_file_flag_no_buffering) {
                      UV_FS_O_APPEND | UV_FS_O_DIRECT,
                      S_IWUSR | S_IRUSR,
                      NULL);
    -  ASSERT(r == UV_EINVAL);
    -  ASSERT(open_req2.result == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
    +  ASSERT_EQ(open_req2.result, UV_EINVAL);
       uv_fs_req_cleanup(&open_req2);
     
       /* Cleanup */
    @@ -4392,7 +4395,7 @@ TEST_IMPL(fs_open_readonly_acl) {
         /* Setup - clear the ACL and remove the file */
         loop = uv_default_loop();
         r = uv_os_get_passwd(&pwd);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         call_icacls("icacls test_file_icacls /remove \"%s\" /inheritance:e",
                     pwd.username);
         uv_fs_chmod(loop, &req, "test_file_icacls", S_IWUSR, NULL);
    @@ -4405,12 +4408,12 @@ TEST_IMPL(fs_open_readonly_acl) {
                        O_RDONLY | O_CREAT,
                        S_IRUSR,
                        NULL);
    -    ASSERT(r >= 0);
    -    ASSERT(open_req1.result >= 0);
    +    ASSERT_GE(r, 0);
    +    ASSERT_GE(open_req1.result, 0);
         uv_fs_req_cleanup(&open_req1);
         r = uv_fs_close(NULL, &close_req, open_req1.result, NULL);
    -    ASSERT(r == 0);
    -    ASSERT(close_req.result == 0);
    +    ASSERT_OK(r);
    +    ASSERT_OK(close_req.result);
         uv_fs_req_cleanup(&close_req);
     
         /* Set up ACL */
    @@ -4442,7 +4445,7 @@ TEST_IMPL(fs_open_readonly_acl) {
                     pwd.username);
         unlink("test_file_icacls");
         uv_os_free_passwd(&pwd);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         MAKE_VALGRIND_HAPPY(loop);
         return 0;
     }
    @@ -4463,35 +4466,35 @@ TEST_IMPL(fs_fchmod_archive_readonly) {
                        O_WRONLY | O_CREAT,
                        S_IWUSR | S_IRUSR,
                        NULL);
    -    ASSERT(r >= 0);
    -    ASSERT(req.result >= 0);
    +    ASSERT_GE(r, 0);
    +    ASSERT_GE(req.result, 0);
         file = req.result;
         uv_fs_req_cleanup(&req);
         r = uv_fs_close(NULL, &req, file, NULL);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         uv_fs_req_cleanup(&req);
         /* Make the file read-only and clear archive flag */
         r = SetFileAttributes("test_file", FILE_ATTRIBUTE_READONLY);
    -    ASSERT(r != 0);
    +    ASSERT(r);
         check_permission("test_file", 0400);
         /* Try fchmod */
         r = uv_fs_open(NULL, &req, "test_file", O_RDONLY, 0, NULL);
    -    ASSERT(r >= 0);
    -    ASSERT(req.result >= 0);
    +    ASSERT_GE(r, 0);
    +    ASSERT_GE(req.result, 0);
         file = req.result;
         uv_fs_req_cleanup(&req);
         r = uv_fs_fchmod(NULL, &req, file, S_IWUSR, NULL);
    -    ASSERT(r == 0);
    -    ASSERT(req.result == 0);
    +    ASSERT_OK(r);
    +    ASSERT_OK(req.result);
         uv_fs_req_cleanup(&req);
         r = uv_fs_close(NULL, &req, file, NULL);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         uv_fs_req_cleanup(&req);
         check_permission("test_file", S_IWUSR);
     
         /* Restore Archive flag for rest of the tests */
         r = SetFileAttributes("test_file", FILE_ATTRIBUTE_ARCHIVE);
    -    ASSERT(r != 0);
    +    ASSERT(r);
     
         return 0;
     }
    @@ -4503,7 +4506,7 @@ TEST_IMPL(fs_invalid_mkdir_name) {
     
       loop = uv_default_loop();
       r = uv_fs_mkdir(loop, &req, "invalid>", 0, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       ASSERT_EQ(UV_EINVAL, uv_fs_mkdir(loop, &req, "test:lol", 0, NULL));
     
       return 0;
    @@ -4518,15 +4521,15 @@ TEST_IMPL(fs_statfs) {
     
       /* Test the synchronous version. */
       r = uv_fs_statfs(NULL, &req, ".", NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       statfs_cb(&req);
    -  ASSERT(statfs_cb_count == 1);
    +  ASSERT_EQ(1, statfs_cb_count);
     
       /* Test the asynchronous version. */
       r = uv_fs_statfs(loop, &req, ".", statfs_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(statfs_cb_count == 2);
    +  ASSERT_EQ(2, statfs_cb_count);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -4538,13 +4541,13 @@ TEST_IMPL(fs_get_system_error) {
       int system_error;
     
       r = uv_fs_statfs(NULL, &req, "non_existing_file", NULL);
    -  ASSERT(r != 0);
    +  ASSERT(r);
     
       system_error = uv_fs_get_system_error(&req);
     #ifdef _WIN32
    -  ASSERT(system_error == ERROR_FILE_NOT_FOUND);
    +  ASSERT_EQ(system_error, ERROR_FILE_NOT_FOUND);
     #else
    -  ASSERT(system_error == ENOENT);
    +  ASSERT_EQ(system_error, ENOENT);
     #endif
     
       return 0;
    @@ -4559,13 +4562,13 @@ TEST_IMPL(fs_stat_batch_multiple) {
       rmdir("test_dir");
     
       r = uv_fs_mkdir(NULL, &mkdir_req, "test_dir", 0755, NULL);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       loop = uv_default_loop();
     
       for (i = 0; i < (int) ARRAY_SIZE(req); ++i) {
         r = uv_fs_stat(loop, &req[i], "test_dir", stat_batch_cb);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
       }
     
       uv_run(loop, UV_RUN_DEFAULT);
    @@ -4590,7 +4593,7 @@ TEST_IMPL(fs_wtf) {
       loop = uv_default_loop();
     
       r = uv_fs_mkdir(NULL, &mkdir_req, "test_dir", 0777, NULL);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&mkdir_req);
     
       file_handle = CreateFileW(L"test_dir/hi\xD801\x0037",
    @@ -4601,19 +4604,19 @@ TEST_IMPL(fs_wtf) {
                                 FILE_FLAG_OPEN_REPARSE_POINT |
                                   FILE_FLAG_BACKUP_SEMANTICS,
                                 NULL);
    -  ASSERT(file_handle != INVALID_HANDLE_VALUE);
    +  ASSERT_PTR_NE(file_handle, INVALID_HANDLE_VALUE);
     
       CloseHandle(file_handle);
     
       r = uv_fs_scandir(NULL, &scandir_req, "test_dir", 0, NULL);
    -  ASSERT_EQ(r, 1);
    -  ASSERT_EQ(scandir_req.result, 1);
    +  ASSERT_EQ(1, r);
    +  ASSERT_EQ(1, scandir_req.result);
       ASSERT_NOT_NULL(scandir_req.ptr);
       while (UV_EOF != uv_fs_scandir_next(&scandir_req, &dent)) {
         snprintf(test_file_buf, sizeof(test_file_buf), "test_dir\\%s", dent.name);
         printf("stat %s\n", test_file_buf);
         r = uv_fs_stat(NULL, &stat_req, test_file_buf, NULL);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
       }
       uv_fs_req_cleanup(&scandir_req);
       ASSERT_NULL(scandir_req.ptr);
    diff --git a/deps/uv/test/test-get-currentexe.c b/deps/uv/test/test-get-currentexe.c
    index becaf5c1bb8613..c813d3a5c4f883 100644
    --- a/deps/uv/test/test-get-currentexe.c
    +++ b/deps/uv/test/test-get-currentexe.c
    @@ -60,43 +60,43 @@ TEST_IMPL(get_currentexe) {
        * executable_path.
        */
       ASSERT(match && !strcmp(match, path));
    -  ASSERT(size == strlen(buffer));
    +  ASSERT_EQ(size, strlen(buffer));
     
       /* Negative tests */
       size = sizeof(buffer) / sizeof(buffer[0]);
       r = uv_exepath(NULL, &size);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_exepath(buffer, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       size = 0;
       r = uv_exepath(buffer, &size);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       memset(buffer, -1, sizeof(buffer));
     
       size = 1;
       r = uv_exepath(buffer, &size);
    -  ASSERT(r == 0);
    -  ASSERT(size == 0);
    -  ASSERT(buffer[0] == '\0');
    +  ASSERT_OK(r);
    +  ASSERT_OK(size);
    +  ASSERT_EQ(buffer[0], '\0');
     
       memset(buffer, -1, sizeof(buffer));
     
       size = 2;
       r = uv_exepath(buffer, &size);
    -  ASSERT(r == 0);
    -  ASSERT(size == 1);
    -  ASSERT(buffer[0] != '\0');
    -  ASSERT(buffer[1] == '\0');
    +  ASSERT_OK(r);
    +  ASSERT_EQ(1, size);
    +  ASSERT_NE(buffer[0], '\0');
    +  ASSERT_EQ(buffer[1], '\0');
     
       /* Verify uv_exepath is not affected by uv_set_process_title(). */
       r = uv_set_process_title("foobar");
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
       size = sizeof(buffer);
       r = uv_exepath(buffer, &size);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       match = strstr(buffer, path);
       /* Verify that the path returned from uv_exepath is a subdirectory of
    diff --git a/deps/uv/test/test-get-loadavg.c b/deps/uv/test/test-get-loadavg.c
    index 4762e47576d064..ef1719c047f8d5 100644
    --- a/deps/uv/test/test-get-loadavg.c
    +++ b/deps/uv/test/test-get-loadavg.c
    @@ -27,9 +27,9 @@ TEST_IMPL(get_loadavg) {
       double avg[3] = {-1, -1, -1};
       uv_loadavg(avg);
     
    -  ASSERT(avg[0] >= 0);
    -  ASSERT(avg[1] >= 0);
    -  ASSERT(avg[2] >= 0);
    +  ASSERT_GE(avg[0], 0);
    +  ASSERT_GE(avg[1], 0);
    +  ASSERT_GE(avg[2], 0);
     
       return 0;
     }
    diff --git a/deps/uv/test/test-get-memory.c b/deps/uv/test/test-get-memory.c
    index 9ac42c383c918b..2a23f79470f599 100644
    --- a/deps/uv/test/test-get-memory.c
    +++ b/deps/uv/test/test-get-memory.c
    @@ -35,13 +35,13 @@ TEST_IMPL(get_memory) {
              (unsigned long long) constrained_mem,
              (unsigned long long) available_mem);
     
    -  ASSERT(free_mem > 0);
    -  ASSERT(total_mem > 0);
    +  ASSERT_GT(free_mem, 0);
    +  ASSERT_GT(total_mem, 0);
       /* On IBMi PASE, the amount of memory in use is always zero. */
     #ifdef __PASE__
    -  ASSERT(total_mem == free_mem);
    +  ASSERT_EQ(total_mem, free_mem);
     #else
    -  ASSERT(total_mem > free_mem);
    +  ASSERT_GT(total_mem, free_mem);
     #endif
       ASSERT_LE(available_mem, total_mem);
       /* we'd really want to test if available <= free, but that is fragile:
    diff --git a/deps/uv/test/test-get-passwd.c b/deps/uv/test/test-get-passwd.c
    index 29a2bd1243d2b8..b1e762009757ab 100644
    --- a/deps/uv/test/test-get-passwd.c
    +++ b/deps/uv/test/test-get-passwd.c
    @@ -39,7 +39,7 @@ TEST_IMPL(get_passwd) {
     
       /* Test the normal case */
       r = uv_os_get_passwd(&pwd);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
       len = strlen(pwd.username);
       ASSERT_GT(len, 0);
     
    @@ -114,7 +114,7 @@ TEST_IMPL(get_passwd2) {
     
       /* Test the normal case */
       r = uv_os_get_passwd(&pwd);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_os_get_passwd2(&pwd2, pwd.uid);
     
    @@ -123,7 +123,7 @@ TEST_IMPL(get_passwd2) {
       (void) &len;
     
     #else
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
       ASSERT_EQ(pwd.uid, pwd2.uid);
       ASSERT_STR_EQ(pwd.username, pwd2.username);
       ASSERT_STR_EQ(pwd.shell, pwd2.shell);
    @@ -131,15 +131,20 @@ TEST_IMPL(get_passwd2) {
       uv_os_free_passwd(&pwd2);
     
       r = uv_os_get_passwd2(&pwd2, 0);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       len = strlen(pwd2.username);
       ASSERT_GT(len, 0);
    +#if defined(__PASE__)
    +  // uid 0 is qsecofr on IBM i
    +  ASSERT_STR_EQ(pwd2.username, "qsecofr");
    +#else
       ASSERT_STR_EQ(pwd2.username, "root");
    -
    +#endif
       len = strlen(pwd2.homedir);
    +# ifndef __PASE__
       ASSERT_GT(len, 0);
    -
    +#endif
       len = strlen(pwd2.shell);
     # ifndef __PASE__
       ASSERT_GT(len, 0);
    @@ -174,7 +179,7 @@ TEST_IMPL(get_group) {
       int r;
     
       r = uv_os_get_passwd(&pwd);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_os_get_group(&grp, pwd.gid);
     
    @@ -183,7 +188,7 @@ TEST_IMPL(get_group) {
       (void) &len;
     
     #else
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
       ASSERT_EQ(pwd.gid, grp.gid);
     
       len = strlen(grp.groupname);
    diff --git a/deps/uv/test/test-getaddrinfo.c b/deps/uv/test/test-getaddrinfo.c
    index 1032537ad563a0..76137f06ca074c 100644
    --- a/deps/uv/test/test-getaddrinfo.c
    +++ b/deps/uv/test/test-getaddrinfo.c
    @@ -40,8 +40,8 @@ static void getaddrinfo_fail_cb(uv_getaddrinfo_t* req,
                                     int status,
                                     struct addrinfo* res) {
     
    -  ASSERT(fail_cb_called == 0);
    -  ASSERT(status < 0);
    +  ASSERT_OK(fail_cb_called);
    +  ASSERT_LT(status, 0);
       ASSERT_NULL(res);
       uv_freeaddrinfo(res);  /* Should not crash. */
       fail_cb_called++;
    @@ -51,7 +51,7 @@ static void getaddrinfo_fail_cb(uv_getaddrinfo_t* req,
     static void getaddrinfo_basic_cb(uv_getaddrinfo_t* handle,
                                      int status,
                                      struct addrinfo* res) {
    -  ASSERT(handle == getaddrinfo_handle);
    +  ASSERT_PTR_EQ(handle, getaddrinfo_handle);
       getaddrinfo_cbs++;
       free(handle);
       uv_freeaddrinfo(res);
    @@ -66,7 +66,7 @@ static void getaddrinfo_cuncurrent_cb(uv_getaddrinfo_t* handle,
     
       for (i = 0; i < CONCURRENT_COUNT; i++) {
         if (&getaddrinfo_handles[i] == handle) {
    -      ASSERT(i == *data);
    +      ASSERT_EQ(i, *data);
     
           callback_counts[i]++;
           break;
    @@ -89,22 +89,22 @@ TEST_IMPL(getaddrinfo_fail) {
       
       uv_getaddrinfo_t req;
     
    -  ASSERT(UV_EINVAL == uv_getaddrinfo(uv_default_loop(),
    -                                     &req,
    -                                     (uv_getaddrinfo_cb) abort,
    -                                     NULL,
    -                                     NULL,
    -                                     NULL));
    +  ASSERT_EQ(UV_EINVAL, uv_getaddrinfo(uv_default_loop(),
    +                                      &req,
    +                                      (uv_getaddrinfo_cb) abort,
    +                                      NULL,
    +                                      NULL,
    +                                      NULL));
     
       /* Use a FQDN by ending in a period */
    -  ASSERT(0 == uv_getaddrinfo(uv_default_loop(),
    -                             &req,
    -                             getaddrinfo_fail_cb,
    -                             "example.invalid.",
    -                             NULL,
    -                             NULL));
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    -  ASSERT(fail_cb_called == 1);
    +  ASSERT_OK(uv_getaddrinfo(uv_default_loop(),
    +                           &req,
    +                           getaddrinfo_fail_cb,
    +                           "example.invalid.",
    +                           NULL,
    +                           NULL));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_EQ(1, fail_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -119,12 +119,12 @@ TEST_IMPL(getaddrinfo_fail_sync) {
       uv_getaddrinfo_t req;
     
       /* Use a FQDN by ending in a period */
    -  ASSERT(0 > uv_getaddrinfo(uv_default_loop(),
    -                            &req,
    -                            NULL,
    -                            "example.invalid.",
    -                            NULL,
    -                            NULL));
    +  ASSERT_GT(0, uv_getaddrinfo(uv_default_loop(),
    +                              &req,
    +                              NULL,
    +                              "example.invalid.",
    +                              NULL,
    +                              NULL));
       uv_freeaddrinfo(req.addrinfo);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
    @@ -147,11 +147,11 @@ TEST_IMPL(getaddrinfo_basic) {
                          name,
                          NULL,
                          NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(getaddrinfo_cbs == 1);
    +  ASSERT_EQ(1, getaddrinfo_cbs);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -165,12 +165,12 @@ TEST_IMPL(getaddrinfo_basic_sync) {
     #endif
       uv_getaddrinfo_t req;
     
    -  ASSERT(0 == uv_getaddrinfo(uv_default_loop(),
    -                             &req,
    -                             NULL,
    -                             name,
    -                             NULL,
    -                             NULL));
    +  ASSERT_OK(uv_getaddrinfo(uv_default_loop(),
    +                           &req,
    +                           NULL,
    +                           name,
    +                           NULL,
    +                           NULL));
       uv_freeaddrinfo(req.addrinfo);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
    @@ -201,13 +201,13 @@ TEST_IMPL(getaddrinfo_concurrent) {
                            name,
                            NULL,
                            NULL);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
       for (i = 0; i < CONCURRENT_COUNT; i++) {
    -    ASSERT(callback_counts[i] == 1);
    +    ASSERT_EQ(1, callback_counts[i]);
       }
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
    diff --git a/deps/uv/test/test-gethostname.c b/deps/uv/test/test-gethostname.c
    index dc29cd69234a13..cc15a8253ebf5a 100644
    --- a/deps/uv/test/test-gethostname.c
    +++ b/deps/uv/test/test-gethostname.c
    @@ -32,27 +32,27 @@ TEST_IMPL(gethostname) {
       /* Reject invalid inputs */
       size = 1;
       r = uv_os_gethostname(NULL, &size);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       r = uv_os_gethostname(buf, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       size = 0;
       r = uv_os_gethostname(buf, &size);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       /* Return UV_ENOBUFS if the buffer cannot hold the hostname */
       enobufs_size = 1;
       buf[0] = '\0';
       r = uv_os_gethostname(buf, &enobufs_size);
       ASSERT_EQ(r, UV_ENOBUFS);
    -  ASSERT(buf[0] == '\0');
    -  ASSERT(enobufs_size > 1);
    +  ASSERT_EQ(buf[0], '\0');
    +  ASSERT_GT(enobufs_size, 1);
     
       /* Successfully get the hostname */
       size = UV_MAXHOSTNAMESIZE;
       r = uv_os_gethostname(buf, &size);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       ASSERT(size > 0 && size == strlen(buf));
    -  ASSERT(size + 1 == enobufs_size);
    +  ASSERT_EQ(size + 1, enobufs_size);
     
       return 0;
     }
    diff --git a/deps/uv/test/test-getnameinfo.c b/deps/uv/test/test-getnameinfo.c
    index cea57b012f1322..415e48a4f961df 100644
    --- a/deps/uv/test/test-getnameinfo.c
    +++ b/deps/uv/test/test-getnameinfo.c
    @@ -39,7 +39,7 @@ static void getnameinfo_req(uv_getnameinfo_t* handle,
                                 const char* hostname,
                                 const char* service) {
       ASSERT_NOT_NULL(handle);
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       ASSERT_NOT_NULL(hostname);
       ASSERT_NOT_NULL(service);
     }
    @@ -54,14 +54,14 @@ TEST_IMPL(getnameinfo_basic_ip4) {
       int r;
     
       r = uv_ip4_addr(address_ip4, port, &addr4);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_getnameinfo(uv_default_loop(),
                          &req,
                          &getnameinfo_req,
                          (const struct sockaddr*)&addr4,
                          0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    @@ -76,15 +76,15 @@ TEST_IMPL(getnameinfo_basic_ip4_sync) {
       RETURN_SKIP("Test does not currently work in QEMU");
     #endif
     
    -  ASSERT(0 == uv_ip4_addr(address_ip4, port, &addr4));
    +  ASSERT_OK(uv_ip4_addr(address_ip4, port, &addr4));
     
    -  ASSERT(0 == uv_getnameinfo(uv_default_loop(),
    -                             &req,
    -                             NULL,
    -                             (const struct sockaddr*)&addr4,
    -                             0));
    -  ASSERT(req.host[0] != '\0');
    -  ASSERT(req.service[0] != '\0');
    +  ASSERT_OK(uv_getnameinfo(uv_default_loop(),
    +                           &req,
    +                           NULL,
    +                           (const struct sockaddr*)&addr4,
    +                           0));
    +  ASSERT_NE(req.host[0], '\0');
    +  ASSERT_NE(req.service[0], '\0');
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -100,14 +100,14 @@ TEST_IMPL(getnameinfo_basic_ip6) {
       int r;
     
       r = uv_ip6_addr(address_ip6, port, &addr6);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_getnameinfo(uv_default_loop(),
                          &req,
                          &getnameinfo_req,
                          (const struct sockaddr*)&addr6,
                          0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    diff --git a/deps/uv/test/test-getsockname.c b/deps/uv/test/test-getsockname.c
    index 1d4d9f12bdaab3..7bc0ba2e9f2f68 100644
    --- a/deps/uv/test/test-getsockname.c
    +++ b/deps/uv/test/test-getsockname.c
    @@ -73,7 +73,7 @@ static void after_read(uv_stream_t* handle,
     
       req = (uv_shutdown_t*) malloc(sizeof *req);
       r = uv_shutdown(req, handle, after_shutdown);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -84,22 +84,22 @@ static void check_sockname(struct sockaddr* addr, const char* compare_ip,
       char check_ip[17];
       int r;
     
    -  ASSERT(0 == uv_ip4_addr(compare_ip, compare_port, &compare_addr));
    +  ASSERT_OK(uv_ip4_addr(compare_ip, compare_port, &compare_addr));
     
       /* Both addresses should be ipv4 */
    -  ASSERT(check_addr.sin_family == AF_INET);
    -  ASSERT(compare_addr.sin_family == AF_INET);
    +  ASSERT_EQ(check_addr.sin_family, AF_INET);
    +  ASSERT_EQ(compare_addr.sin_family, AF_INET);
     
       /* Check if the ip matches */
    -  ASSERT(memcmp(&check_addr.sin_addr,
    -         &compare_addr.sin_addr,
    -         sizeof compare_addr.sin_addr) == 0);
    +  ASSERT_OK(memcmp(&check_addr.sin_addr,
    +            &compare_addr.sin_addr,
    +            sizeof compare_addr.sin_addr));
     
       /* Check if the port matches. If port == 0 anything goes. */
       ASSERT(compare_port == 0 || check_addr.sin_port == compare_addr.sin_port);
     
       r = uv_ip4_name(&check_addr, (char*) check_ip, sizeof check_ip);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       printf("%s: %s:%d\n", context, check_ip, ntohs(check_addr.sin_port));
     }
    @@ -114,34 +114,34 @@ static void on_connection(uv_stream_t* server, int status) {
       if (status != 0) {
         fprintf(stderr, "Connect error %s\n", uv_err_name(status));
       }
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
       handle = malloc(sizeof(*handle));
       ASSERT_NOT_NULL(handle);
     
       r = uv_tcp_init(loop, handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* associate server with stream */
       handle->data = server;
     
       r = uv_accept(server, (uv_stream_t*)handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       namelen = sizeof sockname;
       r = uv_tcp_getsockname(handle, &sockname, &namelen);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       check_sockname(&sockname, "127.0.0.1", server_port, "accepted socket");
       getsocknamecount_tcp++;
     
       namelen = sizeof peername;
       r = uv_tcp_getpeername(handle, &peername, &namelen);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       check_sockname(&peername, "127.0.0.1", connect_port, "accepted socket peer");
       getpeernamecount++;
     
       r = uv_read_start((uv_stream_t*)handle, alloc, after_read);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -149,17 +149,17 @@ static void on_connect(uv_connect_t* req, int status) {
       struct sockaddr sockname, peername;
       int r, namelen;
     
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
       namelen = sizeof sockname;
       r = uv_tcp_getsockname((uv_tcp_t*) req->handle, &sockname, &namelen);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       check_sockname(&sockname, "127.0.0.1", 0, "connected socket");
       getsocknamecount_tcp++;
     
       namelen = sizeof peername;
       r = uv_tcp_getpeername((uv_tcp_t*) req->handle, &peername, &namelen);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       check_sockname(&peername, "127.0.0.1", server_port, "connected socket peer");
       getpeernamecount++;
     
    @@ -173,7 +173,7 @@ static int tcp_listener(void) {
       int namelen;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", server_port, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", server_port, &addr));
     
       r = uv_tcp_init(loop, &tcpServer);
       if (r) {
    @@ -196,13 +196,13 @@ static int tcp_listener(void) {
       memset(&sockname, -1, sizeof sockname);
       namelen = sizeof sockname;
       r = uv_tcp_getsockname(&tcpServer, &sockname, &namelen);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       check_sockname(&sockname, "0.0.0.0", server_port, "server socket");
       getsocknamecount_tcp++;
     
       namelen = sizeof sockname;
       r = uv_tcp_getpeername(&tcpServer, &peername, &namelen);
    -  ASSERT(r == UV_ENOTCONN);
    +  ASSERT_EQ(r, UV_ENOTCONN);
       getpeernamecount++;
     
       return 0;
    @@ -214,7 +214,7 @@ static void tcp_connector(void) {
       struct sockaddr sockname;
       int r, namelen;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", server_port, &server_addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", server_port, &server_addr));
     
       r = uv_tcp_init(loop, &tcp);
       tcp.data = &connect_req;
    @@ -230,9 +230,9 @@ static void tcp_connector(void) {
       namelen = sizeof sockname;
       r = uv_tcp_getsockname(&tcp, &sockname, &namelen);
       ASSERT(!r);
    -  ASSERT(sockname.sa_family == AF_INET);
    +  ASSERT_EQ(sockname.sa_family, AF_INET);
       connect_port = ntohs(((struct sockaddr_in*) &sockname)->sin_port);
    -  ASSERT(connect_port > 0);
    +  ASSERT_GT(connect_port, 0);
     }
     
     
    @@ -245,7 +245,7 @@ static void udp_recv(uv_udp_t* handle,
       int namelen;
       int r;
     
    -  ASSERT(nread >= 0);
    +  ASSERT_GE(nread, 0);
       free(buf->base);
     
       if (nread == 0) {
    @@ -255,7 +255,7 @@ static void udp_recv(uv_udp_t* handle,
       memset(&sockname, -1, sizeof sockname);
       namelen = sizeof(sockname);
       r = uv_udp_getsockname(&udp, &sockname, &namelen);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       check_sockname(&sockname, "0.0.0.0", 0, "udp receiving socket");
       getsocknamecount_udp++;
     
    @@ -275,7 +275,7 @@ static int udp_listener(void) {
       int namelen;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", server_port, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", server_port, &addr));
     
       r = uv_udp_init(loop, &udpServer);
       if (r) {
    @@ -292,12 +292,12 @@ static int udp_listener(void) {
       memset(&sockname, -1, sizeof sockname);
       namelen = sizeof sockname;
       r = uv_udp_getsockname(&udpServer, &sockname, &namelen);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       check_sockname(&sockname, "0.0.0.0", server_port, "udp listener socket");
       getsocknamecount_udp++;
     
       r = uv_udp_recv_start(&udpServer, alloc, udp_recv);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       return 0;
     }
    @@ -312,7 +312,7 @@ static void udp_sender(void) {
       ASSERT(!r);
     
       buf = uv_buf_init("PING", 4);
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", server_port, &server_addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", server_port, &server_addr));
     
       r = uv_udp_send(&send_req,
                       &udp,
    @@ -334,8 +334,8 @@ TEST_IMPL(getsockname_tcp) {
     
       uv_run(loop, UV_RUN_DEFAULT);
     
    -  ASSERT(getsocknamecount_tcp == 3);
    -  ASSERT(getpeernamecount == 3);
    +  ASSERT_EQ(3, getsocknamecount_tcp);
    +  ASSERT_EQ(3, getpeernamecount);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -352,10 +352,10 @@ TEST_IMPL(getsockname_udp) {
     
       uv_run(loop, UV_RUN_DEFAULT);
     
    -  ASSERT(getsocknamecount_udp == 2);
    +  ASSERT_EQ(2, getsocknamecount_udp);
     
    -  ASSERT(udp.send_queue_size == 0);
    -  ASSERT(udpServer.send_queue_size == 0);
    +  ASSERT_OK(udp.send_queue_size);
    +  ASSERT_OK(udpServer.send_queue_size);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-getters-setters.c b/deps/uv/test/test-getters-setters.c
    index 9869f7b9da8b1f..e4c6717d3bca64 100644
    --- a/deps/uv/test/test-getters-setters.c
    +++ b/deps/uv/test/test-getters-setters.c
    @@ -30,9 +30,9 @@ int cookie3;
     
     
     TEST_IMPL(handle_type_name) {
    -  ASSERT(strcmp(uv_handle_type_name(UV_NAMED_PIPE), "pipe") == 0);
    -  ASSERT(strcmp(uv_handle_type_name(UV_UDP), "udp") == 0);
    -  ASSERT(strcmp(uv_handle_type_name(UV_FILE), "file") == 0);
    +  ASSERT_OK(strcmp(uv_handle_type_name(UV_NAMED_PIPE), "pipe"));
    +  ASSERT_OK(strcmp(uv_handle_type_name(UV_UDP), "udp"));
    +  ASSERT_OK(strcmp(uv_handle_type_name(UV_FILE), "file"));
       ASSERT_NULL(uv_handle_type_name(UV_HANDLE_TYPE_MAX));
       ASSERT_NULL(uv_handle_type_name(UV_HANDLE_TYPE_MAX + 1));
       ASSERT_NULL(uv_handle_type_name(UV_UNKNOWN_HANDLE));
    @@ -41,9 +41,9 @@ TEST_IMPL(handle_type_name) {
     
     
     TEST_IMPL(req_type_name) {
    -  ASSERT(strcmp(uv_req_type_name(UV_REQ), "req") == 0);
    -  ASSERT(strcmp(uv_req_type_name(UV_UDP_SEND), "udp_send") == 0);
    -  ASSERT(strcmp(uv_req_type_name(UV_WORK), "work") == 0);
    +  ASSERT_OK(strcmp(uv_req_type_name(UV_REQ), "req"));
    +  ASSERT_OK(strcmp(uv_req_type_name(UV_UDP_SEND), "udp_send"));
    +  ASSERT_OK(strcmp(uv_req_type_name(UV_WORK), "work"));
       ASSERT_NULL(uv_req_type_name(UV_REQ_TYPE_MAX));
       ASSERT_NULL(uv_req_type_name(UV_REQ_TYPE_MAX + 1));
       ASSERT_NULL(uv_req_type_name(UV_UNKNOWN_REQ));
    @@ -60,48 +60,48 @@ TEST_IMPL(getters_setters) {
       loop = malloc(uv_loop_size());
       ASSERT_NOT_NULL(loop);
       r = uv_loop_init(loop);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_loop_set_data(loop, &cookie1);
    -  ASSERT(loop->data == &cookie1);
    -  ASSERT(uv_loop_get_data(loop) == &cookie1);
    +  ASSERT_PTR_EQ(loop->data, &cookie1);
    +  ASSERT_PTR_EQ(uv_loop_get_data(loop), &cookie1);
     
       pipe = malloc(uv_handle_size(UV_NAMED_PIPE));
       r = uv_pipe_init(loop, pipe, 0);
    -  ASSERT(r == 0);
    -  ASSERT(uv_handle_get_type((uv_handle_t*)pipe) == UV_NAMED_PIPE);
    +  ASSERT_OK(r);
    +  ASSERT_EQ(uv_handle_get_type((uv_handle_t*)pipe), UV_NAMED_PIPE);
     
    -  ASSERT(uv_handle_get_loop((uv_handle_t*)pipe) == loop);
    +  ASSERT_PTR_EQ(uv_handle_get_loop((uv_handle_t*)pipe), loop);
       pipe->data = &cookie2;
    -  ASSERT(uv_handle_get_data((uv_handle_t*)pipe) == &cookie2);
    +  ASSERT_PTR_EQ(uv_handle_get_data((uv_handle_t*)pipe), &cookie2);
       uv_handle_set_data((uv_handle_t*)pipe, &cookie1);
    -  ASSERT(uv_handle_get_data((uv_handle_t*)pipe) == &cookie1);
    -  ASSERT(pipe->data == &cookie1);
    +  ASSERT_PTR_EQ(uv_handle_get_data((uv_handle_t*)pipe), &cookie1);
    +  ASSERT_PTR_EQ(pipe->data, &cookie1);
     
    -  ASSERT(uv_stream_get_write_queue_size((uv_stream_t*)pipe) == 0);
    +  ASSERT_OK(uv_stream_get_write_queue_size((uv_stream_t*)pipe));
       pipe->write_queue_size++;
    -  ASSERT(uv_stream_get_write_queue_size((uv_stream_t*)pipe) == 1);
    +  ASSERT_EQ(1, uv_stream_get_write_queue_size((uv_stream_t*)pipe));
       pipe->write_queue_size--;
       uv_close((uv_handle_t*)pipe, NULL);
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       fs = malloc(uv_req_size(UV_FS));
       uv_fs_stat(loop, fs, ".", NULL);
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(uv_fs_get_type(fs) == UV_FS_STAT);
    -  ASSERT(uv_fs_get_result(fs) == 0);
    -  ASSERT(uv_fs_get_ptr(fs) == uv_fs_get_statbuf(fs));
    +  ASSERT_EQ(uv_fs_get_type(fs), UV_FS_STAT);
    +  ASSERT_OK(uv_fs_get_result(fs));
    +  ASSERT_PTR_EQ(uv_fs_get_ptr(fs), uv_fs_get_statbuf(fs));
       ASSERT(uv_fs_get_statbuf(fs)->st_mode & S_IFDIR);
    -  ASSERT(strcmp(uv_fs_get_path(fs), ".") == 0);
    +  ASSERT_OK(strcmp(uv_fs_get_path(fs), "."));
       uv_fs_req_cleanup(fs);
     
       r = uv_loop_close(loop);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       free(pipe);
       free(fs);
    diff --git a/deps/uv/test/test-gettimeofday.c b/deps/uv/test/test-gettimeofday.c
    index 4ebc11f93ed321..7d9012815c4022 100644
    --- a/deps/uv/test/test-gettimeofday.c
    +++ b/deps/uv/test/test-gettimeofday.c
    @@ -28,12 +28,12 @@ TEST_IMPL(gettimeofday) {
     
       tv.tv_sec = 0;
       r = uv_gettimeofday(&tv);
    -  ASSERT(r == 0);
    -  ASSERT(tv.tv_sec != 0);
    +  ASSERT_OK(r);
    +  ASSERT_NE(0, tv.tv_sec);
     
       /* Test invalid input. */
       r = uv_gettimeofday(NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       return 0;
     }
    diff --git a/deps/uv/test/test-handle-fileno.c b/deps/uv/test/test-handle-fileno.c
    index 6c4c2b6601d4a3..be53152ce8459c 100644
    --- a/deps/uv/test/test-handle-fileno.c
    +++ b/deps/uv/test/test-handle-fileno.c
    @@ -56,49 +56,49 @@ TEST_IMPL(handle_fileno) {
       uv_loop_t* loop;
     
       loop = uv_default_loop();
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       r = uv_idle_init(loop, &idle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fileno((uv_handle_t*) &idle, &fd);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       uv_close((uv_handle_t*) &idle, NULL);
     
       r = uv_tcp_init(loop, &tcp);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fileno((uv_handle_t*) &tcp, &fd);
    -  ASSERT(r == UV_EBADF);
    +  ASSERT_EQ(r, UV_EBADF);
       r = uv_tcp_bind(&tcp, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fileno((uv_handle_t*) &tcp, &fd);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_close((uv_handle_t*) &tcp, NULL);
       r = uv_fileno((uv_handle_t*) &tcp, &fd);
    -  ASSERT(r == UV_EBADF);
    +  ASSERT_EQ(r, UV_EBADF);
     
       r = uv_udp_init(loop, &udp);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fileno((uv_handle_t*) &udp, &fd);
    -  ASSERT(r == UV_EBADF);
    +  ASSERT_EQ(r, UV_EBADF);
       r = uv_udp_bind(&udp, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fileno((uv_handle_t*) &udp, &fd);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_close((uv_handle_t*) &udp, NULL);
       r = uv_fileno((uv_handle_t*) &udp, &fd);
    -  ASSERT(r == UV_EBADF);
    +  ASSERT_EQ(r, UV_EBADF);
     
       r = uv_pipe_init(loop, &pipe, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fileno((uv_handle_t*) &pipe, &fd);
    -  ASSERT(r == UV_EBADF);
    +  ASSERT_EQ(r, UV_EBADF);
       r = uv_pipe_bind(&pipe, TEST_PIPENAME);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_fileno((uv_handle_t*) &pipe, &fd);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_close((uv_handle_t*) &pipe, NULL);
       r = uv_fileno((uv_handle_t*) &pipe, &fd);
    -  ASSERT(r == UV_EBADF);
    +  ASSERT_EQ(r, UV_EBADF);
     
       tty_fd = get_tty_fd();
       if (tty_fd < 0) {
    @@ -106,14 +106,14 @@ TEST_IMPL(handle_fileno) {
         fflush(stderr);
       } else {
         r = uv_tty_init(loop, &tty, tty_fd, 0);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         ASSERT(uv_is_readable((uv_stream_t*) &tty));
         ASSERT(!uv_is_writable((uv_stream_t*) &tty));
         r = uv_fileno((uv_handle_t*) &tty, &fd);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         uv_close((uv_handle_t*) &tty, NULL);
         r = uv_fileno((uv_handle_t*) &tty, &fd);
    -    ASSERT(r == UV_EBADF);
    +    ASSERT_EQ(r, UV_EBADF);
         ASSERT(!uv_is_readable((uv_stream_t*) &tty));
         ASSERT(!uv_is_writable((uv_stream_t*) &tty));
       }
    diff --git a/deps/uv/test/test-homedir.c b/deps/uv/test/test-homedir.c
    index 508351f72c0327..769d5c8179fc77 100644
    --- a/deps/uv/test/test-homedir.c
    +++ b/deps/uv/test/test-homedir.c
    @@ -34,39 +34,39 @@ TEST_IMPL(homedir) {
       /* Test the normal case */
       len = sizeof homedir;
       homedir[0] = '\0';
    -  ASSERT(strlen(homedir) == 0);
    +  ASSERT_OK(strlen(homedir));
       r = uv_os_homedir(homedir, &len);
    -  ASSERT(r == 0);
    -  ASSERT(strlen(homedir) == len);
    -  ASSERT(len > 0);
    -  ASSERT(homedir[len] == '\0');
    +  ASSERT_OK(r);
    +  ASSERT_EQ(strlen(homedir), len);
    +  ASSERT_GT(len, 0);
    +  ASSERT_EQ(homedir[len], '\0');
     
     #ifdef _WIN32
       if (len == 3 && homedir[1] == ':')
    -    ASSERT(homedir[2] == '\\');
    +    ASSERT_EQ(homedir[2], '\\');
       else
    -    ASSERT(homedir[len - 1] != '\\');
    +    ASSERT_NE(homedir[len - 1], '\\');
     #else
       if (len == 1)
    -    ASSERT(homedir[0] == '/');
    +    ASSERT_EQ(homedir[0], '/');
       else
    -    ASSERT(homedir[len - 1] != '/');
    +    ASSERT_NE(homedir[len - 1], '/');
     #endif
     
       /* Test the case where the buffer is too small */
       len = SMALLPATH;
       r = uv_os_homedir(homedir, &len);
    -  ASSERT(r == UV_ENOBUFS);
    -  ASSERT(len > SMALLPATH);
    +  ASSERT_EQ(r, UV_ENOBUFS);
    +  ASSERT_GT(len, SMALLPATH);
     
       /* Test invalid inputs */
       r = uv_os_homedir(NULL, &len);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       r = uv_os_homedir(homedir, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       len = 0;
       r = uv_os_homedir(homedir, &len);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       return 0;
     }
    diff --git a/deps/uv/test/test-hrtime.c b/deps/uv/test/test-hrtime.c
    index 854a482f23c189..c0b88c6757def7 100644
    --- a/deps/uv/test/test-hrtime.c
    +++ b/deps/uv/test/test-hrtime.c
    @@ -45,7 +45,7 @@ TEST_IMPL(hrtime) {
          * that the difference between the two hrtime values has a reasonable
          * lower bound.
          */
    -    ASSERT(diff > (uint64_t) 25 * NANOSEC / MILLISEC);
    +    ASSERT_UINT64_GT(diff, (uint64_t) 25 * NANOSEC / MILLISEC);
         --i;
       }
       return 0;
    @@ -57,8 +57,8 @@ TEST_IMPL(clock_gettime) {
     
       ASSERT_EQ(UV_EINVAL, uv_clock_gettime(1337, &t));
       ASSERT_EQ(UV_EFAULT, uv_clock_gettime(1337, NULL));
    -  ASSERT_EQ(0, uv_clock_gettime(UV_CLOCK_MONOTONIC, &t));
    -  ASSERT_EQ(0, uv_clock_gettime(UV_CLOCK_REALTIME, &t));
    +  ASSERT_OK(uv_clock_gettime(UV_CLOCK_MONOTONIC, &t));
    +  ASSERT_OK(uv_clock_gettime(UV_CLOCK_REALTIME, &t));
       ASSERT_GT(1682500000000ll, t.tv_sec);  /* 2023-04-26T09:06:40.000Z */
     
       return 0;
    diff --git a/deps/uv/test/test-idle.c b/deps/uv/test/test-idle.c
    index e3f4c2bcb659f9..069e3483580568 100644
    --- a/deps/uv/test/test-idle.c
    +++ b/deps/uv/test/test-idle.c
    @@ -39,7 +39,7 @@ static void close_cb(uv_handle_t* handle) {
     
     
     static void timer_cb(uv_timer_t* handle) {
    -  ASSERT(handle == &timer_handle);
    +  ASSERT_PTR_EQ(handle, &timer_handle);
     
       uv_close((uv_handle_t*) &idle_handle, close_cb);
       uv_close((uv_handle_t*) &check_handle, close_cb);
    @@ -52,7 +52,7 @@ static void timer_cb(uv_timer_t* handle) {
     
     
     static void idle_cb(uv_idle_t* handle) {
    -  ASSERT(handle == &idle_handle);
    +  ASSERT_PTR_EQ(handle, &idle_handle);
     
       idle_cb_called++;
       fprintf(stderr, "idle_cb %d\n", idle_cb_called);
    @@ -61,7 +61,7 @@ static void idle_cb(uv_idle_t* handle) {
     
     
     static void check_cb(uv_check_t* handle) {
    -  ASSERT(handle == &check_handle);
    +  ASSERT_PTR_EQ(handle, &check_handle);
     
       check_cb_called++;
       fprintf(stderr, "check_cb %d\n", check_cb_called);
    @@ -73,26 +73,26 @@ TEST_IMPL(idle_starvation) {
       int r;
     
       r = uv_idle_init(uv_default_loop(), &idle_handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_idle_start(&idle_handle, idle_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_check_init(uv_default_loop(), &check_handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_check_start(&check_handle, check_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_timer_init(uv_default_loop(), &timer_handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_timer_start(&timer_handle, timer_cb, 50, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(idle_cb_called > 0);
    -  ASSERT(timer_cb_called == 1);
    -  ASSERT(close_cb_called == 3);
    +  ASSERT_GT(idle_cb_called, 0);
    +  ASSERT_EQ(1, timer_cb_called);
    +  ASSERT_EQ(3, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -105,19 +105,19 @@ static void idle_stop(uv_idle_t* handle) {
     
     
     TEST_IMPL(idle_check) {
    -  ASSERT_EQ(0, uv_idle_init(uv_default_loop(), &idle_handle));
    -  ASSERT_EQ(0, uv_idle_start(&idle_handle, idle_stop));
    +  ASSERT_OK(uv_idle_init(uv_default_loop(), &idle_handle));
    +  ASSERT_OK(uv_idle_start(&idle_handle, idle_stop));
     
    -  ASSERT_EQ(0, uv_check_init(uv_default_loop(), &check_handle));
    -  ASSERT_EQ(0, uv_check_start(&check_handle, check_cb));
    +  ASSERT_OK(uv_check_init(uv_default_loop(), &check_handle));
    +  ASSERT_OK(uv_check_start(&check_handle, check_cb));
     
       ASSERT_EQ(1, uv_run(uv_default_loop(), UV_RUN_ONCE));
       ASSERT_EQ(1, check_cb_called);
     
    -  ASSERT_EQ(0, close_cb_called);
    +  ASSERT_OK(close_cb_called);
       uv_close((uv_handle_t*) &idle_handle, close_cb);
       uv_close((uv_handle_t*) &check_handle, close_cb);
    -  ASSERT_EQ(0, uv_run(uv_default_loop(), UV_RUN_ONCE));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_ONCE));
       ASSERT_EQ(2, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
    diff --git a/deps/uv/test/test-idna.c b/deps/uv/test/test-idna.c
    index 9b7002819fa354..bcacfc8a3ad785 100644
    --- a/deps/uv/test/test-idna.c
    +++ b/deps/uv/test/test-idna.c
    @@ -20,6 +20,7 @@
      */
     
     #include "task.h"
    +#define uv__malloc malloc
     #include "../src/idna.c"
     #include 
     
    @@ -31,66 +32,66 @@ TEST_IMPL(utf8_decode1) {
       /* ASCII. */
       p = b;
       snprintf(b, sizeof(b), "%c\x7F", 0x00);
    -  ASSERT(0 == uv__utf8_decode1(&p, b + sizeof(b)));
    -  ASSERT(p == b + 1);
    -  ASSERT(127 == uv__utf8_decode1(&p, b + sizeof(b)));
    -  ASSERT(p == b + 2);
    +  ASSERT_OK(uv__utf8_decode1(&p, b + sizeof(b)));
    +  ASSERT_PTR_EQ(p, b + 1);
    +  ASSERT_EQ(127, uv__utf8_decode1(&p, b + sizeof(b)));
    +  ASSERT_PTR_EQ(p, b + 2);
     
       /* Two-byte sequences. */
       p = b;
       snprintf(b, sizeof(b), "\xC2\x80\xDF\xBF");
    -  ASSERT(128 == uv__utf8_decode1(&p, b + sizeof(b)));
    -  ASSERT(p == b + 2);
    -  ASSERT(0x7FF == uv__utf8_decode1(&p, b + sizeof(b)));
    -  ASSERT(p == b + 4);
    +  ASSERT_EQ(128, uv__utf8_decode1(&p, b + sizeof(b)));
    +  ASSERT_PTR_EQ(p, b + 2);
    +  ASSERT_EQ(0x7FF, uv__utf8_decode1(&p, b + sizeof(b)));
    +  ASSERT_PTR_EQ(p, b + 4);
     
       /* Three-byte sequences. */
       p = b;
       snprintf(b, sizeof(b), "\xE0\xA0\x80\xEF\xBF\xBF");
    -  ASSERT(0x800 == uv__utf8_decode1(&p, b + sizeof(b)));
    -  ASSERT(p == b + 3);
    -  ASSERT(0xFFFF == uv__utf8_decode1(&p, b + sizeof(b)));
    -  ASSERT(p == b + 6);
    +  ASSERT_EQ(0x800, uv__utf8_decode1(&p, b + sizeof(b)));
    +  ASSERT_PTR_EQ(p, b + 3);
    +  ASSERT_EQ(0xFFFF, uv__utf8_decode1(&p, b + sizeof(b)));
    +  ASSERT_PTR_EQ(p, b + 6);
     
       /* Four-byte sequences. */
       p = b;
       snprintf(b, sizeof(b), "\xF0\x90\x80\x80\xF4\x8F\xBF\xBF");
    -  ASSERT(0x10000 == uv__utf8_decode1(&p, b + sizeof(b)));
    -  ASSERT(p == b + 4);
    -  ASSERT(0x10FFFF == uv__utf8_decode1(&p, b + sizeof(b)));
    -  ASSERT(p == b + 8);
    +  ASSERT_EQ(0x10000, uv__utf8_decode1(&p, b + sizeof(b)));
    +  ASSERT_PTR_EQ(p, b + 4);
    +  ASSERT_EQ(0x10FFFF, uv__utf8_decode1(&p, b + sizeof(b)));
    +  ASSERT_PTR_EQ(p, b + 8);
     
       /* Four-byte sequences > U+10FFFF; disallowed. */
       p = b;
       snprintf(b, sizeof(b), "\xF4\x90\xC0\xC0\xF7\xBF\xBF\xBF");
    -  ASSERT((unsigned) -1 == uv__utf8_decode1(&p, b + sizeof(b)));
    -  ASSERT(p == b + 4);
    -  ASSERT((unsigned) -1 == uv__utf8_decode1(&p, b + sizeof(b)));
    -  ASSERT(p == b + 8);
    +  ASSERT_EQ((unsigned) -1, uv__utf8_decode1(&p, b + sizeof(b)));
    +  ASSERT_PTR_EQ(p, b + 4);
    +  ASSERT_EQ((unsigned) -1, uv__utf8_decode1(&p, b + sizeof(b)));
    +  ASSERT_PTR_EQ(p, b + 8);
     
       /* Overlong; disallowed. */
       p = b;
       snprintf(b, sizeof(b), "\xC0\x80\xC1\x80");
    -  ASSERT((unsigned) -1 == uv__utf8_decode1(&p, b + sizeof(b)));
    -  ASSERT(p == b + 2);
    -  ASSERT((unsigned) -1 == uv__utf8_decode1(&p, b + sizeof(b)));
    -  ASSERT(p == b + 4);
    +  ASSERT_EQ((unsigned) -1, uv__utf8_decode1(&p, b + sizeof(b)));
    +  ASSERT_PTR_EQ(p, b + 2);
    +  ASSERT_EQ((unsigned) -1, uv__utf8_decode1(&p, b + sizeof(b)));
    +  ASSERT_PTR_EQ(p, b + 4);
     
       /* Surrogate pairs; disallowed. */
       p = b;
       snprintf(b, sizeof(b), "\xED\xA0\x80\xED\xA3\xBF");
    -  ASSERT((unsigned) -1 == uv__utf8_decode1(&p, b + sizeof(b)));
    -  ASSERT(p == b + 3);
    -  ASSERT((unsigned) -1 == uv__utf8_decode1(&p, b + sizeof(b)));
    -  ASSERT(p == b + 6);
    +  ASSERT_EQ((unsigned) -1, uv__utf8_decode1(&p, b + sizeof(b)));
    +  ASSERT_PTR_EQ(p, b + 3);
    +  ASSERT_EQ((unsigned) -1, uv__utf8_decode1(&p, b + sizeof(b)));
    +  ASSERT_PTR_EQ(p, b + 6);
     
       /* Simply illegal. */
       p = b;
       snprintf(b, sizeof(b), "\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF");
     
       for (i = 1; i <= 8; i++) {
    -    ASSERT((unsigned) -1 == uv__utf8_decode1(&p, b + sizeof(b)));
    -    ASSERT(p == b + i);
    +    ASSERT_EQ((unsigned) -1, uv__utf8_decode1(&p, b + sizeof(b)));
    +    ASSERT_PTR_EQ(p, b + i);
       }
     
       return 0;
    @@ -122,7 +123,7 @@ TEST_IMPL(utf8_decode1_overrun) {
       do {                                                                        \
         char d[256] = {0};                                                        \
         static const char s[] = "" input "";                                      \
    -    ASSERT(err == uv__idna_toascii(s, s + sizeof(s) - 1, d, d + sizeof(d)));  \
    +    ASSERT_EQ(err, uv__idna_toascii(s, s + sizeof(s) - 1, d, d + sizeof(d))); \
       } while (0)
     
     #define T(input, expected)                                                    \
    @@ -132,13 +133,13 @@ TEST_IMPL(utf8_decode1_overrun) {
         char d2[256] = {0};                                                       \
         static const char s[] = "" input "";                                      \
         n = uv__idna_toascii(s, s + sizeof(s) - 1, d1, d1 + sizeof(d1));          \
    -    ASSERT(n == sizeof(expected));                                            \
    -    ASSERT(0 == memcmp(d1, expected, n));                                     \
    +    ASSERT_EQ(n, sizeof(expected));                                           \
    +    ASSERT_OK(memcmp(d1, expected, n));                                       \
         /* Sanity check: encoding twice should not change the output. */          \
         n = uv__idna_toascii(d1, d1 + strlen(d1), d2, d2 + sizeof(d2));           \
    -    ASSERT(n == sizeof(expected));                                            \
    -    ASSERT(0 == memcmp(d2, expected, n));                                     \
    -    ASSERT(0 == memcmp(d1, d2, sizeof(d2)));                                  \
    +    ASSERT_EQ(n, sizeof(expected));                                           \
    +    ASSERT_OK(memcmp(d2, expected, n));                                       \
    +    ASSERT_OK(memcmp(d1, d2, sizeof(d2)));                                    \
       } while (0)
     
     TEST_IMPL(idna_toascii) {
    diff --git a/deps/uv/test/test-ip-name.c b/deps/uv/test/test-ip-name.c
    index 006095f5f9731b..cdc0c563427ca8 100644
    --- a/deps/uv/test/test-ip-name.c
    +++ b/deps/uv/test/test-ip-name.c
    @@ -40,20 +40,20 @@ TEST_IMPL(ip_name) {
         struct sockaddr_in6* addr6 = &test_addr.addr6;
     
         /* test ip4_name */
    -    ASSERT_EQ(0, uv_ip4_addr("192.168.0.1", TEST_PORT, addr4));
    -    ASSERT_EQ(0, uv_ip4_name(addr4, dst, INET_ADDRSTRLEN));
    -    ASSERT_EQ(0, strcmp("192.168.0.1", dst));
    +    ASSERT_OK(uv_ip4_addr("192.168.0.1", TEST_PORT, addr4));
    +    ASSERT_OK(uv_ip4_name(addr4, dst, INET_ADDRSTRLEN));
    +    ASSERT_OK(strcmp("192.168.0.1", dst));
     
    -    ASSERT_EQ(0, uv_ip_name(addr, dst, INET_ADDRSTRLEN));
    -    ASSERT_EQ(0, strcmp("192.168.0.1", dst));
    +    ASSERT_OK(uv_ip_name(addr, dst, INET_ADDRSTRLEN));
    +    ASSERT_OK(strcmp("192.168.0.1", dst));
     
         /* test ip6_name */
    -    ASSERT_EQ(0, uv_ip6_addr("fe80::2acf:daff:fedd:342a", TEST_PORT, addr6));
    -    ASSERT_EQ(0, uv_ip6_name(addr6, dst, INET6_ADDRSTRLEN));
    -    ASSERT_EQ(0, strcmp("fe80::2acf:daff:fedd:342a", dst));
    +    ASSERT_OK(uv_ip6_addr("fe80::2acf:daff:fedd:342a", TEST_PORT, addr6));
    +    ASSERT_OK(uv_ip6_name(addr6, dst, INET6_ADDRSTRLEN));
    +    ASSERT_OK(strcmp("fe80::2acf:daff:fedd:342a", dst));
     
    -    ASSERT_EQ(0, uv_ip_name(addr, dst, INET6_ADDRSTRLEN));
    -    ASSERT_EQ(0, strcmp("fe80::2acf:daff:fedd:342a", dst));
    +    ASSERT_OK(uv_ip_name(addr, dst, INET6_ADDRSTRLEN));
    +    ASSERT_OK(strcmp("fe80::2acf:daff:fedd:342a", dst));
     
         /* test other sa_family */
         addr->sa_family = AF_UNIX;
    diff --git a/deps/uv/test/test-ip4-addr.c b/deps/uv/test/test-ip4-addr.c
    index 722ffb390a99e4..4a16c832d33ee7 100644
    --- a/deps/uv/test/test-ip4-addr.c
    +++ b/deps/uv/test/test-ip4-addr.c
    @@ -30,25 +30,25 @@ TEST_IMPL(ip4_addr) {
       struct sockaddr_in addr;
       char dst[16];
     
    -  ASSERT(0 == uv_inet_ntop(AF_INET, "\xFF\xFF\xFF\xFF", dst, sizeof(dst)));
    -  ASSERT(0 == strcmp(dst, "255.255.255.255"));
    -  ASSERT(UV_ENOSPC == uv_inet_ntop(AF_INET, "\xFF\xFF\xFF\xFF",
    -                                   dst, sizeof(dst) - 1));
    -
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    -  ASSERT(0 == uv_ip4_addr("255.255.255.255", TEST_PORT, &addr));
    -  ASSERT(UV_EINVAL == uv_ip4_addr("255.255.255*000", TEST_PORT, &addr));
    -  ASSERT(UV_EINVAL == uv_ip4_addr("255.255.255.256", TEST_PORT, &addr));
    -  ASSERT(UV_EINVAL == uv_ip4_addr("2555.0.0.0", TEST_PORT, &addr));
    -  ASSERT(UV_EINVAL == uv_ip4_addr("255", TEST_PORT, &addr));
    +  ASSERT_OK(uv_inet_ntop(AF_INET, "\xFF\xFF\xFF\xFF", dst, sizeof(dst)));
    +  ASSERT_OK(strcmp(dst, "255.255.255.255"));
    +  ASSERT_EQ(UV_ENOSPC, uv_inet_ntop(AF_INET, "\xFF\xFF\xFF\xFF",
    +                                    dst, sizeof(dst) - 1));
    +
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("255.255.255.255", TEST_PORT, &addr));
    +  ASSERT_EQ(UV_EINVAL, uv_ip4_addr("255.255.255*000", TEST_PORT, &addr));
    +  ASSERT_EQ(UV_EINVAL, uv_ip4_addr("255.255.255.256", TEST_PORT, &addr));
    +  ASSERT_EQ(UV_EINVAL, uv_ip4_addr("2555.0.0.0", TEST_PORT, &addr));
    +  ASSERT_EQ(UV_EINVAL, uv_ip4_addr("255", TEST_PORT, &addr));
     
     #ifdef SIN6_LEN
    -  ASSERT(addr.sin_len == sizeof(addr));
    +  ASSERT_EQ(addr.sin_len, sizeof(addr));
     #endif
     
       /* for broken address family */
    -  ASSERT(UV_EAFNOSUPPORT == uv_inet_pton(42, "127.0.0.1",
    -    &addr.sin_addr.s_addr));
    +  ASSERT_EQ(UV_EAFNOSUPPORT, uv_inet_pton(42, "127.0.0.1",
    +                                          &addr.sin_addr.s_addr));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-ip6-addr.c b/deps/uv/test/test-ip6-addr.c
    index 8f0c18601ba815..632b7928994950 100644
    --- a/deps/uv/test/test-ip6-addr.c
    +++ b/deps/uv/test/test-ip6-addr.c
    @@ -51,7 +51,7 @@ TEST_IMPL(ip6_addr_link_local) {
       int ix;
       int r;
     
    -  ASSERT(0 == uv_interface_addresses(&addresses, &count));
    +  ASSERT_OK(uv_interface_addresses(&addresses, &count));
     
       for (ix = 0; ix < count; ix++) {
         address = addresses + ix;
    @@ -59,10 +59,10 @@ TEST_IMPL(ip6_addr_link_local) {
         if (address->address.address6.sin6_family != AF_INET6)
           continue;
     
    -    ASSERT(0 == uv_inet_ntop(AF_INET6,
    -                             &address->address.address6.sin6_addr,
    -                             string_address,
    -                             sizeof(string_address)));
    +    ASSERT_OK(uv_inet_ntop(AF_INET6,
    +                           &address->address.address6.sin6_addr,
    +                           string_address,
    +                           sizeof(string_address)));
     
         /* Skip addresses that are not link-local. */
         if (strncmp(string_address, "fe80::", 6) != 0)
    @@ -72,21 +72,23 @@ TEST_IMPL(ip6_addr_link_local) {
         device_name = address->name;
     
         scoped_addr_len = sizeof(scoped_addr);
    -    ASSERT(0 == uv_if_indextoname(iface_index, scoped_addr, &scoped_addr_len));
    +    ASSERT_OK(uv_if_indextoname(iface_index,
    +                                scoped_addr,
    +                                &scoped_addr_len));
     #ifndef _WIN32
         /* This assert fails on Windows, as Windows semantics are different. */
    -    ASSERT(0 == strcmp(device_name, scoped_addr));
    +    ASSERT_OK(strcmp(device_name, scoped_addr));
     #endif
     
         interface_id_len = sizeof(interface_id);
         r = uv_if_indextoiid(iface_index, interface_id, &interface_id_len);
    -    ASSERT(0 == r);
    +    ASSERT_OK(r);
     #ifdef _WIN32
         /* On Windows, the interface identifier is the numeric string of the index. */
    -    ASSERT(strtoul(interface_id, NULL, 10) == iface_index);
    +    ASSERT_EQ(strtoul(interface_id, NULL, 10), iface_index);
     #else
         /* On Unix/Linux, the interface identifier is the interface device name. */
    -    ASSERT(0 == strcmp(device_name, interface_id));
    +    ASSERT_OK(strcmp(device_name, interface_id));
     #endif
     
         snprintf(scoped_addr,
    @@ -102,16 +104,18 @@ TEST_IMPL(ip6_addr_link_local) {
                 device_name);
         fflush(stderr);
     
    -    ASSERT(0 == uv_ip6_addr(scoped_addr, TEST_PORT, &addr));
    +    ASSERT_OK(uv_ip6_addr(scoped_addr, TEST_PORT, &addr));
         fprintf(stderr, "Got scope_id 0x%2x\n", (unsigned)addr.sin6_scope_id);
         fflush(stderr);
    -    ASSERT(iface_index == addr.sin6_scope_id);
    +    ASSERT_EQ(iface_index, addr.sin6_scope_id);
       }
     
       uv_free_interface_addresses(addresses, count);
     
       scoped_addr_len = sizeof(scoped_addr);
    -  ASSERT(0 != uv_if_indextoname((unsigned int)-1, scoped_addr, &scoped_addr_len));
    +  ASSERT_NE(0, uv_if_indextoname((unsigned int)-1,
    +                                 scoped_addr,
    +                                 &scoped_addr_len));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -137,16 +141,16 @@ TEST_IMPL(ip6_addr_link_local) {
         X("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255.255")                    \
     
     #define TEST_GOOD(ADDR)                                                       \
    -    ASSERT(0 == uv_inet_pton(AF_INET6, ADDR, &addr));                         \
    -    ASSERT(0 == uv_inet_pton(AF_INET6, ADDR "%en1", &addr));                  \
    -    ASSERT(0 == uv_inet_pton(AF_INET6, ADDR "%%%%", &addr));                  \
    -    ASSERT(0 == uv_inet_pton(AF_INET6, ADDR "%en1:1.2.3.4", &addr));          \
    +    ASSERT_OK(uv_inet_pton(AF_INET6, ADDR, &addr));                           \
    +    ASSERT_OK(uv_inet_pton(AF_INET6, ADDR "%en1", &addr));                    \
    +    ASSERT_OK(uv_inet_pton(AF_INET6, ADDR "%%%%", &addr));                    \
    +    ASSERT_OK(uv_inet_pton(AF_INET6, ADDR "%en1:1.2.3.4", &addr));            \
     
     #define TEST_BAD(ADDR)                                                        \
    -    ASSERT(0 != uv_inet_pton(AF_INET6, ADDR, &addr));                         \
    -    ASSERT(0 != uv_inet_pton(AF_INET6, ADDR "%en1", &addr));                  \
    -    ASSERT(0 != uv_inet_pton(AF_INET6, ADDR "%%%%", &addr));                  \
    -    ASSERT(0 != uv_inet_pton(AF_INET6, ADDR "%en1:1.2.3.4", &addr));          \
    +    ASSERT_NE(0, uv_inet_pton(AF_INET6, ADDR, &addr));                        \
    +    ASSERT_NE(0, uv_inet_pton(AF_INET6, ADDR "%en1", &addr));                 \
    +    ASSERT_NE(0, uv_inet_pton(AF_INET6, ADDR "%%%%", &addr));                 \
    +    ASSERT_NE(0, uv_inet_pton(AF_INET6, ADDR "%en1:1.2.3.4", &addr));         \
     
     TEST_IMPL(ip6_pton) {
       struct in6_addr addr;
    @@ -163,9 +167,9 @@ TEST_IMPL(ip6_pton) {
     
     TEST_IMPL(ip6_sin6_len) {
       struct sockaddr_in6 s;
    -  ASSERT_EQ(0, uv_ip6_addr("::", 0, &s));
    +  ASSERT_OK(uv_ip6_addr("::", 0, &s));
     #ifdef SIN6_LEN
    -  ASSERT(s.sin6_len == sizeof(s));
    +  ASSERT_EQ(s.sin6_len, sizeof(s));
     #endif
       return 0;
     }
    diff --git a/deps/uv/test/test-ipc-heavy-traffic-deadlock-bug.c b/deps/uv/test/test-ipc-heavy-traffic-deadlock-bug.c
    index f239d1fc01fb7e..0305500abfbcb3 100644
    --- a/deps/uv/test/test-ipc-heavy-traffic-deadlock-bug.c
    +++ b/deps/uv/test/test-ipc-heavy-traffic-deadlock-bug.c
    @@ -49,7 +49,7 @@ static size_t bytes_read;
     static void write_cb(uv_write_t* req, int status) {
       struct write_info* write_info =
           container_of(req, struct write_info, write_req);
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       bytes_written += BUFFERS_PER_WRITE * BUFFER_SIZE;
       free(write_info);
     }
    @@ -75,7 +75,7 @@ static void do_write(uv_stream_t* handle) {
     
       r = uv_write(
           &write_info->write_req, handle, bufs, BUFFERS_PER_WRITE, write_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     static void alloc_cb(uv_handle_t* handle,
    @@ -94,18 +94,18 @@ static void read_cb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) {
       ssize_t i;
       int r;
     
    -  ASSERT(nread >= 0);
    +  ASSERT_GE(nread, 0);
       bytes_read += nread;
     
       for (i = 0; i < nread; i++)
    -    ASSERT(buf->base[i] == BUFFER_CONTENT);
    +    ASSERT_EQ(buf->base[i], BUFFER_CONTENT);
       free(buf->base);
     
       if (bytes_read >= XFER_SIZE) {
         r = uv_read_stop(handle);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         r = uv_shutdown(&shutdown_req, handle, shutdown_cb);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     }
     
    @@ -121,13 +121,13 @@ static void do_writes_and_reads(uv_stream_t* handle) {
       }
     
       r = uv_read_start(handle, alloc_cb, read_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(handle->loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(bytes_written == XFER_SIZE);
    -  ASSERT(bytes_read == XFER_SIZE);
    +  ASSERT_EQ(bytes_written, XFER_SIZE);
    +  ASSERT_EQ(bytes_read, XFER_SIZE);
     }
     
     TEST_IMPL(ipc_heavy_traffic_deadlock_bug) {
    @@ -146,9 +146,9 @@ int ipc_helper_heavy_traffic_deadlock_bug(void) {
       int r;
     
       r = uv_pipe_init(uv_default_loop(), &pipe, 1);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_pipe_open(&pipe, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       notify_parent_process();
       do_writes_and_reads((uv_stream_t*) &pipe);
    diff --git a/deps/uv/test/test-ipc-send-recv.c b/deps/uv/test/test-ipc-send-recv.c
    index 48eea7286b87d9..0cdd881be05d87 100644
    --- a/deps/uv/test/test-ipc-send-recv.c
    +++ b/deps/uv/test/test-ipc-send-recv.c
    @@ -96,7 +96,7 @@ static void recv_cb(uv_stream_t* handle,
       free(buf->base);
     
       pipe = (uv_pipe_t*) handle;
    -  ASSERT(pipe == &ctx.channel);
    +  ASSERT_PTR_EQ(pipe, &ctx.channel);
     
       do {
         if (++recv_cb_count == 1) {
    @@ -112,13 +112,13 @@ static void recv_cb(uv_stream_t* handle,
          * acceptable value. */
         if (nread == UV_EOF) {
           /* UV_EOF is only acceptable for the final recv_cb call */
    -      ASSERT(recv_cb_count == 2);
    +      ASSERT_EQ(2, recv_cb_count);
         } else {
    -      ASSERT(nread >= 0);
    -      ASSERT(uv_pipe_pending_count(pipe) > 0);
    +      ASSERT_GE(nread, 0);
    +      ASSERT_GT(uv_pipe_pending_count(pipe), 0);
     
           pending = uv_pipe_pending_type(pipe);
    -      ASSERT(pending == ctx.expected_type);
    +      ASSERT_EQ(pending, ctx.expected_type);
     
           if (pending == UV_NAMED_PIPE)
             r = uv_pipe_init(ctx.channel.loop, &recv->pipe, 0);
    @@ -126,10 +126,10 @@ static void recv_cb(uv_stream_t* handle,
             r = uv_tcp_init(ctx.channel.loop, &recv->tcp);
           else
             abort();
    -      ASSERT(r == 0);
    +      ASSERT_OK(r);
     
           r = uv_accept(handle, &recv->stream);
    -      ASSERT(r == 0);
    +      ASSERT_OK(r);
         }
       } while (uv_pipe_pending_count(pipe) > 0);
     
    @@ -143,8 +143,8 @@ static void connect_cb(uv_connect_t* req, int status) {
       int r;
       uv_buf_t buf;
     
    -  ASSERT(req == &ctx.connect_req);
    -  ASSERT(status == 0);
    +  ASSERT_PTR_EQ(req, &ctx.connect_req);
    +  ASSERT_OK(status);
     
       buf = uv_buf_init(".", 1);
       r = uv_write2(&ctx.write_req,
    @@ -152,7 +152,7 @@ static void connect_cb(uv_connect_t* req, int status) {
                     &buf, 1,
                     &ctx.send.stream,
                     NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Perform two writes to the same pipe to make sure that on Windows we are
        * not running into issue 505:
    @@ -163,10 +163,10 @@ static void connect_cb(uv_connect_t* req, int status) {
                     &buf, 1,
                     &ctx.send2.stream,
                     NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_read_start((uv_stream_t*)&ctx.channel, alloc_cb, recv_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     static int run_test(int inprocess) {
    @@ -176,12 +176,12 @@ static int run_test(int inprocess) {
     
       if (inprocess) {
         r = uv_thread_create(&tid, ipc_send_recv_helper_threadproc, (void *) 42);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
         uv_sleep(1000);
     
         r = uv_pipe_init(uv_default_loop(), &ctx.channel, 1);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
         uv_pipe_connect(&ctx.connect_req, &ctx.channel, TEST_PIPENAME_3, connect_cb);
       } else {
    @@ -191,13 +191,13 @@ static int run_test(int inprocess) {
       }
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(recv_cb_count == 2);
    +  ASSERT_EQ(2, recv_cb_count);
     
       if (inprocess) {
         r = uv_thread_join(&tid);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     
       return 0;
    @@ -209,19 +209,19 @@ static int run_ipc_send_recv_pipe(int inprocess) {
       ctx.expected_type = UV_NAMED_PIPE;
     
       r = uv_pipe_init(uv_default_loop(), &ctx.send.pipe, 1);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_pipe_bind(&ctx.send.pipe, TEST_PIPENAME);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_pipe_init(uv_default_loop(), &ctx.send2.pipe, 1);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_pipe_bind(&ctx.send2.pipe, TEST_PIPENAME_2);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = run_test(inprocess);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -245,24 +245,24 @@ static int run_ipc_send_recv_tcp(int inprocess) {
       struct sockaddr_in addr;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       ctx.expected_type = UV_TCP;
     
       r = uv_tcp_init(uv_default_loop(), &ctx.send.tcp);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_init(uv_default_loop(), &ctx.send2.tcp);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_bind(&ctx.send.tcp, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_bind(&ctx.send2.tcp, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = run_test(inprocess);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -286,7 +286,7 @@ TEST_IMPL(ipc_send_recv_tcp_inprocess) {
     /* Everything here runs in a child process or second thread. */
     
     static void write2_cb(uv_write_t* req, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
       /* After two successful writes in the child process, allow the child
        * process to be closed. */
    @@ -317,7 +317,7 @@ static void read_cb(uv_stream_t* handle,
       ASSERT_GE(nread, 0);
     
       pipe = (uv_pipe_t*) handle;
    -  ASSERT_EQ(pipe, &ctx2.channel);
    +  ASSERT_PTR_EQ(pipe, &ctx2.channel);
     
       while (uv_pipe_pending_count(pipe) > 0) {
         if (++read_cb_count == 2) {
    @@ -337,10 +337,10 @@ static void read_cb(uv_stream_t* handle,
           r = uv_tcp_init(ctx2.channel.loop, &recv->tcp);
         else
           abort();
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
         r = uv_accept(handle, &recv->stream);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
         wrbuf = uv_buf_init(".", 1);
         r = uv_write2(write_req,
    @@ -349,27 +349,27 @@ static void read_cb(uv_stream_t* handle,
                       1,
                       &recv->stream,
                       write2_cb);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     }
     
     static void send_recv_start(void) {
       int r;
    -  ASSERT(1 == uv_is_readable((uv_stream_t*)&ctx2.channel));
    -  ASSERT(1 == uv_is_writable((uv_stream_t*)&ctx2.channel));
    -  ASSERT(0 == uv_is_closing((uv_handle_t*)&ctx2.channel));
    +  ASSERT_EQ(1, uv_is_readable((uv_stream_t*)&ctx2.channel));
    +  ASSERT_EQ(1, uv_is_writable((uv_stream_t*)&ctx2.channel));
    +  ASSERT_OK(uv_is_closing((uv_handle_t*)&ctx2.channel));
     
       r = uv_read_start((uv_stream_t*)&ctx2.channel, alloc_cb, read_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     static void listen_cb(uv_stream_t* handle, int status) {
       int r;
    -  ASSERT(handle == (uv_stream_t*)&ctx2.listen);
    -  ASSERT(status == 0);
    +  ASSERT_PTR_EQ(handle, (uv_stream_t*)&ctx2.listen);
    +  ASSERT_OK(status);
     
       r = uv_accept((uv_stream_t*)&ctx2.listen, (uv_stream_t*)&ctx2.channel);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       send_recv_start();
     }
    @@ -382,27 +382,27 @@ int run_ipc_send_recv_helper(uv_loop_t* loop, int inprocess) {
       memset(&ctx2, 0, sizeof(ctx2));
     
       r = uv_pipe_init(loop, &ctx2.listen, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_pipe_init(loop, &ctx2.channel, 1);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       if (inprocess) {
         r = uv_pipe_bind(&ctx2.listen, TEST_PIPENAME_3);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
         r = uv_listen((uv_stream_t*)&ctx2.listen, SOMAXCONN, listen_cb);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       } else {
         r = uv_pipe_open(&ctx2.channel, 0);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
         send_recv_start();
       }
     
       notify_parent_process();
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       return 0;
     }
    @@ -414,7 +414,7 @@ int ipc_send_recv_helper(void) {
       int r;
     
       r = run_ipc_send_recv_helper(uv_default_loop(), 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -425,11 +425,11 @@ void ipc_send_recv_helper_threadproc(void* arg) {
       uv_loop_t loop;
     
       r = uv_loop_init(&loop);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = run_ipc_send_recv_helper(&loop, 1);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_loop_close(&loop);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
    diff --git a/deps/uv/test/test-ipc.c b/deps/uv/test/test-ipc.c
    index 7ec6ec9ce3af5b..49975d9b4d747c 100644
    --- a/deps/uv/test/test-ipc.c
    +++ b/deps/uv/test/test-ipc.c
    @@ -68,16 +68,16 @@ static void on_connection(uv_stream_t* server, int status) {
     
       if (!local_conn_accepted) {
         /* Accept the connection and close it.  Also and close the server. */
    -    ASSERT_EQ(status, 0);
    +    ASSERT_OK(status);
         ASSERT_PTR_EQ(&tcp_server, server);
     
         conn = malloc(sizeof(*conn));
         ASSERT_NOT_NULL(conn);
         r = uv_tcp_init(server->loop, conn);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
     
         r = uv_accept(server, (uv_stream_t*)conn);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
     
         uv_close((uv_handle_t*)conn, close_server_conn_cb);
         uv_close((uv_handle_t*)server, NULL);
    @@ -91,8 +91,8 @@ static void exit_cb(uv_process_t* process,
                         int term_signal) {
       printf("exit_cb\n");
       exit_cb_called++;
    -  ASSERT_EQ(exit_status, 0);
    -  ASSERT_EQ(term_signal, 0);
    +  ASSERT_OK(exit_status);
    +  ASSERT_OK(term_signal);
       uv_close((uv_handle_t*)process, NULL);
     }
     
    @@ -126,14 +126,14 @@ static void make_many_connections(void) {
         ASSERT_NOT_NULL(conn);
     
         r = uv_tcp_init(uv_default_loop(), &conn->conn);
    -    ASSERT_EQ(r, 0);
    -    ASSERT_EQ(0, uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +    ASSERT_OK(r);
    +    ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
         r = uv_tcp_connect(&conn->conn_req,
                            (uv_tcp_t*) &conn->conn,
                            (const struct sockaddr*) &addr,
                            connect_cb);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
     
         conn->conn.data = conn;
       }
    @@ -179,13 +179,13 @@ static void on_read(uv_stream_t* handle,
         /* Accept the pending TCP server, and start listening on it. */
         ASSERT_EQ(pending, UV_TCP);
         r = uv_tcp_init(uv_default_loop(), &tcp_server);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
     
         r = uv_accept((uv_stream_t*)pipe, (uv_stream_t*)&tcp_server);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
     
         r = uv_listen((uv_stream_t*)&tcp_server, BACKLOG, on_connection);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
     
         tcp_server_listening = 1;
     
    @@ -194,13 +194,13 @@ static void on_read(uv_stream_t* handle,
     
         outbuf = uv_buf_init("foobar\n", 7);
         r = uv_write(&write_req, (uv_stream_t*)pipe, &outbuf, 1, NULL);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
     
         /* Create a bunch of connections to get both servers to accept. */
         make_many_connections();
       } else if (memcmp("accepted_connection\n", buf->base, nread) == 0) {
         /* Remote server has accepted a connection.  Close the channel. */
    -    ASSERT_EQ(0, uv_pipe_pending_count(pipe));
    +    ASSERT_OK(uv_pipe_pending_count(pipe));
         ASSERT_EQ(pending, UV_UNKNOWN_HANDLE);
         remote_conn_accepted = 1;
         uv_close((uv_handle_t*)&channel, NULL);
    @@ -248,28 +248,28 @@ static void on_read_listen_after_bound_twice(uv_stream_t* handle,
         /* Accept the first TCP server, and start listening on it. */
         ASSERT_EQ(pending, UV_TCP);
         r = uv_tcp_init(uv_default_loop(), &tcp_server);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
     
         r = uv_accept((uv_stream_t*)pipe, (uv_stream_t*)&tcp_server);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
     
         r = uv_listen((uv_stream_t*)&tcp_server, BACKLOG, on_connection);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
       } else if (read_cb_called == 2) {
         /* Accept the second TCP server, and start listening on it. */
         ASSERT_EQ(pending, UV_TCP);
         r = uv_tcp_init(uv_default_loop(), &tcp_server2);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
     
         r = uv_accept((uv_stream_t*)pipe, (uv_stream_t*)&tcp_server2);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
     
         r = uv_listen((uv_stream_t*)&tcp_server2, BACKLOG, on_connection);
         ASSERT_EQ(r, UV_EADDRINUSE);
     
         uv_close((uv_handle_t*)&tcp_server, NULL);
         uv_close((uv_handle_t*)&tcp_server2, NULL);
    -    ASSERT_EQ(0, uv_pipe_pending_count(pipe));
    +    ASSERT_OK(uv_pipe_pending_count(pipe));
         uv_close((uv_handle_t*)&channel, NULL);
       }
     
    @@ -288,12 +288,12 @@ void spawn_helper(uv_pipe_t* channel,
       uv_stdio_container_t stdio[3];
     
       r = uv_pipe_init(uv_default_loop(), channel, 1);
    -  ASSERT_EQ(r, 0);
    -  ASSERT_NE(channel->ipc, 0);
    +  ASSERT_OK(r);
    +  ASSERT_NE(0, channel->ipc);
     
       exepath_size = sizeof(exepath);
       r = uv_exepath(exepath, &exepath_size);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       exepath[exepath_size] = '\0';
       args[0] = exepath;
    @@ -315,12 +315,12 @@ void spawn_helper(uv_pipe_t* channel,
       stdio[2].data.fd = 2;
     
       r = uv_spawn(uv_default_loop(), process, &options);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     }
     
     
     static void on_tcp_write(uv_write_t* req, int status) {
    -  ASSERT_EQ(status, 0);
    +  ASSERT_OK(status);
       ASSERT_PTR_EQ(req->handle, &tcp_connection);
       tcp_write_cb_called++;
     }
    @@ -385,10 +385,10 @@ static void on_read_connection(uv_stream_t* handle,
       /* Accept the pending TCP connection */
       ASSERT_EQ(pending, UV_TCP);
       r = uv_tcp_init(uv_default_loop(), &tcp_connection);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_accept(handle, (uv_stream_t*)&tcp_connection);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       /* Make sure that the expected data is correctly multiplexed. */
       ASSERT_MEM_EQ("hello\n", buf->base, nread);
    @@ -397,10 +397,10 @@ static void on_read_connection(uv_stream_t* handle,
       outbuf = uv_buf_init("world\n", 6);
       r = uv_write(&write_req, (uv_stream_t*)&tcp_connection, &outbuf, 1,
         on_tcp_write);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_read_start((uv_stream_t*)&tcp_connection, on_read_alloc, on_tcp_read);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       free(buf->base);
     }
    @@ -422,7 +422,7 @@ static int run_ipc_test(const char* helper, uv_read_cb read_cb) {
       uv_read_start((uv_stream_t*)&channel, on_alloc, read_cb);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -434,10 +434,10 @@ TEST_IMPL(ipc_listen_before_write) {
       RETURN_SKIP(NO_SEND_HANDLE_ON_PIPE);
     #endif
       int r = run_ipc_test("ipc_helper_listen_before_write", on_read);
    -  ASSERT_EQ(local_conn_accepted, 1);
    -  ASSERT_EQ(remote_conn_accepted, 1);
    -  ASSERT_EQ(read_cb_called, 1);
    -  ASSERT_EQ(exit_cb_called, 1);
    +  ASSERT_EQ(1, local_conn_accepted);
    +  ASSERT_EQ(1, remote_conn_accepted);
    +  ASSERT_EQ(1, read_cb_called);
    +  ASSERT_EQ(1, exit_cb_called);
       return r;
     }
     
    @@ -447,10 +447,10 @@ TEST_IMPL(ipc_listen_after_write) {
       RETURN_SKIP(NO_SEND_HANDLE_ON_PIPE);
     #endif
       int r = run_ipc_test("ipc_helper_listen_after_write", on_read);
    -  ASSERT_EQ(local_conn_accepted, 1);
    -  ASSERT_EQ(remote_conn_accepted, 1);
    -  ASSERT_EQ(read_cb_called, 1);
    -  ASSERT_EQ(exit_cb_called, 1);
    +  ASSERT_EQ(1, local_conn_accepted);
    +  ASSERT_EQ(1, remote_conn_accepted);
    +  ASSERT_EQ(1, read_cb_called);
    +  ASSERT_EQ(1, exit_cb_called);
       return r;
     }
     
    @@ -460,10 +460,10 @@ TEST_IMPL(ipc_tcp_connection) {
       RETURN_SKIP(NO_SEND_HANDLE_ON_PIPE);
     #endif
       int r = run_ipc_test("ipc_helper_tcp_connection", on_read_connection);
    -  ASSERT_EQ(read_cb_called, 1);
    -  ASSERT_EQ(tcp_write_cb_called, 1);
    -  ASSERT_EQ(tcp_read_cb_called, 1);
    -  ASSERT_EQ(exit_cb_called, 1);
    +  ASSERT_EQ(1, read_cb_called);
    +  ASSERT_EQ(1, tcp_write_cb_called);
    +  ASSERT_EQ(1, tcp_read_cb_called);
    +  ASSERT_EQ(1, exit_cb_called);
       return r;
     }
     
    @@ -474,20 +474,20 @@ TEST_IMPL(listen_with_simultaneous_accepts) {
       int r;
       struct sockaddr_in addr;
     
    -  ASSERT_EQ(0, uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
     
       r = uv_tcp_init(uv_default_loop(), &server);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_simultaneous_accepts(&server, 1);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_listen((uv_stream_t*)&server, SOMAXCONN, NULL);
    -  ASSERT_EQ(r, 0);
    -  ASSERT_EQ(server.reqs_pending, 32);
    +  ASSERT_OK(r);
    +  ASSERT_EQ(32, server.reqs_pending);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -499,20 +499,20 @@ TEST_IMPL(listen_no_simultaneous_accepts) {
       int r;
       struct sockaddr_in addr;
     
    -  ASSERT_EQ(0, uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
     
       r = uv_tcp_init(uv_default_loop(), &server);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_simultaneous_accepts(&server, 0);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_listen((uv_stream_t*)&server, SOMAXCONN, NULL);
    -  ASSERT_EQ(r, 0);
    -  ASSERT_EQ(server.reqs_pending, 1);
    +  ASSERT_OK(r);
    +  ASSERT_EQ(1, server.reqs_pending);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -523,8 +523,8 @@ TEST_IMPL(ipc_listen_after_bind_twice) {
       RETURN_SKIP(NO_SEND_HANDLE_ON_PIPE);
     #endif
       int r = run_ipc_test("ipc_helper_bind_twice", on_read_listen_after_bound_twice);
    -  ASSERT_EQ(read_cb_called, 2);
    -  ASSERT_EQ(exit_cb_called, 1);
    +  ASSERT_EQ(2, read_cb_called);
    +  ASSERT_EQ(1, exit_cb_called);
       return r;
     }
     #endif
    @@ -532,7 +532,7 @@ TEST_IMPL(ipc_listen_after_bind_twice) {
     TEST_IMPL(ipc_send_zero) {
       int r;
       r = run_ipc_test("ipc_helper_send_zero", on_read_send_zero);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
       return 0;
     }
     
    @@ -563,7 +563,7 @@ static void tcp_connection_write_cb(uv_write_t* req, int status) {
     
     
     static void send_zero_write_cb(uv_write_t* req, int status) {
    -  ASSERT_EQ(status, 0);
    +  ASSERT_OK(status);
       send_zero_write++;
     }
     
    @@ -591,7 +591,7 @@ static void on_tcp_child_process_read(uv_stream_t* tcp,
       /* Write to the socket */
       outbuf = uv_buf_init("hello again\n", 12);
       r = uv_write(&conn.tcp_write_req, tcp, &outbuf, 1, tcp_connection_write_cb);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       tcp_conn_read_cb_called++;
     }
    @@ -600,9 +600,9 @@ static void on_tcp_child_process_read(uv_stream_t* tcp,
     static void connect_child_process_cb(uv_connect_t* req, int status) {
       int r;
     
    -  ASSERT_EQ(status, 0);
    +  ASSERT_OK(status);
       r = uv_read_start(req->handle, on_read_alloc, on_tcp_child_process_read);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -615,21 +615,21 @@ static void ipc_on_connection(uv_stream_t* server, int status) {
          * Accept the connection and close it.  Also let the other
          * side know.
          */
    -    ASSERT_EQ(status, 0);
    +    ASSERT_OK(status);
         ASSERT_PTR_EQ(&tcp_server, server);
     
         r = uv_tcp_init(server->loop, &conn.conn);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
     
         r = uv_accept(server, (uv_stream_t*)&conn.conn);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
     
         uv_close((uv_handle_t*)&conn.conn, close_cb);
     
         buf = uv_buf_init("accepted_connection\n", 20);
         r = uv_write2(&conn_notify_req, (uv_stream_t*)&channel, &buf, 1,
           NULL, conn_notify_write_cb);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
     
         connection_accepted = 1;
       }
    @@ -646,28 +646,28 @@ static void ipc_on_connection_tcp_conn(uv_stream_t* server, int status) {
       uv_buf_t buf;
       uv_tcp_t* conn;
     
    -  ASSERT_EQ(status, 0);
    +  ASSERT_OK(status);
       ASSERT_PTR_EQ(&tcp_server, server);
     
       conn = malloc(sizeof(*conn));
       ASSERT_NOT_NULL(conn);
     
       r = uv_tcp_init(server->loop, conn);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_accept(server, (uv_stream_t*)conn);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       /* Send the accepted connection to the other process */
       buf = uv_buf_init("hello\n", 6);
       r = uv_write2(&conn_notify_req, (uv_stream_t*)&channel, &buf, 1,
         (uv_stream_t*)conn, NULL);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_read_start((uv_stream_t*) conn,
                         on_read_alloc,
                         on_tcp_child_process_read);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       uv_close((uv_handle_t*)conn, close_and_free_cb);
     }
    @@ -682,44 +682,44 @@ int ipc_helper(int listen_after_write) {
       int r;
       uv_buf_t buf;
     
    -  ASSERT_EQ(0, uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
     
       r = uv_pipe_init(uv_default_loop(), &channel, 1);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       uv_pipe_open(&channel, 0);
     
       ASSERT_EQ(1, uv_is_readable((uv_stream_t*) &channel));
       ASSERT_EQ(1, uv_is_writable((uv_stream_t*) &channel));
    -  ASSERT_EQ(0, uv_is_closing((uv_handle_t*) &channel));
    +  ASSERT_OK(uv_is_closing((uv_handle_t*) &channel));
     
       r = uv_tcp_init(uv_default_loop(), &tcp_server);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr, 0);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       if (!listen_after_write) {
         r = uv_listen((uv_stream_t*)&tcp_server, BACKLOG, ipc_on_connection);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
       }
     
       buf = uv_buf_init("hello\n", 6);
       r = uv_write2(&write_req, (uv_stream_t*)&channel, &buf, 1,
           (uv_stream_t*)&tcp_server, NULL);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       if (listen_after_write) {
         r = uv_listen((uv_stream_t*)&tcp_server, BACKLOG, ipc_on_connection);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
       }
     
       notify_parent_process();
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
    -  ASSERT_EQ(connection_accepted, 1);
    -  ASSERT_EQ(close_cb_called, 3);
    +  ASSERT_EQ(1, connection_accepted);
    +  ASSERT_EQ(3, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -736,43 +736,43 @@ int ipc_helper_tcp_connection(void) {
       struct sockaddr_in addr;
     
       r = uv_pipe_init(uv_default_loop(), &channel, 1);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       uv_pipe_open(&channel, 0);
     
       ASSERT_EQ(1, uv_is_readable((uv_stream_t*) &channel));
       ASSERT_EQ(1, uv_is_writable((uv_stream_t*) &channel));
    -  ASSERT_EQ(0, uv_is_closing((uv_handle_t*) &channel));
    +  ASSERT_OK(uv_is_closing((uv_handle_t*) &channel));
     
       r = uv_tcp_init(uv_default_loop(), &tcp_server);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
    -  ASSERT_EQ(0, uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
     
       r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr, 0);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_listen((uv_stream_t*)&tcp_server, BACKLOG, ipc_on_connection_tcp_conn);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       /* Make a connection to the server */
       r = uv_tcp_init(uv_default_loop(), &conn.conn);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
    -  ASSERT_EQ(0, uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       r = uv_tcp_connect(&conn.conn_req,
                          (uv_tcp_t*) &conn.conn,
                          (const struct sockaddr*) &addr,
                          connect_child_process_cb);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
    -  ASSERT_EQ(tcp_conn_read_cb_called, 1);
    -  ASSERT_EQ(tcp_conn_write_cb_called, 1);
    -  ASSERT_EQ(close_cb_called, 4);
    +  ASSERT_EQ(1, tcp_conn_read_cb_called);
    +  ASSERT_EQ(1, tcp_conn_write_cb_called);
    +  ASSERT_EQ(4, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -787,38 +787,38 @@ int ipc_helper_bind_twice(void) {
       int r;
       uv_buf_t buf;
     
    -  ASSERT_EQ(0, uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
     
       r = uv_pipe_init(uv_default_loop(), &channel, 1);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       uv_pipe_open(&channel, 0);
     
       ASSERT_EQ(1, uv_is_readable((uv_stream_t*) &channel));
       ASSERT_EQ(1, uv_is_writable((uv_stream_t*) &channel));
    -  ASSERT_EQ(0, uv_is_closing((uv_handle_t*) &channel));
    +  ASSERT_OK(uv_is_closing((uv_handle_t*) &channel));
     
       buf = uv_buf_init("hello\n", 6);
     
       r = uv_tcp_init(uv_default_loop(), &tcp_server);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
       r = uv_tcp_init(uv_default_loop(), &tcp_server2);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr, 0);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
       r = uv_tcp_bind(&tcp_server2, (const struct sockaddr*) &addr, 0);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_write2(&write_req, (uv_stream_t*)&channel, &buf, 1,
                     (uv_stream_t*)&tcp_server, NULL);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
       r = uv_write2(&write_req2, (uv_stream_t*)&channel, &buf, 1,
                     (uv_stream_t*)&tcp_server2, NULL);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -831,13 +831,13 @@ int ipc_helper_send_zero(void) {
       zero_buf = uv_buf_init(0, 0);
     
       r = uv_pipe_init(uv_default_loop(), &channel, 0);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       uv_pipe_open(&channel, 0);
     
       ASSERT_EQ(1, uv_is_readable((uv_stream_t*) &channel));
       ASSERT_EQ(1, uv_is_writable((uv_stream_t*) &channel));
    -  ASSERT_EQ(0, uv_is_closing((uv_handle_t*) &channel));
    +  ASSERT_OK(uv_is_closing((uv_handle_t*) &channel));
     
       r = uv_write(&write_req,
                    (uv_stream_t*)&channel,
    @@ -845,12 +845,12 @@ int ipc_helper_send_zero(void) {
                    1,
                    send_zero_write_cb);
     
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
    -  ASSERT_EQ(send_zero_write, 1);
    +  ASSERT_EQ(1, send_zero_write);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-list.h b/deps/uv/test/test-list.h
    index 78ff9c2d162167..d112d07a29a8ec 100644
    --- a/deps/uv/test/test-list.h
    +++ b/deps/uv/test/test-list.h
    @@ -127,6 +127,8 @@ TEST_DECLARE   (tcp_bind_writable_flags)
     TEST_DECLARE   (tcp_bind_or_listen_error_after_close)
     TEST_DECLARE   (tcp_listen_without_bind)
     TEST_DECLARE   (tcp_connect_error_fault)
    +TEST_DECLARE   (tcp_connect6_error_fault)
    +TEST_DECLARE   (tcp_connect6_link_local)
     TEST_DECLARE   (tcp_connect_timeout)
     TEST_DECLARE   (tcp_local_connect_timeout)
     TEST_DECLARE   (tcp6_local_connect_timeout)
    @@ -321,6 +323,7 @@ TEST_DECLARE   (spawn_detached)
     TEST_DECLARE   (spawn_and_kill_with_std)
     TEST_DECLARE   (spawn_and_ping)
     TEST_DECLARE   (spawn_preserve_env)
    +TEST_DECLARE   (spawn_same_stdout_stderr)
     TEST_DECLARE   (spawn_setuid_fails)
     TEST_DECLARE   (spawn_setgid_fails)
     TEST_DECLARE   (spawn_stdout_to_file)
    @@ -501,6 +504,7 @@ TEST_DECLARE   (listen_with_simultaneous_accepts)
     TEST_DECLARE   (listen_no_simultaneous_accepts)
     TEST_DECLARE   (fs_stat_root)
     TEST_DECLARE   (spawn_with_an_odd_path)
    +TEST_DECLARE   (spawn_no_path)
     TEST_DECLARE   (ipc_listen_after_bind_twice)
     TEST_DECLARE   (win32_signum_number)
     #else
    @@ -542,6 +546,7 @@ TEST_DECLARE  (fork_socketpair)
     TEST_DECLARE  (fork_socketpair_started)
     TEST_DECLARE  (fork_signal_to_child)
     TEST_DECLARE  (fork_signal_to_child_closed)
    +TEST_DECLARE  (fork_close_signal_in_child)
     #ifndef __APPLE__ /* This is forbidden in a fork child: The process has forked
                          and you cannot use this CoreFoundation functionality
                          safely. You MUST exec(). */
    @@ -724,6 +729,8 @@ TASK_LIST_START
       TEST_ENTRY  (tcp_bind_or_listen_error_after_close)
       TEST_ENTRY  (tcp_listen_without_bind)
       TEST_ENTRY  (tcp_connect_error_fault)
    +  TEST_ENTRY  (tcp_connect6_error_fault)
    +  TEST_ENTRY  (tcp_connect6_link_local)
       TEST_ENTRY  (tcp_connect_timeout)
       TEST_ENTRY  (tcp_local_connect_timeout)
       TEST_ENTRY  (tcp6_local_connect_timeout)
    @@ -977,6 +984,7 @@ TASK_LIST_START
       TEST_ENTRY  (spawn_and_kill_with_std)
       TEST_ENTRY  (spawn_and_ping)
       TEST_ENTRY  (spawn_preserve_env)
    +  TEST_ENTRY  (spawn_same_stdout_stderr)
       TEST_ENTRY  (spawn_setuid_fails)
       TEST_ENTRY  (spawn_setgid_fails)
       TEST_ENTRY  (spawn_stdout_to_file)
    @@ -1015,6 +1023,7 @@ TASK_LIST_START
       TEST_ENTRY  (listen_no_simultaneous_accepts)
       TEST_ENTRY  (fs_stat_root)
       TEST_ENTRY  (spawn_with_an_odd_path)
    +  TEST_ENTRY  (spawn_no_path)
       TEST_ENTRY  (ipc_listen_after_bind_twice)
       TEST_ENTRY  (win32_signum_number)
     #else
    @@ -1055,6 +1064,7 @@ TASK_LIST_START
       TEST_ENTRY  (fs_unlink_archive_readonly)
     #endif
       TEST_ENTRY  (fs_chown)
    +  TEST_ENTRY  (fs_link)
       TEST_ENTRY  (fs_utime)
       TEST_ENTRY  (fs_utime_round)
       TEST_ENTRY  (fs_futime)
    @@ -1175,6 +1185,7 @@ TASK_LIST_START
       TEST_ENTRY  (fork_socketpair_started)
       TEST_ENTRY  (fork_signal_to_child)
       TEST_ENTRY  (fork_signal_to_child_closed)
    +  TEST_ENTRY  (fork_close_signal_in_child)
     #ifndef __APPLE__
       TEST_ENTRY  (fork_fs_events_child)
       TEST_ENTRY  (fork_fs_events_child_dir)
    diff --git a/deps/uv/test/test-loop-alive.c b/deps/uv/test/test-loop-alive.c
    index 76a2b04cc9d1e7..279cfc3227098d 100644
    --- a/deps/uv/test/test-loop-alive.c
    +++ b/deps/uv/test/test-loop-alive.c
    @@ -37,7 +37,7 @@ static void work_cb(uv_work_t* req) {
     
     static void after_work_cb(uv_work_t* req, int status) {
       ASSERT(req);
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     }
     
     
    @@ -51,16 +51,16 @@ TEST_IMPL(loop_alive) {
       ASSERT(uv_loop_alive(uv_default_loop()));
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       ASSERT(!uv_loop_alive(uv_default_loop()));
     
       /* loops with requests are alive */
       r = uv_queue_work(uv_default_loop(), &work_req, work_cb, after_work_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       ASSERT(uv_loop_alive(uv_default_loop()));
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       ASSERT(!uv_loop_alive(uv_default_loop()));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
    diff --git a/deps/uv/test/test-loop-close.c b/deps/uv/test/test-loop-close.c
    index f5814796e8f3f0..cd1b76ce1b0665 100644
    --- a/deps/uv/test/test-loop-close.c
    +++ b/deps/uv/test/test-loop-close.c
    @@ -35,23 +35,23 @@ TEST_IMPL(loop_close) {
       uv_loop_t loop;
     
       loop.data = &loop;
    -  ASSERT(0 == uv_loop_init(&loop));
    -  ASSERT(loop.data == (void*) &loop);
    +  ASSERT_OK(uv_loop_init(&loop));
    +  ASSERT_PTR_EQ(loop.data, (void*) &loop);
     
       uv_timer_init(&loop, &timer_handle);
       uv_timer_start(&timer_handle, timer_cb, 100, 100);
     
    -  ASSERT(UV_EBUSY == uv_loop_close(&loop));
    +  ASSERT_EQ(UV_EBUSY, uv_loop_close(&loop));
     
       uv_run(&loop, UV_RUN_DEFAULT);
     
       uv_close((uv_handle_t*) &timer_handle, NULL);
       r = uv_run(&loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(loop.data == (void*) &loop);
    -  ASSERT(0 == uv_loop_close(&loop));
    -  ASSERT(loop.data == (void*) &loop);
    +  ASSERT_PTR_EQ(loop.data, (void*) &loop);
    +  ASSERT_OK(uv_loop_close(&loop));
    +  ASSERT_PTR_EQ(loop.data, (void*) &loop);
     
       return 0;
     }
    @@ -67,11 +67,11 @@ static void loop_instant_close_after_work_cb(uv_work_t* req, int status) {
     TEST_IMPL(loop_instant_close) {
       static uv_loop_t loop;
       static uv_work_t req;
    -  ASSERT(0 == uv_loop_init(&loop));
    -  ASSERT(0 == uv_queue_work(&loop,
    -                            &req,
    -                            loop_instant_close_work_cb,
    -                            loop_instant_close_after_work_cb));
    +  ASSERT_OK(uv_loop_init(&loop));
    +  ASSERT_OK(uv_queue_work(&loop,
    +                          &req,
    +                          loop_instant_close_work_cb,
    +                          loop_instant_close_after_work_cb));
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
     }
    diff --git a/deps/uv/test/test-loop-configure.c b/deps/uv/test/test-loop-configure.c
    index d057c1ed8a7bf8..1bc328431c9f0d 100644
    --- a/deps/uv/test/test-loop-configure.c
    +++ b/deps/uv/test/test-loop-configure.c
    @@ -24,15 +24,15 @@ static void timer_cb(uv_timer_t* handle) {
     TEST_IMPL(loop_configure) {
       uv_timer_t timer_handle;
       uv_loop_t loop;
    -  ASSERT(0 == uv_loop_init(&loop));
    +  ASSERT_OK(uv_loop_init(&loop));
     #ifdef _WIN32
    -  ASSERT(UV_ENOSYS == uv_loop_configure(&loop, UV_LOOP_BLOCK_SIGNAL, 0));
    +  ASSERT_EQ(UV_ENOSYS, uv_loop_configure(&loop, UV_LOOP_BLOCK_SIGNAL, 0));
     #else
    -  ASSERT(0 == uv_loop_configure(&loop, UV_LOOP_BLOCK_SIGNAL, SIGPROF));
    +  ASSERT_OK(uv_loop_configure(&loop, UV_LOOP_BLOCK_SIGNAL, SIGPROF));
     #endif
    -  ASSERT(0 == uv_timer_init(&loop, &timer_handle));
    -  ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, 10, 0));
    -  ASSERT(0 == uv_run(&loop, UV_RUN_DEFAULT));
    -  ASSERT(0 == uv_loop_close(&loop));
    +  ASSERT_OK(uv_timer_init(&loop, &timer_handle));
    +  ASSERT_OK(uv_timer_start(&timer_handle, timer_cb, 10, 0));
    +  ASSERT_OK(uv_run(&loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_loop_close(&loop));
       return 0;
     }
    diff --git a/deps/uv/test/test-loop-handles.c b/deps/uv/test/test-loop-handles.c
    index 5d3df0245aa064..58368bf73ce471 100644
    --- a/deps/uv/test/test-loop-handles.c
    +++ b/deps/uv/test/test-loop-handles.c
    @@ -108,7 +108,7 @@ static int idle_2_is_active = 0;
     
     
     static void timer_cb(uv_timer_t* handle) {
    -  ASSERT(handle == &timer_handle);
    +  ASSERT_PTR_EQ(handle, &timer_handle);
     }
     
     
    @@ -116,7 +116,7 @@ static void idle_2_close_cb(uv_handle_t* handle) {
       fprintf(stderr, "%s", "IDLE_2_CLOSE_CB\n");
       fflush(stderr);
     
    -  ASSERT(handle == (uv_handle_t*)&idle_2_handle);
    +  ASSERT_PTR_EQ(handle, (uv_handle_t*)&idle_2_handle);
     
       ASSERT(idle_2_is_active);
     
    @@ -129,7 +129,7 @@ static void idle_2_cb(uv_idle_t* handle) {
       fprintf(stderr, "%s", "IDLE_2_CB\n");
       fflush(stderr);
     
    -  ASSERT(handle == &idle_2_handle);
    +  ASSERT_PTR_EQ(handle, &idle_2_handle);
     
       idle_2_cb_called++;
     
    @@ -144,14 +144,14 @@ static void idle_1_cb(uv_idle_t* handle) {
       fflush(stderr);
     
       ASSERT_NOT_NULL(handle);
    -  ASSERT(idles_1_active > 0);
    +  ASSERT_GT(idles_1_active, 0);
     
       /* Init idle_2 and make it active */
       if (!idle_2_is_active && !uv_is_closing((uv_handle_t*)&idle_2_handle)) {
         r = uv_idle_init(uv_default_loop(), &idle_2_handle);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         r = uv_idle_start(&idle_2_handle, idle_2_cb);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         idle_2_is_active = 1;
         idle_2_cb_started++;
       }
    @@ -160,7 +160,7 @@ static void idle_1_cb(uv_idle_t* handle) {
     
       if (idle_1_cb_called % 5 == 0) {
         r = uv_idle_stop((uv_idle_t*)handle);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         idles_1_active--;
       }
     }
    @@ -179,7 +179,7 @@ static void idle_1_close_cb(uv_handle_t* handle) {
     static void prepare_1_close_cb(uv_handle_t* handle) {
       fprintf(stderr, "%s", "PREPARE_1_CLOSE_CB");
       fflush(stderr);
    -  ASSERT(handle == (uv_handle_t*)&prepare_1_handle);
    +  ASSERT_PTR_EQ(handle, (uv_handle_t*)&prepare_1_handle);
     
       prepare_1_close_cb_called++;
     }
    @@ -188,7 +188,7 @@ static void prepare_1_close_cb(uv_handle_t* handle) {
     static void check_close_cb(uv_handle_t* handle) {
       fprintf(stderr, "%s", "CHECK_CLOSE_CB\n");
       fflush(stderr);
    -  ASSERT(handle == (uv_handle_t*)&check_handle);
    +  ASSERT_PTR_EQ(handle, (uv_handle_t*)&check_handle);
     
       check_close_cb_called++;
     }
    @@ -197,7 +197,7 @@ static void check_close_cb(uv_handle_t* handle) {
     static void prepare_2_close_cb(uv_handle_t* handle) {
       fprintf(stderr, "%s", "PREPARE_2_CLOSE_CB\n");
       fflush(stderr);
    -  ASSERT(handle == (uv_handle_t*)&prepare_2_handle);
    +  ASSERT_PTR_EQ(handle, (uv_handle_t*)&prepare_2_handle);
     
       prepare_2_close_cb_called++;
     }
    @@ -208,13 +208,13 @@ static void check_cb(uv_check_t* handle) {
     
       fprintf(stderr, "%s", "CHECK_CB\n");
       fflush(stderr);
    -  ASSERT(handle == &check_handle);
    +  ASSERT_PTR_EQ(handle, &check_handle);
     
       if (loop_iteration < ITERATIONS) {
         /* Make some idle watchers active */
         for (i = 0; i < 1 + (loop_iteration % IDLE_COUNT); i++) {
           r = uv_idle_start(&idle_1_handles[i], idle_1_cb);
    -      ASSERT(r == 0);
    +      ASSERT_OK(r);
           idles_1_active++;
         }
     
    @@ -244,16 +244,16 @@ static void prepare_2_cb(uv_prepare_t* handle) {
     
       fprintf(stderr, "%s", "PREPARE_2_CB\n");
       fflush(stderr);
    -  ASSERT(handle == &prepare_2_handle);
    +  ASSERT_PTR_EQ(handle, &prepare_2_handle);
     
       /* Prepare_2 gets started by prepare_1 when (loop_iteration % 2 == 0), and it
        * stops itself immediately. A started watcher is not queued until the next
        * round, so when this callback is made (loop_iteration % 2 == 0) cannot be
        * true. */
    -  ASSERT(loop_iteration % 2 != 0);
    +  ASSERT_NE(0, loop_iteration % 2);
     
       r = uv_prepare_stop((uv_prepare_t*)handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       prepare_2_cb_called++;
     }
    @@ -264,11 +264,11 @@ static void prepare_1_cb(uv_prepare_t* handle) {
     
       fprintf(stderr, "%s", "PREPARE_1_CB\n");
       fflush(stderr);
    -  ASSERT(handle == &prepare_1_handle);
    +  ASSERT_PTR_EQ(handle, &prepare_1_handle);
     
       if (loop_iteration % 2 == 0) {
         r = uv_prepare_start(&prepare_2_handle, prepare_2_cb);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     
       prepare_1_cb_called++;
    @@ -283,23 +283,23 @@ TEST_IMPL(loop_handles) {
       int r;
     
       r = uv_prepare_init(uv_default_loop(), &prepare_1_handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_prepare_start(&prepare_1_handle, prepare_1_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_check_init(uv_default_loop(), &check_handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_check_start(&check_handle, check_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* initialize only, prepare_2 is started by prepare_1_cb */
       r = uv_prepare_init(uv_default_loop(), &prepare_2_handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       for (i = 0; i < IDLE_COUNT; i++) {
         /* initialize only, idle_1 handles are started by check_cb */
         r = uv_idle_init(uv_default_loop(), &idle_1_handles[i]);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     
       /* don't init or start idle_2, both is done by idle_1_cb */
    @@ -307,30 +307,30 @@ TEST_IMPL(loop_handles) {
       /* The timer callback is there to keep the event loop polling unref it as it
        * is not supposed to keep the loop alive */
       r = uv_timer_init(uv_default_loop(), &timer_handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_timer_start(&timer_handle, timer_cb, TIMEOUT, TIMEOUT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_unref((uv_handle_t*)&timer_handle);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(loop_iteration == ITERATIONS);
    +  ASSERT_EQ(loop_iteration, ITERATIONS);
     
    -  ASSERT(prepare_1_cb_called == ITERATIONS);
    -  ASSERT(prepare_1_close_cb_called == 1);
    +  ASSERT_EQ(prepare_1_cb_called, ITERATIONS);
    +  ASSERT_EQ(1, prepare_1_close_cb_called);
     
    -  ASSERT(prepare_2_cb_called == ITERATIONS / 2);
    -  ASSERT(prepare_2_close_cb_called == 1);
    +  ASSERT_EQ(prepare_2_cb_called, ITERATIONS / 2);
    +  ASSERT_EQ(1, prepare_2_close_cb_called);
     
    -  ASSERT(check_cb_called == ITERATIONS);
    -  ASSERT(check_close_cb_called == 1);
    +  ASSERT_EQ(check_cb_called, ITERATIONS);
    +  ASSERT_EQ(1, check_close_cb_called);
     
       /* idle_1_cb should be called a lot */
    -  ASSERT(idle_1_close_cb_called == IDLE_COUNT);
    +  ASSERT_EQ(idle_1_close_cb_called, IDLE_COUNT);
     
    -  ASSERT(idle_2_close_cb_called == idle_2_cb_started);
    -  ASSERT(idle_2_is_active == 0);
    +  ASSERT_EQ(idle_2_close_cb_called, idle_2_cb_started);
    +  ASSERT_OK(idle_2_is_active);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-loop-stop.c b/deps/uv/test/test-loop-stop.c
    index 981d20d109930d..a00a5b81ade79e 100644
    --- a/deps/uv/test/test-loop-stop.c
    +++ b/deps/uv/test/test-loop-stop.c
    @@ -30,7 +30,7 @@ static int num_ticks = 10;
     
     
     static void prepare_cb(uv_prepare_t* handle) {
    -  ASSERT(handle == &prepare_handle);
    +  ASSERT_PTR_EQ(handle, &prepare_handle);
       prepare_called++;
       if (prepare_called == num_ticks)
         uv_prepare_stop(handle);
    @@ -38,7 +38,7 @@ static void prepare_cb(uv_prepare_t* handle) {
     
     
     static void timer_cb(uv_timer_t* handle) {
    -  ASSERT(handle == &timer_handle);
    +  ASSERT_PTR_EQ(handle, &timer_handle);
       timer_called++;
       if (timer_called == 1)
         uv_stop(uv_default_loop());
    @@ -55,17 +55,17 @@ TEST_IMPL(loop_stop) {
       uv_timer_start(&timer_handle, timer_cb, 100, 100);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r != 0);
    -  ASSERT(timer_called == 1);
    +  ASSERT(r);
    +  ASSERT_EQ(1, timer_called);
     
       r = uv_run(uv_default_loop(), UV_RUN_NOWAIT);
    -  ASSERT(r != 0);
    -  ASSERT(prepare_called > 1);
    +  ASSERT(r);
    +  ASSERT_GT(prepare_called, 1);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    -  ASSERT(timer_called == 10);
    -  ASSERT(prepare_called == 10);
    +  ASSERT_OK(r);
    +  ASSERT_EQ(10, timer_called);
    +  ASSERT_EQ(10, prepare_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -76,7 +76,7 @@ TEST_IMPL(loop_stop_before_run) {
       ASSERT_OK(uv_timer_init(uv_default_loop(), &timer_handle));
       ASSERT_OK(uv_timer_start(&timer_handle, (uv_timer_cb) abort, 0, 0));
       uv_stop(uv_default_loop());
    -  ASSERT_NE(uv_run(uv_default_loop(), UV_RUN_DEFAULT), 0);
    +  ASSERT_NE(0, uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-loop-time.c b/deps/uv/test/test-loop-time.c
    index 5d083064ae3133..01e44ffbdad18c 100644
    --- a/deps/uv/test/test-loop-time.c
    +++ b/deps/uv/test/test-loop-time.c
    @@ -28,7 +28,7 @@ TEST_IMPL(loop_update_time) {
     
       start = uv_now(uv_default_loop());
       while (uv_now(uv_default_loop()) - start < 1000)
    -    ASSERT_EQ(0, uv_run(uv_default_loop(), UV_RUN_NOWAIT));
    +    ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_NOWAIT));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -46,23 +46,23 @@ TEST_IMPL(loop_backend_timeout) {
       /* The default loop has some internal watchers to initialize. */
       loop->active_handles++;
       r = uv_run(loop, UV_RUN_NOWAIT);
    -  ASSERT_EQ(r, 1);
    +  ASSERT_EQ(1, r);
       loop->active_handles--;
    -  ASSERT_EQ(uv_loop_alive(loop), 0);
    +  ASSERT_OK(uv_loop_alive(loop));
     
       r = uv_timer_init(loop, &timer);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
    -  ASSERT_EQ(uv_loop_alive(loop), 0);
    -  ASSERT_EQ(uv_backend_timeout(loop), 0);
    +  ASSERT_OK(uv_loop_alive(loop));
    +  ASSERT_OK(uv_backend_timeout(loop));
     
       r = uv_timer_start(&timer, cb, 1000, 0); /* 1 sec */
    -  ASSERT_EQ(r, 0);
    -  ASSERT_EQ(uv_backend_timeout(loop), 1000);
    +  ASSERT_OK(r);
    +  ASSERT_EQ(1000, uv_backend_timeout(loop));
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT_EQ(r, 0);
    -  ASSERT_EQ(uv_backend_timeout(loop), 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(uv_backend_timeout(loop));
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-metrics.c b/deps/uv/test/test-metrics.c
    index d532f4eff49ec1..c7c73aa53d79cc 100644
    --- a/deps/uv/test/test-metrics.c
    +++ b/deps/uv/test/test-metrics.c
    @@ -59,11 +59,11 @@ TEST_IMPL(metrics_idle_time) {
       cntr = 0;
       timer.data = &cntr;
     
    -  ASSERT_EQ(0, uv_loop_configure(uv_default_loop(), UV_METRICS_IDLE_TIME));
    -  ASSERT_EQ(0, uv_timer_init(uv_default_loop(), &timer));
    -  ASSERT_EQ(0, uv_timer_start(&timer, timer_spin_cb, timeout, 0));
    +  ASSERT_OK(uv_loop_configure(uv_default_loop(), UV_METRICS_IDLE_TIME));
    +  ASSERT_OK(uv_timer_init(uv_default_loop(), &timer));
    +  ASSERT_OK(uv_timer_start(&timer, timer_spin_cb, timeout, 0));
     
    -  ASSERT_EQ(0, uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
       ASSERT_GT(cntr, 0);
     
       idle_time = uv_metrics_idle_time(uv_default_loop());
    @@ -87,12 +87,12 @@ static void metrics_routine_cb(void* arg) {
       cntr = 0;
       timer.data = &cntr;
     
    -  ASSERT_EQ(0, uv_loop_init(&loop));
    -  ASSERT_EQ(0, uv_loop_configure(&loop, UV_METRICS_IDLE_TIME));
    -  ASSERT_EQ(0, uv_timer_init(&loop, &timer));
    -  ASSERT_EQ(0, uv_timer_start(&timer, timer_spin_cb, timeout, 0));
    +  ASSERT_OK(uv_loop_init(&loop));
    +  ASSERT_OK(uv_loop_configure(&loop, UV_METRICS_IDLE_TIME));
    +  ASSERT_OK(uv_timer_init(&loop, &timer));
    +  ASSERT_OK(uv_timer_start(&timer, timer_spin_cb, timeout, 0));
     
    -  ASSERT_EQ(0, uv_run(&loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(&loop, UV_RUN_DEFAULT));
       ASSERT_GT(cntr, 0);
     
       idle_time = uv_metrics_idle_time(&loop);
    @@ -104,7 +104,7 @@ static void metrics_routine_cb(void* arg) {
       ASSERT_GE(idle_time, (timeout - 500) * UV_NS_TO_MS);
     
       close_loop(&loop);
    -  ASSERT_EQ(0, uv_loop_close(&loop));
    +  ASSERT_OK(uv_loop_close(&loop));
     }
     
     
    @@ -113,7 +113,7 @@ TEST_IMPL(metrics_idle_time_thread) {
       int i;
     
       for (i = 0; i < 5; i++) {
    -    ASSERT_EQ(0, uv_thread_create(&threads[i], metrics_routine_cb, NULL));
    +    ASSERT_OK(uv_thread_create(&threads[i], metrics_routine_cb, NULL));
       }
     
       for (i = 0; i < 5; i++) {
    @@ -136,16 +136,16 @@ TEST_IMPL(metrics_idle_time_zero) {
     
       cntr = 0;
       timer.data = &cntr;
    -  ASSERT_EQ(0, uv_loop_configure(uv_default_loop(), UV_METRICS_IDLE_TIME));
    -  ASSERT_EQ(0, uv_timer_init(uv_default_loop(), &timer));
    -  ASSERT_EQ(0, uv_timer_start(&timer, timer_noop_cb, 0, 0));
    +  ASSERT_OK(uv_loop_configure(uv_default_loop(), UV_METRICS_IDLE_TIME));
    +  ASSERT_OK(uv_timer_init(uv_default_loop(), &timer));
    +  ASSERT_OK(uv_timer_start(&timer, timer_noop_cb, 0, 0));
     
    -  ASSERT_EQ(0, uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
       ASSERT_GT(cntr, 0);
    -  ASSERT_EQ(0, uv_metrics_idle_time(uv_default_loop()));
    +  ASSERT_OK(uv_metrics_idle_time(uv_default_loop()));
     
    -  ASSERT_EQ(0, uv_metrics_info(uv_default_loop(), &metrics));
    +  ASSERT_OK(uv_metrics_info(uv_default_loop(), &metrics));
       ASSERT_UINT64_EQ(cntr, metrics.loop_count);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
    @@ -156,7 +156,7 @@ TEST_IMPL(metrics_idle_time_zero) {
     static void close_cb(uv_fs_t* req) {
       uv_metrics_t metrics;
     
    -  ASSERT_EQ(0, uv_metrics_info(uv_default_loop(), &metrics));
    +  ASSERT_OK(uv_metrics_info(uv_default_loop(), &metrics));
       ASSERT_UINT64_EQ(3, metrics.loop_count);
       ASSERT_UINT64_GT(metrics.events, last_events_count);
     
    @@ -168,7 +168,7 @@ static void close_cb(uv_fs_t* req) {
     static void write_cb(uv_fs_t* req) {
       uv_metrics_t metrics;
     
    -  ASSERT_EQ(0, uv_metrics_info(uv_default_loop(), &metrics));
    +  ASSERT_OK(uv_metrics_info(uv_default_loop(), &metrics));
       ASSERT_UINT64_EQ(2, metrics.loop_count);
       ASSERT_UINT64_GT(metrics.events, last_events_count);
       ASSERT_EQ(req->result, sizeof(test_buf));
    @@ -176,17 +176,17 @@ static void write_cb(uv_fs_t* req) {
       uv_fs_req_cleanup(req);
       last_events_count = metrics.events;
     
    -  ASSERT_EQ(0, uv_fs_close(uv_default_loop(),
    -                           &fs_reqs.close_req,
    -                           fs_reqs.open_req.result,
    -                           close_cb));
    +  ASSERT_OK(uv_fs_close(uv_default_loop(),
    +                        &fs_reqs.close_req,
    +                        fs_reqs.open_req.result,
    +                        close_cb));
     }
     
     
     static void create_cb(uv_fs_t* req) {
       uv_metrics_t metrics;
     
    -  ASSERT_EQ(0, uv_metrics_info(uv_default_loop(), &metrics));
    +  ASSERT_OK(uv_metrics_info(uv_default_loop(), &metrics));
       /* Event count here is still 0 so not going to check. */
       ASSERT_UINT64_EQ(1, metrics.loop_count);
       ASSERT_GE(req->result, 0);
    @@ -195,13 +195,13 @@ static void create_cb(uv_fs_t* req) {
       last_events_count = metrics.events;
     
       uv_buf_t iov = uv_buf_init(test_buf, sizeof(test_buf));
    -  ASSERT_EQ(0, uv_fs_write(uv_default_loop(),
    -                           &fs_reqs.write_req,
    -                           req->result,
    -                           &iov,
    -                           1,
    -                           0,
    -                           write_cb));
    +  ASSERT_OK(uv_fs_write(uv_default_loop(),
    +                        &fs_reqs.write_req,
    +                        req->result,
    +                        &iov,
    +                        1,
    +                        0,
    +                        write_cb));
     }
     
     
    @@ -210,15 +210,15 @@ static void prepare_cb(uv_prepare_t* handle) {
     
       uv_prepare_stop(handle);
     
    -  ASSERT_EQ(0, uv_metrics_info(uv_default_loop(), &metrics));
    +  ASSERT_OK(uv_metrics_info(uv_default_loop(), &metrics));
       ASSERT_UINT64_EQ(0, metrics.loop_count);
       ASSERT_UINT64_EQ(0, metrics.events);
     
    -  ASSERT_EQ(0, uv_fs_open(uv_default_loop(),
    -                          &fs_reqs.open_req,
    -                          "test_file",
    -                          O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR,
    -                          create_cb));
    +  ASSERT_OK(uv_fs_open(uv_default_loop(),
    +                       &fs_reqs.open_req,
    +                       "test_file",
    +                       O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR,
    +                       create_cb));
     }
     
     
    @@ -229,10 +229,10 @@ TEST_IMPL(metrics_info_check) {
       uv_fs_unlink(NULL, &unlink_req, "test_file", NULL);
       uv_fs_req_cleanup(&unlink_req);
     
    -  ASSERT_EQ(0, uv_prepare_init(uv_default_loop(), &prepare));
    -  ASSERT_EQ(0, uv_prepare_start(&prepare, prepare_cb));
    +  ASSERT_OK(uv_prepare_init(uv_default_loop(), &prepare));
    +  ASSERT_OK(uv_prepare_start(&prepare, prepare_cb));
     
    -  ASSERT_EQ(0, uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
       uv_fs_unlink(NULL, &unlink_req, "test_file", NULL);
       uv_fs_req_cleanup(&unlink_req);
    diff --git a/deps/uv/test/test-multiple-listen.c b/deps/uv/test/test-multiple-listen.c
    index bbaa9bc1ef1265..47f35f6c05873c 100644
    --- a/deps/uv/test/test-multiple-listen.c
    +++ b/deps/uv/test/test-multiple-listen.c
    @@ -38,7 +38,7 @@ static void close_cb(uv_handle_t* handle) {
     
     
     static void connection_cb(uv_stream_t* tcp, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       uv_close((uv_handle_t*)&server, close_cb);
       connection_cb_called++;
     }
    @@ -48,25 +48,25 @@ static void start_server(void) {
       struct sockaddr_in addr;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
     
       r = uv_tcp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_listen((uv_stream_t*)&server, 128, connection_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_listen((uv_stream_t*)&server, 128, connection_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
     static void connect_cb(uv_connect_t* req, int status) {
       ASSERT_NOT_NULL(req);
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       free(req);
       uv_close((uv_handle_t*)&client, close_cb);
       connect_cb_called++;
    @@ -78,17 +78,17 @@ static void client_connect(void) {
       uv_connect_t* connect_req = malloc(sizeof *connect_req);
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
       ASSERT_NOT_NULL(connect_req);
     
       r = uv_tcp_init(uv_default_loop(), &client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_connect(connect_req,
                          &client,
                          (const struct sockaddr*) &addr,
                          connect_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -100,9 +100,9 @@ TEST_IMPL(multiple_listen) {
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(connection_cb_called == 1);
    -  ASSERT(connect_cb_called == 1);
    -  ASSERT(close_cb_called == 2);
    +  ASSERT_EQ(1, connection_cb_called);
    +  ASSERT_EQ(1, connect_cb_called);
    +  ASSERT_EQ(2, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-mutexes.c b/deps/uv/test/test-mutexes.c
    index 975222ca1229d7..ca3377324b2eab 100644
    --- a/deps/uv/test/test-mutexes.c
    +++ b/deps/uv/test/test-mutexes.c
    @@ -40,7 +40,7 @@ TEST_IMPL(thread_mutex) {
       int r;
     
       r = uv_mutex_init(&mutex);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_mutex_lock(&mutex);
       uv_mutex_unlock(&mutex);
    @@ -55,11 +55,11 @@ TEST_IMPL(thread_mutex_recursive) {
       int r;
     
       r = uv_mutex_init_recursive(&mutex);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_mutex_lock(&mutex);
       uv_mutex_lock(&mutex);
    -  ASSERT(0 == uv_mutex_trylock(&mutex));
    +  ASSERT_OK(uv_mutex_trylock(&mutex));
     
       uv_mutex_unlock(&mutex);
       uv_mutex_unlock(&mutex);
    @@ -75,7 +75,7 @@ TEST_IMPL(thread_rwlock) {
       int r;
     
       r = uv_rwlock_init(&rwlock);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_rwlock_rdlock(&rwlock);
       uv_rwlock_rdunlock(&rwlock);
    @@ -101,7 +101,7 @@ static void synchronize(void) {
       synchronize_nowait();
       /* Wait for the other thread.  Guard against spurious wakeups. */
       for (current = step; current == step; uv_cond_wait(&condvar, &mutex));
    -  ASSERT(step == current + 1);
    +  ASSERT_EQ(step, current + 1);
     }
     
     
    @@ -111,23 +111,23 @@ static void thread_rwlock_trylock_peer(void* unused) {
       uv_mutex_lock(&mutex);
     
       /* Write lock held by other thread. */
    -  ASSERT(UV_EBUSY == uv_rwlock_tryrdlock(&rwlock));
    -  ASSERT(UV_EBUSY == uv_rwlock_trywrlock(&rwlock));
    +  ASSERT_EQ(UV_EBUSY, uv_rwlock_tryrdlock(&rwlock));
    +  ASSERT_EQ(UV_EBUSY, uv_rwlock_trywrlock(&rwlock));
       synchronize();
     
       /* Read lock held by other thread. */
    -  ASSERT(0 == uv_rwlock_tryrdlock(&rwlock));
    +  ASSERT_OK(uv_rwlock_tryrdlock(&rwlock));
       uv_rwlock_rdunlock(&rwlock);
    -  ASSERT(UV_EBUSY == uv_rwlock_trywrlock(&rwlock));
    +  ASSERT_EQ(UV_EBUSY, uv_rwlock_trywrlock(&rwlock));
       synchronize();
     
       /* Acquire write lock. */
    -  ASSERT(0 == uv_rwlock_trywrlock(&rwlock));
    +  ASSERT_OK(uv_rwlock_trywrlock(&rwlock));
       synchronize();
     
       /* Release write lock and acquire read lock. */
       uv_rwlock_wrunlock(&rwlock);
    -  ASSERT(0 == uv_rwlock_tryrdlock(&rwlock));
    +  ASSERT_OK(uv_rwlock_tryrdlock(&rwlock));
       synchronize();
     
       uv_rwlock_rdunlock(&rwlock);
    @@ -139,22 +139,22 @@ static void thread_rwlock_trylock_peer(void* unused) {
     TEST_IMPL(thread_rwlock_trylock) {
       uv_thread_t thread;
     
    -  ASSERT(0 == uv_cond_init(&condvar));
    -  ASSERT(0 == uv_mutex_init(&mutex));
    -  ASSERT(0 == uv_rwlock_init(&rwlock));
    +  ASSERT_OK(uv_cond_init(&condvar));
    +  ASSERT_OK(uv_mutex_init(&mutex));
    +  ASSERT_OK(uv_rwlock_init(&rwlock));
     
       uv_mutex_lock(&mutex);
    -  ASSERT(0 == uv_thread_create(&thread, thread_rwlock_trylock_peer, NULL));
    +  ASSERT_OK(uv_thread_create(&thread, thread_rwlock_trylock_peer, NULL));
     
       /* Hold write lock. */
    -  ASSERT(0 == uv_rwlock_trywrlock(&rwlock));
    +  ASSERT_OK(uv_rwlock_trywrlock(&rwlock));
       synchronize();  /* Releases the mutex to the other thread. */
     
       /* Release write lock and acquire read lock.  Pthreads doesn't support
        * the notion of upgrading or downgrading rwlocks, so neither do we.
        */
       uv_rwlock_wrunlock(&rwlock);
    -  ASSERT(0 == uv_rwlock_tryrdlock(&rwlock));
    +  ASSERT_OK(uv_rwlock_tryrdlock(&rwlock));
       synchronize();
     
       /* Release read lock. */
    @@ -162,17 +162,17 @@ TEST_IMPL(thread_rwlock_trylock) {
       synchronize();
     
       /* Write lock held by other thread. */
    -  ASSERT(UV_EBUSY == uv_rwlock_tryrdlock(&rwlock));
    -  ASSERT(UV_EBUSY == uv_rwlock_trywrlock(&rwlock));
    +  ASSERT_EQ(UV_EBUSY, uv_rwlock_tryrdlock(&rwlock));
    +  ASSERT_EQ(UV_EBUSY, uv_rwlock_trywrlock(&rwlock));
       synchronize();
     
       /* Read lock held by other thread. */
    -  ASSERT(0 == uv_rwlock_tryrdlock(&rwlock));
    +  ASSERT_OK(uv_rwlock_tryrdlock(&rwlock));
       uv_rwlock_rdunlock(&rwlock);
    -  ASSERT(UV_EBUSY == uv_rwlock_trywrlock(&rwlock));
    +  ASSERT_EQ(UV_EBUSY, uv_rwlock_trywrlock(&rwlock));
       synchronize();
     
    -  ASSERT(0 == uv_thread_join(&thread));
    +  ASSERT_OK(uv_thread_join(&thread));
       uv_rwlock_destroy(&rwlock);
       uv_mutex_unlock(&mutex);
       uv_mutex_destroy(&mutex);
    diff --git a/deps/uv/test/test-not-readable-nor-writable-on-read-error.c b/deps/uv/test/test-not-readable-nor-writable-on-read-error.c
    index 823a4e91e29096..2c45a2da2e88e3 100644
    --- a/deps/uv/test/test-not-readable-nor-writable-on-read-error.c
    +++ b/deps/uv/test/test-not-readable-nor-writable-on-read-error.c
    @@ -35,7 +35,7 @@ static int close_cb_called;
     
     static void write_cb(uv_write_t* req, int status) {
       write_cb_called++;
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     }
     
     static void alloc_cb(uv_handle_t* handle,
    @@ -54,8 +54,8 @@ static void read_cb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) {
       read_cb_called++;
     
       ASSERT((nread < 0) && (nread != UV_EOF));
    -  ASSERT(0 == uv_is_writable(handle));
    -  ASSERT(0 == uv_is_readable(handle));
    +  ASSERT_OK(uv_is_writable(handle));
    +  ASSERT_OK(uv_is_readable(handle));
     
       uv_close((uv_handle_t*) handle, close_cb);
     }
    @@ -65,10 +65,10 @@ static void connect_cb(uv_connect_t* req, int status) {
       uv_buf_t reset_me;
     
       connect_cb_called++;
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
       r = uv_read_start((uv_stream_t*) &tcp_client, alloc_cb, read_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       reset_me = uv_buf_init(reset_me_cmd, sizeof(reset_me_cmd));
     
    @@ -78,26 +78,26 @@ static void connect_cb(uv_connect_t* req, int status) {
                    1,
                    write_cb);
     
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     TEST_IMPL(not_readable_nor_writable_on_read_error) {
       struct sockaddr_in sa;
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &sa));
    -  ASSERT(0 == uv_loop_init(&loop));
    -  ASSERT(0 == uv_tcp_init(&loop, &tcp_client));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &sa));
    +  ASSERT_OK(uv_loop_init(&loop));
    +  ASSERT_OK(uv_tcp_init(&loop, &tcp_client));
     
    -  ASSERT(0 == uv_tcp_connect(&connect_req,
    -                             &tcp_client,
    -                             (const struct sockaddr*) &sa,
    -                             connect_cb));
    +  ASSERT_OK(uv_tcp_connect(&connect_req,
    +                           &tcp_client,
    +                           (const struct sockaddr*) &sa,
    +                           connect_cb));
     
    -  ASSERT(0 == uv_run(&loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(&loop, UV_RUN_DEFAULT));
     
    -  ASSERT(connect_cb_called == 1);
    -  ASSERT(read_cb_called == 1);
    -  ASSERT(write_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, connect_cb_called);
    +  ASSERT_EQ(1, read_cb_called);
    +  ASSERT_EQ(1, write_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(&loop);
       return 0;
    diff --git a/deps/uv/test/test-not-writable-after-shutdown.c b/deps/uv/test/test-not-writable-after-shutdown.c
    index 84e09177bd3651..066f8bbafebebe 100644
    --- a/deps/uv/test/test-not-writable-after-shutdown.c
    +++ b/deps/uv/test/test-not-writable-after-shutdown.c
    @@ -34,12 +34,12 @@ static void shutdown_cb(uv_shutdown_t* req, int status) {
     
     static void connect_cb(uv_connect_t* req, int status) {
       int r;
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
       r = uv_shutdown(&shutdown_req, req->handle, shutdown_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(0 == uv_is_writable(req->handle));
    +  ASSERT_OK(uv_is_writable(req->handle));
     }
     
     TEST_IMPL(not_writable_after_shutdown) {
    @@ -49,20 +49,20 @@ TEST_IMPL(not_writable_after_shutdown) {
       uv_tcp_t socket;
       uv_connect_t connect_req;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
       loop = uv_default_loop();
     
       r = uv_tcp_init(loop, &socket);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_connect(&connect_req,
                          &socket,
                          (const struct sockaddr*) &addr,
                          connect_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-osx-select.c b/deps/uv/test/test-osx-select.c
    index 00ae540b405a6c..44e2c6d8dd2e30 100644
    --- a/deps/uv/test/test-osx-select.c
    +++ b/deps/uv/test/test-osx-select.c
    @@ -62,7 +62,7 @@ TEST_IMPL(osx_select) {
       }
     
       r = uv_tty_init(uv_default_loop(), &tty, fd, 1);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_read_start((uv_stream_t*) &tty, alloc_cb, read_cb);
     
    @@ -72,12 +72,12 @@ TEST_IMPL(osx_select) {
             "feel pretty happy\n";
       for (i = 0, len = strlen(str); i < len; i++) {
         r = ioctl(fd, TIOCSTI, str + i);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(read_count == 3);
    +  ASSERT_EQ(3, read_count);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -97,13 +97,13 @@ TEST_IMPL(osx_select_many_fds) {
       TEST_FILE_LIMIT(ARRAY_SIZE(tcps) + 100);
     
       r = uv_ip4_addr("127.0.0.1", 0, &addr);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       for (i = 0; i < ARRAY_SIZE(tcps); i++) {
         r = uv_tcp_init(uv_default_loop(), &tcps[i]);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         r = uv_tcp_bind(&tcps[i], (const struct sockaddr *) &addr, 0);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         uv_unref((uv_handle_t*) &tcps[i]);
       }
     
    @@ -115,10 +115,10 @@ TEST_IMPL(osx_select_many_fds) {
       }
     
       r = uv_tty_init(uv_default_loop(), &tty, fd, 1);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_read_start((uv_stream_t*) &tty, alloc_cb, read_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Emulate user-input */
       str = "got some input\n"
    @@ -126,12 +126,12 @@ TEST_IMPL(osx_select_many_fds) {
             "feel pretty happy\n";
       for (i = 0, len = strlen(str); i < len; i++) {
         r = ioctl(fd, TIOCSTI, str + i);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(read_count == 3);
    +  ASSERT_EQ(3, read_count);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-ping-pong.c b/deps/uv/test/test-ping-pong.c
    index f54f2ad22e59d9..cd9fbf62bba4ae 100644
    --- a/deps/uv/test/test-ping-pong.c
    +++ b/deps/uv/test/test-ping-pong.c
    @@ -83,7 +83,7 @@ static void pinger_on_close(uv_handle_t* handle) {
     
     
     static void pinger_after_write(uv_write_t* req, int status) {
    -  ASSERT_EQ(status, 0);
    +  ASSERT_OK(status);
       free(req->data);
       free(req);
     }
    @@ -112,7 +112,7 @@ static void pinger_write_ping(pinger_t* pinger) {
       req = malloc(sizeof(*req));
       ASSERT_NOT_NULL(req);
       req->data = NULL;
    -  ASSERT_EQ(0, uv_write(req, stream, bufs, nbufs, pinger_after_write));
    +  ASSERT_OK(uv_write(req, stream, bufs, nbufs, pinger_after_write));
     
       puts("PING");
     }
    @@ -188,7 +188,7 @@ static void ponger_read_cb(uv_stream_t* stream,
       req = malloc(sizeof(*req));
       ASSERT_NOT_NULL(req);
       req->data = buf->base;
    -  ASSERT_EQ(0, uv_write(req, stream, &writebuf, 1, pinger_after_write));
    +  ASSERT_OK(uv_write(req, stream, &writebuf, 1, pinger_after_write));
     }
     
     
    @@ -197,17 +197,17 @@ static void pinger_on_connect(uv_connect_t* req, int status) {
     
       pinger_on_connect_count++;
     
    -  ASSERT_EQ(status, 0);
    +  ASSERT_OK(status);
     
       ASSERT_EQ(1, uv_is_readable(req->handle));
       ASSERT_EQ(1, uv_is_writable(req->handle));
    -  ASSERT_EQ(0, uv_is_closing((uv_handle_t *) req->handle));
    +  ASSERT_OK(uv_is_closing((uv_handle_t *) req->handle));
     
       pinger_write_ping(pinger);
     
    -  ASSERT_EQ(0, uv_read_start((uv_stream_t*) req->handle,
    -                             alloc_cb,
    -                             pinger_read_cb));
    +  ASSERT_OK(uv_read_start((uv_stream_t*) req->handle,
    +                          alloc_cb,
    +                          pinger_read_cb));
     }
     
     
    @@ -218,7 +218,7 @@ static void tcp_pinger_v6_new(int vectored_writes) {
       pinger_t* pinger;
     
     
    -  ASSERT_EQ(0, uv_ip6_addr("::1", TEST_PORT, &server_addr));
    +  ASSERT_OK(uv_ip6_addr("::1", TEST_PORT, &server_addr));
       pinger = malloc(sizeof(*pinger));
       ASSERT_NOT_NULL(pinger);
       pinger->vectored_writes = vectored_writes;
    @@ -229,7 +229,7 @@ static void tcp_pinger_v6_new(int vectored_writes) {
       /* Try to connect to the server and do NUM_PINGS ping-pongs. */
       r = uv_tcp_init(uv_default_loop(), &pinger->stream.tcp);
       pinger->stream.tcp.data = pinger;
    -  ASSERT_EQ(0, r);
    +  ASSERT_OK(r);
     
       /* We are never doing multiple reads/connects at a time anyway, so these
        * handles can be pre-initialized. */
    @@ -237,10 +237,10 @@ static void tcp_pinger_v6_new(int vectored_writes) {
                          &pinger->stream.tcp,
                          (const struct sockaddr*) &server_addr,
                          pinger_on_connect);
    -  ASSERT_EQ(0, r);
    +  ASSERT_OK(r);
     
       /* Synchronous connect callbacks are not allowed. */
    -  ASSERT_EQ(pinger_on_connect_count, 0);
    +  ASSERT_OK(pinger_on_connect_count);
     }
     
     
    @@ -249,7 +249,7 @@ static void tcp_pinger_new(int vectored_writes) {
       struct sockaddr_in server_addr;
       pinger_t* pinger;
     
    -  ASSERT_EQ(0, uv_ip4_addr("127.0.0.1", TEST_PORT, &server_addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &server_addr));
       pinger = malloc(sizeof(*pinger));
       ASSERT_NOT_NULL(pinger);
       pinger->vectored_writes = vectored_writes;
    @@ -260,7 +260,7 @@ static void tcp_pinger_new(int vectored_writes) {
       /* Try to connect to the server and do NUM_PINGS ping-pongs. */
       r = uv_tcp_init(uv_default_loop(), &pinger->stream.tcp);
       pinger->stream.tcp.data = pinger;
    -  ASSERT_EQ(0, r);
    +  ASSERT_OK(r);
     
       /* We are never doing multiple reads/connects at a time anyway, so these
        * handles can be pre-initialized. */
    @@ -268,10 +268,10 @@ static void tcp_pinger_new(int vectored_writes) {
                          &pinger->stream.tcp,
                          (const struct sockaddr*) &server_addr,
                          pinger_on_connect);
    -  ASSERT_EQ(0, r);
    +  ASSERT_OK(r);
     
       /* Synchronous connect callbacks are not allowed. */
    -  ASSERT_EQ(pinger_on_connect_count, 0);
    +  ASSERT_OK(pinger_on_connect_count);
     }
     
     
    @@ -289,7 +289,7 @@ static void pipe_pinger_new(int vectored_writes) {
       /* Try to connect to the server and do NUM_PINGS ping-pongs. */
       r = uv_pipe_init(uv_default_loop(), &pinger->stream.pipe, 0);
       pinger->stream.pipe.data = pinger;
    -  ASSERT_EQ(0, r);
    +  ASSERT_OK(r);
     
       /* We are never doing multiple reads/connects at a time anyway, so these
        * handles can be pre-initialized. */
    @@ -297,7 +297,7 @@ static void pipe_pinger_new(int vectored_writes) {
           pinger_on_connect);
     
       /* Synchronous connect callbacks are not allowed. */
    -  ASSERT_EQ(pinger_on_connect_count, 0);
    +  ASSERT_OK(pinger_on_connect_count);
     }
     
     
    @@ -315,31 +315,31 @@ static void socketpair_pinger_new(int vectored_writes) {
     
       /* Try to make a socketpair and do NUM_PINGS ping-pongs. */
       (void)uv_default_loop(); /* ensure WSAStartup has been performed */
    -  ASSERT_EQ(0, uv_socketpair(SOCK_STREAM, 0, fds, UV_NONBLOCK_PIPE, UV_NONBLOCK_PIPE));
    +  ASSERT_OK(uv_socketpair(SOCK_STREAM, 0, fds, UV_NONBLOCK_PIPE, UV_NONBLOCK_PIPE));
     #ifndef _WIN32
       /* On Windows, this is actually a UV_TCP, but libuv doesn't detect that. */
       ASSERT_EQ(uv_guess_handle((uv_file) fds[0]), UV_NAMED_PIPE);
       ASSERT_EQ(uv_guess_handle((uv_file) fds[1]), UV_NAMED_PIPE);
     #endif
     
    -  ASSERT_EQ(0, uv_tcp_init(uv_default_loop(), &pinger->stream.tcp));
    +  ASSERT_OK(uv_tcp_init(uv_default_loop(), &pinger->stream.tcp));
       pinger->stream.pipe.data = pinger;
    -  ASSERT_EQ(0, uv_tcp_open(&pinger->stream.tcp, fds[1]));
    +  ASSERT_OK(uv_tcp_open(&pinger->stream.tcp, fds[1]));
     
       ponger = malloc(sizeof(*ponger));
       ASSERT_NOT_NULL(ponger);
       ponger->data = NULL;
    -  ASSERT_EQ(0, uv_tcp_init(uv_default_loop(), ponger));
    -  ASSERT_EQ(0, uv_tcp_open(ponger, fds[0]));
    +  ASSERT_OK(uv_tcp_init(uv_default_loop(), ponger));
    +  ASSERT_OK(uv_tcp_open(ponger, fds[0]));
     
       pinger_write_ping(pinger);
     
    -  ASSERT_EQ(0, uv_read_start((uv_stream_t*) &pinger->stream.tcp,
    -                             alloc_cb,
    -                             pinger_read_cb));
    -  ASSERT_EQ(0, uv_read_start((uv_stream_t*) ponger,
    -                             alloc_cb,
    -                             ponger_read_cb));
    +  ASSERT_OK(uv_read_start((uv_stream_t*) &pinger->stream.tcp,
    +                          alloc_cb,
    +                          pinger_read_cb));
    +  ASSERT_OK(uv_read_start((uv_stream_t*) ponger,
    +                          alloc_cb,
    +                          ponger_read_cb));
     }
     
     
    @@ -349,14 +349,14 @@ static void pipe2_pinger_new(int vectored_writes) {
       uv_pipe_t* ponger;
     
       /* Try to make a pipe and do NUM_PINGS pings. */
    -  ASSERT_EQ(0, uv_pipe(fds, UV_NONBLOCK_PIPE, UV_NONBLOCK_PIPE));
    +  ASSERT_OK(uv_pipe(fds, UV_NONBLOCK_PIPE, UV_NONBLOCK_PIPE));
       ASSERT_EQ(uv_guess_handle(fds[0]), UV_NAMED_PIPE);
       ASSERT_EQ(uv_guess_handle(fds[1]), UV_NAMED_PIPE);
     
       ponger = malloc(sizeof(*ponger));
       ASSERT_NOT_NULL(ponger);
    -  ASSERT_EQ(0, uv_pipe_init(uv_default_loop(), ponger, 0));
    -  ASSERT_EQ(0, uv_pipe_open(ponger, fds[0]));
    +  ASSERT_OK(uv_pipe_init(uv_default_loop(), ponger, 0));
    +  ASSERT_OK(uv_pipe_open(ponger, fds[0]));
     
       pinger = malloc(sizeof(*pinger));
       ASSERT_NOT_NULL(pinger);
    @@ -364,19 +364,19 @@ static void pipe2_pinger_new(int vectored_writes) {
       pinger->state = 0;
       pinger->pongs = 0;
       pinger->pong = PING;
    -  ASSERT_EQ(0, uv_pipe_init(uv_default_loop(), &pinger->stream.pipe, 0));
    -  ASSERT_EQ(0, uv_pipe_open(&pinger->stream.pipe, fds[1]));
    +  ASSERT_OK(uv_pipe_init(uv_default_loop(), &pinger->stream.pipe, 0));
    +  ASSERT_OK(uv_pipe_open(&pinger->stream.pipe, fds[1]));
       pinger->stream.pipe.data = pinger; /* record for close_cb */
       ponger->data = pinger; /* record for read_cb */
     
       pinger_write_ping(pinger);
     
    -  ASSERT_EQ(0, uv_read_start((uv_stream_t*) ponger, alloc_cb, pinger_read_cb));
    +  ASSERT_OK(uv_read_start((uv_stream_t*) ponger, alloc_cb, pinger_read_cb));
     }
     
     static int run_ping_pong_test(void) {
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT_EQ(completed_pingers, 1);
    +  ASSERT_EQ(1, completed_pingers);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-pipe-bind-error.c b/deps/uv/test/test-pipe-bind-error.c
    index f8626302a1d899..381a0084dec2cc 100644
    --- a/deps/uv/test/test-pipe-bind-error.c
    +++ b/deps/uv/test/test-pipe-bind-error.c
    @@ -46,26 +46,26 @@ TEST_IMPL(pipe_bind_error_addrinuse) {
       int r;
     
       r = uv_pipe_init(uv_default_loop(), &server1, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_pipe_bind(&server1, TEST_PIPENAME);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_pipe_init(uv_default_loop(), &server2, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_pipe_bind(&server2, TEST_PIPENAME);
    -  ASSERT(r == UV_EADDRINUSE);
    +  ASSERT_EQ(r, UV_EADDRINUSE);
     
       r = uv_listen((uv_stream_t*)&server1, SOMAXCONN, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_listen((uv_stream_t*)&server2, SOMAXCONN, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       uv_close((uv_handle_t*)&server1, close_cb);
       uv_close((uv_handle_t*)&server2, close_cb);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(close_cb_called == 2);
    +  ASSERT_EQ(2, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -77,16 +77,16 @@ TEST_IMPL(pipe_bind_error_addrnotavail) {
       int r;
     
       r = uv_pipe_init(uv_default_loop(), &server, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_pipe_bind(&server, BAD_PIPENAME);
    -  ASSERT(r == UV_EACCES);
    +  ASSERT_EQ(r, UV_EACCES);
     
       uv_close((uv_handle_t*)&server, close_cb);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -98,17 +98,17 @@ TEST_IMPL(pipe_bind_error_inval) {
       int r;
     
       r = uv_pipe_init(uv_default_loop(), &server, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_pipe_bind(&server, TEST_PIPENAME);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_pipe_bind(&server, TEST_PIPENAME_2);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       uv_close((uv_handle_t*)&server, close_cb);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -123,16 +123,16 @@ TEST_IMPL(pipe_listen_without_bind) {
       int r;
     
       r = uv_pipe_init(uv_default_loop(), &server, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_listen((uv_stream_t*)&server, SOMAXCONN, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       uv_close((uv_handle_t*)&server, close_cb);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -141,14 +141,14 @@ TEST_IMPL(pipe_listen_without_bind) {
     TEST_IMPL(pipe_bind_or_listen_error_after_close) {
       uv_pipe_t server;
     
    -  ASSERT_EQ(uv_pipe_init(uv_default_loop(), &server, 0), 0);
    +  ASSERT_OK(uv_pipe_init(uv_default_loop(), &server, 0));
       uv_close((uv_handle_t*) &server, NULL);
     
       ASSERT_EQ(uv_pipe_bind(&server, TEST_PIPENAME), UV_EINVAL);
     
       ASSERT_EQ(uv_listen((uv_stream_t*) &server, SOMAXCONN, NULL), UV_EINVAL);
     
    -  ASSERT_EQ(uv_run(uv_default_loop(), UV_RUN_DEFAULT), 0);
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-pipe-close-stdout-read-stdin.c b/deps/uv/test/test-pipe-close-stdout-read-stdin.c
    index a9295f0aa59f62..51bbf0f54e23d5 100644
    --- a/deps/uv/test/test-pipe-close-stdout-read-stdin.c
    +++ b/deps/uv/test/test-pipe-close-stdout-read-stdin.c
    @@ -61,7 +61,7 @@ TEST_IMPL(pipe_close_stdout_read_stdin) {
       uv_pipe_t stdin_pipe;
     
       r = pipe(fd);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
         
     #if defined(__APPLE__) && (TARGET_OS_TV || TARGET_OS_WATCH)
       pid = -1;
    @@ -80,24 +80,24 @@ TEST_IMPL(pipe_close_stdout_read_stdin) {
         ASSERT(-1 <= r && r <= 1);
         close(0);
         r = dup(fd[0]);
    -    ASSERT(r != -1);
    +    ASSERT_NE(r, -1);
     
         /* Create a stream that reads from the pipe. */
         r = uv_pipe_init(uv_default_loop(), (uv_pipe_t *)&stdin_pipe, 0);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
         r = uv_pipe_open((uv_pipe_t *)&stdin_pipe, 0);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
         r = uv_read_start((uv_stream_t *)&stdin_pipe, alloc_buffer, read_stdin);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
         /*
          * Because the other end of the pipe was closed, there should
          * be no event left to process after one run of the event loop.
          * Otherwise, it means that events were not processed correctly.
          */
    -    ASSERT(uv_run(uv_default_loop(), UV_RUN_NOWAIT) == 0);
    +    ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_NOWAIT));
       } else {
         /*
          * Close both ends of the pipe so that the child
    diff --git a/deps/uv/test/test-pipe-connect-error.c b/deps/uv/test/test-pipe-connect-error.c
    index 140e7d32dafc44..ee6e0776f3371e 100644
    --- a/deps/uv/test/test-pipe-connect-error.c
    +++ b/deps/uv/test/test-pipe-connect-error.c
    @@ -64,13 +64,13 @@ TEST_IMPL(pipe_connect_bad_name) {
       int r;
     
       r = uv_pipe_init(uv_default_loop(), &client, 0);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
       uv_pipe_connect(&req, &client, BAD_PIPENAME, connect_cb);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT_EQ(close_cb_called, 1);
    -  ASSERT_EQ(connect_cb_called, 1);
    +  ASSERT_EQ(1, close_cb_called);
    +  ASSERT_EQ(1, connect_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -84,13 +84,13 @@ TEST_IMPL(pipe_connect_to_file) {
       int r;
     
       r = uv_pipe_init(uv_default_loop(), &client, 0);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
       uv_pipe_connect(&req, &client, path, connect_cb_file);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT_EQ(close_cb_called, 1);
    -  ASSERT_EQ(connect_cb_called, 1);
    +  ASSERT_EQ(1, close_cb_called);
    +  ASSERT_EQ(1, connect_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-pipe-connect-multiple.c b/deps/uv/test/test-pipe-connect-multiple.c
    index b8f417e81caff0..69a09ec6cddad9 100644
    --- a/deps/uv/test/test-pipe-connect-multiple.c
    +++ b/deps/uv/test/test-pipe-connect-multiple.c
    @@ -44,14 +44,14 @@ static uv_pipe_t connections[NUM_CLIENTS];
     static void connection_cb(uv_stream_t* server, int status) {
       int r;
       uv_pipe_t* conn;
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
       conn = &connections[connection_cb_called];
       r = uv_pipe_init(server->loop, conn, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_accept(server, (uv_stream_t*)conn);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       if (++connection_cb_called == NUM_CLIENTS &&
           connect_cb_called == NUM_CLIENTS) {
    @@ -61,7 +61,7 @@ static void connection_cb(uv_stream_t* server, int status) {
     
     
     static void connect_cb(uv_connect_t* connect_req, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       if (++connect_cb_called == NUM_CLIENTS &&
           connection_cb_called == NUM_CLIENTS) {
         uv_stop(connect_req->handle->loop);
    @@ -80,17 +80,17 @@ TEST_IMPL(pipe_connect_multiple) {
       loop = uv_default_loop();
     
       r = uv_pipe_init(loop, &server_handle, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_pipe_bind(&server_handle, TEST_PIPENAME);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_listen((uv_stream_t*)&server_handle, 128, connection_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       for (i = 0; i < NUM_CLIENTS; i++) {
         r = uv_pipe_init(loop, &clients[i].pipe_handle, 0);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         uv_pipe_connect(&clients[i].conn_req,
                         &clients[i].pipe_handle,
                         TEST_PIPENAME,
    @@ -99,8 +99,8 @@ TEST_IMPL(pipe_connect_multiple) {
     
       uv_run(loop, UV_RUN_DEFAULT);
     
    -  ASSERT(connection_cb_called == NUM_CLIENTS);
    -  ASSERT(connect_cb_called == NUM_CLIENTS);
    +  ASSERT_EQ(connection_cb_called, NUM_CLIENTS);
    +  ASSERT_EQ(connect_cb_called, NUM_CLIENTS);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -110,14 +110,14 @@ TEST_IMPL(pipe_connect_multiple) {
     static void connection_cb2(uv_stream_t* server, int status) {
       int r;
       uv_pipe_t* conn;
    -  ASSERT_EQ(status, 0);
    +  ASSERT_OK(status);
     
       conn = &connections[connection_cb_called];
       r = uv_pipe_init(server->loop, conn, 0);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_accept(server, (uv_stream_t*)conn);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       uv_close((uv_handle_t*)conn, NULL);
       if (++connection_cb_called == NUM_CLIENTS &&
    @@ -146,17 +146,17 @@ TEST_IMPL(pipe_connect_close_multiple) {
       loop = uv_default_loop();
     
       r = uv_pipe_init(loop, &server_handle, 0);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_pipe_bind(&server_handle, TEST_PIPENAME);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_listen((uv_stream_t*)&server_handle, 128, connection_cb2);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       for (i = 0; i < NUM_CLIENTS; i++) {
         r = uv_pipe_init(loop, &clients[i].pipe_handle, 0);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
         uv_pipe_connect(&clients[i].conn_req,
                         &clients[i].pipe_handle,
                         TEST_PIPENAME,
    diff --git a/deps/uv/test/test-pipe-connect-prepare.c b/deps/uv/test/test-pipe-connect-prepare.c
    index f7a79404048c15..93d15a473f3ff8 100644
    --- a/deps/uv/test/test-pipe-connect-prepare.c
    +++ b/deps/uv/test/test-pipe-connect-prepare.c
    @@ -48,7 +48,7 @@ static void close_cb(uv_handle_t* handle) {
     
     
     static void connect_cb(uv_connect_t* connect_req, int status) {
    -  ASSERT(status == UV_ENOENT);
    +  ASSERT_EQ(status, UV_ENOENT);
       connect_cb_called++;
       uv_close((uv_handle_t*)&prepare_handle, close_cb);
       uv_close((uv_handle_t*)&pipe_handle, close_cb);
    @@ -56,7 +56,7 @@ static void connect_cb(uv_connect_t* connect_req, int status) {
     
     
     static void prepare_cb(uv_prepare_t* handle) {
    -  ASSERT(handle == &prepare_handle);
    +  ASSERT_PTR_EQ(handle, &prepare_handle);
       uv_pipe_connect(&conn_req, &pipe_handle, BAD_PIPENAME, connect_cb);
     }
     
    @@ -65,18 +65,18 @@ TEST_IMPL(pipe_connect_on_prepare) {
       int r;
     
       r = uv_pipe_init(uv_default_loop(), &pipe_handle, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_prepare_init(uv_default_loop(), &prepare_handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_prepare_start(&prepare_handle, prepare_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(close_cb_called == 2);
    -  ASSERT(connect_cb_called == 1);
    +  ASSERT_EQ(2, close_cb_called);
    +  ASSERT_EQ(1, connect_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-pipe-getsockname.c b/deps/uv/test/test-pipe-getsockname.c
    index d749933d44f6f0..eb09d88fd2b3a5 100644
    --- a/deps/uv/test/test-pipe-getsockname.c
    +++ b/deps/uv/test/test-pipe-getsockname.c
    @@ -40,8 +40,8 @@ static int pipe_client_connect_cb_called = 0;
     
     
     static void pipe_close_cb(uv_handle_t* handle) {
    -  ASSERT(handle == (uv_handle_t*) &pipe_client ||
    -         handle == (uv_handle_t*) &pipe_server);
    +  ASSERT_NE(handle == (uv_handle_t*) &pipe_client ||
    +            handle == (uv_handle_t*) &pipe_server, 0);
       pipe_close_cb_called++;
     }
     
    @@ -51,12 +51,12 @@ static void pipe_client_connect_cb(uv_connect_t* req, int status) {
       size_t len;
       int r;
     
    -  ASSERT(req == &connect_req);
    -  ASSERT(status == 0);
    +  ASSERT_PTR_EQ(req, &connect_req);
    +  ASSERT_OK(status);
     
       len = sizeof buf;
       r = uv_pipe_getpeername(&pipe_client, buf, &len);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       if (*buf == '\0') {  /* Linux abstract socket. */
         const char expected[] = "\0" TEST_PIPENAME;
    @@ -82,7 +82,7 @@ static void pipe_server_connection_cb(uv_stream_t* handle, int status) {
       /* This function *may* be called, depending on whether accept or the
        * connection callback is called first.
        */
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     }
     
     
    @@ -99,44 +99,44 @@ TEST_IMPL(pipe_getsockname) {
       ASSERT_NOT_NULL(loop);
     
       r = uv_pipe_init(loop, &pipe_server, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       len = sizeof buf;
       r = uv_pipe_getsockname(&pipe_server, buf, &len);
    -  ASSERT(r == UV_EBADF);
    +  ASSERT_EQ(r, UV_EBADF);
     
       len = sizeof buf;
       r = uv_pipe_getpeername(&pipe_server, buf, &len);
    -  ASSERT(r == UV_EBADF);
    +  ASSERT_EQ(r, UV_EBADF);
     
       r = uv_pipe_bind(&pipe_server, TEST_PIPENAME);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       len = sizeof buf;
       r = uv_pipe_getsockname(&pipe_server, buf, &len);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(buf[len - 1] != 0);
    -  ASSERT(buf[len] == '\0');
    -  ASSERT(memcmp(buf, TEST_PIPENAME, len) == 0);
    +  ASSERT_NE(0, buf[len - 1]);
    +  ASSERT_EQ(buf[len], '\0');
    +  ASSERT_OK(memcmp(buf, TEST_PIPENAME, len));
     
       len = sizeof buf;
       r = uv_pipe_getpeername(&pipe_server, buf, &len);
    -  ASSERT(r == UV_ENOTCONN);
    +  ASSERT_EQ(r, UV_ENOTCONN);
     
       r = uv_listen((uv_stream_t*) &pipe_server, 0, pipe_server_connection_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_pipe_init(loop, &pipe_client, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       len = sizeof buf;
       r = uv_pipe_getsockname(&pipe_client, buf, &len);
    -  ASSERT(r == UV_EBADF);
    +  ASSERT_EQ(r, UV_EBADF);
     
       len = sizeof buf;
       r = uv_pipe_getpeername(&pipe_client, buf, &len);
    -  ASSERT(r == UV_EBADF);
    +  ASSERT_EQ(r, UV_EBADF);
     
       uv_pipe_connect(&connect_req, &pipe_client, TEST_PIPENAME, pipe_client_connect_cb);
     
    @@ -146,15 +146,15 @@ TEST_IMPL(pipe_getsockname) {
     
       len = sizeof buf;
       r = uv_pipe_getpeername(&pipe_client, buf, &len);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(buf[len - 1] != 0);
    -  ASSERT(memcmp(buf, TEST_PIPENAME, len) == 0);
    +  ASSERT_NE(0, buf[len - 1]);
    +  ASSERT_OK(memcmp(buf, TEST_PIPENAME, len));
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    -  ASSERT(pipe_client_connect_cb_called == 1);
    -  ASSERT(pipe_close_cb_called == 2);
    +  ASSERT_OK(r);
    +  ASSERT_EQ(1, pipe_client_connect_cb_called);
    +  ASSERT_EQ(2, pipe_close_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -218,50 +218,50 @@ TEST_IMPL(pipe_getsockname_blocking) {
       int r;
     
       r = CreatePipe(&readh, &writeh, NULL, 65536);
    -  ASSERT(r != 0);
    +  ASSERT(r);
     
       r = uv_pipe_init(uv_default_loop(), &pipe_client, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       readfd = _open_osfhandle((intptr_t)readh, _O_RDONLY);
    -  ASSERT(r != -1);
    +  ASSERT_NE(r, -1);
       r = uv_pipe_open(&pipe_client, readfd);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_read_start((uv_stream_t*) &pipe_client,
                         (uv_alloc_cb) abort,
                         (uv_read_cb) abort);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       Sleep(100);
       r = uv_read_stop((uv_stream_t*)&pipe_client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       len1 = sizeof buf1;
       r = uv_pipe_getsockname(&pipe_client, buf1, &len1);
    -  ASSERT(r == 0);
    -  ASSERT(len1 == 0);  /* It's an annonymous pipe. */
    +  ASSERT_OK(r);
    +  ASSERT_OK(len1);  /* It's an annonymous pipe. */
     
       r = uv_read_start((uv_stream_t*)&pipe_client,
                         (uv_alloc_cb) abort,
                         (uv_read_cb) abort);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       Sleep(100);
     
       len2 = sizeof buf2;
       r = uv_pipe_getsockname(&pipe_client, buf2, &len2);
    -  ASSERT(r == 0);
    -  ASSERT(len2 == 0);  /* It's an annonymous pipe. */
    +  ASSERT_OK(r);
    +  ASSERT_OK(len2);  /* It's an annonymous pipe. */
     
       r = uv_read_stop((uv_stream_t*)&pipe_client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(len1 == len2);
    -  ASSERT(memcmp(buf1, buf2, len1) == 0);
    +  ASSERT_EQ(len1, len2);
    +  ASSERT_OK(memcmp(buf1, buf2, len1));
     
       pipe_close_cb_called = 0;
       uv_close((uv_handle_t*)&pipe_client, pipe_close_cb);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(pipe_close_cb_called == 1);
    +  ASSERT_EQ(1, pipe_close_cb_called);
     
       CloseHandle(writeh);
     #endif
    diff --git a/deps/uv/test/test-pipe-pending-instances.c b/deps/uv/test/test-pipe-pending-instances.c
    index 9b1bfbc9aaccc4..570ecd69b734f7 100644
    --- a/deps/uv/test/test-pipe-pending-instances.c
    +++ b/deps/uv/test/test-pipe-pending-instances.c
    @@ -37,22 +37,22 @@ TEST_IMPL(pipe_pending_instances) {
       loop = uv_default_loop();
     
       r = uv_pipe_init(loop, &pipe_handle, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_pipe_pending_instances(&pipe_handle, 8);
     
       r = uv_pipe_bind(&pipe_handle, TEST_PIPENAME);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_pipe_pending_instances(&pipe_handle, 16);
     
       r = uv_listen((uv_stream_t*)&pipe_handle, 128, connection_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_close((uv_handle_t*)&pipe_handle, NULL);
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-pipe-sendmsg.c b/deps/uv/test/test-pipe-sendmsg.c
    index 7758b65b05cff9..3958b05378ca2c 100644
    --- a/deps/uv/test/test-pipe-sendmsg.c
    +++ b/deps/uv/test/test-pipe-sendmsg.c
    @@ -45,12 +45,12 @@ static void set_nonblocking(uv_os_sock_t sock) {
     #ifdef _WIN32
       unsigned long on = 1;
       r = ioctlsocket(sock, FIONBIO, &on);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     #else
       int flags = fcntl(sock, F_GETFL, 0);
    -  ASSERT(flags >= 0);
    +  ASSERT_GE(flags, 0);
       r = fcntl(sock, F_SETFL, flags | O_NONBLOCK);
    -  ASSERT(r >= 0);
    +  ASSERT_GE(r, 0);
     #endif
     }
     
    @@ -79,22 +79,22 @@ static void read_cb(uv_stream_t* handle,
       unsigned int i;
     
       p = (uv_pipe_t*) handle;
    -  ASSERT(nread >= 0);
    +  ASSERT_GE(nread, 0);
     
       while (uv_pipe_pending_count(p) != 0) {
         pending = uv_pipe_pending_type(p);
    -    ASSERT(pending == UV_NAMED_PIPE);
    +    ASSERT_EQ(pending, UV_NAMED_PIPE);
     
    -    ASSERT(incoming_count < ARRAY_SIZE(incoming));
    +    ASSERT_LT(incoming_count, ARRAY_SIZE(incoming));
         inc = &incoming[incoming_count++];
    -    ASSERT(0 == uv_pipe_init(p->loop, inc, 0));
    -    ASSERT(0 == uv_accept(handle, (uv_stream_t*) inc));
    +    ASSERT_OK(uv_pipe_init(p->loop, inc, 0));
    +    ASSERT_OK(uv_accept(handle, (uv_stream_t*) inc));
       }
     
       if (incoming_count != ARRAY_SIZE(incoming))
         return;
     
    -  ASSERT(0 == uv_read_stop((uv_stream_t*) p));
    +  ASSERT_OK(uv_read_stop((uv_stream_t*) p));
       uv_close((uv_handle_t*) p, close_cb);
       for (i = 0; i < ARRAY_SIZE(incoming); i++)
         uv_close((uv_handle_t*) &incoming[i], close_cb);
    @@ -115,12 +115,12 @@ TEST_IMPL(pipe_sendmsg) {
       unsigned int i;
       uv_buf_t buf;
     
    -  ASSERT(0 == socketpair(AF_UNIX, SOCK_STREAM, 0, fds));
    +  ASSERT_OK(socketpair(AF_UNIX, SOCK_STREAM, 0, fds));
       for (i = 0; i < ARRAY_SIZE(send_fds); i += 2)
    -    ASSERT(0 == socketpair(AF_UNIX, SOCK_STREAM, 0, send_fds + i));
    -  ASSERT(i == ARRAY_SIZE(send_fds));
    -  ASSERT(0 == uv_pipe_init(uv_default_loop(), &p, 1));
    -  ASSERT(0 == uv_pipe_open(&p, fds[1]));
    +    ASSERT_OK(socketpair(AF_UNIX, SOCK_STREAM, 0, send_fds + i));
    +  ASSERT_EQ(i, ARRAY_SIZE(send_fds));
    +  ASSERT_OK(uv_pipe_init(uv_default_loop(), &p, 1));
    +  ASSERT_OK(uv_pipe_open(&p, fds[1]));
     
       buf = uv_buf_init("X", 1);
       memset(&msg, 0, sizeof(msg));
    @@ -130,7 +130,7 @@ TEST_IMPL(pipe_sendmsg) {
     
       msg.msg_control = (void*) scratch;
       msg.msg_controllen = CMSG_LEN(sizeof(send_fds));
    -  ASSERT(sizeof(scratch) >= msg.msg_controllen);
    +  ASSERT_GE(sizeof(scratch), msg.msg_controllen);
     
       cmsg = CMSG_FIRSTHDR(&msg);
       cmsg->cmsg_level = SOL_SOCKET;
    @@ -146,16 +146,16 @@ TEST_IMPL(pipe_sendmsg) {
       }
     
       set_nonblocking(fds[1]);
    -  ASSERT(0 == uv_read_start((uv_stream_t*) &p, alloc_cb, read_cb));
    +  ASSERT_OK(uv_read_start((uv_stream_t*) &p, alloc_cb, read_cb));
     
       do
         r = sendmsg(fds[0], &msg, 0);
       while (r == -1 && errno == EINTR);
    -  ASSERT(r == 1);
    +  ASSERT_EQ(1, r);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(ARRAY_SIZE(incoming) == incoming_count);
    -  ASSERT(ARRAY_SIZE(incoming) + 1 == close_called);
    +  ASSERT_EQ(ARRAY_SIZE(incoming), incoming_count);
    +  ASSERT_EQ(ARRAY_SIZE(incoming) + 1, close_called);
       close(fds[0]);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
    diff --git a/deps/uv/test/test-pipe-server-close.c b/deps/uv/test/test-pipe-server-close.c
    index dc20661916d889..ad7d792acc3865 100644
    --- a/deps/uv/test/test-pipe-server-close.c
    +++ b/deps/uv/test/test-pipe-server-close.c
    @@ -35,15 +35,15 @@ static int pipe_client_connect_cb_called = 0;
     
     
     static void pipe_close_cb(uv_handle_t* handle) {
    -  ASSERT(handle == (uv_handle_t*) &pipe_client ||
    -         handle == (uv_handle_t*) &pipe_server);
    +  ASSERT_NE(handle == (uv_handle_t*) &pipe_client ||
    +            handle == (uv_handle_t*) &pipe_server, 0);
       pipe_close_cb_called++;
     }
     
     
     static void pipe_client_connect_cb(uv_connect_t* req, int status) {
    -  ASSERT(req == &connect_req);
    -  ASSERT(status == 0);
    +  ASSERT_PTR_EQ(req, &connect_req);
    +  ASSERT_OK(status);
     
       pipe_client_connect_cb_called++;
     
    @@ -56,7 +56,7 @@ static void pipe_server_connection_cb(uv_stream_t* handle, int status) {
       /* This function *may* be called, depending on whether accept or the
        * connection callback is called first.
        */
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     }
     
     
    @@ -71,23 +71,23 @@ TEST_IMPL(pipe_server_close) {
       ASSERT_NOT_NULL(loop);
     
       r = uv_pipe_init(loop, &pipe_server, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_pipe_bind(&pipe_server, TEST_PIPENAME);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_listen((uv_stream_t*) &pipe_server, 0, pipe_server_connection_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_pipe_init(loop, &pipe_client, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_pipe_connect(&connect_req, &pipe_client, TEST_PIPENAME, pipe_client_connect_cb);
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    -  ASSERT(pipe_client_connect_cb_called == 1);
    -  ASSERT(pipe_close_cb_called == 2);
    +  ASSERT_OK(r);
    +  ASSERT_EQ(1, pipe_client_connect_cb_called);
    +  ASSERT_EQ(2, pipe_close_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-pipe-set-fchmod.c b/deps/uv/test/test-pipe-set-fchmod.c
    index 402970e3da9922..9563e4fdd50f54 100644
    --- a/deps/uv/test/test-pipe-set-fchmod.c
    +++ b/deps/uv/test/test-pipe-set-fchmod.c
    @@ -35,10 +35,10 @@ TEST_IMPL(pipe_set_chmod) {
       loop = uv_default_loop();
     
       r = uv_pipe_init(loop, &pipe_handle, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_pipe_bind(&pipe_handle, TEST_PIPENAME);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* No easy way to test if this works, we will only make sure that the call is
        * successful. */
    @@ -47,17 +47,17 @@ TEST_IMPL(pipe_set_chmod) {
         MAKE_VALGRIND_HAPPY(loop);
         RETURN_SKIP("Insufficient privileges to alter pipe fmode");
       }
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     #ifndef _WIN32
       memset(&stat_buf, 0, sizeof(stat_buf));
    -  ASSERT_EQ(0, stat(TEST_PIPENAME, &stat_buf));
    +  ASSERT_OK(stat(TEST_PIPENAME, &stat_buf));
       ASSERT(stat_buf.st_mode & S_IRUSR);
       ASSERT(stat_buf.st_mode & S_IRGRP);
       ASSERT(stat_buf.st_mode & S_IROTH);
     #endif
     
       r = uv_pipe_chmod(&pipe_handle, UV_WRITABLE);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     #ifndef _WIN32
       stat(TEST_PIPENAME, &stat_buf);
       ASSERT(stat_buf.st_mode & S_IWUSR);
    @@ -66,7 +66,7 @@ TEST_IMPL(pipe_set_chmod) {
     #endif
     
       r = uv_pipe_chmod(&pipe_handle, UV_WRITABLE | UV_READABLE);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     #ifndef _WIN32
       stat(TEST_PIPENAME, &stat_buf);
       ASSERT(stat_buf.st_mode & S_IRUSR);
    @@ -78,14 +78,14 @@ TEST_IMPL(pipe_set_chmod) {
     #endif
     
       r = uv_pipe_chmod(NULL, UV_WRITABLE | UV_READABLE);
    -  ASSERT(r == UV_EBADF);
    +  ASSERT_EQ(r, UV_EBADF);
     
       r = uv_pipe_chmod(&pipe_handle, 12345678);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       uv_close((uv_handle_t*)&pipe_handle, NULL);
       r = uv_pipe_chmod(&pipe_handle, UV_WRITABLE | UV_READABLE);
    -  ASSERT(r == UV_EBADF);
    +  ASSERT_EQ(r, UV_EBADF);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-pipe-set-non-blocking.c b/deps/uv/test/test-pipe-set-non-blocking.c
    index 1b90bca3d2ab90..bf1c284189ffce 100644
    --- a/deps/uv/test/test-pipe-set-non-blocking.c
    +++ b/deps/uv/test/test-pipe-set-non-blocking.c
    @@ -46,13 +46,13 @@ static void thread_main(void* arg) {
         uv_fs_req_cleanup(&req);
       } while (n > 0 || (n == -1 && uv_errno == UV_EINTR));
     
    -  ASSERT(n == 0);
    +  ASSERT_OK(n);
     }
     
     
     #ifdef _WIN32
     static void write_cb(uv_write_t* req, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       req->handle = NULL; /* signal completion of write_cb */
     }
     #endif
    @@ -77,15 +77,15 @@ TEST_IMPL(pipe_set_non_blocking) {
       uv_write_t write_req;
     #endif
     
    -  ASSERT(0 == uv_pipe_init(uv_default_loop(), &pipe_handle, 0));
    -  ASSERT(0 == uv_pipe(fd, 0, 0));
    -  ASSERT(0 == uv_pipe_open(&pipe_handle, fd[1]));
    -  ASSERT(0 == uv_stream_set_blocking((uv_stream_t*) &pipe_handle, 1));
    +  ASSERT_OK(uv_pipe_init(uv_default_loop(), &pipe_handle, 0));
    +  ASSERT_OK(uv_pipe(fd, 0, 0));
    +  ASSERT_OK(uv_pipe_open(&pipe_handle, fd[1]));
    +  ASSERT_OK(uv_stream_set_blocking((uv_stream_t*) &pipe_handle, 1));
       fd[1] = -1; /* fd[1] is owned by pipe_handle now. */
     
       ctx.fd = fd[0];
    -  ASSERT(0 == uv_barrier_init(&ctx.barrier, 2));
    -  ASSERT(0 == uv_thread_create(&thread, thread_main, &ctx));
    +  ASSERT_OK(uv_barrier_init(&ctx.barrier, 2));
    +  ASSERT_OK(uv_thread_create(&thread, thread_main, &ctx));
       uv_barrier_wait(&ctx.barrier);
     
       buf.len = sizeof(data);
    @@ -99,25 +99,29 @@ TEST_IMPL(pipe_set_non_blocking) {
          */
         n = uv_try_write((uv_stream_t*) &pipe_handle, &buf, 1);
     #ifdef _WIN32
    -    ASSERT(n == UV_EAGAIN); /* E_NOTIMPL */
    -    ASSERT(0 == uv_write(&write_req, (uv_stream_t*) &pipe_handle, &buf, 1, write_cb));
    +    ASSERT_EQ(n, UV_EAGAIN); /* E_NOTIMPL */
    +    ASSERT_OK(uv_write(&write_req,
    +                       (uv_stream_t*) &pipe_handle,
    +                       &buf,
    +                       1,
    +                       write_cb));
         ASSERT_NOT_NULL(write_req.handle);
    -    ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_ONCE));
    +    ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_ONCE));
         ASSERT_NULL(write_req.handle); /* check for signaled completion of write_cb */
         n = buf.len;
     #endif
    -    ASSERT(n == sizeof(data));
    +    ASSERT_EQ(n, sizeof(data));
         nwritten += n;
       }
     
       uv_close((uv_handle_t*) &pipe_handle, NULL);
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
    -  ASSERT(0 == uv_thread_join(&thread));
    +  ASSERT_OK(uv_thread_join(&thread));
     #ifdef _WIN32
    -  ASSERT(0 == _close(fd[0]));  /* fd[1] is closed by uv_close(). */
    +  ASSERT_OK(_close(fd[0]));  /* fd[1] is closed by uv_close(). */
     #else
    -  ASSERT(0 == close(fd[0]));  /* fd[1] is closed by uv_close(). */
    +  ASSERT_OK(close(fd[0]));  /* fd[1] is closed by uv_close(). */
     #endif
       fd[0] = -1;
       uv_barrier_destroy(&ctx.barrier);
    diff --git a/deps/uv/test/test-platform-output.c b/deps/uv/test/test-platform-output.c
    index 5839f52dfe5885..f18e097f913607 100644
    --- a/deps/uv/test/test-platform-output.c
    +++ b/deps/uv/test/test-platform-output.c
    @@ -44,37 +44,37 @@ TEST_IMPL(platform_output) {
       int err;
     
       err = uv_get_process_title(buffer, sizeof(buffer));
    -  ASSERT(err == 0);
    +  ASSERT_OK(err);
       printf("uv_get_process_title: %s\n", buffer);
     
       size = sizeof(buffer);
       err = uv_cwd(buffer, &size);
    -  ASSERT(err == 0);
    +  ASSERT_OK(err);
       printf("uv_cwd: %s\n", buffer);
     
       err = uv_resident_set_memory(&rss);
     #if defined(__MSYS__)
    -  ASSERT(err == UV_ENOSYS);
    +  ASSERT_EQ(err, UV_ENOSYS);
     #else
    -  ASSERT(err == 0);
    +  ASSERT_OK(err);
       printf("uv_resident_set_memory: %llu\n", (unsigned long long) rss);
     #endif
     
       err = uv_uptime(&uptime);
     #if defined(__PASE__)
    -  ASSERT(err == UV_ENOSYS);
    +  ASSERT_EQ(err, UV_ENOSYS);
     #else
    -  ASSERT(err == 0);
    -  ASSERT(uptime > 0);
    +  ASSERT_OK(err);
    +  ASSERT_GT(uptime, 0);
       printf("uv_uptime: %f\n", uptime);
     #endif
     
       err = uv_getrusage(&rusage);
    -  ASSERT(err == 0);
    -  ASSERT(rusage.ru_utime.tv_sec >= 0);
    -  ASSERT(rusage.ru_utime.tv_usec >= 0);
    -  ASSERT(rusage.ru_stime.tv_sec >= 0);
    -  ASSERT(rusage.ru_stime.tv_usec >= 0);
    +  ASSERT_OK(err);
    +  ASSERT_GE(rusage.ru_utime.tv_sec, 0);
    +  ASSERT_GE(rusage.ru_utime.tv_usec, 0);
    +  ASSERT_GE(rusage.ru_stime.tv_sec, 0);
    +  ASSERT_GE(rusage.ru_stime.tv_usec, 0);
       printf("uv_getrusage:\n");
       printf("  user: %llu sec %llu microsec\n",
              (unsigned long long) rusage.ru_utime.tv_sec,
    @@ -92,9 +92,9 @@ TEST_IMPL(platform_output) {
     
       err = uv_cpu_info(&cpus, &count);
     #if defined(__CYGWIN__) || defined(__MSYS__)
    -  ASSERT(err == UV_ENOSYS);
    +  ASSERT_EQ(err, UV_ENOSYS);
     #else
    -  ASSERT(err == 0);
    +  ASSERT_OK(err);
     
       printf("uv_cpu_info:\n");
       for (i = 0; i < count; i++) {
    @@ -113,7 +113,7 @@ TEST_IMPL(platform_output) {
       uv_free_cpu_info(cpus, count);
     
       err = uv_interface_addresses(&interfaces, &count);
    -  ASSERT(err == 0);
    +  ASSERT_OK(err);
     
       printf("uv_interface_addresses:\n");
       for (i = 0; i < count; i++) {
    @@ -149,7 +149,7 @@ TEST_IMPL(platform_output) {
       uv_free_interface_addresses(interfaces, count);
     
       err = uv_os_get_passwd(&pwd);
    -  ASSERT_EQ(err, 0);
    +  ASSERT_OK(err);
     
       err = uv_os_get_group(&grp, pwd.gid);
     #if defined(_WIN32)
    @@ -159,7 +159,7 @@ TEST_IMPL(platform_output) {
       (void) member;
       grp.groupname = "ENOTSUP";
     #else
    -  ASSERT_EQ(err, 0);
    +  ASSERT_OK(err);
       ASSERT_EQ(pwd.gid, grp.gid);
     #endif
     
    @@ -183,14 +183,14 @@ TEST_IMPL(platform_output) {
     #endif
     
       pid = uv_os_getpid();
    -  ASSERT(pid > 0);
    +  ASSERT_GT(pid, 0);
       printf("uv_os_getpid: %d\n", (int) pid);
       ppid = uv_os_getppid();
    -  ASSERT(ppid > 0);
    +  ASSERT_GT(ppid, 0);
       printf("uv_os_getppid: %d\n", (int) ppid);
     
       err = uv_os_uname(&uname);
    -  ASSERT(err == 0);
    +  ASSERT_OK(err);
       printf("uv_os_uname:\n");
       printf("  sysname: %s\n", uname.sysname);
       printf("  release: %s\n", uname.release);
    diff --git a/deps/uv/test/test-poll-close-doesnt-corrupt-stack.c b/deps/uv/test/test-poll-close-doesnt-corrupt-stack.c
    index a19f42769b5788..0acb452a78bcad 100644
    --- a/deps/uv/test/test-poll-close-doesnt-corrupt-stack.c
    +++ b/deps/uv/test/test-poll-close-doesnt-corrupt-stack.c
    @@ -59,12 +59,12 @@ static void NO_INLINE close_socket_and_verify_stack(void) {
         data[i] = MARKER;
     
       r = closesocket(sock);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_sleep(VERIFY_AFTER);
     
       for (i = 0; i < ARRAY_SIZE(data); i++)
    -    ASSERT(data[i] == MARKER);
    +    ASSERT_EQ(data[i], MARKER);
     }
     #endif
     
    @@ -79,34 +79,34 @@ TEST_IMPL(poll_close_doesnt_corrupt_stack) {
       struct sockaddr_in addr;
     
       r = WSAStartup(MAKEWORD(2, 2), &wsa_data);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       sock = socket(AF_INET, SOCK_STREAM, 0);
    -  ASSERT(sock != INVALID_SOCKET);
    +  ASSERT_NE(sock, INVALID_SOCKET);
       on = 1;
       r = ioctlsocket(sock, FIONBIO, &on);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_ip4_addr("127.0.0.1", TEST_PORT, &addr);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = connect(sock, (const struct sockaddr*) &addr, sizeof addr);
    -  ASSERT(r != 0);
    -  ASSERT(WSAGetLastError() == WSAEWOULDBLOCK);
    +  ASSERT(r);
    +  ASSERT_EQ(WSAGetLastError(), WSAEWOULDBLOCK);
     
       r = uv_poll_init_socket(uv_default_loop(), &handle, sock);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_poll_start(&handle, UV_READABLE | UV_WRITABLE, poll_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_close((uv_handle_t*) &handle, close_cb);
     
       close_socket_and_verify_stack();
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-poll-close.c b/deps/uv/test/test-poll-close.c
    index b4ad4c7834674b..5843bf4516d282 100644
    --- a/deps/uv/test/test-poll-close.c
    +++ b/deps/uv/test/test-poll-close.c
    @@ -50,7 +50,7 @@ TEST_IMPL(poll_close) {
       {
         struct WSAData wsa_data;
         int r = WSAStartup(MAKEWORD(2, 2), &wsa_data);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     #endif
     
    @@ -66,7 +66,7 @@ TEST_IMPL(poll_close) {
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(close_cb_called == NUM_SOCKETS);
    +  ASSERT_EQ(close_cb_called, NUM_SOCKETS);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-poll-closesocket.c b/deps/uv/test/test-poll-closesocket.c
    index a81d0b09ff8d0d..01f8f7410189f4 100644
    --- a/deps/uv/test/test-poll-closesocket.c
    +++ b/deps/uv/test/test-poll-closesocket.c
    @@ -39,11 +39,11 @@ static void close_cb(uv_handle_t* h) {
     static void poll_cb(uv_poll_t* h, int status, int events) {
       int r;
     
    -  ASSERT(status == 0);
    -  ASSERT(h == &handle);
    +  ASSERT_OK(status);
    +  ASSERT_PTR_EQ(h, &handle);
     
       r = uv_poll_start(&handle, UV_READABLE, poll_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       closesocket(sock);
       uv_close((uv_handle_t*) &handle, close_cb);
    @@ -62,29 +62,29 @@ TEST_IMPL(poll_closesocket) {
       struct sockaddr_in addr;
     
       r = WSAStartup(MAKEWORD(2, 2), &wsa_data);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       sock = socket(AF_INET, SOCK_STREAM, 0);
    -  ASSERT(sock != INVALID_SOCKET);
    +  ASSERT_NE(sock, INVALID_SOCKET);
       on = 1;
       r = ioctlsocket(sock, FIONBIO, &on);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_ip4_addr("127.0.0.1", TEST_PORT, &addr);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = connect(sock, (const struct sockaddr*) &addr, sizeof addr);
    -  ASSERT(r != 0);
    -  ASSERT(WSAGetLastError() == WSAEWOULDBLOCK);
    +  ASSERT(r);
    +  ASSERT_EQ(WSAGetLastError(), WSAEWOULDBLOCK);
     
       r = uv_poll_init_socket(uv_default_loop(), &handle, sock);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_poll_start(&handle, UV_WRITABLE, poll_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-poll-multiple-handles.c b/deps/uv/test/test-poll-multiple-handles.c
    index 1aad1ef21065b7..d9c4924dbfe385 100644
    --- a/deps/uv/test/test-poll-multiple-handles.c
    +++ b/deps/uv/test/test-poll-multiple-handles.c
    @@ -40,7 +40,7 @@ static void close_cb(uv_handle_t* handle) {
     
     static void poll_cb(uv_poll_t* handle, int status, int events) {
       /* Not a bound socket, linux immediately reports UV_READABLE, other OS do not */
    -  ASSERT(events == UV_READABLE);
    +  ASSERT_EQ(events, UV_READABLE);
     }
     
     TEST_IMPL(poll_multiple_handles) {
    @@ -51,20 +51,24 @@ TEST_IMPL(poll_multiple_handles) {
       {
         struct WSAData wsa_data;
         int r = WSAStartup(MAKEWORD(2, 2), &wsa_data);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     #endif
     
       sock = socket(AF_INET, SOCK_STREAM, 0);
     #ifdef _WIN32
    -  ASSERT(sock != INVALID_SOCKET);
    +  ASSERT_NE(sock, INVALID_SOCKET);
     #else
    -  ASSERT(sock != -1);
    +  ASSERT_NE(sock, -1);
     #endif
    -  ASSERT(0 == uv_poll_init_socket(uv_default_loop(), &first_poll_handle, sock));
    -  ASSERT(0 == uv_poll_init_socket(uv_default_loop(), &second_poll_handle, sock));
    +  ASSERT_OK(uv_poll_init_socket(uv_default_loop(),
    +                                &first_poll_handle,
    +                                sock));
    +  ASSERT_OK(uv_poll_init_socket(uv_default_loop(),
    +                                &second_poll_handle,
    +                                sock));
     
    -  ASSERT(0 == uv_poll_start(&first_poll_handle, UV_READABLE, poll_cb));
    +  ASSERT_OK(uv_poll_start(&first_poll_handle, UV_READABLE, poll_cb));
     
       /* We may not start polling while another polling handle is active
        * on that fd.
    @@ -73,26 +77,27 @@ TEST_IMPL(poll_multiple_handles) {
       /* We do not track handles in an O(1) lookupable way on Windows,
        * so not checking that here.
        */
    -  ASSERT(uv_poll_start(&second_poll_handle, UV_READABLE, poll_cb) == UV_EEXIST);
    +  ASSERT_EQ(uv_poll_start(&second_poll_handle, UV_READABLE, poll_cb),
    +            UV_EEXIST);
     #endif
     
       /* After stopping the other polling handle, we now should be able to poll */
    -  ASSERT(0 == uv_poll_stop(&first_poll_handle));
    -  ASSERT(0 == uv_poll_start(&second_poll_handle, UV_READABLE, poll_cb));
    +  ASSERT_OK(uv_poll_stop(&first_poll_handle));
    +  ASSERT_OK(uv_poll_start(&second_poll_handle, UV_READABLE, poll_cb));
     
       /* Closing an already stopped polling handle is safe in any case */
       uv_close((uv_handle_t*) &first_poll_handle, close_cb);
     
       uv_unref((uv_handle_t*) &second_poll_handle);
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_EQ(1, close_cb_called);
       uv_ref((uv_handle_t*) &second_poll_handle);
     
       ASSERT(uv_is_active((uv_handle_t*) &second_poll_handle));
       uv_close((uv_handle_t*) &second_poll_handle, close_cb);
     
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    -  ASSERT(close_cb_called == 2);
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_EQ(2, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-poll-oob.c b/deps/uv/test/test-poll-oob.c
    index b1ff41f5b8ad9f..b40c93c3708776 100644
    --- a/deps/uv/test/test-poll-oob.c
    +++ b/deps/uv/test/test-poll-oob.c
    @@ -70,7 +70,7 @@ static void poll_cb(uv_poll_t* handle, int status, int events) {
       int n;
       int fd;
     
    -  ASSERT(0 == uv_fileno((uv_handle_t*)handle, &fd));
    +  ASSERT_OK(uv_fileno((uv_handle_t*)handle, &fd));
       memset(buffer, 0, 5);
     
       if (events & UV_PRIORITIZED) {
    @@ -79,10 +79,10 @@ static void poll_cb(uv_poll_t* handle, int status, int events) {
         while (n == -1 && errno == EINTR);
         ASSERT(n >= 0 || errno != EINVAL);
         cli_pr_check = 1;
    -    ASSERT(0 == uv_poll_stop(&poll_req[0]));
    -    ASSERT(0 == uv_poll_start(&poll_req[0],
    -                              UV_READABLE | UV_WRITABLE,
    -                              poll_cb));
    +    ASSERT_OK(uv_poll_stop(&poll_req[0]));
    +    ASSERT_OK(uv_poll_start(&poll_req[0],
    +                            UV_READABLE | UV_WRITABLE,
    +                            poll_cb));
       }
       if (events & UV_READABLE) {
         if (fd == client_fd) {
    @@ -91,21 +91,21 @@ static void poll_cb(uv_poll_t* handle, int status, int events) {
           while (n == -1 && errno == EINTR);
           ASSERT(n >= 0 || errno != EINVAL);
           if (cli_rd_check == 1) {
    -        ASSERT(strncmp(buffer, "world", n) == 0);
    -        ASSERT(5 == n);
    +        ASSERT_OK(strncmp(buffer, "world", n));
    +        ASSERT_EQ(5, n);
             cli_rd_check = 2;
           }
           if (cli_rd_check == 0) {
    -        ASSERT(n == 4);
    -        ASSERT(strncmp(buffer, "hello", n) == 0);
    +        ASSERT_EQ(4, n);
    +        ASSERT_OK(strncmp(buffer, "hello", n));
             cli_rd_check = 1;
             do {
               do
                 n = recv(server_fd, &buffer, 5, 0);
               while (n == -1 && errno == EINTR);
               if (n > 0) {
    -            ASSERT(n == 5);
    -            ASSERT(strncmp(buffer, "world", n) == 0);
    +            ASSERT_EQ(5, n);
    +            ASSERT_OK(strncmp(buffer, "world", n));
                 cli_rd_check = 2;
               }
             } while (n > 0);
    @@ -118,8 +118,8 @@ static void poll_cb(uv_poll_t* handle, int status, int events) {
             n = recv(server_fd, &buffer, 3, 0);
           while (n == -1 && errno == EINTR);
           ASSERT(n >= 0 || errno != EINVAL);
    -      ASSERT(3 == n);
    -      ASSERT(strncmp(buffer, "foo", n) == 0);
    +      ASSERT_EQ(3, n);
    +      ASSERT_OK(strncmp(buffer, "foo", n));
           srv_rd_check = 1;
           uv_poll_stop(&poll_req[1]);
         }
    @@ -128,35 +128,39 @@ static void poll_cb(uv_poll_t* handle, int status, int events) {
         do {
           n = send(client_fd, "foo", 3, 0);
         } while (n < 0 && errno == EINTR);
    -    ASSERT(3 == n);
    +    ASSERT_EQ(3, n);
       }
     }
     
     static void connection_cb(uv_stream_t* handle, int status) {
       int r;
     
    -  ASSERT(0 == status);
    -  ASSERT(0 == uv_accept(handle, (uv_stream_t*) &peer_handle));
    -  ASSERT(0 == uv_fileno((uv_handle_t*) &peer_handle, &server_fd));
    -  ASSERT(0 == uv_poll_init_socket(uv_default_loop(), &poll_req[0], client_fd));
    -  ASSERT(0 == uv_poll_init_socket(uv_default_loop(), &poll_req[1], server_fd));
    -  ASSERT(0 == uv_poll_start(&poll_req[0],
    -                            UV_PRIORITIZED | UV_READABLE | UV_WRITABLE,
    -                            poll_cb));
    -  ASSERT(0 == uv_poll_start(&poll_req[1],
    -                            UV_READABLE,
    -                            poll_cb));
    +  ASSERT_OK(status);
    +  ASSERT_OK(uv_accept(handle, (uv_stream_t*) &peer_handle));
    +  ASSERT_OK(uv_fileno((uv_handle_t*) &peer_handle, &server_fd));
    +  ASSERT_OK(uv_poll_init_socket(uv_default_loop(),
    +                                &poll_req[0],
    +                                client_fd));
    +  ASSERT_OK(uv_poll_init_socket(uv_default_loop(),
    +                                &poll_req[1],
    +                                server_fd));
    +  ASSERT_OK(uv_poll_start(&poll_req[0],
    +                          UV_PRIORITIZED | UV_READABLE | UV_WRITABLE,
    +                          poll_cb));
    +  ASSERT_OK(uv_poll_start(&poll_req[1],
    +                          UV_READABLE,
    +                          poll_cb));
       do {
         r = send(server_fd, "hello", 5, MSG_OOB);
       } while (r < 0 && errno == EINTR);
    -  ASSERT(5 == r);
    +  ASSERT_EQ(5, r);
     
       do {
         r = send(server_fd, "world", 5, 0);
       } while (r < 0 && errno == EINTR);
    -  ASSERT(5 == r);
    +  ASSERT_EQ(5, r);
     
    -  ASSERT(0 == uv_idle_start(&idle, idle_cb));
    +  ASSERT_OK(uv_idle_start(&idle, idle_cb));
     }
     
     
    @@ -165,39 +169,39 @@ TEST_IMPL(poll_oob) {
       int r = 0;
       uv_loop_t* loop;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
       loop = uv_default_loop();
     
    -  ASSERT(0 == uv_tcp_init(loop, &server_handle));
    -  ASSERT(0 == uv_tcp_init(loop, &client_handle));
    -  ASSERT(0 == uv_tcp_init(loop, &peer_handle));
    -  ASSERT(0 == uv_idle_init(loop, &idle));
    -  ASSERT(0 == uv_tcp_bind(&server_handle, (const struct sockaddr*) &addr, 0));
    -  ASSERT(0 == uv_listen((uv_stream_t*) &server_handle, 1, connection_cb));
    +  ASSERT_OK(uv_tcp_init(loop, &server_handle));
    +  ASSERT_OK(uv_tcp_init(loop, &client_handle));
    +  ASSERT_OK(uv_tcp_init(loop, &peer_handle));
    +  ASSERT_OK(uv_idle_init(loop, &idle));
    +  ASSERT_OK(uv_tcp_bind(&server_handle, (const struct sockaddr*) &addr, 0));
    +  ASSERT_OK(uv_listen((uv_stream_t*) &server_handle, 1, connection_cb));
     
       /* Ensure two separate packets */
    -  ASSERT(0 == uv_tcp_nodelay(&client_handle, 1));
    +  ASSERT_OK(uv_tcp_nodelay(&client_handle, 1));
     
       client_fd = socket(PF_INET, SOCK_STREAM, 0);
    -  ASSERT(client_fd >= 0);
    +  ASSERT_GE(client_fd, 0);
       do {
         errno = 0;
         r = connect(client_fd, (const struct sockaddr*)&addr, sizeof(addr));
       } while (r == -1 && errno == EINTR);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
     
    -  ASSERT(ticks == kMaxTicks);
    +  ASSERT_EQ(ticks, kMaxTicks);
     
       /* Did client receive the POLLPRI message */
    -  ASSERT(cli_pr_check == 1);
    +  ASSERT_EQ(1, cli_pr_check);
       /* Did client receive the POLLIN message */
    -  ASSERT(cli_rd_check == 2);
    +  ASSERT_EQ(2, cli_rd_check);
       /* Could we write with POLLOUT and did the server receive our POLLOUT message
        * through POLLIN.
        */
    -  ASSERT(srv_rd_check == 1);
    +  ASSERT_EQ(1, srv_rd_check);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-poll.c b/deps/uv/test/test-poll.c
    index a0f28324e2f2ca..f5a30e9a6b2499 100644
    --- a/deps/uv/test/test-poll.c
    +++ b/deps/uv/test/test-poll.c
    @@ -106,9 +106,9 @@ static uv_os_sock_t create_bound_socket (struct sockaddr_in bind_addr) {
     
       sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
     #ifdef _WIN32
    -  ASSERT(sock != INVALID_SOCKET);
    +  ASSERT_NE(sock, INVALID_SOCKET);
     #else
    -  ASSERT(sock >= 0);
    +  ASSERT_GE(sock, 0);
     #endif
     
     #ifndef _WIN32
    @@ -116,12 +116,12 @@ static uv_os_sock_t create_bound_socket (struct sockaddr_in bind_addr) {
         /* Allow reuse of the port. */
         int yes = 1;
         r = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     #endif
     
       r = bind(sock, (const struct sockaddr*) &bind_addr, sizeof bind_addr);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       return sock;
     }
    @@ -163,12 +163,12 @@ static connection_context_t* create_connection_context(
       r = uv_poll_init_socket(uv_default_loop(), &context->poll_handle, sock);
       context->open_handles++;
       context->poll_handle.data = context;
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_timer_init(uv_default_loop(), &context->timer_handle);
       context->open_handles++;
       context->timer_handle.data = context;
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       return context;
     }
    @@ -179,15 +179,15 @@ static void connection_close_cb(uv_handle_t* handle) {
     
       if (--context->open_handles == 0) {
         if (test_mode == DUPLEX || context->is_server_connection) {
    -      ASSERT(context->read == TRANSFER_BYTES);
    +      ASSERT_EQ(context->read, TRANSFER_BYTES);
         } else {
    -      ASSERT(context->read == 0);
    +      ASSERT_OK(context->read);
         }
     
         if (test_mode == DUPLEX || !context->is_server_connection) {
    -      ASSERT(context->sent == TRANSFER_BYTES);
    +      ASSERT_EQ(context->sent, TRANSFER_BYTES);
         } else {
    -      ASSERT(context->sent == 0);
    +      ASSERT_OK(context->sent);
         }
     
         closed_connections++;
    @@ -208,7 +208,7 @@ static void connection_poll_cb(uv_poll_t* handle, int status, int events) {
       unsigned int new_events;
       int r;
     
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       ASSERT(events & context->events);
       ASSERT(!(events & ~context->events));
     
    @@ -226,7 +226,7 @@ static void connection_poll_cb(uv_poll_t* handle, int status, int events) {
             do
               r = recv(context->sock, buffer, sizeof buffer, 0);
             while (r == -1 && errno == EINTR);
    -        ASSERT(r >= 0);
    +        ASSERT_GE(r, 0);
     
             if (r > 0) {
               context->read += r;
    @@ -306,7 +306,7 @@ static void connection_poll_cb(uv_poll_t* handle, int status, int events) {
               static char buffer[103];
     
               int send_bytes = MIN(TRANSFER_BYTES - context->sent, sizeof buffer);
    -          ASSERT(send_bytes > 0);
    +          ASSERT_GT(send_bytes, 0);
     
               do
                 r = send(context->sock, buffer, send_bytes, 0);
    @@ -318,7 +318,7 @@ static void connection_poll_cb(uv_poll_t* handle, int status, int events) {
                 break;
               }
     
    -          ASSERT(r > 0);
    +          ASSERT_GT(r, 0);
               context->sent += r;
               valid_writable_wakeups++;
               break;
    @@ -330,7 +330,7 @@ static void connection_poll_cb(uv_poll_t* handle, int status, int events) {
               static char buffer[1234];
     
               int send_bytes = MIN(TRANSFER_BYTES - context->sent, sizeof buffer);
    -          ASSERT(send_bytes > 0);
    +          ASSERT_GT(send_bytes, 0);
     
               do
                 r = send(context->sock, buffer, send_bytes, 0);
    @@ -342,18 +342,18 @@ static void connection_poll_cb(uv_poll_t* handle, int status, int events) {
                 break;
               }
     
    -          ASSERT(r > 0);
    +          ASSERT_GT(r, 0);
               valid_writable_wakeups++;
               context->sent += r;
     
               while (context->sent < TRANSFER_BYTES) {
                 send_bytes = MIN(TRANSFER_BYTES - context->sent, sizeof buffer);
    -            ASSERT(send_bytes > 0);
    +            ASSERT_GT(send_bytes, 0);
     
                 do
                   r = send(context->sock, buffer, send_bytes, 0);
                 while (r == -1 && errno == EINTR);
    -            ASSERT(r != 0);
    +            ASSERT(r);
     
                 if (r < 0) {
                   ASSERT(got_eagain());
    @@ -403,7 +403,7 @@ static void connection_poll_cb(uv_poll_t* handle, int status, int events) {
     #else
           r = shutdown(context->sock, SHUT_WR);
     #endif
    -      ASSERT(r == 0);
    +      ASSERT_OK(r);
           context->sent_fin = 1;
           new_events &= ~UV_WRITABLE;
         }
    @@ -432,9 +432,9 @@ static void connection_poll_cb(uv_poll_t* handle, int status, int events) {
     
       /* Assert that uv_is_active works correctly for poll handles. */
       if (context->events != 0) {
    -    ASSERT(1 == uv_is_active((uv_handle_t*) handle));
    +    ASSERT_EQ(1, uv_is_active((uv_handle_t*) handle));
       } else {
    -    ASSERT(0 == uv_is_active((uv_handle_t*) handle));
    +    ASSERT_OK(uv_is_active((uv_handle_t*) handle));
       }
     }
     
    @@ -444,7 +444,7 @@ static void delay_timer_cb(uv_timer_t* timer) {
       int r;
     
       /* Timer should auto stop. */
    -  ASSERT(0 == uv_is_active((uv_handle_t*) timer));
    +  ASSERT_OK(uv_is_active((uv_handle_t*) timer));
     
       /* Add the requested events to the poll mask. */
       ASSERT(context->delayed_events != 0);
    @@ -454,7 +454,7 @@ static void delay_timer_cb(uv_timer_t* timer) {
       r = uv_poll_start(&context->poll_handle,
                         context->events,
                         connection_poll_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -471,7 +471,7 @@ static server_context_t* create_server_context(
     
       r = uv_poll_init_socket(uv_default_loop(), &context->poll_handle, sock);
       context->poll_handle.data = context;
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       return context;
     }
    @@ -500,9 +500,9 @@ static void server_poll_cb(uv_poll_t* handle, int status, int events) {
       addr_len = sizeof addr;
       sock = accept(server_context->sock, (struct sockaddr*) &addr, &addr_len);
     #ifdef _WIN32
    -  ASSERT(sock != INVALID_SOCKET);
    +  ASSERT_NE(sock, INVALID_SOCKET);
     #else
    -  ASSERT(sock >= 0);
    +  ASSERT_GE(sock, 0);
     #endif
     
       connection_context = create_connection_context(sock, 1);
    @@ -510,7 +510,7 @@ static void server_poll_cb(uv_poll_t* handle, int status, int events) {
       r = uv_poll_start(&connection_context->poll_handle,
                         UV_READABLE | UV_WRITABLE | UV_DISCONNECT,
                         connection_poll_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       if (++server_context->connections == NUM_CLIENTS) {
         close_socket(server_context->sock);
    @@ -525,15 +525,15 @@ static void start_server(void) {
       uv_os_sock_t sock;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
       sock = create_bound_socket(addr);
       context = create_server_context(sock);
     
       r = listen(sock, 100);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_poll_start(&context->poll_handle, UV_READABLE, server_poll_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -544,8 +544,8 @@ static void start_client(void) {
       struct sockaddr_in addr;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &server_addr));
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", 0, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &server_addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", 0, &addr));
     
       sock = create_bound_socket(addr);
       context = create_connection_context(sock, 0);
    @@ -554,7 +554,7 @@ static void start_client(void) {
       r = uv_poll_start(&context->poll_handle,
                         UV_READABLE | UV_WRITABLE | UV_DISCONNECT,
                         connection_poll_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = connect(sock, (struct sockaddr*) &server_addr, sizeof server_addr);
       ASSERT(r == 0 || got_eagain());
    @@ -568,7 +568,7 @@ static void start_poll_test(void) {
       {
         struct WSAData wsa_data;
         int r = WSAStartup(MAKEWORD(2, 2), &wsa_data);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     #endif
     
    @@ -578,16 +578,16 @@ static void start_poll_test(void) {
         start_client();
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Assert that at most five percent of the writable wakeups was spurious. */
    -  ASSERT(spurious_writable_wakeups == 0 ||
    -         (valid_writable_wakeups + spurious_writable_wakeups) /
    -         spurious_writable_wakeups > 20);
    +  ASSERT_NE(spurious_writable_wakeups == 0 ||
    +            (valid_writable_wakeups + spurious_writable_wakeups) /
    +            spurious_writable_wakeups > 20, 0);
     
    -  ASSERT(closed_connections == NUM_CLIENTS * 2);
    +  ASSERT_EQ(closed_connections, NUM_CLIENTS * 2);
     #if !defined(__sun) && !defined(_AIX) && !defined(__MVS__)
    -  ASSERT(disconnects == NUM_CLIENTS * 2);
    +  ASSERT_EQ(disconnects, NUM_CLIENTS * 2);
     #endif
       MAKE_VALGRIND_HAPPY(uv_default_loop());
     }
    @@ -642,9 +642,9 @@ TEST_IMPL(poll_bad_fdtype) {
     #else
       fd = open(".", O_RDONLY);
     #endif
    -  ASSERT(fd != -1);
    -  ASSERT(0 != uv_poll_init(uv_default_loop(), &poll_handle, fd));
    -  ASSERT(0 == close(fd));
    +  ASSERT_NE(fd, -1);
    +  ASSERT_NE(0, uv_poll_init(uv_default_loop(), &poll_handle, fd));
    +  ASSERT_OK(close(fd));
     #endif
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
    @@ -658,15 +658,15 @@ TEST_IMPL(poll_nested_epoll) {
       int fd;
     
       fd = epoll_create(1);
    -  ASSERT(fd != -1);
    +  ASSERT_NE(fd, -1);
     
    -  ASSERT(0 == uv_poll_init(uv_default_loop(), &poll_handle, fd));
    -  ASSERT(0 == uv_poll_start(&poll_handle, UV_READABLE, (uv_poll_cb) abort));
    -  ASSERT(0 != uv_run(uv_default_loop(), UV_RUN_NOWAIT));
    +  ASSERT_OK(uv_poll_init(uv_default_loop(), &poll_handle, fd));
    +  ASSERT_OK(uv_poll_start(&poll_handle, UV_READABLE, (uv_poll_cb) abort));
    +  ASSERT_NE(0, uv_run(uv_default_loop(), UV_RUN_NOWAIT));
     
       uv_close((uv_handle_t*) &poll_handle, NULL);
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    -  ASSERT(0 == close(fd));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(close(fd));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -680,15 +680,15 @@ TEST_IMPL(poll_nested_kqueue) {
       int fd;
     
       fd = kqueue();
    -  ASSERT(fd != -1);
    +  ASSERT_NE(fd, -1);
     
    -  ASSERT(0 == uv_poll_init(uv_default_loop(), &poll_handle, fd));
    -  ASSERT(0 == uv_poll_start(&poll_handle, UV_READABLE, (uv_poll_cb) abort));
    -  ASSERT(0 != uv_run(uv_default_loop(), UV_RUN_NOWAIT));
    +  ASSERT_OK(uv_poll_init(uv_default_loop(), &poll_handle, fd));
    +  ASSERT_OK(uv_poll_start(&poll_handle, UV_READABLE, (uv_poll_cb) abort));
    +  ASSERT_NE(0, uv_run(uv_default_loop(), UV_RUN_NOWAIT));
     
       uv_close((uv_handle_t*) &poll_handle, NULL);
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    -  ASSERT(0 == close(fd));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(close(fd));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-process-priority.c b/deps/uv/test/test-process-priority.c
    index b3d0a85bdd70ec..941e4b36391032 100644
    --- a/deps/uv/test/test-process-priority.c
    +++ b/deps/uv/test/test-process-priority.c
    @@ -35,7 +35,7 @@ TEST_IMPL(process_priority) {
     
       /* Verify that passing a NULL pointer returns UV_EINVAL. */
       r = uv_os_getpriority(0, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       /* Verify that all valid values work. */
       for (i = UV_PRIORITY_HIGHEST; i <= UV_PRIORITY_LOW; i++) {
    @@ -46,38 +46,38 @@ TEST_IMPL(process_priority) {
         if (r == UV_EACCES)
           continue;
     
    -    ASSERT(r == 0);
    -    ASSERT(uv_os_getpriority(0, &priority) == 0);
    +    ASSERT_OK(r);
    +    ASSERT_OK(uv_os_getpriority(0, &priority));
     
         /* Verify that the priority values match on Unix, and are range mapped
            on Windows. */
     #ifndef _WIN32
    -    ASSERT(priority == i);
    +    ASSERT_EQ(priority, i);
     #else
         /* On Windows, only elevated users can set UV_PRIORITY_HIGHEST. Other
            users will silently be set to UV_PRIORITY_HIGH. */
         if (i < UV_PRIORITY_HIGH)
           ASSERT(priority == UV_PRIORITY_HIGHEST || priority == UV_PRIORITY_HIGH);
         else if (i < UV_PRIORITY_ABOVE_NORMAL)
    -      ASSERT(priority == UV_PRIORITY_HIGH);
    +      ASSERT_EQ(priority, UV_PRIORITY_HIGH);
         else if (i < UV_PRIORITY_NORMAL)
    -      ASSERT(priority == UV_PRIORITY_ABOVE_NORMAL);
    +      ASSERT_EQ(priority, UV_PRIORITY_ABOVE_NORMAL);
         else if (i < UV_PRIORITY_BELOW_NORMAL)
    -      ASSERT(priority == UV_PRIORITY_NORMAL);
    +      ASSERT_EQ(priority, UV_PRIORITY_NORMAL);
         else if (i < UV_PRIORITY_LOW)
    -      ASSERT(priority == UV_PRIORITY_BELOW_NORMAL);
    +      ASSERT_EQ(priority, UV_PRIORITY_BELOW_NORMAL);
         else
    -      ASSERT(priority == UV_PRIORITY_LOW);
    +      ASSERT_EQ(priority, UV_PRIORITY_LOW);
     #endif
     
         /* Verify that the current PID and 0 are equivalent. */
    -    ASSERT(uv_os_getpriority(uv_os_getpid(), &r) == 0);
    -    ASSERT(priority == r);
    +    ASSERT_OK(uv_os_getpriority(uv_os_getpid(), &r));
    +    ASSERT_EQ(priority, r);
       }
     
       /* Verify that invalid priorities return UV_EINVAL. */
    -  ASSERT(uv_os_setpriority(0, UV_PRIORITY_HIGHEST - 1) == UV_EINVAL);
    -  ASSERT(uv_os_setpriority(0, UV_PRIORITY_LOW + 1) == UV_EINVAL);
    +  ASSERT_EQ(uv_os_setpriority(0, UV_PRIORITY_HIGHEST - 1), UV_EINVAL);
    +  ASSERT_EQ(uv_os_setpriority(0, UV_PRIORITY_LOW + 1), UV_EINVAL);
     
       return 0;
     }
    diff --git a/deps/uv/test/test-process-title-threadsafe.c b/deps/uv/test/test-process-title-threadsafe.c
    index 927643cc8c90c9..05baaf44a453ad 100644
    --- a/deps/uv/test/test-process-title-threadsafe.c
    +++ b/deps/uv/test/test-process-title-threadsafe.c
    @@ -46,7 +46,7 @@ static void getter_thread_body(void* arg) {
       getter_sem = arg;
     
       while (UV_EAGAIN == uv_sem_trywait(getter_sem)) {
    -    ASSERT(0 == uv_get_process_title(buffer, sizeof(buffer)));
    +    ASSERT_OK(uv_get_process_title(buffer, sizeof(buffer)));
     
         /* The maximum size of the process title on some platforms depends on
          * the total size of the argv vector. It's therefore possible to read
    @@ -70,10 +70,10 @@ static void setter_thread_body(void* arg) {
       int i;
     
       for (i = 0; i < NUM_ITERATIONS; i++) {
    -    ASSERT(0 == uv_set_process_title(titles[0]));
    -    ASSERT(0 == uv_set_process_title(titles[1]));
    -    ASSERT(0 == uv_set_process_title(titles[2]));
    -    ASSERT(0 == uv_set_process_title(titles[3]));
    +    ASSERT_OK(uv_set_process_title(titles[0]));
    +    ASSERT_OK(uv_set_process_title(titles[1]));
    +    ASSERT_OK(uv_set_process_title(titles[2]));
    +    ASSERT_OK(uv_set_process_title(titles[3]));
       }
     }
     
    @@ -89,20 +89,19 @@ TEST_IMPL(process_title_threadsafe) {
       RETURN_SKIP("uv_(get|set)_process_title is not implemented.");
     #endif
     
    -  ASSERT(0 == uv_set_process_title(titles[0]));
    +  ASSERT_OK(uv_set_process_title(titles[0]));
     
    -  ASSERT_EQ(0, uv_sem_init(&getter_sem, 0));
    -  ASSERT_EQ(0,
    -            uv_thread_create(&getter_thread, getter_thread_body, &getter_sem));
    +  ASSERT_OK(uv_sem_init(&getter_sem, 0));
    +  ASSERT_OK(uv_thread_create(&getter_thread, getter_thread_body, &getter_sem));
     
       for (i = 0; i < (int) ARRAY_SIZE(setter_threads); i++)
    -    ASSERT(0 == uv_thread_create(&setter_threads[i], setter_thread_body, NULL));
    +    ASSERT_OK(uv_thread_create(&setter_threads[i], setter_thread_body, NULL));
     
       for (i = 0; i < (int) ARRAY_SIZE(setter_threads); i++)
    -    ASSERT(0 == uv_thread_join(&setter_threads[i]));
    +    ASSERT_OK(uv_thread_join(&setter_threads[i]));
     
       uv_sem_post(&getter_sem);
    -  ASSERT_EQ(0, uv_thread_join(&getter_thread));
    +  ASSERT_OK(uv_thread_join(&getter_thread));
       uv_sem_destroy(&getter_sem);
     
       return 0;
    diff --git a/deps/uv/test/test-process-title.c b/deps/uv/test/test-process-title.c
    index c5cff9723da4d3..7178cf87da4b52 100644
    --- a/deps/uv/test/test-process-title.c
    +++ b/deps/uv/test/test-process-title.c
    @@ -29,15 +29,15 @@ static void set_title(const char* title) {
       int err;
     
       err = uv_get_process_title(buffer, sizeof(buffer));
    -  ASSERT(err == 0);
    +  ASSERT_OK(err);
     
       err = uv_set_process_title(title);
    -  ASSERT(err == 0);
    +  ASSERT_OK(err);
     
       err = uv_get_process_title(buffer, sizeof(buffer));
    -  ASSERT(err == 0);
    +  ASSERT_OK(err);
     
    -  ASSERT(strcmp(buffer, title) == 0);
    +  ASSERT_OK(strcmp(buffer, title));
     }
     
     
    @@ -47,15 +47,15 @@ static void uv_get_process_title_edge_cases(void) {
     
       /* Test a NULL buffer */
       r = uv_get_process_title(NULL, 100);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       /* Test size of zero */
       r = uv_get_process_title(buffer, 0);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       /* Test for insufficient buffer size */
       r = uv_get_process_title(buffer, 1);
    -  ASSERT(r == UV_ENOBUFS);
    +  ASSERT_EQ(r, UV_ENOBUFS);
     }
     
     
    @@ -77,8 +77,8 @@ TEST_IMPL(process_title) {
     
     
     static void exit_cb(uv_process_t* process, int64_t status, int signo) {
    -  ASSERT(status == 0);
    -  ASSERT(signo == 0);
    +  ASSERT_OK(status);
    +  ASSERT_OK(signo);
       uv_close((uv_handle_t*) process, NULL);
     }
     
    @@ -97,7 +97,7 @@ TEST_IMPL(process_title_big_argv) {
     #endif
     
       exepath_size = sizeof(exepath) - 1;
    -  ASSERT(0 == uv_exepath(exepath, &exepath_size));
    +  ASSERT_OK(uv_exepath(exepath, &exepath_size));
       exepath[exepath_size] = '\0';
     
       memset(jumbo, 'x', sizeof(jumbo) - 1);
    @@ -117,8 +117,8 @@ TEST_IMPL(process_title_big_argv) {
       options.args = args;
       options.exit_cb = exit_cb;
     
    -  ASSERT(0 == uv_spawn(uv_default_loop(), &process, &options));
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_spawn(uv_default_loop(), &process, &options));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -131,5 +131,5 @@ void process_title_big_argv(void) {
     
       /* Return value deliberately ignored. */
       uv_get_process_title(buf, sizeof(buf));
    -  ASSERT(0 != strcmp(buf, "fail"));
    +  ASSERT_NE(0, strcmp(buf, "fail"));
     }
    diff --git a/deps/uv/test/test-queue-foreach-delete.c b/deps/uv/test/test-queue-foreach-delete.c
    index 4fe8aecee5f781..b3a2d19c4088c9 100644
    --- a/deps/uv/test/test-queue-foreach-delete.c
    +++ b/deps/uv/test/test-queue-foreach-delete.c
    @@ -71,7 +71,7 @@ static const unsigned first_handle_number_fs_event = 0;
       static unsigned name##_cb_calls[3];                                         \
                                                                                   \
       static void name##2_cb(__VA_ARGS__) {                                       \
    -    ASSERT(handle == &(name)[2]);                                             \
    +    ASSERT_PTR_EQ(handle, &(name)[2]);                                        \
         if (first_handle_number_##name == 2) {                                    \
           uv_close((uv_handle_t*)&(name)[2], NULL);                               \
           uv_close((uv_handle_t*)&(name)[1], NULL);                               \
    @@ -80,12 +80,12 @@ static const unsigned first_handle_number_fs_event = 0;
       }                                                                           \
                                                                                   \
       static void name##1_cb(__VA_ARGS__) {                                       \
    -    ASSERT(handle == &(name)[1]);                                             \
    +    ASSERT_PTR_EQ(handle, &(name)[1]);                                        \
         ASSERT(0 && "Shouldn't be called" && (&name[0]));                         \
       }                                                                           \
                                                                                   \
       static void name##0_cb(__VA_ARGS__) {                                       \
    -    ASSERT(handle == &(name)[0]);                                             \
    +    ASSERT_PTR_EQ(handle, &(name)[0]);                                        \
         if (first_handle_number_##name == 0) {                                    \
           uv_close((uv_handle_t*)&(name)[0], NULL);                               \
           uv_close((uv_handle_t*)&(name)[1], NULL);                               \
    @@ -105,18 +105,18 @@ static const unsigned first_handle_number_fs_event = 0;
         for (i = 0; i < ARRAY_SIZE(name); i++) {                                  \
           int r;                                                                  \
           r = uv_##name##_init((loop), &(name)[i]);                               \
    -      ASSERT(r == 0);                                                         \
    +      ASSERT_OK(r);                                                           \
                                                                                   \
           r = uv_##name##_start(&(name)[i], name##_cbs[i]);                       \
    -      ASSERT(r == 0);                                                         \
    +      ASSERT_OK(r);                                                           \
         }                                                                         \
       } while (0)
     
     #define END_ASSERTS(name)                                                     \
       do {                                                                        \
    -    ASSERT(name##_cb_calls[0] == 1);                                          \
    -    ASSERT(name##_cb_calls[1] == 0);                                          \
    -    ASSERT(name##_cb_calls[2] == 1);                                          \
    +    ASSERT_EQ(1, name##_cb_calls[0]);                                         \
    +    ASSERT_OK(name##_cb_calls[1]);                                            \
    +    ASSERT_EQ(1, name##_cb_calls[2]);                                         \
       } while (0)
     
     DEFINE_GLOBALS_AND_CBS(idle, uv_idle_t* handle)
    @@ -140,13 +140,13 @@ static void init_and_start_fs_events(uv_loop_t* loop) {
       for (i = 0; i < ARRAY_SIZE(fs_event); i++) {
         int r;
         r = uv_fs_event_init(loop, &fs_event[i]);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
         r = uv_fs_event_start(&fs_event[i],
                               (uv_fs_event_cb)fs_event_cbs[i],
                               watched_dir,
                               0);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     }
     
    @@ -156,10 +156,10 @@ static void helper_timer_cb(uv_timer_t* thandle) {
     
       /* fire all fs_events */
       r = uv_fs_utime(thandle->loop, &fs_req, watched_dir, 0, 0, NULL);
    -  ASSERT(r == 0);
    -  ASSERT(fs_req.result == 0);
    -  ASSERT(fs_req.fs_type == UV_FS_UTIME);
    -  ASSERT(strcmp(fs_req.path, watched_dir) == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(fs_req.result);
    +  ASSERT_EQ(fs_req.fs_type, UV_FS_UTIME);
    +  ASSERT_OK(strcmp(fs_req.path, watched_dir));
       uv_fs_req_cleanup(&fs_req);
     
       helper_timer_cb_calls++;
    @@ -182,21 +182,21 @@ TEST_IMPL(queue_foreach_delete) {
     
       /* helper timer to trigger async and fs_event callbacks */
       r = uv_timer_init(loop, &timer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_timer_start(&timer, helper_timer_cb, 0, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     #endif
     
       r = uv_run(loop, UV_RUN_NOWAIT);
    -  ASSERT(r == 1);
    +  ASSERT_EQ(1, r);
     
       END_ASSERTS(idle);
       END_ASSERTS(prepare);
       END_ASSERTS(check);
     
     #ifdef __linux__
    -  ASSERT(helper_timer_cb_calls == 1);
    +  ASSERT_EQ(1, helper_timer_cb_calls);
     #endif
     
       MAKE_VALGRIND_HAPPY(loop);
    diff --git a/deps/uv/test/test-random.c b/deps/uv/test/test-random.c
    index 3ff3fa8b364824..d82d05782c098e 100644
    --- a/deps/uv/test/test-random.c
    +++ b/deps/uv/test/test-random.c
    @@ -33,16 +33,16 @@ static void random_cb(uv_random_t* req, int status, void* buf, size_t buflen) {
     
       memset(zero, 0, sizeof(zero));
     
    -  ASSERT(0 == status);
    -  ASSERT(buf == (void*) scratch);
    +  ASSERT_OK(status);
    +  ASSERT_PTR_EQ(buf, (void*) scratch);
     
       if (random_cb_called == 0) {
    -    ASSERT(buflen == 0);
    -    ASSERT(0 == memcmp(scratch, zero, sizeof(zero)));
    +    ASSERT_OK(buflen);
    +    ASSERT_OK(memcmp(scratch, zero, sizeof(zero)));
       } else {
    -    ASSERT(buflen == sizeof(scratch));
    +    ASSERT_EQ(buflen, sizeof(scratch));
         /* Buy a lottery ticket if you manage to trip this assertion. */
    -    ASSERT(0 != memcmp(scratch, zero, sizeof(zero)));
    +    ASSERT_NE(0, memcmp(scratch, zero, sizeof(zero)));
       }
     
       random_cb_called++;
    @@ -54,21 +54,21 @@ TEST_IMPL(random_async) {
       uv_loop_t* loop;
     
       loop = uv_default_loop();
    -  ASSERT(UV_EINVAL == uv_random(loop, &req, scratch, sizeof(scratch), -1,
    -                                random_cb));
    -  ASSERT(UV_E2BIG == uv_random(loop, &req, scratch, -1, -1, random_cb));
    +  ASSERT_EQ(UV_EINVAL, uv_random(loop, &req, scratch, sizeof(scratch), -1,
    +                                 random_cb));
    +  ASSERT_EQ(UV_E2BIG, uv_random(loop, &req, scratch, -1, -1, random_cb));
     
    -  ASSERT(0 == uv_random(loop, &req, scratch, 0, 0, random_cb));
    -  ASSERT(0 == random_cb_called);
    +  ASSERT_OK(uv_random(loop, &req, scratch, 0, 0, random_cb));
    +  ASSERT_OK(random_cb_called);
     
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -  ASSERT(1 == random_cb_called);
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(1, random_cb_called);
     
    -  ASSERT(0 == uv_random(loop, &req, scratch, sizeof(scratch), 0, random_cb));
    -  ASSERT(1 == random_cb_called);
    +  ASSERT_OK(uv_random(loop, &req, scratch, sizeof(scratch), 0, random_cb));
    +  ASSERT_EQ(1, random_cb_called);
     
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -  ASSERT(2 == random_cb_called);
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(2, random_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -79,15 +79,15 @@ TEST_IMPL(random_sync) {
       char zero[256];
       char buf[256];
     
    -  ASSERT(UV_EINVAL == uv_random(NULL, NULL, buf, sizeof(buf), -1, NULL));
    -  ASSERT(UV_E2BIG == uv_random(NULL, NULL, buf, -1, -1, NULL));
    +  ASSERT_EQ(UV_EINVAL, uv_random(NULL, NULL, buf, sizeof(buf), -1, NULL));
    +  ASSERT_EQ(UV_E2BIG, uv_random(NULL, NULL, buf, -1, -1, NULL));
     
       memset(buf, 0, sizeof(buf));
    -  ASSERT(0 == uv_random(NULL, NULL, buf, sizeof(buf), 0, NULL));
    +  ASSERT_OK(uv_random(NULL, NULL, buf, sizeof(buf), 0, NULL));
     
       /* Buy a lottery ticket if you manage to trip this assertion. */
       memset(zero, 0, sizeof(zero));
    -  ASSERT(0 != memcmp(buf, zero, sizeof(zero)));
    +  ASSERT_NE(0, memcmp(buf, zero, sizeof(zero)));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-readable-on-eof.c b/deps/uv/test/test-readable-on-eof.c
    index 1162f8db1d06a4..2137ac5947f919 100644
    --- a/deps/uv/test/test-readable-on-eof.c
    +++ b/deps/uv/test/test-readable-on-eof.c
    @@ -35,7 +35,7 @@ static int close_cb_called;
     
     static void write_cb(uv_write_t* req, int status) {
       write_cb_called++;
    -  ASSERT_EQ(status, 0);
    +  ASSERT_OK(status);
     }
     
     static void alloc_cb(uv_handle_t* handle,
    @@ -54,16 +54,16 @@ static void read_cb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) {
       int r;
     
       ASSERT_EQ(nread, UV_EOF);
    -  ASSERT_EQ(uv_is_readable(handle), 1);
    -  ASSERT_EQ(uv_is_writable(handle), 1);
    +  ASSERT_EQ(1, uv_is_readable(handle));
    +  ASSERT_EQ(1, uv_is_writable(handle));
     
       if (++read_cb_called == 3) {
           uv_close((uv_handle_t*) handle, close_cb);
    -      ASSERT_EQ(uv_is_readable(handle), 0);
    -      ASSERT_EQ(uv_is_writable(handle), 0);
    +      ASSERT_OK(uv_is_readable(handle));
    +      ASSERT_OK(uv_is_writable(handle));
       } else {
           r = uv_read_start((uv_stream_t*) &tcp_client, alloc_cb, read_cb);
    -      ASSERT_EQ(r, 0);
    +      ASSERT_OK(r);
       }
     }
     
    @@ -72,7 +72,7 @@ static void connect_cb(uv_connect_t* req, int status) {
       uv_buf_t close_me;
     
       connect_cb_called++;
    -  ASSERT_EQ(status, 0);
    +  ASSERT_OK(status);
     
       read_cb((uv_stream_t*) &tcp_client, UV_EOF, NULL);
     
    @@ -84,27 +84,26 @@ static void connect_cb(uv_connect_t* req, int status) {
                    1,
                    write_cb);
     
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     }
     
     TEST_IMPL(readable_on_eof) {
       struct sockaddr_in sa;
    -  ASSERT_EQ(uv_ip4_addr("127.0.0.1", TEST_PORT, &sa), 0);
    -  ASSERT_EQ(uv_loop_init(&loop), 0);
    -  ASSERT_EQ(uv_tcp_init(&loop, &tcp_client), 0);
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &sa));
    +  ASSERT_OK(uv_loop_init(&loop));
    +  ASSERT_OK(uv_tcp_init(&loop, &tcp_client));
     
    -  ASSERT_EQ(uv_tcp_connect(&connect_req,
    +  ASSERT_OK(uv_tcp_connect(&connect_req,
                                &tcp_client,
                                (const struct sockaddr*) &sa,
    -                           connect_cb),
    -            0);
    +                           connect_cb));
     
    -  ASSERT_EQ(uv_run(&loop, UV_RUN_DEFAULT), 0);
    +  ASSERT_OK(uv_run(&loop, UV_RUN_DEFAULT));
     
    -  ASSERT_EQ(connect_cb_called, 1);
    -  ASSERT_EQ(read_cb_called, 3);
    -  ASSERT_EQ(write_cb_called, 1);
    -  ASSERT_EQ(close_cb_called, 1);
    +  ASSERT_EQ(1, connect_cb_called);
    +  ASSERT_EQ(3, read_cb_called);
    +  ASSERT_EQ(1, write_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(&loop);
       return 0;
    diff --git a/deps/uv/test/test-ref.c b/deps/uv/test/test-ref.c
    index 7a9a0b9315b697..dbe94f7168b18d 100644
    --- a/deps/uv/test/test-ref.c
    +++ b/deps/uv/test/test-ref.c
    @@ -47,9 +47,9 @@ static void close_cb(uv_handle_t* handle) {
     static void do_close(void* handle) {
       close_cb_called = 0;
       uv_close((uv_handle_t*)handle, close_cb);
    -  ASSERT(close_cb_called == 0);
    +  ASSERT_OK(close_cb_called);
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
     }
     
     
    @@ -69,13 +69,13 @@ static void req_cb(uv_handle_t* req, int status) {
     
     
     static void shutdown_cb(uv_shutdown_t* req, int status) {
    -  ASSERT(req == &shutdown_req);
    +  ASSERT_PTR_EQ(req, &shutdown_req);
       shutdown_cb_called++;
     }
     
     
     static void write_cb(uv_write_t* req, int status) {
    -  ASSERT(req == &write_req);
    +  ASSERT_PTR_EQ(req, &write_req);
       uv_shutdown(&shutdown_req, req->handle, shutdown_cb);
       write_cb_called++;
     }
    @@ -83,8 +83,8 @@ static void write_cb(uv_write_t* req, int status) {
     
     static void connect_and_write(uv_connect_t* req, int status) {
       uv_buf_t buf = uv_buf_init(buffer, sizeof buffer);
    -  ASSERT(req == &connect_req);
    -  ASSERT(status == 0);
    +  ASSERT_PTR_EQ(req, &connect_req);
    +  ASSERT_OK(status);
       uv_write(&write_req, req->handle, &buf, 1, write_cb);
       connect_cb_called++;
     }
    @@ -92,8 +92,8 @@ static void connect_and_write(uv_connect_t* req, int status) {
     
     
     static void connect_and_shutdown(uv_connect_t* req, int status) {
    -  ASSERT(req == &connect_req);
    -  ASSERT(status == 0);
    +  ASSERT_PTR_EQ(req, &connect_req);
    +  ASSERT_OK(status);
       uv_shutdown(&shutdown_req, req->handle, shutdown_cb);
       connect_cb_called++;
     }
    @@ -250,7 +250,7 @@ TEST_IMPL(tcp_ref2b) {
       uv_unref((uv_handle_t*)&h);
       uv_close((uv_handle_t*)&h, close_cb);
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
     }
    @@ -259,7 +259,7 @@ TEST_IMPL(tcp_ref2b) {
     TEST_IMPL(tcp_ref3) {
       struct sockaddr_in addr;
       uv_tcp_t h;
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
       uv_tcp_init(uv_default_loop(), &h);
       uv_tcp_connect(&connect_req,
                      &h,
    @@ -267,8 +267,8 @@ TEST_IMPL(tcp_ref3) {
                      connect_and_shutdown);
       uv_unref((uv_handle_t*)&h);
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(connect_cb_called == 1);
    -  ASSERT(shutdown_cb_called == 1);
    +  ASSERT_EQ(1, connect_cb_called);
    +  ASSERT_EQ(1, shutdown_cb_called);
       do_close(&h);
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -278,7 +278,7 @@ TEST_IMPL(tcp_ref3) {
     TEST_IMPL(tcp_ref4) {
       struct sockaddr_in addr;
       uv_tcp_t h;
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
       uv_tcp_init(uv_default_loop(), &h);
       uv_tcp_connect(&connect_req,
                      &h,
    @@ -286,9 +286,9 @@ TEST_IMPL(tcp_ref4) {
                      connect_and_write);
       uv_unref((uv_handle_t*)&h);
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(connect_cb_called == 1);
    -  ASSERT(write_cb_called == 1);
    -  ASSERT(shutdown_cb_called == 1);
    +  ASSERT_EQ(1, connect_cb_called);
    +  ASSERT_EQ(1, write_cb_called);
    +  ASSERT_EQ(1, shutdown_cb_called);
       do_close(&h);
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -309,7 +309,7 @@ TEST_IMPL(udp_ref) {
     TEST_IMPL(udp_ref2) {
       struct sockaddr_in addr;
       uv_udp_t h;
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
       uv_udp_init(uv_default_loop(), &h);
       uv_udp_bind(&h, (const struct sockaddr*) &addr, 0);
       uv_udp_recv_start(&h, (uv_alloc_cb)fail_cb, (uv_udp_recv_cb)fail_cb);
    @@ -327,7 +327,7 @@ TEST_IMPL(udp_ref3) {
       uv_udp_send_t req;
       uv_udp_t h;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
       uv_udp_init(uv_default_loop(), &h);
       uv_udp_send(&req,
                   &h,
    @@ -337,7 +337,7 @@ TEST_IMPL(udp_ref3) {
                   (uv_udp_send_cb) req_cb);
       uv_unref((uv_handle_t*)&h);
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(req_cb_called == 1);
    +  ASSERT_EQ(1, req_cb_called);
       do_close(&h);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
    @@ -374,8 +374,8 @@ TEST_IMPL(pipe_ref3) {
       uv_pipe_connect(&connect_req, &h, TEST_PIPENAME, connect_and_shutdown);
       uv_unref((uv_handle_t*)&h);
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(connect_cb_called == 1);
    -  ASSERT(shutdown_cb_called == 1);
    +  ASSERT_EQ(1, connect_cb_called);
    +  ASSERT_EQ(1, shutdown_cb_called);
       do_close(&h);
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -388,9 +388,9 @@ TEST_IMPL(pipe_ref4) {
       uv_pipe_connect(&connect_req, &h, TEST_PIPENAME, connect_and_write);
       uv_unref((uv_handle_t*)&h);
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(connect_cb_called == 1);
    -  ASSERT(write_cb_called == 1);
    -  ASSERT(shutdown_cb_called == 1);
    +  ASSERT_EQ(1, connect_cb_called);
    +  ASSERT_EQ(1, write_cb_called);
    +  ASSERT_EQ(1, shutdown_cb_called);
       do_close(&h);
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -410,7 +410,7 @@ TEST_IMPL(process_ref) {
       exepath_size = sizeof(exepath);
     
       r = uv_exepath(exepath, &exepath_size);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       argv[0] = exepath;
       options.file = exepath;
    @@ -418,13 +418,13 @@ TEST_IMPL(process_ref) {
       options.exit_cb = NULL;
     
       r = uv_spawn(uv_default_loop(), &h, &options);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_unref((uv_handle_t*)&h);
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
       r = uv_process_kill(&h, /* SIGTERM */ 15);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       do_close(&h);
     
    @@ -437,9 +437,9 @@ TEST_IMPL(has_ref) {
       uv_idle_t h;
       uv_idle_init(uv_default_loop(), &h);
       uv_ref((uv_handle_t*)&h);
    -  ASSERT(uv_has_ref((uv_handle_t*)&h) == 1);
    +  ASSERT_EQ(1, uv_has_ref((uv_handle_t*)&h));
       uv_unref((uv_handle_t*)&h);
    -  ASSERT(uv_has_ref((uv_handle_t*)&h) == 0);
    +  ASSERT_OK(uv_has_ref((uv_handle_t*)&h));
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
     }
    diff --git a/deps/uv/test/test-run-nowait.c b/deps/uv/test/test-run-nowait.c
    index 704105376faeac..89f5f55b18ac47 100644
    --- a/deps/uv/test/test-run-nowait.c
    +++ b/deps/uv/test/test-run-nowait.c
    @@ -27,7 +27,7 @@ static int timer_called = 0;
     
     
     static void timer_cb(uv_timer_t* handle) {
    -  ASSERT(handle == &timer_handle);
    +  ASSERT_PTR_EQ(handle, &timer_handle);
       timer_called = 1;
     }
     
    @@ -38,8 +38,8 @@ TEST_IMPL(run_nowait) {
       uv_timer_start(&timer_handle, timer_cb, 100, 100);
     
       r = uv_run(uv_default_loop(), UV_RUN_NOWAIT);
    -  ASSERT(r != 0);
    -  ASSERT(timer_called == 0);
    +  ASSERT(r);
    +  ASSERT_OK(timer_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-run-once.c b/deps/uv/test/test-run-once.c
    index ee332fa1a057d7..0ae0082c637b31 100644
    --- a/deps/uv/test/test-run-once.c
    +++ b/deps/uv/test/test-run-once.c
    @@ -29,7 +29,7 @@ static int idle_counter;
     
     
     static void idle_cb(uv_idle_t* handle) {
    -  ASSERT(handle == &idle_handle);
    +  ASSERT_PTR_EQ(handle, &idle_handle);
     
       if (++idle_counter == NUM_TICKS)
         uv_idle_stop(handle);
    @@ -41,7 +41,7 @@ TEST_IMPL(run_once) {
       uv_idle_start(&idle_handle, idle_cb);
     
       while (uv_run(uv_default_loop(), UV_RUN_ONCE));
    -  ASSERT(idle_counter == NUM_TICKS);
    +  ASSERT_EQ(idle_counter, NUM_TICKS);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-semaphore.c b/deps/uv/test/test-semaphore.c
    index ac03bb08f17ec7..ad54808d623a9f 100644
    --- a/deps/uv/test/test-semaphore.c
    +++ b/deps/uv/test/test-semaphore.c
    @@ -40,7 +40,7 @@ static void worker(void* arg) {
         uv_sleep(c->delay);
     
       uv_mutex_lock(&c->mutex);
    -  ASSERT(c->posted == 0);
    +  ASSERT_OK(c->posted);
       uv_sem_post(&c->sem);
       c->posted = 1;
       uv_mutex_unlock(&c->mutex);
    @@ -53,17 +53,17 @@ TEST_IMPL(semaphore_1) {
     
       memset(&wc, 0, sizeof(wc));
     
    -  ASSERT(0 == uv_sem_init(&wc.sem, 0));
    -  ASSERT(0 == uv_mutex_init(&wc.mutex));
    -  ASSERT(0 == uv_thread_create(&thread, worker, &wc));
    +  ASSERT_OK(uv_sem_init(&wc.sem, 0));
    +  ASSERT_OK(uv_mutex_init(&wc.mutex));
    +  ASSERT_OK(uv_thread_create(&thread, worker, &wc));
     
       uv_sleep(100);
       uv_mutex_lock(&wc.mutex);
    -  ASSERT(wc.posted == 1);
    +  ASSERT_EQ(1, wc.posted);
       uv_sem_wait(&wc.sem); /* should not block */
       uv_mutex_unlock(&wc.mutex); /* ergo, it should be ok to unlock after wait */
     
    -  ASSERT(0 == uv_thread_join(&thread));
    +  ASSERT_OK(uv_thread_join(&thread));
       uv_mutex_destroy(&wc.mutex);
       uv_sem_destroy(&wc.sem);
     
    @@ -78,13 +78,13 @@ TEST_IMPL(semaphore_2) {
       memset(&wc, 0, sizeof(wc));
       wc.delay = 100;
     
    -  ASSERT(0 == uv_sem_init(&wc.sem, 0));
    -  ASSERT(0 == uv_mutex_init(&wc.mutex));
    -  ASSERT(0 == uv_thread_create(&thread, worker, &wc));
    +  ASSERT_OK(uv_sem_init(&wc.sem, 0));
    +  ASSERT_OK(uv_mutex_init(&wc.mutex));
    +  ASSERT_OK(uv_thread_create(&thread, worker, &wc));
     
       uv_sem_wait(&wc.sem);
     
    -  ASSERT(0 == uv_thread_join(&thread));
    +  ASSERT_OK(uv_thread_join(&thread));
       uv_mutex_destroy(&wc.mutex);
       uv_sem_destroy(&wc.sem);
     
    @@ -95,15 +95,15 @@ TEST_IMPL(semaphore_2) {
     TEST_IMPL(semaphore_3) {
       uv_sem_t sem;
     
    -  ASSERT(0 == uv_sem_init(&sem, 3));
    +  ASSERT_OK(uv_sem_init(&sem, 3));
       uv_sem_wait(&sem); /* should not block */
       uv_sem_wait(&sem); /* should not block */
    -  ASSERT(0 == uv_sem_trywait(&sem));
    -  ASSERT(UV_EAGAIN == uv_sem_trywait(&sem));
    +  ASSERT_OK(uv_sem_trywait(&sem));
    +  ASSERT_EQ(UV_EAGAIN, uv_sem_trywait(&sem));
     
       uv_sem_post(&sem);
    -  ASSERT(0 == uv_sem_trywait(&sem));
    -  ASSERT(UV_EAGAIN == uv_sem_trywait(&sem));
    +  ASSERT_OK(uv_sem_trywait(&sem));
    +  ASSERT_EQ(UV_EAGAIN, uv_sem_trywait(&sem));
     
       uv_sem_destroy(&sem);
     
    diff --git a/deps/uv/test/test-shutdown-close.c b/deps/uv/test/test-shutdown-close.c
    index cb478b5fdd2939..306404afb45c74 100644
    --- a/deps/uv/test/test-shutdown-close.c
    +++ b/deps/uv/test/test-shutdown-close.c
    @@ -37,7 +37,7 @@ static int close_cb_called = 0;
     
     
     static void shutdown_cb(uv_shutdown_t* req, int status) {
    -  ASSERT(req == &shutdown_req);
    +  ASSERT_PTR_EQ(req, &shutdown_req);
       ASSERT(status == 0 || status == UV_ECANCELED);
       shutdown_cb_called++;
     }
    @@ -51,14 +51,14 @@ static void close_cb(uv_handle_t* handle) {
     static void connect_cb(uv_connect_t* req, int status) {
       int r;
     
    -  ASSERT(req == &connect_req);
    -  ASSERT(status == 0);
    +  ASSERT_PTR_EQ(req, &connect_req);
    +  ASSERT_OK(status);
     
       r = uv_shutdown(&shutdown_req, req->handle, shutdown_cb);
    -  ASSERT(r == 0);
    -  ASSERT(0 == uv_is_closing((uv_handle_t*) req->handle));
    +  ASSERT_OK(r);
    +  ASSERT_OK(uv_is_closing((uv_handle_t*) req->handle));
       uv_close((uv_handle_t*) req->handle, close_cb);
    -  ASSERT(1 == uv_is_closing((uv_handle_t*) req->handle));
    +  ASSERT_EQ(1, uv_is_closing((uv_handle_t*) req->handle));
     
       connect_cb_called++;
     }
    @@ -69,20 +69,20 @@ TEST_IMPL(shutdown_close_tcp) {
       uv_tcp_t h;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
       r = uv_tcp_init(uv_default_loop(), &h);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_tcp_connect(&connect_req,
                          &h,
                          (const struct sockaddr*) &addr,
                          connect_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(connect_cb_called == 1);
    -  ASSERT(shutdown_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, connect_cb_called);
    +  ASSERT_EQ(1, shutdown_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -94,14 +94,14 @@ TEST_IMPL(shutdown_close_pipe) {
       int r;
     
       r = uv_pipe_init(uv_default_loop(), &h, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_pipe_connect(&connect_req, &h, TEST_PIPENAME, connect_cb);
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(connect_cb_called == 1);
    -  ASSERT(shutdown_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, connect_cb_called);
    +  ASSERT_EQ(1, shutdown_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-shutdown-eof.c b/deps/uv/test/test-shutdown-eof.c
    index 9c0b85652aef12..6669c29769be35 100644
    --- a/deps/uv/test/test-shutdown-eof.c
    +++ b/deps/uv/test/test-shutdown-eof.c
    @@ -46,7 +46,7 @@ static void alloc_cb(uv_handle_t* handle, size_t size, uv_buf_t* buf) {
     
     
     static void read_cb(uv_stream_t* t, ssize_t nread, const uv_buf_t* buf) {
    -  ASSERT((uv_tcp_t*)t == &tcp);
    +  ASSERT_PTR_EQ((uv_tcp_t*)t, &tcp);
     
       if (nread == 0) {
         free(buf->base);
    @@ -54,14 +54,14 @@ static void read_cb(uv_stream_t* t, ssize_t nread, const uv_buf_t* buf) {
       }
     
       if (!got_q) {
    -    ASSERT(nread == 1);
    +    ASSERT_EQ(1, nread);
         ASSERT(!got_eof);
    -    ASSERT(buf->base[0] == 'Q');
    +    ASSERT_EQ(buf->base[0], 'Q');
         free(buf->base);
         got_q = 1;
         puts("got Q");
       } else {
    -    ASSERT(nread == UV_EOF);
    +    ASSERT_EQ(nread, UV_EOF);
         if (buf->base) {
           free(buf->base);
         }
    @@ -72,24 +72,24 @@ static void read_cb(uv_stream_t* t, ssize_t nread, const uv_buf_t* buf) {
     
     
     static void shutdown_cb(uv_shutdown_t *req, int status) {
    -  ASSERT(req == &shutdown_req);
    +  ASSERT_PTR_EQ(req, &shutdown_req);
     
    -  ASSERT(called_connect_cb == 1);
    +  ASSERT_EQ(1, called_connect_cb);
       ASSERT(!got_eof);
    -  ASSERT(called_tcp_close_cb == 0);
    -  ASSERT(called_timer_close_cb == 0);
    -  ASSERT(called_timer_cb == 0);
    +  ASSERT_OK(called_tcp_close_cb);
    +  ASSERT_OK(called_timer_close_cb);
    +  ASSERT_OK(called_timer_cb);
     
       called_shutdown_cb++;
     }
     
     
     static void connect_cb(uv_connect_t *req, int status) {
    -  ASSERT(status == 0);
    -  ASSERT(req == &connect_req);
    +  ASSERT_OK(status);
    +  ASSERT_PTR_EQ(req, &connect_req);
     
       /* Start reading from our connection so we can receive the EOF.  */
    -  ASSERT_EQ(0, uv_read_start((uv_stream_t*)&tcp, alloc_cb, read_cb));
    +  ASSERT_OK(uv_read_start((uv_stream_t*)&tcp, alloc_cb, read_cb));
     
       /* Check error handling. */
       ASSERT_EQ(UV_EALREADY, uv_read_start((uv_stream_t*)&tcp, alloc_cb, read_cb));
    @@ -107,37 +107,37 @@ static void connect_cb(uv_connect_t *req, int status) {
       uv_shutdown(&shutdown_req, (uv_stream_t*) &tcp, shutdown_cb);
     
       called_connect_cb++;
    -  ASSERT(called_shutdown_cb == 0);
    +  ASSERT_OK(called_shutdown_cb);
     }
     
     
     static void tcp_close_cb(uv_handle_t* handle) {
    -  ASSERT(handle == (uv_handle_t*) &tcp);
    +  ASSERT_PTR_EQ(handle, (uv_handle_t*) &tcp);
     
    -  ASSERT(called_connect_cb == 1);
    +  ASSERT_EQ(1, called_connect_cb);
       ASSERT(got_q);
       ASSERT(got_eof);
    -  ASSERT(called_timer_cb == 1);
    +  ASSERT_EQ(1, called_timer_cb);
     
       called_tcp_close_cb++;
     }
     
     
     static void timer_close_cb(uv_handle_t* handle) {
    -  ASSERT(handle == (uv_handle_t*) &timer);
    +  ASSERT_PTR_EQ(handle, (uv_handle_t*) &timer);
       called_timer_close_cb++;
     }
     
     
     static void timer_cb(uv_timer_t* handle) {
    -  ASSERT(handle == &timer);
    +  ASSERT_PTR_EQ(handle, &timer);
       uv_close((uv_handle_t*) handle, timer_close_cb);
     
       /*
        * The most important assert of the test: we have not received
        * tcp_close_cb yet.
        */
    -  ASSERT(called_tcp_close_cb == 0);
    +  ASSERT_OK(called_tcp_close_cb);
       uv_close((uv_handle_t*) &tcp, tcp_close_cb);
     
       called_timer_cb++;
    @@ -158,11 +158,11 @@ TEST_IMPL(shutdown_eof) {
       qbuf.len = 1;
     
       r = uv_timer_init(uv_default_loop(), &timer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_timer_start(&timer, timer_cb, 100, 0);
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &server_addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &server_addr));
       r = uv_tcp_init(uv_default_loop(), &tcp);
       ASSERT(!r);
     
    @@ -174,13 +174,13 @@ TEST_IMPL(shutdown_eof) {
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(called_connect_cb == 1);
    -  ASSERT(called_shutdown_cb == 1);
    +  ASSERT_EQ(1, called_connect_cb);
    +  ASSERT_EQ(1, called_shutdown_cb);
       ASSERT(got_eof);
       ASSERT(got_q);
    -  ASSERT(called_tcp_close_cb == 1);
    -  ASSERT(called_timer_close_cb == 1);
    -  ASSERT(called_timer_cb == 1);
    +  ASSERT_EQ(1, called_tcp_close_cb);
    +  ASSERT_EQ(1, called_timer_close_cb);
    +  ASSERT_EQ(1, called_timer_cb);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-shutdown-simultaneous.c b/deps/uv/test/test-shutdown-simultaneous.c
    index 14cc443730d565..0dd8e353c860f9 100644
    --- a/deps/uv/test/test-shutdown-simultaneous.c
    +++ b/deps/uv/test/test-shutdown-simultaneous.c
    @@ -44,8 +44,8 @@ static void alloc_cb(uv_handle_t* handle, size_t size, uv_buf_t* buf) {
     static void shutdown_cb(uv_shutdown_t *req, int status) {
       ASSERT_PTR_EQ(req, &shutdown_req);
     
    -  ASSERT_EQ(called_connect_cb, 1);
    -  ASSERT_EQ(called_tcp_close_cb, 0);
    +  ASSERT_EQ(1, called_connect_cb);
    +  ASSERT_OK(called_tcp_close_cb);
     }
     
     
    @@ -58,8 +58,8 @@ static void read_cb(uv_stream_t* t, ssize_t nread, const uv_buf_t* buf) {
       }
     
       if (!got_q) {
    -    ASSERT_EQ(nread, 4);
    -    ASSERT_EQ(got_eof, 0);
    +    ASSERT_EQ(4, nread);
    +    ASSERT_OK(got_eof);
         ASSERT_MEM_EQ(buf->base, "QQSS", 4);
         free(buf->base);
         got_q = 1;
    @@ -79,11 +79,11 @@ static void read_cb(uv_stream_t* t, ssize_t nread, const uv_buf_t* buf) {
     
     
     static void connect_cb(uv_connect_t *req, int status) {
    -  ASSERT_EQ(status, 0);
    +  ASSERT_OK(status);
       ASSERT_PTR_EQ(req, &connect_req);
     
       /* Start reading from our connection so we can receive the EOF.  */
    -  ASSERT_EQ(0, uv_read_start((uv_stream_t*)&tcp, alloc_cb, read_cb));
    +  ASSERT_OK(uv_read_start((uv_stream_t*)&tcp, alloc_cb, read_cb));
     
       /* Check error handling. */
       ASSERT_EQ(UV_EALREADY, uv_read_start((uv_stream_t*)&tcp, alloc_cb, read_cb));
    @@ -98,7 +98,7 @@ static void connect_cb(uv_connect_t *req, int status) {
       ASSERT_EQ(qbuf.len, uv_try_write((uv_stream_t*) &tcp, &qbuf, 1));
     
       called_connect_cb++;
    -  ASSERT_EQ(called_shutdown_cb, 0);
    +  ASSERT_OK(called_shutdown_cb);
     }
     
     
    @@ -113,22 +113,22 @@ TEST_IMPL(shutdown_simultaneous) {
       qbuf.base = "QQSS";
       qbuf.len = 4;
     
    -  ASSERT_EQ(0, uv_ip4_addr("127.0.0.1", TEST_PORT, &server_addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &server_addr));
       r = uv_tcp_init(uv_default_loop(), &tcp);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_connect(&connect_req,
                          &tcp,
                          (const struct sockaddr*) &server_addr,
                          connect_cb);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT_EQ(called_connect_cb, 1);
    -  ASSERT_EQ(called_shutdown_cb, 1);
    -  ASSERT_EQ(got_eof, 1);
    -  ASSERT_EQ(got_q, 1);
    +  ASSERT_EQ(1, called_connect_cb);
    +  ASSERT_EQ(1, called_shutdown_cb);
    +  ASSERT_EQ(1, got_eof);
    +  ASSERT_EQ(1, got_q);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-shutdown-twice.c b/deps/uv/test/test-shutdown-twice.c
    index d936a70cb7d7bb..c21a98340bd910 100644
    --- a/deps/uv/test/test-shutdown-twice.c
    +++ b/deps/uv/test/test-shutdown-twice.c
    @@ -37,8 +37,8 @@ static void close_cb(uv_handle_t* handle) {
     }
     
     static void shutdown_cb(uv_shutdown_t* req, int status) {
    -  ASSERT(req == &req1);
    -  ASSERT(status == 0);
    +  ASSERT_PTR_EQ(req, &req1);
    +  ASSERT_OK(status);
       shutdown_cb_called++;
       uv_close((uv_handle_t*) req->handle, close_cb);
     }
    @@ -46,12 +46,12 @@ static void shutdown_cb(uv_shutdown_t* req, int status) {
     static void connect_cb(uv_connect_t* req, int status) {
       int r;
     
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
       r = uv_shutdown(&req1, req->handle, shutdown_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_shutdown(&req2, req->handle, shutdown_cb);
    -  ASSERT(r != 0);
    +  ASSERT(r);
     
     }
     
    @@ -63,22 +63,22 @@ TEST_IMPL(shutdown_twice) {
     
       uv_connect_t connect_req;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
       loop = uv_default_loop();
     
       r = uv_tcp_init(loop, &h);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_connect(&connect_req,
                          &h,
                          (const struct sockaddr*) &addr,
                          connect_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(shutdown_cb_called == 1);
    +  ASSERT_EQ(1, shutdown_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-signal-multiple-loops.c b/deps/uv/test/test-signal-multiple-loops.c
    index de511fc06804ef..e68eabf6fc2857 100644
    --- a/deps/uv/test/test-signal-multiple-loops.c
    +++ b/deps/uv/test/test-signal-multiple-loops.c
    @@ -66,14 +66,14 @@ static void increment_counter(int* counter) {
     
     
     static void signal1_cb(uv_signal_t* handle, int signum) {
    -  ASSERT(signum == SIGUSR1);
    +  ASSERT_EQ(signum, SIGUSR1);
       increment_counter(&signal1_cb_counter);
       uv_signal_stop(handle);
     }
     
     
     static void signal2_cb(uv_signal_t* handle, int signum) {
    -  ASSERT(signum == SIGUSR2);
    +  ASSERT_EQ(signum, SIGUSR2);
       increment_counter(&signal2_cb_counter);
       uv_signal_stop(handle);
     }
    @@ -89,25 +89,25 @@ static void signal_handling_worker(void* context) {
     
       action = (enum signal_action) (uintptr_t) context;
     
    -  ASSERT(0 == uv_loop_init(&loop));
    +  ASSERT_OK(uv_loop_init(&loop));
     
       /* Setup the signal watchers and start them. */
       if (action == ONLY_SIGUSR1 || action == SIGUSR1_AND_SIGUSR2) {
         r = uv_signal_init(&loop, &signal1a);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         r = uv_signal_start(&signal1a, signal1_cb, SIGUSR1);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         r = uv_signal_init(&loop, &signal1b);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         r = uv_signal_start(&signal1b, signal1_cb, SIGUSR1);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     
       if (action == ONLY_SIGUSR2 || action == SIGUSR1_AND_SIGUSR2) {
         r = uv_signal_init(&loop, &signal2);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         r = uv_signal_start(&signal2, signal2_cb, SIGUSR2);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     
       /* Signal watchers are now set up. */
    @@ -117,26 +117,26 @@ static void signal_handling_worker(void* context) {
        * will return when all signal watchers caught a signal.
        */
       r = uv_run(&loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Restart the signal watchers. */
       if (action == ONLY_SIGUSR1 || action == SIGUSR1_AND_SIGUSR2) {
         r = uv_signal_start(&signal1a, signal1_cb, SIGUSR1);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         r = uv_signal_start(&signal1b, signal1_cb, SIGUSR1);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     
       if (action == ONLY_SIGUSR2 || action == SIGUSR1_AND_SIGUSR2) {
         r = uv_signal_start(&signal2, signal2_cb, SIGUSR2);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     
       /* Wait for signals once more. */
       uv_sem_post(&sem);
     
       r = uv_run(&loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Close the watchers. */
       if (action == ONLY_SIGUSR1 || action == SIGUSR1_AND_SIGUSR2) {
    @@ -150,7 +150,7 @@ static void signal_handling_worker(void* context) {
     
       /* Wait for the signal watchers to close. */
       r = uv_run(&loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_loop_close(&loop);
     }
    @@ -173,18 +173,18 @@ static void loop_creating_worker(void* context) {
     
         loop = malloc(sizeof(*loop));
         ASSERT_NOT_NULL(loop);
    -    ASSERT(0 == uv_loop_init(loop));
    +    ASSERT_OK(uv_loop_init(loop));
     
         r = uv_signal_init(loop, &signal);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
         r = uv_signal_start(&signal, signal_unexpected_cb, SIGTERM);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
         uv_close((uv_handle_t*) &signal, NULL);
     
         r = uv_run(loop, UV_RUN_DEFAULT);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
         uv_loop_close(loop);
         free(loop);
    @@ -229,17 +229,17 @@ TEST_IMPL(signal_multiple_loops) {
       int r;
     
       r = uv_sem_init(&sem, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_mutex_init(&lock);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Create a couple of threads that create a destroy loops continuously. */
       for (i = 0; i < NUM_LOOP_CREATING_THREADS; i++) {
         r = uv_thread_create(&loop_creating_threads[i],
                              loop_creating_worker,
                              NULL);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     
       /* Create a couple of threads that actually handle signals. */
    @@ -253,7 +253,7 @@ TEST_IMPL(signal_multiple_loops) {
         r = uv_thread_create(&signal_handling_threads[i],
                              signal_handling_worker,
                              (void*) (uintptr_t) action);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     
       /* Wait until all threads have started and set up their signal watchers. */
    @@ -261,9 +261,9 @@ TEST_IMPL(signal_multiple_loops) {
         uv_sem_wait(&sem);
     
       r = kill(getpid(), SIGUSR1);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = kill(getpid(), SIGUSR2);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Wait for all threads to handle these signals. */
       for (i = 0; i < NUM_SIGNAL_HANDLING_THREADS; i++)
    @@ -277,14 +277,14 @@ TEST_IMPL(signal_multiple_loops) {
       pthread_sigmask(SIG_SETMASK, &sigset, NULL);
     
       r = kill(getpid(), SIGUSR1);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = kill(getpid(), SIGUSR2);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Wait for all signal handling threads to exit. */
       for (i = 0; i < NUM_SIGNAL_HANDLING_THREADS; i++) {
         r = uv_thread_join(&signal_handling_threads[i]);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     
       /* Tell all loop creating threads to stop. */
    @@ -295,7 +295,7 @@ TEST_IMPL(signal_multiple_loops) {
       /* Wait for all loop creating threads to exit. */
       for (i = 0; i < NUM_LOOP_CREATING_THREADS; i++) {
         r = uv_thread_join(&loop_creating_threads[i]);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     
       uv_sem_destroy(&sem);
    @@ -306,13 +306,13 @@ TEST_IMPL(signal_multiple_loops) {
       /* The division by three reflects the fact that we spawn three different
        * thread groups of (NUM_SIGNAL_HANDLING_THREADS / 3) threads each.
        */
    -  ASSERT(signal1_cb_counter == 8 * (NUM_SIGNAL_HANDLING_THREADS / 3));
    -  ASSERT(signal2_cb_counter == 4 * (NUM_SIGNAL_HANDLING_THREADS / 3));
    +  ASSERT_EQ(signal1_cb_counter, 8 * (NUM_SIGNAL_HANDLING_THREADS / 3));
    +  ASSERT_EQ(signal2_cb_counter, 4 * (NUM_SIGNAL_HANDLING_THREADS / 3));
     
       /* We don't know exactly how much loops will be created and destroyed, but at
        * least there should be 1 for every loop creating thread.
        */
    -  ASSERT(loop_creation_counter >= NUM_LOOP_CREATING_THREADS);
    +  ASSERT_GE(loop_creation_counter, NUM_LOOP_CREATING_THREADS);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-signal-pending-on-close.c b/deps/uv/test/test-signal-pending-on-close.c
    index e0b9bc300b159e..42a4296704bab5 100644
    --- a/deps/uv/test/test-signal-pending-on-close.c
    +++ b/deps/uv/test/test-signal-pending-on-close.c
    @@ -35,7 +35,7 @@ static int close_cb_called;
     
     
     static void stop_loop_cb(uv_signal_t* signal, int signum) {
    -  ASSERT(signum == SIGPIPE);
    +  ASSERT_EQ(signum, SIGPIPE);
       uv_stop(signal->loop);
     }
     
    @@ -50,7 +50,7 @@ static void close_cb(uv_handle_t *handle) {
     
     static void write_cb(uv_write_t* req, int status) {
       ASSERT_NOT_NULL(req);
    -  ASSERT(status == UV_EPIPE);
    +  ASSERT_EQ(status, UV_EPIPE);
       free(buf);
       uv_close((uv_handle_t *) &pipe_hdl, close_cb);
       uv_close((uv_handle_t *) &signal_hdl, close_cb);
    @@ -62,17 +62,17 @@ TEST_IMPL(signal_pending_on_close) {
       uv_buf_t buffer;
       int r;
     
    -  ASSERT(0 == uv_loop_init(&loop));
    +  ASSERT_OK(uv_loop_init(&loop));
     
    -  ASSERT(0 == uv_signal_init(&loop, &signal_hdl));
    +  ASSERT_OK(uv_signal_init(&loop, &signal_hdl));
     
    -  ASSERT(0 == uv_signal_start(&signal_hdl, signal_cb, SIGPIPE));
    +  ASSERT_OK(uv_signal_start(&signal_hdl, signal_cb, SIGPIPE));
     
    -  ASSERT(0 == pipe(pipefds));
    +  ASSERT_OK(pipe(pipefds));
     
    -  ASSERT(0 == uv_pipe_init(&loop, &pipe_hdl, 0));
    +  ASSERT_OK(uv_pipe_init(&loop, &pipe_hdl, 0));
     
    -  ASSERT(0 == uv_pipe_open(&pipe_hdl, pipefds[1]));
    +  ASSERT_OK(uv_pipe_open(&pipe_hdl, pipefds[1]));
     
       /* Write data large enough so it needs loop iteration */
       buf = malloc(1<<24);
    @@ -81,14 +81,14 @@ TEST_IMPL(signal_pending_on_close) {
       buffer = uv_buf_init(buf, 1<<24);
     
       r = uv_write(&write_req, (uv_stream_t *) &pipe_hdl, &buffer, 1, write_cb);
    -  ASSERT(0 == r);
    +  ASSERT_OK(r);
     
       /* cause a SIGPIPE on write in next iteration */
       close(pipefds[0]);
     
    -  ASSERT(0 == uv_run(&loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(&loop, UV_RUN_DEFAULT));
     
    -  ASSERT(2 == close_cb_called);
    +  ASSERT_EQ(2, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(&loop);
       return 0;
    @@ -96,18 +96,18 @@ TEST_IMPL(signal_pending_on_close) {
     
     
     TEST_IMPL(signal_close_loop_alive) {
    -  ASSERT(0 == uv_loop_init(&loop));
    -  ASSERT(0 == uv_signal_init(&loop, &signal_hdl));
    -  ASSERT(0 == uv_signal_start(&signal_hdl, stop_loop_cb, SIGPIPE));
    +  ASSERT_OK(uv_loop_init(&loop));
    +  ASSERT_OK(uv_signal_init(&loop, &signal_hdl));
    +  ASSERT_OK(uv_signal_start(&signal_hdl, stop_loop_cb, SIGPIPE));
       uv_unref((uv_handle_t*) &signal_hdl);
     
    -  ASSERT(0 == uv_kill(uv_os_getpid(), SIGPIPE));
    -  ASSERT(0 == uv_run(&loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_kill(uv_os_getpid(), SIGPIPE));
    +  ASSERT_OK(uv_run(&loop, UV_RUN_DEFAULT));
       uv_close((uv_handle_t*) &signal_hdl, close_cb);
    -  ASSERT(1 == uv_loop_alive(&loop));
    +  ASSERT_EQ(1, uv_loop_alive(&loop));
     
    -  ASSERT(0 == uv_run(&loop, UV_RUN_DEFAULT));
    -  ASSERT(1 == close_cb_called);
    +  ASSERT_OK(uv_run(&loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(&loop);
       return 0;
    diff --git a/deps/uv/test/test-signal.c b/deps/uv/test/test-signal.c
    index f8222d14b4e71f..b1e24bb01a10e2 100644
    --- a/deps/uv/test/test-signal.c
    +++ b/deps/uv/test/test-signal.c
    @@ -31,12 +31,12 @@ TEST_IMPL(kill_invalid_signum) {
     
       pid = uv_os_getpid();
     
    -  ASSERT(uv_kill(pid, -1) == UV_EINVAL);
    +  ASSERT_EQ(uv_kill(pid, -1), UV_EINVAL);
     #ifdef _WIN32
       /* NSIG is not available on all platforms. */
    -  ASSERT(uv_kill(pid, NSIG) == UV_EINVAL);
    +  ASSERT_EQ(uv_kill(pid, NSIG), UV_EINVAL);
     #endif
    -  ASSERT(uv_kill(pid, 4096) == UV_EINVAL);
    +  ASSERT_EQ(uv_kill(pid, 4096), UV_EINVAL);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -55,20 +55,20 @@ TEST_IMPL(win32_signum_number) {
       loop = uv_default_loop();
       uv_signal_init(loop, &signal);
     
    -  ASSERT(uv_signal_start(&signal, signum_test_cb, 0) == UV_EINVAL);
    -  ASSERT(uv_signal_start(&signal, signum_test_cb, SIGINT) == 0);
    -  ASSERT(uv_signal_start(&signal, signum_test_cb, SIGBREAK) == 0);
    -  ASSERT(uv_signal_start(&signal, signum_test_cb, SIGHUP) == 0);
    -  ASSERT(uv_signal_start(&signal, signum_test_cb, SIGWINCH) == 0);
    -  ASSERT(uv_signal_start(&signal, signum_test_cb, SIGILL) == 0);
    -  ASSERT(uv_signal_start(&signal, signum_test_cb, SIGABRT_COMPAT) == 0);
    -  ASSERT(uv_signal_start(&signal, signum_test_cb, SIGFPE) == 0);
    -  ASSERT(uv_signal_start(&signal, signum_test_cb, SIGSEGV) == 0);
    -  ASSERT(uv_signal_start(&signal, signum_test_cb, SIGTERM) == 0);
    -  ASSERT(uv_signal_start(&signal, signum_test_cb, SIGABRT) == 0);
    -  ASSERT(uv_signal_start(&signal, signum_test_cb, -1) == UV_EINVAL);
    -  ASSERT(uv_signal_start(&signal, signum_test_cb, NSIG) == UV_EINVAL);
    -  ASSERT(uv_signal_start(&signal, signum_test_cb, 1024) == UV_EINVAL);
    +  ASSERT_EQ(uv_signal_start(&signal, signum_test_cb, 0), UV_EINVAL);
    +  ASSERT_OK(uv_signal_start(&signal, signum_test_cb, SIGINT));
    +  ASSERT_OK(uv_signal_start(&signal, signum_test_cb, SIGBREAK));
    +  ASSERT_OK(uv_signal_start(&signal, signum_test_cb, SIGHUP));
    +  ASSERT_OK(uv_signal_start(&signal, signum_test_cb, SIGWINCH));
    +  ASSERT_OK(uv_signal_start(&signal, signum_test_cb, SIGILL));
    +  ASSERT_OK(uv_signal_start(&signal, signum_test_cb, SIGABRT_COMPAT));
    +  ASSERT_OK(uv_signal_start(&signal, signum_test_cb, SIGFPE));
    +  ASSERT_OK(uv_signal_start(&signal, signum_test_cb, SIGSEGV));
    +  ASSERT_OK(uv_signal_start(&signal, signum_test_cb, SIGTERM));
    +  ASSERT_OK(uv_signal_start(&signal, signum_test_cb, SIGABRT));
    +  ASSERT_EQ(uv_signal_start(&signal, signum_test_cb, -1), UV_EINVAL);
    +  ASSERT_EQ(uv_signal_start(&signal, signum_test_cb, NSIG), UV_EINVAL);
    +  ASSERT_EQ(uv_signal_start(&signal, signum_test_cb, 1024), UV_EINVAL);
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
     }
    @@ -100,7 +100,7 @@ struct signal_ctx {
     
     static void signal_cb(uv_signal_t* handle, int signum) {
       struct signal_ctx* ctx = container_of(handle, struct signal_ctx, handle);
    -  ASSERT(signum == ctx->signum);
    +  ASSERT_EQ(signum, ctx->signum);
       if (++ctx->ncalls == NSIGNALS) {
         if (ctx->stop_or_close == STOP)
           uv_signal_stop(handle);
    @@ -113,8 +113,8 @@ static void signal_cb(uv_signal_t* handle, int signum) {
     
     static void signal_cb_one_shot(uv_signal_t* handle, int signum) {
       struct signal_ctx* ctx = container_of(handle, struct signal_ctx, handle);
    -  ASSERT(signum == ctx->signum);
    -  ASSERT(++ctx->ncalls == 1);
    +  ASSERT_EQ(signum, ctx->signum);
    +  ASSERT_EQ(1, ++ctx->ncalls);
       if (ctx->stop_or_close == CLOSE)
         uv_close((uv_handle_t*)handle, NULL);
     }
    @@ -138,18 +138,18 @@ static void start_watcher(uv_loop_t* loop,
       ctx->signum = signum;
       ctx->stop_or_close = CLOSE;
       ctx->one_shot = one_shot;
    -  ASSERT(0 == uv_signal_init(loop, &ctx->handle));
    +  ASSERT_OK(uv_signal_init(loop, &ctx->handle));
       if (one_shot)
    -    ASSERT(0 == uv_signal_start_oneshot(&ctx->handle, signal_cb_one_shot, signum));
    +    ASSERT_OK(uv_signal_start_oneshot(&ctx->handle, signal_cb_one_shot, signum));
       else
    -    ASSERT(0 == uv_signal_start(&ctx->handle, signal_cb, signum));
    +    ASSERT_OK(uv_signal_start(&ctx->handle, signal_cb, signum));
     }
     
     static void start_timer(uv_loop_t* loop, int signum, struct timer_ctx* ctx) {
       ctx->ncalls = 0;
       ctx->signum = signum;
    -  ASSERT(0 == uv_timer_init(loop, &ctx->handle));
    -  ASSERT(0 == uv_timer_start(&ctx->handle, timer_cb, 5, 5));
    +  ASSERT_OK(uv_timer_init(loop, &ctx->handle));
    +  ASSERT_OK(uv_timer_start(&ctx->handle, timer_cb, 5, 5));
     }
     
     
    @@ -162,23 +162,23 @@ TEST_IMPL(we_get_signal) {
       start_timer(loop, SIGCHLD, &tc);
       start_watcher(loop, SIGCHLD, &sc, 0);
       sc.stop_or_close = STOP; /* stop, don't close the signal handle */
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -  ASSERT(tc.ncalls == NSIGNALS);
    -  ASSERT(sc.ncalls == NSIGNALS);
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(tc.ncalls, NSIGNALS);
    +  ASSERT_EQ(sc.ncalls, NSIGNALS);
     
       start_timer(loop, SIGCHLD, &tc);
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -  ASSERT(tc.ncalls == NSIGNALS);
    -  ASSERT(sc.ncalls == NSIGNALS);
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(tc.ncalls, NSIGNALS);
    +  ASSERT_EQ(sc.ncalls, NSIGNALS);
     
       sc.ncalls = 0;
       sc.stop_or_close = CLOSE; /* now close it when it's done */
       uv_signal_start(&sc.handle, signal_cb, SIGCHLD);
     
       start_timer(loop, SIGCHLD, &tc);
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -  ASSERT(tc.ncalls == NSIGNALS);
    -  ASSERT(sc.ncalls == NSIGNALS);
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(tc.ncalls, NSIGNALS);
    +  ASSERT_EQ(sc.ncalls, NSIGNALS);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -198,13 +198,13 @@ TEST_IMPL(we_get_signals) {
       start_watcher(loop, SIGUSR2, sc + 3, 0);
       start_timer(loop, SIGUSR1, tc + 0);
       start_timer(loop, SIGUSR2, tc + 1);
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
     
       for (i = 0; i < ARRAY_SIZE(sc); i++)
    -    ASSERT(sc[i].ncalls == NSIGNALS);
    +    ASSERT_EQ(sc[i].ncalls, NSIGNALS);
     
       for (i = 0; i < ARRAY_SIZE(tc); i++)
    -    ASSERT(tc[i].ncalls == NSIGNALS);
    +    ASSERT_EQ(tc[i].ncalls, NSIGNALS);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -219,21 +219,21 @@ TEST_IMPL(we_get_signal_one_shot) {
       start_timer(loop, SIGCHLD, &tc);
       start_watcher(loop, SIGCHLD, &sc, 1);
       sc.stop_or_close = NOOP;
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -  ASSERT(tc.ncalls == NSIGNALS);
    -  ASSERT(sc.ncalls == 1);
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(tc.ncalls, NSIGNALS);
    +  ASSERT_EQ(1, sc.ncalls);
     
       start_timer(loop, SIGCHLD, &tc);
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -  ASSERT(sc.ncalls == 1);
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(1, sc.ncalls);
     
       sc.ncalls = 0;
       sc.stop_or_close = CLOSE; /* now close it when it's done */
       uv_signal_start_oneshot(&sc.handle, signal_cb_one_shot, SIGCHLD);
       start_timer(loop, SIGCHLD, &tc);
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -  ASSERT(tc.ncalls == NSIGNALS);
    -  ASSERT(sc.ncalls == 1);
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(tc.ncalls, NSIGNALS);
    +  ASSERT_EQ(1, sc.ncalls);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -252,10 +252,10 @@ TEST_IMPL(we_get_signals_mixed) {
       start_watcher(loop, SIGCHLD, sc + 1, 1);
       sc[0].stop_or_close = CLOSE;
       sc[1].stop_or_close = CLOSE;
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -  ASSERT(tc.ncalls == NSIGNALS);
    -  ASSERT(sc[0].ncalls == 1);
    -  ASSERT(sc[1].ncalls == 1);
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(tc.ncalls, NSIGNALS);
    +  ASSERT_EQ(1, sc[0].ncalls);
    +  ASSERT_EQ(1, sc[1].ncalls);
     
       /* 2 one-shot, 1 normal then remove normal */
       start_timer(loop, SIGCHLD, &tc);
    @@ -265,11 +265,11 @@ TEST_IMPL(we_get_signals_mixed) {
       sc[1].stop_or_close = CLOSE;
       start_watcher(loop, SIGCHLD, sc + 2, 0);
       uv_close((uv_handle_t*)&(sc[2]).handle, NULL);
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -  ASSERT(tc.ncalls == NSIGNALS);
    -  ASSERT(sc[0].ncalls == 1);
    -  ASSERT(sc[1].ncalls == 1);
    -  ASSERT(sc[2].ncalls == 0);
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(tc.ncalls, NSIGNALS);
    +  ASSERT_EQ(1, sc[0].ncalls);
    +  ASSERT_EQ(1, sc[1].ncalls);
    +  ASSERT_OK(sc[2].ncalls);
     
       /* 2 normal, 1 one-shot then remove one-shot */
       start_timer(loop, SIGCHLD, &tc);
    @@ -279,11 +279,11 @@ TEST_IMPL(we_get_signals_mixed) {
       sc[1].stop_or_close = CLOSE;
       start_watcher(loop, SIGCHLD, sc + 2, 1);
       uv_close((uv_handle_t*)&(sc[2]).handle, NULL);
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -  ASSERT(tc.ncalls == NSIGNALS);
    -  ASSERT(sc[0].ncalls == NSIGNALS);
    -  ASSERT(sc[1].ncalls == NSIGNALS);
    -  ASSERT(sc[2].ncalls == 0);
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(tc.ncalls, NSIGNALS);
    +  ASSERT_EQ(sc[0].ncalls, NSIGNALS);
    +  ASSERT_EQ(sc[1].ncalls, NSIGNALS);
    +  ASSERT_OK(sc[2].ncalls);
     
       /* 2 normal, 2 one-shot then remove 2 normal */
       start_timer(loop, SIGCHLD, &tc);
    @@ -295,12 +295,12 @@ TEST_IMPL(we_get_signals_mixed) {
       sc[3].stop_or_close = CLOSE;
       uv_close((uv_handle_t*)&(sc[0]).handle, NULL);
       uv_close((uv_handle_t*)&(sc[1]).handle, NULL);
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -  ASSERT(tc.ncalls == NSIGNALS);
    -  ASSERT(sc[0].ncalls == 0);
    -  ASSERT(sc[1].ncalls == 0);
    -  ASSERT(sc[2].ncalls == 1);
    -  ASSERT(sc[2].ncalls == 1);
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(tc.ncalls, NSIGNALS);
    +  ASSERT_OK(sc[0].ncalls);
    +  ASSERT_OK(sc[1].ncalls);
    +  ASSERT_EQ(1, sc[2].ncalls);
    +  ASSERT_EQ(1, sc[2].ncalls);
     
       /* 1 normal, 1 one-shot, 2 normal then remove 1st normal, 2nd normal */
       start_timer(loop, SIGCHLD, &tc);
    @@ -311,12 +311,12 @@ TEST_IMPL(we_get_signals_mixed) {
       sc[3].stop_or_close = CLOSE;
       uv_close((uv_handle_t*)&(sc[0]).handle, NULL);
       uv_close((uv_handle_t*)&(sc[2]).handle, NULL);
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -  ASSERT(tc.ncalls == NSIGNALS);
    -  ASSERT(sc[0].ncalls == 0);
    -  ASSERT(sc[1].ncalls == 1);
    -  ASSERT(sc[2].ncalls == 0);
    -  ASSERT(sc[3].ncalls == NSIGNALS);
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(tc.ncalls, NSIGNALS);
    +  ASSERT_OK(sc[0].ncalls);
    +  ASSERT_EQ(1, sc[1].ncalls);
    +  ASSERT_OK(sc[2].ncalls);
    +  ASSERT_EQ(sc[3].ncalls, NSIGNALS);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-socket-buffer-size.c b/deps/uv/test/test-socket-buffer-size.c
    index 5f072cb02be252..64904e93d5060f 100644
    --- a/deps/uv/test/test-socket-buffer-size.c
    +++ b/deps/uv/test/test-socket-buffer-size.c
    @@ -40,14 +40,14 @@ static void check_buffer_size(uv_handle_t* handle) {
       int value;
     
       value = 0;
    -  ASSERT(0 == uv_recv_buffer_size(handle, &value));
    -  ASSERT(value > 0);
    +  ASSERT_OK(uv_recv_buffer_size(handle, &value));
    +  ASSERT_GT(value, 0);
     
       value = 10000;
    -  ASSERT(0 == uv_recv_buffer_size(handle, &value));
    +  ASSERT_OK(uv_recv_buffer_size(handle, &value));
     
       value = 0;
    -  ASSERT(0 == uv_recv_buffer_size(handle, &value));
    +  ASSERT_OK(uv_recv_buffer_size(handle, &value));
       /* linux sets double the value */
       ASSERT(value == 10000 || value == 20000);
     }
    @@ -56,21 +56,21 @@ static void check_buffer_size(uv_handle_t* handle) {
     TEST_IMPL(socket_buffer_size) {
       struct sockaddr_in addr;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
    -  ASSERT(0 == uv_tcp_init(uv_default_loop(), &tcp));
    -  ASSERT(0 == uv_tcp_bind(&tcp, (struct sockaddr*) &addr, 0));
    +  ASSERT_OK(uv_tcp_init(uv_default_loop(), &tcp));
    +  ASSERT_OK(uv_tcp_bind(&tcp, (struct sockaddr*) &addr, 0));
       check_buffer_size((uv_handle_t*) &tcp);
       uv_close((uv_handle_t*) &tcp, close_cb);
     
    -  ASSERT(0 == uv_udp_init(uv_default_loop(), &udp));
    -  ASSERT(0 == uv_udp_bind(&udp, (struct sockaddr*) &addr, 0));
    +  ASSERT_OK(uv_udp_init(uv_default_loop(), &udp));
    +  ASSERT_OK(uv_udp_bind(&udp, (struct sockaddr*) &addr, 0));
       check_buffer_size((uv_handle_t*) &udp);
       uv_close((uv_handle_t*) &udp, close_cb);
     
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
    -  ASSERT(close_cb_called == 2);
    +  ASSERT_EQ(2, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-spawn.c b/deps/uv/test/test-spawn.c
    index 5e84dcdbb11de7..bbb7cb498bacf2 100644
    --- a/deps/uv/test/test-spawn.c
    +++ b/deps/uv/test/test-spawn.c
    @@ -65,8 +65,8 @@ static void exit_cb(uv_process_t* process,
                         int term_signal) {
       printf("exit_cb\n");
       exit_cb_called++;
    -  ASSERT(exit_status == 1);
    -  ASSERT(term_signal == 0);
    +  ASSERT_EQ(1, exit_status);
    +  ASSERT_OK(term_signal);
       uv_close((uv_handle_t*) process, close_cb);
     }
     
    @@ -86,9 +86,9 @@ static void kill_cb(uv_process_t* process,
       printf("exit_cb\n");
       exit_cb_called++;
     #ifdef _WIN32
    -  ASSERT(exit_status == 1);
    +  ASSERT_EQ(1, exit_status);
     #else
    -  ASSERT(exit_status == 0);
    +  ASSERT_OK(exit_status);
     #endif
     #if defined(__APPLE__) || defined(__MVS__)
       /*
    @@ -108,7 +108,7 @@ static void kill_cb(uv_process_t* process,
        * This process should be dead.
        */
       err = uv_kill(process->pid, 0);
    -  ASSERT(err == UV_ESRCH);
    +  ASSERT_EQ(err, UV_ESRCH);
     }
     
     static void detach_failure_cb(uv_process_t* process,
    @@ -130,7 +130,7 @@ static void on_read(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf) {
       if (nread > 0) {
         output_used += nread;
       } else if (nread < 0) {
    -    ASSERT(nread == UV_EOF);
    +    ASSERT_EQ(nread, UV_EOF);
         uv_close((uv_handle_t*) tcp, close_cb);
       }
     }
    @@ -143,20 +143,20 @@ static void on_read_once(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf) {
     
     
     static void write_cb(uv_write_t* req, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       uv_close((uv_handle_t*) req->handle, close_cb);
     }
     
     
     static void write_null_cb(uv_write_t* req, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     }
     
     
     static void init_process_options(char* test, uv_exit_cb exit_cb) {
       /* Note spawn_helper1 defined in test/run-tests.c */
       int r = uv_exepath(exepath, &exepath_size);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       exepath[exepath_size] = '\0';
       args[0] = exepath;
       args[1] = test;
    @@ -189,9 +189,9 @@ TEST_IMPL(spawn_fails) {
     
       r = uv_spawn(uv_default_loop(), &process, &options);
       ASSERT(r == UV_ENOENT || r == UV_EACCES);
    -  ASSERT(0 == uv_is_active((uv_handle_t*) &process));
    +  ASSERT_OK(uv_is_active((uv_handle_t*) &process));
       uv_close((uv_handle_t*) &process, NULL);
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -209,19 +209,19 @@ TEST_IMPL(spawn_fails_check_for_waitpid_cleanup) {
     
       r = uv_spawn(uv_default_loop(), &process, &options);
       ASSERT(r == UV_ENOENT || r == UV_EACCES);
    -  ASSERT(0 == uv_is_active((uv_handle_t*) &process));
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_is_active((uv_handle_t*) &process));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
       /* verify the child is successfully cleaned up within libuv */
       do
         err = waitpid(process.pid, &status, 0);
       while (err == -1 && errno == EINTR);
     
    -  ASSERT(err == -1);
    -  ASSERT(errno == ECHILD);
    +  ASSERT_EQ(err, -1);
    +  ASSERT_EQ(errno, ECHILD);
     
       uv_close((uv_handle_t*) &process, NULL);
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -247,11 +247,11 @@ TEST_IMPL(spawn_empty_env) {
       options.env = env;
       env[0] = NULL;
     
    -  ASSERT(0 == uv_spawn(uv_default_loop(), &process, &options));
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_spawn(uv_default_loop(), &process, &options));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -264,13 +264,13 @@ TEST_IMPL(spawn_exit_code) {
       init_process_options("spawn_helper1", exit_cb);
     
       r = uv_spawn(uv_default_loop(), &process, &options);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -292,18 +292,18 @@ TEST_IMPL(spawn_stdout) {
       options.stdio_count = 2;
     
       r = uv_spawn(uv_default_loop(), &process, &options);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_read_start((uv_stream_t*) &out, on_alloc, on_read);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(close_cb_called == 2); /* Once for process once for the pipe. */
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(2, close_cb_called); /* Once for process once for the pipe. */
       printf("output is: %s", output);
    -  ASSERT(strcmp("hello world\n", output) == 0);
    +  ASSERT_OK(strcmp("hello world\n", output));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -324,7 +324,7 @@ TEST_IMPL(spawn_stdout_to_file) {
     
       r = uv_fs_open(NULL, &fs_req, "stdout_file", O_CREAT | O_RDWR,
           S_IRUSR | S_IWUSR, NULL);
    -  ASSERT(r != -1);
    +  ASSERT_NE(r, -1);
       uv_fs_req_cleanup(&fs_req);
     
       file = r;
    @@ -336,25 +336,25 @@ TEST_IMPL(spawn_stdout_to_file) {
       options.stdio_count = 2;
     
       r = uv_spawn(uv_default_loop(), &process, &options);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       buf = uv_buf_init(output, sizeof(output));
       r = uv_fs_read(NULL, &fs_req, file, &buf, 1, 0, NULL);
    -  ASSERT(r == 12);
    +  ASSERT_EQ(12, r);
       uv_fs_req_cleanup(&fs_req);
     
       r = uv_fs_close(NULL, &fs_req, file, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&fs_req);
     
       printf("output is: %s", output);
    -  ASSERT(strcmp("hello world\n", output) == 0);
    +  ASSERT_OK(strcmp("hello world\n", output));
     
       /* Cleanup. */
       unlink("stdout_file");
    @@ -378,7 +378,7 @@ TEST_IMPL(spawn_stdout_and_stderr_to_file) {
     
       r = uv_fs_open(NULL, &fs_req, "stdout_file", O_CREAT | O_RDWR,
           S_IRUSR | S_IWUSR, NULL);
    -  ASSERT(r != -1);
    +  ASSERT_NE(r, -1);
       uv_fs_req_cleanup(&fs_req);
     
       file = r;
    @@ -392,25 +392,25 @@ TEST_IMPL(spawn_stdout_and_stderr_to_file) {
       options.stdio_count = 3;
     
       r = uv_spawn(uv_default_loop(), &process, &options);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       buf = uv_buf_init(output, sizeof(output));
       r = uv_fs_read(NULL, &fs_req, file, &buf, 1, 0, NULL);
    -  ASSERT(r == 27);
    +  ASSERT_EQ(27, r);
       uv_fs_req_cleanup(&fs_req);
     
       r = uv_fs_close(NULL, &fs_req, file, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&fs_req);
     
       printf("output is: %s", output);
    -  ASSERT(strcmp("hello world\nhello errworld\n", output) == 0);
    +  ASSERT_OK(strcmp("hello world\nhello errworld\n", output));
     
       /* Cleanup. */
       unlink("stdout_file");
    @@ -440,10 +440,10 @@ TEST_IMPL(spawn_stdout_and_stderr_to_file2) {
                      O_CREAT | O_RDWR,
                      S_IRUSR | S_IWUSR,
                      NULL);
    -  ASSERT(r != -1);
    +  ASSERT_NE(r, -1);
       uv_fs_req_cleanup(&fs_req);
       file = dup2(r, STDERR_FILENO);
    -  ASSERT(file != -1);
    +  ASSERT_NE(file, -1);
     
       options.stdio = stdio;
       options.stdio[0].flags = UV_IGNORE;
    @@ -454,25 +454,25 @@ TEST_IMPL(spawn_stdout_and_stderr_to_file2) {
       options.stdio_count = 3;
     
       r = uv_spawn(uv_default_loop(), &process, &options);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       buf = uv_buf_init(output, sizeof(output));
       r = uv_fs_read(NULL, &fs_req, file, &buf, 1, 0, NULL);
    -  ASSERT(r == 27);
    +  ASSERT_EQ(27, r);
       uv_fs_req_cleanup(&fs_req);
     
       r = uv_fs_close(NULL, &fs_req, file, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&fs_req);
     
       printf("output is: %s", output);
    -  ASSERT(strcmp("hello world\nhello errworld\n", output) == 0);
    +  ASSERT_OK(strcmp("hello world\nhello errworld\n", output));
     
       /* Cleanup. */
       unlink("stdout_file");
    @@ -507,18 +507,18 @@ TEST_IMPL(spawn_stdout_and_stderr_to_file_swap) {
                      O_CREAT | O_RDWR,
                      S_IRUSR | S_IWUSR,
                      NULL);
    -  ASSERT(r != -1);
    +  ASSERT_NE(r, -1);
       uv_fs_req_cleanup(&fs_req);
       stdout_file = dup2(r, STDOUT_FILENO);
    -  ASSERT(stdout_file != -1);
    +  ASSERT_NE(stdout_file, -1);
     
       /* open 'stderr_file' and replace STDERR_FILENO with it */
       r = uv_fs_open(NULL, &fs_req, "stderr_file", O_CREAT | O_RDWR,
           S_IRUSR | S_IWUSR, NULL);
    -  ASSERT(r != -1);
    +  ASSERT_NE(r, -1);
       uv_fs_req_cleanup(&fs_req);
       stderr_file = dup2(r, STDERR_FILENO);
    -  ASSERT(stderr_file != -1);
    +  ASSERT_NE(stderr_file, -1);
     
       /* now we're going to swap them: the child process' stdout will be our
        * stderr_file and vice versa */
    @@ -531,39 +531,39 @@ TEST_IMPL(spawn_stdout_and_stderr_to_file_swap) {
       options.stdio_count = 3;
     
       r = uv_spawn(uv_default_loop(), &process, &options);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       buf = uv_buf_init(output, sizeof(output));
     
       /* check the content of stdout_file */
       r = uv_fs_read(NULL, &fs_req, stdout_file, &buf, 1, 0, NULL);
    -  ASSERT(r >= 15);
    +  ASSERT_GE(r, 15);
       uv_fs_req_cleanup(&fs_req);
     
       r = uv_fs_close(NULL, &fs_req, stdout_file, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&fs_req);
     
       printf("output is: %s", output);
    -  ASSERT(strncmp("hello errworld\n", output, 15) == 0);
    +  ASSERT_OK(strncmp("hello errworld\n", output, 15));
     
       /* check the content of stderr_file */
       r = uv_fs_read(NULL, &fs_req, stderr_file, &buf, 1, 0, NULL);
    -  ASSERT(r >= 12);
    +  ASSERT_GE(r, 12);
       uv_fs_req_cleanup(&fs_req);
     
       r = uv_fs_close(NULL, &fs_req, stderr_file, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_fs_req_cleanup(&fs_req);
     
       printf("output is: %s", output);
    -  ASSERT(strncmp("hello world\n", output, 12) == 0);
    +  ASSERT_OK(strncmp("hello world\n", output, 12));
     
       /* Cleanup. */
       unlink("stdout_file");
    @@ -598,22 +598,22 @@ TEST_IMPL(spawn_stdin) {
       options.stdio_count = 2;
     
       r = uv_spawn(uv_default_loop(), &process, &options);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       buf.base = buffer;
       buf.len = sizeof(buffer);
       r = uv_write(&write_req, (uv_stream_t*) &in, &buf, 1, write_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_read_start((uv_stream_t*) &out, on_alloc, on_read);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(close_cb_called == 3); /* Once for process twice for the pipe. */
    -  ASSERT(strcmp(buffer, output) == 0);
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(3, close_cb_called); /* Once for process twice for the pipe. */
    +  ASSERT_OK(strcmp(buffer, output));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -637,18 +637,18 @@ TEST_IMPL(spawn_stdio_greater_than_3) {
       options.stdio_count = 4;
     
       r = uv_spawn(uv_default_loop(), &process, &options);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_read_start((uv_stream_t*) &pipe, on_alloc, on_read);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(close_cb_called == 2); /* Once for process once for the pipe. */
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(2, close_cb_called); /* Once for process once for the pipe. */
       printf("output from stdio[3] is: %s", output);
    -  ASSERT(strcmp("fourth stdio!\n", output) == 0);
    +  ASSERT_OK(strcmp("fourth stdio!\n", output));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -661,7 +661,7 @@ int spawn_tcp_server_helper(void) {
       int r;
     
       r = uv_tcp_init(uv_default_loop(), &tcp);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
     #ifdef _WIN32
       handle = _get_osfhandle(3);
    @@ -669,13 +669,13 @@ int spawn_tcp_server_helper(void) {
       handle = 3;
     #endif
       r = uv_tcp_open(&tcp, handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Make sure that we can listen on a socket that was
        * passed down from the parent process
        */
       r = uv_listen((uv_stream_t*) &tcp, SOMAXCONN, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       return 1;
     }
    @@ -692,21 +692,21 @@ TEST_IMPL(spawn_tcp_server) {
     
       init_process_options("spawn_tcp_server_helper", exit_cb);
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       fd = -1;
       r = uv_tcp_init_ex(uv_default_loop(), &tcp_server, AF_INET);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     #ifdef _WIN32
       r = uv_fileno((uv_handle_t*) &tcp_server, &handle);
       fd = _open_osfhandle((intptr_t) handle, 0);
     #else
       r = uv_fileno((uv_handle_t*) &tcp_server, &fd);
      #endif
    -  ASSERT(r == 0);
    -  ASSERT(fd > 0);
    +  ASSERT_OK(r);
    +  ASSERT_GT(fd, 0);
     
       options.stdio = stdio;
       options.stdio[0].flags = UV_INHERIT_FD;
    @@ -720,13 +720,13 @@ TEST_IMPL(spawn_tcp_server) {
       options.stdio_count = 4;
     
       r = uv_spawn(uv_default_loop(), &process, &options);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -742,13 +742,13 @@ TEST_IMPL(spawn_ignored_stdio) {
       options.stdio_count = 0;
     
       r = uv_spawn(uv_default_loop(), &process, &options);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -761,19 +761,19 @@ TEST_IMPL(spawn_and_kill) {
       init_process_options("spawn_helper4", kill_cb);
     
       r = uv_spawn(uv_default_loop(), &process, &options);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_timer_init(uv_default_loop(), &timer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_timer_start(&timer, timer_cb, 500, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(close_cb_called == 2); /* Once for process and once for timer. */
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(2, close_cb_called); /* Once for process and once for timer. */
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -795,25 +795,25 @@ TEST_IMPL(spawn_preserve_env) {
       options.stdio_count = 2;
     
       r = putenv("ENV_TEST=testval");
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Explicitly set options.env to NULL to test for env clobbering. */
       options.env = NULL;
     
       r = uv_spawn(uv_default_loop(), &process, &options);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_read_start((uv_stream_t*) &out, on_alloc, on_read);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(close_cb_called == 2);
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(2, close_cb_called);
     
       printf("output is: %s", output);
    -  ASSERT(strcmp("testval", output) == 0);
    +  ASSERT_OK(strcmp("testval", output));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -828,22 +828,22 @@ TEST_IMPL(spawn_detached) {
       options.flags |= UV_PROCESS_DETACHED;
     
       r = uv_spawn(uv_default_loop(), &process, &options);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_unref((uv_handle_t*) &process);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(exit_cb_called == 0);
    +  ASSERT_OK(exit_cb_called);
     
    -  ASSERT(process.pid == uv_process_get_pid(&process));
    +  ASSERT_EQ(process.pid, uv_process_get_pid(&process));
     
       r = uv_kill(process.pid, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_kill(process.pid, SIGTERM);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -861,13 +861,13 @@ TEST_IMPL(spawn_and_kill_with_std) {
       init_process_options("spawn_helper4", kill_cb);
     
       r = uv_pipe_init(uv_default_loop(), &in, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_pipe_init(uv_default_loop(), &out, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_pipe_init(uv_default_loop(), &err, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       options.stdio = stdio;
       options.stdio[0].flags = UV_CREATE_PIPE | UV_READABLE_PIPE;
    @@ -879,29 +879,29 @@ TEST_IMPL(spawn_and_kill_with_std) {
       options.stdio_count = 3;
     
       r = uv_spawn(uv_default_loop(), &process, &options);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       buf = uv_buf_init(message, sizeof message);
       r = uv_write(&write, (uv_stream_t*) &in, &buf, 1, write_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_read_start((uv_stream_t*) &out, on_alloc, on_read);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_read_start((uv_stream_t*) &err, on_alloc, on_read);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_timer_init(uv_default_loop(), &timer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_timer_start(&timer, timer_cb, 500, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(close_cb_called == 5); /* process x 1, timer x 1, stdio x 3. */
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(5, close_cb_called); /* process x 1, timer x 1, stdio x 3. */
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -928,27 +928,27 @@ TEST_IMPL(spawn_and_ping) {
       options.stdio_count = 2;
     
       r = uv_spawn(uv_default_loop(), &process, &options);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Sending signum == 0 should check if the
        * child process is still alive, not kill it.
        */
       r = uv_process_kill(&process, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_write(&write_req, (uv_stream_t*) &in, &buf, 1, write_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_read_start((uv_stream_t*) &out, on_alloc, on_read);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(exit_cb_called == 0);
    +  ASSERT_OK(exit_cb_called);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(strcmp(output, "TEST") == 0);
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_OK(strcmp(output, "TEST"));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -975,27 +975,27 @@ TEST_IMPL(spawn_same_stdout_stderr) {
       options.stdio_count = 2;
     
       r = uv_spawn(uv_default_loop(), &process, &options);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Sending signum == 0 should check if the
        * child process is still alive, not kill it.
        */
       r = uv_process_kill(&process, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_write(&write_req, (uv_stream_t*) &in, &buf, 1, write_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_read_start((uv_stream_t*) &out, on_alloc, on_read);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(exit_cb_called == 0);
    +  ASSERT_OK(exit_cb_called);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(strcmp(output, "TEST") == 0);
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_OK(strcmp(output, "TEST"));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -1019,15 +1019,15 @@ TEST_IMPL(spawn_closed_process_io) {
     
       close(0); /* Close process stdin. */
     
    -  ASSERT(0 == uv_spawn(uv_default_loop(), &process, &options));
    +  ASSERT_OK(uv_spawn(uv_default_loop(), &process, &options));
     
       buf = uv_buf_init(buffer, sizeof(buffer));
    -  ASSERT(0 == uv_write(&write_req, (uv_stream_t*) &in, &buf, 1, write_cb));
    +  ASSERT_OK(uv_write(&write_req, (uv_stream_t*) &in, &buf, 1, write_cb));
     
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(close_cb_called == 2); /* process, child stdin */
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(2, close_cb_called); /* process, child stdin */
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -1049,39 +1049,39 @@ TEST_IMPL(kill) {
         sigset_t set;
         sigemptyset(&set);
         sigaddset(&set, SIGTERM);
    -    ASSERT(0 == pthread_sigmask(SIG_BLOCK, &set, NULL));
    +    ASSERT_OK(pthread_sigmask(SIG_BLOCK, &set, NULL));
       }
    -  ASSERT(SIG_ERR != signal(SIGTERM, SIG_IGN));
    +  ASSERT_NE(SIG_ERR, signal(SIGTERM, SIG_IGN));
     #endif
     
       r = uv_spawn(uv_default_loop(), &process, &options);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
     #ifndef _WIN32
       {
         sigset_t set;
         sigemptyset(&set);
         sigaddset(&set, SIGTERM);
    -    ASSERT(0 == pthread_sigmask(SIG_UNBLOCK, &set, NULL));
    +    ASSERT_OK(pthread_sigmask(SIG_UNBLOCK, &set, NULL));
       }
    -  ASSERT(SIG_ERR != signal(SIGTERM, SIG_DFL));
    +  ASSERT_NE(SIG_ERR, signal(SIGTERM, SIG_DFL));
     #endif
     
       /* Sending signum == 0 should check if the
        * child process is still alive, not kill it.
        */
       r = uv_kill(process.pid, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Kill the process. */
       r = uv_kill(process.pid, SIGTERM);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -1119,21 +1119,21 @@ TEST_IMPL(spawn_detect_pipe_name_collisions_on_windows) {
                                     65536,
                                     0,
                                     NULL);
    -  ASSERT(pipe_handle != INVALID_HANDLE_VALUE);
    +  ASSERT_PTR_NE(pipe_handle, INVALID_HANDLE_VALUE);
     
       r = uv_spawn(uv_default_loop(), &process, &options);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_read_start((uv_stream_t*) &out, on_alloc, on_read);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(close_cb_called == 2); /* Once for process once for the pipe. */
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(2, close_cb_called); /* Once for process once for the pipe. */
       printf("output is: %s", output);
    -  ASSERT(strcmp("hello world\n", output) == 0);
    +  ASSERT_OK(strcmp("hello world\n", output));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -1197,7 +1197,7 @@ TEST_IMPL(argument_escaping) {
       cracked = CommandLineToArgvW(command_line, &num_args);
       for (i = 0; i < num_args; ++i) {
         wprintf(L"%d: %s\t%s\n", i, test_str[i], cracked[i]);
    -    ASSERT(wcscmp(test_str[i], cracked[i]) == 0);
    +    ASSERT_OK(wcscmp(test_str[i], cracked[i]));
       }
     
       LocalFree(cracked);
    @@ -1207,19 +1207,19 @@ TEST_IMPL(argument_escaping) {
       free(test_output);
     
       result = make_program_args(verbatim, 1, &verbatim_output);
    -  ASSERT(result == 0);
    +  ASSERT_OK(result);
       result = make_program_args(verbatim, 0, &non_verbatim_output);
    -  ASSERT(result == 0);
    +  ASSERT_OK(result);
     
       wprintf(L"    verbatim_output: %s\n", verbatim_output);
       wprintf(L"non_verbatim_output: %s\n", non_verbatim_output);
     
    -  ASSERT(wcscmp(verbatim_output,
    -                L"cmd.exe /c c:\\path\\to\\node.exe --eval "
    -                L"\"require('c:\\\\path\\\\to\\\\test.js')\"") == 0);
    -  ASSERT(wcscmp(non_verbatim_output,
    -                L"cmd.exe /c \"c:\\path\\to\\node.exe --eval "
    -                L"\\\"require('c:\\\\path\\\\to\\\\test.js')\\\"\"") == 0);
    +  ASSERT_OK(wcscmp(verbatim_output,
    +                   L"cmd.exe /c c:\\path\\to\\node.exe --eval "
    +                   L"\"require('c:\\\\path\\\\to\\\\test.js')\""));
    +  ASSERT_OK(wcscmp(non_verbatim_output,
    +                   L"cmd.exe /c \"c:\\path\\to\\node.exe --eval "
    +                   L"\\\"require('c:\\\\path\\\\to\\\\test.js')\\\"\""));
     
       free(verbatim_output);
       free(non_verbatim_output);
    @@ -1303,7 +1303,7 @@ TEST_IMPL(environment_creation) {
       }
     
       result = make_program_env(environment, &env);
    -  ASSERT(result == 0);
    +  ASSERT_OK(result);
     
       for (str = env, prev = NULL; *str; prev = str, str += wcslen(str) + 1) {
         int found = 0;
    @@ -1327,7 +1327,7 @@ TEST_IMPL(environment_creation) {
         }
         if (prev) { /* verify sort order */
     #if !defined(__MINGW32__) || defined(__MINGW64_VERSION_MAJOR)
    -      ASSERT(CompareStringOrdinal(prev, -1, str, -1, TRUE) == 1);
    +      ASSERT_EQ(1, CompareStringOrdinal(prev, -1, str, -1, TRUE));
     #endif
         }
         ASSERT(found); /* verify that we expected this variable */
    @@ -1359,9 +1359,37 @@ TEST_IMPL(spawn_with_an_odd_path) {
       options.file = options.args[0] = "program-that-had-better-not-exist";
       r = uv_spawn(uv_default_loop(), &process, &options);
       ASSERT(r == UV_ENOENT || r == UV_EACCES);
    -  ASSERT(0 == uv_is_active((uv_handle_t*) &process));
    +  ASSERT_OK(uv_is_active((uv_handle_t*) &process));
       uv_close((uv_handle_t*) &process, NULL);
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +
    +  MAKE_VALGRIND_HAPPY(uv_default_loop());
    +  return 0;
    +}
    +
    +
    +TEST_IMPL(spawn_no_path) {
    +  char* env[1];
    +  WCHAR* old_path = NULL;
    +  DWORD old_path_len;
    +
    +  if ((old_path_len = GetEnvironmentVariableW(L"PATH", NULL, 0)) > 0) {
    +    old_path = malloc(old_path_len * sizeof(WCHAR));
    +    GetEnvironmentVariableW(L"PATH", old_path, old_path_len);
    +    SetEnvironmentVariableW(L"PATH", NULL);
    +  }
    +
    +  init_process_options("spawn_helper1", exit_cb);
    +  options.env = env;
    +  env[0] = NULL;
    +
    +  ASSERT_OK(uv_spawn(uv_default_loop(), &process, &options));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
    +
    +  SetEnvironmentVariableW(L"PATH", old_path);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -1398,13 +1426,13 @@ TEST_IMPL(spawn_setuid_setgid) {
       if (r == UV_EACCES)
         RETURN_SKIP("user 'nobody' cannot access the test runner");
     
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -1424,8 +1452,8 @@ TEST_IMPL(spawn_setuid_fails) {
         struct passwd* pw;
         pw = getpwnam("nobody");
         ASSERT_NOT_NULL(pw);
    -    ASSERT(0 == setgid(pw->pw_gid));
    -    ASSERT(0 == setuid(pw->pw_uid));
    +    ASSERT_OK(setgid(pw->pw_gid));
    +    ASSERT_OK(setuid(pw->pw_uid));
       }
     #endif  /* !__PASE__ */
     
    @@ -1449,15 +1477,15 @@ TEST_IMPL(spawn_setuid_fails) {
     
       r = uv_spawn(uv_default_loop(), &process, &options);
     #if defined(__CYGWIN__)
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     #else
    -  ASSERT(r == UV_EPERM);
    +  ASSERT_EQ(r, UV_EPERM);
     #endif
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(close_cb_called == 0);
    +  ASSERT_OK(close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -1475,8 +1503,8 @@ TEST_IMPL(spawn_setgid_fails) {
         struct passwd* pw;
         pw = getpwnam("nobody");
         ASSERT_NOT_NULL(pw);
    -    ASSERT(0 == setgid(pw->pw_gid));
    -    ASSERT(0 == setuid(pw->pw_uid));
    +    ASSERT_OK(setgid(pw->pw_gid));
    +    ASSERT_OK(setuid(pw->pw_uid));
       }
     #endif  /* !__PASE__ */
     
    @@ -1494,15 +1522,15 @@ TEST_IMPL(spawn_setgid_fails) {
     
       r = uv_spawn(uv_default_loop(), &process, &options);
     #if defined(__CYGWIN__) || defined(__MVS__)
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     #else
    -  ASSERT(r == UV_EPERM);
    +  ASSERT_EQ(r, UV_EPERM);
     #endif
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(close_cb_called == 0);
    +  ASSERT_OK(close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -1528,12 +1556,12 @@ TEST_IMPL(spawn_setuid_fails) {
       options.uid = (uv_uid_t) -42424242;
     
       r = uv_spawn(uv_default_loop(), &process, &options);
    -  ASSERT(r == UV_ENOTSUP);
    +  ASSERT_EQ(r, UV_ENOTSUP);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(close_cb_called == 0);
    +  ASSERT_OK(close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -1549,12 +1577,12 @@ TEST_IMPL(spawn_setgid_fails) {
       options.gid = (uv_gid_t) -42424242;
     
       r = uv_spawn(uv_default_loop(), &process, &options);
    -  ASSERT(r == UV_ENOTSUP);
    +  ASSERT_EQ(r, UV_ENOTSUP);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(close_cb_called == 0);
    +  ASSERT_OK(close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -1564,12 +1592,12 @@ TEST_IMPL(spawn_setgid_fails) {
     
     TEST_IMPL(spawn_auto_unref) {
       init_process_options("spawn_helper1", NULL);
    -  ASSERT(0 == uv_spawn(uv_default_loop(), &process, &options));
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    -  ASSERT(0 == uv_is_closing((uv_handle_t*) &process));
    +  ASSERT_OK(uv_spawn(uv_default_loop(), &process, &options));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_is_closing((uv_handle_t*) &process));
       uv_close((uv_handle_t*) &process, NULL);
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    -  ASSERT(1 == uv_is_closing((uv_handle_t*) &process));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_EQ(1, uv_is_closing((uv_handle_t*) &process));
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
     }
    @@ -1594,13 +1622,13 @@ TEST_IMPL(spawn_fs_open) {
     #endif
     
       r = uv_fs_open(NULL, &fs_req, dev_null, O_RDWR, 0, NULL);
    -  ASSERT(r != -1);
    +  ASSERT_NE(r, -1);
       fd = uv_get_osfhandle((uv_file) fs_req.result);
       uv_fs_req_cleanup(&fs_req);
     
       init_process_options("spawn_helper8", exit_cb);
     
    -  ASSERT(0 == uv_pipe_init(uv_default_loop(), &in, 0));
    +  ASSERT_OK(uv_pipe_init(uv_default_loop(), &in, 0));
     
       options.stdio = stdio;
       options.stdio[0].flags = UV_CREATE_PIPE | UV_READABLE_PIPE;
    @@ -1609,29 +1637,35 @@ TEST_IMPL(spawn_fs_open) {
     
       /* make an inheritable copy */
     #ifdef _WIN32
    -  ASSERT(0 != DuplicateHandle(GetCurrentProcess(), fd, GetCurrentProcess(), &dup_fd,
    -                              0, /* inherit */ TRUE, DUPLICATE_SAME_ACCESS));
    +  ASSERT_NE(0, DuplicateHandle(GetCurrentProcess(), fd, GetCurrentProcess(), &dup_fd,
    +                               0, /* inherit */ TRUE, DUPLICATE_SAME_ACCESS));
       kernelbase_module = GetModuleHandleA("kernelbase.dll");
       pCompareObjectHandles = (sCompareObjectHandles)
           GetProcAddress(kernelbase_module, "CompareObjectHandles");
    -  ASSERT(pCompareObjectHandles == NULL || pCompareObjectHandles(fd, dup_fd));
    +  ASSERT_NE(pCompareObjectHandles == NULL ||
    +            pCompareObjectHandles(fd, dup_fd),
    +            0);
     #else
       dup_fd = dup(fd);
     #endif
     
    -  ASSERT(0 == uv_spawn(uv_default_loop(), &process, &options));
    +  ASSERT_OK(uv_spawn(uv_default_loop(), &process, &options));
     
       buf = uv_buf_init((char*) &fd, sizeof(fd));
    -  ASSERT(0 == uv_write(&write_req, (uv_stream_t*) &in, &buf, 1, write_null_cb));
    +  ASSERT_OK(uv_write(&write_req,
    +                     (uv_stream_t*) &in,
    +                     &buf,
    +                     1,
    +                     write_null_cb));
     
       buf = uv_buf_init((char*) &dup_fd, sizeof(fd));
    -  ASSERT(0 == uv_write(&write_req2, (uv_stream_t*) &in, &buf, 1, write_cb));
    +  ASSERT_OK(uv_write(&write_req2, (uv_stream_t*) &in, &buf, 1, write_cb));
     
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    -  ASSERT(0 == uv_fs_close(NULL, &fs_req, r, NULL));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_fs_close(NULL, &fs_req, r, NULL));
     
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(close_cb_called == 2);  /* One for `in`, one for process */
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(2, close_cb_called);  /* One for `in`, one for process */
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -1647,9 +1681,9 @@ TEST_IMPL(closed_fd_events) {
       bufs[0] = uv_buf_init("", 1);
     
       /* create a pipe and share it with a child process */
    -  ASSERT(0 == uv_pipe(fd, 0, 0));
    -  ASSERT(fd[0] > 2);
    -  ASSERT(fd[1] > 2);
    +  ASSERT_OK(uv_pipe(fd, 0, 0));
    +  ASSERT_GT(fd[0], 2);
    +  ASSERT_GT(fd[1], 2);
     
       /* spawn_helper4 blocks indefinitely. */
       init_process_options("spawn_helper4", exit_cb);
    @@ -1660,49 +1694,51 @@ TEST_IMPL(closed_fd_events) {
       options.stdio[1].flags = UV_IGNORE;
       options.stdio[2].flags = UV_IGNORE;
     
    -  ASSERT(0 == uv_spawn(uv_default_loop(), &process, &options));
    +  ASSERT_OK(uv_spawn(uv_default_loop(), &process, &options));
       uv_unref((uv_handle_t*) &process);
     
       /* read from the pipe with uv */
    -  ASSERT(0 == uv_pipe_init(uv_default_loop(), &pipe_handle, 0));
    -  ASSERT(0 == uv_pipe_open(&pipe_handle, fd[0]));
    +  ASSERT_OK(uv_pipe_init(uv_default_loop(), &pipe_handle, 0));
    +  ASSERT_OK(uv_pipe_open(&pipe_handle, fd[0]));
       /* uv_pipe_open() takes ownership of the file descriptor. */
       fd[0] = -1;
     
    -  ASSERT(0 == uv_read_start((uv_stream_t*) &pipe_handle, on_alloc, on_read_once));
    +  ASSERT_OK(uv_read_start((uv_stream_t*) &pipe_handle,
    +                          on_alloc,
    +                          on_read_once));
     
    -  ASSERT(1 == uv_fs_write(NULL, &req, fd[1], bufs, 1, -1, NULL));
    -  ASSERT(req.result == 1);
    +  ASSERT_EQ(1, uv_fs_write(NULL, &req, fd[1], bufs, 1, -1, NULL));
    +  ASSERT_EQ(1, req.result);
       uv_fs_req_cleanup(&req);
     
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_ONCE));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_ONCE));
     
       /* should have received just one byte */
    -  ASSERT(output_used == 1);
    +  ASSERT_EQ(1, output_used);
     
       /* close the pipe and see if we still get events */
       uv_close((uv_handle_t*) &pipe_handle, close_cb);
     
    -  ASSERT(1 == uv_fs_write(NULL, &req, fd[1], bufs, 1, -1, NULL));
    -  ASSERT(req.result == 1);
    +  ASSERT_EQ(1, uv_fs_write(NULL, &req, fd[1], bufs, 1, -1, NULL));
    +  ASSERT_EQ(1, req.result);
       uv_fs_req_cleanup(&req);
     
    -  ASSERT(0 == uv_timer_init(uv_default_loop(), &timer));
    -  ASSERT(0 == uv_timer_start(&timer, timer_counter_cb, 10, 0));
    +  ASSERT_OK(uv_timer_init(uv_default_loop(), &timer));
    +  ASSERT_OK(uv_timer_start(&timer, timer_counter_cb, 10, 0));
     
       /* see if any spurious events interrupt the timer */
       if (1 == uv_run(uv_default_loop(), UV_RUN_ONCE))
         /* have to run again to really trigger the timer */
    -    ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_ONCE));
    +    ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_ONCE));
     
    -  ASSERT(timer_counter == 1);
    +  ASSERT_EQ(1, timer_counter);
     
       /* cleanup */
    -  ASSERT(0 == uv_process_kill(&process, SIGTERM));
    +  ASSERT_OK(uv_process_kill(&process, SIGTERM));
     #ifdef _WIN32
    -  ASSERT(0 == _close(fd[1]));
    +  ASSERT_OK(_close(fd[1]));
     #else
    -  ASSERT(0 == close(fd[1]));
    +  ASSERT_OK(close(fd[1]));
     #endif
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
    @@ -1767,13 +1803,13 @@ TEST_IMPL(spawn_reads_child_path) {
       options.env = env;
     
       r = uv_spawn(uv_default_loop(), &process, &options);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -1799,27 +1835,27 @@ TEST_IMPL(spawn_inherit_streams) {
       init_process_options("spawn_helper9", exit_cb);
     
       loop = uv_default_loop();
    -  ASSERT(uv_pipe_init(loop, &pipe_stdin_child, 0) == 0);
    -  ASSERT(uv_pipe_init(loop, &pipe_stdout_child, 0) == 0);
    -  ASSERT(uv_pipe_init(loop, &pipe_stdin_parent, 0) == 0);
    -  ASSERT(uv_pipe_init(loop, &pipe_stdout_parent, 0) == 0);
    -
    -  ASSERT(uv_pipe(fds_stdin, 0, 0) == 0);
    -  ASSERT(uv_pipe(fds_stdout, 0, 0) == 0);
    -
    -  ASSERT(uv_pipe_open(&pipe_stdin_child, fds_stdin[0]) == 0);
    -  ASSERT(uv_pipe_open(&pipe_stdout_child, fds_stdout[1]) == 0);
    -  ASSERT(uv_pipe_open(&pipe_stdin_parent, fds_stdin[1]) == 0);
    -  ASSERT(uv_pipe_open(&pipe_stdout_parent, fds_stdout[0]) == 0);
    +  ASSERT_OK(uv_pipe_init(loop, &pipe_stdin_child, 0));
    +  ASSERT_OK(uv_pipe_init(loop, &pipe_stdout_child, 0));
    +  ASSERT_OK(uv_pipe_init(loop, &pipe_stdin_parent, 0));
    +  ASSERT_OK(uv_pipe_init(loop, &pipe_stdout_parent, 0));
    +
    +  ASSERT_OK(uv_pipe(fds_stdin, 0, 0));
    +  ASSERT_OK(uv_pipe(fds_stdout, 0, 0));
    +
    +  ASSERT_OK(uv_pipe_open(&pipe_stdin_child, fds_stdin[0]));
    +  ASSERT_OK(uv_pipe_open(&pipe_stdout_child, fds_stdout[1]));
    +  ASSERT_OK(uv_pipe_open(&pipe_stdin_parent, fds_stdin[1]));
    +  ASSERT_OK(uv_pipe_open(&pipe_stdout_parent, fds_stdout[0]));
       ASSERT(uv_is_readable((uv_stream_t*) &pipe_stdin_child));
       ASSERT(uv_is_writable((uv_stream_t*) &pipe_stdout_child));
       ASSERT(uv_is_writable((uv_stream_t*) &pipe_stdin_parent));
       ASSERT(uv_is_readable((uv_stream_t*) &pipe_stdout_parent));
       /* Some systems (SVR4) open a bidirectional pipe, most don't. */
       bidir = uv_is_writable((uv_stream_t*) &pipe_stdin_child);
    -  ASSERT(uv_is_readable((uv_stream_t*) &pipe_stdout_child) == bidir);
    -  ASSERT(uv_is_readable((uv_stream_t*) &pipe_stdin_parent) == bidir);
    -  ASSERT(uv_is_writable((uv_stream_t*) &pipe_stdout_parent) == bidir);
    +  ASSERT_EQ(uv_is_readable((uv_stream_t*) &pipe_stdout_child), bidir);
    +  ASSERT_EQ(uv_is_readable((uv_stream_t*) &pipe_stdin_parent), bidir);
    +  ASSERT_EQ(uv_is_writable((uv_stream_t*) &pipe_stdout_parent), bidir);
     
       child_stdio[0].flags = UV_INHERIT_STREAM;
       child_stdio[0].data.stream = (uv_stream_t *) &pipe_stdin_child;
    @@ -1830,7 +1866,7 @@ TEST_IMPL(spawn_inherit_streams) {
       options.stdio = child_stdio;
       options.stdio_count = 2;
     
    -  ASSERT(uv_spawn(loop, &child_req, &options) == 0);
    +  ASSERT_OK(uv_spawn(loop, &child_req, &options));
     
       uv_close((uv_handle_t*) &pipe_stdin_child, NULL);
       uv_close((uv_handle_t*) &pipe_stdout_child, NULL);
    @@ -1845,19 +1881,19 @@ TEST_IMPL(spawn_inherit_streams) {
                    &buf,
                    1,
                    write_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_read_start((uv_stream_t*) &pipe_stdout_parent, on_alloc, on_read);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(close_cb_called == 3);
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(3, close_cb_called);
     
       r = memcmp(ubuf, output, sizeof ubuf);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -1898,7 +1934,7 @@ TEST_IMPL(spawn_exercise_sigchld_issue) {
       init_process_options("spawn_helper1", exit_cb);
     
       r = uv_spawn(uv_default_loop(), &process, &options);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       // This test exercises a bug in the darwin kernel that causes SIGCHLD not to
       // be delivered sometimes. Calling posix_spawn many times increases the
    @@ -1917,10 +1953,10 @@ TEST_IMPL(spawn_exercise_sigchld_issue) {
       }
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
    -  ASSERT_EQ(exit_cb_called, 1);
    -  ASSERT_EQ(close_cb_called, 101);
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(101, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -1939,14 +1975,14 @@ void spawn_stdin_stdout(void) {
         if (r == 0) {
           return;
         }
    -    ASSERT(r > 0);
    +    ASSERT_GT(r, 0);
         c = r;
         pbuf = buf;
         while (c) {
           do {
             w = write(1, pbuf, (size_t)c);
           } while (w == -1 && errno == EINTR);
    -      ASSERT(w >= 0);
    +      ASSERT_GE(w, 0);
           pbuf = pbuf + w;
           c = c - w;
         }
    @@ -1958,14 +1994,14 @@ void spawn_stdin_stdout(void) {
       char* pbuf;
       HANDLE h_stdin = GetStdHandle(STD_INPUT_HANDLE);
       HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE);
    -  ASSERT(h_stdin != INVALID_HANDLE_VALUE);
    -  ASSERT(h_stdout != INVALID_HANDLE_VALUE);
    +  ASSERT_PTR_NE(h_stdin, INVALID_HANDLE_VALUE);
    +  ASSERT_PTR_NE(h_stdout, INVALID_HANDLE_VALUE);
       for (;;) {
         DWORD n_read;
         DWORD n_written;
         DWORD to_write;
         if (!ReadFile(h_stdin, buf, sizeof buf, &n_read, NULL)) {
    -      ASSERT(GetLastError() == ERROR_BROKEN_PIPE);
    +      ASSERT_EQ(GetLastError(), ERROR_BROKEN_PIPE);
           return;
         }
         to_write = n_read;
    @@ -1985,7 +2021,7 @@ TEST_IMPL(spawn_relative_path) {
       init_process_options("spawn_helper1", exit_cb);
     
       exepath_size = sizeof(exepath) - 2;
    -  ASSERT_EQ(0, uv_exepath(exepath, &exepath_size));
    +  ASSERT_OK(uv_exepath(exepath, &exepath_size));
       exepath[exepath_size] = '\0';
     
       /* Poor man's basename(3). */
    @@ -2003,8 +2039,8 @@ TEST_IMPL(spawn_relative_path) {
       options.cwd = exepath;
       options.file = options.args[0] = sep + 1;
     
    -  ASSERT_EQ(0, uv_spawn(uv_default_loop(), &process, &options));
    -  ASSERT_EQ(0, uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_spawn(uv_default_loop(), &process, &options));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
       ASSERT_EQ(1, exit_cb_called);
       ASSERT_EQ(1, close_cb_called);
    diff --git a/deps/uv/test/test-stdio-over-pipes.c b/deps/uv/test/test-stdio-over-pipes.c
    index 1b7f17297cabb2..c41040ee2fdc78 100644
    --- a/deps/uv/test/test-stdio-over-pipes.c
    +++ b/deps/uv/test/test-stdio-over-pipes.c
    @@ -52,8 +52,8 @@ static void exit_cb(uv_process_t* process,
                         int term_signal) {
       printf("exit_cb\n");
       exit_cb_called++;
    -  ASSERT(exit_status == 0);
    -  ASSERT(term_signal == 0);
    +  ASSERT_OK(exit_status);
    +  ASSERT_OK(term_signal);
       uv_close((uv_handle_t*)process, close_cb);
       uv_close((uv_handle_t*)&in, close_cb);
       uv_close((uv_handle_t*)&out, close_cb);
    @@ -62,7 +62,7 @@ static void exit_cb(uv_process_t* process,
     
     static void init_process_options(char* test, uv_exit_cb exit_cb) {
       int r = uv_exepath(exepath, &exepath_size);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       exepath[exepath_size] = '\0';
       args[0] = exepath;
       args[1] = test;
    @@ -104,11 +104,11 @@ static void on_read(uv_stream_t* pipe, ssize_t nread, const uv_buf_t* rdbuf) {
       if (nread > 0) {
         output_used += nread;
         if (output_used % 12 == 0) {
    -      ASSERT(memcmp("hello world\n", output, 12) == 0);
    +      ASSERT_OK(memcmp("hello world\n", output, 12));
           wrbuf = uv_buf_init(output, 12);
           req = malloc(sizeof(*req));
           r = uv_write(req, (uv_stream_t*) &in, &wrbuf, 1, after_write);
    -      ASSERT(r == 0);
    +      ASSERT_OK(r);
         }
       }
     
    @@ -140,20 +140,20 @@ static void test_stdio_over_pipes(int overlapped) {
       options.stdio_count = 3;
     
       r = uv_spawn(loop, &process, &options);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_read_start((uv_stream_t*) &out, on_alloc, on_read);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(on_read_cb_called > 1);
    -  ASSERT(after_write_cb_called == 2);
    -  ASSERT(exit_cb_called == 1);
    -  ASSERT(close_cb_called == 3);
    -  ASSERT(memcmp("hello world\nhello world\n", output, 24) == 0);
    -  ASSERT(output_used == 24);
    +  ASSERT_GT(on_read_cb_called, 1);
    +  ASSERT_EQ(2, after_write_cb_called);
    +  ASSERT_EQ(1, exit_cb_called);
    +  ASSERT_EQ(3, close_cb_called);
    +  ASSERT_OK(memcmp("hello world\nhello world\n", output, 24));
    +  ASSERT_EQ(24, output_used);
     
       MAKE_VALGRIND_HAPPY(loop);
     }
    @@ -179,8 +179,8 @@ static uv_pipe_t stdin_pipe2;
     static uv_pipe_t stdout_pipe2;
     
     static void on_pipe_read(uv_stream_t* pipe, ssize_t nread, const uv_buf_t* buf) {
    -  ASSERT(nread > 0);
    -  ASSERT(memcmp("hello world\n", buf->base, nread) == 0);
    +  ASSERT_GT(nread, 0);
    +  ASSERT_OK(memcmp("hello world\n", buf->base, nread));
       on_pipe_read_called++;
     
       free(buf->base);
    @@ -190,7 +190,7 @@ static void on_pipe_read(uv_stream_t* pipe, ssize_t nread, const uv_buf_t* buf)
     
     
     static void after_pipe_write(uv_write_t* req, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       after_write_called++;
     }
     
    @@ -222,17 +222,17 @@ int stdio_over_pipes_helper(void) {
       int r;
       uv_loop_t* loop = uv_default_loop();
     
    -  ASSERT(UV_NAMED_PIPE == uv_guess_handle(0));
    -  ASSERT(UV_NAMED_PIPE == uv_guess_handle(1));
    +  ASSERT_EQ(UV_NAMED_PIPE, uv_guess_handle(0));
    +  ASSERT_EQ(UV_NAMED_PIPE, uv_guess_handle(1));
     
       r = uv_pipe_init(loop, &stdin_pipe1, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_pipe_init(loop, &stdout_pipe1, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_pipe_init(loop, &stdin_pipe2, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_pipe_init(loop, &stdout_pipe2, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_pipe_open(&stdin_pipe1, 0);
       uv_pipe_open(&stdout_pipe1, 1);
    @@ -256,15 +256,15 @@ int stdio_over_pipes_helper(void) {
                        &buf[i],
                        1,
                        after_pipe_write);
    -      ASSERT(r == 0);
    +      ASSERT_OK(r);
         }
     
         notify_parent_process();
         uv_run(loop, UV_RUN_DEFAULT);
     
    -    ASSERT(after_write_called == 7 * (j + 1));
    -    ASSERT(on_pipe_read_called == j);
    -    ASSERT(close_cb_called == 0);
    +    ASSERT_EQ(after_write_called, 7 * (j + 1));
    +    ASSERT_EQ(on_pipe_read_called, j);
    +    ASSERT_OK(close_cb_called);
     
         uv_ref((uv_handle_t*) &stdout_pipe1);
         uv_ref((uv_handle_t*) &stdin_pipe1);
    @@ -274,13 +274,13 @@ int stdio_over_pipes_helper(void) {
         r = uv_read_start((uv_stream_t*) (j == 0 ? &stdin_pipe1 : &stdin_pipe2),
                           on_read_alloc,
                           on_pipe_read);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
         uv_run(loop, UV_RUN_DEFAULT);
     
    -    ASSERT(after_write_called == 7 * (j + 1));
    -    ASSERT(on_pipe_read_called == j + 1);
    -    ASSERT(close_cb_called == 0);
    +    ASSERT_EQ(after_write_called, 7 * (j + 1));
    +    ASSERT_EQ(on_pipe_read_called, j + 1);
    +    ASSERT_OK(close_cb_called);
       }
     
       uv_close((uv_handle_t*)&stdin_pipe1, close_cb);
    @@ -290,9 +290,9 @@ int stdio_over_pipes_helper(void) {
     
       uv_run(loop, UV_RUN_DEFAULT);
     
    -  ASSERT(after_write_called == 14);
    -  ASSERT(on_pipe_read_called == 2);
    -  ASSERT(close_cb_called == 4);
    +  ASSERT_EQ(14, after_write_called);
    +  ASSERT_EQ(2, on_pipe_read_called);
    +  ASSERT_EQ(4, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-strscpy.c b/deps/uv/test/test-strscpy.c
    index 4e7db6ffec8ef2..b4699cff056137 100644
    --- a/deps/uv/test/test-strscpy.c
    +++ b/deps/uv/test/test-strscpy.c
    @@ -29,25 +29,25 @@
     TEST_IMPL(strscpy) {
       char d[4];
     
    -  ASSERT(0 == uv__strscpy(d, "", 0));
    -  ASSERT(0 == uv__strscpy(d, "x", 0));
    +  ASSERT_OK(uv__strscpy(d, "", 0));
    +  ASSERT_OK(uv__strscpy(d, "x", 0));
     
       memset(d, 0, sizeof(d));
    -  ASSERT(1 == uv__strscpy(d, "x", sizeof(d)));
    -  ASSERT(0 == memcmp(d, "x\0\0", sizeof(d)));
    +  ASSERT_EQ(1, uv__strscpy(d, "x", sizeof(d)));
    +  ASSERT_OK(memcmp(d, "x\0\0", sizeof(d)));
     
       memset(d, 0, sizeof(d));
    -  ASSERT(2 == uv__strscpy(d, "xy", sizeof(d)));
    -  ASSERT(0 == memcmp(d, "xy\0", sizeof(d)));
    +  ASSERT_EQ(2, uv__strscpy(d, "xy", sizeof(d)));
    +  ASSERT_OK(memcmp(d, "xy\0", sizeof(d)));
     
    -  ASSERT(3 == uv__strscpy(d, "xyz", sizeof(d)));
    -  ASSERT(0 == memcmp(d, "xyz", sizeof(d)));
    +  ASSERT_EQ(3, uv__strscpy(d, "xyz", sizeof(d)));
    +  ASSERT_OK(memcmp(d, "xyz", sizeof(d)));
     
    -  ASSERT(UV_E2BIG == uv__strscpy(d, "xyzz", sizeof(d)));
    -  ASSERT(0 == memcmp(d, "xyz", sizeof(d)));
    +  ASSERT_EQ(UV_E2BIG, uv__strscpy(d, "xyzz", sizeof(d)));
    +  ASSERT_OK(memcmp(d, "xyz", sizeof(d)));
     
    -  ASSERT(UV_E2BIG == uv__strscpy(d, "xyzzy", sizeof(d)));
    -  ASSERT(0 == memcmp(d, "xyz", sizeof(d)));
    +  ASSERT_EQ(UV_E2BIG, uv__strscpy(d, "xyzzy", sizeof(d)));
    +  ASSERT_OK(memcmp(d, "xyz", sizeof(d)));
     
       return 0;
     }
    diff --git a/deps/uv/test/test-strtok.c b/deps/uv/test/test-strtok.c
    index 6c3d835914c388..f4e6cdf8b75a2b 100644
    --- a/deps/uv/test/test-strtok.c
    +++ b/deps/uv/test/test-strtok.c
    @@ -56,7 +56,7 @@ const char* tokens[] = {
     };
     
     #define ASSERT_STRCMP(x, y) \
    -  ASSERT((x != NULL && y != NULL && strcmp(x, y) == 0) || (x == y && x == NULL))
    +  ASSERT_NE((x != NULL && y != NULL && strcmp(x, y) == 0) || (x == y && x == NULL), 0)
     
     TEST_IMPL(strtok) {
       struct strtok_test_case tests[] = {
    @@ -74,13 +74,13 @@ TEST_IMPL(strtok) {
       char current_test[2048];
     
       for (i = 0, j = 0; i < tests_len; i += 1) {
    -    ASSERT(j < tokens_len);
    +    ASSERT_LT(j, tokens_len);
         snprintf(current_test, sizeof(current_test), "%s", tests[i].str);
         tok_r = uv__strtok(current_test, tests[i].sep, &itr);
         ASSERT_STRCMP(tok_r, tokens[j]);
         j++;
         while (tok_r) {
    -      ASSERT(j < tokens_len);
    +      ASSERT_LT(j, tokens_len);
           tok_r = uv__strtok(NULL, tests[i].sep, &itr);
           ASSERT_STRCMP(tok_r, tokens[j]);
           j++;
    diff --git a/deps/uv/test/test-tcp-alloc-cb-fail.c b/deps/uv/test/test-tcp-alloc-cb-fail.c
    index a1b5e84d3b13dd..ff1cfcb844a70e 100644
    --- a/deps/uv/test/test-tcp-alloc-cb-fail.c
    +++ b/deps/uv/test/test-tcp-alloc-cb-fail.c
    @@ -42,7 +42,7 @@ static void close_cb(uv_handle_t* handle) {
     }
     
     static void write_cb(uv_write_t* req, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     }
     
     static void conn_alloc_cb(uv_handle_t* handle, size_t size, uv_buf_t* buf) {
    @@ -52,9 +52,9 @@ static void conn_alloc_cb(uv_handle_t* handle, size_t size, uv_buf_t* buf) {
     static void conn_read_cb(uv_stream_t* stream,
                              ssize_t nread,
                              const uv_buf_t* buf) {
    -  ASSERT(nread == UV_ENOBUFS);
    +  ASSERT_EQ(nread, UV_ENOBUFS);
       ASSERT_NULL(buf->base);
    -  ASSERT(buf->len == 0);
    +  ASSERT_OK(buf->len);
     
       uv_close((uv_handle_t*) &incoming, close_cb);
       uv_close((uv_handle_t*) &client, close_cb);
    @@ -65,23 +65,23 @@ static void connect_cb(uv_connect_t* req, int status) {
       int r;
       uv_buf_t buf;
     
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       connect_cb_called++;
     
       buf = uv_buf_init(hello, sizeof(hello));
       r = uv_write(&write_req, req->handle, &buf, 1, write_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
     static void connection_cb(uv_stream_t* tcp, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
    -  ASSERT(0 == uv_tcp_init(tcp->loop, &incoming));
    -  ASSERT(0 == uv_accept(tcp, (uv_stream_t*) &incoming));
    -  ASSERT(0 == uv_read_start((uv_stream_t*) &incoming,
    -                            conn_alloc_cb,
    -                            conn_read_cb));
    +  ASSERT_OK(uv_tcp_init(tcp->loop, &incoming));
    +  ASSERT_OK(uv_accept(tcp, (uv_stream_t*) &incoming));
    +  ASSERT_OK(uv_read_start((uv_stream_t*) &incoming,
    +                          conn_alloc_cb,
    +                          conn_read_cb));
     
       connection_cb_called++;
     }
    @@ -90,11 +90,11 @@ static void connection_cb(uv_stream_t* tcp, int status) {
     static void start_server(void) {
       struct sockaddr_in addr;
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
     
    -  ASSERT(0 == uv_tcp_init(uv_default_loop(), &server));
    -  ASSERT(0 == uv_tcp_bind(&server, (struct sockaddr*) &addr, 0));
    -  ASSERT(0 == uv_listen((uv_stream_t*) &server, 128, connection_cb));
    +  ASSERT_OK(uv_tcp_init(uv_default_loop(), &server));
    +  ASSERT_OK(uv_tcp_bind(&server, (struct sockaddr*) &addr, 0));
    +  ASSERT_OK(uv_listen((uv_stream_t*) &server, 128, connection_cb));
     }
     
     
    @@ -104,19 +104,19 @@ TEST_IMPL(tcp_alloc_cb_fail) {
     
       start_server();
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
    -  ASSERT(0 == uv_tcp_init(uv_default_loop(), &client));
    -  ASSERT(0 == uv_tcp_connect(&connect_req,
    -                             &client,
    -                             (struct sockaddr*) &addr,
    -                             connect_cb));
    +  ASSERT_OK(uv_tcp_init(uv_default_loop(), &client));
    +  ASSERT_OK(uv_tcp_connect(&connect_req,
    +                           &client,
    +                           (struct sockaddr*) &addr,
    +                           connect_cb));
     
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
    -  ASSERT(connect_cb_called == 1);
    -  ASSERT(connection_cb_called == 1);
    -  ASSERT(close_cb_called == 3);
    +  ASSERT_EQ(1, connect_cb_called);
    +  ASSERT_EQ(1, connection_cb_called);
    +  ASSERT_EQ(3, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-tcp-bind-error.c b/deps/uv/test/test-tcp-bind-error.c
    index edb44c21459261..89e4e33993ffad 100644
    --- a/deps/uv/test/test-tcp-bind-error.c
    +++ b/deps/uv/test/test-tcp-bind-error.c
    @@ -36,7 +36,7 @@ static void close_cb(uv_handle_t* handle) {
     
     
     static void connect_cb(uv_connect_t* req, int status) {
    -  ASSERT(status == UV_EADDRINUSE);
    +  ASSERT_EQ(status, UV_EADDRINUSE);
       uv_close((uv_handle_t*) req->handle, close_cb);
       connect_cb_called++;
     }
    @@ -53,24 +53,24 @@ TEST_IMPL(tcp_bind_error_addrinuse_connect) {
        * (greatest common denominator across platforms) but the connect callback
        * should receive an UV_EADDRINUSE error.
        */
    -  ASSERT(0 == uv_tcp_init(uv_default_loop(), &conn));
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    -  ASSERT(0 == uv_tcp_bind(&conn, (const struct sockaddr*) &addr, 0));
    +  ASSERT_OK(uv_tcp_init(uv_default_loop(), &conn));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_tcp_bind(&conn, (const struct sockaddr*) &addr, 0));
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT + 1, &addr));
    -  ASSERT(0 == uv_tcp_connect(&req,
    -                             &conn,
    -                             (const struct sockaddr*) &addr,
    -                             connect_cb));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT + 1, &addr));
    +  ASSERT_OK(uv_tcp_connect(&req,
    +                           &conn,
    +                           (const struct sockaddr*) &addr,
    +                           connect_cb));
     
       addrlen = sizeof(addr);
    -  ASSERT(UV_EADDRINUSE == uv_tcp_getsockname(&conn,
    -                                             (struct sockaddr*) &addr,
    -                                             &addrlen));
    +  ASSERT_EQ(UV_EADDRINUSE, uv_tcp_getsockname(&conn,
    +                                              (struct sockaddr*) &addr,
    +                                              &addrlen));
     
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    -  ASSERT(connect_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_EQ(1, connect_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -82,28 +82,28 @@ TEST_IMPL(tcp_bind_error_addrinuse_listen) {
       uv_tcp_t server1, server2;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
       r = uv_tcp_init(uv_default_loop(), &server1);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_tcp_bind(&server1, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_init(uv_default_loop(), &server2);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_tcp_bind(&server2, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_listen((uv_stream_t*)&server1, 128, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_listen((uv_stream_t*)&server2, 128, NULL);
    -  ASSERT(r == UV_EADDRINUSE);
    +  ASSERT_EQ(r, UV_EADDRINUSE);
     
       uv_close((uv_handle_t*)&server1, close_cb);
       uv_close((uv_handle_t*)&server2, close_cb);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(close_cb_called == 2);
    +  ASSERT_EQ(2, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -115,10 +115,10 @@ TEST_IMPL(tcp_bind_error_addrnotavail_1) {
       uv_tcp_t server;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.255.255.255", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.255.255.255", TEST_PORT, &addr));
     
       r = uv_tcp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* It seems that Linux is broken here - bind succeeds. */
       r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0);
    @@ -128,7 +128,7 @@ TEST_IMPL(tcp_bind_error_addrnotavail_1) {
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -140,18 +140,18 @@ TEST_IMPL(tcp_bind_error_addrnotavail_2) {
       uv_tcp_t server;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("4.4.4.4", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("4.4.4.4", TEST_PORT, &addr));
     
       r = uv_tcp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == UV_EADDRNOTAVAIL);
    +  ASSERT_EQ(r, UV_EADDRNOTAVAIL);
     
       uv_close((uv_handle_t*)&server, close_cb);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -168,15 +168,15 @@ TEST_IMPL(tcp_bind_error_fault) {
       garbage_addr = (struct sockaddr_in*) &garbage;
     
       r = uv_tcp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_tcp_bind(&server, (const struct sockaddr*) garbage_addr, 0);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       uv_close((uv_handle_t*)&server, close_cb);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -190,21 +190,21 @@ TEST_IMPL(tcp_bind_error_inval) {
       uv_tcp_t server;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr1));
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT_2, &addr2));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr1));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT_2, &addr2));
     
       r = uv_tcp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_tcp_bind(&server, (const struct sockaddr*) &addr1, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_tcp_bind(&server, (const struct sockaddr*) &addr2, 0);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       uv_close((uv_handle_t*)&server, close_cb);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -216,12 +216,12 @@ TEST_IMPL(tcp_bind_localhost_ok) {
       uv_tcp_t server;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       r = uv_tcp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -233,12 +233,12 @@ TEST_IMPL(tcp_bind_invalid_flags) {
       uv_tcp_t server;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       r = uv_tcp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, UV_TCP_IPV6ONLY);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -250,9 +250,9 @@ TEST_IMPL(tcp_listen_without_bind) {
       uv_tcp_t server;
     
       r = uv_tcp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_listen((uv_stream_t*)&server, 128, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -267,32 +267,32 @@ TEST_IMPL(tcp_bind_writable_flags) {
       uv_shutdown_t shutdown_req;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
       r = uv_tcp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_listen((uv_stream_t*)&server, 128, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(0 == uv_is_writable((uv_stream_t*) &server));
    -  ASSERT(0 == uv_is_readable((uv_stream_t*) &server));
    +  ASSERT_OK(uv_is_writable((uv_stream_t*) &server));
    +  ASSERT_OK(uv_is_readable((uv_stream_t*) &server));
     
       buf = uv_buf_init("PING", 4);
       r = uv_write(&write_req, (uv_stream_t*) &server, &buf, 1, NULL);
    -  ASSERT(r == UV_EPIPE);
    +  ASSERT_EQ(r, UV_EPIPE);
       r = uv_shutdown(&shutdown_req, (uv_stream_t*) &server, NULL);
    -  ASSERT(r == UV_ENOTCONN);
    +  ASSERT_EQ(r, UV_ENOTCONN);
       r = uv_read_start((uv_stream_t*) &server,
                         (uv_alloc_cb) abort,
                         (uv_read_cb) abort);
    -  ASSERT(r == UV_ENOTCONN);
    +  ASSERT_EQ(r, UV_ENOTCONN);
     
       uv_close((uv_handle_t*)&server, close_cb);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -307,11 +307,11 @@ TEST_IMPL(tcp_bind_or_listen_error_after_close) {
       addr.sin_port = htons(9999);
       addr.sin_family = AF_INET;
     
    -  ASSERT_EQ(uv_tcp_init(uv_default_loop(), &tcp), 0);
    +  ASSERT_OK(uv_tcp_init(uv_default_loop(), &tcp));
       uv_close((uv_handle_t*) &tcp, NULL);
       ASSERT_EQ(uv_tcp_bind(&tcp, (struct sockaddr*) &addr, 0), UV_EINVAL);
       ASSERT_EQ(uv_listen((uv_stream_t*) &tcp, 5, NULL), UV_EINVAL);
    -  ASSERT_EQ(uv_run(uv_default_loop(), UV_RUN_DEFAULT), 0);
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
     }
    diff --git a/deps/uv/test/test-tcp-bind6-error.c b/deps/uv/test/test-tcp-bind6-error.c
    index 656ebe34e297da..f44d3b7ee9ade4 100644
    --- a/deps/uv/test/test-tcp-bind6-error.c
    +++ b/deps/uv/test/test-tcp-bind6-error.c
    @@ -42,29 +42,29 @@ TEST_IMPL(tcp_bind6_error_addrinuse) {
       if (!can_ipv6())
         RETURN_SKIP("IPv6 not supported");
     
    -  ASSERT(0 == uv_ip6_addr("::", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip6_addr("::", TEST_PORT, &addr));
     
       r = uv_tcp_init(uv_default_loop(), &server1);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_tcp_bind(&server1, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_init(uv_default_loop(), &server2);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_tcp_bind(&server2, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_listen((uv_stream_t*)&server1, 128, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_listen((uv_stream_t*)&server2, 128, NULL);
    -  ASSERT(r == UV_EADDRINUSE);
    +  ASSERT_EQ(r, UV_EADDRINUSE);
     
       uv_close((uv_handle_t*)&server1, close_cb);
       uv_close((uv_handle_t*)&server2, close_cb);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(close_cb_called == 2);
    +  ASSERT_EQ(2, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -79,18 +79,18 @@ TEST_IMPL(tcp_bind6_error_addrnotavail) {
       if (!can_ipv6())
         RETURN_SKIP("IPv6 not supported");
     
    -  ASSERT(0 == uv_ip6_addr("4:4:4:4:4:4:4:4", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip6_addr("4:4:4:4:4:4:4:4", TEST_PORT, &addr));
     
       r = uv_tcp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == UV_EADDRNOTAVAIL);
    +  ASSERT_EQ(r, UV_EADDRNOTAVAIL);
     
       uv_close((uv_handle_t*)&server, close_cb);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -110,15 +110,15 @@ TEST_IMPL(tcp_bind6_error_fault) {
       garbage_addr = (struct sockaddr_in6*) &garbage;
     
       r = uv_tcp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_tcp_bind(&server, (const struct sockaddr*) garbage_addr, 0);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       uv_close((uv_handle_t*)&server, close_cb);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -135,21 +135,21 @@ TEST_IMPL(tcp_bind6_error_inval) {
       if (!can_ipv6())
         RETURN_SKIP("IPv6 not supported");
     
    -  ASSERT(0 == uv_ip6_addr("::", TEST_PORT, &addr1));
    -  ASSERT(0 == uv_ip6_addr("::", TEST_PORT_2, &addr2));
    +  ASSERT_OK(uv_ip6_addr("::", TEST_PORT, &addr1));
    +  ASSERT_OK(uv_ip6_addr("::", TEST_PORT_2, &addr2));
     
       r = uv_tcp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_tcp_bind(&server, (const struct sockaddr*) &addr1, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_tcp_bind(&server, (const struct sockaddr*) &addr2, 0);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       uv_close((uv_handle_t*)&server, close_cb);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -164,12 +164,12 @@ TEST_IMPL(tcp_bind6_localhost_ok) {
       if (!can_ipv6())
         RETURN_SKIP("IPv6 not supported");
     
    -  ASSERT(0 == uv_ip6_addr("::1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip6_addr("::1", TEST_PORT, &addr));
     
       r = uv_tcp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-tcp-close-accept.c b/deps/uv/test/test-tcp-close-accept.c
    index b255cfbd9f362e..4988dd132750c1 100644
    --- a/deps/uv/test/test-tcp-close-accept.c
    +++ b/deps/uv/test/test-tcp-close-accept.c
    @@ -47,7 +47,7 @@ static void close_cb(uv_handle_t* handle) {
     }
     
     static void write_cb(uv_write_t* req, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       write_cb_called++;
     }
     
    @@ -57,7 +57,7 @@ static void connect_cb(uv_connect_t* req, int status) {
       uv_stream_t* outgoing;
     
       if (req == &tcp_check_req) {
    -    ASSERT(status != 0);
    +    ASSERT(status);
     
         /*
          * Time to finish the test: close both the check and pending incoming
    @@ -68,14 +68,14 @@ static void connect_cb(uv_connect_t* req, int status) {
         return;
       }
     
    -  ASSERT(status == 0);
    -  ASSERT(connect_reqs <= req);
    -  ASSERT(req <= connect_reqs + ARRAY_SIZE(connect_reqs));
    +  ASSERT_OK(status);
    +  ASSERT_LE(connect_reqs, req);
    +  ASSERT_LE(req, connect_reqs + ARRAY_SIZE(connect_reqs));
       i = req - connect_reqs;
     
       buf = uv_buf_init("x", 1);
       outgoing = (uv_stream_t*) &tcp_outgoing[i];
    -  ASSERT(0 == uv_write(&write_reqs[i], outgoing, &buf, 1, write_cb));
    +  ASSERT_OK(uv_write(&write_reqs[i], outgoing, &buf, 1, write_cb));
     }
     
     static void alloc_cb(uv_handle_t* handle, size_t size, uv_buf_t* buf) {
    @@ -89,9 +89,9 @@ static void read_cb(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) {
       unsigned int i;
     
       pending_incoming = (uv_tcp_t*) stream - &tcp_incoming[0];
    -  ASSERT(pending_incoming < got_connections);
    -  ASSERT(0 == uv_read_stop(stream));
    -  ASSERT(1 == nread);
    +  ASSERT_LT(pending_incoming, got_connections);
    +  ASSERT_OK(uv_read_stop(stream));
    +  ASSERT_EQ(1, nread);
     
       loop = stream->loop;
       read_cb_called++;
    @@ -106,19 +106,19 @@ static void read_cb(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) {
       uv_close((uv_handle_t*) &tcp_server, close_cb);
     
       /* Create new fd that should be one of the closed incomings */
    -  ASSERT(0 == uv_tcp_init(loop, &tcp_check));
    -  ASSERT(0 == uv_tcp_connect(&tcp_check_req,
    -                             &tcp_check,
    -                             (const struct sockaddr*) &addr,
    -                             connect_cb));
    -  ASSERT(0 == uv_read_start((uv_stream_t*) &tcp_check, alloc_cb, read_cb));
    +  ASSERT_OK(uv_tcp_init(loop, &tcp_check));
    +  ASSERT_OK(uv_tcp_connect(&tcp_check_req,
    +                           &tcp_check,
    +                           (const struct sockaddr*) &addr,
    +                           connect_cb));
    +  ASSERT_OK(uv_read_start((uv_stream_t*) &tcp_check, alloc_cb, read_cb));
     }
     
     static void connection_cb(uv_stream_t* server, int status) {
       unsigned int i;
       uv_tcp_t* incoming;
     
    -  ASSERT(server == (uv_stream_t*) &tcp_server);
    +  ASSERT_PTR_EQ(server, (uv_stream_t*) &tcp_server);
     
       /* Ignore tcp_check connection */
       if (got_connections == ARRAY_SIZE(tcp_incoming))
    @@ -126,8 +126,8 @@ static void connection_cb(uv_stream_t* server, int status) {
     
       /* Accept everyone */
       incoming = &tcp_incoming[got_connections++];
    -  ASSERT(0 == uv_tcp_init(server->loop, incoming));
    -  ASSERT(0 == uv_accept(server, (uv_stream_t*) incoming));
    +  ASSERT_OK(uv_tcp_init(server->loop, incoming));
    +  ASSERT_OK(uv_accept(server, (uv_stream_t*) incoming));
     
       if (got_connections != ARRAY_SIZE(tcp_incoming))
         return;
    @@ -135,7 +135,7 @@ static void connection_cb(uv_stream_t* server, int status) {
       /* Once all clients are accepted - start reading */
       for (i = 0; i < ARRAY_SIZE(tcp_incoming); i++) {
         incoming = &tcp_incoming[i];
    -    ASSERT(0 == uv_read_start((uv_stream_t*) incoming, alloc_cb, read_cb));
    +    ASSERT_OK(uv_read_start((uv_stream_t*) incoming, alloc_cb, read_cb));
       }
     }
     
    @@ -162,30 +162,30 @@ TEST_IMPL(tcp_close_accept) {
        */
     
       loop = uv_default_loop();
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
    -  ASSERT(0 == uv_tcp_init(loop, &tcp_server));
    -  ASSERT(0 == uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr, 0));
    -  ASSERT(0 == uv_listen((uv_stream_t*) &tcp_server,
    -                        ARRAY_SIZE(tcp_outgoing),
    -                        connection_cb));
    +  ASSERT_OK(uv_tcp_init(loop, &tcp_server));
    +  ASSERT_OK(uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr, 0));
    +  ASSERT_OK(uv_listen((uv_stream_t*) &tcp_server,
    +                      ARRAY_SIZE(tcp_outgoing),
    +                      connection_cb));
     
       for (i = 0; i < ARRAY_SIZE(tcp_outgoing); i++) {
         client = tcp_outgoing + i;
     
    -    ASSERT(0 == uv_tcp_init(loop, client));
    -    ASSERT(0 == uv_tcp_connect(&connect_reqs[i],
    -                               client,
    -                               (const struct sockaddr*) &addr,
    -                               connect_cb));
    +    ASSERT_OK(uv_tcp_init(loop, client));
    +    ASSERT_OK(uv_tcp_connect(&connect_reqs[i],
    +                             client,
    +                             (const struct sockaddr*) &addr,
    +                             connect_cb));
       }
     
       uv_run(loop, UV_RUN_DEFAULT);
     
    -  ASSERT(ARRAY_SIZE(tcp_outgoing) == got_connections);
    -  ASSERT((ARRAY_SIZE(tcp_outgoing) + 2) == close_cb_called);
    -  ASSERT(ARRAY_SIZE(tcp_outgoing) == write_cb_called);
    -  ASSERT(1 == read_cb_called);
    +  ASSERT_EQ(ARRAY_SIZE(tcp_outgoing), got_connections);
    +  ASSERT_EQ((ARRAY_SIZE(tcp_outgoing) + 2), close_cb_called);
    +  ASSERT_EQ(ARRAY_SIZE(tcp_outgoing), write_cb_called);
    +  ASSERT_EQ(1, read_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-tcp-close-after-read-timeout.c b/deps/uv/test/test-tcp-close-after-read-timeout.c
    index 098e405a87529c..1b81630157d03e 100644
    --- a/deps/uv/test/test-tcp-close-after-read-timeout.c
    +++ b/deps/uv/test/test-tcp-close-after-read-timeout.c
    @@ -48,10 +48,10 @@ static void on_client_connect(uv_connect_t* conn_req, int status) {
       int r;
     
       r = uv_read_start((uv_stream_t*) &client, on_client_alloc, on_client_read);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_timer_start(&timer, on_client_timeout, 1000, 0);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -72,8 +72,8 @@ static void on_client_read(uv_stream_t* stream, ssize_t nread,
     
     
     static void on_client_timeout(uv_timer_t* handle) {
    -  ASSERT_EQ(handle, &timer);
    -  ASSERT_EQ(read_cb_called, 0);
    +  ASSERT_PTR_EQ(handle, &timer);
    +  ASSERT_OK(read_cb_called);
       uv_read_stop((uv_stream_t*) &client);
       uv_close((uv_handle_t*) &client, on_close);
       uv_close((uv_handle_t*) &timer, on_close);
    @@ -101,20 +101,20 @@ static void on_connection_read(uv_stream_t* stream,
     static void on_connection(uv_stream_t* server, int status) {
       int r;
     
    -  ASSERT_EQ(status, 0);
    -  ASSERT_EQ(uv_accept(server, (uv_stream_t*) &connection), 0);
    +  ASSERT_OK(status);
    +  ASSERT_OK(uv_accept(server, (uv_stream_t*) &connection));
     
       r = uv_read_start((uv_stream_t*) &connection,
                         on_connection_alloc,
                         on_connection_read);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     }
     
     
     static void on_close(uv_handle_t* handle) {
    -  ASSERT(handle == (uv_handle_t*) &client ||
    -         handle == (uv_handle_t*) &connection ||
    -         handle == (uv_handle_t*) &timer);
    +  ASSERT_NE(handle == (uv_handle_t*) &client ||
    +            handle == (uv_handle_t*) &connection ||
    +            handle == (uv_handle_t*) &timer, 0);
       on_close_called++;
     }
     
    @@ -123,16 +123,16 @@ static void start_server(uv_loop_t* loop, uv_tcp_t* handle) {
       struct sockaddr_in addr;
       int r;
     
    -  ASSERT_EQ(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr), 0);
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       r = uv_tcp_init(loop, handle);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_bind(handle, (const struct sockaddr*) &addr, 0);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_listen((uv_stream_t*) handle, 128, on_connection);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       uv_unref((uv_handle_t*) handle);
     }
    @@ -147,7 +147,7 @@ TEST_IMPL(tcp_close_after_read_timeout) {
       uv_loop_t* loop;
       int r;
     
    -  ASSERT_EQ(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr), 0);
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       loop = uv_default_loop();
     
    @@ -155,28 +155,28 @@ TEST_IMPL(tcp_close_after_read_timeout) {
       start_server(loop, &tcp_server);
     
       r = uv_tcp_init(loop, &client);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_connect(&connect_req,
                          &client,
                          (const struct sockaddr*) &addr,
                          on_client_connect);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_init(loop, &connection);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_timer_init(loop, &timer);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
    -  ASSERT_EQ(read_cb_called, 0);
    -  ASSERT_EQ(on_close_called, 0);
    +  ASSERT_OK(read_cb_called);
    +  ASSERT_OK(on_close_called);
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
    -  ASSERT_EQ(read_cb_called, 1);
    -  ASSERT_EQ(on_close_called, 3);
    +  ASSERT_EQ(1, read_cb_called);
    +  ASSERT_EQ(3, on_close_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-tcp-close-reset.c b/deps/uv/test/test-tcp-close-reset.c
    index 7415646996cd9f..74941789420f19 100644
    --- a/deps/uv/test/test-tcp-close-reset.c
    +++ b/deps/uv/test/test-tcp-close-reset.c
    @@ -62,7 +62,7 @@ static void do_write(uv_tcp_t* handle) {
       buf = uv_buf_init("PING", 4);
       for (i = 0; i < ARRAY_SIZE(write_reqs); i++) {
         r = uv_write(&write_reqs[i], (uv_stream_t*) handle, &buf, 1, write_cb);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     }
     
    @@ -72,21 +72,25 @@ static void do_close(uv_tcp_t* handle) {
       int r;
     
       if (shutdown_before_close == 1) {
    -    ASSERT(0 == uv_shutdown(&shutdown_req, (uv_stream_t*) handle, shutdown_cb));
    -    ASSERT(UV_EINVAL == uv_tcp_close_reset(handle, close_cb));
    +    ASSERT_OK(uv_shutdown(&shutdown_req,
    +                          (uv_stream_t*) handle,
    +                          shutdown_cb));
    +    ASSERT_EQ(UV_EINVAL, uv_tcp_close_reset(handle, close_cb));
       } else if (shutdown_before_close == 2) {
         r = uv_fileno((const uv_handle_t*) handle, &fd);
    -    ASSERT_EQ(r, 0);
    -    ASSERT_NE(fd, INVALID_FD);
    +    ASSERT_OK(r);
     #ifdef _WIN32
    -    ASSERT_EQ(0, shutdown(fd, SD_BOTH));
    +    ASSERT_PTR_NE(fd, INVALID_FD);
    +    ASSERT_OK(shutdown((SOCKET)fd, SD_BOTH));
     #else
    -    ASSERT_EQ(0, shutdown(fd, SHUT_RDWR));
    +    ASSERT_NE(fd, INVALID_FD);
    +    ASSERT_OK(shutdown(fd, SHUT_RDWR));
     #endif
    -    ASSERT_EQ(0, uv_tcp_close_reset(handle, close_cb));
    +    ASSERT_OK(uv_tcp_close_reset(handle, close_cb));
       } else {
    -    ASSERT(0 == uv_tcp_close_reset(handle, close_cb));
    -    ASSERT(UV_ENOTCONN == uv_shutdown(&shutdown_req, (uv_stream_t*) handle, shutdown_cb));
    +    ASSERT_OK(uv_tcp_close_reset(handle, close_cb));
    +    ASSERT_EQ(UV_ENOTCONN, uv_shutdown(&shutdown_req, (uv_stream_t*) handle,
    +              shutdown_cb));
       }
     
       uv_close((uv_handle_t*) &tcp_server, NULL);
    @@ -99,14 +103,14 @@ static void alloc_cb(uv_handle_t* handle, size_t size, uv_buf_t* buf) {
     }
     
     static void read_cb2(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) {
    -  ASSERT((uv_tcp_t*)stream == &tcp_client);
    +  ASSERT_PTR_EQ((uv_tcp_t*)stream, &tcp_client);
       if (nread == UV_EOF)
         uv_close((uv_handle_t*) stream, NULL);
     }
     
     
     static void connect_cb(uv_connect_t* conn_req, int status) {
    -  ASSERT(conn_req == &connect_req);
    +  ASSERT_PTR_EQ(conn_req, &connect_req);
       uv_read_start((uv_stream_t*) &tcp_client, alloc_cb, read_cb2);
       do_write(&tcp_client);
       if (client_close)
    @@ -116,33 +120,33 @@ static void connect_cb(uv_connect_t* conn_req, int status) {
     
     static void write_cb(uv_write_t* req, int status) {
       /* write callbacks should run before the close callback */
    -  ASSERT(close_cb_called == 0);
    -  ASSERT(req->handle == (uv_stream_t*)&tcp_client);
    +  ASSERT_OK(close_cb_called);
    +  ASSERT_PTR_EQ(req->handle, (uv_stream_t*)&tcp_client);
       write_cb_called++;
     }
     
     
     static void close_cb(uv_handle_t* handle) {
       if (client_close)
    -    ASSERT(handle == (uv_handle_t*) &tcp_client);
    +    ASSERT_PTR_EQ(handle, (uv_handle_t*) &tcp_client);
       else
    -    ASSERT(handle == (uv_handle_t*) &tcp_accepted);
    +    ASSERT_PTR_EQ(handle, (uv_handle_t*) &tcp_accepted);
     
       close_cb_called++;
     }
     
     static void shutdown_cb(uv_shutdown_t* req, int status) {
       if (client_close)
    -    ASSERT(req->handle == (uv_stream_t*) &tcp_client);
    +    ASSERT_PTR_EQ(req->handle, (uv_stream_t*) &tcp_client);
       else
    -    ASSERT(req->handle == (uv_stream_t*) &tcp_accepted);
    +    ASSERT_PTR_EQ(req->handle, (uv_stream_t*) &tcp_accepted);
     
       shutdown_cb_called++;
     }
     
     
     static void read_cb(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) {
    -  ASSERT((uv_tcp_t*)stream == &tcp_accepted);
    +  ASSERT_PTR_EQ((uv_tcp_t*)stream, &tcp_accepted);
       if (nread < 0) {
         uv_close((uv_handle_t*) stream, NULL);
       } else {
    @@ -154,10 +158,10 @@ static void read_cb(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) {
     
     
     static void connection_cb(uv_stream_t* server, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
    -  ASSERT(0 == uv_tcp_init(loop, &tcp_accepted));
    -  ASSERT(0 == uv_accept(server, (uv_stream_t*) &tcp_accepted));
    +  ASSERT_OK(uv_tcp_init(loop, &tcp_accepted));
    +  ASSERT_OK(uv_accept(server, (uv_stream_t*) &tcp_accepted));
     
       uv_read_start((uv_stream_t*) &tcp_accepted, alloc_cb, read_cb);
     }
    @@ -167,16 +171,16 @@ static void start_server(uv_loop_t* loop, uv_tcp_t* handle) {
       struct sockaddr_in addr;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       r = uv_tcp_init(loop, handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_bind(handle, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_listen((uv_stream_t*)handle, 128, connection_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -184,16 +188,16 @@ static void do_connect(uv_loop_t* loop, uv_tcp_t* tcp_client) {
       struct sockaddr_in addr;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       r = uv_tcp_init(loop, tcp_client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_connect(&connect_req,
                          tcp_client,
                          (const struct sockaddr*) &addr,
                          connect_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -212,16 +216,16 @@ TEST_IMPL(tcp_close_reset_client) {
     
       do_connect(loop, &tcp_client);
     
    -  ASSERT(write_cb_called == 0);
    -  ASSERT(close_cb_called == 0);
    -  ASSERT(shutdown_cb_called == 0);
    +  ASSERT_OK(write_cb_called);
    +  ASSERT_OK(close_cb_called);
    +  ASSERT_OK(shutdown_cb_called);
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(write_cb_called == 4);
    -  ASSERT(close_cb_called == 1);
    -  ASSERT(shutdown_cb_called == 0);
    +  ASSERT_EQ(4, write_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
    +  ASSERT_OK(shutdown_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -239,16 +243,16 @@ TEST_IMPL(tcp_close_reset_client_after_shutdown) {
     
       do_connect(loop, &tcp_client);
     
    -  ASSERT(write_cb_called == 0);
    -  ASSERT(close_cb_called == 0);
    -  ASSERT(shutdown_cb_called == 0);
    +  ASSERT_OK(write_cb_called);
    +  ASSERT_OK(close_cb_called);
    +  ASSERT_OK(shutdown_cb_called);
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(write_cb_called == 4);
    -  ASSERT(close_cb_called == 0);
    -  ASSERT(shutdown_cb_called == 1);
    +  ASSERT_EQ(4, write_cb_called);
    +  ASSERT_OK(close_cb_called);
    +  ASSERT_EQ(1, shutdown_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -266,16 +270,16 @@ TEST_IMPL(tcp_close_reset_accepted) {
     
       do_connect(loop, &tcp_client);
     
    -  ASSERT(write_cb_called == 0);
    -  ASSERT(close_cb_called == 0);
    -  ASSERT(shutdown_cb_called == 0);
    +  ASSERT_OK(write_cb_called);
    +  ASSERT_OK(close_cb_called);
    +  ASSERT_OK(shutdown_cb_called);
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(write_cb_called == 4);
    -  ASSERT(close_cb_called == 1);
    -  ASSERT(shutdown_cb_called == 0);
    +  ASSERT_EQ(4, write_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
    +  ASSERT_OK(shutdown_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -293,16 +297,16 @@ TEST_IMPL(tcp_close_reset_accepted_after_shutdown) {
     
       do_connect(loop, &tcp_client);
     
    -  ASSERT(write_cb_called == 0);
    -  ASSERT(close_cb_called == 0);
    -  ASSERT(shutdown_cb_called == 0);
    +  ASSERT_OK(write_cb_called);
    +  ASSERT_OK(close_cb_called);
    +  ASSERT_OK(shutdown_cb_called);
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(write_cb_called == 4);
    -  ASSERT(close_cb_called == 0);
    -  ASSERT(shutdown_cb_called == 1);
    +  ASSERT_EQ(4, write_cb_called);
    +  ASSERT_OK(close_cb_called);
    +  ASSERT_EQ(1, shutdown_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -320,16 +324,16 @@ TEST_IMPL(tcp_close_reset_accepted_after_socket_shutdown) {
     
       do_connect(loop, &tcp_client);
     
    -  ASSERT_EQ(write_cb_called, 0);
    -  ASSERT_EQ(close_cb_called, 0);
    -  ASSERT_EQ(shutdown_cb_called, 0);
    +  ASSERT_OK(write_cb_called);
    +  ASSERT_OK(close_cb_called);
    +  ASSERT_OK(shutdown_cb_called);
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
    -  ASSERT_EQ(write_cb_called, 4);
    -  ASSERT_EQ(close_cb_called, 1);
    -  ASSERT_EQ(shutdown_cb_called, 0);
    +  ASSERT_EQ(4, write_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
    +  ASSERT_OK(shutdown_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-tcp-close-while-connecting.c b/deps/uv/test/test-tcp-close-while-connecting.c
    index 490413891bbc0c..ba5e46901a4302 100644
    --- a/deps/uv/test/test-tcp-close-while-connecting.c
    +++ b/deps/uv/test/test-tcp-close-while-connecting.c
    @@ -69,24 +69,24 @@ TEST_IMPL(tcp_close_while_connecting) {
       int r;
     
       loop = uv_default_loop();
    -  ASSERT(0 == uv_ip4_addr("1.2.3.4", TEST_PORT, &addr));
    -  ASSERT(0 == uv_tcp_init(loop, &tcp_handle));
    +  ASSERT_OK(uv_ip4_addr("1.2.3.4", TEST_PORT, &addr));
    +  ASSERT_OK(uv_tcp_init(loop, &tcp_handle));
       r = uv_tcp_connect(&connect_req,
                          &tcp_handle,
                          (const struct sockaddr*) &addr,
                          connect_cb);
       if (r == UV_ENETUNREACH)
         RETURN_SKIP("Network unreachable.");
    -  ASSERT(r == 0);
    -  ASSERT(0 == uv_timer_init(loop, &timer1_handle));
    -  ASSERT(0 == uv_timer_start(&timer1_handle, timer1_cb, 1, 0));
    -  ASSERT(0 == uv_timer_init(loop, &timer2_handle));
    -  ASSERT(0 == uv_timer_start(&timer2_handle, timer2_cb, 86400 * 1000, 0));
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -
    -  ASSERT(connect_cb_called == 1);
    -  ASSERT(timer1_cb_called == 1);
    -  ASSERT(close_cb_called == 2);
    +  ASSERT_OK(r);
    +  ASSERT_OK(uv_timer_init(loop, &timer1_handle));
    +  ASSERT_OK(uv_timer_start(&timer1_handle, timer1_cb, 1, 0));
    +  ASSERT_OK(uv_timer_init(loop, &timer2_handle));
    +  ASSERT_OK(uv_timer_start(&timer2_handle, timer2_cb, 86400 * 1000, 0));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +
    +  ASSERT_EQ(1, connect_cb_called);
    +  ASSERT_EQ(1, timer1_cb_called);
    +  ASSERT_EQ(2, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
     
    diff --git a/deps/uv/test/test-tcp-close.c b/deps/uv/test/test-tcp-close.c
    index 6879bae20f89ad..ed19da6f783b3e 100644
    --- a/deps/uv/test/test-tcp-close.c
    +++ b/deps/uv/test/test-tcp-close.c
    @@ -49,7 +49,7 @@ static void connect_cb(uv_connect_t* conn_req, int status) {
         ASSERT_NOT_NULL(req);
     
         r = uv_write(req, (uv_stream_t*)&tcp_handle, &buf, 1, write_cb);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     
       uv_close((uv_handle_t*)&tcp_handle, close_cb);
    @@ -58,21 +58,21 @@ static void connect_cb(uv_connect_t* conn_req, int status) {
     
     static void write_cb(uv_write_t* req, int status) {
       /* write callbacks should run before the close callback */
    -  ASSERT(close_cb_called == 0);
    -  ASSERT(req->handle == (uv_stream_t*)&tcp_handle);
    +  ASSERT_OK(close_cb_called);
    +  ASSERT_PTR_EQ(req->handle, (uv_stream_t*)&tcp_handle);
       write_cb_called++;
       free(req);
     }
     
     
     static void close_cb(uv_handle_t* handle) {
    -  ASSERT(handle == (uv_handle_t*)&tcp_handle);
    +  ASSERT_PTR_EQ(handle, (uv_handle_t*)&tcp_handle);
       close_cb_called++;
     }
     
     
     static void connection_cb(uv_stream_t* server, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     }
     
     
    @@ -80,16 +80,16 @@ static void start_server(uv_loop_t* loop, uv_tcp_t* handle) {
       struct sockaddr_in addr;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       r = uv_tcp_init(loop, handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_bind(handle, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_listen((uv_stream_t*)handle, 128, connection_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_unref((uv_handle_t*)handle);
     }
    @@ -104,7 +104,7 @@ TEST_IMPL(tcp_close) {
       uv_loop_t* loop;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       loop = uv_default_loop();
     
    @@ -112,24 +112,24 @@ TEST_IMPL(tcp_close) {
       start_server(loop, &tcp_server);
     
       r = uv_tcp_init(loop, &tcp_handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_connect(&connect_req,
                          &tcp_handle,
                          (const struct sockaddr*) &addr,
                          connect_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(write_cb_called == 0);
    -  ASSERT(close_cb_called == 0);
    +  ASSERT_OK(write_cb_called);
    +  ASSERT_OK(close_cb_called);
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       printf("%d of %d write reqs seen\n", write_cb_called, NUM_WRITE_REQS);
     
    -  ASSERT(write_cb_called == NUM_WRITE_REQS);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(write_cb_called, NUM_WRITE_REQS);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-tcp-connect-error-after-write.c b/deps/uv/test/test-tcp-connect-error-after-write.c
    index 1800b4d6ed06d3..7321259628d5e6 100644
    --- a/deps/uv/test/test-tcp-connect-error-after-write.c
    +++ b/deps/uv/test/test-tcp-connect-error-after-write.c
    @@ -37,14 +37,14 @@ static void close_cb(uv_handle_t* handle) {
     
     
     static void connect_cb(uv_connect_t* req, int status) {
    -  ASSERT(status < 0);
    +  ASSERT_LT(status, 0);
       connect_cb_called++;
       uv_close((uv_handle_t*)req->handle, close_cb);
     }
     
     
     static void write_cb(uv_write_t* req, int status) {
    -  ASSERT(status < 0);
    +  ASSERT_LT(status, 0);
       write_cb_called++;
     }
     
    @@ -67,30 +67,30 @@ TEST_IMPL(tcp_connect_error_after_write) {
       uv_buf_t buf;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
       buf = uv_buf_init("TEST", 4);
     
       r = uv_tcp_init(uv_default_loop(), &conn);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_write(&write_req, (uv_stream_t*)&conn, &buf, 1, write_cb);
    -  ASSERT(r == UV_EBADF);
    +  ASSERT_EQ(r, UV_EBADF);
     
       r = uv_tcp_connect(&connect_req,
                          &conn,
                          (const struct sockaddr*) &addr,
                          connect_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_write(&write_req, (uv_stream_t*)&conn, &buf, 1, write_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(connect_cb_called == 1);
    -  ASSERT(write_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, connect_cb_called);
    +  ASSERT_EQ(1, write_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-tcp-connect-error.c b/deps/uv/test/test-tcp-connect-error.c
    index 9384ebce57c450..ee0f9ee5ce6220 100644
    --- a/deps/uv/test/test-tcp-connect-error.c
    +++ b/deps/uv/test/test-tcp-connect-error.c
    @@ -54,19 +54,19 @@ TEST_IMPL(tcp_connect_error_fault) {
       garbage_addr = (const struct sockaddr_in*) &garbage;
     
       r = uv_tcp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_tcp_connect(&req,
                          &server,
                          (const struct sockaddr*) garbage_addr,
                          connect_cb);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       uv_close((uv_handle_t*)&server, close_cb);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(connect_cb_called == 0);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_OK(connect_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-tcp-connect-timeout.c b/deps/uv/test/test-tcp-connect-timeout.c
    index 4cd83e1d38b58c..4eb834e1afac80 100644
    --- a/deps/uv/test/test-tcp-connect-timeout.c
    +++ b/deps/uv/test/test-tcp-connect-timeout.c
    @@ -38,14 +38,14 @@ static void close_cb(uv_handle_t* handle);
     
     
     static void connect_cb(uv_connect_t* req, int status) {
    -  ASSERT(req == &connect_req);
    -  ASSERT(status == UV_ECANCELED);
    +  ASSERT_PTR_EQ(req, &connect_req);
    +  ASSERT_EQ(status, UV_ECANCELED);
       connect_cb_called++;
     }
     
     
     static void timer_cb(uv_timer_t* handle) {
    -  ASSERT(handle == &timer);
    +  ASSERT_PTR_EQ(handle, &timer);
       uv_close((uv_handle_t*)&conn, close_cb);
       uv_close((uv_handle_t*)&timer, close_cb);
     }
    @@ -64,16 +64,16 @@ TEST_IMPL(tcp_connect_timeout) {
       struct sockaddr_in addr;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("8.8.8.8", 9999, &addr));
    +  ASSERT_OK(uv_ip4_addr("8.8.8.8", 9999, &addr));
     
       r = uv_timer_init(uv_default_loop(), &timer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_timer_start(&timer, timer_cb, 50, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_init(uv_default_loop(), &conn);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_connect(&connect_req,
                          &conn,
    @@ -81,10 +81,10 @@ TEST_IMPL(tcp_connect_timeout) {
                          connect_cb);
       if (r == UV_ENETUNREACH)
         RETURN_SKIP("Network unreachable.");
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -105,7 +105,7 @@ static int is_supported_system(void) {
       int min_semver[3] = {10, 0, 16299};
       int cnt;
       uv_utsname_t uname;
    -  ASSERT_EQ(uv_os_uname(&uname), 0);
    +  ASSERT_OK(uv_os_uname(&uname));
       if (strcmp(uname.sysname, "Windows_NT") == 0) {
         cnt = sscanf(uname.release, "%d.%d.%d", &semver[0], &semver[1], &semver[2]);
         if (cnt != 3) {
    @@ -130,17 +130,17 @@ TEST_IMPL(tcp_local_connect_timeout) {
       if (!is_supported_system()) {
         RETURN_SKIP("Unsupported system");
       }
    -  ASSERT_EQ(0, uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       r = uv_timer_init(uv_default_loop(), &timer);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       /* Give it 1s to timeout. */
       r = uv_timer_start(&timer, timer_cb, 1000, 0);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_init(uv_default_loop(), &conn);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_connect(&connect_req,
                          &conn,
    @@ -148,10 +148,10 @@ TEST_IMPL(tcp_local_connect_timeout) {
                          connect_local_cb);
       if (r == UV_ENETUNREACH)
         RETURN_SKIP("Network unreachable.");
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -168,17 +168,17 @@ TEST_IMPL(tcp6_local_connect_timeout) {
         RETURN_SKIP("IPv6 not supported");
       }
     
    -  ASSERT_EQ(0, uv_ip6_addr("::1", 9999, &addr));
    +  ASSERT_OK(uv_ip6_addr("::1", 9999, &addr));
     
       r = uv_timer_init(uv_default_loop(), &timer);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       /* Give it 1s to timeout. */
       r = uv_timer_start(&timer, timer_cb, 1000, 0);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_init(uv_default_loop(), &conn);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_connect(&connect_req,
                          &conn,
    @@ -186,10 +186,10 @@ TEST_IMPL(tcp6_local_connect_timeout) {
                          connect_local_cb);
       if (r == UV_ENETUNREACH)
         RETURN_SKIP("Network unreachable.");
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-tcp-connect6-error.c b/deps/uv/test/test-tcp-connect6-error.c
    index 8646dd56496eb0..1e6d7c78da999d 100644
    --- a/deps/uv/test/test-tcp-connect6-error.c
    +++ b/deps/uv/test/test-tcp-connect6-error.c
    @@ -49,22 +49,63 @@ TEST_IMPL(tcp_connect6_error_fault) {
       int r;
       uv_connect_t req;
     
    +  if (!can_ipv6())
    +    RETURN_SKIP("IPv6 not supported");
    +
       garbage_addr = (const struct sockaddr_in6*) &garbage;
     
       r = uv_tcp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_tcp_connect(&req,
                          &server,
                          (const struct sockaddr*) garbage_addr,
                          connect_cb);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       uv_close((uv_handle_t*)&server, close_cb);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(connect_cb_called == 0);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_OK(connect_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
    +
    +  MAKE_VALGRIND_HAPPY(uv_default_loop());
    +  return 0;
    +}
    +
    +
    +TEST_IMPL(tcp_connect6_link_local) {
    +  struct sockaddr_in6 addr;
    +  uv_connect_t req;
    +  uv_tcp_t server;
    +
    +  if (!can_ipv6())
    +    RETURN_SKIP("IPv6 not supported");
    +
    +#if defined(__QEMU__)
    +  /* qemu's sockaddr_in6 translation is broken pre-qemu 8.0.0
    +   * when host endianness != guest endiannes.
    +   * Fixed in https://github.com/qemu/qemu/commit/44cf6731d6b.
    +   */
    +  RETURN_SKIP("Test does not currently work in QEMU");
    +#endif  /* defined(__QEMU__) */
    +
    +  ASSERT_OK(uv_ip6_addr("fe80::0bad:babe", 1337, &addr));
    +  ASSERT_OK(uv_tcp_init(uv_default_loop(), &server));
    +
    +  /* We're making two shaky assumptions here:
    +   * 1. There is a network interface that routes IPv6 link-local traffic, and
    +   * 2. There is no firewall rule that blackholes or otherwise hard-kills the
    +   *    connection attempt to the address above, i.e., we don't expect the
    +   *    connect() system call to fail synchronously.
    +   */
    +  ASSERT_OK(uv_tcp_connect(&req,
    +                           &server,
    +                           (struct sockaddr*) &addr,
    +                           connect_cb));
    +
    +  uv_close((uv_handle_t*) &server, NULL);
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-tcp-create-socket-early.c b/deps/uv/test/test-tcp-create-socket-early.c
    index c84882dad216ef..e8c1aaab2765a8 100644
    --- a/deps/uv/test/test-tcp-create-socket-early.c
    +++ b/deps/uv/test/test-tcp-create-socket-early.c
    @@ -32,7 +32,7 @@
     
     
     static void on_connect(uv_connect_t* req, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       uv_close((uv_handle_t*) req->handle, NULL);
     }
     
    @@ -41,16 +41,16 @@ static void on_connection(uv_stream_t* server, int status) {
       uv_tcp_t* handle;
       int r;
     
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
       handle = malloc(sizeof(*handle));
       ASSERT_NOT_NULL(handle);
     
       r = uv_tcp_init_ex(server->loop, handle, AF_INET);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_accept(server, (uv_stream_t*)handle);
    -  ASSERT(r == UV_EBUSY);
    +  ASSERT_EQ(r, UV_EBUSY);
     
       uv_close((uv_handle_t*) server, NULL);
       uv_close((uv_handle_t*) handle, (uv_close_cb)free);
    @@ -61,16 +61,16 @@ static void tcp_listener(uv_loop_t* loop, uv_tcp_t* server) {
       struct sockaddr_in addr;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
     
       r = uv_tcp_init(loop, server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_bind(server, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_listen((uv_stream_t*) server, 128, on_connection);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -78,16 +78,16 @@ static void tcp_connector(uv_loop_t* loop, uv_tcp_t* client, uv_connect_t* req)
       struct sockaddr_in server_addr;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &server_addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &server_addr));
     
       r = uv_tcp_init(loop, client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_connect(req,
                          client,
                          (const struct sockaddr*) &server_addr,
                          on_connect);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -98,32 +98,34 @@ TEST_IMPL(tcp_create_early) {
       uv_os_fd_t fd;
       int r, namelen;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       r = uv_tcp_init_ex(uv_default_loop(), &client, AF_INET);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_fileno((const uv_handle_t*) &client, &fd);
    -  ASSERT(r == 0);
    -  ASSERT(fd != INVALID_FD);
    +  ASSERT_OK(r);
     
       /* Windows returns WSAEINVAL if the socket is not bound */
     #ifndef _WIN32
    +  ASSERT_NE(fd, INVALID_FD);
       namelen = sizeof sockname;
       r = uv_tcp_getsockname(&client, (struct sockaddr*) &sockname, &namelen);
    -  ASSERT(r == 0);
    -  ASSERT(sockname.sin_family == AF_INET);
    +  ASSERT_OK(r);
    +  ASSERT_EQ(sockname.sin_family, AF_INET);
    +#else
    +  ASSERT_PTR_NE(fd, INVALID_FD);
     #endif
     
       r = uv_tcp_bind(&client, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       namelen = sizeof sockname;
       r = uv_tcp_getsockname(&client, (struct sockaddr*) &sockname, &namelen);
    -  ASSERT(r == 0);
    -  ASSERT(memcmp(&addr.sin_addr,
    -                &sockname.sin_addr,
    -                sizeof(addr.sin_addr)) == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(memcmp(&addr.sin_addr,
    +                   &sockname.sin_addr,
    +                   sizeof(addr.sin_addr)));
     
       uv_close((uv_handle_t*) &client, NULL);
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    @@ -142,32 +144,34 @@ TEST_IMPL(tcp_create_early_bad_bind) {
       if (!can_ipv6())
         RETURN_SKIP("IPv6 not supported");
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       r = uv_tcp_init_ex(uv_default_loop(), &client, AF_INET6);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_fileno((const uv_handle_t*) &client, &fd);
    -  ASSERT(r == 0);
    -  ASSERT(fd != INVALID_FD);
    +  ASSERT_OK(r);
     
       /* Windows returns WSAEINVAL if the socket is not bound */
     #ifndef _WIN32
    +  ASSERT_NE(fd, INVALID_FD);
       {
         int namelen;
         struct sockaddr_in6 sockname;
         namelen = sizeof sockname;
         r = uv_tcp_getsockname(&client, (struct sockaddr*) &sockname, &namelen);
    -    ASSERT(r == 0);
    -    ASSERT(sockname.sin6_family == AF_INET6);
    +    ASSERT_OK(r);
    +    ASSERT_EQ(sockname.sin6_family, AF_INET6);
       }
    +#else 
    +  ASSERT_PTR_NE(fd, INVALID_FD);
     #endif
     
       r = uv_tcp_bind(&client, (const struct sockaddr*) &addr, 0);
     #if !defined(_WIN32) && !defined(__CYGWIN__) && !defined(__MSYS__)
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     #else
    -  ASSERT(r == UV_EFAULT);
    +  ASSERT_EQ(r, UV_EFAULT);
     #endif
     
       uv_close((uv_handle_t*) &client, NULL);
    @@ -183,10 +187,10 @@ TEST_IMPL(tcp_create_early_bad_domain) {
       int r;
     
       r = uv_tcp_init_ex(uv_default_loop(), &client, 47);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_tcp_init_ex(uv_default_loop(), &client, 1024);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    diff --git a/deps/uv/test/test-tcp-flags.c b/deps/uv/test/test-tcp-flags.c
    index 6856429aa1dc75..30178d706d9418 100644
    --- a/deps/uv/test/test-tcp-flags.c
    +++ b/deps/uv/test/test-tcp-flags.c
    @@ -34,18 +34,18 @@ TEST_IMPL(tcp_flags) {
       loop = uv_default_loop();
     
       r = uv_tcp_init(loop, &handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_nodelay(&handle, 1);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_keepalive(&handle, 1, 60);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_close((uv_handle_t*)&handle, NULL);
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-tcp-oob.c b/deps/uv/test/test-tcp-oob.c
    index 989454ed8787f9..7962fa93448a20 100644
    --- a/deps/uv/test/test-tcp-oob.c
    +++ b/deps/uv/test/test-tcp-oob.c
    @@ -61,22 +61,22 @@ static void read_cb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) {
     #endif
       uv_os_fd_t fd;
     
    -  ASSERT(nread >= 0);
    -  ASSERT(0 == uv_fileno((uv_handle_t*)handle, &fd));
    -  ASSERT(0 == uv_idle_start(&idle, idle_cb));
    +  ASSERT_GE(nread, 0);
    +  ASSERT_OK(uv_fileno((uv_handle_t*)handle, &fd));
    +  ASSERT_OK(uv_idle_start(&idle, idle_cb));
     
     #ifdef __MVS__
       /* Need to flush out the OOB data. Otherwise, this callback will get
        * triggered on every poll with nread = 0.
        */
    -  ASSERT(-1 != recv(fd, lbuf, sizeof(lbuf), MSG_OOB));
    +  ASSERT_NE(-1, recv(fd, lbuf, sizeof(lbuf), MSG_OOB));
     #endif
     }
     
     
     static void connect_cb(uv_connect_t* req, int status) {
    -  ASSERT(req->handle == (uv_stream_t*) &client_handle);
    -  ASSERT(0 == status);
    +  ASSERT_PTR_EQ(req->handle, (uv_stream_t*) &client_handle);
    +  ASSERT_OK(status);
     }
     
     
    @@ -84,14 +84,14 @@ static void connection_cb(uv_stream_t* handle, int status) {
       int r;
       uv_os_fd_t fd;
     
    -  ASSERT(0 == status);
    -  ASSERT(0 == uv_accept(handle, (uv_stream_t*) &peer_handle));
    -  ASSERT(0 == uv_read_start((uv_stream_t*) &peer_handle, alloc_cb, read_cb));
    +  ASSERT_OK(status);
    +  ASSERT_OK(uv_accept(handle, (uv_stream_t*) &peer_handle));
    +  ASSERT_OK(uv_read_start((uv_stream_t*) &peer_handle, alloc_cb, read_cb));
     
       /* Send some OOB data */
    -  ASSERT(0 == uv_fileno((uv_handle_t*) &client_handle, &fd));
    +  ASSERT_OK(uv_fileno((uv_handle_t*) &client_handle, &fd));
     
    -  ASSERT(0 == uv_stream_set_blocking((uv_stream_t*) &client_handle, 1));
    +  ASSERT_OK(uv_stream_set_blocking((uv_stream_t*) &client_handle, 1));
     
       /* The problem triggers only on a second message, it seem that xnu is not
        * triggering `kevent()` for the first one
    @@ -99,14 +99,14 @@ static void connection_cb(uv_stream_t* handle, int status) {
       do {
         r = send(fd, "hello", 5, MSG_OOB);
       } while (r < 0 && errno == EINTR);
    -  ASSERT(5 == r);
    +  ASSERT_EQ(5, r);
     
       do {
         r = send(fd, "hello", 5, MSG_OOB);
       } while (r < 0 && errno == EINTR);
    -  ASSERT(5 == r);
    +  ASSERT_EQ(5, r);
     
    -  ASSERT(0 == uv_stream_set_blocking((uv_stream_t*) &client_handle, 0));
    +  ASSERT_OK(uv_stream_set_blocking((uv_stream_t*) &client_handle, 0));
     }
     
     
    @@ -114,26 +114,26 @@ TEST_IMPL(tcp_oob) {
       struct sockaddr_in addr;
       uv_loop_t* loop;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
       loop = uv_default_loop();
     
    -  ASSERT(0 == uv_tcp_init(loop, &server_handle));
    -  ASSERT(0 == uv_tcp_init(loop, &client_handle));
    -  ASSERT(0 == uv_tcp_init(loop, &peer_handle));
    -  ASSERT(0 == uv_idle_init(loop, &idle));
    -  ASSERT(0 == uv_tcp_bind(&server_handle, (const struct sockaddr*) &addr, 0));
    -  ASSERT(0 == uv_listen((uv_stream_t*) &server_handle, 1, connection_cb));
    +  ASSERT_OK(uv_tcp_init(loop, &server_handle));
    +  ASSERT_OK(uv_tcp_init(loop, &client_handle));
    +  ASSERT_OK(uv_tcp_init(loop, &peer_handle));
    +  ASSERT_OK(uv_idle_init(loop, &idle));
    +  ASSERT_OK(uv_tcp_bind(&server_handle, (const struct sockaddr*) &addr, 0));
    +  ASSERT_OK(uv_listen((uv_stream_t*) &server_handle, 1, connection_cb));
     
       /* Ensure two separate packets */
    -  ASSERT(0 == uv_tcp_nodelay(&client_handle, 1));
    +  ASSERT_OK(uv_tcp_nodelay(&client_handle, 1));
     
    -  ASSERT(0 == uv_tcp_connect(&connect_req,
    -                             &client_handle,
    -                             (const struct sockaddr*) &addr,
    -                             connect_cb));
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_tcp_connect(&connect_req,
    +                           &client_handle,
    +                           (const struct sockaddr*) &addr,
    +                           connect_cb));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
     
    -  ASSERT(ticks == kMaxTicks);
    +  ASSERT_EQ(ticks, kMaxTicks);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-tcp-open.c b/deps/uv/test/test-tcp-open.c
    index b5c5621a793679..3fbcf2a5f23c83 100644
    --- a/deps/uv/test/test-tcp-open.c
    +++ b/deps/uv/test/test-tcp-open.c
    @@ -46,7 +46,7 @@ static void startup(void) {
     #ifdef _WIN32
         struct WSAData wsa_data;
         int r = WSAStartup(MAKEWORD(2, 2), &wsa_data);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     #endif
     }
     
    @@ -56,9 +56,9 @@ static uv_os_sock_t create_tcp_socket(void) {
     
       sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
     #ifdef _WIN32
    -  ASSERT(sock != INVALID_SOCKET);
    +  ASSERT_NE(sock, INVALID_SOCKET);
     #else
    -  ASSERT(sock >= 0);
    +  ASSERT_GE(sock, 0);
     #endif
     
     #ifndef _WIN32
    @@ -66,7 +66,7 @@ static uv_os_sock_t create_tcp_socket(void) {
         /* Allow reuse of the port. */
         int yes = 1;
         int r = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     #endif
     
    @@ -81,7 +81,7 @@ static void close_socket(uv_os_sock_t sock) {
     #else
       r = close(sock);
     #endif
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -89,7 +89,7 @@ static void alloc_cb(uv_handle_t* handle,
                          size_t suggested_size,
                          uv_buf_t* buf) {
       static char slab[65536];
    -  ASSERT(suggested_size <= sizeof(slab));
    +  ASSERT_LE(suggested_size, sizeof(slab));
       buf->base = slab;
       buf->len = sizeof(slab);
     }
    @@ -102,8 +102,8 @@ static void close_cb(uv_handle_t* handle) {
     
     
     static void shutdown_cb(uv_shutdown_t* req, int status) {
    -  ASSERT(req == &shutdown_req);
    -  ASSERT(status == 0);
    +  ASSERT_PTR_EQ(req, &shutdown_req);
    +  ASSERT_OK(status);
     
       /* Now we wait for the EOF */
       shutdown_cb_called++;
    @@ -114,11 +114,11 @@ static void read_cb(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf) {
       ASSERT_NOT_NULL(tcp);
     
       if (nread >= 0) {
    -    ASSERT(nread == 4);
    -    ASSERT(memcmp("PING", buf->base, nread) == 0);
    +    ASSERT_EQ(4, nread);
    +    ASSERT_OK(memcmp("PING", buf->base, nread));
       }
       else {
    -    ASSERT(nread == UV_EOF);
    +    ASSERT_EQ(nread, UV_EOF);
         uv_close((uv_handle_t*)tcp, close_cb);
       }
     }
    @@ -130,9 +130,9 @@ static void read1_cb(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf) {
     
       if (nread >= 0) {
         for (i = 0; i < nread; ++i)
    -      ASSERT(buf->base[i] == 'P');
    +      ASSERT_EQ(buf->base[i], 'P');
       } else {
    -    ASSERT(nread == UV_EOF);
    +    ASSERT_EQ(nread, UV_EOF);
         printf("GOT EOF\n");
         uv_close((uv_handle_t*)tcp, close_cb);
       }
    @@ -166,7 +166,7 @@ static void write1_cb(uv_write_t* req, int status) {
     
       buf = uv_buf_init("P", 1);
       r = uv_write(&write_req, req->handle, &buf, 1, write1_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       write_cb_called++;
     }
    @@ -177,7 +177,7 @@ static void timer_cb(uv_timer_t* handle) {
     
       /* Shutdown on drain. */
       r = uv_shutdown(&shutdown_req, (uv_stream_t*) &client, shutdown_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       shutdown_requested++;
     }
     
    @@ -187,22 +187,22 @@ static void connect_cb(uv_connect_t* req, int status) {
       uv_stream_t* stream;
       int r;
     
    -  ASSERT(req == &connect_req);
    -  ASSERT(status == 0);
    +  ASSERT_PTR_EQ(req, &connect_req);
    +  ASSERT_OK(status);
     
       stream = req->handle;
       connect_cb_called++;
     
       r = uv_write(&write_req, stream, &buf, 1, write_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Shutdown on drain. */
       r = uv_shutdown(&shutdown_req, stream, shutdown_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Start reading */
       r = uv_read_start(stream, alloc_cb, read_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -211,25 +211,25 @@ static void connect1_cb(uv_connect_t* req, int status) {
       uv_stream_t* stream;
       int r;
     
    -  ASSERT(req == &connect_req);
    -  ASSERT(status == 0);
    +  ASSERT_PTR_EQ(req, &connect_req);
    +  ASSERT_OK(status);
     
       stream = req->handle;
       connect_cb_called++;
     
       r = uv_timer_init(uv_default_loop(), &tm);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_timer_start(&tm, timer_cb, 2000, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       buf = uv_buf_init("P", 1);
       r = uv_write(&write_req, stream, &buf, 1, write1_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Start reading */
       r = uv_read_start(stream, alloc_cb, read1_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -239,30 +239,30 @@ TEST_IMPL(tcp_open) {
       int r;
       uv_tcp_t client2;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       startup();
       sock = create_tcp_socket();
     
       r = uv_tcp_init(uv_default_loop(), &client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_open(&client, sock);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_connect(&connect_req,
                          &client,
                          (const struct sockaddr*) &addr,
                          connect_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
     #ifndef _WIN32
       {
         r = uv_tcp_init(uv_default_loop(), &client2);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
         r = uv_tcp_open(&client2, sock);
    -    ASSERT(r == UV_EEXIST);
    +    ASSERT_EQ(r, UV_EEXIST);
     
         uv_close((uv_handle_t*) &client2, NULL);
       }
    @@ -272,10 +272,10 @@ TEST_IMPL(tcp_open) {
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(shutdown_cb_called == 1);
    -  ASSERT(connect_cb_called == 1);
    -  ASSERT(write_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, shutdown_cb_called);
    +  ASSERT_EQ(1, connect_cb_called);
    +  ASSERT_EQ(1, write_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -292,13 +292,13 @@ TEST_IMPL(tcp_open_twice) {
       sock2 = create_tcp_socket();
     
       r = uv_tcp_init(uv_default_loop(), &client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_open(&client, sock1);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_open(&client, sock2);
    -  ASSERT(r == UV_EBUSY);
    +  ASSERT_EQ(r, UV_EBUSY);
       close_socket(sock2);
     
       uv_close((uv_handle_t*) &client, NULL);
    @@ -317,15 +317,15 @@ TEST_IMPL(tcp_open_bound) {
       startup();
       sock = create_tcp_socket();
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
    -  ASSERT(0 == uv_tcp_init(uv_default_loop(), &server));
    +  ASSERT_OK(uv_tcp_init(uv_default_loop(), &server));
     
    -  ASSERT(0 == bind(sock, (struct sockaddr*) &addr, sizeof(addr)));
    +  ASSERT_OK(bind(sock, (struct sockaddr*) &addr, sizeof(addr)));
     
    -  ASSERT(0 == uv_tcp_open(&server, sock));
    +  ASSERT_OK(uv_tcp_open(&server, sock));
     
    -  ASSERT(0 == uv_listen((uv_stream_t*) &server, 128, NULL));
    +  ASSERT_OK(uv_listen((uv_stream_t*) &server, 128, NULL));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -338,28 +338,34 @@ TEST_IMPL(tcp_open_connected) {
       uv_os_sock_t sock;
       uv_buf_t buf = uv_buf_init("PING", 4);
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       startup();
       sock = create_tcp_socket();
     
    -  ASSERT(0 == connect(sock, (struct sockaddr*) &addr,  sizeof(addr)));
    +  ASSERT_OK(connect(sock, (struct sockaddr*) &addr,  sizeof(addr)));
     
    -  ASSERT(0 == uv_tcp_init(uv_default_loop(), &client));
    +  ASSERT_OK(uv_tcp_init(uv_default_loop(), &client));
     
    -  ASSERT(0 == uv_tcp_open(&client, sock));
    +  ASSERT_OK(uv_tcp_open(&client, sock));
     
    -  ASSERT(0 == uv_write(&write_req, (uv_stream_t*) &client, &buf, 1, write_cb));
    +  ASSERT_OK(uv_write(&write_req,
    +                     (uv_stream_t*) &client,
    +                     &buf,
    +                     1,
    +                     write_cb));
     
    -  ASSERT(0 == uv_shutdown(&shutdown_req, (uv_stream_t*) &client, shutdown_cb));
    +  ASSERT_OK(uv_shutdown(&shutdown_req,
    +                        (uv_stream_t*) &client,
    +                        shutdown_cb));
     
    -  ASSERT(0 == uv_read_start((uv_stream_t*) &client, alloc_cb, read_cb));
    +  ASSERT_OK(uv_read_start((uv_stream_t*) &client, alloc_cb, read_cb));
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(shutdown_cb_called == 1);
    -  ASSERT(write_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, shutdown_cb_called);
    +  ASSERT_EQ(1, write_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -371,30 +377,30 @@ TEST_IMPL(tcp_write_ready) {
       uv_os_sock_t sock;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       startup();
       sock = create_tcp_socket();
     
       r = uv_tcp_init(uv_default_loop(), &client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_open(&client, sock);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_connect(&connect_req,
                          &client,
                          (const struct sockaddr*) &addr,
                          connect1_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(shutdown_cb_called == 1);
    -  ASSERT(shutdown_requested == 1);
    -  ASSERT(connect_cb_called == 1);
    -  ASSERT(write_cb_called > 0);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, shutdown_cb_called);
    +  ASSERT_EQ(1, shutdown_requested);
    +  ASSERT_EQ(1, connect_cb_called);
    +  ASSERT_GT(write_cb_called, 0);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-tcp-read-stop-start.c b/deps/uv/test/test-tcp-read-stop-start.c
    index 9be12bb75b0b34..68d6f7c2ab5855 100644
    --- a/deps/uv/test/test-tcp-read-stop-start.c
    +++ b/deps/uv/test/test-tcp-read-stop-start.c
    @@ -33,14 +33,14 @@ static uv_connect_t connect_req;
     static void on_read2(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf);
     
     static void on_write_close_immediately(uv_write_t* req, int status) {
    -  ASSERT(0 == status);
    +  ASSERT_OK(status);
     
       uv_close((uv_handle_t*)req->handle, NULL); /* Close immediately */
       free(req);
     }
     
     static void on_write(uv_write_t* req, int status) {
    -  ASSERT(0 == status);
    +  ASSERT_OK(status);
     
       free(req);
     }
    @@ -50,7 +50,7 @@ static void do_write(uv_stream_t* stream, uv_write_cb cb) {
       uv_buf_t buf;
       buf.base = "1234578";
       buf.len = 8;
    -  ASSERT(0 == uv_write(req, stream, &buf, 1, cb));
    +  ASSERT_OK(uv_write(req, stream, &buf, 1, cb));
     }
     
     static void on_alloc(uv_handle_t* handle,
    @@ -62,22 +62,22 @@ static void on_alloc(uv_handle_t* handle,
     }
     
     static void on_read1(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) {
    -  ASSERT(nread >= 0);
    +  ASSERT_GE(nread, 0);
     
       /* Do write on a half open connection to force WSAECONNABORTED (on Windows)
        * in the subsequent uv_read_start()
        */
       do_write(stream, on_write);
     
    -  ASSERT(0 == uv_read_stop(stream));
    +  ASSERT_OK(uv_read_stop(stream));
     
    -  ASSERT(0 == uv_read_start(stream, on_alloc, on_read2));
    +  ASSERT_OK(uv_read_start(stream, on_alloc, on_read2));
     
       read_cb_called++;
     }
     
     static void on_read2(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) {
    -  ASSERT(nread < 0);
    +  ASSERT_LT(nread, 0);
     
       uv_close((uv_handle_t*)stream, NULL);
       uv_close((uv_handle_t*)&server, NULL);
    @@ -86,17 +86,17 @@ static void on_read2(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) {
     }
     
     static void on_connection(uv_stream_t* server, int status) {
    -  ASSERT(0 == status);
    +  ASSERT_OK(status);
     
    -  ASSERT(0 == uv_tcp_init(server->loop, &connection));
    +  ASSERT_OK(uv_tcp_init(server->loop, &connection));
     
    -  ASSERT(0 == uv_accept(server, (uv_stream_t* )&connection));
    +  ASSERT_OK(uv_accept(server, (uv_stream_t* )&connection));
     
    -  ASSERT(0 == uv_read_start((uv_stream_t*)&connection, on_alloc, on_read1));
    +  ASSERT_OK(uv_read_start((uv_stream_t*)&connection, on_alloc, on_read1));
     }
     
     static void on_connect(uv_connect_t* req, int status) {
    -  ASSERT(0 == status);
    +  ASSERT_OK(status);
     
       do_write((uv_stream_t*)&client, on_write_close_immediately);
     }
    @@ -107,29 +107,29 @@ TEST_IMPL(tcp_read_stop_start) {
       { /* Server */
         struct sockaddr_in addr;
     
    -    ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +    ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
     
    -    ASSERT(0 == uv_tcp_init(loop, &server));
    +    ASSERT_OK(uv_tcp_init(loop, &server));
     
    -    ASSERT(0 == uv_tcp_bind(&server, (struct sockaddr*) & addr, 0));
    +    ASSERT_OK(uv_tcp_bind(&server, (struct sockaddr*) & addr, 0));
     
    -    ASSERT(0 == uv_listen((uv_stream_t*)&server, 10, on_connection));
    +    ASSERT_OK(uv_listen((uv_stream_t*)&server, 10, on_connection));
       }
     
       { /* Client */
         struct sockaddr_in addr;
     
    -    ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +    ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
    -    ASSERT(0 == uv_tcp_init(loop, &client));
    +    ASSERT_OK(uv_tcp_init(loop, &client));
     
    -    ASSERT(0 == uv_tcp_connect(&connect_req, &client,
    -                               (const struct sockaddr*) & addr, on_connect));
    +    ASSERT_OK(uv_tcp_connect(&connect_req, &client,
    +                             (const struct sockaddr*) & addr, on_connect));
       }
     
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
     
    -  ASSERT(read_cb_called >= 2);
    +  ASSERT_GE(read_cb_called, 2);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-tcp-read-stop.c b/deps/uv/test/test-tcp-read-stop.c
    index 1754876d4f1263..114c5ec135a82e 100644
    --- a/deps/uv/test/test-tcp-read-stop.c
    +++ b/deps/uv/test/test-tcp-read-stop.c
    @@ -40,21 +40,21 @@ static void write_cb(uv_write_t* req, int status) {
     
     static void timer_cb(uv_timer_t* handle) {
       uv_buf_t buf = uv_buf_init("PING", 4);
    -  ASSERT(0 == uv_write(&write_req,
    -                       (uv_stream_t*) &tcp_handle,
    -                       &buf,
    -                       1,
    -                       write_cb));
    -  ASSERT(0 == uv_read_stop((uv_stream_t*) &tcp_handle));
    +  ASSERT_OK(uv_write(&write_req,
    +                     (uv_stream_t*) &tcp_handle,
    +                     &buf,
    +                     1,
    +                     write_cb));
    +  ASSERT_OK(uv_read_stop((uv_stream_t*) &tcp_handle));
     }
     
     
     static void connect_cb(uv_connect_t* req, int status) {
    -  ASSERT(0 == status);
    -  ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, 50, 0));
    -  ASSERT(0 == uv_read_start((uv_stream_t*) &tcp_handle,
    -                            (uv_alloc_cb) fail_cb,
    -                            (uv_read_cb) fail_cb));
    +  ASSERT_OK(status);
    +  ASSERT_OK(uv_timer_start(&timer_handle, timer_cb, 50, 0));
    +  ASSERT_OK(uv_read_start((uv_stream_t*) &tcp_handle,
    +                          (uv_alloc_cb) fail_cb,
    +                          (uv_read_cb) fail_cb));
     }
     
     
    @@ -62,14 +62,14 @@ TEST_IMPL(tcp_read_stop) {
       uv_connect_t connect_req;
       struct sockaddr_in addr;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    -  ASSERT(0 == uv_timer_init(uv_default_loop(), &timer_handle));
    -  ASSERT(0 == uv_tcp_init(uv_default_loop(), &tcp_handle));
    -  ASSERT(0 == uv_tcp_connect(&connect_req,
    -                             &tcp_handle,
    -                             (const struct sockaddr*) &addr,
    -                             connect_cb));
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_timer_init(uv_default_loop(), &timer_handle));
    +  ASSERT_OK(uv_tcp_init(uv_default_loop(), &tcp_handle));
    +  ASSERT_OK(uv_tcp_connect(&connect_req,
    +                           &tcp_handle,
    +                           (const struct sockaddr*) &addr,
    +                           connect_cb));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
       MAKE_VALGRIND_HAPPY(uv_default_loop());
     
       return 0;
    diff --git a/deps/uv/test/test-tcp-rst.c b/deps/uv/test/test-tcp-rst.c
    index b5d216ce7e8e51..7729f03e607d6a 100644
    --- a/deps/uv/test/test-tcp-rst.c
    +++ b/deps/uv/test/test-tcp-rst.c
    @@ -31,7 +31,7 @@ static int called_close_cb;
     
     
     static void close_cb(uv_handle_t* handle) {
    -  ASSERT(handle == (uv_handle_t*) &tcp);
    +  ASSERT_PTR_EQ(handle, (uv_handle_t*) &tcp);
       called_close_cb++;
     }
     
    @@ -48,7 +48,7 @@ static void read_cb(uv_stream_t* t, ssize_t nread, const uv_buf_t* buf) {
       ASSERT_EQ(nread, UV_ECONNRESET);
     
       int fd;
    -  ASSERT_EQ(0, uv_fileno((uv_handle_t*) t, &fd));
    +  ASSERT_OK(uv_fileno((uv_handle_t*) t, &fd));
       uv_handle_type type = uv_guess_handle(fd);
       ASSERT_EQ(type, UV_TCP);
     
    @@ -58,11 +58,11 @@ static void read_cb(uv_stream_t* t, ssize_t nread, const uv_buf_t* buf) {
     
     
     static void connect_cb(uv_connect_t *req, int status) {
    -  ASSERT_EQ(status, 0);
    +  ASSERT_OK(status);
       ASSERT_PTR_EQ(req, &connect_req);
     
       /* Start reading from the connection so we receive the RST in uv__read. */
    -  ASSERT_EQ(0, uv_read_start((uv_stream_t*) &tcp, alloc_cb, read_cb));
    +  ASSERT_OK(uv_read_start((uv_stream_t*) &tcp, alloc_cb, read_cb));
     
       /* Write 'QSH' to receive RST from the echo server. */
       ASSERT_EQ(qbuf.len, uv_try_write((uv_stream_t*) &tcp, &qbuf, 1));
    @@ -86,21 +86,21 @@ TEST_IMPL(tcp_rst) {
       qbuf.base = "QSH";
       qbuf.len = 3;
     
    -  ASSERT_EQ(0, uv_ip4_addr("127.0.0.1", TEST_PORT, &server_addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &server_addr));
       r = uv_tcp_init(uv_default_loop(), &tcp);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_connect(&connect_req,
                          &tcp,
                          (const struct sockaddr*) &server_addr,
                          connect_cb);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT_EQ(called_alloc_cb, 1);
    -  ASSERT_EQ(called_connect_cb, 1);
    -  ASSERT_EQ(called_close_cb, 1);
    +  ASSERT_EQ(1, called_alloc_cb);
    +  ASSERT_EQ(1, called_connect_cb);
    +  ASSERT_EQ(1, called_close_cb);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-tcp-shutdown-after-write.c b/deps/uv/test/test-tcp-shutdown-after-write.c
    index d2401e8fdb36f6..cd8c24dd66b089 100644
    --- a/deps/uv/test/test-tcp-shutdown-after-write.c
    +++ b/deps/uv/test/test-tcp-shutdown-after-write.c
    @@ -66,10 +66,10 @@ static void timer_cb(uv_timer_t* handle) {
     
       buf = uv_buf_init("TEST", 4);
       r = uv_write(&write_req, (uv_stream_t*)&conn, &buf, 1, write_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_shutdown(&shutdown_req, (uv_stream_t*)&conn, shutdown_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -80,22 +80,22 @@ static void read_cb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) {
     static void connect_cb(uv_connect_t* req, int status) {
       int r;
     
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       connect_cb_called++;
     
       r = uv_read_start((uv_stream_t*)&conn, alloc_cb, read_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
     static void write_cb(uv_write_t* req, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       write_cb_called++;
     }
     
     
     static void shutdown_cb(uv_shutdown_t* req, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       shutdown_cb_called++;
       uv_close((uv_handle_t*)&conn, close_cb);
     }
    @@ -106,32 +106,32 @@ TEST_IMPL(tcp_shutdown_after_write) {
       uv_loop_t* loop;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
       loop = uv_default_loop();
     
       r = uv_timer_init(loop, &timer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_timer_start(&timer, timer_cb, 125, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_init(loop, &conn);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_connect(&connect_req,
                          &conn,
                          (const struct sockaddr*) &addr,
                          connect_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(connect_cb_called == 1);
    -  ASSERT(write_cb_called == 1);
    -  ASSERT(shutdown_cb_called == 1);
    -  ASSERT(conn_close_cb_called == 1);
    -  ASSERT(timer_close_cb_called == 1);
    +  ASSERT_EQ(1, connect_cb_called);
    +  ASSERT_EQ(1, write_cb_called);
    +  ASSERT_EQ(1, shutdown_cb_called);
    +  ASSERT_EQ(1, conn_close_cb_called);
    +  ASSERT_EQ(1, timer_close_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-tcp-try-write-error.c b/deps/uv/test/test-tcp-try-write-error.c
    index 97deccaa0dd7eb..80a23ed73793d6 100644
    --- a/deps/uv/test/test-tcp-try-write-error.c
    +++ b/deps/uv/test/test-tcp-try-write-error.c
    @@ -49,21 +49,21 @@ static void incoming_close_cb(uv_handle_t* handle) {
         r = uv_try_write((uv_stream_t*) &client, &buf, 1);
       fprintf(stderr, "uv_try_write error: %d %s\n", r, uv_strerror(r));
       ASSERT(r == UV_EPIPE || r == UV_ECONNABORTED || r == UV_ECONNRESET);
    -  ASSERT(client.write_queue_size == 0);
    +  ASSERT_OK(client.write_queue_size);
     }
     
     
     static void connect_cb(uv_connect_t* req, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       connect_cb_called++;
     }
     
     
     static void connection_cb(uv_stream_t* tcp, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
    -  ASSERT(0 == uv_tcp_init(tcp->loop, &incoming));
    -  ASSERT(0 == uv_accept(tcp, (uv_stream_t*) &incoming));
    +  ASSERT_OK(uv_tcp_init(tcp->loop, &incoming));
    +  ASSERT_OK(uv_accept(tcp, (uv_stream_t*) &incoming));
     
       connection_cb_called++;
       uv_close((uv_handle_t*) &incoming, incoming_close_cb);
    @@ -74,11 +74,11 @@ static void connection_cb(uv_stream_t* tcp, int status) {
     static void start_server(void) {
       struct sockaddr_in addr;
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
     
    -  ASSERT(0 == uv_tcp_init(uv_default_loop(), &server));
    -  ASSERT(0 == uv_tcp_bind(&server, (struct sockaddr*) &addr, 0));
    -  ASSERT(0 == uv_listen((uv_stream_t*) &server, 128, connection_cb));
    +  ASSERT_OK(uv_tcp_init(uv_default_loop(), &server));
    +  ASSERT_OK(uv_tcp_bind(&server, (struct sockaddr*) &addr, 0));
    +  ASSERT_OK(uv_listen((uv_stream_t*) &server, 128, connection_cb));
     }
     
     
    @@ -88,21 +88,21 @@ TEST_IMPL(tcp_try_write_error) {
     
       start_server();
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
    -  ASSERT(0 == uv_tcp_init(uv_default_loop(), &client));
    -  ASSERT(0 == uv_tcp_connect(&connect_req,
    -                             &client,
    -                             (struct sockaddr*) &addr,
    -                             connect_cb));
    +  ASSERT_OK(uv_tcp_init(uv_default_loop(), &client));
    +  ASSERT_OK(uv_tcp_connect(&connect_req,
    +                           &client,
    +                           (struct sockaddr*) &addr,
    +                           connect_cb));
     
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
       uv_close((uv_handle_t*) &client, close_cb);
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
    -  ASSERT(connect_cb_called == 1);
    -  ASSERT(close_cb_called == 3);
    -  ASSERT(connection_cb_called == 1);
    +  ASSERT_EQ(1, connect_cb_called);
    +  ASSERT_EQ(3, close_cb_called);
    +  ASSERT_EQ(1, connection_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-tcp-try-write.c b/deps/uv/test/test-tcp-try-write.c
    index 6458857a85c879..afb20ec7df66ae 100644
    --- a/deps/uv/test/test-tcp-try-write.c
    +++ b/deps/uv/test/test-tcp-try-write.c
    @@ -46,7 +46,7 @@ static void close_cb(uv_handle_t* handle) {
     static void connect_cb(uv_connect_t* req, int status) {
       int r;
       uv_buf_t buf;
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       connect_cb_called++;
     
       do {
    @@ -87,24 +87,24 @@ static void read_cb(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf) {
     
     
     static void connection_cb(uv_stream_t* tcp, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
    -  ASSERT(0 == uv_tcp_init(tcp->loop, &incoming));
    -  ASSERT(0 == uv_accept(tcp, (uv_stream_t*) &incoming));
    +  ASSERT_OK(uv_tcp_init(tcp->loop, &incoming));
    +  ASSERT_OK(uv_accept(tcp, (uv_stream_t*) &incoming));
     
       connection_cb_called++;
    -  ASSERT(0 == uv_read_start((uv_stream_t*) &incoming, alloc_cb, read_cb));
    +  ASSERT_OK(uv_read_start((uv_stream_t*) &incoming, alloc_cb, read_cb));
     }
     
     
     static void start_server(void) {
       struct sockaddr_in addr;
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
     
    -  ASSERT(0 == uv_tcp_init(uv_default_loop(), &server));
    -  ASSERT(0 == uv_tcp_bind(&server, (struct sockaddr*) &addr, 0));
    -  ASSERT(0 == uv_listen((uv_stream_t*) &server, 128, connection_cb));
    +  ASSERT_OK(uv_tcp_init(uv_default_loop(), &server));
    +  ASSERT_OK(uv_tcp_bind(&server, (struct sockaddr*) &addr, 0));
    +  ASSERT_OK(uv_listen((uv_stream_t*) &server, 128, connection_cb));
     }
     
     
    @@ -114,21 +114,21 @@ TEST_IMPL(tcp_try_write) {
     
       start_server();
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
    -  ASSERT(0 == uv_tcp_init(uv_default_loop(), &client));
    -  ASSERT(0 == uv_tcp_connect(&connect_req,
    -                             &client,
    -                             (struct sockaddr*) &addr,
    -                             connect_cb));
    +  ASSERT_OK(uv_tcp_init(uv_default_loop(), &client));
    +  ASSERT_OK(uv_tcp_connect(&connect_req,
    +                           &client,
    +                           (struct sockaddr*) &addr,
    +                           connect_cb));
     
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
    -  ASSERT(connect_cb_called == 1);
    -  ASSERT(close_cb_called == 3);
    -  ASSERT(connection_cb_called == 1);
    -  ASSERT(bytes_read == bytes_written);
    -  ASSERT(bytes_written > 0);
    +  ASSERT_EQ(1, connect_cb_called);
    +  ASSERT_EQ(3, close_cb_called);
    +  ASSERT_EQ(1, connection_cb_called);
    +  ASSERT_EQ(bytes_read, bytes_written);
    +  ASSERT_GT(bytes_written, 0);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-tcp-unexpected-read.c b/deps/uv/test/test-tcp-unexpected-read.c
    index e11f77473f4030..aef7a2f75d2242 100644
    --- a/deps/uv/test/test-tcp-unexpected-read.c
    +++ b/deps/uv/test/test-tcp-unexpected-read.c
    @@ -60,14 +60,14 @@ static void read_cb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) {
     
     
     static void connect_cb(uv_connect_t* req, int status) {
    -  ASSERT(req->handle == (uv_stream_t*) &client_handle);
    -  ASSERT(0 == status);
    +  ASSERT_PTR_EQ(req->handle, (uv_stream_t*) &client_handle);
    +  ASSERT_OK(status);
     }
     
     
     static void write_cb(uv_write_t* req, int status) {
    -  ASSERT(req->handle == (uv_stream_t*) &peer_handle);
    -  ASSERT(0 == status);
    +  ASSERT_PTR_EQ(req->handle, (uv_stream_t*) &peer_handle);
    +  ASSERT_OK(status);
     }
     
     
    @@ -76,11 +76,11 @@ static void connection_cb(uv_stream_t* handle, int status) {
     
       buf = uv_buf_init("PING", 4);
     
    -  ASSERT(0 == status);
    -  ASSERT(0 == uv_accept(handle, (uv_stream_t*) &peer_handle));
    -  ASSERT(0 == uv_read_start((uv_stream_t*) &peer_handle, alloc_cb, read_cb));
    -  ASSERT(0 == uv_write(&write_req, (uv_stream_t*) &peer_handle,
    -                       &buf, 1, write_cb));
    +  ASSERT_OK(status);
    +  ASSERT_OK(uv_accept(handle, (uv_stream_t*) &peer_handle));
    +  ASSERT_OK(uv_read_start((uv_stream_t*) &peer_handle, alloc_cb, read_cb));
    +  ASSERT_OK(uv_write(&write_req, (uv_stream_t*) &peer_handle,
    +                     &buf, 1, write_cb));
     }
     
     
    @@ -88,29 +88,29 @@ TEST_IMPL(tcp_unexpected_read) {
       struct sockaddr_in addr;
       uv_loop_t* loop;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
       loop = uv_default_loop();
     
    -  ASSERT(0 == uv_timer_init(loop, &timer_handle));
    -  ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, 1000, 0));
    -  ASSERT(0 == uv_check_init(loop, &check_handle));
    -  ASSERT(0 == uv_check_start(&check_handle, check_cb));
    -  ASSERT(0 == uv_tcp_init(loop, &server_handle));
    -  ASSERT(0 == uv_tcp_init(loop, &client_handle));
    -  ASSERT(0 == uv_tcp_init(loop, &peer_handle));
    -  ASSERT(0 == uv_tcp_bind(&server_handle, (const struct sockaddr*) &addr, 0));
    -  ASSERT(0 == uv_listen((uv_stream_t*) &server_handle, 1, connection_cb));
    -  ASSERT(0 == uv_tcp_connect(&connect_req,
    -                             &client_handle,
    -                             (const struct sockaddr*) &addr,
    -                             connect_cb));
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_timer_init(loop, &timer_handle));
    +  ASSERT_OK(uv_timer_start(&timer_handle, timer_cb, 1000, 0));
    +  ASSERT_OK(uv_check_init(loop, &check_handle));
    +  ASSERT_OK(uv_check_start(&check_handle, check_cb));
    +  ASSERT_OK(uv_tcp_init(loop, &server_handle));
    +  ASSERT_OK(uv_tcp_init(loop, &client_handle));
    +  ASSERT_OK(uv_tcp_init(loop, &peer_handle));
    +  ASSERT_OK(uv_tcp_bind(&server_handle, (const struct sockaddr*) &addr, 0));
    +  ASSERT_OK(uv_listen((uv_stream_t*) &server_handle, 1, connection_cb));
    +  ASSERT_OK(uv_tcp_connect(&connect_req,
    +                           &client_handle,
    +                           (const struct sockaddr*) &addr,
    +                           connect_cb));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
     
       /* This is somewhat inexact but the idea is that the event loop should not
        * start busy looping when the server sends a message and the client isn't
        * reading.
        */
    -  ASSERT(ticks <= 20);
    +  ASSERT_LE(ticks, 20);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-tcp-write-after-connect.c b/deps/uv/test/test-tcp-write-after-connect.c
    index 4a786995ff1002..63845bc45258a2 100644
    --- a/deps/uv/test/test-tcp-write-after-connect.c
    +++ b/deps/uv/test/test-tcp-write-after-connect.c
    @@ -32,13 +32,13 @@ uv_buf_t buf = { "HELLO", 4 };
     
     
     static void write_cb(uv_write_t *req, int status) {
    -  ASSERT(status == UV_ECANCELED);
    +  ASSERT_EQ(status, UV_ECANCELED);
       uv_close((uv_handle_t*) req->handle, NULL);
     }
     
     
     static void connect_cb(uv_connect_t *req, int status) {
    -  ASSERT(status == UV_ECONNREFUSED);
    +  ASSERT_EQ(status, UV_ECONNREFUSED);
     }
     
     
    @@ -49,20 +49,20 @@ TEST_IMPL(tcp_write_after_connect) {
     #endif
     
       struct sockaddr_in sa;
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &sa));
    -  ASSERT(0 == uv_loop_init(&loop));
    -  ASSERT(0 == uv_tcp_init(&loop, &tcp_client));
    -
    -  ASSERT(0 == uv_tcp_connect(&connection_request,
    -                             &tcp_client,
    -                             (const struct sockaddr *)
    -                             &sa,
    -                             connect_cb));
    -
    -  ASSERT(0 == uv_write(&write_request,
    -                       (uv_stream_t *)&tcp_client,
    -                       &buf, 1,
    -                       write_cb));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &sa));
    +  ASSERT_OK(uv_loop_init(&loop));
    +  ASSERT_OK(uv_tcp_init(&loop, &tcp_client));
    +
    +  ASSERT_OK(uv_tcp_connect(&connection_request,
    +                           &tcp_client,
    +                           (const struct sockaddr *)
    +                           &sa,
    +                           connect_cb));
    +
    +  ASSERT_OK(uv_write(&write_request,
    +                     (uv_stream_t *)&tcp_client,
    +                     &buf, 1,
    +                     write_cb));
     
       uv_run(&loop, UV_RUN_DEFAULT);
     
    diff --git a/deps/uv/test/test-tcp-write-fail.c b/deps/uv/test/test-tcp-write-fail.c
    index 2912e7c5068586..530329a3ac63c8 100644
    --- a/deps/uv/test/test-tcp-write-fail.c
    +++ b/deps/uv/test/test-tcp-write-fail.c
    @@ -41,13 +41,13 @@ static void close_socket(uv_tcp_t* sock) {
       int r;
     
       r = uv_fileno((uv_handle_t*)sock, &fd);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     #ifdef _WIN32
       r = closesocket((uv_os_sock_t)fd);
     #else
       r = close(fd);
     #endif
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -60,7 +60,7 @@ static void close_cb(uv_handle_t* handle) {
     static void write_cb(uv_write_t* req, int status) {
       ASSERT_NOT_NULL(req);
     
    -  ASSERT(status != 0);
    +  ASSERT(status);
       fprintf(stderr, "uv_write error: %s\n", uv_strerror(status));
       write_cb_called++;
     
    @@ -73,8 +73,8 @@ static void connect_cb(uv_connect_t* req, int status) {
       uv_stream_t* stream;
       int r;
     
    -  ASSERT(req == &connect_req);
    -  ASSERT(status == 0);
    +  ASSERT_PTR_EQ(req, &connect_req);
    +  ASSERT_OK(status);
     
       stream = req->handle;
       connect_cb_called++;
    @@ -84,7 +84,7 @@ static void connect_cb(uv_connect_t* req, int status) {
     
       buf = uv_buf_init("hello\n", 6);
       r = uv_write(&write_req, stream, &buf, 1, write_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -93,22 +93,22 @@ TEST_IMPL(tcp_write_fail) {
       uv_tcp_t client;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       r = uv_tcp_init(uv_default_loop(), &client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_connect(&connect_req,
                          &client,
                          (const struct sockaddr*) &addr,
                          connect_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(connect_cb_called == 1);
    -  ASSERT(write_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, connect_cb_called);
    +  ASSERT_EQ(1, write_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-tcp-write-in-a-row.c b/deps/uv/test/test-tcp-write-in-a-row.c
    index 99f4dee125e1a8..89304eb5a34999 100644
    --- a/deps/uv/test/test-tcp-write-in-a-row.c
    +++ b/deps/uv/test/test-tcp-write-in-a-row.c
    @@ -45,7 +45,7 @@ static void close_cb(uv_handle_t* handle) {
     
     static void write_cb(uv_write_t* w, int status) {
       /* the small write should finish immediately after the big write */
    -  ASSERT_EQ(0, uv_stream_get_write_queue_size((uv_stream_t*) &client));
    +  ASSERT_OK(uv_stream_get_write_queue_size((uv_stream_t*) &client));
     
       write_cb_called++;
     
    @@ -62,13 +62,13 @@ static void connect_cb(uv_connect_t* _, int status) {
       uv_buf_t buf;
       size_t write_queue_size0, write_queue_size1;
     
    -  ASSERT_EQ(0, status);
    +  ASSERT_OK(status);
       connect_cb_called++;
     
       /* fire a big write */
       buf = uv_buf_init(data, sizeof(data));
       r = uv_write(&small_write, (uv_stream_t*) &client, &buf, 1, write_cb);
    -  ASSERT_EQ(0, r);
    +  ASSERT_OK(r);
     
       /* check that the write process gets stuck */
       write_queue_size0 = uv_stream_get_write_queue_size((uv_stream_t*) &client);
    @@ -77,7 +77,7 @@ static void connect_cb(uv_connect_t* _, int status) {
       /* fire a small write, which should be queued */
       buf = uv_buf_init("A", 1);
       r = uv_write(&big_write, (uv_stream_t*) &client, &buf, 1, write_cb);
    -  ASSERT_EQ(0, r);
    +  ASSERT_OK(r);
     
       write_queue_size1 = uv_stream_get_write_queue_size((uv_stream_t*) &client);
       ASSERT_EQ(write_queue_size1, write_queue_size0 + 1);
    @@ -93,22 +93,22 @@ static void alloc_cb(uv_handle_t* handle, size_t size, uv_buf_t* buf) {
     static void read_cb(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf) {}
     
     static void connection_cb(uv_stream_t* tcp, int status) {
    -  ASSERT_EQ(0, status);
    +  ASSERT_OK(status);
       connection_cb_called++;
     
    -  ASSERT_EQ(0, uv_tcp_init(tcp->loop, &incoming));
    -  ASSERT_EQ(0, uv_accept(tcp, (uv_stream_t*) &incoming));
    -  ASSERT_EQ(0, uv_read_start((uv_stream_t*) &incoming, alloc_cb, read_cb));
    +  ASSERT_OK(uv_tcp_init(tcp->loop, &incoming));
    +  ASSERT_OK(uv_accept(tcp, (uv_stream_t*) &incoming));
    +  ASSERT_OK(uv_read_start((uv_stream_t*) &incoming, alloc_cb, read_cb));
     }
     
     static void start_server(void) {
       struct sockaddr_in addr;
     
    -  ASSERT_EQ(0, uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
     
    -  ASSERT_EQ(0, uv_tcp_init(uv_default_loop(), &server));
    -  ASSERT_EQ(0, uv_tcp_bind(&server, (struct sockaddr*) &addr, 0));
    -  ASSERT_EQ(0, uv_listen((uv_stream_t*) &server, 128, connection_cb));
    +  ASSERT_OK(uv_tcp_init(uv_default_loop(), &server));
    +  ASSERT_OK(uv_tcp_bind(&server, (struct sockaddr*) &addr, 0));
    +  ASSERT_OK(uv_listen((uv_stream_t*) &server, 128, connection_cb));
     }
     
     TEST_IMPL(tcp_write_in_a_row) {
    @@ -121,15 +121,15 @@ TEST_IMPL(tcp_write_in_a_row) {
     
       start_server();
     
    -  ASSERT_EQ(0, uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
    -  ASSERT_EQ(0, uv_tcp_init(uv_default_loop(), &client));
    -  ASSERT_EQ(0, uv_tcp_connect(&connect_req,
    -                              &client,
    -                              (struct sockaddr*) &addr,
    -                              connect_cb));
    +  ASSERT_OK(uv_tcp_init(uv_default_loop(), &client));
    +  ASSERT_OK(uv_tcp_connect(&connect_req,
    +                           &client,
    +                           (struct sockaddr*) &addr,
    +                           connect_cb));
     
    -  ASSERT_EQ(0, uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
       ASSERT_EQ(1, connect_cb_called);
       ASSERT_EQ(3, close_cb_called);
    diff --git a/deps/uv/test/test-tcp-write-queue-order.c b/deps/uv/test/test-tcp-write-queue-order.c
    index 7562c41d3de208..e838c88a6a2b55 100644
    --- a/deps/uv/test/test-tcp-write-queue-order.c
    +++ b/deps/uv/test/test-tcp-write-queue-order.c
    @@ -67,7 +67,7 @@ static void connect_cb(uv_connect_t* req, int status) {
       int i;
       uv_buf_t buf;
     
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       connect_cb_called++;
     
       buf = uv_buf_init(base, sizeof(base));
    @@ -78,19 +78,19 @@ static void connect_cb(uv_connect_t* req, int status) {
                      &buf,
                      1,
                      write_cb);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     }
     
     
     static void connection_cb(uv_stream_t* tcp, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
    -  ASSERT(0 == uv_tcp_init(tcp->loop, &incoming));
    -  ASSERT(0 == uv_accept(tcp, (uv_stream_t*) &incoming));
    +  ASSERT_OK(uv_tcp_init(tcp->loop, &incoming));
    +  ASSERT_OK(uv_accept(tcp, (uv_stream_t*) &incoming));
     
    -  ASSERT(0 == uv_timer_init(uv_default_loop(), &timer));
    -  ASSERT(0 == uv_timer_start(&timer, timer_cb, 1000, 0));
    +  ASSERT_OK(uv_timer_init(uv_default_loop(), &timer));
    +  ASSERT_OK(uv_timer_start(&timer, timer_cb, 1000, 0));
     
       connection_cb_called++;
     }
    @@ -99,11 +99,11 @@ static void connection_cb(uv_stream_t* tcp, int status) {
     static void start_server(void) {
       struct sockaddr_in addr;
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
     
    -  ASSERT(0 == uv_tcp_init(uv_default_loop(), &server));
    -  ASSERT(0 == uv_tcp_bind(&server, (struct sockaddr*) &addr, 0));
    -  ASSERT(0 == uv_listen((uv_stream_t*) &server, 128, connection_cb));
    +  ASSERT_OK(uv_tcp_init(uv_default_loop(), &server));
    +  ASSERT_OK(uv_tcp_bind(&server, (struct sockaddr*) &addr, 0));
    +  ASSERT_OK(uv_listen((uv_stream_t*) &server, 128, connection_cb));
     }
     
     
    @@ -114,25 +114,25 @@ TEST_IMPL(tcp_write_queue_order) {
     
       start_server();
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    -
    -  ASSERT(0 == uv_tcp_init(uv_default_loop(), &client));
    -  ASSERT(0 == uv_tcp_connect(&connect_req,
    -                             &client,
    -                             (struct sockaddr*) &addr,
    -                             connect_cb));
    -  ASSERT(0 == uv_send_buffer_size((uv_handle_t*) &client, &buffer_size));
    -
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    -
    -  ASSERT(connect_cb_called == 1);
    -  ASSERT(connection_cb_called == 1);
    -  ASSERT(write_callbacks > 0);
    -  ASSERT(write_cancelled_callbacks > 0);
    -  ASSERT(write_callbacks +
    -         write_error_callbacks +
    -         write_cancelled_callbacks == REQ_COUNT);
    -  ASSERT(close_cb_called == 3);
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +
    +  ASSERT_OK(uv_tcp_init(uv_default_loop(), &client));
    +  ASSERT_OK(uv_tcp_connect(&connect_req,
    +                           &client,
    +                           (struct sockaddr*) &addr,
    +                           connect_cb));
    +  ASSERT_OK(uv_send_buffer_size((uv_handle_t*) &client, &buffer_size));
    +
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +
    +  ASSERT_EQ(1, connect_cb_called);
    +  ASSERT_EQ(1, connection_cb_called);
    +  ASSERT_GT(write_callbacks, 0);
    +  ASSERT_GT(write_cancelled_callbacks, 0);
    +  ASSERT_EQ(write_callbacks +
    +            write_error_callbacks +
    +            write_cancelled_callbacks, REQ_COUNT);
    +  ASSERT_EQ(3, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-tcp-write-to-half-open-connection.c b/deps/uv/test/test-tcp-write-to-half-open-connection.c
    index 8978211d2b7663..2b2f5644e17969 100644
    --- a/deps/uv/test/test-tcp-write-to-half-open-connection.c
    +++ b/deps/uv/test/test-tcp-write-to-half-open-connection.c
    @@ -45,23 +45,23 @@ static void connection_cb(uv_stream_t* server, int status) {
       int r;
       uv_buf_t buf;
     
    -  ASSERT(server == (uv_stream_t*)&tcp_server);
    -  ASSERT(status == 0);
    +  ASSERT_PTR_EQ(server, (uv_stream_t*)&tcp_server);
    +  ASSERT_OK(status);
     
       r = uv_tcp_init(server->loop, &tcp_peer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_accept(server, (uv_stream_t*)&tcp_peer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_read_start((uv_stream_t*)&tcp_peer, alloc_cb, read_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       buf.base = "hello\n";
       buf.len = 6;
     
       r = uv_write(&write_req, (uv_stream_t*)&tcp_peer, &buf, 1, write_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -88,8 +88,8 @@ static void read_cb(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) {
     
     
     static void connect_cb(uv_connect_t* req, int status) {
    -  ASSERT(req == &connect_req);
    -  ASSERT(status == 0);
    +  ASSERT_PTR_EQ(req, &connect_req);
    +  ASSERT_OK(status);
     
       /* Close the client. */
       uv_close((uv_handle_t*)&tcp_client, NULL);
    @@ -97,7 +97,7 @@ static void connect_cb(uv_connect_t* req, int status) {
     
     
     static void write_cb(uv_write_t* req, int status) {
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       write_cb_called++;
     }
     
    @@ -107,34 +107,34 @@ TEST_IMPL(tcp_write_to_half_open_connection) {
       uv_loop_t* loop;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       loop = uv_default_loop();
       ASSERT_NOT_NULL(loop);
     
       r = uv_tcp_init(loop, &tcp_server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_bind(&tcp_server, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_listen((uv_stream_t*)&tcp_server, 1, connection_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_init(loop, &tcp_client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_connect(&connect_req,
                          &tcp_client,
                          (const struct sockaddr*) &addr,
                          connect_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(write_cb_called > 0);
    -  ASSERT(read_cb_called > 0);
    +  ASSERT_GT(write_cb_called, 0);
    +  ASSERT_GT(read_cb_called, 0);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-tcp-writealot.c b/deps/uv/test/test-tcp-writealot.c
    index 3c6c149e92c590..ebafb1796327d3 100644
    --- a/deps/uv/test/test-tcp-writealot.c
    +++ b/deps/uv/test/test-tcp-writealot.c
    @@ -65,19 +65,19 @@ static void close_cb(uv_handle_t* handle) {
     static void shutdown_cb(uv_shutdown_t* req, int status) {
       uv_tcp_t* tcp;
     
    -  ASSERT(req == &shutdown_req);
    -  ASSERT(status == 0);
    +  ASSERT_PTR_EQ(req, &shutdown_req);
    +  ASSERT_OK(status);
     
       tcp = (uv_tcp_t*)(req->handle);
     
       /* The write buffer should be empty by now. */
    -  ASSERT(tcp->write_queue_size == 0);
    +  ASSERT_OK(tcp->write_queue_size);
     
       /* Now we wait for the EOF */
       shutdown_cb_called++;
     
       /* We should have had all the writes called already. */
    -  ASSERT(write_cb_called == WRITES);
    +  ASSERT_EQ(write_cb_called, WRITES);
     }
     
     
    @@ -88,7 +88,7 @@ static void read_cb(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf) {
         bytes_received_done += nread;
       }
       else {
    -    ASSERT(nread == UV_EOF);
    +    ASSERT_EQ(nread, UV_EOF);
         printf("GOT EOF\n");
         uv_close((uv_handle_t*)tcp, close_cb);
       }
    @@ -115,8 +115,8 @@ static void connect_cb(uv_connect_t* req, int status) {
       uv_stream_t* stream;
       int i, j, r;
     
    -  ASSERT(req == &connect_req);
    -  ASSERT(status == 0);
    +  ASSERT_PTR_EQ(req, &connect_req);
    +  ASSERT_OK(status);
     
       stream = req->handle;
       connect_cb_called++;
    @@ -131,16 +131,16 @@ static void connect_cb(uv_connect_t* req, int status) {
         }
     
         r = uv_write(write_req, stream, send_bufs, CHUNKS_PER_WRITE, write_cb);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     
       /* Shutdown on drain. */
       r = uv_shutdown(&shutdown_req, stream, shutdown_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Start reading */
       r = uv_read_start(stream, alloc_cb, read_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -153,29 +153,29 @@ TEST_IMPL(tcp_writealot) {
       RETURN_SKIP("Test is too slow to run under ThreadSanitizer");
     #endif
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       send_buffer = calloc(1, TOTAL_BYTES);
       ASSERT_NOT_NULL(send_buffer);
     
       r = uv_tcp_init(uv_default_loop(), &client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_tcp_connect(&connect_req,
                          &client,
                          (const struct sockaddr*) &addr,
                          connect_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(shutdown_cb_called == 1);
    -  ASSERT(connect_cb_called == 1);
    -  ASSERT(write_cb_called == WRITES);
    -  ASSERT(close_cb_called == 1);
    -  ASSERT(bytes_sent == TOTAL_BYTES);
    -  ASSERT(bytes_sent_done == TOTAL_BYTES);
    -  ASSERT(bytes_received_done == TOTAL_BYTES);
    +  ASSERT_EQ(1, shutdown_cb_called);
    +  ASSERT_EQ(1, connect_cb_called);
    +  ASSERT_EQ(write_cb_called, WRITES);
    +  ASSERT_EQ(1, close_cb_called);
    +  ASSERT_EQ(bytes_sent, TOTAL_BYTES);
    +  ASSERT_EQ(bytes_sent_done, TOTAL_BYTES);
    +  ASSERT_EQ(bytes_received_done, TOTAL_BYTES);
     
       free(send_buffer);
     
    diff --git a/deps/uv/test/test-thread-affinity.c b/deps/uv/test/test-thread-affinity.c
    index 2c9b696ec7a5d2..d21487d9937756 100644
    --- a/deps/uv/test/test-thread-affinity.c
    +++ b/deps/uv/test/test-thread-affinity.c
    @@ -1,4 +1,22 @@
     /* Copyright libuv project contributors. All rights reserved.
    + *
    + * Permission is hereby granted, free of charge, to any person obtaining a copy
    + * of this software and associated documentation files (the "Software"), to
    + * deal in the Software without restriction, including without limitation the
    + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
    + * sell copies of the Software, and to permit persons to whom the Software is
    + * furnished to do so, subject to the following conditions:
    + *
    + * The above copyright notice and this permission notice shall be included in
    + * all copies or substantial portions of the Software.
    + *
    + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
    + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
    + * IN THE SOFTWARE.
      */
     
     #include "uv.h"
    @@ -16,12 +34,12 @@ static void check_affinity(void* arg) {
     
       cpumask = (char*)arg;
       cpumasksize = uv_cpumask_size();
    -  ASSERT(cpumasksize > 0);
    +  ASSERT_GT(cpumasksize, 0);
       tid = uv_thread_self();
       r = uv_thread_setaffinity(&tid, cpumask, NULL, cpumasksize);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_thread_setaffinity(&tid, cpumask + cpumasksize, cpumask, cpumasksize);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -45,13 +63,13 @@ TEST_IMPL(thread_affinity) {
       threads[0] = uv_thread_self();
     #endif
       cpumasksize = uv_cpumask_size();
    -  ASSERT(cpumasksize > 0);
    +  ASSERT_GT(cpumasksize, 0);
     
       cpumask = calloc(4 * cpumasksize, 1);
       ASSERT(cpumask);
     
       r = uv_thread_getaffinity(&threads[0], cpumask, cpumasksize);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       ASSERT(cpumask[0] && "test must be run with cpu 0 affinity");
       ncpus = 0;
       while (cpumask[++ncpus]) { }
    @@ -82,24 +100,24 @@ TEST_IMPL(thread_affinity) {
       }
     #endif
     
    -  ASSERT(0 == uv_thread_create(threads + 1,
    -                               check_affinity,
    -                               &cpumask[t1first]));
    -  ASSERT(0 == uv_thread_create(threads + 2,
    -                               check_affinity,
    -                               &cpumask[t2first]));
    -  ASSERT(0 == uv_thread_join(threads + 1));
    -  ASSERT(0 == uv_thread_join(threads + 2));
    +  ASSERT_OK(uv_thread_create(threads + 1,
    +                             check_affinity,
    +                             &cpumask[t1first]));
    +  ASSERT_OK(uv_thread_create(threads + 2,
    +                             check_affinity,
    +                             &cpumask[t2first]));
    +  ASSERT_OK(uv_thread_join(threads + 1));
    +  ASSERT_OK(uv_thread_join(threads + 2));
     
       ASSERT(cpumask[t1first + 0] == (ncpus == 1));
       ASSERT(cpumask[t1first + 1] == (ncpus >= 2));
    -  ASSERT(cpumask[t1first + 2] == 0);
    +  ASSERT_OK(cpumask[t1first + 2]);
       ASSERT(cpumask[t1first + 3] == (ncpus >= 4));
     
    -  ASSERT(cpumask[t2first + 0] == 1);
    -  ASSERT(cpumask[t2first + 1] == 0);
    +  ASSERT_EQ(1, cpumask[t2first + 0]);
    +  ASSERT_OK(cpumask[t2first + 1]);
       ASSERT(cpumask[t2first + 2] == (ncpus >= 3));
    -  ASSERT(cpumask[t2first + 3] == 0);
    +  ASSERT_OK(cpumask[t2first + 3]);
     
       c = uv_thread_getcpu();
       ASSERT_GE(c, 0);
    @@ -107,16 +125,16 @@ TEST_IMPL(thread_affinity) {
       memset(cpumask, 0, cpumasksize);
       cpumask[c] = 1;
       r = uv_thread_setaffinity(&threads[0], cpumask, NULL, cpumasksize);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       memset(cpumask, 0, cpumasksize);
       r = uv_thread_getaffinity(&threads[0], cpumask, cpumasksize);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
       for (i = 0; i < cpumasksize; i++) {
         if (i == c)
           ASSERT_EQ(1, cpumask[i]);
         else
    -      ASSERT_EQ(0, cpumask[i]);
    +      ASSERT_OK(cpumask[i]);
       }
     
       free(cpumask);
    @@ -129,7 +147,7 @@ TEST_IMPL(thread_affinity) {
     TEST_IMPL(thread_affinity) {
       int cpumasksize;
       cpumasksize = uv_cpumask_size();
    -  ASSERT(cpumasksize == UV_ENOTSUP);
    +  ASSERT_EQ(cpumasksize, UV_ENOTSUP);
       return 0;
     }
     
    diff --git a/deps/uv/test/test-thread-equal.c b/deps/uv/test/test-thread-equal.c
    index f7bde71b3d900e..3b2ba8df4434b5 100644
    --- a/deps/uv/test/test-thread-equal.c
    +++ b/deps/uv/test/test-thread-equal.c
    @@ -31,7 +31,7 @@ static void check_thread(void* arg) {
     #ifdef _WIN32
       ASSERT_NOT_NULL(self_id);
     #endif
    -  ASSERT(uv_thread_equal(&main_thread_id, &self_id) == 0);
    +  ASSERT_OK(uv_thread_equal(&main_thread_id, &self_id));
       *thread_id = uv_thread_self();
     }
     
    @@ -41,11 +41,11 @@ TEST_IMPL(thread_equal) {
     #ifdef _WIN32
       ASSERT_NOT_NULL(main_thread_id);
     #endif
    -  ASSERT(0 != uv_thread_equal(&main_thread_id, &main_thread_id));
    -  ASSERT(0 == uv_thread_create(threads + 0, check_thread, subthreads + 0));
    -  ASSERT(0 == uv_thread_create(threads + 1, check_thread, subthreads + 1));
    -  ASSERT(0 == uv_thread_join(threads + 0));
    -  ASSERT(0 == uv_thread_join(threads + 1));
    -  ASSERT(0 == uv_thread_equal(subthreads + 0, subthreads + 1));
    +  ASSERT_NE(0, uv_thread_equal(&main_thread_id, &main_thread_id));
    +  ASSERT_OK(uv_thread_create(threads + 0, check_thread, subthreads + 0));
    +  ASSERT_OK(uv_thread_create(threads + 1, check_thread, subthreads + 1));
    +  ASSERT_OK(uv_thread_join(threads + 0));
    +  ASSERT_OK(uv_thread_join(threads + 1));
    +  ASSERT_OK(uv_thread_equal(subthreads + 0, subthreads + 1));
       return 0;
     }
    diff --git a/deps/uv/test/test-thread.c b/deps/uv/test/test-thread.c
    index 82f80833ab1690..d0094e304435bb 100644
    --- a/deps/uv/test/test-thread.c
    +++ b/deps/uv/test/test-thread.c
    @@ -71,7 +71,7 @@ static void getaddrinfo_do(struct getaddrinfo_req* req) {
                          "localhost",
                          NULL,
                          NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -80,7 +80,7 @@ static void getaddrinfo_cb(uv_getaddrinfo_t* handle,
                                struct addrinfo* res) {
       struct getaddrinfo_req* req;
     
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
       req = container_of(handle, struct getaddrinfo_req, handle);
       uv_freeaddrinfo(res);
    @@ -94,7 +94,7 @@ static void fs_do(struct fs_req* req) {
       int r;
     
       r = uv_fs_stat(req->loop, &req->handle, ".", fs_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -115,7 +115,7 @@ static void do_work(void* arg) {
       size_t i;
       struct test_thread* thread = arg;
     
    -  ASSERT(0 == uv_loop_init(&loop));
    +  ASSERT_OK(uv_loop_init(&loop));
     
       for (i = 0; i < ARRAY_SIZE(getaddrinfo_reqs); i++) {
         struct getaddrinfo_req* req = getaddrinfo_reqs + i;
    @@ -131,14 +131,14 @@ static void do_work(void* arg) {
         fs_do(req);
       }
     
    -  ASSERT(0 == uv_run(&loop, UV_RUN_DEFAULT));
    -  ASSERT(0 == uv_loop_close(&loop));
    +  ASSERT_OK(uv_run(&loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_loop_close(&loop));
       thread->thread_called = 1;
     }
     
     
     static void thread_entry(void* arg) {
    -  ASSERT(arg == (void *) 42);
    +  ASSERT_PTR_EQ(arg, (void *) 42);
       thread_called++;
     }
     
    @@ -148,12 +148,12 @@ TEST_IMPL(thread_create) {
       int r;
     
       r = uv_thread_create(&tid, thread_entry, (void *) 42);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_thread_join(&tid);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(thread_called == 1);
    +  ASSERT_EQ(1, thread_called);
     
       return 0;
     }
    @@ -176,13 +176,13 @@ TEST_IMPL(threadpool_multiple_event_loops) {
     
       for (i = 0; i < ARRAY_SIZE(threads); i++) {
         r = uv_thread_create(&threads[i].thread_id, do_work, &threads[i]);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     
       for (i = 0; i < ARRAY_SIZE(threads); i++) {
         r = uv_thread_join(&threads[i].thread_id);
    -    ASSERT(r == 0);
    -    ASSERT(threads[i].thread_called == 1);
    +    ASSERT_OK(r);
    +    ASSERT_EQ(1, threads[i].thread_called);
       }
     
       return 0;
    @@ -192,7 +192,7 @@ TEST_IMPL(threadpool_multiple_event_loops) {
     static void tls_thread(void* arg) {
       ASSERT_NULL(uv_key_get(&tls_key));
       uv_key_set(&tls_key, arg);
    -  ASSERT(arg == uv_key_get(&tls_key));
    +  ASSERT_PTR_EQ(arg, uv_key_get(&tls_key));
       uv_key_set(&tls_key, NULL);
       ASSERT_NULL(uv_key_get(&tls_key));
     }
    @@ -201,14 +201,14 @@ static void tls_thread(void* arg) {
     TEST_IMPL(thread_local_storage) {
       char name[] = "main";
       uv_thread_t threads[2];
    -  ASSERT(0 == uv_key_create(&tls_key));
    +  ASSERT_OK(uv_key_create(&tls_key));
       ASSERT_NULL(uv_key_get(&tls_key));
       uv_key_set(&tls_key, name);
    -  ASSERT(name == uv_key_get(&tls_key));
    -  ASSERT(0 == uv_thread_create(threads + 0, tls_thread, threads + 0));
    -  ASSERT(0 == uv_thread_create(threads + 1, tls_thread, threads + 1));
    -  ASSERT(0 == uv_thread_join(threads + 0));
    -  ASSERT(0 == uv_thread_join(threads + 1));
    +  ASSERT_PTR_EQ(name, uv_key_get(&tls_key));
    +  ASSERT_OK(uv_thread_create(threads + 0, tls_thread, threads + 0));
    +  ASSERT_OK(uv_thread_create(threads + 1, tls_thread, threads + 1));
    +  ASSERT_OK(uv_thread_join(threads + 0));
    +  ASSERT_OK(uv_thread_join(threads + 1));
       uv_key_delete(&tls_key);
       return 0;
     }
    @@ -222,30 +222,30 @@ static void thread_check_stack(void* arg) {
        * on MacOS. */
       if (expected == 0)
         expected = 512 * 1024;
    -  ASSERT(pthread_get_stacksize_np(pthread_self()) >= expected);
    +  ASSERT_GE(pthread_get_stacksize_np(pthread_self()), expected);
     #elif defined(__linux__) && defined(__GLIBC__)
       size_t expected;
       struct rlimit lim;
       size_t stack_size;
       pthread_attr_t attr;
    -  ASSERT(0 == getrlimit(RLIMIT_STACK, &lim));
    +  ASSERT_OK(getrlimit(RLIMIT_STACK, &lim));
       if (lim.rlim_cur == RLIM_INFINITY)
         lim.rlim_cur = 2 << 20;  /* glibc default. */
    -  ASSERT(0 == pthread_getattr_np(pthread_self(), &attr));
    -  ASSERT(0 == pthread_attr_getstacksize(&attr, &stack_size));
    +  ASSERT_OK(pthread_getattr_np(pthread_self(), &attr));
    +  ASSERT_OK(pthread_attr_getstacksize(&attr, &stack_size));
       expected = arg == NULL ? 0 : ((uv_thread_options_t*)arg)->stack_size;
       if (expected == 0)
         expected = (size_t)lim.rlim_cur;
    -  ASSERT(stack_size >= expected);
    -  ASSERT(0 == pthread_attr_destroy(&attr));
    +  ASSERT_GE(stack_size, expected);
    +  ASSERT_OK(pthread_attr_destroy(&attr));
     #endif
     }
     
     
     TEST_IMPL(thread_stack_size) {
       uv_thread_t thread;
    -  ASSERT(0 == uv_thread_create(&thread, thread_check_stack, NULL));
    -  ASSERT(0 == uv_thread_join(&thread));
    +  ASSERT_OK(uv_thread_create(&thread, thread_check_stack, NULL));
    +  ASSERT_OK(uv_thread_join(&thread));
       return 0;
     }
     
    @@ -255,42 +255,42 @@ TEST_IMPL(thread_stack_size_explicit) {
     
       options.flags = UV_THREAD_HAS_STACK_SIZE;
       options.stack_size = 1024 * 1024;
    -  ASSERT(0 == uv_thread_create_ex(&thread, &options,
    -                                  thread_check_stack, &options));
    -  ASSERT(0 == uv_thread_join(&thread));
    +  ASSERT_OK(uv_thread_create_ex(&thread, &options,
    +                                thread_check_stack, &options));
    +  ASSERT_OK(uv_thread_join(&thread));
     
       options.stack_size = 8 * 1024 * 1024;  /* larger than most default os sizes */
    -  ASSERT(0 == uv_thread_create_ex(&thread, &options,
    -                                  thread_check_stack, &options));
    -  ASSERT(0 == uv_thread_join(&thread));
    +  ASSERT_OK(uv_thread_create_ex(&thread, &options,
    +                                thread_check_stack, &options));
    +  ASSERT_OK(uv_thread_join(&thread));
     
       options.stack_size = 0;
    -  ASSERT(0 == uv_thread_create_ex(&thread, &options,
    -                                  thread_check_stack, &options));
    -  ASSERT(0 == uv_thread_join(&thread));
    +  ASSERT_OK(uv_thread_create_ex(&thread, &options,
    +                                thread_check_stack, &options));
    +  ASSERT_OK(uv_thread_join(&thread));
     
       options.stack_size = 42;
    -  ASSERT(0 == uv_thread_create_ex(&thread, &options,
    -                                  thread_check_stack, &options));
    -  ASSERT(0 == uv_thread_join(&thread));
    +  ASSERT_OK(uv_thread_create_ex(&thread, &options,
    +                                thread_check_stack, &options));
    +  ASSERT_OK(uv_thread_join(&thread));
     
     #ifdef PTHREAD_STACK_MIN
       options.stack_size = PTHREAD_STACK_MIN - 42;  /* unaligned size */
    -  ASSERT(0 == uv_thread_create_ex(&thread, &options,
    -                                  thread_check_stack, &options));
    -  ASSERT(0 == uv_thread_join(&thread));
    +  ASSERT_OK(uv_thread_create_ex(&thread, &options,
    +                                thread_check_stack, &options));
    +  ASSERT_OK(uv_thread_join(&thread));
     
       options.stack_size = PTHREAD_STACK_MIN / 2 - 42;  /* unaligned size */
    -  ASSERT(0 == uv_thread_create_ex(&thread, &options,
    -                                  thread_check_stack, &options));
    -  ASSERT(0 == uv_thread_join(&thread));
    +  ASSERT_OK(uv_thread_create_ex(&thread, &options,
    +                                thread_check_stack, &options));
    +  ASSERT_OK(uv_thread_join(&thread));
     #endif
     
       /* unaligned size, should be larger than PTHREAD_STACK_MIN */
       options.stack_size = 1234567;
    -  ASSERT(0 == uv_thread_create_ex(&thread, &options,
    -                                  thread_check_stack, &options));
    -  ASSERT(0 == uv_thread_join(&thread));
    +  ASSERT_OK(uv_thread_create_ex(&thread, &options,
    +                                thread_check_stack, &options));
    +  ASSERT_OK(uv_thread_join(&thread));
     
       return 0;
     }
    diff --git a/deps/uv/test/test-threadpool-cancel.c b/deps/uv/test/test-threadpool-cancel.c
    index fed0b07a3ca960..b758ac4f6b66ec 100644
    --- a/deps/uv/test/test-threadpool-cancel.c
    +++ b/deps/uv/test/test-threadpool-cancel.c
    @@ -73,8 +73,8 @@ static void saturate_threadpool(void) {
     
       loop = uv_default_loop();
       for (i = 0; i < ARRAY_SIZE(pause_reqs); i += 1) {
    -    ASSERT(0 == uv_sem_init(pause_sems + i, 0));
    -    ASSERT(0 == uv_queue_work(loop, pause_reqs + i, work_cb, done_cb));
    +    ASSERT_OK(uv_sem_init(pause_sems + i, 0));
    +    ASSERT_OK(uv_queue_work(loop, pause_reqs + i, work_cb, done_cb));
       }
     }
     
    @@ -119,7 +119,8 @@ static int known_broken(uv_req_t* req) {
     
     
     static void fs_cb(uv_fs_t* req) {
    -  ASSERT(known_broken((uv_req_t*) req) || req->result == UV_ECANCELED);
    +  ASSERT_NE(known_broken((uv_req_t*) req) || \
    +      req->result == UV_ECANCELED, 0);
       uv_fs_req_cleanup(req);
       fs_cb_called++;
     }
    @@ -128,7 +129,7 @@ static void fs_cb(uv_fs_t* req) {
     static void getaddrinfo_cb(uv_getaddrinfo_t* req,
                                int status,
                                struct addrinfo* res) {
    -  ASSERT(status == UV_EAI_CANCELED);
    +  ASSERT_EQ(status, UV_EAI_CANCELED);
       ASSERT_NULL(res);
       uv_freeaddrinfo(res);  /* Should not crash. */
     }
    @@ -138,7 +139,7 @@ static void getnameinfo_cb(uv_getnameinfo_t* handle,
                                int status,
                                const char* hostname,
                                const char* service) {
    -  ASSERT(status == UV_EAI_CANCELED);
    +  ASSERT_EQ(status, UV_EAI_CANCELED);
       ASSERT_NULL(hostname);
       ASSERT_NULL(service);
     }
    @@ -150,7 +151,7 @@ static void work2_cb(uv_work_t* req) {
     
     
     static void done2_cb(uv_work_t* req, int status) {
    -  ASSERT(status == UV_ECANCELED);
    +  ASSERT_EQ(status, UV_ECANCELED);
       done2_cb_called++;
     }
     
    @@ -174,7 +175,7 @@ static void timer_cb(uv_timer_t* handle) {
     
     
     static void nop_done_cb(uv_work_t* req, int status) {
    -  ASSERT(status == UV_ECANCELED);
    +  ASSERT_EQ(status, UV_ECANCELED);
       done_cb_called++;
     }
     
    @@ -184,9 +185,9 @@ static void nop_random_cb(uv_random_t* req, int status, void* buf, size_t len) {
     
       ri = container_of(req, struct random_info, random_req);
     
    -  ASSERT(status == UV_ECANCELED);
    -  ASSERT(buf == (void*) ri->buf);
    -  ASSERT(len == sizeof(ri->buf));
    +  ASSERT_EQ(status, UV_ECANCELED);
    +  ASSERT_PTR_EQ(buf, (void*) ri->buf);
    +  ASSERT_EQ(len, sizeof(ri->buf));
     
       done_cb_called++;
     }
    @@ -204,21 +205,21 @@ TEST_IMPL(threadpool_cancel_getaddrinfo) {
       saturate_threadpool();
     
       r = uv_getaddrinfo(loop, reqs + 0, getaddrinfo_cb, "fail", NULL, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_getaddrinfo(loop, reqs + 1, getaddrinfo_cb, NULL, "fail", NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_getaddrinfo(loop, reqs + 2, getaddrinfo_cb, "fail", "fail", NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_getaddrinfo(loop, reqs + 3, getaddrinfo_cb, "fail", NULL, &hints);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(0 == uv_timer_init(loop, &ci.timer_handle));
    -  ASSERT(0 == uv_timer_start(&ci.timer_handle, timer_cb, 10, 0));
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -  ASSERT(1 == timer_cb_called);
    +  ASSERT_OK(uv_timer_init(loop, &ci.timer_handle));
    +  ASSERT_OK(uv_timer_start(&ci.timer_handle, timer_cb, 10, 0));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(1, timer_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -233,28 +234,28 @@ TEST_IMPL(threadpool_cancel_getnameinfo) {
       int r;
     
       r = uv_ip4_addr("127.0.0.1", 80, &addr4);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       INIT_CANCEL_INFO(&ci, reqs);
       loop = uv_default_loop();
       saturate_threadpool();
     
       r = uv_getnameinfo(loop, reqs + 0, getnameinfo_cb, (const struct sockaddr*)&addr4, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_getnameinfo(loop, reqs + 1, getnameinfo_cb, (const struct sockaddr*)&addr4, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_getnameinfo(loop, reqs + 2, getnameinfo_cb, (const struct sockaddr*)&addr4, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_getnameinfo(loop, reqs + 3, getnameinfo_cb, (const struct sockaddr*)&addr4, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(0 == uv_timer_init(loop, &ci.timer_handle));
    -  ASSERT(0 == uv_timer_start(&ci.timer_handle, timer_cb, 10, 0));
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -  ASSERT(1 == timer_cb_called);
    +  ASSERT_OK(uv_timer_init(loop, &ci.timer_handle));
    +  ASSERT_OK(uv_timer_start(&ci.timer_handle, timer_cb, 10, 0));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(1, timer_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -267,17 +268,17 @@ TEST_IMPL(threadpool_cancel_random) {
     
       saturate_threadpool();
       loop = uv_default_loop();
    -  ASSERT(0 == uv_random(loop,
    -                        &req.random_req,
    -                        &req.buf,
    -                        sizeof(req.buf),
    -                        0,
    -                        nop_random_cb));
    -  ASSERT(0 == uv_cancel((uv_req_t*) &req));
    -  ASSERT(0 == done_cb_called);
    +  ASSERT_OK(uv_random(loop,
    +                      &req.random_req,
    +                      &req.buf,
    +                      sizeof(req.buf),
    +                      0,
    +                      nop_random_cb));
    +  ASSERT_OK(uv_cancel((uv_req_t*) &req));
    +  ASSERT_OK(done_cb_called);
       unblock_threadpool();
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -  ASSERT(1 == done_cb_called);
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(1, done_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -295,13 +296,13 @@ TEST_IMPL(threadpool_cancel_work) {
       saturate_threadpool();
     
       for (i = 0; i < ARRAY_SIZE(reqs); i++)
    -    ASSERT(0 == uv_queue_work(loop, reqs + i, work2_cb, done2_cb));
    +    ASSERT_OK(uv_queue_work(loop, reqs + i, work2_cb, done2_cb));
     
    -  ASSERT(0 == uv_timer_init(loop, &ci.timer_handle));
    -  ASSERT(0 == uv_timer_start(&ci.timer_handle, timer_cb, 10, 0));
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -  ASSERT(1 == timer_cb_called);
    -  ASSERT(ARRAY_SIZE(reqs) == done2_cb_called);
    +  ASSERT_OK(uv_timer_init(loop, &ci.timer_handle));
    +  ASSERT_OK(uv_timer_start(&ci.timer_handle, timer_cb, 10, 0));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(1, timer_cb_called);
    +  ASSERT_EQ(ARRAY_SIZE(reqs), done2_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -322,39 +323,39 @@ TEST_IMPL(threadpool_cancel_fs) {
     
       /* Needs to match ARRAY_SIZE(fs_reqs). */
       n = 0;
    -  ASSERT(0 == uv_fs_chmod(loop, reqs + n++, "/", 0, fs_cb));
    -  ASSERT(0 == uv_fs_chown(loop, reqs + n++, "/", 0, 0, fs_cb));
    -  ASSERT(0 == uv_fs_close(loop, reqs + n++, 0, fs_cb));
    -  ASSERT(0 == uv_fs_fchmod(loop, reqs + n++, 0, 0, fs_cb));
    -  ASSERT(0 == uv_fs_fchown(loop, reqs + n++, 0, 0, 0, fs_cb));
    -  ASSERT(0 == uv_fs_fdatasync(loop, reqs + n++, 0, fs_cb));
    -  ASSERT(0 == uv_fs_fstat(loop, reqs + n++, 0, fs_cb));
    -  ASSERT(0 == uv_fs_fsync(loop, reqs + n++, 0, fs_cb));
    -  ASSERT(0 == uv_fs_ftruncate(loop, reqs + n++, 0, 0, fs_cb));
    -  ASSERT(0 == uv_fs_futime(loop, reqs + n++, 0, 0, 0, fs_cb));
    -  ASSERT(0 == uv_fs_link(loop, reqs + n++, "/", "/", fs_cb));
    -  ASSERT(0 == uv_fs_lstat(loop, reqs + n++, "/", fs_cb));
    -  ASSERT(0 == uv_fs_mkdir(loop, reqs + n++, "/", 0, fs_cb));
    -  ASSERT(0 == uv_fs_open(loop, reqs + n++, "/", 0, 0, fs_cb));
    -  ASSERT(0 == uv_fs_read(loop, reqs + n++, -1, &iov, 1, 0, fs_cb));
    -  ASSERT(0 == uv_fs_scandir(loop, reqs + n++, "/", 0, fs_cb));
    -  ASSERT(0 == uv_fs_readlink(loop, reqs + n++, "/", fs_cb));
    -  ASSERT(0 == uv_fs_realpath(loop, reqs + n++, "/", fs_cb));
    -  ASSERT(0 == uv_fs_rename(loop, reqs + n++, "/", "/", fs_cb));
    -  ASSERT(0 == uv_fs_mkdir(loop, reqs + n++, "/", 0, fs_cb));
    -  ASSERT(0 == uv_fs_sendfile(loop, reqs + n++, 0, 0, 0, 0, fs_cb));
    -  ASSERT(0 == uv_fs_stat(loop, reqs + n++, "/", fs_cb));
    -  ASSERT(0 == uv_fs_symlink(loop, reqs + n++, "/", "/", 0, fs_cb));
    -  ASSERT(0 == uv_fs_unlink(loop, reqs + n++, "/", fs_cb));
    -  ASSERT(0 == uv_fs_utime(loop, reqs + n++, "/", 0, 0, fs_cb));
    -  ASSERT(0 == uv_fs_write(loop, reqs + n++, -1, &iov, 1, 0, fs_cb));
    -  ASSERT(n == ARRAY_SIZE(reqs));
    -
    -  ASSERT(0 == uv_timer_init(loop, &ci.timer_handle));
    -  ASSERT(0 == uv_timer_start(&ci.timer_handle, timer_cb, 10, 0));
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -  ASSERT(n == fs_cb_called);
    -  ASSERT(1 == timer_cb_called);
    +  ASSERT_OK(uv_fs_chmod(loop, reqs + n++, "/", 0, fs_cb));
    +  ASSERT_OK(uv_fs_chown(loop, reqs + n++, "/", 0, 0, fs_cb));
    +  ASSERT_OK(uv_fs_close(loop, reqs + n++, 0, fs_cb));
    +  ASSERT_OK(uv_fs_fchmod(loop, reqs + n++, 0, 0, fs_cb));
    +  ASSERT_OK(uv_fs_fchown(loop, reqs + n++, 0, 0, 0, fs_cb));
    +  ASSERT_OK(uv_fs_fdatasync(loop, reqs + n++, 0, fs_cb));
    +  ASSERT_OK(uv_fs_fstat(loop, reqs + n++, 0, fs_cb));
    +  ASSERT_OK(uv_fs_fsync(loop, reqs + n++, 0, fs_cb));
    +  ASSERT_OK(uv_fs_ftruncate(loop, reqs + n++, 0, 0, fs_cb));
    +  ASSERT_OK(uv_fs_futime(loop, reqs + n++, 0, 0, 0, fs_cb));
    +  ASSERT_OK(uv_fs_link(loop, reqs + n++, "/", "/", fs_cb));
    +  ASSERT_OK(uv_fs_lstat(loop, reqs + n++, "/", fs_cb));
    +  ASSERT_OK(uv_fs_mkdir(loop, reqs + n++, "/", 0, fs_cb));
    +  ASSERT_OK(uv_fs_open(loop, reqs + n++, "/", 0, 0, fs_cb));
    +  ASSERT_OK(uv_fs_read(loop, reqs + n++, -1, &iov, 1, 0, fs_cb));
    +  ASSERT_OK(uv_fs_scandir(loop, reqs + n++, "/", 0, fs_cb));
    +  ASSERT_OK(uv_fs_readlink(loop, reqs + n++, "/", fs_cb));
    +  ASSERT_OK(uv_fs_realpath(loop, reqs + n++, "/", fs_cb));
    +  ASSERT_OK(uv_fs_rename(loop, reqs + n++, "/", "/", fs_cb));
    +  ASSERT_OK(uv_fs_mkdir(loop, reqs + n++, "/", 0, fs_cb));
    +  ASSERT_OK(uv_fs_sendfile(loop, reqs + n++, 0, 0, 0, 0, fs_cb));
    +  ASSERT_OK(uv_fs_stat(loop, reqs + n++, "/", fs_cb));
    +  ASSERT_OK(uv_fs_symlink(loop, reqs + n++, "/", "/", 0, fs_cb));
    +  ASSERT_OK(uv_fs_unlink(loop, reqs + n++, "/", fs_cb));
    +  ASSERT_OK(uv_fs_utime(loop, reqs + n++, "/", 0, 0, fs_cb));
    +  ASSERT_OK(uv_fs_write(loop, reqs + n++, -1, &iov, 1, 0, fs_cb));
    +  ASSERT_EQ(n, ARRAY_SIZE(reqs));
    +
    +  ASSERT_OK(uv_timer_init(loop, &ci.timer_handle));
    +  ASSERT_OK(uv_timer_start(&ci.timer_handle, timer_cb, 10, 0));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(n, fs_cb_called);
    +  ASSERT_EQ(1, timer_cb_called);
     
     
       MAKE_VALGRIND_HAPPY(loop);
    @@ -368,12 +369,12 @@ TEST_IMPL(threadpool_cancel_single) {
     
       saturate_threadpool();
       loop = uv_default_loop();
    -  ASSERT(0 == uv_queue_work(loop, &req, (uv_work_cb) abort, nop_done_cb));
    -  ASSERT(0 == uv_cancel((uv_req_t*) &req));
    -  ASSERT(0 == done_cb_called);
    +  ASSERT_OK(uv_queue_work(loop, &req, (uv_work_cb) abort, nop_done_cb));
    +  ASSERT_OK(uv_cancel((uv_req_t*) &req));
    +  ASSERT_OK(done_cb_called);
       unblock_threadpool();
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    -  ASSERT(1 == done_cb_called);
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_EQ(1, done_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -404,7 +405,7 @@ TEST_IMPL(threadpool_cancel_when_busy) {
     
       ASSERT_EQ(uv_cancel((uv_req_t*) &req), UV_EBUSY);
       ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    -  ASSERT_EQ(done_cb_called, 1);
    +  ASSERT_EQ(1, done_cb_called);
     
       uv_sem_destroy(&sem_lock);
     
    diff --git a/deps/uv/test/test-threadpool.c b/deps/uv/test/test-threadpool.c
    index 5254131bce303d..fb5e5732e6aa34 100644
    --- a/deps/uv/test/test-threadpool.c
    +++ b/deps/uv/test/test-threadpool.c
    @@ -29,16 +29,16 @@ static char data;
     
     
     static void work_cb(uv_work_t* req) {
    -  ASSERT(req == &work_req);
    -  ASSERT(req->data == &data);
    +  ASSERT_PTR_EQ(req, &work_req);
    +  ASSERT_PTR_EQ(req->data, &data);
       work_cb_count++;
     }
     
     
     static void after_work_cb(uv_work_t* req, int status) {
    -  ASSERT(status == 0);
    -  ASSERT(req == &work_req);
    -  ASSERT(req->data == &data);
    +  ASSERT_OK(status);
    +  ASSERT_PTR_EQ(req, &work_req);
    +  ASSERT_PTR_EQ(req->data, &data);
       after_work_cb_count++;
     }
     
    @@ -48,11 +48,11 @@ TEST_IMPL(threadpool_queue_work_simple) {
     
       work_req.data = &data;
       r = uv_queue_work(uv_default_loop(), &work_req, work_cb, after_work_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(work_cb_count == 1);
    -  ASSERT(after_work_cb_count == 1);
    +  ASSERT_EQ(1, work_cb_count);
    +  ASSERT_EQ(1, after_work_cb_count);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -64,12 +64,12 @@ TEST_IMPL(threadpool_queue_work_einval) {
     
       work_req.data = &data;
       r = uv_queue_work(uv_default_loop(), &work_req, NULL, after_work_cb);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(work_cb_count == 0);
    -  ASSERT(after_work_cb_count == 0);
    +  ASSERT_OK(work_cb_count);
    +  ASSERT_OK(after_work_cb_count);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-timer-again.c b/deps/uv/test/test-timer-again.c
    index cb298956aa94ac..d7f0b83ab5576f 100644
    --- a/deps/uv/test/test-timer-again.c
    +++ b/deps/uv/test/test-timer-again.c
    @@ -44,8 +44,8 @@ static void close_cb(uv_handle_t* handle) {
     static void repeat_1_cb(uv_timer_t* handle) {
       int r;
     
    -  ASSERT(handle == &repeat_1);
    -  ASSERT(uv_timer_get_repeat((uv_timer_t*)handle) == 50);
    +  ASSERT_PTR_EQ(handle, &repeat_1);
    +  ASSERT_EQ(50, uv_timer_get_repeat((uv_timer_t*)handle));
     
       fprintf(stderr, "repeat_1_cb called after %ld ms\n",
               (long int)(uv_now(uv_default_loop()) - start_time));
    @@ -54,7 +54,7 @@ static void repeat_1_cb(uv_timer_t* handle) {
       repeat_1_cb_called++;
     
       r = uv_timer_again(&repeat_2);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       if (repeat_1_cb_called == 10) {
         uv_close((uv_handle_t*)handle, close_cb);
    @@ -67,7 +67,7 @@ static void repeat_1_cb(uv_timer_t* handle) {
     
     
     static void repeat_2_cb(uv_timer_t* handle) {
    -  ASSERT(handle == &repeat_2);
    +  ASSERT_PTR_EQ(handle, &repeat_2);
       ASSERT(repeat_2_cb_allowed);
     
       fprintf(stderr, "repeat_2_cb called after %ld ms\n",
    @@ -77,7 +77,7 @@ static void repeat_2_cb(uv_timer_t* handle) {
       repeat_2_cb_called++;
     
       if (uv_timer_get_repeat(&repeat_2) == 0) {
    -    ASSERT(0 == uv_is_active((uv_handle_t*) handle));
    +    ASSERT_OK(uv_is_active((uv_handle_t*) handle));
         uv_close((uv_handle_t*)handle, close_cb);
         return;
       }
    @@ -85,7 +85,7 @@ static void repeat_2_cb(uv_timer_t* handle) {
       fprintf(stderr, "uv_timer_get_repeat %ld ms\n",
               (long int)uv_timer_get_repeat(&repeat_2));
       fflush(stderr);
    -  ASSERT(uv_timer_get_repeat(&repeat_2) == 100);
    +  ASSERT_EQ(100, uv_timer_get_repeat(&repeat_2));
     
       /* This shouldn't take effect immediately. */
       uv_timer_set_repeat(&repeat_2, 0);
    @@ -96,41 +96,41 @@ TEST_IMPL(timer_again) {
       int r;
     
       start_time = uv_now(uv_default_loop());
    -  ASSERT(0 < start_time);
    +  ASSERT_LT(0, start_time);
     
       /* Verify that it is not possible to uv_timer_again a never-started timer. */
       r = uv_timer_init(uv_default_loop(), &dummy);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_timer_again(&dummy);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       uv_unref((uv_handle_t*)&dummy);
     
       /* Start timer repeat_1. */
       r = uv_timer_init(uv_default_loop(), &repeat_1);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_timer_start(&repeat_1, repeat_1_cb, 50, 0);
    -  ASSERT(r == 0);
    -  ASSERT(uv_timer_get_repeat(&repeat_1) == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(uv_timer_get_repeat(&repeat_1));
     
       /* Actually make repeat_1 repeating. */
       uv_timer_set_repeat(&repeat_1, 50);
    -  ASSERT(uv_timer_get_repeat(&repeat_1) == 50);
    +  ASSERT_EQ(50, uv_timer_get_repeat(&repeat_1));
     
       /*
        * Start another repeating timer. It'll be again()ed by the repeat_1 so
        * it should not time out until repeat_1 stops.
        */
       r = uv_timer_init(uv_default_loop(), &repeat_2);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_timer_start(&repeat_2, repeat_2_cb, 100, 100);
    -  ASSERT(r == 0);
    -  ASSERT(uv_timer_get_repeat(&repeat_2) == 100);
    +  ASSERT_OK(r);
    +  ASSERT_EQ(100, uv_timer_get_repeat(&repeat_2));
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(repeat_1_cb_called == 10);
    -  ASSERT(repeat_2_cb_called == 2);
    -  ASSERT(close_cb_called == 2);
    +  ASSERT_EQ(10, repeat_1_cb_called);
    +  ASSERT_EQ(2, repeat_2_cb_called);
    +  ASSERT_EQ(2, close_cb_called);
     
       fprintf(stderr, "Test took %ld ms (expected ~700 ms)\n",
               (long int)(uv_now(uv_default_loop()) - start_time));
    diff --git a/deps/uv/test/test-timer-from-check.c b/deps/uv/test/test-timer-from-check.c
    index e1a002d8121065..e5f5cb2f60a491 100644
    --- a/deps/uv/test/test-timer-from-check.c
    +++ b/deps/uv/test/test-timer-from-check.c
    @@ -32,49 +32,49 @@ static int timer_cb_called;
     
     
     static void prepare_cb(uv_prepare_t* handle) {
    -  ASSERT(0 == uv_prepare_stop(&prepare_handle));
    -  ASSERT(0 == prepare_cb_called);
    -  ASSERT(1 == check_cb_called);
    -  ASSERT(0 == timer_cb_called);
    +  ASSERT_OK(uv_prepare_stop(&prepare_handle));
    +  ASSERT_OK(prepare_cb_called);
    +  ASSERT_EQ(1, check_cb_called);
    +  ASSERT_OK(timer_cb_called);
       prepare_cb_called++;
     }
     
     
     static void timer_cb(uv_timer_t* handle) {
    -  ASSERT(0 == uv_timer_stop(&timer_handle));
    -  ASSERT(1 == prepare_cb_called);
    -  ASSERT(1 == check_cb_called);
    -  ASSERT(0 == timer_cb_called);
    +  ASSERT_OK(uv_timer_stop(&timer_handle));
    +  ASSERT_EQ(1, prepare_cb_called);
    +  ASSERT_EQ(1, check_cb_called);
    +  ASSERT_OK(timer_cb_called);
       timer_cb_called++;
     }
     
     
     static void check_cb(uv_check_t* handle) {
    -  ASSERT(0 == uv_check_stop(&check_handle));
    -  ASSERT(0 == uv_timer_stop(&timer_handle));  /* Runs before timer_cb. */
    -  ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, 50, 0));
    -  ASSERT(0 == uv_prepare_start(&prepare_handle, prepare_cb));
    -  ASSERT(0 == prepare_cb_called);
    -  ASSERT(0 == check_cb_called);
    -  ASSERT(0 == timer_cb_called);
    +  ASSERT_OK(uv_check_stop(&check_handle));
    +  ASSERT_OK(uv_timer_stop(&timer_handle));  /* Runs before timer_cb. */
    +  ASSERT_OK(uv_timer_start(&timer_handle, timer_cb, 50, 0));
    +  ASSERT_OK(uv_prepare_start(&prepare_handle, prepare_cb));
    +  ASSERT_OK(prepare_cb_called);
    +  ASSERT_OK(check_cb_called);
    +  ASSERT_OK(timer_cb_called);
       check_cb_called++;
     }
     
     
     TEST_IMPL(timer_from_check) {
    -  ASSERT(0 == uv_prepare_init(uv_default_loop(), &prepare_handle));
    -  ASSERT(0 == uv_check_init(uv_default_loop(), &check_handle));
    -  ASSERT(0 == uv_check_start(&check_handle, check_cb));
    -  ASSERT(0 == uv_timer_init(uv_default_loop(), &timer_handle));
    -  ASSERT(0 == uv_timer_start(&timer_handle, timer_cb, 50, 0));
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    -  ASSERT(1 == prepare_cb_called);
    -  ASSERT(1 == check_cb_called);
    -  ASSERT(1 == timer_cb_called);
    +  ASSERT_OK(uv_prepare_init(uv_default_loop(), &prepare_handle));
    +  ASSERT_OK(uv_check_init(uv_default_loop(), &check_handle));
    +  ASSERT_OK(uv_check_start(&check_handle, check_cb));
    +  ASSERT_OK(uv_timer_init(uv_default_loop(), &timer_handle));
    +  ASSERT_OK(uv_timer_start(&timer_handle, timer_cb, 50, 0));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_EQ(1, prepare_cb_called);
    +  ASSERT_EQ(1, check_cb_called);
    +  ASSERT_EQ(1, timer_cb_called);
       uv_close((uv_handle_t*) &prepare_handle, NULL);
       uv_close((uv_handle_t*) &check_handle, NULL);
       uv_close((uv_handle_t*) &timer_handle, NULL);
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_ONCE));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_ONCE));
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
     }
    diff --git a/deps/uv/test/test-timer.c b/deps/uv/test/test-timer.c
    index 2488f14c204b8b..d889e707731886 100644
    --- a/deps/uv/test/test-timer.c
    +++ b/deps/uv/test/test-timer.c
    @@ -41,7 +41,7 @@ static void once_close_cb(uv_handle_t* handle) {
       printf("ONCE_CLOSE_CB\n");
     
       ASSERT_NOT_NULL(handle);
    -  ASSERT(0 == uv_is_active(handle));
    +  ASSERT_OK(uv_is_active(handle));
     
       once_close_cb_called++;
     }
    @@ -51,7 +51,7 @@ static void once_cb(uv_timer_t* handle) {
       printf("ONCE_CB %d\n", once_cb_called);
     
       ASSERT_NOT_NULL(handle);
    -  ASSERT(0 == uv_is_active((uv_handle_t*) handle));
    +  ASSERT_OK(uv_is_active((uv_handle_t*) handle));
     
       once_cb_called++;
     
    @@ -65,7 +65,7 @@ static void twice_close_cb(uv_handle_t* handle) {
       printf("TWICE_CLOSE_CB\n");
     
       ASSERT_NOT_NULL(handle);
    -  ASSERT(0 == uv_is_active(handle));
    +  ASSERT_OK(uv_is_active(handle));
     
       twice_close_cb_called++;
     }
    @@ -74,7 +74,7 @@ static void twice_cb(uv_timer_t* handle) {
       printf("TWICE_CB %d\n", twice_cb_called);
     
       ASSERT_NOT_NULL(handle);
    -  ASSERT(0 == uv_is_active((uv_handle_t*) handle));
    +  ASSERT_OK(uv_is_active((uv_handle_t*) handle));
     
       twice_cb_called++;
     
    @@ -96,7 +96,7 @@ static void repeat_cb(uv_timer_t* handle) {
       printf("REPEAT_CB\n");
     
       ASSERT_NOT_NULL(handle);
    -  ASSERT(1 == uv_is_active((uv_handle_t*) handle));
    +  ASSERT_EQ(1, uv_is_active((uv_handle_t*) handle));
     
       repeat_cb_called++;
     
    @@ -119,41 +119,41 @@ TEST_IMPL(timer) {
       int r;
     
       start_time = uv_now(uv_default_loop());
    -  ASSERT(0 < start_time);
    +  ASSERT_LT(0, start_time);
     
       /* Let 10 timers time out in 500 ms total. */
       for (i = 0; i < ARRAY_SIZE(once_timers); i++) {
         once = once_timers + i;
         r = uv_timer_init(uv_default_loop(), once);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
         r = uv_timer_start(once, once_cb, i * 50, 0);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     
       /* The 11th timer is a repeating timer that runs 4 times */
       r = uv_timer_init(uv_default_loop(), &repeat);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_timer_start(&repeat, repeat_cb, 100, 100);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* The 12th timer should not do anything. */
       r = uv_timer_init(uv_default_loop(), &never);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_timer_start(&never, never_cb, 100, 100);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_timer_stop(&never);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_unref((uv_handle_t*)&never);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(once_cb_called == 10);
    -  ASSERT(once_close_cb_called == 10);
    +  ASSERT_EQ(10, once_cb_called);
    +  ASSERT_EQ(10, once_close_cb_called);
       printf("repeat_cb_called %d\n", repeat_cb_called);
    -  ASSERT(repeat_cb_called == 5);
    -  ASSERT(repeat_close_cb_called == 1);
    +  ASSERT_EQ(5, repeat_cb_called);
    +  ASSERT_EQ(1, repeat_close_cb_called);
     
    -  ASSERT(500 <= uv_now(uv_default_loop()) - start_time);
    +  ASSERT_LE(500, uv_now(uv_default_loop()) - start_time);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -165,15 +165,15 @@ TEST_IMPL(timer_start_twice) {
       int r;
     
       r = uv_timer_init(uv_default_loop(), &once);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_timer_start(&once, never_cb, 86400 * 1000, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_timer_start(&once, twice_cb, 10, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(twice_cb_called == 1);
    +  ASSERT_EQ(1, twice_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -183,10 +183,10 @@ TEST_IMPL(timer_start_twice) {
     TEST_IMPL(timer_init) {
       uv_timer_t handle;
     
    -  ASSERT(0 == uv_timer_init(uv_default_loop(), &handle));
    -  ASSERT(0 == uv_timer_get_repeat(&handle));
    +  ASSERT_OK(uv_timer_init(uv_default_loop(), &handle));
    +  ASSERT_OK(uv_timer_get_repeat(&handle));
       ASSERT_UINT64_LE(0, uv_timer_get_due_in(&handle));
    -  ASSERT(0 == uv_is_active((uv_handle_t*) &handle));
    +  ASSERT_OK(uv_is_active((uv_handle_t*) &handle));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -194,12 +194,12 @@ TEST_IMPL(timer_init) {
     
     
     static void order_cb_a(uv_timer_t *handle) {
    -  ASSERT(order_cb_called++ == *(int*)handle->data);
    +  ASSERT_EQ(order_cb_called++, *(int*)handle->data);
     }
     
     
     static void order_cb_b(uv_timer_t *handle) {
    -  ASSERT(order_cb_called++ == *(int*)handle->data);
    +  ASSERT_EQ(order_cb_called++, *(int*)handle->data);
     }
     
     
    @@ -211,31 +211,31 @@ TEST_IMPL(timer_order) {
     
       first = 0;
       second = 1;
    -  ASSERT(0 == uv_timer_init(uv_default_loop(), &handle_a));
    -  ASSERT(0 == uv_timer_init(uv_default_loop(), &handle_b));
    +  ASSERT_OK(uv_timer_init(uv_default_loop(), &handle_a));
    +  ASSERT_OK(uv_timer_init(uv_default_loop(), &handle_b));
     
       /* Test for starting handle_a then handle_b */
       handle_a.data = &first;
    -  ASSERT(0 == uv_timer_start(&handle_a, order_cb_a, 0, 0));
    +  ASSERT_OK(uv_timer_start(&handle_a, order_cb_a, 0, 0));
       handle_b.data = &second;
    -  ASSERT(0 == uv_timer_start(&handle_b, order_cb_b, 0, 0));
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_timer_start(&handle_b, order_cb_b, 0, 0));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
    -  ASSERT(order_cb_called == 2);
    +  ASSERT_EQ(2, order_cb_called);
     
    -  ASSERT(0 == uv_timer_stop(&handle_a));
    -  ASSERT(0 == uv_timer_stop(&handle_b));
    +  ASSERT_OK(uv_timer_stop(&handle_a));
    +  ASSERT_OK(uv_timer_stop(&handle_b));
     
       /* Test for starting handle_b then handle_a */
       order_cb_called = 0;
       handle_b.data = &first;
    -  ASSERT(0 == uv_timer_start(&handle_b, order_cb_b, 0, 0));
    +  ASSERT_OK(uv_timer_start(&handle_b, order_cb_b, 0, 0));
     
       handle_a.data = &second;
    -  ASSERT(0 == uv_timer_start(&handle_a, order_cb_a, 0, 0));
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_timer_start(&handle_a, order_cb_a, 0, 0));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
    -  ASSERT(order_cb_called == 2);
    +  ASSERT_EQ(2, order_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -243,7 +243,7 @@ TEST_IMPL(timer_order) {
     
     
     static void tiny_timer_cb(uv_timer_t* handle) {
    -  ASSERT(handle == &tiny_timer);
    +  ASSERT_PTR_EQ(handle, &tiny_timer);
       uv_close((uv_handle_t*) &tiny_timer, NULL);
       uv_close((uv_handle_t*) &huge_timer1, NULL);
       uv_close((uv_handle_t*) &huge_timer2, NULL);
    @@ -251,16 +251,19 @@ static void tiny_timer_cb(uv_timer_t* handle) {
     
     
     TEST_IMPL(timer_huge_timeout) {
    -  ASSERT(0 == uv_timer_init(uv_default_loop(), &tiny_timer));
    -  ASSERT(0 == uv_timer_init(uv_default_loop(), &huge_timer1));
    -  ASSERT(0 == uv_timer_init(uv_default_loop(), &huge_timer2));
    -  ASSERT(0 == uv_timer_start(&tiny_timer, tiny_timer_cb, 1, 0));
    -  ASSERT(0 == uv_timer_start(&huge_timer1, tiny_timer_cb, 0xffffffffffffLL, 0));
    -  ASSERT(0 == uv_timer_start(&huge_timer2, tiny_timer_cb, (uint64_t) -1, 0));
    +  ASSERT_OK(uv_timer_init(uv_default_loop(), &tiny_timer));
    +  ASSERT_OK(uv_timer_init(uv_default_loop(), &huge_timer1));
    +  ASSERT_OK(uv_timer_init(uv_default_loop(), &huge_timer2));
    +  ASSERT_OK(uv_timer_start(&tiny_timer, tiny_timer_cb, 1, 0));
    +  ASSERT_OK(uv_timer_start(&huge_timer1,
    +                           tiny_timer_cb,
    +                           0xffffffffffffLL,
    +                           0));
    +  ASSERT_OK(uv_timer_start(&huge_timer2, tiny_timer_cb, (uint64_t) -1, 0));
       ASSERT_UINT64_EQ(1, uv_timer_get_due_in(&tiny_timer));
       ASSERT_UINT64_EQ(281474976710655, uv_timer_get_due_in(&huge_timer1));
       ASSERT_UINT64_LE(0, uv_timer_get_due_in(&huge_timer2));
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
     }
    @@ -270,9 +273,9 @@ static void huge_repeat_cb(uv_timer_t* handle) {
       static int ncalls;
     
       if (ncalls == 0)
    -    ASSERT(handle == &huge_timer1);
    +    ASSERT_PTR_EQ(handle, &huge_timer1);
       else
    -    ASSERT(handle == &tiny_timer);
    +    ASSERT_PTR_EQ(handle, &tiny_timer);
     
       if (++ncalls == 10) {
         uv_close((uv_handle_t*) &tiny_timer, NULL);
    @@ -282,11 +285,11 @@ static void huge_repeat_cb(uv_timer_t* handle) {
     
     
     TEST_IMPL(timer_huge_repeat) {
    -  ASSERT(0 == uv_timer_init(uv_default_loop(), &tiny_timer));
    -  ASSERT(0 == uv_timer_init(uv_default_loop(), &huge_timer1));
    -  ASSERT(0 == uv_timer_start(&tiny_timer, huge_repeat_cb, 2, 2));
    -  ASSERT(0 == uv_timer_start(&huge_timer1, huge_repeat_cb, 1, (uint64_t) -1));
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_timer_init(uv_default_loop(), &tiny_timer));
    +  ASSERT_OK(uv_timer_init(uv_default_loop(), &huge_timer1));
    +  ASSERT_OK(uv_timer_start(&tiny_timer, huge_repeat_cb, 2, 2));
    +  ASSERT_OK(uv_timer_start(&huge_timer1, huge_repeat_cb, 1, (uint64_t) -1));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
     }
    @@ -303,17 +306,17 @@ static void timer_run_once_timer_cb(uv_timer_t* handle) {
     TEST_IMPL(timer_run_once) {
       uv_timer_t timer_handle;
     
    -  ASSERT(0 == uv_timer_init(uv_default_loop(), &timer_handle));
    -  ASSERT(0 == uv_timer_start(&timer_handle, timer_run_once_timer_cb, 0, 0));
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_ONCE));
    -  ASSERT(1 == timer_run_once_timer_cb_called);
    +  ASSERT_OK(uv_timer_init(uv_default_loop(), &timer_handle));
    +  ASSERT_OK(uv_timer_start(&timer_handle, timer_run_once_timer_cb, 0, 0));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_ONCE));
    +  ASSERT_EQ(1, timer_run_once_timer_cb_called);
     
    -  ASSERT(0 == uv_timer_start(&timer_handle, timer_run_once_timer_cb, 1, 0));
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_ONCE));
    -  ASSERT(2 == timer_run_once_timer_cb_called);
    +  ASSERT_OK(uv_timer_start(&timer_handle, timer_run_once_timer_cb, 1, 0));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_ONCE));
    +  ASSERT_EQ(2, timer_run_once_timer_cb_called);
     
       uv_close((uv_handle_t*) &timer_handle, NULL);
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_ONCE));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_ONCE));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -323,10 +326,10 @@ TEST_IMPL(timer_run_once) {
     TEST_IMPL(timer_is_closing) {
       uv_timer_t handle;
     
    -  ASSERT(0 == uv_timer_init(uv_default_loop(), &handle));
    +  ASSERT_OK(uv_timer_init(uv_default_loop(), &handle));
       uv_close((uv_handle_t *)&handle, NULL);
     
    -  ASSERT(UV_EINVAL == uv_timer_start(&handle, never_cb, 100, 100));
    +  ASSERT_EQ(UV_EINVAL, uv_timer_start(&handle, never_cb, 100, 100));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -336,8 +339,8 @@ TEST_IMPL(timer_is_closing) {
     TEST_IMPL(timer_null_callback) {
       uv_timer_t handle;
     
    -  ASSERT(0 == uv_timer_init(uv_default_loop(), &handle));
    -  ASSERT(UV_EINVAL == uv_timer_start(&handle, NULL, 100, 100));
    +  ASSERT_OK(uv_timer_init(uv_default_loop(), &handle));
    +  ASSERT_EQ(UV_EINVAL, uv_timer_start(&handle, NULL, 100, 100));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -349,7 +352,7 @@ static uint64_t timer_early_check_expected_time;
     
     static void timer_early_check_cb(uv_timer_t* handle) {
       uint64_t hrtime = uv_hrtime() / 1000000;
    -  ASSERT(hrtime >= timer_early_check_expected_time);
    +  ASSERT_GE(hrtime, timer_early_check_expected_time);
     }
     
     
    @@ -359,12 +362,15 @@ TEST_IMPL(timer_early_check) {
     
       timer_early_check_expected_time = uv_now(uv_default_loop()) + timeout_ms;
     
    -  ASSERT(0 == uv_timer_init(uv_default_loop(), &timer_handle));
    -  ASSERT(0 == uv_timer_start(&timer_handle, timer_early_check_cb, timeout_ms, 0));
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_timer_init(uv_default_loop(), &timer_handle));
    +  ASSERT_OK(uv_timer_start(&timer_handle,
    +                           timer_early_check_cb,
    +                           timeout_ms,
    +                           0));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
       uv_close((uv_handle_t*) &timer_handle, NULL);
    -  ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -378,11 +384,11 @@ TEST_IMPL(timer_no_double_call_once) {
       uv_timer_t timer_handle;
       const uint64_t timeout_ms = 10;
     
    -  ASSERT_EQ(0, uv_timer_init(uv_default_loop(), &timer_handle));
    -  ASSERT_EQ(0, uv_timer_start(&timer_handle,
    -                              timer_check_double_call,
    -                              timeout_ms,
    -                              timeout_ms));
    +  ASSERT_OK(uv_timer_init(uv_default_loop(), &timer_handle));
    +  ASSERT_OK(uv_timer_start(&timer_handle,
    +                           timer_check_double_call,
    +                           timeout_ms,
    +                           timeout_ms));
       uv_sleep(timeout_ms * 2);
       ASSERT_EQ(1, uv_run(uv_default_loop(), UV_RUN_ONCE));
       ASSERT_EQ(1, timer_check_double_call_called);
    @@ -395,11 +401,11 @@ TEST_IMPL(timer_no_double_call_nowait) {
       uv_timer_t timer_handle;
       const uint64_t timeout_ms = 10;
     
    -  ASSERT_EQ(0, uv_timer_init(uv_default_loop(), &timer_handle));
    -  ASSERT_EQ(0, uv_timer_start(&timer_handle,
    -                              timer_check_double_call,
    -                              timeout_ms,
    -                              timeout_ms));
    +  ASSERT_OK(uv_timer_init(uv_default_loop(), &timer_handle));
    +  ASSERT_OK(uv_timer_start(&timer_handle,
    +                           timer_check_double_call,
    +                           timeout_ms,
    +                           timeout_ms));
       uv_sleep(timeout_ms * 2);
       ASSERT_EQ(1, uv_run(uv_default_loop(), UV_RUN_NOWAIT));
       ASSERT_EQ(1, timer_check_double_call_called);
    @@ -414,7 +420,7 @@ TEST_IMPL(timer_no_run_on_unref) {
       ASSERT_OK(uv_timer_init(uv_default_loop(), &timer_handle));
       ASSERT_OK(uv_timer_start(&timer_handle, (uv_timer_cb) abort, 0, 0));
       uv_unref((uv_handle_t*) &timer_handle);
    -  ASSERT_EQ(uv_run(uv_default_loop(), UV_RUN_DEFAULT), 0);
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-tmpdir.c b/deps/uv/test/test-tmpdir.c
    index 86f72e25431a15..a4e9ce950aaa12 100644
    --- a/deps/uv/test/test-tmpdir.c
    +++ b/deps/uv/test/test-tmpdir.c
    @@ -36,46 +36,46 @@ TEST_IMPL(tmpdir) {
       len = sizeof tmpdir;
       tmpdir[0] = '\0';
     
    -  ASSERT(strlen(tmpdir) == 0);
    +  ASSERT_OK(strlen(tmpdir));
       r = uv_os_tmpdir(tmpdir, &len);
    -  ASSERT(r == 0);
    -  ASSERT(strlen(tmpdir) == len);
    -  ASSERT(len > 0);
    -  ASSERT(tmpdir[len] == '\0');
    +  ASSERT_OK(r);
    +  ASSERT_EQ(strlen(tmpdir), len);
    +  ASSERT_GT(len, 0);
    +  ASSERT_EQ(tmpdir[len], '\0');
     
       if (len > 1) {
         last = tmpdir[len - 1];
     #ifdef _WIN32
    -    ASSERT(last != '\\');
    +    ASSERT_NE(last, '\\');
     #else
    -    ASSERT(last != '/');
    +    ASSERT_NE(last, '/');
     #endif
       }
     
       /* Test the case where the buffer is too small */
       len = SMALLPATH;
       r = uv_os_tmpdir(tmpdir, &len);
    -  ASSERT(r == UV_ENOBUFS);
    -  ASSERT(len > SMALLPATH);
    +  ASSERT_EQ(r, UV_ENOBUFS);
    +  ASSERT_GT(len, SMALLPATH);
     
       /* Test invalid inputs */
       r = uv_os_tmpdir(NULL, &len);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       r = uv_os_tmpdir(tmpdir, NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       len = 0;
       r = uv_os_tmpdir(tmpdir, &len);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
     #ifdef _WIN32
       const char *name = "TMP";
       char tmpdir_win[] = "C:\\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
       r = uv_os_setenv(name, tmpdir_win);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       char tmpdirx[PATHMAX];
       size_t lenx = sizeof tmpdirx;
       r = uv_os_tmpdir(tmpdirx, &lenx);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     #endif
     
       return 0;
    diff --git a/deps/uv/test/test-tty-duplicate-key.c b/deps/uv/test/test-tty-duplicate-key.c
    index 6ba96c81352337..871d580266ad8d 100644
    --- a/deps/uv/test/test-tty-duplicate-key.c
    +++ b/deps/uv/test/test-tty-duplicate-key.c
    @@ -73,7 +73,7 @@ static void tty_read(uv_stream_t* tty_in, ssize_t nread, const uv_buf_t* buf) {
         }
         uv_close((uv_handle_t*) tty_in, NULL);
       } else {
    -    ASSERT(nread == 0);
    +    ASSERT_OK(nread);
       }
     }
     
    @@ -150,25 +150,25 @@ TEST_IMPL(tty_duplicate_vt100_fn_key) {
                            OPEN_EXISTING,
                            FILE_ATTRIBUTE_NORMAL,
                            NULL);
    -  ASSERT(handle != INVALID_HANDLE_VALUE);
    +  ASSERT_PTR_NE(handle, INVALID_HANDLE_VALUE);
       ttyin_fd = _open_osfhandle((intptr_t) handle, 0);
    -  ASSERT(ttyin_fd >= 0);
    -  ASSERT(UV_TTY == uv_guess_handle(ttyin_fd));
    +  ASSERT_GE(ttyin_fd, 0);
    +  ASSERT_EQ(UV_TTY, uv_guess_handle(ttyin_fd));
     
       r = uv_tty_init(uv_default_loop(), &tty_in, ttyin_fd, 1);  /* Readable. */
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       ASSERT(uv_is_readable((uv_stream_t*) &tty_in));
       ASSERT(!uv_is_writable((uv_stream_t*) &tty_in));
     
       r = uv_read_start((uv_stream_t*)&tty_in, tty_alloc, tty_read);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       expect_str = ESC"[[A";
       expect_nread = strlen(expect_str);
     
       /* Turn on raw mode. */
       r = uv_tty_set_mode(&tty_in, UV_TTY_MODE_RAW);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /*
        * Send F1 keystrokes. Test of issue cause by #2114 that vt100 fn key
    @@ -176,7 +176,7 @@ TEST_IMPL(tty_duplicate_vt100_fn_key) {
        */
       make_key_event_records(VK_F1, 0, TRUE, records);
       WriteConsoleInputW(handle, records, ARRAY_SIZE(records), &written);
    -  ASSERT(written == ARRAY_SIZE(records));
    +  ASSERT_EQ(written, ARRAY_SIZE(records));
     
       uv_run(loop, UV_RUN_DEFAULT);
     
    @@ -204,45 +204,45 @@ TEST_IMPL(tty_duplicate_alt_modifier_key) {
                            OPEN_EXISTING,
                            FILE_ATTRIBUTE_NORMAL,
                            NULL);
    -  ASSERT(handle != INVALID_HANDLE_VALUE);
    +  ASSERT_PTR_NE(handle, INVALID_HANDLE_VALUE);
       ttyin_fd = _open_osfhandle((intptr_t) handle, 0);
    -  ASSERT(ttyin_fd >= 0);
    -  ASSERT(UV_TTY == uv_guess_handle(ttyin_fd));
    +  ASSERT_GE(ttyin_fd, 0);
    +  ASSERT_EQ(UV_TTY, uv_guess_handle(ttyin_fd));
     
       r = uv_tty_init(uv_default_loop(), &tty_in, ttyin_fd, 1);  /* Readable. */
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       ASSERT(uv_is_readable((uv_stream_t*) &tty_in));
       ASSERT(!uv_is_writable((uv_stream_t*) &tty_in));
     
       r = uv_read_start((uv_stream_t*)&tty_in, tty_alloc, tty_read);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       expect_str = ESC"a"ESC"a";
       expect_nread = strlen(expect_str);
     
       /* Turn on raw mode. */
       r = uv_tty_set_mode(&tty_in, UV_TTY_MODE_RAW);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Emulate transmission of M-a at normal console */
       make_key_event_records(VK_MENU, 0, TRUE, alt_records);
       WriteConsoleInputW(handle, &alt_records[0], 1, &written);
    -  ASSERT(written == 1);
    +  ASSERT_EQ(1, written);
       make_key_event_records(L'A', LEFT_ALT_PRESSED, FALSE, records);
       WriteConsoleInputW(handle, records, ARRAY_SIZE(records), &written);
    -  ASSERT(written == 2);
    +  ASSERT_EQ(2, written);
       WriteConsoleInputW(handle, &alt_records[1], 1, &written);
    -  ASSERT(written == 1);
    +  ASSERT_EQ(1, written);
     
       /* Emulate transmission of M-a at WSL(#2111) */
       make_key_event_records(VK_MENU, 0, TRUE, alt_records);
       WriteConsoleInputW(handle, &alt_records[0], 1, &written);
    -  ASSERT(written == 1);
    +  ASSERT_EQ(1, written);
       make_key_event_records(L'A', LEFT_ALT_PRESSED, TRUE, records);
       WriteConsoleInputW(handle, records, ARRAY_SIZE(records), &written);
    -  ASSERT(written == 2);
    +  ASSERT_EQ(2, written);
       WriteConsoleInputW(handle, &alt_records[1], 1, &written);
    -  ASSERT(written == 1);
    +  ASSERT_EQ(1, written);
     
       uv_run(loop, UV_RUN_DEFAULT);
     
    @@ -270,25 +270,25 @@ TEST_IMPL(tty_composing_character) {
                            OPEN_EXISTING,
                            FILE_ATTRIBUTE_NORMAL,
                            NULL);
    -  ASSERT(handle != INVALID_HANDLE_VALUE);
    +  ASSERT_PTR_NE(handle, INVALID_HANDLE_VALUE);
       ttyin_fd = _open_osfhandle((intptr_t) handle, 0);
    -  ASSERT(ttyin_fd >= 0);
    -  ASSERT(UV_TTY == uv_guess_handle(ttyin_fd));
    +  ASSERT_GE(ttyin_fd, 0);
    +  ASSERT_EQ(UV_TTY, uv_guess_handle(ttyin_fd));
     
       r = uv_tty_init(uv_default_loop(), &tty_in, ttyin_fd, 1);  /* Readable. */
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       ASSERT(uv_is_readable((uv_stream_t*) &tty_in));
       ASSERT(!uv_is_writable((uv_stream_t*) &tty_in));
     
       r = uv_read_start((uv_stream_t*)&tty_in, tty_alloc, tty_read);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       expect_str = EUR_UTF8;
       expect_nread = strlen(expect_str);
     
       /* Turn on raw mode. */
       r = uv_tty_set_mode(&tty_in, UV_TTY_MODE_RAW);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Emulate EUR inputs by LEFT ALT+NUMPAD ASCII KeyComos */
       make_key_event_records(VK_MENU, 0, FALSE, alt_records);
    @@ -296,16 +296,16 @@ TEST_IMPL(tty_composing_character) {
       WriteConsoleInputW(handle, &alt_records[0], 1, &written);
       make_key_event_records(VK_NUMPAD0, LEFT_ALT_PRESSED, FALSE, records);
       WriteConsoleInputW(handle, records, ARRAY_SIZE(records), &written);
    -  ASSERT(written == ARRAY_SIZE(records));
    +  ASSERT_EQ(written, ARRAY_SIZE(records));
       make_key_event_records(VK_NUMPAD1, LEFT_ALT_PRESSED, FALSE, records);
       WriteConsoleInputW(handle, records, ARRAY_SIZE(records), &written);
    -  ASSERT(written == ARRAY_SIZE(records));
    +  ASSERT_EQ(written, ARRAY_SIZE(records));
       make_key_event_records(VK_NUMPAD2, LEFT_ALT_PRESSED, FALSE, records);
       WriteConsoleInputW(handle, records, ARRAY_SIZE(records), &written);
    -  ASSERT(written == ARRAY_SIZE(records));
    +  ASSERT_EQ(written, ARRAY_SIZE(records));
       make_key_event_records(VK_NUMPAD8, LEFT_ALT_PRESSED, FALSE, records);
       WriteConsoleInputW(handle, records, ARRAY_SIZE(records), &written);
    -  ASSERT(written == ARRAY_SIZE(records));
    +  ASSERT_EQ(written, ARRAY_SIZE(records));
       WriteConsoleInputW(handle, &alt_records[1], 1, &written);
     
       uv_run(loop, UV_RUN_DEFAULT);
    diff --git a/deps/uv/test/test-tty-escape-sequence-processing.c b/deps/uv/test/test-tty-escape-sequence-processing.c
    index 2f7d0364b8b5f0..4a041db11dfcea 100644
    --- a/deps/uv/test/test-tty-escape-sequence-processing.c
    +++ b/deps/uv/test/test-tty-escape-sequence-processing.c
    @@ -165,8 +165,8 @@ static void write_console(uv_tty_t* tty_out, char* src) {
       buf.len = strlen(buf.base);
     
       r = uv_try_write((uv_stream_t*) tty_out, &buf, 1);
    -  ASSERT(r >= 0);
    -  ASSERT((unsigned int) r == buf.len);
    +  ASSERT_GE(r, 0);
    +  ASSERT_EQ((unsigned int) r, buf.len);
     }
     
     static void setup_screen(uv_tty_t* tty_out) {
    @@ -178,8 +178,8 @@ static void setup_screen(uv_tty_t* tty_out) {
       origin.X = 0;
       origin.Y = info.srWindow.Top;
       ASSERT(FillConsoleOutputCharacter(
    -      tty_out->handle, '.', length, origin, &number_of_written));
    -  ASSERT(length == number_of_written);
    +         tty_out->handle, '.', length, origin, &number_of_written));
    +  ASSERT_EQ(length, number_of_written);
     }
     
     static void clear_screen(uv_tty_t* tty_out, struct screen_info* si) {
    @@ -192,10 +192,10 @@ static void clear_screen(uv_tty_t* tty_out, struct screen_info* si) {
       origin.Y = info.srWindow.Top;
       FillConsoleOutputCharacterA(
           tty_out->handle, ' ', length, origin, &number_of_written);
    -  ASSERT(length == number_of_written);
    +  ASSERT_EQ(length, number_of_written);
       FillConsoleOutputAttribute(
           tty_out->handle, si->default_attr, length, origin, &number_of_written);
    -  ASSERT(length == number_of_written);
    +  ASSERT_EQ(length, number_of_written);
     }
     
     static void free_screen(struct captured_screen* cs) {
    @@ -216,11 +216,11 @@ static void capture_screen(uv_tty_t* tty_out, struct captured_screen* cs) {
       cs->attributes = (WORD*) malloc(cs->si.length * sizeof(*cs->attributes));
       ASSERT_NOT_NULL(cs->attributes);
       ASSERT(ReadConsoleOutputCharacter(
    -      tty_out->handle, cs->text, cs->si.length, origin, &length));
    -  ASSERT((unsigned int) cs->si.length == length);
    +         tty_out->handle, cs->text, cs->si.length, origin, &length));
    +  ASSERT_EQ((unsigned int) cs->si.length, length);
       ASSERT(ReadConsoleOutputAttribute(
    -      tty_out->handle, cs->attributes, cs->si.length, origin, &length));
    -  ASSERT((unsigned int) cs->si.length == length);
    +         tty_out->handle, cs->attributes, cs->si.length, origin, &length));
    +  ASSERT_EQ((unsigned int) cs->si.length, length);
     }
     
     static void make_expect_screen_erase(struct captured_screen* cs,
    @@ -261,8 +261,8 @@ static void make_expect_screen_erase(struct captured_screen* cs,
       } else {
         ASSERT(FALSE);
       }
    -  ASSERT(start < end);
    -  ASSERT(end - cs->text <= cs->si.length);
    +  ASSERT_PTR_LT(start, end);
    +  ASSERT_LE(end - cs->text, cs->si.length);
       for (; start < end; start++) {
         *start = ' ';
       }
    @@ -360,13 +360,13 @@ static void initialize_tty(uv_tty_t* tty_out) {
                                          NULL,
                                          CONSOLE_TEXTMODE_BUFFER,
                                          NULL);
    -  ASSERT(handle != INVALID_HANDLE_VALUE);
    +  ASSERT_PTR_NE(handle, INVALID_HANDLE_VALUE);
     
       ttyout_fd = _open_osfhandle((intptr_t) handle, 0);
    -  ASSERT(ttyout_fd >= 0);
    -  ASSERT(UV_TTY == uv_guess_handle(ttyout_fd));
    +  ASSERT_GE(ttyout_fd, 0);
    +  ASSERT_EQ(UV_TTY, uv_guess_handle(ttyout_fd));
       r = uv_tty_init(uv_default_loop(), tty_out, ttyout_fd, 0); /* Writable. */
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     static void terminate_tty(uv_tty_t* tty_out) {
    @@ -394,16 +394,16 @@ TEST_IMPL(tty_cursor_up) {
       snprintf(buffer, sizeof(buffer), "%sA", CSI);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(cursor_pos_old.Y - 1 == cursor_pos.Y);
    -  ASSERT(cursor_pos_old.X == cursor_pos.X);
    +  ASSERT_EQ(cursor_pos_old.Y - 1, cursor_pos.Y);
    +  ASSERT_EQ(cursor_pos_old.X, cursor_pos.X);
     
       /* cursor up nth times */
       cursor_pos_old = cursor_pos;
       snprintf(buffer, sizeof(buffer), "%s%dA", CSI, si.height / 4);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(cursor_pos_old.Y - si.height / 4 == cursor_pos.Y);
    -  ASSERT(cursor_pos_old.X == cursor_pos.X);
    +  ASSERT_EQ(cursor_pos_old.Y - si.height / 4, cursor_pos.Y);
    +  ASSERT_EQ(cursor_pos_old.X, cursor_pos.X);
     
       /* cursor up from Window top does nothing */
       cursor_pos_old.X = 1;
    @@ -412,8 +412,8 @@ TEST_IMPL(tty_cursor_up) {
       snprintf(buffer, sizeof(buffer), "%sA", CSI);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(cursor_pos_old.Y == cursor_pos.Y);
    -  ASSERT(cursor_pos_old.X == cursor_pos.X);
    +  ASSERT_EQ(cursor_pos_old.Y, cursor_pos.Y);
    +  ASSERT_EQ(cursor_pos_old.X, cursor_pos.X);
       ASSERT(!is_scrolling(&tty_out, si));
     
       terminate_tty(&tty_out);
    @@ -445,16 +445,16 @@ TEST_IMPL(tty_cursor_down) {
       snprintf(buffer, sizeof(buffer), "%sB", CSI);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(cursor_pos_old.Y + 1 == cursor_pos.Y);
    -  ASSERT(cursor_pos_old.X == cursor_pos.X);
    +  ASSERT_EQ(cursor_pos_old.Y + 1, cursor_pos.Y);
    +  ASSERT_EQ(cursor_pos_old.X, cursor_pos.X);
     
       /* cursor down nth times */
       cursor_pos_old = cursor_pos;
       snprintf(buffer, sizeof(buffer), "%s%dB", CSI, si.height / 4);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(cursor_pos_old.Y + si.height / 4 == cursor_pos.Y);
    -  ASSERT(cursor_pos_old.X == cursor_pos.X);
    +  ASSERT_EQ(cursor_pos_old.Y + si.height / 4, cursor_pos.Y);
    +  ASSERT_EQ(cursor_pos_old.X, cursor_pos.X);
     
       /* cursor down from bottom line does nothing */
       cursor_pos_old.X = si.width / 2;
    @@ -463,8 +463,8 @@ TEST_IMPL(tty_cursor_down) {
       snprintf(buffer, sizeof(buffer), "%sB", CSI);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(cursor_pos_old.Y == cursor_pos.Y);
    -  ASSERT(cursor_pos_old.X == cursor_pos.X);
    +  ASSERT_EQ(cursor_pos_old.Y, cursor_pos.Y);
    +  ASSERT_EQ(cursor_pos_old.X, cursor_pos.X);
       ASSERT(!is_scrolling(&tty_out, si));
     
       terminate_tty(&tty_out);
    @@ -496,16 +496,16 @@ TEST_IMPL(tty_cursor_forward) {
       snprintf(buffer, sizeof(buffer), "%sC", CSI);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(cursor_pos_old.Y == cursor_pos.Y);
    -  ASSERT(cursor_pos_old.X + 1 == cursor_pos.X);
    +  ASSERT_EQ(cursor_pos_old.Y, cursor_pos.Y);
    +  ASSERT_EQ(cursor_pos_old.X + 1, cursor_pos.X);
     
       /* cursor forward nth times */
       cursor_pos_old = cursor_pos;
       snprintf(buffer, sizeof(buffer), "%s%dC", CSI, si.width / 4);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(cursor_pos_old.Y == cursor_pos.Y);
    -  ASSERT(cursor_pos_old.X + si.width / 4 == cursor_pos.X);
    +  ASSERT_EQ(cursor_pos_old.Y, cursor_pos.Y);
    +  ASSERT_EQ(cursor_pos_old.X + si.width / 4, cursor_pos.X);
     
       /* cursor forward from end of line does nothing*/
       cursor_pos_old.X = si.width;
    @@ -514,8 +514,8 @@ TEST_IMPL(tty_cursor_forward) {
       snprintf(buffer, sizeof(buffer), "%sC", CSI);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(cursor_pos_old.Y == cursor_pos.Y);
    -  ASSERT(cursor_pos_old.X == cursor_pos.X);
    +  ASSERT_EQ(cursor_pos_old.Y, cursor_pos.Y);
    +  ASSERT_EQ(cursor_pos_old.X, cursor_pos.X);
     
       /* cursor forward from end of screen does nothing */
       cursor_pos_old.X = si.width;
    @@ -524,8 +524,8 @@ TEST_IMPL(tty_cursor_forward) {
       snprintf(buffer, sizeof(buffer), "%sC", CSI);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(cursor_pos_old.Y == cursor_pos.Y);
    -  ASSERT(cursor_pos_old.X == cursor_pos.X);
    +  ASSERT_EQ(cursor_pos_old.Y, cursor_pos.Y);
    +  ASSERT_EQ(cursor_pos_old.X, cursor_pos.X);
       ASSERT(!is_scrolling(&tty_out, si));
     
       terminate_tty(&tty_out);
    @@ -557,16 +557,16 @@ TEST_IMPL(tty_cursor_back) {
       snprintf(buffer, sizeof(buffer), "%sD", CSI);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(cursor_pos_old.Y == cursor_pos.Y);
    -  ASSERT(cursor_pos_old.X - 1 == cursor_pos.X);
    +  ASSERT_EQ(cursor_pos_old.Y, cursor_pos.Y);
    +  ASSERT_EQ(cursor_pos_old.X - 1, cursor_pos.X);
     
       /* cursor back nth times */
       cursor_pos_old = cursor_pos;
       snprintf(buffer, sizeof(buffer), "%s%dD", CSI, si.width / 4);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(cursor_pos_old.Y == cursor_pos.Y);
    -  ASSERT(cursor_pos_old.X - si.width / 4 == cursor_pos.X);
    +  ASSERT_EQ(cursor_pos_old.Y, cursor_pos.Y);
    +  ASSERT_EQ(cursor_pos_old.X - si.width / 4, cursor_pos.X);
     
       /* cursor back from beginning of line does nothing */
       cursor_pos_old.X = 1;
    @@ -575,8 +575,8 @@ TEST_IMPL(tty_cursor_back) {
       snprintf(buffer, sizeof(buffer), "%sD", CSI);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(cursor_pos_old.Y == cursor_pos.Y);
    -  ASSERT(cursor_pos_old.X == cursor_pos.X);
    +  ASSERT_EQ(cursor_pos_old.Y, cursor_pos.Y);
    +  ASSERT_EQ(cursor_pos_old.X, cursor_pos.X);
     
       /* cursor back from top of screen does nothing */
       cursor_pos_old.X = 1;
    @@ -585,8 +585,8 @@ TEST_IMPL(tty_cursor_back) {
       snprintf(buffer, sizeof(buffer), "%sD", CSI);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(1 == cursor_pos.Y);
    -  ASSERT(1 == cursor_pos.X);
    +  ASSERT_EQ(1, cursor_pos.Y);
    +  ASSERT_EQ(1, cursor_pos.X);
       ASSERT(!is_scrolling(&tty_out, si));
     
       terminate_tty(&tty_out);
    @@ -618,16 +618,16 @@ TEST_IMPL(tty_cursor_next_line) {
       snprintf(buffer, sizeof(buffer), "%sE", CSI);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(cursor_pos_old.Y + 1 == cursor_pos.Y);
    -  ASSERT(1 == cursor_pos.X);
    +  ASSERT_EQ(cursor_pos_old.Y + 1, cursor_pos.Y);
    +  ASSERT_EQ(1, cursor_pos.X);
     
       /* cursor next line nth times */
       cursor_pos_old = cursor_pos;
       snprintf(buffer, sizeof(buffer), "%s%dE", CSI, si.height / 4);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(cursor_pos_old.Y + si.height / 4 == cursor_pos.Y);
    -  ASSERT(1 == cursor_pos.X);
    +  ASSERT_EQ(cursor_pos_old.Y + si.height / 4, cursor_pos.Y);
    +  ASSERT_EQ(1, cursor_pos.X);
     
       /* cursor next line from buttom row moves beginning of line */
       cursor_pos_old.X = si.width / 2;
    @@ -636,8 +636,8 @@ TEST_IMPL(tty_cursor_next_line) {
       snprintf(buffer, sizeof(buffer), "%sE", CSI);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(cursor_pos_old.Y == cursor_pos.Y);
    -  ASSERT(1 == cursor_pos.X);
    +  ASSERT_EQ(cursor_pos_old.Y, cursor_pos.Y);
    +  ASSERT_EQ(1, cursor_pos.X);
       ASSERT(!is_scrolling(&tty_out, si));
     
       terminate_tty(&tty_out);
    @@ -669,16 +669,16 @@ TEST_IMPL(tty_cursor_previous_line) {
       snprintf(buffer, sizeof(buffer), "%sF", CSI);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(cursor_pos_old.Y - 1 == cursor_pos.Y);
    -  ASSERT(1 == cursor_pos.X);
    +  ASSERT_EQ(cursor_pos_old.Y - 1, cursor_pos.Y);
    +  ASSERT_EQ(1, cursor_pos.X);
     
       /* cursor previous line nth times */
       cursor_pos_old = cursor_pos;
       snprintf(buffer, sizeof(buffer), "%s%dF", CSI, si.height / 4);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(cursor_pos_old.Y - si.height / 4 == cursor_pos.Y);
    -  ASSERT(1 == cursor_pos.X);
    +  ASSERT_EQ(cursor_pos_old.Y - si.height / 4, cursor_pos.Y);
    +  ASSERT_EQ(1, cursor_pos.X);
     
       /* cursor previous line from top of screen does nothing */
       cursor_pos_old.X = 1;
    @@ -687,8 +687,8 @@ TEST_IMPL(tty_cursor_previous_line) {
       snprintf(buffer, sizeof(buffer), "%sD", CSI);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(1 == cursor_pos.Y);
    -  ASSERT(1 == cursor_pos.X);
    +  ASSERT_EQ(1, cursor_pos.Y);
    +  ASSERT_EQ(1, cursor_pos.X);
       ASSERT(!is_scrolling(&tty_out, si));
     
       terminate_tty(&tty_out);
    @@ -720,22 +720,22 @@ TEST_IMPL(tty_cursor_horizontal_move_absolute) {
       snprintf(buffer, sizeof(buffer), "%sG", CSI);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(1 == cursor_pos.X);
    -  ASSERT(cursor_pos_old.Y == cursor_pos.Y);
    +  ASSERT_EQ(1, cursor_pos.X);
    +  ASSERT_EQ(cursor_pos_old.Y, cursor_pos.Y);
     
       /* Move cursor to nth character */
       snprintf(buffer, sizeof(buffer), "%s%dG", CSI, si.width / 4);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(si.width / 4 == cursor_pos.X);
    -  ASSERT(cursor_pos_old.Y == cursor_pos.Y);
    +  ASSERT_EQ(si.width / 4, cursor_pos.X);
    +  ASSERT_EQ(cursor_pos_old.Y, cursor_pos.Y);
     
       /* Moving out of screen will fit within screen */
       snprintf(buffer, sizeof(buffer), "%s%dG", CSI, si.width + 1);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(si.width == cursor_pos.X);
    -  ASSERT(cursor_pos_old.Y == cursor_pos.Y);
    +  ASSERT_EQ(si.width, cursor_pos.X);
    +  ASSERT_EQ(cursor_pos_old.Y, cursor_pos.Y);
     
       terminate_tty(&tty_out);
     
    @@ -766,31 +766,31 @@ TEST_IMPL(tty_cursor_move_absolute) {
       snprintf(buffer, sizeof(buffer), "%sH", CSI);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(1 == cursor_pos.X);
    -  ASSERT(1 == cursor_pos.Y);
    +  ASSERT_EQ(1, cursor_pos.X);
    +  ASSERT_EQ(1, cursor_pos.Y);
     
       /* Move the cursor to the middle of the screen */
       snprintf(
           buffer, sizeof(buffer), "%s%d;%df", CSI, si.height / 2, si.width / 2);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(si.width / 2 == cursor_pos.X);
    -  ASSERT(si.height / 2 == cursor_pos.Y);
    +  ASSERT_EQ(si.width / 2, cursor_pos.X);
    +  ASSERT_EQ(si.height / 2, cursor_pos.Y);
     
       /* Moving out of screen will fit within screen */
       snprintf(
           buffer, sizeof(buffer), "%s%d;%df", CSI, si.height / 2, si.width + 1);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(si.width == cursor_pos.X);
    -  ASSERT(si.height / 2 == cursor_pos.Y);
    +  ASSERT_EQ(si.width, cursor_pos.X);
    +  ASSERT_EQ(si.height / 2, cursor_pos.Y);
     
       snprintf(
           buffer, sizeof(buffer), "%s%d;%df", CSI, si.height + 1, si.width / 2);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(si.width / 2 == cursor_pos.X);
    -  ASSERT(si.height == cursor_pos.Y);
    +  ASSERT_EQ(si.width / 2, cursor_pos.X);
    +  ASSERT_EQ(si.height, cursor_pos.Y);
       ASSERT(!is_scrolling(&tty_out, si));
     
       terminate_tty(&tty_out);
    @@ -1000,38 +1000,38 @@ TEST_IMPL(tty_set_cursor_shape) {
       set_cursor_size(&tty_out, CURSOR_SIZE_MIDDLE);
       snprintf(buffer, sizeof(buffer), "%s q", CSI);
       write_console(&tty_out, buffer);
    -  ASSERT(get_cursor_size(&tty_out) == CURSOR_SIZE_LARGE);
    +  ASSERT_EQ(get_cursor_size(&tty_out), CURSOR_SIZE_LARGE);
     
       /* cursor size large */
       set_cursor_size(&tty_out, CURSOR_SIZE_MIDDLE);
       snprintf(buffer, sizeof(buffer), "%s1 q", CSI);
       write_console(&tty_out, buffer);
    -  ASSERT(get_cursor_size(&tty_out) == CURSOR_SIZE_LARGE);
    +  ASSERT_EQ(get_cursor_size(&tty_out), CURSOR_SIZE_LARGE);
       set_cursor_size(&tty_out, CURSOR_SIZE_MIDDLE);
       snprintf(buffer, sizeof(buffer), "%s2 q", CSI);
       write_console(&tty_out, buffer);
    -  ASSERT(get_cursor_size(&tty_out) == CURSOR_SIZE_LARGE);
    +  ASSERT_EQ(get_cursor_size(&tty_out), CURSOR_SIZE_LARGE);
     
       /* cursor size small */
       set_cursor_size(&tty_out, CURSOR_SIZE_MIDDLE);
       snprintf(buffer, sizeof(buffer), "%s3 q", CSI);
       write_console(&tty_out, buffer);
    -  ASSERT(get_cursor_size(&tty_out) == CURSOR_SIZE_SMALL);
    +  ASSERT_EQ(get_cursor_size(&tty_out), CURSOR_SIZE_SMALL);
       set_cursor_size(&tty_out, CURSOR_SIZE_MIDDLE);
       snprintf(buffer, sizeof(buffer), "%s6 q", CSI);
       write_console(&tty_out, buffer);
    -  ASSERT(get_cursor_size(&tty_out) == CURSOR_SIZE_SMALL);
    +  ASSERT_EQ(get_cursor_size(&tty_out), CURSOR_SIZE_SMALL);
     
       /* Nothing occurs with arguments outside valid range */
       set_cursor_size(&tty_out, CURSOR_SIZE_MIDDLE);
       snprintf(buffer, sizeof(buffer), "%s7 q", CSI);
       write_console(&tty_out, buffer);
    -  ASSERT(get_cursor_size(&tty_out) == CURSOR_SIZE_MIDDLE);
    +  ASSERT_EQ(get_cursor_size(&tty_out), CURSOR_SIZE_MIDDLE);
     
       /* restore cursor size if arguments is zero */
       snprintf(buffer, sizeof(buffer), "%s0 q", CSI);
       write_console(&tty_out, buffer);
    -  ASSERT(get_cursor_size(&tty_out) == saved_cursor_size);
    +  ASSERT_EQ(get_cursor_size(&tty_out), saved_cursor_size);
     
       terminate_tty(&tty_out);
     
    @@ -1122,7 +1122,7 @@ TEST_IMPL(tty_set_style) {
       }
     
       /* Set foreground and background color */
    -  ASSERT(ARRAY_SIZE(fg_attrs) == ARRAY_SIZE(bg_attrs));
    +  ASSERT_EQ(ARRAY_SIZE(fg_attrs), ARRAY_SIZE(bg_attrs));
       length = ARRAY_SIZE(bg_attrs);
       for (i = 0; i < length; i++) {
         capture_screen(&tty_out, &expect);
    @@ -1271,8 +1271,8 @@ TEST_IMPL(tty_save_restore_cursor_position) {
       snprintf(buffer, sizeof(buffer), "%su", CSI);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(cursor_pos.X == cursor_pos_old.X);
    -  ASSERT(cursor_pos.Y == cursor_pos_old.Y);
    +  ASSERT_EQ(cursor_pos.X, cursor_pos_old.X);
    +  ASSERT_EQ(cursor_pos.Y, cursor_pos_old.Y);
     
       cursor_pos_old.X = si.width / 2;
       cursor_pos_old.Y = si.height / 2;
    @@ -1290,8 +1290,8 @@ TEST_IMPL(tty_save_restore_cursor_position) {
       snprintf(buffer, sizeof(buffer), "%s8", ESC);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(cursor_pos.X == cursor_pos_old.X);
    -  ASSERT(cursor_pos.Y == cursor_pos_old.Y);
    +  ASSERT_EQ(cursor_pos.X, cursor_pos_old.X);
    +  ASSERT_EQ(cursor_pos.Y, cursor_pos_old.Y);
     
       terminate_tty(&tty_out);
     
    @@ -1332,9 +1332,9 @@ TEST_IMPL(tty_full_reset) {
       write_console(&tty_out, buffer);
       capture_screen(&tty_out, &actual);
       ASSERT(compare_screen(&tty_out, &actual, &expect));
    -  ASSERT(get_cursor_size(&tty_out) == saved_cursor_size);
    -  ASSERT(get_cursor_visibility(&tty_out) == saved_cursor_visibility);
    -  ASSERT(actual.si.csbi.srWindow.Top == 0);
    +  ASSERT_EQ(get_cursor_size(&tty_out), saved_cursor_size);
    +  ASSERT_EQ(get_cursor_visibility(&tty_out), saved_cursor_visibility);
    +  ASSERT_OK(actual.si.csbi.srWindow.Top);
     
       terminate_tty(&tty_out);
     
    @@ -1520,8 +1520,8 @@ TEST_IMPL(tty_escape_sequence_processing) {
       snprintf(buffer, sizeof(buffer), "%s1;%dH", CSI, UINT16_MAX + 1);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(cursor_pos.X == 1);
    -  ASSERT(cursor_pos.Y == 1);
    +  ASSERT_EQ(1, cursor_pos.X);
    +  ASSERT_EQ(1, cursor_pos.Y);
     
       /* Too many argument are ignored */
       cursor_pos.X = 1;
    @@ -1554,18 +1554,18 @@ TEST_IMPL(tty_escape_sequence_processing) {
                expect.si.width / 2);
       write_console(&tty_out, buffer);
       get_cursor_position(&tty_out, &cursor_pos);
    -  ASSERT(cursor_pos.X == 1);
    -  ASSERT(cursor_pos.Y == 1);
    +  ASSERT_EQ(1, cursor_pos.X);
    +  ASSERT_EQ(1, cursor_pos.Y);
     
       /* Invalid sequence are ignored */
       saved_cursor_size = get_cursor_size(&tty_out);
       set_cursor_size(&tty_out, CURSOR_SIZE_MIDDLE);
       snprintf(buffer, sizeof(buffer), "%s 1q", CSI);
       write_console(&tty_out, buffer);
    -  ASSERT(get_cursor_size(&tty_out) == CURSOR_SIZE_MIDDLE);
    +  ASSERT_EQ(get_cursor_size(&tty_out), CURSOR_SIZE_MIDDLE);
       snprintf(buffer, sizeof(buffer), "%s 1 q", CSI);
       write_console(&tty_out, buffer);
    -  ASSERT(get_cursor_size(&tty_out) == CURSOR_SIZE_MIDDLE);
    +  ASSERT_EQ(get_cursor_size(&tty_out), CURSOR_SIZE_MIDDLE);
       set_cursor_size(&tty_out, saved_cursor_size);
     
       /* #1874 2. */
    diff --git a/deps/uv/test/test-tty.c b/deps/uv/test/test-tty.c
    index 418ec31e4b53b3..1b11303829a137 100644
    --- a/deps/uv/test/test-tty.c
    +++ b/deps/uv/test/test-tty.c
    @@ -57,7 +57,7 @@ TEST_IMPL(tty) {
                            OPEN_EXISTING,
                            FILE_ATTRIBUTE_NORMAL,
                            NULL);
    -  ASSERT(handle != INVALID_HANDLE_VALUE);
    +  ASSERT_PTR_NE(handle, INVALID_HANDLE_VALUE);
       ttyin_fd = _open_osfhandle((intptr_t) handle, 0);
     
       handle = CreateFileA("conout$",
    @@ -67,7 +67,7 @@ TEST_IMPL(tty) {
                            OPEN_EXISTING,
                            FILE_ATTRIBUTE_NORMAL,
                            NULL);
    -  ASSERT(handle != INVALID_HANDLE_VALUE);
    +  ASSERT_PTR_NE(handle, INVALID_HANDLE_VALUE);
       ttyout_fd = _open_osfhandle((intptr_t) handle, 0);
     
     #else /* unix */
    @@ -86,26 +86,26 @@ TEST_IMPL(tty) {
       }
     #endif
     
    -  ASSERT(ttyin_fd >= 0);
    -  ASSERT(ttyout_fd >= 0);
    +  ASSERT_GE(ttyin_fd, 0);
    +  ASSERT_GE(ttyout_fd, 0);
     
    -  ASSERT(UV_UNKNOWN_HANDLE == uv_guess_handle(-1));
    +  ASSERT_EQ(UV_UNKNOWN_HANDLE, uv_guess_handle(-1));
     
    -  ASSERT(UV_TTY == uv_guess_handle(ttyin_fd));
    -  ASSERT(UV_TTY == uv_guess_handle(ttyout_fd));
    +  ASSERT_EQ(UV_TTY, uv_guess_handle(ttyin_fd));
    +  ASSERT_EQ(UV_TTY, uv_guess_handle(ttyout_fd));
     
       r = uv_tty_init(loop, &tty_in, ttyin_fd, 1);  /* Readable. */
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       ASSERT(uv_is_readable((uv_stream_t*) &tty_in));
       ASSERT(!uv_is_writable((uv_stream_t*) &tty_in));
     
       r = uv_tty_init(loop, &tty_out, ttyout_fd, 0);  /* Writable. */
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       ASSERT(!uv_is_readable((uv_stream_t*) &tty_out));
       ASSERT(uv_is_writable((uv_stream_t*) &tty_out));
     
       r = uv_tty_get_winsize(&tty_out, &width, &height);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       printf("width=%d height=%d\n", width, height);
     
    @@ -121,18 +121,18 @@ TEST_IMPL(tty) {
     
       /* Turn on raw mode. */
       r = uv_tty_set_mode(&tty_in, UV_TTY_MODE_RAW);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Turn off raw mode. */
       r = uv_tty_set_mode(&tty_in, UV_TTY_MODE_NORMAL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Calling uv_tty_reset_mode() repeatedly should not clobber errno. */
       errno = 0;
    -  ASSERT(0 == uv_tty_reset_mode());
    -  ASSERT(0 == uv_tty_reset_mode());
    -  ASSERT(0 == uv_tty_reset_mode());
    -  ASSERT(0 == errno);
    +  ASSERT_OK(uv_tty_reset_mode());
    +  ASSERT_OK(uv_tty_reset_mode());
    +  ASSERT_OK(uv_tty_reset_mode());
    +  ASSERT_OK(errno);
     
       /* TODO check the actual mode! */
     
    @@ -154,11 +154,11 @@ static void tty_raw_alloc(uv_handle_t* handle, size_t size, uv_buf_t* buf) {
     
     static void tty_raw_read(uv_stream_t* tty_in, ssize_t nread, const uv_buf_t* buf) {
       if (nread > 0) {
    -    ASSERT(nread  == 1);
    -    ASSERT(buf->base[0] == ' ');
    +    ASSERT_EQ(1, nread );
    +    ASSERT_EQ(buf->base[0], ' ');
         uv_close((uv_handle_t*) tty_in, NULL);
       } else {
    -    ASSERT(nread == 0);
    +    ASSERT_OK(nread);
       }
     }
     
    @@ -179,25 +179,25 @@ TEST_IMPL(tty_raw) {
                            OPEN_EXISTING,
                            FILE_ATTRIBUTE_NORMAL,
                            NULL);
    -  ASSERT(handle != INVALID_HANDLE_VALUE);
    +  ASSERT_PTR_NE(handle, INVALID_HANDLE_VALUE);
       ttyin_fd = _open_osfhandle((intptr_t) handle, 0);
    -  ASSERT(ttyin_fd >= 0);
    -  ASSERT(UV_TTY == uv_guess_handle(ttyin_fd));
    +  ASSERT_GE(ttyin_fd, 0);
    +  ASSERT_EQ(UV_TTY, uv_guess_handle(ttyin_fd));
     
       r = uv_tty_init(loop, &tty_in, ttyin_fd, 1);  /* Readable. */
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       ASSERT(uv_is_readable((uv_stream_t*) &tty_in));
       ASSERT(!uv_is_writable((uv_stream_t*) &tty_in));
     
       r = uv_read_start((uv_stream_t*)&tty_in, tty_raw_alloc, tty_raw_read);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Give uv_tty_line_read_thread time to block on ReadConsoleW */
       Sleep(100);
     
       /* Turn on raw mode. */
       r = uv_tty_set_mode(&tty_in, UV_TTY_MODE_RAW);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Write ' ' that should be read in raw mode */
       record.EventType = KEY_EVENT;
    @@ -235,15 +235,15 @@ TEST_IMPL(tty_empty_write) {
                            OPEN_EXISTING,
                            FILE_ATTRIBUTE_NORMAL,
                            NULL);
    -  ASSERT(handle != INVALID_HANDLE_VALUE);
    +  ASSERT_PTR_NE(handle, INVALID_HANDLE_VALUE);
       ttyout_fd = _open_osfhandle((intptr_t) handle, 0);
     
    -  ASSERT(ttyout_fd >= 0);
    +  ASSERT_GE(ttyout_fd, 0);
     
    -  ASSERT(UV_TTY == uv_guess_handle(ttyout_fd));
    +  ASSERT_EQ(UV_TTY, uv_guess_handle(ttyout_fd));
     
       r = uv_tty_init(loop, &tty_out, ttyout_fd, 0);  /* Writable. */
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       ASSERT(!uv_is_readable((uv_stream_t*) &tty_out));
       ASSERT(uv_is_writable((uv_stream_t*) &tty_out));
     
    @@ -251,7 +251,7 @@ TEST_IMPL(tty_empty_write) {
       bufs[0].base = &dummy[0];
     
       r = uv_try_write((uv_stream_t*) &tty_out, bufs, 1);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_close((uv_handle_t*) &tty_out, NULL);
     
    @@ -281,15 +281,15 @@ TEST_IMPL(tty_large_write) {
                            OPEN_EXISTING,
                            FILE_ATTRIBUTE_NORMAL,
                            NULL);
    -  ASSERT(handle != INVALID_HANDLE_VALUE);
    +  ASSERT_PTR_NE(handle, INVALID_HANDLE_VALUE);
       ttyout_fd = _open_osfhandle((intptr_t) handle, 0);
     
    -  ASSERT(ttyout_fd >= 0);
    +  ASSERT_GE(ttyout_fd, 0);
     
    -  ASSERT(UV_TTY == uv_guess_handle(ttyout_fd));
    +  ASSERT_EQ(UV_TTY, uv_guess_handle(ttyout_fd));
     
       r = uv_tty_init(loop, &tty_out, ttyout_fd, 0);  /* Writable. */
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       memset(dummy, '.', sizeof(dummy) - 1);
       dummy[sizeof(dummy) - 1] = '\n';
    @@ -297,7 +297,7 @@ TEST_IMPL(tty_large_write) {
       bufs[0] = uv_buf_init(dummy, sizeof(dummy));
     
       r = uv_try_write((uv_stream_t*) &tty_out, bufs, 1);
    -  ASSERT(r == 10000);
    +  ASSERT_EQ(10000, r);
     
       uv_close((uv_handle_t*) &tty_out, NULL);
     
    @@ -321,20 +321,20 @@ TEST_IMPL(tty_raw_cancel) {
                            OPEN_EXISTING,
                            FILE_ATTRIBUTE_NORMAL,
                            NULL);
    -  ASSERT(handle != INVALID_HANDLE_VALUE);
    +  ASSERT_PTR_NE(handle, INVALID_HANDLE_VALUE);
       ttyin_fd = _open_osfhandle((intptr_t) handle, 0);
    -  ASSERT(ttyin_fd >= 0);
    -  ASSERT(UV_TTY == uv_guess_handle(ttyin_fd));
    +  ASSERT_GE(ttyin_fd, 0);
    +  ASSERT_EQ(UV_TTY, uv_guess_handle(ttyin_fd));
     
       r = uv_tty_init(uv_default_loop(), &tty_in, ttyin_fd, 1);  /* Readable. */
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_tty_set_mode(&tty_in, UV_TTY_MODE_RAW);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_read_start((uv_stream_t*)&tty_in, tty_raw_alloc, tty_raw_read);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_read_stop((uv_stream_t*) &tty_in);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -350,35 +350,35 @@ TEST_IMPL(tty_file) {
       uv_tty_t tty_wo;
       int fd;
     
    -  ASSERT(0 == uv_loop_init(&loop));
    +  ASSERT_OK(uv_loop_init(&loop));
     
       fd = open("test/fixtures/empty_file", O_RDONLY);
       if (fd != -1) {
    -    ASSERT(UV_EINVAL == uv_tty_init(&loop, &tty, fd, 1));
    -    ASSERT(0 == close(fd));
    +    ASSERT_EQ(UV_EINVAL, uv_tty_init(&loop, &tty, fd, 1));
    +    ASSERT_OK(close(fd));
         /* test EBADF handling */
    -    ASSERT(UV_EINVAL == uv_tty_init(&loop, &tty, fd, 1));
    +    ASSERT_EQ(UV_EINVAL, uv_tty_init(&loop, &tty, fd, 1));
       }
     
     /* Bug on AIX where '/dev/random' returns 1 from isatty() */
     #ifndef _AIX
       fd = open("/dev/random", O_RDONLY);
       if (fd != -1) {
    -    ASSERT(UV_EINVAL == uv_tty_init(&loop, &tty, fd, 1));
    -    ASSERT(0 == close(fd));
    +    ASSERT_EQ(UV_EINVAL, uv_tty_init(&loop, &tty, fd, 1));
    +    ASSERT_OK(close(fd));
       }
     #endif /* _AIX */
     
       fd = open("/dev/zero", O_RDONLY);
       if (fd != -1) {
    -    ASSERT(UV_EINVAL == uv_tty_init(&loop, &tty, fd, 1));
    -    ASSERT(0 == close(fd));
    +    ASSERT_EQ(UV_EINVAL, uv_tty_init(&loop, &tty, fd, 1));
    +    ASSERT_OK(close(fd));
       }
     
       fd = open("/dev/tty", O_RDWR);
       if (fd != -1) {
    -    ASSERT(0 == uv_tty_init(&loop, &tty, fd, 1));
    -    ASSERT(0 == close(fd)); /* TODO: it's indeterminate who owns fd now */
    +    ASSERT_OK(uv_tty_init(&loop, &tty, fd, 1));
    +    ASSERT_OK(close(fd)); /* TODO: it's indeterminate who owns fd now */
         ASSERT(uv_is_readable((uv_stream_t*) &tty));
         ASSERT(uv_is_writable((uv_stream_t*) &tty));
         uv_close((uv_handle_t*) &tty, NULL);
    @@ -388,8 +388,8 @@ TEST_IMPL(tty_file) {
     
       fd = open("/dev/tty", O_RDONLY);
       if (fd != -1) {
    -    ASSERT(0 == uv_tty_init(&loop, &tty_ro, fd, 1));
    -    ASSERT(0 == close(fd)); /* TODO: it's indeterminate who owns fd now */
    +    ASSERT_OK(uv_tty_init(&loop, &tty_ro, fd, 1));
    +    ASSERT_OK(close(fd)); /* TODO: it's indeterminate who owns fd now */
         ASSERT(uv_is_readable((uv_stream_t*) &tty_ro));
         ASSERT(!uv_is_writable((uv_stream_t*) &tty_ro));
         uv_close((uv_handle_t*) &tty_ro, NULL);
    @@ -399,8 +399,8 @@ TEST_IMPL(tty_file) {
     
       fd = open("/dev/tty", O_WRONLY);
       if (fd != -1) {
    -    ASSERT(0 == uv_tty_init(&loop, &tty_wo, fd, 0));
    -    ASSERT(0 == close(fd)); /* TODO: it's indeterminate who owns fd now */
    +    ASSERT_OK(uv_tty_init(&loop, &tty_wo, fd, 0));
    +    ASSERT_OK(close(fd)); /* TODO: it's indeterminate who owns fd now */
         ASSERT(!uv_is_readable((uv_stream_t*) &tty_wo));
         ASSERT(uv_is_writable((uv_stream_t*) &tty_wo));
         uv_close((uv_handle_t*) &tty_wo, NULL);
    @@ -409,7 +409,7 @@ TEST_IMPL(tty_file) {
       }
     
     
    -  ASSERT(0 == uv_run(&loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(&loop, UV_RUN_DEFAULT));
     
       MAKE_VALGRIND_HAPPY(&loop);
     #endif
    @@ -436,14 +436,14 @@ TEST_IMPL(tty_pty) {
       uv_loop_t loop;
       uv_tty_t master_tty, slave_tty;
     
    -  ASSERT(0 == uv_loop_init(&loop));
    +  ASSERT_OK(uv_loop_init(&loop));
     
       r = openpty(&master_fd, &slave_fd, NULL, NULL, &w);
       if (r != 0)
         RETURN_SKIP("No pty available, skipping.");
     
    -  ASSERT(0 == uv_tty_init(&loop, &slave_tty, slave_fd, 0));
    -  ASSERT(0 == uv_tty_init(&loop, &master_tty, master_fd, 0));
    +  ASSERT_OK(uv_tty_init(&loop, &slave_tty, slave_fd, 0));
    +  ASSERT_OK(uv_tty_init(&loop, &master_tty, master_fd, 0));
       ASSERT(uv_is_readable((uv_stream_t*) &slave_tty));
       ASSERT(uv_is_writable((uv_stream_t*) &slave_tty));
       ASSERT(uv_is_readable((uv_stream_t*) &master_tty));
    @@ -451,16 +451,16 @@ TEST_IMPL(tty_pty) {
       /* Check if the file descriptor was reopened. If it is,
        * UV_HANDLE_BLOCKING_WRITES (value 0x100000) isn't set on flags.
        */
    -  ASSERT(0 == (slave_tty.flags & 0x100000));
    +  ASSERT_OK((slave_tty.flags & 0x100000));
       /* The master_fd of a pty should never be reopened.
        */
       ASSERT(master_tty.flags & 0x100000);
    -  ASSERT(0 == close(slave_fd));
    +  ASSERT_OK(close(slave_fd));
       uv_close((uv_handle_t*) &slave_tty, NULL);
    -  ASSERT(0 == close(master_fd));
    +  ASSERT_OK(close(master_fd));
       uv_close((uv_handle_t*) &master_tty, NULL);
     
    -  ASSERT(0 == uv_run(&loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(&loop, UV_RUN_DEFAULT));
     
       MAKE_VALGRIND_HAPPY(&loop);
     #endif
    diff --git a/deps/uv/test/test-udp-alloc-cb-fail.c b/deps/uv/test/test-udp-alloc-cb-fail.c
    index 073dea977821d6..ae4bbee325e9b8 100644
    --- a/deps/uv/test/test-udp-alloc-cb-fail.c
    +++ b/deps/uv/test/test-udp-alloc-cb-fail.c
    @@ -27,7 +27,7 @@
     #include 
     
     #define CHECK_HANDLE(handle) \
    -  ASSERT((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client)
    +  ASSERT_NE((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client, 0)
     
     static uv_udp_t server;
     static uv_udp_t client;
    @@ -60,7 +60,7 @@ static void cl_alloc_cb(uv_handle_t* handle,
     
     static void close_cb(uv_handle_t* handle) {
       CHECK_HANDLE(handle);
    -  ASSERT(1 == uv_is_closing(handle));
    +  ASSERT_EQ(1, uv_is_closing(handle));
       close_cb_called++;
     }
     
    @@ -71,8 +71,8 @@ static void cl_recv_cb(uv_udp_t* handle,
                            const struct sockaddr* addr,
                            unsigned flags) {
       CHECK_HANDLE(handle);
    -  ASSERT(flags == 0);
    -  ASSERT(nread == UV_ENOBUFS);
    +  ASSERT_OK(flags);
    +  ASSERT_EQ(nread, UV_ENOBUFS);
     
       cl_recv_cb_called++;
     
    @@ -84,11 +84,11 @@ static void cl_send_cb(uv_udp_send_t* req, int status) {
       int r;
     
       ASSERT_NOT_NULL(req);
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       CHECK_HANDLE(req->handle);
     
       r = uv_udp_recv_start(req->handle, cl_alloc_cb, cl_recv_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       cl_send_cb_called++;
     }
    @@ -96,7 +96,7 @@ static void cl_send_cb(uv_udp_send_t* req, int status) {
     
     static void sv_send_cb(uv_udp_send_t* req, int status) {
       ASSERT_NOT_NULL(req);
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       CHECK_HANDLE(req->handle);
     
       uv_close((uv_handle_t*) req->handle, close_cb);
    @@ -126,21 +126,21 @@ static void sv_recv_cb(uv_udp_t* handle,
       }
     
       CHECK_HANDLE(handle);
    -  ASSERT(flags == 0);
    +  ASSERT_OK(flags);
     
       ASSERT_NOT_NULL(addr);
    -  ASSERT(nread == 4);
    +  ASSERT_EQ(4, nread);
       ASSERT(!memcmp("PING", rcvbuf->base, nread));
     
       r = uv_udp_recv_stop(handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       req = malloc(sizeof *req);
       ASSERT_NOT_NULL(req);
     
       sndbuf = uv_buf_init("PONG", 4);
       r = uv_udp_send(req, handle, &sndbuf, 1, addr, sv_send_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       sv_recv_cb_called++;
     }
    @@ -152,21 +152,21 @@ TEST_IMPL(udp_alloc_cb_fail) {
       uv_buf_t buf;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
     
       r = uv_udp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_bind(&server, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_recv_start(&server, sv_alloc_cb, sv_recv_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       r = uv_udp_init(uv_default_loop(), &client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       buf = uv_buf_init("PING", 4);
       r = uv_udp_send(&req,
    @@ -175,21 +175,21 @@ TEST_IMPL(udp_alloc_cb_fail) {
                       1,
                       (const struct sockaddr*) &addr,
                       cl_send_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(close_cb_called == 0);
    -  ASSERT(cl_send_cb_called == 0);
    -  ASSERT(cl_recv_cb_called == 0);
    -  ASSERT(sv_send_cb_called == 0);
    -  ASSERT(sv_recv_cb_called == 0);
    +  ASSERT_OK(close_cb_called);
    +  ASSERT_OK(cl_send_cb_called);
    +  ASSERT_OK(cl_recv_cb_called);
    +  ASSERT_OK(sv_send_cb_called);
    +  ASSERT_OK(sv_recv_cb_called);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(cl_send_cb_called == 1);
    -  ASSERT(cl_recv_cb_called == 1);
    -  ASSERT(sv_send_cb_called == 1);
    -  ASSERT(sv_recv_cb_called == 1);
    -  ASSERT(close_cb_called == 2);
    +  ASSERT_EQ(1, cl_send_cb_called);
    +  ASSERT_EQ(1, cl_recv_cb_called);
    +  ASSERT_EQ(1, sv_send_cb_called);
    +  ASSERT_EQ(1, sv_recv_cb_called);
    +  ASSERT_EQ(2, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-udp-bind.c b/deps/uv/test/test-udp-bind.c
    index 200cdc7c927fa9..519f9b02fa2cc2 100644
    --- a/deps/uv/test/test-udp-bind.c
    +++ b/deps/uv/test/test-udp-bind.c
    @@ -33,27 +33,27 @@ TEST_IMPL(udp_bind) {
       uv_udp_t h1, h2;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
     
       loop = uv_default_loop();
     
       r = uv_udp_init(loop, &h1);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_init(loop, &h2);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_bind(&h1, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_bind(&h2, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == UV_EADDRINUSE);
    +  ASSERT_EQ(r, UV_EADDRINUSE);
     
       uv_close((uv_handle_t*) &h1, NULL);
       uv_close((uv_handle_t*) &h2, NULL);
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -66,27 +66,27 @@ TEST_IMPL(udp_bind_reuseaddr) {
       uv_udp_t h1, h2;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
     
       loop = uv_default_loop();
     
       r = uv_udp_init(loop, &h1);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_init(loop, &h2);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_bind(&h1, (const struct sockaddr*) &addr, UV_UDP_REUSEADDR);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_bind(&h2, (const struct sockaddr*) &addr, UV_UDP_REUSEADDR);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_close((uv_handle_t*) &h1, NULL);
       uv_close((uv_handle_t*) &h2, NULL);
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-udp-connect.c b/deps/uv/test/test-udp-connect.c
    index c1e4064b94e255..88314acc69b073 100644
    --- a/deps/uv/test/test-udp-connect.c
    +++ b/deps/uv/test/test-udp-connect.c
    @@ -27,7 +27,7 @@
     #include 
     
     #define CHECK_HANDLE(handle) \
    -  ASSERT((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client)
    +  ASSERT_NE((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client, 0)
     
     static uv_udp_t server;
     static uv_udp_t client;
    @@ -45,7 +45,7 @@ static void alloc_cb(uv_handle_t* handle,
                          uv_buf_t* buf) {
       static char slab[65536];
       CHECK_HANDLE(handle);
    -  ASSERT(suggested_size <= sizeof(slab));
    +  ASSERT_LE(suggested_size, sizeof(slab));
       buf->base = slab;
       buf->len = sizeof(slab);
     }
    @@ -62,19 +62,19 @@ static void cl_send_cb(uv_udp_send_t* req, int status) {
       int r;
     
       ASSERT_NOT_NULL(req);
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       CHECK_HANDLE(req->handle);
       if (++cl_send_cb_called == 1) {
         uv_udp_connect(&client, NULL);
         r = uv_udp_send(req, &client, &buf, 1, NULL, cl_send_cb);
    -    ASSERT(r == UV_EDESTADDRREQ);
    +    ASSERT_EQ(r, UV_EDESTADDRREQ);
         r = uv_udp_send(req,
                         &client,
                         &buf,
                         1,
                         (const struct sockaddr*) &lo_addr,
                         cl_send_cb);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     
     }
    @@ -86,9 +86,9 @@ static void sv_recv_cb(uv_udp_t* handle,
                            const struct sockaddr* addr,
                            unsigned flags) {
       if (nread > 0) {
    -    ASSERT(nread == 4);
    +    ASSERT_EQ(4, nread);
         ASSERT_NOT_NULL(addr);
    -    ASSERT(memcmp("EXIT", rcvbuf->base, nread) == 0);
    +    ASSERT_OK(memcmp("EXIT", rcvbuf->base, nread));
         if (++sv_recv_cb_called == 4) {
           uv_close((uv_handle_t*) &server, close_cb);
           uv_close((uv_handle_t*) &client, close_cb);
    @@ -107,89 +107,89 @@ TEST_IMPL(udp_connect) {
       int r;
       int addrlen;
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &lo_addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &lo_addr));
     
       r = uv_udp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_bind(&server, (const struct sockaddr*) &lo_addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_recv_start(&server, alloc_cb, sv_recv_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_init(uv_default_loop(), &client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       buf = uv_buf_init("EXIT", 4);
     
       /* connect() to INADDR_ANY fails on Windows with WSAEADDRNOTAVAIL */
    -  ASSERT_EQ(0, uv_ip4_addr("0.0.0.0", TEST_PORT, &tmp_addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &tmp_addr));
       r = uv_udp_connect(&client, (const struct sockaddr*) &tmp_addr);
     #ifdef _WIN32
       ASSERT_EQ(r, UV_EADDRNOTAVAIL);
     #else
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
       r = uv_udp_connect(&client, NULL);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     #endif
     
    -  ASSERT(0 == uv_ip4_addr("8.8.8.8", TEST_PORT, &ext_addr));
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &lo_addr));
    +  ASSERT_OK(uv_ip4_addr("8.8.8.8", TEST_PORT, &ext_addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &lo_addr));
     
       r = uv_udp_connect(&client, (const struct sockaddr*) &lo_addr);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_udp_connect(&client, (const struct sockaddr*) &ext_addr);
    -  ASSERT(r == UV_EISCONN);
    +  ASSERT_EQ(r, UV_EISCONN);
     
       addrlen = sizeof(tmp_addr);
       r = uv_udp_getpeername(&client, (struct sockaddr*) &tmp_addr, &addrlen);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* To send messages in connected UDP sockets addr must be NULL */
       r = uv_udp_try_send(&client, &buf, 1, (const struct sockaddr*) &lo_addr);
    -  ASSERT(r == UV_EISCONN);
    +  ASSERT_EQ(r, UV_EISCONN);
       r = uv_udp_try_send(&client, &buf, 1, NULL);
    -  ASSERT(r == 4);
    +  ASSERT_EQ(4, r);
       r = uv_udp_try_send(&client, &buf, 1, (const struct sockaddr*) &ext_addr);
    -  ASSERT(r == UV_EISCONN);
    +  ASSERT_EQ(r, UV_EISCONN);
     
       r = uv_udp_connect(&client, NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_udp_connect(&client, NULL);
    -  ASSERT(r == UV_ENOTCONN);
    +  ASSERT_EQ(r, UV_ENOTCONN);
     
       addrlen = sizeof(tmp_addr);
       r = uv_udp_getpeername(&client, (struct sockaddr*) &tmp_addr, &addrlen);
    -  ASSERT(r == UV_ENOTCONN);
    +  ASSERT_EQ(r, UV_ENOTCONN);
     
       /* To send messages in disconnected UDP sockets addr must be set */
       r = uv_udp_try_send(&client, &buf, 1, (const struct sockaddr*) &lo_addr);
    -  ASSERT(r == 4);
    +  ASSERT_EQ(4, r);
       r = uv_udp_try_send(&client, &buf, 1, NULL);
    -  ASSERT(r == UV_EDESTADDRREQ);
    +  ASSERT_EQ(r, UV_EDESTADDRREQ);
     
     
       r = uv_udp_connect(&client, (const struct sockaddr*) &lo_addr);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_udp_send(&req,
                       &client,
                       &buf,
                       1,
                       (const struct sockaddr*) &lo_addr,
                       cl_send_cb);
    -  ASSERT(r == UV_EISCONN);
    +  ASSERT_EQ(r, UV_EISCONN);
       r = uv_udp_send(&req, &client, &buf, 1, NULL, cl_send_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(close_cb_called == 2);
    -  ASSERT(sv_recv_cb_called == 4);
    -  ASSERT(cl_send_cb_called == 2);
    +  ASSERT_EQ(2, close_cb_called);
    +  ASSERT_EQ(4, sv_recv_cb_called);
    +  ASSERT_EQ(2, cl_send_cb_called);
     
    -  ASSERT(client.send_queue_size == 0);
    -  ASSERT(server.send_queue_size == 0);
    +  ASSERT_OK(client.send_queue_size);
    +  ASSERT_OK(server.send_queue_size);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-udp-connect6.c b/deps/uv/test/test-udp-connect6.c
    index 076d8d77b92df4..bbc4033c55f9fd 100644
    --- a/deps/uv/test/test-udp-connect6.c
    +++ b/deps/uv/test/test-udp-connect6.c
    @@ -27,7 +27,7 @@
     #include 
     
     #define CHECK_HANDLE(handle) \
    -  ASSERT((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client)
    +  ASSERT_NE((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client, 0)
     
     static uv_udp_t server;
     static uv_udp_t client;
    @@ -62,7 +62,7 @@ static void cl_send_cb(uv_udp_send_t* req, int status) {
       int r;
     
       ASSERT_NOT_NULL(req);
    -  ASSERT_EQ(status, 0);
    +  ASSERT_OK(status);
       CHECK_HANDLE(req->handle);
       if (++cl_send_cb_called == 1) {
         uv_udp_connect(&client, NULL);
    @@ -74,7 +74,7 @@ static void cl_send_cb(uv_udp_send_t* req, int status) {
                         1,
                         (const struct sockaddr*) &lo_addr,
                         cl_send_cb);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
       }
     
     }
    @@ -86,9 +86,9 @@ static void sv_recv_cb(uv_udp_t* handle,
                            const struct sockaddr* addr,
                            unsigned flags) {
       if (nread > 0) {
    -    ASSERT_EQ(nread, 4);
    +    ASSERT_EQ(4, nread);
         ASSERT_NOT_NULL(addr);
    -    ASSERT_EQ(memcmp("EXIT", rcvbuf->base, nread), 0);
    +    ASSERT_OK(memcmp("EXIT", rcvbuf->base, nread));
         if (++sv_recv_cb_called == 4) {
           uv_close((uv_handle_t*) &server, close_cb);
           uv_close((uv_handle_t*) &client, close_cb);
    @@ -110,55 +110,55 @@ TEST_IMPL(udp_connect6) {
       if (!can_ipv6())
         RETURN_SKIP("IPv6 not supported");
     
    -  ASSERT_EQ(0, uv_ip6_addr("::", TEST_PORT, &lo_addr));
    +  ASSERT_OK(uv_ip6_addr("::", TEST_PORT, &lo_addr));
     
       r = uv_udp_init(uv_default_loop(), &server);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_bind(&server, (const struct sockaddr*) &lo_addr, 0);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_recv_start(&server, alloc_cb, sv_recv_cb);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_init(uv_default_loop(), &client);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       buf = uv_buf_init("EXIT", 4);
     
       /* connect() to INADDR_ANY fails on Windows wih WSAEADDRNOTAVAIL */
    -  ASSERT_EQ(0, uv_ip6_addr("::", TEST_PORT, &tmp_addr));
    +  ASSERT_OK(uv_ip6_addr("::", TEST_PORT, &tmp_addr));
       r = uv_udp_connect(&client, (const struct sockaddr*) &tmp_addr);
     #ifdef _WIN32
       ASSERT_EQ(r, UV_EADDRNOTAVAIL);
     #else
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
       r = uv_udp_connect(&client, NULL);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     #endif
     
    -  ASSERT_EQ(0, uv_ip6_addr("2001:4860:4860::8888", TEST_PORT, &ext_addr));
    -  ASSERT_EQ(0, uv_ip6_addr("::1", TEST_PORT, &lo_addr));
    +  ASSERT_OK(uv_ip6_addr("2001:4860:4860::8888", TEST_PORT, &ext_addr));
    +  ASSERT_OK(uv_ip6_addr("::1", TEST_PORT, &lo_addr));
     
       r = uv_udp_connect(&client, (const struct sockaddr*) &lo_addr);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
       r = uv_udp_connect(&client, (const struct sockaddr*) &ext_addr);
       ASSERT_EQ(r, UV_EISCONN);
     
       addrlen = sizeof(tmp_addr);
       r = uv_udp_getpeername(&client, (struct sockaddr*) &tmp_addr, &addrlen);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       /* To send messages in connected UDP sockets addr must be NULL */
       r = uv_udp_try_send(&client, &buf, 1, (const struct sockaddr*) &lo_addr);
       ASSERT_EQ(r, UV_EISCONN);
       r = uv_udp_try_send(&client, &buf, 1, NULL);
    -  ASSERT_EQ(r, 4);
    +  ASSERT_EQ(4, r);
       r = uv_udp_try_send(&client, &buf, 1, (const struct sockaddr*) &ext_addr);
       ASSERT_EQ(r, UV_EISCONN);
     
       r = uv_udp_connect(&client, NULL);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
       r = uv_udp_connect(&client, NULL);
       ASSERT_EQ(r, UV_ENOTCONN);
     
    @@ -168,13 +168,13 @@ TEST_IMPL(udp_connect6) {
     
       /* To send messages in disconnected UDP sockets addr must be set */
       r = uv_udp_try_send(&client, &buf, 1, (const struct sockaddr*) &lo_addr);
    -  ASSERT_EQ(r, 4);
    +  ASSERT_EQ(4, r);
       r = uv_udp_try_send(&client, &buf, 1, NULL);
       ASSERT_EQ(r, UV_EDESTADDRREQ);
     
     
       r = uv_udp_connect(&client, (const struct sockaddr*) &lo_addr);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
       r = uv_udp_send(&req,
                       &client,
                       &buf,
    @@ -183,16 +183,16 @@ TEST_IMPL(udp_connect6) {
                       cl_send_cb);
       ASSERT_EQ(r, UV_EISCONN);
       r = uv_udp_send(&req, &client, &buf, 1, NULL, cl_send_cb);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT_EQ(close_cb_called, 2);
    -  ASSERT_EQ(sv_recv_cb_called, 4);
    -  ASSERT_EQ(cl_send_cb_called, 2);
    +  ASSERT_EQ(2, close_cb_called);
    +  ASSERT_EQ(4, sv_recv_cb_called);
    +  ASSERT_EQ(2, cl_send_cb_called);
     
    -  ASSERT_EQ(client.send_queue_size, 0);
    -  ASSERT_EQ(server.send_queue_size, 0);
    +  ASSERT_OK(client.send_queue_size);
    +  ASSERT_OK(server.send_queue_size);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-udp-create-socket-early.c b/deps/uv/test/test-udp-create-socket-early.c
    index f51e275ba1e352..f2e166af9c2b80 100644
    --- a/deps/uv/test/test-udp-create-socket-early.c
    +++ b/deps/uv/test/test-udp-create-socket-early.c
    @@ -38,32 +38,34 @@ TEST_IMPL(udp_create_early) {
       uv_os_fd_t fd;
       int r, namelen;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       r = uv_udp_init_ex(uv_default_loop(), &client, AF_INET);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_fileno((const uv_handle_t*) &client, &fd);
    -  ASSERT(r == 0);
    -  ASSERT(fd != INVALID_FD);
    +  ASSERT_OK(r);
     
       /* Windows returns WSAEINVAL if the socket is not bound */
     #ifndef _WIN32
    +  ASSERT_NE(fd, INVALID_FD);
       namelen = sizeof sockname;
       r = uv_udp_getsockname(&client, (struct sockaddr*) &sockname, &namelen);
    -  ASSERT(r == 0);
    -  ASSERT(sockname.sin_family == AF_INET);
    +  ASSERT_OK(r);
    +  ASSERT_EQ(sockname.sin_family, AF_INET);
    +#else
    +  ASSERT_PTR_NE(fd, INVALID_FD);
     #endif
     
       r = uv_udp_bind(&client, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       namelen = sizeof sockname;
       r = uv_udp_getsockname(&client, (struct sockaddr*) &sockname, &namelen);
    -  ASSERT(r == 0);
    -  ASSERT(memcmp(&addr.sin_addr,
    -                &sockname.sin_addr,
    -                sizeof(addr.sin_addr)) == 0);
    +  ASSERT_OK(r);
    +  ASSERT_OK(memcmp(&addr.sin_addr,
    +                   &sockname.sin_addr,
    +                   sizeof(addr.sin_addr)));
     
       uv_close((uv_handle_t*) &client, NULL);
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    @@ -82,32 +84,34 @@ TEST_IMPL(udp_create_early_bad_bind) {
       if (!can_ipv6())
         RETURN_SKIP("IPv6 not supported");
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       r = uv_udp_init_ex(uv_default_loop(), &client, AF_INET6);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_fileno((const uv_handle_t*) &client, &fd);
    -  ASSERT(r == 0);
    -  ASSERT(fd != INVALID_FD);
    +  ASSERT_OK(r);
     
       /* Windows returns WSAEINVAL if the socket is not bound */
    -#ifndef _WIN32
    -  {
    +#ifndef _WIN32 
    +  ASSERT_NE(fd, INVALID_FD);
    +  { 
         int namelen;
         struct sockaddr_in6 sockname;
         namelen = sizeof sockname;
         r = uv_udp_getsockname(&client, (struct sockaddr*) &sockname, &namelen);
    -    ASSERT(r == 0);
    -    ASSERT(sockname.sin6_family == AF_INET6);
    +    ASSERT_OK(r);
    +    ASSERT_EQ(sockname.sin6_family, AF_INET6);
       }
    +#else 
    +  ASSERT_PTR_NE(fd, INVALID_FD);
     #endif
     
       r = uv_udp_bind(&client, (const struct sockaddr*) &addr, 0);
     #if !defined(_WIN32) && !defined(__CYGWIN__) && !defined(__MSYS__)
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     #else
    -  ASSERT(r == UV_EFAULT);
    +  ASSERT_EQ(r, UV_EFAULT);
     #endif
     
       uv_close((uv_handle_t*) &client, NULL);
    @@ -123,10 +127,10 @@ TEST_IMPL(udp_create_early_bad_domain) {
       int r;
     
       r = uv_udp_init_ex(uv_default_loop(), &client, 47);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       r = uv_udp_init_ex(uv_default_loop(), &client, 1024);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    diff --git a/deps/uv/test/test-udp-dgram-too-big.c b/deps/uv/test/test-udp-dgram-too-big.c
    index 9db8b47be18da8..8fae756e5c4c88 100644
    --- a/deps/uv/test/test-udp-dgram-too-big.c
    +++ b/deps/uv/test/test-udp-dgram-too-big.c
    @@ -27,10 +27,10 @@
     #include 
     
     #define CHECK_HANDLE(handle) \
    -  ASSERT((uv_udp_t*)(handle) == &handle_)
    +  ASSERT_PTR_EQ((uv_udp_t*)(handle), &handle_)
     
     #define CHECK_REQ(req) \
    -  ASSERT((req) == &req_);
    +  ASSERT_PTR_EQ((req), &req_);
     
     static uv_udp_t handle_;
     static uv_udp_send_t req_;
    @@ -49,7 +49,7 @@ static void send_cb(uv_udp_send_t* req, int status) {
       CHECK_REQ(req);
       CHECK_HANDLE(req->handle);
     
    -  ASSERT(status == UV_EMSGSIZE);
    +  ASSERT_EQ(status, UV_EMSGSIZE);
     
       uv_close((uv_handle_t*)req->handle, close_cb);
       send_cb_called++;
    @@ -65,10 +65,10 @@ TEST_IMPL(udp_dgram_too_big) {
       memset(dgram, 42, sizeof dgram); /* silence valgrind */
     
       r = uv_udp_init(uv_default_loop(), &handle_);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       buf = uv_buf_init(dgram, sizeof dgram);
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       r = uv_udp_send(&req_,
                       &handle_,
    @@ -76,15 +76,15 @@ TEST_IMPL(udp_dgram_too_big) {
                       1,
                       (const struct sockaddr*) &addr,
                       send_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(close_cb_called == 0);
    -  ASSERT(send_cb_called == 0);
    +  ASSERT_OK(close_cb_called);
    +  ASSERT_OK(send_cb_called);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(send_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, send_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-udp-ipv6.c b/deps/uv/test/test-udp-ipv6.c
    index ae55cd01b0b2a7..8ad80b9b5a9b6d 100644
    --- a/deps/uv/test/test-udp-ipv6.c
    +++ b/deps/uv/test/test-udp-ipv6.c
    @@ -30,13 +30,13 @@
     #include 
     #endif
     
    -#define CHECK_HANDLE(handle)                \
    -  ASSERT((uv_udp_t*)(handle) == &server     \
    -      || (uv_udp_t*)(handle) == &client     \
    -      || (uv_timer_t*)(handle) == &timeout)
    +#define CHECK_HANDLE(handle)                   \
    +  ASSERT_NE((uv_udp_t*)(handle) == &server     \
    +         || (uv_udp_t*)(handle) == &client     \
    +         || (uv_timer_t*)(handle) == &timeout, 0)
     
     #define CHECK_REQ(req) \
    -  ASSERT((req) == &req_);
    +  ASSERT_PTR_EQ((req), &req_);
     
     static uv_udp_t client;
     static uv_udp_t server;
    @@ -81,7 +81,7 @@ static void close_cb(uv_handle_t* handle) {
     static void send_cb(uv_udp_send_t* req, int status) {
       CHECK_REQ(req);
       CHECK_HANDLE(req->handle);
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       send_cb_called++;
     }
     
    @@ -92,7 +92,7 @@ static int is_from_client(const struct sockaddr* addr) {
     
       /* Debugging output, and filter out unwanted network traffic */
       if (addr != NULL) {
    -    ASSERT(addr->sa_family == AF_INET6);
    +    ASSERT_EQ(addr->sa_family, AF_INET6);
         addr6 = (struct sockaddr_in6*) addr;
         r = uv_inet_ntop(addr->sa_family, &addr6->sin6_addr, dst, sizeof(dst));
         if (r == 0)
    @@ -129,7 +129,7 @@ static void ipv6_recv_ok(uv_udp_t* handle,
       if (!is_from_client(addr) || (nread == 0 && addr == NULL))
         return;
     
    -  ASSERT(nread == 9);
    +  ASSERT_EQ(9, nread);
       ASSERT(!memcmp(buf->base, data, 9));
       recv_cb_called++;
     }
    @@ -151,31 +151,39 @@ static void do_test(uv_udp_recv_cb recv_cb, int bind_flags) {
       char dst[256];
       int r;
     
    -  ASSERT(0 == uv_ip6_addr("::0", TEST_PORT, &addr6));
    +  ASSERT_OK(uv_ip6_addr("::0", TEST_PORT, &addr6));
     
       r = uv_udp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_bind(&server, (const struct sockaddr*) &addr6, bind_flags);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       addr6_len = sizeof(addr6);
    -  ASSERT(uv_udp_getsockname(&server, (struct sockaddr*) &addr6, &addr6_len) == 0);
    -  ASSERT(uv_inet_ntop(addr6.sin6_family, &addr6.sin6_addr, dst, sizeof(dst)) == 0);
    +  ASSERT_OK(uv_udp_getsockname(&server,
    +                               (struct sockaddr*) &addr6,
    +                               &addr6_len));
    +  ASSERT_OK(uv_inet_ntop(addr6.sin6_family,
    +                         &addr6.sin6_addr,
    +                         dst,
    +                         sizeof(dst)));
       printf("on [%.*s]:%d\n", (int) sizeof(dst), dst, addr6.sin6_port);
     
       r = uv_udp_recv_start(&server, alloc_cb, recv_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_init(uv_default_loop(), &client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    -  ASSERT(uv_inet_ntop(addr.sin_family, &addr.sin_addr, dst, sizeof(dst)) == 0);
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_inet_ntop(addr.sin_family, &addr.sin_addr, dst, sizeof(dst)));
       printf("to [%.*s]:%d\n", (int) sizeof(dst), dst, addr.sin_port);
     
       /* Create some unique data to send */
    -  ASSERT(9 == snprintf(data, sizeof(data), "PING%5u", uv_os_getpid() & 0xFFFF));
    +  ASSERT_EQ(9, snprintf(data,
    +                        sizeof(data),
    +                        "PING%5u",
    +                        uv_os_getpid() & 0xFFFF));
       buf = uv_buf_init(data, 9);
       printf("sending %s\n", data);
     
    @@ -185,27 +193,27 @@ static void do_test(uv_udp_recv_cb recv_cb, int bind_flags) {
                       1,
                       (const struct sockaddr*) &addr,
                       send_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       addr_len = sizeof(addr);
    -  ASSERT(uv_udp_getsockname(&client, (struct sockaddr*) &addr, &addr_len) == 0);
    -  ASSERT(uv_inet_ntop(addr.sin_family, &addr.sin_addr, dst, sizeof(dst)) == 0);
    +  ASSERT_OK(uv_udp_getsockname(&client, (struct sockaddr*) &addr, &addr_len));
    +  ASSERT_OK(uv_inet_ntop(addr.sin_family, &addr.sin_addr, dst, sizeof(dst)));
       printf("from [%.*s]:%d\n", (int) sizeof(dst), dst, addr.sin_port);
       client_port = addr.sin_port;
     
       r = uv_timer_init(uv_default_loop(), &timeout);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_timer_start(&timeout, timeout_cb, 500, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(close_cb_called == 0);
    -  ASSERT(send_cb_called == 0);
    -  ASSERT(recv_cb_called == 0);
    +  ASSERT_OK(close_cb_called);
    +  ASSERT_OK(send_cb_called);
    +  ASSERT_OK(recv_cb_called);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(close_cb_called == 3);
    +  ASSERT_EQ(3, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
     }
    @@ -231,8 +239,8 @@ TEST_IMPL(udp_dual_stack) {
     
       printf("recv_cb_called %d\n", recv_cb_called);
       printf("send_cb_called %d\n", send_cb_called);
    -  ASSERT(recv_cb_called == 1);
    -  ASSERT(send_cb_called == 1);
    +  ASSERT_EQ(1, recv_cb_called);
    +  ASSERT_EQ(1, send_cb_called);
     
       return 0;
     }
    @@ -244,8 +252,8 @@ TEST_IMPL(udp_ipv6_only) {
     
       do_test(ipv6_recv_fail, UV_UDP_IPV6ONLY);
     
    -  ASSERT(recv_cb_called == 0);
    -  ASSERT(send_cb_called == 1);
    +  ASSERT_OK(recv_cb_called);
    +  ASSERT_EQ(1, send_cb_called);
     
       return 0;
     }
    diff --git a/deps/uv/test/test-udp-mmsg.c b/deps/uv/test/test-udp-mmsg.c
    index c37343f8c9f4c5..c0e000b9d92bbf 100644
    --- a/deps/uv/test/test-udp-mmsg.c
    +++ b/deps/uv/test/test-udp-mmsg.c
    @@ -27,7 +27,7 @@
     #include 
     
     #define CHECK_HANDLE(handle) \
    -  ASSERT((uv_udp_t*)(handle) == &recver || (uv_udp_t*)(handle) == &sender)
    +  ASSERT_NE((uv_udp_t*)(handle) == &recver || (uv_udp_t*)(handle) == &sender, 0)
     
     #define BUFFER_MULTIPLIER 20
     #define MAX_DGRAM_SIZE (64 * 1024)
    @@ -77,7 +77,7 @@ static void recv_cb(uv_udp_t* handle,
     
       /* free and return if this is a mmsg free-only callback invocation */
       if (flags & UV_UDP_MMSG_FREE) {
    -    ASSERT_EQ(nread, 0);
    +    ASSERT_OK(nread);
         ASSERT_NULL(addr);
         free(rcvbuf->base);
         return;
    @@ -87,7 +87,7 @@ static void recv_cb(uv_udp_t* handle,
         /* There can be no more available data for the time being. */
         ASSERT_NULL(addr);
       } else {
    -    ASSERT_EQ(nread, 4);
    +    ASSERT_EQ(4, nread);
         ASSERT_NOT_NULL(addr);
         ASSERT_MEM_EQ("PING", rcvbuf->base, nread);
         received_datagrams++;
    @@ -110,31 +110,31 @@ TEST_IMPL(udp_mmsg) {
       uv_buf_t buf;
       int i;
     
    -  ASSERT_EQ(0, uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
     
    -  ASSERT_EQ(0, uv_udp_init_ex(uv_default_loop(), &recver,
    -                              AF_UNSPEC | UV_UDP_RECVMMSG));
    +  ASSERT_OK(uv_udp_init_ex(uv_default_loop(), &recver,
    +                           AF_UNSPEC | UV_UDP_RECVMMSG));
     
    -  ASSERT_EQ(0, uv_udp_bind(&recver, (const struct sockaddr*) &addr, 0));
    +  ASSERT_OK(uv_udp_bind(&recver, (const struct sockaddr*) &addr, 0));
     
    -  ASSERT_EQ(0, uv_udp_recv_start(&recver, alloc_cb, recv_cb));
    +  ASSERT_OK(uv_udp_recv_start(&recver, alloc_cb, recv_cb));
     
    -  ASSERT_EQ(0, uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
    -  ASSERT_EQ(0, uv_udp_init(uv_default_loop(), &sender));
    +  ASSERT_OK(uv_udp_init(uv_default_loop(), &sender));
     
       buf = uv_buf_init("PING", 4);
       for (i = 0; i < NUM_SENDS; i++) {
         ASSERT_EQ(4, uv_udp_try_send(&sender, &buf, 1, (const struct sockaddr*) &addr));
       }
     
    -  ASSERT_EQ(0, uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
    -  ASSERT_EQ(close_cb_called, 2);
    +  ASSERT_EQ(2, close_cb_called);
       ASSERT_EQ(received_datagrams, NUM_SENDS);
     
    -  ASSERT_EQ(sender.send_queue_size, 0);
    -  ASSERT_EQ(recver.send_queue_size, 0);
    +  ASSERT_OK(sender.send_queue_size);
    +  ASSERT_OK(recver.send_queue_size);
     
       printf("%d allocs for %d recvs\n", alloc_cb_called, recv_cb_called);
     
    diff --git a/deps/uv/test/test-udp-multicast-interface.c b/deps/uv/test/test-udp-multicast-interface.c
    index 447d3487f5cefc..2c558c8b0f156e 100644
    --- a/deps/uv/test/test-udp-multicast-interface.c
    +++ b/deps/uv/test/test-udp-multicast-interface.c
    @@ -27,7 +27,7 @@
     #include 
     
     #define CHECK_HANDLE(handle) \
    -  ASSERT((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client)
    +  ASSERT_NE((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client, 0)
     
     static uv_udp_t server;
     static uv_udp_t client;
    @@ -65,17 +65,17 @@ TEST_IMPL(udp_multicast_interface) {
       struct sockaddr_in addr;
       struct sockaddr_in baddr;
     
    -  ASSERT(0 == uv_ip4_addr("239.255.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("239.255.0.1", TEST_PORT, &addr));
     
       r = uv_udp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", 0, &baddr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", 0, &baddr));
       r = uv_udp_bind(&server, (const struct sockaddr*)&baddr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_set_multicast_interface(&server, "0.0.0.0");
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* server sends "PING" */
       buf = uv_buf_init("PING", 4);
    @@ -85,19 +85,19 @@ TEST_IMPL(udp_multicast_interface) {
                       1,
                       (const struct sockaddr*)&addr,
                       sv_send_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(close_cb_called == 0);
    -  ASSERT(sv_send_cb_called == 0);
    +  ASSERT_OK(close_cb_called);
    +  ASSERT_OK(sv_send_cb_called);
     
       /* run the loop till all events are processed */
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(sv_send_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, sv_send_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
    -  ASSERT(client.send_queue_size == 0);
    -  ASSERT(server.send_queue_size == 0);
    +  ASSERT_OK(client.send_queue_size);
    +  ASSERT_OK(server.send_queue_size);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-udp-multicast-interface6.c b/deps/uv/test/test-udp-multicast-interface6.c
    index 1d40aefa8cb236..54fc87ed4e93ae 100644
    --- a/deps/uv/test/test-udp-multicast-interface6.c
    +++ b/deps/uv/test/test-udp-multicast-interface6.c
    @@ -27,7 +27,7 @@
     #include 
     
     #define CHECK_HANDLE(handle) \
    -  ASSERT((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client)
    +  ASSERT_NE((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client, 0)
     
     static uv_udp_t server;
     static uv_udp_t client;
    @@ -44,7 +44,7 @@ static void close_cb(uv_handle_t* handle) {
     
     static void sv_send_cb(uv_udp_send_t* req, int status) {
       ASSERT_NOT_NULL(req);
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       CHECK_HANDLE(req->handle);
     
       sv_send_cb_called++;
    @@ -68,21 +68,21 @@ TEST_IMPL(udp_multicast_interface6) {
       if (!can_ipv6())
         RETURN_SKIP("IPv6 not supported");
     
    -  ASSERT(0 == uv_ip6_addr("::1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip6_addr("::1", TEST_PORT, &addr));
     
       r = uv_udp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(0 == uv_ip6_addr("::", 0, &baddr));
    +  ASSERT_OK(uv_ip6_addr("::", 0, &baddr));
       r = uv_udp_bind(&server, (const struct sockaddr*)&baddr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
     #if defined(__APPLE__) || defined(__FreeBSD__)
       r = uv_udp_set_multicast_interface(&server, "::1%lo0");
     #else
       r = uv_udp_set_multicast_interface(&server, NULL);
     #endif
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* server sends "PING" */
       buf = uv_buf_init("PING", 4);
    @@ -92,16 +92,16 @@ TEST_IMPL(udp_multicast_interface6) {
                       1,
                       (const struct sockaddr*)&addr,
                       sv_send_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(close_cb_called == 0);
    -  ASSERT(sv_send_cb_called == 0);
    +  ASSERT_OK(close_cb_called);
    +  ASSERT_OK(sv_send_cb_called);
     
       /* run the loop till all events are processed */
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(sv_send_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, sv_send_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-udp-multicast-join.c b/deps/uv/test/test-udp-multicast-join.c
    index dddcea4662f1d9..7e8fbe39f08c3b 100644
    --- a/deps/uv/test/test-udp-multicast-join.c
    +++ b/deps/uv/test/test-udp-multicast-join.c
    @@ -27,7 +27,7 @@
     #include 
     
     #define CHECK_HANDLE(handle) \
    -  ASSERT((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client)
    +  ASSERT_NE((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client, 0)
     
     #define MULTICAST_ADDR "239.255.0.1"
     
    @@ -47,7 +47,7 @@ static void alloc_cb(uv_handle_t* handle,
                          uv_buf_t* buf) {
       static char slab[65536];
       CHECK_HANDLE(handle);
    -  ASSERT(suggested_size <= sizeof(slab));
    +  ASSERT_LE(suggested_size, sizeof(slab));
       buf->base = slab;
       buf->len = sizeof(slab);
     }
    @@ -61,7 +61,7 @@ static void close_cb(uv_handle_t* handle) {
     
     static void sv_send_cb(uv_udp_send_t* req, int status) {
       ASSERT_NOT_NULL(req);
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       CHECK_HANDLE(req->handle);
     
       sv_send_cb_called++;
    @@ -77,7 +77,7 @@ static int do_send(uv_udp_send_t* send_req) {
       
       buf = uv_buf_init("PING", 4);
     
    -  ASSERT(0 == uv_ip4_addr(MULTICAST_ADDR, TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr(MULTICAST_ADDR, TEST_PORT, &addr));
     
       /* client sends "PING" */
       return uv_udp_send(send_req,
    @@ -95,7 +95,7 @@ static void cl_recv_cb(uv_udp_t* handle,
                            const struct sockaddr* addr,
                            unsigned flags) {
       CHECK_HANDLE(handle);
    -  ASSERT(flags == 0);
    +  ASSERT_OK(flags);
     
       if (nread < 0) {
         ASSERT(0 && "unexpected error");
    @@ -108,7 +108,7 @@ static void cl_recv_cb(uv_udp_t* handle,
       }
     
       ASSERT_NOT_NULL(addr);
    -  ASSERT(nread == 4);
    +  ASSERT_EQ(4, nread);
       ASSERT(!memcmp("PING", buf->base, nread));
     
       cl_recv_cb_called++;
    @@ -121,18 +121,18 @@ static void cl_recv_cb(uv_udp_t* handle,
         char source_addr[64];
     
         r = uv_ip4_name((const struct sockaddr_in*)addr, source_addr, sizeof(source_addr));
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
         r = uv_udp_set_membership(&server, MULTICAST_ADDR, NULL, UV_LEAVE_GROUP);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
     #if !defined(__OpenBSD__) && !defined(__NetBSD__)
         r = uv_udp_set_source_membership(&server, MULTICAST_ADDR, NULL, source_addr, UV_JOIN_GROUP);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     #endif
     
         r = do_send(&req_ss);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     }
     
    @@ -144,40 +144,40 @@ TEST_IMPL(udp_multicast_join) {
       int r;
       struct sockaddr_in addr;
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
     
       r = uv_udp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_init(uv_default_loop(), &client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* bind to the desired port */
       r = uv_udp_bind(&server, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* join the multicast channel */
       r = uv_udp_set_membership(&server, MULTICAST_ADDR, NULL, UV_JOIN_GROUP);
       if (r == UV_ENODEV)
         RETURN_SKIP("No multicast support.");
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_recv_start(&server, alloc_cb, cl_recv_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = do_send(&req);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(close_cb_called == 0);
    -  ASSERT(cl_recv_cb_called == 0);
    -  ASSERT(sv_send_cb_called == 0);
    +  ASSERT_OK(close_cb_called);
    +  ASSERT_OK(cl_recv_cb_called);
    +  ASSERT_OK(sv_send_cb_called);
     
       /* run the loop till all events are processed */
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(cl_recv_cb_called == 2);
    -  ASSERT(sv_send_cb_called == 2);
    -  ASSERT(close_cb_called == 2);
    +  ASSERT_EQ(2, cl_recv_cb_called);
    +  ASSERT_EQ(2, sv_send_cb_called);
    +  ASSERT_EQ(2, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-udp-multicast-join6.c b/deps/uv/test/test-udp-multicast-join6.c
    index d5262b6a9a07bf..11efb0a6f67d78 100644
    --- a/deps/uv/test/test-udp-multicast-join6.c
    +++ b/deps/uv/test/test-udp-multicast-join6.c
    @@ -28,7 +28,7 @@
     
     
     #define CHECK_HANDLE(handle) \
    -  ASSERT((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client)
    +  ASSERT_NE((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client, 0)
     
     #if defined(__APPLE__)          || \
         defined(_AIX)               || \
    @@ -58,7 +58,7 @@ static void alloc_cb(uv_handle_t* handle,
                          uv_buf_t* buf) {
       static char slab[65536];
       CHECK_HANDLE(handle);
    -  ASSERT(suggested_size <= sizeof(slab));
    +  ASSERT_LE(suggested_size, sizeof(slab));
       buf->base = slab;
       buf->len = sizeof(slab);
     }
    @@ -72,7 +72,7 @@ static void close_cb(uv_handle_t* handle) {
     
     static void sv_send_cb(uv_udp_send_t* req, int status) {
       ASSERT_NOT_NULL(req);
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       CHECK_HANDLE(req->handle);
     
       sv_send_cb_called++;
    @@ -88,7 +88,7 @@ static int do_send(uv_udp_send_t* send_req) {
       
       buf = uv_buf_init("PING", 4);
     
    -  ASSERT(0 == uv_ip6_addr(MULTICAST_ADDR, TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip6_addr(MULTICAST_ADDR, TEST_PORT, &addr));
     
       /* client sends "PING" */
       return uv_udp_send(send_req,
    @@ -106,7 +106,7 @@ static void cl_recv_cb(uv_udp_t* handle,
                            const struct sockaddr* addr,
                            unsigned flags) {
       CHECK_HANDLE(handle);
    -  ASSERT(flags == 0);
    +  ASSERT_OK(flags);
     
       if (nread < 0) {
         ASSERT(0 && "unexpected error");
    @@ -119,7 +119,7 @@ static void cl_recv_cb(uv_udp_t* handle,
       }
     
       ASSERT_NOT_NULL(addr);
    -  ASSERT(nread == 4);
    +  ASSERT_EQ(4, nread);
       ASSERT(!memcmp("PING", buf->base, nread));
     
       cl_recv_cb_called++;
    @@ -132,16 +132,16 @@ static void cl_recv_cb(uv_udp_t* handle,
         char source_addr[64];
     
         r = uv_ip6_name((const struct sockaddr_in6*)addr, source_addr, sizeof(source_addr));
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
         r = uv_udp_set_membership(&server, MULTICAST_ADDR, INTERFACE_ADDR, UV_LEAVE_GROUP);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
         r = uv_udp_set_source_membership(&server, MULTICAST_ADDR, INTERFACE_ADDR, source_addr, UV_JOIN_GROUP);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
         r = do_send(&req_ss);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     }
     
    @@ -172,17 +172,17 @@ TEST_IMPL(udp_multicast_join6) {
       if (!can_ipv6_external())
         RETURN_SKIP("No external IPv6 interface available");
     
    -  ASSERT(0 == uv_ip6_addr("::", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip6_addr("::", TEST_PORT, &addr));
     
       r = uv_udp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_init(uv_default_loop(), &client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* bind to the desired port */
       r = uv_udp_bind(&server, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_set_membership(&server, MULTICAST_ADDR, INTERFACE_ADDR, UV_JOIN_GROUP);
       if (r == UV_ENODEV) {
    @@ -190,28 +190,28 @@ TEST_IMPL(udp_multicast_join6) {
         RETURN_SKIP("No ipv6 multicast route");
       }
     
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
     /* TODO(gengjiawen): Fix test on QEMU. */
     #if defined(__QEMU__)
       RETURN_SKIP("Test does not currently work in QEMU");
     #endif
       r = uv_udp_recv_start(&server, alloc_cb, cl_recv_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       
       r = do_send(&req);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(close_cb_called == 0);
    -  ASSERT(cl_recv_cb_called == 0);
    -  ASSERT(sv_send_cb_called == 0);
    +  ASSERT_OK(close_cb_called);
    +  ASSERT_OK(cl_recv_cb_called);
    +  ASSERT_OK(sv_send_cb_called);
     
       /* run the loop till all events are processed */
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(cl_recv_cb_called == 2);
    -  ASSERT(sv_send_cb_called == 2);
    -  ASSERT(close_cb_called == 2);
    +  ASSERT_EQ(2, cl_recv_cb_called);
    +  ASSERT_EQ(2, sv_send_cb_called);
    +  ASSERT_EQ(2, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-udp-multicast-ttl.c b/deps/uv/test/test-udp-multicast-ttl.c
    index 9aa5bb9147ffbe..50bc54a066ff44 100644
    --- a/deps/uv/test/test-udp-multicast-ttl.c
    +++ b/deps/uv/test/test-udp-multicast-ttl.c
    @@ -27,7 +27,7 @@
     #include 
     
     #define CHECK_HANDLE(handle) \
    -  ASSERT((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client)
    +  ASSERT_NE((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client, 0)
     
     static uv_udp_t server;
     static uv_udp_t client;
    @@ -60,34 +60,34 @@ TEST_IMPL(udp_multicast_ttl) {
       struct sockaddr_in addr;
     
       r = uv_udp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", 0, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", 0, &addr));
       r = uv_udp_bind(&server, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_set_multicast_ttl(&server, 32);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* server sends "PING" */
       buf = uv_buf_init("PING", 4);
    -  ASSERT(0 == uv_ip4_addr("239.255.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("239.255.0.1", TEST_PORT, &addr));
       r = uv_udp_send(&req,
                       &server,
                       &buf,
                       1,
                       (const struct sockaddr*) &addr,
                       sv_send_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(close_cb_called == 0);
    -  ASSERT(sv_send_cb_called == 0);
    +  ASSERT_OK(close_cb_called);
    +  ASSERT_OK(sv_send_cb_called);
     
       /* run the loop till all events are processed */
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(sv_send_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, sv_send_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-udp-open.c b/deps/uv/test/test-udp-open.c
    index 0e09f56a49fa59..6fddc93717ba30 100644
    --- a/deps/uv/test/test-udp-open.c
    +++ b/deps/uv/test/test-udp-open.c
    @@ -41,7 +41,7 @@ static void startup(void) {
     #ifdef _WIN32
         struct WSAData wsa_data;
         int r = WSAStartup(MAKEWORD(2, 2), &wsa_data);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     #endif
     }
     
    @@ -51,9 +51,9 @@ static uv_os_sock_t create_udp_socket(void) {
     
       sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
     #ifdef _WIN32
    -  ASSERT(sock != INVALID_SOCKET);
    +  ASSERT_NE(sock, INVALID_SOCKET);
     #else
    -  ASSERT(sock >= 0);
    +  ASSERT_GE(sock, 0);
     #endif
     
     #ifndef _WIN32
    @@ -61,7 +61,7 @@ static uv_os_sock_t create_udp_socket(void) {
         /* Allow reuse of the port. */
         int yes = 1;
         int r = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     #endif
     
    @@ -76,7 +76,7 @@ static void close_socket(uv_os_sock_t sock) {
     #else
       r = close(sock);
     #endif
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -84,7 +84,7 @@ static void alloc_cb(uv_handle_t* handle,
                          size_t suggested_size,
                          uv_buf_t* buf) {
       static char slab[65536];
    -  ASSERT(suggested_size <= sizeof(slab));
    +  ASSERT_LE(suggested_size, sizeof(slab));
       buf->base = slab;
       buf->len = sizeof(slab);
     }
    @@ -113,14 +113,14 @@ static void recv_cb(uv_udp_t* handle,
         return;
       }
     
    -  ASSERT(flags == 0);
    +  ASSERT_OK(flags);
     
       ASSERT_NOT_NULL(addr);
    -  ASSERT(nread == 4);
    -  ASSERT(memcmp("PING", buf->base, nread) == 0);
    +  ASSERT_EQ(4, nread);
    +  ASSERT_OK(memcmp("PING", buf->base, nread));
     
       r = uv_udp_recv_stop(handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_close((uv_handle_t*) handle, close_cb);
     }
    @@ -128,7 +128,7 @@ static void recv_cb(uv_udp_t* handle,
     
     static void send_cb(uv_udp_send_t* req, int status) {
       ASSERT_NOT_NULL(req);
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
     
       send_cb_called++;
       uv_close((uv_handle_t*)req->handle, close_cb);
    @@ -142,22 +142,22 @@ TEST_IMPL(udp_open) {
       uv_os_sock_t sock;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       startup();
       sock = create_udp_socket();
     
       r = uv_udp_init(uv_default_loop(), &client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_open(&client, sock);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_bind(&client, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_recv_start(&client, alloc_cb, recv_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_send(&send_req,
                       &client,
    @@ -165,15 +165,15 @@ TEST_IMPL(udp_open) {
                       1,
                       (const struct sockaddr*) &addr,
                       send_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
     #ifndef _WIN32
       {
         r = uv_udp_init(uv_default_loop(), &client2);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     
         r = uv_udp_open(&client2, sock);
    -    ASSERT(r == UV_EEXIST);
    +    ASSERT_EQ(r, UV_EEXIST);
     
         uv_close((uv_handle_t*) &client2, NULL);
       }
    @@ -183,10 +183,10 @@ TEST_IMPL(udp_open) {
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(send_cb_called == 1);
    -  ASSERT(close_cb_called == 1);
    +  ASSERT_EQ(1, send_cb_called);
    +  ASSERT_EQ(1, close_cb_called);
     
    -  ASSERT(client.send_queue_size == 0);
    +  ASSERT_OK(client.send_queue_size);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -203,13 +203,13 @@ TEST_IMPL(udp_open_twice) {
       sock2 = create_udp_socket();
     
       r = uv_udp_init(uv_default_loop(), &client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_open(&client, sock1);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_open(&client, sock2);
    -  ASSERT(r == UV_EBUSY);
    +  ASSERT_EQ(r, UV_EBUSY);
       close_socket(sock2);
     
       uv_close((uv_handle_t*) &client, NULL);
    @@ -225,22 +225,22 @@ TEST_IMPL(udp_open_bound) {
       uv_os_sock_t sock;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       startup();
       sock = create_udp_socket();
     
       r = bind(sock, (struct sockaddr*) &addr, sizeof(addr));
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_init(uv_default_loop(), &client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_open(&client, sock);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_recv_start(&client, alloc_cb, recv_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_close((uv_handle_t*) &client, NULL);
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
    @@ -257,28 +257,28 @@ TEST_IMPL(udp_open_connect) {
       uv_os_sock_t sock;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       startup();
       sock = create_udp_socket();
     
       r = uv_udp_init(uv_default_loop(), &client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = connect(sock, (const struct sockaddr*) &addr, sizeof(addr));
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_open(&client, sock);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_bind(&server, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_recv_start(&server, alloc_cb, recv_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_send(&send_req,
                       &client,
    @@ -286,14 +286,14 @@ TEST_IMPL(udp_open_connect) {
                       1,
                       NULL,
                       send_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(send_cb_called == 1);
    -  ASSERT(close_cb_called == 2);
    +  ASSERT_EQ(1, send_cb_called);
    +  ASSERT_EQ(2, close_cb_called);
     
    -  ASSERT(client.send_queue_size == 0);
    +  ASSERT_OK(client.send_queue_size);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    @@ -315,20 +315,20 @@ TEST_IMPL(udp_send_unix) {
     
       memset(&addr, 0, sizeof addr);
       addr.sun_family = AF_UNIX;
    -  ASSERT(strlen(TEST_PIPENAME) < sizeof(addr.sun_path));
    +  ASSERT_LT(strlen(TEST_PIPENAME), sizeof(addr.sun_path));
       memcpy(addr.sun_path, TEST_PIPENAME, strlen(TEST_PIPENAME));
     
       fd = socket(AF_UNIX, SOCK_STREAM, 0);
    -  ASSERT(fd >= 0);
    +  ASSERT_GE(fd, 0);
     
       unlink(TEST_PIPENAME);
    -  ASSERT(0 == bind(fd, (const struct sockaddr*)&addr, sizeof addr));
    -  ASSERT(0 == listen(fd, 1));
    +  ASSERT_OK(bind(fd, (const struct sockaddr*)&addr, sizeof addr));
    +  ASSERT_OK(listen(fd, 1));
     
       r = uv_udp_init(loop, &handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       r = uv_udp_open(&handle, fd);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
       uv_run(loop, UV_RUN_DEFAULT);
     
       r = uv_udp_send(&req,
    @@ -337,7 +337,7 @@ TEST_IMPL(udp_send_unix) {
                       1,
                       (const struct sockaddr*) &addr,
                       NULL);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_close((uv_handle_t*)&handle, NULL);
       uv_run(loop, UV_RUN_DEFAULT);
    diff --git a/deps/uv/test/test-udp-options.c b/deps/uv/test/test-udp-options.c
    index 11e58b996a18ac..bb4a24ca7d1c47 100644
    --- a/deps/uv/test/test-udp-options.c
    +++ b/deps/uv/test/test-udp-options.c
    @@ -36,56 +36,56 @@ static int udp_options_test(const struct sockaddr* addr) {
       loop = uv_default_loop();
     
       r = uv_udp_init(loop, &h);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_unref((uv_handle_t*)&h); /* don't keep the loop alive */
     
       r = uv_udp_bind(&h, addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_set_broadcast(&h, 1);
       r |= uv_udp_set_broadcast(&h, 1);
       r |= uv_udp_set_broadcast(&h, 0);
       r |= uv_udp_set_broadcast(&h, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* values 1-255 should work */
       for (i = 1; i <= 255; i++) {
         r = uv_udp_set_ttl(&h, i);
     #if defined(__MVS__)
         if (addr->sa_family == AF_INET6)
    -      ASSERT(r == 0);
    +      ASSERT_OK(r);
         else
    -      ASSERT(r == UV_ENOTSUP);
    +      ASSERT_EQ(r, UV_ENOTSUP);
     #else
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
     #endif
       }
     
       for (i = 0; i < (int) ARRAY_SIZE(invalid_ttls); i++) {
         r = uv_udp_set_ttl(&h, invalid_ttls[i]);
    -    ASSERT(r == UV_EINVAL);
    +    ASSERT_EQ(r, UV_EINVAL);
       }
     
       r = uv_udp_set_multicast_loop(&h, 1);
       r |= uv_udp_set_multicast_loop(&h, 1);
       r |= uv_udp_set_multicast_loop(&h, 0);
       r |= uv_udp_set_multicast_loop(&h, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* values 0-255 should work */
       for (i = 0; i <= 255; i++) {
         r = uv_udp_set_multicast_ttl(&h, i);
    -    ASSERT(r == 0);
    +    ASSERT_OK(r);
       }
     
       /* anything >255 should fail */
       r = uv_udp_set_multicast_ttl(&h, 256);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
       /* don't test ttl=-1, it's a valid value on some platforms */
     
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    @@ -95,7 +95,7 @@ static int udp_options_test(const struct sockaddr* addr) {
     TEST_IMPL(udp_options) {
       struct sockaddr_in addr;
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
       return udp_options_test((const struct sockaddr*) &addr);
     }
     
    @@ -106,7 +106,7 @@ TEST_IMPL(udp_options6) {
       if (!can_ipv6())
         RETURN_SKIP("IPv6 not supported");
     
    -  ASSERT(0 == uv_ip6_addr("::", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip6_addr("::", TEST_PORT, &addr));
       return udp_options_test((const struct sockaddr*) &addr);
     }
     
    @@ -119,41 +119,41 @@ TEST_IMPL(udp_no_autobind) {
       loop = uv_default_loop();
     
       /* Test a lazy initialized socket. */
    -  ASSERT(0 == uv_udp_init(loop, &h));
    -  ASSERT(UV_EBADF == uv_udp_set_multicast_ttl(&h, 32));
    -  ASSERT(UV_EBADF == uv_udp_set_broadcast(&h, 1));
    +  ASSERT_OK(uv_udp_init(loop, &h));
    +  ASSERT_EQ(UV_EBADF, uv_udp_set_multicast_ttl(&h, 32));
    +  ASSERT_EQ(UV_EBADF, uv_udp_set_broadcast(&h, 1));
     #if defined(__MVS__)
    -  ASSERT(UV_ENOTSUP == uv_udp_set_ttl(&h, 1));
    +  ASSERT_EQ(UV_ENOTSUP, uv_udp_set_ttl(&h, 1));
     #else
    -  ASSERT(UV_EBADF == uv_udp_set_ttl(&h, 1));
    +  ASSERT_EQ(UV_EBADF, uv_udp_set_ttl(&h, 1));
     #endif
    -  ASSERT(UV_EBADF == uv_udp_set_multicast_loop(&h, 1));
    +  ASSERT_EQ(UV_EBADF, uv_udp_set_multicast_loop(&h, 1));
     /* TODO(gengjiawen): Fix test on QEMU. */
     #if defined(__QEMU__)
       RETURN_SKIP("Test does not currently work in QEMU");
     #endif
    -  ASSERT(UV_EBADF == uv_udp_set_multicast_interface(&h, "0.0.0.0"));
    +  ASSERT_EQ(UV_EBADF, uv_udp_set_multicast_interface(&h, "0.0.0.0"));
     
       uv_close((uv_handle_t*) &h, NULL);
     
       /* Test a non-lazily initialized socket. */
    -  ASSERT(0 == uv_udp_init_ex(loop, &h2, AF_INET | UV_UDP_RECVMMSG));
    -  ASSERT(0 == uv_udp_set_multicast_ttl(&h2, 32));
    -  ASSERT(0 == uv_udp_set_broadcast(&h2, 1));
    +  ASSERT_OK(uv_udp_init_ex(loop, &h2, AF_INET | UV_UDP_RECVMMSG));
    +  ASSERT_OK(uv_udp_set_multicast_ttl(&h2, 32));
    +  ASSERT_OK(uv_udp_set_broadcast(&h2, 1));
     
     #if defined(__MVS__)
       /* zOS only supports setting ttl for IPv6 sockets. */
    -  ASSERT(UV_ENOTSUP == uv_udp_set_ttl(&h2, 1));
    +  ASSERT_EQ(UV_ENOTSUP, uv_udp_set_ttl(&h2, 1));
     #else
    -  ASSERT(0 == uv_udp_set_ttl(&h2, 1));
    +  ASSERT_OK(uv_udp_set_ttl(&h2, 1));
     #endif
     
    -  ASSERT(0 == uv_udp_set_multicast_loop(&h2, 1));
    -  ASSERT(0 == uv_udp_set_multicast_interface(&h2, "0.0.0.0"));
    +  ASSERT_OK(uv_udp_set_multicast_loop(&h2, 1));
    +  ASSERT_OK(uv_udp_set_multicast_interface(&h2, "0.0.0.0"));
     
       uv_close((uv_handle_t*) &h2, NULL);
     
    -  ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-udp-recv-in-a-row.c b/deps/uv/test/test-udp-recv-in-a-row.c
    index 98aca28e193693..30745def0f602d 100644
    --- a/deps/uv/test/test-udp-recv-in-a-row.c
    +++ b/deps/uv/test/test-udp-recv-in-a-row.c
    @@ -53,7 +53,7 @@ static void sv_recv_cb(uv_udp_t* handle,
       if (++ recv_cnt < N) {
         ASSERT_EQ(sizeof(send_data), nread);
       } else {
    -    ASSERT_EQ(0, nread);
    +    ASSERT_OK(nread);
       }
     }
     
    @@ -69,7 +69,7 @@ static void check_cb(uv_check_t* handle) {
       check_cb_called = 1;
     
       /* we are done */
    -  ASSERT_EQ(0, uv_check_stop(handle));
    +  ASSERT_OK(uv_check_stop(handle));
       uv_close((uv_handle_t*) &client, NULL);
       uv_close((uv_handle_t*) &check_handle, NULL);
       uv_close((uv_handle_t*) &server, NULL);
    @@ -79,16 +79,16 @@ static void check_cb(uv_check_t* handle) {
     TEST_IMPL(udp_recv_in_a_row) {
       int i, r;
       
    -  ASSERT_EQ(0, uv_check_init(uv_default_loop(), &check_handle));
    -  ASSERT_EQ(0, uv_check_start(&check_handle, check_cb));
    +  ASSERT_OK(uv_check_init(uv_default_loop(), &check_handle));
    +  ASSERT_OK(uv_check_start(&check_handle, check_cb));
     
    -  ASSERT_EQ(0, uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
    -  ASSERT_EQ(0, uv_udp_init(uv_default_loop(), &server));
    -  ASSERT_EQ(0, uv_udp_bind(&server, (const struct sockaddr*) &addr, 0));
    -  ASSERT_EQ(0, uv_udp_recv_start(&server, alloc_cb, sv_recv_cb));
    +  ASSERT_OK(uv_udp_init(uv_default_loop(), &server));
    +  ASSERT_OK(uv_udp_bind(&server, (const struct sockaddr*) &addr, 0));
    +  ASSERT_OK(uv_udp_recv_start(&server, alloc_cb, sv_recv_cb));
     
    -  ASSERT_EQ(0, uv_udp_init(uv_default_loop(), &client));
    +  ASSERT_OK(uv_udp_init(uv_default_loop(), &client));
     
       /* send N-1 udp packets */
       buf = uv_buf_init(send_data, sizeof(send_data));
    @@ -106,13 +106,13 @@ TEST_IMPL(udp_recv_in_a_row) {
                           &buf,
                           1,
                           (const struct sockaddr*) &addr);
    -  ASSERT_EQ(0, r);
    +  ASSERT_OK(r);
     
       /* check_cb() asserts that the N packets can be received
        * before it gets called. 
        */
     
    -  ASSERT_EQ(0, uv_run(uv_default_loop(), UV_RUN_DEFAULT));
    +  ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
     
       ASSERT(check_cb_called);
     
    diff --git a/deps/uv/test/test-udp-send-and-recv.c b/deps/uv/test/test-udp-send-and-recv.c
    index ab60e84a138179..b24fe1d0532822 100644
    --- a/deps/uv/test/test-udp-send-and-recv.c
    +++ b/deps/uv/test/test-udp-send-and-recv.c
    @@ -27,7 +27,7 @@
     #include 
     
     #define CHECK_HANDLE(handle) \
    -  ASSERT((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client)
    +  ASSERT_NE((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client, 0)
     
     static uv_udp_t server;
     static uv_udp_t client;
    @@ -46,7 +46,7 @@ static void alloc_cb(uv_handle_t* handle,
                          uv_buf_t* buf) {
       static char slab[65536];
       CHECK_HANDLE(handle);
    -  ASSERT(suggested_size <= sizeof(slab));
    +  ASSERT_LE(suggested_size, sizeof(slab));
       buf->base = slab;
       buf->len = sizeof(slab);
     }
    @@ -54,7 +54,7 @@ static void alloc_cb(uv_handle_t* handle,
     
     static void close_cb(uv_handle_t* handle) {
       CHECK_HANDLE(handle);
    -  ASSERT(1 == uv_is_closing(handle));
    +  ASSERT_EQ(1, uv_is_closing(handle));
       close_cb_called++;
     }
     
    @@ -65,7 +65,7 @@ static void cl_recv_cb(uv_udp_t* handle,
                            const struct sockaddr* addr,
                            unsigned flags) {
       CHECK_HANDLE(handle);
    -  ASSERT(flags == 0);
    +  ASSERT_OK(flags);
     
       if (nread < 0) {
         ASSERT(0 && "unexpected error");
    @@ -78,7 +78,7 @@ static void cl_recv_cb(uv_udp_t* handle,
       }
     
       ASSERT_NOT_NULL(addr);
    -  ASSERT(nread == 4);
    +  ASSERT_EQ(4, nread);
       ASSERT(!memcmp("PONG", buf->base, nread));
     
       cl_recv_cb_called++;
    @@ -91,11 +91,11 @@ static void cl_send_cb(uv_udp_send_t* req, int status) {
       int r;
     
       ASSERT_NOT_NULL(req);
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       CHECK_HANDLE(req->handle);
     
       r = uv_udp_recv_start(req->handle, alloc_cb, cl_recv_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       cl_send_cb_called++;
     }
    @@ -103,7 +103,7 @@ static void cl_send_cb(uv_udp_send_t* req, int status) {
     
     static void sv_send_cb(uv_udp_send_t* req, int status) {
       ASSERT_NOT_NULL(req);
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       CHECK_HANDLE(req->handle);
     
       uv_close((uv_handle_t*) req->handle, close_cb);
    @@ -133,10 +133,10 @@ static void sv_recv_cb(uv_udp_t* handle,
       }
     
       CHECK_HANDLE(handle);
    -  ASSERT(flags == 0);
    +  ASSERT_OK(flags);
     
       ASSERT_NOT_NULL(addr);
    -  ASSERT(nread == 4);
    +  ASSERT_EQ(4, nread);
       ASSERT(!memcmp("PING", rcvbuf->base, nread));
     
       /* FIXME? `uv_udp_recv_stop` does what it says: recv_cb is not called
    @@ -144,14 +144,14 @@ static void sv_recv_cb(uv_udp_t* handle,
         * either... Not sure I like that but it's consistent with `uv_read_stop`.
         */
       r = uv_udp_recv_stop(handle);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       req = malloc(sizeof *req);
       ASSERT_NOT_NULL(req);
     
       sndbuf = uv_buf_init("PONG", 4);
       r = uv_udp_send(req, handle, &sndbuf, 1, addr, sv_send_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       sv_recv_cb_called++;
     }
    @@ -163,21 +163,21 @@ TEST_IMPL(udp_send_and_recv) {
       uv_buf_t buf;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
     
       r = uv_udp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_bind(&server, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_recv_start(&server, alloc_cb, sv_recv_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       r = uv_udp_init(uv_default_loop(), &client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* client sends "PING", expects "PONG" */
       buf = uv_buf_init("PING", 4);
    @@ -188,24 +188,24 @@ TEST_IMPL(udp_send_and_recv) {
                       1,
                       (const struct sockaddr*) &addr,
                       cl_send_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(close_cb_called == 0);
    -  ASSERT(cl_send_cb_called == 0);
    -  ASSERT(cl_recv_cb_called == 0);
    -  ASSERT(sv_send_cb_called == 0);
    -  ASSERT(sv_recv_cb_called == 0);
    +  ASSERT_OK(close_cb_called);
    +  ASSERT_OK(cl_send_cb_called);
    +  ASSERT_OK(cl_recv_cb_called);
    +  ASSERT_OK(sv_send_cb_called);
    +  ASSERT_OK(sv_recv_cb_called);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(cl_send_cb_called == 1);
    -  ASSERT(cl_recv_cb_called == 1);
    -  ASSERT(sv_send_cb_called == 1);
    -  ASSERT(sv_recv_cb_called == 1);
    -  ASSERT(close_cb_called == 2);
    +  ASSERT_EQ(1, cl_send_cb_called);
    +  ASSERT_EQ(1, cl_recv_cb_called);
    +  ASSERT_EQ(1, sv_send_cb_called);
    +  ASSERT_EQ(1, sv_recv_cb_called);
    +  ASSERT_EQ(2, close_cb_called);
     
    -  ASSERT(client.send_queue_size == 0);
    -  ASSERT(server.send_queue_size == 0);
    +  ASSERT_OK(client.send_queue_size);
    +  ASSERT_OK(server.send_queue_size);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-udp-send-hang-loop.c b/deps/uv/test/test-udp-send-hang-loop.c
    index b1e02263d3ca5a..763bb28bdb0d80 100644
    --- a/deps/uv/test/test-udp-send-hang-loop.c
    +++ b/deps/uv/test/test-udp-send-hang-loop.c
    @@ -27,7 +27,7 @@
     #include 
     
     #define CHECK_OBJECT(handle, type, parent) \
    -  ASSERT((type*)(handle) == &(parent))
    +  ASSERT_PTR_EQ((type*)(handle), &(parent))
     
     static uv_udp_t client;
     static uv_idle_t idle_handle;
    @@ -46,7 +46,7 @@ static void idle_cb(uv_idle_t* handle) {
     
       ASSERT_NULL(send_req.handle);
       CHECK_OBJECT(handle, uv_idle_t, idle_handle);
    -  ASSERT(0 == uv_idle_stop(handle));
    +  ASSERT_OK(uv_idle_stop(handle));
     
       /* It probably would have stalled by now if it's going to stall at all. */
       if (++loop_hang_called > 1000) {
    @@ -61,7 +61,7 @@ static void idle_cb(uv_idle_t* handle) {
                       1,
                       (const struct sockaddr*) &addr,
                       send_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     }
     
     
    @@ -72,27 +72,27 @@ static void send_cb(uv_udp_send_t* req, int status) {
       CHECK_OBJECT(req, uv_udp_send_t, send_req);
       req->handle = NULL;
     
    -  ASSERT(0 == uv_idle_start(&idle_handle, idle_cb));
    +  ASSERT_OK(uv_idle_start(&idle_handle, idle_cb));
     }
     
     
     TEST_IMPL(udp_send_hang_loop) {
    -  ASSERT(0 == uv_idle_init(uv_default_loop(), &idle_handle));
    +  ASSERT_OK(uv_idle_init(uv_default_loop(), &idle_handle));
     
    -  /* 192.0.2.0/8 is "TEST-NET" and reserved for documentation.
    +  /* 192.0.2.0/24 is "TEST-NET" and reserved for documentation.
        * Good for us, though. Since we want to have something unreachable.
        */
    -  ASSERT(0 == uv_ip4_addr("192.0.2.3", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("192.0.2.3", TEST_PORT, &addr));
     
    -  ASSERT(0 == uv_udp_init(uv_default_loop(), &client));
    +  ASSERT_OK(uv_udp_init(uv_default_loop(), &client));
     
       buf = uv_buf_init(send_data, sizeof(send_data));
     
    -  ASSERT(0 == uv_idle_start(&idle_handle, idle_cb));
    +  ASSERT_OK(uv_idle_start(&idle_handle, idle_cb));
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(loop_hang_called > 1000);
    +  ASSERT_GT(loop_hang_called, 1000);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-udp-send-immediate.c b/deps/uv/test/test-udp-send-immediate.c
    index ee70a6165a21da..8e7f83ff05bc2c 100644
    --- a/deps/uv/test/test-udp-send-immediate.c
    +++ b/deps/uv/test/test-udp-send-immediate.c
    @@ -27,7 +27,7 @@
     #include 
     
     #define CHECK_HANDLE(handle) \
    -  ASSERT((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client)
    +  ASSERT_NE((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client, 0)
     
     static uv_udp_t server;
     static uv_udp_t client;
    @@ -42,7 +42,7 @@ static void alloc_cb(uv_handle_t* handle,
                          uv_buf_t* buf) {
       static char slab[65536];
       CHECK_HANDLE(handle);
    -  ASSERT(suggested_size <= sizeof(slab));
    +  ASSERT_LE(suggested_size, sizeof(slab));
       buf->base = slab;
       buf->len = sizeof(slab);
     }
    @@ -50,14 +50,14 @@ static void alloc_cb(uv_handle_t* handle,
     
     static void close_cb(uv_handle_t* handle) {
       CHECK_HANDLE(handle);
    -  ASSERT(1 == uv_is_closing(handle));
    +  ASSERT_EQ(1, uv_is_closing(handle));
       close_cb_called++;
     }
     
     
     static void cl_send_cb(uv_udp_send_t* req, int status) {
       ASSERT_NOT_NULL(req);
    -  ASSERT(status == 0);
    +  ASSERT_OK(status);
       CHECK_HANDLE(req->handle);
     
       cl_send_cb_called++;
    @@ -80,10 +80,10 @@ static void sv_recv_cb(uv_udp_t* handle,
       }
     
       CHECK_HANDLE(handle);
    -  ASSERT(flags == 0);
    +  ASSERT_OK(flags);
     
       ASSERT_NOT_NULL(addr);
    -  ASSERT(nread == 4);
    +  ASSERT_EQ(4, nread);
       ASSERT(memcmp("PING", rcvbuf->base, nread) == 0 ||
              memcmp("PANG", rcvbuf->base, nread) == 0);
     
    @@ -100,21 +100,21 @@ TEST_IMPL(udp_send_immediate) {
       uv_buf_t buf;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
     
       r = uv_udp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_bind(&server, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_recv_start(&server, alloc_cb, sv_recv_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       r = uv_udp_init(uv_default_loop(), &client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* client sends "PING", then "PANG" */
       buf = uv_buf_init("PING", 4);
    @@ -125,7 +125,7 @@ TEST_IMPL(udp_send_immediate) {
                       1,
                       (const struct sockaddr*) &addr,
                       cl_send_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       buf = uv_buf_init("PANG", 4);
     
    @@ -135,13 +135,13 @@ TEST_IMPL(udp_send_immediate) {
                       1,
                       (const struct sockaddr*) &addr,
                       cl_send_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(cl_send_cb_called == 2);
    -  ASSERT(sv_recv_cb_called == 2);
    -  ASSERT(close_cb_called == 2);
    +  ASSERT_EQ(2, cl_send_cb_called);
    +  ASSERT_EQ(2, sv_recv_cb_called);
    +  ASSERT_EQ(2, close_cb_called);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-udp-send-unreachable.c b/deps/uv/test/test-udp-send-unreachable.c
    index 7075deb189666b..0a2f4a47a97580 100644
    --- a/deps/uv/test/test-udp-send-unreachable.c
    +++ b/deps/uv/test/test-udp-send-unreachable.c
    @@ -27,7 +27,7 @@
     #include 
     
     #define CHECK_HANDLE(handle) \
    -  ASSERT((uv_udp_t*)(handle) == &client || (uv_udp_t*)(handle) == &client2)
    +  ASSERT_NE((uv_udp_t*)(handle) == &client || (uv_udp_t*)(handle) == &client2, 0)
     
     static uv_udp_t client;
     static uv_udp_t client2;
    @@ -61,8 +61,8 @@ static void close_cb(uv_handle_t* handle) {
     
     static void send_cb(uv_udp_send_t* req, int status) {
       ASSERT_NOT_NULL(req);
    -  ASSERT(status == 0);
    -  ASSERT_EQ(status, 0);
    +  ASSERT_OK(status);
    +  ASSERT_OK(status);
       CHECK_HANDLE(req->handle);
       send_cb_called++;
     }
    @@ -115,24 +115,24 @@ TEST_IMPL(udp_send_unreachable) {
       can_recverr = 1;
     #endif
     
    -  ASSERT_EQ(0, uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    -  ASSERT_EQ(0, uv_ip4_addr("127.0.0.1", TEST_PORT_2, &addr2));
    -  ASSERT_EQ(0, uv_ip4_addr("127.0.0.1", TEST_PORT_3, &addr3));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT_2, &addr2));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT_3, &addr3));
     
       r = uv_timer_init( uv_default_loop(), &timer );
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_timer_start( &timer, timer_cb, 1000, 0 );
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_init(uv_default_loop(), &client);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_bind(&client, (const struct sockaddr*) &addr2, 0);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_recv_start(&client, alloc_cb, recv_cb);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       /* client sends "PING", then "PANG" */
       buf = uv_buf_init("PING", 4);
    @@ -143,7 +143,7 @@ TEST_IMPL(udp_send_unreachable) {
                       1,
                       (const struct sockaddr*) &addr,
                       send_cb);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       buf = uv_buf_init("PANG", 4);
     
    @@ -153,19 +153,19 @@ TEST_IMPL(udp_send_unreachable) {
                       1,
                       (const struct sockaddr*) &addr,
                       send_cb);
    -  ASSERT_EQ(r, 0);
    +  ASSERT_OK(r);
     
       if (can_recverr) {
         r = uv_udp_init(uv_default_loop(), &client2);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
     
         r = uv_udp_bind(&client2,
                         (const struct sockaddr*) &addr3,
                         UV_UDP_LINUX_RECVERR);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
     
         r = uv_udp_recv_start(&client2, alloc_cb, recv_cb);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
     
         /* client sends "PING", then "PANG" */
         buf = uv_buf_init("PING", 4);
    @@ -176,7 +176,7 @@ TEST_IMPL(udp_send_unreachable) {
                         1,
                         (const struct sockaddr*) &addr,
                         send_cb_recverr);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
     
         buf = uv_buf_init("PANG", 4);
     
    @@ -186,14 +186,14 @@ TEST_IMPL(udp_send_unreachable) {
                         1,
                         (const struct sockaddr*) &addr,
                         send_cb_recverr);
    -    ASSERT_EQ(r, 0);
    +    ASSERT_OK(r);
       }
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
       ASSERT_EQ(send_cb_called, (long)(can_recverr ? 4 : 2));
       ASSERT_EQ(recv_cb_called, alloc_cb_called);
    -  ASSERT_EQ(timer_cb_called, 1);
    +  ASSERT_EQ(1, timer_cb_called);
       ASSERT_EQ(close_cb_called, (long)(can_recverr ? 3 : 2));
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
    diff --git a/deps/uv/test/test-udp-sendmmsg-error.c b/deps/uv/test/test-udp-sendmmsg-error.c
    index 7b1741a3e04f2f..0b647585e4f4b8 100644
    --- a/deps/uv/test/test-udp-sendmmsg-error.c
    +++ b/deps/uv/test/test-udp-sendmmsg-error.c
    @@ -55,20 +55,20 @@ TEST_IMPL(udp_sendmmsg_error) {
       uv_buf_t buf;
       int i;
     
    -  ASSERT_EQ(0, uv_udp_init(uv_default_loop(), &client));
    -  ASSERT_EQ(0, uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    -  ASSERT_EQ(0, uv_udp_connect(&client, (const struct sockaddr*)&addr));
    +  ASSERT_OK(uv_udp_init(uv_default_loop(), &client));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_udp_connect(&client, (const struct sockaddr*)&addr));
     
       buf = uv_buf_init("TEST", 4);
       for (i = 0; i < DATAGRAMS; ++i)
    -    ASSERT_EQ(0, uv_udp_send(&req[i], &client, &buf, 1, NULL, send_cb));
    +    ASSERT_OK(uv_udp_send(&req[i], &client, &buf, 1, NULL, send_cb));
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
       ASSERT_EQ(1, close_cb_called);
       ASSERT_EQ(DATAGRAMS, send_cb_called);
     
    -  ASSERT_EQ(0, client.send_queue_size);
    +  ASSERT_OK(client.send_queue_size);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-udp-try-send.c b/deps/uv/test/test-udp-try-send.c
    index b81506cc39f3ce..0c76fb1c84df68 100644
    --- a/deps/uv/test/test-udp-try-send.c
    +++ b/deps/uv/test/test-udp-try-send.c
    @@ -27,7 +27,7 @@
     #include 
     
     #define CHECK_HANDLE(handle) \
    -  ASSERT((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client)
    +  ASSERT_NE((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client, 0)
     
     static uv_udp_t server;
     static uv_udp_t client;
    @@ -42,7 +42,7 @@ static void alloc_cb(uv_handle_t* handle,
                          uv_buf_t* buf) {
       static char slab[65536];
       CHECK_HANDLE(handle);
    -  ASSERT(suggested_size <= sizeof(slab));
    +  ASSERT_LE(suggested_size, sizeof(slab));
       buf->base = slab;
       buf->len = sizeof(slab);
     }
    @@ -60,17 +60,17 @@ static void sv_recv_cb(uv_udp_t* handle,
                            const uv_buf_t* rcvbuf,
                            const struct sockaddr* addr,
                            unsigned flags) {
    -  ASSERT(nread > 0);
    +  ASSERT_GT(nread, 0);
     
       if (nread == 0) {
         ASSERT_NULL(addr);
         return;
       }
     
    -  ASSERT(nread == 4);
    +  ASSERT_EQ(4, nread);
       ASSERT_NOT_NULL(addr);
     
    -  ASSERT(memcmp("EXIT", rcvbuf->base, nread) == 0);
    +  ASSERT_OK(memcmp("EXIT", rcvbuf->base, nread));
       uv_close((uv_handle_t*) handle, close_cb);
       uv_close((uv_handle_t*) &client, close_cb);
     
    @@ -84,37 +84,37 @@ TEST_IMPL(udp_try_send) {
       uv_buf_t buf;
       int r;
     
    -  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
     
       r = uv_udp_init(uv_default_loop(), &server);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_bind(&server, (const struct sockaddr*) &addr, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_udp_recv_start(&server, alloc_cb, sv_recv_cb);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
     
       r = uv_udp_init(uv_default_loop(), &client);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       buf = uv_buf_init(buffer, sizeof(buffer));
       r = uv_udp_try_send(&client, &buf, 1, (const struct sockaddr*) &addr);
    -  ASSERT(r == UV_EMSGSIZE);
    +  ASSERT_EQ(r, UV_EMSGSIZE);
     
       buf = uv_buf_init("EXIT", 4);
       r = uv_udp_try_send(&client, &buf, 1, (const struct sockaddr*) &addr);
    -  ASSERT(r == 4);
    +  ASSERT_EQ(4, r);
     
       uv_run(uv_default_loop(), UV_RUN_DEFAULT);
     
    -  ASSERT(close_cb_called == 2);
    -  ASSERT(sv_recv_cb_called == 1);
    +  ASSERT_EQ(2, close_cb_called);
    +  ASSERT_EQ(1, sv_recv_cb_called);
     
    -  ASSERT(client.send_queue_size == 0);
    -  ASSERT(server.send_queue_size == 0);
    +  ASSERT_OK(client.send_queue_size);
    +  ASSERT_OK(server.send_queue_size);
     
       MAKE_VALGRIND_HAPPY(uv_default_loop());
       return 0;
    diff --git a/deps/uv/test/test-uname.c b/deps/uv/test/test-uname.c
    index 105a17fe67771a..a384e9f8422666 100644
    --- a/deps/uv/test/test-uname.c
    +++ b/deps/uv/test/test-uname.c
    @@ -39,28 +39,28 @@ TEST_IMPL(uname) {
     
       /* Verify that NULL is handled properly. */
       r = uv_os_uname(NULL);
    -  ASSERT(r == UV_EINVAL);
    +  ASSERT_EQ(r, UV_EINVAL);
     
       /* Verify the happy path. */
       r = uv_os_uname(&buffer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
     #ifndef _WIN32
    -  ASSERT(uname(&buf) != -1);
    -  ASSERT(strcmp(buffer.sysname, buf.sysname) == 0);
    -  ASSERT(strcmp(buffer.version, buf.version) == 0);
    +  ASSERT_NE(uname(&buf), -1);
    +  ASSERT_OK(strcmp(buffer.sysname, buf.sysname));
    +  ASSERT_OK(strcmp(buffer.version, buf.version));
     
     # ifdef _AIX
       snprintf(temp, sizeof(temp), "%s.%s", buf.version, buf.release);
    -  ASSERT(strcmp(buffer.release, temp) == 0);
    +  ASSERT_OK(strcmp(buffer.release, temp));
     # else
    -  ASSERT(strcmp(buffer.release, buf.release) == 0);
    +  ASSERT_OK(strcmp(buffer.release, buf.release));
     # endif /* _AIX */
     
     # if defined(_AIX) || defined(__PASE__)
    -  ASSERT(strcmp(buffer.machine, "ppc64") == 0);
    +  ASSERT_OK(strcmp(buffer.machine, "ppc64"));
     # else
    -  ASSERT(strcmp(buffer.machine, buf.machine) == 0);
    +  ASSERT_OK(strcmp(buffer.machine, buf.machine));
     # endif /* defined(_AIX) || defined(__PASE__) */
     
     #endif /* _WIN32 */
    diff --git a/deps/uv/test/test-walk-handles.c b/deps/uv/test/test-walk-handles.c
    index 50f0ce84f1e846..86fcb04907e7ef 100644
    --- a/deps/uv/test/test-walk-handles.c
    +++ b/deps/uv/test/test-walk-handles.c
    @@ -31,7 +31,7 @@ static uv_timer_t timer;
     
     
     static void walk_cb(uv_handle_t* handle, void* arg) {
    -  ASSERT(arg == (void*)magic_cookie);
    +  ASSERT_PTR_EQ(arg, (void*)magic_cookie);
     
       if (handle == (uv_handle_t*)&timer) {
         seen_timer_handle++;
    @@ -42,7 +42,7 @@ static void walk_cb(uv_handle_t* handle, void* arg) {
     
     
     static void timer_cb(uv_timer_t* handle) {
    -  ASSERT(handle == &timer);
    +  ASSERT_PTR_EQ(handle, &timer);
     
       uv_walk(handle->loop, walk_cb, magic_cookie);
       uv_close((uv_handle_t*)handle, NULL);
    @@ -56,21 +56,21 @@ TEST_IMPL(walk_handles) {
       loop = uv_default_loop();
     
       r = uv_timer_init(loop, &timer);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       r = uv_timer_start(&timer, timer_cb, 1, 0);
    -  ASSERT(r == 0);
    +  ASSERT_OK(r);
     
       /* Start event loop, expect to see the timer handle in walk_cb. */
    -  ASSERT(seen_timer_handle == 0);
    +  ASSERT_OK(seen_timer_handle);
       r = uv_run(loop, UV_RUN_DEFAULT);
    -  ASSERT(r == 0);
    -  ASSERT(seen_timer_handle == 1);
    +  ASSERT_OK(r);
    +  ASSERT_EQ(1, seen_timer_handle);
     
       /* Loop is finished, walk_cb should not see our timer handle. */
       seen_timer_handle = 0;
       uv_walk(loop, walk_cb, magic_cookie);
    -  ASSERT(seen_timer_handle == 0);
    +  ASSERT_OK(seen_timer_handle);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/test/test-watcher-cross-stop.c b/deps/uv/test/test-watcher-cross-stop.c
    index bbc0c30574a7f7..8f79abb7b03e4d 100644
    --- a/deps/uv/test/test-watcher-cross-stop.c
    +++ b/deps/uv/test/test-watcher-cross-stop.c
    @@ -76,22 +76,22 @@ TEST_IMPL(watcher_cross_stop) {
     
       TEST_FILE_LIMIT(ARRAY_SIZE(sockets) + 32);
     
    -  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
    +  ASSERT_OK(uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
       memset(big_string, 'A', sizeof(big_string));
       buf = uv_buf_init(big_string, sizeof(big_string));
     
       for (i = 0; i < ARRAY_SIZE(sockets); i++) {
    -    ASSERT(0 == uv_udp_init(loop, &sockets[i]));
    -    ASSERT(0 == uv_udp_bind(&sockets[i],
    -                            (const struct sockaddr*) &addr,
    -                            UV_UDP_REUSEADDR));
    -    ASSERT(0 == uv_udp_recv_start(&sockets[i], alloc_cb, recv_cb));
    -    ASSERT(0 == uv_udp_send(&reqs[i],
    -                            &sockets[i],
    -                            &buf,
    -                            1,
    -                            (const struct sockaddr*) &addr,
    -                            send_cb));
    +    ASSERT_OK(uv_udp_init(loop, &sockets[i]));
    +    ASSERT_OK(uv_udp_bind(&sockets[i],
    +                          (const struct sockaddr*) &addr,
    +                          UV_UDP_REUSEADDR));
    +    ASSERT_OK(uv_udp_recv_start(&sockets[i], alloc_cb, recv_cb));
    +    ASSERT_OK(uv_udp_send(&reqs[i],
    +                          &sockets[i],
    +                          &buf,
    +                          1,
    +                          (const struct sockaddr*) &addr,
    +                          send_cb));
       }
     
       while (recv_cb_called == 0)
    @@ -100,12 +100,12 @@ TEST_IMPL(watcher_cross_stop) {
       for (i = 0; i < ARRAY_SIZE(sockets); i++)
         uv_close((uv_handle_t*) &sockets[i], close_cb);
     
    -  ASSERT(recv_cb_called > 0);
    +  ASSERT_GT(recv_cb_called, 0);
     
       uv_run(loop, UV_RUN_DEFAULT);
     
    -  ASSERT(ARRAY_SIZE(sockets) == send_cb_called);
    -  ASSERT(ARRAY_SIZE(sockets) == close_cb_called);
    +  ASSERT_EQ(ARRAY_SIZE(sockets), send_cb_called);
    +  ASSERT_EQ(ARRAY_SIZE(sockets), close_cb_called);
     
       MAKE_VALGRIND_HAPPY(loop);
       return 0;
    diff --git a/deps/uv/unofficial.gni b/deps/uv/unofficial.gni
    new file mode 100644
    index 00000000000000..bc29bb04f64958
    --- /dev/null
    +++ b/deps/uv/unofficial.gni
    @@ -0,0 +1,105 @@
    +# This file is used by GN for building, which is NOT the build system used for
    +# building official binaries.
    +# Please edit the gyp files if you are making changes to build system.
    +
    +# The actual configurations are put inside a template in unofficial.gni to
    +# prevent accidental edits from contributors.
    +template("uv_gn_build") {
    +  config("uv_external_config") {
    +    include_dirs = [ "include" ]
    +  }
    +
    +  config("uv_internal_config") {
    +    include_dirs = [
    +      "include",
    +      "src",
    +    ]
    +
    +    defines = [ "BUILDING_UV_SHARED" ]  # always export symbols
    +    if (is_posix) {
    +      defines += [
    +        "_LARGEFILE_SOURCE",
    +        "_FILE_OFFSET_BITS=64",
    +      ]
    +    }
    +    if (is_linux) {
    +      defines += [
    +        "_POSIX_C_SOURCE=200112",
    +        "_GNU_SOURCE",
    +      ]
    +    }
    +    if (is_apple) {
    +      defines += [
    +        "_DARWIN_USE_64_BIT_INODE=1",
    +        "_DARWIN_UNLIMITED_SELECT=1",
    +      ]
    +    }
    +    if (is_clang || !is_win) {
    +      cflags_c = [
    +        "-Wno-deprecated-declarations",
    +        "-Wno-extra-semi",
    +        "-Wno-implicit-fallthrough",
    +        "-Wno-missing-braces",
    +        "-Wno-string-conversion",
    +        "-Wno-shadow",
    +        "-Wno-unreachable-code",
    +        "-Wno-unreachable-code-return",
    +        "-Wno-unused-but-set-parameter",
    +        "-Wno-unused-but-set-variable",
    +        "-Wno-unused-function",
    +        "-Wno-unused-result",
    +        "-Wno-unused-variable",
    +      ]
    +    }
    +  }
    +
    +  gypi_values = exec_script("../../tools/gypi_to_gn.py",
    +                            [ rebase_path("uv.gyp") ],
    +                            "scope",
    +                            [ "uv.gyp" ])
    +
    +  component(target_name) {
    +    forward_variables_from(invoker, "*")
    +
    +    configs += [ ":uv_internal_config" ]
    +    public_configs = [ ":uv_external_config" ]
    +
    +    if (is_win) {
    +      libs = [
    +        "advapi32.lib",
    +        "iphlpapi.lib",
    +        "psapi.lib",
    +        "shell32.lib",
    +        "user32.lib",
    +        "userenv.lib",
    +        "ws2_32.lib",
    +      ]
    +    }
    +    if (is_posix) {
    +      libs = [ "m" ]
    +      ldflags = [ "-pthread" ]
    +    }
    +    if (is_linux) {
    +      libs += [
    +        "dl",
    +        "rt",
    +      ]
    +    }
    +
    +    sources = gypi_values.uv_sources_common
    +    if (is_win) {
    +      sources += gypi_values.uv_sources_win
    +    }
    +    if (is_posix) {
    +      sources += gypi_values.uv_sources_posix +
    +                 [ "src/unix/proctitle.c" ]
    +    }
    +    if (is_linux) {
    +      sources += gypi_values.uv_sources_linux
    +    }
    +    if (is_apple) {
    +      sources += gypi_values.uv_sources_apple +
    +                 gypi_values.uv_sources_bsd_common
    +    }
    +  }
    +}
    diff --git a/deps/uvwasi/BUILD.gn b/deps/uvwasi/BUILD.gn
    new file mode 100644
    index 00000000000000..4f8fb081df805a
    --- /dev/null
    +++ b/deps/uvwasi/BUILD.gn
    @@ -0,0 +1,14 @@
    +##############################################################################
    +#                                                                            #
    +#                       DO NOT EDIT THIS FILE!                               #
    +#                                                                            #
    +##############################################################################
    +
    +# This file is used by GN for building, which is NOT the build system used for
    +# building official binaries.
    +# Please modify the gyp files if you are making changes to build system.
    +
    +import("unofficial.gni")
    +
    +uvwasi_gn_build("uvwasi") {
    +}
    diff --git a/deps/uvwasi/unofficial.gni b/deps/uvwasi/unofficial.gni
    new file mode 100644
    index 00000000000000..b7f30c448626ad
    --- /dev/null
    +++ b/deps/uvwasi/unofficial.gni
    @@ -0,0 +1,32 @@
    +# This file is used by GN for building, which is NOT the build system used for
    +# building official binaries.
    +# Please edit the gyp files if you are making changes to build system.
    +
    +# The actual configurations are put inside a template in unofficial.gni to
    +# prevent accidental edits from contributors.
    +template("uvwasi_gn_build") {
    +  config("uvwasi_config") {
    +    include_dirs = [ "include" ]
    +  }
    +
    +  gypi_values = exec_script("../../tools/gypi_to_gn.py",
    +                            [ rebase_path("uvwasi.gyp") ],
    +                            "scope",
    +                            [ "uvwasi.gyp" ])
    +
    +  source_set(target_name) {
    +    forward_variables_from(invoker, "*")
    +
    +    public_configs = [ ":uvwasi_config" ]
    +    sources = gypi_values.uvwasi_sources
    +    include_dirs = [ "src" ]
    +    deps = [ "../uv" ]
    +
    +    if (is_clang || !is_win) {
    +      cflags_c = [
    +        "-Wno-extra-semi",
    +        "-Wno-shadow",
    +      ]
    +    }
    +  }
    +}
    diff --git a/deps/v8/AUTHORS b/deps/v8/AUTHORS
    index b9b702c5d22400..cfc1360fa68ce9 100644
    --- a/deps/v8/AUTHORS
    +++ b/deps/v8/AUTHORS
    @@ -178,6 +178,7 @@ Kyounga Ra 
     Loo Rong Jie 
     Lu Yahan 
     Luis Reis 
    +Luke Albao 
     Luke Zarko 
     Ma Aiguo 
     Maciej Małecki 
    diff --git a/deps/v8/BUILD.gn b/deps/v8/BUILD.gn
    index dd97c4f922c81a..7e1e4b833d9c3c 100644
    --- a/deps/v8/BUILD.gn
    +++ b/deps/v8/BUILD.gn
    @@ -500,6 +500,7 @@ if (v8_enable_short_builtin_calls == "") {
     if (v8_enable_external_code_space == "") {
       v8_enable_external_code_space =
           v8_enable_pointer_compression &&
    +      v8_enable_pointer_compression_shared_cage &&
           (v8_current_cpu == "x64" || v8_current_cpu == "arm64")
     }
     if (v8_enable_maglev == "") {
    @@ -683,6 +684,12 @@ assert(
         !v8_enable_pointer_compression_shared_cage || v8_enable_pointer_compression,
         "Can't share a pointer compression cage if pointers aren't compressed")
     
    +assert(
    +    !v8_enable_pointer_compression ||
    +        v8_enable_pointer_compression_shared_cage ||
    +        !v8_enable_external_code_space,
    +    "Multi-cage pointer compression mode is not compatible with external code space")
    +
     assert(
         !v8_enable_pointer_compression_shared_cage || v8_current_cpu == "x64" ||
             v8_current_cpu == "arm64" || v8_current_cpu == "riscv64" ||
    diff --git a/deps/v8/include/v8-profiler.h b/deps/v8/include/v8-profiler.h
    index 75c9d6a4ae7863..3ec0cd4bb31318 100644
    --- a/deps/v8/include/v8-profiler.h
    +++ b/deps/v8/include/v8-profiler.h
    @@ -921,12 +921,22 @@ class V8_EXPORT EmbedderGraph {
       virtual ~EmbedderGraph() = default;
     };
     
    +class QueryObjectPredicate {
    + public:
    +  virtual ~QueryObjectPredicate() = default;
    +  virtual bool Filter(v8::Local object) = 0;
    +};
    +
     /**
      * Interface for controlling heap profiling. Instance of the
      * profiler can be retrieved using v8::Isolate::GetHeapProfiler.
      */
     class V8_EXPORT HeapProfiler {
      public:
    +  void QueryObjects(v8::Local context,
    +                    QueryObjectPredicate* predicate,
    +                    std::vector>* objects);
    +
       enum SamplingFlags {
         kSamplingNoFlags = 0,
         kSamplingForceGC = 1 << 0,
    diff --git a/deps/v8/include/v8-version.h b/deps/v8/include/v8-version.h
    index 79ab6bb5753c6b..074d0e9ce39017 100644
    --- a/deps/v8/include/v8-version.h
    +++ b/deps/v8/include/v8-version.h
    @@ -11,7 +11,7 @@
     #define V8_MAJOR_VERSION 11
     #define V8_MINOR_VERSION 8
     #define V8_BUILD_NUMBER 172
    -#define V8_PATCH_LEVEL 13
    +#define V8_PATCH_LEVEL 17
     
     // Use 1 for candidates and 0 otherwise.
     // (Boolean macro values are not supported by all preprocessors.)
    diff --git a/deps/v8/infra/mb/mb_config.pyl b/deps/v8/infra/mb/mb_config.pyl
    index 989584b8dd58d5..77e6b109cf6696 100644
    --- a/deps/v8/infra/mb/mb_config.pyl
    +++ b/deps/v8/infra/mb/mb_config.pyl
    @@ -579,7 +579,7 @@
         'release_x64_gcmole': [
           'release_bot', 'x64', 'gcmole'],
         'release_x64_msvc': [
    -      'release_bot_no_goma', 'x64', 'minimal_symbols', 'msvc'],
    +      'release_bot_no_reclient', 'x64', 'minimal_symbols', 'msvc'],
         'release_x64_correctness_fuzzer' : [
           'release_bot', 'x64', 'v8_correctness_fuzzer'],
         'release_x64_disable_runtime_call_stats': [
    @@ -589,7 +589,7 @@
         'release_x64_fuchsia_trybot': [
           'release_trybot', 'x64', 'fuchsia'],
         'release_x64_gcc': [
    -      'release_bot_no_goma', 'x64', 'gcc', 'lld', 'no_custom_libcxx'],
    +      'release_bot_no_reclient', 'x64', 'gcc', 'lld', 'no_custom_libcxx'],
         'release_x64_ios_simulator': [
           'release_bot', 'x64', 'ios_simulator'],
         'release_x64_internal': [
    @@ -648,7 +648,7 @@
         'debug_x64_asan': [
           'debug_bot', 'x64', 'asan', 'lsan'],
         'debug_x64_asan_no_lsan_static': [
    -      'debug', 'static', 'goma', 'v8_enable_slow_dchecks', 'v8_optimized_debug',
    +      'debug', 'static', 'reclient', 'v8_enable_slow_dchecks', 'v8_optimized_debug',
           'x64', 'asan'],
         'debug_x64_conservative_stack_scanning': [
           'debug_bot', 'x64', 'conservative_stack_scanning'],
    @@ -661,7 +661,7 @@
         'debug_x64_fuchsia': [
           'debug_bot', 'x64', 'fuchsia'],
         'debug_x64_gcc': [
    -      'debug_bot_no_goma', 'x64', 'gcc', 'lld', 'no_custom_libcxx'],
    +      'debug_bot_no_reclient', 'x64', 'gcc', 'lld', 'no_custom_libcxx'],
         'debug_x64_header_includes': [
           'debug_bot', 'x64', 'v8_check_header_includes'],
         'debug_x64_no_shared_cage': [
    @@ -696,7 +696,7 @@
         'debug_x86_minimal_symbols': [
           'debug_bot', 'x86', 'minimal_symbols'],
         'debug_x86_msvc': [
    -      'debug_bot_no_goma', 'x86', 'minimal_symbols', 'msvc'],
    +      'debug_bot_no_reclient', 'x86', 'minimal_symbols', 'msvc'],
         'debug_x86_no_i18n': [
           'debug_bot', 'x86', 'v8_no_i18n'],
         'debug_x86_trybot': [
    @@ -704,7 +704,7 @@
         'debug_x86_vtunejit': [
           'debug_bot', 'x86', 'v8_enable_vtunejit'],
         'full_debug_x86': [
    -      'debug', 'x86', 'goma', 'v8_enable_slow_dchecks', 'v8_full_debug'],
    +      'debug', 'x86', 'reclient', 'v8_enable_slow_dchecks', 'v8_full_debug'],
     
         # Release configs for x86.
         'release_x86': [
    @@ -725,7 +725,7 @@
         'release_x64_predictable': [
           'release_bot', 'x64', 'v8_enable_verify_predictable'],
         'release_x86_shared_verify_heap': [
    -      'release', 'x86', 'goma', 'shared', 'v8_verify_heap'],
    +      'release', 'x86', 'reclient', 'shared', 'v8_verify_heap'],
         'release_x86_trybot': [
           'release_trybot', 'x86'],
         'release_x86_verify_csa': [
    @@ -813,19 +813,19 @@
     
         'debug_bot_no_slow_dchecks': {
           'mixins': [
    -        'debug', 'shared', 'goma', 'v8_disable_slow_dchecks',
    +        'debug', 'shared', 'reclient', 'v8_disable_slow_dchecks',
             'v8_optimized_debug', 'v8_enable_google_benchmark'],
         },
     
         'debug_bot': {
           'mixins': [
    -        'debug', 'shared', 'goma', 'v8_enable_slow_dchecks',
    +        'debug', 'shared', 'reclient', 'v8_enable_slow_dchecks',
             'v8_optimized_debug', 'v8_enable_google_benchmark'],
         },
     
    -    'debug_bot_no_goma': {
    +    'debug_bot_no_reclient': {
           'mixins': [
    -        'debug', 'shared', 'no_goma', 'v8_enable_slow_dchecks',
    +        'debug', 'shared', 'no_reclient', 'v8_enable_slow_dchecks',
             'v8_optimized_debug'],
         },
     
    @@ -867,10 +867,6 @@
           'gn_args': 'v8_gcmole=true',
         },
     
    -    'goma': {
    -      'gn_args': 'use_goma=true',
    -    },
    -
         'hard_float': {
           'gn_args': 'arm_float_abi="hard"',
         },
    @@ -910,8 +906,8 @@
           'gn_args': 'use_custom_libcxx=false',
         },
     
    -    'no_goma': {
    -      'gn_args': 'use_goma=false',
    +    'no_reclient': {
    +      'gn_args': 'use_remoteexec=false',
         },
     
         'no_sandbox': {
    @@ -935,15 +931,15 @@
         },
     
         'release_bot': {
    -      'mixins': ['release', 'static', 'goma', 'v8_enable_google_benchmark'],
    +      'mixins': ['release', 'static', 'reclient', 'v8_enable_google_benchmark'],
         },
     
    -    'release_bot_no_goma': {
    -      'mixins': ['release', 'static', 'no_goma'],
    +    'release_bot_no_reclient': {
    +      'mixins': ['release', 'static', 'no_reclient'],
         },
     
         'release_bot_reclient': {
    -      'mixins': ['release', 'static', 'no_goma', 'reclient'],
    +      'mixins': ['release', 'static', 'reclient'],
         },
     
         'release_trybot': {
    diff --git a/deps/v8/src/api/api.cc b/deps/v8/src/api/api.cc
    index ddf93efc1bd8da..7807545da57f23 100644
    --- a/deps/v8/src/api/api.cc
    +++ b/deps/v8/src/api/api.cc
    @@ -9227,6 +9227,14 @@ void Isolate::TerminateExecution() {
     
     bool Isolate::IsExecutionTerminating() {
       i::Isolate* i_isolate = reinterpret_cast(this);
    +#ifdef DEBUG
    +  // This method might be called on a thread that's not bound to any Isolate
    +  // and thus pointer compression schemes might have cage base value unset.
    +  // Read-only roots accessors contain type DCHECKs which require access to
    +  // V8 heap in order to check the object type. So, allow heap access here
    +  // to let the checks work.
    +  i::PtrComprCageAccessScope ptr_compr_cage_access_scope(i_isolate);
    +#endif  // DEBUG
       return i_isolate->is_execution_terminating();
     }
     
    @@ -9898,6 +9906,14 @@ void Isolate::LowMemoryNotification() {
         i::NestedTimedHistogramScope idle_notification_scope(
             i_isolate->counters()->gc_low_memory_notification());
         TRACE_EVENT0("v8", "V8.GCLowMemoryNotification");
    +#ifdef DEBUG
    +    // This method might be called on a thread that's not bound to any Isolate
    +    // and thus pointer compression schemes might have cage base value unset.
    +    // Read-only roots accessors contain type DCHECKs which require access to
    +    // V8 heap in order to check the object type. So, allow heap access here
    +    // to let the checks work.
    +    i::PtrComprCageAccessScope ptr_compr_cage_access_scope(i_isolate);
    +#endif  // DEBUG
         i_isolate->heap()->CollectAllAvailableGarbage(
             i::GarbageCollectionReason::kLowMemoryNotification);
       }
    @@ -10901,6 +10917,16 @@ int HeapProfiler::GetSnapshotCount() {
       return reinterpret_cast(this)->GetSnapshotsCount();
     }
     
    +void HeapProfiler::QueryObjects(Local v8_context,
    +                                QueryObjectPredicate* predicate,
    +                                std::vector>* objects) {
    +  i::Isolate* isolate = reinterpret_cast(v8_context->GetIsolate());
    +  i::HeapProfiler* profiler = reinterpret_cast(this);
    +  DCHECK_EQ(isolate, profiler->isolate());
    +  ENTER_V8_NO_SCRIPT_NO_EXCEPTION(isolate);
    +  profiler->QueryObjects(Utils::OpenHandle(*v8_context), predicate, objects);
    +}
    +
     const HeapSnapshot* HeapProfiler::GetHeapSnapshot(int index) {
       return reinterpret_cast(
           reinterpret_cast(this)->GetSnapshot(index));
    diff --git a/deps/v8/src/builtins/riscv/builtins-riscv.cc b/deps/v8/src/builtins/riscv/builtins-riscv.cc
    index 326001fdd18add..638001f90549cc 100644
    --- a/deps/v8/src/builtins/riscv/builtins-riscv.cc
    +++ b/deps/v8/src/builtins/riscv/builtins-riscv.cc
    @@ -1673,7 +1673,7 @@ static void Generate_InterpreterEnterBytecode(MacroAssembler* masm) {
       // Set the return address to the correct point in the interpreter entry
       // trampoline.
       Label builtin_trampoline, trampoline_loaded;
    -  Smi interpreter_entry_return_pc_offset(
    +  Tagged interpreter_entry_return_pc_offset(
           masm->isolate()->heap()->interpreter_entry_return_pc_offset());
       DCHECK_NE(interpreter_entry_return_pc_offset, Smi::zero());
     
    diff --git a/deps/v8/src/codegen/riscv/assembler-riscv-inl.h b/deps/v8/src/codegen/riscv/assembler-riscv-inl.h
    index 773dc560da1e64..8abf4b3239ff6d 100644
    --- a/deps/v8/src/codegen/riscv/assembler-riscv-inl.h
    +++ b/deps/v8/src/codegen/riscv/assembler-riscv-inl.h
    @@ -128,9 +128,9 @@ Handle Assembler::compressed_embedded_object_handle_at(
     }
     
     void Assembler::deserialization_set_special_target_at(
    -    Address instruction_payload, Code code, Address target) {
    +    Address instruction_payload, Tagged code, Address target) {
       set_target_address_at(instruction_payload,
    -                        !code.is_null() ? code.constant_pool() : kNullAddress,
    +                        !code.is_null() ? code->constant_pool() : kNullAddress,
                             target);
     }
     
    @@ -159,12 +159,13 @@ void Assembler::deserialization_set_target_internal_reference_at(
       }
     }
     
    -HeapObject RelocInfo::target_object(PtrComprCageBase cage_base) {
    +Tagged RelocInfo::target_object(PtrComprCageBase cage_base) {
       DCHECK(IsCodeTarget(rmode_) || IsEmbeddedObjectMode(rmode_));
       if (IsCompressedEmbeddedObject(rmode_)) {
    -    return HeapObject::cast(Object(V8HeapCompressionScheme::DecompressTagged(
    -        cage_base,
    -        Assembler::target_compressed_address_at(pc_, constant_pool_))));
    +    return HeapObject::cast(
    +        Tagged(V8HeapCompressionScheme::DecompressTagged(
    +            cage_base,
    +            Assembler::target_compressed_address_at(pc_, constant_pool_))));
       } else {
         return HeapObject::cast(
             Object(Assembler::target_address_at(pc_, constant_pool_)));
    @@ -186,7 +187,7 @@ Handle RelocInfo::target_object_handle(Assembler* origin) {
       }
     }
     
    -void RelocInfo::set_target_object(HeapObject target,
    +void RelocInfo::set_target_object(Tagged target,
                                       ICacheFlushMode icache_flush_mode) {
       DCHECK(IsCodeTarget(rmode_) || IsEmbeddedObjectMode(rmode_));
       if (IsCompressedEmbeddedObject(rmode_)) {
    diff --git a/deps/v8/src/codegen/riscv/assembler-riscv.h b/deps/v8/src/codegen/riscv/assembler-riscv.h
    index 65c317ad018126..ced4dd8aee8591 100644
    --- a/deps/v8/src/codegen/riscv/assembler-riscv.h
    +++ b/deps/v8/src/codegen/riscv/assembler-riscv.h
    @@ -288,7 +288,7 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase,
       // This is for calls and branches within generated code.  The serializer
       // has already deserialized the lui/ori instructions etc.
       inline static void deserialization_set_special_target_at(Address location,
    -                                                           Code code,
    +                                                           Tagged code,
                                                                Address target);
     
       // Get the size of the special target encoded at 'instruction_payload'.
    diff --git a/deps/v8/src/common/ptr-compr-inl.h b/deps/v8/src/common/ptr-compr-inl.h
    index abba4502a29c65..f3b3a280a52c2a 100644
    --- a/deps/v8/src/common/ptr-compr-inl.h
    +++ b/deps/v8/src/common/ptr-compr-inl.h
    @@ -91,11 +91,16 @@ Address V8HeapCompressionScheme::DecompressTaggedSigned(Tagged_t raw_value) {
     template 
     Address V8HeapCompressionScheme::DecompressTagged(TOnHeapAddress on_heap_addr,
                                                       Tagged_t raw_value) {
    -#if defined(V8_COMPRESS_POINTERS_IN_SHARED_CAGE)
    +#ifdef V8_COMPRESS_POINTERS
       Address cage_base = base();
    +#ifdef V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE
    +  DCHECK_WITH_MSG(cage_base != kNullAddress,
    +                  "V8HeapCompressionScheme::base is not initialized for "
    +                  "current thread");
    +#endif  // V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE
     #else
       Address cage_base = GetPtrComprCageBaseAddress(on_heap_addr);
    -#endif
    +#endif  // V8_COMPRESS_POINTERS
       Address result = cage_base + static_cast
    (raw_value); V8_ASSUME(static_cast(result) == raw_value); return result; @@ -191,11 +196,16 @@ Address ExternalCodeCompressionScheme::DecompressTaggedSigned( template Address ExternalCodeCompressionScheme::DecompressTagged( TOnHeapAddress on_heap_addr, Tagged_t raw_value) { -#if defined(V8_COMPRESS_POINTERS_IN_SHARED_CAGE) +#ifdef V8_COMPRESS_POINTERS Address cage_base = base(); +#ifdef V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE + DCHECK_WITH_MSG(cage_base != kNullAddress, + "ExternalCodeCompressionScheme::base is not initialized for " + "current thread"); +#endif // V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE #else Address cage_base = GetPtrComprCageBaseAddress(on_heap_addr); -#endif +#endif // V8_COMPRESS_POINTERS Address result = cage_base + static_cast
    (raw_value); V8_ASSUME(static_cast(result) == raw_value); return result; @@ -275,6 +285,19 @@ V8_INLINE PtrComprCageBase GetPtrComprCageBase(Tagged object) { return GetPtrComprCageBaseFromOnHeapAddress(object.ptr()); } +#ifdef V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE + +PtrComprCageAccessScope::PtrComprCageAccessScope(Isolate* isolate) + : cage_base_(V8HeapCompressionScheme::base()) { + V8HeapCompressionScheme::InitBase(isolate->cage_base()); +} + +PtrComprCageAccessScope::~PtrComprCageAccessScope() { + V8HeapCompressionScheme::InitBase(cage_base_); +} + +#endif // V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE + } // namespace internal } // namespace v8 diff --git a/deps/v8/src/common/ptr-compr.h b/deps/v8/src/common/ptr-compr.h index ca5f0e1f9b328d..c60e66eca500a7 100644 --- a/deps/v8/src/common/ptr-compr.h +++ b/deps/v8/src/common/ptr-compr.h @@ -55,8 +55,8 @@ class V8HeapCompressionScheme { private: // These non-inlined accessors to base_ field are used in component builds // where cross-component access to thread local variables is not allowed. - static Address base_non_inlined(); - static void set_base_non_inlined(Address base); + static V8_EXPORT_PRIVATE Address base_non_inlined(); + static V8_EXPORT_PRIVATE void set_base_non_inlined(Address base); #ifdef V8_COMPRESS_POINTERS_IN_SHARED_CAGE static V8_EXPORT_PRIVATE uintptr_t base_ V8_CONSTINIT; @@ -156,6 +156,29 @@ static inline void WriteMaybeUnalignedValue(Address p, V value) { } } +// When multi-cage pointer compression mode is enabled this scope object +// saves current cage's base values and sets them according to given Isolate. +// For all other configurations this scope object is a no-op. +class PtrComprCageAccessScope final { + public: +#ifdef V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE + V8_INLINE explicit PtrComprCageAccessScope(Isolate* isolate); + V8_INLINE ~PtrComprCageAccessScope(); +#else + V8_INLINE explicit PtrComprCageAccessScope(Isolate* isolate) {} + V8_INLINE ~PtrComprCageAccessScope() {} +#endif + + private: +#ifdef V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE + const Address cage_base_; +#ifdef V8_EXTERNAL_CODE_SPACE +// In case this configuration is necessary the code cage base must be saved too. +#error Multi-cage pointer compression with external code space is not supported +#endif // V8_EXTERNAL_CODE_SPACE +#endif // V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE +}; + } // namespace v8::internal #endif // V8_COMMON_PTR_COMPR_H_ diff --git a/deps/v8/src/compiler/js-call-reducer.cc b/deps/v8/src/compiler/js-call-reducer.cc index 65fd9b61753b39..caec49b87c5282 100644 --- a/deps/v8/src/compiler/js-call-reducer.cc +++ b/deps/v8/src/compiler/js-call-reducer.cc @@ -6381,8 +6381,11 @@ Reduction JSCallReducer::ReduceArrayIterator(Node* node, } } + // JSCreateArrayIterator doesn't have control output, so we bypass the old + // JSCall node on the control chain. + ReplaceWithValue(node, node, node, control); + // Morph the {node} into a JSCreateArrayIterator with the given {kind}. - RelaxControls(node); node->ReplaceInput(0, receiver); node->ReplaceInput(1, context); node->ReplaceInput(2, effect); diff --git a/deps/v8/src/compiler/turboshaft/utils.h b/deps/v8/src/compiler/turboshaft/utils.h index 232c7a6dbd5b43..a028b23a490420 100644 --- a/deps/v8/src/compiler/turboshaft/utils.h +++ b/deps/v8/src/compiler/turboshaft/utils.h @@ -6,6 +6,7 @@ #define V8_COMPILER_TURBOSHAFT_UTILS_H_ #include +#include #include #include "src/base/logging.h" diff --git a/deps/v8/src/debug/debug-interface.cc b/deps/v8/src/debug/debug-interface.cc index fb3b6b69e4be80..51e3633853ba56 100644 --- a/deps/v8/src/debug/debug-interface.cc +++ b/deps/v8/src/debug/debug-interface.cc @@ -1211,15 +1211,6 @@ v8::MaybeLocal EvaluateGlobalForTesting( RETURN_ESCAPED(result); } -void QueryObjects(v8::Local v8_context, - QueryObjectPredicate* predicate, - std::vector>* objects) { - i::Isolate* isolate = reinterpret_cast(v8_context->GetIsolate()); - ENTER_V8_NO_SCRIPT_NO_EXCEPTION(isolate); - isolate->heap_profiler()->QueryObjects(Utils::OpenHandle(*v8_context), - predicate, objects); -} - void GlobalLexicalScopeNames(v8::Local v8_context, std::vector>* names) { i::Handle context = Utils::OpenHandle(*v8_context); diff --git a/deps/v8/src/debug/debug-interface.h b/deps/v8/src/debug/debug-interface.h index 5dfd505fed6f14..eb346b326392a7 100644 --- a/deps/v8/src/debug/debug-interface.h +++ b/deps/v8/src/debug/debug-interface.h @@ -530,16 +530,6 @@ class V8_EXPORT_PRIVATE StackTraceIterator { bool throw_on_side_effect) = 0; }; -class QueryObjectPredicate { - public: - virtual ~QueryObjectPredicate() = default; - virtual bool Filter(v8::Local object) = 0; -}; - -void QueryObjects(v8::Local context, - QueryObjectPredicate* predicate, - std::vector>* objects); - void GlobalLexicalScopeNames(v8::Local context, std::vector>* names); diff --git a/deps/v8/src/diagnostics/perf-jit.cc b/deps/v8/src/diagnostics/perf-jit.cc index 59a774b270ce15..3ab0e68a4b1a80 100644 --- a/deps/v8/src/diagnostics/perf-jit.cc +++ b/deps/v8/src/diagnostics/perf-jit.cc @@ -43,6 +43,7 @@ #include "src/codegen/assembler.h" #include "src/codegen/source-position-table.h" #include "src/diagnostics/eh-frame.h" +#include "src/objects/code-kind.h" #include "src/objects/objects-inl.h" #include "src/objects/shared-function-info.h" #include "src/snapshot/embedded/embedded-data.h" @@ -225,9 +226,7 @@ void LinuxPerfJitLogger::LogRecordedBuffer( DisallowGarbageCollection no_gc; if (v8_flags.perf_basic_prof_only_functions) { CodeKind code_kind = abstract_code->kind(isolate_); - if (code_kind != CodeKind::INTERPRETED_FUNCTION && - code_kind != CodeKind::TURBOFAN && code_kind != CodeKind::MAGLEV && - code_kind != CodeKind::BASELINE) { + if (!CodeKindIsJSFunction(code_kind)) { return; } } diff --git a/deps/v8/src/execution/isolate.cc b/deps/v8/src/execution/isolate.cc index e7232e5c1fd50d..9663fb8f65bbe1 100644 --- a/deps/v8/src/execution/isolate.cc +++ b/deps/v8/src/execution/isolate.cc @@ -2503,6 +2503,7 @@ void Isolate::PrintCurrentStackTrace(std::ostream& out) { for (int i = 0; i < frames->length(); ++i) { Handle frame(CallSiteInfo::cast(frames->get(i)), this); SerializeCallSiteInfo(this, frame, &builder); + if (i != frames->length() - 1) builder.AppendCharacter('\n'); } Handle stack_trace = builder.Finish().ToHandleChecked(); @@ -3932,6 +3933,14 @@ Isolate::~Isolate() { void Isolate::InitializeThreadLocal() { thread_local_top()->Initialize(this); +#ifdef DEBUG + // This method might be called on a thread that's not bound to any Isolate + // and thus pointer compression schemes might have cage base value unset. + // Read-only roots accessors contain type DCHECKs which require access to + // V8 heap in order to check the object type. So, allow heap access here + // to let the checks work. + i::PtrComprCageAccessScope ptr_compr_cage_access_scope(this); +#endif // DEBUG clear_pending_exception(); clear_pending_message(); clear_scheduled_exception(); diff --git a/deps/v8/src/execution/riscv/simulator-riscv.cc b/deps/v8/src/execution/riscv/simulator-riscv.cc index 1baf9eb6c66457..5b5411cb3e237c 100644 --- a/deps/v8/src/execution/riscv/simulator-riscv.cc +++ b/deps/v8/src/execution/riscv/simulator-riscv.cc @@ -1889,7 +1889,7 @@ void RiscvDebugger::Debug() { sreg_t value; StdoutStream os; if (GetValue(arg1, &value)) { - Object obj(value); + Tagged obj(value); os << arg1 << ": \n"; #ifdef DEBUG Print(obj, os); @@ -1938,7 +1938,7 @@ void RiscvDebugger::Debug() { PrintF(" 0x%012" PRIxPTR " : 0x%016" REGIx_FORMAT " %14" REGId_FORMAT " ", reinterpret_cast(cur), *cur, *cur); - Object obj(*cur); + Tagged obj(*cur); Heap* current_heap = sim_->isolate_->heap(); if (IsSmi(obj) || IsValidHeapObject(current_heap, HeapObject::cast(obj))) { @@ -4815,7 +4815,7 @@ bool Simulator::DecodeRvvVS() { Builtin Simulator::LookUp(Address pc) { for (Builtin builtin = Builtins::kFirst; builtin <= Builtins::kLast; ++builtin) { - if (builtins_.code(builtin).contains(isolate_, pc)) return builtin; + if (builtins_.code(builtin)->contains(isolate_, pc)) return builtin; } return Builtin::kNoBuiltinId; } @@ -4832,7 +4832,7 @@ void Simulator::DecodeRVIType() { if (builtin != Builtin::kNoBuiltinId) { auto code = builtins_.code(builtin); if ((rs1_reg() != ra || imm12() != 0)) { - if ((Address)get_pc() == code.instruction_start()) { + if ((Address)get_pc() == code->instruction_start()) { sreg_t arg0 = get_register(a0); sreg_t arg1 = get_register(a1); sreg_t arg2 = get_register(a2); diff --git a/deps/v8/src/execution/v8threads.cc b/deps/v8/src/execution/v8threads.cc index be4f4a7f209e3e..9d4437c75e62cd 100644 --- a/deps/v8/src/execution/v8threads.cc +++ b/deps/v8/src/execution/v8threads.cc @@ -124,6 +124,10 @@ bool ThreadManager::RestoreThread() { InitThread(access); return false; } + // In case multi-cage pointer compression mode is enabled ensure that + // current thread's cage base values are properly initialized. + PtrComprCageAccessScope ptr_compr_cage_access_scope(isolate_); + ThreadState* state = per_thread->thread_state(); char* from = state->data(); from = isolate_->handle_scope_implementer()->RestoreThread(from); @@ -274,6 +278,14 @@ void ThreadManager::EagerlyArchiveThread() { } void ThreadManager::FreeThreadResources() { +#ifdef DEBUG + // This method might be called on a thread that's not bound to any Isolate + // and thus pointer compression schemes might have cage base value unset. + // Read-only roots accessors contain type DCHECKs which require access to + // V8 heap in order to check the object type. So, allow heap access here + // to let the checks work. + PtrComprCageAccessScope ptr_compr_cage_access_scope(isolate_); +#endif // DEBUG DCHECK(!isolate_->has_pending_exception()); DCHECK(!isolate_->external_caught_exception()); DCHECK_NULL(isolate_->try_catch_handler()); diff --git a/deps/v8/src/flags/flag-definitions.h b/deps/v8/src/flags/flag-definitions.h index 6acb97299e0026..fb1e6b325a9a88 100644 --- a/deps/v8/src/flags/flag-definitions.h +++ b/deps/v8/src/flags/flag-definitions.h @@ -298,7 +298,6 @@ DEFINE_WEAK_IMPLICATION(harmony_rab_gsab_transfer, harmony_rab_gsab) #define HARMONY_SHIPPING_BASE(V) \ V(harmony_import_assertions, "harmony import assertions") \ V(harmony_change_array_by_copy, "harmony change-Array-by-copy") \ - V(harmony_string_is_well_formed, "harmony String#{is,to}WellFormed") \ V(harmony_rab_gsab, \ "harmony ResizableArrayBuffer / GrowableSharedArrayBuffer") \ V(harmony_regexp_unicode_sets, "harmony RegExp Unicode Sets") \ diff --git a/deps/v8/src/heap/collection-barrier.cc b/deps/v8/src/heap/collection-barrier.cc index 1bc9a972fab5a3..9cafa96eaaaac2 100644 --- a/deps/v8/src/heap/collection-barrier.cc +++ b/deps/v8/src/heap/collection-barrier.cc @@ -51,7 +51,12 @@ class BackgroundCollectionInterruptTask : public CancelableTask { private: // v8::internal::CancelableTask overrides. - void RunInternal() override { heap_->CheckCollectionRequested(); } + void RunInternal() override { + // In case multi-cage pointer compression mode is enabled ensure that + // current thread's cage base values are properly initialized. + PtrComprCageAccessScope ptr_compr_cage_access_scope(heap_->isolate()); + heap_->CheckCollectionRequested(); + } Heap* heap_; }; diff --git a/deps/v8/src/heap/concurrent-marking.cc b/deps/v8/src/heap/concurrent-marking.cc index 14cf52df6e9b8a..37ab77f0747ee7 100644 --- a/deps/v8/src/heap/concurrent-marking.cc +++ b/deps/v8/src/heap/concurrent-marking.cc @@ -153,6 +153,11 @@ class ConcurrentMarking::JobTaskMajor : public v8::JobTask { // v8::JobTask overrides. void Run(JobDelegate* delegate) override { + // In case multi-cage pointer compression mode is enabled ensure that + // current thread's cage base values are properly initialized. + PtrComprCageAccessScope ptr_compr_cage_access_scope( + concurrent_marking_->heap_->isolate()); + if (delegate->IsJoiningThread()) { // TRACE_GC is not needed here because the caller opens the right scope. concurrent_marking_->RunMajor(delegate, code_flush_mode_, @@ -197,6 +202,11 @@ class ConcurrentMarking::JobTaskMinor : public v8::JobTask { // v8::JobTask overrides. void Run(JobDelegate* delegate) override { + // In case multi-cage pointer compression mode is enabled ensure that + // current thread's cage base values are properly initialized. + PtrComprCageAccessScope ptr_compr_cage_access_scope( + concurrent_marking_->heap_->isolate()); + if (delegate->IsJoiningThread()) { TRACE_GC_WITH_FLOW(concurrent_marking_->heap_->tracer(), GCTracer::Scope::MINOR_MS_MARK_PARALLEL, trace_id_, diff --git a/deps/v8/src/heap/incremental-marking-job.cc b/deps/v8/src/heap/incremental-marking-job.cc index 0b0b5de2013b54..03be503d3ba92f 100644 --- a/deps/v8/src/heap/incremental-marking-job.cc +++ b/deps/v8/src/heap/incremental-marking-job.cc @@ -91,6 +91,9 @@ void IncrementalMarkingJob::Task::RunInternal() { VMState state(isolate()); TRACE_EVENT_CALL_STATS_SCOPED(isolate(), "v8", "V8.IncrementalMarkingJob.Task"); + // In case multi-cage pointer compression mode is enabled ensure that + // current thread's cage base values are properly initialized. + PtrComprCageAccessScope ptr_compr_cage_access_scope(isolate()); isolate()->stack_guard()->ClearStartIncrementalMarking(); diff --git a/deps/v8/src/heap/local-heap.cc b/deps/v8/src/heap/local-heap.cc index 426466a48caa33..12f1dfe8c70be8 100644 --- a/deps/v8/src/heap/local-heap.cc +++ b/deps/v8/src/heap/local-heap.cc @@ -48,6 +48,7 @@ void LocalHeap::VerifyCurrent() const { LocalHeap::LocalHeap(Heap* heap, ThreadKind kind, std::unique_ptr persistent_handles) : heap_(heap), + ptr_compr_cage_access_scope_(heap->isolate()), is_main_thread_(kind == ThreadKind::kMain), state_(ThreadState::Parked()), allocation_failed_(false), diff --git a/deps/v8/src/heap/local-heap.h b/deps/v8/src/heap/local-heap.h index 1062f87b928c6c..9868c1ca29b0c0 100644 --- a/deps/v8/src/heap/local-heap.h +++ b/deps/v8/src/heap/local-heap.h @@ -13,6 +13,7 @@ #include "src/base/platform/condition-variable.h" #include "src/base/platform/mutex.h" #include "src/common/assert-scope.h" +#include "src/common/ptr-compr.h" #include "src/execution/isolate.h" #include "src/handles/global-handles.h" #include "src/handles/persistent-handles.h" @@ -348,6 +349,7 @@ class V8_EXPORT_PRIVATE LocalHeap { void SetUpSharedMarking(); Heap* heap_; + V8_NO_UNIQUE_ADDRESS PtrComprCageAccessScope ptr_compr_cage_access_scope_; bool is_main_thread_; AtomicThreadState state_; diff --git a/deps/v8/src/heap/mark-compact.cc b/deps/v8/src/heap/mark-compact.cc index 189e023cc147f2..20e381ae768d7c 100644 --- a/deps/v8/src/heap/mark-compact.cc +++ b/deps/v8/src/heap/mark-compact.cc @@ -2522,6 +2522,10 @@ class ClearStringTableJobItem final : public ParallelClearingJob::ClearingItem { GCTracer::Scope::MC_CLEAR_STRING_TABLE)) {} void Run(JobDelegate* delegate) final { + // In case multi-cage pointer compression mode is enabled ensure that + // current thread's cage base values are properly initialized. + PtrComprCageAccessScope ptr_compr_cage_access_scope(isolate_); + if (isolate_->OwnsStringTables()) { TRACE_GC1_WITH_FLOW(isolate_->heap()->tracer(), GCTracer::Scope::MC_CLEAR_STRING_TABLE, @@ -4135,6 +4139,11 @@ class PageEvacuationJob : public v8::JobTask { tracer_->CurrentEpoch(GCTracer::Scope::MC_EVACUATE)) {} void Run(JobDelegate* delegate) override { + // In case multi-cage pointer compression mode is enabled ensure that + // current thread's cage base values are properly initialized. + PtrComprCageAccessScope ptr_compr_cage_access_scope( + collector_->heap()->isolate()); + Evacuator* evacuator = (*evacuators_)[delegate->GetTaskId()].get(); if (delegate->IsJoiningThread()) { TRACE_GC_WITH_FLOW(tracer_, GCTracer::Scope::MC_EVACUATE_COPY_PARALLEL, @@ -4471,6 +4480,11 @@ class PointersUpdatingJob : public v8::JobTask { tracer_->CurrentEpoch(GCTracer::Scope::MC_EVACUATE)) {} void Run(JobDelegate* delegate) override { + // In case multi-cage pointer compression mode is enabled ensure that + // current thread's cage base values are properly initialized. + PtrComprCageAccessScope ptr_compr_cage_access_scope( + collector_->heap()->isolate()); + if (delegate->IsJoiningThread()) { TRACE_GC_WITH_FLOW(tracer_, GCTracer::Scope::MC_EVACUATE_UPDATE_POINTERS_PARALLEL, diff --git a/deps/v8/src/heap/mark-compact.h b/deps/v8/src/heap/mark-compact.h index ceeb596edac85e..a8a56db74b7442 100644 --- a/deps/v8/src/heap/mark-compact.h +++ b/deps/v8/src/heap/mark-compact.h @@ -161,6 +161,8 @@ class MarkCompactCollector final { return use_background_threads_in_cycle_; } + Heap* heap() { return heap_; } + explicit MarkCompactCollector(Heap* heap); ~MarkCompactCollector(); diff --git a/deps/v8/src/heap/scavenger.cc b/deps/v8/src/heap/scavenger.cc index 7760a6a540e1e5..cd2d9a49546fe3 100644 --- a/deps/v8/src/heap/scavenger.cc +++ b/deps/v8/src/heap/scavenger.cc @@ -200,6 +200,10 @@ ScavengerCollector::JobTask::JobTask( void ScavengerCollector::JobTask::Run(JobDelegate* delegate) { DCHECK_LT(delegate->GetTaskId(), scavengers_->size()); + // In case multi-cage pointer compression mode is enabled ensure that + // current thread's cage base values are properly initialized. + PtrComprCageAccessScope ptr_compr_cage_access_scope(outer_->heap_->isolate()); + Scavenger* scavenger = (*scavengers_)[delegate->GetTaskId()].get(); if (delegate->IsJoiningThread()) { TRACE_GC_WITH_FLOW(outer_->heap_->tracer(), diff --git a/deps/v8/src/heap/sweeper.cc b/deps/v8/src/heap/sweeper.cc index c8649bfa21a9ec..7a712cf200aeed 100644 --- a/deps/v8/src/heap/sweeper.cc +++ b/deps/v8/src/heap/sweeper.cc @@ -144,6 +144,11 @@ class Sweeper::MajorSweeperJob final : public JobTask { private: void RunImpl(JobDelegate* delegate, bool is_joining_thread) { + // In case multi-cage pointer compression mode is enabled ensure that + // current thread's cage base values are properly initialized. + PtrComprCageAccessScope ptr_compr_cage_access_scope( + sweeper_->heap_->isolate()); + DCHECK(sweeper_->major_sweeping_in_progress()); const int offset = delegate->GetTaskId(); DCHECK_LT(offset, concurrent_sweepers.size()); @@ -213,6 +218,11 @@ class Sweeper::MinorSweeperJob final : public JobTask { tracer_, sweeper_->GetTracingScope(NEW_SPACE, is_joining_thread), is_joining_thread ? ThreadKind::kMain : ThreadKind::kBackground, trace_id_, TRACE_EVENT_FLAG_FLOW_IN); + // In case multi-cage pointer compression mode is enabled ensure that + // current thread's cage base values are properly initialized. + PtrComprCageAccessScope ptr_compr_cage_access_scope( + sweeper_->heap_->isolate()); + if (!concurrent_sweeper.ConcurrentSweepSpace(delegate)) return; concurrent_sweeper.ConcurrentSweepPromotedPages(delegate); } diff --git a/deps/v8/src/ic/ic.cc b/deps/v8/src/ic/ic.cc index 630f4db9c82ae2..98af9536effafa 100644 --- a/deps/v8/src/ic/ic.cc +++ b/deps/v8/src/ic/ic.cc @@ -3185,18 +3185,22 @@ bool CanFastCloneObjectWithDifferentMaps(Handle source_map, Handle target_map, Isolate* isolate) { DisallowGarbageCollection no_gc; - // TODO(olivf): Add support for non JS_OBJECT_TYPE source maps. The reason for - // this restriction is that the IC does not initialize the target object and - // instead relies on copying the source objects bytes. Thus they need to have - // the same binary layout. + // Ensure source and target have identical binary represenation of properties + // and elements as the IC relies on copying the raw bytes. This also excludes + // cases with non-enumerable properties or accessors on the source object. if (source_map->instance_type() != JS_OBJECT_TYPE || target_map->instance_type() != JS_OBJECT_TYPE || !source_map->OnlyHasSimpleProperties() || - !target_map->OnlyHasSimpleProperties()) { + !target_map->OnlyHasSimpleProperties() || + source_map->elements_kind() != target_map->elements_kind() || + !source_map->has_fast_elements()) { return false; } // Check that the source inobject properties are big enough to initialize all // target slots, but not too big to fit. + // TODO(olivf): This restriction (and the same restriction on the backing + // store) could be lifted by properly initializing the target object instead + // of relying on copying empty slots. int source_inobj_properties = source_map->GetInObjectProperties(); int target_inobj_properties = target_map->GetInObjectProperties(); int source_used_inobj_properties = diff --git a/deps/v8/src/init/bootstrapper.cc b/deps/v8/src/init/bootstrapper.cc index 2beaf45b14089b..388ee3d576c88a 100644 --- a/deps/v8/src/init/bootstrapper.cc +++ b/deps/v8/src/init/bootstrapper.cc @@ -2158,6 +2158,8 @@ void Genesis::InitializeGlobal(Handle global_object, Builtin::kStringPrototypeIncludes, 1, false); SimpleInstallFunction(isolate_, prototype, "indexOf", Builtin::kStringPrototypeIndexOf, 1, false); + SimpleInstallFunction(isolate(), prototype, "isWellFormed", + Builtin::kStringPrototypeIsWellFormed, 0, false); SimpleInstallFunction(isolate_, prototype, "italics", Builtin::kStringPrototypeItalics, 0, false); SimpleInstallFunction(isolate_, prototype, "lastIndexOf", @@ -2214,6 +2216,8 @@ void Genesis::InitializeGlobal(Handle global_object, Builtin::kStringPrototypeStartsWith, 1, false); SimpleInstallFunction(isolate_, prototype, "toString", Builtin::kStringPrototypeToString, 0, true); + SimpleInstallFunction(isolate(), prototype, "toWellFormed", + Builtin::kStringPrototypeToWellFormed, 0, false); SimpleInstallFunction(isolate_, prototype, "trim", Builtin::kStringPrototypeTrim, 0, false); @@ -5062,18 +5066,6 @@ void Genesis::InitializeGlobal_harmony_rab_gsab() { Builtin::kSharedArrayBufferPrototypeGrow, 1, true); } -void Genesis::InitializeGlobal_harmony_string_is_well_formed() { - if (!v8_flags.harmony_string_is_well_formed) return; - Handle string_function(native_context()->string_function(), - isolate()); - Handle string_prototype( - JSObject::cast(string_function->initial_map()->prototype()), isolate()); - SimpleInstallFunction(isolate(), string_prototype, "isWellFormed", - Builtin::kStringPrototypeIsWellFormed, 0, false); - SimpleInstallFunction(isolate(), string_prototype, "toWellFormed", - Builtin::kStringPrototypeToWellFormed, 0, false); -} - void Genesis::InitializeGlobal_harmony_temporal() { if (!v8_flags.harmony_temporal) return; // -- T e m p o r a l diff --git a/deps/v8/src/inspector/v8-debugger.cc b/deps/v8/src/inspector/v8-debugger.cc index 3d4733b5ba936e..d8a08b422505f7 100644 --- a/deps/v8/src/inspector/v8-debugger.cc +++ b/deps/v8/src/inspector/v8-debugger.cc @@ -8,6 +8,7 @@ #include "include/v8-context.h" #include "include/v8-function.h" #include "include/v8-microtask-queue.h" +#include "include/v8-profiler.h" #include "include/v8-util.h" #include "src/inspector/inspected-context.h" #include "src/inspector/protocol/Protocol.h" @@ -38,7 +39,7 @@ void cleanupExpiredWeakPointers(Map& map) { } } -class MatchPrototypePredicate : public v8::debug::QueryObjectPredicate { +class MatchPrototypePredicate : public v8::QueryObjectPredicate { public: MatchPrototypePredicate(V8InspectorImpl* inspector, v8::Local context, @@ -994,7 +995,7 @@ v8::Local V8Debugger::queryObjects(v8::Local context, v8::Isolate* isolate = context->GetIsolate(); std::vector> v8_objects; MatchPrototypePredicate predicate(m_inspector, context, prototype); - v8::debug::QueryObjects(context, &predicate, &v8_objects); + isolate->GetHeapProfiler()->QueryObjects(context, &predicate, &v8_objects); v8::MicrotasksScope microtasksScope(context, v8::MicrotasksScope::kDoNotRunMicrotasks); diff --git a/deps/v8/src/logging/log.cc b/deps/v8/src/logging/log.cc index 8bd10449687bcf..b10f5d01186dcb 100644 --- a/deps/v8/src/logging/log.cc +++ b/deps/v8/src/logging/log.cc @@ -446,7 +446,7 @@ void LinuxPerfBasicLogger::LogRecordedBuffer(Tagged code, DisallowGarbageCollection no_gc; PtrComprCageBase cage_base(isolate_); if (v8_flags.perf_basic_prof_only_functions && - CodeKindIsBuiltinOrJSFunction(code->kind(cage_base))) { + !CodeKindIsBuiltinOrJSFunction(code->kind(cage_base))) { return; } diff --git a/deps/v8/src/maglev/maglev-code-generator.cc b/deps/v8/src/maglev/maglev-code-generator.cc index cb42c56148ead4..9b95c995429b70 100644 --- a/deps/v8/src/maglev/maglev-code-generator.cc +++ b/deps/v8/src/maglev/maglev-code-generator.cc @@ -419,7 +419,11 @@ class ParallelMoveResolver { void EmitMovesFromSource(RegisterT source_reg, GapMoveTargets&& targets) { DCHECK(moves_from_register_[source_reg.code()].is_empty()); if constexpr (DecompressIfNeeded) { - static_assert(COMPRESS_POINTERS_BOOL); + // The DecompressIfNeeded clause is redundant with the if-constexpr above, + // but otherwise this code cannot be compiled by compilers not yet + // implementing CWG2518. + static_assert(DecompressIfNeeded && COMPRESS_POINTERS_BOOL); + if (targets.needs_decompression == kNeedsDecompression) { __ DecompressTagged(source_reg, source_reg); } @@ -462,7 +466,11 @@ class ParallelMoveResolver { // Decompress after the first move, subsequent moves reuse this register so // they're guaranteed to be decompressed. if constexpr (DecompressIfNeeded) { - static_assert(COMPRESS_POINTERS_BOOL); + // The DecompressIfNeeded clause is redundant with the if-constexpr above, + // but otherwise this code cannot be compiled by compilers not yet + // implementing CWG2518. + static_assert(DecompressIfNeeded && COMPRESS_POINTERS_BOOL); + if (targets.needs_decompression == kNeedsDecompression) { __ DecompressTagged(register_with_slot_value, register_with_slot_value); targets.needs_decompression = kDoesNotNeedDecompression; diff --git a/deps/v8/src/objects/js-function.cc b/deps/v8/src/objects/js-function.cc index 64cb8265b93ba1..8bb87b5d3d3df6 100644 --- a/deps/v8/src/objects/js-function.cc +++ b/deps/v8/src/objects/js-function.cc @@ -1083,13 +1083,13 @@ MaybeHandle JSFunction::GetDerivedMap(Isolate* isolate, isolate); prototype = handle(realm_constructor->prototype(), isolate); } - CHECK(IsJSReceiver(*prototype)); - DCHECK_EQ(constructor_initial_map->constructor_or_back_pointer(), - *constructor); - Handle map = Map::TransitionToDerivedMap( - isolate, constructor_initial_map, Handle::cast(prototype)); - DCHECK_EQ(map->constructor_or_back_pointer(), *constructor); + Handle map = Map::CopyInitialMap(isolate, constructor_initial_map); + map->set_new_target_is_base(false); + CHECK(IsJSReceiver(*prototype)); + if (map->prototype() != *prototype) + Map::SetPrototype(isolate, map, Handle::cast(prototype)); + map->SetConstructor(*constructor); return map; } diff --git a/deps/v8/src/objects/map.cc b/deps/v8/src/objects/map.cc index 798c9c595357d3..4909c9d46af4df 100644 --- a/deps/v8/src/objects/map.cc +++ b/deps/v8/src/objects/map.cc @@ -2344,31 +2344,13 @@ void Map::StartInobjectSlackTracking() { Handle Map::TransitionToPrototype(Isolate* isolate, Handle map, Handle prototype) { - Handle new_map = TransitionsAccessor::GetPrototypeTransition( - isolate, map, prototype, map->new_target_is_base()); + Handle new_map = + TransitionsAccessor::GetPrototypeTransition(isolate, map, prototype); if (new_map.is_null()) { new_map = Copy(isolate, map, "TransitionToPrototype"); TransitionsAccessor::PutPrototypeTransition(isolate, map, prototype, new_map); - if (*prototype != map->prototype()) { - Map::SetPrototype(isolate, new_map, prototype); - } - } - return new_map; -} - -Handle Map::TransitionToDerivedMap(Isolate* isolate, Handle map, - Handle prototype) { - Handle new_map = TransitionsAccessor::GetPrototypeTransition( - isolate, map, prototype, /* new_target_is_base */ false); - if (new_map.is_null()) { - new_map = CopyInitialMap(isolate, map); - TransitionsAccessor::PutPrototypeTransition(isolate, map, prototype, - new_map); - if (*prototype != map->prototype()) { - Map::SetPrototype(isolate, new_map, prototype); - } - new_map->set_new_target_is_base(false); + Map::SetPrototype(isolate, new_map, prototype); } return new_map; } diff --git a/deps/v8/src/objects/map.h b/deps/v8/src/objects/map.h index 2853bdc738fefd..07a1ff595a58b1 100644 --- a/deps/v8/src/objects/map.h +++ b/deps/v8/src/objects/map.h @@ -863,9 +863,6 @@ class Map : public TorqueGeneratedMap { V8_EXPORT_PRIVATE static Handle TransitionToPrototype( Isolate* isolate, Handle map, Handle prototype); - V8_EXPORT_PRIVATE static Handle TransitionToDerivedMap( - Isolate* isolate, Handle map, Handle prototype); - static Handle TransitionToImmutableProto(Isolate* isolate, Handle map); diff --git a/deps/v8/src/objects/transitions.cc b/deps/v8/src/objects/transitions.cc index a1bfb38c41438d..b0731161ab8936 100644 --- a/deps/v8/src/objects/transitions.cc +++ b/deps/v8/src/objects/transitions.cc @@ -443,8 +443,7 @@ void TransitionsAccessor::PutPrototypeTransition(Isolate* isolate, // static Handle TransitionsAccessor::GetPrototypeTransition( - Isolate* isolate, Handle map, Handle prototype_handle, - bool new_target_is_base) { + Isolate* isolate, Handle map, Handle prototype_handle) { DisallowGarbageCollection no_gc; Object prototype = *prototype_handle; Tagged cache = GetPrototypeTransitions(isolate, map); @@ -456,8 +455,7 @@ Handle TransitionsAccessor::GetPrototypeTransition( Tagged heap_object; if (target.GetHeapObjectIfWeak(&heap_object)) { Tagged target_map = Map::cast(heap_object); - if (target_map->prototype() == prototype && - target_map->new_target_is_base() == new_target_is_base) { + if (target_map->prototype() == prototype) { return handle(target_map, isolate); } } diff --git a/deps/v8/src/objects/transitions.h b/deps/v8/src/objects/transitions.h index 66e80f1704bccb..f86cdb41edfd3f 100644 --- a/deps/v8/src/objects/transitions.h +++ b/deps/v8/src/objects/transitions.h @@ -124,20 +124,19 @@ class V8_EXPORT_PRIVATE TransitionsAccessor { } // ===== PROTOTYPE TRANSITIONS ===== - // When you set the prototype of an object using the __proto__ accessor, or if - // an unrelated new.target is passed to a constructor you need a new map for - // the object (the prototype is stored in the map). In order not to multiply - // maps unnecessarily we store these as transitions in the original map. That - // way we can transition to the same map if the same prototype is set, rather - // than creating a new map every time. The transitions are in the form of a - // map where the keys are prototype objects and the values are the maps they - // transition to. PutPrototypeTransition can trigger GC. + // When you set the prototype of an object using the __proto__ accessor you + // need a new map for the object (the prototype is stored in the map). In + // order not to multiply maps unnecessarily we store these as transitions in + // the original map. That way we can transition to the same map if the same + // prototype is set, rather than creating a new map every time. The + // transitions are in the form of a map where the keys are prototype objects + // and the values are the maps they transition to. + // PutPrototypeTransition can trigger GC. static void PutPrototypeTransition(Isolate* isolate, Handle, Handle prototype, Handle target_map); static Handle GetPrototypeTransition(Isolate* isolate, Handle map, - Handle prototype, - bool new_target_is_base); + Handle prototype); // During the first-time Map::Update and Map::TryUpdate, the migration target // map could be cached in the raw_transitions slot of the old map that is diff --git a/deps/v8/src/profiler/heap-profiler.cc b/deps/v8/src/profiler/heap-profiler.cc index a23e6d94d1717e..2a3ed138022d5a 100644 --- a/deps/v8/src/profiler/heap-profiler.cc +++ b/deps/v8/src/profiler/heap-profiler.cc @@ -247,7 +247,7 @@ Heap* HeapProfiler::heap() const { return ids_->heap(); } Isolate* HeapProfiler::isolate() const { return heap()->isolate(); } void HeapProfiler::QueryObjects(Handle context, - debug::QueryObjectPredicate* predicate, + v8::QueryObjectPredicate* predicate, std::vector>* objects) { // We need a stack marker here to allow deterministic passes over the stack. // The garbage collection and the two object heap iterators should scan the diff --git a/deps/v8/src/profiler/heap-profiler.h b/deps/v8/src/profiler/heap-profiler.h index 2756ade8141531..851972a729a806 100644 --- a/deps/v8/src/profiler/heap-profiler.h +++ b/deps/v8/src/profiler/heap-profiler.h @@ -30,7 +30,7 @@ class StringsStorage; // generate consistent IDs for moved objects. class HeapProfilerNativeMoveListener { public: - HeapProfilerNativeMoveListener(HeapProfiler* profiler) + explicit HeapProfilerNativeMoveListener(HeapProfiler* profiler) : profiler_(profiler) {} HeapProfilerNativeMoveListener(const HeapProfilerNativeMoveListener& other) = delete; @@ -116,8 +116,7 @@ class HeapProfiler : public HeapObjectAllocationTracker { Isolate* isolate() const; - void QueryObjects(Handle context, - debug::QueryObjectPredicate* predicate, + void QueryObjects(Handle context, QueryObjectPredicate* predicate, std::vector>* objects); void set_native_move_listener( std::unique_ptr listener) { diff --git a/deps/v8/src/regexp/riscv/regexp-macro-assembler-riscv.cc b/deps/v8/src/regexp/riscv/regexp-macro-assembler-riscv.cc index 3b57e613eefc15..f60f03e5eee6d0 100644 --- a/deps/v8/src/regexp/riscv/regexp-macro-assembler-riscv.cc +++ b/deps/v8/src/regexp/riscv/regexp-macro-assembler-riscv.cc @@ -1216,7 +1216,7 @@ static T* frame_entry_address(Address re_frame, int frame_offset) { int64_t RegExpMacroAssemblerRISCV::CheckStackGuardState(Address* return_address, Address raw_code, Address re_frame) { - InstructionStream re_code = InstructionStream::cast(Object(raw_code)); + Tagged re_code = InstructionStream::cast(Object(raw_code)); return NativeRegExpMacroAssembler::CheckStackGuardState( frame_entry(re_frame, kIsolateOffset), static_cast(frame_entry(re_frame, kStartIndexOffset)), diff --git a/deps/v8/src/wasm/c-api.cc b/deps/v8/src/wasm/c-api.cc index 333708e85d0e45..0f259ee1ca4c45 100644 --- a/deps/v8/src/wasm/c-api.cc +++ b/deps/v8/src/wasm/c-api.cc @@ -59,6 +59,17 @@ namespace wasm { namespace { +// Multi-cage pointer compression mode related note. +// Wasm C-Api is allowed to be used from a thread that's not bound to any +// Isolate. As a result, in a multi-cage pointer compression mode it's not +// guaranteed that current pointer compression cage base value is initialized +// for current thread (see V8HeapCompressionScheme::base_) which makes it +// impossible to read compressed pointers from V8 heap objects. +// This scope ensures that the pointer compression base value is set according +// to respective Wasm C-Api object. +// For all other configurations this scope is a no-op. +using PtrComprCageAccessScope = i::PtrComprCageAccessScope; + auto ReadLebU64(const byte_t** pos) -> uint64_t { uint64_t n = 0; uint64_t shift = 0; @@ -414,12 +425,16 @@ void CheckAndHandleInterrupts(i::Isolate* isolate) { // Stores StoreImpl::~StoreImpl() { + { #ifdef DEBUG - reinterpret_cast(isolate_)->heap()->PreciseCollectAllGarbage( - i::GCFlag::kForced, i::GarbageCollectionReason::kTesting, - v8::kNoGCCallbackFlags); + i::Isolate* i_isolate = reinterpret_cast(isolate_); + PtrComprCageAccessScope ptr_compr_cage_access_scope(i_isolate); + i_isolate->heap()->PreciseCollectAllGarbage( + i::GCFlag::kForced, i::GarbageCollectionReason::kTesting, + v8::kNoGCCallbackFlags); #endif - context()->Exit(); + context()->Exit(); + } isolate_->Dispose(); delete create_params_.array_buffer_allocator; } @@ -451,6 +466,7 @@ void StoreImpl::SetHostInfo(i::Handle object, void* info, } void* StoreImpl::GetHostInfo(i::Handle key) { + PtrComprCageAccessScope ptr_compr_cage_access_scope(i_isolate()); i::Tagged raw = i::EphemeronHashTable::cast(host_info_map_->table())->Lookup(key); if (IsTheHole(raw, i_isolate())) return nullptr; @@ -909,7 +925,12 @@ class RefImpl { i::Isolate* isolate() const { return val_->GetIsolate(); } - i::Handle v8_object() const { return i::Handle::cast(val_); } + i::Handle v8_object() const { +#ifdef DEBUG + PtrComprCageAccessScope ptr_compr_cage_access_scope(isolate()); +#endif // DEBUG + return i::Handle::cast(val_); + } void* get_host_info() const { return store()->GetHostInfo(v8_object()); } @@ -1024,7 +1045,7 @@ auto Trap::make(Store* store_abs, const Message& message) -> own { auto Trap::message() const -> Message { auto isolate = impl(this)->isolate(); - v8::Isolate::Scope isolate_scope(impl(this)->store()->isolate()); + v8::Isolate::Scope isolate_scope(reinterpret_cast(isolate)); i::HandleScope handle_scope(isolate); i::Handle message = @@ -1044,6 +1065,7 @@ own GetInstance(StoreImpl* store, own CreateFrameFromInternal(i::Handle frames, int index, i::Isolate* isolate, StoreImpl* store) { + PtrComprCageAccessScope ptr_compr_cage_access_scope(isolate); i::Handle frame(i::CallSiteInfo::cast(frames->get(index)), isolate); i::Handle instance(frame->GetWasmInstance(), isolate); @@ -1059,6 +1081,7 @@ own CreateFrameFromInternal(i::Handle frames, int index, own Trap::origin() const { i::Isolate* isolate = impl(this)->isolate(); + PtrComprCageAccessScope ptr_compr_cage_access_scope(impl(this)->isolate()); i::HandleScope handle_scope(isolate); i::Handle frames = @@ -1071,6 +1094,7 @@ own Trap::origin() const { ownvec Trap::trace() const { i::Isolate* isolate = impl(this)->isolate(); + PtrComprCageAccessScope ptr_compr_cage_access_scope(isolate); i::HandleScope handle_scope(isolate); i::Handle frames = @@ -1122,6 +1146,7 @@ auto Module::validate(Store* store_abs, const vec& binary) -> bool { i::wasm::ModuleWireBytes bytes( {reinterpret_cast(binary.get()), binary.size()}); i::Isolate* isolate = impl(store_abs)->i_isolate(); + PtrComprCageAccessScope ptr_compr_cage_access_scope(isolate); i::HandleScope scope(isolate); i::wasm::WasmFeatures features = i::wasm::WasmFeatures::FromIsolate(isolate); return i::wasm::GetWasmEngine()->SyncValidate(isolate, features, bytes); @@ -1185,6 +1210,7 @@ ownvec ExportsImpl(i::Handle module_obj) { } auto Module::exports() const -> ownvec { + PtrComprCageAccessScope ptr_compr_cage_access_scope(impl(this)->isolate()); return ExportsImpl(impl(this)->v8_object()); } @@ -1192,6 +1218,7 @@ auto Module::exports() const -> ownvec { // If no TurboFan code existed before calling this function, then the call to // {serialize} may take a long time. auto Module::serialize() const -> vec { + PtrComprCageAccessScope ptr_compr_cage_access_scope(impl(this)->isolate()); i::wasm::NativeModule* native_module = impl(this)->v8_object()->native_module(); native_module->compilation_state()->TierUpAllFunctions(); @@ -1291,6 +1318,7 @@ Extern::~Extern() = default; auto Extern::copy() const -> own { return impl(this)->copy(); } auto Extern::kind() const -> ExternKind { + PtrComprCageAccessScope ptr_compr_cage_access_scope(impl(this)->isolate()); i::Handle obj = impl(this)->v8_object(); if (i::WasmExportedFunction::IsWasmExportedFunction(*obj)) { return wasm::EXTERN_FUNC; @@ -1469,6 +1497,7 @@ auto Func::make(Store* store, const FuncType* type, callback_with_env callback, } auto Func::type() const -> own { + PtrComprCageAccessScope ptr_compr_cage_access_scope(impl(this)->isolate()); i::Handle func = impl(this)->v8_object(); if (i::WasmCapiFunction::IsWasmCapiFunction(*func)) { return SignatureHelper::Deserialize(SignatureHelper::GetSig(func)); @@ -1483,6 +1512,7 @@ auto Func::type() const -> own { } auto Func::param_arity() const -> size_t { + PtrComprCageAccessScope ptr_compr_cage_access_scope(impl(this)->isolate()); i::Handle func = impl(this)->v8_object(); if (i::WasmCapiFunction::IsWasmCapiFunction(*func)) { return i::wasm::SerializedSignatureHelper::ParamCount( @@ -1497,6 +1527,7 @@ auto Func::param_arity() const -> size_t { } auto Func::result_arity() const -> size_t { + PtrComprCageAccessScope ptr_compr_cage_access_scope(impl(this)->isolate()); i::Handle func = impl(this)->v8_object(); if (i::WasmCapiFunction::IsWasmCapiFunction(*func)) { return i::wasm::SerializedSignatureHelper::ReturnCount( @@ -1853,6 +1884,7 @@ auto Global::type() const -> own { } auto Global::get() const -> Val { + PtrComprCageAccessScope ptr_compr_cage_access_scope(impl(this)->isolate()); i::Handle v8_global = impl(this)->v8_object(); switch (v8_global->type().kind()) { case i::wasm::kI32: @@ -2008,7 +2040,8 @@ auto Table::type() const -> own { auto Table::get(size_t index) const -> own { i::Handle table = impl(this)->v8_object(); if (index >= static_cast(table->current_length())) return own(); - i::Isolate* isolate = table->GetIsolate(); + i::Isolate* isolate = impl(this)->isolate(); + PtrComprCageAccessScope ptr_compr_cage_access_scope(isolate); i::HandleScope handle_scope(isolate); i::Handle result = i::WasmTableObject::Get(isolate, table, static_cast(index)); @@ -2026,8 +2059,8 @@ auto Table::get(size_t index) const -> own { auto Table::set(size_t index, const Ref* ref) -> bool { i::Handle table = impl(this)->v8_object(); if (index >= static_cast(table->current_length())) return false; - i::Isolate* isolate = table->GetIsolate(); - v8::Isolate::Scope isolate_scope(impl(this)->store()->isolate()); + i::Isolate* isolate = impl(this)->isolate(); + v8::Isolate::Scope isolate_scope(reinterpret_cast(isolate)); i::HandleScope handle_scope(isolate); i::Handle obj = WasmRefToV8(isolate, ref); const char* error_message; @@ -2042,13 +2075,14 @@ auto Table::set(size_t index, const Ref* ref) -> bool { // TODO(jkummerow): Having Table::size_t shadowing "std" size_t is ugly. auto Table::size() const -> size_t { + PtrComprCageAccessScope ptr_compr_cage_access_scope(impl(this)->isolate()); return impl(this)->v8_object()->current_length(); } auto Table::grow(size_t delta, const Ref* ref) -> bool { i::Handle table = impl(this)->v8_object(); - i::Isolate* isolate = table->GetIsolate(); - v8::Isolate::Scope isolate_scope(impl(this)->store()->isolate()); + i::Isolate* isolate = impl(this)->isolate(); + v8::Isolate::Scope isolate_scope(reinterpret_cast(isolate)); i::HandleScope scope(isolate); i::Handle obj = WasmRefToV8(isolate, ref); const char* error_message; @@ -2101,6 +2135,7 @@ auto Memory::make(Store* store_abs, const MemoryType* type) -> own { } auto Memory::type() const -> own { + PtrComprCageAccessScope ptr_compr_cage_access_scope(impl(this)->isolate()); i::Handle memory = impl(this)->v8_object(); uint32_t min = static_cast(memory->array_buffer()->byte_length() / i::wasm::kWasmPageSize); @@ -2110,15 +2145,18 @@ auto Memory::type() const -> own { } auto Memory::data() const -> byte_t* { + PtrComprCageAccessScope ptr_compr_cage_access_scope(impl(this)->isolate()); return reinterpret_cast( impl(this)->v8_object()->array_buffer()->backing_store()); } auto Memory::data_size() const -> size_t { + PtrComprCageAccessScope ptr_compr_cage_access_scope(impl(this)->isolate()); return impl(this)->v8_object()->array_buffer()->byte_length(); } auto Memory::size() const -> pages_t { + PtrComprCageAccessScope ptr_compr_cage_access_scope(impl(this)->isolate()); return static_cast( impl(this)->v8_object()->array_buffer()->byte_length() / i::wasm::kWasmPageSize); @@ -2126,8 +2164,8 @@ auto Memory::size() const -> pages_t { auto Memory::grow(pages_t delta) -> bool { i::Handle memory = impl(this)->v8_object(); - i::Isolate* isolate = memory->GetIsolate(); - v8::Isolate::Scope isolate_scope(impl(this)->store()->isolate()); + i::Isolate* isolate = impl(this)->isolate(); + v8::Isolate::Scope isolate_scope(reinterpret_cast(isolate)); i::HandleScope handle_scope(isolate); int32_t old = i::WasmMemoryObject::Grow(isolate, memory, delta); return old != -1; diff --git a/deps/v8/src/wasm/module-compiler.cc b/deps/v8/src/wasm/module-compiler.cc index f6ac958579af5b..bbb29f7f47b299 100644 --- a/deps/v8/src/wasm/module-compiler.cc +++ b/deps/v8/src/wasm/module-compiler.cc @@ -1983,6 +1983,9 @@ class AsyncCompileJSToWasmWrapperJob final } TRACE_EVENT0("v8.wasm", "wasm.JSToWasmWrapperCompilation"); + // In case multi-cage pointer compression mode is enabled ensure that + // current thread's cage base values are properly initialized. + PtrComprCageAccessScope ptr_compr_cage_access_scope(isolate); while (true) { DCHECK_EQ(isolate, wrapper_unit->isolate()); wrapper_unit->Execute(); diff --git a/deps/v8/test/cctest/heap/test-concurrent-allocation.cc b/deps/v8/test/cctest/heap/test-concurrent-allocation.cc index c46814e15ca465..12143306d24ab7 100644 --- a/deps/v8/test/cctest/heap/test-concurrent-allocation.cc +++ b/deps/v8/test/cctest/heap/test-concurrent-allocation.cc @@ -133,8 +133,10 @@ UNINITIALIZED_TEST(ConcurrentAllocationInOldSpaceFromMainThread) { v8::Isolate* isolate = v8::Isolate::New(create_params); Isolate* i_isolate = reinterpret_cast(isolate); - AllocateSomeObjects(i_isolate->main_thread_local_heap()); - + { + PtrComprCageAccessScope ptr_compr_cage_access_scope(i_isolate); + AllocateSomeObjects(i_isolate->main_thread_local_heap()); + } isolate->Dispose(); } @@ -383,36 +385,38 @@ UNINITIALIZED_TEST(ConcurrentBlackAllocation) { v8::Isolate* isolate = v8::Isolate::New(create_params); Isolate* i_isolate = reinterpret_cast(isolate); Heap* heap = i_isolate->heap(); + { + PtrComprCageAccessScope ptr_compr_cage_access_scope(i_isolate); - std::vector
    objects; + std::vector
    objects; - base::Semaphore sema_white(0); - base::Semaphore sema_marking_started(0); + base::Semaphore sema_white(0); + base::Semaphore sema_marking_started(0); - auto thread = std::make_unique( - heap, &objects, &sema_white, &sema_marking_started); - CHECK(thread->Start()); + auto thread = std::make_unique( + heap, &objects, &sema_white, &sema_marking_started); + CHECK(thread->Start()); - sema_white.Wait(); - heap->StartIncrementalMarking(i::GCFlag::kNoFlags, - i::GarbageCollectionReason::kTesting); - sema_marking_started.Signal(); + sema_white.Wait(); + heap->StartIncrementalMarking(i::GCFlag::kNoFlags, + i::GarbageCollectionReason::kTesting); + sema_marking_started.Signal(); - thread->Join(); + thread->Join(); - const int kObjectsAllocatedPerIteration = 2; + const int kObjectsAllocatedPerIteration = 2; - for (int i = 0; i < kNumIterations * kObjectsAllocatedPerIteration; i++) { - Address address = objects[i]; - Tagged object = HeapObject::FromAddress(address); + for (int i = 0; i < kNumIterations * kObjectsAllocatedPerIteration; i++) { + Address address = objects[i]; + Tagged object = HeapObject::FromAddress(address); - if (i < kWhiteIterations * kObjectsAllocatedPerIteration) { - CHECK(heap->marking_state()->IsUnmarked(object)); - } else { - CHECK(heap->marking_state()->IsMarked(object)); + if (i < kWhiteIterations * kObjectsAllocatedPerIteration) { + CHECK(heap->marking_state()->IsUnmarked(object)); + } else { + CHECK(heap->marking_state()->IsMarked(object)); + } } } - isolate->Dispose(); } @@ -449,34 +453,35 @@ UNINITIALIZED_TEST(ConcurrentWriteBarrier) { v8::Isolate* isolate = v8::Isolate::New(create_params); Isolate* i_isolate = reinterpret_cast(isolate); Heap* heap = i_isolate->heap(); - - Tagged fixed_array; - Tagged value; { - HandleScope handle_scope(i_isolate); - Handle fixed_array_handle( - i_isolate->factory()->NewFixedArray(1)); - Handle value_handle( - i_isolate->factory()->NewHeapNumber(1.1)); - fixed_array = *fixed_array_handle; - value = *value_handle; - } - heap->StartIncrementalMarking(i::GCFlag::kNoFlags, - i::GarbageCollectionReason::kTesting); - CHECK(heap->marking_state()->IsUnmarked(value)); - - // Mark host |fixed_array| to trigger the barrier. - heap->marking_state()->TryMarkAndAccountLiveBytes(fixed_array); + PtrComprCageAccessScope ptr_compr_cage_access_scope(i_isolate); + Tagged fixed_array; + Tagged value; + { + HandleScope handle_scope(i_isolate); + Handle fixed_array_handle( + i_isolate->factory()->NewFixedArray(1)); + Handle value_handle( + i_isolate->factory()->NewHeapNumber(1.1)); + fixed_array = *fixed_array_handle; + value = *value_handle; + } + heap->StartIncrementalMarking(i::GCFlag::kNoFlags, + i::GarbageCollectionReason::kTesting); + CHECK(heap->marking_state()->IsUnmarked(value)); - auto thread = - std::make_unique(heap, fixed_array, value); - CHECK(thread->Start()); + // Mark host |fixed_array| to trigger the barrier. + heap->marking_state()->TryMarkAndAccountLiveBytes(fixed_array); - thread->Join(); + auto thread = std::make_unique( + heap, fixed_array, value); + CHECK(thread->Start()); - CHECK(heap->marking_state()->IsMarked(value)); - heap::InvokeMajorGC(heap); + thread->Join(); + CHECK(heap->marking_state()->IsMarked(value)); + heap::InvokeMajorGC(heap); + } isolate->Dispose(); } @@ -525,6 +530,7 @@ UNINITIALIZED_TEST(ConcurrentRecordRelocSlot) { Isolate* i_isolate = reinterpret_cast(isolate); Heap* heap = i_isolate->heap(); { + PtrComprCageAccessScope ptr_compr_cage_access_scope(i_isolate); Tagged code; Tagged value; { diff --git a/deps/v8/test/cctest/heap/test-heap.cc b/deps/v8/test/cctest/heap/test-heap.cc index bcf0106da2c1a7..edbfb112d26d5e 100644 --- a/deps/v8/test/cctest/heap/test-heap.cc +++ b/deps/v8/test/cctest/heap/test-heap.cc @@ -1301,6 +1301,7 @@ UNINITIALIZED_TEST(Regress10843) { &callback_was_invoked); { + PtrComprCageAccessScope ptr_compr_cage_access_scope(i_isolate); HandleScope scope(i_isolate); std::vector> arrays; for (int i = 0; i < 140; i++) { @@ -6504,6 +6505,7 @@ UNINITIALIZED_TEST(OutOfMemory) { oom_isolate = i_isolate; isolate->SetOOMErrorHandler(OOMCallback); { + PtrComprCageAccessScope ptr_compr_cage_access_scope(i_isolate); Factory* factory = i_isolate->factory(); HandleScope handle_scope(i_isolate); while (true) { @@ -6530,8 +6532,10 @@ UNINITIALIZED_TEST(OutOfMemoryIneffectiveGC) { isolate->SetOOMErrorHandler(OOMCallback); Factory* factory = i_isolate->factory(); Heap* heap = i_isolate->heap(); - heap::InvokeMajorGC(heap); { + PtrComprCageAccessScope ptr_compr_cage_access_scope(i_isolate); + heap::InvokeMajorGC(heap); + HandleScope scope(i_isolate); while (heap->OldGenerationSizeOfObjects() < heap->MaxOldGenerationSize() * 0.9) { @@ -6685,6 +6689,8 @@ UNINITIALIZED_TEST(OutOfMemorySmallObjects) { state.oom_triggered = false; heap->AddNearHeapLimitCallback(NearHeapLimitCallback, &state); { + PtrComprCageAccessScope ptr_compr_cage_access_scope(isolate); + HandleScope handle_scope(isolate); while (!state.oom_triggered) { factory->NewFixedArray(100); @@ -6718,26 +6724,29 @@ UNINITIALIZED_TEST(OutOfMemoryLargeObjects) { state.heap = heap; state.oom_triggered = false; heap->AddNearHeapLimitCallback(NearHeapLimitCallback, &state); - const int kFixedArrayLength = 1000000; { - HandleScope handle_scope(isolate); - while (!state.oom_triggered) { - factory->NewFixedArray(kFixedArrayLength); + PtrComprCageAccessScope ptr_compr_cage_access_scope(isolate); + const int kFixedArrayLength = 1000000; + { + HandleScope handle_scope(isolate); + while (!state.oom_triggered) { + factory->NewFixedArray(kFixedArrayLength); + } } + CHECK_LE(state.old_generation_capacity_at_oom, + kOldGenerationLimit + state.new_space_capacity_at_oom + + state.new_lo_space_size_at_oom + + FixedArray::SizeFor(kFixedArrayLength)); + CHECK_LE(kOldGenerationLimit, state.old_generation_capacity_at_oom + + state.new_space_capacity_at_oom + + state.new_lo_space_size_at_oom + + FixedArray::SizeFor(kFixedArrayLength)); + CHECK_LE(state.memory_allocator_size_at_oom, + MemoryAllocatorSizeFromHeapCapacity( + state.old_generation_capacity_at_oom + + 2 * state.new_space_capacity_at_oom + + state.new_lo_space_size_at_oom)); } - CHECK_LE(state.old_generation_capacity_at_oom, - kOldGenerationLimit + state.new_space_capacity_at_oom + - state.new_lo_space_size_at_oom + - FixedArray::SizeFor(kFixedArrayLength)); - CHECK_LE(kOldGenerationLimit, state.old_generation_capacity_at_oom + - state.new_space_capacity_at_oom + - state.new_lo_space_size_at_oom + - FixedArray::SizeFor(kFixedArrayLength)); - CHECK_LE( - state.memory_allocator_size_at_oom, - MemoryAllocatorSizeFromHeapCapacity(state.old_generation_capacity_at_oom + - 2 * state.new_space_capacity_at_oom + - state.new_lo_space_size_at_oom)); reinterpret_cast(isolate)->Dispose(); } @@ -6757,6 +6766,7 @@ UNINITIALIZED_TEST(RestoreHeapLimit) { Factory* factory = isolate->factory(); { + PtrComprCageAccessScope ptr_compr_cage_access_scope(isolate); DisableConservativeStackScanningScopeForTesting no_stack_scanning(heap); OutOfMemoryState state; @@ -7060,8 +7070,9 @@ UNINITIALIZED_HEAP_TEST(CodeLargeObjectSpace64k) { v8::Isolate::CreateParams create_params; create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); v8::Isolate* isolate = v8::Isolate::New(create_params); - - Heap* heap = reinterpret_cast(isolate)->heap(); + i::Isolate* i_isolate = reinterpret_cast(isolate); + Heap* heap = i_isolate->heap(); + PtrComprCageAccessScope ptr_compr_cage_access_scope(i_isolate); // Allocate a regular code object. { diff --git a/deps/v8/test/cctest/test-api.cc b/deps/v8/test/cctest/test-api.cc index 6c80599b571793..fa6901159a2bd5 100644 --- a/deps/v8/test/cctest/test-api.cc +++ b/deps/v8/test/cctest/test-api.cc @@ -31,6 +31,7 @@ #include #include #include +#include #include #include "test/cctest/cctest.h" @@ -4926,6 +4927,51 @@ TEST(MessageGetSourceLine) { }); } +void GetCurrentStackTrace(const v8::FunctionCallbackInfo& args) { + std::stringstream ss; + v8::Message::PrintCurrentStackTrace(args.GetIsolate(), ss); + std::string str = ss.str(); + args.GetReturnValue().Set(v8_str(str.c_str())); +} + +THREADED_TEST(MessagePrintCurrentStackTrace) { + v8::Isolate* isolate = CcTest::isolate(); + v8::HandleScope scope(isolate); + Local templ = ObjectTemplate::New(isolate); + templ->Set(isolate, "getCurrentStackTrace", + v8::FunctionTemplate::New(isolate, GetCurrentStackTrace)); + LocalContext context(nullptr, templ); + + v8::ScriptOrigin origin = v8::ScriptOrigin(isolate, v8_str("test"), 0, 0); + v8::Local script = v8_str( + "function c() {\n" + " return getCurrentStackTrace();\n" + "}\n" + "function b() {\n" + " return c();\n" + "}\n" + "function a() {\n" + " return b();\n" + "}\n" + "a();"); + v8::Local stack_trace = + v8::Script::Compile(context.local(), script, &origin) + .ToLocalChecked() + ->Run(context.local()) + .ToLocalChecked(); + + CHECK(stack_trace->IsString()); + v8::String::Utf8Value stack_trace_value(isolate, + stack_trace.As()); + std::string stack_trace_string(*stack_trace_value); + std::string expected( + "c (test:2:10)\n" + "b (test:5:10)\n" + "a (test:8:10)\n" + "test:10:1"); + CHECK_EQ(stack_trace_string, expected); +} + THREADED_TEST(GetSetProperty) { LocalContext context; v8::Isolate* isolate = context->GetIsolate(); diff --git a/deps/v8/test/cctest/test-debug-helper.cc b/deps/v8/test/cctest/test-debug-helper.cc index 809a6b9ba6fbe8..4d986c87b8e432 100644 --- a/deps/v8/test/cctest/test-debug-helper.cc +++ b/deps/v8/test/cctest/test-debug-helper.cc @@ -126,6 +126,7 @@ TEST(GetObjectProperties) { CcTest::InitializeVM(); v8::Isolate* isolate = CcTest::isolate(); i::Isolate* i_isolate = reinterpret_cast(isolate); + PtrComprCageAccessScope ptr_compr_cage_access_scope(i_isolate); v8::HandleScope scope(isolate); LocalContext context; // Claim we don't know anything about the heap layout. @@ -470,6 +471,8 @@ static void FrameIterationCheck( THREADED_TEST(GetFrameStack) { LocalContext env; v8::Isolate* isolate = env->GetIsolate(); + i::Isolate* i_isolate = reinterpret_cast(isolate); + PtrComprCageAccessScope ptr_compr_cage_access_scope(i_isolate); v8::HandleScope scope(isolate); v8::Local obj = v8::ObjectTemplate::New(isolate); obj->SetAccessor(v8_str("xxx"), FrameIterationCheck); @@ -490,6 +493,7 @@ TEST(SmallOrderedHashSetGetObjectProperties) { LocalContext context; Isolate* isolate = reinterpret_cast((*context)->GetIsolate()); Factory* factory = isolate->factory(); + PtrComprCageAccessScope ptr_compr_cage_access_scope(isolate); HandleScope scope(isolate); Handle set = factory->NewSmallOrderedHashSet(); diff --git a/deps/v8/test/cctest/test-heap-profiler.cc b/deps/v8/test/cctest/test-heap-profiler.cc index 1ca4a4808de2b3..4c685f90c26c54 100644 --- a/deps/v8/test/cctest/test-heap-profiler.cc +++ b/deps/v8/test/cctest/test-heap-profiler.cc @@ -30,6 +30,7 @@ #include #include +#include #include "include/v8-function.h" #include "include/v8-json.h" @@ -4064,6 +4065,67 @@ TEST(SamplingHeapProfilerSampleDuringDeopt) { heap_profiler->StopSamplingHeapProfiler(); } +namespace { +class TestQueryObjectPredicate : public v8::QueryObjectPredicate { + public: + TestQueryObjectPredicate(v8::Local context, + v8::Local symbol) + : context_(context), symbol_(symbol) {} + + bool Filter(v8::Local object) override { + return object->HasOwnProperty(context_, symbol_).FromMaybe(false); + } + + private: + v8::Local context_; + v8::Local symbol_; +}; + +class IncludeAllQueryObjectPredicate : public v8::QueryObjectPredicate { + public: + IncludeAllQueryObjectPredicate() {} + bool Filter(v8::Local object) override { return true; } +}; +} // anonymous namespace + +TEST(QueryObjects) { + LocalContext env; + v8::Isolate* isolate = env->GetIsolate(); + v8::HandleScope scope(isolate); + v8::Local context = env.local(); + + v8::Local sym = + v8::Symbol::New(isolate, v8_str("query_object_test")); + context->Global()->Set(context, v8_str("test_symbol"), sym).Check(); + v8::Local arr = CompileRun(R"( + const arr = []; + for (let i = 0; i < 10; ++i) { + arr.push({[test_symbol]: true}); + } + arr; + )"); + context->Global()->Set(context, v8_str("arr"), arr).Check(); + v8::HeapProfiler* heap_profiler = isolate->GetHeapProfiler(); + + { + TestQueryObjectPredicate predicate(context, sym); + std::vector> out; + heap_profiler->QueryObjects(context, &predicate, &out); + + CHECK_EQ(out.size(), 10); + for (size_t i = 0; i < out.size(); ++i) { + CHECK(out[i].Get(isolate)->HasOwnProperty(context, sym).FromMaybe(false)); + } + } + + { + IncludeAllQueryObjectPredicate predicate; + std::vector> out; + heap_profiler->QueryObjects(context, &predicate, &out); + CHECK_GE(out.size(), 10); + } +} + TEST(WeakReference) { v8::Isolate* isolate = CcTest::isolate(); i::Isolate* i_isolate = CcTest::i_isolate(); diff --git a/deps/v8/test/cctest/test-serialize.cc b/deps/v8/test/cctest/test-serialize.cc index 36f131630d6fd4..bf346454f16ab6 100644 --- a/deps/v8/test/cctest/test-serialize.cc +++ b/deps/v8/test/cctest/test-serialize.cc @@ -4262,10 +4262,10 @@ UNINITIALIZED_TEST(ReinitializeHashSeedJSCollectionRehashable) { create_params.snapshot_blob = &blob; v8::Isolate* isolate = v8::Isolate::New(create_params); { + v8::Isolate::Scope isolate_scope(isolate); // Check that rehashing has been performed. CHECK_EQ(static_cast(1337), HashSeed(reinterpret_cast(isolate))); - v8::Isolate::Scope isolate_scope(isolate); v8::HandleScope handle_scope(isolate); v8::Local context = v8::Context::New(isolate); CHECK(!context.IsEmpty()); @@ -4330,10 +4330,10 @@ UNINITIALIZED_TEST(ReinitializeHashSeedRehashable) { create_params.snapshot_blob = &blob; v8::Isolate* isolate = v8::Isolate::New(create_params); { + v8::Isolate::Scope isolate_scope(isolate); // Check that rehashing has been performed. CHECK_EQ(static_cast(1337), HashSeed(reinterpret_cast(isolate))); - v8::Isolate::Scope isolate_scope(isolate); v8::HandleScope handle_scope(isolate); v8::Local context = v8::Context::New(isolate); CHECK(!context.IsEmpty()); diff --git a/deps/v8/test/fuzzer/wasm-async.cc b/deps/v8/test/fuzzer/wasm-async.cc index 488047d1d7326c..63176aa4fb85af 100644 --- a/deps/v8/test/fuzzer/wasm-async.cc +++ b/deps/v8/test/fuzzer/wasm-async.cc @@ -54,12 +54,13 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { Isolate* i_isolate = reinterpret_cast(isolate); + v8::Isolate::Scope isolate_scope(isolate); + // Clear any pending exceptions from a prior run. if (i_isolate->has_pending_exception()) { i_isolate->clear_pending_exception(); } - v8::Isolate::Scope isolate_scope(isolate); v8::HandleScope handle_scope(isolate); v8::Context::Scope context_scope(support->GetContext()); diff --git a/deps/v8/test/fuzzer/wasm-fuzzer-common.cc b/deps/v8/test/fuzzer/wasm-fuzzer-common.cc index ff00334f87ac21..281da1edc8ba3e 100644 --- a/deps/v8/test/fuzzer/wasm-fuzzer-common.cc +++ b/deps/v8/test/fuzzer/wasm-fuzzer-common.cc @@ -811,10 +811,13 @@ void WasmExecutionFuzzer::FuzzWasmModule(base::Vector data, Isolate* i_isolate = reinterpret_cast(isolate); + v8::Isolate::Scope isolate_scope(isolate); + // Clear any pending exceptions from a prior run. - i_isolate->clear_pending_exception(); + if (i_isolate->has_pending_exception()) { + i_isolate->clear_pending_exception(); + } - v8::Isolate::Scope isolate_scope(isolate); v8::HandleScope handle_scope(isolate); v8::Context::Scope context_scope(support->GetContext()); diff --git a/deps/v8/test/fuzzer/wasm.cc b/deps/v8/test/fuzzer/wasm.cc index ad4d5163d001df..b99b30168f93d2 100644 --- a/deps/v8/test/fuzzer/wasm.cc +++ b/deps/v8/test/fuzzer/wasm.cc @@ -32,12 +32,13 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { Isolate* i_isolate = reinterpret_cast(isolate); + v8::Isolate::Scope isolate_scope(isolate); + // Clear any pending exceptions from a prior run. if (i_isolate->has_pending_exception()) { i_isolate->clear_pending_exception(); } - v8::Isolate::Scope isolate_scope(isolate); v8::HandleScope handle_scope(isolate); v8::Context::Scope context_scope(support->GetContext()); diff --git a/deps/v8/test/mjsunit/compiler/regress-crbug-1486342.js b/deps/v8/test/mjsunit/compiler/regress-crbug-1486342.js new file mode 100644 index 00000000000000..c35a7339801d03 --- /dev/null +++ b/deps/v8/test/mjsunit/compiler/regress-crbug-1486342.js @@ -0,0 +1,25 @@ +// Copyright 2023 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Flags: --allow-natives-syntax --jit-fuzzing + +const o13 = { + "maxByteLength": 5368789, +}; +const v14 = new ArrayBuffer(129, o13); +const v16 = new Uint16Array(v14); + +function f3(param) { + for (let i = 0; i < 5; i++) { + try {"resize".includes(v14); } catch (e) {} + v14.resize(3.0, ..."resize", ...v16); + } + + let f = function() { return param; } +} + +%PrepareFunctionForOptimization(f3); +f3(); +%OptimizeFunctionOnNextCall(f3); +f3(); diff --git a/deps/v8/test/mjsunit/regress/regress-reflect-construct.js b/deps/v8/test/mjsunit/regress/regress-reflect-construct.js deleted file mode 100644 index 35f1c47f592983..00000000000000 --- a/deps/v8/test/mjsunit/regress/regress-reflect-construct.js +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2023 the V8 project authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Flags: --allow-natives-syntax - - -class A {}; -class B {}; -class C {}; -class D {}; -class E {}; -class V { constructor() { this.v = 1 } }; -class W { constructor() { this.w = 1 } }; -class X { constructor() { this.x = 1 } }; -class Y { constructor() { this.y = 1 } }; -class Z { constructor() { this.z = 1 } }; - -var ctrs = [ - function() {}, - A,B,C,D,E,V,W,X,Y,Z -]; - -for (var it = 0; it < 20; ++it) { - for (var i in ctrs) { - for (var j in ctrs) { - assertTrue(%HaveSameMap(Reflect.construct(ctrs[i],[],ctrs[j]), - Reflect.construct(ctrs[i],[],ctrs[j]))); - } - } -} diff --git a/deps/v8/test/wasm-api-tests/serialize.cc b/deps/v8/test/wasm-api-tests/serialize.cc index 5916ce9abe9995..be1716e28bb6ff 100644 --- a/deps/v8/test/wasm-api-tests/serialize.cc +++ b/deps/v8/test/wasm-api-tests/serialize.cc @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "src/common/ptr-compr-inl.h" #include "src/execution/isolate.h" #include "src/wasm/c-api.h" #include "test/wasm-api-tests/wasm-api-test.h" @@ -35,12 +36,19 @@ TEST_F(WasmCapiTest, Serialize) { // We reset the module and collect it to make sure the NativeModuleCache does // not contain it anymore. Otherwise deserialization will not happen. ResetModule(); - Heap* heap = - reinterpret_cast<::wasm::StoreImpl*>(store())->i_isolate()->heap(); - heap->PreciseCollectAllGarbage(GCFlag::kForced, - GarbageCollectionReason::kTesting); - heap->PreciseCollectAllGarbage(GCFlag::kForced, - GarbageCollectionReason::kTesting); + { + Isolate* isolate = + reinterpret_cast<::wasm::StoreImpl*>(store())->i_isolate(); + // This method might be called on a thread that's not bound to any Isolate + // and thus pointer compression schemes might have cage base value unset. + // Ensure cage bases are initialized so that the V8 heap can be accessed. + i::PtrComprCageAccessScope ptr_compr_cage_access_scope(isolate); + Heap* heap = isolate->heap(); + heap->PreciseCollectAllGarbage(GCFlag::kForced, + GarbageCollectionReason::kTesting); + heap->PreciseCollectAllGarbage(GCFlag::kForced, + GarbageCollectionReason::kTesting); + } own deserialized = Module::deserialize(store(), serialized); // Try to serialize the module again. This can fail if deserialization does diff --git a/deps/v8/tools/debug_helper/debug-helper-internal.cc b/deps/v8/tools/debug_helper/debug-helper-internal.cc index 8ff3f29f5cd2d3..65098d13f0f8b3 100644 --- a/deps/v8/tools/debug_helper/debug-helper-internal.cc +++ b/deps/v8/tools/debug_helper/debug-helper-internal.cc @@ -23,13 +23,13 @@ bool IsPointerCompressed(uintptr_t address) { uintptr_t EnsureDecompressed(uintptr_t address, uintptr_t any_uncompressed_ptr) { if (!COMPRESS_POINTERS_BOOL || !IsPointerCompressed(address)) return address; -#ifdef V8_COMPRESS_POINTERS_IN_SHARED_CAGE +#ifdef V8_COMPRESS_POINTERS Address base = V8HeapCompressionScheme::GetPtrComprCageBaseAddress(any_uncompressed_ptr); if (base != V8HeapCompressionScheme::base()) { V8HeapCompressionScheme::InitBase(base); } -#endif +#endif // V8_COMPRESS_POINTERS // TODO(v8:11880): ExternalCodeCompressionScheme might be needed here for // decompressing Code pointers from external code space. return i::V8HeapCompressionScheme::DecompressTagged( diff --git a/deps/v8/tools/debug_helper/get-object-properties.cc b/deps/v8/tools/debug_helper/get-object-properties.cc index ac1d7a8af04c18..9d14e01093ca74 100644 --- a/deps/v8/tools/debug_helper/get-object-properties.cc +++ b/deps/v8/tools/debug_helper/get-object-properties.cc @@ -659,13 +659,13 @@ std::unique_ptr GetHeapObjectPropertiesMaybeCompressed( any_uncompressed_ptr = heap_addresses.old_space_first_page; if (any_uncompressed_ptr == 0) any_uncompressed_ptr = heap_addresses.read_only_space_first_page; -#ifdef V8_COMPRESS_POINTERS_IN_SHARED_CAGE +#ifdef V8_COMPRESS_POINTERS Address base = V8HeapCompressionScheme::GetPtrComprCageBaseAddress(any_uncompressed_ptr); if (base != V8HeapCompressionScheme::base()) { V8HeapCompressionScheme::InitBase(base); } -#endif +#endif // V8_COMPRESS_POINTERS FillInUnknownHeapAddresses(&heap_addresses, any_uncompressed_ptr); if (any_uncompressed_ptr == 0) { // We can't figure out the heap range. Just check for known objects. diff --git a/deps/zlib/BUILD.gn b/deps/zlib/BUILD.gn index 8ed0807a994b1e..46627bca7eb158 100644 --- a/deps/zlib/BUILD.gn +++ b/deps/zlib/BUILD.gn @@ -3,6 +3,7 @@ # found in the LICENSE file. import("//build/config/compiler/compiler.gni") +import("//build/config/dcheck_always_on.gni") declare_args() { # Expose zlib's symbols, used by Node.js to provide zlib APIs for its native @@ -33,7 +34,7 @@ config("zlib_internal_config") { # Build code using -O3, see: crbug.com/1084371. configs = [ "//build/config/compiler:optimize_speed" ] } - if (is_debug || use_fuzzing_engine) { + if (is_debug || dcheck_always_on || use_fuzzing_engine) { # Enable zlib's asserts in debug and fuzzer builds. defines += [ "ZLIB_DEBUG" ] } diff --git a/deps/zlib/CMakeLists.txt b/deps/zlib/CMakeLists.txt index 234eab8db41def..5541985f474c64 100644 --- a/deps/zlib/CMakeLists.txt +++ b/deps/zlib/CMakeLists.txt @@ -1,9 +1,9 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 2.4.4...3.15.0) set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON) project(zlib C) -set(VERSION "1.2.13.1") +set(VERSION "1.3.0.1") set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables") set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries") diff --git a/deps/zlib/README.chromium b/deps/zlib/README.chromium index 1dfb99666423ea..31b9d55860f9e5 100644 --- a/deps/zlib/README.chromium +++ b/deps/zlib/README.chromium @@ -1,8 +1,8 @@ Name: zlib Short Name: zlib URL: http://zlib.net/ -Version: 1.2.13 -CPEPrefix: cpe:/a:zlib:zlib:1.2.13 +Version: 1.3.0.1 +CPEPrefix: cpe:/a:zlib:zlib:1.3.0.1 Security Critical: yes Shipped: yes License: Zlib diff --git a/deps/zlib/contrib/minizip/README.chromium b/deps/zlib/contrib/minizip/README.chromium index 9c780f94682075..b13de237b5387a 100644 --- a/deps/zlib/contrib/minizip/README.chromium +++ b/deps/zlib/contrib/minizip/README.chromium @@ -6,6 +6,7 @@ License: Zlib License File: //third_party/zlib/LICENSE Security Critical: yes Shipped: yes +CPEPrefix: cpe:/a:minizip_project:minizip Description: Minizip provides API on top of zlib that can enumerate and extract ZIP archive diff --git a/deps/zlib/contrib/optimizations/inflate.c b/deps/zlib/contrib/optimizations/inflate.c index 2a8e0ef76db6ba..c535c5af0c89ee 100644 --- a/deps/zlib/contrib/optimizations/inflate.c +++ b/deps/zlib/contrib/optimizations/inflate.c @@ -1422,7 +1422,7 @@ int ZEXPORT inflateSync(z_streamp strm) { /* if first time, start search in bit buffer */ if (state->mode != SYNC) { state->mode = SYNC; - state->hold <<= state->bits & 7; + state->hold >>= state->bits & 7; state->bits -= state->bits & 7; len = 0; while (state->bits >= 8) { diff --git a/deps/zlib/contrib/tests/utils_unittest.cc b/deps/zlib/contrib/tests/utils_unittest.cc index d06dbc9812ad92..4a8027717920f6 100644 --- a/deps/zlib/contrib/tests/utils_unittest.cc +++ b/deps/zlib/contrib/tests/utils_unittest.cc @@ -1025,6 +1025,61 @@ TEST(ZlibTest, DeflateZFixedCorruption) { 0); } +TEST(ZlibTest, DeflateCopy) { + // Check that deflateCopy() works. + + z_stream stream1; + stream1.zalloc = Z_NULL; + stream1.zfree = Z_NULL; + int ret = + deflateInit(&stream1, Z_DEFAULT_COMPRESSION); + ASSERT_EQ(ret, Z_OK); + std::vector compressed( + deflateBound(&stream1, strlen(zFixedCorruptionData))); + stream1.next_out = compressed.data(); + stream1.avail_out = compressed.size(); + + // Compress the first 1000 bytes. + stream1.next_in = (uint8_t*)zFixedCorruptionData; + stream1.avail_in = 1000; + ret = deflate(&stream1, Z_NO_FLUSH); + ASSERT_EQ(ret, Z_OK); + + // Copy the stream state. + z_stream stream2; + ret = deflateCopy(&stream2, &stream1); + ASSERT_EQ(ret, Z_OK); + deflateEnd(&stream1); + + // Compress the remaining bytes. + stream2.next_in = (uint8_t*)zFixedCorruptionData + (1000 - stream2.avail_in); + stream2.avail_in = strlen(zFixedCorruptionData) - (1000 - stream2.avail_in); + ret = deflate(&stream2, Z_FINISH); + ASSERT_EQ(ret, Z_STREAM_END); + size_t compressed_sz = compressed.size() - stream2.avail_out; + deflateEnd(&stream2); + + // Check that decompression is successful. + std::vector decompressed(strlen(zFixedCorruptionData)); + z_stream stream; + stream.zalloc = Z_NULL; + stream.zfree = Z_NULL; + ret = inflateInit(&stream); + ASSERT_EQ(ret, Z_OK); + stream.next_in = compressed.data(); + stream.avail_in = compressed_sz; + stream.next_out = decompressed.data(); + stream.avail_out = decompressed.size(); + ret = inflate(&stream, Z_FINISH); + ASSERT_EQ(ret, Z_STREAM_END); + inflateEnd(&stream); + + EXPECT_EQ(decompressed.size(), strlen(zFixedCorruptionData)); + EXPECT_EQ( + memcmp(zFixedCorruptionData, decompressed.data(), decompressed.size()), + 0); +} + // TODO(gustavoa): make these tests run standalone. #ifndef CMAKE_STANDALONE_UNITTESTS diff --git a/deps/zlib/crc32.c b/deps/zlib/crc32.c index 1e1a57519cbda6..cf8579f30aa707 100644 --- a/deps/zlib/crc32.c +++ b/deps/zlib/crc32.c @@ -792,8 +792,8 @@ unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf, words = (z_word_t const *)buf; /* Do endian check at execution time instead of compile time, since ARM - processors can change the endianess at execution time. If the - compiler knows what the endianess will be, it can optimize out the + processors can change the endianness at execution time. If the + compiler knows what the endianness will be, it can optimize out the check and the unused branch. */ endian = 1; if (*(unsigned char *)&endian) { diff --git a/deps/zlib/deflate.c b/deps/zlib/deflate.c index 173ce596be582e..4920e7007af887 100644 --- a/deps/zlib/deflate.c +++ b/deps/zlib/deflate.c @@ -1,5 +1,5 @@ /* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler + * Copyright (C) 1995-2023 Jean-loup Gailly and Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -65,7 +65,7 @@ #endif const char deflate_copyright[] = - " deflate 1.2.13.1 Copyright 1995-2022 Jean-loup Gailly and Mark Adler "; + " deflate 1.3.0.1 Copyright 1995-2023 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -168,6 +168,11 @@ local const config configuration_table[10] = { * bit values at the expense of memory usage). We slide even when level == 0 to * keep the hash table consistent if we switch back to level > 0 later. */ +#if defined(__has_feature) +# if __has_feature(memory_sanitizer) + __attribute__((no_sanitize("memory"))) +# endif +#endif local void slide_hash(deflate_state *s) { #if defined(DEFLATE_SLIDE_HASH_SSE2) || defined(DEFLATE_SLIDE_HASH_NEON) slide_hash_simd(s->head, s->prev, s->w_size, s->hash_size); @@ -526,7 +531,11 @@ int ZEXPORT deflateInit2_(z_streamp strm, int level, int method, * the compressed data for a dynamic block also cannot overwrite the * symbols from which it is being constructed. */ +#ifdef LIT_MEM + s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, 5); +#else s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, 4); +#endif s->pending_buf_size = (ulg)s->lit_bufsize * 4; if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || @@ -536,8 +545,14 @@ int ZEXPORT deflateInit2_(z_streamp strm, int level, int method, deflateEnd (strm); return Z_MEM_ERROR; } +#ifdef LIT_MEM + s->d_buf = (ushf *)(s->pending_buf + (s->lit_bufsize << 1)); + s->l_buf = s->pending_buf + (s->lit_bufsize << 2); + s->sym_end = s->lit_bufsize - 1; +#else s->sym_buf = s->pending_buf + s->lit_bufsize; s->sym_end = (s->lit_bufsize - 1) * 3; +#endif /* We avoid equality with lit_bufsize*3 because of wraparound at 64K * on 16 bit machines and because stored blocks are restricted to * 64K-1 bytes. @@ -749,9 +764,15 @@ int ZEXPORT deflatePrime(z_streamp strm, int bits, int value) { if (deflateStateCheck(strm)) return Z_STREAM_ERROR; s = strm->state; +#ifdef LIT_MEM + if (bits < 0 || bits > 16 || + (uchf *)s->d_buf < s->pending_out + ((Buf_size + 7) >> 3)) + return Z_BUF_ERROR; +#else if (bits < 0 || bits > 16 || s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3)) return Z_BUF_ERROR; +#endif do { put = Buf_size - s->bi_valid; if (put > bits) @@ -1324,7 +1345,11 @@ int ZEXPORT deflateCopy(z_streamp dest, z_streamp source) { ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); +#ifdef LIT_MEM + ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 5); +#else ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4); +#endif if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || ds->pending_buf == Z_NULL) { @@ -1335,10 +1360,19 @@ int ZEXPORT deflateCopy(z_streamp dest, z_streamp source) { zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); +#ifdef LIT_MEM + zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->lit_bufsize * 5); +#else zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); +#endif ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); +#ifdef LIT_MEM + ds->d_buf = (ushf *)(ds->pending_buf + (ds->lit_bufsize << 1)); + ds->l_buf = ds->pending_buf + (ds->lit_bufsize << 2); +#else ds->sym_buf = ds->pending_buf + ds->lit_bufsize; +#endif ds->l_desc.dyn_tree = ds->dyn_ltree; ds->d_desc.dyn_tree = ds->dyn_dtree; diff --git a/deps/zlib/deflate.h b/deps/zlib/deflate.h index f164191106922d..eb7f0724015cc7 100644 --- a/deps/zlib/deflate.h +++ b/deps/zlib/deflate.h @@ -23,6 +23,10 @@ # define GZIP #endif +/* define LIT_MEM to slightly increase the speed of deflate (order 1% to 2%) at + the cost of a larger memory footprint */ +#define LIT_MEM + /* =========================================================================== * Internal compression state. */ @@ -217,7 +221,12 @@ typedef struct internal_state { /* Depth of each subtree used as tie breaker for trees of equal frequency */ +#ifdef LIT_MEM + ushf *d_buf; /* buffer for distances */ + uchf *l_buf; /* buffer for literals/lengths */ +#else uchf *sym_buf; /* buffer for distances and literals/lengths */ +#endif uInt lit_bufsize; /* Size of match buffer for literals/lengths. There are 4 reasons for @@ -239,7 +248,7 @@ typedef struct internal_state { * - I can't count above 4 */ - uInt sym_next; /* running index in sym_buf */ + uInt sym_next; /* running index in symbol buffer */ uInt sym_end; /* symbol table full when sym_next reaches this */ ulg opt_len; /* bit length of current block with optimal trees */ @@ -323,6 +332,25 @@ void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf, extern const uch ZLIB_INTERNAL _dist_code[]; #endif +#ifdef LIT_MEM +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->sym_next] = 0; \ + s->l_buf[s->sym_next++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->sym_next == s->sym_end); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (uch)(length); \ + ush dist = (ush)(distance); \ + s->d_buf[s->sym_next] = dist; \ + s->l_buf[s->sym_next++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->sym_next == s->sym_end); \ + } +#else # define _tr_tally_lit(s, c, flush) \ { uch cc = (c); \ s->sym_buf[s->sym_next++] = 0; \ @@ -342,6 +370,7 @@ void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf, s->dyn_dtree[d_code(dist)].Freq++; \ flush = (s->sym_next == s->sym_end); \ } +#endif #else # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) # define _tr_tally_dist(s, distance, length, flush) \ diff --git a/deps/zlib/google/compression_utils.cc b/deps/zlib/google/compression_utils.cc index 279ea0732980c3..c2b17e4ced6f22 100644 --- a/deps/zlib/google/compression_utils.cc +++ b/deps/zlib/google/compression_utils.cc @@ -4,7 +4,6 @@ #include "third_party/zlib/google/compression_utils.h" -#include "base/bit_cast.h" #include "base/check_op.h" #include "base/process/memory.h" #include "base/sys_byteorder.h" @@ -24,8 +23,8 @@ bool GzipCompress(base::span input, // uLongf can be larger than size_t. uLongf compressed_size_long = static_cast(output_buffer_size); if (zlib_internal::GzipCompressHelper( - base::bit_cast(output_buffer), &compressed_size_long, - base::bit_cast(input.data()), + reinterpret_cast(output_buffer), &compressed_size_long, + reinterpret_cast(input.data()), static_cast(input.size()), malloc_fn, free_fn) != Z_OK) { return false; } @@ -55,7 +54,7 @@ bool GzipCompress(base::span input, std::string* output) { if (zlib_internal::GzipCompressHelper( compressed_data, &compressed_data_size, - base::bit_cast(input.data()), input_size, nullptr, + reinterpret_cast(input.data()), input_size, nullptr, nullptr) != Z_OK) { free(compressed_data); return false; @@ -82,8 +81,8 @@ bool GzipUncompress(const std::string& input, std::string* output) { uncompressed_output.resize(uncompressed_size); if (zlib_internal::GzipUncompressHelper( - base::bit_cast(uncompressed_output.data()), - &uncompressed_size, base::bit_cast(input.data()), + reinterpret_cast(uncompressed_output.data()), + &uncompressed_size, reinterpret_cast(input.data()), static_cast(input.length())) == Z_OK) { output->swap(uncompressed_output); return true; @@ -102,8 +101,8 @@ bool GzipUncompress(base::span input, if (uncompressed_size > output.size()) return false; return zlib_internal::GzipUncompressHelper( - base::bit_cast(output.data()), &uncompressed_size, - base::bit_cast(input.data()), + reinterpret_cast(const_cast(output.data())), + &uncompressed_size, reinterpret_cast(input.data()), static_cast(input.size())) == Z_OK; } @@ -117,8 +116,8 @@ bool GzipUncompress(base::span input, std::string* output) { uLongf uncompressed_size = GetUncompressedSize(input); output->resize(uncompressed_size); return zlib_internal::GzipUncompressHelper( - base::bit_cast(output->data()), &uncompressed_size, - base::bit_cast(input.data()), + reinterpret_cast(output->data()), &uncompressed_size, + reinterpret_cast(input.data()), static_cast(input.size())) == Z_OK; } @@ -128,7 +127,8 @@ uint32_t GetUncompressedSize(base::span compressed_data) { uint32_t GetUncompressedSize(base::span compressed_data) { return zlib_internal::GetGzipUncompressedSize( - base::bit_cast(compressed_data.data()), compressed_data.size()); + reinterpret_cast(compressed_data.data()), + compressed_data.size()); } } // namespace compression diff --git a/deps/zlib/google/zip_reader_unittest.cc b/deps/zlib/google/zip_reader_unittest.cc index 6086c97c49b622..8ef0274e112483 100644 --- a/deps/zlib/google/zip_reader_unittest.cc +++ b/deps/zlib/google/zip_reader_unittest.cc @@ -157,7 +157,7 @@ class ZipReaderTest : public PlatformTest { static base::FilePath GetTestDataDirectory() { base::FilePath path; - CHECK(base::PathService::Get(base::DIR_SOURCE_ROOT, &path)); + CHECK(base::PathService::Get(base::DIR_SRC_TEST_DATA_ROOT, &path)); return path.AppendASCII("third_party") .AppendASCII("zlib") .AppendASCII("google") diff --git a/deps/zlib/google/zip_unittest.cc b/deps/zlib/google/zip_unittest.cc index d0fc02fd939a15..922d38303ce845 100644 --- a/deps/zlib/google/zip_unittest.cc +++ b/deps/zlib/google/zip_unittest.cc @@ -206,7 +206,7 @@ class VirtualFileSystem : public zip::FileAccessor { info->is_directory = !files_.count(path); info->last_modified = - base::Time::FromDoubleT(172097977); // Some random date. + base::Time::FromSecondsSinceUnixEpoch(172097977); // Some random date. return true; } @@ -256,7 +256,7 @@ class ZipTest : public PlatformTest { static base::FilePath GetDataDirectory() { base::FilePath path; - bool success = base::PathService::Get(base::DIR_SOURCE_ROOT, &path); + bool success = base::PathService::Get(base::DIR_SRC_TEST_DATA_ROOT, &path); EXPECT_TRUE(success); return std::move(path) .AppendASCII("third_party") diff --git a/deps/zlib/gzguts.h b/deps/zlib/gzguts.h index e23f831f531bb1..f9375047e8c58f 100644 --- a/deps/zlib/gzguts.h +++ b/deps/zlib/gzguts.h @@ -7,9 +7,8 @@ # ifndef _LARGEFILE_SOURCE # define _LARGEFILE_SOURCE 1 # endif -# ifdef _FILE_OFFSET_BITS -# undef _FILE_OFFSET_BITS -# endif +# undef _FILE_OFFSET_BITS +# undef _TIME_BITS #endif #ifdef HAVE_HIDDEN diff --git a/deps/zlib/gzlib.c b/deps/zlib/gzlib.c index 9810e3553e0263..0d3ebf8d297e57 100644 --- a/deps/zlib/gzlib.c +++ b/deps/zlib/gzlib.c @@ -311,8 +311,8 @@ int ZEXPORT gzbuffer(gzFile file, unsigned size) { /* check and set requested size */ if ((size << 1) < size) return -1; /* need to be able to double it */ - if (size < 2) - size = 2; /* need two bytes to check magic header */ + if (size < 8) + size = 8; /* needed to behave well with flushing */ state->want = size; return 0; } diff --git a/deps/zlib/inflate.c b/deps/zlib/inflate.c index 5abbd07464ab64..0990ae7bf9a8d2 100644 --- a/deps/zlib/inflate.c +++ b/deps/zlib/inflate.c @@ -1389,7 +1389,7 @@ int ZEXPORT inflateSync(z_streamp strm) { /* if first time, start search in bit buffer */ if (state->mode != SYNC) { state->mode = SYNC; - state->hold <<= state->bits & 7; + state->hold >>= state->bits & 7; state->bits -= state->bits & 7; len = 0; while (state->bits >= 8) { diff --git a/deps/zlib/inftrees.c b/deps/zlib/inftrees.c index afc4c4212d8022..73d5a776987ce1 100644 --- a/deps/zlib/inftrees.c +++ b/deps/zlib/inftrees.c @@ -1,5 +1,5 @@ /* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2022 Mark Adler + * Copyright (C) 1995-2023 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,7 +9,7 @@ #define MAXBITS 15 const char inflate_copyright[] = - " inflate 1.2.13.1 Copyright 1995-2022 Mark Adler "; + " inflate 1.3.0.1 Copyright 1995-2023 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -57,7 +57,7 @@ int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 76}; + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 70, 200}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, diff --git a/deps/zlib/trees.c b/deps/zlib/trees.c index 8dbdc40bacce1d..38135273c9c3bc 100644 --- a/deps/zlib/trees.c +++ b/deps/zlib/trees.c @@ -899,14 +899,19 @@ local void compress_block(deflate_state *s, const ct_data *ltree, const ct_data *dtree) { unsigned dist; /* distance of matched string */ int lc; /* match length or unmatched char (if dist == 0) */ - unsigned sx = 0; /* running index in sym_buf */ + unsigned sx = 0; /* running index in symbol buffers */ unsigned code; /* the code to send */ int extra; /* number of extra bits to send */ if (s->sym_next != 0) do { +#ifdef LIT_MEM + dist = s->d_buf[sx]; + lc = s->l_buf[sx++]; +#else dist = s->sym_buf[sx++] & 0xff; dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8; lc = s->sym_buf[sx++]; +#endif if (dist == 0) { send_code(s, lc, ltree); /* send a literal byte */ Tracecv(isgraph(lc), (stderr," '%c' ", lc)); @@ -931,8 +936,13 @@ local void compress_block(deflate_state *s, const ct_data *ltree, } } /* literal or match pair ? */ - /* Check that the overlay between pending_buf and sym_buf is ok: */ + /* Check for no overlay of pending_buf on needed symbols */ +#ifdef LIT_MEM + Assert(s->pending < (s->lit_bufsize << 1) + (sx << 1), + "pendingBuf overflow"); +#else Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); +#endif } while (sx < s->sym_next); @@ -1082,9 +1092,14 @@ void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, charf *buf, * the current block must be flushed. */ int ZLIB_INTERNAL _tr_tally(deflate_state *s, unsigned dist, unsigned lc) { +#ifdef LIT_MEM + s->d_buf[s->sym_next] = (ush)dist; + s->l_buf[s->sym_next++] = (uch)lc; +#else s->sym_buf[s->sym_next++] = (uch)dist; s->sym_buf[s->sym_next++] = (uch)(dist >> 8); s->sym_buf[s->sym_next++] = (uch)lc; +#endif if (dist == 0) { /* lc is the unmatched char */ s->dyn_ltree[lc].Freq++; diff --git a/deps/zlib/zlib.3 b/deps/zlib/zlib.3 index e733b5ab65c642..adc5b7f03e8c95 100644 --- a/deps/zlib/zlib.3 +++ b/deps/zlib/zlib.3 @@ -1,4 +1,4 @@ -.TH ZLIB 3 "xx Oct 2022" +.TH ZLIB 3 "xx Aug 2023" .SH NAME zlib \- compression/decompression library .SH SYNOPSIS @@ -105,7 +105,7 @@ before asking for help. Send questions and/or comments to zlib@gzip.org, or (for the Windows DLL version) to Gilles Vollant (info@winimage.com). .SH AUTHORS AND LICENSE -Version 1.2.13.1 +Version 1.2.3.0.1 .LP Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler .LP diff --git a/deps/zlib/zlib.h b/deps/zlib/zlib.h index 014331fc8dc33f..f1b149b93e4346 100644 --- a/deps/zlib/zlib.h +++ b/deps/zlib/zlib.h @@ -1,7 +1,7 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.13.1, October xxth, 2022 + version 1.3.0.1, August xxth, 2023 - Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler + Copyright (C) 1995-2023 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -37,11 +37,11 @@ extern "C" { #endif -#define ZLIB_VERSION "1.2.13.1-motley" -#define ZLIB_VERNUM 0x12d1 +#define ZLIB_VERSION "1.3.0.1-motley" +#define ZLIB_VERNUM 0x1301 #define ZLIB_VER_MAJOR 1 -#define ZLIB_VER_MINOR 2 -#define ZLIB_VER_REVISION 13 +#define ZLIB_VER_MINOR 3 +#define ZLIB_VER_REVISION 0 #define ZLIB_VER_SUBREVISION 1 /* @@ -230,7 +230,7 @@ ZEXTERN int ZEXPORT deflateInit(z_streamp strm, int level); Initializes the internal stream state for compression. The fields zalloc, zfree and opaque must be initialized before by the caller. If zalloc and zfree are set to Z_NULL, deflateInit updates them to use default - allocation functions. + allocation functions. total_in, total_out, adler, and msg are initialized. The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: 1 gives best speed, 9 gives best compression, 0 gives no compression at all @@ -320,8 +320,8 @@ ZEXTERN int ZEXPORT deflate(z_streamp strm, int flush); with the same value of the flush parameter and more output space (updated avail_out), until the flush is complete (deflate returns with non-zero avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that - avail_out is greater than six to avoid repeated flush markers due to - avail_out == 0 on return. + avail_out is greater than six when the flush marker begins, in order to avoid + repeated flush markers upon calling deflate() again when avail_out == 0. If the parameter flush is set to Z_FINISH, pending input is processed, pending output is flushed and deflate returns with Z_STREAM_END if there was @@ -382,7 +382,8 @@ ZEXTERN int ZEXPORT inflateInit(z_streamp strm); read or consumed. The allocation of a sliding window will be deferred to the first call of inflate (if the decompression does not complete on the first call). If zalloc and zfree are set to Z_NULL, inflateInit updates - them to use default allocation functions. + them to use default allocation functions. total_in, total_out, adler, and + msg are initialized. inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the @@ -695,7 +696,7 @@ ZEXTERN int ZEXPORT deflateReset(z_streamp strm); This function is equivalent to deflateEnd followed by deflateInit, but does not free and reallocate the internal compression state. The stream will leave the compression level and any other attributes that may have been - set unchanged. + set unchanged. total_in, total_out, adler, and msg are initialized. deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL). @@ -820,8 +821,9 @@ ZEXTERN int ZEXPORT deflateSetHeader(z_streamp strm, gzip file" and give up. If deflateSetHeader is not used, the default gzip header has text false, - the time set to zero, and os set to 255, with no extra, name, or comment - fields. The gzip header is returned to the default state by deflateReset(). + the time set to zero, and os set to the current operating system, with no + extra, name, or comment fields. The gzip header is returned to the default + state by deflateReset(). deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. @@ -960,6 +962,7 @@ ZEXTERN int ZEXPORT inflateReset(z_streamp strm); This function is equivalent to inflateEnd followed by inflateInit, but does not free and reallocate the internal decompression state. The stream will keep attributes that may have been set by inflateInit2. + total_in, total_out, adler, and msg are initialized. inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL). diff --git a/doc/abi_version_registry.json b/doc/abi_version_registry.json index bf36dc3acc2874..2dc7511694859d 100644 --- a/doc/abi_version_registry.json +++ b/doc/abi_version_registry.json @@ -1,6 +1,7 @@ { "NODE_MODULE_VERSION": [ - { "modules": 120,"runtime": "node", "variant": "v8_11.8", "versions": "21.0.0-pre" }, + { "modules": 121,"runtime": "electron", "variant": "electron", "versions": "29" }, + { "modules": 120,"runtime": "node", "variant": "v8_11.8", "versions": "21.0.0" }, { "modules": 119,"runtime": "electron", "variant": "electron", "versions": "28" }, { "modules": 118,"runtime": "electron", "variant": "electron", "versions": "27" }, { "modules": 117,"runtime": "electron", "variant": "electron", "versions": "26" }, diff --git a/doc/api/buffer.md b/doc/api/buffer.md index 3a46599649d025..7bb7d42454fad6 100644 --- a/doc/api/buffer.md +++ b/doc/api/buffer.md @@ -808,8 +808,8 @@ A `TypeError` will be thrown if `size` is not a number. The `Buffer` module pre-allocates an internal `Buffer` instance of size [`Buffer.poolSize`][] that is used as a pool for the fast allocation of new `Buffer` instances created using [`Buffer.allocUnsafe()`][], [`Buffer.from(array)`][], -and [`Buffer.concat()`][] only when `size` is less than or equal to -`Buffer.poolSize >> 1` (floor of [`Buffer.poolSize`][] divided by two). +and [`Buffer.concat()`][] only when `size` is less than +`Buffer.poolSize >>> 1` (floor of [`Buffer.poolSize`][] divided by two). Use of this pre-allocated internal memory pool is a key difference between calling `Buffer.alloc(size, fill)` vs. `Buffer.allocUnsafe(size).fill(fill)`. diff --git a/doc/api/cli.md b/doc/api/cli.md index a92ede78f8af23..072b3b8ead55b8 100644 --- a/doc/api/cli.md +++ b/doc/api/cli.md @@ -103,6 +103,47 @@ If this flag is passed, the behavior can still be set to not abort through [`process.setUncaughtExceptionCaptureCallback()`][] (and through usage of the `node:domain` module that uses it). +### `--allow-addons` + + + +> Stability: 1.1 - Active development + +When using the [Permission Model][], the process will not be able to use +native addons by default. +Attempts to do so will throw an `ERR_DLOPEN_DISABLED` unless the +user explicitly passes the `--allow-addons` flag when starting Node.js. + +Example: + +```cjs +// Attempt to require an native addon +require('nodejs-addon-example'); +``` + +```console +$ node --experimental-permission --allow-fs-read=* index.js +node:internal/modules/cjs/loader:1319 + return process.dlopen(module, path.toNamespacedPath(filename)); + ^ + +Error: Cannot load native addon because loading addons is disabled. + at Module._extensions..node (node:internal/modules/cjs/loader:1319:18) + at Module.load (node:internal/modules/cjs/loader:1091:32) + at Module._load (node:internal/modules/cjs/loader:938:12) + at Module.require (node:internal/modules/cjs/loader:1115:19) + at require (node:internal/modules/helpers:130:18) + at Object. (/home/index.js:1:15) + at Module._compile (node:internal/modules/cjs/loader:1233:14) + at Module._extensions..js (node:internal/modules/cjs/loader:1287:10) + at Module.load (node:internal/modules/cjs/loader:1091:32) + at Module._load (node:internal/modules/cjs/loader:938:12) { + code: 'ERR_DLOPEN_DISABLED' +} +``` + ### `--allow-child-process` + +> Stability: 1 - Experimental + +Specifies the path to a JSON configuration file which configures snapshot +creation behavior. + +The following options are currently supported: + +* `builder` {string} Required. Provides the name to the script that is executed + before building the snapshot, as if [`--build-snapshot`][] had been passed + with `builder` as the main script name. +* `withoutCodeCache` {boolean} Optional. Including the code cache reduces the + time spent on compiling functions included in the snapshot at the expense + of a bigger snapshot size and potentially breaking portability of the + snapshot. + +When using this flag, additional script files provided on the command line will +not be executed and instead be interpreted as regular command line arguments. + ### `-c`, `--check` + +Disable specific process warnings by `code` or `type`. + +Warnings emitted from [`process.emitWarning()`][emit_warning] may contain a +`code` and a `type`. This option will not-emit warnings that have a matching +`code` or `type`. + +List of [deprecation warnings][]. + +The Node.js core warning types are: `DeprecationWarning` and +`ExperimentalWarning` + +For example, the following script will not emit +[DEP0025 `require('node:sys')`][DEP0025 warning] when executed with +`node --disable-warning=DEP0025`: + +```mjs +import sys from 'node:sys'; +``` + +```cjs +const sys = require('node:sys'); +``` + +For example, the following script will emit the +[DEP0025 `require('node:sys')`][DEP0025 warning], but not any Experimental +Warnings (such as +[ExperimentalWarning: `vm.measureMemory` is an experimental feature][] +in <=v21) when executed with `node --disable-warning=ExperimentalWarnings`: + +```mjs +import sys from 'node:sys'; +import vm from 'node:vm'; + +vm.measureMemory(); +``` + +```cjs +const sys = require('node:sys'); +const vm = require('node:vm'); + +vm.measureMemory(); +``` + ### `--disable-proto=mode` > Stability: 1.0 - Early development @@ -620,6 +749,33 @@ files with no extension will be treated as WebAssembly if they begin with the WebAssembly magic number (`\0asm`); otherwise they will be treated as ES module JavaScript. +### `--experimental-detect-module` + + + +> Stability: 1.0 - Early development + +Node.js will inspect the source code of ambiguous input to determine whether it +contains ES module syntax; if such syntax is detected, the input will be treated +as an ES module. + +Ambiguous input is defined as: + +* Files with a `.js` extension or no extension; and either no controlling + `package.json` file or one that lacks a `type` field; and + `--experimental-default-type` is not specified. +* String input (`--eval` or STDIN) when neither `--input-type` nor + `--experimental-default-type` are specified. + +ES module syntax is defined as syntax that would throw when evaluated as +CommonJS. This includes `import` and `export` statements and `import.meta` +references. It does _not_ include `import()` expressions, which are valid in +CommonJS. + ### `--experimental-import-meta-resolve` Enable experimental [`WebSocket`][] support. @@ -981,7 +1141,9 @@ added: > Stability: 1 - Experimental -Preload the specified module at startup. +Preload the specified module at startup. If the flag is provided several times, +each module will be executed sequentially in the order they appear, starting +with the ones provided in [`NODE_OPTIONS`][]. Follows [ECMAScript module][] resolution rules. Use [`--require`][] to load a [CommonJS module][]. @@ -993,12 +1155,13 @@ Modules preloaded with `--require` will run before modules preloaded with `--imp added: v12.0.0 --> -This configures Node.js to interpret string input as CommonJS or as an ES -module. String input is input via `--eval`, `--print`, or `STDIN`. - -Valid values are `"commonjs"` and `"module"`. The default is `"commonjs"`. +This configures Node.js to interpret `--eval` or `STDIN` input as CommonJS or +as an ES module. Valid values are `"commonjs"` or `"module"`. The default is +`"commonjs"` unless [`--experimental-default-type=module`][] is used. -The REPL does not support this option. +The REPL does not support this option. Usage of `--input-type=module` with +[`--print`][] will throw an error, as `--print` does not support ES module +syntax. ### `--insecure-http-parser` @@ -1103,13 +1266,13 @@ Opens the REPL even if stdin does not appear to be a terminal. added: v12.0.0 --> +> Stability: 1 - Experimental. This flag is inherited from V8 and is subject to +> change upstream. + Disable [runtime allocation of executable memory][jitless]. This may be required on some platforms for security reasons. It can also reduce attack surface on other platforms, but the performance impact may be severe. -This flag is inherited from V8 and is subject to change upstream. It may -disappear in a non-semver-major release. - ### `--max-http-header-size=size` + +> Stability: 1 - Experimental + +Disable exposition of [Navigator API][] on the global scope. + ### `--no-experimental-global-webcrypto` The maximum number of test files that the test runner CLI will execute @@ -1725,7 +1901,9 @@ The destination for the corresponding test reporter. See the documentation on ### `--test-shard` Test suite shard to execute in a format of `/`, where @@ -1743,6 +1921,15 @@ node --test --test-shard=2/3 node --test --test-shard=3/3 ``` +### `--test-timeout` + + + +A number of milliseconds the test execution will fail after. If unspecified, +subtests inherit this value from their parent. The default value is `Infinity`. + ### `--throw-deprecation` +* `--allow-addons` * `--allow-child-process` * `--allow-fs-read` * `--allow-fs-write` @@ -2280,12 +2468,14 @@ Node.js options that are allowed are: * `--conditions`, `-C` * `--diagnostic-dir` * `--disable-proto` +* `--disable-warning` * `--dns-result-order` * `--enable-fips` * `--enable-network-family-autoselection` * `--enable-source-maps` * `--experimental-abortcontroller` * `--experimental-default-type` +* `--experimental-detect-module` * `--experimental-import-meta-resolve` * `--experimental-json-modules` * `--experimental-loader` @@ -2321,6 +2511,7 @@ Node.js options that are allowed are: * `--no-deprecation` * `--no-experimental-fetch` * `--no-experimental-global-customevent` +* `--no-experimental-global-navigator` * `--no-experimental-global-webcrypto` * `--no-experimental-repl-await` * `--no-extra-info-on-fatal-exception` @@ -2730,12 +2921,15 @@ done [CommonJS]: modules.md [CommonJS module]: modules.md [CustomEvent Web API]: https://dom.spec.whatwg.org/#customevent +[DEP0025 warning]: deprecations.md#dep0025-requirenodesys [ECMAScript module]: esm.md#modules-ecmascript-modules +[ExperimentalWarning: `vm.measureMemory` is an experimental feature]: vm.md#vmmeasurememoryoptions [Fetch API]: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API [File System Permissions]: permissions.md#file-system-permissions [Module customization hooks]: module.md#customization-hooks [Module customization hooks: enabling]: module.md#enabling [Modules loaders]: packages.md#modules-loaders +[Navigator API]: globals.md#navigator [Node.js issue tracker]: https://github.com/nodejs/node/issues [OSSL_PROVIDER-legacy]: https://www.openssl.org/docs/man3.0/man7/OSSL_PROVIDER-legacy.html [Permission Model]: permissions.md#permission-model @@ -2751,6 +2945,7 @@ done [`--allow-fs-read`]: #--allow-fs-read [`--allow-fs-write`]: #--allow-fs-write [`--allow-worker`]: #--allow-worker +[`--build-snapshot`]: #--build-snapshot [`--cpu-prof-dir`]: #--cpu-prof-dir [`--diagnostic-dir`]: #--diagnostic-dirdirectory [`--experimental-default-type=module`]: #--experimental-default-typetype @@ -2760,6 +2955,7 @@ done [`--import`]: #--importmodule [`--openssl-config`]: #--openssl-configfile [`--preserve-symlinks`]: #--preserve-symlinks +[`--print`]: #-p---print-script [`--redirect-warnings`]: #--redirect-warningsfile [`--require`]: #-r---require-module [`Atomics.wait()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/wait @@ -2785,6 +2981,7 @@ done [context-aware]: addons.md#context-aware-addons [debugger]: debugger.md [debugging security implications]: https://nodejs.org/en/docs/guides/debugging-getting-started/#security-implications +[deprecation warnings]: deprecations.md#list-of-deprecated-apis [emit_warning]: process.md#processemitwarningwarning-options [environment_variables]: #environment-variables [filtering tests by name]: test.md#filtering-tests-by-name diff --git a/doc/api/console.md b/doc/api/console.md index 1818d6f776b9f5..c9812f055974dc 100644 --- a/doc/api/console.md +++ b/doc/api/console.md @@ -420,18 +420,18 @@ console.table(undefined); console.table([{ a: 1, b: 'Y' }, { a: 'Z', b: 2 }]); // ┌─────────┬─────┬─────┐ -// │ (index) │ a │ b │ +// │ (index) │ a │ b │ // ├─────────┼─────┼─────┤ -// │ 0 │ 1 │ 'Y' │ -// │ 1 │ 'Z' │ 2 │ +// │ 0 │ 1 │ 'Y' │ +// │ 1 │ 'Z' │ 2 │ // └─────────┴─────┴─────┘ console.table([{ a: 1, b: 'Y' }, { a: 'Z', b: 2 }], ['a']); // ┌─────────┬─────┐ -// │ (index) │ a │ +// │ (index) │ a │ // ├─────────┼─────┤ -// │ 0 │ 1 │ -// │ 1 │ 'Z' │ +// │ 0 │ 1 │ +// │ 1 │ 'Z' │ // └─────────┴─────┘ ``` diff --git a/doc/api/crypto.md b/doc/api/crypto.md index 194f3cb9bb1024..deb85404249700 100644 --- a/doc/api/crypto.md +++ b/doc/api/crypto.md @@ -42,7 +42,7 @@ calling `require('node:crypto')` will result in an error being thrown. When using CommonJS, the error thrown can be caught using try/catch: - + ```cjs let crypto; @@ -53,6 +53,8 @@ try { } ``` + + When using the lexical ESM `import` keyword, the error can only be caught if a handler for `process.on('uncaughtException')` is registered _before_ any attempt to load the module is made (using, for instance, @@ -317,7 +319,7 @@ used in one of two ways: * Using the [`cipher.update()`][] and [`cipher.final()`][] methods to produce the encrypted data. -The [`crypto.createCipher()`][] or [`crypto.createCipheriv()`][] methods are +The [`crypto.createCipheriv()`][] method is used to create `Cipher` instances. `Cipher` objects are not to be created directly using the `new` keyword. @@ -649,7 +651,7 @@ used in one of two ways: * Using the [`decipher.update()`][] and [`decipher.final()`][] methods to produce the unencrypted data. -The [`crypto.createDecipher()`][] or [`crypto.createDecipheriv()`][] methods are +The [`crypto.createDecipheriv()`][] method is used to create `Decipher` instances. `Decipher` objects are not to be created directly using the `new` keyword. @@ -2722,7 +2724,7 @@ added: v15.9.0 The issuer certificate or `undefined` if the issuer certificate is not available. -### `x509.keyUsage` +### `x509.extKeyUsage` - -> Stability: 0 - Deprecated: Use [`crypto.createCipheriv()`][] instead. - -* `algorithm` {string} -* `password` {string|ArrayBuffer|Buffer|TypedArray|DataView} -* `options` {Object} [`stream.transform` options][] -* Returns: {Cipher} - -Creates and returns a `Cipher` object that uses the given `algorithm` and -`password`. - -The `options` argument controls stream behavior and is optional except when a -cipher in CCM or OCB mode (e.g. `'aes-128-ccm'`) is used. In that case, the -`authTagLength` option is required and specifies the length of the -authentication tag in bytes, see [CCM mode][]. In GCM mode, the `authTagLength` -option is not required but can be used to set the length of the authentication -tag that will be returned by `getAuthTag()` and defaults to 16 bytes. -For `chacha20-poly1305`, the `authTagLength` option defaults to 16 bytes. - -The `algorithm` is dependent on OpenSSL, examples are `'aes192'`, etc. On -recent OpenSSL releases, `openssl list -cipher-algorithms` will -display the available cipher algorithms. - -The `password` is used to derive the cipher key and initialization vector (IV). -The value must be either a `'latin1'` encoded string, a [`Buffer`][], a -`TypedArray`, or a `DataView`. - -This function is semantically insecure for all -supported ciphers and fatally flawed for ciphers in counter mode (such as CTR, -GCM, or CCM). - -The implementation of `crypto.createCipher()` derives keys using the OpenSSL -function [`EVP_BytesToKey`][] with the digest algorithm set to MD5, one -iteration, and no salt. The lack of salt allows dictionary attacks as the same -password always creates the same key. The low iteration count and -non-cryptographically secure hash algorithm allow passwords to be tested very -rapidly. - -In line with OpenSSL's recommendation to use a more modern algorithm instead of -[`EVP_BytesToKey`][] it is recommended that developers derive a key and IV on -their own using [`crypto.scrypt()`][] and to use [`crypto.createCipheriv()`][] -to create the `Cipher` object. Users should not use ciphers with counter mode -(e.g. CTR, GCM, or CCM) in `crypto.createCipher()`. A warning is emitted when -they are used in order to avoid the risk of IV reuse that causes -vulnerabilities. For the case when IV is reused in GCM, see [Nonce-Disrespecting -Adversaries][] for details. - ### `crypto.createCipheriv(algorithm, key, iv[, options])` - -> Stability: 0 - Deprecated: Use [`crypto.createDecipheriv()`][] instead. - -* `algorithm` {string} -* `password` {string|ArrayBuffer|Buffer|TypedArray|DataView} -* `options` {Object} [`stream.transform` options][] -* Returns: {Decipher} - -Creates and returns a `Decipher` object that uses the given `algorithm` and -`password` (key). - -The `options` argument controls stream behavior and is optional except when a -cipher in CCM or OCB mode (e.g. `'aes-128-ccm'`) is used. In that case, the -`authTagLength` option is required and specifies the length of the -authentication tag in bytes, see [CCM mode][]. -For `chacha20-poly1305`, the `authTagLength` option defaults to 16 bytes. - -This function is semantically insecure for all -supported ciphers and fatally flawed for ciphers in counter mode (such as CTR, -GCM, or CCM). - -The implementation of `crypto.createDecipher()` derives keys using the OpenSSL -function [`EVP_BytesToKey`][] with the digest algorithm set to MD5, one -iteration, and no salt. The lack of salt allows dictionary attacks as the same -password always creates the same key. The low iteration count and -non-cryptographically secure hash algorithm allow passwords to be tested very -rapidly. - -In line with OpenSSL's recommendation to use a more modern algorithm instead of -[`EVP_BytesToKey`][] it is recommended that developers derive a key and IV on -their own using [`crypto.scrypt()`][] and to use [`crypto.createDecipheriv()`][] -to create the `Decipher` object. - ### `crypto.createDecipheriv(algorithm, key, iv[, options])` -Type: Runtime (supports [`--pending-deprecation`][]) +Type: Application (non-`node_modules` code only) The `Buffer()` function and `new Buffer()` constructor are deprecated due to API usability issues that can lead to accidental security issues. @@ -872,7 +880,7 @@ The [`require.extensions`][] property is deprecated. -Type: Documentation-only +Type: Runtime The [`util.isArray()`][] API is deprecated. Please use `Array.isArray()` instead. @@ -985,6 +996,9 @@ instead. -Type: Documentation-only +Type: Runtime -The [`util.isBoolean()`][] API is deprecated. +The [`util.isBoolean()`][] API is deprecated. Please use +`typeof arg === 'boolean'` instead. ### DEP0046: `util.isBuffer()` -Type: Documentation-only +Type: Runtime The [`util.isBuffer()`][] API is deprecated. Please use [`Buffer.isBuffer()`][] instead. @@ -1026,6 +1044,9 @@ The [`util.isBuffer()`][] API is deprecated. Please use -Type: Documentation-only +Type: Runtime -The [`util.isDate()`][] API is deprecated. +The [`util.isDate()`][] API is deprecated. Please use +`arg instanceof Date` instead. ### DEP0048: `util.isError()` -Type: Documentation-only +Type: Runtime -The [`util.isError()`][] API is deprecated. +The [`util.isError()`][] API is deprecated. Please use +`Object.prototype.toString(arg) === '[object Error]' || arg instanceof Error` +instead. ### DEP0049: `util.isFunction()` -Type: Documentation-only +Type: Runtime -The [`util.isFunction()`][] API is deprecated. +The [`util.isFunction()`][] API is deprecated. Please use +`typeof arg === 'function'` instead. ### DEP0050: `util.isNull()` -Type: Documentation-only +Type: Runtime -The [`util.isNull()`][] API is deprecated. +The [`util.isNull()`][] API is deprecated. Please use +`arg === null` instead. ### DEP0051: `util.isNullOrUndefined()` -Type: Documentation-only +Type: Runtime -The [`util.isNullOrUndefined()`][] API is deprecated. +The [`util.isNullOrUndefined()`][] API is deprecated. Please use +`arg === null || arg === undefined` instead. ### DEP0052: `util.isNumber()` -Type: Documentation-only +Type: Runtime -The [`util.isNumber()`][] API is deprecated. +The [`util.isNumber()`][] API is deprecated. Please use +`typeof arg === 'number'` instead. ### DEP0053: `util.isObject()` -Type: Documentation-only +Type: Runtime -The [`util.isObject()`][] API is deprecated. +The [`util.isObject()`][] API is deprecated. Please use +`arg && typeof arg === 'object'` instead. ### DEP0054: `util.isPrimitive()` -Type: Documentation-only +Type: Runtime -The [`util.isPrimitive()`][] API is deprecated. +The [`util.isPrimitive()`][] API is deprecated. Please use +`arg === null || (typeof arg !=='object' && typeof arg !== 'function')` +instead. ### DEP0055: `util.isRegExp()` -Type: Documentation-only +Type: Runtime -The [`util.isRegExp()`][] API is deprecated. +The [`util.isRegExp()`][] API is deprecated. Please use +`arg instanceof RegExp` instead. ### DEP0056: `util.isString()` -Type: Documentation-only +Type: Runtime -The [`util.isString()`][] API is deprecated. +The [`util.isString()`][] API is deprecated. Please use +`typeof arg === 'string'` instead. ### DEP0057: `util.isSymbol()` -Type: Documentation-only +Type: Runtime -The [`util.isSymbol()`][] API is deprecated. +The [`util.isSymbol()`][] API is deprecated. Please use +`typeof arg === 'symbol'` instead. ### DEP0058: `util.isUndefined()` -Type: Documentation-only +Type: Runtime -The [`util.isUndefined()`][] API is deprecated. +The [`util.isUndefined()`][] API is deprecated. Please use +`arg === undefined` instead. ### DEP0059: `util.log()` -Type: Documentation-only +Type: Runtime + +The [`util.log()`][] API has been deprecated because it's an unmaintained +legacy API that was exposed to user land by accident. Instead, +consider the following alternatives based on your specific needs: + +* **Third-Party Logging Libraries** + +* **Use `console.log(new Date().toLocaleString(), message)`** -The [`util.log()`][] API is deprecated. +By adopting one of these alternatives, you can transition away from `util.log()` +and choose a logging strategy that aligns with the specific +requirements and complexity of your application. ### DEP0060: `util._extend()` -Type: Documentation-only +Type: Runtime -The [`util._extend()`][] API is deprecated. +The [`util._extend()`][] API is deprecated because it's an unmaintained +legacy API that was exposed to user land by accident. +Please use `target = Object.assign(target, source)` instead. ### DEP0061: `fs.SyncWriteStream` @@ -2111,6 +2197,9 @@ Type: End-of-Life -Type: Runtime +Type: End-of-Life -Using [`crypto.createCipher()`][] and [`crypto.createDecipher()`][] must be -avoided as they use a weak key derivation function (MD5 with no salt) and static -initialization vectors. It is recommended to derive a key using +`crypto.createCipher()` and `crypto.createDecipher()` have been removed +as they use a weak key derivation function (MD5 with no salt) and static +initialization vectors. +It is recommended to derive a key using [`crypto.pbkdf2()`][] or [`crypto.scrypt()`][] with random salts and to use [`crypto.createCipheriv()`][] and [`crypto.createDecipheriv()`][] to obtain the [`Cipher`][] and [`Decipher`][] objects respectively. @@ -3223,6 +3313,9 @@ Values other than `undefined`, `null`, integer numbers, and integer strings -Type: Documentation-only +Type: Runtime -The [`--trace-atomics-wait`][] flag is deprecated. +The [`--trace-atomics-wait`][] flag is deprecated because +it uses the V8 hook `SetAtomicsWaitCallback`, +that will be removed in a future V8 release. ### DEP0166: Double slashes in imports and exports targets @@ -3387,7 +3482,7 @@ Consider using alternatives such as the [`mock`][] helper function. + +Type: Documentation-only + +The [`util.types.isWebAssemblyCompiledModule`][] API is deprecated. Please use +`value instanceof WebAssembly.Module` instead. + +### DEP0178: `dirent.path` + + + +Type: Documentation-only + +The [`dirent.path`][] is deprecated due to its lack of consistency across +release lines. Please use [`dirent.parentPath`][] instead. + +### DEP0179: `Hash` constructor + + + +Type: Documentation-only + +Calling `Hash` class directly with `Hash()` or `new Hash()` is +deprecated due to being internals, not intended for public use. +Please use the [`crypto.createHash()`][] method to create Hash instances. + [NIST SP 800-38D]: https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf [RFC 6066]: https://tools.ietf.org/html/rfc6066#section-3 [RFC 8247 Section 2.4]: https://www.rfc-editor.org/rfc/rfc8247#section-2.4 @@ -3462,10 +3603,9 @@ deprecated. Get them from `fs.constants` or `fs.promises.constants` instead. [`console.error()`]: console.md#consoleerrordata-args [`console.log()`]: console.md#consolelogdata-args [`crypto.Certificate()` constructor]: crypto.md#legacy-api -[`crypto.createCipher()`]: crypto.md#cryptocreatecipheralgorithm-password-options [`crypto.createCipheriv()`]: crypto.md#cryptocreatecipherivalgorithm-key-iv-options -[`crypto.createDecipher()`]: crypto.md#cryptocreatedecipheralgorithm-password-options [`crypto.createDecipheriv()`]: crypto.md#cryptocreatedecipherivalgorithm-key-iv-options +[`crypto.createHash()`]: crypto.md#cryptocreatehashalgorithm-options [`crypto.fips`]: crypto.md#cryptofips [`crypto.pbkdf2()`]: crypto.md#cryptopbkdf2password-salt-iterations-keylen-digest-callback [`crypto.randomBytes()`]: crypto.md#cryptorandombytessize-callback @@ -3474,6 +3614,8 @@ deprecated. Get them from `fs.constants` or `fs.promises.constants` instead. [`decipher.setAuthTag()`]: crypto.md#deciphersetauthtagbuffer-encoding [`diagnostics_channel.subscribe(name, onMessage)`]: diagnostics_channel.md#diagnostics_channelsubscribename-onmessage [`diagnostics_channel.unsubscribe(name, onMessage)`]: diagnostics_channel.md#diagnostics_channelunsubscribename-onmessage +[`dirent.parentPath`]: fs.md#direntparentpath +[`dirent.path`]: fs.md#direntpath [`dns.lookup()`]: dns.md#dnslookuphostname-options-callback [`dnsPromises.lookup()`]: dns.md#dnspromiseslookuphostname-options [`domain`]: domain.md @@ -3571,6 +3713,7 @@ deprecated. Get them from `fs.constants` or `fs.promises.constants` instead. [`util.log()`]: util.md#utillogstring [`util.promisify`]: util.md#utilpromisifyoriginal [`util.toUSVString()`]: util.md#utiltousvstringstring +[`util.types.isWebAssemblyCompiledModule`]: util.md#utiltypesiswebassemblycompiledmodulevalue [`util.types`]: util.md#utiltypes [`util`]: util.md [`worker.exitedAfterDisconnect`]: cluster.md#workerexitedafterdisconnect diff --git a/doc/api/dgram.md b/doc/api/dgram.md index f19e62bc7736bd..65d4a9f678cbd2 100644 --- a/doc/api/dgram.md +++ b/doc/api/dgram.md @@ -904,7 +904,7 @@ to exclude the socket from the reference counting that keeps the Node.js process active, allowing the process to exit even if the socket is still listening. -Calling `socket.unref()` multiple times will have no addition effect. +Calling `socket.unref()` multiple times will have no additional effect. The `socket.unref()` method returns a reference to the socket so calls can be chained. diff --git a/doc/api/diagnostics_channel.md b/doc/api/diagnostics_channel.md index b92ee0b014de02..7b68b3b8d1cf21 100644 --- a/doc/api/diagnostics_channel.md +++ b/doc/api/diagnostics_channel.md @@ -236,6 +236,7 @@ diagnostics_channel.unsubscribe('my-channel', onMessage); > Stability: 1 - Experimental @@ -466,6 +467,7 @@ channel.unsubscribe(onMessage); > Stability: 1 - Experimental @@ -510,6 +512,7 @@ channel.bindStore(store, (data) => { > Stability: 1 - Experimental @@ -549,6 +552,7 @@ channel.unbindStore(store); > Stability: 1 - Experimental @@ -610,6 +614,7 @@ channel.runStores({ some: 'message' }, () => { > Stability: 1 - Experimental @@ -627,6 +632,7 @@ dynamically. > Stability: 1 - Experimental @@ -695,6 +701,7 @@ channels.subscribe({ > Stability: 1 - Experimental @@ -765,6 +772,7 @@ channels.unsubscribe({ > Stability: 1 - Experimental @@ -810,6 +818,7 @@ channels.traceSync(() => { > Stability: 1 - Experimental @@ -853,34 +862,35 @@ channels.tracePromise(async () => { }); ``` -#### `tracingChannel.traceCallback(fn[, position[, context[, thisArg[, ...args]]]])` +#### `tracingChannel.traceCallback(fn, position, context, thisArg, ...args)` > Stability: 1 - Experimental * `fn` {Function} callback using function to wrap a trace around * `position` {number} Zero-indexed argument position of expected callback -* `context` {Object} Shared object to correlate trace events through + (defaults to last argument if `undefined` is passed) +* `context` {Object} Shared object to correlate trace events through (defaults + to `{}` if `undefined` is passed) * `thisArg` {any} The receiver to be used for the function call -* `...args` {any} Optional arguments to pass to the function +* `...args` {any} arguments to pass to the function (must include the callback) * Returns: {any} The return value of the given function -Trace a callback-receiving function call. This will always produce a +Trace a callback-receiving function call. The callback is expected to follow +the error as first arg convention typically used. This will always produce a [`start` event][] and [`end` event][] around the synchronous portion of the function execution, and will produce a [`asyncStart` event][] and [`asyncEnd` event][] around the callback execution. It may also produce an -[`error` event][] if the given function throws an error or the returned -promise rejects. This will run the given function using +[`error` event][] if the given function throws or the first argument passed to +the callback is set. This will run the given function using [`channel.runStores(context, ...)`][] on the `start` channel which ensures all events should have any bound stores set to match this trace context. -The `position` will be -1 by default to indicate the final argument should -be used as the callback. - ```mjs import diagnostics_channel from 'node:diagnostics_channel'; diff --git a/doc/api/errors.md b/doc/api/errors.md index 6051437436a551..dbd64a3f11fb9f 100644 --- a/doc/api/errors.md +++ b/doc/api/errors.md @@ -1710,6 +1710,12 @@ When setting the priority for an HTTP/2 stream, the stream may be marked as a dependency for a parent stream. This error code is used when an attempt is made to mark a stream and dependent of itself. + + +### `ERR_HTTP2_TOO_MANY_CUSTOM_SETTINGS` + +The number of supported custom settings (10) has been exceeded. + ### `ERR_HTTP2_TOO_MANY_INVALID_FRAMES` @@ -1749,49 +1755,38 @@ is set for the `Http2Stream`. An attempt was made to construct an object using a non-public constructor. - + -### `ERR_IMPORT_ASSERTION_TYPE_FAILED` +### `ERR_IMPORT_ATTRIBUTE_TYPE_INCOMPATIBLE` An import `type` attribute was provided, but the specified module is of a different type. - + -### `ERR_IMPORT_ASSERTION_TYPE_MISSING` +### `ERR_IMPORT_ATTRIBUTE_MISSING` An import attribute is missing, preventing the specified module to be imported. - - -### `ERR_IMPORT_ASSERTION_TYPE_UNSUPPORTED` - - - -An import attribute is not supported by this version of Node.js. - ### `ERR_IMPORT_ATTRIBUTE_UNSUPPORTED` An import attribute is not supported by this version of Node.js. @@ -2952,9 +2947,7 @@ signal (such as [`subprocess.kill()`][]). [self-reference a package using its name][] and [define a custom subpath][] in the [`"exports"`][] field of the [`package.json`][] file. - - -```js +```mjs import './'; // unsupported import './index.js'; // supported import 'package-name'; // supported @@ -2981,6 +2974,12 @@ An attempt was made to use something that was already closed. While using the Performance Timing API (`perf_hooks`), no valid performance entry types are found. + + +### `ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING_FLAG` + +A dynamic import callback was invoked without `--experimental-vm-modules`. + ### `ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING` @@ -3293,15 +3292,54 @@ An invalid or unknown file encoding was passed. ### `ERR_INVALID_TRANSFER_OBJECT` An invalid transfer object was passed to `postMessage()`. + + +### `ERR_IMPORT_ASSERTION_TYPE_FAILED` + + + +An import assertion has failed, preventing the specified module to be imported. + + + +### `ERR_IMPORT_ASSERTION_TYPE_MISSING` + + + +An import assertion is missing, preventing the specified module to be imported. + + + +### `ERR_IMPORT_ASSERTION_TYPE_UNSUPPORTED` + + + +An import attribute is not supported by this version of Node.js. + ### `ERR_MISSING_MESSAGE_PORT_IN_TRANSFER_LIST` @@ -3320,9 +3358,9 @@ transferable objects also exist now. diff --git a/doc/api/esm.md b/doc/api/esm.md index 4e09164e2d2390..4ea219f43df0dd 100644 --- a/doc/api/esm.md +++ b/doc/api/esm.md @@ -7,10 +7,14 @@ @@ -247,7 +261,10 @@ added: - v17.1.0 - v16.14.0 changes: - - version: REPLACEME + - version: + - v21.0.0 + - v20.10.0 + - v18.19.0 pr-url: https://github.com/nodejs/node/pull/50140 description: Switch from Import Assertions to Import Attributes. --> @@ -322,6 +339,35 @@ modules it can be used to load ES modules. The `import.meta` meta property is an `Object` that contains the following properties. +### `import.meta.dirname` + + + +> Stability: 1.2 - Release candidate + +* {string} The directory name of the current module. This is the same as the + [`path.dirname()`][] of the [`import.meta.filename`][]. + +> **Caveat**: only present on `file:` modules. + +### `import.meta.filename` + + + +> Stability: 1.2 - Release candidate + +* {string} The full absolute path and filename of the current module, with +* symlinks resolved. +* This is the same as the [`url.fileURLToPath()`][] of the +* [`import.meta.url`][]. + +> **Caveat** only local modules support this property. Modules not using the +> `file:` protocol will not provide it. + ### `import.meta.url` * {string} The absolute `file:` URL of the module. @@ -343,15 +389,21 @@ added: - v13.9.0 - v12.16.2 changes: - - version: v20.6.0 + - version: + - v20.6.0 + - v18.19.0 pr-url: https://github.com/nodejs/node/pull/49028 description: Unflag `import.meta.resolve``, with `parentURL` parameter still flagged. - - version: v20.6.0 + - version: + - v20.6.0 + - v18.19.0 pr-url: https://github.com/nodejs/node/pull/49038 description: This API no longer throws when targeting `file:` URLs that do not map to an existing file on the local FS. - - version: v20.0.0 + - version: + - v20.0.0 + - v18.19.0 pr-url: https://github.com/nodejs/node/pull/44710 description: This API now returns a string synchronously instead of a Promise. - version: @@ -516,7 +568,7 @@ If needed, a `require` function can be constructed within an ES module using These CommonJS variables are not available in ES modules. `__filename` and `__dirname` use cases can be replicated via -[`import.meta.url`][]. +[`import.meta.filename`][] and [`import.meta.dirname`][]. #### No Addon Loading @@ -894,9 +946,9 @@ The resolver can throw the following errors: > 2. If _resolved_ is not **null** or **undefined**, return _resolved_. > 3. Otherwise, if _exports_ is an Object and all keys of _exports_ start with > _"."_, then -> 1. Let _matchKey_ be the string _"./"_ concatenated with _subpath_. +> 1. Assert: _subpath_ begins with _"./"_. > 2. Let _resolved_ be the result of **PACKAGE\_IMPORTS\_EXPORTS\_RESOLVE**( -> _matchKey_, _exports_, _packageURL_, **false**, _conditions_). +> _subpath_, _exports_, _packageURL_, **false**, _conditions_). > 3. If _resolved_ is not **null** or **undefined**, return _resolved_. > 4. Throw a _Package Path Not Exported_ error. @@ -976,7 +1028,7 @@ _isImports_, _conditions_) > Package Target_ error. > 3. Let _resolvedTarget_ be the URL resolution of the concatenation of > _packageURL_ and _target_. -> 4. Assert: _resolvedTarget_ is contained in _packageURL_. +> 4. Assert: _packageURL_ is contained in _resolvedTarget_. > 5. If _patternMatch_ is **null**, then > 1. Return _resolvedTarget_. > 6. If _patternMatch_ split on _"/"_ or _"\\"_ contains any _""_, _"."_, @@ -985,7 +1037,7 @@ _isImports_, _conditions_) > 7. Return the URL resolution of _resolvedTarget_ with every instance of > _"\*"_ replaced with _patternMatch_. > 2. Otherwise, if _target_ is a non-null Object, then -> 1. If _exports_ contains any index property keys, as defined in ECMA-262 +> 1. If _target_ contains any index property keys, as defined in ECMA-262 > [6.1.7 Array Index][], throw an _Invalid Package Configuration_ error. > 2. For each property _p_ of _target_, in object insertion order as, > 1. If _p_ equals _"default"_ or _conditions_ contains an entry for _p_, @@ -1019,18 +1071,33 @@ _isImports_, _conditions_) > 1. Return _"commonjs"_. > 4. If _url_ ends in _".json"_, then > 1. Return _"json"_. -> 5. Let _packageURL_ be the result of **LOOKUP\_PACKAGE\_SCOPE**(_url_). -> 6. Let _pjson_ be the result of **READ\_PACKAGE\_JSON**(_packageURL_). -> 7. If _pjson?.type_ exists and is _"module"_, then -> 1. If _url_ ends in _".js"_ or has no file extension, then -> 1. If `--experimental-wasm-modules` is enabled and the file at _url_ -> contains the header for a WebAssembly module, then -> 1. Return _"wasm"_. -> 2. Otherwise, -> 1. Return _"module"_. -> 2. Return **undefined**. -> 8. Otherwise, -> 1. Return **undefined**. +> 5. If `--experimental-wasm-modules` is enabled and _url_ ends in +> _".wasm"_, then +> 1. Return _"wasm"_. +> 6. Let _packageURL_ be the result of **LOOKUP\_PACKAGE\_SCOPE**(_url_). +> 7. Let _pjson_ be the result of **READ\_PACKAGE\_JSON**(_packageURL_). +> 8. Let _packageType_ be **null**. +> 9. If _pjson?.type_ is _"module"_ or _"commonjs"_, then +> 1. Set _packageType_ to _pjson.type_. +> 10. If _url_ ends in _".js"_, then +> 1. If _packageType_ is not **null**, then +> 1. Return _packageType_. +> 2. If `--experimental-detect-module` is enabled and the source of +> module contains static import or export syntax, then +> 1. Return _"module"_. +> 3. Return _"commonjs"_. +> 11. If _url_ does not have any extension, then +> 1. If _packageType_ is _"module"_ and `--experimental-wasm-modules` is +> enabled and the file at _url_ contains the header for a WebAssembly +> module, then +> 1. Return _"wasm"_. +> 2. If _packageType_ is not **null**, then +> 1. Return _packageType_. +> 3. If `--experimental-detect-module` is enabled and the source of +> module contains static import or export syntax, then +> 1. Return _"module"_. +> 4. Return _"commonjs"_. +> 12. Return **undefined** (will throw during load phase). **LOOKUP\_PACKAGE\_SCOPE**(_url_) @@ -1082,13 +1149,17 @@ resolution for ESM specifiers is [commonjs-extension-resolution-loader][]. [`data:` URLs]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs [`export`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export [`import()`]: #import-expressions +[`import.meta.dirname`]: #importmetadirname +[`import.meta.filename`]: #importmetafilename [`import.meta.resolve`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import.meta/resolve [`import.meta.url`]: #importmetaurl [`import`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import [`module.createRequire()`]: module.md#modulecreaterequirefilename [`module.syncBuiltinESMExports()`]: module.md#modulesyncbuiltinesmexports [`package.json`]: packages.md#nodejs-packagejson-field-definitions +[`path.dirname()`]: path.md#pathdirnamepath [`process.dlopen`]: process.md#processdlopenmodule-filename-flags +[`url.fileURLToPath()`]: url.md#urlfileurltopathurl [cjs-module-lexer]: https://github.com/nodejs/cjs-module-lexer/tree/1.2.2 [commonjs-extension-resolution-loader]: https://github.com/nodejs/loaders-test/tree/main/commonjs-extension-resolution-loader [custom https loader]: module.md#import-from-https diff --git a/doc/api/fs.md b/doc/api/fs.md index 6d99ab33edd1ee..5cf806394f5362 100644 --- a/doc/api/fs.md +++ b/doc/api/fs.md @@ -180,6 +180,11 @@ longer be used. @@ -376,7 +385,7 @@ added: v10.0.0 @@ -384,11 +393,14 @@ changes: * `buffer` {Buffer|TypedArray|DataView} A buffer that will be filled with the file data read. * `offset` {integer} The location in the buffer at which to start filling. -* `length` {integer} The number of bytes to read. + **Default:** `0` +* `length` {integer} The number of bytes to read. **Default:** + `buffer.byteLength - offset` * `position` {integer|bigint|null} The location where to begin reading data from the file. If `null` or `-1`, data will be read from the current file position, and the position will be updated. If `position` is a non-negative integer, the current file position will remain unchanged. + **Default:**: `null` * Returns: {Promise} Fulfills upon success with an object with two properties: * `bytesRead` {integer} The number of bytes read * `buffer` {Buffer|TypedArray|DataView} A reference to the passed in `buffer` @@ -406,7 +418,7 @@ added: - v13.11.0 - v12.17.0 changes: - - version: REPLACEME + - version: v21.0.0 pr-url: https://github.com/nodejs/node/pull/42835 description: Accepts bigint values as `position`. --> @@ -440,7 +452,7 @@ added: - v18.2.0 - v16.17.0 changes: - - version: REPLACEME + - version: v21.0.0 pr-url: https://github.com/nodejs/node/pull/42835 description: Accepts bigint values as `position`. --> @@ -896,6 +908,12 @@ the error raised if the file is not accessible. * `path` {string|Buffer|URL|FileHandle} filename or {FileHandle} @@ -904,6 +922,8 @@ added: v10.0.0 * `encoding` {string|null} **Default:** `'utf8'` * `mode` {integer} **Default:** `0o666` * `flag` {string} See [support of file system `flags`][]. **Default:** `'a'`. + * `flush` {boolean} If `true`, the underlying file descriptor is flushed + prior to closing it. **Default:** `false`. * Returns: {Promise} Fulfills with `undefined` upon success. Asynchronously append data to a file, creating the file if it does not yet @@ -1187,7 +1207,9 @@ makeDirectory().catch(console.error); + +> Stability: 1 – Experimental + +* {string} + +The path to the parent directory of the file this {fs.Dirent} object refers to. + #### `dirent.path` +> Stability: 0 - Deprecated: Use [`dirent.parentPath`][] instead. + * {string} -The base path that this {fs.Dirent} object refers to. +Alias for `dirent.parentPath`. ### Class: `fs.FSWatcher` @@ -6930,8 +6995,9 @@ added: v0.1.10 Returns `true` if the {fs.Stats} object describes a file system directory. -If the {fs.Stats} object was obtained from [`fs.lstat()`][], this method will -always return `false`. This is because [`fs.lstat()`][] returns information +If the {fs.Stats} object was obtained from calling [`fs.lstat()`][] on a +symbolic link which resolves to a directory, this method will return `false`. +This is because [`fs.lstat()`][] returns information about a symbolic link itself and not the path it resolves to. #### `stats.isFIFO()` @@ -8155,6 +8221,7 @@ the file contents. [`Number.MAX_SAFE_INTEGER`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER [`ReadDirectoryChangesW`]: https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-readdirectorychangesw [`UV_THREADPOOL_SIZE`]: cli.md#uv_threadpool_sizesize +[`dirent.parentPath`]: #direntparentpath [`event ports`]: https://illumos.org/man/port_create [`filehandle.createReadStream()`]: #filehandlecreatereadstreamoptions [`filehandle.createWriteStream()`]: #filehandlecreatewritestreamoptions diff --git a/doc/api/globals.md b/doc/api/globals.md index 01a6d9327a1669..e17e0f7eebf10d 100644 --- a/doc/api/globals.md +++ b/doc/api/globals.md @@ -479,7 +479,7 @@ added: - v16.15.0 changes: - version: - - REPLACEME + - v21.0.0 pr-url: https://github.com/nodejs/node/pull/45684 description: No longer experimental. - version: v18.0.0 @@ -509,7 +509,7 @@ added: - v16.15.0 changes: - version: - - REPLACEME + - v21.0.0 pr-url: https://github.com/nodejs/node/pull/45684 description: No longer experimental. - version: v18.0.0 @@ -548,7 +548,7 @@ added: - v16.15.0 changes: - version: - - REPLACEME + - v21.0.0 pr-url: https://github.com/nodejs/node/pull/45684 description: No longer experimental. - version: v18.0.0 @@ -597,27 +597,29 @@ This variable may appear to be global but is not. See [`module`][]. ## `Navigator` -> Stability: 1 - Experimental +> Stability: 1.1 - Active development. Disable this API with the +> [`--no-experimental-global-navigator`][] CLI flag. A partial implementation of the [Navigator API][]. ## `navigator` -> Stability: 1 - Experimental +> Stability: 1.1 - Active development. Disable this API with the +> [`--no-experimental-global-navigator`][] CLI flag. A partial implementation of [`window.navigator`][]. ### `navigator.hardwareConcurrency` * {number} @@ -626,7 +628,78 @@ The `navigator.hardwareConcurrency` read-only property returns the number of logical processors available to the current Node.js instance. ```js -console.log(`This process is running on ${navigator.hardwareConcurrency}`); +console.log(`This process is running on ${navigator.hardwareConcurrency} logical processors`); +``` + +### `navigator.language` + + + +* {string} + +The `navigator.language` read-only property returns a string representing the +preferred language of the Node.js instance. The language will be determined by +the ICU library used by Node.js at runtime based on the +default language of the operating system. + +The value is representing the language version as defined in [RFC 5646][]. + +The fallback value on builds without ICU is `'en-US'`. + +```js +console.log(`The preferred language of the Node.js instance has the tag '${navigator.language}'`); +``` + +### `navigator.languages` + + + +* {Array} + +The `navigator.languages` read-only property returns an array of strings +representing the preferred languages of the Node.js instance. +By default `navigator.languages` contains only the value of +`navigator.language`, which will be determined by the ICU library used by +Node.js at runtime based on the default language of the operating system. + +The fallback value on builds without ICU is `['en-US']`. + +```js +console.log(`The preferred languages are '${navigator.languages}'`); +``` + +### `navigator.platform` + + + +* {string} + +The `navigator.platform` read-only property returns a string identifying the +platform on which the Node.js instance is running. + +```js +console.log(`This process is running on ${navigator.platform}`); +``` + +### `navigator.userAgent` + + + +* {string} + +The `navigator.userAgent` read-only property returns user agent +consisting of the runtime name and major version number. + +```js +console.log(`The user-agent is ${navigator.userAgent}`); // Prints "Node.js/21" ``` ## `PerformanceEntry` @@ -823,7 +896,7 @@ added: - v16.15.0 changes: - version: - - REPLACEME + - v21.0.0 pr-url: https://github.com/nodejs/node/pull/45684 description: No longer experimental. - version: v18.0.0 @@ -843,7 +916,7 @@ added: - v16.15.0 changes: - version: - - REPLACEME + - v21.0.0 pr-url: https://github.com/nodejs/node/pull/45684 description: No longer experimental. - version: v18.0.0 @@ -1021,7 +1094,9 @@ The object that acts as the namespace for all W3C ## `WebSocket` > Stability: 1 - Experimental. @@ -1062,9 +1137,11 @@ A browser-compatible implementation of [`WritableStreamDefaultWriter`][]. [CommonJS module]: modules.md [ECMAScript module]: esm.md [Navigator API]: https://html.spec.whatwg.org/multipage/system-state.html#the-navigator-object +[RFC 5646]: https://www.rfc-editor.org/rfc/rfc5646.txt [Web Crypto API]: webcrypto.md [`--experimental-websocket`]: cli.md#--experimental-websocket [`--no-experimental-global-customevent`]: cli.md#--no-experimental-global-customevent +[`--no-experimental-global-navigator`]: cli.md#--no-experimental-global-navigator [`--no-experimental-global-webcrypto`]: cli.md#--no-experimental-global-webcrypto [`AbortController`]: https://developer.mozilla.org/en-US/docs/Web/API/AbortController [`ByteLengthQueuingStrategy`]: webstreams.md#class-bytelengthqueuingstrategy diff --git a/doc/api/http.md b/doc/api/http.md index ce761af7561198..e0b2c55a56a3d0 100644 --- a/doc/api/http.md +++ b/doc/api/http.md @@ -16,14 +16,12 @@ user is able to stream data. HTTP message headers are represented by an object like this: - - -```js -{ 'content-length': '123', - 'content-type': 'text/plain', - 'connection': 'keep-alive', - 'host': 'example.com', - 'accept': '*/*' } +```json +{ "content-length": "123", + "content-type": "text/plain", + "connection": "keep-alive", + "host": "example.com", + "accept": "*/*" } ``` Keys are lowercased. Values are not modified. @@ -4043,7 +4041,6 @@ identified by `code: 'ERR_INVALID_HTTP_TOKEN'`. It is not necessary to use this method before passing headers to an HTTP request or response. The HTTP module will automatically validate such headers. -Examples: Example: diff --git a/doc/api/http2.md b/doc/api/http2.md index c45e5142ca753c..2ec398393f6865 100644 --- a/doc/api/http2.md +++ b/doc/api/http2.md @@ -611,13 +611,15 @@ const http2 = require('node:http2'); const server = http2.createServer(); const expectedWindowSize = 2 ** 20; -server.on('connect', (session) => { +server.on('session', (session) => { // Set local window size to be 2 ** 20 session.setLocalWindowSize(expectedWindowSize); }); ``` +For http2 clients the proper event is either `'connect'` or `'remoteSettings'`. + #### `http2session.setTimeout(msecs, callback)` - ```cjs let https; try { diff --git a/doc/api/module.md b/doc/api/module.md index 7708cbc3932c3f..ee938953abeeca 100644 --- a/doc/api/module.md +++ b/doc/api/module.md @@ -83,9 +83,13 @@ isBuiltin('wss'); // false ### `module.register(specifier[, parentURL][, options])` @@ -99,6 +103,10 @@ changes: URL, such as `import.meta.url`, you can pass that URL here. **Default:** `'data:'` * `options` {Object} + * `parentURL` {string|URL} If you want to resolve `specifier` relative to a + base URL, such as `import.meta.url`, you can pass that URL here. This + property is ignored if the `parentURL` is supplied as the second argument. + **Default:** `'data:'` * `data` {any} Any arbitrary, cloneable JavaScript value to pass into the [`initialize`][] hook. * `transferList` {Object\[]} [transferrable objects][] to be passed into the @@ -153,7 +161,9 @@ import('node:fs').then((esmFS) => { > Stability: 1.2 - Release candidate @@ -458,7 +470,10 @@ register('./path-to-my-hooks.js', { ```c -napi_status napi_set_instance_data(napi_env env, +napi_status napi_set_instance_data(node_api_nogc_env env, void* data, napi_finalize finalize_cb, void* finalize_hint); @@ -475,7 +509,7 @@ napiVersion: 6 --> ```c -napi_status napi_get_instance_data(napi_env env, +napi_status napi_get_instance_data(node_api_nogc_env env, void** data); ``` @@ -577,6 +611,22 @@ when an instance of a native addon is unloaded. Notification of this event is delivered through the callbacks given to [`napi_add_env_cleanup_hook`][] and [`napi_set_instance_data`][]. +### `node_api_nogc_env` + +> Stability: 1 - Experimental + +This variant of `napi_env` is passed to synchronous finalizers +([`node_api_nogc_finalize`][]). There is a subset of Node-APIs which accept +a parameter of type `node_api_nogc_env` as their first argument. These APIs do +not access the state of the JavaScript engine and are thus safe to call from +synchronous finalizers. Passing a parameter of type `napi_env` to these APIs is +allowed, however, passing a parameter of type `node_api_nogc_env` to APIs that +access the JavaScript engine state is not allowed. Attempting to do so without +a cast will produce a compiler warning or an error when add-ons are compiled +with flags which cause them to emit warnings and/or errors when incorrect +pointer types are passed into a function. Calling such APIs from a synchronous +finalizer will ultimately result in the termination of the application. + ### `napi_value` This is an opaque pointer that is used to represent a JavaScript value. @@ -741,32 +791,36 @@ typedef napi_value (*napi_callback)(napi_env, napi_callback_info); Unless for reasons discussed in [Object Lifetime Management][], creating a handle and/or callback scope inside a `napi_callback` is not necessary. -#### `napi_finalize` +#### `node_api_nogc_finalize` +> Stability: 1 - Experimental + Function pointer type for add-on provided functions that allow the user to be notified when externally-owned data is ready to be cleaned up because the -object with which it was associated with has been garbage-collected. The user -must provide a function satisfying the following signature which would get -called upon the object's collection. Currently, `napi_finalize` can be used for +object it was associated with has been garbage-collected. The user must provide +a function satisfying the following signature which would get called upon the +object's collection. Currently, `node_api_nogc_finalize` can be used for finding out when objects that have external data are collected. ```c -typedef void (*napi_finalize)(napi_env env, - void* finalize_data, - void* finalize_hint); +typedef void (*node_api_nogc_finalize)(node_api_nogc_env env, + void* finalize_data, + void* finalize_hint); ``` Unless for reasons discussed in [Object Lifetime Management][], creating a handle and/or callback scope inside the function body is not necessary. Since these functions may be called while the JavaScript engine is in a state -where it cannot execute JavaScript code, some Node-API calls may return -`napi_pending_exception` even when there is no exception pending. +where it cannot execute JavaScript code, only Node-APIs which accept a +`node_api_nogc_env` as their first parameter may be called. +[`node_api_post_finalizer`][] can be used to schedule Node-API calls that +require access to the JavaScript engine's state to run after the current +garbage collection cycle has completed. In the case of [`node_api_create_external_string_latin1`][] and [`node_api_create_external_string_utf16`][] the `env` parameter may be null, @@ -775,11 +829,39 @@ shutdown. Change History: +* experimental (`NAPI_EXPERIMENTAL`): + + Only Node-API calls that accept a `node_api_nogc_env` as their first + parameter may be called, otherwise the application will be terminated with an + appropriate error message. This feature can be turned off by defining + `NODE_API_EXPERIMENTAL_NOGC_ENV_OPT_OUT`. + +#### `napi_finalize` + + + +Function pointer type for add-on provided function that allow the user to +schedule a group of calls to Node-APIs in response to a garbage collection +event, after the garbage collection cycle has completed. These function +pointers can be used with [`node_api_post_finalizer`][]. + +```c +typedef void (*napi_finalize)(napi_env env, + void* finalize_data, + void* finalize_hint); +``` + +Change History: + * experimental (`NAPI_EXPERIMENTAL` is defined): - Node-API calls made from a finalizer will return `napi_cannot_run_js` when - the JavaScript engine is unable to execute JavaScript, and will return - `napi_exception_pending` if there is a pending exception. + A function of this type may no longer be used as a finalizer, except with + [`node_api_post_finalizer`][]. [`node_api_nogc_finalize`][] must be used + instead. This feature can be turned off by defining + `NODE_API_EXPERIMENTAL_NOGC_ENV_OPT_OUT`. #### `napi_async_execute_callback` @@ -981,7 +1063,7 @@ napiVersion: 1 ```c napi_status -napi_get_last_error_info(napi_env env, +napi_get_last_error_info(node_api_nogc_env env, const napi_extended_error_info** result); ``` @@ -1800,7 +1882,7 @@ napiVersion: 3 --> ```c -NODE_EXTERN napi_status napi_add_env_cleanup_hook(napi_env env, +NODE_EXTERN napi_status napi_add_env_cleanup_hook(node_api_nogc_env env, napi_cleanup_hook fun, void* arg); ``` @@ -1830,7 +1912,7 @@ napiVersion: 3 --> ```c -NAPI_EXTERN napi_status napi_remove_env_cleanup_hook(napi_env env, +NAPI_EXTERN napi_status napi_remove_env_cleanup_hook(node_api_nogc_env env, void (*fun)(void* arg), void* arg); ``` @@ -1859,7 +1941,7 @@ changes: ```c NAPI_EXTERN napi_status napi_add_async_cleanup_hook( - napi_env env, + node_api_nogc_env env, napi_async_cleanup_hook hook, void* arg, napi_async_cleanup_hook_handle* remove_handle); @@ -2017,7 +2099,7 @@ You can also use the `NAPI_MODULE_INIT` macro, which acts as a shorthand for `NAPI_MODULE` and defining an `Init` function: ```c -NAPI_MODULE_INIT() { +NAPI_MODULE_INIT(/* napi_env env, napi_value exports */) { napi_value answer; napi_status result; @@ -2031,6 +2113,9 @@ NAPI_MODULE_INIT() { } ``` +The parameters `env` and `exports` are provided to the body of the +`NAPI_MODULE_INIT` macro. + All Node-API addons are context-aware, meaning they may be loaded multiple times. There are a few design considerations when declaring such a module. The documentation on [context-aware addons][] provides more details. @@ -5399,7 +5484,7 @@ napiVersion: 5 napi_status napi_add_finalizer(napi_env env, napi_value js_object, void* finalize_data, - napi_finalize finalize_cb, + node_api_nogc_finalize finalize_cb, void* finalize_hint, napi_ref* result); ``` @@ -5431,13 +5516,16 @@ required in order to enable correct disposal of the reference. #### `node_api_post_finalizer` > Stability: 1 - Experimental ```c -napi_status node_api_post_finalizer(napi_env env, +napi_status node_api_post_finalizer(node_api_nogc_env env, napi_finalize finalize_cb, void* finalize_data, void* finalize_hint); @@ -5507,7 +5595,7 @@ Once created the async worker can be queued for execution using the [`napi_queue_async_work`][] function: ```c -napi_status napi_queue_async_work(napi_env env, +napi_status napi_queue_async_work(node_api_nogc_env env, napi_async_work work); ``` @@ -5599,7 +5687,7 @@ napiVersion: 1 --> ```c -napi_status napi_queue_async_work(napi_env env, +napi_status napi_queue_async_work(node_api_nogc_env env, napi_async_work work); ``` @@ -5620,7 +5708,7 @@ napiVersion: 1 --> ```c -napi_status napi_cancel_async_work(napi_env env, +napi_status napi_cancel_async_work(node_api_nogc_env env, napi_async_work work); ``` @@ -5824,7 +5912,7 @@ typedef struct { const char* release; } napi_node_version; -napi_status napi_get_node_version(napi_env env, +napi_status napi_get_node_version(node_api_nogc_env env, const napi_node_version** version); ``` @@ -5847,7 +5935,7 @@ napiVersion: 1 --> ```c -napi_status napi_get_version(napi_env env, +napi_status napi_get_version(node_api_nogc_env env, uint32_t* result); ``` @@ -5880,7 +5968,7 @@ napiVersion: 1 --> ```c -NAPI_EXTERN napi_status napi_adjust_external_memory(napi_env env, +NAPI_EXTERN napi_status napi_adjust_external_memory(node_api_nogc_env env, int64_t change_in_bytes, int64_t* result); ``` @@ -6097,7 +6185,7 @@ napiVersion: 2 --> ```c -NAPI_EXTERN napi_status napi_get_uv_event_loop(napi_env env, +NAPI_EXTERN napi_status napi_get_uv_event_loop(node_api_nogc_env env, struct uv_loop_s** loop); ``` @@ -6411,7 +6499,7 @@ napiVersion: 4 ```c NAPI_EXTERN napi_status -napi_ref_threadsafe_function(napi_env env, napi_threadsafe_function func); +napi_ref_threadsafe_function(node_api_nogc_env env, napi_threadsafe_function func); ``` * `[in] env`: The environment that the API is invoked under. @@ -6437,7 +6525,7 @@ napiVersion: 4 ```c NAPI_EXTERN napi_status -napi_unref_threadsafe_function(napi_env env, napi_threadsafe_function func); +napi_unref_threadsafe_function(node_api_nogc_env env, napi_threadsafe_function func); ``` * `[in] env`: The environment that the API is invoked under. @@ -6463,7 +6551,7 @@ napiVersion: 9 ```c NAPI_EXTERN napi_status -node_api_get_module_file_name(napi_env env, const char** result); +node_api_get_module_file_name(node_api_nogc_env env, const char** result); ``` @@ -6527,6 +6615,7 @@ the add-on's file name during loading. [`Number.MIN_SAFE_INTEGER`]: https://tc39.github.io/ecma262/#sec-number.min_safe_integer [`Worker`]: worker_threads.md#class-worker [`async_hooks.executionAsyncResource()`]: async_hooks.md#async_hooksexecutionasyncresource +[`build_with_cmake`]: https://github.com/nodejs/node-addon-examples/tree/main/build_with_cmake [`global`]: globals.md#global [`init` hooks]: async_hooks.md#initasyncid-type-triggerasyncid-resource [`napi_add_async_cleanup_hook`]: #napi_add_async_cleanup_hook @@ -6590,6 +6679,8 @@ the add-on's file name during loading. [`node_api_create_external_string_latin1`]: #node_api_create_external_string_latin1 [`node_api_create_external_string_utf16`]: #node_api_create_external_string_utf16 [`node_api_create_syntax_error`]: #node_api_create_syntax_error +[`node_api_nogc_finalize`]: #node_api_nogc_finalize +[`node_api_post_finalizer`]: #node_api_post_finalizer [`node_api_throw_syntax_error`]: #node_api_throw_syntax_error [`process.release`]: process.md#processrelease [`uv_ref`]: https://docs.libuv.org/en/v1.x/handle.html#c.uv_ref diff --git a/doc/api/net.md b/doc/api/net.md index ad0d647a140519..8a66a0a68b4c60 100644 --- a/doc/api/net.md +++ b/doc/api/net.md @@ -38,7 +38,10 @@ it will unlink the Unix domain socket as well. For example, socket outside of these abstractions, the user will need to remove it. The same applies when a Node.js API creates a Unix domain socket but the program then crashes. In short, a Unix domain socket will be visible in the file system and -will persist until unlinked. +will persist until unlinked. On Linux, You can use Unix abstract socket by adding +`\0` to the beginning of the path, such as `\0abstract`. The path to the Unix +abstract socket is not visible in the file system and it will disappear automatically +when all open references to the socket are closed. On Windows, the local domain is implemented using a named pipe. The path _must_ refer to an entry in `\\?\pipe\` or `\\.\pipe\`. Any characters are permitted, @@ -579,7 +582,7 @@ added: v5.7.0 + +* `ip` {number} The IP which the socket is attempting to connect to. +* `port` {number} The port which the socket is attempting to connect to. +* `family` {number} The family of the IP. It can be `6` for IPv6 or `4` for IPv4. + +Emitted when a new connection attempt is started. This may be emitted multiple times +if the family autoselection algorithm is enabled in [`socket.connect(options)`][]. + +### Event: `'connectionAttemptFailed'` + + + +* `ip` {number} The IP which the socket attempted to connect to. +* `port` {number} The port which the socket attempted to connect to. +* `family` {number} The family of the IP. It can be `6` for IPv6 or `4` for IPv4. + \* `error` {Error} The error associated with the failure. + +Emitted when a connection attempt failed. This may be emitted multiple times +if the family autoselection algorithm is enabled in [`socket.connect(options)`][]. + +### Event: `'connectionAttemptTimeout'` + + + +* `ip` {number} The IP which the socket attempted to connect to. +* `port` {number} The port which the socket attempted to connect to. +* `family` {number} The family of the IP. It can be `6` for IPv6 or `4` for IPv4. + +Emitted when a connection attempt timed out. This is only emitted (and may be +emitted multiple times) if the family autoselection algorithm is enabled +in [`socket.connect(options)`][]. + ### Event: `'data'` > Stability: 1 - Experimental diff --git a/doc/api/querystring.md b/doc/api/querystring.md index 752d4b9d584242..f7f45d57d927ce 100644 --- a/doc/api/querystring.md +++ b/doc/api/querystring.md @@ -87,12 +87,10 @@ collection of key and value pairs. For example, the query string `'foo=bar&abc=xyz&abc=123'` is parsed into: - - -```js +```json { - foo: 'bar', - abc: ['xyz', '123'] + "foo": "bar", + "abc": ["xyz", "123"] } ``` diff --git a/doc/api/stream.md b/doc/api/stream.md index b9c4b4c2ac86f0..93d7635a2679d0 100644 --- a/doc/api/stream.md +++ b/doc/api/stream.md @@ -2015,7 +2015,9 @@ added: - v17.4.0 - v16.14.0 changes: - - version: v20.7.0 + - version: + - v20.7.0 + - v18.19.0 pr-url: https://github.com/nodejs/node/pull/49249 description: added `highWaterMark` in options. --> @@ -2068,7 +2070,9 @@ added: - v17.4.0 - v16.14.0 changes: - - version: v20.7.0 + - version: + - v20.7.0 + - v18.19.0 pr-url: https://github.com/nodejs/node/pull/49249 description: added `highWaterMark` in options. --> @@ -2823,6 +2827,11 @@ const server = http.createServer((req, res) => { > Stability: 1 - Experimental @@ -1576,37 +1818,53 @@ Mocking timers is a technique commonly used in software testing to simulate and control the behavior of timers, such as `setInterval` and `setTimeout`, without actually waiting for the specified time intervals. +MockTimers is also able to mock the `Date` object. + The [`MockTracker`][] provides a top-level `timers` export which is a `MockTimers` instance. -### `timers.enable([timers])` +### `timers.enable([enableOptions])` Enables timer mocking for the specified timers. -* `timers` {Array} An optional array containing the timers to mock. - The currently supported timer values are `'setInterval'`, `'setTimeout'`, - and `'setImmediate'`. If no value is provided, all timers (`'setInterval'`, - `'clearInterval'`, `'setTimeout'`, `'clearTimeout'`, `'setImmediate'`, - and `'clearImmediate'`) will be mocked by default. +* `enableOptions` {Object} Optional configuration options for enabling timer + mocking. The following properties are supported: + * `apis` {Array} An optional array containing the timers to mock. + The currently supported timer values are `'setInterval'`, `'setTimeout'`, `'setImmediate'`, + and `'Date'`. **Default:** `['setInterval', 'setTimeout', 'setImmediate', 'Date']`. + If no array is provided, all time related APIs (`'setInterval'`, `'clearInterval'`, + `'setTimeout'`, `'clearTimeout'`, and `'Date'`) will be mocked by default. + * `now` {number | Date} An optional number or Date object representing the + initial time (in milliseconds) to use as the value + for `Date.now()`. **Default:** `0`. **Note:** When you enable mocking for a specific timer, its associated clear function will also be implicitly mocked. -Example usage: +**Note:** Mocking `Date` will affect the behavior of the mocked timers +as they use the same internal clock. + +Example usage without setting initial time: ```mjs import { mock } from 'node:test'; -mock.timers.enable(['setInterval']); +mock.timers.enable({ apis: ['setInterval'] }); ``` ```cjs const { mock } = require('node:test'); -mock.timers.enable(['setInterval']); +mock.timers.enable({ apis: ['setInterval'] }); ``` The above example enables mocking for the `setInterval` timer and @@ -1615,18 +1873,43 @@ and `clearInterval` functions from [node:timers](./timers.md), [node:timers/promises](./timers.md#timers-promises-api), and `globalThis` will be mocked. +Example usage with initial time set + +```mjs +import { mock } from 'node:test'; +mock.timers.enable({ apis: ['Date'], now: 1000 }); +``` + +```cjs +const { mock } = require('node:test'); +mock.timers.enable({ apis: ['Date'], now: 1000 }); +``` + +Example usage with initial Date object as time set + +```mjs +import { mock } from 'node:test'; +mock.timers.enable({ apis: ['Date'], now: new Date() }); +``` + +```cjs +const { mock } = require('node:test'); +mock.timers.enable({ apis: ['Date'], now: new Date() }); +``` + Alternatively, if you call `mock.timers.enable()` without any parameters: All timers (`'setInterval'`, `'clearInterval'`, `'setTimeout'`, and `'clearTimeout'`) will be mocked. The `setInterval`, `clearInterval`, `setTimeout`, and `clearTimeout` functions from `node:timers`, `node:timers/promises`, -and `globalThis` will be mocked. +and `globalThis` will be mocked. As well as the global `Date` object. ### `timers.reset()` This function restores the default behavior of all mocks that were previously @@ -1655,6 +1938,7 @@ Calls `timers.reset()`. Advances time for all mocked timers. @@ -1677,7 +1961,7 @@ import { test } from 'node:test'; test('mocks setTimeout to be executed synchronously without having to actually wait for it', (context) => { const fn = context.mock.fn(); - context.mock.timers.enable(['setTimeout']); + context.mock.timers.enable({ apis: ['setTimeout'] }); setTimeout(fn, 9999); @@ -1696,7 +1980,7 @@ const { test } = require('node:test'); test('mocks setTimeout to be executed synchronously without having to actually wait for it', (context) => { const fn = context.mock.fn(); - context.mock.timers.enable(['setTimeout']); + context.mock.timers.enable({ apis: ['setTimeout'] }); setTimeout(fn, 9999); assert.strictEqual(fn.mock.callCount(), 0); @@ -1716,7 +2000,7 @@ import { test } from 'node:test'; test('mocks setTimeout to be executed synchronously without having to actually wait for it', (context) => { const fn = context.mock.fn(); - context.mock.timers.enable(['setTimeout']); + context.mock.timers.enable({ apis: ['setTimeout'] }); const nineSecs = 9000; setTimeout(fn, nineSecs); @@ -1735,7 +2019,7 @@ const { test } = require('node:test'); test('mocks setTimeout to be executed synchronously without having to actually wait for it', (context) => { const fn = context.mock.fn(); - context.mock.timers.enable(['setTimeout']); + context.mock.timers.enable({ apis: ['setTimeout'] }); const nineSecs = 9000; setTimeout(fn, nineSecs); @@ -1748,6 +2032,48 @@ test('mocks setTimeout to be executed synchronously without having to actually w }); ``` +Advancing time using `.tick` will also advance the time for any `Date` object +created after the mock was enabled (if `Date` was also set to be mocked). + +```mjs +import assert from 'node:assert'; +import { test } from 'node:test'; + +test('mocks setTimeout to be executed synchronously without having to actually wait for it', (context) => { + const fn = context.mock.fn(); + + context.mock.timers.enable({ apis: ['setTimeout', 'Date'] }); + setTimeout(fn, 9999); + + assert.strictEqual(fn.mock.callCount(), 0); + assert.strictEqual(Date.now(), 0); + + // Advance in time + context.mock.timers.tick(9999); + assert.strictEqual(fn.mock.callCount(), 1); + assert.strictEqual(Date.now(), 9999); +}); +``` + +```cjs +const assert = require('node:assert'); +const { test } = require('node:test'); + +test('mocks setTimeout to be executed synchronously without having to actually wait for it', (context) => { + const fn = context.mock.fn(); + context.mock.timers.enable({ apis: ['setTimeout', 'Date'] }); + + setTimeout(fn, 9999); + assert.strictEqual(fn.mock.callCount(), 0); + assert.strictEqual(Date.now(), 0); + + // Advance in time + context.mock.timers.tick(9999); + assert.strictEqual(fn.mock.callCount(), 1); + assert.strictEqual(Date.now(), 9999); +}); +``` + #### Using clear functions As mentioned, all clear functions from timers (`clearTimeout` and `clearInterval`) @@ -1761,7 +2087,7 @@ test('mocks setTimeout to be executed synchronously without having to actually w const fn = context.mock.fn(); // Optionally choose what to mock - context.mock.timers.enable(['setTimeout']); + context.mock.timers.enable({ apis: ['setTimeout'] }); const id = setTimeout(fn, 9999); // Implicity mocked as well @@ -1781,7 +2107,7 @@ test('mocks setTimeout to be executed synchronously without having to actually w const fn = context.mock.fn(); // Optionally choose what to mock - context.mock.timers.enable(['setTimeout']); + context.mock.timers.enable({ apis: ['setTimeout'] }); const id = setTimeout(fn, 9999); // Implicity mocked as well @@ -1815,7 +2141,7 @@ test('mocks setTimeout to be executed synchronously without having to actually w const nodeTimerPromiseSpy = context.mock.fn(); // Optionally choose what to mock - context.mock.timers.enable(['setTimeout']); + context.mock.timers.enable({ apis: ['setTimeout'] }); setTimeout(globalTimeoutObjectSpy, 9999); nodeTimers.setTimeout(nodeTimerSpy, 9999); @@ -1842,7 +2168,7 @@ test('mocks setTimeout to be executed synchronously without having to actually w const nodeTimerPromiseSpy = context.mock.fn(); // Optionally choose what to mock - context.mock.timers.enable(['setTimeout']); + context.mock.timers.enable({ apis: ['setTimeout'] }); setTimeout(globalTimeoutObjectSpy, 9999); nodeTimers.setTimeout(nodeTimerSpy, 9999); @@ -1865,7 +2191,7 @@ import assert from 'node:assert'; import { test } from 'node:test'; import nodeTimersPromises from 'node:timers/promises'; test('should tick five times testing a real use case', async (context) => { - context.mock.timers.enable(['setInterval']); + context.mock.timers.enable({ apis: ['setInterval'] }); const expectedIterations = 3; const interval = 1000; @@ -1897,7 +2223,7 @@ const assert = require('node:assert'); const { test } = require('node:test'); const nodeTimersPromises = require('node:timers/promises'); test('should tick five times testing a real use case', async (context) => { - context.mock.timers.enable(['setInterval']); + context.mock.timers.enable({ apis: ['setInterval'] }); const expectedIterations = 3; const interval = 1000; @@ -1929,9 +2255,11 @@ test('should tick five times testing a real use case', async (context) => { -Triggers all pending mocked timers immediately. +Triggers all pending mocked timers immediately. If the `Date` object is also +mocked, it will also advance the `Date` object to the furthest timer's time. The example below triggers all pending timers immediately, causing them to execute without any delay. @@ -1941,7 +2269,7 @@ import assert from 'node:assert'; import { test } from 'node:test'; test('runAll functions following the given order', (context) => { - context.mock.timers.enable(['setTimeout']); + context.mock.timers.enable({ apis: ['setTimeout', 'Date'] }); const results = []; setTimeout(() => results.push(1), 9999); @@ -1953,8 +2281,9 @@ test('runAll functions following the given order', (context) => { assert.deepStrictEqual(results, []); context.mock.timers.runAll(); - assert.deepStrictEqual(results, [3, 2, 1]); + // The Date object is also advanced to the furthest timer's time + assert.strictEqual(Date.now(), 9999); }); ``` @@ -1963,7 +2292,7 @@ const assert = require('node:assert'); const { test } = require('node:test'); test('runAll functions following the given order', (context) => { - context.mock.timers.enable(['setTimeout']); + context.mock.timers.enable({ apis: ['setTimeout', 'Date'] }); const results = []; setTimeout(() => results.push(1), 9999); @@ -1975,8 +2304,9 @@ test('runAll functions following the given order', (context) => { assert.deepStrictEqual(results, []); context.mock.timers.runAll(); - assert.deepStrictEqual(results, [3, 2, 1]); + // The Date object is also advanced to the furthest timer's time + assert.strictEqual(Date.now(), 9999); }); ``` @@ -1985,6 +2315,92 @@ triggering timers in the context of timer mocking. It does not have any effect on real-time system clocks or actual timers outside of the mocking environment. +### `timers.setTime(milliseconds)` + + + +Sets the current Unix timestamp that will be used as reference for any mocked +`Date` objects. + +```mjs +import assert from 'node:assert'; +import { test } from 'node:test'; + +test('runAll functions following the given order', (context) => { + const now = Date.now(); + const setTime = 1000; + // Date.now is not mocked + assert.deepStrictEqual(Date.now(), now); + + context.mock.timers.enable({ apis: ['Date'] }); + context.mock.timers.setTime(setTime); + // Date.now is now 1000 + assert.strictEqual(Date.now(), setTime); +}); +``` + +```cjs +const assert = require('node:assert'); +const { test } = require('node:test'); + +test('setTime replaces current time', (context) => { + const now = Date.now(); + const setTime = 1000; + // Date.now is not mocked + assert.deepStrictEqual(Date.now(), now); + + context.mock.timers.enable({ apis: ['Date'] }); + context.mock.timers.setTime(setTime); + // Date.now is now 1000 + assert.strictEqual(Date.now(), setTime); +}); +``` + +#### Dates and Timers working together + +Dates and timer objects are dependent on each other. If you use `setTime()` to +pass the current time to the mocked `Date` object, the set timers with +`setTimeout` and `setInterval` will **not** be affected. + +However, the `tick` method **will** advanced the mocked `Date` object. + +```mjs +import assert from 'node:assert'; +import { test } from 'node:test'; + +test('runAll functions following the given order', (context) => { + context.mock.timers.enable({ apis: ['setTimeout', 'Date'] }); + const results = []; + setTimeout(() => results.push(1), 9999); + + assert.deepStrictEqual(results, []); + context.mock.timers.setTime(12000); + assert.deepStrictEqual(results, []); + // The date is advanced but the timers don't tick + assert.strictEqual(Date.now(), 12000); +}); +``` + +```cjs +const assert = require('node:assert'); +const { test } = require('node:test'); + +test('runAll functions following the given order', (context) => { + context.mock.timers.enable({ apis: ['setTimeout', 'Date'] }); + const results = []; + setTimeout(() => results.push(1), 9999); + + assert.deepStrictEqual(results, []); + context.mock.timers.setTime(12000); + assert.deepStrictEqual(results, []); + // The date is advanced but the timers don't tick + assert.strictEqual(Date.now(), 12000); +}); +``` + ## Class: `TestsStream` -* Extends {ReadableStream} +* Extends {Readable} A successful call to [`run()`][] method will return a new {TestsStream} object, streaming a series of events representing the execution of the tests. diff --git a/doc/api/tls.md b/doc/api/tls.md index 37f26189e5e62e..200da769a20333 100644 --- a/doc/api/tls.md +++ b/doc/api/tls.md @@ -22,8 +22,6 @@ calling `require('node:tls')` will result in an error being thrown. When using CommonJS, the error thrown can be caught using try/catch: - - ```cjs let tls; try { @@ -2049,7 +2047,9 @@ where `secureSocket` has the same API as `pair.cleartext`. - -```js +```mjs import * as ns from './a.js'; util.types.isModuleNamespaceObject(ns); // Returns true diff --git a/doc/api/vm.md b/doc/api/vm.md index e5c116d54af0bf..7a2c59c867f4a1 100644 --- a/doc/api/vm.md +++ b/doc/api/vm.md @@ -62,7 +62,7 @@ changes: - v17.0.0 - v16.12.0 pr-url: https://github.com/nodejs/node/pull/40249 - description: Added support for import assertions to the + description: Added support for import attributes to the `importModuleDynamically` parameter. - version: v10.6.0 pr-url: https://github.com/nodejs/node/pull/20300 @@ -98,10 +98,12 @@ changes: when `import()` is called. If this option is not specified, calls to `import()` will reject with [`ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING`][]. This option is part of the experimental modules API. We do not recommend - using it in a production environment. + using it in a production environment. If `--experimental-vm-modules` isn't + set, this callback will be ignored and calls to `import()` will reject with + [`ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING_FLAG`][]. * `specifier` {string} specifier passed to `import()` * `script` {vm.Script} - * `importAssertions` {Object} The `"assert"` value passed to the + * `importAttributes` {Object} The `"with"` value passed to the [`optionsExpression`][] optional parameter, or an empty object if no value was provided. * Returns: {Module Namespace Object|vm.Module} Returning a `vm.Module` is @@ -615,6 +617,17 @@ The identifier of the current module, as set in the constructor. ### `module.link(linker)` + + * `linker` {Function} * `specifier` {string} The specifier of the requested module: ```mjs @@ -625,15 +638,14 @@ The identifier of the current module, as set in the constructor. * `referencingModule` {vm.Module} The `Module` object `link()` is called on. * `extra` {Object} - * `assert` {Object} The data from the assertion: - - ```js - import foo from 'foo' assert { name: 'value' }; - // ^^^^^^^^^^^^^^^^^ the assertion + * `attributes` {Object} The data from the attribute: + ```mjs + import foo from 'foo' with { name: 'value' }; + // ^^^^^^^^^^^^^^^^^ the attribute ``` - Per ECMA-262, hosts are expected to ignore assertions that they do not - support, as opposed to, for example, triggering an error if an - unsupported assertion is present. + Per ECMA-262, hosts are expected to trigger an error if an + unsupported attribute is present. + * `assert` {Object} Alias for `extra.attributes`. * Returns: {vm.Module|Promise} * Returns: {Promise} @@ -732,7 +744,7 @@ changes: - v17.0.0 - v16.12.0 pr-url: https://github.com/nodejs/node/pull/40249 - description: Added support for import assertions to the + description: Added support for import attributes to the `importModuleDynamically` parameter. --> @@ -760,9 +772,12 @@ changes: * `importModuleDynamically` {Function} Called during evaluation of this module when `import()` is called. If this option is not specified, calls to `import()` will reject with [`ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING`][]. + If `--experimental-vm-modules` isn't set, this callback will be ignored + and calls to `import()` will reject with + [`ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING_FLAG`][]. * `specifier` {string} specifier passed to `import()` * `module` {vm.Module} - * `importAssertions` {Object} The `"assert"` value passed to the + * `importAttributes` {Object} The `"with"` value passed to the [`optionsExpression`][] optional parameter, or an empty object if no value was provided. * Returns: {Module Namespace Object|vm.Module} Returning a `vm.Module` is @@ -977,7 +992,7 @@ changes: - v17.0.0 - v16.12.0 pr-url: https://github.com/nodejs/node/pull/40249 - description: Added support for import assertions to the + description: Added support for import attributes to the `importModuleDynamically` parameter. - version: v15.9.0 pr-url: https://github.com/nodejs/node/pull/35431 @@ -1018,10 +1033,12 @@ changes: when `import()` is called. If this option is not specified, calls to `import()` will reject with [`ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING`][]. This option is part of the experimental modules API, and should not be - considered stable. + considered stable. If `--experimental-vm-modules` isn't + set, this callback will be ignored and calls to `import()` will reject with + [`ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING_FLAG`][]. * `specifier` {string} specifier passed to `import()` * `function` {Function} - * `importAssertions` {Object} The `"assert"` value passed to the + * `importAttributes` {Object} The `"with"` value passed to the [`optionsExpression`][] optional parameter, or an empty object if no value was provided. * Returns: {Module Namespace Object|vm.Module} Returning a `vm.Module` is @@ -1038,6 +1055,9 @@ function with the given `params`. The WASI API provides an implementation of the [WebAssembly System Interface][] -specification. WASI gives sandboxed WebAssembly applications access to the -underlying operating system via a collection of POSIX-like functions. +specification. WASI gives WebAssembly applications access to the underlying +operating system via a collection of POSIX-like functions. ```mjs import { readFile } from 'node:fs/promises'; @@ -20,7 +25,7 @@ const wasi = new WASI({ args: argv, env, preopens: { - '/sandbox': '/some/real/path/that/wasm/can/access', + '/local': '/some/real/path/that/wasm/can/access', }, }); @@ -44,7 +49,7 @@ const wasi = new WASI({ args: argv, env, preopens: { - '/sandbox': '/some/real/path/that/wasm/can/access', + '/local': '/some/real/path/that/wasm/can/access', }, }); @@ -97,6 +102,28 @@ Use [wabt](https://github.com/WebAssembly/wabt) to compile `.wat` to `.wasm` wat2wasm demo.wat ``` +## Security + + + +WASI provides a capabilities-based model through which applications are provided +their own custom `env`, `preopens`, `stdin`, `stdout`, `stderr`, and `exit` +capabilities. + +**The current Node.js threat model does not provide secure sandboxing as is +present in some WASI runtimes.** + +While the capability features are supported, they do not form a security model +in Node.js. For example, the file system sandboxing can be escaped with various +techniques. The project is exploring whether these security guarantees could be +added in future. + ## Class: `WASI` -* `format` {string} One of either `'deflate'` or `'gzip'`. +* `format` {string} One of `'deflate'`, `'deflate-raw'`, or `'gzip'`. #### `compressionStream.readable` @@ -1454,9 +1458,13 @@ changes: -* `format` {string} One of either `'deflate'` or `'gzip'`. +* `format` {string} One of `'deflate'`, `'deflate-raw'`, or `'gzip'`. #### `decompressionStream.readable` diff --git a/doc/api/worker_threads.md b/doc/api/worker_threads.md index 28afb77d8036a1..ccbce9f96cc7eb 100644 --- a/doc/api/worker_threads.md +++ b/doc/api/worker_threads.md @@ -174,7 +174,7 @@ There is no equivalent to this API in browsers. ## `worker.isMarkedAsUntransferable(object)` * `object` {any} Any JavaScript value. @@ -600,7 +600,7 @@ are part of the channel. + +
  • + + + + + + +
    Current
    +21.5.0
    +21.4.0
    +21.3.0
    +21.2.0
    +21.1.0
    +21.0.0
    +
    + +* Other Versions + * [20.x](CHANGELOG_V20.md) + * [19.x](CHANGELOG_V19.md) + * [18.x](CHANGELOG_V18.md) + * [17.x](CHANGELOG_V17.md) + * [16.x](CHANGELOG_V16.md) + * [15.x](CHANGELOG_V15.md) + * [14.x](CHANGELOG_V14.md) + * [13.x](CHANGELOG_V13.md) + * [12.x](CHANGELOG_V12.md) + * [11.x](CHANGELOG_V11.md) + * [10.x](CHANGELOG_V10.md) + * [9.x](CHANGELOG_V9.md) + * [8.x](CHANGELOG_V8.md) + * [7.x](CHANGELOG_V7.md) + * [6.x](CHANGELOG_V6.md) + * [5.x](CHANGELOG_V5.md) + * [4.x](CHANGELOG_V4.md) + * [0.12.x](CHANGELOG_V012.md) + * [0.10.x](CHANGELOG_V010.md) + * [io.js](CHANGELOG_IOJS.md) + * [Archive](CHANGELOG_ARCHIVE.md) + + + +## 2023-12-19, Version 21.5.0 (Current), @RafaelGSS + +### Notable Changes + +* \[[`0dd53da722`](https://github.com/nodejs/node/commit/0dd53da722)] - **(SEMVER-MINOR)** **deps**: add simdjson (Yagiz Nizipli) [#50322](https://github.com/nodejs/node/pull/50322) +* \[[`9f54987fbc`](https://github.com/nodejs/node/commit/9f54987fbc)] - **module**: merge config with `package_json_reader` (Yagiz Nizipli) [#50322](https://github.com/nodejs/node/pull/50322) +* \[[`45e4f82912`](https://github.com/nodejs/node/commit/45e4f82912)] - **src**: move package resolver to c++ (Yagiz Nizipli) [#50322](https://github.com/nodejs/node/pull/50322) + +#### Deprecations + +* \[[`26ed4ad01f`](https://github.com/nodejs/node/commit/26ed4ad01f)] - **doc**: deprecate hash constructor (Marco Ippolito) [#51077](https://github.com/nodejs/node/pull/51077) +* \[[`58ca66a1a7`](https://github.com/nodejs/node/commit/58ca66a1a7)] - **doc**: deprecate `dirent.path` (Antoine du Hamel) [#51020](https://github.com/nodejs/node/pull/51020) + +### Commits + +* \[[`1bbdbdfbeb`](https://github.com/nodejs/node/commit/1bbdbdfbeb)] - **benchmark**: update iterations in benchmark/perf\_hooks (Lei Shi) [#50869](https://github.com/nodejs/node/pull/50869) +* \[[`087fb0908e`](https://github.com/nodejs/node/commit/087fb0908e)] - **benchmark**: update iterations in benchmark/crypto/aes-gcm-throughput.js (Lei Shi) [#50929](https://github.com/nodejs/node/pull/50929) +* \[[`53b16c71fb`](https://github.com/nodejs/node/commit/53b16c71fb)] - **benchmark**: update iteration and size in benchmark/crypto/randomBytes.js (Lei Shi) [#50868](https://github.com/nodejs/node/pull/50868) +* \[[`38fd0ca753`](https://github.com/nodejs/node/commit/38fd0ca753)] - **benchmark**: add undici websocket benchmark (Chenyu Yang) [#50586](https://github.com/nodejs/node/pull/50586) +* \[[`b148c43244`](https://github.com/nodejs/node/commit/b148c43244)] - **benchmark**: add create-hash benchmark (Joyee Cheung) [#51026](https://github.com/nodejs/node/pull/51026) +* \[[`fdd8c18f96`](https://github.com/nodejs/node/commit/fdd8c18f96)] - **benchmark**: update interations and len in benchmark/util/text-decoder.js (Lei Shi) [#50938](https://github.com/nodejs/node/pull/50938) +* \[[`a9972057ac`](https://github.com/nodejs/node/commit/a9972057ac)] - **benchmark**: update iterations of benchmark/util/type-check.js (Lei Shi) [#50937](https://github.com/nodejs/node/pull/50937) +* \[[`b80bb1329b`](https://github.com/nodejs/node/commit/b80bb1329b)] - **benchmark**: update iterations in benchmark/util/normalize-encoding.js (Lei Shi) [#50934](https://github.com/nodejs/node/pull/50934) +* \[[`dbee03d646`](https://github.com/nodejs/node/commit/dbee03d646)] - **benchmark**: update iterations in benchmark/util/inspect-array.js (Lei Shi) [#50933](https://github.com/nodejs/node/pull/50933) +* \[[`f2d83a3a84`](https://github.com/nodejs/node/commit/f2d83a3a84)] - **benchmark**: update iterations in benchmark/util/format.js (Lei Shi) [#50932](https://github.com/nodejs/node/pull/50932) +* \[[`2581fce553`](https://github.com/nodejs/node/commit/2581fce553)] - **bootstrap**: improve snapshot unsupported builtin warnings (Joyee Cheung) [#50944](https://github.com/nodejs/node/pull/50944) +* \[[`735bad3694`](https://github.com/nodejs/node/commit/735bad3694)] - **build**: fix warnings from uv for gn build (Cheng Zhao) [#51069](https://github.com/nodejs/node/pull/51069) +* \[[`8da9d969f9`](https://github.com/nodejs/node/commit/8da9d969f9)] - **deps**: V8: cherry-pick 0fd478bcdabd (Joyee Cheung) [#50572](https://github.com/nodejs/node/pull/50572) +* \[[`429fbb37c1`](https://github.com/nodejs/node/commit/429fbb37c1)] - **deps**: update simdjson to v3.6.2 (Yagiz Nizipli) [#50986](https://github.com/nodejs/node/pull/50986) +* \[[`9950103253`](https://github.com/nodejs/node/commit/9950103253)] - **deps**: update zlib to 1.3-22124f5 (Node.js GitHub Bot) [#50910](https://github.com/nodejs/node/pull/50910) +* \[[`0b61823e8b`](https://github.com/nodejs/node/commit/0b61823e8b)] - **deps**: update undici to 5.28.2 (Node.js GitHub Bot) [#51024](https://github.com/nodejs/node/pull/51024) +* \[[`95d8a273cc`](https://github.com/nodejs/node/commit/95d8a273cc)] - **deps**: cherry-pick bfbe4e38d7 from libuv upstream (Abdirahim Musse) [#50650](https://github.com/nodejs/node/pull/50650) +* \[[`06038a489e`](https://github.com/nodejs/node/commit/06038a489e)] - **deps**: update libuv to 1.47.0 (Node.js GitHub Bot) [#50650](https://github.com/nodejs/node/pull/50650) +* \[[`0dd53da722`](https://github.com/nodejs/node/commit/0dd53da722)] - **(SEMVER-MINOR)** **deps**: add simdjson (Yagiz Nizipli) [#50322](https://github.com/nodejs/node/pull/50322) +* \[[`04eaa5cdd7`](https://github.com/nodejs/node/commit/04eaa5cdd7)] - **doc**: run license-builder (github-actions\[bot]) [#51111](https://github.com/nodejs/node/pull/51111) +* \[[`26ed4ad01f`](https://github.com/nodejs/node/commit/26ed4ad01f)] - **doc**: deprecate hash constructor (Marco Ippolito) [#51077](https://github.com/nodejs/node/pull/51077) +* \[[`637ffce4c4`](https://github.com/nodejs/node/commit/637ffce4c4)] - **doc**: add note regarding `--experimental-detect-module` (Shubherthi Mitra) [#51089](https://github.com/nodejs/node/pull/51089) +* \[[`838179b096`](https://github.com/nodejs/node/commit/838179b096)] - **doc**: correct tracingChannel.traceCallback() (Gerhard Stöbich) [#51068](https://github.com/nodejs/node/pull/51068) +* \[[`539bee4f0a`](https://github.com/nodejs/node/commit/539bee4f0a)] - **doc**: use length argument in pbkdf2Key (Tobias Nießen) [#51066](https://github.com/nodejs/node/pull/51066) +* \[[`c45a9a3187`](https://github.com/nodejs/node/commit/c45a9a3187)] - **doc**: add deprecation notice to `dirent.path` (Antoine du Hamel) [#51059](https://github.com/nodejs/node/pull/51059) +* \[[`58ca66a1a7`](https://github.com/nodejs/node/commit/58ca66a1a7)] - **doc**: deprecate `dirent.path` (Antoine du Hamel) [#51020](https://github.com/nodejs/node/pull/51020) +* \[[`c2b6edf9ab`](https://github.com/nodejs/node/commit/c2b6edf9ab)] - **esm**: fix hook name in error message (Bruce MacNaughton) [#50466](https://github.com/nodejs/node/pull/50466) +* \[[`35e8f26f07`](https://github.com/nodejs/node/commit/35e8f26f07)] - **fs**: throw fchownSync error from c++ (Yagiz Nizipli) [#51075](https://github.com/nodejs/node/pull/51075) +* \[[`c3c8237089`](https://github.com/nodejs/node/commit/c3c8237089)] - **fs**: update params in jsdoc for createReadStream and createWriteStream (Jungku Lee) [#51063](https://github.com/nodejs/node/pull/51063) +* \[[`3f7f3ce8c9`](https://github.com/nodejs/node/commit/3f7f3ce8c9)] - **fs**: improve error performance of readvSync (IlyasShabi) [#50100](https://github.com/nodejs/node/pull/50100) +* \[[`7f95926f17`](https://github.com/nodejs/node/commit/7f95926f17)] - **http**: handle multi-value content-disposition header (Arsalan Ahmad) [#50977](https://github.com/nodejs/node/pull/50977) +* \[[`7a8a2d5632`](https://github.com/nodejs/node/commit/7a8a2d5632)] - **lib**: don't parse windows drive letters as schemes (华) [#50580](https://github.com/nodejs/node/pull/50580) +* \[[`aa2be4bb76`](https://github.com/nodejs/node/commit/aa2be4bb76)] - **module**: load source maps in `commonjs` translator (Hiroki Osame) [#51033](https://github.com/nodejs/node/pull/51033) +* \[[`c0e5e74876`](https://github.com/nodejs/node/commit/c0e5e74876)] - **module**: document `parentURL` in register options (Hiroki Osame) [#51039](https://github.com/nodejs/node/pull/51039) +* \[[`4eedf5e694`](https://github.com/nodejs/node/commit/4eedf5e694)] - **module**: fix recently introduced coverity warning (Michael Dawson) [#50843](https://github.com/nodejs/node/pull/50843) +* \[[`9f54987fbc`](https://github.com/nodejs/node/commit/9f54987fbc)] - **module**: merge config with `package_json_reader` (Yagiz Nizipli) [#50322](https://github.com/nodejs/node/pull/50322) +* \[[`5f95dca638`](https://github.com/nodejs/node/commit/5f95dca638)] - **node-api**: introduce experimental feature flags (Gabriel Schulhof) [#50991](https://github.com/nodejs/node/pull/50991) +* \[[`3fb7fc909e`](https://github.com/nodejs/node/commit/3fb7fc909e)] - **quic**: further implementation details (James M Snell) [#48244](https://github.com/nodejs/node/pull/48244) +* \[[`fa25e069fc`](https://github.com/nodejs/node/commit/fa25e069fc)] - **src**: implement countObjectsWithPrototype (Joyee Cheung) [#50572](https://github.com/nodejs/node/pull/50572) +* \[[`abe90527e4`](https://github.com/nodejs/node/commit/abe90527e4)] - **src**: register udp\_wrap external references (Joyee Cheung) [#50943](https://github.com/nodejs/node/pull/50943) +* \[[`84e2f51d14`](https://github.com/nodejs/node/commit/84e2f51d14)] - **src**: register spawn\_sync external references (Joyee Cheung) [#50943](https://github.com/nodejs/node/pull/50943) +* \[[`2cfee53d7b`](https://github.com/nodejs/node/commit/2cfee53d7b)] - **src**: register process\_wrap external references (Joyee Cheung) [#50943](https://github.com/nodejs/node/pull/50943) +* \[[`9b7f79a8bd`](https://github.com/nodejs/node/commit/9b7f79a8bd)] - **src**: fix double free reported by coverity (Michael Dawson) [#51046](https://github.com/nodejs/node/pull/51046) +* \[[`fc5503246e`](https://github.com/nodejs/node/commit/fc5503246e)] - **src**: remove unused headers in `node_file.cc` (Jungku Lee) [#50927](https://github.com/nodejs/node/pull/50927) +* \[[`c3abdc58af`](https://github.com/nodejs/node/commit/c3abdc58af)] - **src**: implement --trace-promises (Joyee Cheung) [#50899](https://github.com/nodejs/node/pull/50899) +* \[[`f90fc83e97`](https://github.com/nodejs/node/commit/f90fc83e97)] - **src**: fix dynamically linked zlib version (Richard Lau) [#51007](https://github.com/nodejs/node/pull/51007) +* \[[`9bf144379f`](https://github.com/nodejs/node/commit/9bf144379f)] - **src**: omit bool values of package.json main field (Yagiz Nizipli) [#50965](https://github.com/nodejs/node/pull/50965) +* \[[`45e4f82912`](https://github.com/nodejs/node/commit/45e4f82912)] - **src**: move package resolver to c++ (Yagiz Nizipli) [#50322](https://github.com/nodejs/node/pull/50322) +* \[[`71acd36778`](https://github.com/nodejs/node/commit/71acd36778)] - **stream**: implement TransformStream cleanup using "transformer.cancel" (Debadree Chatterjee) [#50126](https://github.com/nodejs/node/pull/50126) +* \[[`5112306064`](https://github.com/nodejs/node/commit/5112306064)] - **stream**: fix fd is null when calling clearBuffer (kylo5aby) [#50994](https://github.com/nodejs/node/pull/50994) +* \[[`ed070755ec`](https://github.com/nodejs/node/commit/ed070755ec)] - **test**: deflake test-diagnostics-channel-memory-leak (Joyee Cheung) [#50572](https://github.com/nodejs/node/pull/50572) +* \[[`aee01ff1b4`](https://github.com/nodejs/node/commit/aee01ff1b4)] - **test**: test syncrhnous methods of child\_process in snapshot (Joyee Cheung) [#50943](https://github.com/nodejs/node/pull/50943) +* \[[`cc949869a3`](https://github.com/nodejs/node/commit/cc949869a3)] - **test**: handle relative https redirect (Richard Lau) [#51121](https://github.com/nodejs/node/pull/51121) +* \[[`048349ed4c`](https://github.com/nodejs/node/commit/048349ed4c)] - **test**: fix test runner colored output test (Moshe Atlow) [#51064](https://github.com/nodejs/node/pull/51064) +* \[[`7f5291d783`](https://github.com/nodejs/node/commit/7f5291d783)] - **test**: resolve path of embedtest binary correctly (Cheng Zhao) [#50276](https://github.com/nodejs/node/pull/50276) +* \[[`4ddd0daf5f`](https://github.com/nodejs/node/commit/4ddd0daf5f)] - **test**: escape cwd in regexp (Jérémy Lal) [#50980](https://github.com/nodejs/node/pull/50980) +* \[[`3ccd5faabb`](https://github.com/nodejs/node/commit/3ccd5faabb)] - **test\_runner**: format coverage report for tap reporter (Pulkit Gupta) [#51119](https://github.com/nodejs/node/pull/51119) +* \[[`d5c9adf3df`](https://github.com/nodejs/node/commit/d5c9adf3df)] - **test\_runner**: fix infinite loop when files are undefined in test runner (Pulkit Gupta) [#51047](https://github.com/nodejs/node/pull/51047) +* \[[`328a41701c`](https://github.com/nodejs/node/commit/328a41701c)] - **tools**: update lint-md-dependencies to rollup\@4.7.0 (Node.js GitHub Bot) [#51106](https://github.com/nodejs/node/pull/51106) +* \[[`297cb6f5c2`](https://github.com/nodejs/node/commit/297cb6f5c2)] - **tools**: update doc to highlight.js\@11.9.0 unified\@11.0.4 (Node.js GitHub Bot) [#50459](https://github.com/nodejs/node/pull/50459) +* \[[`4705023343`](https://github.com/nodejs/node/commit/4705023343)] - **tools**: fix simdjson updater (Yagiz Nizipli) [#50986](https://github.com/nodejs/node/pull/50986) +* \[[`c9841583db`](https://github.com/nodejs/node/commit/c9841583db)] - **tools**: update eslint to 8.55.0 (Node.js GitHub Bot) [#51025](https://github.com/nodejs/node/pull/51025) +* \[[`2b4671125e`](https://github.com/nodejs/node/commit/2b4671125e)] - **tools**: update lint-md-dependencies to rollup\@4.6.1 (Node.js GitHub Bot) [#51022](https://github.com/nodejs/node/pull/51022) +* \[[`cd891b37f6`](https://github.com/nodejs/node/commit/cd891b37f6)] - **util**: improve performance of function areSimilarFloatArrays (Liu Jia) [#51040](https://github.com/nodejs/node/pull/51040) +* \[[`e178a43509`](https://github.com/nodejs/node/commit/e178a43509)] - **vm**: use v8::DeserializeInternalFieldsCallback explicitly (Joyee Cheung) [#50984](https://github.com/nodejs/node/pull/50984) +* \[[`fd028e146f`](https://github.com/nodejs/node/commit/fd028e146f)] - **win,tools**: upgrade Windows signing to smctl (Stefan Stojanovic) [#50956](https://github.com/nodejs/node/pull/50956) + + + +## 2023-12-05, Version 21.4.0 (Current), @targos + +### Notable Changes + +This release fixes a regression introduced in v21.3.0 that caused the `fs.writeFileSync` +method to throw when called with `'utf8'` encoding, no flag option, and if the target file didn't exist yet. + +* \[[`32acafeeb6`](https://github.com/nodejs/node/commit/32acafeeb6)] - **(SEMVER-MINOR)** **fs**: introduce `dirent.parentPath` (Antoine du Hamel) [#50976](https://github.com/nodejs/node/pull/50976) +* \[[`724548674d`](https://github.com/nodejs/node/commit/724548674d)] - **fs**: use default w flag for writeFileSync with utf8 encoding (Murilo Kakazu) [#50990](https://github.com/nodejs/node/pull/50990) + +### Commits + +* \[[`b24ee15fb2`](https://github.com/nodejs/node/commit/b24ee15fb2)] - **benchmark**: update iterations in benchmark/crypto/hkdf.js (Lei Shi) [#50866](https://github.com/nodejs/node/pull/50866) +* \[[`f79b54e60e`](https://github.com/nodejs/node/commit/f79b54e60e)] - **benchmark**: update iterations in benchmark/crypto/get-ciphers.js (Lei Shi) [#50863](https://github.com/nodejs/node/pull/50863) +* \[[`dc049acbbb`](https://github.com/nodejs/node/commit/dc049acbbb)] - **benchmark**: update number of iterations for `util.inspect` (kylo5aby) [#50651](https://github.com/nodejs/node/pull/50651) +* \[[`d7c562ae38`](https://github.com/nodejs/node/commit/d7c562ae38)] - **deps**: update googletest to 76bb2af (Node.js GitHub Bot) [#50555](https://github.com/nodejs/node/pull/50555) +* \[[`59a45ddbef`](https://github.com/nodejs/node/commit/59a45ddbef)] - **deps**: update googletest to b10fad3 (Node.js GitHub Bot) [#50555](https://github.com/nodejs/node/pull/50555) +* \[[`099ebdb781`](https://github.com/nodejs/node/commit/099ebdb781)] - **deps**: update undici to 5.28.1 (Node.js GitHub Bot) [#50975](https://github.com/nodejs/node/pull/50975) +* \[[`4b1bed04f7`](https://github.com/nodejs/node/commit/4b1bed04f7)] - **deps**: update undici to 5.28.0 (Node.js GitHub Bot) [#50915](https://github.com/nodejs/node/pull/50915) +* \[[`b281e98b1e`](https://github.com/nodejs/node/commit/b281e98b1e)] - **doc**: add additional details about `--input-type` (Shubham Pandey) [#50796](https://github.com/nodejs/node/pull/50796) +* \[[`b7036f2028`](https://github.com/nodejs/node/commit/b7036f2028)] - **doc**: add procedure when CVEs don't get published (Rafael Gonzaga) [#50945](https://github.com/nodejs/node/pull/50945) +* \[[`7adf239af0`](https://github.com/nodejs/node/commit/7adf239af0)] - **doc**: fix some errors in esm resolution algorithms (Christopher Jeffrey (JJ)) [#50898](https://github.com/nodejs/node/pull/50898) +* \[[`759ebcaead`](https://github.com/nodejs/node/commit/759ebcaead)] - **doc**: reserve 121 for Electron 29 (Shelley Vohr) [#50957](https://github.com/nodejs/node/pull/50957) +* \[[`cedc3427fa`](https://github.com/nodejs/node/commit/cedc3427fa)] - **doc**: run license-builder (github-actions\[bot]) [#50926](https://github.com/nodejs/node/pull/50926) +* \[[`30a6f19769`](https://github.com/nodejs/node/commit/30a6f19769)] - **doc**: document non-node\_modules-only runtime deprecation (Joyee Cheung) [#50748](https://github.com/nodejs/node/pull/50748) +* \[[`eecab883f0`](https://github.com/nodejs/node/commit/eecab883f0)] - **doc**: add doc for Unix abstract socket (theanarkh) [#50904](https://github.com/nodejs/node/pull/50904) +* \[[`ec74b93b38`](https://github.com/nodejs/node/commit/ec74b93b38)] - **doc**: remove flicker on page load on dark theme (Dima Demakov) [#50942](https://github.com/nodejs/node/pull/50942) +* \[[`724548674d`](https://github.com/nodejs/node/commit/724548674d)] - **fs**: use default w flag for writeFileSync with utf8 encoding (Murilo Kakazu) [#50990](https://github.com/nodejs/node/pull/50990) +* \[[`32acafeeb6`](https://github.com/nodejs/node/commit/32acafeeb6)] - **(SEMVER-MINOR)** **fs**: introduce `dirent.parentPath` (Antoine du Hamel) [#50976](https://github.com/nodejs/node/pull/50976) +* \[[`c1ee506454`](https://github.com/nodejs/node/commit/c1ee506454)] - **fs**: remove workaround for `esm` package (Yagiz Nizipli) [#50907](https://github.com/nodejs/node/pull/50907) +* \[[`1cf087dfb3`](https://github.com/nodejs/node/commit/1cf087dfb3)] - **lib**: refactor to use validateFunction in diagnostics\_channel (Deokjin Kim) [#50955](https://github.com/nodejs/node/pull/50955) +* \[[`c37d18d5e1`](https://github.com/nodejs/node/commit/c37d18d5e1)] - **lib**: streamline process.binding() handling (Joyee Cheung) [#50773](https://github.com/nodejs/node/pull/50773) +* \[[`246cf73631`](https://github.com/nodejs/node/commit/246cf73631)] - **lib,src**: replace toUSVString with `toWellFormed()` (Yagiz Nizipli) [#47342](https://github.com/nodejs/node/pull/47342) +* \[[`9bc79173a0`](https://github.com/nodejs/node/commit/9bc79173a0)] - **loader**: speed up line length calc used by moduleProvider (Mudit) [#50969](https://github.com/nodejs/node/pull/50969) +* \[[`812ab9e4f8`](https://github.com/nodejs/node/commit/812ab9e4f8)] - **meta**: bump step-security/harden-runner from 2.6.0 to 2.6.1 (dependabot\[bot]) [#50999](https://github.com/nodejs/node/pull/50999) +* \[[`1dbe1af19a`](https://github.com/nodejs/node/commit/1dbe1af19a)] - **meta**: bump github/codeql-action from 2.22.5 to 2.22.8 (dependabot\[bot]) [#50998](https://github.com/nodejs/node/pull/50998) +* \[[`bed1b93f8a`](https://github.com/nodejs/node/commit/bed1b93f8a)] - **meta**: move one or more collaborators to emeritus (Node.js GitHub Bot) [#50931](https://github.com/nodejs/node/pull/50931) +* \[[`1e7d101428`](https://github.com/nodejs/node/commit/1e7d101428)] - **src**: make ModifyCodeGenerationFromStrings more robust (Joyee Cheung) [#50763](https://github.com/nodejs/node/pull/50763) +* \[[`709ac479eb`](https://github.com/nodejs/node/commit/709ac479eb)] - **src**: disable uncaught exception abortion for ESM syntax detection (Yagiz Nizipli) [#50987](https://github.com/nodejs/node/pull/50987) +* \[[`f6ff11c9f9`](https://github.com/nodejs/node/commit/f6ff11c9f9)] - **src**: fix backtrace with tail \[\[noreturn]] abort (Chengzhong Wu) [#50849](https://github.com/nodejs/node/pull/50849) +* \[[`74f5a1cbc9`](https://github.com/nodejs/node/commit/74f5a1cbc9)] - **src**: print MKSNAPSHOT debug logs to stderr (Joyee Cheung) [#50759](https://github.com/nodejs/node/pull/50759) +* \[[`3a1c664a97`](https://github.com/nodejs/node/commit/3a1c664a97)] - **test**: replace forEach to for.. test-webcrypto-export-import-cfrg.js (Angelo Parziale) [#50785](https://github.com/nodejs/node/pull/50785) +* \[[`ac3a6eefe3`](https://github.com/nodejs/node/commit/ac3a6eefe3)] - **test**: log more information in SEA tests (Joyee Cheung) [#50759](https://github.com/nodejs/node/pull/50759) +* \[[`94462d42f5`](https://github.com/nodejs/node/commit/94462d42f5)] - **test**: consolidate utf8 text fixtures in tests (Joyee Cheung) [#50732](https://github.com/nodejs/node/pull/50732) +* \[[`8e1a70a347`](https://github.com/nodejs/node/commit/8e1a70a347)] - **tools**: add triggers to update release links workflow (Moshe Atlow) [#50974](https://github.com/nodejs/node/pull/50974) +* \[[`ca10cbb774`](https://github.com/nodejs/node/commit/ca10cbb774)] - **tools**: update lint-md-dependencies to rollup\@4.5.2 (Node.js GitHub Bot) [#50913](https://github.com/nodejs/node/pull/50913) +* \[[`1e40c4a366`](https://github.com/nodejs/node/commit/1e40c4a366)] - **tools**: fix current version check (Marco Ippolito) [#50951](https://github.com/nodejs/node/pull/50951) +* \[[`3faed331e1`](https://github.com/nodejs/node/commit/3faed331e1)] - **typings**: fix JSDoc in `internal/modules/esm/hooks` (Alex Yang) [#50887](https://github.com/nodejs/node/pull/50887) +* \[[`6a087ceffa`](https://github.com/nodejs/node/commit/6a087ceffa)] - **url**: throw error if argument length of revokeObjectURL is 0 (DylanTet) [#50433](https://github.com/nodejs/node/pull/50433) + + + +## 2023-11-30, Version 21.3.0 (Current), @RafaelGSS + +### Notable Changes + +#### New `--disable-warning` flag + +This version adds a new `--disable-warning` option that allows users to disable specific warnings either by code +(i.e. DEP0025) or type (i.e. DeprecationWarning, ExperimentalWarning). + +This option works alongside existing `--warnings` and `--no-warnings`. + +For example, the following script will not emit DEP0025 `require('node:sys')` when executed with +`node --disable-warning=DEP0025`: + +```mjs +import sys from 'node:sys'; +``` + +Contributed by Ethan-Arrowood in [#50661](https://github.com/nodejs/node/pull/50661) + +#### Update Root Certificates to NSS 3.95 + +This is the [certdata.txt](https://hg.mozilla.org/projects/nss/raw-file/NSS_3_95_RTM/lib/ckfw/builtins/certdata.txt) from NSS 3.95, released on 2023-11-16. + +This is the version of NSS that will ship in Firefox 121 on +2023-12-19. + +Certificates added: + +* TrustAsia Global Root CA G3 +* TrustAsia Global Root CA G4 +* CommScope Public Trust ECC Root-01 +* CommScope Public Trust ECC Root-02 +* CommScope Public Trust RSA Root-01 +* CommScope Public Trust RSA Root-02 + +Certificates removed: + +* Autoridad de Certificacion Firmaprofesional CIF A62634068 + +#### Fast fs.writeFileSync with UTF-8 Strings + +Enhanced writeFileSync functionality by implementing a highly efficient fast path primarily in C++ for UTF8-encoded string data. +Additionally, optimized the `appendFileSync` method by leveraging the improved `writeFileSync` functionality. +For simplicity and performance considerations, the current implementation supports only string data, +as benchmark results raise concerns about the efficacy of using Buffer for this purpose. +Future optimizations and expansions may be explored, but for now, the focus is on maximizing efficiency for string data operations. + +Contributed by CanadaHonk in [#49884](https://github.com/nodejs/node/pull/49884). + +#### Other Notable Changes + +* \[[`c7a7493ca2`](https://github.com/nodejs/node/commit/c7a7493ca2)] - **(SEMVER-MINOR)** **module**: bootstrap module loaders in shadow realm (Chengzhong Wu) [#48655](https://github.com/nodejs/node/pull/48655) +* \[[`bc3f7b5401`](https://github.com/nodejs/node/commit/bc3f7b5401)] - **(SEMVER-MINOR)** **module**: remove useCustomLoadersIfPresent flag (Chengzhong Wu) [#48655](https://github.com/nodejs/node/pull/48655) +* \[[`aadff07e59`](https://github.com/nodejs/node/commit/aadff07e59)] - **(SEMVER-MINOR)** **src**: create per isolate proxy env template (Chengzhong Wu) [#48655](https://github.com/nodejs/node/pull/48655) +* \[[`91aa9dd23a`](https://github.com/nodejs/node/commit/91aa9dd23a)] - **(SEMVER-MINOR)** **src**: create fs\_dir per isolate properties (Chengzhong Wu) [#48655](https://github.com/nodejs/node/pull/48655) +* \[[`5c5834190a`](https://github.com/nodejs/node/commit/5c5834190a)] - **(SEMVER-MINOR)** **src**: create worker per isolate properties (Chengzhong Wu) [#48655](https://github.com/nodejs/node/pull/48655) +* \[[`4a1ce45181`](https://github.com/nodejs/node/commit/4a1ce45181)] - **(SEMVER-MINOR)** **src**: make process binding data weak (Chengzhong Wu) [#48655](https://github.com/nodejs/node/pull/48655) + +### Commits + +* \[[`4a20912279`](https://github.com/nodejs/node/commit/4a20912279)] - **benchmark**: update iterations in benchmark/util/splice-one.js (Liu Jia) [#50698](https://github.com/nodejs/node/pull/50698) +* \[[`36380eb53d`](https://github.com/nodejs/node/commit/36380eb53d)] - **benchmark**: increase the iteration number to an appropriate value (Lei Shi) [#50766](https://github.com/nodejs/node/pull/50766) +* \[[`23f56d8bb3`](https://github.com/nodejs/node/commit/23f56d8bb3)] - **benchmark**: rewrite import.meta benchmark (Joyee Cheung) [#50683](https://github.com/nodejs/node/pull/50683) +* \[[`f7245d73d9`](https://github.com/nodejs/node/commit/f7245d73d9)] - **benchmark**: add misc/startup-cli-version benchmark (Joyee Cheung) [#50684](https://github.com/nodejs/node/pull/50684) +* \[[`c81d2acfe0`](https://github.com/nodejs/node/commit/c81d2acfe0)] - **benchmark**: remove punycode from require-builtins fixture (Joyee Cheung) [#50689](https://github.com/nodejs/node/pull/50689) +* \[[`5849f09874`](https://github.com/nodejs/node/commit/5849f09874)] - **build**: add GN configurations for simdjson (Cheng Zhao) [#50831](https://github.com/nodejs/node/pull/50831) +* \[[`12605e8f7d`](https://github.com/nodejs/node/commit/12605e8f7d)] - **build**: add configuration flag to enable Maglev (Keyhan Vakil) [#50692](https://github.com/nodejs/node/pull/50692) +* \[[`43da9ea9e5`](https://github.com/nodejs/node/commit/43da9ea9e5)] - **build**: fix GN configuration for deps/base64 (Cheng Zhao) [#50696](https://github.com/nodejs/node/pull/50696) +* \[[`465f75b58a`](https://github.com/nodejs/node/commit/465f75b58a)] - **build**: disable flag v8\_scriptormodule\_legacy\_lifetime (Chengzhong Wu) [#50616](https://github.com/nodejs/node/pull/50616) +* \[[`d2c0dfb1b7`](https://github.com/nodejs/node/commit/d2c0dfb1b7)] - **crypto**: update root certificates to NSS 3.95 (Node.js GitHub Bot) [#50805](https://github.com/nodejs/node/pull/50805) +* \[[`8d3a1d8911`](https://github.com/nodejs/node/commit/8d3a1d8911)] - **deps**: update zlib to 1.2.13.1-motley-5daffc7 (Node.js GitHub Bot) [#50803](https://github.com/nodejs/node/pull/50803) +* \[[`e02f304de7`](https://github.com/nodejs/node/commit/e02f304de7)] - **deps**: V8: cherry-pick 0f9ebbc672c7 (Chengzhong Wu) [#50867](https://github.com/nodejs/node/pull/50867) +* \[[`c31ad5ceaa`](https://github.com/nodejs/node/commit/c31ad5ceaa)] - **deps**: update icu to 74.1 (Node.js GitHub Bot) [#50515](https://github.com/nodejs/node/pull/50515) +* \[[`3ff2bda34e`](https://github.com/nodejs/node/commit/3ff2bda34e)] - **deps**: update ada to 2.7.4 (Node.js GitHub Bot) [#50815](https://github.com/nodejs/node/pull/50815) +* \[[`221f02df6d`](https://github.com/nodejs/node/commit/221f02df6d)] - **deps**: update undici to 5.27.2 (Node.js GitHub Bot) [#50813](https://github.com/nodejs/node/pull/50813) +* \[[`ee69c613a2`](https://github.com/nodejs/node/commit/ee69c613a2)] - **deps**: update minimatch to 9.0.3 (Node.js GitHub Bot) [#50806](https://github.com/nodejs/node/pull/50806) +* \[[`00dab30fd2`](https://github.com/nodejs/node/commit/00dab30fd2)] - **deps**: V8: cherry-pick 475c8cdf9a95 (Keyhan Vakil) [#50680](https://github.com/nodejs/node/pull/50680) +* \[[`a0c01b23b4`](https://github.com/nodejs/node/commit/a0c01b23b4)] - **deps**: update simdutf to 4.0.4 (Node.js GitHub Bot) [#50772](https://github.com/nodejs/node/pull/50772) +* \[[`071e46ae56`](https://github.com/nodejs/node/commit/071e46ae56)] - **deps**: upgrade npm to 10.2.4 (npm team) [#50751](https://github.com/nodejs/node/pull/50751) +* \[[`5d28f8d18f`](https://github.com/nodejs/node/commit/5d28f8d18f)] - **deps**: escape Python strings correctly (Michaël Zasso) [#50695](https://github.com/nodejs/node/pull/50695) +* \[[`3731f836ed`](https://github.com/nodejs/node/commit/3731f836ed)] - **deps**: V8: cherry-pick 8f0b94671ddb (Lu Yahan) [#50654](https://github.com/nodejs/node/pull/50654) +* \[[`6dfe1023c3`](https://github.com/nodejs/node/commit/6dfe1023c3)] - **dns**: call handle.setServers() with a valid array (Luigi Pinca) [#50811](https://github.com/nodejs/node/pull/50811) +* \[[`2f13db475e`](https://github.com/nodejs/node/commit/2f13db475e)] - **doc**: make theme consistent across api and other docs (Dima Demakov) [#50877](https://github.com/nodejs/node/pull/50877) +* \[[`8c4976b732`](https://github.com/nodejs/node/commit/8c4976b732)] - **doc**: add a section regarding `instanceof` in `primordials.md` (Antoine du Hamel) [#50874](https://github.com/nodejs/node/pull/50874) +* \[[`6485687642`](https://github.com/nodejs/node/commit/6485687642)] - **doc**: update email to reflect affiliation (Yagiz Nizipli) [#50856](https://github.com/nodejs/node/pull/50856) +* \[[`bc31375a09`](https://github.com/nodejs/node/commit/bc31375a09)] - **doc**: shard not supported with watch mode (Pulkit Gupta) [#50640](https://github.com/nodejs/node/pull/50640) +* \[[`08c3b0ab20`](https://github.com/nodejs/node/commit/08c3b0ab20)] - **doc**: get rid of unnecessary `eslint-skip` comments (Antoine du Hamel) [#50829](https://github.com/nodejs/node/pull/50829) +* \[[`98fb1faff1`](https://github.com/nodejs/node/commit/98fb1faff1)] - **doc**: create deprecation code for isWebAssemblyCompiledModule (Marco Ippolito) [#50486](https://github.com/nodejs/node/pull/50486) +* \[[`e116fcdb01`](https://github.com/nodejs/node/commit/e116fcdb01)] - **doc**: add CanadaHonk to triagers (CanadaHonk) [#50848](https://github.com/nodejs/node/pull/50848) +* \[[`a37d9ee1e3`](https://github.com/nodejs/node/commit/a37d9ee1e3)] - **doc**: fix typos in --allow-fs-\* (Tobias Nießen) [#50845](https://github.com/nodejs/node/pull/50845) +* \[[`8468daf1a9`](https://github.com/nodejs/node/commit/8468daf1a9)] - **doc**: update Crypto API doc for x509.keyUsage (Daniel Meechan) [#50603](https://github.com/nodejs/node/pull/50603) +* \[[`b4935dde60`](https://github.com/nodejs/node/commit/b4935dde60)] - **doc**: fix fs.writeFileSync return value documentation (Ryan Zimmerman) [#50760](https://github.com/nodejs/node/pull/50760) +* \[[`ead9879a04`](https://github.com/nodejs/node/commit/ead9879a04)] - **doc**: update print results(detail) in `PerformanceEntry` (Jungku Lee) [#50723](https://github.com/nodejs/node/pull/50723) +* \[[`6b7403c5df`](https://github.com/nodejs/node/commit/6b7403c5df)] - **doc**: fix `Buffer.allocUnsafe` documentation (Mert Can Altın) [#50686](https://github.com/nodejs/node/pull/50686) +* \[[`713fdf1fc3`](https://github.com/nodejs/node/commit/713fdf1fc3)] - **doc**: run license-builder (github-actions\[bot]) [#50691](https://github.com/nodejs/node/pull/50691) +* \[[`50f336c06f`](https://github.com/nodejs/node/commit/50f336c06f)] - **esm**: fallback to `getSource` when `load` returns nullish `source` (Antoine du Hamel) [#50825](https://github.com/nodejs/node/pull/50825) +* \[[`bd58870556`](https://github.com/nodejs/node/commit/bd58870556)] - **esm**: do not call `getSource` when format is `commonjs` (Francesco Trotta) [#50465](https://github.com/nodejs/node/pull/50465) +* \[[`e59268a076`](https://github.com/nodejs/node/commit/e59268a076)] - **fs**: add c++ fast path for writeFileSync utf8 (CanadaHonk) [#49884](https://github.com/nodejs/node/pull/49884) +* \[[`483200f68f`](https://github.com/nodejs/node/commit/483200f68f)] - **fs**: improve error performance for `rmdirSync` (CanadaHonk) [#49846](https://github.com/nodejs/node/pull/49846) +* \[[`e4e0add0de`](https://github.com/nodejs/node/commit/e4e0add0de)] - **fs**: fix glob returning duplicates (Moshe Atlow) [#50881](https://github.com/nodejs/node/pull/50881) +* \[[`45b2bb09f2`](https://github.com/nodejs/node/commit/45b2bb09f2)] - **fs**: fix to not return for void function (Jungku Lee) [#50769](https://github.com/nodejs/node/pull/50769) +* \[[`492e3e30b7`](https://github.com/nodejs/node/commit/492e3e30b7)] - **fs**: replace deprecated `path._makeLong` in copyFile (CanadaHonk) [#50844](https://github.com/nodejs/node/pull/50844) +* \[[`9dc4cde75b`](https://github.com/nodejs/node/commit/9dc4cde75b)] - **fs**: improve error perf of sync `lstat`+`fstat` (CanadaHonk) [#49868](https://github.com/nodejs/node/pull/49868) +* \[[`c3eee590be`](https://github.com/nodejs/node/commit/c3eee590be)] - **inspector**: use private fields instead of symbols (Yagiz Nizipli) [#50776](https://github.com/nodejs/node/pull/50776) +* \[[`1a0069b13d`](https://github.com/nodejs/node/commit/1a0069b13d)] - **meta**: clarify nomination process according to Node.js charter (Matteo Collina) [#50834](https://github.com/nodejs/node/pull/50834) +* \[[`65a811a86d`](https://github.com/nodejs/node/commit/65a811a86d)] - **meta**: clarify recommendation for bug reproductions (Antoine du Hamel) [#50882](https://github.com/nodejs/node/pull/50882) +* \[[`5811a59016`](https://github.com/nodejs/node/commit/5811a59016)] - **meta**: move cjihrig to TSC regular member (Colin Ihrig) [#50816](https://github.com/nodejs/node/pull/50816) +* \[[`c7a7493ca2`](https://github.com/nodejs/node/commit/c7a7493ca2)] - **(SEMVER-MINOR)** **module**: bootstrap module loaders in shadow realm (Chengzhong Wu) [#48655](https://github.com/nodejs/node/pull/48655) +* \[[`bc3f7b5401`](https://github.com/nodejs/node/commit/bc3f7b5401)] - **(SEMVER-MINOR)** **module**: remove useCustomLoadersIfPresent flag (Chengzhong Wu) [#48655](https://github.com/nodejs/node/pull/48655) +* \[[`9197b0f2fc`](https://github.com/nodejs/node/commit/9197b0f2fc)] - **net**: check pipe mode and path (theanarkh) [#50770](https://github.com/nodejs/node/pull/50770) +* \[[`673de300b4`](https://github.com/nodejs/node/commit/673de300b4)] - **node-api**: factor out common code into macros (Gabriel Schulhof) [#50664](https://github.com/nodejs/node/pull/50664) +* \[[`aebe2fc702`](https://github.com/nodejs/node/commit/aebe2fc702)] - **perf\_hooks**: implement performance.now() with fast API calls (Joyee Cheung) [#50492](https://github.com/nodejs/node/pull/50492) +* \[[`3fdecc4a8b`](https://github.com/nodejs/node/commit/3fdecc4a8b)] - **permission**: do not create symlinks if target is relative (Tobias Nießen) [#49156](https://github.com/nodejs/node/pull/49156) +* \[[`27a4f58640`](https://github.com/nodejs/node/commit/27a4f58640)] - **permission**: mark const functions as such (Tobias Nießen) [#50705](https://github.com/nodejs/node/pull/50705) +* \[[`feb8ff9427`](https://github.com/nodejs/node/commit/feb8ff9427)] - **src**: assert return value of BN\_bn2binpad (Tobias Nießen) [#50860](https://github.com/nodejs/node/pull/50860) +* \[[`fd9195d750`](https://github.com/nodejs/node/commit/fd9195d750)] - **src**: fix coverity warning (Michael Dawson) [#50846](https://github.com/nodejs/node/pull/50846) +* \[[`adcab85c0c`](https://github.com/nodejs/node/commit/adcab85c0c)] - **src**: fix compatility with upcoming V8 12.1 APIs (Cheng Zhao) [#50709](https://github.com/nodejs/node/pull/50709) +* \[[`79ef39b8c8`](https://github.com/nodejs/node/commit/79ef39b8c8)] - **(SEMVER-MINOR)** **src**: add `--disable-warning` option (Ethan Arrowood) [#50661](https://github.com/nodejs/node/pull/50661) +* \[[`faf6a04ba6`](https://github.com/nodejs/node/commit/faf6a04ba6)] - **src**: add IsolateScopes before using isolates (Keyhan Vakil) [#50680](https://github.com/nodejs/node/pull/50680) +* \[[`eacf4ba485`](https://github.com/nodejs/node/commit/eacf4ba485)] - **src**: iterate on import attributes array correctly (Michaël Zasso) [#50703](https://github.com/nodejs/node/pull/50703) +* \[[`0fb35b6a67`](https://github.com/nodejs/node/commit/0fb35b6a67)] - **src**: avoid copying strings in FSPermission::Apply (Tobias Nießen) [#50662](https://github.com/nodejs/node/pull/50662) +* \[[`83ad272fa6`](https://github.com/nodejs/node/commit/83ad272fa6)] - **src**: remove erroneous default argument in RadixTree (Tobias Nießen) [#50736](https://github.com/nodejs/node/pull/50736) +* \[[`2e8e237ce2`](https://github.com/nodejs/node/commit/2e8e237ce2)] - **src**: fix JSONParser leaking internal V8 scopes (Keyhan Vakil) [#50688](https://github.com/nodejs/node/pull/50688) +* \[[`0d3aa725cf`](https://github.com/nodejs/node/commit/0d3aa725cf)] - **src**: return error --env-file if file is not found (Ardi Nugraha) [#50588](https://github.com/nodejs/node/pull/50588) +* \[[`aadff07e59`](https://github.com/nodejs/node/commit/aadff07e59)] - **(SEMVER-MINOR)** **src**: create per isolate proxy env template (Chengzhong Wu) [#48655](https://github.com/nodejs/node/pull/48655) +* \[[`91aa9dd23a`](https://github.com/nodejs/node/commit/91aa9dd23a)] - **(SEMVER-MINOR)** **src**: create fs\_dir per isolate properties (Chengzhong Wu) [#48655](https://github.com/nodejs/node/pull/48655) +* \[[`5c5834190a`](https://github.com/nodejs/node/commit/5c5834190a)] - **(SEMVER-MINOR)** **src**: create worker per isolate properties (Chengzhong Wu) [#48655](https://github.com/nodejs/node/pull/48655) +* \[[`4a1ce45181`](https://github.com/nodejs/node/commit/4a1ce45181)] - **(SEMVER-MINOR)** **src**: make process binding data weak (Chengzhong Wu) [#48655](https://github.com/nodejs/node/pull/48655) +* \[[`8746073664`](https://github.com/nodejs/node/commit/8746073664)] - **src**: avoid silent coercion to signed/unsigned int (Tobias Nießen) [#50663](https://github.com/nodejs/node/pull/50663) +* \[[`57587de1fa`](https://github.com/nodejs/node/commit/57587de1fa)] - **src**: handle errors from uv\_pipe\_connect2() (Deokjin Kim) [#50657](https://github.com/nodejs/node/pull/50657) +* \[[`e5cce004e8`](https://github.com/nodejs/node/commit/e5cce004e8)] - **stream**: fix enumerability of ReadableStream.from (Mattias Buelens) [#50779](https://github.com/nodejs/node/pull/50779) +* \[[`4522e229c0`](https://github.com/nodejs/node/commit/4522e229c0)] - **stream**: fix enumerability of ReadableStream.prototype.values (Mattias Buelens) [#50779](https://github.com/nodejs/node/pull/50779) +* \[[`2e0abed973`](https://github.com/nodejs/node/commit/2e0abed973)] - **stream**: yield expected Error class on zlib errors (Filip Skokan) [#50712](https://github.com/nodejs/node/pull/50712) +* \[[`a275155e81`](https://github.com/nodejs/node/commit/a275155e81)] - **stream**: add Symbol.toStringTag to Compression Streams (Filip Skokan) [#50712](https://github.com/nodejs/node/pull/50712) +* \[[`146ad9cab0`](https://github.com/nodejs/node/commit/146ad9cab0)] - **stream**: treat compression web stream format per its WebIDL definition (Filip Skokan) [#50631](https://github.com/nodejs/node/pull/50631) +* \[[`087cffc7c2`](https://github.com/nodejs/node/commit/087cffc7c2)] - **test**: fix message v8 not normalising alphanumeric paths (Jithil P Ponnan) [#50730](https://github.com/nodejs/node/pull/50730) +* \[[`7de900a442`](https://github.com/nodejs/node/commit/7de900a442)] - **test**: fix dns test case failures after c-ares update to 1.21.0+ (Brad House) [#50743](https://github.com/nodejs/node/pull/50743) +* \[[`b1b6c44712`](https://github.com/nodejs/node/commit/b1b6c44712)] - **test**: replace forEach with for of (Conor Watson) [#50594](https://github.com/nodejs/node/pull/50594) +* \[[`7f44164ad4`](https://github.com/nodejs/node/commit/7f44164ad4)] - **test**: replace forEach to for at test-webcrypto-sign-verify-ecdsa.js (Alessandro Di Nisio) [#50795](https://github.com/nodejs/node/pull/50795) +* \[[`9d76de1993`](https://github.com/nodejs/node/commit/9d76de1993)] - **test**: replace foreach with for in test-https-simple.js (Shikha Mehta) [#49793](https://github.com/nodejs/node/pull/49793) +* \[[`ce8fc56ee4`](https://github.com/nodejs/node/commit/ce8fc56ee4)] - **test**: add note about unresolved spec issue (Mattias Buelens) [#50779](https://github.com/nodejs/node/pull/50779) +* \[[`628a12ac18`](https://github.com/nodejs/node/commit/628a12ac18)] - **test**: add note about readable streams with type owning (Mattias Buelens) [#50779](https://github.com/nodejs/node/pull/50779) +* \[[`82f0882ce0`](https://github.com/nodejs/node/commit/82f0882ce0)] - **test**: replace forEach with for-of in test-url-relative (vitosorriso) [#50788](https://github.com/nodejs/node/pull/50788) +* \[[`3b7998305d`](https://github.com/nodejs/node/commit/3b7998305d)] - **test**: replace forEach() with for ... of in test-tls-getprotocol.js (Steve Goode) [#50600](https://github.com/nodejs/node/pull/50600) +* \[[`0e4d25eb5c`](https://github.com/nodejs/node/commit/0e4d25eb5c)] - **test**: use requires instead of flaky in console WPT status (Filip Skokan) [#50812](https://github.com/nodejs/node/pull/50812) +* \[[`221952a88e`](https://github.com/nodejs/node/commit/221952a88e)] - **test**: use ppc and ppc64 to skip SEA tests on PowerPC (Joyee Cheung) [#50828](https://github.com/nodejs/node/pull/50828) +* \[[`0e3b714069`](https://github.com/nodejs/node/commit/0e3b714069)] - **test**: enable idlharness tests for encoding (Mattias Buelens) [#50778](https://github.com/nodejs/node/pull/50778) +* \[[`c8d4cd68b4`](https://github.com/nodejs/node/commit/c8d4cd68b4)] - **test**: replace forEach in whatwg-encoding-custom-interop (Honza Machala) [#50607](https://github.com/nodejs/node/pull/50607) +* \[[`f25637b5c9`](https://github.com/nodejs/node/commit/f25637b5c9)] - **test**: update WPT files for WebIDL tests (Filip Skokan) [#50712](https://github.com/nodejs/node/pull/50712) +* \[[`f2e0fce389`](https://github.com/nodejs/node/commit/f2e0fce389)] - **test**: replace forEach() with for-loop (Jan) [#50596](https://github.com/nodejs/node/pull/50596) +* \[[`4b26f14a53`](https://github.com/nodejs/node/commit/4b26f14a53)] - **test**: improve test-bootstrap-modules.js (Joyee Cheung) [#50708](https://github.com/nodejs/node/pull/50708) +* \[[`28d78de0dd`](https://github.com/nodejs/node/commit/28d78de0dd)] - **test**: skip parallel/test-macos-app-sandbox if disk space < 120MB (Joyee Cheung) [#50764](https://github.com/nodejs/node/pull/50764) +* \[[`4088b750e7`](https://github.com/nodejs/node/commit/4088b750e7)] - **test**: mark SEA tests as flaky on PowerPC (Joyee Cheung) [#50750](https://github.com/nodejs/node/pull/50750) +* \[[`6475cee6a4`](https://github.com/nodejs/node/commit/6475cee6a4)] - **test**: give more time to GC in test-shadow-realm-gc-\* (Joyee Cheung) [#50735](https://github.com/nodejs/node/pull/50735) +* \[[`0e8275b610`](https://github.com/nodejs/node/commit/0e8275b610)] - **test**: replace foreach with for (Markus Muschol) [#50599](https://github.com/nodejs/node/pull/50599) +* \[[`377deded59`](https://github.com/nodejs/node/commit/377deded59)] - **test**: test streambase has already has a consumer (Jithil P Ponnan) [#48059](https://github.com/nodejs/node/pull/48059) +* \[[`342a83e728`](https://github.com/nodejs/node/commit/342a83e728)] - **test**: change forEach to for...of in path extname (Kyriakos Markakis) [#50667](https://github.com/nodejs/node/pull/50667) +* \[[`75265e491d`](https://github.com/nodejs/node/commit/75265e491d)] - **test**: replace forEach with for...of (Ryan Williams) [#50611](https://github.com/nodejs/node/pull/50611) +* \[[`982b57651b`](https://github.com/nodejs/node/commit/982b57651b)] - **test**: migrate message v8 tests from Python to JS (Joshua LeMay) [#50421](https://github.com/nodejs/node/pull/50421) +* \[[`7ebc8c2aed`](https://github.com/nodejs/node/commit/7ebc8c2aed)] - **test,stream**: enable compression WPTs (Filip Skokan) [#50631](https://github.com/nodejs/node/pull/50631) +* \[[`0bd694ab64`](https://github.com/nodejs/node/commit/0bd694ab64)] - **test\_runner**: add tests for various mock timer issues (Mika Fischer) [#50384](https://github.com/nodejs/node/pull/50384) +* \[[`dee8039c9b`](https://github.com/nodejs/node/commit/dee8039c9b)] - **tls**: fix order of setting cipher before setting cert and key (Kumar Rishav) [#50186](https://github.com/nodejs/node/pull/50186) +* \[[`5de30531b8`](https://github.com/nodejs/node/commit/5de30531b8)] - **tools**: add macOS notarization verification step (Ulises Gascón) [#50833](https://github.com/nodejs/node/pull/50833) +* \[[`a12d9e03f2`](https://github.com/nodejs/node/commit/a12d9e03f2)] - **tools**: use macOS keychain to notarize the releases (Ulises Gascón) [#50715](https://github.com/nodejs/node/pull/50715) +* \[[`f21637717f`](https://github.com/nodejs/node/commit/f21637717f)] - **tools**: update eslint to 8.54.0 (Node.js GitHub Bot) [#50809](https://github.com/nodejs/node/pull/50809) +* \[[`daa933d93a`](https://github.com/nodejs/node/commit/daa933d93a)] - **tools**: update lint-md-dependencies to rollup\@4.5.0 (Node.js GitHub Bot) [#50807](https://github.com/nodejs/node/pull/50807) +* \[[`52830b71cc`](https://github.com/nodejs/node/commit/52830b71cc)] - **tools**: add workflow to update release links (Michaël Zasso) [#50710](https://github.com/nodejs/node/pull/50710) +* \[[`db8ce5bbdd`](https://github.com/nodejs/node/commit/db8ce5bbdd)] - **tools**: recognize GN files in dep\_updaters (Cheng Zhao) [#50693](https://github.com/nodejs/node/pull/50693) +* \[[`5ef6729b66`](https://github.com/nodejs/node/commit/5ef6729b66)] - **tools**: remove unused file (Ulises Gascon) [#50622](https://github.com/nodejs/node/pull/50622) +* \[[`c49483820a`](https://github.com/nodejs/node/commit/c49483820a)] - **tools**: change minimatch install strategy (Marco Ippolito) [#50476](https://github.com/nodejs/node/pull/50476) +* \[[`0d556d9a59`](https://github.com/nodejs/node/commit/0d556d9a59)] - **tools**: update lint-md-dependencies to rollup\@4.3.1 (Node.js GitHub Bot) [#50675](https://github.com/nodejs/node/pull/50675) +* \[[`eaa4c14e6b`](https://github.com/nodejs/node/commit/eaa4c14e6b)] - **util**: improve performance of normalizeEncoding (kylo5aby) [#50721](https://github.com/nodejs/node/pull/50721) +* \[[`a5d959b765`](https://github.com/nodejs/node/commit/a5d959b765)] - **v8,tools**: expose necessary V8 defines (Cheng Zhao) [#50820](https://github.com/nodejs/node/pull/50820) + + + +## 2023-11-14, Version 21.2.0 (Current), @targos + +### Notable Changes + +* \[[`e25c65ee2f`](https://github.com/nodejs/node/commit/e25c65ee2f)] - **doc**: add MrJithil to collaborators (Jithil P Ponnan) [#50666](https://github.com/nodejs/node/pull/50666) +* \[[`f2366573f9`](https://github.com/nodejs/node/commit/f2366573f9)] - **doc**: add Ethan-Arrowood as a collaborator (Ethan Arrowood) [#50393](https://github.com/nodejs/node/pull/50393) +* \[[`eac9cc5fcb`](https://github.com/nodejs/node/commit/eac9cc5fcb)] - **(SEMVER-MINOR)** **esm**: add import.meta.dirname and import.meta.filename (James Sumners) [#48740](https://github.com/nodejs/node/pull/48740) +* \[[`7e151114b1`](https://github.com/nodejs/node/commit/7e151114b1)] - **fs**: add stacktrace to fs/promises (翠 / green) [#49849](https://github.com/nodejs/node/pull/49849) +* \[[`6dbb280733`](https://github.com/nodejs/node/commit/6dbb280733)] - **(SEMVER-MINOR)** **lib**: add `--no-experimental-global-navigator` CLI flag (Antoine du Hamel) [#50562](https://github.com/nodejs/node/pull/50562) +* \[[`03c730b931`](https://github.com/nodejs/node/commit/03c730b931)] - **(SEMVER-MINOR)** **lib**: add navigator.language & navigator.languages (Aras Abbasi) [#50303](https://github.com/nodejs/node/pull/50303) +* \[[`f932f4c518`](https://github.com/nodejs/node/commit/f932f4c518)] - **(SEMVER-MINOR)** **lib**: add navigator.platform (Aras Abbasi) [#50385](https://github.com/nodejs/node/pull/50385) +* \[[`91f37d1dc3`](https://github.com/nodejs/node/commit/91f37d1dc3)] - **(SEMVER-MINOR)** **stream**: add support for `deflate-raw` format to webstreams compression (Damian Krzeminski) [#50097](https://github.com/nodejs/node/pull/50097) +* \[[`65850a67c7`](https://github.com/nodejs/node/commit/65850a67c7)] - **stream**: use Array for Readable buffer (Robert Nagy) [#50341](https://github.com/nodejs/node/pull/50341) +* \[[`e433fa54b7`](https://github.com/nodejs/node/commit/e433fa54b7)] - **stream**: optimize creation (Robert Nagy) [#50337](https://github.com/nodejs/node/pull/50337) +* \[[`c9b92bba58`](https://github.com/nodejs/node/commit/c9b92bba58)] - **(SEMVER-MINOR)** **test\_runner**: adds built in lcov reporter (Phil Nash) [#50018](https://github.com/nodejs/node/pull/50018) +* \[[`f6c496563e`](https://github.com/nodejs/node/commit/f6c496563e)] - **(SEMVER-MINOR)** **test\_runner**: add Date to the supported mock APIs (Lucas Santos) [#48638](https://github.com/nodejs/node/pull/48638) +* \[[`05e8b6ef20`](https://github.com/nodejs/node/commit/05e8b6ef20)] - **(SEMVER-MINOR)** **test\_runner, cli**: add --test-timeout flag (Shubham Pandey) [#50443](https://github.com/nodejs/node/pull/50443) + +### Commits + +* \[[`065d8844c5`](https://github.com/nodejs/node/commit/065d8844c5)] - **benchmark**: change iterations in benchmark/es/string-concatenations.js (Liu Jia) [#50585](https://github.com/nodejs/node/pull/50585) +* \[[`3f37ed9f0f`](https://github.com/nodejs/node/commit/3f37ed9f0f)] - **benchmark**: add benchmarks for encodings (Aras Abbasi) [#50348](https://github.com/nodejs/node/pull/50348) +* \[[`c4b6e1e9e4`](https://github.com/nodejs/node/commit/c4b6e1e9e4)] - **benchmark**: add more cases to Readable.from (Raz Luvaton) [#50351](https://github.com/nodejs/node/pull/50351) +* \[[`2006b57a9a`](https://github.com/nodejs/node/commit/2006b57a9a)] - **benchmark**: skip test-benchmark-os on IBMi (Michael Dawson) [#50286](https://github.com/nodejs/node/pull/50286) +* \[[`800206b04a`](https://github.com/nodejs/node/commit/800206b04a)] - **benchmark**: move permission-fs-read to permission-processhas-fs-read (Aki Hasegawa-Johnson) [#49770](https://github.com/nodejs/node/pull/49770) +* \[[`3bedaf9405`](https://github.com/nodejs/node/commit/3bedaf9405)] - **buffer**: improve Buffer.equals performance (kylo5aby) [#50621](https://github.com/nodejs/node/pull/50621) +* \[[`b9f3613908`](https://github.com/nodejs/node/commit/b9f3613908)] - **build**: add GN build files (Cheng Zhao) [#47637](https://github.com/nodejs/node/pull/47637) +* \[[`22eb0257d8`](https://github.com/nodejs/node/commit/22eb0257d8)] - **build**: fix build with Python 3.12 (Luigi Pinca) [#50582](https://github.com/nodejs/node/pull/50582) +* \[[`642c057299`](https://github.com/nodejs/node/commit/642c057299)] - **build**: support Python 3.12 (Shi Pujin) [#50209](https://github.com/nodejs/node/pull/50209) +* \[[`54ebfc10cb`](https://github.com/nodejs/node/commit/54ebfc10cb)] - **build**: fix building when there is only python3 (Cheng Zhao) [#48462](https://github.com/nodejs/node/pull/48462) +* \[[`5073a3e16d`](https://github.com/nodejs/node/commit/5073a3e16d)] - **deps**: update base64 to 0.5.1 (Node.js GitHub Bot) [#50629](https://github.com/nodejs/node/pull/50629) +* \[[`f70a59f4fa`](https://github.com/nodejs/node/commit/f70a59f4fa)] - **deps**: update corepack to 0.23.0 (Node.js GitHub Bot) [#50563](https://github.com/nodejs/node/pull/50563) +* \[[`78b3432be5`](https://github.com/nodejs/node/commit/78b3432be5)] - **deps**: V8: cherry-pick 13192d6e10fa (Levi Zim) [#50552](https://github.com/nodejs/node/pull/50552) +* \[[`93e3cc3907`](https://github.com/nodejs/node/commit/93e3cc3907)] - **deps**: upgrade npm to 10.2.3 (npm team) [#50531](https://github.com/nodejs/node/pull/50531) +* \[[`189e5e5326`](https://github.com/nodejs/node/commit/189e5e5326)] - **deps**: update nghttp2 to 1.58.0 (Node.js GitHub Bot) [#50441](https://github.com/nodejs/node/pull/50441) +* \[[`57bfe53095`](https://github.com/nodejs/node/commit/57bfe53095)] - **deps**: update zlib to 1.2.13.1-motley-dfc48fc (Node.js GitHub Bot) [#50456](https://github.com/nodejs/node/pull/50456) +* \[[`1e6922e67a`](https://github.com/nodejs/node/commit/1e6922e67a)] - **deps**: patch V8 to 11.8.172.17 (Michaël Zasso) [#50292](https://github.com/nodejs/node/pull/50292) +* \[[`28453ff966`](https://github.com/nodejs/node/commit/28453ff966)] - **deps**: update acorn to 8.11.2 (Node.js GitHub Bot) [#50460](https://github.com/nodejs/node/pull/50460) +* \[[`0a793a2566`](https://github.com/nodejs/node/commit/0a793a2566)] - **deps**: update undici to 5.27.0 (Node.js GitHub Bot) [#50463](https://github.com/nodejs/node/pull/50463) +* \[[`a90c6d669c`](https://github.com/nodejs/node/commit/a90c6d669c)] - **deps**: update archs files for openssl-3.0.12+quic1 (Node.js GitHub Bot) [#50411](https://github.com/nodejs/node/pull/50411) +* \[[`a64217c116`](https://github.com/nodejs/node/commit/a64217c116)] - **deps**: upgrade openssl sources to quictls/openssl-3.0.12+quic1 (Node.js GitHub Bot) [#50411](https://github.com/nodejs/node/pull/50411) +* \[[`62515e118c`](https://github.com/nodejs/node/commit/62515e118c)] - **deps**: update llhttp to 9.1.3 (Node.js GitHub Bot) [#50080](https://github.com/nodejs/node/pull/50080) +* \[[`d6f49c7bdc`](https://github.com/nodejs/node/commit/d6f49c7bdc)] - **deps**: update googletest to 116b7e5 (Node.js GitHub Bot) [#50324](https://github.com/nodejs/node/pull/50324) +* \[[`e25c65ee2f`](https://github.com/nodejs/node/commit/e25c65ee2f)] - **doc**: add MrJithil to collaborators (Jithil P Ponnan) [#50666](https://github.com/nodejs/node/pull/50666) +* \[[`8be0efd68f`](https://github.com/nodejs/node/commit/8be0efd68f)] - **doc**: fix typo in fs.md (fwio) [#50570](https://github.com/nodejs/node/pull/50570) +* \[[`a656bf2dee`](https://github.com/nodejs/node/commit/a656bf2dee)] - **doc**: add missing description of argument in `subtle.encrypt` (Deokjin Kim) [#50578](https://github.com/nodejs/node/pull/50578) +* \[[`4cbe44ed6f`](https://github.com/nodejs/node/commit/4cbe44ed6f)] - **doc**: update pm documentation to include resource (Ranieri Innocenti Spada) [#50601](https://github.com/nodejs/node/pull/50601) +* \[[`479c1ea9fe`](https://github.com/nodejs/node/commit/479c1ea9fe)] - **doc**: correct attribution in v20.6.0 changelog (Jacob Smith) [#50564](https://github.com/nodejs/node/pull/50564) +* \[[`1668798902`](https://github.com/nodejs/node/commit/1668798902)] - **doc**: update to align `console.table` row to the left (Jungku Lee) [#50553](https://github.com/nodejs/node/pull/50553) +* \[[`886fc48f87`](https://github.com/nodejs/node/commit/886fc48f87)] - **doc**: underline links (Rich Trott) [#50481](https://github.com/nodejs/node/pull/50481) +* \[[`98cfa3a72b`](https://github.com/nodejs/node/commit/98cfa3a72b)] - **doc**: recommend supported Python versions (Luigi Pinca) [#50407](https://github.com/nodejs/node/pull/50407) +* \[[`921e36ece9`](https://github.com/nodejs/node/commit/921e36ece9)] - **doc**: remove duplicate word (Gerhard Stöbich) [#50475](https://github.com/nodejs/node/pull/50475) +* \[[`43074ee21c`](https://github.com/nodejs/node/commit/43074ee21c)] - **doc**: fix typo in `webstreams.md` (André Santos) [#50426](https://github.com/nodejs/node/pull/50426) +* \[[`0b11bf16e8`](https://github.com/nodejs/node/commit/0b11bf16e8)] - **doc**: update notable changes in v21.1.0 (Joyee Cheung) [#50388](https://github.com/nodejs/node/pull/50388) +* \[[`d62e81229c`](https://github.com/nodejs/node/commit/d62e81229c)] - **doc**: add information about Node-API versions >=9 (Michael Dawson) [#50168](https://github.com/nodejs/node/pull/50168) +* \[[`f2366573f9`](https://github.com/nodejs/node/commit/f2366573f9)] - **doc**: add Ethan-Arrowood as a collaborator (Ethan Arrowood) [#50393](https://github.com/nodejs/node/pull/50393) +* \[[`d9f92bc042`](https://github.com/nodejs/node/commit/d9f92bc042)] - **doc**: fix TOC in `releases.md` (Bryce Seefieldt) [#50372](https://github.com/nodejs/node/pull/50372) +* \[[`14e3675b13`](https://github.com/nodejs/node/commit/14e3675b13)] - **errors**: improve hideStackFrames (Aras Abbasi) [#49990](https://github.com/nodejs/node/pull/49990) +* \[[`09c02ed26b`](https://github.com/nodejs/node/commit/09c02ed26b)] - **esm**: bypass CJS loader in default load under `--default-type=module` (Antoine du Hamel) [#50004](https://github.com/nodejs/node/pull/50004) +* \[[`eac9cc5fcb`](https://github.com/nodejs/node/commit/eac9cc5fcb)] - **(SEMVER-MINOR)** **esm**: add import.meta.dirname and import.meta.filename (James Sumners) [#48740](https://github.com/nodejs/node/pull/48740) +* \[[`44f19ce394`](https://github.com/nodejs/node/commit/44f19ce394)] - **fs**: update param in jsdoc for `readdir` (Jungku Lee) [#50448](https://github.com/nodejs/node/pull/50448) +* \[[`7e151114b1`](https://github.com/nodejs/node/commit/7e151114b1)] - **fs**: add stacktrace to fs/promises (翠 / green) [#49849](https://github.com/nodejs/node/pull/49849) +* \[[`3e7226a12f`](https://github.com/nodejs/node/commit/3e7226a12f)] - **fs**: do not throw error on cpSync internals (Yagiz Nizipli) [#50185](https://github.com/nodejs/node/pull/50185) +* \[[`67cbe1b80f`](https://github.com/nodejs/node/commit/67cbe1b80f)] - **fs,url**: move `FromNamespacedPath` to `node_url` (Yagiz Nizipli) [#50090](https://github.com/nodejs/node/pull/50090) +* \[[`b4db32e9cb`](https://github.com/nodejs/node/commit/b4db32e9cb)] - **fs,url**: refactor `FileURLToPath` method (Yagiz Nizipli) [#50090](https://github.com/nodejs/node/pull/50090) +* \[[`4345ee2ede`](https://github.com/nodejs/node/commit/4345ee2ede)] - **fs,url**: move `FileURLToPath` to node\_url (Yagiz Nizipli) [#50090](https://github.com/nodejs/node/pull/50090) +* \[[`ed293fc520`](https://github.com/nodejs/node/commit/ed293fc520)] - **lib**: remove deprecated string methods (Jithil P Ponnan) [#50592](https://github.com/nodejs/node/pull/50592) +* \[[`363bc46b92`](https://github.com/nodejs/node/commit/363bc46b92)] - **lib**: fix assert shows diff messages in ESM and CJS (Jithil P Ponnan) [#50634](https://github.com/nodejs/node/pull/50634) +* \[[`5fa40bea9e`](https://github.com/nodejs/node/commit/5fa40bea9e)] - **lib**: make event static properties non writable and configurable (Muthukumar) [#50425](https://github.com/nodejs/node/pull/50425) +* \[[`6dbb280733`](https://github.com/nodejs/node/commit/6dbb280733)] - **(SEMVER-MINOR)** **lib**: add `--no-experimental-global-navigator` CLI flag (Antoine du Hamel) [#50562](https://github.com/nodejs/node/pull/50562) +* \[[`03c730b931`](https://github.com/nodejs/node/commit/03c730b931)] - **(SEMVER-MINOR)** **lib**: add navigator.language & navigator.languages (Aras Abbasi) [#50303](https://github.com/nodejs/node/pull/50303) +* \[[`f932f4c518`](https://github.com/nodejs/node/commit/f932f4c518)] - **(SEMVER-MINOR)** **lib**: add navigator.platform (Aras Abbasi) [#50385](https://github.com/nodejs/node/pull/50385) +* \[[`c9bd0c5000`](https://github.com/nodejs/node/commit/c9bd0c5000)] - **lib**: use primordials for navigator.userAgent (Aras Abbasi) [#50467](https://github.com/nodejs/node/pull/50467) +* \[[`6dabe7cf60`](https://github.com/nodejs/node/commit/6dabe7cf60)] - **lib**: avoid memory allocation on nodeprecation flag (Vinicius Lourenço) [#50231](https://github.com/nodejs/node/pull/50231) +* \[[`3615a61ac8`](https://github.com/nodejs/node/commit/3615a61ac8)] - **lib**: align console.table row to the left (Jithil P Ponnan) [#50135](https://github.com/nodejs/node/pull/50135) +* \[[`9e7131ffda`](https://github.com/nodejs/node/commit/9e7131ffda)] - **meta**: add web-standards as WPTs owner (Filip Skokan) [#50636](https://github.com/nodejs/node/pull/50636) +* \[[`dedfb5ab26`](https://github.com/nodejs/node/commit/dedfb5ab26)] - **meta**: bump github/codeql-action from 2.21.9 to 2.22.5 (dependabot\[bot]) [#50513](https://github.com/nodejs/node/pull/50513) +* \[[`4e83036d89`](https://github.com/nodejs/node/commit/4e83036d89)] - **meta**: bump step-security/harden-runner from 2.5.1 to 2.6.0 (dependabot\[bot]) [#50512](https://github.com/nodejs/node/pull/50512) +* \[[`4bf9cffa95`](https://github.com/nodejs/node/commit/4bf9cffa95)] - **meta**: bump ossf/scorecard-action from 2.2.0 to 2.3.1 (dependabot\[bot]) [#50509](https://github.com/nodejs/node/pull/50509) +* \[[`49cce7634b`](https://github.com/nodejs/node/commit/49cce7634b)] - **meta**: fix spacing in collaborator list (Antoine du Hamel) [#50641](https://github.com/nodejs/node/pull/50641) +* \[[`12e54e360c`](https://github.com/nodejs/node/commit/12e54e360c)] - **meta**: bump actions/setup-python from 4.7.0 to 4.7.1 (dependabot\[bot]) [#50510](https://github.com/nodejs/node/pull/50510) +* \[[`85a527e6e0`](https://github.com/nodejs/node/commit/85a527e6e0)] - **meta**: add crypto as crypto and webcrypto docs owner (Filip Skokan) [#50579](https://github.com/nodejs/node/pull/50579) +* \[[`ff9b3bdf34`](https://github.com/nodejs/node/commit/ff9b3bdf34)] - **meta**: bump actions/setup-node from 3.8.1 to 4.0.0 (dependabot\[bot]) [#50514](https://github.com/nodejs/node/pull/50514) +* \[[`840303078f`](https://github.com/nodejs/node/commit/840303078f)] - **meta**: bump actions/checkout from 4.1.0 to 4.1.1 (dependabot\[bot]) [#50511](https://github.com/nodejs/node/pull/50511) +* \[[`c9e6e4e739`](https://github.com/nodejs/node/commit/c9e6e4e739)] - **meta**: add to mailmap (Ethan Arrowood) [#50491](https://github.com/nodejs/node/pull/50491) +* \[[`d94010b745`](https://github.com/nodejs/node/commit/d94010b745)] - **meta**: add web-standards as web api visibility owner (Chengzhong Wu) [#50418](https://github.com/nodejs/node/pull/50418) +* \[[`e008336b17`](https://github.com/nodejs/node/commit/e008336b17)] - **meta**: mention other notable changes section (Rafael Gonzaga) [#50309](https://github.com/nodejs/node/pull/50309) +* \[[`3606a0a848`](https://github.com/nodejs/node/commit/3606a0a848)] - **module**: execute `--import` sequentially (Antoine du Hamel) [#50474](https://github.com/nodejs/node/pull/50474) +* \[[`667d245e75`](https://github.com/nodejs/node/commit/667d245e75)] - **module**: add application/json in accept header when fetching json module (Marco Ippolito) [#50119](https://github.com/nodejs/node/pull/50119) +* \[[`905ca00cbc`](https://github.com/nodejs/node/commit/905ca00cbc)] - **perf\_hooks**: reduce overhead of createHistogram (Vinícius Lourenço) [#50074](https://github.com/nodejs/node/pull/50074) +* \[[`7c35055c8e`](https://github.com/nodejs/node/commit/7c35055c8e)] - **permission**: address coverity warning (Michael Dawson) [#50215](https://github.com/nodejs/node/pull/50215) +* \[[`b740324f7c`](https://github.com/nodejs/node/commit/b740324f7c)] - **src**: use v8::Isolate::TryGetCurrent() in DumpJavaScriptBacktrace() (Joyee Cheung) [#50518](https://github.com/nodejs/node/pull/50518) +* \[[`6e20e083dd`](https://github.com/nodejs/node/commit/6e20e083dd)] - **src**: print more information in C++ assertions (Joyee Cheung) [#50242](https://github.com/nodejs/node/pull/50242) +* \[[`9f55dfc266`](https://github.com/nodejs/node/commit/9f55dfc266)] - **src**: hide node::credentials::HasOnly outside unit (Tobias Nießen) [#50450](https://github.com/nodejs/node/pull/50450) +* \[[`4eb74a2c24`](https://github.com/nodejs/node/commit/4eb74a2c24)] - **src**: readiterable entries may be empty (Matthew Aitken) [#50398](https://github.com/nodejs/node/pull/50398) +* \[[`5b453d45d6`](https://github.com/nodejs/node/commit/5b453d45d6)] - **src**: implement structuredClone in native (Joyee Cheung) [#50330](https://github.com/nodejs/node/pull/50330) +* \[[`f1d79b3cbb`](https://github.com/nodejs/node/commit/f1d79b3cbb)] - **src**: use find instead of char-by-char in FromFilePath() (Daniel Lemire) [#50288](https://github.com/nodejs/node/pull/50288) +* \[[`541bdf1e92`](https://github.com/nodejs/node/commit/541bdf1e92)] - **src**: add commit hash shorthand in zlib version (Jithil P Ponnan) [#50158](https://github.com/nodejs/node/pull/50158) +* \[[`91f37d1dc3`](https://github.com/nodejs/node/commit/91f37d1dc3)] - **(SEMVER-MINOR)** **stream**: add support for `deflate-raw` format to webstreams compression (Damian Krzeminski) [#50097](https://github.com/nodejs/node/pull/50097) +* \[[`360f5d9088`](https://github.com/nodejs/node/commit/360f5d9088)] - **stream**: fix Writable.destroy performance regression (Robert Nagy) [#50478](https://github.com/nodejs/node/pull/50478) +* \[[`0116ae7601`](https://github.com/nodejs/node/commit/0116ae7601)] - **stream**: pre-allocate \_events (Robert Nagy) [#50428](https://github.com/nodejs/node/pull/50428) +* \[[`2c0d88e83e`](https://github.com/nodejs/node/commit/2c0d88e83e)] - **stream**: remove no longer relevant comment (Robert Nagy) [#50446](https://github.com/nodejs/node/pull/50446) +* \[[`03c4ff760d`](https://github.com/nodejs/node/commit/03c4ff760d)] - **stream**: use bit fields for construct/destroy (Robert Nagy) [#50408](https://github.com/nodejs/node/pull/50408) +* \[[`e20b272d46`](https://github.com/nodejs/node/commit/e20b272d46)] - **stream**: improve from perf (Raz Luvaton) [#50359](https://github.com/nodejs/node/pull/50359) +* \[[`893024cb7c`](https://github.com/nodejs/node/commit/893024cb7c)] - **stream**: avoid calls to listenerCount (Robert Nagy) [#50357](https://github.com/nodejs/node/pull/50357) +* \[[`586ec48e5f`](https://github.com/nodejs/node/commit/586ec48e5f)] - **stream**: readable use bitmap accessors (Robert Nagy) [#50350](https://github.com/nodejs/node/pull/50350) +* \[[`65850a67c7`](https://github.com/nodejs/node/commit/65850a67c7)] - **stream**: use Array for Readable buffer (Robert Nagy) [#50341](https://github.com/nodejs/node/pull/50341) +* \[[`e433fa54b7`](https://github.com/nodejs/node/commit/e433fa54b7)] - **stream**: optimize creation (Robert Nagy) [#50337](https://github.com/nodejs/node/pull/50337) +* \[[`f56ae67c7b`](https://github.com/nodejs/node/commit/f56ae67c7b)] - **stream**: refactor writable \_write (Robert Nagy) [#50198](https://github.com/nodejs/node/pull/50198) +* \[[`766bd9c8cc`](https://github.com/nodejs/node/commit/766bd9c8cc)] - **stream**: avoid getter for defaultEncoding (Robert Nagy) [#50203](https://github.com/nodejs/node/pull/50203) +* \[[`8be718a0bd`](https://github.com/nodejs/node/commit/8be718a0bd)] - **test**: use destructuring for accessing setting values (Honza Jedlička) [#50609](https://github.com/nodejs/node/pull/50609) +* \[[`b701567a46`](https://github.com/nodejs/node/commit/b701567a46)] - **test**: replace forEach() with for .. of (Evgenia Blajer) [#50605](https://github.com/nodejs/node/pull/50605) +* \[[`e978fd4375`](https://github.com/nodejs/node/commit/e978fd4375)] - **test**: replace forEach() with for ... of in test-readline-keys.js (William Liang) [#50604](https://github.com/nodejs/node/pull/50604) +* \[[`bc92be4ca9`](https://github.com/nodejs/node/commit/bc92be4ca9)] - **test**: replace forEach() with for ... of in test-http2-single-headers.js (spiritualized) [#50606](https://github.com/nodejs/node/pull/50606) +* \[[`864cd32003`](https://github.com/nodejs/node/commit/864cd32003)] - **test**: replace forEach with for of (john-mcinall) [#50602](https://github.com/nodejs/node/pull/50602) +* \[[`2fdcf5c3da`](https://github.com/nodejs/node/commit/2fdcf5c3da)] - **test**: remove unused file (James Sumners) [#50528](https://github.com/nodejs/node/pull/50528) +* \[[`2eeda3f09b`](https://github.com/nodejs/node/commit/2eeda3f09b)] - **test**: replace forEach with for of (Kevin Kühnemund) [#50597](https://github.com/nodejs/node/pull/50597) +* \[[`1d52a57cba`](https://github.com/nodejs/node/commit/1d52a57cba)] - **test**: replace forEach with for of (CorrWu) [#49785](https://github.com/nodejs/node/pull/49785) +* \[[`52b517f4ec`](https://github.com/nodejs/node/commit/52b517f4ec)] - **test**: replace forEach with for \[...] of (Gabriel Bota) [#50615](https://github.com/nodejs/node/pull/50615) +* \[[`931e1e756a`](https://github.com/nodejs/node/commit/931e1e756a)] - **test**: relax version check with shared OpenSSL (Luigi Pinca) [#50505](https://github.com/nodejs/node/pull/50505) +* \[[`6ed8fbf612`](https://github.com/nodejs/node/commit/6ed8fbf612)] - **test**: add WPT report test duration (Filip Skokan) [#50574](https://github.com/nodejs/node/pull/50574) +* \[[`7c7be517b4`](https://github.com/nodejs/node/commit/7c7be517b4)] - **test**: replace forEach() with for ... of loop in test-global.js (Kajol) [#49772](https://github.com/nodejs/node/pull/49772) +* \[[`de46a346ab`](https://github.com/nodejs/node/commit/de46a346ab)] - **test**: skip test-diagnostics-channel-memory-leak.js (Joyee Cheung) [#50327](https://github.com/nodejs/node/pull/50327) +* \[[`8487cac24c`](https://github.com/nodejs/node/commit/8487cac24c)] - **test**: improve `UV_THREADPOOL_SIZE` tests on `.env` (Yagiz Nizipli) [#49213](https://github.com/nodejs/node/pull/49213) +* \[[`ee751102a4`](https://github.com/nodejs/node/commit/ee751102a4)] - **test**: recognize wpt completion error (Chengzhong Wu) [#50429](https://github.com/nodejs/node/pull/50429) +* \[[`7e3eb02252`](https://github.com/nodejs/node/commit/7e3eb02252)] - **test**: report error wpt test results (Chengzhong Wu) [#50429](https://github.com/nodejs/node/pull/50429) +* \[[`90833a89a9`](https://github.com/nodejs/node/commit/90833a89a9)] - **test**: replace forEach() with for...of (Ram) [#49794](https://github.com/nodejs/node/pull/49794) +* \[[`f40435d143`](https://github.com/nodejs/node/commit/f40435d143)] - **test**: replace forEach() with for...of in test-trace-events-http (Chand) [#49795](https://github.com/nodejs/node/pull/49795) +* \[[`f70a2dd70d`](https://github.com/nodejs/node/commit/f70a2dd70d)] - **test**: fix testsuite against zlib version 1.3 (Dominique Leuenberger) [#50364](https://github.com/nodejs/node/pull/50364) +* \[[`d24de129a7`](https://github.com/nodejs/node/commit/d24de129a7)] - **test**: replace forEach with for...of in test-fs-realpath-buffer-encoding (Niya Shiyas) [#49804](https://github.com/nodejs/node/pull/49804) +* \[[`2b6d283265`](https://github.com/nodejs/node/commit/2b6d283265)] - **test**: fix timeout of test-cpu-prof-dir-worker.js in LoongArch devices (Shi Pujin) [#50363](https://github.com/nodejs/node/pull/50363) +* \[[`bd5b61fa6c`](https://github.com/nodejs/node/commit/bd5b61fa6c)] - **test**: fix crypto-dh error message for OpenSSL 3.x (Kerem Kat) [#50395](https://github.com/nodejs/node/pull/50395) +* \[[`aa86c78a9c`](https://github.com/nodejs/node/commit/aa86c78a9c)] - **test**: fix vm assertion actual and expected order (Chengzhong Wu) [#50371](https://github.com/nodejs/node/pull/50371) +* \[[`ab9cad8107`](https://github.com/nodejs/node/commit/ab9cad8107)] - **test**: v8: Add test-linux-perf-logger test suite (Luke Albao) [#50352](https://github.com/nodejs/node/pull/50352) +* \[[`31cd05c39f`](https://github.com/nodejs/node/commit/31cd05c39f)] - **test**: ensure never settling promises are detected (Antoine du Hamel) [#50318](https://github.com/nodejs/node/pull/50318) +* \[[`ad316419dd`](https://github.com/nodejs/node/commit/ad316419dd)] - **test**: avoid v8 deadcode on performance function (Vinícius Lourenço) [#50074](https://github.com/nodejs/node/pull/50074) +* \[[`01bed64cbb`](https://github.com/nodejs/node/commit/01bed64cbb)] - **test\_runner**: pass abortSignal to test files (Moshe Atlow) [#50630](https://github.com/nodejs/node/pull/50630) +* \[[`ae4a7ba991`](https://github.com/nodejs/node/commit/ae4a7ba991)] - **test\_runner**: replace forEach with for of (Tom Haddad) [#50595](https://github.com/nodejs/node/pull/50595) +* \[[`913e4b9173`](https://github.com/nodejs/node/commit/913e4b9173)] - **test\_runner**: output errors of suites (Moshe Atlow) [#50361](https://github.com/nodejs/node/pull/50361) +* \[[`c9b92bba58`](https://github.com/nodejs/node/commit/c9b92bba58)] - **(SEMVER-MINOR)** **test\_runner**: adds built in lcov reporter (Phil Nash) [#50018](https://github.com/nodejs/node/pull/50018) +* \[[`e2c3b015cd`](https://github.com/nodejs/node/commit/e2c3b015cd)] - **test\_runner**: test return value of mocked promisified timers (Mika Fischer) [#50331](https://github.com/nodejs/node/pull/50331) +* \[[`f6c496563e`](https://github.com/nodejs/node/commit/f6c496563e)] - **(SEMVER-MINOR)** **test\_runner**: add Date to the supported mock APIs (Lucas Santos) [#48638](https://github.com/nodejs/node/pull/48638) +* \[[`05e8b6ef20`](https://github.com/nodejs/node/commit/05e8b6ef20)] - **(SEMVER-MINOR)** **test\_runner, cli**: add --test-timeout flag (Shubham Pandey) [#50443](https://github.com/nodejs/node/pull/50443) +* \[[`b71c8c447e`](https://github.com/nodejs/node/commit/b71c8c447e)] - **tls**: use `validateFunction` for `options.SNICallback` (Deokjin Kim) [#50530](https://github.com/nodejs/node/pull/50530) +* \[[`5fcd67a8ea`](https://github.com/nodejs/node/commit/5fcd67a8ea)] - **tools**: add macOS notarization stapler (Ulises Gascón) [#50625](https://github.com/nodejs/node/pull/50625) +* \[[`253e206fe9`](https://github.com/nodejs/node/commit/253e206fe9)] - **tools**: update eslint to 8.53.0 (Node.js GitHub Bot) [#50559](https://github.com/nodejs/node/pull/50559) +* \[[`f5e1c95447`](https://github.com/nodejs/node/commit/f5e1c95447)] - **tools**: update lint-md-dependencies to rollup\@4.3.0 (Node.js GitHub Bot) [#50556](https://github.com/nodejs/node/pull/50556) +* \[[`257e22073e`](https://github.com/nodejs/node/commit/257e22073e)] - **tools**: compare ICU checksums before file changes (Michaël Zasso) [#50522](https://github.com/nodejs/node/pull/50522) +* \[[`aa8feea5f1`](https://github.com/nodejs/node/commit/aa8feea5f1)] - **tools**: improve update acorn-walk script (Marco Ippolito) [#50473](https://github.com/nodejs/node/pull/50473) +* \[[`c0206bf44c`](https://github.com/nodejs/node/commit/c0206bf44c)] - **tools**: update lint-md-dependencies to rollup\@4.2.0 (Node.js GitHub Bot) [#50496](https://github.com/nodejs/node/pull/50496) +* \[[`02dec645f3`](https://github.com/nodejs/node/commit/02dec645f3)] - **tools**: improve macOS notarization process output readability (Ulises Gascón) [#50389](https://github.com/nodejs/node/pull/50389) +* \[[`52e7b6d29a`](https://github.com/nodejs/node/commit/52e7b6d29a)] - **tools**: update gyp-next to v0.16.1 (Michaël Zasso) [#50380](https://github.com/nodejs/node/pull/50380) +* \[[`9fc29c909b`](https://github.com/nodejs/node/commit/9fc29c909b)] - **tools**: skip ruff on tools/gyp (Michaël Zasso) [#50380](https://github.com/nodejs/node/pull/50380) +* \[[`ec7005abff`](https://github.com/nodejs/node/commit/ec7005abff)] - **tools**: update lint-md-dependencies to rollup\@4.1.5 unified\@11.0.4 (Node.js GitHub Bot) [#50461](https://github.com/nodejs/node/pull/50461) +* \[[`aed590035f`](https://github.com/nodejs/node/commit/aed590035f)] - **tools**: remove unused `version` function (Ulises Gascón) [#50390](https://github.com/nodejs/node/pull/50390) +* \[[`f7590481f2`](https://github.com/nodejs/node/commit/f7590481f2)] - **tools**: avoid npm install in deps installation (Marco Ippolito) [#50413](https://github.com/nodejs/node/pull/50413) +* \[[`92d64035c6`](https://github.com/nodejs/node/commit/92d64035c6)] - _**Revert**_ "**tools**: update doc dependencies" (Richard Lau) [#50414](https://github.com/nodejs/node/pull/50414) +* \[[`90c9dd3e0e`](https://github.com/nodejs/node/commit/90c9dd3e0e)] - **tools**: update doc dependencies (Node.js GitHub Bot) [#49988](https://github.com/nodejs/node/pull/49988) +* \[[`f210915681`](https://github.com/nodejs/node/commit/f210915681)] - **tools**: run coverage CI only on relevant files (Antoine du Hamel) [#50349](https://github.com/nodejs/node/pull/50349) +* \[[`5ccdda4004`](https://github.com/nodejs/node/commit/5ccdda4004)] - **tools**: update eslint to 8.52.0 (Node.js GitHub Bot) [#50326](https://github.com/nodejs/node/pull/50326) +* \[[`bd4634874c`](https://github.com/nodejs/node/commit/bd4634874c)] - **tools**: update lint-md-dependencies (Node.js GitHub Bot) [#50190](https://github.com/nodejs/node/pull/50190) +* \[[`773cfa59bb`](https://github.com/nodejs/node/commit/773cfa59bb)] - **vm**: allow dynamic import with a referrer realm (Chengzhong Wu) [#50360](https://github.com/nodejs/node/pull/50360) +* \[[`2f86d50e70`](https://github.com/nodejs/node/commit/2f86d50e70)] - **wasi**: document security sandboxing status (Guy Bedford) [#50396](https://github.com/nodejs/node/pull/50396) + + + +## 2023-10-24, Version 21.1.0 (Current), @targos + +### Notable Changes + +#### Automatically detect and run ESM syntax + +The new flag `--experimental-detect-module` can be used to automatically run +ES modules when their syntax can be detected. For “ambiguous” files, which are +`.js` or extensionless files with no `package.json` with a `type` field, Node.js +will parse the file to detect ES module syntax; if found, it will run the file +as an ES module, otherwise it will run the file as a CommonJS module. +The same applies to string input via `--eval` or `STDIN`. + +We hope to make detection enabled by default in a future version of Node.js. +Detection increases startup time, so we encourage everyone — especially package +authors — to add a `type` field to `package.json`, even for the default +`"type": "commonjs"`. The presence of a `type` field, or explicit extensions +such as `.mjs` or `.cjs`, will opt out of detection. + +Contributed by Geoffrey Booth in [#50096](https://github.com/nodejs/node/pull/50096). + +### vm: fix V8 compilation cache support for vm.Script + +Previously repeated compilation of the same source code using `vm.Script` +stopped hitting the V8 compilation cache after v16.x when support for +`importModuleDynamically` was added to `vm.Script`, resulting in a performance +regression that blocked users (in particular Jest users) from upgrading from +v16.x. + +The recent fixes landed in v21.1.0 allow the compilation cache to be hit again +for `vm.Script` when `--experimental-vm-modules` is not used even in the +presence of the `importModuleDynamically` option, so that users affected by the +performance regression can now upgrade. Ongoing work is also being done to +enable compilation cache support for `vm.CompileFunction`. + +Contributed by Joyee Cheung in [#50137](https://github.com/nodejs/node/pull/50137). + +#### Other Notable Changes + +* \[[`3729e33358`](https://github.com/nodejs/node/commit/3729e33358)] - **doc**: add H4ad to collaborators (Vinícius Lourenço) [#50217](https://github.com/nodejs/node/pull/50217) +* \[[`18862e4d5d`](https://github.com/nodejs/node/commit/18862e4d5d)] - **(SEMVER-MINOR)** **fs**: add `flush` option to `appendFile()` functions (Colin Ihrig) [#50095](https://github.com/nodejs/node/pull/50095) +* \[[`5a52c518ef`](https://github.com/nodejs/node/commit/5a52c518ef)] - **(SEMVER-MINOR)** **lib**: add `navigator.userAgent` (Yagiz Nizipli) [#50200](https://github.com/nodejs/node/pull/50200) +* \[[`789372a072`](https://github.com/nodejs/node/commit/789372a072)] - **(SEMVER-MINOR)** **stream**: allow pass stream class to `stream.compose` (Alex Yang) [#50187](https://github.com/nodejs/node/pull/50187) +* \[[`f3a9ea0bc4`](https://github.com/nodejs/node/commit/f3a9ea0bc4)] - **stream**: improve performance of readable stream reads (Raz Luvaton) [#50173](https://github.com/nodejs/node/pull/50173) + +### Commits + +* \[[`9cd68b9083`](https://github.com/nodejs/node/commit/9cd68b9083)] - **buffer**: remove unnecessary assignment in fromString (Tobias Nießen) [#50199](https://github.com/nodejs/node/pull/50199) +* \[[`a362c276ec`](https://github.com/nodejs/node/commit/a362c276ec)] - **crypto**: ensure valid point on elliptic curve in SubtleCrypto.importKey (Filip Skokan) [#50234](https://github.com/nodejs/node/pull/50234) +* \[[`f4da308f8d`](https://github.com/nodejs/node/commit/f4da308f8d)] - **deps**: V8: cherry-pick f7d000a7ae7b (Luke Albao) [#50302](https://github.com/nodejs/node/pull/50302) +* \[[`269e268c38`](https://github.com/nodejs/node/commit/269e268c38)] - **deps**: update ada to 2.7.2 (Node.js GitHub Bot) [#50338](https://github.com/nodejs/node/pull/50338) +* \[[`03a31ce41e`](https://github.com/nodejs/node/commit/03a31ce41e)] - **deps**: update corepack to 0.22.0 (Node.js GitHub Bot) [#50325](https://github.com/nodejs/node/pull/50325) +* \[[`000531781b`](https://github.com/nodejs/node/commit/000531781b)] - **deps**: update undici to 5.26.4 (Node.js GitHub Bot) [#50274](https://github.com/nodejs/node/pull/50274) +* \[[`f050668c14`](https://github.com/nodejs/node/commit/f050668c14)] - **deps**: update c-ares to 1.20.1 (Node.js GitHub Bot) [#50082](https://github.com/nodejs/node/pull/50082) +* \[[`ba258b682b`](https://github.com/nodejs/node/commit/ba258b682b)] - **deps**: update c-ares to 1.20.0 (Node.js GitHub Bot) [#50082](https://github.com/nodejs/node/pull/50082) +* \[[`571f7ef1fa`](https://github.com/nodejs/node/commit/571f7ef1fa)] - **deps**: patch V8 to 11.8.172.15 (Michaël Zasso) [#50114](https://github.com/nodejs/node/pull/50114) +* \[[`943047e800`](https://github.com/nodejs/node/commit/943047e800)] - **deps**: V8: cherry-pick 25902244ad1a (Joyee Cheung) [#50156](https://github.com/nodejs/node/pull/50156) +* \[[`db2a1cf1cb`](https://github.com/nodejs/node/commit/db2a1cf1cb)] - **doc**: fix `navigator.hardwareConcurrency` example (Tobias Nießen) [#50278](https://github.com/nodejs/node/pull/50278) +* \[[`6e537aeb44`](https://github.com/nodejs/node/commit/6e537aeb44)] - **doc**: explain how to disable navigator (Geoffrey Booth) [#50310](https://github.com/nodejs/node/pull/50310) +* \[[`c40de82d62`](https://github.com/nodejs/node/commit/c40de82d62)] - **doc**: add loong64 info into platform list (Shi Pujin) [#50086](https://github.com/nodejs/node/pull/50086) +* \[[`1c21a1880b`](https://github.com/nodejs/node/commit/1c21a1880b)] - **doc**: update release process LTS step (Richard Lau) [#50299](https://github.com/nodejs/node/pull/50299) +* \[[`2473aa3672`](https://github.com/nodejs/node/commit/2473aa3672)] - **doc**: fix release process table of contents (Richard Lau) [#50216](https://github.com/nodejs/node/pull/50216) +* \[[`ce9d84eae3`](https://github.com/nodejs/node/commit/ce9d84eae3)] - **doc**: update api `stream.compose` (Alex Yang) [#50206](https://github.com/nodejs/node/pull/50206) +* \[[`dacee4d9b5`](https://github.com/nodejs/node/commit/dacee4d9b5)] - **doc**: add ReflectConstruct to known perf issues (Vinicius Lourenço) [#50111](https://github.com/nodejs/node/pull/50111) +* \[[`82363be2ac`](https://github.com/nodejs/node/commit/82363be2ac)] - **doc**: fix typo in dgram docs (Peter Johnson) [#50211](https://github.com/nodejs/node/pull/50211) +* \[[`8c1a46c751`](https://github.com/nodejs/node/commit/8c1a46c751)] - **doc**: fix H4ad collaborator sort (Vinicius Lourenço) [#50218](https://github.com/nodejs/node/pull/50218) +* \[[`3729e33358`](https://github.com/nodejs/node/commit/3729e33358)] - **doc**: add H4ad to collaborators (Vinícius Lourenço) [#50217](https://github.com/nodejs/node/pull/50217) +* \[[`bac872cbd0`](https://github.com/nodejs/node/commit/bac872cbd0)] - **doc**: update release-stewards with last sec-release (Rafael Gonzaga) [#50179](https://github.com/nodejs/node/pull/50179) +* \[[`06b7724f14`](https://github.com/nodejs/node/commit/06b7724f14)] - **doc**: add command to keep major branch sync (Rafael Gonzaga) [#50102](https://github.com/nodejs/node/pull/50102) +* \[[`47633ab086`](https://github.com/nodejs/node/commit/47633ab086)] - **doc**: add loong64 to list of architectures (Shi Pujin) [#50172](https://github.com/nodejs/node/pull/50172) +* \[[`1f40ca1b91`](https://github.com/nodejs/node/commit/1f40ca1b91)] - **doc**: update security release process (Michael Dawson) [#50166](https://github.com/nodejs/node/pull/50166) +* \[[`998feda118`](https://github.com/nodejs/node/commit/998feda118)] - **esm**: do not give wrong hints when detecting file format (Antoine du Hamel) [#50314](https://github.com/nodejs/node/pull/50314) +* \[[`e375063e01`](https://github.com/nodejs/node/commit/e375063e01)] - **(SEMVER-MINOR)** **esm**: detect ESM syntax in ambiguous JavaScript (Geoffrey Booth) [#50096](https://github.com/nodejs/node/pull/50096) +* \[[`c76eb27971`](https://github.com/nodejs/node/commit/c76eb27971)] - **esm**: improve check for ESM syntax (Geoffrey Booth) [#50127](https://github.com/nodejs/node/pull/50127) +* \[[`7740bf820c`](https://github.com/nodejs/node/commit/7740bf820c)] - **esm**: rename error code related to import attributes (Antoine du Hamel) [#50181](https://github.com/nodejs/node/pull/50181) +* \[[`0cc176ef25`](https://github.com/nodejs/node/commit/0cc176ef25)] - **fs**: improve error performance for `readSync` (Jungku Lee) [#50033](https://github.com/nodejs/node/pull/50033) +* \[[`5942edb774`](https://github.com/nodejs/node/commit/5942edb774)] - **fs**: improve error performance for `fsyncSync` (Jungku Lee) [#49880](https://github.com/nodejs/node/pull/49880) +* \[[`6ec5abadc0`](https://github.com/nodejs/node/commit/6ec5abadc0)] - **fs**: improve error performance for `mkdirSync` (CanadaHonk) [#49847](https://github.com/nodejs/node/pull/49847) +* \[[`c5ff000cb1`](https://github.com/nodejs/node/commit/c5ff000cb1)] - **fs**: improve error performance of `realpathSync` (Yagiz Nizipli) [#49962](https://github.com/nodejs/node/pull/49962) +* \[[`6eeaa02f5c`](https://github.com/nodejs/node/commit/6eeaa02f5c)] - **fs**: improve error performance of `lchownSync` (Yagiz Nizipli) [#49962](https://github.com/nodejs/node/pull/49962) +* \[[`dc9ac8d41c`](https://github.com/nodejs/node/commit/dc9ac8d41c)] - **fs**: improve error performance of `symlinkSync` (Yagiz Nizipli) [#49962](https://github.com/nodejs/node/pull/49962) +* \[[`bc6f279261`](https://github.com/nodejs/node/commit/bc6f279261)] - **fs**: improve error performance of `readlinkSync` (Yagiz Nizipli) [#49962](https://github.com/nodejs/node/pull/49962) +* \[[`275987841e`](https://github.com/nodejs/node/commit/275987841e)] - **fs**: improve error performance of `mkdtempSync` (Yagiz Nizipli) [#49962](https://github.com/nodejs/node/pull/49962) +* \[[`81f15274e2`](https://github.com/nodejs/node/commit/81f15274e2)] - **fs**: improve error performance of `linkSync` (Yagiz Nizipli) [#49962](https://github.com/nodejs/node/pull/49962) +* \[[`f766c04856`](https://github.com/nodejs/node/commit/f766c04856)] - **fs**: improve error performance of `chownSync` (Yagiz Nizipli) [#49962](https://github.com/nodejs/node/pull/49962) +* \[[`610036c67d`](https://github.com/nodejs/node/commit/610036c67d)] - **fs**: improve error performance of `renameSync` (Yagiz Nizipli) [#49962](https://github.com/nodejs/node/pull/49962) +* \[[`18862e4d5d`](https://github.com/nodejs/node/commit/18862e4d5d)] - **(SEMVER-MINOR)** **fs**: add flush option to appendFile() functions (Colin Ihrig) [#50095](https://github.com/nodejs/node/pull/50095) +* \[[`3f8cbb15cb`](https://github.com/nodejs/node/commit/3f8cbb15cb)] - **http2**: allow streams to complete gracefully after goaway (Michael Lumish) [#50202](https://github.com/nodejs/node/pull/50202) +* \[[`1464eba1a0`](https://github.com/nodejs/node/commit/1464eba1a0)] - **lib**: improve performance of validateStringArray and validateBooleanArray (Aras Abbasi) [#49756](https://github.com/nodejs/node/pull/49756) +* \[[`5a52c518ef`](https://github.com/nodejs/node/commit/5a52c518ef)] - **(SEMVER-MINOR)** **lib**: add `navigator.userAgent` (Yagiz Nizipli) [#50200](https://github.com/nodejs/node/pull/50200) +* \[[`b6021ab8f6`](https://github.com/nodejs/node/commit/b6021ab8f6)] - **lib**: reduce overhead of blob clone (Vinicius Lourenço) [#50110](https://github.com/nodejs/node/pull/50110) +* \[[`be19d9baa1`](https://github.com/nodejs/node/commit/be19d9baa1)] - **meta**: move Trott to TSC regular member (Rich Trott) [#50297](https://github.com/nodejs/node/pull/50297) +* \[[`91e373f8e9`](https://github.com/nodejs/node/commit/91e373f8e9)] - **node-api**: return napi\_exception\_pending on proxy handlers (Chengzhong Wu) [#48607](https://github.com/nodejs/node/pull/48607) +* \[[`531a3ae4b5`](https://github.com/nodejs/node/commit/531a3ae4b5)] - **stream**: simplify prefinish (Robert Nagy) [#50204](https://github.com/nodejs/node/pull/50204) +* \[[`514ac86579`](https://github.com/nodejs/node/commit/514ac86579)] - **stream**: reduce scope of readable bitmap details (Robert Nagy) [#49963](https://github.com/nodejs/node/pull/49963) +* \[[`789372a072`](https://github.com/nodejs/node/commit/789372a072)] - **(SEMVER-MINOR)** **stream**: allow pass stream class to `stream.compose` (Alex Yang) [#50187](https://github.com/nodejs/node/pull/50187) +* \[[`f3a9ea0bc4`](https://github.com/nodejs/node/commit/f3a9ea0bc4)] - **stream**: call helper function from push and unshift (Raz Luvaton) [#50173](https://github.com/nodejs/node/pull/50173) +* \[[`a9ca7b32e7`](https://github.com/nodejs/node/commit/a9ca7b32e7)] - **test**: improve watch mode test (Moshe Atlow) [#50319](https://github.com/nodejs/node/pull/50319) +* \[[`63b7059efd`](https://github.com/nodejs/node/commit/63b7059efd)] - **test**: set `test-watch-mode-inspect` as flaky (Yagiz Nizipli) [#50259](https://github.com/nodejs/node/pull/50259) +* \[[`7f87084b05`](https://github.com/nodejs/node/commit/7f87084b05)] - _**Revert**_ "**test**: set `test-esm-loader-resolve-type` as flaky" (Antoine du Hamel) [#50315](https://github.com/nodejs/node/pull/50315) +* \[[`4d390e2de4`](https://github.com/nodejs/node/commit/4d390e2de4)] - **test**: replace forEach with for..of in test-http-perf\_hooks.js (Niya Shiyas) [#49818](https://github.com/nodejs/node/pull/49818) +* \[[`67c599ec39`](https://github.com/nodejs/node/commit/67c599ec39)] - **test**: replace forEach with for..of in test-net-isipv4.js (Niya Shiyas) [#49822](https://github.com/nodejs/node/pull/49822) +* \[[`19d3ce2494`](https://github.com/nodejs/node/commit/19d3ce2494)] - **test**: deflake `test-esm-loader-resolve-type` (Antoine du Hamel) [#50273](https://github.com/nodejs/node/pull/50273) +* \[[`2d8d6c5701`](https://github.com/nodejs/node/commit/2d8d6c5701)] - **test**: replace forEach with for..of in test-http2-server (Niya Shiyas) [#49819](https://github.com/nodejs/node/pull/49819) +* \[[`af31d51e5a`](https://github.com/nodejs/node/commit/af31d51e5a)] - **test**: replace forEach with for..of in test-http2-client-destroy.js (Niya Shiyas) [#49820](https://github.com/nodejs/node/pull/49820) +* \[[`465ad2a5ce`](https://github.com/nodejs/node/commit/465ad2a5ce)] - **test**: update `url` web platform tests (Yagiz Nizipli) [#50264](https://github.com/nodejs/node/pull/50264) +* \[[`3b80a6894c`](https://github.com/nodejs/node/commit/3b80a6894c)] - **test**: set `test-emit-after-on-destroyed` as flaky (Yagiz Nizipli) [#50246](https://github.com/nodejs/node/pull/50246) +* \[[`57adbdd156`](https://github.com/nodejs/node/commit/57adbdd156)] - **test**: set inspector async stack test as flaky (Yagiz Nizipli) [#50244](https://github.com/nodejs/node/pull/50244) +* \[[`6507f66404`](https://github.com/nodejs/node/commit/6507f66404)] - **test**: set test-worker-nearheaplimit-deadlock flaky (StefanStojanovic) [#50277](https://github.com/nodejs/node/pull/50277) +* \[[`21a6ba548d`](https://github.com/nodejs/node/commit/21a6ba548d)] - **test**: set `test-cli-node-options` as flaky (Yagiz Nizipli) [#50296](https://github.com/nodejs/node/pull/50296) +* \[[`c55f8f30cb`](https://github.com/nodejs/node/commit/c55f8f30cb)] - **test**: reduce the number of requests and parsers (Luigi Pinca) [#50240](https://github.com/nodejs/node/pull/50240) +* \[[`5129bedfa2`](https://github.com/nodejs/node/commit/5129bedfa2)] - **test**: set crypto-timing test as flaky (Yagiz Nizipli) [#50232](https://github.com/nodejs/node/pull/50232) +* \[[`9bc5ab5e07`](https://github.com/nodejs/node/commit/9bc5ab5e07)] - **test**: set `test-structuredclone-*` as flaky (Yagiz Nizipli) [#50261](https://github.com/nodejs/node/pull/50261) +* \[[`317e447ddc`](https://github.com/nodejs/node/commit/317e447ddc)] - **test**: deflake `test-loaders-workers-spawned` (Antoine du Hamel) [#50251](https://github.com/nodejs/node/pull/50251) +* \[[`0c710daae2`](https://github.com/nodejs/node/commit/0c710daae2)] - **test**: improve code coverage of diagnostics\_channel (Jithil P Ponnan) [#50053](https://github.com/nodejs/node/pull/50053) +* \[[`7c6e4d7ec3`](https://github.com/nodejs/node/commit/7c6e4d7ec3)] - **test**: set `test-esm-loader-resolve-type` as flaky (Yagiz Nizipli) [#50226](https://github.com/nodejs/node/pull/50226) +* \[[`c8744909b0`](https://github.com/nodejs/node/commit/c8744909b0)] - **test**: set inspector async hook test as flaky (Yagiz Nizipli) [#50252](https://github.com/nodejs/node/pull/50252) +* \[[`3e38001739`](https://github.com/nodejs/node/commit/3e38001739)] - **test**: skip test-benchmark-os.js on IBM i (Abdirahim Musse) [#50208](https://github.com/nodejs/node/pull/50208) +* \[[`dd66fdfb7b`](https://github.com/nodejs/node/commit/dd66fdfb7b)] - **test**: set parallel http server test as flaky (Yagiz Nizipli) [#50227](https://github.com/nodejs/node/pull/50227) +* \[[`a38d1311bf`](https://github.com/nodejs/node/commit/a38d1311bf)] - **test**: set test-worker-nearheaplimit-deadlock flaky (Stefan Stojanovic) [#50238](https://github.com/nodejs/node/pull/50238) +* \[[`8efb75fd80`](https://github.com/nodejs/node/commit/8efb75fd80)] - **test**: set `test-runner-watch-mode` as flaky (Yagiz Nizipli) [#50221](https://github.com/nodejs/node/pull/50221) +* \[[`143ddded74`](https://github.com/nodejs/node/commit/143ddded74)] - **test**: set sea snapshot tests as flaky (Yagiz Nizipli) [#50223](https://github.com/nodejs/node/pull/50223) +* \[[`ae905a8f35`](https://github.com/nodejs/node/commit/ae905a8f35)] - **test**: fix defect path traversal tests (Tobias Nießen) [#50124](https://github.com/nodejs/node/pull/50124) +* \[[`ce27ee701b`](https://github.com/nodejs/node/commit/ce27ee701b)] - **tls**: reduce TLS 'close' event listener warnings (Tim Perry) [#50136](https://github.com/nodejs/node/pull/50136) +* \[[`ab4bae8e1f`](https://github.com/nodejs/node/commit/ab4bae8e1f)] - **tools**: drop support for osx notarization with gon (Ulises Gascón) [#50291](https://github.com/nodejs/node/pull/50291) +* \[[`5df3d5abcc`](https://github.com/nodejs/node/commit/5df3d5abcc)] - **tools**: update comment in `update-uncidi.sh` and `acorn_version.h` (Jungku Lee) [#50175](https://github.com/nodejs/node/pull/50175) +* \[[`bf7b94f0b3`](https://github.com/nodejs/node/commit/bf7b94f0b3)] - **tools**: refactor checkimports.py (Mohammed Keyvanzadeh) [#50011](https://github.com/nodejs/node/pull/50011) +* \[[`5dc454a837`](https://github.com/nodejs/node/commit/5dc454a837)] - **util**: remove internal mime fns from benchmarks (Aras Abbasi) [#50201](https://github.com/nodejs/node/pull/50201) +* \[[`8f7eb15603`](https://github.com/nodejs/node/commit/8f7eb15603)] - **vm**: use import attributes instead of import assertions (Antoine du Hamel) [#50141](https://github.com/nodejs/node/pull/50141) +* \[[`dda33c2bf1`](https://github.com/nodejs/node/commit/dda33c2bf1)] - **vm**: reject in importModuleDynamically without --experimental-vm-modules (Joyee Cheung) [#50137](https://github.com/nodejs/node/pull/50137) +* \[[`3999362c59`](https://github.com/nodejs/node/commit/3999362c59)] - **vm**: use internal versions of compileFunction and Script (Joyee Cheung) [#50137](https://github.com/nodejs/node/pull/50137) +* \[[`a54179f0e0`](https://github.com/nodejs/node/commit/a54179f0e0)] - **vm**: unify host-defined option generation in vm.compileFunction (Joyee Cheung) [#50137](https://github.com/nodejs/node/pull/50137) +* \[[`87be790fa9`](https://github.com/nodejs/node/commit/87be790fa9)] - **worker**: handle detached `MessagePort` from a different context (Juan José) [#49150](https://github.com/nodejs/node/pull/49150) + + + +## 2023-10-17, Version 21.0.0 (Current), @RafaelGSS and @targos + +We're excited to announce the release of Node.js 21! Highlights include updates of the V8 JavaScript engine to 11.8, +stable `fetch` and `WebStreams`, a new experimental flag to change the interpretation of ambiguous code +from CommonJS to ES modules (`--experimental-default-type`), many updates to our test runner, and more! + +Node.js 21 will replace Node.js 20 as our ‘Current’ release line when Node.js 20 enters long-term support (LTS) later this month. +As per the release schedule, Node.js 21 will be ‘Current' release for the next 6 months, until April 2024. + +### Other Notable Changes + +* \[[`740ca5423a`](https://github.com/nodejs/node/commit/740ca5423a)] - **doc**: promote fetch/webstreams from experimental to stable (Steven) [#45684](https://github.com/nodejs/node/pull/45684) +* \[[`85301803e1`](https://github.com/nodejs/node/commit/85301803e1)] - **esm**: --experimental-default-type flag to flip module defaults (Geoffrey Booth) [#49869](https://github.com/nodejs/node/pull/49869) +* \[[`705e623ac4`](https://github.com/nodejs/node/commit/705e623ac4)] - **esm**: remove `globalPreload` hook (superseded by `initialize`) (Jacob Smith) [#49144](https://github.com/nodejs/node/pull/49144) +* \[[`e01c1d700d`](https://github.com/nodejs/node/commit/e01c1d700d)] - **fs**: add flush option to writeFile() functions (Colin Ihrig) [#50009](https://github.com/nodejs/node/pull/50009) +* \[[`1948dce707`](https://github.com/nodejs/node/commit/1948dce707)] - **(SEMVER-MAJOR)** **fs**: add globSync implementation (Moshe Atlow) [#47653](https://github.com/nodejs/node/pull/47653) +* \[[`e28dbe1c2b`](https://github.com/nodejs/node/commit/e28dbe1c2b)] - **(SEMVER-MINOR)** **lib**: add WebSocket client (Matthew Aitken) [#49830](https://github.com/nodejs/node/pull/49830) +* \[[`95b8f5dcab`](https://github.com/nodejs/node/commit/95b8f5dcab)] - **stream**: optimize Writable (Robert Nagy) [#50012](https://github.com/nodejs/node/pull/50012) +* \[[`7cd4e70948`](https://github.com/nodejs/node/commit/7cd4e70948)] - **(SEMVER-MAJOR)** **test\_runner**: support passing globs (Moshe Atlow) [#47653](https://github.com/nodejs/node/pull/47653) +* \[[`1d220b55ac`](https://github.com/nodejs/node/commit/1d220b55ac)] - **vm**: use default HDO when importModuleDynamically is not set (Joyee Cheung) [#49950](https://github.com/nodejs/node/pull/49950) + +### Semver-Major Commits + +* \[[`ac2a68c76b`](https://github.com/nodejs/node/commit/ac2a68c76b)] - **(SEMVER-MAJOR)** **build**: drop support for Visual Studio 2019 (Michaël Zasso) [#49051](https://github.com/nodejs/node/pull/49051) +* \[[`4e3983031a`](https://github.com/nodejs/node/commit/4e3983031a)] - **(SEMVER-MAJOR)** **build**: bump supported macOS and Xcode versions (Michaël Zasso) [#49164](https://github.com/nodejs/node/pull/49164) +* \[[`5a0777776d`](https://github.com/nodejs/node/commit/5a0777776d)] - **(SEMVER-MAJOR)** **crypto**: do not overwrite \_writableState.defaultEncoding (Tobias Nießen) [#49140](https://github.com/nodejs/node/pull/49140) +* \[[`162a0652ab`](https://github.com/nodejs/node/commit/162a0652ab)] - **(SEMVER-MAJOR)** **deps**: bump minimum ICU version to 73 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`17a74ddd3d`](https://github.com/nodejs/node/commit/17a74ddd3d)] - **(SEMVER-MAJOR)** **deps**: update V8 to 11.8.172.13 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`e9ff81016d`](https://github.com/nodejs/node/commit/e9ff81016d)] - **(SEMVER-MAJOR)** **deps**: update llhttp to 9.1.2 (Paolo Insogna) [#48981](https://github.com/nodejs/node/pull/48981) +* \[[`7ace5aba75`](https://github.com/nodejs/node/commit/7ace5aba75)] - **(SEMVER-MAJOR)** **events**: validate options of `on` and `once` (Deokjin Kim) [#46018](https://github.com/nodejs/node/pull/46018) +* \[[`b3ec13d449`](https://github.com/nodejs/node/commit/b3ec13d449)] - **(SEMVER-MAJOR)** **fs**: adjust `position` validation in reading methods (Livia Medeiros) [#42835](https://github.com/nodejs/node/pull/42835) +* \[[`1948dce707`](https://github.com/nodejs/node/commit/1948dce707)] - **(SEMVER-MAJOR)** **fs**: add globSync implementation (Moshe Atlow) [#47653](https://github.com/nodejs/node/pull/47653) +* \[[`d68d0eacaa`](https://github.com/nodejs/node/commit/d68d0eacaa)] - **(SEMVER-MAJOR)** **http**: reduce parts in chunked response when corking (Robert Nagy) [#50167](https://github.com/nodejs/node/pull/50167) +* \[[`c5b0b894ed`](https://github.com/nodejs/node/commit/c5b0b894ed)] - **(SEMVER-MAJOR)** **lib**: mark URL/URLSearchParams as uncloneable and untransferable (Chengzhong Wu) [#47497](https://github.com/nodejs/node/pull/47497) +* \[[`3205b1936a`](https://github.com/nodejs/node/commit/3205b1936a)] - **(SEMVER-MAJOR)** **lib**: remove aix directory case for package reader (Yagiz Nizipli) [#48605](https://github.com/nodejs/node/pull/48605) +* \[[`b40f0c3074`](https://github.com/nodejs/node/commit/b40f0c3074)] - **(SEMVER-MAJOR)** **lib**: add `navigator.hardwareConcurrency` (Yagiz Nizipli) [#47769](https://github.com/nodejs/node/pull/47769) +* \[[`4b08c4c047`](https://github.com/nodejs/node/commit/4b08c4c047)] - **(SEMVER-MAJOR)** **lib**: runtime deprecate punycode (Yagiz Nizipli) [#47202](https://github.com/nodejs/node/pull/47202) +* \[[`3ce51ae9c0`](https://github.com/nodejs/node/commit/3ce51ae9c0)] - **(SEMVER-MAJOR)** **module**: harmonize error code between ESM and CJS (Antoine du Hamel) [#48606](https://github.com/nodejs/node/pull/48606) +* \[[`7202859402`](https://github.com/nodejs/node/commit/7202859402)] - **(SEMVER-MAJOR)** **net**: do not treat `server.maxConnections=0` as `Infinity` (ignoramous) [#48276](https://github.com/nodejs/node/pull/48276) +* \[[`c15bafdaf4`](https://github.com/nodejs/node/commit/c15bafdaf4)] - **(SEMVER-MAJOR)** **net**: only defer \_final call when connecting (Jason Zhang) [#47385](https://github.com/nodejs/node/pull/47385) +* \[[`6ffacbf0f9`](https://github.com/nodejs/node/commit/6ffacbf0f9)] - **(SEMVER-MAJOR)** **node-api**: rename internal NAPI\_VERSION definition (Chengzhong Wu) [#48501](https://github.com/nodejs/node/pull/48501) +* \[[`11af089b14`](https://github.com/nodejs/node/commit/11af089b14)] - **(SEMVER-MAJOR)** **src**: update NODE\_MODULE\_VERSION to 120 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`d920b7c94b`](https://github.com/nodejs/node/commit/d920b7c94b)] - **(SEMVER-MAJOR)** **src**: throw DOMException on cloning non-serializable objects (Chengzhong Wu) [#47839](https://github.com/nodejs/node/pull/47839) +* \[[`64549731b6`](https://github.com/nodejs/node/commit/64549731b6)] - **(SEMVER-MAJOR)** **src**: throw DataCloneError on transfering untransferable objects (Chengzhong Wu) [#47604](https://github.com/nodejs/node/pull/47604) +* \[[`dac8de689b`](https://github.com/nodejs/node/commit/dac8de689b)] - **(SEMVER-MAJOR)** **stream**: use private properties for strategies (Yagiz Nizipli) [#47218](https://github.com/nodejs/node/pull/47218) +* \[[`1fa084ecdf`](https://github.com/nodejs/node/commit/1fa084ecdf)] - **(SEMVER-MAJOR)** **stream**: use private properties for encoding (Yagiz Nizipli) [#47218](https://github.com/nodejs/node/pull/47218) +* \[[`4e93247079`](https://github.com/nodejs/node/commit/4e93247079)] - **(SEMVER-MAJOR)** **stream**: use private properties for compression (Yagiz Nizipli) [#47218](https://github.com/nodejs/node/pull/47218) +* \[[`527589b755`](https://github.com/nodejs/node/commit/527589b755)] - **(SEMVER-MAJOR)** **test\_runner**: disallow array in `run` options (Raz Luvaton) [#49935](https://github.com/nodejs/node/pull/49935) +* \[[`7cd4e70948`](https://github.com/nodejs/node/commit/7cd4e70948)] - **(SEMVER-MAJOR)** **test\_runner**: support passing globs (Moshe Atlow) [#47653](https://github.com/nodejs/node/pull/47653) +* \[[`2ef170254b`](https://github.com/nodejs/node/commit/2ef170254b)] - **(SEMVER-MAJOR)** **tls**: use `validateNumber` for `options.minDHSize` (Deokjin Kim) [#49973](https://github.com/nodejs/node/pull/49973) +* \[[`092fb9f541`](https://github.com/nodejs/node/commit/092fb9f541)] - **(SEMVER-MAJOR)** **tls**: use validateFunction for `options.checkServerIdentity` (Deokjin Kim) [#49896](https://github.com/nodejs/node/pull/49896) +* \[[`ccca547e28`](https://github.com/nodejs/node/commit/ccca547e28)] - **(SEMVER-MAJOR)** **util**: runtime deprecate `promisify`-ing a function returning a `Promise` (Antoine du Hamel) [#49609](https://github.com/nodejs/node/pull/49609) +* \[[`4038cf0513`](https://github.com/nodejs/node/commit/4038cf0513)] - **(SEMVER-MAJOR)** **vm**: freeze `dependencySpecifiers` array (Antoine du Hamel) [#49720](https://github.com/nodejs/node/pull/49720) + +### Semver-Minor Commits + +* \[[`3227d7327c`](https://github.com/nodejs/node/commit/3227d7327c)] - **(SEMVER-MINOR)** **deps**: update uvwasi to 0.0.19 (Node.js GitHub Bot) [#49908](https://github.com/nodejs/node/pull/49908) +* \[[`e28dbe1c2b`](https://github.com/nodejs/node/commit/e28dbe1c2b)] - **(SEMVER-MINOR)** **lib**: add WebSocket client (Matthew Aitken) [#49830](https://github.com/nodejs/node/pull/49830) +* \[[`9f9c58212e`](https://github.com/nodejs/node/commit/9f9c58212e)] - **(SEMVER-MINOR)** **test\_runner, cli**: add --test-concurrency flag (Colin Ihrig) [#49996](https://github.com/nodejs/node/pull/49996) +* \[[`d37b0d267f`](https://github.com/nodejs/node/commit/d37b0d267f)] - **(SEMVER-MINOR)** **wasi**: updates required for latest uvwasi version (Michael Dawson) [#49908](https://github.com/nodejs/node/pull/49908) + +### Semver-Patch Commits + +* \[[`33c87ec096`](https://github.com/nodejs/node/commit/33c87ec096)] - **benchmark**: fix race condition on fs benchs (Vinicius Lourenço) [#50035](https://github.com/nodejs/node/pull/50035) +* \[[`3c0ec61c4b`](https://github.com/nodejs/node/commit/3c0ec61c4b)] - **benchmark**: add warmup to accessSync bench (Rafael Gonzaga) [#50073](https://github.com/nodejs/node/pull/50073) +* \[[`1a839f388e`](https://github.com/nodejs/node/commit/1a839f388e)] - **benchmark**: improved config for blob,file benchmark (Vinícius Lourenço) [#49730](https://github.com/nodejs/node/pull/49730) +* \[[`86fe5a80f3`](https://github.com/nodejs/node/commit/86fe5a80f3)] - **benchmark**: added new benchmarks for blob (Vinícius Lourenço) [#49730](https://github.com/nodejs/node/pull/49730) +* \[[`6322d4f587`](https://github.com/nodejs/node/commit/6322d4f587)] - **build**: fix IBM i build with Python 3.9 (Richard Lau) [#48056](https://github.com/nodejs/node/pull/48056) +* \[[`17c55d176b`](https://github.com/nodejs/node/commit/17c55d176b)] - **build**: reset embedder string to "-node.0" (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`f10928f926`](https://github.com/nodejs/node/commit/f10928f926)] - **crypto**: use X509\_ALGOR accessors instead of reaching into X509\_ALGOR (David Benjamin) [#50057](https://github.com/nodejs/node/pull/50057) +* \[[`136a96722a`](https://github.com/nodejs/node/commit/136a96722a)] - **crypto**: account for disabled SharedArrayBuffer (Shelley Vohr) [#50034](https://github.com/nodejs/node/pull/50034) +* \[[`17b9925393`](https://github.com/nodejs/node/commit/17b9925393)] - **crypto**: return clear errors when loading invalid PFX data (Tim Perry) [#49566](https://github.com/nodejs/node/pull/49566) +* \[[`ca25d564c6`](https://github.com/nodejs/node/commit/ca25d564c6)] - **deps**: upgrade npm to 10.2.0 (npm team) [#50027](https://github.com/nodejs/node/pull/50027) +* \[[`f23a9353ae`](https://github.com/nodejs/node/commit/f23a9353ae)] - **deps**: update corepack to 0.21.0 (Node.js GitHub Bot) [#50088](https://github.com/nodejs/node/pull/50088) +* \[[`ceedb3a509`](https://github.com/nodejs/node/commit/ceedb3a509)] - **deps**: update simdutf to 3.2.18 (Node.js GitHub Bot) [#50091](https://github.com/nodejs/node/pull/50091) +* \[[`0522ac086c`](https://github.com/nodejs/node/commit/0522ac086c)] - **deps**: update zlib to 1.2.13.1-motley-fef5869 (Node.js GitHub Bot) [#50085](https://github.com/nodejs/node/pull/50085) +* \[[`4f8c5829da`](https://github.com/nodejs/node/commit/4f8c5829da)] - **deps**: update googletest to 2dd1c13 (Node.js GitHub Bot) [#50081](https://github.com/nodejs/node/pull/50081) +* \[[`588784ea30`](https://github.com/nodejs/node/commit/588784ea30)] - **deps**: update undici to 5.25.4 (Node.js GitHub Bot) [#50025](https://github.com/nodejs/node/pull/50025) +* \[[`c9eef0c3c4`](https://github.com/nodejs/node/commit/c9eef0c3c4)] - **deps**: update googletest to e47544a (Node.js GitHub Bot) [#49982](https://github.com/nodejs/node/pull/49982) +* \[[`23cb478398`](https://github.com/nodejs/node/commit/23cb478398)] - **deps**: update ada to 2.6.10 (Node.js GitHub Bot) [#49984](https://github.com/nodejs/node/pull/49984) +* \[[`61411bb323`](https://github.com/nodejs/node/commit/61411bb323)] - **deps**: fix call to undeclared functions 'ntohl' and 'htons' (MatteoBax) [#49979](https://github.com/nodejs/node/pull/49979) +* \[[`49cf182e30`](https://github.com/nodejs/node/commit/49cf182e30)] - **deps**: update ada to 2.6.9 (Node.js GitHub Bot) [#49340](https://github.com/nodejs/node/pull/49340) +* \[[`ceb6df0f22`](https://github.com/nodejs/node/commit/ceb6df0f22)] - **deps**: update ada to 2.6.8 (Node.js GitHub Bot) [#49340](https://github.com/nodejs/node/pull/49340) +* \[[`b73e18b5dc`](https://github.com/nodejs/node/commit/b73e18b5dc)] - **deps**: update ada to 2.6.7 (Node.js GitHub Bot) [#49340](https://github.com/nodejs/node/pull/49340) +* \[[`baf2256617`](https://github.com/nodejs/node/commit/baf2256617)] - **deps**: update ada to 2.6.5 (Node.js GitHub Bot) [#49340](https://github.com/nodejs/node/pull/49340) +* \[[`a20a328a9b`](https://github.com/nodejs/node/commit/a20a328a9b)] - **deps**: update ada to 2.6.3 (Node.js GitHub Bot) [#49340](https://github.com/nodejs/node/pull/49340) +* \[[`3838b579e4`](https://github.com/nodejs/node/commit/3838b579e4)] - **deps**: V8: cherry-pick 8ec2651fbdd8 (Abdirahim Musse) [#49862](https://github.com/nodejs/node/pull/49862) +* \[[`668437ccad`](https://github.com/nodejs/node/commit/668437ccad)] - **deps**: V8: cherry-pick b60a03df4ceb (Joyee Cheung) [#49491](https://github.com/nodejs/node/pull/49491) +* \[[`f970087147`](https://github.com/nodejs/node/commit/f970087147)] - **deps**: V8: backport 93b1a74cbc9b (Joyee Cheung) [#49419](https://github.com/nodejs/node/pull/49419) +* \[[`4531c154e5`](https://github.com/nodejs/node/commit/4531c154e5)] - **deps**: V8: cherry-pick 8ec2651fbdd8 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`9ad0e2cacc`](https://github.com/nodejs/node/commit/9ad0e2cacc)] - **deps**: V8: cherry-pick 89b3702c92b0 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`dfc9c86868`](https://github.com/nodejs/node/commit/dfc9c86868)] - **deps**: V8: cherry-pick de9a5de2274f (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`186b36efba`](https://github.com/nodejs/node/commit/186b36efba)] - **deps**: V8: cherry-pick b5b5d6c31bb0 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`867586ce95`](https://github.com/nodejs/node/commit/867586ce95)] - **deps**: V8: cherry-pick 93b1a74cbc9b (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`4ad3479ba7`](https://github.com/nodejs/node/commit/4ad3479ba7)] - **deps**: V8: cherry-pick 1a3ecc2483b2 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`660f902f16`](https://github.com/nodejs/node/commit/660f902f16)] - **deps**: patch V8 to avoid duplicated zlib symbol (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`f7c1d410ad`](https://github.com/nodejs/node/commit/f7c1d410ad)] - **deps**: remove usage of a C++20 feature from V8 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`9c4030bfb9`](https://github.com/nodejs/node/commit/9c4030bfb9)] - **deps**: avoid compilation error with ASan (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`5f05cc15e6`](https://github.com/nodejs/node/commit/5f05cc15e6)] - **deps**: disable V8 concurrent sparkplug compilation (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`42cd952dbd`](https://github.com/nodejs/node/commit/42cd952dbd)] - **deps**: silence irrelevant V8 warning (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`88cf90f9c4`](https://github.com/nodejs/node/commit/88cf90f9c4)] - **deps**: always define V8\_EXPORT\_PRIVATE as no-op (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`8609915951`](https://github.com/nodejs/node/commit/8609915951)] - **doc**: improve ccache explanation (Chengzhong Wu) [#50133](https://github.com/nodejs/node/pull/50133) +* \[[`91d21324a9`](https://github.com/nodejs/node/commit/91d21324a9)] - **doc**: move danielleadams to TSC non-voting member (Danielle Adams) [#50142](https://github.com/nodejs/node/pull/50142) +* \[[`34fa7043a2`](https://github.com/nodejs/node/commit/34fa7043a2)] - **doc**: fix description of `fs.readdir` `recursive` option (RamdohokarAngha) [#48902](https://github.com/nodejs/node/pull/48902) +* \[[`81e4d2ec2f`](https://github.com/nodejs/node/commit/81e4d2ec2f)] - **doc**: mention files read before env setup (Rafael Gonzaga) [#50072](https://github.com/nodejs/node/pull/50072) +* \[[`0ce37ed8e9`](https://github.com/nodejs/node/commit/0ce37ed8e9)] - **doc**: move permission model to Active Development (Rafael Gonzaga) [#50068](https://github.com/nodejs/node/pull/50068) +* \[[`3c430212c3`](https://github.com/nodejs/node/commit/3c430212c3)] - **doc**: add command to get patch minors and majors (Rafael Gonzaga) [#50067](https://github.com/nodejs/node/pull/50067) +* \[[`e43bf4c31d`](https://github.com/nodejs/node/commit/e43bf4c31d)] - **doc**: use precise promise terminology in fs (Benjamin Gruenbaum) [#50029](https://github.com/nodejs/node/pull/50029) +* \[[`d3a5f1fb5f`](https://github.com/nodejs/node/commit/d3a5f1fb5f)] - **doc**: use precise terminology in test runner (Benjamin Gruenbaum) [#50028](https://github.com/nodejs/node/pull/50028) +* \[[`24dea2348d`](https://github.com/nodejs/node/commit/24dea2348d)] - **doc**: clarify explaination text on how to run the example (Anshul Sinha) [#39020](https://github.com/nodejs/node/pull/39020) +* \[[`f3ed57bd8b`](https://github.com/nodejs/node/commit/f3ed57bd8b)] - **doc**: reserve 119 for Electron 28 (David Sanders) [#50020](https://github.com/nodejs/node/pull/50020) +* \[[`85c09f178c`](https://github.com/nodejs/node/commit/85c09f178c)] - **doc**: update Collaborator pronouns (Tierney Cyren) [#50005](https://github.com/nodejs/node/pull/50005) +* \[[`099e2f7bce`](https://github.com/nodejs/node/commit/099e2f7bce)] - **doc**: update link to Abstract Modules Records spec (Rich Trott) [#49961](https://github.com/nodejs/node/pull/49961) +* \[[`47b2883673`](https://github.com/nodejs/node/commit/47b2883673)] - **doc**: updated building docs for windows (Claudio W) [#49767](https://github.com/nodejs/node/pull/49767) +* \[[`7b624c30b2`](https://github.com/nodejs/node/commit/7b624c30b2)] - **doc**: update CHANGELOG\_V20 about vm fixes (Joyee Cheung) [#49951](https://github.com/nodejs/node/pull/49951) +* \[[`1dc0667aa6`](https://github.com/nodejs/node/commit/1dc0667aa6)] - **doc**: document dangerous symlink behavior (Tobias Nießen) [#49154](https://github.com/nodejs/node/pull/49154) +* \[[`bc056c2426`](https://github.com/nodejs/node/commit/bc056c2426)] - **doc**: add main ARIA landmark to API docs (Rich Trott) [#49882](https://github.com/nodejs/node/pull/49882) +* \[[`f416a0f555`](https://github.com/nodejs/node/commit/f416a0f555)] - **doc**: add navigation ARIA landmark to doc ToC (Rich Trott) [#49882](https://github.com/nodejs/node/pull/49882) +* \[[`740ca5423a`](https://github.com/nodejs/node/commit/740ca5423a)] - **doc**: promote fetch/webstreams from experimental to stable (Steven) [#45684](https://github.com/nodejs/node/pull/45684) +* \[[`f802aa0645`](https://github.com/nodejs/node/commit/f802aa0645)] - **doc**: fix 'partial' typo (Colin Ihrig) [#48657](https://github.com/nodejs/node/pull/48657) +* \[[`6fda81d4f5`](https://github.com/nodejs/node/commit/6fda81d4f5)] - **doc**: mention `Navigator` is a partial implementation (Moshe Atlow) [#48656](https://github.com/nodejs/node/pull/48656) +* \[[`6aa2aeedcb`](https://github.com/nodejs/node/commit/6aa2aeedcb)] - **doc**: mark Node.js 19 as End-of-Life (Richard Lau) [#48283](https://github.com/nodejs/node/pull/48283) +* \[[`0ee9c83ffc`](https://github.com/nodejs/node/commit/0ee9c83ffc)] - **errors**: improve performance of determine-specific-type (Aras Abbasi) [#49696](https://github.com/nodejs/node/pull/49696) +* \[[`4f84a3d200`](https://github.com/nodejs/node/commit/4f84a3d200)] - **errors**: improve formatList in errors.js (Aras Abbasi) [#49642](https://github.com/nodejs/node/pull/49642) +* \[[`cc725a653a`](https://github.com/nodejs/node/commit/cc725a653a)] - **errors**: improve performance of instantiation (Aras Abbasi) [#49654](https://github.com/nodejs/node/pull/49654) +* \[[`d1ef6aa2db`](https://github.com/nodejs/node/commit/d1ef6aa2db)] - **esm**: use import attributes instead of import assertions (Antoine du Hamel) [#50140](https://github.com/nodejs/node/pull/50140) +* \[[`19b470f866`](https://github.com/nodejs/node/commit/19b470f866)] - **esm**: bypass CommonJS loader under --default-type (Geoffrey Booth) [#49986](https://github.com/nodejs/node/pull/49986) +* \[[`9c683204db`](https://github.com/nodejs/node/commit/9c683204db)] - **esm**: unflag extensionless javascript and wasm in module scope (Geoffrey Booth) [#49974](https://github.com/nodejs/node/pull/49974) +* \[[`05be31d5de`](https://github.com/nodejs/node/commit/05be31d5de)] - **esm**: improve `getFormatOfExtensionlessFile` speed (Yagiz Nizipli) [#49965](https://github.com/nodejs/node/pull/49965) +* \[[`aadfea4979`](https://github.com/nodejs/node/commit/aadfea4979)] - **esm**: improve JSDoc annotation of internal functions (Antoine du Hamel) [#49959](https://github.com/nodejs/node/pull/49959) +* \[[`7f0e36af52`](https://github.com/nodejs/node/commit/7f0e36af52)] - **esm**: fix cache collision on JSON files using file: URL (Antoine du Hamel) [#49887](https://github.com/nodejs/node/pull/49887) +* \[[`85301803e1`](https://github.com/nodejs/node/commit/85301803e1)] - **esm**: --experimental-default-type flag to flip module defaults (Geoffrey Booth) [#49869](https://github.com/nodejs/node/pull/49869) +* \[[`f42a103991`](https://github.com/nodejs/node/commit/f42a103991)] - **esm**: require braces for modules code (Geoffrey Booth) [#49657](https://github.com/nodejs/node/pull/49657) +* \[[`705e623ac4`](https://github.com/nodejs/node/commit/705e623ac4)] - **esm**: remove `globalPreload` hook (superseded by `initialize`) (Jacob Smith) [#49144](https://github.com/nodejs/node/pull/49144) +* \[[`18a818744f`](https://github.com/nodejs/node/commit/18a818744f)] - **fs**: improve error performance of `readdirSync` (Yagiz Nizipli) [#50131](https://github.com/nodejs/node/pull/50131) +* \[[`d3985296a9`](https://github.com/nodejs/node/commit/d3985296a9)] - **fs**: fix `unlinkSync` typings (Yagiz Nizipli) [#49859](https://github.com/nodejs/node/pull/49859) +* \[[`6bc7fa7906`](https://github.com/nodejs/node/commit/6bc7fa7906)] - **fs**: improve error perf of sync `chmod`+`fchmod` (CanadaHonk) [#49859](https://github.com/nodejs/node/pull/49859) +* \[[`6bd77db41f`](https://github.com/nodejs/node/commit/6bd77db41f)] - **fs**: improve error perf of sync `*times` (CanadaHonk) [#49864](https://github.com/nodejs/node/pull/49864) +* \[[`bf0f0789da`](https://github.com/nodejs/node/commit/bf0f0789da)] - **fs**: improve error performance of writevSync (IlyasShabi) [#50038](https://github.com/nodejs/node/pull/50038) +* \[[`8a49735bae`](https://github.com/nodejs/node/commit/8a49735bae)] - **fs**: add flush option to createWriteStream() (Colin Ihrig) [#50093](https://github.com/nodejs/node/pull/50093) +* \[[`ed49722a8a`](https://github.com/nodejs/node/commit/ed49722a8a)] - **fs**: improve error performance for `ftruncateSync` (André Alves) [#50032](https://github.com/nodejs/node/pull/50032) +* \[[`e01c1d700d`](https://github.com/nodejs/node/commit/e01c1d700d)] - **fs**: add flush option to writeFile() functions (Colin Ihrig) [#50009](https://github.com/nodejs/node/pull/50009) +* \[[`f7a160d5b4`](https://github.com/nodejs/node/commit/f7a160d5b4)] - **fs**: improve error performance for `fdatasyncSync` (Jungku Lee) [#49898](https://github.com/nodejs/node/pull/49898) +* \[[`813713f211`](https://github.com/nodejs/node/commit/813713f211)] - **fs**: throw errors from sync branches instead of separate implementations (Joyee Cheung) [#49913](https://github.com/nodejs/node/pull/49913) +* \[[`b866e38192`](https://github.com/nodejs/node/commit/b866e38192)] - **http**: refactor to make servername option normalization testable (Rongjian Zhang) [#38733](https://github.com/nodejs/node/pull/38733) +* \[[`2990390359`](https://github.com/nodejs/node/commit/2990390359)] - **inspector**: simplify dispatchProtocolMessage (Daniel Lemire) [#49780](https://github.com/nodejs/node/pull/49780) +* \[[`d4c5fe488e`](https://github.com/nodejs/node/commit/d4c5fe488e)] - **lib**: fix compileFunction throws range error for negative numbers (Jithil P Ponnan) [#49855](https://github.com/nodejs/node/pull/49855) +* \[[`589ac5004c`](https://github.com/nodejs/node/commit/589ac5004c)] - **lib**: faster internal createBlob (Vinícius Lourenço) [#49730](https://github.com/nodejs/node/pull/49730) +* \[[`952cf0d17a`](https://github.com/nodejs/node/commit/952cf0d17a)] - **lib**: reduce overhead of validateObject (Vinicius Lourenço) [#49928](https://github.com/nodejs/node/pull/49928) +* \[[`fa250fdec1`](https://github.com/nodejs/node/commit/fa250fdec1)] - **lib**: make fetch sync and return a Promise (Matthew Aitken) [#49936](https://github.com/nodejs/node/pull/49936) +* \[[`1b96975f27`](https://github.com/nodejs/node/commit/1b96975f27)] - **lib**: fix `primordials` typings (Sam Verschueren) [#49895](https://github.com/nodejs/node/pull/49895) +* \[[`6aa7101960`](https://github.com/nodejs/node/commit/6aa7101960)] - **lib**: update params in jsdoc for `HTTPRequestOptions` (Jungku Lee) [#49872](https://github.com/nodejs/node/pull/49872) +* \[[`a4fdb1abe0`](https://github.com/nodejs/node/commit/a4fdb1abe0)] - **lib,test**: do not hardcode Buffer.kMaxLength (Michaël Zasso) [#49876](https://github.com/nodejs/node/pull/49876) +* \[[`fd21429ef5`](https://github.com/nodejs/node/commit/fd21429ef5)] - **lib**: update usage of always on Atomics API (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`bac85be22d`](https://github.com/nodejs/node/commit/bac85be22d)] - **meta**: ping TSC for offboarding (Tobias Nießen) [#50147](https://github.com/nodejs/node/pull/50147) +* \[[`609b13e6c2`](https://github.com/nodejs/node/commit/609b13e6c2)] - **meta**: bump actions/upload-artifact from 3.1.2 to 3.1.3 (dependabot\[bot]) [#50000](https://github.com/nodejs/node/pull/50000) +* \[[`3825464ef4`](https://github.com/nodejs/node/commit/3825464ef4)] - **meta**: bump actions/cache from 3.3.1 to 3.3.2 (dependabot\[bot]) [#50003](https://github.com/nodejs/node/pull/50003) +* \[[`49f0f9ca11`](https://github.com/nodejs/node/commit/49f0f9ca11)] - **meta**: bump github/codeql-action from 2.21.5 to 2.21.9 (dependabot\[bot]) [#50002](https://github.com/nodejs/node/pull/50002) +* \[[`f156427244`](https://github.com/nodejs/node/commit/f156427244)] - **meta**: bump actions/checkout from 3.6.0 to 4.1.0 (dependabot\[bot]) [#50001](https://github.com/nodejs/node/pull/50001) +* \[[`0fe673c7e6`](https://github.com/nodejs/node/commit/0fe673c7e6)] - **meta**: update website team with new name (Rich Trott) [#49883](https://github.com/nodejs/node/pull/49883) +* \[[`51f4ff2450`](https://github.com/nodejs/node/commit/51f4ff2450)] - **module**: move helpers out of cjs loader (Geoffrey Booth) [#49912](https://github.com/nodejs/node/pull/49912) +* \[[`7517c9f95b`](https://github.com/nodejs/node/commit/7517c9f95b)] - **module, esm**: jsdoc for modules files (Geoffrey Booth) [#49523](https://github.com/nodejs/node/pull/49523) +* \[[`b55adfb4f1`](https://github.com/nodejs/node/commit/b55adfb4f1)] - **node-api**: update headers for better wasm support (Toyo Li) [#49037](https://github.com/nodejs/node/pull/49037) +* \[[`b38e312486`](https://github.com/nodejs/node/commit/b38e312486)] - **node-api**: run finalizers directly from GC (Vladimir Morozov) [#42651](https://github.com/nodejs/node/pull/42651) +* \[[`0f0dd1a493`](https://github.com/nodejs/node/commit/0f0dd1a493)] - **os**: cache homedir, remove getCheckedFunction (Aras Abbasi) [#50037](https://github.com/nodejs/node/pull/50037) +* \[[`0e507d30ac`](https://github.com/nodejs/node/commit/0e507d30ac)] - **perf\_hooks**: reduce overhead of new user timings (Vinicius Lourenço) [#49914](https://github.com/nodejs/node/pull/49914) +* \[[`328bdac7f0`](https://github.com/nodejs/node/commit/328bdac7f0)] - **perf\_hooks**: reducing overhead of performance observer entry list (Vinicius Lourenço) [#50008](https://github.com/nodejs/node/pull/50008) +* \[[`e6e320ecc7`](https://github.com/nodejs/node/commit/e6e320ecc7)] - **perf\_hooks**: reduce overhead of new resource timings (Vinicius Lourenço) [#49837](https://github.com/nodejs/node/pull/49837) +* \[[`971af4b211`](https://github.com/nodejs/node/commit/971af4b211)] - **quic**: fix up coverity warning in quic/session.cc (Michael Dawson) [#49865](https://github.com/nodejs/node/pull/49865) +* \[[`546797f2b1`](https://github.com/nodejs/node/commit/546797f2b1)] - **quic**: prevent copying ngtcp2\_cid (Tobias Nießen) [#48561](https://github.com/nodejs/node/pull/48561) +* \[[`ac6f594c97`](https://github.com/nodejs/node/commit/ac6f594c97)] - **quic**: address new coverity warning (Michael Dawson) [#48384](https://github.com/nodejs/node/pull/48384) +* \[[`4ee8ef269b`](https://github.com/nodejs/node/commit/4ee8ef269b)] - **quic**: prevent copying ngtcp2\_cid\_token (Tobias Nießen) [#48370](https://github.com/nodejs/node/pull/48370) +* \[[`6d2811fbf2`](https://github.com/nodejs/node/commit/6d2811fbf2)] - **quic**: add additional implementation (James M Snell) [#47927](https://github.com/nodejs/node/pull/47927) +* \[[`0b3fcfcf35`](https://github.com/nodejs/node/commit/0b3fcfcf35)] - **quic**: fix typo in endpoint.h (Tobias Nießen) [#47911](https://github.com/nodejs/node/pull/47911) +* \[[`76044c4e2b`](https://github.com/nodejs/node/commit/76044c4e2b)] - **quic**: add additional QUIC implementation (James M Snell) [#47603](https://github.com/nodejs/node/pull/47603) +* \[[`78a15702dd`](https://github.com/nodejs/node/commit/78a15702dd)] - **src**: avoid making JSTransferable wrapper object weak (Chengzhong Wu) [#50026](https://github.com/nodejs/node/pull/50026) +* \[[`387e2929fe`](https://github.com/nodejs/node/commit/387e2929fe)] - **src**: generate default snapshot with --predictable (Joyee Cheung) [#48749](https://github.com/nodejs/node/pull/48749) +* \[[`1643adf771`](https://github.com/nodejs/node/commit/1643adf771)] - **src**: fix TLSWrap lifetime bug in ALPN callback (Ben Noordhuis) [#49635](https://github.com/nodejs/node/pull/49635) +* \[[`66776d8665`](https://github.com/nodejs/node/commit/66776d8665)] - **src**: set port in node\_options to uint16\_t (Yagiz Nizipli) [#49151](https://github.com/nodejs/node/pull/49151) +* \[[`55ff64001a`](https://github.com/nodejs/node/commit/55ff64001a)] - **src**: name scoped lock (Mohammed Keyvanzadeh) [#50010](https://github.com/nodejs/node/pull/50010) +* \[[`b903a710f4`](https://github.com/nodejs/node/commit/b903a710f4)] - **src**: use exact return value for `uv_os_getenv` (Yagiz Nizipli) [#49149](https://github.com/nodejs/node/pull/49149) +* \[[`43500fa646`](https://github.com/nodejs/node/commit/43500fa646)] - **src**: move const variable in `node_file.h` to `node_file.cc` (Jungku Lee) [#49688](https://github.com/nodejs/node/pull/49688) +* \[[`36ab510da7`](https://github.com/nodejs/node/commit/36ab510da7)] - **src**: remove unused variable (Michaël Zasso) [#49665](https://github.com/nodejs/node/pull/49665) +* \[[`23d65e7281`](https://github.com/nodejs/node/commit/23d65e7281)] - **src**: revert `IS_RELEASE` to 0 (Rafael Gonzaga) [#49084](https://github.com/nodejs/node/pull/49084) +* \[[`38dee8a1c0`](https://github.com/nodejs/node/commit/38dee8a1c0)] - **src**: distinguish HTML transferable and cloneable (Chengzhong Wu) [#47956](https://github.com/nodejs/node/pull/47956) +* \[[`586fcff061`](https://github.com/nodejs/node/commit/586fcff061)] - **src**: fix logically dead code reported by Coverity (Mohammed Keyvanzadeh) [#48589](https://github.com/nodejs/node/pull/48589) +* \[[`7f2c810814`](https://github.com/nodejs/node/commit/7f2c810814)] - **src,tools**: initialize cppgc (Daryl Haresign) [#45704](https://github.com/nodejs/node/pull/45704) +* \[[`aad8002b88`](https://github.com/nodejs/node/commit/aad8002b88)] - **stream**: use private symbol for bitmap state (Robert Nagy) [#49993](https://github.com/nodejs/node/pull/49993) +* \[[`a85e4186e5`](https://github.com/nodejs/node/commit/a85e4186e5)] - **stream**: reduce overhead of transfer (Vinicius Lourenço) [#50107](https://github.com/nodejs/node/pull/50107) +* \[[`e9bda11761`](https://github.com/nodejs/node/commit/e9bda11761)] - **stream**: lazy allocate back pressure buffer (Robert Nagy) [#50013](https://github.com/nodejs/node/pull/50013) +* \[[`557044af40`](https://github.com/nodejs/node/commit/557044af40)] - **stream**: avoid unnecessary drain for sync stream (Robert Nagy) [#50014](https://github.com/nodejs/node/pull/50014) +* \[[`95b8f5dcab`](https://github.com/nodejs/node/commit/95b8f5dcab)] - **stream**: optimize Writable (Robert Nagy) [#50012](https://github.com/nodejs/node/pull/50012) +* \[[`5de25deeb9`](https://github.com/nodejs/node/commit/5de25deeb9)] - **stream**: avoid tick in writable hot path (Robert Nagy) [#49966](https://github.com/nodejs/node/pull/49966) +* \[[`53b5545672`](https://github.com/nodejs/node/commit/53b5545672)] - **stream**: writable state bitmap (Robert Nagy) [#49899](https://github.com/nodejs/node/pull/49899) +* \[[`d4e99b1a66`](https://github.com/nodejs/node/commit/d4e99b1a66)] - **stream**: remove asIndexedPairs (Chemi Atlow) [#48150](https://github.com/nodejs/node/pull/48150) +* \[[`41e4174945`](https://github.com/nodejs/node/commit/41e4174945)] - **test**: replace forEach with for..of in test-net-isipv6.js (Niya Shiyas) [#49823](https://github.com/nodejs/node/pull/49823) +* \[[`f0e720a7fa`](https://github.com/nodejs/node/commit/f0e720a7fa)] - **test**: add EOVERFLOW as an allowed error (Abdirahim Musse) [#50128](https://github.com/nodejs/node/pull/50128) +* \[[`224f3ae974`](https://github.com/nodejs/node/commit/224f3ae974)] - **test**: reduce number of repetition in test-heapdump-shadowrealm.js (Chengzhong Wu) [#50104](https://github.com/nodejs/node/pull/50104) +* \[[`76004f3e56`](https://github.com/nodejs/node/commit/76004f3e56)] - **test**: replace forEach with for..of in test-parse-args.mjs (Niya Shiyas) [#49824](https://github.com/nodejs/node/pull/49824) +* \[[`fce8fbadcd`](https://github.com/nodejs/node/commit/fce8fbadcd)] - **test**: replace forEach with for..of in test-process-env (Niya Shiyas) [#49825](https://github.com/nodejs/node/pull/49825) +* \[[`24492476a7`](https://github.com/nodejs/node/commit/24492476a7)] - **test**: replace forEach with for..of in test-http-url (Niya Shiyas) [#49840](https://github.com/nodejs/node/pull/49840) +* \[[`2fe511ba23`](https://github.com/nodejs/node/commit/2fe511ba23)] - **test**: replace forEach() in test-net-perf\_hooks with for of (Narcisa Codreanu) [#49831](https://github.com/nodejs/node/pull/49831) +* \[[`42c37f28e6`](https://github.com/nodejs/node/commit/42c37f28e6)] - **test**: change forEach to for...of (Tiffany Lastimosa) [#49799](https://github.com/nodejs/node/pull/49799) +* \[[`6c9625dca4`](https://github.com/nodejs/node/commit/6c9625dca4)] - **test**: update skip for moved `test-wasm-web-api` (Richard Lau) [#49958](https://github.com/nodejs/node/pull/49958) +* \[[`f05d6d090c`](https://github.com/nodejs/node/commit/f05d6d090c)] - _**Revert**_ "**test**: mark test-runner-output as flaky" (Luigi Pinca) [#49905](https://github.com/nodejs/node/pull/49905) +* \[[`035e06317a`](https://github.com/nodejs/node/commit/035e06317a)] - **test**: disambiguate AIX and IBM i (Richard Lau) [#48056](https://github.com/nodejs/node/pull/48056) +* \[[`4d0aeed4a6`](https://github.com/nodejs/node/commit/4d0aeed4a6)] - **test**: deflake test-perf-hooks.js (Joyee Cheung) [#49892](https://github.com/nodejs/node/pull/49892) +* \[[`853f57239c`](https://github.com/nodejs/node/commit/853f57239c)] - **test**: migrate message error tests from Python to JS (Yiyun Lei) [#49721](https://github.com/nodejs/node/pull/49721) +* \[[`a71e3a65bb`](https://github.com/nodejs/node/commit/a71e3a65bb)] - **test**: fix edge snapshot stack traces (Geoffrey Booth) [#49659](https://github.com/nodejs/node/pull/49659) +* \[[`6b76b7782c`](https://github.com/nodejs/node/commit/6b76b7782c)] - **test**: skip v8-updates/test-linux-perf (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`c13c98dd38`](https://github.com/nodejs/node/commit/c13c98dd38)] - **test**: skip test-tick-processor-arguments on SmartOS (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`738aa304b3`](https://github.com/nodejs/node/commit/738aa304b3)] - **test**: adapt REPL test to V8 changes (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`de5c009252`](https://github.com/nodejs/node/commit/de5c009252)] - **test**: adapt test-fs-write to V8 internal changes (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`8c36168b42`](https://github.com/nodejs/node/commit/8c36168b42)] - **test**: update flag to disable SharedArrayBuffer (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`6ccb15f7ef`](https://github.com/nodejs/node/commit/6ccb15f7ef)] - **test**: adapt debugger tests to V8 11.4 (Philip Pfaffe) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`c5de3b49e8`](https://github.com/nodejs/node/commit/c5de3b49e8)] - **test,crypto**: update WebCryptoAPI WPT (Filip Skokan) [#50039](https://github.com/nodejs/node/pull/50039) +* \[[`4b35a9cfda`](https://github.com/nodejs/node/commit/4b35a9cfda)] - **test\_runner**: add test location for FileTests (Colin Ihrig) [#49999](https://github.com/nodejs/node/pull/49999) +* \[[`c935d4c8fa`](https://github.com/nodejs/node/commit/c935d4c8fa)] - **test\_runner**: replace spurious if with else (Colin Ihrig) [#49943](https://github.com/nodejs/node/pull/49943) +* \[[`a4c7f81241`](https://github.com/nodejs/node/commit/a4c7f81241)] - **test\_runner**: catch reporter errors (Moshe Atlow) [#49646](https://github.com/nodejs/node/pull/49646) +* \[[`bb52656fc6`](https://github.com/nodejs/node/commit/bb52656fc6)] - _**Revert**_ "**test\_runner**: run global after() hook earlier" (Joyee Cheung) [#49110](https://github.com/nodejs/node/pull/49110) +* \[[`6346bdc526`](https://github.com/nodejs/node/commit/6346bdc526)] - **test\_runner**: run global after() hook earlier (Colin Ihrig) [#49059](https://github.com/nodejs/node/pull/49059) +* \[[`0d8faf2952`](https://github.com/nodejs/node/commit/0d8faf2952)] - **test\_runner,test**: fix flaky test-runner-cli-concurrency.js (Colin Ihrig) [#50108](https://github.com/nodejs/node/pull/50108) +* \[[`b1ada0ad55`](https://github.com/nodejs/node/commit/b1ada0ad55)] - **tls**: handle cases where the raw socket is destroyed (Luigi Pinca) [#49980](https://github.com/nodejs/node/pull/49980) +* \[[`fae1af0a75`](https://github.com/nodejs/node/commit/fae1af0a75)] - **tls**: ciphers allow bang syntax (Chemi Atlow) [#49712](https://github.com/nodejs/node/pull/49712) +* \[[`766198b9e1`](https://github.com/nodejs/node/commit/766198b9e1)] - **tools**: fix comments referencing dep\_updaters scripts (Keksonoid) [#50165](https://github.com/nodejs/node/pull/50165) +* \[[`760b5dd259`](https://github.com/nodejs/node/commit/760b5dd259)] - **tools**: remove no-return-await lint rule (翠 / green) [#50118](https://github.com/nodejs/node/pull/50118) +* \[[`a0a5b751fb`](https://github.com/nodejs/node/commit/a0a5b751fb)] - **tools**: update lint-md-dependencies (Node.js GitHub Bot) [#50083](https://github.com/nodejs/node/pull/50083) +* \[[`69fb55e6b9`](https://github.com/nodejs/node/commit/69fb55e6b9)] - **tools**: update eslint to 8.51.0 (Node.js GitHub Bot) [#50084](https://github.com/nodejs/node/pull/50084) +* \[[`f73650ea52`](https://github.com/nodejs/node/commit/f73650ea52)] - **tools**: remove genv8constants.py (Ben Noordhuis) [#50023](https://github.com/nodejs/node/pull/50023) +* \[[`581434e54f`](https://github.com/nodejs/node/commit/581434e54f)] - **tools**: update eslint to 8.50.0 (Node.js GitHub Bot) [#49989](https://github.com/nodejs/node/pull/49989) +* \[[`344d3c4b7c`](https://github.com/nodejs/node/commit/344d3c4b7c)] - **tools**: update lint-md-dependencies (Node.js GitHub Bot) [#49983](https://github.com/nodejs/node/pull/49983) +* \[[`7f06c270c6`](https://github.com/nodejs/node/commit/7f06c270c6)] - **tools**: add navigation ARIA landmark to generated API ToC (Rich Trott) [#49882](https://github.com/nodejs/node/pull/49882) +* \[[`e97d25687b`](https://github.com/nodejs/node/commit/e97d25687b)] - **tools**: use osx notarytool for future releases (Ulises Gascon) [#48701](https://github.com/nodejs/node/pull/48701) +* \[[`3f1936f698`](https://github.com/nodejs/node/commit/3f1936f698)] - **tools**: update github\_reporter to 1.5.3 (Node.js GitHub Bot) [#49877](https://github.com/nodejs/node/pull/49877) +* \[[`8568de3da6`](https://github.com/nodejs/node/commit/8568de3da6)] - **tools**: add new V8 headers to distribution (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`86cb23d09f`](https://github.com/nodejs/node/commit/86cb23d09f)] - **tools**: update V8 gypfiles for 11.8 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`9c6219c7e2`](https://github.com/nodejs/node/commit/9c6219c7e2)] - **tools**: update V8 gypfiles for 11.7 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`73ddf50163`](https://github.com/nodejs/node/commit/73ddf50163)] - **tools**: update V8 gypfiles for 11.6 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`817ef255ea`](https://github.com/nodejs/node/commit/817ef255ea)] - **tools**: update V8 gypfiles for 11.5 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`f34a3a9861`](https://github.com/nodejs/node/commit/f34a3a9861)] - **tools**: update V8 gypfiles for 11.4 (Michaël Zasso) [#49639](https://github.com/nodejs/node/pull/49639) +* \[[`9df864ddeb`](https://github.com/nodejs/node/commit/9df864ddeb)] - **typings**: use `Symbol.dispose` and `Symbol.asyncDispose` in types (Niklas Mollenhauer) [#50123](https://github.com/nodejs/node/pull/50123) +* \[[`54bb691c0b`](https://github.com/nodejs/node/commit/54bb691c0b)] - **util**: lazy parse mime parameters (Aras Abbasi) [#49889](https://github.com/nodejs/node/pull/49889) +* \[[`1d220b55ac`](https://github.com/nodejs/node/commit/1d220b55ac)] - **vm**: use default HDO when importModuleDynamically is not set (Joyee Cheung) [#49950](https://github.com/nodejs/node/pull/49950) +* \[[`c1a3a98560`](https://github.com/nodejs/node/commit/c1a3a98560)] - **wasi**: address coverity warning (Michael Dawson) [#49866](https://github.com/nodejs/node/pull/49866) +* \[[`9cb8eb7177`](https://github.com/nodejs/node/commit/9cb8eb7177)] - **wasi**: fix up wasi tests for ibmi (Michael Dawson) [#49953](https://github.com/nodejs/node/pull/49953) +* \[[`16ac5e1ca8`](https://github.com/nodejs/node/commit/16ac5e1ca8)] - **zlib**: fix discovery of cpu-features.h for android (MatteoBax) [#49828](https://github.com/nodejs/node/pull/49828) diff --git a/doc/changelogs/CHANGELOG_V4.md b/doc/changelogs/CHANGELOG_V4.md index d9c8d9193aa957..e8baa5a615a346 100644 --- a/doc/changelogs/CHANGELOG_V4.md +++ b/doc/changelogs/CHANGELOG_V4.md @@ -56,6 +56,7 @@ * Other Versions + * [21.x](CHANGELOG_V21.md) * [20.x](CHANGELOG_V20.md) * [19.x](CHANGELOG_V19.md) * [18.x](CHANGELOG_V18.md) diff --git a/doc/changelogs/CHANGELOG_V5.md b/doc/changelogs/CHANGELOG_V5.md index 0949a73b63d327..6cd42b15b33120 100644 --- a/doc/changelogs/CHANGELOG_V5.md +++ b/doc/changelogs/CHANGELOG_V5.md @@ -32,6 +32,7 @@ * Other Versions + * [21.x](CHANGELOG_V21.md) * [20.x](CHANGELOG_V20.md) * [19.x](CHANGELOG_V19.md) * [18.x](CHANGELOG_V18.md) diff --git a/doc/changelogs/CHANGELOG_V6.md b/doc/changelogs/CHANGELOG_V6.md index e891c4e298c6ea..836c64edb73413 100644 --- a/doc/changelogs/CHANGELOG_V6.md +++ b/doc/changelogs/CHANGELOG_V6.md @@ -61,6 +61,7 @@ * Other Versions + * [21.x](CHANGELOG_V21.md) * [20.x](CHANGELOG_V20.md) * [19.x](CHANGELOG_V19.md) * [18.x](CHANGELOG_V18.md) diff --git a/doc/changelogs/CHANGELOG_V7.md b/doc/changelogs/CHANGELOG_V7.md index 702c212ace22f6..22a976ed15e068 100644 --- a/doc/changelogs/CHANGELOG_V7.md +++ b/doc/changelogs/CHANGELOG_V7.md @@ -30,6 +30,7 @@ * Other Versions + * [21.x](CHANGELOG_V21.md) * [20.x](CHANGELOG_V20.md) * [19.x](CHANGELOG_V19.md) * [18.x](CHANGELOG_V18.md) diff --git a/doc/changelogs/CHANGELOG_V8.md b/doc/changelogs/CHANGELOG_V8.md index cac64544bfa11b..00ecd10cef07aa 100644 --- a/doc/changelogs/CHANGELOG_V8.md +++ b/doc/changelogs/CHANGELOG_V8.md @@ -52,6 +52,7 @@ * Other Versions + * [21.x](CHANGELOG_V21.md) * [20.x](CHANGELOG_V20.md) * [19.x](CHANGELOG_V19.md) * [18.x](CHANGELOG_V18.md) diff --git a/doc/changelogs/CHANGELOG_V9.md b/doc/changelogs/CHANGELOG_V9.md index b5531909ea243f..46937b022a501f 100644 --- a/doc/changelogs/CHANGELOG_V9.md +++ b/doc/changelogs/CHANGELOG_V9.md @@ -31,6 +31,7 @@ * Other Versions + * [21.x](CHANGELOG_V21.md) * [20.x](CHANGELOG_V20.md) * [19.x](CHANGELOG_V19.md) * [18.x](CHANGELOG_V18.md) diff --git a/doc/contributing/adding-new-napi-api.md b/doc/contributing/adding-new-napi-api.md index 8d2233bc30f690..a970ed037714ec 100644 --- a/doc/contributing/adding-new-napi-api.md +++ b/doc/contributing/adding-new-napi-api.md @@ -34,6 +34,10 @@ Node-API. * Experimental APIs **must** be documented as such. * Experimental APIs **must** require an explicit compile-time flag (`#define`) to be set to opt-in. + * A feature flag of the form `NODE_API_EXPERIMENTAL_HAS_` **must** + be added with each experimental feature in order to allow code to + distinguish between experimental features as present in one version of + Node.js versus another. * Experimental APIs **must** be considered for backport. * Experimental status exit criteria **must** involve at least the following: @@ -47,3 +51,16 @@ Node-API. to the decision to take an API out of experimental status. * The API **must** be implemented in a Node.js implementation with an alternate VM. + +Since the adoption of the policy whereby moving to a later version of Node-API +from an earlier version may entail rework of existing code, it is possible to +introduce modifications to already-released Node-APIs, as long as the +modifications affect neither the ABI nor the API of earlier versions. Such +modifications **must** be accompanied by an opt-out flag. This provides add-on +maintainers who take advantage of the initial compile-time flag to track +impending changes to Node-API with + +* a quick fix to the breakage caused, +* a notification that such breakage is impending, and thus +* a buffer to adoption above and beyond the one provided by the initial + compile-time flag. diff --git a/doc/contributing/collaborator-guide.md b/doc/contributing/collaborator-guide.md index 2ecf14a082dc3b..2bf751b7076139 100644 --- a/doc/contributing/collaborator-guide.md +++ b/doc/contributing/collaborator-guide.md @@ -532,9 +532,10 @@ The TSC serves as the final arbiter where required. [build](https://github.com/nodejs/build/issues) repositories, open new issues. Run a new CI any time someone pushes new code to the pull request. 4. Check that the commit message adheres to [commit message guidelines][]. -5. Add all necessary [metadata](#metadata) to commit messages before landing. If - you are unsure exactly how to format the commit messages, use the commit log - as a reference. See [this commit][commit-example] as an example. +5. Add all necessary [metadata][git-node-metadata] to commit messages before + landing. If you are unsure exactly how to format the commit messages, use + the commit log as a reference. See [this commit][commit-example] as an + example. For pull requests from first-time contributors, be [welcoming](#welcoming-first-time-contributors). Also, verify that their git diff --git a/doc/contributing/maintaining/maintaining-dependencies.md b/doc/contributing/maintaining/maintaining-dependencies.md index 05f15ff758554e..fdb645f3ec3b8b 100644 --- a/doc/contributing/maintaining/maintaining-dependencies.md +++ b/doc/contributing/maintaining/maintaining-dependencies.md @@ -8,30 +8,31 @@ directories to create the Node.js binaries. All dependencies are located within the `deps` directory. This a list of all the dependencies: -* [acorn 8.10.0][] -* [ada 2.6.10][] -* [base64 0.5.0][] -* [brotli 1.0.9][] -* [c-ares 1.19.0][] -* [cjs-module-lexer 1.2.2][] +* [acorn][] +* [ada][] +* [base64][] +* [brotli][] +* [c-ares][] +* [cjs-module-lexer][] * [corepack][] -* [googletest 2dd1c13][] -* [histogram 0.11.8][] -* [icu-small 73.2][] -* [libuv 1.46.0][] -* [llhttp 9.1.2][] -* [minimatch 9.0.3][] -* [nghttp2 1.57.0][] -* [nghttp3 0.7.0][] -* [ngtcp2 0.8.1][] -* [npm 9.6.7][] -* [openssl 3.0.8][] -* [postject 1.0.0-alpha.6][] -* [simdutf 3.2.18][] -* [undici 5.26.3][] -* [uvwasi 0.0.19][] -* [V8 11.8.172.12][] -* [zlib 1.2.13.1-motley-fef5869][] +* [googletest][] +* [histogram][] +* [icu-small][] +* [libuv][] +* [llhttp][] +* [minimatch][] +* [nghttp2][] +* [nghttp3][] +* [ngtcp2][] +* [npm][] +* [openssl][] +* [postject][] +* [simdjson][] +* [simdutf][] +* [undici][] +* [uvwasi][] +* [V8][] +* [zlib][] Any code which meets one or more of these conditions should be managed as a dependency: @@ -144,35 +145,35 @@ takes care of npm update, it is maintained by the npm team. ## Dependency list -### acorn 8.10.0 +### acorn The [acorn](https://github.com/acornjs/acorn) dependency is a JavaScript parser. [acorn-walk](https://github.com/acornjs/acorn/tree/master/acorn-walk) is an abstract syntax tree walker for the ESTree format. -### ada 2.6.10 +### ada The [ada](https://github.com/ada-url/ada) dependency is a fast and spec-compliant URL parser written in C++. -### base64 0.5.0 +### base64 The [base64](https://github.com/aklomp/base64) dependency is a base64 stream encoding/decoding library in C99 with SIMD and OpenMP acceleration. It also contains wrapper functions to encode/decode simple length-delimited strings. -### brotli 1.0.9 +### brotli The [brotli](https://github.com/google/brotli) dependency is used for the homonym generic-purpose lossless compression algorithm. -### c-ares 1.19.0 +### c-ares The [c-ares](https://github.com/c-ares/c-ares) is a C library for asynchronous DNS requests. -### cjs-module-lexer 1.2.2 +### cjs-module-lexer The [cjs-module-lexer](https://github.com/nodejs/node/tree/HEAD/deps/cjs-module-lexer) dependency is used within the Node.js ESM implementation to detect the @@ -189,52 +190,52 @@ In practical terms, Corepack will let you use Yarn and pnpm without having to install them - just like what currently happens with npm, which is shipped by Node.js by default. -### googletest 2dd1c13 +### googletest The [googletest](https://github.com/google/googletest) dependency is Google’s C++ testing and mocking framework. -### histogram 0.11.8 +### histogram The [histogram](https://github.com/HdrHistogram/HdrHistogram_c) dependency is a C port of High Dynamic Range (HDR) Histogram. -### icu-small 73.2 +### ic The [icu](http://site.icu-project.org) is widely used set of C/C++ and Java libraries providing Unicode and Globalization support for software applications. See [maintaining-icu][] for more informations. -### libuv 1.46.0 +### libuv The [libuv](https://github.com/libuv/libuv) dependency is a multi-platform support library with a focus on asynchronous I/O. It was primarily developed for use by Node.js. -### llhttp 9.1.2 +### llhttp The [llhttp](https://github.com/nodejs/llhttp) dependency is the http parser used by Node.js. See [maintaining-http][] for more informations. -### minimatch 9.0.3 +### minimatch The [minimatch](https://github.com/isaacs/minimatch) dependency is a minimal matching utility. -### nghttp2 1.57.0 +### nghttp2 The [nghttp2](https://github.com/nghttp2/nghttp2) dependency is a C library implementing HTTP/2 protocol. See [maintaining-http][] for more informations. -### nghttp3 0.7.0 +### nghttp3 The [nghttp3](https://github.com/ngtcp2/nghttp3) dependency is HTTP/3 library written in C. See ngtcp2 for more informations. -### ngtcp2 0.8.1 +### ngtcp2 The ngtcp2 and nghttp3 dependencies provide the core functionality for QUIC and HTTP/3. @@ -254,7 +255,7 @@ The `nghttp3` library depends on `ngtcp2`. Both should always be updated together. From `ngtcp2` we only want the contents of the `lib` and `crypto` directories; from `nghttp3` we only want the contents of the `lib` directory. -### npm 9.6.7 +### npm The [npm](https://github.com/npm/cli) dependency is the package manager for JavaScript. @@ -269,7 +270,7 @@ are at the discretion of the release and LTS teams. This process only covers full updates to new versions of npm. Cherry-picked changes can be reviewed and landed via the normal consensus seeking process. -### openssl 3.0.8 +### openssl The [openssl](https://github.com/quictls/openssl) dependency is a fork of OpenSSL to enable QUIC. @@ -281,23 +282,28 @@ the main openssl/openssl releases with the addition of APIs to support the QUIC protocol. See [maintaining-openssl][] for more informations. -### postject 1.0.0-alpha.6 +### postject The [postject](https://github.com/nodejs/postject) dependency is used for the [Single Executable strategic initiative](https://github.com/nodejs/single-executable). -### simdutf 3.2.18 +### simdjson + +The [simdjson](https://github.com/simdjson/simdjson) dependency is +a C++ library for fast JSON parsing. + +### simdutf The [simdutf](https://github.com/simdutf/simdutf) dependency is a C++ library for fast UTF-8 decoding and encoding. -### undici 5.26.3 +### undici The [undici](https://github.com/nodejs/undici) dependency is an HTTP/1.1 client, written from scratch for Node.js.. See [maintaining-http][] for more informations. -### uvwasi 0.0.19 +### uvwasi The [uvwasi](https://github.com/nodejs/uvwasi) dependency implements the WASI system call API, so that WebAssembly runtimes can easily @@ -305,48 +311,49 @@ implement WASI calls. Under the hood, uvwasi leverages libuv where possible for maximum portability. See [maintaining-web-assembly][] for more informations. -### V8 11.8.172.12 +### V8 [V8](https://chromium.googlesource.com/v8/v8.git/) is Google's open source high-performance JavaScript and WebAssembly engine, written in C++. See [maintaining-V8][] for more informations. -### zlib 1.2.13.1-motley-fef5869 +### zlib The [zlib](https://chromium.googlesource.com/chromium/src/+/refs/heads/main/third_party/zlib) dependency lossless data-compression library, it comes from the Chromium team's zlib fork which incorporated performance improvements not currently available in standard zlib. -[acorn 8.10.0]: #acorn-8100 -[ada 2.6.10]: #ada-2610 -[base64 0.5.0]: #base64-050 -[brotli 1.0.9]: #brotli-109 -[c-ares 1.19.0]: #c-ares-1190 -[cjs-module-lexer 1.2.2]: #cjs-module-lexer-122 +[acorn]: #acorn +[ada]: #ada +[base64]: #base64 +[brotli]: #brotli +[c-ares]: #c-ares +[cjs-module-lexer]: #cjs-module-lexer [corepack]: #corepack [dependency-update-action]: ../../../.github/workflows/tools.yml -[googletest 2dd1c13]: #googletest-2dd1c13 -[histogram 0.11.8]: #histogram-0118 -[icu-small 73.2]: #icu-small-732 -[libuv 1.46.0]: #libuv-1460 -[llhttp 9.1.2]: #llhttp-912 +[googletest]: #googletest +[histogram]: #histogram +[icu-small]: #icu-small +[libuv]: #libuv +[llhttp]: #llhttp [maintaining-V8]: ./maintaining-V8.md [maintaining-cjs-module-lexer]: ./maintaining-cjs-module-lexer.md [maintaining-http]: ./maintaining-http.md [maintaining-icu]: ./maintaining-icu.md [maintaining-openssl]: ./maintaining-openssl.md [maintaining-web-assembly]: ./maintaining-web-assembly.md -[minimatch 9.0.3]: #minimatch-903 -[nghttp2 1.57.0]: #nghttp2-1570 -[nghttp3 0.7.0]: #nghttp3-070 -[ngtcp2 0.8.1]: #ngtcp2-081 -[npm 9.6.7]: #npm-967 -[openssl 3.0.8]: #openssl-308 -[postject 1.0.0-alpha.6]: #postject-100-alpha6 -[simdutf 3.2.18]: #simdutf-3218 -[undici 5.26.3]: #undici-5263 +[minimatch]: #minimatch +[nghttp2]: #nghttp2 +[nghttp3]: #nghttp3 +[ngtcp2]: #ngtcp2 +[npm]: #npm +[openssl]: #openssl +[postject]: #postject +[simdjson]: #simdjson +[simdutf]: #simdutf +[undici]: #undici [update-openssl-action]: ../../../.github/workflows/update-openssl.yml -[uvwasi 0.0.19]: #uvwasi-0019 -[v8 11.8.172.12]: #v8-11817212 -[zlib 1.2.13.1-motley-fef5869]: #zlib-12131-motley-fef5869 +[uvwasi]: #uvwasi +[v8]: #v8 +[zlib]: #zlib diff --git a/doc/contributing/primordials.md b/doc/contributing/primordials.md index 5570a17f6bc5bc..4ca383c41cbd25 100644 --- a/doc/contributing/primordials.md +++ b/doc/contributing/primordials.md @@ -122,6 +122,9 @@ performance of code in Node.js. * `SafePromiseAny` * `SafePromiseRace` * `SafePromisePrototypeFinally`: use `try {} finally {}` block instead. +* `ReflectConstruct`: Also affects `Reflect.construct`. + `ReflectConstruct` creates new types of classes inside functions. + Instead consider creating a shared class. See [nodejs/performance#109](https://github.com/nodejs/performance/issues/109). In general, when sending or reviewing a PR that makes changes in a hot code path, use extra caution and run extensive benchmarks. @@ -772,3 +775,49 @@ const proxyWithNullPrototypeObject = new Proxy(objectToProxy, { }); console.log(proxyWithNullPrototypeObject.someProperty); // genuine value ``` + +### Checking if an object is an instance of a class + +#### Using `instanceof` looks up the `@@hasInstance` property of the class + +```js +// User-land +Object.defineProperty(Array, Symbol.hasInstance, { + __proto__: null, + value: () => true, +}); +Object.defineProperty(Date, Symbol.hasInstance, { + __proto__: null, + value: () => false, +}); + +// Core +const { + FunctionPrototypeSymbolHasInstance, +} = primordials; + +console.log(new Date() instanceof Array); // true +console.log(new Date() instanceof Date); // false + +console.log(FunctionPrototypeSymbolHasInstance(Array, new Date())); // false +console.log(FunctionPrototypeSymbolHasInstance(Date, new Date())); // true +``` + +Even without user mutations, the result of `instanceof` can be deceiving when +dealing with values from different realms: + +```js +const vm = require('node:vm'); + +console.log(vm.runInNewContext('[]') instanceof Array); // false +console.log(vm.runInNewContext('[]') instanceof vm.runInNewContext('Array')); // false +console.log([] instanceof vm.runInNewContext('Array')); // false + +console.log(Array.isArray(vm.runInNewContext('[]'))); // true +console.log(vm.runInNewContext('Array').isArray(vm.runInNewContext('[]'))); // true +console.log(vm.runInNewContext('Array').isArray([])); // true +``` + +In general, using `instanceof` (or `FunctionPrototypeSymbolHasInstance`) checks +is not recommended, consider checking for the presence of properties or methods +for more reliable results. diff --git a/doc/contributing/releases-node-api.md b/doc/contributing/releases-node-api.md index f2277b228ec0d6..088900f88c91e0 100644 --- a/doc/contributing/releases-node-api.md +++ b/doc/contributing/releases-node-api.md @@ -84,7 +84,11 @@ define guards on the declaration of the new Node-API. Check for these guards with: ```bash -grep NAPI_EXPERIMENTAL src/js_native_api{_types,}.h src/node_api{_types,}.h +grep \ + -E \ + 'N(ODE_)?API_EXPERIMENTAL' \ + src/js_native_api{_types,}.h \ + src/node_api{_types,}.h ``` and update the define version guards with the release version: @@ -100,6 +104,11 @@ and update the define version guards with the release version: + #endif // NAPI_VERSION >= 10 ``` +Remove any feature flags of the form `NODE_API_EXPERIMENTAL_HAS_`. + +Remove any additional `NODE_API_EXPERIMENTAL_*` guards along with +`NAPI_EXPERIMENTAL`. + Also, update the Node-API version value of the `napi_get_version` test in `test/js-native-api/test_general/test.js` with the release version `x`: @@ -128,7 +137,11 @@ commits should already include `NAPI_EXPERIMENTAL` definition for the tests. Check for these definitions with: ```bash -grep NAPI_EXPERIMENTAL test/node-api/*/{*.{h,c},binding.gyp} test/js-native-api/*/{*.{h,c},binding.gyp} +grep \ + -E \ + 'N(ODE_)?API_EXPERIMENTAL' \ + test/node-api/*/{*.{h,c},binding.gyp} \ + test/js-native-api/*/{*.{h,c},binding.gyp} ``` and substitute the `NAPI_EXPERIMENTAL` with the release version @@ -139,6 +152,8 @@ and substitute the `NAPI_EXPERIMENTAL` with the release version + #define NAPI_VERSION 10 ``` +Remove any `NODE_API_EXPERIMENTAL_*` flags. + #### Step 4. Update document If this release includes new Node-APIs that were first released in this diff --git a/doc/contributing/releases.md b/doc/contributing/releases.md index 04d005ad8258a8..1f8eb24fcbb985 100644 --- a/doc/contributing/releases.md +++ b/doc/contributing/releases.md @@ -20,7 +20,7 @@ official release builds for Node.js, hosted on . * [5. Create release commit](#5-create-release-commit) * [6. Propose release on GitHub](#6-propose-release-on-github) * [7. Ensure that the release branch is stable](#7-ensure-that-the-release-branch-is-stable) - * [7.1 Updating the release _(optional)_](#7-1-updating-the-release-optional) + * [7.1 Updating the release _(optional)_](#71-updating-the-release-optional) * [8. Produce a nightly build _(optional)_](#8-produce-a-nightly-build-optional) * [9. Produce release builds](#9-produce-release-builds) * [10. Test the build](#10-test-the-build) @@ -32,9 +32,8 @@ official release builds for Node.js, hosted on . * [16. Check the release](#16-check-the-release) * [17. Create a blog post](#17-create-a-blog-post) * [18. Create the release on GitHub](#18-create-the-release-on-github) - * [19. Cleanup](#19-cleanup) - * [20. Announce](#20-announce) - * [21. Celebrate](#21-celebrate) + * [19. Announce](#19-announce) + * [20. Celebrate](#20-celebrate) * [LTS releases](#lts-releases) * [Major releases](#major-releases) @@ -1130,7 +1129,7 @@ In order to make sure a download URL (e.g: ) will be available for the new LTS release line you need to submit a PR to and add a new entry for the -new LTS codename in its `ltsNames` map located in the `./latest-linker.js` +new LTS codename in its `ltsNames` map located in the `./common.js` file. Make sure to reach out to the Build WG in order to validate that the new URL is @@ -1207,6 +1206,20 @@ Notify the `@nodejs/npm` team in the release proposal PR to inform them of the upcoming release. `npm` maintains a list of [supported versions](https://github.com/npm/cli/blob/latest/lib/utils/unsupported.js#L3) that will need updating to include the new major release. +To keep the branch in sync until the release date, it can be as simple as +doing the following: + +> Make sure to check that there are no PRs with the label `dont-land-on-vX.x`. + +```bash +git checkout vN.x +git reset --hard upstream/main +git checkout vN.x-staging +git reset --hard upstream/main +git push upstream vN.x +git push upstream vN.x-staging +``` + ### Update `NODE_MODULE_VERSION` This macro in `src/node_version.h` is used to signal an ABI version for native diff --git a/doc/contributing/security-release-process.md b/doc/contributing/security-release-process.md index fd33f3ccbb5afd..fa94d25e6fc176 100644 --- a/doc/contributing/security-release-process.md +++ b/doc/contributing/security-release-process.md @@ -30,6 +30,7 @@ The current security stewards are documented in the main Node.js | RH and IBM | Michael | 2023-Feb-16 | | NearForm | Rafael | 2023-Jun-20 | | NearForm | Rafael | 2023-Aug-09 | +| NearForm | Rafael | 2023-Oct-13 | | Datadog | Bryan | | | IBM | Joe | | | Platformatic | Matteo | | @@ -120,7 +121,8 @@ The google groups UI does not support adding a CC, until we figure out a better way, forward the email you receive to `oss-security@lists.openwall.com` as a CC. -* [ ] Send a message to `#nodejs-social` in OpenJS Foundation slack +* [ ] Post in the [nodejs-social channel][] + in the OpenJS slack asking for amplication of the blog post. ```text Security release pre-alert: @@ -179,7 +181,8 @@ out a better way, forward the email you receive to For more information see: https://nodejs.org/en/blog/vulnerability/month-year-security-releases/ ``` -* [ ] Create a new issue in [nodejs/tweet][] +* [ ] Post in the [nodejs-social channel][] + in the OpenJS slack asking for amplication of the blog post. ```text Security release: @@ -197,6 +200,12 @@ out a better way, forward the email you receive to * Request publication of [H1 CVE requests][] * (Check that the "Version Fixed" field in the CVE is correct, and provide links to the release blogs in the "Public Reference" section) + * In case the reporter doesn't accept the disclosure follow this process: + * Remove the original report reference within the reference text box and + insert the public URL you would like to be attached to this CVE. + * Then uncheck the Public Disclosure on HackerOne box at the bottom of the + page. + ![screenshot of HackerOne CVE form](https://github.com/nodejs/node/assets/26234614/e22e4f33-7948-4dd2-952e-2f9166f5568d) * [ ] PR machine-readable JSON descriptions of the vulnerabilities to the [core](https://github.com/nodejs/security-wg/tree/HEAD/vuln/core) @@ -238,5 +247,5 @@ The steps to correct CVE information are: [H1 CVE requests]: https://hackerone.com/nodejs/cve_requests [docker-node]: https://github.com/nodejs/docker-node/issues [email]: https://groups.google.com/forum/#!forum/nodejs-sec +[nodejs-social channel]: https://openjs-foundation.slack.com/archives/C0142A39BNE [nodejs/build]: https://github.com/nodejs/build/issues -[nodejs/tweet]: https://github.com/nodejs/tweet/issues diff --git a/doc/node.1 b/doc/node.1 index 48ac6dc82130c2..2966c14e1c3f5e 100644 --- a/doc/node.1 +++ b/doc/node.1 @@ -82,6 +82,9 @@ Allow file system read access when using the permission model. .It Fl -allow-fs-write Allow file system write access when using the permission model. . +.It Fl -allow-addons +Allow using native addons when using the permission model. +. .It Fl -allow-child-process Allow spawning process when using the permission model. . @@ -438,6 +441,9 @@ option set. . .It Fl -test-shard Test suite shard to execute in a format of /. + +.It Fl -test-timeout +A number of milliseconds the test execution will fail after. . .It Fl -throw-deprecation Throw errors for deprecations. diff --git a/doc/template.html b/doc/template.html index fb334852aba434..658c8d94cd0723 100644 --- a/doc/template.html +++ b/doc/template.html @@ -10,6 +10,19 @@ + __JS_FLAVORED_DYNAMIC_CSS__ diff --git a/lib/.eslintrc.yaml b/lib/.eslintrc.yaml index 5b7fa7d3882d7d..93ad0a986786b7 100644 --- a/lib/.eslintrc.yaml +++ b/lib/.eslintrc.yaml @@ -19,11 +19,11 @@ rules: - selector: ThrowStatement > CallExpression[callee.name=/Error$/] message: Use new keyword when throwing an Error. # Config specific to lib - - selector: NewExpression[callee.name=/Error$/]:not([callee.name=/^(AssertionError|NghttpError|AbortError)$/]) + - selector: NewExpression[callee.name=/Error$/]:not([callee.name=/^(AssertionError|NghttpError|AbortError|NodeAggregateError)$/]) message: Use an error exported by the internal/errors module. - selector: CallExpression[callee.object.name='Error'][callee.property.name='captureStackTrace'] message: Please use `require('internal/errors').hideStackFrames()` instead. - - selector: AssignmentExpression:matches([left.name='prepareStackTrace'], [left.property.name='prepareStackTrace']) + - selector: AssignmentExpression:matches([left.object.name='Error']):matches([left.name='prepareStackTrace'], [left.property.name='prepareStackTrace']) message: Use 'overrideStackTrace' from 'lib/internal/errors.js' instead of 'Error.prepareStackTrace'. - selector: ThrowStatement > NewExpression[callee.name=/^ERR_[A-Z_]+$/] > ObjectExpression:first-child:not(:has([key.name='message']):has([key.name='code']):has([key.name='syscall'])) message: The context passed into SystemError constructor must have .code, .syscall and .message. @@ -172,7 +172,7 @@ rules: - name: setTimeout message: Use `const { setTimeout } = require('timers');` instead of the global. - name: structuredClone - message: Use `const { structuredClone } = require('internal/structured_clone');` instead of the global. + message: Use `const { structuredClone } = internalBinding('messaging');` instead of the global. - name: SubtleCrypto message: Use `const { SubtleCrypto } = require('internal/crypto/webcrypto');` instead of the global. no-restricted-modules: diff --git a/lib/_http_agent.js b/lib/_http_agent.js index e23409f2ee797f..a4829526f6e138 100644 --- a/lib/_http_agent.js +++ b/lib/_http_agent.js @@ -38,7 +38,7 @@ const { StringPrototypeIndexOf, StringPrototypeSplit, StringPrototypeStartsWith, - StringPrototypeSubstr, + StringPrototypeSubstring, Symbol, } = primordials; @@ -363,7 +363,7 @@ function calculateServerName(options, req) { // Leading '[', but no ']'. Need to do something... servername = hostHeader; } else { - servername = StringPrototypeSubstr(hostHeader, 1, index - 1); + servername = StringPrototypeSubstring(hostHeader, 1, index); } } else { servername = StringPrototypeSplit(hostHeader, ':', 1)[0]; diff --git a/lib/_http_client.js b/lib/_http_client.js index 9fd07e1676b8ff..cb50dab1a1caa9 100644 --- a/lib/_http_client.js +++ b/lib/_http_client.js @@ -72,7 +72,7 @@ const { traceEnd, getNextTraceEventId, } = require('internal/http'); -const { connResetException, codes } = require('internal/errors'); +const { ConnResetException, codes } = require('internal/errors'); const { ERR_HTTP_HEADERS_SENT, ERR_INVALID_ARG_TYPE, @@ -186,9 +186,11 @@ function ClientRequest(input, options, cb) { const defaultPort = options.defaultPort || (this.agent && this.agent.defaultPort); - const port = options.port = options.port || defaultPort || 80; - const host = options.host = validateHost(options.hostname, 'hostname') || - validateHost(options.host, 'host') || 'localhost'; + const optsWithoutSignal = { __proto__: null, ...options }; + + const port = optsWithoutSignal.port = options.port || defaultPort || 80; + const host = optsWithoutSignal.host = validateHost(options.hostname, 'hostname') || + validateHost(options.host, 'host') || 'localhost'; const setHost = (options.setHost === undefined || Boolean(options.setHost)); @@ -200,6 +202,7 @@ function ClientRequest(input, options, cb) { const signal = options.signal; if (signal) { addAbortSignal(signal, this); + delete optsWithoutSignal.signal; } let method = options.method; const methodIsString = (typeof method === 'string'); @@ -326,12 +329,6 @@ function ClientRequest(input, options, cb) { this[kUniqueHeaders] = parseUniqueHeadersOption(options.uniqueHeaders); - let optsWithoutSignal = options; - if (optsWithoutSignal.signal) { - optsWithoutSignal = ObjectAssign({}, options); - delete optsWithoutSignal.signal; - } - // initiate connection if (this.agent) { this.agent.addRequest(this, optsWithoutSignal); @@ -452,7 +449,7 @@ function socketCloseListener() { if (res) { // Socket closed before we emitted 'end' below. if (!res.complete) { - res.destroy(connResetException('aborted')); + res.destroy(new ConnResetException('aborted')); } req._closed = true; req.emit('close'); @@ -465,7 +462,7 @@ function socketCloseListener() { // receive a response. The error needs to // fire on the request. req.socket._hadError = true; - req.emit('error', connResetException('socket hang up')); + req.emit('error', new ConnResetException('socket hang up')); } req._closed = true; req.emit('close'); @@ -516,7 +513,7 @@ function socketOnEnd() { // If we don't have a response then we know that the socket // ended prematurely and we need to emit an error on the request. req.socket._hadError = true; - req.emit('error', connResetException('socket hang up')); + req.emit('error', new ConnResetException('socket hang up')); } if (parser) { parser.finish(); @@ -869,7 +866,7 @@ function onSocketNT(req, socket, err) { function _destroy(req, err) { if (!req.aborted && !err) { - err = connResetException('socket hang up'); + err = new ConnResetException('socket hang up'); } if (err) { req.emit('error', err); diff --git a/lib/_http_outgoing.js b/lib/_http_outgoing.js index 64e0d4ab714d79..5350c08d4ce75d 100644 --- a/lib/_http_outgoing.js +++ b/lib/_http_outgoing.js @@ -600,7 +600,14 @@ function processHeader(self, state, key, value, validate) { // https://www.rfc-editor.org/rfc/rfc6266#section-4.3 // Refs: https://github.com/nodejs/node/pull/46528 if (isContentDispositionField(key) && self._contentLength) { - value = Buffer.from(value, 'latin1'); + // The value could be an array here + if (ArrayIsArray(value)) { + for (let i = 0; i < value.length; i++) { + value[i] = Buffer.from(value[i], 'latin1'); + } + } else { + value = Buffer.from(value, 'latin1'); + } } if (ArrayIsArray(value)) { @@ -663,17 +670,17 @@ function matchHeader(self, state, field, value) { const validateHeaderName = hideStackFrames((name, label) => { if (typeof name !== 'string' || !name || !checkIsHttpToken(name)) { - throw new ERR_INVALID_HTTP_TOKEN(label || 'Header name', name); + throw new ERR_INVALID_HTTP_TOKEN.HideStackFramesError(label || 'Header name', name); } }); const validateHeaderValue = hideStackFrames((name, value) => { if (value === undefined) { - throw new ERR_HTTP_INVALID_HEADER_VALUE(value, name); + throw new ERR_HTTP_INVALID_HEADER_VALUE.HideStackFramesError(value, name); } if (checkInvalidHeaderChar(value)) { debug('Header "%s" contains invalid characters', name); - throw new ERR_INVALID_CHAR('header content', name); + throw new ERR_INVALID_CHAR.HideStackFramesError('header content', name); } }); diff --git a/lib/_http_server.js b/lib/_http_server.js index c62ea17599512f..1222799124cc30 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -69,7 +69,7 @@ const { } = require('internal/async_hooks'); const { IncomingMessage } = require('_http_incoming'); const { - connResetException, + ConnResetException, codes, } = require('internal/errors'); const { @@ -373,9 +373,18 @@ function writeHead(statusCode, reason, obj) { throw new ERR_INVALID_ARG_VALUE('headers', obj); } + // Headers in obj should override previous headers but still + // allow explicit duplicates. To do so, we first remove any + // existing conflicts, then use appendHeader. + + for (let n = 0; n < obj.length; n += 2) { + k = obj[n + 0]; + this.removeHeader(k); + } + for (let n = 0; n < obj.length; n += 2) { k = obj[n + 0]; - if (k) this.setHeader(k, obj[n + 1]); + if (k) this.appendHeader(k, obj[n + 1]); } } else if (obj) { const keys = ObjectKeys(obj); @@ -790,7 +799,7 @@ function socketOnClose(socket, state) { function abortIncoming(incoming) { while (incoming.length) { const req = incoming.shift(); - req.destroy(connResetException('aborted')); + req.destroy(new ConnResetException('aborted')); } // Abort socket._httpMessage ? } @@ -857,27 +866,12 @@ const requestHeaderFieldsTooLargeResponse = Buffer.from( 'Connection: close\r\n\r\n', 'ascii', ); -function warnUnclosedSocket() { - if (warnUnclosedSocket.emitted) { - return; - } - - warnUnclosedSocket.emitted = true; - process.emitWarning( - 'An error event has already been emitted on the socket. ' + - 'Please use the destroy method on the socket while handling ' + - "a 'clientError' event.", - ); -} - function socketOnError(e) { // Ignore further errors this.removeListener('error', socketOnError); if (this.listenerCount('error', noop) === 0) { this.on('error', noop); - } else { - warnUnclosedSocket(); } if (!this.server.emit('clientError', e, this)) { diff --git a/lib/_tls_wrap.js b/lib/_tls_wrap.js index 48108710933382..95f61cb9f6c289 100644 --- a/lib/_tls_wrap.js +++ b/lib/_tls_wrap.js @@ -66,7 +66,7 @@ const { Pipe, constants: PipeConstants } = internalBinding('pipe_wrap'); const { owner_symbol } = require('internal/async_hooks').symbols; const { isArrayBufferView } = require('internal/util/types'); const { SecureContext: NativeSecureContext } = internalBinding('crypto'); -const { connResetException, codes } = require('internal/errors'); +const { ConnResetException, codes } = require('internal/errors'); const { ERR_INVALID_ARG_TYPE, ERR_INVALID_ARG_VALUE, @@ -713,7 +713,12 @@ TLSSocket.prototype._wrapHandle = function(wrap, handle, wrapHasActiveWriteFromP this[kRes] = res; defineHandleReading(this, handle); - this.on('close', onSocketCloseDestroySSL); + // Guard against adding multiple listeners, as this method may be called + // repeatedly on the same socket by reinitializeHandle + if (this.listenerCount('close', onSocketCloseDestroySSL) === 0) { + this.on('close', onSocketCloseDestroySSL); + } + if (wrap) { wrap.on('close', () => this.destroy()); } @@ -904,7 +909,7 @@ TLSSocket.prototype._init = function(socket, wrap) { options.SNICallback && (options.SNICallback !== SNICallback || (options.server && options.server._contexts.length))) { - assert(typeof options.SNICallback === 'function'); + validateFunction(options.SNICallback, 'options.SNICallback'); this._SNICallback = options.SNICallback; ssl.enableCertCb(); } @@ -1213,7 +1218,7 @@ function onSocketClose(err) { // Emit ECONNRESET if (!this._controlReleased && !this[kErrorEmitted]) { this[kErrorEmitted] = true; - const connReset = connResetException('socket hang up'); + const connReset = new ConnResetException('socket hang up'); this._tlsOptions.server.emit('tlsClientError', connReset, this); } } @@ -1719,9 +1724,9 @@ function onConnectEnd() { if (!this._hadError) { const options = this[kConnectOptions]; this._hadError = true; - const error = connResetException('Client network socket disconnected ' + - 'before secure TLS connection was ' + - 'established'); + const error = new ConnResetException('Client network socket disconnected ' + + 'before secure TLS connection was ' + + 'established'); error.path = options.path; error.host = options.host; error.port = options.port; diff --git a/lib/assert.js b/lib/assert.js index b7d7a3da01d520..9dfcf80a913942 100644 --- a/lib/assert.js +++ b/lib/assert.js @@ -73,6 +73,7 @@ const CallTracker = require('internal/assert/calltracker'); const { validateFunction, } = require('internal/validators'); +const { fileURLToPath } = require('internal/url'); let isDeepEqual; let isDeepStrictEqual; @@ -296,7 +297,7 @@ function getErrMessage(message, fn) { overrideStackTrace.set(err, (_, stack) => stack); const call = err.stack[0]; - const filename = call.getFileName(); + let filename = call.getFileName(); const line = call.getLineNumber() - 1; let column = call.getColumnNumber() - 1; let identifier; @@ -330,6 +331,14 @@ function getErrMessage(message, fn) { const { StringDecoder } = require('string_decoder'); decoder = new StringDecoder('utf8'); } + + // ESM file prop is a file proto. Convert that to path. + // This ensure opensync will not throw ENOENT for ESM files. + const fileProtoPrefix = 'file://'; + if (StringPrototypeStartsWith(filename, fileProtoPrefix)) { + filename = fileURLToPath(filename); + } + fd = openSync(filename, 'r', 0o666); // Reset column and message. ({ 0: column, 1: message } = getCode(fd, line, column)); diff --git a/lib/buffer.js b/lib/buffer.js index 0ff7c1920adbba..59a125960c276f 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -108,7 +108,6 @@ const { ERR_UNKNOWN_ENCODING, }, genericNodeError, - hideStackFrames, } = require('internal/errors'); const { validateArray, @@ -386,19 +385,12 @@ Buffer.of = of; ObjectSetPrototypeOf(Buffer, Uint8Array); -// The 'assertSize' method will remove itself from the callstack when an error -// occurs. This is done simply to keep the internal details of the -// implementation from bleeding out to users. -const assertSize = hideStackFrames((size) => { - validateNumber(size, 'size', 0, kMaxLength); -}); - /** * Creates a new filled Buffer instance. * alloc(size[, fill[, encoding]]) */ Buffer.alloc = function alloc(size, fill, encoding) { - assertSize(size); + validateNumber(size, 'size', 0, kMaxLength); if (fill !== undefined && fill !== 0 && size > 0) { const buf = createUnsafeBuffer(size); return _fill(buf, fill, 0, buf.length, encoding); @@ -411,7 +403,7 @@ Buffer.alloc = function alloc(size, fill, encoding) { * instance. If `--zero-fill-buffers` is set, will zero-fill the buffer. */ Buffer.allocUnsafe = function allocUnsafe(size) { - assertSize(size); + validateNumber(size, 'size', 0, kMaxLength); return allocate(size); }; @@ -421,15 +413,15 @@ Buffer.allocUnsafe = function allocUnsafe(size) { * If `--zero-fill-buffers` is set, will zero-fill the buffer. */ Buffer.allocUnsafeSlow = function allocUnsafeSlow(size) { - assertSize(size); + validateNumber(size, 'size', 0, kMaxLength); return createUnsafeBuffer(size); }; // If --zero-fill-buffers command line argument is set, a zero-filled // buffer is returned. -function SlowBuffer(length) { - assertSize(length); - return createUnsafeBuffer(length); +function SlowBuffer(size) { + validateNumber(size, 'size', 0, kMaxLength); + return createUnsafeBuffer(size); } ObjectSetPrototypeOf(SlowBuffer.prototype, Uint8ArrayPrototype); @@ -475,7 +467,6 @@ function fromString(string, encoding) { if (string.length === 0) return new FastBuffer(); ops = encodingOps.utf8; - encoding = undefined; } else { ops = getEncodingOps(encoding); if (ops === undefined) @@ -861,11 +852,11 @@ Buffer.prototype.equals = function equals(otherBuffer) { if (this === otherBuffer) return true; - - if (this.byteLength !== otherBuffer.byteLength) + const len = TypedArrayPrototypeGetByteLength(this); + if (len !== TypedArrayPrototypeGetByteLength(otherBuffer)) return false; - return this.byteLength === 0 || _compare(this, otherBuffer) === 0; + return len === 0 || _compare(this, otherBuffer) === 0; }; let INSPECT_MAX_BYTES = 50; diff --git a/lib/crypto.js b/lib/crypto.js index 41adecc97c2527..ab9b9d99e11b8b 100644 --- a/lib/crypto.js +++ b/lib/crypto.js @@ -138,18 +138,10 @@ function createHash(algorithm, options) { return new Hash(algorithm, options); } -function createCipher(cipher, password, options) { - return new Cipher(cipher, password, options); -} - function createCipheriv(cipher, key, iv, options) { return new Cipheriv(cipher, key, iv, options); } -function createDecipher(cipher, password, options) { - return new Decipher(cipher, password, options); -} - function createDecipheriv(cipher, key, iv, options) { return new Decipheriv(cipher, key, iv, options); } @@ -336,18 +328,6 @@ function getRandomBytesAlias(key) { } ObjectDefineProperties(module.exports, { - createCipher: { - __proto__: null, - enumerable: false, - value: deprecate(createCipher, - 'crypto.createCipher is deprecated.', 'DEP0106'), - }, - createDecipher: { - __proto__: null, - enumerable: false, - value: deprecate(createDecipher, - 'crypto.createDecipher is deprecated.', 'DEP0106'), - }, // crypto.fips is deprecated. DEP0093. Use crypto.getFips()/crypto.setFips() fips: { __proto__: null, diff --git a/lib/dgram.js b/lib/dgram.js index 01b5886d72fa29..8c8da1ad8856b5 100644 --- a/lib/dgram.js +++ b/lib/dgram.js @@ -96,9 +96,10 @@ function lazyLoadCluster() { return _cluster; } -const errnoException = errors.errnoException; -const exceptionWithHostPort = errors.exceptionWithHostPort; - +const { + ErrnoException, + ExceptionWithHostPort, +} = errors; function Socket(type, listener) { FunctionPrototypeCall(EventEmitter, this); @@ -286,7 +287,7 @@ Socket.prototype.bind = function(port_, address_ /* , callback */) { flags: null, }, (err) => { // Callback to handle error. - const ex = errnoException(err, 'open'); + const ex = new ErrnoException(err, 'open'); state.bindState = BIND_STATE_UNBOUND; this.emit('error', ex); }); @@ -299,7 +300,7 @@ Socket.prototype.bind = function(port_, address_ /* , callback */) { const err = state.handle.open(fd); if (err) - throw errnoException(err, 'open'); + throw new ErrnoException(err, 'open'); startListening(this); return this; @@ -350,7 +351,7 @@ Socket.prototype.bind = function(port_, address_ /* , callback */) { flags: flags, }, (err) => { // Callback to handle error. - const ex = exceptionWithHostPort(err, 'bind', ip, port); + const ex = new ExceptionWithHostPort(err, 'bind', ip, port); state.bindState = BIND_STATE_UNBOUND; this.emit('error', ex); }); @@ -360,7 +361,7 @@ Socket.prototype.bind = function(port_, address_ /* , callback */) { const err = state.handle.bind(ip, port || 0, flags); if (err) { - const ex = exceptionWithHostPort(err, 'bind', ip, port); + const ex = new ExceptionWithHostPort(err, 'bind', ip, port); state.bindState = BIND_STATE_UNBOUND; this.emit('error', ex); // Todo: close? @@ -429,7 +430,7 @@ function doConnect(ex, self, ip, address, port, callback) { if (!ex) { const err = state.handle.connect(ip, port); if (err) { - ex = exceptionWithHostPort(err, 'connect', address, port); + ex = new ExceptionWithHostPort(err, 'connect', address, port); } } @@ -457,7 +458,7 @@ Socket.prototype.disconnect = function() { const err = state.handle.disconnect(); if (err) - throw errnoException(err, 'connect'); + throw new ErrnoException(err, 'connect'); else state.connectState = CONNECT_STATE_DISCONNECTED; }; @@ -714,14 +715,14 @@ function doSend(ex, self, ip, list, address, port, callback) { if (err && callback) { // Don't emit as error, dgram_legacy.js compatibility - const ex = exceptionWithHostPort(err, 'send', address, port); + const ex = new ExceptionWithHostPort(err, 'send', address, port); process.nextTick(callback, ex); } } function afterSend(err, sent) { if (err) { - err = exceptionWithHostPort(err, 'send', this.address, this.port); + err = new ExceptionWithHostPort(err, 'send', this.address, this.port); } else { err = null; } @@ -772,7 +773,7 @@ Socket.prototype.address = function() { const out = {}; const err = this[kStateSymbol].handle.getsockname(out); if (err) { - throw errnoException(err, 'getsockname'); + throw new ErrnoException(err, 'getsockname'); } return out; @@ -788,7 +789,7 @@ Socket.prototype.remoteAddress = function() { const out = {}; const err = state.handle.getpeername(out); if (err) - throw errnoException(err, 'getpeername'); + throw new ErrnoException(err, 'getpeername'); return out; }; @@ -797,7 +798,7 @@ Socket.prototype.remoteAddress = function() { Socket.prototype.setBroadcast = function(arg) { const err = this[kStateSymbol].handle.setBroadcast(arg ? 1 : 0); if (err) { - throw errnoException(err, 'setBroadcast'); + throw new ErrnoException(err, 'setBroadcast'); } }; @@ -807,7 +808,7 @@ Socket.prototype.setTTL = function(ttl) { const err = this[kStateSymbol].handle.setTTL(ttl); if (err) { - throw errnoException(err, 'setTTL'); + throw new ErrnoException(err, 'setTTL'); } return ttl; @@ -819,7 +820,7 @@ Socket.prototype.setMulticastTTL = function(ttl) { const err = this[kStateSymbol].handle.setMulticastTTL(ttl); if (err) { - throw errnoException(err, 'setMulticastTTL'); + throw new ErrnoException(err, 'setMulticastTTL'); } return ttl; @@ -829,7 +830,7 @@ Socket.prototype.setMulticastTTL = function(ttl) { Socket.prototype.setMulticastLoopback = function(arg) { const err = this[kStateSymbol].handle.setMulticastLoopback(arg ? 1 : 0); if (err) { - throw errnoException(err, 'setMulticastLoopback'); + throw new ErrnoException(err, 'setMulticastLoopback'); } return arg; // 0.4 compatibility @@ -842,7 +843,7 @@ Socket.prototype.setMulticastInterface = function(interfaceAddress) { const err = this[kStateSymbol].handle.setMulticastInterface(interfaceAddress); if (err) { - throw errnoException(err, 'setMulticastInterface'); + throw new ErrnoException(err, 'setMulticastInterface'); } }; @@ -857,7 +858,7 @@ Socket.prototype.addMembership = function(multicastAddress, const { handle } = this[kStateSymbol]; const err = handle.addMembership(multicastAddress, interfaceAddress); if (err) { - throw errnoException(err, 'addMembership'); + throw new ErrnoException(err, 'addMembership'); } }; @@ -873,7 +874,7 @@ Socket.prototype.dropMembership = function(multicastAddress, const { handle } = this[kStateSymbol]; const err = handle.dropMembership(multicastAddress, interfaceAddress); if (err) { - throw errnoException(err, 'dropMembership'); + throw new ErrnoException(err, 'dropMembership'); } }; @@ -890,7 +891,7 @@ Socket.prototype.addSourceSpecificMembership = function(sourceAddress, groupAddress, interfaceAddress); if (err) { - throw errnoException(err, 'addSourceSpecificMembership'); + throw new ErrnoException(err, 'addSourceSpecificMembership'); } }; @@ -908,7 +909,7 @@ Socket.prototype.dropSourceSpecificMembership = function(sourceAddress, groupAddress, interfaceAddress); if (err) { - throw errnoException(err, 'dropSourceSpecificMembership'); + throw new ErrnoException(err, 'dropSourceSpecificMembership'); } }; @@ -935,7 +936,7 @@ function stopReceiving(socket) { function onMessage(nread, handle, buf, rinfo) { const self = handle[owner_symbol]; if (nread < 0) { - return self.emit('error', errnoException(nread, 'recvmsg')); + return self.emit('error', new ErrnoException(nread, 'recvmsg')); } rinfo.size = buf.length; // compatibility self.emit('message', buf, rinfo); diff --git a/lib/diagnostics_channel.js b/lib/diagnostics_channel.js index 10d35054f56535..97a86805ce7a32 100644 --- a/lib/diagnostics_channel.js +++ b/lib/diagnostics_channel.js @@ -371,9 +371,7 @@ class TracingChannel { // Using runStores here enables manual context failure recovery asyncStart.runStores(context, () => { try { - if (callback) { - return ReflectApply(callback, this, arguments); - } + return ReflectApply(callback, this, arguments); } finally { asyncEnd.publish(context); } @@ -381,9 +379,7 @@ class TracingChannel { } const callback = ArrayPrototypeAt(args, position); - if (typeof callback !== 'function') { - throw new ERR_INVALID_ARG_TYPE('callback', ['function'], callback); - } + validateFunction(callback, 'callback'); ArrayPrototypeSplice(args, position, 1, wrappedCallback); return start.runStores(context, () => { diff --git a/lib/dns.js b/lib/dns.js index ca932ad05f4da7..681f0aa3e58ecf 100644 --- a/lib/dns.js +++ b/lib/dns.js @@ -30,7 +30,14 @@ const { const cares = internalBinding('cares_wrap'); const { isIP } = require('internal/net'); const { customPromisifyArgs } = require('internal/util'); -const errors = require('internal/errors'); +const { + codes: { + ERR_INVALID_ARG_TYPE, + ERR_INVALID_ARG_VALUE, + ERR_MISSING_ARGS, + }, + DNSException, +} = require('internal/errors'); const { bindDefaultResolver, setDefaultResolver, @@ -70,11 +77,6 @@ const { ADDRGETNETWORKPARAMS, CANCELLED, } = dnsErrorCodes; -const { - ERR_INVALID_ARG_TYPE, - ERR_INVALID_ARG_VALUE, - ERR_MISSING_ARGS, -} = errors.codes; const { validateBoolean, validateFunction, @@ -98,13 +100,11 @@ const { stopPerf, } = require('internal/perf/observe'); -const dnsException = errors.dnsException; - let promises = null; // Lazy loaded function onlookup(err, addresses) { if (err) { - return this.callback(dnsException(err, 'getaddrinfo', this.hostname)); + return this.callback(new DNSException(err, 'getaddrinfo', this.hostname)); } this.callback(null, addresses[0], this.family || isIP(addresses[0])); if (this[kPerfHooksDnsLookupContext] && hasObserver('dns')) { @@ -115,7 +115,7 @@ function onlookup(err, addresses) { function onlookupall(err, addresses) { if (err) { - return this.callback(dnsException(err, 'getaddrinfo', this.hostname)); + return this.callback(new DNSException(err, 'getaddrinfo', this.hostname)); } const family = this.family; @@ -222,7 +222,7 @@ function lookup(hostname, options, callback) { req, hostname, family, hints, verbatim, ); if (err) { - process.nextTick(callback, dnsException(err, 'getaddrinfo', hostname)); + process.nextTick(callback, new DNSException(err, 'getaddrinfo', hostname)); return {}; } if (hasObserver('dns')) { @@ -243,7 +243,7 @@ ObjectDefineProperty(lookup, customPromisifyArgs, function onlookupservice(err, hostname, service) { if (err) - return this.callback(dnsException(err, 'getnameinfo', this.hostname)); + return this.callback(new DNSException(err, 'getnameinfo', this.hostname)); this.callback(null, hostname, service); if (this[kPerfHooksDnsLookupServiceContext] && hasObserver('dns')) { @@ -272,7 +272,7 @@ function lookupService(address, port, callback) { req.oncomplete = onlookupservice; const err = cares.getnameinfo(req, address, port); - if (err) throw dnsException(err, 'getnameinfo', address); + if (err) throw new DNSException(err, 'getnameinfo', address); if (hasObserver('dns')) { startPerf(req, kPerfHooksDnsLookupServiceContext, { type: 'dns', diff --git a/lib/events.js b/lib/events.js index a1837cc1a9107e..3ba2484ece938f 100644 --- a/lib/events.js +++ b/lib/events.js @@ -87,6 +87,7 @@ const { const kCapture = Symbol('kCapture'); const kErrorMonitor = Symbol('events.errorMonitor'); +const kShapeMode = Symbol('shapeMode'); const kMaxEventTargetListeners = Symbol('events.maxEventTargetListeners'); const kMaxEventTargetListenersWarned = Symbol('events.maxEventTargetListenersWarned'); @@ -344,6 +345,9 @@ EventEmitter.init = function(opts) { this._events === ObjectGetPrototypeOf(this)._events) { this._events = { __proto__: null }; this._eventsCount = 0; + this[kShapeMode] = false; + } else { + this[kShapeMode] = true; } this._maxListeners = this._maxListeners || undefined; @@ -686,9 +690,13 @@ EventEmitter.prototype.removeListener = return this; if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) + this._eventsCount -= 1; + + if (this[kShapeMode]) { + events[type] = undefined; + } else if (this._eventsCount === 0) { this._events = { __proto__: null }; - else { + } else { delete events[type]; if (events.removeListener) this.emit('removeListener', type, list.listener || listener); @@ -750,6 +758,7 @@ EventEmitter.prototype.removeAllListeners = else delete events[type]; } + this[kShapeMode] = false; return this; } @@ -762,6 +771,7 @@ EventEmitter.prototype.removeAllListeners = this.removeAllListeners('removeListener'); this._events = { __proto__: null }; this._eventsCount = 0; + this[kShapeMode] = false; return this; } diff --git a/lib/fs.js b/lib/fs.js index 2d5170cd2f44b0..8ddbf18cdd4865 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -40,6 +40,7 @@ const { StringPrototypeCharCodeAt, StringPrototypeIndexOf, StringPrototypeSlice, + uncurryThis, } = primordials; const { fs: constants } = internalBinding('constants'); @@ -58,6 +59,7 @@ const { } = constants; const pathModule = require('path'); +const { isAbsolute } = pathModule; const { isArrayBufferView } = require('internal/util/types'); const binding = internalBinding('fs'); @@ -65,15 +67,16 @@ const binding = internalBinding('fs'); const { createBlobFromFilePath } = require('internal/blob'); const { Buffer } = require('buffer'); +const { isBuffer: BufferIsBuffer } = Buffer; +const BufferToString = uncurryThis(Buffer.prototype.toString); const { aggregateTwoErrors, codes: { + ERR_ACCESS_DENIED, ERR_FS_FILE_TOO_LARGE, ERR_INVALID_ARG_VALUE, }, AbortError, - uvErrmapGet, - uvException, } = require('internal/errors'); const { @@ -143,6 +146,8 @@ const { kValidateObjectAllowNullable, } = require('internal/validators'); +const permission = require('internal/process/permission'); + let truncateWarn = true; let fs; @@ -398,11 +403,9 @@ function readFile(path, options, callback) { } function tryStatSync(fd, isUserFd) { - const ctx = {}; - const stats = binding.fstat(fd, false, undefined, ctx); - if (ctx.errno !== undefined && !isUserFd) { + const stats = binding.fstat(fd, false, undefined, true /* shouldNotThrow */); + if (stats === undefined && !isUserFd) { fs.closeSync(fd); - throw uvException(ctx); } return stats; } @@ -513,13 +516,12 @@ function defaultCloseCallback(err) { * @returns {void} */ function close(fd, callback = defaultCloseCallback) { - fd = getValidatedFd(fd); if (callback !== defaultCloseCallback) callback = makeCallback(callback); const req = new FSReqCallback(); req.oncomplete = callback; - binding.close(fd, req); + binding.close(getValidatedFd(fd), req); } /** @@ -528,9 +530,7 @@ function close(fd, callback = defaultCloseCallback) { * @returns {void} */ function closeSync(fd) { - fd = getValidatedFd(fd); - - return binding.close(fd); + binding.close(getValidatedFd(fd)); } /** @@ -706,6 +706,8 @@ ObjectDefineProperty(read, kCustomPromisifyArgsSymbol, * length?: number; * position?: number | bigint | null; * }} [offsetOrOptions] + * @param {number} [length] + * @param {number} [position] * @returns {number} */ function readSync(fd, buffer, offsetOrOptions, length, position) { @@ -751,11 +753,7 @@ function readSync(fd, buffer, offsetOrOptions, length, position) { validatePosition(position, 'position', length); } - const ctx = {}; - const result = binding.read(fd, buffer, offset, length, position, - undefined, ctx); - handleErrorFromBinding(ctx); - return result; + return binding.read(fd, buffer, offset, length, position); } /** @@ -786,7 +784,7 @@ function readv(fd, buffers, position, callback) { if (typeof position !== 'number') position = null; - return binding.readBuffers(fd, buffers, position, req); + binding.readBuffers(fd, buffers, position, req); } ObjectDefineProperty(readv, kCustomPromisifyArgsSymbol, @@ -805,14 +803,10 @@ function readvSync(fd, buffers, position) { fd = getValidatedFd(fd); validateBufferArray(buffers); - const ctx = {}; - if (typeof position !== 'number') position = null; - const result = binding.readBuffers(fd, buffers, position, undefined, ctx); - handleErrorFromBinding(ctx); - return result; + return binding.readBuffers(fd, buffers, position); } /** @@ -862,7 +856,8 @@ function write(fd, buffer, offsetOrOptions, length, position, callback) { const req = new FSReqCallback(); req.oncomplete = wrapper; - return binding.writeBuffer(fd, buffer, offset, length, position, req); + binding.writeBuffer(fd, buffer, offset, length, position, req); + return; } validateStringAfterArrayBufferView(buffer, 'buffer'); @@ -883,7 +878,7 @@ function write(fd, buffer, offsetOrOptions, length, position, callback) { const req = new FSReqCallback(); req.oncomplete = wrapper; - return binding.writeString(fd, str, offset, length, req); + binding.writeString(fd, str, offset, length, req); } ObjectDefineProperty(write, kCustomPromisifyArgsSymbol, @@ -973,7 +968,7 @@ function writev(fd, buffers, position, callback) { if (typeof position !== 'number') position = null; - return binding.writeBuffers(fd, buffers, position, req); + binding.writeBuffers(fd, buffers, position, req); } ObjectDefineProperty(writev, kCustomPromisifyArgsSymbol, { @@ -1034,10 +1029,10 @@ function rename(oldPath, newPath, callback) { function renameSync(oldPath, newPath) { oldPath = getValidatedPath(oldPath, 'oldPath'); newPath = getValidatedPath(newPath, 'newPath'); - const ctx = { path: oldPath, dest: newPath }; - binding.rename(pathModule.toNamespacedPath(oldPath), - pathModule.toNamespacedPath(newPath), undefined, ctx); - handleErrorFromBinding(ctx); + binding.rename( + pathModule.toNamespacedPath(oldPath), + pathModule.toNamespacedPath(newPath), + ); } /** @@ -1113,7 +1108,6 @@ function ftruncate(fd, len = 0, callback) { callback = len; len = 0; } - fd = getValidatedFd(fd); validateInteger(len, 'len'); len = MathMax(0, len); callback = makeCallback(callback); @@ -1130,7 +1124,6 @@ function ftruncate(fd, len = 0, callback) { * @returns {void} */ function ftruncateSync(fd, len = 0) { - fd = getValidatedFd(fd); validateInteger(len, 'len'); len = MathMax(0, len); binding.ftruncate(fd, len); @@ -1179,7 +1172,8 @@ function rmdir(path, options, callback) { if (err === false) { const req = new FSReqCallback(); req.oncomplete = callback; - return binding.rmdir(path, req); + binding.rmdir(path, req); + return; } if (err) { return callback(err); @@ -1192,7 +1186,7 @@ function rmdir(path, options, callback) { validateRmdirOptions(options); const req = new FSReqCallback(); req.oncomplete = callback; - return binding.rmdir(path, req); + binding.rmdir(path, req); } } @@ -1220,9 +1214,7 @@ function rmdirSync(path, options) { validateRmdirOptions(options); } - const ctx = { path }; - binding.rmdir(pathModule.toNamespacedPath(path), undefined, ctx); - return handleErrorFromBinding(ctx); + binding.rmdir(pathModule.toNamespacedPath(path)); } /** @@ -1283,7 +1275,6 @@ function rmSync(path, options) { * @returns {void} */ function fdatasync(fd, callback) { - fd = getValidatedFd(fd); const req = new FSReqCallback(); req.oncomplete = makeCallback(callback); binding.fdatasync(fd, req); @@ -1297,8 +1288,7 @@ function fdatasync(fd, callback) { * @returns {void} */ function fdatasyncSync(fd) { - fd = getValidatedFd(fd); - return binding.fdatasync(fd); + binding.fdatasync(fd); } /** @@ -1309,7 +1299,6 @@ function fdatasyncSync(fd) { * @returns {void} */ function fsync(fd, callback) { - fd = getValidatedFd(fd); const req = new FSReqCallback(); req.oncomplete = makeCallback(callback); binding.fsync(fd, req); @@ -1322,10 +1311,7 @@ function fsync(fd, callback) { * @returns {void} */ function fsyncSync(fd) { - fd = getValidatedFd(fd); - const ctx = {}; - binding.fsync(fd, undefined, ctx); - handleErrorFromBinding(ctx); + binding.fsync(fd); } /** @@ -1385,11 +1371,12 @@ function mkdirSync(path, options) { path = getValidatedPath(path); validateBoolean(recursive, 'options.recursive'); - const ctx = { path }; - const result = binding.mkdir(pathModule.toNamespacedPath(path), - parseFileMode(mode, 'mode'), recursive, - undefined, ctx); - handleErrorFromBinding(ctx); + const result = binding.mkdir( + pathModule.toNamespacedPath(path), + parseFileMode(mode, 'mode'), + recursive, + ); + if (recursive) { return result; } @@ -1431,7 +1418,7 @@ function readdirSyncRecursive(basePath, options) { const dirent = getDirent(path, readdirResult[0][i], readdirResult[1][i]); ArrayPrototypePush(readdirResults, dirent); if (dirent.isDirectory()) { - ArrayPrototypePush(pathsQueue, pathModule.join(dirent.path, dirent.name)); + ArrayPrototypePush(pathsQueue, pathModule.join(dirent.parentPath, dirent.name)); } } } else { @@ -1461,10 +1448,11 @@ function readdirSyncRecursive(basePath, options) { * @param {string | { * encoding?: string; * withFileTypes?: boolean; + * recursive?: boolean; * }} [options] * @param {( * err?: Error, - * files?: string[] | Buffer[] | Direct[]; + * files?: string[] | Buffer[] | Dirent[]; * ) => any} callback * @returns {void} */ @@ -1543,7 +1531,6 @@ function fstat(fd, options = { bigint: false }, callback) { callback = options; options = kEmptyObject; } - fd = getValidatedFd(fd); callback = makeStatsCallback(callback); const req = new FSReqCallback(options.bigint); @@ -1616,19 +1603,6 @@ function statfs(path, options = { bigint: false }, callback) { binding.statfs(pathModule.toNamespacedPath(path), options.bigint, req); } -function hasNoEntryError(ctx) { - if (ctx.errno) { - const uvErr = uvErrmapGet(ctx.errno); - return uvErr?.[0] === 'ENOENT'; - } - - if (ctx.error) { - return ctx.error.code === 'ENOENT'; - } - - return false; -} - /** * Synchronously retrieves the `fs.Stats` for * the file descriptor. @@ -1636,13 +1610,13 @@ function hasNoEntryError(ctx) { * @param {{ * bigint?: boolean; * }} [options] - * @returns {Stats} + * @returns {Stats | undefined} */ function fstatSync(fd, options = { bigint: false }) { - fd = getValidatedFd(fd); - const ctx = { fd }; - const stats = binding.fstat(fd, options.bigint, undefined, ctx); - handleErrorFromBinding(ctx); + const stats = binding.fstat(fd, options.bigint, undefined, false); + if (stats === undefined) { + return; + } return getStatsFromBinding(stats); } @@ -1654,17 +1628,20 @@ function fstatSync(fd, options = { bigint: false }) { * bigint?: boolean; * throwIfNoEntry?: boolean; * }} [options] - * @returns {Stats} + * @returns {Stats | undefined} */ function lstatSync(path, options = { bigint: false, throwIfNoEntry: true }) { path = getValidatedPath(path); - const ctx = { path }; - const stats = binding.lstat(pathModule.toNamespacedPath(path), - options.bigint, undefined, ctx); - if (options.throwIfNoEntry === false && hasNoEntryError(ctx)) { - return undefined; + const stats = binding.lstat( + pathModule.toNamespacedPath(path), + options.bigint, + undefined, + options.throwIfNoEntry, + ); + + if (stats === undefined) { + return; } - handleErrorFromBinding(ctx); return getStatsFromBinding(stats); } @@ -1728,11 +1705,10 @@ function readlink(path, options, callback) { function readlinkSync(path, options) { options = getOptions(options); path = getValidatedPath(path, 'oldPath'); - const ctx = { path }; - const result = binding.readlink(pathModule.toNamespacedPath(path), - options.encoding, undefined, ctx); - handleErrorFromBinding(ctx); - return result; + return binding.readlink( + pathModule.toNamespacedPath(path), + options.encoding, + ); } /** @@ -1747,6 +1723,20 @@ function symlink(target, path, type_, callback_) { const type = (typeof type_ === 'string' ? type_ : null); const callback = makeCallback(arguments[arguments.length - 1]); + if (permission.isEnabled()) { + // The permission model's security guarantees fall apart in the presence of + // relative symbolic links. Thus, we have to prevent their creation. + if (BufferIsBuffer(target)) { + if (!isAbsolute(BufferToString(target))) { + callback(new ERR_ACCESS_DENIED('relative symbolic link target')); + return; + } + } else if (typeof target !== 'string' || !isAbsolute(toPathIfFileURL(target))) { + callback(new ERR_ACCESS_DENIED('relative symbolic link target')); + return; + } + } + target = getValidatedPath(target, 'target'); path = getValidatedPath(path); @@ -1803,15 +1793,23 @@ function symlinkSync(target, path, type) { type = 'dir'; } } + + if (permission.isEnabled()) { + // The permission model's security guarantees fall apart in the presence of + // relative symbolic links. Thus, we have to prevent their creation. + if (typeof target !== 'string' || !isAbsolute(toPathIfFileURL(target))) { + throw new ERR_ACCESS_DENIED('relative symbolic link target'); + } + } + target = getValidatedPath(target, 'target'); path = getValidatedPath(path); - const flags = stringToSymlinkType(type); - const ctx = { path: target, dest: path }; - binding.symlink(preprocessSymlinkDestination(target, type, path), - pathModule.toNamespacedPath(path), flags, undefined, ctx); - - handleErrorFromBinding(ctx); + binding.symlink( + preprocessSymlinkDestination(target, type, path), + pathModule.toNamespacedPath(path), + stringToSymlinkType(type), + ); } /** @@ -1847,12 +1845,10 @@ function linkSync(existingPath, newPath) { existingPath = getValidatedPath(existingPath, 'existingPath'); newPath = getValidatedPath(newPath, 'newPath'); - const ctx = { path: existingPath, dest: newPath }; - const result = binding.link(pathModule.toNamespacedPath(existingPath), - pathModule.toNamespacedPath(newPath), - undefined, ctx); - handleErrorFromBinding(ctx); - return result; + binding.link( + pathModule.toNamespacedPath(existingPath), + pathModule.toNamespacedPath(newPath), + ); } /** @@ -1876,7 +1872,7 @@ function unlink(path, callback) { */ function unlinkSync(path) { path = pathModule.toNamespacedPath(getValidatedPath(path)); - return binding.unlink(path); + binding.unlink(path); } /** @@ -1887,7 +1883,6 @@ function unlinkSync(path) { * @returns {void} */ function fchmod(fd, mode, callback) { - fd = getValidatedFd(fd); mode = parseFileMode(mode, 'mode'); callback = makeCallback(callback); @@ -1904,7 +1899,7 @@ function fchmod(fd, mode, callback) { */ function fchmodSync(fd, mode) { binding.fchmod( - getValidatedFd(fd), + fd, parseFileMode(mode, 'mode'), ); } @@ -2016,9 +2011,11 @@ function lchownSync(path, uid, gid) { path = getValidatedPath(path); validateInteger(uid, 'uid', -1, kMaxUserId); validateInteger(gid, 'gid', -1, kMaxUserId); - const ctx = { path }; - binding.lchown(pathModule.toNamespacedPath(path), uid, gid, undefined, ctx); - handleErrorFromBinding(ctx); + binding.lchown( + pathModule.toNamespacedPath(path), + uid, + gid, + ); } /** @@ -2030,14 +2027,13 @@ function lchownSync(path, uid, gid) { * @returns {void} */ function fchown(fd, uid, gid, callback) { - fd = getValidatedFd(fd); validateInteger(uid, 'uid', -1, kMaxUserId); validateInteger(gid, 'gid', -1, kMaxUserId); callback = makeCallback(callback); const req = new FSReqCallback(); req.oncomplete = callback; - binding.fchown(fd, uid, gid, req); + binding.fchown(getValidatedFd(fd), uid, gid, req); } /** @@ -2048,13 +2044,10 @@ function fchown(fd, uid, gid, callback) { * @returns {void} */ function fchownSync(fd, uid, gid) { - fd = getValidatedFd(fd); validateInteger(uid, 'uid', -1, kMaxUserId); validateInteger(gid, 'gid', -1, kMaxUserId); - const ctx = {}; - binding.fchown(fd, uid, gid, undefined, ctx); - handleErrorFromBinding(ctx); + binding.fchown(getValidatedFd(fd), uid, gid); } /** @@ -2089,9 +2082,11 @@ function chownSync(path, uid, gid) { path = getValidatedPath(path); validateInteger(uid, 'uid', -1, kMaxUserId); validateInteger(gid, 'gid', -1, kMaxUserId); - const ctx = { path }; - binding.chown(pathModule.toNamespacedPath(path), uid, gid, undefined, ctx); - handleErrorFromBinding(ctx); + binding.chown( + pathModule.toNamespacedPath(path), + uid, + gid, + ); } /** @@ -2142,7 +2137,6 @@ function utimesSync(path, atime, mtime) { * @returns {void} */ function futimes(fd, atime, mtime, callback) { - fd = getValidatedFd(fd); atime = toUnixTimestamp(atime, 'atime'); mtime = toUnixTimestamp(mtime, 'mtime'); callback = makeCallback(callback); @@ -2163,7 +2157,7 @@ function futimes(fd, atime, mtime, callback) { */ function futimesSync(fd, atime, mtime) { binding.futimes( - getValidatedFd(fd), + fd, toUnixTimestamp(atime, 'atime'), toUnixTimestamp(mtime, 'mtime'), ); @@ -2338,13 +2332,26 @@ function writeFileSync(path, data, options) { validateBoolean(flush, 'options.flush'); + const flag = options.flag || 'w'; + + // C++ fast path for string data and UTF8 encoding + if (typeof data === 'string' && (options.encoding === 'utf8' || options.encoding === 'utf-8')) { + if (!isInt32(path)) { + path = pathModule.toNamespacedPath(getValidatedPath(path)); + } + + return binding.writeFileUtf8( + path, data, + stringToFlags(flag), + parseFileMode(options.mode, 'mode', 0o666), + ); + } + if (!isArrayBufferView(data)) { validateStringAfterArrayBufferView(data, 'data'); data = Buffer.from(data, options.encoding || 'utf8'); } - const flag = options.flag || 'w'; - const isUserFd = isFd(path); // File descriptor ownership const fd = isUserFd ? path : fs.openSync(path, flag, options.mode); @@ -2649,9 +2656,10 @@ function realpathSync(p, options) { // On windows, check that the root exists. On unix there is no need. if (isWindows) { - const ctx = { path: base }; - binding.lstat(pathModule.toNamespacedPath(base), false, undefined, ctx); - handleErrorFromBinding(ctx); + const out = binding.lstat(pathModule.toNamespacedPath(base), false, undefined, true /* throwIfNoEntry */); + if (out === undefined) { + return; + } knownHard.add(base); } @@ -2691,9 +2699,10 @@ function realpathSync(p, options) { // for our internal use. const baseLong = pathModule.toNamespacedPath(base); - const ctx = { path: base }; - const stats = binding.lstat(baseLong, true, undefined, ctx); - handleErrorFromBinding(ctx); + const stats = binding.lstat(baseLong, true, undefined, true /* throwIfNoEntry */); + if (stats === undefined) { + return; + } if (!isFileType(stats, S_IFLNK)) { knownHard.add(base); @@ -2714,10 +2723,8 @@ function realpathSync(p, options) { } } if (linkTarget === null) { - const ctx = { path: base }; binding.stat(baseLong, false, undefined, true); - linkTarget = binding.readlink(baseLong, undefined, undefined, ctx); - handleErrorFromBinding(ctx); + linkTarget = binding.readlink(baseLong, undefined); } resolvedLink = pathModule.resolve(previous, linkTarget); @@ -2734,9 +2741,10 @@ function realpathSync(p, options) { // On windows, check that the root exists. On unix there is no need. if (isWindows && !knownHard.has(base)) { - const ctx = { path: base }; - binding.lstat(pathModule.toNamespacedPath(base), false, undefined, ctx); - handleErrorFromBinding(ctx); + const out = binding.lstat(pathModule.toNamespacedPath(base), false, undefined, true /* throwIfNoEntry */); + if (out === undefined) { + return; + } knownHard.add(base); } } @@ -2754,10 +2762,10 @@ function realpathSync(p, options) { realpathSync.native = (path, options) => { options = getOptions(options); path = getValidatedPath(path); - const ctx = { path }; - const result = binding.realpath(pathModule.toNamespacedPath(path), options.encoding, undefined, ctx); - handleErrorFromBinding(ctx); - return result; + return binding.realpath( + pathModule.toNamespacedPath(path), + options.encoding, + ); }; /** @@ -2915,7 +2923,7 @@ realpath.native = (path, options, callback) => { path = getValidatedPath(path); const req = new FSReqCallback(); req.oncomplete = callback; - return binding.realpath(pathModule.toNamespacedPath(path), options.encoding, req); + binding.realpath(pathModule.toNamespacedPath(path), options.encoding, req); }; /** @@ -2935,16 +2943,9 @@ function mkdtemp(prefix, options, callback) { prefix = getValidatedPath(prefix, 'prefix'); warnOnNonPortableTemplate(prefix); - let path; - if (typeof prefix === 'string') { - path = `${prefix}XXXXXX`; - } else { - path = Buffer.concat([prefix, Buffer.from('XXXXXX')]); - } - const req = new FSReqCallback(); req.oncomplete = callback; - binding.mkdtemp(path, options.encoding, req); + binding.mkdtemp(prefix, options.encoding, req); } /** @@ -2958,19 +2959,7 @@ function mkdtempSync(prefix, options) { prefix = getValidatedPath(prefix, 'prefix'); warnOnNonPortableTemplate(prefix); - - let path; - if (typeof prefix === 'string') { - path = `${prefix}XXXXXX`; - } else { - path = Buffer.concat([prefix, Buffer.from('XXXXXX')]); - } - - const ctx = { path }; - const result = binding.mkdtemp(path, options.encoding, - undefined, ctx); - handleErrorFromBinding(ctx); - return result; + return binding.mkdtemp(prefix, options.encoding); } /** @@ -2991,8 +2980,8 @@ function copyFile(src, dest, mode, callback) { src = getValidatedPath(src, 'src'); dest = getValidatedPath(dest, 'dest'); - src = pathModule._makeLong(src); - dest = pathModule._makeLong(dest); + src = pathModule.toNamespacedPath(src); + dest = pathModule.toNamespacedPath(dest); mode = getValidMode(mode, 'copyFile'); callback = makeCallback(callback); @@ -3081,6 +3070,7 @@ function lazyLoadStreams() { * end?: number; * highWaterMark?: number; * fs?: object | null; + * signal?: AbortSignal | null; * }} [options] * @returns {ReadStream} */ @@ -3101,6 +3091,8 @@ function createReadStream(path, options) { * emitClose?: boolean; * start: number; * fs?: object | null; + * signal?: AbortSignal | null; + * highWaterMark?: number; * flush?: boolean; * }} [options] * @returns {WriteStream} diff --git a/lib/inspector.js b/lib/inspector.js index 70796c83fcffe3..e51bcf2f3cd977 100644 --- a/lib/inspector.js +++ b/lib/inspector.js @@ -4,7 +4,6 @@ const { JSONParse, JSONStringify, SafeMap, - Symbol, SymbolDispose, } = primordials; @@ -45,28 +44,19 @@ const { console, } = internalBinding('inspector'); -const connectionSymbol = Symbol('connectionProperty'); -const messageCallbacksSymbol = Symbol('messageCallbacks'); -const nextIdSymbol = Symbol('nextId'); -const onMessageSymbol = Symbol('onMessage'); - class Session extends EventEmitter { - constructor() { - super(); - this[connectionSymbol] = null; - this[nextIdSymbol] = 1; - this[messageCallbacksSymbol] = new SafeMap(); - } + #connection = null; + #nextId = 1; + #messageCallbacks = new SafeMap(); /** * Connects the session to the inspector back-end. * @returns {void} */ connect() { - if (this[connectionSymbol]) + if (this.#connection) throw new ERR_INSPECTOR_ALREADY_CONNECTED('The inspector session'); - this[connectionSymbol] = - new Connection((message) => this[onMessageSymbol](message)); + this.#connection = new Connection((message) => this.#onMessage(message)); } /** @@ -77,23 +67,24 @@ class Session extends EventEmitter { connectToMainThread() { if (isMainThread) throw new ERR_INSPECTOR_NOT_WORKER(); - if (this[connectionSymbol]) + if (this.#connection) throw new ERR_INSPECTOR_ALREADY_CONNECTED('The inspector session'); - this[connectionSymbol] = + this.#connection = new MainThreadConnection( - (message) => queueMicrotask(() => this[onMessageSymbol](message))); + (message) => queueMicrotask(() => this.#onMessage(message))); } - [onMessageSymbol](message) { + #onMessage(message) { const parsed = JSONParse(message); try { if (parsed.id) { - const callback = this[messageCallbacksSymbol].get(parsed.id); - this[messageCallbacksSymbol].delete(parsed.id); + const callback = this.#messageCallbacks.get(parsed.id); + this.#messageCallbacks.delete(parsed.id); if (callback) { if (parsed.error) { - return callback(new ERR_INSPECTOR_COMMAND(parsed.error.code, - parsed.error.message)); + return callback( + new ERR_INSPECTOR_COMMAND(parsed.error.code, parsed.error.message), + ); } callback(null, parsed.result); @@ -127,18 +118,18 @@ class Session extends EventEmitter { validateFunction(callback, 'callback'); } - if (!this[connectionSymbol]) { + if (!this.#connection) { throw new ERR_INSPECTOR_NOT_CONNECTED(); } - const id = this[nextIdSymbol]++; + const id = this.#nextId++; const message = { id, method }; if (params) { message.params = params; } if (callback) { - this[messageCallbacksSymbol].set(id, callback); + this.#messageCallbacks.set(id, callback); } - this[connectionSymbol].dispatch(JSONStringify(message)); + this.#connection.dispatch(JSONStringify(message)); } /** @@ -148,16 +139,16 @@ class Session extends EventEmitter { * @returns {void} */ disconnect() { - if (!this[connectionSymbol]) + if (!this.#connection) return; - this[connectionSymbol].disconnect(); - this[connectionSymbol] = null; - const remainingCallbacks = this[messageCallbacksSymbol].values(); + this.#connection.disconnect(); + this.#connection = null; + const remainingCallbacks = this.#messageCallbacks.values(); for (const callback of remainingCallbacks) { process.nextTick(callback, new ERR_INSPECTOR_CLOSED()); } - this[messageCallbacksSymbol].clear(); - this[nextIdSymbol] = 1; + this.#messageCallbacks.clear(); + this.#nextId = 1; } } diff --git a/lib/internal/blob.js b/lib/internal/blob.js index a6801f3d7fba3b..3ebb1b8a84b50a 100644 --- a/lib/internal/blob.js +++ b/lib/internal/blob.js @@ -8,7 +8,6 @@ const { ObjectDefineProperty, ObjectSetPrototypeOf, PromiseReject, - ReflectConstruct, RegExpPrototypeExec, RegExpPrototypeSymbolReplace, StringPrototypeToLowerCase, @@ -200,7 +199,7 @@ class Blob { const length = this[kLength]; return { data: { handle, type, length }, - deserializeInfo: 'internal/blob:ClonedBlob', + deserializeInfo: 'internal/blob:Blob', }; } @@ -397,25 +396,18 @@ class Blob { } } -function ClonedBlob() { - return ReflectConstruct(function() { - markTransferMode(this, true, false); - }, [], Blob); -} -ClonedBlob.prototype[kDeserialize] = () => {}; - -function TransferrableBlob(handle, length, type = '') { +function TransferableBlob(handle, length, type = '') { markTransferMode(this, true, false); this[kHandle] = handle; this[kType] = type; this[kLength] = length; } -ObjectSetPrototypeOf(TransferrableBlob.prototype, Blob.prototype); -ObjectSetPrototypeOf(TransferrableBlob, Blob); +ObjectSetPrototypeOf(TransferableBlob.prototype, Blob.prototype); +ObjectSetPrototypeOf(TransferableBlob, Blob); function createBlob(handle, length, type = '') { - const transferredBlob = new TransferrableBlob(handle, length, type); + const transferredBlob = new TransferableBlob(handle, length, type); // Fix issues like: https://github.com/nodejs/node/pull/49730#discussion_r1331720053 transferredBlob.constructor = Blob; @@ -489,7 +481,6 @@ function createBlobFromFilePath(path, options) { module.exports = { Blob, - ClonedBlob, createBlob, createBlobFromFilePath, isBlob, diff --git a/lib/internal/bootstrap/realm.js b/lib/internal/bootstrap/realm.js index c6935c6f7775fc..57ab47178d033d 100644 --- a/lib/internal/bootstrap/realm.js +++ b/lib/internal/bootstrap/realm.js @@ -50,6 +50,8 @@ const { ArrayFrom, + ArrayPrototypeFilter, + ArrayPrototypeIncludes, ArrayPrototypeMap, ArrayPrototypePush, ArrayPrototypeSlice, @@ -85,34 +87,26 @@ ObjectDefineProperty(process, 'moduleLoadList', { // more, we just implement them as legacy wrappers instead. See the // legacyWrapperList. const processBindingAllowList = new SafeSet([ - 'async_wrap', 'buffer', 'cares_wrap', 'config', 'constants', 'contextify', - 'crypto', 'fs', 'fs_event_wrap', - 'http_parser', 'icu', 'inspector', 'js_stream', - 'natives', 'os', 'pipe_wrap', 'process_wrap', - 'signal_wrap', 'spawn_sync', 'stream_wrap', 'tcp_wrap', 'tls_wrap', 'tty_wrap', 'udp_wrap', - 'url', - 'util', 'uv', - 'v8', 'zlib', ]); @@ -146,19 +140,23 @@ const experimentalModuleList = new SafeSet(); process.binding = function binding(module) { module = String(module); + const mod = bindingObj[module]; + if (typeof mod === 'object') { + return mod; + } // Deprecated specific process.binding() modules, but not all, allow // selective fallback to internalBinding for the deprecated ones. + if (runtimeDeprecatedList.has(module)) { + process.emitWarning( + `Access to process.binding('${module}') is deprecated.`, + 'DeprecationWarning', + 'DEP0111'); + return internalBinding(module); + } + if (legacyWrapperList.has(module)) { + return requireBuiltin('internal/legacy/processbinding')[module](); + } if (processBindingAllowList.has(module)) { - if (runtimeDeprecatedList.has(module)) { - runtimeDeprecatedList.delete(module); - process.emitWarning( - `Access to process.binding('${module}') is deprecated.`, - 'DeprecationWarning', - 'DEP0111'); - } - if (legacyWrapperList.has(module)) { - return requireBuiltin('internal/legacy/processbinding')[module](); - } return internalBinding(module); } // eslint-disable-next-line no-restricted-syntax @@ -215,8 +213,8 @@ const internalBuiltinIds = builtinIds .filter((id) => StringPrototypeStartsWith(id, 'internal/') && id !== selfId); // When --expose-internals is on we'll add the internal builtin ids to these. -const canBeRequiredByUsersList = new SafeSet(publicBuiltinIds); -const canBeRequiredByUsersWithoutSchemeList = +let canBeRequiredByUsersList = new SafeSet(publicBuiltinIds); +let canBeRequiredByUsersWithoutSchemeList = new SafeSet(publicBuiltinIds.filter((id) => !schemelessBlockList.has(id))); /** @@ -269,6 +267,13 @@ class BuiltinModule { } } + static setRealmAllowRequireByUsers(ids) { + canBeRequiredByUsersList = + new SafeSet(ArrayPrototypeFilter(ids, (id) => ArrayPrototypeIncludes(publicBuiltinIds, id))); + canBeRequiredByUsersWithoutSchemeList = + new SafeSet(ArrayPrototypeFilter(ids, (id) => !schemelessBlockList.has(id))); + } + // To be called during pre-execution when --expose-internals is on. // Enables the user-land module loader to access internal modules. static exposeInternals() { @@ -440,7 +445,8 @@ function setupPrepareStackTrace() { setPrepareStackTraceCallback, } = internalBinding('errors'); const { - prepareStackTrace, + prepareStackTraceCallback, + ErrorPrepareStackTrace, fatalExceptionStackEnhancers: { beforeInspector, afterInspector, @@ -448,9 +454,17 @@ function setupPrepareStackTrace() { } = requireBuiltin('internal/errors'); // Tell our PrepareStackTraceCallback passed to the V8 API // to call prepareStackTrace(). - setPrepareStackTraceCallback(prepareStackTrace); + setPrepareStackTraceCallback(prepareStackTraceCallback); // Set the function used to enhance the error stack for printing setEnhanceStackForFatalException(beforeInspector, afterInspector); + // Setup the default Error.prepareStackTrace. + ObjectDefineProperty(Error, 'prepareStackTrace', { + __proto__: null, + writable: true, + enumerable: false, + configurable: true, + value: ErrorPrepareStackTrace, + }); } // Store the internal loaders in C++. diff --git a/lib/internal/bootstrap/shadow_realm.js b/lib/internal/bootstrap/shadow_realm.js new file mode 100644 index 00000000000000..b99502355d9818 --- /dev/null +++ b/lib/internal/bootstrap/shadow_realm.js @@ -0,0 +1,21 @@ +'use strict'; + +// This script sets up the context for shadow realms. + +const { + prepareShadowRealmExecution, +} = require('internal/process/pre_execution'); +const { + BuiltinModule, +} = require('internal/bootstrap/realm'); + +BuiltinModule.setRealmAllowRequireByUsers([ + /** + * The built-in modules exposed in the ShadowRealm must each be providing + * platform capabilities with no authority to cause side effects such as + * I/O or mutation of values that are shared across different realms within + * the same Node.js environment. + */ +]); + +prepareShadowRealmExecution(); diff --git a/lib/internal/bootstrap/switches/is_main_thread.js b/lib/internal/bootstrap/switches/is_main_thread.js index 8707bc7daaa616..3a0a2eddf92a9e 100644 --- a/lib/internal/bootstrap/switches/is_main_thread.js +++ b/lib/internal/bootstrap/switches/is_main_thread.js @@ -291,10 +291,11 @@ rawMethods.resetStdioForTesting = function() { require('fs'); require('util'); require('url'); // eslint-disable-line no-restricted-modules - +internalBinding('module_wrap'); require('internal/modules/cjs/loader'); require('internal/modules/esm/utils'); require('internal/vm/module'); + // Needed to refresh the time origin. require('internal/perf/utils'); // Needed to register the async hooks. diff --git a/lib/internal/bootstrap/web/exposed-window-or-worker.js b/lib/internal/bootstrap/web/exposed-window-or-worker.js index 3cc555b82f35a7..37e4518a5400b5 100644 --- a/lib/internal/bootstrap/web/exposed-window-or-worker.js +++ b/lib/internal/bootstrap/web/exposed-window-or-worker.js @@ -31,11 +31,8 @@ const { } = require('internal/process/task_queues'); defineOperation(globalThis, 'queueMicrotask', queueMicrotask); -defineLazyProperties( - globalThis, - 'internal/structured_clone', - ['structuredClone'], -); +const { structuredClone } = internalBinding('messaging'); +defineOperation(globalThis, 'structuredClone', structuredClone); defineLazyProperties(globalThis, 'buffer', ['atob', 'btoa']); // https://html.spec.whatwg.org/multipage/web-messaging.html#broadcasting-to-other-browsing-contexts @@ -55,10 +52,6 @@ exposeLazyInterfaces(globalThis, 'perf_hooks', [ defineReplaceableLazyAttribute(globalThis, 'perf_hooks', ['performance']); -// https://html.spec.whatwg.org/multipage/system-state.html#the-navigator-object -exposeLazyInterfaces(globalThis, 'internal/navigator', ['Navigator']); -defineReplaceableLazyAttribute(globalThis, 'internal/navigator', ['navigator'], false); - // https://w3c.github.io/FileAPI/#creating-revoking const { installObjectURLMethods } = require('internal/url'); installObjectURLMethods(); diff --git a/lib/internal/child_process.js b/lib/internal/child_process.js index 2cad5aaf71cec9..49edaba5b558e9 100644 --- a/lib/internal/child_process.js +++ b/lib/internal/child_process.js @@ -17,7 +17,7 @@ const { } = primordials; const { - errnoException, + ErrnoException, codes: { ERR_INVALID_ARG_TYPE, ERR_INVALID_ARG_VALUE, @@ -283,7 +283,7 @@ function ChildProcess() { if (exitCode < 0) { const syscall = this.spawnfile ? 'spawn ' + this.spawnfile : 'spawn'; - const err = errnoException(exitCode, syscall); + const err = new ErrnoException(exitCode, syscall); if (this.spawnfile) err.path = this.spawnfile; @@ -418,7 +418,7 @@ ChildProcess.prototype.spawn = function(options) { this._handle.close(); this._handle = null; - throw errnoException(err, 'spawn'); + throw new ErrnoException(err, 'spawn'); } else { process.nextTick(onSpawnNT, this); } @@ -506,10 +506,10 @@ ChildProcess.prototype.kill = function(sig) { /* Already dead. */ } else if (err === UV_EINVAL || err === UV_ENOSYS) { /* The underlying platform doesn't support this signal. */ - throw errnoException(err, 'kill'); + throw new ErrnoException(err, 'kill'); } else { /* Other error, almost certainly EPERM. */ - this.emit('error', errnoException(err, 'kill')); + this.emit('error', new ErrnoException(err, 'kill')); } } @@ -876,7 +876,7 @@ function setupChannel(target, channel, serializationMode) { obj.postSend(message, handle, options, callback); if (!options.swallowErrors) { - const ex = errnoException(err, 'write'); + const ex = new ErrnoException(err, 'write'); if (typeof callback === 'function') { process.nextTick(callback, ex); } else { @@ -1121,7 +1121,7 @@ function spawnSync(options) { result.stderr = result.output && result.output[2]; if (result.error) { - result.error = errnoException(result.error, 'spawnSync ' + options.file); + result.error = new ErrnoException(result.error, 'spawnSync ' + options.file); result.error.path = options.file; result.error.spawnargs = ArrayPrototypeSlice(options.args, 1); } diff --git a/lib/internal/cli_table.js b/lib/internal/cli_table.js index 79b15a38f49bb5..be0bd44bbc36fe 100644 --- a/lib/internal/cli_table.js +++ b/lib/internal/cli_table.js @@ -40,11 +40,10 @@ const renderRow = (row, columnWidths) => { for (let i = 0; i < row.length; i++) { const cell = row[i]; const len = getStringWidth(cell); - const needed = (columnWidths[i] - len) / 2; + const needed = (columnWidths[i] - len); // round(needed) + ceil(needed) will always add up to the amount // of spaces we need while also left justifying the output. - out += StringPrototypeRepeat(' ', needed) + cell + - StringPrototypeRepeat(' ', MathCeil(needed)); + out += cell + StringPrototypeRepeat(' ', MathCeil(needed)); if (i !== row.length - 1) out += tableChars.middle; } diff --git a/lib/internal/console/constructor.js b/lib/internal/console/constructor.js index 44fa0f32d76ff3..0a5849d524f782 100644 --- a/lib/internal/console/constructor.js +++ b/lib/internal/console/constructor.js @@ -430,9 +430,14 @@ const consoleMethods = { this.error(err.stack); }, + // Defined by: https://console.spec.whatwg.org/#assert assert(expression, ...args) { if (!expression) { - args[0] = `Assertion failed${args.length === 0 ? '' : `: ${args[0]}`}`; + if (args.length && typeof args[0] === 'string') { + args[0] = `Assertion failed: ${args[0]}`; + } else { + ArrayPrototypeUnshift(args, 'Assertion failed'); + } // The arguments will be formatted in warn() again ReflectApply(this.warn, this, args); } diff --git a/lib/internal/crypto/cipher.js b/lib/internal/crypto/cipher.js index a2b560d1382418..6f47b47f90ea4d 100644 --- a/lib/internal/crypto/cipher.js +++ b/lib/internal/crypto/cipher.js @@ -125,13 +125,6 @@ function createCipherBase(cipher, credential, options, decipher, iv) { ReflectApply(LazyTransform, this, [options]); } -function createCipher(cipher, password, options, decipher) { - validateString(cipher, 'cipher'); - password = getArrayBufferOrView(password, 'password'); - - ReflectApply(createCipherBase, this, [cipher, password, options, decipher]); -} - function createCipherWithIV(cipher, key, options, decipher, iv) { validateString(cipher, 'cipher'); const encoding = getStringOption(options, 'encoding'); @@ -148,8 +141,6 @@ function createCipherWithIV(cipher, key, options, decipher, iv) { function Cipher(cipher, password, options) { if (!(this instanceof Cipher)) return new Cipher(cipher, password, options); - - ReflectApply(createCipher, this, [cipher, password, options, true]); } ObjectSetPrototypeOf(Cipher.prototype, LazyTransform.prototype); @@ -269,8 +260,6 @@ addCipherPrototypeFunctions(Cipheriv); function Decipher(cipher, password, options) { if (!(this instanceof Decipher)) return new Decipher(cipher, password, options); - - ReflectApply(createCipher, this, [cipher, password, options, false]); } ObjectSetPrototypeOf(Decipher.prototype, LazyTransform.prototype); @@ -321,9 +310,7 @@ function getCipherInfo(nameOrNid, options) { } module.exports = { - Cipher, Cipheriv, - Decipher, Decipheriv, privateDecrypt, privateEncrypt, diff --git a/lib/internal/crypto/ec.js b/lib/internal/crypto/ec.js index 710917af2e2783..9f30f6e1a0ba09 100644 --- a/lib/internal/crypto/ec.js +++ b/lib/internal/crypto/ec.js @@ -264,6 +264,10 @@ async function ecImportKey( break; } + if (!keyObject[kHandle].checkEcKeyData()) { + throw lazyDOMException('Invalid keyData', 'DataError'); + } + const { namedCurve: checkNamedCurve, } = keyObject[kHandle].keyDetail({}); diff --git a/lib/internal/crypto/hash.js b/lib/internal/crypto/hash.js index 57fcb63518d52d..4ed97034f612fb 100644 --- a/lib/internal/crypto/hash.js +++ b/lib/internal/crypto/hash.js @@ -57,7 +57,7 @@ const kState = Symbol('kState'); const kFinalized = Symbol('kFinalized'); function Hash(algorithm, options) { - if (!(this instanceof Hash)) + if (!new.target) return new Hash(algorithm, options); if (!(algorithm instanceof _Hash)) validateString(algorithm, 'algorithm'); diff --git a/lib/internal/crypto/hkdf.js b/lib/internal/crypto/hkdf.js index cf3c39e8d9da5a..757a2391a0167f 100644 --- a/lib/internal/crypto/hkdf.js +++ b/lib/internal/crypto/hkdf.js @@ -49,15 +49,15 @@ const { } = require('internal/errors'); const validateParameters = hideStackFrames((hash, key, salt, info, length) => { - validateString(hash, 'digest'); + validateString.withoutStackTrace(hash, 'digest'); key = prepareKey(key); - salt = validateByteSource(salt, 'salt'); - info = validateByteSource(info, 'info'); + salt = validateByteSource.withoutStackTrace(salt, 'salt'); + info = validateByteSource.withoutStackTrace(info, 'info'); - validateInteger(length, 'length', 0, kMaxLength); + validateInteger.withoutStackTrace(length, 'length', 0, kMaxLength); if (info.byteLength > 1024) { - throw new ERR_OUT_OF_RANGE( + throw new ERR_OUT_OF_RANGE.HideStackFramesError( 'info', 'must not contain more than 1024 bytes', info.byteLength); diff --git a/lib/internal/crypto/keys.js b/lib/internal/crypto/keys.js index 1e49bd62473a1b..fc4240ffd28864 100644 --- a/lib/internal/crypto/keys.js +++ b/lib/internal/crypto/keys.js @@ -703,32 +703,81 @@ ObjectDefineProperties(CryptoKey.prototype, { }, }); +/** + * @param {InternalCryptoKey} key + * @param {KeyObject} keyObject + * @param {object} algorithm + * @param {boolean} extractable + * @param {Set} keyUsages + */ +function defineCryptoKeyProperties( + key, + keyObject, + algorithm, + extractable, + keyUsages, +) { + // Using symbol properties here currently instead of private + // properties because (for now) the performance penalty of + // private fields is still too high. + ObjectDefineProperties(key, { + [kKeyObject]: { + __proto__: null, + value: keyObject, + enumerable: false, + configurable: false, + writable: false, + }, + [kAlgorithm]: { + __proto__: null, + value: algorithm, + enumerable: false, + configurable: false, + writable: false, + }, + [kExtractable]: { + __proto__: null, + value: extractable, + enumerable: false, + configurable: false, + writable: false, + }, + [kKeyUsages]: { + __proto__: null, + value: keyUsages, + enumerable: false, + configurable: false, + writable: false, + }, + }); +} + // All internal code must use new InternalCryptoKey to create // CryptoKey instances. The CryptoKey class is exposed to end // user code but is not permitted to be constructed directly. // Using markTransferMode also allows the CryptoKey to be // cloned to Workers. class InternalCryptoKey { - constructor( - keyObject, - algorithm, - keyUsages, - extractable) { + constructor(keyObject, algorithm, keyUsages, extractable) { markTransferMode(this, true, false); - // Using symbol properties here currently instead of private - // properties because (for now) the performance penalty of - // private fields is still too high. - this[kKeyObject] = keyObject; - this[kAlgorithm] = algorithm; - this[kExtractable] = extractable; - this[kKeyUsages] = keyUsages; + // When constructed during transfer the properties get assigned + // in the kDeserialize call. + if (keyObject) { + defineCryptoKeyProperties( + this, + keyObject, + algorithm, + extractable, + keyUsages, + ); + } } [kClone]() { const keyObject = this[kKeyObject]; - const algorithm = this.algorithm; - const extractable = this.extractable; - const usages = this.usages; + const algorithm = this[kAlgorithm]; + const extractable = this[kExtractable]; + const usages = this[kKeyUsages]; return { data: { @@ -742,10 +791,7 @@ class InternalCryptoKey { } [kDeserialize]({ keyObject, algorithm, usages, extractable }) { - this[kKeyObject] = keyObject; - this[kAlgorithm] = algorithm; - this[kKeyUsages] = usages; - this[kExtractable] = extractable; + defineCryptoKeyProperties(this, keyObject, algorithm, extractable, usages); } } InternalCryptoKey.prototype.constructor = CryptoKey; diff --git a/lib/internal/crypto/util.js b/lib/internal/crypto/util.js index 51ca3f4c056fb9..45a236a1130249 100644 --- a/lib/internal/crypto/util.js +++ b/lib/internal/crypto/util.js @@ -116,7 +116,7 @@ const getArrayBufferOrView = hideStackFrames((buffer, name, encoding) => { return Buffer.from(buffer, encoding); } if (!isArrayBufferView(buffer)) { - throw new ERR_INVALID_ARG_TYPE( + throw new ERR_INVALID_ARG_TYPE.HideStackFramesError( name, [ 'string', @@ -403,7 +403,7 @@ const validateByteSource = hideStackFrames((val, name) => { if (isAnyArrayBuffer(val) || isArrayBufferView(val)) return val; - throw new ERR_INVALID_ARG_TYPE( + throw new ERR_INVALID_ARG_TYPE.HideStackFramesError( name, [ 'string', diff --git a/lib/internal/crypto/webidl.js b/lib/internal/crypto/webidl.js index 61a4cfe4330703..326d520b844d23 100644 --- a/lib/internal/crypto/webidl.js +++ b/lib/internal/crypto/webidl.js @@ -19,20 +19,22 @@ const { MathTrunc, Number, NumberIsFinite, - ObjectAssign, ObjectPrototypeIsPrototypeOf, SafeArrayIterator, - SafeSet, String, SymbolIterator, TypedArrayPrototypeGetBuffer, TypedArrayPrototypeGetSymbolToStringTag, - TypeError, globalThis: { SharedArrayBuffer, }, } = primordials; +const { + makeException, + createEnumConverter, +} = require('internal/webidl'); + const { kEmptyObject, setOwnProperty, @@ -40,23 +42,6 @@ const { const { CryptoKey } = require('internal/crypto/webcrypto'); const { getDataViewOrTypedArrayBuffer } = require('internal/crypto/util'); -function codedTypeError(message, errorProperties = kEmptyObject) { - // eslint-disable-next-line no-restricted-syntax - const err = new TypeError(message); - ObjectAssign(err, errorProperties); - return err; -} - -function makeException(message, opts = kEmptyObject) { - const prefix = opts.prefix ? opts.prefix + ': ' : ''; - const context = opts.context?.length === 0 ? - '' : (opts.context ?? 'Value') + ' '; - return codedTypeError( - `${prefix}${context}${message}`, - { code: opts.code || 'ERR_INVALID_ARG_TYPE' }, - ); -} - // https://tc39.es/ecma262/#sec-tonumber function toNumber(value, opts = kEmptyObject) { switch (typeof value) { @@ -308,22 +293,6 @@ function createDictionaryConverter(name, dictionaries) { }; } -function createEnumConverter(name, values) { - const E = new SafeSet(values); - - return function(V, opts = kEmptyObject) { - const S = String(V); - - if (!E.has(S)) { - throw makeException( - `value '${S}' is not a valid enum value of type ${name}.`, - { __proto__: null, ...opts, code: 'ERR_INVALID_ARG_VALUE' }); - } - - return S; - }; -} - function createSequenceConverter(converter) { return function(V, opts = kEmptyObject) { if (type(V) !== 'Object') { diff --git a/lib/internal/dns/callback_resolver.js b/lib/internal/dns/callback_resolver.js index e57a597c08c716..5b7758865a85c6 100644 --- a/lib/internal/dns/callback_resolver.js +++ b/lib/internal/dns/callback_resolver.js @@ -12,7 +12,7 @@ const { ERR_INVALID_ARG_TYPE, ERR_INVALID_ARG_VALUE, }, - dnsException, + DNSException, } = require('internal/errors'); const { @@ -42,7 +42,7 @@ function onresolve(err, result, ttls) { result, (address, index) => ({ address, ttl: ttls[index] })); if (err) - this.callback(dnsException(err, this.bindingName, this.hostname)); + this.callback(new DNSException(err, this.bindingName, this.hostname)); else { this.callback(null, result); if (this[kPerfHooksDnsLookupResolveContext] && hasObserver('dns')) { @@ -69,7 +69,7 @@ function resolver(bindingName) { req.oncomplete = onresolve; req.ttl = !!(options && options.ttl); const err = this._handle[bindingName](req, name); - if (err) throw dnsException(err, bindingName, name); + if (err) throw new DNSException(err, bindingName, name); if (hasObserver('dns')) { startPerf(req, kPerfHooksDnsLookupResolveContext, { type: 'dns', diff --git a/lib/internal/dns/promises.js b/lib/internal/dns/promises.js index 1169b2735d4efe..56276fdbae7db7 100644 --- a/lib/internal/dns/promises.js +++ b/lib/internal/dns/promises.js @@ -45,7 +45,7 @@ const { ADDRGETNETWORKPARAMS, CANCELLED, } = dnsErrorCodes; -const { codes, dnsException } = require('internal/errors'); +const { codes, DNSException } = require('internal/errors'); const { isIP } = require('internal/net'); const { getaddrinfo, @@ -79,7 +79,7 @@ const { function onlookup(err, addresses) { if (err) { - this.reject(dnsException(err, 'getaddrinfo', this.hostname)); + this.reject(new DNSException(err, 'getaddrinfo', this.hostname)); return; } @@ -92,7 +92,7 @@ function onlookup(err, addresses) { function onlookupall(err, addresses) { if (err) { - this.reject(dnsException(err, 'getaddrinfo', this.hostname)); + this.reject(new DNSException(err, 'getaddrinfo', this.hostname)); return; } @@ -153,7 +153,7 @@ function createLookupPromise(family, hostname, all, hints, verbatim) { const err = getaddrinfo(req, hostname, family, hints, verbatim); if (err) { - reject(dnsException(err, 'getaddrinfo', hostname)); + reject(new DNSException(err, 'getaddrinfo', hostname)); } else if (hasObserver('dns')) { const detail = { hostname, @@ -220,7 +220,7 @@ function lookup(hostname, options) { function onlookupservice(err, hostname, service) { if (err) { - this.reject(dnsException(err, 'getnameinfo', this.host)); + this.reject(new DNSException(err, 'getnameinfo', this.host)); return; } @@ -243,7 +243,7 @@ function createLookupServicePromise(hostname, port) { const err = getnameinfo(req, hostname, port); if (err) - reject(dnsException(err, 'getnameinfo', hostname)); + reject(new DNSException(err, 'getnameinfo', hostname)); else if (hasObserver('dns')) { startPerf(req, kPerfHooksDnsLookupServiceContext, { type: 'dns', @@ -272,7 +272,7 @@ function lookupService(address, port) { function onresolve(err, result, ttls) { if (err) { - this.reject(dnsException(err, this.bindingName, this.hostname)); + this.reject(new DNSException(err, this.bindingName, this.hostname)); return; } @@ -300,7 +300,7 @@ function createResolverPromise(resolver, bindingName, hostname, ttl) { const err = resolver._handle[bindingName](req, hostname); if (err) - reject(dnsException(err, bindingName, hostname)); + reject(new DNSException(err, bindingName, hostname)); else if (hasObserver('dns')) { startPerf(req, kPerfHooksDnsLookupResolveContext, { type: 'dns', diff --git a/lib/internal/dns/utils.js b/lib/internal/dns/utils.js index fa8f0b8cf14103..0d1f817593f2e7 100644 --- a/lib/internal/dns/utils.js +++ b/lib/internal/dns/utils.js @@ -2,7 +2,6 @@ const { ArrayPrototypeForEach, - ArrayPrototypeJoin, ArrayPrototypeMap, ArrayPrototypePush, FunctionPrototypeBind, @@ -143,12 +142,15 @@ class ResolverBase { } [kSetServersInteral](newSet, servers) { - const orig = this._handle.getServers() || []; + const orig = ArrayPrototypeMap(this._handle.getServers() || [], (val) => { + val.unshift(isIP(val[0])); + return val; + }); const errorNumber = this._handle.setServers(newSet); if (errorNumber !== 0) { // Reset the servers to the old servers, because ares probably unset them. - this._handle.setServers(ArrayPrototypeJoin(orig, ',')); + this._handle.setServers(orig); const { strerror } = lazyBinding(); const err = strerror(errorNumber); throw new ERR_DNS_SET_SERVERS_FAILED(err, servers); diff --git a/lib/internal/errors.js b/lib/internal/errors.js index 76ce7867043c7d..d2250f5c7f053c 100644 --- a/lib/internal/errors.js +++ b/lib/internal/errors.js @@ -85,37 +85,14 @@ const kTypes = [ const MainContextError = Error; const overrideStackTrace = new SafeWeakMap(); -const kNoOverride = Symbol('kNoOverride'); -let userStackTraceLimit; -const nodeInternalPrefix = '__node_internal_'; -const prepareStackTrace = (globalThis, error, trace) => { - // API for node internals to override error stack formatting - // without interfering with userland code. - if (overrideStackTrace.has(error)) { - const f = overrideStackTrace.get(error); - overrideStackTrace.delete(error); - return f(error, trace); - } - - const firstFrame = trace[0]?.getFunctionName(); - if (firstFrame && StringPrototypeStartsWith(firstFrame, nodeInternalPrefix)) { - for (let l = trace.length - 1; l >= 0; l--) { - const fn = trace[l]?.getFunctionName(); - if (fn && StringPrototypeStartsWith(fn, nodeInternalPrefix)) { - ArrayPrototypeSplice(trace, 0, l + 1); - break; - } - } - // `userStackTraceLimit` is the user value for `Error.stackTraceLimit`, - // it is updated at every new exception in `captureLargerStackTrace`. - if (trace.length > userStackTraceLimit) - ArrayPrototypeSplice(trace, userStackTraceLimit); - } - - const globalOverride = - maybeOverridePrepareStackTrace(globalThis, error, trace); - if (globalOverride !== kNoOverride) return globalOverride; +let internalPrepareStackTrace = defaultPrepareStackTrace; +/** + * The default implementation of `Error.prepareStackTrace` with simple + * concatenation of stack frames. + * Read more about `Error.prepareStackTrace` at https://v8.dev/docs/stack-trace-api#customizing-stack-traces. + */ +function defaultPrepareStackTrace(error, trace) { // Normal error formatting: // // Error: Message @@ -131,9 +108,35 @@ const prepareStackTrace = (globalThis, error, trace) => { return errorString; } return `${errorString}\n at ${ArrayPrototypeJoin(trace, '\n at ')}`; -}; +} + +function setInternalPrepareStackTrace(callback) { + internalPrepareStackTrace = callback; +} + +/** + * Every realm has its own prepareStackTraceCallback. When `error.stack` is + * accessed, if the error is created in a shadow realm, the shadow realm's + * prepareStackTraceCallback is invoked. Otherwise, the principal realm's + * prepareStackTraceCallback is invoked. Note that accessing `error.stack` + * of error objects created in a VM Context will always invoke the + * prepareStackTraceCallback of the principal realm. + * @param {object} globalThis The global object of the realm that the error was + * created in. When the error object is created in a VM Context, this is the + * global object of that VM Context. + * @param {object} error The error object. + * @param {CallSite[]} trace An array of CallSite objects, read more at https://v8.dev/docs/stack-trace-api#customizing-stack-traces. + * @returns {string} + */ +function prepareStackTraceCallback(globalThis, error, trace) { + // API for node internals to override error stack formatting + // without interfering with userland code. + if (overrideStackTrace.has(error)) { + const f = overrideStackTrace.get(error); + overrideStackTrace.delete(error); + return f(error, trace); + } -const maybeOverridePrepareStackTrace = (globalThis, error, trace) => { // Polyfill of V8's Error.prepareStackTrace API. // https://crbug.com/v8/7848 // `globalThis` is the global that contains the constructor which @@ -148,33 +151,63 @@ const maybeOverridePrepareStackTrace = (globalThis, error, trace) => { return MainContextError.prepareStackTrace(error, trace); } - return kNoOverride; -}; + // If the Error.prepareStackTrace was not a function, fallback to the + // internal implementation. + return internalPrepareStackTrace(error, trace); +} + +/** + * The default Error.prepareStackTrace implementation. + */ +function ErrorPrepareStackTrace(error, trace) { + return internalPrepareStackTrace(error, trace); +} -const aggregateTwoErrors = hideStackFrames((innerError, outerError) => { +const aggregateTwoErrors = (innerError, outerError) => { if (innerError && outerError && innerError !== outerError) { if (ArrayIsArray(outerError.errors)) { // If `outerError` is already an `AggregateError`. ArrayPrototypePush(outerError.errors, innerError); return outerError; } - // eslint-disable-next-line no-restricted-syntax - const err = new AggregateError(new SafeArrayIterator([ - outerError, - innerError, - ]), outerError.message); + let err; + if (isErrorStackTraceLimitWritable()) { + const limit = Error.stackTraceLimit; + Error.stackTraceLimit = 0; + // eslint-disable-next-line no-restricted-syntax + err = new AggregateError(new SafeArrayIterator([ + outerError, + innerError, + ]), outerError.message); + Error.stackTraceLimit = limit; + ErrorCaptureStackTrace(err, aggregateTwoErrors); + } else { + // eslint-disable-next-line no-restricted-syntax + err = new AggregateError(new SafeArrayIterator([ + outerError, + innerError, + ]), outerError.message); + } err.code = outerError.code; return err; } return innerError || outerError; -}); +}; -const aggregateErrors = hideStackFrames((errors, message, code) => { - // eslint-disable-next-line no-restricted-syntax - const err = new AggregateError(new SafeArrayIterator(errors), message); - err.code = errors[0]?.code; - return err; -}); +class NodeAggregateError extends AggregateError { + constructor(errors, message) { + super(new SafeArrayIterator(errors), message); + this.code = errors[0]?.code; + } + + get [kIsNodeError]() { + return true; + } + + get ['constructor']() { + return AggregateError; + } +} const assert = require('internal/assert'); @@ -242,11 +275,7 @@ function inspectWithNoCustomRetry(obj, options) { // and may have .path and .dest. class SystemError extends Error { constructor(key, context) { - const limit = Error.stackTraceLimit; - if (isErrorStackTraceLimitWritable()) Error.stackTraceLimit = 0; super(); - // Reset the limit and setting the name property. - if (isErrorStackTraceLimitWritable()) Error.stackTraceLimit = limit; const prefix = getMessage(key, [], this); let message = `${prefix}: ${context.syscall} returned ` + `${context.code} (${context.message})`; @@ -256,8 +285,6 @@ class SystemError extends Error { if (context.dest !== undefined) message += ` => ${context.dest}`; - captureLargerStackTrace(this); - this.code = key; ObjectDefineProperties(this, { @@ -372,6 +399,33 @@ function makeSystemErrorWithCode(key) { }; } +// This is a special error type that is only used for the E function. +class HideStackFramesError extends Error { +} + +function makeNodeErrorForHideStackFrame(Base, clazz) { + class HideStackFramesError extends Base { + constructor(...args) { + if (isErrorStackTraceLimitWritable()) { + const limit = Error.stackTraceLimit; + Error.stackTraceLimit = 0; + super(...args); + Error.stackTraceLimit = limit; + } else { + super(...args); + } + } + + // This is a workaround for wpt tests that expect that the error + // constructor has a `name` property of the base class. + get ['constructor']() { + return clazz; + } + } + + return HideStackFramesError; +} + function makeNodeErrorWithCode(Base, key) { const msg = messages.get(key); const expectedLength = typeof msg !== 'string' ? -1 : getExpectedArgumentLength(msg); @@ -479,11 +533,16 @@ function makeNodeErrorWithCode(Base, key) { * @returns {T} */ function hideStackFrames(fn) { - // We rename the functions that will be hidden to cut off the stacktrace - // at the outermost one - const hidden = nodeInternalPrefix + fn.name; - ObjectDefineProperty(fn, 'name', { __proto__: null, value: hidden }); - return fn; + function wrappedFn(...args) { + try { + return ReflectApply(fn, this, args); + } catch (error) { + Error.stackTraceLimit && ErrorCaptureStackTrace(error, wrappedFn); + throw error; + } + } + wrappedFn.withoutStackTrace = fn; + return wrappedFn; } // Utility function for registering the error codes. Only used here. Exported @@ -492,18 +551,33 @@ function E(sym, val, def, ...otherClasses) { // Special case for SystemError that formats the error message differently // The SystemErrors only have SystemError as their base classes. messages.set(sym, val); - if (def === SystemError) { - def = makeSystemErrorWithCode(sym); - } else { - def = makeNodeErrorWithCode(def, sym); - } + + const ErrClass = def === SystemError ? + makeSystemErrorWithCode(sym) : + makeNodeErrorWithCode(def, sym); if (otherClasses.length !== 0) { - otherClasses.forEach((clazz) => { - def[clazz.name] = makeNodeErrorWithCode(clazz, sym); - }); + if (otherClasses.includes(HideStackFramesError)) { + if (otherClasses.length !== 1) { + otherClasses.forEach((clazz) => { + if (clazz !== HideStackFramesError) { + ErrClass[clazz.name] = makeNodeErrorWithCode(clazz, sym); + ErrClass[clazz.name].HideStackFramesError = makeNodeErrorForHideStackFrame(ErrClass[clazz.name], clazz); + } + }); + } + } else { + otherClasses.forEach((clazz) => { + ErrClass[clazz.name] = makeNodeErrorWithCode(clazz, sym); + }); + } + } + + if (otherClasses.includes(HideStackFramesError)) { + ErrClass.HideStackFramesError = makeNodeErrorForHideStackFrame(ErrClass, def); } - codes[sym] = def; + + codes[sym] = ErrClass; } function getExpectedArgumentLength(msg) { @@ -553,84 +627,67 @@ function uvErrmapGet(name) { return MapPrototypeGet(uvBinding.errmap, name); } -const captureLargerStackTrace = hideStackFrames( - function captureLargerStackTrace(err) { - const stackTraceLimitIsWritable = isErrorStackTraceLimitWritable(); - if (stackTraceLimitIsWritable) { - userStackTraceLimit = Error.stackTraceLimit; - Error.stackTraceLimit = Infinity; - } - ErrorCaptureStackTrace(err); - // Reset the limit - if (stackTraceLimitIsWritable) Error.stackTraceLimit = userStackTraceLimit; - - return err; - }); - /** * This creates an error compatible with errors produced in the C++ * function UVException using a context object with data assembled in C++. * The goal is to migrate them to ERR_* errors later when compatibility is * not a concern. - * @param {object} ctx - * @returns {Error} */ -const uvException = hideStackFrames(function uvException(ctx) { - const { 0: code, 1: uvmsg } = uvErrmapGet(ctx.errno) || uvUnmappedError; - let message = `${code}: ${ctx.message || uvmsg}, ${ctx.syscall}`; - - let path; - let dest; - if (ctx.path) { - path = ctx.path.toString(); - message += ` '${path}'`; - } - if (ctx.dest) { - dest = ctx.dest.toString(); - message += ` -> '${dest}'`; - } +class UVException extends Error { + /** + * @param {object} ctx + */ + constructor(ctx) { + const { 0: code, 1: uvmsg } = uvErrmapGet(ctx.errno) || uvUnmappedError; + let message = `${code}: ${ctx.message || uvmsg}, ${ctx.syscall}`; + + let path; + let dest; + if (ctx.path) { + path = ctx.path.toString(); + message += ` '${path}'`; + } + if (ctx.dest) { + dest = ctx.dest.toString(); + message += ` -> '${dest}'`; + } - // Reducing the limit improves the performance significantly. We do not lose - // the stack frames due to the `captureStackTrace()` function that is called - // later. - const tmpLimit = Error.stackTraceLimit; - if (isErrorStackTraceLimitWritable()) Error.stackTraceLimit = 0; - // Pass the message to the constructor instead of setting it on the object - // to make sure it is the same as the one created in C++ - // eslint-disable-next-line no-restricted-syntax - const err = new Error(message); - if (isErrorStackTraceLimitWritable()) Error.stackTraceLimit = tmpLimit; + super(message); - for (const prop of ObjectKeys(ctx)) { - if (prop === 'message' || prop === 'path' || prop === 'dest') { - continue; + for (const prop of ObjectKeys(ctx)) { + if (prop === 'message' || prop === 'path' || prop === 'dest') { + continue; + } + this[prop] = ctx[prop]; } - err[prop] = ctx[prop]; - } - err.code = code; - if (path) { - err.path = path; - } - if (dest) { - err.dest = dest; + this.code = code; + if (path) { + this.path = path; + } + if (dest) { + this.dest = dest; + } } - return captureLargerStackTrace(err); -}); + get ['constructor']() { + return Error; + } +} /** * This creates an error compatible with errors produced in the C++ * This function should replace the deprecated * `exceptionWithHostPort()` function. - * @param {number} err - A libuv error number - * @param {string} syscall - * @param {string} address - * @param {number} [port] - * @returns {Error} */ -const uvExceptionWithHostPort = hideStackFrames( - function uvExceptionWithHostPort(err, syscall, address, port) { +class UVExceptionWithHostPort extends Error { + /** + * @param {number} err - A libuv error number + * @param {string} syscall + * @param {string} address + * @param {number} [port] + */ + constructor(err, syscall, address, port) { const { 0: code, 1: uvmsg } = uvErrmapGet(err) || uvUnmappedError; const message = `${syscall} ${code}: ${uvmsg}`; let details = ''; @@ -641,34 +698,32 @@ const uvExceptionWithHostPort = hideStackFrames( details = ` ${address}`; } - // Reducing the limit improves the performance significantly. We do not - // lose the stack frames due to the `captureStackTrace()` function that - // is called later. - const tmpLimit = Error.stackTraceLimit; - if (isErrorStackTraceLimitWritable()) Error.stackTraceLimit = 0; - // eslint-disable-next-line no-restricted-syntax - const ex = new Error(`${message}${details}`); - if (isErrorStackTraceLimitWritable()) Error.stackTraceLimit = tmpLimit; - ex.code = code; - ex.errno = err; - ex.syscall = syscall; - ex.address = address; + super(`${message}${details}`); + + this.code = code; + this.errno = err; + this.syscall = syscall; + this.address = address; if (port) { - ex.port = port; + this.port = port; } + } - return captureLargerStackTrace(ex); - }); + get ['constructor']() { + return Error; + } +} /** * This used to be util._errnoException(). - * @param {number} err - A libuv error number - * @param {string} syscall - * @param {string} [original] - * @returns {Error} */ -const errnoException = hideStackFrames( - function errnoException(err, syscall, original) { +class ErrnoException extends Error { + /** + * @param {number} err - A libuv error number + * @param {string} syscall + * @param {string} [original] err + */ + constructor(err, syscall, original) { // TODO(joyeecheung): We have to use the type-checked // getSystemErrorName(err) to guard against invalid arguments from users. // This can be replaced with [ code ] = errmap.get(err) when this method @@ -678,20 +733,20 @@ const errnoException = hideStackFrames( const message = original ? `${syscall} ${code} ${original}` : `${syscall} ${code}`; - const tmpLimit = Error.stackTraceLimit; - if (isErrorStackTraceLimitWritable()) Error.stackTraceLimit = 0; - // eslint-disable-next-line no-restricted-syntax - const ex = new Error(message); - if (isErrorStackTraceLimitWritable()) Error.stackTraceLimit = tmpLimit; - ex.errno = err; - ex.code = code; - ex.syscall = syscall; + super(message); - return captureLargerStackTrace(ex); - }); + this.errno = err; + this.code = code; + this.syscall = syscall; + } + + get ['constructor']() { + return Error; + } +} /** - * Deprecated, new function is `uvExceptionWithHostPort()` + * Deprecated, new Error is `UVExceptionWithHostPort()` * New function added the error description directly * from C++. this method for backwards compatibility * @param {number} err - A libuv error number @@ -701,8 +756,8 @@ const errnoException = hideStackFrames( * @param {string} [additional] * @returns {Error} */ -const exceptionWithHostPort = hideStackFrames( - function exceptionWithHostPort(err, syscall, address, port, additional) { +class ExceptionWithHostPort extends Error { + constructor(err, syscall, address, port, additional) { // TODO(joyeecheung): We have to use the type-checked // getSystemErrorName(err) to guard against invalid arguments from users. // This can be replaced with [ code ] = errmap.get(err) when this method @@ -719,78 +774,75 @@ const exceptionWithHostPort = hideStackFrames( details += ` - Local (${additional})`; } - // Reducing the limit improves the performance significantly. We do not - // lose the stack frames due to the `captureStackTrace()` function that - // is called later. - const tmpLimit = Error.stackTraceLimit; - if (isErrorStackTraceLimitWritable()) Error.stackTraceLimit = 0; - // eslint-disable-next-line no-restricted-syntax - const ex = new Error(`${syscall} ${code}${details}`); - if (isErrorStackTraceLimitWritable()) Error.stackTraceLimit = tmpLimit; - ex.errno = err; - ex.code = code; - ex.syscall = syscall; - ex.address = address; + super(`${syscall} ${code}${details}`); + + this.errno = err; + this.code = code; + this.syscall = syscall; + this.address = address; if (port) { - ex.port = port; + this.port = port; } + } - return captureLargerStackTrace(ex); - }); + get ['constructor']() { + return Error; + } +} -/** - * @param {number|string} code - A libuv error number or a c-ares error code - * @param {string} syscall - * @param {string} [hostname] - * @returns {Error} - */ -const dnsException = hideStackFrames(function(code, syscall, hostname) { - let errno; - // If `code` is of type number, it is a libuv error number, else it is a - // c-ares error code. - // TODO(joyeecheung): translate c-ares error codes into numeric ones and - // make them available in a property that's not error.errno (since they - // can be in conflict with libuv error codes). Also make sure - // util.getSystemErrorName() can understand them when an being informed that - // the number is a c-ares error code. - if (typeof code === 'number') { - errno = code; - // ENOTFOUND is not a proper POSIX error, but this error has been in place - // long enough that it's not practical to remove it. - if (code === lazyUv().UV_EAI_NODATA || code === lazyUv().UV_EAI_NONAME) { - code = 'ENOTFOUND'; // Fabricated error name. - } else { - code = lazyInternalUtil().getSystemErrorName(code); +class DNSException extends Error { + /** + * @param {number|string} code - A libuv error number or a c-ares error code + * @param {string} syscall + * @param {string} [hostname] + */ + constructor(code, syscall, hostname) { + let errno; + // If `code` is of type number, it is a libuv error number, else it is a + // c-ares error code. + // TODO(joyeecheung): translate c-ares error codes into numeric ones and + // make them available in a property that's not error.errno (since they + // can be in conflict with libuv error codes). Also make sure + // util.getSystemErrorName() can understand them when an being informed that + // the number is a c-ares error code. + if (typeof code === 'number') { + errno = code; + // ENOTFOUND is not a proper POSIX error, but this error has been in place + // long enough that it's not practical to remove it. + if (code === lazyUv().UV_EAI_NODATA || code === lazyUv().UV_EAI_NONAME) { + code = 'ENOTFOUND'; // Fabricated error name. + } else { + code = lazyInternalUtil().getSystemErrorName(code); + } + } + super(`${syscall} ${code}${hostname ? ` ${hostname}` : ''}`); + this.errno = errno; + this.code = code; + this.syscall = syscall; + if (hostname) { + this.hostname = hostname; } } - const message = `${syscall} ${code}${hostname ? ` ${hostname}` : ''}`; - // Reducing the limit improves the performance significantly. We do not lose - // the stack frames due to the `captureStackTrace()` function that is called - // later. - const tmpLimit = Error.stackTraceLimit; - if (isErrorStackTraceLimitWritable()) Error.stackTraceLimit = 0; - // eslint-disable-next-line no-restricted-syntax - const ex = new Error(message); - if (isErrorStackTraceLimitWritable()) Error.stackTraceLimit = tmpLimit; - ex.errno = errno; - ex.code = code; - ex.syscall = syscall; - if (hostname) { - ex.hostname = hostname; + + get ['constructor']() { + return Error; } +} - return captureLargerStackTrace(ex); -}); +class ConnResetException extends Error { + constructor(msg) { + super(msg); + this.code = 'ECONNRESET'; + } -function connResetException(msg) { - // eslint-disable-next-line no-restricted-syntax - const ex = new Error(msg); - ex.code = 'ECONNRESET'; - return ex; + get ['constructor']() { + return Error; + } } let maxStack_ErrorName; let maxStack_ErrorMessage; + /** * Returns true if `err.name` and `err.message` are equal to engine-specific * values indicating max call stack size has been exceeded. @@ -1011,16 +1063,15 @@ function formatList(array, type = 'and') { module.exports = { AbortError, aggregateTwoErrors, - aggregateErrors, - captureLargerStackTrace, + NodeAggregateError, codes, - connResetException, - dnsException, + ConnResetException, + DNSException, // This is exported only to facilitate testing. determineSpecificType, E, - errnoException, - exceptionWithHostPort, + ErrnoException, + ExceptionWithHostPort, fatalExceptionStackEnhancers, formatList, genericNodeError, @@ -1032,15 +1083,16 @@ module.exports = { isStackOverflowError, kEnhanceStackBeforeInspector, kIsNodeError, - kNoOverride, - maybeOverridePrepareStackTrace, + defaultPrepareStackTrace, + setInternalPrepareStackTrace, overrideStackTrace, - prepareStackTrace, + prepareStackTraceCallback, + ErrorPrepareStackTrace, setArrowMessage, SystemError, uvErrmapGet, - uvException, - uvExceptionWithHostPort, + UVException, + UVExceptionWithHostPort, }; // To declare an error message, use the E(sym, val, def) function above. The sym @@ -1147,7 +1199,7 @@ E('ERR_EVENT_RECURSION', 'The event "%s" is already being dispatched', Error); E('ERR_FALSY_VALUE_REJECTION', function(reason) { this.reason = reason; return 'Promise was rejected with falsy value'; -}, Error); +}, Error, HideStackFramesError); E('ERR_FEATURE_UNAVAILABLE_ON_PLATFORM', 'The feature %s is unavailable on the current platform' + ', which is being used to run Node.js', @@ -1163,7 +1215,7 @@ E('ERR_FS_CP_SOCKET', 'Cannot copy a socket file', SystemError); E('ERR_FS_CP_SYMLINK_TO_SUBDIRECTORY', 'Cannot overwrite symlink in subdirectory of self', SystemError); E('ERR_FS_CP_UNKNOWN', 'Cannot copy an unknown file type', SystemError); -E('ERR_FS_EISDIR', 'Path is a directory', SystemError); +E('ERR_FS_EISDIR', 'Path is a directory', SystemError, HideStackFramesError); E('ERR_FS_FILE_TOO_LARGE', 'File size (%s) is greater than 2 GiB', RangeError); E('ERR_FS_INVALID_SYMLINK_TYPE', 'Symlink type must be one of "dir", "file", or "junction". Received "%s"', @@ -1190,7 +1242,7 @@ E('ERR_HTTP2_INFO_STATUS_NOT_ALLOWED', E('ERR_HTTP2_INVALID_CONNECTION_HEADERS', 'HTTP/1 Connection specific headers are forbidden: "%s"', TypeError); E('ERR_HTTP2_INVALID_HEADER_VALUE', - 'Invalid value "%s" for header "%s"', TypeError); + 'Invalid value "%s" for header "%s"', TypeError, HideStackFramesError); E('ERR_HTTP2_INVALID_INFO_STATUS', 'Invalid informational status code: %s', RangeError); E('ERR_HTTP2_INVALID_ORIGIN', @@ -1198,7 +1250,7 @@ E('ERR_HTTP2_INVALID_ORIGIN', E('ERR_HTTP2_INVALID_PACKED_SETTINGS_LENGTH', 'Packed settings length must be a multiple of six', RangeError); E('ERR_HTTP2_INVALID_PSEUDOHEADER', - '"%s" is an invalid pseudoheader or is used incorrectly', TypeError); + '"%s" is an invalid pseudoheader or is used incorrectly', TypeError, HideStackFramesError); E('ERR_HTTP2_INVALID_SESSION', 'The session has been destroyed', Error); E('ERR_HTTP2_INVALID_SETTING_VALUE', // Using default arguments here is important so the arguments are not counted @@ -1210,7 +1262,7 @@ E('ERR_HTTP2_INVALID_SETTING_VALUE', this.max = max; } return `Invalid value for setting "${name}": ${actual}`; - }, TypeError, RangeError); + }, TypeError, RangeError, HideStackFramesError); E('ERR_HTTP2_INVALID_STREAM', 'The stream has been destroyed', Error); E('ERR_HTTP2_MAX_PENDING_SETTINGS_ACK', 'Maximum number of pending settings acknowledgements', Error); @@ -1230,7 +1282,7 @@ E('ERR_HTTP2_PAYLOAD_FORBIDDEN', E('ERR_HTTP2_PING_CANCEL', 'HTTP2 ping cancelled', Error); E('ERR_HTTP2_PING_LENGTH', 'HTTP2 ping payload must be 8 bytes', RangeError); E('ERR_HTTP2_PSEUDOHEADER_NOT_ALLOWED', - 'Cannot set HTTP/2 pseudo-headers', TypeError); + 'Cannot set HTTP/2 pseudo-headers', TypeError, HideStackFramesError); E('ERR_HTTP2_PUSH_DISABLED', 'HTTP/2 client has disabled push streams', Error); E('ERR_HTTP2_SEND_FILE', 'Directories cannot be sent', Error); E('ERR_HTTP2_SEND_FILE_NOSEEK', @@ -1256,6 +1308,8 @@ E('ERR_HTTP2_STREAM_CANCEL', function(error) { E('ERR_HTTP2_STREAM_ERROR', 'Stream closed with error code %s', Error); E('ERR_HTTP2_STREAM_SELF_DEPENDENCY', 'A stream cannot depend on itself', Error); +E('ERR_HTTP2_TOO_MANY_CUSTOM_SETTINGS', + 'Number of custom settings exceeds MAX_ADDITIONAL_SETTINGS', Error); E('ERR_HTTP2_TOO_MANY_INVALID_FRAMES', 'Too many invalid HTTP/2 frames', Error); E('ERR_HTTP2_TRAILERS_ALREADY_SENT', 'Trailing headers have already been sent', Error); @@ -1270,7 +1324,7 @@ E('ERR_HTTP_CONTENT_LENGTH_MISMATCH', E('ERR_HTTP_HEADERS_SENT', 'Cannot %s headers after they are sent to the client', Error); E('ERR_HTTP_INVALID_HEADER_VALUE', - 'Invalid value "%s" for header "%s"', TypeError); + 'Invalid value "%s" for header "%s"', TypeError, HideStackFramesError); E('ERR_HTTP_INVALID_STATUS_CODE', 'Invalid status code: %s', RangeError); E('ERR_HTTP_REQUEST_TIMEOUT', 'Request timeout', Error); E('ERR_HTTP_SOCKET_ASSIGNED', @@ -1280,19 +1334,14 @@ E('ERR_HTTP_SOCKET_ENCODING', E('ERR_HTTP_TRAILER_INVALID', 'Trailers are invalid with this transfer encoding', Error); E('ERR_ILLEGAL_CONSTRUCTOR', 'Illegal constructor', TypeError); -// TODO(aduh95): change the error to mention import attributes instead of import assertions. -E('ERR_IMPORT_ASSERTION_TYPE_FAILED', +E('ERR_IMPORT_ATTRIBUTE_MISSING', + 'Module "%s" needs an import attribute of "%s: %s"', TypeError); +E('ERR_IMPORT_ATTRIBUTE_TYPE_INCOMPATIBLE', 'Module "%s" is not of type "%s"', TypeError); -// TODO(aduh95): change the error to mention import attributes instead of import assertions. -E('ERR_IMPORT_ASSERTION_TYPE_MISSING', - 'Module "%s" needs an import attribute of type "%s"', TypeError); -// TODO(aduh95): change the error to mention import attributes instead of import assertions. -E('ERR_IMPORT_ASSERTION_TYPE_UNSUPPORTED', - 'Import attribute type "%s" is unsupported', TypeError); E('ERR_IMPORT_ATTRIBUTE_UNSUPPORTED', 'Import attribute "%s" with value "%s" is not supported', TypeError); E('ERR_INCOMPATIBLE_OPTION_PAIR', - 'Option "%s" cannot be used in combination with option "%s"', TypeError); + 'Option "%s" cannot be used in combination with option "%s"', TypeError, HideStackFramesError); E('ERR_INPUT_TYPE_NOT_ALLOWED', '--input-type can only be used with string ' + 'input via --eval, --print, or STDIN', Error); E('ERR_INSPECTOR_ALREADY_ACTIVATED', @@ -1388,7 +1437,7 @@ E('ERR_INVALID_ARG_TYPE', msg += `. Received ${determineSpecificType(actual)}`; return msg; - }, TypeError); + }, TypeError, HideStackFramesError); E('ERR_INVALID_ARG_VALUE', (name, value, reason = 'is invalid') => { let inspected = lazyInternalUtilInspect().inspect(value); if (inspected.length > 128) { @@ -1396,7 +1445,7 @@ E('ERR_INVALID_ARG_VALUE', (name, value, reason = 'is invalid') => { } const type = StringPrototypeIncludes(name, '.') ? 'property' : 'argument'; return `The ${type} '${name}' ${reason}. Received ${inspected}`; -}, TypeError, RangeError); +}, TypeError, RangeError, HideStackFramesError); E('ERR_INVALID_ASYNC_ID', 'Invalid %s value: %s', RangeError); E('ERR_INVALID_BUFFER_SIZE', 'Buffer size must be a multiple of %s', RangeError); @@ -1409,7 +1458,7 @@ E('ERR_INVALID_CHAR', msg += ` ["${field}"]`; } return msg; - }, TypeError); + }, TypeError, HideStackFramesError); E('ERR_INVALID_CURSOR_POS', 'Cannot set cursor row without setting its column', TypeError); E('ERR_INVALID_FD', @@ -1419,7 +1468,7 @@ E('ERR_INVALID_FILE_URL_HOST', 'File URL host must be "localhost" or empty on %s', TypeError); E('ERR_INVALID_FILE_URL_PATH', 'File URL path %s', TypeError); E('ERR_INVALID_HANDLE_TYPE', 'This handle type cannot be sent', TypeError); -E('ERR_INVALID_HTTP_TOKEN', '%s must be a valid HTTP token ["%s"]', TypeError); +E('ERR_INVALID_HTTP_TOKEN', '%s must be a valid HTTP token ["%s"]', TypeError, HideStackFramesError); E('ERR_INVALID_IP_ADDRESS', 'Invalid IP address: %s', TypeError); E('ERR_INVALID_MIME_SYNTAX', (production, str, invalidIndex) => { const msg = invalidIndex !== -1 ? ` at ${invalidIndex}` : ''; @@ -1457,11 +1506,11 @@ E('ERR_INVALID_REPL_EVAL_CONFIG', E('ERR_INVALID_REPL_INPUT', '%s', TypeError); E('ERR_INVALID_RETURN_PROPERTY', (input, name, prop, value) => { return `Expected a valid ${input} to be returned for the "${prop}" from the` + - ` "${name}" function but got ${determineSpecificType(value)}.`; + ` "${name}" hook but got ${determineSpecificType(value)}.`; }, TypeError); E('ERR_INVALID_RETURN_PROPERTY_VALUE', (input, name, prop, value) => { return `Expected ${input} to be returned for the "${prop}" from the` + - ` "${name}" function but got ${determineSpecificType(value)}.`; + ` "${name}" hook but got ${determineSpecificType(value)}.`; }, TypeError); E('ERR_INVALID_RETURN_VALUE', (input, name, value) => { const type = determineSpecificType(value); @@ -1608,7 +1657,7 @@ E('ERR_OUT_OF_RANGE', } msg += ` It must be ${range}. Received ${received}`; return msg; - }, RangeError); + }, RangeError, HideStackFramesError); E('ERR_PACKAGE_IMPORT_NOT_DEFINED', (specifier, packagePath, base) => { return `Package import specifier "${specifier}" is not defined${packagePath ? ` in package ${packagePath}package.json` : ''} imported from ${base}`; @@ -1674,7 +1723,7 @@ E('ERR_SOCKET_BAD_PORT', (name, port, allowZero = true) => { "The 'allowZero' argument must be of type boolean."); const operator = allowZero ? '>=' : '>'; return `${name} should be ${operator} 0 and < 65536. Received ${determineSpecificType(port)}.`; -}, RangeError); +}, RangeError, HideStackFramesError); E('ERR_SOCKET_BAD_TYPE', 'Bad socket type specified. Valid types are: udp4, udp6', TypeError); E('ERR_SOCKET_BUFFER_SIZE', @@ -1705,7 +1754,7 @@ E('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', E('ERR_STREAM_WRAP', 'Stream has StringDecoder set or is in objectMode', Error); E('ERR_STREAM_WRITE_AFTER_END', 'write after end', Error); E('ERR_SYNTHETIC', 'JavaScript Callstack', Error); -E('ERR_SYSTEM_ERROR', 'A system error occurred', SystemError); +E('ERR_SYSTEM_ERROR', 'A system error occurred', SystemError, HideStackFramesError); E('ERR_TAP_LEXER_ERROR', function(errorMsg) { hideInternalStackFrames(this); return errorMsg; @@ -1799,7 +1848,7 @@ E('ERR_UNKNOWN_ENCODING', 'Unknown encoding: %s', TypeError); E('ERR_UNKNOWN_FILE_EXTENSION', 'Unknown file extension "%s" for %s', TypeError); E('ERR_UNKNOWN_MODULE_FORMAT', 'Unknown module format: %s for URL %s', RangeError); -E('ERR_UNKNOWN_SIGNAL', 'Unknown signal: %s', TypeError); +E('ERR_UNKNOWN_SIGNAL', 'Unknown signal: %s', TypeError, HideStackFramesError); E('ERR_UNSUPPORTED_DIR_IMPORT', function(path, base, exactUrl) { lazyInternalUtil().setOwnProperty(this, 'url', exactUrl); return `Directory import '${path}' is not supported ` + @@ -1821,6 +1870,9 @@ E('ERR_VALID_PERFORMANCE_ENTRY_TYPE', 'At least one valid performance entry type is required', Error); E('ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING', 'A dynamic import callback was not specified.', TypeError); +E('ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING_FLAG', + 'A dynamic import callback was invoked without --experimental-vm-modules', + TypeError); E('ERR_VM_MODULE_ALREADY_LINKED', 'Module has already been linked', Error); E('ERR_VM_MODULE_CANNOT_CREATE_CACHED_DATA', 'Cached data cannot be created for a module which has been evaluated', Error); diff --git a/lib/internal/event_target.js b/lib/internal/event_target.js index 0236f3a53c5276..4c67453fea4c59 100644 --- a/lib/internal/event_target.js +++ b/lib/internal/event_target.js @@ -2,6 +2,7 @@ const { ArrayFrom, + ArrayPrototypeReduce, Boolean, Error, FunctionPrototypeCall, @@ -314,11 +315,6 @@ class Event { throw new ERR_INVALID_THIS('Event'); this.#propagationStopped = true; } - - static NONE = 0; - static CAPTURING_PHASE = 1; - static AT_TARGET = 2; - static BUBBLING_PHASE = 3; } ObjectDefineProperties( @@ -354,6 +350,22 @@ ObjectDefineProperties( isTrusted: isTrustedDescriptor, }); +const staticProps = ['NONE', 'CAPTURING_PHASE', 'AT_TARGET', 'BUBBLING_PHASE']; + +ObjectDefineProperties( + Event, + ArrayPrototypeReduce(staticProps, (result, staticProp, index = 0) => { + result[staticProp] = { + __proto__: null, + writable: false, + configurable: false, + enumerable: true, + value: index, + }; + return result; + }, {}), +); + function isCustomEvent(value) { return isEvent(value) && (value?.[kDetail] !== undefined); } diff --git a/lib/internal/file.js b/lib/internal/file.js index 1fc08c45a90f33..e35eb7bf70931f 100644 --- a/lib/internal/file.js +++ b/lib/internal/file.js @@ -4,6 +4,7 @@ const { DateNow, NumberIsNaN, ObjectDefineProperties, + StringPrototypeToWellFormed, SymbolToStringTag, } = primordials; @@ -15,7 +16,6 @@ const { customInspectSymbol: kInspect, kEnumerableProperty, kEmptyObject, - toUSVString, } = require('internal/util'); const { @@ -55,7 +55,7 @@ class File extends Blob { lastModified = DateNow(); } - this.#name = toUSVString(fileName); + this.#name = StringPrototypeToWellFormed(`${fileName}`); this.#lastModified = lastModified; } diff --git a/lib/internal/freeze_intrinsics.js b/lib/internal/freeze_intrinsics.js index 2017b8f66e84c0..275d04f7f9891e 100644 --- a/lib/internal/freeze_intrinsics.js +++ b/lib/internal/freeze_intrinsics.js @@ -220,13 +220,6 @@ module.exports = function() { // Other APIs / Web Compatibility Console.prototype, - WebAssembly.Module.prototype, - WebAssembly.Instance.prototype, - WebAssembly.Table.prototype, - WebAssembly.Memory.prototype, - WebAssembly.CompileError.prototype, - WebAssembly.LinkError.prototype, - WebAssembly.RuntimeError.prototype, ]; const intrinsics = [ // 10.2.4.1 ThrowTypeError @@ -349,7 +342,6 @@ module.exports = function() { setInterval, setTimeout, console, - WebAssembly, ]; if (typeof SharedArrayBuffer !== 'undefined') { // 25.2 @@ -357,6 +349,19 @@ module.exports = function() { ArrayPrototypePush(intrinsics, SharedArrayBuffer); } + if (typeof WebAssembly !== 'undefined') { + ArrayPrototypePush(intrinsicPrototypes, + WebAssembly.Module.prototype, + WebAssembly.Instance.prototype, + WebAssembly.Table.prototype, + WebAssembly.Memory.prototype, + WebAssembly.CompileError.prototype, + WebAssembly.LinkError.prototype, + WebAssembly.RuntimeError.prototype, + ); + ArrayPrototypePush(intrinsics, WebAssembly); + } + if (typeof Intl !== 'undefined') { ArrayPrototypePush(intrinsicPrototypes, Intl.Collator.prototype, diff --git a/lib/internal/fs/cp/cp-sync.js b/lib/internal/fs/cp/cp-sync.js index 348d45adcd7c4e..fe342f2dda19ec 100644 --- a/lib/internal/fs/cp/cp-sync.js +++ b/lib/internal/fs/cp/cp-sync.js @@ -116,17 +116,9 @@ function checkPathsSync(src, dest, opts) { } function getStatsSync(src, dest, opts) { - let destStat; - const statFunc = opts.dereference ? - (file) => statSync(file, { bigint: true }) : - (file) => lstatSync(file, { bigint: true }); - const srcStat = statFunc(src); - try { - destStat = statFunc(dest); - } catch (err) { - if (err.code === 'ENOENT') return { srcStat, destStat: null }; - throw err; - } + const statFunc = opts.dereference ? statSync : lstatSync; + const srcStat = statFunc(src, { bigint: true, throwIfNoEntry: true }); + const destStat = statFunc(dest, { bigint: true, throwIfNoEntry: false }); return { srcStat, destStat }; } @@ -134,13 +126,12 @@ function checkParentPathsSync(src, srcStat, dest) { const srcParent = resolve(dirname(src)); const destParent = resolve(dirname(dest)); if (destParent === srcParent || destParent === parse(destParent).root) return; - let destStat; - try { - destStat = statSync(destParent, { bigint: true }); - } catch (err) { - if (err.code === 'ENOENT') return; - throw err; + const destStat = statSync(destParent, { bigint: true, throwIfNoEntry: false }); + + if (destStat === undefined) { + return; } + if (areIdentical(srcStat, destStat)) { throw new ERR_FS_CP_EINVAL({ message: `cannot copy ${src} to a subdirectory of self ${dest}`, diff --git a/lib/internal/fs/dir.js b/lib/internal/fs/dir.js index 1118ff5f674915..7a7220815dc374 100644 --- a/lib/internal/fs/dir.js +++ b/lib/internal/fs/dir.js @@ -6,7 +6,6 @@ const { FunctionPrototypeBind, ObjectDefineProperty, PromiseReject, - Symbol, SymbolAsyncIterator, } = primordials; @@ -34,74 +33,68 @@ const { validateUint32, } = require('internal/validators'); -const kDirHandle = Symbol('kDirHandle'); -const kDirPath = Symbol('kDirPath'); -const kDirBufferedEntries = Symbol('kDirBufferedEntries'); -const kDirClosed = Symbol('kDirClosed'); -const kDirOptions = Symbol('kDirOptions'); -const kDirReadImpl = Symbol('kDirReadImpl'); -const kDirReadPromisified = Symbol('kDirReadPromisified'); -const kDirClosePromisified = Symbol('kDirClosePromisified'); -const kDirOperationQueue = Symbol('kDirOperationQueue'); - class Dir { + #handle; + #path; + #bufferedEntries = []; + #closed = false; + #options; + #readPromisified; + #closePromisified; + // Either `null` or an Array of pending operations (= functions to be called + // once the current operation is done). + #operationQueue = null; + constructor(handle, path, options) { if (handle == null) throw new ERR_MISSING_ARGS('handle'); - this[kDirHandle] = handle; - this[kDirBufferedEntries] = []; - this[kDirPath] = path; - this[kDirClosed] = false; - - // Either `null` or an Array of pending operations (= functions to be called - // once the current operation is done). - this[kDirOperationQueue] = null; - - this[kDirOptions] = { + this.#handle = handle; + this.#path = path; + this.#options = { bufferSize: 32, ...getOptions(options, { encoding: 'utf8', }), }; - validateUint32(this[kDirOptions].bufferSize, 'options.bufferSize', true); + validateUint32(this.#options.bufferSize, 'options.bufferSize', true); - this[kDirReadPromisified] = FunctionPrototypeBind( - internalUtil.promisify(this[kDirReadImpl]), this, false); - this[kDirClosePromisified] = FunctionPrototypeBind( + this.#readPromisified = FunctionPrototypeBind( + internalUtil.promisify(this.#readImpl), this, false); + this.#closePromisified = FunctionPrototypeBind( internalUtil.promisify(this.close), this); } get path() { - return this[kDirPath]; + return this.#path; } read(callback) { - return this[kDirReadImpl](true, callback); + return this.#readImpl(true, callback); } - [kDirReadImpl](maybeSync, callback) { - if (this[kDirClosed] === true) { + #readImpl(maybeSync, callback) { + if (this.#closed === true) { throw new ERR_DIR_CLOSED(); } if (callback === undefined) { - return this[kDirReadPromisified](); + return this.#readPromisified(); } validateFunction(callback, 'callback'); - if (this[kDirOperationQueue] !== null) { - ArrayPrototypePush(this[kDirOperationQueue], () => { - this[kDirReadImpl](maybeSync, callback); + if (this.#operationQueue !== null) { + ArrayPrototypePush(this.#operationQueue, () => { + this.#readImpl(maybeSync, callback); }); return; } - if (this[kDirBufferedEntries].length > 0) { + if (this.#bufferedEntries.length > 0) { try { - const dirent = ArrayPrototypeShift(this[kDirBufferedEntries]); + const dirent = ArrayPrototypeShift(this.#bufferedEntries); - if (this[kDirOptions].recursive && dirent.isDirectory()) { + if (this.#options.recursive && dirent.isDirectory()) { this.readSyncRecursive(dirent); } @@ -118,8 +111,8 @@ class Dir { const req = new FSReqCallback(); req.oncomplete = (err, result) => { process.nextTick(() => { - const queue = this[kDirOperationQueue]; - this[kDirOperationQueue] = null; + const queue = this.#operationQueue; + this.#operationQueue = null; for (const op of queue) op(); }); @@ -128,9 +121,9 @@ class Dir { } try { - this.processReadResult(this[kDirPath], result); - const dirent = ArrayPrototypeShift(this[kDirBufferedEntries]); - if (this[kDirOptions].recursive && dirent.isDirectory()) { + this.processReadResult(this.#path, result); + const dirent = ArrayPrototypeShift(this.#bufferedEntries); + if (this.#options.recursive && dirent.isDirectory()) { this.readSyncRecursive(dirent); } callback(null, dirent); @@ -139,10 +132,10 @@ class Dir { } }; - this[kDirOperationQueue] = []; - this[kDirHandle].read( - this[kDirOptions].encoding, - this[kDirOptions].bufferSize, + this.#operationQueue = []; + this.#handle.read( + this.#options.encoding, + this.#options.bufferSize, req, ); } @@ -150,7 +143,7 @@ class Dir { processReadResult(path, result) { for (let i = 0; i < result.length; i += 2) { ArrayPrototypePush( - this[kDirBufferedEntries], + this.#bufferedEntries, getDirent( path, result[i], @@ -161,18 +154,18 @@ class Dir { } readSyncRecursive(dirent) { - const path = pathModule.join(dirent.path, dirent.name); + const path = pathModule.join(dirent.parentPath, dirent.name); const ctx = { path }; const handle = dirBinding.opendir( pathModule.toNamespacedPath(path), - this[kDirOptions].encoding, + this.#options.encoding, undefined, ctx, ); handleErrorFromBinding(ctx); const result = handle.read( - this[kDirOptions].encoding, - this[kDirOptions].bufferSize, + this.#options.encoding, + this.#options.bufferSize, undefined, ctx, ); @@ -186,26 +179,26 @@ class Dir { } readSync() { - if (this[kDirClosed] === true) { + if (this.#closed === true) { throw new ERR_DIR_CLOSED(); } - if (this[kDirOperationQueue] !== null) { + if (this.#operationQueue !== null) { throw new ERR_DIR_CONCURRENT_OPERATION(); } - if (this[kDirBufferedEntries].length > 0) { - const dirent = ArrayPrototypeShift(this[kDirBufferedEntries]); - if (this[kDirOptions].recursive && dirent.isDirectory()) { + if (this.#bufferedEntries.length > 0) { + const dirent = ArrayPrototypeShift(this.#bufferedEntries); + if (this.#options.recursive && dirent.isDirectory()) { this.readSyncRecursive(dirent); } return dirent; } - const ctx = { path: this[kDirPath] }; - const result = this[kDirHandle].read( - this[kDirOptions].encoding, - this[kDirOptions].bufferSize, + const ctx = { path: this.#path }; + const result = this.#handle.read( + this.#options.encoding, + this.#options.bufferSize, undefined, ctx, ); @@ -215,10 +208,10 @@ class Dir { return result; } - this.processReadResult(this[kDirPath], result); + this.processReadResult(this.#path, result); - const dirent = ArrayPrototypeShift(this[kDirBufferedEntries]); - if (this[kDirOptions].recursive && dirent.isDirectory()) { + const dirent = ArrayPrototypeShift(this.#bufferedEntries); + if (this.#options.recursive && dirent.isDirectory()) { this.readSyncRecursive(dirent); } return dirent; @@ -227,45 +220,45 @@ class Dir { close(callback) { // Promise if (callback === undefined) { - if (this[kDirClosed] === true) { + if (this.#closed === true) { return PromiseReject(new ERR_DIR_CLOSED()); } - return this[kDirClosePromisified](); + return this.#closePromisified(); } // callback validateFunction(callback, 'callback'); - if (this[kDirClosed] === true) { + if (this.#closed === true) { process.nextTick(callback, new ERR_DIR_CLOSED()); return; } - if (this[kDirOperationQueue] !== null) { - ArrayPrototypePush(this[kDirOperationQueue], () => { + if (this.#operationQueue !== null) { + ArrayPrototypePush(this.#operationQueue, () => { this.close(callback); }); return; } - this[kDirClosed] = true; + this.#closed = true; const req = new FSReqCallback(); req.oncomplete = callback; - this[kDirHandle].close(req); + this.#handle.close(req); } closeSync() { - if (this[kDirClosed] === true) { + if (this.#closed === true) { throw new ERR_DIR_CLOSED(); } - if (this[kDirOperationQueue] !== null) { + if (this.#operationQueue !== null) { throw new ERR_DIR_CONCURRENT_OPERATION(); } - this[kDirClosed] = true; - const ctx = { path: this[kDirPath] }; - const result = this[kDirHandle].close(undefined, ctx); + this.#closed = true; + const ctx = { path: this.#path }; + const result = this.#handle.close(undefined, ctx); handleErrorFromBinding(ctx); return result; } @@ -273,14 +266,14 @@ class Dir { async* entries() { try { while (true) { - const result = await this[kDirReadPromisified](); + const result = await this.#readPromisified(); if (result === null) { break; } yield result; } } finally { - await this[kDirClosePromisified](); + await this.#closePromisified(); } } } diff --git a/lib/internal/fs/glob.js b/lib/internal/fs/glob.js index 323ef2a25d434c..4c62369048ce74 100644 --- a/lib/internal/fs/glob.js +++ b/lib/internal/fs/glob.js @@ -148,7 +148,7 @@ class Glob { #root; #exclude; #cache = new Cache(); - #results = []; + #results = new SafeSet(); #queue = []; #subpatterns = new SafeMap(); constructor(patterns, options = kEmptyObject) { @@ -193,7 +193,7 @@ class Glob { .forEach((patterns, path) => ArrayPrototypePush(this.#queue, { __proto__: null, path, patterns })); this.#subpatterns.clear(); } - return this.#results; + return ArrayFrom(this.#results); } #addSubpattern(path, pattern) { if (!this.#subpatterns.has(path)) { @@ -240,7 +240,7 @@ class Glob { const p = pattern.at(-1); const stat = this.#cache.statSync(join(fullpath, p)); if (stat && (p || isDirectory)) { - ArrayPrototypePush(this.#results, join(path, p)); + this.#results.add(join(path, p)); } if (pattern.indexes.size === 1 && pattern.indexes.has(last)) { return; @@ -249,7 +249,7 @@ class Glob { (path !== '.' || pattern.at(0) === '.' || (last === 0 && stat))) { // If pattern ends with **, add to results // if path is ".", add it only if pattern starts with "." or pattern is exactly "**" - ArrayPrototypePush(this.#results, path); + this.#results.add(path); } if (!isDirectory) { @@ -296,7 +296,7 @@ class Glob { subPatterns.add(index); } else if (!fromSymlink && index === last) { // If ** is last, add to results - ArrayPrototypePush(this.#results, entryPath); + this.#results.add(entryPath); } // Any pattern after ** is also a potential pattern @@ -304,7 +304,7 @@ class Glob { const nextMatches = pattern.test(nextIndex, entry.name); if (nextMatches && nextIndex === last && !isLast) { // If next pattern is the last one, add to results - ArrayPrototypePush(this.#results, entryPath); + this.#results.add(entryPath); } else if (nextMatches && entry.isDirectory()) { // Pattern mached, meaning two patterns forward // are also potential patterns @@ -337,11 +337,11 @@ class Glob { } else { if (!this.#cache.seen(path, pattern, nextIndex)) { this.#cache.add(path, pattern.child(new SafeSet([nextIndex]))); - ArrayPrototypePush(this.#results, path); + this.#results.add(path); } if (!this.#cache.seen(path, pattern, nextIndex) || !this.#cache.seen(parent, pattern, nextIndex)) { this.#cache.add(parent, pattern.child(new SafeSet([nextIndex]))); - ArrayPrototypePush(this.#results, parent); + this.#results.add(parent); } } } @@ -354,7 +354,7 @@ class Glob { } else if (current === '.' && pattern.test(nextIndex, entry.name)) { // If current pattern is ".", proceed to test next pattern if (nextIndex === last) { - ArrayPrototypePush(this.#results, entryPath); + this.#results.add(entryPath); } else { subPatterns.add(nextIndex + 1); } @@ -364,7 +364,7 @@ class Glob { // If current pattern is a regex that matches entry name (e.g *.js) // add next pattern to potential patterns, or to results if it's the last pattern if (index === last) { - ArrayPrototypePush(this.#results, entryPath); + this.#results.add(entryPath); } else if (entry.isDirectory()) { subPatterns.add(nextIndex); } diff --git a/lib/internal/fs/promises.js b/lib/internal/fs/promises.js index f58dfae182811b..42364c78c667cb 100644 --- a/lib/internal/fs/promises.js +++ b/lib/internal/fs/promises.js @@ -4,6 +4,7 @@ const { ArrayPrototypePush, ArrayPrototypePop, Error, + ErrorCaptureStackTrace, MathMax, MathMin, Promise, @@ -32,6 +33,7 @@ const { Buffer } = require('buffer'); const { codes: { + ERR_ACCESS_DENIED, ERR_FS_FILE_TOO_LARGE, ERR_INVALID_ARG_VALUE, ERR_INVALID_STATE, @@ -85,6 +87,8 @@ const { kValidateObjectAllowNullable, } = require('internal/validators'); const pathModule = require('path'); +const { isAbsolute } = pathModule; +const { toPathIfFileURL } = require('internal/url'); const { kEmptyObject, lazyDOMException, @@ -97,6 +101,8 @@ const nonNativeWatcher = require('internal/fs/recursive_watch'); const { isIterable } = require('internal/streams/utils'); const assert = require('internal/assert'); +const permission = require('internal/process/permission'); + const kHandle = Symbol('kHandle'); const kFd = Symbol('kFd'); const kRefs = Symbol('kRefs'); @@ -130,6 +136,15 @@ function lazyFsStreams() { return fsStreams ??= require('internal/fs/streams'); } +// By the time the C++ land creates an error for a promise rejection (likely from a +// libuv callback), there is already no JS frames on the stack. So we need to +// wait until V8 resumes execution back to JS land before we have enough information +// to re-capture the stack trace. +function handleErrorFromBinding(error) { + ErrorCaptureStackTrace(error, handleErrorFromBinding); + return PromiseReject(error); +} + class FileHandle extends EventEmitter { /** * @param {InternalFSBinding.FileHandle | undefined} filehandle @@ -494,7 +509,11 @@ async function readFileHandle(filehandle, options) { checkAborted(signal); - const statFields = await binding.fstat(filehandle.fd, false, kUsePromises); + const statFields = await PromisePrototypeThen( + binding.fstat(filehandle.fd, false, kUsePromises), + undefined, + handleErrorFromBinding, + ); checkAborted(signal); @@ -525,8 +544,11 @@ async function readFileHandle(filehandle, options) { length = MathMin(size - totalRead, kReadFileBufferLength); } - const bytesRead = (await binding.read(filehandle.fd, buffer, offset, - length, -1, kUsePromises)) ?? 0; + const bytesRead = (await PromisePrototypeThen( + binding.read(filehandle.fd, buffer, offset, length, -1, kUsePromises), + undefined, + handleErrorFromBinding, + )) ?? 0; totalRead += bytesRead; if (bytesRead === 0 || @@ -574,8 +596,11 @@ async function access(path, mode = F_OK) { path = getValidatedPath(path); mode = getValidMode(mode, 'access'); - return binding.access(pathModule.toNamespacedPath(path), mode, - kUsePromises); + return await PromisePrototypeThen( + binding.access(pathModule.toNamespacedPath(path), mode, kUsePromises), + undefined, + handleErrorFromBinding, + ); } async function cp(src, dest, options) { @@ -589,10 +614,14 @@ async function copyFile(src, dest, mode) { src = getValidatedPath(src, 'src'); dest = getValidatedPath(dest, 'dest'); mode = getValidMode(mode, 'copyFile'); - return binding.copyFile(pathModule.toNamespacedPath(src), - pathModule.toNamespacedPath(dest), - mode, - kUsePromises); + return await PromisePrototypeThen( + binding.copyFile(pathModule.toNamespacedPath(src), + pathModule.toNamespacedPath(dest), + mode, + kUsePromises), + undefined, + handleErrorFromBinding, + ); } // Note that unlike fs.open() which uses numeric file descriptors, @@ -601,9 +630,12 @@ async function open(path, flags, mode) { path = getValidatedPath(path); const flagsNumber = stringToFlags(flags); mode = parseFileMode(mode, 'mode', 0o666); - return new FileHandle( - await binding.openFileHandle(pathModule.toNamespacedPath(path), - flagsNumber, mode, kUsePromises)); + return new FileHandle(await PromisePrototypeThen( + binding.openFileHandle(pathModule.toNamespacedPath(path), + flagsNumber, mode, kUsePromises), + undefined, + handleErrorFromBinding, + )); } async function read(handle, bufferOrParams, offset, length, position) { @@ -638,7 +670,7 @@ async function read(handle, bufferOrParams, offset, length, position) { validateInteger(offset, 'offset', 0); } - length |= 0; + length ??= buffer.byteLength - offset; if (length === 0) return { __proto__: null, bytesRead: length, buffer }; @@ -656,8 +688,11 @@ async function read(handle, bufferOrParams, offset, length, position) { validatePosition(position, 'position', length); } - const bytesRead = (await binding.read(handle.fd, buffer, offset, length, - position, kUsePromises)) || 0; + const bytesRead = (await PromisePrototypeThen( + binding.read(handle.fd, buffer, offset, length, position, kUsePromises), + undefined, + handleErrorFromBinding, + )) || 0; return { __proto__: null, bytesRead, buffer }; } @@ -668,8 +703,11 @@ async function readv(handle, buffers, position) { if (typeof position !== 'number') position = null; - const bytesRead = (await binding.readBuffers(handle.fd, buffers, position, - kUsePromises)) || 0; + const bytesRead = (await PromisePrototypeThen( + binding.readBuffers(handle.fd, buffers, position, kUsePromises), + undefined, + handleErrorFromBinding, + )) || 0; return { __proto__: null, bytesRead, buffers }; } @@ -698,15 +736,22 @@ async function write(handle, buffer, offsetOrOptions, length, position) { position = null; validateOffsetLengthWrite(offset, length, buffer.byteLength); const bytesWritten = - (await binding.writeBuffer(handle.fd, buffer, offset, - length, position, kUsePromises)) || 0; + (await PromisePrototypeThen( + binding.writeBuffer(handle.fd, buffer, offset, + length, position, kUsePromises), + undefined, + handleErrorFromBinding, + )) || 0; return { __proto__: null, bytesWritten, buffer }; } validateStringAfterArrayBufferView(buffer, 'buffer'); validateEncoding(buffer, length); - const bytesWritten = (await binding.writeString(handle.fd, buffer, offset, - length, kUsePromises)) || 0; + const bytesWritten = (await PromisePrototypeThen( + binding.writeString(handle.fd, buffer, offset, length, kUsePromises), + undefined, + handleErrorFromBinding, + )) || 0; return { __proto__: null, bytesWritten, buffer }; } @@ -720,17 +765,24 @@ async function writev(handle, buffers, position) { return { __proto__: null, bytesWritten: 0, buffers }; } - const bytesWritten = (await binding.writeBuffers(handle.fd, buffers, position, - kUsePromises)) || 0; + const bytesWritten = (await PromisePrototypeThen( + binding.writeBuffers(handle.fd, buffers, position, kUsePromises), + undefined, + handleErrorFromBinding, + )) || 0; return { __proto__: null, bytesWritten, buffers }; } async function rename(oldPath, newPath) { oldPath = getValidatedPath(oldPath, 'oldPath'); newPath = getValidatedPath(newPath, 'newPath'); - return binding.rename(pathModule.toNamespacedPath(oldPath), - pathModule.toNamespacedPath(newPath), - kUsePromises); + return await PromisePrototypeThen( + binding.rename(pathModule.toNamespacedPath(oldPath), + pathModule.toNamespacedPath(newPath), + kUsePromises), + undefined, + handleErrorFromBinding, + ); } async function truncate(path, len = 0) { @@ -741,7 +793,11 @@ async function truncate(path, len = 0) { async function ftruncate(handle, len = 0) { validateInteger(len, 'len'); len = MathMax(0, len); - return binding.ftruncate(handle.fd, len, kUsePromises); + return await PromisePrototypeThen( + binding.ftruncate(handle.fd, len, kUsePromises), + undefined, + handleErrorFromBinding, + ); } async function rm(path, options) { @@ -762,15 +818,27 @@ async function rmdir(path, options) { } } - return binding.rmdir(path, kUsePromises); + return await PromisePrototypeThen( + binding.rmdir(path, kUsePromises), + undefined, + handleErrorFromBinding, + ); } async function fdatasync(handle) { - return binding.fdatasync(handle.fd, kUsePromises); + return await PromisePrototypeThen( + binding.fdatasync(handle.fd, kUsePromises), + undefined, + handleErrorFromBinding, + ); } async function fsync(handle) { - return binding.fsync(handle.fd, kUsePromises); + return await PromisePrototypeThen( + binding.fsync(handle.fd, kUsePromises), + undefined, + handleErrorFromBinding, + ); } async function mkdir(path, options) { @@ -784,9 +852,13 @@ async function mkdir(path, options) { path = getValidatedPath(path); validateBoolean(recursive, 'options.recursive'); - return binding.mkdir(pathModule.toNamespacedPath(path), - parseFileMode(mode, 'mode', 0o777), recursive, - kUsePromises); + return await PromisePrototypeThen( + binding.mkdir(pathModule.toNamespacedPath(path), + parseFileMode(mode, 'mode', 0o777), recursive, + kUsePromises), + undefined, + handleErrorFromBinding, + ); } async function readdirRecursive(originalPath, options) { @@ -794,11 +866,15 @@ async function readdirRecursive(originalPath, options) { const queue = [ [ originalPath, - await binding.readdir( - pathModule.toNamespacedPath(originalPath), - options.encoding, - !!options.withFileTypes, - kUsePromises, + await PromisePrototypeThen( + binding.readdir( + pathModule.toNamespacedPath(originalPath), + options.encoding, + !!options.withFileTypes, + kUsePromises, + ), + undefined, + handleErrorFromBinding, ), ], ]; @@ -814,11 +890,15 @@ async function readdirRecursive(originalPath, options) { const direntPath = pathModule.join(path, dirent.name); ArrayPrototypePush(queue, [ direntPath, - await binding.readdir( - direntPath, - options.encoding, - true, - kUsePromises, + await PromisePrototypeThen( + binding.readdir( + direntPath, + options.encoding, + true, + kUsePromises, + ), + undefined, + handleErrorFromBinding, ), ]); } @@ -837,11 +917,15 @@ async function readdirRecursive(originalPath, options) { if (stat === 1) { ArrayPrototypePush(queue, [ direntPath, - await binding.readdir( - pathModule.toNamespacedPath(direntPath), - options.encoding, - false, - kUsePromises, + await PromisePrototypeThen( + binding.readdir( + pathModule.toNamespacedPath(direntPath), + options.encoding, + false, + kUsePromises, + ), + undefined, + handleErrorFromBinding, ), ]); } @@ -858,11 +942,15 @@ async function readdir(path, options) { if (options.recursive) { return readdirRecursive(path, options); } - const result = await binding.readdir( - pathModule.toNamespacedPath(path), - options.encoding, - !!options.withFileTypes, - kUsePromises, + const result = await PromisePrototypeThen( + binding.readdir( + pathModule.toNamespacedPath(path), + options.encoding, + !!options.withFileTypes, + kUsePromises, + ), + undefined, + handleErrorFromBinding, ); return options.withFileTypes ? getDirectoryEntriesPromise(path, result) : @@ -872,8 +960,12 @@ async function readdir(path, options) { async function readlink(path, options) { options = getOptions(options); path = getValidatedPath(path, 'oldPath'); - return binding.readlink(pathModule.toNamespacedPath(path), - options.encoding, kUsePromises); + return await PromisePrototypeThen( + binding.readlink(pathModule.toNamespacedPath(path), + options.encoding, kUsePromises), + undefined, + handleErrorFromBinding, + ); } async function symlink(target, path, type_) { @@ -887,62 +979,107 @@ async function symlink(target, path, type_) { type = 'file'; } } + + if (permission.isEnabled()) { + // The permission model's security guarantees fall apart in the presence of + // relative symbolic links. Thus, we have to prevent their creation. + if (typeof target !== 'string' || !isAbsolute(toPathIfFileURL(target))) { + throw new ERR_ACCESS_DENIED('relative symbolic link target'); + } + } + target = getValidatedPath(target, 'target'); path = getValidatedPath(path); - return binding.symlink(preprocessSymlinkDestination(target, type, path), - pathModule.toNamespacedPath(path), - stringToSymlinkType(type), - kUsePromises); + return await PromisePrototypeThen( + binding.symlink(preprocessSymlinkDestination(target, type, path), + pathModule.toNamespacedPath(path), + stringToSymlinkType(type), + kUsePromises), + undefined, + handleErrorFromBinding, + ); } async function fstat(handle, options = { bigint: false }) { - const result = await binding.fstat(handle.fd, options.bigint, kUsePromises); + const result = await PromisePrototypeThen( + binding.fstat(handle.fd, options.bigint, kUsePromises), + undefined, + handleErrorFromBinding, + ); return getStatsFromBinding(result); } async function lstat(path, options = { bigint: false }) { path = getValidatedPath(path); - const result = await binding.lstat(pathModule.toNamespacedPath(path), - options.bigint, kUsePromises); + const result = await PromisePrototypeThen( + binding.lstat(pathModule.toNamespacedPath(path), + options.bigint, kUsePromises), + undefined, + handleErrorFromBinding, + ); return getStatsFromBinding(result); } async function stat(path, options = { bigint: false }) { path = getValidatedPath(path); - const result = await binding.stat(pathModule.toNamespacedPath(path), - options.bigint, kUsePromises); + const result = await PromisePrototypeThen( + binding.stat(pathModule.toNamespacedPath(path), + options.bigint, kUsePromises), + undefined, + handleErrorFromBinding, + ); return getStatsFromBinding(result); } async function statfs(path, options = { bigint: false }) { path = getValidatedPath(path); - const result = await binding.statfs(pathModule.toNamespacedPath(path), - options.bigint, kUsePromises); + const result = await PromisePrototypeThen( + binding.statfs(pathModule.toNamespacedPath(path), + options.bigint, kUsePromises), + undefined, + handleErrorFromBinding, + ); return getStatFsFromBinding(result); } async function link(existingPath, newPath) { existingPath = getValidatedPath(existingPath, 'existingPath'); newPath = getValidatedPath(newPath, 'newPath'); - return binding.link(pathModule.toNamespacedPath(existingPath), - pathModule.toNamespacedPath(newPath), - kUsePromises); + return await PromisePrototypeThen( + binding.link(pathModule.toNamespacedPath(existingPath), + pathModule.toNamespacedPath(newPath), + kUsePromises), + undefined, + handleErrorFromBinding, + ); } async function unlink(path) { path = getValidatedPath(path); - return binding.unlink(pathModule.toNamespacedPath(path), kUsePromises); + return await PromisePrototypeThen( + binding.unlink(pathModule.toNamespacedPath(path), kUsePromises), + undefined, + handleErrorFromBinding, + ); } async function fchmod(handle, mode) { mode = parseFileMode(mode, 'mode'); - return binding.fchmod(handle.fd, mode, kUsePromises); + return await PromisePrototypeThen( + binding.fchmod(handle.fd, mode, kUsePromises), + undefined, + handleErrorFromBinding, + ); } async function chmod(path, mode) { path = getValidatedPath(path); mode = parseFileMode(mode, 'mode'); - return binding.chmod(pathModule.toNamespacedPath(path), mode, kUsePromises); + return await PromisePrototypeThen( + binding.chmod(pathModule.toNamespacedPath(path), mode, kUsePromises), + undefined, + handleErrorFromBinding, + ); } async function lchmod(path, mode) { @@ -957,50 +1094,76 @@ async function lchown(path, uid, gid) { path = getValidatedPath(path); validateInteger(uid, 'uid', -1, kMaxUserId); validateInteger(gid, 'gid', -1, kMaxUserId); - return binding.lchown(pathModule.toNamespacedPath(path), - uid, gid, kUsePromises); + return await PromisePrototypeThen( + binding.lchown(pathModule.toNamespacedPath(path), uid, gid, kUsePromises), + undefined, + handleErrorFromBinding, + ); } async function fchown(handle, uid, gid) { validateInteger(uid, 'uid', -1, kMaxUserId); validateInteger(gid, 'gid', -1, kMaxUserId); - return binding.fchown(handle.fd, uid, gid, kUsePromises); + return await PromisePrototypeThen( + binding.fchown(handle.fd, uid, gid, kUsePromises), + undefined, + handleErrorFromBinding, + ); } async function chown(path, uid, gid) { path = getValidatedPath(path); validateInteger(uid, 'uid', -1, kMaxUserId); validateInteger(gid, 'gid', -1, kMaxUserId); - return binding.chown(pathModule.toNamespacedPath(path), - uid, gid, kUsePromises); + return await PromisePrototypeThen( + binding.chown(pathModule.toNamespacedPath(path), uid, gid, kUsePromises), + undefined, + handleErrorFromBinding, + ); } async function utimes(path, atime, mtime) { path = getValidatedPath(path); - return binding.utimes(pathModule.toNamespacedPath(path), - toUnixTimestamp(atime), - toUnixTimestamp(mtime), - kUsePromises); + return await PromisePrototypeThen( + binding.utimes(pathModule.toNamespacedPath(path), + toUnixTimestamp(atime), + toUnixTimestamp(mtime), + kUsePromises), + undefined, + handleErrorFromBinding, + ); } async function futimes(handle, atime, mtime) { atime = toUnixTimestamp(atime, 'atime'); mtime = toUnixTimestamp(mtime, 'mtime'); - return binding.futimes(handle.fd, atime, mtime, kUsePromises); + return await PromisePrototypeThen( + binding.futimes(handle.fd, atime, mtime, kUsePromises), + undefined, + handleErrorFromBinding, + ); } async function lutimes(path, atime, mtime) { path = getValidatedPath(path); - return binding.lutimes(pathModule.toNamespacedPath(path), - toUnixTimestamp(atime), - toUnixTimestamp(mtime), - kUsePromises); + return await PromisePrototypeThen( + binding.lutimes(pathModule.toNamespacedPath(path), + toUnixTimestamp(atime), + toUnixTimestamp(mtime), + kUsePromises), + undefined, + handleErrorFromBinding, + ); } async function realpath(path, options) { options = getOptions(options); path = getValidatedPath(path); - return binding.realpath(path, options.encoding, kUsePromises); + return await PromisePrototypeThen( + binding.realpath(pathModule.toNamespacedPath(path), options.encoding, kUsePromises), + undefined, + handleErrorFromBinding, + ); } async function mkdtemp(prefix, options) { @@ -1016,7 +1179,11 @@ async function mkdtemp(prefix, options) { path = Buffer.concat([prefix, Buffer.from('XXXXXX')]); } - return binding.mkdtemp(path, options.encoding, kUsePromises); + return await PromisePrototypeThen( + binding.mkdtemp(path, options.encoding, kUsePromises), + undefined, + handleErrorFromBinding, + ); } async function writeFile(path, data, options) { diff --git a/lib/internal/fs/utils.js b/lib/internal/fs/utils.js index 611b6c242047b9..eb50aca3fc1226 100644 --- a/lib/internal/fs/utils.js +++ b/lib/internal/fs/utils.js @@ -12,6 +12,8 @@ const { NumberIsFinite, MathMin, MathRound, + ObjectDefineProperties, + ObjectDefineProperty, ObjectIs, ObjectSetPrototypeOf, ReflectApply, @@ -38,7 +40,7 @@ const { ERR_OUT_OF_RANGE, }, hideStackFrames, - uvException, + UVException, } = require('internal/errors'); const { isArrayBufferView, @@ -165,6 +167,7 @@ function assertEncoding(encoding) { class Dirent { constructor(name, type, path) { this.name = name; + this.parentPath = path; this.path = path; this[kType] = type; } @@ -348,7 +351,7 @@ function getOptions(options, defaultOptions = kEmptyObject) { */ function handleErrorFromBinding(ctx) { if (ctx.errno !== undefined) { // libuv error numbers - const err = uvException(ctx); + const err = new UVException(ctx); ErrorCaptureStackTrace(err, handleErrorFromBinding); throw err; } @@ -361,30 +364,6 @@ function handleErrorFromBinding(ctx) { } } -// Check if the path contains null types if it is a string nor Uint8Array, -// otherwise return silently. -const nullCheck = hideStackFrames((path, propName, throwError = true) => { - const pathIsString = typeof path === 'string'; - const pathIsUint8Array = isUint8Array(path); - - // We can only perform meaningful checks on strings and Uint8Arrays. - if ((!pathIsString && !pathIsUint8Array) || - (pathIsString && !StringPrototypeIncludes(path, '\u0000')) || - (pathIsUint8Array && !TypedArrayPrototypeIncludes(path, 0))) { - return; - } - - const err = new ERR_INVALID_ARG_VALUE( - propName, - path, - 'must be a string, Uint8Array, or URL without null bytes', - ); - if (throwError) { - throw err; - } - return err; -}); - function preprocessSymlinkDestination(path, type, linkPath) { if (!isWindows) { // No preprocessing is needed on Unix. @@ -472,6 +451,62 @@ function dateFromMs(ms) { return new Date(MathRound(Number(ms))); } +const lazyDateFields = { + __proto__: null, + atime: { + __proto__: null, + enumerable: true, + configurable: true, + get() { + const value = dateFromMs(this.atimeMs); + ObjectDefineProperty(this, 'atime', { __proto__: null, value }); + return this.atime; + }, + set(value) { + this.atime = value; + }, + }, + mtime: { + __proto__: null, + enumerable: true, + configurable: true, + get() { + const value = dateFromMs(this.mtimeMs); + ObjectDefineProperty(this, 'mtime', { __proto__: null, value }); + return this.mtime; + }, + set(value) { + this.mtime = value; + }, + }, + ctime: { + __proto__: null, + enumerable: true, + configurable: true, + get() { + const value = dateFromMs(this.ctimeMs); + ObjectDefineProperty(this, 'ctime', { __proto__: null, value }); + return this.ctime; + }, + set(value) { + this.ctime = value; + }, + }, + birthtime: { + __proto__: null, + enumerable: true, + configurable: true, + get() { + const value = dateFromMs(this.birthtimeMs); + ObjectDefineProperty(this, 'birthtime', { __proto__: null, value }); + return this.birthtime; + }, + set(value) { + this.birthtime = value; + }, + }, +}; + function BigIntStats(dev, mode, nlink, uid, gid, rdev, blksize, ino, size, blocks, atimeNs, mtimeNs, ctimeNs, birthtimeNs) { @@ -486,14 +521,11 @@ function BigIntStats(dev, mode, nlink, uid, gid, rdev, blksize, this.mtimeNs = mtimeNs; this.ctimeNs = ctimeNs; this.birthtimeNs = birthtimeNs; - this.atime = dateFromMs(this.atimeMs); - this.mtime = dateFromMs(this.mtimeMs); - this.ctime = dateFromMs(this.ctimeMs); - this.birthtime = dateFromMs(this.birthtimeMs); } ObjectSetPrototypeOf(BigIntStats.prototype, StatsBase.prototype); ObjectSetPrototypeOf(BigIntStats, StatsBase); +ObjectDefineProperties(BigIntStats.prototype, lazyDateFields); BigIntStats.prototype._checkModeProperty = function(property) { if (isWindows && (property === S_IFIFO || property === S_IFBLK || @@ -512,14 +544,11 @@ function Stats(dev, mode, nlink, uid, gid, rdev, blksize, this.mtimeMs = mtimeMs; this.ctimeMs = ctimeMs; this.birthtimeMs = birthtimeMs; - this.atime = dateFromMs(atimeMs); - this.mtime = dateFromMs(mtimeMs); - this.ctime = dateFromMs(ctimeMs); - this.birthtime = dateFromMs(birthtimeMs); } ObjectSetPrototypeOf(Stats.prototype, StatsBase.prototype); ObjectSetPrototypeOf(Stats, StatsBase); +ObjectDefineProperties(Stats.prototype, lazyDateFields); // HACK: Workaround for https://github.com/standard-things/esm/issues/821. // TODO(ronag): Remove this as soon as `esm` publishes a fixed version. @@ -664,14 +693,14 @@ function toUnixTimestamp(time, name = 'time') { const validateOffsetLengthRead = hideStackFrames( (offset, length, bufferLength) => { if (offset < 0) { - throw new ERR_OUT_OF_RANGE('offset', '>= 0', offset); + throw new ERR_OUT_OF_RANGE.HideStackFramesError('offset', '>= 0', offset); } if (length < 0) { - throw new ERR_OUT_OF_RANGE('length', '>= 0', length); + throw new ERR_OUT_OF_RANGE.HideStackFramesError('length', '>= 0', length); } if (offset + length > bufferLength) { - throw new ERR_OUT_OF_RANGE('length', - `<= ${bufferLength - offset}`, length); + throw new ERR_OUT_OF_RANGE.HideStackFramesError('length', + `<= ${bufferLength - offset}`, length); } }, ); @@ -679,31 +708,41 @@ const validateOffsetLengthRead = hideStackFrames( const validateOffsetLengthWrite = hideStackFrames( (offset, length, byteLength) => { if (offset > byteLength) { - throw new ERR_OUT_OF_RANGE('offset', `<= ${byteLength}`, offset); + throw new ERR_OUT_OF_RANGE.HideStackFramesError('offset', `<= ${byteLength}`, offset); } if (length > byteLength - offset) { - throw new ERR_OUT_OF_RANGE('length', `<= ${byteLength - offset}`, length); + throw new ERR_OUT_OF_RANGE.HideStackFramesError('length', `<= ${byteLength - offset}`, length); } if (length < 0) { - throw new ERR_OUT_OF_RANGE('length', '>= 0', length); + throw new ERR_OUT_OF_RANGE.HideStackFramesError('length', '>= 0', length); } - validateInt32(length, 'length', 0); + validateInt32.withoutStackTrace(length, 'length', 0); }, ); const validatePath = hideStackFrames((path, propName = 'path') => { if (typeof path !== 'string' && !isUint8Array(path)) { - throw new ERR_INVALID_ARG_TYPE(propName, ['string', 'Buffer', 'URL'], path); + throw new ERR_INVALID_ARG_TYPE.HideStackFramesError(propName, ['string', 'Buffer', 'URL'], path); } - const err = nullCheck(path, propName, false); + const pathIsString = typeof path === 'string'; + const pathIsUint8Array = isUint8Array(path); - if (err !== undefined) { - throw err; + // We can only perform meaningful checks on strings and Uint8Arrays. + if ((!pathIsString && !pathIsUint8Array) || + (pathIsString && !StringPrototypeIncludes(path, '\u0000')) || + (pathIsUint8Array && !TypedArrayPrototypeIncludes(path, 0))) { + return; } + + throw new ERR_INVALID_ARG_VALUE.HideStackFramesError( + propName, + path, + 'must be a string, Uint8Array, or URL without null bytes', + ); }); // TODO(rafaelgss): implement the path.resolve on C++ side @@ -742,11 +781,11 @@ const getValidatedFd = hideStackFrames((fd, propName = 'fd') => { const validateBufferArray = hideStackFrames((buffers, propName = 'buffers') => { if (!ArrayIsArray(buffers)) - throw new ERR_INVALID_ARG_TYPE(propName, 'ArrayBufferView[]', buffers); + throw new ERR_INVALID_ARG_TYPE.HideStackFramesError(propName, 'ArrayBufferView[]', buffers); for (let i = 0; i < buffers.length; i++) { if (!isArrayBufferView(buffers[i])) - throw new ERR_INVALID_ARG_TYPE(propName, 'ArrayBufferView[]', buffers); + throw new ERR_INVALID_ARG_TYPE.HideStackFramesError(propName, 'ArrayBufferView[]', buffers); } return buffers; @@ -802,7 +841,7 @@ const validateCpOptions = hideStackFrames((options) => { validateBoolean(options.verbatimSymlinks, 'options.verbatimSymlinks'); options.mode = getValidMode(options.mode, 'copyFile'); if (options.dereference === true && options.verbatimSymlinks === true) { - throw new ERR_INCOMPATIBLE_OPTION_PAIR('dereference', 'verbatimSymlinks'); + throw new ERR_INCOMPATIBLE_OPTION_PAIR.HideStackFramesError('dereference', 'verbatimSymlinks'); } if (options.filter !== undefined) { validateFunction(options.filter, 'options.filter'); @@ -827,21 +866,23 @@ const validateRmOptions = hideStackFrames((path, options, expectDir, cb) => { } if (stats.isDirectory() && !options.recursive) { - return cb(new ERR_FS_EISDIR({ + const err = new ERR_FS_EISDIR.HideStackFramesError({ code: 'EISDIR', message: 'is a directory', path, syscall: 'rm', errno: EISDIR, - })); + }); + + return cb(err); } return cb(null, options); }); }); const validateRmOptionsSync = hideStackFrames((path, options, expectDir) => { - options = validateRmdirOptions(options, defaultRmOptions); - validateBoolean(options.force, 'options.force'); + options = validateRmdirOptions.withoutStackTrace(options, defaultRmOptions); + validateBoolean.withoutStackTrace(options.force, 'options.force'); if (!options.force || expectDir || !options.recursive) { const isDirectory = lazyLoadFs() @@ -852,7 +893,7 @@ const validateRmOptionsSync = hideStackFrames((path, options, expectDir) => { } if (isDirectory && !options.recursive) { - throw new ERR_FS_EISDIR({ + throw new ERR_FS_EISDIR.HideStackFramesError({ code: 'EISDIR', message: 'is a directory', path, @@ -882,13 +923,13 @@ const validateRmdirOptions = hideStackFrames( (options, defaults = defaultRmdirOptions) => { if (options === undefined) return defaults; - validateObject(options, 'options'); + validateObject.withoutStackTrace(options, 'options'); options = { ...defaults, ...options }; - validateBoolean(options.recursive, 'options.recursive'); - validateInt32(options.retryDelay, 'options.retryDelay', 0); - validateUint32(options.maxRetries, 'options.maxRetries'); + validateBoolean.withoutStackTrace(options.recursive, 'options.recursive'); + validateInt32.withoutStackTrace(options.retryDelay, 'options.retryDelay', 0); + validateUint32.withoutStackTrace(options.maxRetries, 'options.maxRetries'); return options; }); @@ -907,13 +948,13 @@ const getValidMode = hideStackFrames((mode, type) => { if (mode == null) { return def; } - validateInteger(mode, 'mode', min, max); + validateInteger.withoutStackTrace(mode, 'mode', min, max); return mode; }); const validateStringAfterArrayBufferView = hideStackFrames((buffer, name) => { if (typeof buffer !== 'string') { - throw new ERR_INVALID_ARG_TYPE( + throw new ERR_INVALID_ARG_TYPE.HideStackFramesError( name, ['string', 'Buffer', 'TypedArray', 'DataView'], buffer, @@ -923,16 +964,16 @@ const validateStringAfterArrayBufferView = hideStackFrames((buffer, name) => { const validatePosition = hideStackFrames((position, name, length) => { if (typeof position === 'number') { - validateInteger(position, name, -1); + validateInteger.withoutStackTrace(position, name, -1); } else if (typeof position === 'bigint') { const maxPosition = 2n ** 63n - 1n - BigInt(length); if (!(position >= -1n && position <= maxPosition)) { - throw new ERR_OUT_OF_RANGE(name, - `>= -1 && <= ${maxPosition}`, - position); + throw new ERR_OUT_OF_RANGE.HideStackFramesError(name, + `>= -1 && <= ${maxPosition}`, + position); } } else { - throw new ERR_INVALID_ARG_TYPE(name, ['integer', 'bigint'], position); + throw new ERR_INVALID_ARG_TYPE.HideStackFramesError(name, ['integer', 'bigint'], position); } }); @@ -956,7 +997,6 @@ module.exports = { getValidatedPath, getValidMode, handleErrorFromBinding, - nullCheck, possiblyTransformPath, preprocessSymlinkDestination, realpathCacheKey: Symbol('realpathCacheKey'), diff --git a/lib/internal/fs/watchers.js b/lib/internal/fs/watchers.js index 99212fa713bf3f..f5ecc15159f457 100644 --- a/lib/internal/fs/watchers.js +++ b/lib/internal/fs/watchers.js @@ -9,7 +9,7 @@ const { const { AbortError, - uvException, + UVException, codes: { ERR_INVALID_ARG_VALUE, }, @@ -119,7 +119,7 @@ StatWatcher.prototype[kFSStatWatcherStart] = function(filename, validateUint32(interval, 'interval'); const err = this._handle.start(toNamespacedPath(filename), interval); if (err) { - const error = uvException({ + const error = new UVException({ errno: err, syscall: 'watch', path: filename, @@ -204,7 +204,7 @@ function FSWatcher() { this._handle.close(); this._handle = null; // Make the handle garbage collectable. } - const error = uvException({ + const error = new UVException({ errno: status, syscall: 'watch', path: filename, @@ -244,7 +244,7 @@ FSWatcher.prototype[kFSWatchStart] = function(filename, recursive, encoding); if (err) { - const error = uvException({ + const error = new UVException({ errno: err, syscall: 'watch', path: filename, @@ -338,7 +338,7 @@ async function* watch(filename, options = kEmptyObject) { } handle.onchange = (status, eventType, filename) => { if (status < 0) { - const error = uvException({ + const error = new UVException({ errno: status, syscall: 'watch', path: filename, @@ -354,7 +354,7 @@ async function* watch(filename, options = kEmptyObject) { const err = handle.start(path, persistent, recursive, encoding); if (err) { - const error = uvException({ + const error = new UVException({ errno: err, syscall: 'watch', path: filename, diff --git a/lib/internal/histogram.js b/lib/internal/histogram.js index 079fbce50d54e3..cb757313009dc0 100644 --- a/lib/internal/histogram.js +++ b/lib/internal/histogram.js @@ -52,9 +52,13 @@ function isHistogram(object) { return object?.[kHandle] !== undefined; } +const kSkipThrow = Symbol('kSkipThrow'); + class Histogram { - constructor() { - throw new ERR_ILLEGAL_CONSTRUCTOR(); + constructor(skipThrowSymbol = undefined) { + if (skipThrowSymbol !== kSkipThrow) { + throw new ERR_ILLEGAL_CONSTRUCTOR(); + } } [kInspect](depth, options) { @@ -242,7 +246,7 @@ class Histogram { const handle = this[kHandle]; return { data: { handle }, - deserializeInfo: 'internal/histogram:internalHistogram', + deserializeInfo: 'internal/histogram:ClonedHistogram', }; } @@ -264,8 +268,12 @@ class Histogram { } class RecordableHistogram extends Histogram { - constructor() { - throw new ERR_ILLEGAL_CONSTRUCTOR(); + constructor(skipThrowSymbol = undefined) { + if (skipThrowSymbol !== kSkipThrow) { + throw new ERR_ILLEGAL_CONSTRUCTOR(); + } + + super(skipThrowSymbol); } /** @@ -309,7 +317,7 @@ class RecordableHistogram extends Histogram { const handle = this[kHandle]; return { data: { handle }, - deserializeInfo: 'internal/histogram:internalRecordableHistogram', + deserializeInfo: 'internal/histogram:ClonedRecordableHistogram', }; } @@ -318,7 +326,7 @@ class RecordableHistogram extends Histogram { } } -function internalHistogram(handle) { +function ClonedHistogram(handle) { return ReflectConstruct( function() { markTransferMode(this, true, false); @@ -326,18 +334,26 @@ function internalHistogram(handle) { this[kMap] = new SafeMap(); }, [], Histogram); } -internalHistogram.prototype[kDeserialize] = () => {}; -function internalRecordableHistogram(handle) { - return ReflectConstruct( - function() { - markTransferMode(this, true, false); - this[kHandle] = handle; - this[kMap] = new SafeMap(); - this[kRecordable] = true; - }, [], RecordableHistogram); +ClonedHistogram.prototype[kDeserialize] = () => { }; + +function ClonedRecordableHistogram(handle) { + const histogram = new RecordableHistogram(kSkipThrow); + + markTransferMode(histogram, true, false); + histogram[kRecordable] = true; + histogram[kMap] = new SafeMap(); + histogram[kHandle] = handle; + histogram.constructor = RecordableHistogram; + + return histogram; +} + +ClonedRecordableHistogram.prototype[kDeserialize] = () => { }; + +function createRecordableHistogram(handle) { + return new ClonedRecordableHistogram(handle); } -internalRecordableHistogram.prototype[kDeserialize] = () => {}; /** * @param {{ @@ -363,14 +379,14 @@ function createHistogram(options = kEmptyObject) { throw new ERR_INVALID_ARG_VALUE.RangeError('options.highest', highest); } validateInteger(figures, 'options.figures', 1, 5); - return internalRecordableHistogram(new _Histogram(lowest, highest, figures)); + return createRecordableHistogram(new _Histogram(lowest, highest, figures)); } module.exports = { Histogram, RecordableHistogram, - internalHistogram, - internalRecordableHistogram, + ClonedHistogram, + ClonedRecordableHistogram, isHistogram, kDestroy, kHandle, diff --git a/lib/internal/http2/compat.js b/lib/internal/http2/compat.js index 2ab9c70ccd7402..7bf079900c652f 100644 --- a/lib/internal/http2/compat.js +++ b/lib/internal/http2/compat.js @@ -89,13 +89,13 @@ const assertValidHeader = hideStackFrames((name, value) => { if (name === '' || typeof name !== 'string' || StringPrototypeIncludes(name, ' ')) { - throw new ERR_INVALID_HTTP_TOKEN('Header name', name); + throw new ERR_INVALID_HTTP_TOKEN.HideStackFramesError('Header name', name); } if (isPseudoHeader(name)) { - throw new ERR_HTTP2_PSEUDOHEADER_NOT_ALLOWED(); + throw new ERR_HTTP2_PSEUDOHEADER_NOT_ALLOWED.HideStackFramesError(); } if (value === undefined || value === null) { - throw new ERR_HTTP2_INVALID_HEADER_VALUE(value, name); + throw new ERR_HTTP2_INVALID_HEADER_VALUE.HideStackFramesError(value, name); } if (!isConnectionHeaderAllowed(name, value)) { connectionHeaderMessageWarn(); diff --git a/lib/internal/http2/core.js b/lib/internal/http2/core.js index 1a689859aff752..e6056c395cda68 100644 --- a/lib/internal/http2/core.js +++ b/lib/internal/http2/core.js @@ -766,25 +766,25 @@ const setAndValidatePriorityOptions = hideStackFrames((options) => { if (options.weight === undefined) { options.weight = NGHTTP2_DEFAULT_WEIGHT; } else { - validateNumber(options.weight, 'options.weight'); + validateNumber.withoutStackTrace(options.weight, 'options.weight'); } if (options.parent === undefined) { options.parent = 0; } else { - validateNumber(options.parent, 'options.parent', 0); + validateNumber.withoutStackTrace(options.parent, 'options.parent', 0); } if (options.exclusive === undefined) { options.exclusive = false; } else { - validateBoolean(options.exclusive, 'options.exclusive'); + validateBoolean.withoutStackTrace(options.exclusive, 'options.exclusive'); } if (options.silent === undefined) { options.silent = false; } else { - validateBoolean(options.silent, 'options.silent'); + validateBoolean.withoutStackTrace(options.silent, 'options.silent'); } }); @@ -946,33 +946,35 @@ function pingCallback(cb) { // All settings are optional and may be left undefined const validateSettings = hideStackFrames((settings) => { if (settings === undefined) return; - assertWithinRange('headerTableSize', - settings.headerTableSize, - 0, kMaxInt); - assertWithinRange('initialWindowSize', - settings.initialWindowSize, - 0, kMaxInt); - assertWithinRange('maxFrameSize', - settings.maxFrameSize, - 16384, kMaxFrameSize); - assertWithinRange('maxConcurrentStreams', - settings.maxConcurrentStreams, - 0, kMaxStreams); - assertWithinRange('maxHeaderListSize', - settings.maxHeaderListSize, - 0, kMaxInt); - assertWithinRange('maxHeaderSize', - settings.maxHeaderSize, - 0, kMaxInt); + assertIsObject.withoutStackTrace(settings.customSettings, 'customSettings', 'Number'); + + assertWithinRange.withoutStackTrace('headerTableSize', + settings.headerTableSize, + 0, kMaxInt); + assertWithinRange.withoutStackTrace('initialWindowSize', + settings.initialWindowSize, + 0, kMaxInt); + assertWithinRange.withoutStackTrace('maxFrameSize', + settings.maxFrameSize, + 16384, kMaxFrameSize); + assertWithinRange.withoutStackTrace('maxConcurrentStreams', + settings.maxConcurrentStreams, + 0, kMaxStreams); + assertWithinRange.withoutStackTrace('maxHeaderListSize', + settings.maxHeaderListSize, + 0, kMaxInt); + assertWithinRange.withoutStackTrace('maxHeaderSize', + settings.maxHeaderSize, + 0, kMaxInt); if (settings.enablePush !== undefined && typeof settings.enablePush !== 'boolean') { - throw new ERR_HTTP2_INVALID_SETTING_VALUE('enablePush', - settings.enablePush); + throw new ERR_HTTP2_INVALID_SETTING_VALUE.HideStackFramesError('enablePush', + settings.enablePush); } if (settings.enableConnectProtocol !== undefined && typeof settings.enableConnectProtocol !== 'boolean') { - throw new ERR_HTTP2_INVALID_SETTING_VALUE('enableConnectProtocol', - settings.enableConnectProtocol); + throw new ERR_HTTP2_INVALID_SETTING_VALUE.HideStackFramesError('enableConnectProtocol', + settings.enableConnectProtocol); } }); @@ -2358,8 +2360,11 @@ class Http2Stream extends Duplex { // This notifies the session that this stream has been destroyed and // gives the session the opportunity to clean itself up. The session // will destroy if it has been closed and there are no other open or - // pending streams. - session[kMaybeDestroy](); + // pending streams. Delay with setImmediate so we don't do it on the + // nghttp2 stack. + setImmediate(() => { + session[kMaybeDestroy](); + }); callback(err); } // The Http2Stream can be destroyed if it has closed and if the readable @@ -3384,6 +3389,10 @@ function getUnpackedSettings(buf, options = kEmptyObject) { break; case NGHTTP2_SETTINGS_ENABLE_CONNECT_PROTOCOL: settings.enableConnectProtocol = value !== 0; + break; + default: + if (!settings.customSettings) settings.customSettings = {}; + settings.customSettings[id] = value; } offset += 4; } diff --git a/lib/internal/http2/util.js b/lib/internal/http2/util.js index 6d4a7f94b3d11a..8578cc9cc8e5fb 100644 --- a/lib/internal/http2/util.js +++ b/lib/internal/http2/util.js @@ -8,7 +8,7 @@ const { Error, MathMax, Number, - ObjectDefineProperty, + NumberIsNaN, ObjectKeys, SafeSet, String, @@ -23,12 +23,12 @@ const { codes: { ERR_HTTP2_HEADER_SINGLE_VALUE, ERR_HTTP2_INVALID_CONNECTION_HEADERS, - ERR_HTTP2_INVALID_PSEUDOHEADER, + ERR_HTTP2_INVALID_PSEUDOHEADER: { HideStackFramesError: ERR_HTTP2_INVALID_PSEUDOHEADER }, ERR_HTTP2_INVALID_SETTING_VALUE, + ERR_HTTP2_TOO_MANY_CUSTOM_SETTINGS, ERR_INVALID_ARG_TYPE, ERR_INVALID_HTTP_TOKEN, }, - captureLargerStackTrace, getMessage, hideStackFrames, kIsNodeError, @@ -192,6 +192,9 @@ const IDX_SETTINGS_MAX_HEADER_LIST_SIZE = 5; const IDX_SETTINGS_ENABLE_CONNECT_PROTOCOL = 6; const IDX_SETTINGS_FLAGS = 7; +// Maximum number of allowed additional settings +const MAX_ADDITIONAL_SETTINGS = 10; + const IDX_SESSION_STATE_EFFECTIVE_LOCAL_WINDOW_SIZE = 0; const IDX_SESSION_STATE_EFFECTIVE_RECV_DATA_LENGTH = 1; const IDX_SESSION_STATE_NEXT_STREAM_ID = 2; @@ -350,6 +353,80 @@ function getSettings(session, remote) { function updateSettingsBuffer(settings) { let flags = 0; + let numCustomSettings = 0; + + if (typeof settings.customSettings === 'object') { + const customSettings = settings.customSettings; + for (const setting in customSettings) { + const val = customSettings[setting]; + if (typeof val === 'number') { + let set = false; + const nsetting = Number(setting); + if (NumberIsNaN(nsetting) || + typeof nsetting !== 'number' || + 0 >= nsetting || + nsetting > 0xffff) + throw new ERR_HTTP2_INVALID_SETTING_VALUE.RangeError( + 'Range Error', nsetting, 0, 0xffff); + if (NumberIsNaN(val) || + typeof val !== 'number' || + 0 >= val || + val > 0xffffffff) + throw new ERR_HTTP2_INVALID_SETTING_VALUE.RangeError( + 'Range Error', val, 0, 0xffffffff); + if (nsetting < IDX_SETTINGS_FLAGS) { + set = true; + switch (nsetting) { + case IDX_SETTINGS_HEADER_TABLE_SIZE: + flags |= (1 << IDX_SETTINGS_HEADER_TABLE_SIZE); + settingsBuffer[IDX_SETTINGS_HEADER_TABLE_SIZE] = + val; + break; + case IDX_SETTINGS_ENABLE_PUSH: + flags |= (1 << IDX_SETTINGS_ENABLE_PUSH); + settingsBuffer[IDX_SETTINGS_ENABLE_PUSH] = val; + break; + case IDX_SETTINGS_INITIAL_WINDOW_SIZE: + flags |= (1 << IDX_SETTINGS_INITIAL_WINDOW_SIZE); + settingsBuffer[IDX_SETTINGS_INITIAL_WINDOW_SIZE] = + val; + break; + case IDX_SETTINGS_MAX_FRAME_SIZE: + flags |= (1 << IDX_SETTINGS_MAX_FRAME_SIZE); + settingsBuffer[IDX_SETTINGS_MAX_FRAME_SIZE] = + val; + break; + case IDX_SETTINGS_MAX_CONCURRENT_STREAMS: + flags |= (1 << IDX_SETTINGS_MAX_CONCURRENT_STREAMS); + settingsBuffer[IDX_SETTINGS_MAX_CONCURRENT_STREAMS] = val; + break; + case IDX_SETTINGS_MAX_HEADER_LIST_SIZE: + flags |= (1 << IDX_SETTINGS_MAX_HEADER_LIST_SIZE); + settingsBuffer[IDX_SETTINGS_MAX_HEADER_LIST_SIZE] = + val; + break; + case IDX_SETTINGS_ENABLE_CONNECT_PROTOCOL: + flags |= (1 << IDX_SETTINGS_ENABLE_CONNECT_PROTOCOL); + settingsBuffer[IDX_SETTINGS_ENABLE_CONNECT_PROTOCOL] = val; + break; + default: + set = false; + break; + } + } + if (!set) { // not supported + if (numCustomSettings === MAX_ADDITIONAL_SETTINGS) + throw new ERR_HTTP2_TOO_MANY_CUSTOM_SETTINGS(); + + settingsBuffer[IDX_SETTINGS_FLAGS + 1 + 2 * numCustomSettings + 1] = nsetting; + settingsBuffer[IDX_SETTINGS_FLAGS + 1 + 2 * numCustomSettings + 2] = val; + numCustomSettings++; + } + } + } + } + settingsBuffer[IDX_SETTINGS_FLAGS + 1] = numCustomSettings; + if (typeof settings.headerTableSize === 'number') { flags |= (1 << IDX_SETTINGS_HEADER_TABLE_SIZE); settingsBuffer[IDX_SETTINGS_HEADER_TABLE_SIZE] = @@ -552,14 +629,10 @@ class NghttpError extends Error { binding.nghttp2ErrorString(integerCode)); this.code = customErrorCode || 'ERR_HTTP2_ERROR'; this.errno = integerCode; - captureLargerStackTrace(this); - ObjectDefineProperty(this, kIsNodeError, { - __proto__: null, - value: true, - enumerable: false, - writable: false, - configurable: true, - }); + } + + get [kIsNodeError]() { + return true; } toString() { @@ -572,7 +645,7 @@ const assertIsObject = hideStackFrames((value, name, types) => { (value === null || typeof value !== 'object' || ArrayIsArray(value))) { - throw new ERR_INVALID_ARG_TYPE(name, types || 'Object', value); + throw new ERR_INVALID_ARG_TYPE.HideStackFramesError(name, types || 'Object', value); } }); @@ -580,7 +653,7 @@ const assertWithinRange = hideStackFrames( (name, value, min = 0, max = Infinity) => { if (value !== undefined && (typeof value !== 'number' || value < min || value > max)) { - throw new ERR_HTTP2_INVALID_SETTING_VALUE.RangeError( + throw new ERR_HTTP2_INVALID_SETTING_VALUE.RangeError.HideStackFramesError( name, value, min, max); } }, diff --git a/lib/internal/js_stream_socket.js b/lib/internal/js_stream_socket.js index 70d6d03069f3f1..a6aee73f468b08 100644 --- a/lib/internal/js_stream_socket.js +++ b/lib/internal/js_stream_socket.js @@ -179,10 +179,13 @@ class JSStreamSocket extends Socket { // anything. doClose will call finishWrite with ECANCELED for us shortly. this[kCurrentWriteRequest] = req; // Store req, for doClose to cancel return 0; + } else if (this._handle === null) { + // If this._handle is already null, there is nothing left to do with a + // pending write request, so we discard it. + return 0; } const handle = this._handle; - assert(handle !== null); const self = this; diff --git a/lib/internal/main/mksnapshot.js b/lib/internal/main/mksnapshot.js index 34701716839326..f00bf886153e6e 100644 --- a/lib/internal/main/mksnapshot.js +++ b/lib/internal/main/mksnapshot.js @@ -19,7 +19,7 @@ const { const { isExperimentalSeaWarningNeeded } = internalBinding('sea'); const { emitExperimentalWarning } = require('internal/util'); - +const { emitWarningSync } = require('internal/process/warning'); const { getOptionValue, } = require('internal/options'); @@ -29,6 +29,7 @@ const { namespace: { addSerializeCallback, addDeserializeCallback, + isBuildingSnapshot, }, } = require('internal/v8/startup_snapshot'); @@ -119,10 +120,18 @@ function requireForUserSnapshot(id) { err.code = 'MODULE_NOT_FOUND'; throw err; } - if (!supportedInUserSnapshot(normalizedId)) { + if (isBuildingSnapshot() && !supportedInUserSnapshot(normalizedId)) { if (!warnedModules.has(normalizedId)) { - process.emitWarning( - `built-in module ${id} is not yet supported in user snapshots`); + // Emit the warning synchronously in case we don't get to process + // the tick and print it before the unsupported built-in causes a + // crash. + emitWarningSync( + `It's not yet fully verified whether built-in module "${id}" ` + + 'works in user snapshot builder scripts.\n' + + 'It may still work in some cases, but in other cases certain ' + + 'run-time states may be out-of-sync after snapshot deserialization.\n' + + 'To request support for the module, use the Node.js issue tracker: ' + + 'https://github.com/nodejs/node/issues'); warnedModules.add(normalizedId); } } diff --git a/lib/internal/main/print_help.js b/lib/internal/main/print_help.js index edb861668cac3d..73227fbd9cb456 100644 --- a/lib/internal/main/print_help.js +++ b/lib/internal/main/print_help.js @@ -11,7 +11,7 @@ const { RegExpPrototypeSymbolReplace, StringPrototypeLocaleCompare, StringPrototypeSlice, - StringPrototypeTrimLeft, + StringPrototypeTrimStart, StringPrototypeRepeat, SafeMap, } = primordials; @@ -180,7 +180,7 @@ function format( else text += StringPrototypeRepeat(' ', firstColumn - displayName.length); - text += StringPrototypeTrimLeft( + text += StringPrototypeTrimStart( indent(fold(displayHelpText, secondColumn), firstColumn)) + '\n'; } diff --git a/lib/internal/main/test_runner.js b/lib/internal/main/test_runner.js index 7e6f3079a509a9..4f3f067cc74242 100644 --- a/lib/internal/main/test_runner.js +++ b/lib/internal/main/test_runner.js @@ -60,11 +60,14 @@ if (shardOption) { }; } +const timeout = getOptionValue('--test-timeout') || Infinity; + const options = { concurrency, inspectPort, watch: getOptionValue('--watch'), setup: setupTestReporters, + timeout, shard, }; debug('test runner configuration:', options); diff --git a/lib/internal/main/watch_mode.js b/lib/internal/main/watch_mode.js index 4fae6363226310..3be329c57af6db 100644 --- a/lib/internal/main/watch_mode.js +++ b/lib/internal/main/watch_mode.js @@ -41,7 +41,7 @@ const kCommandStr = inspect(ArrayPrototypeJoin(kCommand, ' ')); const args = ArrayPrototypeFilter(process.execArgv, (arg, i, arr) => !StringPrototypeStartsWith(arg, '--watch-path') && (!arr[i - 1] || !StringPrototypeStartsWith(arr[i - 1], '--watch-path')) && - arg !== '--watch' && arg !== '--watch-preserve-output'); + arg !== '--watch' && !StringPrototypeStartsWith(arg, '--watch=') && arg !== '--watch-preserve-output'); ArrayPrototypePushApply(args, kCommand); const watcher = new FilesWatcher({ debounce: 200, mode: kShouldFilterModules ? 'filter' : 'all' }); diff --git a/lib/internal/main/worker_thread.js b/lib/internal/main/worker_thread.js index 0dda4c760e4acb..c14091ffe09ca7 100644 --- a/lib/internal/main/worker_thread.js +++ b/lib/internal/main/worker_thread.js @@ -136,6 +136,7 @@ port.on('message', (message) => { const isLoaderWorker = doEval === 'internal' && filename === require('internal/modules/esm/utils').loaderWorkerId; + // Disable custom loaders in loader worker. setupUserModules(isLoaderWorker); if (!hasStdin) diff --git a/lib/internal/mime.js b/lib/internal/mime.js index 332ed8b5368c84..07d80a72625cac 100644 --- a/lib/internal/mime.js +++ b/lib/internal/mime.js @@ -70,7 +70,7 @@ function parseTypeAndSubtype(str) { const invalidSubtypeIndex = SafeStringPrototypeSearch(trimmedSubtype, NOT_HTTP_TOKEN_CODE_POINT); if (trimmedSubtype === '' || invalidSubtypeIndex !== -1) { - throw new ERR_INVALID_MIME_SYNTAX('subtype', str, trimmedSubtype); + throw new ERR_INVALID_MIME_SYNTAX('subtype', str, invalidSubtypeIndex); } const subtype = toASCIILower(trimmedSubtype); return [ @@ -384,8 +384,6 @@ ObjectDefineProperty(MIMEType.prototype, 'toJSON', { }); module.exports = { - toASCIILower, - parseTypeAndSubtype, MIMEParams, MIMEType, }; diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js index 8be147c8e233ca..44abacb41a3430 100644 --- a/lib/internal/modules/cjs/loader.js +++ b/lib/internal/modules/cjs/loader.js @@ -52,6 +52,7 @@ const { SafeMap, SafeWeakMap, String, + Symbol, StringPrototypeCharAt, StringPrototypeCharCodeAt, StringPrototypeEndsWith, @@ -64,12 +65,19 @@ const { // Map used to store CJS parsing data. const cjsParseCache = new SafeWeakMap(); +/** + * Map of already-loaded CJS modules to use. + */ +const cjsExportsCache = new SafeWeakMap(); // Set first due to cycle with ESM loader functions. module.exports = { - wrapSafe, Module, cjsParseCache, - get hasLoadedAnyUserCJSModule() { return hasLoadedAnyUserCJSModule; }, + cjsExportsCache, + cjsParseCache, initializeCJS, + Module, + wrapSafe, + get hasLoadedAnyUserCJSModule() { return hasLoadedAnyUserCJSModule; }, }; const { BuiltinModule } = require('internal/bootstrap/realm'); @@ -84,7 +92,13 @@ const { setOwnProperty, getLazy, } = require('internal/util'); -const { internalCompileFunction } = require('internal/vm'); +const { + internalCompileFunction, + makeContextifyScript, + runScriptInThisContext, +} = require('internal/vm'); +const { containsModuleSyntax } = internalBinding('contextify'); + const assert = require('internal/assert'); const fs = require('fs'); const path = require('path'); @@ -98,7 +112,6 @@ const { const { getCjsConditions, initializeCjsConditions, - hasEsmSyntax, loadBuiltinModule, makeRequireFunction, normalizeReferrerURL, @@ -144,7 +157,6 @@ const { isProxy, } = require('internal/util/types'); -const { kEvaluated } = internalBinding('module_wrap'); const isWindows = process.platform === 'win32'; const relativeResolveCache = { __proto__: null }; @@ -421,7 +433,7 @@ ObjectDefineProperty(Module, '_readPackage', { * @param {string} originalPath The specifier passed to `require` */ function tryPackage(requestPath, exts, isMain, originalPath) { - const pkg = _readPackage(requestPath).main; + const { main: pkg, pjsonPath } = _readPackage(requestPath); if (!pkg) { return tryExtensions(path.resolve(requestPath, 'index'), exts, isMain); @@ -440,14 +452,13 @@ function tryPackage(requestPath, exts, isMain, originalPath) { 'Please verify that the package.json has a valid "main" entry', ); err.code = 'MODULE_NOT_FOUND'; - err.path = path.resolve(requestPath, 'package.json'); + err.path = pjsonPath; err.requestPath = originalPath; // TODO(BridgeAR): Add the requireStack as well. throw err; } else { - const jsonPath = path.resolve(requestPath, 'package.json'); process.emitWarning( - `Invalid 'main' field in '${jsonPath}' of '${pkg}'. ` + + `Invalid 'main' field in '${pjsonPath}' of '${pkg}'. ` + 'Please either fix that or report it to the module author', 'DeprecationWarning', 'DEP0128', @@ -533,16 +544,16 @@ function trySelfParentPath(parent) { function trySelf(parentPath, request) { if (!parentPath) { return false; } - const { data: pkg, path: pkgPath } = packageJsonReader.readPackageScope(parentPath); - if (!pkg || pkg.exports == null || pkg.name === undefined) { + const pkg = packageJsonReader.getNearestParentPackageJSON(parentPath); + if (pkg?.data.exports === undefined || pkg.data.name === undefined) { return false; } let expansion; - if (request === pkg.name) { + if (request === pkg.data.name) { expansion = '.'; - } else if (StringPrototypeStartsWith(request, `${pkg.name}/`)) { - expansion = '.' + StringPrototypeSlice(request, pkg.name.length); + } else if (StringPrototypeStartsWith(request, `${pkg.data.name}/`)) { + expansion = '.' + StringPrototypeSlice(request, pkg.data.name.length); } else { return false; } @@ -550,11 +561,11 @@ function trySelf(parentPath, request) { try { const { packageExportsResolve } = require('internal/modules/esm/resolve'); return finalizeEsmResolution(packageExportsResolve( - pathToFileURL(pkgPath + '/package.json'), expansion, pkg, - pathToFileURL(parentPath), getCjsConditions()), parentPath, pkgPath); + pathToFileURL(pkg.path + '/package.json'), expansion, pkg.data, + pathToFileURL(parentPath), getCjsConditions()), parentPath, pkg.path); } catch (e) { if (e.code === 'ERR_MODULE_NOT_FOUND') { - throw createEsmNotFoundErr(request, pkgPath + '/package.json'); + throw createEsmNotFoundErr(request, pkg.path + '/package.json'); } throw e; } @@ -1093,7 +1104,7 @@ Module._resolveFilename = function(request, parent, isMain, options) { if (request[0] === '#' && (parent?.filename || parent?.id === '')) { const parentPath = parent?.filename ?? process.cwd() + path.sep; - const pkg = packageJsonReader.readPackageScope(parentPath) || { __proto__: null }; + const pkg = packageJsonReader.getNearestParentPackageJSON(parentPath) || { __proto__: null }; if (pkg.data?.imports != null) { try { const { packageImportsResolve } = require('internal/modules/esm/resolve'); @@ -1201,14 +1212,11 @@ Module.prototype.load = function(filename) { Module._extensions[extension](this, filename); this.loaded = true; - const cascadedLoader = getCascadedLoader(); // Create module entry at load time to snapshot exports correctly const exports = this.exports; - // Preemptively cache - if ((module?.module === undefined || - module.module.getStatus() < kEvaluated) && - !cascadedLoader.cjsCache.has(this)) { - cascadedLoader.cjsCache.set(this, exports); + // Preemptively cache for ESM loader. + if (!cjsExportsCache.has(this)) { + cjsExportsCache.set(this, exports); } }; @@ -1240,7 +1248,6 @@ Module.prototype.require = function(id) { let resolvedArgv; let hasPausedEntry = false; /** @type {import('vm').Script} */ -let Script; /** * Wraps the given content in a script and runs it in a new context. @@ -1250,47 +1257,49 @@ let Script; * @param {object} codeCache The SEA code cache */ function wrapSafe(filename, content, cjsModuleInstance, codeCache) { + const hostDefinedOptionId = Symbol(`cjs:${filename}`); + async function importModuleDynamically(specifier, _, importAttributes) { + const cascadedLoader = getCascadedLoader(); + return cascadedLoader.import(specifier, normalizeReferrerURL(filename), + importAttributes); + } if (patched) { - const wrapper = Module.wrap(content); - if (Script === undefined) { - ({ Script } = require('vm')); - } - const script = new Script(wrapper, { - filename, - lineOffset: 0, - importModuleDynamically: async (specifier, _, importAttributes) => { - const cascadedLoader = getCascadedLoader(); - return cascadedLoader.import(specifier, normalizeReferrerURL(filename), - importAttributes); - }, - }); + const wrapped = Module.wrap(content); + const script = makeContextifyScript( + wrapped, // code + filename, // filename + 0, // lineOffset + 0, // columnOffset + undefined, // cachedData + false, // produceCachedData + undefined, // parsingContext + hostDefinedOptionId, // hostDefinedOptionId + importModuleDynamically, // importModuleDynamically + ); // Cache the source map for the module if present. if (script.sourceMapURL) { maybeCacheSourceMap(filename, content, this, false, undefined, script.sourceMapURL); } - return script.runInThisContext({ - displayErrors: true, - }); + return runScriptInThisContext(script, true, false); } + const params = [ 'exports', 'require', 'module', '__filename', '__dirname' ]; try { - const result = internalCompileFunction(content, [ - 'exports', - 'require', - 'module', - '__filename', - '__dirname', - ], { - filename, - cachedData: codeCache, - importModuleDynamically(specifier, _, importAttributes) { - const cascadedLoader = getCascadedLoader(); - return cascadedLoader.import(specifier, normalizeReferrerURL(filename), - importAttributes); - }, - }); + const result = internalCompileFunction( + content, // code, + filename, // filename + 0, // lineOffset + 0, // columnOffset, + codeCache, // cachedData + false, // produceCachedData + undefined, // parsingContext + undefined, // contextExtensions + params, // params + hostDefinedOptionId, // hostDefinedOptionId + importModuleDynamically, // importModuleDynamically + ); // The code cache is used for SEAs only. if (codeCache && @@ -1308,7 +1317,7 @@ function wrapSafe(filename, content, cjsModuleInstance, codeCache) { } catch (err) { if (process.mainModule === cjsModuleInstance) { const { enrichCJSError } = require('internal/modules/esm/translators'); - enrichCJSError(err, content); + enrichCJSError(err, content, filename); } throw err; } @@ -1390,13 +1399,14 @@ Module._extensions['.js'] = function(module, filename) { content = fs.readFileSync(filename, 'utf8'); } if (StringPrototypeEndsWith(filename, '.js')) { - const pkg = packageJsonReader.readPackageScope(filename) || { __proto__: null }; + const pkg = packageJsonReader.getNearestParentPackageJSON(filename); // Function require shouldn't be used in ES modules. - if (pkg.data?.type === 'module') { + if (pkg?.data.type === 'module') { + // This is an error path because `require` of a `.js` file in a `"type": "module"` scope is not allowed. const parent = moduleParentCache.get(module); const parentPath = parent?.filename; const packageJsonPath = path.resolve(pkg.path, 'package.json'); - const usesEsm = hasEsmSyntax(content); + const usesEsm = containsModuleSyntax(content, filename); const err = new ERR_REQUIRE_ESM(filename, usesEsm, parentPath, packageJsonPath); // Attempt to reconstruct the parent require frame. diff --git a/lib/internal/modules/esm/assert.js b/lib/internal/modules/esm/assert.js index ce3280de84bf4d..5672f8c8f9959d 100644 --- a/lib/internal/modules/esm/assert.js +++ b/lib/internal/modules/esm/assert.js @@ -10,9 +10,8 @@ const { const { validateString } = require('internal/validators'); const { - ERR_IMPORT_ASSERTION_TYPE_FAILED, - ERR_IMPORT_ASSERTION_TYPE_MISSING, - ERR_IMPORT_ASSERTION_TYPE_UNSUPPORTED, + ERR_IMPORT_ATTRIBUTE_TYPE_INCOMPATIBLE, + ERR_IMPORT_ATTRIBUTE_MISSING, ERR_IMPORT_ATTRIBUTE_UNSUPPORTED, } = require('internal/errors').codes; @@ -86,7 +85,7 @@ function validateAttributes(url, format, // `importAttributes.type` might not have been it. if (!ObjectPrototypeHasOwnProperty(importAttributes, 'type')) { // `type` wasn't specified at all. - throw new ERR_IMPORT_ASSERTION_TYPE_MISSING(url, validType); + throw new ERR_IMPORT_ATTRIBUTE_MISSING(url, 'type', validType); } return handleInvalidType(url, importAttributes.type); } @@ -103,11 +102,11 @@ function handleInvalidType(url, type) { // `type` might not have been one of the types we understand. if (!ArrayPrototypeIncludes(supportedAssertionTypes, type)) { - throw new ERR_IMPORT_ASSERTION_TYPE_UNSUPPORTED(type); + throw new ERR_IMPORT_ATTRIBUTE_UNSUPPORTED('type', type); } // `type` was the wrong value for this format. - throw new ERR_IMPORT_ASSERTION_TYPE_FAILED(url, type); + throw new ERR_IMPORT_ATTRIBUTE_TYPE_INCOMPATIBLE(url, type); } diff --git a/lib/internal/modules/esm/fetch_module.js b/lib/internal/modules/esm/fetch_module.js index 21b7456899604f..b3491d97cb99c7 100644 --- a/lib/internal/modules/esm/fetch_module.js +++ b/lib/internal/modules/esm/fetch_module.js @@ -134,19 +134,32 @@ function isRedirect(statusCode) { } } +/** + * @typedef AcceptMimes possible values of Accept header when fetching a module + * @property {Promise | string} default default Accept header value. + * @property {Record} json Accept header value when fetching module with importAttributes json. + * @type {AcceptMimes} + */ +const acceptMimes = { + __proto_: null, + default: '*/*', + json: 'application/json,*/*;charset=utf-8;q=0.5', +}; + /** * @param {URL} parsed * @returns {Promise | CacheEntry} */ -function fetchWithRedirects(parsed) { +function fetchWithRedirects(parsed, context) { const existing = cacheForGET.get(parsed.href); if (existing) { return existing; } const handler = parsed.protocol === 'http:' ? HTTPGet : HTTPSGet; const result = (async () => { + const accept = acceptMimes[context.importAttributes?.type] ?? acceptMimes.default; const req = handler(parsed, { - headers: { Accept: '*/*' }, + headers: { Accept: accept }, }); // Note that `once` is used here to handle `error` and that it hits the // `finally` on network error/timeout. @@ -162,7 +175,7 @@ function fetchWithRedirects(parsed) { 'cannot redirect to non-network location', ); } - const entry = await fetchWithRedirects(location); + const entry = await fetchWithRedirects(location, context); cacheForGET.set(parsed.href, entry); return entry; } @@ -262,7 +275,8 @@ async function isLocalAddress(hostname) { * @param {ESModuleContext} context * @returns {ReturnType} */ -function fetchModule(parsed, { parentURL }) { +function fetchModule(parsed, context) { + const { parentURL } = context; const { href } = parsed; const existing = cacheForGET.get(href); if (existing) { @@ -277,10 +291,10 @@ function fetchModule(parsed, { parentURL }) { 'http can only be used to load local resources (use https instead).', ); } - return fetchWithRedirects(parsed); + return fetchWithRedirects(parsed, context); }); } - return fetchWithRedirects(parsed); + return fetchWithRedirects(parsed, context); } module.exports = { diff --git a/lib/internal/modules/esm/get_format.js b/lib/internal/modules/esm/get_format.js index 56d002ca0883ad..5959d476e13bd9 100644 --- a/lib/internal/modules/esm/get_format.js +++ b/lib/internal/modules/esm/get_format.js @@ -18,10 +18,8 @@ const { const experimentalNetworkImports = getOptionValue('--experimental-network-imports'); -const defaultTypeFlag = getOptionValue('--experimental-default-type'); -// The next line is where we flip the default to ES modules someday. -const defaultType = defaultTypeFlag === 'module' ? 'module' : 'commonjs'; -const { getPackageType } = require('internal/modules/esm/resolve'); +const { containsModuleSyntax } = internalBinding('contextify'); +const { getPackageType } = require('internal/modules/package_json_reader'); const { fileURLToPath } = require('internal/url'); const { ERR_UNKNOWN_FILE_EXTENSION } = require('internal/errors').codes; @@ -85,11 +83,12 @@ function underNodeModules(url) { /** * @param {URL} url - * @param {{parentURL: string}} context + * @param {{parentURL: string; source?: Buffer}} context * @param {boolean} ignoreErrors * @returns {string} */ -function getFileProtocolModuleFormat(url, context, ignoreErrors) { +function getFileProtocolModuleFormat(url, context = { __proto__: null }, ignoreErrors) { + const { source } = context; const ext = extname(url); if (ext === '.js') { @@ -97,30 +96,59 @@ function getFileProtocolModuleFormat(url, context, ignoreErrors) { if (packageType !== 'none') { return packageType; } + // The controlling `package.json` file has no `type` field. - if (defaultType === 'module') { - // An exception to the type flag making ESM the default everywhere is that package scopes under `node_modules` - // should retain the assumption that a lack of a `type` field means CommonJS. - return underNodeModules(url) ? 'commonjs' : 'module'; + switch (getOptionValue('--experimental-default-type')) { + case 'module': { // The user explicitly passed `--experimental-default-type=module`. + // An exception to the type flag making ESM the default everywhere is that package scopes under `node_modules` + // should retain the assumption that a lack of a `type` field means CommonJS. + return underNodeModules(url) ? 'commonjs' : 'module'; + } + case 'commonjs': { // The user explicitly passed `--experimental-default-type=commonjs`. + return 'commonjs'; + } + default: { // The user did not pass `--experimental-default-type`. + // `source` is undefined when this is called from `defaultResolve`; + // but this gets called again from `defaultLoad`/`defaultLoadSync`. + if (getOptionValue('--experimental-detect-module')) { + return source ? + (containsModuleSyntax(`${source}`, fileURLToPath(url)) ? 'module' : 'commonjs') : + null; + } + return 'commonjs'; + } } - return 'commonjs'; } if (ext === '') { const packageType = getPackageType(url); - if (defaultType === 'commonjs') { // Legacy behavior - if (packageType === 'none' || packageType === 'commonjs') { - return 'commonjs'; - } // Else packageType === 'module' + if (packageType === 'module') { return getFormatOfExtensionlessFile(url); - } // Else defaultType === 'module' - if (underNodeModules(url)) { // Exception for package scopes under `node_modules` - return packageType === 'module' ? getFormatOfExtensionlessFile(url) : 'commonjs'; } - if (packageType === 'none' || packageType === 'module') { - return getFormatOfExtensionlessFile(url); - } // Else packageType === 'commonjs' - return 'commonjs'; + if (packageType !== 'none') { + return packageType; // 'commonjs' or future package types + } + + // The controlling `package.json` file has no `type` field. + switch (getOptionValue('--experimental-default-type')) { + case 'module': { // The user explicitly passed `--experimental-default-type=module`. + return underNodeModules(url) ? 'commonjs' : getFormatOfExtensionlessFile(url); + } + case 'commonjs': { // The user explicitly passed `--experimental-default-type=commonjs`. + return 'commonjs'; + } + default: { // The user did not pass `--experimental-default-type`. + if (getOptionValue('--experimental-detect-module')) { + if (!source) { return null; } + const format = getFormatOfExtensionlessFile(url); + if (format === 'module') { + return containsModuleSyntax(`${source}`, fileURLToPath(url)) ? 'module' : 'commonjs'; + } + return format; + } + return 'commonjs'; + } + } } const format = extensionFormatMap[ext]; diff --git a/lib/internal/modules/esm/hooks.js b/lib/internal/modules/esm/hooks.js index cb2bc456dbb8f1..314c49a95a4ea1 100644 --- a/lib/internal/modules/esm/hooks.js +++ b/lib/internal/modules/esm/hooks.js @@ -100,6 +100,7 @@ function defineImportAssertionAlias(context) { * @typedef {object} KeyedHook * @property {Function} fn The hook function. * @property {URL['href']} url The URL of the module. + * @property {KeyedHook?} next The next hook in the chain. */ // [2] `validate...()`s throw the wrong error @@ -688,7 +689,7 @@ function pluckHooks({ * A utility function to iterate through a hook chain, track advancement in the * chain, and generate and supply the `next` argument to the custom * hook. - * @param {Hook} current The (currently) first hook in the chain (this shifts + * @param {KeyedHook} current The (currently) first hook in the chain (this shifts * on every call). * @param {object} meta Properties that change as the current hook advances * along the chain. diff --git a/lib/internal/modules/esm/initialize_import_meta.js b/lib/internal/modules/esm/initialize_import_meta.js index f55f60a5b7647a..818c99479cd068 100644 --- a/lib/internal/modules/esm/initialize_import_meta.js +++ b/lib/internal/modules/esm/initialize_import_meta.js @@ -1,6 +1,9 @@ 'use strict'; +const { StringPrototypeStartsWith } = primordials; const { getOptionValue } = require('internal/options'); +const { fileURLToPath } = require('internal/url'); +const { dirname } = require('path'); const experimentalImportMetaResolve = getOptionValue('--experimental-import-meta-resolve'); /** @@ -45,12 +48,20 @@ function createImportMetaResolve(defaultParentURL, loader, allowParentURL) { * @param {object} meta * @param {{url: string}} context * @param {typeof import('./loader.js').ModuleLoader} loader Reference to the current module loader - * @returns {{url: string, resolve?: Function}} + * @returns {{dirname?: string, filename?: string, url: string, resolve?: Function}} */ function initializeImportMeta(meta, context, loader) { const { url } = context; // Alphabetical + if (StringPrototypeStartsWith(url, 'file:') === true) { + // These only make sense for locally loaded modules, + // i.e. network modules are not supported. + const filePath = fileURLToPath(url); + meta.dirname = dirname(filePath); + meta.filename = filePath; + } + if (!loader || loader.allowImportMetaResolve) { meta.resolve = createImportMetaResolve(url, loader, experimentalImportMetaResolve); } diff --git a/lib/internal/modules/esm/load.js b/lib/internal/modules/esm/load.js index 1881745a6d3134..5239bc8ed883a5 100644 --- a/lib/internal/modules/esm/load.js +++ b/lib/internal/modules/esm/load.js @@ -18,6 +18,8 @@ const policy = getOptionValue('--experimental-policy') ? null; const experimentalNetworkImports = getOptionValue('--experimental-network-imports'); +const defaultType = + getOptionValue('--experimental-default-type'); const { Buffer: { from: BufferFrom } } = require('buffer'); @@ -33,7 +35,7 @@ const DATA_URL_PATTERN = /^[^/]+\/[^,;]+(?:[^,]*?)(;base64)?,([\s\S]*)$/; /** * @param {URL} url URL to the module * @param {ESModuleContext} context used to decorate error messages - * @returns {{ responseURL: string, source: string | BufferView }} + * @returns {Promise<{ responseURL: string, source: string | BufferView }>} */ async function getSource(url, context) { const { protocol, href } = url; @@ -127,19 +129,29 @@ async function defaultLoad(url, context = kEmptyObject) { throwIfUnsupportedURLScheme(urlInstance, experimentalNetworkImports); - format ??= await defaultGetFormat(urlInstance, context); + if (urlInstance.protocol === 'node:') { + source = null; + format ??= 'builtin'; + } else if (format !== 'commonjs' || defaultType === 'module') { + if (source == null) { + ({ responseURL, source } = await getSource(urlInstance, context)); + context = { __proto__: context, source }; + } - validateAttributes(url, format, importAttributes); + if (format == null) { + // Now that we have the source for the module, run `defaultGetFormat` to detect its format. + format = await defaultGetFormat(urlInstance, context); - if ( - format === 'builtin' || - format === 'commonjs' - ) { - source = null; - } else if (source == null) { - ({ responseURL, source } = await getSource(urlInstance, context)); + if (format === 'commonjs') { + // For backward compatibility reasons, we need to discard the source in + // order for the CJS loader to re-fetch it. + source = null; + } + } } + validateAttributes(url, format, importAttributes); + return { __proto__: null, format, @@ -178,16 +190,17 @@ function defaultLoadSync(url, context = kEmptyObject) { throwIfUnsupportedURLScheme(urlInstance, false); - format ??= defaultGetFormat(urlInstance, context); - - validateAttributes(url, format, importAttributes); - - if (format === 'builtin') { + if (urlInstance.protocol === 'node:') { source = null; } else if (source == null) { ({ responseURL, source } = getSourceSync(urlInstance, context)); + context.source = source; } + format ??= defaultGetFormat(urlInstance, context); + + validateAttributes(url, format, importAttributes); + return { __proto__: null, format, @@ -249,5 +262,6 @@ function throwUnknownModuleFormat(url, format) { module.exports = { defaultLoad, defaultLoadSync, + getSourceSync, throwUnknownModuleFormat, }; diff --git a/lib/internal/modules/esm/loader.js b/lib/internal/modules/esm/loader.js index 6044765c3709f5..c0e3cdb36e1c02 100644 --- a/lib/internal/modules/esm/loader.js +++ b/lib/internal/modules/esm/loader.js @@ -11,7 +11,6 @@ const { JSONStringify, ObjectSetPrototypeOf, RegExpPrototypeSymbolReplace, - SafeWeakMap, encodeURIComponent, hardenRegExp, } = primordials; @@ -86,11 +85,6 @@ class ModuleLoader { */ #defaultConditions = getDefaultConditions(); - /** - * Map of already-loaded CJS modules to use - */ - cjsCache = new SafeWeakMap(); - /** * The index for assigning unique URLs to anonymous module evaluation */ @@ -524,15 +518,14 @@ let emittedLoaderFlagWarning = false; * A loader instance is used as the main entry point for loading ES modules. Currently, this is a singleton; there is * only one used for loading the main module and everything in its dependency graph, though separate instances of this * class might be instantiated as part of bootstrap for other purposes. - * @param {boolean} useCustomLoadersIfPresent If the user has provided loaders via the --loader flag, use them. * @returns {ModuleLoader} */ -function createModuleLoader(useCustomLoadersIfPresent = true) { +function createModuleLoader() { let customizations = null; - if (useCustomLoadersIfPresent && - // Don't spawn a new worker if we're already in a worker thread created by instantiating CustomizedModuleLoader; - // doing so would cause an infinite loop. - !require('internal/modules/esm/utils').isLoaderWorker()) { + // Don't spawn a new worker if custom loaders are disabled. For instance, if + // we're already in a worker thread created by instantiating + // CustomizedModuleLoader; doing so would cause an infinite loop. + if (!require('internal/modules/esm/utils').forceDefaultLoader()) { const userLoaderPaths = getOptionValue('--experimental-loader'); if (userLoaderPaths.length > 0) { if (!emittedLoaderFlagWarning) { diff --git a/lib/internal/modules/esm/module_job.js b/lib/internal/modules/esm/module_job.js index 83c23456e05f10..33576c5893600b 100644 --- a/lib/internal/modules/esm/module_job.js +++ b/lib/internal/modules/esm/module_job.js @@ -228,7 +228,7 @@ class ModuleJob { const packageConfig = StringPrototypeStartsWith(this.module.url, 'file://') && RegExpPrototypeExec(/\.js(\?[^#]*)?(#.*)?$/, this.module.url) !== null && - require('internal/modules/esm/resolve') + require('internal/modules/package_json_reader') .getPackageScopeConfig(this.module.url); if (packageConfig.type === 'module') { e.message += diff --git a/lib/internal/modules/esm/package_config.js b/lib/internal/modules/esm/package_config.js deleted file mode 100644 index 5da47764c9de2c..00000000000000 --- a/lib/internal/modules/esm/package_config.js +++ /dev/null @@ -1,69 +0,0 @@ -'use strict'; - -const { - StringPrototypeEndsWith, -} = primordials; -const { URL, fileURLToPath } = require('internal/url'); -const packageJsonReader = require('internal/modules/package_json_reader'); - -/** - * @typedef {object} PackageConfig - * @property {string} pjsonPath - The path to the package.json file. - * @property {boolean} exists - Whether the package.json file exists. - * @property {'none' | 'commonjs' | 'module'} type - The type of the package. - * @property {string} [name] - The name of the package. - * @property {string} [main] - The main entry point of the package. - * @property {PackageTarget} [exports] - The exports configuration of the package. - * @property {Record>} [imports] - The imports configuration of the package. - */ -/** - * @typedef {string | string[] | Record>} PackageTarget - */ - -/** - * Returns the package configuration for the given resolved URL. - * @param {URL | string} resolved - The resolved URL. - * @returns {PackageConfig} - The package configuration. - */ -function getPackageScopeConfig(resolved) { - let packageJSONUrl = new URL('./package.json', resolved); - while (true) { - const packageJSONPath = packageJSONUrl.pathname; - if (StringPrototypeEndsWith(packageJSONPath, 'node_modules/package.json')) { - break; - } - const packageConfig = packageJsonReader.read(fileURLToPath(packageJSONUrl), { - __proto__: null, - specifier: resolved, - isESM: true, - }); - if (packageConfig.exists) { - return packageConfig; - } - - const lastPackageJSONUrl = packageJSONUrl; - packageJSONUrl = new URL('../package.json', packageJSONUrl); - - // Terminates at root where ../package.json equals ../../package.json - // (can't just check "/package.json" for Windows support). - if (packageJSONUrl.pathname === lastPackageJSONUrl.pathname) { - break; - } - } - const packageJSONPath = fileURLToPath(packageJSONUrl); - return { - __proto__: null, - pjsonPath: packageJSONPath, - exists: false, - main: undefined, - name: undefined, - type: 'none', - exports: undefined, - imports: undefined, - }; -} - - -module.exports = { - getPackageScopeConfig, -}; diff --git a/lib/internal/modules/esm/resolve.js b/lib/internal/modules/esm/resolve.js index 58e7df07ca5275..54cdbe8e6175ad 100644 --- a/lib/internal/modules/esm/resolve.js +++ b/lib/internal/modules/esm/resolve.js @@ -3,11 +3,10 @@ const { ArrayIsArray, ArrayPrototypeJoin, - ArrayPrototypeShift, + ArrayPrototypeMap, JSONStringify, ObjectGetOwnPropertyNames, ObjectPrototypeHasOwnProperty, - RegExp, RegExpPrototypeExec, RegExpPrototypeSymbolReplace, SafeMap, @@ -21,6 +20,7 @@ const { StringPrototypeSlice, StringPrototypeSplit, StringPrototypeStartsWith, + encodeURIComponent, } = primordials; const internalFS = require('internal/fs/utils'); const { BuiltinModule } = require('internal/bootstrap/realm'); @@ -30,7 +30,7 @@ const { getOptionValue } = require('internal/options'); const policy = getOptionValue('--experimental-policy') ? require('internal/process/policy') : null; -const { sep, relative, toNamespacedPath, resolve } = require('path'); +const { sep, posix: { relative: relativePosixPath }, toNamespacedPath, resolve } = require('path'); const preserveSymlinks = getOptionValue('--preserve-symlinks'); const preserveSymlinksMain = getOptionValue('--preserve-symlinks-main'); const experimentalNetworkImports = @@ -55,7 +55,6 @@ const { } = require('internal/errors').codes; const { Module: CJSModule } = require('internal/modules/cjs/loader'); -const { getPackageScopeConfig } = require('internal/modules/esm/package_config'); const { getConditionsSet } = require('internal/modules/esm/utils'); const packageJsonReader = require('internal/modules/package_json_reader'); const { internalModuleStat } = internalBinding('fs'); @@ -75,6 +74,9 @@ const emittedPackageWarnings = new SafeSet(); * @param {string} base - The URL of the module that imported the package. */ function emitTrailingSlashPatternDeprecation(match, pjsonUrl, base) { + if (process.noDeprecation) { + return; + } const pjsonPath = fileURLToPath(pjsonUrl); if (emittedPackageWarnings.has(pjsonPath + '|' + match)) { return; } emittedPackageWarnings.add(pjsonPath + '|' + match); @@ -101,6 +103,9 @@ const doubleSlashRegEx = /[/\\][/\\]/; * @param {boolean} isTarget - Whether the target is a module. */ function emitInvalidSegmentDeprecation(target, request, match, pjsonUrl, internal, base, isTarget) { + if (process.noDeprecation) { + return; + } const pjsonPath = fileURLToPath(pjsonUrl); const double = RegExpPrototypeExec(doubleSlashRegEx, isTarget ? target : request) !== null; process.emitWarning( @@ -123,6 +128,9 @@ function emitInvalidSegmentDeprecation(target, request, match, pjsonUrl, interna * @param {string} [main] - The "main" field from the package.json file. */ function emitLegacyIndexDeprecation(url, packageJSONUrl, base, main) { + if (process.noDeprecation) { + return; + } const format = defaultGetFormatWithoutErrors(url); if (format !== 'module') { return; } const path = fileURLToPath(url); @@ -189,7 +197,7 @@ const legacyMainResolveExtensionsIndexes = { * 4. TRY(pkg_url/index.js, pkg_url/index.json, pkg_url/index.node) * 5. NOT_FOUND * @param {URL} packageJSONUrl - * @param {PackageConfig} packageConfig + * @param {import('typings/internalBinding/modules').PackageConfig} packageConfig * @param {string | URL | undefined} base * @returns {URL} */ @@ -493,7 +501,7 @@ function resolvePackageTarget(packageJSONUrl, target, subpath, packageSubpath, } return resolveResult; } - if (lastException === undefined || lastException === null) { + if (lastException == null) { return lastException; } throw lastException; @@ -566,7 +574,7 @@ function isConditionalExportsMainSugar(exports, packageJSONUrl, base) { */ function packageExportsResolve( packageJSONUrl, packageSubpath, packageConfig, base, conditions) { - let exports = packageConfig.exports; + let { exports } = packageConfig; if (isConditionalExportsMainSugar(exports, packageJSONUrl, base)) { exports = { '.': exports }; } @@ -678,7 +686,7 @@ function packageImportsResolve(name, base, conditions) { throw new ERR_INVALID_MODULE_SPECIFIER(name, reason, fileURLToPath(base)); } let packageJSONUrl; - const packageConfig = getPackageScopeConfig(base); + const packageConfig = packageJsonReader.getPackageScopeConfig(base); if (packageConfig.exists) { packageJSONUrl = pathToFileURL(packageConfig.pjsonPath); const imports = packageConfig.imports; @@ -731,15 +739,6 @@ function packageImportsResolve(name, base, conditions) { throw importNotDefined(name, packageJSONUrl, base); } -/** - * Returns the package type for a given URL. - * @param {URL} url - The URL to get the package type for. - */ -function getPackageType(url) { - const packageConfig = getPackageScopeConfig(url); - return packageConfig.type; -} - /** * Parse a package name from a specifier. * @param {string} specifier - The import specifier. @@ -787,6 +786,7 @@ function parsePackageName(specifier, base) { * @returns {URL} - The resolved URL. */ function packageResolve(specifier, base, conditions) { + // TODO(@anonrig): Move this to a C++ function. if (BuiltinModule.canBeRequiredWithoutScheme(specifier)) { return new URL('node:' + specifier); } @@ -795,7 +795,7 @@ function packageResolve(specifier, base, conditions) { parsePackageName(specifier, base); // ResolveSelf - const packageConfig = getPackageScopeConfig(base); + const packageConfig = packageJsonReader.getPackageScopeConfig(base); if (packageConfig.exists) { const packageJSONUrl = pathToFileURL(packageConfig.pjsonPath); if (packageConfig.exports != null && packageConfig.name === packageName) { @@ -912,6 +912,7 @@ function moduleResolve(specifier, base, conditions, preserveSymlinks) { * Try to resolve an import as a CommonJS module. * @param {string} specifier - The specifier to resolve. * @param {string} parentURL - The base URL. + * @returns {string | Buffer | false} */ function resolveAsCommonJS(specifier, parentURL) { try { @@ -924,29 +925,38 @@ function resolveAsCommonJS(specifier, parentURL) { // If it is a relative specifier return the relative path // to the parent if (isRelativeSpecifier(specifier)) { - found = relative(parent, found); - // Add '.separator if the path does not start with '..separator' + const foundURL = pathToFileURL(found).pathname; + found = relativePosixPath( + StringPrototypeSlice(parentURL, 'file://'.length, StringPrototypeLastIndexOf(parentURL, '/')), + foundURL); + + // Add './' if the path does not start with '../' // This should be a safe assumption because when loading // esm modules there should be always a file specified so // there should not be a specifier like '..' or '.' - if (!StringPrototypeStartsWith(found, `..${sep}`)) { - found = `.${sep}${found}`; + if (!StringPrototypeStartsWith(found, '../')) { + found = `./${found}`; } } else if (isBareSpecifier(specifier)) { // If it is a bare specifier return the relative path within the // module - const pkg = StringPrototypeSplit(specifier, '/')[0]; - const index = StringPrototypeIndexOf(found, pkg); + const i = StringPrototypeIndexOf(specifier, '/'); + const pkg = i === -1 ? specifier : StringPrototypeSlice(specifier, 0, i); + const needle = `${sep}node_modules${sep}${pkg}${sep}`; + const index = StringPrototypeLastIndexOf(found, needle); if (index !== -1) { - found = StringPrototypeSlice(found, index); + found = pkg + '/' + ArrayPrototypeJoin( + ArrayPrototypeMap( + StringPrototypeSplit(StringPrototypeSlice(found, index + needle.length), sep), + // Escape URL-special characters to avoid generating a incorrect suggestion + encodeURIComponent, + ), + '/', + ); + } else { + found = `${pathToFileURL(found)}`; } } - // Normalize the path separator to give a valid suggestion - // on Windows - if (process.platform === 'win32') { - found = RegExpPrototypeSymbolReplace(new RegExp(`\\${sep}`, 'g'), - found, '/'); - } return found; } catch { return false; @@ -1154,14 +1164,14 @@ function defaultResolve(specifier, context = {}) { */ function decorateErrorWithCommonJSHints(error, specifier, parentURL) { const found = resolveAsCommonJS(specifier, parentURL); - if (found) { + if (found && found !== specifier) { // Don't suggest the same input the user provided. // Modify the stack and message string to include the hint - const lines = StringPrototypeSplit(error.stack, '\n'); - const hint = `Did you mean to import ${found}?`; + const endOfFirstLine = StringPrototypeIndexOf(error.stack, '\n'); + const hint = `Did you mean to import ${JSONStringify(found)}?`; error.stack = - ArrayPrototypeShift(lines) + '\n' + - hint + '\n' + - ArrayPrototypeJoin(lines, '\n'); + StringPrototypeSlice(error.stack, 0, endOfFirstLine) + '\n' + + hint + + StringPrototypeSlice(error.stack, endOfFirstLine); error.message += `\n${hint}`; } } @@ -1170,8 +1180,6 @@ module.exports = { decorateErrorWithCommonJSHints, defaultResolve, encodedSepRegEx, - getPackageScopeConfig, - getPackageType, packageExportsResolve, packageImportsResolve, throwIfInvalidParentURL, diff --git a/lib/internal/modules/esm/translators.js b/lib/internal/modules/esm/translators.js index 5627d98cf294d0..4ecf862be9ea7b 100644 --- a/lib/internal/modules/esm/translators.js +++ b/lib/internal/modules/esm/translators.js @@ -15,6 +15,7 @@ const { StringPrototypeReplaceAll, StringPrototypeSlice, StringPrototypeStartsWith, + Symbol, SyntaxErrorPrototype, globalThis: { WebAssembly }, } = primordials; @@ -29,17 +30,19 @@ function lazyTypes() { return _TYPES = require('internal/util/types'); } +const { containsModuleSyntax } = internalBinding('contextify'); +const { BuiltinModule } = require('internal/bootstrap/realm'); const assert = require('internal/assert'); const { readFileSync } = require('fs'); const { dirname, extname, isAbsolute } = require('path'); const { - hasEsmSyntax, loadBuiltinModule, stripBOM, } = require('internal/modules/helpers'); const { Module: CJSModule, cjsParseCache, + cjsExportsCache, } = require('internal/modules/cjs/loader'); const { fileURLToPath, pathToFileURL, URL } = require('internal/url'); let debug = require('internal/util/debuglog').debuglog('esm', (fn) => { @@ -57,6 +60,17 @@ const asyncESM = require('internal/process/esm_loader'); const { emitWarningSync } = require('internal/process/warning'); const { internalCompileFunction } = require('internal/vm'); +// Lazy-loading to avoid circular dependencies. +let getSourceSync; +/** + * @param {Parameters[0]} url + * @returns {ReturnType} + */ +function getSource(url) { + getSourceSync ??= require('internal/modules/esm/load').getSourceSync; + return getSourceSync(url); +} + /** @type {import('deps/cjs-module-lexer/lexer.js').parse} */ let cjsParse; /** @@ -115,7 +129,7 @@ function assertBufferSource(body, allowString, hookName) { */ function stringify(body) { if (typeof body === 'string') { return body; } - assertBufferSource(body, false, 'transformSource'); + assertBufferSource(body, false, 'load'); const { TextDecoder } = require('internal/encoding'); DECODER = DECODER === null ? new TextDecoder() : DECODER; return DECODER.decode(body); @@ -165,11 +179,11 @@ translators.set('module', async function moduleStrategy(url, source, isMain) { * Provide a more informative error for CommonJS imports. * @param {Error | any} err * @param {string} [content] Content of the file, if known. - * @param {string} [filename] Useful only if `content` is unknown. + * @param {string} [filename] The filename of the erroring module. */ function enrichCJSError(err, content, filename) { if (err != null && ObjectGetPrototypeOf(err) === SyntaxErrorPrototype && - hasEsmSyntax(content || readFileSync(filename, 'utf-8'))) { + containsModuleSyntax(content, filename)) { // Emit the warning synchronously because we are in the middle of handling // a SyntaxError that will throw and likely terminate the process before an // asynchronous warning would be emitted. @@ -192,21 +206,31 @@ function enrichCJSError(err, content, filename) { */ function loadCJSModule(module, source, url, filename) { let compiledWrapper; + async function importModuleDynamically(specifier, _, importAttributes) { + return asyncESM.esmLoader.import(specifier, url, importAttributes); + } try { - compiledWrapper = internalCompileFunction(source, [ - 'exports', - 'require', - 'module', - '__filename', - '__dirname', - ], { - filename, - importModuleDynamically(specifier, _, importAttributes) { - return asyncESM.esmLoader.import(specifier, url, importAttributes); - }, - }).function; + compiledWrapper = internalCompileFunction( + source, // code, + filename, // filename + 0, // lineOffset + 0, // columnOffset, + undefined, // cachedData + false, // produceCachedData + undefined, // parsingContext + undefined, // contextExtensions + [ // params + 'exports', + 'require', + 'module', + '__filename', + '__dirname', + ], + Symbol(`cjs:${filename}`), // hostDefinedOptionsId + importModuleDynamically, // importModuleDynamically + ).function; } catch (err) { - enrichCJSError(err, source, url); + enrichCJSError(err, source, filename); throw err; } @@ -214,21 +238,19 @@ function loadCJSModule(module, source, url, filename) { // eslint-disable-next-line func-name-matching,func-style const requireFn = function require(specifier) { let importAttributes = kEmptyObject; - if (!StringPrototypeStartsWith(specifier, 'node:')) { + if (!StringPrototypeStartsWith(specifier, 'node:') && !BuiltinModule.normalizeRequirableId(specifier)) { // TODO: do not depend on the monkey-patchable CJS loader here. const path = CJSModule._resolveFilename(specifier, module); - if (specifier !== path) { - switch (extname(path)) { - case '.json': - importAttributes = { __proto__: null, type: 'json' }; - break; - case '.node': - return CJSModule._load(specifier, module); - default: + switch (extname(path)) { + case '.json': + importAttributes = { __proto__: null, type: 'json' }; + break; + case '.node': + return CJSModule._load(specifier, module); + default: // fall through - } - specifier = `${pathToFileURL(path)}`; } + specifier = `${pathToFileURL(path)}`; } const job = asyncESM.esmLoader.getModuleJobSync(specifier, url, importAttributes); job.runSync(); @@ -265,7 +287,10 @@ function createCJSModuleWrap(url, source, isMain, loadCJS = loadCJSModule) { debug(`Translating CJSModule ${url}`); const filename = StringPrototypeStartsWith(url, 'file://') ? fileURLToPath(url) : url; - source = stringify(source); + // In case the source was not provided by the `load` step, we need fetch it now. + source = stringify(source ?? getSource(new URL(url)).source); + + maybeCacheSourceMap(url, source); const { exportNames, module } = cjsPreparseModuleExports(filename, source); cjsCache.set(url, module); @@ -284,9 +309,9 @@ function createCJSModuleWrap(url, source, isMain, loadCJS = loadCJSModule) { } let exports; - if (asyncESM.esmLoader.cjsCache.has(module)) { - exports = asyncESM.esmLoader.cjsCache.get(module); - asyncESM.esmLoader.cjsCache.delete(module); + if (cjsExportsCache.has(module)) { + exports = cjsExportsCache.get(module); + cjsExportsCache.delete(module); } else { ({ exports } = module); } @@ -333,7 +358,7 @@ translators.set('commonjs', async function commonjsStrategy(url, source, assert(module === CJSModule._cache[filename]); CJSModule._load(filename); } catch (err) { - enrichCJSError(err, source, url); + enrichCJSError(err, source, filename); throw err; } } : loadCJSModule; diff --git a/lib/internal/modules/esm/utils.js b/lib/internal/modules/esm/utils.js index cbb583ede526b5..df15169f68faa1 100644 --- a/lib/internal/modules/esm/utils.js +++ b/lib/internal/modules/esm/utils.js @@ -4,6 +4,7 @@ const { ArrayIsArray, SafeSet, SafeWeakMap, + Symbol, ObjectFreeze, } = primordials; @@ -14,9 +15,11 @@ const { } = internalBinding('util'); const { default_host_defined_options, + vm_dynamic_import_missing_flag, } = internalBinding('symbols'); const { + ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING_FLAG, ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING, ERR_INVALID_ARG_VALUE, } = require('internal/errors').codes; @@ -111,6 +114,16 @@ function getConditionsSet(conditions) { */ const moduleRegistries = new SafeWeakMap(); +/** + * @typedef {ContextifyScript|Function|ModuleWrap|ContextifiedObject} Referrer + * A referrer can be a Script Record, a Cyclic Module Record, or a Realm Record + * as defined in https://tc39.es/ecma262/#sec-HostLoadImportedModule. + * + * In Node.js, a referrer is represented by a wrapper object of these records. + * A referrer object has a field |host_defined_option_symbol| initialized with + * a symbol. + */ + /** * V8 would make sure that as long as import() can still be initiated from * the referrer, the symbol referenced by |host_defined_option_symbol| should @@ -125,14 +138,15 @@ const moduleRegistries = new SafeWeakMap(); * referrer wrap is still around and can be passed into the callbacks. * 2 is only there so that we can get the id symbol to configure the * weak map. - * @param {ModuleWrap|ContextifyScript|Function} referrer The referrer to + * @param {Referrer} referrer The referrer to * get the id symbol from. This is different from callbackReferrer which * could be set by the caller. * @param {ModuleRegistry} registry */ function registerModule(referrer, registry) { const idSymbol = referrer[host_defined_option_symbol]; - if (idSymbol === default_host_defined_options) { + if (idSymbol === default_host_defined_options || + idSymbol === vm_dynamic_import_missing_flag) { // The referrer is compiled without custom callbacks, so there is // no registry to hold on to. We'll throw // ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING when a callback is @@ -144,6 +158,26 @@ function registerModule(referrer, registry) { moduleRegistries.set(idSymbol, registry); } +/** + * Registers the ModuleRegistry for dynamic import() calls with a realm + * as the referrer. Similar to {@link registerModule}, but this function + * generates a new id symbol instead of using the one from the referrer + * object. + * @param {globalThis} globalThis The globalThis object of the realm. + * @param {ModuleRegistry} registry + */ +function registerRealm(globalThis, registry) { + let idSymbol = globalThis[host_defined_option_symbol]; + // If the per-realm host-defined options is already registered, do nothing. + if (idSymbol) { + return; + } + // Otherwise, register the per-realm host-defined options. + idSymbol = Symbol('Realm globalThis'); + globalThis[host_defined_option_symbol] = idSymbol; + moduleRegistries.set(idSymbol, registry); +} + /** * Defines the `import.meta` object for a given module. * @param {symbol} symbol - Reference to the module. @@ -160,44 +194,48 @@ function initializeImportMetaObject(symbol, meta) { /** * Asynchronously imports a module dynamically using a callback function. The native callback. - * @param {symbol} symbol - Reference to the module. + * @param {symbol} referrerSymbol - Referrer symbol of the registered script, function, module, or contextified object. * @param {string} specifier - The module specifier string. * @param {Record} attributes - The import attributes object. * @returns {Promise} - The imported module object. * @throws {ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING} - If the callback function is missing. */ -async function importModuleDynamicallyCallback(symbol, specifier, attributes) { - if (moduleRegistries.has(symbol)) { - const { importModuleDynamically, callbackReferrer } = moduleRegistries.get(symbol); +async function importModuleDynamicallyCallback(referrerSymbol, specifier, attributes) { + if (moduleRegistries.has(referrerSymbol)) { + const { importModuleDynamically, callbackReferrer } = moduleRegistries.get(referrerSymbol); if (importModuleDynamically !== undefined) { return importModuleDynamically(specifier, callbackReferrer, attributes); } } + if (referrerSymbol === vm_dynamic_import_missing_flag) { + throw new ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING_FLAG(); + } throw new ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING(); } -let _isLoaderWorker = false; +let _forceDefaultLoader = false; /** * Initializes handling of ES modules. * This is configured during pre-execution. Specifically it's set to true for * the loader worker in internal/main/worker_thread.js. - * @param {boolean} [isLoaderWorker=false] - A boolean indicating whether the loader is a worker or not. + * @param {boolean} [forceDefaultLoader=false] - A boolean indicating disabling custom loaders. */ -function initializeESM(isLoaderWorker = false) { - _isLoaderWorker = isLoaderWorker; +function initializeESM(forceDefaultLoader = false) { + _forceDefaultLoader = forceDefaultLoader; initializeDefaultConditions(); - // Setup per-isolate callbacks that locate data or callbacks that we keep + // Setup per-realm callbacks that locate data or callbacks that we keep // track of for different ESM modules. setInitializeImportMetaObjectCallback(initializeImportMetaObject); setImportModuleDynamicallyCallback(importModuleDynamicallyCallback); } /** - * Determine whether the current process is a loader worker. - * @returns {boolean} Whether the current process is a loader worker. + * Determine whether custom loaders are disabled and it is forced to use the + * default loader. + * @returns {boolean} */ -function isLoaderWorker() { - return _isLoaderWorker; +function forceDefaultLoader() { + return _forceDefaultLoader; } /** @@ -235,10 +273,11 @@ async function initializeHooks() { module.exports = { registerModule, + registerRealm, initializeESM, initializeHooks, getDefaultConditions, getConditionsSet, loaderWorkerId: 'internal/modules/esm/worker', - isLoaderWorker, + forceDefaultLoader, }; diff --git a/lib/internal/modules/helpers.js b/lib/internal/modules/helpers.js index 7f2959cc469dc1..6b30a1d8c76d4b 100644 --- a/lib/internal/modules/helpers.js +++ b/lib/internal/modules/helpers.js @@ -3,7 +3,6 @@ const { ArrayPrototypeForEach, ArrayPrototypeJoin, - ArrayPrototypeSome, ObjectDefineProperty, ObjectPrototypeHasOwnProperty, SafeMap, @@ -299,32 +298,10 @@ function normalizeReferrerURL(referrer) { return new URL(referrer).href; } -/** - * For error messages only, check if ESM syntax is in use. - * @param {string} code - */ -function hasEsmSyntax(code) { - debug('Checking for ESM syntax'); - const parser = require('internal/deps/acorn/acorn/dist/acorn').Parser; - let root; - try { - root = parser.parse(code, { sourceType: 'module', ecmaVersion: 'latest' }); - } catch { - return false; - } - - return ArrayPrototypeSome(root.body, (stmt) => - stmt.type === 'ExportDefaultDeclaration' || - stmt.type === 'ExportNamedDeclaration' || - stmt.type === 'ImportDeclaration' || - stmt.type === 'ExportAllDeclaration'); -} - module.exports = { addBuiltinLibsToObject, getCjsConditions, initializeCjsConditions, - hasEsmSyntax, loadBuiltinModule, makeRequireFunction, normalizeReferrerURL, diff --git a/lib/internal/modules/package_json_reader.js b/lib/internal/modules/package_json_reader.js index 65f5ce3551bbd0..0842d543862c33 100644 --- a/lib/internal/modules/package_json_reader.js +++ b/lib/internal/modules/package_json_reader.js @@ -1,162 +1,191 @@ 'use strict'; const { + ArrayIsArray, JSONParse, - ObjectPrototypeHasOwnProperty, - SafeMap, - StringPrototypeEndsWith, - StringPrototypeIndexOf, - StringPrototypeLastIndexOf, StringPrototypeSlice, + StringPrototypeLastIndexOf, + ObjectDefineProperty, } = primordials; -const { - ERR_INVALID_PACKAGE_CONFIG, -} = require('internal/errors').codes; -const { internalModuleReadJSON } = internalBinding('fs'); -const { resolve, sep, toNamespacedPath } = require('path'); -const permission = require('internal/process/permission'); -const { kEmptyObject, setOwnProperty } = require('internal/util'); - -const { fileURLToPath, pathToFileURL } = require('internal/url'); - -const cache = new SafeMap(); +const modulesBinding = internalBinding('modules'); +const { resolve, sep } = require('path'); +const { kEmptyObject } = require('internal/util'); +const { pathToFileURL } = require('internal/url'); let manifest; /** - * @typedef {{ - * exists: boolean, - * pjsonPath: string, - * exports?: string | string[] | Record, - * imports?: string | string[] | Record, - * name?: string, - * main?: string, - * type: 'commonjs' | 'module' | 'none', - * }} PackageConfig + * @param {string} jsonPath + * @param {string} value The integrity value to check against. + */ +function checkPackageJSONIntegrity(jsonPath, value) { + if (manifest === undefined) { + const { getOptionValue } = require('internal/options'); + manifest = getOptionValue('--experimental-policy') ? + require('internal/process/policy').manifest : + null; + } + if (manifest !== null) { + const jsonURL = pathToFileURL(jsonPath); + manifest.assertIntegrity(jsonURL, value); + } +} + +/** + * @param {string} path + * @param {import('typings/internalBinding/modules').SerializedPackageConfig} contents + * @param {boolean} [checkIntegrity=false] Whether to check the integrity of the package.json file. + * @returns {import('typings/internalBinding/modules').PackageConfig} */ +function deserializePackageJSON(path, contents, checkIntegrity = false) { + if (contents === undefined) { + return { + __proto__: null, + exists: false, + pjsonPath: path, + type: 'none', // Ignore unknown types for forwards compatibility + }; + } + + let pjsonPath = path; + const { + 0: name, + 1: main, + 2: type, + 3: plainImports, + 4: plainExports, + 5: manifest, + 6: optionalFilePath, + } = contents; + + // This is required to be used in getPackageScopeConfig. + if (optionalFilePath) { + pjsonPath = optionalFilePath; + } + + if (checkIntegrity) { + // parsed[5] is only available when experimental policy is enabled. + checkPackageJSONIntegrity(pjsonPath, manifest); + } + + // The imports and exports fields can be either undefined or a string. + // - If it's a string, it's either plain string or a stringified JSON string. + // - If it's a stringified JSON string, it starts with either '[' or '{'. + const requiresJSONParse = (value) => (value !== undefined && (value[0] === '[' || value[0] === '{')); + + return { + __proto__: null, + exists: true, + pjsonPath, + name, + main, + type, + // This getters are used to lazily parse the imports and exports fields. + get imports() { + const value = requiresJSONParse(plainImports) ? JSONParse(plainImports) : plainImports; + ObjectDefineProperty(this, 'imports', { __proto__: null, value }); + return this.imports; + }, + get exports() { + const value = requiresJSONParse(plainExports) ? JSONParse(plainExports) : plainExports; + ObjectDefineProperty(this, 'exports', { __proto__: null, value }); + return this.exports; + }, + }; +} /** + * Reads a package.json file and returns the parsed contents. * @param {string} jsonPath * @param {{ - * base?: string, - * specifier: string, - * isESM: boolean, + * base?: URL | string, + * specifier?: URL | string, + * isESM?: boolean, * }} options - * @returns {PackageConfig} + * @returns {import('typings/internalBinding/modules').PackageConfig} */ function read(jsonPath, { base, specifier, isESM } = kEmptyObject) { - if (cache.has(jsonPath)) { - return cache.get(jsonPath); - } - - const string = internalModuleReadJSON( - toNamespacedPath(jsonPath), + // This function will be called by both CJS and ESM, so we need to make sure + // non-null attributes are converted to strings. + const parsed = modulesBinding.readPackageJSON( + jsonPath, + isESM, + base == null ? undefined : `${base}`, + specifier == null ? undefined : `${specifier}`, ); - const result = { - __proto__: null, - exists: false, - pjsonPath: jsonPath, - main: undefined, - name: undefined, - type: 'none', // Ignore unknown types for forwards compatibility - exports: undefined, - imports: undefined, - }; - if (string !== undefined) { - let parsed; - try { - parsed = JSONParse(string); - } catch (cause) { - const error = new ERR_INVALID_PACKAGE_CONFIG( - jsonPath, - isESM && (base ? `"${specifier}" from ` : '') + fileURLToPath(base || specifier), - cause.message, - ); - setOwnProperty(error, 'cause', cause); - throw error; - } - - result.exists = true; - - // ObjectPrototypeHasOwnProperty is used to avoid prototype pollution. - if (ObjectPrototypeHasOwnProperty(parsed, 'name') && typeof parsed.name === 'string') { - result.name = parsed.name; - } - - if (ObjectPrototypeHasOwnProperty(parsed, 'main') && typeof parsed.main === 'string') { - result.main = parsed.main; - } - - if (ObjectPrototypeHasOwnProperty(parsed, 'exports')) { - result.exports = parsed.exports; - } - - if (ObjectPrototypeHasOwnProperty(parsed, 'imports')) { - result.imports = parsed.imports; - } - - // Ignore unknown types for forwards compatibility - if (ObjectPrototypeHasOwnProperty(parsed, 'type') && (parsed.type === 'commonjs' || parsed.type === 'module')) { - result.type = parsed.type; - } - - if (manifest === undefined) { - const { getOptionValue } = require('internal/options'); - manifest = getOptionValue('--experimental-policy') ? - require('internal/process/policy').manifest : - null; - } - if (manifest !== null) { - const jsonURL = pathToFileURL(jsonPath); - manifest.assertIntegrity(jsonURL, string); - } - } - cache.set(jsonPath, result); - return result; + return deserializePackageJSON(jsonPath, parsed, true /* checkIntegrity */); } /** + * @deprecated Expected to be removed in favor of `read` in the future. + * Behaves the same was as `read`, but appends package.json to the path. * @param {string} requestPath * @return {PackageConfig} */ function readPackage(requestPath) { + // TODO(@anonrig): Remove this function. return read(resolve(requestPath, 'package.json')); } /** * Get the nearest parent package.json file from a given path. - * Return the package.json data and the path to the package.json file, or false. + * Return the package.json data and the path to the package.json file, or undefined. * @param {string} checkPath The path to start searching from. + * @returns {undefined | {data: import('typings/internalBinding/modules').PackageConfig, path: string}} + */ +function getNearestParentPackageJSON(checkPath) { + const result = modulesBinding.getNearestParentPackageJSON(checkPath); + + if (result === undefined) { + return undefined; + } + + const data = deserializePackageJSON(checkPath, result, true /* checkIntegrity */); + + // Path should be the root folder of the matched package.json + // For example for ~/path/package.json, it should be ~/path + const path = StringPrototypeSlice(data.pjsonPath, 0, StringPrototypeLastIndexOf(data.pjsonPath, sep)); + + return { data, path }; +} + +/** + * Returns the package configuration for the given resolved URL. + * @param {URL | string} resolved - The resolved URL. + * @returns {import('typings/internalBinding/modules').PackageConfig} - The package configuration. + */ +function getPackageScopeConfig(resolved) { + const result = modulesBinding.getPackageScopeConfig(`${resolved}`); + + if (ArrayIsArray(result)) { + return deserializePackageJSON(`${resolved}`, result, false /* checkIntegrity */); + } + + // This means that the response is a string + // and it is the path to the package.json file + return { + __proto__: null, + pjsonPath: result, + exists: false, + type: 'none', + }; +} + +/** + * Returns the package type for a given URL. + * @param {URL} url - The URL to get the package type for. */ -function readPackageScope(checkPath) { - const rootSeparatorIndex = StringPrototypeIndexOf(checkPath, sep); - let separatorIndex; - const enabledPermission = permission.isEnabled(); - do { - separatorIndex = StringPrototypeLastIndexOf(checkPath, sep); - checkPath = StringPrototypeSlice(checkPath, 0, separatorIndex); - // Stop the search when the process doesn't have permissions - // to walk upwards - if (enabledPermission && !permission.has('fs.read', checkPath + sep)) { - return false; - } - if (StringPrototypeEndsWith(checkPath, sep + 'node_modules')) { - return false; - } - const pjson = readPackage(checkPath + sep); - if (pjson.exists) { - return { - data: pjson, - path: checkPath, - }; - } - } while (separatorIndex > rootSeparatorIndex); - return false; +function getPackageType(url) { + // TODO(@anonrig): Write a C++ function that returns only "type". + return getPackageScopeConfig(url).type; } module.exports = { + checkPackageJSONIntegrity, read, readPackage, - readPackageScope, + getNearestParentPackageJSON, + getPackageScopeConfig, + getPackageType, }; diff --git a/lib/internal/modules/run_main.js b/lib/internal/modules/run_main.js index a9828286a9c0e0..23268637e4fd58 100644 --- a/lib/internal/modules/run_main.js +++ b/lib/internal/modules/run_main.js @@ -4,7 +4,10 @@ const { StringPrototypeEndsWith, } = primordials; +const { containsModuleSyntax } = internalBinding('contextify'); +const { getNearestParentPackageJSONType } = internalBinding('modules'); const { getOptionValue } = require('internal/options'); +const { checkPackageJSONIntegrity } = require('internal/modules/package_json_reader'); const path = require('path'); /** @@ -67,10 +70,27 @@ function shouldUseESMLoader(mainPath) { if (mainPath && StringPrototypeEndsWith(mainPath, '.mjs')) { return true; } if (!mainPath || StringPrototypeEndsWith(mainPath, '.cjs')) { return false; } - const { readPackageScope } = require('internal/modules/package_json_reader'); - const pkg = readPackageScope(mainPath); - // No need to guard `pkg` as it can only be an object or `false`. - return pkg.data?.type === 'module' || getOptionValue('--experimental-default-type') === 'module'; + const response = getNearestParentPackageJSONType(mainPath); + + // No package.json or no `type` field. + if (response === undefined || response[0] === 'none') { + if (getOptionValue('--experimental-detect-module')) { + // If the first argument of `containsModuleSyntax` is undefined, it will read `mainPath` from the file system. + return containsModuleSyntax(undefined, mainPath); + } + return false; + } + + // TODO(@anonrig): Do not return filePath and rawContent if experimental-policy is not used. + const { + 0: type, + 1: filePath, + 2: rawContent, + } = response; + + checkPackageJSONIntegrity(filePath, rawContent); + + return type === 'module'; } /** diff --git a/lib/internal/navigator.js b/lib/internal/navigator.js index 5971891ea73cc9..db956fd02aba57 100644 --- a/lib/internal/navigator.js +++ b/lib/internal/navigator.js @@ -2,9 +2,18 @@ const { ObjectDefineProperties, + StringPrototypeIndexOf, + StringPrototypeSlice, + StringPrototypeToUpperCase, + ObjectFreeze, + globalThis, Symbol, } = primordials; +const { + Intl, +} = globalThis; + const { ERR_ILLEGAL_CONSTRUCTOR, } = require('internal/errors').codes; @@ -18,10 +27,61 @@ const { } = internalBinding('os'); const kInitialize = Symbol('kInitialize'); +const nodeVersion = process.version; + +/** + * @param {object} process + * @param {string} process.platform + * @param {string} process.arch + * @returns {string} + */ +function getNavigatorPlatform(process) { + if (process.platform === 'darwin') { + // On macOS, modern browsers return 'MacIntel' even if running on Apple Silicon. + return 'MacIntel'; + } else if (process.platform === 'win32') { + // On Windows, modern browsers return 'Win32' even if running on a 64-bit version of Windows. + // https://developer.mozilla.org/en-US/docs/Web/API/Navigator/platform#usage_notes + return 'Win32'; + } else if (process.platform === 'linux') { + if (process.arch === 'ia32') { + return 'Linux i686'; + } else if (process.arch === 'x64') { + return 'Linux x86_64'; + } + return `Linux ${process.arch}`; + } else if (process.platform === 'freebsd') { + if (process.arch === 'ia32') { + return 'FreeBSD i386'; + } else if (process.arch === 'x64') { + return 'FreeBSD amd64'; + } + return `FreeBSD ${process.arch}`; + } else if (process.platform === 'openbsd') { + if (process.arch === 'ia32') { + return 'OpenBSD i386'; + } else if (process.arch === 'x64') { + return 'OpenBSD amd64'; + } + return `OpenBSD ${process.arch}`; + } else if (process.platform === 'sunos') { + if (process.arch === 'ia32') { + return 'SunOS i86pc'; + } + return `SunOS ${process.arch}`; + } else if (process.platform === 'aix') { + return 'AIX'; + } + return `${StringPrototypeToUpperCase(process.platform[0])}${StringPrototypeSlice(process.platform, 1)} ${process.arch}`; +} class Navigator { // Private properties are used to avoid brand validations. #availableParallelism; + #userAgent = `Node.js/${StringPrototypeSlice(nodeVersion, 1, StringPrototypeIndexOf(nodeVersion, '.'))}`; + #platform = getNavigatorPlatform(process); + #language = Intl?.Collator().resolvedOptions().locale || 'en-US'; + #languages = ObjectFreeze([this.#language]); constructor() { if (arguments[0] === kInitialize) { @@ -37,13 +97,46 @@ class Navigator { this.#availableParallelism ??= getAvailableParallelism(); return this.#availableParallelism; } + + /** + * @return {string} + */ + get language() { + return this.#language; + } + + /** + * @return {Array} + */ + get languages() { + return this.#languages; + } + + /** + * @return {string} + */ + get userAgent() { + return this.#userAgent; + } + + /** + * @return {string} + */ + get platform() { + return this.#platform; + } } ObjectDefineProperties(Navigator.prototype, { hardwareConcurrency: kEnumerableProperty, + language: kEnumerableProperty, + languages: kEnumerableProperty, + userAgent: kEnumerableProperty, + platform: kEnumerableProperty, }); module.exports = { + getNavigatorPlatform, navigator: new Navigator(kInitialize), Navigator, }; diff --git a/lib/internal/net.js b/lib/internal/net.js index 8b04d5f226eb17..0f2fc5dfff5ea8 100644 --- a/lib/internal/net.js +++ b/lib/internal/net.js @@ -58,7 +58,7 @@ function makeSyncWrite(fd) { const ctx = {}; writeBuffer(fd, chunk, 0, chunk.length, null, undefined, ctx); if (ctx.errno !== undefined) { - const ex = errors.uvException(ctx); + const ex = new errors.UVException(ctx); ex.errno = ctx.errno; return cb(ex); } diff --git a/lib/internal/per_context/primordials.js b/lib/internal/per_context/primordials.js index c4f2b12aff2cba..140c80566c9e6c 100644 --- a/lib/internal/per_context/primordials.js +++ b/lib/internal/per_context/primordials.js @@ -541,11 +541,14 @@ primordials.SafePromiseAllReturnVoid = (promises, mapFn) => new Promise((resolve, reject) => { let pendingPromises = promises.length; if (pendingPromises === 0) resolve(); + const onFulfilled = () => { + if (--pendingPromises === 0) { + resolve(); + } + }; for (let i = 0; i < promises.length; i++) { const promise = mapFn != null ? mapFn(promises[i], i) : promises[i]; - PromisePrototypeThen(PromiseResolve(promise), () => { - if (--pendingPromises === 0) resolve(); - }, reject); + PromisePrototypeThen(PromiseResolve(promise), onFulfilled, reject); } }); @@ -570,9 +573,17 @@ primordials.SafePromiseAllSettled = (promises, mapFn) => * @param {(v: T|PromiseLike, k: number) => U|PromiseLike} [mapFn] * @returns {Promise} */ -primordials.SafePromiseAllSettledReturnVoid = async (promises, mapFn) => { - await primordials.SafePromiseAllSettled(promises, mapFn); -}; +primordials.SafePromiseAllSettledReturnVoid = (promises, mapFn) => new Promise((resolve) => { + let pendingPromises = promises.length; + if (pendingPromises === 0) resolve(); + const onSettle = () => { + if (--pendingPromises === 0) resolve(); + }; + for (let i = 0; i < promises.length; i++) { + const promise = mapFn != null ? mapFn(promises[i], i) : promises[i]; + PromisePrototypeThen(PromiseResolve(promise), onSettle, onSettle); + } +}); /** * @template T,U diff --git a/lib/internal/perf/usertiming.js b/lib/internal/perf/usertiming.js index ff417d94700550..cb7cfdd8596369 100644 --- a/lib/internal/perf/usertiming.js +++ b/lib/internal/perf/usertiming.js @@ -31,7 +31,7 @@ const { }, } = require('internal/errors'); -const { structuredClone } = require('internal/structured_clone'); +const { structuredClone } = internalBinding('messaging'); const { lazyDOMException, kEnumerableProperty, diff --git a/lib/internal/perf/utils.js b/lib/internal/perf/utils.js index a0b7955c70481c..bbc1c996e318f8 100644 --- a/lib/internal/perf/utils.js +++ b/lib/internal/perf/utils.js @@ -5,6 +5,7 @@ const { NODE_PERFORMANCE_MILESTONE_TIME_ORIGIN, }, milestones, + now, } = internalBinding('performance'); function getTimeOrigin() { @@ -13,12 +14,6 @@ function getTimeOrigin() { return milestones[NODE_PERFORMANCE_MILESTONE_TIME_ORIGIN] / 1e6; } -// Returns the time relative to the process start time in milliseconds. -function now() { - const hr = process.hrtime(); - return (hr[0] * 1000 + hr[1] / 1e6) - getTimeOrigin(); -} - // Returns the milestone relative to the process start time in milliseconds. function getMilestoneTimestamp(milestoneIdx) { const ns = milestones[milestoneIdx]; diff --git a/lib/internal/priority_queue.js b/lib/internal/priority_queue.js index 22f89a90ef07f1..e61cc04c101b7c 100644 --- a/lib/internal/priority_queue.js +++ b/lib/internal/priority_queue.js @@ -38,6 +38,10 @@ module.exports = class PriorityQueue { return this.#heap[1]; } + peekBottom() { + return this.#heap[this.#size]; + } + percolateDown(pos) { const compare = this.#compare; const setPosition = this.#setPosition; diff --git a/lib/internal/process/esm_loader.js b/lib/internal/process/esm_loader.js index a3451ddab307f2..0865d7ceef66b7 100644 --- a/lib/internal/process/esm_loader.js +++ b/lib/internal/process/esm_loader.js @@ -1,9 +1,5 @@ 'use strict'; -const { - SafePromiseAllReturnVoid, -} = primordials; - const { createModuleLoader } = require('internal/modules/esm/loader'); const { getOptionValue } = require('internal/options'); const { @@ -15,19 +11,17 @@ let esmLoader; module.exports = { get esmLoader() { - return esmLoader ??= createModuleLoader(true); + return esmLoader ??= createModuleLoader(); }, async loadESM(callback) { - esmLoader ??= createModuleLoader(true); + esmLoader ??= createModuleLoader(); try { const userImports = getOptionValue('--import'); if (userImports.length > 0) { const parentURL = getCWDURL().href; - await SafePromiseAllReturnVoid(userImports, (specifier) => esmLoader.import( - specifier, - parentURL, - kEmptyObject, - )); + for (let i = 0; i < userImports.length; i++) { + await esmLoader.import(userImports[i], parentURL, kEmptyObject); + } } else { esmLoader.forceLoadHooks(); } diff --git a/lib/internal/process/execution.js b/lib/internal/process/execution.js index 8ae6a1678af1b5..5de5edfb2d5524 100644 --- a/lib/internal/process/execution.js +++ b/lib/internal/process/execution.js @@ -1,6 +1,7 @@ 'use strict'; const { + Symbol, RegExpPrototypeExec, globalThis, } = primordials; @@ -25,7 +26,11 @@ const { emitAfter, popAsyncContext, } = require('internal/async_hooks'); - +const { containsModuleSyntax } = internalBinding('contextify'); +const { getOptionValue } = require('internal/options'); +const { + makeContextifyScript, runScriptInThisContext, +} = require('internal/vm'); // shouldAbortOnUncaughtToggle is a typed array for faster // communication with JS. const { shouldAbortOnUncaughtToggle } = internalBinding('util'); @@ -53,7 +58,6 @@ function evalModule(source, print) { function evalScript(name, body, breakFirstLine, print, shouldLoadESM = false) { const CJSModule = require('internal/modules/cjs/loader').Module; - const { kVmBreakFirstLineSymbol } = require('internal/util'); const { pathToFileURL } = require('internal/url'); const cwd = tryGetCwd(); @@ -68,6 +72,12 @@ function evalScript(name, body, breakFirstLine, print, shouldLoadESM = false) { const baseUrl = pathToFileURL(module.filename).href; const { loadESM } = asyncESM; + if (getOptionValue('--experimental-detect-module') && + getOptionValue('--input-type') === '' && getOptionValue('--experimental-default-type') === '' && + containsModuleSyntax(body, name)) { + return evalModule(body, print); + } + const runScript = () => { // Create wrapper for cache entry const script = ` @@ -79,16 +89,25 @@ function evalScript(name, body, breakFirstLine, print, shouldLoadESM = false) { `; globalThis.__filename = name; RegExpPrototypeExec(/^/, ''); // Necessary to reset RegExp statics before user code runs. - const result = module._compile(script, `${name}-wrapper`)(() => - require('vm').runInThisContext(body, { - filename: name, - displayErrors: true, - [kVmBreakFirstLineSymbol]: !!breakFirstLine, - importModuleDynamically(specifier, _, importAttributes) { - const loader = asyncESM.esmLoader; - return loader.import(specifier, baseUrl, importAttributes); - }, - })); + const result = module._compile(script, `${name}-wrapper`)(() => { + const hostDefinedOptionId = Symbol(name); + async function importModuleDynamically(specifier, _, importAttributes) { + const loader = asyncESM.esmLoader; + return loader.import(specifier, baseUrl, importAttributes); + } + const script = makeContextifyScript( + body, // code + name, // filename, + 0, // lineOffset + 0, // columnOffset, + undefined, // cachedData + false, // produceCachedData + undefined, // parsingContext + hostDefinedOptionId, // hostDefinedOptionId + importModuleDynamically, // importModuleDynamically + ); + return runScriptInThisContext(script, true, !!breakFirstLine); + }); if (print) { const { log } = require('internal/console/global'); log(result); diff --git a/lib/internal/process/per_thread.js b/lib/internal/process/per_thread.js index ce4822af019d5f..9b86f20053da3b 100644 --- a/lib/internal/process/per_thread.js +++ b/lib/internal/process/per_thread.js @@ -28,11 +28,10 @@ const { StringPrototypeStartsWith, Symbol, SymbolIterator, - Uint32Array, } = primordials; const { - errnoException, + ErrnoException, codes: { ERR_ASSERTION, ERR_INVALID_ARG_TYPE, @@ -65,10 +64,10 @@ function refreshHrtimeBuffer() { // The 3 entries filled in by the original process.hrtime contains // the upper/lower 32 bits of the second part of the value, // and the remaining nanoseconds of the value. - hrValues = new Uint32Array(binding.hrtimeBuffer); + hrValues = binding.hrtimeBuffer; // Use a BigUint64Array in the closure because this is actually a bit // faster than simply returning a BigInt from C++ in V8 7.1. - hrBigintValues = new BigUint64Array(binding.hrtimeBuffer, 0, 1); + hrBigintValues = new BigUint64Array(binding.hrtimeBuffer.buffer, 0, 1); } // Create the buffers. @@ -231,7 +230,7 @@ function wrapProcessMethods(binding) { } if (err) - throw errnoException(err, 'kill'); + throw new ErrnoException(err, 'kill'); return true; } diff --git a/lib/internal/process/pre_execution.js b/lib/internal/process/pre_execution.js index 917ba90a1c8bbb..b6bdb4785003f7 100644 --- a/lib/internal/process/pre_execution.js +++ b/lib/internal/process/pre_execution.js @@ -67,6 +67,26 @@ function prepareWorkerThreadExecution() { }); } +function prepareShadowRealmExecution() { + const { registerRealm } = require('internal/modules/esm/utils'); + // Patch the process object with legacy properties and normalizations. + // Do not expand argv1 as it is not available in ShadowRealm. + patchProcessObject(false); + setupDebugEnv(); + + // Disable custom loaders in ShadowRealm. + setupUserModules(true); + registerRealm(globalThis, { + __proto__: null, + importModuleDynamically: (specifier, _referrer, attributes) => { + // The handler for `ShadowRealm.prototype.importValue`. + const { esmLoader } = require('internal/process/esm_loader'); + // `parentURL` is not set in the case of a ShadowRealm top-level import. + return esmLoader.import(specifier, undefined, attributes); + }, + }); +} + function prepareExecution(options) { const { expandArgv1, initializeModules, isMainThread } = options; @@ -77,6 +97,7 @@ function prepareExecution(options) { const mainEntry = patchProcessObject(expandArgv1); setupTraceCategoryState(); setupInspectorHooks(); + setupNavigator(); setupWarningHandler(); setupUndici(); setupWebCrypto(); @@ -160,16 +181,17 @@ function setupSymbolDisposePolyfill() { } } -function setupUserModules(isLoaderWorker = false) { +function setupUserModules(forceDefaultLoader = false) { initializeCJSLoader(); - initializeESMLoader(isLoaderWorker); + initializeESMLoader(forceDefaultLoader); const CJSLoader = require('internal/modules/cjs/loader'); assert(!CJSLoader.hasLoadedAnyUserCJSModule); - // Loader workers are responsible for doing this themselves. - if (isLoaderWorker) { - return; + // Do not enable preload modules if custom loaders are disabled. + // For example, loader workers are responsible for doing this themselves. + // And preload modules are not supported in ShadowRealm as well. + if (!forceDefaultLoader) { + loadPreloadModules(); } - loadPreloadModules(); // Need to be done after --require setup. initializeFrozenIntrinsics(); } @@ -336,6 +358,19 @@ function setupUndici() { } } +// TODO(aduh95): move this to internal/bootstrap/web/* when the CLI flag is +// removed. +function setupNavigator() { + if (getEmbedderOptions().noBrowserGlobals || + getOptionValue('--no-experimental-global-navigator')) { + return; + } + + // https://html.spec.whatwg.org/multipage/system-state.html#the-navigator-object + exposeLazyInterfaces(globalThis, 'internal/navigator', ['Navigator']); + defineReplaceableLazyAttribute(globalThis, 'internal/navigator', ['navigator'], false); +} + // TODO(aduh95): move this to internal/bootstrap/web/* when the CLI flag is // removed. function setupWebCrypto() { @@ -580,6 +615,7 @@ function initializePermission() { 'ExperimentalWarning'); const { has, deny } = require('internal/process/permission'); const warnFlags = [ + '--allow-addons', '--allow-child-process', '--allow-worker', ]; @@ -620,6 +656,7 @@ function initializePermission() { const availablePermissionFlags = [ '--allow-fs-read', '--allow-fs-write', + '--allow-addons', '--allow-child-process', '--allow-worker', ]; @@ -687,9 +724,9 @@ function initializeCJSLoader() { initializeCJS(); } -function initializeESMLoader(isLoaderWorker) { +function initializeESMLoader(forceDefaultLoader) { const { initializeESM } = require('internal/modules/esm/utils'); - initializeESM(isLoaderWorker); + initializeESM(forceDefaultLoader); // Patch the vm module when --experimental-vm-modules is on. // Please update the comments in vm.js when this block changes. @@ -765,6 +802,7 @@ module.exports = { setupUserModules, prepareMainThreadExecution, prepareWorkerThreadExecution, + prepareShadowRealmExecution, markBootstrapComplete, loadPreloadModules, initializeFrozenIntrinsics, diff --git a/lib/internal/process/signal.js b/lib/internal/process/signal.js index 548f19a65c7602..b636a4be086007 100644 --- a/lib/internal/process/signal.js +++ b/lib/internal/process/signal.js @@ -6,7 +6,7 @@ const { } = primordials; const { - errnoException, + ErrnoException, } = require('internal/errors'); const { signals } = internalBinding('constants').os; @@ -33,7 +33,7 @@ function startListeningIfSignal(type) { const err = wrap.start(signum); if (err) { wrap.close(); - throw errnoException(err, 'uv_signal_start'); + throw new ErrnoException(err, 'uv_signal_start'); } signalWraps.set(type, wrap); diff --git a/lib/internal/process/warning.js b/lib/internal/process/warning.js index 3ce00004dab476..9e1e6f7a6a2dde 100644 --- a/lib/internal/process/warning.js +++ b/lib/internal/process/warning.js @@ -6,8 +6,13 @@ const { ErrorPrototypeToString, ErrorCaptureStackTrace, String, + SafeSet, } = primordials; +const { + getOptionValue, +} = require('internal/options'); + const assert = require('internal/assert'); const { codes: { @@ -89,8 +94,21 @@ function doEmitWarning(warning) { process.emit('warning', warning); } +let disableWarningSet; + function onWarning(warning) { + if (!disableWarningSet) { + disableWarningSet = new SafeSet(); + const disableWarningValues = getOptionValue('--disable-warning'); + for (let i = 0; i < disableWarningValues.length; i++) { + disableWarningSet.add(disableWarningValues[i]); + } + } + if ((warning?.code && disableWarningSet.has(warning.code)) || + (warning?.name && disableWarningSet.has(warning.name))) return; + if (!(warning instanceof Error)) return; + const isDeprecation = warning.name === 'DeprecationWarning'; if (isDeprecation && process.noDeprecation) return; const trace = process.traceProcessWarnings || @@ -127,6 +145,11 @@ function onWarning(warning) { // process.emitWarning(str[, type[, code]][, ctor]) // process.emitWarning(str[, options]) function emitWarning(warning, type, code, ctor) { + // Fast path to avoid memory allocation, + // this doesn't eliminate the other if a few lines below + if (process.noDeprecation && type === 'DeprecationWarning') { + return; + } let detail; if (type !== null && typeof type === 'object' && !ArrayIsArray(type)) { ctor = type.ctor; diff --git a/lib/internal/source_map/prepare_stack_trace.js b/lib/internal/source_map/prepare_stack_trace.js index 860564f4a34ab5..568e86f7faaf74 100644 --- a/lib/internal/source_map/prepare_stack_trace.js +++ b/lib/internal/source_map/prepare_stack_trace.js @@ -19,9 +19,6 @@ const { getStringWidth } = require('internal/util/inspect'); const { readFileSync } = require('fs'); const { findSourceMap } = require('internal/source_map/source_map_cache'); const { - kNoOverride, - overrideStackTrace, - maybeOverridePrepareStackTrace, kIsNodeError, } = require('internal/errors'); const { fileURLToPath } = require('internal/url'); @@ -29,20 +26,7 @@ const { setGetSourceMapErrorSource } = internalBinding('errors'); // Create a prettified stacktrace, inserting context from source maps // if possible. -const prepareStackTrace = (globalThis, error, trace) => { - // API for node internals to override error stack formatting - // without interfering with userland code. - // TODO(bcoe): add support for source-maps to repl. - if (overrideStackTrace.has(error)) { - const f = overrideStackTrace.get(error); - overrideStackTrace.delete(error); - return f(error, trace); - } - - const globalOverride = - maybeOverridePrepareStackTrace(globalThis, error, trace); - if (globalOverride !== kNoOverride) return globalOverride; - +function prepareStackTraceWithSourceMaps(error, trace) { let errorString; if (kIsNodeError in error) { errorString = `${error.name} [${error.code}]: ${error.message}`; @@ -57,7 +41,7 @@ const prepareStackTrace = (globalThis, error, trace) => { let lastSourceMap; let lastFileName; const preparedTrace = ArrayPrototypeJoin(ArrayPrototypeMap(trace, (t, i) => { - const str = i !== 0 ? '\n at ' : ''; + const str = '\n at '; try { // A stack trace will often have several call sites in a row within the // same file, cache the source map and file content accordingly: @@ -106,8 +90,8 @@ const prepareStackTrace = (globalThis, error, trace) => { } return `${str}${t}`; }), ''); - return `${errorString}\n at ${preparedTrace}`; -}; + return `${errorString}${preparedTrace}`; +} // Transpilers may have removed the original symbol name used in the stack // trace, if possible restore it from the names field of the source map: @@ -210,5 +194,5 @@ function getSourceMapErrorSource(fileName, lineNumber, columnNumber) { setGetSourceMapErrorSource(getSourceMapErrorSource); module.exports = { - prepareStackTrace, + prepareStackTraceWithSourceMaps, }; diff --git a/lib/internal/source_map/source_map_cache.js b/lib/internal/source_map/source_map_cache.js index 2813da21dfdc63..17da1ca476448f 100644 --- a/lib/internal/source_map/source_map_cache.js +++ b/lib/internal/source_map/source_map_cache.js @@ -1,12 +1,12 @@ 'use strict'; const { - ArrayPrototypeMap, + ArrayPrototypePush, JSONParse, ObjectKeys, RegExpPrototypeExec, - RegExpPrototypeSymbolSplit, SafeMap, + StringPrototypeCodePointAt, StringPrototypeSplit, } = primordials; @@ -19,8 +19,10 @@ let debug = require('internal/util/debuglog').debuglog('source_map', (fn) => { const { validateBoolean } = require('internal/validators'); const { setSourceMapsEnabled: setSourceMapsNative, - setPrepareStackTraceCallback, } = internalBinding('errors'); +const { + setInternalPrepareStackTrace, +} = require('internal/errors'); const { getLazy } = require('internal/util'); // Since the CJS module cache is mutable, which leads to memory leaks when @@ -39,6 +41,7 @@ const kLeadingProtocol = /^\w+:\/\//; const kSourceMappingURLMagicComment = /\/[*/]#\s+sourceMappingURL=(?[^\s]+)/g; const kSourceURLMagicComment = /\/[*/]#\s+sourceURL=(?[^\s]+)/g; +const { isAbsolute } = require('path'); const { fileURLToPath, pathToFileURL, URL } = require('internal/url'); let SourceMap; @@ -55,15 +58,15 @@ function setSourceMapsEnabled(val) { setSourceMapsNative(val); if (val) { const { - prepareStackTrace, + prepareStackTraceWithSourceMaps, } = require('internal/source_map/prepare_stack_trace'); - setPrepareStackTraceCallback(prepareStackTrace); + setInternalPrepareStackTrace(prepareStackTraceWithSourceMaps); } else if (sourceMapsEnabled !== undefined) { // Reset prepare stack trace callback only when disabling source maps. const { - prepareStackTrace, + defaultPrepareStackTrace, } = require('internal/errors'); - setPrepareStackTraceCallback(prepareStackTrace); + setInternalPrepareStackTrace(defaultPrepareStackTrace); } sourceMapsEnabled = val; @@ -205,14 +208,26 @@ function dataFromUrl(sourceURL, sourceMappingURL) { // from. This allows translation from byte offset V8 coverage reports, // to line/column offset Source Map V3. function lineLengths(content) { - // We purposefully keep \r as part of the line-length calculation, in - // cases where there is a \r\n separator, so that this can be taken into - // account in coverage calculations. - return ArrayPrototypeMap(RegExpPrototypeSymbolSplit(/\n|\u2028|\u2029/, content), (line) => { - return line.length; - }); + const contentLength = content.length; + const output = []; + let lineLength = 0; + for (let i = 0; i < contentLength; i++, lineLength++) { + const codePoint = StringPrototypeCodePointAt(content, i); + + // We purposefully keep \r as part of the line-length calculation, in + // cases where there is a \r\n separator, so that this can be taken into + // account in coverage calculations. + // codepoints for \n (new line), \u2028 (line separator) and \u2029 (paragraph separator) + if (codePoint === 10 || codePoint === 0x2028 || codePoint === 0x2029) { + ArrayPrototypePush(output, lineLength); + lineLength = -1; // To not count the matched codePoint such as \n character + } + } + ArrayPrototypePush(output, lineLength); + return output; } + function sourceMapFromFile(mapURL) { try { const fs = require('fs'); @@ -251,9 +266,13 @@ function sourceMapFromDataUrl(sourceURL, url) { // If the sources are not absolute URLs after prepending of the "sourceRoot", // the sources are resolved relative to the SourceMap (like resolving script // src in a html document). +// If the sources are absolute paths, the sources are converted to absolute file URLs. function sourcesToAbsolute(baseURL, data) { data.sources = data.sources.map((source) => { source = (data.sourceRoot || '') + source; + if (isAbsolute(source)) { + return pathToFileURL(source).href; + } return new URL(source, baseURL).href; }); // The sources array is now resolved to absolute URLs, sourceRoot should diff --git a/lib/internal/stream_base_commons.js b/lib/internal/stream_base_commons.js index 1555956affe6c3..b692e3c30c3869 100644 --- a/lib/internal/stream_base_commons.js +++ b/lib/internal/stream_base_commons.js @@ -17,7 +17,7 @@ const { } = internalBinding('stream_wrap'); const { UV_EOF } = internalBinding('uv'); const { - errnoException, + ErrnoException, } = require('internal/errors'); const { owner_symbol } = require('internal/async_hooks').symbols; const { @@ -91,7 +91,7 @@ function onWriteComplete(status) { // TODO (ronag): This should be moved before if(stream.destroyed) // in order to avoid swallowing error. if (status < 0) { - const ex = errnoException(status, 'write', this.error); + const ex = new ErrnoException(status, 'write', this.error); if (typeof this.callback === 'function') this.callback(ex); else @@ -157,7 +157,7 @@ function afterWriteDispatched(req, err, cb) { req.async = !!streamBaseState[kLastWriteWasAsync]; if (err !== 0) - return cb(errnoException(err, 'write', req.error)); + return cb(new ErrnoException(err, 'write', req.error)); if (!req.async && typeof req.callback === 'function') { req.callback(); @@ -194,7 +194,7 @@ function onStreamRead(arrayBuffer) { if (!stream.destroyed) { const err = handle.readStop(); if (err) - stream.destroy(errnoException(err, 'read')); + stream.destroy(new ErrnoException(err, 'read')); } } @@ -214,7 +214,7 @@ function onStreamRead(arrayBuffer) { if (nread !== UV_EOF) { // CallJSOnreadMethod expects the return value to be a buffer. // Ref: https://github.com/nodejs/node/pull/34375 - stream.destroy(errnoException(nread, 'read')); + stream.destroy(new ErrnoException(nread, 'read')); return; } diff --git a/lib/internal/streams/buffer_list.js b/lib/internal/streams/buffer_list.js deleted file mode 100644 index 4629bdbf165e4f..00000000000000 --- a/lib/internal/streams/buffer_list.js +++ /dev/null @@ -1,181 +0,0 @@ -'use strict'; - -const { - StringPrototypeSlice, - SymbolIterator, - TypedArrayPrototypeSet, - Uint8Array, -} = primordials; - -const { Buffer } = require('buffer'); -const { inspect } = require('internal/util/inspect'); - -module.exports = class BufferList { - constructor() { - this.head = null; - this.tail = null; - this.length = 0; - } - - push(v) { - const entry = { data: v, next: null }; - if (this.length > 0) - this.tail.next = entry; - else - this.head = entry; - this.tail = entry; - ++this.length; - } - - unshift(v) { - const entry = { data: v, next: this.head }; - if (this.length === 0) - this.tail = entry; - this.head = entry; - ++this.length; - } - - shift() { - if (this.length === 0) - return; - const ret = this.head.data; - if (this.length === 1) - this.head = this.tail = null; - else - this.head = this.head.next; - --this.length; - return ret; - } - - clear() { - this.head = this.tail = null; - this.length = 0; - } - - join(s) { - if (this.length === 0) - return ''; - let p = this.head; - let ret = '' + p.data; - while ((p = p.next) !== null) - ret += s + p.data; - return ret; - } - - concat(n) { - if (this.length === 0) - return Buffer.alloc(0); - const ret = Buffer.allocUnsafe(n >>> 0); - let p = this.head; - let i = 0; - while (p) { - TypedArrayPrototypeSet(ret, p.data, i); - i += p.data.length; - p = p.next; - } - return ret; - } - - // Consumes a specified amount of bytes or characters from the buffered data. - consume(n, hasStrings) { - const data = this.head.data; - if (n < data.length) { - // `slice` is the same for buffers and strings. - const slice = data.slice(0, n); - this.head.data = data.slice(n); - return slice; - } - if (n === data.length) { - // First chunk is a perfect match. - return this.shift(); - } - // Result spans more than one buffer. - return hasStrings ? this._getString(n) : this._getBuffer(n); - } - - first() { - return this.head.data; - } - - *[SymbolIterator]() { - for (let p = this.head; p; p = p.next) { - yield p.data; - } - } - - // Consumes a specified amount of characters from the buffered data. - _getString(n) { - let ret = ''; - let p = this.head; - let c = 0; - do { - const str = p.data; - if (n > str.length) { - ret += str; - n -= str.length; - } else { - if (n === str.length) { - ret += str; - ++c; - if (p.next) - this.head = p.next; - else - this.head = this.tail = null; - } else { - ret += StringPrototypeSlice(str, 0, n); - this.head = p; - p.data = StringPrototypeSlice(str, n); - } - break; - } - ++c; - } while ((p = p.next) !== null); - this.length -= c; - return ret; - } - - // Consumes a specified amount of bytes from the buffered data. - _getBuffer(n) { - const ret = Buffer.allocUnsafe(n); - const retLen = n; - let p = this.head; - let c = 0; - do { - const buf = p.data; - if (n > buf.length) { - TypedArrayPrototypeSet(ret, buf, retLen - n); - n -= buf.length; - } else { - if (n === buf.length) { - TypedArrayPrototypeSet(ret, buf, retLen - n); - ++c; - if (p.next) - this.head = p.next; - else - this.head = this.tail = null; - } else { - TypedArrayPrototypeSet(ret, - new Uint8Array(buf.buffer, buf.byteOffset, n), - retLen - n); - this.head = p; - p.data = buf.slice(n); - } - break; - } - ++c; - } while ((p = p.next) !== null); - this.length -= c; - return ret; - } - - // Make sure the linked list only shows the minimal necessary information. - [inspect.custom](_, options) { - return inspect(this, { - ...options, - // Only inspect one level. - depth: 0, - // It should not recurse. - customInspect: false, - }); - } -}; diff --git a/lib/internal/streams/destroy.js b/lib/internal/streams/destroy.js index cfb49f2c7c7273..28802cae5eff32 100644 --- a/lib/internal/streams/destroy.js +++ b/lib/internal/streams/destroy.js @@ -15,6 +15,15 @@ const { isDestroyed, isFinished, isServerRequest, + kState, + kErrorEmitted, + kEmitClose, + kClosed, + kCloseEmitted, + kConstructed, + kDestroyed, + kAutoDestroy, + kErrored, } = require('internal/streams/utils'); const kDestroy = Symbol('kDestroy'); @@ -42,7 +51,10 @@ function destroy(err, cb) { // With duplex streams we use the writable side for state. const s = w || r; - if (w?.destroyed || r?.destroyed) { + if ( + (w && (w[kState] & kDestroyed) !== 0) || + (r && (r[kState] & kDestroyed) !== 0) + ) { if (typeof cb === 'function') { cb(); } @@ -56,14 +68,14 @@ function destroy(err, cb) { checkError(err, w, r); if (w) { - w.destroyed = true; + w[kState] |= kDestroyed; } if (r) { - r.destroyed = true; + r[kState] |= kDestroyed; } // If still constructing then defer calling _destroy. - if (!s.constructed) { + if ((s[kState] & kConstructed) === 0) { this.once(kDestroy, function(er) { _destroy(this, aggregateTwoErrors(er, err), cb); }); @@ -89,10 +101,10 @@ function _destroy(self, err, cb) { checkError(err, w, r); if (w) { - w.closed = true; + w[kState] |= kClosed; } if (r) { - r.closed = true; + r[kState] |= kClosed; } if (typeof cb === 'function') { @@ -122,13 +134,16 @@ function emitCloseNT(self) { const w = self._writableState; if (w) { - w.closeEmitted = true; + w[kState] |= kCloseEmitted; } if (r) { - r.closeEmitted = true; + r[kState] |= kCloseEmitted; } - if (w?.emitClose || r?.emitClose) { + if ( + (w && (w[kState] & kEmitClose) !== 0) || + (r && (r[kState] & kEmitClose) !== 0) + ) { self.emit('close'); } } @@ -137,15 +152,18 @@ function emitErrorNT(self, err) { const r = self._readableState; const w = self._writableState; - if (w?.errorEmitted || r?.errorEmitted) { + if ( + (w && (w[kState] & kErrorEmitted) !== 0) || + (r && (r[kState] & kErrorEmitted) !== 0) + ) { return; } if (w) { - w.errorEmitted = true; + w[kState] |= kErrorEmitted; } if (r) { - r.errorEmitted = true; + r[kState] |= kErrorEmitted; } self.emit('error', err); @@ -192,20 +210,26 @@ function errorOrDestroy(stream, err, sync) { const r = stream._readableState; const w = stream._writableState; - if (w?.destroyed || r?.destroyed) { + if ( + (w && (w[kState] ? (w[kState] & kDestroyed) !== 0 : w.destroyed)) || + (r && (r[kState] ? (r[kState] & kDestroyed) !== 0 : r.destroyed)) + ) { return this; } - if (r?.autoDestroy || w?.autoDestroy) + if ( + (r && (r[kState] & kAutoDestroy) !== 0) || + (w && (w[kState] & kAutoDestroy) !== 0) + ) { stream.destroy(err); - else if (err) { + } else if (err) { // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364 err.stack; // eslint-disable-line no-unused-expressions - if (w && !w.errored) { + if (w && (w[kState] & kErrored) === 0) { w.errored = err; } - if (r && !r.errored) { + if (r && (r[kState] & kErrored) === 0) { r.errored = err; } if (sync) { @@ -225,10 +249,10 @@ function construct(stream, cb) { const w = stream._writableState; if (r) { - r.constructed = false; + r[kState] &= ~kConstructed; } if (w) { - w.constructed = false; + w[kState] &= ~kConstructed; } stream.once(kConstruct, cb); @@ -256,10 +280,10 @@ function constructNT(stream) { const s = w || r; if (r) { - r.constructed = true; + r[kState] |= kConstructed; } if (w) { - w.constructed = true; + w[kState] |= kConstructed; } if (s.destroyed) { diff --git a/lib/internal/streams/duplex.js b/lib/internal/streams/duplex.js index 799eb5a32022da..35f6ff4b199de1 100644 --- a/lib/internal/streams/duplex.js +++ b/lib/internal/streams/duplex.js @@ -35,9 +35,17 @@ const { module.exports = Duplex; +const Stream = require('internal/streams/legacy').Stream; const Readable = require('internal/streams/readable'); const Writable = require('internal/streams/writable'); +const { + addAbortSignal, +} = require('internal/streams/add-abort-signal'); + +const destroyImpl = require('internal/streams/destroy'); +const { kOnConstructed } = require('internal/streams/utils'); + ObjectSetPrototypeOf(Duplex.prototype, Readable.prototype); ObjectSetPrototypeOf(Duplex, Readable); @@ -55,8 +63,26 @@ function Duplex(options) { if (!(this instanceof Duplex)) return new Duplex(options); - Readable.call(this, options); - Writable.call(this, options); + this._events ??= { + close: undefined, + error: undefined, + prefinish: undefined, + finish: undefined, + drain: undefined, + data: undefined, + end: undefined, + readable: undefined, + // Skip uncommon events... + // pause: undefined, + // resume: undefined, + // pipe: undefined, + // unpipe: undefined, + // [destroyImpl.kConstruct]: undefined, + // [destroyImpl.kDestroy]: undefined, + }; + + this._readableState = new Readable.ReadableState(options, this, true); + this._writableState = new Writable.WritableState(options, this, true); if (options) { this.allowHalfOpen = options.allowHalfOpen !== false; @@ -73,9 +99,39 @@ function Duplex(options) { this._writableState.ended = true; this._writableState.finished = true; } + + if (typeof options.read === 'function') + this._read = options.read; + + if (typeof options.write === 'function') + this._write = options.write; + + if (typeof options.writev === 'function') + this._writev = options.writev; + + if (typeof options.destroy === 'function') + this._destroy = options.destroy; + + if (typeof options.final === 'function') + this._final = options.final; + + if (typeof options.construct === 'function') + this._construct = options.construct; + + if (options.signal) + addAbortSignal(options.signal, this); } else { this.allowHalfOpen = true; } + + Stream.call(this, options); + + if (this._construct != null) { + destroyImpl.construct(this, () => { + this._readableState[kOnConstructed](this); + this._writableState[kOnConstructed](this); + }); + } } ObjectDefineProperties(Duplex.prototype, { diff --git a/lib/internal/streams/duplexify.js b/lib/internal/streams/duplexify.js index 788bcb63242c38..2503b531519066 100644 --- a/lib/internal/streams/duplexify.js +++ b/lib/internal/streams/duplexify.js @@ -85,6 +85,11 @@ module.exports = function duplexify(body, name) { if (typeof body === 'function') { const { value, write, final, destroy } = fromAsyncGen(body); + // Body might be a constructor function instead of an async generator function. + if (isDuplexNodeStream(value)) { + return value; + } + if (isIterable(value)) { return from(Duplexify, value, { // TODO (ronag): highWaterMark? diff --git a/lib/internal/streams/from.js b/lib/internal/streams/from.js index c272a01f418dce..aa7e031d3e48d4 100644 --- a/lib/internal/streams/from.js +++ b/lib/internal/streams/from.js @@ -36,6 +36,7 @@ function from(Readable, iterable, opts) { throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable); } + const readable = new Readable({ objectMode: true, highWaterMark: 1, @@ -46,11 +47,19 @@ function from(Readable, iterable, opts) { // Flag to protect against _read // being called before last iteration completion. let reading = false; + let isAsyncValues = false; readable._read = function() { if (!reading) { reading = true; - next(); + + if (isAsync) { + nextAsync(); + } else if (isAsyncValues) { + nextSyncWithAsyncValues(); + } else { + nextSyncWithSyncValues(); + } } }; @@ -78,29 +87,115 @@ function from(Readable, iterable, opts) { } } - async function next() { + // There are a lot of duplication here, it's done on purpose for performance + // reasons - avoid await when not needed. + + function nextSyncWithSyncValues() { + for (;;) { + try { + const { value, done } = iterator.next(); + + if (done) { + readable.push(null); + return; + } + + if (value && + typeof value.then === 'function') { + return changeToAsyncValues(value); + } + + if (value === null) { + reading = false; + throw new ERR_STREAM_NULL_VALUES(); + } + + if (readable.push(value)) { + continue; + } + + reading = false; + } catch (err) { + readable.destroy(err); + } + break; + } + } + + async function changeToAsyncValues(value) { + isAsyncValues = true; + + try { + const res = await value; + + if (res === null) { + reading = false; + throw new ERR_STREAM_NULL_VALUES(); + } + + if (readable.push(res)) { + nextSyncWithAsyncValues(); + return; + } + + reading = false; + } catch (err) { + readable.destroy(err); + } + } + + async function nextSyncWithAsyncValues() { for (;;) { try { - const { value, done } = isAsync ? - await iterator.next() : - iterator.next(); + const { value, done } = iterator.next(); if (done) { readable.push(null); - } else { - const res = (value && - typeof value.then === 'function') ? - await value : - value; - if (res === null) { - reading = false; - throw new ERR_STREAM_NULL_VALUES(); - } else if (readable.push(res)) { - continue; - } else { - reading = false; - } + return; + } + + const res = (value && + typeof value.then === 'function') ? + await value : + value; + + if (res === null) { + reading = false; + throw new ERR_STREAM_NULL_VALUES(); } + + if (readable.push(res)) { + continue; + } + + reading = false; + } catch (err) { + readable.destroy(err); + } + break; + } + } + + async function nextAsync() { + for (;;) { + try { + const { value, done } = await iterator.next(); + + if (done) { + readable.push(null); + return; + } + + if (value === null) { + reading = false; + throw new ERR_STREAM_NULL_VALUES(); + } + + if (readable.push(value)) { + continue; + } + + reading = false; } catch (err) { readable.destroy(err); } diff --git a/lib/internal/streams/readable.js b/lib/internal/streams/readable.js index f551053bf7b79c..3800399c82ad62 100644 --- a/lib/internal/streams/readable.js +++ b/lib/internal/streams/readable.js @@ -31,9 +31,11 @@ const { ObjectSetPrototypeOf, Promise, SafeSet, + Symbol, SymbolAsyncDispose, SymbolAsyncIterator, - Symbol, + SymbolSpecies, + TypedArrayPrototypeSet, } = primordials; module.exports = Readable; @@ -51,12 +53,25 @@ const eos = require('internal/streams/end-of-stream'); let debug = require('internal/util/debuglog').debuglog('stream', (fn) => { debug = fn; }); -const BufferList = require('internal/streams/buffer_list'); const destroyImpl = require('internal/streams/destroy'); const { getHighWaterMark, getDefaultHighWaterMark, } = require('internal/streams/state'); +const { + kState, + // bitfields + kObjectMode, + kErrorEmitted, + kAutoDestroy, + kEmitClose, + kDestroyed, + kClosed, + kCloseEmitted, + kErrored, + kConstructed, + kOnConstructed, +} = require('internal/streams/utils'); const { aggregateTwoErrors, @@ -72,8 +87,7 @@ const { } = require('internal/errors'); const { validateObject } = require('internal/validators'); -const kPaused = Symbol('kPaused'); -const kState = Symbol('kState'); +const FastBuffer = Buffer[SymbolSpecies]; const { StringDecoder } = require('string_decoder'); const from = require('internal/streams/from'); @@ -84,25 +98,30 @@ const nop = () => {}; const { errorOrDestroy } = destroyImpl; -const kObjectMode = 1 << 0; -const kEnded = 1 << 1; -const kEndEmitted = 1 << 2; -const kReading = 1 << 3; -const kConstructed = 1 << 4; -const kSync = 1 << 5; -const kNeedReadable = 1 << 6; -const kEmittedReadable = 1 << 7; -const kReadableListening = 1 << 8; -const kResumeScheduled = 1 << 9; -const kErrorEmitted = 1 << 10; -const kEmitClose = 1 << 11; -const kAutoDestroy = 1 << 12; -const kDestroyed = 1 << 13; -const kClosed = 1 << 14; -const kCloseEmitted = 1 << 15; -const kMultiAwaitDrain = 1 << 16; -const kReadingMore = 1 << 17; -const kDataEmitted = 1 << 18; +const kErroredValue = Symbol('kErroredValue'); +const kDefaultEncodingValue = Symbol('kDefaultEncodingValue'); +const kDecoderValue = Symbol('kDecoderValue'); +const kEncodingValue = Symbol('kEncodingValue'); + +const kEnded = 1 << 9; +const kEndEmitted = 1 << 10; +const kReading = 1 << 11; +const kSync = 1 << 12; +const kNeedReadable = 1 << 13; +const kEmittedReadable = 1 << 14; +const kReadableListening = 1 << 15; +const kResumeScheduled = 1 << 16; +const kMultiAwaitDrain = 1 << 17; +const kReadingMore = 1 << 18; +const kDataEmitted = 1 << 19; +const kDefaultUTF8Encoding = 1 << 20; +const kDecoder = 1 << 21; +const kEncoding = 1 << 22; +const kHasFlowing = 1 << 23; +const kFlowing = 1 << 24; +const kHasPaused = 1 << 25; +const kPaused = 1 << 26; +const kDataListening = 1 << 27; // TODO(benjamingr) it is likely slower to do it this way than with free functions function makeBitMapDescriptor(bit) { @@ -151,23 +170,102 @@ ObjectDefineProperties(ReadableState.prototype, { // If true, a maybeReadMore has been scheduled. readingMore: makeBitMapDescriptor(kReadingMore), dataEmitted: makeBitMapDescriptor(kDataEmitted), + + // Indicates whether the stream has errored. When true no further + // _read calls, 'data' or 'readable' events should occur. This is needed + // since when autoDestroy is disabled we need a way to tell whether the + // stream has failed. + errored: { + __proto__: null, + enumerable: false, + get() { + return (this[kState] & kErrored) !== 0 ? this[kErroredValue] : null; + }, + set(value) { + if (value) { + this[kErroredValue] = value; + this[kState] |= kErrored; + } else { + this[kState] &= ~kErrored; + } + }, + }, + + defaultEncoding: { + __proto__: null, + enumerable: false, + get() { return (this[kState] & kDefaultUTF8Encoding) !== 0 ? 'utf8' : this[kDefaultEncodingValue]; }, + set(value) { + if (value === 'utf8' || value === 'utf-8') { + this[kState] |= kDefaultUTF8Encoding; + } else { + this[kState] &= ~kDefaultUTF8Encoding; + this[kDefaultEncodingValue] = value; + } + }, + }, + + decoder: { + __proto__: null, + enumerable: false, + get() { + return (this[kState] & kDecoder) !== 0 ? this[kDecoderValue] : null; + }, + set(value) { + if (value) { + this[kDecoderValue] = value; + this[kState] |= kDecoder; + } else { + this[kState] &= ~kDecoder; + } + }, + }, + + encoding: { + __proto__: null, + enumerable: false, + get() { + return (this[kState] & kEncoding) !== 0 ? this[kEncodingValue] : null; + }, + set(value) { + if (value) { + this[kEncodingValue] = value; + this[kState] |= kEncoding; + } else { + this[kState] &= ~kEncoding; + } + }, + }, + + flowing: { + __proto__: null, + enumerable: false, + get() { + return (this[kState] & kHasFlowing) !== 0 ? (this[kState] & kFlowing) !== 0 : null; + }, + set(value) { + if (value == null) { + this[kState] &= ~(kHasFlowing | kFlowing); + } else if (value) { + this[kState] |= (kHasFlowing | kFlowing); + } else { + this[kState] |= kHasFlowing; + this[kState] &= ~kFlowing; + } + }, + }, }); -function ReadableState(options, stream, isDuplex) { - // Duplex streams are both readable and writable, but share - // the same options object. - // However, some cases require setting options to different - // values for the readable and the writable sides of the duplex stream. - // These options can be provided separately as readableXXX and writableXXX. - if (typeof isDuplex !== 'boolean') - isDuplex = stream instanceof Stream.Duplex; +function ReadableState(options, stream, isDuplex) { // Bit map field to store ReadableState more effciently with 1 bit per field // instead of a V8 slot per field. this[kState] = kEmitClose | kAutoDestroy | kConstructed | kSync; + // Object stream flag. Used to make read(n) ignore n and to // make all the buffer merging and length checks go away. - if (options && options.objectMode) this[kState] |= kObjectMode; + if (options && options.objectMode) + this[kState] |= kObjectMode; if (isDuplex && options && options.readableObjectMode) this[kState] |= kObjectMode; @@ -178,15 +276,10 @@ function ReadableState(options, stream, isDuplex) { getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex) : getDefaultHighWaterMark(false); - // A linked list is used to store data chunks instead of an array because the - // linked list can remove elements from the beginning faster than - // array.shift(). - this.buffer = new BufferList(); + this.buffer = []; + this.bufferIndex = 0; this.length = 0; this.pipes = []; - this.flowing = null; - - this[kPaused] = null; // Should close be emitted on destroy. Defaults to true. if (options && options.emitClose === false) this[kState] &= ~kEmitClose; @@ -194,20 +287,12 @@ function ReadableState(options, stream, isDuplex) { // Should .destroy() be called after 'end' (and potentially 'finish'). if (options && options.autoDestroy === false) this[kState] &= ~kAutoDestroy; - - // Indicates whether the stream has errored. When true no further - // _read calls, 'data' or 'readable' events should occur. This is needed - // since when autoDestroy is disabled we need a way to tell whether the - // stream has failed. - this.errored = null; - - // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. const defaultEncoding = options?.defaultEncoding; - if (defaultEncoding == null) { - this.defaultEncoding = 'utf8'; + if (defaultEncoding == null || defaultEncoding === 'utf8' || defaultEncoding === 'utf-8') { + this[kState] |= kDefaultUTF8Encoding; } else if (Buffer.isEncoding(defaultEncoding)) { this.defaultEncoding = defaultEncoding; } else { @@ -218,24 +303,38 @@ function ReadableState(options, stream, isDuplex) { // type: null | Writable | Set. this.awaitDrainWriters = null; - this.decoder = null; - this.encoding = null; if (options && options.encoding) { this.decoder = new StringDecoder(options.encoding); this.encoding = options.encoding; } } +ReadableState.prototype[kOnConstructed] = function onConstructed(stream) { + if ((this[kState] & kNeedReadable) !== 0) { + maybeReadMore(stream, this); + } +}; function Readable(options) { if (!(this instanceof Readable)) return new Readable(options); - // Checking for a Stream.Duplex instance is faster here instead of inside - // the ReadableState constructor, at least with V8 6.5. - const isDuplex = this instanceof Stream.Duplex; + this._events ??= { + close: undefined, + error: undefined, + data: undefined, + end: undefined, + readable: undefined, + // Skip uncommon events... + // pause: undefined, + // resume: undefined, + // pipe: undefined, + // unpipe: undefined, + // [destroyImpl.kConstruct]: undefined, + // [destroyImpl.kDestroy]: undefined, + }; - this._readableState = new ReadableState(options, this, isDuplex); + this._readableState = new ReadableState(options, this, false); if (options) { if (typeof options.read === 'function') @@ -247,17 +346,17 @@ function Readable(options) { if (typeof options.construct === 'function') this._construct = options.construct; - if (options.signal && !isDuplex) + if (options.signal) addAbortSignal(options.signal, this); } Stream.call(this, options); - destroyImpl.construct(this, () => { - if (this._readableState.needReadable) { - maybeReadMore(this, this._readableState); - } - }); + if (this._construct != null) { + destroyImpl.construct(this, () => { + this._readableState[kOnConstructed](this); + }); + } } Readable.prototype.destroy = destroyImpl.destroy; @@ -284,87 +383,170 @@ Readable.prototype[SymbolAsyncDispose] = function() { // similar to how Writable.write() returns true if you should // write() some more. Readable.prototype.push = function(chunk, encoding) { - return readableAddChunk(this, chunk, encoding, false); + debug('push', chunk); + + const state = this._readableState; + return (state[kState] & kObjectMode) === 0 ? + readableAddChunkPushByteMode(this, state, chunk, encoding) : + readableAddChunkPushObjectMode(this, state, chunk, encoding); }; // Unshift should *always* be something directly out of read(). Readable.prototype.unshift = function(chunk, encoding) { - return readableAddChunk(this, chunk, encoding, true); + debug('unshift', chunk); + const state = this._readableState; + return (state[kState] & kObjectMode) === 0 ? + readableAddChunkUnshiftByteMode(this, state, chunk, encoding) : + readableAddChunkUnshiftObjectMode(this, state, chunk); }; -function readableAddChunk(stream, chunk, encoding, addToFront) { - debug('readableAddChunk', chunk); - const state = stream._readableState; - let err; - if ((state[kState] & kObjectMode) === 0) { - if (typeof chunk === 'string') { - encoding = encoding || state.defaultEncoding; - if (state.encoding !== encoding) { - if (addToFront && state.encoding) { - // When unshifting, if state.encoding is set, we have to save - // the string in the BufferList with the state encoding. - chunk = Buffer.from(chunk, encoding).toString(state.encoding); - } else { - chunk = Buffer.from(chunk, encoding); - encoding = ''; - } +function readableAddChunkUnshiftByteMode(stream, state, chunk, encoding) { + if (chunk === null) { + state[kState] &= ~kReading; + onEofChunk(stream, state); + + return false; + } + + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (state.encoding !== encoding) { + if (state.encoding) { + // When unshifting, if state.encoding is set, we have to save + // the string in the BufferList with the state encoding. + chunk = Buffer.from(chunk, encoding).toString(state.encoding); + } else { + chunk = Buffer.from(chunk, encoding); } - } else if (chunk instanceof Buffer) { - encoding = ''; - } else if (Stream._isUint8Array(chunk)) { - chunk = Stream._uint8ArrayToBuffer(chunk); - encoding = ''; - } else if (chunk != null) { - err = new ERR_INVALID_ARG_TYPE( - 'chunk', ['string', 'Buffer', 'Uint8Array'], chunk); } + } else if (Stream._isUint8Array(chunk)) { + chunk = Stream._uint8ArrayToBuffer(chunk); + } else if (chunk !== undefined && !(chunk instanceof Buffer)) { + errorOrDestroy(stream, new ERR_INVALID_ARG_TYPE( + 'chunk', ['string', 'Buffer', 'Uint8Array'], chunk)); + return false; + } + + + if (!(chunk && chunk.length > 0)) { + return canPushMore(state); } - if (err) { - errorOrDestroy(stream, err); - } else if (chunk === null) { + return readableAddChunkUnshiftValue(stream, state, chunk); +} + +function readableAddChunkUnshiftObjectMode(stream, state, chunk) { + if (chunk === null) { state[kState] &= ~kReading; onEofChunk(stream, state); - } else if (((state[kState] & kObjectMode) !== 0) || (chunk && chunk.length > 0)) { - if (addToFront) { - if ((state[kState] & kEndEmitted) !== 0) - errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT()); - else if (state.destroyed || state.errored) - return false; - else - addChunk(stream, state, chunk, true); - } else if (state.ended) { - errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF()); - } else if (state.destroyed || state.errored) { - return false; - } else { - state[kState] &= ~kReading; - if (state.decoder && !encoding) { - chunk = state.decoder.write(chunk); - if (state.objectMode || chunk.length !== 0) - addChunk(stream, state, chunk, false); - else - maybeReadMore(stream, state); - } else { - addChunk(stream, state, chunk, false); - } + + return false; + } + + return readableAddChunkUnshiftValue(stream, state, chunk); +} + +function readableAddChunkUnshiftValue(stream, state, chunk) { + if ((state[kState] & kEndEmitted) !== 0) + errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT()); + else if ((state[kState] & (kDestroyed | kErrored)) !== 0) + return false; + else + addChunk(stream, state, chunk, true); + + return canPushMore(state); +} + +function readableAddChunkPushByteMode(stream, state, chunk, encoding) { + if (chunk === null) { + state[kState] &= ~kReading; + onEofChunk(stream, state); + return false; + } + + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (state.encoding !== encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; } - } else if (!addToFront) { + } else if (chunk instanceof Buffer) { + encoding = ''; + } else if (Stream._isUint8Array(chunk)) { + chunk = Stream._uint8ArrayToBuffer(chunk); + encoding = ''; + } else if (chunk !== undefined) { + errorOrDestroy(stream, new ERR_INVALID_ARG_TYPE( + 'chunk', ['string', 'Buffer', 'Uint8Array'], chunk)); + return false; + } + + if (!chunk || chunk.length <= 0) { state[kState] &= ~kReading; maybeReadMore(stream, state); + + return canPushMore(state); } + if ((state[kState] & kEnded) !== 0) { + errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF()); + return false; + } + + if ((state[kState] & (kDestroyed | kErrored)) !== 0) { + return false; + } + + state[kState] &= ~kReading; + if ((state[kState] & kDecoder) !== 0 && !encoding) { + chunk = state[kDecoderValue].write(chunk); + if (chunk.length === 0) { + maybeReadMore(stream, state); + return canPushMore(state); + } + } + + addChunk(stream, state, chunk, false); + return canPushMore(state); +} + +function readableAddChunkPushObjectMode(stream, state, chunk, encoding) { + if (chunk === null) { + state[kState] &= ~kReading; + onEofChunk(stream, state); + return false; + } + + if ((state[kState] & kEnded) !== 0) { + errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF()); + return false; + } + + if ((state[kState] & (kDestroyed | kErrored)) !== 0) { + return false; + } + + state[kState] &= ~kReading; + + if ((state[kState] & kDecoder) !== 0 && !encoding) { + chunk = state[kDecoderValue].write(chunk); + } + + addChunk(stream, state, chunk, false); + return canPushMore(state); +} + +function canPushMore(state) { // We can push more data if we are below the highWaterMark. // Also, if we have no data yet, we can stand some more bytes. // This is to work around cases where hwm=0, such as the repl. - return !state.ended && + return (state[kState] & kEnded) === 0 && (state.length < state.highWaterMark || state.length === 0); } function addChunk(stream, state, chunk, addToFront) { - if (state.flowing && state.length === 0 && !state.sync && - stream.listenerCount('data') > 0) { + if ((state[kState] & (kFlowing | kSync | kDataListening)) === (kFlowing | kDataListening) && state.length === 0) { // Use the guard to avoid creating `Set()` repeatedly // when we have multiple pipes. if ((state[kState] & kMultiAwaitDrain) !== 0) { @@ -373,15 +555,20 @@ function addChunk(stream, state, chunk, addToFront) { state.awaitDrainWriters = null; } - state.dataEmitted = true; + state[kState] |= kDataEmitted; stream.emit('data', chunk); } else { // Update the buffer info. - state.length += state.objectMode ? 1 : chunk.length; - if (addToFront) - state.buffer.unshift(chunk); - else + state.length += (state[kState] & kObjectMode) !== 0 ? 1 : chunk.length; + if (addToFront) { + if (state.bufferIndex > 0) { + state.buffer[--state.bufferIndex] = chunk; + } else { + state.buffer.unshift(chunk); // Slow path + } + } else { state.buffer.push(chunk); + } if ((state[kState] & kNeedReadable) !== 0) emitReadable(stream); @@ -391,26 +578,29 @@ function addChunk(stream, state, chunk, addToFront) { Readable.prototype.isPaused = function() { const state = this._readableState; - return state[kPaused] === true || state.flowing === false; + return (state[kState] & kPaused) !== 0 || (state[kState] & (kHasFlowing | kFlowing)) === kHasFlowing; }; // Backwards compatibility. Readable.prototype.setEncoding = function(enc) { + const state = this._readableState; + const decoder = new StringDecoder(enc); - this._readableState.decoder = decoder; + state.decoder = decoder; // If setEncoding(null), decoder.encoding equals utf8. - this._readableState.encoding = this._readableState.decoder.encoding; + state.encoding = state.decoder.encoding; - const buffer = this._readableState.buffer; // Iterate over current buffer to convert already stored Buffers: let content = ''; - for (const data of buffer) { + for (const data of state.buffer.slice(state.bufferIndex)) { content += decoder.write(data); } - buffer.clear(); + state.buffer.length = 0; + state.bufferIndex = 0; + if (content !== '') - buffer.push(content); - this._readableState.length = content.length; + state.buffer.push(content); + state.length = content.length; return this; }; @@ -436,19 +626,19 @@ function computeNewHighWaterMark(n) { // This function is designed to be inlinable, so please take care when making // changes to the function body. function howMuchToRead(n, state) { - if (n <= 0 || (state.length === 0 && state.ended)) + if (n <= 0 || (state.length === 0 && (state[kState] & kEnded) !== 0)) return 0; if ((state[kState] & kObjectMode) !== 0) return 1; if (NumberIsNaN(n)) { // Only flow one buffer at a time. - if (state.flowing && state.length) - return state.buffer.first().length; + if ((state[kState] & kFlowing) !== 0 && state.length) + return state.buffer[state.bufferIndex].length; return state.length; } if (n <= state.length) return n; - return state.ended ? state.length : 0; + return (state[kState] & kEnded) !== 0 ? state.length : 0; } // You can override either this method, or the async _read(n) below. @@ -475,13 +665,13 @@ Readable.prototype.read = function(n) { // already have a bunch of data in the buffer, then just trigger // the 'readable' event and move on. if (n === 0 && - state.needReadable && + (state[kState] & kNeedReadable) !== 0 && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || - state.ended)) { - debug('read: emitReadable', state.length, state.ended); - if (state.length === 0 && state.ended) + (state[kState] & kEnded) !== 0)) { + debug('read: emitReadable'); + if (state.length === 0 && (state[kState] & kEnded) !== 0) endReadable(this); else emitReadable(this); @@ -491,7 +681,7 @@ Readable.prototype.read = function(n) { n = howMuchToRead(n, state); // If we've ended, and we're now clear, then finish it up. - if (n === 0 && state.ended) { + if (n === 0 && (state[kState] & kEnded) !== 0) { if (state.length === 0) endReadable(this); return null; @@ -532,8 +722,7 @@ Readable.prototype.read = function(n) { // However, if we've ended, then there's no point, if we're already // reading, then it's unnecessary, if we're constructing we have to wait, // and if we're destroyed or errored, then it's not allowed, - if (state.ended || state.reading || state.destroyed || state.errored || - !state.constructed) { + if ((state[kState] & (kReading | kEnded | kDestroyed | kErrored | kConstructed)) !== kConstructed) { doRead = false; debug('reading, ended or constructing', doRead); } else if (doRead) { @@ -553,7 +742,7 @@ Readable.prototype.read = function(n) { // If _read pushed data synchronously, then `reading` will be false, // and we need to re-evaluate how much data we can return to the user. - if (!state.reading) + if ((state[kState] & kReading) === 0) n = howMuchToRead(nOrig, state); } @@ -564,11 +753,11 @@ Readable.prototype.read = function(n) { ret = null; if (ret === null) { - state.needReadable = state.length <= state.highWaterMark; + state[kState] |= state.length <= state.highWaterMark ? kNeedReadable : 0; n = 0; } else { state.length -= n; - if (state.multiAwaitDrain) { + if ((state[kState] & kMultiAwaitDrain) !== 0) { state.awaitDrainWriters.clear(); } else { state.awaitDrainWriters = null; @@ -578,16 +767,16 @@ Readable.prototype.read = function(n) { if (state.length === 0) { // If we have nothing in the buffer, then we want to know // as soon as we *do* get something into the buffer. - if (!state.ended) - state.needReadable = true; + if ((state[kState] & kEnded) === 0) + state[kState] |= kNeedReadable; // If we tried to read() past the EOF, then emit end on the next tick. - if (nOrig !== n && state.ended) + if (nOrig !== n && (state[kState] & kEnded) !== 0) endReadable(this); } - if (ret !== null && !state.errorEmitted && !state.closeEmitted) { - state.dataEmitted = true; + if (ret !== null && (state[kState] & (kErrorEmitted | kCloseEmitted)) === 0) { + state[kState] |= kDataEmitted; this.emit('data', ret); } @@ -596,25 +785,26 @@ Readable.prototype.read = function(n) { function onEofChunk(stream, state) { debug('onEofChunk'); - if (state.ended) return; - if (state.decoder) { - const chunk = state.decoder.end(); + if ((state[kState] & kEnded) !== 0) return; + const decoder = (state[kState] & kDecoder) !== 0 ? state[kDecoderValue] : null; + if (decoder) { + const chunk = decoder.end(); if (chunk && chunk.length) { state.buffer.push(chunk); - state.length += state.objectMode ? 1 : chunk.length; + state.length += (state[kState] & kObjectMode) !== 0 ? 1 : chunk.length; } } - state.ended = true; + state[kState] |= kEnded; - if (state.sync) { + if ((state[kState] & kSync) !== 0) { // If we are sync, wait until next tick to emit the data. // Otherwise we risk emitting data in the flow() // the readable code triggers during a read() call. emitReadable(stream); } else { // Emit 'readable' now to make sure it gets picked up. - state.needReadable = false; - state.emittedReadable = true; + state[kState] &= ~kNeedReadable; + state[kState] |= kEmittedReadable; // We have to emit readable now that we are EOF. Modules // in the ecosystem (e.g. dicer) rely on this event being sync. emitReadable_(stream); @@ -626,21 +816,21 @@ function onEofChunk(stream, state) { // a nextTick recursion warning, but that's not so bad. function emitReadable(stream) { const state = stream._readableState; - debug('emitReadable', state.needReadable, state.emittedReadable); - state.needReadable = false; - if (!state.emittedReadable) { - debug('emitReadable', state.flowing); - state.emittedReadable = true; + debug('emitReadable'); + state[kState] &= ~kNeedReadable; + if ((state[kState] & kEmittedReadable) === 0) { + debug('emitReadable', (state[kState] & kFlowing) !== 0); + state[kState] |= kEmittedReadable; process.nextTick(emitReadable_, stream); } } function emitReadable_(stream) { const state = stream._readableState; - debug('emitReadable_', state.destroyed, state.length, state.ended); - if (!state.destroyed && !state.errored && (state.length || state.ended)) { + debug('emitReadable_'); + if ((state[kState] & (kDestroyed | kErrored)) === 0 && (state.length || (state[kState] & kEnded) !== 0)) { stream.emit('readable'); - state.emittedReadable = false; + state[kState] &= ~kEmittedReadable; } // The stream needs another readable event if: @@ -649,10 +839,9 @@ function emitReadable_(stream) { // 2. It is not ended. // 3. It is below the highWaterMark, so we can schedule // another readable later. - state.needReadable = - !state.flowing && - !state.ended && - state.length <= state.highWaterMark; + state[kState] |= + (state[kState] & (kFlowing | kEnded)) === 0 && + state.length <= state.highWaterMark ? kNeedReadable : 0; flow(stream); } @@ -664,8 +853,8 @@ function emitReadable_(stream) { // However, if we're not ended, or reading, and the length < hwm, // then go ahead and try to read some more preemptively. function maybeReadMore(stream, state) { - if (!state.readingMore && state.constructed) { - state.readingMore = true; + if ((state[kState] & (kReadingMore | kConstructed)) === kConstructed) { + state[kState] |= kReadingMore; process.nextTick(maybeReadMore_, stream, state); } } @@ -694,9 +883,9 @@ function maybeReadMore_(stream, state) { // called push() with new data. In this case we skip performing more // read()s. The execution ends in this method again after the _read() ends // up calling push() with more data. - while (!state.reading && !state.ended && + while ((state[kState] & (kReading | kEnded)) === 0 && (state.length < state.highWaterMark || - (state.flowing && state.length === 0))) { + ((state[kState] & kFlowing) !== 0 && state.length === 0))) { const len = state.length; debug('maybeReadMore read 0'); stream.read(0); @@ -704,7 +893,7 @@ function maybeReadMore_(stream, state) { // Didn't get any data, stop spinning. break; } - state.readingMore = false; + state[kState] &= ~kReadingMore; } // Abstract method. to be overridden in specific implementation classes. @@ -720,8 +909,8 @@ Readable.prototype.pipe = function(dest, pipeOpts) { const state = this._readableState; if (state.pipes.length === 1) { - if (!state.multiAwaitDrain) { - state.multiAwaitDrain = true; + if ((state[kState] & kMultiAwaitDrain) === 0) { + state[kState] |= kMultiAwaitDrain; state.awaitDrainWriters = new SafeSet( state.awaitDrainWriters ? [state.awaitDrainWriters] : [], ); @@ -736,7 +925,7 @@ Readable.prototype.pipe = function(dest, pipeOpts) { dest !== process.stderr; const endFn = doEnd ? onend : unpipe; - if (state.endEmitted) + if ((state[kState] & kEndEmitted) !== 0) process.nextTick(endFn); else src.once('end', endFn); @@ -795,7 +984,7 @@ Readable.prototype.pipe = function(dest, pipeOpts) { if (state.pipes.length === 1 && state.pipes[0] === dest) { debug('false write response, pause', 0); state.awaitDrainWriters = dest; - state.multiAwaitDrain = false; + state[kState] &= ~kMultiAwaitDrain; } else if (state.pipes.length > 1 && state.pipes.includes(dest)) { debug('false write response, pause', state.awaitDrainWriters.size); state.awaitDrainWriters.add(dest); @@ -867,7 +1056,7 @@ Readable.prototype.pipe = function(dest, pipeOpts) { if (dest.writableNeedDrain === true) { pause(); - } else if (!state.flowing) { + } else if ((state[kState] & kFlowing) === 0) { debug('pipe resume'); src.resume(); } @@ -885,13 +1074,13 @@ function pipeOnDrain(src, dest) { if (state.awaitDrainWriters === dest) { debug('pipeOnDrain', 1); state.awaitDrainWriters = null; - } else if (state.multiAwaitDrain) { + } else if ((state[kState] & kMultiAwaitDrain) !== 0) { debug('pipeOnDrain', state.awaitDrainWriters.size); state.awaitDrainWriters.delete(dest); } if ((!state.awaitDrainWriters || state.awaitDrainWriters.size === 0) && - src.listenerCount('data')) { + (state[kState] & kDataListening) !== 0) { src.resume(); } }; @@ -938,22 +1127,24 @@ Readable.prototype.on = function(ev, fn) { const state = this._readableState; if (ev === 'data') { + state[kState] |= kDataListening; + // Update readableListening so that resume() may be a no-op // a few lines down. This is needed to support once('readable'). - state.readableListening = this.listenerCount('readable') > 0; + state[kState] |= this.listenerCount('readable') > 0 ? kReadableListening : 0; // Try start flowing on next tick if stream isn't explicitly paused. - if (state.flowing !== false) + if ((state[kState] & (kHasFlowing | kFlowing)) !== kHasFlowing) { this.resume(); + } } else if (ev === 'readable') { - if (!state.endEmitted && !state.readableListening) { - state.readableListening = state.needReadable = true; - state.flowing = false; - state.emittedReadable = false; - debug('on readable', state.length, state.reading); + if ((state[kState] & (kEndEmitted | kReadableListening)) === 0) { + state[kState] |= kReadableListening | kNeedReadable | kHasFlowing; + state[kState] &= ~(kFlowing | kEmittedReadable); + debug('on readable'); if (state.length) { emitReadable(this); - } else if (!state.reading) { + } else if ((state[kState] & kReading) === 0) { process.nextTick(nReadingNextTick, this); } } @@ -964,6 +1155,8 @@ Readable.prototype.on = function(ev, fn) { Readable.prototype.addListener = Readable.prototype.on; Readable.prototype.removeListener = function(ev, fn) { + const state = this._readableState; + const res = Stream.prototype.removeListener.call(this, ev, fn); @@ -975,6 +1168,8 @@ Readable.prototype.removeListener = function(ev, fn) { // resume within the same tick will have no // effect. process.nextTick(updateReadableListening, this); + } else if (ev === 'data' && this.listenerCount('data') === 0) { + state[kState] &= ~kDataListening; } return res; @@ -1000,18 +1195,23 @@ Readable.prototype.removeAllListeners = function(ev) { function updateReadableListening(self) { const state = self._readableState; - state.readableListening = self.listenerCount('readable') > 0; - if (state.resumeScheduled && state[kPaused] === false) { + if (self.listenerCount('readable') > 0) { + state[kState] |= kReadableListening; + } else { + state[kState] &= ~kReadableListening; + } + + if ((state[kState] & (kHasPaused | kPaused | kResumeScheduled)) === (kHasPaused | kResumeScheduled)) { // Flowing needs to be set to true now, otherwise // the upcoming resume will not flow. - state.flowing = true; + state[kState] |= kHasFlowing | kFlowing; // Crude way to check if we should resume. - } else if (self.listenerCount('data') > 0) { + } else if ((state[kState] & kDataListening) !== 0) { self.resume(); - } else if (!state.readableListening) { - state.flowing = null; + } else if ((state[kState] & kReadableListening) === 0) { + state[kState] &= ~(kHasFlowing | kFlowing); } } @@ -1024,53 +1224,61 @@ function nReadingNextTick(self) { // If the user uses them, then switch into old mode. Readable.prototype.resume = function() { const state = this._readableState; - if (!state.flowing) { + if ((state[kState] & kFlowing) === 0) { debug('resume'); // We flow only if there is no one listening // for readable, but we still have to call // resume(). - state.flowing = !state.readableListening; + state[kState] |= kHasFlowing; + if ((state[kState] & kReadableListening) === 0) { + state[kState] |= kFlowing; + } else { + state[kState] &= ~kFlowing; + } resume(this, state); } - state[kPaused] = false; + state[kState] |= kHasPaused; + state[kState] &= ~kPaused; return this; }; function resume(stream, state) { - if (!state.resumeScheduled) { - state.resumeScheduled = true; + if ((state[kState] & kResumeScheduled) === 0) { + state[kState] |= kResumeScheduled; process.nextTick(resume_, stream, state); } } function resume_(stream, state) { - debug('resume', state.reading); - if (!state.reading) { + debug('resume', (state[kState] & kReading) !== 0); + if ((state[kState] & kReading) === 0) { stream.read(0); } - state.resumeScheduled = false; + state[kState] &= ~kResumeScheduled; stream.emit('resume'); flow(stream); - if (state.flowing && !state.reading) + if ((state[kState] & (kFlowing | kReading)) === kFlowing) stream.read(0); } Readable.prototype.pause = function() { - debug('call pause flowing=%j', this._readableState.flowing); - if (this._readableState.flowing !== false) { + const state = this._readableState; + debug('call pause'); + if ((state[kState] & (kHasFlowing | kFlowing)) !== kHasFlowing) { debug('pause'); - this._readableState.flowing = false; + state[kState] |= kHasFlowing; + state[kState] &= ~kFlowing; this.emit('pause'); } - this._readableState[kPaused] = true; + state[kState] |= kHasPaused | kPaused; return this; }; function flow(stream) { const state = stream._readableState; - debug('flow', state.flowing); - while (state.flowing && stream.read() !== null); + debug('flow'); + while ((state[kState] & kFlowing) !== 0 && stream.read() !== null); } // Wrap an old-style stream as the async data source. @@ -1349,10 +1557,15 @@ ObjectDefineProperties(ReadableState.prototype, { paused: { __proto__: null, get() { - return this[kPaused] !== false; + return (this[kState] & kPaused) !== 0; }, set(value) { - this[kPaused] = !!value; + this[kState] |= kHasPaused; + if (value) { + this[kState] |= kPaused; + } else { + this[kState] &= ~kPaused; + } }, }, }); @@ -1369,21 +1582,96 @@ function fromList(n, state) { if (state.length === 0) return null; + let idx = state.bufferIndex; let ret; - if (state.objectMode) - ret = state.buffer.shift(); - else if (!n || n >= state.length) { + + const buf = state.buffer; + const len = buf.length; + + if ((state[kState] & kObjectMode) !== 0) { + ret = buf[idx]; + buf[idx++] = null; + } else if (!n || n >= state.length) { // Read it all, truncate the list. - if (state.decoder) - ret = state.buffer.join(''); - else if (state.buffer.length === 1) - ret = state.buffer.first(); - else - ret = state.buffer.concat(state.length); - state.buffer.clear(); + if ((state[kState] & kDecoder) !== 0) { + ret = ''; + while (idx < len) { + ret += buf[idx]; + buf[idx++] = null; + } + } else if (len - idx === 0) { + ret = Buffer.alloc(0); + } else if (len - idx === 1) { + ret = buf[idx]; + buf[idx++] = null; + } else { + ret = Buffer.allocUnsafe(state.length); + + let i = 0; + while (idx < len) { + TypedArrayPrototypeSet(ret, buf[idx], i); + i += buf[idx].length; + buf[idx++] = null; + } + } + } else if (n < buf[idx].length) { + // `slice` is the same for buffers and strings. + ret = buf[idx].slice(0, n); + buf[idx] = buf[idx].slice(n); + } else if (n === buf[idx].length) { + // First chunk is a perfect match. + ret = buf[idx]; + buf[idx++] = null; + } else if ((state[kState] & kDecoder) !== 0) { + ret = ''; + while (idx < len) { + const str = buf[idx]; + if (n > str.length) { + ret += str; + n -= str.length; + buf[idx++] = null; + } else { + if (n === buf.length) { + ret += str; + buf[idx++] = null; + } else { + ret += str.slice(0, n); + buf[idx] = str.slice(n); + } + break; + } + } + } else { + ret = Buffer.allocUnsafe(n); + + const retLen = n; + while (idx < len) { + const data = buf[idx]; + if (n > data.length) { + TypedArrayPrototypeSet(ret, data, retLen - n); + n -= data.length; + buf[idx++] = null; + } else { + if (n === data.length) { + TypedArrayPrototypeSet(ret, data, retLen - n); + buf[idx++] = null; + } else { + TypedArrayPrototypeSet(ret, new FastBuffer(data.buffer, data.byteOffset, n), retLen - n); + buf[idx] = new FastBuffer(data.buffer, data.byteOffset + n, data.length - n); + } + break; + } + } + } + + if (idx === len) { + state.buffer.length = 0; + state.bufferIndex = 0; + } else if (idx > 1024) { + state.buffer.splice(0, idx); + state.bufferIndex = 0; } else { - // read part of list. - ret = state.buffer.consume(n, state.decoder); + state.bufferIndex = idx; } return ret; @@ -1392,20 +1680,19 @@ function fromList(n, state) { function endReadable(stream) { const state = stream._readableState; - debug('endReadable', state.endEmitted); - if (!state.endEmitted) { - state.ended = true; + debug('endReadable'); + if ((state[kState] & kEndEmitted) === 0) { + state[kState] |= kEnded; process.nextTick(endReadableNT, state, stream); } } function endReadableNT(state, stream) { - debug('endReadableNT', state.endEmitted, state.length); + debug('endReadableNT'); // Check that we didn't get one last unshift. - if (!state.errored && !state.closeEmitted && - !state.endEmitted && state.length === 0) { - state.endEmitted = true; + if ((state[kState] & (kErrored | kCloseEmitted | kEndEmitted)) === 0 && state.length === 0) { + state[kState] |= kEndEmitted; stream.emit('end'); if (stream.writable && stream.allowHalfOpen === false) { diff --git a/lib/internal/streams/transform.js b/lib/internal/streams/transform.js index 02646f44344901..42e1adda618b87 100644 --- a/lib/internal/streams/transform.js +++ b/lib/internal/streams/transform.js @@ -95,10 +95,6 @@ function Transform(options) { ...options, highWaterMark: null, readableHighWaterMark, - // TODO (ronag): 0 is not optimal since we have - // a "bug" where we check needDrain before calling _write and not after. - // Refs: https://github.com/nodejs/node/pull/32887 - // Refs: https://github.com/nodejs/node/pull/35941 writableHighWaterMark: options.writableHighWaterMark || 0, }; } diff --git a/lib/internal/streams/utils.js b/lib/internal/streams/utils.js index 1b2a6c0fbf6a05..2c6b841a89e6e5 100644 --- a/lib/internal/streams/utils.js +++ b/lib/internal/streams/utils.js @@ -4,6 +4,7 @@ const { SymbolAsyncIterator, SymbolIterator, SymbolFor, + Symbol, } = primordials; // We need to use SymbolFor to make these globally available @@ -16,9 +17,22 @@ const kIsReadable = SymbolFor('nodejs.stream.readable'); const kIsWritable = SymbolFor('nodejs.stream.writable'); const kIsDisturbed = SymbolFor('nodejs.stream.disturbed'); +const kOnConstructed = Symbol('kOnConstructed'); + const kIsClosedPromise = SymbolFor('nodejs.webstream.isClosedPromise'); const kControllerErrorFunction = SymbolFor('nodejs.webstream.controllerErrorFunction'); +const kState = Symbol('kState'); +const kObjectMode = 1 << 0; +const kErrorEmitted = 1 << 1; +const kAutoDestroy = 1 << 2; +const kEmitClose = 1 << 3; +const kDestroyed = 1 << 4; +const kClosed = 1 << 5; +const kCloseEmitted = 1 << 6; +const kErrored = 1 << 7; +const kConstructed = 1 << 8; + function isReadableNodeStream(obj, strict = false) { return !!( obj && @@ -303,6 +317,7 @@ function isErrored(stream) { } module.exports = { + kOnConstructed, isDestroyed, kIsDestroyed, isDisturbed, @@ -335,4 +350,15 @@ module.exports = { isServerResponse, willEmitClose, isTransformStream, + kState, + // bitfields + kObjectMode, + kErrorEmitted, + kAutoDestroy, + kEmitClose, + kDestroyed, + kClosed, + kCloseEmitted, + kErrored, + kConstructed, }; diff --git a/lib/internal/streams/writable.js b/lib/internal/streams/writable.js index b8f8b72ce8d113..0dbf56d7a69ca9 100644 --- a/lib/internal/streams/writable.js +++ b/lib/internal/streams/writable.js @@ -64,6 +64,20 @@ const { ERR_STREAM_WRITE_AFTER_END, ERR_UNKNOWN_ENCODING, } = require('internal/errors').codes; +const { + kState, + // bitfields + kObjectMode, + kErrorEmitted, + kAutoDestroy, + kEmitClose, + kDestroyed, + kClosed, + kCloseEmitted, + kErrored, + kConstructed, + kOnConstructed, +} = require('internal/streams/utils'); const { errorOrDestroy } = destroyImpl; @@ -78,18 +92,8 @@ const kDefaultEncodingValue = Symbol('kDefaultEncodingValue'); const kWriteCbValue = Symbol('kWriteCbValue'); const kAfterWriteTickInfoValue = Symbol('kAfterWriteTickInfoValue'); const kBufferedValue = Symbol('kBufferedValue'); -const kState = Symbol('kState'); - -const kObjectMode = 1 << 0; -const kEnded = 1 << 1; -const kConstructed = 1 << 2; -const kSync = 1 << 3; -const kErrorEmitted = 1 << 4; -const kEmitClose = 1 << 5; -const kAutoDestroy = 1 << 6; -const kDestroyed = 1 << 7; -const kClosed = 1 << 8; -const kCloseEmitted = 1 << 9; + +const kSync = 1 << 9; const kFinalCalled = 1 << 10; const kNeedDrain = 1 << 11; const kEnding = 1 << 12; @@ -101,16 +105,16 @@ const kPrefinished = 1 << 17; const kAllBuffers = 1 << 18; const kAllNoop = 1 << 19; const kOnFinished = 1 << 20; -const kErrored = 1 << 21; -const kHasWritable = 1 << 22; -const kWritable = 1 << 23; -const kCorked = 1 << 24; -const kDefaultUTF8Encoding = 1 << 25; -const kWriteCb = 1 << 26; -const kExpectWriteCb = 1 << 27; -const kAfterWriteTickInfo = 1 << 28; -const kAfterWritePending = 1 << 29; -const kBuffered = 1 << 30; +const kHasWritable = 1 << 21; +const kWritable = 1 << 22; +const kCorked = 1 << 23; +const kDefaultUTF8Encoding = 1 << 24; +const kWriteCb = 1 << 25; +const kExpectWriteCb = 1 << 26; +const kAfterWriteTickInfo = 1 << 27; +const kAfterWritePending = 1 << 28; +const kBuffered = 1 << 29; +const kEnded = 1 << 30; // TODO(benjamingr) it is likely slower to do it this way than with free functions function makeBitMapDescriptor(bit) { @@ -290,20 +294,15 @@ ObjectDefineProperties(WritableState.prototype, { }); function WritableState(options, stream, isDuplex) { - // Duplex streams are both readable and writable, but share - // the same options object. - // However, some cases require setting options to different - // values for the readable and the writable sides of the duplex stream, - // e.g. options.readableObjectMode vs. options.writableObjectMode, etc. - if (typeof isDuplex !== 'boolean') - isDuplex = stream instanceof Stream.Duplex; - // Bit map field to store WritableState more effciently with 1 bit per field // instead of a V8 slot per field. this[kState] = kSync | kConstructed | kEmitClose | kAutoDestroy; - if (options && options.objectMode) this[kState] |= kObjectMode; - if (isDuplex && options && options.writableObjectMode) this[kState] |= kObjectMode; + if (options && options.objectMode) + this[kState] |= kObjectMode; + + if (isDuplex && options && options.writableObjectMode) + this[kState] |= kObjectMode; // The point at which write() starts returning false // Note: 0 is a valid value, means that we always return false if @@ -323,7 +322,7 @@ function WritableState(options, stream, isDuplex) { // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. - const defaultEncoding = options?.defaultEncoding; + const defaultEncoding = options ? options.defaultEncoding : null; if (defaultEncoding == null || defaultEncoding === 'utf8' || defaultEncoding === 'utf-8') { this[kState] |= kDefaultUTF8Encoding; } else if (Buffer.isEncoding(defaultEncoding)) { @@ -372,23 +371,32 @@ ObjectDefineProperty(WritableState.prototype, 'bufferedRequestCount', { }, }); -function Writable(options) { - // Writable ctor is applied to Duplexes, too. - // `realHasInstance` is necessary because using plain `instanceof` - // would return false, as no `_writableState` property is attached. - - // Trying to use the custom `instanceof` for Writable here will also break the - // Node.js LazyTransform implementation, which has a non-trivial getter for - // `_writableState` that would lead to infinite recursion. +WritableState.prototype[kOnConstructed] = function onConstructed(stream) { + if ((this[kState] & kWriting) === 0) { + clearBuffer(stream, this); + } - // Checking for a Stream.Duplex instance is faster here instead of inside - // the WritableState constructor, at least with V8 6.5. - const isDuplex = (this instanceof Stream.Duplex); + if ((this[kState] & kEnding) !== 0) { + finishMaybe(stream, this); + } +}; - if (!isDuplex && !FunctionPrototypeSymbolHasInstance(Writable, this)) +function Writable(options) { + if (!(this instanceof Writable)) return new Writable(options); - this._writableState = new WritableState(options, this, isDuplex); + this._events ??= { + close: undefined, + error: undefined, + prefinish: undefined, + finish: undefined, + drain: undefined, + // Skip uncommon events... + // [destroyImpl.kConstruct]: undefined, + // [destroyImpl.kDestroy]: undefined, + }; + + this._writableState = new WritableState(options, this, false); if (options) { if (typeof options.write === 'function') @@ -412,17 +420,11 @@ function Writable(options) { Stream.call(this, options); - destroyImpl.construct(this, () => { - const state = this._writableState; - - if ((state[kState] & kWriting) === 0) { - clearBuffer(this, state); - } - - if ((state[kState] & kEnding) !== 0) { - finishMaybe(this, state); - } - }); + if (this._construct != null) { + destroyImpl.construct(this, () => { + this._writableState[kOnConstructed](this); + }); + } } ObjectDefineProperty(Writable, SymbolHasInstance, { @@ -443,21 +445,21 @@ Writable.prototype.pipe = function() { function _write(stream, chunk, encoding, cb) { const state = stream._writableState; - if (typeof encoding === 'function') { - cb = encoding; - encoding = (state[kState] & kDefaultUTF8Encoding) !== 0 ? 'utf8' : state.defaultEncoding; - } else { - if (!encoding) - encoding = (state[kState] & kDefaultUTF8Encoding) !== 0 ? 'utf8' : state.defaultEncoding; - else if (encoding !== 'buffer' && !Buffer.isEncoding(encoding)) - throw new ERR_UNKNOWN_ENCODING(encoding); - if (typeof cb !== 'function') - cb = nop; + if (cb == null || typeof cb !== 'function') { + cb = nop; } if (chunk === null) { throw new ERR_STREAM_NULL_VALUES(); - } else if ((state[kState] & kObjectMode) === 0) { + } + + if ((state[kState] & kObjectMode) === 0) { + if (!encoding) { + encoding = (state[kState] & kDefaultUTF8Encoding) !== 0 ? 'utf8' : state.defaultEncoding; + } else if (encoding !== 'buffer' && !Buffer.isEncoding(encoding)) { + throw new ERR_UNKNOWN_ENCODING(encoding); + } + if (typeof chunk === 'string') { if ((state[kState] & kDecodeStrings) !== 0) { chunk = Buffer.from(chunk, encoding); @@ -486,11 +488,17 @@ function _write(stream, chunk, encoding, cb) { errorOrDestroy(stream, err, true); return err; } + state.pendingcb++; return writeOrBuffer(stream, state, chunk, encoding, cb); } Writable.prototype.write = function(chunk, encoding, cb) { + if (encoding != null && typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + return _write(this, chunk, encoding, cb) === true; }; @@ -725,7 +733,8 @@ function errorBuffer(state) { // If there's something in the buffer waiting, then process it. function clearBuffer(stream, state) { - if ((state[kState] & (kDestroyed | kBufferProcessing | kCorked | kBuffered)) !== kBuffered) { + if ((state[kState] & (kDestroyed | kBufferProcessing | kCorked | kBuffered | kConstructed)) !== + (kBuffered | kConstructed)) { return; } @@ -865,52 +874,45 @@ function needFinish(state) { )) === (kEnding | kConstructed) && state.length === 0); } -function callFinal(stream, state) { - let called = false; - - function onFinish(err) { - if (called) { - errorOrDestroy(stream, err ?? ERR_MULTIPLE_CALLBACK()); - return; - } - called = true; - - state.pendingcb--; - if (err) { - callFinishedCallbacks(state, err); - errorOrDestroy(stream, err, (state[kState] & kSync) !== 0); - } else if (needFinish(state)) { - state[kState] |= kPrefinished; - stream.emit('prefinish'); - // Backwards compat. Don't check state.sync here. - // Some streams assume 'finish' will be emitted - // asynchronously relative to _final callback. - state.pendingcb++; - process.nextTick(finish, stream, state); - } +function onFinish(stream, state, err) { + if ((state[kState] & kPrefinished) !== 0) { + errorOrDestroy(stream, err ?? ERR_MULTIPLE_CALLBACK()); + return; } - - state[kState] |= kSync; - state.pendingcb++; - - try { - stream._final(onFinish); - } catch (err) { - onFinish(err); + state.pendingcb--; + if (err) { + callFinishedCallbacks(state, err); + errorOrDestroy(stream, err, (state[kState] & kSync) !== 0); + } else if (needFinish(state)) { + state[kState] |= kPrefinished; + stream.emit('prefinish'); + // Backwards compat. Don't check state.sync here. + // Some streams assume 'finish' will be emitted + // asynchronously relative to _final callback. + state.pendingcb++; + process.nextTick(finish, stream, state); } - - state[kState] &= ~kSync; } function prefinish(stream, state) { - if ((state[kState] & (kPrefinished | kFinalCalled)) === 0) { - if (typeof stream._final === 'function' && (state[kState] & kDestroyed) === 0) { - state[kState] |= kFinalCalled; - callFinal(stream, state); - } else { - state[kState] |= kPrefinished; - stream.emit('prefinish'); + if ((state[kState] & (kPrefinished | kFinalCalled)) !== 0) { + return; + } + + if (typeof stream._final === 'function' && (state[kState] & kDestroyed) === 0) { + state[kState] |= kFinalCalled | kSync; + state.pendingcb++; + + try { + stream._final((err) => onFinish(stream, state, err)); + } catch (err) { + onFinish(stream, state, err); } + + state[kState] &= ~kSync; + } else { + state[kState] |= kFinalCalled | kPrefinished; + stream.emit('prefinish'); } } @@ -1104,7 +1106,7 @@ Writable.prototype.destroy = function(err, cb) { const state = this._writableState; // Invoke pending callbacks. - if ((state[kState] & (kBuffered | kOnFinished | kDestroyed)) !== kDestroyed) { + if ((state[kState] & (kBuffered | kOnFinished)) !== 0 && (state[kState] & kDestroyed) === 0) { process.nextTick(errorBuffer, state); } diff --git a/lib/internal/structured_clone.js b/lib/internal/structured_clone.js deleted file mode 100644 index 0392232badf9fc..00000000000000 --- a/lib/internal/structured_clone.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict'; - -const { - codes: { ERR_MISSING_ARGS }, -} = require('internal/errors'); - -const { - MessageChannel, - receiveMessageOnPort, -} = require('internal/worker/io'); - -let channel; -function structuredClone(value, options = undefined) { - if (arguments.length === 0) { - throw new ERR_MISSING_ARGS('value'); - } - - // TODO: Improve this with a more efficient solution that avoids - // instantiating a MessageChannel - channel ??= new MessageChannel(); - channel.port1.unref(); - channel.port2.unref(); - channel.port1.postMessage(value, options?.transfer); - return receiveMessageOnPort(channel.port2).message; -} - -module.exports = { - structuredClone, -}; diff --git a/lib/internal/test_runner/harness.js b/lib/internal/test_runner/harness.js index 2f18b0bcf091ac..469ca903c7048c 100644 --- a/lib/internal/test_runner/harness.js +++ b/lib/internal/test_runner/harness.js @@ -23,6 +23,7 @@ const { parseCommandLine, reporterScope, setupTestReporters, + shouldColorizeTestFiles, } = require('internal/test_runner/utils'); const { bigint: hrtime } = process.hrtime; @@ -205,7 +206,8 @@ function getGlobalRoot() { process.exitCode = kGenericUserError; } }); - reportersSetup = setupTestReporters(globalRoot); + reportersSetup = setupTestReporters(globalRoot.reporter); + globalRoot.harness.shouldColorizeTestFiles ||= shouldColorizeTestFiles(globalRoot); } return globalRoot; } diff --git a/lib/internal/test_runner/mock/mock_timers.js b/lib/internal/test_runner/mock/mock_timers.js index 1ff6489885fe30..85512cc4b66a51 100644 --- a/lib/internal/test_runner/mock/mock_timers.js +++ b/lib/internal/test_runner/mock/mock_timers.js @@ -8,27 +8,31 @@ const { ArrayPrototypeAt, ArrayPrototypeForEach, ArrayPrototypeIncludes, - DateNow, + DatePrototypeGetTime, + DatePrototypeToString, FunctionPrototypeApply, FunctionPrototypeBind, + FunctionPrototypeToString, + globalThis, + NumberIsNaN, ObjectDefineProperty, + ObjectDefineProperties, ObjectGetOwnPropertyDescriptor, + ObjectGetOwnPropertyDescriptors, Promise, + Symbol, SymbolAsyncIterator, SymbolDispose, - globalThis, } = primordials; const { validateAbortSignal, validateArray, + validateNumber, } = require('internal/validators'); const { AbortError, - codes: { - ERR_INVALID_STATE, - ERR_INVALID_ARG_VALUE, - }, + codes: { ERR_INVALID_STATE, ERR_INVALID_ARG_VALUE }, } = require('internal/errors'); const PriorityQueue = require('internal/priority_queue'); @@ -37,6 +41,10 @@ const nodeTimersPromises = require('timers/promises'); const EventEmitter = require('events'); let kResistStopPropagation; +// Internal reference to the MockTimers class inside MockDate +let kMock; +// Initial epoch to which #now should be set to +const kInitialEpoch = 0; function compareTimersLists(a, b) { return (a.runAt - b.runAt) || (a.id - b.id); @@ -50,7 +58,10 @@ function abortIt(signal) { return new AbortError(undefined, { __proto__: null, cause: signal.reason }); } -const SUPPORTED_TIMERS = ['setTimeout', 'setInterval', 'setImmediate']; +/** + * @enum {('setTimeout'|'setInterval'|'setImmediate'|'Date')[]} Supported timers + */ +const SUPPORTED_APIS = ['setTimeout', 'setInterval', 'setImmediate', 'Date']; const TIMERS_DEFAULT_INTERVAL = { __proto__: null, setImmediate: -1, @@ -75,10 +86,12 @@ class MockTimers { #realTimersClearImmediate; #realPromisifiedSetImmediate; + #nativeDateDescriptor; + #timersInContext = []; #isEnabled = false; #currentTimer = 1; - #now = DateNow(); + #now = kInitialEpoch; #executionQueue = new PriorityQueue(compareTimersLists, setPosition); @@ -86,40 +99,281 @@ class MockTimers { #clearTimeout = FunctionPrototypeBind(this.#clearTimer, this); #setInterval = FunctionPrototypeBind(this.#createTimer, this, true); #clearInterval = FunctionPrototypeBind(this.#clearTimer, this); - - #setImmediate = (callback, ...args) => { - return this.#createTimer( - false, - callback, - TIMERS_DEFAULT_INTERVAL.setImmediate, - ...args, - ); - }; - #clearImmediate = FunctionPrototypeBind(this.#clearTimer, this); + constructor() { emitExperimentalWarning('The MockTimers API'); } + #restoreSetImmediate() { + ObjectDefineProperty( + globalThis, + 'setImmediate', + this.#realSetImmediate, + ); + ObjectDefineProperty( + globalThis, + 'clearImmediate', + this.#realClearImmediate, + ); + ObjectDefineProperty( + nodeTimers, + 'setImmediate', + this.#realTimersSetImmediate, + ); + ObjectDefineProperty( + nodeTimers, + 'clearImmediate', + this.#realTimersClearImmediate, + ); + ObjectDefineProperty( + nodeTimersPromises, + 'setImmediate', + this.#realPromisifiedSetImmediate, + ); + } + + #restoreOriginalSetInterval() { + ObjectDefineProperty( + globalThis, + 'setInterval', + this.#realSetInterval, + ); + ObjectDefineProperty( + globalThis, + 'clearInterval', + this.#realClearInterval, + ); + ObjectDefineProperty( + nodeTimers, + 'setInterval', + this.#realTimersSetInterval, + ); + ObjectDefineProperty( + nodeTimers, + 'clearInterval', + this.#realTimersClearInterval, + ); + ObjectDefineProperty( + nodeTimersPromises, + 'setInterval', + this.#realPromisifiedSetInterval, + ); + } + + #restoreOriginalSetTimeout() { + ObjectDefineProperty( + globalThis, + 'setTimeout', + this.#realSetTimeout, + ); + ObjectDefineProperty( + globalThis, + 'clearTimeout', + this.#realClearTimeout, + ); + ObjectDefineProperty( + nodeTimers, + 'setTimeout', + this.#realTimersSetTimeout, + ); + ObjectDefineProperty( + nodeTimers, + 'clearTimeout', + this.#realTimersClearTimeout, + ); + ObjectDefineProperty( + nodeTimersPromises, + 'setTimeout', + this.#realPromisifiedSetTimeout, + ); + } + + #storeOriginalSetImmediate() { + this.#realSetImmediate = ObjectGetOwnPropertyDescriptor( + globalThis, + 'setImmediate', + ); + this.#realClearImmediate = ObjectGetOwnPropertyDescriptor( + globalThis, + 'clearImmediate', + ); + this.#realTimersSetImmediate = ObjectGetOwnPropertyDescriptor( + nodeTimers, + 'setImmediate', + ); + this.#realTimersClearImmediate = ObjectGetOwnPropertyDescriptor( + nodeTimers, + 'clearImmediate', + ); + this.#realPromisifiedSetImmediate = ObjectGetOwnPropertyDescriptor( + nodeTimersPromises, + 'setImmediate', + ); + } + + #storeOriginalSetInterval() { + this.#realSetInterval = ObjectGetOwnPropertyDescriptor( + globalThis, + 'setInterval', + ); + this.#realClearInterval = ObjectGetOwnPropertyDescriptor( + globalThis, + 'clearInterval', + ); + this.#realTimersSetInterval = ObjectGetOwnPropertyDescriptor( + nodeTimers, + 'setInterval', + ); + this.#realTimersClearInterval = ObjectGetOwnPropertyDescriptor( + nodeTimers, + 'clearInterval', + ); + this.#realPromisifiedSetInterval = ObjectGetOwnPropertyDescriptor( + nodeTimersPromises, + 'setInterval', + ); + } + + #storeOriginalSetTimeout() { + this.#realSetTimeout = ObjectGetOwnPropertyDescriptor( + globalThis, + 'setTimeout', + ); + this.#realClearTimeout = ObjectGetOwnPropertyDescriptor( + globalThis, + 'clearTimeout', + ); + this.#realTimersSetTimeout = ObjectGetOwnPropertyDescriptor( + nodeTimers, + 'setTimeout', + ); + this.#realTimersClearTimeout = ObjectGetOwnPropertyDescriptor( + nodeTimers, + 'clearTimeout', + ); + this.#realPromisifiedSetTimeout = ObjectGetOwnPropertyDescriptor( + nodeTimersPromises, + 'setTimeout', + ); + } + #createTimer(isInterval, callback, delay, ...args) { const timerId = this.#currentTimer++; - this.#executionQueue.insert({ + const timer = { __proto__: null, id: timerId, callback, runAt: this.#now + delay, - interval: isInterval, + interval: isInterval ? delay : undefined, args, - }); + }; + this.#executionQueue.insert(timer); + return timer; + } - return timerId; + #clearTimer(timer) { + if (timer.priorityQueuePosition !== undefined) { + this.#executionQueue.removeAt(timer.priorityQueuePosition); + timer.priorityQueuePosition = undefined; + } } - #clearTimer(position) { - this.#executionQueue.removeAt(position); + #createDate() { + kMock ??= Symbol('MockTimers'); + const NativeDateConstructor = this.#nativeDateDescriptor.value; + /** + * Function to mock the Date constructor, treats cases as per ECMA-262 + * and returns a Date object with a mocked implementation + * @typedef {Date} MockDate + * @returns {MockDate} a mocked Date object + */ + function MockDate(year, month, date, hours, minutes, seconds, ms) { + const mockTimersSource = MockDate[kMock]; + const nativeDate = mockTimersSource.#nativeDateDescriptor.value; + + // As of the fake-timers implementation for Sinon + // ref https://github.com/sinonjs/fake-timers/blob/a4c757f80840829e45e0852ea1b17d87a998388e/src/fake-timers-src.js#L456 + // This covers the Date constructor called as a function ref. + // ECMA-262 Edition 5.1 section 15.9.2. + // and ECMA-262 Edition 14 Section 21.4.2.1 + // replaces 'this instanceof MockDate' with a more reliable check + // from ECMA-262 Edition 14 Section 13.3.12.1 NewTarget + if (!new.target) { + return DatePrototypeToString(new nativeDate(mockTimersSource.#now)); + } + + // Cases where Date is called as a constructor + // This is intended as a defensive implementation to avoid + // having unexpected returns + switch (arguments.length) { + case 0: + return new nativeDate(MockDate[kMock].#now); + case 1: + return new nativeDate(year); + case 2: + return new nativeDate(year, month); + case 3: + return new nativeDate(year, month, date); + case 4: + return new nativeDate(year, month, date, hours); + case 5: + return new nativeDate(year, month, date, hours, minutes); + case 6: + return new nativeDate(year, month, date, hours, minutes, seconds); + default: + return new nativeDate(year, month, date, hours, minutes, seconds, ms); + } + } + + // Prototype is read-only, and non assignable through Object.defineProperties + // eslint-disable-next-line no-unused-vars -- used to get the prototype out of the object + const { prototype, ...dateProps } = ObjectGetOwnPropertyDescriptors(NativeDateConstructor); + + // Binds all the properties of Date to the MockDate function + ObjectDefineProperties( + MockDate, + dateProps, + ); + + MockDate.now = function now() { + return MockDate[kMock].#now; + }; + + // This is just to print the function { native code } in the console + // when the user prints the function and not the internal code + MockDate.toString = function toString() { + return FunctionPrototypeToString(MockDate[kMock].#nativeDateDescriptor.value); + }; + + // We need to polute the prototype of this + ObjectDefineProperties(MockDate, { + __proto__: null, + [kMock]: { + __proto__: null, + enumerable: false, + configurable: false, + writable: false, + value: this, + }, + + isMock: { + __proto__: null, + enumerable: true, + configurable: false, + writable: false, + value: true, + }, + }); + + MockDate.prototype = NativeDateConstructor.prototype; + MockDate.parse = NativeDateConstructor.parse; + MockDate.UTC = NativeDateConstructor.UTC; + MockDate.prototype.toUTCString = NativeDateConstructor.prototype.toUTCString; + return MockDate; } - async * #setIntervalPromisified(interval, startTime, options) { + async * #setIntervalPromisified(interval, result, options) { const context = this; const emitter = new EventEmitter(); if (options?.signal) { @@ -143,14 +397,13 @@ class MockTimers { const eventIt = EventEmitter.on(emitter, 'data'); const callback = () => { - startTime += interval; - emitter.emit('data', startTime); + emitter.emit('data', result); }; - const timerId = this.#createTimer(true, callback, interval, options); + const timer = this.#createTimer(true, callback, interval, options); const clearListeners = () => { emitter.removeAllListeners(); - context.#clearTimer(timerId); + context.#clearTimer(timer); }; const iterator = { __proto__: null, @@ -179,6 +432,15 @@ class MockTimers { yield* iterator; } + #setImmediate(callback, ...args) { + return this.#createTimer( + false, + callback, + TIMERS_DEFAULT_INTERVAL.setImmediate, + ...args, + ); + } + #promisifyTimer({ timerFn, clearFn, ms, result, options }) { return new Promise((resolve, reject) => { if (options?.signal) { @@ -194,11 +456,11 @@ class MockTimers { } const onabort = () => { - clearFn(id); + clearFn(timer); return reject(abortIt(options.signal)); }; - const id = timerFn(() => { + const timer = timerFn(() => { return resolve(result); }, ms); @@ -235,6 +497,30 @@ class MockTimers { }); } + #assertTimersAreEnabled() { + if (!this.#isEnabled) { + throw new ERR_INVALID_STATE( + 'You should enable MockTimers first by calling the .enable function', + ); + } + } + + #assertTimeArg(time) { + if (time < 0) { + throw new ERR_INVALID_ARG_VALUE('time', 'positive integer', time); + } + } + + #isValidDateWithGetTime(maybeDate) { + // Validation inspired on https://github.com/inspect-js/is-date-object/blob/main/index.js#L3-L11 + try { + DatePrototypeGetTime(maybeDate); + return true; + } catch { + return false; + } + } + #toggleEnableTimers(activate) { const options = { __proto__: null, @@ -271,17 +557,31 @@ class MockTimers { setImmediate: () => { this.#storeOriginalSetImmediate(); - globalThis.setImmediate = this.#setImmediate; + // setImmediate functions needs to bind MockTimers + // otherwise it will throw an error when called + // "Receiver must be an instance of MockTimers" + // because #setImmediate is the only function here + // that calls #createTimer and it's not bound to MockTimers + globalThis.setImmediate = FunctionPrototypeBind( + this.#setImmediate, + this, + ); globalThis.clearImmediate = this.#clearImmediate; - nodeTimers.setImmediate = this.#setImmediate; + nodeTimers.setImmediate = FunctionPrototypeBind( + this.#setImmediate, + this, + ); nodeTimers.clearImmediate = this.#clearImmediate; - nodeTimersPromises.setImmediate = FunctionPrototypeBind( this.#setImmediatePromisified, this, ); }, + Date: () => { + this.#nativeDateDescriptor = ObjectGetOwnPropertyDescriptor(globalThis, 'Date'); + globalThis.Date = this.#createDate(); + }, }, toReal: { __proto__: null, @@ -294,6 +594,9 @@ class MockTimers { setImmediate: () => { this.#restoreSetImmediate(); }, + Date: () => { + ObjectDefineProperty(globalThis, 'Date', this.#nativeDateDescriptor); + }, }, }; @@ -302,159 +605,6 @@ class MockTimers { this.#isEnabled = activate; } - #restoreSetImmediate() { - ObjectDefineProperty( - globalThis, - 'setImmediate', - this.#realSetImmediate, - ); - ObjectDefineProperty( - globalThis, - 'clearImmediate', - this.#realClearImmediate, - ); - ObjectDefineProperty( - nodeTimers, - 'setImmediate', - this.#realTimersSetImmediate, - ); - ObjectDefineProperty( - nodeTimers, - 'clearImmediate', - this.#realTimersClearImmediate, - ); - ObjectDefineProperty( - nodeTimersPromises, - 'setImmediate', - this.#realPromisifiedSetImmediate, - ); - } - - #restoreOriginalSetInterval() { - ObjectDefineProperty( - globalThis, - 'setInterval', - this.#realSetInterval, - ); - ObjectDefineProperty( - globalThis, - 'clearInterval', - this.#realClearInterval, - ); - ObjectDefineProperty( - nodeTimers, - 'setInterval', - this.#realTimersSetInterval, - ); - ObjectDefineProperty( - nodeTimers, - 'clearInterval', - this.#realTimersClearInterval, - ); - ObjectDefineProperty( - nodeTimersPromises, - 'setInterval', - this.#realPromisifiedSetInterval, - ); - } - - #restoreOriginalSetTimeout() { - ObjectDefineProperty( - globalThis, - 'setTimeout', - this.#realSetTimeout, - ); - ObjectDefineProperty( - globalThis, - 'clearTimeout', - this.#realClearTimeout, - ); - ObjectDefineProperty( - nodeTimers, - 'setTimeout', - this.#realTimersSetTimeout, - ); - ObjectDefineProperty( - nodeTimers, - 'clearTimeout', - this.#realTimersClearTimeout, - ); - ObjectDefineProperty( - nodeTimersPromises, - 'setTimeout', - this.#realPromisifiedSetTimeout, - ); - } - - #storeOriginalSetImmediate() { - this.#realSetImmediate = ObjectGetOwnPropertyDescriptor( - globalThis, - 'setImmediate', - ); - this.#realClearImmediate = ObjectGetOwnPropertyDescriptor( - globalThis, - 'clearImmediate', - ); - this.#realTimersSetImmediate = ObjectGetOwnPropertyDescriptor( - nodeTimers, - 'setImmediate', - ); - this.#realTimersClearImmediate = ObjectGetOwnPropertyDescriptor( - nodeTimers, - 'clearImmediate', - ); - this.#realPromisifiedSetImmediate = ObjectGetOwnPropertyDescriptor( - nodeTimersPromises, - 'setImmediate', - ); - } - - #storeOriginalSetInterval() { - this.#realSetInterval = ObjectGetOwnPropertyDescriptor( - globalThis, - 'setInterval', - ); - this.#realClearInterval = ObjectGetOwnPropertyDescriptor( - globalThis, - 'clearInterval', - ); - this.#realTimersSetInterval = ObjectGetOwnPropertyDescriptor( - nodeTimers, - 'setInterval', - ); - this.#realTimersClearInterval = ObjectGetOwnPropertyDescriptor( - nodeTimers, - 'clearInterval', - ); - this.#realPromisifiedSetInterval = ObjectGetOwnPropertyDescriptor( - nodeTimersPromises, - 'setInterval', - ); - } - - #storeOriginalSetTimeout() { - this.#realSetTimeout = ObjectGetOwnPropertyDescriptor( - globalThis, - 'setTimeout', - ); - this.#realClearTimeout = ObjectGetOwnPropertyDescriptor( - globalThis, - 'clearTimeout', - ); - this.#realTimersSetTimeout = ObjectGetOwnPropertyDescriptor( - nodeTimers, - 'setTimeout', - ); - this.#realTimersClearTimeout = ObjectGetOwnPropertyDescriptor( - nodeTimers, - 'clearTimeout', - ); - this.#realPromisifiedSetTimeout = ObjectGetOwnPropertyDescriptor( - nodeTimersPromises, - 'setTimeout', - ); - } - /** * Advances the virtual time of MockTimers by the specified duration (in milliseconds). * This method simulates the passage of time and triggers any scheduled timers that are due. @@ -463,19 +613,8 @@ class MockTimers { * @throws {ERR_INVALID_ARG_VALUE} If a negative time value is provided. */ tick(time = 1) { - if (!this.#isEnabled) { - throw new ERR_INVALID_STATE( - 'You should enable MockTimers first by calling the .enable function', - ); - } - - if (time < 0) { - throw new ERR_INVALID_ARG_VALUE( - 'time', - 'positive integer', - time, - ); - } + this.#assertTimersAreEnabled(); + this.#assertTimeArg(time); this.#now += time; let timer = this.#executionQueue.peek(); @@ -484,11 +623,11 @@ class MockTimers { FunctionPrototypeApply(timer.callback, undefined, timer.args); this.#executionQueue.shift(); + timer.priorityQueuePosition = undefined; - if (timer.interval) { + if (timer.interval !== undefined) { timer.runAt += timer.interval; this.#executionQueue.insert(timer); - return; } timer = this.#executionQueue.peek(); @@ -496,36 +635,68 @@ class MockTimers { } /** - * Enables MockTimers for the specified timers. - * @param {string[]} timers - An array of timer types to enable, e.g., ['setTimeout', 'setInterval']. - * @throws {ERR_INVALID_STATE} If MockTimers are already enabled. - * @throws {ERR_INVALID_ARG_VALUE} If an unsupported timer type is specified. + * @typedef {{apis: SUPPORTED_APIS;now: number | Date;}} EnableOptions Options to enable the timers + * @property {SUPPORTED_APIS} apis List of timers to enable, defaults to all + * @property {number | Date} now The epoch to which the timers should be set to, defaults to 0 */ - enable(timers = SUPPORTED_TIMERS) { + /** + * Enables the MockTimers replacing the native timers with the fake ones. + * @param {EnableOptions} options + */ + enable(options = { __proto__: null, apis: SUPPORTED_APIS, now: 0 }) { + const internalOptions = { __proto__: null, ...options }; if (this.#isEnabled) { - throw new ERR_INVALID_STATE( - 'MockTimers is already enabled!', - ); + throw new ERR_INVALID_STATE('MockTimers is already enabled!'); + } + + if (NumberIsNaN(internalOptions.now)) { + throw new ERR_INVALID_ARG_VALUE('now', internalOptions.now, `epoch must be a positive integer received ${internalOptions.now}`); } - validateArray(timers, 'timers'); + if (!internalOptions.now) { + internalOptions.now = 0; + } + + if (!internalOptions.apis) { + internalOptions.apis = SUPPORTED_APIS; + } + validateArray(internalOptions.apis, 'options.apis'); // Check that the timers passed are supported - ArrayPrototypeForEach(timers, (timer) => { - if (!ArrayPrototypeIncludes(SUPPORTED_TIMERS, timer)) { + ArrayPrototypeForEach(internalOptions.apis, (timer) => { + if (!ArrayPrototypeIncludes(SUPPORTED_APIS, timer)) { throw new ERR_INVALID_ARG_VALUE( - 'timers', + 'options.apis', timer, `option ${timer} is not supported`, ); } }); + this.#timersInContext = internalOptions.apis; + + // Checks if the second argument is the initial time + if (this.#isValidDateWithGetTime(internalOptions.now)) { + this.#now = DatePrototypeGetTime(internalOptions.now); + } else if (validateNumber(internalOptions.now, 'initialTime') === undefined) { + this.#assertTimeArg(internalOptions.now); + this.#now = internalOptions.now; + } - this.#timersInContext = timers; - this.#now = DateNow(); this.#toggleEnableTimers(true); } + /** + * Sets the current time to the given epoch. + * @param {number} time The epoch to set the current time to. + */ + setTime(time = kInitialEpoch) { + validateNumber(time, 'time'); + this.#assertTimeArg(time); + this.#assertTimersAreEnabled(); + + this.#now = time; + } + /** * An alias for `this.reset()`, allowing the disposal of the `MockTimers` instance. */ @@ -543,6 +714,7 @@ class MockTimers { this.#toggleEnableTimers(false); this.#timersInContext = []; + this.#now = kInitialEpoch; let timer = this.#executionQueue.peek(); while (timer) { @@ -556,13 +728,10 @@ class MockTimers { * @throws {ERR_INVALID_STATE} If MockTimers are not enabled. */ runAll() { - if (!this.#isEnabled) { - throw new ERR_INVALID_STATE( - 'You should enable MockTimers first by calling the .enable function', - ); - } - - this.tick(Infinity); + this.#assertTimersAreEnabled(); + const longestTimer = this.#executionQueue.peekBottom(); + if (!longestTimer) return; + this.tick(longestTimer.runAt - this.#now); } } diff --git a/lib/internal/test_runner/reporter/lcov.js b/lib/internal/test_runner/reporter/lcov.js new file mode 100644 index 00000000000000..698913d79dec02 --- /dev/null +++ b/lib/internal/test_runner/reporter/lcov.js @@ -0,0 +1,107 @@ +'use strict'; + +const { relative } = require('path'); +const Transform = require('internal/streams/transform'); + +// This reporter is based on the LCOV format, as described here: +// https://ltp.sourceforge.net/coverage/lcov/geninfo.1.php +// Excerpts from this documentation are included in the comments that make up +// the _transform function below. +class LcovReporter extends Transform { + constructor(options) { + super({ ...options, writableObjectMode: true, __proto__: null }); + } + + _transform(event, _encoding, callback) { + if (event.type !== 'test:coverage') { + return callback(null); + } + let lcov = ''; + // A tracefile is made up of several human-readable lines of text, divided + // into sections. If available, a tracefile begins with the testname which + // is stored in the following format: + // ## TN:\ + lcov += 'TN:\n'; + const { + data: { + summary: { workingDirectory }, + }, + } = event; + try { + for (let i = 0; i < event.data.summary.files.length; i++) { + const file = event.data.summary.files[i]; + // For each source file referenced in the .da file, there is a section + // containing filename and coverage data: + // ## SF:\ + lcov += `SF:${relative(workingDirectory, file.path)}\n`; + + // Following is a list of line numbers for each function name found in + // the source file: + // ## FN:\,\ + // + // After, there is a list of execution counts for each instrumented + // function: + // ## FNDA:\,\ + // + // This loop adds the FN lines to the lcov variable as it goes and + // gathers the FNDA lines to be added later. This way we only loop + // through the list of functions once. + let fnda = ''; + for (let j = 0; j < file.functions.length; j++) { + const func = file.functions[j]; + const name = func.name || `anonymous_${j}`; + lcov += `FN:${func.line},${name}\n`; + fnda += `FNDA:${func.count},${name}\n`; + } + lcov += fnda; + + // This list is followed by two lines containing the number of + // functions found and hit: + // ## FNF:\ + // ## FNH:\ + lcov += `FNF:${file.totalFunctionCount}\n`; + lcov += `FNH:${file.coveredFunctionCount}\n`; + + // Branch coverage information is stored which one line per branch: + // ## BRDA:\,\,\,\ + // Block number and branch number are gcc internal IDs for the branch. + // Taken is either '-' if the basic block containing the branch was + // never executed or a number indicating how often that branch was + // taken. + for (let j = 0; j < file.branches.length; j++) { + lcov += `BRDA:${file.branches[j].line},${j},0,${file.branches[j].count}\n`; + } + + // Branch coverage summaries are stored in two lines: + // ## BRF:\ + // ## BRH:\ + lcov += `BRF:${file.totalBranchCount}\n`; + lcov += `BRH:${file.coveredBranchCount}\n`; + + // Then there is a list of execution counts for each instrumented line + // (i.e. a line which resulted in executable code): + // ## DA:\,\[,\] + const sortedLines = file.lines.toSorted((a, b) => a.line - b.line); + for (let j = 0; j < sortedLines.length; j++) { + lcov += `DA:${sortedLines[j].line},${sortedLines[j].count}\n`; + } + + // At the end of a section, there is a summary about how many lines + // were found and how many were actually instrumented: + // ## LH:\ + // ## LF:\ + lcov += `LH:${file.coveredLineCount}\n`; + lcov += `LF:${file.totalLineCount}\n`; + + // Each sections ends with: + // end_of_record + lcov += 'end_of_record\n'; + } + } catch (error) { + return callback(error); + } + return callback(null, lcov); + } +} + +module.exports = LcovReporter; diff --git a/lib/internal/test_runner/reporter/spec.js b/lib/internal/test_runner/reporter/spec.js index 0c5a3e95c7c75a..b93405872f278c 100644 --- a/lib/internal/test_runner/reporter/spec.js +++ b/lib/internal/test_runner/reporter/spec.js @@ -14,19 +14,11 @@ const { const assert = require('assert'); const Transform = require('internal/streams/transform'); const { inspectWithNoCustomRetry } = require('internal/errors'); -const { green, blue, red, white, gray, shouldColorize } = require('internal/util/colors'); +const colors = require('internal/util/colors'); const { kSubtestsFailed } = require('internal/test_runner/test'); const { getCoverageReport } = require('internal/test_runner/utils'); const { relative } = require('path'); -const inspectOptions = { __proto__: null, colors: shouldColorize(process.stdout), breakLength: Infinity }; - -const colors = { - '__proto__': null, - 'test:fail': red, - 'test:pass': green, - 'test:diagnostic': blue, -}; const symbols = { '__proto__': null, 'test:fail': '\u2716 ', @@ -42,9 +34,19 @@ class SpecReporter extends Transform { #indentMemo = new SafeMap(); #failedTests = []; #cwd = process.cwd(); + #inspectOptions; + #colors; constructor() { super({ __proto__: null, writableObjectMode: true }); + colors.refresh(); + this.#inspectOptions = { __proto__: null, colors: colors.shouldColorize(process.stdout), breakLength: Infinity }; + this.#colors = { + '__proto__': null, + 'test:fail': colors.red, + 'test:pass': colors.green, + 'test:diagnostic': colors.blue, + }; } #indent(nesting) { @@ -62,15 +64,15 @@ class SpecReporter extends Transform { const message = ArrayPrototypeJoin( RegExpPrototypeSymbolSplit( hardenRegExp(/\r?\n/), - inspectWithNoCustomRetry(err, inspectOptions), + inspectWithNoCustomRetry(err, this.#inspectOptions), ), `\n${indent} `); return `\n${indent} ${message}\n`; } #formatTestReport(type, data, prefix = '', indent = '', hasChildren = false) { - let color = colors[type] ?? white; + let color = this.#colors[type] ?? colors.white; let symbol = symbols[type] ?? ' '; const { skip, todo } = data; - const duration_ms = data.details?.duration_ms ? ` ${gray}(${data.details.duration_ms}ms)${white}` : ''; + const duration_ms = data.details?.duration_ms ? ` ${colors.gray}(${data.details.duration_ms}ms)${colors.white}` : ''; let title = `${data.name}${duration_ms}`; if (skip !== undefined) { @@ -78,16 +80,17 @@ class SpecReporter extends Transform { } else if (todo !== undefined) { title += ` # ${typeof todo === 'string' && todo.length ? todo : 'TODO'}`; } + const error = this.#formatError(data.details?.error, indent); if (hasChildren) { // If this test has had children - it was already reported, so slightly modify the output - return `${prefix}${indent}${color}${symbols['arrow:right']}${white}${title}\n`; + const err = data.details?.error?.failureType === 'subtestsFailed' ? '' : error; + return `${prefix}${indent}${color}${symbols['arrow:right']}${colors.white}${title}\n${err}`; } - const error = this.#formatError(data.details?.error, indent); if (skip !== undefined) { - color = gray; + color = colors.gray; symbol = symbols['hyphen:minus']; } - return `${prefix}${indent}${color}${symbol}${title}${white}${error}`; + return `${prefix}${indent}${color}${symbol}${title}${colors.white}${error}`; } #handleTestReportEvent(type, data) { const subtest = ArrayPrototypeShift(this.#stack); // This is the matching `test:start` event @@ -129,9 +132,9 @@ class SpecReporter extends Transform { case 'test:stdout': return data.message; case 'test:diagnostic': - return `${colors[type]}${this.#indent(data.nesting)}${symbols[type]}${data.message}${white}\n`; + return `${this.#colors[type]}${this.#indent(data.nesting)}${symbols[type]}${data.message}${colors.white}\n`; case 'test:coverage': - return getCoverageReport(this.#indent(data.nesting), data.summary, symbols['test:coverage'], blue, true); + return getCoverageReport(this.#indent(data.nesting), data.summary, symbols['test:coverage'], colors.blue, true); } } _transform({ type, data }, encoding, callback) { @@ -142,7 +145,7 @@ class SpecReporter extends Transform { callback(null, ''); return; } - const results = [`\n${colors['test:fail']}${symbols['test:fail']}failing tests:${white}\n`]; + const results = [`\n${this.#colors['test:fail']}${symbols['test:fail']}failing tests:${colors.white}\n`]; for (let i = 0; i < this.#failedTests.length; i++) { const test = this.#failedTests[i]; const relPath = relative(this.#cwd, test.file); diff --git a/lib/internal/test_runner/reporter/tap.js b/lib/internal/test_runner/reporter/tap.js index 1f60cfa619886e..e8cf727daede64 100644 --- a/lib/internal/test_runner/reporter/tap.js +++ b/lib/internal/test_runner/reporter/tap.js @@ -58,7 +58,7 @@ async function * tapReporter(source) { yield `${indent(data.nesting)}# ${tapEscape(data.message)}\n`; break; case 'test:coverage': - yield getCoverageReport(indent(data.nesting), data.summary, '# ', ''); + yield getCoverageReport(indent(data.nesting), data.summary, '# ', '', true); break; } } diff --git a/lib/internal/test_runner/runner.js b/lib/internal/test_runner/runner.js index cc9bcc09b714fe..242e807fa68883 100644 --- a/lib/internal/test_runner/runner.js +++ b/lib/internal/test_runner/runner.js @@ -70,6 +70,7 @@ const { convertStringToRegExp, countCompletedTest, kDefaultPattern, + shouldColorizeTestFiles, } = require('internal/test_runner/utils'); const { Glob } = require('internal/fs/glob'); const { once } = require('events'); @@ -318,7 +319,7 @@ class FileTest extends Test { function runTestFile(path, filesWatcher, opts) { const watchMode = filesWatcher != null; - const subtest = opts.root.createSubtest(FileTest, path, async (t) => { + const subtest = opts.root.createSubtest(FileTest, path, { __proto__: null, signal: opts.signal }, async (t) => { const args = getRunArgs(path, opts); const stdio = ['pipe', 'pipe', 'pipe']; const env = { __proto__: null, ...process.env, NODE_TEST_CONTEXT: 'child-v8' }; @@ -487,6 +488,11 @@ function run(options = kEmptyObject) { } const root = createTestTree({ __proto__: null, concurrency, timeout, signal }); + root.harness.shouldColorizeTestFiles ||= shouldColorizeTestFiles(root); + + if (process.env.NODE_TEST_CONTEXT !== undefined) { + return root.reporter; + } let testFiles = files ?? createTestFileList(); if (shard) { @@ -509,7 +515,7 @@ function run(options = kEmptyObject) { }); }; - PromisePrototypeThen(PromisePrototypeThen(PromiseResolve(setup?.(root)), runFiles), postRun); + PromisePrototypeThen(PromisePrototypeThen(PromiseResolve(setup?.(root.reporter)), runFiles), postRun); return root.reporter; } diff --git a/lib/internal/test_runner/test.js b/lib/internal/test_runner/test.js index 4eb02c5d4e3118..19ae283ed9ad78 100644 --- a/lib/internal/test_runner/test.js +++ b/lib/internal/test_runner/test.js @@ -924,6 +924,7 @@ class Suite extends Test { const hookArgs = this.getRunArgs(); let stopPromise; + const after = runOnce(() => this.runHook('after', hookArgs)); try { this.parent.activeSubtests++; await this.buildSuite; @@ -946,10 +947,11 @@ class Suite extends Test { const promise = SafePromiseAll(subtests, (subtests) => subtests.start()); await SafePromiseRace([promise, stopPromise]); - await this.runHook('after', hookArgs); + await after(); this.pass(); } catch (err) { + try { await after(); } catch { /* suite is already failing */ } if (isTestFailureError(err)) { this.fail(err); } else { diff --git a/lib/internal/test_runner/utils.js b/lib/internal/test_runner/utils.js index b70ca649c8b8df..184d44dce6c162 100644 --- a/lib/internal/test_runner/utils.js +++ b/lib/internal/test_runner/utils.js @@ -5,6 +5,7 @@ const { ArrayPrototypeFlatMap, ArrayPrototypePush, ArrayPrototypeReduce, + ArrayPrototypeSome, ObjectGetOwnPropertyDescriptor, MathFloor, MathMax, @@ -112,6 +113,7 @@ const kBuiltinReporters = new SafeMap([ ['dot', 'internal/test_runner/reporter/dot'], ['tap', 'internal/test_runner/reporter/tap'], ['junit', 'internal/test_runner/reporter/junit'], + ['lcov', 'internal/test_runner/reporter/lcov'], ]); const kDefaultReporter = process.stdout.isTTY ? 'spec' : 'tap'; @@ -127,10 +129,18 @@ function tryBuiltinReporter(name) { return require(builtinPath); } -async function getReportersMap(reporters, destinations, rootTest) { +function shouldColorizeTestFiles(rootTest) { + // This function assumes only built-in destinations (stdout/stderr) supports coloring + const { reporters, destinations } = parseCommandLine(); + return ArrayPrototypeSome(reporters, (_, index) => { + const destination = kBuiltinDestinations.get(destinations[index]); + return destination && shouldColorize(destination); + }); +} + +async function getReportersMap(reporters, destinations) { return SafePromiseAllReturnArrayLike(reporters, async (name, i) => { const destination = kBuiltinDestinations.get(destinations[i]) ?? createWriteStream(destinations[i]); - rootTest.harness.shouldColorizeTestFiles ||= shouldColorize(destination); // Load the test reporter passed to --test-reporter let reporter = tryBuiltinReporter(name); @@ -165,12 +175,12 @@ async function getReportersMap(reporters, destinations, rootTest) { } const reporterScope = new AsyncResource('TestReporterScope'); -const setupTestReporters = reporterScope.bind(async (rootTest) => { +const setupTestReporters = reporterScope.bind(async (rootReporter) => { const { reporters, destinations } = parseCommandLine(); - const reportersMap = await getReportersMap(reporters, destinations, rootTest); + const reportersMap = await getReportersMap(reporters, destinations); for (let i = 0; i < reportersMap.length; i++) { const { reporter, destination } = reportersMap[i]; - compose(rootTest.reporter, reporter).pipe(destination); + compose(rootReporter, reporter).pipe(destination); } }); @@ -420,5 +430,6 @@ module.exports = { parseCommandLine, reporterScope, setupTestReporters, + shouldColorizeTestFiles, getCoverageReport, }; diff --git a/lib/internal/tls/secure-context.js b/lib/internal/tls/secure-context.js index 0fa3098ffa1020..40d995f9890d53 100644 --- a/lib/internal/tls/secure-context.js +++ b/lib/internal/tls/secure-context.js @@ -148,6 +148,31 @@ function configSecureContext(context, options = kEmptyObject, name = 'options') ticketKeys, } = options; + // Set the cipher list and cipher suite before anything else because + // @SECLEVEL= changes the security level and that affects subsequent + // operations. + if (ciphers !== undefined && ciphers !== null) + validateString(ciphers, `${name}.ciphers`); + + // Work around an OpenSSL API quirk. cipherList is for TLSv1.2 and below, + // cipherSuites is for TLSv1.3 (and presumably any later versions). TLSv1.3 + // cipher suites all have a standard name format beginning with TLS_, so split + // the ciphers and pass them to the appropriate API. + const { + cipherList, + cipherSuites, + } = processCiphers(ciphers, `${name}.ciphers`); + + if (cipherSuites !== '') + context.setCipherSuites(cipherSuites); + context.setCiphers(cipherList); + + if (cipherList === '' && + context.getMinProto() < TLS1_3_VERSION && + context.getMaxProto() > TLS1_2_VERSION) { + context.setMinProto(TLS1_3_VERSION); + } + // Add CA before the cert to be able to load cert's issuer in C++ code. // NOTE(@jasnell): ca, cert, and key are permitted to be falsy, so do not // change the checks to !== undefined checks. @@ -218,28 +243,6 @@ function configSecureContext(context, options = kEmptyObject, name = 'options') } } - if (ciphers !== undefined && ciphers !== null) - validateString(ciphers, `${name}.ciphers`); - - // Work around an OpenSSL API quirk. cipherList is for TLSv1.2 and below, - // cipherSuites is for TLSv1.3 (and presumably any later versions). TLSv1.3 - // cipher suites all have a standard name format beginning with TLS_, so split - // the ciphers and pass them to the appropriate API. - const { - cipherList, - cipherSuites, - } = processCiphers(ciphers, `${name}.ciphers`); - - if (cipherSuites !== '') - context.setCipherSuites(cipherSuites); - context.setCiphers(cipherList); - - if (cipherList === '' && - context.getMinProto() < TLS1_3_VERSION && - context.getMaxProto() > TLS1_2_VERSION) { - context.setMinProto(TLS1_3_VERSION); - } - validateString(ecdhCurve, `${name}.ecdhCurve`); context.setECDHCurve(ecdhCurve); diff --git a/lib/internal/url.js b/lib/internal/url.js index ca41c48582b19d..38f97926064595 100644 --- a/lib/internal/url.js +++ b/lib/internal/url.js @@ -26,6 +26,7 @@ const { StringPrototypeIndexOf, StringPrototypeSlice, StringPrototypeStartsWith, + StringPrototypeToWellFormed, Symbol, SymbolIterator, SymbolToStringTag, @@ -42,7 +43,6 @@ const { const { getConstructorOf, removeColors, - toUSVString, kEnumerableProperty, SideEffectFreeRegExpPrototypeSymbolReplace, } = require('internal/util'); @@ -366,7 +366,11 @@ class URLSearchParams { throw new ERR_INVALID_TUPLE('Each query pair', '[name, value]'); } // Append (innerSequence[0], innerSequence[1]) to querys list. - ArrayPrototypePush(this.#searchParams, toUSVString(pair[0]), toUSVString(pair[1])); + ArrayPrototypePush( + this.#searchParams, + StringPrototypeToWellFormed(`${pair[0]}`), + StringPrototypeToWellFormed(`${pair[1]}`), + ); } else { if (((typeof pair !== 'object' && typeof pair !== 'function') || typeof pair[SymbolIterator] !== 'function')) { @@ -377,7 +381,7 @@ class URLSearchParams { for (const element of pair) { length++; - ArrayPrototypePush(this.#searchParams, toUSVString(element)); + ArrayPrototypePush(this.#searchParams, StringPrototypeToWellFormed(`${element}`)); } // If innerSequence's size is not 2, then throw a TypeError. @@ -395,8 +399,8 @@ class URLSearchParams { const key = keys[i]; const desc = ReflectGetOwnPropertyDescriptor(init, key); if (desc !== undefined && desc.enumerable) { - const typedKey = toUSVString(key); - const typedValue = toUSVString(init[key]); + const typedKey = StringPrototypeToWellFormed(key); + const typedValue = StringPrototypeToWellFormed(`${init[key]}`); // Two different keys may become the same USVString after normalization. // In that case, we retain the later one. Refer to WPT. @@ -413,7 +417,7 @@ class URLSearchParams { } } else { // https://url.spec.whatwg.org/#dom-urlsearchparams-urlsearchparams - init = toUSVString(init); + init = StringPrototypeToWellFormed(`${init}`); this.#searchParams = init ? parseParams(init) : []; } } @@ -468,8 +472,8 @@ class URLSearchParams { throw new ERR_MISSING_ARGS('name', 'value'); } - name = toUSVString(name); - value = toUSVString(value); + name = StringPrototypeToWellFormed(`${name}`); + value = StringPrototypeToWellFormed(`${value}`); ArrayPrototypePush(this.#searchParams, name, value); if (this.#context) { this.#context.search = this.toString(); @@ -485,10 +489,10 @@ class URLSearchParams { } const list = this.#searchParams; - name = toUSVString(name); + name = StringPrototypeToWellFormed(`${name}`); if (value !== undefined) { - value = toUSVString(value); + value = StringPrototypeToWellFormed(`${value}`); for (let i = 0; i < list.length;) { if (list[i] === name && list[i + 1] === value) { list.splice(i, 2); @@ -519,7 +523,7 @@ class URLSearchParams { } const list = this.#searchParams; - name = toUSVString(name); + name = StringPrototypeToWellFormed(`${name}`); for (let i = 0; i < list.length; i += 2) { if (list[i] === name) { return list[i + 1]; @@ -538,7 +542,7 @@ class URLSearchParams { const list = this.#searchParams; const values = []; - name = toUSVString(name); + name = StringPrototypeToWellFormed(`${name}`); for (let i = 0; i < list.length; i += 2) { if (list[i] === name) { values.push(list[i + 1]); @@ -556,10 +560,10 @@ class URLSearchParams { } const list = this.#searchParams; - name = toUSVString(name); + name = StringPrototypeToWellFormed(`${name}`); if (value !== undefined) { - value = toUSVString(value); + value = StringPrototypeToWellFormed(`${value}`); } for (let i = 0; i < list.length; i += 2) { @@ -582,8 +586,8 @@ class URLSearchParams { } const list = this.#searchParams; - name = toUSVString(name); - value = toUSVString(value); + name = StringPrototypeToWellFormed(`${name}`); + value = StringPrototypeToWellFormed(`${value}`); // If there are any name-value pairs whose name is `name`, in `list`, set // the value of the first such name-value pair to `value` and remove the @@ -773,7 +777,7 @@ class URL { throw new ERR_MISSING_ARGS('url'); } - // toUSVString is not needed. + // StringPrototypeToWellFormed is not needed. input = `${input}`; if (base !== undefined) { @@ -1006,7 +1010,7 @@ class URL { } set search(value) { - const href = bindingUrl.update(this.#context.href, updateActions.kSearch, toUSVString(value)); + const href = bindingUrl.update(this.#context.href, updateActions.kSearch, StringPrototypeToWellFormed(`${value}`)); if (href) { this.#updateContext(href); } @@ -1104,6 +1108,10 @@ function installObjectURLMethods() { } function revokeObjectURL(url) { + if (arguments.length === 0) { + throw new ERR_MISSING_ARGS('url'); + } + bindingBlob.revokeObjectURL(`${url}`); } @@ -1297,7 +1305,7 @@ function domainToASCII(domain) { if (arguments.length < 1) throw new ERR_MISSING_ARGS('domain'); - // toUSVString is not needed. + // StringPrototypeToWellFormed is not needed. return bindingUrl.domainToASCII(`${domain}`); } @@ -1305,7 +1313,7 @@ function domainToUnicode(domain) { if (arguments.length < 1) throw new ERR_MISSING_ARGS('domain'); - // toUSVString is not needed. + // StringPrototypeToWellFormed is not needed. return bindingUrl.domainToUnicode(`${domain}`); } @@ -1501,7 +1509,6 @@ function getURLOrigin(url) { } module.exports = { - toUSVString, fileURLToPath, pathToFileURL, toPathIfFileURL, diff --git a/lib/internal/util.js b/lib/internal/util.js index 558a5da69773bb..b32c0e8472b320 100644 --- a/lib/internal/util.js +++ b/lib/internal/util.js @@ -8,6 +8,7 @@ const { ArrayPrototypeSlice, ArrayPrototypeSort, Error, + ErrorCaptureStackTrace, FunctionPrototypeCall, ObjectDefineProperties, ObjectDefineProperty, @@ -44,11 +45,11 @@ const { } = primordials; const { - hideStackFrames, codes: { ERR_NO_CRYPTO, ERR_UNKNOWN_SIGNAL, }, + isErrorStackTraceLimitWritable, uvErrmapGet, overrideStackTrace, } = require('internal/errors'); @@ -61,7 +62,6 @@ const { decorated_private_symbol, }, sleep: _sleep, - toUSVString: _toUSVString, } = internalBinding('util'); const { isNativeError, isPromise } = internalBinding('types'); const { getOptionValue } = require('internal/options'); @@ -72,18 +72,6 @@ const experimentalWarnings = new SafeSet(); const colorRegExp = /\u001b\[\d\d?m/g; // eslint-disable-line no-control-regex -const unpairedSurrogateRe = - /(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])/; -function toUSVString(val) { - const str = `${val}`; - // As of V8 5.5, `str.search()` (and `unpairedSurrogateRe[@@search]()`) are - // slower than `unpairedSurrogateRe.exec()`. - const match = RegExpPrototypeExec(unpairedSurrogateRe, str); - if (!match) - return str; - return _toUSVString(str, match.index); -} - let uvBinding; function lazyUv() { @@ -219,13 +207,13 @@ function slowCases(enc) { case 4: if (enc === 'UTF8') return 'utf8'; if (enc === 'ucs2' || enc === 'UCS2') return 'utf16le'; - enc = `${enc}`.toLowerCase(); + enc = StringPrototypeToLowerCase(enc); if (enc === 'utf8') return 'utf8'; if (enc === 'ucs2') return 'utf16le'; break; case 3: if (enc === 'hex' || enc === 'HEX' || - `${enc}`.toLowerCase() === 'hex') + StringPrototypeToLowerCase(enc) === 'hex') return 'hex'; break; case 5: @@ -234,7 +222,7 @@ function slowCases(enc) { if (enc === 'UTF-8') return 'utf8'; if (enc === 'ASCII') return 'ascii'; if (enc === 'UCS-2') return 'utf16le'; - enc = `${enc}`.toLowerCase(); + enc = StringPrototypeToLowerCase(enc); if (enc === 'utf-8') return 'utf8'; if (enc === 'ascii') return 'ascii'; if (enc === 'ucs-2') return 'utf16le'; @@ -244,23 +232,23 @@ function slowCases(enc) { if (enc === 'latin1' || enc === 'binary') return 'latin1'; if (enc === 'BASE64') return 'base64'; if (enc === 'LATIN1' || enc === 'BINARY') return 'latin1'; - enc = `${enc}`.toLowerCase(); + enc = StringPrototypeToLowerCase(enc); if (enc === 'base64') return 'base64'; if (enc === 'latin1' || enc === 'binary') return 'latin1'; break; case 7: if (enc === 'utf16le' || enc === 'UTF16LE' || - `${enc}`.toLowerCase() === 'utf16le') + StringPrototypeToLowerCase(enc) === 'utf16le') return 'utf16le'; break; case 8: if (enc === 'utf-16le' || enc === 'UTF-16LE' || - `${enc}`.toLowerCase() === 'utf-16le') + StringPrototypeToLowerCase(enc) === 'utf-16le') return 'utf16le'; break; case 9: if (enc === 'base64url' || enc === 'BASE64URL' || - `${enc}`.toLowerCase() === 'base64url') + StringPrototypeToLowerCase(enc) === 'base64url') return 'base64url'; break; default: @@ -693,10 +681,19 @@ const lazyDOMExceptionClass = () => { return _DOMException; }; -const lazyDOMException = hideStackFrames((message, name) => { +const lazyDOMException = (message, name) => { _DOMException ??= internalBinding('messaging').DOMException; + if (isErrorStackTraceLimitWritable()) { + const limit = Error.stackTraceLimit; + Error.stackTraceLimit = 0; + const ex = new _DOMException(message, name); + Error.stackTraceLimit = limit; + ErrorCaptureStackTrace(ex, lazyDOMException); + return ex; + } return new _DOMException(message, name); -}); + +}; const kEnumerableProperty = { __proto__: null }; kEnumerableProperty.enumerable = true; @@ -903,7 +900,6 @@ module.exports = { sleep, spliceOne, setupCoverageHooks, - toUSVString, removeColors, // Symbol used to customize promisify conversion diff --git a/lib/internal/util/comparisons.js b/lib/internal/util/comparisons.js index d86e59adae9880..f9354d01ce5730 100644 --- a/lib/internal/util/comparisons.js +++ b/lib/internal/util/comparisons.js @@ -21,6 +21,7 @@ const { StringPrototypeValueOf, SymbolPrototypeValueOf, TypedArrayPrototypeGetSymbolToStringTag, + TypedArrayPrototypeGetByteLength, Uint8Array, } = primordials; @@ -43,6 +44,8 @@ const { isSymbolObject, isFloat32Array, isFloat64Array, + isKeyObject, + isCryptoKey, } = types; const { constants: { @@ -60,6 +63,8 @@ const kIsArray = 1; const kIsSet = 2; const kIsMap = 3; +let kKeyObject; + // Check if they have the same source and flags function areSimilarRegExps(a, b) { return a.source === b.source && @@ -71,7 +76,8 @@ function areSimilarFloatArrays(a, b) { if (a.byteLength !== b.byteLength) { return false; } - for (let offset = 0; offset < a.byteLength; offset++) { + const len = TypedArrayPrototypeGetByteLength(a); + for (let offset = 0; offset < len; offset++) { if (a[offset] !== b[offset]) { return false; } @@ -249,6 +255,20 @@ function innerDeepEqual(val1, val2, strict, memos) { isNativeError(val2) || val2 instanceof Error) { return false; + } else if (isKeyObject(val1)) { + if (!isKeyObject(val2) || !val1.equals(val2)) { + return false; + } + } else if (isCryptoKey(val1)) { + kKeyObject ??= require('internal/crypto/util').kKeyObject; + if (!isCryptoKey(val2) || + val1.extractable !== val2.extractable || + !innerDeepEqual(val1.algorithm, val2.algorithm, strict, memos) || + !innerDeepEqual(val1.usages, val2.usages, strict, memos) || + !innerDeepEqual(val1[kKeyObject], val2[kKeyObject], strict, memos) + ) { + return false; + } } return keyCheck(val1, val2, strict, memos, kNoIterator); } diff --git a/lib/internal/validators.js b/lib/internal/validators.js index 088a0a668ba8b2..6abf4d9a3cd7d3 100644 --- a/lib/internal/validators.js +++ b/lib/internal/validators.js @@ -22,11 +22,11 @@ const { const { hideStackFrames, codes: { - ERR_SOCKET_BAD_PORT, - ERR_INVALID_ARG_TYPE, - ERR_INVALID_ARG_VALUE, - ERR_OUT_OF_RANGE, - ERR_UNKNOWN_SIGNAL, + ERR_SOCKET_BAD_PORT: { HideStackFramesError: ERR_SOCKET_BAD_PORT }, + ERR_INVALID_ARG_TYPE: { HideStackFramesError: ERR_INVALID_ARG_TYPE }, + ERR_INVALID_ARG_VALUE: { HideStackFramesError: ERR_INVALID_ARG_VALUE }, + ERR_OUT_OF_RANGE: { HideStackFramesError: ERR_OUT_OF_RANGE }, + ERR_UNKNOWN_SIGNAL: { HideStackFramesError: ERR_UNKNOWN_SIGNAL }, }, } = require('internal/errors'); const { normalizeEncoding } = require('internal/util'); @@ -157,10 +157,10 @@ const validateUint32 = hideStackFrames((value, name, positive = false) => { */ /** @type {validateString} */ -function validateString(value, name) { +const validateString = hideStackFrames((value, name) => { if (typeof value !== 'string') throw new ERR_INVALID_ARG_TYPE(name, 'string', value); -} +}); /** * @callback validateNumber @@ -172,7 +172,7 @@ function validateString(value, name) { */ /** @type {validateNumber} */ -function validateNumber(value, name, min = undefined, max) { +const validateNumber = hideStackFrames((value, name, min = undefined, max) => { if (typeof value !== 'number') throw new ERR_INVALID_ARG_TYPE(name, 'number', value); @@ -183,7 +183,7 @@ function validateNumber(value, name, min = undefined, max) { `${min != null ? `>= ${min}` : ''}${min != null && max != null ? ' && ' : ''}${max != null ? `<= ${max}` : ''}`, value); } -} +}); /** * @callback validateOneOf @@ -213,10 +213,10 @@ const validateOneOf = hideStackFrames((value, name, oneOf) => { */ /** @type {validateBoolean} */ -function validateBoolean(value, name) { +const validateBoolean = hideStackFrames((value, name) => { if (typeof value !== 'boolean') throw new ERR_INVALID_ARG_TYPE(name, 'boolean', value); -} +}); const kValidateObjectNone = 0; const kValidateObjectAllowNullable = 1 << 0; @@ -309,12 +309,16 @@ const validateArray = hideStackFrames((value, name, minLength = 0) => { */ /** @type {validateStringArray} */ -function validateStringArray(value, name) { +const validateStringArray = hideStackFrames((value, name) => { validateArray(value, name); - for (let i = 0; i < value.length; i++) { - validateString(value[i], `${name}[${i}]`); + for (let i = 0; i < value.length; ++i) { + // Don't use validateString here for performance reasons, as + // we would generate intermediate strings for the name. + if (typeof value[i] !== 'string') { + throw new ERR_INVALID_ARG_TYPE(`${name}[${i}]`, 'string', value[i]); + } } -} +}); /** * @callback validateBooleanArray @@ -324,12 +328,16 @@ function validateStringArray(value, name) { */ /** @type {validateBooleanArray} */ -function validateBooleanArray(value, name) { +const validateBooleanArray = hideStackFrames((value, name) => { validateArray(value, name); - for (let i = 0; i < value.length; i++) { - validateBoolean(value[i], `${name}[${i}]`); + for (let i = 0; i < value.length; ++i) { + // Don't use validateBoolean here for performance reasons, as + // we would generate intermediate strings for the name. + if (value[i] !== true && value[i] !== false) { + throw new ERR_INVALID_ARG_TYPE(`${name}[${i}]`, 'boolean', value[i]); + } } -} +}); /** * @callback validateAbortSignalArray @@ -356,7 +364,7 @@ function validateAbortSignalArray(value, name) { * @param {string} [name='signal'] * @returns {asserts signal is keyof signals} */ -function validateSignalName(signal, name = 'signal') { +const validateSignalName = hideStackFrames((signal, name = 'signal') => { validateString(signal, name); if (signals[signal] === undefined) { @@ -367,7 +375,7 @@ function validateSignalName(signal, name = 'signal') { throw new ERR_UNKNOWN_SIGNAL(signal); } -} +}); /** * @callback validateBuffer @@ -389,7 +397,7 @@ const validateBuffer = hideStackFrames((buffer, name = 'buffer') => { * @param {string} data * @param {string} encoding */ -function validateEncoding(data, encoding) { +const validateEncoding = hideStackFrames((data, encoding) => { const normalizedEncoding = normalizeEncoding(encoding); const length = data.length; @@ -397,7 +405,7 @@ function validateEncoding(data, encoding) { throw new ERR_INVALID_ARG_VALUE('encoding', encoding, `is invalid for data of length ${length}`); } -} +}); /** * Check that the port number is not NaN when coerced to a number, @@ -407,7 +415,7 @@ function validateEncoding(data, encoding) { * @param {boolean} [allowZero=true] * @returns {number} */ -function validatePort(port, name = 'Port', allowZero = true) { +const validatePort = hideStackFrames((port, name = 'Port', allowZero = true) => { if ((typeof port !== 'number' && typeof port !== 'string') || (typeof port === 'string' && StringPrototypeTrim(port).length === 0) || +port !== (+port >>> 0) || @@ -416,7 +424,7 @@ function validatePort(port, name = 'Port', allowZero = true) { throw new ERR_SOCKET_BAD_PORT(name, port, allowZero); } return port | 0; -} +}); /** * @callback validateAbortSignal @@ -499,7 +507,7 @@ const linkValueRegExp = /^(?:<[^>]*>)(?:\s*;\s*[^;"\s]+(?:=(")?[^;"\s]*\1)?)*$/; * @param {any} value * @param {string} name */ -function validateLinkHeaderFormat(value, name) { +const validateLinkHeaderFormat = hideStackFrames((value, name) => { if ( typeof value === 'undefined' || !RegExpPrototypeExec(linkValueRegExp, value) @@ -510,7 +518,7 @@ function validateLinkHeaderFormat(value, name) { 'must be an array or string of format "; rel=preload; as=style"', ); } -} +}); const validateInternalField = hideStackFrames((object, fieldKey, className) => { if (typeof object !== 'object' || object === null || !ObjectPrototypeHasOwnProperty(object, fieldKey)) { @@ -522,9 +530,9 @@ const validateInternalField = hideStackFrames((object, fieldKey, className) => { * @param {any} hints * @return {string} */ -function validateLinkHeaderValue(hints) { +const validateLinkHeaderValue = hideStackFrames((hints) => { if (typeof hints === 'string') { - validateLinkHeaderFormat(hints, 'hints'); + validateLinkHeaderFormat.withoutStackTrace(hints, 'hints'); return hints; } else if (ArrayIsArray(hints)) { const hintsLength = hints.length; @@ -536,7 +544,7 @@ function validateLinkHeaderValue(hints) { for (let i = 0; i < hintsLength; i++) { const link = hints[i]; - validateLinkHeaderFormat(link, 'hints'); + validateLinkHeaderFormat.withoutStackTrace(link, 'hints'); result += link; if (i !== hintsLength - 1) { @@ -552,7 +560,7 @@ function validateLinkHeaderValue(hints) { hints, 'must be an array or string of format "; rel=preload; as=style"', ); -} +}); module.exports = { isInt32, diff --git a/lib/internal/vm.js b/lib/internal/vm.js index f348ef6d2d612f..6c7872fbf27b94 100644 --- a/lib/internal/vm.js +++ b/lib/internal/vm.js @@ -1,28 +1,32 @@ 'use strict'; const { - ArrayPrototypeForEach, + ReflectApply, + Symbol, } = primordials; const { + ContextifyScript, compileFunction, isContext: _isContext, } = internalBinding('contextify'); const { - validateArray, - validateBoolean, - validateBuffer, + runInContext, +} = ContextifyScript.prototype; +const { + default_host_defined_options, + vm_dynamic_import_missing_flag, +} = internalBinding('symbols'); +const { validateFunction, validateObject, - validateString, - validateStringArray, kValidateObjectAllowArray, - kValidateObjectAllowNullable, - validateInt32, } = require('internal/validators'); + const { - ERR_INVALID_ARG_TYPE, -} = require('internal/errors').codes; + getOptionValue, +} = require('internal/options'); + function isContext(object) { validateObject(object, 'object', kValidateObjectAllowArray); @@ -30,48 +34,46 @@ function isContext(object) { return _isContext(object); } -function internalCompileFunction(code, params, options) { - validateString(code, 'code'); - if (params !== undefined) { - validateStringArray(params, 'params'); +function getHostDefinedOptionId(importModuleDynamically, hint) { + if (importModuleDynamically !== undefined) { + // Check that it's either undefined or a function before we pass + // it into the native constructor. + validateFunction(importModuleDynamically, + 'options.importModuleDynamically'); } - - const { - filename = '', - columnOffset = 0, - lineOffset = 0, - cachedData = undefined, - produceCachedData = false, - parsingContext = undefined, - contextExtensions = [], - importModuleDynamically, - } = options; - - validateString(filename, 'options.filename'); - validateInt32(columnOffset, 'options.columnOffset'); - validateInt32(lineOffset, 'options.lineOffset'); - if (cachedData !== undefined) - validateBuffer(cachedData, 'options.cachedData'); - validateBoolean(produceCachedData, 'options.produceCachedData'); - if (parsingContext !== undefined) { - if ( - typeof parsingContext !== 'object' || - parsingContext === null || - !isContext(parsingContext) - ) { - throw new ERR_INVALID_ARG_TYPE( - 'options.parsingContext', - 'Context', - parsingContext, - ); - } + if (importModuleDynamically === undefined) { + // We need a default host defined options that are the same for all + // scripts not needing custom module callbacks so that the isolate + // compilation cache can be hit. + return default_host_defined_options; + } + // We should've thrown here immediately when we introduced + // --experimental-vm-modules and importModuleDynamically, but since + // users are already using this callback to throw a similar error, + // we also defer the error to the time when an actual import() is called + // to avoid breaking them. To ensure that the isolate compilation + // cache can still be hit, use a constant sentinel symbol here. + if (!getOptionValue('--experimental-vm-modules')) { + return vm_dynamic_import_missing_flag; } - validateArray(contextExtensions, 'options.contextExtensions'); - ArrayPrototypeForEach(contextExtensions, (extension, i) => { - const name = `options.contextExtensions[${i}]`; - validateObject(extension, name, kValidateObjectAllowNullable); + + return Symbol(hint); +} + +function registerImportModuleDynamically(referrer, importModuleDynamically) { + const { importModuleDynamicallyWrap } = require('internal/vm/module'); + const { registerModule } = require('internal/modules/esm/utils'); + registerModule(referrer, { + __proto__: null, + importModuleDynamically: + importModuleDynamicallyWrap(importModuleDynamically), }); +} +function internalCompileFunction( + code, filename, lineOffset, columnOffset, + cachedData, produceCachedData, parsingContext, contextExtensions, + params, hostDefinedOptionId, importModuleDynamically) { const result = compileFunction( code, filename, @@ -82,6 +84,7 @@ function internalCompileFunction(code, params, options) { parsingContext, contextExtensions, params, + hostDefinedOptionId, ); if (produceCachedData) { @@ -97,22 +100,65 @@ function internalCompileFunction(code, params, options) { } if (importModuleDynamically !== undefined) { - validateFunction(importModuleDynamically, - 'options.importModuleDynamically'); - const { importModuleDynamicallyWrap } = require('internal/vm/module'); - const wrapped = importModuleDynamicallyWrap(importModuleDynamically); - const func = result.function; - const { registerModule } = require('internal/modules/esm/utils'); - registerModule(func, { - __proto__: null, - importModuleDynamically: wrapped, - }); + registerImportModuleDynamically(result.function, importModuleDynamically); } return result; } +function makeContextifyScript(code, + filename, + lineOffset, + columnOffset, + cachedData, + produceCachedData, + parsingContext, + hostDefinedOptionId, + importModuleDynamically) { + let script; + // Calling `ReThrow()` on a native TryCatch does not generate a new + // abort-on-uncaught-exception check. A dummy try/catch in JS land + // protects against that. + try { // eslint-disable-line no-useless-catch + script = new ContextifyScript(code, + filename, + lineOffset, + columnOffset, + cachedData, + produceCachedData, + parsingContext, + hostDefinedOptionId); + } catch (e) { + throw e; /* node-do-not-add-exception-line */ + } + + if (importModuleDynamically !== undefined) { + registerImportModuleDynamically(script, importModuleDynamically); + } + return script; +} + +// Internal version of vm.Script.prototype.runInThisContext() which skips +// argument validation. +function runScriptInThisContext(script, displayErrors, breakOnFirstLine) { + return ReflectApply( + runInContext, + script, + [ + null, // sandbox - use current context + -1, // timeout + displayErrors, // displayErrors + false, // breakOnSigint + breakOnFirstLine, // breakOnFirstLine + ], + ); +} + module.exports = { + getHostDefinedOptionId, internalCompileFunction, isContext, + makeContextifyScript, + registerImportModuleDynamically, + runScriptInThisContext, }; diff --git a/lib/internal/vm/module.js b/lib/internal/vm/module.js index d9a073fd4d7906..a100c8beefc80a 100644 --- a/lib/internal/vm/module.js +++ b/lib/internal/vm/module.js @@ -305,8 +305,8 @@ class SourceTextModule extends Module { this[kLink] = async (linker) => { this.#statusOverride = 'linking'; - const promises = this[kWrap].link(async (identifier, assert) => { - const module = await linker(identifier, this, { assert }); + const promises = this[kWrap].link(async (identifier, attributes) => { + const module = await linker(identifier, this, { attributes, assert: attributes }); if (module[kWrap] === undefined) { throw new ERR_VM_MODULE_NOT_MODULE(); } diff --git a/lib/internal/watch_mode/files_watcher.js b/lib/internal/watch_mode/files_watcher.js index 895c6ec138d131..bbc13e67cc9f0d 100644 --- a/lib/internal/watch_mode/files_watcher.js +++ b/lib/internal/watch_mode/files_watcher.js @@ -97,8 +97,11 @@ class FilesWatcher extends EventEmitter { return; } const watcher = watch(path, { recursive, signal: this.#signal }); - watcher.on('change', (eventType, fileName) => this - .#onChange(recursive ? resolve(path, fileName) : path)); + watcher.on('change', (eventType, fileName) => { + // `fileName` can be `null` if it cannot be determined. See + // https://github.com/nodejs/node/pull/49891#issuecomment-1744673430. + this.#onChange(recursive ? resolve(path, fileName ?? '') : path); + }); this.#watchers.set(path, { handle: watcher, recursive }); if (recursive) { this.#removeWatchedChildren(path); diff --git a/lib/internal/webidl.js b/lib/internal/webidl.js index 67c01418f167f7..eeb0f35586a2ed 100644 --- a/lib/internal/webidl.js +++ b/lib/internal/webidl.js @@ -10,7 +10,10 @@ const { NumberIsNaN, NumberMAX_SAFE_INTEGER, NumberMIN_SAFE_INTEGER, + ObjectAssign, + SafeSet, String, + TypeError, } = primordials; const { @@ -173,8 +176,43 @@ converters.DOMString = function DOMString(V) { return String(V); }; +function codedTypeError(message, errorProperties = kEmptyObject) { + // eslint-disable-next-line no-restricted-syntax + const err = new TypeError(message); + ObjectAssign(err, errorProperties); + return err; +} + +function makeException(message, opts = kEmptyObject) { + const prefix = opts.prefix ? opts.prefix + ': ' : ''; + const context = opts.context?.length === 0 ? + '' : (opts.context ?? 'Value') + ' '; + return codedTypeError( + `${prefix}${context}${message}`, + { code: opts.code || 'ERR_INVALID_ARG_TYPE' }, + ); +} + +function createEnumConverter(name, values) { + const E = new SafeSet(values); + + return function(V, opts = kEmptyObject) { + const S = String(V); + + if (!E.has(S)) { + throw makeException( + `value '${S}' is not a valid enum value of type ${name}.`, + { __proto__: null, ...opts, code: 'ERR_INVALID_ARG_VALUE' }); + } + + return S; + }; +} + module.exports = { + converters, convertToInt, + createEnumConverter, evenRound, - converters, + makeException, }; diff --git a/lib/internal/webstreams/adapters.js b/lib/internal/webstreams/adapters.js index 3e5fd69d4d6a03..cffa549eafd683 100644 --- a/lib/internal/webstreams/adapters.js +++ b/lib/internal/webstreams/adapters.js @@ -1,13 +1,19 @@ 'use strict'; const { + ArrayPrototypeFilter, + ArrayPrototypeMap, + Boolean, + ObjectEntries, PromisePrototypeThen, PromiseResolve, SafePromiseAll, SafePromisePrototypeFinally, + SafeSet, TypedArrayPrototypeGetBuffer, - TypedArrayPrototypeGetByteOffset, TypedArrayPrototypeGetByteLength, + TypedArrayPrototypeGetByteOffset, + TypeError, Uint8Array, } = primordials; @@ -46,7 +52,7 @@ const { } = require('buffer'); const { - errnoException, + ErrnoException, codes: { ERR_INVALID_ARG_TYPE, ERR_INVALID_ARG_VALUE, @@ -82,6 +88,38 @@ const { UV_EOF } = internalBinding('uv'); const encoder = new TextEncoder(); +// Collect all negative (error) ZLIB codes and Z_NEED_DICT +const ZLIB_FAILURES = new SafeSet([ + ...ArrayPrototypeFilter( + ArrayPrototypeMap( + ObjectEntries(internalBinding('constants').zlib), + ({ 0: code, 1: value }) => (value < 0 ? code : null), + ), + Boolean, + ), + 'Z_NEED_DICT', +]); + +/** + * @param {Error|null} cause + * @returns {Error|null} + */ +function handleKnownInternalErrors(cause) { + switch (true) { + case cause?.code === 'ERR_STREAM_PREMATURE_CLOSE': { + return new AbortError(undefined, { cause }); + } + case ZLIB_FAILURES.has(cause?.code): { + // eslint-disable-next-line no-restricted-syntax + const error = new TypeError(undefined, { cause }); + error.code = cause.code; + return error; + } + default: + return cause; + } +} + /** * @typedef {import('../../stream').Writable} Writable * @typedef {import('../../stream').Readable} Readable @@ -137,10 +175,7 @@ function newWritableStreamFromStreamWritable(streamWritable) { } const cleanup = finished(streamWritable, (error) => { - if (error?.code === 'ERR_STREAM_PREMATURE_CLOSE') { - const err = new AbortError(undefined, { cause: error }); - error = err; - } + error = handleKnownInternalErrors(error); cleanup(); // This is a protection against non-standard, legacy streams @@ -440,10 +475,7 @@ function newReadableStreamFromStreamReadable(streamReadable, options = kEmptyObj streamReadable.pause(); const cleanup = finished(streamReadable, (error) => { - if (error?.code === 'ERR_STREAM_PREMATURE_CLOSE') { - const err = new AbortError(undefined, { cause: error }); - error = err; - } + error = handleKnownInternalErrors(error); cleanup(); // This is a protection against non-standard, legacy streams @@ -856,7 +888,7 @@ function newWritableStreamFromStreamBase(streamBase, strategy) { function onWriteComplete(status) { if (status < 0) { - const error = errnoException(status, 'write', this.error); + const error = new ErrnoException(status, 'write', this.error); this.promise.reject(error); this.controller.error(error); return; @@ -879,7 +911,7 @@ function newWritableStreamFromStreamBase(streamBase, strategy) { } if (ret !== 0) - promise.reject(errnoException(ret, 'write', req)); + promise.reject(new ErrnoException(ret, 'write', req)); else if (!req.async) promise.resolve(); diff --git a/lib/internal/webstreams/compression.js b/lib/internal/webstreams/compression.js index 6cbaa3f3250e73..ac10d093dcefcc 100644 --- a/lib/internal/webstreams/compression.js +++ b/lib/internal/webstreams/compression.js @@ -2,12 +2,9 @@ const { ObjectDefineProperties, + SymbolToStringTag, } = primordials; -const { - codes: { ERR_INVALID_ARG_VALUE }, -} = require('internal/errors'); - const { newReadableWritablePairFromDuplex, } = require('internal/webstreams/adapters'); @@ -19,12 +16,20 @@ const { kEnumerableProperty, } = require('internal/util'); +const { createEnumConverter } = require('internal/webidl'); + let zlib; function lazyZlib() { zlib ??= require('zlib'); return zlib; } +const formatConverter = createEnumConverter('CompressionFormat', [ + 'deflate', + 'deflate-raw', + 'gzip', +]); + /** * @typedef {import('./readablestream').ReadableStream} ReadableStream * @typedef {import('./writablestream').WritableStream} WritableStream @@ -35,18 +40,23 @@ class CompressionStream { #transform; /** - * @param {'deflate'|'gzip'} format + * @param {'deflate'|'deflate-raw'|'gzip'} format */ constructor(format) { + format = formatConverter(format, { + prefix: "Failed to construct 'CompressionStream'", + context: '1st argument', + }); switch (format) { case 'deflate': this.#handle = lazyZlib().createDeflate(); break; + case 'deflate-raw': + this.#handle = lazyZlib().createDeflateRaw(); + break; case 'gzip': this.#handle = lazyZlib().createGzip(); break; - default: - throw new ERR_INVALID_ARG_VALUE('format', format); } this.#transform = newReadableWritablePairFromDuplex(this.#handle); } @@ -80,18 +90,23 @@ class DecompressionStream { #transform; /** - * @param {'deflate'|'gzip'} format + * @param {'deflate'|'deflate-raw'|'gzip'} format */ constructor(format) { + format = formatConverter(format, { + prefix: "Failed to construct 'DecompressionStream'", + context: '1st argument', + }); switch (format) { case 'deflate': this.#handle = lazyZlib().createInflate(); break; + case 'deflate-raw': + this.#handle = lazyZlib().createInflateRaw(); + break; case 'gzip': this.#handle = lazyZlib().createGunzip(); break; - default: - throw new ERR_INVALID_ARG_VALUE('format', format); } this.#transform = newReadableWritablePairFromDuplex(this.#handle); } @@ -123,11 +138,21 @@ class DecompressionStream { ObjectDefineProperties(CompressionStream.prototype, { readable: kEnumerableProperty, writable: kEnumerableProperty, + [SymbolToStringTag]: { + __proto__: null, + configurable: true, + value: 'CompressionStream', + }, }); ObjectDefineProperties(DecompressionStream.prototype, { readable: kEnumerableProperty, writable: kEnumerableProperty, + [SymbolToStringTag]: { + __proto__: null, + configurable: true, + value: 'DecompressionStream', + }, }); module.exports = { diff --git a/lib/internal/webstreams/readablestream.js b/lib/internal/webstreams/readablestream.js index 83b49028eae8e0..c7f492033ceaf8 100644 --- a/lib/internal/webstreams/readablestream.js +++ b/lib/internal/webstreams/readablestream.js @@ -11,9 +11,9 @@ const { FunctionPrototypeCall, MathMin, NumberIsInteger, - ObjectCreate, ObjectDefineProperties, ObjectSetPrototypeOf, + Promise, PromisePrototypeThen, PromiseResolve, PromiseReject, @@ -85,9 +85,7 @@ const { kControllerErrorFunction, } = require('internal/streams/utils'); -const { - structuredClone, -} = require('internal/structured_clone'); +const { structuredClone } = internalBinding('messaging'); const { ArrayBufferViewGetBuffer, @@ -96,9 +94,9 @@ const { AsyncIterator, cloneAsUint8Array, copyArrayBuffer, + createPromiseCallback, customInspect, dequeueValue, - ensureIsPromise, enqueueValueWithSize, extractHighWaterMark, extractSizeAlgorithm, @@ -252,19 +250,7 @@ class ReadableStream { markTransferMode(this, false, true); if (source === null) throw new ERR_INVALID_ARG_VALUE('source', 'Object', source); - this[kState] = { - disturbed: false, - reader: undefined, - state: 'readable', - storedError: undefined, - stream: undefined, - transfer: { - writable: undefined, - port1: undefined, - port2: undefined, - promise: undefined, - }, - }; + this[kState] = createReadableStreamState(); this[kIsClosedPromise] = createDeferredPromise(); this[kControllerErrorFunction] = () => {}; @@ -610,6 +596,8 @@ class ReadableStream { [kTransferList]() { const { port1, port2 } = new MessageChannel(); + port1.unref(); + port2.unref(); this[kState].transfer.port1 = port1; this[kState].transfer.port2 = port2; return [ port2 ]; @@ -638,25 +626,17 @@ ObjectDefineProperties(ReadableStream.prototype, { pipeThrough: kEnumerableProperty, pipeTo: kEnumerableProperty, tee: kEnumerableProperty, + values: kEnumerableProperty, [SymbolToStringTag]: getNonWritablePropertyDescriptor(ReadableStream.name), }); +ObjectDefineProperties(ReadableStream, { + from: kEnumerableProperty, +}); function InternalTransferredReadableStream() { markTransferMode(this, false, true); this[kType] = 'ReadableStream'; - this[kState] = { - disturbed: false, - reader: undefined, - state: 'readable', - storedError: undefined, - stream: undefined, - transfer: { - writable: undefined, - port1: undefined, - port2: undefined, - promise: undefined, - }, - }; + this[kState] = createReadableStreamState(); this[kIsClosedPromise] = createDeferredPromise(); } @@ -1225,41 +1205,58 @@ ObjectDefineProperties(ReadableByteStreamController.prototype, { [SymbolToStringTag]: getNonWritablePropertyDescriptor(ReadableByteStreamController.name), }); -function TeeReadableStream(start, pull, cancel) { +function InternalReadableStream(start, pull, cancel, highWaterMark, size) { markTransferMode(this, false, true); this[kType] = 'ReadableStream'; - this[kState] = { - disturbed: false, - state: 'readable', - storedError: undefined, - stream: undefined, - transfer: { - writable: undefined, - port: undefined, - promise: undefined, - }, - }; + this[kState] = createReadableStreamState(); + this[kIsClosedPromise] = createDeferredPromise(); + const controller = new ReadableStreamDefaultController(kSkipThrow); + setupReadableStreamDefaultController( + this, + controller, + start, + pull, + cancel, + highWaterMark, + size); +} + +ObjectSetPrototypeOf(InternalReadableStream.prototype, ReadableStream.prototype); +ObjectSetPrototypeOf(InternalReadableStream, ReadableStream); + +function createReadableStream(start, pull, cancel, highWaterMark = 1, size = () => 1) { + const stream = new InternalReadableStream(start, pull, cancel, highWaterMark, size); + + // For spec compliance the InternalReadableStream must be a ReadableStream + stream.constructor = ReadableStream; + return stream; +} + +function InternalReadableByteStream(start, pull, cancel) { + markTransferMode(this, false, true); + this[kType] = 'ReadableStream'; + this[kState] = createReadableStreamState(); this[kIsClosedPromise] = createDeferredPromise(); - setupReadableStreamDefaultControllerFromSource( + const controller = new ReadableByteStreamController(kSkipThrow); + setupReadableByteStreamController( this, - ObjectCreate(null, { - start: { __proto__: null, value: start }, - pull: { __proto__: null, value: pull }, - cancel: { __proto__: null, value: cancel }, - }), - 1, - () => 1); + controller, + start, + pull, + cancel, + 0, + undefined); } -ObjectSetPrototypeOf(TeeReadableStream.prototype, ReadableStream.prototype); -ObjectSetPrototypeOf(TeeReadableStream, ReadableStream); +ObjectSetPrototypeOf(InternalReadableByteStream.prototype, ReadableStream.prototype); +ObjectSetPrototypeOf(InternalReadableByteStream, ReadableStream); -function createTeeReadableStream(start, pull, cancel) { - const tee = new TeeReadableStream(start, pull, cancel); +function createReadableByteStream(start, pull, cancel) { + const stream = new InternalReadableByteStream(start, pull, cancel); - // For spec compliance the Tee must be a ReadableStream - tee.constructor = ReadableStream; - return tee; + // For spec compliance the InternalReadableByteStream must be a ReadableStream + stream.constructor = ReadableStream; + return stream; } const isReadableStream = @@ -1275,6 +1272,23 @@ const isReadableStreamBYOBReader = // ---- ReadableStream Implementation +function createReadableStreamState() { + return { + __proto__: null, + disturbed: false, + reader: undefined, + state: 'readable', + storedError: undefined, + transfer: { + __proto__: null, + writable: undefined, + port1: undefined, + port2: undefined, + promise: undefined, + }, + }; +} + function readableStreamFromIterable(iterable) { let stream; const iteratorRecord = getIterator(iterable, 'async'); @@ -1314,16 +1328,12 @@ function readableStreamFromIterable(iterable) { }); } - stream = new ReadableStream({ - start: startAlgorithm, - pull: pullAlgorithm, - cancel: cancelAlgorithm, - }, { - size() { - return 1; - }, - highWaterMark: 0, - }); + stream = createReadableStream( + startAlgorithm, + pullAlgorithm, + cancelAlgorithm, + 0, + ); return stream; } @@ -1649,9 +1659,9 @@ function readableStreamDefaultTee(stream, cloneForBranch2) { } branch1 = - createTeeReadableStream(nonOpStart, pullAlgorithm, cancel1Algorithm); + createReadableStream(nonOpStart, pullAlgorithm, cancel1Algorithm); branch2 = - createTeeReadableStream(nonOpStart, pullAlgorithm, cancel2Algorithm); + createReadableStream(nonOpStart, pullAlgorithm, cancel2Algorithm); PromisePrototypeThen( reader[kState].close.promise, @@ -1928,16 +1938,10 @@ function readableByteStreamTee(stream) { return cancelDeferred.promise; } - branch1 = new ReadableStream({ - type: 'bytes', - pull: pull1Algorithm, - cancel: cancel1Algorithm, - }); - branch2 = new ReadableStream({ - type: 'bytes', - pull: pull2Algorithm, - cancel: cancel2Algorithm, - }); + branch1 = + createReadableByteStream(nonOpStart, pull1Algorithm, cancel1Algorithm); + branch2 = + createReadableByteStream(nonOpStart, pull2Algorithm, cancel2Algorithm); forwardReaderError(reader); @@ -1988,10 +1992,7 @@ function readableStreamCancel(stream, reason) { } return PromisePrototypeThen( - ensureIsPromise( - stream[kState].controller[kCancel], - stream[kState].controller, - reason), + stream[kState].controller[kCancel](reason), () => {}); } @@ -2356,7 +2357,7 @@ function readableStreamDefaultControllerCallPullIfNeeded(controller) { assert(!controller[kState].pullAgain); controller[kState].pulling = true; PromisePrototypeThen( - ensureIsPromise(controller[kState].pullAlgorithm, controller), + controller[kState].pullAlgorithm(controller), () => { controller[kState].pulling = false; if (controller[kState].pullAgain) { @@ -2386,12 +2387,9 @@ function readableStreamDefaultControllerError(controller, error) { function readableStreamDefaultControllerCancelSteps(controller, reason) { resetQueue(controller); - try { - const result = controller[kState].cancelAlgorithm(reason); - return result; - } finally { - readableStreamDefaultControllerClearAlgorithms(controller); - } + const result = controller[kState].cancelAlgorithm(reason); + readableStreamDefaultControllerClearAlgorithms(controller); + return result; } function readableStreamDefaultControllerPullSteps(controller, readRequest) { @@ -2442,7 +2440,7 @@ function setupReadableStreamDefaultController( const startResult = startAlgorithm(); PromisePrototypeThen( - PromiseResolve(startResult), + new Promise((r) => r(startResult)), () => { controller[kState].started = true; assert(!controller[kState].pulling); @@ -2465,11 +2463,10 @@ function setupReadableStreamDefaultControllerFromSource( FunctionPrototypeBind(start, source, controller) : nonOpStart; const pullAlgorithm = pull ? - FunctionPrototypeBind(pull, source, controller) : + createPromiseCallback('source.pull', pull, source) : nonOpPull; - const cancelAlgorithm = cancel ? - FunctionPrototypeBind(cancel, source) : + createPromiseCallback('source.cancel', cancel, source) : nonOpCancel; setupReadableStreamDefaultController( @@ -3097,7 +3094,7 @@ function readableByteStreamControllerCallPullIfNeeded(controller) { assert(!controller[kState].pullAgain); controller[kState].pulling = true; PromisePrototypeThen( - ensureIsPromise(controller[kState].pullAlgorithm, controller), + controller[kState].pullAlgorithm(controller), () => { controller[kState].pulling = false; if (controller[kState].pullAgain) { @@ -3241,7 +3238,7 @@ function setupReadableByteStreamController( const startResult = startAlgorithm(); PromisePrototypeThen( - PromiseResolve(startResult), + new Promise((r) => r(startResult)), () => { controller[kState].started = true; assert(!controller[kState].pulling); @@ -3264,10 +3261,10 @@ function setupReadableByteStreamControllerFromSource( FunctionPrototypeBind(start, source, controller) : nonOpStart; const pullAlgorithm = pull ? - FunctionPrototypeBind(pull, source, controller) : + createPromiseCallback('source.pull', pull, source, controller) : nonOpPull; const cancelAlgorithm = cancel ? - FunctionPrototypeBind(cancel, source) : + createPromiseCallback('source.cancel', cancel, source) : nonOpCancel; if (autoAllocateChunkSize === 0) { @@ -3364,4 +3361,6 @@ module.exports = { readableByteStreamControllerPullSteps, setupReadableByteStreamController, setupReadableByteStreamControllerFromSource, + createReadableStream, + createReadableByteStream, }; diff --git a/lib/internal/webstreams/transfer.js b/lib/internal/webstreams/transfer.js index 136b0d81a99464..c4cb4077f88403 100644 --- a/lib/internal/webstreams/transfer.js +++ b/lib/internal/webstreams/transfer.js @@ -143,6 +143,8 @@ class CrossRealmTransformReadableSource { error); port.close(); }; + + port.unref(); } start(controller) { @@ -210,7 +212,7 @@ class CrossRealmTransformWritableSink { error); port.close(); }; - + port.unref(); } start(controller) { diff --git a/lib/internal/webstreams/transformstream.js b/lib/internal/webstreams/transformstream.js index 4d47856a6a12de..b418fd2cb5347c 100644 --- a/lib/internal/webstreams/transformstream.js +++ b/lib/internal/webstreams/transformstream.js @@ -1,12 +1,10 @@ 'use strict'; const { - FunctionPrototypeBind, FunctionPrototypeCall, ObjectDefineProperties, ObjectSetPrototypeOf, PromisePrototypeThen, - PromiseResolve, SymbolToStringTag, Symbol, } = primordials; @@ -39,18 +37,19 @@ const { } = require('internal/worker/js_transferable'); const { + createPromiseCallback, customInspect, - ensureIsPromise, extractHighWaterMark, extractSizeAlgorithm, isBrandCheck, nonOpFlush, kType, kState, + nonOpCancel, } = require('internal/webstreams/util'); const { - ReadableStream, + createReadableStream, readableStreamDefaultControllerCanCloseOrEnqueue, readableStreamDefaultControllerClose, readableStreamDefaultControllerEnqueue, @@ -60,7 +59,7 @@ const { } = require('internal/webstreams/readablestream'); const { - WritableStream, + createWritableStream, writableStreamDefaultControllerErrorIfNeeded, } = require('internal/webstreams/writablestream'); @@ -251,10 +250,12 @@ function InternalTransferredTransformStream() { markTransferMode(this, false, true); this[kType] = 'TransformStream'; this[kState] = { + __proto__: null, readable: undefined, writable: undefined, backpressure: undefined, backpressureChange: { + __proto__: null, promise: undefined, resolve: undefined, reject: undefined, @@ -360,44 +361,33 @@ function initializeTransformStream( readableHighWaterMark, readableSizeAlgorithm) { - const writable = new WritableStream({ - __proto__: null, - start() { return startPromise.promise; }, - write(chunk) { - return transformStreamDefaultSinkWriteAlgorithm(stream, chunk); - }, - abort(reason) { - return transformStreamDefaultSinkAbortAlgorithm(stream, reason); - }, - close() { - return transformStreamDefaultSinkCloseAlgorithm(stream); - }, - }, { - highWaterMark: writableHighWaterMark, - size: writableSizeAlgorithm, - }); - - const readable = new ReadableStream({ - __proto__: null, - start() { return startPromise.promise; }, - pull() { - return transformStreamDefaultSourcePullAlgorithm(stream); - }, - cancel(reason) { - transformStreamErrorWritableAndUnblockWrite(stream, reason); - return PromiseResolve(); - }, - }, { - highWaterMark: readableHighWaterMark, - size: readableSizeAlgorithm, - }); + const startAlgorithm = () => startPromise.promise; + + const writable = createWritableStream( + startAlgorithm, + (chunk) => transformStreamDefaultSinkWriteAlgorithm(stream, chunk), + () => transformStreamDefaultSinkCloseAlgorithm(stream), + (reason) => transformStreamDefaultSinkAbortAlgorithm(stream, reason), + writableHighWaterMark, + writableSizeAlgorithm, + ); + + const readable = createReadableStream( + startAlgorithm, + () => transformStreamDefaultSourcePullAlgorithm(stream), + (reason) => transformStreamDefaultSourceCancelAlgorithm(stream, reason), + readableHighWaterMark, + readableSizeAlgorithm, + ); stream[kState] = { + __proto__: null, readable, writable, controller: undefined, backpressure: undefined, backpressureChange: { + __proto__: null, promise: undefined, resolve: undefined, reject: undefined, @@ -427,6 +417,10 @@ function transformStreamErrorWritableAndUnblockWrite(stream, error) { writableStreamDefaultControllerErrorIfNeeded( writable[kState].controller, error); + transformStreamUnblockWrite(stream); +} + +function transformStreamUnblockWrite(stream) { if (stream[kState].backpressure) transformStreamSetBackpressure(stream, false); } @@ -443,13 +437,16 @@ function setupTransformStreamDefaultController( stream, controller, transformAlgorithm, - flushAlgorithm) { + flushAlgorithm, + cancelAlgorithm) { assert(isTransformStream(stream)); assert(stream[kState].controller === undefined); controller[kState] = { + __proto__: null, stream, transformAlgorithm, flushAlgorithm, + cancelAlgorithm, }; stream[kState].controller = controller; } @@ -458,23 +455,31 @@ function setupTransformStreamDefaultControllerFromTransformer( stream, transformer) { const controller = new TransformStreamDefaultController(kSkipThrow); - const transform = transformer?.transform || defaultTransformAlgorithm; - const flush = transformer?.flush || nonOpFlush; - const transformAlgorithm = - FunctionPrototypeBind(transform, transformer); - const flushAlgorithm = - FunctionPrototypeBind(flush, transformer); + const transform = transformer?.transform; + const flush = transformer?.flush; + const cancel = transformer?.cancel; + const transformAlgorithm = transform ? + createPromiseCallback('transformer.transform', transform, transformer) : + defaultTransformAlgorithm; + const flushAlgorithm = flush ? + createPromiseCallback('transformer.flush', flush, transformer) : + nonOpFlush; + const cancelAlgorithm = cancel ? + createPromiseCallback('transformer.cancel', cancel, transformer) : + nonOpCancel; setupTransformStreamDefaultController( stream, controller, transformAlgorithm, - flushAlgorithm); + flushAlgorithm, + cancelAlgorithm); } function transformStreamDefaultControllerClearAlgorithms(controller) { controller[kState].transformAlgorithm = undefined; controller[kState].flushAlgorithm = undefined; + controller[kState].cancelAlgorithm = undefined; } function transformStreamDefaultControllerEnqueue(controller, chunk) { @@ -509,11 +514,7 @@ function transformStreamDefaultControllerError(controller, error) { async function transformStreamDefaultControllerPerformTransform(controller, chunk) { try { - return await ensureIsPromise( - controller[kState].transformAlgorithm, - controller, - chunk, - controller); + return await controller[kState].transformAlgorithm(chunk, controller); } catch (error) { transformStreamError(controller[kState].stream, error); throw error; @@ -563,7 +564,37 @@ function transformStreamDefaultSinkWriteAlgorithm(stream, chunk) { } async function transformStreamDefaultSinkAbortAlgorithm(stream, reason) { - transformStreamError(stream, reason); + const { + controller, + readable, + } = stream[kState]; + + if (controller[kState].finishPromise !== undefined) { + return controller[kState].finishPromise; + } + + const { promise, resolve, reject } = createDeferredPromise(); + controller[kState].finishPromise = promise; + const cancelPromise = controller[kState].cancelAlgorithm(reason); + transformStreamDefaultControllerClearAlgorithms(controller); + + PromisePrototypeThen( + cancelPromise, + () => { + if (readable[kState].state === 'errored') + reject(readable[kState].storedError); + else { + readableStreamDefaultControllerError(readable[kState].controller, reason); + resolve(); + } + }, + (error) => { + readableStreamDefaultControllerError(readable[kState].controller, error); + reject(error); + }, + ); + + return controller[kState].finishPromise; } function transformStreamDefaultSinkCloseAlgorithm(stream) { @@ -572,23 +603,28 @@ function transformStreamDefaultSinkCloseAlgorithm(stream) { controller, } = stream[kState]; - const flushPromise = - ensureIsPromise( - controller[kState].flushAlgorithm, - controller, - controller); + if (controller[kState].finishPromise !== undefined) { + return controller[kState].finishPromise; + } + const { promise, resolve, reject } = createDeferredPromise(); + controller[kState].finishPromise = promise; + const flushPromise = controller[kState].flushAlgorithm(controller); transformStreamDefaultControllerClearAlgorithms(controller); - return PromisePrototypeThen( + PromisePrototypeThen( flushPromise, () => { if (readable[kState].state === 'errored') - throw readable[kState].storedError; - readableStreamDefaultControllerClose(readable[kState].controller); + reject(readable[kState].storedError); + else { + readableStreamDefaultControllerClose(readable[kState].controller); + resolve(); + } }, (error) => { - transformStreamError(stream, error); - throw readable[kState].storedError; + readableStreamDefaultControllerError(readable[kState].controller, error); + reject(error); }); + return controller[kState].finishPromise; } function transformStreamDefaultSourcePullAlgorithm(stream) { @@ -598,6 +634,46 @@ function transformStreamDefaultSourcePullAlgorithm(stream) { return stream[kState].backpressureChange.promise; } +function transformStreamDefaultSourceCancelAlgorithm(stream, reason) { + const { + controller, + writable, + } = stream[kState]; + + if (controller[kState].finishPromise !== undefined) { + return controller[kState].finishPromise; + } + + const { promise, resolve, reject } = createDeferredPromise(); + controller[kState].finishPromise = promise; + const cancelPromise = controller[kState].cancelAlgorithm(reason); + transformStreamDefaultControllerClearAlgorithms(controller); + + PromisePrototypeThen( + cancelPromise, + () => { + if (writable[kState].state === 'errored') + reject(writable[kState].storedError); + else { + writableStreamDefaultControllerErrorIfNeeded( + writable[kState].controller, + reason); + transformStreamUnblockWrite(stream); + resolve(); + } + }, + (error) => { + writableStreamDefaultControllerErrorIfNeeded( + writable[kState].controller, + error); + transformStreamUnblockWrite(stream); + reject(error); + }, + ); + + return controller[kState].finishPromise; +} + module.exports = { TransformStream, TransformStreamDefaultController, diff --git a/lib/internal/webstreams/util.js b/lib/internal/webstreams/util.js index 1979c55667b167..e862b3ffe25724 100644 --- a/lib/internal/webstreams/util.js +++ b/lib/internal/webstreams/util.js @@ -9,8 +9,6 @@ const { MathMax, NumberIsNaN, PromisePrototypeThen, - PromiseResolve, - PromiseReject, ReflectGet, Symbol, SymbolAsyncIterator, @@ -31,10 +29,6 @@ const { detachArrayBuffer, } = internalBinding('buffer'); -const { - isPromise, -} = require('internal/util/types'); - const { inspect, } = require('util'); @@ -180,13 +174,15 @@ function enqueueValueWithSize(controller, value, size) { controller[kState].queueTotalSize += size; } -function ensureIsPromise(fn, thisArg, ...args) { - try { - const value = FunctionPrototypeCall(fn, thisArg, ...args); - return isPromise(value) ? value : PromiseResolve(value); - } catch (error) { - return PromiseReject(error); - } +// This implements "invoke a callback function type" for callback functions that return a promise. +// See https://webidl.spec.whatwg.org/#es-invoking-callback-functions +async function invokePromiseCallback(fn, thisArg, ...args) { + return FunctionPrototypeCall(fn, thisArg, ...args); +} + +function createPromiseCallback(name, fn, thisArg) { + validateFunction(fn, name); + return (...args) => invokePromiseCallback(fn, thisArg, ...args); } function isPromisePending(promise) { @@ -273,15 +269,16 @@ module.exports = { ArrayBufferViewGetByteLength, ArrayBufferViewGetByteOffset, AsyncIterator, + createPromiseCallback, cloneAsUint8Array, copyArrayBuffer, customInspect, dequeueValue, - ensureIsPromise, enqueueValueWithSize, extractHighWaterMark, extractSizeAlgorithm, lazyTransfer, + invokePromiseCallback, isBrandCheck, isPromisePending, isViewedArrayBufferDetached, diff --git a/lib/internal/webstreams/writablestream.js b/lib/internal/webstreams/writablestream.js index 2115aba36e927b..c6f5c22bc7a95e 100644 --- a/lib/internal/webstreams/writablestream.js +++ b/lib/internal/webstreams/writablestream.js @@ -7,6 +7,7 @@ const { FunctionPrototypeCall, ObjectDefineProperties, ObjectSetPrototypeOf, + Promise, PromisePrototypeThen, PromiseResolve, PromiseReject, @@ -48,9 +49,9 @@ const { } = require('internal/worker/js_transferable'); const { + createPromiseCallback, customInspect, dequeueValue, - ensureIsPromise, enqueueValueWithSize, extractHighWaterMark, extractSizeAlgorithm, @@ -159,45 +160,7 @@ class WritableStream { if (type !== undefined) throw new ERR_INVALID_ARG_VALUE.RangeError('type', type); - this[kState] = { - close: createDeferredPromise(), - closeRequest: { - promise: undefined, - resolve: undefined, - reject: undefined, - }, - inFlightWriteRequest: { - promise: undefined, - resolve: undefined, - reject: undefined, - }, - inFlightCloseRequest: { - promise: undefined, - resolve: undefined, - reject: undefined, - }, - pendingAbortRequest: { - abort: { - promise: undefined, - resolve: undefined, - reject: undefined, - }, - reason: undefined, - wasAlreadyErroring: false, - }, - backpressure: false, - controller: undefined, - state: 'writable', - storedError: undefined, - writeRequests: [], - writer: undefined, - transfer: { - readable: undefined, - port1: undefined, - port2: undefined, - promise: undefined, - }, - }; + this[kState] = createWritableStreamState(); this[kIsClosedPromise] = createDeferredPromise(); this[kControllerErrorFunction] = () => {}; @@ -303,6 +266,8 @@ class WritableStream { [kTransferList]() { const { port1, port2 } = new MessageChannel(); + port1.unref(); + port2.unref(); this[kState].transfer.port1 = port1; this[kState].transfer.port2 = port2; return [ port2 ]; @@ -329,45 +294,7 @@ ObjectDefineProperties(WritableStream.prototype, { function InternalTransferredWritableStream() { markTransferMode(this, false, true); this[kType] = 'WritableStream'; - this[kState] = { - close: createDeferredPromise(), - closeRequest: { - promise: undefined, - resolve: undefined, - reject: undefined, - }, - inFlightWriteRequest: { - promise: undefined, - resolve: undefined, - reject: undefined, - }, - inFlightCloseRequest: { - promise: undefined, - resolve: undefined, - reject: undefined, - }, - pendingAbortRequest: { - abort: { - promise: undefined, - resolve: undefined, - reject: undefined, - }, - reason: undefined, - wasAlreadyErroring: false, - }, - backpressure: false, - controller: undefined, - state: 'writable', - storedError: undefined, - writeRequests: [], - writer: undefined, - transfer: { - readable: undefined, - port1: undefined, - port2: undefined, - promise: undefined, - }, - }; + this[kState] = createWritableStreamState(); this[kIsClosedPromise] = createDeferredPromise(); } @@ -580,6 +507,36 @@ ObjectDefineProperties(WritableStreamDefaultController.prototype, { [SymbolToStringTag]: getNonWritablePropertyDescriptor(WritableStreamDefaultController.name), }); +function InternalWritableStream(start, write, close, abort, highWaterMark, size) { + markTransferMode(this, false, true); + this[kType] = 'WritableStream'; + this[kState] = createWritableStreamState(); + this[kIsClosedPromise] = createDeferredPromise(); + + const controller = new WritableStreamDefaultController(kSkipThrow); + setupWritableStreamDefaultController( + this, + controller, + start, + write, + close, + abort, + highWaterMark, + size, + ); +} + +ObjectSetPrototypeOf(InternalWritableStream.prototype, WritableStream.prototype); +ObjectSetPrototypeOf(InternalWritableStream, WritableStream); + +function createWritableStream(start, write, close, abort, highWaterMark = 1, size = () => 1) { + const stream = new InternalWritableStream(start, write, close, abort, highWaterMark, size); + + // For spec compliance the InternalWritableStream must be a WritableStream + stream.constructor = WritableStream; + return stream; +} + const isWritableStream = isBrandCheck('WritableStream'); const isWritableStreamDefaultWriter = @@ -587,6 +544,55 @@ const isWritableStreamDefaultWriter = const isWritableStreamDefaultController = isBrandCheck('WritableStreamDefaultController'); +function createWritableStreamState() { + return { + __proto__: null, + close: createDeferredPromise(), + closeRequest: { + __proto__: null, + promise: undefined, + resolve: undefined, + reject: undefined, + }, + inFlightWriteRequest: { + __proto__: null, + promise: undefined, + resolve: undefined, + reject: undefined, + }, + inFlightCloseRequest: { + __proto__: null, + promise: undefined, + resolve: undefined, + reject: undefined, + }, + pendingAbortRequest: { + __proto__: null, + abort: { + __proto__: null, + promise: undefined, + resolve: undefined, + reject: undefined, + }, + reason: undefined, + wasAlreadyErroring: false, + }, + backpressure: false, + controller: undefined, + state: 'writable', + storedError: undefined, + writeRequests: [], + writer: undefined, + transfer: { + __proto__: null, + readable: undefined, + port1: undefined, + port2: undefined, + promise: undefined, + }, + }; +} + function isWritableStreamLocked(stream) { return stream[kState].writer !== undefined; } @@ -906,10 +912,7 @@ function writableStreamFinishErroring(stream) { return; } PromisePrototypeThen( - ensureIsPromise( - stream[kState].controller[kAbort], - stream[kState].controller, - abortRequest.reason), + stream[kState].controller[kAbort](abortRequest.reason), () => { abortRequest.abort.resolve?.(); writableStreamRejectCloseAndClosedPromiseIfNeeded(stream); @@ -1113,7 +1116,7 @@ function writableStreamDefaultControllerProcessWrite(controller, chunk) { writableStreamMarkFirstWriteRequestInFlight(stream); PromisePrototypeThen( - ensureIsPromise(writeAlgorithm, controller, chunk, controller), + writeAlgorithm(chunk, controller), () => { writableStreamFinishInFlightWrite(stream); const { @@ -1146,7 +1149,7 @@ function writableStreamDefaultControllerProcessClose(controller) { writableStreamMarkCloseRequestInFlight(stream); dequeueValue(controller); assert(!queue.length); - const sinkClosePromise = ensureIsPromise(closeAlgorithm, controller); + const sinkClosePromise = closeAlgorithm(); writableStreamDefaultControllerClearAlgorithms(controller); PromisePrototypeThen( sinkClosePromise, @@ -1245,12 +1248,14 @@ function setupWritableStreamDefaultControllerFromSink( FunctionPrototypeBind(start, sink, controller) : nonOpStart; const writeAlgorithm = write ? - FunctionPrototypeBind(write, sink) : + createPromiseCallback('sink.write', write, sink) : nonOpWrite; const closeAlgorithm = close ? - FunctionPrototypeBind(close, sink) : nonOpCancel; + createPromiseCallback('sink.close', close, sink) : + nonOpCancel; const abortAlgorithm = abort ? - FunctionPrototypeBind(abort, sink) : nonOpCancel; + createPromiseCallback('sink.abort', abort, sink) : + nonOpCancel; setupWritableStreamDefaultController( stream, controller, @@ -1295,7 +1300,7 @@ function setupWritableStreamDefaultController( const startResult = startAlgorithm(); PromisePrototypeThen( - PromiseResolve(startResult), + new Promise((r) => r(startResult)), () => { assert(stream[kState].state === 'writable' || stream[kState].state === 'erroring'); @@ -1360,4 +1365,5 @@ module.exports = { writableStreamDefaultControllerAdvanceQueueIfNeeded, setupWritableStreamDefaultControllerFromSink, setupWritableStreamDefaultController, + createWritableStream, }; diff --git a/lib/net.js b/lib/net.js index 7f9b1e5c084d8c..fa470dbb060455 100644 --- a/lib/net.js +++ b/lib/net.js @@ -106,11 +106,11 @@ const { ERR_SOCKET_CLOSED_BEFORE_CONNECTION, ERR_MISSING_ARGS, }, - aggregateErrors, - errnoException, - exceptionWithHostPort, + ErrnoException, + ExceptionWithHostPort, genericNodeError, - uvExceptionWithHostPort, + NodeAggregateError, + UVExceptionWithHostPort, } = require('internal/errors'); const { isUint8Array } = require('internal/util/types'); const { queueMicrotask } = require('internal/process/task_queues'); @@ -425,7 +425,7 @@ function Socket(options) { // which cannot be opened. This is difficult to test as most // un-openable fds will throw on `createHandle` if (err) - throw errnoException(err, 'open'); + throw new ErrnoException(err, 'open'); this[async_id_symbol] = this._handle.getAsyncId(); @@ -434,7 +434,7 @@ function Socket(options) { // Make stdout and stderr blocking on Windows err = this._handle.setBlocking(true); if (err) - throw errnoException(err, 'setBlocking'); + throw new ErrnoException(err, 'setBlocking'); this._writev = null; this._write = makeSyncWrite(fd); @@ -533,7 +533,7 @@ Socket.prototype._final = function(cb) { if (err === 1 || err === UV_ENOTCONN) // synchronous finish return cb(); else if (err !== 0) - return cb(errnoException(err, 'shutdown')); + return cb(new ErrnoException(err, 'shutdown')); }; function afterShutdown() { @@ -698,7 +698,7 @@ function tryReadStart(socket) { socket._handle.reading = true; const err = socket._handle.readStart(); if (err) - socket.destroy(errnoException(err, 'read')); + socket.destroy(new ErrnoException(err, 'read')); } // Just call handle.readStart until we have enough in the buffer @@ -747,7 +747,7 @@ Socket.prototype.pause = function() { if (!this.destroyed) { const err = this._handle.readStop(); if (err) - this.destroy(errnoException(err, 'read')); + this.destroy(new ErrnoException(err, 'read')); } } return stream.Duplex.prototype.pause.call(this); @@ -816,7 +816,7 @@ Socket.prototype._destroy = function(exception, cb) { this.emit('close', isException); }); if (err) - this.emit('error', errnoException(err, 'reset')); + this.emit('error', new ErrnoException(err, 'reset')); } else if (this._closeAfterHandlingError) { // Enqueue closing the socket as a microtask, so that the socket can be // accessible when an `error` event is handled in the `next tick queue`. @@ -1051,13 +1051,14 @@ function internalConnect( err = checkBindError(err, localPort, self._handle); if (err) { - const ex = exceptionWithHostPort(err, 'bind', localAddress, localPort); + const ex = new ExceptionWithHostPort(err, 'bind', localAddress, localPort); self.destroy(ex); return; } } debug('connect: attempting to connect to %s:%d (addressType: %d)', address, port, addressType); + self.emit('connectionAttempt', address, port, addressType); if (addressType === 6 || addressType === 4) { const req = new TCPConnectWrap(); @@ -1066,6 +1067,7 @@ function internalConnect( req.port = port; req.localAddress = localAddress; req.localPort = localPort; + req.addressType = addressType; if (addressType === 4) err = self._handle.connect(req, address, port); @@ -1087,7 +1089,7 @@ function internalConnect( details = sockname.address + ':' + sockname.port; } - const ex = exceptionWithHostPort(err, 'connect', address, port, details); + const ex = new ExceptionWithHostPort(err, 'connect', address, port, details); self.destroy(ex); } else if ((addressType === 6 || addressType === 4) && hasObserver('net')) { startPerf(self, kPerfHooksNetConnectContext, { type: 'net', name: 'connect', detail: { host: address, port } }); @@ -1111,7 +1113,7 @@ function internalConnectMultiple(context, canceled) { return; } - self.destroy(aggregateErrors(context.errors)); + self.destroy(new NodeAggregateError(context.errors)); return; } @@ -1142,13 +1144,14 @@ function internalConnectMultiple(context, canceled) { err = checkBindError(err, localPort, self._handle); if (err) { - ArrayPrototypePush(context.errors, exceptionWithHostPort(err, 'bind', localAddress, localPort)); + ArrayPrototypePush(context.errors, new ExceptionWithHostPort(err, 'bind', localAddress, localPort)); internalConnectMultiple(context); return; } } debug('connect/multiple: attempting to connect to %s:%d (addressType: %d)', address, port, addressType); + self.emit('connectionAttempt', address, port, addressType); const req = new TCPConnectWrap(); req.oncomplete = FunctionPrototypeBind(afterConnectMultiple, undefined, context, current); @@ -1156,6 +1159,7 @@ function internalConnectMultiple(context, canceled) { req.port = port; req.localAddress = localAddress; req.localPort = localPort; + req.addressType = addressType; ArrayPrototypePush(self.autoSelectFamilyAttemptedAddresses, `${address}:${port}`); @@ -1173,7 +1177,10 @@ function internalConnectMultiple(context, canceled) { details = sockname.address + ':' + sockname.port; } - ArrayPrototypePush(context.errors, exceptionWithHostPort(err, 'connect', address, port, details)); + const ex = new ExceptionWithHostPort(err, 'connect', address, port, details); + ArrayPrototypePush(context.errors, ex); + + self.emit('connectionAttemptFailed', address, port, addressType, ex); internalConnectMultiple(context); return; } @@ -1592,15 +1599,17 @@ function afterConnect(status, handle, req, readable, writable) { if (req.localAddress && req.localPort) { details = req.localAddress + ':' + req.localPort; } - const ex = exceptionWithHostPort(status, - 'connect', - req.address, - req.port, - details); + const ex = new ExceptionWithHostPort(status, + 'connect', + req.address, + req.port, + details); if (details) { ex.localAddress = req.localAddress; ex.localPort = req.localPort; } + + self.emit('connectionAttemptFailed', req.address, req.port, req.addressType, ex); self.destroy(ex); } } @@ -1631,11 +1640,11 @@ function createConnectionError(req, status) { details = req.localAddress + ':' + req.localPort; } - const ex = exceptionWithHostPort(status, - 'connect', - req.address, - req.port, - details); + const ex = new ExceptionWithHostPort(status, + 'connect', + req.address, + req.port, + details); if (details) { ex.localAddress = req.localAddress; ex.localPort = req.localPort; @@ -1661,10 +1670,16 @@ function afterConnectMultiple(context, current, status, handle, req, readable, w // Some error occurred, add to the list of exceptions if (status !== 0) { - ArrayPrototypePush(context.errors, createConnectionError(req, status)); + const ex = createConnectionError(req, status); + ArrayPrototypePush(context.errors, ex); + + self.emit('connectionAttemptFailed', req.address, req.port, req.addressType, ex); + + // Try the next address, unless we were aborted + if (context.socket.connecting) { + internalConnectMultiple(context, status === UV_ECANCELED); + } - // Try the next address - internalConnectMultiple(context, status === UV_ECANCELED); return; } @@ -1681,10 +1696,16 @@ function afterConnectMultiple(context, current, status, handle, req, readable, w function internalConnectMultipleTimeout(context, req, handle) { debug('connect/multiple: connection to %s:%s timed out', req.address, req.port); + context.socket.emit('connectionAttemptTimeout', req.address, req.port, req.addressType); + req.oncomplete = undefined; ArrayPrototypePush(context.errors, createConnectionError(req, UV_ETIMEDOUT)); handle.close(); - internalConnectMultiple(context); + + // Try the next address, unless we were aborted + if (context.socket.connecting) { + internalConnectMultiple(context); + } } function addServerAbortSignalOption(self, options) { @@ -1852,7 +1873,7 @@ function setupListenHandle(address, port, addressType, backlog, fd, flags) { rval = createServerHandle(address, port, addressType, fd, flags); if (typeof rval === 'number') { - const error = uvExceptionWithHostPort(rval, 'listen', address, port); + const error = new UVExceptionWithHostPort(rval, 'listen', address, port); process.nextTick(emitErrorNT, this, error); return; } @@ -1869,7 +1890,7 @@ function setupListenHandle(address, port, addressType, backlog, fd, flags) { const err = this._handle.listen(backlog || 511); if (err) { - const ex = uvExceptionWithHostPort(err, 'listen', address, port); + const ex = new UVExceptionWithHostPort(err, 'listen', address, port); this._handle.close(); this._handle = null; defaultTriggerAsyncIdScope(this[async_id_symbol], @@ -1937,7 +1958,7 @@ function listenInCluster(server, address, port, addressType, err = checkBindError(err, port, handle); if (err) { - const ex = exceptionWithHostPort(err, 'bind', address, port); + const ex = new ExceptionWithHostPort(err, 'bind', address, port); return server.emit('error', ex); } @@ -2014,6 +2035,12 @@ Server.prototype.listen = function(...args) { // (path[, backlog][, cb]) or (options[, cb]) // where path or options.path is a UNIX domain socket or Windows pipe if (options.path && isPipeName(options.path)) { + // We can not call fchmod on abstract unix socket + if (options.path[0] === '\0' && + (options.readableAll || options.writableAll)) { + const msg = 'can not set readableAll or writableAllt to true when path is abstract unix socket'; + throw new ERR_INVALID_ARG_VALUE('options', options, msg); + } const pipeName = this._pipeName = options.path; backlog = options.backlog || backlogFromArgs; listenInCluster(this, @@ -2045,7 +2072,7 @@ Server.prototype.listen = function(...args) { if (err) { this._handle.close(); this._handle = null; - throw errnoException(err, 'uv_pipe_chmod'); + throw new ErrnoException(err, 'uv_pipe_chmod'); } } return this; @@ -2086,7 +2113,7 @@ Server.prototype.address = function() { const out = {}; const err = this._handle.getsockname(out); if (err) { - throw errnoException(err, 'address'); + throw new ErrnoException(err, 'address'); } return out; } else if (this._pipeName) { @@ -2102,7 +2129,7 @@ function onconnection(err, clientHandle) { debug('onconnection'); if (err) { - self.emit('error', errnoException(err, 'accept')); + self.emit('error', new ErrnoException(err, 'accept')); return; } diff --git a/lib/os.js b/lib/os.js index 1ad17c635182d4..bef4936c7c0bbe 100644 --- a/lib/os.js +++ b/lib/os.js @@ -65,7 +65,7 @@ function getCheckedFunction(fn) { const ctx = {}; const ret = fn(ctx); if (ret === undefined) { - throw new ERR_SYSTEM_ERROR(ctx); + throw new ERR_SYSTEM_ERROR.HideStackFramesError(ctx); } return ret; }); diff --git a/lib/repl.js b/lib/repl.js index 52f3026414d72d..3effdc7bb82d41 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -45,7 +45,7 @@ const { ArrayPrototypeAt, ArrayPrototypeFilter, - ArrayPrototypeFindIndex, + ArrayPrototypeFindLastIndex, ArrayPrototypeForEach, ArrayPrototypeIncludes, ArrayPrototypeJoin, @@ -53,15 +53,13 @@ const { ArrayPrototypePop, ArrayPrototypePush, ArrayPrototypePushApply, - ArrayPrototypeReverse, ArrayPrototypeShift, ArrayPrototypeSlice, ArrayPrototypeSome, ArrayPrototypeSort, - ArrayPrototypeSplice, ArrayPrototypeUnshift, Boolean, - Error, + Error: MainContextError, FunctionPrototypeBind, JSONStringify, MathMaxApply, @@ -90,7 +88,7 @@ const { StringPrototypeSplit, StringPrototypeStartsWith, StringPrototypeTrim, - StringPrototypeTrimLeft, + StringPrototypeTrimStart, StringPrototypeToLocaleLowerCase, Symbol, SyntaxError, @@ -118,6 +116,9 @@ const { } = require('internal/util'); const { inspect } = require('internal/util/inspect'); const vm = require('vm'); + +const { runInThisContext, runInContext } = vm.Script.prototype; + const path = require('path'); const fs = require('fs'); const { Interface } = require('readline'); @@ -150,6 +151,7 @@ const { }, isErrorStackTraceLimitWritable, overrideStackTrace, + ErrorPrepareStackTrace, } = require('internal/errors'); const { sendInspectorCommand } = require('internal/util/inspector'); const { getOptionValue } = require('internal/options'); @@ -185,7 +187,9 @@ const history = require('internal/repl/history'); const { extensionFormatMap, } = require('internal/modules/esm/formats'); - +const { + makeContextifyScript, +} = require('internal/vm'); let nextREPLResourceNumber = 1; // This prevents v8 code cache from getting confused and using a different // cache from a resource of the same name @@ -430,8 +434,6 @@ function REPLServer(prompt, } function defaultEval(code, context, file, cb) { - const asyncESM = require('internal/process/esm_loader'); - let result, script, wrappedErr; let err = null; let wrappedCmd = false; @@ -449,6 +451,21 @@ function REPLServer(prompt, wrappedCmd = true; } + const hostDefinedOptionId = Symbol(`eval:${file}`); + let parentURL; + try { + const { pathToFileURL } = require('internal/url'); + // Adding `/repl` prevents dynamic imports from loading relative + // to the parent of `process.cwd()`. + parentURL = pathToFileURL(path.join(process.cwd(), 'repl')).href; + } catch { + // Continue regardless of error. + } + async function importModuleDynamically(specifier, _, importAttributes) { + const asyncESM = require('internal/process/esm_loader'); + return asyncESM.esmLoader.import(specifier, parentURL, + importAttributes); + } // `experimentalREPLAwait` is set to true by default. // Shall be false in case `--no-experimental-repl-await` flag is used. if (experimentalREPLAwait && StringPrototypeIncludes(code, 'await')) { @@ -466,28 +483,21 @@ function REPLServer(prompt, } catch (e) { let recoverableError = false; if (e.name === 'SyntaxError') { - let parentURL; - try { - const { pathToFileURL } = require('internal/url'); - // Adding `/repl` prevents dynamic imports from loading relative - // to the parent of `process.cwd()`. - parentURL = pathToFileURL(path.join(process.cwd(), 'repl')).href; - } catch { - // Continue regardless of error. - } - // Remove all "await"s and attempt running the script // in order to detect if error is truly non recoverable const fallbackCode = SideEffectFreeRegExpPrototypeSymbolReplace(/\bawait\b/g, code, ''); try { - vm.createScript(fallbackCode, { - filename: file, - displayErrors: true, - importModuleDynamically: (specifier, _, importAttributes) => { - return asyncESM.esmLoader.import(specifier, parentURL, - importAttributes); - }, - }); + makeContextifyScript( + fallbackCode, // code + file, // filename, + 0, // lineOffset + 0, // columnOffset, + undefined, // cachedData + false, // produceCachedData + undefined, // parsingContext + hostDefinedOptionId, // hostDefinedOptionId + importModuleDynamically, // importModuleDynamically + ); } catch (fallbackError) { if (isRecoverableError(fallbackError, fallbackCode)) { recoverableError = true; @@ -507,15 +517,6 @@ function REPLServer(prompt, return cb(null); if (err === null) { - let parentURL; - try { - const { pathToFileURL } = require('internal/url'); - // Adding `/repl` prevents dynamic imports from loading relative - // to the parent of `process.cwd()`. - parentURL = pathToFileURL(path.join(process.cwd(), 'repl')).href; - } catch { - // Continue regardless of error. - } while (true) { try { if (self.replMode === module.exports.REPL_MODE_STRICT && @@ -524,14 +525,17 @@ function REPLServer(prompt, // value for statements and declarations that don't return a value. code = `'use strict'; void 0;\n${code}`; } - script = vm.createScript(code, { - filename: file, - displayErrors: true, - importModuleDynamically: (specifier, _, importAttributes) => { - return asyncESM.esmLoader.import(specifier, parentURL, - importAttributes); - }, - }); + script = makeContextifyScript( + code, // code + file, // filename, + 0, // lineOffset + 0, // columnOffset, + undefined, // cachedData + false, // produceCachedData + undefined, // parsingContext + hostDefinedOptionId, // hostDefinedOptionId + importModuleDynamically, // importModuleDynamically + ); } catch (e) { debug('parse error %j', code, e); if (wrappedCmd) { @@ -591,9 +595,9 @@ function REPLServer(prompt, }; if (self.useGlobal) { - result = script.runInThisContext(scriptOptions); + result = ReflectApply(runInThisContext, script, [scriptOptions]); } else { - result = script.runInContext(context, scriptOptions); + result = ReflectApply(runInContext, script, [context, scriptOptions]); } } finally { if (self.breakEvalOnSigint) { @@ -625,10 +629,10 @@ function REPLServer(prompt, if (self.breakEvalOnSigint) { const interrupt = new Promise((resolve, reject) => { sigintListener = () => { - const tmp = Error.stackTraceLimit; - if (isErrorStackTraceLimitWritable()) Error.stackTraceLimit = 0; + const tmp = MainContextError.stackTraceLimit; + if (isErrorStackTraceLimitWritable()) MainContextError.stackTraceLimit = 0; const err = new ERR_SCRIPT_EXECUTION_INTERRUPTED(); - if (isErrorStackTraceLimitWritable()) Error.stackTraceLimit = tmp; + if (isErrorStackTraceLimitWritable()) MainContextError.stackTraceLimit = tmp; reject(err); }; prioritizedSigintQueue.add(sigintListener); @@ -674,23 +678,22 @@ function REPLServer(prompt, if (typeof stackFrames === 'object') { // Search from the bottom of the call stack to // find the first frame with a null function name - const idx = ArrayPrototypeFindIndex( - ArrayPrototypeReverse(stackFrames), + const idx = ArrayPrototypeFindLastIndex( + stackFrames, (frame) => frame.getFunctionName() === null, ); // If found, get rid of it and everything below it - frames = ArrayPrototypeSplice(stackFrames, idx + 1); + frames = ArrayPrototypeSlice(stackFrames, 0, idx); } else { frames = stackFrames; } // FIXME(devsnek): this is inconsistent with the checks // that the real prepareStackTrace dispatch uses in // lib/internal/errors.js. - if (typeof Error.prepareStackTrace === 'function') { - return Error.prepareStackTrace(error, frames); + if (typeof MainContextError.prepareStackTrace === 'function') { + return MainContextError.prepareStackTrace(error, frames); } - ArrayPrototypePush(frames, error); - return ArrayPrototypeJoin(ArrayPrototypeReverse(frames), '\n at '); + return ErrorPrepareStackTrace(error, frames); }); decorateErrorStack(e); @@ -1321,7 +1324,7 @@ function complete(line, callback) { let completeOn, group; // Ignore right whitespace. It could change the outcome. - line = StringPrototypeTrimLeft(line); + line = StringPrototypeTrimStart(line); let filter = ''; diff --git a/lib/test/reporters.js b/lib/test/reporters.js index 06a0b27ee58275..6316074e6e64aa 100644 --- a/lib/test/reporters.js +++ b/lib/test/reporters.js @@ -6,6 +6,7 @@ let dot; let junit; let spec; let tap; +let lcov; ObjectDefineProperties(module.exports, { __proto__: null, @@ -45,4 +46,13 @@ ObjectDefineProperties(module.exports, { return tap; }, }, + lcov: { + __proto__: null, + configurable: true, + enumerable: true, + get() { + lcov ??= require('internal/test_runner/reporter/lcov'); + return ReflectConstruct(lcov, arguments); + }, + }, }); diff --git a/lib/timers.js b/lib/timers.js index ad58cf61f1309f..7c77ca5c04e2e0 100644 --- a/lib/timers.js +++ b/lib/timers.js @@ -24,6 +24,7 @@ const { MathTrunc, ObjectDefineProperty, + ObjectDefineProperties, SymbolDispose, SymbolToPrimitive, } = primordials; @@ -62,6 +63,7 @@ let debug = require('internal/util/debuglog').debuglog('timer', (fn) => { const { validateFunction } = require('internal/validators'); let timersPromises; +let timers; const { destroyHooksExist, @@ -347,7 +349,7 @@ Immediate.prototype[SymbolDispose] = function() { clearImmediate(this); }; -module.exports = { +module.exports = timers = { setTimeout, clearTimeout, setImmediate, @@ -372,3 +374,15 @@ module.exports = { 'timers.enroll() is deprecated. Please use setTimeout instead.', 'DEP0095'), }; + +ObjectDefineProperties(timers, { + promises: { + __proto__: null, + configurable: true, + enumerable: true, + get() { + timersPromises ??= require('timers/promises'); + return timersPromises; + }, + }, +}); diff --git a/lib/trace_events.js b/lib/trace_events.js index 860543e30bc35e..b4b9be242737e2 100644 --- a/lib/trace_events.js +++ b/lib/trace_events.js @@ -3,13 +3,9 @@ const { ArrayPrototypeJoin, SafeSet, - Symbol, } = primordials; const { hasTracing } = internalBinding('config'); -const kHandle = Symbol('handle'); -const kEnabled = Symbol('enabled'); -const kCategories = Symbol('categories'); const kMaxTracingCount = 10; @@ -33,16 +29,19 @@ const { const enabledTracingObjects = new SafeSet(); class Tracing { + #handle; + #categories; + #enabled = false; + constructor(categories) { - this[kHandle] = new CategorySet(categories); - this[kCategories] = categories; - this[kEnabled] = false; + this.#handle = new CategorySet(categories); + this.#categories = categories; } enable() { - if (!this[kEnabled]) { - this[kEnabled] = true; - this[kHandle].enable(); + if (!this.#enabled) { + this.#enabled = true; + this.#handle.enable(); enabledTracingObjects.add(this); if (enabledTracingObjects.size > kMaxTracingCount) { process.emitWarning( @@ -54,19 +53,19 @@ class Tracing { } disable() { - if (this[kEnabled]) { - this[kEnabled] = false; - this[kHandle].disable(); + if (this.#enabled) { + this.#enabled = false; + this.#handle.disable(); enabledTracingObjects.delete(this); } } get enabled() { - return this[kEnabled]; + return this.#enabled; } get categories() { - return ArrayPrototypeJoin(this[kCategories], ','); + return ArrayPrototypeJoin(this.#categories, ','); } [customInspectSymbol](depth, opts) { diff --git a/lib/tty.js b/lib/tty.js index fb0319f93ebe67..aa929cd9ba0d08 100644 --- a/lib/tty.js +++ b/lib/tty.js @@ -74,7 +74,7 @@ ReadStream.prototype.setRawMode = function(flag) { flag = !!flag; const err = this._handle?.setRawMode(flag); if (err) { - this.emit('error', errors.errnoException(err, 'setRawMode')); + this.emit('error', new errors.ErrnoException(err, 'setRawMode')); return this; } this.isRaw = flag; @@ -129,7 +129,7 @@ WriteStream.prototype._refreshSize = function() { const winSize = new Array(2); const err = this._handle.getWindowSize(winSize); if (err) { - this.emit('error', errors.errnoException(err, 'getWindowSize')); + this.emit('error', new errors.ErrnoException(err, 'getWindowSize')); return; } const { 0: newCols, 1: newRows } = winSize; diff --git a/lib/util.js b/lib/util.js index 7fb7994e6536ba..13a437c9318d05 100644 --- a/lib/util.js +++ b/lib/util.js @@ -32,6 +32,7 @@ const { DatePrototypeGetMonth, DatePrototypeGetSeconds, Error, + ErrorCaptureStackTrace, FunctionPrototypeBind, NumberIsSafeInteger, ObjectDefineProperties, @@ -43,6 +44,7 @@ const { ObjectValues, ReflectApply, StringPrototypePadStart, + StringPrototypeToWellFormed, } = primordials; const { @@ -51,9 +53,9 @@ const { ERR_INVALID_ARG_TYPE, ERR_OUT_OF_RANGE, }, - errnoException, - exceptionWithHostPort, - hideStackFrames, + isErrorStackTraceLimitWritable, + ErrnoException, + ExceptionWithHostPort, } = require('internal/errors'); const { format, @@ -74,7 +76,6 @@ const { getSystemErrorMap, getSystemErrorName: internalErrorName, promisify, - toUSVString, defineLazyProperties, } = require('internal/util'); @@ -278,16 +279,17 @@ function _extend(target, source) { return target; } -const callbackifyOnRejected = hideStackFrames((reason, cb) => { +const callbackifyOnRejected = (reason, cb) => { // `!reason` guard inspired by bluebird (Ref: https://goo.gl/t5IS6M). // Because `null` is a special error value in callbacks which means "no error // occurred", we error-wrap so the callback consumer can distinguish between // "the promise rejected with null" or "the promise fulfilled with undefined". if (!reason) { - reason = new ERR_FALSY_VALUE_REJECTION(reason); + reason = new ERR_FALSY_VALUE_REJECTION.HideStackFramesError(reason); + ErrorCaptureStackTrace(reason, callbackifyOnRejected); } return cb(reason); -}); +}; /** * @template {(...args: any[]) => Promise} T @@ -345,11 +347,37 @@ function getSystemErrorName(err) { return internalErrorName(err); } +function _errnoException(...args) { + if (isErrorStackTraceLimitWritable()) { + const limit = Error.stackTraceLimit; + Error.stackTraceLimit = 0; + const e = new ErrnoException(...args); + Error.stackTraceLimit = limit; + ErrorCaptureStackTrace(e, _exceptionWithHostPort); + return e; + } + return new ErrnoException(...args); +} + +function _exceptionWithHostPort(...args) { + if (isErrorStackTraceLimitWritable()) { + const limit = Error.stackTraceLimit; + Error.stackTraceLimit = 0; + const e = new ExceptionWithHostPort(...args); + Error.stackTraceLimit = limit; + ErrorCaptureStackTrace(e, _exceptionWithHostPort); + return e; + } + return new ExceptionWithHostPort(...args); +} + // Keep the `exports =` so that various functions can still be monkeypatched module.exports = { - _errnoException: errnoException, - _exceptionWithHostPort: exceptionWithHostPort, - _extend, + _errnoException, + _exceptionWithHostPort, + _extend: deprecate(_extend, + 'The `util._extend` API is deprecated. Please use Object.assign() instead.', + 'DEP0060'), callbackify, debug: debuglog, debuglog, @@ -360,9 +388,15 @@ module.exports = { getSystemErrorName, inherits, inspect, - isArray: ArrayIsArray, - isBoolean, - isBuffer, + isArray: deprecate(ArrayIsArray, + 'The `util.isArray` API is deprecated. Please use `Array.isArray()` instead.', + 'DEP0044'), + isBoolean: deprecate(isBoolean, + 'The `util.isBoolean` API is deprecated. Please use `typeof arg === "boolean"` instead.', + 'DEP0045'), + isBuffer: deprecate(isBuffer, + 'The `util.isBuffer` API is deprecated. Please use `Buffer.isBuffer()` instead.', + 'DEP0046'), isDeepStrictEqual(a, b) { if (internalDeepEqual === undefined) { internalDeepEqual = require('internal/util/comparisons') @@ -370,22 +404,57 @@ module.exports = { } return internalDeepEqual(a, b); }, - isNull, - isNullOrUndefined, - isNumber, - isString, - isSymbol, - isUndefined, - isRegExp: types.isRegExp, - isObject, - isDate: types.isDate, - isError, - isFunction, - isPrimitive, - log, + isNull: deprecate(isNull, + 'The `util.isNull` API is deprecated. Please use `arg === null` instead.', + 'DEP0050'), + isNullOrUndefined: deprecate(isNullOrUndefined, + 'The `util.isNullOrUndefined` API is deprecated. ' + + 'Please use `arg === null || arg === undefined` instead.', + 'DEP0051'), + isNumber: deprecate(isNumber, + 'The `util.isNumber` API is deprecated. Please use `typeof arg === "number"` instead.', + 'DEP0052'), + isString: deprecate(isString, + 'The `util.isString` API is deprecated. Please use `typeof arg === "string"` instead.', + 'DEP0056'), + isSymbol: deprecate(isSymbol, + 'The `util.isSymbol` API is deprecated. Please use `arg === "symbol"` instead.', + 'DEP0057'), + isUndefined: deprecate(isUndefined, + 'The `util.isUndefined` API is deprecated. Please use `arg === undefined` instead.', + 'DEP0058'), + isRegExp: deprecate(types.isRegExp, + 'The `util.isRegExp` API is deprecated. Please use `arg instanceof RegExp` instead.', + 'DEP0055'), + isObject: deprecate(isObject, + 'The `util.isObject` API is deprecated. ' + + 'Please use `arg !== null && typeof arg === "object"` instead.', + 'DEP0053'), + isDate: deprecate(types.isDate, + 'The `util.isDate` API is deprecated. Please use `arg instanceof Date` instead.', + 'DEP0047'), + isError: deprecate(isError, + 'The `util.isError` API is deprecated. ' + + 'Please use `ObjectPrototypeToString(e) === "[object Error]" ' + + '|| e instanceof Error` instead.', + 'DEP0048'), + isFunction: deprecate(isFunction, + 'The `util.isFunction` API is deprecated. Please use `typeof arg === "function"` instead.', + 'DEP0049'), + isPrimitive: deprecate(isPrimitive, + 'The `util.isPrimitive` API is deprecated. ' + + 'Please use `arg === null || ' + + '(typeof arg !== "object" && typeof arg !== "function")` instead.', + 'DEP0054'), + log: deprecate(log, + 'The `util.log API is deprecated. ' + + 'Please use console.log() with a custom formatter or a third-party logger instead.', + 'DEP0059'), promisify, stripVTControlCharacters, - toUSVString, + toUSVString(input) { + return StringPrototypeToWellFormed(`${input}`); + }, get transferableAbortSignal() { return lazyAbortController().transferableAbortSignal; }, diff --git a/lib/vm.js b/lib/vm.js index f134cdc983db6d..44861be46dafd2 100644 --- a/lib/vm.js +++ b/lib/vm.js @@ -39,14 +39,16 @@ const { ERR_INVALID_ARG_TYPE, } = require('internal/errors').codes; const { + validateArray, validateBoolean, validateBuffer, - validateFunction, validateInt32, - validateObject, validateOneOf, + validateObject, validateString, + validateStringArray, validateUint32, + kValidateObjectAllowNullable, } = require('internal/validators'); const { emitExperimentalWarning, @@ -54,8 +56,10 @@ const { kVmBreakFirstLineSymbol, } = require('internal/util'); const { + getHostDefinedOptionId, internalCompileFunction, isContext, + registerImportModuleDynamically, } = require('internal/vm'); const kParsingContext = Symbol('script parsing context'); @@ -86,12 +90,8 @@ class Script extends ContextifyScript { } validateBoolean(produceCachedData, 'options.produceCachedData'); - if (importModuleDynamically !== undefined) { - // Check that it's either undefined or a function before we pass - // it into the native constructor. - validateFunction(importModuleDynamically, - 'options.importModuleDynamically'); - } + const hostDefinedOptionId = + getHostDefinedOptionId(importModuleDynamically, filename); // Calling `ReThrow()` on a native TryCatch does not generate a new // abort-on-uncaught-exception check. A dummy try/catch in JS land // protects against that. @@ -103,19 +103,13 @@ class Script extends ContextifyScript { cachedData, produceCachedData, parsingContext, - importModuleDynamically !== undefined); + hostDefinedOptionId); } catch (e) { throw e; /* node-do-not-add-exception-line */ } if (importModuleDynamically !== undefined) { - const { importModuleDynamicallyWrap } = require('internal/vm/module'); - const { registerModule } = require('internal/modules/esm/utils'); - registerModule(this, { - __proto__: null, - importModuleDynamically: - importModuleDynamicallyWrap(importModuleDynamically), - }); + registerImportModuleDynamically(this, importModuleDynamically); } } @@ -224,6 +218,7 @@ function createContext(contextObject = {}, options = kEmptyObject) { origin, codeGeneration, microtaskMode, + importModuleDynamically, } = options; validateString(name, 'options.name'); @@ -245,7 +240,14 @@ function createContext(contextObject = {}, options = kEmptyObject) { ['afterEvaluate', undefined]); const microtaskQueue = (microtaskMode === 'afterEvaluate'); - makeContext(contextObject, name, origin, strings, wasm, microtaskQueue); + const hostDefinedOptionId = + getHostDefinedOptionId(importModuleDynamically, name); + + makeContext(contextObject, name, origin, strings, wasm, microtaskQueue, hostDefinedOptionId); + // Register the context scope callback after the context was initialized. + if (importModuleDynamically !== undefined) { + registerImportModuleDynamically(contextObject, importModuleDynamically); + } return contextObject; } @@ -302,7 +304,54 @@ function runInThisContext(code, options) { } function compileFunction(code, params, options = kEmptyObject) { - return internalCompileFunction(code, params, options).function; + validateString(code, 'code'); + if (params !== undefined) { + validateStringArray(params, 'params'); + } + const { + filename = '', + columnOffset = 0, + lineOffset = 0, + cachedData = undefined, + produceCachedData = false, + parsingContext = undefined, + contextExtensions = [], + importModuleDynamically, + } = options; + + validateString(filename, 'options.filename'); + validateInt32(columnOffset, 'options.columnOffset'); + validateInt32(lineOffset, 'options.lineOffset'); + if (cachedData !== undefined) + validateBuffer(cachedData, 'options.cachedData'); + validateBoolean(produceCachedData, 'options.produceCachedData'); + if (parsingContext !== undefined) { + if ( + typeof parsingContext !== 'object' || + parsingContext === null || + !isContext(parsingContext) + ) { + throw new ERR_INVALID_ARG_TYPE( + 'options.parsingContext', + 'Context', + parsingContext, + ); + } + } + validateArray(contextExtensions, 'options.contextExtensions'); + ArrayPrototypeForEach(contextExtensions, (extension, i) => { + const name = `options.contextExtensions[${i}]`; + validateObject(extension, name, kValidateObjectAllowNullable); + }); + + const hostDefinedOptionId = + getHostDefinedOptionId(importModuleDynamically, filename); + + return internalCompileFunction( + code, filename, lineOffset, columnOffset, + cachedData, produceCachedData, parsingContext, contextExtensions, + params, hostDefinedOptionId, importModuleDynamically, + ).function; } const measureMemoryModes = { diff --git a/lib/zlib.js b/lib/zlib.js index 2b90c6f91fed76..3766938f6bc7bb 100644 --- a/lib/zlib.js +++ b/lib/zlib.js @@ -211,10 +211,10 @@ const checkFiniteNumber = hideStackFrames((number, name) => { return false; } - validateNumber(number, name); + validateNumber.withoutStackTrace(number, name); // Infinite numbers - throw new ERR_OUT_OF_RANGE(name, 'a finite number', number); + throw new ERR_OUT_OF_RANGE.HideStackFramesError(name, 'a finite number', number); }); // 1. Returns def for number when it's undefined or NaN @@ -223,12 +223,12 @@ const checkFiniteNumber = hideStackFrames((number, name) => { // 4. Throws ERR_OUT_OF_RANGE for infinite numbers or numbers > upper or < lower const checkRangesOrGetDefault = hideStackFrames( (number, name, lower, upper, def) => { - if (!checkFiniteNumber(number, name)) { + if (!checkFiniteNumber.withoutStackTrace(number, name)) { return def; } if (number < lower || number > upper) { - throw new ERR_OUT_OF_RANGE(name, - `>= ${lower} and <= ${upper}`, number); + throw new ERR_OUT_OF_RANGE.HideStackFramesError(name, + `>= ${lower} and <= ${upper}`, number); } return number; }, diff --git a/node.gni b/node.gni new file mode 100644 index 00000000000000..2be97a17a2f710 --- /dev/null +++ b/node.gni @@ -0,0 +1,67 @@ +# Copyright 2019 the V8 project authors. All rights reserved. +# Copyright 2023 Microsoft Inc. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# This file is used by GN for building, which is NOT the build system used for +# building official binaries. +# Please take a look at node.gyp if you are making changes to build system. + +# Embedder options. +declare_args() { + # The location of Node.js in source code tree. + node_path = "//node" + + # The location of V8, use the one from node's deps by default. + node_v8_path = "$node_path/deps/v8" + + # The NODE_MODULE_VERSION defined in node_version.h. + node_module_version = exec_script("$node_path/tools/getmoduleversion.py", [], "value") + + # Support for external shareable builtins. + # TODO(zcbenz): This is currently copied from configure.py, we should share + # the list between configure.py and GN configurations. + node_builtin_shareable_builtins = [ + "deps/cjs-module-lexer/lexer.js", + "deps/cjs-module-lexer/dist/lexer.js", + "deps/undici/undici.js", + ] +} + +# Equivalent of gyp file's configurations. +declare_args() { + # Enable the V8 inspector protocol for use with node. + node_enable_inspector = true + + # Build node with SSL support. + # The variable is called "openssl" for parity with node's GYP build. + node_use_openssl = true + + # Use the specified path to system CA (PEM format) in addition to + # the BoringSSL supplied CA store or compiled-in Mozilla CA copy. + node_openssl_system_ca_path = "" + + # Initialize v8 platform during node.js startup. + node_use_v8_platform = true + + # Custom build tag. + node_tag = "" + + # V8 options to pass, see `node --v8-options` for examples. + node_v8_options = "" + + # Provide a custom URL prefix for the `process.release` properties + # `sourceUrl` and `headersUrl`. When compiling a release build, this will + # default to https://nodejs.org/download/release/'). + node_release_urlbase = "" + + # Use code cache to speed up startup. Disabled for cross compilation. + node_use_node_code_cache = host_os == target_os && host_cpu == target_cpu + + # Use snapshot to speed up startup. + # TODO(zcbenz): node_mksnapshot is not ready for cross-os compilation. + node_use_node_snapshot = host_os == target_os +} + +assert(!node_enable_inspector || node_use_openssl, + "node_enable_inspector requires node_use_openssl") diff --git a/node.gyp b/node.gyp index 93e4235a0f3efd..42e626b2f95398 100644 --- a/node.gyp +++ b/node.gyp @@ -112,6 +112,7 @@ 'src/node_main_instance.cc', 'src/node_messaging.cc', 'src/node_metadata.cc', + 'src/node_modules.cc', 'src/node_options.cc', 'src/node_os.cc', 'src/node_perf.cc', @@ -142,6 +143,7 @@ 'src/node_watchdog.cc', 'src/node_worker.cc', 'src/node_zlib.cc', + 'src/path.cc', 'src/permission/child_process_permission.cc', 'src/permission/fs_permission.cc', 'src/permission/inspector_permission.cc', @@ -234,6 +236,7 @@ 'src/node_messaging.h', 'src/node_metadata.h', 'src/node_mutex.h', + 'src/node_modules.h', 'src/node_object_wrap.h', 'src/node_options.h', 'src/node_options-inl.h', @@ -262,6 +265,7 @@ 'src/node_wasi.h', 'src/node_watchdog.h', 'src/node_worker.h', + 'src/path.h', 'src/permission/child_process_permission.h', 'src/permission/fs_permission.h', 'src/permission/inspector_permission.h', @@ -375,6 +379,7 @@ 'src/quic/tlscontext.h', 'src/quic/tokens.h', 'src/quic/transportparams.h', + 'src/quic/quic.cc', ], 'node_cctest_sources': [ 'src/node_snapshot_stub.cc', @@ -468,6 +473,9 @@ }, 'conditions': [ + ['target_arch=="arm64"', { + 'cflags': ['-mbranch-protection=standard'], # Pointer authentication. + }], ['OS in "aix os400"', { 'ldflags': [ '-Wl,-bnoerrmsg', @@ -762,7 +770,7 @@ '<(fipsmodule)', ], 'action': [ - 'python', 'tools/copyfile.py', + '<(python)', 'tools/copyfile.py', '<(fipsmodule_internal)', '<(fipsmodule)', ], @@ -772,7 +780,7 @@ 'inputs': [ '<(opensslconfig)', ], 'outputs': [ '<(opensslconfig_internal)', ], 'action': [ - 'python', 'tools/enable_fips_include.py', + '<(python)', 'tools/enable_fips_include.py', '<(opensslconfig)', '<(opensslconfig_internal)', '<(fipsconfig)', @@ -816,6 +824,7 @@ 'deps/googletest/googletest.gyp:gtest_prod', 'deps/histogram/histogram.gyp:histogram', 'deps/uvwasi/uvwasi.gyp:uvwasi', + 'deps/simdjson/simdjson.gyp:simdjson', 'deps/simdutf/simdutf.gyp:simdutf', 'deps/ada/ada.gyp:ada', 'node_js2c#host', @@ -1047,6 +1056,7 @@ 'deps/googletest/googletest.gyp:gtest_main', 'deps/histogram/histogram.gyp:histogram', 'deps/uvwasi/uvwasi.gyp:uvwasi', + 'deps/simdjson/simdjson.gyp:simdjson', 'deps/simdutf/simdutf.gyp:simdutf', 'deps/ada/ada.gyp:ada', ], diff --git a/node.gypi b/node.gypi index 9138317c62c7cd..95133818dff7c7 100644 --- a/node.gypi +++ b/node.gypi @@ -141,6 +141,7 @@ } ], [ 'node_shared_zlib=="false"', { 'dependencies': [ 'deps/zlib/zlib.gyp:zlib' ], + 'defines': [ 'NODE_BUNDLED_ZLIB' ], 'conditions': [ [ 'force_load=="true"', { 'xcode_settings': { diff --git a/pyproject.toml b/pyproject.toml index d0c3a056f2e92c..b7ec8b42944028 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,6 +19,7 @@ select = [ ] exclude = [ "deps", + "tools/gyp", "tools/inspector_protocol", "tools/node_modules", ] diff --git a/src/acorn_version.h b/src/acorn_version.h index 8c71b2ece5aa80..1dfc3532ce0140 100644 --- a/src/acorn_version.h +++ b/src/acorn_version.h @@ -1,6 +1,6 @@ // This is an auto generated file, please do not edit. -// Refer to tools/update-acorn.sh +// Refer to tools/dep_updaters/update-acorn.sh #ifndef SRC_ACORN_VERSION_H_ #define SRC_ACORN_VERSION_H_ -#define ACORN_VERSION "8.10.0" +#define ACORN_VERSION "8.11.3" #endif // SRC_ACORN_VERSION_H_ diff --git a/src/api/callback.cc b/src/api/callback.cc index 3a8bd9155a8545..579bfb6e7fda5c 100644 --- a/src/api/callback.cc +++ b/src/api/callback.cc @@ -248,8 +248,7 @@ MaybeLocal MakeCallback(Isolate* isolate, Local argv[], async_context asyncContext) { // Check can_call_into_js() first because calling Get() might do so. - Environment* env = - Environment::GetCurrent(recv->GetCreationContext().ToLocalChecked()); + Environment* env = Environment::GetCurrent(recv->GetCreationContextChecked()); CHECK_NOT_NULL(env); if (!env->can_call_into_js()) return Local(); @@ -279,7 +278,7 @@ MaybeLocal MakeCallback(Isolate* isolate, // Because of the AssignToContext() call in src/node_contextify.cc, // the two contexts need not be the same. Environment* env = - Environment::GetCurrent(callback->GetCreationContext().ToLocalChecked()); + Environment::GetCurrent(callback->GetCreationContextChecked()); CHECK_NOT_NULL(env); Context::Scope context_scope(env->context()); MaybeLocal ret = @@ -302,7 +301,7 @@ MaybeLocal MakeSyncCallback(Isolate* isolate, int argc, Local argv[]) { Environment* env = - Environment::GetCurrent(callback->GetCreationContext().ToLocalChecked()); + Environment::GetCurrent(callback->GetCreationContextChecked()); CHECK_NOT_NULL(env); if (!env->can_call_into_js()) return Local(); diff --git a/src/api/embed_helpers.cc b/src/api/embed_helpers.cc index 341d131f24f753..6fac48d1b534d2 100644 --- a/src/api/embed_helpers.cc +++ b/src/api/embed_helpers.cc @@ -92,7 +92,8 @@ CommonEnvironmentSetup::CommonEnvironmentSetup( std::vector* errors, const EmbedderSnapshotData* snapshot_data, uint32_t flags, - std::function make_env) + std::function make_env, + const SnapshotConfig* snapshot_config) : impl_(new Impl()) { CHECK_NOT_NULL(platform); CHECK_NOT_NULL(errors); @@ -142,8 +143,7 @@ CommonEnvironmentSetup::CommonEnvironmentSetup( impl_->isolate_data.reset(CreateIsolateData( isolate, loop, platform, impl_->allocator.get(), snapshot_data)); - impl_->isolate_data->set_is_building_snapshot( - impl_->snapshot_creator.has_value()); + impl_->isolate_data->set_snapshot_config(snapshot_config); if (snapshot_data) { impl_->env.reset(make_env(this)); @@ -176,7 +176,8 @@ CommonEnvironmentSetup::CreateForSnapshotting( MultiIsolatePlatform* platform, std::vector* errors, const std::vector& args, - const std::vector& exec_args) { + const std::vector& exec_args, + const SnapshotConfig& snapshot_config) { // It's not guaranteed that a context that goes through // v8_inspector::V8Inspector::contextCreated() is runtime-independent, // so do not start the inspector on the main context when building @@ -196,7 +197,8 @@ CommonEnvironmentSetup::CreateForSnapshotting( args, exec_args, static_cast(env_flags)); - })); + }, + &snapshot_config)); if (!errors->empty()) ret.reset(); return ret; } @@ -240,10 +242,7 @@ EmbedderSnapshotData::Pointer CommonEnvironmentSetup::CreateSnapshot() { EmbedderSnapshotData::Pointer result{ new EmbedderSnapshotData(snapshot_data, true)}; - auto exit_code = SnapshotBuilder::CreateSnapshot( - snapshot_data, - this, - static_cast(SnapshotMetadata::Type::kFullyCustomized)); + auto exit_code = SnapshotBuilder::CreateSnapshot(snapshot_data, this); if (exit_code != ExitCode::kNoFailure) return {}; return result; diff --git a/src/api/environment.cc b/src/api/environment.cc index 6a6164b6d29443..7e30a35ad7e611 100644 --- a/src/api/environment.cc +++ b/src/api/environment.cc @@ -313,6 +313,8 @@ void SetIsolateMiscHandlers(v8::Isolate* isolate, const IsolateSettings& s) { void SetIsolateUpForNode(v8::Isolate* isolate, const IsolateSettings& settings) { + Isolate::Scope isolate_scope(isolate); + SetIsolateErrorHandlers(isolate, settings); SetIsolateMiscHandlers(isolate, settings); } @@ -354,6 +356,9 @@ Isolate* NewIsolate(Isolate::CreateParams* params, SetIsolateCreateParamsForNode(params); Isolate::Initialize(isolate, *params); + + Isolate::Scope isolate_scope(isolate); + if (snapshot_data == nullptr) { // If in deserialize mode, delay until after the deserialization is // complete. @@ -428,6 +433,8 @@ Environment* CreateEnvironment( ThreadId thread_id, std::unique_ptr inspector_parent_handle) { Isolate* isolate = isolate_data->isolate(); + + Isolate::Scope isolate_scope(isolate); HandleScope handle_scope(isolate); const bool use_snapshot = context.IsEmpty(); @@ -727,7 +734,7 @@ Maybe InitializeContextRuntime(Local context) { } } else if (per_process::cli_options->disable_proto != "") { // Validated in ProcessGlobalArgs - OnFatalError("InitializeContextRuntime()", "invalid --disable-proto mode"); + UNREACHABLE("invalid --disable-proto mode"); } return Just(true); diff --git a/src/async_wrap.cc b/src/async_wrap.cc index 42cddc52aed285..8b784cddf41603 100644 --- a/src/async_wrap.cc +++ b/src/async_wrap.cc @@ -372,8 +372,9 @@ void AsyncWrap::CreatePerContextProperties(Local target, Local unused, Local context, void* priv) { - Environment* env = Environment::GetCurrent(context); - Isolate* isolate = env->isolate(); + Realm* realm = Realm::GetCurrent(context); + Environment* env = realm->env(); + Isolate* isolate = realm->isolate(); HandleScope scope(isolate); PropertyAttribute ReadOnlyDontDelete = @@ -446,13 +447,16 @@ void AsyncWrap::CreatePerContextProperties(Local target, #undef FORCE_SET_TARGET_FIELD - env->set_async_hooks_init_function(Local()); - env->set_async_hooks_before_function(Local()); - env->set_async_hooks_after_function(Local()); - env->set_async_hooks_destroy_function(Local()); - env->set_async_hooks_promise_resolve_function(Local()); - env->set_async_hooks_callback_trampoline(Local()); - env->set_async_hooks_binding(target); + // TODO(legendecas): async hook functions are not realm-aware yet. + // This simply avoid overriding principal realm's functions when a + // ShadowRealm initializes the binding. + realm->set_async_hooks_init_function(Local()); + realm->set_async_hooks_before_function(Local()); + realm->set_async_hooks_after_function(Local()); + realm->set_async_hooks_destroy_function(Local()); + realm->set_async_hooks_promise_resolve_function(Local()); + realm->set_async_hooks_callback_trampoline(Local()); + realm->set_async_hooks_binding(target); } void AsyncWrap::RegisterExternalReferences( diff --git a/src/base64_version.h b/src/base64_version.h index fa492a293b40e1..c3737f4beebfcb 100644 --- a/src/base64_version.h +++ b/src/base64_version.h @@ -2,5 +2,5 @@ // Refer to tools/dep_updaters/update-base64.sh #ifndef SRC_BASE64_VERSION_H_ #define SRC_BASE64_VERSION_H_ -#define BASE64_VERSION "0.5.0" +#define BASE64_VERSION "0.5.1" #endif // SRC_BASE64_VERSION_H_ diff --git a/src/base_object-inl.h b/src/base_object-inl.h index 2ca432e2dfd3c6..da8fed7b3013df 100644 --- a/src/base_object-inl.h +++ b/src/base_object-inl.h @@ -55,8 +55,7 @@ v8::Local BaseObject::object() const { v8::Local BaseObject::object(v8::Isolate* isolate) const { v8::Local handle = object(); - DCHECK_EQ(handle->GetCreationContext().ToLocalChecked()->GetIsolate(), - isolate); + DCHECK_EQ(handle->GetCreationContextChecked()->GetIsolate(), isolate); DCHECK_EQ(env()->isolate(), isolate); return handle; diff --git a/src/base_object_types.h b/src/base_object_types.h index cb034f1d62b681..9cfe6a77f71708 100644 --- a/src/base_object_types.h +++ b/src/base_object_types.h @@ -17,7 +17,8 @@ namespace node { V(blob_binding_data, BlobBindingData) \ V(process_binding_data, process::BindingData) \ V(timers_binding_data, timers::BindingData) \ - V(url_binding_data, url::BindingData) + V(url_binding_data, url::BindingData) \ + V(modules_binding_data, modules::BindingData) #define UNSERIALIZABLE_BINDING_TYPES(V) \ V(http2_binding_data, http2::BindingData) \ diff --git a/src/crypto/README.md b/src/crypto/README.md index ceefda03976ba9..51659f1f363b3b 100644 --- a/src/crypto/README.md +++ b/src/crypto/README.md @@ -82,7 +82,7 @@ using EVPKeyCtxPointer = DeleteFnPtr; using EVPMDPointer = DeleteFnPtr; using RSAPointer = DeleteFnPtr; using ECPointer = DeleteFnPtr; -using BignumPointer = DeleteFnPtr; +using BignumPointer = DeleteFnPtr; using NetscapeSPKIPointer = DeleteFnPtr; using ECGroupPointer = DeleteFnPtr; using ECPointPointer = DeleteFnPtr; diff --git a/src/crypto/crypto_cipher.cc b/src/crypto/crypto_cipher.cc index 2e6e02d229b67b..2cc0714d950de1 100644 --- a/src/crypto/crypto_cipher.cc +++ b/src/crypto/crypto_cipher.cc @@ -404,15 +404,6 @@ void CipherBase::Init(const char* cipher_type, unsigned int auth_tag_len) { HandleScope scope(env()->isolate()); MarkPopErrorOnReturn mark_pop_error_on_return; -#if OPENSSL_VERSION_MAJOR >= 3 - if (EVP_default_properties_is_fips_enabled(nullptr)) { -#else - if (FIPS_mode()) { -#endif - return THROW_ERR_CRYPTO_UNSUPPORTED_OPERATION(env(), - "crypto.createCipher() is not supported in FIPS mode."); - } - const EVP_CIPHER* const cipher = EVP_get_cipherbyname(cipher_type); if (cipher == nullptr) return THROW_ERR_CRYPTO_UNKNOWN_CIPHER(env()); diff --git a/src/crypto/crypto_dh.cc b/src/crypto/crypto_dh.cc index 408d6be2a9cfdb..b4447102a84786 100644 --- a/src/crypto/crypto_dh.cc +++ b/src/crypto/crypto_dh.cc @@ -2,6 +2,7 @@ #include "async_wrap-inl.h" #include "base_object-inl.h" #include "crypto/crypto_keys.h" +#include "crypto/crypto_util.h" #include "env-inl.h" #include "memory_tracker-inl.h" #include "threadpoolwork-inl.h" @@ -162,13 +163,11 @@ bool DiffieHellman::Init(const char* p, int p_len, int g) { DH_R_BAD_GENERATOR, __FILE__, __LINE__); return false; } - BIGNUM* bn_p = - BN_bin2bn(reinterpret_cast(p), p_len, nullptr); - BIGNUM* bn_g = BN_new(); - if (!BN_set_word(bn_g, g) || - !DH_set0_pqg(dh_.get(), bn_p, nullptr, bn_g)) { - BN_free(bn_p); - BN_free(bn_g); + BignumPointer bn_p( + BN_bin2bn(reinterpret_cast(p), p_len, nullptr)); + BignumPointer bn_g(BN_new()); + if (bn_p == nullptr || bn_g == nullptr || !BN_set_word(bn_g.get(), g) || + !DH_set0_pqg(dh_.get(), bn_p.release(), nullptr, bn_g.release())) { return false; } return VerifyContext(); @@ -186,21 +185,23 @@ bool DiffieHellman::Init(const char* p, int p_len, const char* g, int g_len) { DH_R_BAD_GENERATOR, __FILE__, __LINE__); return false; } - BIGNUM* bn_g = - BN_bin2bn(reinterpret_cast(g), g_len, nullptr); - if (BN_is_zero(bn_g) || BN_is_one(bn_g)) { - BN_free(bn_g); + BignumPointer bn_g( + BN_bin2bn(reinterpret_cast(g), g_len, nullptr)); + if (BN_is_zero(bn_g.get()) || BN_is_one(bn_g.get())) { ERR_put_error(ERR_LIB_DH, DH_F_DH_BUILTIN_GENPARAMS, DH_R_BAD_GENERATOR, __FILE__, __LINE__); return false; } - BIGNUM* bn_p = - BN_bin2bn(reinterpret_cast(p), p_len, nullptr); - if (!DH_set0_pqg(dh_.get(), bn_p, nullptr, bn_g)) { - BN_free(bn_p); - BN_free(bn_g); + BignumPointer bn_p( + BN_bin2bn(reinterpret_cast(p), p_len, nullptr)); + if (!DH_set0_pqg(dh_.get(), bn_p.get(), nullptr, bn_g.get())) { return false; } + // The DH_set0_pqg call above takes ownership of the bignums on success, + // so we should release them here so we don't end with a possible + // use-after-free or double free. + bn_p.release(); + bn_g.release(); return VerifyContext(); } diff --git a/src/crypto/crypto_keys.cc b/src/crypto/crypto_keys.cc index 8d2774ff61a64c..c5dd2fb8fce40f 100644 --- a/src/crypto/crypto_keys.cc +++ b/src/crypto/crypto_keys.cc @@ -907,6 +907,8 @@ v8::Local KeyObjectHandle::Initialize(Environment* env) { isolate, templ, "getSymmetricKeySize", GetSymmetricKeySize); SetProtoMethodNoSideEffect( isolate, templ, "getAsymmetricKeyType", GetAsymmetricKeyType); + SetProtoMethodNoSideEffect( + isolate, templ, "checkEcKeyData", CheckEcKeyData); SetProtoMethod(isolate, templ, "export", Export); SetProtoMethod(isolate, templ, "exportJwk", ExportJWK); SetProtoMethod(isolate, templ, "initECRaw", InitECRaw); @@ -926,6 +928,7 @@ void KeyObjectHandle::RegisterExternalReferences( registry->Register(Init); registry->Register(GetSymmetricKeySize); registry->Register(GetAsymmetricKeyType); + registry->Register(CheckEcKeyData); registry->Register(Export); registry->Register(ExportJWK); registry->Register(InitECRaw); @@ -1237,6 +1240,34 @@ void KeyObjectHandle::GetAsymmetricKeyType( args.GetReturnValue().Set(key->GetAsymmetricKeyType()); } +bool KeyObjectHandle::CheckEcKeyData() const { + MarkPopErrorOnReturn mark_pop_error_on_return; + + const ManagedEVPPKey& key = data_->GetAsymmetricKey(); + KeyType type = data_->GetKeyType(); + CHECK_NE(type, kKeyTypeSecret); + EVPKeyCtxPointer ctx(EVP_PKEY_CTX_new(key.get(), nullptr)); + CHECK(ctx); + CHECK_EQ(EVP_PKEY_id(key.get()), EVP_PKEY_EC); + + if (type == kKeyTypePrivate) { + return EVP_PKEY_check(ctx.get()) == 1; + } + +#if OPENSSL_VERSION_MAJOR >= 3 + return EVP_PKEY_public_check_quick(ctx.get()) == 1; +#else + return EVP_PKEY_public_check(ctx.get()) == 1; +#endif +} + +void KeyObjectHandle::CheckEcKeyData(const FunctionCallbackInfo& args) { + KeyObjectHandle* key; + ASSIGN_OR_RETURN_UNWRAP(&key, args.Holder()); + + args.GetReturnValue().Set(key->CheckEcKeyData()); +} + void KeyObjectHandle::GetSymmetricKeySize( const FunctionCallbackInfo& args) { KeyObjectHandle* key; diff --git a/src/crypto/crypto_keys.h b/src/crypto/crypto_keys.h index eb4f5222670e89..820d26cc153177 100644 --- a/src/crypto/crypto_keys.h +++ b/src/crypto/crypto_keys.h @@ -193,6 +193,9 @@ class KeyObjectHandle : public BaseObject { const v8::FunctionCallbackInfo& args); v8::Local GetAsymmetricKeyType() const; + static void CheckEcKeyData(const v8::FunctionCallbackInfo& args); + bool CheckEcKeyData() const; + static void GetSymmetricKeySize( const v8::FunctionCallbackInfo& args); diff --git a/src/crypto/crypto_random.cc b/src/crypto/crypto_random.cc index 245f3529186964..48154df7dc91ed 100644 --- a/src/crypto/crypto_random.cc +++ b/src/crypto/crypto_random.cc @@ -75,10 +75,10 @@ Maybe RandomPrimeTraits::EncodeOutput( size_t size = BN_num_bytes(params.prime.get()); std::shared_ptr store = ArrayBuffer::NewBackingStore(env->isolate(), size); - BN_bn2binpad( - params.prime.get(), - reinterpret_cast(store->Data()), - size); + CHECK_EQ(static_cast(size), + BN_bn2binpad(params.prime.get(), + reinterpret_cast(store->Data()), + size)); *result = ArrayBuffer::New(env->isolate(), store); return Just(true); } diff --git a/src/crypto/crypto_util.h b/src/crypto/crypto_util.h index 1ce5f35a70a7c8..ac231f59907918 100644 --- a/src/crypto/crypto_util.h +++ b/src/crypto/crypto_util.h @@ -65,7 +65,7 @@ using EVPKeyCtxPointer = DeleteFnPtr; using EVPMDPointer = DeleteFnPtr; using RSAPointer = DeleteFnPtr; using ECPointer = DeleteFnPtr; -using BignumPointer = DeleteFnPtr; +using BignumPointer = DeleteFnPtr; using BignumCtxPointer = DeleteFnPtr; using NetscapeSPKIPointer = DeleteFnPtr; using ECGroupPointer = DeleteFnPtr; diff --git a/src/dataqueue/queue.cc b/src/dataqueue/queue.cc index 994b82a8751f6e..c3de4eb570beab 100644 --- a/src/dataqueue/queue.cc +++ b/src/dataqueue/queue.cc @@ -162,6 +162,27 @@ class DataQueueImpl final : public DataQueue, "entries", entries_, "std::vector>"); } + void addBackpressureListener(BackpressureListener* listener) override { + if (idempotent_) return; + DCHECK_NOT_NULL(listener); + backpressure_listeners_.insert(listener); + } + + void removeBackpressureListener(BackpressureListener* listener) override { + if (idempotent_) return; + DCHECK_NOT_NULL(listener); + backpressure_listeners_.erase(listener); + } + + void NotifyBackpressure(size_t amount) { + if (idempotent_) return; + for (auto& listener : backpressure_listeners_) listener->EntryRead(amount); + } + + bool HasBackpressureListeners() const noexcept { + return !backpressure_listeners_.empty(); + } + std::shared_ptr get_reader() override; SET_MEMORY_INFO_NAME(DataQueue) SET_SELF_SIZE(DataQueueImpl) @@ -173,6 +194,8 @@ class DataQueueImpl final : public DataQueue, std::optional capped_size_ = std::nullopt; bool locked_to_reader_ = false; + std::unordered_set backpressure_listeners_; + friend class DataQueue; friend class IdempotentDataQueueReader; friend class NonIdempotentDataQueueReader; @@ -433,6 +456,17 @@ class NonIdempotentDataQueueReader final return; } + // If there is a backpressure listener, lets report on how much data + // was actually read. + if (data_queue_->HasBackpressureListeners()) { + // How much did we actually read? + size_t read = 0; + for (uint64_t n = 0; n < count; n++) { + read += vecs[n].len; + } + data_queue_->NotifyBackpressure(read); + } + // Now that we have updated this readers state, we can forward // everything on to the outer next. std::move(next)(status, vecs, count, std::move(done)); diff --git a/src/dataqueue/queue.h b/src/dataqueue/queue.h index 9bf34ffb6572aa..a37bd27549986e 100644 --- a/src/dataqueue/queue.h +++ b/src/dataqueue/queue.h @@ -141,6 +141,14 @@ class DataQueue : public MemoryRetainer { using Done = bob::Done; }; + // A BackpressureListener can be used to receive notifications + // when a non-idempotent DataQueue releases entries as they + // are consumed. + class BackpressureListener { + public: + virtual void EntryRead(size_t amount) = 0; + }; + // A DataQueue::Entry represents a logical chunk of data in the queue. // The entry may or may not represent memory-resident data. It may // or may not be consumable more than once. @@ -285,6 +293,10 @@ class DataQueue : public MemoryRetainer { // been set, maybeCapRemaining() will return std::nullopt. virtual std::optional maybeCapRemaining() const = 0; + // BackpressureListeners only work on non-idempotent DataQueues. + virtual void addBackpressureListener(BackpressureListener* listener) = 0; + virtual void removeBackpressureListener(BackpressureListener* listener) = 0; + static void Initialize(Environment* env, v8::Local target); static void RegisterExternalReferences(ExternalReferenceRegistry* registry); }; diff --git a/src/debug_utils.cc b/src/debug_utils.cc index fadf321c3d925f..d3436c62079e6a 100644 --- a/src/debug_utils.cc +++ b/src/debug_utils.cc @@ -59,6 +59,9 @@ namespace per_process { EnabledDebugList enabled_debug_list; } +using v8::Local; +using v8::StackTrace; + void EnabledDebugList::Parse(std::shared_ptr env_vars, v8::Isolate* isolate) { std::string cats; @@ -303,7 +306,8 @@ std::string NativeSymbolDebuggingContext::SymbolInfo::Display() const { return oss.str(); } -void DumpBacktrace(FILE* fp) { +void DumpNativeBacktrace(FILE* fp) { + fprintf(fp, "----- Native stack trace -----\n\n"); auto sym_ctx = NativeSymbolDebuggingContext::New(); void* frames[256]; const int size = sym_ctx->GetStackTrace(frames, arraysize(frames)); @@ -314,6 +318,22 @@ void DumpBacktrace(FILE* fp) { } } +void DumpJavaScriptBacktrace(FILE* fp) { + v8::Isolate* isolate = v8::Isolate::TryGetCurrent(); + if (isolate == nullptr) { + return; + } + + Local stack; + if (!GetCurrentStackTrace(isolate).ToLocal(&stack)) { + return; + } + + fprintf(fp, "\n----- JavaScript stack trace -----\n\n"); + PrintStackTrace(isolate, stack, StackTracePrefix::kNumber); + fprintf(fp, "\n"); +} + void CheckedUvLoopClose(uv_loop_t* loop) { if (uv_loop_close(loop) == 0) return; @@ -514,5 +534,6 @@ void FWrite(FILE* file, const std::string& str) { } // namespace node extern "C" void __DumpBacktrace(FILE* fp) { - node::DumpBacktrace(fp); + node::DumpNativeBacktrace(fp); + node::DumpJavaScriptBacktrace(fp); } diff --git a/src/env-inl.h b/src/env-inl.h index 793dc72e0dbad8..d5124e73e7c4c6 100644 --- a/src/env-inl.h +++ b/src/env-inl.h @@ -775,13 +775,18 @@ inline void Environment::ThrowRangeError(const char* errmsg) { ThrowError(v8::Exception::RangeError, errmsg); } -inline void Environment::ThrowError( - v8::Local (*fun)(v8::Local), - const char* errmsg) { +inline void Environment::ThrowError(V8ExceptionConstructorOld fun, + const char* errmsg) { v8::HandleScope handle_scope(isolate()); isolate()->ThrowException(fun(OneByteString(isolate(), errmsg))); } +inline void Environment::ThrowError(V8ExceptionConstructorNew fun, + const char* errmsg) { + v8::HandleScope handle_scope(isolate()); + isolate()->ThrowException(fun(OneByteString(isolate(), errmsg), {})); +} + inline void Environment::ThrowErrnoException(int errorno, const char* syscall, const char* message, diff --git a/src/env.cc b/src/env.cc index 1d8df40c3446ac..424f400b8f0f8f 100644 --- a/src/env.cc +++ b/src/env.cc @@ -30,6 +30,7 @@ #include #include #include +#include #include namespace node { @@ -55,6 +56,8 @@ using v8::Number; using v8::Object; using v8::ObjectTemplate; using v8::Private; +using v8::Promise; +using v8::PromiseHookType; using v8::Script; using v8::SnapshotCreator; using v8::StackTrace; @@ -62,6 +65,7 @@ using v8::String; using v8::Symbol; using v8::TracingController; using v8::TryCatch; +using v8::Uint32; using v8::Undefined; using v8::Value; using v8::WrapperDescriptor; @@ -285,6 +289,12 @@ std::ostream& operator<<(std::ostream& output, return output; } +std::ostream& operator<<(std::ostream& output, const SnapshotFlags& flags) { + output << "static_cast(" << static_cast(flags) + << ")"; + return output; +} + std::ostream& operator<<(std::ostream& output, const SnapshotMetadata& i) { output << "{\n" << " " @@ -296,6 +306,7 @@ std::ostream& operator<<(std::ostream& output, const SnapshotMetadata& i) { << " \"" << i.node_arch << "\", // node_arch\n" << " \"" << i.node_platform << "\", // node_platform\n" << " " << i.v8_cache_version_tag << ", // v8_cache_version_tag\n" + << " " << i.flags << ", // flags\n" << "}"; return output; } @@ -349,6 +360,8 @@ IsolateDataSerializeInfo IsolateData::Serialize(SnapshotCreator* creator) { void IsolateData::DeserializeProperties(const IsolateDataSerializeInfo* info) { size_t i = 0; + + v8::Isolate::Scope isolate_scope(isolate_); HandleScope handle_scope(isolate_); if (per_process::enabled_debug_list.enabled(DebugCategory::MKSNAPSHOT)) { @@ -431,6 +444,7 @@ void IsolateData::CreateProperties() { // One byte because our strings are ASCII and we can safely skip V8's UTF-8 // decoding step. + v8::Isolate::Scope isolate_scope(isolate_); HandleScope handle_scope(isolate_); #define V(PropertyName, StringValue) \ @@ -501,6 +515,7 @@ void IsolateData::CreateProperties() { binding::CreateInternalBindingTemplates(this); contextify::ContextifyContext::InitializeGlobalTemplates(this); + CreateEnvProxyTemplate(this); } constexpr uint16_t kDefaultCppGCEmebdderID = 0x90de; @@ -802,8 +817,14 @@ Environment::Environment(IsolateData* isolate_data, isolate_data->worker_context()->env()->builtin_loader()); } else if (isolate_data->snapshot_data() != nullptr) { // ... otherwise, if a snapshot was provided, use its code cache. - builtin_loader()->RefreshCodeCache( - isolate_data->snapshot_data()->code_cache); + size_t cache_size = isolate_data->snapshot_data()->code_cache.size(); + per_process::Debug(DebugCategory::CODE_CACHE, + "snapshot contains %zu code cache\n", + cache_size); + if (cache_size > 0) { + builtin_loader()->RefreshCodeCache( + isolate_data->snapshot_data()->code_cache); + } } // We'll be creating new objects so make sure we've entered the context. @@ -873,23 +894,29 @@ Environment::Environment(IsolateData* isolate_data, // The process shouldn't be able to neither // spawn/worker nor use addons or enable inspector // unless explicitly allowed by the user - options_->allow_native_addons = false; + if (!options_->allow_addons) { + options_->allow_native_addons = false; + } flags_ = flags_ | EnvironmentFlags::kNoCreateInspector; - permission()->Apply({"*"}, permission::PermissionScope::kInspector); + permission()->Apply(this, {"*"}, permission::PermissionScope::kInspector); if (!options_->allow_child_process) { - permission()->Apply({"*"}, permission::PermissionScope::kChildProcess); + permission()->Apply( + this, {"*"}, permission::PermissionScope::kChildProcess); } if (!options_->allow_worker_threads) { - permission()->Apply({"*"}, permission::PermissionScope::kWorkerThreads); + permission()->Apply( + this, {"*"}, permission::PermissionScope::kWorkerThreads); } if (!options_->allow_fs_read.empty()) { - permission()->Apply(options_->allow_fs_read, + permission()->Apply(this, + options_->allow_fs_read, permission::PermissionScope::kFileSystemRead); } if (!options_->allow_fs_write.empty()) { - permission()->Apply(options_->allow_fs_write, + permission()->Apply(this, + options_->allow_fs_write, permission::PermissionScope::kFileSystemWrite); } } @@ -1650,10 +1677,13 @@ void AsyncHooks::MemoryInfo(MemoryTracker* tracker) const { void AsyncHooks::grow_async_ids_stack() { async_ids_stack_.reserve(async_ids_stack_.Length() * 3); - env()->async_hooks_binding()->Set( - env()->context(), - env()->async_ids_stack_string(), - async_ids_stack_.GetJSArray()).Check(); + env() + ->principal_realm() + ->async_hooks_binding() + ->Set(env()->context(), + env()->async_ids_stack_string(), + async_ids_stack_.GetJSArray()) + .Check(); } void AsyncHooks::FailWithCorruptedAsyncStack(double expected_async_id) { @@ -1662,7 +1692,8 @@ void AsyncHooks::FailWithCorruptedAsyncStack(double expected_async_id) { "actual: %.f, expected: %.f)\n", async_id_fields_.GetValue(kExecutionAsyncId), expected_async_id); - DumpBacktrace(stderr); + DumpNativeBacktrace(stderr); + DumpJavaScriptBacktrace(stderr); fflush(stderr); // TODO(joyeecheung): should this exit code be more specific? if (!env()->abort_on_uncaught_exception()) Exit(ExitCode::kGenericUserError); @@ -1831,6 +1862,60 @@ void Environment::BuildEmbedderGraph(Isolate* isolate, tracker.Track(env); } +std::optional GetPromiseId(Environment* env, Local promise) { + Local id_val; + if (!promise->GetPrivate(env->context(), env->promise_trace_id()) + .ToLocal(&id_val) || + !id_val->IsUint32()) { + return std::nullopt; + } + return id_val.As()->Value(); +} + +void Environment::TracePromises(PromiseHookType type, + Local promise, + Local parent) { + // We don't care about the execution of promises, just the + // creation/resolution. + if (type == PromiseHookType::kBefore || type == PromiseHookType::kAfter) { + return; + } + Isolate* isolate = Isolate::GetCurrent(); + Local context = isolate->GetCurrentContext(); + Environment* env = Environment::GetCurrent(context); + if (env == nullptr) return; + + std::optional parent_id; + if (!parent.IsEmpty() && parent->IsPromise()) { + parent_id = GetPromiseId(env, parent.As()); + } + + uint32_t id = 0; + std::string action; + if (type == PromiseHookType::kInit) { + id = env->trace_promise_id_counter_++; + promise->SetPrivate( + context, env->promise_trace_id(), Uint32::New(isolate, id)); + action = "created"; + } else if (type == PromiseHookType::kResolve) { + auto opt = GetPromiseId(env, promise); + if (!opt.has_value()) return; + id = opt.value(); + action = "resolved"; + } else { + UNREACHABLE(); + } + + FPrintF(stderr, "[--trace-promises] "); + if (parent_id.has_value()) { + FPrintF(stderr, "promise #%d ", parent_id.value()); + } + FPrintF(stderr, "%s promise #%d\n", action, id); + // TODO(joyeecheung): we can dump the native stack trace too if the + // JS stack trace is empty i.e. it may be resolved on the native side. + PrintCurrentStackTrace(isolate); +} + size_t Environment::NearHeapLimitCallback(void* data, size_t current_heap_limit, size_t initial_heap_limit) { diff --git a/src/env.h b/src/env.h index afe67d2237ae69..9a2ac179101210 100644 --- a/src/env.h +++ b/src/env.h @@ -147,8 +147,15 @@ class NODE_EXTERN_PRIVATE IsolateData : public MemoryRetainer { void MemoryInfo(MemoryTracker* tracker) const override; IsolateDataSerializeInfo Serialize(v8::SnapshotCreator* creator); - bool is_building_snapshot() const { return is_building_snapshot_; } - void set_is_building_snapshot(bool value) { is_building_snapshot_ = value; } + bool is_building_snapshot() const { return snapshot_config_.has_value(); } + const SnapshotConfig* snapshot_config() const { + return snapshot_config_.has_value() ? &(snapshot_config_.value()) : nullptr; + } + void set_snapshot_config(const SnapshotConfig* config) { + if (config != nullptr) { + snapshot_config_ = *config; // Copy the config. + } + } uint16_t* embedder_id_for_cppgc() const; uint16_t* embedder_id_for_non_cppgc() const; @@ -237,11 +244,13 @@ class NODE_EXTERN_PRIVATE IsolateData : public MemoryRetainer { uv_loop_t* const event_loop_; NodeArrayBufferAllocator* const node_allocator_; MultiIsolatePlatform* platform_; + const SnapshotData* snapshot_data_; + std::optional snapshot_config_; + std::unique_ptr cpp_heap_; std::shared_ptr options_; worker::Worker* worker_context_ = nullptr; - bool is_building_snapshot_ = false; PerIsolateWrapperData* wrapper_data_; static Mutex isolate_data_mutex_; @@ -526,6 +535,7 @@ struct SnapshotMetadata { std::string node_platform; // Result of v8::ScriptCompiler::CachedDataVersionTag(). uint32_t v8_cache_version_tag; + SnapshotFlags flags; }; struct SnapshotData { @@ -934,6 +944,9 @@ class Environment : public MemoryRetainer { inline void RemoveCleanupHook(CleanupQueue::Callback cb, void* arg); void RunCleanup(); + static void TracePromises(v8::PromiseHookType type, + v8::Local promise, + v8::Local parent); static size_t NearHeapLimitCallback(void* data, size_t current_heap_limit, size_t initial_heap_limit); @@ -1016,8 +1029,14 @@ class Environment : public MemoryRetainer { }; private: - inline void ThrowError(v8::Local (*fun)(v8::Local), - const char* errmsg); + // V8 has changed the constructor of exceptions, support both APIs before Node + // updates to V8 12.1. + using V8ExceptionConstructorOld = + v8::Local (*)(v8::Local); + using V8ExceptionConstructorNew = + v8::Local (*)(v8::Local, v8::Local); + inline void ThrowError(V8ExceptionConstructorOld fun, const char* errmsg); + inline void ThrowError(V8ExceptionConstructorNew fun, const char* errmsg); void TrackContext(v8::Local context); void UntrackContext(v8::Local context); @@ -1088,6 +1107,7 @@ class Environment : public MemoryRetainer { uint32_t module_id_counter_ = 0; uint32_t script_id_counter_ = 0; uint32_t function_id_counter_ = 0; + uint32_t trace_promise_id_counter_ = 0; AliasedInt32Array exit_info_; diff --git a/src/env_properties.h b/src/env_properties.h index 93fa8afdca39d3..916dc4033fa833 100644 --- a/src/env_properties.h +++ b/src/env_properties.h @@ -28,6 +28,7 @@ V(napi_wrapper, "node:napi:wrapper") \ V(untransferable_object_private_symbol, "node:untransferableObject") \ V(exit_info_private_symbol, "node:exit_info_private_symbol") \ + V(promise_trace_id, "node:promise_trace_id") \ V(require_private_symbol, "node:require_private_symbol") // Symbols are per-isolate primitives but Environment proxies them @@ -46,7 +47,8 @@ V(owner_symbol, "owner_symbol") \ V(onpskexchange_symbol, "onpskexchange") \ V(resource_symbol, "resource_symbol") \ - V(trigger_async_id_symbol, "trigger_async_id_symbol") + V(trigger_async_id_symbol, "trigger_async_id_symbol") \ + V(vm_dynamic_import_missing_flag, "vm_dynamic_import_missing_flag") // Strings are per-isolate primitives but Environment proxies them // for the sake of convenience. Strings should be ASCII-only. diff --git a/src/heap_utils.cc b/src/heap_utils.cc index e385955a5d5fce..75f7e7e1bdc1b4 100644 --- a/src/heap_utils.cc +++ b/src/heap_utils.cc @@ -474,6 +474,39 @@ void TriggerHeapSnapshot(const FunctionCallbackInfo& args) { return args.GetReturnValue().Set(filename_v); } +class PrototypeChainHas : public v8::QueryObjectPredicate { + public: + PrototypeChainHas(Local context, Local search) + : context_(context), search_(search) {} + + // What we can do in the filter can be quite limited, but looking up + // the prototype chain is something that the inspector console API + // queryObject() does so it is supported. + bool Filter(Local object) override { + for (Local proto = object->GetPrototype(); proto->IsObject(); + proto = proto.As()->GetPrototype()) { + if (search_ == proto) return true; + } + return false; + } + + private: + Local context_; + Local search_; +}; + +void CountObjectsWithPrototype(const FunctionCallbackInfo& args) { + CHECK_EQ(args.Length(), 1); + CHECK(args[0]->IsObject()); + Local proto = args[0].As(); + Isolate* isolate = args.GetIsolate(); + Local context = isolate->GetCurrentContext(); + PrototypeChainHas prototype_chain_has(context, proto); + std::vector> out; + isolate->GetHeapProfiler()->QueryObjects(context, &prototype_chain_has, &out); + args.GetReturnValue().Set(static_cast(out.size())); +} + void Initialize(Local target, Local unused, Local context, @@ -482,12 +515,15 @@ void Initialize(Local target, SetMethod(context, target, "triggerHeapSnapshot", TriggerHeapSnapshot); SetMethod( context, target, "createHeapSnapshotStream", CreateHeapSnapshotStream); + SetMethod( + context, target, "countObjectsWithPrototype", CountObjectsWithPrototype); } void RegisterExternalReferences(ExternalReferenceRegistry* registry) { registry->Register(BuildEmbedderGraph); registry->Register(TriggerHeapSnapshot); registry->Register(CreateHeapSnapshotStream); + registry->Register(CountObjectsWithPrototype); } } // namespace heap diff --git a/src/histogram.cc b/src/histogram.cc index 3caa6e8248ce27..4f58359fe58529 100644 --- a/src/histogram.cc +++ b/src/histogram.cc @@ -4,10 +4,14 @@ #include "memory_tracker-inl.h" #include "node_errors.h" #include "node_external_reference.h" +#include "util.h" namespace node { using v8::BigInt; +using v8::CFunction; +using v8::Context; +using v8::FastApiCallbackOptions; using v8::FunctionCallbackInfo; using v8::FunctionTemplate; using v8::Integer; @@ -40,6 +44,97 @@ HistogramImpl::HistogramImpl(const Histogram::Options& options) HistogramImpl::HistogramImpl(std::shared_ptr histogram) : histogram_(std::move(histogram)) {} +CFunction HistogramImpl::fast_reset_( + CFunction::Make(&HistogramImpl::FastReset)); +CFunction HistogramImpl::fast_get_count_( + CFunction::Make(&HistogramImpl::FastGetCount)); +CFunction HistogramImpl::fast_get_min_( + CFunction::Make(&HistogramImpl::FastGetMin)); +CFunction HistogramImpl::fast_get_max_( + CFunction::Make(&HistogramImpl::FastGetMax)); +CFunction HistogramImpl::fast_get_mean_( + CFunction::Make(&HistogramImpl::FastGetMean)); +CFunction HistogramImpl::fast_get_exceeds_( + CFunction::Make(&HistogramImpl::FastGetExceeds)); +CFunction HistogramImpl::fast_get_stddev_( + CFunction::Make(&HistogramImpl::FastGetStddev)); +CFunction HistogramImpl::fast_get_percentile_( + CFunction::Make(&HistogramImpl::FastGetPercentile)); +CFunction HistogramBase::fast_record_( + CFunction::Make(&HistogramBase::FastRecord)); +CFunction HistogramBase::fast_record_delta_( + CFunction::Make(&HistogramBase::FastRecordDelta)); +CFunction IntervalHistogram::fast_start_( + CFunction::Make(&IntervalHistogram::FastStart)); +CFunction IntervalHistogram::fast_stop_( + CFunction::Make(&IntervalHistogram::FastStop)); + +void HistogramImpl::AddMethods(Isolate* isolate, Local tmpl) { + // TODO(@jasnell): The bigint API variations do not yet support fast + // variations since v8 will not return a bigint value from a fast method. + SetProtoMethodNoSideEffect(isolate, tmpl, "countBigInt", GetCountBigInt); + SetProtoMethodNoSideEffect(isolate, tmpl, "exceedsBigInt", GetExceedsBigInt); + SetProtoMethodNoSideEffect(isolate, tmpl, "minBigInt", GetMinBigInt); + SetProtoMethodNoSideEffect(isolate, tmpl, "maxBigInt", GetMaxBigInt); + SetProtoMethodNoSideEffect( + isolate, tmpl, "percentileBigInt", GetPercentileBigInt); + SetProtoMethodNoSideEffect(isolate, tmpl, "percentiles", GetPercentiles); + SetProtoMethodNoSideEffect( + isolate, tmpl, "percentilesBigInt", GetPercentilesBigInt); + auto instance = tmpl->InstanceTemplate(); + SetFastMethodNoSideEffect( + isolate, instance, "count", GetCount, &fast_get_count_); + SetFastMethodNoSideEffect( + isolate, instance, "exceeds", GetExceeds, &fast_get_exceeds_); + SetFastMethodNoSideEffect(isolate, instance, "min", GetMin, &fast_get_min_); + SetFastMethodNoSideEffect(isolate, instance, "max", GetMax, &fast_get_max_); + SetFastMethodNoSideEffect( + isolate, instance, "mean", GetMean, &fast_get_mean_); + SetFastMethodNoSideEffect( + isolate, instance, "stddev", GetStddev, &fast_get_stddev_); + SetFastMethodNoSideEffect( + isolate, instance, "percentile", GetPercentile, &fast_get_percentile_); + SetFastMethod(isolate, instance, "reset", DoReset, &fast_reset_); +} + +void HistogramImpl::RegisterExternalReferences( + ExternalReferenceRegistry* registry) { + static bool is_registerd = false; + if (is_registerd) return; + registry->Register(GetCount); + registry->Register(GetCountBigInt); + registry->Register(GetExceeds); + registry->Register(GetExceedsBigInt); + registry->Register(GetMin); + registry->Register(GetMinBigInt); + registry->Register(GetMax); + registry->Register(GetMaxBigInt); + registry->Register(GetMean); + registry->Register(GetStddev); + registry->Register(GetPercentile); + registry->Register(GetPercentileBigInt); + registry->Register(GetPercentiles); + registry->Register(GetPercentilesBigInt); + registry->Register(DoReset); + registry->Register(fast_reset_.GetTypeInfo()); + registry->Register(fast_get_count_.GetTypeInfo()); + registry->Register(fast_get_min_.GetTypeInfo()); + registry->Register(fast_get_max_.GetTypeInfo()); + registry->Register(fast_get_mean_.GetTypeInfo()); + registry->Register(fast_get_exceeds_.GetTypeInfo()); + registry->Register(fast_get_stddev_.GetTypeInfo()); + registry->Register(fast_get_percentile_.GetTypeInfo()); + registry->Register(FastReset); + registry->Register(FastGetCount); + registry->Register(FastGetMin); + registry->Register(FastGetMax); + registry->Register(FastGetMean); + registry->Register(FastGetExceeds); + registry->Register(FastGetStddev); + registry->Register(FastGetPercentile); + is_registerd = true; +} + HistogramBase::HistogramBase( Environment* env, Local wrap, @@ -47,6 +142,9 @@ HistogramBase::HistogramBase( : BaseObject(env, wrap), HistogramImpl(options) { MakeWeak(); + wrap->SetAlignedPointerInInternalField( + HistogramImpl::InternalFields::kImplField, + static_cast(this)); } HistogramBase::HistogramBase( @@ -56,142 +154,24 @@ HistogramBase::HistogramBase( : BaseObject(env, wrap), HistogramImpl(std::move(histogram)) { MakeWeak(); + wrap->SetAlignedPointerInInternalField( + HistogramImpl::InternalFields::kImplField, + static_cast(this)); } void HistogramBase::MemoryInfo(MemoryTracker* tracker) const { tracker->TrackField("histogram", histogram()); } -void HistogramBase::GetCount(const v8::FunctionCallbackInfo& args) { - HistogramBase* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); - double value = static_cast((*histogram)->Count()); - args.GetReturnValue().Set(value); -} - -void HistogramBase::GetCountBigInt( - const v8::FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); - HistogramBase* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); - args.GetReturnValue().Set( - BigInt::NewFromUnsigned(env->isolate(), (*histogram)->Count())); -} - -void HistogramBase::GetMin(const FunctionCallbackInfo& args) { - HistogramBase* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); - double value = static_cast((*histogram)->Min()); - args.GetReturnValue().Set(value); -} - -void HistogramBase::GetMinBigInt(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); - HistogramBase* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); - args.GetReturnValue().Set(BigInt::New(env->isolate(), (*histogram)->Min())); -} - -void HistogramBase::GetMax(const FunctionCallbackInfo& args) { - HistogramBase* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); - double value = static_cast((*histogram)->Max()); - args.GetReturnValue().Set(value); -} - -void HistogramBase::GetMaxBigInt(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); - HistogramBase* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); - args.GetReturnValue().Set( - BigInt::New(env->isolate(), (*histogram)->Max())); -} - -void HistogramBase::GetMean(const FunctionCallbackInfo& args) { - HistogramBase* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); - args.GetReturnValue().Set((*histogram)->Mean()); -} - -void HistogramBase::GetExceeds(const FunctionCallbackInfo& args) { - HistogramBase* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); - double value = static_cast((*histogram)->Exceeds()); - args.GetReturnValue().Set(value); -} - -void HistogramBase::GetExceedsBigInt(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); - HistogramBase* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); - args.GetReturnValue().Set( - BigInt::NewFromUnsigned(env->isolate(), (*histogram)->Exceeds())); -} - -void HistogramBase::GetStddev(const FunctionCallbackInfo& args) { - HistogramBase* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); - args.GetReturnValue().Set((*histogram)->Stddev()); -} - -void HistogramBase::GetPercentile(const FunctionCallbackInfo& args) { - HistogramBase* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); - CHECK(args[0]->IsNumber()); - double percentile = args[0].As()->Value(); - double value = static_cast((*histogram)->Percentile(percentile)); - args.GetReturnValue().Set(value); -} - -void HistogramBase::GetPercentileBigInt( - const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); - HistogramBase* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); - CHECK(args[0]->IsNumber()); - double percentile = args[0].As()->Value(); - int64_t value = (*histogram)->Percentile(percentile); - args.GetReturnValue().Set(BigInt::New(env->isolate(), value)); -} - -void HistogramBase::GetPercentiles(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); - HistogramBase* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); - CHECK(args[0]->IsMap()); - Local map = args[0].As(); - (*histogram)->Percentiles([map, env](double key, int64_t value) { - USE(map->Set( - env->context(), - Number::New(env->isolate(), key), - Number::New(env->isolate(), static_cast(value)))); - }); -} - -void HistogramBase::GetPercentilesBigInt( - const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); - HistogramBase* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); - CHECK(args[0]->IsMap()); - Local map = args[0].As(); - (*histogram)->Percentiles([map, env](double key, int64_t value) { - USE(map->Set( - env->context(), - Number::New(env->isolate(), key), - BigInt::New(env->isolate(), value))); - }); -} - -void HistogramBase::DoReset(const FunctionCallbackInfo& args) { +void HistogramBase::RecordDelta(const FunctionCallbackInfo& args) { HistogramBase* histogram; ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); - (*histogram)->Reset(); + (*histogram)->RecordDelta(); } -void HistogramBase::RecordDelta(const FunctionCallbackInfo& args) { +void HistogramBase::FastRecordDelta(Local receiver) { HistogramBase* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); + ASSIGN_OR_RETURN_UNWRAP(&histogram, receiver); (*histogram)->RecordDelta(); } @@ -209,6 +189,18 @@ void HistogramBase::Record(const FunctionCallbackInfo& args) { (*histogram)->Record(value); } +void HistogramBase::FastRecord(Local receiver, + const int64_t value, + FastApiCallbackOptions& options) { + if (value < 1) { + options.fallback = true; + return; + } + HistogramBase* histogram; + ASSIGN_OR_RETURN_UNWRAP(&histogram, receiver); + (*histogram)->Record(value); +} + void HistogramBase::Add(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); HistogramBase* histogram; @@ -288,30 +280,13 @@ Local HistogramBase::GetConstructorTemplate( tmpl = NewFunctionTemplate(isolate, New); Local classname = FIXED_ONE_BYTE_STRING(isolate, "Histogram"); tmpl->SetClassName(classname); - - tmpl->InstanceTemplate()->SetInternalFieldCount( - HistogramBase::kInternalFieldCount); - SetProtoMethodNoSideEffect(isolate, tmpl, "count", GetCount); - SetProtoMethodNoSideEffect(isolate, tmpl, "countBigInt", GetCountBigInt); - SetProtoMethodNoSideEffect(isolate, tmpl, "exceeds", GetExceeds); - SetProtoMethodNoSideEffect( - isolate, tmpl, "exceedsBigInt", GetExceedsBigInt); - SetProtoMethodNoSideEffect(isolate, tmpl, "min", GetMin); - SetProtoMethodNoSideEffect(isolate, tmpl, "minBigInt", GetMinBigInt); - SetProtoMethodNoSideEffect(isolate, tmpl, "max", GetMax); - SetProtoMethodNoSideEffect(isolate, tmpl, "maxBigInt", GetMaxBigInt); - SetProtoMethodNoSideEffect(isolate, tmpl, "mean", GetMean); - SetProtoMethodNoSideEffect(isolate, tmpl, "stddev", GetStddev); - SetProtoMethodNoSideEffect(isolate, tmpl, "percentile", GetPercentile); - SetProtoMethodNoSideEffect( - isolate, tmpl, "percentileBigInt", GetPercentileBigInt); - SetProtoMethodNoSideEffect(isolate, tmpl, "percentiles", GetPercentiles); - SetProtoMethodNoSideEffect( - isolate, tmpl, "percentilesBigInt", GetPercentilesBigInt); - SetProtoMethod(isolate, tmpl, "reset", DoReset); - SetProtoMethod(isolate, tmpl, "record", Record); - SetProtoMethod(isolate, tmpl, "recordDelta", RecordDelta); + auto instance = tmpl->InstanceTemplate(); + instance->SetInternalFieldCount(HistogramImpl::kInternalFieldCount); + SetFastMethod(isolate, instance, "record", Record, &fast_record_); + SetFastMethod( + isolate, instance, "recordDelta", RecordDelta, &fast_record_delta_); SetProtoMethod(isolate, tmpl, "add", Add); + HistogramImpl::AddMethods(isolate, tmpl); isolate_data->set_histogram_ctor_template(tmpl); } return tmpl; @@ -320,24 +295,14 @@ Local HistogramBase::GetConstructorTemplate( void HistogramBase::RegisterExternalReferences( ExternalReferenceRegistry* registry) { registry->Register(New); - registry->Register(GetCount); - registry->Register(GetCountBigInt); - registry->Register(GetExceeds); - registry->Register(GetExceedsBigInt); - registry->Register(GetMin); - registry->Register(GetMinBigInt); - registry->Register(GetMax); - registry->Register(GetMaxBigInt); - registry->Register(GetMean); - registry->Register(GetStddev); - registry->Register(GetPercentile); - registry->Register(GetPercentileBigInt); - registry->Register(GetPercentiles); - registry->Register(GetPercentilesBigInt); - registry->Register(DoReset); + registry->Register(Add); registry->Register(Record); registry->Register(RecordDelta); - registry->Register(Add); + registry->Register(fast_record_.GetTypeInfo()); + registry->Register(fast_record_delta_.GetTypeInfo()); + registry->Register(FastRecord); + registry->Register(FastRecordDelta); + HistogramImpl::RegisterExternalReferences(registry); } void HistogramBase::Initialize(IsolateData* isolate_data, @@ -351,7 +316,7 @@ void HistogramBase::Initialize(IsolateData* isolate_data, BaseObjectPtr HistogramBase::HistogramTransferData::Deserialize( Environment* env, - v8::Local context, + Local context, std::unique_ptr self) { return Create(env, std::move(histogram_)); } @@ -373,28 +338,11 @@ Local IntervalHistogram::GetConstructorTemplate( tmpl = NewFunctionTemplate(isolate, nullptr); tmpl->Inherit(HandleWrap::GetConstructorTemplate(env)); tmpl->SetClassName(OneByteString(isolate, "Histogram")); - tmpl->InstanceTemplate()->SetInternalFieldCount( - HistogramBase::kInternalFieldCount); - SetProtoMethodNoSideEffect(isolate, tmpl, "count", GetCount); - SetProtoMethodNoSideEffect(isolate, tmpl, "countBigInt", GetCountBigInt); - SetProtoMethodNoSideEffect(isolate, tmpl, "exceeds", GetExceeds); - SetProtoMethodNoSideEffect( - isolate, tmpl, "exceedsBigInt", GetExceedsBigInt); - SetProtoMethodNoSideEffect(isolate, tmpl, "min", GetMin); - SetProtoMethodNoSideEffect(isolate, tmpl, "minBigInt", GetMinBigInt); - SetProtoMethodNoSideEffect(isolate, tmpl, "max", GetMax); - SetProtoMethodNoSideEffect(isolate, tmpl, "maxBigInt", GetMaxBigInt); - SetProtoMethodNoSideEffect(isolate, tmpl, "mean", GetMean); - SetProtoMethodNoSideEffect(isolate, tmpl, "stddev", GetStddev); - SetProtoMethodNoSideEffect(isolate, tmpl, "percentile", GetPercentile); - SetProtoMethodNoSideEffect( - isolate, tmpl, "percentileBigInt", GetPercentileBigInt); - SetProtoMethodNoSideEffect(isolate, tmpl, "percentiles", GetPercentiles); - SetProtoMethodNoSideEffect( - isolate, tmpl, "percentilesBigInt", GetPercentilesBigInt); - SetProtoMethod(isolate, tmpl, "reset", DoReset); - SetProtoMethod(isolate, tmpl, "start", Start); - SetProtoMethod(isolate, tmpl, "stop", Stop); + auto instance = tmpl->InstanceTemplate(); + instance->SetInternalFieldCount(HistogramImpl::kInternalFieldCount); + HistogramImpl::AddMethods(isolate, tmpl); + SetFastMethod(isolate, instance, "start", Start, &fast_start_); + SetFastMethod(isolate, instance, "stop", Stop, &fast_stop_); env->set_intervalhistogram_constructor_template(tmpl); } return tmpl; @@ -402,23 +350,13 @@ Local IntervalHistogram::GetConstructorTemplate( void IntervalHistogram::RegisterExternalReferences( ExternalReferenceRegistry* registry) { - registry->Register(GetCount); - registry->Register(GetCountBigInt); - registry->Register(GetExceeds); - registry->Register(GetExceedsBigInt); - registry->Register(GetMin); - registry->Register(GetMinBigInt); - registry->Register(GetMax); - registry->Register(GetMaxBigInt); - registry->Register(GetMean); - registry->Register(GetStddev); - registry->Register(GetPercentile); - registry->Register(GetPercentileBigInt); - registry->Register(GetPercentiles); - registry->Register(GetPercentilesBigInt); - registry->Register(DoReset); registry->Register(Start); registry->Register(Stop); + registry->Register(fast_start_.GetTypeInfo()); + registry->Register(fast_stop_.GetTypeInfo()); + registry->Register(FastStart); + registry->Register(FastStop); + HistogramImpl::RegisterExternalReferences(registry); } IntervalHistogram::IntervalHistogram( @@ -437,6 +375,9 @@ IntervalHistogram::IntervalHistogram( interval_(interval), on_interval_(std::move(on_interval)) { MakeWeak(); + wrap->SetAlignedPointerInInternalField( + HistogramImpl::InternalFields::kImplField, + static_cast(this)); uv_timer_init(env->event_loop(), &timer_); } @@ -495,109 +436,105 @@ void IntervalHistogram::Start(const FunctionCallbackInfo& args) { histogram->OnStart(args[0]->IsTrue() ? StartFlags::RESET : StartFlags::NONE); } +void IntervalHistogram::FastStart(Local receiver, bool reset) { + IntervalHistogram* histogram; + ASSIGN_OR_RETURN_UNWRAP(&histogram, receiver); + histogram->OnStart(reset ? StartFlags::RESET : StartFlags::NONE); +} + void IntervalHistogram::Stop(const FunctionCallbackInfo& args) { IntervalHistogram* histogram; ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); histogram->OnStop(); } -void IntervalHistogram::GetCount(const FunctionCallbackInfo& args) { +void IntervalHistogram::FastStop(Local receiver) { IntervalHistogram* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); + ASSIGN_OR_RETURN_UNWRAP(&histogram, receiver); + histogram->OnStop(); +} + +void HistogramImpl::GetCount(const FunctionCallbackInfo& args) { + HistogramImpl* histogram = HistogramImpl::FromJSObject(args.Holder()); double value = static_cast((*histogram)->Count()); args.GetReturnValue().Set(value); } -void IntervalHistogram::GetCountBigInt( - const v8::FunctionCallbackInfo& args) { +void HistogramImpl::GetCountBigInt(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); - IntervalHistogram* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); + HistogramImpl* histogram = HistogramImpl::FromJSObject(args.Holder()); args.GetReturnValue().Set( BigInt::NewFromUnsigned(env->isolate(), (*histogram)->Count())); } -void IntervalHistogram::GetMin(const FunctionCallbackInfo& args) { - IntervalHistogram* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); +void HistogramImpl::GetMin(const FunctionCallbackInfo& args) { + HistogramImpl* histogram = HistogramImpl::FromJSObject(args.Holder()); double value = static_cast((*histogram)->Min()); args.GetReturnValue().Set(value); } -void IntervalHistogram::GetMinBigInt(const FunctionCallbackInfo& args) { +void HistogramImpl::GetMinBigInt(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); - IntervalHistogram* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); + HistogramImpl* histogram = HistogramImpl::FromJSObject(args.Holder()); args.GetReturnValue().Set(BigInt::New(env->isolate(), (*histogram)->Min())); } -void IntervalHistogram::GetMax(const FunctionCallbackInfo& args) { - IntervalHistogram* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); +void HistogramImpl::GetMax(const FunctionCallbackInfo& args) { + HistogramImpl* histogram = HistogramImpl::FromJSObject(args.Holder()); double value = static_cast((*histogram)->Max()); args.GetReturnValue().Set(value); } -void IntervalHistogram::GetMaxBigInt(const FunctionCallbackInfo& args) { +void HistogramImpl::GetMaxBigInt(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); - IntervalHistogram* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); - args.GetReturnValue().Set(BigInt::New(env->isolate(), (*histogram)->Min())); + HistogramImpl* histogram = HistogramImpl::FromJSObject(args.Holder()); + args.GetReturnValue().Set(BigInt::New(env->isolate(), (*histogram)->Max())); } -void IntervalHistogram::GetMean(const FunctionCallbackInfo& args) { - IntervalHistogram* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); +void HistogramImpl::GetMean(const FunctionCallbackInfo& args) { + HistogramImpl* histogram = HistogramImpl::FromJSObject(args.Holder()); args.GetReturnValue().Set((*histogram)->Mean()); } -void IntervalHistogram::GetExceeds(const FunctionCallbackInfo& args) { - IntervalHistogram* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); +void HistogramImpl::GetExceeds(const FunctionCallbackInfo& args) { + HistogramImpl* histogram = HistogramImpl::FromJSObject(args.Holder()); double value = static_cast((*histogram)->Exceeds()); args.GetReturnValue().Set(value); } -void IntervalHistogram::GetExceedsBigInt( - const FunctionCallbackInfo& args) { +void HistogramImpl::GetExceedsBigInt(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); - IntervalHistogram* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); + HistogramImpl* histogram = HistogramImpl::FromJSObject(args.Holder()); args.GetReturnValue().Set( BigInt::New(env->isolate(), (*histogram)->Exceeds())); } -void IntervalHistogram::GetStddev(const FunctionCallbackInfo& args) { - IntervalHistogram* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); +void HistogramImpl::GetStddev(const FunctionCallbackInfo& args) { + HistogramImpl* histogram = HistogramImpl::FromJSObject(args.Holder()); args.GetReturnValue().Set((*histogram)->Stddev()); } -void IntervalHistogram::GetPercentile(const FunctionCallbackInfo& args) { - IntervalHistogram* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); +void HistogramImpl::GetPercentile(const FunctionCallbackInfo& args) { + HistogramImpl* histogram = HistogramImpl::FromJSObject(args.Holder()); CHECK(args[0]->IsNumber()); double percentile = args[0].As()->Value(); double value = static_cast((*histogram)->Percentile(percentile)); args.GetReturnValue().Set(value); } -void IntervalHistogram::GetPercentileBigInt( +void HistogramImpl::GetPercentileBigInt( const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); - IntervalHistogram* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); + HistogramImpl* histogram = HistogramImpl::FromJSObject(args.Holder()); CHECK(args[0]->IsNumber()); double percentile = args[0].As()->Value(); int64_t value = (*histogram)->Percentile(percentile); args.GetReturnValue().Set(BigInt::New(env->isolate(), value)); } -void IntervalHistogram::GetPercentiles( - const FunctionCallbackInfo& args) { +void HistogramImpl::GetPercentiles(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); - IntervalHistogram* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); + HistogramImpl* histogram = HistogramImpl::FromJSObject(args.Holder()); CHECK(args[0]->IsMap()); Local map = args[0].As(); (*histogram)->Percentiles([map, env](double key, int64_t value) { @@ -608,11 +545,10 @@ void IntervalHistogram::GetPercentiles( }); } -void IntervalHistogram::GetPercentilesBigInt( +void HistogramImpl::GetPercentilesBigInt( const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); - IntervalHistogram* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); + HistogramImpl* histogram = HistogramImpl::FromJSObject(args.Holder()); CHECK(args[0]->IsMap()); Local map = args[0].As(); (*histogram)->Percentiles([map, env](double key, int64_t value) { @@ -623,12 +559,59 @@ void IntervalHistogram::GetPercentilesBigInt( }); } -void IntervalHistogram::DoReset(const FunctionCallbackInfo& args) { - IntervalHistogram* histogram; - ASSIGN_OR_RETURN_UNWRAP(&histogram, args.Holder()); +void HistogramImpl::DoReset(const FunctionCallbackInfo& args) { + HistogramImpl* histogram = HistogramImpl::FromJSObject(args.Holder()); + (*histogram)->Reset(); +} + +void HistogramImpl::FastReset(Local receiver) { + HistogramImpl* histogram = HistogramImpl::FromJSObject(receiver); (*histogram)->Reset(); } +double HistogramImpl::FastGetCount(Local receiver) { + HistogramImpl* histogram = HistogramImpl::FromJSObject(receiver); + return static_cast((*histogram)->Count()); +} + +double HistogramImpl::FastGetMin(Local receiver) { + HistogramImpl* histogram = HistogramImpl::FromJSObject(receiver); + return static_cast((*histogram)->Min()); +} + +double HistogramImpl::FastGetMax(Local receiver) { + HistogramImpl* histogram = HistogramImpl::FromJSObject(receiver); + return static_cast((*histogram)->Max()); +} + +double HistogramImpl::FastGetMean(Local receiver) { + HistogramImpl* histogram = HistogramImpl::FromJSObject(receiver); + return (*histogram)->Mean(); +} + +double HistogramImpl::FastGetExceeds(Local receiver) { + HistogramImpl* histogram = HistogramImpl::FromJSObject(receiver); + return static_cast((*histogram)->Exceeds()); +} + +double HistogramImpl::FastGetStddev(Local receiver) { + HistogramImpl* histogram = HistogramImpl::FromJSObject(receiver); + return (*histogram)->Stddev(); +} + +double HistogramImpl::FastGetPercentile(Local receiver, + const double percentile) { + HistogramImpl* histogram = HistogramImpl::FromJSObject(receiver); + return static_cast((*histogram)->Percentile(percentile)); +} + +HistogramImpl* HistogramImpl::FromJSObject(Local value) { + auto obj = value.As(); + DCHECK_GE(obj->InternalFieldCount(), HistogramImpl::kInternalFieldCount); + return static_cast( + obj->GetAlignedPointerFromInternalField(HistogramImpl::kImplField)); +} + std::unique_ptr IntervalHistogram::CloneForMessaging() const { return std::make_unique(histogram()); diff --git a/src/histogram.h b/src/histogram.h index a637c1a2e4e348..c3d8fe5f207274 100644 --- a/src/histogram.h +++ b/src/histogram.h @@ -69,6 +69,12 @@ class Histogram : public MemoryRetainer { class HistogramImpl { public: + enum InternalFields { + kSlot = BaseObject::kSlot, + kImplField = BaseObject::kInternalFieldCount, + kInternalFieldCount + }; + explicit HistogramImpl( const Histogram::Options& options = Histogram::Options {}); explicit HistogramImpl(std::shared_ptr histogram); @@ -77,11 +83,55 @@ class HistogramImpl { const std::shared_ptr& histogram() const { return histogram_; } + static void DoReset(const v8::FunctionCallbackInfo& args); + static void GetCountBigInt(const v8::FunctionCallbackInfo& args); + static void GetMinBigInt(const v8::FunctionCallbackInfo& args); + static void GetMaxBigInt(const v8::FunctionCallbackInfo& args); + static void GetExceedsBigInt(const v8::FunctionCallbackInfo& args); + static void GetCount(const v8::FunctionCallbackInfo& args); + static void GetMin(const v8::FunctionCallbackInfo& args); + static void GetMax(const v8::FunctionCallbackInfo& args); + static void GetMean(const v8::FunctionCallbackInfo& args); + static void GetExceeds(const v8::FunctionCallbackInfo& args); + static void GetStddev(const v8::FunctionCallbackInfo& args); + static void GetPercentile(const v8::FunctionCallbackInfo& args); + static void GetPercentileBigInt( + const v8::FunctionCallbackInfo& args); + static void GetPercentiles(const v8::FunctionCallbackInfo& args); + static void GetPercentilesBigInt( + const v8::FunctionCallbackInfo& args); + + static void FastReset(v8::Local receiver); + static double FastGetCount(v8::Local receiver); + static double FastGetMin(v8::Local receiver); + static double FastGetMax(v8::Local receiver); + static double FastGetMean(v8::Local receiver); + static double FastGetExceeds(v8::Local receiver); + static double FastGetStddev(v8::Local receiver); + static double FastGetPercentile(v8::Local receiver, + const double percentile); + + static void AddMethods(v8::Isolate* isolate, + v8::Local tmpl); + + static void RegisterExternalReferences(ExternalReferenceRegistry* registry); + + static HistogramImpl* FromJSObject(v8::Local value); + private: std::shared_ptr histogram_; + + static v8::CFunction fast_reset_; + static v8::CFunction fast_get_count_; + static v8::CFunction fast_get_min_; + static v8::CFunction fast_get_max_; + static v8::CFunction fast_get_mean_; + static v8::CFunction fast_get_exceeds_; + static v8::CFunction fast_get_stddev_; + static v8::CFunction fast_get_percentile_; }; -class HistogramBase : public BaseObject, public HistogramImpl { +class HistogramBase final : public BaseObject, public HistogramImpl { public: static v8::Local GetConstructorTemplate( IsolateData* isolate_data); @@ -103,30 +153,16 @@ class HistogramBase : public BaseObject, public HistogramImpl { SET_MEMORY_INFO_NAME(HistogramBase) SET_SELF_SIZE(HistogramBase) - static void GetCountBigInt(const v8::FunctionCallbackInfo& args); - static void GetMinBigInt(const v8::FunctionCallbackInfo& args); - static void GetMaxBigInt(const v8::FunctionCallbackInfo& args); - static void GetExceedsBigInt(const v8::FunctionCallbackInfo& args); - - static void GetCount(const v8::FunctionCallbackInfo& args); - static void GetMin(const v8::FunctionCallbackInfo& args); - static void GetMax(const v8::FunctionCallbackInfo& args); - static void GetMean(const v8::FunctionCallbackInfo& args); - static void GetExceeds(const v8::FunctionCallbackInfo& args); - static void GetStddev(const v8::FunctionCallbackInfo& args); - static void GetPercentile( - const v8::FunctionCallbackInfo& args); - static void GetPercentileBigInt( - const v8::FunctionCallbackInfo& args); - static void GetPercentiles( - const v8::FunctionCallbackInfo& args); - static void GetPercentilesBigInt( - const v8::FunctionCallbackInfo& args); - static void DoReset(const v8::FunctionCallbackInfo& args); static void Record(const v8::FunctionCallbackInfo& args); static void RecordDelta(const v8::FunctionCallbackInfo& args); static void Add(const v8::FunctionCallbackInfo& args); + static void FastRecord( + v8::Local receiver, + const int64_t value, + v8::FastApiCallbackOptions& options); // NOLINT(runtime/references) + static void FastRecordDelta(v8::Local receiver); + HistogramBase( Environment* env, v8::Local wrap, @@ -162,9 +198,13 @@ class HistogramBase : public BaseObject, public HistogramImpl { private: std::shared_ptr histogram_; }; + + private: + static v8::CFunction fast_record_; + static v8::CFunction fast_record_delta_; }; -class IntervalHistogram : public HandleWrap, public HistogramImpl { +class IntervalHistogram final : public HandleWrap, public HistogramImpl { public: enum class StartFlags { NONE, @@ -190,29 +230,12 @@ class IntervalHistogram : public HandleWrap, public HistogramImpl { std::function on_interval, const Histogram::Options& options = Histogram::Options {}); - static void GetCountBigInt(const v8::FunctionCallbackInfo& args); - static void GetMinBigInt(const v8::FunctionCallbackInfo& args); - static void GetMaxBigInt(const v8::FunctionCallbackInfo& args); - static void GetExceedsBigInt(const v8::FunctionCallbackInfo& args); - - static void GetCount(const v8::FunctionCallbackInfo& args); - static void GetMin(const v8::FunctionCallbackInfo& args); - static void GetMax(const v8::FunctionCallbackInfo& args); - static void GetMean(const v8::FunctionCallbackInfo& args); - static void GetExceeds(const v8::FunctionCallbackInfo& args); - static void GetStddev(const v8::FunctionCallbackInfo& args); - static void GetPercentile( - const v8::FunctionCallbackInfo& args); - static void GetPercentileBigInt( - const v8::FunctionCallbackInfo& args); - static void GetPercentiles( - const v8::FunctionCallbackInfo& args); - static void GetPercentilesBigInt( - const v8::FunctionCallbackInfo& args); - static void DoReset(const v8::FunctionCallbackInfo& args); static void Start(const v8::FunctionCallbackInfo& args); static void Stop(const v8::FunctionCallbackInfo& args); + static void FastStart(v8::Local receiver, bool reset); + static void FastStop(v8::Local receiver); + BaseObject::TransferMode GetTransferMode() const override { return TransferMode::kCloneable; } @@ -231,6 +254,9 @@ class IntervalHistogram : public HandleWrap, public HistogramImpl { int32_t interval_ = 0; std::function on_interval_; uv_timer_t timer_; + + static v8::CFunction fast_start_; + static v8::CFunction fast_stop_; }; } // namespace node diff --git a/src/inspector/BUILD.gn b/src/inspector/BUILD.gn new file mode 100644 index 00000000000000..909fd14345fcd9 --- /dev/null +++ b/src/inspector/BUILD.gn @@ -0,0 +1,14 @@ +############################################################################## +# # +# DO NOT EDIT THIS FILE! # +# # +############################################################################## + +# This file is used by GN for building, which is NOT the build system used for +# building official binaries. +# Please modify the gyp files if you are making changes to build system. + +import("unofficial.gni") + +inspector_gn_build("inspector") { +} diff --git a/src/inspector/unofficial.gni b/src/inspector/unofficial.gni new file mode 100644 index 00000000000000..5d87f3c901ab50 --- /dev/null +++ b/src/inspector/unofficial.gni @@ -0,0 +1,75 @@ +import("../../node.gni") +import("$node_v8_path/gni/v8.gni") + +# The actual configurations are put inside a template in unofficial.gni to +# prevent accidental edits from contributors. +template("inspector_gn_build") { + group(target_name) { + forward_variables_from(invoker, "*") + deps = [ + ":node_protocol_generated_sources", + ":v8_inspector_compress_protocol_json", + ] + } + + node_gen_dir = get_label_info("../..", "target_gen_dir") + protocol_tool_path = "../../tools/inspector_protocol" + + gypi_values = exec_script( + "../../tools/gypi_to_gn.py", + [ rebase_path("node_inspector.gypi"), + "--replace=<(SHARED_INTERMEDIATE_DIR)=$node_gen_dir", + "--replace=<(protocol_tool_path)=$protocol_tool_path" ], + "scope", + [ "node_inspector.gypi" ]) + + action("node_protocol_generated_sources") { + script = "$protocol_tool_path/code_generator.py" + + deps = [ ":node_protocol_json" ] + + outputs = gypi_values.node_inspector_generated_sources + inputs = gypi_values.node_protocol_files + [ + "node_protocol_config.json", + "$node_gen_dir/src/node_protocol.json", + ] + + args = [ + "--jinja_dir", + # jinja is in third_party. + rebase_path("//third_party/", root_build_dir), + "--output_base", + rebase_path("$node_gen_dir/src", root_build_dir), + "--config", + rebase_path("node_protocol_config.json", root_build_dir), + ] + } + + action("v8_inspector_compress_protocol_json") { + script = "../../tools/compress_json.py" + deps = [ ":concatenate_protocols" ] + inputs = [ "$target_gen_dir/concatenated_protocol.json" ] + outputs = [ "$target_gen_dir/v8_inspector_protocol_json.h" ] + args = rebase_path(inputs + outputs, root_build_dir) + } + + action("concatenate_protocols") { + script = "$protocol_tool_path/concatenate_protocols.py" + deps = [ ":node_protocol_json" ] + inputs = [ + "$node_gen_dir/src/js_protocol.json", + "$node_gen_dir/src/node_protocol.json", + ] + outputs = [ + "$target_gen_dir/concatenated_protocol.json", + ] + args = rebase_path(inputs + outputs, root_build_dir) + } + + action_foreach("node_protocol_json") { + script = "$node_v8_path/third_party/inspector_protocol/convert_protocol_to_json.py" + sources = [ "node_protocol.pdl", v8_inspector_js_protocol ] + outputs = [ "$node_gen_dir/src/{{source_name_part}}.json" ] + args = [ "{{source}}" ] + rebase_path(outputs, root_build_dir) + } +} diff --git a/src/inspector_agent.cc b/src/inspector_agent.cc index de372400fd9ced..31597de1e14083 100644 --- a/src/inspector_agent.cc +++ b/src/inspector_agent.cc @@ -36,9 +36,6 @@ namespace node { namespace inspector { namespace { - -using node::OnFatalError; - using v8::Context; using v8::Function; using v8::HandleScope; @@ -917,8 +914,7 @@ void Agent::ToggleAsyncHook(Isolate* isolate, Local fn) { USE(fn->Call(context, Undefined(isolate), 0, nullptr)); if (try_catch.HasCaught() && !try_catch.HasTerminated()) { PrintCaughtException(isolate, context, try_catch); - OnFatalError("\nnode::inspector::Agent::ToggleAsyncHook", - "Cannot toggle Inspector's AsyncHook, please report this."); + UNREACHABLE("Cannot toggle Inspector's AsyncHook, please report this."); } } diff --git a/src/js_native_api.h b/src/js_native_api.h index d665052b947552..53034214b82ddd 100644 --- a/src/js_native_api.h +++ b/src/js_native_api.h @@ -49,8 +49,8 @@ EXTERN_C_START -NAPI_EXTERN napi_status NAPI_CDECL -napi_get_last_error_info(napi_env env, const napi_extended_error_info** result); +NAPI_EXTERN napi_status NAPI_CDECL napi_get_last_error_info( + node_api_nogc_env env, const napi_extended_error_info** result); // Getters for defined singletons NAPI_EXTERN napi_status NAPI_CDECL napi_get_undefined(napi_env env, @@ -93,11 +93,12 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_create_string_utf16(napi_env env, size_t length, napi_value* result); #ifdef NAPI_EXPERIMENTAL +#define NODE_API_EXPERIMENTAL_HAS_EXTERNAL_STRINGS NAPI_EXTERN napi_status NAPI_CDECL node_api_create_external_string_latin1(napi_env env, char* str, size_t length, - napi_finalize finalize_callback, + node_api_nogc_finalize finalize_callback, void* finalize_hint, napi_value* result, bool* copied); @@ -105,7 +106,7 @@ NAPI_EXTERN napi_status NAPI_CDECL node_api_create_external_string_utf16(napi_env env, char16_t* str, size_t length, - napi_finalize finalize_callback, + node_api_nogc_finalize finalize_callback, void* finalize_hint, napi_value* result, bool* copied); @@ -289,7 +290,7 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_instanceof(napi_env env, // Gets all callback info in a single call. (Ugly, but faster.) NAPI_EXTERN napi_status NAPI_CDECL napi_get_cb_info( - napi_env env, // [in] NAPI environment handle + napi_env env, // [in] Node-API environment handle napi_callback_info cbinfo, // [in] Opaque callback-info handle size_t* argc, // [in-out] Specifies the size of the provided argv array // and receives the actual count of args. @@ -313,7 +314,7 @@ napi_define_class(napi_env env, NAPI_EXTERN napi_status NAPI_CDECL napi_wrap(napi_env env, napi_value js_object, void* native_object, - napi_finalize finalize_cb, + node_api_nogc_finalize finalize_cb, void* finalize_hint, napi_ref* result); NAPI_EXTERN napi_status NAPI_CDECL napi_unwrap(napi_env env, @@ -325,7 +326,7 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_remove_wrap(napi_env env, NAPI_EXTERN napi_status NAPI_CDECL napi_create_external(napi_env env, void* data, - napi_finalize finalize_cb, + node_api_nogc_finalize finalize_cb, void* finalize_hint, napi_value* result); NAPI_EXTERN napi_status NAPI_CDECL napi_get_value_external(napi_env env, @@ -424,7 +425,7 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_create_external_arraybuffer(napi_env env, void* external_data, size_t byte_length, - napi_finalize finalize_cb, + node_api_nogc_finalize finalize_cb, void* finalize_hint, napi_value* result); #endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED @@ -466,7 +467,7 @@ napi_get_dataview_info(napi_env env, size_t* byte_offset); // version management -NAPI_EXTERN napi_status NAPI_CDECL napi_get_version(napi_env env, +NAPI_EXTERN napi_status NAPI_CDECL napi_get_version(node_api_nogc_env env, uint32_t* result); // Promises @@ -490,7 +491,7 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_run_script(napi_env env, // Memory management NAPI_EXTERN napi_status NAPI_CDECL napi_adjust_external_memory( - napi_env env, int64_t change_in_bytes, int64_t* adjusted_value); + node_api_nogc_env env, int64_t change_in_bytes, int64_t* adjusted_value); #if NAPI_VERSION >= 5 @@ -508,19 +509,21 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_get_date_value(napi_env env, double* result); // Add finalizer for pointer -NAPI_EXTERN napi_status NAPI_CDECL napi_add_finalizer(napi_env env, - napi_value js_object, - void* finalize_data, - napi_finalize finalize_cb, - void* finalize_hint, - napi_ref* result); +NAPI_EXTERN napi_status NAPI_CDECL +napi_add_finalizer(napi_env env, + napi_value js_object, + void* finalize_data, + node_api_nogc_finalize finalize_cb, + void* finalize_hint, + napi_ref* result); #endif // NAPI_VERSION >= 5 #ifdef NAPI_EXPERIMENTAL +#define NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER NAPI_EXTERN napi_status NAPI_CDECL -node_api_post_finalizer(napi_env env, +node_api_post_finalizer(node_api_nogc_env env, napi_finalize finalize_cb, void* finalize_data, void* finalize_hint); @@ -564,10 +567,13 @@ napi_get_all_property_names(napi_env env, napi_value* result); // Instance data -NAPI_EXTERN napi_status NAPI_CDECL napi_set_instance_data( - napi_env env, void* data, napi_finalize finalize_cb, void* finalize_hint); +NAPI_EXTERN napi_status NAPI_CDECL +napi_set_instance_data(node_api_nogc_env env, + void* data, + napi_finalize finalize_cb, + void* finalize_hint); -NAPI_EXTERN napi_status NAPI_CDECL napi_get_instance_data(napi_env env, +NAPI_EXTERN napi_status NAPI_CDECL napi_get_instance_data(node_api_nogc_env env, void** data); #endif // NAPI_VERSION >= 6 diff --git a/src/js_native_api_types.h b/src/js_native_api_types.h index 005382f173fee9..7cb5b080cc377a 100644 --- a/src/js_native_api_types.h +++ b/src/js_native_api_types.h @@ -22,6 +22,35 @@ typedef uint16_t char16_t; // JSVM API types are all opaque pointers for ABI stability // typedef undefined structs instead of void* for compile time type safety typedef struct napi_env__* napi_env; + +// We need to mark APIs which can be called during garbage collection (GC), +// meaning that they do not affect the state of the JS engine, and can +// therefore be called synchronously from a finalizer that itself runs +// synchronously during GC. Such APIs can receive either a `napi_env` or a +// `node_api_nogc_env` as their first parameter, because we should be able to +// also call them during normal, non-garbage-collecting operations, whereas +// APIs that affect the state of the JS engine can only receive a `napi_env` as +// their first parameter, because we must not call them during GC. In lieu of +// inheritance, we use the properties of the const qualifier to accomplish +// this, because both a const and a non-const value can be passed to an API +// expecting a const value, but only a non-const value can be passed to an API +// expecting a non-const value. +// +// In conjunction with appropriate CFLAGS to warn us if we're passing a const +// (nogc) environment into an API that expects a non-const environment, and the +// definition of nogc finalizer function pointer types below, which receive a +// nogc environment as their first parameter, and can thus only call nogc APIs +// (unless the user explicitly casts the environment), we achieve the ability +// to ensure at compile time that we do not call APIs that affect the state of +// the JS engine from a synchronous (nogc) finalizer. +#if !defined(NAPI_EXPERIMENTAL) || \ + (defined(NAPI_EXPERIMENTAL) && \ + defined(NODE_API_EXPERIMENTAL_NOGC_ENV_OPT_OUT)) +typedef struct napi_env__* node_api_nogc_env; +#else +typedef const struct napi_env__* node_api_nogc_env; +#endif + typedef struct napi_value__* napi_value; typedef struct napi_ref__* napi_ref; typedef struct napi_handle_scope__* napi_handle_scope; @@ -116,6 +145,16 @@ typedef void(NAPI_CDECL* napi_finalize)(napi_env env, void* finalize_data, void* finalize_hint); +#if !defined(NAPI_EXPERIMENTAL) || \ + (defined(NAPI_EXPERIMENTAL) && \ + defined(NODE_API_EXPERIMENTAL_NOGC_ENV_OPT_OUT)) +typedef napi_finalize node_api_nogc_finalize; +#else +typedef void(NAPI_CDECL* node_api_nogc_finalize)(node_api_nogc_env env, + void* finalize_data, + void* finalize_hint); +#endif + typedef struct { // One of utf8name or name should be NULL. const char* utf8name; diff --git a/src/js_native_api_v8.cc b/src/js_native_api_v8.cc index 044244eccfe9ea..1690c675b11a27 100644 --- a/src/js_native_api_v8.cc +++ b/src/js_native_api_v8.cc @@ -38,6 +38,17 @@ #define CHECK_NEW_FROM_UTF8(env, result, str) \ CHECK_NEW_FROM_UTF8_LEN((env), (result), (str), NAPI_AUTO_LENGTH) +#define CHECK_NEW_STRING_ARGS(env, str, length, result) \ + do { \ + CHECK_ENV_NOT_IN_GC((env)); \ + if ((length) > 0) CHECK_ARG((env), (str)); \ + CHECK_ARG((env), (result)); \ + RETURN_STATUS_IF_FALSE( \ + (env), \ + ((length) == NAPI_AUTO_LENGTH) || (length) <= INT_MAX, \ + napi_invalid_arg); \ + } while (0) + #define CREATE_TYPED_ARRAY( \ env, type, size_of_element, buffer, byte_offset, length, out) \ do { \ @@ -81,12 +92,7 @@ napi_status NewString(napi_env env, size_t length, napi_value* result, StringMaker string_maker) { - CHECK_ENV(env); - env->CheckGCAccess(); - if (length > 0) CHECK_ARG(env, str); - CHECK_ARG(env, result); - RETURN_STATUS_IF_FALSE( - env, (length == NAPI_AUTO_LENGTH) || length <= INT_MAX, napi_invalid_arg); + CHECK_NEW_STRING_ARGS(env, str, length, result); auto isolate = env->isolate; auto str_maybe = string_maker(isolate); @@ -105,9 +111,10 @@ napi_status NewExternalString(napi_env env, bool* copied, CreateAPI create_api, StringMaker string_maker) { + CHECK_NEW_STRING_ARGS(env, str, length, result); + napi_status status; #if defined(V8_ENABLE_SANDBOX) - env->CheckGCAccess(); status = create_api(env, str, length, result); if (status == napi_ok) { if (copied != nullptr) { @@ -818,6 +825,58 @@ void Reference::WeakCallback(const v8::WeakCallbackInfo& data) { reference->env_->InvokeFinalizerFromGC(reference); } +/** + * A wrapper for `v8::External` to support type-tagging. `v8::External` doesn't + * support defining any properties and private properties on it, even though it + * is an object. This wrapper is used to store the type tag and the data of the + * external value. + */ +class ExternalWrapper { + private: + explicit ExternalWrapper(void* data) : data_(data) {} + + static void WeakCallback(const v8::WeakCallbackInfo& data) { + ExternalWrapper* wrapper = data.GetParameter(); + delete wrapper; + } + + public: + static v8::Local New(napi_env env, void* data) { + ExternalWrapper* wrapper = new ExternalWrapper(data); + v8::Local external = v8::External::New(env->isolate, wrapper); + wrapper->persistent_.Reset(env->isolate, external); + wrapper->persistent_.SetWeak( + wrapper, WeakCallback, v8::WeakCallbackType::kParameter); + + return external; + } + + static ExternalWrapper* From(v8::Local external) { + return static_cast(external->Value()); + } + + void* Data() { return data_; } + + bool TypeTag(const napi_type_tag* type_tag) { + if (type_tag_ != nullptr) { + return false; + } + type_tag_ = type_tag; + return true; + } + + bool CheckTypeTag(const napi_type_tag* type_tag) { + return type_tag == type_tag_ || + (type_tag_ && type_tag->lower == type_tag_->lower && + type_tag->upper == type_tag_->upper); + } + + private: + v8impl::Persistent persistent_; + void* data_; + const napi_type_tag* type_tag_ = nullptr; +}; + } // end of namespace v8impl // Warning: Keep in-sync with napi_status enum @@ -849,7 +908,8 @@ static const char* error_messages[] = { }; napi_status NAPI_CDECL napi_get_last_error_info( - napi_env env, const napi_extended_error_info** result) { + node_api_nogc_env nogc_env, const napi_extended_error_info** result) { + napi_env env = const_cast(nogc_env); CHECK_ENV(env); CHECK_ARG(env, result); @@ -961,11 +1021,8 @@ napi_define_class(napi_env env, env, p->setter, p->data, &setter_tpl)); } - tpl->PrototypeTemplate()->SetAccessorProperty(property_name, - getter_tpl, - setter_tpl, - attributes, - v8::AccessControl::DEFAULT); + tpl->PrototypeTemplate()->SetAccessorProperty( + property_name, getter_tpl, setter_tpl, attributes); } else if (p->method != nullptr) { v8::Local t; STATUS_CALL(v8impl::FunctionCallbackWrapper::NewTemplate( @@ -1105,7 +1162,8 @@ napi_status NAPI_CDECL napi_set_property(napi_env env, v8::Maybe set_maybe = obj->Set(context, k, val); - RETURN_STATUS_IF_FALSE(env, set_maybe.FromMaybe(false), napi_generic_failure); + RETURN_STATUS_IF_FALSE_WITH_PREAMBLE( + env, set_maybe.FromMaybe(false), napi_generic_failure); return GET_RETURN_STATUS(env); } @@ -1125,7 +1183,7 @@ napi_status NAPI_CDECL napi_has_property(napi_env env, v8::Local k = v8impl::V8LocalValueFromJsValue(key); v8::Maybe has_maybe = obj->Has(context, k); - CHECK_MAYBE_NOTHING(env, has_maybe, napi_generic_failure); + CHECK_MAYBE_NOTHING_WITH_PREAMBLE(env, has_maybe, napi_generic_failure); *result = has_maybe.FromMaybe(false); return GET_RETURN_STATUS(env); @@ -1147,7 +1205,7 @@ napi_status NAPI_CDECL napi_get_property(napi_env env, auto get_maybe = obj->Get(context, k); - CHECK_MAYBE_EMPTY(env, get_maybe, napi_generic_failure); + CHECK_MAYBE_EMPTY_WITH_PREAMBLE(env, get_maybe, napi_generic_failure); v8::Local val = get_maybe.ToLocalChecked(); *result = v8impl::JsValueFromV8LocalValue(val); @@ -1167,7 +1225,7 @@ napi_status NAPI_CDECL napi_delete_property(napi_env env, CHECK_TO_OBJECT(env, context, obj, object); v8::Maybe delete_maybe = obj->Delete(context, k); - CHECK_MAYBE_NOTHING(env, delete_maybe, napi_generic_failure); + CHECK_MAYBE_NOTHING_WITH_PREAMBLE(env, delete_maybe, napi_generic_failure); if (result != nullptr) *result = delete_maybe.FromMaybe(false); @@ -1189,7 +1247,7 @@ napi_status NAPI_CDECL napi_has_own_property(napi_env env, v8::Local k = v8impl::V8LocalValueFromJsValue(key); RETURN_STATUS_IF_FALSE(env, k->IsName(), napi_name_expected); v8::Maybe has_maybe = obj->HasOwnProperty(context, k.As()); - CHECK_MAYBE_NOTHING(env, has_maybe, napi_generic_failure); + CHECK_MAYBE_NOTHING_WITH_PREAMBLE(env, has_maybe, napi_generic_failure); *result = has_maybe.FromMaybe(false); return GET_RETURN_STATUS(env); @@ -1214,7 +1272,8 @@ napi_status NAPI_CDECL napi_set_named_property(napi_env env, v8::Maybe set_maybe = obj->Set(context, key, val); - RETURN_STATUS_IF_FALSE(env, set_maybe.FromMaybe(false), napi_generic_failure); + RETURN_STATUS_IF_FALSE_WITH_PREAMBLE( + env, set_maybe.FromMaybe(false), napi_generic_failure); return GET_RETURN_STATUS(env); } @@ -1235,7 +1294,7 @@ napi_status NAPI_CDECL napi_has_named_property(napi_env env, v8::Maybe has_maybe = obj->Has(context, key); - CHECK_MAYBE_NOTHING(env, has_maybe, napi_generic_failure); + CHECK_MAYBE_NOTHING_WITH_PREAMBLE(env, has_maybe, napi_generic_failure); *result = has_maybe.FromMaybe(false); return GET_RETURN_STATUS(env); @@ -1259,7 +1318,7 @@ napi_status NAPI_CDECL napi_get_named_property(napi_env env, auto get_maybe = obj->Get(context, key); - CHECK_MAYBE_EMPTY(env, get_maybe, napi_generic_failure); + CHECK_MAYBE_EMPTY_WITH_PREAMBLE(env, get_maybe, napi_generic_failure); v8::Local val = get_maybe.ToLocalChecked(); *result = v8impl::JsValueFromV8LocalValue(val); @@ -1281,7 +1340,8 @@ napi_status NAPI_CDECL napi_set_element(napi_env env, v8::Local val = v8impl::V8LocalValueFromJsValue(value); auto set_maybe = obj->Set(context, index, val); - RETURN_STATUS_IF_FALSE(env, set_maybe.FromMaybe(false), napi_generic_failure); + RETURN_STATUS_IF_FALSE_WITH_PREAMBLE( + env, set_maybe.FromMaybe(false), napi_generic_failure); return GET_RETURN_STATUS(env); } @@ -1300,7 +1360,7 @@ napi_status NAPI_CDECL napi_has_element(napi_env env, v8::Maybe has_maybe = obj->Has(context, index); - CHECK_MAYBE_NOTHING(env, has_maybe, napi_generic_failure); + CHECK_MAYBE_NOTHING_WITH_PREAMBLE(env, has_maybe, napi_generic_failure); *result = has_maybe.FromMaybe(false); return GET_RETURN_STATUS(env); @@ -1320,7 +1380,7 @@ napi_status NAPI_CDECL napi_get_element(napi_env env, auto get_maybe = obj->Get(context, index); - CHECK_MAYBE_EMPTY(env, get_maybe, napi_generic_failure); + CHECK_MAYBE_EMPTY_WITH_PREAMBLE(env, get_maybe, napi_generic_failure); *result = v8impl::JsValueFromV8LocalValue(get_maybe.ToLocalChecked()); return GET_RETURN_STATUS(env); @@ -1337,7 +1397,7 @@ napi_status NAPI_CDECL napi_delete_element(napi_env env, CHECK_TO_OBJECT(env, context, obj, object); v8::Maybe delete_maybe = obj->Delete(context, index); - CHECK_MAYBE_NOTHING(env, delete_maybe, napi_generic_failure); + CHECK_MAYBE_NOTHING_WITH_PREAMBLE(env, delete_maybe, napi_generic_failure); if (result != nullptr) *result = delete_maybe.FromMaybe(false); @@ -1385,9 +1445,8 @@ napi_define_properties(napi_env env, auto define_maybe = obj->DefineProperty(context, property_name, descriptor); - if (!define_maybe.FromMaybe(false)) { - return napi_set_last_error(env, napi_invalid_arg); - } + RETURN_STATUS_IF_FALSE_WITH_PREAMBLE( + env, define_maybe.FromMaybe(false), napi_invalid_arg); } else if (p->method != nullptr) { v8::Local method; STATUS_CALL(v8impl::FunctionCallbackWrapper::NewFunction( @@ -1400,34 +1459,28 @@ napi_define_properties(napi_env env, auto define_maybe = obj->DefineProperty(context, property_name, descriptor); - if (!define_maybe.FromMaybe(false)) { - return napi_set_last_error(env, napi_generic_failure); - } + RETURN_STATUS_IF_FALSE_WITH_PREAMBLE( + env, define_maybe.FromMaybe(false), napi_generic_failure); } else { v8::Local value = v8impl::V8LocalValueFromJsValue(p->value); - bool defined_successfully = false; + v8::Maybe define_maybe = v8::Just(false); if ((p->attributes & napi_enumerable) && (p->attributes & napi_writable) && (p->attributes & napi_configurable)) { // Use a fast path for this type of data property. - auto define_maybe = - obj->CreateDataProperty(context, property_name, value); - defined_successfully = define_maybe.FromMaybe(false); + define_maybe = obj->CreateDataProperty(context, property_name, value); } else { v8::PropertyDescriptor descriptor(value, (p->attributes & napi_writable) != 0); descriptor.set_enumerable((p->attributes & napi_enumerable) != 0); descriptor.set_configurable((p->attributes & napi_configurable) != 0); - auto define_maybe = - obj->DefineProperty(context, property_name, descriptor); - defined_successfully = define_maybe.FromMaybe(false); + define_maybe = obj->DefineProperty(context, property_name, descriptor); } - if (!defined_successfully) { - return napi_set_last_error(env, napi_invalid_arg); - } + RETURN_STATUS_IF_FALSE_WITH_PREAMBLE( + env, define_maybe.FromMaybe(false), napi_invalid_arg); } } @@ -1471,8 +1524,7 @@ napi_status NAPI_CDECL napi_object_seal(napi_env env, napi_value object) { napi_status NAPI_CDECL napi_is_array(napi_env env, napi_value value, bool* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); CHECK_ARG(env, result); @@ -1525,14 +1577,14 @@ napi_status NAPI_CDECL napi_get_prototype(napi_env env, v8::Local obj; CHECK_TO_OBJECT(env, context, obj, object); + // This doesn't invokes Proxy's [[GetPrototypeOf]] handler. v8::Local val = obj->GetPrototype(); *result = v8impl::JsValueFromV8LocalValue(val); return GET_RETURN_STATUS(env); } napi_status NAPI_CDECL napi_create_object(napi_env env, napi_value* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, result); *result = v8impl::JsValueFromV8LocalValue(v8::Object::New(env->isolate)); @@ -1541,8 +1593,7 @@ napi_status NAPI_CDECL napi_create_object(napi_env env, napi_value* result) { } napi_status NAPI_CDECL napi_create_array(napi_env env, napi_value* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, result); *result = v8impl::JsValueFromV8LocalValue(v8::Array::New(env->isolate)); @@ -1553,8 +1604,7 @@ napi_status NAPI_CDECL napi_create_array(napi_env env, napi_value* result) { napi_status NAPI_CDECL napi_create_array_with_length(napi_env env, size_t length, napi_value* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, result); *result = @@ -1597,14 +1647,16 @@ napi_status NAPI_CDECL napi_create_string_utf16(napi_env env, }); } -napi_status NAPI_CDECL -node_api_create_external_string_latin1(napi_env env, - char* str, - size_t length, - napi_finalize finalize_callback, - void* finalize_hint, - napi_value* result, - bool* copied) { +napi_status NAPI_CDECL node_api_create_external_string_latin1( + napi_env env, + char* str, + size_t length, + node_api_nogc_finalize nogc_finalize_callback, + void* finalize_hint, + napi_value* result, + bool* copied) { + napi_finalize finalize_callback = + reinterpret_cast(nogc_finalize_callback); return v8impl::NewExternalString( env, str, @@ -1624,14 +1676,16 @@ node_api_create_external_string_latin1(napi_env env, }); } -napi_status NAPI_CDECL -node_api_create_external_string_utf16(napi_env env, - char16_t* str, - size_t length, - napi_finalize finalize_callback, - void* finalize_hint, - napi_value* result, - bool* copied) { +napi_status NAPI_CDECL node_api_create_external_string_utf16( + napi_env env, + char16_t* str, + size_t length, + node_api_nogc_finalize nogc_finalize_callback, + void* finalize_hint, + napi_value* result, + bool* copied) { + napi_finalize finalize_callback = + reinterpret_cast(nogc_finalize_callback); return v8impl::NewExternalString( env, str, @@ -1654,8 +1708,7 @@ node_api_create_external_string_utf16(napi_env env, napi_status NAPI_CDECL napi_create_double(napi_env env, double value, napi_value* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, result); *result = @@ -1667,8 +1720,7 @@ napi_status NAPI_CDECL napi_create_double(napi_env env, napi_status NAPI_CDECL napi_create_int32(napi_env env, int32_t value, napi_value* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, result); *result = @@ -1680,8 +1732,7 @@ napi_status NAPI_CDECL napi_create_int32(napi_env env, napi_status NAPI_CDECL napi_create_uint32(napi_env env, uint32_t value, napi_value* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, result); *result = v8impl::JsValueFromV8LocalValue( @@ -1693,8 +1744,7 @@ napi_status NAPI_CDECL napi_create_uint32(napi_env env, napi_status NAPI_CDECL napi_create_int64(napi_env env, int64_t value, napi_value* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, result); *result = v8impl::JsValueFromV8LocalValue( @@ -1706,8 +1756,7 @@ napi_status NAPI_CDECL napi_create_int64(napi_env env, napi_status NAPI_CDECL napi_create_bigint_int64(napi_env env, int64_t value, napi_value* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, result); *result = @@ -1719,8 +1768,7 @@ napi_status NAPI_CDECL napi_create_bigint_int64(napi_env env, napi_status NAPI_CDECL napi_create_bigint_uint64(napi_env env, uint64_t value, napi_value* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, result); *result = v8impl::JsValueFromV8LocalValue( @@ -1735,7 +1783,6 @@ napi_status NAPI_CDECL napi_create_bigint_words(napi_env env, const uint64_t* words, napi_value* result) { NAPI_PREAMBLE(env); - env->CheckGCAccess(); CHECK_ARG(env, words); CHECK_ARG(env, result); @@ -1755,8 +1802,7 @@ napi_status NAPI_CDECL napi_create_bigint_words(napi_env env, napi_status NAPI_CDECL napi_get_boolean(napi_env env, bool value, napi_value* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, result); v8::Isolate* isolate = env->isolate; @@ -1773,8 +1819,7 @@ napi_status NAPI_CDECL napi_get_boolean(napi_env env, napi_status NAPI_CDECL napi_create_symbol(napi_env env, napi_value description, napi_value* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, result); v8::Isolate* isolate = env->isolate; @@ -1796,8 +1841,7 @@ napi_status NAPI_CDECL node_api_symbol_for(napi_env env, const char* utf8description, size_t length, napi_value* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, result); napi_value js_description_string; @@ -1842,8 +1886,7 @@ napi_status NAPI_CDECL napi_create_error(napi_env env, napi_value code, napi_value msg, napi_value* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, msg); CHECK_ARG(env, result); @@ -1863,8 +1906,7 @@ napi_status NAPI_CDECL napi_create_type_error(napi_env env, napi_value code, napi_value msg, napi_value* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, msg); CHECK_ARG(env, result); @@ -1884,8 +1926,7 @@ napi_status NAPI_CDECL napi_create_range_error(napi_env env, napi_value code, napi_value msg, napi_value* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, msg); CHECK_ARG(env, result); @@ -1905,8 +1946,7 @@ napi_status NAPI_CDECL node_api_create_syntax_error(napi_env env, napi_value code, napi_value msg, napi_value* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, msg); CHECK_ARG(env, result); @@ -1927,8 +1967,7 @@ napi_status NAPI_CDECL napi_typeof(napi_env env, napi_valuetype* result) { // Omit NAPI_PREAMBLE and GET_RETURN_STATUS because V8 calls here cannot throw // JS exceptions. - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); CHECK_ARG(env, result); @@ -1967,8 +2006,7 @@ napi_status NAPI_CDECL napi_typeof(napi_env env, } napi_status NAPI_CDECL napi_get_undefined(napi_env env, napi_value* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, result); *result = v8impl::JsValueFromV8LocalValue(v8::Undefined(env->isolate)); @@ -1977,8 +2015,7 @@ napi_status NAPI_CDECL napi_get_undefined(napi_env env, napi_value* result) { } napi_status NAPI_CDECL napi_get_null(napi_env env, napi_value* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, result); *result = v8impl::JsValueFromV8LocalValue(v8::Null(env->isolate)); @@ -2021,10 +2058,9 @@ napi_status NAPI_CDECL napi_get_cb_info( napi_status NAPI_CDECL napi_get_new_target(napi_env env, napi_callback_info cbinfo, napi_value* result) { - CHECK_ENV(env); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, cbinfo); CHECK_ARG(env, result); - env->CheckGCAccess(); v8impl::CallbackWrapper* info = reinterpret_cast(cbinfo); @@ -2058,20 +2094,15 @@ napi_status NAPI_CDECL napi_call_function(napi_env env, argc, reinterpret_cast*>(const_cast(argv))); - if (try_catch.HasCaught()) { - return napi_set_last_error(env, napi_pending_exception); - } else { - if (result != nullptr) { - CHECK_MAYBE_EMPTY(env, maybe, napi_generic_failure); - *result = v8impl::JsValueFromV8LocalValue(maybe.ToLocalChecked()); - } - return napi_clear_last_error(env); + CHECK_MAYBE_EMPTY_WITH_PREAMBLE(env, maybe, napi_generic_failure); + if (result != nullptr) { + *result = v8impl::JsValueFromV8LocalValue(maybe.ToLocalChecked()); } + return napi_clear_last_error(env); } napi_status NAPI_CDECL napi_get_global(napi_env env, napi_value* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, result); *result = v8impl::JsValueFromV8LocalValue(env->context()->Global()); @@ -2168,8 +2199,7 @@ napi_status NAPI_CDECL napi_is_error(napi_env env, bool* result) { // Omit NAPI_PREAMBLE and GET_RETURN_STATUS because V8 calls here cannot // throw JS exceptions. - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); CHECK_ARG(env, result); @@ -2184,8 +2214,7 @@ napi_status NAPI_CDECL napi_get_value_double(napi_env env, double* result) { // Omit NAPI_PREAMBLE and GET_RETURN_STATUS because V8 calls here cannot throw // JS exceptions. - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); CHECK_ARG(env, result); @@ -2202,8 +2231,7 @@ napi_status NAPI_CDECL napi_get_value_int32(napi_env env, int32_t* result) { // Omit NAPI_PREAMBLE and GET_RETURN_STATUS because V8 calls here cannot throw // JS exceptions. - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); CHECK_ARG(env, result); @@ -2227,8 +2255,7 @@ napi_status NAPI_CDECL napi_get_value_uint32(napi_env env, uint32_t* result) { // Omit NAPI_PREAMBLE and GET_RETURN_STATUS because V8 calls here cannot throw // JS exceptions. - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); CHECK_ARG(env, result); @@ -2252,8 +2279,7 @@ napi_status NAPI_CDECL napi_get_value_int64(napi_env env, int64_t* result) { // Omit NAPI_PREAMBLE and GET_RETURN_STATUS because V8 calls here cannot throw // JS exceptions. - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); CHECK_ARG(env, result); @@ -2286,8 +2312,7 @@ napi_status NAPI_CDECL napi_get_value_bigint_int64(napi_env env, napi_value value, int64_t* result, bool* lossless) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); CHECK_ARG(env, result); CHECK_ARG(env, lossless); @@ -2305,8 +2330,7 @@ napi_status NAPI_CDECL napi_get_value_bigint_uint64(napi_env env, napi_value value, uint64_t* result, bool* lossless) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); CHECK_ARG(env, result); CHECK_ARG(env, lossless); @@ -2325,8 +2349,7 @@ napi_status NAPI_CDECL napi_get_value_bigint_words(napi_env env, int* sign_bit, size_t* word_count, uint64_t* words) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); CHECK_ARG(env, word_count); @@ -2356,8 +2379,7 @@ napi_status NAPI_CDECL napi_get_value_bool(napi_env env, bool* result) { // Omit NAPI_PREAMBLE and GET_RETURN_STATUS because V8 calls here cannot throw // JS exceptions. - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); CHECK_ARG(env, result); @@ -2379,8 +2401,7 @@ napi_status NAPI_CDECL napi_get_value_bool(napi_env env, // The result argument is optional unless buf is NULL. napi_status NAPI_CDECL napi_get_value_string_latin1( napi_env env, napi_value value, char* buf, size_t bufsize, size_t* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); v8::Local val = v8impl::V8LocalValueFromJsValue(value); @@ -2418,8 +2439,7 @@ napi_status NAPI_CDECL napi_get_value_string_latin1( // The result argument is optional unless buf is NULL. napi_status NAPI_CDECL napi_get_value_string_utf8( napi_env env, napi_value value, char* buf, size_t bufsize, size_t* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); v8::Local val = v8impl::V8LocalValueFromJsValue(value); @@ -2460,8 +2480,7 @@ napi_status NAPI_CDECL napi_get_value_string_utf16(napi_env env, char16_t* buf, size_t bufsize, size_t* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); v8::Local val = v8impl::V8LocalValueFromJsValue(value); @@ -2528,9 +2547,10 @@ GEN_COERCE_FUNCTION(STRING, String, string) napi_status NAPI_CDECL napi_wrap(napi_env env, napi_value js_object, void* native_object, - napi_finalize finalize_cb, + node_api_nogc_finalize nogc_finalize_cb, void* finalize_hint, napi_ref* result) { + napi_finalize finalize_cb = reinterpret_cast(nogc_finalize_cb); return v8impl::Wrap( env, js_object, native_object, finalize_cb, finalize_hint, result); } @@ -2547,17 +2567,18 @@ napi_status NAPI_CDECL napi_remove_wrap(napi_env env, return v8impl::Unwrap(env, obj, result, v8impl::RemoveWrap); } -napi_status NAPI_CDECL napi_create_external(napi_env env, - void* data, - napi_finalize finalize_cb, - void* finalize_hint, - napi_value* result) { +napi_status NAPI_CDECL +napi_create_external(napi_env env, + void* data, + node_api_nogc_finalize nogc_finalize_cb, + void* finalize_hint, + napi_value* result) { + napi_finalize finalize_cb = reinterpret_cast(nogc_finalize_cb); NAPI_PREAMBLE(env); CHECK_ARG(env, result); - v8::Isolate* isolate = env->isolate; - - v8::Local external_value = v8::External::New(isolate, data); + v8::Local external_value = + v8impl::ExternalWrapper::New(env, data); if (finalize_cb) { // The Reference object will delete itself after invoking the finalizer @@ -2577,12 +2598,24 @@ napi_status NAPI_CDECL napi_create_external(napi_env env, } napi_status NAPI_CDECL napi_type_tag_object(napi_env env, - napi_value object, + napi_value object_or_external, const napi_type_tag* type_tag) { NAPI_PREAMBLE(env); v8::Local context = env->context(); + + CHECK_ARG(env, object_or_external); + v8::Local val = + v8impl::V8LocalValueFromJsValue(object_or_external); + if (val->IsExternal()) { + v8impl::ExternalWrapper* wrapper = + v8impl::ExternalWrapper::From(val.As()); + RETURN_STATUS_IF_FALSE_WITH_PREAMBLE( + env, wrapper->TypeTag(type_tag), napi_invalid_arg); + return GET_RETURN_STATUS(env); + } + v8::Local obj; - CHECK_TO_OBJECT_WITH_PREAMBLE(env, context, obj, object); + CHECK_TO_OBJECT_WITH_PREAMBLE(env, context, obj, object_or_external); CHECK_ARG_WITH_PREAMBLE(env, type_tag); auto key = NAPI_PRIVATE_KEY(context, type_tag); @@ -2604,13 +2637,24 @@ napi_status NAPI_CDECL napi_type_tag_object(napi_env env, } napi_status NAPI_CDECL napi_check_object_type_tag(napi_env env, - napi_value object, + napi_value object_or_external, const napi_type_tag* type_tag, bool* result) { NAPI_PREAMBLE(env); v8::Local context = env->context(); + + CHECK_ARG(env, object_or_external); + v8::Local obj_val = + v8impl::V8LocalValueFromJsValue(object_or_external); + if (obj_val->IsExternal()) { + v8impl::ExternalWrapper* wrapper = + v8impl::ExternalWrapper::From(obj_val.As()); + *result = wrapper->CheckTypeTag(type_tag); + return GET_RETURN_STATUS(env); + } + v8::Local obj; - CHECK_TO_OBJECT_WITH_PREAMBLE(env, context, obj, object); + CHECK_TO_OBJECT_WITH_PREAMBLE(env, context, obj, object_or_external); CHECK_ARG_WITH_PREAMBLE(env, type_tag); CHECK_ARG_WITH_PREAMBLE(env, result); @@ -2647,8 +2691,7 @@ napi_status NAPI_CDECL napi_check_object_type_tag(napi_env env, napi_status NAPI_CDECL napi_get_value_external(napi_env env, napi_value value, void** result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); CHECK_ARG(env, result); @@ -2656,7 +2699,7 @@ napi_status NAPI_CDECL napi_get_value_external(napi_env env, RETURN_STATUS_IF_FALSE(env, val->IsExternal(), napi_invalid_arg); v8::Local external_value = val.As(); - *result = external_value->Value(); + *result = v8impl::ExternalWrapper::From(external_value)->Data(); return napi_clear_last_error(env); } @@ -2668,8 +2711,7 @@ napi_status NAPI_CDECL napi_create_reference(napi_env env, napi_ref* result) { // Omit NAPI_PREAMBLE and GET_RETURN_STATUS because V8 calls here cannot throw // JS exceptions. - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); CHECK_ARG(env, result); @@ -2693,8 +2735,7 @@ napi_status NAPI_CDECL napi_create_reference(napi_env env, napi_status NAPI_CDECL napi_delete_reference(napi_env env, napi_ref ref) { // Omit NAPI_PREAMBLE and GET_RETURN_STATUS because V8 calls here cannot throw // JS exceptions. - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, ref); delete reinterpret_cast(ref); @@ -2712,8 +2753,7 @@ napi_status NAPI_CDECL napi_reference_ref(napi_env env, uint32_t* result) { // Omit NAPI_PREAMBLE and GET_RETURN_STATUS because V8 calls here cannot throw // JS exceptions. - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, ref); v8impl::Reference* reference = reinterpret_cast(ref); @@ -2735,8 +2775,7 @@ napi_status NAPI_CDECL napi_reference_unref(napi_env env, uint32_t* result) { // Omit NAPI_PREAMBLE and GET_RETURN_STATUS because V8 calls here cannot throw // JS exceptions. - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, ref); v8impl::Reference* reference = reinterpret_cast(ref); @@ -2762,8 +2801,7 @@ napi_status NAPI_CDECL napi_get_reference_value(napi_env env, napi_value* result) { // Omit NAPI_PREAMBLE and GET_RETURN_STATUS because V8 calls here cannot throw // JS exceptions. - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, ref); CHECK_ARG(env, result); @@ -2777,8 +2815,7 @@ napi_status NAPI_CDECL napi_open_handle_scope(napi_env env, napi_handle_scope* result) { // Omit NAPI_PREAMBLE and GET_RETURN_STATUS because V8 calls here cannot throw // JS exceptions. - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, result); *result = v8impl::JsHandleScopeFromV8HandleScope( @@ -2791,8 +2828,7 @@ napi_status NAPI_CDECL napi_close_handle_scope(napi_env env, napi_handle_scope scope) { // Omit NAPI_PREAMBLE and GET_RETURN_STATUS because V8 calls here cannot throw // JS exceptions. - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, scope); if (env->open_handle_scopes == 0) { return napi_handle_scope_mismatch; @@ -2807,8 +2843,7 @@ napi_status NAPI_CDECL napi_open_escapable_handle_scope( napi_env env, napi_escapable_handle_scope* result) { // Omit NAPI_PREAMBLE and GET_RETURN_STATUS because V8 calls here cannot throw // JS exceptions. - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, result); *result = v8impl::JsEscapableHandleScopeFromV8EscapableHandleScope( @@ -2821,8 +2856,7 @@ napi_status NAPI_CDECL napi_close_escapable_handle_scope( napi_env env, napi_escapable_handle_scope scope) { // Omit NAPI_PREAMBLE and GET_RETURN_STATUS because V8 calls here cannot throw // JS exceptions. - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, scope); if (env->open_handle_scopes == 0) { return napi_handle_scope_mismatch; @@ -2839,8 +2873,7 @@ napi_status NAPI_CDECL napi_escape_handle(napi_env env, napi_value* result) { // Omit NAPI_PREAMBLE and GET_RETURN_STATUS because V8 calls here cannot throw // JS exceptions. - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, scope); CHECK_ARG(env, escapee); CHECK_ARG(env, result); @@ -2918,8 +2951,7 @@ napi_status NAPI_CDECL napi_instanceof(napi_env env, napi_status NAPI_CDECL napi_is_exception_pending(napi_env env, bool* result) { // NAPI_PREAMBLE is not used here: this function must execute when there is a // pending exception. - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, result); *result = !env->last_exception.IsEmpty(); @@ -2930,8 +2962,7 @@ napi_status NAPI_CDECL napi_get_and_clear_last_exception(napi_env env, napi_value* result) { // NAPI_PREAMBLE is not used here: this function must execute when there is a // pending exception. - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, result); if (env->last_exception.IsEmpty()) { @@ -2948,8 +2979,7 @@ napi_status NAPI_CDECL napi_get_and_clear_last_exception(napi_env env, napi_status NAPI_CDECL napi_is_arraybuffer(napi_env env, napi_value value, bool* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); CHECK_ARG(env, result); @@ -2984,7 +3014,7 @@ napi_status NAPI_CDECL napi_create_external_arraybuffer(napi_env env, void* external_data, size_t byte_length, - napi_finalize finalize_cb, + node_api_nogc_finalize finalize_cb, void* finalize_hint, napi_value* result) { // The API contract here is that the cleanup function runs on the JS thread, @@ -3001,8 +3031,7 @@ napi_status NAPI_CDECL napi_get_arraybuffer_info(napi_env env, napi_value arraybuffer, void** data, size_t* byte_length) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, arraybuffer); v8::Local value = v8impl::V8LocalValueFromJsValue(arraybuffer); @@ -3024,8 +3053,7 @@ napi_status NAPI_CDECL napi_get_arraybuffer_info(napi_env env, napi_status NAPI_CDECL napi_is_typedarray(napi_env env, napi_value value, bool* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); CHECK_ARG(env, result); @@ -3111,8 +3139,7 @@ napi_status NAPI_CDECL napi_get_typedarray_info(napi_env env, void** data, napi_value* arraybuffer, size_t* byte_offset) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, typedarray); v8::Local value = v8impl::V8LocalValueFromJsValue(typedarray); @@ -3202,8 +3229,7 @@ napi_status NAPI_CDECL napi_create_dataview(napi_env env, napi_status NAPI_CDECL napi_is_dataview(napi_env env, napi_value value, bool* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); CHECK_ARG(env, result); @@ -3219,8 +3245,7 @@ napi_status NAPI_CDECL napi_get_dataview_info(napi_env env, void** data, napi_value* arraybuffer, size_t* byte_offset) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, dataview); v8::Local value = v8impl::V8LocalValueFromJsValue(dataview); @@ -3254,7 +3279,8 @@ napi_status NAPI_CDECL napi_get_dataview_info(napi_env env, return napi_clear_last_error(env); } -napi_status NAPI_CDECL napi_get_version(napi_env env, uint32_t* result) { +napi_status NAPI_CDECL napi_get_version(node_api_nogc_env env, + uint32_t* result) { CHECK_ENV(env); CHECK_ARG(env, result); *result = NODE_API_SUPPORTED_VERSION_MAX; @@ -3295,8 +3321,7 @@ napi_status NAPI_CDECL napi_reject_deferred(napi_env env, napi_status NAPI_CDECL napi_is_promise(napi_env env, napi_value value, bool* is_promise) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); CHECK_ARG(env, is_promise); @@ -3322,8 +3347,7 @@ napi_status NAPI_CDECL napi_create_date(napi_env env, napi_status NAPI_CDECL napi_is_date(napi_env env, napi_value value, bool* is_date) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); CHECK_ARG(env, is_date); @@ -3336,7 +3360,6 @@ napi_status NAPI_CDECL napi_get_date_value(napi_env env, napi_value value, double* result) { NAPI_PREAMBLE(env); - env->CheckGCAccess(); CHECK_ARG(env, value); CHECK_ARG(env, result); @@ -3374,16 +3397,17 @@ napi_status NAPI_CDECL napi_run_script(napi_env env, return GET_RETURN_STATUS(env); } -napi_status NAPI_CDECL napi_add_finalizer(napi_env env, - napi_value js_object, - void* finalize_data, - napi_finalize finalize_cb, - void* finalize_hint, - napi_ref* result) { +napi_status NAPI_CDECL +napi_add_finalizer(napi_env env, + napi_value js_object, + void* finalize_data, + node_api_nogc_finalize nogc_finalize_cb, + void* finalize_hint, + napi_ref* result) { // Omit NAPI_PREAMBLE and GET_RETURN_STATUS because V8 calls here cannot throw // JS exceptions. - CHECK_ENV(env); - env->CheckGCAccess(); + napi_finalize finalize_cb = reinterpret_cast(nogc_finalize_cb); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, js_object); CHECK_ARG(env, finalize_cb); @@ -3406,10 +3430,11 @@ napi_status NAPI_CDECL napi_add_finalizer(napi_env env, #ifdef NAPI_EXPERIMENTAL -napi_status NAPI_CDECL node_api_post_finalizer(napi_env env, +napi_status NAPI_CDECL node_api_post_finalizer(node_api_nogc_env nogc_env, napi_finalize finalize_cb, void* finalize_data, void* finalize_hint) { + napi_env env = const_cast(nogc_env); CHECK_ENV(env); env->EnqueueFinalizer(v8impl::TrackedFinalizer::New( env, finalize_cb, finalize_data, finalize_hint)); @@ -3418,7 +3443,7 @@ napi_status NAPI_CDECL node_api_post_finalizer(napi_env env, #endif -napi_status NAPI_CDECL napi_adjust_external_memory(napi_env env, +napi_status NAPI_CDECL napi_adjust_external_memory(node_api_nogc_env env, int64_t change_in_bytes, int64_t* adjusted_value) { CHECK_ENV(env); @@ -3430,10 +3455,11 @@ napi_status NAPI_CDECL napi_adjust_external_memory(napi_env env, return napi_clear_last_error(env); } -napi_status NAPI_CDECL napi_set_instance_data(napi_env env, +napi_status NAPI_CDECL napi_set_instance_data(node_api_nogc_env nogc_env, void* data, napi_finalize finalize_cb, void* finalize_hint) { + napi_env env = const_cast(nogc_env); CHECK_ENV(env); v8impl::RefBase* old_data = static_cast(env->instance_data); @@ -3449,7 +3475,8 @@ napi_status NAPI_CDECL napi_set_instance_data(napi_env env, return napi_clear_last_error(env); } -napi_status NAPI_CDECL napi_get_instance_data(napi_env env, void** data) { +napi_status NAPI_CDECL napi_get_instance_data(node_api_nogc_env env, + void** data) { CHECK_ENV(env); CHECK_ARG(env, data); @@ -3462,8 +3489,7 @@ napi_status NAPI_CDECL napi_get_instance_data(napi_env env, void** data) { napi_status NAPI_CDECL napi_detach_arraybuffer(napi_env env, napi_value arraybuffer) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, arraybuffer); v8::Local value = v8impl::V8LocalValueFromJsValue(arraybuffer); @@ -3482,8 +3508,7 @@ napi_status NAPI_CDECL napi_detach_arraybuffer(napi_env env, napi_status NAPI_CDECL napi_is_detached_arraybuffer(napi_env env, napi_value arraybuffer, bool* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, arraybuffer); CHECK_ARG(env, result); diff --git a/src/js_native_api_v8.h b/src/js_native_api_v8.h index db39686c91127e..1974c3f6873ef7 100644 --- a/src/js_native_api_v8.h +++ b/src/js_native_api_v8.h @@ -4,7 +4,7 @@ #include "js_native_api_types.h" #include "js_native_api_v8_internals.h" -inline napi_status napi_clear_last_error(napi_env env); +inline napi_status napi_clear_last_error(node_api_nogc_env env); namespace v8impl { @@ -172,7 +172,8 @@ struct napi_env__ { virtual ~napi_env__() = default; }; -inline napi_status napi_clear_last_error(napi_env env) { +inline napi_status napi_clear_last_error(node_api_nogc_env nogc_env) { + napi_env env = const_cast(nogc_env); env->last_error.error_code = napi_ok; env->last_error.engine_error_code = 0; env->last_error.engine_reserved = nullptr; @@ -180,10 +181,11 @@ inline napi_status napi_clear_last_error(napi_env env) { return napi_ok; } -inline napi_status napi_set_last_error(napi_env env, +inline napi_status napi_set_last_error(node_api_nogc_env nogc_env, napi_status error_code, uint32_t engine_error_code = 0, void* engine_reserved = nullptr) { + napi_env env = const_cast(nogc_env); env->last_error.error_code = error_code; env->last_error.engine_error_code = engine_error_code; env->last_error.engine_reserved = engine_reserved; @@ -212,6 +214,12 @@ inline napi_status napi_set_last_error(napi_env env, } \ } while (0) +#define CHECK_ENV_NOT_IN_GC(env) \ + do { \ + CHECK_ENV((env)); \ + (env)->CheckGCAccess(); \ + } while (0) + #define CHECK_ARG(env, arg) \ RETURN_STATUS_IF_FALSE((env), ((arg) != nullptr), napi_invalid_arg) @@ -227,8 +235,7 @@ inline napi_status napi_set_last_error(napi_env env, // NAPI_PREAMBLE is not wrapped in do..while: try_catch must have function scope #define NAPI_PREAMBLE(env) \ - CHECK_ENV((env)); \ - (env)->CheckGCAccess(); \ + CHECK_ENV_NOT_IN_GC((env)); \ RETURN_STATUS_IF_FALSE( \ (env), (env)->last_exception.IsEmpty(), napi_pending_exception); \ RETURN_STATUS_IF_FALSE((env), \ diff --git a/src/json_parser.cc b/src/json_parser.cc index 1e19e174833fa5..1b445193bc8ceb 100644 --- a/src/json_parser.cc +++ b/src/json_parser.cc @@ -11,16 +11,17 @@ using v8::Object; using v8::String; using v8::Value; -JSONParser::JSONParser() - : handle_scope_(isolate_.get()), - context_(isolate_.get(), Context::New(isolate_.get())), - context_scope_(context_.Get(isolate_.get())) {} +JSONParser::JSONParser() {} bool JSONParser::Parse(const std::string& content) { DCHECK(!parsed_); Isolate* isolate = isolate_.get(); - Local context = context_.Get(isolate); + v8::Isolate::Scope isolate_scope(isolate); + v8::HandleScope handle_scope(isolate); + + Local context = Context::New(isolate); + Context::Scope context_scope(context); // It's not a real script, so don't print the source line. errors::PrinterTryCatch bootstrapCatch( @@ -34,16 +35,25 @@ bool JSONParser::Parse(const std::string& content) { !result_value->IsObject()) { return false; } + + context_.Reset(isolate, context); content_.Reset(isolate, result_value.As()); parsed_ = true; + return true; } std::optional JSONParser::GetTopLevelStringField( std::string_view field) { Isolate* isolate = isolate_.get(); + v8::Isolate::Scope isolate_scope(isolate); + v8::HandleScope handle_scope(isolate); + Local context = context_.Get(isolate); + Context::Scope context_scope(context); + Local content_object = content_.Get(isolate); + Local value; // It's not a real script, so don't print the source line. errors::PrinterTryCatch bootstrapCatch( @@ -62,7 +72,12 @@ std::optional JSONParser::GetTopLevelStringField( std::optional JSONParser::GetTopLevelBoolField(std::string_view field) { Isolate* isolate = isolate_.get(); + v8::Isolate::Scope isolate_scope(isolate); + v8::HandleScope handle_scope(isolate); + Local context = context_.Get(isolate); + Context::Scope context_scope(context); + Local content_object = content_.Get(isolate); Local value; bool has_field; diff --git a/src/json_parser.h b/src/json_parser.h index f2e7d592d9aaa7..9e6c00ef8d8712 100644 --- a/src/json_parser.h +++ b/src/json_parser.h @@ -24,10 +24,9 @@ class JSONParser { private: // We might want a lighter-weight JSON parser for this use case. But for now // using V8 is good enough. - RAIIIsolate isolate_; - v8::HandleScope handle_scope_; + RAIIIsolateWithoutEntering isolate_; + v8::Global context_; - v8::Context::Scope context_scope_; v8::Global content_; bool parsed_ = false; }; diff --git a/src/module_wrap.cc b/src/module_wrap.cc index 99802b372f432f..742f3960c881b9 100644 --- a/src/module_wrap.cc +++ b/src/module_wrap.cc @@ -39,6 +39,7 @@ using v8::MicrotaskQueue; using v8::Module; using v8::ModuleRequest; using v8::Object; +using v8::ObjectTemplate; using v8::PrimitiveArray; using v8::Promise; using v8::ScriptCompiler; @@ -49,15 +50,17 @@ using v8::UnboundModuleScript; using v8::Undefined; using v8::Value; -ModuleWrap::ModuleWrap(Environment* env, +ModuleWrap::ModuleWrap(Realm* realm, Local object, Local module, Local url, Local context_object, Local synthetic_evaluation_step) - : BaseObject(env, object), - module_(env->isolate(), module), + : BaseObject(realm, object), + module_(realm->isolate(), module), module_hash_(module->GetIdentityHash()) { + realm->env()->hash_to_module_map.emplace(module_hash_, this); + object->SetInternalField(kModuleSlot, module); object->SetInternalField(kURLSlot, url); object->SetInternalField(kSyntheticEvaluationStepsSlot, @@ -72,7 +75,6 @@ ModuleWrap::ModuleWrap(Environment* env, } ModuleWrap::~ModuleWrap() { - HandleScope scope(env()->isolate()); auto range = env()->hash_to_module_map.equal_range(module_hash_); for (auto it = range.first; it != range.second; ++it) { if (it->second == this) { @@ -87,7 +89,7 @@ Local ModuleWrap::context() const { // If this fails, there is likely a bug e.g. ModuleWrap::context() is accessed // before the ModuleWrap constructor completes. CHECK(obj->IsObject()); - return obj.As()->GetCreationContext().ToLocalChecked(); + return obj.As()->GetCreationContextChecked(); } ModuleWrap* ModuleWrap::GetFromModule(Environment* env, @@ -107,8 +109,8 @@ void ModuleWrap::New(const FunctionCallbackInfo& args) { CHECK(args.IsConstructCall()); CHECK_GE(args.Length(), 3); - Environment* env = Environment::GetCurrent(args); - Isolate* isolate = env->isolate(); + Realm* realm = Realm::GetCurrent(args); + Isolate* isolate = realm->isolate(); Local that = args.This(); @@ -122,7 +124,7 @@ void ModuleWrap::New(const FunctionCallbackInfo& args) { } else { CHECK(args[1]->IsObject()); contextify_context = ContextifyContext::ContextFromContextifiedSandbox( - env, args[1].As()); + realm->env(), args[1].As()); CHECK_NOT_NULL(contextify_context); context = contextify_context->context(); } @@ -148,8 +150,8 @@ void ModuleWrap::New(const FunctionCallbackInfo& args) { Local id_symbol = Symbol::New(isolate, url); host_defined_options->Set(isolate, HostDefinedOptions::kID, id_symbol); - ShouldNotAbortOnUncaughtScope no_abort_scope(env); - TryCatchScope try_catch(env); + ShouldNotAbortOnUncaughtScope no_abort_scope(realm->env()); + TryCatchScope try_catch(realm->env()); Local module; @@ -206,7 +208,9 @@ void ModuleWrap::New(const FunctionCallbackInfo& args) { if (try_catch.HasCaught() && !try_catch.HasTerminated()) { CHECK(!try_catch.Message().IsEmpty()); CHECK(!try_catch.Exception().IsEmpty()); - AppendExceptionLine(env, try_catch.Exception(), try_catch.Message(), + AppendExceptionLine(realm->env(), + try_catch.Exception(), + try_catch.Message(), ErrorHandlingMode::MODULE_ERROR); try_catch.ReThrow(); } @@ -215,18 +219,21 @@ void ModuleWrap::New(const FunctionCallbackInfo& args) { if (options == ScriptCompiler::kConsumeCodeCache && source.GetCachedData()->rejected) { THROW_ERR_VM_MODULE_CACHED_DATA_REJECTED( - env, "cachedData buffer was rejected"); + realm, "cachedData buffer was rejected"); try_catch.ReThrow(); return; } } } - if (!that->Set(context, env->url_string(), url).FromMaybe(false)) { + if (!that->Set(context, realm->isolate_data()->url_string(), url) + .FromMaybe(false)) { return; } - if (that->SetPrivate(context, env->host_defined_option_symbol(), id_symbol) + if (that->SetPrivate(context, + realm->isolate_data()->host_defined_option_symbol(), + id_symbol) .IsNothing()) { return; } @@ -236,28 +243,30 @@ void ModuleWrap::New(const FunctionCallbackInfo& args) { // be stored in an internal field. Local context_object = context->GetExtrasBindingObject(); Local synthetic_evaluation_step = - synthetic ? args[3] : Undefined(env->isolate()).As(); + synthetic ? args[3] : Undefined(realm->isolate()).As(); ModuleWrap* obj = new ModuleWrap( - env, that, module, url, context_object, synthetic_evaluation_step); + realm, that, module, url, context_object, synthetic_evaluation_step); obj->contextify_context_ = contextify_context; - env->hash_to_module_map.emplace(module->GetIdentityHash(), obj); - that->SetIntegrityLevel(context, IntegrityLevel::kFrozen); args.GetReturnValue().Set(that); } static Local createImportAttributesContainer( - Environment* env, Isolate* isolate, Local raw_attributes) { + Realm* realm, + Isolate* isolate, + Local raw_attributes, + const int elements_per_attribute) { + CHECK_EQ(raw_attributes->Length() % elements_per_attribute, 0); Local attributes = - Object::New(isolate, v8::Null(env->isolate()), nullptr, nullptr, 0); - for (int i = 0; i < raw_attributes->Length(); i += 3) { + Object::New(isolate, v8::Null(isolate), nullptr, nullptr, 0); + for (int i = 0; i < raw_attributes->Length(); i += elements_per_attribute) { attributes - ->Set(env->context(), - raw_attributes->Get(env->context(), i).As(), - raw_attributes->Get(env->context(), i + 1).As()) + ->Set(realm->context(), + raw_attributes->Get(realm->context(), i).As(), + raw_attributes->Get(realm->context(), i + 1).As()) .ToChecked(); } @@ -265,7 +274,7 @@ static Local createImportAttributesContainer( } void ModuleWrap::Link(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); + Realm* realm = Realm::GetCurrent(args); Isolate* isolate = args.GetIsolate(); CHECK_EQ(args.Length(), 1); @@ -292,14 +301,14 @@ void ModuleWrap::Link(const FunctionCallbackInfo& args) { // call the dependency resolve callbacks for (int i = 0; i < module_requests_length; i++) { Local module_request = - module_requests->Get(env->context(), i).As(); + module_requests->Get(realm->context(), i).As(); Local specifier = module_request->GetSpecifier(); - Utf8Value specifier_utf8(env->isolate(), specifier); + Utf8Value specifier_utf8(realm->isolate(), specifier); std::string specifier_std(*specifier_utf8, specifier_utf8.length()); Local raw_attributes = module_request->GetImportAssertions(); Local attributes = - createImportAttributesContainer(env, isolate, raw_attributes); + createImportAttributesContainer(realm, isolate, raw_attributes, 3); Local argv[] = { specifier, @@ -315,11 +324,11 @@ void ModuleWrap::Link(const FunctionCallbackInfo& args) { maybe_resolve_return_value.ToLocalChecked(); if (!resolve_return_value->IsPromise()) { THROW_ERR_VM_MODULE_LINK_FAILURE( - env, "request for '%s' did not return promise", specifier_std); + realm, "request for '%s' did not return promise", specifier_std); return; } Local resolve_promise = resolve_return_value.As(); - obj->resolve_cache_[specifier_std].Reset(env->isolate(), resolve_promise); + obj->resolve_cache_[specifier_std].Reset(isolate, resolve_promise); promises[i] = resolve_promise; } @@ -329,13 +338,13 @@ void ModuleWrap::Link(const FunctionCallbackInfo& args) { } void ModuleWrap::Instantiate(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); + Realm* realm = Realm::GetCurrent(args); Isolate* isolate = args.GetIsolate(); ModuleWrap* obj; ASSIGN_OR_RETURN_UNWRAP(&obj, args.This()); Local context = obj->context(); Local module = obj->module_.Get(isolate); - TryCatchScope try_catch(env); + TryCatchScope try_catch(realm->env()); USE(module->InstantiateModule(context, ResolveModuleCallback)); // clear resolve cache on instantiate @@ -344,7 +353,9 @@ void ModuleWrap::Instantiate(const FunctionCallbackInfo& args) { if (try_catch.HasCaught() && !try_catch.HasTerminated()) { CHECK(!try_catch.Message().IsEmpty()); CHECK(!try_catch.Exception().IsEmpty()); - AppendExceptionLine(env, try_catch.Exception(), try_catch.Message(), + AppendExceptionLine(realm->env(), + try_catch.Exception(), + try_catch.Message(), ErrorHandlingMode::MODULE_ERROR); try_catch.ReThrow(); return; @@ -352,8 +363,8 @@ void ModuleWrap::Instantiate(const FunctionCallbackInfo& args) { } void ModuleWrap::Evaluate(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); - Isolate* isolate = env->isolate(); + Realm* realm = Realm::GetCurrent(args); + Isolate* isolate = realm->isolate(); ModuleWrap* obj; ASSIGN_OR_RETURN_UNWRAP(&obj, args.This()); Local context = obj->context(); @@ -368,14 +379,14 @@ void ModuleWrap::Evaluate(const FunctionCallbackInfo& args) { CHECK_EQ(args.Length(), 2); CHECK(args[0]->IsNumber()); - int64_t timeout = args[0]->IntegerValue(env->context()).FromJust(); + int64_t timeout = args[0]->IntegerValue(realm->context()).FromJust(); CHECK(args[1]->IsBoolean()); bool break_on_sigint = args[1]->IsTrue(); - ShouldNotAbortOnUncaughtScope no_abort_scope(env); - TryCatchScope try_catch(env); - Isolate::SafeForTerminationScope safe_for_termination(env->isolate()); + ShouldNotAbortOnUncaughtScope no_abort_scope(realm->env()); + TryCatchScope try_catch(realm->env()); + Isolate::SafeForTerminationScope safe_for_termination(isolate); bool timed_out = false; bool received_signal = false; @@ -406,16 +417,15 @@ void ModuleWrap::Evaluate(const FunctionCallbackInfo& args) { // Convert the termination exception into a regular exception. if (timed_out || received_signal) { - if (!env->is_main_thread() && env->is_stopping()) - return; - env->isolate()->CancelTerminateExecution(); + if (!realm->env()->is_main_thread() && realm->env()->is_stopping()) return; + isolate->CancelTerminateExecution(); // It is possible that execution was terminated by another timeout in // which this timeout is nested, so check whether one of the watchdogs // from this invocation is responsible for termination. if (timed_out) { - THROW_ERR_SCRIPT_EXECUTION_TIMEOUT(env, timeout); + THROW_ERR_SCRIPT_EXECUTION_TIMEOUT(realm->env(), timeout); } else if (received_signal) { - THROW_ERR_SCRIPT_EXECUTION_INTERRUPTED(env); + THROW_ERR_SCRIPT_EXECUTION_INTERRUPTED(realm->env()); } } @@ -429,7 +439,7 @@ void ModuleWrap::Evaluate(const FunctionCallbackInfo& args) { } void ModuleWrap::GetNamespace(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); + Realm* realm = Realm::GetCurrent(args); Isolate* isolate = args.GetIsolate(); ModuleWrap* obj; ASSIGN_OR_RETURN_UNWRAP(&obj, args.This()); @@ -439,7 +449,7 @@ void ModuleWrap::GetNamespace(const FunctionCallbackInfo& args) { switch (module->GetStatus()) { case v8::Module::Status::kUninstantiated: case v8::Module::Status::kInstantiating: - return env->ThrowError( + return realm->env()->ThrowError( "cannot get namespace, module has not been instantiated"); case v8::Module::Status::kInstantiated: case v8::Module::Status::kEvaluating: @@ -466,11 +476,11 @@ void ModuleWrap::GetStatus(const FunctionCallbackInfo& args) { void ModuleWrap::GetStaticDependencySpecifiers( const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); + Realm* realm = Realm::GetCurrent(args); ModuleWrap* obj; ASSIGN_OR_RETURN_UNWRAP(&obj, args.This()); - Local module = obj->module_.Get(env->isolate()); + Local module = obj->module_.Get(realm->isolate()); Local module_requests = module->GetModuleRequests(); int count = module_requests->Length(); @@ -479,12 +489,12 @@ void ModuleWrap::GetStaticDependencySpecifiers( for (int i = 0; i < count; i++) { Local module_request = - module_requests->Get(env->context(), i).As(); + module_requests->Get(realm->context(), i).As(); specifiers[i] = module_request->GetSpecifier(); } args.GetReturnValue().Set( - Array::New(env->isolate(), specifiers.out(), count)); + Array::New(realm->isolate(), specifiers.out(), count)); } void ModuleWrap::GetError(const FunctionCallbackInfo& args) { @@ -501,15 +511,13 @@ MaybeLocal ModuleWrap::ResolveModuleCallback( Local specifier, Local import_attributes, Local referrer) { + Isolate* isolate = context->GetIsolate(); Environment* env = Environment::GetCurrent(context); if (env == nullptr) { - Isolate* isolate = context->GetIsolate(); THROW_ERR_EXECUTION_ENVIRONMENT_NOT_AVAILABLE(isolate); return MaybeLocal(); } - Isolate* isolate = env->isolate(); - Utf8Value specifier_utf8(isolate, specifier); std::string specifier_std(*specifier_utf8, specifier_utf8.length()); @@ -559,29 +567,32 @@ static MaybeLocal ImportModuleDynamically( THROW_ERR_EXECUTION_ENVIRONMENT_NOT_AVAILABLE(isolate); return MaybeLocal(); } + Realm* realm = Realm::GetCurrent(context); + if (realm == nullptr) { + // Fallback to the principal realm if it's in a vm context. + realm = env->principal_realm(); + } EscapableHandleScope handle_scope(isolate); Local import_callback = - env->host_import_module_dynamically_callback(); + realm->host_import_module_dynamically_callback(); + Local id; Local options = host_defined_options.As(); - if (options->Length() != HostDefinedOptions::kLength) { - Local resolver; - if (!Promise::Resolver::New(context).ToLocal(&resolver)) return {}; - resolver - ->Reject(context, - v8::Exception::TypeError(FIXED_ONE_BYTE_STRING( - context->GetIsolate(), "Invalid host defined options"))) - .ToChecked(); - return handle_scope.Escape(resolver->GetPromise()); + // Get referrer id symbol from the host-defined options. + // If the host-defined options are empty, get the referrer id symbol + // from the realm global object. + if (options->Length() == HostDefinedOptions::kLength) { + id = options->Get(context, HostDefinedOptions::kID).As(); + } else { + id = context->Global() + ->GetPrivate(context, env->host_defined_option_symbol()) + .ToLocalChecked(); } - Local id = - options->Get(context, HostDefinedOptions::kID).As(); - Local attributes = - createImportAttributesContainer(env, isolate, import_attributes); + createImportAttributesContainer(realm, isolate, import_attributes, 2); Local import_args[] = { id, @@ -605,13 +616,13 @@ static MaybeLocal ImportModuleDynamically( void ModuleWrap::SetImportModuleDynamicallyCallback( const FunctionCallbackInfo& args) { Isolate* isolate = args.GetIsolate(); - Environment* env = Environment::GetCurrent(args); + Realm* realm = Realm::GetCurrent(args); HandleScope handle_scope(isolate); CHECK_EQ(args.Length(), 1); CHECK(args[0]->IsFunction()); Local import_callback = args[0].As(); - env->set_host_import_module_dynamically_callback(import_callback); + realm->set_host_import_module_dynamically_callback(import_callback); isolate->SetHostImportModuleDynamicallyCallback(ImportModuleDynamically); } @@ -626,10 +637,15 @@ void ModuleWrap::HostInitializeImportMetaObjectCallback( if (module_wrap == nullptr) { return; } + Realm* realm = Realm::GetCurrent(context); + if (realm == nullptr) { + // Fallback to the principal realm if it's in a vm context. + realm = env->principal_realm(); + } Local wrap = module_wrap->object(); Local callback = - env->host_initialize_import_meta_object_callback(); + realm->host_initialize_import_meta_object_callback(); Local id; if (!wrap->GetPrivate(context, env->host_defined_option_symbol()) .ToLocal(&id)) { @@ -639,7 +655,7 @@ void ModuleWrap::HostInitializeImportMetaObjectCallback( Local args[] = {id, meta}; TryCatchScope try_catch(env); USE(callback->Call( - context, Undefined(env->isolate()), arraysize(args), args)); + context, Undefined(realm->isolate()), arraysize(args), args)); if (try_catch.HasCaught() && !try_catch.HasTerminated()) { try_catch.ReThrow(); } @@ -647,13 +663,13 @@ void ModuleWrap::HostInitializeImportMetaObjectCallback( void ModuleWrap::SetInitializeImportMetaObjectCallback( const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); - Isolate* isolate = env->isolate(); + Realm* realm = Realm::GetCurrent(args); + Isolate* isolate = realm->isolate(); CHECK_EQ(args.Length(), 1); CHECK(args[0]->IsFunction()); Local import_meta_callback = args[0].As(); - env->set_host_initialize_import_meta_object_callback(import_meta_callback); + realm->set_host_initialize_import_meta_object_callback(import_meta_callback); isolate->SetHostInitializeImportMetaObjectCallback( HostInitializeImportMetaObjectCallback); @@ -744,12 +760,9 @@ void ModuleWrap::CreateCachedData(const FunctionCallbackInfo& args) { } } -void ModuleWrap::Initialize(Local target, - Local unused, - Local context, - void* priv) { - Environment* env = Environment::GetCurrent(context); - Isolate* isolate = env->isolate(); +void ModuleWrap::CreatePerIsolateProperties(IsolateData* isolate_data, + Local target) { + Isolate* isolate = isolate_data->isolate(); Local tpl = NewFunctionTemplate(isolate, New); tpl->InstanceTemplate()->SetInternalFieldCount( @@ -769,28 +782,36 @@ void ModuleWrap::Initialize(Local target, "getStaticDependencySpecifiers", GetStaticDependencySpecifiers); - SetConstructorFunction(context, target, "ModuleWrap", tpl); + SetConstructorFunction(isolate, target, "ModuleWrap", tpl); - SetMethod(context, + SetMethod(isolate, target, "setImportModuleDynamicallyCallback", SetImportModuleDynamicallyCallback); - SetMethod(context, + SetMethod(isolate, target, "setInitializeImportMetaObjectCallback", SetInitializeImportMetaObjectCallback); +} +void ModuleWrap::CreatePerContextProperties(Local target, + Local unused, + Local context, + void* priv) { + Realm* realm = Realm::GetCurrent(context); + Isolate* isolate = realm->isolate(); #define V(name) \ - target->Set(context, \ - FIXED_ONE_BYTE_STRING(env->isolate(), #name), \ - Integer::New(env->isolate(), Module::Status::name)) \ - .FromJust() - V(kUninstantiated); - V(kInstantiating); - V(kInstantiated); - V(kEvaluating); - V(kEvaluated); - V(kErrored); + target \ + ->Set(context, \ + FIXED_ONE_BYTE_STRING(isolate, #name), \ + Integer::New(isolate, Module::Status::name)) \ + .FromJust() + V(kUninstantiated); + V(kInstantiating); + V(kInstantiated); + V(kEvaluating); + V(kEvaluated); + V(kErrored); #undef V } @@ -814,7 +835,9 @@ void ModuleWrap::RegisterExternalReferences( } // namespace loader } // namespace node -NODE_BINDING_CONTEXT_AWARE_INTERNAL(module_wrap, - node::loader::ModuleWrap::Initialize) +NODE_BINDING_CONTEXT_AWARE_INTERNAL( + module_wrap, node::loader::ModuleWrap::CreatePerContextProperties) +NODE_BINDING_PER_ISOLATE_INIT( + module_wrap, node::loader::ModuleWrap::CreatePerIsolateProperties) NODE_BINDING_EXTERNAL_REFERENCE( module_wrap, node::loader::ModuleWrap::RegisterExternalReferences) diff --git a/src/module_wrap.h b/src/module_wrap.h index 1fc801edced9c5..e17048357feca2 100644 --- a/src/module_wrap.h +++ b/src/module_wrap.h @@ -10,6 +10,7 @@ namespace node { +class IsolateData; class Environment; class ExternalReferenceRegistry; @@ -40,10 +41,12 @@ class ModuleWrap : public BaseObject { kInternalFieldCount }; - static void Initialize(v8::Local target, - v8::Local unused, - v8::Local context, - void* priv); + static void CreatePerIsolateProperties(IsolateData* isolate_data, + v8::Local target); + static void CreatePerContextProperties(v8::Local target, + v8::Local unused, + v8::Local context, + void* priv); static void RegisterExternalReferences(ExternalReferenceRegistry* registry); static void HostInitializeImportMetaObjectCallback( v8::Local context, @@ -66,7 +69,7 @@ class ModuleWrap : public BaseObject { } private: - ModuleWrap(Environment* env, + ModuleWrap(Realm* realm, v8::Local object, v8::Local module, v8::Local url, diff --git a/src/node.cc b/src/node.cc index a9336a14304fc6..cec88c4f4ecd84 100644 --- a/src/node.cc +++ b/src/node.cc @@ -258,12 +258,19 @@ void Environment::InitializeDiagnostics() { if (options_->trace_uncaught) isolate_->SetCaptureStackTraceForUncaughtExceptions(true); if (options_->trace_atomics_wait) { + ProcessEmitDeprecationWarning( + Environment::GetCurrent(isolate_), + "The flag --trace-atomics-wait is deprecated.", + "DEP0165"); isolate_->SetAtomicsWaitCallback(AtomicsWaitCallback, this); AddCleanupHook([](void* data) { Environment* env = static_cast(data); env->isolate()->SetAtomicsWaitCallback(nullptr, nullptr); }, this); } + if (options_->trace_promises) { + isolate_->SetPromiseHook(TracePromises); + } } static @@ -866,7 +873,9 @@ static ExitCode InitializeNodeWithArgsInternal( for (const auto& file_path : file_paths) { std::string path = cwd + kPathSeparator + file_path; - per_process::dotenv_file.ParsePath(path); + auto path_exists = per_process::dotenv_file.ParsePath(path); + + if (!path_exists) errors->push_back(file_path + ": not found"); } per_process::dotenv_file.AssignNodeOptionsIfAvailable(&node_options); @@ -1204,10 +1213,39 @@ ExitCode GenerateAndWriteSnapshotData(const SnapshotData** snapshot_data_ptr, // nullptr indicates there's no snapshot data. DCHECK_NULL(*snapshot_data_ptr); + SnapshotConfig snapshot_config; + const std::string& config_path = + per_process::cli_options->per_isolate->build_snapshot_config; + // For snapshot config read from JSON, we fix up process.argv[1] using the + // "builder" field. + std::vector args_maybe_patched; + args_maybe_patched.reserve(result->args().size() + 1); + if (!config_path.empty()) { + std::optional optional_config = + ReadSnapshotConfig(config_path.c_str()); + if (!optional_config.has_value()) { + return ExitCode::kGenericUserError; + } + snapshot_config = std::move(optional_config.value()); + DCHECK(snapshot_config.builder_script_path.has_value()); + args_maybe_patched.emplace_back(result->args()[0]); + args_maybe_patched.emplace_back( + snapshot_config.builder_script_path.value()); + if (result->args().size() > 1) { + args_maybe_patched.insert(args_maybe_patched.end(), + result->args().begin() + 1, + result->args().end()); + } + } else { + snapshot_config.builder_script_path = result->args()[1]; + args_maybe_patched = result->args(); + } + DCHECK(snapshot_config.builder_script_path.has_value()); + const std::string& builder_script = + snapshot_config.builder_script_path.value(); // node:embedded_snapshot_main indicates that we are using the // embedded snapshot and we are not supposed to clean it up. - const std::string& main_script = result->args()[1]; - if (main_script == "node:embedded_snapshot_main") { + if (builder_script == "node:embedded_snapshot_main") { *snapshot_data_ptr = SnapshotBuilder::GetEmbeddedSnapshotData(); if (*snapshot_data_ptr == nullptr) { // The Node.js binary is built without embedded snapshot @@ -1219,24 +1257,25 @@ ExitCode GenerateAndWriteSnapshotData(const SnapshotData** snapshot_data_ptr, return exit_code; } } else { - // Otherwise, load and run the specified main script. + // Otherwise, load and run the specified builder script. std::unique_ptr generated_data = std::make_unique(); - std::string main_script_content; - int r = ReadFileSync(&main_script_content, main_script.c_str()); + std::string builder_script_content; + int r = ReadFileSync(&builder_script_content, builder_script.c_str()); if (r != 0) { FPrintF(stderr, - "Cannot read main script %s for building snapshot. %s: %s", - main_script, + "Cannot read builder script %s for building snapshot. %s: %s", + builder_script, uv_err_name(r), uv_strerror(r)); return ExitCode::kGenericUserError; } exit_code = node::SnapshotBuilder::Generate(generated_data.get(), - result->args(), + args_maybe_patched, result->exec_args(), - main_script_content); + builder_script_content, + snapshot_config); if (exit_code == ExitCode::kNoFailure) { *snapshot_data_ptr = generated_data.release(); } else { @@ -1366,7 +1405,8 @@ static ExitCode StartInternal(int argc, char** argv) { // --build-snapshot indicates that we are in snapshot building mode. if (per_process::cli_options->per_isolate->build_snapshot) { - if (result->args().size() < 2) { + if (per_process::cli_options->per_isolate->build_snapshot_config.empty() && + result->args().size() < 2) { fprintf(stderr, "--build-snapshot must be used with an entry point script.\n" "Usage: node --build-snapshot /path/to/entry.js\n"); diff --git a/src/node.h b/src/node.h index f2740116a4710b..bf3382f4c952ca 100644 --- a/src/node.h +++ b/src/node.h @@ -80,6 +80,7 @@ #include #include +#include #include // We cannot use __POSIX__ in this header because that's only defined when @@ -659,6 +660,33 @@ enum Flags : uint64_t { }; } // namespace EnvironmentFlags +enum class SnapshotFlags : uint32_t { + kDefault = 0, + // Whether code cache should be generated as part of the snapshot. + // Code cache reduces the time spent on compiling functions included + // in the snapshot at the expense of a bigger snapshot size and + // potentially breaking portability of the snapshot. + kWithoutCodeCache = 1 << 0, +}; + +struct SnapshotConfig { + SnapshotFlags flags = SnapshotFlags::kDefault; + + // When builder_script_path is std::nullopt, the snapshot is generated as a + // built-in snapshot instead of a custom one, and it's expected that the + // built-in snapshot only contains states that reproduce in every run of the + // application. The event loop won't be run when generating a built-in + // snapshot, so asynchronous operations should be avoided. + // + // When builder_script_path is an std::string, it should match args[1] + // passed to CreateForSnapshotting(). The embedder is also expected to use + // LoadEnvironment() to run a script matching this path. In that case the + // snapshot is generated as a custom snapshot and the event loop is run, so + // the snapshot builder can execute asynchronous operations as long as they + // are run to completion when the snapshot is taken. + std::optional builder_script_path; +}; + struct InspectorParentHandle { virtual ~InspectorParentHandle() = default; }; @@ -870,7 +898,8 @@ class NODE_EXTERN CommonEnvironmentSetup { MultiIsolatePlatform* platform, std::vector* errors, const std::vector& args = {}, - const std::vector& exec_args = {}); + const std::vector& exec_args = {}, + const SnapshotConfig& snapshot_config = {}); EmbedderSnapshotData::Pointer CreateSnapshot(); struct uv_loop_s* event_loop() const; @@ -905,7 +934,8 @@ class NODE_EXTERN CommonEnvironmentSetup { std::vector*, const EmbedderSnapshotData*, uint32_t flags, - std::function); + std::function, + const SnapshotConfig* config = nullptr); }; // Implementation for CommonEnvironmentSetup::Create diff --git a/src/node_api.cc b/src/node_api.cc index 23e9fedf8b146e..80b1610a3cc679 100644 --- a/src/node_api.cc +++ b/src/node_api.cc @@ -765,7 +765,7 @@ void NAPI_CDECL napi_module_register(napi_module* mod) { node::node_module_register(nm); } -napi_status NAPI_CDECL napi_add_env_cleanup_hook(napi_env env, +napi_status NAPI_CDECL napi_add_env_cleanup_hook(node_api_nogc_env env, napi_cleanup_hook fun, void* arg) { CHECK_ENV(env); @@ -776,7 +776,7 @@ napi_status NAPI_CDECL napi_add_env_cleanup_hook(napi_env env, return napi_ok; } -napi_status NAPI_CDECL napi_remove_env_cleanup_hook(napi_env env, +napi_status NAPI_CDECL napi_remove_env_cleanup_hook(node_api_nogc_env env, napi_cleanup_hook fun, void* arg) { CHECK_ENV(env); @@ -823,10 +823,11 @@ struct napi_async_cleanup_hook_handle__ { }; napi_status NAPI_CDECL -napi_add_async_cleanup_hook(napi_env env, +napi_add_async_cleanup_hook(node_api_nogc_env nogc_env, napi_async_cleanup_hook hook, void* arg, napi_async_cleanup_hook_handle* remove_handle) { + napi_env env = const_cast(nogc_env); CHECK_ENV(env); CHECK_ARG(env, hook); @@ -917,8 +918,7 @@ napi_status NAPI_CDECL napi_async_init(napi_env env, napi_value async_resource, napi_value async_resource_name, napi_async_context* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, async_resource_name); CHECK_ARG(env, result); @@ -951,8 +951,7 @@ napi_status NAPI_CDECL napi_async_init(napi_env env, napi_status NAPI_CDECL napi_async_destroy(napi_env env, napi_async_context async_context) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, async_context); v8impl::AsyncContext* node_async_context = @@ -1039,12 +1038,14 @@ napi_status NAPI_CDECL napi_create_buffer(napi_env env, return GET_RETURN_STATUS(env); } -napi_status NAPI_CDECL napi_create_external_buffer(napi_env env, - size_t length, - void* data, - napi_finalize finalize_cb, - void* finalize_hint, - napi_value* result) { +napi_status NAPI_CDECL +napi_create_external_buffer(napi_env env, + size_t length, + void* data, + node_api_nogc_finalize nogc_finalize_cb, + void* finalize_hint, + napi_value* result) { + napi_finalize finalize_cb = reinterpret_cast(nogc_finalize_cb); NAPI_PREAMBLE(env); CHECK_ARG(env, result); @@ -1101,8 +1102,7 @@ napi_status NAPI_CDECL napi_create_buffer_copy(napi_env env, napi_status NAPI_CDECL napi_is_buffer(napi_env env, napi_value value, bool* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); CHECK_ARG(env, result); @@ -1114,8 +1114,7 @@ napi_status NAPI_CDECL napi_get_buffer_info(napi_env env, napi_value value, void** data, size_t* length) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, value); v8::Local buffer = v8impl::V8LocalValueFromJsValue(value); @@ -1130,7 +1129,7 @@ napi_status NAPI_CDECL napi_get_buffer_info(napi_env env, return napi_clear_last_error(env); } -napi_status NAPI_CDECL napi_get_node_version(napi_env env, +napi_status NAPI_CDECL napi_get_node_version(node_api_nogc_env env, const napi_node_version** result) { CHECK_ENV(env); CHECK_ARG(env, result); @@ -1236,8 +1235,7 @@ napi_create_async_work(napi_env env, napi_async_complete_callback complete, void* data, napi_async_work* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, execute); CHECK_ARG(env, result); @@ -1267,8 +1265,7 @@ napi_create_async_work(napi_env env, napi_status NAPI_CDECL napi_delete_async_work(napi_env env, napi_async_work work) { - CHECK_ENV(env); - env->CheckGCAccess(); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, work); uvimpl::Work::Delete(reinterpret_cast(work)); @@ -1276,14 +1273,16 @@ napi_status NAPI_CDECL napi_delete_async_work(napi_env env, return napi_clear_last_error(env); } -napi_status NAPI_CDECL napi_get_uv_event_loop(napi_env env, uv_loop_t** loop) { +napi_status NAPI_CDECL napi_get_uv_event_loop(node_api_nogc_env nogc_env, + uv_loop_t** loop) { + napi_env env = const_cast(nogc_env); CHECK_ENV(env); CHECK_ARG(env, loop); *loop = reinterpret_cast(env)->node_env()->event_loop(); return napi_clear_last_error(env); } -napi_status NAPI_CDECL napi_queue_async_work(napi_env env, +napi_status NAPI_CDECL napi_queue_async_work(node_api_nogc_env env, napi_async_work work) { CHECK_ENV(env); CHECK_ARG(env, work); @@ -1298,7 +1297,7 @@ napi_status NAPI_CDECL napi_queue_async_work(napi_env env, return napi_clear_last_error(env); } -napi_status NAPI_CDECL napi_cancel_async_work(napi_env env, +napi_status NAPI_CDECL napi_cancel_async_work(node_api_nogc_env env, napi_async_work work) { CHECK_ENV(env); CHECK_ARG(env, work); @@ -1318,12 +1317,13 @@ napi_create_threadsafe_function(napi_env env, size_t max_queue_size, size_t initial_thread_count, void* thread_finalize_data, - napi_finalize thread_finalize_cb, + node_api_nogc_finalize nogc_thread_finalize_cb, void* context, napi_threadsafe_function_call_js call_js_cb, napi_threadsafe_function* result) { - CHECK_ENV(env); - env->CheckGCAccess(); + napi_finalize thread_finalize_cb = + reinterpret_cast(nogc_thread_finalize_cb); + CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, async_resource_name); RETURN_STATUS_IF_FALSE(env, initial_thread_count > 0, napi_invalid_arg); CHECK_ARG(env, result); @@ -1404,20 +1404,21 @@ napi_status NAPI_CDECL napi_release_threadsafe_function( return reinterpret_cast(func)->Release(mode); } -napi_status NAPI_CDECL -napi_unref_threadsafe_function(napi_env env, napi_threadsafe_function func) { +napi_status NAPI_CDECL napi_unref_threadsafe_function( + node_api_nogc_env env, napi_threadsafe_function func) { CHECK_NOT_NULL(func); return reinterpret_cast(func)->Unref(); } -napi_status NAPI_CDECL -napi_ref_threadsafe_function(napi_env env, napi_threadsafe_function func) { +napi_status NAPI_CDECL napi_ref_threadsafe_function( + node_api_nogc_env env, napi_threadsafe_function func) { CHECK_NOT_NULL(func); return reinterpret_cast(func)->Ref(); } -napi_status NAPI_CDECL node_api_get_module_file_name(napi_env env, +napi_status NAPI_CDECL node_api_get_module_file_name(node_api_nogc_env nogc_env, const char** result) { + napi_env env = const_cast(nogc_env); CHECK_ENV(env); CHECK_ARG(env, result); diff --git a/src/node_api.h b/src/node_api.h index 49a23aed9c6e90..0074124dc6aa4f 100644 --- a/src/node_api.h +++ b/src/node_api.h @@ -131,7 +131,7 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_create_external_buffer(napi_env env, size_t length, void* data, - napi_finalize finalize_cb, + node_api_nogc_finalize finalize_cb, void* finalize_hint, napi_value* result); #endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED @@ -159,20 +159,20 @@ napi_create_async_work(napi_env env, napi_async_work* result); NAPI_EXTERN napi_status NAPI_CDECL napi_delete_async_work(napi_env env, napi_async_work work); -NAPI_EXTERN napi_status NAPI_CDECL napi_queue_async_work(napi_env env, +NAPI_EXTERN napi_status NAPI_CDECL napi_queue_async_work(node_api_nogc_env env, napi_async_work work); -NAPI_EXTERN napi_status NAPI_CDECL napi_cancel_async_work(napi_env env, +NAPI_EXTERN napi_status NAPI_CDECL napi_cancel_async_work(node_api_nogc_env env, napi_async_work work); // version management NAPI_EXTERN napi_status NAPI_CDECL -napi_get_node_version(napi_env env, const napi_node_version** version); +napi_get_node_version(node_api_nogc_env env, const napi_node_version** version); #if NAPI_VERSION >= 2 // Return the current libuv event loop for a given environment NAPI_EXTERN napi_status NAPI_CDECL -napi_get_uv_event_loop(napi_env env, struct uv_loop_s** loop); +napi_get_uv_event_loop(node_api_nogc_env env, struct uv_loop_s** loop); #endif // NAPI_VERSION >= 2 @@ -181,11 +181,11 @@ napi_get_uv_event_loop(napi_env env, struct uv_loop_s** loop); NAPI_EXTERN napi_status NAPI_CDECL napi_fatal_exception(napi_env env, napi_value err); -NAPI_EXTERN napi_status NAPI_CDECL -napi_add_env_cleanup_hook(napi_env env, napi_cleanup_hook fun, void* arg); +NAPI_EXTERN napi_status NAPI_CDECL napi_add_env_cleanup_hook( + node_api_nogc_env env, napi_cleanup_hook fun, void* arg); -NAPI_EXTERN napi_status NAPI_CDECL -napi_remove_env_cleanup_hook(napi_env env, napi_cleanup_hook fun, void* arg); +NAPI_EXTERN napi_status NAPI_CDECL napi_remove_env_cleanup_hook( + node_api_nogc_env env, napi_cleanup_hook fun, void* arg); NAPI_EXTERN napi_status NAPI_CDECL napi_open_callback_scope(napi_env env, @@ -209,7 +209,7 @@ napi_create_threadsafe_function(napi_env env, size_t max_queue_size, size_t initial_thread_count, void* thread_finalize_data, - napi_finalize thread_finalize_cb, + node_api_nogc_finalize thread_finalize_cb, void* context, napi_threadsafe_function_call_js call_js_cb, napi_threadsafe_function* result); @@ -228,18 +228,18 @@ napi_acquire_threadsafe_function(napi_threadsafe_function func); NAPI_EXTERN napi_status NAPI_CDECL napi_release_threadsafe_function( napi_threadsafe_function func, napi_threadsafe_function_release_mode mode); -NAPI_EXTERN napi_status NAPI_CDECL -napi_unref_threadsafe_function(napi_env env, napi_threadsafe_function func); +NAPI_EXTERN napi_status NAPI_CDECL napi_unref_threadsafe_function( + node_api_nogc_env env, napi_threadsafe_function func); -NAPI_EXTERN napi_status NAPI_CDECL -napi_ref_threadsafe_function(napi_env env, napi_threadsafe_function func); +NAPI_EXTERN napi_status NAPI_CDECL napi_ref_threadsafe_function( + node_api_nogc_env env, napi_threadsafe_function func); #endif // NAPI_VERSION >= 4 #if NAPI_VERSION >= 8 NAPI_EXTERN napi_status NAPI_CDECL -napi_add_async_cleanup_hook(napi_env env, +napi_add_async_cleanup_hook(node_api_nogc_env env, napi_async_cleanup_hook hook, void* arg, napi_async_cleanup_hook_handle* remove_handle); @@ -252,7 +252,7 @@ napi_remove_async_cleanup_hook(napi_async_cleanup_hook_handle remove_handle); #if NAPI_VERSION >= 9 NAPI_EXTERN napi_status NAPI_CDECL -node_api_get_module_file_name(napi_env env, const char** result); +node_api_get_module_file_name(node_api_nogc_env env, const char** result); #endif // NAPI_VERSION >= 9 diff --git a/src/node_binding.cc b/src/node_binding.cc index 97257d47c61738..8013d9a0bbf48b 100644 --- a/src/node_binding.cc +++ b/src/node_binding.cc @@ -49,6 +49,7 @@ V(js_stream) \ V(js_udp_wrap) \ V(messaging) \ + V(modules) \ V(module_wrap) \ V(mksnapshot) \ V(options) \ @@ -88,7 +89,8 @@ NODE_BUILTIN_STANDARD_BINDINGS(V) \ NODE_BUILTIN_OPENSSL_BINDINGS(V) \ NODE_BUILTIN_ICU_BINDINGS(V) \ - NODE_BUILTIN_PROFILER_BINDINGS(V) + NODE_BUILTIN_PROFILER_BINDINGS(V) \ + NODE_BUILTIN_QUIC_BINDINGS(V) // This is used to load built-in bindings. Instead of using // __attribute__((constructor)), we call the _register_ diff --git a/src/node_binding.h b/src/node_binding.h index 9f0692ca4e190b..094d14cb2ee6ac 100644 --- a/src/node_binding.h +++ b/src/node_binding.h @@ -30,6 +30,12 @@ static_assert(static_cast(NM_F_LINKED) == #define NODE_BUILTIN_ICU_BINDINGS(V) #endif +#if HAVE_OPENSSL && NODE_OPENSSL_HAS_QUIC +#define NODE_BUILTIN_QUIC_BINDINGS(V) V(quic) +#else +#define NODE_BUILTIN_QUIC_BINDINGS(V) +#endif + #define NODE_BINDINGS_WITH_PER_ISOLATE_INIT(V) \ V(async_wrap) \ V(blob) \ @@ -37,13 +43,18 @@ static_assert(static_cast(NM_F_LINKED) == V(contextify) \ V(encoding_binding) \ V(fs) \ + V(fs_dir) \ + V(messaging) \ V(mksnapshot) \ - V(timers) \ - V(process_methods) \ + V(modules) \ + V(module_wrap) \ V(performance) \ + V(process_methods) \ + V(timers) \ V(url) \ V(worker) \ - NODE_BUILTIN_ICU_BINDINGS(V) + NODE_BUILTIN_ICU_BINDINGS(V) \ + NODE_BUILTIN_QUIC_BINDINGS(V) #define NODE_BINDING_CONTEXT_AWARE_CPP(modname, regfunc, priv, flags) \ static node::node_module _module = { \ diff --git a/src/node_buffer.cc b/src/node_buffer.cc index ff041274f90d24..300060f9d24290 100644 --- a/src/node_buffer.cc +++ b/src/node_buffer.cc @@ -743,13 +743,17 @@ void SlowByteLengthUtf8(const FunctionCallbackInfo& args) { uint32_t FastByteLengthUtf8(Local receiver, const v8::FastOneByteString& source) { - uint32_t result = 0; + // For short inputs, the function call overhead to simdutf is maybe + // not worth it, reserve simdutf for long strings. + if (source.length > 128) { + return simdutf::utf8_length_from_latin1(source.data, source.length); + } uint32_t length = source.length; + uint32_t result = length; const uint8_t* data = reinterpret_cast(source.data); for (uint32_t i = 0; i < length; ++i) { result += (data[i] >> 7); } - result += length; return result; } diff --git a/src/node_builtins.cc b/src/node_builtins.cc index 84815969b6d1fa..bafd8d4b8581f0 100644 --- a/src/node_builtins.cc +++ b/src/node_builtins.cc @@ -680,37 +680,38 @@ void BuiltinLoader::CreatePerIsolateProperties(IsolateData* isolate_data, Local target) { Isolate* isolate = isolate_data->isolate(); - target->SetAccessor(isolate_data->config_string(), - ConfigStringGetter, - nullptr, - Local(), - DEFAULT, - None, - SideEffectType::kHasNoSideEffect); - - target->SetAccessor(FIXED_ONE_BYTE_STRING(isolate, "builtinIds"), - BuiltinIdsGetter, - nullptr, - Local(), - DEFAULT, - None, - SideEffectType::kHasNoSideEffect); - - target->SetAccessor(FIXED_ONE_BYTE_STRING(isolate, "builtinCategories"), - GetBuiltinCategories, - nullptr, - Local(), - DEFAULT, - None, - SideEffectType::kHasNoSideEffect); - - target->SetAccessor(FIXED_ONE_BYTE_STRING(isolate, "natives"), - GetNatives, - nullptr, - Local(), - DEFAULT, - None, - SideEffectType::kHasNoSideEffect); + target->SetNativeDataProperty(isolate_data->config_string(), + ConfigStringGetter, + nullptr, + Local(), + None, + DEFAULT, + SideEffectType::kHasNoSideEffect); + + target->SetNativeDataProperty(FIXED_ONE_BYTE_STRING(isolate, "builtinIds"), + BuiltinIdsGetter, + nullptr, + Local(), + None, + DEFAULT, + SideEffectType::kHasNoSideEffect); + + target->SetNativeDataProperty( + FIXED_ONE_BYTE_STRING(isolate, "builtinCategories"), + GetBuiltinCategories, + nullptr, + Local(), + None, + DEFAULT, + SideEffectType::kHasNoSideEffect); + + target->SetNativeDataProperty(FIXED_ONE_BYTE_STRING(isolate, "natives"), + GetNatives, + nullptr, + Local(), + None, + DEFAULT, + SideEffectType::kHasNoSideEffect); SetMethod(isolate, target, "getCacheUsage", BuiltinLoader::GetCacheUsage); SetMethod(isolate, target, "compileFunction", BuiltinLoader::CompileFunction); diff --git a/src/node_contextify.cc b/src/node_contextify.cc index 466c2d81c7e7a9..23b87657cee1bb 100644 --- a/src/node_contextify.cc +++ b/src/node_contextify.cc @@ -208,21 +208,24 @@ MaybeLocal ContextifyContext::CreateV8Context( Local ctx; if (snapshot_data == nullptr) { - ctx = Context::New(isolate, - nullptr, // extensions - object_template, - {}, // global object - {}, // deserialization callback - queue); + ctx = Context::New( + isolate, + nullptr, // extensions + object_template, + {}, // global object + v8::DeserializeInternalFieldsCallback(), // deserialization callback + queue); if (ctx.IsEmpty() || InitializeBaseContextForSnapshot(ctx).IsNothing()) { return MaybeLocal(); } - } else if (!Context::FromSnapshot(isolate, - SnapshotData::kNodeVMContextIndex, - {}, // deserialization callback - nullptr, // extensions - {}, // global object - queue) + } else if (!Context::FromSnapshot( + isolate, + SnapshotData::kNodeVMContextIndex, + v8::DeserializeInternalFieldsCallback(), // deserialization + // callback + nullptr, // extensions + {}, // global object + queue) .ToLocal(&ctx)) { return MaybeLocal(); } @@ -288,6 +291,19 @@ BaseObjectPtr ContextifyContext::New( .IsNothing()) { return BaseObjectPtr(); } + + // Assign host_defined_options_id to the global object so that in the + // callback of ImportModuleDynamically, we can get the + // host_defined_options_id from the v8::Context without accessing the + // wrapper object. + if (new_context_global + ->SetPrivate(v8_context, + env->host_defined_option_symbol(), + options->host_defined_options_id) + .IsNothing()) { + return BaseObjectPtr(); + } + env->AssignToContext(v8_context, nullptr, info); if (!env->contextify_wrapper_template() @@ -308,6 +324,16 @@ BaseObjectPtr ContextifyContext::New( .IsNothing()) { return BaseObjectPtr(); } + // Assign host_defined_options_id to the sandbox object so that module + // callbacks like importModuleDynamically can be registered once back to the + // JS land. + if (sandbox_obj + ->SetPrivate(v8_context, + env->host_defined_option_symbol(), + options->host_defined_options_id) + .IsNothing()) { + return BaseObjectPtr(); + } return result; } @@ -318,6 +344,7 @@ void ContextifyContext::CreatePerIsolateProperties( SetMethod(isolate, target, "makeContext", MakeContext); SetMethod(isolate, target, "isContext", IsContext); SetMethod(isolate, target, "compileFunction", CompileFunction); + SetMethod(isolate, target, "containsModuleSyntax", ContainsModuleSyntax); } void ContextifyContext::RegisterExternalReferences( @@ -325,6 +352,7 @@ void ContextifyContext::RegisterExternalReferences( registry->Register(MakeContext); registry->Register(IsContext); registry->Register(CompileFunction); + registry->Register(ContainsModuleSyntax); registry->Register(PropertyGetterCallback); registry->Register(PropertySetterCallback); registry->Register(PropertyDescriptorCallback); @@ -342,7 +370,7 @@ void ContextifyContext::RegisterExternalReferences( void ContextifyContext::MakeContext(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); - CHECK_EQ(args.Length(), 6); + CHECK_EQ(args.Length(), 7); CHECK(args[0]->IsObject()); Local sandbox = args[0].As(); @@ -373,6 +401,9 @@ void ContextifyContext::MakeContext(const FunctionCallbackInfo& args) { MicrotaskQueue::New(env->isolate(), MicrotasksPolicy::kExplicit); } + CHECK(args[6]->IsSymbol()); + options.host_defined_options_id = args[6].As(); + TryCatchScope try_catch(env); BaseObjectPtr context_ptr = ContextifyContext::New(env, sandbox, &options); @@ -771,11 +802,11 @@ void ContextifyScript::New(const FunctionCallbackInfo& args) { bool produce_cached_data = false; Local parsing_context = context; - bool needs_custom_host_defined_options = false; + Local id_symbol; if (argc > 2) { // new ContextifyScript(code, filename, lineOffset, columnOffset, // cachedData, produceCachedData, parsingContext, - // needsCustomHostDefinedOptions) + // hostDefinedOptionId) CHECK_EQ(argc, 8); CHECK(args[2]->IsNumber()); line_offset = args[2].As()->Value(); @@ -795,9 +826,8 @@ void ContextifyScript::New(const FunctionCallbackInfo& args) { CHECK_NOT_NULL(sandbox); parsing_context = sandbox->context(); } - if (args[7]->IsTrue()) { - needs_custom_host_defined_options = true; - } + CHECK(args[7]->IsSymbol()); + id_symbol = args[7].As(); } ContextifyScript* contextify_script = @@ -821,12 +851,6 @@ void ContextifyScript::New(const FunctionCallbackInfo& args) { Local host_defined_options = PrimitiveArray::New(isolate, loader::HostDefinedOptions::kLength); - // We need a default host defined options that's the same for all scripts - // not needing custom module callbacks for so that the isolate compilation - // cache can be hit. - Local id_symbol = needs_custom_host_defined_options - ? Symbol::New(isolate, filename) - : env->default_host_defined_options(); host_defined_options->Set( isolate, loader::HostDefinedOptions::kID, id_symbol); @@ -1199,6 +1223,10 @@ void ContextifyContext::CompileFunction( params_buf = args[8].As(); } + // Argument 10: host-defined option symbol + CHECK(args[9]->IsSymbol()); + Local id_symbol = args[9].As(); + // Read cache from cached data buffer ScriptCompiler::CachedData* cached_data = nullptr; if (!cached_data_buf.IsEmpty()) { @@ -1207,34 +1235,18 @@ void ContextifyContext::CompileFunction( data + cached_data_buf->ByteOffset(), cached_data_buf->ByteLength()); } - // Set host_defined_options Local host_defined_options = - PrimitiveArray::New(isolate, loader::HostDefinedOptions::kLength); - Local id_symbol = Symbol::New(isolate, filename); - host_defined_options->Set( - isolate, loader::HostDefinedOptions::kID, id_symbol); - - ScriptOrigin origin(isolate, - filename, - line_offset, // line offset - column_offset, // column offset - true, // is cross origin - -1, // script id - Local(), // source map URL - false, // is opaque (?) - false, // is WASM - false, // is ES Module - host_defined_options); + GetHostDefinedOptions(isolate, id_symbol); + ScriptCompiler::Source source = + GetCommonJSSourceInstance(isolate, + code, + filename, + line_offset, + column_offset, + host_defined_options, + cached_data); + ScriptCompiler::CompileOptions options = GetCompileOptions(source); - ScriptCompiler::Source source(code, origin, cached_data); - ScriptCompiler::CompileOptions options; - if (source.GetCachedData() == nullptr) { - options = ScriptCompiler::kNoCompileOptions; - } else { - options = ScriptCompiler::kConsumeCodeCache; - } - - TryCatchScope try_catch(env); Context::Scope scope(parsing_context); // Read context extensions from buffer @@ -1259,9 +1271,83 @@ void ContextifyContext::CompileFunction( } } + TryCatchScope try_catch(env); + Local result = CompileFunctionAndCacheResult(env, + parsing_context, + &source, + params, + context_extensions, + options, + produce_cached_data, + id_symbol, + try_catch); + + if (try_catch.HasCaught() && !try_catch.HasTerminated()) { + try_catch.ReThrow(); + return; + } + + if (result.IsEmpty()) { + return; + } + args.GetReturnValue().Set(result); +} + +Local ContextifyContext::GetHostDefinedOptions( + Isolate* isolate, Local id_symbol) { + Local host_defined_options = + PrimitiveArray::New(isolate, loader::HostDefinedOptions::kLength); + host_defined_options->Set( + isolate, loader::HostDefinedOptions::kID, id_symbol); + return host_defined_options; +} + +ScriptCompiler::Source ContextifyContext::GetCommonJSSourceInstance( + Isolate* isolate, + Local code, + Local filename, + int line_offset, + int column_offset, + Local host_defined_options, + ScriptCompiler::CachedData* cached_data) { + ScriptOrigin origin(isolate, + filename, + line_offset, // line offset + column_offset, // column offset + true, // is cross origin + -1, // script id + Local(), // source map URL + false, // is opaque (?) + false, // is WASM + false, // is ES Module + host_defined_options); + return ScriptCompiler::Source(code, origin, cached_data); +} + +ScriptCompiler::CompileOptions ContextifyContext::GetCompileOptions( + const ScriptCompiler::Source& source) { + ScriptCompiler::CompileOptions options; + if (source.GetCachedData() != nullptr) { + options = ScriptCompiler::kConsumeCodeCache; + } else { + options = ScriptCompiler::kNoCompileOptions; + } + return options; +} + +Local ContextifyContext::CompileFunctionAndCacheResult( + Environment* env, + Local parsing_context, + ScriptCompiler::Source* source, + std::vector> params, + std::vector> context_extensions, + ScriptCompiler::CompileOptions options, + bool produce_cached_data, + Local id_symbol, + const TryCatchScope& try_catch) { MaybeLocal maybe_fn = ScriptCompiler::CompileFunction( parsing_context, - &source, + source, params.size(), params.data(), context_extensions.size(), @@ -1273,24 +1359,26 @@ void ContextifyContext::CompileFunction( if (!maybe_fn.ToLocal(&fn)) { if (try_catch.HasCaught() && !try_catch.HasTerminated()) { errors::DecorateErrorStack(env, try_catch); - try_catch.ReThrow(); + return Object::New(env->isolate()); } - return; } + + Local context = env->context(); if (fn->SetPrivate(context, env->host_defined_option_symbol(), id_symbol) .IsNothing()) { - return; + return Object::New(env->isolate()); } + Isolate* isolate = env->isolate(); Local result = Object::New(isolate); if (result->Set(parsing_context, env->function_string(), fn).IsNothing()) - return; + return Object::New(env->isolate()); if (result ->Set(parsing_context, env->source_map_url_string(), fn->GetScriptOrigin().SourceMapUrl()) .IsNothing()) - return; + return Object::New(env->isolate()); std::unique_ptr new_cached_data; if (produce_cached_data) { @@ -1299,14 +1387,115 @@ void ContextifyContext::CompileFunction( if (StoreCodeCacheResult(env, result, options, - source, + *source, produce_cached_data, std::move(new_cached_data)) .IsNothing()) { - return; + return Object::New(env->isolate()); } - args.GetReturnValue().Set(result); + return result; +} + +// When compiling as CommonJS source code that contains ESM syntax, the +// following error messages are returned: +// - `import` statements: "Cannot use import statement outside a module" +// - `export` statements: "Unexpected token 'export'" +// - `import.meta` references: "Cannot use 'import.meta' outside a module" +// Dynamic `import()` is permitted in CommonJS, so it does not error. +// While top-level `await` is not permitted in CommonJS, it returns the same +// error message as when `await` is used in a sync function, so we don't use it +// as a disambiguation. +constexpr std::array esm_syntax_error_messages = { + "Cannot use import statement outside a module", // `import` statements + "Unexpected token 'export'", // `export` statements + "Cannot use 'import.meta' outside a module"}; // `import.meta` references + +void ContextifyContext::ContainsModuleSyntax( + const FunctionCallbackInfo& args) { + Environment* env = Environment::GetCurrent(args); + Isolate* isolate = env->isolate(); + Local context = env->context(); + + if (args.Length() == 0) { + return THROW_ERR_MISSING_ARGS( + env, "containsModuleSyntax needs at least 1 argument"); + } + + // Argument 2: filename; if undefined, use empty string + Local filename = String::Empty(isolate); + if (!args[1]->IsUndefined()) { + CHECK(args[1]->IsString()); + filename = args[1].As(); + } + + // Argument 1: source code; if undefined, read from filename in argument 2 + Local code; + if (args[0]->IsUndefined()) { + CHECK(!filename.IsEmpty()); + const char* filename_str = Utf8Value(isolate, filename).out(); + std::string contents; + int result = ReadFileSync(&contents, filename_str); + if (result != 0) { + isolate->ThrowException( + ERR_MODULE_NOT_FOUND(isolate, "Cannot read file %s", filename_str)); + return; + } + code = String::NewFromUtf8(isolate, + contents.c_str(), + v8::NewStringType::kNormal, + contents.length()) + .ToLocalChecked(); + } else { + CHECK(args[0]->IsString()); + code = args[0].As(); + } + + // TODO(geoffreybooth): Centralize this rather than matching the logic in + // cjs/loader.js and translators.js + Local script_id = String::Concat( + isolate, String::NewFromUtf8(isolate, "cjs:").ToLocalChecked(), filename); + Local id_symbol = Symbol::New(isolate, script_id); + + Local host_defined_options = + GetHostDefinedOptions(isolate, id_symbol); + ScriptCompiler::Source source = GetCommonJSSourceInstance( + isolate, code, filename, 0, 0, host_defined_options, nullptr); + ScriptCompiler::CompileOptions options = GetCompileOptions(source); + + std::vector> params = { + String::NewFromUtf8(isolate, "exports").ToLocalChecked(), + String::NewFromUtf8(isolate, "require").ToLocalChecked(), + String::NewFromUtf8(isolate, "module").ToLocalChecked(), + String::NewFromUtf8(isolate, "__filename").ToLocalChecked(), + String::NewFromUtf8(isolate, "__dirname").ToLocalChecked()}; + + TryCatchScope try_catch(env); + ShouldNotAbortOnUncaughtScope no_abort_scope(env); + + ContextifyContext::CompileFunctionAndCacheResult(env, + context, + &source, + std::move(params), + std::vector>(), + options, + true, + id_symbol, + try_catch); + + bool found_error_message_caused_by_module_syntax = false; + if (try_catch.HasCaught() && !try_catch.HasTerminated()) { + Utf8Value message_value(env->isolate(), try_catch.Message()->Get()); + auto message = message_value.ToStringView(); + + for (const auto& error_message : esm_syntax_error_messages) { + if (message.find(error_message) != std::string_view::npos) { + found_error_message_caused_by_module_syntax = true; + break; + } + } + } + args.GetReturnValue().Set(found_error_message_caused_by_module_syntax); } static void StartSigintWatchdog(const FunctionCallbackInfo& args) { diff --git a/src/node_contextify.h b/src/node_contextify.h index d1dddbf374d563..cce062622b70d8 100644 --- a/src/node_contextify.h +++ b/src/node_contextify.h @@ -18,6 +18,7 @@ struct ContextOptions { v8::Local allow_code_gen_strings; v8::Local allow_code_gen_wasm; std::unique_ptr own_microtask_queue; + v8::Local host_defined_options_id; }; class ContextifyContext : public BaseObject { @@ -83,6 +84,30 @@ class ContextifyContext : public BaseObject { static void IsContext(const v8::FunctionCallbackInfo& args); static void CompileFunction( const v8::FunctionCallbackInfo& args); + static v8::Local CompileFunctionAndCacheResult( + Environment* env, + v8::Local parsing_context, + v8::ScriptCompiler::Source* source, + std::vector> params, + std::vector> context_extensions, + v8::ScriptCompiler::CompileOptions options, + bool produce_cached_data, + v8::Local id_symbol, + const errors::TryCatchScope& try_catch); + static v8::Local GetHostDefinedOptions( + v8::Isolate* isolate, v8::Local id_symbol); + static v8::ScriptCompiler::Source GetCommonJSSourceInstance( + v8::Isolate* isolate, + v8::Local code, + v8::Local filename, + int line_offset, + int column_offset, + v8::Local host_defined_options, + v8::ScriptCompiler::CachedData* cached_data); + static v8::ScriptCompiler::CompileOptions GetCompileOptions( + const v8::ScriptCompiler::Source& source); + static void ContainsModuleSyntax( + const v8::FunctionCallbackInfo& args); static void WeakCallback( const v8::WeakCallbackInfo& data); static void PropertyGetterCallback( diff --git a/src/node_credentials.cc b/src/node_credentials.cc index 8a832b0e3efb3a..76088144950e49 100644 --- a/src/node_credentials.cc +++ b/src/node_credentials.cc @@ -49,7 +49,7 @@ namespace credentials { #if defined(__linux__) // Returns true if the current process only has the passed-in capability. -bool HasOnly(int capability) { +static bool HasOnly(int capability) { DCHECK(cap_valid(capability)); struct __user_cap_data_struct cap_data[2]; diff --git a/src/node_dir.cc b/src/node_dir.cc index 10cde6067899c7..21d5b880ccee98 100644 --- a/src/node_dir.cc +++ b/src/node_dir.cc @@ -423,27 +423,29 @@ static void OpenDirSync(const FunctionCallbackInfo& args) { args.GetReturnValue().Set(handle->object().As()); } -void Initialize(Local target, - Local unused, - Local context, - void* priv) { - Environment* env = Environment::GetCurrent(context); - Isolate* isolate = env->isolate(); +void CreatePerIsolateProperties(IsolateData* isolate_data, + Local target) { + Isolate* isolate = isolate_data->isolate(); - SetMethod(context, target, "opendir", OpenDir); - SetMethod(context, target, "opendirSync", OpenDirSync); + SetMethod(isolate, target, "opendir", OpenDir); + SetMethod(isolate, target, "opendirSync", OpenDirSync); // Create FunctionTemplate for DirHandle Local dir = NewFunctionTemplate(isolate, DirHandle::New); - dir->Inherit(AsyncWrap::GetConstructorTemplate(env)); + dir->Inherit(AsyncWrap::GetConstructorTemplate(isolate_data)); SetProtoMethod(isolate, dir, "read", DirHandle::Read); SetProtoMethod(isolate, dir, "close", DirHandle::Close); Local dirt = dir->InstanceTemplate(); dirt->SetInternalFieldCount(DirHandle::kInternalFieldCount); - SetConstructorFunction(context, target, "DirHandle", dir); - env->set_dir_instance_template(dirt); + SetConstructorFunction(isolate, target, "DirHandle", dir); + isolate_data->set_dir_instance_template(dirt); } +void CreatePerContextProperties(Local target, + Local unused, + Local context, + void* priv) {} + void RegisterExternalReferences(ExternalReferenceRegistry* registry) { registry->Register(OpenDir); registry->Register(OpenDirSync); @@ -456,6 +458,8 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) { } // end namespace node -NODE_BINDING_CONTEXT_AWARE_INTERNAL(fs_dir, node::fs_dir::Initialize) +NODE_BINDING_CONTEXT_AWARE_INTERNAL(fs_dir, + node::fs_dir::CreatePerContextProperties) +NODE_BINDING_PER_ISOLATE_INIT(fs_dir, node::fs_dir::CreatePerIsolateProperties) NODE_BINDING_EXTERNAL_REFERENCE(fs_dir, node::fs_dir::RegisterExternalReferences) diff --git a/src/node_dotenv.cc b/src/node_dotenv.cc index 0633ef51269959..992633c50b9a14 100644 --- a/src/node_dotenv.cc +++ b/src/node_dotenv.cc @@ -64,14 +64,14 @@ void Dotenv::SetEnvironment(node::Environment* env) { } } -void Dotenv::ParsePath(const std::string_view path) { +bool Dotenv::ParsePath(const std::string_view path) { uv_fs_t req; auto defer_req_cleanup = OnScopeLeave([&req]() { uv_fs_req_cleanup(&req); }); uv_file file = uv_fs_open(nullptr, &req, path.data(), 0, 438, nullptr); if (req.result < 0) { // req will be cleaned up by scope leave. - return; + return false; } uv_fs_req_cleanup(&req); @@ -89,7 +89,7 @@ void Dotenv::ParsePath(const std::string_view path) { auto r = uv_fs_read(nullptr, &req, file, &buf, 1, -1, nullptr); if (req.result < 0) { // req will be cleaned up by scope leave. - return; + return false; } uv_fs_req_cleanup(&req); if (r <= 0) { @@ -104,6 +104,7 @@ void Dotenv::ParsePath(const std::string_view path) { for (const auto& line : lines) { ParseLine(line); } + return true; } void Dotenv::AssignNodeOptionsIfAvailable(std::string* node_options) { diff --git a/src/node_dotenv.h b/src/node_dotenv.h index ee74f9ff84a353..cc87008d149f43 100644 --- a/src/node_dotenv.h +++ b/src/node_dotenv.h @@ -18,7 +18,7 @@ class Dotenv { Dotenv& operator=(const Dotenv& d) = default; ~Dotenv() = default; - void ParsePath(const std::string_view path); + bool ParsePath(const std::string_view path); void AssignNodeOptionsIfAvailable(std::string* node_options); void SetEnvironment(Environment* env); diff --git a/src/node_env_var.cc b/src/node_env_var.cc index 94936ea1c2bd22..bce7ae07214ddf 100644 --- a/src/node_env_var.cc +++ b/src/node_env_var.cc @@ -456,7 +456,8 @@ static void EnvDefiner(Local property, } } -void CreateEnvProxyTemplate(Isolate* isolate, IsolateData* isolate_data) { +void CreateEnvProxyTemplate(IsolateData* isolate_data) { + Isolate* isolate = isolate_data->isolate(); HandleScope scope(isolate); if (!isolate_data->env_proxy_template().IsEmpty()) return; Local env_proxy_ctor_template = diff --git a/src/node_errors.cc b/src/node_errors.cc index fe74717d00e140..7ef6ea7f07998f 100644 --- a/src/node_errors.cc +++ b/src/node_errors.cc @@ -1,5 +1,6 @@ #include #include +#include #include "debug_utils-inl.h" #include "node_errors.h" @@ -15,6 +16,7 @@ namespace node { using errors::TryCatchScope; using v8::Boolean; using v8::Context; +using v8::EscapableHandleScope; using v8::Exception; using v8::Function; using v8::FunctionCallbackInfo; @@ -185,7 +187,46 @@ static std::string GetErrorSource(Isolate* isolate, return buf + std::string(underline_buf, off); } -static std::string FormatStackTrace(Isolate* isolate, Local stack) { +static std::atomic is_in_oom{false}; +static std::atomic is_retrieving_js_stacktrace{false}; +MaybeLocal GetCurrentStackTrace(Isolate* isolate, int frame_count) { + if (isolate == nullptr) { + return MaybeLocal(); + } + // Generating JavaScript stack trace can result in V8 fatal error, + // which can re-enter this function. + if (is_retrieving_js_stacktrace.load()) { + return MaybeLocal(); + } + + // Can not capture the stacktrace when the isolate is in a OOM state or no + // context is entered. + if (is_in_oom.load() || !isolate->InContext()) { + return MaybeLocal(); + } + + constexpr StackTrace::StackTraceOptions options = + static_cast( + StackTrace::kDetailed | + StackTrace::kExposeFramesAcrossSecurityOrigins); + + is_retrieving_js_stacktrace.store(true); + EscapableHandleScope scope(isolate); + Local stack = + StackTrace::CurrentStackTrace(isolate, frame_count, options); + + is_retrieving_js_stacktrace.store(false); + if (stack->GetFrameCount() == 0) { + return MaybeLocal(); + } + + return scope.Escape(stack); +} + +static std::string FormatStackTrace( + Isolate* isolate, + Local stack, + StackTracePrefix prefix = StackTracePrefix::kAt) { std::string result; for (int i = 0; i < stack->GetFrameCount(); i++) { Local stack_frame = stack->GetFrame(isolate, i); @@ -193,15 +234,18 @@ static std::string FormatStackTrace(Isolate* isolate, Local stack) { node::Utf8Value script_name(isolate, stack_frame->GetScriptName()); const int line_number = stack_frame->GetLineNumber(); const int column = stack_frame->GetColumn(); - + std::string prefix_str = prefix == StackTracePrefix::kAt + ? " at " + : std::to_string(i + 1) + ": "; if (stack_frame->IsEval()) { if (stack_frame->GetScriptId() == Message::kNoScriptIdInfo) { - result += SPrintF(" at [eval]:%i:%i\n", line_number, column); + result += SPrintF("%s[eval]:%i:%i\n", prefix_str, line_number, column); } else { std::vector buf(script_name.length() + 64); snprintf(buf.data(), buf.size(), - " at [eval] (%s:%i:%i)\n", + "%s[eval] (%s:%i:%i)\n", + prefix_str.c_str(), *script_name, line_number, column); @@ -214,7 +258,8 @@ static std::string FormatStackTrace(Isolate* isolate, Local stack) { std::vector buf(script_name.length() + 64); snprintf(buf.data(), buf.size(), - " at %s:%i:%i\n", + "%s%s:%i:%i\n", + prefix_str.c_str(), *script_name, line_number, column); @@ -223,7 +268,8 @@ static std::string FormatStackTrace(Isolate* isolate, Local stack) { std::vector buf(fn_name_s.length() + script_name.length() + 64); snprintf(buf.data(), buf.size(), - " at %s (%s:%i:%i)\n", + "%s%s (%s:%i:%i)\n", + prefix_str.c_str(), *fn_name_s, *script_name, line_number, @@ -239,8 +285,17 @@ static void PrintToStderrAndFlush(const std::string& str) { fflush(stderr); } -void PrintStackTrace(Isolate* isolate, Local stack) { - PrintToStderrAndFlush(FormatStackTrace(isolate, stack)); +void PrintStackTrace(Isolate* isolate, + Local stack, + StackTracePrefix prefix) { + PrintToStderrAndFlush(FormatStackTrace(isolate, stack, prefix)); +} + +void PrintCurrentStackTrace(Isolate* isolate, StackTracePrefix prefix) { + Local stack; + if (GetCurrentStackTrace(isolate).ToLocal(&stack)) { + PrintStackTrace(isolate, stack, prefix); + } } std::string FormatCaughtException(Isolate* isolate, @@ -328,25 +383,20 @@ void AppendExceptionLine(Environment* env, .FromMaybe(false)); } -[[noreturn]] void Abort() { - DumpBacktrace(stderr); - fflush(stderr); - ABORT_NO_BACKTRACE(); -} - -[[noreturn]] void Assert(const AssertionInfo& info) { +void Assert(const AssertionInfo& info) { std::string name = GetHumanReadableProcessName(); fprintf(stderr, - "%s: %s:%s%s Assertion `%s' failed.\n", + "\n" + " # %s: %s at %s\n" + " # Assertion failed: %s\n\n", name.c_str(), - info.file_line, - info.function, - *info.function ? ":" : "", + info.function ? info.function : "(unknown function)", + info.file_line ? info.file_line : "(unknown source location)", info.message); - fflush(stderr); - Abort(); + fflush(stderr); + ABORT(); } enum class EnhanceFatalException { kEnhance, kDontEnhance }; @@ -354,7 +404,7 @@ enum class EnhanceFatalException { kEnhance, kDontEnhance }; /** * Report the exception to the inspector, then print it to stderr. * This should only be used when the Node.js instance is about to exit - * (i.e. this should be followed by a env->Exit() or an Abort()). + * (i.e. this should be followed by a env->Exit() or an ABORT()). * * Use enhance_stack = EnhanceFatalException::kDontEnhance * when it's unsafe to call into JavaScript. @@ -526,8 +576,10 @@ static void ReportFatalException(Environment* env, ABORT(); } -[[noreturn]] void OOMErrorHandler(const char* location, - const v8::OOMDetails& details) { +void OOMErrorHandler(const char* location, const v8::OOMDetails& details) { + // We should never recover from this handler so once it's true it's always + // true. + is_in_oom.store(true); const char* message = details.is_heap_oom ? "Allocation failed - JavaScript heap out of memory" : "Allocation failed - process out of memory"; @@ -563,8 +615,18 @@ v8::ModifyCodeGenerationFromStringsResult ModifyCodeGenerationFromStrings( bool is_code_like) { HandleScope scope(context->GetIsolate()); + if (context->GetNumberOfEmbedderDataFields() <= + ContextEmbedderIndex::kAllowCodeGenerationFromStrings) { + // The context is not (yet) configured by Node.js for this. We don't + // have enough information to make a decision, just allow it which is + // the default. + return {true, {}}; + } Environment* env = Environment::GetCurrent(context); - if (env->source_maps_enabled()) { + if (env == nullptr) { + return {true, {}}; + } + if (env->source_maps_enabled() && env->can_call_into_js()) { // We do not expect the maybe_cache_generated_source_map to throw any more // exceptions. If it does, just ignore it. errors::TryCatchScope try_catch(env); @@ -1010,7 +1072,7 @@ static void TriggerUncaughtException(const FunctionCallbackInfo& args) { if (env != nullptr && env->abort_on_uncaught_exception()) { ReportFatalException( env, exception, message, EnhanceFatalException::kEnhance); - Abort(); + ABORT(); } bool from_promise = args[1]->IsTrue(); errors::TriggerUncaughtException(isolate, exception, message, from_promise); @@ -1121,7 +1183,7 @@ void TriggerUncaughtException(Isolate* isolate, // much we can do, so we just print whatever is useful and crash. PrintToStderrAndFlush( FormatCaughtException(isolate, context, error, message)); - Abort(); + ABORT(); } // Invoke process._fatalException() to give user a chance to handle it. diff --git a/src/node_errors.h b/src/node_errors.h index 0f4a2d0cc6eaaf..9e7aaf2c36dd0e 100644 --- a/src/node_errors.h +++ b/src/node_errors.h @@ -19,9 +19,14 @@ void AppendExceptionLine(Environment* env, v8::Local message, enum ErrorHandlingMode mode); +// This function calls backtrace, it should have not be marked as [[noreturn]]. +// But it is a public API, removing the attribute can break. +// Prefer UNREACHABLE() internally instead, it doesn't need manually set +// location. [[noreturn]] void OnFatalError(const char* location, const char* message); -[[noreturn]] void OOMErrorHandler(const char* location, - const v8::OOMDetails& details); +// This function calls backtrace, do not mark as [[noreturn]]. Read more in the +// ABORT macro. +void OOMErrorHandler(const char* location, const v8::OOMDetails& details); // Helpers to construct errors similar to the ones provided by // lib/internal/errors.js. @@ -71,6 +76,7 @@ void AppendExceptionLine(Environment* env, V(ERR_INVALID_ARG_TYPE, TypeError) \ V(ERR_INVALID_FILE_URL_HOST, TypeError) \ V(ERR_INVALID_FILE_URL_PATH, TypeError) \ + V(ERR_INVALID_PACKAGE_CONFIG, Error) \ V(ERR_INVALID_OBJECT_DEFINE_PROPERTY, TypeError) \ V(ERR_INVALID_MODULE, Error) \ V(ERR_INVALID_STATE, Error) \ @@ -123,6 +129,10 @@ void AppendExceptionLine(Environment* env, inline void THROW_##code( \ Environment* env, const char* format, Args&&... args) { \ THROW_##code(env->isolate(), format, std::forward(args)...); \ + } \ + template \ + inline void THROW_##code(Realm* realm, const char* format, Args&&... args) { \ + THROW_##code(realm->isolate(), format, std::forward(args)...); \ } ERRORS_WITH_CODE(V) #undef V diff --git a/src/node_external_reference.h b/src/node_external_reference.h index ae37094c8e117e..b952bb7fc5adf8 100644 --- a/src/node_external_reference.h +++ b/src/node_external_reference.h @@ -15,6 +15,8 @@ using CFunctionCallbackWithOneByteString = using CFunctionCallback = void (*)(v8::Local receiver); using CFunctionCallbackReturnDouble = double (*)(v8::Local receiver); +using CFunctionCallbackValueReturnDouble = + double (*)(v8::Local receiver); using CFunctionCallbackWithInt64 = void (*)(v8::Local receiver, int64_t); using CFunctionCallbackWithBool = void (*)(v8::Local receiver, @@ -27,6 +29,12 @@ using CFunctionCallbackWithStrings = const v8::FastOneByteString& base); using CFunctionWithUint32 = uint32_t (*)(v8::Local, const uint32_t input); +using CFunctionWithDoubleReturnDouble = double (*)(v8::Local, + const double); +using CFunctionWithInt64Fallback = void (*)(v8::Local, + const int64_t, + v8::FastApiCallbackOptions&); +using CFunctionWithBool = void (*)(v8::Local, bool); // This class manages the external references from the V8 heap // to the C++ addresses in Node.js. @@ -38,11 +46,15 @@ class ExternalReferenceRegistry { V(CFunctionCallback) \ V(CFunctionCallbackWithOneByteString) \ V(CFunctionCallbackReturnDouble) \ + V(CFunctionCallbackValueReturnDouble) \ V(CFunctionCallbackWithInt64) \ V(CFunctionCallbackWithBool) \ V(CFunctionCallbackWithString) \ V(CFunctionCallbackWithStrings) \ V(CFunctionWithUint32) \ + V(CFunctionWithDoubleReturnDouble) \ + V(CFunctionWithInt64Fallback) \ + V(CFunctionWithBool) \ V(const v8::CFunctionInfo*) \ V(v8::FunctionCallback) \ V(v8::AccessorGetterCallback) \ @@ -100,16 +112,19 @@ class ExternalReferenceRegistry { V(messaging) \ V(mksnapshot) \ V(module_wrap) \ + V(modules) \ V(options) \ V(os) \ V(performance) \ V(permission) \ V(process_methods) \ V(process_object) \ + V(process_wrap) \ V(report) \ V(task_queue) \ V(tcp_wrap) \ V(tty_wrap) \ + V(udp_wrap) \ V(url) \ V(util) \ V(pipe_wrap) \ @@ -118,6 +133,7 @@ class ExternalReferenceRegistry { V(string_decoder) \ V(stream_wrap) \ V(signal_wrap) \ + V(spawn_sync) \ V(trace_events) \ V(timers) \ V(types) \ @@ -147,11 +163,18 @@ class ExternalReferenceRegistry { #define EXTERNAL_REFERENCE_BINDING_LIST_CRYPTO(V) #endif // HAVE_OPENSSL +#if HAVE_OPENSSL && NODE_OPENSSL_HAS_QUIC +#define EXTERNAL_REFERENCE_BINDING_LIST_QUIC(V) V(quic) +#else +#define EXTERNAL_REFERENCE_BINDING_LIST_QUIC(V) +#endif + #define EXTERNAL_REFERENCE_BINDING_LIST(V) \ EXTERNAL_REFERENCE_BINDING_LIST_BASE(V) \ EXTERNAL_REFERENCE_BINDING_LIST_INSPECTOR(V) \ EXTERNAL_REFERENCE_BINDING_LIST_I18N(V) \ - EXTERNAL_REFERENCE_BINDING_LIST_CRYPTO(V) + EXTERNAL_REFERENCE_BINDING_LIST_CRYPTO(V) \ + EXTERNAL_REFERENCE_BINDING_LIST_QUIC(V) } // namespace node diff --git a/src/node_file.cc b/src/node_file.cc index afaa028784e710..a3e80898cde6b6 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -29,6 +29,7 @@ #include "node_metadata.h" #include "node_process-inl.h" #include "node_stat_watcher.h" +#include "node_url.h" #include "permission/permission.h" #include "util-inl.h" @@ -38,19 +39,10 @@ #include "stream_base-inl.h" #include "string_bytes.h" -#include -#include -#include -#include -#include -#include - #if defined(__MINGW32__) || defined(_MSC_VER) # include #endif -#include - namespace node { namespace fs { @@ -841,19 +833,6 @@ void AfterOpenFileHandle(uv_fs_t* req) { } } -// Reverse the logic applied by path.toNamespacedPath() to create a -// namespace-prefixed path. -void FromNamespacedPath(std::string* path) { -#ifdef _WIN32 - if (path->compare(0, 8, "\\\\?\\UNC\\", 8) == 0) { - *path = path->substr(8); - path->insert(0, "\\\\"); - } else if (path->compare(0, 4, "\\\\?\\", 4) == 0) { - *path = path->substr(4); - } -#endif -} - void AfterMkdirp(uv_fs_t* req) { FSReqBase* req_wrap = FSReqBase::from_req(req); FSReqAfterScope after(req_wrap, req); @@ -863,7 +842,7 @@ void AfterMkdirp(uv_fs_t* req) { std::string first_path(req_wrap->continuation_data()->first_path()); if (first_path.empty()) return req_wrap->Resolve(Undefined(req_wrap->env()->isolate())); - FromNamespacedPath(&first_path); + node::url::FromNamespacedPath(&first_path); Local path; Local error; if (!StringBytes::Encode(req_wrap->env()->isolate(), first_path.c_str(), @@ -1050,68 +1029,6 @@ static void ExistsSync(const FunctionCallbackInfo& args) { args.GetReturnValue().Set(err == 0); } -// Used to speed up module loading. Returns an array [string, boolean] -static void InternalModuleReadJSON(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); - Isolate* isolate = env->isolate(); - uv_loop_t* loop = env->event_loop(); - - CHECK(args[0]->IsString()); - node::Utf8Value path(isolate, args[0]); - THROW_IF_INSUFFICIENT_PERMISSIONS( - env, permission::PermissionScope::kFileSystemRead, path.ToStringView()); - - if (strlen(*path) != path.length()) { - return; // Contains a nul byte. - } - uv_fs_t open_req; - const int fd = uv_fs_open(loop, &open_req, *path, O_RDONLY, 0, nullptr); - uv_fs_req_cleanup(&open_req); - - if (fd < 0) { - return; - } - - auto defer_close = OnScopeLeave([fd, loop]() { - uv_fs_t close_req; - CHECK_EQ(0, uv_fs_close(loop, &close_req, fd, nullptr)); - uv_fs_req_cleanup(&close_req); - }); - - const size_t kBlockSize = 32 << 10; - std::vector chars; - int64_t offset = 0; - ssize_t numchars; - do { - const size_t start = chars.size(); - chars.resize(start + kBlockSize); - - uv_buf_t buf; - buf.base = &chars[start]; - buf.len = kBlockSize; - - uv_fs_t read_req; - numchars = uv_fs_read(loop, &read_req, fd, &buf, 1, offset, nullptr); - uv_fs_req_cleanup(&read_req); - - if (numchars < 0) { - return; - } - offset += numchars; - } while (static_cast(numchars) == kBlockSize); - - size_t start = 0; - if (offset >= 3 && 0 == memcmp(chars.data(), "\xEF\xBB\xBF", 3)) { - start = 3; // Skip UTF-8 BOM. - } - const size_t size = offset - start; - - args.GetReturnValue().Set( - String::NewFromUtf8( - isolate, &chars[start], v8::NewStringType::kNormal, size) - .ToLocalChecked()); -} - // Used to speed up module loading. Returns 0 if the path refers to // a file, 1 when it's a directory or < 0 on error (usually -ENOENT.) // The speedup comes from not creating thousands of Stat and Error objects. @@ -1192,21 +1109,26 @@ static void LStat(const FunctionCallbackInfo& args) { CHECK_NOT_NULL(*path); bool use_bigint = args[1]->IsTrue(); - FSReqBase* req_wrap_async = GetReqWrap(args, 2, use_bigint); - if (req_wrap_async != nullptr) { // lstat(path, use_bigint, req) + if (!args[2]->IsUndefined()) { // lstat(path, use_bigint, req) + FSReqBase* req_wrap_async = GetReqWrap(args, 2, use_bigint); FS_ASYNC_TRACE_BEGIN1( UV_FS_LSTAT, req_wrap_async, "path", TRACE_STR_COPY(*path)) AsyncCall(env, req_wrap_async, args, "lstat", UTF8, AfterStat, uv_fs_lstat, *path); - } else { // lstat(path, use_bigint, undefined, ctx) - CHECK_EQ(argc, 4); - FSReqWrapSync req_wrap_sync; + } else { // lstat(path, use_bigint, undefined, throw_if_no_entry) + bool do_not_throw_if_no_entry = args[3]->IsFalse(); + FSReqWrapSync req_wrap_sync("lstat", *path); FS_SYNC_TRACE_BEGIN(lstat); - int err = SyncCall(env, args[3], &req_wrap_sync, "lstat", uv_fs_lstat, - *path); + int result; + if (do_not_throw_if_no_entry) { + result = SyncCallAndThrowIf( + is_uv_error_except_no_entry, env, &req_wrap_sync, uv_fs_lstat, *path); + } else { + result = SyncCallAndThrowOnError(env, &req_wrap_sync, uv_fs_lstat, *path); + } FS_SYNC_TRACE_END(lstat); - if (err != 0) { - return; // error info is in ctx + if (is_uv_error(result)) { + return; } Local arr = FillGlobalStatsArray(binding_data, use_bigint, @@ -1223,23 +1145,29 @@ static void FStat(const FunctionCallbackInfo& args) { const int argc = args.Length(); CHECK_GE(argc, 2); - CHECK(args[0]->IsInt32()); - int fd = args[0].As()->Value(); + int fd; + if (!GetValidatedFd(env, args[0]).To(&fd)) { + return; + } bool use_bigint = args[1]->IsTrue(); - FSReqBase* req_wrap_async = GetReqWrap(args, 2, use_bigint); - if (req_wrap_async != nullptr) { // fstat(fd, use_bigint, req) + if (!args[2]->IsUndefined()) { // fstat(fd, use_bigint, req) + FSReqBase* req_wrap_async = GetReqWrap(args, 2, use_bigint); FS_ASYNC_TRACE_BEGIN0(UV_FS_FSTAT, req_wrap_async) AsyncCall(env, req_wrap_async, args, "fstat", UTF8, AfterStat, uv_fs_fstat, fd); - } else { // fstat(fd, use_bigint, undefined, ctx) - CHECK_EQ(argc, 4); - FSReqWrapSync req_wrap_sync; + } else { // fstat(fd, use_bigint, undefined, do_not_throw_error) + bool do_not_throw_error = args[2]->IsTrue(); + const auto should_throw = [do_not_throw_error](int result) { + return is_uv_error(result) && !do_not_throw_error; + }; + FSReqWrapSync req_wrap_sync("fstat"); FS_SYNC_TRACE_BEGIN(fstat); - int err = SyncCall(env, args[3], &req_wrap_sync, "fstat", uv_fs_fstat, fd); + int err = + SyncCallAndThrowIf(should_throw, env, &req_wrap_sync, uv_fs_fstat, fd); FS_SYNC_TRACE_END(fstat); - if (err != 0) { - return; // error info is in ctx + if (is_uv_error(err)) { + return; } Local arr = FillGlobalStatsArray(binding_data, use_bigint, @@ -1298,7 +1226,7 @@ static void Symlink(const FunctionCallbackInfo& args) { Isolate* isolate = env->isolate(); const int argc = args.Length(); - CHECK_GE(argc, 4); + CHECK_GE(argc, 3); BufferValue target(isolate, args[0]); CHECK_NOT_NULL(*target); @@ -1317,8 +1245,8 @@ static void Symlink(const FunctionCallbackInfo& args) { CHECK(args[2]->IsInt32()); int flags = args[2].As()->Value(); - FSReqBase* req_wrap_async = GetReqWrap(args, 3); - if (req_wrap_async != nullptr) { // symlink(target, path, flags, req) + if (argc > 3) { // symlink(target, path, flags, req) + FSReqBase* req_wrap_async = GetReqWrap(args, 3); FS_ASYNC_TRACE_BEGIN2(UV_FS_SYMLINK, req_wrap_async, "target", @@ -1328,11 +1256,10 @@ static void Symlink(const FunctionCallbackInfo& args) { AsyncDestCall(env, req_wrap_async, args, "symlink", *path, path.length(), UTF8, AfterNoArgs, uv_fs_symlink, *target, *path, flags); } else { // symlink(target, path, flags, undefined, ctx) - CHECK_EQ(argc, 5); - FSReqWrapSync req_wrap_sync; + FSReqWrapSync req_wrap_sync("symlink", *target, *path); FS_SYNC_TRACE_BEGIN(symlink); - SyncCall(env, args[4], &req_wrap_sync, "symlink", - uv_fs_symlink, *target, *path, flags); + SyncCallAndThrowOnError( + env, &req_wrap_sync, uv_fs_symlink, *target, *path, flags); FS_SYNC_TRACE_END(symlink); } } @@ -1342,7 +1269,7 @@ static void Link(const FunctionCallbackInfo& args) { Isolate* isolate = env->isolate(); const int argc = args.Length(); - CHECK_GE(argc, 3); + CHECK_GE(argc, 2); BufferValue src(isolate, args[0]); CHECK_NOT_NULL(*src); @@ -1360,8 +1287,8 @@ static void Link(const FunctionCallbackInfo& args) { THROW_IF_INSUFFICIENT_PERMISSIONS( env, permission::PermissionScope::kFileSystemWrite, dest_view); - FSReqBase* req_wrap_async = GetReqWrap(args, 2); - if (req_wrap_async != nullptr) { // link(src, dest, req) + if (argc > 2) { // link(src, dest, req) + FSReqBase* req_wrap_async = GetReqWrap(args, 2); FS_ASYNC_TRACE_BEGIN2(UV_FS_LINK, req_wrap_async, "src", @@ -1371,11 +1298,9 @@ static void Link(const FunctionCallbackInfo& args) { AsyncDestCall(env, req_wrap_async, args, "link", *dest, dest.length(), UTF8, AfterNoArgs, uv_fs_link, *src, *dest); } else { // link(src, dest) - CHECK_EQ(argc, 4); - FSReqWrapSync req_wrap_sync; + FSReqWrapSync req_wrap_sync("link", *src, *dest); FS_SYNC_TRACE_BEGIN(link); - SyncCall(env, args[3], &req_wrap_sync, "link", - uv_fs_link, *src, *dest); + SyncCallAndThrowOnError(env, &req_wrap_sync, uv_fs_link, *src, *dest); FS_SYNC_TRACE_END(link); } } @@ -1385,7 +1310,7 @@ static void ReadLink(const FunctionCallbackInfo& args) { Isolate* isolate = env->isolate(); const int argc = args.Length(); - CHECK_GE(argc, 3); + CHECK_GE(argc, 2); BufferValue path(isolate, args[0]); CHECK_NOT_NULL(*path); @@ -1394,21 +1319,20 @@ static void ReadLink(const FunctionCallbackInfo& args) { const enum encoding encoding = ParseEncoding(isolate, args[1], UTF8); - FSReqBase* req_wrap_async = GetReqWrap(args, 2); - if (req_wrap_async != nullptr) { // readlink(path, encoding, req) + if (argc > 2) { // readlink(path, encoding, req) + FSReqBase* req_wrap_async = GetReqWrap(args, 2); FS_ASYNC_TRACE_BEGIN1( UV_FS_READLINK, req_wrap_async, "path", TRACE_STR_COPY(*path)) AsyncCall(env, req_wrap_async, args, "readlink", encoding, AfterStringPtr, uv_fs_readlink, *path); - } else { - CHECK_EQ(argc, 4); - FSReqWrapSync req_wrap_sync; + } else { // readlink(path, encoding) + FSReqWrapSync req_wrap_sync("readlink", *path); FS_SYNC_TRACE_BEGIN(readlink); - int err = SyncCall(env, args[3], &req_wrap_sync, "readlink", - uv_fs_readlink, *path); + int err = + SyncCallAndThrowOnError(env, &req_wrap_sync, uv_fs_readlink, *path); FS_SYNC_TRACE_END(readlink); if (err < 0) { - return; // syscall failed, no need to continue, error info is in ctx + return; } const char* link_path = static_cast(req_wrap_sync.req.ptr); @@ -1418,8 +1342,7 @@ static void ReadLink(const FunctionCallbackInfo& args) { encoding, &error); if (rc.IsEmpty()) { - Local ctx = args[3].As(); - ctx->Set(env->context(), env->error_string(), error).Check(); + env->isolate()->ThrowException(error); return; } @@ -1432,7 +1355,7 @@ static void Rename(const FunctionCallbackInfo& args) { Isolate* isolate = env->isolate(); const int argc = args.Length(); - CHECK_GE(argc, 3); + CHECK_GE(argc, 2); BufferValue old_path(isolate, args[0]); CHECK_NOT_NULL(*old_path); @@ -1449,8 +1372,8 @@ static void Rename(const FunctionCallbackInfo& args) { permission::PermissionScope::kFileSystemWrite, new_path.ToStringView()); - FSReqBase* req_wrap_async = GetReqWrap(args, 2); - if (req_wrap_async != nullptr) { + if (argc > 2) { // rename(old_path, new_path, req) + FSReqBase* req_wrap_async = GetReqWrap(args, 2); FS_ASYNC_TRACE_BEGIN2(UV_FS_RENAME, req_wrap_async, "old_path", @@ -1460,12 +1383,11 @@ static void Rename(const FunctionCallbackInfo& args) { AsyncDestCall(env, req_wrap_async, args, "rename", *new_path, new_path.length(), UTF8, AfterNoArgs, uv_fs_rename, *old_path, *new_path); - } else { - CHECK_EQ(argc, 4); - FSReqWrapSync req_wrap_sync; + } else { // rename(old_path, new_path) + FSReqWrapSync req_wrap_sync("rename", *old_path, *new_path); FS_SYNC_TRACE_BEGIN(rename); - SyncCall(env, args[3], &req_wrap_sync, "rename", uv_fs_rename, - *old_path, *new_path); + SyncCallAndThrowOnError( + env, &req_wrap_sync, uv_fs_rename, *old_path, *new_path); FS_SYNC_TRACE_END(rename); } } @@ -1476,18 +1398,20 @@ static void FTruncate(const FunctionCallbackInfo& args) { const int argc = args.Length(); CHECK_GE(argc, 2); - CHECK(args[0]->IsInt32()); - const int fd = args[0].As()->Value(); + int fd; + if (!GetValidatedFd(env, args[0]).To(&fd)) { + return; + } CHECK(IsSafeJsInt(args[1])); const int64_t len = args[1].As()->Value(); - if (argc > 2) { + if (argc > 2) { // ftruncate(fd, len, req) FSReqBase* req_wrap_async = GetReqWrap(args, 2); FS_ASYNC_TRACE_BEGIN0(UV_FS_FTRUNCATE, req_wrap_async) AsyncCall(env, req_wrap_async, args, "ftruncate", UTF8, AfterNoArgs, uv_fs_ftruncate, fd, len); - } else { + } else { // ftruncate(fd, len) FSReqWrapSync req_wrap_sync("ftruncate"); FS_SYNC_TRACE_BEGIN(ftruncate); SyncCallAndThrowOnError(env, &req_wrap_sync, uv_fs_ftruncate, fd, len); @@ -1501,8 +1425,10 @@ static void Fdatasync(const FunctionCallbackInfo& args) { const int argc = args.Length(); CHECK_GE(argc, 1); - CHECK(args[0]->IsInt32()); - const int fd = args[0].As()->Value(); + int fd; + if (!GetValidatedFd(env, args[0]).To(&fd)) { + return; + } if (argc > 1) { // fdatasync(fd, req) FSReqBase* req_wrap_async = GetReqWrap(args, 1); @@ -1522,21 +1448,23 @@ static void Fsync(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); const int argc = args.Length(); - CHECK_GE(argc, 2); + CHECK_GE(argc, 1); - CHECK(args[0]->IsInt32()); - const int fd = args[0].As()->Value(); + int fd; + if (!GetValidatedFd(env, args[0]).To(&fd)) { + return; + } - FSReqBase* req_wrap_async = GetReqWrap(args, 1); - if (req_wrap_async != nullptr) { + if (argc > 1) { + FSReqBase* req_wrap_async = GetReqWrap(args, 1); + CHECK_NOT_NULL(req_wrap_async); FS_ASYNC_TRACE_BEGIN0(UV_FS_FSYNC, req_wrap_async) AsyncCall(env, req_wrap_async, args, "fsync", UTF8, AfterNoArgs, uv_fs_fsync, fd); } else { - CHECK_EQ(argc, 3); - FSReqWrapSync req_wrap_sync; + FSReqWrapSync req_wrap_sync("fsync"); FS_SYNC_TRACE_BEGIN(fsync); - SyncCall(env, args[2], &req_wrap_sync, "fsync", uv_fs_fsync, fd); + SyncCallAndThrowOnError(env, &req_wrap_sync, uv_fs_fsync, fd); FS_SYNC_TRACE_END(fsync); } } @@ -1571,25 +1499,23 @@ static void RMDir(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); const int argc = args.Length(); - CHECK_GE(argc, 2); + CHECK_GE(argc, 1); BufferValue path(env->isolate(), args[0]); CHECK_NOT_NULL(*path); THROW_IF_INSUFFICIENT_PERMISSIONS( env, permission::PermissionScope::kFileSystemWrite, path.ToStringView()); - FSReqBase* req_wrap_async = GetReqWrap(args, 1); // rmdir(path, req) - if (req_wrap_async != nullptr) { + if (argc > 1) { + FSReqBase* req_wrap_async = GetReqWrap(args, 1); // rmdir(path, req) FS_ASYNC_TRACE_BEGIN1( UV_FS_RMDIR, req_wrap_async, "path", TRACE_STR_COPY(*path)) AsyncCall(env, req_wrap_async, args, "rmdir", UTF8, AfterNoArgs, uv_fs_rmdir, *path); - } else { // rmdir(path, undefined, ctx) - CHECK_EQ(argc, 3); - FSReqWrapSync req_wrap_sync; + } else { // rmdir(path) + FSReqWrapSync req_wrap_sync("rmdir", *path); FS_SYNC_TRACE_BEGIN(rmdir); - SyncCall(env, args[2], &req_wrap_sync, "rmdir", - uv_fs_rmdir, *path); + SyncCallAndThrowOnError(env, &req_wrap_sync, uv_fs_rmdir, *path); FS_SYNC_TRACE_END(rmdir); } } @@ -1757,30 +1683,11 @@ int MKDirpAsync(uv_loop_t* loop, return err; } -int CallMKDirpSync(Environment* env, const FunctionCallbackInfo& args, - FSReqWrapSync* req_wrap, const char* path, int mode) { - env->PrintSyncTrace(); - int err = MKDirpSync(env->event_loop(), &req_wrap->req, path, mode, - nullptr); - if (err < 0) { - v8::Local context = env->context(); - v8::Local ctx_obj = args[4].As(); - v8::Isolate* isolate = env->isolate(); - ctx_obj->Set(context, - env->errno_string(), - v8::Integer::New(isolate, err)).Check(); - ctx_obj->Set(context, - env->syscall_string(), - OneByteString(isolate, "mkdir")).Check(); - } - return err; -} - static void MKDir(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); const int argc = args.Length(); - CHECK_GE(argc, 4); + CHECK_GE(argc, 3); BufferValue path(env->isolate(), args[0]); CHECK_NOT_NULL(*path); @@ -1793,37 +1700,39 @@ static void MKDir(const FunctionCallbackInfo& args) { CHECK(args[2]->IsBoolean()); bool mkdirp = args[2]->IsTrue(); - FSReqBase* req_wrap_async = GetReqWrap(args, 3); - if (req_wrap_async != nullptr) { // mkdir(path, mode, req) + if (argc > 3) { // mkdir(path, mode, recursive, req) + FSReqBase* req_wrap_async = GetReqWrap(args, 3); FS_ASYNC_TRACE_BEGIN1( UV_FS_UNLINK, req_wrap_async, "path", TRACE_STR_COPY(*path)) AsyncCall(env, req_wrap_async, args, "mkdir", UTF8, mkdirp ? AfterMkdirp : AfterNoArgs, mkdirp ? MKDirpAsync : uv_fs_mkdir, *path, mode); - } else { // mkdir(path, mode, undefined, ctx) - CHECK_EQ(argc, 5); - FSReqWrapSync req_wrap_sync; + } else { // mkdir(path, mode, recursive) + FSReqWrapSync req_wrap_sync("mkdir", *path); FS_SYNC_TRACE_BEGIN(mkdir); if (mkdirp) { - int err = CallMKDirpSync(env, args, &req_wrap_sync, *path, mode); - if (err == 0 && - !req_wrap_sync.continuation_data()->first_path().empty()) { + env->PrintSyncTrace(); + int err = MKDirpSync( + env->event_loop(), &req_wrap_sync.req, *path, mode, nullptr); + if (is_uv_error(err)) { + env->ThrowUVException(err, "mkdir", nullptr, *path); + return; + } + if (!req_wrap_sync.continuation_data()->first_path().empty()) { Local error; std::string first_path(req_wrap_sync.continuation_data()->first_path()); - FromNamespacedPath(&first_path); + node::url::FromNamespacedPath(&first_path); MaybeLocal path = StringBytes::Encode(env->isolate(), first_path.c_str(), UTF8, &error); if (path.IsEmpty()) { - Local ctx = args[4].As(); - ctx->Set(env->context(), env->error_string(), error).Check(); + env->isolate()->ThrowException(error); return; } args.GetReturnValue().Set(path.ToLocalChecked()); } } else { - SyncCall(env, args[4], &req_wrap_sync, "mkdir", - uv_fs_mkdir, *path, mode); + SyncCallAndThrowOnError(env, &req_wrap_sync, uv_fs_mkdir, *path, mode); } FS_SYNC_TRACE_END(mkdir); } @@ -1834,28 +1743,27 @@ static void RealPath(const FunctionCallbackInfo& args) { Isolate* isolate = env->isolate(); const int argc = args.Length(); - CHECK_GE(argc, 3); + CHECK_GE(argc, 2); BufferValue path(isolate, args[0]); CHECK_NOT_NULL(*path); const enum encoding encoding = ParseEncoding(isolate, args[1], UTF8); - FSReqBase* req_wrap_async = GetReqWrap(args, 2); - if (req_wrap_async != nullptr) { // realpath(path, encoding, req) + if (argc > 2) { // realpath(path, encoding, req) + FSReqBase* req_wrap_async = GetReqWrap(args, 2); FS_ASYNC_TRACE_BEGIN1( UV_FS_REALPATH, req_wrap_async, "path", TRACE_STR_COPY(*path)) AsyncCall(env, req_wrap_async, args, "realpath", encoding, AfterStringPtr, uv_fs_realpath, *path); } else { // realpath(path, encoding, undefined, ctx) - CHECK_EQ(argc, 4); - FSReqWrapSync req_wrap_sync; + FSReqWrapSync req_wrap_sync("realpath", *path); FS_SYNC_TRACE_BEGIN(realpath); - int err = SyncCall(env, args[3], &req_wrap_sync, "realpath", - uv_fs_realpath, *path); + int err = + SyncCallAndThrowOnError(env, &req_wrap_sync, uv_fs_realpath, *path); FS_SYNC_TRACE_END(realpath); if (err < 0) { - return; // syscall failed, no need to continue, error info is in ctx + return; } const char* link_path = static_cast(req_wrap_sync.req.ptr); @@ -1866,8 +1774,7 @@ static void RealPath(const FunctionCallbackInfo& args) { encoding, &error); if (rc.IsEmpty()) { - Local ctx = args[3].As(); - ctx->Set(env->context(), env->error_string(), error).Check(); + env->isolate()->ThrowException(error); return; } @@ -2322,6 +2229,84 @@ static void WriteString(const FunctionCallbackInfo& args) { } } +static void WriteFileUtf8(const FunctionCallbackInfo& args) { + // Fast C++ path for fs.writeFileSync(path, data) with utf8 encoding + // (file, data, options.flag, options.mode) + + Environment* env = Environment::GetCurrent(args); + auto isolate = env->isolate(); + + CHECK_EQ(args.Length(), 4); + + BufferValue value(isolate, args[1]); + CHECK_NOT_NULL(*value); + + CHECK(args[2]->IsInt32()); + const int flags = args[2].As()->Value(); + + CHECK(args[3]->IsInt32()); + const int mode = args[3].As()->Value(); + + uv_file file; + + bool is_fd = args[0]->IsInt32(); + + // Check for file descriptor + if (is_fd) { + file = args[0].As()->Value(); + } else { + BufferValue path(isolate, args[0]); + CHECK_NOT_NULL(*path); + if (CheckOpenPermissions(env, path, flags).IsNothing()) return; + + FSReqWrapSync req_open("open", *path); + + FS_SYNC_TRACE_BEGIN(open); + file = + SyncCallAndThrowOnError(env, &req_open, uv_fs_open, *path, flags, mode); + FS_SYNC_TRACE_END(open); + + if (is_uv_error(file)) { + return; + } + } + + int bytesWritten = 0; + uint32_t offset = 0; + + const size_t length = value.length(); + uv_buf_t uvbuf = uv_buf_init(value.out(), length); + + FS_SYNC_TRACE_BEGIN(write); + while (offset < length) { + FSReqWrapSync req_write("write"); + bytesWritten = SyncCallAndThrowOnError( + env, &req_write, uv_fs_write, file, &uvbuf, 1, -1); + + // Write errored out + if (bytesWritten < 0) { + break; + } + + offset += bytesWritten; + DCHECK_LE(offset, length); + uvbuf.base += bytesWritten; + uvbuf.len -= bytesWritten; + } + FS_SYNC_TRACE_END(write); + + if (!is_fd) { + FSReqWrapSync req_close("close"); + + FS_SYNC_TRACE_BEGIN(close); + int result = SyncCallAndThrowOnError(env, &req_close, uv_fs_close, file); + FS_SYNC_TRACE_END(close); + + if (is_uv_error(result)) { + return; + } + } +} /* * Wrapper for read(2). @@ -2366,18 +2351,23 @@ static void Read(const FunctionCallbackInfo& args) { char* buf = buffer_data + off; uv_buf_t uvbuf = uv_buf_init(buf, len); - FSReqBase* req_wrap_async = GetReqWrap(args, 5); - if (req_wrap_async != nullptr) { // read(fd, buffer, offset, len, pos, req) + if (argc > 5) { // read(fd, buffer, offset, len, pos, req) + FSReqBase* req_wrap_async = GetReqWrap(args, 5); + CHECK_NOT_NULL(req_wrap_async); FS_ASYNC_TRACE_BEGIN0(UV_FS_READ, req_wrap_async) AsyncCall(env, req_wrap_async, args, "read", UTF8, AfterInteger, uv_fs_read, fd, &uvbuf, 1, pos); - } else { // read(fd, buffer, offset, len, pos, undefined, ctx) - CHECK_EQ(argc, 7); - FSReqWrapSync req_wrap_sync; + } else { // read(fd, buffer, offset, len, pos) + FSReqWrapSync req_wrap_sync("read"); FS_SYNC_TRACE_BEGIN(read); - const int bytesRead = SyncCall(env, args[6], &req_wrap_sync, "read", - uv_fs_read, fd, &uvbuf, 1, pos); + const int bytesRead = SyncCallAndThrowOnError( + env, &req_wrap_sync, uv_fs_read, fd, &uvbuf, 1, pos); FS_SYNC_TRACE_END(read, "bytesRead", bytesRead); + + if (is_uv_error(bytesRead)) { + return; + } + args.GetReturnValue().Set(bytesRead); } } @@ -2476,18 +2466,20 @@ static void ReadBuffers(const FunctionCallbackInfo& args) { iovs[i] = uv_buf_init(Buffer::Data(buffer), Buffer::Length(buffer)); } - FSReqBase* req_wrap_async = GetReqWrap(args, 3); - if (req_wrap_async != nullptr) { // readBuffers(fd, buffers, pos, req) + if (argc > 3) { // readBuffers(fd, buffers, pos, req) + FSReqBase* req_wrap_async = GetReqWrap(args, 3); FS_ASYNC_TRACE_BEGIN0(UV_FS_READ, req_wrap_async) AsyncCall(env, req_wrap_async, args, "read", UTF8, AfterInteger, uv_fs_read, fd, *iovs, iovs.length(), pos); } else { // readBuffers(fd, buffers, undefined, ctx) - CHECK_EQ(argc, 5); - FSReqWrapSync req_wrap_sync; + FSReqWrapSync req_wrap_sync("read"); FS_SYNC_TRACE_BEGIN(read); - int bytesRead = SyncCall(env, /* ctx */ args[4], &req_wrap_sync, "read", - uv_fs_read, fd, *iovs, iovs.length(), pos); + int bytesRead = SyncCallAndThrowOnError( + env, &req_wrap_sync, uv_fs_read, fd, *iovs, iovs.length(), pos); FS_SYNC_TRACE_END(read, "bytesRead", bytesRead); + if (is_uv_error(bytesRead)) { + return; + } args.GetReturnValue().Set(bytesRead); } } @@ -2534,8 +2526,10 @@ static void FChmod(const FunctionCallbackInfo& args) { const int argc = args.Length(); CHECK_GE(argc, 2); - CHECK(args[0]->IsInt32()); - const int fd = args[0].As()->Value(); + int fd; + if (!GetValidatedFd(env, args[0]).To(&fd)) { + return; + } CHECK(args[1]->IsInt32()); const int mode = args[1].As()->Value(); @@ -2573,18 +2567,16 @@ static void Chown(const FunctionCallbackInfo& args) { CHECK(IsSafeJsInt(args[2])); const uv_gid_t gid = static_cast(args[2].As()->Value()); - FSReqBase* req_wrap_async = GetReqWrap(args, 3); - if (req_wrap_async != nullptr) { // chown(path, uid, gid, req) + if (argc > 3) { // chown(path, uid, gid, req) + FSReqBase* req_wrap_async = GetReqWrap(args, 3); FS_ASYNC_TRACE_BEGIN1( UV_FS_CHOWN, req_wrap_async, "path", TRACE_STR_COPY(*path)) AsyncCall(env, req_wrap_async, args, "chown", UTF8, AfterNoArgs, uv_fs_chown, *path, uid, gid); - } else { // chown(path, uid, gid, undefined, ctx) - CHECK_EQ(argc, 5); - FSReqWrapSync req_wrap_sync; + } else { // chown(path, uid, gid) + FSReqWrapSync req_wrap_sync("chown", *path); FS_SYNC_TRACE_BEGIN(chown); - SyncCall(env, args[4], &req_wrap_sync, "chown", - uv_fs_chown, *path, uid, gid); + SyncCallAndThrowOnError(env, &req_wrap_sync, uv_fs_chown, *path, uid, gid); FS_SYNC_TRACE_END(chown); } } @@ -2608,17 +2600,15 @@ static void FChown(const FunctionCallbackInfo& args) { CHECK(IsSafeJsInt(args[2])); const uv_gid_t gid = static_cast(args[2].As()->Value()); - FSReqBase* req_wrap_async = GetReqWrap(args, 3); - if (req_wrap_async != nullptr) { // fchown(fd, uid, gid, req) + if (argc > 3) { // fchown(fd, uid, gid, req) + FSReqBase* req_wrap_async = GetReqWrap(args, 3); FS_ASYNC_TRACE_BEGIN0(UV_FS_FCHOWN, req_wrap_async) AsyncCall(env, req_wrap_async, args, "fchown", UTF8, AfterNoArgs, uv_fs_fchown, fd, uid, gid); - } else { // fchown(fd, uid, gid, undefined, ctx) - CHECK_EQ(argc, 5); - FSReqWrapSync req_wrap_sync; + } else { // fchown(fd, uid, gid) + FSReqWrapSync req_wrap_sync("fchown"); FS_SYNC_TRACE_BEGIN(fchown); - SyncCall(env, args[4], &req_wrap_sync, "fchown", - uv_fs_fchown, fd, uid, gid); + SyncCallAndThrowOnError(env, &req_wrap_sync, uv_fs_fchown, fd, uid, gid); FS_SYNC_TRACE_END(fchown); } } @@ -2641,18 +2631,16 @@ static void LChown(const FunctionCallbackInfo& args) { CHECK(IsSafeJsInt(args[2])); const uv_gid_t gid = static_cast(args[2].As()->Value()); - FSReqBase* req_wrap_async = GetReqWrap(args, 3); - if (req_wrap_async != nullptr) { // lchown(path, uid, gid, req) + if (argc > 3) { // lchown(path, uid, gid, req) + FSReqBase* req_wrap_async = GetReqWrap(args, 3); FS_ASYNC_TRACE_BEGIN1( UV_FS_LCHOWN, req_wrap_async, "path", TRACE_STR_COPY(*path)) AsyncCall(env, req_wrap_async, args, "lchown", UTF8, AfterNoArgs, uv_fs_lchown, *path, uid, gid); - } else { // lchown(path, uid, gid, undefined, ctx) - CHECK_EQ(argc, 5); - FSReqWrapSync req_wrap_sync; + } else { // lchown(path, uid, gid) + FSReqWrapSync req_wrap_sync("lchown", *path); FS_SYNC_TRACE_BEGIN(lchown); - SyncCall(env, args[4], &req_wrap_sync, "lchown", - uv_fs_lchown, *path, uid, gid); + SyncCallAndThrowOnError(env, &req_wrap_sync, uv_fs_lchown, *path, uid, gid); FS_SYNC_TRACE_END(lchown); } } @@ -2696,8 +2684,10 @@ static void FUTimes(const FunctionCallbackInfo& args) { const int argc = args.Length(); CHECK_GE(argc, 3); - CHECK(args[0]->IsInt32()); - const int fd = args[0].As()->Value(); + int fd; + if (!GetValidatedFd(env, args[0]).To(&fd)) { + return; + } CHECK(args[1]->IsNumber()); const double atime = args[1].As()->Value(); @@ -2759,33 +2749,37 @@ static void Mkdtemp(const FunctionCallbackInfo& args) { CHECK_GE(argc, 2); BufferValue tmpl(isolate, args[0]); + static constexpr const char* const suffix = "XXXXXX"; + const auto length = tmpl.length(); + tmpl.AllocateSufficientStorage(length + strlen(suffix)); + snprintf(tmpl.out() + length, tmpl.length(), "%s", suffix); + CHECK_NOT_NULL(*tmpl); THROW_IF_INSUFFICIENT_PERMISSIONS( env, permission::PermissionScope::kFileSystemWrite, tmpl.ToStringView()); const enum encoding encoding = ParseEncoding(isolate, args[1], UTF8); - FSReqBase* req_wrap_async = GetReqWrap(args, 2); - if (req_wrap_async != nullptr) { // mkdtemp(tmpl, encoding, req) + if (argc > 2) { // mkdtemp(tmpl, encoding, req) + FSReqBase* req_wrap_async = GetReqWrap(args, 2); FS_ASYNC_TRACE_BEGIN1( UV_FS_MKDTEMP, req_wrap_async, "path", TRACE_STR_COPY(*tmpl)) AsyncCall(env, req_wrap_async, args, "mkdtemp", encoding, AfterStringPath, uv_fs_mkdtemp, *tmpl); - } else { // mkdtemp(tmpl, encoding, undefined, ctx) - CHECK_EQ(argc, 4); - FSReqWrapSync req_wrap_sync; + } else { // mkdtemp(tmpl, encoding) + FSReqWrapSync req_wrap_sync("mkdtemp", *tmpl); FS_SYNC_TRACE_BEGIN(mkdtemp); - SyncCall(env, args[3], &req_wrap_sync, "mkdtemp", - uv_fs_mkdtemp, *tmpl); + int result = + SyncCallAndThrowOnError(env, &req_wrap_sync, uv_fs_mkdtemp, *tmpl); FS_SYNC_TRACE_END(mkdtemp); - const char* path = req_wrap_sync.req.path; - + if (is_uv_error(result)) { + return; + } Local error; MaybeLocal rc = - StringBytes::Encode(isolate, path, encoding, &error); + StringBytes::Encode(isolate, req_wrap_sync.req.path, encoding, &error); if (rc.IsEmpty()) { - Local ctx = args[3].As(); - ctx->Set(env->context(), env->error_string(), error).Check(); + env->isolate()->ThrowException(error); return; } args.GetReturnValue().Set(rc.ToLocalChecked()); @@ -2837,123 +2831,6 @@ static void GetFormatOfExtensionlessFile( return args.GetReturnValue().Set(EXTENSIONLESS_FORMAT_JAVASCRIPT); } -static bool FileURLToPath( - Environment* env, - const ada::url_aggregator& file_url, - /* The linter can't detect the assign for result_file_path - So we need to ignore since it suggest to put const */ - // NOLINTNEXTLINE(runtime/references) - std::string& result_file_path) { - if (file_url.type != ada::scheme::FILE) { - env->isolate()->ThrowException(ERR_INVALID_URL_SCHEME(env->isolate())); - - return false; - } - - std::string_view pathname = file_url.get_pathname(); -#ifdef _WIN32 - size_t first_percent = std::string::npos; - size_t pathname_size = pathname.size(); - std::string pathname_escaped_slash; - - for (size_t i = 0; i < pathname_size; i++) { - if (pathname[i] == '/') { - pathname_escaped_slash += '\\'; - } else { - pathname_escaped_slash += pathname[i]; - } - - if (pathname[i] != '%') continue; - - if (first_percent == std::string::npos) { - first_percent = i; - } - - // just safe-guard against access the pathname - // outside the bounds - if ((i + 2) >= pathname_size) continue; - - char third = pathname[i + 2] | 0x20; - - bool is_slash = pathname[i + 1] == '2' && third == 102; - bool is_forward_slash = pathname[i + 1] == '5' && third == 99; - - if (!is_slash && !is_forward_slash) continue; - - env->isolate()->ThrowException(ERR_INVALID_FILE_URL_PATH( - env->isolate(), - "File URL path must not include encoded \\ or / characters")); - - return false; - } - - std::string_view hostname = file_url.get_hostname(); - std::string decoded_pathname = ada::unicode::percent_decode( - std::string_view(pathname_escaped_slash), first_percent); - - if (hostname.size() > 0) { - // If hostname is set, then we have a UNC path - // Pass the hostname through domainToUnicode just in case - // it is an IDN using punycode encoding. We do not need to worry - // about percent encoding because the URL parser will have - // already taken care of that for us. Note that this only - // causes IDNs with an appropriate `xn--` prefix to be decoded. - result_file_path = - "\\\\" + ada::unicode::to_unicode(hostname) + decoded_pathname; - - return true; - } - - char letter = decoded_pathname[1] | 0x20; - char sep = decoded_pathname[2]; - - // a..z A..Z - if (letter < 'a' || letter > 'z' || sep != ':') { - env->isolate()->ThrowException(ERR_INVALID_FILE_URL_PATH( - env->isolate(), "File URL path must be absolute")); - - return false; - } - - result_file_path = decoded_pathname.substr(1); - - return true; -#else // _WIN32 - std::string_view hostname = file_url.get_hostname(); - - if (hostname.size() > 0) { - std::string error_message = - std::string("File URL host must be \"localhost\" or empty on ") + - std::string(per_process::metadata.platform); - env->isolate()->ThrowException( - ERR_INVALID_FILE_URL_HOST(env->isolate(), error_message.c_str())); - - return false; - } - - size_t first_percent = std::string::npos; - for (size_t i = 0; (i + 2) < pathname.size(); i++) { - if (pathname[i] != '%') continue; - - if (first_percent == std::string::npos) { - first_percent = i; - } - - if (pathname[i + 1] == '2' && (pathname[i + 2] | 0x20) == 102) { - env->isolate()->ThrowException(ERR_INVALID_FILE_URL_PATH( - env->isolate(), - "File URL path must not include encoded / characters")); - - return false; - } - } - - result_file_path = ada::unicode::percent_decode(pathname, first_percent); - - return true; -#endif // _WIN32 -} - BindingData::FilePathIsFileReturnType BindingData::FilePathIsFile( Environment* env, const std::string& file_path) { THROW_IF_INSUFFICIENT_PERMISSIONS( @@ -3010,43 +2887,41 @@ void BindingData::LegacyMainResolve(const FunctionCallbackInfo& args) { CHECK(args[0]->IsString()); Environment* env = Environment::GetCurrent(args); + auto isolate = env->isolate(); - Utf8Value utf8_package_json_url(env->isolate(), args[0].As()); + Utf8Value utf8_package_json_url(isolate, args[0]); auto package_json_url = ada::parse(utf8_package_json_url.ToStringView()); if (!package_json_url) { - env->isolate()->ThrowException( - ERR_INVALID_URL(env->isolate(), "Invalid URL")); - + THROW_ERR_INVALID_URL(isolate, "Invalid URL"); return; } ada::result file_path_url; - std::string initial_file_path; + std::optional initial_file_path; std::string file_path; - if (args.Length() >= 2 && !args[1]->IsNullOrUndefined() && - args[1]->IsString()) { - std::string package_config_main = - Utf8Value(env->isolate(), args[1].As()).ToString(); + if (args.Length() >= 2 && args[1]->IsString()) { + auto package_config_main = Utf8Value(isolate, args[1]).ToString(); file_path_url = ada::parse( std::string("./") + package_config_main, &package_json_url.value()); if (!file_path_url) { - env->isolate()->ThrowException( - ERR_INVALID_URL(env->isolate(), "Invalid URL")); - + THROW_ERR_INVALID_URL(isolate, "Invalid URL"); return; } - if (!FileURLToPath(env, file_path_url.value(), initial_file_path)) return; + initial_file_path = node::url::FileURLToPath(env, *file_path_url); + if (!initial_file_path.has_value()) { + return; + } - FromNamespacedPath(&initial_file_path); + node::url::FromNamespacedPath(&initial_file_path.value()); for (int i = 0; i < legacy_main_extensions_with_main_end; i++) { - file_path = initial_file_path + std::string(legacy_main_extensions[i]); + file_path = *initial_file_path + std::string(legacy_main_extensions[i]); switch (FilePathIsFile(env, file_path)) { case BindingData::FilePathIsFileReturnType::kIsFile: @@ -3069,20 +2944,21 @@ void BindingData::LegacyMainResolve(const FunctionCallbackInfo& args) { ada::parse("./index", &package_json_url.value()); if (!file_path_url) { - env->isolate()->ThrowException( - ERR_INVALID_URL(env->isolate(), "Invalid URL")); - + THROW_ERR_INVALID_URL(isolate, "Invalid URL"); return; } - if (!FileURLToPath(env, file_path_url.value(), initial_file_path)) return; + initial_file_path = node::url::FileURLToPath(env, *file_path_url); + if (!initial_file_path.has_value()) { + return; + } - FromNamespacedPath(&initial_file_path); + node::url::FromNamespacedPath(&initial_file_path.value()); for (int i = legacy_main_extensions_with_main_end; i < legacy_main_extensions_package_fallback_end; i++) { - file_path = initial_file_path + std::string(legacy_main_extensions[i]); + file_path = *initial_file_path + std::string(legacy_main_extensions[i]); switch (FilePathIsFile(env, file_path)) { case BindingData::FilePathIsFileReturnType::kIsFile: @@ -3099,38 +2975,39 @@ void BindingData::LegacyMainResolve(const FunctionCallbackInfo& args) { } } - std::string module_path; - std::string module_base; + std::optional module_path = + node::url::FileURLToPath(env, *package_json_url); + std::optional module_base; - if (!FileURLToPath(env, package_json_url.value(), module_path)) return; + if (!module_path.has_value()) { + return; + } - if (args.Length() >= 3 && !args[2]->IsNullOrUndefined() && - args[2]->IsString()) { - Utf8Value utf8_base_path(env->isolate(), args[2].As()); + if (args.Length() >= 3 && args[2]->IsString()) { + Utf8Value utf8_base_path(isolate, args[2]); auto base_url = ada::parse(utf8_base_path.ToStringView()); if (!base_url) { - env->isolate()->ThrowException( - ERR_INVALID_URL(env->isolate(), "Invalid URL")); - + THROW_ERR_INVALID_URL(isolate, "Invalid URL"); return; } - if (!FileURLToPath(env, base_url.value(), module_base)) return; + module_base = node::url::FileURLToPath(env, *base_url); + if (!module_base.has_value()) { + return; + } } else { - std::string err_arg_message = - "The \"base\" argument must be of type string or an instance of URL."; - env->isolate()->ThrowException( - ERR_INVALID_ARG_TYPE(env->isolate(), err_arg_message.c_str())); + THROW_ERR_INVALID_ARG_TYPE( + isolate, + "The \"base\" argument must be of type string or an instance of URL."); return; } - env->isolate()->ThrowException( - ERR_MODULE_NOT_FOUND(env->isolate(), - "Cannot find package '%s' imported from %s", - module_path, - module_base)); + THROW_ERR_MODULE_NOT_FOUND(isolate, + "Cannot find package '%s' imported from %s", + *module_path, + *module_base); } void BindingData::MemoryInfo(MemoryTracker* tracker) const { @@ -3268,7 +3145,6 @@ static void CreatePerIsolateProperties(IsolateData* isolate_data, SetMethod(isolate, target, "rmdir", RMDir); SetMethod(isolate, target, "mkdir", MKDir); SetMethod(isolate, target, "readdir", ReadDir); - SetMethod(isolate, target, "internalModuleReadJSON", InternalModuleReadJSON); SetMethod(isolate, target, "internalModuleStat", InternalModuleStat); SetMethod(isolate, target, "stat", Stat); SetMethod(isolate, target, "lstat", LStat); @@ -3281,6 +3157,7 @@ static void CreatePerIsolateProperties(IsolateData* isolate_data, SetMethod(isolate, target, "writeBuffer", WriteBuffer); SetMethod(isolate, target, "writeBuffers", WriteBuffers); SetMethod(isolate, target, "writeString", WriteString); + SetMethod(isolate, target, "writeFileUtf8", WriteFileUtf8); SetMethod(isolate, target, "realpath", RealPath); SetMethod(isolate, target, "copyFile", CopyFile); @@ -3388,7 +3265,6 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) { registry->Register(RMDir); registry->Register(MKDir); registry->Register(ReadDir); - registry->Register(InternalModuleReadJSON); registry->Register(InternalModuleStat); registry->Register(Stat); registry->Register(LStat); @@ -3401,6 +3277,7 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) { registry->Register(WriteBuffer); registry->Register(WriteBuffers); registry->Register(WriteString); + registry->Register(WriteFileUtf8); registry->Register(RealPath); registry->Register(CopyFile); diff --git a/src/node_http2.cc b/src/node_http2.cc index 070b40ae0a6ad6..ebb1ab63c3ff80 100644 --- a/src/node_http2.cc +++ b/src/node_http2.cc @@ -228,6 +228,16 @@ size_t Http2Settings::Init( HTTP2_SETTINGS(V) #undef V + uint32_t numAddSettings = buffer[IDX_SETTINGS_COUNT + 1]; + if (numAddSettings > 0) { + uint32_t offset = IDX_SETTINGS_COUNT + 1 + 1; + for (uint32_t i = 0; i < numAddSettings; i++) { + uint32_t key = buffer[offset + i * 2 + 0]; + uint32_t val = buffer[offset + i * 2 + 1]; + entries[count++] = nghttp2_settings_entry{(int32_t)key, val}; + } + } + return count; } #undef GRABSETTING @@ -262,7 +272,7 @@ Local Http2Settings::Pack() { } Local Http2Settings::Pack(Http2State* state) { - nghttp2_settings_entry entries[IDX_SETTINGS_COUNT]; + nghttp2_settings_entry entries[IDX_SETTINGS_COUNT + MAX_ADDITIONAL_SETTINGS]; size_t count = Init(state, entries); return Pack(state->env(), count, entries); } @@ -298,6 +308,8 @@ void Http2Settings::Update(Http2Session* session, get_setting fn) { fn(session->session(), NGHTTP2_SETTINGS_ ## name); HTTP2_SETTINGS(V) #undef V + buffer[IDX_SETTINGS_COUNT + 1] = + 0; // no additional settings are coming, clear them } // Initializes the shared TypedArray with the default settings values. @@ -314,6 +326,7 @@ void Http2Settings::RefreshDefaults(Http2State* http2_state) { #undef V buffer[IDX_SETTINGS_COUNT] = flags; + buffer[IDX_SETTINGS_COUNT + 1] = 0; // no additional settings } diff --git a/src/node_http2.h b/src/node_http2.h index 87f6ab8305a7d8..6b7fd746021507 100644 --- a/src/node_http2.h +++ b/src/node_http2.h @@ -1035,7 +1035,7 @@ class Http2Settings : public AsyncWrap { v8::Global callback_; uint64_t startTime_; size_t count_ = 0; - nghttp2_settings_entry entries_[IDX_SETTINGS_COUNT]; + nghttp2_settings_entry entries_[IDX_SETTINGS_COUNT + MAX_ADDITIONAL_SETTINGS]; }; class Origins { diff --git a/src/node_http2_state.h b/src/node_http2_state.h index f9ac6b40c3410a..487ddad51d8c22 100644 --- a/src/node_http2_state.h +++ b/src/node_http2_state.h @@ -21,6 +21,9 @@ namespace http2 { IDX_SETTINGS_COUNT }; + // number of max additional settings, thus settings not implemented by nghttp2 + const size_t MAX_ADDITIONAL_SETTINGS = 10; + enum Http2SessionStateIndex { IDX_SESSION_STATE_EFFECTIVE_LOCAL_WINDOW_SIZE, IDX_SESSION_STATE_EFFECTIVE_RECV_DATA_LENGTH, @@ -108,10 +111,11 @@ class Http2State : public BaseObject { offsetof(http2_state_internal, options_buffer), IDX_OPTIONS_FLAGS + 1, root_buffer), - settings_buffer(realm->isolate(), - offsetof(http2_state_internal, settings_buffer), - IDX_SETTINGS_COUNT + 1, - root_buffer) {} + settings_buffer( + realm->isolate(), + offsetof(http2_state_internal, settings_buffer), + IDX_SETTINGS_COUNT + 1 + 1 + 2 * MAX_ADDITIONAL_SETTINGS, + root_buffer) {} AliasedUint8Array root_buffer; AliasedFloat64Array session_state_buffer; @@ -135,7 +139,12 @@ class Http2State : public BaseObject { double stream_stats_buffer[IDX_STREAM_STATS_COUNT]; double session_stats_buffer[IDX_SESSION_STATS_COUNT]; uint32_t options_buffer[IDX_OPTIONS_FLAGS + 1]; - uint32_t settings_buffer[IDX_SETTINGS_COUNT + 1]; + // first + 1: number of actual nghttp2 supported settings + // second + 1: number of additional settings not suppoted by nghttp2 + // 2 * MAX_ADDITIONAL_SETTINGS: settings id and value for each + // additional setting + uint32_t settings_buffer[IDX_SETTINGS_COUNT + 1 + 1 + + 2 * MAX_ADDITIONAL_SETTINGS]; }; }; diff --git a/src/node_internals.h b/src/node_internals.h index d7f78664615fcf..1fa1f72fba9bdc 100644 --- a/src/node_internals.h +++ b/src/node_internals.h @@ -79,7 +79,19 @@ void GetSockOrPeerName(const v8::FunctionCallbackInfo& args) { args.GetReturnValue().Set(err); } -void PrintStackTrace(v8::Isolate* isolate, v8::Local stack); +constexpr int kMaxFrameCountForLogging = 10; +v8::MaybeLocal GetCurrentStackTrace( + v8::Isolate* isolate, int frame_count = kMaxFrameCountForLogging); + +enum class StackTracePrefix { + kAt, // " at " + kNumber +}; +void PrintCurrentStackTrace(v8::Isolate* isolate, + StackTracePrefix prefix = StackTracePrefix::kAt); +void PrintStackTrace(v8::Isolate* isolate, + v8::Local stack, + StackTracePrefix prefix = StackTracePrefix::kAt); void PrintCaughtException(v8::Isolate* isolate, v8::Local context, const v8::TryCatch& try_catch); @@ -180,16 +192,13 @@ static v8::MaybeLocal New(Environment* env, char* src = reinterpret_cast(buf->out()); const size_t len_in_bytes = buf->length() * sizeof(buf->out()[0]); - if (buf->IsAllocated()) + if (buf->IsAllocated()) { ret = New(env, src, len_in_bytes); - else if (!buf->IsInvalidated()) - ret = Copy(env, src, len_in_bytes); - - if (ret.IsEmpty()) - return ret; - - if (buf->IsAllocated()) + // new always takes ownership of src buf->Release(); + } else if (!buf->IsInvalidated()) { + ret = Copy(env, src, len_in_bytes); + } return ret; } @@ -408,6 +417,7 @@ std::string Basename(const std::string& str, const std::string& extension); node_module napi_module_to_node_module(const napi_module* mod); +std::ostream& operator<<(std::ostream& output, const SnapshotFlags& flags); std::ostream& operator<<(std::ostream& output, const std::vector& v); std::ostream& operator<<(std::ostream& output, diff --git a/src/node_main_instance.cc b/src/node_main_instance.cc index e1e456cfad9325..64ab1375708c00 100644 --- a/src/node_main_instance.cc +++ b/src/node_main_instance.cc @@ -56,8 +56,6 @@ NodeMainInstance::NodeMainInstance(const SnapshotData* snapshot_data, platform, array_buffer_allocator_.get(), snapshot_data->AsEmbedderWrapper().get())); - isolate_data_->set_is_building_snapshot( - per_process::cli_options->per_isolate->build_snapshot); isolate_data_->max_young_gen_size = isolate_params_->constraints.max_young_generation_size_in_bytes(); diff --git a/src/node_messaging.cc b/src/node_messaging.cc index 6d2cbf8726c4e4..0195a1bb2e448c 100644 --- a/src/node_messaging.cc +++ b/src/node_messaging.cc @@ -30,6 +30,7 @@ using v8::Maybe; using v8::MaybeLocal; using v8::Nothing; using v8::Object; +using v8::ObjectTemplate; using v8::SharedArrayBuffer; using v8::SharedValueConveyor; using v8::String; @@ -717,7 +718,8 @@ MessagePort* MessagePort::New( std::unique_ptr data, std::shared_ptr sibling_group) { Context::Scope context_scope(context); - Local ctor_templ = GetMessagePortConstructorTemplate(env); + Local ctor_templ = + GetMessagePortConstructorTemplate(env->isolate_data()); // Construct a new instance, then assign the listener instance and possibly // the MessagePortData to it. @@ -789,9 +791,16 @@ MaybeLocal MessagePort::ReceiveMessage(Local context, void MessagePort::OnMessage(MessageProcessingMode mode) { Debug(this, "Running MessagePort::OnMessage()"); + // Maybe the async handle was triggered empty or more than needed. + // The data_ could be freed or, the handle has been/is being closed. + // A possible case for this, is transfer the MessagePort to another + // context, it will call the constructor and trigger the async handle empty. + // Because all data was sent from the preivous context. + if (IsDetached()) return; + HandleScope handle_scope(env()->isolate()); Local context = - object(env()->isolate())->GetCreationContext().ToLocalChecked(); + object(env()->isolate())->GetCreationContextChecked(); size_t processing_limit; if (mode == MessageProcessingMode::kNormalOperation) { @@ -996,48 +1005,69 @@ static Maybe ReadIterable(Environment* env, entries.push_back(val); } - transfer_list.AllocateSufficientStorage(entries.size()); - std::copy(entries.begin(), entries.end(), &transfer_list[0]); + if (!entries.empty()) { + transfer_list.AllocateSufficientStorage(entries.size()); + std::copy(entries.begin(), entries.end(), &transfer_list[0]); + } + return Just(true); } +bool GetTransferList(Environment* env, + Local context, + Local transfer_list_v, + TransferList* transfer_list_out) { + if (transfer_list_v->IsNullOrUndefined()) { + // Browsers ignore null or undefined, and otherwise accept an array or an + // options object. + return true; + } + + if (!transfer_list_v->IsObject()) { + THROW_ERR_INVALID_ARG_TYPE( + env, "Optional transferList argument must be an iterable"); + return false; + } + + bool was_iterable; + if (!ReadIterable(env, context, *transfer_list_out, transfer_list_v) + .To(&was_iterable)) + return false; + if (!was_iterable) { + Local transfer_option; + if (!transfer_list_v.As() + ->Get(context, env->transfer_string()) + .ToLocal(&transfer_option)) + return false; + if (!transfer_option->IsUndefined()) { + if (!ReadIterable(env, context, *transfer_list_out, transfer_option) + .To(&was_iterable)) + return false; + if (!was_iterable) { + THROW_ERR_INVALID_ARG_TYPE( + env, "Optional options.transfer argument must be an iterable"); + return false; + } + } + } + + return true; +} + void MessagePort::PostMessage(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); Local obj = args.This(); - Local context = obj->GetCreationContext().ToLocalChecked(); + Local context = obj->GetCreationContextChecked(); if (args.Length() == 0) { return THROW_ERR_MISSING_ARGS(env, "Not enough arguments to " "MessagePort.postMessage"); } - if (!args[1]->IsNullOrUndefined() && !args[1]->IsObject()) { - // Browsers ignore null or undefined, and otherwise accept an array or an - // options object. - return THROW_ERR_INVALID_ARG_TYPE(env, - "Optional transferList argument must be an iterable"); - } - TransferList transfer_list; - if (args[1]->IsObject()) { - bool was_iterable; - if (!ReadIterable(env, context, transfer_list, args[1]).To(&was_iterable)) - return; - if (!was_iterable) { - Local transfer_option; - if (!args[1].As()->Get(context, env->transfer_string()) - .ToLocal(&transfer_option)) return; - if (!transfer_option->IsUndefined()) { - if (!ReadIterable(env, context, transfer_list, transfer_option) - .To(&was_iterable)) return; - if (!was_iterable) { - return THROW_ERR_INVALID_ARG_TYPE(env, - "Optional options.transfer argument must be an iterable"); - } - } - } + if (!GetTransferList(env, context, args[1], &transfer_list)) { + return; } - MessagePort* port = Unwrap(args.This()); // Even if the backing MessagePort object has already been deleted, we still // want to serialize the message to ensure spec-compliant behavior w.r.t. @@ -1088,7 +1118,8 @@ void MessagePort::Stop(const FunctionCallbackInfo& args) { void MessagePort::CheckType(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); args.GetReturnValue().Set( - GetMessagePortConstructorTemplate(env)->HasInstance(args[0])); + GetMessagePortConstructorTemplate(env->isolate_data()) + ->HasInstance(args[0])); } void MessagePort::Drain(const FunctionCallbackInfo& args) { @@ -1112,9 +1143,9 @@ void MessagePort::ReceiveMessage(const FunctionCallbackInfo& args) { return; } - MaybeLocal payload = port->ReceiveMessage( - port->object()->GetCreationContext().ToLocalChecked(), - MessageProcessingMode::kForceReadMessages); + MaybeLocal payload = + port->ReceiveMessage(port->object()->GetCreationContextChecked(), + MessageProcessingMode::kForceReadMessages); if (!payload.IsEmpty()) args.GetReturnValue().Set(payload.ToLocalChecked()); } @@ -1165,28 +1196,30 @@ void MessagePort::MemoryInfo(MemoryTracker* tracker) const { tracker->TrackField("emit_message_fn", emit_message_fn_); } -Local GetMessagePortConstructorTemplate(Environment* env) { +Local GetMessagePortConstructorTemplate( + IsolateData* isolate_data) { // Factor generating the MessagePort JS constructor into its own piece // of code, because it is needed early on in the child environment setup. - Local templ = env->message_port_constructor_template(); + Local templ = + isolate_data->message_port_constructor_template(); if (!templ.IsEmpty()) return templ; { - Isolate* isolate = env->isolate(); + Isolate* isolate = isolate_data->isolate(); Local m = NewFunctionTemplate(isolate, MessagePort::New); - m->SetClassName(env->message_port_constructor_string()); + m->SetClassName(isolate_data->message_port_constructor_string()); m->InstanceTemplate()->SetInternalFieldCount( MessagePort::kInternalFieldCount); - m->Inherit(HandleWrap::GetConstructorTemplate(env)); + m->Inherit(HandleWrap::GetConstructorTemplate(isolate_data)); SetProtoMethod(isolate, m, "postMessage", MessagePort::PostMessage); SetProtoMethod(isolate, m, "start", MessagePort::Start); - env->set_message_port_constructor_template(m); + isolate_data->set_message_port_constructor_template(m); } - return GetMessagePortConstructorTemplate(env); + return GetMessagePortConstructorTemplate(isolate_data); } // static @@ -1528,6 +1561,48 @@ static void SetDeserializerCreateObjectFunction( env->set_messaging_deserialize_create_object(args[0].As()); } +static void StructuredClone(const FunctionCallbackInfo& args) { + Isolate* isolate = args.GetIsolate(); + Local context = isolate->GetCurrentContext(); + Realm* realm = Realm::GetCurrent(context); + Environment* env = realm->env(); + + if (args.Length() == 0) { + return THROW_ERR_MISSING_ARGS(env, "The value argument must be specified"); + } + + Local value = args[0]; + + TransferList transfer_list; + if (!args[1]->IsNullOrUndefined()) { + if (!args[1]->IsObject()) { + return THROW_ERR_INVALID_ARG_TYPE( + env, "The options argument must be either an object or undefined"); + } + Local options = args[1].As(); + Local transfer_list_v; + if (!options->Get(context, env->transfer_string()) + .ToLocal(&transfer_list_v)) { + return; + } + + // TODO(joyeecheung): implement this in JS land to avoid the C++ -> JS + // cost to convert a sequence into an array. + if (!GetTransferList(env, context, transfer_list_v, &transfer_list)) { + return; + } + } + + std::shared_ptr msg = std::make_shared(); + Local result; + if (msg->Serialize(env, context, value, transfer_list, Local()) + .IsNothing() || + !msg->Deserialize(env, context, nullptr).ToLocal(&result)) { + return; + } + args.GetReturnValue().Set(result); +} + static void MessageChannel(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); if (!args.IsConstructCall()) { @@ -1535,7 +1610,7 @@ static void MessageChannel(const FunctionCallbackInfo& args) { return; } - Local context = args.This()->GetCreationContext().ToLocalChecked(); + Local context = args.This()->GetCreationContextChecked(); Context::Scope context_scope(context); MessagePort* port1 = MessagePort::New(env, context); @@ -1566,15 +1641,12 @@ static void BroadcastChannel(const FunctionCallbackInfo& args) { } } -static void InitMessaging(Local target, - Local unused, - Local context, - void* priv) { - Environment* env = Environment::GetCurrent(context); - Isolate* isolate = env->isolate(); +static void CreatePerIsolateProperties(IsolateData* isolate_data, + Local target) { + Isolate* isolate = isolate_data->isolate(); { - SetConstructorFunction(context, + SetConstructorFunction(isolate, target, "MessageChannel", NewFunctionTemplate(isolate, MessageChannel)); @@ -1585,30 +1657,36 @@ static void InitMessaging(Local target, t->InstanceTemplate()->SetInternalFieldCount( JSTransferable::kInternalFieldCount); t->SetClassName(OneByteString(isolate, "JSTransferable")); - env->isolate_data()->set_js_transferable_constructor_template(t); + isolate_data->set_js_transferable_constructor_template(t); } - SetConstructorFunction(context, + SetConstructorFunction(isolate, target, - env->message_port_constructor_string(), - GetMessagePortConstructorTemplate(env), - SetConstructorFunctionFlag::NONE); + isolate_data->message_port_constructor_string(), + GetMessagePortConstructorTemplate(isolate_data)); // These are not methods on the MessagePort prototype, because // the browser equivalents do not provide them. - SetMethod(context, target, "stopMessagePort", MessagePort::Stop); - SetMethod(context, target, "checkMessagePort", MessagePort::CheckType); - SetMethod(context, target, "drainMessagePort", MessagePort::Drain); + SetMethod(isolate, target, "stopMessagePort", MessagePort::Stop); + SetMethod(isolate, target, "checkMessagePort", MessagePort::CheckType); + SetMethod(isolate, target, "drainMessagePort", MessagePort::Drain); SetMethod( - context, target, "receiveMessageOnPort", MessagePort::ReceiveMessage); + isolate, target, "receiveMessageOnPort", MessagePort::ReceiveMessage); SetMethod( - context, target, "moveMessagePortToContext", MessagePort::MoveToContext); - SetMethod(context, + isolate, target, "moveMessagePortToContext", MessagePort::MoveToContext); + SetMethod(isolate, target, "setDeserializerCreateObjectFunction", SetDeserializerCreateObjectFunction); - SetMethod(context, target, "broadcastChannel", BroadcastChannel); + SetMethod(isolate, target, "broadcastChannel", BroadcastChannel); + SetMethod(isolate, target, "structuredClone", StructuredClone); +} +static void CreatePerContextProperties(Local target, + Local unused, + Local context, + void* priv) { + Environment* env = Environment::GetCurrent(context); { Local domexception = GetDOMException(context).ToLocalChecked(); target @@ -1631,6 +1709,7 @@ static void RegisterExternalReferences(ExternalReferenceRegistry* registry) { registry->Register(MessagePort::ReceiveMessage); registry->Register(MessagePort::MoveToContext); registry->Register(SetDeserializerCreateObjectFunction); + registry->Register(StructuredClone); } } // anonymous namespace @@ -1638,6 +1717,9 @@ static void RegisterExternalReferences(ExternalReferenceRegistry* registry) { } // namespace worker } // namespace node -NODE_BINDING_CONTEXT_AWARE_INTERNAL(messaging, node::worker::InitMessaging) +NODE_BINDING_CONTEXT_AWARE_INTERNAL(messaging, + node::worker::CreatePerContextProperties) +NODE_BINDING_PER_ISOLATE_INIT(messaging, + node::worker::CreatePerIsolateProperties) NODE_BINDING_EXTERNAL_REFERENCE(messaging, node::worker::RegisterExternalReferences) diff --git a/src/node_messaging.h b/src/node_messaging.h index a32d477c2e2f79..6dd34b8bd5a407 100644 --- a/src/node_messaging.h +++ b/src/node_messaging.h @@ -379,7 +379,7 @@ class JSTransferable : public BaseObject { }; v8::Local GetMessagePortConstructorTemplate( - Environment* env); + IsolateData* isolate_data); } // namespace worker } // namespace node diff --git a/src/node_metadata.cc b/src/node_metadata.cc index 112d6a9b7fb56f..14fb8ec9714001 100644 --- a/src/node_metadata.cc +++ b/src/node_metadata.cc @@ -8,13 +8,19 @@ #include "llhttp.h" #include "nghttp2/nghttp2ver.h" #include "node.h" +#include "simdjson.h" #include "simdutf.h" #include "undici_version.h" #include "util.h" #include "uv.h" #include "uvwasi.h" #include "v8.h" -#include "zlib.h" + +#ifdef NODE_BUNDLED_ZLIB +#include "zlib_version.h" +#else +#include +#endif // NODE_BUNDLED_ZLIB #if HAVE_OPENSSL #include @@ -78,7 +84,11 @@ Metadata::Versions::Versions() { node = NODE_VERSION_STRING; v8 = v8::V8::GetVersion(); uv = uv_version_string(); +#ifdef NODE_BUNDLED_ZLIB zlib = ZLIB_VERSION; +#else + zlib = zlibVersion(); +#endif // NODE_BUNDLED_ZLIB ares = ARES_VERSION_STR; modules = NODE_STRINGIFY(NODE_MODULE_VERSION); nghttp2 = NGHTTP2_VERSION; @@ -119,6 +129,7 @@ Metadata::Versions::Versions() { nghttp3 = NGHTTP3_VERSION; #endif + simdjson = SIMDJSON_VERSION; simdutf = SIMDUTF_VERSION; ada = ADA_VERSION; } diff --git a/src/node_metadata.h b/src/node_metadata.h index cf051585e779e2..2eccd1d9dcdfd0 100644 --- a/src/node_metadata.h +++ b/src/node_metadata.h @@ -46,6 +46,7 @@ namespace node { V(llhttp) \ V(uvwasi) \ V(acorn) \ + V(simdjson) \ V(simdutf) \ V(ada) \ NODE_VERSIONS_KEY_UNDICI(V) \ diff --git a/src/node_modules.cc b/src/node_modules.cc new file mode 100644 index 00000000000000..9dca1857f96e43 --- /dev/null +++ b/src/node_modules.cc @@ -0,0 +1,453 @@ +#include "node_modules.h" +#include +#include "base_object-inl.h" +#include "node_errors.h" +#include "node_external_reference.h" +#include "node_url.h" +#include "permission/permission.h" +#include "permission/permission_base.h" +#include "util-inl.h" +#include "v8-fast-api-calls.h" +#include "v8-function-callback.h" +#include "v8-primitive.h" +#include "v8-value.h" +#include "v8.h" + +#include "simdjson.h" + +namespace node { +namespace modules { + +using v8::Array; +using v8::Context; +using v8::FunctionCallbackInfo; +using v8::HandleScope; +using v8::Isolate; +using v8::Local; +using v8::NewStringType; +using v8::Object; +using v8::ObjectTemplate; +using v8::Primitive; +using v8::String; +using v8::Undefined; +using v8::Value; + +#ifdef __POSIX__ +constexpr char kPathSeparator = '/'; +constexpr std::string_view kNodeModules = "/node_modules"; +#else +constexpr char kPathSeparator = '\\'; +constexpr std::string_view kNodeModules = "\\node_modules"; +#endif + +void BindingData::MemoryInfo(MemoryTracker* tracker) const { + // Do nothing +} + +BindingData::BindingData(Realm* realm, + v8::Local object, + InternalFieldInfo* info) + : SnapshotableObject(realm, object, type_int) {} + +bool BindingData::PrepareForSerialization(v8::Local context, + v8::SnapshotCreator* creator) { + // Return true because we need to maintain the reference to the binding from + // JS land. + return true; +} + +InternalFieldInfoBase* BindingData::Serialize(int index) { + DCHECK_IS_SNAPSHOT_SLOT(index); + InternalFieldInfo* info = + InternalFieldInfoBase::New(type()); + return info; +} + +void BindingData::Deserialize(v8::Local context, + v8::Local holder, + int index, + InternalFieldInfoBase* info) { + DCHECK_IS_SNAPSHOT_SLOT(index); + HandleScope scope(context->GetIsolate()); + Realm* realm = Realm::GetCurrent(context); + BindingData* binding = realm->AddBindingData(holder); + CHECK_NOT_NULL(binding); +} + +Local BindingData::PackageConfig::Serialize(Realm* realm) const { + auto has_manifest = !realm->env()->options()->experimental_policy.empty(); + auto isolate = realm->isolate(); + const auto ToString = [isolate](std::string_view input) -> Local { + return String::NewFromUtf8( + isolate, input.data(), NewStringType::kNormal, input.size()) + .ToLocalChecked(); + }; + Local values[7] = { + name.has_value() ? ToString(*name) : Undefined(isolate), + main.has_value() ? ToString(*main) : Undefined(isolate), + ToString(type), + imports.has_value() ? ToString(*imports) : Undefined(isolate), + exports.has_value() ? ToString(*exports) : Undefined(isolate), + has_manifest ? ToString(raw_json) : Undefined(isolate), + ToString(file_path), + }; + return Array::New(isolate, values, 7); +} + +const BindingData::PackageConfig* BindingData::GetPackageJSON( + Realm* realm, std::string_view path, ErrorContext* error_context) { + auto binding_data = realm->GetBindingData(); + + auto cache_entry = binding_data->package_configs_.find(path.data()); + if (cache_entry != binding_data->package_configs_.end()) { + return &cache_entry->second; + } + + PackageConfig package_config{}; + package_config.file_path = path; + // No need to exclude BOM since simdjson will skip it. + if (ReadFileSync(&package_config.raw_json, path.data()) < 0) { + return nullptr; + } + + simdjson::ondemand::document document; + simdjson::ondemand::object main_object; + simdjson::error_code error = + binding_data->json_parser.iterate(package_config.raw_json).get(document); + + const auto throw_invalid_package_config = [error_context, path, realm]() { + if (error_context == nullptr) { + THROW_ERR_INVALID_PACKAGE_CONFIG( + realm->isolate(), "Invalid package config %s.", path.data()); + } else if (error_context->base.has_value()) { + auto file_url = ada::parse(error_context->base.value()); + CHECK(file_url); + auto file_path = url::FileURLToPath(realm->env(), *file_url); + CHECK(file_path.has_value()); + THROW_ERR_INVALID_PACKAGE_CONFIG( + realm->isolate(), + "Invalid package config %s while importing \"%s\" from %s.", + path.data(), + error_context->specifier.c_str(), + file_path->c_str()); + } else { + THROW_ERR_INVALID_PACKAGE_CONFIG( + realm->isolate(), "Invalid package config %s.", path.data()); + } + + return nullptr; + }; + + if (error || document.get_object().get(main_object)) { + return throw_invalid_package_config(); + } + + simdjson::ondemand::raw_json_string key; + simdjson::ondemand::value value; + std::string_view field_value; + simdjson::ondemand::json_type field_type; + + for (auto field : main_object) { + // Throw error if getting key or value fails. + if (field.key().get(key) || field.value().get(value)) { + return throw_invalid_package_config(); + } + + // based on coverity using key with == derefs the raw value + // avoid derefing if its null + if (key.raw() == nullptr) continue; + + if (key == "name") { + // Though there is a key "name" with a corresponding value, + // the value may not be a string or could be an invalid JSON string + if (value.get_string(package_config.name)) { + return throw_invalid_package_config(); + } + } else if (key == "main") { + // Omit all non-string values + USE(value.get_string(package_config.main)); + } else if (key == "exports") { + if (value.type().get(field_type)) { + return throw_invalid_package_config(); + } + switch (field_type) { + case simdjson::ondemand::json_type::object: + case simdjson::ondemand::json_type::array: { + if (value.raw_json().get(field_value)) { + return throw_invalid_package_config(); + } + package_config.exports = field_value; + break; + } + case simdjson::ondemand::json_type::string: { + if (value.get_string(package_config.exports)) { + return throw_invalid_package_config(); + } + break; + } + default: + break; + } + } else if (key == "imports") { + if (value.type().get(field_type)) { + return throw_invalid_package_config(); + } + switch (field_type) { + case simdjson::ondemand::json_type::array: + case simdjson::ondemand::json_type::object: { + if (value.raw_json().get(field_value)) { + return throw_invalid_package_config(); + } + package_config.imports = field_value; + break; + } + case simdjson::ondemand::json_type::string: { + if (value.get_string(package_config.imports)) { + return throw_invalid_package_config(); + } + break; + } + default: + break; + } + } else if (key == "type") { + if (value.get_string().get(field_value)) { + return throw_invalid_package_config(); + } + // Only update type if it is "commonjs" or "module" + // The default value is "none" for backward compatibility. + if (field_value == "commonjs" || field_value == "module") { + package_config.type = field_value; + } + } + } + // package_config could be quite large, so we should move it instead of + // copying it. + auto cached = binding_data->package_configs_.insert( + {std::string(path), std::move(package_config)}); + + return &cached.first->second; +} + +void BindingData::ReadPackageJSON(const FunctionCallbackInfo& args) { + CHECK_GE(args.Length(), 1); // path, [is_esm, base, specifier] + CHECK(args[0]->IsString()); // path + + Realm* realm = Realm::GetCurrent(args); + auto isolate = realm->isolate(); + + Utf8Value path(isolate, args[0]); + bool is_esm = args[1]->IsTrue(); + auto error_context = ErrorContext(); + if (is_esm) { + CHECK(args[2]->IsUndefined() || args[2]->IsString()); // base + CHECK(args[3]->IsString()); // specifier + + if (args[2]->IsString()) { + Utf8Value base_value(isolate, args[2]); + error_context.base = base_value.ToString(); + } + Utf8Value specifier(isolate, args[3]); + error_context.specifier = specifier.ToString(); + } + + THROW_IF_INSUFFICIENT_PERMISSIONS( + realm->env(), + permission::PermissionScope::kFileSystemRead, + path.ToStringView()); + + auto package_json = + GetPackageJSON(realm, path.ToString(), is_esm ? &error_context : nullptr); + if (package_json == nullptr) { + return; + } + + args.GetReturnValue().Set(package_json->Serialize(realm)); +} + +const BindingData::PackageConfig* BindingData::TraverseParent( + Realm* realm, std::string_view check_path) { + auto env = realm->env(); + auto root_separator_index = check_path.find_first_of(kPathSeparator); + size_t separator_index = 0; + const bool is_permissions_enabled = env->permission()->enabled(); + + do { + separator_index = check_path.find_last_of(kPathSeparator); + check_path = check_path.substr(0, separator_index); + + // We don't need to try "/" + if (check_path.empty()) { + break; + } + + // Stop the search when the process doesn't have permissions + // to walk upwards + if (UNLIKELY(is_permissions_enabled && + !env->permission()->is_granted( + permission::PermissionScope::kFileSystemRead, + std::string(check_path) + kPathSeparator))) { + return nullptr; + } + + // Check if the path ends with `/node_modules` + if (check_path.size() >= kNodeModules.size() && + std::equal(check_path.end() - kNodeModules.size(), + check_path.end(), + kNodeModules.begin())) { + return nullptr; + } + + auto package_json = GetPackageJSON( + realm, + std::string(check_path) + kPathSeparator + "package.json", + nullptr); + if (package_json != nullptr) { + return package_json; + } + } while (separator_index > root_separator_index); + + return nullptr; +} + +void BindingData::GetNearestParentPackageJSON( + const v8::FunctionCallbackInfo& args) { + CHECK_GE(args.Length(), 1); + CHECK(args[0]->IsString()); + + Realm* realm = Realm::GetCurrent(args); + Utf8Value path_value(realm->isolate(), args[0]); + auto package_json = TraverseParent(realm, path_value.ToStringView()); + + if (package_json != nullptr) { + args.GetReturnValue().Set(package_json->Serialize(realm)); + } +} + +void BindingData::GetNearestParentPackageJSONType( + const FunctionCallbackInfo& args) { + CHECK_GE(args.Length(), 1); + CHECK(args[0]->IsString()); + + Realm* realm = Realm::GetCurrent(args); + Utf8Value path(realm->isolate(), args[0]); + auto package_json = TraverseParent(realm, path.ToStringView()); + + if (package_json == nullptr) { + return; + } + + Local values[3] = { + ToV8Value(realm->context(), package_json->type).ToLocalChecked(), + ToV8Value(realm->context(), package_json->file_path).ToLocalChecked(), + ToV8Value(realm->context(), package_json->raw_json).ToLocalChecked()}; + args.GetReturnValue().Set(Array::New(realm->isolate(), values, 3)); +} + +void BindingData::GetPackageScopeConfig( + const FunctionCallbackInfo& args) { + CHECK_GE(args.Length(), 1); + CHECK(args[0]->IsString()); + + Realm* realm = Realm::GetCurrent(args); + Utf8Value resolved(realm->isolate(), args[0]); + auto package_json_url_base = ada::parse(resolved.ToStringView()); + if (!package_json_url_base) { + url::ThrowInvalidURL(realm->env(), resolved.ToStringView(), std::nullopt); + return; + } + auto package_json_url = + ada::parse("./package.json", &package_json_url_base.value()); + if (!package_json_url) { + url::ThrowInvalidURL(realm->env(), "./package.json", resolved.ToString()); + return; + } + + std::string_view node_modules_package_path = "/node_modules/package.json"; + auto error_context = ErrorContext(); + error_context.is_esm = true; + + // TODO(@anonrig): Rewrite this function and avoid calling URL parser. + while (true) { + auto pathname = package_json_url->get_pathname(); + if (pathname.size() >= node_modules_package_path.size() && + pathname.compare(pathname.size() - node_modules_package_path.size(), + node_modules_package_path.size(), + node_modules_package_path) == 0) { + break; + } + + auto file_url = url::FileURLToPath(realm->env(), *package_json_url); + CHECK(file_url); + error_context.specifier = resolved.ToString(); + auto package_json = GetPackageJSON(realm, *file_url, &error_context); + if (package_json != nullptr) { + return args.GetReturnValue().Set(package_json->Serialize(realm)); + } + + auto last_href = std::string(package_json_url->get_href()); + auto last_pathname = std::string(package_json_url->get_pathname()); + package_json_url = ada::parse("../package.json", &package_json_url.value()); + if (!package_json_url) { + url::ThrowInvalidURL(realm->env(), "../package.json", last_href); + return; + } + + // Terminates at root where ../package.json equals ../../package.json + // (can't just check "/package.json" for Windows support). + if (package_json_url->get_pathname() == last_pathname) { + break; + } + } + + auto package_json_url_as_path = + url::FileURLToPath(realm->env(), *package_json_url); + CHECK(package_json_url_as_path); + return args.GetReturnValue().Set( + String::NewFromUtf8(realm->isolate(), + package_json_url_as_path->c_str(), + NewStringType::kNormal, + package_json_url_as_path->size()) + .ToLocalChecked()); +} + +void BindingData::CreatePerIsolateProperties(IsolateData* isolate_data, + Local target) { + Isolate* isolate = isolate_data->isolate(); + SetMethod(isolate, target, "readPackageJSON", ReadPackageJSON); + SetMethod(isolate, + target, + "getNearestParentPackageJSONType", + GetNearestParentPackageJSONType); + SetMethod(isolate, + target, + "getNearestParentPackageJSON", + GetNearestParentPackageJSON); + SetMethod(isolate, target, "getPackageScopeConfig", GetPackageScopeConfig); +} + +void BindingData::CreatePerContextProperties(Local target, + Local unused, + Local context, + void* priv) { + Realm* realm = Realm::GetCurrent(context); + realm->AddBindingData(target); +} + +void BindingData::RegisterExternalReferences( + ExternalReferenceRegistry* registry) { + registry->Register(ReadPackageJSON); + registry->Register(GetNearestParentPackageJSONType); + registry->Register(GetNearestParentPackageJSON); + registry->Register(GetPackageScopeConfig); +} + +} // namespace modules +} // namespace node + +NODE_BINDING_CONTEXT_AWARE_INTERNAL( + modules, node::modules::BindingData::CreatePerContextProperties) +NODE_BINDING_PER_ISOLATE_INIT( + modules, node::modules::BindingData::CreatePerIsolateProperties) +NODE_BINDING_EXTERNAL_REFERENCE( + modules, node::modules::BindingData::RegisterExternalReferences) diff --git a/src/node_modules.h b/src/node_modules.h new file mode 100644 index 00000000000000..27b2bcb11f56b0 --- /dev/null +++ b/src/node_modules.h @@ -0,0 +1,89 @@ +#ifndef SRC_NODE_MODULES_H_ +#define SRC_NODE_MODULES_H_ + +#include "v8-function-callback.h" +#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS + +#include "node.h" +#include "node_snapshotable.h" +#include "simdjson.h" +#include "util.h" +#include "v8-fast-api-calls.h" +#include "v8.h" + +#include +#include +#include +#include + +namespace node { +class ExternalReferenceRegistry; + +namespace modules { + +class BindingData : public SnapshotableObject { + public: + using InternalFieldInfo = InternalFieldInfoBase; + + struct PackageConfig { + std::string file_path; + std::optional name; + std::optional main; + std::string type = "none"; + std::optional exports; + std::optional imports; + std::string raw_json; + + v8::Local Serialize(Realm* realm) const; + }; + + struct ErrorContext { + std::optional base; + std::string specifier; + bool is_esm; + }; + + BindingData(Realm* realm, + v8::Local obj, + InternalFieldInfo* info = nullptr); + SERIALIZABLE_OBJECT_METHODS() + SET_BINDING_ID(modules_binding_data) + + void MemoryInfo(MemoryTracker* tracker) const override; + SET_SELF_SIZE(BindingData) + SET_MEMORY_INFO_NAME(BindingData) + + static void ReadPackageJSON(const v8::FunctionCallbackInfo& args); + static void GetNearestParentPackageJSON( + const v8::FunctionCallbackInfo& args); + static void GetNearestParentPackageJSONType( + const v8::FunctionCallbackInfo& args); + static void GetPackageScopeConfig( + const v8::FunctionCallbackInfo& args); + + static void CreatePerIsolateProperties(IsolateData* isolate_data, + v8::Local ctor); + static void CreatePerContextProperties(v8::Local target, + v8::Local unused, + v8::Local context, + void* priv); + static void RegisterExternalReferences(ExternalReferenceRegistry* registry); + + private: + std::unordered_map package_configs_; + simdjson::ondemand::parser json_parser; + // returns null on error + static const PackageConfig* GetPackageJSON( + Realm* realm, + std::string_view path, + ErrorContext* error_context = nullptr); + static const PackageConfig* TraverseParent(Realm* realm, + std::string_view check_path); +}; + +} // namespace modules +} // namespace node + +#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS + +#endif // SRC_NODE_MODULES_H_ diff --git a/src/node_options.cc b/src/node_options.cc index fc9940b64c5c33..7b5152172c5ce7 100644 --- a/src/node_options.cc +++ b/src/node_options.cc @@ -347,6 +347,11 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() { &EnvironmentOptions::conditions, kAllowedInEnvvar); AddAlias("-C", "--conditions"); + AddOption("--experimental-detect-module", + "when ambiguous modules fail to evaluate because they contain " + "ES module syntax, try again to evaluate them as ES modules", + &EnvironmentOptions::detect_module, + kAllowedInEnvvar); AddOption("--diagnostic-dir", "set dir for all output files" " (default: current working directory)", @@ -386,6 +391,11 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() { &EnvironmentOptions::experimental_global_customevent, kAllowedInEnvvar, true); + AddOption("--experimental-global-navigator", + "expose experimental Navigator API on the global scope", + &EnvironmentOptions::experimental_global_navigator, + kAllowedInEnvvar, + true); AddOption("--experimental-global-webcrypto", "expose experimental Web Crypto API on the global scope", &EnvironmentOptions::experimental_global_web_crypto, @@ -437,6 +447,10 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() { "allow permissions to write in the filesystem", &EnvironmentOptions::allow_fs_write, kAllowedInEnvvar); + AddOption("--allow-addons", + "allow use of addons when any permissions are set", + &EnvironmentOptions::allow_addons, + kAllowedInEnvvar); AddOption("--allow-child-process", "allow use of child process when any permissions are set", &EnvironmentOptions::allow_child_process, @@ -517,6 +531,10 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() { &EnvironmentOptions::warnings, kAllowedInEnvvar, true); + AddOption("--disable-warning", + "silence specific process warnings", + &EnvironmentOptions::disable_warnings, + kAllowedInEnvvar); AddOption("--force-context-aware", "disable loading non-context-aware addons", &EnvironmentOptions::force_context_aware, @@ -598,6 +616,9 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() { AddOption("--test-concurrency", "specify test runner concurrency", &EnvironmentOptions::test_runner_concurrency); + AddOption("--test-timeout", + "specify test runner timeout", + &EnvironmentOptions::test_runner_timeout); AddOption("--experimental-test-coverage", "enable code coverage in the test runner", &EnvironmentOptions::test_runner_coverage); @@ -655,6 +676,10 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() { "show stack traces on process warnings", &EnvironmentOptions::trace_warnings, kAllowedInEnvvar); + AddOption("--trace-promises", + "show stack traces on promise initialization and resolution", + &EnvironmentOptions::trace_promises, + kAllowedInEnvvar); AddOption("--experimental-default-type", "set module system to use by default", &EnvironmentOptions::type, @@ -833,6 +858,12 @@ PerIsolateOptionsParser::PerIsolateOptionsParser( "Generate a snapshot blob when the process exits.", &PerIsolateOptions::build_snapshot, kDisallowedInEnvvar); + AddOption("--build-snapshot-config", + "Generate a snapshot blob when the process exits using a" + "JSON configuration in the specified path.", + &PerIsolateOptions::build_snapshot_config, + kDisallowedInEnvvar); + Implies("--build-snapshot-config", "--build-snapshot"); Insert(eop, &PerIsolateOptions::get_per_env_options); } diff --git a/src/node_options.h b/src/node_options.h index ba16f54e129aec..915151b7dc2904 100644 --- a/src/node_options.h +++ b/src/node_options.h @@ -104,11 +104,13 @@ class EnvironmentOptions : public Options { public: bool abort_on_uncaught_exception = false; std::vector conditions; + bool detect_module = false; std::string dns_result_order; bool enable_source_maps = false; bool experimental_fetch = true; bool experimental_websocket = false; bool experimental_global_customevent = true; + bool experimental_global_navigator = true; bool experimental_global_web_crypto = true; bool experimental_https_modules = false; bool experimental_wasm_modules = false; @@ -121,6 +123,7 @@ class EnvironmentOptions : public Options { bool experimental_permission = false; std::vector allow_fs_read; std::vector allow_fs_write; + bool allow_addons = false; bool allow_child_process = false; bool allow_worker_threads = false; bool experimental_repl_await = true; @@ -137,6 +140,7 @@ class EnvironmentOptions : public Options { bool allow_native_addons = true; bool global_search_paths = true; bool warnings = true; + std::vector disable_warnings; bool force_context_aware = false; bool pending_deprecation = false; bool preserve_symlinks = false; @@ -160,6 +164,7 @@ class EnvironmentOptions : public Options { bool has_env_file_string = false; bool test_runner = false; uint64_t test_runner_concurrency = 0; + uint64_t test_runner_timeout = 0; bool test_runner_coverage = false; std::vector test_name_pattern; std::vector test_reporter; @@ -175,6 +180,7 @@ class EnvironmentOptions : public Options { bool trace_tls = false; bool trace_uncaught = false; bool trace_warnings = false; + bool trace_promises = false; bool extra_info_on_fatal_exception = true; std::string unhandled_rejections; std::vector userland_loaders; @@ -231,6 +237,7 @@ class PerIsolateOptions : public Options { bool experimental_shadow_realm = false; std::string report_signal = "SIGUSR2"; bool build_snapshot = false; + std::string build_snapshot_config; inline EnvironmentOptions* get_per_env_options(); void CheckOptions(std::vector* errors, std::vector* argv) override; diff --git a/src/node_perf.cc b/src/node_perf.cc index 360cc8bf673073..603af57b2639b2 100644 --- a/src/node_perf.cc +++ b/src/node_perf.cc @@ -291,6 +291,22 @@ void MarkBootstrapComplete(const FunctionCallbackInfo& args) { performance::NODE_PERFORMANCE_MILESTONE_BOOTSTRAP_COMPLETE); } +static double PerformanceNowImpl() { + return static_cast(uv_hrtime() - performance_process_start) / + NANOS_PER_MILLIS; +} + +static double FastPerformanceNow(v8::Local receiver) { + return PerformanceNowImpl(); +} + +static void SlowPerformanceNow(const FunctionCallbackInfo& args) { + args.GetReturnValue().Set(PerformanceNowImpl()); +} + +static v8::CFunction fast_performance_now( + v8::CFunction::Make(FastPerformanceNow)); + static void CreatePerIsolateProperties(IsolateData* isolate_data, Local target) { Isolate* isolate = isolate_data->isolate(); @@ -311,6 +327,8 @@ static void CreatePerIsolateProperties(IsolateData* isolate_data, SetMethod(isolate, target, "getTimeOriginTimestamp", GetTimeOriginTimeStamp); SetMethod(isolate, target, "createELDHistogram", CreateELDHistogram); SetMethod(isolate, target, "markBootstrapComplete", MarkBootstrapComplete); + SetFastMethodNoSideEffect( + isolate, target, "now", SlowPerformanceNow, &fast_performance_now); } void CreatePerContextProperties(Local target, @@ -376,6 +394,9 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) { registry->Register(GetTimeOriginTimeStamp); registry->Register(CreateELDHistogram); registry->Register(MarkBootstrapComplete); + registry->Register(SlowPerformanceNow); + registry->Register(FastPerformanceNow); + registry->Register(fast_performance_now.GetTypeInfo()); HistogramBase::RegisterExternalReferences(registry); IntervalHistogram::RegisterExternalReferences(registry); } diff --git a/src/node_platform.cc b/src/node_platform.cc index 74ab4a3df8f09b..927fdddb8d9a1a 100644 --- a/src/node_platform.cc +++ b/src/node_platform.cc @@ -560,7 +560,7 @@ v8::TracingController* NodePlatform::GetTracingController() { Platform::StackTracePrinter NodePlatform::GetStackTracePrinter() { return []() { fprintf(stderr, "\n"); - DumpBacktrace(stderr); + DumpNativeBacktrace(stderr); fflush(stderr); }; } diff --git a/src/node_process.h b/src/node_process.h index cb8c7962825f46..ee6e6a81676bd6 100644 --- a/src/node_process.h +++ b/src/node_process.h @@ -15,7 +15,7 @@ class MemoryTracker; class ExternalReferenceRegistry; class Realm; -void CreateEnvProxyTemplate(v8::Isolate* isolate, IsolateData* isolate_data); +void CreateEnvProxyTemplate(IsolateData* isolate_data); // Most of the time, it's best to use `console.error` to write // to the process.stderr stream. However, in some cases, such as @@ -48,16 +48,20 @@ void PatchProcessObject(const v8::FunctionCallbackInfo& args); namespace process { class BindingData : public SnapshotableObject { public: + struct InternalFieldInfo : public node::InternalFieldInfoBase { + AliasedBufferIndex hrtime_buffer; + }; + static void AddMethods(v8::Isolate* isolate, v8::Local target); static void RegisterExternalReferences(ExternalReferenceRegistry* registry); - using InternalFieldInfo = InternalFieldInfoBase; - SERIALIZABLE_OBJECT_METHODS() SET_BINDING_ID(process_binding_data) - BindingData(Realm* realm, v8::Local object); + BindingData(Realm* realm, + v8::Local object, + InternalFieldInfo* info = nullptr); void MemoryInfo(MemoryTracker* tracker) const override; SET_MEMORY_INFO_NAME(BindingData) @@ -81,10 +85,10 @@ class BindingData : public SnapshotableObject { static void SlowBigInt(const v8::FunctionCallbackInfo& args); private: - static constexpr size_t kBufferSize = - std::max(sizeof(uint64_t), sizeof(uint32_t) * 3); - v8::Global array_buffer_; - std::shared_ptr backing_store_; + // Buffer length in uint32. + static constexpr size_t kHrTimeBufferLength = 3; + AliasedUint32Array hrtime_buffer_; + InternalFieldInfo* internal_field_info_ = nullptr; // These need to be static so that we have their addresses available to // register as external references in the snapshot at environment creation diff --git a/src/node_process_methods.cc b/src/node_process_methods.cc index 34d3c3af4c3e10..cdbe07947b01d1 100644 --- a/src/node_process_methods.cc +++ b/src/node_process_methods.cc @@ -64,7 +64,7 @@ Mutex umask_mutex; #define NANOS_PER_SEC 1000000000 static void Abort(const FunctionCallbackInfo& args) { - Abort(); + ABORT(); } // For internal testing only, not exposed to userland. @@ -465,15 +465,29 @@ static void ReallyExit(const FunctionCallbackInfo& args) { namespace process { -BindingData::BindingData(Realm* realm, v8::Local object) - : SnapshotableObject(realm, object, type_int) { +BindingData::BindingData(Realm* realm, + v8::Local object, + InternalFieldInfo* info) + : SnapshotableObject(realm, object, type_int), + hrtime_buffer_(realm->isolate(), + kHrTimeBufferLength, + MAYBE_FIELD_PTR(info, hrtime_buffer)) { Isolate* isolate = realm->isolate(); Local context = realm->context(); - Local ab = ArrayBuffer::New(isolate, kBufferSize); - array_buffer_.Reset(isolate, ab); - object->Set(context, FIXED_ONE_BYTE_STRING(isolate, "hrtimeBuffer"), ab) - .ToChecked(); - backing_store_ = ab->GetBackingStore(); + + if (info == nullptr) { + object + ->Set(context, + FIXED_ONE_BYTE_STRING(isolate, "hrtimeBuffer"), + hrtime_buffer_.GetJSArray()) + .ToChecked(); + } else { + hrtime_buffer_.Deserialize(realm->context()); + } + + // The hrtime buffer is referenced from the binding data js object. + // Make the native handle weak to avoid keeping the realm alive. + hrtime_buffer_.MakeWeak(); } v8::CFunction BindingData::fast_number_(v8::CFunction::Make(FastNumber)); @@ -503,7 +517,7 @@ BindingData* BindingData::FromV8Value(Local value) { } void BindingData::MemoryInfo(MemoryTracker* tracker) const { - tracker->TrackField("array_buffer", array_buffer_); + tracker->TrackField("hrtime_buffer", hrtime_buffer_); } // This is the legacy version of hrtime before BigInt was introduced in @@ -516,20 +530,19 @@ void BindingData::MemoryInfo(MemoryTracker* tracker) const { // because there is no Uint64Array in JS. // The third entry contains the remaining nanosecond part of the value. void BindingData::NumberImpl(BindingData* receiver) { - // Make sure we don't accidentally access buffers wiped for snapshot. - CHECK(!receiver->array_buffer_.IsEmpty()); uint64_t t = uv_hrtime(); - uint32_t* fields = static_cast(receiver->backing_store_->Data()); - fields[0] = (t / NANOS_PER_SEC) >> 32; - fields[1] = (t / NANOS_PER_SEC) & 0xffffffff; - fields[2] = t % NANOS_PER_SEC; + receiver->hrtime_buffer_[0] = (t / NANOS_PER_SEC) >> 32; + receiver->hrtime_buffer_[1] = (t / NANOS_PER_SEC) & 0xffffffff; + receiver->hrtime_buffer_[2] = t % NANOS_PER_SEC; } void BindingData::BigIntImpl(BindingData* receiver) { - // Make sure we don't accidentally access buffers wiped for snapshot. - CHECK(!receiver->array_buffer_.IsEmpty()); uint64_t t = uv_hrtime(); - uint64_t* fields = static_cast(receiver->backing_store_->Data()); + // The buffer is a Uint32Array, so we need to reinterpret it as a + // Uint64Array to write the value. The buffer is valid at this scope so we + // can safely cast away the constness. + uint64_t* fields = reinterpret_cast( + const_cast(receiver->hrtime_buffer_.GetNativeBuffer())); fields[0] = t; } @@ -543,9 +556,10 @@ void BindingData::SlowNumber(const v8::FunctionCallbackInfo& args) { bool BindingData::PrepareForSerialization(Local context, v8::SnapshotCreator* creator) { - // It's not worth keeping. - // Release it, we will recreate it when the instance is dehydrated. - array_buffer_.Reset(); + DCHECK_NULL(internal_field_info_); + internal_field_info_ = InternalFieldInfoBase::New(type()); + internal_field_info_->hrtime_buffer = + hrtime_buffer_.Serialize(context, creator); // Return true because we need to maintain the reference to the binding from // JS land. return true; @@ -553,8 +567,8 @@ bool BindingData::PrepareForSerialization(Local context, InternalFieldInfoBase* BindingData::Serialize(int index) { DCHECK_IS_SNAPSHOT_SLOT(index); - InternalFieldInfo* info = - InternalFieldInfoBase::New(type()); + InternalFieldInfo* info = internal_field_info_; + internal_field_info_ = nullptr; return info; } @@ -566,7 +580,9 @@ void BindingData::Deserialize(Local context, v8::HandleScope scope(context->GetIsolate()); Realm* realm = Realm::GetCurrent(context); // Recreate the buffer in the constructor. - BindingData* binding = realm->AddBindingData(holder); + InternalFieldInfo* casted_info = static_cast(info); + BindingData* binding = + realm->AddBindingData(holder, casted_info); CHECK_NOT_NULL(binding); } diff --git a/src/node_realm.cc b/src/node_realm.cc index 7101b23e347c7c..6262ed8cde59f2 100644 --- a/src/node_realm.cc +++ b/src/node_realm.cc @@ -223,7 +223,7 @@ void Realm::PrintInfoForSnapshot() { fprintf(stderr, "BaseObjects of the Realm:\n"); size_t i = 0; ForEachBaseObject([&](BaseObject* obj) { - std::cout << "#" << i++ << " " << obj << ": " << obj->MemoryInfoName() + std::cerr << "#" << i++ << " " << obj << ": " << obj->MemoryInfoName() << "\n"; }); @@ -344,10 +344,11 @@ MaybeLocal PrincipalRealm::BootstrapRealm() { return MaybeLocal(); } + // Setup process.env proxy. Local env_string = FIXED_ONE_BYTE_STRING(isolate_, "env"); Local env_proxy; - CreateEnvProxyTemplate(isolate_, env_->isolate_data()); - if (!env_->env_proxy_template()->NewInstance(context()).ToLocal(&env_proxy) || + if (!isolate_data()->env_proxy_template()->NewInstance(context()).ToLocal( + &env_proxy) || process_object()->Set(context(), env_string, env_proxy).IsNothing()) { return MaybeLocal(); } diff --git a/src/node_report.cc b/src/node_report.cc index 88c9a97789e30b..54121cb6b48210 100644 --- a/src/node_report.cc +++ b/src/node_report.cc @@ -27,7 +27,7 @@ constexpr int NODE_REPORT_VERSION = 3; constexpr int NANOS_PER_SEC = 1000 * 1000 * 1000; constexpr double SEC_PER_MICROS = 1e-6; -constexpr int MAX_FRAME_COUNT = 10; +constexpr int MAX_FRAME_COUNT = node::kMaxFrameCountForLogging; namespace node { using node::worker::Worker; @@ -458,14 +458,13 @@ static void PrintEmptyJavaScriptStack(JSONWriter* writer) { static void PrintJavaScriptStack(JSONWriter* writer, Isolate* isolate, const char* trigger) { - // Can not capture the stacktrace when the isolate is in a OOM state or no - // context is entered. - if (!strcmp(trigger, "OOMError") || !isolate->InContext()) { + HandleScope scope(isolate); + Local stack; + if (!GetCurrentStackTrace(isolate, MAX_FRAME_COUNT).ToLocal(&stack)) { PrintEmptyJavaScriptStack(writer); return; } - HandleScope scope(isolate); RegisterState state; state.pc = nullptr; state.fp = &state; @@ -476,18 +475,6 @@ static void PrintJavaScriptStack(JSONWriter* writer, void* samples[MAX_FRAME_COUNT]; isolate->GetStackSample(state, samples, MAX_FRAME_COUNT, &info); - constexpr StackTrace::StackTraceOptions stack_trace_options = - static_cast( - StackTrace::kDetailed | - StackTrace::kExposeFramesAcrossSecurityOrigins); - Local stack = StackTrace::CurrentStackTrace( - isolate, MAX_FRAME_COUNT, stack_trace_options); - - if (stack->GetFrameCount() == 0) { - PrintEmptyJavaScriptStack(writer); - return; - } - writer->json_keyvalue("message", trigger); writer->json_arraystart("stack"); for (int i = 0; i < stack->GetFrameCount(); i++) { diff --git a/src/node_root_certs.h b/src/node_root_certs.h index 2d30eef6192d05..cb1c6d7b70a446 100644 --- a/src/node_root_certs.h +++ b/src/node_root_certs.h @@ -655,39 +655,6 @@ "WD9f\n" "-----END CERTIFICATE-----", -/* Autoridad de Certificacion Firmaprofesional CIF A62634068 */ -"-----BEGIN CERTIFICATE-----\n" -"MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMx\n" -"QjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwg\n" -"Q0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNV\n" -"BAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zl\n" -"c2lvbmFsIENJRiBBNjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDK\n" -"lmuO6vj78aI14H9M2uDDUtd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOS\n" -"L/UR5GLXMnE42QQMcas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9\n" -"qFD0sefGL9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i\n" -"NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2\n" -"f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44\n" -"I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCyZ/QYFpM6/EfY0XiWMR+6Kwxf\n" -"XZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy\n" -"9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF\n" -"8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mV\n" -"BngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8C\n" -"AQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD\n" -"VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZpcm1hcHJv\n" -"ZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAAbABh\n" -"ACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx\n" -"ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+\n" -"xDLx51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5x\n" -"hOW1//qkR71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5\n" -"eTSSPi5E6PaPT481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5Fl\n" -"ClrD2VQS3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k\n" -"SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2\n" -"gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYD\n" -"NEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhr\n" -"JKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIyS\n" -"xZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V\n" -"-----END CERTIFICATE-----", - /* Izenpe.com */ "-----BEGIN CERTIFICATE-----\n" "MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYD\n" @@ -3440,4 +3407,141 @@ "dDTedk+SKlOxJTnbPP/lPqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcEoji2jbDw\n" "N/zIIX8/syQbPYtuzE2wFg2WHYMfRsCbvUOZ58SWLs5fyQ==\n" "-----END CERTIFICATE-----", + +/* TrustAsia Global Root CA G3 */ +"-----BEGIN CERTIFICATE-----\n" +"MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEMBQAwWjEL\n" +"MAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAi\n" +"BgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAeFw0yMTA1MjAwMjEwMTlaFw00\n" +"NjA1MTkwMjEwMTlaMFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5v\n" +"bG9naWVzLCBJbmMuMSQwIgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIi\n" +"MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7\n" +"dOoKjbmzTNyPtxNST1QY4SxzlZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+\n" +"sX4WuDqKAtCWHwDNBSHvBm3dIZwZQ0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1\n" +"nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/VP68czH5GX6zfZBCK70bwkPAPLfSIC7Epqq+FqklY\n" +"qL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1AgdB4SQXMeJNnKziyhWTXAyB1GJ2Faj/lN03J5\n" +"Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm9WAPzJMshH/x/Gr8m0ed262IPfN2dTPX\n" +"S6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gXzhqcD0r83ERoVGjiQTz+LISGNzzNPy+i\n" +"2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAvkV34PmVACxmZySYgWmjBNb9Pp1Hx2BErW+Canig7\n" +"CjoKH8GB5S7wprlppYiU5msTf9FkPz2ccEblooV7WIQn3MSAPmeamseaMQ4w7OYXQJXZRe0B\n" +"lqq/DPNL0WP3E1jAuPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCFTIcQcf+eQxuulXUt\n" +"gQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj7zjKsK5Xf/Ih\n" +"MBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8EBAMCAQYw\n" +"DQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4wM8zAQLpw6o1D/GU\n" +"E3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2XFNFV1pF1AWZLy4jVe5jaN/T\n" +"G3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4\n" +"sTNjduMNhXJEIlU/HHzp/LgV6FL6qj6jITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4\n" +"X6RJpstlcHboCoWASzY9M/eVVHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyf\n" +"T0gA+QEEVcys+TIxxHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjX\n" +"y9mPX1onAX1daBli2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d\n" +"7XB4tmBZrOFdRWOPyN9yaFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2NtjjgKGLzZlk\n" +"D8Kqq7HK9W+eQ42EVJmzbsASZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV+Hfsm6vxL2PZQl/g\n" +"Z4FkkfGXL/xuJvYz+NO1+MRiqzFRJQJ6+N1rZdVtTTDIZbpoFGWsJwt0ivKH\n" +"-----END CERTIFICATE-----", + +/* TrustAsia Global Root CA G4 */ +"-----BEGIN CERTIFICATE-----\n" +"MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMwWjELMAkG\n" +"A1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNV\n" +"BAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0yMTA1MjAwMjEwMjJaFw00NjA1\n" +"MTkwMjEwMjJaMFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9n\n" +"aWVzLCBJbmMuMSQwIgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcq\n" +"hkjOPQIBBgUrgQQAIgNiAATxs8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfb\n" +"K5bKfFJV4hrhPVbwLxYI+hW8m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/\n" +"eSm4IJijYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mD\n" +"pm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/pDHel4NZg6ZvccveMA4GA1UdDwEB/wQEAwIBBjAK\n" +"BggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AAbbd+NvBNEU/zy4k6LHiRUKNbwMp1JvK/kF0L\n" +"goxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xkdUfFVZDj/bpV6wfEU6s3qe4hsiFbYI89\n" +"MvHVI5TWWA==\n" +"-----END CERTIFICATE-----", + +/* CommScope Public Trust ECC Root-01 */ +"-----BEGIN CERTIFICATE-----\n" +"MIICHTCCAaOgAwIBAgIUQ3CCd89NXTTxyq4yLzf39H91oJ4wCgYIKoZIzj0EAwMwTjELMAkG\n" +"A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1Ymxp\n" +"YyBUcnVzdCBFQ0MgUm9vdC0wMTAeFw0yMTA0MjgxNzM1NDNaFw00NjA0MjgxNzM1NDJaME4x\n" +"CzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQ\n" +"dWJsaWMgVHJ1c3QgRUNDIFJvb3QtMDEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARLNumuV16o\n" +"cNfQj3Rid8NeeqrltqLxeP0CflfdkXmcbLlSiFS8LwS+uM32ENEp7LXQoMPwiXAZu1FlxUOc\n" +"w5tjnSCDPgYLpkJEhRGnSjot6dZoL0hOUysHP029uax3OVejQjBAMA8GA1UdEwEB/wQFMAMB\n" +"Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSOB2LAUN3GGQYARnQE9/OufXVNMDAKBggq\n" +"hkjOPQQDAwNoADBlAjEAnDPfQeMjqEI2Jpc1XHvr20v4qotzVRVcrHgpD7oh2MSg2NED3W3R\n" +"OT3Ek2DS43KyAjB8xX6I01D1HiXo+k515liWpDVfG2XqYZpwI7UNo5uSUm9poIyNStDuiw7L\n" +"R47QjRE=\n" +"-----END CERTIFICATE-----", + +/* CommScope Public Trust ECC Root-02 */ +"-----BEGIN CERTIFICATE-----\n" +"MIICHDCCAaOgAwIBAgIUKP2ZYEFHpgE6yhR7H+/5aAiDXX0wCgYIKoZIzj0EAwMwTjELMAkG\n" +"A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1Ymxp\n" +"YyBUcnVzdCBFQ0MgUm9vdC0wMjAeFw0yMTA0MjgxNzQ0NTRaFw00NjA0MjgxNzQ0NTNaME4x\n" +"CzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQ\n" +"dWJsaWMgVHJ1c3QgRUNDIFJvb3QtMDIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAR4MIHoYx7l\n" +"63FRD/cHB8o5mXxO1Q/MMDALj2aTPs+9xYa9+bG3tD60B8jzljHz7aRP+KNOjSkVWLjVb3/u\n" +"bCK1sK9IRQq9qEmUv4RDsNuESgMjGWdqb8FuvAY5N9GIIvejQjBAMA8GA1UdEwEB/wQFMAMB\n" +"Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTmGHX/72DehKT1RsfeSlXjMjZ59TAKBggq\n" +"hkjOPQQDAwNnADBkAjAmc0l6tqvmSfR9Uj/UQQSugEODZXW5hYA4O9Zv5JOGq4/nich/m35r\n" +"ChJVYaoR4HkCMHfoMXGsPHED1oQmHhS48zs73u1Z/GtMMH9ZzkXpc2AVmkzw5l4lIhVtwodZ\n" +"0LKOag==\n" +"-----END CERTIFICATE-----", + +/* CommScope Public Trust RSA Root-01 */ +"-----BEGIN CERTIFICATE-----\n" +"MIIFbDCCA1SgAwIBAgIUPgNJgXUWdDGOTKvVxZAplsU5EN0wDQYJKoZIhvcNAQELBQAwTjEL\n" +"MAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1\n" +"YmxpYyBUcnVzdCBSU0EgUm9vdC0wMTAeFw0yMTA0MjgxNjQ1NTRaFw00NjA0MjgxNjQ1NTNa\n" +"ME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29w\n" +"ZSBQdWJsaWMgVHJ1c3QgUlNBIFJvb3QtMDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK\n" +"AoICAQCwSGWjDR1C45FtnYSkYZYSwu3D2iM0GXb26v1VWvZVAVMP8syMl0+5UMuzAURWlv2b\n" +"KOx7dAvnQmtVzslhsuitQDy6uUEKBU8bJoWPQ7VAtYXR1HHcg0Hz9kXHgKKEUJdGzqAMxGBW\n" +"BB0HW0alDrJLpA6lfO741GIDuZNqihS4cPgugkY4Iw50x2tBt9Apo52AsH53k2NC+zSDO3Oj\n" +"WiE260f6GBfZumbCk6SP/F2krfxQapWsvCQz0b2If4b19bJzKo98rwjyGpg/qYFlP8GMicWW\n" +"MJoKz/TUyDTtnS+8jTiGU+6Xn6myY5QXjQ/cZip8UlF1y5mO6D1cv547KI2DAg+pn3LiLCuz\n" +"3GaXAEDQpFSOm117RTYm1nJD68/A6g3czhLmfTifBSeolz7pUcZsBSjBAg/pGG3svZwG1KdJ\n" +"9FQFa2ww8esD1eo9anbCyxooSU1/ZOD6K9pzg4H/kQO9lLvkuI6cMmPNn7togbGEW682v3fu\n" +"HX/3SZtS7NJ3Wn2RnU3COS3kuoL4b/JOHg9O5j9ZpSPcPYeoKFgo0fEbNttPxP/hjFtyjMcm\n" +"AyejOQoBqsCyMWCDIqFPEgkBEa801M/XrmLTBQe0MXXgDW1XT2mH+VepuhX2yFJtocucH+X8\n" +"eKg1mp9BFM6ltM6UCBwJrVbl2rZJmkrqYxhTnCwuwwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\n" +"AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUN12mmnQywsL5x6YVEFm45P3luG0wDQYJ\n" +"KoZIhvcNAQELBQADggIBAK+nz97/4L1CjU3lIpbfaOp9TSp90K09FlxD533Ahuh6NWPxzIHI\n" +"xgvoLlI1pKZJkGNRrDSsBTtXAOnTYtPZKdVUvhwQkZyybf5Z/Xn36lbQnmhUQo8mUuJM3y+X\n" +"pi/SB5io82BdS5pYV4jvguX6r2yBS5KPQJqTRlnLX3gWsWc+QgvfKNmwrZggvkN80V4aCRck\n" +"jXtdlemrwWCrWxhkgPut4AZ9HcpZuPN4KWfGVh2vtrV0KnahP/t1MJ+UXjulYPPLXAziDslg\n" +"+MkfFoom3ecnf+slpoq9uC02EJqxWE2aaE9gVOX2RhOOiKy8IUISrcZKiX2bwdgt6ZYD9KJ0\n" +"DLwAHb/WNyVntHKLr4W96ioDj8z7PEQkguIBpQtZtjSNMgsSDesnwv1B10A8ckYpwIzqug/x\n" +"BpMu95yo9GA+o/E4Xo4TwbM6l4c/ksp4qRyv0LAbJh6+cOx69TOY6lz/KwsETkPdY34Op054\n" +"A5U+1C0wlREQKC6/oAI+/15Z0wUOlV9TRe9rh9VIzRamloPh37MG88EU26fsHItdkJANclHn\n" +"YfkUyq+Dj7+vsQpZXdxc1+SWrVtgHdqul7I52Qb1dgAT+GhMIbA1xNxVssnBQVocicCMb3Sg\n" +"azNNtQEo/a2tiRc7ppqEvOuM6sRxJKi6KfkIsidWNTJf6jn7MZrVGczw\n" +"-----END CERTIFICATE-----", + +/* CommScope Public Trust RSA Root-02 */ +"-----BEGIN CERTIFICATE-----\n" +"MIIFbDCCA1SgAwIBAgIUVBa/O345lXGN0aoApYYNK496BU4wDQYJKoZIhvcNAQELBQAwTjEL\n" +"MAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1\n" +"YmxpYyBUcnVzdCBSU0EgUm9vdC0wMjAeFw0yMTA0MjgxNzE2NDNaFw00NjA0MjgxNzE2NDJa\n" +"ME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29w\n" +"ZSBQdWJsaWMgVHJ1c3QgUlNBIFJvb3QtMDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK\n" +"AoICAQDh+g77aAASyE3VrCLENQE7xVTlWXZjpX/rwcRqmL0yjReA61260WI9JSMZNRTpf4mn\n" +"G2I81lDnNJUDMrG0kyI9p+Kx7eZ7Ti6Hmw0zdQreqjXnfuU2mKKuJZ6VszKWpCtYHu8//mI0\n" +"SFHRtI1CrWDaSWqVcN3SAOLMV2MCe5bdSZdbkk6V0/nLKR8YSvgBKtJjCW4k6YnS5cciTNxz\n" +"hkcAqg2Ijq6FfUrpuzNPDlJwnZXjfG2WWy09X6GDRl224yW4fKcZgBzqZUPckXk2LHR88mcG\n" +"yYnJ27/aaL8j7dxrrSiDeS/sOKUNNwFnJ5rpM9kzXzehxfCrPfp4sOcsn/Y+n2Dg70jpkEUe\n" +"BVF4GiwSLFworA2iI540jwXmojPOEXcT1A6kHkIfhs1w/tkuFT0du7jyU1fbzMZ0KZwYszZ1\n" +"OC4PVKH4kh+Jlk+71O6d6Ts2QrUKOyrUZHk2EOH5kQMreyBUzQ0ZGshBMjTRsJnhkB4BQDa1\n" +"t/qp5Xd1pCKBXbCL5CcSD1SIxtuFdOa3wNemKfrb3vOTlycEVS8KbzfFPROvCgCpLIscgSjX\n" +"74Yxqa7ybrjKaixUR9gqiC6vwQcQeKwRoi9C8DfF8rhW3Q5iLc4tVn5V8qdE9isy9COoR+jU\n" +"KgF4z2rDN6ieZdIs5fq6M8EGRPbmz6UNp2YINIos8wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\n" +"AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUR9DnsSL/nSz12Vdgs7GxcJXvYXowDQYJ\n" +"KoZIhvcNAQELBQADggIBAIZpsU0v6Z9PIpNojuQhmaPORVMbc0RTAIFhzTHjCLqBKCh6krm2\n" +"qMhDnscTJk3C2OVVnJJdUNjCK9v+5qiXz1I6JMNlZFxHMaNlNRPDk7n3+VGXu6TwYofF1gbT\n" +"l4MgqX67tiHCpQ2EAOHyJxCDut0DgdXdaMNmEMjRdrSzbymeAPnCKfWxkxlSaRosTKCL4BWa\n" +"MS/TiJVZbuXEs1DIFAhKm4sTg7GkcrI7djNB3NyqpgdvHSQSn8h2vS/ZjvQs7rfSOBAkNlEv\n" +"41xdgSGn2rtO/+YHqP65DSdsu3BaVXoT6fEqSWnHX4dXTEN5bTpl6TBcQe7rd6VzEojov32u\n" +"5cSoHw2OHG1QAk8mGEPej1WFsQs3BWDJVTkSBKEqz3EWnzZRSb9wO55nnPt7eck5HHisd5FU\n" +"mrh1CoFSl+NmYWvtPjgelmFV4ZFUjO2MJB+ByRCac5krFk5yAD9UG/iNuovnFNa2RU9g7Jau\n" +"wy8CTl2dlklyALKrdVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670\n" +"v64fG9PiO/yzcnMcmyiQiRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17Org3bhzjl\n" +"P1v9mxnhMUF6cKojawHhRUzNlM47ni3niAIi9G7oyOzWPPO5std3eqx7\n" +"-----END CERTIFICATE-----", #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS diff --git a/src/node_sea.cc b/src/node_sea.cc index 521f2f670b28c8..c4fa84303034ff 100644 --- a/src/node_sea.cc +++ b/src/node_sea.cc @@ -377,14 +377,18 @@ std::optional ParseSingleExecutableConfig( ExitCode GenerateSnapshotForSEA(const SeaConfig& config, const std::vector& args, const std::vector& exec_args, - const std::string& main_script, + const std::string& builder_script_content, + const SnapshotConfig& snapshot_config, std::vector* snapshot_blob) { SnapshotData snapshot; // TODO(joyeecheung): make the arguments configurable through the JSON // config or a programmatic API. std::vector patched_args = {args[0], config.main_path}; - ExitCode exit_code = SnapshotBuilder::Generate( - &snapshot, patched_args, exec_args, main_script); + ExitCode exit_code = SnapshotBuilder::Generate(&snapshot, + patched_args, + exec_args, + builder_script_content, + snapshot_config); if (exit_code != ExitCode::kNoFailure) { return exit_code; } @@ -414,7 +418,9 @@ std::optional GenerateCodeCache(std::string_view main_path, RAIIIsolate raii_isolate(SnapshotBuilder::GetEmbeddedSnapshotData()); Isolate* isolate = raii_isolate.get(); + v8::Isolate::Scope isolate_scope(isolate); HandleScope handle_scope(isolate); + Local context = Context::New(isolate); Context::Scope context_scope(context); @@ -479,8 +485,11 @@ ExitCode GenerateSingleExecutableBlob( bool builds_snapshot_from_main = static_cast(config.flags & SeaFlags::kUseSnapshot); if (builds_snapshot_from_main) { + // TODO(joyeecheung): allow passing snapshot configuration in SEA configs. + SnapshotConfig snapshot_config; + snapshot_config.builder_script_path = main_script; ExitCode exit_code = GenerateSnapshotForSEA( - config, args, exec_args, main_script, &snapshot_blob); + config, args, exec_args, main_script, snapshot_config, &snapshot_blob); if (exit_code != ExitCode::kNoFailure) { return exit_code; } diff --git a/src/node_shadow_realm.cc b/src/node_shadow_realm.cc index 1cf0a57617b8b2..e7199e18756521 100644 --- a/src/node_shadow_realm.cc +++ b/src/node_shadow_realm.cc @@ -1,6 +1,7 @@ #include "node_shadow_realm.h" #include "env-inl.h" #include "node_errors.h" +#include "node_process.h" namespace node { namespace shadow_realm { @@ -9,6 +10,8 @@ using v8::EscapableHandleScope; using v8::HandleScope; using v8::Local; using v8::MaybeLocal; +using v8::Object; +using v8::String; using v8::Value; using TryCatchScope = node::errors::TryCatchScope; @@ -16,6 +19,11 @@ using TryCatchScope = node::errors::TryCatchScope; // static ShadowRealm* ShadowRealm::New(Environment* env) { ShadowRealm* realm = new ShadowRealm(env); + // TODO(legendecas): required by node::PromiseRejectCallback. + // Remove this once promise rejection doesn't need to be handled across + // realms. + realm->context()->SetSecurityToken( + env->principal_realm()->context()->GetSecurityToken()); // We do not expect the realm bootstrapping to throw any // exceptions. If it does, exit the current Node.js instance. @@ -32,6 +40,10 @@ MaybeLocal HostCreateShadowRealmContextCallback( Local initiator_context) { Environment* env = Environment::GetCurrent(initiator_context); EscapableHandleScope scope(env->isolate()); + + // We do not expect the realm bootstrapping to throw any + // exceptions. If it does, exit the current Node.js instance. + TryCatchScope try_catch(env, TryCatchScope::CatchMode::kFatal); ShadowRealm* realm = ShadowRealm::New(env); if (realm != nullptr) { return scope.Escape(realm->context()); @@ -137,6 +149,28 @@ v8::MaybeLocal ShadowRealm::BootstrapRealm() { } } + // The process object is not exposed globally in ShadowRealm yet. + // However, the process properties need to be setup for built-in modules. + // Specifically, process.cwd() is needed by the ESM loader. + if (ExecuteBootstrapper( + "internal/bootstrap/switches/does_not_own_process_state") + .IsEmpty()) { + return MaybeLocal(); + } + + // Setup process.env proxy. + Local env_string = FIXED_ONE_BYTE_STRING(isolate_, "env"); + Local env_proxy; + if (!isolate_data()->env_proxy_template()->NewInstance(context()).ToLocal( + &env_proxy) || + process_object()->Set(context(), env_string, env_proxy).IsNothing()) { + return MaybeLocal(); + } + + if (ExecuteBootstrapper("internal/bootstrap/shadow_realm").IsEmpty()) { + return MaybeLocal(); + } + return v8::True(isolate_); } diff --git a/src/node_snapshot_builder.h b/src/node_snapshot_builder.h index 66768cfd201b5e..e2302946d1f8cb 100644 --- a/src/node_snapshot_builder.h +++ b/src/node_snapshot_builder.h @@ -16,20 +16,25 @@ namespace node { class ExternalReferenceRegistry; struct SnapshotData; +std::optional ReadSnapshotConfig(const char* path); + class NODE_EXTERN_PRIVATE SnapshotBuilder { public: - static ExitCode GenerateAsSource( - const char* out_path, + static ExitCode GenerateAsSource(const char* out_path, + const std::vector& args, + const std::vector& exec_args, + const SnapshotConfig& config, + bool use_array_literals = false); + + // Generate the snapshot into out. builder_script_content should match + // config.builder_script_path. This is passed separately + // in case the script is already read for other purposes. + static ExitCode Generate( + SnapshotData* out, const std::vector& args, const std::vector& exec_args, - std::optional main_script_path = std::nullopt, - bool use_array_literals = false); - - // Generate the snapshot into out. - static ExitCode Generate(SnapshotData* out, - const std::vector& args, - const std::vector& exec_args, - std::optional main_script); + std::optional builder_script_content, + const SnapshotConfig& config); // If nullptr is returned, the binary is not built with embedded // snapshot. @@ -39,10 +44,8 @@ class NODE_EXTERN_PRIVATE SnapshotBuilder { static const std::vector& CollectExternalReferences(); - static ExitCode CreateSnapshot( - SnapshotData* out, - CommonEnvironmentSetup* setup, - /*SnapshotMetadata::Type*/ uint8_t snapshot_type); + static ExitCode CreateSnapshot(SnapshotData* out, + CommonEnvironmentSetup* setup); private: static std::unique_ptr registry_; diff --git a/src/node_snapshotable.cc b/src/node_snapshotable.cc index 562a47ddcc9c8e..c59a4cdccb9c8a 100644 --- a/src/node_snapshotable.cc +++ b/src/node_snapshotable.cc @@ -10,6 +10,7 @@ #include "debug_utils-inl.h" #include "encoding_binding.h" #include "env-inl.h" +#include "json_parser.h" #include "node_blob.h" #include "node_builtins.h" #include "node_contextify.h" @@ -19,6 +20,7 @@ #include "node_internals.h" #include "node_main_instance.h" #include "node_metadata.h" +#include "node_modules.h" #include "node_process.h" #include "node_snapshot_builder.h" #include "node_url.h" @@ -541,6 +543,7 @@ SnapshotMetadata SnapshotDeserializer::Read() { result.node_arch = ReadString(); result.node_platform = ReadString(); result.v8_cache_version_tag = ReadArithmetic(); + result.flags = static_cast(ReadArithmetic()); if (is_debug) { std::string str = ToStr(result); @@ -570,6 +573,9 @@ size_t SnapshotSerializer::Write(const SnapshotMetadata& data) { Debug("Write V8 cached data version tag %" PRIx32 "\n", data.v8_cache_version_tag); written_total += WriteArithmetic(data.v8_cache_version_tag); + Debug("Write snapshot flags %" PRIx32 "\n", + static_cast(data.flags)); + written_total += WriteArithmetic(static_cast(data.flags)); return written_total; } @@ -690,19 +696,21 @@ bool SnapshotData::Check() const { return false; } - uint32_t current_cache_version = v8::ScriptCompiler::CachedDataVersionTag(); - if (metadata.v8_cache_version_tag != current_cache_version && - metadata.type == SnapshotMetadata::Type::kFullyCustomized) { - // For now we only do this check for the customized snapshots - we know - // that the flags we use in the default snapshot are limited and safe - // enough so we can relax the constraints for it. - fprintf(stderr, - "Failed to load the startup snapshot because it was built with " - "a different version of V8 or with different V8 configurations.\n" - "Expected tag %" PRIx32 ", read %" PRIx32 "\n", - current_cache_version, - metadata.v8_cache_version_tag); - return false; + if (metadata.type == SnapshotMetadata::Type::kFullyCustomized && + !WithoutCodeCache(metadata.flags)) { + uint32_t current_cache_version = v8::ScriptCompiler::CachedDataVersionTag(); + if (metadata.v8_cache_version_tag != current_cache_version) { + // For now we only do this check for the customized snapshots - we know + // that the flags we use in the default snapshot are limited and safe + // enough so we can relax the constraints for it. + fprintf(stderr, + "Failed to load the startup snapshot because it was built with " + "a different version of V8 or with different V8 configurations.\n" + "Expected tag %" PRIx32 ", read %" PRIx32 "\n", + current_cache_version, + metadata.v8_cache_version_tag); + return false; + } } // TODO(joyeecheung): check incompatible Node.js flags. @@ -912,23 +920,91 @@ void SnapshotBuilder::InitializeIsolateParams(const SnapshotData* data, const_cast(&(data->v8_snapshot_blob_data)); } +SnapshotFlags operator|(SnapshotFlags x, SnapshotFlags y) { + return static_cast(static_cast(x) | + static_cast(y)); +} + +SnapshotFlags operator&(SnapshotFlags x, SnapshotFlags y) { + return static_cast(static_cast(x) & + static_cast(y)); +} + +SnapshotFlags operator|=(/* NOLINT (runtime/references) */ SnapshotFlags& x, + SnapshotFlags y) { + return x = x | y; +} + +bool WithoutCodeCache(const SnapshotFlags& flags) { + return static_cast(flags & SnapshotFlags::kWithoutCodeCache); +} + +bool WithoutCodeCache(const SnapshotConfig& config) { + return WithoutCodeCache(config.flags); +} + +std::optional ReadSnapshotConfig(const char* config_path) { + std::string config_content; + int r = ReadFileSync(&config_content, config_path); + if (r != 0) { + FPrintF(stderr, + "Cannot read snapshot configuration from %s: %s\n", + config_path, + uv_strerror(r)); + return std::nullopt; + } + + JSONParser parser; + if (!parser.Parse(config_content)) { + FPrintF(stderr, "Cannot parse JSON from %s\n", config_path); + return std::nullopt; + } + + SnapshotConfig result; + result.builder_script_path = parser.GetTopLevelStringField("builder"); + if (!result.builder_script_path.has_value()) { + FPrintF(stderr, + "\"builder\" field of %s is not a non-empty string\n", + config_path); + return std::nullopt; + } + + std::optional WithoutCodeCache = + parser.GetTopLevelBoolField("withoutCodeCache"); + if (!WithoutCodeCache.has_value()) { + FPrintF(stderr, + "\"withoutCodeCache\" field of %s is not a boolean\n", + config_path); + return std::nullopt; + } + if (WithoutCodeCache.value()) { + result.flags |= SnapshotFlags::kWithoutCodeCache; + } + + return result; +} + ExitCode BuildSnapshotWithoutCodeCache( SnapshotData* out, const std::vector& args, const std::vector& exec_args, - std::optional main_script) { + std::optional builder_script_content, + const SnapshotConfig& config) { + DCHECK(builder_script_content.has_value() == + config.builder_script_path.has_value()); // The default snapshot is meant to be runtime-independent and has more // restrictions. We do not enable the inspector and do not run the event // loop when building the default snapshot to avoid inconsistencies, but // we do for the fully customized one, and they are expected to fixup the // inconsistencies using v8.startupSnapshot callbacks. SnapshotMetadata::Type snapshot_type = - main_script.has_value() ? SnapshotMetadata::Type::kFullyCustomized - : SnapshotMetadata::Type::kDefault; + builder_script_content.has_value() + ? SnapshotMetadata::Type::kFullyCustomized + : SnapshotMetadata::Type::kDefault; std::vector errors; auto setup = CommonEnvironmentSetup::CreateForSnapshotting( - per_process::v8_platform.Platform(), &errors, args, exec_args); + per_process::v8_platform.Platform(), &errors, args, exec_args, config); if (!setup) { for (const std::string& err : errors) fprintf(stderr, "%s: %s\n", args[0].c_str(), err.c_str()); @@ -954,7 +1030,7 @@ ExitCode BuildSnapshotWithoutCodeCache( #if HAVE_INSPECTOR env->InitializeInspector({}); #endif - if (LoadEnvironment(env, main_script.value()).IsEmpty()) { + if (LoadEnvironment(env, builder_script_content.value()).IsEmpty()) { return ExitCode::kGenericUserError; } @@ -969,8 +1045,7 @@ ExitCode BuildSnapshotWithoutCodeCache( } } - return SnapshotBuilder::CreateSnapshot( - out, setup.get(), static_cast(snapshot_type)); + return SnapshotBuilder::CreateSnapshot(out, setup.get()); } ExitCode BuildCodeCacheFromSnapshot(SnapshotData* out, @@ -1014,28 +1089,32 @@ ExitCode SnapshotBuilder::Generate( SnapshotData* out, const std::vector& args, const std::vector& exec_args, - std::optional main_script) { - ExitCode code = - BuildSnapshotWithoutCodeCache(out, args, exec_args, main_script); + std::optional builder_script_content, + const SnapshotConfig& snapshot_config) { + ExitCode code = BuildSnapshotWithoutCodeCache( + out, args, exec_args, builder_script_content, snapshot_config); if (code != ExitCode::kNoFailure) { return code; } -#ifdef NODE_USE_NODE_CODE_CACHE - // Deserialize the snapshot to recompile code cache. We need to do this in the - // second pass because V8 requires the code cache to be compiled with a - // finalized read-only space. - return BuildCodeCacheFromSnapshot(out, args, exec_args); -#else + if (!WithoutCodeCache(snapshot_config)) { + // Deserialize the snapshot to recompile code cache. We need to do this in + // the second pass because V8 requires the code cache to be compiled with a + // finalized read-only space. + return BuildCodeCacheFromSnapshot(out, args, exec_args); + } + return ExitCode::kNoFailure; -#endif } ExitCode SnapshotBuilder::CreateSnapshot(SnapshotData* out, - CommonEnvironmentSetup* setup, - uint8_t snapshot_type_u8) { + CommonEnvironmentSetup* setup) { + const SnapshotConfig* config = setup->isolate_data()->snapshot_config(); + DCHECK_NOT_NULL(config); SnapshotMetadata::Type snapshot_type = - static_cast(snapshot_type_u8); + config->builder_script_path.has_value() + ? SnapshotMetadata::Type::kFullyCustomized + : SnapshotMetadata::Type::kDefault; Isolate* isolate = setup->isolate(); Environment* env = setup->env(); SnapshotCreator* creator = setup->snapshot_creator(); @@ -1074,7 +1153,7 @@ ExitCode SnapshotBuilder::CreateSnapshot(SnapshotData* out, if (per_process::enabled_debug_list.enabled(DebugCategory::MKSNAPSHOT)) { env->ForEachRealm([](Realm* realm) { realm->PrintInfoForSnapshot(); }); - printf("Environment = %p\n", env); + fprintf(stderr, "Environment = %p\n", env); } // Serialize the native states @@ -1098,8 +1177,10 @@ ExitCode SnapshotBuilder::CreateSnapshot(SnapshotData* out, } // Must be out of HandleScope - out->v8_snapshot_blob_data = - creator->CreateBlob(SnapshotCreator::FunctionCodeHandling::kKeep); + SnapshotCreator::FunctionCodeHandling handling = + WithoutCodeCache(*config) ? SnapshotCreator::FunctionCodeHandling::kClear + : SnapshotCreator::FunctionCodeHandling::kKeep; + out->v8_snapshot_blob_data = creator->CreateBlob(handling); // We must be able to rehash the blob when we restore it or otherwise // the hash seed would be fixed by V8, introducing a vulnerability. @@ -1111,7 +1192,8 @@ ExitCode SnapshotBuilder::CreateSnapshot(SnapshotData* out, per_process::metadata.versions.node, per_process::metadata.arch, per_process::metadata.platform, - v8::ScriptCompiler::CachedDataVersionTag()}; + v8::ScriptCompiler::CachedDataVersionTag(), + config->flags}; // We cannot resurrect the handles from the snapshot, so make sure that // no handles are left open in the environment after the blob is created @@ -1132,21 +1214,22 @@ ExitCode SnapshotBuilder::GenerateAsSource( const char* out_path, const std::vector& args, const std::vector& exec_args, - std::optional main_script_path, + const SnapshotConfig& config, bool use_array_literals) { - std::string main_script_content; - std::optional main_script_optional; - if (main_script_path.has_value()) { - int r = ReadFileSync(&main_script_content, main_script_path.value().data()); + std::string builder_script_content; + std::optional builder_script_optional; + if (config.builder_script_path.has_value()) { + std::string_view builder_script_path = config.builder_script_path.value(); + int r = ReadFileSync(&builder_script_content, builder_script_path.data()); if (r != 0) { FPrintF(stderr, "Cannot read main script %s for building snapshot. %s: %s", - main_script_path.value(), + builder_script_path, uv_err_name(r), uv_strerror(r)); return ExitCode::kGenericUserError; } - main_script_optional = main_script_content; + builder_script_optional = builder_script_content; } std::ofstream out(out_path, std::ios::out | std::ios::binary); @@ -1156,7 +1239,8 @@ ExitCode SnapshotBuilder::GenerateAsSource( } SnapshotData data; - ExitCode exit_code = Generate(&data, args, exec_args, main_script_optional); + ExitCode exit_code = + Generate(&data, args, exec_args, builder_script_optional, config); if (exit_code != ExitCode::kNoFailure) { return exit_code; } diff --git a/src/node_snapshotable.h b/src/node_snapshotable.h index d1f28ecf154d9b..5e281b8155c810 100644 --- a/src/node_snapshotable.h +++ b/src/node_snapshotable.h @@ -25,6 +25,9 @@ struct PropInfo { typedef size_t SnapshotIndex; +bool WithoutCodeCache(const SnapshotFlags& flags); +bool WithoutCodeCache(const SnapshotConfig& config); + // When serializing an embedder object, we'll serialize the native states // into a chunk that can be mapped into a subclass of InternalFieldInfoBase, // and pass it into the V8 callback as the payload of StartupData. @@ -154,7 +157,6 @@ class BindingData : public SnapshotableObject { AliasedUint8Array is_building_snapshot_buffer_; InternalFieldInfo* internal_field_info_ = nullptr; }; - } // namespace mksnapshot } // namespace node diff --git a/src/node_url.cc b/src/node_url.cc index 89fcfec20f5685..95d15c78407359 100644 --- a/src/node_url.cc +++ b/src/node_url.cc @@ -4,6 +4,8 @@ #include "node_errors.h" #include "node_external_reference.h" #include "node_i18n.h" +#include "node_metadata.h" +#include "node_process-inl.h" #include "util-inl.h" #include "v8-fast-api-calls.h" #include "v8.h" @@ -227,35 +229,6 @@ void BindingData::Format(const FunctionCallbackInfo& args) { .ToLocalChecked()); } -void BindingData::ThrowInvalidURL(node::Environment* env, - std::string_view input, - std::optional base) { - Local err = ERR_INVALID_URL(env->isolate(), "Invalid URL"); - DCHECK(err->IsObject()); - - auto err_object = err.As(); - - USE(err_object->Set(env->context(), - env->input_string(), - v8::String::NewFromUtf8(env->isolate(), - input.data(), - v8::NewStringType::kNormal, - input.size()) - .ToLocalChecked())); - - if (base.has_value()) { - USE(err_object->Set(env->context(), - env->base_string(), - v8::String::NewFromUtf8(env->isolate(), - base.value().c_str(), - v8::NewStringType::kNormal, - base.value().size()) - .ToLocalChecked())); - } - - env->isolate()->ThrowException(err); -} - void BindingData::Parse(const FunctionCallbackInfo& args) { CHECK_GE(args.Length(), 1); CHECK(args[0]->IsString()); // input @@ -417,15 +390,165 @@ void BindingData::RegisterExternalReferences( } } -std::string FromFilePath(const std::string_view file_path) { - std::string escaped_file_path; - for (size_t i = 0; i < file_path.length(); ++i) { - escaped_file_path += file_path[i]; - if (file_path[i] == '%') escaped_file_path += "25"; +void ThrowInvalidURL(node::Environment* env, + std::string_view input, + std::optional base) { + Local err = ERR_INVALID_URL(env->isolate(), "Invalid URL"); + DCHECK(err->IsObject()); + + auto err_object = err.As(); + + USE(err_object->Set(env->context(), + env->input_string(), + v8::String::NewFromUtf8(env->isolate(), + input.data(), + v8::NewStringType::kNormal, + input.size()) + .ToLocalChecked())); + + if (base.has_value()) { + USE(err_object->Set(env->context(), + env->base_string(), + v8::String::NewFromUtf8(env->isolate(), + base.value().c_str(), + v8::NewStringType::kNormal, + base.value().size()) + .ToLocalChecked())); } + + env->isolate()->ThrowException(err); +} + +std::string FromFilePath(std::string_view file_path) { + // Avoid unnecessary allocations. + size_t pos = file_path.empty() ? std::string_view::npos : file_path.find('%'); + if (pos == std::string_view::npos) { + return ada::href_from_file(file_path); + } + // Escape '%' characters to a temporary string. + std::string escaped_file_path; + do { + escaped_file_path += file_path.substr(0, pos + 1); + escaped_file_path += "25"; + file_path = file_path.substr(pos + 1); + pos = file_path.empty() ? std::string_view::npos : file_path.find('%'); + } while (pos != std::string_view::npos); + escaped_file_path += file_path; return ada::href_from_file(escaped_file_path); } +std::optional FileURLToPath(Environment* env, + const ada::url_aggregator& file_url) { + if (file_url.type != ada::scheme::FILE) { + THROW_ERR_INVALID_URL_SCHEME(env->isolate()); + return std::nullopt; + } + + std::string_view pathname = file_url.get_pathname(); +#ifdef _WIN32 + size_t first_percent = std::string::npos; + size_t pathname_size = pathname.size(); + std::string pathname_escaped_slash; + + for (size_t i = 0; i < pathname_size; i++) { + if (pathname[i] == '/') { + pathname_escaped_slash += '\\'; + } else { + pathname_escaped_slash += pathname[i]; + } + + if (pathname[i] != '%') continue; + + if (first_percent == std::string::npos) { + first_percent = i; + } + + // just safe-guard against access the pathname + // outside the bounds + if ((i + 2) >= pathname_size) continue; + + char third = pathname[i + 2] | 0x20; + + bool is_slash = pathname[i + 1] == '2' && third == 102; + bool is_forward_slash = pathname[i + 1] == '5' && third == 99; + + if (!is_slash && !is_forward_slash) continue; + + THROW_ERR_INVALID_FILE_URL_PATH( + env->isolate(), + "File URL path must not include encoded \\ or / characters"); + return std::nullopt; + } + + std::string_view hostname = file_url.get_hostname(); + std::string decoded_pathname = ada::unicode::percent_decode( + std::string_view(pathname_escaped_slash), first_percent); + + if (hostname.size() > 0) { + // If hostname is set, then we have a UNC path + // Pass the hostname through domainToUnicode just in case + // it is an IDN using punycode encoding. We do not need to worry + // about percent encoding because the URL parser will have + // already taken care of that for us. Note that this only + // causes IDNs with an appropriate `xn--` prefix to be decoded. + return "\\\\" + ada::unicode::to_unicode(hostname) + decoded_pathname; + } + + char letter = decoded_pathname[1] | 0x20; + char sep = decoded_pathname[2]; + + // a..z A..Z + if (letter < 'a' || letter > 'z' || sep != ':') { + THROW_ERR_INVALID_FILE_URL_PATH(env->isolate(), + "File URL path must be absolute"); + return std::nullopt; + } + + return decoded_pathname.substr(1); +#else // _WIN32 + std::string_view hostname = file_url.get_hostname(); + + if (hostname.size() > 0) { + THROW_ERR_INVALID_FILE_URL_HOST( + env->isolate(), + "File URL host must be \"localhost\" or empty on ", + std::string(per_process::metadata.platform)); + return std::nullopt; + } + + size_t first_percent = std::string::npos; + for (size_t i = 0; (i + 2) < pathname.size(); i++) { + if (pathname[i] != '%') continue; + + if (first_percent == std::string::npos) { + first_percent = i; + } + + if (pathname[i + 1] == '2' && (pathname[i + 2] | 0x20) == 102) { + THROW_ERR_INVALID_FILE_URL_PATH( + env->isolate(), + "File URL path must not include encoded / characters"); + return std::nullopt; + } + } + + return ada::unicode::percent_decode(pathname, first_percent); +#endif // _WIN32 +} + +// Reverse the logic applied by path.toNamespacedPath() to create a +// namespace-prefixed path. +void FromNamespacedPath(std::string* path) { +#ifdef _WIN32 + if (path->compare(0, 8, "\\\\?\\UNC\\", 8) == 0) { + *path = path->substr(8); + path->insert(0, "\\\\"); + } else if (path->compare(0, 4, "\\\\?\\", 4) == 0) { + *path = path->substr(4); + } +#endif +} + } // namespace url } // namespace node diff --git a/src/node_url.h b/src/node_url.h index f3aa136a5b538d..3c77b538b16f8f 100644 --- a/src/node_url.h +++ b/src/node_url.h @@ -12,6 +12,7 @@ #include "v8-fast-api-calls.h" #include "v8.h" +#include #include namespace node { @@ -76,12 +77,15 @@ class BindingData : public SnapshotableObject { const ada::scheme::type type); static v8::CFunction fast_can_parse_methods_[]; - static void ThrowInvalidURL(Environment* env, - std::string_view input, - std::optional base); }; -std::string FromFilePath(const std::string_view file_path); +void ThrowInvalidURL(Environment* env, + std::string_view input, + std::optional base); +std::string FromFilePath(std::string_view file_path); +std::optional FileURLToPath(Environment* env, + const ada::url_aggregator& file_url); +void FromNamespacedPath(std::string* path); } // namespace url diff --git a/src/node_util.cc b/src/node_util.cc index 9b3ba203a3a8fc..dfdd87d297e1e2 100644 --- a/src/node_util.cc +++ b/src/node_util.cc @@ -37,9 +37,6 @@ using v8::String; using v8::Uint32; using v8::Value; -// Used in ToUSVString(). -constexpr char16_t kUnicodeReplacementCharacter = 0xFFFD; - // If a UTF-16 character is a low/trailing surrogate. CHAR_TEST(16, IsUnicodeTrail, (ch & 0xFC00) == 0xDC00) @@ -240,40 +237,6 @@ static uint32_t FastGuessHandleType(Local receiver, const uint32_t fd) { CFunction fast_guess_handle_type_(CFunction::Make(FastGuessHandleType)); -static void ToUSVString(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); - CHECK_GE(args.Length(), 2); - CHECK(args[0]->IsString()); - CHECK(args[1]->IsNumber()); - - TwoByteValue value(env->isolate(), args[0]); - - int64_t start = args[1]->IntegerValue(env->context()).FromJust(); - CHECK_GE(start, 0); - - for (size_t i = start; i < value.length(); i++) { - char16_t c = value[i]; - if (!IsUnicodeSurrogate(c)) { - continue; - } else if (IsUnicodeSurrogateTrail(c) || i == value.length() - 1) { - value[i] = kUnicodeReplacementCharacter; - } else { - char16_t d = value[i + 1]; - if (IsUnicodeTrail(d)) { - i++; - } else { - value[i] = kUnicodeReplacementCharacter; - } - } - } - - args.GetReturnValue().Set( - String::NewFromTwoByte(env->isolate(), - *value, - v8::NewStringType::kNormal, - value.length()).ToLocalChecked()); -} - void RegisterExternalReferences(ExternalReferenceRegistry* registry) { registry->Register(GetPromiseDetails); registry->Register(GetProxyDetails); @@ -288,7 +251,6 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) { registry->Register(GuessHandleType); registry->Register(FastGuessHandleType); registry->Register(fast_guess_handle_type_.GetTypeInfo()); - registry->Register(ToUSVString); } void Initialize(Local target, @@ -403,8 +365,6 @@ void Initialize(Local target, "guessHandleType", GuessHandleType, &fast_guess_handle_type_); - - SetMethodNoSideEffect(context, target, "toUSVString", ToUSVString); } } // namespace util diff --git a/src/node_version.h b/src/node_version.h index 556970a4e56aeb..e75d3464e97331 100644 --- a/src/node_version.h +++ b/src/node_version.h @@ -22,7 +22,7 @@ #ifndef SRC_NODE_VERSION_H_ #define SRC_NODE_VERSION_H_ -#define NODE_MAJOR_VERSION 21 +#define NODE_MAJOR_VERSION 22 #define NODE_MINOR_VERSION 0 #define NODE_PATCH_VERSION 0 diff --git a/src/node_watchdog.cc b/src/node_watchdog.cc index 8f0a3844121e23..d4eb79ebc32154 100644 --- a/src/node_watchdog.cc +++ b/src/node_watchdog.cc @@ -45,7 +45,7 @@ Watchdog::Watchdog(v8::Isolate* isolate, uint64_t ms, bool* timed_out) int rc; rc = uv_loop_init(&loop_); if (rc != 0) { - OnFatalError("node::Watchdog::Watchdog()", "Failed to initialize uv loop."); + UNREACHABLE("Failed to initialize uv loop."); } rc = uv_async_init(&loop_, &async_, [](uv_async_t* signal) { diff --git a/src/node_worker.cc b/src/node_worker.cc index 900674bbe4c90e..552fdc438a0895 100644 --- a/src/node_worker.cc +++ b/src/node_worker.cc @@ -217,7 +217,13 @@ class WorkerThreadData { CHECK(!loop_init_failed_); bool platform_finished = false; - isolate_data_.reset(); + // https://github.com/nodejs/node/issues/51129 - IsolateData destructor + // can kick off GC before teardown, so ensure the isolate is entered. + { + Locker locker(isolate); + Isolate::Scope isolate_scope(isolate); + isolate_data_.reset(); + } w_->platform_->AddIsolateFinishedCallback(isolate, [](void* data) { *static_cast(data) = true; @@ -901,7 +907,7 @@ void GetEnvMessagePort(const FunctionCallbackInfo& args) { Local port = env->message_port(); CHECK_IMPLIES(!env->is_main_thread(), !port.IsEmpty()); if (!port.IsEmpty()) { - CHECK_EQ(port->GetCreationContext().ToLocalChecked()->GetIsolate(), + CHECK_EQ(port->GetCreationContextChecked()->GetIsolate(), args.GetIsolate()); args.GetReturnValue().Set(port); } diff --git a/src/path.cc b/src/path.cc new file mode 100644 index 00000000000000..250faf05bab71e --- /dev/null +++ b/src/path.cc @@ -0,0 +1,272 @@ +#include "path.h" +#include +#include +#include "env-inl.h" +#include "node_internals.h" +#include "util.h" + +namespace node { + +#ifdef _WIN32 +bool IsPathSeparator(const char c) noexcept { + return c == kPathSeparator || c == '/'; +} +#else // POSIX +bool IsPathSeparator(const char c) noexcept { + return c == kPathSeparator; +} +#endif // _WIN32 + +std::string NormalizeString(const std::string_view path, + bool allowAboveRoot, + const std::string_view separator) { + std::string res; + int lastSegmentLength = 0; + int lastSlash = -1; + int dots = 0; + char code; + const auto pathLen = path.size(); + for (uint8_t i = 0; i <= pathLen; ++i) { + if (i < pathLen) { + code = path[i]; + } else if (IsPathSeparator(path[i])) { + break; + } else { + code = node::kPathSeparator; + } + + if (IsPathSeparator(code)) { + if (lastSlash == static_cast(i - 1) || dots == 1) { + // NOOP + } else if (dots == 2) { + int len = res.length(); + if (len < 2 || lastSegmentLength != 2 || res[len - 1] != '.' || + res[len - 2] != '.') { + if (len > 2) { + auto lastSlashIndex = res.find_last_of(separator); + if (lastSlashIndex == std::string::npos) { + res = ""; + lastSegmentLength = 0; + } else { + res = res.substr(0, lastSlashIndex); + len = res.length(); + lastSegmentLength = len - 1 - res.find_last_of(separator); + } + lastSlash = i; + dots = 0; + continue; + } else if (len != 0) { + res = ""; + lastSegmentLength = 0; + lastSlash = i; + dots = 0; + continue; + } + } + + if (allowAboveRoot) { + res += res.length() > 0 ? std::string(separator) + ".." : ".."; + lastSegmentLength = 2; + } + } else { + if (!res.empty()) { + res += std::string(separator) + + std::string(path.substr(lastSlash + 1, i - (lastSlash + 1))); + } else { + res = path.substr(lastSlash + 1, i - (lastSlash + 1)); + } + lastSegmentLength = i - lastSlash - 1; + } + lastSlash = i; + dots = 0; + } else if (code == '.' && dots != -1) { + ++dots; + } else { + dots = -1; + } + } + + return res; +} + +#ifdef _WIN32 +bool IsWindowsDeviceRoot(const char c) noexcept { + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); +} + +std::string PathResolve(Environment* env, + const std::vector& paths) { + std::string resolvedDevice = ""; + std::string resolvedTail = ""; + bool resolvedAbsolute = false; + const size_t numArgs = paths.size(); + auto cwd = env->GetCwd(env->exec_path()); + + for (int i = numArgs - 1; i >= -1 && !resolvedAbsolute; i--) { + std::string path; + if (i >= 0) { + path = std::string(paths[i]); + } else if (resolvedDevice.empty()) { + path = cwd; + } else { + // Windows has the concept of drive-specific current working + // directories. If we've resolved a drive letter but not yet an + // absolute path, get cwd for that drive, or the process cwd if + // the drive cwd is not available. We're sure the device is not + // a UNC path at this points, because UNC paths are always absolute. + std::string resolvedDevicePath; + const std::string envvar = "=" + resolvedDevice; + credentials::SafeGetenv(envvar.c_str(), &resolvedDevicePath); + path = resolvedDevicePath.empty() ? cwd : resolvedDevicePath; + + // Verify that a cwd was found and that it actually points + // to our drive. If not, default to the drive's root. + if (path.empty() || + (ToLower(path.substr(0, 2)) != ToLower(resolvedDevice) && + path[2] == '/')) { + path = resolvedDevice + "\\"; + } + } + + const size_t len = path.length(); + int rootEnd = 0; + std::string device = ""; + bool isAbsolute = false; + const char code = path[0]; + + // Try to match a root + if (len == 1) { + if (IsPathSeparator(code)) { + // `path` contains just a path separator + rootEnd = 1; + isAbsolute = true; + } + } else if (IsPathSeparator(code)) { + // Possible UNC root + + // If we started with a separator, we know we at least have an + // absolute path of some kind (UNC or otherwise) + isAbsolute = true; + + if (IsPathSeparator(path[1])) { + // Matched double path separator at beginning + size_t j = 2; + size_t last = j; + // Match 1 or more non-path separators + while (j < len && !IsPathSeparator(path[j])) { + j++; + } + if (j < len && j != last) { + const std::string firstPart = path.substr(last, j - last); + // Matched! + last = j; + // Match 1 or more path separators + while (j < len && IsPathSeparator(path[j])) { + j++; + } + if (j < len && j != last) { + // Matched! + last = j; + // Match 1 or more non-path separators + while (j < len && !IsPathSeparator(path[j])) { + j++; + } + if (j == len || j != last) { + // We matched a UNC root + device = "\\\\" + firstPart + "\\" + path.substr(last, j - last); + rootEnd = j; + } + } + } + } + } else if (IsWindowsDeviceRoot(code) && path[1] == ':') { + // Possible device root + device = path.substr(0, 2); + rootEnd = 2; + if (len > 2 && IsPathSeparator(path[2])) { + // Treat separator following drive name as an absolute path + // indicator + isAbsolute = true; + rootEnd = 3; + } + } + + if (!device.empty()) { + if (!resolvedDevice.empty()) { + if (ToLower(device) != ToLower(resolvedDevice)) { + // This path points to another device so it is not applicable + continue; + } + } else { + resolvedDevice = device; + } + } + + if (resolvedAbsolute) { + if (!resolvedDevice.empty()) { + break; + } + } else { + resolvedTail = path.substr(rootEnd) + "\\" + resolvedTail; + resolvedAbsolute = isAbsolute; + if (isAbsolute && !resolvedDevice.empty()) { + break; + } + } + } + + // At this point the path should be resolved to a full absolute path, + // but handle relative paths to be safe (might happen when process.cwd() + // fails) + + // Normalize the tail path + resolvedTail = NormalizeString(resolvedTail, !resolvedAbsolute, "\\"); + + if (resolvedAbsolute) { + return resolvedDevice + "\\" + resolvedTail; + } + + if (!resolvedDevice.empty() || !resolvedTail.empty()) { + return resolvedDevice + resolvedTail; + } + + return "."; +} +#else // _WIN32 +std::string PathResolve(Environment* env, + const std::vector& paths) { + std::string resolvedPath; + bool resolvedAbsolute = false; + auto cwd = env->GetCwd(env->exec_path()); + const size_t numArgs = paths.size(); + + for (int i = numArgs - 1; i >= -1 && !resolvedAbsolute; i--) { + const std::string& path = + (i >= 0) ? std::string(paths[i]) : env->GetCwd(env->exec_path()); + + if (!path.empty()) { + resolvedPath = std::string(path) + "/" + resolvedPath; + + if (path.front() == '/') { + resolvedAbsolute = true; + break; + } + } + } + + // Normalize the path + auto normalizedPath = NormalizeString(resolvedPath, !resolvedAbsolute, "/"); + + if (resolvedAbsolute) { + return "/" + normalizedPath; + } + + if (normalizedPath.empty()) { + return "."; + } + + return normalizedPath; +} +#endif // _WIN32 + +} // namespace node diff --git a/src/path.h b/src/path.h new file mode 100644 index 00000000000000..532c5f5849652c --- /dev/null +++ b/src/path.h @@ -0,0 +1,25 @@ +#ifndef SRC_PATH_H_ +#define SRC_PATH_H_ + +#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS + +#include +#include + +namespace node { + +class Environment; + +bool IsPathSeparator(const char c) noexcept; + +std::string NormalizeString(const std::string_view path, + bool allowAboveRoot, + const std::string_view separator); + +std::string PathResolve(Environment* env, + const std::vector& args); +} // namespace node + +#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS + +#endif // SRC_PATH_H_ diff --git a/src/permission/child_process_permission.cc b/src/permission/child_process_permission.cc index de078febf4bcd9..43bf5b7cbbc04f 100644 --- a/src/permission/child_process_permission.cc +++ b/src/permission/child_process_permission.cc @@ -9,13 +9,14 @@ namespace permission { // Currently, ChildProcess manage a single state // Once denied, it's always denied -void ChildProcessPermission::Apply(const std::vector& allow, +void ChildProcessPermission::Apply(Environment* env, + const std::vector& allow, PermissionScope scope) { deny_all_ = true; } bool ChildProcessPermission::is_granted(PermissionScope perm, - const std::string_view& param) { + const std::string_view& param) const { return deny_all_ == false; } diff --git a/src/permission/child_process_permission.h b/src/permission/child_process_permission.h index cf0ec97d5021a3..844e5ee07509f3 100644 --- a/src/permission/child_process_permission.h +++ b/src/permission/child_process_permission.h @@ -12,10 +12,11 @@ namespace permission { class ChildProcessPermission final : public PermissionBase { public: - void Apply(const std::vector& allow, + void Apply(Environment* env, + const std::vector& allow, PermissionScope scope) override; bool is_granted(PermissionScope perm, - const std::string_view& param = "") override; + const std::string_view& param = "") const override; private: bool deny_all_; diff --git a/src/permission/fs_permission.cc b/src/permission/fs_permission.cc index fadf75968c779d..0c881fa266d23d 100644 --- a/src/permission/fs_permission.cc +++ b/src/permission/fs_permission.cc @@ -1,7 +1,7 @@ #include "fs_permission.h" #include "base_object-inl.h" #include "debug_utils-inl.h" -#include "util.h" +#include "path.h" #include "v8.h" #include @@ -50,13 +50,14 @@ void FreeRecursivelyNode( delete node; } -bool is_tree_granted(node::permission::FSPermission::RadixTree* granted_tree, - const std::string_view& param) { +bool is_tree_granted( + const node::permission::FSPermission::RadixTree* granted_tree, + const std::string_view& param) { #ifdef _WIN32 // is UNC file path if (param.rfind("\\\\", 0) == 0) { // return lookup with normalized param - int starting_pos = 4; // "\\?\" + size_t starting_pos = 4; // "\\?\" if (param.rfind("\\\\?\\UNC\\") == 0) { starting_pos += 4; // "UNC\" } @@ -116,12 +117,11 @@ namespace permission { // allow = '*' // allow = '/tmp/,/home/example.js' -void FSPermission::Apply(const std::vector& allow, +void FSPermission::Apply(Environment* env, + const std::vector& allow, PermissionScope scope) { - using std::string_view_literals::operator""sv; - - for (const std::string_view res : allow) { - if (res == "*"sv) { + for (const std::string& res : allow) { + if (res == "*") { if (scope == PermissionScope::kFileSystemRead) { deny_all_in_ = false; allow_all_in_ = true; @@ -131,7 +131,7 @@ void FSPermission::Apply(const std::vector& allow, } return; } - GrantAccess(scope, std::string(res.data(), res.size())); + GrantAccess(scope, PathResolve(env, {res})); } } @@ -147,7 +147,7 @@ void FSPermission::GrantAccess(PermissionScope perm, const std::string& res) { } bool FSPermission::is_granted(PermissionScope perm, - const std::string_view& param = "") { + const std::string_view& param = "") const { switch (perm) { case PermissionScope::kFileSystem: return allow_all_in_ && allow_all_out_; @@ -171,12 +171,12 @@ FSPermission::RadixTree::~RadixTree() { } bool FSPermission::RadixTree::Lookup(const std::string_view& s, - bool when_empty_return = false) { + bool when_empty_return) const { FSPermission::RadixTree::Node* current_node = root_node_; if (current_node->children.size() == 0) { return when_empty_return; } - unsigned int parent_node_prefix_len = current_node->prefix.length(); + size_t parent_node_prefix_len = current_node->prefix.length(); const std::string path(s); auto path_len = path.length(); @@ -202,10 +202,10 @@ bool FSPermission::RadixTree::Lookup(const std::string_view& s, void FSPermission::RadixTree::Insert(const std::string& path) { FSPermission::RadixTree::Node* current_node = root_node_; - unsigned int parent_node_prefix_len = current_node->prefix.length(); - int path_len = path.length(); + size_t parent_node_prefix_len = current_node->prefix.length(); + size_t path_len = path.length(); - for (int i = 1; i <= path_len; ++i) { + for (size_t i = 1; i <= path_len; ++i) { bool is_wildcard_node = path[i - 1] == '*'; bool is_last_char = i == path_len; diff --git a/src/permission/fs_permission.h b/src/permission/fs_permission.h index 244e95727ad487..d994fd763aaf14 100644 --- a/src/permission/fs_permission.h +++ b/src/permission/fs_permission.h @@ -15,9 +15,11 @@ namespace permission { class FSPermission final : public PermissionBase { public: - void Apply(const std::vector& allow, + void Apply(Environment* env, + const std::vector& allow, PermissionScope scope) override; - bool is_granted(PermissionScope perm, const std::string_view& param) override; + bool is_granted(PermissionScope perm, + const std::string_view& param) const override; struct RadixTree { struct Node { @@ -31,7 +33,7 @@ class FSPermission final : public PermissionBase { Node() : wildcard_child(nullptr), is_leaf(false) {} - Node* CreateChild(std::string prefix) { + Node* CreateChild(const std::string& prefix) { if (prefix.empty() && !is_leaf) { is_leaf = true; return this; @@ -45,8 +47,8 @@ class FSPermission final : public PermissionBase { } // swap prefix - unsigned int i = 0; - unsigned int prefix_len = prefix.length(); + size_t i = 0; + size_t prefix_len = prefix.length(); for (; i < child->prefix.length(); ++i) { if (i > prefix_len || prefix[i] != child->prefix[i]) { std::string parent_prefix = child->prefix.substr(0, i); @@ -72,19 +74,27 @@ class FSPermission final : public PermissionBase { return wildcard_child; } - Node* NextNode(const std::string& path, unsigned int idx) { + Node* NextNode(const std::string& path, size_t idx) const { if (idx >= path.length()) { return nullptr; } + // wildcard node takes precedence + if (children.size() > 1) { + auto it = children.find('*'); + if (it != children.end()) { + return it->second; + } + } + auto it = children.find(path[idx]); if (it == children.end()) { return nullptr; } auto child = it->second; // match prefix - unsigned int prefix_len = child->prefix.length(); - for (unsigned int i = 0; i < path.length(); ++i) { + size_t prefix_len = child->prefix.length(); + for (size_t i = 0; i < path.length(); ++i) { if (i >= prefix_len || child->prefix[i] == '*') { return child; } @@ -115,7 +125,7 @@ class FSPermission final : public PermissionBase { // ---> '\000' ASCII (0) || \0 // ---> er // ---> n - bool IsEndNode() { + bool IsEndNode() const { if (children.size() == 0) { return true; } @@ -126,8 +136,8 @@ class FSPermission final : public PermissionBase { RadixTree(); ~RadixTree(); void Insert(const std::string& s); - bool Lookup(const std::string_view& s) { return Lookup(s, false); } - bool Lookup(const std::string_view& s, bool when_empty_return); + bool Lookup(const std::string_view& s) const { return Lookup(s, false); } + bool Lookup(const std::string_view& s, bool when_empty_return) const; private: Node* root_node_; diff --git a/src/permission/inspector_permission.cc b/src/permission/inspector_permission.cc index 401d801ac0adb5..59d8547b375222 100644 --- a/src/permission/inspector_permission.cc +++ b/src/permission/inspector_permission.cc @@ -8,13 +8,14 @@ namespace permission { // Currently, Inspector manage a single state // Once denied, it's always denied -void InspectorPermission::Apply(const std::vector& allow, +void InspectorPermission::Apply(Environment* env, + const std::vector& allow, PermissionScope scope) { deny_all_ = true; } bool InspectorPermission::is_granted(PermissionScope perm, - const std::string_view& param) { + const std::string_view& param) const { return deny_all_ == false; } diff --git a/src/permission/inspector_permission.h b/src/permission/inspector_permission.h index e5c6d1b81677f5..2b32ad0b078d5d 100644 --- a/src/permission/inspector_permission.h +++ b/src/permission/inspector_permission.h @@ -12,10 +12,11 @@ namespace permission { class InspectorPermission final : public PermissionBase { public: - void Apply(const std::vector& allow, + void Apply(Environment* env, + const std::vector& allow, PermissionScope scope) override; bool is_granted(PermissionScope perm, - const std::string_view& param = "") override; + const std::string_view& param = "") const override; private: bool deny_all_; diff --git a/src/permission/permission.cc b/src/permission/permission.cc index 4392f49b66e9b7..84235ed1b57731 100644 --- a/src/permission/permission.cc +++ b/src/permission/permission.cc @@ -130,11 +130,12 @@ void Permission::EnablePermissions() { } } -void Permission::Apply(const std::vector& allow, +void Permission::Apply(Environment* env, + const std::vector& allow, PermissionScope scope) { auto permission = nodes_.find(scope); if (permission != nodes_.end()) { - permission->second->Apply(allow, scope); + permission->second->Apply(env, allow, scope); } } diff --git a/src/permission/permission.h b/src/permission/permission.h index 942937a80cae28..3d37169eaaa17e 100644 --- a/src/permission/permission.h +++ b/src/permission/permission.h @@ -49,7 +49,9 @@ class Permission { const std::string_view& res); // CLI Call - void Apply(const std::vector& allow, PermissionScope scope); + void Apply(Environment* env, + const std::vector& allow, + PermissionScope scope); void EnablePermissions(); private: diff --git a/src/permission/permission_base.h b/src/permission/permission_base.h index c2f377424f6fc5..429a1fa854e2f1 100644 --- a/src/permission/permission_base.h +++ b/src/permission/permission_base.h @@ -10,6 +10,8 @@ namespace node { +class Environment; + namespace permission { #define FILESYSTEM_PERMISSIONS(V) \ @@ -39,10 +41,11 @@ enum class PermissionScope { class PermissionBase { public: - virtual void Apply(const std::vector& allow, + virtual void Apply(Environment* env, + const std::vector& allow, PermissionScope scope) = 0; virtual bool is_granted(PermissionScope perm, - const std::string_view& param = "") = 0; + const std::string_view& param = "") const = 0; }; } // namespace permission diff --git a/src/permission/worker_permission.cc b/src/permission/worker_permission.cc index a18938e5fe1efd..1eba2eab09bee1 100644 --- a/src/permission/worker_permission.cc +++ b/src/permission/worker_permission.cc @@ -9,13 +9,14 @@ namespace permission { // Currently, PolicyDenyWorker manage a single state // Once denied, it's always denied -void WorkerPermission::Apply(const std::vector& allow, +void WorkerPermission::Apply(Environment* env, + const std::vector& allow, PermissionScope scope) { deny_all_ = true; } bool WorkerPermission::is_granted(PermissionScope perm, - const std::string_view& param) { + const std::string_view& param) const { return deny_all_ == false; } diff --git a/src/permission/worker_permission.h b/src/permission/worker_permission.h index cdc224925c2291..29b6a523122c6e 100644 --- a/src/permission/worker_permission.h +++ b/src/permission/worker_permission.h @@ -12,10 +12,11 @@ namespace permission { class WorkerPermission final : public PermissionBase { public: - void Apply(const std::vector& allow, + void Apply(Environment* env, + const std::vector& allow, PermissionScope scope) override; bool is_granted(PermissionScope perm, - const std::string_view& param = "") override; + const std::string_view& param = "") const override; private: bool deny_all_; diff --git a/src/pipe_wrap.cc b/src/pipe_wrap.cc index 738a51a140d0af..3f7cf26709e57f 100644 --- a/src/pipe_wrap.cc +++ b/src/pipe_wrap.cc @@ -225,16 +225,23 @@ void PipeWrap::Connect(const FunctionCallbackInfo& args) { ConnectWrap* req_wrap = new ConnectWrap(env, req_wrap_obj, AsyncWrap::PROVIDER_PIPECONNECTWRAP); - req_wrap->Dispatch( + int err = req_wrap->Dispatch( uv_pipe_connect2, &wrap->handle_, *name, name.length(), 0, AfterConnect); + if (err) { + delete req_wrap; + } else { + const char* path_type = (*name)[0] == '\0' ? "abstract socket" : "file"; + const char* pipe_path = (*name)[0] == '\0' ? (*name) + 1 : *name; + TRACE_EVENT_NESTABLE_ASYNC_BEGIN2(TRACING_CATEGORY_NODE2(net, native), + "connect", + req_wrap, + "path_type", + path_type, + "pipe_path", + TRACE_STR_COPY(pipe_path)); + } - TRACE_EVENT_NESTABLE_ASYNC_BEGIN1(TRACING_CATEGORY_NODE2(net, native), - "connect", - req_wrap, - "pipe_path", - TRACE_STR_COPY(*name)); - - args.GetReturnValue().Set(0); // uv_pipe_connect() doesn't return errors. + args.GetReturnValue().Set(err); } } // namespace node diff --git a/src/process_wrap.cc b/src/process_wrap.cc index 42a746308ba8ac..a9b0cea29cbd15 100644 --- a/src/process_wrap.cc +++ b/src/process_wrap.cc @@ -20,6 +20,7 @@ // USE OR OTHER DEALINGS IN THE SOFTWARE. #include "env-inl.h" +#include "node_external_reference.h" #include "permission/permission.h" #include "stream_base-inl.h" #include "stream_wrap.h" @@ -67,6 +68,12 @@ class ProcessWrap : public HandleWrap { SetConstructorFunction(context, target, "Process", constructor); } + static void RegisterExternalReferences(ExternalReferenceRegistry* registry) { + registry->Register(New); + registry->Register(Spawn); + registry->Register(Kill); + } + SET_NO_MEMORY_INFO() SET_MEMORY_INFO_NAME(ProcessWrap) SET_SELF_SIZE(ProcessWrap) @@ -325,3 +332,5 @@ class ProcessWrap : public HandleWrap { } // namespace node NODE_BINDING_CONTEXT_AWARE_INTERNAL(process_wrap, node::ProcessWrap::Initialize) +NODE_BINDING_EXTERNAL_REFERENCE(process_wrap, + node::ProcessWrap::RegisterExternalReferences) diff --git a/src/quic/application.cc b/src/quic/application.cc index b7ba7fcf86b1ca..3ae6c8f2efef0d 100644 --- a/src/quic/application.cc +++ b/src/quic/application.cc @@ -1,9 +1,10 @@ -#include "uv.h" #if HAVE_OPENSSL && NODE_OPENSSL_HAS_QUIC +#include "application.h" +#include #include +#include #include -#include "application.h" #include "defs.h" #include "endpoint.h" #include "packet.h" @@ -37,14 +38,23 @@ const Session::Application_Options Session::Application_Options::kDefault = {}; Maybe Session::Application_Options::From( Environment* env, Local value) { - if (value.IsEmpty() || !value->IsObject()) { + if (value.IsEmpty()) { THROW_ERR_INVALID_ARG_TYPE(env, "options must be an object"); return Nothing(); } + Application_Options options; auto& state = BindingData::Get(env); + if (value->IsUndefined()) { + return Just(options); + } + + if (!value->IsObject()) { + THROW_ERR_INVALID_ARG_TYPE(env, "options must be an object"); + return Nothing(); + } + auto params = value.As(); - Application_Options options; #define SET(name) \ SetOptionBlocked(); + if (stream) stream->EmitBlocked(); } bool Session::Application::CanAddHeader(size_t current_count, @@ -141,7 +151,7 @@ BaseObjectPtr Session::Application::CreateStreamDataPacket() { return Packet::Create(env(), session_->endpoint_.get(), session_->remote_address_, - ngtcp2_conn_get_max_udp_payload_size(*session_), + ngtcp2_conn_get_max_tx_udp_payload_size(*session_), "stream data"); } @@ -233,7 +243,7 @@ void Session::Application::SendPendingData() { // and no more outbound data can be sent. CHECK_LE(ndatalen, 0); auto stream = session_->FindStream(stream_data.id); - if (stream) stream->End(); + if (stream) stream->EndWritable(); continue; } case NGTCP2_ERR_WRITE_MORE: { @@ -281,18 +291,18 @@ ssize_t Session::Application::WriteVStream(PathStorage* path, uint32_t flags = NGTCP2_WRITE_STREAM_FLAG_NONE; if (stream_data.remaining > 0) flags |= NGTCP2_WRITE_STREAM_FLAG_MORE; if (stream_data.fin) flags |= NGTCP2_WRITE_STREAM_FLAG_FIN; - ssize_t ret = - ngtcp2_conn_writev_stream(*session_, - &path->path, - nullptr, - buf, - ngtcp2_conn_get_max_udp_payload_size(*session_), - ndatalen, - flags, - stream_data.id, - stream_data.buf, - stream_data.count, - uv_hrtime()); + ssize_t ret = ngtcp2_conn_writev_stream( + *session_, + &path->path, + nullptr, + buf, + ngtcp2_conn_get_max_tx_udp_payload_size(*session_), + ndatalen, + flags, + stream_data.id, + stream_data.buf, + stream_data.count, + uv_hrtime()); return ret; } @@ -360,10 +370,8 @@ class DefaultApplication final : public Session::Application { stream_data->data, arraysize(stream_data->data), kMaxVectorCount); - switch (ret) { - case bob::Status::STATUS_EOS: - stream_data->fin = 1; - break; + if (ret == bob::Status::STATUS_EOS) { + stream_data->fin = 1; } } else { stream_data->fin = 1; diff --git a/src/quic/bindingdata.cc b/src/quic/bindingdata.cc index 3e95372ba2fc37..013ca2b5f9d92d 100644 --- a/src/quic/bindingdata.cc +++ b/src/quic/bindingdata.cc @@ -56,10 +56,11 @@ void BindingData::DecreaseAllocatedSize(size_t size) { current_ngtcp2_memory_ -= size; } -void BindingData::Initialize(Environment* env, Local target) { - SetMethod(env->context(), target, "setCallbacks", SetCallbacks); - SetMethod(env->context(), target, "flushPacketFreelist", FlushPacketFreelist); - Realm::GetCurrent(env->context())->AddBindingData(target); +void BindingData::InitPerContext(Realm* realm, Local target) { + SetMethod(realm->context(), target, "setCallbacks", SetCallbacks); + SetMethod( + realm->context(), target, "flushPacketFreelist", FlushPacketFreelist); + Realm::GetCurrent(realm->context())->AddBindingData(target); } void BindingData::RegisterExternalReferences( @@ -203,8 +204,12 @@ CallbackScopeBase::CallbackScopeBase(Environment* env) : env(env), context_scope(env->context()), try_catch(env->isolate()) {} CallbackScopeBase::~CallbackScopeBase() { - if (try_catch.HasCaught() && !try_catch.HasTerminated()) { - errors::TriggerUncaughtException(env->isolate(), try_catch); + if (try_catch.HasCaught()) { + if (!try_catch.HasTerminated() && env->can_call_into_js()) { + errors::TriggerUncaughtException(env->isolate(), try_catch); + } else { + try_catch.ReThrow(); + } } } diff --git a/src/quic/bindingdata.h b/src/quic/bindingdata.h index 2b33642b7ad76a..53622cf2d36eba 100644 --- a/src/quic/bindingdata.h +++ b/src/quic/bindingdata.h @@ -23,8 +23,8 @@ class Endpoint; class Packet; enum class Side { - CLIENT = NGTCP2_CRYPTO_SIDE_CLIENT, - SERVER = NGTCP2_CRYPTO_SIDE_SERVER, + CLIENT, + SERVER, }; enum class EndpointLabel { @@ -103,7 +103,6 @@ constexpr size_t kMaxVectorCount = 16; V(session_version_negotiation, SessionVersionNegotiation) \ V(session_path_validation, SessionPathValidation) \ V(stream_close, StreamClose) \ - V(stream_error, StreamError) \ V(stream_created, StreamCreated) \ V(stream_reset, StreamReset) \ V(stream_headers, StreamHeaders) \ @@ -119,11 +118,13 @@ constexpr size_t kMaxVectorCount = 16; V(address_lru_size, "addressLRUSize") \ V(alpn, "alpn") \ V(application_options, "application") \ + V(bbr, "bbr") \ V(ca, "ca") \ V(certs, "certs") \ V(cc_algorithm, "cc") \ V(crl, "crl") \ V(ciphers, "ciphers") \ + V(cubic, "cubic") \ V(disable_active_migration, "disableActiveMigration") \ V(disable_stateless_reset, "disableStatelessReset") \ V(enable_tls_trace, "tlsTrace") \ @@ -163,6 +164,7 @@ constexpr size_t kMaxVectorCount = 16; V(qpack_encoder_max_dtable_capacity, "qpackEncoderMaxDTableCapacity") \ V(qpack_max_dtable_capacity, "qpackMaxDTableCapacity") \ V(reject_unauthorized, "rejectUnauthorized") \ + V(reno, "reno") \ V(retry_token_expiration, "retryTokenExpiration") \ V(request_peer_certificate, "requestPeerCertificate") \ V(reset_token_secret, "resetTokenSecret") \ @@ -195,7 +197,7 @@ class BindingData final public mem::NgLibMemoryManager { public: SET_BINDING_ID(quic_binding_data) - static void Initialize(Environment* env, v8::Local target); + static void InitPerContext(Realm* realm, v8::Local target); static void RegisterExternalReferences(ExternalReferenceRegistry* registry); static BindingData& Get(Environment* env); @@ -304,6 +306,8 @@ struct CallbackScopeBase { ~CallbackScopeBase(); }; +// Maintains a strong reference to BaseObject type ptr to keep it alive during +// a MakeCallback during which it might be destroyed. template struct CallbackScope final : public CallbackScopeBase { BaseObjectPtr ref; diff --git a/src/quic/data.cc b/src/quic/data.cc index c5cba75a5c9374..2dd542f24b02ee 100644 --- a/src/quic/data.cc +++ b/src/quic/data.cc @@ -126,13 +126,15 @@ std::string TypeName(QuicError::Type type) { } // namespace QuicError::QuicError(const std::string_view reason) - : reason_(reason), ptr_(&error_) {} + : reason_(reason), error_(), ptr_(&error_) { + ngtcp2_ccerr_default(&error_); +} -QuicError::QuicError(const ngtcp2_connection_close_error* ptr) +QuicError::QuicError(const ngtcp2_ccerr* ptr) : reason_(reinterpret_cast(ptr->reason), ptr->reasonlen), ptr_(ptr) {} -QuicError::QuicError(const ngtcp2_connection_close_error& error) +QuicError::QuicError(const ngtcp2_ccerr& error) : reason_(reinterpret_cast(error.reason), error.reasonlen), error_(error), ptr_(&error_) {} @@ -175,11 +177,11 @@ const std::string_view QuicError::reason() const { return reason_; } -QuicError::operator const ngtcp2_connection_close_error&() const { +QuicError::operator const ngtcp2_ccerr&() const { return *ptr_; } -QuicError::operator const ngtcp2_connection_close_error*() const { +QuicError::operator const ngtcp2_ccerr*() const { return ptr_; } @@ -212,7 +214,7 @@ void QuicError::MemoryInfo(MemoryTracker* tracker) const { QuicError QuicError::ForTransport(error_code code, const std::string_view reason) { QuicError error(reason); - ngtcp2_connection_close_error_set_transport_error( + ngtcp2_ccerr_set_transport_error( &error.error_, code, error.reason_c_str(), reason.length()); return error; } @@ -220,7 +222,7 @@ QuicError QuicError::ForTransport(error_code code, QuicError QuicError::ForApplication(error_code code, const std::string_view reason) { QuicError error(reason); - ngtcp2_connection_close_error_set_application_error( + ngtcp2_ccerr_set_application_error( &error.error_, code, error.reason_c_str(), reason.length()); return error; } @@ -235,22 +237,20 @@ QuicError QuicError::ForIdleClose(const std::string_view reason) { QuicError QuicError::ForNgtcp2Error(int code, const std::string_view reason) { QuicError error(reason); - ngtcp2_connection_close_error_set_transport_error_liberr( + ngtcp2_ccerr_set_liberr( &error.error_, code, error.reason_c_str(), reason.length()); return error; } QuicError QuicError::ForTlsAlert(int code, const std::string_view reason) { QuicError error(reason); - ngtcp2_connection_close_error_set_transport_error_tls_alert( + ngtcp2_ccerr_set_tls_alert( &error.error_, code, error.reason_c_str(), reason.length()); return error; } QuicError QuicError::FromConnectionClose(ngtcp2_conn* session) { - QuicError error; - ngtcp2_conn_get_connection_close_error(session, &error.error_); - return error; + return QuicError(ngtcp2_conn_get_ccerr(session)); } QuicError QuicError::TRANSPORT_NO_ERROR = diff --git a/src/quic/data.h b/src/quic/data.h index ef103254104ec3..56a8c8c6d5e869 100644 --- a/src/quic/data.h +++ b/src/quic/data.h @@ -71,29 +71,28 @@ class QuicError final : public MemoryRetainer { static constexpr error_code QUIC_APP_NO_ERROR = 65280; enum class Type { - TRANSPORT = NGTCP2_CONNECTION_CLOSE_ERROR_CODE_TYPE_TRANSPORT, - APPLICATION = NGTCP2_CONNECTION_CLOSE_ERROR_CODE_TYPE_APPLICATION, - VERSION_NEGOTIATION = - NGTCP2_CONNECTION_CLOSE_ERROR_CODE_TYPE_TRANSPORT_VERSION_NEGOTIATION, - IDLE_CLOSE = NGTCP2_CONNECTION_CLOSE_ERROR_CODE_TYPE_TRANSPORT_IDLE_CLOSE, + TRANSPORT = NGTCP2_CCERR_TYPE_TRANSPORT, + APPLICATION = NGTCP2_CCERR_TYPE_APPLICATION, + VERSION_NEGOTIATION = NGTCP2_CCERR_TYPE_VERSION_NEGOTIATION, + IDLE_CLOSE = NGTCP2_CCERR_TYPE_IDLE_CLOSE, }; static constexpr error_code QUIC_ERROR_TYPE_TRANSPORT = - NGTCP2_CONNECTION_CLOSE_ERROR_CODE_TYPE_TRANSPORT; + NGTCP2_CCERR_TYPE_TRANSPORT; static constexpr error_code QUIC_ERROR_TYPE_APPLICATION = - NGTCP2_CONNECTION_CLOSE_ERROR_CODE_TYPE_APPLICATION; + NGTCP2_CCERR_TYPE_APPLICATION; explicit QuicError(const std::string_view reason = ""); - explicit QuicError(const ngtcp2_connection_close_error* ptr); - explicit QuicError(const ngtcp2_connection_close_error& error); + explicit QuicError(const ngtcp2_ccerr* ptr); + explicit QuicError(const ngtcp2_ccerr& error); Type type() const; error_code code() const; const std::string_view reason() const; uint64_t frame_type() const; - operator const ngtcp2_connection_close_error&() const; - operator const ngtcp2_connection_close_error*() const; + operator const ngtcp2_ccerr&() const; + operator const ngtcp2_ccerr*() const; // Returns false if the QuicError uses a no_error code with type // transport or application. @@ -130,8 +129,8 @@ class QuicError final : public MemoryRetainer { const uint8_t* reason_c_str() const; std::string reason_; - ngtcp2_connection_close_error error_ = ngtcp2_connection_close_error(); - const ngtcp2_connection_close_error* ptr_ = nullptr; + ngtcp2_ccerr error_; + const ngtcp2_ccerr* ptr_ = nullptr; }; } // namespace quic diff --git a/src/quic/defs.h b/src/quic/defs.h index 65ebe812efa1b7..fc0bc0c81a7b7e 100644 --- a/src/quic/defs.h +++ b/src/quic/defs.h @@ -28,6 +28,17 @@ bool SetOption(Environment* env, } template +bool SetOption(Environment* env, + Opt* options, + const v8::Local& object, + const v8::Local& name) { + v8::Local value; + if (!object->Get(env->context(), name).ToLocal(&value)) return false; + options->*member = value->BooleanValue(env->isolate()); + return true; +} + +template bool SetOption(Environment* env, Opt* options, const v8::Local& object, @@ -35,8 +46,20 @@ bool SetOption(Environment* env, v8::Local value; if (!object->Get(env->context(), name).ToLocal(&value)) return false; if (!value->IsUndefined()) { - CHECK(value->IsBoolean()); - options->*member = value->IsTrue(); + if (!value->IsUint32()) { + Utf8Value nameStr(env->isolate(), name); + THROW_ERR_INVALID_ARG_VALUE( + env, "The %s option must be an uint32", *nameStr); + return false; + } + v8::Local num; + if (!value->ToUint32(env->context()).ToLocal(&num)) { + Utf8Value nameStr(env->isolate(), name); + THROW_ERR_INVALID_ARG_VALUE( + env, "The %s option must be an uint32", *nameStr); + return false; + } + options->*member = num->Value(); } return true; } @@ -50,7 +73,13 @@ bool SetOption(Environment* env, if (!object->Get(env->context(), name).ToLocal(&value)) return false; if (!value->IsUndefined()) { - CHECK_IMPLIES(!value->IsBigInt(), value->IsNumber()); + if (!value->IsBigInt() && !value->IsNumber()) { + Utf8Value nameStr(env->isolate(), name); + THROW_ERR_INVALID_ARG_VALUE( + env, "option %s must be a bigint or number", *nameStr); + return false; + } + DCHECK_IMPLIES(!value->IsBigInt(), value->IsNumber()); uint64_t val = 0; if (value->IsBigInt()) { @@ -58,12 +87,17 @@ bool SetOption(Environment* env, val = value.As()->Uint64Value(&lossless); if (!lossless) { Utf8Value label(env->isolate(), name); - THROW_ERR_OUT_OF_RANGE( - env, ("options." + label.ToString() + " is out of range").c_str()); + THROW_ERR_INVALID_ARG_VALUE(env, "option %s is out of range", *label); return false; } } else { - val = static_cast(value.As()->Value()); + double dbl = value.As()->Value(); + if (dbl < 0) { + Utf8Value label(env->isolate(), name); + THROW_ERR_INVALID_ARG_VALUE(env, "option %s is out of range", *label); + return false; + } + val = static_cast(dbl); } options->*member = val; } diff --git a/src/quic/endpoint.cc b/src/quic/endpoint.cc index bc47cfb26be9e2..93154c1fe29883 100644 --- a/src/quic/endpoint.cc +++ b/src/quic/endpoint.cc @@ -7,12 +7,15 @@ #include #include #include +#include #include #include #include #include #include +#include #include "application.h" +#include "bindingdata.h" #include "defs.h" namespace node { @@ -30,8 +33,10 @@ using v8::Maybe; using v8::Nothing; using v8::Number; using v8::Object; +using v8::ObjectTemplate; using v8::PropertyAttribute; using v8::String; +using v8::Uint32; using v8::Value; namespace quic { @@ -43,14 +48,12 @@ namespace quic { V(RECEIVING, receiving, uint8_t) \ /* Listening as a QUIC server */ \ V(LISTENING, listening, uint8_t) \ - /* In the process of closing down */ \ - V(CLOSING, closing, uint8_t) \ /* In the process of closing down, waiting for pending send callbacks */ \ - V(WAITING_FOR_CALLBACKS, waiting_for_callbacks, uint8_t) \ + V(CLOSING, closing, uint8_t) \ /* Temporarily paused serving new initial requests */ \ V(BUSY, busy, uint8_t) \ /* The number of pending send callbacks */ \ - V(PENDING_CALLBACKS, pending_callbacks, size_t) + V(PENDING_CALLBACKS, pending_callbacks, uint64_t) #define ENDPOINT_STATS(V) \ V(CREATED_AT, created_at) \ @@ -67,6 +70,11 @@ namespace quic { V(STATELESS_RESET_COUNT, stateless_reset_count) \ V(IMMEDIATE_CLOSE_COUNT, immediate_close_count) +#define ENDPOINT_CC(V) \ + V(RENO, reno) \ + V(CUBIC, cubic) \ + V(BBR, bbr) + struct Endpoint::State { #define V(_, name, type) type name; ENDPOINT_STATE(V) @@ -76,7 +84,7 @@ struct Endpoint::State { STAT_STRUCT(Endpoint, ENDPOINT) // ============================================================================ - +// Endpoint::Options namespace { #ifdef DEBUG bool is_diagnostic_packet_loss(double probability) { @@ -87,71 +95,107 @@ bool is_diagnostic_packet_loss(double probability) { } #endif // DEBUG +Maybe getAlgoFromString(Environment* env, Local input) { + auto& state = BindingData::Get(env); +#define V(name, str) \ + if (input->StringEquals(state.str##_string())) { \ + return Just(NGTCP2_CC_ALGO_##name); \ + } + + ENDPOINT_CC(V) + +#undef V + return Nothing(); +} + template bool SetOption(Environment* env, Opt* options, - const v8::Local& object, - const v8::Local& name) { - v8::Local value; + const Local& object, + const Local& name) { + Local value; if (!object->Get(env->context(), name).ToLocal(&value)) return false; if (!value->IsUndefined()) { - int num = value.As()->Value(); - switch (num) { - case NGTCP2_CC_ALGO_RENO: - [[fallthrough]]; - case NGTCP2_CC_ALGO_CUBIC: - [[fallthrough]]; - case NGTCP2_CC_ALGO_BBR: - [[fallthrough]]; - case NGTCP2_CC_ALGO_BBR2: - break; - default: - THROW_ERR_INVALID_ARG_VALUE(env, "The cc_algorithm is invalid"); + ngtcp2_cc_algo algo; + if (value->IsString()) { + if (!getAlgoFromString(env, value.As()).To(&algo)) { + THROW_ERR_INVALID_ARG_VALUE(env, "The cc_algorithm option is invalid"); return false; + } + } else { + if (!value->IsInt32()) { + THROW_ERR_INVALID_ARG_VALUE( + env, "The cc_algorithm option must be a string or an integer"); + return false; + } + Local num; + if (!value->ToInt32(env->context()).ToLocal(&num)) { + THROW_ERR_INVALID_ARG_VALUE(env, "The cc_algorithm option is invalid"); + return false; + } + switch (num->Value()) { +#define V(name, _) \ + case NGTCP2_CC_ALGO_##name: \ + break; + ENDPOINT_CC(V) +#undef V + default: + THROW_ERR_INVALID_ARG_VALUE(env, + "The cc_algorithm option is invalid"); + return false; + } + algo = static_cast(num->Value()); } - options->*member = static_cast(num); + options->*member = algo; } return true; } +#if DEBUG template bool SetOption(Environment* env, Opt* options, - const v8::Local& object, - const v8::Local& name) { - v8::Local value; - if (!object->Get(env->context(), name).ToLocal(&value)) return false; - if (!value->IsUndefined()) { - CHECK(value->IsNumber()); - options->*member = value.As()->Value(); - } - return true; -} - -template -bool SetOption(Environment* env, - Opt* options, - const v8::Local& object, - const v8::Local& name) { - v8::Local value; + const Local& object, + const Local& name) { + Local value; if (!object->Get(env->context(), name).ToLocal(&value)) return false; if (!value->IsUndefined()) { - CHECK(value->IsNumber()); - options->*member = value.As()->Value(); + Local num; + if (!value->ToNumber(env->context()).ToLocal(&num)) { + Utf8Value nameStr(env->isolate(), name); + THROW_ERR_INVALID_ARG_VALUE( + env, "The %s option must be a number", *nameStr); + return false; + } + options->*member = num->Value(); } return true; } +#endif // DEBUG template bool SetOption(Environment* env, Opt* options, - const v8::Local& object, - const v8::Local& name) { - v8::Local value; + const Local& object, + const Local& name) { + Local value; if (!object->Get(env->context(), name).ToLocal(&value)) return false; if (!value->IsUndefined()) { - CHECK(value->IsNumber()); - options->*member = value.As()->Value(); + if (!value->IsUint32()) { + Utf8Value nameStr(env->isolate(), name); + THROW_ERR_INVALID_ARG_VALUE( + env, "The %s option must be an uint8", *nameStr); + return false; + } + Local num; + if (!value->ToUint32(env->context()).ToLocal(&num) || + num->Value() > std::numeric_limits::max()) { + Utf8Value nameStr(env->isolate(), name); + THROW_ERR_INVALID_ARG_VALUE( + env, "The %s option must be an uint8", *nameStr); + return false; + } + options->*member = num->Value(); } return true; } @@ -159,16 +203,30 @@ bool SetOption(Environment* env, template bool SetOption(Environment* env, Opt* options, - const v8::Local& object, - const v8::Local& name) { - v8::Local value; + const Local& object, + const Local& name) { + Local value; if (!object->Get(env->context(), name).ToLocal(&value)) return false; if (!value->IsUndefined()) { - CHECK(value->IsArrayBufferView()); + if (!value->IsArrayBufferView()) { + Utf8Value nameStr(env->isolate(), name); + THROW_ERR_INVALID_ARG_VALUE( + env, "The %s option must be an ArrayBufferView", *nameStr); + return false; + } Store store(value.As()); - CHECK_EQ(store.length(), TokenSecret::QUIC_TOKENSECRET_LEN); + if (store.length() != TokenSecret::QUIC_TOKENSECRET_LEN) { + Utf8Value nameStr(env->isolate(), name); + THROW_ERR_INVALID_ARG_VALUE( + env, + "The %s option must be an ArrayBufferView of length %d", + *nameStr, + TokenSecret::QUIC_TOKENSECRET_LEN); + return false; + } ngtcp2_vec buf = store; - options->*member = buf.base; + TokenSecret secret(buf.base); + options->*member = secret; } return true; } @@ -204,6 +262,26 @@ Maybe Endpoint::Options::From(Environment* env, return Nothing(); } + Local address; + if (!params->Get(env->context(), env->address_string()).ToLocal(&address)) { + return Nothing(); + } + if (!address->IsUndefined()) { + if (!SocketAddressBase::HasInstance(env, address)) { + THROW_ERR_INVALID_ARG_TYPE(env, + "The address option must be a SocketAddress"); + return Nothing(); + } + auto addr = FromJSObject(address.As()); + options.local_address = addr->address(); + } else { + options.local_address = std::make_shared(); + if (!SocketAddress::New("127.0.0.1", 0, options.local_address.get())) { + THROW_ERR_INVALID_ADDRESS(env); + return Nothing(); + } + } + return Just(options); #undef SET @@ -233,16 +311,15 @@ class Endpoint::UDP::Impl final : public HandleWrap { return tmpl; } - static BaseObjectPtr Create(Endpoint* endpoint) { + static Impl* Create(Endpoint* endpoint) { Local obj; if (!GetConstructorTemplate(endpoint->env()) ->InstanceTemplate() ->NewInstance(endpoint->env()->context()) .ToLocal(&obj)) { - return BaseObjectPtr(); + return nullptr; } - - return MakeDetachedBaseObject(endpoint, obj); + return new Impl(endpoint, obj); } static Impl* From(uv_udp_t* handle) { @@ -268,10 +345,6 @@ class Endpoint::UDP::Impl final : public HandleWrap { SET_SELF_SIZE(Impl) private: - static void ClosedCb(uv_handle_t* handle) { - std::unique_ptr ptr(From(handle)); - } - static void OnAlloc(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) { @@ -309,7 +382,7 @@ class Endpoint::UDP::Impl final : public HandleWrap { }; Endpoint::UDP::UDP(Endpoint* endpoint) : impl_(Impl::Create(endpoint)) { - endpoint->env()->AddCleanupHook(CleanupHook, this); + DCHECK(impl_); } Endpoint::UDP::~UDP() { @@ -318,12 +391,12 @@ Endpoint::UDP::~UDP() { int Endpoint::UDP::Bind(const Endpoint::Options& options) { if (is_bound_) return UV_EALREADY; - if (is_closed() || impl_->IsHandleClosing()) return UV_EBADF; + if (is_closed_or_closing()) return UV_EBADF; int flags = 0; - if (options.local_address.family() == AF_INET6 && options.ipv6_only) + if (options.local_address->family() == AF_INET6 && options.ipv6_only) flags |= UV_UDP_IPV6ONLY; - int err = uv_udp_bind(&impl_->handle_, options.local_address.data(), flags); + int err = uv_udp_bind(&impl_->handle_, options.local_address->data(), flags); int size; if (!err) { @@ -353,15 +426,19 @@ int Endpoint::UDP::Bind(const Endpoint::Options& options) { } void Endpoint::UDP::Ref() { - if (!is_closed()) uv_ref(reinterpret_cast(&impl_->handle_)); + if (!is_closed_or_closing()) { + uv_ref(reinterpret_cast(&impl_->handle_)); + } } void Endpoint::UDP::Unref() { - if (!is_closed()) uv_unref(reinterpret_cast(&impl_->handle_)); + if (!is_closed_or_closing()) { + uv_unref(reinterpret_cast(&impl_->handle_)); + } } int Endpoint::UDP::Start() { - if (is_closed() || impl_->IsHandleClosing()) return UV_EBADF; + if (is_closed_or_closing()) return UV_EBADF; if (is_started_) return 0; int err = uv_udp_recv_start(&impl_->handle_, Impl::OnAlloc, Impl::OnReceive); is_started_ = (err == 0); @@ -369,16 +446,17 @@ int Endpoint::UDP::Start() { } void Endpoint::UDP::Stop() { - if (is_closed() || impl_->IsHandleClosing() || !is_started_) return; + if (is_closed_or_closing() || !is_started_) return; USE(uv_udp_recv_stop(&impl_->handle_)); is_started_ = false; } void Endpoint::UDP::Close() { - if (is_closed() || impl_->IsHandleClosing()) return; + if (is_closed_or_closing()) return; + DCHECK(impl_); Stop(); is_bound_ = false; - impl_->env()->RemoveCleanupHook(CleanupHook, this); + is_closed_ = true; impl_->Close(); impl_.reset(); } @@ -388,20 +466,26 @@ bool Endpoint::UDP::is_bound() const { } bool Endpoint::UDP::is_closed() const { - return !impl_; + return is_closed_; } + +bool Endpoint::UDP::is_closed_or_closing() const { + if (is_closed() || !impl_) return true; + return impl_->IsHandleClosing(); +} + Endpoint::UDP::operator bool() const { - return !impl_; + return impl_; } SocketAddress Endpoint::UDP::local_address() const { - CHECK(!is_closed() && is_bound()); + DCHECK(!is_closed_or_closing() && is_bound()); return SocketAddress::FromSockName(impl_->handle_); } int Endpoint::UDP::Send(BaseObjectPtr packet) { - if (is_closed() || impl_->IsHandleClosing()) return UV_EBADF; - CHECK(packet && !packet->is_sending()); + if (is_closed_or_closing()) return UV_EBADF; + DCHECK(packet && !packet->is_sending()); uv_buf_t buf = *packet; return packet->Dispatch( uv_udp_send, @@ -419,10 +503,6 @@ void Endpoint::UDP::MemoryInfo(MemoryTracker* tracker) const { if (impl_) tracker->TrackField("impl", impl_); } -void Endpoint::UDP::CleanupHook(void* data) { - static_cast(data)->Close(); -} - // ============================================================================ bool Endpoint::HasInstance(Environment* env, Local value) { @@ -434,7 +514,7 @@ Local Endpoint::GetConstructorTemplate(Environment* env) { auto tmpl = state.endpoint_constructor_template(); if (tmpl.IsEmpty()) { auto isolate = env->isolate(); - tmpl = NewFunctionTemplate(isolate, IllegalConstructor); + tmpl = NewFunctionTemplate(isolate, New); tmpl->Inherit(AsyncWrap::GetConstructorTemplate(env)); tmpl->SetClassName(state.endpoint_string()); tmpl->InstanceTemplate()->SetInternalFieldCount( @@ -444,54 +524,70 @@ Local Endpoint::GetConstructorTemplate(Environment* env) { SetProtoMethod(isolate, tmpl, "connect", DoConnect); SetProtoMethod(isolate, tmpl, "markBusy", MarkBusy); SetProtoMethod(isolate, tmpl, "ref", Ref); - SetProtoMethod(isolate, tmpl, "unref", Unref); SetProtoMethodNoSideEffect(isolate, tmpl, "address", LocalAddress); state.set_endpoint_constructor_template(tmpl); } return tmpl; } -void Endpoint::Initialize(Environment* env, Local target) { - SetMethod(env->context(), target, "createEndpoint", CreateEndpoint); +void Endpoint::InitPerIsolate(IsolateData* data, Local target) { + // TODO(@jasnell): Implement the per-isolate state +} + +void Endpoint::InitPerContext(Realm* realm, Local target) { +#define V(name, str) \ + NODE_DEFINE_CONSTANT(target, QUIC_CC_ALGO_##name); \ + NODE_DEFINE_STRING_CONSTANT(target, "QUIC_CC_ALGO_" #name "_STR", #str); + ENDPOINT_CC(V) +#undef V #define V(name, _) IDX_STATS_ENDPOINT_##name, - enum EndpointStatsIdx { ENDPOINT_STATS(V) IDX_STATS_ENDPOINT_COUNT }; + enum IDX_STATS_ENDPONT { ENDPOINT_STATS(V) IDX_STATS_ENDPOINT_COUNT }; + NODE_DEFINE_CONSTANT(target, IDX_STATS_ENDPOINT_COUNT); #undef V -#define V(name, key, __) \ - auto IDX_STATE_ENDPOINT_##name = offsetof(Endpoint::State, key); - ENDPOINT_STATE(V) +#define V(name, key) NODE_DEFINE_CONSTANT(target, IDX_STATS_ENDPOINT_##name); + ENDPOINT_STATS(V); #undef V -#define V(name, _) NODE_DEFINE_CONSTANT(target, IDX_STATS_ENDPOINT_##name); - ENDPOINT_STATS(V) -#undef V -#define V(name, _, __) NODE_DEFINE_CONSTANT(target, IDX_STATE_ENDPOINT_##name); +#define V(name, key, type) \ + static constexpr auto IDX_STATE_ENDPOINT_##name = \ + offsetof(Endpoint::State, key); \ + static constexpr auto IDX_STATE_ENDPOINT_##name##_SIZE = sizeof(type); \ + NODE_DEFINE_CONSTANT(target, IDX_STATE_ENDPOINT_##name); \ + NODE_DEFINE_CONSTANT(target, IDX_STATE_ENDPOINT_##name##_SIZE); ENDPOINT_STATE(V) #undef V + + NODE_DEFINE_CONSTANT(target, DEFAULT_MAX_CONNECTIONS); + NODE_DEFINE_CONSTANT(target, DEFAULT_MAX_CONNECTIONS_PER_HOST); + NODE_DEFINE_CONSTANT(target, DEFAULT_MAX_SOCKETADDRESS_LRU_SIZE); + NODE_DEFINE_CONSTANT(target, DEFAULT_MAX_STATELESS_RESETS); + NODE_DEFINE_CONSTANT(target, DEFAULT_MAX_RETRY_LIMIT); + + static constexpr auto DEFAULT_RETRYTOKEN_EXPIRATION = + RetryToken::QUIC_DEFAULT_RETRYTOKEN_EXPIRATION / NGTCP2_SECONDS; + static constexpr auto DEFAULT_REGULARTOKEN_EXPIRATION = + RegularToken::QUIC_DEFAULT_REGULARTOKEN_EXPIRATION / NGTCP2_SECONDS; + static constexpr auto DEFAULT_MAX_PACKET_LENGTH = kDefaultMaxPacketLength; + NODE_DEFINE_CONSTANT(target, DEFAULT_RETRYTOKEN_EXPIRATION); + NODE_DEFINE_CONSTANT(target, DEFAULT_REGULARTOKEN_EXPIRATION); + NODE_DEFINE_CONSTANT(target, DEFAULT_MAX_PACKET_LENGTH); + + SetConstructorFunction(realm->context(), + target, + "Endpoint", + GetConstructorTemplate(realm->env())); } void Endpoint::RegisterExternalReferences(ExternalReferenceRegistry* registry) { - registry->Register(CreateEndpoint); + registry->Register(New); registry->Register(DoConnect); registry->Register(DoListen); registry->Register(DoCloseGracefully); registry->Register(LocalAddress); registry->Register(Ref); - registry->Register(Unref); -} - -BaseObjectPtr Endpoint::Create(Environment* env, - const Endpoint::Options& options) { - Local obj; - if (!GetConstructorTemplate(env) - ->InstanceTemplate() - ->NewInstance(env->context()) - .ToLocal(&obj)) { - return BaseObjectPtr(); - } - - return MakeDetachedBaseObject(env, obj, options); + registry->Register(MarkBusy); } Endpoint::Endpoint(Environment* env, @@ -500,7 +596,7 @@ Endpoint::Endpoint(Environment* env, : AsyncWrap(env, object, AsyncWrap::PROVIDER_QUIC_ENDPOINT), stats_(env->isolate()), state_(env->isolate()), - options_(std::move(options)), + options_(options), udp_(this), addrLRU_(options_.address_lru_size) { MakeWeak(); @@ -516,15 +612,8 @@ Endpoint::Endpoint(Environment* env, defineProperty(env->stats_string(), stats_.GetArrayBuffer()); } -Endpoint::~Endpoint() { - udp_.Close(); - DCHECK_EQ(state_->pending_callbacks, 0); - DCHECK(sessions_.empty()); - DCHECK(is_closed()); -} - SocketAddress Endpoint::local_address() const { - CHECK(!is_closed()); + DCHECK(!is_closed() && !is_closing()); return udp_.local_address(); } @@ -562,7 +651,7 @@ void Endpoint::RemoveSession(const CID& cid) { if (!session) return; DecrementSocketAddressCounter(session->remote_address()); sessions_.erase(cid); - if (state_->waiting_for_callbacks == 1) MaybeDestroy(); + if (state_->closing == 1) MaybeDestroy(); } BaseObjectPtr Endpoint::FindSession(const CID& cid) { @@ -764,18 +853,17 @@ BaseObjectPtr Endpoint::Connect( } void Endpoint::MaybeDestroy() { - if (!is_closing() && sessions_.empty() && state_->pending_callbacks == 0 && + if (!is_closed() && sessions_.empty() && state_->pending_callbacks == 0 && state_->listening == 0) { Destroy(); } } void Endpoint::Destroy(CloseContext context, int status) { - if (is_closed() || is_closing()) return; + if (is_closed()) return; STAT_RECORD_TIMESTAMP(Stats, destroyed_at); - state_->closing = 1; state_->listening = 0; close_context_ = context; @@ -790,7 +878,7 @@ void Endpoint::Destroy(CloseContext context, int status) { for (auto& session : sessions) session.second->Close(Session::CloseMethod::SILENT); sessions.clear(); - CHECK(sessions_.empty()); + DCHECK(sessions_.empty()); token_map_.clear(); dcid_to_scid_.clear(); @@ -804,10 +892,10 @@ void Endpoint::Destroy(CloseContext context, int status) { } void Endpoint::CloseGracefully() { - if (!is_closed() && !is_closing() && state_->waiting_for_callbacks == 0) { - state_->listening = 0; - state_->waiting_for_callbacks = 1; - } + if (is_closed() || is_closing()) return; + + state_->listening = 0; + state_->closing = 1; // Maybe we can go ahead and destroy now? MaybeDestroy(); @@ -927,7 +1015,7 @@ void Endpoint::Receive(const uv_buf_t& buf, if (options_.validate_address) { // If there is no token, generate and send one. - if (hd.token.len == 0) { + if (hd.tokenlen == 0) { SendRetry(PathDescriptor{ version, dcid, @@ -942,9 +1030,9 @@ void Endpoint::Receive(const uv_buf_t& buf, // We have two kinds of tokens, each prefixed with a different magic // byte. - switch (hd.token.base[0]) { + switch (hd.token[0]) { case RetryToken::kTokenMagic: { - RetryToken token(hd.token.base, hd.token.len); + RetryToken token(hd.token, hd.tokenlen); auto ocid = token.Validate( version, remote_address, @@ -970,7 +1058,7 @@ void Endpoint::Receive(const uv_buf_t& buf, break; } case RegularToken::kTokenMagic: { - RegularToken token(hd.token.base, hd.token.len); + RegularToken token(hd.token, hd.tokenlen); if (!token.Validate( version, remote_address, @@ -987,8 +1075,8 @@ void Endpoint::Receive(const uv_buf_t& buf, // if a retry is sent. return true; } - hd.token.base = nullptr; - hd.token.len = 0; + hd.token = nullptr; + hd.tokenlen = 0; break; } default: { @@ -1008,7 +1096,7 @@ void Endpoint::Receive(const uv_buf_t& buf, // so we don't have to do this dance again for this endpoint // instance. addrLRU_.Upsert(remote_address)->validated = true; - } else if (hd.token.len > 0) { + } else if (hd.tokenlen > 0) { // If validation is turned off and there is a token, that's weird. // The peer should only have a token if we sent it to them and we // wouldn't have sent it unless validation was turned on. Let's @@ -1188,7 +1276,7 @@ void Endpoint::PacketDone(int status) { if (is_closed()) return; state_->pending_callbacks--; // Can we go ahead and close now? - if (state_->waiting_for_callbacks == 1) { + if (state_->closing == 1) { // MaybeDestroy potentially creates v8 handles so let's make sure // we have a HandleScope on the stack. HandleScope scope(env()->isolate()); @@ -1267,18 +1355,17 @@ void Endpoint::EmitClose(CloseContext context, int status) { // ====================================================================================== // Endpoint JavaScript API -void Endpoint::CreateEndpoint(const FunctionCallbackInfo& args) { - CHECK(!args.IsConstructCall()); +void Endpoint::New(const FunctionCallbackInfo& args) { + DCHECK(args.IsConstructCall()); auto env = Environment::GetCurrent(args); - CHECK(args[0]->IsObject()); Options options; + // Options::From will validate that args[0] is the correct type. if (!Options::From(env, args[0]).To(&options)) { // There was an error. Just exit to propagate. return; } - auto endpoint = Endpoint::Create(env, options); - if (endpoint) args.GetReturnValue().Set(endpoint->object()); + new Endpoint(env, args.This(), options); } void Endpoint::DoConnect(const FunctionCallbackInfo& args) { @@ -1342,23 +1429,21 @@ void Endpoint::LocalAddress(const FunctionCallbackInfo& args) { auto env = Environment::GetCurrent(args); Endpoint* endpoint; ASSIGN_OR_RETURN_UNWRAP(&endpoint, args.Holder()); - if (endpoint->is_closed()) return; - auto local_address = endpoint->local_address(); + if (endpoint->is_closed() || !endpoint->udp_.is_bound()) return; auto addr = SocketAddressBase::Create( - env, std::make_shared(local_address)); + env, std::make_shared(endpoint->local_address())); if (addr) args.GetReturnValue().Set(addr->object()); } void Endpoint::Ref(const FunctionCallbackInfo& args) { Endpoint* endpoint; ASSIGN_OR_RETURN_UNWRAP(&endpoint, args.Holder()); - endpoint->udp_.Ref(); -} - -void Endpoint::Unref(const FunctionCallbackInfo& args) { - Endpoint* endpoint; - ASSIGN_OR_RETURN_UNWRAP(&endpoint, args.Holder()); - endpoint->udp_.Unref(); + auto env = Environment::GetCurrent(args); + if (args[0]->BooleanValue(env->isolate())) { + endpoint->udp_.Ref(); + } else { + endpoint->udp_.Unref(); + } } } // namespace quic diff --git a/src/quic/endpoint.h b/src/quic/endpoint.h index 700630c2244420..04f8f5ae50f082 100644 --- a/src/quic/endpoint.h +++ b/src/quic/endpoint.h @@ -12,7 +12,6 @@ #include #include #include "bindingdata.h" -#include "defs.h" #include "packet.h" #include "session.h" #include "sessionticket.h" @@ -26,20 +25,24 @@ namespace quic { // client and server simultaneously. class Endpoint final : public AsyncWrap, public Packet::Listener { public: - static constexpr size_t DEFAULT_MAX_CONNECTIONS = - std::min(kMaxSizeT, static_cast(kMaxSafeJsInteger)); - static constexpr size_t DEFAULT_MAX_CONNECTIONS_PER_HOST = 100; - static constexpr size_t DEFAULT_MAX_SOCKETADDRESS_LRU_SIZE = + static constexpr uint64_t DEFAULT_MAX_CONNECTIONS = + std::min(kMaxSizeT, static_cast(kMaxSafeJsInteger)); + static constexpr uint64_t DEFAULT_MAX_CONNECTIONS_PER_HOST = 100; + static constexpr uint64_t DEFAULT_MAX_SOCKETADDRESS_LRU_SIZE = (DEFAULT_MAX_CONNECTIONS_PER_HOST * 10); - static constexpr size_t DEFAULT_MAX_STATELESS_RESETS = 10; - static constexpr size_t DEFAULT_MAX_RETRY_LIMIT = 10; + static constexpr uint64_t DEFAULT_MAX_STATELESS_RESETS = 10; + static constexpr uint64_t DEFAULT_MAX_RETRY_LIMIT = 10; + + static constexpr auto QUIC_CC_ALGO_RENO = NGTCP2_CC_ALGO_RENO; + static constexpr auto QUIC_CC_ALGO_CUBIC = NGTCP2_CC_ALGO_CUBIC; + static constexpr auto QUIC_CC_ALGO_BBR = NGTCP2_CC_ALGO_BBR; // Endpoint configuration options struct Options final : public MemoryRetainer { // The local socket address to which the UDP port will be bound. The port // may be 0 to have Node.js select an available port. IPv6 or IPv4 addresses // may be used. When using IPv6, dual mode will be supported by default. - SocketAddress local_address; + std::shared_ptr local_address; // Retry tokens issued by the Endpoint are time-limited. By default, retry // tokens expire after DEFAULT_RETRYTOKEN_EXPIRATION *seconds*. This is an @@ -127,21 +130,22 @@ class Endpoint final : public AsyncWrap, public Packet::Listener { #endif // DEBUG // There are several common congestion control algorithms that ngtcp2 uses - // to determine how it manages the flow control window: RENO, CUBIC, BBR, - // and BBR2. The details of how each works is not relevant here. The choice - // of which to use by default is arbitrary and we can choose whichever we'd + // to determine how it manages the flow control window: RENO, CUBIC, and + // BBR. The details of how each works is not relevant here. The choice of + // which to use by default is arbitrary and we can choose whichever we'd // like. Additional performance profiling will be needed to determine which // is the better of the two for our needs. ngtcp2_cc_algo cc_algorithm = NGTCP2_CC_ALGO_CUBIC; - // By default, when Node.js starts, it will generate a reset_token_secret at - // random. This is a secret used in generating stateless reset tokens. In - // order for stateless reset to be effective, however, it is necessary to - // use a deterministic secret that persists across ngtcp2 endpoints and - // sessions. + // By default, when the endpoint is created, it will generate a + // reset_token_secret at random. This is a secret used in generating + // stateless reset tokens. In order for stateless reset to be effective, + // however, it is necessary to use a deterministic secret that persists + // across ngtcp2 endpoints and sessions. This means that the endpoint + // configuration really should have a reset token secret passed in. TokenSecret reset_token_secret; - // The secret used for generating new tokens. + // The secret used for generating new regular tokens. TokenSecret token_secret; // When the local_address specifies an IPv6 local address to bind to, the @@ -169,16 +173,14 @@ class Endpoint final : public AsyncWrap, public Packet::Listener { bool HasInstance(Environment* env, v8::Local value); static v8::Local GetConstructorTemplate( Environment* env); - static void Initialize(Environment* env, v8::Local target); + static void InitPerIsolate(IsolateData* data, + v8::Local target); + static void InitPerContext(Realm* realm, v8::Local target); static void RegisterExternalReferences(ExternalReferenceRegistry* registry); - static BaseObjectPtr Create(Environment* env, - const Endpoint::Options& config); - Endpoint(Environment* env, v8::Local object, const Endpoint::Options& options); - ~Endpoint() override; inline const Options& options() const { return options_; @@ -289,6 +291,7 @@ class Endpoint final : public AsyncWrap, public Packet::Listener { bool is_bound() const; bool is_closed() const; + bool is_closed_or_closing() const; operator bool() const; void Ref(); @@ -301,11 +304,10 @@ class Endpoint final : public AsyncWrap, public Packet::Listener { private: class Impl; - static void CleanupHook(void* data); - - BaseObjectPtr impl_; + BaseObjectWeakPtr impl_; bool is_bound_ = false; bool is_started_ = false; + bool is_closed_ = false; }; bool is_closed() const; @@ -349,10 +351,9 @@ class Endpoint final : public AsyncWrap, public Packet::Listener { // JavaScript API - // Create a new Endpoint instance. `createEndpoint()` is exposed as a method - // on the internalBinding('quic') object. + // Create a new Endpoint. // @param Endpoint::Options options - Options to configure the Endpoint. - static void CreateEndpoint(const v8::FunctionCallbackInfo& args); + static void New(const v8::FunctionCallbackInfo& args); // Methods on the Endpoint instance: @@ -373,6 +374,7 @@ class Endpoint final : public AsyncWrap, public Packet::Listener { // packets. // @param bool on - If true, mark the Endpoint as busy. static void MarkBusy(const v8::FunctionCallbackInfo& args); + static void FastMarkBusy(v8::Local receiver, bool on); // DoCloseGracefully is the signal that endpoint should close. Any packets // that are already in the queue or in flight will be allowed to finish, but @@ -387,9 +389,7 @@ class Endpoint final : public AsyncWrap, public Packet::Listener { // Ref() causes a listening Endpoint to keep the event loop active. static void Ref(const v8::FunctionCallbackInfo& args); - - // Unref() allows the event loop to close even if the Endpoint is listening. - static void Unref(const v8::FunctionCallbackInfo& args); + static void FastRef(v8::Local receiver, bool on); void Receive(const uv_buf_t& buf, const SocketAddress& from); diff --git a/src/quic/preferredaddress.cc b/src/quic/preferredaddress.cc index 138dbf47c46a07..7675aebd765f9c 100644 --- a/src/quic/preferredaddress.cc +++ b/src/quic/preferredaddress.cc @@ -28,9 +28,10 @@ std::optional get_address_info( if (!paddr.ipv4_present) return std::nullopt; PreferredAddress::AddressInfo address; address.family = FAMILY; - address.port = paddr.ipv4_port; + address.port = paddr.ipv4.sin_port; if (uv_inet_ntop( - FAMILY, paddr.ipv4_addr, address.host, sizeof(address.host)) == 0) { + FAMILY, &paddr.ipv4.sin_addr, address.host, sizeof(address.host)) == + 0) { address.address = address.host; } return address; @@ -38,9 +39,11 @@ std::optional get_address_info( if (!paddr.ipv6_present) return std::nullopt; PreferredAddress::AddressInfo address; address.family = FAMILY; - address.port = paddr.ipv6_port; - if (uv_inet_ntop( - FAMILY, paddr.ipv6_addr, address.host, sizeof(address.host)) == 0) { + address.port = paddr.ipv6.sin6_port; + if (uv_inet_ntop(FAMILY, + &paddr.ipv6.sin6_addr, + address.host, + sizeof(address.host)) == 0) { address.address = address.host; } return address; @@ -50,20 +53,20 @@ std::optional get_address_info( template void copy_to_transport_params(ngtcp2_transport_params* params, const sockaddr* addr) { - params->preferred_address_present = true; + params->preferred_addr_present = true; if constexpr (FAMILY == AF_INET) { const sockaddr_in* src = reinterpret_cast(addr); - params->preferred_address.ipv4_port = SocketAddress::GetPort(addr); - memcpy(params->preferred_address.ipv4_addr, + params->preferred_addr.ipv4.sin_port = SocketAddress::GetPort(addr); + memcpy(¶ms->preferred_addr.ipv4.sin_addr, &src->sin_addr, - sizeof(params->preferred_address.ipv4_addr)); + sizeof(params->preferred_addr.ipv4.sin_addr)); } else { DCHECK_EQ(FAMILY, AF_INET6); const sockaddr_in6* src = reinterpret_cast(addr); - params->preferred_address.ipv6_port = SocketAddress::GetPort(addr); - memcpy(params->preferred_address.ipv6_addr, + params->preferred_addr.ipv6.sin6_port = SocketAddress::GetPort(addr); + memcpy(¶ms->preferred_addr.ipv6.sin6_addr, &src->sin6_addr, - sizeof(params->preferred_address.ipv4_addr)); + sizeof(params->preferred_addr.ipv4.sin_addr)); } UNREACHABLE(); } @@ -156,13 +159,17 @@ void PreferredAddress::Set(ngtcp2_transport_params* params, Maybe PreferredAddress::tryGetPolicy( Environment* env, Local value) { - if (value->IsNumber()) { + if (value->IsUndefined()) { + return Just(PreferredAddress::Policy::USE_PREFERRED_ADDRESS); + } + if (value->IsUint32()) { auto val = value.As()->Value(); if (val == static_cast(Policy::IGNORE_PREFERRED_ADDRESS)) return Just(Policy::IGNORE_PREFERRED_ADDRESS); if (val == static_cast(Policy::USE_PREFERRED_ADDRESS)) return Just(Policy::USE_PREFERRED_ADDRESS); } + THROW_ERR_INVALID_ARG_VALUE(env, "invalid preferred address policy"); return Nothing(); } diff --git a/src/quic/quic.cc b/src/quic/quic.cc new file mode 100644 index 00000000000000..17eacb9b5f4034 --- /dev/null +++ b/src/quic/quic.cc @@ -0,0 +1,50 @@ +#if HAVE_OPENSSL && NODE_OPENSSL_HAS_QUIC + +#include +#include +#include +#include +#include +#include +#include "bindingdata.h" +#include "endpoint.h" +#include "node_external_reference.h" + +namespace node { + +using v8::Context; +using v8::Local; +using v8::Object; +using v8::ObjectTemplate; +using v8::Value; + +namespace quic { + +void CreatePerIsolateProperties(IsolateData* isolate_data, + Local target) { + Endpoint::InitPerIsolate(isolate_data, target); +} + +void CreatePerContextProperties(Local target, + Local unused, + Local context, + void* priv) { + Realm* realm = Realm::GetCurrent(context); + BindingData::InitPerContext(realm, target); + Endpoint::InitPerContext(realm, target); +} + +void RegisterExternalReferences(ExternalReferenceRegistry* registry) { + BindingData::RegisterExternalReferences(registry); + Endpoint::RegisterExternalReferences(registry); +} + +} // namespace quic +} // namespace node + +NODE_BINDING_CONTEXT_AWARE_INTERNAL(quic, + node::quic::CreatePerContextProperties) +NODE_BINDING_PER_ISOLATE_INIT(quic, node::quic::CreatePerIsolateProperties) +NODE_BINDING_EXTERNAL_REFERENCE(quic, node::quic::RegisterExternalReferences) + +#endif // HAVE_OPENSSL && NODE_OPENSSL_HAS_QUIC diff --git a/src/quic/session.cc b/src/quic/session.cc index b4a3ea796f338b..271fdc89152c57 100644 --- a/src/quic/session.cc +++ b/src/quic/session.cc @@ -36,6 +36,7 @@ using v8::Array; using v8::ArrayBuffer; using v8::ArrayBufferView; using v8::BigInt; +using v8::Boolean; using v8::FunctionCallbackInfo; using v8::FunctionTemplate; using v8::HandleScope; @@ -48,6 +49,7 @@ using v8::Object; using v8::PropertyAttribute; using v8::String; using v8::Uint32; +using v8::Undefined; using v8::Value; namespace quic { @@ -211,31 +213,19 @@ void ngtcp2_debug_log(void* user_data, const char* fmt, ...) { va_end(ap); } -template -bool SetOption(Environment* env, - Opt* options, - const v8::Local& object, - const v8::Local& name) { - Local value; - if (!object->Get(env->context(), name).ToLocal(&value)) return false; - if (!value->IsUndefined()) { - DCHECK(value->IsNumber()); - options->*member = value.As()->Value(); - } - return true; -} - template bool SetOption(Environment* env, Opt* options, const v8::Local& object, const v8::Local& name) { Local value; - if (!object->Get(env->context(), name).ToLocal(&value)) return false; - // If the policy specified is invalid, we will just ignore it. - auto maybePolicy = PreferredAddress::tryGetPolicy(env, value); - if (!maybePolicy.IsJust()) return false; - options->*member = maybePolicy.FromJust(); + PreferredAddress::Policy policy = + PreferredAddress::Policy::USE_PREFERRED_ADDRESS; + if (!object->Get(env->context(), name).ToLocal(&value) || + !PreferredAddress::tryGetPolicy(env, value).To(&policy)) { + return false; + } + options->*member = policy; return true; } @@ -245,10 +235,12 @@ bool SetOption(Environment* env, const v8::Local& object, const v8::Local& name) { Local value; - if (!object->Get(env->context(), name).ToLocal(&value)) return false; - auto maybeOptions = TLSContext::Options::From(env, value); - if (!maybeOptions.IsJust()) return false; - options->*member = maybeOptions.FromJust(); + TLSContext::Options opts; + if (!object->Get(env->context(), name).ToLocal(&value) || + !TLSContext::Options::From(env, value).To(&opts)) { + return false; + } + options->*member = opts; return true; } @@ -258,10 +250,12 @@ bool SetOption(Environment* env, const v8::Local& object, const v8::Local& name) { Local value; - if (!object->Get(env->context(), name).ToLocal(&value)) return false; - auto maybeOptions = Session::Application_Options::From(env, value); - if (!maybeOptions.IsJust()) return false; - options->*member = maybeOptions.FromJust(); + Session::Application_Options opts; + if (!object->Get(env->context(), name).ToLocal(&value) || + !Session::Application_Options::From(env, value).To(&opts)) { + return false; + } + options->*member = opts; return true; } @@ -271,10 +265,12 @@ bool SetOption(Environment* env, const v8::Local& object, const v8::Local& name) { Local value; - if (!object->Get(env->context(), name).ToLocal(&value)) return false; - auto maybeOptions = TransportParams::Options::From(env, value); - if (!maybeOptions.IsJust()) return false; - options->*member = maybeOptions.FromJust(); + TransportParams::Options opts; + if (!object->Get(env->context(), name).ToLocal(&value) || + !TransportParams::Options::From(env, value).To(&opts)) { + return false; + } + options->*member = opts; return true; } @@ -305,8 +301,7 @@ Session::Config::Config(Side side, settings.initial_ts = uv_hrtime(); if (options.qlog) { - if (ocid) settings.qlog.odcid = ocid; - settings.qlog.write = on_qlog_write; + settings.qlog_write = on_qlog_write; } if (endpoint.env()->enabled_debug_list()->enabled( @@ -317,7 +312,7 @@ Session::Config::Config(Side side, // We pull parts of the settings for the session from the endpoint options. auto& config = endpoint.options(); settings.cc_algo = config.cc_algorithm; - settings.max_udp_payload_size = config.max_payload_size; + settings.max_tx_udp_payload_size = config.max_payload_size; if (config.unacknowledged_packet_threshold > 0) { settings.ack_thresh = config.unacknowledged_packet_threshold; } @@ -578,14 +573,12 @@ BaseObjectPtr Session::keylog() const { TransportParams Session::GetLocalTransportParams() const { DCHECK(!is_destroyed()); - return TransportParams(TransportParams::Type::ENCRYPTED_EXTENSIONS, - ngtcp2_conn_get_local_transport_params(*this)); + return TransportParams(ngtcp2_conn_get_local_transport_params(*this)); } TransportParams Session::GetRemoteTransportParams() const { DCHECK(!is_destroyed()); - return TransportParams(TransportParams::Type::ENCRYPTED_EXTENSIONS, - ngtcp2_conn_get_remote_transport_params(*this)); + return TransportParams(ngtcp2_conn_get_remote_transport_params(*this)); } void Session::SetLastError(QuicError&& error) { @@ -635,9 +628,11 @@ void Session::Destroy() { // be deconstructed once the stack unwinds and any remaining // BaseObjectPtr instances fall out of scope. - std::vector cids(ngtcp2_conn_get_num_scid(*this)); - std::vector tokens(ngtcp2_conn_get_num_active_dcid(*this)); + std::vector cids(ngtcp2_conn_get_scid(*this, nullptr)); ngtcp2_conn_get_scid(*this, cids.data()); + + std::vector tokens( + ngtcp2_conn_get_active_dcid(*this, nullptr)); ngtcp2_conn_get_active_dcid(*this, tokens.data()); endpoint_->DisassociateCID(config_.dcid); @@ -770,7 +765,7 @@ uint64_t Session::SendDatagram(Store&& data) { packet = Packet::Create(env(), endpoint_.get(), remote_address_, - ngtcp2_conn_get_max_udp_payload_size(*this), + ngtcp2_conn_get_max_tx_udp_payload_size(*this), "datagram"); if (!packet) { last_error_ = QuicError::ForNgtcp2Error(NGTCP2_ERR_INTERNAL); @@ -967,6 +962,7 @@ void Session::ResumeStream(int64_t id) { void Session::ShutdownStream(int64_t id, QuicError error) { SendPendingDataScope send_scope(this); ngtcp2_conn_shutdown_stream(*this, + 0, id, error.type() == QuicError::Type::APPLICATION ? error.code() @@ -981,6 +977,7 @@ void Session::StreamDataBlocked(int64_t id) { void Session::ShutdownStreamWrite(int64_t id, QuicError code) { SendPendingDataScope send_scope(this); ngtcp2_conn_shutdown_stream_write(*this, + 0, id, code.type() == QuicError::Type::APPLICATION ? code.code() @@ -1013,11 +1010,11 @@ void Session::MemoryInfo(MemoryTracker* tracker) const { } bool Session::is_in_closing_period() const { - return ngtcp2_conn_is_in_closing_period(*this); + return ngtcp2_conn_in_closing_period(*this) != 0; } bool Session::is_in_draining_period() const { - return ngtcp2_conn_is_in_draining_period(*this); + return ngtcp2_conn_in_draining_period(*this) != 0; } bool Session::wants_session_ticket() const { @@ -1047,7 +1044,7 @@ uint64_t Session::max_data_left() const { } uint64_t Session::max_local_streams_uni() const { - return ngtcp2_conn_get_max_local_streams_uni(*this); + return ngtcp2_conn_get_streams_uni_left(*this); } uint64_t Session::max_local_streams_bidi() const { @@ -1100,30 +1097,35 @@ void Session::ExtendOffset(size_t amount) { void Session::UpdateDataStats() { if (state_->destroyed) return; - ngtcp2_conn_stat stat; - ngtcp2_conn_get_conn_stat(*this, &stat); - STAT_SET(Stats, bytes_in_flight, stat.bytes_in_flight); - STAT_SET( - Stats, congestion_recovery_start_ts, stat.congestion_recovery_start_ts); - STAT_SET(Stats, cwnd, stat.cwnd); - STAT_SET(Stats, delivery_rate_sec, stat.delivery_rate_sec); - STAT_SET(Stats, first_rtt_sample_ts, stat.first_rtt_sample_ts); - STAT_SET(Stats, initial_rtt, stat.initial_rtt); - STAT_SET( - Stats, last_tx_pkt_ts, reinterpret_cast(stat.last_tx_pkt_ts)); - STAT_SET(Stats, latest_rtt, stat.latest_rtt); - STAT_SET(Stats, loss_detection_timer, stat.loss_detection_timer); - STAT_SET(Stats, loss_time, reinterpret_cast(stat.loss_time)); - STAT_SET(Stats, max_udp_payload_size, stat.max_udp_payload_size); - STAT_SET(Stats, min_rtt, stat.min_rtt); - STAT_SET(Stats, pto_count, stat.pto_count); - STAT_SET(Stats, rttvar, stat.rttvar); - STAT_SET(Stats, smoothed_rtt, stat.smoothed_rtt); - STAT_SET(Stats, ssthresh, stat.ssthresh); + ngtcp2_conn_info info; + ngtcp2_conn_get_conn_info(*this, &info); + STAT_SET(Stats, bytes_in_flight, info.bytes_in_flight); + STAT_SET(Stats, cwnd, info.cwnd); + STAT_SET(Stats, latest_rtt, info.latest_rtt); + STAT_SET(Stats, min_rtt, info.min_rtt); + STAT_SET(Stats, rttvar, info.rttvar); + STAT_SET(Stats, smoothed_rtt, info.smoothed_rtt); + STAT_SET(Stats, ssthresh, info.ssthresh); STAT_SET( Stats, max_bytes_in_flight, - std::max(STAT_GET(Stats, max_bytes_in_flight), stat.bytes_in_flight)); + std::max(STAT_GET(Stats, max_bytes_in_flight), info.bytes_in_flight)); + + // TODO(@jasnell): Want to see if ngtcp2 provides an alternative way of + // getting these before removing them. Will handle that in one of the + // follow-up PRs STAT_SET( + // Stats, congestion_recovery_start_ts, + // info.congestion_recovery_start_ts); + // STAT_SET(Stats, delivery_rate_sec, info.delivery_rate_sec); + // STAT_SET(Stats, first_rtt_sample_ts, stat.first_rtt_sample_ts); + // STAT_SET(Stats, initial_rtt, info.initial_rtt); + // STAT_SET( + // Stats, last_tx_pkt_ts, + // reinterpret_cast(stat.last_tx_pkt_ts)); + // STAT_SET(Stats, loss_detection_timer, info.loss_detection_timer); + // STAT_SET(Stats, loss_time, reinterpret_cast(stat.loss_time)); + // STAT_SET(Stats, max_udp_payload_size, stat.max_udp_payload_size); + // STAT_SET(Stats, pto_count, stat.pto_count); } void Session::SendConnectionClose() { @@ -1260,7 +1262,7 @@ bool Session::HandshakeCompleted() { STAT_RECORD_TIMESTAMP(Stats, handshake_completed_at); if (!tls_context_.early_data_was_accepted()) - ngtcp2_conn_early_data_rejected(*this); + ngtcp2_conn_tls_early_data_rejected(*this); // When in a server session, handshake completed == handshake confirmed. if (is_server()) { @@ -1435,8 +1437,8 @@ void Session::EmitHandshakeComplete() { void Session::EmitPathValidation(PathValidationResult result, PathValidationFlags flags, - const SocketAddress& local_address, - const SocketAddress& remote_address) { + const ValidatedPath& newPath, + const std::optional& oldPath) { DCHECK(!is_destroyed()); if (!env()->can_call_into_js()) return; if (LIKELY(state_->path_validation == 0)) return; @@ -1457,15 +1459,18 @@ void Session::EmitPathValidation(PathValidationResult result, UNREACHABLE(); }; - Local argv[4] = { + Local argv[] = { resultToString(), - SocketAddressBase::Create(env(), - std::make_shared(local_address)) - ->object(), - SocketAddressBase::Create(env(), - std::make_shared(remote_address)) - ->object(), - v8::Boolean::New(isolate, flags.preferredAddress)}; + SocketAddressBase::Create(env(), newPath.local)->object(), + SocketAddressBase::Create(env(), newPath.remote)->object(), + Undefined(isolate), + Undefined(isolate), + Boolean::New(isolate, flags.preferredAddress)}; + + if (oldPath.has_value()) { + argv[3] = SocketAddressBase::Create(env(), oldPath->local)->object(); + argv[4] = SocketAddressBase::Create(env(), oldPath->remote)->object(); + } MakeCallback(state.session_path_validation_callback(), arraysize(argv), argv); } @@ -1670,7 +1675,7 @@ struct Session::Impl { } static int on_cid_status(ngtcp2_conn* conn, - int type, + ngtcp2_connection_id_status_type type, uint64_t seq, const ngtcp2_cid* cid, const uint8_t* token, @@ -1787,26 +1792,37 @@ struct Session::Impl { static int on_path_validation(ngtcp2_conn* conn, uint32_t flags, const ngtcp2_path* path, + const ngtcp2_path* old_path, ngtcp2_path_validation_result res, void* user_data) { NGTCP2_CALLBACK_SCOPE(session) bool flag_preferred_address = flags & NGTCP2_PATH_VALIDATION_FLAG_PREFERRED_ADDR; + ValidatedPath newValidatedPath{ + std::make_shared(path->local.addr), + std::make_shared(path->remote.addr)}; + std::optional oldValidatedPath = std::nullopt; + if (old_path != nullptr) { + oldValidatedPath = + ValidatedPath{std::make_shared(old_path->local.addr), + std::make_shared(old_path->remote.addr)}; + } session->EmitPathValidation(static_cast(res), PathValidationFlags{flag_preferred_address}, - SocketAddress(path->local.addr), - SocketAddress(path->remote.addr)); + newValidatedPath, + oldValidatedPath); return NGTCP2_SUCCESS; } static int on_receive_crypto_data(ngtcp2_conn* conn, - ngtcp2_crypto_level crypto_level, + ngtcp2_encryption_level level, uint64_t offset, const uint8_t* data, size_t datalen, void* user_data) { NGTCP2_CALLBACK_SCOPE(session) - return session->tls_context().Receive(crypto_level, offset, data, datalen); + return session->tls_context().Receive( + static_cast(level), offset, data, datalen); } static int on_receive_datagram(ngtcp2_conn* conn, @@ -1816,13 +1832,14 @@ struct Session::Impl { void* user_data) { NGTCP2_CALLBACK_SCOPE(session) DatagramReceivedFlags f; - f.early = flags & NGTCP2_DATAGRAM_FLAG_EARLY; + f.early = flags & NGTCP2_DATAGRAM_FLAG_0RTT; session->DatagramReceived(data, datalen, f); return NGTCP2_SUCCESS; } static int on_receive_new_token(ngtcp2_conn* conn, - const ngtcp2_vec* token, + const uint8_t* token, + size_t tokenlen, void* user_data) { NGTCP2_CALLBACK_SCOPE(session) // We currently do nothing with this callback. @@ -1830,11 +1847,12 @@ struct Session::Impl { } static int on_receive_rx_key(ngtcp2_conn* conn, - ngtcp2_crypto_level level, + ngtcp2_encryption_level level, void* user_data) { NGTCP2_CALLBACK_SCOPE(session) - if (!session->is_server() && level == NGTCP2_CRYPTO_LEVEL_APPLICATION) { + if (!session->is_server() && (level == NGTCP2_ENCRYPTION_LEVEL_0RTT || + level == NGTCP2_ENCRYPTION_LEVEL_1RTT)) { if (!session->application().Start()) return NGTCP2_ERR_CALLBACK_FAILURE; } return NGTCP2_SUCCESS; @@ -1858,7 +1876,7 @@ struct Session::Impl { void* stream_user_data) { NGTCP2_CALLBACK_SCOPE(session) Stream::ReceiveDataFlags f; - f.early = flags & NGTCP2_STREAM_DATA_FLAG_EARLY; + f.early = flags & NGTCP2_STREAM_DATA_FLAG_0RTT; f.fin = flags & NGTCP2_STREAM_DATA_FLAG_FIN; if (stream_user_data == nullptr) { @@ -1870,7 +1888,7 @@ struct Session::Impl { stream.get(), data, datalen, f); } else { return ngtcp2_conn_shutdown_stream( - *session, stream_id, NGTCP2_APP_NOERROR) == 0 + *session, 0, stream_id, NGTCP2_APP_NOERROR) == 0 ? NGTCP2_SUCCESS : NGTCP2_ERR_CALLBACK_FAILURE; } @@ -1882,10 +1900,11 @@ struct Session::Impl { } static int on_receive_tx_key(ngtcp2_conn* conn, - ngtcp2_crypto_level level, + ngtcp2_encryption_level level, void* user_data) { NGTCP2_CALLBACK_SCOPE(session) - if (session->is_server() && level == NGTCP2_CRYPTO_LEVEL_APPLICATION) { + if (session->is_server() && (level == NGTCP2_ENCRYPTION_LEVEL_0RTT || + level == NGTCP2_ENCRYPTION_LEVEL_1RTT)) { if (!session->application().Start()) return NGTCP2_ERR_CALLBACK_FAILURE; } return NGTCP2_SUCCESS; @@ -1976,6 +1995,12 @@ struct Session::Impl { CHECK(crypto::CSPRNG(dest, destlen).is_ok()); } + static int on_early_data_rejected(ngtcp2_conn* conn, void* user_data) { + // TODO(@jasnell): Called when early data was rejected by server during the + // TLS handshake or client decided not to attempt early data. + return NGTCP2_SUCCESS; + } + static constexpr ngtcp2_callbacks CLIENT = { ngtcp2_crypto_client_initial_cb, nullptr, @@ -2015,7 +2040,8 @@ struct Session::Impl { on_stream_stop_sending, ngtcp2_crypto_version_negotiation_cb, on_receive_rx_key, - on_receive_tx_key}; + on_receive_tx_key, + on_early_data_rejected}; static constexpr ngtcp2_callbacks SERVER = { nullptr, @@ -2056,7 +2082,8 @@ struct Session::Impl { on_stream_stop_sending, ngtcp2_crypto_version_negotiation_cb, on_receive_rx_key, - on_receive_tx_key}; + on_receive_tx_key, + on_early_data_rejected}; }; #undef NGTCP2_CALLBACK_SCOPE diff --git a/src/quic/session.h b/src/quic/session.h index 21af8d801d550e..a844e2a3c2709f 100644 --- a/src/quic/session.h +++ b/src/quic/session.h @@ -349,10 +349,16 @@ class Session final : public AsyncWrap, private SessionTicket::AppData::Source { void EmitDatagramStatus(uint64_t id, DatagramStatus status); void EmitHandshakeComplete(); void EmitKeylog(const char* line); + + struct ValidatedPath { + std::shared_ptr local; + std::shared_ptr remote; + }; + void EmitPathValidation(PathValidationResult result, PathValidationFlags flags, - const SocketAddress& local_address, - const SocketAddress& remote_address); + const ValidatedPath& newPath, + const std::optional& oldPath); void EmitSessionTicket(Store&& ticket); void EmitStream(BaseObjectPtr stream); void EmitVersionNegotiation(const ngtcp2_pkt_hd& hd, diff --git a/src/quic/streams.cc b/src/quic/streams.cc index ae208e0eb0007a..f20a160717e803 100644 --- a/src/quic/streams.cc +++ b/src/quic/streams.cc @@ -1,19 +1,680 @@ #if HAVE_OPENSSL && NODE_OPENSSL_HAS_QUIC #include "streams.h" +#include #include #include #include #include +#include #include #include +#include "application.h" +#include "bindingdata.h" +#include "defs.h" #include "session.h" namespace node { + +using v8::Array; +using v8::ArrayBuffer; +using v8::ArrayBufferView; +using v8::BigInt; +using v8::FunctionCallbackInfo; +using v8::FunctionTemplate; +using v8::Integer; +using v8::Just; +using v8::Local; +using v8::Maybe; +using v8::Nothing; +using v8::Object; +using v8::PropertyAttribute; +using v8::SharedArrayBuffer; +using v8::Uint32; +using v8::Value; + namespace quic { -Stream::Stream(BaseObjectPtr session, v8::Local obj) - : AsyncWrap(session->env(), obj, AsyncWrap::PROVIDER_QUIC_STREAM) { - MakeWeak(); +#define STREAM_STATE(V) \ + V(ID, id, int64_t) \ + V(FIN_SENT, fin_sent, uint8_t) \ + V(FIN_RECEIVED, fin_received, uint8_t) \ + V(READ_ENDED, read_ended, uint8_t) \ + V(WRITE_ENDED, write_ended, uint8_t) \ + V(DESTROYED, destroyed, uint8_t) \ + V(PAUSED, paused, uint8_t) \ + V(RESET, reset, uint8_t) \ + V(HAS_READER, has_reader, uint8_t) \ + /* Set when the stream has a block event handler */ \ + V(WANTS_BLOCK, wants_block, uint8_t) \ + /* Set when the stream has a headers event handler */ \ + V(WANTS_HEADERS, wants_headers, uint8_t) \ + /* Set when the stream has a reset event handler */ \ + V(WANTS_RESET, wants_reset, uint8_t) \ + /* Set when the stream has a trailers event handler */ \ + V(WANTS_TRAILERS, wants_trailers, uint8_t) + +#define STREAM_STATS(V) \ + V(CREATED_AT, created_at) \ + V(RECEIVED_AT, received_at) \ + V(ACKED_AT, acked_at) \ + V(CLOSING_AT, closing_at) \ + V(DESTROYED_AT, destroyed_at) \ + V(BYTES_RECEIVED, bytes_received) \ + V(BYTES_SENT, bytes_sent) \ + V(MAX_OFFSET, max_offset) \ + V(MAX_OFFSET_ACK, max_offset_ack) \ + V(MAX_OFFSET_RECV, max_offset_received) \ + V(FINAL_SIZE, final_size) + +#define STREAM_JS_METHODS(V) \ + V(AttachSource, attachSource, false) \ + V(Destroy, destroy, false) \ + V(SendHeaders, sendHeaders, false) \ + V(StopSending, stopSending, false) \ + V(ResetStream, resetStream, false) \ + V(SetPriority, setPriority, false) \ + V(GetPriority, getPriority, true) \ + V(GetReader, getReader, false) + +struct Stream::State { +#define V(_, name, type) type name; + STREAM_STATE(V) +#undef V +}; + +STAT_STRUCT(Stream, STREAM) + +// ============================================================================ + +namespace { +Maybe> GetDataQueueFromSource(Environment* env, + Local value) { + DCHECK_IMPLIES(!value->IsUndefined(), value->IsObject()); + if (value->IsUndefined()) { + return Just(std::shared_ptr()); + } else if (value->IsArrayBuffer()) { + auto buffer = value.As(); + std::vector> entries(1); + entries.push_back(DataQueue::CreateInMemoryEntryFromBackingStore( + buffer->GetBackingStore(), 0, buffer->ByteLength())); + return Just(DataQueue::CreateIdempotent(std::move(entries))); + } else if (value->IsSharedArrayBuffer()) { + auto buffer = value.As(); + std::vector> entries(1); + entries.push_back(DataQueue::CreateInMemoryEntryFromBackingStore( + buffer->GetBackingStore(), 0, buffer->ByteLength())); + return Just(DataQueue::CreateIdempotent(std::move(entries))); + } else if (value->IsArrayBufferView()) { + std::vector> entries(1); + entries.push_back( + DataQueue::CreateInMemoryEntryFromView(value.As())); + return Just(DataQueue::CreateIdempotent(std::move(entries))); + } else if (Blob::HasInstance(env, value)) { + Blob* blob; + ASSIGN_OR_RETURN_UNWRAP( + &blob, value, Nothing>()); + return Just(blob->getDataQueue().slice(0)); + } + // TODO(jasnell): Add streaming sources... + THROW_ERR_INVALID_ARG_TYPE(env, "Invalid data source type"); + return Nothing>(); +} +} // namespace + +struct Stream::Impl { + static void AttachSource(const FunctionCallbackInfo& args) { + Environment* env = Environment::GetCurrent(args); + + std::shared_ptr dataqueue; + if (GetDataQueueFromSource(env, args[0]).To(&dataqueue)) { + Stream* stream; + ASSIGN_OR_RETURN_UNWRAP(&stream, args.Holder()); + stream->set_outbound(std::move(dataqueue)); + } + } + + static void Destroy(const FunctionCallbackInfo& args) { + Stream* stream; + ASSIGN_OR_RETURN_UNWRAP(&stream, args.Holder()); + if (args.Length() > 1) { + CHECK(args[0]->IsBigInt()); + bool unused = false; + stream->Destroy(QuicError::ForApplication( + args[0].As()->Uint64Value(&unused))); + } else { + stream->Destroy(); + } + } + + static void SendHeaders(const FunctionCallbackInfo& args) { + Stream* stream; + ASSIGN_OR_RETURN_UNWRAP(&stream, args.Holder()); + CHECK(args[0]->IsUint32()); // Kind + CHECK(args[1]->IsArray()); // Headers + CHECK(args[2]->IsUint32()); // Flags + + HeadersKind kind = static_cast(args[0].As()->Value()); + Local headers = args[1].As(); + HeadersFlags flags = + static_cast(args[2].As()->Value()); + + if (stream->is_destroyed()) return args.GetReturnValue().Set(false); + + args.GetReturnValue().Set(stream->session().application().SendHeaders( + *stream, kind, headers, flags)); + } + + // Tells the peer to stop sending data for this stream. This has the effect + // of shutting down the readable side of the stream for this peer. Any data + // that has already been received is still readable. + static void StopSending(const FunctionCallbackInfo& args) { + Stream* stream; + ASSIGN_OR_RETURN_UNWRAP(&stream, args.Holder()); + uint64_t code = NGTCP2_APP_NOERROR; + CHECK_IMPLIES(!args[0]->IsUndefined(), args[0]->IsBigInt()); + if (!args[0]->IsUndefined()) { + bool lossless = false; // not used but still necessary. + code = args[0].As()->Uint64Value(&lossless); + } + + if (stream->is_destroyed()) return; + stream->EndReadable(); + Session::SendPendingDataScope send_scope(&stream->session()); + ngtcp2_conn_shutdown_stream_read(stream->session(), 0, stream->id(), code); + } + + // Sends a reset stream to the peer to tell it we will not be sending any + // more data for this stream. This has the effect of shutting down the + // writable side of the stream for this peer. Any data that is held in the + // outbound queue will be dropped. The stream may still be readable. + static void ResetStream(const FunctionCallbackInfo& args) { + Stream* stream; + ASSIGN_OR_RETURN_UNWRAP(&stream, args.Holder()); + uint64_t code = NGTCP2_APP_NOERROR; + CHECK_IMPLIES(!args[0]->IsUndefined(), args[0]->IsBigInt()); + if (!args[0]->IsUndefined()) { + bool lossless = false; // not used but still necessary. + code = args[0].As()->Uint64Value(&lossless); + } + + if (stream->is_destroyed() || stream->state_->reset == 1) return; + stream->EndWritable(); + // We can release our outbound here now. Since the stream is being reset + // on the ngtcp2 side, we do not need to keep any of the data around + // waiting for acknowledgement that will never come. + stream->outbound_.reset(); + stream->state_->reset = 1; + Session::SendPendingDataScope send_scope(&stream->session()); + ngtcp2_conn_shutdown_stream_write(stream->session(), 0, stream->id(), code); + } + + static void SetPriority(const FunctionCallbackInfo& args) { + Stream* stream; + ASSIGN_OR_RETURN_UNWRAP(&stream, args.Holder()); + CHECK(args[0]->IsUint32()); // Priority + CHECK(args[1]->IsUint32()); // Priority flag + + StreamPriority priority = + static_cast(args[0].As()->Value()); + StreamPriorityFlags flags = + static_cast(args[1].As()->Value()); + + stream->session().application().SetStreamPriority(*stream, priority, flags); + } + + static void GetPriority(const FunctionCallbackInfo& args) { + Stream* stream; + ASSIGN_OR_RETURN_UNWRAP(&stream, args.Holder()); + auto priority = stream->session().application().GetStreamPriority(*stream); + args.GetReturnValue().Set(static_cast(priority)); + } + + static void GetReader(const FunctionCallbackInfo& args) { + Stream* stream; + ASSIGN_OR_RETURN_UNWRAP(&stream, args.Holder()); + BaseObjectPtr reader = stream->get_reader(); + if (reader) return args.GetReturnValue().Set(reader->object()); + THROW_ERR_INVALID_STATE(Environment::GetCurrent(args), + "Unable to get a reader for the stream"); + } +}; + +// ============================================================================ + +class Stream::Outbound final : public MemoryRetainer { + public: + Outbound(Stream* stream, std::shared_ptr queue) + : stream_(stream), + queue_(std::move(queue)), + reader_(queue_->get_reader()) {} + + void Acknowledge(size_t amount) { + size_t remaining = std::min(amount, total_ - uncommitted_); + while (remaining > 0 && head_ != nullptr) { + DCHECK_LE(head_->ack_offset, head_->offset); + // The amount to acknowledge in this chunk is the lesser of the total + // amount remaining to acknowledge or the total remaining unacknowledged + // bytes in the chunk. + size_t amount_to_ack = + std::min(remaining, head_->offset - head_->ack_offset); + // If the amount to ack is zero here, it means our ack offset has caught + // up to our commit offset, which means there's nothing left to + // acknowledge yet. We could treat this as an error but let's just stop + // here. + if (amount_to_ack == 0) break; + + // Adjust our remaining down and our ack_offset up... + remaining -= amount_to_ack; + head_->ack_offset += amount_to_ack; + + // If we've fully acknowledged this chunk, free it and decrement total. + if (head_->ack_offset == head_->buf.len) { + DCHECK_GE(total_, head_->buf.len); + total_ -= head_->buf.len; + // if tail_ == head_ here, it means we've fully acknowledged our current + // buffer. Set tail to nullptr since we're freeing it here. + if (head_.get() == tail_) { + // In this case, commit_head_ should have already been set to nullptr. + // Because we should only have hit this case if the entire buffer + // had been committed. + DCHECK(commit_head_ == nullptr); + tail_ = nullptr; + } + head_ = std::move(head_->next); + DCHECK_IMPLIES(head_ == nullptr, tail_ == nullptr); + } + } + } + + void Commit(size_t amount) { + // Commit amount number of bytes from the current uncommitted + // byte queue. Importantly, this does not remove the bytes + // from the byte queue. + size_t remaining = std::min(uncommitted_, amount); + // There's nothing to commit. + while (remaining > 0 && commit_head_ != nullptr) { + // The amount to commit is the lesser of the total amount remaining to + // commit and the remaining uncommitted bytes in this chunk. + size_t amount_to_commit = std::min( + remaining, + static_cast(commit_head_->buf.len - commit_head_->offset)); + + // The amount to commit here should never be zero because that means we + // should have already advanced the commit head. + DCHECK_NE(amount_to_commit, 0); + uncommitted_ -= amount_to_commit; + remaining -= amount_to_commit; + commit_head_->offset += amount_to_commit; + if (commit_head_->offset == commit_head_->buf.len) { + count_--; + commit_head_ = commit_head_->next.get(); + } + } + } + + void Cap() { + // Calling cap without a value halts the ability to add any + // new data to the queue if it is not idempotent. If it is + // idempotent, it's a non-op. + queue_->cap(); + } + + int Pull(bob::Next next, + int options, + ngtcp2_vec* data, + size_t count, + size_t max_count_hint) { + if (next_pending_) { + std::move(next)(bob::Status::STATUS_BLOCK, nullptr, 0, [](int) {}); + return bob::Status::STATUS_BLOCK; + } + + if (errored_) { + std::move(next)(UV_EBADF, nullptr, 0, [](int) {}); + return UV_EBADF; + } + + // If eos_ is true and there are no uncommitted bytes we'll return eos, + // otherwise, return whatever is in the uncommitted queue. + if (eos_) { + if (uncommitted_ > 0) { + PullUncommitted(std::move(next)); + return bob::Status::STATUS_CONTINUE; + } + std::move(next)(bob::Status::STATUS_EOS, nullptr, 0, [](int) {}); + return bob::Status::STATUS_EOS; + } + + // If there are uncommitted bytes in the queue_, and there are enough to + // fill a full data packet, then pull will just return the current + // uncommitted bytes currently in the queue rather than reading more from + // the queue. + if (uncommitted_ >= kDefaultMaxPacketLength) { + PullUncommitted(std::move(next)); + return bob::Status::STATUS_CONTINUE; + } + + DCHECK(queue_); + DCHECK(reader_); + + // At this point, we know our reader hasn't finished yet, there might be + // uncommitted bytes but we want to go ahead and pull some more. We request + // that the pull is sync but allow for it to be async. + int ret = reader_->Pull( + [this](auto status, auto vecs, auto count, auto done) { + // Always make sure next_pending_ is false when we're done. + auto on_exit = OnScopeLeave([this] { next_pending_ = false; }); + + // The status should never be wait here. + DCHECK_NE(status, bob::Status::STATUS_WAIT); + + if (status < 0) { + // If next_pending_ is true then a pull from the reader ended up + // being asynchronous, our stream is blocking waiting for the data, + // but we have an error! oh no! We need to error the stream. + if (next_pending_) { + stream_->Destroy( + QuicError::ForNgtcp2Error(NGTCP2_INTERNAL_ERROR)); + // We do not need to worry about calling MarkErrored in this case + // since we are immediately destroying the stream which will + // release the outbound buffer anyway. + } + return; + } + + if (status == bob::Status::STATUS_EOS) { + DCHECK_EQ(count, 0); + DCHECK_NULL(vecs); + MarkEnded(); + // If next_pending_ is true then a pull from the reader ended up + // being asynchronous, our stream is blocking waiting for the data. + // Here, there is no more data to read, but we will might have data + // in the uncommitted queue. We'll resume the stream so that the + // session will try to read from it again. + if (next_pending_ && !stream_->is_destroyed()) { + stream_->session().ResumeStream(stream_->id()); + } + return; + } + + if (status == bob::Status::STATUS_BLOCK) { + DCHECK_EQ(count, 0); + DCHECK_NULL(vecs); + // If next_pending_ is true then a pull from the reader ended up + // being asynchronous, our stream is blocking waiting for the data. + // Here, we're still blocking! so there's nothing left for us to do! + return; + } + + DCHECK_EQ(status, bob::Status::STATUS_CONTINUE); + // If the read returns bytes, those will be added to the uncommitted + // bytes in the queue. + Append(vecs, count, std::move(done)); + + // If next_pending_ is true, then a pull from the reader ended up + // being asynchronous, our stream is blocking waiting for the data. + // Now that we have data, let's resume the stream so the session will + // pull from it again. + if (next_pending_ && !stream_->is_destroyed()) { + stream_->session().ResumeStream(stream_->id()); + } + }, + bob::OPTIONS_SYNC, + nullptr, + 0, + kMaxVectorCount); + + // There was an error. We'll report that immediately. We do not have + // to destroy the stream here since that will be taken care of by + // the caller. + if (ret < 0) { + MarkErrored(); + std::move(next)(ret, nullptr, 0, [](int) {}); + // Since we are erroring and won't be able to make use of this DataQueue + // any longer, let's free both it and the reader and put ourselves into + // an errored state. Further attempts to read from the outbound will + // result in a UV_EBADF error. The caller, however, should handle this by + // closing down the stream so that doesn't happen. + return ret; + } + + if (ret == bob::Status::STATUS_EOS) { + // Here, we know we are done with the DataQueue and the Reader, but we + // might not yet have committed or acknowledged all of the queued data. + // We'll release our references to the queue_ and reader_ but everything + // else is untouched. + MarkEnded(); + if (uncommitted_ > 0) { + // If the read returns eos, and there are uncommitted bytes in the + // queue, we'll set eos_ to true and return the current set of + // uncommitted bytes. + PullUncommitted(std::move(next)); + return bob::STATUS_CONTINUE; + } + // If the read returns eos, and there are no uncommitted bytes in the + // queue, we'll return eos with no data. + std::move(next)(bob::Status::STATUS_EOS, nullptr, 0, [](int) {}); + return bob::Status::STATUS_EOS; + } + + if (ret == bob::Status::STATUS_BLOCK) { + // If the read returns blocked, and there are uncommitted bytes in the + // queue, we'll return the current set of uncommitted bytes. + if (uncommitted_ > 0) { + PullUncommitted(std::move(next)); + return bob::Status::STATUS_CONTINUE; + } + // If the read returns blocked, and there are no uncommitted bytes in the + // queue, we'll return blocked. + std::move(next)(bob::Status::STATUS_BLOCK, nullptr, 0, [](int) {}); + return bob::Status::STATUS_BLOCK; + } + + // Reads here are generally expected to be synchronous. If we have a reader + // that insists on providing data asynchronously, then we'll have to block + // until the data is actually available. + if (ret == bob::Status::STATUS_WAIT) { + next_pending_ = true; + std::move(next)(bob::Status::STATUS_BLOCK, nullptr, 0, [](int) {}); + return bob::Status::STATUS_BLOCK; + } + + DCHECK_EQ(ret, bob::Status::STATUS_CONTINUE); + PullUncommitted(std::move(next)); + return bob::Status::STATUS_CONTINUE; + } + + void MemoryInfo(MemoryTracker* tracker) const override { + tracker->TrackField("queue", queue_); + tracker->TrackField("reader", reader_); + tracker->TrackFieldWithSize("buffer", total_); + } + + SET_MEMORY_INFO_NAME(Stream::Outbound) + SET_SELF_SIZE(Outbound) + + private: + struct OnComplete { + bob::Done done; + explicit OnComplete(bob::Done done) : done(std::move(done)) {} + ~OnComplete() { std::move(done)(0); } + }; + + void PullUncommitted(bob::Next next) { + MaybeStackBuffer chunks; + chunks.AllocateSufficientStorage(count_); + auto head = commit_head_; + size_t n = 0; + while (head != nullptr && n < count_) { + // There might only be one byte here but there should never be zero. + DCHECK_LT(head->offset, head->buf.len); + chunks[n].base = head->buf.base + head->offset; + chunks[n].len = head->buf.len - head->offset; + head = head->next.get(); + n++; + } + std::move(next)(bob::Status::STATUS_CONTINUE, chunks.out(), n, [](int) {}); + } + + void MarkErrored() { + errored_ = true; + head_.reset(); + tail_ = nullptr; + commit_head_ = nullptr; + total_ = 0; + count_ = 0; + uncommitted_ = 0; + MarkEnded(); + } + + void MarkEnded() { + eos_ = true; + queue_.reset(); + reader_.reset(); + } + + void Append(const DataQueue::Vec* vectors, size_t count, bob::Done done) { + if (count == 0) return; + // The done callback should only be invoked after we're done with + // all of the vectors passed in this call. To ensure of that, we + // wrap it with a shared pointer that calls done when the final + // instance is dropped. + auto on_complete = std::make_shared(std::move(done)); + for (size_t n = 0; n < count; n++) { + if (vectors[n].len == 0 || vectors[n].base == nullptr) continue; + auto entry = std::make_unique(vectors[n], on_complete); + if (tail_ == nullptr) { + head_ = std::move(entry); + tail_ = head_.get(); + commit_head_ = head_.get(); + } else { + DCHECK_NULL(tail_->next); + tail_->next = std::move(entry); + tail_ = tail_->next.get(); + if (commit_head_ == nullptr) commit_head_ = tail_; + } + count_++; + total_ += vectors[n].len; + uncommitted_ += vectors[n].len; + } + } + + Stream* stream_; + std::shared_ptr queue_; + std::shared_ptr reader_; + + bool errored_ = false; + + // Will be set to true if the reader_ ends up providing a pull result + // asynchronously. + bool next_pending_ = false; + + // Will be set to true once reader_ has returned eos. + bool eos_ = false; + + // The collection of buffers that we have pulled from reader_ and that we + // are holding onto until they are acknowledged. + struct Entry { + size_t offset = 0; + size_t ack_offset = 0; + DataQueue::Vec buf; + std::shared_ptr on_complete; + std::unique_ptr next; + Entry(DataQueue::Vec buf, std::shared_ptr on_complete) + : buf(buf), on_complete(std::move(on_complete)) {} + }; + + std::unique_ptr head_ = nullptr; + Entry* commit_head_ = nullptr; + Entry* tail_ = nullptr; + + // The total number of uncommitted chunks. + size_t count_ = 0; + + // The total number of bytes currently held in the buffer. + size_t total_ = 0; + + // The current byte offset of buffer_ that has been confirmed to have been + // sent. Any offset lower than this represents bytes that we are currently + // waiting to be acknowledged. When we receive acknowledgement, we will + // automatically free held bytes from the buffer. + size_t uncommitted_ = 0; +}; + +// ============================================================================ + +bool Stream::HasInstance(Environment* env, Local value) { + return GetConstructorTemplate(env)->HasInstance(value); +} + +Local Stream::GetConstructorTemplate(Environment* env) { + auto& state = BindingData::Get(env); + auto tmpl = state.stream_constructor_template(); + if (tmpl.IsEmpty()) { + auto isolate = env->isolate(); + tmpl = NewFunctionTemplate(isolate, IllegalConstructor); + tmpl->SetClassName(state.stream_string()); + tmpl->Inherit(AsyncWrap::GetConstructorTemplate(env)); + tmpl->InstanceTemplate()->SetInternalFieldCount( + Stream::kInternalFieldCount); +#define V(name, key, no_side_effect) \ + if (no_side_effect) { \ + SetProtoMethodNoSideEffect(isolate, tmpl, #key, Impl::name); \ + } else { \ + SetProtoMethod(isolate, tmpl, #key, Impl::name); \ + } + + STREAM_JS_METHODS(V) + +#undef V + state.set_stream_constructor_template(tmpl); + } + return tmpl; +} + +void Stream::RegisterExternalReferences(ExternalReferenceRegistry* registry) { +#define V(name, _, __) registry->Register(Impl::name); + STREAM_JS_METHODS(V) +#undef V +} + +void Stream::Initialize(Environment* env, Local target) { + USE(GetConstructorTemplate(env)); + +#define V(name, _) IDX_STATS_STREAM_##name, + enum StreamStatsIdx { STREAM_STATS(V) IDX_STATS_STREAM_COUNT }; +#undef V + +#define V(name, key, __) \ + auto IDX_STATE_STREAM_##name = offsetof(Stream::State, key); + STREAM_STATE(V) +#undef V + +#define V(name, _) NODE_DEFINE_CONSTANT(target, IDX_STATS_STREAM_##name); + STREAM_STATS(V) +#undef V +#define V(name, _, __) NODE_DEFINE_CONSTANT(target, IDX_STATE_STREAM_##name); + STREAM_STATE(V) +#undef V + + constexpr int QUIC_STREAM_HEADERS_KIND_HINTS = + static_cast(HeadersKind::HINTS); + constexpr int QUIC_STREAM_HEADERS_KIND_INITIAL = + static_cast(HeadersKind::INITIAL); + constexpr int QUIC_STREAM_HEADERS_KIND_TRAILING = + static_cast(HeadersKind::TRAILING); + + constexpr int QUIC_STREAM_HEADERS_FLAGS_NONE = + static_cast(HeadersFlags::NONE); + constexpr int QUIC_STREAM_HEADERS_FLAGS_TERMINAL = + static_cast(HeadersFlags::TERMINAL); + + NODE_DEFINE_CONSTANT(target, QUIC_STREAM_HEADERS_KIND_HINTS); + NODE_DEFINE_CONSTANT(target, QUIC_STREAM_HEADERS_KIND_INITIAL); + NODE_DEFINE_CONSTANT(target, QUIC_STREAM_HEADERS_KIND_TRAILING); + + NODE_DEFINE_CONSTANT(target, QUIC_STREAM_HEADERS_FLAGS_NONE); + NODE_DEFINE_CONSTANT(target, QUIC_STREAM_HEADERS_FLAGS_TERMINAL); } Stream* Stream::From(void* stream_user_data) { @@ -21,41 +682,369 @@ Stream* Stream::From(void* stream_user_data) { return static_cast(stream_user_data); } -BaseObjectPtr Stream::Create(Session* session, int64_t id) { - return BaseObjectPtr(); +BaseObjectPtr Stream::Create(Session* session, + int64_t id, + std::shared_ptr source) { + DCHECK_GE(id, 0); + DCHECK_NOT_NULL(session); + Local obj; + if (!GetConstructorTemplate(session->env()) + ->InstanceTemplate() + ->NewInstance(session->env()->context()) + .ToLocal(&obj)) { + return BaseObjectPtr(); + } + + return MakeDetachedBaseObject( + BaseObjectWeakPtr(session), obj, id, std::move(source)); +} + +Stream::Stream(BaseObjectWeakPtr session, + v8::Local object, + int64_t id, + std::shared_ptr source) + : AsyncWrap(session->env(), object, AsyncWrap::PROVIDER_QUIC_STREAM), + stats_(env()->isolate()), + state_(env()->isolate()), + session_(std::move(session)), + origin_(id & 0b01 ? Side::SERVER : Side::CLIENT), + direction_(id & 0b10 ? Direction::UNIDIRECTIONAL + : Direction::BIDIRECTIONAL), + inbound_(DataQueue::Create()) { + MakeWeak(); + state_->id = id; + + // Allows us to be notified when data is actually read from the + // inbound queue so that we can update the stream flow control. + inbound_->addBackpressureListener(this); + + const auto defineProperty = [&](auto name, auto value) { + object + ->DefineOwnProperty( + env()->context(), name, value, PropertyAttribute::ReadOnly) + .Check(); + }; + + defineProperty(env()->state_string(), state_.GetArrayBuffer()); + defineProperty(env()->stats_string(), stats_.GetArrayBuffer()); + + set_outbound(std::move(source)); + + auto params = ngtcp2_conn_get_local_transport_params(this->session()); + STAT_SET(Stats, max_offset, params->initial_max_data); +} + +Stream::~Stream() { + // Make sure that Destroy() was called before Stream is destructed. + DCHECK(is_destroyed()); } int64_t Stream::id() const { - return 0; + return state_->id; } + Side Stream::origin() const { - return Side::CLIENT; + return origin_; } + Direction Stream::direction() const { - return Direction::BIDIRECTIONAL; + return direction_; +} + +Session& Stream::session() const { + return *session_; } bool Stream::is_destroyed() const { - return false; + return state_->destroyed; } + bool Stream::is_eos() const { - return false; + return state_->fin_sent; +} + +bool Stream::is_writable() const { + if (direction() == Direction::UNIDIRECTIONAL) { + switch (origin()) { + case Side::CLIENT: { + if (session_->is_server()) return false; + break; + } + case Side::SERVER: { + if (!session_->is_server()) return false; + break; + } + } + } + return state_->write_ended == 0; +} + +bool Stream::is_readable() const { + if (direction() == Direction::UNIDIRECTIONAL) { + switch (origin()) { + case Side::CLIENT: { + if (!session_->is_server()) return false; + break; + } + case Side::SERVER: { + if (session_->is_server()) return false; + break; + } + } + } + return state_->read_ended == 0; +} + +BaseObjectPtr Stream::get_reader() { + if (!is_readable() || state_->has_reader) + return BaseObjectPtr(); + state_->has_reader = 1; + return Blob::Reader::Create(env(), Blob::Create(env(), inbound_)); +} + +void Stream::set_final_size(uint64_t final_size) { + DCHECK_IMPLIES(state_->fin_received == 1, + final_size <= STAT_GET(Stats, final_size)); + state_->fin_received = 1; + STAT_SET(Stats, final_size, final_size); +} + +void Stream::set_outbound(std::shared_ptr source) { + if (!source || is_destroyed() || !is_writable()) return; + DCHECK_NULL(outbound_); + outbound_ = std::make_unique(this, std::move(source)); + session_->ResumeStream(id()); +} + +void Stream::EntryRead(size_t amount) { + // Tells us that amount bytes were read from inbound_ + // We use this as a signal to extend the flow control + // window to receive more bytes. + if (!is_destroyed() && session_) session_->ExtendStreamOffset(id(), amount); +} + +int Stream::DoPull(bob::Next next, + int options, + ngtcp2_vec* data, + size_t count, + size_t max_count_hint) { + if (is_destroyed() || is_eos()) { + std::move(next)(bob::Status::STATUS_EOS, nullptr, 0, [](int) {}); + return bob::Status::STATUS_EOS; + } + + // If an outbound source has not yet been attached, block until one is + // available. When AttachOutboundSource() is called the stream will be + // resumed. Note that when we say "block" here we don't mean it in the + // traditional "block the thread" sense. Instead, this will inform the + // Session to not try to send any more data from this stream until there + // is a source attached. + if (outbound_ == nullptr) { + std::move(next)(bob::Status::STATUS_BLOCK, nullptr, 0, [](size_t len) {}); + return bob::Status::STATUS_BLOCK; + } + + return outbound_->Pull(std::move(next), options, data, count, max_count_hint); +} + +void Stream::BeginHeaders(HeadersKind kind) { + if (is_destroyed()) return; + headers_length_ = 0; + headers_.clear(); + headers_kind_ = kind; +} + +bool Stream::AddHeader(const Header& header) { + size_t len = header.length(); + if (is_destroyed() || !session_->application().CanAddHeader( + headers_.size(), headers_length_, len)) { + return false; + } + + headers_length_ += len; + + auto& state = BindingData::Get(env()); + + const auto push = [&](auto raw) { + Local value; + if (UNLIKELY(!raw.ToLocal(&value))) return false; + headers_.push_back(value); + return true; + }; + + return push(header.GetName(&state)) && push(header.GetValue(&state)); +} + +void Stream::Acknowledge(size_t datalen) { + if (is_destroyed() || outbound_ == nullptr) return; + + // ngtcp2 guarantees that offset must always be greater than the previously + // received offset. + DCHECK_GE(datalen, STAT_GET(Stats, max_offset_ack)); + STAT_SET(Stats, max_offset_ack, datalen); + + // // Consumes the given number of bytes in the buffer. + outbound_->Acknowledge(datalen); +} + +void Stream::Commit(size_t datalen) { + if (!is_destroyed() && outbound_) outbound_->Commit(datalen); } -void Stream::Acknowledge(size_t datalen) {} -void Stream::Blocked() {} -void Stream::Commit(size_t datalen) {} -void Stream::End() {} -void Stream::Destroy(QuicError error) {} +void Stream::EndWritable() { + if (is_destroyed() || !is_writable()) return; + // If an outbound_ has been attached, we want to mark it as being ended. + // If the outbound_ is wrapping an idempotent DataQueue, then capping + // will be a non-op since we're not going to be writing any more data + // into it anyway. + if (outbound_ != nullptr) outbound_->Cap(); + state_->write_ended = 1; +} + +void Stream::EndReadable(std::optional maybe_final_size) { + if (is_destroyed() || !is_readable()) return; + state_->read_ended = 1; + set_final_size(maybe_final_size.value_or(STAT_GET(Stats, bytes_received))); + inbound_->cap(STAT_GET(Stats, final_size)); +} + +void Stream::Destroy(QuicError error) { + if (is_destroyed()) return; + + // End the writable before marking as destroyed. + EndWritable(); + + // Also end the readable side if it isn't already. + EndReadable(); + + state_->destroyed = 1; + + EmitClose(error); + + // We are going to release our reference to the outbound_ queue here. + outbound_.reset(); + + // We reset the inbound here also. However, it's important to note that + // the JavaScript side could still have a reader on the inbound DataQueue, + // which may keep that data alive a bit longer. + inbound_->removeBackpressureListener(this); + inbound_.reset(); + + // Finally, remove the stream from the session and clear our reference + // to the session. + session_->RemoveStream(id()); +} void Stream::ReceiveData(const uint8_t* data, size_t len, - ReceiveDataFlags flags) {} -void Stream::ReceiveStopSending(QuicError error) {} -void Stream::ReceiveStreamReset(uint64_t final_size, QuicError error) {} + ReceiveDataFlags flags) { + if (is_destroyed()) return; + + // If reading has ended, or there is no data, there's nothing to do but maybe + // end the readable side if this is the last bit of data we've received. + if (state_->read_ended == 1 || len == 0) { + if (flags.fin) EndReadable(); + return; + } + + STAT_INCREMENT_N(Stats, bytes_received, len); + auto backing = ArrayBuffer::NewBackingStore(env()->isolate(), len); + memcpy(backing->Data(), data, len); + inbound_->append(DataQueue::CreateInMemoryEntryFromBackingStore( + std::move(backing), 0, len)); + if (flags.fin) EndReadable(); +} + +void Stream::ReceiveStopSending(QuicError error) { + // Note that this comes from *this* endpoint, not the other side. We handle it + // if we haven't already shutdown our *receiving* side of the stream. + if (is_destroyed() || state_->read_ended) return; + ngtcp2_conn_shutdown_stream_read(session(), 0, id(), error.code()); + EndReadable(); +} + +void Stream::ReceiveStreamReset(uint64_t final_size, QuicError error) { + // Importantly, reset stream only impacts the inbound data flow. It has no + // impact on the outbound data flow. It is essentially a signal that the peer + // has abruptly terminated the writable end of their stream with an error. + // Any data we have received up to this point remains in the queue waiting to + // be read. + EndReadable(final_size); + EmitReset(error); +} + +// ============================================================================ + +void Stream::EmitBlocked() { + // state_->wants_block will be set from the javascript side if the + // stream object has a handler for the blocked event. + if (is_destroyed() || !env()->can_call_into_js() || + state_->wants_block == 0) { + return; + } + CallbackScope cb_scope(this); + MakeCallback(BindingData::Get(env()).stream_blocked_callback(), 0, nullptr); +} + +void Stream::EmitClose(const QuicError& error) { + if (is_destroyed() || !env()->can_call_into_js()) return; + CallbackScope cb_scope(this); + Local err; + if (!error.ToV8Value(env()).ToLocal(&err)) return; -void Stream::Schedule(Stream::Queue* queue) {} -void Stream::Unschedule() {} + MakeCallback(BindingData::Get(env()).stream_close_callback(), 1, &err); +} + +void Stream::EmitHeaders() { + if (is_destroyed() || !env()->can_call_into_js() || + state_->wants_headers == 0) { + return; + } + CallbackScope cb_scope(this); + + Local argv[] = { + Array::New(env()->isolate(), headers_.data(), headers_.size()), + Integer::NewFromUnsigned(env()->isolate(), + static_cast(headers_kind_))}; + + headers_.clear(); + + MakeCallback( + BindingData::Get(env()).stream_headers_callback(), arraysize(argv), argv); +} + +void Stream::EmitReset(const QuicError& error) { + if (is_destroyed() || !env()->can_call_into_js() || + state_->wants_reset == 0) { + return; + } + CallbackScope cb_scope(this); + Local err; + if (!error.ToV8Value(env()).ToLocal(&err)) return; + + MakeCallback(BindingData::Get(env()).stream_reset_callback(), 1, &err); +} + +void Stream::EmitWantTrailers() { + if (is_destroyed() || !env()->can_call_into_js() || + state_->wants_trailers == 0) { + return; + } + CallbackScope cb_scope(this); + MakeCallback(BindingData::Get(env()).stream_trailers_callback(), 0, nullptr); +} + +// ============================================================================ + +void Stream::Schedule(Stream::Queue* queue) { + // If this stream is not already in the queue to send data, add it. + if (!is_destroyed() && outbound_ && stream_queue_.IsEmpty()) + queue->PushBack(this); +} + +void Stream::Unschedule() { + stream_queue_.Remove(); +} } // namespace quic } // namespace node diff --git a/src/quic/streams.h b/src/quic/streams.h index a97efa9acba6f7..835dcfa30e8a26 100644 --- a/src/quic/streams.h +++ b/src/quic/streams.h @@ -3,10 +3,15 @@ #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS #if HAVE_OPENSSL && NODE_OPENSSL_HAS_QUIC +#include #include #include +#include #include +#include +#include #include +#include #include "bindingdata.h" #include "data.h" @@ -17,27 +22,122 @@ class Session; using Ngtcp2Source = bob::SourceImpl; -// TODO(@jasnell): This is currently a placeholder for the actual definition. -class Stream : public AsyncWrap, public Ngtcp2Source { +// QUIC Stream's are simple data flows that may be: +// +// * Bidirectional (both sides can send) or Unidirectional (one side can send) +// * Server or Client Initiated +// +// The flow direction and origin of the stream are important in determining the +// write and read state (Open or Closed). Specifically: +// +// Bidirectional Stream States: +// +--------+--------------+----------+----------+ +// | ON | Initiated By | Readable | Writable | +// +--------+--------------+----------+----------+ +// | Server | Server | Y | Y | +// +--------+--------------+----------+----------+ +// | Server | Client | Y | Y | +// +--------+--------------+----------+----------+ +// | Client | Server | Y | Y | +// +--------+--------------+----------+----------+ +// | Client | Client | Y | Y | +// +--------+--------------+----------+----------+ +// +// Unidirectional Stream States +// +--------+--------------+----------+----------+ +// | ON | Initiated By | Readable | Writable | +// +--------+--------------+----------+----------+ +// | Server | Server | N | Y | +// +--------+--------------+----------+----------+ +// | Server | Client | Y | N | +// +--------+--------------+----------+----------+ +// | Client | Server | Y | N | +// +--------+--------------+----------+----------+ +// | Client | Client | N | Y | +// +--------+--------------+----------+----------+ +// +// All data sent via the Stream is buffered internally until either receipt is +// acknowledged from the peer or attempts to send are abandoned. The fact that +// data is buffered in memory makes it essential that the flow control for the +// session and the stream are properly handled. For now, we are largely relying +// on ngtcp2's default flow control mechanisms which generally should be doing +// the right thing. +// +// A Stream may be in a fully closed state (No longer readable nor writable) +// state but still have unacknowledged data in it's inbound and outbound +// queues. +// +// A Stream is gracefully closed when (a) both read and write states are closed, +// (b) all queued data has been acknowledged. +// +// The Stream may be forcefully closed immediately using destroy(err). This +// causes all queued outbound data and pending JavaScript writes are abandoned, +// and causes the Stream to be immediately closed at the ngtcp2 level without +// waiting for any outstanding acknowledgements. Keep in mind, however, that the +// peer is not notified that the stream is destroyed and may attempt to continue +// sending data and acknowledgements. +// +// QUIC streams in general do not have headers. Some QUIC applications, however, +// may associate headers with the stream (HTTP/3 for instance). +class Stream : public AsyncWrap, + public Ngtcp2Source, + public DataQueue::BackpressureListener { public: - static Stream* From(void* stream_user_data); + using Header = NgHeaderBase; - static BaseObjectPtr Create(Session* session, int64_t id); + static Stream* From(void* stream_user_data); - Stream(BaseObjectPtr session, v8::Local obj); + static bool HasInstance(Environment* env, v8::Local value); + static v8::Local GetConstructorTemplate( + Environment* env); + static void Initialize(Environment* env, v8::Local target); + static void RegisterExternalReferences(ExternalReferenceRegistry* registry); + + static BaseObjectPtr Create( + Session* session, + int64_t id, + std::shared_ptr source = nullptr); + + // The constructor is only public to be visible by MakeDetachedBaseObject. + // Call Create to create new instances of Stream. + Stream(BaseObjectWeakPtr session, + v8::Local obj, + int64_t id, + std::shared_ptr source); + ~Stream() override; int64_t id() const; Side origin() const; Direction direction() const; + Session& session() const; bool is_destroyed() const; + + // True if we've completely sent all outbound data for this stream. bool is_eos() const; + bool is_readable() const; + bool is_writable() const; + + // Called by the session/application to indicate that the specified number + // of bytes have been acknowledged by the peer. void Acknowledge(size_t datalen); - void Blocked(); void Commit(size_t datalen); - void End(); - void Destroy(QuicError error); + void EndWritable(); + void EndReadable(std::optional maybe_final_size = std::nullopt); + void EntryRead(size_t amount) override; + + // Pulls data from the internal outbound DataQueue configured for this stream. + int DoPull(bob::Next next, + int options, + ngtcp2_vec* data, + size_t count, + size_t max_count_hint) override; + + // Forcefully close the stream immediately. All queued data and pending + // writes are abandoned, and the stream is immediately closed at the ngtcp2 + // level without waiting for any outstanding acknowledgements. + void Destroy(QuicError error = QuicError()); struct ReceiveDataFlags final { // Identifies the final chunk of data that the peer will send for the @@ -53,11 +153,61 @@ class Stream : public AsyncWrap, public Ngtcp2Source { void ReceiveStopSending(QuicError error); void ReceiveStreamReset(uint64_t final_size, QuicError error); + void BeginHeaders(HeadersKind kind); + // Returns false if the header cannot be added. This will typically happen + // if the application does not support headers, a maximimum number of headers + // have already been added, or the maximum total header length is reached. + bool AddHeader(const Header& header); + SET_NO_MEMORY_INFO() SET_MEMORY_INFO_NAME(Stream) SET_SELF_SIZE(Stream) - ListNode stream_queue_; + struct State; + struct Stats; + + // Notifies the JavaScript side that sending data on the stream has been + // blocked because of flow control restriction. + void EmitBlocked(); + + private: + struct Impl; + class Outbound; + + // Gets a reader for the data received for this stream from the peer, + BaseObjectPtr get_reader(); + + void set_final_size(uint64_t amount); + void set_outbound(std::shared_ptr source); + + // JavaScript callouts + + // Notifies the JavaScript side that the stream has been destroyed. + void EmitClose(const QuicError& error); + + // Delivers the set of inbound headers that have been collected. + void EmitHeaders(); + + // Notifies the JavaScript side that the stream has been reset. + void EmitReset(const QuicError& error); + + // Notifies the JavaScript side that the application is ready to receive + // trailing headers. + void EmitWantTrailers(); + + AliasedStruct stats_; + AliasedStruct state_; + BaseObjectWeakPtr session_; + const Side origin_; + const Direction direction_; + std::unique_ptr outbound_; + std::shared_ptr inbound_; + + std::vector> headers_; + HeadersKind headers_kind_ = HeadersKind::INITIAL; + size_t headers_length_ = 0; + + friend struct Impl; public: // The Queue/Schedule/Unschedule here are part of the mechanism used to @@ -69,6 +219,7 @@ class Stream : public AsyncWrap, public Ngtcp2Source { // data to send (such as when it is initially created or is using an async // source that is still waiting for data to be pushed) it will not appear in // the queue. + ListNode stream_queue_; using Queue = ListHead; void Schedule(Queue* queue); diff --git a/src/quic/tlscontext.cc b/src/quic/tlscontext.cc index 171f6e1d259bc7..d60e4a7dbf3cea 100644 --- a/src/quic/tlscontext.cc +++ b/src/quic/tlscontext.cc @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include #include #include @@ -93,7 +93,7 @@ BaseObjectPtr InitializeSecureContext( ctx.reset(SSL_CTX_new(TLS_server_method())); SSL_CTX_set_app_data(ctx.get(), context); - if (ngtcp2_crypto_openssl_configure_server_context(ctx.get()) != 0) { + if (ngtcp2_crypto_quictls_configure_server_context(ctx.get()) != 0) { return BaseObjectPtr(); } @@ -123,7 +123,7 @@ BaseObjectPtr InitializeSecureContext( ctx.reset(SSL_CTX_new(TLS_client_method())); SSL_CTX_set_app_data(ctx.get(), context); - if (ngtcp2_crypto_openssl_configure_client_context(ctx.get()) != 0) { + if (ngtcp2_crypto_quictls_configure_client_context(ctx.get()) != 0) { return BaseObjectPtr(); } @@ -277,6 +277,7 @@ bool SetOption(Environment* env, ASSIGN_OR_RETURN_UNWRAP(&handle, item, false); (options->*member).push_back(handle->Data()); } else { + THROW_ERR_INVALID_ARG_TYPE(env, "options must be an object"); return false; } } else if constexpr (std::is_same::value) { @@ -285,6 +286,7 @@ bool SetOption(Environment* env, } else if (item->IsArrayBuffer()) { (options->*member).emplace_back(item.As()); } else { + THROW_ERR_INVALID_ARG_TYPE(env, "options must be an object"); return false; } } @@ -297,6 +299,7 @@ bool SetOption(Environment* env, ASSIGN_OR_RETURN_UNWRAP(&handle, value, false); (options->*member).push_back(handle->Data()); } else { + THROW_ERR_INVALID_ARG_TYPE(env, "options must be an object"); return false; } } else if constexpr (std::is_same::value) { @@ -305,6 +308,7 @@ bool SetOption(Environment* env, } else if (value->IsArrayBuffer()) { (options->*member).emplace_back(value.As()); } else { + THROW_ERR_INVALID_ARG_TYPE(env, "options must be an object"); return false; } } @@ -384,8 +388,7 @@ TLSContext::TLSContext(Environment* env, void TLSContext::Start() { ngtcp2_conn_set_tls_native_handle(*session_, ssl_.get()); - TransportParams tp(TransportParams::Type::ENCRYPTED_EXTENSIONS, - ngtcp2_conn_get_local_transport_params(*session_)); + TransportParams tp(ngtcp2_conn_get_local_transport_params(*session_)); Store store = tp.Encode(env_); if (store && store.length() > 0) { ngtcp2_vec vec = store; @@ -397,7 +400,7 @@ void TLSContext::Keylog(const char* line) const { session_->EmitKeylog(line); } -int TLSContext::Receive(ngtcp2_crypto_level crypto_level, +int TLSContext::Receive(TLSContext::EncryptionLevel level, uint64_t offset, const uint8_t* data, size_t datalen) { @@ -410,7 +413,7 @@ int TLSContext::Receive(ngtcp2_crypto_level crypto_level, // Internally, this passes the handshake data off to openssl for processing. // The handshake may or may not complete. int ret = ngtcp2_crypto_read_write_crypto_data( - *session_, crypto_level, data, datalen); + *session_, static_cast(level), data, datalen); switch (ret) { case 0: @@ -419,9 +422,9 @@ int TLSContext::Receive(ngtcp2_crypto_level crypto_level, // In either of following cases, the handshake is being paused waiting for // user code to take action (for instance OCSP requests or client hello // modification) - case NGTCP2_CRYPTO_OPENSSL_ERR_TLS_WANT_X509_LOOKUP: + case NGTCP2_CRYPTO_QUICTLS_ERR_TLS_WANT_X509_LOOKUP: [[fallthrough]]; - case NGTCP2_CRYPTO_OPENSSL_ERR_TLS_WANT_CLIENT_HELLO_CB: + case NGTCP2_CRYPTO_QUICTLS_ERR_TLS_WANT_CLIENT_HELLO_CB: return 0; } return ret; @@ -464,12 +467,6 @@ int TLSContext::VerifyPeerIdentity() { } void TLSContext::MaybeSetEarlySession(const SessionTicket& sessionTicket) { - TransportParams rtp(TransportParams::Type::ENCRYPTED_EXTENSIONS, - sessionTicket.transport_params()); - - // Ignore invalid remote transport parameters. - if (!rtp) return; - uv_buf_t buf = sessionTicket.ticket(); crypto::SSLSessionPointer ticket = crypto::GetTLSSession( reinterpret_cast(buf.base), buf.len); @@ -478,10 +475,17 @@ void TLSContext::MaybeSetEarlySession(const SessionTicket& sessionTicket) { if (!ticket || !SSL_SESSION_get_max_early_data(ticket.get())) return; // The early data will just be ignored if it's invalid. - if (crypto::SetTLSSession(ssl_, ticket)) { - ngtcp2_conn_set_early_remote_transport_params(*session_, rtp); - session_->SetStreamOpenAllowed(); - } + if (!crypto::SetTLSSession(ssl_, ticket)) return; + + ngtcp2_vec rtp = sessionTicket.transport_params(); + // Decode and attempt to set the early transport parameters configured + // for the early session. If non-zero is returned, decoding or setting + // failed, in which case we just ignore it. + if (ngtcp2_conn_decode_and_set_0rtt_transport_params( + *session_, rtp.base, rtp.len) != 0) + return; + + session_->SetStreamOpenAllowed(); } void TLSContext::MemoryInfo(MemoryTracker* tracker) const { @@ -545,16 +549,25 @@ ngtcp2_conn* TLSContext::getConnection(ngtcp2_crypto_conn_ref* ref) { return *context->session_; } -Maybe TLSContext::Options::From(Environment* env, - Local value) { - if (value.IsEmpty() || !value->IsObject()) { +Maybe TLSContext::Options::From(Environment* env, + Local value) { + if (value.IsEmpty()) { THROW_ERR_INVALID_ARG_TYPE(env, "options must be an object"); - return Nothing(); + return Nothing(); } + Options options; auto& state = BindingData::Get(env); + + if (value->IsUndefined()) { + return Just(options); + } + if (!value->IsObject()) { + THROW_ERR_INVALID_ARG_TYPE(env, "options must be an object"); + return Nothing(); + } + auto params = value.As(); - Options options; #define SET_VECTOR(Type, name) \ SetOption( \ @@ -571,10 +584,10 @@ Maybe TLSContext::Options::From(Environment* env, !SET_VECTOR(std::shared_ptr, keys) || !SET_VECTOR(Store, certs) || !SET_VECTOR(Store, ca) || !SET_VECTOR(Store, crl)) { - return Nothing(); + return Nothing(); } - return Just(options); + return Just(options); } } // namespace quic diff --git a/src/quic/tlscontext.h b/src/quic/tlscontext.h index 2de6c016a267af..b163a68cfa3e73 100644 --- a/src/quic/tlscontext.h +++ b/src/quic/tlscontext.h @@ -23,6 +23,13 @@ class Session; // convenience to help make the code more maintainable and understandable. class TLSContext final : public MemoryRetainer { public: + enum class EncryptionLevel { + INITIAL = NGTCP2_ENCRYPTION_LEVEL_INITIAL, + HANDSHAKE = NGTCP2_ENCRYPTION_LEVEL_HANDSHAKE, + ONERTT = NGTCP2_ENCRYPTION_LEVEL_1RTT, + ZERORTT = NGTCP2_ENCRYPTION_LEVEL_0RTT, + }; + static constexpr auto DEFAULT_CIPHERS = "TLS_AES_128_GCM_SHA256:" "TLS_AES_256_GCM_SHA384:" "TLS_CHACHA20_POLY1305_" @@ -91,8 +98,8 @@ class TLSContext final : public MemoryRetainer { static const Options kDefault; - static v8::Maybe From(Environment* env, - v8::Local value); + static v8::Maybe From(Environment* env, + v8::Local value); }; static const Options kDefaultOptions; @@ -118,7 +125,7 @@ class TLSContext final : public MemoryRetainer { // Called when a chunk of peer TLS handshake data is received. For every // chunk, we move the TLS handshake further along until it is complete. - int Receive(ngtcp2_crypto_level crypto_level, + int Receive(TLSContext::EncryptionLevel level, uint64_t offset, const uint8_t* data, size_t datalen); diff --git a/src/quic/tokens.cc b/src/quic/tokens.cc index 8c9ced0a4aae70..dc14be55723e89 100644 --- a/src/quic/tokens.cc +++ b/src/quic/tokens.cc @@ -15,31 +15,32 @@ namespace quic { // TokenSecret TokenSecret::TokenSecret() : buf_() { - Reset(); + // As a performance optimization later, we could consider creating an entropy + // cache here similar to what we use for random CIDs so that we do not have + // to engage CSPRNG on every call. That, however, is suboptimal for secrets. + // If someone manages to get visibility into that cache then they would know + // the secrets for a larger number of tokens, which could be bad. For now, + // generating on each call is safer, even if less performant. + CHECK(crypto::CSPRNG(buf_, QUIC_TOKENSECRET_LEN).is_ok()); } TokenSecret::TokenSecret(const uint8_t* secret) : buf_() { - *this = secret; + CHECK_NOT_NULL(secret); + memcpy(buf_, secret, QUIC_TOKENSECRET_LEN); } -TokenSecret& TokenSecret::operator=(const uint8_t* other) { - CHECK_NOT_NULL(other); - memcpy(buf_, other, QUIC_TOKENSECRET_LEN); - return *this; +TokenSecret::~TokenSecret() { + memset(buf_, 0, QUIC_TOKENSECRET_LEN); } TokenSecret::operator const uint8_t*() const { return buf_; } -void TokenSecret::Reset() { - // As a performance optimization later, we could consider creating an entropy - // cache here similar to what we use for random CIDs so that we do not have - // to engage CSPRNG on every call. That, however, is suboptimal for secrets. - // If someone manages to get visibility into that cache then they would know - // the secrets for a larger number of tokens, which could be bad. For now, - // generating on each call is safer, even if less performant. - CHECK(crypto::CSPRNG(buf_, QUIC_TOKENSECRET_LEN).is_ok()); +uint8_t TokenSecret::operator[](int pos) const { + CHECK_GE(pos, 0); + CHECK_LT(pos, QUIC_TOKENSECRET_LEN); + return buf_[pos]; } // ============================================================================ diff --git a/src/quic/tokens.h b/src/quic/tokens.h index 21f611b7bbfb93..d6ebe34a12dc7f 100644 --- a/src/quic/tokens.h +++ b/src/quic/tokens.h @@ -31,17 +31,15 @@ class TokenSecret final : public MemoryRetainer { // the length is not verified so care must be taken // when this constructor is used. explicit TokenSecret(const uint8_t* secret); + ~TokenSecret(); - TokenSecret(const TokenSecret& other) = default; - TokenSecret& operator=(const TokenSecret& other) = default; - TokenSecret& operator=(const uint8_t* other); - - TokenSecret& operator=(TokenSecret&& other) = delete; + TokenSecret(const TokenSecret&) = default; + TokenSecret& operator=(const TokenSecret&) = default; + TokenSecret(TokenSecret&&) = delete; + TokenSecret& operator=(TokenSecret&&) = delete; operator const uint8_t*() const; - - // Resets the secret to a random value. - void Reset(); + uint8_t operator[](int pos) const; SET_NO_MEMORY_INFO() SET_MEMORY_INFO_NAME(TokenSecret) diff --git a/src/quic/transportparams.cc b/src/quic/transportparams.cc index 3ea7a3d6d268ae..792396df499543 100644 --- a/src/quic/transportparams.cc +++ b/src/quic/transportparams.cc @@ -31,15 +31,26 @@ TransportParams::Config::Config(Side side, const CID& retry_scid) : side(side), ocid(ocid), retry_scid(retry_scid) {} -Maybe TransportParams::Options::From( +Maybe TransportParams::Options::From( Environment* env, Local value) { - if (value.IsEmpty() || !value->IsObject()) { - return Nothing(); + if (value.IsEmpty()) { + THROW_ERR_INVALID_ARG_TYPE(env, "options must be an object"); + return Nothing(); } + Options options; auto& state = BindingData::Get(env); + + if (value->IsUndefined()) { + return Just(options); + } + + if (!value->IsObject()) { + THROW_ERR_INVALID_ARG_TYPE(env, "options must be an object"); + return Nothing(); + } + auto params = value.As(); - Options options; #define SET(name) \ SetOption( \ @@ -52,12 +63,12 @@ Maybe TransportParams::Options::From( !SET(max_idle_timeout) || !SET(active_connection_id_limit) || !SET(ack_delay_exponent) || !SET(max_ack_delay) || !SET(max_datagram_frame_size) || !SET(disable_active_migration)) { - return Nothing(); + return Nothing(); } #undef SET - return Just(options); + return Just(options); } void TransportParams::Options::MemoryInfo(MemoryTracker* tracker) const { @@ -71,13 +82,13 @@ void TransportParams::Options::MemoryInfo(MemoryTracker* tracker) const { } } -TransportParams::TransportParams(Type type) : type_(type), ptr_(¶ms_) {} +TransportParams::TransportParams() : ptr_(¶ms_) {} -TransportParams::TransportParams(Type type, const ngtcp2_transport_params* ptr) - : type_(type), ptr_(ptr) {} +TransportParams::TransportParams(const ngtcp2_transport_params* ptr) + : ptr_(ptr) {} TransportParams::TransportParams(const Config& config, const Options& options) - : TransportParams(Type::ENCRYPTED_EXTENSIONS) { + : TransportParams() { ngtcp2_transport_params_default(¶ms_); params_.active_connection_id_limit = options.active_connection_id_limit; params_.initial_max_stream_data_bidi_local = @@ -93,7 +104,7 @@ TransportParams::TransportParams(const Config& config, const Options& options) params_.ack_delay_exponent = options.ack_delay_exponent; params_.max_datagram_frame_size = options.max_datagram_frame_size; params_.disable_active_migration = options.disable_active_migration ? 1 : 0; - params_.preferred_address_present = 0; + params_.preferred_addr_present = 0; params_.stateless_reset_token_present = 0; params_.retry_scid_present = 0; @@ -116,13 +127,10 @@ TransportParams::TransportParams(const Config& config, const Options& options) SetPreferredAddress(options.preferred_address_ipv6.value()); } -TransportParams::TransportParams(Type type, const ngtcp2_vec& vec) - : TransportParams(type) { - int ret = ngtcp2_decode_transport_params( - ¶ms_, - static_cast(type), - vec.base, - vec.len); +TransportParams::TransportParams(const ngtcp2_vec& vec, int version) + : TransportParams() { + int ret = ngtcp2_transport_params_decode_versioned( + version, ¶ms_, vec.base, vec.len); if (ret != 0) { ptr_ = nullptr; @@ -130,25 +138,22 @@ TransportParams::TransportParams(Type type, const ngtcp2_vec& vec) } } -Store TransportParams::Encode(Environment* env) { +Store TransportParams::Encode(Environment* env, int version) { if (ptr_ == nullptr) { error_ = QuicError::ForNgtcp2Error(NGTCP2_INTERNAL_ERROR); return Store(); } // Preflight to see how much storage we'll need. - ssize_t size = ngtcp2_encode_transport_params( - nullptr, 0, static_cast(type_), ¶ms_); + ssize_t size = + ngtcp2_transport_params_encode_versioned(nullptr, 0, version, ¶ms_); DCHECK_GT(size, 0); auto result = ArrayBuffer::NewBackingStore(env->isolate(), size); - auto ret = ngtcp2_encode_transport_params( - static_cast(result->Data()), - size, - static_cast(type_), - ¶ms_); + auto ret = ngtcp2_transport_params_encode_versioned( + static_cast(result->Data()), size, version, ¶ms_); if (ret != 0) { error_ = QuicError::ForNgtcp2Error(ret); @@ -160,24 +165,24 @@ Store TransportParams::Encode(Environment* env) { void TransportParams::SetPreferredAddress(const SocketAddress& address) { DCHECK(ptr_ == ¶ms_); - params_.preferred_address_present = 1; + params_.preferred_addr_present = 1; switch (address.family()) { case AF_INET: { const sockaddr_in* src = reinterpret_cast(address.data()); - memcpy(params_.preferred_address.ipv4_addr, + memcpy(¶ms_.preferred_addr.ipv4.sin_addr, &src->sin_addr, - sizeof(params_.preferred_address.ipv4_addr)); - params_.preferred_address.ipv4_port = address.port(); + sizeof(params_.preferred_addr.ipv4.sin_addr)); + params_.preferred_addr.ipv4.sin_port = address.port(); return; } case AF_INET6: { const sockaddr_in6* src = reinterpret_cast(address.data()); - memcpy(params_.preferred_address.ipv6_addr, + memcpy(¶ms_.preferred_addr.ipv6.sin6_addr, &src->sin6_addr, - sizeof(params_.preferred_address.ipv6_addr)); - params_.preferred_address.ipv6_port = address.port(); + sizeof(params_.preferred_addr.ipv6.sin6_addr)); + params_.preferred_addr.ipv6.sin6_port = address.port(); return; } } @@ -201,22 +206,18 @@ void TransportParams::GenerateStatelessResetToken(const Endpoint& endpoint, void TransportParams::GeneratePreferredAddressToken(Session* session) { DCHECK(ptr_ == ¶ms_); - if (params_.preferred_address_present) { + if (params_.preferred_addr_present) { session->config_.preferred_address_cid = session->new_cid(); - params_.preferred_address.cid = session->config_.preferred_address_cid; + params_.preferred_addr.cid = session->config_.preferred_address_cid; auto& endpoint = session->endpoint(); endpoint.AssociateStatelessResetToken( endpoint.GenerateNewStatelessResetToken( - params_.preferred_address.stateless_reset_token, + params_.preferred_addr.stateless_reset_token, session->config_.preferred_address_cid), session); } } -TransportParams::Type TransportParams::type() const { - return type_; -} - TransportParams::operator const ngtcp2_transport_params&() const { DCHECK_NOT_NULL(ptr_); return *ptr_; diff --git a/src/quic/transportparams.h b/src/quic/transportparams.h index 1269f11fbbbf1c..237927e7cd3ed9 100644 --- a/src/quic/transportparams.h +++ b/src/quic/transportparams.h @@ -24,13 +24,11 @@ class Session; // should use when communicating with this session. class TransportParams final { public: - enum class Type { - CLIENT_HELLO = NGTCP2_TRANSPORT_PARAMS_TYPE_CLIENT_HELLO, - ENCRYPTED_EXTENSIONS = NGTCP2_TRANSPORT_PARAMS_TYPE_ENCRYPTED_EXTENSIONS, - }; - static void Initialize(Environment* env, v8::Local target); + static constexpr int QUIC_TRANSPORT_PARAMS_V1 = NGTCP2_TRANSPORT_PARAMS_V1; + static constexpr int QUIC_TRANSPORT_PARAMS_VERSION = + NGTCP2_TRANSPORT_PARAMS_VERSION; static constexpr uint64_t DEFAULT_MAX_STREAM_DATA = 256 * 1024; static constexpr uint64_t DEFAULT_MAX_DATA = 1 * 1024 * 1024; static constexpr uint64_t DEFAULT_MAX_IDLE_TIMEOUT = 10; // seconds @@ -48,6 +46,8 @@ class TransportParams final { }; struct Options : public MemoryRetainer { + int transportParamsVersion = QUIC_TRANSPORT_PARAMS_V1; + // Set only on server Sessions, the preferred address communicates the IP // address and port that the server would prefer the client to use when // communicating with it. See the QUIC specification for more detail on how @@ -116,15 +116,15 @@ class TransportParams final { SET_MEMORY_INFO_NAME(TransportParams::Options) SET_SELF_SIZE(Options) - static v8::Maybe From(Environment* env, - v8::Local value); + static v8::Maybe From(Environment* env, + v8::Local value); }; - explicit TransportParams(Type type); + explicit TransportParams(); // Creates an instance of TransportParams wrapping the existing const // ngtcp2_transport_params pointer. - TransportParams(Type type, const ngtcp2_transport_params* ptr); + TransportParams(const ngtcp2_transport_params* ptr); TransportParams(const Config& config, const Options& options); @@ -132,15 +132,14 @@ class TransportParams final { // If the parameters cannot be successfully decoded, the error() // property will be set with an appropriate QuicError and the bool() // operator will return false. - TransportParams(Type type, const ngtcp2_vec& buf); + TransportParams(const ngtcp2_vec& buf, + int version = QUIC_TRANSPORT_PARAMS_V1); void GenerateSessionTokens(Session* session); void GenerateStatelessResetToken(const Endpoint& endpoint, const CID& cid); void GeneratePreferredAddressToken(Session* session); void SetPreferredAddress(const SocketAddress& address); - Type type() const; - operator const ngtcp2_transport_params&() const; operator const ngtcp2_transport_params*() const; @@ -151,10 +150,9 @@ class TransportParams final { // Returns an ArrayBuffer containing the encoded transport parameters. // If an error occurs during encoding, an empty shared_ptr will be returned // and the error() property will be set to an appropriate QuicError. - Store Encode(Environment* env); + Store Encode(Environment* env, int version = QUIC_TRANSPORT_PARAMS_V1); private: - Type type_; ngtcp2_transport_params params_{}; const ngtcp2_transport_params* ptr_; QuicError error_ = QuicError::TRANSPORT_NO_ERROR; diff --git a/src/spawn_sync.cc b/src/spawn_sync.cc index b3c0fabafdaad2..3b73dc4a614b9a 100644 --- a/src/spawn_sync.cc +++ b/src/spawn_sync.cc @@ -22,6 +22,7 @@ #include "spawn_sync.h" #include "debug_utils-inl.h" #include "env-inl.h" +#include "node_external_reference.h" #include "node_internals.h" #include "string_bytes.h" #include "util-inl.h" @@ -366,6 +367,10 @@ void SyncProcessRunner::Initialize(Local target, SetMethod(context, target, "spawn", Spawn); } +void SyncProcessRunner::RegisterExternalReferences( + ExternalReferenceRegistry* registry) { + registry->Register(Spawn); +} void SyncProcessRunner::Spawn(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); @@ -1107,3 +1112,5 @@ void SyncProcessRunner::KillTimerCloseCallback(uv_handle_t* handle) { NODE_BINDING_CONTEXT_AWARE_INTERNAL(spawn_sync, node::SyncProcessRunner::Initialize) +NODE_BINDING_EXTERNAL_REFERENCE( + spawn_sync, node::SyncProcessRunner::RegisterExternalReferences) diff --git a/src/spawn_sync.h b/src/spawn_sync.h index 81a2f2aaa899ba..d5b74e67d83094 100644 --- a/src/spawn_sync.h +++ b/src/spawn_sync.h @@ -30,8 +30,7 @@ namespace node { - - +class ExternalReferenceRegistry; class SyncProcessOutputBuffer; class SyncProcessStdioPipe; class SyncProcessRunner; @@ -140,6 +139,7 @@ class SyncProcessRunner { }; public: + static void RegisterExternalReferences(ExternalReferenceRegistry* registry); static void Initialize(v8::Local target, v8::Local unused, v8::Local context, diff --git a/src/stream_base.cc b/src/stream_base.cc index cfb1e3ae6a2d7d..74001d5b6cee00 100644 --- a/src/stream_base.cc +++ b/src/stream_base.cc @@ -91,7 +91,7 @@ StreamWriteResult StreamBase::Write(uv_buf_t* bufs, for (size_t i = 0; i < count; ++i) total_bytes += bufs[i].len; bytes_written_ += total_bytes; - if (send_handle == nullptr && !skip_try_write) { + if (send_handle == nullptr && HasDoTryWrite() && !skip_try_write) { err = DoTryWrite(&bufs, &count); if (err != 0 || count == 0) { return StreamWriteResult{false, err, nullptr, total_bytes, {}}; @@ -365,7 +365,7 @@ int StreamBase::WriteString(const FunctionCallbackInfo& args) { size_t synchronously_written = 0; uv_buf_t buf; - bool try_write = storage_size <= sizeof(stack_storage) && + bool try_write = HasDoTryWrite() && storage_size <= sizeof(stack_storage) && (!IsIPCPipe() || send_handle_obj.IsEmpty()); if (try_write) { data_size = StringBytes::Write(isolate, diff --git a/src/stream_base.h b/src/stream_base.h index 8f6a7b22ea1f2f..62a8928e144ad6 100644 --- a/src/stream_base.h +++ b/src/stream_base.h @@ -244,6 +244,8 @@ class StreamResource { // `*bufs` and `*count` accordingly. This is a no-op by default. // Return 0 for success and a libuv error code for failures. virtual int DoTryWrite(uv_buf_t** bufs, size_t* count); + // Indicates whether this subclass overrides the DoTryWrite + virtual inline bool HasDoTryWrite() const { return false; } // Initiate a write of data. // Upon an immediate failure, a libuv error code is returned, // w->Done() will never be called and caller should free `bufs`. diff --git a/src/stream_wrap.h b/src/stream_wrap.h index 197303990c90bc..85a675d04f22f0 100644 --- a/src/stream_wrap.h +++ b/src/stream_wrap.h @@ -52,6 +52,7 @@ class LibuvStreamWrap : public HandleWrap, public StreamBase { // Resource implementation int DoShutdown(ShutdownWrap* req_wrap) override; int DoTryWrite(uv_buf_t** bufs, size_t* count) override; + inline bool HasDoTryWrite() const override { return true; } int DoWrite(WriteWrap* w, uv_buf_t* bufs, size_t count, diff --git a/src/udp_wrap.cc b/src/udp_wrap.cc index 4208a213260e26..d4249d7aac56e0 100644 --- a/src/udp_wrap.cc +++ b/src/udp_wrap.cc @@ -21,10 +21,11 @@ #include "udp_wrap.h" #include "env-inl.h" +#include "handle_wrap.h" #include "node_buffer.h" #include "node_errors.h" +#include "node_external_reference.h" #include "node_sockaddr-inl.h" -#include "handle_wrap.h" #include "req_wrap-inl.h" #include "util-inl.h" @@ -133,6 +134,12 @@ void UDPWrapBase::AddMethods(Environment* env, Local t) { SetProtoMethod(env->isolate(), t, "recvStop", RecvStop); } +void UDPWrapBase::RegisterExternalReferences( + ExternalReferenceRegistry* registry) { + registry->Register(RecvStart); + registry->Register(RecvStop); +} + UDPWrap::UDPWrap(Environment* env, Local object) : HandleWrap(env, object, @@ -229,6 +236,34 @@ void UDPWrap::Initialize(Local target, constants).Check(); } +void UDPWrap::RegisterExternalReferences(ExternalReferenceRegistry* registry) { + UDPWrapBase::RegisterExternalReferences(registry); + registry->Register(New); + registry->Register(GetFD); + + registry->Register(Open); + registry->Register(Bind); + registry->Register(Connect); + registry->Register(Send); + registry->Register(Bind6); + registry->Register(Connect6); + registry->Register(Send6); + registry->Register(Disconnect); + registry->Register(GetSockOrPeerName); + registry->Register(GetSockOrPeerName); + registry->Register(AddMembership); + registry->Register(DropMembership); + registry->Register(AddSourceSpecificMembership); + registry->Register(DropSourceSpecificMembership); + registry->Register(SetMulticastInterface); + registry->Register(SetLibuvInt32); + registry->Register(SetLibuvInt32); + registry->Register(SetLibuvInt32); + registry->Register(SetLibuvInt32); + registry->Register(BufferSize); + registry->Register(GetSendQueueSize); + registry->Register(GetSendQueueCount); +} void UDPWrap::New(const FunctionCallbackInfo& args) { CHECK(args.IsConstructCall()); @@ -807,3 +842,5 @@ void UDPWrap::GetSendQueueCount(const FunctionCallbackInfo& args) { } // namespace node NODE_BINDING_CONTEXT_AWARE_INTERNAL(udp_wrap, node::UDPWrap::Initialize) +NODE_BINDING_EXTERNAL_REFERENCE(udp_wrap, + node::UDPWrap::RegisterExternalReferences) diff --git a/src/udp_wrap.h b/src/udp_wrap.h index 3b8ca7df351a36..c0914dbf3a7f3f 100644 --- a/src/udp_wrap.h +++ b/src/udp_wrap.h @@ -32,6 +32,7 @@ namespace node { +class ExternalReferenceRegistry; class UDPWrapBase; // A listener that can be attached to an `UDPWrapBase` object and generally @@ -110,6 +111,7 @@ class UDPWrapBase { static void RecvStart(const v8::FunctionCallbackInfo& args); static void RecvStop(const v8::FunctionCallbackInfo& args); static void AddMethods(Environment* env, v8::Local t); + static void RegisterExternalReferences(ExternalReferenceRegistry* registry); private: UDPListener* listener_ = nullptr; @@ -126,6 +128,7 @@ class UDPWrap final : public HandleWrap, v8::Local unused, v8::Local context, void* priv); + static void RegisterExternalReferences(ExternalReferenceRegistry* registry); static void GetFD(const v8::FunctionCallbackInfo& args); static void New(const v8::FunctionCallbackInfo& args); static void Open(const v8::FunctionCallbackInfo& args); diff --git a/src/undici_version.h b/src/undici_version.h index 6631e1443fdfbb..02433e7e0c3a84 100644 --- a/src/undici_version.h +++ b/src/undici_version.h @@ -2,5 +2,5 @@ // Refer to tools/dep_updaters/update-undici.sh #ifndef SRC_UNDICI_VERSION_H_ #define SRC_UNDICI_VERSION_H_ -#define UNDICI_VERSION "5.26.3" +#define UNDICI_VERSION "5.28.2" #endif // SRC_UNDICI_VERSION_H_ diff --git a/src/util.cc b/src/util.cc index 19fb91c959a205..22b17c6f5f6a08 100644 --- a/src/util.cc +++ b/src/util.cc @@ -20,6 +20,7 @@ // USE OR OTHER DEALINGS IN THE SOFTWARE. #include "util.h" // NOLINT(build/include_inline) +#include #include "util-inl.h" #include "debug_utils-inl.h" @@ -31,6 +32,7 @@ #include "node_v8_platform-inl.h" #include "string_bytes.h" #include "uv.h" +#include "v8-value.h" #ifdef _WIN32 #include // _S_IREAD _S_IWRITE @@ -678,7 +680,7 @@ Local UnionBytes::ToStringChecked(Isolate* isolate) const { } } -RAIIIsolate::RAIIIsolate(const SnapshotData* data) +RAIIIsolateWithoutEntering::RAIIIsolateWithoutEntering(const SnapshotData* data) : allocator_{ArrayBuffer::Allocator::NewDefaultAllocator()} { isolate_ = Isolate::Allocate(); CHECK_NOT_NULL(isolate_); @@ -692,9 +694,97 @@ RAIIIsolate::RAIIIsolate(const SnapshotData* data) Isolate::Initialize(isolate_, params); } -RAIIIsolate::~RAIIIsolate() { +RAIIIsolateWithoutEntering::~RAIIIsolateWithoutEntering() { per_process::v8_platform.Platform()->UnregisterIsolate(isolate_); isolate_->Dispose(); } +RAIIIsolate::RAIIIsolate(const SnapshotData* data) + : isolate_{data}, isolate_scope_{isolate_.get()} {} + +RAIIIsolate::~RAIIIsolate() {} + +// Returns a string representation of the input value, including type. +// JavaScript implementation is available in lib/internal/errors.js +std::string DetermineSpecificErrorType(Environment* env, + v8::Local input) { + if (input->IsFunction()) { + return "function"; + } else if (input->IsString()) { + auto value = Utf8Value(env->isolate(), input).ToString(); + if (value.size() > 28) { + value = value.substr(0, 25) + "..."; + } + if (value.find('\'') == std::string::npos) { + return SPrintF("type string ('%s')", value); + } + + // Stringify the input value. + Local stringified = + v8::JSON::Stringify(env->context(), input).ToLocalChecked(); + Utf8Value stringified_value(env->isolate(), stringified); + return SPrintF("type string (%s)", stringified_value.out()); + } else if (input->IsObject()) { + v8::Local constructor_name = + input.As()->GetConstructorName(); + Utf8Value name(env->isolate(), constructor_name); + return SPrintF("an instance of %s", name.out()); + } + + Utf8Value utf8_value(env->isolate(), + input->ToString(env->context()).ToLocalChecked()); + + if (input->IsNumber() || input->IsInt32() || input->IsUint32()) { + auto value = input.As()->Value(); + if (std::isnan(value)) { + return "type number (NaN)"; + } else if (std::isinf(value)) { + return "type number (Infinity)"; + } + return SPrintF("type number (%s)", utf8_value.out()); + } else if (input->IsBigInt() || input->IsBoolean() || input->IsSymbol()) { + Utf8Value type(env->isolate(), input->TypeOf(env->isolate())); + return SPrintF("type %s (%s)", type.out(), utf8_value.out()); + } + + // For example: null, undefined + return utf8_value.ToString(); +} + +v8::Maybe GetValidatedFd(Environment* env, + v8::Local input) { + if (!input->IsInt32() && !input->IsNumber()) { + std::string error_type = node::DetermineSpecificErrorType(env, input); + THROW_ERR_INVALID_ARG_TYPE(env, + "The \"fd\" argument must be of type " + "number. Received %s", + error_type.c_str()); + return v8::Nothing(); + } + + const double fd = input.As()->Value(); + const bool is_out_of_range = fd < 0 || fd > INT32_MAX; + + if (is_out_of_range || !IsSafeJsInt(input)) { + Utf8Value utf8_value( + env->isolate(), input->ToDetailString(env->context()).ToLocalChecked()); + if (is_out_of_range && !std::isinf(fd)) { + THROW_ERR_OUT_OF_RANGE(env, + "The value of \"fd\" is out of range. " + "It must be >= 0 && <= %s. Received %s", + std::to_string(INT32_MAX), + utf8_value.out()); + } else { + THROW_ERR_OUT_OF_RANGE( + env, + "The value of \"fd\" is out of range. It must be an integer. " + "Received %s", + utf8_value.out()); + } + return v8::Nothing(); + } + + return v8::Just(static_cast(fd)); +} + } // namespace node diff --git a/src/util.h b/src/util.h index 344f7753dab2b1..83e5d226701b9b 100644 --- a/src/util.h +++ b/src/util.h @@ -113,9 +113,11 @@ struct AssertionInfo { const char* message; const char* function; }; -[[noreturn]] void NODE_EXTERN_PRIVATE Assert(const AssertionInfo& info); -[[noreturn]] void NODE_EXTERN_PRIVATE Abort(); -void DumpBacktrace(FILE* fp); + +// This indirectly calls backtrace so it can not be marked as [[noreturn]]. +void NODE_EXTERN_PRIVATE Assert(const AssertionInfo& info); +void DumpNativeBacktrace(FILE* fp); +void DumpJavaScriptBacktrace(FILE* fp); // Windows 8+ does not like abort() in Release mode #ifdef _WIN32 @@ -124,16 +126,32 @@ void DumpBacktrace(FILE* fp); #define ABORT_NO_BACKTRACE() abort() #endif -#define ABORT() node::Abort() +// Caller of this macro must not be marked as [[noreturn]]. Printing of +// backtraces may not work correctly in [[noreturn]] functions because +// when generating code for them the compiler can choose not to +// maintain the frame pointers or link registers that are necessary for +// correct backtracing. +// `ABORT` must be a macro and not a [[noreturn]] function to make sure the +// backtrace is correct. +#define ABORT() \ + do { \ + node::DumpNativeBacktrace(stderr); \ + node::DumpJavaScriptBacktrace(stderr); \ + fflush(stderr); \ + ABORT_NO_BACKTRACE(); \ + } while (0) -#define ERROR_AND_ABORT(expr) \ - do { \ - /* Make sure that this struct does not end up in inline code, but */ \ - /* rather in a read-only data section when modifying this code. */ \ - static const node::AssertionInfo args = { \ - __FILE__ ":" STRINGIFY(__LINE__), #expr, PRETTY_FUNCTION_NAME \ - }; \ - node::Assert(args); \ +#define ERROR_AND_ABORT(expr) \ + do { \ + /* Make sure that this struct does not end up in inline code, but */ \ + /* rather in a read-only data section when modifying this code. */ \ + static const node::AssertionInfo args = { \ + __FILE__ ":" STRINGIFY(__LINE__), #expr, PRETTY_FUNCTION_NAME}; \ + node::Assert(args); \ + /* `node::Assert` doesn't return. Add an [[noreturn]] abort() here to */ \ + /* make the compiler happy about no return value in the caller */ \ + /* function when calling ERROR_AND_ABORT. */ \ + ABORT_NO_BACKTRACE(); \ } while (0) #ifdef __GNUC__ @@ -968,11 +986,11 @@ void SetConstructorFunction(v8::Isolate* isolate, SetConstructorFunctionFlag flag = SetConstructorFunctionFlag::SET_CLASS_NAME); -// Simple RAII class to spin up a v8::Isolate instance. -class RAIIIsolate { +// Like RAIIIsolate, except doesn't enter the isolate while it's in scope. +class RAIIIsolateWithoutEntering { public: - explicit RAIIIsolate(const SnapshotData* data = nullptr); - ~RAIIIsolate(); + explicit RAIIIsolateWithoutEntering(const SnapshotData* data = nullptr); + ~RAIIIsolateWithoutEntering(); v8::Isolate* get() const { return isolate_; } @@ -981,6 +999,25 @@ class RAIIIsolate { v8::Isolate* isolate_; }; +// Simple RAII class to spin up a v8::Isolate instance and enter it +// immediately. +class RAIIIsolate { + public: + explicit RAIIIsolate(const SnapshotData* data = nullptr); + ~RAIIIsolate(); + + v8::Isolate* get() const { return isolate_.get(); } + + private: + RAIIIsolateWithoutEntering isolate_; + v8::Isolate::Scope isolate_scope_; +}; + +std::string DetermineSpecificErrorType(Environment* env, + v8::Local input); + +v8::Maybe GetValidatedFd(Environment* env, v8::Local input); + } // namespace node #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS diff --git a/src/zlib_version.h b/src/zlib_version.h new file mode 100644 index 00000000000000..10aa3283c81aab --- /dev/null +++ b/src/zlib_version.h @@ -0,0 +1,6 @@ +// This is an auto generated file, please do not edit. +// Refer to tools/dep_updaters/update-zlib.sh +#ifndef SRC_ZLIB_VERSION_H_ +#define SRC_ZLIB_VERSION_H_ +#define ZLIB_VERSION "1.3.0.1-motley-40e35a7" +#endif // SRC_ZLIB_VERSION_H_ diff --git a/test/.eslintrc.yaml b/test/.eslintrc.yaml index ef1336e34c79dc..1c1cfd4ef93e9a 100644 --- a/test/.eslintrc.yaml +++ b/test/.eslintrc.yaml @@ -49,6 +49,8 @@ rules: message: Use 'test' as debuglog value in tests. - selector: CallExpression:matches([callee.object.name="common"][callee.property.name=/^must(Not)?Call/],[callee.name="mustCall"],[callee.name="mustCallAtLeast"],[callee.name="mustNotCall"])>:first-child[type=/FunctionExpression$/][body.body.length=0] message: Do not use an empty function, omit the parameter altogether. + - selector: ExpressionStatement>CallExpression:matches([callee.name='rejects'], [callee.object.name='assert'][callee.property.name='rejects']) + message: Calling `assert.rejects` without `await` or `.then(common.mustCall())` will not detect never-settling promises. - selector: Identifier[name='webcrypto'] message: Use `globalThis.crypto`. diff --git a/test/abort/test-abort-backtrace.js b/test/abort/test-abort-backtrace.js index b609ec7e4e6a7a..ce9ed39196eb1f 100644 --- a/test/abort/test-abort-backtrace.js +++ b/test/abort/test-abort-backtrace.js @@ -10,19 +10,22 @@ if (process.argv[2] === 'child') { const stderr = child.stderr.toString(); assert.strictEqual(child.stdout.toString(), ''); - // Stderr will be empty for systems that don't support backtraces. - if (stderr !== '') { - const frames = stderr.trimRight().split('\n').map((s) => s.trim()); + const { nativeStack, jsStack } = common.getPrintedStackTrace(stderr); - if (!frames.every((frame, index) => frame.startsWith(`${index + 1}:`))) { - assert.fail(`Each frame should start with a frame number:\n${stderr}`); - } + if (!nativeStack.every((frame, index) => frame.startsWith(`${index + 1}:`))) { + assert.fail(`Each frame should start with a frame number:\n${stderr}`); + } - if (!common.isWindows) { - const { getBinaryPath } = require('../common/shared-lib-util'); - if (!frames.some((frame) => frame.includes(`[${getBinaryPath()}]`))) { - assert.fail(`Some frames should include the binary name:\n${stderr}`); - } + // For systems that don't support backtraces, the native stack is + // going to be empty. + if (!common.isWindows && nativeStack.length > 0) { + const { getBinaryPath } = require('../common/shared-lib-util'); + if (!nativeStack.some((frame) => frame.includes(`[${getBinaryPath()}]`))) { + assert.fail(`Some native stack frame include the binary name:\n${stderr}`); } } + + if (jsStack.length > 0) { + assert(jsStack.some((frame) => frame.includes(__filename))); + } } diff --git a/test/abort/test-abort-fatal-error.js b/test/abort/test-abort-fatal-error.js index b723b5b920849b..6c197ceb028540 100644 --- a/test/abort/test-abort-fatal-error.js +++ b/test/abort/test-abort-fatal-error.js @@ -38,10 +38,5 @@ exec(cmdline, function(err, stdout, stderr) { assert(false, 'this test should fail'); } - if (err.code !== 134 && err.signal !== 'SIGABRT') { - console.log(stdout); - console.log(stderr); - console.log(err); - assert(false, err); - } + assert(common.nodeProcessAborted(err.code, err.signal)); }); diff --git a/test/abort/test-addon-uv-handle-leak.js b/test/abort/test-addon-uv-handle-leak.js index d2c4f8e646f457..dad245ad61bbb2 100644 --- a/test/abort/test-addon-uv-handle-leak.js +++ b/test/abort/test-addon-uv-handle-leak.js @@ -88,6 +88,9 @@ if (process.argv[2] === 'child') { while (lines.length > 0) { const line = lines.shift().trim(); + if (line.length === 0) { + continue; // Skip empty lines. + } switch (state) { case 'initial': @@ -96,7 +99,7 @@ if (process.argv[2] === 'child') { break; case 'handle-start': if (/^uv loop at \[.+\] has \d+ open handles in total$/.test(line)) { - state = 'assertion-failure'; + state = 'source-line'; break; } assert.match(line, /^\[.+\] timer( \(active\))?$/); @@ -116,8 +119,12 @@ if (process.argv[2] === 'child') { } state = 'handle-start'; break; + case 'source-line': + assert.match(line, /CheckedUvLoopClose/); + state = 'assertion-failure'; + break; case 'assertion-failure': - assert.match(line, /Assertion .+ failed/); + assert.match(line, /Assertion failed:/); state = 'done'; break; case 'done': diff --git a/test/addons/worker-buffer-callback/test-free-called.js b/test/addons/worker-buffer-callback/test-free-called.js index 2a3cc9e47c22ff..c15cdde432cd31 100644 --- a/test/addons/worker-buffer-callback/test-free-called.js +++ b/test/addons/worker-buffer-callback/test-free-called.js @@ -6,12 +6,14 @@ const { Worker } = require('worker_threads'); const binding = path.resolve(__dirname, `./build/${common.buildType}/binding`); const { getFreeCallCount } = require(binding); +// getFreeCallCount initial value is 0 +assert.strictEqual(getFreeCallCount(), 0); + // Test that buffers allocated with a free callback through our APIs are // released when a Worker owning it exits. const w = new Worker(`require(${JSON.stringify(binding)})`, { eval: true }); -assert.strictEqual(getFreeCallCount(), 0); w.on('exit', common.mustCall(() => { assert.strictEqual(getFreeCallCount(), 1); })); diff --git a/test/async-hooks/async-hooks.status b/test/async-hooks/async-hooks.status index 673883e4fe3d4d..dbcb29baed84a0 100644 --- a/test/async-hooks/async-hooks.status +++ b/test/async-hooks/async-hooks.status @@ -21,3 +21,5 @@ test-callback-error: PASS, FLAKY [$system==freebsd] [$system==aix] +# https://github.com/nodejs/node/issues/50245 +test-emit-after-on-destroyed: PASS, FLAKY diff --git a/test/benchmark/benchmark.status b/test/benchmark/benchmark.status index 6a966743aab26b..65e4d815552d3c 100644 --- a/test/benchmark/benchmark.status +++ b/test/benchmark/benchmark.status @@ -19,3 +19,4 @@ prefix benchmark [$system==aix] [$arch==arm] + diff --git a/test/benchmark/test-benchmark-validators.js b/test/benchmark/test-benchmark-validators.js index 3a6caba9b0bb20..37250f56588f51 100644 --- a/test/benchmark/test-benchmark-validators.js +++ b/test/benchmark/test-benchmark-validators.js @@ -4,7 +4,6 @@ require('../common'); // Minimal test for assert benchmarks. This makes sure the benchmarks aren't // completely broken but nothing more than that. - const runBenchmark = require('../common/benchmark'); runBenchmark('validators'); diff --git a/test/benchmark/test-benchmark-websocket.js b/test/benchmark/test-benchmark-websocket.js new file mode 100644 index 00000000000000..d02e46a76b4e9e --- /dev/null +++ b/test/benchmark/test-benchmark-websocket.js @@ -0,0 +1,9 @@ +'use strict'; + +const common = require('../common'); +if (!common.enoughTestMem) + common.skip('Insufficient memory for Websocket benchmark test'); + +const runBenchmark = require('../common/benchmark'); + +runBenchmark('websocket', { NODEJS_BENCHMARK_ZERO_ALLOWED: 1 }); diff --git a/test/cctest/test_environment.cc b/test/cctest/test_environment.cc index 2e747c7be58922..9b812408154287 100644 --- a/test/cctest/test_environment.cc +++ b/test/cctest/test_environment.cc @@ -686,8 +686,13 @@ TEST_F(EnvironmentTest, NestedMicrotaskQueue) { std::unique_ptr queue = v8::MicrotaskQueue::New( isolate_, v8::MicrotasksPolicy::kExplicit); - v8::Local context = v8::Context::New( - isolate_, nullptr, {}, {}, {}, queue.get()); + v8::Local context = + v8::Context::New(isolate_, + nullptr, + {}, + {}, + v8::DeserializeInternalFieldsCallback(), + queue.get()); node::InitializeContext(context); v8::Context::Scope context_scope(context); diff --git a/test/cctest/test_linked_binding.cc b/test/cctest/test_linked_binding.cc index 6b934608cc0853..19ea2b8f228ebb 100644 --- a/test/cctest/test_linked_binding.cc +++ b/test/cctest/test_linked_binding.cc @@ -250,7 +250,8 @@ napi_value NapiLinkedWithInstanceData(napi_env env, napi_value exports) { napi_value key, value; CHECK_EQ(napi_create_string_utf8(env, "hello", NAPI_AUTO_LENGTH, &key), napi_ok); - CHECK_EQ(napi_create_external(env, instance_data, nullptr, nullptr, &value), + CHECK_EQ(napi_create_external_arraybuffer( + env, instance_data, 1, nullptr, nullptr, &value), napi_ok); CHECK_EQ(napi_set_property(env, exports, key, value), napi_ok); return nullptr; @@ -289,9 +290,9 @@ TEST_F(LinkedBindingTest, LocallyDefinedLinkedBindingNapiInstanceDataTest) { .ToLocalChecked(); v8::Local completion_value = script->Run(context).ToLocalChecked(); - CHECK(completion_value->IsExternal()); + CHECK(completion_value->IsArrayBuffer()); instance_data = - static_cast(completion_value.As()->Value()); + static_cast(completion_value.As()->Data()); CHECK_NE(instance_data, nullptr); CHECK_EQ(*instance_data, 0); } @@ -327,9 +328,9 @@ TEST_F(LinkedBindingTest, .ToLocalChecked(); v8::Local completion_value = script->Run(context).ToLocalChecked(); - CHECK(completion_value->IsExternal()); + CHECK(completion_value->IsArrayBuffer()); instance_data = - static_cast(completion_value.As()->Value()); + static_cast(completion_value.As()->Data()); CHECK_NE(instance_data, nullptr); CHECK_EQ(*instance_data, 0); } diff --git a/test/cctest/test_path.cc b/test/cctest/test_path.cc new file mode 100644 index 00000000000000..44f3b30ddff341 --- /dev/null +++ b/test/cctest/test_path.cc @@ -0,0 +1,47 @@ +#include "debug_utils-inl.h" +#include "env-inl.h" +#include "gtest/gtest.h" +#include "node_options.h" +#include "node_test_fixture.h" +#include "path.h" + +using node::PathResolve; + +class PathTest : public EnvironmentTestFixture {}; + +TEST_F(PathTest, PathResolve) { + const v8::HandleScope handle_scope(isolate_); + Argv argv; + Env env{handle_scope, argv, node::EnvironmentFlags::kNoBrowserGlobals}; + auto cwd = (*env)->GetCwd((*env)->exec_path()); +#ifdef _WIN32 + EXPECT_EQ(PathResolve(*env, {"c:/blah\\blah", "d:/games", "c:../a"}), + "c:\\blah\\a"); + EXPECT_EQ(PathResolve(*env, {"c:/ignore", "d:\\a/b\\c/d", "\\e.exe"}), + "d:\\e.exe"); + EXPECT_EQ(PathResolve(*env, {"c:/ignore", "c:/some/file"}), "c:\\some\\file"); + EXPECT_EQ(PathResolve(*env, {"d:/ignore", "d:some/dir//"}), + "d:\\ignore\\some\\dir"); + EXPECT_EQ(PathResolve(*env, {"."}), cwd); + EXPECT_EQ(PathResolve(*env, {"//server/share", "..", "relative\\"}), + "\\\\server\\share\\relative"); + EXPECT_EQ(PathResolve(*env, {"c:/", "//"}), "c:\\"); + EXPECT_EQ(PathResolve(*env, {"c:/", "//dir"}), "c:\\dir"); + EXPECT_EQ(PathResolve(*env, {"c:/", "//server/share"}), + "\\\\server\\share\\"); + EXPECT_EQ(PathResolve(*env, {"c:/", "//server//share"}), + "\\\\server\\share\\"); + EXPECT_EQ(PathResolve(*env, {"c:/", "///some//dir"}), "c:\\some\\dir"); + EXPECT_EQ( + PathResolve(*env, {"C:\\foo\\tmp.3\\", "..\\tmp.3\\cycles\\root.js"}), + "C:\\foo\\tmp.3\\cycles\\root.js"); +#else + EXPECT_EQ(PathResolve(*env, {"/var/lib", "../", "file/"}), "/var/file"); + EXPECT_EQ(PathResolve(*env, {"/var/lib", "/../", "file/"}), "/file"); + EXPECT_EQ(PathResolve(*env, {"a/b/c/", "../../.."}), cwd); + EXPECT_EQ(PathResolve(*env, {"."}), cwd); + EXPECT_EQ(PathResolve(*env, {"/some/dir", ".", "/absolute/"}), "/absolute"); + EXPECT_EQ(PathResolve(*env, {"/foo/tmp.3/", "../tmp.3/cycles/root.js"}), + "/foo/tmp.3/cycles/root.js"); +#endif +} diff --git a/test/cctest/test_quic_tokens.cc b/test/cctest/test_quic_tokens.cc index c02bab54646f7d..cf5b12da4d558a 100644 --- a/test/cctest/test_quic_tokens.cc +++ b/test/cctest/test_quic_tokens.cc @@ -14,6 +14,21 @@ using node::quic::RetryToken; using node::quic::StatelessResetToken; using node::quic::TokenSecret; +TEST(TokenScret, Basics) { + uint8_t secret[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6}; + TokenSecret fixed_secret(secret); + + for (int n = 0; n < TokenSecret::QUIC_TOKENSECRET_LEN; n++) { + CHECK_EQ(fixed_secret[n], secret[n]); + } + + // Copy assignment works + TokenSecret other = fixed_secret; + for (int n = 0; n < TokenSecret::QUIC_TOKENSECRET_LEN; n++) { + CHECK_EQ(other[n], secret[n]); + } +} + TEST(StatelessResetToken, Basic) { ngtcp2_cid cid_; uint8_t secret[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6}; diff --git a/test/cctest/test_util.cc b/test/cctest/test_util.cc index 5b83e07db3b7c2..79113965f50e36 100644 --- a/test/cctest/test_util.cc +++ b/test/cctest/test_util.cc @@ -1,8 +1,13 @@ #include "debug_utils-inl.h" #include "env-inl.h" #include "gtest/gtest.h" +#include "node_options-inl.h" +#include "node_test_fixture.h" #include "simdutf.h" #include "util-inl.h" +#include "v8-function-callback.h" +#include "v8-primitive.h" +#include "v8.h" using node::Calloc; using node::Malloc; @@ -14,7 +19,9 @@ using node::ToLower; using node::UncheckedCalloc; using node::UncheckedMalloc; -TEST(UtilTest, ListHead) { +class UtilTest : public EnvironmentTestFixture {}; + +TEST_F(UtilTest, ListHead) { struct Item { node::ListNode node_; }; typedef node::ListHead List; @@ -68,7 +75,7 @@ TEST(UtilTest, ListHead) { EXPECT_FALSE(list.begin() != list.end()); } -TEST(UtilTest, StringEqualNoCase) { +TEST_F(UtilTest, StringEqualNoCase) { EXPECT_FALSE(StringEqualNoCase("a", "b")); EXPECT_TRUE(StringEqualNoCase("", "")); EXPECT_TRUE(StringEqualNoCase("equal", "equal")); @@ -78,7 +85,7 @@ TEST(UtilTest, StringEqualNoCase) { EXPECT_FALSE(StringEqualNoCase("equals", "equal")); } -TEST(UtilTest, StringEqualNoCaseN) { +TEST_F(UtilTest, StringEqualNoCaseN) { EXPECT_FALSE(StringEqualNoCaseN("a", "b", strlen("a"))); EXPECT_TRUE(StringEqualNoCaseN("", "", strlen(""))); EXPECT_TRUE(StringEqualNoCaseN("equal", "equal", strlen("equal"))); @@ -92,7 +99,7 @@ TEST(UtilTest, StringEqualNoCaseN) { EXPECT_FALSE(StringEqualNoCaseN("abc\0abc", "abcd\0efg", strlen("abcdefgh"))); } -TEST(UtilTest, ToLower) { +TEST_F(UtilTest, ToLower) { EXPECT_EQ('0', ToLower('0')); EXPECT_EQ('a', ToLower('a')); EXPECT_EQ('a', ToLower('A')); @@ -105,28 +112,28 @@ TEST(UtilTest, ToLower) { free(pointer); \ } while (0) -TEST(UtilTest, Malloc) { +TEST_F(UtilTest, Malloc) { TEST_AND_FREE(Malloc, 0); TEST_AND_FREE(Malloc, 1); TEST_AND_FREE(Malloc, 0); TEST_AND_FREE(Malloc, 1); } -TEST(UtilTest, Calloc) { +TEST_F(UtilTest, Calloc) { TEST_AND_FREE(Calloc, 0); TEST_AND_FREE(Calloc, 1); TEST_AND_FREE(Calloc, 0); TEST_AND_FREE(Calloc, 1); } -TEST(UtilTest, UncheckedMalloc) { +TEST_F(UtilTest, UncheckedMalloc) { TEST_AND_FREE(UncheckedMalloc, 0); TEST_AND_FREE(UncheckedMalloc, 1); TEST_AND_FREE(UncheckedMalloc, 0); TEST_AND_FREE(UncheckedMalloc, 1); } -TEST(UtilTest, UncheckedCalloc) { +TEST_F(UtilTest, UncheckedCalloc) { TEST_AND_FREE(UncheckedCalloc, 0); TEST_AND_FREE(UncheckedCalloc, 1); TEST_AND_FREE(UncheckedCalloc, 0); @@ -212,7 +219,7 @@ static void MaybeStackBufferBasic() { free(rawbuf); } -TEST(UtilTest, MaybeStackBuffer) { +TEST_F(UtilTest, MaybeStackBuffer) { MaybeStackBufferBasic(); MaybeStackBufferBasic(); @@ -253,7 +260,7 @@ TEST(UtilTest, MaybeStackBuffer) { } } -TEST(UtilTest, SPrintF) { +TEST_F(UtilTest, SPrintF) { // %d, %u and %s all do the same thing. The actual C++ type is used to infer // the right representation. EXPECT_EQ(SPrintF("%s", false), "false"); @@ -299,3 +306,51 @@ TEST(UtilTest, SPrintF) { const std::string with_zero = std::string("a") + '\0' + 'b'; EXPECT_EQ(SPrintF("%s", with_zero), with_zero); } + +TEST_F(UtilTest, DumpJavaScriptStackWithNoIsolate) { + node::DumpJavaScriptBacktrace(stderr); +} + +TEST_F(UtilTest, DetermineSpecificErrorType) { + const v8::HandleScope handle_scope(isolate_); + Argv argv; + Env env{handle_scope, argv, node::EnvironmentFlags::kNoBrowserGlobals}; + + // Boolean + EXPECT_EQ( + node::DetermineSpecificErrorType(*env, v8::Boolean::New(isolate_, true)), + "type boolean (true)"); + + // BigInt + EXPECT_EQ( + node::DetermineSpecificErrorType(*env, v8::BigInt::New(isolate_, 255)), + "type bigint (255)"); + + // String + EXPECT_EQ( + node::DetermineSpecificErrorType( + *env, v8::String::NewFromUtf8(isolate_, "input").ToLocalChecked()), + "type string ('input')"); + // String that calls JSONStringify + EXPECT_EQ( + node::DetermineSpecificErrorType( + *env, v8::String::NewFromUtf8(isolate_, "'input'").ToLocalChecked()), + "type string (\"'input'\")"); + EXPECT_EQ(node::DetermineSpecificErrorType( + *env, + v8::String::NewFromUtf8(isolate_, + "string with more than 26 characters") + .ToLocalChecked()), + "type string ('string with more than 26 ...')"); + + // Number, Int32, Uint32 + EXPECT_EQ( + node::DetermineSpecificErrorType(*env, v8::Number::New(isolate_, 10)), + "type number (10)"); + EXPECT_EQ( + node::DetermineSpecificErrorType(*env, v8::Int32::New(isolate_, -255)), + "type number (-255)"); + EXPECT_EQ( + node::DetermineSpecificErrorType(*env, v8::Uint32::New(isolate_, 255)), + "type number (255)"); +} diff --git a/test/common/dns.js b/test/common/dns.js index 2ee4bff5182699..578f823684bbf9 100644 --- a/test/common/dns.js +++ b/test/common/dns.js @@ -2,6 +2,7 @@ const assert = require('assert'); const os = require('os'); +const { isIP } = require('net'); const types = { A: 1, @@ -309,6 +310,25 @@ function errorLookupMock(code = mockedErrorCode, syscall = mockedSysCall) { }; } +function createMockedLookup(...addresses) { + addresses = addresses.map((address) => ({ address: address, family: isIP(address) })); + + // Create a DNS server which replies with a AAAA and a A record for the same host + return function lookup(hostname, options, cb) { + if (options.all === true) { + process.nextTick(() => { + cb(null, addresses); + }); + + return; + } + + process.nextTick(() => { + cb(null, addresses[0].address, addresses[0].family); + }); + }; +} + module.exports = { types, classes, @@ -317,4 +337,5 @@ module.exports = { errorLookupMock, mockedErrorCode, mockedSysCall, + createMockedLookup, }; diff --git a/test/common/fixtures.js b/test/common/fixtures.js index 3ee87e8b2d7b59..75815b035ba186 100644 --- a/test/common/fixtures.js +++ b/test/common/fixtures.js @@ -28,6 +28,23 @@ function readFixtureKeys(enc, ...names) { return names.map((name) => readFixtureKey(name, enc)); } +// This should be in sync with test/fixtures/utf8_test_text.txt. +// We copy them here as a string because this is supposed to be used +// in fs API tests. +const utf8TestText = '永和九年,嵗在癸丑,暮春之初,會於會稽山隂之蘭亭,脩稧事也。' + + '羣賢畢至,少長咸集。此地有崇山峻領,茂林脩竹;又有清流激湍,' + + '暎帶左右。引以為流觴曲水,列坐其次。雖無絲竹管弦之盛,一觴一詠,' + + '亦足以暢敘幽情。是日也,天朗氣清,恵風和暢;仰觀宇宙之大,' + + '俯察品類之盛;所以遊目騁懐,足以極視聽之娛,信可樂也。夫人之相與,' + + '俯仰一世,或取諸懐抱,悟言一室之內,或因寄所託,放浪形骸之外。' + + '雖趣舎萬殊,靜躁不同,當其欣扵所遇,暫得扵己,怏然自足,' + + '不知老之將至。及其所之既惓,情隨事遷,感慨係之矣。向之所欣,' + + '俛仰之閒以為陳跡,猶不能不以之興懐;況脩短隨化,終期扵盡。' + + '古人云:「死生亦大矣。」豈不痛哉!每攬昔人興感之由,若合一契,' + + '未嘗不臨文嗟悼,不能喻之扵懐。固知一死生為虛誕,齊彭殤為妄作。' + + '後之視今,亦由今之視昔,悲夫!故列敘時人,錄其所述,雖世殊事異,' + + '所以興懐,其致一也。後之攬者,亦將有感扵斯文。'; + module.exports = { fixturesDir, path: fixturesPath, @@ -35,4 +52,8 @@ module.exports = { readSync: readFixtureSync, readKey: readFixtureKey, readKeys: readFixtureKeys, + utf8TestText, + get utf8TestTextPath() { + return fixturesPath('utf8_test_text.txt'); + }, }; diff --git a/test/common/gc.js b/test/common/gc.js index af637af7bedcd6..4671a5422641ca 100644 --- a/test/common/gc.js +++ b/test/common/gc.js @@ -1,5 +1,7 @@ 'use strict'; +const wait = require('timers/promises').setTimeout; + // TODO(joyeecheung): merge ongc.js and gcUntil from common/index.js // into this. @@ -65,6 +67,62 @@ async function checkIfCollectable( createObject(); } +// Repeat an operation and give GC some breathing room at every iteration. +async function runAndBreathe(fn, repeat, waitTime = 20) { + for (let i = 0; i < repeat; i++) { + await fn(); + await wait(waitTime); + } +} + +/** + * This requires --expose-internals. + * This function can be used to check if an object factory leaks or not by + * iterating over the heap and count objects with the specified class + * (which is checked by looking up the prototype chain). + * @param {(i: number) => number} fn The factory receiving iteration count + * and returning number of objects created. The return value should be + * precise otherwise false negatives can be produced. + * @param {Function} klass The class whose object is used to count the objects + * @param {number} count Number of iterations that this check should be done + * @param {number} waitTime Optional breathing time for GC. + */ +async function checkIfCollectableByCounting(fn, klass, count, waitTime = 20) { + const { internalBinding } = require('internal/test/binding'); + const { countObjectsWithPrototype } = internalBinding('heap_utils'); + const { prototype, name } = klass; + const initialCount = countObjectsWithPrototype(prototype); + console.log(`Initial count of ${name}: ${initialCount}`); + let totalCreated = 0; + for (let i = 0; i < count; ++i) { + const created = await fn(i); + totalCreated += created; + console.log(`#${i}: created ${created} ${name}, total ${totalCreated}`); + await wait(waitTime); // give GC some breathing room. + const currentCount = countObjectsWithPrototype(prototype); + const collected = totalCreated - (currentCount - initialCount); + console.log(`#${i}: counted ${currentCount} ${name}, collected ${collected}`); + if (collected > 0) { + console.log(`Detected ${collected} collected ${name}, finish early`); + return; + } + } + + await wait(waitTime); // give GC some breathing room. + const currentCount = countObjectsWithPrototype(prototype); + const collected = totalCreated - (currentCount - initialCount); + console.log(`Last count: counted ${currentCount} ${name}, collected ${collected}`); + // Some objects with the prototype can be collected. + if (collected > 0) { + console.log(`Detected ${collected} collected ${name}`); + return; + } + + throw new Error(`${name} cannot be collected`); +} + module.exports = { checkIfCollectable, + runAndBreathe, + checkIfCollectableByCounting, }; diff --git a/test/common/index.js b/test/common/index.js index 6345a636a0f805..2ac981608b4e92 100644 --- a/test/common/index.js +++ b/test/common/index.js @@ -906,6 +906,45 @@ function spawnPromisified(...args) { }); } +function getPrintedStackTrace(stderr) { + const lines = stderr.split('\n'); + + let state = 'initial'; + const result = { + message: [], + nativeStack: [], + jsStack: [], + }; + for (let i = 0; i < lines.length; ++i) { + const line = lines[i].trim(); + if (line.length === 0) { + continue; // Skip empty lines. + } + + switch (state) { + case 'initial': + result.message.push(line); + if (line.includes('Native stack trace')) { + state = 'native-stack'; + } else { + result.message.push(line); + } + break; + case 'native-stack': + if (line.includes('JavaScript stack trace')) { + state = 'js-stack'; + } else { + result.nativeStack.push(line); + } + break; + case 'js-stack': + result.jsStack.push(line); + break; + } + } + return result; +} + const common = { allowGlobals, buildType, @@ -919,6 +958,7 @@ const common = { getArrayBufferViews, getBufferSources, getCallSite, + getPrintedStackTrace, getTTYfd, hasIntl, hasCrypto, diff --git a/test/common/sea.js b/test/common/sea.js index cc1890a5464012..d57c9e4238d867 100644 --- a/test/common/sea.js +++ b/test/common/sea.js @@ -2,6 +2,7 @@ const common = require('../common'); const fixtures = require('../common/fixtures'); +const tmpdir = require('../common/tmpdir'); const { readFileSync } = require('fs'); const { @@ -43,6 +44,14 @@ function skipIfSingleExecutableIsNotSupported() { common.skip('On s390x, postject fails with `memory access out of bounds`.'); } } + + tmpdir.refresh(); + + // The SEA tests involve making a copy of the executable and writing some fixtures + // to the tmpdir. To be safe, ensure that at least 120MB disk space is available. + if (!tmpdir.hasEnoughSpace(120 * 1024 * 1024)) { + common.skip('Available disk space < 120MB'); + } } function injectAndCodeSign(targetExecutable, resource) { diff --git a/test/common/wpt.js b/test/common/wpt.js index 6ec6cd8c1ec6f2..7917e17729c7ee 100644 --- a/test/common/wpt.js +++ b/test/common/wpt.js @@ -58,46 +58,70 @@ function codeUnitStr(char) { return 'U+' + char.charCodeAt(0).toString(16); } +class ReportResult { + #startTime; + + constructor(name) { + this.test = name; + this.status = 'OK'; + this.subtests = []; + this.#startTime = Date.now(); + } + + addSubtest(name, status, message) { + const subtest = { + status, + // https://github.com/web-platform-tests/wpt/blob/b24eedd/resources/testharness.js#L3722 + name: sanitizeUnpairedSurrogates(name), + }; + if (message) { + // https://github.com/web-platform-tests/wpt/blob/b24eedd/resources/testharness.js#L4506 + subtest.message = sanitizeUnpairedSurrogates(message); + } + this.subtests.push(subtest); + return subtest; + } + + finish(status) { + this.status = status ?? 'OK'; + this.duration = Date.now() - this.#startTime; + } +} + +// Generates a report that can be uploaded to wpt.fyi. +// Checkout https://github.com/web-platform-tests/wpt.fyi/tree/main/api#results-creation +// for more details. class WPTReport { constructor(path) { this.filename = `report-${path.replaceAll('/', '-')}.json`; - this.results = []; + /** @type {Map} */ + this.results = new Map(); this.time_start = Date.now(); } - addResult(name, status) { - const result = { - test: name, - status, - subtests: [], - addSubtest(name, status, message) { - const subtest = { - status, - // https://github.com/web-platform-tests/wpt/blob/b24eedd/resources/testharness.js#L3722 - name: sanitizeUnpairedSurrogates(name), - }; - if (message) { - // https://github.com/web-platform-tests/wpt/blob/b24eedd/resources/testharness.js#L4506 - subtest.message = sanitizeUnpairedSurrogates(message); - } - this.subtests.push(subtest); - return subtest; - }, - }; - this.results.push(result); + /** + * Get or create a ReportResult for a test spec. + * @param {WPTTestSpec} spec + */ + getResult(spec) { + const name = `/${spec.getRelativePath()}${spec.variant}`; + if (this.results.has(name)) { + return this.results.get(name); + } + const result = new ReportResult(name); + this.results.set(name, result); return result; } write() { this.time_end = Date.now(); - this.results = this.results.filter((result) => { - return result.status === 'SKIP' || result.subtests.length !== 0; - }).map((result) => { - const url = new URL(result.test, 'http://wpt'); - url.pathname = url.pathname.replace(/\.js$/, '.html'); - result.test = url.href.slice(url.origin.length); - return result; - }); + const results = Array.from(this.results.values()) + .map((result) => { + const url = new URL(result.test, 'http://wpt'); + url.pathname = url.pathname.replace(/\.js$/, '.html'); + result.test = url.href.slice(url.origin.length); + return result; + }); /** * Return required and some optional properties @@ -110,7 +134,12 @@ class WPTReport { os: getOs(), }; - fs.writeFileSync(`out/wpt/${this.filename}`, JSON.stringify(this)); + fs.writeFileSync(`out/wpt/${this.filename}`, JSON.stringify({ + time_start: this.time_start, + time_end: this.time_end, + run_info: this.run_info, + results: results, + })); } } @@ -181,6 +210,7 @@ class ResourceLoader { const data = await fsPromises.readFile(file); return { ok: true, + arrayBuffer() { return data.buffer; }, json() { return JSON.parse(data.toString()); }, text() { return data.toString(); }, }; @@ -353,7 +383,7 @@ const kIntlRequirement = { // TODO(joyeecheung): we may need to deal with --with-intl=system-icu }; -class IntlRequirement { +class BuildRequirement { constructor() { this.currentIntl = kIntlRequirement.none; if (process.config.variables.v8_enable_i18n_support === 0) { @@ -366,6 +396,9 @@ class IntlRequirement { } else { this.currentIntl = kIntlRequirement.full; } + // Not using common.hasCrypto because of the global leak checks + this.hasCrypto = Boolean(process.versions.openssl) && + !process.env.NODE_SKIP_CRYPTO; } /** @@ -380,11 +413,14 @@ class IntlRequirement { if (requires.has('small-icu') && current < kIntlRequirement.small) { return 'small-icu'; } + if (requires.has('crypto') && !this.hasCrypto) { + return 'crypto'; + } return false; } } -const intlRequirements = new IntlRequirement(); +const buildRequirements = new BuildRequirement(); class StatusLoader { /** @@ -411,7 +447,7 @@ class StatusLoader { const list = this.grep(filepath); result = result.concat(list); } else { - if (!(/\.\w+\.js$/.test(filepath)) || filepath.endsWith('.helper.js')) { + if (!(/\.\w+\.js$/.test(filepath))) { continue; } result.push(filepath); @@ -581,7 +617,7 @@ class WPTRunner { 'ReadableStreamBYOBReader', 'ReadableStreamBYOBRequest', 'ReadableByteStreamController', 'ReadableStreamDefaultController', 'ByteLengthQueuingStrategy', 'CountQueuingStrategy', - 'TextEncoderStream', 'TextDecoderStream', + 'TextEncoder', 'TextDecoder', 'TextEncoderStream', 'TextDecoderStream', 'CompressionStream', 'DecompressionStream', ]; if (Boolean(process.versions.openssl) && !process.env.NODE_SKIP_CRYPTO) { @@ -642,14 +678,13 @@ class WPTRunner { this.inProgress.add(spec); this.workers.set(spec, worker); - let reportResult; + const reportResult = this.report?.getResult(spec); worker.on('message', (message) => { switch (message.type) { case 'result': - reportResult ||= this.report?.addResult(`/${relativePath}${spec.variant}`, 'OK'); return this.resultCallback(spec, message.result, reportResult); case 'completion': - return this.completionCallback(spec, message.status); + return this.completionCallback(spec, message.status, reportResult); default: throw new Error(`Unexpected message from worker: ${message.type}`); } @@ -661,6 +696,8 @@ class WPTRunner { // This can happen normally, for example in timers tests. return; } + // Generate a subtest failure for visibility. + // No need to record this synthetic failure with wpt.fyi. this.fail( spec, { @@ -671,6 +708,8 @@ class WPTRunner { }, kUncaught, ); + // Mark the whole test as failed in wpt.fyi report. + reportResult?.finish('ERROR'); this.inProgress.delete(spec); }); @@ -680,7 +719,11 @@ class WPTRunner { process.on('exit', () => { for (const spec of this.inProgress) { + // No need to record this synthetic failure with wpt.fyi. this.fail(spec, { name: 'Incomplete' }, kIncomplete); + // Mark the whole test as failed in wpt.fyi report. + const reportResult = this.report?.getResult(spec); + reportResult?.finish('ERROR'); } inspect.defaultOptions.depth = Infinity; // Sorts the rules to have consistent output @@ -780,6 +823,7 @@ class WPTRunner { * in one test file). * @param {WPTTestSpec} spec * @param {Test} test The Test object returned by WPT harness + * @param {ReportResult} reportResult The report result object */ resultCallback(spec, test, reportResult) { const status = this.getTestStatus(test.status); @@ -794,13 +838,29 @@ class WPTRunner { * Report the status of each WPT test (one per file) * @param {WPTTestSpec} spec * @param {object} harnessStatus - The status object returned by WPT harness. + * @param {ReportResult} reportResult The report result object */ - completionCallback(spec, harnessStatus) { + completionCallback(spec, harnessStatus, reportResult) { const status = this.getTestStatus(harnessStatus.status); // Treat it like a test case failure if (status === kTimeout) { + // No need to record this synthetic failure with wpt.fyi. this.fail(spec, { name: 'WPT testharness timeout' }, kTimeout); + // Mark the whole test as TIMEOUT in wpt.fyi report. + reportResult?.finish('TIMEOUT'); + } else if (status !== kPass) { + // No need to record this synthetic failure with wpt.fyi. + this.fail(spec, { + status: status, + name: 'WPT test harness error', + message: harnessStatus.message, + stack: harnessStatus.stack, + }, status); + // Mark the whole test as ERROR in wpt.fyi report. + reportResult?.finish('ERROR'); + } else { + reportResult?.finish(); } this.inProgress.delete(spec); // Always force termination of the worker. Some tests allocate resources @@ -892,9 +952,9 @@ class WPTRunner { continue; } - const lackingIntl = intlRequirements.isLacking(spec.requires); - if (lackingIntl) { - this.skip(spec, [ `requires ${lackingIntl}` ]); + const lackingSupport = buildRequirements.isLacking(spec.requires); + if (lackingSupport) { + this.skip(spec, [ `requires ${lackingSupport}` ]); continue; } diff --git a/test/embedding/embedtest.cc b/test/embedding/embedtest.cc index 689891f0d1a5bf..43965b6056e455 100644 --- a/test/embedding/embedtest.cc +++ b/test/embedding/embedtest.cc @@ -68,6 +68,7 @@ int RunNodeInstance(MultiIsolatePlatform* platform, // --embedder-snapshot-blob blob-path // --embedder-snapshot-create // [--embedder-snapshot-as-file] + // [--without-code-cache] // Running snapshot: // embedtest --embedder-snapshot-blob blob-path // [--embedder-snapshot-as-file] @@ -80,6 +81,7 @@ int RunNodeInstance(MultiIsolatePlatform* platform, std::vector filtered_args; bool is_building_snapshot = false; bool snapshot_as_file = false; + std::optional snapshot_config; std::string snapshot_blob_path; for (size_t i = 0; i < args.size(); ++i) { const std::string& arg = args[i]; @@ -87,6 +89,13 @@ int RunNodeInstance(MultiIsolatePlatform* platform, is_building_snapshot = true; } else if (arg == "--embedder-snapshot-as-file") { snapshot_as_file = true; + } else if (arg == "--without-code-cache") { + if (!snapshot_config.has_value()) { + snapshot_config = node::SnapshotConfig{}; + } + snapshot_config.value().flags = static_cast( + static_cast(snapshot_config.value().flags) | + static_cast(node::SnapshotFlags::kWithoutCodeCache)); } else if (arg == "--embedder-snapshot-blob") { assert(i + 1 < args.size()); snapshot_blob_path = args[i + 1]; @@ -130,14 +139,23 @@ int RunNodeInstance(MultiIsolatePlatform* platform, } std::vector errors; - std::unique_ptr setup = - snapshot - ? CommonEnvironmentSetup::CreateFromSnapshot( - platform, &errors, snapshot.get(), filtered_args, exec_args) - : is_building_snapshot ? CommonEnvironmentSetup::CreateForSnapshotting( - platform, &errors, filtered_args, exec_args) - : CommonEnvironmentSetup::Create( - platform, &errors, filtered_args, exec_args); + std::unique_ptr setup; + + if (snapshot) { + setup = CommonEnvironmentSetup::CreateFromSnapshot( + platform, &errors, snapshot.get(), filtered_args, exec_args); + } else if (is_building_snapshot) { + if (snapshot_config.has_value()) { + setup = CommonEnvironmentSetup::CreateForSnapshotting( + platform, &errors, filtered_args, exec_args, snapshot_config.value()); + } else { + setup = CommonEnvironmentSetup::CreateForSnapshotting( + platform, &errors, filtered_args, exec_args); + } + } else { + setup = CommonEnvironmentSetup::Create( + platform, &errors, filtered_args, exec_args); + } if (!setup) { for (const std::string& err : errors) fprintf(stderr, "%s: %s\n", binary_path.c_str(), err.c_str()); diff --git a/test/embedding/test-embedding.js b/test/embedding/test-embedding.js index 1fb3bc73f494cb..70bf90d39dd207 100644 --- a/test/embedding/test-embedding.js +++ b/test/embedding/test-embedding.js @@ -14,12 +14,11 @@ tmpdir.refresh(); common.allowGlobals(global.require); common.allowGlobals(global.embedVars); -function resolveBuiltBinary(bin) { - let binary = `out/${common.buildType}/${bin}`; +function resolveBuiltBinary(binary) { if (common.isWindows) { binary += '.exe'; } - return path.resolve(__dirname, '..', '..', binary); + return path.join(path.dirname(process.execPath), binary); } const binary = resolveBuiltBinary('embedtest'); @@ -78,7 +77,9 @@ function getReadFileCodeForPath(path) { } // Basic snapshot support -for (const extraSnapshotArgs of [[], ['--embedder-snapshot-as-file']]) { +for (const extraSnapshotArgs of [ + [], ['--embedder-snapshot-as-file'], ['--without-code-cache'], +]) { // readSync + eval since snapshots don't support userland require() (yet) const snapshotFixture = fixtures.path('snapshot', 'echo-args.js'); const blobPath = tmpdir.resolve('embedder-snapshot.blob'); diff --git a/test/es-module/test-esm-cjs-named-error.mjs b/test/es-module/test-esm-cjs-named-error.mjs index 4ef75a22f92674..548f82b591da3b 100644 --- a/test/es-module/test-esm-cjs-named-error.mjs +++ b/test/es-module/test-esm-cjs-named-error.mjs @@ -23,55 +23,55 @@ const expectedPackageHack = const expectedBare = errTemplate('deep-fail', 'comeOn', '{ comeOn }'); -rejects(async () => { +await rejects(async () => { await import(`${fixtureBase}/single-quote.mjs`); }, { name: 'SyntaxError', message: expectedRelative }, 'should support relative specifiers with single quotes'); -rejects(async () => { +await rejects(async () => { await import(`${fixtureBase}/double-quote.mjs`); }, { name: 'SyntaxError', message: expectedRelative }, 'should support relative specifiers with double quotes'); -rejects(async () => { +await rejects(async () => { await import(`${fixtureBase}/renamed-import.mjs`); }, { name: 'SyntaxError', message: expectedRenamed }, 'should correctly format named imports with renames'); -rejects(async () => { +await rejects(async () => { await import(`${fixtureBase}/multi-line.mjs`); }, { name: 'SyntaxError', message: expectedWithoutExample, }, 'should correctly format named imports across multiple lines'); -rejects(async () => { +await rejects(async () => { await import(`${fixtureBase}/json-hack.mjs`); }, { name: 'SyntaxError', message: expectedPackageHack }, 'should respect recursive package.json for module type'); -rejects(async () => { +await rejects(async () => { await import(`${fixtureBase}/bare-import-single.mjs`); }, { name: 'SyntaxError', message: expectedBare }, 'should support bare specifiers with single quotes'); -rejects(async () => { +await rejects(async () => { await import(`${fixtureBase}/bare-import-double.mjs`); }, { name: 'SyntaxError', message: expectedBare }, 'should support bare specifiers with double quotes'); -rejects(async () => { +await rejects(async () => { await import(`${fixtureBase}/escaped-single-quote.mjs`); }, /import pkg from '\.\/oh'no\.cjs'/, 'should support relative specifiers with escaped single quote'); diff --git a/test/es-module/test-esm-detect-ambiguous.mjs b/test/es-module/test-esm-detect-ambiguous.mjs new file mode 100644 index 00000000000000..43537f26f5304a --- /dev/null +++ b/test/es-module/test-esm-detect-ambiguous.mjs @@ -0,0 +1,257 @@ +import { spawnPromisified } from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawn } from 'node:child_process'; +import { describe, it } from 'node:test'; +import { strictEqual, match } from 'node:assert'; + +describe('--experimental-detect-module', { concurrency: true }, () => { + describe('string input', { concurrency: true }, () => { + it('permits ESM syntax in --eval input without requiring --input-type=module', async () => { + const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [ + '--experimental-detect-module', + '--eval', + 'import { version } from "node:process"; console.log(version);', + ]); + + strictEqual(stderr, ''); + strictEqual(stdout, `${process.version}\n`); + strictEqual(code, 0); + strictEqual(signal, null); + }); + + // ESM is unsupported for --print via --input-type=module + + it('permits ESM syntax in STDIN input without requiring --input-type=module', async () => { + const child = spawn(process.execPath, [ + '--experimental-detect-module', + ]); + child.stdin.end('console.log(typeof import.meta.resolve)'); + + match((await child.stdout.toArray()).toString(), /^function\r?\n$/); + }); + + it('should be overridden by --input-type', async () => { + const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ + '--experimental-detect-module', + '--input-type=commonjs', + '--eval', + 'import.meta.url', + ]); + + match(stderr, /SyntaxError: Cannot use 'import\.meta' outside a module/); + strictEqual(stdout, ''); + strictEqual(code, 1); + strictEqual(signal, null); + }); + + it('should be overridden by --experimental-default-type', async () => { + const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ + '--experimental-detect-module', + '--experimental-default-type=commonjs', + '--eval', + 'import.meta.url', + ]); + + match(stderr, /SyntaxError: Cannot use 'import\.meta' outside a module/); + strictEqual(stdout, ''); + strictEqual(code, 1); + strictEqual(signal, null); + }); + + it('does not trigger detection via source code `eval()`', async () => { + const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ + '--experimental-detect-module', + '--eval', + 'eval("import \'nonexistent\';");', + ]); + + match(stderr, /SyntaxError: Cannot use import statement outside a module/); + strictEqual(stdout, ''); + strictEqual(code, 1); + strictEqual(signal, null); + }); + }); + + describe('.js file input in a typeless package', { concurrency: true }, () => { + for (const { testName, entryPath } of [ + { + testName: 'permits CommonJS syntax in a .js entry point', + entryPath: fixtures.path('es-modules/package-without-type/commonjs.js'), + }, + { + testName: 'permits ESM syntax in a .js entry point', + entryPath: fixtures.path('es-modules/package-without-type/module.js'), + }, + { + testName: 'permits CommonJS syntax in a .js file imported by a CommonJS entry point', + entryPath: fixtures.path('es-modules/package-without-type/imports-commonjs.cjs'), + }, + { + testName: 'permits ESM syntax in a .js file imported by a CommonJS entry point', + entryPath: fixtures.path('es-modules/package-without-type/imports-esm.js'), + }, + { + testName: 'permits CommonJS syntax in a .js file imported by an ESM entry point', + entryPath: fixtures.path('es-modules/package-without-type/imports-commonjs.mjs'), + }, + { + testName: 'permits ESM syntax in a .js file imported by an ESM entry point', + entryPath: fixtures.path('es-modules/package-without-type/imports-esm.mjs'), + }, + ]) { + it(testName, async () => { + const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [ + '--experimental-detect-module', + entryPath, + ]); + + strictEqual(stderr, ''); + strictEqual(stdout, 'executed\n'); + strictEqual(code, 0); + strictEqual(signal, null); + }); + } + }); + + describe('extensionless file input in a typeless package', { concurrency: true }, () => { + for (const { testName, entryPath } of [ + { + testName: 'permits CommonJS syntax in an extensionless entry point', + entryPath: fixtures.path('es-modules/package-without-type/noext-cjs'), + }, + { + testName: 'permits ESM syntax in an extensionless entry point', + entryPath: fixtures.path('es-modules/package-without-type/noext-esm'), + }, + { + testName: 'permits CommonJS syntax in an extensionless file imported by a CommonJS entry point', + entryPath: fixtures.path('es-modules/package-without-type/imports-noext-cjs.js'), + }, + { + testName: 'permits ESM syntax in an extensionless file imported by a CommonJS entry point', + entryPath: fixtures.path('es-modules/package-without-type/imports-noext-esm.js'), + }, + { + testName: 'permits CommonJS syntax in an extensionless file imported by an ESM entry point', + entryPath: fixtures.path('es-modules/package-without-type/imports-noext-cjs.mjs'), + }, + { + testName: 'permits ESM syntax in an extensionless file imported by an ESM entry point', + entryPath: fixtures.path('es-modules/package-without-type/imports-noext-esm.mjs'), + }, + ]) { + it(testName, async () => { + const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [ + '--experimental-detect-module', + entryPath, + ]); + + strictEqual(stderr, ''); + strictEqual(stdout, 'executed\n'); + strictEqual(code, 0); + strictEqual(signal, null); + }); + } + + it('should not hint wrong format in resolve hook', async () => { + let writeSync; + const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [ + '--experimental-detect-module', + '--no-warnings', + '--loader', + `data:text/javascript,import { writeSync } from "node:fs"; export ${encodeURIComponent( + async function resolve(s, c, next) { + const result = await next(s, c); + writeSync(1, result.format + '\n'); + return result; + } + )}`, + fixtures.path('es-modules/package-without-type/noext-esm'), + ]); + + strictEqual(stderr, ''); + strictEqual(stdout, 'null\nexecuted\n'); + strictEqual(code, 0); + strictEqual(signal, null); + + }); + }); + + describe('file input in a "type": "commonjs" package', { concurrency: true }, () => { + for (const { testName, entryPath } of [ + { + testName: 'disallows ESM syntax in a .js entry point', + entryPath: fixtures.path('es-modules/package-type-commonjs/module.js'), + }, + { + testName: 'disallows ESM syntax in a .js file imported by a CommonJS entry point', + entryPath: fixtures.path('es-modules/package-type-commonjs/imports-esm.js'), + }, + { + testName: 'disallows ESM syntax in a .js file imported by an ESM entry point', + entryPath: fixtures.path('es-modules/package-type-commonjs/imports-esm.mjs'), + }, + ]) { + it(testName, async () => { + const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [ + '--experimental-detect-module', + entryPath, + ]); + + match(stderr, /SyntaxError: Unexpected token 'export'/); + strictEqual(stdout, ''); + strictEqual(code, 1); + strictEqual(signal, null); + }); + } + }); + + describe('file input in a "type": "module" package', { concurrency: true }, () => { + for (const { testName, entryPath } of [ + { + testName: 'disallows CommonJS syntax in a .js entry point', + entryPath: fixtures.path('es-modules/package-type-module/cjs.js'), + }, + { + testName: 'disallows CommonJS syntax in a .js file imported by a CommonJS entry point', + entryPath: fixtures.path('es-modules/package-type-module/imports-commonjs.cjs'), + }, + { + testName: 'disallows CommonJS syntax in a .js file imported by an ESM entry point', + entryPath: fixtures.path('es-modules/package-type-module/imports-commonjs.mjs'), + }, + ]) { + it(testName, async () => { + const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [ + '--experimental-detect-module', + entryPath, + ]); + + match(stderr, /ReferenceError: module is not defined in ES module scope/); + strictEqual(stdout, ''); + strictEqual(code, 1); + strictEqual(signal, null); + }); + } + }); +}); + +// Validate temporarily disabling `--abort-on-uncaught-exception` +// while running `containsModuleSyntax`. +// Ref: https://github.com/nodejs/node/issues/50878 +describe('Wrapping a `require` of an ES module while using `--abort-on-uncaught-exception`', () => { + it('should work', async () => { + const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ + '--abort-on-uncaught-exception', + '--eval', + 'assert.throws(() => require("./package-type-module/esm.js"), { code: "ERR_REQUIRE_ESM" })', + ], { + cwd: fixtures.path('es-modules'), + }); + + strictEqual(stderr, ''); + strictEqual(stdout, ''); + strictEqual(code, 0); + strictEqual(signal, null); + }); +}); diff --git a/test/es-module/test-esm-dynamic-import-commonjs.js b/test/es-module/test-esm-dynamic-import-commonjs.js new file mode 100644 index 00000000000000..9022b83f1fcffa --- /dev/null +++ b/test/es-module/test-esm-dynamic-import-commonjs.js @@ -0,0 +1,19 @@ +'use strict'; + +const common = require('../common'); +const fixtures = require('../common/fixtures'); +const assert = require('node:assert'); + +(async () => { + + // Make sure that the CommonJS module lexer has been initialized. + // See https://github.com/nodejs/node/blob/v21.1.0/lib/internal/modules/esm/translators.js#L61-L81. + await import(fixtures.fileURL('empty.js')); + + let tickDuringCJSImport = false; + process.nextTick(() => { tickDuringCJSImport = true; }); + await import(fixtures.fileURL('empty.cjs')); + + assert(!tickDuringCJSImport); + +})().then(common.mustCall()); diff --git a/test/es-module/test-esm-dynamic-import-commonjs.mjs b/test/es-module/test-esm-dynamic-import-commonjs.mjs new file mode 100644 index 00000000000000..6a8f2506c0eb05 --- /dev/null +++ b/test/es-module/test-esm-dynamic-import-commonjs.mjs @@ -0,0 +1,9 @@ +import '../common/index.mjs'; +import fixtures from '../common/fixtures.js'; +import assert from 'node:assert'; + +let tickDuringCJSImport = false; +process.nextTick(() => { tickDuringCJSImport = true; }); +await import(fixtures.fileURL('empty.cjs')); + +assert(!tickDuringCJSImport); diff --git a/test/es-module/test-esm-dynamic-import.js b/test/es-module/test-esm-dynamic-import.js index f69682ef3bca8f..9a6cfad18e1fb8 100644 --- a/test/es-module/test-esm-dynamic-import.js +++ b/test/es-module/test-esm-dynamic-import.js @@ -69,4 +69,10 @@ function expectFsNamespace(result) { // If the specifier is an origin-relative URL, it should // be treated as a file: URL. expectOkNamespace(import(targetURL.pathname)); + + // If the referrer is a realm record, there is no way to resolve the + // specifier. + // TODO(legendecas): https://github.com/tc39/ecma262/pull/3195 + expectModuleError(Promise.resolve('import("node:fs")').then(eval), + 'ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING'); })(); diff --git a/test/es-module/test-esm-import-attributes-errors.js b/test/es-module/test-esm-import-attributes-errors.js index 4521248db176e5..828ded7e684342 100644 --- a/test/es-module/test-esm-import-attributes-errors.js +++ b/test/es-module/test-esm-import-attributes-errors.js @@ -18,37 +18,42 @@ async function test() { await rejects( import(`data:text/javascript,import${JSON.stringify(jsModuleDataUrl)}with{type:"json"}`), - { code: 'ERR_IMPORT_ASSERTION_TYPE_FAILED' } + { code: 'ERR_IMPORT_ATTRIBUTE_TYPE_INCOMPATIBLE' } ); await rejects( import(jsModuleDataUrl, { with: { type: 'json' } }), - { code: 'ERR_IMPORT_ASSERTION_TYPE_FAILED' } + { code: 'ERR_IMPORT_ATTRIBUTE_TYPE_INCOMPATIBLE' } + ); + + await rejects( + import(jsModuleDataUrl, { with: { type: 'json', other: 'unsupported' } }), + { code: 'ERR_IMPORT_ATTRIBUTE_TYPE_INCOMPATIBLE' } ); await rejects( import(jsModuleDataUrl, { with: { type: 'unsupported' } }), - { code: 'ERR_IMPORT_ASSERTION_TYPE_UNSUPPORTED' } + { code: 'ERR_IMPORT_ATTRIBUTE_UNSUPPORTED' } ); await rejects( import(jsonModuleDataUrl), - { code: 'ERR_IMPORT_ASSERTION_TYPE_MISSING' } + { code: 'ERR_IMPORT_ATTRIBUTE_MISSING' } ); await rejects( import(jsonModuleDataUrl, { with: {} }), - { code: 'ERR_IMPORT_ASSERTION_TYPE_MISSING' } + { code: 'ERR_IMPORT_ATTRIBUTE_MISSING' } ); await rejects( import(jsonModuleDataUrl, { with: { foo: 'bar' } }), - { code: 'ERR_IMPORT_ASSERTION_TYPE_MISSING' } + { code: 'ERR_IMPORT_ATTRIBUTE_MISSING' } ); await rejects( import(jsonModuleDataUrl, { with: { type: 'unsupported' } }), - { code: 'ERR_IMPORT_ASSERTION_TYPE_UNSUPPORTED' } + { code: 'ERR_IMPORT_ATTRIBUTE_UNSUPPORTED' } ); } diff --git a/test/es-module/test-esm-import-attributes-errors.mjs b/test/es-module/test-esm-import-attributes-errors.mjs index ff932636e39a5f..887a1b97cc26ee 100644 --- a/test/es-module/test-esm-import-attributes-errors.mjs +++ b/test/es-module/test-esm-import-attributes-errors.mjs @@ -13,35 +13,40 @@ await rejects( await rejects( import(`data:text/javascript,import${JSON.stringify(jsModuleDataUrl)}with{type:"json"}`), - { code: 'ERR_IMPORT_ASSERTION_TYPE_FAILED' } + { code: 'ERR_IMPORT_ATTRIBUTE_TYPE_INCOMPATIBLE' } ); await rejects( import(jsModuleDataUrl, { with: { type: 'json' } }), - { code: 'ERR_IMPORT_ASSERTION_TYPE_FAILED' } + { code: 'ERR_IMPORT_ATTRIBUTE_TYPE_INCOMPATIBLE' } +); + +await rejects( + import(jsModuleDataUrl, { with: { type: 'json', other: 'unsupported' } }), + { code: 'ERR_IMPORT_ATTRIBUTE_TYPE_INCOMPATIBLE' } ); await rejects( import(import.meta.url, { with: { type: 'unsupported' } }), - { code: 'ERR_IMPORT_ASSERTION_TYPE_UNSUPPORTED' } + { code: 'ERR_IMPORT_ATTRIBUTE_UNSUPPORTED' } ); await rejects( import(jsonModuleDataUrl), - { code: 'ERR_IMPORT_ASSERTION_TYPE_MISSING' } + { code: 'ERR_IMPORT_ATTRIBUTE_MISSING' } ); await rejects( import(jsonModuleDataUrl, { with: {} }), - { code: 'ERR_IMPORT_ASSERTION_TYPE_MISSING' } + { code: 'ERR_IMPORT_ATTRIBUTE_MISSING' } ); await rejects( import(jsonModuleDataUrl, { with: { foo: 'bar' } }), - { code: 'ERR_IMPORT_ASSERTION_TYPE_MISSING' } + { code: 'ERR_IMPORT_ATTRIBUTE_MISSING' } ); await rejects( import(jsonModuleDataUrl, { with: { type: 'unsupported' } }), - { code: 'ERR_IMPORT_ASSERTION_TYPE_UNSUPPORTED' } + { code: 'ERR_IMPORT_ATTRIBUTE_UNSUPPORTED' } ); diff --git a/test/es-module/test-esm-import-attributes-validation.js b/test/es-module/test-esm-import-attributes-validation.js index f436f7073126d7..0d1c4bb57d92cf 100644 --- a/test/es-module/test-esm-import-attributes-validation.js +++ b/test/es-module/test-esm-import-attributes-validation.js @@ -15,7 +15,7 @@ assert.ok(validateAttributes(url, 'module', {})); assert.ok(validateAttributes(url, 'wasm', {})); assert.throws(() => validateAttributes(url, 'json', {}), { - code: 'ERR_IMPORT_ASSERTION_TYPE_MISSING', + code: 'ERR_IMPORT_ATTRIBUTE_MISSING', }); assert.throws(() => validateAttributes(url, 'json', { type: 'json', unsupportedAttribute: 'value' }), { @@ -27,17 +27,17 @@ assert.throws(() => validateAttributes(url, 'module', { unsupportedAttribute: 'v }); assert.throws(() => validateAttributes(url, 'module', { type: 'json' }), { - code: 'ERR_IMPORT_ASSERTION_TYPE_FAILED', + code: 'ERR_IMPORT_ATTRIBUTE_TYPE_INCOMPATIBLE', }); // The HTML spec specifically disallows this for now, while Wasm module import // and whether it will require a type assertion is still an open question. assert.throws(() => validateAttributes(url, 'module', { type: 'javascript' }), { - code: 'ERR_IMPORT_ASSERTION_TYPE_UNSUPPORTED', + code: 'ERR_IMPORT_ATTRIBUTE_UNSUPPORTED', }); assert.throws(() => validateAttributes(url, 'module', { type: 'css' }), { - code: 'ERR_IMPORT_ASSERTION_TYPE_UNSUPPORTED', + code: 'ERR_IMPORT_ATTRIBUTE_UNSUPPORTED', }); assert.throws(() => validateAttributes(url, 'module', { type: false }), { diff --git a/test/es-module/test-esm-import-flag.mjs b/test/es-module/test-esm-import-flag.mjs index 2f6f4dd48b49a8..ede317b1d585de 100644 --- a/test/es-module/test-esm-import-flag.mjs +++ b/test/es-module/test-esm-import-flag.mjs @@ -182,4 +182,37 @@ describe('import modules using --import', { concurrency: true }, () => { assert.strictEqual(code, 0); assert.strictEqual(signal, null); }); + + it('should import files sequentially', async () => { + const { code, signal, stderr, stdout } = await spawnPromisified( + execPath, + [ + '--import', fixtures.fileURL('es-modules', 'esm-top-level-await.mjs'), + '--import', fixtures.fileURL('es-modules', 'print-3.mjs'), + fixtures.path('empty.js'), + ] + ); + + assert.strictEqual(stderr, ''); + assert.match(stdout, /^1\r?\n2\r?\n3\r?\n$/); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); + }); + + it('should import files from the env before ones from the CLI', async () => { + const { code, signal, stderr, stdout } = await spawnPromisified( + execPath, + [ + '--import', fixtures.fileURL('es-modules', 'print-3.mjs'), + fixtures.path('empty.js'), + ], + { env: { ...process.env, NODE_OPTIONS: `--import ${JSON.stringify(fixtures.fileURL('es-modules', 'esm-top-level-await.mjs'))}` } } + ); + + assert.strictEqual(stderr, ''); + assert.match(stdout, /^1\r?\n2\r?\n3\r?\n$/); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); + + }); }); diff --git a/test/es-module/test-esm-import-meta.mjs b/test/es-module/test-esm-import-meta.mjs index 4c5aa902d4a970..50d16a3438a851 100644 --- a/test/es-module/test-esm-import-meta.mjs +++ b/test/es-module/test-esm-import-meta.mjs @@ -3,7 +3,7 @@ import assert from 'assert'; assert.strictEqual(Object.getPrototypeOf(import.meta), null); -const keys = ['resolve', 'url']; +const keys = ['dirname', 'filename', 'resolve', 'url']; assert.deepStrictEqual(Reflect.ownKeys(import.meta), keys); const descriptors = Object.getOwnPropertyDescriptors(import.meta); @@ -18,3 +18,17 @@ for (const descriptor of Object.values(descriptors)) { const urlReg = /^file:\/\/\/.*\/test\/es-module\/test-esm-import-meta\.mjs$/; assert(import.meta.url.match(urlReg)); + +// Match *nix paths: `/some/path/test/es-module` +// Match Windows paths: `d:\\some\\path\\test\\es-module` +const dirReg = /^(\/|\w:\\).*(\/|\\)test(\/|\\)es-module$/; +assert.match(import.meta.dirname, dirReg); + +// Match *nix paths: `/some/path/test/es-module/test-esm-import-meta.mjs` +// Match Windows paths: `d:\\some\\path\\test\\es-module\\test-esm-import-meta.js` +const fileReg = /^(\/|\w:\\).*(\/|\\)test(\/|\\)es-module(\/|\\)test-esm-import-meta\.mjs$/; +assert.match(import.meta.filename, fileReg); + +// Verify that `data:` imports do not behave like `file:` imports. +import dataDirname from 'data:text/javascript,export default "dirname" in import.meta'; +assert.strictEqual(dataDirname, false); diff --git a/test/es-module/test-esm-invalid-pjson.js b/test/es-module/test-esm-invalid-pjson.js index 9b49f6f1357685..52cef9ea98b40a 100644 --- a/test/es-module/test-esm-invalid-pjson.js +++ b/test/es-module/test-esm-invalid-pjson.js @@ -1,6 +1,6 @@ 'use strict'; -const { checkoutEOL, spawnPromisified } = require('../common'); +const { spawnPromisified } = require('../common'); const fixtures = require('../common/fixtures.js'); const assert = require('node:assert'); const { execPath } = require('node:process'); @@ -14,12 +14,10 @@ describe('ESM: Package.json', { concurrency: true }, () => { const { code, signal, stderr } = await spawnPromisified(execPath, [entry]); + assert.ok(stderr.includes('code: \'ERR_INVALID_PACKAGE_CONFIG\''), stderr); assert.ok( stderr.includes( - `[ERR_INVALID_PACKAGE_CONFIG]: Invalid package config ${invalidJson} ` + - `while importing "invalid-pjson" from ${entry}. ` + - "Expected ':' after property name in JSON at position " + - `${12 + checkoutEOL.length * 2}` + `Invalid package config ${invalidJson} while importing "invalid-pjson" from ${entry}.` ), stderr ); diff --git a/test/es-module/test-esm-json.mjs b/test/es-module/test-esm-json.mjs index 422a8f717594ab..8be7b60d322573 100644 --- a/test/es-module/test-esm-json.mjs +++ b/test/es-module/test-esm-json.mjs @@ -2,7 +2,7 @@ import { spawnPromisified } from '../common/index.mjs'; import * as fixtures from '../common/fixtures.mjs'; import assert from 'node:assert'; import { execPath } from 'node:process'; -import { describe, it, test } from 'node:test'; +import { before, describe, it, test } from 'node:test'; import { mkdir, rm, writeFile } from 'node:fs/promises'; import * as tmpdir from '../common/tmpdir.js'; @@ -10,6 +10,8 @@ import * as tmpdir from '../common/tmpdir.js'; import secret from '../fixtures/experimental.json' with { type: 'json' }; describe('ESM: importing JSON', () => { + before(() => tmpdir.refresh()); + it('should load JSON', () => { assert.strictEqual(secret.ofLife, 42); }); diff --git a/test/es-module/test-esm-loader-hooks.mjs b/test/es-module/test-esm-loader-hooks.mjs index a4c2f52d0df367..6f035bccb87f5c 100644 --- a/test/es-module/test-esm-loader-hooks.mjs +++ b/test/es-module/test-esm-loader-hooks.mjs @@ -746,4 +746,72 @@ describe('Loader hooks', { concurrency: true }, () => { assert.strictEqual(code, 0); assert.strictEqual(signal, null); }); + + it('should support source maps in commonjs translator', async () => { + const readFile = async () => {}; + const hook = ` + import { readFile } from 'node:fs/promises'; + export ${ + async function load(url, context, nextLoad) { + const resolved = await nextLoad(url, context); + if (context.format === 'commonjs') { + resolved.source = await readFile(new URL(url)); + } + return resolved; + } +}`; + + const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [ + '--no-warnings', + '--enable-source-maps', + '--import', + `data:text/javascript,${encodeURIComponent(` + import{ register } from "node:module"; + register(${ + JSON.stringify('data:text/javascript,' + encodeURIComponent(hook)) +}); + `)}`, + fixtures.path('source-map/throw-on-require.js'), + ]); + + assert.strictEqual(stdout, ''); + assert.match(stderr, /throw-on-require\.ts:9:9/); + assert.strictEqual(code, 1); + assert.strictEqual(signal, null); + }); + + it('should handle mixed of opt-in modules and non-opt-in ones', async () => { + const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [ + '--no-warnings', + '--experimental-loader', + `data:text/javascript,const fixtures=${JSON.stringify(fixtures.path('empty.js'))};export ${ + encodeURIComponent(function resolve(s, c, n) { + if (s.endsWith('entry-point')) { + return { + shortCircuit: true, + url: 'file:///c:/virtual-entry-point', + format: 'commonjs', + }; + } + return n(s, c); + }) + }export ${ + encodeURIComponent(async function load(u, c, n) { + if (u === 'file:///c:/virtual-entry-point') { + return { + shortCircuit: true, + source: `"use strict";require(${JSON.stringify(fixtures)});console.log("Hello");`, + format: 'commonjs', + }; + } + return n(u, c); + })}`, + 'entry-point', + ]); + + assert.strictEqual(stderr, ''); + assert.strictEqual(stdout, 'Hello\n'); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); + }); }); diff --git a/test/es-module/test-esm-loader-resolve-type.mjs b/test/es-module/test-esm-loader-resolve-type.mjs index 4c5e7aede8fccc..94f409490227af 100644 --- a/test/es-module/test-esm-loader-resolve-type.mjs +++ b/test/es-module/test-esm-loader-resolve-type.mjs @@ -5,6 +5,8 @@ import { deepStrictEqual } from 'node:assert'; import { mkdir, rm, cp } from 'node:fs/promises'; import { execPath } from 'node:process'; +tmpdir.refresh(); + const base = tmpdir.fileURL(`test-esm-loader-resolve-type-${(Math.random() * Date.now()).toFixed(0)}`); const moduleName = 'module-counter-by-type'; const moduleURL = new URL(`${base}/node_modules/${moduleName}`); diff --git a/test/es-module/test-esm-loader-with-source.mjs b/test/es-module/test-esm-loader-with-source.mjs new file mode 100644 index 00000000000000..41dca12dfc6bab --- /dev/null +++ b/test/es-module/test-esm-loader-with-source.mjs @@ -0,0 +1,10 @@ +// Flags: --experimental-loader ./test/fixtures/es-module-loaders/preset-cjs-source.mjs +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import assert from 'assert'; + +const { default: existingFileSource } = await import(fixtures.fileURL('es-modules', 'cjs-file.cjs')); +const { default: noSuchFileSource } = await import(new URL('./no-such-file.cjs', import.meta.url)); + +assert.strictEqual(existingFileSource, 'no .cjs file was read to get this source'); +assert.strictEqual(noSuchFileSource, 'no .cjs file was read to get this source'); diff --git a/test/es-module/test-esm-loader.mjs b/test/es-module/test-esm-loader.mjs index e19a38cc4231b0..de34814324818c 100644 --- a/test/es-module/test-esm-loader.mjs +++ b/test/es-module/test-esm-loader.mjs @@ -43,6 +43,11 @@ await assert.rejects( { code: 'ERR_INVALID_RETURN_PROPERTY_VALUE' }, ); +await assert.rejects(import('esmHook/commonJsNullSource.mjs'), { + code: 'ERR_INVALID_RETURN_PROPERTY_VALUE', + message: /"source".*'load'.*got type bigint/, +}); + await import('../fixtures/es-module-loaders/js-as-esm.js') .then((parsedModule) => { assert.strictEqual(typeof parsedModule, 'object'); diff --git a/test/es-module/test-esm-module-not-found-commonjs-hint.mjs b/test/es-module/test-esm-module-not-found-commonjs-hint.mjs index 51633564f81458..8c0187fe89066a 100644 --- a/test/es-module/test-esm-module-not-found-commonjs-hint.mjs +++ b/test/es-module/test-esm-module-not-found-commonjs-hint.mjs @@ -1,5 +1,5 @@ import { spawnPromisified } from '../common/index.mjs'; -import { fixturesDir } from '../common/fixtures.mjs'; +import { fixturesDir, fileURL as fixtureSubDir } from '../common/fixtures.mjs'; import { match, notStrictEqual } from 'node:assert'; import { execPath } from 'node:process'; import { describe, it } from 'node:test'; @@ -7,16 +7,39 @@ import { describe, it } from 'node:test'; describe('ESM: module not found hint', { concurrency: true }, () => { for ( - const { input, expected } + const { input, expected, cwd = fixturesDir } of [ { input: 'import "./print-error-message"', - // Did you mean to import ../print-error-message.js? - expected: / \.\.\/print-error-message\.js\?/, + // Did you mean to import "./print-error-message.js"? + expected: / "\.\/print-error-message\.js"\?/, + }, + { + input: 'import "./es-modules/folder%25with percentage#/index.js"', + // Did you mean to import "./es-modules/folder%2525with%20percentage%23/index.js"? + expected: / "\.\/es-modules\/folder%2525with%20percentage%23\/index\.js"\?/, + }, + { + input: 'import "../folder%25with percentage#/index.js"', + // Did you mean to import "../es-modules/folder%2525with%20percentage%23/index.js"? + expected: / "\.\.\/folder%2525with%20percentage%23\/index\.js"\?/, + cwd: fixtureSubDir('es-modules/tla/'), }, { input: 'import obj from "some_module/obj"', - expected: / some_module\/obj\.js\?/, + expected: / "some_module\/obj\.js"\?/, + }, + { + input: 'import obj from "some_module/folder%25with percentage#/index.js"', + expected: / "some_module\/folder%2525with%20percentage%23\/index\.js"\?/, + }, + { + input: 'import "@nodejsscope/pkg/index"', + expected: / "@nodejsscope\/pkg\/index\.js"\?/, + }, + { + input: 'import obj from "lone_file.js"', + expected: /node_modules\/lone_file\.js"\?/, }, ] ) it('should cite a variant form', async () => { @@ -24,9 +47,7 @@ describe('ESM: module not found hint', { concurrency: true }, () => { '--input-type=module', '--eval', input, - ], { - cwd: fixturesDir, - }); + ], { cwd }); match(stderr, expected); notStrictEqual(code, 0); diff --git a/test/es-module/test-esm-resolve-type.mjs b/test/es-module/test-esm-resolve-type.mjs index 0f442ed569f848..d2642eda39062b 100644 --- a/test/es-module/test-esm-resolve-type.mjs +++ b/test/es-module/test-esm-resolve-type.mjs @@ -38,6 +38,7 @@ try { * with the defaultResolver */ [ + [ '/es-modules/package-ends-node_modules/index.js', 'module' ], [ '/es-modules/package-type-module/index.js', 'module' ], [ '/es-modules/package-type-commonjs/index.js', 'commonjs' ], [ '/es-modules/package-without-type/index.js', 'commonjs' ], diff --git a/test/es-module/test-esm-type-flag-cli-entry.mjs b/test/es-module/test-esm-type-flag-cli-entry.mjs index 002840751532ff..b9315b1bb58992 100644 --- a/test/es-module/test-esm-type-flag-cli-entry.mjs +++ b/test/es-module/test-esm-type-flag-cli-entry.mjs @@ -26,7 +26,7 @@ describe('--experimental-default-type=module should not support extension search cwd: fixtures.path('es-modules/package-without-type'), }); - match(stderr, /ENOENT.*Did you mean to import .*index\.js\?/s); + match(stderr, /ENOENT.*Did you mean to import .*index\.js"\?/s); strictEqual(stdout, ''); strictEqual(code, 1); strictEqual(signal, null); diff --git a/test/es-module/test-esm-type-flag-errors.mjs b/test/es-module/test-esm-type-flag-errors.mjs index 6d54eff94763ef..8fd06c7d562bb0 100644 --- a/test/es-module/test-esm-type-flag-errors.mjs +++ b/test/es-module/test-esm-type-flag-errors.mjs @@ -1,31 +1,101 @@ import { spawnPromisified } from '../common/index.mjs'; import * as fixtures from '../common/fixtures.mjs'; import { describe, it } from 'node:test'; -import { match, strictEqual } from 'node:assert'; - -describe('--experimental-default-type=module should not affect the interpretation of files with unknown extensions', - { concurrency: true }, () => { - it('should error on an entry point with an unknown extension', async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - fixtures.path('es-modules/package-type-module/extension.unknown'), - ]); - - match(stderr, /ERR_UNKNOWN_FILE_EXTENSION/); - strictEqual(stdout, ''); - strictEqual(code, 1); - strictEqual(signal, null); - }); - - it('should error on an import with an unknown extension', async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - fixtures.path('es-modules/package-type-module/imports-unknownext.mjs'), - ]); - - match(stderr, /ERR_UNKNOWN_FILE_EXTENSION/); - strictEqual(stdout, ''); - strictEqual(code, 1); - strictEqual(signal, null); - }); - }); +import { deepStrictEqual, match, strictEqual } from 'node:assert'; + +describe('--experimental-default-type=module', { concurrency: true }, () => { + describe('should not affect the interpretation of files with unknown extensions', { concurrency: true }, () => { + it('should error on an entry point with an unknown extension', async () => { + const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ + '--experimental-default-type=module', + fixtures.path('es-modules/package-type-module/extension.unknown'), + ]); + + match(stderr, /ERR_UNKNOWN_FILE_EXTENSION/); + strictEqual(stdout, ''); + strictEqual(code, 1); + strictEqual(signal, null); + }); + + it('should error on an import with an unknown extension', async () => { + const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ + '--experimental-default-type=module', + fixtures.path('es-modules/package-type-module/imports-unknownext.mjs'), + ]); + + match(stderr, /ERR_UNKNOWN_FILE_EXTENSION/); + strictEqual(stdout, ''); + strictEqual(code, 1); + strictEqual(signal, null); + }); + }); + + it('should affect CJS .js files (imported, required, entry points)', async () => { + const result = await spawnPromisified(process.execPath, [ + '--experimental-default-type=module', + fixtures.path('es-modules/package-type-commonjs/echo-require-cache.js'), + ]); + + deepStrictEqual(result, { + code: 0, + stderr: '', + stdout: 'undefined\n', + signal: null, + }); + }); + + it('should affect .cjs files that are imported', async () => { + const result = await spawnPromisified(process.execPath, [ + '--experimental-default-type=module', + '-e', + `import ${JSON.stringify(fixtures.fileURL('es-module-require-cache/echo.cjs'))}`, + ]); + + deepStrictEqual(result, { + code: 0, + stderr: '', + stdout: 'undefined\n', + signal: null, + }); + }); + + it('should affect entry point .cjs files (with no hooks)', async () => { + const { stderr, stdout, code } = await spawnPromisified(process.execPath, [ + '--experimental-default-type=module', + fixtures.path('es-module-require-cache/echo.cjs'), + ]); + + strictEqual(stderr, ''); + match(stdout, /^undefined\n$/); + strictEqual(code, 0); + }); + + it('should affect entry point .cjs files (when any hooks is registered)', async () => { + const result = await spawnPromisified(process.execPath, [ + '--experimental-default-type=module', + '--import', + 'data:text/javascript,import{register}from"node:module";register("data:text/javascript,");', + fixtures.path('es-module-require-cache/echo.cjs'), + ]); + + deepStrictEqual(result, { + code: 0, + stderr: '', + stdout: 'undefined\n', + signal: null, + }); + }); + + it('should not affect CJS from input-type', async () => { + const { stderr, stdout, code } = await spawnPromisified(process.execPath, [ + '--experimental-default-type=module', + '--input-type=commonjs', + '-p', + 'require.cache', + ]); + + strictEqual(stderr, ''); + match(stdout, /^\[Object: null prototype\] \{\}\n$/); + strictEqual(code, 0); + }); +}); diff --git a/test/es-module/test-http-imports.mjs b/test/es-module/test-http-imports.mjs index 235d142d3555e3..e1cb1f5ced59c7 100644 --- a/test/es-module/test-http-imports.mjs +++ b/test/es-module/test-http-imports.mjs @@ -68,6 +68,11 @@ for (const { protocol, createServer } of [ const server = createServer(function(_req, res) { const url = new URL(_req.url, host); const redirect = url.searchParams.get('redirect'); + + if (url.pathname === 'json') { + common.mustCall(() => assert.strictEqual(_req.header.content, 'application/json,*/*;charset=utf-8;q=0.5')); + } + if (url.pathname === '/not-found') { res.writeHead(404); res.end(); @@ -204,6 +209,13 @@ for (const { protocol, createServer } of [ { code: 'ERR_MODULE_NOT_FOUND' }, ); + const jsonUrl = new URL(url.href + 'json'); + jsonUrl.searchParams.set('mime', 'application/json'); + jsonUrl.searchParams.set('body', '{"x": 1}'); + const json = await import(jsonUrl.href, { with: { type: 'json' } }); + assert.deepStrictEqual(Object.keys(json), ['default']); + assert.strictEqual(json.default.x, 1); + server.close(); } } diff --git a/test/es-module/test-loaders-workers-spawned.mjs b/test/es-module/test-loaders-workers-spawned.mjs index a04d8edb041e36..bcd651f5ad6c3f 100644 --- a/test/es-module/test-loaders-workers-spawned.mjs +++ b/test/es-module/test-loaders-workers-spawned.mjs @@ -48,8 +48,14 @@ describe('Worker threads do not spawn infinitely', { concurrency: true }, () => ]); assert.strictEqual(stderr, ''); + // We are validating that: + // 1. the `--require` flag is run first from the main thread (and A is printed). + // 2. the `--require` flag is then run on the loader thread (and A is printed). + // 3. the `--loader` module is executed (and B is printed). + // 4. the `--import` module is evaluated once, on the main thread (and C is printed). + // 5. the user code is finally executed (and D is printed). // The worker code should always run before the --import, but the console.log might arrive late. - assert.match(stdout, /^A\r?\nA\r?\n(B\r?\nC|C\r?\nB)\r?\nD\r?\n$/); + assert.match(stdout, /^A\r?\n(A\r?\nB\r?\nC|A\r?\nC\r?\nB|C\r?\nA\r?\nB)\r?\nD\r?\n$/); assert.strictEqual(code, 0); assert.strictEqual(signal, null); }); diff --git a/test/fixtures/disable-warning-worker.js b/test/fixtures/disable-warning-worker.js new file mode 100644 index 00000000000000..eae892d6466bad --- /dev/null +++ b/test/fixtures/disable-warning-worker.js @@ -0,0 +1,4 @@ +'use strict'; +const path = require('node:path'); +const { Worker } = require('node:worker_threads'); +new Worker(path.join(__dirname, './disable-warning.js')); diff --git a/test/fixtures/disable-warning.js b/test/fixtures/disable-warning.js new file mode 100644 index 00000000000000..ad9822fb9f5d9c --- /dev/null +++ b/test/fixtures/disable-warning.js @@ -0,0 +1,15 @@ +'use strict'; + +process.emitWarning('Deprecation Warning 1', { + code: 'DEP1', + type: 'DeprecationWarning' +}); + +process.emitWarning('Deprecation Warning 2', { + code: 'DEP2', + type: 'DeprecationWarning' +}); + +process.emitWarning('Experimental Warning', { + type: 'ExperimentalWarning' +}); diff --git a/test/fixtures/dotenv/uv-threadpool.env b/test/fixtures/dotenv/uv-threadpool.env new file mode 100644 index 00000000000000..462463da7b6f54 --- /dev/null +++ b/test/fixtures/dotenv/uv-threadpool.env @@ -0,0 +1 @@ +UV_THREADPOOL_SIZE=4 diff --git a/test/fixtures/empty.cjs b/test/fixtures/empty.cjs new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/test/fixtures/errors/error_aggregateTwoErrors.snapshot b/test/fixtures/errors/error_aggregateTwoErrors.snapshot index a8d13c461b2cb0..77715c40cbfb92 100644 --- a/test/fixtures/errors/error_aggregateTwoErrors.snapshot +++ b/test/fixtures/errors/error_aggregateTwoErrors.snapshot @@ -2,7 +2,8 @@ throw aggregateTwoErrors(err, originalError); ^ -[AggregateError: original] { +AggregateError: original + at Object. (*error_aggregateTwoErrors.js:*:*) { code: 'ERR0', [errors]: [ Error: original diff --git a/test/fixtures/es-module-loaders/hook-resolve-type-loader.mjs b/test/fixtures/es-module-loaders/hook-resolve-type-loader.mjs index f2dc0aba5ca80e..c410401876e448 100644 --- a/test/fixtures/es-module-loaders/hook-resolve-type-loader.mjs +++ b/test/fixtures/es-module-loaders/hook-resolve-type-loader.mjs @@ -1,7 +1,14 @@ -/** @type {MessagePort} */ -let port; -export function initialize(data) { - port = data.port; +/** @type {Uint8Array} */ +let data; +/** @type {number} */ +let ESM_MODULE_INDEX; +/** @type {number} */ +let CJS_MODULE_INDEX; + +export function initialize({ sab, ESM_MODULE_INDEX:e, CJS_MODULE_INDEX:c }) { + data = new Uint8Array(sab); + ESM_MODULE_INDEX = e; + CJS_MODULE_INDEX = c; } export async function resolve(specifier, context, next) { @@ -9,9 +16,9 @@ export async function resolve(specifier, context, next) { const { format } = nextResult; if (format === 'module' || specifier.endsWith('.mjs')) { - port.postMessage({ type: 'module' }); + Atomics.add(data, ESM_MODULE_INDEX, 1); } else if (format == null || format === 'commonjs') { - port.postMessage({ type: 'commonjs' }); + Atomics.add(data, CJS_MODULE_INDEX, 1); } return nextResult; diff --git a/test/fixtures/es-module-loaders/hook-resolve-type.mjs b/test/fixtures/es-module-loaders/hook-resolve-type.mjs index 6fa7a553b8e83f..7324a08e84b6c0 100644 --- a/test/fixtures/es-module-loaders/hook-resolve-type.mjs +++ b/test/fixtures/es-module-loaders/hook-resolve-type.mjs @@ -1,30 +1,18 @@ import * as fixtures from '../../common/fixtures.mjs'; import { register } from 'node:module'; -import { MessageChannel } from 'node:worker_threads'; -let importedESM = 0; -let importedCJS = 0; +const sab = new SharedArrayBuffer(2); +const data = new Uint8Array(sab); + +const ESM_MODULE_INDEX = 0 +const CJS_MODULE_INDEX = 1 + export function getModuleTypeStats() { + const importedESM = Atomics.load(data, ESM_MODULE_INDEX); + const importedCJS = Atomics.load(data, CJS_MODULE_INDEX); return { importedESM, importedCJS }; -}; - -const { port1, port2 } = new MessageChannel(); +} register(fixtures.fileURL('es-module-loaders/hook-resolve-type-loader.mjs'), { - data: { port: port2 }, - transferList: [port2], + data: { sab, ESM_MODULE_INDEX, CJS_MODULE_INDEX }, }); - -port1.on('message', ({ type }) => { - switch (type) { - case 'module': - importedESM++; - break; - case 'commonjs': - importedCJS++; - break; - } -}); - -port1.unref(); -port2.unref(); diff --git a/test/fixtures/es-module-loaders/hooks-custom.mjs b/test/fixtures/es-module-loaders/hooks-custom.mjs index 5656f95232b856..3c38649a88794f 100644 --- a/test/fixtures/es-module-loaders/hooks-custom.mjs +++ b/test/fixtures/es-module-loaders/hooks-custom.mjs @@ -97,5 +97,13 @@ export function load(url, context, next) { }; } + if (url.endsWith('esmHook/commonJsNullSource.mjs')) { + return { + format: 'commonjs', + shortCircuit: true, + source: 1n, + }; + } + return next(url); } diff --git a/test/fixtures/es-module-loaders/preset-cjs-source.mjs b/test/fixtures/es-module-loaders/preset-cjs-source.mjs new file mode 100644 index 00000000000000..2cfa851a23f889 --- /dev/null +++ b/test/fixtures/es-module-loaders/preset-cjs-source.mjs @@ -0,0 +1,21 @@ +export function resolve(specifier, context, next) { + if (specifier.endsWith('/no-such-file.cjs')) { + // Shortcut to avoid ERR_MODULE_NOT_FOUND for non-existing file, but keep the url for the load hook. + return { + shortCircuit: true, + url: specifier, + }; + } + return next(specifier); +} + +export function load(href, context, next) { + if (href.endsWith('.cjs')) { + return { + format: 'commonjs', + shortCircuit: true, + source: 'module.exports = "no .cjs file was read to get this source";', + }; + } + return next(href); +} diff --git a/test/fixtures/es-module-require-cache/echo.cjs b/test/fixtures/es-module-require-cache/echo.cjs new file mode 100644 index 00000000000000..c00af019304dbe --- /dev/null +++ b/test/fixtures/es-module-require-cache/echo.cjs @@ -0,0 +1 @@ +console.log(require.cache); diff --git a/test/fixtures/es-module-shadow-realm/custom-loaders.js b/test/fixtures/es-module-shadow-realm/custom-loaders.js new file mode 100644 index 00000000000000..bf4402250cc4f8 --- /dev/null +++ b/test/fixtures/es-module-shadow-realm/custom-loaders.js @@ -0,0 +1,15 @@ +// This fixture is used to test that custom loaders are not enabled in the ShadowRealm. + +'use strict'; +const assert = require('assert'); + +async function workInChildProcess() { + // Assert that the process is running with a custom loader. + const moduleNamespace = await import('file:///42.mjs'); + assert.strictEqual(moduleNamespace.default, 42); + + const realm = new ShadowRealm(); + await assert.rejects(realm.importValue('file:///42.mjs', 'default'), TypeError); +} + +workInChildProcess(); diff --git a/test/fixtures/es-module-shadow-realm/preload-main.js b/test/fixtures/es-module-shadow-realm/preload-main.js new file mode 100644 index 00000000000000..4258b012ad6139 --- /dev/null +++ b/test/fixtures/es-module-shadow-realm/preload-main.js @@ -0,0 +1,9 @@ +// This fixture is used to test that --require preload modules are not enabled in the ShadowRealm. + +'use strict'; +const assert = require('assert'); + +assert.strictEqual(globalThis.preload, 42); +const realm = new ShadowRealm(); +const value = realm.evaluate(`globalThis.preload`); +assert.strictEqual(value, undefined); diff --git a/test/fixtures/es-module-shadow-realm/preload.js b/test/fixtures/es-module-shadow-realm/preload.js new file mode 100644 index 00000000000000..dbbcb65e5a17e7 --- /dev/null +++ b/test/fixtures/es-module-shadow-realm/preload.js @@ -0,0 +1 @@ +globalThis.preload = 42; diff --git a/test/fixtures/es-module-shadow-realm/re-export-state-counter.mjs b/test/fixtures/es-module-shadow-realm/re-export-state-counter.mjs new file mode 100644 index 00000000000000..50a6aa3fe1e5b1 --- /dev/null +++ b/test/fixtures/es-module-shadow-realm/re-export-state-counter.mjs @@ -0,0 +1,3 @@ +// This module verifies that the module specifier is resolved relative to the +// current module and not the current working directory in the ShadowRealm. +export { getCounter } from "./state-counter.mjs"; diff --git a/test/fixtures/es-module-shadow-realm/state-counter.mjs b/test/fixtures/es-module-shadow-realm/state-counter.mjs new file mode 100644 index 00000000000000..c547658bf455ba --- /dev/null +++ b/test/fixtures/es-module-shadow-realm/state-counter.mjs @@ -0,0 +1,4 @@ +let counter = 0; +export const getCounter = () => { + return counter++; +}; diff --git a/test/fixtures/es-modules/esm-top-level-await.mjs b/test/fixtures/es-modules/esm-top-level-await.mjs index 4a4745afafaaf2..672927f7753ec3 100644 --- a/test/fixtures/es-modules/esm-top-level-await.mjs +++ b/test/fixtures/es-modules/esm-top-level-await.mjs @@ -1,5 +1,7 @@ -import { setImmediate } from 'node:timers/promises'; +import { setTimeout } from 'node:timers/promises'; -await setImmediate(); +// Waiting some arbitrary amount of time to make sure other tasks won't start +// executing in the mean time. +await setTimeout(9); console.log(1); console.log(2); diff --git a/test/fixtures/es-modules/folder%25with percentage#/index.js b/test/fixtures/es-modules/folder%25with percentage#/index.js new file mode 100644 index 00000000000000..ad9a93a7c160f0 --- /dev/null +++ b/test/fixtures/es-modules/folder%25with percentage#/index.js @@ -0,0 +1 @@ +'use strict'; diff --git a/test/fixtures/es-modules/package-ends-node_modules/index.js b/test/fixtures/es-modules/package-ends-node_modules/index.js new file mode 100644 index 00000000000000..ffd1919bb45d4b --- /dev/null +++ b/test/fixtures/es-modules/package-ends-node_modules/index.js @@ -0,0 +1,3 @@ +import os from 'os'; + +console.log(os.platform()); diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/mjs/package.json b/test/fixtures/es-modules/package-ends-node_modules/package.json similarity index 100% rename from deps/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch/dist/mjs/package.json rename to test/fixtures/es-modules/package-ends-node_modules/package.json diff --git a/test/fixtures/es-modules/package-type-commonjs/echo-require-cache.js b/test/fixtures/es-modules/package-type-commonjs/echo-require-cache.js new file mode 100644 index 00000000000000..c00af019304dbe --- /dev/null +++ b/test/fixtures/es-modules/package-type-commonjs/echo-require-cache.js @@ -0,0 +1 @@ +console.log(require.cache); diff --git a/test/fixtures/es-modules/package-type-commonjs/imports-esm.js b/test/fixtures/es-modules/package-type-commonjs/imports-esm.js new file mode 100644 index 00000000000000..d2f5d5fee76ef7 --- /dev/null +++ b/test/fixtures/es-modules/package-type-commonjs/imports-esm.js @@ -0,0 +1 @@ +import('./module.js'); diff --git a/test/fixtures/es-modules/package-type-commonjs/imports-esm.mjs b/test/fixtures/es-modules/package-type-commonjs/imports-esm.mjs new file mode 100644 index 00000000000000..d3eb2fba6a8ee7 --- /dev/null +++ b/test/fixtures/es-modules/package-type-commonjs/imports-esm.mjs @@ -0,0 +1 @@ +import './module.js'; diff --git a/test/fixtures/es-modules/package-type-commonjs/module.js b/test/fixtures/es-modules/package-type-commonjs/module.js new file mode 100644 index 00000000000000..251d6e538a1fcf --- /dev/null +++ b/test/fixtures/es-modules/package-type-commonjs/module.js @@ -0,0 +1,2 @@ +export default 'module'; +console.log('executed'); diff --git a/test/fixtures/es-modules/package-type-module/imports-commonjs.cjs b/test/fixtures/es-modules/package-type-module/imports-commonjs.cjs new file mode 100644 index 00000000000000..7dbbf0d97a46ba --- /dev/null +++ b/test/fixtures/es-modules/package-type-module/imports-commonjs.cjs @@ -0,0 +1 @@ +import('./cjs.js'); diff --git a/test/fixtures/es-modules/package-type-module/imports-commonjs.mjs b/test/fixtures/es-modules/package-type-module/imports-commonjs.mjs new file mode 100644 index 00000000000000..df53dcd2bd4885 --- /dev/null +++ b/test/fixtures/es-modules/package-type-module/imports-commonjs.mjs @@ -0,0 +1 @@ +import './cjs.js'; diff --git a/test/fixtures/es-modules/package-without-type/commonjs.js b/test/fixtures/es-modules/package-without-type/commonjs.js new file mode 100644 index 00000000000000..9b4d39fa21ada2 --- /dev/null +++ b/test/fixtures/es-modules/package-without-type/commonjs.js @@ -0,0 +1,2 @@ +module.exports = 'cjs'; +console.log('executed'); diff --git a/test/fixtures/es-modules/package-without-type/imports-commonjs.cjs b/test/fixtures/es-modules/package-without-type/imports-commonjs.cjs new file mode 100644 index 00000000000000..b247f42a15ceb8 --- /dev/null +++ b/test/fixtures/es-modules/package-without-type/imports-commonjs.cjs @@ -0,0 +1 @@ +import('./commonjs.js'); diff --git a/test/fixtures/es-modules/package-without-type/imports-commonjs.mjs b/test/fixtures/es-modules/package-without-type/imports-commonjs.mjs new file mode 100644 index 00000000000000..c2f8171fd1deda --- /dev/null +++ b/test/fixtures/es-modules/package-without-type/imports-commonjs.mjs @@ -0,0 +1 @@ +import './commonjs.js'; diff --git a/test/fixtures/es-modules/package-without-type/imports-esm.js b/test/fixtures/es-modules/package-without-type/imports-esm.js new file mode 100644 index 00000000000000..d2f5d5fee76ef7 --- /dev/null +++ b/test/fixtures/es-modules/package-without-type/imports-esm.js @@ -0,0 +1 @@ +import('./module.js'); diff --git a/test/fixtures/es-modules/package-without-type/imports-esm.mjs b/test/fixtures/es-modules/package-without-type/imports-esm.mjs new file mode 100644 index 00000000000000..d3eb2fba6a8ee7 --- /dev/null +++ b/test/fixtures/es-modules/package-without-type/imports-esm.mjs @@ -0,0 +1 @@ +import './module.js'; diff --git a/test/fixtures/es-modules/package-without-type/imports-noext-cjs.js b/test/fixtures/es-modules/package-without-type/imports-noext-cjs.js new file mode 100644 index 00000000000000..9f78ce4dd0ed7e --- /dev/null +++ b/test/fixtures/es-modules/package-without-type/imports-noext-cjs.js @@ -0,0 +1 @@ +import('./noext-cjs'); diff --git a/test/fixtures/es-modules/package-without-type/imports-noext-cjs.mjs b/test/fixtures/es-modules/package-without-type/imports-noext-cjs.mjs new file mode 100644 index 00000000000000..2419cba28f9318 --- /dev/null +++ b/test/fixtures/es-modules/package-without-type/imports-noext-cjs.mjs @@ -0,0 +1 @@ +import './noext-cjs'; diff --git a/test/fixtures/es-modules/package-without-type/imports-noext-esm.js b/test/fixtures/es-modules/package-without-type/imports-noext-esm.js new file mode 100644 index 00000000000000..96eca54521b9d3 --- /dev/null +++ b/test/fixtures/es-modules/package-without-type/imports-noext-esm.js @@ -0,0 +1 @@ +import './noext-esm'; diff --git a/test/fixtures/es-modules/package-without-type/imports-noext-esm.mjs b/test/fixtures/es-modules/package-without-type/imports-noext-esm.mjs new file mode 100644 index 00000000000000..96eca54521b9d3 --- /dev/null +++ b/test/fixtures/es-modules/package-without-type/imports-noext-esm.mjs @@ -0,0 +1 @@ +import './noext-esm'; diff --git a/test/fixtures/es-modules/package-without-type/module.js b/test/fixtures/es-modules/package-without-type/module.js index 69147a3b8ca027..251d6e538a1fcf 100644 --- a/test/fixtures/es-modules/package-without-type/module.js +++ b/test/fixtures/es-modules/package-without-type/module.js @@ -1,3 +1,2 @@ -// This file can be run or imported only if `--experimental-default-type=module` is set. export default 'module'; console.log('executed'); diff --git a/test/fixtures/es-modules/package-without-type/noext-cjs b/test/fixtures/es-modules/package-without-type/noext-cjs new file mode 100644 index 00000000000000..37f7b87ad10561 --- /dev/null +++ b/test/fixtures/es-modules/package-without-type/noext-cjs @@ -0,0 +1,2 @@ +module.exports = 'commonjs'; +console.log('executed'); diff --git a/test/fixtures/keys/agent11-cert.pem b/test/fixtures/keys/agent11-cert.pem new file mode 100644 index 00000000000000..42b34d537fc535 --- /dev/null +++ b/test/fixtures/keys/agent11-cert.pem @@ -0,0 +1,8 @@ +-----BEGIN CERTIFICATE----- +MIIBFjCBwaADAgECAgEBMA0GCSqGSIb3DQEBBQUAMBQxEjAQBgNVBAMTCWxvY2Fs +aG9zdDAeFw0yMzEwMTUxNzQ5MTBaFw0yNDEwMTUxNzQ5MTBaMBQxEjAQBgNVBAMT +CWxvY2FsaG9zdDBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDW9vH7W98zSi1IfoTG +pTjbvXRzmmSG6y5z1S3gvC6+keC5QQkEdIG5vWas1efX5qEPybptRyM34T6aWv+U +uzUJAgMBAAEwDQYJKoZIhvcNAQEFBQADQQAEIwD5mLIALrim6uD39DO/umYDtDIb +TAQmgWdkQrCdCtX0Yp49gJyaq2HtFgsk/cxMoYMYkDtT5a7nwEQu+Xqt +-----END CERTIFICATE----- diff --git a/test/fixtures/keys/agent11-key.pem b/test/fixtures/keys/agent11-key.pem new file mode 100644 index 00000000000000..a8bccd007c857c --- /dev/null +++ b/test/fixtures/keys/agent11-key.pem @@ -0,0 +1,9 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIBOwIBAAJBANb28ftb3zNKLUh+hMalONu9dHOaZIbrLnPVLeC8Lr6R4LlBCQR0 +gbm9ZqzV59fmoQ/Jum1HIzfhPppa/5S7NQkCAwEAAQJAaetb6GKoY/lUvre4bLjU +f1Gmo5+bkO8pAGI2LNoMnlETjLjlnvShkqu0kxY96G5Il6VSX4Yjz0D40f4IrlJW +AQIhAPChOjGBlOFcGA/pPmzMcW8jRCLvVubiO9TpiYVhWz45AiEA5LIKsSR8HT9y +eyVNNNkRbNvTrddbvXMBBjj+KwxQrVECIQDjalzHQQJl4lXTY8rdpHJoaNoSckSd +PJ7zYCvaZOKI8QIhALoGbRYMxHySCJBNFlE/pKH06mnE/RXMf2/NWkov+UwRAiAz +ucgBN8xY5KvG3eI78WHdE2B5X0B4EabFXmUlzIrhTA== +-----END RSA PRIVATE KEY----- diff --git a/test/fixtures/linux-perf-logger.js b/test/fixtures/linux-perf-logger.js new file mode 100644 index 00000000000000..d39f9e0cc45b05 --- /dev/null +++ b/test/fixtures/linux-perf-logger.js @@ -0,0 +1,17 @@ +'use strict'; + +process.stdout.write(`${process.pid}`); + +const testRegex = /test-regex/gi; + +function functionOne() { + for (let i = 0; i < 100; i++) { + const match = testRegex.exec(Math.random().toString()); + } +} + +function functionTwo() { + functionOne(); +} + +functionTwo(); diff --git a/test/fixtures/node_modules/@nodejsscope/pkg/index.js b/test/fixtures/node_modules/@nodejsscope/pkg/index.js new file mode 100644 index 00000000000000..ad9a93a7c160f0 --- /dev/null +++ b/test/fixtures/node_modules/@nodejsscope/pkg/index.js @@ -0,0 +1 @@ +'use strict'; diff --git a/test/fixtures/node_modules/lone_file.js b/test/fixtures/node_modules/lone_file.js new file mode 100644 index 00000000000000..ad9a93a7c160f0 --- /dev/null +++ b/test/fixtures/node_modules/lone_file.js @@ -0,0 +1 @@ +'use strict'; diff --git a/test/fixtures/node_modules/pkgexports-number/package.json b/test/fixtures/node_modules/pkgexports-number/package.json index 315f39a66e32a6..c5807f588ce8f7 100644 --- a/test/fixtures/node_modules/pkgexports-number/package.json +++ b/test/fixtures/node_modules/pkgexports-number/package.json @@ -1,3 +1,3 @@ { - "exports": 42 + "exports": {} } diff --git a/test/fixtures/node_modules/some_module/folder%25with percentage#/index.js b/test/fixtures/node_modules/some_module/folder%25with percentage#/index.js new file mode 100644 index 00000000000000..ad9a93a7c160f0 --- /dev/null +++ b/test/fixtures/node_modules/some_module/folder%25with percentage#/index.js @@ -0,0 +1 @@ +'use strict'; diff --git a/test/fixtures/permission/fs-read.js b/test/fixtures/permission/fs-read.js index 37ab086ebb2895..5b2035628c38d3 100644 --- a/test/fixtures/permission/fs-read.js +++ b/test/fixtures/permission/fs-read.js @@ -7,6 +7,7 @@ const fs = require('fs'); const path = require('path'); const blockedFile = process.env.BLOCKEDFILE; +const blockedFileURL = new URL('file://' + process.env.BLOCKEDFILE); const blockedFolder = process.env.BLOCKEDFOLDER; const allowedFolder = process.env.ALLOWEDFOLDER; const regularFile = __filename; @@ -21,15 +22,12 @@ const regularFile = __filename; resource: path.toNamespacedPath(blockedFile), })); assert.throws(() => { - fs.readFile(path.join(blockedFolder, 'anyfile'), () => {}); + fs.readFile(blockedFileURL, () => {}); }, common.expectsError({ code: 'ERR_ACCESS_DENIED', permission: 'FileSystemRead', - resource: path.toNamespacedPath(path.join(blockedFolder, 'anyfile')), + resource: path.toNamespacedPath(blockedFile), })); - - // doesNotThrow - fs.readFile(regularFile, () => {}); } // fs.createReadStream @@ -44,6 +42,16 @@ const regularFile = __filename; permission: 'FileSystemRead', resource: path.toNamespacedPath(blockedFile), })).then(common.mustCall()); + assert.rejects(() => { + return new Promise((_resolve, reject) => { + const stream = fs.createReadStream(blockedFileURL); + stream.on('error', reject); + }); + }, common.expectsError({ + code: 'ERR_ACCESS_DENIED', + permission: 'FileSystemRead', + resource: path.toNamespacedPath(blockedFile), + })).then(common.mustCall()); assert.rejects(() => { return new Promise((_resolve, reject) => { @@ -66,6 +74,13 @@ const regularFile = __filename; permission: 'FileSystemRead', resource: path.toNamespacedPath(blockedFile), })); + assert.throws(() => { + fs.stat(blockedFileURL, () => {}); + }, common.expectsError({ + code: 'ERR_ACCESS_DENIED', + permission: 'FileSystemRead', + resource: path.toNamespacedPath(blockedFile), + })); assert.throws(() => { fs.stat(path.join(blockedFolder, 'anyfile'), () => {}); }, common.expectsError({ @@ -89,6 +104,13 @@ const regularFile = __filename; permission: 'FileSystemRead', resource: path.toNamespacedPath(blockedFile), })); + assert.throws(() => { + fs.access(blockedFileURL, fs.constants.R_OK, () => {}); + }, common.expectsError({ + code: 'ERR_ACCESS_DENIED', + permission: 'FileSystemRead', + resource: path.toNamespacedPath(blockedFile), + })); assert.throws(() => { fs.access(path.join(blockedFolder, 'anyfile'), fs.constants.R_OK, () => {}); }, common.expectsError({ @@ -112,6 +134,13 @@ const regularFile = __filename; permission: 'FileSystemRead', resource: path.toNamespacedPath(blockedFile), })); + assert.throws(() => { + fs.copyFile(blockedFileURL, path.join(blockedFolder, 'any-other-file'), () => {}); + }, common.expectsError({ + code: 'ERR_ACCESS_DENIED', + permission: 'FileSystemRead', + resource: path.toNamespacedPath(blockedFile), + })); assert.throws(() => { fs.copyFile(blockedFile, path.join(__dirname, 'any-other-file'), () => {}); }, common.expectsError({ @@ -131,6 +160,14 @@ const regularFile = __filename; // cpSync calls statSync before reading blockedFile resource: path.toNamespacedPath(blockedFolder), })); + assert.throws(() => { + fs.cpSync(blockedFileURL, path.join(blockedFolder, 'any-other-file')); + }, common.expectsError({ + code: 'ERR_ACCESS_DENIED', + permission: 'FileSystemRead', + // cpSync calls statSync before reading blockedFile + resource: path.toNamespacedPath(blockedFolder), + })); assert.throws(() => { fs.cpSync(blockedFile, path.join(__dirname, 'any-other-file')); }, common.expectsError({ @@ -149,6 +186,13 @@ const regularFile = __filename; permission: 'FileSystemRead', resource: path.toNamespacedPath(blockedFile), })); + assert.throws(() => { + fs.open(blockedFileURL, 'r', () => {}); + }, common.expectsError({ + code: 'ERR_ACCESS_DENIED', + permission: 'FileSystemRead', + resource: path.toNamespacedPath(blockedFile), + })); assert.throws(() => { fs.open(path.join(blockedFolder, 'anyfile'), 'r', () => {}); }, common.expectsError({ @@ -237,6 +281,13 @@ const regularFile = __filename; permission: 'FileSystemRead', resource: path.toNamespacedPath(blockedFile), })); + assert.throws(() => { + fs.watchFile(blockedFileURL, common.mustNotCall()); + }, common.expectsError({ + code: 'ERR_ACCESS_DENIED', + permission: 'FileSystemRead', + resource: path.toNamespacedPath(blockedFile), + })); } // fs.rename @@ -248,6 +299,13 @@ const regularFile = __filename; permission: 'FileSystemRead', resource: path.toNamespacedPath(blockedFile), })); + assert.throws(() => { + fs.rename(blockedFileURL, 'newfile', () => {}); + }, common.expectsError({ + code: 'ERR_ACCESS_DENIED', + permission: 'FileSystemRead', + resource: path.toNamespacedPath(blockedFile), + })); } // fs.openAsBlob @@ -259,6 +317,13 @@ const regularFile = __filename; permission: 'FileSystemRead', resource: path.toNamespacedPath(blockedFile), })); + assert.throws(() => { + fs.openAsBlob(blockedFileURL); + }, common.expectsError({ + code: 'ERR_ACCESS_DENIED', + permission: 'FileSystemRead', + resource: path.toNamespacedPath(blockedFile), + })); } // fs.exists @@ -267,6 +332,9 @@ const regularFile = __filename; fs.exists(blockedFile, (exists) => { assert.equal(exists, false); }); + fs.exists(blockedFileURL, (exists) => { + assert.equal(exists, false); + }); } // fs.statfs @@ -278,4 +346,11 @@ const regularFile = __filename; permission: 'FileSystemRead', resource: path.toNamespacedPath(blockedFile), })); -} + assert.throws(() => { + fs.statfs(blockedFileURL, () => {}); + }, common.expectsError({ + code: 'ERR_ACCESS_DENIED', + permission: 'FileSystemRead', + resource: path.toNamespacedPath(blockedFile), + })); +} \ No newline at end of file diff --git a/test/fixtures/permission/fs-traversal.js b/test/fixtures/permission/fs-traversal.js index 18243edfeadf7e..87132177643c45 100644 --- a/test/fixtures/permission/fs-traversal.js +++ b/test/fixtures/permission/fs-traversal.js @@ -12,9 +12,9 @@ path.resolve = (s) => s; const blockedFolder = process.env.BLOCKEDFOLDER; const allowedFolder = process.env.ALLOWEDFOLDER; -const traversalPath = allowedFolder + '../file.md'; -const traversalFolderPath = allowedFolder + '../folder'; -const bufferTraversalPath = Buffer.from(allowedFolder + '../file.md'); +const traversalPath = allowedFolder + '/../file.md'; +const traversalFolderPath = allowedFolder + '/../folder'; +const bufferTraversalPath = Buffer.from(traversalPath); const uint8ArrayTraversalPath = new TextEncoder().encode(traversalPath); { diff --git a/test/fixtures/snapshot/child-process-sync.js b/test/fixtures/snapshot/child-process-sync.js new file mode 100644 index 00000000000000..5ffacb05357df6 --- /dev/null +++ b/test/fixtures/snapshot/child-process-sync.js @@ -0,0 +1,25 @@ +'use strict'; + +const { + setDeserializeMainFunction, + isBuildingSnapshot +} = require('v8').startupSnapshot; + +function spawn() { + const { spawnSync, execFileSync, execSync } = require('child_process'); + spawnSync(process.execPath, [ __filename, 'spawnSync' ], { stdio: 'inherit' }); + execSync(`"${process.execPath}" "${__filename}" "execSync"`, { stdio: 'inherit' }); + execFileSync(process.execPath, [ __filename, 'execFileSync' ], { stdio: 'inherit' }); +} + +if (process.argv[2] !== undefined) { + console.log('From child process', process.argv[2]); +} else { + spawn(); +} + +if (isBuildingSnapshot()) { + setDeserializeMainFunction(() => { + spawn(); + }); +} diff --git a/test/fixtures/source-map/output/source_map_prepare_stack_trace.js b/test/fixtures/source-map/output/source_map_prepare_stack_trace.js new file mode 100644 index 00000000000000..d49bad116b479f --- /dev/null +++ b/test/fixtures/source-map/output/source_map_prepare_stack_trace.js @@ -0,0 +1,34 @@ +// Flags: --enable-source-maps + +'use strict'; +require('../../../common'); +const assert = require('assert'); +Error.stackTraceLimit = 5; + +assert.strictEqual(typeof Error.prepareStackTrace, 'function'); +const defaultPrepareStackTrace = Error.prepareStackTrace; +Error.prepareStackTrace = (error, trace) => { + trace = trace.filter(it => { + return it.getFunctionName() !== 'functionC'; + }); + return defaultPrepareStackTrace(error, trace); +}; + +try { + require('../enclosing-call-site-min.js'); +} catch (e) { + console.log(e); +} + +delete require.cache[require + .resolve('../enclosing-call-site-min.js')]; + +// Disable +process.setSourceMapsEnabled(false); +assert.strictEqual(process.sourceMapsEnabled, false); + +try { + require('../enclosing-call-site-min.js'); +} catch (e) { + console.log(e); +} diff --git a/test/fixtures/source-map/output/source_map_prepare_stack_trace.snapshot b/test/fixtures/source-map/output/source_map_prepare_stack_trace.snapshot new file mode 100644 index 00000000000000..9e9740a26fc34e --- /dev/null +++ b/test/fixtures/source-map/output/source_map_prepare_stack_trace.snapshot @@ -0,0 +1,10 @@ +Error: an error! + at functionD (*enclosing-call-site.js:16:17) + at functionB (*enclosing-call-site.js:6:3) + at functionA (*enclosing-call-site.js:2:3) + at Object. (*enclosing-call-site.js:24:3) +Error: an error! + at functionD (*enclosing-call-site-min.js:1:156) + at functionB (*enclosing-call-site-min.js:1:60) + at functionA (*enclosing-call-site-min.js:1:26) + at Object. (*enclosing-call-site-min.js:1:199) diff --git a/test/fixtures/source-map/ts-node-win32.js b/test/fixtures/source-map/ts-node-win32.js new file mode 100644 index 00000000000000..22606906c9a5ba --- /dev/null +++ b/test/fixtures/source-map/ts-node-win32.js @@ -0,0 +1,10 @@ +function foo(str) { + return str; +} +foo('noop'); +// To recreate (Windows only): +// +// const filePath = require.resolve('./test/fixtures/source-map/ts-node.ts'); +// const compiled = require('ts-node').create({ transpileOnly: true }).compile(fs.readFileSync(filePath, 'utf8'), filePath); +// fs.writeFileSync('test/fixtures/source-map/ts-node-win32.js', compiled); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRDovd29ya3NwYWNlcy9ub2RlL3Rlc3QvZml4dHVyZXMvc291cmNlLW1hcC90cy1ub2RlLnRzIiwic291cmNlcyI6WyJEOi93b3Jrc3BhY2VzL25vZGUvdGVzdC9maXh0dXJlcy9zb3VyY2UtbWFwL3RzLW5vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsU0FBUyxHQUFHLENBQUMsR0FBVztJQUN0QixPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7QUFFWiw4QkFBOEI7QUFDOUIsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw0SEFBNEg7QUFDNUgsMkVBQTJFIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gZm9vKHN0cjogc3RyaW5nKSB7XG4gIHJldHVybiBzdHI7XG59XG5cbmZvbygnbm9vcCcpO1xuXG4vLyBUbyByZWNyZWF0ZSAoV2luZG93cyBvbmx5KTpcbi8vXG4vLyBjb25zdCBmaWxlUGF0aCA9IHJlcXVpcmUucmVzb2x2ZSgnLi90ZXN0L2ZpeHR1cmVzL3NvdXJjZS1tYXAvdHMtbm9kZS50cycpO1xuLy8gY29uc3QgY29tcGlsZWQgPSByZXF1aXJlKCd0cy1ub2RlJykuY3JlYXRlKHsgdHJhbnNwaWxlT25seTogdHJ1ZSB9KS5jb21waWxlKGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSwgZmlsZVBhdGgpO1xuLy8gZnMud3JpdGVGaWxlU3luYygndGVzdC9maXh0dXJlcy9zb3VyY2UtbWFwL3RzLW5vZGUtd2luMzIuanMnLCBjb21waWxlZCk7XG4iXX0= diff --git a/test/fixtures/source-map/ts-node.ts b/test/fixtures/source-map/ts-node.ts new file mode 100644 index 00000000000000..2ff34e0f942f15 --- /dev/null +++ b/test/fixtures/source-map/ts-node.ts @@ -0,0 +1,11 @@ +function foo(str: string) { + return str; +} + +foo('noop'); + +// To recreate (Windows only): +// +// const filePath = require.resolve('./test/fixtures/source-map/ts-node.ts'); +// const compiled = require('ts-node').create({ transpileOnly: true }).compile(fs.readFileSync(filePath, 'utf8'), filePath); +// fs.writeFileSync('test/fixtures/source-map/ts-node-win32.js', compiled); diff --git a/test/fixtures/test-runner/output/arbitrary-output-colored.js b/test/fixtures/test-runner/output/arbitrary-output-colored.js index b09eeeb9971cf6..af23e674cb361e 100644 --- a/test/fixtures/test-runner/output/arbitrary-output-colored.js +++ b/test/fixtures/test-runner/output/arbitrary-output-colored.js @@ -6,6 +6,7 @@ const fixtures = require('../../../common/fixtures'); (async function run() { const test = fixtures.path('test-runner/output/arbitrary-output-colored-1.js'); - await once(spawn(process.execPath, ['--test', test], { stdio: 'inherit', env: { FORCE_COLOR: 1 } }), 'exit'); - await once(spawn(process.execPath, ['--test', '--test-reporter', 'tap', test], { stdio: 'inherit', env: { FORCE_COLOR: 1 } }), 'exit'); + const reset = fixtures.path('test-runner/output/reset-color-depth.js'); + await once(spawn(process.execPath, ['-r', reset, '--test', test], { stdio: 'inherit' }), 'exit'); + await once(spawn(process.execPath, ['-r', reset, '--test', '--test-reporter', 'tap', test], { stdio: 'inherit' }), 'exit'); })().then(common.mustCall()); diff --git a/test/fixtures/test-runner/output/hooks.js b/test/fixtures/test-runner/output/hooks.js index 00a6c23499f52e..531615fd97d69b 100644 --- a/test/fixtures/test-runner/output/hooks.js +++ b/test/fixtures/test-runner/output/hooks.js @@ -166,5 +166,13 @@ test('t.after() is called if test body throws', (t) => { throw new Error('bye'); }); +describe('run after when before throws', () => { + after(common.mustCall(() => { + console.log("- after() called") + })); + before(() => { throw new Error('before')}); + it('1', () => {}); +}); + before((t) => t.diagnostic('before 2 called')); after((t) => t.diagnostic('after 2 called')); diff --git a/test/fixtures/test-runner/output/hooks.snapshot b/test/fixtures/test-runner/output/hooks.snapshot index 6cf29612c535cb..edb455b025ff58 100644 --- a/test/fixtures/test-runner/output/hooks.snapshot +++ b/test/fixtures/test-runner/output/hooks.snapshot @@ -1,3 +1,4 @@ +- after() called TAP version 13 # Subtest: describe hooks # Subtest: 1 @@ -568,16 +569,46 @@ not ok 14 - t.after() is called if test body throws * ... # - after() called -1..14 +# Subtest: run after when before throws + # Subtest: 1 + not ok 1 - 1 + --- + duration_ms: * + location: '/test/fixtures/test-runner/output/hooks.js:(LINE):3' + failureType: 'cancelledByParent' + error: 'test did not finish before its parent and was cancelled' + code: 'ERR_TEST_FAILURE' + ... + 1..1 +not ok 15 - run after when before throws + --- + duration_ms: * + type: 'suite' + location: '/test/fixtures/test-runner/output/hooks.js:(LINE):1' + failureType: 'hookFailed' + error: 'before' + code: 'ERR_TEST_FAILURE' + stack: |- + * + * + * + * + * + * + * + * + * + ... +1..15 # before 1 called # before 2 called # after 1 called # after 2 called -# tests 38 -# suites 8 +# tests 39 +# suites 9 # pass 14 # fail 22 -# cancelled 2 +# cancelled 3 # skipped 0 # todo 0 # duration_ms * diff --git a/test/fixtures/test-runner/output/hooks_spec_reporter.js b/test/fixtures/test-runner/output/hooks_spec_reporter.js new file mode 100644 index 00000000000000..75bb4b6be1e908 --- /dev/null +++ b/test/fixtures/test-runner/output/hooks_spec_reporter.js @@ -0,0 +1,11 @@ +'use strict'; +require('../../../common'); +const fixtures = require('../../../common/fixtures'); +const spawn = require('node:child_process').spawn; + +const child = spawn(process.execPath, + ['--no-warnings', '--test-reporter', 'spec', fixtures.path('test-runner/output/hooks.js')], + { stdio: 'pipe' }); +// eslint-disable-next-line no-control-regex +child.stdout.on('data', (d) => process.stdout.write(d.toString().replace(/[^\x00-\x7F]/g, '').replace(/\u001b\[\d+m/g, ''))); +child.stderr.pipe(process.stderr); diff --git a/test/fixtures/test-runner/output/hooks_spec_reporter.snapshot b/test/fixtures/test-runner/output/hooks_spec_reporter.snapshot new file mode 100644 index 00000000000000..4cd47bf042b95d --- /dev/null +++ b/test/fixtures/test-runner/output/hooks_spec_reporter.snapshot @@ -0,0 +1,604 @@ +- after() called + describe hooks + 1 (*ms) + 2 (*ms) + nested + nested 1 (*ms) + nested 2 (*ms) + nested (*ms) + + describe hooks (*ms) + + before throws + 1 + 'test did not finish before its parent and was cancelled' + + 2 + 'test did not finish before its parent and was cancelled' + + before throws (*ms) + + Error: before + * + * + * + * + * + * + * + * + * + + after throws + 1 (*ms) + 2 (*ms) + after throws (*ms) + + Error: after + * + * + * + * + * + * + * + * + * + + beforeEach throws + 1 (*ms) + Error: beforeEach + * + * + * + * + * + * + * + at async Promise.all (index 0) + * + * + + 2 (*ms) + Error: beforeEach + * + * + * + * + * + * + * + * + + beforeEach throws (*ms) + + afterEach throws + 1 (*ms) + Error: afterEach + * + * + * + * + * + * + * + * + at async Promise.all (index 0) + * + + 2 (*ms) + Error: afterEach + * + * + * + * + * + * + * + * + * + + afterEach throws (*ms) + + afterEach when test fails + 1 (*ms) + Error: test + * + * + * + * + * + * + at new Promise () + * + * + at Array.map () + + 2 (*ms) + afterEach when test fails (*ms) + + afterEach throws and test fails + 1 (*ms) + Error: test + * + * + * + * + * + * + at new Promise () + * + * + at Array.map () + + 2 (*ms) + Error: afterEach + * + * + * + * + * + * + * + * + * + + afterEach throws and test fails (*ms) + + test hooks + 1 (*ms) + 2 (*ms) + nested + nested 1 (*ms) + nested 2 (*ms) + nested (*ms) + + test hooks (*ms) + + t.before throws + 1 (*ms) + Error: before + * + * + * + * + * + * + * + * + * + * + + 2 (*ms) + Error: before + * + * + * + * + * + * + * + * + * + * + + t.before throws (*ms) + + t.beforeEach throws + 1 (*ms) + Error: beforeEach + * + * + * + * + * + * + * + * + * + * + + 2 (*ms) + Error: beforeEach + * + * + * + * + * + * + * + * + * + * + + t.beforeEach throws (*ms) + + t.afterEach throws + 1 (*ms) + Error: afterEach + * + * + * + * + * + * + * + * + * + * + + 2 (*ms) + Error: afterEach + * + * + * + * + * + * + * + * + * + * + + t.afterEach throws (*ms) + + afterEach when test fails + 1 (*ms) + Error: test + * + * + * + * + * + * + * + * + * + + 2 (*ms) + afterEach when test fails (*ms) + + afterEach throws and test fails + 1 (*ms) + Error: test + * + * + * + * + * + * + * + * + * + + 2 (*ms) + Error: afterEach + * + * + * + * + * + * + * + * + * + * + + afterEach throws and test fails (*ms) + + t.after() is called if test body throws (*ms) + Error: bye + * + * + * + * + + - after() called + run after when before throws + 1 + 'test did not finish before its parent and was cancelled' + + run after when before throws (*ms) + + Error: before + * + * + * + * + * + * + * + * + * + + before 1 called + before 2 called + after 1 called + after 2 called + tests 39 + suites 9 + pass 14 + fail 22 + cancelled 3 + skipped 0 + todo 0 + duration_ms * + + failing tests: + +* + 1 + 'test did not finish before its parent and was cancelled' + +* + 2 + 'test did not finish before its parent and was cancelled' + +* + before throws (*ms) + Error: before + * + * + * + * + * + * + * + * + * + +* + after throws (*ms) + Error: after + * + * + * + * + * + * + * + * + * + +* + 1 (*ms) + Error: beforeEach + * + * + * + * + * + * + * + at async Promise.all (index 0) + * + * + +* + 2 (*ms) + Error: beforeEach + * + * + * + * + * + * + * + * + +* + 1 (*ms) + Error: afterEach + * + * + * + * + * + * + * + * + at async Promise.all (index 0) + * + +* + 2 (*ms) + Error: afterEach + * + * + * + * + * + * + * + * + * + +* + 1 (*ms) + Error: test + * + * + * + * + * + * + at new Promise () + * + * + at Array.map () + +* + 1 (*ms) + Error: test + * + * + * + * + * + * + at new Promise () + * + * + at Array.map () + +* + 2 (*ms) + Error: afterEach + * + * + * + * + * + * + * + * + * + +* + 1 (*ms) + Error: before + * + * + * + * + * + * + * + * + * + * + +* + 2 (*ms) + Error: before + * + * + * + * + * + * + * + * + * + * + +* + 1 (*ms) + Error: beforeEach + * + * + * + * + * + * + * + * + * + * + +* + 2 (*ms) + Error: beforeEach + * + * + * + * + * + * + * + * + * + * + +* + 1 (*ms) + Error: afterEach + * + * + * + * + * + * + * + * + * + * + +* + 2 (*ms) + Error: afterEach + * + * + * + * + * + * + * + * + * + * + +* + 1 (*ms) + Error: test + * + * + * + * + * + * + * + * + * + +* + 1 (*ms) + Error: test + * + * + * + * + * + * + * + * + * + +* + 2 (*ms) + Error: afterEach + * + * + * + * + * + * + * + * + * + * + +* + t.after() is called if test body throws (*ms) + Error: bye + * + * + * + * + +* + 1 + 'test did not finish before its parent and was cancelled' + +* + run after when before throws (*ms) + Error: before + * + * + * + * + * + * + * + * + * diff --git a/test/fixtures/test-runner/output/lcov_reporter.js b/test/fixtures/test-runner/output/lcov_reporter.js new file mode 100644 index 00000000000000..a6d17432d18c23 --- /dev/null +++ b/test/fixtures/test-runner/output/lcov_reporter.js @@ -0,0 +1,7 @@ +'use strict'; +require('../../../common'); +const fixtures = require('../../../common/fixtures'); +const spawn = require('node:child_process').spawn; + +spawn(process.execPath, + ['--no-warnings', '--experimental-test-coverage', '--test-reporter', 'lcov', fixtures.path('test-runner/output/output.js')], { stdio: 'inherit' }); diff --git a/test/fixtures/test-runner/output/lcov_reporter.snapshot b/test/fixtures/test-runner/output/lcov_reporter.snapshot new file mode 100644 index 00000000000000..c14f4c7ce2baee --- /dev/null +++ b/test/fixtures/test-runner/output/lcov_reporter.snapshot @@ -0,0 +1,699 @@ +TN: +SF:test/fixtures/test-runner/output/output.js +FN:8,anonymous_0 +FN:12,anonymous_1 +FN:16,anonymous_2 +FN:21,anonymous_3 +FN:26,anonymous_4 +FN:30,anonymous_5 +FN:34,anonymous_6 +FN:38,anonymous_7 +FN:42,anonymous_8 +FN:46,anonymous_9 +FN:50,anonymous_10 +FN:54,anonymous_11 +FN:59,anonymous_12 +FN:64,anonymous_13 +FN:68,anonymous_14 +FN:72,anonymous_15 +FN:76,anonymous_16 +FN:80,anonymous_17 +FN:81,anonymous_18 +FN:86,anonymous_19 +FN:87,anonymous_20 +FN:92,anonymous_21 +FN:93,anonymous_22 +FN:94,anonymous_23 +FN:100,anonymous_24 +FN:101,anonymous_25 +FN:107,anonymous_26 +FN:111,anonymous_27 +FN:112,anonymous_28 +FN:113,anonymous_29 +FN:114,anonymous_30 +FN:122,anonymous_31 +FN:123,anonymous_32 +FN:130,anonymous_33 +FN:131,anonymous_34 +FN:132,anonymous_35 +FN:140,anonymous_36 +FN:141,anonymous_37 +FN:142,anonymous_38 +FN:150,anonymous_39 +FN:151,anonymous_40 +FN:159,anonymous_41 +FN:160,anonymous_42 +FN:161,anonymous_43 +FN:166,anonymous_44 +FN:167,anonymous_45 +FN:171,anonymous_46 +FN:172,anonymous_47 +FN:173,anonymous_48 +FN:179,anonymous_49 +FN:183,anonymous_50 +FN:187,anonymous_51 +FN:195,functionOnly +FN:198,anonymous_53 +FN:213,functionAndOptions +FN:215,anonymous_55 +FN:219,anonymous_56 +FN:220,anonymous_57 +FN:225,anonymous_58 +FN:229,anonymous_59 +FN:233,anonymous_60 +FN:238,anonymous_61 +FN:242,anonymous_62 +FN:246,anonymous_63 +FN:251,anonymous_64 +FN:256,anonymous_65 +FN:257,anonymous_66 +FN:263,anonymous_67 +FN:264,anonymous_68 +FN:269,anonymous_69 +FN:270,anonymous_70 +FN:277,anonymous_71 +FN:287,anonymous_72 +FN:289,obj +FN:298,anonymous_74 +FN:300,obj +FN:309,anonymous_76 +FN:310,anonymous_77 +FN:313,anonymous_78 +FN:318,anonymous_79 +FN:319,anonymous_80 +FN:324,anonymous_81 +FN:329,anonymous_82 +FN:330,anonymous_83 +FN:335,anonymous_84 +FN:339,anonymous_85 +FN:342,get then +FN:345,anonymous_87 +FN:350,anonymous_88 +FN:353,get then +FN:356,anonymous_90 +FN:361,anonymous_91 +FN:362,anonymous_92 +FN:363,anonymous_93 +FN:367,anonymous_94 +FN:368,anonymous_95 +FN:369,anonymous_96 +FN:375,anonymous_97 +FN:379,anonymous_98 +FNDA:1,anonymous_0 +FNDA:1,anonymous_1 +FNDA:1,anonymous_2 +FNDA:1,anonymous_3 +FNDA:1,anonymous_4 +FNDA:1,anonymous_5 +FNDA:1,anonymous_6 +FNDA:1,anonymous_7 +FNDA:1,anonymous_8 +FNDA:1,anonymous_9 +FNDA:1,anonymous_10 +FNDA:1,anonymous_11 +FNDA:1,anonymous_12 +FNDA:1,anonymous_13 +FNDA:1,anonymous_14 +FNDA:1,anonymous_15 +FNDA:1,anonymous_16 +FNDA:1,anonymous_17 +FNDA:1,anonymous_18 +FNDA:1,anonymous_19 +FNDA:1,anonymous_20 +FNDA:1,anonymous_21 +FNDA:1,anonymous_22 +FNDA:1,anonymous_23 +FNDA:1,anonymous_24 +FNDA:1,anonymous_25 +FNDA:1,anonymous_26 +FNDA:1,anonymous_27 +FNDA:1,anonymous_28 +FNDA:1,anonymous_29 +FNDA:1,anonymous_30 +FNDA:1,anonymous_31 +FNDA:1,anonymous_32 +FNDA:1,anonymous_33 +FNDA:1,anonymous_34 +FNDA:1,anonymous_35 +FNDA:1,anonymous_36 +FNDA:1,anonymous_37 +FNDA:1,anonymous_38 +FNDA:1,anonymous_39 +FNDA:1,anonymous_40 +FNDA:1,anonymous_41 +FNDA:1,anonymous_42 +FNDA:1,anonymous_43 +FNDA:1,anonymous_44 +FNDA:1,anonymous_45 +FNDA:1,anonymous_46 +FNDA:1,anonymous_47 +FNDA:1,anonymous_48 +FNDA:0,anonymous_49 +FNDA:0,anonymous_50 +FNDA:1,anonymous_51 +FNDA:1,functionOnly +FNDA:1,anonymous_53 +FNDA:0,functionAndOptions +FNDA:1,anonymous_55 +FNDA:1,anonymous_56 +FNDA:1,anonymous_57 +FNDA:1,anonymous_58 +FNDA:1,anonymous_59 +FNDA:1,anonymous_60 +FNDA:1,anonymous_61 +FNDA:1,anonymous_62 +FNDA:1,anonymous_63 +FNDA:1,anonymous_64 +FNDA:1,anonymous_65 +FNDA:1,anonymous_66 +FNDA:1,anonymous_67 +FNDA:1,anonymous_68 +FNDA:1,anonymous_69 +FNDA:1,anonymous_70 +FNDA:1,anonymous_71 +FNDA:1,anonymous_72 +FNDA:1,obj +FNDA:1,anonymous_74 +FNDA:1,obj +FNDA:1,anonymous_76 +FNDA:1,anonymous_77 +FNDA:1,anonymous_78 +FNDA:1,anonymous_79 +FNDA:1,anonymous_80 +FNDA:1,anonymous_81 +FNDA:1,anonymous_82 +FNDA:1,anonymous_83 +FNDA:1,anonymous_84 +FNDA:1,anonymous_85 +FNDA:1,get then +FNDA:1,anonymous_87 +FNDA:1,anonymous_88 +FNDA:1,get then +FNDA:1,anonymous_90 +FNDA:1,anonymous_91 +FNDA:1,anonymous_92 +FNDA:1,anonymous_93 +FNDA:1,anonymous_94 +FNDA:1,anonymous_95 +FNDA:1,anonymous_96 +FNDA:1,anonymous_97 +FNDA:1,anonymous_98 +FNF:99 +FNH:96 +BRDA:1,0,0,1 +BRDA:8,1,0,1 +BRDA:12,2,0,1 +BRDA:16,3,0,1 +BRDA:21,4,0,1 +BRDA:26,5,0,1 +BRDA:30,6,0,1 +BRDA:34,7,0,1 +BRDA:38,8,0,1 +BRDA:42,9,0,1 +BRDA:46,10,0,1 +BRDA:50,11,0,1 +BRDA:54,12,0,1 +BRDA:59,13,0,1 +BRDA:64,14,0,1 +BRDA:68,15,0,1 +BRDA:72,16,0,1 +BRDA:76,17,0,1 +BRDA:80,18,0,1 +BRDA:81,19,0,1 +BRDA:86,20,0,1 +BRDA:87,21,0,1 +BRDA:92,22,0,1 +BRDA:93,23,0,1 +BRDA:94,24,0,1 +BRDA:100,25,0,1 +BRDA:101,26,0,1 +BRDA:107,27,0,1 +BRDA:111,28,0,1 +BRDA:112,29,0,1 +BRDA:113,30,0,1 +BRDA:114,31,0,1 +BRDA:122,32,0,1 +BRDA:123,33,0,1 +BRDA:130,34,0,1 +BRDA:131,35,0,1 +BRDA:132,36,0,1 +BRDA:140,37,0,1 +BRDA:141,38,0,1 +BRDA:142,39,0,1 +BRDA:150,40,0,1 +BRDA:151,41,0,1 +BRDA:159,42,0,1 +BRDA:160,43,0,1 +BRDA:161,44,0,1 +BRDA:166,45,0,1 +BRDA:167,46,0,1 +BRDA:171,47,0,1 +BRDA:172,48,0,1 +BRDA:173,49,0,1 +BRDA:187,50,0,1 +BRDA:195,51,0,1 +BRDA:198,52,0,1 +BRDA:215,53,0,1 +BRDA:219,54,0,1 +BRDA:220,55,0,1 +BRDA:225,56,0,1 +BRDA:229,57,0,1 +BRDA:233,58,0,1 +BRDA:238,59,0,1 +BRDA:242,60,0,1 +BRDA:246,61,0,1 +BRDA:251,62,0,1 +BRDA:256,63,0,1 +BRDA:257,64,0,1 +BRDA:263,65,0,1 +BRDA:264,66,0,1 +BRDA:269,67,0,1 +BRDA:270,68,0,1 +BRDA:277,69,0,1 +BRDA:287,70,0,1 +BRDA:289,71,0,1 +BRDA:298,72,0,1 +BRDA:300,73,0,1 +BRDA:309,74,0,1 +BRDA:310,75,0,1 +BRDA:313,76,0,1 +BRDA:318,77,0,1 +BRDA:319,78,0,1 +BRDA:324,79,0,1 +BRDA:329,80,0,1 +BRDA:330,81,0,1 +BRDA:335,82,0,1 +BRDA:339,83,0,1 +BRDA:342,84,0,1 +BRDA:343,85,0,0 +BRDA:345,86,0,1 +BRDA:350,87,0,1 +BRDA:353,88,0,1 +BRDA:354,89,0,0 +BRDA:356,90,0,1 +BRDA:361,91,0,1 +BRDA:364,92,0,0 +BRDA:362,93,0,1 +BRDA:363,94,0,1 +BRDA:367,95,0,1 +BRDA:370,96,0,0 +BRDA:368,97,0,1 +BRDA:369,98,0,1 +BRDA:375,99,0,1 +BRDA:379,100,0,1 +BRF:101 +BRH:97 +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:49,1 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,1 +DA:54,1 +DA:55,1 +DA:56,1 +DA:57,1 +DA:58,1 +DA:59,1 +DA:60,1 +DA:61,1 +DA:62,1 +DA:63,1 +DA:64,1 +DA:65,1 +DA:66,1 +DA:67,1 +DA:68,1 +DA:69,1 +DA:70,1 +DA:71,1 +DA:72,1 +DA:73,1 +DA:74,1 +DA:75,1 +DA:76,1 +DA:77,1 +DA:78,1 +DA:79,1 +DA:80,1 +DA:81,1 +DA:82,1 +DA:83,1 +DA:84,1 +DA:85,1 +DA:86,1 +DA:87,1 +DA:88,1 +DA:89,1 +DA:90,1 +DA:91,1 +DA:92,1 +DA:93,1 +DA:94,1 +DA:95,1 +DA:96,1 +DA:97,1 +DA:98,1 +DA:99,1 +DA:100,1 +DA:101,1 +DA:102,1 +DA:103,1 +DA:104,1 +DA:105,1 +DA:106,1 +DA:107,1 +DA:108,1 +DA:109,1 +DA:110,1 +DA:111,1 +DA:112,1 +DA:113,1 +DA:114,1 +DA:115,1 +DA:116,1 +DA:117,1 +DA:118,1 +DA:119,1 +DA:120,1 +DA:121,1 +DA:122,1 +DA:123,1 +DA:124,1 +DA:125,1 +DA:126,1 +DA:127,1 +DA:128,1 +DA:129,1 +DA:130,1 +DA:131,1 +DA:132,1 +DA:133,1 +DA:134,1 +DA:135,1 +DA:136,1 +DA:137,1 +DA:138,1 +DA:139,1 +DA:140,1 +DA:141,1 +DA:142,1 +DA:143,1 +DA:144,1 +DA:145,1 +DA:146,1 +DA:147,1 +DA:148,1 +DA:149,1 +DA:150,1 +DA:151,1 +DA:152,1 +DA:153,1 +DA:154,1 +DA:155,1 +DA:156,1 +DA:157,1 +DA:158,1 +DA:159,1 +DA:160,1 +DA:161,1 +DA:162,1 +DA:163,1 +DA:164,1 +DA:165,1 +DA:166,1 +DA:167,1 +DA:168,1 +DA:169,1 +DA:170,1 +DA:171,1 +DA:172,1 +DA:173,1 +DA:174,1 +DA:175,1 +DA:176,1 +DA:177,1 +DA:178,1 +DA:179,1 +DA:180,0 +DA:181,1 +DA:182,1 +DA:183,1 +DA:184,0 +DA:185,1 +DA:186,1 +DA:187,1 +DA:188,1 +DA:189,1 +DA:190,1 +DA:191,1 +DA:192,1 +DA:193,1 +DA:194,1 +DA:195,1 +DA:196,1 +DA:197,1 +DA:198,1 +DA:199,1 +DA:200,1 +DA:201,1 +DA:202,1 +DA:203,1 +DA:204,1 +DA:205,1 +DA:206,1 +DA:207,1 +DA:208,1 +DA:209,1 +DA:210,1 +DA:211,1 +DA:212,1 +DA:213,1 +DA:214,1 +DA:215,1 +DA:216,1 +DA:217,1 +DA:218,1 +DA:219,1 +DA:220,1 +DA:221,1 +DA:222,1 +DA:223,1 +DA:224,1 +DA:225,1 +DA:226,1 +DA:227,1 +DA:228,1 +DA:229,1 +DA:230,1 +DA:231,1 +DA:232,1 +DA:233,1 +DA:234,1 +DA:235,1 +DA:236,1 +DA:237,1 +DA:238,1 +DA:239,1 +DA:240,1 +DA:241,1 +DA:242,1 +DA:243,1 +DA:244,1 +DA:245,1 +DA:246,1 +DA:247,1 +DA:248,1 +DA:249,1 +DA:250,1 +DA:251,1 +DA:252,1 +DA:253,1 +DA:254,1 +DA:255,1 +DA:256,1 +DA:257,1 +DA:258,1 +DA:259,1 +DA:260,1 +DA:261,1 +DA:262,1 +DA:263,1 +DA:264,1 +DA:265,1 +DA:266,1 +DA:267,1 +DA:268,1 +DA:269,1 +DA:270,1 +DA:271,1 +DA:272,1 +DA:273,1 +DA:274,1 +DA:275,1 +DA:276,1 +DA:277,1 +DA:278,1 +DA:279,1 +DA:280,1 +DA:281,1 +DA:282,1 +DA:283,1 +DA:284,1 +DA:285,1 +DA:286,1 +DA:287,1 +DA:288,1 +DA:289,1 +DA:290,1 +DA:291,1 +DA:292,1 +DA:293,1 +DA:294,1 +DA:295,1 +DA:296,1 +DA:297,1 +DA:298,1 +DA:299,1 +DA:300,1 +DA:301,1 +DA:302,1 +DA:303,1 +DA:304,1 +DA:305,1 +DA:306,1 +DA:307,1 +DA:308,1 +DA:309,1 +DA:310,1 +DA:311,1 +DA:312,1 +DA:313,1 +DA:314,1 +DA:315,1 +DA:316,1 +DA:317,1 +DA:318,1 +DA:319,1 +DA:320,1 +DA:321,1 +DA:322,1 +DA:323,1 +DA:324,1 +DA:325,1 +DA:326,1 +DA:327,1 +DA:328,1 +DA:329,1 +DA:330,1 +DA:331,1 +DA:332,1 +DA:333,1 +DA:334,1 +DA:335,1 +DA:336,1 +DA:337,1 +DA:338,1 +DA:339,1 +DA:340,1 +DA:341,1 +DA:342,1 +DA:343,1 +DA:344,1 +DA:345,1 +DA:346,1 +DA:347,1 +DA:348,1 +DA:349,1 +DA:350,1 +DA:351,1 +DA:352,1 +DA:353,1 +DA:354,1 +DA:355,1 +DA:356,1 +DA:357,1 +DA:358,1 +DA:359,1 +DA:360,1 +DA:361,1 +DA:362,1 +DA:363,1 +DA:364,1 +DA:365,1 +DA:366,1 +DA:367,1 +DA:368,1 +DA:369,1 +DA:370,1 +DA:371,1 +DA:372,1 +DA:373,1 +DA:374,1 +DA:375,1 +DA:376,1 +DA:377,1 +DA:378,1 +DA:379,1 +DA:380,1 +DA:381,1 +DA:382,1 +DA:383,1 +DA:384,1 +DA:385,1 +DA:386,1 +DA:387,1 +DA:388,1 +DA:389,1 +DA:390,1 +DA:391,1 +LH:389 +LF:391 +end_of_record diff --git a/test/fixtures/test-runner/output/reset-color-depth.js b/test/fixtures/test-runner/output/reset-color-depth.js new file mode 100644 index 00000000000000..02c04b247ad4d9 --- /dev/null +++ b/test/fixtures/test-runner/output/reset-color-depth.js @@ -0,0 +1,5 @@ +'use strict'; + +// Make tests OS-independent by overriding stdio getColorDepth(). +process.stdout.getColorDepth = () => 8; +process.stderr.getColorDepth = () => 8; diff --git a/test/fixtures/utf8_test_text.txt b/test/fixtures/utf8_test_text.txt new file mode 100644 index 00000000000000..f4b6fc9bcfcb5e --- /dev/null +++ b/test/fixtures/utf8_test_text.txt @@ -0,0 +1 @@ +永和九年,嵗在癸丑,暮春之初,會於會稽山隂之蘭亭,脩稧事也。羣賢畢至,少長咸集。此地有崇山峻領,茂林脩竹;又有清流激湍,暎帶左右。引以為流觴曲水,列坐其次。雖無絲竹管弦之盛,一觴一詠,亦足以暢敘幽情。是日也,天朗氣清,恵風和暢;仰觀宇宙之大,俯察品類之盛;所以遊目騁懐,足以極視聽之娛,信可樂也。夫人之相與,俯仰一世,或取諸懐抱,悟言一室之內,或因寄所託,放浪形骸之外。雖趣舎萬殊,靜躁不同,當其欣扵所遇,暫得扵己,怏然自足,不知老之將至。及其所之既惓,情隨事遷,感慨係之矣。向之所欣,俛仰之閒以為陳跡,猶不能不以之興懐;況脩短隨化,終期扵盡。古人云:「死生亦大矣。」豈不痛哉!每攬昔人興感之由,若合一契,未嘗不臨文嗟悼,不能喻之扵懐。固知一死生為虛誕,齊彭殤為妄作。後之視今,亦由今之視昔,悲夫!故列敘時人,錄其所述,雖世殊事異,所以興懐,其致一也。後之攬者,亦將有感扵斯文。 \ No newline at end of file diff --git a/test/message/v8_warning.js b/test/fixtures/v8/v8_warning.js similarity index 89% rename from test/message/v8_warning.js rename to test/fixtures/v8/v8_warning.js index d7d1c5e7dbdff6..ab4d2bf305823f 100644 --- a/test/message/v8_warning.js +++ b/test/fixtures/v8/v8_warning.js @@ -1,6 +1,6 @@ 'use strict'; -require('../common'); +require('../../common'); function AsmModule() { 'use asm'; diff --git a/test/message/v8_warning.out b/test/fixtures/v8/v8_warning.snapshot similarity index 100% rename from test/message/v8_warning.out rename to test/fixtures/v8/v8_warning.snapshot diff --git a/test/fixtures/wpt/README.md b/test/fixtures/wpt/README.md index 15f1fc695bd762..6d635668f81a1c 100644 --- a/test/fixtures/wpt/README.md +++ b/test/fixtures/wpt/README.md @@ -11,6 +11,7 @@ See [test/wpt](../../wpt/README.md) for information on how these tests are run. Last update: - common: https://github.com/web-platform-tests/wpt/tree/dbd648158d/common +- compression: https://github.com/web-platform-tests/wpt/tree/c82521cfa5/compression - console: https://github.com/web-platform-tests/wpt/tree/767ae35464/console - dom/abort: https://github.com/web-platform-tests/wpt/tree/d1f1ecbd52/dom/abort - dom/events: https://github.com/web-platform-tests/wpt/tree/ab8999891c/dom/events @@ -22,12 +23,12 @@ Last update: - html/webappapis/microtask-queuing: https://github.com/web-platform-tests/wpt/tree/2c5c3c4c27/html/webappapis/microtask-queuing - html/webappapis/structured-clone: https://github.com/web-platform-tests/wpt/tree/47d3fb280c/html/webappapis/structured-clone - html/webappapis/timers: https://github.com/web-platform-tests/wpt/tree/5873f2d8f1/html/webappapis/timers -- interfaces: https://github.com/web-platform-tests/wpt/tree/df731dab88/interfaces +- interfaces: https://github.com/web-platform-tests/wpt/tree/727995f043/interfaces - performance-timeline: https://github.com/web-platform-tests/wpt/tree/17ebc3aea0/performance-timeline - resource-timing: https://github.com/web-platform-tests/wpt/tree/22d38586d0/resource-timing -- resources: https://github.com/web-platform-tests/wpt/tree/919874f84f/resources -- streams: https://github.com/web-platform-tests/wpt/tree/517e945bbf/streams -- url: https://github.com/web-platform-tests/wpt/tree/84782d9315/url +- resources: https://github.com/web-platform-tests/wpt/tree/1e140d63ec/resources +- streams: https://github.com/web-platform-tests/wpt/tree/a8872d92b1/streams +- url: https://github.com/web-platform-tests/wpt/tree/c2d7e70b52/url - user-timing: https://github.com/web-platform-tests/wpt/tree/5ae85bf826/user-timing - wasm/jsapi: https://github.com/web-platform-tests/wpt/tree/cde25e7e3c/wasm/jsapi - wasm/webapi: https://github.com/web-platform-tests/wpt/tree/fd1b23eeaa/wasm/webapi diff --git a/test/fixtures/wpt/compression/META.yml b/test/fixtures/wpt/compression/META.yml new file mode 100644 index 00000000000000..0afbe29a53e807 --- /dev/null +++ b/test/fixtures/wpt/compression/META.yml @@ -0,0 +1,3 @@ +spec: https://wicg.github.io/compression/ +suggested_reviewers: + - ricea diff --git a/test/fixtures/wpt/compression/compression-bad-chunks.tentative.any.js b/test/fixtures/wpt/compression/compression-bad-chunks.tentative.any.js new file mode 100644 index 00000000000000..2d0b5684733930 --- /dev/null +++ b/test/fixtures/wpt/compression/compression-bad-chunks.tentative.any.js @@ -0,0 +1,74 @@ +// META: global=window,worker,shadowrealm + +'use strict'; + +const badChunks = [ + { + name: 'undefined', + value: undefined + }, + { + name: 'null', + value: null + }, + { + name: 'numeric', + value: 3.14 + }, + { + name: 'object, not BufferSource', + value: {} + }, + { + name: 'array', + value: [65] + }, + { + name: 'SharedArrayBuffer', + // Use a getter to postpone construction so that all tests don't fail where + // SharedArrayBuffer is not yet implemented. + get value() { + // See https://github.com/whatwg/html/issues/5380 for why not `new SharedArrayBuffer()` + return new WebAssembly.Memory({ shared:true, initial:1, maximum:1 }).buffer; + } + }, + { + name: 'shared Uint8Array', + get value() { + // See https://github.com/whatwg/html/issues/5380 for why not `new SharedArrayBuffer()` + return new Uint8Array(new WebAssembly.Memory({ shared:true, initial:1, maximum:1 }).buffer) + } + }, +]; + +for (const chunk of badChunks) { + promise_test(async t => { + const cs = new CompressionStream('gzip'); + const reader = cs.readable.getReader(); + const writer = cs.writable.getWriter(); + const writePromise = writer.write(chunk.value); + const readPromise = reader.read(); + await promise_rejects_js(t, TypeError, writePromise, 'write should reject'); + await promise_rejects_js(t, TypeError, readPromise, 'read should reject'); + }, `chunk of type ${chunk.name} should error the stream for gzip`); + + promise_test(async t => { + const cs = new CompressionStream('deflate'); + const reader = cs.readable.getReader(); + const writer = cs.writable.getWriter(); + const writePromise = writer.write(chunk.value); + const readPromise = reader.read(); + await promise_rejects_js(t, TypeError, writePromise, 'write should reject'); + await promise_rejects_js(t, TypeError, readPromise, 'read should reject'); + }, `chunk of type ${chunk.name} should error the stream for deflate`); + + promise_test(async t => { + const cs = new CompressionStream('deflate-raw'); + const reader = cs.readable.getReader(); + const writer = cs.writable.getWriter(); + const writePromise = writer.write(chunk.value); + const readPromise = reader.read(); + await promise_rejects_js(t, TypeError, writePromise, 'write should reject'); + await promise_rejects_js(t, TypeError, readPromise, 'read should reject'); + }, `chunk of type ${chunk.name} should error the stream for deflate-raw`); +} diff --git a/test/fixtures/wpt/compression/compression-constructor-error.tentative.any.js b/test/fixtures/wpt/compression/compression-constructor-error.tentative.any.js new file mode 100644 index 00000000000000..b39ab93bd02aba --- /dev/null +++ b/test/fixtures/wpt/compression/compression-constructor-error.tentative.any.js @@ -0,0 +1,15 @@ +// META: global=window,worker,shadowrealm + +'use strict'; + +test(t => { + assert_throws_js(TypeError, () => new CompressionStream('a'), 'constructor should throw'); +}, '"a" should cause the constructor to throw'); + +test(t => { + assert_throws_js(TypeError, () => new CompressionStream(), 'constructor should throw'); +}, 'no input should cause the constructor to throw'); + +test(t => { + assert_throws_js(Error, () => new CompressionStream({ toString() { throw Error(); } }), 'constructor should throw'); +}, 'non-string input should cause the constructor to throw'); diff --git a/test/fixtures/wpt/compression/compression-including-empty-chunk.tentative.any.js b/test/fixtures/wpt/compression/compression-including-empty-chunk.tentative.any.js new file mode 100644 index 00000000000000..a7fd1ceb24f086 --- /dev/null +++ b/test/fixtures/wpt/compression/compression-including-empty-chunk.tentative.any.js @@ -0,0 +1,63 @@ +// META: global=window,worker,shadowrealm +// META: script=third_party/pako/pako_inflate.min.js +// META: timeout=long + +'use strict'; + +// This test asserts that compressing '' doesn't affect the compressed data. +// Example: compressing ['Hello', '', 'Hello'] results in 'HelloHello' + +async function compressChunkList(chunkList, format) { + const cs = new CompressionStream(format); + const writer = cs.writable.getWriter(); + for (const chunk of chunkList) { + const chunkByte = new TextEncoder().encode(chunk); + writer.write(chunkByte); + } + const closePromise = writer.close(); + const out = []; + const reader = cs.readable.getReader(); + let totalSize = 0; + while (true) { + const { value, done } = await reader.read(); + if (done) + break; + out.push(value); + totalSize += value.byteLength; + } + await closePromise; + const concatenated = new Uint8Array(totalSize); + let offset = 0; + for (const array of out) { + concatenated.set(array, offset); + offset += array.byteLength; + } + return concatenated; +} + +const chunkLists = [ + ['', 'Hello', 'Hello'], + ['Hello', '', 'Hello'], + ['Hello', 'Hello', ''] +]; +const expectedValue = new TextEncoder().encode('HelloHello'); + +for (const chunkList of chunkLists) { + promise_test(async t => { + const compressedData = await compressChunkList(chunkList, 'deflate'); + // decompress with pako, and check that we got the same result as our original string + assert_array_equals(expectedValue, pako.inflate(compressedData), 'value should match'); + }, `the result of compressing [${chunkList}] with deflate should be 'HelloHello'`); + + promise_test(async t => { + const compressedData = await compressChunkList(chunkList, 'gzip'); + // decompress with pako, and check that we got the same result as our original string + assert_array_equals(expectedValue, pako.inflate(compressedData), 'value should match'); + }, `the result of compressing [${chunkList}] with gzip should be 'HelloHello'`); + + promise_test(async t => { + const compressedData = await compressChunkList(chunkList, 'deflate-raw'); + // decompress with pako, and check that we got the same result as our original string + assert_array_equals(expectedValue, pako.inflateRaw(compressedData), 'value should match'); + }, `the result of compressing [${chunkList}] with deflate-raw should be 'HelloHello'`); +} diff --git a/test/fixtures/wpt/compression/compression-large-flush-output.any.js b/test/fixtures/wpt/compression/compression-large-flush-output.any.js new file mode 100644 index 00000000000000..6afcb4d52875b9 --- /dev/null +++ b/test/fixtures/wpt/compression/compression-large-flush-output.any.js @@ -0,0 +1,41 @@ +// META: global=window,worker,shadowrealm +// META: script=third_party/pako/pako_inflate.min.js +// META: script=resources/concatenate-stream.js +// META: timeout=long + +'use strict'; + +// This test verifies that a large flush output will not truncate the +// final results. + +async function compressData(chunk, format) { + const cs = new CompressionStream(format); + const writer = cs.writable.getWriter(); + writer.write(chunk); + writer.close(); + return await concatenateStream(cs.readable); +} + +// JSON-encoded array of 10 thousands numbers ("[0,1,2,...]"). This produces 48_891 bytes of data. +const fullData = new TextEncoder().encode(JSON.stringify(Array.from({ length: 10_000 }, (_, i) => i))); +const data = fullData.subarray(0, 35_579); +const expectedValue = data; + +promise_test(async t => { + const compressedData = await compressData(data, 'deflate'); + // decompress with pako, and check that we got the same result as our original string + assert_array_equals(expectedValue, pako.inflate(compressedData), 'value should match'); +}, `deflate compression with large flush output`); + +promise_test(async t => { + const compressedData = await compressData(data, 'gzip'); + // decompress with pako, and check that we got the same result as our original string + assert_array_equals(expectedValue, pako.inflate(compressedData), 'value should match'); +}, `gzip compression with large flush output`); + +promise_test(async t => { + const compressedData = await compressData(data, 'deflate-raw'); + // decompress with pako, and check that we got the same result as our original string + assert_array_equals(expectedValue, pako.inflateRaw(compressedData), 'value should match'); +}, `deflate-raw compression with large flush output`); + diff --git a/test/fixtures/wpt/compression/compression-multiple-chunks.tentative.any.js b/test/fixtures/wpt/compression/compression-multiple-chunks.tentative.any.js new file mode 100644 index 00000000000000..28a90e5ca53902 --- /dev/null +++ b/test/fixtures/wpt/compression/compression-multiple-chunks.tentative.any.js @@ -0,0 +1,67 @@ +// META: global=window,worker,shadowrealm +// META: script=third_party/pako/pako_inflate.min.js +// META: timeout=long + +'use strict'; + +// This test asserts that compressing multiple chunks should work. + +// Example: ('Hello', 3) => TextEncoder().encode('HelloHelloHello') +function makeExpectedChunk(input, numberOfChunks) { + const expectedChunk = input.repeat(numberOfChunks); + return new TextEncoder().encode(expectedChunk); +} + +// Example: ('Hello', 3, 'deflate') => compress ['Hello', 'Hello', Hello'] +async function compressMultipleChunks(input, numberOfChunks, format) { + const cs = new CompressionStream(format); + const writer = cs.writable.getWriter(); + const chunk = new TextEncoder().encode(input); + for (let i = 0; i < numberOfChunks; ++i) { + writer.write(chunk); + } + const closePromise = writer.close(); + const out = []; + const reader = cs.readable.getReader(); + let totalSize = 0; + while (true) { + const { value, done } = await reader.read(); + if (done) + break; + out.push(value); + totalSize += value.byteLength; + } + await closePromise; + const concatenated = new Uint8Array(totalSize); + let offset = 0; + for (const array of out) { + concatenated.set(array, offset); + offset += array.byteLength; + } + return concatenated; +} + +const hello = 'Hello'; + +for (let numberOfChunks = 2; numberOfChunks <= 16; ++numberOfChunks) { + promise_test(async t => { + const compressedData = await compressMultipleChunks(hello, numberOfChunks, 'deflate'); + const expectedValue = makeExpectedChunk(hello, numberOfChunks); + // decompress with pako, and check that we got the same result as our original string + assert_array_equals(expectedValue, pako.inflate(compressedData), 'value should match'); + }, `compressing ${numberOfChunks} chunks with deflate should work`); + + promise_test(async t => { + const compressedData = await compressMultipleChunks(hello, numberOfChunks, 'gzip'); + const expectedValue = makeExpectedChunk(hello, numberOfChunks); + // decompress with pako, and check that we got the same result as our original string + assert_array_equals(expectedValue, pako.inflate(compressedData), 'value should match'); + }, `compressing ${numberOfChunks} chunks with gzip should work`); + + promise_test(async t => { + const compressedData = await compressMultipleChunks(hello, numberOfChunks, 'deflate-raw'); + const expectedValue = makeExpectedChunk(hello, numberOfChunks); + // decompress with pako, and check that we got the same result as our original string + assert_array_equals(expectedValue, pako.inflateRaw(compressedData), 'value should match'); + }, `compressing ${numberOfChunks} chunks with deflate-raw should work`); +} diff --git a/test/fixtures/wpt/compression/compression-output-length.tentative.any.js b/test/fixtures/wpt/compression/compression-output-length.tentative.any.js new file mode 100644 index 00000000000000..7aa13734500d26 --- /dev/null +++ b/test/fixtures/wpt/compression/compression-output-length.tentative.any.js @@ -0,0 +1,64 @@ +// META: global=window,worker,shadowrealm + +'use strict'; + +// This test asserts that compressed data length is shorter than the original +// data length. If the input is extremely small, the compressed data may be +// larger than the original data. + +const LARGE_FILE = '/media/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr.webm'; + +async function compressArrayBuffer(input, format) { + const cs = new CompressionStream(format); + const writer = cs.writable.getWriter(); + writer.write(input); + const closePromise = writer.close(); + const out = []; + const reader = cs.readable.getReader(); + let totalSize = 0; + while (true) { + const { value, done } = await reader.read(); + if (done) + break; + out.push(value); + totalSize += value.byteLength; + } + await closePromise; + const concatenated = new Uint8Array(totalSize); + let offset = 0; + for (const array of out) { + concatenated.set(array, offset); + offset += array.byteLength; + } + return concatenated; +} + +promise_test(async () => { + const response = await fetch(LARGE_FILE); + const buffer = await response.arrayBuffer(); + const bufferView = new Uint8Array(buffer); + const originalLength = bufferView.length; + const compressedData = await compressArrayBuffer(bufferView, 'deflate'); + const compressedLength = compressedData.length; + assert_less_than(compressedLength, originalLength, 'output should be smaller'); +}, 'the length of deflated data should be shorter than that of the original data'); + +promise_test(async () => { + const response = await fetch(LARGE_FILE); + const buffer = await response.arrayBuffer(); + const bufferView = new Uint8Array(buffer); + const originalLength = bufferView.length; + const compressedData = await compressArrayBuffer(bufferView, 'gzip'); + const compressedLength = compressedData.length; + assert_less_than(compressedLength, originalLength, 'output should be smaller'); +}, 'the length of gzipped data should be shorter than that of the original data'); + +promise_test(async () => { + const response = await fetch(LARGE_FILE); + const buffer = await response.arrayBuffer(); + const bufferView = new Uint8Array(buffer); + const originalLength = bufferView.length; + const compressedData = await compressArrayBuffer(bufferView, 'deflate-raw'); + const compressedLength = compressedData.length; + assert_less_than(compressedLength, originalLength, 'output should be smaller'); +}, 'the length of deflated (with -raw) data should be shorter than that of the original data'); diff --git a/test/fixtures/wpt/compression/compression-stream.tentative.any.js b/test/fixtures/wpt/compression/compression-stream.tentative.any.js new file mode 100644 index 00000000000000..a7ea0cb908402f --- /dev/null +++ b/test/fixtures/wpt/compression/compression-stream.tentative.any.js @@ -0,0 +1,91 @@ +// META: global=window,worker,shadowrealm +// META: script=third_party/pako/pako_inflate.min.js +// META: timeout=long + +'use strict'; + +const SMALL_FILE = "/media/foo.vtt"; +const LARGE_FILE = "/media/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr.webm"; + +async function compressArrayBuffer(input, format) { + const cs = new CompressionStream(format); + const writer = cs.writable.getWriter(); + writer.write(input); + const closePromise = writer.close(); + const out = []; + const reader = cs.readable.getReader(); + let totalSize = 0; + while (true) { + const { value, done } = await reader.read(); + if (done) + break; + out.push(value); + totalSize += value.byteLength; + } + await closePromise; + const concatenated = new Uint8Array(totalSize); + let offset = 0; + for (const array of out) { + concatenated.set(array, offset); + offset += array.byteLength; + } + return concatenated; +} + +test(() => { + assert_throws_js(TypeError, () => { + const transformer = new CompressionStream("nonvalid"); + }, "non supported format should throw"); +}, "CompressionStream constructor should throw on invalid format"); + +promise_test(async () => { + const buffer = new ArrayBuffer(0); + const bufferView = new Uint8Array(buffer); + const compressedData = await compressArrayBuffer(bufferView, "deflate"); + // decompress with pako, and check that we got the same result as our original string + assert_array_equals(bufferView, pako.inflate(compressedData)); +}, "deflated empty data should be reinflated back to its origin"); + +promise_test(async () => { + const response = await fetch(SMALL_FILE) + const buffer = await response.arrayBuffer(); + const bufferView = new Uint8Array(buffer); + const compressedData = await compressArrayBuffer(bufferView, "deflate"); + // decompress with pako, and check that we got the same result as our original string + assert_array_equals(bufferView, pako.inflate(compressedData)); +}, "deflated small amount data should be reinflated back to its origin"); + +promise_test(async () => { + const response = await fetch(LARGE_FILE) + const buffer = await response.arrayBuffer(); + const bufferView = new Uint8Array(buffer); + const compressedData = await compressArrayBuffer(bufferView, "deflate"); + // decompress with pako, and check that we got the same result as our original string + assert_array_equals(bufferView, pako.inflate(compressedData)); +}, "deflated large amount data should be reinflated back to its origin"); + +promise_test(async () => { + const buffer = new ArrayBuffer(0); + const bufferView = new Uint8Array(buffer); + const compressedData = await compressArrayBuffer(bufferView, "gzip"); + // decompress with pako, and check that we got the same result as our original string + assert_array_equals(bufferView, pako.inflate(compressedData)); +}, "gzipped empty data should be reinflated back to its origin"); + +promise_test(async () => { + const response = await fetch(SMALL_FILE) + const buffer = await response.arrayBuffer(); + const bufferView = new Uint8Array(buffer); + const compressedData = await compressArrayBuffer(bufferView, "gzip"); + // decompress with pako, and check that we got the same result as our original string + assert_array_equals(bufferView, pako.inflate(compressedData)); +}, "gzipped small amount data should be reinflated back to its origin"); + +promise_test(async () => { + const response = await fetch(LARGE_FILE) + const buffer = await response.arrayBuffer(); + const bufferView = new Uint8Array(buffer); + const compressedData = await compressArrayBuffer(bufferView, "gzip"); + // decompress with pako, and check that we got the same result as our original string + assert_array_equals(bufferView, pako.inflate(compressedData)); +}, "gzipped large amount data should be reinflated back to its origin"); diff --git a/test/fixtures/wpt/compression/compression-with-detach.tentative.window.js b/test/fixtures/wpt/compression/compression-with-detach.tentative.window.js new file mode 100644 index 00000000000000..465feaa47d4e9a --- /dev/null +++ b/test/fixtures/wpt/compression/compression-with-detach.tentative.window.js @@ -0,0 +1,55 @@ +// META: global=window,worker,shadowrealm +// META: script=resources/concatenate-stream.js + +'use strict'; + +const kInputLength = 500000; + +function createLargeRandomInput() { + const buffer = new ArrayBuffer(kInputLength); + // The getRandomValues API will only let us get 65536 bytes at a time, so call + // it multiple times. + const kChunkSize = 65536; + for (let offset = 0; offset < kInputLength; offset += kChunkSize) { + const length = + offset + kChunkSize > kInputLength ? kInputLength - offset : kChunkSize; + const view = new Uint8Array(buffer, offset, length); + crypto.getRandomValues(view); + } + return new Uint8Array(buffer); +} + +function decompress(view) { + const ds = new DecompressionStream('deflate'); + const writer = ds.writable.getWriter(); + writer.write(view); + writer.close(); + return concatenateStream(ds.readable); +} + +promise_test(async () => { + const input = createLargeRandomInput(); + const inputCopy = input.slice(0, input.byteLength); + const cs = new CompressionStream('deflate'); + const writer = cs.writable.getWriter(); + writer.write(input); + writer.close(); + // Object.prototype.then will be looked up synchronously when the promise + // returned by read() is resolved. + Object.defineProperty(Object.prototype, 'then', { + get() { + // Cause input to become detached and unreferenced. + try { + postMessage(undefined, 'nowhere', [input.buffer]); + } catch (e) { + // It's already detached. + } + } + }); + const output = await concatenateStream(cs.readable); + // Perform the comparison as strings since this is reasonably fast even when + // JITted JavaScript is running under an emulator. + assert_equals( + inputCopy.toString(), (await decompress(output)).toString(), + 'decompressing the output should return the input'); +}, 'data should be correctly compressed even if input is detached partway'); diff --git a/test/fixtures/wpt/compression/decompression-bad-chunks.tentative.any.js b/test/fixtures/wpt/compression/decompression-bad-chunks.tentative.any.js new file mode 100644 index 00000000000000..f450b0c4cb2553 --- /dev/null +++ b/test/fixtures/wpt/compression/decompression-bad-chunks.tentative.any.js @@ -0,0 +1,85 @@ +// META: global=window,worker,shadowrealm + +'use strict'; + +const badChunks = [ + { + name: 'undefined', + value: undefined + }, + { + name: 'null', + value: null + }, + { + name: 'numeric', + value: 3.14 + }, + { + name: 'object, not BufferSource', + value: {} + }, + { + name: 'array', + value: [65] + }, + { + name: 'SharedArrayBuffer', + // Use a getter to postpone construction so that all tests don't fail where + // SharedArrayBuffer is not yet implemented. + get value() { + // See https://github.com/whatwg/html/issues/5380 for why not `new SharedArrayBuffer()` + return new WebAssembly.Memory({ shared:true, initial:1, maximum:1 }).buffer; + } + }, + { + name: 'shared Uint8Array', + get value() { + // See https://github.com/whatwg/html/issues/5380 for why not `new SharedArrayBuffer()` + return new Uint8Array(new WebAssembly.Memory({ shared:true, initial:1, maximum:1 }).buffer) + } + }, + { + name: 'invalid deflate bytes', + value: new Uint8Array([0, 156, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 48, 173, 6, 36]) + }, + { + name: 'invalid gzip bytes', + value: new Uint8Array([0, 139, 8, 0, 0, 0, 0, 0, 0, 3, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 176, 1, 57, 179, 15, 0, 0, 0]) + }, +]; + +// Test Case Design +// We need to wait until after we close the writable stream to check if the decoded stream is valid. +// We can end up in a state where all reads/writes are valid, but upon closing the writable stream an error is detected. +// (Example: A zlib encoded chunk w/o the checksum). + +async function decompress(chunk, format, t) +{ + const ds = new DecompressionStream(format); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + + writer.write(chunk.value).then(() => {}, () => {}); + reader.read().then(() => {}, () => {}); + + await promise_rejects_js(t, TypeError, writer.close(), 'writer.close() should reject'); + await promise_rejects_js(t, TypeError, writer.closed, 'write.closed should reject'); + + await promise_rejects_js(t, TypeError, reader.read(), 'reader.read() should reject'); + await promise_rejects_js(t, TypeError, reader.closed, 'read.closed should reject'); +} + +for (const chunk of badChunks) { + promise_test(async t => { + await decompress(chunk, 'gzip', t); + }, `chunk of type ${chunk.name} should error the stream for gzip`); + + promise_test(async t => { + await decompress(chunk, 'deflate', t); + }, `chunk of type ${chunk.name} should error the stream for deflate`); + + promise_test(async t => { + await decompress(chunk, 'deflate-raw', t); + }, `chunk of type ${chunk.name} should error the stream for deflate-raw`); +} diff --git a/test/fixtures/wpt/compression/decompression-buffersource.tentative.any.js b/test/fixtures/wpt/compression/decompression-buffersource.tentative.any.js new file mode 100644 index 00000000000000..e81fc566779800 --- /dev/null +++ b/test/fixtures/wpt/compression/decompression-buffersource.tentative.any.js @@ -0,0 +1,192 @@ +// META: global=window,worker,shadowrealm + +'use strict'; + +const compressedBytesWithDeflate = [120, 156, 75, 52, 48, 52, 50, 54, 49, 53, 3, 0, 8, 136, 1, 199]; +const compressedBytesWithGzip = [31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 75, 52, 48, 52, 2, 0, 216, 252, 63, 136, 4, 0, 0, 0]; +const compressedBytesWithDeflateRaw = [ + 0x00, 0x06, 0x00, 0xf9, 0xff, 0x41, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x01, 0x00, 0x00, 0xff, 0xff, +]; +// These chunk values below were chosen to make the length of the compressed +// output be a multiple of 8 bytes. +const deflateExpectedChunkValue = new TextEncoder().encode('a0123456'); +const gzipExpectedChunkValue = new TextEncoder().encode('a012'); +const deflateRawExpectedChunkValue = new TextEncoder().encode('ABCDEF'); + +const bufferSourceChunksForDeflate = [ + { + name: 'ArrayBuffer', + value: new Uint8Array(compressedBytesWithDeflate).buffer + }, + { + name: 'Int8Array', + value: new Int8Array(new Uint8Array(compressedBytesWithDeflate).buffer) + }, + { + name: 'Uint8Array', + value: new Uint8Array(new Uint8Array(compressedBytesWithDeflate).buffer) + }, + { + name: 'Uint8ClampedArray', + value: new Uint8ClampedArray(new Uint8Array(compressedBytesWithDeflate).buffer) + }, + { + name: 'Int16Array', + value: new Int16Array(new Uint8Array(compressedBytesWithDeflate).buffer) + }, + { + name: 'Uint16Array', + value: new Uint16Array(new Uint8Array(compressedBytesWithDeflate).buffer) + }, + { + name: 'Int32Array', + value: new Int32Array(new Uint8Array(compressedBytesWithDeflate).buffer) + }, + { + name: 'Uint32Array', + value: new Uint32Array(new Uint8Array(compressedBytesWithDeflate).buffer) + }, + { + name: 'Float32Array', + value: new Float32Array(new Uint8Array(compressedBytesWithDeflate).buffer) + }, + { + name: 'Float64Array', + value: new Float64Array(new Uint8Array(compressedBytesWithDeflate).buffer) + }, + { + name: 'DataView', + value: new DataView(new Uint8Array(compressedBytesWithDeflate).buffer) + }, +]; + +const bufferSourceChunksForGzip = [ + { + name: 'ArrayBuffer', + value: new Uint8Array(compressedBytesWithGzip).buffer + }, + { + name: 'Int8Array', + value: new Int8Array(new Uint8Array(compressedBytesWithGzip).buffer) + }, + { + name: 'Uint8Array', + value: new Uint8Array(new Uint8Array(compressedBytesWithGzip).buffer) + }, + { + name: 'Uint8ClambedArray', + value: new Uint8ClampedArray(new Uint8Array(compressedBytesWithGzip).buffer) + }, + { + name: 'Int16Array', + value: new Int16Array(new Uint8Array(compressedBytesWithGzip).buffer) + }, + { + name: 'Uint16Array', + value: new Uint16Array(new Uint8Array(compressedBytesWithGzip).buffer) + }, + { + name: 'Int32Array', + value: new Int32Array(new Uint8Array(compressedBytesWithGzip).buffer) + }, + { + name: 'Uint32Array', + value: new Uint32Array(new Uint8Array(compressedBytesWithGzip).buffer) + }, + { + name: 'Float32Array', + value: new Float32Array(new Uint8Array(compressedBytesWithGzip).buffer) + }, + { + name: 'Float64Array', + value: new Float64Array(new Uint8Array(compressedBytesWithGzip).buffer) + }, + { + name: 'DataView', + value: new DataView(new Uint8Array(compressedBytesWithGzip).buffer) + }, +]; + +const bufferSourceChunksForDeflateRaw = [ + { + name: 'ArrayBuffer', + value: new Uint8Array(compressedBytesWithDeflateRaw).buffer + }, + { + name: 'Int8Array', + value: new Int8Array(new Uint8Array(compressedBytesWithDeflateRaw).buffer) + }, + { + name: 'Uint8Array', + value: new Uint8Array(new Uint8Array(compressedBytesWithDeflateRaw).buffer) + }, + { + name: 'Uint8ClampedArray', + value: new Uint8ClampedArray(new Uint8Array(compressedBytesWithDeflateRaw).buffer) + }, + { + name: 'Int16Array', + value: new Int16Array(new Uint8Array(compressedBytesWithDeflateRaw).buffer) + }, + { + name: 'Uint16Array', + value: new Uint16Array(new Uint8Array(compressedBytesWithDeflateRaw).buffer) + }, + { + name: 'Int32Array', + value: new Int32Array(new Uint8Array(compressedBytesWithDeflateRaw).buffer) + }, + { + name: 'Uint32Array', + value: new Uint32Array(new Uint8Array(compressedBytesWithDeflateRaw).buffer) + }, + { + name: 'Float32Array', + value: new Float32Array(new Uint8Array(compressedBytesWithDeflateRaw).buffer) + }, + { + name: 'Float64Array', + value: new Float64Array(new Uint8Array(compressedBytesWithDeflateRaw).buffer) + }, + { + name: 'DataView', + value: new DataView(new Uint8Array(compressedBytesWithDeflateRaw).buffer) + }, +]; + +for (const chunk of bufferSourceChunksForDeflate) { + promise_test(async t => { + const ds = new DecompressionStream('deflate'); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + const writePromise = writer.write(chunk.value); + writer.close(); + const { value } = await reader.read(); + assert_array_equals(Array.from(value), deflateExpectedChunkValue, 'value should match'); + }, `chunk of type ${chunk.name} should work for deflate`); +} + +for (const chunk of bufferSourceChunksForGzip) { + promise_test(async t => { + const ds = new DecompressionStream('gzip'); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + const writePromise = writer.write(chunk.value); + writer.close(); + const { value } = await reader.read(); + assert_array_equals(Array.from(value), gzipExpectedChunkValue, 'value should match'); + }, `chunk of type ${chunk.name} should work for gzip`); +} + +for (const chunk of bufferSourceChunksForDeflateRaw) { + promise_test(async t => { + const ds = new DecompressionStream('deflate-raw'); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + const writePromise = writer.write(chunk.value); + writer.close(); + const { value } = await reader.read(); + assert_array_equals(Array.from(value), deflateRawExpectedChunkValue, 'value should match'); + }, `chunk of type ${chunk.name} should work for deflate-raw`); +} diff --git a/test/fixtures/wpt/compression/decompression-constructor-error.tentative.any.js b/test/fixtures/wpt/compression/decompression-constructor-error.tentative.any.js new file mode 100644 index 00000000000000..0270ba7353128c --- /dev/null +++ b/test/fixtures/wpt/compression/decompression-constructor-error.tentative.any.js @@ -0,0 +1,15 @@ +// META: global=window,worker,shadowrealm + +'use strict'; + +test(t => { + assert_throws_js(TypeError, () => new DecompressionStream('a'), 'constructor should throw'); +}, '"a" should cause the constructor to throw'); + +test(t => { + assert_throws_js(TypeError, () => new DecompressionStream(), 'constructor should throw'); +}, 'no input should cause the constructor to throw'); + +test(t => { + assert_throws_js(Error, () => new DecompressionStream({ toString() { throw Error(); } }), 'constructor should throw'); +}, 'non-string input should cause the constructor to throw'); diff --git a/test/fixtures/wpt/compression/decompression-correct-input.tentative.any.js b/test/fixtures/wpt/compression/decompression-correct-input.tentative.any.js new file mode 100644 index 00000000000000..90519445e3667b --- /dev/null +++ b/test/fixtures/wpt/compression/decompression-correct-input.tentative.any.js @@ -0,0 +1,39 @@ +// META: global=window,worker,shadowrealm + +'use strict'; + +const deflateChunkValue = new Uint8Array([120, 156, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 48, 173, 6, 36]); +const gzipChunkValue = new Uint8Array([31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 176, 1, 57, 179, 15, 0, 0, 0]); +const deflateRawChunkValue = new Uint8Array([ + 0x4b, 0xad, 0x28, 0x48, 0x4d, 0x2e, 0x49, 0x4d, 0x51, 0xc8, + 0x2f, 0x2d, 0x29, 0x28, 0x2d, 0x01, 0x00, +]); +const trueChunkValue = new TextEncoder().encode('expected output'); + +promise_test(async t => { + const ds = new DecompressionStream('deflate'); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + const writePromise = writer.write(deflateChunkValue); + const { done, value } = await reader.read(); + assert_array_equals(Array.from(value), trueChunkValue, "value should match"); +}, 'decompressing deflated input should work'); + + +promise_test(async t => { + const ds = new DecompressionStream('gzip'); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + const writePromise = writer.write(gzipChunkValue); + const { done, value } = await reader.read(); + assert_array_equals(Array.from(value), trueChunkValue, "value should match"); +}, 'decompressing gzip input should work'); + +promise_test(async t => { + const ds = new DecompressionStream('deflate-raw'); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + const writePromise = writer.write(deflateRawChunkValue); + const { done, value } = await reader.read(); + assert_array_equals(Array.from(value), trueChunkValue, "value should match"); +}, 'decompressing deflated (with -raw) input should work'); diff --git a/test/fixtures/wpt/compression/decompression-corrupt-input.tentative.any.js b/test/fixtures/wpt/compression/decompression-corrupt-input.tentative.any.js new file mode 100644 index 00000000000000..fc18197dfbd3db --- /dev/null +++ b/test/fixtures/wpt/compression/decompression-corrupt-input.tentative.any.js @@ -0,0 +1,318 @@ +// META global=window,worker,shadowrealm + +// This test checks that DecompressionStream behaves according to the standard +// when the input is corrupted. To avoid a combinatorial explosion in the +// number of tests, we only mutate one field at a time, and we only test +// "interesting" values. + +'use strict'; + +// The many different cases are summarised in this data structure. +const expectations = [ + { + format: 'deflate', + + // Decompresses to 'expected output'. + baseInput: [120, 156, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, + 40, 45, 1, 0, 48, 173, 6, 36], + + // See RFC1950 for the definition of the various fields used by deflate: + // https://tools.ietf.org/html/rfc1950. + fields: [ + { + // The function of this field. This matches the name used in the RFC. + name: 'CMF', + + // The offset of the field in bytes from the start of the input. + offset: 0, + + // The length of the field in bytes. + length: 1, + + cases: [ + { + // The value to set the field to. If the field contains multiple + // bytes, all the bytes will be set to this value. + value: 0, + + // The expected result. 'success' means the input is decoded + // successfully. 'error' means that the stream will be errored. + result: 'error' + } + ] + }, + { + name: 'FLG', + offset: 1, + length: 1, + + // FLG contains a 4-bit checksum (FCHECK) which is calculated in such a + // way that there are 4 valid values for this field. + cases: [ + { + value: 218, + result: 'success' + }, + { + value: 1, + result: 'success' + }, + { + value: 94, + result: 'success' + }, + { + // The remaining 252 values cause an error. + value: 157, + result: 'error' + } + ] + }, + { + name: 'DATA', + // In general, changing any bit of the data will trigger a checksum + // error. Only the last byte does anything else. + offset: 18, + length: 1, + cases: [ + { + value: 4, + result: 'success' + }, + { + value: 5, + result: 'error' + } + ] + }, + { + name: 'ADLER', + offset: -4, + length: 4, + cases: [ + { + value: 255, + result: 'error' + } + ] + } + ] + }, + { + format: 'gzip', + + // Decompresses to 'expected output'. + baseInput: [31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 75, 173, 40, 72, 77, 46, 73, + 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 176, 1, 57, 179, 15, 0, + 0, 0], + + // See RFC1952 for the definition of the various fields used by gzip: + // https://tools.ietf.org/html/rfc1952. + fields: [ + { + name: 'ID', + offset: 0, + length: 2, + cases: [ + { + value: 255, + result: 'error' + } + ] + }, + { + name: 'CM', + offset: 2, + length: 1, + cases: [ + { + value: 0, + result: 'error' + } + ] + }, + { + name: 'FLG', + offset: 3, + length: 1, + cases: [ + { + value: 1, // FTEXT + result: 'success' + }, + { + value: 2, // FHCRC + result: 'error' + } + ] + }, + { + name: 'MTIME', + offset: 4, + length: 4, + cases: [ + { + // Any value is valid for this field. + value: 255, + result: 'success' + } + ] + }, + { + name: 'XFL', + offset: 8, + length: 1, + cases: [ + { + // Any value is accepted. + value: 255, + result: 'success' + } + ] + }, + { + name: 'OS', + offset: 9, + length: 1, + cases: [ + { + // Any value is accepted. + value: 128, + result: 'success' + } + ] + }, + { + name: 'DATA', + + // The last byte of the data is the most interesting. + offset: 26, + length: 1, + cases: [ + { + value: 3, + result: 'error' + }, + { + value: 4, + result: 'success' + } + ] + }, + { + name: 'CRC', + offset: -8, + length: 4, + cases: [ + { + // Any change will error the stream. + value: 0, + result: 'error' + } + ] + }, + { + name: 'ISIZE', + offset: -4, + length: 4, + cases: [ + { + // A mismatch will error the stream. + value: 1, + result: 'error' + } + ] + } + ] + } +]; + +async function tryDecompress(input, format) { + const ds = new DecompressionStream(format); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + writer.write(input).catch(() => {}); + writer.close().catch(() => {}); + let out = []; + while (true) { + try { + const { value, done } = await reader.read(); + if (done) { + break; + } + out = out.concat(Array.from(value)); + } catch (e) { + if (e instanceof TypeError) { + return { result: 'error' }; + } else { + return { result: e.name }; + } + } + } + const expectedOutput = 'expected output'; + if (out.length !== expectedOutput.length) { + return { result: 'corrupt' }; + } + for (let i = 0; i < out.length; ++i) { + if (out[i] !== expectedOutput.charCodeAt(i)) { + return { result: 'corrupt' }; + } + } + return { result: 'success' }; +} + +function corruptInput(input, offset, length, value) { + const output = new Uint8Array(input); + if (offset < 0) { + offset += input.length; + } + for (let i = offset; i < offset + length; ++i) { + output[i] = value; + } + return output; +} + +for (const { format, baseInput, fields } of expectations) { + promise_test(async () => { + const { result } = await tryDecompress(new Uint8Array(baseInput), format); + assert_equals(result, 'success', 'decompression should succeed'); + }, `the unchanged input for '${format}' should decompress successfully`); + + promise_test(async () => { + const truncatedInput = new Uint8Array(baseInput.slice(0, -1)); + const { result } = await tryDecompress(truncatedInput, format); + assert_equals(result, 'error', 'decompression should fail'); + }, `truncating the input for '${format}' should give an error`); + + promise_test(async () => { + const extendedInput = new Uint8Array(baseInput.concat([0])); + const { result } = await tryDecompress(extendedInput, format); + assert_equals(result, 'error', 'decompression should fail'); + }, `trailing junk for '${format}' should give an error`); + + for (const { name, offset, length, cases } of fields) { + for (const { value, result } of cases) { + promise_test(async () => { + const corruptedInput = corruptInput(baseInput, offset, length, value); + const { result: actual } = + await tryDecompress(corruptedInput, format); + assert_equals(actual, result, 'result should match'); + }, `format '${format}' field ${name} should be ${result} for ${value}`); + } + } +} + +promise_test(async () => { + // Data generated in Python: + // ```py + // h = b"thequickbrownfoxjumped\x00" + // words = h.split() + // zdict = b''.join(words) + // co = zlib.compressobj(zdict=zdict) + // cd = co.compress(h) + co.flush() + // ``` + const { result } = await tryDecompress(new Uint8Array([ + 0x78, 0xbb, 0x74, 0xee, 0x09, 0x59, 0x2b, 0xc1, 0x2e, 0x0c, 0x00, 0x74, 0xee, 0x09, 0x59 + ]), 'deflate'); + assert_equals(result, 'error', 'Data compressed with a dictionary should throw TypeError'); +}, 'the deflate input compressed with dictionary should give an error') diff --git a/test/fixtures/wpt/compression/decompression-empty-input.tentative.any.js b/test/fixtures/wpt/compression/decompression-empty-input.tentative.any.js new file mode 100644 index 00000000000000..201db8ec0b0d7c --- /dev/null +++ b/test/fixtures/wpt/compression/decompression-empty-input.tentative.any.js @@ -0,0 +1,43 @@ +// META: global=window,worker,shadowrealm + +'use strict'; + +const gzipEmptyValue = new Uint8Array([31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0]); +const deflateEmptyValue = new Uint8Array([120, 156, 3, 0, 0, 0, 0, 1]); +const deflateRawEmptyValue = new Uint8Array([1, 0, 0, 255, 255]); + +promise_test(async t => { + const ds = new DecompressionStream('gzip'); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + const writePromise = writer.write(gzipEmptyValue); + writer.close(); + const { value, done } = await reader.read(); + assert_true(done, "read() should set done"); + assert_equals(value, undefined, "value should be undefined"); + await writePromise; +}, 'decompressing gzip empty input should work'); + +promise_test(async t => { + const ds = new DecompressionStream('deflate'); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + const writePromise = writer.write(deflateEmptyValue); + writer.close(); + const { value, done } = await reader.read(); + assert_true(done, "read() should set done"); + assert_equals(value, undefined, "value should be undefined"); + await writePromise; +}, 'decompressing deflate empty input should work'); + +promise_test(async t => { + const ds = new DecompressionStream('deflate-raw'); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + const writePromise = writer.write(deflateRawEmptyValue); + writer.close(); + const { value, done } = await reader.read(); + assert_true(done, "read() should set done"); + assert_equals(value, undefined, "value should be undefined"); + await writePromise; +}, 'decompressing deflate-raw empty input should work'); diff --git a/test/fixtures/wpt/compression/decompression-split-chunk.tentative.any.js b/test/fixtures/wpt/compression/decompression-split-chunk.tentative.any.js new file mode 100644 index 00000000000000..eb12c2a2360cd9 --- /dev/null +++ b/test/fixtures/wpt/compression/decompression-split-chunk.tentative.any.js @@ -0,0 +1,53 @@ +// META: global=window,worker,shadowrealm + +'use strict'; + +const compressedBytesWithDeflate = new Uint8Array([120, 156, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 48, 173, 6, 36]); +const compressedBytesWithGzip = new Uint8Array([31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 176, 1, 57, 179, 15, 0, 0, 0]); +const compressedBytesWithDeflateRaw = new Uint8Array([ + 0x4b, 0xad, 0x28, 0x48, 0x4d, 0x2e, 0x49, 0x4d, 0x51, 0xc8, + 0x2f, 0x2d, 0x29, 0x28, 0x2d, 0x01, 0x00, +]); +const expectedChunkValue = new TextEncoder().encode('expected output'); + +async function decompressArrayBuffer(input, format, chunkSize) { + const ds = new DecompressionStream(format); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + for (let beginning = 0; beginning < input.length; beginning += chunkSize) { + writer.write(input.slice(beginning, beginning + chunkSize)); + } + writer.close(); + const out = []; + let totalSize = 0; + while (true) { + const { value, done } = await reader.read(); + if (done) break; + out.push(value); + totalSize += value.byteLength; + } + const concatenated = new Uint8Array(totalSize); + let offset = 0; + for (const array of out) { + concatenated.set(array, offset); + offset += array.byteLength; + } + return concatenated; +} + +for (let chunkSize = 1; chunkSize < 16; ++chunkSize) { + promise_test(async t => { + const decompressedData = await decompressArrayBuffer(compressedBytesWithDeflate, 'deflate', chunkSize); + assert_array_equals(decompressedData, expectedChunkValue, "value should match"); + }, `decompressing splitted chunk into pieces of size ${chunkSize} should work in deflate`); + + promise_test(async t => { + const decompressedData = await decompressArrayBuffer(compressedBytesWithGzip, 'gzip', chunkSize); + assert_array_equals(decompressedData, expectedChunkValue, "value should match"); + }, `decompressing splitted chunk into pieces of size ${chunkSize} should work in gzip`); + + promise_test(async t => { + const decompressedData = await decompressArrayBuffer(compressedBytesWithDeflateRaw, 'deflate-raw', chunkSize); + assert_array_equals(decompressedData, expectedChunkValue, "value should match"); + }, `decompressing splitted chunk into pieces of size ${chunkSize} should work in deflate-raw`); +} diff --git a/test/fixtures/wpt/compression/decompression-uint8array-output.tentative.any.js b/test/fixtures/wpt/compression/decompression-uint8array-output.tentative.any.js new file mode 100644 index 00000000000000..0c45a0aaa727f1 --- /dev/null +++ b/test/fixtures/wpt/compression/decompression-uint8array-output.tentative.any.js @@ -0,0 +1,30 @@ +// META: global=window,worker,shadowrealm +// META: timeout=long +// +// This test isn't actually slow usually, but sometimes it takes >10 seconds on +// Firefox with service worker for no obvious reason. + +'use strict'; + +const deflateChunkValue = new Uint8Array([120, 156, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 48, 173, 6, 36]); +const gzipChunkValue = new Uint8Array([31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 75, 173, 40, 72, 77, 46, 73, 77, 81, 200, 47, 45, 41, 40, 45, 1, 0, 176, 1, 57, 179, 15, 0, 0, 0]); + +promise_test(async t => { + const ds = new DecompressionStream('deflate'); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + const writePromise = writer.write(deflateChunkValue); + const { value } = await reader.read(); + assert_equals(value.constructor, Uint8Array, "type should match"); + await writePromise; +}, 'decompressing deflated output should give Uint8Array chunks'); + +promise_test(async t => { + const ds = new DecompressionStream('gzip'); + const reader = ds.readable.getReader(); + const writer = ds.writable.getWriter(); + const writePromise = writer.write(gzipChunkValue); + const { value } = await reader.read(); + assert_equals(value.constructor, Uint8Array, "type should match"); + await writePromise; +}, 'decompressing gzip output should give Uint8Array chunks'); diff --git a/test/fixtures/wpt/compression/decompression-with-detach.tentative.window.js b/test/fixtures/wpt/compression/decompression-with-detach.tentative.window.js new file mode 100644 index 00000000000000..1ff9c269837022 --- /dev/null +++ b/test/fixtures/wpt/compression/decompression-with-detach.tentative.window.js @@ -0,0 +1,41 @@ +// META: global=window,worker,shadowrealm +// META: script=resources/concatenate-stream.js + +'use strict'; + +const kInputLength = 1000000; + +async function createLargeCompressedInput() { + const cs = new CompressionStream('deflate'); + // The input has to be large enough that it won't fit in a single chunk when + // decompressed. + const writer = cs.writable.getWriter(); + writer.write(new Uint8Array(kInputLength)); + writer.close(); + return concatenateStream(cs.readable); +} + +promise_test(async () => { + const input = await createLargeCompressedInput(); + const ds = new DecompressionStream('deflate'); + const writer = ds.writable.getWriter(); + writer.write(input); + writer.close(); + // Object.prototype.then will be looked up synchronously when the promise + // returned by read() is resolved. + Object.defineProperty(Object.prototype, 'then', { + get() { + // Cause input to become detached and unreferenced. + try { + postMessage(undefined, 'nowhere', [input.buffer]); + } catch (e) { + // It's already detached. + } + } + }); + const output = await concatenateStream(ds.readable); + // If output successfully decompressed and gave the right length, we can be + // reasonably confident that no data corruption happened. + assert_equals( + output.byteLength, kInputLength, 'output should be the right length'); +}, 'data should be correctly decompressed even if input is detached partway'); diff --git a/test/fixtures/wpt/compression/idlharness-shadowrealm.window.js b/test/fixtures/wpt/compression/idlharness-shadowrealm.window.js new file mode 100644 index 00000000000000..2fdc807ee07e32 --- /dev/null +++ b/test/fixtures/wpt/compression/idlharness-shadowrealm.window.js @@ -0,0 +1,2 @@ +// META: script=/resources/idlharness-shadowrealm.js +idl_test_shadowrealm(["compression"], ["streams"]); diff --git a/test/fixtures/wpt/compression/idlharness.https.any.js b/test/fixtures/wpt/compression/idlharness.https.any.js new file mode 100644 index 00000000000000..8d96cf523c4953 --- /dev/null +++ b/test/fixtures/wpt/compression/idlharness.https.any.js @@ -0,0 +1,17 @@ +// META: script=/resources/WebIDLParser.js +// META: script=/resources/idlharness.js + +'use strict'; + +// https://wicg.github.io/compression/ + +idl_test( + ['compression'], + ['streams'], + idl_array => { + idl_array.add_objects({ + CompressionStream: ['new CompressionStream("deflate")'], + DecompressionStream: ['new DecompressionStream("deflate")'], + }); + } +); diff --git a/test/fixtures/wpt/compression/resources/concatenate-stream.js b/test/fixtures/wpt/compression/resources/concatenate-stream.js new file mode 100644 index 00000000000000..a35bb1416e7548 --- /dev/null +++ b/test/fixtures/wpt/compression/resources/concatenate-stream.js @@ -0,0 +1,25 @@ +'use strict'; + +// Read all the chunks from a stream that returns BufferSource objects and +// concatenate them into a single Uint8Array. +async function concatenateStream(readableStream) { + const reader = readableStream.getReader(); + let totalSize = 0; + const buffers = []; + while (true) { + const { value, done } = await reader.read(); + if (done) { + break; + } + buffers.push(value); + totalSize += value.byteLength; + } + reader.releaseLock(); + const concatenated = new Uint8Array(totalSize); + let offset = 0; + for (const buffer of buffers) { + concatenated.set(buffer, offset); + offset += buffer.byteLength; + } + return concatenated; +} diff --git a/deps/npm/node_modules/humanize-ms/LICENSE b/test/fixtures/wpt/compression/third_party/pako/LICENSE similarity index 92% rename from deps/npm/node_modules/humanize-ms/LICENSE rename to test/fixtures/wpt/compression/third_party/pako/LICENSE index 89de354795ec7a..a934ef8db47845 100644 --- a/deps/npm/node_modules/humanize-ms/LICENSE +++ b/test/fixtures/wpt/compression/third_party/pako/LICENSE @@ -1,3 +1,7 @@ +(The MIT License) + +Copyright (C) 2014-2017 by Vitaly Puzrin and Andrei Tuputcyn + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights diff --git a/test/fixtures/wpt/compression/third_party/pako/README b/test/fixtures/wpt/compression/third_party/pako/README new file mode 100644 index 00000000000000..96028388ebb9d5 --- /dev/null +++ b/test/fixtures/wpt/compression/third_party/pako/README @@ -0,0 +1,2 @@ +original repository: +https://github.com/nodeca/pako diff --git a/test/fixtures/wpt/compression/third_party/pako/pako_inflate.min.js b/test/fixtures/wpt/compression/third_party/pako/pako_inflate.min.js new file mode 100644 index 00000000000000..a191a78a8956cd --- /dev/null +++ b/test/fixtures/wpt/compression/third_party/pako/pako_inflate.min.js @@ -0,0 +1 @@ +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).pako=e()}}(function(){return function r(o,s,f){function l(t,e){if(!s[t]){if(!o[t]){var i="function"==typeof require&&require;if(!e&&i)return i(t,!0);if(d)return d(t,!0);var n=new Error("Cannot find module '"+t+"'");throw n.code="MODULE_NOT_FOUND",n}var a=s[t]={exports:{}};o[t][0].call(a.exports,function(e){return l(o[t][1][e]||e)},a,a.exports,r,o,s,f)}return s[t].exports}for(var d="function"==typeof require&&require,e=0;e>>6:(i<65536?t[r++]=224|i>>>12:(t[r++]=240|i>>>18,t[r++]=128|i>>>12&63),t[r++]=128|i>>>6&63),t[r++]=128|63&i);return t},i.buf2binstring=function(e){return d(e,e.length)},i.binstring2buf=function(e){for(var t=new f.Buf8(e.length),i=0,n=t.length;i>10&1023,s[n++]=56320|1023&a)}return d(s,n)},i.utf8border=function(e,t){var i;for((t=t||e.length)>e.length&&(t=e.length),i=t-1;0<=i&&128==(192&e[i]);)i--;return i<0?t:0===i?t:i+l[e[i]]>t?i:t}},{"./common":1}],3:[function(e,t,i){"use strict";t.exports=function(e,t,i,n){for(var a=65535&e|0,r=e>>>16&65535|0,o=0;0!==i;){for(i-=o=2e3>>1:e>>>1;t[i]=e}return t}();t.exports=function(e,t,i,n){var a=s,r=n+i;e^=-1;for(var o=n;o>>8^a[255&(e^t[o])];return-1^e}},{}],6:[function(e,t,i){"use strict";t.exports=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}},{}],7:[function(e,t,i){"use strict";t.exports=function(e,t){var i,n,a,r,o,s,f,l,d,c,u,h,b,m,w,k,_,g,v,p,x,y,S,E,Z;i=e.state,n=e.next_in,E=e.input,a=n+(e.avail_in-5),r=e.next_out,Z=e.output,o=r-(t-e.avail_out),s=r+(e.avail_out-257),f=i.dmax,l=i.wsize,d=i.whave,c=i.wnext,u=i.window,h=i.hold,b=i.bits,m=i.lencode,w=i.distcode,k=(1<>>=v=g>>>24,b-=v,0===(v=g>>>16&255))Z[r++]=65535&g;else{if(!(16&v)){if(0==(64&v)){g=m[(65535&g)+(h&(1<>>=v,b-=v),b<15&&(h+=E[n++]<>>=v=g>>>24,b-=v,!(16&(v=g>>>16&255))){if(0==(64&v)){g=w[(65535&g)+(h&(1<>>=v,b-=v,(v=r-o)>3,h&=(1<<(b-=p<<3))-1,e.next_in=n,e.next_out=r,e.avail_in=n>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function r(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new z.Buf16(320),this.work=new z.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function o(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=F,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new z.Buf32(n),t.distcode=t.distdyn=new z.Buf32(a),t.sane=1,t.back=-1,T):U}function s(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,o(e)):U}function f(e,t){var i,n;return e&&e.state?(n=e.state,t<0?(i=0,t=-t):(i=1+(t>>4),t<48&&(t&=15)),t&&(t<8||15=r.wsize?(z.arraySet(r.window,t,i-r.wsize,r.wsize,0),r.wnext=0,r.whave=r.wsize):(n<(a=r.wsize-r.wnext)&&(a=n),z.arraySet(r.window,t,i-n,a,r.wnext),(n-=a)?(z.arraySet(r.window,t,i-n,n,0),r.wnext=n,r.whave=r.wsize):(r.wnext+=a,r.wnext===r.wsize&&(r.wnext=0),r.whave>>8&255,i.check=N(i.check,B,2,0),d=l=0,i.mode=2;break}if(i.flags=0,i.head&&(i.head.done=!1),!(1&i.wrap)||(((255&l)<<8)+(l>>8))%31){e.msg="incorrect header check",i.mode=30;break}if(8!=(15&l)){e.msg="unknown compression method",i.mode=30;break}if(d-=4,x=8+(15&(l>>>=4)),0===i.wbits)i.wbits=x;else if(x>i.wbits){e.msg="invalid window size",i.mode=30;break}i.dmax=1<>8&1),512&i.flags&&(B[0]=255&l,B[1]=l>>>8&255,i.check=N(i.check,B,2,0)),d=l=0,i.mode=3;case 3:for(;d<32;){if(0===s)break e;s--,l+=n[r++]<>>8&255,B[2]=l>>>16&255,B[3]=l>>>24&255,i.check=N(i.check,B,4,0)),d=l=0,i.mode=4;case 4:for(;d<16;){if(0===s)break e;s--,l+=n[r++]<>8),512&i.flags&&(B[0]=255&l,B[1]=l>>>8&255,i.check=N(i.check,B,2,0)),d=l=0,i.mode=5;case 5:if(1024&i.flags){for(;d<16;){if(0===s)break e;s--,l+=n[r++]<>>8&255,i.check=N(i.check,B,2,0)),d=l=0}else i.head&&(i.head.extra=null);i.mode=6;case 6:if(1024&i.flags&&(s<(h=i.length)&&(h=s),h&&(i.head&&(x=i.head.extra_len-i.length,i.head.extra||(i.head.extra=new Array(i.head.extra_len)),z.arraySet(i.head.extra,n,r,h,x)),512&i.flags&&(i.check=N(i.check,n,h,r)),s-=h,r+=h,i.length-=h),i.length))break e;i.length=0,i.mode=7;case 7:if(2048&i.flags){if(0===s)break e;for(h=0;x=n[r+h++],i.head&&x&&i.length<65536&&(i.head.name+=String.fromCharCode(x)),x&&h>9&1,i.head.done=!0),e.adler=i.check=0,i.mode=12;break;case 10:for(;d<32;){if(0===s)break e;s--,l+=n[r++]<>>=7&d,d-=7&d,i.mode=27;break}for(;d<3;){if(0===s)break e;s--,l+=n[r++]<>>=1)){case 0:i.mode=14;break;case 1:if(H(i),i.mode=20,6!==t)break;l>>>=2,d-=2;break e;case 2:i.mode=17;break;case 3:e.msg="invalid block type",i.mode=30}l>>>=2,d-=2;break;case 14:for(l>>>=7&d,d-=7&d;d<32;){if(0===s)break e;s--,l+=n[r++]<>>16^65535)){e.msg="invalid stored block lengths",i.mode=30;break}if(i.length=65535&l,d=l=0,i.mode=15,6===t)break e;case 15:i.mode=16;case 16:if(h=i.length){if(s>>=5,d-=5,i.ndist=1+(31&l),l>>>=5,d-=5,i.ncode=4+(15&l),l>>>=4,d-=4,286>>=3,d-=3}for(;i.have<19;)i.lens[A[i.have++]]=0;if(i.lencode=i.lendyn,i.lenbits=7,S={bits:i.lenbits},y=C(0,i.lens,0,19,i.lencode,0,i.work,S),i.lenbits=S.bits,y){e.msg="invalid code lengths set",i.mode=30;break}i.have=0,i.mode=19;case 19:for(;i.have>>16&255,_=65535&Z,!((w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<>>=w,d-=w,i.lens[i.have++]=_;else{if(16===_){for(E=w+2;d>>=w,d-=w,0===i.have){e.msg="invalid bit length repeat",i.mode=30;break}x=i.lens[i.have-1],h=3+(3&l),l>>>=2,d-=2}else if(17===_){for(E=w+3;d>>=w)),l>>>=3,d-=3}else{for(E=w+7;d>>=w)),l>>>=7,d-=7}if(i.have+h>i.nlen+i.ndist){e.msg="invalid bit length repeat",i.mode=30;break}for(;h--;)i.lens[i.have++]=x}}if(30===i.mode)break;if(0===i.lens[256]){e.msg="invalid code -- missing end-of-block",i.mode=30;break}if(i.lenbits=9,S={bits:i.lenbits},y=C(I,i.lens,0,i.nlen,i.lencode,0,i.work,S),i.lenbits=S.bits,y){e.msg="invalid literal/lengths set",i.mode=30;break}if(i.distbits=6,i.distcode=i.distdyn,S={bits:i.distbits},y=C(D,i.lens,i.nlen,i.ndist,i.distcode,0,i.work,S),i.distbits=S.bits,y){e.msg="invalid distances set",i.mode=30;break}if(i.mode=20,6===t)break e;case 20:i.mode=21;case 21:if(6<=s&&258<=f){e.next_out=o,e.avail_out=f,e.next_in=r,e.avail_in=s,i.hold=l,i.bits=d,O(e,u),o=e.next_out,a=e.output,f=e.avail_out,r=e.next_in,n=e.input,s=e.avail_in,l=i.hold,d=i.bits,12===i.mode&&(i.back=-1);break}for(i.back=0;k=(Z=i.lencode[l&(1<>>16&255,_=65535&Z,!((w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<>g)])>>>16&255,_=65535&Z,!(g+(w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<>>=g,d-=g,i.back+=g}if(l>>>=w,d-=w,i.back+=w,i.length=_,0===k){i.mode=26;break}if(32&k){i.back=-1,i.mode=12;break}if(64&k){e.msg="invalid literal/length code",i.mode=30;break}i.extra=15&k,i.mode=22;case 22:if(i.extra){for(E=i.extra;d>>=i.extra,d-=i.extra,i.back+=i.extra}i.was=i.length,i.mode=23;case 23:for(;k=(Z=i.distcode[l&(1<>>16&255,_=65535&Z,!((w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<>g)])>>>16&255,_=65535&Z,!(g+(w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<>>=g,d-=g,i.back+=g}if(l>>>=w,d-=w,i.back+=w,64&k){e.msg="invalid distance code",i.mode=30;break}i.offset=_,i.extra=15&k,i.mode=24;case 24:if(i.extra){for(E=i.extra;d>>=i.extra,d-=i.extra,i.back+=i.extra}if(i.offset>i.dmax){e.msg="invalid distance too far back",i.mode=30;break}i.mode=25;case 25:if(0===f)break e;if(h=u-f,i.offset>h){if((h=i.offset-h)>i.whave&&i.sane){e.msg="invalid distance too far back",i.mode=30;break}h>i.wnext?(h-=i.wnext,b=i.wsize-h):b=i.wnext-h,h>i.length&&(h=i.length),m=i.window}else m=a,b=o-i.offset,h=i.length;for(fh?(m=O[C+o[g]],w=A[z+o[g]]):(m=96,w=0),f=1<<_-S,v=l=1<>S)+(l-=f)]=b<<24|m<<16|w|0,0!==l;);for(f=1<<_-1;B&f;)f>>=1;if(0!==f?(B&=f-1,B+=f):B=0,g++,0==--R[_]){if(_===p)break;_=t[i+o[g]]}if(x<_&&(B&c)!==d){for(0===S&&(S=x),u+=v,E=1<<(y=_-S);y+S signals); readonly attribute boolean aborted; readonly attribute any reason; @@ -618,7 +619,7 @@ callback interface XPathNSResolver { interface mixin XPathEvaluatorBase { [NewObject] XPathExpression createExpression(DOMString expression, optional XPathNSResolver? resolver = null); - XPathNSResolver createNSResolver(Node nodeResolver); + Node createNSResolver(Node nodeResolver); // legacy // XPathResult.ANY_TYPE = 0 XPathResult evaluate(DOMString expression, Node contextNode, optional XPathNSResolver? resolver = null, optional unsigned short type = 0, optional XPathResult? result = null); }; diff --git a/test/fixtures/wpt/interfaces/encoding.idl b/test/fixtures/wpt/interfaces/encoding.idl index a8cbe4431a2dc7..a9499f62378dd9 100644 --- a/test/fixtures/wpt/interfaces/encoding.idl +++ b/test/fixtures/wpt/interfaces/encoding.idl @@ -22,7 +22,7 @@ dictionary TextDecodeOptions { interface TextDecoder { constructor(optional DOMString label = "utf-8", optional TextDecoderOptions options = {}); - USVString decode(optional [AllowShared] BufferSource input, optional TextDecodeOptions options = {}); + USVString decode(optional AllowSharedBufferSource input, optional TextDecodeOptions options = {}); }; TextDecoder includes TextDecoderCommon; diff --git a/test/fixtures/wpt/interfaces/hr-time.idl b/test/fixtures/wpt/interfaces/hr-time.idl index 13aa109b6c764c..835ee8a65c84c0 100644 --- a/test/fixtures/wpt/interfaces/hr-time.idl +++ b/test/fixtures/wpt/interfaces/hr-time.idl @@ -7,7 +7,7 @@ typedef double DOMHighResTimeStamp; typedef unsigned long long EpochTimeStamp; -[Exposed=*] +[Exposed=(Window,Worker)] interface Performance : EventTarget { DOMHighResTimeStamp now(); readonly attribute DOMHighResTimeStamp timeOrigin; diff --git a/test/fixtures/wpt/interfaces/html.idl b/test/fixtures/wpt/interfaces/html.idl index d9068b4ad1e550..c7f744ccbe601b 100644 --- a/test/fixtures/wpt/interfaces/html.idl +++ b/test/fixtures/wpt/interfaces/html.idl @@ -98,7 +98,6 @@ partial interface Document { // also has obsolete members }; Document includes GlobalEventHandlers; -Document includes DocumentAndElementEventHandlers; partial interface mixin DocumentOrShadowRoot { readonly attribute Element? activeElement; @@ -128,10 +127,15 @@ interface HTMLElement : Element { [CEReactions] attribute [LegacyNullToEmptyString] DOMString outerText; ElementInternals attachInternals(); + + // The popover API + undefined showPopover(); + undefined hidePopover(); + boolean togglePopover(optional boolean force); + [CEReactions] attribute DOMString? popover; }; HTMLElement includes GlobalEventHandlers; -HTMLElement includes DocumentAndElementEventHandlers; HTMLElement includes ElementContentEditable; HTMLElement includes HTMLOrSVGElement; @@ -204,6 +208,7 @@ interface HTMLLinkElement : HTMLElement { [CEReactions] attribute DOMString referrerPolicy; [SameObject, PutForwards=value] readonly attribute DOMTokenList blocking; [CEReactions] attribute boolean disabled; + [CEReactions] attribute DOMString fetchPriority; // also has obsolete members }; @@ -432,6 +437,7 @@ interface HTMLImageElement : HTMLElement { [CEReactions] attribute DOMString referrerPolicy; [CEReactions] attribute DOMString decoding; [CEReactions] attribute DOMString loading; + [CEReactions] attribute DOMString fetchPriority; Promise decode(); @@ -886,7 +892,7 @@ interface HTMLInputElement : HTMLElement { [CEReactions] attribute DOMString formTarget; [CEReactions] attribute unsigned long height; attribute boolean indeterminate; - readonly attribute HTMLElement? list; + readonly attribute HTMLDataListElement? list; [CEReactions] attribute DOMString max; [CEReactions] attribute long maxLength; [CEReactions] attribute DOMString min; @@ -931,6 +937,7 @@ interface HTMLInputElement : HTMLElement { // also has obsolete members }; +HTMLInputElement includes PopoverInvokerElement; [Exposed=Window] interface HTMLButtonElement : HTMLElement { @@ -956,6 +963,7 @@ interface HTMLButtonElement : HTMLElement { readonly attribute NodeList labels; }; +HTMLButtonElement includes PopoverInvokerElement; [Exposed=Window] interface HTMLSelectElement : HTMLElement { @@ -1216,6 +1224,7 @@ interface HTMLScriptElement : HTMLElement { [CEReactions] attribute DOMString integrity; [CEReactions] attribute DOMString referrerPolicy; [SameObject, PutForwards=value] readonly attribute DOMTokenList blocking; + [CEReactions] attribute DOMString fetchPriority; static boolean supports(DOMString type); @@ -1364,14 +1373,7 @@ interface mixin CanvasShadowStyles { interface mixin CanvasFilters { // filters - attribute (DOMString or CanvasFilter) filter; // (default "none") -}; - -typedef record CanvasFilterInput; - -[Exposed=(Window,Worker,PaintWorklet)] -interface CanvasFilter { - constructor(optional (CanvasFilterInput or sequence) filters); + attribute DOMString filter; // (default "none") }; interface mixin CanvasRect { @@ -1592,6 +1594,7 @@ OffscreenCanvasRenderingContext2D includes CanvasPath; interface CustomElementRegistry { [CEReactions] undefined define(DOMString name, CustomElementConstructor constructor, optional ElementDefinitionOptions options = {}); (CustomElementConstructor or undefined) get(DOMString name); + DOMString? getName(CustomElementConstructor constructor); Promise whenDefined(DOMString name); [CEReactions] undefined upgrade(Node root); }; @@ -1641,8 +1644,39 @@ dictionary ValidityStateFlags { boolean customError = false; }; +[Exposed=(Window)] +interface VisibilityStateEntry : PerformanceEntry { + readonly attribute DOMString name; // shadows inherited name + readonly attribute DOMString entryType; // shadows inherited entryType + readonly attribute DOMHighResTimeStamp startTime; // shadows inherited startTime + readonly attribute unsigned long duration; // shadows inherited duration +}; + +[Exposed=Window] +interface UserActivation { + readonly attribute boolean hasBeenActive; + readonly attribute boolean isActive; +}; + +partial interface Navigator { + [SameObject] readonly attribute UserActivation userActivation; +}; + +[Exposed=Window] +interface ToggleEvent : Event { + constructor(DOMString type, optional ToggleEventInit eventInitDict = {}); + readonly attribute DOMString oldState; + readonly attribute DOMString newState; +}; + +dictionary ToggleEventInit : EventInit { + DOMString oldState = ""; + DOMString newState = ""; +}; + dictionary FocusOptions { boolean preventScroll = false; + boolean focusVisible; }; interface mixin ElementContentEditable { @@ -1702,6 +1736,11 @@ dictionary DragEventInit : MouseEventInit { DataTransfer? dataTransfer = null; }; +interface mixin PopoverInvokerElement { + [CEReactions] attribute Element? popoverTargetElement; + [CEReactions] attribute DOMString popoverTargetAction; +}; + [Global=Window, Exposed=Window, LegacyUnenumerableNamedProperties] @@ -1713,6 +1752,7 @@ interface Window : EventTarget { attribute DOMString name; [PutForwards=href, LegacyUnforgeable] readonly attribute Location location; readonly attribute History history; + readonly attribute Navigation navigation; readonly attribute CustomElementRegistry customElements; [Replaceable] readonly attribute BarProp locationbar; [Replaceable] readonly attribute BarProp menubar; @@ -1735,14 +1775,15 @@ interface Window : EventTarget { [Replaceable] readonly attribute WindowProxy? parent; readonly attribute Element? frameElement; WindowProxy? open(optional USVString url = "", optional DOMString target = "_blank", optional [LegacyNullToEmptyString] DOMString features = ""); - getter object (DOMString name); + // Since this is the global object, the IDL named getter adds a NamedPropertiesObject exotic // object on the prototype chain. Indeed, this does not make the global object an exotic object. // Indexed access is taken care of by the WindowProxy exotic object. + getter object (DOMString name); // the user agent readonly attribute Navigator navigator; - readonly attribute Navigator clientInformation; // legacy alias of .navigator + [Replaceable] readonly attribute Navigator clientInformation; // legacy alias of .navigator readonly attribute boolean originAgentCluster; // user prompts @@ -1769,20 +1810,6 @@ interface BarProp { readonly attribute boolean visible; }; -enum ScrollRestoration { "auto", "manual" }; - -[Exposed=Window] -interface History { - readonly attribute unsigned long length; - attribute ScrollRestoration scrollRestoration; - readonly attribute any state; - undefined go(optional long delta = 0); - undefined back(); - undefined forward(); - undefined pushState(any data, DOMString unused, optional USVString? url = null); - undefined replaceState(any data, DOMString unused, optional USVString? url = null); -}; - [Exposed=Window] interface Location { // but see also additional creation steps and overridden internal methods [LegacyUnforgeable] stringifier attribute USVString href; @@ -1802,15 +1829,183 @@ interface Location { // but see also additional creation steps and overridden in [LegacyUnforgeable, SameObject] readonly attribute DOMStringList ancestorOrigins; }; +enum ScrollRestoration { "auto", "manual" }; + +[Exposed=Window] +interface History { + readonly attribute unsigned long length; + attribute ScrollRestoration scrollRestoration; + readonly attribute any state; + undefined go(optional long delta = 0); + undefined back(); + undefined forward(); + undefined pushState(any data, DOMString unused, optional USVString? url = null); + undefined replaceState(any data, DOMString unused, optional USVString? url = null); +}; + +[Exposed=Window] +interface Navigation : EventTarget { + sequence entries(); + readonly attribute NavigationHistoryEntry? currentEntry; + undefined updateCurrentEntry(NavigationUpdateCurrentEntryOptions options); + readonly attribute NavigationTransition? transition; + + readonly attribute boolean canGoBack; + readonly attribute boolean canGoForward; + + NavigationResult navigate(USVString url, optional NavigationNavigateOptions options = {}); + NavigationResult reload(optional NavigationReloadOptions options = {}); + + NavigationResult traverseTo(DOMString key, optional NavigationOptions options = {}); + NavigationResult back(optional NavigationOptions options = {}); + NavigationResult forward(optional NavigationOptions options = {}); + + attribute EventHandler onnavigate; + attribute EventHandler onnavigatesuccess; + attribute EventHandler onnavigateerror; + attribute EventHandler oncurrententrychange; +}; + +dictionary NavigationUpdateCurrentEntryOptions { + required any state; +}; + +dictionary NavigationOptions { + any info; +}; + +dictionary NavigationNavigateOptions : NavigationOptions { + any state; + NavigationHistoryBehavior history = "auto"; +}; + +dictionary NavigationReloadOptions : NavigationOptions { + any state; +}; + +dictionary NavigationResult { + Promise committed; + Promise finished; +}; + +enum NavigationHistoryBehavior { + "auto", + "push", + "replace" +}; + +enum NavigationType { + "push", + "replace", + "reload", + "traverse" +}; + +[Exposed=Window] +interface NavigationHistoryEntry : EventTarget { + readonly attribute USVString? url; + readonly attribute DOMString key; + readonly attribute DOMString id; + readonly attribute long long index; + readonly attribute boolean sameDocument; + + any getState(); + + attribute EventHandler ondispose; +}; + +[Exposed=Window] +interface NavigationTransition { + readonly attribute NavigationType navigationType; + readonly attribute NavigationHistoryEntry from; + readonly attribute Promise finished; +}; + +[Exposed=Window] +interface NavigateEvent : Event { + constructor(DOMString type, NavigateEventInit eventInitDict); + + readonly attribute NavigationType navigationType; + readonly attribute NavigationDestination destination; + readonly attribute boolean canIntercept; + readonly attribute boolean userInitiated; + readonly attribute boolean hashChange; + readonly attribute AbortSignal signal; + readonly attribute FormData? formData; + readonly attribute DOMString? downloadRequest; + readonly attribute any info; + readonly attribute boolean hasUAVisualTransition; + + undefined intercept(optional NavigationInterceptOptions options = {}); + undefined scroll(); +}; + +dictionary NavigateEventInit : EventInit { + NavigationType navigationType = "push"; + required NavigationDestination destination; + boolean canIntercept = false; + boolean userInitiated = false; + boolean hashChange = false; + required AbortSignal signal; + FormData? formData = null; + DOMString? downloadRequest = null; + any info; + boolean hasUAVisualTransition = false; +}; + +dictionary NavigationInterceptOptions { + NavigationInterceptHandler handler; + NavigationFocusReset focusReset; + NavigationScrollBehavior scroll; +}; + +enum NavigationFocusReset { + "after-transition", + "manual" +}; + +enum NavigationScrollBehavior { + "after-transition", + "manual" +}; + +callback NavigationInterceptHandler = Promise (); + +[Exposed=Window] +interface NavigationDestination { + readonly attribute USVString url; + readonly attribute DOMString key; + readonly attribute DOMString id; + readonly attribute long long index; + readonly attribute boolean sameDocument; + + any getState(); +}; + +[Exposed=Window] +interface NavigationCurrentEntryChangeEvent : Event { + constructor(DOMString type, NavigationCurrentEntryChangeEventInit eventInitDict); + + readonly attribute NavigationType? navigationType; + readonly attribute NavigationHistoryEntry from; +}; + +dictionary NavigationCurrentEntryChangeEventInit : EventInit { + NavigationType? navigationType = null; + required NavigationHistoryEntry from; +}; + [Exposed=Window] interface PopStateEvent : Event { constructor(DOMString type, optional PopStateEventInit eventInitDict = {}); readonly attribute any state; + readonly attribute boolean hasUAVisualTransition; }; dictionary PopStateEventInit : EventInit { any state = null; + boolean hasUAVisualTransition = false; }; [Exposed=Window] @@ -1891,6 +2086,7 @@ interface mixin GlobalEventHandlers { attribute EventHandler onauxclick; attribute EventHandler onbeforeinput; attribute EventHandler onbeforematch; + attribute EventHandler onbeforetoggle; attribute EventHandler onblur; attribute EventHandler oncancel; attribute EventHandler oncanplay; @@ -1901,7 +2097,9 @@ interface mixin GlobalEventHandlers { attribute EventHandler oncontextlost; attribute EventHandler oncontextmenu; attribute EventHandler oncontextrestored; + attribute EventHandler oncopy; attribute EventHandler oncuechange; + attribute EventHandler oncut; attribute EventHandler ondblclick; attribute EventHandler ondrag; attribute EventHandler ondragend; @@ -1932,6 +2130,7 @@ interface mixin GlobalEventHandlers { attribute EventHandler onmouseout; attribute EventHandler onmouseover; attribute EventHandler onmouseup; + attribute EventHandler onpaste; attribute EventHandler onpause; attribute EventHandler onplay; attribute EventHandler onplaying; @@ -1940,6 +2139,7 @@ interface mixin GlobalEventHandlers { attribute EventHandler onreset; attribute EventHandler onresize; attribute EventHandler onscroll; + attribute EventHandler onscrollend; attribute EventHandler onsecuritypolicyviolation; attribute EventHandler onseeked; attribute EventHandler onseeking; @@ -1978,12 +2178,6 @@ interface mixin WindowEventHandlers { attribute EventHandler onunload; }; -interface mixin DocumentAndElementEventHandlers { - attribute EventHandler oncopy; - attribute EventHandler oncut; - attribute EventHandler onpaste; -}; - typedef (DOMString or Function) TimerHandler; interface mixin WindowOrWorkerGlobalScope { @@ -2132,13 +2326,13 @@ typedef (CanvasImageSource or Blob or ImageData) ImageBitmapSource; -enum ImageOrientation { "none", "flipY" }; +enum ImageOrientation { "from-image", "flipY" }; enum PremultiplyAlpha { "none", "premultiply", "default" }; enum ColorSpaceConversion { "none", "default" }; enum ResizeQuality { "pixelated", "low", "medium", "high" }; dictionary ImageBitmapOptions { - ImageOrientation imageOrientation = "none"; + ImageOrientation imageOrientation = "from-image"; PremultiplyAlpha premultiplyAlpha = "default"; ColorSpaceConversion colorSpaceConversion = "default"; [EnforceRange] unsigned long resizeWidth; diff --git a/test/fixtures/wpt/interfaces/performance-timeline.idl b/test/fixtures/wpt/interfaces/performance-timeline.idl index 9f6cc5e2e902dc..cdd8fafd8c64e6 100644 --- a/test/fixtures/wpt/interfaces/performance-timeline.idl +++ b/test/fixtures/wpt/interfaces/performance-timeline.idl @@ -1,7 +1,7 @@ // GENERATED CONTENT - DO NOT EDIT // Content was automatically extracted by Reffy into webref // (https://github.com/w3c/webref) -// Source: Performance Timeline Level 2 (https://w3c.github.io/performance-timeline/) +// Source: Performance Timeline (https://w3c.github.io/performance-timeline/) partial interface Performance { PerformanceEntryList getEntries (); @@ -10,7 +10,7 @@ partial interface Performance { }; typedef sequence PerformanceEntryList; -[Exposed=*] +[Exposed=(Window,Worker)] interface PerformanceEntry { readonly attribute DOMString name; readonly attribute DOMString entryType; @@ -22,7 +22,7 @@ interface PerformanceEntry { callback PerformanceObserverCallback = undefined (PerformanceObserverEntryList entries, PerformanceObserver observer, optional PerformanceObserverCallbackOptions options = {}); -[Exposed=*] +[Exposed=(Window,Worker)] interface PerformanceObserver { constructor(PerformanceObserverCallback callback); undefined observe (optional PerformanceObserverInit options = {}); @@ -41,7 +41,7 @@ dictionary PerformanceObserverInit { boolean buffered; }; -[Exposed=*] +[Exposed=(Window,Worker)] interface PerformanceObserverEntryList { PerformanceEntryList getEntries(); PerformanceEntryList getEntriesByType (DOMString type); diff --git a/test/fixtures/wpt/interfaces/resource-timing.idl b/test/fixtures/wpt/interfaces/resource-timing.idl index 235963b804bf9a..33fed05b756838 100644 --- a/test/fixtures/wpt/interfaces/resource-timing.idl +++ b/test/fixtures/wpt/interfaces/resource-timing.idl @@ -1,11 +1,12 @@ // GENERATED CONTENT - DO NOT EDIT // Content was automatically extracted by Reffy into webref // (https://github.com/w3c/webref) -// Source: Resource Timing Level 2 (https://w3c.github.io/resource-timing/) +// Source: Resource Timing (https://w3c.github.io/resource-timing/) [Exposed=(Window,Worker)] interface PerformanceResourceTiming : PerformanceEntry { readonly attribute DOMString initiatorType; + readonly attribute DOMString deliveryType; readonly attribute ByteString nextHopProtocol; readonly attribute DOMHighResTimeStamp workerStart; readonly attribute DOMHighResTimeStamp redirectStart; @@ -17,14 +18,23 @@ interface PerformanceResourceTiming : PerformanceEntry { readonly attribute DOMHighResTimeStamp connectEnd; readonly attribute DOMHighResTimeStamp secureConnectionStart; readonly attribute DOMHighResTimeStamp requestStart; + readonly attribute DOMHighResTimeStamp firstInterimResponseStart; readonly attribute DOMHighResTimeStamp responseStart; readonly attribute DOMHighResTimeStamp responseEnd; readonly attribute unsigned long long transferSize; readonly attribute unsigned long long encodedBodySize; readonly attribute unsigned long long decodedBodySize; + readonly attribute unsigned short responseStatus; + readonly attribute RenderBlockingStatusType renderBlockingStatus; + readonly attribute DOMString contentType; [Default] object toJSON(); }; +enum RenderBlockingStatusType { + "blocking", + "non-blocking" +}; + partial interface Performance { undefined clearResourceTimings (); undefined setResourceTimingBufferSize (unsigned long maxSize); diff --git a/test/fixtures/wpt/interfaces/streams.idl b/test/fixtures/wpt/interfaces/streams.idl index fd5420f16a0967..838bf39c6d6df5 100644 --- a/test/fixtures/wpt/interfaces/streams.idl +++ b/test/fixtures/wpt/interfaces/streams.idl @@ -7,6 +7,8 @@ interface ReadableStream { constructor(optional object underlyingSource, optional QueuingStrategy strategy = {}); + static ReadableStream from(any asyncIterable); + readonly attribute boolean locked; Promise cancel(optional any reason); diff --git a/test/fixtures/wpt/interfaces/url.idl b/test/fixtures/wpt/interfaces/url.idl index 360c9adcfa1104..a5e4d1eb492e82 100644 --- a/test/fixtures/wpt/interfaces/url.idl +++ b/test/fixtures/wpt/interfaces/url.idl @@ -8,6 +8,8 @@ interface URL { constructor(USVString url, optional USVString base); + static boolean canParse(USVString url, optional USVString base); + stringifier attribute USVString href; readonly attribute USVString origin; attribute USVString protocol; @@ -28,11 +30,13 @@ interface URL { interface URLSearchParams { constructor(optional (sequence> or record or USVString) init = ""); + readonly attribute unsigned long size; + undefined append(USVString name, USVString value); - undefined delete(USVString name); + undefined delete(USVString name, optional USVString value); USVString? get(USVString name); sequence getAll(USVString name); - boolean has(USVString name); + boolean has(USVString name, optional USVString value); undefined set(USVString name, USVString value); undefined sort(); diff --git a/test/fixtures/wpt/interfaces/user-timing.idl b/test/fixtures/wpt/interfaces/user-timing.idl index a0b8f94710ec33..28ee8aac2b19a6 100644 --- a/test/fixtures/wpt/interfaces/user-timing.idl +++ b/test/fixtures/wpt/interfaces/user-timing.idl @@ -22,13 +22,13 @@ partial interface Performance { undefined clearMeasures(optional DOMString measureName); }; -[Exposed=*] +[Exposed=(Window,Worker)] interface PerformanceMark : PerformanceEntry { constructor(DOMString markName, optional PerformanceMarkOptions markOptions = {}); readonly attribute any detail; }; -[Exposed=*] +[Exposed=(Window,Worker)] interface PerformanceMeasure : PerformanceEntry { readonly attribute any detail; }; diff --git a/test/fixtures/wpt/interfaces/webidl.idl b/test/fixtures/wpt/interfaces/webidl.idl index 43748c5ac4c889..4d0dfaa106275f 100644 --- a/test/fixtures/wpt/interfaces/webidl.idl +++ b/test/fixtures/wpt/interfaces/webidl.idl @@ -9,7 +9,8 @@ typedef (Int8Array or Int16Array or Int32Array or Float32Array or Float64Array or DataView) ArrayBufferView; typedef (ArrayBufferView or ArrayBuffer) BufferSource; -[Exposed=(Window,Worker), +typedef (ArrayBuffer or SharedArrayBuffer or [AllowShared] ArrayBufferView) AllowSharedBufferSource; +[Exposed=*, Serializable] interface DOMException { // but see below note about ECMAScript binding constructor(optional DOMString message = "", optional DOMString name = "Error"); @@ -46,5 +47,3 @@ interface DOMException { // but see below note about ECMAScript binding callback Function = any (any... arguments); callback VoidFunction = undefined (); - -typedef unsigned long long DOMTimeStamp; diff --git a/test/fixtures/wpt/media/foo.vtt b/test/fixtures/wpt/media/foo.vtt new file mode 100644 index 00000000000000..b533895c604ed7 --- /dev/null +++ b/test/fixtures/wpt/media/foo.vtt @@ -0,0 +1,4 @@ +WEBVTT + +00:00:00.000 --> 00:00:05.000 +Foo diff --git a/test/fixtures/wpt/media/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr.webm b/test/fixtures/wpt/media/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr.webm new file mode 100644 index 00000000000000..8b705dbc898070 Binary files /dev/null and b/test/fixtures/wpt/media/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr.webm differ diff --git a/test/fixtures/wpt/resources/declarative-shadow-dom-polyfill.js b/test/fixtures/wpt/resources/declarative-shadow-dom-polyfill.js index 8ab08b0294c297..99a3e911eb6336 100644 --- a/test/fixtures/wpt/resources/declarative-shadow-dom-polyfill.js +++ b/test/fixtures/wpt/resources/declarative-shadow-dom-polyfill.js @@ -16,7 +16,8 @@ function polyfill_declarative_shadow_dom(root) { return; root.querySelectorAll("template[shadowrootmode]").forEach(template => { const mode = template.getAttribute("shadowrootmode"); - const shadowRoot = template.parentNode.attachShadow({ mode }); + const delegatesFocus = template.hasAttribute("shadowrootdelegatesfocus"); + const shadowRoot = template.parentNode.attachShadow({ mode, delegatesFocus }); shadowRoot.appendChild(template.content); template.remove(); polyfill_declarative_shadow_dom(shadowRoot); diff --git a/test/fixtures/wpt/resources/idlharness.js b/test/fixtures/wpt/resources/idlharness.js index 46aa11e5ca123c..8f741b09b26bcb 100644 --- a/test/fixtures/wpt/resources/idlharness.js +++ b/test/fixtures/wpt/resources/idlharness.js @@ -2357,12 +2357,13 @@ IdlInterface.prototype.do_member_operation_asserts = function(memberHolderObject assert_equals(typeof memberHolderObject[member.name], "function", "property must be a function"); - const ctors = this.members.filter(function(m) { - return m.type == "operation" && m.name == member.name; + const operationOverloads = this.members.filter(function(m) { + return m.type == "operation" && m.name == member.name && + (m.special === "static") === (member.special === "static"); }); assert_equals( memberHolderObject[member.name].length, - minOverloadLength(ctors), + minOverloadLength(operationOverloads), "property has wrong .length"); assert_equals( memberHolderObject[member.name].name, diff --git a/test/fixtures/wpt/resources/testdriver.js b/test/fixtures/wpt/resources/testdriver.js index 76ae2834fdfb0a..ddf723cb3ee8a5 100644 --- a/test/fixtures/wpt/resources/testdriver.js +++ b/test/fixtures/wpt/resources/testdriver.js @@ -220,6 +220,40 @@ return cookie; }, + /** + * Get Computed Label for an element. + * + * This matches the behaviour of the + * `Get Computed Label + * `_ + * WebDriver command. + * + * @param {Element} element + * @returns {Promise} fulfilled after the computed label is returned, or + * rejected in the cases the WebDriver command errors + */ + get_computed_label: async function(element) { + let label = await window.test_driver_internal.get_computed_label(element); + return label; + }, + + /** + * Get Computed Role for an element. + * + * This matches the behaviour of the + * `Get Computed Label + * `_ + * WebDriver command. + * + * @param {Element} element + * @returns {Promise} fulfilled after the computed role is returned, or + * rejected in the cases the WebDriver command errors + */ + get_computed_role: async function(element) { + let role = await window.test_driver_internal.get_computed_role(element); + return role; + }, + /** * Send keys to an element. * @@ -228,7 +262,9 @@ * occurs. * * If ``element`` is from a different browsing context, the - * command will be run in that context. + * command will be run in that context. The test must not depend + * on the ``window.name`` property being unset on the target + * window. * * To send special keys, send the respective key's codepoint, * as defined by `WebDriver @@ -262,12 +298,6 @@ inline: "nearest"}); } - var pointerInteractablePaintTree = getPointerInteractablePaintTree(element); - if (pointerInteractablePaintTree.length === 0 || - !element.contains(pointerInteractablePaintTree[0])) { - return Promise.reject(new Error("element send_keys intercepted error")); - } - return window.test_driver_internal.send_keys(element, keys); }, @@ -300,9 +330,9 @@ * to run the call, or null for the current * browsing context. * - * @returns {Promise} fulfilled with the previous {@link - * https://www.w3.org/TR/webdriver/#dfn-windowrect-object|WindowRect} - * value, after the window is minimized. + * @returns {Promise} fulfilled with the previous `WindowRect + * `_ + * value, after the window is minimized. */ minimize_window: function(context=null) { return window.test_driver_internal.minimize_window(context); @@ -315,8 +345,8 @@ * `_ * WebDriver command * - * @param {Object} rect - A {@link - * https://www.w3.org/TR/webdriver/#dfn-windowrect-object|WindowRect} + * @param {Object} rect - A `WindowRect + * `_ * @param {WindowProxy} context - Browsing context in which * to run the call, or null for the current * browsing context. @@ -389,8 +419,9 @@ /** * Sets the state of a permission * - * This function simulates a user setting a permission into a - * particular state. + * This function causes permission requests and queries for the status + * of a certain permission type (e.g. "push", or "background-fetch") to + * always return ``state``. * * Matches the `Set Permission * `_ @@ -402,8 +433,10 @@ * * @param {PermissionDescriptor} descriptor - a `PermissionDescriptor * `_ - * dictionary. - * @param {String} state - the state of the permission + * or derived object. + * @param {PermissionState} state - a `PermissionState + * `_ + * value. * @param {WindowProxy} context - Browsing context in which * to run the call, or null for the current * browsing context. @@ -646,6 +679,296 @@ set_spc_transaction_mode: function(mode, context=null) { return window.test_driver_internal.set_spc_transaction_mode(mode, context); }, + + /** + * Cancels the Federated Credential Management dialog + * + * Matches the `Cancel dialog + * `_ + * WebDriver command. + * + * @param {WindowProxy} context - Browsing context in which + * to run the call, or null for the current + * browsing context. + * + * @returns {Promise} Fulfilled after the dialog is canceled, or rejected + * in case the WebDriver command errors + */ + cancel_fedcm_dialog: function(context=null) { + return window.test_driver_internal.cancel_fedcm_dialog(context); + }, + + /** + * Clicks a button on the Federated Credential Management dialog + * + * Matches the `Click dialog button + * `_ + * WebDriver command. + * + * @param {String} dialog_button - String enum representing the dialog button to click. + * @param {WindowProxy} context - Browsing context in which + * to run the call, or null for the current + * browsing context. + * + * @returns {Promise} Fulfilled after the button is clicked, + * or rejected in case the WebDriver command errors + */ + click_fedcm_dialog_button: function(dialog_button, context=null) { + return window.test_driver_internal.click_fedcm_dialog_button(dialog_button, context); + }, + + /** + * Selects an account from the Federated Credential Management dialog + * + * Matches the `Select account + * `_ + * WebDriver command. + * + * @param {number} account_index - Index of the account to select. + * @param {WindowProxy} context - Browsing context in which + * to run the call, or null for the current + * browsing context. + * + * @returns {Promise} Fulfilled after the account is selected, + * or rejected in case the WebDriver command errors + */ + select_fedcm_account: function(account_index, context=null) { + return window.test_driver_internal.select_fedcm_account(account_index, context); + }, + + /** + * Gets the account list from the Federated Credential Management dialog + * + * Matches the `Account list + * `_ + * WebDriver command. + * + * @param {WindowProxy} context - Browsing context in which + * to run the call, or null for the current + * browsing context. + * + * @returns {Promise} fulfilled after the account list is returned, or + * rejected in case the WebDriver command errors + */ + get_fedcm_account_list: function(context=null) { + return window.test_driver_internal.get_fedcm_account_list(context); + }, + + /** + * Gets the title of the Federated Credential Management dialog + * + * Matches the `Get title + * `_ + * WebDriver command. + * + * @param {WindowProxy} context - Browsing context in which + * to run the call, or null for the current + * browsing context. + * + * @returns {Promise} Fulfilled after the title is returned, or rejected + * in case the WebDriver command errors + */ + get_fedcm_dialog_title: function(context=null) { + return window.test_driver_internal.get_fedcm_dialog_title(context); + }, + + /** + * Gets the type of the Federated Credential Management dialog + * + * Matches the `Get dialog type + * `_ + * WebDriver command. + * + * @param {WindowProxy} context - Browsing context in which + * to run the call, or null for the current + * browsing context. + * + * @returns {Promise} Fulfilled after the dialog type is returned, or + * rejected in case the WebDriver command errors + */ + get_fedcm_dialog_type: function(context=null) { + return window.test_driver_internal.get_fedcm_dialog_type(context); + }, + + /** + * Sets whether promise rejection delay is enabled for the Federated Credential Management dialog + * + * Matches the `Set delay enabled + * `_ + * WebDriver command. + * + * @param {boolean} enabled - Whether to delay FedCM promise rejection. + * @param {WindowProxy} context - Browsing context in which + * to run the call, or null for the current + * browsing context. + * + * @returns {Promise} Fulfilled after the delay has been enabled or disabled, + * or rejected in case the WebDriver command errors + */ + set_fedcm_delay_enabled: function(enabled, context=null) { + return window.test_driver_internal.set_fedcm_delay_enabled(enabled, context); + }, + + /** + * Resets the Federated Credential Management dialog's cooldown + * + * Matches the `Reset cooldown + * `_ + * WebDriver command. + * + * @param {WindowProxy} context - Browsing context in which + * to run the call, or null for the current + * browsing context. + * + * @returns {Promise} Fulfilled after the cooldown has been reset, + * or rejected in case the WebDriver command errors + */ + reset_fedcm_cooldown: function(context=null) { + return window.test_driver_internal.reset_fedcm_cooldown(context); + }, + + /** + * Creates a virtual sensor for use with the Generic Sensors APIs. + * + * Matches the `Create Virtual Sensor + * `_ + * WebDriver command. + * + * Once created, a virtual sensor is available to all navigables under + * the same top-level traversable (i.e. all frames in the same page, + * regardless of origin). + * + * @param {String} sensor_type - A `virtual sensor type + * `_ + * such as "accelerometer". + * @param {Object} [sensor_params={}] - Optional parameters described + * in `Create Virtual Sensor + * `_. + * @param {WindowProxy} [context=null] - Browsing context in which to + * run the call, or null for the + * current browsing context. + * + * @returns {Promise} Fulfilled when virtual sensor is created. + * Rejected in case the WebDriver command errors out + * (including if a virtual sensor of the same type + * already exists). + */ + create_virtual_sensor: function(sensor_type, sensor_params={}, context=null) { + return window.test_driver_internal.create_virtual_sensor(sensor_type, sensor_params, context); + }, + + /** + * Causes a virtual sensor to report a new reading to any connected + * platform sensor. + * + * Matches the `Update Virtual Sensor Reading + * `_ + * WebDriver command. + * + * Note: The ``Promise`` it returns may fulfill before or after a + * "reading" event is fired. When using + * :js:func:`EventWatcher.wait_for`, it is necessary to take this into + * account: + * + * Note: New values may also be discarded due to the checks in `update + * latest reading + * `_. + * + * @example + * // Avoid races between EventWatcher and update_virtual_sensor(). + * // This assumes you are sure this reading will be processed (see + * // the example below otherwise). + * const reading = { x: 1, y: 2, z: 3 }; + * await Promise.all([ + * test_driver.update_virtual_sensor('gyroscope', reading), + * watcher.wait_for('reading') + * ]); + * + * @example + * // Do not wait forever if you are not sure the reading will be + * // processed. + * const readingPromise = watcher.wait_for('reading'); + * const timeoutPromise = new Promise(resolve => { + * t.step_timeout(() => resolve('TIMEOUT', 3000)) + * }); + * + * const reading = { x: 1, y: 2, z: 3 }; + * await test_driver.update_virtual_sensor('gyroscope', 'reading'); + * + * const value = + * await Promise.race([timeoutPromise, readingPromise]); + * if (value !== 'TIMEOUT') { + * // Do something. The "reading" event was fired. + * } + * + * @param {String} sensor_type - A `virtual sensor type + * `_ + * such as "accelerometer". + * @param {Object} reading - An Object describing a reading in a format + * dependent on ``sensor_type`` (e.g. ``{x: + * 1, y: 2, z: 3}`` or ``{ illuminance: 42 + * }``). + * @param {WindowProxy} [context=null] - Browsing context in which to + * run the call, or null for the + * current browsing context. + * + * @returns {Promise} Fulfilled after the reading update reaches the + * virtual sensor. Rejected in case the WebDriver + * command errors out (including if a virtual sensor + * of the given type does not exist). + */ + update_virtual_sensor: function(sensor_type, reading, context=null) { + return window.test_driver_internal.update_virtual_sensor(sensor_type, reading, context); + }, + + /** + * Triggers the removal of a virtual sensor if it exists. + * + * Matches the `Delete Virtual Sensor + * `_ + * WebDriver command. + * + * @param {String} sensor_type - A `virtual sensor type + * `_ + * such as "accelerometer". + * @param {WindowProxy} [context=null] - Browsing context in which to + * run the call, or null for the + * current browsing context. + * + * @returns {Promise} Fulfilled after the virtual sensor has been + * removed or if a sensor of the given type does not + * exist. Rejected in case the WebDriver command + * errors out. + + */ + remove_virtual_sensor: function(sensor_type, context=null) { + return window.test_driver_internal.remove_virtual_sensor(sensor_type, context); + }, + + /** + * Returns information about a virtual sensor. + * + * Matches the `Get Virtual Sensor Information + * `_ + * WebDriver command. + * + * @param {String} sensor_type - A `virtual sensor type + * `_ + * such as "accelerometer". + * @param {WindowProxy} [context=null] - Browsing context in which to + * run the call, or null for the + * current browsing context. + * + * @returns {Promise} Fulfilled with an Object with the properties + * described in `Get Virtual Sensor Information + * `_. + * Rejected in case the WebDriver command errors out + * (including if a virtual sensor of the given type + * does not exist). + */ + get_virtual_sensor_information: function(sensor_type, context=null) { + return window.test_driver_internal.get_virtual_sensor_information(sensor_type, context); + } }; window.test_driver_internal = { @@ -657,9 +980,9 @@ */ in_automation: false, - click: function(element, coords) { + async click(element, coords) { if (this.in_automation) { - return Promise.reject(new Error('Not implemented')); + throw new Error("click() is not implemented by testdriver-vendor.js"); } return new Promise(function(resolve, reject) { @@ -667,21 +990,21 @@ }); }, - delete_all_cookies: function(context=null) { - return Promise.reject(new Error("unimplemented")); + async delete_all_cookies(context=null) { + throw new Error("delete_all_cookies() is not implemented by testdriver-vendor.js"); }, - get_all_cookies: function(context=null) { - return Promise.reject(new Error("unimplemented")); + async get_all_cookies(context=null) { + throw new Error("get_all_cookies() is not implemented by testdriver-vendor.js"); }, - get_named_cookie: function(name, context=null) { - return Promise.reject(new Error("unimplemented")); + async get_named_cookie(name, context=null) { + throw new Error("get_named_cookie() is not implemented by testdriver-vendor.js"); }, - send_keys: function(element, keys) { + async send_keys(element, keys) { if (this.in_automation) { - return Promise.reject(new Error('Not implemented')); + throw new Error("send_keys() is not implemented by testdriver-vendor.js"); } return new Promise(function(resolve, reject) { @@ -711,66 +1034,112 @@ }); }, - freeze: function(context=null) { - return Promise.reject(new Error("unimplemented")); + async freeze(context=null) { + throw new Error("freeze() is not implemented by testdriver-vendor.js"); }, - minimize_window: function(context=null) { - return Promise.reject(new Error("unimplemented")); + async minimize_window(context=null) { + throw new Error("minimize_window() is not implemented by testdriver-vendor.js"); }, - set_window_rect: function(rect, context=null) { - return Promise.reject(new Error("unimplemented")); + async set_window_rect(rect, context=null) { + throw new Error("set_window_rect() is not implemented by testdriver-vendor.js"); }, - action_sequence: function(actions, context=null) { - return Promise.reject(new Error("unimplemented")); + async action_sequence(actions, context=null) { + throw new Error("action_sequence() is not implemented by testdriver-vendor.js"); }, - generate_test_report: function(message, context=null) { - return Promise.reject(new Error("unimplemented")); + async generate_test_report(message, context=null) { + throw new Error("generate_test_report() is not implemented by testdriver-vendor.js"); }, + async set_permission(permission_params, context=null) { + throw new Error("set_permission() is not implemented by testdriver-vendor.js"); + }, - set_permission: function(permission_params, context=null) { - return Promise.reject(new Error("unimplemented")); + async add_virtual_authenticator(config, context=null) { + throw new Error("add_virtual_authenticator() is not implemented by testdriver-vendor.js"); }, - add_virtual_authenticator: function(config, context=null) { - return Promise.reject(new Error("unimplemented")); + async remove_virtual_authenticator(authenticator_id, context=null) { + throw new Error("remove_virtual_authenticator() is not implemented by testdriver-vendor.js"); }, - remove_virtual_authenticator: function(authenticator_id, context=null) { - return Promise.reject(new Error("unimplemented")); + async add_credential(authenticator_id, credential, context=null) { + throw new Error("add_credential() is not implemented by testdriver-vendor.js"); }, - add_credential: function(authenticator_id, credential, context=null) { - return Promise.reject(new Error("unimplemented")); + async get_credentials(authenticator_id, context=null) { + throw new Error("get_credentials() is not implemented by testdriver-vendor.js"); }, - get_credentials: function(authenticator_id, context=null) { - return Promise.reject(new Error("unimplemented")); + async remove_credential(authenticator_id, credential_id, context=null) { + throw new Error("remove_credential() is not implemented by testdriver-vendor.js"); }, - remove_credential: function(authenticator_id, credential_id, context=null) { - return Promise.reject(new Error("unimplemented")); + async remove_all_credentials(authenticator_id, context=null) { + throw new Error("remove_all_credentials() is not implemented by testdriver-vendor.js"); }, - remove_all_credentials: function(authenticator_id, context=null) { - return Promise.reject(new Error("unimplemented")); + async set_user_verified(authenticator_id, uv, context=null) { + throw new Error("set_user_verified() is not implemented by testdriver-vendor.js"); }, - set_user_verified: function(authenticator_id, uv, context=null) { - return Promise.reject(new Error("unimplemented")); + async set_storage_access(origin, embedding_origin, blocked, context=null) { + throw new Error("set_storage_access() is not implemented by testdriver-vendor.js"); }, - set_storage_access: function(origin, embedding_origin, blocked, context=null) { - return Promise.reject(new Error("unimplemented")); + async set_spc_transaction_mode(mode, context=null) { + throw new Error("set_spc_transaction_mode() is not implemented by testdriver-vendor.js"); }, - set_spc_transaction_mode: function(mode, context=null) { - return Promise.reject(new Error("unimplemented")); + async cancel_fedcm_dialog(context=null) { + throw new Error("cancel_fedcm_dialog() is not implemented by testdriver-vendor.js"); + }, + + async click_fedcm_dialog_button(dialog_button, context=null) { + throw new Error("click_fedcm_dialog_button() is not implemented by testdriver-vendor.js"); + }, + + async select_fedcm_account(account_index, context=null) { + throw new Error("select_fedcm_account() is not implemented by testdriver-vendor.js"); + }, + + async get_fedcm_account_list(context=null) { + throw new Error("get_fedcm_account_list() is not implemented by testdriver-vendor.js"); + }, + + async get_fedcm_dialog_title(context=null) { + throw new Error("get_fedcm_dialog_title() is not implemented by testdriver-vendor.js"); + }, + + async get_fedcm_dialog_type(context=null) { + throw new Error("get_fedcm_dialog_type() is not implemented by testdriver-vendor.js"); }, + async set_fedcm_delay_enabled(enabled, context=null) { + throw new Error("set_fedcm_delay_enabled() is not implemented by testdriver-vendor.js"); + }, + + async reset_fedcm_cooldown(context=null) { + throw new Error("reset_fedcm_cooldown() is not implemented by testdriver-vendor.js"); + }, + + async create_virtual_sensor(sensor_type, sensor_params, context=null) { + throw new Error("create_virtual_sensor() is not implemented by testdriver-vendor.js"); + }, + + async update_virtual_sensor(sensor_type, reading, context=null) { + throw new Error("update_virtual_sensor() is not implemented by testdriver-vendor.js"); + }, + + async remove_virtual_sensor(sensor_type, context=null) { + throw new Error("remove_virtual_sensor() is not implemented by testdriver-vendor.js"); + }, + + async get_virtual_sensor_information(sensor_type, context=null) { + throw new Error("get_virtual_sensor_information() is not implemented by testdriver-vendor.js"); + } }; })(); diff --git a/test/fixtures/wpt/resources/testharness.js b/test/fixtures/wpt/resources/testharness.js index 112790bb1eeb87..497ae23f0e83ee 100644 --- a/test/fixtures/wpt/resources/testharness.js +++ b/test/fixtures/wpt/resources/testharness.js @@ -1426,12 +1426,16 @@ function assert_wrapper(...args) { let status = Test.statuses.TIMEOUT; let stack = null; + let new_assert_index = null; try { if (settings.debug) { console.debug("ASSERT", name, tests.current_test && tests.current_test.name, args); } if (tests.output) { tests.set_assert(name, args); + // Remember the newly pushed assert's index, because `apply` + // below might push new asserts. + new_assert_index = tests.asserts_run.length - 1; } const rv = f.apply(undefined, args); status = Test.statuses.PASS; @@ -1445,7 +1449,7 @@ stack = get_stack(); } if (tests.output) { - tests.set_assert_status(status, stack); + tests.set_assert_status(new_assert_index, status, stack); } } } @@ -1493,7 +1497,7 @@ /** * Assert that ``actual`` is the same value as ``expected``. * - * For objects this compares by cobject identity; for primitives + * For objects this compares by object identity; for primitives * this distinguishes between 0 and -0, and has correct handling * of NaN. * @@ -2725,8 +2729,9 @@ * speed when the condition is quickly met. * * @param {Function} cond A function taking no arguments and - * returning a boolean. The callback is called - * when this function returns true. + * returning a boolean or a Promise. The callback is + * called when this function returns true, or the + * returned Promise is resolved with true. * @param {Function} func A function taking no arguments to call once * the condition is met. * @param {string} [description] Error message to add to assert in case of @@ -2742,11 +2747,11 @@ var remaining = Math.ceil(timeout_full / interval); var test_this = this; - var wait_for_inner = test_this.step_func(() => { - if (cond()) { + const step = test_this.step_func((result) => { + if (result) { func(); } else { - if(remaining === 0) { + if (remaining === 0) { assert(false, "step_wait_func", description, "Timed out waiting on condition"); } @@ -2755,6 +2760,12 @@ } }); + var wait_for_inner = test_this.step_func(() => { + Promise.resolve(cond()).then( + step, + test_this.unreached_func("step_wait_func")); + }); + wait_for_inner(); }; @@ -2780,8 +2791,9 @@ * }, "Navigating a popup to about:blank"); * * @param {Function} cond A function taking no arguments and - * returning a boolean. The callback is called - * when this function returns true. + * returning a boolean or a Promise. The callback is + * called when this function returns true, or the + * returned Promise is resolved with true. * @param {Function} func A function taking no arguments to call once * the condition is met. * @param {string} [description] Error message to add to assert in case of @@ -2817,7 +2829,7 @@ * }, ""); * * @param {Function} cond A function taking no arguments and - * returning a boolean. + * returning a boolean or a Promise. * @param {string} [description] Error message to add to assert in case of * failure. * @param {number} timeout Timeout in ms. This is multiplied by the global @@ -3673,8 +3685,8 @@ this.asserts_run.push(new AssertRecord(this.current_test, assert_name, args)) } - Tests.prototype.set_assert_status = function(status, stack) { - let assert_record = this.asserts_run[this.asserts_run.length - 1]; + Tests.prototype.set_assert_status = function(index, status, stack) { + let assert_record = this.asserts_run[index]; assert_record.status = status; assert_record.stack = stack; } diff --git a/test/fixtures/wpt/streams/piping/abort.any.js b/test/fixtures/wpt/streams/piping/abort.any.js index 503de9dcaf0893..c9929df91cf688 100644 --- a/test/fixtures/wpt/streams/piping/abort.any.js +++ b/test/fixtures/wpt/streams/piping/abort.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/recording-streams.js // META: script=../resources/test-utils.js 'use strict'; diff --git a/test/fixtures/wpt/streams/piping/close-propagation-backward.any.js b/test/fixtures/wpt/streams/piping/close-propagation-backward.any.js index 5ea47ab85c0c1f..25bd475ed13e77 100644 --- a/test/fixtures/wpt/streams/piping/close-propagation-backward.any.js +++ b/test/fixtures/wpt/streams/piping/close-propagation-backward.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/recording-streams.js 'use strict'; diff --git a/test/fixtures/wpt/streams/piping/close-propagation-forward.any.js b/test/fixtures/wpt/streams/piping/close-propagation-forward.any.js index 71b6e262840090..0ec94f80abf04b 100644 --- a/test/fixtures/wpt/streams/piping/close-propagation-forward.any.js +++ b/test/fixtures/wpt/streams/piping/close-propagation-forward.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js // META: script=../resources/recording-streams.js 'use strict'; diff --git a/test/fixtures/wpt/streams/piping/crashtests/cross-piping.html b/test/fixtures/wpt/streams/piping/crashtests/cross-piping.html new file mode 100644 index 00000000000000..712d5ecebef8ff --- /dev/null +++ b/test/fixtures/wpt/streams/piping/crashtests/cross-piping.html @@ -0,0 +1,12 @@ + + diff --git a/test/fixtures/wpt/streams/piping/error-propagation-backward.any.js b/test/fixtures/wpt/streams/piping/error-propagation-backward.any.js index ec74592f86effe..f786469d6c1d40 100644 --- a/test/fixtures/wpt/streams/piping/error-propagation-backward.any.js +++ b/test/fixtures/wpt/streams/piping/error-propagation-backward.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js // META: script=../resources/recording-streams.js 'use strict'; diff --git a/test/fixtures/wpt/streams/piping/error-propagation-forward.any.js b/test/fixtures/wpt/streams/piping/error-propagation-forward.any.js index 482da2f8a88e18..e9260f9ea22c41 100644 --- a/test/fixtures/wpt/streams/piping/error-propagation-forward.any.js +++ b/test/fixtures/wpt/streams/piping/error-propagation-forward.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js // META: script=../resources/recording-streams.js 'use strict'; diff --git a/test/fixtures/wpt/streams/piping/flow-control.any.js b/test/fixtures/wpt/streams/piping/flow-control.any.js index 09c4420f872adc..e2318da375ab90 100644 --- a/test/fixtures/wpt/streams/piping/flow-control.any.js +++ b/test/fixtures/wpt/streams/piping/flow-control.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js // META: script=../resources/rs-utils.js // META: script=../resources/recording-streams.js diff --git a/test/fixtures/wpt/streams/piping/general-addition.any.js b/test/fixtures/wpt/streams/piping/general-addition.any.js index 2562b7064338ee..cf4aa9bea6a1a4 100644 --- a/test/fixtures/wpt/streams/piping/general-addition.any.js +++ b/test/fixtures/wpt/streams/piping/general-addition.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; promise_test(async t => { diff --git a/test/fixtures/wpt/streams/piping/general.any.js b/test/fixtures/wpt/streams/piping/general.any.js index bec3480f653944..09e01536325cca 100644 --- a/test/fixtures/wpt/streams/piping/general.any.js +++ b/test/fixtures/wpt/streams/piping/general.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js // META: script=../resources/recording-streams.js 'use strict'; diff --git a/test/fixtures/wpt/streams/piping/multiple-propagation.any.js b/test/fixtures/wpt/streams/piping/multiple-propagation.any.js index a78652fc06795e..9be828a23269a5 100644 --- a/test/fixtures/wpt/streams/piping/multiple-propagation.any.js +++ b/test/fixtures/wpt/streams/piping/multiple-propagation.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js // META: script=../resources/recording-streams.js 'use strict'; diff --git a/test/fixtures/wpt/streams/piping/pipe-through.any.js b/test/fixtures/wpt/streams/piping/pipe-through.any.js index 26b1cd26a3c82f..339cee19993346 100644 --- a/test/fixtures/wpt/streams/piping/pipe-through.any.js +++ b/test/fixtures/wpt/streams/piping/pipe-through.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/rs-utils.js // META: script=../resources/test-utils.js // META: script=../resources/recording-streams.js diff --git a/test/fixtures/wpt/streams/piping/then-interception.any.js b/test/fixtures/wpt/streams/piping/then-interception.any.js index 543f916d940d9a..fc48c368311478 100644 --- a/test/fixtures/wpt/streams/piping/then-interception.any.js +++ b/test/fixtures/wpt/streams/piping/then-interception.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js // META: script=../resources/recording-streams.js 'use strict'; diff --git a/test/fixtures/wpt/streams/piping/throwing-options.any.js b/test/fixtures/wpt/streams/piping/throwing-options.any.js index b9f906778f632b..186f8ded1968a4 100644 --- a/test/fixtures/wpt/streams/piping/throwing-options.any.js +++ b/test/fixtures/wpt/streams/piping/throwing-options.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; class ThrowingOptions { diff --git a/test/fixtures/wpt/streams/piping/transform-streams.any.js b/test/fixtures/wpt/streams/piping/transform-streams.any.js index caae9fbad8848a..e079bb637cad0d 100644 --- a/test/fixtures/wpt/streams/piping/transform-streams.any.js +++ b/test/fixtures/wpt/streams/piping/transform-streams.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; promise_test(() => { diff --git a/test/fixtures/wpt/streams/queuing-strategies.any.js b/test/fixtures/wpt/streams/queuing-strategies.any.js index fa959ebba28338..9efc4570cf2ee2 100644 --- a/test/fixtures/wpt/streams/queuing-strategies.any.js +++ b/test/fixtures/wpt/streams/queuing-strategies.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; const highWaterMarkConversions = new Map([ diff --git a/test/fixtures/wpt/streams/readable-byte-streams/bad-buffers-and-views.any.js b/test/fixtures/wpt/streams/readable-byte-streams/bad-buffers-and-views.any.js index 3322116b191840..afcc61e6800a28 100644 --- a/test/fixtures/wpt/streams/readable-byte-streams/bad-buffers-and-views.any.js +++ b/test/fixtures/wpt/streams/readable-byte-streams/bad-buffers-and-views.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; promise_test(() => { diff --git a/test/fixtures/wpt/streams/readable-byte-streams/construct-byob-request.any.js b/test/fixtures/wpt/streams/readable-byte-streams/construct-byob-request.any.js index 8d460a1c81b7bd..a26f949ee29d94 100644 --- a/test/fixtures/wpt/streams/readable-byte-streams/construct-byob-request.any.js +++ b/test/fixtures/wpt/streams/readable-byte-streams/construct-byob-request.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/rs-utils.js 'use strict'; diff --git a/test/fixtures/wpt/streams/readable-byte-streams/enqueue-with-detached-buffer.any.js b/test/fixtures/wpt/streams/readable-byte-streams/enqueue-with-detached-buffer.any.js index d2b37f00a9d697..92bd0a26a0ec05 100644 --- a/test/fixtures/wpt/streams/readable-byte-streams/enqueue-with-detached-buffer.any.js +++ b/test/fixtures/wpt/streams/readable-byte-streams/enqueue-with-detached-buffer.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm promise_test(async t => { const error = new Error('cannot proceed'); diff --git a/test/fixtures/wpt/streams/readable-byte-streams/general.any.js b/test/fixtures/wpt/streams/readable-byte-streams/general.any.js index dd4fdc855786f2..cdce2244c3c84b 100644 --- a/test/fixtures/wpt/streams/readable-byte-streams/general.any.js +++ b/test/fixtures/wpt/streams/readable-byte-streams/general.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/rs-utils.js // META: script=../resources/test-utils.js 'use strict'; diff --git a/test/fixtures/wpt/streams/readable-byte-streams/non-transferable-buffers.any.js b/test/fixtures/wpt/streams/readable-byte-streams/non-transferable-buffers.any.js index e8ea3c4f966763..47d7b2e653e5ec 100644 --- a/test/fixtures/wpt/streams/readable-byte-streams/non-transferable-buffers.any.js +++ b/test/fixtures/wpt/streams/readable-byte-streams/non-transferable-buffers.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; promise_test(async t => { diff --git a/test/fixtures/wpt/streams/readable-byte-streams/respond-after-enqueue.any.js b/test/fixtures/wpt/streams/readable-byte-streams/respond-after-enqueue.any.js index b93cec97391e13..e51efa061a6511 100644 --- a/test/fixtures/wpt/streams/readable-byte-streams/respond-after-enqueue.any.js +++ b/test/fixtures/wpt/streams/readable-byte-streams/respond-after-enqueue.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; diff --git a/test/fixtures/wpt/streams/readable-byte-streams/tee.any.js b/test/fixtures/wpt/streams/readable-byte-streams/tee.any.js index 85844669cd9088..7dd5ba3f3fb013 100644 --- a/test/fixtures/wpt/streams/readable-byte-streams/tee.any.js +++ b/test/fixtures/wpt/streams/readable-byte-streams/tee.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/rs-utils.js // META: script=../resources/test-utils.js // META: script=../resources/recording-streams.js diff --git a/test/fixtures/wpt/streams/readable-streams/async-iterator.any.js b/test/fixtures/wpt/streams/readable-streams/async-iterator.any.js index 3ccaca17bc1ac7..4b674bea8430f3 100644 --- a/test/fixtures/wpt/streams/readable-streams/async-iterator.any.js +++ b/test/fixtures/wpt/streams/readable-streams/async-iterator.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/rs-utils.js // META: script=../resources/test-utils.js // META: script=../resources/recording-streams.js diff --git a/test/fixtures/wpt/streams/readable-streams/bad-strategies.any.js b/test/fixtures/wpt/streams/readable-streams/bad-strategies.any.js index 521fbffe3ab479..49fa4bdbece5b5 100644 --- a/test/fixtures/wpt/streams/readable-streams/bad-strategies.any.js +++ b/test/fixtures/wpt/streams/readable-streams/bad-strategies.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; test(() => { @@ -149,7 +149,9 @@ promise_test(() => { } ); - promises.push(rs.getReader().closed.catch(e => { + promises.push(rs.getReader().closed.then(() => { + assert_unreached('closed didn\'t throw'); + }, e => { assert_equals(e, theError, 'closed should reject with the error for ' + size); })); } @@ -157,3 +159,40 @@ promise_test(() => { return Promise.all(promises); }, 'Readable stream: invalid strategy.size return value'); + +promise_test(() => { + + const promises = []; + for (const size of [NaN, -Infinity, Infinity, -1]) { + let theError; + const rs = new ReadableStream( + { + pull(c) { + try { + c.enqueue('hi'); + assert_unreached('enqueue didn\'t throw'); + } catch (error) { + assert_equals(error.name, 'RangeError', 'enqueue should throw a RangeError for ' + size); + theError = error; + } + } + }, + { + size() { + return size; + }, + highWaterMark: 5 + } + ); + + promises.push(rs.getReader().closed.then(() => { + assert_unreached('closed didn\'t throw'); + }, e => { + assert_equals(e, theError, 'closed should reject with the error for ' + size); + })); + } + + return Promise.all(promises); + +}, 'Readable stream: invalid strategy.size return value when pulling'); + diff --git a/test/fixtures/wpt/streams/readable-streams/bad-underlying-sources.any.js b/test/fixtures/wpt/streams/readable-streams/bad-underlying-sources.any.js index e9cf4c924930b2..3d77b923d178a0 100644 --- a/test/fixtures/wpt/streams/readable-streams/bad-underlying-sources.any.js +++ b/test/fixtures/wpt/streams/readable-streams/bad-underlying-sources.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; diff --git a/test/fixtures/wpt/streams/readable-streams/cancel.any.js b/test/fixtures/wpt/streams/readable-streams/cancel.any.js index 800bd994417241..9915c1fb6330c1 100644 --- a/test/fixtures/wpt/streams/readable-streams/cancel.any.js +++ b/test/fixtures/wpt/streams/readable-streams/cancel.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js // META: script=../resources/rs-utils.js 'use strict'; diff --git a/test/fixtures/wpt/streams/readable-streams/constructor.any.js b/test/fixtures/wpt/streams/readable-streams/constructor.any.js index 608dc48cfa39d7..0b995f0cb16bde 100644 --- a/test/fixtures/wpt/streams/readable-streams/constructor.any.js +++ b/test/fixtures/wpt/streams/readable-streams/constructor.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; const error1 = new Error('error1'); diff --git a/test/fixtures/wpt/streams/readable-streams/count-queuing-strategy-integration.any.js b/test/fixtures/wpt/streams/readable-streams/count-queuing-strategy-integration.any.js index 02ac5bae5c2f8a..a8c1b91d0068e3 100644 --- a/test/fixtures/wpt/streams/readable-streams/count-queuing-strategy-integration.any.js +++ b/test/fixtures/wpt/streams/readable-streams/count-queuing-strategy-integration.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; test(() => { diff --git a/test/fixtures/wpt/streams/readable-streams/default-reader.any.js b/test/fixtures/wpt/streams/readable-streams/default-reader.any.js index 59d7ab2f74db63..f92862719e47c1 100644 --- a/test/fixtures/wpt/streams/readable-streams/default-reader.any.js +++ b/test/fixtures/wpt/streams/readable-streams/default-reader.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/rs-utils.js 'use strict'; diff --git a/test/fixtures/wpt/streams/readable-streams/floating-point-total-queue-size.any.js b/test/fixtures/wpt/streams/readable-streams/floating-point-total-queue-size.any.js index 50cca3d951a942..8b88c21d7f0b53 100644 --- a/test/fixtures/wpt/streams/readable-streams/floating-point-total-queue-size.any.js +++ b/test/fixtures/wpt/streams/readable-streams/floating-point-total-queue-size.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; // Due to the limitations of floating-point precision, the calculation of desiredSize sometimes gives different answers diff --git a/test/fixtures/wpt/streams/readable-streams/from.any.js b/test/fixtures/wpt/streams/readable-streams/from.any.js index 04a03545ad5fe3..58ad4d4add127d 100644 --- a/test/fixtures/wpt/streams/readable-streams/from.any.js +++ b/test/fixtures/wpt/streams/readable-streams/from.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker,jsshell +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js 'use strict'; diff --git a/test/fixtures/wpt/streams/readable-streams/garbage-collection.any.js b/test/fixtures/wpt/streams/readable-streams/garbage-collection.any.js index e578176777adaf..13bd1fb3437877 100644 --- a/test/fixtures/wpt/streams/readable-streams/garbage-collection.any.js +++ b/test/fixtures/wpt/streams/readable-streams/garbage-collection.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js // META: script=/common/gc.js 'use strict'; diff --git a/test/fixtures/wpt/streams/readable-streams/general.any.js b/test/fixtures/wpt/streams/readable-streams/general.any.js index 2a32b27943c82f..eee3f62215eeb0 100644 --- a/test/fixtures/wpt/streams/readable-streams/general.any.js +++ b/test/fixtures/wpt/streams/readable-streams/general.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js // META: script=../resources/rs-utils.js 'use strict'; diff --git a/test/fixtures/wpt/streams/readable-streams/owning-type-message-port.any.js b/test/fixtures/wpt/streams/readable-streams/owning-type-message-port.any.js index e9961ce042256a..282c1f411485c0 100644 --- a/test/fixtures/wpt/streams/readable-streams/owning-type-message-port.any.js +++ b/test/fixtures/wpt/streams/readable-streams/owning-type-message-port.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js // META: script=../resources/rs-utils.js 'use strict'; diff --git a/test/fixtures/wpt/streams/readable-streams/owning-type-video-frame.any.js b/test/fixtures/wpt/streams/readable-streams/owning-type-video-frame.any.js index ec01fda0b3c737..b652f9c5fcb4b6 100644 --- a/test/fixtures/wpt/streams/readable-streams/owning-type-video-frame.any.js +++ b/test/fixtures/wpt/streams/readable-streams/owning-type-video-frame.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js // META: script=../resources/rs-utils.js 'use strict'; diff --git a/test/fixtures/wpt/streams/readable-streams/owning-type.any.js b/test/fixtures/wpt/streams/readable-streams/owning-type.any.js index 27a3dda894e4d6..34c2a55d5134a2 100644 --- a/test/fixtures/wpt/streams/readable-streams/owning-type.any.js +++ b/test/fixtures/wpt/streams/readable-streams/owning-type.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js // META: script=../resources/rs-utils.js 'use strict'; diff --git a/test/fixtures/wpt/streams/readable-streams/patched-global.any.js b/test/fixtures/wpt/streams/readable-streams/patched-global.any.js index a64a054a97f1f5..c208824c864469 100644 --- a/test/fixtures/wpt/streams/readable-streams/patched-global.any.js +++ b/test/fixtures/wpt/streams/readable-streams/patched-global.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; // Tests which patch the global environment are kept separate to avoid diff --git a/test/fixtures/wpt/streams/readable-streams/reentrant-strategies.any.js b/test/fixtures/wpt/streams/readable-streams/reentrant-strategies.any.js index b4988bc2433fd5..8ae7b98e8d5eef 100644 --- a/test/fixtures/wpt/streams/readable-streams/reentrant-strategies.any.js +++ b/test/fixtures/wpt/streams/readable-streams/reentrant-strategies.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/recording-streams.js // META: script=../resources/rs-utils.js // META: script=../resources/test-utils.js diff --git a/test/fixtures/wpt/streams/readable-streams/tee.any.js b/test/fixtures/wpt/streams/readable-streams/tee.any.js index 00397932f4b6e3..c2c2e482307211 100644 --- a/test/fixtures/wpt/streams/readable-streams/tee.any.js +++ b/test/fixtures/wpt/streams/readable-streams/tee.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/rs-utils.js // META: script=../resources/test-utils.js // META: script=../resources/recording-streams.js diff --git a/test/fixtures/wpt/streams/readable-streams/templated.any.js b/test/fixtures/wpt/streams/readable-streams/templated.any.js index ecae3f4d8b129f..dc75b805a10d63 100644 --- a/test/fixtures/wpt/streams/readable-streams/templated.any.js +++ b/test/fixtures/wpt/streams/readable-streams/templated.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js // META: script=../resources/rs-test-templates.js 'use strict'; diff --git a/test/fixtures/wpt/streams/transferable/transform-stream-members.any.js b/test/fixtures/wpt/streams/transferable/transform-stream-members.any.js index fca060b0c05fa3..05914e12ccbe57 100644 --- a/test/fixtures/wpt/streams/transferable/transform-stream-members.any.js +++ b/test/fixtures/wpt/streams/transferable/transform-stream-members.any.js @@ -1,3 +1,5 @@ +// META: global=window,dedicatedworker,shadowrealm + const combinations = [ (t => [t, t.readable])(new TransformStream()), (t => [t.readable, t])(new TransformStream()), diff --git a/test/fixtures/wpt/streams/transform-streams/backpressure.any.js b/test/fixtures/wpt/streams/transform-streams/backpressure.any.js index 6befba41b79542..47a21fb7e71fed 100644 --- a/test/fixtures/wpt/streams/transform-streams/backpressure.any.js +++ b/test/fixtures/wpt/streams/transform-streams/backpressure.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/recording-streams.js // META: script=../resources/test-utils.js 'use strict'; diff --git a/test/fixtures/wpt/streams/transform-streams/cancel.any.js b/test/fixtures/wpt/streams/transform-streams/cancel.any.js new file mode 100644 index 00000000000000..5c7fc4eae5d55b --- /dev/null +++ b/test/fixtures/wpt/streams/transform-streams/cancel.any.js @@ -0,0 +1,115 @@ +// META: global=window,worker,shadowrealm +// META: script=../resources/test-utils.js +'use strict'; + +const thrownError = new Error('bad things are happening!'); +thrownError.name = 'error1'; + +const originalReason = new Error('original reason'); +originalReason.name = 'error2'; + +promise_test(async t => { + let cancelled = undefined; + const ts = new TransformStream({ + cancel(reason) { + cancelled = reason; + } + }); + const res = await ts.readable.cancel(thrownError); + assert_equals(res, undefined, 'readable.cancel() should return undefined'); + assert_equals(cancelled, thrownError, 'transformer.cancel() should be called with the passed reason'); +}, 'cancelling the readable side should call transformer.cancel()'); + +promise_test(async t => { + const ts = new TransformStream({ + cancel(reason) { + assert_equals(reason, originalReason, 'transformer.cancel() should be called with the passed reason'); + throw thrownError; + } + }); + const writer = ts.writable.getWriter(); + const cancelPromise = ts.readable.cancel(originalReason); + await promise_rejects_exactly(t, thrownError, cancelPromise, 'readable.cancel() should reject with thrownError'); + await promise_rejects_exactly(t, thrownError, writer.closed, 'writer.closed should reject with thrownError'); +}, 'cancelling the readable side should reject if transformer.cancel() throws'); + +promise_test(async t => { + let aborted = undefined; + const ts = new TransformStream({ + cancel(reason) { + aborted = reason; + }, + flush: t.unreached_func('flush should not be called') + }); + const res = await ts.writable.abort(thrownError); + assert_equals(res, undefined, 'writable.abort() should return undefined'); + assert_equals(aborted, thrownError, 'transformer.abort() should be called with the passed reason'); +}, 'aborting the writable side should call transformer.abort()'); + +promise_test(async t => { + const ts = new TransformStream({ + cancel(reason) { + assert_equals(reason, originalReason, 'transformer.cancel() should be called with the passed reason'); + throw thrownError; + }, + flush: t.unreached_func('flush should not be called') + }); + const reader = ts.readable.getReader(); + const abortPromise = ts.writable.abort(originalReason); + await promise_rejects_exactly(t, thrownError, abortPromise, 'writable.abort() should reject with thrownError'); + await promise_rejects_exactly(t, thrownError, reader.closed, 'reader.closed should reject with thrownError'); +}, 'aborting the writable side should reject if transformer.cancel() throws'); + +promise_test(async t => { + const ts = new TransformStream({ + async cancel(reason) { + assert_equals(reason, originalReason, 'transformer.cancel() should be called with the passed reason'); + throw thrownError; + }, + flush: t.unreached_func('flush should not be called') + }); + const cancelPromise = ts.readable.cancel(originalReason); + const closePromise = ts.writable.close(); + await Promise.all([ + promise_rejects_exactly(t, thrownError, cancelPromise, 'cancelPromise should reject with thrownError'), + promise_rejects_exactly(t, thrownError, closePromise, 'closePromise should reject with thrownError'), + ]); +}, 'closing the writable side should reject if a parallel transformer.cancel() throws'); + +promise_test(async t => { + let controller; + const ts = new TransformStream({ + start(c) { + controller = c; + }, + async cancel(reason) { + assert_equals(reason, originalReason, 'transformer.cancel() should be called with the passed reason'); + controller.error(thrownError); + }, + flush: t.unreached_func('flush should not be called') + }); + const cancelPromise = ts.readable.cancel(originalReason); + const closePromise = ts.writable.close(); + await Promise.all([ + promise_rejects_exactly(t, thrownError, cancelPromise, 'cancelPromise should reject with thrownError'), + promise_rejects_exactly(t, thrownError, closePromise, 'closePromise should reject with thrownError'), + ]); +}, 'readable.cancel() and a parallel writable.close() should reject if a transformer.cancel() calls controller.error()'); + +promise_test(async t => { + let controller; + const ts = new TransformStream({ + start(c) { + controller = c; + }, + async cancel(reason) { + assert_equals(reason, originalReason, 'transformer.cancel() should be called with the passed reason'); + controller.error(thrownError); + }, + flush: t.unreached_func('flush should not be called') + }); + const cancelPromise = ts.writable.abort(originalReason); + await promise_rejects_exactly(t, thrownError, cancelPromise, 'cancelPromise should reject with thrownError'); + const closePromise = ts.readable.cancel(1); + await promise_rejects_exactly(t, thrownError, closePromise, 'closePromise should reject with thrownError'); +}, 'writable.abort() and readable.cancel() should reject if a transformer.cancel() calls controller.error()'); diff --git a/test/fixtures/wpt/streams/transform-streams/errors.any.js b/test/fixtures/wpt/streams/transform-streams/errors.any.js index 0cca4c75479d6d..bea060b6590818 100644 --- a/test/fixtures/wpt/streams/transform-streams/errors.any.js +++ b/test/fixtures/wpt/streams/transform-streams/errors.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js 'use strict'; @@ -9,7 +9,8 @@ promise_test(t => { const ts = new TransformStream({ transform() { throw thrownError; - } + }, + cancel: t.unreached_func('cancel should not be called') }); const reader = ts.readable.getReader(); @@ -34,7 +35,8 @@ promise_test(t => { }, flush() { throw thrownError; - } + }, + cancel: t.unreached_func('cancel should not be called') }); const reader = ts.readable.getReader(); @@ -54,13 +56,14 @@ promise_test(t => { ]); }, 'TransformStream errors thrown in flush put the writable and readable in an errored state'); -test(() => { +test(t => { new TransformStream({ start(c) { c.enqueue('a'); c.error(new Error('generic error')); assert_throws_js(TypeError, () => c.enqueue('b'), 'enqueue() should throw'); - } + }, + cancel: t.unreached_func('cancel should not be called') }); }, 'errored TransformStream should not enqueue new chunks'); @@ -72,7 +75,8 @@ promise_test(t => { }); }, transform: t.unreached_func('transform should not be called'), - flush: t.unreached_func('flush should not be called') + flush: t.unreached_func('flush should not be called'), + cancel: t.unreached_func('cancel should not be called') }); const writer = ts.writable.getWriter(); @@ -96,7 +100,8 @@ promise_test(t => { }); }, transform: t.unreached_func('transform should never be called if start() fails'), - flush: t.unreached_func('flush should never be called if start() fails') + flush: t.unreached_func('flush should never be called if start() fails'), + cancel: t.unreached_func('cancel should never be called if start() fails') }); const writer = ts.writable.getWriter(); @@ -202,9 +207,10 @@ promise_test(t => { return Promise.all([ abortPromise, cancelPromise, - promise_rejects_exactly(t, thrownError, writer.closed, 'writer.closed should reject with thrownError')]); -}, 'abort should set the close reason for the writable when it happens before cancel during start, but cancel should ' + - 'still succeed'); + promise_rejects_exactly(t, thrownError, writer.closed, 'writer.closed should reject'), + ]); +}, 'abort should set the close reason for the writable when it happens before cancel during start, and cancel should ' + + 'reject'); promise_test(t => { let resolveTransform; @@ -251,13 +257,26 @@ promise_test(t => { controller = c; } }); - const cancelPromise = ts.readable.cancel(thrownError); - controller.error(ignoredError); + const cancelPromise = ts.readable.cancel(ignoredError); + controller.error(thrownError); return Promise.all([ cancelPromise, promise_rejects_exactly(t, thrownError, ts.writable.getWriter().closed, 'closed should reject with thrownError') ]); -}, 'controller.error() should do nothing after readable.cancel()'); +}, 'controller.error() should close writable immediately after readable.cancel()'); + +promise_test(t => { + let controller; + const ts = new TransformStream({ + start(c) { + controller = c; + } + }); + return ts.readable.cancel(thrownError).then(() => { + controller.error(ignoredError); + return promise_rejects_exactly(t, thrownError, ts.writable.getWriter().closed, 'closed should reject with thrownError'); + }); +}, 'controller.error() should do nothing after readable.cancel() resolves'); promise_test(t => { let controller; diff --git a/test/fixtures/wpt/streams/transform-streams/flush.any.js b/test/fixtures/wpt/streams/transform-streams/flush.any.js index 9287f6f5eb78eb..c95d8ae1186518 100644 --- a/test/fixtures/wpt/streams/transform-streams/flush.any.js +++ b/test/fixtures/wpt/streams/transform-streams/flush.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js 'use strict'; @@ -129,3 +129,18 @@ promise_test(t => { }); return promise_rejects_exactly(t, error1, ts.writable.getWriter().close(), 'close() should reject'); }, 'error() during flush should cause writer.close() to reject'); + +promise_test(async t => { + let flushed = false; + const ts = new TransformStream({ + flush() { + flushed = true; + }, + cancel: t.unreached_func('cancel should not be called') + }); + const closePromise = ts.writable.close(); + await delay(0); + const cancelPromise = ts.readable.cancel(error1); + await Promise.all([closePromise, cancelPromise]); + assert_equals(flushed, true, 'transformer.flush() should be called'); +}, 'closing the writable side should call transformer.flush() and a parallel readable.cancel() should not reject'); diff --git a/test/fixtures/wpt/streams/transform-streams/general.any.js b/test/fixtures/wpt/streams/transform-streams/general.any.js index c95691f7bf49df..a40ef30843ec4d 100644 --- a/test/fixtures/wpt/streams/transform-streams/general.any.js +++ b/test/fixtures/wpt/streams/transform-streams/general.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js // META: script=../resources/rs-utils.js 'use strict'; @@ -388,9 +388,24 @@ promise_test(t => { controller.terminate(); return Promise.all([ cancelPromise, - promise_rejects_exactly(t, cancelReason, ts.writable.getWriter().closed, 'closed should reject with cancelReason') + promise_rejects_js(t, TypeError, ts.writable.getWriter().closed, 'closed should reject with TypeError') ]); -}, 'terminate() should do nothing after readable.cancel()'); +}, 'terminate() should abort writable immediately after readable.cancel()'); + +promise_test(t => { + let controller; + const ts = new TransformStream({ + start(c) { + controller = c; + } + }); + const cancelReason = { name: 'cancelReason' }; + return ts.readable.cancel(cancelReason).then(() => { + controller.terminate(); + return promise_rejects_exactly(t, cancelReason, ts.writable.getWriter().closed, 'closed should reject with TypeError'); + }) +}, 'terminate() should do nothing after readable.cancel() resolves'); + promise_test(() => { let calls = 0; diff --git a/test/fixtures/wpt/streams/transform-streams/lipfuzz.any.js b/test/fixtures/wpt/streams/transform-streams/lipfuzz.any.js index f9f148aaf1c6a4..e334705db44354 100644 --- a/test/fixtures/wpt/streams/transform-streams/lipfuzz.any.js +++ b/test/fixtures/wpt/streams/transform-streams/lipfuzz.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; class LipFuzzTransformer { diff --git a/test/fixtures/wpt/streams/transform-streams/patched-global.any.js b/test/fixtures/wpt/streams/transform-streams/patched-global.any.js index 2d04e3b948b324..cc111eda452f0f 100644 --- a/test/fixtures/wpt/streams/transform-streams/patched-global.any.js +++ b/test/fixtures/wpt/streams/transform-streams/patched-global.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; // Tests which patch the global environment are kept separate to avoid diff --git a/test/fixtures/wpt/streams/transform-streams/properties.any.js b/test/fixtures/wpt/streams/transform-streams/properties.any.js index 02981b8bc76a5f..dbfd1aa372b907 100644 --- a/test/fixtures/wpt/streams/transform-streams/properties.any.js +++ b/test/fixtures/wpt/streams/transform-streams/properties.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; const transformerMethods = { diff --git a/test/fixtures/wpt/streams/transform-streams/reentrant-strategies.any.js b/test/fixtures/wpt/streams/transform-streams/reentrant-strategies.any.js index fc2f91886659f6..a6d459655856a7 100644 --- a/test/fixtures/wpt/streams/transform-streams/reentrant-strategies.any.js +++ b/test/fixtures/wpt/streams/transform-streams/reentrant-strategies.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/recording-streams.js // META: script=../resources/rs-utils.js // META: script=../resources/test-utils.js @@ -314,6 +314,10 @@ promise_test(t => { // call to TransformStreamDefaultSink. return delay(0).then(() => { controller.enqueue('a'); + return reader.read(); + }).then(({ value, done }) => { + assert_false(done, 'done should be false'); + assert_equals(value, 'a', 'value should be correct'); return Promise.all([promise_rejects_exactly(t, error1, reader.read(), 'read() should reject'), abortPromise]); }); }, 'writer.abort() inside size() should work'); diff --git a/test/fixtures/wpt/streams/transform-streams/strategies.any.js b/test/fixtures/wpt/streams/transform-streams/strategies.any.js index 94055ad99dc94b..57e113e668ce24 100644 --- a/test/fixtures/wpt/streams/transform-streams/strategies.any.js +++ b/test/fixtures/wpt/streams/transform-streams/strategies.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/recording-streams.js // META: script=../resources/test-utils.js 'use strict'; diff --git a/test/fixtures/wpt/streams/transform-streams/terminate.any.js b/test/fixtures/wpt/streams/transform-streams/terminate.any.js index 670006366db2af..a959e70fe69339 100644 --- a/test/fixtures/wpt/streams/transform-streams/terminate.any.js +++ b/test/fixtures/wpt/streams/transform-streams/terminate.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/recording-streams.js // META: script=../resources/test-utils.js 'use strict'; diff --git a/test/fixtures/wpt/streams/writable-streams/aborting.any.js b/test/fixtures/wpt/streams/writable-streams/aborting.any.js index e016cd191b876f..9171dbe158f00c 100644 --- a/test/fixtures/wpt/streams/writable-streams/aborting.any.js +++ b/test/fixtures/wpt/streams/writable-streams/aborting.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js // META: script=../resources/recording-streams.js 'use strict'; diff --git a/test/fixtures/wpt/streams/writable-streams/bad-strategies.any.js b/test/fixtures/wpt/streams/writable-streams/bad-strategies.any.js index 63fa443065ee41..a1ef0791168f99 100644 --- a/test/fixtures/wpt/streams/writable-streams/bad-strategies.any.js +++ b/test/fixtures/wpt/streams/writable-streams/bad-strategies.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; const error1 = new Error('a unique string'); diff --git a/test/fixtures/wpt/streams/writable-streams/bad-underlying-sinks.any.js b/test/fixtures/wpt/streams/writable-streams/bad-underlying-sinks.any.js index d0b3467978ea05..3c434ffe60ccb9 100644 --- a/test/fixtures/wpt/streams/writable-streams/bad-underlying-sinks.any.js +++ b/test/fixtures/wpt/streams/writable-streams/bad-underlying-sinks.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js // META: script=../resources/recording-streams.js 'use strict'; diff --git a/test/fixtures/wpt/streams/writable-streams/byte-length-queuing-strategy.any.js b/test/fixtures/wpt/streams/writable-streams/byte-length-queuing-strategy.any.js index ce1962e8917f32..eed86ee7004ea1 100644 --- a/test/fixtures/wpt/streams/writable-streams/byte-length-queuing-strategy.any.js +++ b/test/fixtures/wpt/streams/writable-streams/byte-length-queuing-strategy.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; promise_test(t => { diff --git a/test/fixtures/wpt/streams/writable-streams/close.any.js b/test/fixtures/wpt/streams/writable-streams/close.any.js index 88855a92efd550..45261e7ca7e01d 100644 --- a/test/fixtures/wpt/streams/writable-streams/close.any.js +++ b/test/fixtures/wpt/streams/writable-streams/close.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js // META: script=../resources/recording-streams.js 'use strict'; diff --git a/test/fixtures/wpt/streams/writable-streams/constructor.any.js b/test/fixtures/wpt/streams/writable-streams/constructor.any.js index eaac90e48b8f86..0abc7ef545ea0b 100644 --- a/test/fixtures/wpt/streams/writable-streams/constructor.any.js +++ b/test/fixtures/wpt/streams/writable-streams/constructor.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; const error1 = new Error('error1'); diff --git a/test/fixtures/wpt/streams/writable-streams/count-queuing-strategy.any.js b/test/fixtures/wpt/streams/writable-streams/count-queuing-strategy.any.js index 064e16e81506f1..8211757530d323 100644 --- a/test/fixtures/wpt/streams/writable-streams/count-queuing-strategy.any.js +++ b/test/fixtures/wpt/streams/writable-streams/count-queuing-strategy.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; test(() => { diff --git a/test/fixtures/wpt/streams/writable-streams/error.any.js b/test/fixtures/wpt/streams/writable-streams/error.any.js index faf3fdd9521430..d08c8a54863bb9 100644 --- a/test/fixtures/wpt/streams/writable-streams/error.any.js +++ b/test/fixtures/wpt/streams/writable-streams/error.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; const error1 = new Error('error1'); diff --git a/test/fixtures/wpt/streams/writable-streams/floating-point-total-queue-size.any.js b/test/fixtures/wpt/streams/writable-streams/floating-point-total-queue-size.any.js index bd34cc53a69579..20a14fc19a51e0 100644 --- a/test/fixtures/wpt/streams/writable-streams/floating-point-total-queue-size.any.js +++ b/test/fixtures/wpt/streams/writable-streams/floating-point-total-queue-size.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; // Due to the limitations of floating-point precision, the calculation of desiredSize sometimes gives different answers diff --git a/test/fixtures/wpt/streams/writable-streams/general.any.js b/test/fixtures/wpt/streams/writable-streams/general.any.js index cede7fd0845b74..48f8eeb89e41ee 100644 --- a/test/fixtures/wpt/streams/writable-streams/general.any.js +++ b/test/fixtures/wpt/streams/writable-streams/general.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; test(() => { diff --git a/test/fixtures/wpt/streams/writable-streams/properties.any.js b/test/fixtures/wpt/streams/writable-streams/properties.any.js index c95bd7d0c080ba..ae0549f0871b48 100644 --- a/test/fixtures/wpt/streams/writable-streams/properties.any.js +++ b/test/fixtures/wpt/streams/writable-streams/properties.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm 'use strict'; const sinkMethods = { diff --git a/test/fixtures/wpt/streams/writable-streams/reentrant-strategy.any.js b/test/fixtures/wpt/streams/writable-streams/reentrant-strategy.any.js index eb05cc068043ea..18ce9e84759a11 100644 --- a/test/fixtures/wpt/streams/writable-streams/reentrant-strategy.any.js +++ b/test/fixtures/wpt/streams/writable-streams/reentrant-strategy.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js // META: script=../resources/recording-streams.js 'use strict'; diff --git a/test/fixtures/wpt/streams/writable-streams/start.any.js b/test/fixtures/wpt/streams/writable-streams/start.any.js index 82d869430dd700..17972b568ceb24 100644 --- a/test/fixtures/wpt/streams/writable-streams/start.any.js +++ b/test/fixtures/wpt/streams/writable-streams/start.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js // META: script=../resources/recording-streams.js 'use strict'; diff --git a/test/fixtures/wpt/streams/writable-streams/write.any.js b/test/fixtures/wpt/streams/writable-streams/write.any.js index f0246f6cad39fd..20a2885bf3512a 100644 --- a/test/fixtures/wpt/streams/writable-streams/write.any.js +++ b/test/fixtures/wpt/streams/writable-streams/write.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker +// META: global=window,worker,shadowrealm // META: script=../resources/test-utils.js // META: script=../resources/recording-streams.js 'use strict'; diff --git a/test/fixtures/wpt/url/failure.html b/test/fixtures/wpt/url/failure.html index 8a408412668fd3..e61f462f97456f 100644 --- a/test/fixtures/wpt/url/failure.html +++ b/test/fixtures/wpt/url/failure.html @@ -10,6 +10,8 @@ function runTests(testData) { for (const test of testData) { + + // skip comments, inputs we expect to pass and relative URLs if (typeof test === "string" || !test.failure || test.base !== null) { continue; } diff --git a/test/fixtures/wpt/url/resources/a-element-origin.js b/test/fixtures/wpt/url/resources/a-element-origin.js index de72988ea93c12..c1c24c8986b4aa 100644 --- a/test/fixtures/wpt/url/resources/a-element-origin.js +++ b/test/fixtures/wpt/url/resources/a-element-origin.js @@ -21,6 +21,10 @@ function runURLTests(urlTests) { if (expected.base === null && expected.input.startsWith("#")) continue; + // HTML special cases data: and javascript: URLs in + if (expected.base !== null && (expected.base.startsWith("data:") || expected.base.startsWith("javascript:"))) + continue; + // We cannot use a null base for HTML tests const base = expected.base === null ? "about:blank" : expected.base; diff --git a/test/fixtures/wpt/url/resources/a-element.js b/test/fixtures/wpt/url/resources/a-element.js index d87937d002b24a..cff4160d328942 100644 --- a/test/fixtures/wpt/url/resources/a-element.js +++ b/test/fixtures/wpt/url/resources/a-element.js @@ -21,6 +21,10 @@ function runURLTests(urlTests) { if (expected.relativeTo === "any-base") continue; + // HTML special cases data: and javascript: URLs in + if (expected.base !== null && (expected.base.startsWith("data:") || expected.base.startsWith("javascript:"))) + continue; + // We cannot use a null base for HTML tests const base = expected.base === null ? "about:blank" : expected.base; diff --git a/test/fixtures/wpt/url/resources/setters_tests.json b/test/fixtures/wpt/url/resources/setters_tests.json index 347caf49ab0520..82adf4cdce270b 100644 --- a/test/fixtures/wpt/url/resources/setters_tests.json +++ b/test/fixtures/wpt/url/resources/setters_tests.json @@ -2021,6 +2021,24 @@ "href": "sc:/space%20", "pathname": "/space%20" } + }, + { + "comment": "Trailing space should be encoded", + "href": "http://example.net", + "new_value": " ", + "expected": { + "href": "http://example.net/%20", + "pathname": "/%20" + } + }, + { + "comment": "Trailing C0 control should be encoded", + "href": "http://example.net", + "new_value": "\u0000", + "expected": { + "href": "http://example.net/%00", + "pathname": "/%00" + } } ], "search": [ @@ -2141,6 +2159,24 @@ "href": "sc:space #fragment", "search": "" } + }, + { + "comment": "Trailing space should be encoded", + "href": "http://example.net", + "new_value": " ", + "expected": { + "href": "http://example.net/?%20", + "search": "?%20" + } + }, + { + "comment": "Trailing C0 control should be encoded", + "href": "http://example.net", + "new_value": "\u0000", + "expected": { + "href": "http://example.net/?%00", + "search": "?%00" + } } ], "hash": [ @@ -2311,6 +2347,24 @@ "href": "sc:space ?query", "hash": "" } + }, + { + "comment": "Trailing space should be encoded", + "href": "http://example.net", + "new_value": " ", + "expected": { + "href": "http://example.net/#%20", + "hash": "#%20" + } + }, + { + "comment": "Trailing C0 control should be encoded", + "href": "http://example.net", + "new_value": "\u0000", + "expected": { + "href": "http://example.net/#%00", + "hash": "#%00" + } } ], "href": [ diff --git a/test/fixtures/wpt/url/resources/urltestdata.json b/test/fixtures/wpt/url/resources/urltestdata.json index ec189871d90814..287a84b467a48b 100644 --- a/test/fixtures/wpt/url/resources/urltestdata.json +++ b/test/fixtures/wpt/url/resources/urltestdata.json @@ -7851,7 +7851,6 @@ "input": "blob:file://host/path", "base": null, "href": "blob:file://host/path", - "origin": "null", "protocol": "blob:", "username": "", "password": "", diff --git a/test/fixtures/wpt/url/url-statics-canparse.any.js b/test/fixtures/wpt/url/url-statics-canparse.any.js index c87fcb4f56fcdd..74f3da31f0d175 100644 --- a/test/fixtures/wpt/url/url-statics-canparse.any.js +++ b/test/fixtures/wpt/url/url-statics-canparse.any.js @@ -6,23 +6,23 @@ "expected": false }, { - "url": "a:b", + "url": "aaa:b", "base": undefined, "expected": true }, { "url": undefined, - "base": "a:b", + "base": "aaa:b", "expected": false }, { - "url": "a:/b", + "url": "aaa:/b", "base": undefined, "expected": true }, { "url": undefined, - "base": "a:/b", + "base": "aaa:/b", "expected": true }, { diff --git a/test/fixtures/wpt/url/urlsearchparams-delete.any.js b/test/fixtures/wpt/url/urlsearchparams-delete.any.js index f9c623b90b175d..c597142c51d5bf 100644 --- a/test/fixtures/wpt/url/urlsearchparams-delete.any.js +++ b/test/fixtures/wpt/url/urlsearchparams-delete.any.js @@ -70,3 +70,14 @@ test(() => { params.delete('a', 'c'); assert_equals(params.toString(), 'a=b&a=d'); }, "Two-argument delete()"); + +test(() => { + const params = new URLSearchParams(); + params.append('a', 'b'); + params.append('a', 'c'); + params.append('b', 'c'); + params.append('b', 'd'); + params.delete('b', 'c'); + params.delete('a', undefined); + assert_equals(params.toString(), 'b=d'); +}, "Two-argument delete() respects undefined as second arg"); diff --git a/test/fixtures/wpt/url/urlsearchparams-has.any.js b/test/fixtures/wpt/url/urlsearchparams-has.any.js index 54cbf286db4a3d..2133a5da2f8b91 100644 --- a/test/fixtures/wpt/url/urlsearchparams-has.any.js +++ b/test/fixtures/wpt/url/urlsearchparams-has.any.js @@ -35,3 +35,11 @@ test(() => { params.delete('a', 'b'); assert_true(params.has('a', 'd')); }, "Two-argument has()"); + +test(() => { + const params = new URLSearchParams("a=b&a=d&c&e&"); + assert_true(params.has('a', 'b')); + assert_false(params.has('a', 'c')); + assert_true(params.has('a', 'd')); + assert_true(params.has('a', undefined)); +}, "Two-argument has() respects undefined as second arg"); \ No newline at end of file diff --git a/test/fixtures/wpt/versions.json b/test/fixtures/wpt/versions.json index e069e93b99efd6..c9ad58bfce7d86 100644 --- a/test/fixtures/wpt/versions.json +++ b/test/fixtures/wpt/versions.json @@ -3,6 +3,10 @@ "commit": "dbd648158d337580885e70a54f929daf215211a0", "path": "common" }, + "compression": { + "commit": "c82521cfa587505746a853a24d22589633825b10", + "path": "compression" + }, "console": { "commit": "767ae354642bee1e4d90b28df4480475b9260e14", "path": "console" @@ -48,7 +52,7 @@ "path": "html/webappapis/timers" }, "interfaces": { - "commit": "df731dab88a1a25c04eb7e6238c11dc28fda0801", + "commit": "727995f0432f7ab2ea35c8679412edc28d87ec08", "path": "interfaces" }, "performance-timeline": { @@ -60,15 +64,15 @@ "path": "resource-timing" }, "resources": { - "commit": "919874f84ff3703365063e749161a34af38c3d2a", + "commit": "1e140d63ec885703ce24b3798abd81912696bb85", "path": "resources" }, "streams": { - "commit": "517e945bbfaf903f37a35c11700eb96662efbdd3", + "commit": "a8872d92b147fc87200eb0c14fe7a4a9e7cd4f73", "path": "streams" }, "url": { - "commit": "84782d931516aa13cfe32dc7eaa1377b4d947d66", + "commit": "c2d7e70b52cbd9a5b938aa32f37078d7a71e0b21", "path": "url" }, "user-timing": { diff --git a/test/internet/test-dns-lookup.js b/test/internet/test-dns-lookup.js index 6b06801dd1afb8..269c3cc91f2a68 100644 --- a/test/internet/test-dns-lookup.js +++ b/test/internet/test-dns-lookup.js @@ -17,7 +17,7 @@ assert.rejects( code: 'ENOTFOUND', message: `getaddrinfo ENOTFOUND ${addresses.NOT_FOUND}`, }, -); +).then(common.mustCall()); assert.rejects( dnsPromises.lookup(addresses.NOT_FOUND, { @@ -29,7 +29,7 @@ assert.rejects( code: 'ENOTFOUND', message: `getaddrinfo ENOTFOUND ${addresses.NOT_FOUND}`, }, -); +).then(common.mustCall()); dns.lookup(addresses.NOT_FOUND, { hints: 0, diff --git a/test/internet/test-inspector-help-page.js b/test/internet/test-inspector-help-page.js index d9ae17c5a887b2..5679eae4ebac83 100644 --- a/test/internet/test-inspector-help-page.js +++ b/test/internet/test-inspector-help-page.js @@ -18,7 +18,7 @@ function check(url, cb) { assert(res.statusCode >= 200 && res.statusCode < 400); if (res.statusCode >= 300) - return check(res.headers.location, cb); + return check(new URL(res.headers.location, url), cb); let result = ''; diff --git a/test/internet/test-net-autoselectfamily-events-failure.js b/test/internet/test-net-autoselectfamily-events-failure.js new file mode 100644 index 00000000000000..a1d1930a9b4907 --- /dev/null +++ b/test/internet/test-net-autoselectfamily-events-failure.js @@ -0,0 +1,128 @@ +'use strict'; + +const common = require('../common'); +const { addresses: { INET6_IP, INET4_IP } } = require('../common/internet'); +const { createMockedLookup } = require('../common/dns'); + +const assert = require('assert'); +const { createConnection } = require('net'); + +// +// When testing this is MacOS, remember that the last connection will have no timeout at Node.js +// level but only at operating system one. +// +// The default for MacOS is 75 seconds. It can be changed by doing: +// +// sudo sysctl net.inet.tcp.keepinit=VALUE_IN_MS +// + +// Test that all failure events are emitted when trying a single IP (which means autoselectfamily is bypassed) +{ + const pass = common.mustCallAtLeast(1); + + const connection = createConnection({ + host: 'example.org', + port: 10, + lookup: createMockedLookup(INET4_IP), + autoSelectFamily: true, + autoSelectFamilyAttemptTimeout: 10, + }); + + connection.on('connectionAttempt', (address, port, family) => { + assert.strictEqual(address, INET4_IP); + assert.strictEqual(port, 10); + assert.strictEqual(family, 4); + + pass(); + }); + + connection.on('connectionAttemptFailed', (address, port, family, error) => { + assert.strictEqual(address, INET4_IP); + assert.strictEqual(port, 10); + assert.strictEqual(family, 4); + + assert.ok( + error.code.match(/ECONNREFUSED|ENETUNREACH|EHOSTUNREACH|ETIMEDOUT/), + `Received unexpected error code ${error.code}`, + ); + + pass(); + }); + + connection.on('ready', () => { + pass(); + connection.destroy(); + }); + + connection.on('error', () => { + pass(); + connection.destroy(); + }); + + setTimeout(() => { + pass(); + process.exit(0); + }, 5000).unref(); + +} + +// Test that all events are emitted when trying multiple IPs +{ + const pass = common.mustCallAtLeast(1); + + const connection = createConnection({ + host: 'example.org', + port: 10, + lookup: createMockedLookup(INET6_IP, INET4_IP), + autoSelectFamily: true, + autoSelectFamilyAttemptTimeout: 10, + }); + + const addresses = [ + { address: INET6_IP, port: 10, family: 6 }, + { address: INET6_IP, port: 10, family: 6 }, + { address: INET4_IP, port: 10, family: 4 }, + { address: INET4_IP, port: 10, family: 4 }, + ]; + + connection.on('connectionAttempt', (address, port, family) => { + const expected = addresses.shift(); + + assert.strictEqual(address, expected.address); + assert.strictEqual(port, expected.port); + assert.strictEqual(family, expected.family); + + pass(); + }); + + connection.on('connectionAttemptFailed', (address, port, family, error) => { + const expected = addresses.shift(); + + assert.strictEqual(address, expected.address); + assert.strictEqual(port, expected.port); + assert.strictEqual(family, expected.family); + + assert.ok( + error.code.match(/ECONNREFUSED|ENETUNREACH|EHOSTUNREACH|ETIMEDOUT/), + `Received unexpected error code ${error.code}`, + ); + + pass(); + }); + + connection.on('ready', () => { + pass(); + connection.destroy(); + }); + + connection.on('error', () => { + pass(); + connection.destroy(); + }); + + setTimeout(() => { + pass(); + process.exit(0); + }, 5000).unref(); + +} diff --git a/test/internet/test-net-autoselectfamily-events-timeout.js b/test/internet/test-net-autoselectfamily-events-timeout.js new file mode 100644 index 00000000000000..5968b68afd037e --- /dev/null +++ b/test/internet/test-net-autoselectfamily-events-timeout.js @@ -0,0 +1,54 @@ +'use strict'; + +const common = require('../common'); +const { addresses: { INET6_IP, INET4_IP } } = require('../common/internet'); +const { createMockedLookup } = require('../common/dns'); + +const assert = require('assert'); +const { createConnection } = require('net'); + +// +// When testing this is MacOS, remember that the last connection will have no timeout at Node.js +// level but only at operating system one. +// +// The default for MacOS is 75 seconds. It can be changed by doing: +// +// sudo sysctl net.inet.tcp.keepinit=VALUE_IN_MS +// +// Depending on the network, it might be impossible to obtain a timeout in 10ms, +// which is the minimum value allowed by network family autoselection. +// At the time of writing (Dec 2023), the network times out on local machine and in the Node CI, +// but it does not on GitHub actions runner. +// Therefore, after five seconds we just consider this test as passed. + +// Test that if a connection attempt times out and the socket is destroyed before the +// next attempt starts then the process does not crash +{ + const connection = createConnection({ + host: 'example.org', + port: 443, + lookup: createMockedLookup(INET4_IP, INET6_IP), + autoSelectFamily: true, + autoSelectFamilyAttemptTimeout: 10, + }); + + const pass = common.mustCall(); + + connection.on('connectionAttemptTimeout', (address, port, family) => { + assert.strictEqual(address, INET4_IP); + assert.strictEqual(port, 443); + assert.strictEqual(family, 4); + connection.destroy(); + pass(); + }); + + connection.on('ready', () => { + pass(); + connection.destroy(); + }); + + setTimeout(() => { + pass(); + process.exit(0); + }, 5000).unref(); +} diff --git a/test/internet/test-net-autoselectfamily-timeout-close.js b/test/internet/test-net-autoselectfamily-timeout-close.js index b93bbc546d24e9..e2d0945cb43b1d 100644 --- a/test/internet/test-net-autoselectfamily-timeout-close.js +++ b/test/internet/test-net-autoselectfamily-timeout-close.js @@ -6,6 +6,15 @@ const { addresses } = require('../common/internet'); const assert = require('assert'); const { connect } = require('net'); +// +// When testing this is MacOS, remember that the last connection will have no timeout at Node.js +// level but only at operating system one. +// +// The default for MacOS is 75 seconds. It can be changed by doing: +// +// sudo sysctl net.inet.tcp.keepinit=VALUE_IN_MS +// + // Test that when all errors are returned when no connections succeeded and that the close event is emitted { const connection = connect({ diff --git a/test/js-native-api/common-inl.h b/test/js-native-api/common-inl.h index d4db4a3e58bdc6..51ed4cdd4e11ed 100644 --- a/test/js-native-api/common-inl.h +++ b/test/js-native-api/common-inl.h @@ -38,17 +38,32 @@ inline void add_last_status(napi_env env, const char* key, napi_value return_value) { napi_value prop_value; + napi_value exception; const napi_extended_error_info* p_last_error; NODE_API_CALL_RETURN_VOID(env, napi_get_last_error_info(env, &p_last_error)); + // Content of p_last_error can be updated in subsequent node-api calls. + // Retrieve it immediately. + const char* error_message = p_last_error->error_message == NULL + ? "napi_ok" + : p_last_error->error_message; + + bool is_exception_pending; + NODE_API_CALL_RETURN_VOID( + env, napi_is_exception_pending(env, &is_exception_pending)); + if (is_exception_pending) { + NODE_API_CALL_RETURN_VOID( + env, napi_get_and_clear_last_exception(env, &exception)); + char exception_key[50]; + snprintf(exception_key, sizeof(exception_key), "%s%s", key, "Exception"); + NODE_API_CALL_RETURN_VOID( + env, + napi_set_named_property(env, return_value, exception_key, exception)); + } NODE_API_CALL_RETURN_VOID( env, napi_create_string_utf8( - env, - (p_last_error->error_message == NULL ? "napi_ok" - : p_last_error->error_message), - NAPI_AUTO_LENGTH, - &prop_value)); + env, error_message, NAPI_AUTO_LENGTH, &prop_value)); NODE_API_CALL_RETURN_VOID( env, napi_set_named_property(env, return_value, key, prop_value)); } diff --git a/test/js-native-api/common.h b/test/js-native-api/common.h index fc6f4cb6c2e1db..1308088e7872fb 100644 --- a/test/js-native-api/common.h +++ b/test/js-native-api/common.h @@ -2,6 +2,7 @@ #define JS_NATIVE_API_COMMON_H_ #include +#include // abort() // Empty value so that macros here are able to return NULL or void #define NODE_API_RETVAL_NOTHING // Intentionally blank #define @@ -22,6 +23,19 @@ } \ } while (0) +// The nogc version of GET_AND_THROW_LAST_ERROR. We cannot access any +// exceptions and we cannot fail by way of JS exception, so we abort. +#define FATALLY_FAIL_WITH_LAST_ERROR(env) \ + do { \ + const napi_extended_error_info* error_info; \ + napi_get_last_error_info((env), &error_info); \ + const char* err_message = error_info->error_message; \ + const char* error_message = \ + err_message != NULL ? err_message : "empty error message"; \ + fprintf(stderr, "%s\n", error_message); \ + abort(); \ + } while (0) + #define NODE_API_ASSERT_BASE(env, assertion, message, ret_val) \ do { \ if (!(assertion)) { \ @@ -33,6 +47,15 @@ } \ } while (0) +#define NODE_API_NOGC_ASSERT_BASE(assertion, message, ret_val) \ + do { \ + if (!(assertion)) { \ + fprintf(stderr, "assertion (" #assertion ") failed: " message); \ + abort(); \ + return ret_val; \ + } \ + } while (0) + // Returns NULL on failed assertion. // This is meant to be used inside napi_callback methods. #define NODE_API_ASSERT(env, assertion, message) \ @@ -43,6 +66,9 @@ #define NODE_API_ASSERT_RETURN_VOID(env, assertion, message) \ NODE_API_ASSERT_BASE(env, assertion, message, NODE_API_RETVAL_NOTHING) +#define NODE_API_NOGC_ASSERT_RETURN_VOID(assertion, message) \ + NODE_API_NOGC_ASSERT_BASE(assertion, message, NODE_API_RETVAL_NOTHING) + #define NODE_API_CALL_BASE(env, the_call, ret_val) \ do { \ if ((the_call) != napi_ok) { \ @@ -51,6 +77,14 @@ } \ } while (0) +#define NODE_API_NOGC_CALL_BASE(env, the_call, ret_val) \ + do { \ + if ((the_call) != napi_ok) { \ + FATALLY_FAIL_WITH_LAST_ERROR((env)); \ + return ret_val; \ + } \ + } while (0) + // Returns NULL if the_call doesn't return napi_ok. #define NODE_API_CALL(env, the_call) \ NODE_API_CALL_BASE(env, the_call, NULL) @@ -59,6 +93,9 @@ #define NODE_API_CALL_RETURN_VOID(env, the_call) \ NODE_API_CALL_BASE(env, the_call, NODE_API_RETVAL_NOTHING) +#define NODE_API_NOGC_CALL_RETURN_VOID(env, the_call) \ + NODE_API_NOGC_CALL_BASE(env, the_call, NODE_API_RETVAL_NOTHING) + #define NODE_API_CHECK_STATUS(the_call) \ do { \ napi_status status = (the_call); \ diff --git a/test/js-native-api/test_cannot_run_js/test_cannot_run_js.c b/test/js-native-api/test_cannot_run_js/test_cannot_run_js.c index 2cd25823c924c0..c495f8780d0141 100644 --- a/test/js-native-api/test_cannot_run_js/test_cannot_run_js.c +++ b/test/js-native-api/test_cannot_run_js/test_cannot_run_js.c @@ -20,6 +20,15 @@ static void Finalize(napi_env env, void* data, void* hint) { free(ref); } +static void NogcFinalize(node_api_nogc_env env, void* data, void* hint) { +#ifdef NAPI_EXPERIMENTAL + NODE_API_NOGC_CALL_RETURN_VOID( + env, node_api_post_finalizer(env, Finalize, data, hint)); +#else + Finalize(env, data, hint); +#endif +} + static napi_value CreateRef(napi_env env, napi_callback_info info) { size_t argc = 1; napi_value cb; @@ -30,7 +39,7 @@ static napi_value CreateRef(napi_env env, napi_callback_info info) { NODE_API_CALL(env, napi_typeof(env, cb, &value_type)); NODE_API_ASSERT( env, value_type == napi_function, "argument must be function"); - NODE_API_CALL(env, napi_add_finalizer(env, cb, ref, Finalize, NULL, ref)); + NODE_API_CALL(env, napi_add_finalizer(env, cb, ref, NogcFinalize, NULL, ref)); return cb; } diff --git a/test/js-native-api/test_finalizer/test_fatal_finalize.js b/test/js-native-api/test_finalizer/test_fatal_finalize.js index 352310128a97f6..a100eb220024da 100644 --- a/test/js-native-api/test_finalizer/test_fatal_finalize.js +++ b/test/js-native-api/test_finalizer/test_fatal_finalize.js @@ -27,5 +27,5 @@ const { spawnSync } = require('child_process'); const child = spawnSync(process.execPath, [ '--expose-gc', __filename, 'child', ]); -assert.strictEqual(child.signal, common.isWindows ? null : 'SIGABRT'); +assert(common.nodeProcessAborted(child.status, child.signal)); assert.match(child.stderr.toString(), /Finalizer is calling a function that may affect GC state/); diff --git a/test/js-native-api/test_finalizer/test_finalizer.c b/test/js-native-api/test_finalizer/test_finalizer.c index 378781b7042f96..b9b046484a5288 100644 --- a/test/js-native-api/test_finalizer/test_finalizer.c +++ b/test/js-native-api/test_finalizer/test_finalizer.c @@ -11,17 +11,17 @@ typedef struct { napi_ref js_func; } FinalizerData; -static void finalizerOnlyCallback(napi_env env, +static void finalizerOnlyCallback(node_api_nogc_env env, void* finalize_data, void* finalize_hint) { FinalizerData* data = (FinalizerData*)finalize_data; int32_t count = ++data->finalize_count; // It is safe to access instance data - NODE_API_CALL_RETURN_VOID(env, napi_get_instance_data(env, (void**)&data)); - NODE_API_ASSERT_RETURN_VOID(env, - count = data->finalize_count, - "Expected to be the same FinalizerData"); + NODE_API_NOGC_CALL_RETURN_VOID(env, + napi_get_instance_data(env, (void**)&data)); + NODE_API_NOGC_ASSERT_RETURN_VOID(count = data->finalize_count, + "Expected to be the same FinalizerData"); } static void finalizerCallingJSCallback(napi_env env, @@ -40,18 +40,20 @@ static void finalizerCallingJSCallback(napi_env env, } // Schedule async finalizer to run JavaScript-touching code. -static void finalizerWithJSCallback(napi_env env, +static void finalizerWithJSCallback(node_api_nogc_env env, void* finalize_data, void* finalize_hint) { - NODE_API_CALL_RETURN_VOID( + NODE_API_NOGC_CALL_RETURN_VOID( env, node_api_post_finalizer( env, finalizerCallingJSCallback, finalize_data, finalize_hint)); } -static void finalizerWithFailedJSCallback(napi_env env, +static void finalizerWithFailedJSCallback(node_api_nogc_env nogc_env, void* finalize_data, void* finalize_hint) { + // Intentionally cast to a napi_env to test the fatal failure. + napi_env env = (napi_env)nogc_env; napi_value obj; FinalizerData* data = (FinalizerData*)finalize_data; ++data->finalize_count; diff --git a/test/js-native-api/test_object/binding.gyp b/test/js-native-api/test_object/binding.gyp index b81f502584619e..e63c1649a05140 100644 --- a/test/js-native-api/test_object/binding.gyp +++ b/test/js-native-api/test_object/binding.gyp @@ -6,6 +6,12 @@ "test_null.c", "test_object.c" ] + }, + { + "target_name": "test_exceptions", + "sources": [ + "test_exceptions.c", + ] } ] } diff --git a/test/js-native-api/test_object/test_exceptions.c b/test/js-native-api/test_object/test_exceptions.c new file mode 100644 index 00000000000000..7d2f18fd6ff469 --- /dev/null +++ b/test/js-native-api/test_object/test_exceptions.c @@ -0,0 +1,82 @@ +#include +#include +#include +#include "../common.h" +#include "../entry_point.h" + +static napi_value TestExceptions(napi_env env, napi_callback_info info) { + size_t argc = 1; + napi_value args[1]; + NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL)); + + napi_value target = args[0]; + napi_value exception, key, value; + napi_status status; + bool is_exception_pending; + bool bool_result; + + NODE_API_CALL(env, + napi_create_string_utf8(env, "key", NAPI_AUTO_LENGTH, &key)); + NODE_API_CALL( + env, napi_create_string_utf8(env, "value", NAPI_AUTO_LENGTH, &value)); + +#define PROCEDURE(call) \ + { \ + status = (call); \ + NODE_API_ASSERT( \ + env, status == napi_pending_exception, "expect exception pending"); \ + NODE_API_CALL(env, napi_is_exception_pending(env, &is_exception_pending)); \ + NODE_API_ASSERT(env, is_exception_pending, "expect exception pending"); \ + NODE_API_CALL(env, napi_get_and_clear_last_exception(env, &exception)); \ + } + // discard the exception values. + + // properties + PROCEDURE(napi_set_property(env, target, key, value)); + PROCEDURE(napi_set_named_property(env, target, "key", value)); + PROCEDURE(napi_has_property(env, target, key, &bool_result)); + PROCEDURE(napi_has_own_property(env, target, key, &bool_result)); + PROCEDURE(napi_has_named_property(env, target, "key", &bool_result)); + PROCEDURE(napi_get_property(env, target, key, &value)); + PROCEDURE(napi_get_named_property(env, target, "key", &value)); + PROCEDURE(napi_delete_property(env, target, key, &bool_result)); + + // elements + PROCEDURE(napi_set_element(env, target, 0, value)); + PROCEDURE(napi_has_element(env, target, 0, &bool_result)); + PROCEDURE(napi_get_element(env, target, 0, &value)); + PROCEDURE(napi_delete_element(env, target, 0, &bool_result)); + + napi_property_descriptor descriptors[] = { + DECLARE_NODE_API_PROPERTY_VALUE("key", value), + }; + PROCEDURE(napi_define_properties( + env, target, sizeof(descriptors) / sizeof(*descriptors), descriptors)); + + PROCEDURE(napi_get_all_property_names(env, + target, + napi_key_own_only, + napi_key_enumerable, + napi_key_keep_numbers, + &value)); + PROCEDURE(napi_get_property_names(env, target, &value)); + + return NULL; +} + +EXTERN_C_START +napi_value Init(napi_env env, napi_value exports) { + napi_property_descriptor descriptors[] = { + DECLARE_NODE_API_PROPERTY("testExceptions", TestExceptions), + }; + + NODE_API_CALL( + env, + napi_define_properties(env, + exports, + sizeof(descriptors) / sizeof(*descriptors), + descriptors)); + + return exports; +} +EXTERN_C_END diff --git a/test/js-native-api/test_object/test_exceptions.js b/test/js-native-api/test_object/test_exceptions.js new file mode 100644 index 00000000000000..1e45d64368b01c --- /dev/null +++ b/test/js-native-api/test_object/test_exceptions.js @@ -0,0 +1,18 @@ +'use strict'; +const common = require('../../common'); + +// Test +const { testExceptions } = require(`./build/${common.buildType}/test_exceptions`); + +function throws() { + throw new Error('foobar'); +} +testExceptions(new Proxy({}, { + get: common.mustCallAtLeast(throws, 1), + getOwnPropertyDescriptor: common.mustCallAtLeast(throws, 1), + defineProperty: common.mustCallAtLeast(throws, 1), + deleteProperty: common.mustCallAtLeast(throws, 1), + has: common.mustCallAtLeast(throws, 1), + set: common.mustCallAtLeast(throws, 1), + ownKeys: common.mustCallAtLeast(throws, 1), +})); diff --git a/test/js-native-api/test_string/test_string.c b/test/js-native-api/test_string/test_string.c index b2046e3b873392..e18aa04ad1c5e2 100644 --- a/test/js-native-api/test_string/test_string.c +++ b/test/js-native-api/test_string/test_string.c @@ -88,7 +88,7 @@ static napi_value TestTwoByteImpl(napi_env env, return output; } -static void free_string(napi_env env, void* data, void* hint) { +static void free_string(node_api_nogc_env env, void* data, void* hint) { free(data); } diff --git a/test/message/console_assert.js b/test/message/console_assert.js new file mode 100644 index 00000000000000..14976312820d40 --- /dev/null +++ b/test/message/console_assert.js @@ -0,0 +1,5 @@ +'use strict'; + +require('../common'); + +console.assert(false, Symbol('hello')); diff --git a/test/message/console_assert.out b/test/message/console_assert.out new file mode 100644 index 00000000000000..259d18fa5cfc2f --- /dev/null +++ b/test/message/console_assert.out @@ -0,0 +1 @@ +Assertion failed* Symbol(hello) diff --git a/test/message/eval_messages.out b/test/message/eval_messages.out index 3f44332c03a470..e07bbe4d6acd3c 100644 --- a/test/message/eval_messages.out +++ b/test/message/eval_messages.out @@ -2,10 +2,9 @@ [eval]:1 with(this){__filename} ^^^^ + SyntaxError: Strict mode code may not include a with statement - at new Script (node:vm:*:*) - at createScript (node:vm:*:*) - at Object.runInThisContext (node:vm:*:*) + at makeContextifyScript (node:internal/vm:*:*) at node:internal/process/execution:*:* at [eval]-wrapper:*:* at runScript (node:internal/process/execution:*:*) @@ -21,8 +20,7 @@ throw new Error("hello") Error: hello at [eval]:1:7 - at Script.runInThisContext (node:vm:*:*) - at Object.runInThisContext (node:vm:*:*) + at runScriptInThisContext (node:internal/vm:*:*) at node:internal/process/execution:*:* at [eval]-wrapper:*:* at runScript (node:internal/process/execution:*:*) @@ -37,8 +35,7 @@ throw new Error("hello") Error: hello at [eval]:1:7 - at Script.runInThisContext (node:vm:*:*) - at Object.runInThisContext (node:vm:*:*) + at runScriptInThisContext (node:internal/vm:*:*) at node:internal/process/execution:*:* at [eval]-wrapper:*:* at runScript (node:internal/process/execution:*:*) @@ -53,8 +50,7 @@ var x = 100; y = x; ReferenceError: y is not defined at [eval]:1:16 - at Script.runInThisContext (node:vm:*:*) - at Object.runInThisContext (node:vm:*:*) + at runScriptInThisContext (node:internal/vm:*:*) at node:internal/process/execution:*:* at [eval]-wrapper:*:* at runScript (node:internal/process/execution:*:*) diff --git a/test/message/stdin_messages.out b/test/message/stdin_messages.out index 3fd047aacb11a2..6afc8a62d7fcd9 100644 --- a/test/message/stdin_messages.out +++ b/test/message/stdin_messages.out @@ -4,9 +4,7 @@ with(this){__filename} ^^^^ SyntaxError: Strict mode code may not include a with statement - at new Script (node:vm:*) - at createScript (node:vm:*) - at Object.runInThisContext (node:vm:*) + at makeContextifyScript (node:internal/vm:*:*) at node:internal/process/execution:*:* at [stdin]-wrapper:*:* at runScript (node:internal/process/execution:*:*) @@ -14,6 +12,8 @@ SyntaxError: Strict mode code may not include a with statement at node:internal/main/eval_stdin:*:* at Socket. (node:internal/process/execution:*:*) at Socket.emit (node:events:*:*) + at endReadableNT (node:internal/streams/readable:*:*) + at process.processTicksAndRejections (node:internal/process/task_queues:*:*) Node.js * 42 @@ -24,8 +24,7 @@ throw new Error("hello") Error: hello at [stdin]:1:7 - at Script.runInThisContext (node:vm:*) - at Object.runInThisContext (node:vm:*) + at runScriptInThisContext (node:internal/vm:*:*) at node:internal/process/execution:*:* at [stdin]-wrapper:*:* at runScript (node:internal/process/execution:*:*) @@ -33,6 +32,7 @@ Error: hello at node:internal/main/eval_stdin:*:* at Socket. (node:internal/process/execution:*:*) at Socket.emit (node:events:*:*) + at endReadableNT (node:internal/streams/readable:*:*) Node.js * [stdin]:1 @@ -41,8 +41,7 @@ throw new Error("hello") Error: hello at [stdin]:1:* - at Script.runInThisContext (node:vm:*) - at Object.runInThisContext (node:vm:*) + at runScriptInThisContext (node:internal/vm:*:*) at node:internal/process/execution:*:* at [stdin]-wrapper:*:* at runScript (node:internal/process/execution:*:*) @@ -50,6 +49,7 @@ Error: hello at node:internal/main/eval_stdin:*:* at Socket. (node:internal/process/execution:*:*) at Socket.emit (node:events:*:*) + at endReadableNT (node:internal/streams/readable:*:*) Node.js * 100 @@ -59,8 +59,7 @@ let x = 100; y = x; ReferenceError: y is not defined at [stdin]:1:16 - at Script.runInThisContext (node:vm:*) - at Object.runInThisContext (node:vm:*) + at runScriptInThisContext (node:internal/vm:*:*) at node:internal/process/execution:*:* at [stdin]-wrapper:*:* at runScript (node:internal/process/execution:*:*) @@ -68,6 +67,7 @@ ReferenceError: y is not defined at node:internal/main/eval_stdin:*:* at Socket. (node:internal/process/execution:*:*) at Socket.emit (node:events:*:*) + at endReadableNT (node:internal/streams/readable:*:*) Node.js * diff --git a/test/node-api/test_fatal/test_threads.js b/test/node-api/test_fatal/test_threads.js index 8c306694f5e259..4a4f867613a3b5 100644 --- a/test/node-api/test_fatal/test_threads.js +++ b/test/node-api/test_fatal/test_threads.js @@ -18,4 +18,4 @@ const p = child_process.spawnSync( assert.ifError(p.error); assert.ok(p.stderr.toString().includes( 'FATAL ERROR: work_thread foobar')); -assert.ok(p.status === 134 || p.signal === 'SIGABRT'); +assert(common.nodeProcessAborted(p.status, p.signal)); diff --git a/test/node-api/test_reference_by_node_api_version/test_reference_by_node_api_version.c b/test/node-api/test_reference_by_node_api_version/test_reference_by_node_api_version.c index ae4fa7cb0e8856..f9110303d2ded4 100644 --- a/test/node-api/test_reference_by_node_api_version/test_reference_by_node_api_version.c +++ b/test/node-api/test_reference_by_node_api_version/test_reference_by_node_api_version.c @@ -4,12 +4,12 @@ static uint32_t finalizeCount = 0; -static void FreeData(napi_env env, void* data, void* hint) { - NODE_API_ASSERT_RETURN_VOID(env, data != NULL, "Expects non-NULL data."); +static void FreeData(node_api_nogc_env env, void* data, void* hint) { + NODE_API_NOGC_ASSERT_RETURN_VOID(data != NULL, "Expects non-NULL data."); free(data); } -static void Finalize(napi_env env, void* data, void* hint) { +static void Finalize(node_api_nogc_env env, void* data, void* hint) { ++finalizeCount; } @@ -61,7 +61,7 @@ static napi_value ToUInt32Value(napi_env env, uint32_t value) { static napi_status InitRefArray(napi_env env) { // valueRefs array has one entry per napi_valuetype napi_ref* valueRefs = malloc(sizeof(napi_ref) * ((int)napi_bigint + 1)); - return napi_set_instance_data(env, valueRefs, &FreeData, NULL); + return napi_set_instance_data(env, valueRefs, (napi_finalize)&FreeData, NULL); } static napi_value CreateExternal(napi_env env, napi_callback_info info) { diff --git a/test/node-api/test_threadsafe_function/test_uncaught_exception.c b/test/node-api/test_threadsafe_function/test_uncaught_exception.c index f8499d4fe4d680..c5eb4271dd490e 100644 --- a/test/node-api/test_threadsafe_function/test_uncaught_exception.c +++ b/test/node-api/test_threadsafe_function/test_uncaught_exception.c @@ -16,6 +16,18 @@ static void ThreadSafeFunctionFinalize(napi_env env, NODE_API_CALL_RETURN_VOID(env, napi_delete_reference(env, js_func_ref)); } +static void ThreadSafeFunctionNogcFinalize(node_api_nogc_env env, + void* data, + void* hint) { +#ifdef NAPI_EXPERIMENTAL + NODE_API_NOGC_CALL_RETURN_VOID( + env, + node_api_post_finalizer(env, ThreadSafeFunctionFinalize, data, hint)); +#else + ThreadSafeFunctionFinalize(env, data, hint); +#endif +} + // Testing calling into JavaScript static napi_value CallIntoModule(napi_env env, napi_callback_info info) { size_t argc = 4; @@ -34,7 +46,7 @@ static napi_value CallIntoModule(napi_env env, napi_callback_info info) { 0, 1, finalize_func, - ThreadSafeFunctionFinalize, + ThreadSafeFunctionNogcFinalize, NULL, NULL, &tsfn)); diff --git a/test/node-api/test_uv_threadpool_size/node-options.js b/test/node-api/test_uv_threadpool_size/node-options.js new file mode 100644 index 00000000000000..40610274acce4c --- /dev/null +++ b/test/node-api/test_uv_threadpool_size/node-options.js @@ -0,0 +1,31 @@ +'use strict'; + +const common = require('../../common'); +const assert = require('assert'); +const path = require('path'); +const { spawnSync } = require('child_process'); + +if (process.config.variables.node_without_node_options) { + common.skip('missing NODE_OPTIONS support'); +} + +const uvThreadPoolPath = '../../fixtures/dotenv/uv-threadpool.env'; + +// Should update UV_THREADPOOL_SIZE +let filePath = path.join(__dirname, `./build/${common.buildType}/test_uv_threadpool_size`); +if (common.isWindows) { + filePath = filePath.replaceAll('\\', '\\\\'); +} +const code = ` + const { test } = require('${filePath}'); + const size = parseInt(process.env.UV_THREADPOOL_SIZE, 10); + require('assert').strictEqual(size, 4); + test(size); + `.trim(); +const child = spawnSync( + process.execPath, + [ `--env-file=${uvThreadPoolPath}`, '--eval', code ], + { cwd: __dirname, encoding: 'utf-8' }, +); +assert.strictEqual(child.stderr, ''); +assert.strictEqual(child.status, 0); diff --git a/test/parallel/parallel.status b/test/parallel/parallel.status index ffe3505021b522..98288c5c1228c2 100644 --- a/test/parallel/parallel.status +++ b/test/parallel/parallel.status @@ -11,6 +11,14 @@ prefix parallel test-crypto-keygen: PASS,FLAKY # https://github.com/nodejs/node/issues/41201 test-fs-rmdir-recursive: PASS, FLAKY +# https://github.com/nodejs/node/issues/49985 +test-runner-watch-mode: PASS, FLAKY +# https://github.com/nodejs/node/issues/50295 +test-cli-node-options: PASS, FLAKY + +# Windows on x86 +[$system==win32 && $arch==ia32] +test-worker-nearheaplimit-deadlock: PASS, FLAKY # Windows on ARM [$system==win32 && $arch==arm64] @@ -20,6 +28,8 @@ test-fs-rmdir-recursive: PASS, FLAKY test-domain-error-types: PASS,FLAKY # https://github.com/nodejs/node/issues/47420 test-file-write-stream4: PASS,FLAKY +# https://github.com/nodejs/node/issues/43465 +test-http-server-request-timeouts-mixed: PASS, FLAKY [$system==linux || $system==win32] # https://github.com/nodejs/node/issues/49605 @@ -31,6 +41,8 @@ test-http-server-headers-timeout-keepalive: PASS,FLAKY test-http-server-request-timeout-keepalive: PASS,FLAKY # https://github.com/nodejs/node/issues/43465 test-http-server-request-timeouts-mixed: PASS,FLAKY +# https://github.com/nodejs/node/issues/50243 +test-inspector-async-stack-traces-set-interval: PASS, FLAKY [$arch==arm || $arch==arm64] # https://github.com/nodejs/node/pull/31178 @@ -97,3 +109,7 @@ test-http-pipeline-flood: SKIP [$asan==on] # https://github.com/nodejs/node/issues/39655 test-cluster-primary-error: PASS, FLAKY + +[$arch==s390x] +# https://github.com/nodejs/node/issues/50222 +test-inspector-async-hook-setup-at-inspect-brk: PASS, FLAKY diff --git a/test/parallel/test-assert-deep.js b/test/parallel/test-assert-deep.js index f7489993aa60ba..f147be1b41f2a8 100644 --- a/test/parallel/test-assert-deep.js +++ b/test/parallel/test-assert-deep.js @@ -1,6 +1,6 @@ 'use strict'; -require('../common'); +const common = require('../common'); const assert = require('assert'); const util = require('util'); const { AssertionError } = assert; @@ -1220,3 +1220,60 @@ assert.throws( assertNotDeepOrStrict(a, b); } + +// eslint-disable-next-line node-core/crypto-check +if (common.hasCrypto) { + const crypto = require('crypto'); + const { subtle } = globalThis.crypto; + + { + const a = crypto.createSecretKey(Buffer.alloc(1, 0)); + const b = crypto.createSecretKey(Buffer.alloc(1, 1)); + + assertNotDeepOrStrict(a, b); + } + + { + const a = crypto.createSecretKey(Buffer.alloc(0)); + const b = crypto.createSecretKey(Buffer.alloc(0)); + + assertDeepAndStrictEqual(a, b); + } + + (async () => { + { + const a = await subtle.importKey('raw', Buffer.alloc(1, 0), { name: 'HMAC', hash: 'SHA-256' }, true, ['sign']); + const b = await subtle.importKey('raw', Buffer.alloc(1, 1), { name: 'HMAC', hash: 'SHA-256' }, true, ['sign']); + + assertNotDeepOrStrict(a, b); + } + + { + const a = await subtle.importKey('raw', Buffer.alloc(1), { name: 'HMAC', hash: 'SHA-256' }, true, ['sign']); + const b = await subtle.importKey('raw', Buffer.alloc(1), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']); + + assertNotDeepOrStrict(a, b); + } + + { + const a = await subtle.importKey('raw', Buffer.alloc(1), { name: 'HMAC', hash: 'SHA-256' }, true, ['sign']); + const b = await subtle.importKey('raw', Buffer.alloc(1), { name: 'HMAC', hash: 'SHA-384' }, true, ['sign']); + + assertNotDeepOrStrict(a, b); + } + + { + const a = await subtle.importKey('raw', Buffer.alloc(1), { name: 'HMAC', hash: 'SHA-256' }, true, ['sign']); + const b = await subtle.importKey('raw', Buffer.alloc(1), { name: 'HMAC', hash: 'SHA-256' }, true, ['verify']); + + assertNotDeepOrStrict(a, b); + } + + { + const a = await subtle.importKey('raw', Buffer.alloc(1), { name: 'HMAC', hash: 'SHA-256' }, true, ['sign']); + const b = await subtle.importKey('raw', Buffer.alloc(1), { name: 'HMAC', hash: 'SHA-256' }, true, ['sign']); + + assertDeepAndStrictEqual(a, b); + } + })().then(common.mustCall()); +} diff --git a/test/parallel/test-assert-esm-cjs-message-verify.js b/test/parallel/test-assert-esm-cjs-message-verify.js new file mode 100644 index 00000000000000..9a66d83abd9c4b --- /dev/null +++ b/test/parallel/test-assert-esm-cjs-message-verify.js @@ -0,0 +1,51 @@ +'use strict'; + +const { spawnPromisified } = require('../common'); +const tmpdir = require('../common/tmpdir'); +const assert = require('assert'); +const { writeFileSync, unlink } = require('fs'); +const { describe, after, it } = require('node:test'); + +tmpdir.refresh(); + +const fileImports = { + cjs: 'const assert = require("assert");', + mjs: 'import assert from "assert";', +}; + +const fileNames = []; + +for (const [ext, header] of Object.entries(fileImports)) { + const fileName = `test-file.${ext}`; + // Store the generated filesnames in an array + fileNames.push(`${tmpdir.path}/${fileName}`); + + writeFileSync(tmpdir.resolve(fileName), `${header}\nassert.ok(0 === 2);`); +} + +describe('ensure the assert.ok throwing similar error messages for esm and cjs files', () => { + const nodejsPath = `${process.execPath}`; + const errorsMessages = []; + + it('should return code 1 for each command', async () => { + for (const fileName of fileNames) { + const { stderr, code } = await spawnPromisified(nodejsPath, [fileName]); + assert.strictEqual(code, 1); + // For each error message, filter the lines which will starts with AssertionError + errorsMessages.push( + stderr.split('\n').find((s) => s.startsWith('AssertionError')) + ); + } + }); + + after(() => { + assert.strictEqual(errorsMessages.length, 2); + assert.deepStrictEqual(errorsMessages[0], errorsMessages[1]); + + for (const fileName of fileNames) { + unlink(fileName, () => {}); + } + + tmpdir.refresh(); + }); +}); diff --git a/test/parallel/test-assert-typedarray-deepequal.js b/test/parallel/test-assert-typedarray-deepequal.js index a31da2739af93e..aee5225ca1fe51 100644 --- a/test/parallel/test-assert-typedarray-deepequal.js +++ b/test/parallel/test-assert-typedarray-deepequal.js @@ -63,22 +63,22 @@ const notEqualArrayPairs = [ ], ]; -equalArrayPairs.forEach((arrayPair) => { +for (const arrayPair of equalArrayPairs) { // eslint-disable-next-line no-restricted-properties assert.deepEqual(arrayPair[0], arrayPair[1]); assert.deepStrictEqual(arrayPair[0], arrayPair[1]); -}); +} -looseEqualArrayPairs.forEach((arrayPair) => { +for (const arrayPair of looseEqualArrayPairs) { // eslint-disable-next-line no-restricted-properties assert.deepEqual(arrayPair[0], arrayPair[1]); assert.throws( makeBlock(assert.deepStrictEqual, arrayPair[0], arrayPair[1]), assert.AssertionError ); -}); +} -notEqualArrayPairs.forEach((arrayPair) => { +for (const arrayPair of notEqualArrayPairs) { assert.throws( // eslint-disable-next-line no-restricted-properties makeBlock(assert.deepEqual, arrayPair[0], arrayPair[1]), @@ -88,4 +88,4 @@ notEqualArrayPairs.forEach((arrayPair) => { makeBlock(assert.deepStrictEqual, arrayPair[0], arrayPair[1]), assert.AssertionError ); -}); +} diff --git a/test/parallel/test-async-wrap-constructor.js b/test/parallel/test-async-wrap-constructor.js index e89bc49df02333..853898aa0adf1a 100644 --- a/test/parallel/test-async-wrap-constructor.js +++ b/test/parallel/test-async-wrap-constructor.js @@ -6,15 +6,16 @@ require('../common'); const assert = require('assert'); const async_hooks = require('async_hooks'); -[0, 1, false, true, null, 'hello'].forEach((badArg) => { +const falsyValues = [0, 1, false, true, null, 'hello']; +for (const badArg of falsyValues) { const hookNames = ['init', 'before', 'after', 'destroy', 'promiseResolve']; - hookNames.forEach((field) => { + for (const hookName of hookNames) { assert.throws(() => { - async_hooks.createHook({ [field]: badArg }); + async_hooks.createHook({ [hookName]: badArg }); }, { code: 'ERR_ASYNC_CALLBACK', name: 'TypeError', - message: `hook.${field} must be a function` + message: `hook.${hookName} must be a function` }); - }); -}); + } +} diff --git a/test/parallel/test-blob.js b/test/parallel/test-blob.js index 04b0580202c171..330fd79c742d77 100644 --- a/test/parallel/test-blob.js +++ b/test/parallel/test-blob.js @@ -409,10 +409,10 @@ assert.throws(() => new Blob({}), { } (async () => { - assert.rejects(async () => Blob.prototype.arrayBuffer.call(), { + await assert.rejects(async () => Blob.prototype.arrayBuffer.call(), { code: 'ERR_INVALID_THIS', }); - assert.rejects(async () => Blob.prototype.text.call(), { + await assert.rejects(async () => Blob.prototype.text.call(), { code: 'ERR_INVALID_THIS', }); })().then(common.mustCall()); @@ -480,3 +480,13 @@ assert.throws(() => new Blob({}), { assert.ok(blob.slice(0, 1).constructor === Blob); assert.ok(blob.slice(0, 1) instanceof Blob); } + +(async () => { + const blob = new Blob(['hello']); + + assert.ok(structuredClone(blob).constructor === Blob); + assert.ok(structuredClone(blob) instanceof Blob); + assert.ok(structuredClone(blob).size === blob.size); + assert.ok(structuredClone(blob).size === blob.size); + assert.ok((await structuredClone(blob).text()) === (await blob.text())); +})().then(common.mustCall()); diff --git a/test/parallel/test-bootstrap-modules.js b/test/parallel/test-bootstrap-modules.js index 78db466a95b38e..d158e489196c39 100644 --- a/test/parallel/test-bootstrap-modules.js +++ b/test/parallel/test-bootstrap-modules.js @@ -1,16 +1,30 @@ -// Flags: --expose-internals 'use strict'; -// This list must be computed before we require any modules to +// This list must be computed before we require any builtins to // to eliminate the noise. -const actualModules = new Set(process.moduleLoadList.slice()); +const list = process.moduleLoadList.slice(); const common = require('../common'); const assert = require('assert'); +const { inspect } = require('util'); -const expectedModules = new Set([ +const preExecIndex = + list.findIndex((i) => i.includes('pre_execution')); +const actual = { + beforePreExec: new Set(list.slice(0, preExecIndex)), + atRunTime: new Set(list.slice(preExecIndex)), +}; + +// Currently, we don't add additional builtins to worker snapshots. +// So for worker snapshots we'll just concatenate the two. Once we +// add more builtins to worker snapshots, we should also distinguish +// the two stages for them. +const expected = {}; + +expected.beforePreExec = new Set([ 'Internal Binding builtins', 'Internal Binding encoding_binding', + 'Internal Binding modules', 'Internal Binding errors', 'Internal Binding util', 'NativeModule internal/errors', @@ -84,22 +98,25 @@ const expectedModules = new Set([ 'NativeModule internal/modules/package_json_reader', 'Internal Binding module_wrap', 'NativeModule internal/modules/cjs/loader', - 'NativeModule internal/vm/module', - 'NativeModule internal/modules/esm/utils', +]); + +expected.atRunTime = new Set([ 'Internal Binding wasm_web_api', 'Internal Binding worker', 'NativeModule internal/modules/run_main', 'NativeModule internal/net', 'NativeModule internal/dns/utils', 'NativeModule internal/process/pre_execution', + 'NativeModule internal/vm/module', + 'NativeModule internal/modules/esm/utils', ]); if (common.isMainThread) { [ 'NativeModule internal/idna', 'NativeModule url', - ].forEach(expectedModules.add.bind(expectedModules)); -} else { + ].forEach(expected.beforePreExec.add.bind(expected.beforePreExec)); +} else { // Worker. [ 'NativeModule diagnostics_channel', 'NativeModule internal/abort_controller', @@ -107,7 +124,6 @@ if (common.isMainThread) { 'NativeModule internal/perf/event_loop_utilization', 'NativeModule internal/process/worker_thread_only', 'NativeModule internal/streams/add-abort-signal', - 'NativeModule internal/streams/buffer_list', 'NativeModule internal/streams/compose', 'NativeModule internal/streams/destroy', 'NativeModule internal/streams/duplex', @@ -128,35 +144,97 @@ if (common.isMainThread) { 'NativeModule stream/promises', 'NativeModule string_decoder', 'NativeModule worker_threads', - ].forEach(expectedModules.add.bind(expectedModules)); + ].forEach(expected.atRunTime.add.bind(expected.atRunTime)); + // For now we'll concatenate the two stages for workers. We prefer + // atRunTime here because that's what currently happens for these. } if (common.isWindows) { // On Windows fs needs SideEffectFreeRegExpPrototypeExec which uses vm. - expectedModules.add('NativeModule vm'); + expected.atRunTime.add('NativeModule vm'); } if (common.hasIntl) { - expectedModules.add('Internal Binding icu'); + expected.beforePreExec.add('Internal Binding icu'); } if (process.features.inspector) { - expectedModules.add('Internal Binding inspector'); - expectedModules.add('NativeModule internal/inspector_async_hook'); - expectedModules.add('NativeModule internal/util/inspector'); + expected.beforePreExec.add('Internal Binding inspector'); + expected.beforePreExec.add('NativeModule internal/util/inspector'); + expected.atRunTime.add('NativeModule internal/inspector_async_hook'); } const difference = (setA, setB) => { return new Set([...setA].filter((x) => !setB.has(x))); }; -const missingModules = difference(expectedModules, actualModules); -const extraModules = difference(actualModules, expectedModules); -const printSet = (s) => { return `${[...s].sort().join(',\n ')}\n`; }; - -assert.deepStrictEqual(actualModules, expectedModules, - (missingModules.size > 0 ? - 'These modules were not loaded:\n ' + - printSet(missingModules) : '') + - (extraModules.size > 0 ? - 'These modules were unexpectedly loaded:\n ' + - printSet(extraModules) : '')); + +// Accumulate all the errors and print them at the end instead of throwing +// immediately which makes it harder to update the test. +const errorLogs = []; +function err(message) { + if (typeof message === 'string') { + errorLogs.push(message); + } else { + // Show the items in individual lines for easier copy-pasting. + errorLogs.push(inspect(message, { compact: false })); + } +} + +if (common.isMainThread) { + const missing = difference(expected.beforePreExec, actual.beforePreExec); + const extra = difference(actual.beforePreExec, expected.beforePreExec); + if (missing.size !== 0) { + err('These builtins are now no longer loaded before pre-execution.'); + err('If this is intentional, remove them from `expected.beforePreExec`.'); + err('\n--- These could be removed from expected.beforePreExec ---'); + err([...missing].sort()); + err(''); + } + if (extra.size !== 0) { + err('These builtins are now unexpectedly loaded before pre-execution.'); + err('If this is intentional, add them to `expected.beforePreExec`.'); + err('\n# Note: loading more builtins before pre-execution can lead to ' + + 'startup performance regression or invalid snapshots.'); + err('- Consider lazy loading builtins that are not used universally.'); + err('- Make sure that the builtins do not access environment dependent ' + + 'states e.g. command line arguments or environment variables ' + + 'during loading.'); + err('- When in doubt, ask @nodejs/startup.'); + err('\n--- These could be added to expected.beforePreExec ---'); + err([...extra].sort()); + err(''); + } +} + +if (!common.isMainThread) { + // For workers, just merge beforePreExec into atRunTime for now. + // When we start adding modules to the worker snapshot, this branch + // can be removed and we can just remove the common.isMainThread + // conditions. + expected.beforePreExec.forEach(expected.atRunTime.add.bind(expected.atRunTime)); + actual.beforePreExec.forEach(actual.atRunTime.add.bind(actual.atRunTime)); +} + +{ + const missing = difference(expected.atRunTime, actual.atRunTime); + const extra = difference(actual.atRunTime, expected.atRunTime); + if (missing.size !== 0) { + err('These builtins are now no longer loaded at run time.'); + err('If this is intentional, remove them from `expected.atRunTime`.'); + err('\n--- These could be removed from expected.atRunTime ---'); + err([...missing].sort()); + err(''); + } + if (extra.size !== 0) { + err('These builtins are now unexpectedly loaded at run time.'); + err('If this is intentional, add them to `expected.atRunTime`.'); + err('\n# Note: loading more builtins at run time can lead to ' + + 'startup performance regression.'); + err('- Consider lazy loading builtins that are not used universally.'); + err('\n--- These could be added to expected.atRunTime ---'); + err([...extra].sort()); + err(''); + } +} + +assert.strictEqual(errorLogs.length, 0, errorLogs.join('\n')); diff --git a/test/parallel/test-buffer-slice.js b/test/parallel/test-buffer-slice.js index 05cbfba4733829..52720bb87b3cea 100644 --- a/test/parallel/test-buffer-slice.js +++ b/test/parallel/test-buffer-slice.js @@ -71,9 +71,9 @@ for (let i = 0, s = buf.toString(); i < buf.length; ++i) { ); } -expectedSameBufs.forEach(([buf1, buf2]) => { +for (const [buf1, buf2] of expectedSameBufs) { assert.strictEqual(Buffer.compare(buf1, buf2), 0); -}); +} const utf16Buf = Buffer.from('0123456789', 'utf16le'); assert.deepStrictEqual(utf16Buf.slice(0, 6), Buffer.from('012', 'utf16le')); diff --git a/test/parallel/test-console-table.js b/test/parallel/test-console-table.js index fb1de08323e325..3dac53a5663bde 100644 --- a/test/parallel/test-console-table.js +++ b/test/parallel/test-console-table.js @@ -38,19 +38,19 @@ test([1, 2, 3], ` ┌─────────┬────────┐ │ (index) │ Values │ ├─────────┼────────┤ -│ 0 │ 1 │ -│ 1 │ 2 │ -│ 2 │ 3 │ +│ 0 │ 1 │ +│ 1 │ 2 │ +│ 2 │ 3 │ └─────────┴────────┘ `); test([Symbol(), 5, [10]], ` ┌─────────┬────┬──────────┐ -│ (index) │ 0 │ Values │ +│ (index) │ 0 │ Values │ ├─────────┼────┼──────────┤ -│ 0 │ │ Symbol() │ -│ 1 │ │ 5 │ -│ 2 │ 10 │ │ +│ 0 │ │ Symbol() │ +│ 1 │ │ 5 │ +│ 2 │ 10 │ │ └─────────┴────┴──────────┘ `); @@ -58,46 +58,46 @@ test([null, 5], ` ┌─────────┬────────┐ │ (index) │ Values │ ├─────────┼────────┤ -│ 0 │ null │ -│ 1 │ 5 │ +│ 0 │ null │ +│ 1 │ 5 │ └─────────┴────────┘ `); test([undefined, 5], ` ┌─────────┬───────────┐ -│ (index) │ Values │ +│ (index) │ Values │ ├─────────┼───────────┤ -│ 0 │ undefined │ -│ 1 │ 5 │ +│ 0 │ undefined │ +│ 1 │ 5 │ └─────────┴───────────┘ `); test({ a: 1, b: Symbol(), c: [10] }, ` ┌─────────┬────┬──────────┐ -│ (index) │ 0 │ Values │ +│ (index) │ 0 │ Values │ ├─────────┼────┼──────────┤ -│ a │ │ 1 │ -│ b │ │ Symbol() │ -│ c │ 10 │ │ +│ a │ │ 1 │ +│ b │ │ Symbol() │ +│ c │ 10 │ │ └─────────┴────┴──────────┘ `); test(new Map([ ['a', 1], [Symbol(), [2]] ]), ` ┌───────────────────┬──────────┬────────┐ -│ (iteration index) │ Key │ Values │ +│ (iteration index) │ Key │ Values │ ├───────────────────┼──────────┼────────┤ -│ 0 │ 'a' │ 1 │ -│ 1 │ Symbol() │ [ 2 ] │ +│ 0 │ 'a' │ 1 │ +│ 1 │ Symbol() │ [ 2 ] │ └───────────────────┴──────────┴────────┘ `); test(new Set([1, 2, Symbol()]), ` ┌───────────────────┬──────────┐ -│ (iteration index) │ Values │ +│ (iteration index) │ Values │ ├───────────────────┼──────────┤ -│ 0 │ 1 │ -│ 1 │ 2 │ -│ 2 │ Symbol() │ +│ 0 │ 1 │ +│ 1 │ 2 │ +│ 2 │ Symbol() │ └───────────────────┴──────────┘ `); @@ -105,8 +105,8 @@ test({ a: 1, b: 2 }, ['a'], ` ┌─────────┬───┐ │ (index) │ a │ ├─────────┼───┤ -│ a │ │ -│ b │ │ +│ a │ │ +│ b │ │ └─────────┴───┘ `); @@ -114,8 +114,8 @@ test([{ a: 1, b: 2 }, { a: 3, c: 4 }], ['a'], ` ┌─────────┬───┐ │ (index) │ a │ ├─────────┼───┤ -│ 0 │ 1 │ -│ 1 │ 3 │ +│ 0 │ 1 │ +│ 1 │ 3 │ └─────────┴───┘ `); @@ -123,9 +123,9 @@ test(new Map([[1, 1], [2, 2], [3, 3]]).entries(), ` ┌───────────────────┬─────┬────────┐ │ (iteration index) │ Key │ Values │ ├───────────────────┼─────┼────────┤ -│ 0 │ 1 │ 1 │ -│ 1 │ 2 │ 2 │ -│ 2 │ 3 │ 3 │ +│ 0 │ 1 │ 1 │ +│ 1 │ 2 │ 2 │ +│ 2 │ 3 │ 3 │ └───────────────────┴─────┴────────┘ `); @@ -133,9 +133,9 @@ test(new Map([[1, 1], [2, 2], [3, 3]]).values(), ` ┌───────────────────┬────────┐ │ (iteration index) │ Values │ ├───────────────────┼────────┤ -│ 0 │ 1 │ -│ 1 │ 2 │ -│ 2 │ 3 │ +│ 0 │ 1 │ +│ 1 │ 2 │ +│ 2 │ 3 │ └───────────────────┴────────┘ `); @@ -143,9 +143,9 @@ test(new Map([[1, 1], [2, 2], [3, 3]]).keys(), ` ┌───────────────────┬────────┐ │ (iteration index) │ Values │ ├───────────────────┼────────┤ -│ 0 │ 1 │ -│ 1 │ 2 │ -│ 2 │ 3 │ +│ 0 │ 1 │ +│ 1 │ 2 │ +│ 2 │ 3 │ └───────────────────┴────────┘ `); @@ -153,9 +153,9 @@ test(new Set([1, 2, 3]).values(), ` ┌───────────────────┬────────┐ │ (iteration index) │ Values │ ├───────────────────┼────────┤ -│ 0 │ 1 │ -│ 1 │ 2 │ -│ 2 │ 3 │ +│ 0 │ 1 │ +│ 1 │ 2 │ +│ 2 │ 3 │ └───────────────────┴────────┘ `); @@ -164,15 +164,15 @@ test({ a: { a: 1, b: 2, c: 3 } }, ` ┌─────────┬───┬───┬───┐ │ (index) │ a │ b │ c │ ├─────────┼───┼───┼───┤ -│ a │ 1 │ 2 │ 3 │ +│ a │ 1 │ 2 │ 3 │ └─────────┴───┴───┴───┘ `); test({ a: { a: { a: 1, b: 2, c: 3 } } }, ` ┌─────────┬──────────┐ -│ (index) │ a │ +│ (index) │ a │ ├─────────┼──────────┤ -│ a │ [Object] │ +│ a │ [Object] │ └─────────┴──────────┘ `); @@ -180,7 +180,7 @@ test({ a: [1, 2] }, ` ┌─────────┬───┬───┐ │ (index) │ 0 │ 1 │ ├─────────┼───┼───┤ -│ a │ 1 │ 2 │ +│ a │ 1 │ 2 │ └─────────┴───┴───┘ `); @@ -188,9 +188,9 @@ test({ a: [1, 2, 3, 4, 5], b: 5, c: { e: 5 } }, ` ┌─────────┬───┬───┬───┬───┬───┬───┬────────┐ │ (index) │ 0 │ 1 │ 2 │ 3 │ 4 │ e │ Values │ ├─────────┼───┼───┼───┼───┼───┼───┼────────┤ -│ a │ 1 │ 2 │ 3 │ 4 │ 5 │ │ │ -│ b │ │ │ │ │ │ │ 5 │ -│ c │ │ │ │ │ │ 5 │ │ +│ a │ 1 │ 2 │ 3 │ 4 │ 5 │ │ │ +│ b │ │ │ │ │ │ │ 5 │ +│ c │ │ │ │ │ │ 5 │ │ └─────────┴───┴───┴───┴───┴───┴───┴────────┘ `); @@ -198,9 +198,9 @@ test(new Uint8Array([1, 2, 3]), ` ┌─────────┬────────┐ │ (index) │ Values │ ├─────────┼────────┤ -│ 0 │ 1 │ -│ 1 │ 2 │ -│ 2 │ 3 │ +│ 0 │ 1 │ +│ 1 │ 2 │ +│ 2 │ 3 │ └─────────┴────────┘ `); @@ -208,9 +208,9 @@ test(Buffer.from([1, 2, 3]), ` ┌─────────┬────────┐ │ (index) │ Values │ ├─────────┼────────┤ -│ 0 │ 1 │ -│ 1 │ 2 │ -│ 2 │ 3 │ +│ 0 │ 1 │ +│ 1 │ 2 │ +│ 2 │ 3 │ └─────────┴────────┘ `); @@ -218,7 +218,7 @@ test({ a: undefined }, ['x'], ` ┌─────────┬───┐ │ (index) │ x │ ├─────────┼───┤ -│ a │ │ +│ a │ │ └─────────┴───┘ `); @@ -238,23 +238,23 @@ test(new Map(), ` test([{ a: 1, b: 'Y' }, { a: 'Z', b: 2 }], ` ┌─────────┬─────┬─────┐ -│ (index) │ a │ b │ +│ (index) │ a │ b │ ├─────────┼─────┼─────┤ -│ 0 │ 1 │ 'Y' │ -│ 1 │ 'Z' │ 2 │ +│ 0 │ 1 │ 'Y' │ +│ 1 │ 'Z' │ 2 │ └─────────┴─────┴─────┘ `); { const line = '─'.repeat(79); - const header = `${' '.repeat(37)}name${' '.repeat(40)}`; + const header = `name${' '.repeat(77)}`; const name = 'very long long long long long long long long long long long ' + 'long long long long'; test([{ name }], ` ┌─────────┬──${line}──┐ -│ (index) │ ${header}│ +│ (index) │ ${header} │ ├─────────┼──${line}──┤ -│ 0 │ '${name}' │ +│ 0 │ '${name}' │ └─────────┴──${line}──┘ `); } @@ -263,8 +263,8 @@ test({ foo: '¥', bar: '¥' }, ` ┌─────────┬────────┐ │ (index) │ Values │ ├─────────┼────────┤ -│ foo │ '¥' │ -│ bar │ '¥' │ +│ foo │ '¥' │ +│ bar │ '¥' │ └─────────┴────────┘ `); @@ -272,8 +272,8 @@ test({ foo: '你好', bar: 'hello' }, ` ┌─────────┬─────────┐ │ (index) │ Values │ ├─────────┼─────────┤ -│ foo │ '你好' │ -│ bar │ 'hello' │ +│ foo │ '你好' │ +│ bar │ 'hello' │ └─────────┴─────────┘ `); @@ -285,8 +285,8 @@ test([{ foo: 10 }, { foo: 20 }], ['__proto__'], ` ┌─────────┬───────────┐ │ (index) │ __proto__ │ ├─────────┼───────────┤ -│ 0 │ │ -│ 1 │ │ +│ 0 │ │ +│ 1 │ │ └─────────┴───────────┘ `); assert.strictEqual('0' in Object.prototype, false); diff --git a/test/parallel/test-crypto-authenticated.js b/test/parallel/test-crypto-authenticated.js index 6178445adbc634..590eb4278fc13e 100644 --- a/test/parallel/test-crypto-authenticated.js +++ b/test/parallel/test-crypto-authenticated.js @@ -47,39 +47,6 @@ const errMessages = { const ciphers = crypto.getCiphers(); -const expectedWarnings = common.hasFipsCrypto ? - [] : [ - ['Use Cipheriv for counter mode of aes-192-gcm'], - ['Use Cipheriv for counter mode of aes-192-ccm'], - ['Use Cipheriv for counter mode of aes-192-ccm'], - ['Use Cipheriv for counter mode of aes-128-ccm'], - ['Use Cipheriv for counter mode of aes-128-ccm'], - ['Use Cipheriv for counter mode of aes-128-ccm'], - ['Use Cipheriv for counter mode of aes-256-ccm'], - ['Use Cipheriv for counter mode of aes-256-ccm'], - ['Use Cipheriv for counter mode of aes-256-ccm'], - ['Use Cipheriv for counter mode of aes-256-ccm'], - ['Use Cipheriv for counter mode of aes-256-ccm'], - ['Use Cipheriv for counter mode of aes-256-ccm'], - ['Use Cipheriv for counter mode of aes-256-ccm'], - ['Use Cipheriv for counter mode of aes-256-ccm'], - ['Use Cipheriv for counter mode of aes-256-ccm'], - ['Use Cipheriv for counter mode of aes-256-ccm'], - ['Use Cipheriv for counter mode of aes-256-ccm'], - ['Use Cipheriv for counter mode of aes-256-ccm'], - ['Use Cipheriv for counter mode of aes-256-ccm'], - ['Use Cipheriv for counter mode of aes-128-ccm'], - ]; - -const expectedDeprecationWarnings = [ - ['crypto.createCipher is deprecated.', 'DEP0106'], -]; - -common.expectWarning({ - Warning: expectedWarnings, - DeprecationWarning: expectedDeprecationWarnings -}); - for (const test of TEST_CASES) { if (!ciphers.includes(test.algo)) { common.printSkipMessage(`unsupported ${test.algo} test`); @@ -157,45 +124,6 @@ for (const test of TEST_CASES) { } } - if (test.password) { - if (common.hasFipsCrypto) { - assert.throws(() => { crypto.createCipher(test.algo, test.password); }, - errMessages.FIPS); - } else { - const encrypt = crypto.createCipher(test.algo, test.password, options); - if (test.aad) - encrypt.setAAD(Buffer.from(test.aad, 'hex'), aadOptions); - let hex = encrypt.update(test.plain, 'ascii', 'hex'); - hex += encrypt.final('hex'); - const auth_tag = encrypt.getAuthTag(); - // Only test basic encryption run if output is marked as tampered. - if (!test.tampered) { - assert.strictEqual(hex, test.ct); - assert.strictEqual(auth_tag.toString('hex'), test.tag); - } - } - } - - if (test.password) { - if (common.hasFipsCrypto) { - assert.throws(() => { crypto.createDecipher(test.algo, test.password); }, - errMessages.FIPS); - } else { - const decrypt = crypto.createDecipher(test.algo, test.password, options); - decrypt.setAuthTag(Buffer.from(test.tag, 'hex')); - if (test.aad) - decrypt.setAAD(Buffer.from(test.aad, 'hex'), aadOptions); - let msg = decrypt.update(test.ct, 'hex', 'ascii'); - if (!test.tampered) { - msg += decrypt.final('ascii'); - assert.strictEqual(msg, test.plain); - } else { - // Assert that final throws if input data could not be verified! - assert.throws(function() { decrypt.final('ascii'); }, errMessages.auth); - } - } - } - { // Trying to get tag before inputting all data: const encrypt = crypto.createCipheriv(test.algo, @@ -344,26 +272,6 @@ for (const test of TEST_CASES) { message: "The property 'options.authTagLength' is invalid. " + `Received ${inspect(authTagLength)}` }); - - if (!common.hasFipsCrypto) { - assert.throws(() => { - crypto.createCipher('aes-256-ccm', 'bad password', { authTagLength }); - }, { - name: 'TypeError', - code: 'ERR_INVALID_ARG_VALUE', - message: "The property 'options.authTagLength' is invalid. " + - `Received ${inspect(authTagLength)}` - }); - - assert.throws(() => { - crypto.createDecipher('aes-256-ccm', 'bad password', { authTagLength }); - }, { - name: 'TypeError', - code: 'ERR_INVALID_ARG_VALUE', - message: "The property 'options.authTagLength' is invalid. " + - `Received ${inspect(authTagLength)}` - }); - } } // The following values will not be caught by the JS layer and thus will not @@ -387,14 +295,6 @@ for (const test of TEST_CASES) { authTagLength }); }, errMessages.authTagLength); - - assert.throws(() => { - crypto.createCipher('aes-256-ccm', 'bad password', { authTagLength }); - }, errMessages.authTagLength); - - assert.throws(() => { - crypto.createDecipher('aes-256-ccm', 'bad password', { authTagLength }); - }, errMessages.authTagLength); } } } @@ -420,18 +320,6 @@ for (const test of TEST_CASES) { }, { message: `authTagLength required for aes-256-${mode}` }); - - assert.throws(() => { - crypto.createCipher(`aes-256-${mode}`, 'very bad password'); - }, { - message: `authTagLength required for aes-256-${mode}` - }); - - assert.throws(() => { - crypto.createDecipher(`aes-256-${mode}`, 'very bad password'); - }, { - message: `authTagLength required for aes-256-${mode}` - }); } } } @@ -670,7 +558,6 @@ for (const test of TEST_CASES) { const opts = { authTagLength: 10 }; for (const cipher of [ - crypto.createCipher(algo, 'foo', opts), crypto.createCipheriv(algo, key, iv, opts), ]) { assert.throws(() => { diff --git a/test/parallel/test-crypto-cipher-decipher.js b/test/parallel/test-crypto-cipher-decipher.js deleted file mode 100644 index 35514afbea9256..00000000000000 --- a/test/parallel/test-crypto-cipher-decipher.js +++ /dev/null @@ -1,283 +0,0 @@ -'use strict'; -const common = require('../common'); - -if (!common.hasCrypto) - common.skip('missing crypto'); - -if (common.hasFipsCrypto) - common.skip('not supported in FIPS mode'); - -const crypto = require('crypto'); -const assert = require('assert'); - -common.expectWarning({ - Warning: [ - ['Use Cipheriv for counter mode of aes-256-gcm'], - ], - DeprecationWarning: [ - ['crypto.createCipher is deprecated.', 'DEP0106'], - ] -}); - -function testCipher1(key) { - // Test encryption and decryption - const plaintext = 'Keep this a secret? No! Tell everyone about node.js!'; - const cipher = crypto.createCipher('aes192', key); - - // Encrypt plaintext which is in utf8 format - // to a ciphertext which will be in hex - let ciph = cipher.update(plaintext, 'utf8', 'hex'); - // Only use binary or hex, not base64. - ciph += cipher.final('hex'); - - const decipher = crypto.createDecipher('aes192', key); - let txt = decipher.update(ciph, 'hex', 'utf8'); - txt += decipher.final('utf8'); - - assert.strictEqual(txt, plaintext); - - // Streaming cipher interface - // NB: In real life, it's not guaranteed that you can get all of it - // in a single read() like this. But in this case, we know it's - // quite small, so there's no harm. - const cStream = crypto.createCipher('aes192', key); - cStream.end(plaintext); - ciph = cStream.read(); - - const dStream = crypto.createDecipher('aes192', key); - dStream.end(ciph); - txt = dStream.read().toString('utf8'); - - assert.strictEqual(txt, plaintext); -} - - -function testCipher2(key) { - // Encryption and decryption with Base64. - // Reported in https://github.com/joyent/node/issues/738 - const plaintext = - '32|RmVZZkFUVmpRRkp0TmJaUm56ZU9qcnJkaXNNWVNpTTU*|iXmckfRWZBGWWELw' + - 'eCBsThSsfUHLeRe0KCsK8ooHgxie0zOINpXxfZi/oNG7uq9JWFVCk70gfzQH8ZUJ' + - 'jAfaFg**'; - const cipher = crypto.createCipher('aes256', key); - - // Encrypt plaintext which is in utf8 format to a ciphertext which will be in - // Base64. - let ciph = cipher.update(plaintext, 'utf8', 'base64'); - ciph += cipher.final('base64'); - - const decipher = crypto.createDecipher('aes256', key); - let txt = decipher.update(ciph, 'base64', 'utf8'); - txt += decipher.final('utf8'); - - assert.strictEqual(txt, plaintext); -} - -testCipher1('MySecretKey123'); -testCipher1(Buffer.from('MySecretKey123')); - -testCipher2('0123456789abcdef'); -testCipher2(Buffer.from('0123456789abcdef')); - -{ - const Cipher = crypto.Cipher; - const instance = crypto.Cipher('aes-256-cbc', 'secret'); - assert(instance instanceof Cipher, 'Cipher is expected to return a new ' + - 'instance when called without `new`'); - - assert.throws( - () => crypto.createCipher(null), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "cipher" argument must be of type string. ' + - 'Received null' - }); - - assert.throws( - () => crypto.createCipher('aes-256-cbc', null), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - }); - - assert.throws( - () => crypto.createCipher('aes-256-cbc', 'secret').update(null), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - }); - - assert.throws( - () => crypto.createCipher('aes-256-cbc', 'secret').setAAD(null), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - }); -} - -{ - const Decipher = crypto.Decipher; - const instance = crypto.Decipher('aes-256-cbc', 'secret'); - assert(instance instanceof Decipher, 'Decipher is expected to return a new ' + - 'instance when called without `new`'); - - assert.throws( - () => crypto.createDecipher(null), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "cipher" argument must be of type string. ' + - 'Received null' - }); - - assert.throws( - () => crypto.createDecipher('aes-256-cbc', 'secret').setAuthTag(null), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - }); - - assert.throws( - () => crypto.createDecipher('aes-256-cbc', null), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - }); -} - -// Base64 padding regression test, see -// https://github.com/nodejs/node-v0.x-archive/issues/4837. -{ - const c = crypto.createCipher('aes-256-cbc', 'secret'); - const s = c.update('test', 'utf8', 'base64') + c.final('base64'); - assert.strictEqual(s, '375oxUQCIocvxmC5At+rvA=='); -} - -// Calling Cipher.final() or Decipher.final() twice should error but -// not assert. See https://github.com/nodejs/node-v0.x-archive/issues/4886. -{ - const c = crypto.createCipher('aes-256-cbc', 'secret'); - try { c.final('xxx'); } catch { /* Ignore. */ } - try { c.final('xxx'); } catch { /* Ignore. */ } - try { c.final('xxx'); } catch { /* Ignore. */ } - const d = crypto.createDecipher('aes-256-cbc', 'secret'); - try { d.final('xxx'); } catch { /* Ignore. */ } - try { d.final('xxx'); } catch { /* Ignore. */ } - try { d.final('xxx'); } catch { /* Ignore. */ } -} - -// Regression test for https://github.com/nodejs/node-v0.x-archive/issues/5482: -// string to Cipher#update() should not assert. -{ - const c = crypto.createCipher('aes192', '0123456789abcdef'); - c.update('update'); - c.final(); -} - -// https://github.com/nodejs/node-v0.x-archive/issues/5655 regression tests, -// 'utf-8' and 'utf8' are identical. -{ - let c = crypto.createCipher('aes192', '0123456789abcdef'); - c.update('update', ''); // Defaults to "utf8". - c.final('utf-8'); // Should not throw. - - c = crypto.createCipher('aes192', '0123456789abcdef'); - c.update('update', 'utf8'); - c.final('utf-8'); // Should not throw. - - c = crypto.createCipher('aes192', '0123456789abcdef'); - c.update('update', 'utf-8'); - c.final('utf8'); // Should not throw. -} - -// Regression tests for https://github.com/nodejs/node/issues/8236. -{ - const key = '0123456789abcdef'; - const plaintext = 'Top secret!!!'; - const c = crypto.createCipher('aes192', key); - let ciph = c.update(plaintext, 'utf16le', 'base64'); - ciph += c.final('base64'); - - let decipher = crypto.createDecipher('aes192', key); - - let txt; - txt = decipher.update(ciph, 'base64', 'ucs2'); - txt += decipher.final('ucs2'); - assert.strictEqual(txt, plaintext); - - decipher = crypto.createDecipher('aes192', key); - txt = decipher.update(ciph, 'base64', 'ucs-2'); - txt += decipher.final('ucs-2'); - assert.strictEqual(txt, plaintext); - - decipher = crypto.createDecipher('aes192', key); - txt = decipher.update(ciph, 'base64', 'utf-16le'); - txt += decipher.final('utf-16le'); - assert.strictEqual(txt, plaintext); -} - -// setAutoPadding/setAuthTag/setAAD should return `this` -{ - const key = '0123456789'; - const tagbuf = Buffer.from('auth_tag'); - const aadbuf = Buffer.from('aadbuf'); - const decipher = crypto.createDecipher('aes-256-gcm', key); - assert.strictEqual(decipher.setAutoPadding(), decipher); - assert.strictEqual(decipher.setAuthTag(tagbuf), decipher); - assert.strictEqual(decipher.setAAD(aadbuf), decipher); -} - -// Error throwing in setAAD/setAuthTag/getAuthTag/setAutoPadding -{ - const key = '0123456789'; - const aadbuf = Buffer.from('aadbuf'); - const data = Buffer.from('test-crypto-cipher-decipher'); - - const cipher = crypto.createCipher('aes-256-gcm', key); - cipher.setAAD(aadbuf); - cipher.setAutoPadding(); - - assert.throws( - () => cipher.getAuthTag(), - { - code: 'ERR_CRYPTO_INVALID_STATE', - name: 'Error', - message: 'Invalid state for operation getAuthTag' - } - ); - - const encrypted = Buffer.concat([cipher.update(data), cipher.final()]); - - const decipher = crypto.createDecipher('aes-256-gcm', key); - decipher.setAAD(aadbuf); - decipher.setAuthTag(cipher.getAuthTag()); - decipher.setAutoPadding(); - decipher.update(encrypted); - decipher.final(); - - assert.throws( - () => decipher.setAAD(aadbuf), - { - code: 'ERR_CRYPTO_INVALID_STATE', - name: 'Error', - message: 'Invalid state for operation setAAD' - }); - - assert.throws( - () => decipher.setAuthTag(cipher.getAuthTag()), - { - code: 'ERR_CRYPTO_INVALID_STATE', - name: 'Error', - message: 'Invalid state for operation setAuthTag' - }); - - assert.throws( - () => decipher.setAutoPadding(), - { - code: 'ERR_CRYPTO_INVALID_STATE', - name: 'Error', - message: 'Invalid state for operation setAutoPadding' - } - ); -} diff --git a/test/parallel/test-crypto-classes.js b/test/parallel/test-crypto-classes.js index dd073274aef765..f736921476a1c5 100644 --- a/test/parallel/test-crypto-classes.js +++ b/test/parallel/test-crypto-classes.js @@ -22,8 +22,6 @@ const TEST_CASES = { }; if (!common.hasFipsCrypto) { - TEST_CASES.Cipher = ['aes192', 'secret']; - TEST_CASES.Decipher = ['aes192', 'secret']; TEST_CASES.DiffieHellman = [common.hasOpenSSL3 ? 1024 : 256]; } diff --git a/test/parallel/test-crypto-dh.js b/test/parallel/test-crypto-dh.js index abbe1abe7e53d7..3b738b7f47ec59 100644 --- a/test/parallel/test-crypto-dh.js +++ b/test/parallel/test-crypto-dh.js @@ -85,11 +85,15 @@ const crypto = require('crypto'); }, wrongBlockLength); } - assert.throws(() => { - dh3.computeSecret(''); - }, { message: common.hasOpenSSL3 ? - 'error:02800080:Diffie-Hellman routines::invalid secret' : - 'Supplied key is too small' }); + { + const v = crypto.constants.OPENSSL_VERSION_NUMBER; + const hasOpenSSL3WithNewErrorMessage = (v >= 0x300000c0 && v <= 0x30100000) || (v >= 0x30100040 && v <= 0x30200000); + assert.throws(() => { + dh3.computeSecret(''); + }, { message: common.hasOpenSSL3 && !hasOpenSSL3WithNewErrorMessage ? + 'error:02800080:Diffie-Hellman routines::invalid secret' : + 'Supplied key is too small' }); + } } // Through a fluke of history, g=0 defaults to DH_GENERATOR (2). diff --git a/test/parallel/test-crypto-getcipherinfo.js b/test/parallel/test-crypto-getcipherinfo.js index 98d2a52eceac4b..64b79fc36ccf4d 100644 --- a/test/parallel/test-crypto-getcipherinfo.js +++ b/test/parallel/test-crypto-getcipherinfo.js @@ -16,12 +16,12 @@ const ciphers = getCiphers(); assert.strictEqual(getCipherInfo(-1), undefined); assert.strictEqual(getCipherInfo('cipher that does not exist'), undefined); -ciphers.forEach((cipher) => { +for (const cipher of ciphers) { const info = getCipherInfo(cipher); assert(info); const info2 = getCipherInfo(info.nid); assert.deepStrictEqual(info, info2); -}); +} const info = getCipherInfo('aes-128-cbc'); assert.strictEqual(info.name, 'aes-128-cbc'); diff --git a/test/parallel/test-crypto-webcrypto-aes-decrypt-tag-too-small.js b/test/parallel/test-crypto-webcrypto-aes-decrypt-tag-too-small.js index 555876b3994e64..589a2f91a17cc2 100644 --- a/test/parallel/test-crypto-webcrypto-aes-decrypt-tag-too-small.js +++ b/test/parallel/test-crypto-webcrypto-aes-decrypt-tag-too-small.js @@ -16,7 +16,7 @@ subtle.importKey( }, false, [ 'encrypt', 'decrypt' ]) - .then((k) => { + .then((k) => assert.rejects(() => { return subtle.decrypt({ name: 'AES-GCM', @@ -25,5 +25,5 @@ subtle.importKey( }, { name: 'OperationError', message: /The provided data is too small/, - }); - }); + }) + ).then(common.mustCall()); diff --git a/test/parallel/test-crypto.js b/test/parallel/test-crypto.js index 8350401ba93707..4271121881379b 100644 --- a/test/parallel/test-crypto.js +++ b/test/parallel/test-crypto.js @@ -25,12 +25,6 @@ const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); -common.expectWarning({ - DeprecationWarning: [ - ['crypto.createCipher is deprecated.', 'DEP0106'], - ] -}); - const assert = require('assert'); const crypto = require('crypto'); const tls = require('tls'); @@ -184,24 +178,6 @@ const encodingError = { " Received 'hex'", }; -// Regression tests for https://github.com/nodejs/node-v0.x-archive/pull/5725: -// hex input that's not a power of two should throw, not assert in C++ land. -['createCipher', 'createDecipher'].forEach((funcName) => { - assert.throws( - () => crypto[funcName]('aes192', 'test').update('0', 'hex'), - (error) => { - assert.ok(!('opensslErrorStack' in error)); - if (common.hasFipsCrypto) { - return error instanceof Error && - error.name === 'Error' && - /^Error: not supported in FIPS mode$/.test(error); - } - assert.throws(() => { throw error; }, encodingError); - return true; - } - ); -}); - assert.throws( () => crypto.createHash('sha1').update('0', 'hex'), (error) => { diff --git a/test/parallel/test-dgram-socket-buffer-size.js b/test/parallel/test-dgram-socket-buffer-size.js index c03b8bf48b0221..fcc492a958215c 100644 --- a/test/parallel/test-dgram-socket-buffer-size.js +++ b/test/parallel/test-dgram-socket-buffer-size.js @@ -93,15 +93,14 @@ function getExpectedError(type) { const socket = dgram.createSocket('udp4'); socket.bind(common.mustCall(() => { - badBufferSizes.forEach((badBufferSize) => { + for (const badBufferSize of badBufferSizes) { assert.throws(() => { socket.setRecvBufferSize(badBufferSize); }, errorObj); - assert.throws(() => { socket.setSendBufferSize(badBufferSize); }, errorObj); - }); + } socket.close(); })); } diff --git a/test/parallel/test-diagnostics-channel-memory-leak.js b/test/parallel/test-diagnostics-channel-memory-leak.js index 9e6364d168562f..fe50158070554d 100644 --- a/test/parallel/test-diagnostics-channel-memory-leak.js +++ b/test/parallel/test-diagnostics-channel-memory-leak.js @@ -1,24 +1,22 @@ -// Flags: --expose-gc +// Flags: --expose-internals --max-old-space-size=16 'use strict'; // This test ensures that diagnostic channel references aren't leaked. -require('../common'); -const { ok } = require('assert'); +const common = require('../common'); -const { subscribe, unsubscribe } = require('diagnostics_channel'); +const { subscribe, unsubscribe, Channel } = require('diagnostics_channel'); +const { checkIfCollectableByCounting } = require('../common/gc'); function noop() {} -const heapUsedBefore = process.memoryUsage().heapUsed; - -for (let i = 0; i < 1000; i++) { - subscribe(String(i), noop); - unsubscribe(String(i), noop); -} - -global.gc(); - -const heapUsedAfter = process.memoryUsage().heapUsed; - -ok(heapUsedBefore >= heapUsedAfter); +const outer = 64; +const inner = 256; +checkIfCollectableByCounting((i) => { + for (let j = 0; j < inner; j++) { + const key = String(i * inner + j); + subscribe(key, noop); + unsubscribe(key, noop); + } + return inner; +}, Channel, outer).then(common.mustCall()); diff --git a/test/parallel/test-diagnostics-channel-tracing-channel-args-types.js b/test/parallel/test-diagnostics-channel-tracing-channel-args-types.js new file mode 100644 index 00000000000000..5ae55badc4ac8e --- /dev/null +++ b/test/parallel/test-diagnostics-channel-tracing-channel-args-types.js @@ -0,0 +1,39 @@ +'use strict'; + +require('../common'); +const dc = require('diagnostics_channel'); +const assert = require('assert'); + +let channel; + +// tracingChannel creating with name +channel = dc.tracingChannel('test'); +assert.strictEqual(channel.start.name, 'tracing:test:start'); + +// tracingChannel creating with channels +channel = dc.tracingChannel({ + start: dc.channel('tracing:test:start'), + end: dc.channel('tracing:test:end'), + asyncStart: dc.channel('tracing:test:asyncStart'), + asyncEnd: dc.channel('tracing:test:asyncEnd'), + error: dc.channel('tracing:test:error'), +}); + +// tracingChannel creating without nameOrChannels must throw TypeError +assert.throws(() => (channel = dc.tracingChannel(0)), { + code: 'ERR_INVALID_ARG_TYPE', + name: 'TypeError', + message: + /The "nameOrChannels" argument must be of type string or an instance of Channel or Object/, +}); + +// tracingChannel creating without instance of Channel must throw error +assert.throws(() => (channel = dc.tracingChannel({ start: '' })), { + code: 'ERR_INVALID_ARG_TYPE', + message: /The "nameOrChannels\.start" property must be an instance of Channel/, +}); + +// tracingChannel creating with empty nameOrChannels must throw error +assert.throws(() => (channel = dc.tracingChannel({})), { + message: /Cannot convert undefined or null to object/, +}); diff --git a/test/parallel/test-directory-import.js b/test/parallel/test-directory-import.js index 83fd01f6a0f214..36ba5a9ac94d5f 100644 --- a/test/parallel/test-directory-import.js +++ b/test/parallel/test-directory-import.js @@ -1,14 +1,14 @@ 'use strict'; -require('../common'); +const common = require('../common'); const fixtures = require('../common/fixtures'); const assert = require('assert'); const { pathToFileURL } = require('url'); { - assert.rejects(import('./'), /ERR_UNSUPPORTED_DIR_IMPORT/); + assert.rejects(import('./'), /ERR_UNSUPPORTED_DIR_IMPORT/).then(common.mustCall()); assert.rejects( import(pathToFileURL(fixtures.path('packages', 'main'))), /Did you mean/, - ); + ).then(common.mustCall()); } diff --git a/test/parallel/test-dns-lookup.js b/test/parallel/test-dns-lookup.js index a847a91d655196..2ee4ff2929624f 100644 --- a/test/parallel/test-dns-lookup.js +++ b/test/parallel/test-dns-lookup.js @@ -205,4 +205,4 @@ tickValue = 1; // Should fail due to stub. assert.rejects(dnsPromises.lookup('example.com'), - { code: 'ENOMEM', hostname: 'example.com' }); + { code: 'ENOMEM', hostname: 'example.com' }).then(common.mustCall()); diff --git a/test/parallel/test-dns-lookupService-promises.js b/test/parallel/test-dns-lookupService-promises.js index 4052139c922389..7b8eefb068af50 100644 --- a/test/parallel/test-dns-lookupService-promises.js +++ b/test/parallel/test-dns-lookupService-promises.js @@ -16,4 +16,4 @@ dnsPromises.lookupService('127.0.0.1', 22).then(common.mustCall((result) => { assert.rejects( () => dnsPromises.lookupService('192.0.2.1', 22), { code: /^(?:ENOTFOUND|EAI_AGAIN)$/ } -); +).then(common.mustCall()); diff --git a/test/parallel/test-dns-lookupService.js b/test/parallel/test-dns-lookupService.js index dc04893c28f9fd..aa29b1978f8a86 100644 --- a/test/parallel/test-dns-lookupService.js +++ b/test/parallel/test-dns-lookupService.js @@ -32,4 +32,4 @@ assert.rejects( message: 'getnameinfo ENOENT 127.0.0.1', syscall: 'getnameinfo' } -); +).then(common.mustCall()); diff --git a/test/parallel/test-dns-memory-error.js b/test/parallel/test-dns-memory-error.js index 29907fb1dbfd5e..c95715f80a735c 100644 --- a/test/parallel/test-dns-memory-error.js +++ b/test/parallel/test-dns-memory-error.js @@ -11,6 +11,8 @@ const errors = require('internal/errors'); const { internalBinding } = require('internal/test/binding'); const { UV_EAI_MEMORY } = internalBinding('uv'); -const memoryError = errors.dnsException(UV_EAI_MEMORY, 'fhqwhgads'); +const memoryError = new errors.DNSException(UV_EAI_MEMORY, 'fhqwhgads'); assert.strictEqual(memoryError.code, 'EAI_MEMORY'); +const stack = memoryError.stack.split('\n'); +assert.match(stack[1], /^ {4}at Object/); diff --git a/test/parallel/test-dns-resolve-promises.js b/test/parallel/test-dns-resolve-promises.js index 783ed2a709edb6..298d9f667891a5 100644 --- a/test/parallel/test-dns-resolve-promises.js +++ b/test/parallel/test-dns-resolve-promises.js @@ -1,6 +1,6 @@ // Flags: --expose-internals 'use strict'; -require('../common'); +const common = require('../common'); const assert = require('assert'); const { internalBinding } = require('internal/test/binding'); const cares = internalBinding('cares_wrap'); @@ -17,4 +17,4 @@ assert.rejects( syscall: 'queryA', hostname: 'example.org' } -); +).then(common.mustCall()); diff --git a/test/parallel/test-dns-resolveany-bad-ancount.js b/test/parallel/test-dns-resolveany-bad-ancount.js index 71fcbe03cd58f1..5cea388ad6a9f0 100644 --- a/test/parallel/test-dns-resolveany-bad-ancount.js +++ b/test/parallel/test-dns-resolveany-bad-ancount.js @@ -30,13 +30,14 @@ server.bind(0, common.mustCall(async () => { dnsPromises.resolveAny('example.org') .then(common.mustNotCall()) .catch(common.expectsError({ - code: 'EBADRESP', + // May return EBADRESP or ETIMEOUT + code: /^(?:EBADRESP|ETIMEOUT)$/, syscall: 'queryAny', hostname: 'example.org' })); dns.resolveAny('example.org', common.mustCall((err) => { - assert.strictEqual(err.code, 'EBADRESP'); + assert.notStrictEqual(err.code, 'SUCCESS'); assert.strictEqual(err.syscall, 'queryAny'); assert.strictEqual(err.hostname, 'example.org'); const descriptor = Object.getOwnPropertyDescriptor(err, 'message'); diff --git a/test/parallel/test-dns-resolveany.js b/test/parallel/test-dns-resolveany.js index 0bbfe8f9f18432..f64dbfc93e2da8 100644 --- a/test/parallel/test-dns-resolveany.js +++ b/test/parallel/test-dns-resolveany.js @@ -11,7 +11,7 @@ const answers = [ { type: 'AAAA', address: '::42', ttl: 123 }, { type: 'MX', priority: 42, exchange: 'foobar.com', ttl: 124 }, { type: 'NS', value: 'foobar.org', ttl: 457 }, - { type: 'TXT', entries: [ 'v=spf1 ~all', 'xyz\0foo' ] }, + { type: 'TXT', entries: [ 'v=spf1 ~all xyz\0foo' ] }, { type: 'PTR', value: 'baz.org', ttl: 987 }, { type: 'SOA', diff --git a/test/parallel/test-dotenv-edge-cases.js b/test/parallel/test-dotenv-edge-cases.js index ae2b3dc2a35f35..9735a89618172c 100644 --- a/test/parallel/test-dotenv-edge-cases.js +++ b/test/parallel/test-dotenv-edge-cases.js @@ -34,8 +34,8 @@ describe('.env supports edge cases', () => { [ '--env-file=.env', '--eval', code ], { cwd: __dirname }, ); - assert.strictEqual(child.stderr, ''); - assert.strictEqual(child.code, 0); + assert.notStrictEqual(child.stderr.toString(), ''); + assert.strictEqual(child.code, 9); }); it('should not override existing environment variables but introduce new vars', async () => { diff --git a/test/parallel/test-dotenv-node-options.js b/test/parallel/test-dotenv-node-options.js index d35d1eeaeb33db..8c53616fd17d23 100644 --- a/test/parallel/test-dotenv-node-options.js +++ b/test/parallel/test-dotenv-node-options.js @@ -62,17 +62,4 @@ describe('.env supports NODE_OPTIONS', () => { assert.strictEqual(child.code, 0); }); - it('should update UV_THREADPOOL_SIZE', async () => { - const code = ` - require('assert').strictEqual(process.env.UV_THREADPOOL_SIZE, '5') - `.trim(); - const child = await common.spawnPromisified( - process.execPath, - [ `--env-file=${relativePath}`, '--eval', code ], - { cwd: __dirname }, - ); - assert.strictEqual(child.stderr, ''); - assert.strictEqual(child.code, 0); - }); - }); diff --git a/test/parallel/test-error-aggregateTwoErrors.js b/test/parallel/test-error-aggregateTwoErrors.js index 89224efd6b161f..2332437d990164 100644 --- a/test/parallel/test-error-aggregateTwoErrors.js +++ b/test/parallel/test-error-aggregateTwoErrors.js @@ -57,3 +57,15 @@ assert.strictEqual(aggregateTwoErrors(null, null), null); assert.strictEqual(chainedError.code, err0.code); assert.deepStrictEqual(chainedError.errors, [err0, err1]); } + +{ + const err0 = new Error('original'); + const err1 = new Error('second error'); + + err0.code = 'ERR0'; + err1.code = 'ERR1'; + + const chainedError = aggregateTwoErrors(null, aggregateTwoErrors(err1, err0)); + const stack = chainedError.stack.split('\n'); + assert.match(stack[1], /^ {4}at Object/); +} diff --git a/test/parallel/test-error-prepare-stack-trace.js b/test/parallel/test-error-prepare-stack-trace.js index 28ecdd25f50135..0d375a6db38675 100644 --- a/test/parallel/test-error-prepare-stack-trace.js +++ b/test/parallel/test-error-prepare-stack-trace.js @@ -1,10 +1,13 @@ -// Flags: --enable-source-maps 'use strict'; require('../common'); +const { spawnSyncAndExitWithoutError } = require('../common/child_process'); const assert = require('assert'); -// Error.prepareStackTrace() can be overridden with source maps enabled. +// Verify that the default Error.prepareStackTrace is present. +assert.strictEqual(typeof Error.prepareStackTrace, 'function'); + +// Error.prepareStackTrace() can be overridden. { let prepareCalled = false; Error.prepareStackTrace = (_error, trace) => { @@ -17,3 +20,12 @@ const assert = require('assert'); } assert(prepareCalled); } + +if (process.argv[2] !== 'child') { + // Verify that the above test still passes when source-maps support is + // enabled. + spawnSyncAndExitWithoutError( + process.execPath, + ['--enable-source-maps', __filename, 'child'], + {}); +} diff --git a/test/parallel/test-errors-hide-stack-frames.js b/test/parallel/test-errors-hide-stack-frames.js new file mode 100644 index 00000000000000..fdaeb96fad76bb --- /dev/null +++ b/test/parallel/test-errors-hide-stack-frames.js @@ -0,0 +1,242 @@ +// Flags: --expose-internals +'use strict'; + +require('../common'); +const { hideStackFrames, codes } = require('internal/errors'); +const { validateInteger } = require('internal/validators'); +const assert = require('assert'); + +{ + // Test that the a built-in error has the correct name and message. + function a() { + b(); + } + + function b() { + c(); + } + + const c = hideStackFrames(function() { + throw new Error('test'); + }); + + try { + a(); + } catch (e) { + assert.strictEqual(e.name, 'Error'); + assert.strictEqual(e.message, 'test'); + } +} + +{ + // Test that validator errors have the correct name and message. + try { + validateInteger('2', 'test'); + } catch (e) { + assert.strictEqual(e.name, 'TypeError'); + assert.strictEqual(e.message, 'The "test" argument must be of type number. Received type string (\'2\')'); + } +} + +{ + // Test that validator fn is not in the stack trace. + + function a(value) { + validateInteger(value, 'test'); + } + try { + a('2'); + } catch (e) { + assert.strictEqual(Error.stackTraceLimit, 10); + const stack = e.stack.split('\n'); + assert.doesNotMatch(stack[1], /validateInteger/); + assert.match(stack[1], /at a/); + } +} + +{ + // Test that the stack trace is hidden for normal unnamed functions. + function a() { + b(); + } + + function b() { + c(); + } + + const c = hideStackFrames(function() { + throw new Error('test'); + }); + + try { + a(); + } catch (e) { + assert.strictEqual(Error.stackTraceLimit, 10); + const stack = e.stack.split('\n'); + assert.doesNotMatch(stack[1], /at c/); + assert.match(stack[1], /at b/); + assert.strictEqual(Error.stackTraceLimit, 10); + } +} + +{ + // Test that the stack trace is hidden for normal functions. + function a() { + b(); + } + + function b() { + c(); + } + + const c = hideStackFrames(function c() { + throw new Error('test'); + }); + + try { + a(); + } catch (e) { + assert.strictEqual(Error.stackTraceLimit, 10); + const stack = e.stack.split('\n'); + assert.doesNotMatch(stack[1], /at c/); + assert.match(stack[1], /at b/); + assert.strictEqual(Error.stackTraceLimit, 10); + } +} + +{ + // Test that the stack trace is hidden for arrow functions. + function a() { + b(); + } + + function b() { + c(); + } + + const c = hideStackFrames(() => { + throw new Error('test'); + }); + + try { + a(); + } catch (e) { + assert.strictEqual(Error.stackTraceLimit, 10); + const stack = e.stack.split('\n'); + assert.doesNotMatch(stack[1], /at c/); + assert.match(stack[1], /at b/); + assert.strictEqual(Error.stackTraceLimit, 10); + } +} + +{ + // Creating a new Error object without stack trace, then throwing it + // should get a stack trace by hideStackFrames. + function a() { + b(); + } + + function b() { + c(); + } + + const c = hideStackFrames(function() { + throw new Error('test'); + }); + + try { + a(); + } catch (e) { + assert.strictEqual(Error.stackTraceLimit, 10); + const stack = e.stack.split('\n'); + assert.doesNotMatch(stack[1], /at c/); + assert.match(stack[1], /at b/); + assert.strictEqual(Error.stackTraceLimit, 10); + } +} + +{ + const ERR_ACCESS_DENIED = codes.ERR_ACCESS_DENIED; + // Creating a new Error object without stack trace, then throwing it + // should get a stack trace by hideStackFrames. + function a() { + b(); + } + + function b() { + c(); + } + + const c = hideStackFrames(function() { + throw new ERR_ACCESS_DENIED.NoStackError('test'); + }); + + try { + a(); + } catch (e) { + assert.strictEqual(Error.stackTraceLimit, 10); + const stack = e.stack.split('\n'); + assert.doesNotMatch(stack[1], /at c/); + assert.match(stack[1], /at b/); + assert.strictEqual(Error.stackTraceLimit, 10); + } +} + +{ + // Creating a new Error object with stack trace, then throwing it + // should get a stack trace by hideStackFrames. + function a() { + b(); + } + + const b = hideStackFrames(function b() { + c(); + }); + + const c = hideStackFrames(function() { + throw new Error('test'); + }); + + try { + a(); + } catch (e) { + assert.strictEqual(Error.stackTraceLimit, 10); + const stack = e.stack.split('\n'); + assert.match(stack[1], /at a/); + assert.strictEqual(Error.stackTraceLimit, 10); + } +} + +{ + // Binding passes the value of this to the wrapped function. + let called = false; + function a() { + b.bind({ key: 'value' })(); + } + + const b = hideStackFrames(function b() { + assert.strictEqual(this.key, 'value'); + called = true; + }); + + a(); + + assert.strictEqual(called, true); +} + +{ + // Binding passes the value of this to the withoutStackTrace function. + let called = false; + function a() { + b.withoutStackTrace.bind({ key: 'value' })(); + } + + const b = hideStackFrames(function b() { + assert.strictEqual(this.key, 'value'); + called = true; + }); + + a(); + + assert.strictEqual(called, true); +} diff --git a/test/parallel/test-errors-systemerror.js b/test/parallel/test-errors-systemerror.js index 38afbd4aa7d164..629a3d1c0869f8 100644 --- a/test/parallel/test-errors-systemerror.js +++ b/test/parallel/test-errors-systemerror.js @@ -3,7 +3,8 @@ require('../common'); const assert = require('assert'); -const { E, SystemError, codes } = require('internal/errors'); +const { E, SystemError, codes, kIsNodeError } = require('internal/errors'); +const { inspect } = require('internal/util/inspect'); assert.throws( () => { new SystemError(); }, @@ -31,7 +32,7 @@ const { ERR_TEST } = codes; code: 'ERR_TEST', name: 'SystemError', message: 'custom message: syscall_test returned ETEST (code message)' + - ' /str => /str2', + ' /str => /str2', info: ctx } ); @@ -51,7 +52,7 @@ const { ERR_TEST } = codes; code: 'ERR_TEST', name: 'SystemError', message: 'custom message: syscall_test returned ETEST (code message)' + - ' /buf => /str2', + ' /buf => /str2', info: ctx } ); @@ -71,7 +72,7 @@ const { ERR_TEST } = codes; code: 'ERR_TEST', name: 'SystemError', message: 'custom message: syscall_test returned ETEST (code message)' + - ' /buf => /buf2', + ' /buf => /buf2', info: ctx } ); @@ -110,6 +111,11 @@ const { ERR_TEST } = codes; assert.strictEqual(err.syscall, 'test'); assert.strictEqual(err.path, 'path'); assert.strictEqual(err.dest, 'path'); + + assert.strictEqual(err.info.errno, 321); + assert.strictEqual(err.info.dest.toString(), 'path'); + assert.strictEqual(err.info.path.toString(), 'path'); + assert.strictEqual(err.info.syscall, 'test'); } { @@ -128,8 +134,277 @@ const { ERR_TEST } = codes; code: 'ERR_TEST', name: 'Foobar', message: 'custom message: syscall_test returned ERR_TEST ' + - '(Error occurred)', + '(Error occurred)', info: ctx } ); } + +{ + const ctx = { + code: 'ERR', + errno: 123, + message: 'something happened', + syscall: 'syscall_test', + }; + const err = new ERR_TEST(ctx); + + // is set to true + assert.strictEqual(err[kIsNodeError], true); + + // is not writable + assert.throws( + () => { err[kIsNodeError] = false; }, + { + name: 'TypeError', + message: /Symbol\(kIsNodeError\)/, + } + ); + + // is not enumerable + assert.strictEqual(Object.prototype.propertyIsEnumerable.call(err, kIsNodeError), false); + + // is configurable + delete err[kIsNodeError]; + assert.strictEqual(kIsNodeError in err, false); +} + +{ + const ctx = { + code: 'ERR', + errno: 123, + message: 'something happened', + syscall: 'syscall_test', + }; + const err = new ERR_TEST(ctx); + + // is set to true + assert.strictEqual(err.name, 'SystemError'); + + // is writable + err.name = 'CustomError'; + assert.strictEqual(err.name, 'CustomError'); + + // is not enumerable + assert.strictEqual(Object.prototype.propertyIsEnumerable.call(err, 'name'), false); + + // is configurable + delete err.name; + assert.strictEqual(err.name, 'Error'); +} + +{ + const ctx = { + code: 'ERR', + errno: 123, + message: 'something happened', + syscall: 'syscall_test', + }; + const err = new ERR_TEST(ctx); + + // Is set with the correct message + assert.strictEqual(err.message, 'custom message: syscall_test returned ERR (something happened)'); + + // is writable + err.message = 'custom message'; + assert.strictEqual(err.message, 'custom message'); + + // is not enumerable + assert.strictEqual(Object.prototype.propertyIsEnumerable.call(err, 'message'), false); + + // is configurable + delete err.message; + assert.strictEqual(err.message, ''); +} + +{ + const ctx = { + code: 'ERR', + errno: 123, + message: 'something happened', + syscall: 'syscall_test', + }; + const err = new ERR_TEST(ctx); + + // Is set to the correct syscall + assert.strictEqual(err.syscall, 'syscall_test'); + + // is writable + err.syscall = 'custom syscall'; + assert.strictEqual(err.syscall, 'custom syscall'); + + // is enumerable + assert(Object.prototype.propertyIsEnumerable.call(err, 'syscall')); + + // is configurable + delete err.syscall; + assert.strictEqual('syscall' in err, false); +} + +{ + const ctx = { + code: 'ERR', + errno: 123, + message: 'something happened', + syscall: 'syscall_test', + }; + const err = new ERR_TEST(ctx); + + // Is set to the correct errno + assert.strictEqual(err.errno, 123); + + // is writable + err.errno = 'custom errno'; + assert.strictEqual(err.errno, 'custom errno'); + + // is enumerable + assert(Object.prototype.propertyIsEnumerable.call(err, 'errno')); + + // is configurable + delete err.errno; + assert.strictEqual('errno' in err, false); +} + +{ + const ctx = { + code: 'ERR', + errno: 123, + message: 'something happened', + syscall: 'syscall_test', + }; + const err = new ERR_TEST(ctx); + + // Is set to the correct info + assert.strictEqual(Object.keys(err.info).length, 4); + assert.strictEqual(err.info.errno, 123); + assert.strictEqual(err.info.code, 'ERR'); + assert.strictEqual(err.info.message, 'something happened'); + assert.strictEqual(err.info.syscall, 'syscall_test'); + + // is not writable + assert.throws( + () => { + err.info = { + ...ctx, + errno: 124 + }; + }, + { + name: 'TypeError', + message: /'info'/, + } + ); + + assert.strictEqual(Object.keys(err.info).length, 4); + assert.strictEqual(err.info.errno, 123); + assert.strictEqual(err.info.code, 'ERR'); + assert.strictEqual(err.info.message, 'something happened'); + assert.strictEqual(err.info.syscall, 'syscall_test'); + + // is enumerable + assert(Object.prototype.propertyIsEnumerable.call(err, 'info')); + + // is configurable + delete err.info; + + assert.strictEqual('info' in err, false); +} + +{ + // Make sure the stack trace does not contain SystemError + try { + throw new ERR_TEST({ + code: 'ERR', + errno: 123, + message: 'something happened', + syscall: 'syscall_test', + }); + } catch (e) { + assert.doesNotMatch(e.stack, /at new SystemError/); + assert.match(e.stack.split('\n')[1], /test-errors-systemerror\.js/); + } +} + +{ + // Make sure the stack trace has the correct number of frames + const limit = Error.stackTraceLimit; + Error.stackTraceLimit = 3; + function a() { + b(); + } + + function b() { + c(); + } + + function c() { + throw new ERR_TEST({ + code: 'ERR', + errno: 123, + message: 'something happened', + syscall: 'syscall_test', + }); + } + try { + a(); + } catch (e) { + assert.doesNotMatch(e.stack, /at new SystemError/); + assert.match(e.stack.split('\n')[1], /test-errors-systemerror\.js/); + assert.match(e.stack.split('\n')[1], /at c \(/); + assert.match(e.stack.split('\n')[2], /test-errors-systemerror\.js/); + assert.match(e.stack.split('\n')[2], /at b \(/); + assert.match(e.stack.split('\n')[3], /test-errors-systemerror\.js/); + assert.match(e.stack.split('\n')[3], /at a \(/); + assert.strictEqual(e.stack.split('\n').length, 4); + } finally { + Error.stackTraceLimit = limit; + } +} + +{ + // Inspect should return the correct string + const err = new ERR_TEST({ + code: 'ERR', + errno: 123, + message: 'something happened', + syscall: 'syscall_test', + custom: 'custom' + }); + let inspectedErr = inspect(err); + + assert.ok(inspectedErr.includes(`info: { + code: 'ERR', + errno: 123, + message: 'something happened', + syscall: 'syscall_test', + custom: 'custom' + },`)); + + err.syscall = 'custom_syscall'; + + inspectedErr = inspect(err); + + assert.ok(inspectedErr.includes(`info: { + code: 'ERR', + errno: 123, + message: 'something happened', + syscall: 'custom_syscall', + custom: 'custom' + },`)); +} + +{ + // toString should return the correct string + + const err = new ERR_TEST({ + code: 'ERR', + errno: 123, + message: 'something happened', + syscall: 'syscall_test', + }); + + assert.strictEqual( + err.toString(), + 'SystemError [ERR_TEST]: custom message: syscall_test returned ERR (something happened)' + ); +} diff --git a/test/parallel/test-event-emitter-error-monitor.js b/test/parallel/test-event-emitter-error-monitor.js index 2b22b425b29194..8254fc6254a7cd 100644 --- a/test/parallel/test-event-emitter-error-monitor.js +++ b/test/parallel/test-event-emitter-error-monitor.js @@ -25,7 +25,7 @@ EE.emit('error', theErr); // Verify it works with once process.nextTick(() => EE.emit('error', theErr)); -assert.rejects(EventEmitter.once(EE, 'notTriggered'), theErr); +assert.rejects(EventEmitter.once(EE, 'notTriggered'), theErr).then(common.mustCall()); // Only error events trigger error monitor EE.on('aEvent', common.mustCall()); diff --git a/test/parallel/test-event-target.js b/test/parallel/test-event-target.js new file mode 100644 index 00000000000000..12246b15ae859c --- /dev/null +++ b/test/parallel/test-event-target.js @@ -0,0 +1,21 @@ +'use strict'; + +require('../common'); +const assert = require('assert'); + +const eventPhases = { + 'NONE': 0, + 'CAPTURING_PHASE': 1, + 'AT_TARGET': 2, + 'BUBBLING_PHASE': 3 +}; + +for (const [prop, value] of Object.entries(eventPhases)) { + // Check if the value of the property matches the expected value + assert.strictEqual(Event[prop], value, `Expected Event.${prop} to be ${value}, but got ${Event[prop]}`); + + const desc = Object.getOwnPropertyDescriptor(Event, prop); + assert.strictEqual(desc.writable, false, `${prop} should not be writable`); + assert.strictEqual(desc.configurable, false, `${prop} should not be configurable`); + assert.strictEqual(desc.enumerable, true, `${prop} should be enumerable`); +} diff --git a/test/parallel/test-file-validate-mode-flag.js b/test/parallel/test-file-validate-mode-flag.js index bb9871ae318d5f..62a9ef2ca2a059 100644 --- a/test/parallel/test-file-validate-mode-flag.js +++ b/test/parallel/test-file-validate-mode-flag.js @@ -33,8 +33,8 @@ assert.throws(() => openSync(__filename, 0, invalid), { assert.rejects(openPromise(__filename, invalid), { code: 'ERR_OUT_OF_RANGE' -}); +}).then(common.mustCall()); assert.rejects(openPromise(__filename, 0, invalid), { code: 'ERR_OUT_OF_RANGE' -}); +}).then(common.mustCall()); diff --git a/test/parallel/test-file-write-stream5.js b/test/parallel/test-file-write-stream5.js new file mode 100644 index 00000000000000..cdc8b52eebd48d --- /dev/null +++ b/test/parallel/test-file-write-stream5.js @@ -0,0 +1,28 @@ +'use strict'; + +// Test 'uncork' for WritableStream. +// Refs: https://github.com/nodejs/node/issues/50979 + +const common = require('../common'); +const fs = require('fs'); +const assert = require('assert'); +const test = require('node:test'); +const tmpdir = require('../common/tmpdir'); + +const filepath = tmpdir.resolve('write_stream.txt'); +tmpdir.refresh(); + +const data = 'data'; + +test('writable stream uncork', () => { + const fileWriteStream = fs.createWriteStream(filepath); + + fileWriteStream.on('finish', common.mustCall(() => { + const writtenData = fs.readFileSync(filepath, 'utf8'); + assert.strictEqual(writtenData, data); + })); + fileWriteStream.cork(); + fileWriteStream.write(data, common.mustCall()); + fileWriteStream.uncork(); + fileWriteStream.end(); +}); diff --git a/test/parallel/test-filehandle-close.js b/test/parallel/test-filehandle-close.js index 457b06a486f90f..6e55f3f06d19e7 100644 --- a/test/parallel/test-filehandle-close.js +++ b/test/parallel/test-filehandle-close.js @@ -10,7 +10,7 @@ const fs = require('fs'); const fh = await fs.promises.open(__filename); fs.closeSync(fh.fd); - assert.rejects(() => fh.close(), { + await assert.rejects(() => fh.close(), { code: 'EBADF', syscall: 'close' }); diff --git a/test/parallel/test-freeze-intrinsics.js b/test/parallel/test-freeze-intrinsics.js index 4e20346a9deda8..b3a2503d1d5b40 100644 --- a/test/parallel/test-freeze-intrinsics.js +++ b/test/parallel/test-freeze-intrinsics.js @@ -1,4 +1,4 @@ -// Flags: --frozen-intrinsics +// Flags: --frozen-intrinsics --jitless 'use strict'; require('../common'); const assert = require('assert'); diff --git a/test/parallel/test-fs-access.js b/test/parallel/test-fs-access.js index 5a8b85433eeefa..74e192816b0993 100644 --- a/test/parallel/test-fs-access.js +++ b/test/parallel/test-fs-access.js @@ -95,9 +95,13 @@ fs.promises.access(readOnlyFile, fs.constants.R_OK) assert.strictEqual(err.code, 'ENOENT'); assert.strictEqual(err.path, doesNotExist); }; + const expectedErrorPromise = (err) => { + expectedError(err); + assert.match(err.stack, /at async Object\.access/); + }; fs.access(doesNotExist, common.mustCall(expectedError)); fs.promises.access(doesNotExist) - .then(common.mustNotCall(), common.mustCall(expectedError)) + .then(common.mustNotCall(), common.mustCall(expectedErrorPromise)) .catch(throwNextTick); } diff --git a/test/parallel/test-fs-append-file-flush.js b/test/parallel/test-fs-append-file-flush.js new file mode 100644 index 00000000000000..69deeb4e8f9d14 --- /dev/null +++ b/test/parallel/test-fs-append-file-flush.js @@ -0,0 +1,114 @@ +'use strict'; +const common = require('../common'); +const tmpdir = require('../common/tmpdir'); +const assert = require('node:assert'); +const fs = require('node:fs'); +const fsp = require('node:fs/promises'); +const test = require('node:test'); +const data = 'foo'; +let cnt = 0; + +function nextFile() { + return tmpdir.resolve(`${cnt++}.out`); +} + +tmpdir.refresh(); + +test('synchronous version', async (t) => { + await t.test('validation', (t) => { + for (const v of ['true', '', 0, 1, [], {}, Symbol()]) { + assert.throws(() => { + fs.appendFileSync(nextFile(), data, { flush: v }); + }, { code: 'ERR_INVALID_ARG_TYPE' }); + } + }); + + await t.test('performs flush', (t) => { + const spy = t.mock.method(fs, 'fsyncSync'); + const file = nextFile(); + fs.appendFileSync(file, data, { flush: true }); + const calls = spy.mock.calls; + assert.strictEqual(calls.length, 1); + assert.strictEqual(calls[0].result, undefined); + assert.strictEqual(calls[0].error, undefined); + assert.strictEqual(calls[0].arguments.length, 1); + assert.strictEqual(typeof calls[0].arguments[0], 'number'); + assert.strictEqual(fs.readFileSync(file, 'utf8'), data); + }); + + await t.test('does not perform flush', (t) => { + const spy = t.mock.method(fs, 'fsyncSync'); + + for (const v of [undefined, null, false]) { + const file = nextFile(); + fs.appendFileSync(file, data, { flush: v }); + assert.strictEqual(fs.readFileSync(file, 'utf8'), data); + } + + assert.strictEqual(spy.mock.calls.length, 0); + }); +}); + +test('callback version', async (t) => { + await t.test('validation', (t) => { + for (const v of ['true', '', 0, 1, [], {}, Symbol()]) { + assert.throws(() => { + fs.appendFileSync(nextFile(), data, { flush: v }); + }, { code: 'ERR_INVALID_ARG_TYPE' }); + } + }); + + await t.test('performs flush', (t, done) => { + const spy = t.mock.method(fs, 'fsync'); + const file = nextFile(); + fs.appendFile(file, data, { flush: true }, common.mustSucceed(() => { + const calls = spy.mock.calls; + assert.strictEqual(calls.length, 1); + assert.strictEqual(calls[0].result, undefined); + assert.strictEqual(calls[0].error, undefined); + assert.strictEqual(calls[0].arguments.length, 2); + assert.strictEqual(typeof calls[0].arguments[0], 'number'); + assert.strictEqual(typeof calls[0].arguments[1], 'function'); + assert.strictEqual(fs.readFileSync(file, 'utf8'), data); + done(); + })); + }); + + await t.test('does not perform flush', (t, done) => { + const values = [undefined, null, false]; + const spy = t.mock.method(fs, 'fsync'); + let cnt = 0; + + for (const v of values) { + const file = nextFile(); + + fs.appendFile(file, data, { flush: v }, common.mustSucceed(() => { + assert.strictEqual(fs.readFileSync(file, 'utf8'), data); + cnt++; + + if (cnt === values.length) { + assert.strictEqual(spy.mock.calls.length, 0); + done(); + } + })); + } + }); +}); + +test('promise based version', async (t) => { + await t.test('validation', async (t) => { + for (const v of ['true', '', 0, 1, [], {}, Symbol()]) { + await assert.rejects(() => { + return fsp.appendFile(nextFile(), data, { flush: v }); + }, { code: 'ERR_INVALID_ARG_TYPE' }); + } + }); + + await t.test('success path', async (t) => { + for (const v of [undefined, null, false, true]) { + const file = nextFile(); + await fsp.appendFile(file, data, { flush: v }); + assert.strictEqual(await fsp.readFile(file, 'utf8'), data); + } + }); +}); diff --git a/test/parallel/test-fs-append-file-sync.js b/test/parallel/test-fs-append-file-sync.js index fd6ee690f4ab7d..f32b4585354561 100644 --- a/test/parallel/test-fs-append-file-sync.js +++ b/test/parallel/test-fs-append-file-sync.js @@ -27,15 +27,10 @@ const fs = require('fs'); const currentFileData = 'ABCD'; const m = 0o600; const num = 220; -const data = '南越国是前203年至前111年存在于岭南地区的一个国家,国都位于番禺,疆域包括今天中国的广东、' + - '广西两省区的大部份地区,福建省、湖南、贵州、云南的一小部份地区和越南的北部。' + - '南越国是秦朝灭亡后,由南海郡尉赵佗于前203年起兵兼并桂林郡和象郡后建立。' + - '前196年和前179年,南越国曾先后两次名义上臣属于西汉,成为西汉的“外臣”。前112年,' + - '南越国末代君主赵建德与西汉发生战争,被汉武帝于前111年所灭。南越国共存在93年,' + - '历经五代君主。南越国是岭南地区的第一个有记载的政权国家,采用封建制和郡县制并存的制度,' + - '它的建立保证了秦末乱世岭南地区社会秩序的稳定,有效的改善了岭南地区落后的政治、##济现状。\n'; - const tmpdir = require('../common/tmpdir'); +const fixtures = require('../common/fixtures'); +const data = fixtures.utf8TestText; + tmpdir.refresh(); // Test that empty file will be created and have content added. diff --git a/test/parallel/test-fs-append-file.js b/test/parallel/test-fs-append-file.js index 2151b5cedd1c9a..1e20625e5b9697 100644 --- a/test/parallel/test-fs-append-file.js +++ b/test/parallel/test-fs-append-file.js @@ -27,14 +27,8 @@ const fs = require('fs'); const tmpdir = require('../common/tmpdir'); const currentFileData = 'ABCD'; - -const s = '南越国是前203年至前111年存在于岭南地区的一个国家,国都位于番禺,疆域包括今天中国的广东、' + - '广西两省区的大部份地区,福建省、湖南、贵州、云南的一小部份地区和越南的北部。' + - '南越国是秦朝灭亡后,由南海郡尉赵佗于前203年起兵兼并桂林郡和象郡后建立。' + - '前196年和前179年,南越国曾先后两次名义上臣属于西汉,成为西汉的“外臣”。前112年,' + - '南越国末代君主赵建德与西汉发生战争,被汉武帝于前111年所灭。南越国共存在93年,' + - '历经五代君主。南越国是岭南地区的第一个有记载的政权国家,采用封建制和郡县制并存的制度,' + - '它的建立保证了秦末乱世岭南地区社会秩序的稳定,有效的改善了岭南地区落后的政治、##济现状。\n'; +const fixtures = require('../common/fixtures'); +const s = fixtures.utf8TestText; tmpdir.refresh(); diff --git a/test/parallel/test-fs-fchmod.js b/test/parallel/test-fs-fchmod.js index da37080ddeedd8..16425e7d1fe818 100644 --- a/test/parallel/test-fs-fchmod.js +++ b/test/parallel/test-fs-fchmod.js @@ -14,8 +14,8 @@ const fs = require('fs'); message: 'The "fd" argument must be of type number.' + common.invalidArgTypeHelper(input) }; - assert.throws(() => fs.fchmod(input), errObj); - assert.throws(() => fs.fchmodSync(input), errObj); + assert.throws(() => fs.fchmod(input, 0o666, () => {}), errObj); + assert.throws(() => fs.fchmodSync(input, 0o666), errObj); }); @@ -38,8 +38,8 @@ assert.throws(() => fs.fchmod(1, '123x'), { message: 'The value of "fd" is out of range. It must be >= 0 && <= ' + `2147483647. Received ${input}` }; - assert.throws(() => fs.fchmod(input), errObj); - assert.throws(() => fs.fchmodSync(input), errObj); + assert.throws(() => fs.fchmod(input, 0o666, () => {}), errObj); + assert.throws(() => fs.fchmodSync(input, 0o666), errObj); }); [-1, 2 ** 32].forEach((input) => { @@ -50,7 +50,7 @@ assert.throws(() => fs.fchmod(1, '123x'), { `4294967295. Received ${input}` }; - assert.throws(() => fs.fchmod(1, input), errObj); + assert.throws(() => fs.fchmod(1, input, () => {}), errObj); assert.throws(() => fs.fchmodSync(1, input), errObj); }); @@ -61,10 +61,10 @@ assert.throws(() => fs.fchmod(1, '123x'), { message: 'The value of "fd" is out of range. It must be an integer. ' + `Received ${input}` }; - assert.throws(() => fs.fchmod(input), errObj); - assert.throws(() => fs.fchmodSync(input), errObj); + assert.throws(() => fs.fchmod(input, 0o666, () => {}), errObj); + assert.throws(() => fs.fchmodSync(input, 0o666), errObj); errObj.message = errObj.message.replace('fd', 'mode'); - assert.throws(() => fs.fchmod(1, input), errObj); + assert.throws(() => fs.fchmod(1, input, () => {}), errObj); assert.throws(() => fs.fchmodSync(1, input), errObj); }); @@ -75,9 +75,9 @@ assert.throws(() => fs.fchmod(1, '123x'), { message: 'The value of "fd" is out of range. It must be an integer. ' + `Received ${input}` }; - assert.throws(() => fs.fchmod(input), errObj); - assert.throws(() => fs.fchmodSync(input), errObj); + assert.throws(() => fs.fchmod(input, 0o666, () => {}), errObj); + assert.throws(() => fs.fchmodSync(input, 0o666), errObj); errObj.message = errObj.message.replace('fd', 'mode'); - assert.throws(() => fs.fchmod(1, input), errObj); + assert.throws(() => fs.fchmod(1, input, () => {}), errObj); assert.throws(() => fs.fchmodSync(1, input), errObj); }); diff --git a/test/parallel/test-fs-fchown.js b/test/parallel/test-fs-fchown.js index 03a9ef3780ae6b..758bdde2575d9c 100644 --- a/test/parallel/test-fs-fchown.js +++ b/test/parallel/test-fs-fchown.js @@ -5,8 +5,8 @@ const assert = require('assert'); const fs = require('fs'); function testFd(input, errObj) { - assert.throws(() => fs.fchown(input), errObj); - assert.throws(() => fs.fchownSync(input), errObj); + assert.throws(() => fs.fchown(input, 0, 0, () => {}), errObj); + assert.throws(() => fs.fchownSync(input, 0, 0), errObj); } function testUid(input, errObj) { diff --git a/test/parallel/test-fs-filehandle-use-after-close.js b/test/parallel/test-fs-filehandle-use-after-close.js index 7b99e41cd02284..18216b4f4154e6 100644 --- a/test/parallel/test-fs-filehandle-use-after-close.js +++ b/test/parallel/test-fs-filehandle-use-after-close.js @@ -16,7 +16,7 @@ const fs = require('fs').promises; // See https://github.com/nodejs/node/issues/31361 for more details. const otherFilehandle = await fs.open(process.execPath); - assert.rejects(() => filehandle.stat(), { + await assert.rejects(() => filehandle.stat(), { code: 'EBADF', syscall: 'fstat' }); diff --git a/test/parallel/test-fs-glob.mjs b/test/parallel/test-fs-glob.mjs index 0936f6575cb6d7..a789ed1167098a 100644 --- a/test/parallel/test-fs-glob.mjs +++ b/test/parallel/test-fs-glob.mjs @@ -65,6 +65,7 @@ const patterns = { ], 'a/{b,c,d,e,f}/**/g': [], 'a/b/**': ['a/b', 'a/b/c', 'a/b/c/d'], + 'a/{b/**,b/c}': ['a/b', 'a/b/c', 'a/b/c/d'], './**/g': ['a/abcdef/g', 'a/abcfed/g'], 'a/abc{fed,def}/g/h': ['a/abcdef/g/h', 'a/abcfed/g/h'], 'a/abc{fed/g,def}/**/': ['a/abcdef', 'a/abcdef/g', 'a/abcfed/g'], diff --git a/test/parallel/test-fs-lchmod.js b/test/parallel/test-fs-lchmod.js index ae5cb3ba2a230a..877aea3376554d 100644 --- a/test/parallel/test-fs-lchmod.js +++ b/test/parallel/test-fs-lchmod.js @@ -42,7 +42,7 @@ assert.throws(() => fs.lchmod(f, {}), { code: 'ERR_INVALID_ARG_TYPE' }); code: 'ERR_INVALID_ARG_TYPE', }; - assert.rejects(promises.lchmod(f, input, () => {}), errObj); + assert.rejects(promises.lchmod(f, input, () => {}), errObj).then(common.mustCall()); assert.throws(() => fs.lchmodSync(f, input), errObj); }); @@ -61,6 +61,6 @@ assert.throws(() => fs.lchmodSync(f, '123x'), { `4294967295. Received ${input}` }; - assert.rejects(promises.lchmod(f, input, () => {}), errObj); + assert.rejects(promises.lchmod(f, input, () => {}), errObj).then(common.mustCall()); assert.throws(() => fs.lchmodSync(f, input), errObj); }); diff --git a/test/parallel/test-fs-long-path.js b/test/parallel/test-fs-long-path.js index f3a8ea7a9ebf9e..11724a88dc4c29 100644 --- a/test/parallel/test-fs-long-path.js +++ b/test/parallel/test-fs-long-path.js @@ -46,4 +46,7 @@ fs.writeFile(fullPath, 'ok', common.mustSucceed(() => { // Tests https://github.com/nodejs/node/issues/39721 fs.realpath.native(fullPath, common.mustSucceed()); + + // Tests https://github.com/nodejs/node/issues/51031 + fs.promises.realpath(fullPath).then(common.mustCall(), common.mustNotCall()); })); diff --git a/test/parallel/test-fs-mkdtemp-prefix-check.js b/test/parallel/test-fs-mkdtemp-prefix-check.js index 33a06914a46e10..af5cb6ab7db07d 100644 --- a/test/parallel/test-fs-mkdtemp-prefix-check.js +++ b/test/parallel/test-fs-mkdtemp-prefix-check.js @@ -27,7 +27,7 @@ function failAsync(value) { }); } -prefixValues.forEach((prefixValue) => { +for (const prefixValue of prefixValues) { fail(prefixValue); failAsync(prefixValue); -}); +} diff --git a/test/parallel/test-fs-open.js b/test/parallel/test-fs-open.js index 29580019db6f61..0855e521f7091f 100644 --- a/test/parallel/test-fs-open.js +++ b/test/parallel/test-fs-open.js @@ -94,7 +94,7 @@ for (const extra of [[], ['r'], ['r', 0], ['r', 0, 'bad callback']]) { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError' } - ); + ).then(common.mustCall()); }); // Check invalid modes. @@ -116,5 +116,5 @@ for (const extra of [[], ['r'], ['r', 0], ['r', 0, 'bad callback']]) { { code: 'ERR_INVALID_ARG_TYPE' } - ); + ).then(common.mustCall()); }); diff --git a/test/parallel/test-fs-opendir.js b/test/parallel/test-fs-opendir.js index 82ee8e20da31cd..8b8fc161eee661 100644 --- a/test/parallel/test-fs-opendir.js +++ b/test/parallel/test-fs-opendir.js @@ -48,9 +48,11 @@ const invalidCallbackObj = { const entries = files.map(() => { const dirent = dir.readSync(); assertDirent(dirent); - return dirent.name; - }); - assert.deepStrictEqual(files, entries.sort()); + return { name: dirent.name, path: dirent.path, parentPath: dirent.parentPath, toString() { return dirent.name; } }; + }).sort(); + assert.deepStrictEqual(entries.map((d) => d.name), files); + assert.deepStrictEqual(entries.map((d) => d.path), Array(entries.length).fill(testDir)); + assert.deepStrictEqual(entries.map((d) => d.parentPath), Array(entries.length).fill(testDir)); // dir.read should return null when no more entries exist assert.strictEqual(dir.readSync(), null); diff --git a/test/parallel/test-fs-promises-file-handle-read.js b/test/parallel/test-fs-promises-file-handle-read.js index 34a70c61d7e445..2e9534c3989906 100644 --- a/test/parallel/test-fs-promises-file-handle-read.js +++ b/test/parallel/test-fs-promises-file-handle-read.js @@ -14,7 +14,7 @@ const assert = require('assert'); const tmpDir = tmpdir.path; async function read(fileHandle, buffer, offset, length, position, options) { - return options.useConf ? + return options?.useConf ? fileHandle.read({ buffer, offset, length, position }) : fileHandle.read(buffer, offset, length, position); } @@ -96,6 +96,21 @@ async function validateReadLength(len) { assert.strictEqual(bytesRead, len); } +async function validateReadWithNoOptions(byte) { + const buf = Buffer.alloc(byte); + const filePath = fixtures.path('x.txt'); + const fileHandle = await open(filePath, 'r'); + let response = await fileHandle.read(buf); + assert.strictEqual(response.bytesRead, byte); + response = await read(fileHandle, buf, 0, undefined, 0); + assert.strictEqual(response.bytesRead, byte); + response = await read(fileHandle, buf, 0, null, 0); + assert.strictEqual(response.bytesRead, byte); + response = await read(fileHandle, buf, 0, undefined, 0, { useConf: true }); + assert.strictEqual(response.bytesRead, byte); + response = await read(fileHandle, buf, 0, null, 0, { useConf: true }); + assert.strictEqual(response.bytesRead, byte); +} (async function() { tmpdir.refresh(); @@ -109,4 +124,6 @@ async function validateReadLength(len) { await validateReadWithPositionZero(); await validateReadLength(0); await validateReadLength(1); + await validateReadWithNoOptions(0); + await validateReadWithNoOptions(1); })().then(common.mustCall()); diff --git a/test/parallel/test-fs-promises-readfile.js b/test/parallel/test-fs-promises-readfile.js index 30305568f6e087..ccf7aa16b12e12 100644 --- a/test/parallel/test-fs-promises-readfile.js +++ b/test/parallel/test-fs-promises-readfile.js @@ -46,7 +46,7 @@ function validateReadFileAbortLogicBefore() { const signal = AbortSignal.abort(); assert.rejects(readFile(fn, { signal }), { name: 'AbortError' - }); + }).then(common.mustCall()); } function validateReadFileAbortLogicDuring() { @@ -55,7 +55,7 @@ function validateReadFileAbortLogicDuring() { process.nextTick(() => controller.abort()); assert.rejects(readFile(fn, { signal }), { name: 'AbortError' - }); + }).then(common.mustCall()); } async function validateWrongSignalParam() { @@ -72,7 +72,7 @@ async function validateWrongSignalParam() { async function validateZeroByteLiar() { const originalFStat = fsBinding.fstat; fsBinding.fstat = common.mustCall( - () => (/* stat fields */ [0, 1, 2, 3, 4, 5, 6, 7, 0 /* size */]) + async () => (/* stat fields */ [0, 1, 2, 3, 4, 5, 6, 7, 0 /* size */]) ); const readBuffer = await readFile(fn); assert.strictEqual(readBuffer.toString(), largeBuffer.toString()); diff --git a/test/parallel/test-fs-promises-watch.js b/test/parallel/test-fs-promises-watch.js index 780a0d2dfaaa1f..94ef7fcb2abe30 100644 --- a/test/parallel/test-fs-promises-watch.js +++ b/test/parallel/test-fs-promises-watch.js @@ -79,42 +79,42 @@ assert.rejects( // eslint-disable-next-line no-unused-vars, no-empty for await (const _ of watch(1)) { } }, - { code: 'ERR_INVALID_ARG_TYPE' }); + { code: 'ERR_INVALID_ARG_TYPE' }).then(common.mustCall()); assert.rejects( async () => { // eslint-disable-next-line no-unused-vars, no-empty for await (const _ of watch(__filename, 1)) { } }, - { code: 'ERR_INVALID_ARG_TYPE' }); + { code: 'ERR_INVALID_ARG_TYPE' }).then(common.mustCall()); assert.rejects( async () => { // eslint-disable-next-line no-unused-vars, no-empty for await (const _ of watch('', { persistent: 1 })) { } }, - { code: 'ERR_INVALID_ARG_TYPE' }); + { code: 'ERR_INVALID_ARG_TYPE' }).then(common.mustCall()); assert.rejects( async () => { // eslint-disable-next-line no-unused-vars, no-empty for await (const _ of watch('', { recursive: 1 })) { } }, - { code: 'ERR_INVALID_ARG_TYPE' }); + { code: 'ERR_INVALID_ARG_TYPE' }).then(common.mustCall()); assert.rejects( async () => { // eslint-disable-next-line no-unused-vars, no-empty for await (const _ of watch('', { encoding: 1 })) { } }, - { code: 'ERR_INVALID_ARG_VALUE' }); + { code: 'ERR_INVALID_ARG_VALUE' }).then(common.mustCall()); assert.rejects( async () => { // eslint-disable-next-line no-unused-vars, no-empty for await (const _ of watch('', { signal: 1 })) { } }, - { code: 'ERR_INVALID_ARG_TYPE' }); + { code: 'ERR_INVALID_ARG_TYPE' }).then(common.mustCall()); (async () => { const ac = new AbortController(); diff --git a/test/parallel/test-fs-promises.js b/test/parallel/test-fs-promises.js index c1e61040a98e3f..2dc0ae8cb44f6d 100644 --- a/test/parallel/test-fs-promises.js +++ b/test/parallel/test-fs-promises.js @@ -57,23 +57,24 @@ assert.strictEqual( { code: 'ENOENT', name: 'Error', - message: /^ENOENT: no such file or directory, access/ + message: /^ENOENT: no such file or directory, access/, + stack: /at async Function\.rejects/ } - ); + ).then(common.mustCall()); assert.rejects( access(__filename, 8), { code: 'ERR_OUT_OF_RANGE', } - ); + ).then(common.mustCall()); assert.rejects( access(__filename, { [Symbol.toPrimitive]() { return 5; } }), { code: 'ERR_INVALID_ARG_TYPE', } - ); + ).then(common.mustCall()); } function verifyStatObject(stat) { @@ -407,7 +408,7 @@ async function executeOnHandle(dest, func) { const dir = path.join(tmpDir, nextdir(), nextdir()); await mkdir(path.dirname(dir)); await writeFile(dir, ''); - assert.rejects( + await assert.rejects( mkdir(dir, { recursive: true }), { code: 'EEXIST', @@ -424,7 +425,7 @@ async function executeOnHandle(dest, func) { const dir = path.join(file, nextdir(), nextdir()); await mkdir(path.dirname(file)); await writeFile(file, ''); - assert.rejects( + await assert.rejects( mkdir(dir, { recursive: true }), { code: 'ENOTDIR', @@ -463,14 +464,14 @@ async function executeOnHandle(dest, func) { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError' } - ); + ).then(common.mustCall()); }); } // `mkdtemp` with invalid numeric prefix { await mkdtemp(path.resolve(tmpDir, 'FOO')); - assert.rejects( + await assert.rejects( // mkdtemp() expects to get a string prefix. async () => mkdtemp(1), { diff --git a/test/parallel/test-fs-read-empty-buffer.js b/test/parallel/test-fs-read-empty-buffer.js index 7ec5e5c186f5eb..6abfcb5aae69c2 100644 --- a/test/parallel/test-fs-read-empty-buffer.js +++ b/test/parallel/test-fs-read-empty-buffer.js @@ -37,5 +37,5 @@ assert.throws( message: 'The argument \'buffer\' is empty and cannot be written. ' + 'Received Uint8Array(0) []' } - ); + ).then(common.mustCall()); })().then(common.mustCall()); diff --git a/test/parallel/test-fs-readv-sync.js b/test/parallel/test-fs-readv-sync.js index 22f28c7830e746..548f54cbb9e3b2 100644 --- a/test/parallel/test-fs-readv-sync.js +++ b/test/parallel/test-fs-readv-sync.js @@ -66,21 +66,21 @@ const wrongInputs = [false, 'test', {}, [{}], ['sdf'], null, undefined]; { const fd = fs.openSync(filename, 'r'); - wrongInputs.forEach((wrongInput) => { + for (const wrongInput of wrongInputs) { assert.throws( () => fs.readvSync(fd, wrongInput, null), { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError' } ); - }); + } fs.closeSync(fd); } { // fs.readv with wrong fd argument - wrongInputs.forEach((wrongInput) => { + for (const wrongInput of wrongInputs) { assert.throws( () => fs.readvSync(wrongInput), { @@ -88,5 +88,5 @@ const wrongInputs = [false, 'test', {}, [{}], ['sdf'], null, undefined]; name: 'TypeError' } ); - }); + } } diff --git a/test/parallel/test-fs-readv.js b/test/parallel/test-fs-readv.js index aa24c3e06ba4de..111719a7efbb0f 100644 --- a/test/parallel/test-fs-readv.js +++ b/test/parallel/test-fs-readv.js @@ -67,22 +67,21 @@ const wrongInputs = [false, 'test', {}, [{}], ['sdf'], null, undefined]; fs.writeFileSync(filename, exptectedBuff); const fd = fs.openSync(filename, 'r'); - - wrongInputs.forEach((wrongInput) => { + for (const wrongInput of wrongInputs) { assert.throws( () => fs.readv(fd, wrongInput, null, common.mustNotCall()), { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError' } ); - }); + } fs.closeSync(fd); } { // fs.readv with wrong fd argument - wrongInputs.forEach((wrongInput) => { + for (const wrongInput of wrongInputs) { assert.throws( () => fs.readv(wrongInput, common.mustNotCall()), { @@ -90,5 +89,5 @@ const wrongInputs = [false, 'test', {}, [{}], ['sdf'], null, undefined]; name: 'TypeError' } ); - }); + } } diff --git a/test/parallel/test-fs-realpath-buffer-encoding.js b/test/parallel/test-fs-realpath-buffer-encoding.js index 481e1b0df67f04..dbf2bda2c77d23 100644 --- a/test/parallel/test-fs-realpath-buffer-encoding.js +++ b/test/parallel/test-fs-realpath-buffer-encoding.js @@ -10,9 +10,9 @@ const buffer_dir = Buffer.from(string_dir); const encodings = ['ascii', 'utf8', 'utf16le', 'ucs2', 'base64', 'binary', 'hex']; const expected = {}; -encodings.forEach((encoding) => { +for (const encoding of encodings) { expected[encoding] = buffer_dir.toString(encoding); -}); +} // test sync version diff --git a/test/parallel/test-fs-stat.js b/test/parallel/test-fs-stat.js index 8eca34c684035f..2b98698df65d36 100644 --- a/test/parallel/test-fs-stat.js +++ b/test/parallel/test-fs-stat.js @@ -80,8 +80,6 @@ fs.stat(__filename, common.mustSucceed((s) => { assert.strictEqual(s.isFIFO(), false); assert.strictEqual(s.isSymbolicLink(), false); - const jsonString = JSON.stringify(s); - const parsed = JSON.parse(jsonString); [ 'dev', 'mode', 'nlink', 'uid', 'gid', 'rdev', 'blksize', 'ino', 'size', 'blocks', @@ -91,19 +89,15 @@ fs.stat(__filename, common.mustSucceed((s) => { assert.ok(k in s, `${k} should be in Stats`); assert.notStrictEqual(s[k], undefined, `${k} should not be undefined`); assert.notStrictEqual(s[k], null, `${k} should not be null`); - assert.notStrictEqual(parsed[k], undefined, `${k} should not be undefined`); - assert.notStrictEqual(parsed[k], null, `${k} should not be null`); }); [ 'dev', 'mode', 'nlink', 'uid', 'gid', 'rdev', 'blksize', 'ino', 'size', 'blocks', 'atimeMs', 'mtimeMs', 'ctimeMs', 'birthtimeMs', ].forEach((k) => { assert.strictEqual(typeof s[k], 'number', `${k} should be a number`); - assert.strictEqual(typeof parsed[k], 'number', `${k} should be a number`); }); ['atime', 'mtime', 'ctime', 'birthtime'].forEach((k) => { assert.ok(s[k] instanceof Date, `${k} should be a Date`); - assert.strictEqual(typeof parsed[k], 'string', `${k} should be a string`); }); })); diff --git a/test/parallel/test-fs-sync-fd-leak.js b/test/parallel/test-fs-sync-fd-leak.js index 52f6f38f9c0ea0..1abb75964a46e2 100644 --- a/test/parallel/test-fs-sync-fd-leak.js +++ b/test/parallel/test-fs-sync-fd-leak.js @@ -25,7 +25,6 @@ require('../common'); const assert = require('assert'); const fs = require('fs'); const { internalBinding } = require('internal/test/binding'); -const { UV_EBADF } = internalBinding('uv'); // Ensure that (read|write|append)FileSync() closes the file descriptor fs.openSync = function() { @@ -42,21 +41,34 @@ fs.writeSync = function() { throw new Error('BAM'); }; -internalBinding('fs').fstat = function(fd, bigint, _, ctx) { - ctx.errno = UV_EBADF; - ctx.syscall = 'fstat'; +// Internal fast paths are pure C++, can't error inside write +internalBinding('fs').writeFileUtf8 = function() { + // Fake close + close_called++; + throw new Error('BAM'); +}; + +internalBinding('fs').fstat = function() { + throw new Error('EBADF: bad file descriptor, fstat'); }; let close_called = 0; ensureThrows(function() { - fs.readFileSync('dummy'); -}, 'EBADF: bad file descriptor, fstat'); -ensureThrows(function() { + // Fast path: writeFileSync utf8 fs.writeFileSync('dummy', 'xxx'); }, 'BAM'); ensureThrows(function() { + // Non-fast path + fs.writeFileSync('dummy', 'xxx', { encoding: 'base64' }); +}, 'BAM'); +ensureThrows(function() { + // Fast path: writeFileSync utf8 fs.appendFileSync('dummy', 'xxx'); }, 'BAM'); +ensureThrows(function() { + // Non-fast path + fs.appendFileSync('dummy', 'xxx', { encoding: 'base64' }); +}, 'BAM'); function ensureThrows(cb, message) { let got_exception = false; diff --git a/test/parallel/test-fs-timestamp-parsing-error.js b/test/parallel/test-fs-timestamp-parsing-error.js index 1fe0294f68b714..b3fd3e23dfcc35 100644 --- a/test/parallel/test-fs-timestamp-parsing-error.js +++ b/test/parallel/test-fs-timestamp-parsing-error.js @@ -3,7 +3,7 @@ require('../common'); const assert = require('assert'); const fs = require('fs'); -[Infinity, -Infinity, NaN].forEach((input) => { +for (const input of [Infinity, -Infinity, NaN]) { assert.throws( () => { fs._toUnixTimestamp(input); @@ -12,7 +12,7 @@ const fs = require('fs'); code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError' }); -}); +} assert.throws( () => { @@ -24,6 +24,6 @@ assert.throws( }); const okInputs = [1, -1, '1', '-1', Date.now()]; -okInputs.forEach((input) => { +for (const input of okInputs) { fs._toUnixTimestamp(input); -}); +} diff --git a/test/parallel/test-fs-truncate.js b/test/parallel/test-fs-truncate.js index de9687ebb27f0c..efaeeca7173c12 100644 --- a/test/parallel/test-fs-truncate.js +++ b/test/parallel/test-fs-truncate.js @@ -270,7 +270,7 @@ function testFtruncate(cb) { ['', false, null, undefined, {}, []].forEach((input) => { ['ftruncate', 'ftruncateSync'].forEach((fnName) => { assert.throws( - () => fs[fnName](input), + () => fs[fnName](input, 1, () => {}), { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError', diff --git a/test/parallel/test-fs-write-file-sync.js b/test/parallel/test-fs-write-file-sync.js index 26aa819a8107f0..4ead91530bb748 100644 --- a/test/parallel/test-fs-write-file-sync.js +++ b/test/parallel/test-fs-write-file-sync.js @@ -101,6 +101,22 @@ tmpdir.refresh(); assert.strictEqual(content, 'hello world!'); } +// Test writeFileSync with no flags +{ + const utf8Data = 'hello world!'; + for (const test of [ + { data: utf8Data }, + { data: utf8Data, options: { encoding: 'utf8' } }, + { data: Buffer.from(utf8Data, 'utf8').toString('hex'), options: { encoding: 'hex' } }, + ]) { + const file = tmpdir.resolve(`testWriteFileSyncNewFile_${Math.random()}.txt`); + fs.writeFileSync(file, test.data, test.options); + + const content = fs.readFileSync(file, { encoding: 'utf-8' }); + assert.strictEqual(content, utf8Data); + } +} + // Test writeFileSync with an invalid input { const file = tmpdir.resolve('testWriteFileSyncInvalid.txt'); diff --git a/test/parallel/test-fs-write-file-typedarrays.js b/test/parallel/test-fs-write-file-typedarrays.js index e398579f123ab1..a05385048ad48f 100644 --- a/test/parallel/test-fs-write-file-typedarrays.js +++ b/test/parallel/test-fs-write-file-typedarrays.js @@ -7,14 +7,8 @@ const tmpdir = require('../common/tmpdir'); tmpdir.refresh(); const filename = tmpdir.resolve('test.txt'); - -const s = '南越国是前203年至前111年存在于岭南地区的一个国家,国都位于番禺,疆域包括今天中国的广东、' + - '广西两省区的大部份地区,福建省、湖南、贵州、云南的一小部份地区和越南的北部。' + - '南越国是秦朝灭亡后,由南海郡尉赵佗于前203年起兵兼并桂林郡和象郡后建立。' + - '前196年和前179年,南越国曾先后两次名义上臣属于西汉,成为西汉的“外臣”。前112年,' + - '南越国末代君主赵建德与西汉发生战争,被汉武帝于前111年所灭。南越国共存在93年,' + - '历经五代君主。南越国是岭南地区的第一个有记载的政权国家,采用封建制和郡县制并存的制度,' + - '它的建立保证了秦末乱世岭南地区社会秩序的稳定,有效的改善了岭南地区落后的政治、##济现状。\n'; +const fixtures = require('../common/fixtures'); +const s = fixtures.utf8TestText; // The length of the buffer should be a multiple of 8 // as required by common.getArrayBufferViews() diff --git a/test/parallel/test-fs-write-file.js b/test/parallel/test-fs-write-file.js index 404caa4636de04..120b9ec9ef6c1c 100644 --- a/test/parallel/test-fs-write-file.js +++ b/test/parallel/test-fs-write-file.js @@ -28,14 +28,8 @@ const tmpdir = require('../common/tmpdir'); tmpdir.refresh(); const filename = tmpdir.resolve('test.txt'); - -const s = '南越国是前203年至前111年存在于岭南地区的一个国家,国都位于番禺,疆域包括今天中国的广东、' + - '广西两省区的大部份地区,福建省、湖南、贵州、云南的一小部份地区和越南的北部。' + - '南越国是秦朝灭亡后,由南海郡尉赵佗于前203年起兵兼并桂林郡和象郡后建立。' + - '前196年和前179年,南越国曾先后两次名义上臣属于西汉,成为西汉的“外臣”。前112年,' + - '南越国末代君主赵建德与西汉发生战争,被汉武帝于前111年所灭。南越国共存在93年,' + - '历经五代君主。南越国是岭南地区的第一个有记载的政权国家,采用封建制和郡县制并存的制度,' + - '它的建立保证了秦末乱世岭南地区社会秩序的稳定,有效的改善了岭南地区落后的政治、##济现状。\n'; +const fixtures = require('../common/fixtures'); +const s = fixtures.utf8TestText; fs.writeFile(filename, s, common.mustSucceed(() => { fs.readFile(filename, common.mustSucceed((buffer) => { diff --git a/test/parallel/test-global.js b/test/parallel/test-global.js index 0a8fecd240c8a1..d31b1d97744ff8 100644 --- a/test/parallel/test-global.js +++ b/test/parallel/test-global.js @@ -30,7 +30,7 @@ const assert = require('assert'); const { builtinModules } = require('module'); // Load all modules to actually cover most code parts. -builtinModules.forEach((moduleName) => { +for (const moduleName of builtinModules) { if (!moduleName.includes('/')) { try { // This could throw for e.g., crypto if the binary is not compiled @@ -40,7 +40,7 @@ builtinModules.forEach((moduleName) => { // Continue regardless of error. } } -}); +} { const expected = [ diff --git a/test/parallel/test-h2-large-header-cause-client-to-hangup.js b/test/parallel/test-h2-large-header-cause-client-to-hangup.js index b8b08cecf6817c..eb18d9e9a20ae7 100644 --- a/test/parallel/test-h2-large-header-cause-client-to-hangup.js +++ b/test/parallel/test-h2-large-header-cause-client-to-hangup.js @@ -7,7 +7,7 @@ const http2 = require('http2'); const assert = require('assert'); const { DEFAULT_SETTINGS_MAX_HEADER_LIST_SIZE, - NGHTTP2_CANCEL, + NGHTTP2_FRAME_SIZE_ERROR, } = http2.constants; const headerSize = DEFAULT_SETTINGS_MAX_HEADER_LIST_SIZE; @@ -28,11 +28,17 @@ server.listen(0, common.mustCall(() => { function send() { const stream = clientSession.request({ ':path': '/' }); stream.on('close', common.mustCall(() => { - assert.strictEqual(stream.rstCode, NGHTTP2_CANCEL); + assert.strictEqual(stream.rstCode, NGHTTP2_FRAME_SIZE_ERROR); clearTimeout(timer); server.close(); })); + stream.on('error', common.expectsError({ + code: 'ERR_HTTP2_STREAM_ERROR', + name: 'Error', + message: 'Stream closed with error code NGHTTP2_FRAME_SIZE_ERROR' + })); + stream.end(); } })); diff --git a/test/parallel/test-http-chunked.js b/test/parallel/test-http-chunked.js index 264a87be6adc7f..cfa34e3afedb74 100644 --- a/test/parallel/test-http-chunked.js +++ b/test/parallel/test-http-chunked.js @@ -23,16 +23,8 @@ const common = require('../common'); const assert = require('assert'); const http = require('http'); - -const UTF8_STRING = '南越国是前203年至前111年存在于岭南地区的一个国家,' + - '国都位于番禺,疆域包括今天中国的广东、广西两省区的大部份地区,福建省、湖南、' + - '贵州、云南的一小部份地区和越南的北部。南越国是秦朝灭亡后,' + - '由南海郡尉赵佗于前203年起兵兼并桂林郡和象郡后建立。前196年和前179年,' + - '南越国曾先后两次名义上臣属于西汉,成为西汉的“外臣”。前112年,' + - '南越国末代君主赵建德与西汉发生战争,被汉武帝于前111年所灭。' + - '南越国共存在93年,历经五代君主。南越国是岭南地区的第一个有记载的政权国家,' + - '采用封建制和郡县制并存的制度,它的建立保证了秦末乱世岭南地区社会秩序的稳定,' + - '有效的改善了岭南地区落后的政治、经济现状。'; +const fixtures = require('../common/fixtures'); +const UTF8_STRING = fixtures.utf8TestText; const server = http.createServer(common.mustCall((req, res) => { res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf8' }); diff --git a/test/parallel/test-http-client-input-function.js b/test/parallel/test-http-client-input-function.js new file mode 100644 index 00000000000000..3a2f93aa0efdae --- /dev/null +++ b/test/parallel/test-http-client-input-function.js @@ -0,0 +1,29 @@ +'use strict'; + +const common = require('../common'); +const http = require('http'); +const assert = require('assert'); + +{ + const server = http.createServer(common.mustCall((req, res) => { + res.writeHead(200); + res.end('hello world'); + })).listen(0, '127.0.0.1'); + + server.on('listening', common.mustCall(() => { + const req = new http.ClientRequest(server.address(), common.mustCall((response) => { + let body = ''; + response.setEncoding('utf8'); + response.on('data', (chunk) => { + body += chunk; + }); + + response.on('end', common.mustCall(() => { + assert.strictEqual(body, 'hello world'); + server.close(); + })); + })); + + req.end(); + })); +} diff --git a/test/parallel/test-http-client-insecure-http-parser-error.js b/test/parallel/test-http-client-insecure-http-parser-error.js new file mode 100644 index 00000000000000..d483d817f0ce79 --- /dev/null +++ b/test/parallel/test-http-client-insecure-http-parser-error.js @@ -0,0 +1,14 @@ +'use strict'; + +require('../common'); +const assert = require('assert'); +const ClientRequest = require('http').ClientRequest; + +{ + assert.throws(() => { + new ClientRequest({ insecureHTTPParser: 'wrongValue' }); + }, { + code: 'ERR_INVALID_ARG_TYPE', + message: /insecureHTTPParser/ + }, 'http request should throw when passing invalid insecureHTTPParser'); +} diff --git a/test/parallel/test-http-hostname-typechecking.js b/test/parallel/test-http-hostname-typechecking.js index bcb175ee34171b..368766e087014b 100644 --- a/test/parallel/test-http-hostname-typechecking.js +++ b/test/parallel/test-http-hostname-typechecking.js @@ -36,7 +36,8 @@ vals.forEach((v) => { // These values are OK and should not throw synchronously. // Only testing for 'hostname' validation so ignore connection errors. const dontCare = () => {}; -['', undefined, null].forEach((v) => { +const values = ['', undefined, null]; +for (const v of values) { http.request({ hostname: v }).on('error', dontCare).end(); http.request({ host: v }).on('error', dontCare).end(); -}); +} diff --git a/test/parallel/test-http-perf_hooks.js b/test/parallel/test-http-perf_hooks.js index de6ed0295a1152..2ed1a736fa8841 100644 --- a/test/parallel/test-http-perf_hooks.js +++ b/test/parallel/test-http-perf_hooks.js @@ -57,7 +57,7 @@ server.listen(0, common.mustCall(async () => { process.on('exit', () => { let numberOfHttpClients = 0; let numberOfHttpRequests = 0; - entries.forEach((entry) => { + for (const entry of entries) { assert.strictEqual(entry.entryType, 'http'); assert.strictEqual(typeof entry.startTime, 'number'); assert.strictEqual(typeof entry.duration, 'number'); @@ -72,7 +72,7 @@ process.on('exit', () => { assert.strictEqual(typeof entry.detail.res.statusCode, 'number'); assert.strictEqual(typeof entry.detail.res.statusMessage, 'string'); assert.strictEqual(typeof entry.detail.res.headers, 'object'); - }); + } assert.strictEqual(numberOfHttpClients, 2); assert.strictEqual(numberOfHttpRequests, 2); }); diff --git a/test/parallel/test-http-server-multiheaders2.js b/test/parallel/test-http-server-multiheaders2.js index 1e19708557ef24..b20a2674d3ba16 100644 --- a/test/parallel/test-http-server-multiheaders2.js +++ b/test/parallel/test-http-server-multiheaders2.js @@ -70,15 +70,15 @@ const multipleForbidden = [ ]; const server = http.createServer(function(req, res) { - multipleForbidden.forEach(function(header) { + for (const header of multipleForbidden) { assert.strictEqual(req.headers[header.toLowerCase()], 'foo', `header parsed incorrectly: ${header}`); - }); - multipleAllowed.forEach(function(header) { + } + for (const header of multipleAllowed) { const sep = (header.toLowerCase() === 'cookie' ? '; ' : ', '); assert.strictEqual(req.headers[header.toLowerCase()], `foo${sep}bar`, `header parsed incorrectly: ${header}`); - }); + } res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('EOF'); diff --git a/test/parallel/test-http-server-multiple-client-error.js b/test/parallel/test-http-server-multiple-client-error.js new file mode 100644 index 00000000000000..4ac41d295e3d3e --- /dev/null +++ b/test/parallel/test-http-server-multiple-client-error.js @@ -0,0 +1,55 @@ +'use strict'; +const common = require('../common'); + +// Test that the `'clientError'` event can be emitted multiple times even if the +// socket is correctly destroyed and that no warning is raised. + +const assert = require('assert'); +const http = require('http'); +const net = require('net'); + +process.on('warning', common.mustNotCall()); + +function socketListener(socket) { + const firstByte = socket.read(1); + if (firstByte === null) { + socket.once('readable', () => { + socketListener(socket); + }); + return; + } + + socket.unshift(firstByte); + httpServer.emit('connection', socket); +} + +const netServer = net.createServer(socketListener); +const httpServer = http.createServer(common.mustNotCall()); + +httpServer.once('clientError', common.mustCall((err, socket) => { + assert.strictEqual(err.code, 'HPE_INVALID_METHOD'); + assert.strictEqual(err.rawPacket.toString(), 'Q'); + socket.destroy(); + + httpServer.once('clientError', common.mustCall((err) => { + assert.strictEqual(err.code, 'HPE_INVALID_METHOD'); + assert.strictEqual( + err.rawPacket.toString(), + 'WE http://example.com HTTP/1.1\r\n\r\n' + ); + })); +})); + +netServer.listen(0, common.mustCall(() => { + const socket = net.createConnection(netServer.address().port); + + socket.on('connect', common.mustCall(() => { + socket.end('QWE http://example.com HTTP/1.1\r\n\r\n'); + })); + + socket.on('close', () => { + netServer.close(); + }); + + socket.resume(); +})); diff --git a/test/parallel/test-http-server-non-utf8-header.js b/test/parallel/test-http-server-non-utf8-header.js index 331965ae38d0f8..8ce82ac4cada04 100644 --- a/test/parallel/test-http-server-non-utf8-header.js +++ b/test/parallel/test-http-server-non-utf8-header.js @@ -26,6 +26,27 @@ const nonUtf8ToLatin1 = Buffer.from(nonUtf8Header).toString('latin1'); })); } +{ + // Test multi-value header + const server = http.createServer(common.mustCall((req, res) => { + res.writeHead(200, [ + 'content-disposition', + [Buffer.from(nonUtf8Header).toString('binary')], + ]); + res.end('hello'); + })); + + server.listen(0, common.mustCall(() => { + http.get({ port: server.address().port }, (res) => { + assert.strictEqual(res.statusCode, 200); + assert.strictEqual(res.headers['content-disposition'], nonUtf8ToLatin1); + res.resume().on('end', common.mustCall(() => { + server.close(); + })); + }); + })); +} + { const server = http.createServer(common.mustCall((req, res) => { res.writeHead(200, [ diff --git a/test/parallel/test-http-socket-error-listeners.js b/test/parallel/test-http-socket-error-listeners.js index f0d220a5d9337a..558bb35882b6ad 100644 --- a/test/parallel/test-http-socket-error-listeners.js +++ b/test/parallel/test-http-socket-error-listeners.js @@ -1,5 +1,3 @@ -// Flags: --no-warnings - 'use strict'; const common = require('../common'); @@ -17,7 +15,7 @@ const net = require('net'); { let i = 0; let socket; - process.on('warning', common.mustCall()); + process.on('warning', common.mustNotCall()); const server = http.createServer(common.mustNotCall()); diff --git a/test/parallel/test-http-write-head-after-set-header.js b/test/parallel/test-http-write-head-after-set-header.js new file mode 100644 index 00000000000000..019a0aa50a2540 --- /dev/null +++ b/test/parallel/test-http-write-head-after-set-header.js @@ -0,0 +1,47 @@ +'use strict'; + +const common = require('../common'); +const Countdown = require('../common/countdown'); +const assert = require('assert'); +const { createServer, request } = require('http'); + +const server = createServer(common.mustCall((req, res) => { + if (req.url.includes('setHeader')) { + res.setHeader('set-val', 'abc'); + } + + res.writeHead(200, [ + 'array-val', '1', + 'array-val', '2', + ]); + + res.end(); +}, 2)); + +const countdown = new Countdown(2, () => server.close()); + +server.listen(0, common.mustCall(() => { + request({ + port: server.address().port + }, common.mustCall((res) => { + assert.deepStrictEqual(res.rawHeaders.slice(0, 4), [ + 'array-val', '1', + 'array-val', '2', + ]); + + countdown.dec(); + })).end(); + + request({ + port: server.address().port, + path: '/?setHeader' + }, common.mustCall((res) => { + assert.deepStrictEqual(res.rawHeaders.slice(0, 6), [ + 'set-val', 'abc', + 'array-val', '1', + 'array-val', '2', + ]); + + countdown.dec(); + })).end(); +})); diff --git a/test/parallel/test-http2-client-destroy.js b/test/parallel/test-http2-client-destroy.js index 6973cfa1df1e61..d7609fc33391ac 100644 --- a/test/parallel/test-http2-client-destroy.js +++ b/test/parallel/test-http2-client-destroy.js @@ -22,7 +22,7 @@ const { getEventListeners } = require('events'); server.close(); }); - destroyCallbacks.forEach((destroyCallback) => { + for (const destroyCallback of destroyCallbacks) { const client = h2.connect(`http://localhost:${server.address().port}`); client.on('connect', common.mustCall(() => { const socket = client[kSocket]; @@ -45,7 +45,7 @@ const { getEventListeners } = require('events'); countdown.dec(); })); - }); + } })); } diff --git a/test/parallel/test-http2-exceeds-server-trailer-size.js b/test/parallel/test-http2-exceeds-server-trailer-size.js index 87c1070afbb7a4..ae2bbc1dca08bf 100644 --- a/test/parallel/test-http2-exceeds-server-trailer-size.js +++ b/test/parallel/test-http2-exceeds-server-trailer-size.js @@ -43,9 +43,13 @@ server.listen(0, () => { const clientStream = clientSession.request(); clientStream.on('close', common.mustCall()); - // These events mustn't be called once the frame size error is from the server + clientStream.on('error', common.expectsError({ + code: 'ERR_HTTP2_STREAM_ERROR', + name: 'Error', + message: 'Stream closed with error code NGHTTP2_FRAME_SIZE_ERROR' + })); + // This event mustn't be called once the frame size error is from the server clientStream.on('frameError', common.mustNotCall()); - clientStream.on('error', common.mustNotCall()); clientStream.end(); }); diff --git a/test/parallel/test-http2-getpackedsettings.js b/test/parallel/test-http2-getpackedsettings.js index 4f5970522f13b3..05bf8eb6c1245d 100644 --- a/test/parallel/test-http2-getpackedsettings.js +++ b/test/parallel/test-http2-getpackedsettings.js @@ -29,6 +29,7 @@ assert.deepStrictEqual(val, check); ['maxHeaderListSize', 2 ** 32 - 1], ['maxHeaderSize', 0], ['maxHeaderSize', 2 ** 32 - 1], + ['customSettings', { '9999': 301 }], ].forEach((i) => { // Valid options should not throw. http2.getPackedSettings({ [i[0]]: i[1] }); @@ -93,6 +94,7 @@ http2.getPackedSettings({ enablePush: false }); 0x00, 0x05, 0x00, 0x00, 0x4e, 0x20, 0x00, 0x06, 0x00, 0x00, 0x00, 0x64, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x27, 0x0F, 0x00, 0x00, 0x01, 0x2d, ]); const packed = http2.getPackedSettings({ @@ -104,12 +106,90 @@ http2.getPackedSettings({ enablePush: false }); maxHeaderSize: 100, enablePush: true, enableConnectProtocol: false, - foo: 'ignored' + foo: 'ignored', + customSettings: { '9999': 301 } }); - assert.strictEqual(packed.length, 42); + assert.strictEqual(packed.length, 48); assert.deepStrictEqual(packed, check); } +// Check if multiple custom settings can be set +{ + const check = Buffer.from([ + 0x00, 0x01, 0x00, 0x00, 0x00, 0x64, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x03, 0x00, 0x00, 0x00, 0xc8, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x64, + 0x00, 0x05, 0x00, 0x00, 0x4e, 0x20, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x64, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x03, 0xf3, 0x00, 0x00, 0x07, 0x9F, + 0x0a, 0x2e, 0x00, 0x00, 0x00, 0x58, + ]); + + const packed = http2.getPackedSettings({ + headerTableSize: 100, + initialWindowSize: 100, + maxFrameSize: 20000, + maxConcurrentStreams: 200, + maxHeaderListSize: 100, + maxHeaderSize: 100, + enablePush: true, + enableConnectProtocol: false, + customSettings: { '2606': 88, '1011': 1951 } + }); + assert.strictEqual(packed.length, 54); + assert.deepStrictEqual(packed, check); +} + +{ + // Check if wrong custom settings cause an error + + assert.throws(() => { + http2.getPackedSettings({ + customSettings: { '-1': 659685 } + }); + }, { + code: 'ERR_HTTP2_INVALID_SETTING_VALUE', + name: 'RangeError' + }); + + assert.throws(() => { + http2.getPackedSettings({ + customSettings: { '10': 34577577777 } + }); + }, { + code: 'ERR_HTTP2_INVALID_SETTING_VALUE', + name: 'RangeError' + }); + + assert.throws(() => { + http2.getPackedSettings({ + customSettings: { 'notvalid': -777 } + }); + }, { + code: 'ERR_HTTP2_INVALID_SETTING_VALUE', + name: 'RangeError' + }); + + assert.throws(() => { + http2.getPackedSettings({ + customSettings: { '11': 11, '12': 12, '13': 13, '14': 14, '15': 15, '16': 16, + '17': 17, '18': 18, '19': 19, '20': 20, '21': 21 } + }); + }, { + code: 'ERR_HTTP2_TOO_MANY_CUSTOM_SETTINGS' + }); + assert.throws(() => { + http2.getPackedSettings({ + customSettings: { '11': 11, '12': 12, '13': 13, '14': 14, '15': 15, '16': 16, + '17': 17, '18': 18, '19': 19, '20': 20, '21': 21, '22': 22 } + }); + }, { + code: 'ERR_HTTP2_TOO_MANY_CUSTOM_SETTINGS' + }); +} + // Check for not passing settings. { const packed = http2.getPackedSettings(); @@ -124,7 +204,8 @@ http2.getPackedSettings({ enablePush: false }); 0x00, 0x04, 0x00, 0x00, 0x00, 0x64, 0x00, 0x06, 0x00, 0x00, 0x00, 0x64, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x00]); + 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x27, 0x0F, 0x00, 0x00, 0x01, 0x2d]); [1, true, '', [], {}, NaN].forEach((input) => { assert.throws(() => { @@ -157,6 +238,7 @@ http2.getPackedSettings({ enablePush: false }); assert.strictEqual(settings.maxHeaderSize, 100); assert.strictEqual(settings.enablePush, true); assert.strictEqual(settings.enableConnectProtocol, false); + assert.deepStrictEqual(settings.customSettings, { '9999': 301 }); } { diff --git a/test/parallel/test-http2-server-shutdown-options-errors.js b/test/parallel/test-http2-server-shutdown-options-errors.js index e6a69b54627e00..5a2ca62a6c8e31 100644 --- a/test/parallel/test-http2-server-shutdown-options-errors.js +++ b/test/parallel/test-http2-server-shutdown-options-errors.js @@ -19,7 +19,7 @@ const types = [ server.on('stream', common.mustCall((stream) => { const session = stream.session; - types.forEach((input) => { + for (const input of types) { const received = common.invalidArgTypeHelper(input); assert.throws( () => session.goaway(input), @@ -48,7 +48,7 @@ server.on('stream', common.mustCall((stream) => { `TypedArray, or DataView.${received}` } ); - }); + } stream.session.destroy(); })); diff --git a/test/parallel/test-http2-session-settings.js b/test/parallel/test-http2-session-settings.js index 571ee87d93768c..bcf78c6aa512a0 100644 --- a/test/parallel/test-http2-session-settings.js +++ b/test/parallel/test-http2-session-settings.js @@ -104,15 +104,15 @@ server.listen( ['maxHeaderListSize', 2 ** 32], ['maxHeaderSize', -1], ['maxHeaderSize', 2 ** 32], - ].forEach((i) => { + ].forEach(([key, value]) => { const settings = {}; - settings[i[0]] = i[1]; + settings[key] = value; assert.throws( () => client.settings(settings), { name: 'RangeError', code: 'ERR_HTTP2_INVALID_SETTING_VALUE', - message: `Invalid value for setting "${i[0]}": ${i[1]}` + message: `Invalid value for setting "${key}": ${value}` } ); }); diff --git a/test/parallel/test-http2-single-headers.js b/test/parallel/test-http2-single-headers.js index c10623b9be7bf0..36ad8c3b419f4e 100644 --- a/test/parallel/test-http2-single-headers.js +++ b/test/parallel/test-http2-single-headers.js @@ -27,7 +27,7 @@ server.on('stream', common.mustNotCall()); server.listen(0, common.mustCall(() => { const client = http2.connect(`http://localhost:${server.address().port}`); - singles.forEach((i) => { + for (const i of singles) { assert.throws( () => client.request({ [i]: 'abc', [i.toUpperCase()]: 'xyz' }), { @@ -45,7 +45,7 @@ server.listen(0, common.mustCall(() => { message: `Header field "${i}" must only have a single value` } ); - }); + } server.close(); client.close(); diff --git a/test/known_issues/test-http2-trailers-after-session-close.js b/test/parallel/test-http2-trailers-after-session-close.js similarity index 89% rename from test/known_issues/test-http2-trailers-after-session-close.js rename to test/parallel/test-http2-trailers-after-session-close.js index 3d5be11e5b5185..f7c7387eb01380 100644 --- a/test/known_issues/test-http2-trailers-after-session-close.js +++ b/test/parallel/test-http2-trailers-after-session-close.js @@ -3,9 +3,6 @@ // Fixes: https://github.com/nodejs/node/issues/42713 const common = require('../common'); if (!common.hasCrypto) { - // Remove require('assert').fail when issue is fixed and test - // is moved out of the known_issues directory. - require('assert').fail('missing crypto'); common.skip('missing crypto'); } const assert = require('assert'); diff --git a/test/parallel/test-http2-update-settings.js b/test/parallel/test-http2-update-settings.js index e99ee2bcf150d8..98b1a3790c3781 100644 --- a/test/parallel/test-http2-update-settings.js +++ b/test/parallel/test-http2-update-settings.js @@ -19,7 +19,8 @@ testUpdateSettingsWith({ 'maxHeaderListSize': 1, 'maxFrameSize': 16385, 'enablePush': false, - 'enableConnectProtocol': true + 'enableConnectProtocol': true, + 'customSettings': { '9999': 301 } } }); testUpdateSettingsWith({ diff --git a/test/parallel/test-https-simple.js b/test/parallel/test-https-simple.js index a65883162f60a2..b0562a1cd98174 100644 --- a/test/parallel/test-https-simple.js +++ b/test/parallel/test-https-simple.js @@ -45,13 +45,13 @@ const serverCallback = common.mustCall(function(req, res) { }); const invalid_options = [ 'foo', 42, true, [] ]; -invalid_options.forEach((option) => { +for (const option of invalid_options) { assert.throws(() => { new https.Server(option); }, { code: 'ERR_INVALID_ARG_TYPE', }); -}); +} const server = https.createServer(options, serverCallback); diff --git a/test/parallel/test-icu-env.js b/test/parallel/test-icu-env.js index 45b9fea8dbd8c8..d453281bd726f8 100644 --- a/test/parallel/test-icu-env.js +++ b/test/parallel/test-icu-env.js @@ -123,19 +123,19 @@ if (isMockable) { locales.map((LANG) => runEnvOutside({ LANG, TZ: 'Europe/Zurich' }, 'new Date(333333333333).toLocaleString()')), [ '7/25/1980, 1:35:33 AM', - '1980/7/25 01:35:33', + '1980/7/25 1:35:33', '25/7/1980, 1:35:33 am', '25/7/1980, 1:35:33', - '25/07/1980 01:35:33', + '25/07/1980 1:35:33', '٢٥‏/٧‏/١٩٨٠، ١:٣٥:٣٣ ص', '২৫/৭/১৯৮০, ১:৩৫:৩৩ AM', - '25.07.1980, 01:35:33', - '25/07/1980, 01:35:33', + '25.07.1980, 1:35:33', + '25/07/1980, 1:35:33', '25/7/1980، 1:35:33 AM', '25/7/1980, 01.35.33', - '25.7.1980, 01:35:33', + '25.7.1980, 1:35:33', '1980/7/25 1:35:33', - '25/7/1980 01:35:33', + '25/7/1980 1:35:33', '२५/७/१९८०, १:३५:३३ AM', '25/7/1980 1:35:33 AM', ] diff --git a/test/parallel/test-macos-app-sandbox.js b/test/parallel/test-macos-app-sandbox.js index 91485b75983f84..60ad67b3db3790 100644 --- a/test/parallel/test-macos-app-sandbox.js +++ b/test/parallel/test-macos-app-sandbox.js @@ -17,6 +17,10 @@ const nodeBinary = process.execPath; tmpdir.refresh(); +if (!tmpdir.hasEnoughSpace(120 * 1024 * 1024)) { + common.skip('Available disk space < 120MB'); +} + const appBundlePath = tmpdir.resolve('node_sandboxed.app'); const appBundleContentPath = path.join(appBundlePath, 'Contents'); const appExecutablePath = path.join( diff --git a/test/parallel/test-messagechannel.js b/test/parallel/test-messagechannel.js new file mode 100644 index 00000000000000..4f92924daa5048 --- /dev/null +++ b/test/parallel/test-messagechannel.js @@ -0,0 +1,12 @@ +'use strict'; + +const common = require('../common'); + +// See: https://github.com/nodejs/node/issues/49940 +(async () => { + new MessageChannel().port1.postMessage({}, { + transfer: { + *[Symbol.iterator]() {} + } + }); +})().then(common.mustCall()); diff --git a/test/parallel/test-mime-api.js b/test/parallel/test-mime-api.js index 0fabd1a4cce35f..30272e5aa64df5 100644 --- a/test/parallel/test-mime-api.js +++ b/test/parallel/test-mime-api.js @@ -4,8 +4,6 @@ require('../common'); const assert = require('assert'); const { MIMEType, MIMEParams } = require('util'); -const { toASCIILower } = require('internal/mime'); - const WHITESPACES = '\t\n\f\r '; const NOT_HTTP_TOKEN_CODE_POINT = ','; @@ -160,8 +158,3 @@ assert.throws(() => params.set(`x${NOT_HTTP_TOKEN_CODE_POINT}`, 'x'), /parameter assert.throws(() => params.set('x', `${NOT_HTTP_QUOTED_STRING_CODE_POINT};`), /parameter value/i); assert.throws(() => params.set('x', `${NOT_HTTP_QUOTED_STRING_CODE_POINT}x`), /parameter value/i); assert.throws(() => params.set('x', `x${NOT_HTTP_QUOTED_STRING_CODE_POINT}`), /parameter value/i); - -assert.strictEqual(toASCIILower('someThing'), 'something'); -assert.strictEqual(toASCIILower('SomeThing'), 'something'); -assert.strictEqual(toASCIILower('SomeThing3'), 'something3'); -assert.strictEqual(toASCIILower('ABCDEFGHIJKLMNOPQRSTUVWXYZ'), 'abcdefghijklmnopqrstuvwxyz'); diff --git a/test/parallel/test-module-binding.js b/test/parallel/test-module-binding.js deleted file mode 100644 index d7f76d6ef5b153..00000000000000 --- a/test/parallel/test-module-binding.js +++ /dev/null @@ -1,29 +0,0 @@ -// Flags: --expose-internals -'use strict'; -require('../common'); -const fixtures = require('../common/fixtures'); -const { internalBinding } = require('internal/test/binding'); -const { filterOwnProperties } = require('internal/util'); -const { internalModuleReadJSON } = internalBinding('fs'); -const { readFileSync } = require('fs'); -const { strictEqual, deepStrictEqual } = require('assert'); - -{ - strictEqual(internalModuleReadJSON('nosuchfile'), undefined); -} -{ - strictEqual(internalModuleReadJSON(fixtures.path('empty.txt')), ''); -} -{ - strictEqual(internalModuleReadJSON(fixtures.path('empty-with-bom.txt')), ''); -} -{ - const filename = fixtures.path('require-bin/package.json'); - const returnValue = JSON.parse(internalModuleReadJSON(filename)); - const file = JSON.parse(readFileSync(filename, 'utf-8')); - const expectedValue = filterOwnProperties(file, ['name', 'main', 'exports', 'imports', 'type']); - deepStrictEqual({ - __proto__: null, - ...returnValue, - }, expectedValue); -} diff --git a/test/parallel/test-navigator.js b/test/parallel/test-navigator.js index 300446f2c5dcdc..b280a047d1c410 100644 --- a/test/parallel/test-navigator.js +++ b/test/parallel/test-navigator.js @@ -1,7 +1,11 @@ +// Flags: --expose-internals + 'use strict'; -require('../common'); +const common = require('../common'); const assert = require('assert'); +const { getNavigatorPlatform } = require('internal/navigator'); +const { execFile } = require('child_process'); const is = { number: (value, key) => { @@ -13,3 +17,106 @@ const is = { is.number(+navigator.hardwareConcurrency, 'hardwareConcurrency'); is.number(navigator.hardwareConcurrency, 'hardwareConcurrency'); assert.ok(navigator.hardwareConcurrency > 0); +assert.strictEqual(typeof navigator.userAgent, 'string'); +assert.match(navigator.userAgent, /^Node\.js\/\d+$/); + +assert.strictEqual(typeof navigator.platform, 'string'); +if (process.platform === 'darwin') { + assert.strictEqual(navigator.platform, 'MacIntel'); +} else if (process.platform === 'win32') { + assert.strictEqual(navigator.platform, 'Win32'); +} else if (process.platform === 'linux' && process.arch === 'ia32') { + assert.strictEqual(navigator.platform, 'Linux i686'); +} else if (process.platform === 'linux' && process.arch === 'x64') { + assert.strictEqual(navigator.platform, 'Linux x86_64'); +} else if (process.platform === 'freebsd') { + if (process.arch === 'ia32') { + assert.strictEqual(navigator.platform, 'FreeBSD i386'); + } else if (process.arch === 'x64') { + assert.strictEqual(navigator.platform, 'FreeBSD amd64'); + } else { + assert.strictEqual(navigator.platform, `FreeBSD ${process.arch}`); + } +} else if (process.platform === 'openbsd') { + if (process.arch === 'ia32') { + assert.strictEqual(navigator.platform, 'OpenBSD i386'); + } else if (process.arch === 'x64') { + assert.strictEqual(navigator.platform, 'OpenBSD amd64'); + } else { + assert.strictEqual(navigator.platform, `OpenBSD ${process.arch}`); + } +} else if (process.platform === 'sunos') { + if (process.arch === 'ia32') { + assert.strictEqual(navigator.platform, 'SunOS i86pc'); + } else { + assert.strictEqual(navigator.platform, `SunOS ${process.arch}`); + } +} else if (process.platform === 'aix') { + assert.strictEqual(navigator.platform, 'AIX'); +} else { + assert.strictEqual(navigator.platform, `${process.platform[0].toUpperCase()}${process.platform.slice(1)} ${process.arch}`); +} + +assert.strictEqual(getNavigatorPlatform({ arch: 'x64', platform: 'darwin' }), 'MacIntel'); +assert.strictEqual(getNavigatorPlatform({ arch: 'arm64', platform: 'darwin' }), 'MacIntel'); +assert.strictEqual(getNavigatorPlatform({ arch: 'ia32', platform: 'linux' }), 'Linux i686'); +assert.strictEqual(getNavigatorPlatform({ arch: 'x64', platform: 'linux' }), 'Linux x86_64'); +assert.strictEqual(getNavigatorPlatform({ arch: 'arm64', platform: 'linux' }), 'Linux arm64'); +assert.strictEqual(getNavigatorPlatform({ arch: 'ia32', platform: 'win32' }), 'Win32'); +assert.strictEqual(getNavigatorPlatform({ arch: 'x64', platform: 'win32' }), 'Win32'); +assert.strictEqual(getNavigatorPlatform({ arch: 'arm64', platform: 'win32' }), 'Win32'); +assert.strictEqual(getNavigatorPlatform({ arch: 'ia32', platform: 'freebsd' }), 'FreeBSD i386'); +assert.strictEqual(getNavigatorPlatform({ arch: 'x64', platform: 'freebsd' }), 'FreeBSD amd64'); +assert.strictEqual(getNavigatorPlatform({ arch: 'arm64', platform: 'freebsd' }), 'FreeBSD arm64'); +assert.strictEqual(getNavigatorPlatform({ arch: 'ia32', platform: 'openbsd' }), 'OpenBSD i386'); +assert.strictEqual(getNavigatorPlatform({ arch: 'x64', platform: 'openbsd' }), 'OpenBSD amd64'); +assert.strictEqual(getNavigatorPlatform({ arch: 'arm64', platform: 'openbsd' }), 'OpenBSD arm64'); +assert.strictEqual(getNavigatorPlatform({ arch: 'ia32', platform: 'sunos' }), 'SunOS i86pc'); +assert.strictEqual(getNavigatorPlatform({ arch: 'x64', platform: 'sunos' }), 'SunOS x64'); +assert.strictEqual(getNavigatorPlatform({ arch: 'ppc', platform: 'aix' }), 'AIX'); +assert.strictEqual(getNavigatorPlatform({ arch: 'x64', platform: 'reactos' }), 'Reactos x64'); + +assert.strictEqual(typeof navigator.language, 'string'); +assert.strictEqual(navigator.language.length !== 0, true); + +assert.ok(Array.isArray(navigator.languages)); +assert.strictEqual(navigator.languages.length, 1); +assert.strictEqual(typeof navigator.languages[0], 'string'); +assert.strictEqual(navigator.languages[0].length !== 0, true); + +assert.throws(() => { + navigator.languages[0] = 'foo'; +}, new TypeError("Cannot assign to read only property '0' of object '[object Array]'")); +assert.notStrictEqual(navigator.languages[0], 'foo'); +assert.strictEqual(typeof navigator.languages[0] === 'string', true); +assert.strictEqual(navigator.languages[0].length !== 0, true); + +if (common.hasIntl && common.isWindows === false) { + const testLocale = navigator.language === 'de-DE' ? + 'en-US' : + 'de-DE'; + { + const env = { ...process.env, LC_ALL: testLocale }; + execFile( + process.execPath, + ['--print', `"process.exit(navigator.language === '${testLocale}' ? 0 : 1)"`], + { env }, + common.mustSucceed() + ); + } + + { + const env = { ...process.env, LC_ALL: testLocale }; + execFile( + process.execPath, + ['--print', `"process.exit(navigator.languages[0] === '${testLocale}' ? 0 : 1)"`], + { env }, + common.mustSucceed() + ); + } +} + +Object.defineProperty(navigator, 'language', { value: 'for-testing' }); +assert.strictEqual(navigator.language, 'for-testing'); +assert.strictEqual(navigator.languages.length, 1); +assert.strictEqual(navigator.languages[0] !== 'for-testing', true); diff --git a/test/parallel/test-net-autoselectfamily-commandline-option.js b/test/parallel/test-net-autoselectfamily-commandline-option.js index 47ad69566d5c16..bf98d5f756e427 100644 --- a/test/parallel/test-net-autoselectfamily-commandline-option.js +++ b/test/parallel/test-net-autoselectfamily-commandline-option.js @@ -3,100 +3,46 @@ // Flags: --no-network-family-autoselection const common = require('../common'); -const { parseDNSPacket, writeDNSPacket } = require('../common/dns'); +const { createMockedLookup } = require('../common/dns'); const assert = require('assert'); -const dgram = require('dgram'); -const { Resolver } = require('dns'); const { createConnection, createServer } = require('net'); -// Test that happy eyeballs algorithm can be enable from command line. - -function _lookup(resolver, hostname, options, cb) { - resolver.resolve(hostname, 'ANY', (err, replies) => { - assert.notStrictEqual(options.family, 4); - - if (err) { - return cb(err); - } - - const hosts = replies - .map((r) => ({ address: r.address, family: r.type === 'AAAA' ? 6 : 4 })) - .sort((a, b) => b.family - a.family); - - if (options.all === true) { - return cb(null, hosts); - } - - return cb(null, hosts[0].address, hosts[0].family); - }); -} - -function createDnsServer(ipv6Addr, ipv4Addr, cb) { - // Create a DNS server which replies with a AAAA and a A record for the same host - const socket = dgram.createSocket('udp4'); - - socket.on('message', common.mustCall((msg, { address, port }) => { - const parsed = parseDNSPacket(msg); - const domain = parsed.questions[0].domain; - assert.strictEqual(domain, 'example.org'); - - socket.send(writeDNSPacket({ - id: parsed.id, - questions: parsed.questions, - answers: [ - { type: 'AAAA', address: ipv6Addr, ttl: 123, domain: 'example.org' }, - { type: 'A', address: ipv4Addr, ttl: 123, domain: 'example.org' }, - ] - }), port, address); - })); - - socket.bind(0, () => { - const resolver = new Resolver(); - resolver.setServers([`127.0.0.1:${socket.address().port}`]); - - cb({ dnsServer: socket, lookup: _lookup.bind(null, resolver) }); - }); -} - // Test that IPV4 is NOT reached if IPV6 is not reachable and the option has been disabled via command line { - createDnsServer('::1', '127.0.0.1', common.mustCall(function({ dnsServer, lookup }) { - const ipv4Server = createServer((socket) => { - socket.on('data', common.mustCall(() => { - socket.write('response-ipv4'); - socket.end(); - })); - }); - - ipv4Server.listen(0, '127.0.0.1', common.mustCall(() => { - const port = ipv4Server.address().port; - - const connection = createConnection({ - host: 'example.org', - port, - lookup, - }); + const ipv4Server = createServer((socket) => { + socket.on('data', common.mustCall(() => { + socket.write('response-ipv4'); + socket.end(); + })); + }); - connection.on('ready', common.mustNotCall()); - connection.on('error', common.mustCall((error) => { - assert.strictEqual(connection.autoSelectFamilyAttemptedAddresses, undefined); + ipv4Server.listen(0, '127.0.0.1', common.mustCall(() => { + const port = ipv4Server.address().port; - if (common.hasIPv6) { - assert.strictEqual(error.code, 'ECONNREFUSED'); - assert.strictEqual(error.message, `connect ECONNREFUSED ::1:${port}`); - } else if (error.code === 'EAFNOSUPPORT') { - assert.strictEqual(error.message, `connect EAFNOSUPPORT ::1:${port} - Local (undefined:undefined)`); - } else if (error.code === 'EUNATCH') { - assert.strictEqual(error.message, `connect EUNATCH ::1:${port} - Local (:::0)`); - } else { - assert.strictEqual(error.code, 'EADDRNOTAVAIL'); - assert.strictEqual(error.message, `connect EADDRNOTAVAIL ::1:${port} - Local (:::0)`); - } + const connection = createConnection({ + host: 'example.org', + port, + lookup: createMockedLookup('::1', '127.0.0.1'), + }); - ipv4Server.close(); - dnsServer.close(); - })); + connection.on('ready', common.mustNotCall()); + connection.on('error', common.mustCall((error) => { + assert.strictEqual(connection.autoSelectFamilyAttemptedAddresses, undefined); + + if (common.hasIPv6) { + assert.strictEqual(error.code, 'ECONNREFUSED'); + assert.strictEqual(error.message, `connect ECONNREFUSED ::1:${port}`); + } else if (error.code === 'EAFNOSUPPORT') { + assert.strictEqual(error.message, `connect EAFNOSUPPORT ::1:${port} - Local (undefined:undefined)`); + } else if (error.code === 'EUNATCH') { + assert.strictEqual(error.message, `connect EUNATCH ::1:${port} - Local (:::0)`); + } else { + assert.strictEqual(error.code, 'EADDRNOTAVAIL'); + assert.strictEqual(error.message, `connect EADDRNOTAVAIL ::1:${port} - Local (:::0)`); + } + + ipv4Server.close(); })); })); } diff --git a/test/parallel/test-net-autoselectfamily-default.js b/test/parallel/test-net-autoselectfamily-default.js index 3fb95a08313c6c..b0b41fb7037d2f 100644 --- a/test/parallel/test-net-autoselectfamily-default.js +++ b/test/parallel/test-net-autoselectfamily-default.js @@ -1,140 +1,83 @@ 'use strict'; const common = require('../common'); -const { parseDNSPacket, writeDNSPacket } = require('../common/dns'); +const { createMockedLookup } = require('../common/dns'); const assert = require('assert'); -const dgram = require('dgram'); -const { Resolver } = require('dns'); const { createConnection, createServer, setDefaultAutoSelectFamily } = require('net'); -// Test that the default for happy eyeballs algorithm is properly respected. - const autoSelectFamilyAttemptTimeout = common.defaultAutoSelectFamilyAttemptTimeout; -function _lookup(resolver, hostname, options, cb) { - resolver.resolve(hostname, 'ANY', (err, replies) => { - assert.notStrictEqual(options.family, 4); - - if (err) { - return cb(err); - } - - const hosts = replies - .map((r) => ({ address: r.address, family: r.type === 'AAAA' ? 6 : 4 })) - .sort((a, b) => b.family - a.family); - - if (options.all === true) { - return cb(null, hosts); - } - - return cb(null, hosts[0].address, hosts[0].family); - }); -} - -function createDnsServer(ipv6Addr, ipv4Addr, cb) { - // Create a DNS server which replies with a AAAA and a A record for the same host - const socket = dgram.createSocket('udp4'); - - socket.on('message', common.mustCall((msg, { address, port }) => { - const parsed = parseDNSPacket(msg); - const domain = parsed.questions[0].domain; - assert.strictEqual(domain, 'example.org'); - - socket.send(writeDNSPacket({ - id: parsed.id, - questions: parsed.questions, - answers: [ - { type: 'AAAA', address: ipv6Addr, ttl: 123, domain: 'example.org' }, - { type: 'A', address: ipv4Addr, ttl: 123, domain: 'example.org' }, - ] - }), port, address); - })); - - socket.bind(0, () => { - const resolver = new Resolver(); - resolver.setServers([`127.0.0.1:${socket.address().port}`]); - - cb({ dnsServer: socket, lookup: _lookup.bind(null, resolver) }); - }); -} - // Test that IPV4 is reached by default if IPV6 is not reachable and the default is enabled { - createDnsServer('::1', '127.0.0.1', common.mustCall(function({ dnsServer, lookup }) { - const ipv4Server = createServer((socket) => { - socket.on('data', common.mustCall(() => { - socket.write('response-ipv4'); - socket.end(); - })); - }); - - ipv4Server.listen(0, '127.0.0.1', common.mustCall(() => { - setDefaultAutoSelectFamily(true); + const ipv4Server = createServer((socket) => { + socket.on('data', common.mustCall(() => { + socket.write('response-ipv4'); + socket.end(); + })); + }); - const connection = createConnection({ - host: 'example.org', - port: ipv4Server.address().port, - lookup, - autoSelectFamilyAttemptTimeout, - }); + ipv4Server.listen(0, '127.0.0.1', common.mustCall(() => { + setDefaultAutoSelectFamily(true); - let response = ''; - connection.setEncoding('utf-8'); + const connection = createConnection({ + host: 'example.org', + port: ipv4Server.address().port, + lookup: createMockedLookup('::1', '127.0.0.1'), + autoSelectFamilyAttemptTimeout, + }); - connection.on('data', (chunk) => { - response += chunk; - }); + let response = ''; + connection.setEncoding('utf-8'); - connection.on('end', common.mustCall(() => { - assert.strictEqual(response, 'response-ipv4'); - ipv4Server.close(); - dnsServer.close(); - })); + connection.on('data', (chunk) => { + response += chunk; + }); - connection.write('request'); + connection.on('end', common.mustCall(() => { + assert.strictEqual(response, 'response-ipv4'); + ipv4Server.close(); })); + + connection.write('request'); })); } // Test that IPV4 is not reached by default if IPV6 is not reachable and the default is disabled { - createDnsServer('::1', '127.0.0.1', common.mustCall(function({ dnsServer, lookup }) { - const ipv4Server = createServer((socket) => { - socket.on('data', common.mustCall(() => { - socket.write('response-ipv4'); - socket.end(); - })); + const ipv4Server = createServer((socket) => { + socket.on('data', common.mustCall(() => { + socket.write('response-ipv4'); + socket.end(); + })); + }); + + ipv4Server.listen(0, '127.0.0.1', common.mustCall(() => { + setDefaultAutoSelectFamily(false); + + const port = ipv4Server.address().port; + + const connection = createConnection({ + host: 'example.org', + port, + lookup: createMockedLookup('::1', '127.0.0.1'), }); - ipv4Server.listen(0, '127.0.0.1', common.mustCall(() => { - setDefaultAutoSelectFamily(false); - - const port = ipv4Server.address().port; - - const connection = createConnection({ - host: 'example.org', - port, - lookup, - }); - - connection.on('ready', common.mustNotCall()); - connection.on('error', common.mustCall((error) => { - if (common.hasIPv6) { - assert.strictEqual(error.code, 'ECONNREFUSED'); - assert.strictEqual(error.message, `connect ECONNREFUSED ::1:${port}`); - } else if (error.code === 'EAFNOSUPPORT') { - assert.strictEqual(error.message, `connect EAFNOSUPPORT ::1:${port} - Local (undefined:undefined)`); - } else if (error.code === 'EUNATCH') { - assert.strictEqual(error.message, `connect EUNATCH ::1:${port} - Local (:::0)`); - } else { - assert.strictEqual(error.code, 'EADDRNOTAVAIL'); - assert.strictEqual(error.message, `connect EADDRNOTAVAIL ::1:${port} - Local (:::0)`); - } - - ipv4Server.close(); - dnsServer.close(); - })); + connection.on('ready', common.mustNotCall()); + connection.on('error', common.mustCall((error) => { + if (common.hasIPv6) { + assert.strictEqual(error.code, 'ECONNREFUSED'); + assert.strictEqual(error.message, `connect ECONNREFUSED ::1:${port}`); + } else if (error.code === 'EAFNOSUPPORT') { + assert.strictEqual(error.message, `connect EAFNOSUPPORT ::1:${port} - Local (undefined:undefined)`); + } else if (error.code === 'EUNATCH') { + assert.strictEqual(error.message, `connect EUNATCH ::1:${port} - Local (:::0)`); + } else { + assert.strictEqual(error.code, 'EADDRNOTAVAIL'); + assert.strictEqual(error.message, `connect EADDRNOTAVAIL ::1:${port} - Local (:::0)`); + } + + ipv4Server.close(); })); })); } diff --git a/test/parallel/test-net-autoselectfamily-ipv4first.js b/test/parallel/test-net-autoselectfamily-ipv4first.js index 7c2e10213c4d28..f94af0d9eeeb81 100644 --- a/test/parallel/test-net-autoselectfamily-ipv4first.js +++ b/test/parallel/test-net-autoselectfamily-ipv4first.js @@ -1,105 +1,52 @@ 'use strict'; const common = require('../common'); -const { parseDNSPacket, writeDNSPacket } = require('../common/dns'); +const { createMockedLookup } = require('../common/dns'); const assert = require('assert'); -const dgram = require('dgram'); -const { Resolver } = require('dns'); const { createConnection, createServer } = require('net'); // Test that happy eyeballs algorithm is properly implemented when a A record is returned first. - -function _lookup(resolver, hostname, options, cb) { - resolver.resolve(hostname, 'ANY', (err, replies) => { - assert.notStrictEqual(options.family, 4); - - if (err) { - return cb(err); - } - - const hosts = replies - .map((r) => ({ address: r.address, family: r.type === 'AAAA' ? 6 : 4 })); - - if (options.all === true) { - return cb(null, hosts); - } - - return cb(null, hosts[0].address, hosts[0].family); +if (common.hasIPv6) { + const ipv4Server = createServer((socket) => { + socket.on('data', common.mustCall(() => { + socket.write('response-ipv4'); + socket.end(); + })); }); -} - -function createDnsServer(ipv6Addr, ipv4Addr, cb) { - // Create a DNS server which replies with a AAAA and a A record for the same host - const socket = dgram.createSocket('udp4'); - - socket.on('message', common.mustCall((msg, { address, port }) => { - const parsed = parseDNSPacket(msg); - const domain = parsed.questions[0].domain; - assert.strictEqual(domain, 'example.org'); - - socket.send(writeDNSPacket({ - id: parsed.id, - questions: parsed.questions, - answers: [ - { type: 'A', address: ipv4Addr, ttl: 123, domain: 'example.org' }, - { type: 'AAAA', address: ipv6Addr, ttl: 123, domain: 'example.org' }, - ] - }), port, address); - })); - - socket.bind(0, () => { - const resolver = new Resolver(); - resolver.setServers([`127.0.0.1:${socket.address().port}`]); - cb({ dnsServer: socket, lookup: _lookup.bind(null, resolver) }); + const ipv6Server = createServer((socket) => { + socket.on('data', common.mustNotCall(() => { + socket.write('response-ipv6'); + socket.end(); + })); }); -} -// Test that IPV6 is NOT reached if IPV4 is sorted first -if (common.hasIPv6) { - createDnsServer('::1', '127.0.0.1', common.mustCall(function({ dnsServer, lookup }) { - const ipv4Server = createServer((socket) => { - socket.on('data', common.mustCall(() => { - socket.write('response-ipv4'); - socket.end(); - })); - }); + ipv4Server.listen(0, '127.0.0.1', common.mustCall(() => { + const port = ipv4Server.address().port; - const ipv6Server = createServer((socket) => { - socket.on('data', common.mustNotCall(() => { - socket.write('response-ipv6'); - socket.end(); - })); - }); - - ipv4Server.listen(0, '127.0.0.1', common.mustCall(() => { - const port = ipv4Server.address().port; - - ipv6Server.listen(port, '::1', common.mustCall(() => { - const connection = createConnection({ - host: 'example.org', - port, - lookup, - autoSelectFamily: true, - }); + ipv6Server.listen(port, '::1', common.mustCall(() => { + const connection = createConnection({ + host: 'example.org', + port, + lookup: createMockedLookup('127.0.0.1', '::1'), + autoSelectFamily: true, + }); - let response = ''; - connection.setEncoding('utf-8'); + let response = ''; + connection.setEncoding('utf-8'); - connection.on('data', (chunk) => { - response += chunk; - }); + connection.on('data', (chunk) => { + response += chunk; + }); - connection.on('end', common.mustCall(() => { - assert.strictEqual(response, 'response-ipv4'); - ipv4Server.close(); - ipv6Server.close(); - dnsServer.close(); - })); - - connection.write('request'); + connection.on('end', common.mustCall(() => { + assert.strictEqual(response, 'response-ipv4'); + ipv4Server.close(); + ipv6Server.close(); })); + + connection.write('request'); })); })); } diff --git a/test/parallel/test-net-autoselectfamily.js b/test/parallel/test-net-autoselectfamily.js index f4b696fd192828..180ec9073eac89 100644 --- a/test/parallel/test-net-autoselectfamily.js +++ b/test/parallel/test-net-autoselectfamily.js @@ -1,93 +1,136 @@ 'use strict'; const common = require('../common'); -const { parseDNSPacket, writeDNSPacket } = require('../common/dns'); +const { createMockedLookup } = require('../common/dns'); const assert = require('assert'); -const dgram = require('dgram'); -const { Resolver } = require('dns'); const { createConnection, createServer } = require('net'); // Test that happy eyeballs algorithm is properly implemented. // Purposely not using setDefaultAutoSelectFamilyAttemptTimeout here to test the // parameter is correctly used in options. -// + // Some of the machines in the CI need more time to establish connection const autoSelectFamilyAttemptTimeout = common.defaultAutoSelectFamilyAttemptTimeout; -function _lookup(resolver, hostname, options, cb) { - resolver.resolve(hostname, 'ANY', (err, replies) => { - assert.notStrictEqual(options.family, 4); +// Test that IPV4 is reached if IPV6 is not reachable +{ + const ipv4Server = createServer((socket) => { + socket.on('data', common.mustCall(() => { + socket.write('response-ipv4'); + socket.end(); + })); + }); - if (err) { - return cb(err); - } + ipv4Server.listen(0, '127.0.0.1', common.mustCall(() => { + const port = ipv4Server.address().port; - const hosts = replies - .map((r) => ({ address: r.address, family: r.type === 'AAAA' ? 6 : 4 })) - .sort((a, b) => b.family - a.family); + const connection = createConnection({ + host: 'example.org', + port: port, + lookup: createMockedLookup('::1', '127.0.0.1'), + autoSelectFamily: true, + autoSelectFamilyAttemptTimeout, + }); - if (options.all === true) { - return cb(null, hosts); - } + let response = ''; + connection.setEncoding('utf-8'); - return cb(null, hosts[0].address, hosts[0].family); - }); -} + connection.on('ready', common.mustCall(() => { + assert.deepStrictEqual(connection.autoSelectFamilyAttemptedAddresses, [`::1:${port}`, `127.0.0.1:${port}`]); + })); -function createDnsServer(ipv6Addrs, ipv4Addrs, cb) { - if (!Array.isArray(ipv6Addrs)) { - ipv6Addrs = [ipv6Addrs]; - } - - if (!Array.isArray(ipv4Addrs)) { - ipv4Addrs = [ipv4Addrs]; - } - - // Create a DNS server which replies with a AAAA and a A record for the same host - const socket = dgram.createSocket('udp4'); - - socket.on('message', common.mustCall((msg, { address, port }) => { - const parsed = parseDNSPacket(msg); - const domain = parsed.questions[0].domain; - assert.strictEqual(domain, 'example.org'); - - socket.send(writeDNSPacket({ - id: parsed.id, - questions: parsed.questions, - answers: [ - ...ipv6Addrs.map((address) => ({ type: 'AAAA', address, ttl: 123, domain: 'example.org' })), - ...ipv4Addrs.map((address) => ({ type: 'A', address, ttl: 123, domain: 'example.org' })), - ] - }), port, address); - })); + connection.on('data', (chunk) => { + response += chunk; + }); - socket.bind(0, () => { - const resolver = new Resolver(); - resolver.setServers([`127.0.0.1:${socket.address().port}`]); + connection.on('end', common.mustCall(() => { + assert.strictEqual(response, 'response-ipv4'); + ipv4Server.close(); + })); - cb({ dnsServer: socket, lookup: _lookup.bind(null, resolver) }); - }); + connection.write('request'); + })); } -// Test that IPV4 is reached if IPV6 is not reachable +// Test that only the last successful connection is established. { - createDnsServer('::1', '127.0.0.1', common.mustCall(function({ dnsServer, lookup }) { - const ipv4Server = createServer((socket) => { - socket.on('data', common.mustCall(() => { - socket.write('response-ipv4'); - socket.end(); - })); + const ipv4Server = createServer((socket) => { + socket.on('data', common.mustCall(() => { + socket.write('response-ipv4'); + socket.end(); + })); + }); + + ipv4Server.listen(0, '127.0.0.1', common.mustCall(() => { + const port = ipv4Server.address().port; + + const connection = createConnection({ + host: 'example.org', + port: port, + lookup: createMockedLookup( + '2606:4700::6810:85e5', '2606:4700::6810:84e5', '::1', + '104.20.22.46', '104.20.23.46', '127.0.0.1', + ), + autoSelectFamily: true, + autoSelectFamilyAttemptTimeout, + }); + + let response = ''; + connection.setEncoding('utf-8'); + + connection.on('ready', common.mustCall(() => { + assert.deepStrictEqual( + connection.autoSelectFamilyAttemptedAddresses, + [ + `2606:4700::6810:85e5:${port}`, + `104.20.22.46:${port}`, + `2606:4700::6810:84e5:${port}`, + `104.20.23.46:${port}`, + `::1:${port}`, + `127.0.0.1:${port}`, + ] + ); + })); + + connection.on('data', (chunk) => { + response += chunk; }); - ipv4Server.listen(0, '127.0.0.1', common.mustCall(() => { - const port = ipv4Server.address().port; + connection.on('end', common.mustCall(() => { + assert.strictEqual(response, 'response-ipv4'); + ipv4Server.close(); + })); + + connection.write('request'); + })); +} + +// Test that IPV4 is NOT reached if IPV6 is reachable +if (common.hasIPv6) { + const ipv4Server = createServer((socket) => { + socket.on('data', common.mustNotCall(() => { + socket.write('response-ipv4'); + socket.end(); + })); + }); + + const ipv6Server = createServer((socket) => { + socket.on('data', common.mustCall(() => { + socket.write('response-ipv6'); + socket.end(); + })); + }); + + ipv4Server.listen(0, '127.0.0.1', common.mustCall(() => { + const port = ipv4Server.address().port; + ipv6Server.listen(port, '::1', common.mustCall(() => { const connection = createConnection({ host: 'example.org', - port: port, - lookup, + port, + lookup: createMockedLookup('::1', '127.0.0.1'), autoSelectFamily: true, autoSelectFamilyAttemptTimeout, }); @@ -96,7 +139,7 @@ function createDnsServer(ipv6Addrs, ipv4Addrs, cb) { connection.setEncoding('utf-8'); connection.on('ready', common.mustCall(() => { - assert.deepStrictEqual(connection.autoSelectFamilyAttemptedAddresses, [`::1:${port}`, `127.0.0.1:${port}`]); + assert.deepStrictEqual(connection.autoSelectFamilyAttemptedAddresses, [`::1:${port}`]); })); connection.on('data', (chunk) => { @@ -104,9 +147,9 @@ function createDnsServer(ipv6Addrs, ipv4Addrs, cb) { }); connection.on('end', common.mustCall(() => { - assert.strictEqual(response, 'response-ipv4'); + assert.strictEqual(response, 'response-ipv6'); ipv4Server.close(); - dnsServer.close(); + ipv6Server.close(); })); connection.write('request'); @@ -114,184 +157,67 @@ function createDnsServer(ipv6Addrs, ipv4Addrs, cb) { })); } -// Test that only the last successful connection is established. +// Test that when all errors are returned when no connections succeeded { - createDnsServer( - ['2606:4700::6810:85e5', '2606:4700::6810:84e5', '::1'], - ['104.20.22.46', '104.20.23.46', '127.0.0.1'], - common.mustCall(function({ dnsServer, lookup }) { - const ipv4Server = createServer((socket) => { - socket.on('data', common.mustCall(() => { - socket.write('response-ipv4'); - socket.end(); - })); - }); + const connection = createConnection({ + host: 'example.org', + port: 10, + lookup: createMockedLookup('::1', '127.0.0.1'), + autoSelectFamily: true, + autoSelectFamilyAttemptTimeout, + }); - ipv4Server.listen(0, '127.0.0.1', common.mustCall(() => { - const port = ipv4Server.address().port; - - const connection = createConnection({ - host: 'example.org', - port: port, - lookup, - autoSelectFamily: true, - autoSelectFamilyAttemptTimeout, - }); - - let response = ''; - connection.setEncoding('utf-8'); - - connection.on('ready', common.mustCall(() => { - assert.deepStrictEqual( - connection.autoSelectFamilyAttemptedAddresses, - [ - `2606:4700::6810:85e5:${port}`, - `104.20.22.46:${port}`, - `2606:4700::6810:84e5:${port}`, - `104.20.23.46:${port}`, - `::1:${port}`, - `127.0.0.1:${port}`, - ] - ); - })); - - connection.on('data', (chunk) => { - response += chunk; - }); - - connection.on('end', common.mustCall(() => { - assert.strictEqual(response, 'response-ipv4'); - ipv4Server.close(); - dnsServer.close(); - })); - - connection.write('request'); - })); - }) - ); -} + connection.on('ready', common.mustNotCall()); + connection.on('error', common.mustCall((error) => { + assert.deepStrictEqual(connection.autoSelectFamilyAttemptedAddresses, ['::1:10', '127.0.0.1:10']); + assert.strictEqual(error.constructor.name, 'AggregateError'); + assert.strictEqual(error.errors.length, 2); -// Test that IPV4 is NOT reached if IPV6 is reachable -if (common.hasIPv6) { - createDnsServer('::1', '127.0.0.1', common.mustCall(function({ dnsServer, lookup }) { - const ipv4Server = createServer((socket) => { - socket.on('data', common.mustNotCall(() => { - socket.write('response-ipv4'); - socket.end(); - })); - }); - - const ipv6Server = createServer((socket) => { - socket.on('data', common.mustCall(() => { - socket.write('response-ipv6'); - socket.end(); - })); - }); + const errors = error.errors.map((e) => e.message); + assert.ok(errors.includes('connect ECONNREFUSED 127.0.0.1:10')); - ipv4Server.listen(0, '127.0.0.1', common.mustCall(() => { - const port = ipv4Server.address().port; - - ipv6Server.listen(port, '::1', common.mustCall(() => { - const connection = createConnection({ - host: 'example.org', - port, - lookup, - autoSelectFamily: true, - autoSelectFamilyAttemptTimeout, - }); - - let response = ''; - connection.setEncoding('utf-8'); - - connection.on('ready', common.mustCall(() => { - assert.deepStrictEqual(connection.autoSelectFamilyAttemptedAddresses, [`::1:${port}`]); - })); - - connection.on('data', (chunk) => { - response += chunk; - }); - - connection.on('end', common.mustCall(() => { - assert.strictEqual(response, 'response-ipv6'); - ipv4Server.close(); - ipv6Server.close(); - dnsServer.close(); - })); - - connection.write('request'); - })); - })); + if (common.hasIPv6) { + assert.ok(errors.includes('connect ECONNREFUSED ::1:10')); + } })); } -// Test that when all errors are returned when no connections succeeded +// Test that the option can be disabled { - createDnsServer('::1', '127.0.0.1', common.mustCall(function({ dnsServer, lookup }) { + const ipv4Server = createServer((socket) => { + socket.on('data', common.mustCall(() => { + socket.write('response-ipv4'); + socket.end(); + })); + }); + + ipv4Server.listen(0, '127.0.0.1', common.mustCall(() => { + const port = ipv4Server.address().port; + const connection = createConnection({ host: 'example.org', - port: 10, - lookup, - autoSelectFamily: true, - autoSelectFamilyAttemptTimeout, + port, + lookup: createMockedLookup('::1', '127.0.0.1'), + autoSelectFamily: false, }); connection.on('ready', common.mustNotCall()); connection.on('error', common.mustCall((error) => { - assert.deepStrictEqual(connection.autoSelectFamilyAttemptedAddresses, ['::1:10', '127.0.0.1:10']); - assert.strictEqual(error.constructor.name, 'AggregateError'); - assert.strictEqual(error.errors.length, 2); - - const errors = error.errors.map((e) => e.message); - assert.ok(errors.includes('connect ECONNREFUSED 127.0.0.1:10')); + assert.strictEqual(connection.autoSelectFamilyAttemptedAddresses, undefined); if (common.hasIPv6) { - assert.ok(errors.includes('connect ECONNREFUSED ::1:10')); + assert.strictEqual(error.code, 'ECONNREFUSED'); + assert.strictEqual(error.message, `connect ECONNREFUSED ::1:${port}`); + } else if (error.code === 'EAFNOSUPPORT') { + assert.strictEqual(error.message, `connect EAFNOSUPPORT ::1:${port} - Local (undefined:undefined)`); + } else if (error.code === 'EUNATCH') { + assert.strictEqual(error.message, `connect EUNATCH ::1:${port} - Local (:::0)`); + } else { + assert.strictEqual(error.code, 'EADDRNOTAVAIL'); + assert.strictEqual(error.message, `connect EADDRNOTAVAIL ::1:${port} - Local (:::0)`); } - dnsServer.close(); - })); - })); -} - -// Test that the option can be disabled -{ - createDnsServer('::1', '127.0.0.1', common.mustCall(function({ dnsServer, lookup }) { - const ipv4Server = createServer((socket) => { - socket.on('data', common.mustCall(() => { - socket.write('response-ipv4'); - socket.end(); - })); - }); - - ipv4Server.listen(0, '127.0.0.1', common.mustCall(() => { - const port = ipv4Server.address().port; - - const connection = createConnection({ - host: 'example.org', - port, - lookup, - autoSelectFamily: false, - }); - - connection.on('ready', common.mustNotCall()); - connection.on('error', common.mustCall((error) => { - assert.strictEqual(connection.autoSelectFamilyAttemptedAddresses, undefined); - - if (common.hasIPv6) { - assert.strictEqual(error.code, 'ECONNREFUSED'); - assert.strictEqual(error.message, `connect ECONNREFUSED ::1:${port}`); - } else if (error.code === 'EAFNOSUPPORT') { - assert.strictEqual(error.message, `connect EAFNOSUPPORT ::1:${port} - Local (undefined:undefined)`); - } else if (error.code === 'EUNATCH') { - assert.strictEqual(error.message, `connect EUNATCH ::1:${port} - Local (:::0)`); - } else { - assert.strictEqual(error.code, 'EADDRNOTAVAIL'); - assert.strictEqual(error.message, `connect EADDRNOTAVAIL ::1:${port} - Local (:::0)`); - } - - ipv4Server.close(); - dnsServer.close(); - })); + ipv4Server.close(); })); })); } diff --git a/test/parallel/test-net-isipv4.js b/test/parallel/test-net-isipv4.js index 8f5c30569ce988..2c478e6ac678b7 100644 --- a/test/parallel/test-net-isipv4.js +++ b/test/parallel/test-net-isipv4.js @@ -37,10 +37,10 @@ const v4not = [ '192.168.0.2000000000', ]; -v4.forEach((ip) => { +for (const ip of v4) { assert.strictEqual(net.isIPv4(ip), true); -}); +} -v4not.forEach((ip) => { +for (const ip of v4not) { assert.strictEqual(net.isIPv4(ip), false); -}); +} diff --git a/test/parallel/test-node-output-sourcemaps.mjs b/test/parallel/test-node-output-sourcemaps.mjs index b01f30765c7de8..21060c3b342cf1 100644 --- a/test/parallel/test-node-output-sourcemaps.mjs +++ b/test/parallel/test-node-output-sourcemaps.mjs @@ -31,6 +31,7 @@ describe('sourcemaps output', { concurrency: true }, () => { { name: 'source-map/output/source_map_enclosing_function.js' }, { name: 'source-map/output/source_map_eval.js' }, { name: 'source-map/output/source_map_no_source_file.js' }, + { name: 'source-map/output/source_map_prepare_stack_trace.js' }, { name: 'source-map/output/source_map_reference_error_tabs.js' }, { name: 'source-map/output/source_map_sourcemapping_url_string.js' }, { name: 'source-map/output/source_map_throw_catch.js' }, diff --git a/test/parallel/test-node-output-v8-warning.mjs b/test/parallel/test-node-output-v8-warning.mjs new file mode 100644 index 00000000000000..8e497739d21c70 --- /dev/null +++ b/test/parallel/test-node-output-v8-warning.mjs @@ -0,0 +1,31 @@ +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import * as snapshot from '../common/assertSnapshot.js'; +import { describe, it } from 'node:test'; + +function replaceNodeVersion(str) { + return str.replaceAll(process.version, '*'); +} + +describe('v8 output', { concurrency: true }, () => { + function normalize(str) { + return str.replaceAll(snapshot.replaceWindowsPaths(process.cwd()), '') + .replaceAll(/:\d+/g, ':*') + .replaceAll('/', '*') + .replaceAll('*test*', '*') + .replaceAll(/.*?\*fixtures\*v8\*/g, '(node:*) V8: *') // Replace entire path before fixtures/v8 + .replaceAll('*fixtures*v8*', '*') + .replaceAll('node --', '* --'); + } + const common = snapshot + .transform(snapshot.replaceWindowsLineEndings, snapshot.replaceWindowsPaths, replaceNodeVersion); + const defaultTransform = snapshot.transform(common, normalize); + const tests = [ + { name: 'v8/v8_warning.js' }, + ]; + for (const { name } of tests) { + it(name, async () => { + await snapshot.spawnAndAssert(fixtures.path(name), defaultTransform); + }); + } +}); diff --git a/test/parallel/test-path-extname.js b/test/parallel/test-path-extname.js index 47b327d370d78e..be5a6316b0c7c3 100644 --- a/test/parallel/test-path-extname.js +++ b/test/parallel/test-path-extname.js @@ -6,7 +6,7 @@ const path = require('path'); const failures = []; const slashRE = /\//g; -[ +const testPaths = [ [__filename, '.js'], ['', ''], ['/path/to/file', ''], @@ -50,10 +50,13 @@ const slashRE = /\//g; ['file//', ''], ['file./', '.'], ['file.//', '.'], -].forEach((test) => { - const expected = test[1]; - [path.posix.extname, path.win32.extname].forEach((extname) => { - let input = test[0]; +]; + +for (const testPath of testPaths) { + const expected = testPath[1]; + const extNames = [path.posix.extname, path.win32.extname]; + for (const extname of extNames) { + let input = testPath[0]; let os; if (extname === path.win32.extname) { input = input.replace(slashRE, '\\'); @@ -66,16 +69,14 @@ const slashRE = /\//g; JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; if (actual !== expected) failures.push(`\n${message}`); - }); - { - const input = `C:${test[0].replace(slashRE, '\\')}`; - const actual = path.win32.extname(input); - const message = `path.win32.extname(${JSON.stringify(input)})\n expect=${ - JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; - if (actual !== expected) - failures.push(`\n${message}`); } -}); + const input = `C:${testPath[0].replace(slashRE, '\\')}`; + const actual = path.win32.extname(input); + const message = `path.win32.extname(${JSON.stringify(input)})\n expect=${ + JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; + if (actual !== expected) + failures.push(`\n${message}`); +} assert.strictEqual(failures.length, 0, failures.join('')); // On Windows, backslash is a path separator. diff --git a/test/parallel/test-path.js b/test/parallel/test-path.js index 7a5f3d4715a7f2..0cb55d42aa2999 100644 --- a/test/parallel/test-path.js +++ b/test/parallel/test-path.js @@ -35,8 +35,8 @@ function fail(fn) { }, { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError' }); } -typeErrorTests.forEach((test) => { - [path.posix, path.win32].forEach((namespace) => { +for (const test of typeErrorTests) { + for (const namespace of [path.posix, path.win32]) { fail(namespace.join, test); fail(namespace.resolve, test); fail(namespace.normalize, test); @@ -52,8 +52,8 @@ typeErrorTests.forEach((test) => { if (test !== undefined) { fail(namespace.basename, 'foo', test); } - }); -}); + } +} // path.sep tests // windows diff --git a/test/parallel/test-performance-function.js b/test/parallel/test-performance-function.js index 5f774d6c2adcf5..b69a21308cf048 100644 --- a/test/parallel/test-performance-function.js +++ b/test/parallel/test-performance-function.js @@ -90,14 +90,20 @@ const { } (async () => { + let _deadCode; + const histogram = createHistogram(); - const m = (a, b = 1) => {}; + const m = (a, b = 1) => { + for (let i = 0; i < 1e3; i++) + _deadCode = i; + }; const n = performance.timerify(m, { histogram }); assert.strictEqual(histogram.max, 0); for (let i = 0; i < 10; i++) { n(); await sleep(10); } + assert.ok(_deadCode >= 0); assert.notStrictEqual(histogram.max, 0); [1, '', {}, [], false].forEach((histogram) => { assert.throws(() => performance.timerify(m, { histogram }), { diff --git a/test/parallel/test-permission-allow-addons-cli.js b/test/parallel/test-permission-allow-addons-cli.js new file mode 100644 index 00000000000000..2254d9920cbe71 --- /dev/null +++ b/test/parallel/test-permission-allow-addons-cli.js @@ -0,0 +1,17 @@ +// Flags: --experimental-permission --allow-addons --allow-fs-read=* +'use strict'; + +const common = require('../common'); +common.skipIfWorker(); + +const { createRequire } = require('node:module'); +const assert = require('node:assert'); +const fixtures = require('../common/fixtures'); +const loadFixture = createRequire(fixtures.path('node_modules')); +// When a permission is set by cli, the process shouldn't be able +// to require native addons unless --allow-addons is sent +{ + // doesNotThrow + const msg = loadFixture('pkgexports/no-addons'); + assert.strictEqual(msg, 'using native addons'); +} diff --git a/test/parallel/test-permission-fs-absolute-path.js b/test/parallel/test-permission-fs-absolute-path.js new file mode 100644 index 00000000000000..b7897743941d2e --- /dev/null +++ b/test/parallel/test-permission-fs-absolute-path.js @@ -0,0 +1,31 @@ +// Flags: --experimental-permission --allow-fs-read=* --allow-child-process +'use strict'; + +const common = require('../common'); +const path = require('path'); +common.skipIfWorker(); + +const assert = require('assert'); +const { spawnSync } = require('child_process'); + +{ + // Relative path as CLI args are supported + const { status, stdout } = spawnSync( + process.execPath, + [ + '--experimental-permission', + '--allow-fs-read', '*', + '--allow-fs-write', path.resolve('../fixtures/permission/deny/regular-file.md'), + '-e', + ` + const path = require("path"); + const absolutePath = path.resolve("../fixtures/permission/deny/regular-file.md"); + console.log(process.permission.has("fs.write", absolutePath)); + `, + ] + ); + + const [fsWrite] = stdout.toString().split('\n'); + assert.strictEqual(fsWrite, 'true'); + assert.strictEqual(status, 0); +} diff --git a/test/parallel/test-permission-fs-relative-path.js b/test/parallel/test-permission-fs-relative-path.js index 74b4095e86663a..628e9918660088 100644 --- a/test/parallel/test-permission-fs-relative-path.js +++ b/test/parallel/test-permission-fs-relative-path.js @@ -8,7 +8,7 @@ const assert = require('assert'); const { spawnSync } = require('child_process'); { - // Relative path as CLI args are NOT supported yet + // Relative path as CLI args are supported const { status, stdout } = spawnSync( process.execPath, [ @@ -25,6 +25,6 @@ const { spawnSync } = require('child_process'); ); const [fsWrite] = stdout.toString().split('\n'); - assert.strictEqual(fsWrite, 'false'); + assert.strictEqual(fsWrite, 'true'); assert.strictEqual(status, 0); } diff --git a/test/parallel/test-permission-fs-symlink-relative.js b/test/parallel/test-permission-fs-symlink-relative.js new file mode 100644 index 00000000000000..4cc7d920593c23 --- /dev/null +++ b/test/parallel/test-permission-fs-symlink-relative.js @@ -0,0 +1,41 @@ +// Flags: --experimental-permission --allow-fs-read=* --allow-fs-write=* +'use strict'; + +const common = require('../common'); +common.skipIfWorker(); + +const assert = require('assert'); +const path = require('path'); +const { symlinkSync, symlink, promises: { symlink: symlinkAsync } } = require('fs'); + +const error = { + code: 'ERR_ACCESS_DENIED', + message: /relative symbolic link target/, +}; + +for (const targetString of ['a', './b/c', '../d', 'e/../f', 'C:drive-relative', 'ntfs:alternate']) { + for (const target of [targetString, Buffer.from(targetString)]) { + for (const path of [__filename, __dirname, process.execPath]) { + assert.throws(() => symlinkSync(target, path), error); + symlink(target, path, common.mustCall((err) => { + assert(err); + assert.strictEqual(err.code, error.code); + assert.match(err.message, error.message); + })); + assert.rejects(() => symlinkAsync(target, path), error).then(common.mustCall()); + } + } +} + +// Absolute should not throw +for (const targetString of [path.resolve('.')]) { + for (const target of [targetString, Buffer.from(targetString)]) { + for (const path of [__filename]) { + symlink(target, path, common.mustCall((err) => { + assert(err); + assert.strictEqual(err.code, 'EEXIST'); + assert.match(err.message, /file already exists/); + })); + } + } +} diff --git a/test/parallel/test-permission-fs-traversal-path.js b/test/parallel/test-permission-fs-traversal-path.js index 547cd81c77cf18..d618c3e4f79879 100644 --- a/test/parallel/test-permission-fs-traversal-path.js +++ b/test/parallel/test-permission-fs-traversal-path.js @@ -18,7 +18,7 @@ const tmpdir = require('../common/tmpdir'); const file = fixtures.path('permission', 'fs-traversal.js'); const blockedFolder = tmpdir.path; -const allowedFolder = tmpdir.resolve('subdirectory/'); +const allowedFolder = tmpdir.resolve('subdirectory'); const commonPathWildcard = path.join(__filename, '../../common*'); { diff --git a/test/parallel/test-permission-fs-wildcard.js b/test/parallel/test-permission-fs-wildcard.js index 0c81ff5da51b87..9b2608e99dc84b 100644 --- a/test/parallel/test-permission-fs-wildcard.js +++ b/test/parallel/test-permission-fs-wildcard.js @@ -98,3 +98,23 @@ if (common.isWindows) { ); assert.strictEqual(status, 0, stderr.toString()); } + +{ + if (!common.isWindows) { + const { status, stderr } = spawnSync( + process.execPath, + [ + '--experimental-permission', + '--allow-fs-read=/a/b/*', + '--allow-fs-read=/a/b/d', + '-e', + ` + const assert = require('assert') + assert.ok(process.permission.has('fs.read', '/a/b/c')); + assert.ok(!process.permission.has('fs.read', '/a/c/c')); + `, + ] + ); + assert.strictEqual(status, 0, stderr.toString()); + } +} diff --git a/test/parallel/test-permission-no-addons.js b/test/parallel/test-permission-no-addons.js new file mode 100644 index 00000000000000..4a1fc635a99bc7 --- /dev/null +++ b/test/parallel/test-permission-no-addons.js @@ -0,0 +1,17 @@ +// Flags: --experimental-permission --allow-fs-read=* +'use strict'; + +const common = require('../common'); +common.skipIfWorker(); + +const { createRequire } = require('node:module'); +const assert = require('node:assert'); +const fixtures = require('../common/fixtures'); +const loadFixture = createRequire(fixtures.path('node_modules')); +// When a permission is set by cli, the process shouldn't be able +// to require native addons unless --allow-addons is sent +{ + // doesNotThrow + const msg = loadFixture('pkgexports/no-addons'); + assert.strictEqual(msg, 'not using native addons'); +} diff --git a/test/parallel/test-permission-warning-flags.js b/test/parallel/test-permission-warning-flags.js index f62b39fbe59b31..ce3df71bc95f7c 100644 --- a/test/parallel/test-permission-warning-flags.js +++ b/test/parallel/test-permission-warning-flags.js @@ -5,6 +5,7 @@ const { spawnSync } = require('child_process'); const assert = require('assert'); const warnFlags = [ + '--allow-addons', '--allow-child-process', '--allow-worker', ]; diff --git a/test/parallel/test-pipe-abstract-socket.js b/test/parallel/test-pipe-abstract-socket.js new file mode 100644 index 00000000000000..baf76d6b82cf59 --- /dev/null +++ b/test/parallel/test-pipe-abstract-socket.js @@ -0,0 +1,34 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const net = require('net'); + +if (!common.isLinux) common.skip(); + +const path = '\0abstract'; +const message = /can not set readableAll or writableAllt to true when path is abstract unix socket/; + +assert.throws(() => { + const server = net.createServer(common.mustNotCall()); + server.listen({ + path, + readableAll: true + }); +}, message); + +assert.throws(() => { + const server = net.createServer(common.mustNotCall()); + server.listen({ + path, + writableAll: true + }); +}, message); + +assert.throws(() => { + const server = net.createServer(common.mustNotCall()); + server.listen({ + path, + readableAll: true, + writableAll: true + }); +}, message); diff --git a/test/parallel/test-process-emit-warning-from-native.js b/test/parallel/test-process-emit-warning-from-native.js deleted file mode 100644 index 80b1e71a08c58e..00000000000000 --- a/test/parallel/test-process-emit-warning-from-native.js +++ /dev/null @@ -1,52 +0,0 @@ -'use strict'; -const common = require('../common'); -const assert = require('assert'); - -if (!common.hasCrypto) - common.skip('missing crypto'); -if (common.hasFipsCrypto) - common.skip('crypto.createCipher() is not supported in FIPS mode'); - -const crypto = require('crypto'); -const key = '0123456789'; - -{ - common.expectWarning({ - DeprecationWarning: [ - ['crypto.createCipher is deprecated.', 'DEP0106'], - ], - Warning: [ - ['Use Cipheriv for counter mode of aes-256-gcm'], - ] - }); - - // Emits regular warning expected by expectWarning() - crypto.createCipher('aes-256-gcm', key); -} - -const realEmitWarning = process.emitWarning; - -{ - // It's a good idea to make this overridable from userland. - process.emitWarning = () => { throw new Error('foo'); }; - assert.throws(() => { - crypto.createCipher('aes-256-gcm', key); - }, /^Error: foo$/); -} - -{ - Object.defineProperty(process, 'emitWarning', { - get() { throw new Error('bar'); }, - configurable: true - }); - assert.throws(() => { - crypto.createCipher('aes-256-gcm', key); - }, /^Error: bar$/); -} - -// Reset back to default after the test. -Object.defineProperty(process, 'emitWarning', { - value: realEmitWarning, - configurable: true, - writable: true -}); diff --git a/test/parallel/test-process-env-allowed-flags-are-documented.js b/test/parallel/test-process-env-allowed-flags-are-documented.js index dc4c704b6f0b88..2746fdfc086f99 100644 --- a/test/parallel/test-process-env-allowed-flags-are-documented.js +++ b/test/parallel/test-process-env-allowed-flags-are-documented.js @@ -106,6 +106,8 @@ assert(undocumented.delete('--no-node-snapshot')); assert(undocumented.delete('--loader')); assert(undocumented.delete('--verify-base-objects')); assert(undocumented.delete('--no-verify-base-objects')); +assert(undocumented.delete('--trace-promises')); +assert(undocumented.delete('--no-trace-promises')); // Remove negated versions of the flags. for (const flag of undocumented) { diff --git a/test/parallel/test-process-release.js b/test/parallel/test-process-release.js index 4455ad9ca23c64..98a089a8f9ef5a 100644 --- a/test/parallel/test-process-release.js +++ b/test/parallel/test-process-release.js @@ -25,6 +25,8 @@ if (versionParts[0] === '4' && versionParts[1] >= 2) { assert.strictEqual(process.release.lts, 'Gallium'); } else if (versionParts[0] === '18' && versionParts[1] >= 12) { assert.strictEqual(process.release.lts, 'Hydrogen'); +} else if (versionParts[0] === '20' && versionParts[1] >= 9) { + assert.strictEqual(process.release.lts, 'Iron'); } else { assert.strictEqual(process.release.lts, undefined); } diff --git a/test/parallel/test-process-versions.js b/test/parallel/test-process-versions.js index 31886093df8cc2..cf35aa67a42cdb 100644 --- a/test/parallel/test-process-versions.js +++ b/test/parallel/test-process-versions.js @@ -18,6 +18,7 @@ const expected_keys = [ 'llhttp', 'uvwasi', 'acorn', + 'simdjson', 'simdutf', 'ada', 'cjs_module_lexer', @@ -61,7 +62,7 @@ assert.match(process.versions.brotli, commonTemplate); assert.match(process.versions.llhttp, commonTemplate); assert.match(process.versions.node, commonTemplate); assert.match(process.versions.uv, commonTemplate); -assert.match(process.versions.zlib, /^\d+(?:\.\d+){2,3}(?:-.*)?$/); +assert.match(process.versions.zlib, /^\d+(?:\.\d+){1,3}(?:-.*)?$/); if (hasUndici) { assert.match(process.versions.undici, commonTemplate); @@ -75,13 +76,17 @@ assert.match(process.versions.modules, /^\d+$/); assert.match(process.versions.cjs_module_lexer, commonTemplate); if (common.hasCrypto) { - const versionRegex = common.hasOpenSSL3 ? - // The following also matches a development version of OpenSSL 3.x which - // can be in the format '3.0.0-alpha4-dev'. This can be handy when building - // and linking against the main development branch of OpenSSL. - /^\d+\.\d+\.\d+(?:[-+][a-z0-9]+)*$/ : - /^\d+\.\d+\.\d+[a-z]?(\+quic)?(-fips)?$/; - assert.match(process.versions.openssl, versionRegex); + if (process.config.variables.node_shared_openssl) { + assert.ok(process.versions.openssl); + } else { + const versionRegex = common.hasOpenSSL3 ? + // The following also matches a development version of OpenSSL 3.x which + // can be in the format '3.0.0-alpha4-dev'. This can be handy when + // building and linking against the main development branch of OpenSSL. + /^\d+\.\d+\.\d+(?:[-+][a-z0-9]+)*$/ : + /^\d+\.\d+\.\d+[a-z]?(\+quic)?(-fips)?$/; + assert.match(process.versions.openssl, versionRegex); + } } for (let i = 0; i < expected_keys.length; i++) { diff --git a/test/parallel/test-process-warnings.mjs b/test/parallel/test-process-warnings.mjs new file mode 100644 index 00000000000000..e5712b38d633b8 --- /dev/null +++ b/test/parallel/test-process-warnings.mjs @@ -0,0 +1,163 @@ +import { spawnPromisified } from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { describe, it } from 'node:test'; +import assert from 'node:assert'; + +const fixturePath = fixtures.path('disable-warning.js'); +const fixturePathWorker = fixtures.path('disable-warning-worker.js'); +const dep1Message = /\(node:\d+\) \[DEP1\] DeprecationWarning/; +const dep2Message = /\(node:\d+\) \[DEP2\] DeprecationWarning/; +const experimentalWarningMessage = /\(node:\d+\) ExperimentalWarning/; + +describe('process warnings', { concurrency: true }, () => { + + it('should emit all warnings by default', async () => { + const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [ + fixturePath, + ]); + + assert.strictEqual(stdout, ''); + assert.match(stderr, dep1Message); + assert.match(stderr, dep2Message); + assert.match(stderr, experimentalWarningMessage); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); + }); + + describe('--no-warnings', { concurrency: true }, () => { + it('should silence all warnings by default', async () => { + const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [ + '--no-warnings', + fixturePath, + ]); + + assert.strictEqual(stdout, ''); + assert.doesNotMatch(stderr, dep1Message); + assert.doesNotMatch(stderr, dep2Message); + assert.doesNotMatch(stderr, experimentalWarningMessage); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); + }); + }); + + describe('--no-deprecation', { concurrency: true }, () => { + it('should silence all deprecation warnings', async () => { + const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [ + '--no-deprecation', + fixturePath, + ]); + + assert.strictEqual(stdout, ''); + assert.doesNotMatch(stderr, dep1Message); + assert.doesNotMatch(stderr, dep2Message); + assert.match(stderr, experimentalWarningMessage); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); + }); + }); + + describe('--disable-warning', { concurrency: true }, () => { + it('should silence deprecation warning DEP1', async () => { + const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [ + '--disable-warning=DEP1', + fixturePath, + ]); + + assert.strictEqual(stdout, ''); + assert.doesNotMatch(stderr, dep1Message); + assert.match(stderr, dep2Message); + assert.match(stderr, experimentalWarningMessage); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); + }); + + it('should silence deprecation warnings DEP1 and DEP2', async () => { + const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [ + '--disable-warning=DEP1', + '--disable-warning=DEP2', + fixturePath, + ]); + + assert.strictEqual(stdout, ''); + assert.doesNotMatch(stderr, dep1Message); + assert.doesNotMatch(stderr, dep2Message); + assert.match(stderr, experimentalWarningMessage); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); + }); + + it('should silence all deprecation warnings using type DeprecationWarning', async () => { + const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [ + '--disable-warning=DeprecationWarning', + fixturePath, + ]); + + assert.strictEqual(stdout, ''); + assert.doesNotMatch(stderr, dep1Message); + assert.doesNotMatch(stderr, dep2Message); + assert.match(stderr, experimentalWarningMessage); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); + }); + + it('should silence all experimental warnings using type ExperimentalWarning', async () => { + const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [ + '--disable-warning=ExperimentalWarning', + fixturePath, + ]); + + assert.strictEqual(stdout, ''); + assert.match(stderr, dep1Message); + assert.match(stderr, dep2Message); + assert.doesNotMatch(stderr, experimentalWarningMessage); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); + }); + + it('should pass down option to worker', async () => { + const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [ + '--disable-warning=DEP2', + fixturePathWorker, + ]); + + assert.strictEqual(stdout, ''); + assert.match(stderr, dep1Message); + assert.doesNotMatch(stderr, dep2Message); + assert.match(stderr, experimentalWarningMessage); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); + }); + + it('should not support a comma separated list', async () => { + const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [ + '--disable-warning=DEP1,DEP2', + fixturePathWorker, + ]); + + assert.strictEqual(stdout, ''); + assert.match(stderr, dep1Message); + assert.match(stderr, dep2Message); + assert.match(stderr, experimentalWarningMessage); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); + }); + + it('should be specifiable in NODE_OPTIONS', async () => { + const { stdout, stderr, code, signal } = await spawnPromisified(process.execPath, [ + fixturePath, + ], { + env: { + ...process.env, + NODE_OPTIONS: '--disable-warning=DEP2' + } + }); + + assert.strictEqual(stdout, ''); + assert.match(stderr, dep1Message); + assert.doesNotMatch(stderr, dep2Message); + assert.match(stderr, experimentalWarningMessage); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); + }); + }); +}); diff --git a/test/parallel/test-quic-internal-endpoint-listen-defaults.js b/test/parallel/test-quic-internal-endpoint-listen-defaults.js new file mode 100644 index 00000000000000..9fb9f9461c58b6 --- /dev/null +++ b/test/parallel/test-quic-internal-endpoint-listen-defaults.js @@ -0,0 +1,76 @@ +// Flags: --expose-internals +'use strict'; + +const common = require('../common'); +if (!common.hasQuic) + common.skip('missing quic'); + +const { internalBinding } = require('internal/test/binding'); +const { + ok, + strictEqual, + deepStrictEqual, +} = require('node:assert'); + +const { + SocketAddress: _SocketAddress, + AF_INET, +} = internalBinding('block_list'); +const quic = internalBinding('quic'); + +quic.setCallbacks({ + onEndpointClose: common.mustCall((...args) => { + deepStrictEqual(args, [0, 0]); + }), + + // The following are unused in this test + onSessionNew() {}, + onSessionClose() {}, + onSessionDatagram() {}, + onSessionDatagramStatus() {}, + onSessionHandshake() {}, + onSessionPathValidation() {}, + onSessionTicket() {}, + onSessionVersionNegotiation() {}, + onStreamCreated() {}, + onStreamBlocked() {}, + onStreamClose() {}, + onStreamReset() {}, + onStreamHeaders() {}, + onStreamTrailers() {}, +}); + +const endpoint = new quic.Endpoint({}); + +const state = new DataView(endpoint.state); +ok(!state.getUint8(quic.IDX_STATE_ENDPOINT_LISTENING)); +ok(!state.getUint8(quic.IDX_STATE_ENDPOINT_RECEIVING)); +ok(!state.getUint8(quic.IDX_STATE_ENDPOINT_BOUND)); +strictEqual(endpoint.address(), undefined); + +endpoint.listen({}); + +ok(state.getUint8(quic.IDX_STATE_ENDPOINT_LISTENING)); +ok(state.getUint8(quic.IDX_STATE_ENDPOINT_RECEIVING)); +ok(state.getUint8(quic.IDX_STATE_ENDPOINT_BOUND)); +const address = endpoint.address(); +ok(address instanceof _SocketAddress); + +const detail = address.detail({ + address: undefined, + port: undefined, + family: undefined, + flowlabel: undefined, +}); + +strictEqual(detail.address, '127.0.0.1'); +strictEqual(detail.family, AF_INET); +strictEqual(detail.flowlabel, 0); +ok(detail.port !== 0); + +endpoint.closeGracefully(); + +ok(!state.getUint8(quic.IDX_STATE_ENDPOINT_LISTENING)); +ok(!state.getUint8(quic.IDX_STATE_ENDPOINT_RECEIVING)); +ok(!state.getUint8(quic.IDX_STATE_ENDPOINT_BOUND)); +strictEqual(endpoint.address(), undefined); diff --git a/test/parallel/test-quic-internal-endpoint-options.js b/test/parallel/test-quic-internal-endpoint-options.js new file mode 100644 index 00000000000000..0d19841e5e8598 --- /dev/null +++ b/test/parallel/test-quic-internal-endpoint-options.js @@ -0,0 +1,215 @@ +// Flags: --expose-internals +'use strict'; + +const common = require('../common'); +if (!common.hasQuic) + common.skip('missing quic'); +const { + throws, +} = require('node:assert'); + +const { internalBinding } = require('internal/test/binding'); +const quic = internalBinding('quic'); + +quic.setCallbacks({ + onEndpointClose() {}, + onSessionNew() {}, + onSessionClose() {}, + onSessionDatagram() {}, + onSessionDatagramStatus() {}, + onSessionHandshake() {}, + onSessionPathValidation() {}, + onSessionTicket() {}, + onSessionVersionNegotiation() {}, + onStreamCreated() {}, + onStreamBlocked() {}, + onStreamClose() {}, + onStreamReset() {}, + onStreamHeaders() {}, + onStreamTrailers() {}, +}); + +throws(() => new quic.Endpoint(), { + code: 'ERR_INVALID_ARG_TYPE', + message: 'options must be an object' +}); + +throws(() => new quic.Endpoint('a'), { + code: 'ERR_INVALID_ARG_TYPE', + message: 'options must be an object' +}); + +throws(() => new quic.Endpoint(null), { + code: 'ERR_INVALID_ARG_TYPE', + message: 'options must be an object' +}); + +throws(() => new quic.Endpoint(false), { + code: 'ERR_INVALID_ARG_TYPE', + message: 'options must be an object' +}); + +{ + // Just Works... using all defaults + new quic.Endpoint({}); +} + +const cases = [ + { + key: 'retryTokenExpiration', + valid: [ + 1, 10, 100, 1000, 10000, 10000n, + ], + invalid: [-1, -1n, 'a', null, false, true, {}, [], () => {}] + }, + { + key: 'tokenExpiration', + valid: [ + 1, 10, 100, 1000, 10000, 10000n, + ], + invalid: [-1, -1n, 'a', null, false, true, {}, [], () => {}] + }, + { + key: 'maxConnectionsPerHost', + valid: [ + 1, 10, 100, 1000, 10000, 10000n, + ], + invalid: [-1, -1n, 'a', null, false, true, {}, [], () => {}] + }, + { + key: 'maxConnectionsTotal', + valid: [ + 1, 10, 100, 1000, 10000, 10000n, + ], + invalid: [-1, -1n, 'a', null, false, true, {}, [], () => {}] + }, + { + key: 'maxStatelessResetsPerHost', + valid: [ + 1, 10, 100, 1000, 10000, 10000n, + ], + invalid: [-1, -1n, 'a', null, false, true, {}, [], () => {}] + }, + { + key: 'addressLRUSize', + valid: [ + 1, 10, 100, 1000, 10000, 10000n, + ], + invalid: [-1, -1n, 'a', null, false, true, {}, [], () => {}] + }, + { + key: 'maxRetries', + valid: [ + 1, 10, 100, 1000, 10000, 10000n, + ], + invalid: [-1, -1n, 'a', null, false, true, {}, [], () => {}] + }, + { + key: 'maxPayloadSize', + valid: [ + 1, 10, 100, 1000, 10000, 10000n, + ], + invalid: [-1, -1n, 'a', null, false, true, {}, [], () => {}] + }, + { + key: 'unacknowledgedPacketThreshold', + valid: [ + 1, 10, 100, 1000, 10000, 10000n, + ], + invalid: [-1, -1n, 'a', null, false, true, {}, [], () => {}] + }, + { + key: 'validateAddress', + valid: [true, false, 0, 1, 'a'], + invalid: [], + }, + { + key: 'disableStatelessReset', + valid: [true, false, 0, 1, 'a'], + invalid: [], + }, + { + key: 'ipv6Only', + valid: [true, false, 0, 1, 'a'], + invalid: [], + }, + { + key: 'cc', + valid: [ + quic.QUIC_CC_ALGO_RENO, + quic.QUIC_CC_ALGO_CUBIC, + quic.QUIC_CC_ALGO_BBR, + quic.QUIC_CC_ALGO_BBR2, + quic.QUIC_CC_ALGO_RENO_STR, + quic.QUIC_CC_ALGO_CUBIC_STR, + quic.QUIC_CC_ALGO_BBR_STR, + quic.QUIC_CC_ALGO_BBR2_STR, + ], + invalid: [-1, 4, 1n, 'a', null, false, true, {}, [], () => {}], + }, + { + key: 'udpReceiveBufferSize', + valid: [0, 1, 2, 3, 4, 1000], + invalid: [-1, 'a', null, false, true, {}, [], () => {}], + }, + { + key: 'udpSendBufferSize', + valid: [0, 1, 2, 3, 4, 1000], + invalid: [-1, 'a', null, false, true, {}, [], () => {}], + }, + { + key: 'udpTTL', + valid: [0, 1, 2, 3, 4, 255], + invalid: [-1, 256, 'a', null, false, true, {}, [], () => {}], + }, + { + key: 'resetTokenSecret', + valid: [ + new Uint8Array(16), + new Uint16Array(8), + new Uint32Array(4), + ], + invalid: [ + 'a', null, false, true, {}, [], () => {}, + new Uint8Array(15), + new Uint8Array(17), + new ArrayBuffer(16), + ], + }, + { + key: 'tokenSecret', + valid: [ + new Uint8Array(16), + new Uint16Array(8), + new Uint32Array(4), + ], + invalid: [ + 'a', null, false, true, {}, [], () => {}, + new Uint8Array(15), + new Uint8Array(17), + new ArrayBuffer(16), + ], + }, + { + // Unknown options are ignored entirely for any value type + key: 'ignored', + valid: ['a', null, false, true, {}, [], () => {}], + invalid: [], + }, +]; + +for (const { key, valid, invalid } of cases) { + for (const value of valid) { + const options = {}; + options[key] = value; + new quic.Endpoint(options); + } + + for (const value of invalid) { + const options = {}; + options[key] = value; + throws(() => new quic.Endpoint(options), { + code: 'ERR_INVALID_ARG_VALUE', + }); + } +} diff --git a/test/parallel/test-quic-internal-endpoint-stats-state.js b/test/parallel/test-quic-internal-endpoint-stats-state.js new file mode 100644 index 00000000000000..566dd675d73e26 --- /dev/null +++ b/test/parallel/test-quic-internal-endpoint-stats-state.js @@ -0,0 +1,79 @@ +// Flags: --expose-internals +'use strict'; + +const common = require('../common'); +if (!common.hasQuic) + common.skip('missing quic'); +const { + strictEqual, +} = require('node:assert'); + +const { internalBinding } = require('internal/test/binding'); +const quic = internalBinding('quic'); + +const { + IDX_STATS_ENDPOINT_CREATED_AT, + IDX_STATS_ENDPOINT_DESTROYED_AT, + IDX_STATS_ENDPOINT_BYTES_RECEIVED, + IDX_STATS_ENDPOINT_BYTES_SENT, + IDX_STATS_ENDPOINT_PACKETS_RECEIVED, + IDX_STATS_ENDPOINT_PACKETS_SENT, + IDX_STATS_ENDPOINT_SERVER_SESSIONS, + IDX_STATS_ENDPOINT_CLIENT_SESSIONS, + IDX_STATS_ENDPOINT_SERVER_BUSY_COUNT, + IDX_STATS_ENDPOINT_RETRY_COUNT, + IDX_STATS_ENDPOINT_VERSION_NEGOTIATION_COUNT, + IDX_STATS_ENDPOINT_STATELESS_RESET_COUNT, + IDX_STATS_ENDPOINT_IMMEDIATE_CLOSE_COUNT, + IDX_STATS_ENDPOINT_COUNT, + IDX_STATE_ENDPOINT_BOUND, + IDX_STATE_ENDPOINT_BOUND_SIZE, + IDX_STATE_ENDPOINT_RECEIVING, + IDX_STATE_ENDPOINT_RECEIVING_SIZE, + IDX_STATE_ENDPOINT_LISTENING, + IDX_STATE_ENDPOINT_LISTENING_SIZE, + IDX_STATE_ENDPOINT_CLOSING, + IDX_STATE_ENDPOINT_CLOSING_SIZE, + IDX_STATE_ENDPOINT_BUSY, + IDX_STATE_ENDPOINT_BUSY_SIZE, + IDX_STATE_ENDPOINT_PENDING_CALLBACKS, + IDX_STATE_ENDPOINT_PENDING_CALLBACKS_SIZE, +} = quic; + +const endpoint = new quic.Endpoint({}); + +const state = new DataView(endpoint.state); +strictEqual(IDX_STATE_ENDPOINT_BOUND_SIZE, 1); +strictEqual(IDX_STATE_ENDPOINT_RECEIVING_SIZE, 1); +strictEqual(IDX_STATE_ENDPOINT_LISTENING_SIZE, 1); +strictEqual(IDX_STATE_ENDPOINT_CLOSING_SIZE, 1); +strictEqual(IDX_STATE_ENDPOINT_BUSY_SIZE, 1); +strictEqual(IDX_STATE_ENDPOINT_PENDING_CALLBACKS_SIZE, 8); + +strictEqual(state.getUint8(IDX_STATE_ENDPOINT_BOUND), 0); +strictEqual(state.getUint8(IDX_STATE_ENDPOINT_RECEIVING), 0); +strictEqual(state.getUint8(IDX_STATE_ENDPOINT_LISTENING), 0); +strictEqual(state.getUint8(IDX_STATE_ENDPOINT_CLOSING), 0); +strictEqual(state.getUint8(IDX_STATE_ENDPOINT_BUSY), 0); +strictEqual(state.getBigUint64(IDX_STATE_ENDPOINT_PENDING_CALLBACKS), 0n); + +endpoint.markBusy(true); +strictEqual(state.getUint8(IDX_STATE_ENDPOINT_BUSY), 1); +endpoint.markBusy(false); +strictEqual(state.getUint8(IDX_STATE_ENDPOINT_BUSY), 0); + +const stats = new BigUint64Array(endpoint.stats); +strictEqual(stats[IDX_STATS_ENDPOINT_CREATED_AT], 0n); +strictEqual(stats[IDX_STATS_ENDPOINT_DESTROYED_AT], 0n); +strictEqual(stats[IDX_STATS_ENDPOINT_BYTES_RECEIVED], 0n); +strictEqual(stats[IDX_STATS_ENDPOINT_BYTES_SENT], 0n); +strictEqual(stats[IDX_STATS_ENDPOINT_PACKETS_RECEIVED], 0n); +strictEqual(stats[IDX_STATS_ENDPOINT_PACKETS_SENT], 0n); +strictEqual(stats[IDX_STATS_ENDPOINT_SERVER_SESSIONS], 0n); +strictEqual(stats[IDX_STATS_ENDPOINT_CLIENT_SESSIONS], 0n); +strictEqual(stats[IDX_STATS_ENDPOINT_SERVER_BUSY_COUNT], 0n); +strictEqual(stats[IDX_STATS_ENDPOINT_RETRY_COUNT], 0n); +strictEqual(stats[IDX_STATS_ENDPOINT_VERSION_NEGOTIATION_COUNT], 0n); +strictEqual(stats[IDX_STATS_ENDPOINT_STATELESS_RESET_COUNT], 0n); +strictEqual(stats[IDX_STATS_ENDPOINT_IMMEDIATE_CLOSE_COUNT], 0n); +strictEqual(IDX_STATS_ENDPOINT_COUNT, 13); diff --git a/test/parallel/test-quic-internal-setcallbacks.js b/test/parallel/test-quic-internal-setcallbacks.js new file mode 100644 index 00000000000000..881e9161ca9dcc --- /dev/null +++ b/test/parallel/test-quic-internal-setcallbacks.js @@ -0,0 +1,38 @@ +// Flags: --expose-internals +'use strict'; + +const common = require('../common'); +if (!common.hasQuic) + common.skip('missing quic'); +const { internalBinding } = require('internal/test/binding'); +const quic = internalBinding('quic'); + +const { throws } = require('assert'); + +const callbacks = { + onEndpointClose() {}, + onSessionNew() {}, + onSessionClose() {}, + onSessionDatagram() {}, + onSessionDatagramStatus() {}, + onSessionHandshake() {}, + onSessionPathValidation() {}, + onSessionTicket() {}, + onSessionVersionNegotiation() {}, + onStreamCreated() {}, + onStreamBlocked() {}, + onStreamClose() {}, + onStreamReset() {}, + onStreamHeaders() {}, + onStreamTrailers() {}, +}; +// Fail if any callback is missing +for (const fn of Object.keys(callbacks)) { + // eslint-disable-next-line no-unused-vars + const { [fn]: _, ...rest } = callbacks; + throws(() => quic.setCallbacks(rest), { + code: 'ERR_MISSING_ARGS', + }); +} +// If all callbacks are present it should work +quic.setCallbacks(callbacks); diff --git a/test/parallel/test-readline-interface.js b/test/parallel/test-readline-interface.js index b5ffb490fba0fa..a0946a370f4c11 100644 --- a/test/parallel/test-readline-interface.js +++ b/test/parallel/test-readline-interface.js @@ -44,7 +44,7 @@ class FakeInput extends EventEmitter { function isWarned(emitter) { for (const name in emitter) { const listeners = emitter[name]; - if (listeners.warned) return true; + if (listeners && listeners.warned) return true; } return false; } diff --git a/test/parallel/test-readline-keys.js b/test/parallel/test-readline-keys.js index 01757b302a7991..28b5846d4eb58f 100644 --- a/test/parallel/test-readline-keys.js +++ b/test/parallel/test-readline-keys.js @@ -34,9 +34,9 @@ function addTest(sequences, expectedKeys) { keys = []; - sequences.forEach((sequence) => { + for (const sequence of sequences) { fi.write(sequence); - }); + } assert.deepStrictEqual(keys, expectedKeys); } diff --git a/test/parallel/test-readline-promises-interface.js b/test/parallel/test-readline-promises-interface.js index 2a8c5aae4e3949..b7ce0c4ff20d9a 100644 --- a/test/parallel/test-readline-promises-interface.js +++ b/test/parallel/test-readline-promises-interface.js @@ -22,7 +22,7 @@ class FakeInput extends EventEmitter { function isWarned(emitter) { for (const name in emitter) { const listeners = emitter[name]; - if (listeners.warned) return true; + if (listeners && listeners.warned) return true; } return false; } diff --git a/test/parallel/test-repl-pretty-custom-stack.js b/test/parallel/test-repl-pretty-custom-stack.js index a10cd032a688c4..f5697c2362e261 100644 --- a/test/parallel/test-repl-pretty-custom-stack.js +++ b/test/parallel/test-repl-pretty-custom-stack.js @@ -42,8 +42,9 @@ const origPrepareStackTrace = Error.prepareStackTrace; Error.prepareStackTrace = (err, stack) => { if (err instanceof SyntaxError) return err.toString(); - stack.push(err); - return stack.reverse().join('--->\n'); + // Insert the error at the beginning of the stack + stack.unshift(err); + return stack.join('--->\n'); }; process.on('uncaughtException', (e) => { @@ -78,3 +79,10 @@ const tests = [ ]; tests.forEach(run); + +// Verify that the stack can be generated when Error.prepareStackTrace is deleted. +delete Error.prepareStackTrace; +run({ + command: 'throw new TypeError(\'Whoops!\')', + expected: 'Uncaught TypeError: Whoops!\n' +}); diff --git a/test/parallel/test-runner-cli-timeout.js b/test/parallel/test-runner-cli-timeout.js new file mode 100644 index 00000000000000..b8998d397fa12c --- /dev/null +++ b/test/parallel/test-runner-cli-timeout.js @@ -0,0 +1,20 @@ +'use strict'; +require('../common'); +const fixtures = require('../common/fixtures'); +const assert = require('node:assert'); +const { spawnSync } = require('node:child_process'); +const { test } = require('node:test'); +const cwd = fixtures.path('test-runner', 'default-behavior'); +const env = { ...process.env, 'NODE_DEBUG': 'test_runner' }; + +test('default timeout -- Infinity', async () => { + const args = ['--test']; + const cp = spawnSync(process.execPath, args, { cwd, env }); + assert.match(cp.stderr.toString(), /timeout: Infinity,/); +}); + +test('timeout of 10ms', async () => { + const args = ['--test', '--test-timeout', 10]; + const cp = spawnSync(process.execPath, args, { cwd, env }); + assert.match(cp.stderr.toString(), /timeout: 10,/); +}); diff --git a/test/parallel/test-runner-cli.js b/test/parallel/test-runner-cli.js index 34ce67caa5e6a5..ab6078a4a05d74 100644 --- a/test/parallel/test-runner-cli.js +++ b/test/parallel/test-runner-cli.js @@ -104,7 +104,7 @@ const testFixtures = fixtures.path('test-runner'); ['--print', 'console.log("should not print")', '--test'], ]; - flags.forEach((args) => { + for (const args of flags) { const child = spawnSync(process.execPath, args); assert.notStrictEqual(child.status, 0); @@ -112,7 +112,7 @@ const testFixtures = fixtures.path('test-runner'); assert.strictEqual(child.stdout.toString(), ''); const stderr = child.stderr.toString(); assert.match(stderr, /--test/); - }); + } } { diff --git a/test/parallel/test-runner-coverage.js b/test/parallel/test-runner-coverage.js index 2532f9971c213d..d8181417205b46 100644 --- a/test/parallel/test-runner-coverage.js +++ b/test/parallel/test-runner-coverage.js @@ -22,16 +22,21 @@ function findCoverageFileForPid(pid) { } function getTapCoverageFixtureReport() { + /* eslint-disable max-len */ const report = [ '# start of coverage report', - '# file | line % | branch % | funcs % | uncovered lines', - '# test/fixtures/test-runner/coverage.js | 78.65 | 38.46 | 60.00 | 12, ' + - '13, 16, 17, 18, 19, 20, 21, 22, 27, 39, 43, 44, 61, 62, 66, 67, 71, 72', - '# test/fixtures/test-runner/invalid-tap.js | 100.00 | 100.00 | 100.00 | ', - '# test/fixtures/v8-coverage/throw.js | 71.43 | 50.00 | 100.00 | 5, 6', - '# all files | 78.35 | 43.75 | 60.00 |', + '# -------------------------------------------------------------------------------------------------------------------', + '# file | line % | branch % | funcs % | uncovered lines', + '# -------------------------------------------------------------------------------------------------------------------', + '# test/fixtures/test-runner/coverage.js | 78.65 | 38.46 | 60.00 | 12-13 16-22 27 39 43-44 61-62 66-67 71-72', + '# test/fixtures/test-runner/invalid-tap.js | 100.00 | 100.00 | 100.00 | ', + '# test/fixtures/v8-coverage/throw.js | 71.43 | 50.00 | 100.00 | 5-6', + '# -------------------------------------------------------------------------------------------------------------------', + '# all files | 78.35 | 43.75 | 60.00 |', + '# -------------------------------------------------------------------------------------------------------------------', '# end of coverage report', ].join('\n'); + /* eslint-enable max-len */ if (common.isWindows) { return report.replaceAll('/', '\\'); @@ -88,7 +93,6 @@ test('test tap coverage reporter', skipIfNoInspector, async (t) => { const options = { env: { ...process.env, NODE_V8_COVERAGE: tmpdir.path } }; const result = spawnSync(process.execPath, args, options); const report = getTapCoverageFixtureReport(); - assert(result.stdout.toString().includes(report)); assert.strictEqual(result.stderr.toString(), ''); assert.strictEqual(result.status, 0); @@ -152,16 +156,16 @@ test('single process coverage is the same with --test', skipIfNoInspector, () => test('coverage is combined for multiple processes', skipIfNoInspector, () => { let report = [ '# start of coverage report', - '# file | line % | branch % | funcs % | uncovered lines', - '# common.js | 89.86 | ' + - '62.50 | 100.00 | 8, 13, 14, 18, 34, 35, 53', - '# first.test.js | 83.33 | ' + - '100.00 | 50.00 | 5, 6', - '# second.test.js | 100.00 ' + - '| 100.00 | 100.00 | ', - '# third.test.js | 100.00 | ' + - '100.00 | 100.00 | ', - '# all files | 92.11 | 72.73 | 88.89 |', + '# -------------------------------------------------------------------', + '# file | line % | branch % | funcs % | uncovered lines', + '# -------------------------------------------------------------------', + '# common.js | 89.86 | 62.50 | 100.00 | 8 13-14 18 34-35 53', + '# first.test.js | 83.33 | 100.00 | 50.00 | 5-6', + '# second.test.js | 100.00 | 100.00 | 100.00 | ', + '# third.test.js | 100.00 | 100.00 | 100.00 | ', + '# -------------------------------------------------------------------', + '# all files | 92.11 | 72.73 | 88.89 |', + '# -------------------------------------------------------------------', '# end of coverage report', ].join('\n'); diff --git a/test/parallel/test-runner-mock-timers.js b/test/parallel/test-runner-mock-timers.js index 3a2203091337c6..eb5cec84e122f2 100644 --- a/test/parallel/test-runner-mock-timers.js +++ b/test/parallel/test-runner-mock-timers.js @@ -11,7 +11,7 @@ describe('Mock Timers Test Suite', () => { describe('MockTimers API', () => { it('should throw an error if trying to enable a timer that is not supported', (t) => { assert.throws(() => { - t.mock.timers.enable(['DOES_NOT_EXIST']); + t.mock.timers.enable({ apis: ['DOES_NOT_EXIST'] }); }, { code: 'ERR_INVALID_ARG_VALUE', }); @@ -46,6 +46,7 @@ describe('Mock Timers Test Suite', () => { code: 'ERR_INVALID_ARG_VALUE', }); }); + it('should check that propertyDescriptor gets back after resetting timers', (t) => { const getDescriptor = (ctx, fn) => Object.getOwnPropertyDescriptor(ctx, fn); const getCurrentTimersDescriptors = () => { @@ -107,6 +108,7 @@ describe('Mock Timers Test Suite', () => { const fn = t.mock.fn(); global.setTimeout(fn, 1000); t.mock.timers.reset(); + assert.deepStrictEqual(Date.now, globalThis.Date.now); assert.throws(() => { t.mock.timers.tick(1000); }, { @@ -166,14 +168,34 @@ describe('Mock Timers Test Suite', () => { assert.strictEqual(timeoutFn.mock.callCount(), 1); assert.strictEqual(intervalFn.mock.callCount(), 1); }); - }); + it('should increase the epoch as the tick run for runAll', async (t) => { + const timeoutFn = t.mock.fn(); + const intervalFn = t.mock.fn(); + + t.mock.timers.enable(); + global.setTimeout(timeoutFn, 1111); + const id = global.setInterval(intervalFn, 9999); + t.mock.timers.runAll(); + + global.clearInterval(id); + assert.strictEqual(timeoutFn.mock.callCount(), 1); + assert.strictEqual(intervalFn.mock.callCount(), 1); + assert.strictEqual(Date.now(), 9999); + }); + + it('should not error if there are not timers to run', (t) => { + t.mock.timers.enable(); + t.mock.timers.runAll(); + // Should not throw + }); + }); }); describe('globals/timers', () => { describe('setTimeout Suite', () => { it('should advance in time and trigger timers when calling the .tick function', (t) => { - mock.timers.enable(['setTimeout']); + mock.timers.enable({ apis: ['setTimeout'] }); const fn = mock.fn(); @@ -185,7 +207,7 @@ describe('Mock Timers Test Suite', () => { }); it('should advance in time and trigger timers when calling the .tick function multiple times', (t) => { - t.mock.timers.enable(['setTimeout']); + t.mock.timers.enable({ apis: ['setTimeout'] }); const fn = t.mock.fn(); global.setTimeout(fn, 2000); @@ -199,7 +221,7 @@ describe('Mock Timers Test Suite', () => { }); it('should work with the same params as the original setTimeout', (t) => { - t.mock.timers.enable(['setTimeout']); + t.mock.timers.enable({ apis: ['setTimeout'] }); const fn = t.mock.fn(); const args = ['a', 'b', 'c']; global.setTimeout(fn, 2000, ...args); @@ -221,12 +243,11 @@ describe('Mock Timers Test Suite', () => { done(); }), timeout); }); - }); describe('clearTimeout Suite', () => { it('should not advance in time if clearTimeout was invoked', (t) => { - t.mock.timers.enable(['setTimeout']); + t.mock.timers.enable({ apis: ['setTimeout'] }); const fn = mock.fn(); @@ -240,7 +261,7 @@ describe('Mock Timers Test Suite', () => { describe('setInterval Suite', () => { it('should tick three times using fake setInterval', (t) => { - t.mock.timers.enable(['setInterval']); + t.mock.timers.enable({ apis: ['setInterval'] }); const fn = t.mock.fn(); const id = global.setInterval(fn, 200); @@ -255,7 +276,7 @@ describe('Mock Timers Test Suite', () => { }); it('should work with the same params as the original setInterval', (t) => { - t.mock.timers.enable(['setInterval']); + t.mock.timers.enable({ apis: ['setInterval'] }); const fn = t.mock.fn(); const args = ['a', 'b', 'c']; const id = global.setInterval(fn, 200, ...args); @@ -270,13 +291,12 @@ describe('Mock Timers Test Suite', () => { assert.deepStrictEqual(fn.mock.calls[0].arguments, args); assert.deepStrictEqual(fn.mock.calls[1].arguments, args); assert.deepStrictEqual(fn.mock.calls[2].arguments, args); - }); }); describe('clearInterval Suite', () => { it('should not advance in time if clearInterval was invoked', (t) => { - t.mock.timers.enable(['setInterval']); + t.mock.timers.enable({ apis: ['setInterval'] }); const fn = mock.fn(); const id = global.setInterval(fn, 200); @@ -299,7 +319,7 @@ describe('Mock Timers Test Suite', () => { }); it('should work with the same params as the original setImmediate', (t) => { - t.mock.timers.enable(['setImmediate']); + t.mock.timers.enable({ apis: ['setImmediate'] }); const fn = t.mock.fn(); const args = ['a', 'b', 'c']; global.setImmediate(fn, ...args); @@ -310,7 +330,7 @@ describe('Mock Timers Test Suite', () => { }); it('should not advance in time if clearImmediate was invoked', (t) => { - t.mock.timers.enable(['setImmediate']); + t.mock.timers.enable({ apis: ['setImmediate'] }); const id = global.setImmediate(common.mustNotCall()); global.clearImmediate(id); @@ -318,13 +338,13 @@ describe('Mock Timers Test Suite', () => { }); it('should advance in time and trigger timers when calling the .tick function', (t) => { - t.mock.timers.enable(['setImmediate']); + t.mock.timers.enable({ apis: ['setImmediate'] }); global.setImmediate(common.mustCall(1)); t.mock.timers.tick(0); }); it('should execute in order if setImmediate is called multiple times', (t) => { - t.mock.timers.enable(['setImmediate']); + t.mock.timers.enable({ apis: ['setImmediate'] }); const order = []; const fn1 = t.mock.fn(common.mustCall(() => order.push('f1'), 1)); const fn2 = t.mock.fn(common.mustCall(() => order.push('f2'), 1)); @@ -338,7 +358,7 @@ describe('Mock Timers Test Suite', () => { }); it('should execute setImmediate first if setTimeout was also called', (t) => { - t.mock.timers.enable(['setImmediate', 'setTimeout']); + t.mock.timers.enable({ apis: ['setImmediate', 'setTimeout'] }); const order = []; const fn1 = t.mock.fn(common.mustCall(() => order.push('f1'), 1)); const fn2 = t.mock.fn(common.mustCall(() => order.push('f2'), 1)); @@ -351,524 +371,461 @@ describe('Mock Timers Test Suite', () => { assert.deepStrictEqual(order, ['f1', 'f2']); }); }); - }); - - describe('timers Suite', () => { - describe('setTimeout Suite', () => { - it('should advance in time and trigger timers when calling the .tick function multiple times', (t) => { - t.mock.timers.enable(['setTimeout']); - const fn = t.mock.fn(); - const { setTimeout } = nodeTimers; - setTimeout(fn, 2000); - - t.mock.timers.tick(1000); - t.mock.timers.tick(500); - t.mock.timers.tick(500); - - assert.strictEqual(fn.mock.callCount(), 1); - }); - - it('should work with the same params as the original timers.setTimeout', (t) => { - t.mock.timers.enable(['setTimeout']); - const fn = t.mock.fn(); - const { setTimeout } = nodeTimers; - const args = ['a', 'b', 'c']; - setTimeout(fn, 2000, ...args); - - t.mock.timers.tick(1000); - t.mock.timers.tick(500); - t.mock.timers.tick(500); - - assert.strictEqual(fn.mock.callCount(), 1); - assert.deepStrictEqual(fn.mock.calls[0].arguments, args); - }); - }); - - describe('clearTimeout Suite', () => { - it('should not advance in time if clearTimeout was invoked', (t) => { - t.mock.timers.enable(['setTimeout']); - - const fn = mock.fn(); - const { setTimeout, clearTimeout } = nodeTimers; - const id = setTimeout(fn, 2000); - clearTimeout(id); - t.mock.timers.tick(2000); - - assert.strictEqual(fn.mock.callCount(), 0); - }); - }); - - describe('setInterval Suite', () => { - it('should tick three times using fake setInterval', (t) => { - t.mock.timers.enable(['setInterval']); - const fn = t.mock.fn(); - - const id = nodeTimers.setInterval(fn, 200); - - t.mock.timers.tick(200); - t.mock.timers.tick(200); - t.mock.timers.tick(200); - t.mock.timers.tick(200); - - nodeTimers.clearInterval(id); - - assert.strictEqual(fn.mock.callCount(), 4); - }); - - it('should work with the same params as the original timers.setInterval', (t) => { - t.mock.timers.enable(['setInterval']); - const fn = t.mock.fn(); - const args = ['a', 'b', 'c']; - const id = nodeTimers.setInterval(fn, 200, ...args); - - t.mock.timers.tick(200); - t.mock.timers.tick(200); - t.mock.timers.tick(200); - t.mock.timers.tick(200); - - nodeTimers.clearInterval(id); - - assert.strictEqual(fn.mock.callCount(), 4); - assert.deepStrictEqual(fn.mock.calls[0].arguments, args); - assert.deepStrictEqual(fn.mock.calls[1].arguments, args); - assert.deepStrictEqual(fn.mock.calls[2].arguments, args); - assert.deepStrictEqual(fn.mock.calls[3].arguments, args); - - }); - }); - - describe('clearInterval Suite', () => { - it('should not advance in time if clearInterval was invoked', (t) => { - t.mock.timers.enable(['setInterval']); - - const fn = mock.fn(); - const { setInterval, clearInterval } = nodeTimers; - const id = setInterval(fn, 200); - clearInterval(id); - t.mock.timers.tick(200); - - assert.strictEqual(fn.mock.callCount(), 0); - }); - }); - - describe('setImmediate Suite', () => { - it('should keep setImmediate working if timers are disabled', (t, done) => { - const now = Date.now(); - const timeout = 2; - const expected = () => now - timeout; - nodeTimers.setImmediate(common.mustCall(() => { - assert.strictEqual(now - timeout, expected()); - done(); - }, 1)); - }); - - it('should work with the same params as the original setImmediate', (t) => { - t.mock.timers.enable(['setImmediate']); - const fn = t.mock.fn(); - const args = ['a', 'b', 'c']; - nodeTimers.setImmediate(fn, ...args); - t.mock.timers.tick(9999); - - assert.strictEqual(fn.mock.callCount(), 1); - assert.deepStrictEqual(fn.mock.calls[0].arguments, args); - }); - - it('should not advance in time if clearImmediate was invoked', (t) => { - t.mock.timers.enable(['setImmediate']); - - const id = nodeTimers.setImmediate(common.mustNotCall()); - nodeTimers.clearImmediate(id); - t.mock.timers.tick(200); - }); - - it('should advance in time and trigger timers when calling the .tick function', (t) => { - t.mock.timers.enable(['setImmediate']); - nodeTimers.setImmediate(common.mustCall(1)); - t.mock.timers.tick(0); - }); - - it('should execute in order if setImmediate is called multiple times', (t) => { - t.mock.timers.enable(['setImmediate']); - const order = []; - const fn1 = t.mock.fn(common.mustCall(() => order.push('f1'), 1)); - const fn2 = t.mock.fn(common.mustCall(() => order.push('f2'), 1)); - - nodeTimers.setImmediate(fn1); - nodeTimers.setImmediate(fn2); - - t.mock.timers.tick(0); - - assert.deepStrictEqual(order, ['f1', 'f2']); - }); - - it('should execute setImmediate first if setTimeout was also called', (t) => { - t.mock.timers.enable(['setImmediate', 'setTimeout']); - const order = []; - const fn1 = t.mock.fn(common.mustCall(() => order.push('f1'), 1)); - const fn2 = t.mock.fn(common.mustCall(() => order.push('f2'), 1)); - - nodeTimers.setTimeout(fn2, 0); - nodeTimers.setImmediate(fn1); - - t.mock.timers.tick(100); - - assert.deepStrictEqual(order, ['f1', 'f2']); - }); - }); - }); - describe('timers/promises', () => { - describe('setTimeout Suite', () => { - it('should advance in time and trigger timers when calling the .tick function multiple times', async (t) => { - t.mock.timers.enable(['setTimeout']); + describe('timers/promises', () => { + describe('setTimeout Suite', () => { + it('should advance in time and trigger timers when calling the .tick function multiple times', async (t) => { + t.mock.timers.enable({ apis: ['setTimeout'] }); - const p = nodeTimersPromises.setTimeout(2000); + const p = nodeTimersPromises.setTimeout(2000); - t.mock.timers.tick(1000); - t.mock.timers.tick(500); - t.mock.timers.tick(500); - t.mock.timers.tick(500); + t.mock.timers.tick(1000); + t.mock.timers.tick(500); + t.mock.timers.tick(500); + t.mock.timers.tick(500); - p.then(common.mustCall((result) => { - assert.strictEqual(result, undefined); - })); - }); - - it('should work with the same params as the original timers/promises/setTimeout', async (t) => { - t.mock.timers.enable(['setTimeout']); - const expectedResult = 'result'; - const controller = new AbortController(); - const p = nodeTimersPromises.setTimeout(2000, expectedResult, { - ref: true, - signal: controller.signal + p.then(common.mustCall((result) => { + assert.strictEqual(result, undefined); + })); }); - t.mock.timers.tick(1000); - t.mock.timers.tick(500); - t.mock.timers.tick(500); - t.mock.timers.tick(500); - - const result = await p; - assert.strictEqual(result, expectedResult); - }); - - it('should abort operation if timers/promises/setTimeout received an aborted signal', async (t) => { - t.mock.timers.enable(['setTimeout']); - const expectedResult = 'result'; - const controller = new AbortController(); - const p = nodeTimersPromises.setTimeout(2000, expectedResult, { - ref: true, - signal: controller.signal + it('should work with the same params as the original timers/promises/setTimeout', async (t) => { + t.mock.timers.enable({ apis: ['setTimeout'] }); + const expectedResult = 'result'; + const controller = new AbortController(); + const p = nodeTimersPromises.setTimeout(2000, expectedResult, { + ref: true, + signal: controller.signal, + }); + + t.mock.timers.tick(1000); + t.mock.timers.tick(500); + t.mock.timers.tick(500); + t.mock.timers.tick(500); + + const result = await p; + assert.strictEqual(result, expectedResult); }); - t.mock.timers.tick(1000); - controller.abort(); - t.mock.timers.tick(500); - t.mock.timers.tick(500); - t.mock.timers.tick(500); - await assert.rejects(() => p, { - name: 'AbortError', + it('should always return the same result as the original timers/promises/setTimeout', async (t) => { + t.mock.timers.enable({ apis: ['setTimeout'] }); + for (const expectedResult of [undefined, null, false, true, 0, 0n, 1, 1n, '', 'result', {}]) { + const p = nodeTimersPromises.setTimeout(2000, expectedResult); + t.mock.timers.tick(2000); + const result = await p; + assert.strictEqual(result, expectedResult); + } }); - }); - it('should abort operation even if the .tick wasn\'t called', async (t) => { - t.mock.timers.enable(['setTimeout']); - const expectedResult = 'result'; - const controller = new AbortController(); - const p = nodeTimersPromises.setTimeout(2000, expectedResult, { - ref: true, - signal: controller.signal + it('should abort operation if timers/promises/setTimeout received an aborted signal', async (t) => { + t.mock.timers.enable({ apis: ['setTimeout'] }); + const expectedResult = 'result'; + const controller = new AbortController(); + const p = nodeTimersPromises.setTimeout(2000, expectedResult, { + ref: true, + signal: controller.signal, + }); + + t.mock.timers.tick(1000); + controller.abort(); + t.mock.timers.tick(500); + t.mock.timers.tick(500); + t.mock.timers.tick(500); + await assert.rejects(() => p, { + name: 'AbortError', + }); + }); + it('should abort operation even if the .tick was not called', async (t) => { + t.mock.timers.enable({ apis: ['setTimeout'] }); + const expectedResult = 'result'; + const controller = new AbortController(); + const p = nodeTimersPromises.setTimeout(2000, expectedResult, { + ref: true, + signal: controller.signal, + }); + + controller.abort(); + + await assert.rejects(() => p, { + name: 'AbortError', + }); }); - controller.abort(); + it('should abort operation when .abort is called before calling setInterval', async (t) => { + t.mock.timers.enable({ apis: ['setTimeout'] }); + const expectedResult = 'result'; + const controller = new AbortController(); + controller.abort(); + const p = nodeTimersPromises.setTimeout(2000, expectedResult, { + ref: true, + signal: controller.signal, + }); + + await assert.rejects(() => p, { + name: 'AbortError', + }); + }); - await assert.rejects(() => p, { - name: 'AbortError', + it('should reject given an an invalid signal instance', async (t) => { + t.mock.timers.enable({ apis: ['setTimeout'] }); + const expectedResult = 'result'; + const p = nodeTimersPromises.setTimeout(2000, expectedResult, { + ref: true, + signal: {}, + }); + + await assert.rejects(() => p, { + name: 'TypeError', + code: 'ERR_INVALID_ARG_TYPE', + }); }); - }); + // Test for https://github.com/nodejs/node/issues/50365 + it('should not affect other timers when aborting', async (t) => { + const f1 = t.mock.fn(); + const f2 = t.mock.fn(); + t.mock.timers.enable({ apis: ['setTimeout'] }); + const ac = new AbortController(); - it('should abort operation when .abort is called before calling setTimeout', async (t) => { - t.mock.timers.enable(['setTimeout']); - const expectedResult = 'result'; - const controller = new AbortController(); - controller.abort(); - const p = nodeTimersPromises.setTimeout(2000, expectedResult, { - ref: true, - signal: controller.signal - }); + // id 1 & pos 1 in priority queue + nodeTimersPromises.setTimeout(100, undefined, { signal: ac.signal }).then(f1, f1); + // id 2 & pos 1 in priority queue (id 1 is moved to pos 2) + nodeTimersPromises.setTimeout(50).then(f2, f2); - await assert.rejects(() => p, { - name: 'AbortError', - }); + ac.abort(); // BUG: will remove timer at pos 1 not timer with id 1! - }); + t.mock.timers.runAll(); + await nodeTimersPromises.setImmediate(); // let promises settle - it('should reject given an an invalid signal instance', async (t) => { - t.mock.timers.enable(['setTimeout']); - const expectedResult = 'result'; - const p = nodeTimersPromises.setTimeout(2000, expectedResult, { - ref: true, - signal: {} - }); + // First setTimeout is aborted + assert.strictEqual(f1.mock.callCount(), 1); + assert.strictEqual(f1.mock.calls[0].arguments[0].code, 'ABORT_ERR'); - await assert.rejects(() => p, { - name: 'TypeError', - code: 'ERR_INVALID_ARG_TYPE' + // Second setTimeout should resolve, but never settles, because it was eronously removed by ac.abort() + assert.strictEqual(f2.mock.callCount(), 1); }); + // Test for https://github.com/nodejs/node/issues/50365 + it('should not affect other timers when aborted after triggering', async (t) => { + const f1 = t.mock.fn(); + const f2 = t.mock.fn(); + t.mock.timers.enable({ apis: ['setTimeout'] }); + const ac = new AbortController(); + + // id 1 & pos 1 in priority queue + nodeTimersPromises.setTimeout(50, true, { signal: ac.signal }).then(f1, f1); + // id 2 & pos 2 in priority queue + nodeTimersPromises.setTimeout(100).then(f2, f2); + + // First setTimeout resolves + t.mock.timers.tick(50); + await nodeTimersPromises.setImmediate(); // let promises settle + assert.strictEqual(f1.mock.callCount(), 1); + assert.strictEqual(f1.mock.calls[0].arguments.length, 1); + assert.strictEqual(f1.mock.calls[0].arguments[0], true); + + // Now timer with id 2 will be at pos 1 in priority queue + ac.abort(); // BUG: will remove timer at pos 1 not timer with id 1! + + // Second setTimeout should resolve, but never settles, because it was eronously removed by ac.abort() + t.mock.timers.runAll(); + await nodeTimersPromises.setImmediate(); // let promises settle + assert.strictEqual(f2.mock.callCount(), 1); + }); }); - }); - describe('setInterval Suite', () => { - it('should tick three times using fake setInterval', async (t) => { - t.mock.timers.enable(['setInterval']); - - const interval = 100; - const intervalIterator = nodeTimersPromises.setInterval(interval, Date.now()); + describe('setInterval Suite', () => { + it('should tick three times using fake setInterval', async (t) => { + t.mock.timers.enable({ apis: ['setInterval'] }); - const first = intervalIterator.next(); - const second = intervalIterator.next(); - const third = intervalIterator.next(); + const interval = 100; + const intervalIterator = nodeTimersPromises.setInterval(interval, Date.now()); - t.mock.timers.tick(interval); - t.mock.timers.tick(interval); - t.mock.timers.tick(interval); - t.mock.timers.tick(interval); + const first = intervalIterator.next(); + const second = intervalIterator.next(); + const third = intervalIterator.next(); - const results = await Promise.all([ - first, - second, - third, - ]); + t.mock.timers.tick(interval); + t.mock.timers.tick(interval); + t.mock.timers.tick(interval); + t.mock.timers.tick(interval); - const finished = await intervalIterator.return(); - assert.deepStrictEqual(finished, { done: true, value: undefined }); + const results = await Promise.all([ + first, + second, + third, + ]); - results.forEach((result) => { - assert.strictEqual(typeof result.value, 'number'); - assert.strictEqual(result.done, false); + const finished = await intervalIterator.return(); + assert.deepStrictEqual(finished, { done: true, value: undefined }); + for (const result of results) { + assert.strictEqual(typeof result.value, 'number'); + assert.strictEqual(result.done, false); + } }); + it('should tick five times testing a real use case', async (t) => { + t.mock.timers.enable({ apis: ['setInterval'] }); + + const expectedIterations = 5; + const interval = 1000; + let time = 0; + async function run() { + const times = []; + for await (const _ of nodeTimersPromises.setInterval(interval)) { // eslint-disable-line no-unused-vars + time += interval; + times.push(time); + if (times.length === expectedIterations) break; + } + return times; + } - }); - it('should tick five times testing a real use case', async (t) => { - - t.mock.timers.enable(['setInterval']); - - const expectedIterations = 5; - const interval = 1000; - const startedAt = Date.now(); - async function run() { - const times = []; - for await (const time of nodeTimersPromises.setInterval(interval, startedAt)) { - times.push(time); - if (times.length === expectedIterations) break; - + const r = run(); + t.mock.timers.tick(interval); + t.mock.timers.tick(interval); + t.mock.timers.tick(interval); + t.mock.timers.tick(interval); + t.mock.timers.tick(interval); + + const timeResults = await r; + assert.strictEqual(timeResults.length, expectedIterations); + for (let it = 1; it < expectedIterations; it++) { + assert.strictEqual(timeResults[it - 1], interval * it); } - return times; - } + }); - const r = run(); - t.mock.timers.tick(interval); - t.mock.timers.tick(interval); - t.mock.timers.tick(interval); - t.mock.timers.tick(interval); - t.mock.timers.tick(interval); - - const timeResults = await r; - assert.strictEqual(timeResults.length, expectedIterations); - for (let it = 1; it < expectedIterations; it++) { - assert.strictEqual(timeResults[it - 1], startedAt + (interval * it)); - } - }); + it('should always return the same result as the original timers/promises/setInterval', async (t) => { + t.mock.timers.enable({ apis: ['setInterval'] }); + for (const expectedResult of [undefined, null, false, true, 0, 0n, 1, 1n, '', 'result', {}]) { + const intervalIterator = nodeTimersPromises.setInterval(2000, expectedResult); + const p = intervalIterator.next(); + t.mock.timers.tick(2000); + const result = await p; + await intervalIterator.return(); + assert.strictEqual(result.done, false); + assert.strictEqual(result.value, expectedResult); + } + }); - it('should abort operation given an abort controller signal', async (t) => { - t.mock.timers.enable(['setInterval']); + it('should abort operation given an abort controller signal', async (t) => { + t.mock.timers.enable({ apis: ['setInterval'] }); - const interval = 100; - const abortController = new AbortController(); - const intervalIterator = nodeTimersPromises.setInterval(interval, Date.now(), { - signal: abortController.signal - }); + const interval = 100; + const abortController = new AbortController(); + const intervalIterator = nodeTimersPromises.setInterval(interval, Date.now(), { + signal: abortController.signal, + }); - const first = intervalIterator.next(); - const second = intervalIterator.next(); + const first = intervalIterator.next(); + const second = intervalIterator.next(); - t.mock.timers.tick(interval); - abortController.abort(); - t.mock.timers.tick(interval); + t.mock.timers.tick(interval); + abortController.abort(); + t.mock.timers.tick(interval); - const firstResult = await first; - // Interval * 2 because value can be a little bit greater than interval - assert.ok(firstResult.value < Date.now() + interval * 2); - assert.strictEqual(firstResult.done, false); + const firstResult = await first; + // Interval * 2 because value can be a little bit greater than interval + assert.ok(firstResult.value < Date.now() + interval * 2); + assert.strictEqual(firstResult.done, false); - await assert.rejects(() => second, { - name: 'AbortError', + await assert.rejects(() => second, { + name: 'AbortError', + }); }); - }); - - it('should abort operation when .abort is called before calling setInterval', async (t) => { - t.mock.timers.enable(['setInterval']); + it('should abort operation when .abort is called before calling setInterval', async (t) => { + t.mock.timers.enable({ apis: ['setInterval'] }); - const interval = 100; - const abortController = new AbortController(); - abortController.abort(); - const intervalIterator = nodeTimersPromises.setInterval(interval, Date.now(), { - signal: abortController.signal - }); + const interval = 100; + const abortController = new AbortController(); + abortController.abort(); + const intervalIterator = nodeTimersPromises.setInterval(interval, Date.now(), { + signal: abortController.signal, + }); - const first = intervalIterator.next(); - t.mock.timers.tick(interval); + const first = intervalIterator.next(); + t.mock.timers.tick(interval); - await assert.rejects(() => first, { - name: 'AbortError', + await assert.rejects(() => first, { + name: 'AbortError', + }); }); - }); - it('should abort operation given an abort controller signal on a real use case', async (t) => { - t.mock.timers.enable(['setInterval']); - const controller = new AbortController(); - const signal = controller.signal; - const interval = 200; - const expectedIterations = 2; - const startedAt = Date.now(); - const timeResults = []; - async function run() { - const it = nodeTimersPromises.setInterval(interval, startedAt, { signal }); - for await (const time of it) { - timeResults.push(time); - if (timeResults.length === 5) break; + it('should abort operation given an abort controller signal on a real use case', async (t) => { + t.mock.timers.enable({ apis: ['setInterval'] }); + const controller = new AbortController(); + const signal = controller.signal; + const interval = 200; + const expectedIterations = 2; + let numIterations = 0; + async function run() { + const it = nodeTimersPromises.setInterval(interval, undefined, { signal }); + for await (const _ of it) { // eslint-disable-line no-unused-vars + numIterations += 1; + if (numIterations === 5) break; + } } - } - const r = run(); - t.mock.timers.tick(interval); - t.mock.timers.tick(interval); - controller.abort(); - t.mock.timers.tick(interval); - t.mock.timers.tick(interval); - t.mock.timers.tick(interval); - t.mock.timers.tick(interval); - - await assert.rejects(() => r, { - name: 'AbortError', + const r = run(); + t.mock.timers.tick(interval); + t.mock.timers.tick(interval); + controller.abort(); + t.mock.timers.tick(interval); + t.mock.timers.tick(interval); + t.mock.timers.tick(interval); + t.mock.timers.tick(interval); + + await assert.rejects(() => r, { + name: 'AbortError', + }); + assert.strictEqual(numIterations, expectedIterations); }); - assert.strictEqual(timeResults.length, expectedIterations); - - for (let it = 1; it < expectedIterations; it++) { - assert.strictEqual(timeResults[it - 1], startedAt + (interval * it)); - } - }); - - }); - - describe('setImmediate Suite', () => { - it('should advance in time and trigger timers when calling the .tick function multiple times', (t, done) => { - t.mock.timers.enable(['setImmediate']); - const p = nodeTimersPromises.setImmediate(); - - t.mock.timers.tick(5555); - - p.then(common.mustCall((result) => { - assert.strictEqual(result, undefined); - done(); - }, 1)); - }); - - it('should work with the same params as the original timers/promises/setImmediate', async (t) => { - t.mock.timers.enable(['setImmediate']); - const expectedResult = 'result'; - const controller = new AbortController(); - const p = nodeTimersPromises.setImmediate(expectedResult, { - ref: true, - signal: controller.signal + // Test for https://github.com/nodejs/node/issues/50381 + it('should use the mocked interval', (t) => { + t.mock.timers.enable({ apis: ['setInterval'] }); + const fn = t.mock.fn(); + setInterval(fn, 1000); + assert.strictEqual(fn.mock.callCount(), 0); + t.mock.timers.tick(1000); + assert.strictEqual(fn.mock.callCount(), 1); + t.mock.timers.tick(1); + t.mock.timers.tick(1); + t.mock.timers.tick(1); + assert.strictEqual(fn.mock.callCount(), 1); }); - t.mock.timers.tick(500); + // Test for https://github.com/nodejs/node/issues/50382 + it('should not prevent due timers to be processed', async (t) => { + t.mock.timers.enable({ apis: ['setInterval', 'setTimeout'] }); + const f1 = t.mock.fn(); + const f2 = t.mock.fn(); - const result = await p; - assert.strictEqual(result, expectedResult); - }); + setInterval(f1, 1000); + setTimeout(f2, 1001); - it('should abort operation if timers/promises/setImmediate received an aborted signal', async (t) => { - t.mock.timers.enable(['setImmediate']); - const expectedResult = 'result'; - const controller = new AbortController(); - const p = nodeTimersPromises.setImmediate(expectedResult, { - ref: true, - signal: controller.signal - }); + assert.strictEqual(f1.mock.callCount(), 0); + assert.strictEqual(f2.mock.callCount(), 0); - controller.abort(); - t.mock.timers.tick(0); + t.mock.timers.tick(1001); - await assert.rejects(() => p, { - name: 'AbortError', + assert.strictEqual(f1.mock.callCount(), 1); + assert.strictEqual(f2.mock.callCount(), 1); }); - }); - it('should abort operation even if the .tick wasn\'t called', async (t) => { - t.mock.timers.enable(['setImmediate']); - const expectedResult = 'result'; - const controller = new AbortController(); - const p = nodeTimersPromises.setImmediate(expectedResult, { - ref: true, - signal: controller.signal - }); - - controller.abort(); + }); + }); - await assert.rejects(() => p, { - name: 'AbortError', - }); - }); + describe('Date Suite', () => { + it('should return the initial UNIX epoch if not specified', (t) => { + t.mock.timers.enable({ apis: ['Date'] }); + const date = new Date(); + assert.strictEqual(date.getTime(), 0); + assert.strictEqual(Date.now(), 0); + }); - it('should abort operation when .abort is called before calling setImmediate', async (t) => { - t.mock.timers.enable(['setImmediate']); - const expectedResult = 'result'; - const controller = new AbortController(); - controller.abort(); - const p = nodeTimersPromises.setImmediate(expectedResult, { - ref: true, - signal: controller.signal - }); + it('should throw an error if setTime is called without enabling timers', (t) => { + assert.throws( + () => { + t.mock.timers.setTime(100); + }, + { code: 'ERR_INVALID_STATE' } + ); + }); - await assert.rejects(() => p, { - name: 'AbortError', - }); + it('should throw an error if epoch passed to enable is not valid', (t) => { + assert.throws( + () => { + t.mock.timers.enable({ now: -1 }); + }, + { code: 'ERR_INVALID_ARG_VALUE' } + ); + + assert.throws( + () => { + t.mock.timers.enable({ now: 'string' }); + }, + { code: 'ERR_INVALID_ARG_TYPE' } + ); + + assert.throws( + () => { + t.mock.timers.enable({ now: NaN }); + }, + { code: 'ERR_INVALID_ARG_VALUE' } + ); + }); - }); + it('should replace the original Date with the mocked one', (t) => { + t.mock.timers.enable({ apis: ['Date'] }); + assert.ok(Date.isMock); + }); - it('should reject given an an invalid signal instance', async (t) => { - t.mock.timers.enable(['setImmediate']); - const expectedResult = 'result'; - const p = nodeTimersPromises.setImmediate(expectedResult, { - ref: true, - signal: {} - }); + it('should return the ticked time when calling Date.now after tick', (t) => { + t.mock.timers.enable({ apis: ['Date'] }); + const time = 100; + t.mock.timers.tick(time); + assert.strictEqual(Date.now(), time); + }); - await assert.rejects(() => p, { - name: 'TypeError', - code: 'ERR_INVALID_ARG_TYPE' - }); + it('should return the Date as string when calling it as a function', (t) => { + t.mock.timers.enable({ apis: ['Date'] }); + const returned = Date(); + // Matches the format: 'Mon Jan 01 1970 00:00:00' + // We don't care about the date, just the format + assert.ok(/\w{3}\s\w{3}\s\d{1,2}\s\d{2,4}\s\d{1,2}:\d{2}:\d{2}/.test(returned)); + }); - }); + it('should return the date with different argument calls', (t) => { + t.mock.timers.enable({ apis: ['Date'] }); + assert.strictEqual(new Date(0).getTime(), 0); + assert.strictEqual(new Date(100).getTime(), 100); + assert.strictEqual(new Date('1970-01-01T00:00:00.000Z').getTime(), 0); + assert.strictEqual(new Date(1970, 0).getFullYear(), 1970); + assert.strictEqual(new Date(1970, 0).getMonth(), 0); + assert.strictEqual(new Date(1970, 0, 1).getDate(), 1); + assert.strictEqual(new Date(1970, 0, 1, 11).getHours(), 11); + assert.strictEqual(new Date(1970, 0, 1, 11, 10).getMinutes(), 10); + assert.strictEqual(new Date(1970, 0, 1, 11, 10, 45).getSeconds(), 45); + assert.strictEqual(new Date(1970, 0, 1, 11, 10, 45, 898).getMilliseconds(), 898); + assert.strictEqual(new Date(1970, 0, 1, 11, 10, 45, 898).toDateString(), 'Thu Jan 01 1970'); + }); - it('should execute in order if setImmediate is called multiple times', async (t) => { - t.mock.timers.enable(['setImmediate']); + it('should return native code when calling Date.toString', (t) => { + t.mock.timers.enable({ apis: ['Date'] }); + assert.strictEqual(Date.toString(), 'function Date() { [native code] }'); + }); - const p1 = nodeTimersPromises.setImmediate('fn1'); - const p2 = nodeTimersPromises.setImmediate('fn2'); + it('should start with a custom epoch if the second argument is specified', (t) => { + t.mock.timers.enable({ apis: ['Date'], now: 100 }); + const date1 = new Date(); + assert.strictEqual(date1.getTime(), 100); - t.mock.timers.tick(0); + t.mock.timers.reset(); + t.mock.timers.enable({ apis: ['Date'], now: new Date(200) }); + const date2 = new Date(); + assert.strictEqual(date2.getTime(), 200); + }); - const results = await Promise.race([p1, p2]); + it('should replace epoch if setTime is lesser than now and not tick', (t) => { + t.mock.timers.enable(); + const fn = t.mock.fn(); + const id = setTimeout(fn, 1000); + t.mock.timers.setTime(800); + assert.strictEqual(Date.now(), 800); + t.mock.timers.setTime(500); + assert.strictEqual(Date.now(), 500); + assert.strictEqual(fn.mock.callCount(), 0); + clearTimeout(id); + }); - assert.strictEqual(results, 'fn1'); - }); + it('should not tick time when setTime is called', (t) => { + t.mock.timers.enable(); + const fn = t.mock.fn(); + const id = setTimeout(fn, 1000); + t.mock.timers.setTime(1200); + assert.strictEqual(Date.now(), 1200); + assert.strictEqual(fn.mock.callCount(), 0); + clearTimeout(id); }); }); }); diff --git a/test/parallel/test-runner-output.mjs b/test/parallel/test-runner-output.mjs index 372ca8f3bae0ff..e40ce896bff465 100644 --- a/test/parallel/test-runner-output.mjs +++ b/test/parallel/test-runner-output.mjs @@ -15,7 +15,7 @@ function replaceTestDuration(str) { } const color = '(\\[\\d+m)'; -const stackTraceBasePath = new RegExp(`${color}\\(${process.cwd()}/?${color}(.*)${color}\\)`, 'g'); +const stackTraceBasePath = new RegExp(`${color}\\(${process.cwd().replaceAll(/[\\^$*+?.()|[\]{}]/g, '\\$&')}/?${color}(.*)${color}\\)`, 'g'); function replaceSpecDuration(str) { return str @@ -40,6 +40,23 @@ function replaceTestLocationLine(str) { return str.replaceAll(/(js:)(\d+)(:\d+)/g, '$1(LINE)$3'); } +// The Node test coverage returns results for all files called by the test. This +// will make the output file change if files like test/common/index.js change. +// This transform picks only the first line and then the lines from the test +// file. +function pickTestFileFromLcov(str) { + const lines = str.split(/\n/); + const firstLineOfTestFile = lines.findIndex( + (line) => line.startsWith('SF:') && line.trim().endsWith('output.js') + ); + const lastLineOfTestFile = lines.findIndex( + (line, index) => index > firstLineOfTestFile && line.trim() === 'end_of_record' + ); + return ( + lines[0] + '\n' + lines.slice(firstLineOfTestFile, lastLineOfTestFile + 1).join('\n') + '\n' + ); +} + const defaultTransform = snapshot.transform( snapshot.replaceWindowsLineEndings, snapshot.replaceStackTrace, @@ -59,6 +76,14 @@ const junitTransform = snapshot.transform( snapshot.replaceWindowsLineEndings, snapshot.replaceStackTrace, ); +const lcovTransform = snapshot.transform( + snapshot.replaceWindowsLineEndings, + snapshot.replaceStackTrace, + snapshot.replaceFullPaths, + snapshot.replaceWindowsPaths, + pickTestFileFromLcov +); + const tests = [ { name: 'test-runner/output/abort.js' }, @@ -67,6 +92,7 @@ const tests = [ { name: 'test-runner/output/describe_it.js' }, { name: 'test-runner/output/describe_nested.js' }, { name: 'test-runner/output/hooks.js' }, + { name: 'test-runner/output/hooks_spec_reporter.js', transform: specTransform }, { name: 'test-runner/output/timeout_in_before_each_should_not_affect_further_tests.js' }, { name: 'test-runner/output/hooks-with-no-global-test.js' }, { name: 'test-runner/output/before-and-after-each-too-many-listeners.js' }, @@ -80,6 +106,7 @@ const tests = [ { name: 'test-runner/output/spec_reporter_successful.js', transform: specTransform }, { name: 'test-runner/output/spec_reporter.js', transform: specTransform }, { name: 'test-runner/output/spec_reporter_cli.js', transform: specTransform }, + process.features.inspector ? { name: 'test-runner/output/lcov_reporter.js', transform: lcovTransform } : false, { name: 'test-runner/output/output.js' }, { name: 'test-runner/output/output_cli.js' }, { name: 'test-runner/output/name_pattern.js' }, diff --git a/test/parallel/test-runner-reporters.js b/test/parallel/test-runner-reporters.js index bb831491366dfc..e40861eb87831f 100644 --- a/test/parallel/test-runner-reporters.js +++ b/test/parallel/test-runner-reporters.js @@ -155,4 +155,23 @@ describe('node:test reporters', { concurrency: true }, () => { assert.strictEqual(child.stdout.toString(), 'Going to throw an error\n'); assert.match(child.stderr.toString(), /Emitted 'error' event on Duplex instance/); }); + + it('should support stdout as a destination with spec reporter', async () => { + process.env.FORCE_COLOR = '1'; + const file = tmpdir.resolve(`${tmpFiles++}.txt`); + const child = spawnSync(process.execPath, + ['--test', '--test-reporter', 'spec', '--test-reporter-destination', file, testFile]); + assert.strictEqual(child.stderr.toString(), ''); + assert.strictEqual(child.stdout.toString(), ''); + const fileConent = fs.readFileSync(file, 'utf8'); + assert.match(fileConent, /▶ nested/); + assert.match(fileConent, /✔ ok/); + assert.match(fileConent, /✖ failing/); + assert.match(fileConent, /ℹ tests 4/); + assert.match(fileConent, /ℹ pass 2/); + assert.match(fileConent, /ℹ fail 2/); + assert.match(fileConent, /ℹ cancelled 0/); + assert.match(fileConent, /ℹ skipped 0/); + assert.match(fileConent, /ℹ todo 0/); + }); }); diff --git a/test/parallel/test-runner-run.mjs b/test/parallel/test-runner-run.mjs index 3201da25f87a1d..8f95de4db16296 100644 --- a/test/parallel/test-runner-run.mjs +++ b/test/parallel/test-runner-run.mjs @@ -96,6 +96,16 @@ describe('require(\'node:test\').run', { concurrency: true }, () => { assert.match(stringResults[1], /tests 1/); assert.match(stringResults[1], /pass 1/); }); + + it('spec', async () => { + const result = await run({ + files: [join(testFixtures, 'default-behavior/test/random.cjs')] + }).compose(spec).toArray(); + const stringResults = result.map((bfr) => bfr.toString()); + assert.match(stringResults[0], /this should pass/); + assert.match(stringResults[1], /tests 1/); + assert.match(stringResults[1], /pass 1/); + }); }); it('should be piped with tap', async () => { @@ -166,6 +176,17 @@ describe('require(\'node:test\').run', { concurrency: true }, () => { }); describe('AbortSignal', () => { + it('should accept a signal', async () => { + const stream = run({ signal: AbortSignal.timeout(50), files: [ + fixtures.path('test-runner', 'never_ending_sync.js'), + fixtures.path('test-runner', 'never_ending_async.js'), + ] }); + stream.on('test:fail', common.mustCall(2)); + stream.on('test:pass', common.mustNotCall()); + // eslint-disable-next-line no-unused-vars + for await (const _ of stream); + }); + it('should stop watch mode when abortSignal aborts', async () => { const controller = new AbortController(); const result = await run({ @@ -444,5 +465,51 @@ describe('require(\'node:test\').run', { concurrency: true }, () => { code: 'ERR_INVALID_ARG_TYPE' })); }); + + it('should pass instance of stream to setup', async () => { + const stream = run({ + files: [join(testFixtures, 'default-behavior/test/random.cjs')], + setup: common.mustCall((root) => { + assert.strictEqual(root.constructor.name, 'TestsStream'); + }), + }); + stream.on('test:fail', common.mustNotCall()); + stream.on('test:pass', common.mustCall()); + // eslint-disable-next-line no-unused-vars + for await (const _ of stream); + }); + }); + + it('should run with no files', async () => { + const stream = run({ + files: undefined + }).compose(tap); + stream.on('test:fail', common.mustNotCall()); + stream.on('test:pass', common.mustNotCall()); + + // eslint-disable-next-line no-unused-vars + for await (const _ of stream); + }); + + it('should run with no files and use spec reporter', async () => { + const stream = run({ + files: undefined + }).compose(spec); + stream.on('test:fail', common.mustNotCall()); + stream.on('test:pass', common.mustNotCall()); + + // eslint-disable-next-line no-unused-vars + for await (const _ of stream); + }); + + it('should run with no files and use dot reporter', async () => { + const stream = run({ + files: undefined + }).compose(dot); + stream.on('test:fail', common.mustNotCall()); + stream.on('test:pass', common.mustNotCall()); + + // eslint-disable-next-line no-unused-vars + for await (const _ of stream); }); }); diff --git a/test/parallel/test-shadow-realm-allowed-builtin-modules.js b/test/parallel/test-shadow-realm-allowed-builtin-modules.js new file mode 100644 index 00000000000000..2aa550ac7bb55b --- /dev/null +++ b/test/parallel/test-shadow-realm-allowed-builtin-modules.js @@ -0,0 +1,21 @@ +// Flags: --experimental-shadow-realm +'use strict'; +const common = require('../common'); +const assert = require('assert'); + +async function main() { + // Verifies that builtin modules can not be imported in the ShadowRealm. + const realm = new ShadowRealm(); + // The error object created inside the ShadowRealm with the error code + // property is not copied on the realm boundary. Only the error message + // is copied. Simply check the error message here. + await assert.rejects(realm.importValue('fs', 'readFileSync'), { + message: /Cannot find package 'fs'/, + }); + // As above, we can only validate the error message, not the error code. + await assert.rejects(realm.importValue('node:fs', 'readFileSync'), { + message: /No such built-in module: node:fs/, + }); +} + +main().then(common.mustCall()); diff --git a/test/parallel/test-shadow-realm-custom-loaders.js b/test/parallel/test-shadow-realm-custom-loaders.js new file mode 100644 index 00000000000000..80cda74bb88940 --- /dev/null +++ b/test/parallel/test-shadow-realm-custom-loaders.js @@ -0,0 +1,26 @@ +'use strict'; +const common = require('../common'); +const fixtures = require('../common/fixtures'); +const assert = require('assert'); + +const commonArgs = [ + '--experimental-shadow-realm', + '--no-warnings', +]; + +async function main() { + // Verifies that custom loaders are not enabled in the ShadowRealm. + const child = await common.spawnPromisified(process.execPath, [ + ...commonArgs, + '--experimental-loader', + fixtures.fileURL('es-module-loaders', 'loader-resolve-shortcircuit.mjs'), + '--experimental-loader', + fixtures.fileURL('es-module-loaders', 'loader-load-foo-or-42.mjs'), + fixtures.path('es-module-shadow-realm', 'custom-loaders.js'), + ]); + + assert.strictEqual(child.stderr, ''); + assert.strictEqual(child.code, 0); +} + +main().then(common.mustCall()); diff --git a/test/parallel/test-shadow-realm-gc-module.js b/test/parallel/test-shadow-realm-gc-module.js new file mode 100644 index 00000000000000..6077bf03146d87 --- /dev/null +++ b/test/parallel/test-shadow-realm-gc-module.js @@ -0,0 +1,18 @@ +// Flags: --experimental-shadow-realm --max-old-space-size=20 +'use strict'; + +/** + * Verifying modules imported by ShadowRealm instances can be correctly + * garbage collected. + */ + +const common = require('../common'); +const fixtures = require('../common/fixtures'); +const { runAndBreathe } = require('../common/gc'); + +const mod = fixtures.fileURL('es-module-shadow-realm', 'state-counter.mjs'); + +runAndBreathe(async () => { + const realm = new ShadowRealm(); + await realm.importValue(mod, 'getCounter'); +}, 100).then(common.mustCall()); diff --git a/test/parallel/test-shadow-realm-gc.js b/test/parallel/test-shadow-realm-gc.js index 83f793fd89222f..c6de4a32a88faa 100644 --- a/test/parallel/test-shadow-realm-gc.js +++ b/test/parallel/test-shadow-realm-gc.js @@ -6,14 +6,16 @@ */ const common = require('../common'); +const { runAndBreathe } = require('../common/gc'); const assert = require('assert'); const { isMainThread, Worker } = require('worker_threads'); -for (let i = 0; i < 100; i++) { +runAndBreathe(() => { const realm = new ShadowRealm(); realm.evaluate('new TextEncoder(); 1;'); -} +}, 100).then(common.mustCall()); +// Test it in worker too. if (isMainThread) { const worker = new Worker(__filename); worker.on('exit', common.mustCall((code) => { diff --git a/test/parallel/test-shadow-realm-import-value-resolve.js b/test/parallel/test-shadow-realm-import-value-resolve.js new file mode 100644 index 00000000000000..ee1c17d67c12f1 --- /dev/null +++ b/test/parallel/test-shadow-realm-import-value-resolve.js @@ -0,0 +1,28 @@ +// Flags: --experimental-shadow-realm +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const path = require('path'); + +common.skipIfWorker('process.chdir is not supported in workers.'); + +async function main() { + const realm = new ShadowRealm(); + + const dirname = __dirname; + // Set process cwd to the parent directory of __dirname. + const cwd = path.dirname(dirname); + process.chdir(cwd); + // Hardcode the relative path to ensure the string is still a valid relative + // URL string. + const relativePath = './fixtures/es-module-shadow-realm/re-export-state-counter.mjs'; + + // Make sure that the module can not be resolved relative to __filename. + assert.throws(() => require.resolve(relativePath), { code: 'MODULE_NOT_FOUND' }); + + // Resolve relative to the current working directory. + const getCounter = await realm.importValue(relativePath, 'getCounter'); + assert.strictEqual(typeof getCounter, 'function'); +} + +main().then(common.mustCall()); diff --git a/test/parallel/test-shadow-realm-module.js b/test/parallel/test-shadow-realm-module.js new file mode 100644 index 00000000000000..bc0c2c04f69f2b --- /dev/null +++ b/test/parallel/test-shadow-realm-module.js @@ -0,0 +1,29 @@ +// Flags: --experimental-shadow-realm +'use strict'; +const common = require('../common'); +const fixtures = require('../common/fixtures'); +const assert = require('assert'); + +async function main() { + const realm = new ShadowRealm(); + const mod = fixtures.fileURL('es-module-shadow-realm', 'state-counter.mjs'); + const getCounter = await realm.importValue(mod, 'getCounter'); + assert.strictEqual(getCounter(), 0); + const getCounter1 = await realm.importValue(mod, 'getCounter'); + // Returned value is a newly wrapped function. + assert.notStrictEqual(getCounter, getCounter1); + // Verify that the module state is shared between two `importValue` calls. + assert.strictEqual(getCounter1(), 1); + assert.strictEqual(getCounter(), 2); + + const { getCounter: getCounterThisRealm } = await import(mod); + assert.notStrictEqual(getCounterThisRealm, getCounter); + // Verify that the module state is not shared between two realms. + assert.strictEqual(getCounterThisRealm(), 0); + assert.strictEqual(getCounter(), 3); + + // Verify that shadow realm rejects to import a non-existing module. + await assert.rejects(realm.importValue('non-exists', 'exports'), TypeError); +} + +main().then(common.mustCall()); diff --git a/test/parallel/test-shadow-realm-preload-module.js b/test/parallel/test-shadow-realm-preload-module.js new file mode 100644 index 00000000000000..ebd29c1c4a8b80 --- /dev/null +++ b/test/parallel/test-shadow-realm-preload-module.js @@ -0,0 +1,20 @@ +'use strict'; +const common = require('../common'); +const fixtures = require('../common/fixtures'); +const { spawnSyncAndExitWithoutError } = require('../common/child_process'); + +const commonArgs = [ + '--experimental-shadow-realm', +]; + +async function main() { + // Verifies that --require preload modules are not enabled in the ShadowRealm. + spawnSyncAndExitWithoutError(process.execPath, [ + ...commonArgs, + '--require', + fixtures.path('es-module-shadow-realm', 'preload.js'), + fixtures.path('es-module-shadow-realm', 'preload-main.js'), + ]); +} + +main().then(common.mustCall()); diff --git a/test/parallel/test-snapshot-child-process-sync.js b/test/parallel/test-snapshot-child-process-sync.js new file mode 100644 index 00000000000000..3ec7b2952853ba --- /dev/null +++ b/test/parallel/test-snapshot-child-process-sync.js @@ -0,0 +1,53 @@ +'use strict'; + +// This tests that process.cwd() is accurate when +// restoring state from a snapshot + +require('../common'); +const { spawnSyncAndExitWithoutError } = require('../common/child_process'); +const tmpdir = require('../common/tmpdir'); +const fixtures = require('../common/fixtures'); +const assert = require('assert'); + +tmpdir.refresh(); +const blobPath = tmpdir.resolve('snapshot.blob'); +const file = fixtures.path('snapshot', 'child-process-sync.js'); +const expected = [ + 'From child process spawnSync', + 'From child process execSync', + 'From child process execFileSync', +]; + +{ + // Create the snapshot. + spawnSyncAndExitWithoutError(process.execPath, [ + '--snapshot-blob', + blobPath, + '--build-snapshot', + file, + ], { + cwd: tmpdir.path, + }, { + trim: true, + stdout(output) { + assert.deepStrictEqual(output.split('\n'), expected); + return true; + } + }); +} + +{ + spawnSyncAndExitWithoutError(process.execPath, [ + '--snapshot-blob', + blobPath, + file, + ], { + cwd: tmpdir.path, + }, { + trim: true, + stdout(output) { + assert.deepStrictEqual(output.split('\n'), expected); + return true; + } + }); +} diff --git a/test/parallel/test-snapshot-config.js b/test/parallel/test-snapshot-config.js new file mode 100644 index 00000000000000..43dfda4af7f9a5 --- /dev/null +++ b/test/parallel/test-snapshot-config.js @@ -0,0 +1,138 @@ +'use strict'; + +// This tests --build-snapshot-config. + +require('../common'); +const assert = require('assert'); +const { + spawnSyncAndExitWithoutError, + spawnSyncAndExit, +} = require('../common/child_process'); +const tmpdir = require('../common/tmpdir'); +const fixtures = require('../common/fixtures'); +const fs = require('fs'); + +const blobPath = tmpdir.resolve('snapshot.blob'); +const builderScript = fixtures.path('snapshot', 'mutate-fs.js'); +const checkFile = fixtures.path('snapshot', 'check-mutate-fs.js'); +const configPath = tmpdir.resolve('snapshot.json'); +tmpdir.refresh(); +{ + // Relative path. + spawnSyncAndExit(process.execPath, [ + '--snapshot-blob', + blobPath, + '--build-snapshot-config', + 'snapshot.json', + ], { + cwd: tmpdir.path + }, { + signal: null, + status: 1, + trim: true, + stderr: /Cannot read snapshot configuration from snapshot\.json/ + }); + + // Absolute path. + spawnSyncAndExit(process.execPath, [ + '--snapshot-blob', + blobPath, + '--build-snapshot-config', + configPath, + ], { + cwd: tmpdir.path + }, { + signal: null, + status: 1, + trim: true, + stderr: /Cannot read snapshot configuration from .+snapshot\.json/ + }); +} + +function writeConfig(config) { + fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf8'); +} + +{ + tmpdir.refresh(); + // Config without "builder" field should be rejected. + writeConfig({}); + spawnSyncAndExit(process.execPath, [ + '--snapshot-blob', + blobPath, + '--build-snapshot-config', + configPath, + ], { + cwd: tmpdir.path + }, { + signal: null, + status: 1, + trim: true, + stderr: /"builder" field of .+snapshot\.json is not a non-empty string/ + }); +} + +let sizeWithCache; +{ + tmpdir.refresh(); + // Create a working snapshot. + writeConfig({ builder: builderScript }); + spawnSyncAndExitWithoutError(process.execPath, [ + '--snapshot-blob', + blobPath, + '--build-snapshot-config', + configPath, + ], { + cwd: tmpdir.path + }, {}); + const stats = fs.statSync(blobPath); + assert(stats.isFile()); + sizeWithCache = stats.size; + + // Check the snapshot. + spawnSyncAndExitWithoutError(process.execPath, [ + '--snapshot-blob', + blobPath, + checkFile, + ], { + cwd: tmpdir.path + }); +} + +let sizeWithoutCache; +{ + tmpdir.refresh(); + // Create a working snapshot. + writeConfig({ builder: builderScript, withoutCodeCache: true }); + spawnSyncAndExitWithoutError(process.execPath, [ + '--snapshot-blob', + blobPath, + '--build-snapshot-config', + configPath, + ], { + env: { + ...process.env, + NODE_DEBUG_NATIVE: 'CODE_CACHE' + }, + cwd: tmpdir.path + }, {}); + const stats = fs.statSync(blobPath); + assert(stats.isFile()); + sizeWithoutCache = stats.size; + assert(sizeWithoutCache < sizeWithCache, + `sizeWithoutCache = ${sizeWithoutCache} >= sizeWithCache ${sizeWithCache}`); + // Check the snapshot. + spawnSyncAndExitWithoutError(process.execPath, [ + '--snapshot-blob', + blobPath, + checkFile, + ], { + cwd: tmpdir.path, + env: { + ...process.env, + NODE_DEBUG_NATIVE: 'CODE_CACHE' + }, + }, { + stderr: /snapshot contains 0 code cache/ + }); +} diff --git a/test/parallel/test-source-map-enable.js b/test/parallel/test-source-map-enable.js index 5038aff360e518..46c25d26cfa8e7 100644 --- a/test/parallel/test-source-map-enable.js +++ b/test/parallel/test-source-map-enable.js @@ -289,6 +289,30 @@ function nextdir() { assert.match(output.stderr.toString(), /at functionC.*10:3/); } +// Properly converts Windows absolute paths to absolute URLs. +// Refs: https://github.com/nodejs/node/issues/50523 +// Refs: https://github.com/TypeStrong/ts-node/issues/1769 +{ + const coverageDirectory = nextdir(); + const output = spawnSync(process.execPath, [ + require.resolve('../fixtures/source-map/ts-node-win32.js'), + ], { env: { ...process.env, NODE_V8_COVERAGE: coverageDirectory } }); + assert.strictEqual(output.status, 0); + assert.strictEqual(output.stderr.toString(), ''); + const sourceMap = getSourceMapFromCache( + 'ts-node-win32.js', + coverageDirectory + ); + // base64 JSON should have been decoded, the D: in the sources field should + // have been taken as the drive letter on Windows, the scheme on POSIX. + assert.strictEqual( + sourceMap.data.sources[0], + common.isWindows ? + 'file:///D:/workspaces/node/test/fixtures/source-map/ts-node.ts' : + 'd:/workspaces/node/test/fixtures/source-map/ts-node.ts' + ); +} + // Stores and applies source map associated with file that throws while // being required. { diff --git a/test/parallel/test-stdin-from-file.js b/test/parallel/test-stdin-from-file.js index 7c263d1858a556..67404c84c9830b 100644 --- a/test/parallel/test-stdin-from-file.js +++ b/test/parallel/test-stdin-from-file.js @@ -8,22 +8,10 @@ const fs = require('fs'); const stdoutScript = fixtures.path('echo-close-check.js'); const tmpFile = tmpdir.resolve('stdin.txt'); +const string = fixtures.utf8TestText; const cmd = `"${process.argv[0]}" "${stdoutScript}" < "${tmpFile}"`; -const string = 'abc\nümlaut.\nsomething else\n' + - '南越国是前203年至前111年存在于岭南地区的一个国家,国都位于番禺,' + - '疆域包括今天中国的广东、广西两省区的大部份地区,福建省、湖南、贵州、' + - '云南的一小部份地区和越南的北部。南越国是秦朝灭亡后,' + - '由南海郡尉赵佗于前203年起兵兼并桂林郡和象郡后建立。前196年和前179年,' + - '南越国曾先后两次名义上臣属于西汉,成为西汉的“外臣”。前112年,' + - '南越国末代君主赵建德与西汉发生战争,被汉武帝于前111年所灭。南越国共存在93年,' + - '历经五代君主。南越国是岭南地区的第一个有记载的政权国家,' + - '采用封建制和郡县制并存的制度,' + - '它的建立保证了秦末乱世岭南地区社会秩序的稳定,' + - '有效的改善了岭南地区落后的政治、##济现状。\n'; - - tmpdir.refresh(); console.log(`${cmd}\n\n`); diff --git a/test/parallel/test-stream-buffer-list.js b/test/parallel/test-stream-buffer-list.js deleted file mode 100644 index d9d0405f4d5a45..00000000000000 --- a/test/parallel/test-stream-buffer-list.js +++ /dev/null @@ -1,84 +0,0 @@ -// Flags: --expose-internals -'use strict'; -require('../common'); -const assert = require('assert'); -const BufferList = require('internal/streams/buffer_list'); - -// Test empty buffer list. -const emptyList = new BufferList(); - -emptyList.shift(); -assert.deepStrictEqual(emptyList, new BufferList()); - -assert.strictEqual(emptyList.join(','), ''); - -assert.deepStrictEqual(emptyList.concat(0), Buffer.alloc(0)); - -const buf = Buffer.from('foo'); - -function testIterator(list, count) { - // test iterator - let len = 0; - // eslint-disable-next-line no-unused-vars - for (const x of list) { - len++; - } - assert.strictEqual(len, count); -} - -// Test buffer list with one element. -const list = new BufferList(); -testIterator(list, 0); - -list.push(buf); -testIterator(list, 1); -for (const x of list) { - assert.strictEqual(x, buf); -} - -const copy = list.concat(3); -testIterator(copy, 3); - -assert.notStrictEqual(copy, buf); -assert.deepStrictEqual(copy, buf); - -assert.strictEqual(list.join(','), 'foo'); - -const shifted = list.shift(); -testIterator(list, 0); -assert.strictEqual(shifted, buf); -assert.deepStrictEqual(list, new BufferList()); - -{ - const list = new BufferList(); - list.push('foo'); - list.push('bar'); - list.push('foo'); - list.push('bar'); - assert.strictEqual(list.consume(6, true), 'foobar'); - assert.strictEqual(list.consume(6, true), 'foobar'); -} - -{ - const list = new BufferList(); - list.push('foo'); - list.push('bar'); - assert.strictEqual(list.consume(5, true), 'fooba'); -} - -{ - const list = new BufferList(); - list.push(buf); - list.push(buf); - list.push(buf); - list.push(buf); - assert.strictEqual(list.consume(6).toString(), 'foofoo'); - assert.strictEqual(list.consume(6).toString(), 'foofoo'); -} - -{ - const list = new BufferList(); - list.push(buf); - list.push(buf); - assert.strictEqual(list.consume(5).toString(), 'foofo'); -} diff --git a/test/parallel/test-stream-consumers.js b/test/parallel/test-stream-consumers.js index 4abd0f842e82bf..883d55dc6f02fb 100644 --- a/test/parallel/test-stream-consumers.js +++ b/test/parallel/test-stream-consumers.js @@ -114,7 +114,7 @@ const kArrayBuffer = writer.close(); }, 10); - assert.rejects(blob(readable), { code: 'ERR_INVALID_STATE' }); + assert.rejects(blob(readable), { code: 'ERR_INVALID_STATE' }).then(common.mustCall()); } { @@ -132,7 +132,7 @@ const kArrayBuffer = writer.close(); }, 10); - assert.rejects(arrayBuffer(readable), { code: 'ERR_INVALID_STATE' }); + assert.rejects(arrayBuffer(readable), { code: 'ERR_INVALID_STATE' }).then(common.mustCall()); } { @@ -150,7 +150,7 @@ const kArrayBuffer = writer.close(); }, 10); - assert.rejects(text(readable), { code: 'ERR_INVALID_STATE' }); + assert.rejects(text(readable), { code: 'ERR_INVALID_STATE' }).then(common.mustCall()); } { @@ -168,7 +168,7 @@ const kArrayBuffer = writer.close(); }, 10); - assert.rejects(json(readable), { code: 'ERR_INVALID_STATE' }); + assert.rejects(json(readable), { code: 'ERR_INVALID_STATE' }).then(common.mustCall()); } { @@ -227,7 +227,7 @@ const kArrayBuffer = assert.rejects(text(stream), { code: 'ERR_INVALID_ARG_TYPE', - }); + }).then(common.mustCall()); stream.write({}); stream.end({}); @@ -241,7 +241,7 @@ const kArrayBuffer = assert.rejects(json(stream), { code: 'ERR_INVALID_ARG_TYPE', - }); + }).then(common.mustCall()); stream.write({}); stream.end({}); diff --git a/test/parallel/test-stream-readable-destroy.js b/test/parallel/test-stream-readable-destroy.js index a62beb27961816..fb7da632f7b057 100644 --- a/test/parallel/test-stream-readable-destroy.js +++ b/test/parallel/test-stream-readable-destroy.js @@ -318,7 +318,7 @@ const assert = require('assert'); assert.rejects((async () => { // eslint-disable-next-line no-unused-vars, no-empty for await (const chunk of read) { } - })(), /AbortError/); + })(), /AbortError/).then(common.mustCall()); setTimeout(() => controller.abort(), 0); } diff --git a/test/parallel/test-stream-reduce.js b/test/parallel/test-stream-reduce.js index 56271c5e232627..4cee2b5d71513b 100644 --- a/test/parallel/test-stream-reduce.js +++ b/test/parallel/test-stream-reduce.js @@ -119,10 +119,10 @@ function sum(p, c) { { // Error cases - assert.rejects(() => Readable.from([]).reduce(1), /TypeError/); - assert.rejects(() => Readable.from([]).reduce('5'), /TypeError/); - assert.rejects(() => Readable.from([]).reduce((x, y) => x + y, 0, 1), /ERR_INVALID_ARG_TYPE/); - assert.rejects(() => Readable.from([]).reduce((x, y) => x + y, 0, { signal: true }), /ERR_INVALID_ARG_TYPE/); + assert.rejects(() => Readable.from([]).reduce(1), /TypeError/).then(common.mustCall()); + assert.rejects(() => Readable.from([]).reduce('5'), /TypeError/).then(common.mustCall()); + assert.rejects(() => Readable.from([]).reduce((x, y) => x + y, 0, 1), /ERR_INVALID_ARG_TYPE/).then(common.mustCall()); + assert.rejects(() => Readable.from([]).reduce((x, y) => x + y, 0, { signal: true }), /ERR_INVALID_ARG_TYPE/).then(common.mustCall()); } { diff --git a/test/parallel/test-stream-uint8array.js b/test/parallel/test-stream-uint8array.js index 38a45d54048967..f1de4c873fd3a8 100644 --- a/test/parallel/test-stream-uint8array.js +++ b/test/parallel/test-stream-uint8array.js @@ -38,7 +38,7 @@ const GHI = new Uint8Array([0x47, 0x48, 0x49]); assert(!(chunk instanceof Buffer)); assert(chunk instanceof Uint8Array); assert.strictEqual(chunk, ABC); - assert.strictEqual(encoding, 'utf8'); + assert.strictEqual(encoding, undefined); cb(); }) }); diff --git a/test/parallel/test-stream2-readable-from-list.js b/test/parallel/test-stream2-readable-from-list.js deleted file mode 100644 index d5d113304e4925..00000000000000 --- a/test/parallel/test-stream2-readable-from-list.js +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// Flags: --expose-internals -'use strict'; -require('../common'); -const assert = require('assert'); -const fromList = require('stream').Readable._fromList; -const BufferList = require('internal/streams/buffer_list'); -const util = require('util'); - -function bufferListFromArray(arr) { - const bl = new BufferList(); - for (let i = 0; i < arr.length; ++i) - bl.push(arr[i]); - return bl; -} - -{ - // Verify behavior with buffers - let list = [ Buffer.from('foog'), - Buffer.from('bark'), - Buffer.from('bazy'), - Buffer.from('kuel') ]; - list = bufferListFromArray(list); - - assert.strictEqual( - util.inspect([ list ], { compact: false }), - `[ - BufferList { - head: [Object], - tail: [Object], - length: 4 - } -]`); - - // Read more than the first element. - let ret = fromList(6, { buffer: list, length: 16 }); - assert.strictEqual(ret.toString(), 'foogba'); - - // Read exactly the first element. - ret = fromList(2, { buffer: list, length: 10 }); - assert.strictEqual(ret.toString(), 'rk'); - - // Read less than the first element. - ret = fromList(2, { buffer: list, length: 8 }); - assert.strictEqual(ret.toString(), 'ba'); - - // Read more than we have. - ret = fromList(100, { buffer: list, length: 6 }); - assert.strictEqual(ret.toString(), 'zykuel'); - - // all consumed. - assert.deepStrictEqual(list, new BufferList()); -} - -{ - // Verify behavior with strings - let list = [ 'foog', - 'bark', - 'bazy', - 'kuel' ]; - list = bufferListFromArray(list); - - // Read more than the first element. - let ret = fromList(6, { buffer: list, length: 16, decoder: true }); - assert.strictEqual(ret, 'foogba'); - - // Read exactly the first element. - ret = fromList(2, { buffer: list, length: 10, decoder: true }); - assert.strictEqual(ret, 'rk'); - - // Read less than the first element. - ret = fromList(2, { buffer: list, length: 8, decoder: true }); - assert.strictEqual(ret, 'ba'); - - // Read more than we have. - ret = fromList(100, { buffer: list, length: 6, decoder: true }); - assert.strictEqual(ret, 'zykuel'); - - // all consumed. - assert.deepStrictEqual(list, new BufferList()); -} diff --git a/test/parallel/test-stream2-transform.js b/test/parallel/test-stream2-transform.js index 6f57384eb02443..2636484ef4509f 100644 --- a/test/parallel/test-stream2-transform.js +++ b/test/parallel/test-stream2-transform.js @@ -413,11 +413,11 @@ const { PassThrough, Transform } = require('stream'); ended = true; }); - objects.forEach(function(obj) { + for (const obj of objects) { jp.write(JSON.stringify(obj)); const res = jp.read(); assert.deepStrictEqual(res, obj); - }); + } jp.end(); // Read one more time to get the 'end' event @@ -454,11 +454,11 @@ const { PassThrough, Transform } = require('stream'); ended = true; }); - objects.forEach(function(obj) { + for (const obj of objects) { js.write(obj); const res = js.read(); assert.strictEqual(res, JSON.stringify(obj)); - }); + } js.end(); // Read one more time to get the 'end' event diff --git a/test/parallel/test-structuredClone-global.js b/test/parallel/test-structuredClone-global.js index 95dab1e8e8963b..7a4d85b6c177f0 100644 --- a/test/parallel/test-structuredClone-global.js +++ b/test/parallel/test-structuredClone-global.js @@ -1,23 +1,28 @@ -// Flags: --expose-internals 'use strict'; -/* eslint-disable no-global-assign */ require('../common'); +const assert = require('assert'); -const { - structuredClone: _structuredClone, -} = require('internal/structured_clone'); +assert.throws(() => structuredClone(), { code: 'ERR_MISSING_ARGS' }); +assert.throws(() => structuredClone(undefined, ''), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => structuredClone(undefined, 1), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => structuredClone(undefined, { transfer: 1 }), { code: 'ERR_INVALID_ARG_TYPE' }); +assert.throws(() => structuredClone(undefined, { transfer: '' }), { code: 'ERR_INVALID_ARG_TYPE' }); -const { - strictEqual, - throws, -} = require('assert'); +// Options can be null or undefined. +assert.strictEqual(structuredClone(undefined), undefined); +assert.strictEqual(structuredClone(undefined, null), undefined); +// Transfer can be null or undefined. +assert.strictEqual(structuredClone(undefined, { transfer: null }), undefined); +assert.strictEqual(structuredClone(undefined, { }), undefined); -strictEqual(globalThis.structuredClone, _structuredClone); -structuredClone = undefined; -strictEqual(globalThis.structuredClone, undefined); +{ + // See: https://github.com/nodejs/node/issues/49940 + const cloned = structuredClone({}, { + transfer: { + *[Symbol.iterator]() {} + } + }); -// Restore the value for the known globals check. -structuredClone = _structuredClone; - -throws(() => _structuredClone(), /ERR_MISSING_ARGS/); + assert.deepStrictEqual(cloned, {}); +} diff --git a/test/parallel/test-timers-promises.js b/test/parallel/test-timers-promises.js new file mode 100644 index 00000000000000..6729bf12caf30e --- /dev/null +++ b/test/parallel/test-timers-promises.js @@ -0,0 +1,12 @@ +'use strict'; + +const common = require('../common'); + +const timer = require('node:timers'); +const timerPromises = require('node:timers/promises'); +const assert = require('assert'); +const { test } = require('node:test'); + +test('(node:timers/promises) is equal to (node:timers).promises', common.mustCall(() => { + assert.deepStrictEqual(timerPromises, timer.promises); +})); diff --git a/test/parallel/test-tls-getprotocol.js b/test/parallel/test-tls-getprotocol.js index 7da2f60676d00e..571f400cea5746 100644 --- a/test/parallel/test-tls-getprotocol.js +++ b/test/parallel/test-tls-getprotocol.js @@ -35,7 +35,7 @@ const serverConfig = { const server = tls.createServer(serverConfig, common.mustCall(clientConfigs.length)) .listen(0, common.localhostIPv4, function() { let connected = 0; - clientConfigs.forEach(function(v) { + for (const v of clientConfigs) { tls.connect({ host: common.localhostIPv4, port: server.address().port, @@ -51,5 +51,5 @@ const server = tls.createServer(serverConfig, common.mustCall(clientConfigs.leng if (++connected === clientConfigs.length) server.close(); })); - }); + } }); diff --git a/test/parallel/test-tls-reduced-SECLEVEL-in-cipher.js b/test/parallel/test-tls-reduced-SECLEVEL-in-cipher.js new file mode 100644 index 00000000000000..9f4458e0a7d671 --- /dev/null +++ b/test/parallel/test-tls-reduced-SECLEVEL-in-cipher.js @@ -0,0 +1,26 @@ +'use strict'; +const common = require('../common'); + +if (!common.hasCrypto) + common.skip('missing crypto'); + +const assert = require('assert'); +const tls = require('tls'); +const fixtures = require('../common/fixtures'); + +{ + const options = { + key: fixtures.readKey('agent11-key.pem'), + cert: fixtures.readKey('agent11-cert.pem'), + ciphers: 'DEFAULT' + }; + + // Should throw error as key is too small because openssl v3 doesn't allow it + assert.throws(() => tls.createServer(options, common.mustNotCall()), + /key too small/i); + + // Reducing SECLEVEL to 0 in ciphers retains compatibility with previous versions of OpenSSL like using a small key. + // As ciphers are getting set before the cert and key get loaded. + options.ciphers = 'DEFAULT:@SECLEVEL=0'; + assert.ok(tls.createServer(options, common.mustNotCall())); +} diff --git a/test/parallel/test-tls-reinitialize-listeners.js b/test/parallel/test-tls-reinitialize-listeners.js new file mode 100644 index 00000000000000..ffd7c825b0f699 --- /dev/null +++ b/test/parallel/test-tls-reinitialize-listeners.js @@ -0,0 +1,42 @@ +// Flags: --expose-internals +'use strict'; + +const common = require('../common'); + +if (!common.hasCrypto) { + common.skip('missing crypto'); +} + +const events = require('events'); +const fixtures = require('../common/fixtures'); +const tls = require('tls'); +const { kReinitializeHandle } = require('internal/net'); + +// Test that repeated calls to kReinitializeHandle() do not result in repeatedly +// adding new listeners on the socket (i.e. no MaxListenersExceededWarnings) + +process.on('warning', common.mustNotCall()); + +const server = tls.createServer({ + key: fixtures.readKey('agent1-key.pem'), + cert: fixtures.readKey('agent1-cert.pem') +}); + +server.listen(0, common.mustCall(function() { + const socket = tls.connect({ + port: this.address().port, + rejectUnauthorized: false + }); + + socket.on('secureConnect', common.mustCall(function() { + for (let i = 0; i < events.defaultMaxListeners + 1; i++) { + socket[kReinitializeHandle](); + } + + socket.destroy(); + })); + + socket.on('close', function() { + server.close(); + }); +})); diff --git a/test/parallel/test-tls-snicallback-error.js b/test/parallel/test-tls-snicallback-error.js index 1e1c82225309b4..aac7cb9f96704a 100644 --- a/test/parallel/test-tls-snicallback-error.js +++ b/test/parallel/test-tls-snicallback-error.js @@ -4,11 +4,21 @@ if (!common.hasCrypto) common.skip('missing crypto'); const assert = require('assert'); +const net = require('net'); const tls = require('tls'); -['fhqwhgads', 42, {}, []].forEach((testValue) => { - assert.throws( - () => { tls.createServer({ SNICallback: testValue }); }, - { code: 'ERR_INVALID_ARG_TYPE', message: /\boptions\.SNICallback\b/ } - ); -}); +for (const SNICallback of ['fhqwhgads', 42, {}, []]) { + assert.throws(() => { + tls.createServer({ SNICallback }); + }, { + code: 'ERR_INVALID_ARG_TYPE', + name: 'TypeError', + }); + + assert.throws(() => { + new tls.TLSSocket(new net.Socket(), { isServer: true, SNICallback }); + }, { + code: 'ERR_INVALID_ARG_TYPE', + name: 'TypeError', + }); +} diff --git a/test/parallel/test-trace-atomic-deprecation.js b/test/parallel/test-trace-atomic-deprecation.js new file mode 100644 index 00000000000000..8aeddb28e938d2 --- /dev/null +++ b/test/parallel/test-trace-atomic-deprecation.js @@ -0,0 +1,14 @@ +'use strict'; + +const common = require('../common'); +const assert = require('node:assert'); +const { test } = require('node:test'); + +test('should emit deprecation warning DEP0165', async () => { + const { code, stdout, stderr } = await common.spawnPromisified( + process.execPath, ['--trace-atomics-wait', '-e', '{}'] + ); + assert.match(stderr, /\[DEP0165\] DeprecationWarning:/); + assert.strictEqual(stdout, ''); + assert.strictEqual(code, 0); +}); diff --git a/test/parallel/test-trace-atomics-wait.js b/test/parallel/test-trace-atomics-wait.js index 232c06be3032e6..6449a2be2b47e0 100644 --- a/test/parallel/test-trace-atomics-wait.js +++ b/test/parallel/test-trace-atomics-wait.js @@ -25,7 +25,7 @@ if (process.argv[2] === 'child') { const proc = child_process.spawnSync( process.execPath, - [ '--trace-atomics-wait', __filename, 'child' ], + [ '--disable-warning=DEP0165', '--trace-atomics-wait', __filename, 'child' ], { encoding: 'utf8', stdio: [ 'inherit', 'inherit', 'pipe' ] }); if (proc.status !== 0) console.log(proc); diff --git a/test/parallel/test-trace-events-api.js b/test/parallel/test-trace-events-api.js index 70520d7e30bbcb..709f8de9097906 100644 --- a/test/parallel/test-trace-events-api.js +++ b/test/parallel/test-trace-events-api.js @@ -31,7 +31,7 @@ const isChild = process.argv[2] === 'child'; const enabledCategories = getEnabledCategoriesFromCommandLine(); assert.strictEqual(getEnabledCategories(), enabledCategories); -[1, 'foo', true, false, null, undefined].forEach((i) => { +for (const i of [1, 'foo', true, false, null, undefined]) { assert.throws(() => createTracing(i), { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError' @@ -40,7 +40,7 @@ assert.strictEqual(getEnabledCategories(), enabledCategories); code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError' }); -}); +} assert.throws( () => createTracing({ categories: [] }), @@ -156,8 +156,7 @@ function testApiInChildProcess(execArgs, cb) { assert.strictEqual( traces.length, expectedBegins.length + expectedEnds.length); - - traces.forEach((trace) => { + for (const trace of traces) { assert.strictEqual(trace.pid, proc.pid); switch (trace.ph) { case 'b': { @@ -175,7 +174,7 @@ function testApiInChildProcess(execArgs, cb) { default: assert.fail('Unexpected trace event phase'); } - }); + } process.chdir(parentDir); cb && process.nextTick(cb); })); diff --git a/test/parallel/test-trace-events-http.js b/test/parallel/test-trace-events-http.js index bcdc897e2ff136..07a6b28fa5b273 100644 --- a/test/parallel/test-trace-events-http.js +++ b/test/parallel/test-trace-events-http.js @@ -31,12 +31,12 @@ proc.once('exit', common.mustCall(() => { const traces = JSON.parse(data.toString()).traceEvents; assert(traces.length > 0); let count = 0; - traces.forEach((trace) => { + for (const trace of traces) { if (trace.cat === 'node,node.http' && ['http.server.request', 'http.client.request'].includes(trace.name)) { count++; } - }); + } // Two begin, two end assert.strictEqual(count, 4); })); diff --git a/test/parallel/test-trace-events-net-abstract-socket.js b/test/parallel/test-trace-events-net-abstract-socket.js new file mode 100644 index 00000000000000..d2e1546743c958 --- /dev/null +++ b/test/parallel/test-trace-events-net-abstract-socket.js @@ -0,0 +1,43 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const cp = require('child_process'); +const fs = require('fs'); +const tmpdir = require('../common/tmpdir'); + +if (!common.isLinux) common.skip(); + +const CODE = ` + const net = require('net'); + net.connect('${common.PIPE}').on('error', () => {}); + net.connect('\\0${common.PIPE}').on('error', () => {}); +`; + +tmpdir.refresh(); +const FILE_NAME = tmpdir.resolve('node_trace.1.log'); + +const proc = cp.spawn(process.execPath, + [ '--trace-events-enabled', + '--trace-event-categories', 'node.net.native', + '-e', CODE ], + { cwd: tmpdir.path }); + +proc.once('exit', common.mustCall(() => { + assert(fs.existsSync(FILE_NAME)); + fs.readFile(FILE_NAME, common.mustCall((err, data) => { + const traces = JSON.parse(data.toString()).traceEvents; + assert(traces.length > 0); + let count = 0; + traces.forEach((trace) => { + if (trace.cat === 'node,node.net,node.net.native' && + trace.name === 'connect') { + count++; + if (trace.ph === 'b') { + assert.ok(!!trace.args.path_type); + assert.ok(!!trace.args.pipe_path); + } + } + }); + assert.strictEqual(count, 4); + })); +})); diff --git a/test/parallel/test-trace-events-net.js b/test/parallel/test-trace-events-net.js index c605cb5bd087b6..a1a93b19080b8a 100644 --- a/test/parallel/test-trace-events-net.js +++ b/test/parallel/test-trace-events-net.js @@ -32,12 +32,11 @@ proc.once('exit', common.mustCall(() => { const traces = JSON.parse(data.toString()).traceEvents; assert(traces.length > 0); let count = 0; - traces.forEach((trace) => { - if (trace.cat === 'node,node.net,node.net.native' && - trace.name === 'connect') { + for (const trace of traces) { + if (trace.cat === 'node,node.net,node.net.native' && trace.name === 'connect') { count++; } - }); + } // Two begin, two end assert.strictEqual(count, 4); })); diff --git a/test/parallel/test-trace-events-vm.js b/test/parallel/test-trace-events-vm.js index b52d22368d07d2..d85a2cefd645af 100644 --- a/test/parallel/test-trace-events-vm.js +++ b/test/parallel/test-trace-events-vm.js @@ -32,10 +32,10 @@ if (process.argv[2] === 'child') { fs.readFile(file, common.mustCall((err, data) => { const traces = JSON.parse(data.toString()).traceEvents .filter((trace) => trace.cat !== '__metadata'); - traces.forEach((trace) => { + for (const trace of traces) { assert.strictEqual(trace.pid, proc.pid); assert(names.includes(trace.name)); - }); + } })); })); } diff --git a/test/parallel/test-url-relative.js b/test/parallel/test-url-relative.js index 9a398a0e508f33..9dfe954c1fe854 100644 --- a/test/parallel/test-url-relative.js +++ b/test/parallel/test-url-relative.js @@ -55,13 +55,15 @@ const relativeTests = [ ['http://localhost', 'file://foo/Users', 'file://foo/Users'], ['https://registry.npmjs.org', '@foo/bar', 'https://registry.npmjs.org/@foo/bar'], ]; -relativeTests.forEach(function(relativeTest) { +for (let i = 0; i < relativeTests.length; i++) { + const relativeTest = relativeTests[i]; + const a = url.resolve(relativeTest[0], relativeTest[1]); const e = relativeTest[2]; assert.strictEqual(a, e, `resolve(${relativeTest[0]}, ${relativeTest[1]})` + ` == ${e}\n actual=${a}`); -}); +} // // Tests below taken from Chiron @@ -374,19 +376,23 @@ const relativeTests2 = [ // No path at all ['#hash1', '#hash2', '#hash1'], ]; -relativeTests2.forEach(function(relativeTest) { +for (let i = 0; i < relativeTests2.length; i++) { + const relativeTest = relativeTests2[i]; + const a = url.resolve(relativeTest[1], relativeTest[0]); const e = url.format(relativeTest[2]); assert.strictEqual(a, e, `resolve(${relativeTest[0]}, ${relativeTest[1]})` + ` == ${e}\n actual=${a}`); -}); +} // If format and parse are inverse operations then // resolveObject(parse(x), y) == parse(resolve(x, y)) // format: [from, path, expected] -relativeTests.forEach(function(relativeTest) { +for (let i = 0; i < relativeTests.length; i++) { + const relativeTest = relativeTests[i]; + let actual = url.resolveObject(url.parse(relativeTest[0]), relativeTest[1]); let expected = url.parse(relativeTest[2]); @@ -399,7 +405,8 @@ relativeTests.forEach(function(relativeTest) { assert.strictEqual(actual, expected, `format(${actual}) == ${expected}\n` + `actual: ${actual}`); -}); + +} // format: [to, from, result] // the test: ['.//g', 'f:/a', 'f://g'] is a fundamental problem @@ -415,7 +422,9 @@ if (relativeTests2[181][0] === './/g' && relativeTests2[181][2] === 'f://g') { relativeTests2.splice(181, 1); } -relativeTests2.forEach(function(relativeTest) { +for (let i = 0; i < relativeTests2.length; i++) { + const relativeTest = relativeTests2[i]; + let actual = url.resolveObject(url.parse(relativeTest[1]), relativeTest[0]); let expected = url.parse(relativeTest[2]); @@ -431,4 +440,4 @@ relativeTests2.forEach(function(relativeTest) { assert.strictEqual(actual, expected, `format(${relativeTest[1]}) == ${expected}\n` + `actual: ${actual}`); -}); +} diff --git a/test/parallel/test-url-revokeobjecturl.js b/test/parallel/test-url-revokeobjecturl.js new file mode 100644 index 00000000000000..dae980c4d0074c --- /dev/null +++ b/test/parallel/test-url-revokeobjecturl.js @@ -0,0 +1,14 @@ +'use strict'; + +require('../common'); + +// Test ensures that the function receives the url argument. + +const assert = require('node:assert'); + +assert.throws(() => { + URL.revokeObjectURL(); +}, { + code: 'ERR_MISSING_ARGS', + name: 'TypeError', +}); diff --git a/test/parallel/test-util-callbackify.js b/test/parallel/test-util-callbackify.js index 444e10b16bf85a..f287c91e946217 100644 --- a/test/parallel/test-util-callbackify.js +++ b/test/parallel/test-util-callbackify.js @@ -225,6 +225,7 @@ const values = [ const errLines = stderr.trim().split(/[\r\n]+/); const errLine = errLines.find((l) => /^Error/.exec(l)); assert.strictEqual(errLine, `Error: ${fixture}`); + assert.strictEqual(errLines.length, 7); }) ); } @@ -279,3 +280,20 @@ const values = [ }); }); } + +{ + // Test Promise factory + function promiseFn(value) { + return Promise.reject(value); + } + + const cbPromiseFn = callbackify(promiseFn); + + cbPromiseFn(null, (err) => { + assert.strictEqual(err.message, 'Promise was rejected with falsy value'); + assert.strictEqual(err.code, 'ERR_FALSY_VALUE_REJECTION'); + assert.strictEqual(err.reason, null); + const stack = err.stack.split(/[\r\n]+/); + assert.match(stack[1], /at process\.processTicksAndRejections/); + }); +} diff --git a/test/parallel/test-util-inspect.js b/test/parallel/test-util-inspect.js index 4c9e0d683fe7d0..ba5b6f9fe84bb3 100644 --- a/test/parallel/test-util-inspect.js +++ b/test/parallel/test-util-inspect.js @@ -2920,7 +2920,7 @@ assert.strictEqual( try { const trace = require('trace_events').createTracing({ categories: ['fo'] }); const actualDepth0 = util.inspect({ trace }, { depth: 0 }); - assert.strictEqual(actualDepth0, '{ trace: [Tracing] }'); + assert.strictEqual(actualDepth0, '{ trace: Tracing {} }'); const actualDepth1 = util.inspect({ trace }, { depth: 1 }); assert.strictEqual( actualDepth1, diff --git a/test/parallel/test-util-log.js b/test/parallel/test-util-log.js index 854746290ec796..838828e50f32b0 100644 --- a/test/parallel/test-util-log.js +++ b/test/parallel/test-util-log.js @@ -53,13 +53,13 @@ const tests = [ // test util.log() const re = /[0-9]{1,2} [A-Z][a-z]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} - (.+)$/; -tests.forEach(function(test) { +for (const test of tests) { util.log(test.input); const result = strings.shift().trim(); const match = re.exec(result); assert.ok(match); assert.strictEqual(match[1], test.output); -}); +} assert.strictEqual(process.stdout.writeTimes, tests.length); diff --git a/test/parallel/test-uv-unmapped-exception.js b/test/parallel/test-uv-unmapped-exception.js index 0b63461dd25dee..02a52062228ab5 100644 --- a/test/parallel/test-uv-unmapped-exception.js +++ b/test/parallel/test-uv-unmapped-exception.js @@ -2,10 +2,10 @@ 'use strict'; require('../common'); const assert = require('assert'); -const { uvException, uvExceptionWithHostPort } = require('internal/errors'); +const { UVException, UVExceptionWithHostPort } = require('internal/errors'); { - const exception = uvException({ errno: 100, syscall: 'open' }); + const exception = new UVException({ errno: 100, syscall: 'open' }); assert.strictEqual(exception.message, 'UNKNOWN: unknown error, open'); assert.strictEqual(exception.errno, 100); @@ -14,7 +14,7 @@ const { uvException, uvExceptionWithHostPort } = require('internal/errors'); } { - const exception = uvExceptionWithHostPort(100, 'listen', '127.0.0.1', 80); + const exception = new UVExceptionWithHostPort(100, 'listen', '127.0.0.1', 80); assert.strictEqual(exception.message, 'listen UNKNOWN: unknown error 127.0.0.1:80'); diff --git a/test/parallel/test-v8-serdes.js b/test/parallel/test-v8-serdes.js index 1b6638ac1a90bd..296e076a9f760d 100644 --- a/test/parallel/test-v8-serdes.js +++ b/test/parallel/test-v8-serdes.js @@ -107,7 +107,6 @@ const hostObject = new (internalBinding('js_stream').JSStream)(); { const text = 'hostObjectTag'; const data = Buffer.from(text); - const arrayBufferViews = common.getArrayBufferViews(data); // `buf` is one of `TypedArray` or `DataView`. function testWriteRawBytes(buf) { @@ -138,9 +137,9 @@ const hostObject = new (internalBinding('js_stream').JSStream)(); assert.strictEqual(des.readValue().val, hostObject); } - arrayBufferViews.forEach((buf) => { + for (const buf of common.getArrayBufferViews(data)) { testWriteRawBytes(buf); - }); + } } { diff --git a/test/parallel/test-vm-dynamic-import-callback-missing-flag.js b/test/parallel/test-vm-dynamic-import-callback-missing-flag.js new file mode 100644 index 00000000000000..4b0d09ca3674a7 --- /dev/null +++ b/test/parallel/test-vm-dynamic-import-callback-missing-flag.js @@ -0,0 +1,28 @@ +'use strict'; + +const common = require('../common'); +const { Script, compileFunction } = require('vm'); +const assert = require('assert'); + +assert( + !process.execArgv.includes('--experimental-vm-modules'), + 'This test must be run without --experimental-vm-modules'); + +assert.rejects(async () => { + const script = new Script('import("fs")', { + importModuleDynamically: common.mustNotCall(), + }); + const imported = script.runInThisContext(); + await imported; +}, { + code: 'ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING_FLAG' +}).then(common.mustCall()); + +assert.rejects(async () => { + const imported = compileFunction('return import("fs")', [], { + importModuleDynamically: common.mustNotCall(), + })(); + await imported; +}, { + code: 'ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING_FLAG' +}).then(common.mustCall()); diff --git a/test/parallel/test-vm-module-cached-data.js b/test/parallel/test-vm-module-cached-data.js index f91d9e62688dc5..fef68a8c18903d 100644 --- a/test/parallel/test-vm-module-cached-data.js +++ b/test/parallel/test-vm-module-cached-data.js @@ -2,7 +2,7 @@ // Flags: --experimental-vm-modules -require('../common'); +const common = require('../common'); const assert = require('assert'); const { SourceTextModule } = require('vm'); @@ -27,4 +27,4 @@ assert.rejects(async () => { m.createCachedData(); }, { code: 'ERR_VM_MODULE_CANNOT_CREATE_CACHED_DATA', -}); +}).then(common.mustCall()); diff --git a/test/parallel/test-vm-module-dynamic-import.js b/test/parallel/test-vm-module-dynamic-import.js index b74d3b28d7a547..bd542ca9202513 100644 --- a/test/parallel/test-vm-module-dynamic-import.js +++ b/test/parallel/test-vm-module-dynamic-import.js @@ -40,7 +40,7 @@ async function test() { }); const result = s.runInThisContext(); - assert.strictEqual(foo.namespace, await result); + assert.strictEqual(await result, foo.namespace); } { @@ -53,7 +53,7 @@ async function test() { }); await m.link(common.mustNotCall()); await m.evaluate(); - assert.strictEqual(foo.namespace, await globalThis.fooResult); + assert.strictEqual(await globalThis.fooResult, foo.namespace); delete globalThis.fooResult; } @@ -68,7 +68,7 @@ async function test() { }); const result = s.runInThisContext(); - assert.strictEqual(foo.namespace, await result); + assert.strictEqual(await result, foo.namespace); } } diff --git a/test/parallel/test-vm-module-link.js b/test/parallel/test-vm-module-link.js index 16694d5d846075..6b19a4d4916868 100644 --- a/test/parallel/test-vm-module-link.js +++ b/test/parallel/test-vm-module-link.js @@ -1,6 +1,6 @@ 'use strict'; -// Flags: --experimental-vm-modules +// Flags: --experimental-vm-modules --harmony-import-attributes const common = require('../common'); @@ -126,12 +126,14 @@ async function circular2() { async function asserts() { const m = new SourceTextModule(` - import "foo" assert { n1: 'v1', n2: 'v2' }; + import "foo" with { n1: 'v1', n2: 'v2' }; `, { identifier: 'm' }); await m.link((s, r, p) => { assert.strictEqual(s, 'foo'); assert.strictEqual(r.identifier, 'm'); + assert.strictEqual(p.attributes.n1, 'v1'); assert.strictEqual(p.assert.n1, 'v1'); + assert.strictEqual(p.attributes.n2, 'v2'); assert.strictEqual(p.assert.n2, 'v2'); return new SourceTextModule(''); }); diff --git a/test/parallel/test-vm-module-referrer-realm.mjs b/test/parallel/test-vm-module-referrer-realm.mjs new file mode 100644 index 00000000000000..3957f147d8ee99 --- /dev/null +++ b/test/parallel/test-vm-module-referrer-realm.mjs @@ -0,0 +1,70 @@ +// Flags: --experimental-vm-modules +import * as common from '../common/index.mjs'; +import assert from 'node:assert'; +import { Script, SourceTextModule, createContext } from 'node:vm'; + +async function test() { + const foo = new SourceTextModule('export const a = 1;'); + await foo.link(common.mustNotCall()); + await foo.evaluate(); + + const ctx = createContext({}, { + importModuleDynamically: common.mustCall((specifier, wrap) => { + assert.strictEqual(specifier, 'foo'); + assert.strictEqual(wrap, ctx); + return foo; + }, 2), + }); + { + const s = new Script('Promise.resolve("import(\'foo\')").then(eval)', { + importModuleDynamically: common.mustNotCall(), + }); + + const result = s.runInContext(ctx); + assert.strictEqual(await result, foo.namespace); + } + + { + const m = new SourceTextModule('globalThis.fooResult = Promise.resolve("import(\'foo\')").then(eval)', { + context: ctx, + importModuleDynamically: common.mustNotCall(), + }); + await m.link(common.mustNotCall()); + await m.evaluate(); + assert.strictEqual(await ctx.fooResult, foo.namespace); + delete ctx.fooResult; + } +} + +async function testMissing() { + const ctx = createContext({}); + { + const s = new Script('Promise.resolve("import(\'foo\')").then(eval)', { + importModuleDynamically: common.mustNotCall(), + }); + + const result = s.runInContext(ctx); + await assert.rejects(result, { + code: 'ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING', + }); + } + + { + const m = new SourceTextModule('globalThis.fooResult = Promise.resolve("import(\'foo\')").then(eval)', { + context: ctx, + importModuleDynamically: common.mustNotCall(), + }); + await m.link(common.mustNotCall()); + await m.evaluate(); + + await assert.rejects(ctx.fooResult, { + code: 'ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING', + }); + delete ctx.fooResult; + } +} + +await Promise.all([ + test(), + testMissing(), +]).then(common.mustCall()); diff --git a/test/parallel/test-vm-no-dynamic-import-callback.js b/test/parallel/test-vm-no-dynamic-import-callback.js index 3651f997598b21..35b553d587c6e4 100644 --- a/test/parallel/test-vm-no-dynamic-import-callback.js +++ b/test/parallel/test-vm-no-dynamic-import-callback.js @@ -1,7 +1,7 @@ 'use strict'; -require('../common'); -const { Script } = require('vm'); +const common = require('../common'); +const { Script, compileFunction } = require('vm'); const assert = require('assert'); assert.rejects(async () => { @@ -10,4 +10,11 @@ assert.rejects(async () => { await imported; }, { code: 'ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING' -}); +}).then(common.mustCall()); + +assert.rejects(async () => { + const imported = compileFunction('return import("fs")')(); + await imported; +}, { + code: 'ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING' +}).then(common.mustCall()); diff --git a/test/parallel/test-vm-timeout-escape-promise-module.js b/test/parallel/test-vm-timeout-escape-promise-module.js index 0687b3b3c81f57..4b0169a7789db4 100644 --- a/test/parallel/test-vm-timeout-escape-promise-module.js +++ b/test/parallel/test-vm-timeout-escape-promise-module.js @@ -39,4 +39,4 @@ assert.rejects(async () => { }, { code: 'ERR_SCRIPT_EXECUTION_TIMEOUT', message: 'Script execution timed out after 5ms' -}); +}).then(common.mustCall()); diff --git a/test/parallel/test-webcrypto-export-import-cfrg.js b/test/parallel/test-webcrypto-export-import-cfrg.js index ad7e78df83e987..144424ce01ded2 100644 --- a/test/parallel/test-webcrypto-export-import-cfrg.js +++ b/test/parallel/test-webcrypto-export-import-cfrg.js @@ -340,15 +340,14 @@ async function testImportRaw({ name, publicUsages }) { (async function() { const tests = []; - testVectors.forEach((vector) => { - [true, false].forEach((extractable) => { + for (const vector of testVectors) { + for (const extractable of [true, false]) { tests.push(testImportSpki(vector, extractable)); tests.push(testImportPkcs8(vector, extractable)); tests.push(testImportJwk(vector, extractable)); - }); + } tests.push(testImportRaw(vector)); - }); - + } await Promise.all(tests); })().then(common.mustCall()); @@ -366,11 +365,11 @@ async function testImportRaw({ name, publicUsages }) { 'spki', rsaPublic.export({ format: 'der', type: 'spki' }), { name }, - true, publicUsages), { message: /Invalid key type/ }); + true, publicUsages), { message: /Invalid key type/ }).then(common.mustCall()); assert.rejects(subtle.importKey( 'pkcs8', rsaPrivate.export({ format: 'der', type: 'pkcs8' }), { name }, - true, privateUsages), { message: /Invalid key type/ }); + true, privateUsages), { message: /Invalid key type/ }).then(common.mustCall()); } } diff --git a/test/parallel/test-webcrypto-export-import-ec.js b/test/parallel/test-webcrypto-export-import-ec.js index e17ff0c2d4075c..d0548f56662f94 100644 --- a/test/parallel/test-webcrypto-export-import-ec.js +++ b/test/parallel/test-webcrypto-export-import-ec.js @@ -363,16 +363,16 @@ async function testImportRaw({ name, publicUsages }, namedCurve) { (async function() { const tests = []; - testVectors.forEach((vector) => { - curves.forEach((namedCurve) => { - [true, false].forEach((extractable) => { + for (const vector of testVectors) { + for (const namedCurve of curves) { + for (const extractable of [true, false]) { tests.push(testImportSpki(vector, namedCurve, extractable)); tests.push(testImportPkcs8(vector, namedCurve, extractable)); tests.push(testImportJwk(vector, namedCurve, extractable)); - }); + } tests.push(testImportRaw(vector, namedCurve)); - }); - }); + } + } await Promise.all(tests); })().then(common.mustCall()); @@ -400,15 +400,81 @@ async function testImportRaw({ name, publicUsages }, namedCurve) { ['ECDSA', ['verify'], ['sign']], ['ECDH', [], ['deriveBits', 'deriveBits']], ]) { - assert.rejects(subtle.importKey( - 'spki', - rsaPublic.export({ format: 'der', type: 'spki' }), - { name, hash: 'SHA-256', namedCurve: 'P-256' }, - true, publicUsages), { message: /Invalid key type/ }); - assert.rejects(subtle.importKey( - 'pkcs8', - rsaPrivate.export({ format: 'der', type: 'pkcs8' }), - { name, hash: 'SHA-256', namedCurve: 'P-256' }, - true, privateUsages), { message: /Invalid key type/ }); + assert.rejects( + subtle.importKey( + 'spki', + rsaPublic.export({ format: 'der', type: 'spki' }), + { name, hash: 'SHA-256', namedCurve: 'P-256' }, + true, publicUsages), { message: /Invalid key type/ }, + ).then(common.mustCall()); + assert.rejects( + subtle.importKey( + 'pkcs8', + rsaPrivate.export({ format: 'der', type: 'pkcs8' }), + { name, hash: 'SHA-256', namedCurve: 'P-256' }, + true, privateUsages), { message: /Invalid key type/ }, + ).then(common.mustCall()); + } +} + +// Bad private keys +{ + for (const { namedCurve, key: pkcs8 } of [ + // The private key is exactly equal to the order, and the public key is + // private key * order. + { + namedCurve: 'P-256', + key: Buffer.from( + '3066020100301306072a8648ce3d020106082a8648ce3d030107044c304a0201' + + '010420ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc' + + '632551a12303210000ffffff00000000ffffffffffffffffbce6faada7179e84' + + 'f3b9cac2fc632551', 'hex'), + }, + // The private key is exactly equal to the order, and the public key is + // omitted. + { + namedCurve: 'P-256', + key: Buffer.from( + '3041020100301306072a8648ce3d020106082a8648ce3d030107042730250201' + + '010420ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc' + + '632551', 'hex'), + }, + // The private key is exactly equal to the order + 11, and the public key is + // private key * order. + { + namedCurve: 'P-521', + key: Buffer.from( + '3081ee020100301006072a8648ce3d020106052b810400230481d63081d30201' + + '01044201ffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + + 'fffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb7' + + '1e91386414a181890381860004008a75841259fdedff546f1a39573b4315cfed' + + '5dc7ed7c17849543ef2c54f2991652f3dbc5332663da1bd19b1aebe319108501' + + '5c024fa4c9a902ecc0e02dda0cdb9a0096fb303fcbba2129849d0ca877054fb2' + + '293add566210bd0493ed2e95d4e0b9b82b1bc8a90e8b42a4ab3892331914a953' + + '36dcac80e3f4819b5d58874f92ce48c808', 'hex'), + }, + // The private key is exactly equal to the order + 11, and the public key is + // omitted. + { + namedCurve: 'P-521', + key: Buffer.from( + '3060020100301006072a8648ce3d020106052b81040023044930470201010442' + + '01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' + + 'fffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138' + + '6414', 'hex'), + }, + ]) { + for (const [name, privateUsages] of [ + ['ECDSA', ['sign']], + ['ECDH', ['deriveBits', 'deriveBits']], + ]) { + assert.rejects( + subtle.importKey( + 'pkcs8', + pkcs8, + { name, hash: 'SHA-256', namedCurve }, + true, privateUsages), { name: 'DataError', message: /Invalid keyData/ }, + ).then(common.mustCall()); + } } } diff --git a/test/parallel/test-webcrypto-export-import-rsa.js b/test/parallel/test-webcrypto-export-import-rsa.js index c18abf9832f365..fb79184afd6e12 100644 --- a/test/parallel/test-webcrypto-export-import-rsa.js +++ b/test/parallel/test-webcrypto-export-import-rsa.js @@ -565,11 +565,11 @@ const testVectors = [ 'spki', ecPublic.export({ format: 'der', type: 'spki' }), { name, hash: 'SHA-256' }, - true, [publicUsage]), { message: /Invalid key type/ }); + true, [publicUsage]), { message: /Invalid key type/ }).then(common.mustCall()); assert.rejects(subtle.importKey( 'pkcs8', ecPrivate.export({ format: 'der', type: 'pkcs8' }), { name, hash: 'SHA-256' }, - true, [privateUsage]), { message: /Invalid key type/ }); + true, [privateUsage]), { message: /Invalid key type/ }).then(common.mustCall()); } } diff --git a/test/parallel/test-webcrypto-sign-verify-ecdsa.js b/test/parallel/test-webcrypto-sign-verify-ecdsa.js index 072485cca59f7f..8fbf572ef5c64e 100644 --- a/test/parallel/test-webcrypto-sign-verify-ecdsa.js +++ b/test/parallel/test-webcrypto-sign-verify-ecdsa.js @@ -227,10 +227,11 @@ async function testSign({ name, (async function() { const variations = []; - vectors.forEach((vector) => { + for (let i = 0; i < vectors.length; ++i) { + const vector = vectors[i]; variations.push(testVerify(vector)); variations.push(testSign(vector)); - }); + } await Promise.all(variations); })().then(common.mustCall()); diff --git a/test/parallel/test-webcrypto-sign-verify-hmac.js b/test/parallel/test-webcrypto-sign-verify-hmac.js index 00b742dbfea5d1..5c2d8e6cd770ff 100644 --- a/test/parallel/test-webcrypto-sign-verify-hmac.js +++ b/test/parallel/test-webcrypto-sign-verify-hmac.js @@ -172,10 +172,10 @@ async function testSign({ hash, (async function() { const variations = []; - vectors.forEach((vector) => { + for (const vector of vectors) { variations.push(testVerify(vector)); variations.push(testSign(vector)); - }); + } await Promise.all(variations); })().then(common.mustCall()); diff --git a/test/parallel/test-webstream-readablestream-pipeto.js b/test/parallel/test-webstream-readablestream-pipeto.js index 95929c5197a275..ef952e30c0867d 100644 --- a/test/parallel/test-webstream-readablestream-pipeto.js +++ b/test/parallel/test-webstream-readablestream-pipeto.js @@ -1,7 +1,7 @@ // Flags: --expose-internals 'use strict'; -require('../common'); +const common = require('../common'); const assert = require('node:assert'); const { AbortError } = require('internal/errors'); @@ -20,5 +20,5 @@ for (const message of [undefined, 'abc']) { assert.strictEqual(e.name, 'AbortError'); assert.strictEqual(e.message, reason.message); return true; - }); + }).then(common.mustCall()); } diff --git a/test/parallel/test-webstreams-clone-unref.js b/test/parallel/test-webstreams-clone-unref.js new file mode 100644 index 00000000000000..88a9cebd9c3046 --- /dev/null +++ b/test/parallel/test-webstreams-clone-unref.js @@ -0,0 +1,16 @@ +'use strict'; + +require('../common'); +const { ok } = require('node:assert'); + +// This test verifies that cloned ReadableStream and WritableStream instances +// do not keep the process alive. The test fails if it timesout (it should just +// exit immediately) + +const rs1 = new ReadableStream(); +const ws1 = new WritableStream(); + +const [rs2, ws2] = structuredClone([rs1, ws1], { transfer: [rs1, ws1] }); + +ok(rs2 instanceof ReadableStream); +ok(ws2 instanceof WritableStream); diff --git a/test/parallel/test-whatwg-encoding-custom-interop.js b/test/parallel/test-whatwg-encoding-custom-interop.js index 592dcc8582816f..80d088f6ce3741 100644 --- a/test/parallel/test-whatwg-encoding-custom-interop.js +++ b/test/parallel/test-whatwg-encoding-custom-interop.js @@ -56,9 +56,9 @@ assert(TextEncoder); encodingGetter.call(instance); const invalidThisArgs = [{}, [], true, 1, '', new TextDecoder()]; - invalidThisArgs.forEach((i) => { + for (const i of invalidThisArgs) { assert.throws(() => inspectFn.call(i, Infinity, {}), expectedError); assert.throws(() => encodeFn.call(i), expectedError); assert.throws(() => encodingGetter.call(i), expectedError); - }); + } } diff --git a/test/parallel/test-whatwg-encoding-custom-textdecoder-utf16-surrogates.js b/test/parallel/test-whatwg-encoding-custom-textdecoder-utf16-surrogates.js index 2a8eac5f187406..a2a31af28c0c4e 100644 --- a/test/parallel/test-whatwg-encoding-custom-textdecoder-utf16-surrogates.js +++ b/test/parallel/test-whatwg-encoding-custom-textdecoder-utf16-surrogates.js @@ -43,7 +43,7 @@ const bad = [ }, ]; -bad.forEach((t) => { +for (const t of bad) { assert.throws( () => { new TextDecoder(t.encoding, { fatal: true }) @@ -53,4 +53,4 @@ bad.forEach((t) => { name: 'TypeError' } ); -}); +} diff --git a/test/parallel/test-whatwg-readablebytestream.js b/test/parallel/test-whatwg-readablebytestream.js index 6b305a0d8365f2..a1a4a757d8bb1e 100644 --- a/test/parallel/test-whatwg-readablebytestream.js +++ b/test/parallel/test-whatwg-readablebytestream.js @@ -184,7 +184,7 @@ class Source { throw error; } - assert.rejects(read(stream), error); + assert.rejects(read(stream), error).then(common.mustCall()); } { @@ -212,10 +212,10 @@ class Source { reader.releaseLock(); assert.rejects(reader.read(new Uint8Array(10)), { code: 'ERR_INVALID_STATE', - }); + }).then(common.mustCall()); assert.rejects(reader.cancel(), { code: 'ERR_INVALID_STATE', - }); + }).then(common.mustCall()); } { diff --git a/test/parallel/test-whatwg-readablestream.js b/test/parallel/test-whatwg-readablestream.js index 974b7791a6d68a..db48facddab906 100644 --- a/test/parallel/test-whatwg-readablestream.js +++ b/test/parallel/test-whatwg-readablestream.js @@ -355,11 +355,11 @@ assert.throws(() => { assert.rejects(reader.read(), { code: 'ERR_INVALID_STATE', - }); + }).then(common.mustCall()); assert.rejects(closedBefore, { code: 'ERR_INVALID_STATE', - }); + }).then(common.mustCall()); } { @@ -391,7 +391,7 @@ assert.throws(() => { assert.rejects(stream.cancel(), { code: 'ERR_INVALID_STATE', - }); + }).then(common.mustCall()); reader.cancel(); @@ -483,7 +483,7 @@ assert.throws(() => { closedBefore.then(common.mustCall()); assert.rejects(closedAfter, { code: 'ERR_INVALID_STATE', - }); + }).then(common.mustCall()); } { @@ -505,7 +505,7 @@ assert.throws(() => { closedBefore.then(common.mustCall()); assert.rejects(closedAfter, { code: 'ERR_INVALID_STATE', - }); + }).then(common.mustCall()); } { @@ -579,9 +579,9 @@ assert.throws(() => { }); stream.getReader().releaseLock(); const reader = stream.getReader(); - assert.rejects(reader.closed, error); - assert.rejects(reader.read(), error); - assert.rejects(reader.read(), error); + assert.rejects(reader.closed, error).then(common.mustCall()); + assert.rejects(reader.read(), error).then(common.mustCall()); + assert.rejects(reader.read(), error).then(common.mustCall()); } { @@ -595,8 +595,8 @@ assert.throws(() => { const cancel1 = reader.cancel(); const cancel2 = reader.cancel(); assert.notStrictEqual(cancel1, cancel2); - assert.rejects(cancel1, error); - assert.rejects(cancel2, error); + assert.rejects(cancel1, error).then(common.mustCall()); + assert.rejects(cancel2, error).then(common.mustCall()); } { @@ -608,9 +608,9 @@ assert.throws(() => { }); stream.getReader().releaseLock(); const reader = stream.getReader(); - assert.rejects(reader.closed, error); - assert.rejects(reader.read(), error); - assert.rejects(reader.read(), error); + assert.rejects(reader.closed, error).then(common.mustCall()); + assert.rejects(reader.read(), error).then(common.mustCall()); + assert.rejects(reader.read(), error).then(common.mustCall()); } { @@ -717,8 +717,10 @@ assert.throws(() => { assert.notStrictEqual(closed1, closed2); - assert.rejects(closed1, error); - assert.rejects(closed2, error); + assert.rejects(closed1, error).then(common.mustCall()); + assert.rejects(closed2, error).then(common.mustCall()); + + reader1.read(); } { @@ -796,8 +798,8 @@ assert.throws(() => { const { 0: s1, 1: s2 } = stream.tee(); - assert.rejects(s1.cancel(), error); - assert.rejects(s2.cancel(), error); + assert.rejects(s1.cancel(), error).then(common.mustCall()); + assert.rejects(s2.cancel(), error).then(common.mustCall()); } { @@ -812,8 +814,8 @@ assert.throws(() => { const { 0: s1, 1: s2 } = stream.tee(); c.error(error); - assert.rejects(s1.cancel(), error); - assert.rejects(s2.cancel(), error); + assert.rejects(s1.cancel(), error).then(common.mustCall()); + assert.rejects(s2.cancel(), error).then(common.mustCall()); } { @@ -830,11 +832,11 @@ assert.throws(() => { const reader1 = s1.getReader(); const reader2 = s2.getReader(); - assert.rejects(reader1.closed, error); - assert.rejects(reader2.closed, error); + assert.rejects(reader1.closed, error).then(common.mustCall()); + assert.rejects(reader2.closed, error).then(common.mustCall()); - assert.rejects(reader1.read(), error); - assert.rejects(reader2.read(), error); + assert.rejects(reader1.read(), error).then(common.mustCall()); + assert.rejects(reader2.read(), error).then(common.mustCall()); setImmediate(() => c.error(error)); } @@ -1038,7 +1040,7 @@ assert.throws(() => { const reader = stream.getReader(); - assert.rejects(reader.closed, error); + assert.rejects(reader.closed, error).then(common.mustCall()); } { @@ -1053,7 +1055,7 @@ assert.throws(() => { const reader = stream.getReader(); - assert.rejects(reader.closed, error); + assert.rejects(reader.closed, error).then(common.mustCall()); } { @@ -1357,7 +1359,7 @@ class Source { }); assert.rejects(() => ReadableStream.prototype.cancel.call({}), { code: 'ERR_INVALID_THIS', - }); + }).then(common.mustCall()); assert.throws(() => ReadableStream.prototype.getReader.call({}), { code: 'ERR_INVALID_THIS', }); @@ -1372,15 +1374,15 @@ class Source { }); assert.rejects(() => ReadableStreamDefaultReader.prototype.read.call({}), { code: 'ERR_INVALID_THIS', - }); + }).then(common.mustCall()); assert.rejects(() => ReadableStreamDefaultReader.prototype.cancel.call({}), { code: 'ERR_INVALID_THIS', - }); + }).then(common.mustCall()); assert.rejects(() => { return Reflect.get(ReadableStreamDefaultReader.prototype, 'closed'); }, { code: 'ERR_INVALID_THIS', - }); + }).then(common.mustCall()); assert.throws(() => { ReadableStreamDefaultReader.prototype.releaseLock.call({}); }, { @@ -1388,7 +1390,7 @@ class Source { }); assert.rejects(() => ReadableStreamBYOBReader.prototype.read.call({}), { code: 'ERR_INVALID_THIS', - }); + }).then(common.mustCall()); assert.throws(() => { ReadableStreamBYOBReader.prototype.releaseLock.call({}); }, { @@ -1398,10 +1400,10 @@ class Source { return Reflect.get(ReadableStreamBYOBReader.prototype, 'closed'); }, { code: 'ERR_INVALID_THIS', - }); + }).then(common.mustCall()); assert.rejects(() => ReadableStreamBYOBReader.prototype.cancel.call({}), { code: 'ERR_INVALID_THIS', - }); + }).then(common.mustCall()); assert.throws(() => { Reflect.get(ReadableByteStreamController.prototype, 'byobRequest', {}); @@ -1484,11 +1486,11 @@ class Source { assert.rejects(readableStreamPipeTo(1), { code: 'ERR_INVALID_ARG_TYPE', - }); + }).then(common.mustCall()); assert.rejects(readableStreamPipeTo(new ReadableStream(), 1), { code: 'ERR_INVALID_ARG_TYPE', - }); + }).then(common.mustCall()); assert.rejects( readableStreamPipeTo( @@ -1500,7 +1502,7 @@ class Source { {}), { code: 'ERR_INVALID_ARG_TYPE', - }); + }).then(common.mustCall()); } { @@ -1510,10 +1512,10 @@ class Source { reader.releaseLock(); assert.rejects(reader.read(), { code: 'ERR_INVALID_STATE', - }); + }).then(common.mustCall()); assert.rejects(reader.cancel(), { code: 'ERR_INVALID_STATE', - }); + }).then(common.mustCall()); } { diff --git a/test/parallel/test-whatwg-webstreams-adapters-streambase.js b/test/parallel/test-whatwg-webstreams-adapters-streambase.js index 43d28f0499dc7d..bd864ab8c14195 100644 --- a/test/parallel/test-whatwg-webstreams-adapters-streambase.js +++ b/test/parallel/test-whatwg-webstreams-adapters-streambase.js @@ -65,3 +65,12 @@ const { const readable = newReadableStreamFromStreamBase(stream); readable.cancel().then(common.mustCall()); } + +{ + const stream = new JSStream(); + stream.onread = common.mustCall(); + assert.throws(() => newReadableStreamFromStreamBase(stream), { + code: 'ERR_INVALID_STATE' + }); + stream.emitEOF(); +} diff --git a/test/parallel/test-whatwg-webstreams-adapters-to-readablestream.js b/test/parallel/test-whatwg-webstreams-adapters-to-readablestream.js index 433552388ac7a0..66af7b128c4d5a 100644 --- a/test/parallel/test-whatwg-webstreams-adapters-to-readablestream.js +++ b/test/parallel/test-whatwg-webstreams-adapters-to-readablestream.js @@ -60,7 +60,7 @@ const { assert.rejects(reader.closed, { code: 'ABORT_ERR', - }); + }).then(common.mustCall()); readable.on('end', common.mustNotCall()); readable.on('error', common.mustNotCall()); @@ -116,7 +116,7 @@ const { const reader = readableStream.getReader(); - assert.rejects(reader.closed, error); + assert.rejects(reader.closed, error).then(common.mustCall()); readable.on('end', common.mustNotCall()); readable.on('error', common.mustCall((reason) => { diff --git a/test/parallel/test-whatwg-webstreams-adapters-to-readablewritablepair.js b/test/parallel/test-whatwg-webstreams-adapters-to-readablewritablepair.js index a4ce9d163214cd..5062b9e179ac1e 100644 --- a/test/parallel/test-whatwg-webstreams-adapters-to-readablewritablepair.js +++ b/test/parallel/test-whatwg-webstreams-adapters-to-readablewritablepair.js @@ -28,11 +28,11 @@ const { assert.rejects(reader.closed, { code: 'ABORT_ERR', - }); + }).then(common.mustCall()); assert.rejects(writer.closed, { code: 'ABORT_ERR', - }); + }).then(common.mustCall()); duplex.destroy(); @@ -58,8 +58,8 @@ const { const reader = readable.getReader(); const writer = writable.getWriter(); - assert.rejects(reader.closed, error); - assert.rejects(writer.closed, error); + assert.rejects(reader.closed, error).then(common.mustCall()); + assert.rejects(writer.closed, error).then(common.mustCall()); duplex.destroy(error); } @@ -81,7 +81,7 @@ const { const writer = writable.getWriter(); reader.closed.then(common.mustCall()); - assert.rejects(writer.closed, error); + assert.rejects(writer.closed, error).then(common.mustCall()); reader.cancel(error).then(common.mustCall()); } @@ -121,8 +121,8 @@ const { const reader = readable.getReader(); const writer = writable.getWriter(); - assert.rejects(reader.closed, error); - assert.rejects(writer.closed, error); + assert.rejects(reader.closed, error).then(common.mustCall()); + assert.rejects(writer.closed, error).then(common.mustCall()); writer.abort(error).then(common.mustCall()); } @@ -145,7 +145,7 @@ const { assert.rejects(writer.closed, { code: 'ABORT_ERR', - }); + }).then(common.mustCall()); reader.cancel(); } @@ -166,7 +166,7 @@ const { reader.closed.then(common.mustCall()); assert.rejects(writer.closed, { code: 'ABORT_ERR', - }); + }).then(common.mustCall()); duplex.end(); } @@ -248,3 +248,9 @@ const { reader.closed.then(common.mustCall()); writer.close().then(common.mustCall()); } + +{ + assert.throws(() => newReadableWritablePairFromDuplex(null), { + code: 'ERR_INVALID_ARG_TYPE' + }); +} diff --git a/test/parallel/test-whatwg-webstreams-adapters-to-streamduplex.js b/test/parallel/test-whatwg-webstreams-adapters-to-streamduplex.js index 15ac9f832714e9..9c92a4778a00fd 100644 --- a/test/parallel/test-whatwg-webstreams-adapters-to-streamduplex.js +++ b/test/parallel/test-whatwg-webstreams-adapters-to-streamduplex.js @@ -164,3 +164,21 @@ const { duplex.end(); } + +{ + const transform = { readable: {}, writable: {} }; + assert.throws(() => newStreamDuplexFromReadableWritablePair(transform), { + code: 'ERR_INVALID_ARG_TYPE' + }); +} + +{ + const transform = { + readable: new ReadableStream(), + writable: null + }; + + assert.throws(() => newStreamDuplexFromReadableWritablePair(transform), { + code: 'ERR_INVALID_ARG_TYPE', + }); +} diff --git a/test/parallel/test-whatwg-webstreams-adapters-to-streamreadable.js b/test/parallel/test-whatwg-webstreams-adapters-to-streamreadable.js index 5e5eb7c4817ac0..45f45023fa028b 100644 --- a/test/parallel/test-whatwg-webstreams-adapters-to-streamreadable.js +++ b/test/parallel/test-whatwg-webstreams-adapters-to-streamreadable.js @@ -56,10 +56,10 @@ class MySource { assert.rejects(readableStream.cancel(), { code: 'ERR_INVALID_STATE', - }); + }).then(common.mustCall()); assert.rejects(readableStream.pipeTo(new WritableStream()), { code: 'ERR_INVALID_STATE', - }); + }).then(common.mustCall()); assert.throws(() => readableStream.tee(), { code: 'ERR_INVALID_STATE', }); diff --git a/test/parallel/test-whatwg-webstreams-adapters-to-streamwritable.js b/test/parallel/test-whatwg-webstreams-adapters-to-streamwritable.js index 495eef73f79272..b3415cdf18d42a 100644 --- a/test/parallel/test-whatwg-webstreams-adapters-to-streamwritable.js +++ b/test/parallel/test-whatwg-webstreams-adapters-to-streamwritable.js @@ -125,11 +125,11 @@ class TestSource { assert.rejects(writableStream.close(), { code: 'ERR_INVALID_STATE', - }); + }).then(common.mustCall()); assert.rejects(writableStream.abort(), { code: 'ERR_INVALID_STATE', - }); + }).then(common.mustCall()); assert.throws(() => writableStream.getWriter(), { code: 'ERR_INVALID_STATE', diff --git a/test/parallel/test-whatwg-webstreams-adapters-to-writablestream.js b/test/parallel/test-whatwg-webstreams-adapters-to-writablestream.js index 4457ad39f8cb6d..1527610c513333 100644 --- a/test/parallel/test-whatwg-webstreams-adapters-to-writablestream.js +++ b/test/parallel/test-whatwg-webstreams-adapters-to-writablestream.js @@ -81,7 +81,7 @@ class TestWritable extends Writable { const writable = new TestWritable(); const writableStream = newWritableStreamFromStreamWritable(writable); - assert.rejects(writableStream.close(), error); + assert.rejects(writableStream.close(), error).then(common.mustCall()); writable.destroy(error); } @@ -93,7 +93,7 @@ class TestWritable extends Writable { assert.rejects(writableStream.close(), { code: 'ABORT_ERR' - }); + }).then(common.mustCall()); writable.end(); } diff --git a/test/parallel/test-whatwg-webstreams-compression.js b/test/parallel/test-whatwg-webstreams-compression.js index c527fc1f13d10e..c144a0a2e3d43d 100644 --- a/test/parallel/test-whatwg-webstreams-compression.js +++ b/test/parallel/test-whatwg-webstreams-compression.js @@ -15,6 +15,9 @@ async function test(format) { const gzip = new CompressionStream(format); const gunzip = new DecompressionStream(format); + assert.strictEqual(gzip[Symbol.toStringTag], 'CompressionStream'); + assert.strictEqual(gunzip[Symbol.toStringTag], 'DecompressionStream'); + gzip.readable.pipeTo(gunzip.writable).then(common.mustCall()); const reader = gunzip.readable.getReader(); @@ -38,7 +41,7 @@ async function test(format) { ]); } -Promise.all(['gzip', 'deflate'].map((i) => test(i))).then(common.mustCall()); +Promise.all(['gzip', 'deflate', 'deflate-raw'].map((i) => test(i))).then(common.mustCall()); [1, 'hello', false, {}].forEach((i) => { assert.throws(() => new CompressionStream(i), { diff --git a/test/parallel/test-whatwg-webstreams-transfer.js b/test/parallel/test-whatwg-webstreams-transfer.js index 31e45858da52eb..7be01c339652c0 100644 --- a/test/parallel/test-whatwg-webstreams-transfer.js +++ b/test/parallel/test-whatwg-webstreams-transfer.js @@ -326,7 +326,7 @@ const theData = 'hello'; assert.rejects(reader.read(), { code: 25, name: 'DataCloneError', - }); + }).then(common.mustCall()); port1.close(); }; @@ -377,7 +377,7 @@ const theData = 'hello'; assert.rejects(writer.closed, { code: 25, name: 'DataCloneError', - }); + }).then(common.mustCall()); writer.write(notActuallyTransferable).then(common.mustCall()); @@ -407,7 +407,7 @@ const theData = 'hello'; port1.onmessage = common.mustCall(({ data }) => { const writer = data.getWriter(); - assert.rejects(writer.closed, error); + assert.rejects(writer.closed, error).then(common.mustCall()); writer.abort(error).then(common.mustCall()); port1.close(); @@ -438,7 +438,7 @@ const theData = 'hello'; assert.rejects(writer.abort(m), { code: 25, name: 'DataCloneError', - }); + }).then(common.mustCall()); port1.close(); }); @@ -464,12 +464,23 @@ const theData = 'hello'; tracker.verify(); }); + // We create an interval to keep the event loop alive while + // we wait for the stream read to complete. The reason this is needed is because there's + // otherwise nothing to keep the worker thread event loop alive long enough to actually + // complete the read from the stream. Under the covers the ReadableStream uses an + // unref'd MessagePort to communicate with the main thread. Because the MessagePort + // is unref'd, it's existence would not keep the thread alive on its own. There was previously + // a bug where this MessagePort was ref'd which would block the thread and main thread + // from terminating at all unless the stream was consumed/closed. + const i = setInterval(() => {}, 1000); + parentPort.onmessage = tracker.calls(({ data }) => { assert(isReadableStream(data)); const reader = data.getReader(); reader.read().then(tracker.calls((result) => { assert(!result.done); assert(result.value instanceof Uint8Array); + clearInterval(i); })); parentPort.close(); }); @@ -531,7 +542,7 @@ const theData = 'hello'; assert.rejects(cancel, { code: 25, name: 'DataCloneError', - }); + }).then(common.mustCall()); port1.close(); }); @@ -557,7 +568,7 @@ const theData = 'hello'; const m = new WebAssembly.Memory({ initial: 1 }); const writer = data.getWriter(); const write = writer.write(m); - assert.rejects(write, { code: 25, name: 'DataCloneError' }); + assert.rejects(write, { code: 25, name: 'DataCloneError' }).then(common.mustCall()); port1.close(); }); diff --git a/test/parallel/test-whatwg-writablestream.js b/test/parallel/test-whatwg-writablestream.js index fde08c7dd1cd9c..7d1d686358c0e1 100644 --- a/test/parallel/test-whatwg-writablestream.js +++ b/test/parallel/test-whatwg-writablestream.js @@ -129,7 +129,7 @@ class Sink { const writer = stream.getWriter(); - assert.rejects(writer.closed, error); + assert.rejects(writer.closed, error).then(common.mustCall()); writer.abort(error).then(common.mustCall(() => { assert.strictEqual(stream[kState].state, 'errored'); @@ -163,10 +163,10 @@ class Sink { }); assert.rejects(() => WritableStream.prototype.abort({}), { code: 'ERR_INVALID_THIS', - }); + }).then(common.mustCall()); assert.rejects(() => WritableStream.prototype.close({}), { code: 'ERR_INVALID_THIS', - }); + }).then(common.mustCall()); assert.throws(() => WritableStream.prototype.getWriter.call(), { code: 'ERR_INVALID_THIS', }); @@ -176,24 +176,24 @@ class Sink { assert.rejects( Reflect.get(WritableStreamDefaultWriter.prototype, 'closed'), { code: 'ERR_INVALID_THIS', - }); + }).then(common.mustCall()); assert.rejects( Reflect.get(WritableStreamDefaultWriter.prototype, 'ready'), { code: 'ERR_INVALID_THIS', - }); + }).then(common.mustCall()); assert.throws( () => Reflect.get(WritableStreamDefaultWriter.prototype, 'desiredSize'), { code: 'ERR_INVALID_THIS', }); assert.rejects(WritableStreamDefaultWriter.prototype.abort({}), { code: 'ERR_INVALID_THIS', - }); + }).then(common.mustCall()); assert.rejects(WritableStreamDefaultWriter.prototype.close({}), { code: 'ERR_INVALID_THIS', - }); + }).then(common.mustCall()); assert.rejects(WritableStreamDefaultWriter.prototype.write({}), { code: 'ERR_INVALID_THIS', - }); + }).then(common.mustCall()); assert.throws(() => WritableStreamDefaultWriter.prototype.releaseLock({}), { code: 'ERR_INVALID_THIS', }); diff --git a/test/parallel/test-worker-message-port-transfer-filehandle.js b/test/parallel/test-worker-message-port-transfer-filehandle.js index 8e3082240cd2c7..3e6afe22a8c636 100644 --- a/test/parallel/test-worker-message-port-transfer-filehandle.js +++ b/test/parallel/test-worker-message-port-transfer-filehandle.js @@ -30,7 +30,7 @@ const { once } = require('events'); assert.deepStrictEqual(await fh2.readFile(), await fs.readFile(__filename)); await fh2.close(); - assert.rejects(() => fh.readFile(), { code: 'EBADF' }); + await assert.rejects(() => fh.readFile(), { code: 'EBADF' }); })().then(common.mustCall()); (async function() { diff --git a/test/parallel/test-worker-workerdata-messageport.js b/test/parallel/test-worker-workerdata-messageport.js index 3e4770d9a12c34..5e73131fd1ab71 100644 --- a/test/parallel/test-worker-workerdata-messageport.js +++ b/test/parallel/test-worker-workerdata-messageport.js @@ -1,11 +1,11 @@ 'use strict'; require('../common'); -const assert = require('assert'); +const assert = require('node:assert'); const { Worker, MessageChannel -} = require('worker_threads'); +} = require('node:worker_threads'); const channel = new MessageChannel(); const workerData = { mesage: channel.port1 }; @@ -61,3 +61,29 @@ const meowScript = () => 'meow'; 'listed in transferList' }); } + +{ + // Should not crash when MessagePort is transferred to another context. + // https://github.com/nodejs/node/issues/49075 + const channel = new MessageChannel(); + new Worker(` + const { runInContext, createContext } = require('node:vm') + const { workerData } = require('worker_threads'); + const context = createContext(Object.create(null)); + context.messagePort = workerData.messagePort; + runInContext( + \`messagePort.postMessage("Meow")\`, + context, + { displayErrors: true } + ); + `, { + eval: true, + workerData: { messagePort: channel.port2 }, + transferList: [channel.port2] + }); + channel.port1.on( + 'message', + (message) => + assert.strictEqual(message, 'Meow') + ); +} diff --git a/test/pummel/pummel.status b/test/pummel/pummel.status index 143450986e46c4..589647bcb741fa 100644 --- a/test/pummel/pummel.status +++ b/test/pummel/pummel.status @@ -9,6 +9,8 @@ prefix pummel [$system==win32] # https://github.com/nodejs/node/issues/40728 test-fs-watch-non-recursive: PASS,FLAKY +# https://github.com/nodejs/node/issues/50260 +test-structuredclone-jstransferable: PASS,FLAKY [$system==linux] # https://github.com/nodejs/node/issues/38226 @@ -29,3 +31,7 @@ test-heapsnapshot-near-heap-limit: PASS,FLAKY [$system==ibmi] # https://github.com/nodejs/node/issues/39683 test-regress-GH-892: PASS, FLAKY + +[$arch==s390x] +# https://github.com/nodejs/node/issues/38226 +test-crypto-timing-safe-equal-benchmarks: PASS,FLAKY diff --git a/test/pummel/test-fs-readfile-tostring-fail.js b/test/pummel/test-fs-readfile-tostring-fail.js index 8ffe630076a52d..5863de251f0945 100644 --- a/test/pummel/test-fs-readfile-tostring-fail.js +++ b/test/pummel/test-fs-readfile-tostring-fail.js @@ -9,13 +9,15 @@ const assert = require('assert'); const fs = require('fs'); const cp = require('child_process'); const kStringMaxLength = require('buffer').constants.MAX_STRING_LENGTH; +const size = Math.floor(kStringMaxLength / 200); + if (common.isAIX && (Number(cp.execSync('ulimit -f')) * 512) < kStringMaxLength) common.skip('intensive toString tests due to file size confinements'); const tmpdir = require('../common/tmpdir'); tmpdir.refresh(); -if (!tmpdir.hasEnoughSpace(kStringMaxLength)) { +if (!tmpdir.hasEnoughSpace(kStringMaxLength + size)) { common.skip(`Not enough space in ${tmpdir.path}`); } @@ -26,7 +28,6 @@ const stream = fs.createWriteStream(file, { stream.on('error', (err) => { throw err; }); -const size = kStringMaxLength / 200; const a = Buffer.alloc(size, 'a'); let expectedSize = 0; diff --git a/test/sequential/sequential.status b/test/sequential/sequential.status index 5cefcb95773bed..c3f2cda226dcbe 100644 --- a/test/sequential/sequential.status +++ b/test/sequential/sequential.status @@ -14,6 +14,9 @@ test-watch-mode-inspect: PASS, FLAKY [$system==win32] # https://github.com/nodejs/node/issues/47116 test-http-max-sockets: PASS, FLAKY +# https://github.com/nodejs/node/issues/49630 +test-single-executable-application-snapshot: PASS, FLAKY +test-single-executable-application-snapshot-and-code-cache: PASS, FLAKY [$system==linux] @@ -37,7 +40,17 @@ test-tls-psk-client: PASS, FLAKY test-tls-securepair-client: PASS, FLAKY [$arch==arm] +# https://github.com/nodejs/node/issues/49933 +test-watch-mode-inspect: SKIP [$arch==s390x] # https://github.com/nodejs/node/issues/41286 test-performance-eventloopdelay: PASS, FLAKY + +[$system==ppc || $system==ppc64] +# https://github.com/nodejs/node/issues/50740 +test-single-executable-application-empty: PASS, FLAKY +test-single-executable-application-snapshot-and-code-cache: PASS, FLAKY +test-single-executable-application-snapshot: PASS, FLAKY +test-single-executable-application-use-code-cache: PASS, FLAKY +test-single-executable-application: PASS, FLAKY diff --git a/test/sequential/test-http-regr-gh-2928.js b/test/sequential/test-http-regr-gh-2928.js index 25476e0453c53b..f6a9e1603288a4 100644 --- a/test/sequential/test-http-regr-gh-2928.js +++ b/test/sequential/test-http-regr-gh-2928.js @@ -8,6 +8,8 @@ const httpCommon = require('_http_common'); const { HTTPParser } = require('_http_common'); const net = require('net'); +httpCommon.parsers.max = 50; + const COUNT = httpCommon.parsers.max + 1; const parsers = new Array(COUNT); diff --git a/test/sequential/test-single-executable-application-disable-experimental-sea-warning.js b/test/sequential/test-single-executable-application-disable-experimental-sea-warning.js index 0b4701b07e1c54..fdd0c23a26da3e 100644 --- a/test/sequential/test-single-executable-application-disable-experimental-sea-warning.js +++ b/test/sequential/test-single-executable-application-disable-experimental-sea-warning.js @@ -15,9 +15,8 @@ skipIfSingleExecutableIsNotSupported(); const fixtures = require('../common/fixtures'); const tmpdir = require('../common/tmpdir'); const { copyFileSync, writeFileSync, existsSync } = require('fs'); -const { execFileSync } = require('child_process'); +const { spawnSyncAndExitWithoutError } = require('../common/child_process'); const { join } = require('path'); -const { strictEqual } = require('assert'); const assert = require('assert'); const inputFile = fixtures.path('sea.js'); @@ -44,17 +43,27 @@ writeFileSync(configFile, ` // Copy input to working directory copyFileSync(inputFile, tmpdir.resolve('sea.js')); -execFileSync(process.execPath, ['--experimental-sea-config', 'sea-config.json'], { - cwd: tmpdir.path -}); +spawnSyncAndExitWithoutError( + process.execPath, + ['--experimental-sea-config', 'sea-config.json'], + { cwd: tmpdir.path }, + {}); assert(existsSync(seaPrepBlob)); copyFileSync(process.execPath, outputFile); injectAndCodeSign(outputFile, seaPrepBlob); -const singleExecutableApplicationOutput = execFileSync( +spawnSyncAndExitWithoutError( outputFile, [ '-a', '--b=c', 'd' ], - { env: { COMMON_DIRECTORY: join(__dirname, '..', 'common') } }); -strictEqual(singleExecutableApplicationOutput.toString(), 'Hello, world! 😊\n'); + { + env: { + COMMON_DIRECTORY: join(__dirname, '..', 'common'), + NODE_DEBUG_NATIVE: 'SEA', + ...process.env, + } + }, + { + stdout: 'Hello, world! 😊\n' + }); diff --git a/test/sequential/test-single-executable-application-empty.js b/test/sequential/test-single-executable-application-empty.js index 13dc2e834b7caa..047685b0074aa9 100644 --- a/test/sequential/test-single-executable-application-empty.js +++ b/test/sequential/test-single-executable-application-empty.js @@ -14,7 +14,7 @@ skipIfSingleExecutableIsNotSupported(); const tmpdir = require('../common/tmpdir'); const { copyFileSync, writeFileSync, existsSync } = require('fs'); -const { execFileSync } = require('child_process'); +const { spawnSyncAndExitWithoutError } = require('../common/child_process'); const assert = require('assert'); const configFile = tmpdir.resolve('sea-config.json'); @@ -31,13 +31,22 @@ writeFileSync(configFile, ` } `); -execFileSync(process.execPath, ['--experimental-sea-config', 'sea-config.json'], { - cwd: tmpdir.path -}); +spawnSyncAndExitWithoutError( + process.execPath, + ['--experimental-sea-config', 'sea-config.json'], + { cwd: tmpdir.path }); assert(existsSync(seaPrepBlob)); copyFileSync(process.execPath, outputFile); injectAndCodeSign(outputFile, seaPrepBlob); -execFileSync(outputFile); +spawnSyncAndExitWithoutError( + outputFile, + { + env: { + NODE_DEBUG_NATIVE: 'SEA', + ...process.env, + } + }, + {}); diff --git a/test/sequential/test-single-executable-application-snapshot-and-code-cache.js b/test/sequential/test-single-executable-application-snapshot-and-code-cache.js index 6d86d6a79d8d68..952003cf02c585 100644 --- a/test/sequential/test-single-executable-application-snapshot-and-code-cache.js +++ b/test/sequential/test-single-executable-application-snapshot-and-code-cache.js @@ -49,7 +49,11 @@ const outputFile = join(tmpdir.path, process.platform === 'win32' ? 'sea.exe' : process.execPath, ['--experimental-sea-config', 'sea-config.json'], { - cwd: tmpdir.path + cwd: tmpdir.path, + env: { + NODE_DEBUG_NATIVE: 'SEA', + ...process.env, + }, }, { stderr: /"useCodeCache" is redundant when "useSnapshot" is true/ @@ -61,8 +65,15 @@ const outputFile = join(tmpdir.path, process.platform === 'win32' ? 'sea.exe' : copyFileSync(process.execPath, outputFile); injectAndCodeSign(outputFile, seaPrepBlob); - spawnSyncAndExitWithoutError(outputFile, { - stdout: 'Hello from snapshot', - trim: true, - }); + spawnSyncAndExitWithoutError( + outputFile, + { + env: { + NODE_DEBUG_NATIVE: 'SEA,MKSNAPSHOT', + ...process.env, + } + }, { + stdout: 'Hello from snapshot', + trim: true, + }); } diff --git a/test/sequential/test-single-executable-application-snapshot.js b/test/sequential/test-single-executable-application-snapshot.js index 5c2d8c36fdd38f..402505a6122c74 100644 --- a/test/sequential/test-single-executable-application-snapshot.js +++ b/test/sequential/test-single-executable-application-snapshot.js @@ -73,7 +73,11 @@ const outputFile = tmpdir.resolve(process.platform === 'win32' ? 'sea.exe' : 'se process.execPath, ['--experimental-sea-config', 'sea-config.json'], { - cwd: tmpdir.path + cwd: tmpdir.path, + env: { + NODE_DEBUG_NATIVE: 'SEA', + ...process.env, + }, }, { stderr: /Single executable application is an experimental feature/ @@ -86,6 +90,12 @@ const outputFile = tmpdir.resolve(process.platform === 'win32' ? 'sea.exe' : 'se spawnSyncAndExitWithoutError( outputFile, + { + env: { + NODE_DEBUG_NATIVE: 'SEA,MKSNAPSHOT', + ...process.env, + } + }, { trim: true, stdout: 'Hello from snapshot', diff --git a/test/sequential/test-single-executable-application-use-code-cache.js b/test/sequential/test-single-executable-application-use-code-cache.js index 96de5769b1fe6b..af5f2855ed6318 100644 --- a/test/sequential/test-single-executable-application-use-code-cache.js +++ b/test/sequential/test-single-executable-application-use-code-cache.js @@ -15,9 +15,8 @@ skipIfSingleExecutableIsNotSupported(); const fixtures = require('../common/fixtures'); const tmpdir = require('../common/tmpdir'); const { copyFileSync, writeFileSync, existsSync } = require('fs'); -const { execFileSync } = require('child_process'); +const { spawnSyncAndExitWithoutError } = require('../common/child_process'); const { join } = require('path'); -const { strictEqual } = require('assert'); const assert = require('assert'); const inputFile = fixtures.path('sea.js'); @@ -44,17 +43,32 @@ writeFileSync(configFile, ` // Copy input to working directory copyFileSync(inputFile, tmpdir.resolve('sea.js')); -execFileSync(process.execPath, ['--experimental-sea-config', 'sea-config.json'], { - cwd: tmpdir.path -}); +spawnSyncAndExitWithoutError( + process.execPath, + ['--experimental-sea-config', 'sea-config.json'], + { + cwd: tmpdir.path, + env: { + NODE_DEBUG_NATIVE: 'SEA', + ...process.env, + }, + }); assert(existsSync(seaPrepBlob)); copyFileSync(process.execPath, outputFile); injectAndCodeSign(outputFile, seaPrepBlob); -const singleExecutableApplicationOutput = execFileSync( +spawnSyncAndExitWithoutError( outputFile, [ '-a', '--b=c', 'd' ], - { env: { COMMON_DIRECTORY: join(__dirname, '..', 'common') } }); -strictEqual(singleExecutableApplicationOutput.toString(), 'Hello, world! 😊\n'); + { + env: { + COMMON_DIRECTORY: join(__dirname, '..', 'common'), + NODE_DEBUG_NATIVE: 'SEA', + ...process.env, + } + }, + { + stdout: 'Hello, world! 😊\n' + }); diff --git a/test/sequential/test-single-executable-application.js b/test/sequential/test-single-executable-application.js index e930254cb0a7ae..6379dfd2ea4b6d 100644 --- a/test/sequential/test-single-executable-application.js +++ b/test/sequential/test-single-executable-application.js @@ -14,9 +14,8 @@ skipIfSingleExecutableIsNotSupported(); const fixtures = require('../common/fixtures'); const tmpdir = require('../common/tmpdir'); const { copyFileSync, writeFileSync, existsSync } = require('fs'); -const { execFileSync } = require('child_process'); +const { spawnSyncAndExitWithoutError } = require('../common/child_process'); const { join } = require('path'); -const { strictEqual } = require('assert'); const assert = require('assert'); const inputFile = fixtures.path('sea.js'); @@ -43,17 +42,27 @@ writeFileSync(configFile, ` // Copy input to working directory copyFileSync(inputFile, tmpdir.resolve('sea.js')); -execFileSync(process.execPath, ['--experimental-sea-config', 'sea-config.json'], { - cwd: tmpdir.path -}); +spawnSyncAndExitWithoutError( + process.execPath, + ['--experimental-sea-config', 'sea-config.json'], + { cwd: tmpdir.path }, + {}); assert(existsSync(seaPrepBlob)); copyFileSync(process.execPath, outputFile); injectAndCodeSign(outputFile, seaPrepBlob); -const singleExecutableApplicationOutput = execFileSync( +spawnSyncAndExitWithoutError( outputFile, [ '-a', '--b=c', 'd' ], - { env: { COMMON_DIRECTORY: join(__dirname, '..', 'common') } }); -strictEqual(singleExecutableApplicationOutput.toString(), 'Hello, world! 😊\n'); + { + env: { + COMMON_DIRECTORY: join(__dirname, '..', 'common'), + NODE_DEBUG_NATIVE: 'SEA', + ...process.env, + } + }, + { + stdout: 'Hello, world! 😊\n' + }); diff --git a/test/sequential/test-vm-timeout-escape-promise-module-2.js b/test/sequential/test-vm-timeout-escape-promise-module-2.js index 6a9d09890ddef0..13aa2fe998655d 100644 --- a/test/sequential/test-vm-timeout-escape-promise-module-2.js +++ b/test/sequential/test-vm-timeout-escape-promise-module-2.js @@ -39,4 +39,4 @@ assert.rejects(async () => { }, { code: 'ERR_SCRIPT_EXECUTION_TIMEOUT', message: 'Script execution timed out after 10ms' -}); +}).then(common.mustCall()); diff --git a/test/sequential/test-watch-mode.mjs b/test/sequential/test-watch-mode.mjs index dbe486f5bb2991..ed072456cd6f7e 100644 --- a/test/sequential/test-watch-mode.mjs +++ b/test/sequential/test-watch-mode.mjs @@ -30,9 +30,9 @@ function createTmpFile(content = 'console.log("running");', ext = '.js', basenam } async function runWriteSucceed({ - file, watchedFile, args = [file], completed = 'Completed running', restarts = 2 + file, watchedFile, watchFlag = '--watch', args = [file], completed = 'Completed running', restarts = 2, options = {} }) { - const child = spawn(execPath, ['--watch', '--no-warnings', ...args], { encoding: 'utf8', stdio: 'pipe' }); + const child = spawn(execPath, [watchFlag, '--no-warnings', ...args], { encoding: 'utf8', stdio: 'pipe', ...options }); let completes = 0; let cancelRestarts = () => {}; let stderr = ''; @@ -62,7 +62,7 @@ async function runWriteSucceed({ child.kill(); cancelRestarts(); } - return { stdout, stderr }; + return { stdout, stderr, pid: child.pid }; } async function failWriteSucceed({ file, watchedFile }) { @@ -88,6 +88,22 @@ async function failWriteSucceed({ file, watchedFile }) { tmpdir.refresh(); describe('watch mode', { concurrency: true, timeout: 60_000 }, () => { + it('should watch changes to a file', async () => { + const file = createTmpFile(); + const { stderr, stdout } = await runWriteSucceed({ file, watchedFile: file, watchFlag: '--watch=true', options: { + timeout: 10000 + } }); + + assert.strictEqual(stderr, ''); + assert.deepStrictEqual(stdout, [ + 'running', + `Completed running ${inspect(file)}`, + `Restarting ${inspect(file)}`, + 'running', + `Completed running ${inspect(file)}`, + ]); + }); + it('should watch changes to a file - event loop ended', async () => { const file = createTmpFile(); const { stderr, stdout } = await runWriteSucceed({ file, watchedFile: file }); @@ -259,13 +275,14 @@ console.log(values.random); ]); }); - it('should not load --require modules in main process', async () => { + it('should load --require modules in the watched process, and not in the orchestrator process', async () => { const file = createTmpFile(); - const required = createTmpFile('setImmediate(() => process.exit(0));'); + const required = createTmpFile('process._rawDebug(\'pid\', process.pid);'); const args = ['--require', required, file]; - const { stderr, stdout } = await runWriteSucceed({ file, watchedFile: file, args }); + const { stdout, pid } = await runWriteSucceed({ file, watchedFile: file, args }); - assert.strictEqual(stderr, ''); + const importPid = parseInt(stdout[0].split(' ')[1], 10); + assert.notStrictEqual(pid, importPid); assert.deepStrictEqual(stdout, [ 'running', `Completed running ${inspect(file)}`, @@ -275,13 +292,14 @@ console.log(values.random); ]); }); - it('should not load --import modules in main process', async () => { + it('should load --import modules in the watched process, and not in the orchestrator process', async () => { const file = createTmpFile(); - const imported = pathToFileURL(createTmpFile('setImmediate(() => process.exit(0));')); + const imported = "data:text/javascript,process._rawDebug('pid', process.pid);"; const args = ['--import', imported, file]; - const { stderr, stdout } = await runWriteSucceed({ file, watchedFile: file, args }); + const { stdout, pid } = await runWriteSucceed({ file, watchedFile: file, args }); - assert.strictEqual(stderr, ''); + const importPid = parseInt(stdout[0].split(' ')[1], 10); + assert.notStrictEqual(pid, importPid); assert.deepStrictEqual(stdout, [ 'running', `Completed running ${inspect(file)}`, diff --git a/test/v8-updates/test-linux-perf-logger.js b/test/v8-updates/test-linux-perf-logger.js new file mode 100644 index 00000000000000..8b00d332585121 --- /dev/null +++ b/test/v8-updates/test-linux-perf-logger.js @@ -0,0 +1,148 @@ +'use strict'; + +// --- About this test suite +// +// JIT support for perf(1) was added in 2009 (see https://lkml.org/lkml/2009/6/8/499). +// It works by looking for a perf map file in /tmp/perf-.map, where is the +// PID of the target process. +// +// The structure of this file is stable. Perf expects each line to specify a symbol +// in the form: +// +// +// +// where is the hex representation of the instruction pointer for the beginning +// of the function, is the byte length of the function, and is the +// readable JIT name used for reporting. +// +// This file asserts that a node script run with the appropriate flags will produce +// a compliant perf map. +// +// NOTE: This test runs only on linux, as that is the only platform supported by perf, and +// accordingly the only platform where `perf-basic-prof*` v8 flags are available. + + +const common = require('../common'); +if (!common.isLinux) { + common.skip('--perf-basic-prof* is statically defined as linux-only'); +} + +const assert = require('assert'); +const { spawnSync } = require('child_process'); +const { readFileSync } = require('fs'); + +const fixtures = require('../common/fixtures'); +const tmpdir = require('../common/tmpdir'); +tmpdir.refresh(); + +const testCases = [ + { + title: '--perf-basic-prof interpreted', + nodeFlags: ['--perf-basic-prof', '--no-turbo-inlining', '--no-opt'], + matches: [ + '~functionOne .+/linux-perf-logger.js', + '~functionTwo .+/linux-perf-logger.js', + 'test-regex', + ], + noMatches: ['\\*functionOne', '\\*functionTwo'], + }, + { + title: '--perf-basic-prof compiled', + nodeFlags: ['--perf-basic-prof', '--no-turbo-inlining', '--always-opt'], + matches: [ + 'test-regex', + '~functionOne .+/linux-perf-logger.js', + '~functionTwo .+/linux-perf-logger.js', + '\\*functionOne .+/linux-perf-logger.js', + '\\*functionTwo .+/linux-perf-logger.js', + ], + noMatches: [], + }, + { + title: '--perf-basic-prof-only-functions interpreted', + nodeFlags: ['--perf-basic-prof-only-functions', '--no-turbo-inlining', '--no-opt'], + matches: ['~functionOne .+/linux-perf-logger.js', '~functionTwo .+/linux-perf-logger.js'], + noMatches: ['\\*functionOne', '\\*functionTwo', 'test-regex'], + }, + { + title: '--perf-basic-prof-only-functions compiled', + nodeFlags: ['--perf-basic-prof-only-functions', '--no-turbo-inlining', '--always-opt'], + matches: [ + '~functionOne .+/linux-perf-logger.js', + '~functionTwo .+/linux-perf-logger.js', + '\\*functionOne .+/linux-perf-logger.js', + '\\*functionTwo .+/linux-perf-logger.js', + ], + noMatches: ['test-regex'], + }, +]; + +function runTest(test) { + const report = { + title: test.title, + perfMap: '[uninitialized]', + errors: [], + }; + + const args = test.nodeFlags.concat(fixtures.path('linux-perf-logger.js')); + const run = spawnSync(process.execPath, args, { cwd: tmpdir.path, encoding: 'utf8' }); + if (run.error) { + report.errors.push(run.error.stack); + return report; + } + if (run.status !== 0) { + report.errors.push(`running script:\n${run.stderr}`); + return report; + } + + try { + report.perfMap = readFileSync(`/tmp/perf-${run.pid}.map`, 'utf8'); + } catch (err) { + report.errors.push(`reading perf map: ${err.stack}`); + return report; + } + + const hexRegex = '[a-fA-F0-9]+'; + for (const testRegex of test.matches) { + const lineRegex = new RegExp(`${hexRegex} ${hexRegex}.*:${testRegex}`); + if (!lineRegex.test(report.perfMap)) { + report.errors.push(`Expected to match ${lineRegex}`); + } + } + + for (const regex of test.noMatches) { + const noMatch = new RegExp(regex); + if (noMatch.test(report.perfMap)) { + report.errors.push(`Expected not to match ${noMatch}`); + } + } + + return report; +} + +function serializeError(report, index) { + return `[ERROR ${index + 1}] ${report.title} +Errors: +${report.errors.map((err, i) => `${i + 1}. ${err}`).join('\n')} +Perf map content: +${report.perfMap} + +`; +} + +function runSuite() { + const failures = []; + + for (const tc of testCases) { + const report = runTest(tc); + if (report.errors.length > 0) { + failures.push(report); + } + } + + const errorsToReport = failures.map(serializeError).join('\n--------\n'); + + assert.strictEqual(failures.length, 0, `${failures.length} tests failed\n\n${errorsToReport}`); +} + +runSuite(); diff --git a/test/wasi/test-wasi-not-started.js b/test/wasi/test-wasi-not-started.js index b6c1b538ef96cc..2ef10418ae40ad 100644 --- a/test/wasi/test-wasi-not-started.js +++ b/test/wasi/test-wasi-not-started.js @@ -1,5 +1,5 @@ 'use strict'; -require('../common'); +const common = require('../common'); if (process.argv[2] === 'wasi-child') { const assert = require('assert'); @@ -23,7 +23,7 @@ if (process.argv[2] === 'wasi-child') { name: 'Error', code: 'ERR_WASI_NOT_STARTED', message: 'wasi.start() has not been called', - }); + }).then(common.mustCall()); } else { const assert = require('assert'); const cp = require('child_process'); diff --git a/test/wpt/README.md b/test/wpt/README.md index a378e3244a1f0b..0f73062e289a47 100644 --- a/test/wpt/README.md +++ b/test/wpt/README.md @@ -153,7 +153,7 @@ expected failures. { "something.scope.js": { // the file name // Optional: If the requirement is not met, this test will be skipped - "requires": ["small-icu"], // supports: "small-icu", "full-icu" + "requires": ["small-icu"], // supports: "small-icu", "full-icu", "crypto" // Optional: the test will be skipped with the reason printed "skip": "explain why we cannot run a test that's supposed to pass", diff --git a/test/wpt/status/compression.json b/test/wpt/status/compression.json new file mode 100644 index 00000000000000..0cae222832e823 --- /dev/null +++ b/test/wpt/status/compression.json @@ -0,0 +1,28 @@ +{ + "compression-bad-chunks.tentative.any.js": { + "skip": "Execution \"hangs\", ArrayBuffer and TypedArray is not accepted and throws, instead of rejects during writer.write" + }, + "decompression-bad-chunks.tentative.any.js": { + "skip": "Execution \"hangs\", ArrayBuffer and TypedArray is not accepted and throws, instead of rejects during writer.write" + }, + "decompression-buffersource.tentative.any.js": { + "skip": "ArrayBuffer and TypedArray is not accepted and throws, instead of rejects during writer.write" + }, + "compression-with-detach.tentative.window.js": { + "requires": ["crypto"] + }, + "decompression-corrupt-input.tentative.any.js": { + "fail": { + "expected": [ + "trailing junk for 'deflate' should give an error", + "trailing junk for 'gzip' should give an error" + ] + } + }, + "idlharness-shadowrealm.window.js": { + "skip": "ShadowRealm support is not enabled" + }, + "third_party/pako/pako_inflate.min.js": { + "skip": "This is not a test file." + } +} diff --git a/test/wpt/status/console.json b/test/wpt/status/console.json index 7f8af86a083fde..7c9dadf0cc4465 100644 --- a/test/wpt/status/console.json +++ b/test/wpt/status/console.json @@ -1,11 +1,9 @@ { "idlharness.any.js": { - "fail": { - "flaky": [ - "console namespace: operation assert(optional boolean, any...)", - "console namespace: operation table(optional any, optional sequence)", - "console namespace: operation dir(optional any, optional object?)" - ] - } + "note": "https://github.com/nodejs/node/issues/44185", + "requires": ["crypto", "small-icu"] + }, + "idlharness-shadowrealm.window.js": { + "skip": "ShadowRealm support is not enabled" } } diff --git a/test/wpt/status/encoding.json b/test/wpt/status/encoding.json index 0cc551e24a25d9..db481cca6a09df 100644 --- a/test/wpt/status/encoding.json +++ b/test/wpt/status/encoding.json @@ -37,7 +37,10 @@ "skip": "The iso-8859-16 encoding is not supported" }, "idlharness.any.js": { - "skip": "No implementation of TextDecoderStream and TextEncoderStream" + "requires": ["small-icu"] + }, + "idlharness-shadowrealm.window.js": { + "skip": "ShadowRealm support is not enabled" }, "replacement-encodings.any.js": { "skip": "decoding-helpers.js needs XMLHttpRequest" diff --git a/test/wpt/status/hr-time.json b/test/wpt/status/hr-time.json index a2940656dbe80e..b787bcb7862cb6 100644 --- a/test/wpt/status/hr-time.json +++ b/test/wpt/status/hr-time.json @@ -6,6 +6,9 @@ ] } }, + "idlharness-shadowrealm.window.js": { + "skip": "ShadowRealm support is not enabled" + }, "window-worker-timeOrigin.window.js": { "skip": "depends on URL.createObjectURL(blob)" } diff --git a/test/wpt/status/performance-timeline.json b/test/wpt/status/performance-timeline.json index 9a297e641437df..36eeb36782c9aa 100644 --- a/test/wpt/status/performance-timeline.json +++ b/test/wpt/status/performance-timeline.json @@ -7,6 +7,9 @@ ] } }, + "navigation-id.helper.js": { + "skip": "This is not a test file." + }, "webtiming-resolution.any.js": { "skip": "flaky" } diff --git a/test/wpt/status/resource-timing.json b/test/wpt/status/resource-timing.json index 22f21cfe48d7fe..db5154260227b3 100644 --- a/test/wpt/status/resource-timing.json +++ b/test/wpt/status/resource-timing.json @@ -19,5 +19,22 @@ }, "buffered-flag.any.js": { "skip": "Browser-specific test" + }, + "idlharness.any.js": { + "fail": { + "expected": [ + "PerformanceResourceTiming interface: attribute deliveryType", + "PerformanceResourceTiming interface: attribute firstInterimResponseStart", + "PerformanceResourceTiming interface: attribute responseStatus", + "PerformanceResourceTiming interface: attribute renderBlockingStatus", + "PerformanceResourceTiming interface: attribute contentType", + "PerformanceResourceTiming interface: resource must inherit property \"deliveryType\" with the proper type", + "PerformanceResourceTiming interface: resource must inherit property \"firstInterimResponseStart\" with the proper type", + "PerformanceResourceTiming interface: resource must inherit property \"responseStatus\" with the proper type", + "PerformanceResourceTiming interface: resource must inherit property \"renderBlockingStatus\" with the proper type", + "PerformanceResourceTiming interface: resource must inherit property \"contentType\" with the proper type", + "PerformanceResourceTiming interface: default toJSON operation on resource" + ] + } } } diff --git a/test/wpt/status/streams.json b/test/wpt/status/streams.json index 11e225e5f3213e..3b6e0ce6429f9d 100644 --- a/test/wpt/status/streams.json +++ b/test/wpt/status/streams.json @@ -1,13 +1,10 @@ { - "idlharness.any.js": { - "fail": { - "expected": [ - "ReadableStream interface: async iterable" - ] - } + "idlharness-shadowrealm.window.js": { + "skip": "ShadowRealm support is not enabled" }, "piping/general-addition.any.js": { "fail": { + "note": "Blocked on https://github.com/whatwg/streams/issues/1243", "expected": [ "enqueue() must not synchronously call write algorithm" ] @@ -21,6 +18,7 @@ }, "readable-streams/owning-type-message-port.any.js": { "fail": { + "note": "Readable streams with type owning are not yet supported", "expected": [ "Transferred MessageChannel works as expected", "Second branch of owning ReadableStream tee should end up into errors with transfer only values" @@ -32,6 +30,7 @@ }, "readable-streams/owning-type.any.js": { "fail": { + "note": "Readable streams with type owning are not yet supported", "expected": [ "ReadableStream can be constructed with owning type", "ReadableStream of type owning should call start with a ReadableStreamDefaultController", diff --git a/test/wpt/status/url.json b/test/wpt/status/url.json index 43f22c5afe5de3..96dafd91b707d5 100644 --- a/test/wpt/status/url.json +++ b/test/wpt/status/url.json @@ -1,4 +1,7 @@ { + "idlharness-shadowrealm.window.js": { + "skip": "ShadowRealm support is not enabled" + }, "percent-encoding.window.js": { "skip": "TODO: port from .window.js" }, diff --git a/test/wpt/status/user-timing.json b/test/wpt/status/user-timing.json index 6e2b6e276ccda0..7e0e70dcf20f20 100644 --- a/test/wpt/status/user-timing.json +++ b/test/wpt/status/user-timing.json @@ -1,4 +1,7 @@ { + "idlharness-shadowrealm.window.js": { + "skip": "ShadowRealm support is not enabled" + }, "invoke_with_timing_attributes.worker.js": { "skip": "importScripts not supported" }, diff --git a/test/wpt/test-compression.js b/test/wpt/test-compression.js new file mode 100644 index 00000000000000..23800734922afe --- /dev/null +++ b/test/wpt/test-compression.js @@ -0,0 +1,9 @@ +'use strict'; + +const { WPTRunner } = require('../common/wpt'); + +const runner = new WPTRunner('compression'); + +runner.pretendGlobalThisAs('Window'); + +runner.runJsTests(); diff --git a/test/wpt/test-encoding.js b/test/wpt/test-encoding.js index af20760bd533d3..eb54c70867cb43 100644 --- a/test/wpt/test-encoding.js +++ b/test/wpt/test-encoding.js @@ -3,4 +3,6 @@ const { WPTRunner } = require('../common/wpt'); const runner = new WPTRunner('encoding'); +runner.pretendGlobalThisAs('Window'); + runner.runJsTests(); diff --git a/tools/build-addons.mjs b/tools/build-addons.mjs index a96c18435ddc03..dc30c549fa5fbf 100755 --- a/tools/build-addons.mjs +++ b/tools/build-addons.mjs @@ -58,6 +58,8 @@ const jobs = []; for await (const dirent of await fs.opendir(directory)) { if (dirent.isDirectory()) { jobs.push(() => buildAddon(path.join(directory, dirent.name))); + } else if (dirent.isFile() && dirent.name === 'binding.gyp') { + jobs.push(() => buildAddon(directory)); } } await parallel(jobs, parallelization); diff --git a/tools/certdata.txt b/tools/certdata.txt index dd113ae00101dc..59cc15df6e9ddc 100644 --- a/tools/certdata.txt +++ b/tools/certdata.txt @@ -205,346 +205,6 @@ CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "Verisign Class 1 Public Primary Certification Authority - G3" -# -# Issuer: CN=VeriSign Class 1 Public Primary Certification Authority - G3,OU="(c) 1999 VeriSign, Inc. - For authorized use only",OU=VeriSign Trust Network,O="VeriSign, Inc.",C=US -# Serial Number:00:8b:5b:75:56:84:54:85:0b:00:cf:af:38:48:ce:b1:a4 -# Subject: CN=VeriSign Class 1 Public Primary Certification Authority - G3,OU="(c) 1999 VeriSign, Inc. - For authorized use only",OU=VeriSign Trust Network,O="VeriSign, Inc.",C=US -# Not Valid Before: Fri Oct 01 00:00:00 1999 -# Not Valid After : Wed Jul 16 23:59:59 2036 -# Fingerprint (SHA-256): CB:B5:AF:18:5E:94:2A:24:02:F9:EA:CB:C0:ED:5B:B8:76:EE:A3:C1:22:36:23:D0:04:47:E4:F3:BA:55:4B:65 -# Fingerprint (SHA1): 20:42:85:DC:F7:EB:76:41:95:57:8E:13:6B:D4:B7:D1:E9:8E:46:A5 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Verisign Class 1 Public Primary Certification Authority - G3" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\312\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\027\060\025\006\003\125\004\012\023\016\126\145\162\151\123 -\151\147\156\054\040\111\156\143\056\061\037\060\035\006\003\125 -\004\013\023\026\126\145\162\151\123\151\147\156\040\124\162\165 -\163\164\040\116\145\164\167\157\162\153\061\072\060\070\006\003 -\125\004\013\023\061\050\143\051\040\061\071\071\071\040\126\145 -\162\151\123\151\147\156\054\040\111\156\143\056\040\055\040\106 -\157\162\040\141\165\164\150\157\162\151\172\145\144\040\165\163 -\145\040\157\156\154\171\061\105\060\103\006\003\125\004\003\023 -\074\126\145\162\151\123\151\147\156\040\103\154\141\163\163\040 -\061\040\120\165\142\154\151\143\040\120\162\151\155\141\162\171 -\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101 -\165\164\150\157\162\151\164\171\040\055\040\107\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\312\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\027\060\025\006\003\125\004\012\023\016\126\145\162\151\123 -\151\147\156\054\040\111\156\143\056\061\037\060\035\006\003\125 -\004\013\023\026\126\145\162\151\123\151\147\156\040\124\162\165 -\163\164\040\116\145\164\167\157\162\153\061\072\060\070\006\003 -\125\004\013\023\061\050\143\051\040\061\071\071\071\040\126\145 -\162\151\123\151\147\156\054\040\111\156\143\056\040\055\040\106 -\157\162\040\141\165\164\150\157\162\151\172\145\144\040\165\163 -\145\040\157\156\154\171\061\105\060\103\006\003\125\004\003\023 -\074\126\145\162\151\123\151\147\156\040\103\154\141\163\163\040 -\061\040\120\165\142\154\151\143\040\120\162\151\155\141\162\171 -\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101 -\165\164\150\157\162\151\164\171\040\055\040\107\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\021\000\213\133\165\126\204\124\205\013\000\317\257\070\110 -\316\261\244 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\004\032\060\202\003\002\002\021\000\213\133\165\126\204 -\124\205\013\000\317\257\070\110\316\261\244\060\015\006\011\052 -\206\110\206\367\015\001\001\005\005\000\060\201\312\061\013\060 -\011\006\003\125\004\006\023\002\125\123\061\027\060\025\006\003 -\125\004\012\023\016\126\145\162\151\123\151\147\156\054\040\111 -\156\143\056\061\037\060\035\006\003\125\004\013\023\026\126\145 -\162\151\123\151\147\156\040\124\162\165\163\164\040\116\145\164 -\167\157\162\153\061\072\060\070\006\003\125\004\013\023\061\050 -\143\051\040\061\071\071\071\040\126\145\162\151\123\151\147\156 -\054\040\111\156\143\056\040\055\040\106\157\162\040\141\165\164 -\150\157\162\151\172\145\144\040\165\163\145\040\157\156\154\171 -\061\105\060\103\006\003\125\004\003\023\074\126\145\162\151\123 -\151\147\156\040\103\154\141\163\163\040\061\040\120\165\142\154 -\151\143\040\120\162\151\155\141\162\171\040\103\145\162\164\151 -\146\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151 -\164\171\040\055\040\107\063\060\036\027\015\071\071\061\060\060 -\061\060\060\060\060\060\060\132\027\015\063\066\060\067\061\066 -\062\063\065\071\065\071\132\060\201\312\061\013\060\011\006\003 -\125\004\006\023\002\125\123\061\027\060\025\006\003\125\004\012 -\023\016\126\145\162\151\123\151\147\156\054\040\111\156\143\056 -\061\037\060\035\006\003\125\004\013\023\026\126\145\162\151\123 -\151\147\156\040\124\162\165\163\164\040\116\145\164\167\157\162 -\153\061\072\060\070\006\003\125\004\013\023\061\050\143\051\040 -\061\071\071\071\040\126\145\162\151\123\151\147\156\054\040\111 -\156\143\056\040\055\040\106\157\162\040\141\165\164\150\157\162 -\151\172\145\144\040\165\163\145\040\157\156\154\171\061\105\060 -\103\006\003\125\004\003\023\074\126\145\162\151\123\151\147\156 -\040\103\154\141\163\163\040\061\040\120\165\142\154\151\143\040 -\120\162\151\155\141\162\171\040\103\145\162\164\151\146\151\143 -\141\164\151\157\156\040\101\165\164\150\157\162\151\164\171\040 -\055\040\107\063\060\202\001\042\060\015\006\011\052\206\110\206 -\367\015\001\001\001\005\000\003\202\001\017\000\060\202\001\012 -\002\202\001\001\000\335\204\324\271\264\371\247\330\363\004\170 -\234\336\075\334\154\023\026\331\172\335\044\121\146\300\307\046 -\131\015\254\006\010\302\224\321\063\037\360\203\065\037\156\033 -\310\336\252\156\025\116\124\047\357\304\155\032\354\013\343\016 -\360\104\245\127\307\100\130\036\243\107\037\161\354\140\366\155 -\224\310\030\071\355\376\102\030\126\337\344\114\111\020\170\116 -\001\166\065\143\022\066\335\146\274\001\004\066\243\125\150\325 -\242\066\011\254\253\041\046\124\006\255\077\312\024\340\254\312 -\255\006\035\225\342\370\235\361\340\140\377\302\177\165\053\114 -\314\332\376\207\231\041\352\272\376\076\124\327\322\131\170\333 -\074\156\317\240\023\000\032\270\047\241\344\276\147\226\312\240 -\305\263\234\335\311\165\236\353\060\232\137\243\315\331\256\170 -\031\077\043\351\134\333\051\275\255\125\310\033\124\214\143\366 -\350\246\352\307\067\022\134\243\051\036\002\331\333\037\073\264 -\327\017\126\107\201\025\004\112\257\203\047\321\305\130\210\301 -\335\366\252\247\243\030\332\150\252\155\021\121\341\277\145\153 -\237\226\166\321\075\002\003\001\000\001\060\015\006\011\052\206 -\110\206\367\015\001\001\005\005\000\003\202\001\001\000\253\146 -\215\327\263\272\307\232\266\346\125\320\005\361\237\061\215\132 -\252\331\252\106\046\017\161\355\245\255\123\126\142\001\107\052 -\104\351\376\077\164\013\023\233\271\364\115\033\262\321\137\262 -\266\322\210\134\263\237\315\313\324\247\331\140\225\204\072\370 -\301\067\035\141\312\347\260\305\345\221\332\124\246\254\061\201 -\256\227\336\315\010\254\270\300\227\200\177\156\162\244\347\151 -\023\225\145\037\304\223\074\375\171\217\004\324\076\117\352\367 -\236\316\315\147\174\117\145\002\377\221\205\124\163\307\377\066 -\367\206\055\354\320\136\117\377\021\237\162\006\326\270\032\361 -\114\015\046\145\342\104\200\036\307\237\343\335\350\012\332\354 -\245\040\200\151\150\241\117\176\341\153\317\007\101\372\203\216 -\274\070\335\260\056\021\261\153\262\102\314\232\274\371\110\042 -\171\112\031\017\262\034\076\040\164\331\152\303\276\362\050\170 -\023\126\171\117\155\120\352\033\260\265\127\261\067\146\130\043 -\363\334\017\337\012\207\304\357\206\005\325\070\024\140\231\243 -\113\336\006\226\161\054\362\333\266\037\244\357\077\356 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -# For Email Distrust After: Wed Aug 31 00:00:00 2022 -CKA_NSS_EMAIL_DISTRUST_AFTER MULTILINE_OCTAL -\062\062\060\070\063\061\060\060\060\060\060\060\132 -END - -# Trust for "Verisign Class 1 Public Primary Certification Authority - G3" -# Issuer: CN=VeriSign Class 1 Public Primary Certification Authority - G3,OU="(c) 1999 VeriSign, Inc. - For authorized use only",OU=VeriSign Trust Network,O="VeriSign, Inc.",C=US -# Serial Number:00:8b:5b:75:56:84:54:85:0b:00:cf:af:38:48:ce:b1:a4 -# Subject: CN=VeriSign Class 1 Public Primary Certification Authority - G3,OU="(c) 1999 VeriSign, Inc. - For authorized use only",OU=VeriSign Trust Network,O="VeriSign, Inc.",C=US -# Not Valid Before: Fri Oct 01 00:00:00 1999 -# Not Valid After : Wed Jul 16 23:59:59 2036 -# Fingerprint (SHA-256): CB:B5:AF:18:5E:94:2A:24:02:F9:EA:CB:C0:ED:5B:B8:76:EE:A3:C1:22:36:23:D0:04:47:E4:F3:BA:55:4B:65 -# Fingerprint (SHA1): 20:42:85:DC:F7:EB:76:41:95:57:8E:13:6B:D4:B7:D1:E9:8E:46:A5 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Verisign Class 1 Public Primary Certification Authority - G3" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\040\102\205\334\367\353\166\101\225\127\216\023\153\324\267\321 -\351\216\106\245 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\261\107\274\030\127\321\030\240\170\055\354\161\350\052\225\163 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\312\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\027\060\025\006\003\125\004\012\023\016\126\145\162\151\123 -\151\147\156\054\040\111\156\143\056\061\037\060\035\006\003\125 -\004\013\023\026\126\145\162\151\123\151\147\156\040\124\162\165 -\163\164\040\116\145\164\167\157\162\153\061\072\060\070\006\003 -\125\004\013\023\061\050\143\051\040\061\071\071\071\040\126\145 -\162\151\123\151\147\156\054\040\111\156\143\056\040\055\040\106 -\157\162\040\141\165\164\150\157\162\151\172\145\144\040\165\163 -\145\040\157\156\154\171\061\105\060\103\006\003\125\004\003\023 -\074\126\145\162\151\123\151\147\156\040\103\154\141\163\163\040 -\061\040\120\165\142\154\151\143\040\120\162\151\155\141\162\171 -\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101 -\165\164\150\157\162\151\164\171\040\055\040\107\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\021\000\213\133\165\126\204\124\205\013\000\317\257\070\110 -\316\261\244 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Verisign Class 2 Public Primary Certification Authority - G3" -# -# Issuer: CN=VeriSign Class 2 Public Primary Certification Authority - G3,OU="(c) 1999 VeriSign, Inc. - For authorized use only",OU=VeriSign Trust Network,O="VeriSign, Inc.",C=US -# Serial Number:61:70:cb:49:8c:5f:98:45:29:e7:b0:a6:d9:50:5b:7a -# Subject: CN=VeriSign Class 2 Public Primary Certification Authority - G3,OU="(c) 1999 VeriSign, Inc. - For authorized use only",OU=VeriSign Trust Network,O="VeriSign, Inc.",C=US -# Not Valid Before: Fri Oct 01 00:00:00 1999 -# Not Valid After : Wed Jul 16 23:59:59 2036 -# Fingerprint (SHA-256): 92:A9:D9:83:3F:E1:94:4D:B3:66:E8:BF:AE:7A:95:B6:48:0C:2D:6C:6C:2A:1B:E6:5D:42:36:B6:08:FC:A1:BB -# Fingerprint (SHA1): 61:EF:43:D7:7F:CA:D4:61:51:BC:98:E0:C3:59:12:AF:9F:EB:63:11 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Verisign Class 2 Public Primary Certification Authority - G3" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\312\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\027\060\025\006\003\125\004\012\023\016\126\145\162\151\123 -\151\147\156\054\040\111\156\143\056\061\037\060\035\006\003\125 -\004\013\023\026\126\145\162\151\123\151\147\156\040\124\162\165 -\163\164\040\116\145\164\167\157\162\153\061\072\060\070\006\003 -\125\004\013\023\061\050\143\051\040\061\071\071\071\040\126\145 -\162\151\123\151\147\156\054\040\111\156\143\056\040\055\040\106 -\157\162\040\141\165\164\150\157\162\151\172\145\144\040\165\163 -\145\040\157\156\154\171\061\105\060\103\006\003\125\004\003\023 -\074\126\145\162\151\123\151\147\156\040\103\154\141\163\163\040 -\062\040\120\165\142\154\151\143\040\120\162\151\155\141\162\171 -\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101 -\165\164\150\157\162\151\164\171\040\055\040\107\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\312\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\027\060\025\006\003\125\004\012\023\016\126\145\162\151\123 -\151\147\156\054\040\111\156\143\056\061\037\060\035\006\003\125 -\004\013\023\026\126\145\162\151\123\151\147\156\040\124\162\165 -\163\164\040\116\145\164\167\157\162\153\061\072\060\070\006\003 -\125\004\013\023\061\050\143\051\040\061\071\071\071\040\126\145 -\162\151\123\151\147\156\054\040\111\156\143\056\040\055\040\106 -\157\162\040\141\165\164\150\157\162\151\172\145\144\040\165\163 -\145\040\157\156\154\171\061\105\060\103\006\003\125\004\003\023 -\074\126\145\162\151\123\151\147\156\040\103\154\141\163\163\040 -\062\040\120\165\142\154\151\143\040\120\162\151\155\141\162\171 -\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101 -\165\164\150\157\162\151\164\171\040\055\040\107\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\141\160\313\111\214\137\230\105\051\347\260\246\331\120 -\133\172 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\004\031\060\202\003\001\002\020\141\160\313\111\214\137 -\230\105\051\347\260\246\331\120\133\172\060\015\006\011\052\206 -\110\206\367\015\001\001\005\005\000\060\201\312\061\013\060\011 -\006\003\125\004\006\023\002\125\123\061\027\060\025\006\003\125 -\004\012\023\016\126\145\162\151\123\151\147\156\054\040\111\156 -\143\056\061\037\060\035\006\003\125\004\013\023\026\126\145\162 -\151\123\151\147\156\040\124\162\165\163\164\040\116\145\164\167 -\157\162\153\061\072\060\070\006\003\125\004\013\023\061\050\143 -\051\040\061\071\071\071\040\126\145\162\151\123\151\147\156\054 -\040\111\156\143\056\040\055\040\106\157\162\040\141\165\164\150 -\157\162\151\172\145\144\040\165\163\145\040\157\156\154\171\061 -\105\060\103\006\003\125\004\003\023\074\126\145\162\151\123\151 -\147\156\040\103\154\141\163\163\040\062\040\120\165\142\154\151 -\143\040\120\162\151\155\141\162\171\040\103\145\162\164\151\146 -\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164 -\171\040\055\040\107\063\060\036\027\015\071\071\061\060\060\061 -\060\060\060\060\060\060\132\027\015\063\066\060\067\061\066\062 -\063\065\071\065\071\132\060\201\312\061\013\060\011\006\003\125 -\004\006\023\002\125\123\061\027\060\025\006\003\125\004\012\023 -\016\126\145\162\151\123\151\147\156\054\040\111\156\143\056\061 -\037\060\035\006\003\125\004\013\023\026\126\145\162\151\123\151 -\147\156\040\124\162\165\163\164\040\116\145\164\167\157\162\153 -\061\072\060\070\006\003\125\004\013\023\061\050\143\051\040\061 -\071\071\071\040\126\145\162\151\123\151\147\156\054\040\111\156 -\143\056\040\055\040\106\157\162\040\141\165\164\150\157\162\151 -\172\145\144\040\165\163\145\040\157\156\154\171\061\105\060\103 -\006\003\125\004\003\023\074\126\145\162\151\123\151\147\156\040 -\103\154\141\163\163\040\062\040\120\165\142\154\151\143\040\120 -\162\151\155\141\162\171\040\103\145\162\164\151\146\151\143\141 -\164\151\157\156\040\101\165\164\150\157\162\151\164\171\040\055 -\040\107\063\060\202\001\042\060\015\006\011\052\206\110\206\367 -\015\001\001\001\005\000\003\202\001\017\000\060\202\001\012\002 -\202\001\001\000\257\012\015\302\325\054\333\147\271\055\345\224 -\047\335\245\276\340\260\115\217\263\141\126\074\326\174\303\364 -\315\076\206\313\242\210\342\341\330\244\151\305\265\342\277\301 -\246\107\120\136\106\071\213\325\226\272\265\157\024\277\020\316 -\047\023\236\005\107\233\061\172\023\330\037\331\323\002\067\213 -\255\054\107\360\216\201\006\247\015\060\014\353\367\074\017\040 -\035\334\162\106\356\245\002\310\133\303\311\126\151\114\305\030 -\301\221\173\013\325\023\000\233\274\357\303\110\076\106\140\040 -\205\052\325\220\266\315\213\240\314\062\335\267\375\100\125\262 -\120\034\126\256\314\215\167\115\307\040\115\247\061\166\357\150 -\222\212\220\036\010\201\126\262\255\151\243\122\320\313\034\304 -\043\075\037\231\376\114\350\026\143\216\306\010\216\366\061\366 -\322\372\345\166\335\265\034\222\243\111\315\315\001\315\150\315 -\251\151\272\243\353\035\015\234\244\040\246\301\240\305\321\106 -\114\027\155\322\254\146\077\226\214\340\204\324\066\377\042\131 -\305\371\021\140\250\137\004\175\362\032\366\045\102\141\017\304 -\112\270\076\211\002\003\001\000\001\060\015\006\011\052\206\110 -\206\367\015\001\001\005\005\000\003\202\001\001\000\064\046\025 -\074\300\215\115\103\111\035\275\351\041\222\327\146\234\267\336 -\305\270\320\344\135\137\166\042\300\046\371\204\072\072\371\214 -\265\373\354\140\361\350\316\004\260\310\335\247\003\217\060\363 -\230\337\244\346\244\061\337\323\034\013\106\334\162\040\077\256 -\356\005\074\244\063\077\013\071\254\160\170\163\113\231\053\337 -\060\302\124\260\250\073\125\241\376\026\050\315\102\275\164\156 -\200\333\047\104\247\316\104\135\324\033\220\230\015\036\102\224 -\261\000\054\004\320\164\243\002\005\042\143\143\315\203\265\373 -\301\155\142\153\151\165\375\135\160\101\271\365\277\174\337\276 -\301\062\163\042\041\213\130\201\173\025\221\172\272\343\144\110 -\260\177\373\066\045\332\225\320\361\044\024\027\335\030\200\153 -\106\043\071\124\365\216\142\011\004\035\224\220\246\233\346\045 -\342\102\105\252\270\220\255\276\010\217\251\013\102\030\224\317 -\162\071\341\261\103\340\050\317\267\347\132\154\023\153\111\263 -\377\343\030\174\211\213\063\135\254\063\327\247\371\332\072\125 -\311\130\020\371\252\357\132\266\317\113\113\337\052 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -# For Email Distrust After: Wed Aug 31 00:00:00 2022 -CKA_NSS_EMAIL_DISTRUST_AFTER MULTILINE_OCTAL -\062\062\060\070\063\061\060\060\060\060\060\060\132 -END - -# Trust for "Verisign Class 2 Public Primary Certification Authority - G3" -# Issuer: CN=VeriSign Class 2 Public Primary Certification Authority - G3,OU="(c) 1999 VeriSign, Inc. - For authorized use only",OU=VeriSign Trust Network,O="VeriSign, Inc.",C=US -# Serial Number:61:70:cb:49:8c:5f:98:45:29:e7:b0:a6:d9:50:5b:7a -# Subject: CN=VeriSign Class 2 Public Primary Certification Authority - G3,OU="(c) 1999 VeriSign, Inc. - For authorized use only",OU=VeriSign Trust Network,O="VeriSign, Inc.",C=US -# Not Valid Before: Fri Oct 01 00:00:00 1999 -# Not Valid After : Wed Jul 16 23:59:59 2036 -# Fingerprint (SHA-256): 92:A9:D9:83:3F:E1:94:4D:B3:66:E8:BF:AE:7A:95:B6:48:0C:2D:6C:6C:2A:1B:E6:5D:42:36:B6:08:FC:A1:BB -# Fingerprint (SHA1): 61:EF:43:D7:7F:CA:D4:61:51:BC:98:E0:C3:59:12:AF:9F:EB:63:11 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Verisign Class 2 Public Primary Certification Authority - G3" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\141\357\103\327\177\312\324\141\121\274\230\340\303\131\022\257 -\237\353\143\021 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\370\276\304\143\042\311\250\106\164\213\270\035\036\112\053\366 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\312\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\027\060\025\006\003\125\004\012\023\016\126\145\162\151\123 -\151\147\156\054\040\111\156\143\056\061\037\060\035\006\003\125 -\004\013\023\026\126\145\162\151\123\151\147\156\040\124\162\165 -\163\164\040\116\145\164\167\157\162\153\061\072\060\070\006\003 -\125\004\013\023\061\050\143\051\040\061\071\071\071\040\126\145 -\162\151\123\151\147\156\054\040\111\156\143\056\040\055\040\106 -\157\162\040\141\165\164\150\157\162\151\172\145\144\040\165\163 -\145\040\157\156\154\171\061\105\060\103\006\003\125\004\003\023 -\074\126\145\162\151\123\151\147\156\040\103\154\141\163\163\040 -\062\040\120\165\142\154\151\143\040\120\162\151\155\141\162\171 -\040\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101 -\165\164\150\157\162\151\164\171\040\055\040\107\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\141\160\313\111\214\137\230\105\051\347\260\246\331\120 -\133\172 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - # # Certificate "Entrust.net Premium 2048 Secure Server CA" # @@ -4696,182 +4356,6 @@ CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "Autoridad de Certificacion Firmaprofesional CIF A62634068" -# -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068,C=ES -# Serial Number:53:ec:3b:ee:fb:b2:48:5f -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068,C=ES -# Not Valid Before: Wed May 20 08:38:15 2009 -# Not Valid After : Tue Dec 31 08:38:15 2030 -# Fingerprint (SHA-256): 04:04:80:28:BF:1F:28:64:D4:8F:9A:D4:D8:32:94:36:6A:82:88:56:55:3F:3B:14:30:3F:90:14:7F:5D:40:EF -# Fingerprint (SHA1): AE:C5:FB:3F:C8:E1:BF:C4:E5:4F:03:07:5A:9A:E8:00:B7:F7:B6:FA -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Autoridad de Certificacion Firmaprofesional CIF A62634068" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\105\123\061 -\102\060\100\006\003\125\004\003\014\071\101\165\164\157\162\151 -\144\141\144\040\144\145\040\103\145\162\164\151\146\151\143\141 -\143\151\157\156\040\106\151\162\155\141\160\162\157\146\145\163 -\151\157\156\141\154\040\103\111\106\040\101\066\062\066\063\064 -\060\066\070 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\105\123\061 -\102\060\100\006\003\125\004\003\014\071\101\165\164\157\162\151 -\144\141\144\040\144\145\040\103\145\162\164\151\146\151\143\141 -\143\151\157\156\040\106\151\162\155\141\160\162\157\146\145\163 -\151\157\156\141\154\040\103\111\106\040\101\066\062\066\063\064 -\060\066\070 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\123\354\073\356\373\262\110\137 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\006\024\060\202\003\374\240\003\002\001\002\002\010\123 -\354\073\356\373\262\110\137\060\015\006\011\052\206\110\206\367 -\015\001\001\005\005\000\060\121\061\013\060\011\006\003\125\004 -\006\023\002\105\123\061\102\060\100\006\003\125\004\003\014\071 -\101\165\164\157\162\151\144\141\144\040\144\145\040\103\145\162 -\164\151\146\151\143\141\143\151\157\156\040\106\151\162\155\141 -\160\162\157\146\145\163\151\157\156\141\154\040\103\111\106\040 -\101\066\062\066\063\064\060\066\070\060\036\027\015\060\071\060 -\065\062\060\060\070\063\070\061\065\132\027\015\063\060\061\062 -\063\061\060\070\063\070\061\065\132\060\121\061\013\060\011\006 -\003\125\004\006\023\002\105\123\061\102\060\100\006\003\125\004 -\003\014\071\101\165\164\157\162\151\144\141\144\040\144\145\040 -\103\145\162\164\151\146\151\143\141\143\151\157\156\040\106\151 -\162\155\141\160\162\157\146\145\163\151\157\156\141\154\040\103 -\111\106\040\101\066\062\066\063\064\060\066\070\060\202\002\042 -\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003 -\202\002\017\000\060\202\002\012\002\202\002\001\000\312\226\153 -\216\352\370\373\361\242\065\340\177\114\332\340\303\122\327\175 -\266\020\310\002\136\263\103\052\304\117\152\262\312\034\135\050 -\232\170\021\032\151\131\127\257\265\040\102\344\213\017\346\337 -\133\246\003\222\057\365\021\344\142\327\062\161\070\331\004\014 -\161\253\075\121\176\017\007\337\143\005\134\351\277\224\157\301 -\051\202\300\264\332\121\260\301\074\273\255\067\112\134\312\361 -\113\066\016\044\253\277\303\204\167\375\250\120\364\261\347\306 -\057\322\055\131\215\172\012\116\226\151\122\002\252\066\230\354 -\374\372\024\203\014\067\037\311\222\067\177\327\201\055\345\304 -\271\340\076\064\376\147\364\076\146\321\323\364\100\317\136\142 -\064\017\160\006\076\040\030\132\316\367\162\033\045\154\223\164 -\024\223\243\163\261\016\252\207\020\043\131\137\040\005\031\107 -\355\150\216\222\022\312\135\374\326\053\262\222\074\040\317\341 -\137\257\040\276\240\166\177\166\345\354\032\206\141\063\076\347 -\173\264\077\240\017\216\242\271\152\157\271\207\046\157\101\154 -\210\246\120\375\152\143\013\365\223\026\033\031\217\262\355\233 -\233\311\220\365\001\014\337\031\075\017\076\070\043\311\057\217 -\014\321\002\376\033\125\326\116\320\215\074\257\117\244\363\376 -\257\052\323\005\235\171\010\241\313\127\061\264\234\310\220\262 -\147\364\030\026\223\072\374\107\330\321\170\226\061\037\272\053 -\014\137\135\231\255\143\211\132\044\040\166\330\337\375\253\116 -\246\042\252\235\136\346\047\212\175\150\051\243\347\212\270\332 -\021\273\027\055\231\235\023\044\106\367\305\342\330\237\216\177 -\307\217\164\155\132\262\350\162\365\254\356\044\020\255\057\024 -\332\377\055\232\106\161\107\276\102\337\273\001\333\364\177\323 -\050\217\061\131\133\323\311\002\246\264\122\312\156\227\373\103 -\305\010\046\157\212\364\273\375\237\050\252\015\325\105\363\023 -\072\035\330\300\170\217\101\147\074\036\224\144\256\173\013\305 -\350\331\001\210\071\032\227\206\144\101\325\073\207\014\156\372 -\017\306\275\110\024\277\071\115\324\236\101\266\217\226\035\143 -\226\223\331\225\006\170\061\150\236\067\006\073\200\211\105\141 -\071\043\307\033\104\243\025\345\034\370\222\060\273\002\003\001 -\000\001\243\201\357\060\201\354\060\022\006\003\125\035\023\001 -\001\377\004\010\060\006\001\001\377\002\001\001\060\016\006\003 -\125\035\017\001\001\377\004\004\003\002\001\006\060\035\006\003 -\125\035\016\004\026\004\024\145\315\353\253\065\036\000\076\176 -\325\164\300\034\264\163\107\016\032\144\057\060\201\246\006\003 -\125\035\040\004\201\236\060\201\233\060\201\230\006\004\125\035 -\040\000\060\201\217\060\057\006\010\053\006\001\005\005\007\002 -\001\026\043\150\164\164\160\072\057\057\167\167\167\056\146\151 -\162\155\141\160\162\157\146\145\163\151\157\156\141\154\056\143 -\157\155\057\143\160\163\060\134\006\010\053\006\001\005\005\007 -\002\002\060\120\036\116\000\120\000\141\000\163\000\145\000\157 -\000\040\000\144\000\145\000\040\000\154\000\141\000\040\000\102 -\000\157\000\156\000\141\000\156\000\157\000\166\000\141\000\040 -\000\064\000\067\000\040\000\102\000\141\000\162\000\143\000\145 -\000\154\000\157\000\156\000\141\000\040\000\060\000\070\000\060 -\000\061\000\067\060\015\006\011\052\206\110\206\367\015\001\001 -\005\005\000\003\202\002\001\000\027\175\240\371\264\335\305\305 -\353\255\113\044\265\241\002\253\335\245\210\112\262\017\125\113 -\053\127\214\073\345\061\335\376\304\062\361\347\133\144\226\066 -\062\030\354\245\062\167\327\343\104\266\300\021\052\200\271\075 -\152\156\174\233\323\255\374\303\326\243\346\144\051\174\321\341 -\070\036\202\053\377\047\145\257\373\026\025\304\056\161\204\345 -\265\377\372\244\107\275\144\062\273\366\045\204\242\047\102\365 -\040\260\302\023\020\021\315\020\025\272\102\220\052\322\104\341 -\226\046\353\061\110\022\375\052\332\311\006\317\164\036\251\113 -\325\207\050\371\171\064\222\076\056\104\350\366\217\117\217\065 -\077\045\263\071\334\143\052\220\153\040\137\304\122\022\116\227 -\054\052\254\235\227\336\110\362\243\146\333\302\322\203\225\246 -\146\247\236\045\017\351\013\063\221\145\012\132\303\331\124\022 -\335\257\303\116\016\037\046\136\015\334\263\215\354\325\201\160 -\336\322\117\044\005\363\154\116\365\114\111\146\215\321\377\322 -\013\045\101\110\376\121\204\306\102\257\200\004\317\320\176\144 -\111\344\362\337\242\354\261\114\300\052\035\347\264\261\145\242 -\304\274\361\230\364\252\160\007\143\264\270\332\073\114\372\100 -\042\060\133\021\246\360\005\016\306\002\003\110\253\206\233\205 -\335\333\335\352\242\166\200\163\175\365\234\004\304\105\215\347 -\271\034\213\236\352\327\165\321\162\261\336\165\104\347\102\175 -\342\127\153\175\334\231\274\075\203\050\352\200\223\215\305\114 -\145\301\160\201\270\070\374\103\061\262\366\003\064\107\262\254 -\373\042\006\313\036\335\027\107\034\137\146\271\323\032\242\332 -\021\261\244\274\043\311\344\276\207\377\271\224\266\370\135\040 -\112\324\137\347\275\150\173\145\362\025\036\322\072\251\055\351 -\330\153\044\254\227\130\104\107\255\131\030\361\041\145\160\336 -\316\064\140\250\100\361\363\074\244\303\050\043\214\376\047\063 -\103\100\240\027\074\353\352\073\260\162\246\243\271\112\113\136 -\026\110\364\262\274\310\214\222\305\235\237\254\162\066\274\064 -\200\064\153\251\213\222\300\270\027\355\354\166\123\365\044\001 -\214\263\042\350\113\174\125\306\235\372\243\024\273\145\205\156 -\156\117\022\176\012\074\235\225 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Autoridad de Certificacion Firmaprofesional CIF A62634068" -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068,C=ES -# Serial Number:53:ec:3b:ee:fb:b2:48:5f -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068,C=ES -# Not Valid Before: Wed May 20 08:38:15 2009 -# Not Valid After : Tue Dec 31 08:38:15 2030 -# Fingerprint (SHA-256): 04:04:80:28:BF:1F:28:64:D4:8F:9A:D4:D8:32:94:36:6A:82:88:56:55:3F:3B:14:30:3F:90:14:7F:5D:40:EF -# Fingerprint (SHA1): AE:C5:FB:3F:C8:E1:BF:C4:E5:4F:03:07:5A:9A:E8:00:B7:F7:B6:FA -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Autoridad de Certificacion Firmaprofesional CIF A62634068" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\256\305\373\077\310\341\277\304\345\117\003\007\132\232\350\000 -\267\367\266\372 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\163\072\164\172\354\273\243\226\246\302\344\342\310\233\300\303 -END -CKA_ISSUER MULTILINE_OCTAL -\060\121\061\013\060\011\006\003\125\004\006\023\002\105\123\061 -\102\060\100\006\003\125\004\003\014\071\101\165\164\157\162\151 -\144\141\144\040\144\145\040\103\145\162\164\151\146\151\143\141 -\143\151\157\156\040\106\151\162\155\141\160\162\157\146\145\163 -\151\157\156\141\154\040\103\111\106\040\101\066\062\066\063\064 -\060\066\070 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\123\354\073\356\373\262\110\137 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - # # Certificate "Izenpe.com" # @@ -5042,430 +4526,6 @@ CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "Chambers of Commerce Root - 2008" -# -# Issuer: CN=Chambers of Commerce Root - 2008,O=AC Camerfirma S.A.,serialNumber=A82743287,L=Madrid (see current address at www.camerfirma.com/address),C=EU -# Serial Number:00:a3:da:42:7e:a4:b1:ae:da -# Subject: CN=Chambers of Commerce Root - 2008,O=AC Camerfirma S.A.,serialNumber=A82743287,L=Madrid (see current address at www.camerfirma.com/address),C=EU -# Not Valid Before: Fri Aug 01 12:29:50 2008 -# Not Valid After : Sat Jul 31 12:29:50 2038 -# Fingerprint (SHA-256): 06:3E:4A:FA:C4:91:DF:D3:32:F3:08:9B:85:42:E9:46:17:D8:93:D7:FE:94:4E:10:A7:93:7E:E2:9D:96:93:C0 -# Fingerprint (SHA1): 78:6A:74:AC:76:AB:14:7F:9C:6A:30:50:BA:9E:A8:7E:FE:9A:CE:3C -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Chambers of Commerce Root - 2008" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\256\061\013\060\011\006\003\125\004\006\023\002\105\125 -\061\103\060\101\006\003\125\004\007\023\072\115\141\144\162\151 -\144\040\050\163\145\145\040\143\165\162\162\145\156\164\040\141 -\144\144\162\145\163\163\040\141\164\040\167\167\167\056\143\141 -\155\145\162\146\151\162\155\141\056\143\157\155\057\141\144\144 -\162\145\163\163\051\061\022\060\020\006\003\125\004\005\023\011 -\101\070\062\067\064\063\062\070\067\061\033\060\031\006\003\125 -\004\012\023\022\101\103\040\103\141\155\145\162\146\151\162\155 -\141\040\123\056\101\056\061\051\060\047\006\003\125\004\003\023 -\040\103\150\141\155\142\145\162\163\040\157\146\040\103\157\155 -\155\145\162\143\145\040\122\157\157\164\040\055\040\062\060\060 -\070 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\256\061\013\060\011\006\003\125\004\006\023\002\105\125 -\061\103\060\101\006\003\125\004\007\023\072\115\141\144\162\151 -\144\040\050\163\145\145\040\143\165\162\162\145\156\164\040\141 -\144\144\162\145\163\163\040\141\164\040\167\167\167\056\143\141 -\155\145\162\146\151\162\155\141\056\143\157\155\057\141\144\144 -\162\145\163\163\051\061\022\060\020\006\003\125\004\005\023\011 -\101\070\062\067\064\063\062\070\067\061\033\060\031\006\003\125 -\004\012\023\022\101\103\040\103\141\155\145\162\146\151\162\155 -\141\040\123\056\101\056\061\051\060\047\006\003\125\004\003\023 -\040\103\150\141\155\142\145\162\163\040\157\146\040\103\157\155 -\155\145\162\143\145\040\122\157\157\164\040\055\040\062\060\060 -\070 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\243\332\102\176\244\261\256\332 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\007\117\060\202\005\067\240\003\002\001\002\002\011\000 -\243\332\102\176\244\261\256\332\060\015\006\011\052\206\110\206 -\367\015\001\001\005\005\000\060\201\256\061\013\060\011\006\003 -\125\004\006\023\002\105\125\061\103\060\101\006\003\125\004\007 -\023\072\115\141\144\162\151\144\040\050\163\145\145\040\143\165 -\162\162\145\156\164\040\141\144\144\162\145\163\163\040\141\164 -\040\167\167\167\056\143\141\155\145\162\146\151\162\155\141\056 -\143\157\155\057\141\144\144\162\145\163\163\051\061\022\060\020 -\006\003\125\004\005\023\011\101\070\062\067\064\063\062\070\067 -\061\033\060\031\006\003\125\004\012\023\022\101\103\040\103\141 -\155\145\162\146\151\162\155\141\040\123\056\101\056\061\051\060 -\047\006\003\125\004\003\023\040\103\150\141\155\142\145\162\163 -\040\157\146\040\103\157\155\155\145\162\143\145\040\122\157\157 -\164\040\055\040\062\060\060\070\060\036\027\015\060\070\060\070 -\060\061\061\062\062\071\065\060\132\027\015\063\070\060\067\063 -\061\061\062\062\071\065\060\132\060\201\256\061\013\060\011\006 -\003\125\004\006\023\002\105\125\061\103\060\101\006\003\125\004 -\007\023\072\115\141\144\162\151\144\040\050\163\145\145\040\143 -\165\162\162\145\156\164\040\141\144\144\162\145\163\163\040\141 -\164\040\167\167\167\056\143\141\155\145\162\146\151\162\155\141 -\056\143\157\155\057\141\144\144\162\145\163\163\051\061\022\060 -\020\006\003\125\004\005\023\011\101\070\062\067\064\063\062\070 -\067\061\033\060\031\006\003\125\004\012\023\022\101\103\040\103 -\141\155\145\162\146\151\162\155\141\040\123\056\101\056\061\051 -\060\047\006\003\125\004\003\023\040\103\150\141\155\142\145\162 -\163\040\157\146\040\103\157\155\155\145\162\143\145\040\122\157 -\157\164\040\055\040\062\060\060\070\060\202\002\042\060\015\006 -\011\052\206\110\206\367\015\001\001\001\005\000\003\202\002\017 -\000\060\202\002\012\002\202\002\001\000\257\000\313\160\067\053 -\200\132\112\072\154\170\224\175\243\177\032\037\366\065\325\275 -\333\313\015\104\162\076\046\262\220\122\272\143\073\050\130\157 -\245\263\155\224\246\363\335\144\014\125\366\366\347\362\042\042 -\200\136\341\142\306\266\051\341\201\154\362\277\345\175\062\152 -\124\240\062\031\131\376\037\213\327\075\140\206\205\044\157\343 -\021\263\167\076\040\226\065\041\153\263\010\331\160\056\144\367 -\204\222\123\326\016\260\220\212\212\343\207\215\006\323\275\220 -\016\342\231\241\033\206\016\332\232\012\273\013\141\120\006\122 -\361\236\177\166\354\313\017\320\036\015\317\231\060\075\034\304 -\105\020\130\254\326\323\350\327\345\352\305\001\007\167\326\121 -\346\003\177\212\110\245\115\150\165\271\351\274\236\116\031\161 -\365\062\113\234\155\140\031\013\373\314\235\165\334\277\046\315 -\217\223\170\071\171\163\136\045\016\312\134\353\167\022\007\313 -\144\101\107\162\223\253\120\303\353\011\166\144\064\322\071\267 -\166\021\011\015\166\105\304\251\256\075\152\257\265\175\145\057 -\224\130\020\354\134\174\257\176\342\266\030\331\320\233\116\132 -\111\337\251\146\013\314\074\306\170\174\247\234\035\343\316\216 -\123\276\005\336\140\017\153\345\032\333\077\343\341\041\311\051 -\301\361\353\007\234\122\033\001\104\121\074\173\045\327\304\345 -\122\124\135\045\007\312\026\040\270\255\344\101\356\172\010\376 -\231\157\203\246\221\002\260\154\066\125\152\347\175\365\226\346 -\312\201\326\227\361\224\203\351\355\260\261\153\022\151\036\254 -\373\135\251\305\230\351\264\133\130\172\276\075\242\104\072\143 -\131\324\013\045\336\033\117\275\345\001\236\315\322\051\325\237 -\027\031\012\157\277\014\220\323\011\137\331\343\212\065\314\171 -\132\115\031\067\222\267\304\301\255\257\364\171\044\232\262\001 -\013\261\257\134\226\363\200\062\373\134\075\230\361\240\077\112 -\336\276\257\224\056\331\125\232\027\156\140\235\143\154\270\143 -\311\256\201\134\030\065\340\220\273\276\074\117\067\042\271\176 -\353\317\236\167\041\246\075\070\201\373\110\332\061\075\053\343 -\211\365\320\265\275\176\340\120\304\022\211\263\043\232\020\061 -\205\333\256\157\357\070\063\030\166\021\002\003\001\000\001\243 -\202\001\154\060\202\001\150\060\022\006\003\125\035\023\001\001 -\377\004\010\060\006\001\001\377\002\001\014\060\035\006\003\125 -\035\016\004\026\004\024\371\044\254\017\262\265\370\171\300\372 -\140\210\033\304\331\115\002\236\027\031\060\201\343\006\003\125 -\035\043\004\201\333\060\201\330\200\024\371\044\254\017\262\265 -\370\171\300\372\140\210\033\304\331\115\002\236\027\031\241\201 -\264\244\201\261\060\201\256\061\013\060\011\006\003\125\004\006 -\023\002\105\125\061\103\060\101\006\003\125\004\007\023\072\115 -\141\144\162\151\144\040\050\163\145\145\040\143\165\162\162\145 -\156\164\040\141\144\144\162\145\163\163\040\141\164\040\167\167 -\167\056\143\141\155\145\162\146\151\162\155\141\056\143\157\155 -\057\141\144\144\162\145\163\163\051\061\022\060\020\006\003\125 -\004\005\023\011\101\070\062\067\064\063\062\070\067\061\033\060 -\031\006\003\125\004\012\023\022\101\103\040\103\141\155\145\162 -\146\151\162\155\141\040\123\056\101\056\061\051\060\047\006\003 -\125\004\003\023\040\103\150\141\155\142\145\162\163\040\157\146 -\040\103\157\155\155\145\162\143\145\040\122\157\157\164\040\055 -\040\062\060\060\070\202\011\000\243\332\102\176\244\261\256\332 -\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001\006 -\060\075\006\003\125\035\040\004\066\060\064\060\062\006\004\125 -\035\040\000\060\052\060\050\006\010\053\006\001\005\005\007\002 -\001\026\034\150\164\164\160\072\057\057\160\157\154\151\143\171 -\056\143\141\155\145\162\146\151\162\155\141\056\143\157\155\060 -\015\006\011\052\206\110\206\367\015\001\001\005\005\000\003\202 -\002\001\000\220\022\257\042\065\302\243\071\360\056\336\351\265 -\351\170\174\110\276\077\175\105\222\136\351\332\261\031\374\026 -\074\237\264\133\146\236\152\347\303\271\135\210\350\017\255\317 -\043\017\336\045\072\136\314\117\245\301\265\055\254\044\322\130 -\007\336\242\317\151\204\140\063\350\020\015\023\251\043\320\205 -\345\216\173\246\236\075\162\023\162\063\365\252\175\306\143\037 -\010\364\376\001\177\044\317\053\054\124\011\336\342\053\155\222 -\306\071\117\026\352\074\176\172\106\324\105\152\106\250\353\165 -\202\126\247\253\240\174\150\023\063\366\235\060\360\157\047\071 -\044\043\052\220\375\220\051\065\362\223\337\064\245\306\367\370 -\357\214\017\142\112\174\256\323\365\124\370\215\266\232\126\207 -\026\202\072\063\253\132\042\010\367\202\272\352\056\340\107\232 -\264\265\105\243\005\073\331\334\056\105\100\073\352\334\177\350 -\073\353\321\354\046\330\065\244\060\305\072\254\127\236\263\166 -\245\040\173\371\036\112\005\142\001\246\050\165\140\227\222\015 -\156\076\115\067\103\015\222\025\234\030\042\315\121\231\240\051 -\032\074\137\212\062\063\133\060\307\211\057\107\230\017\243\003 -\306\366\361\254\337\062\360\331\201\032\344\234\275\366\200\024 -\360\321\054\271\205\365\330\243\261\310\245\041\345\034\023\227 -\356\016\275\337\051\251\357\064\123\133\323\344\152\023\204\006 -\266\062\002\304\122\256\042\322\334\262\041\102\032\332\100\360 -\051\311\354\012\014\134\342\320\272\314\110\323\067\012\314\022 -\012\212\171\260\075\003\177\151\113\364\064\040\175\263\064\352 -\216\113\144\365\076\375\263\043\147\025\015\004\270\360\055\301 -\011\121\074\262\154\025\360\245\043\327\203\164\344\345\056\311 -\376\230\047\102\306\253\306\236\260\320\133\070\245\233\120\336 -\176\030\230\265\105\073\366\171\264\350\367\032\173\006\203\373 -\320\213\332\273\307\275\030\253\010\157\074\200\153\100\077\031 -\031\272\145\212\346\276\325\134\323\066\327\357\100\122\044\140 -\070\147\004\061\354\217\363\202\306\336\271\125\363\073\061\221 -\132\334\265\010\025\255\166\045\012\015\173\056\207\342\014\246 -\006\274\046\020\155\067\235\354\335\170\214\174\200\305\360\331 -\167\110\320 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Chambers of Commerce Root - 2008" -# Issuer: CN=Chambers of Commerce Root - 2008,O=AC Camerfirma S.A.,serialNumber=A82743287,L=Madrid (see current address at www.camerfirma.com/address),C=EU -# Serial Number:00:a3:da:42:7e:a4:b1:ae:da -# Subject: CN=Chambers of Commerce Root - 2008,O=AC Camerfirma S.A.,serialNumber=A82743287,L=Madrid (see current address at www.camerfirma.com/address),C=EU -# Not Valid Before: Fri Aug 01 12:29:50 2008 -# Not Valid After : Sat Jul 31 12:29:50 2038 -# Fingerprint (SHA-256): 06:3E:4A:FA:C4:91:DF:D3:32:F3:08:9B:85:42:E9:46:17:D8:93:D7:FE:94:4E:10:A7:93:7E:E2:9D:96:93:C0 -# Fingerprint (SHA1): 78:6A:74:AC:76:AB:14:7F:9C:6A:30:50:BA:9E:A8:7E:FE:9A:CE:3C -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Chambers of Commerce Root - 2008" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\170\152\164\254\166\253\024\177\234\152\060\120\272\236\250\176 -\376\232\316\074 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\136\200\236\204\132\016\145\013\027\002\363\125\030\052\076\327 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\256\061\013\060\011\006\003\125\004\006\023\002\105\125 -\061\103\060\101\006\003\125\004\007\023\072\115\141\144\162\151 -\144\040\050\163\145\145\040\143\165\162\162\145\156\164\040\141 -\144\144\162\145\163\163\040\141\164\040\167\167\167\056\143\141 -\155\145\162\146\151\162\155\141\056\143\157\155\057\141\144\144 -\162\145\163\163\051\061\022\060\020\006\003\125\004\005\023\011 -\101\070\062\067\064\063\062\070\067\061\033\060\031\006\003\125 -\004\012\023\022\101\103\040\103\141\155\145\162\146\151\162\155 -\141\040\123\056\101\056\061\051\060\047\006\003\125\004\003\023 -\040\103\150\141\155\142\145\162\163\040\157\146\040\103\157\155 -\155\145\162\143\145\040\122\157\157\164\040\055\040\062\060\060 -\070 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\243\332\102\176\244\261\256\332 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Global Chambersign Root - 2008" -# -# Issuer: CN=Global Chambersign Root - 2008,O=AC Camerfirma S.A.,serialNumber=A82743287,L=Madrid (see current address at www.camerfirma.com/address),C=EU -# Serial Number:00:c9:cd:d3:e9:d5:7d:23:ce -# Subject: CN=Global Chambersign Root - 2008,O=AC Camerfirma S.A.,serialNumber=A82743287,L=Madrid (see current address at www.camerfirma.com/address),C=EU -# Not Valid Before: Fri Aug 01 12:31:40 2008 -# Not Valid After : Sat Jul 31 12:31:40 2038 -# Fingerprint (SHA-256): 13:63:35:43:93:34:A7:69:80:16:A0:D3:24:DE:72:28:4E:07:9D:7B:52:20:BB:8F:BD:74:78:16:EE:BE:BA:CA -# Fingerprint (SHA1): 4A:BD:EE:EC:95:0D:35:9C:89:AE:C7:52:A1:2C:5B:29:F6:D6:AA:0C -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Global Chambersign Root - 2008" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\254\061\013\060\011\006\003\125\004\006\023\002\105\125 -\061\103\060\101\006\003\125\004\007\023\072\115\141\144\162\151 -\144\040\050\163\145\145\040\143\165\162\162\145\156\164\040\141 -\144\144\162\145\163\163\040\141\164\040\167\167\167\056\143\141 -\155\145\162\146\151\162\155\141\056\143\157\155\057\141\144\144 -\162\145\163\163\051\061\022\060\020\006\003\125\004\005\023\011 -\101\070\062\067\064\063\062\070\067\061\033\060\031\006\003\125 -\004\012\023\022\101\103\040\103\141\155\145\162\146\151\162\155 -\141\040\123\056\101\056\061\047\060\045\006\003\125\004\003\023 -\036\107\154\157\142\141\154\040\103\150\141\155\142\145\162\163 -\151\147\156\040\122\157\157\164\040\055\040\062\060\060\070 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\254\061\013\060\011\006\003\125\004\006\023\002\105\125 -\061\103\060\101\006\003\125\004\007\023\072\115\141\144\162\151 -\144\040\050\163\145\145\040\143\165\162\162\145\156\164\040\141 -\144\144\162\145\163\163\040\141\164\040\167\167\167\056\143\141 -\155\145\162\146\151\162\155\141\056\143\157\155\057\141\144\144 -\162\145\163\163\051\061\022\060\020\006\003\125\004\005\023\011 -\101\070\062\067\064\063\062\070\067\061\033\060\031\006\003\125 -\004\012\023\022\101\103\040\103\141\155\145\162\146\151\162\155 -\141\040\123\056\101\056\061\047\060\045\006\003\125\004\003\023 -\036\107\154\157\142\141\154\040\103\150\141\155\142\145\162\163 -\151\147\156\040\122\157\157\164\040\055\040\062\060\060\070 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\311\315\323\351\325\175\043\316 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\007\111\060\202\005\061\240\003\002\001\002\002\011\000 -\311\315\323\351\325\175\043\316\060\015\006\011\052\206\110\206 -\367\015\001\001\005\005\000\060\201\254\061\013\060\011\006\003 -\125\004\006\023\002\105\125\061\103\060\101\006\003\125\004\007 -\023\072\115\141\144\162\151\144\040\050\163\145\145\040\143\165 -\162\162\145\156\164\040\141\144\144\162\145\163\163\040\141\164 -\040\167\167\167\056\143\141\155\145\162\146\151\162\155\141\056 -\143\157\155\057\141\144\144\162\145\163\163\051\061\022\060\020 -\006\003\125\004\005\023\011\101\070\062\067\064\063\062\070\067 -\061\033\060\031\006\003\125\004\012\023\022\101\103\040\103\141 -\155\145\162\146\151\162\155\141\040\123\056\101\056\061\047\060 -\045\006\003\125\004\003\023\036\107\154\157\142\141\154\040\103 -\150\141\155\142\145\162\163\151\147\156\040\122\157\157\164\040 -\055\040\062\060\060\070\060\036\027\015\060\070\060\070\060\061 -\061\062\063\061\064\060\132\027\015\063\070\060\067\063\061\061 -\062\063\061\064\060\132\060\201\254\061\013\060\011\006\003\125 -\004\006\023\002\105\125\061\103\060\101\006\003\125\004\007\023 -\072\115\141\144\162\151\144\040\050\163\145\145\040\143\165\162 -\162\145\156\164\040\141\144\144\162\145\163\163\040\141\164\040 -\167\167\167\056\143\141\155\145\162\146\151\162\155\141\056\143 -\157\155\057\141\144\144\162\145\163\163\051\061\022\060\020\006 -\003\125\004\005\023\011\101\070\062\067\064\063\062\070\067\061 -\033\060\031\006\003\125\004\012\023\022\101\103\040\103\141\155 -\145\162\146\151\162\155\141\040\123\056\101\056\061\047\060\045 -\006\003\125\004\003\023\036\107\154\157\142\141\154\040\103\150 -\141\155\142\145\162\163\151\147\156\040\122\157\157\164\040\055 -\040\062\060\060\070\060\202\002\042\060\015\006\011\052\206\110 -\206\367\015\001\001\001\005\000\003\202\002\017\000\060\202\002 -\012\002\202\002\001\000\300\337\126\323\344\072\233\166\105\264 -\023\333\377\301\266\031\213\067\101\030\225\122\107\353\027\235 -\051\210\216\065\154\006\062\056\107\142\363\111\004\277\175\104 -\066\261\161\314\275\132\011\163\325\331\205\104\377\221\127\045 -\337\136\066\216\160\321\134\161\103\035\331\332\357\134\322\373 -\033\275\072\265\313\255\243\314\104\247\015\256\041\025\077\271 -\172\133\222\165\330\244\022\070\211\031\212\267\200\322\342\062 -\157\126\234\221\326\210\020\013\263\164\144\222\164\140\363\366 -\317\030\117\140\262\043\320\307\073\316\141\113\231\217\302\014 -\320\100\262\230\334\015\250\116\243\271\012\256\140\240\255\105 -\122\143\272\146\275\150\340\371\276\032\250\201\273\036\101\170 -\165\323\301\376\000\125\260\207\124\350\047\220\065\035\114\063 -\255\227\374\227\056\230\204\277\054\311\243\277\321\230\021\024 -\355\143\370\312\230\210\130\027\231\355\105\003\227\176\074\206 -\036\210\214\276\362\221\204\217\145\064\330\000\114\175\267\061 -\027\132\051\172\012\030\044\060\243\067\265\172\251\001\175\046 -\326\371\016\216\131\361\375\033\063\265\051\073\027\073\101\266 -\041\335\324\300\075\245\237\237\037\103\120\311\273\274\154\172 -\227\230\356\315\214\037\373\234\121\256\213\160\275\047\237\161 -\300\153\254\175\220\146\350\327\135\072\015\260\325\302\215\325 -\310\235\235\301\155\320\320\277\121\344\343\370\303\070\066\256 -\326\247\165\346\257\204\103\135\223\222\014\152\007\336\073\035 -\230\042\326\254\301\065\333\243\240\045\377\162\265\166\035\336 -\155\351\054\146\054\122\204\320\105\222\316\034\345\345\063\035 -\334\007\123\124\243\252\202\073\232\067\057\334\335\240\144\351 -\346\335\275\256\374\144\205\035\074\247\311\006\336\204\377\153 -\350\153\032\074\305\242\263\102\373\213\011\076\137\010\122\307 -\142\304\324\005\161\277\304\144\344\370\241\203\350\076\022\233 -\250\036\324\066\115\057\161\366\215\050\366\203\251\023\322\141 -\301\221\273\110\300\064\217\101\214\113\114\333\151\022\377\120 -\224\234\040\203\131\163\355\174\241\362\361\375\335\367\111\323 -\103\130\240\126\143\312\075\075\345\065\126\131\351\016\312\040 -\314\053\113\223\051\017\002\003\001\000\001\243\202\001\152\060 -\202\001\146\060\022\006\003\125\035\023\001\001\377\004\010\060 -\006\001\001\377\002\001\014\060\035\006\003\125\035\016\004\026 -\004\024\271\011\312\234\036\333\323\154\072\153\256\355\124\361 -\133\223\006\065\056\136\060\201\341\006\003\125\035\043\004\201 -\331\060\201\326\200\024\271\011\312\234\036\333\323\154\072\153 -\256\355\124\361\133\223\006\065\056\136\241\201\262\244\201\257 -\060\201\254\061\013\060\011\006\003\125\004\006\023\002\105\125 -\061\103\060\101\006\003\125\004\007\023\072\115\141\144\162\151 -\144\040\050\163\145\145\040\143\165\162\162\145\156\164\040\141 -\144\144\162\145\163\163\040\141\164\040\167\167\167\056\143\141 -\155\145\162\146\151\162\155\141\056\143\157\155\057\141\144\144 -\162\145\163\163\051\061\022\060\020\006\003\125\004\005\023\011 -\101\070\062\067\064\063\062\070\067\061\033\060\031\006\003\125 -\004\012\023\022\101\103\040\103\141\155\145\162\146\151\162\155 -\141\040\123\056\101\056\061\047\060\045\006\003\125\004\003\023 -\036\107\154\157\142\141\154\040\103\150\141\155\142\145\162\163 -\151\147\156\040\122\157\157\164\040\055\040\062\060\060\070\202 -\011\000\311\315\323\351\325\175\043\316\060\016\006\003\125\035 -\017\001\001\377\004\004\003\002\001\006\060\075\006\003\125\035 -\040\004\066\060\064\060\062\006\004\125\035\040\000\060\052\060 -\050\006\010\053\006\001\005\005\007\002\001\026\034\150\164\164 -\160\072\057\057\160\157\154\151\143\171\056\143\141\155\145\162 -\146\151\162\155\141\056\143\157\155\060\015\006\011\052\206\110 -\206\367\015\001\001\005\005\000\003\202\002\001\000\200\210\177 -\160\336\222\050\331\005\224\106\377\220\127\251\361\057\337\032 -\015\153\372\174\016\034\111\044\171\047\330\106\252\157\051\131 -\122\210\160\022\352\335\075\365\233\123\124\157\341\140\242\250 -\011\271\354\353\131\174\306\065\361\334\030\351\361\147\345\257 -\272\105\340\011\336\312\104\017\302\027\016\167\221\105\172\063 -\137\137\226\054\150\213\301\107\217\230\233\075\300\354\313\365 -\325\202\222\204\065\321\276\066\070\126\162\061\133\107\055\252 -\027\244\143\121\353\012\001\255\177\354\165\236\313\241\037\361 -\177\022\261\271\344\144\177\147\326\043\052\364\270\071\135\230 -\350\041\247\341\275\075\102\032\164\232\160\257\150\154\120\135 -\111\317\377\373\016\135\346\054\107\327\201\072\131\000\265\163 -\153\143\040\366\061\105\010\071\016\364\160\176\100\160\132\077 -\320\153\102\251\164\075\050\057\002\155\165\162\225\011\215\110 -\143\306\306\043\127\222\223\136\065\301\215\371\012\367\054\235 -\142\034\366\255\174\335\246\061\036\266\261\307\176\205\046\372 -\244\152\265\332\143\060\321\357\223\067\262\146\057\175\005\367 -\347\267\113\230\224\065\300\331\072\051\301\235\262\120\063\035 -\112\251\132\246\311\003\357\355\364\347\250\156\212\264\127\204 -\353\244\077\320\356\252\252\207\133\143\350\223\342\153\250\324 -\270\162\170\153\033\355\071\344\135\313\233\252\207\325\117\116 -\000\376\331\152\237\074\061\017\050\002\001\175\230\350\247\260 -\242\144\236\171\370\110\362\025\251\314\346\310\104\353\077\170 -\231\362\173\161\076\074\361\230\247\305\030\022\077\346\273\050 -\063\102\351\105\012\174\155\362\206\171\057\305\202\031\175\011 -\211\174\262\124\166\210\256\336\301\363\314\341\156\333\061\326 -\223\256\231\240\357\045\152\163\230\211\133\072\056\023\210\036 -\277\300\222\224\064\033\343\047\267\213\036\157\102\377\347\351 -\067\233\120\035\055\242\371\002\356\313\130\130\072\161\274\150 -\343\252\301\257\034\050\037\242\334\043\145\077\201\352\256\231 -\323\330\060\317\023\015\117\025\311\204\274\247\110\055\370\060 -\043\167\330\106\113\171\155\366\214\355\072\177\140\021\170\364 -\351\233\256\325\124\300\164\200\321\013\102\237\301 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Global Chambersign Root - 2008" -# Issuer: CN=Global Chambersign Root - 2008,O=AC Camerfirma S.A.,serialNumber=A82743287,L=Madrid (see current address at www.camerfirma.com/address),C=EU -# Serial Number:00:c9:cd:d3:e9:d5:7d:23:ce -# Subject: CN=Global Chambersign Root - 2008,O=AC Camerfirma S.A.,serialNumber=A82743287,L=Madrid (see current address at www.camerfirma.com/address),C=EU -# Not Valid Before: Fri Aug 01 12:31:40 2008 -# Not Valid After : Sat Jul 31 12:31:40 2038 -# Fingerprint (SHA-256): 13:63:35:43:93:34:A7:69:80:16:A0:D3:24:DE:72:28:4E:07:9D:7B:52:20:BB:8F:BD:74:78:16:EE:BE:BA:CA -# Fingerprint (SHA1): 4A:BD:EE:EC:95:0D:35:9C:89:AE:C7:52:A1:2C:5B:29:F6:D6:AA:0C -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Global Chambersign Root - 2008" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\112\275\356\354\225\015\065\234\211\256\307\122\241\054\133\051 -\366\326\252\014 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\236\200\377\170\001\014\056\301\066\275\376\226\220\156\010\363 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\254\061\013\060\011\006\003\125\004\006\023\002\105\125 -\061\103\060\101\006\003\125\004\007\023\072\115\141\144\162\151 -\144\040\050\163\145\145\040\143\165\162\162\145\156\164\040\141 -\144\144\162\145\163\163\040\141\164\040\167\167\167\056\143\141 -\155\145\162\146\151\162\155\141\056\143\157\155\057\141\144\144 -\162\145\163\163\051\061\022\060\020\006\003\125\004\005\023\011 -\101\070\062\067\064\063\062\070\067\061\033\060\031\006\003\125 -\004\012\023\022\101\103\040\103\141\155\145\162\146\151\162\155 -\141\040\123\056\101\056\061\047\060\045\006\003\125\004\003\023 -\036\107\154\157\142\141\154\040\103\150\141\155\142\145\162\163 -\151\147\156\040\122\157\157\164\040\055\040\062\060\060\070 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\311\315\323\351\325\175\043\316 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - # # Certificate "Go Daddy Root Certificate Authority - G2" # @@ -13316,324 +12376,6 @@ CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "Symantec Class 1 Public Primary Certification Authority - G6" -# -# Issuer: CN=Symantec Class 1 Public Primary Certification Authority - G6,OU=Symantec Trust Network,O=Symantec Corporation,C=US -# Serial Number:24:32:75:f2:1d:2f:d2:09:33:f7:b4:6a:ca:d0:f3:98 -# Subject: CN=Symantec Class 1 Public Primary Certification Authority - G6,OU=Symantec Trust Network,O=Symantec Corporation,C=US -# Not Valid Before: Tue Oct 18 00:00:00 2011 -# Not Valid After : Tue Dec 01 23:59:59 2037 -# Fingerprint (SHA-256): 9D:19:0B:2E:31:45:66:68:5B:E8:A8:89:E2:7A:A8:C7:D7:AE:1D:8A:AD:DB:A3:C1:EC:F9:D2:48:63:CD:34:B9 -# Fingerprint (SHA1): 51:7F:61:1E:29:91:6B:53:82:FB:72:E7:44:D9:8D:C3:CC:53:6D:64 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Symantec Class 1 Public Primary Certification Authority - G6" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\224\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\035\060\033\006\003\125\004\012\023\024\123\171\155\141\156 -\164\145\143\040\103\157\162\160\157\162\141\164\151\157\156\061 -\037\060\035\006\003\125\004\013\023\026\123\171\155\141\156\164 -\145\143\040\124\162\165\163\164\040\116\145\164\167\157\162\153 -\061\105\060\103\006\003\125\004\003\023\074\123\171\155\141\156 -\164\145\143\040\103\154\141\163\163\040\061\040\120\165\142\154 -\151\143\040\120\162\151\155\141\162\171\040\103\145\162\164\151 -\146\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151 -\164\171\040\055\040\107\066 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\224\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\035\060\033\006\003\125\004\012\023\024\123\171\155\141\156 -\164\145\143\040\103\157\162\160\157\162\141\164\151\157\156\061 -\037\060\035\006\003\125\004\013\023\026\123\171\155\141\156\164 -\145\143\040\124\162\165\163\164\040\116\145\164\167\157\162\153 -\061\105\060\103\006\003\125\004\003\023\074\123\171\155\141\156 -\164\145\143\040\103\154\141\163\163\040\061\040\120\165\142\154 -\151\143\040\120\162\151\155\141\162\171\040\103\145\162\164\151 -\146\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151 -\164\171\040\055\040\107\066 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\044\062\165\362\035\057\322\011\063\367\264\152\312\320 -\363\230 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\366\060\202\002\336\240\003\002\001\002\002\020\044 -\062\165\362\035\057\322\011\063\367\264\152\312\320\363\230\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\201 -\224\061\013\060\011\006\003\125\004\006\023\002\125\123\061\035 -\060\033\006\003\125\004\012\023\024\123\171\155\141\156\164\145 -\143\040\103\157\162\160\157\162\141\164\151\157\156\061\037\060 -\035\006\003\125\004\013\023\026\123\171\155\141\156\164\145\143 -\040\124\162\165\163\164\040\116\145\164\167\157\162\153\061\105 -\060\103\006\003\125\004\003\023\074\123\171\155\141\156\164\145 -\143\040\103\154\141\163\163\040\061\040\120\165\142\154\151\143 -\040\120\162\151\155\141\162\171\040\103\145\162\164\151\146\151 -\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164\171 -\040\055\040\107\066\060\036\027\015\061\061\061\060\061\070\060 -\060\060\060\060\060\132\027\015\063\067\061\062\060\061\062\063 -\065\071\065\071\132\060\201\224\061\013\060\011\006\003\125\004 -\006\023\002\125\123\061\035\060\033\006\003\125\004\012\023\024 -\123\171\155\141\156\164\145\143\040\103\157\162\160\157\162\141 -\164\151\157\156\061\037\060\035\006\003\125\004\013\023\026\123 -\171\155\141\156\164\145\143\040\124\162\165\163\164\040\116\145 -\164\167\157\162\153\061\105\060\103\006\003\125\004\003\023\074 -\123\171\155\141\156\164\145\143\040\103\154\141\163\163\040\061 -\040\120\165\142\154\151\143\040\120\162\151\155\141\162\171\040 -\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101\165 -\164\150\157\162\151\164\171\040\055\040\107\066\060\202\001\042 -\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003 -\202\001\017\000\060\202\001\012\002\202\001\001\000\307\071\327 -\111\144\251\231\202\042\114\352\105\331\007\026\343\173\364\203 -\350\231\163\372\153\261\066\340\232\167\240\100\302\201\215\001 -\307\314\214\275\217\175\367\171\343\172\114\003\115\331\373\375 -\207\070\050\054\335\232\213\124\010\333\147\373\033\214\376\050 -\222\057\276\267\262\110\247\201\241\330\136\210\303\314\071\100 -\101\132\321\334\345\332\020\237\057\332\001\115\375\056\106\174 -\371\056\047\012\151\067\356\221\243\033\152\314\104\277\033\307 -\303\324\021\262\120\140\227\011\275\056\042\365\101\204\146\237 -\315\100\246\251\000\200\301\037\225\222\237\336\363\110\357\333 -\035\167\141\374\177\337\356\226\244\162\320\266\076\377\170\047 -\257\313\222\025\151\010\333\143\020\342\346\227\254\156\334\254 -\366\242\316\036\107\231\271\211\267\022\346\241\324\315\131\021 -\147\303\157\205\330\102\116\050\276\131\125\131\004\225\253\217 -\067\200\277\015\360\374\037\072\144\061\130\201\170\327\342\065 -\366\040\077\051\270\217\026\156\076\110\334\265\114\007\341\362 -\032\352\176\012\171\326\250\275\353\135\206\053\115\002\003\001 -\000\001\243\102\060\100\060\016\006\003\125\035\017\001\001\377 -\004\004\003\002\001\006\060\017\006\003\125\035\023\001\001\377 -\004\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026 -\004\024\063\101\350\310\071\022\025\223\110\362\226\062\056\132 -\365\332\224\137\123\140\060\015\006\011\052\206\110\206\367\015 -\001\001\013\005\000\003\202\001\001\000\025\343\163\127\261\027 -\266\137\111\151\104\246\366\136\172\147\254\322\336\165\111\253 -\376\045\125\307\072\311\104\025\020\156\277\061\153\313\331\007 -\223\177\034\205\143\000\343\062\022\340\314\313\373\071\154\217 -\342\123\342\074\100\063\331\244\214\107\346\255\130\373\211\257 -\343\336\206\051\126\064\054\105\270\022\372\104\211\156\055\024 -\045\050\044\001\145\326\352\122\254\005\156\126\022\011\075\320 -\164\364\327\275\006\312\250\072\215\126\102\372\215\162\076\164 -\361\003\162\337\207\033\136\016\172\125\226\054\070\267\230\205 -\315\115\063\104\311\224\217\132\061\060\067\113\243\072\022\263 -\347\066\321\041\150\113\055\070\346\123\256\034\045\126\010\126 -\003\147\204\235\306\303\316\044\142\307\114\066\317\260\006\104 -\267\365\137\002\335\331\124\351\057\220\116\172\310\116\203\100 -\014\232\227\074\067\277\277\354\366\360\264\205\167\050\301\013 -\310\147\202\020\027\070\242\267\006\352\233\277\072\370\351\043 -\007\277\164\340\230\070\025\125\170\356\162\000\134\031\243\364 -\322\063\340\377\275\321\124\071\051\017 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -# For Email Distrust After: Wed Aug 31 00:00:00 2022 -CKA_NSS_EMAIL_DISTRUST_AFTER MULTILINE_OCTAL -\062\062\060\070\063\061\060\060\060\060\060\060\132 -END - -# Trust for "Symantec Class 1 Public Primary Certification Authority - G6" -# Issuer: CN=Symantec Class 1 Public Primary Certification Authority - G6,OU=Symantec Trust Network,O=Symantec Corporation,C=US -# Serial Number:24:32:75:f2:1d:2f:d2:09:33:f7:b4:6a:ca:d0:f3:98 -# Subject: CN=Symantec Class 1 Public Primary Certification Authority - G6,OU=Symantec Trust Network,O=Symantec Corporation,C=US -# Not Valid Before: Tue Oct 18 00:00:00 2011 -# Not Valid After : Tue Dec 01 23:59:59 2037 -# Fingerprint (SHA-256): 9D:19:0B:2E:31:45:66:68:5B:E8:A8:89:E2:7A:A8:C7:D7:AE:1D:8A:AD:DB:A3:C1:EC:F9:D2:48:63:CD:34:B9 -# Fingerprint (SHA1): 51:7F:61:1E:29:91:6B:53:82:FB:72:E7:44:D9:8D:C3:CC:53:6D:64 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Symantec Class 1 Public Primary Certification Authority - G6" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\121\177\141\036\051\221\153\123\202\373\162\347\104\331\215\303 -\314\123\155\144 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\057\250\264\332\366\144\113\036\202\371\106\075\124\032\174\260 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\224\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\035\060\033\006\003\125\004\012\023\024\123\171\155\141\156 -\164\145\143\040\103\157\162\160\157\162\141\164\151\157\156\061 -\037\060\035\006\003\125\004\013\023\026\123\171\155\141\156\164 -\145\143\040\124\162\165\163\164\040\116\145\164\167\157\162\153 -\061\105\060\103\006\003\125\004\003\023\074\123\171\155\141\156 -\164\145\143\040\103\154\141\163\163\040\061\040\120\165\142\154 -\151\143\040\120\162\151\155\141\162\171\040\103\145\162\164\151 -\146\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151 -\164\171\040\055\040\107\066 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\044\062\165\362\035\057\322\011\063\367\264\152\312\320 -\363\230 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "Symantec Class 2 Public Primary Certification Authority - G6" -# -# Issuer: CN=Symantec Class 2 Public Primary Certification Authority - G6,OU=Symantec Trust Network,O=Symantec Corporation,C=US -# Serial Number:64:82:9e:fc:37:1e:74:5d:fc:97:ff:97:c8:b1:ff:41 -# Subject: CN=Symantec Class 2 Public Primary Certification Authority - G6,OU=Symantec Trust Network,O=Symantec Corporation,C=US -# Not Valid Before: Tue Oct 18 00:00:00 2011 -# Not Valid After : Tue Dec 01 23:59:59 2037 -# Fingerprint (SHA-256): CB:62:7D:18:B5:8A:D5:6D:DE:33:1A:30:45:6B:C6:5C:60:1A:4E:9B:18:DE:DC:EA:08:E7:DA:AA:07:81:5F:F0 -# Fingerprint (SHA1): 40:B3:31:A0:E9:BF:E8:55:BC:39:93:CA:70:4F:4E:C2:51:D4:1D:8F -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Symantec Class 2 Public Primary Certification Authority - G6" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\224\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\035\060\033\006\003\125\004\012\023\024\123\171\155\141\156 -\164\145\143\040\103\157\162\160\157\162\141\164\151\157\156\061 -\037\060\035\006\003\125\004\013\023\026\123\171\155\141\156\164 -\145\143\040\124\162\165\163\164\040\116\145\164\167\157\162\153 -\061\105\060\103\006\003\125\004\003\023\074\123\171\155\141\156 -\164\145\143\040\103\154\141\163\163\040\062\040\120\165\142\154 -\151\143\040\120\162\151\155\141\162\171\040\103\145\162\164\151 -\146\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151 -\164\171\040\055\040\107\066 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\224\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\035\060\033\006\003\125\004\012\023\024\123\171\155\141\156 -\164\145\143\040\103\157\162\160\157\162\141\164\151\157\156\061 -\037\060\035\006\003\125\004\013\023\026\123\171\155\141\156\164 -\145\143\040\124\162\165\163\164\040\116\145\164\167\157\162\153 -\061\105\060\103\006\003\125\004\003\023\074\123\171\155\141\156 -\164\145\143\040\103\154\141\163\163\040\062\040\120\165\142\154 -\151\143\040\120\162\151\155\141\162\171\040\103\145\162\164\151 -\146\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151 -\164\171\040\055\040\107\066 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\144\202\236\374\067\036\164\135\374\227\377\227\310\261 -\377\101 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\366\060\202\002\336\240\003\002\001\002\002\020\144 -\202\236\374\067\036\164\135\374\227\377\227\310\261\377\101\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\201 -\224\061\013\060\011\006\003\125\004\006\023\002\125\123\061\035 -\060\033\006\003\125\004\012\023\024\123\171\155\141\156\164\145 -\143\040\103\157\162\160\157\162\141\164\151\157\156\061\037\060 -\035\006\003\125\004\013\023\026\123\171\155\141\156\164\145\143 -\040\124\162\165\163\164\040\116\145\164\167\157\162\153\061\105 -\060\103\006\003\125\004\003\023\074\123\171\155\141\156\164\145 -\143\040\103\154\141\163\163\040\062\040\120\165\142\154\151\143 -\040\120\162\151\155\141\162\171\040\103\145\162\164\151\146\151 -\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164\171 -\040\055\040\107\066\060\036\027\015\061\061\061\060\061\070\060 -\060\060\060\060\060\132\027\015\063\067\061\062\060\061\062\063 -\065\071\065\071\132\060\201\224\061\013\060\011\006\003\125\004 -\006\023\002\125\123\061\035\060\033\006\003\125\004\012\023\024 -\123\171\155\141\156\164\145\143\040\103\157\162\160\157\162\141 -\164\151\157\156\061\037\060\035\006\003\125\004\013\023\026\123 -\171\155\141\156\164\145\143\040\124\162\165\163\164\040\116\145 -\164\167\157\162\153\061\105\060\103\006\003\125\004\003\023\074 -\123\171\155\141\156\164\145\143\040\103\154\141\163\163\040\062 -\040\120\165\142\154\151\143\040\120\162\151\155\141\162\171\040 -\103\145\162\164\151\146\151\143\141\164\151\157\156\040\101\165 -\164\150\157\162\151\164\171\040\055\040\107\066\060\202\001\042 -\060\015\006\011\052\206\110\206\367\015\001\001\001\005\000\003 -\202\001\017\000\060\202\001\012\002\202\001\001\000\315\314\351 -\005\310\143\205\313\077\100\143\027\275\030\372\065\346\004\147 -\127\145\230\051\244\117\311\134\217\017\064\322\370\332\250\023 -\142\252\270\036\120\147\170\260\026\114\240\071\251\025\172\256 -\355\322\242\300\360\220\067\051\030\046\134\350\015\074\266\154 -\111\077\301\340\334\331\113\266\024\031\013\246\323\226\341\326 -\011\343\031\046\034\371\037\145\113\371\032\103\034\000\203\326 -\320\252\111\242\324\333\346\142\070\272\120\024\103\155\371\061 -\370\126\026\331\070\002\221\317\353\154\335\273\071\116\231\341 -\060\147\105\361\324\360\215\303\337\376\362\070\007\041\175\000 -\136\126\104\263\344\140\275\221\053\234\253\133\004\162\017\262 -\050\331\162\253\005\040\102\045\251\133\003\152\040\020\314\061 -\360\053\332\065\054\320\373\232\227\116\360\202\113\053\330\137 -\066\243\013\055\257\143\015\035\045\177\241\156\134\142\241\215 -\050\076\241\374\034\040\370\001\057\272\125\232\021\260\031\322 -\310\120\171\153\016\152\005\327\252\004\066\262\243\362\341\137 -\167\247\167\234\345\036\334\351\337\152\301\145\135\002\003\001 -\000\001\243\102\060\100\060\016\006\003\125\035\017\001\001\377 -\004\004\003\002\001\006\060\017\006\003\125\035\023\001\001\377 -\004\005\060\003\001\001\377\060\035\006\003\125\035\016\004\026 -\004\024\207\214\040\225\310\230\112\321\326\200\006\112\220\064 -\104\337\034\115\277\260\060\015\006\011\052\206\110\206\367\015 -\001\001\013\005\000\003\202\001\001\000\201\216\262\245\146\226 -\267\041\245\266\357\157\043\132\137\333\201\305\102\245\170\301 -\151\375\364\074\327\371\134\153\160\162\032\374\132\227\115\000 -\200\210\210\202\212\303\161\015\216\305\211\233\054\355\215\013 -\322\162\124\365\175\324\134\103\127\351\363\256\245\002\021\366 -\166\053\201\127\335\175\332\164\060\375\124\107\366\340\026\156 -\246\264\012\110\346\347\165\007\017\051\031\071\316\171\364\266 -\154\305\137\231\325\037\113\372\337\155\054\074\015\124\200\160 -\360\210\013\200\317\306\150\242\270\035\160\331\166\214\374\356 -\245\311\317\255\035\317\231\045\127\132\142\105\313\026\153\275 -\111\315\245\243\214\151\171\045\256\270\114\154\213\100\146\113 -\026\077\317\002\032\335\341\154\153\007\141\152\166\025\051\231 -\177\033\335\210\200\301\277\265\217\163\305\246\226\043\204\246 -\050\206\044\063\152\001\056\127\163\045\266\136\277\217\346\035 -\141\250\100\051\147\035\207\233\035\177\233\237\231\315\061\326 -\124\276\142\273\071\254\150\022\110\221\040\245\313\261\335\376 -\157\374\132\344\202\125\131\257\061\251 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -# For Email Distrust After: Wed Aug 31 00:00:00 2022 -CKA_NSS_EMAIL_DISTRUST_AFTER MULTILINE_OCTAL -\062\062\060\070\063\061\060\060\060\060\060\060\132 -END - -# Trust for "Symantec Class 2 Public Primary Certification Authority - G6" -# Issuer: CN=Symantec Class 2 Public Primary Certification Authority - G6,OU=Symantec Trust Network,O=Symantec Corporation,C=US -# Serial Number:64:82:9e:fc:37:1e:74:5d:fc:97:ff:97:c8:b1:ff:41 -# Subject: CN=Symantec Class 2 Public Primary Certification Authority - G6,OU=Symantec Trust Network,O=Symantec Corporation,C=US -# Not Valid Before: Tue Oct 18 00:00:00 2011 -# Not Valid After : Tue Dec 01 23:59:59 2037 -# Fingerprint (SHA-256): CB:62:7D:18:B5:8A:D5:6D:DE:33:1A:30:45:6B:C6:5C:60:1A:4E:9B:18:DE:DC:EA:08:E7:DA:AA:07:81:5F:F0 -# Fingerprint (SHA1): 40:B3:31:A0:E9:BF:E8:55:BC:39:93:CA:70:4F:4E:C2:51:D4:1D:8F -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Symantec Class 2 Public Primary Certification Authority - G6" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\100\263\061\240\351\277\350\125\274\071\223\312\160\117\116\302 -\121\324\035\217 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\175\013\203\345\373\174\255\007\117\040\251\265\337\143\355\171 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\224\061\013\060\011\006\003\125\004\006\023\002\125\123 -\061\035\060\033\006\003\125\004\012\023\024\123\171\155\141\156 -\164\145\143\040\103\157\162\160\157\162\141\164\151\157\156\061 -\037\060\035\006\003\125\004\013\023\026\123\171\155\141\156\164 -\145\143\040\124\162\165\163\164\040\116\145\164\167\157\162\153 -\061\105\060\103\006\003\125\004\003\023\074\123\171\155\141\156 -\164\145\143\040\103\154\141\163\163\040\062\040\120\165\142\154 -\151\143\040\120\162\151\155\141\162\171\040\103\145\162\164\151 -\146\151\143\141\164\151\157\156\040\101\165\164\150\157\162\151 -\164\171\040\055\040\107\066 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\020\144\202\236\374\067\036\164\135\374\227\377\227\310\261 -\377\101 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - # # Certificate "D-TRUST Root CA 3 2013" # @@ -14108,543 +12850,13 @@ CKA_ISSUER MULTILINE_OCTAL \040\101\125\124\110\117\122\111\124\131\040\103\117\056\054\114 \124\104\056\061\037\060\035\006\003\125\004\003\014\026\107\104 \103\101\040\124\162\165\163\164\101\125\124\110\040\122\065\040 -\122\117\117\124 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\175\011\227\376\360\107\352\172 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "TrustCor RootCert CA-1" -# -# Issuer: CN=TrustCor RootCert CA-1,OU=TrustCor Certificate Authority,O=TrustCor Systems S. de R.L.,L=Panama City,ST=Panama,C=PA -# Serial Number:00:da:9b:ec:71:f3:03:b0:19 -# Subject: CN=TrustCor RootCert CA-1,OU=TrustCor Certificate Authority,O=TrustCor Systems S. de R.L.,L=Panama City,ST=Panama,C=PA -# Not Valid Before: Thu Feb 04 12:32:16 2016 -# Not Valid After : Mon Dec 31 17:23:16 2029 -# Fingerprint (SHA-256): D4:0E:9C:86:CD:8F:E4:68:C1:77:69:59:F4:9E:A7:74:FA:54:86:84:B6:C4:06:F3:90:92:61:F4:DC:E2:57:5C -# Fingerprint (SHA1): FF:BD:CD:E7:82:C8:43:5E:3C:6F:26:86:5C:CA:A8:3A:45:5B:C3:0A -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TrustCor RootCert CA-1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\244\061\013\060\011\006\003\125\004\006\023\002\120\101 -\061\017\060\015\006\003\125\004\010\014\006\120\141\156\141\155 -\141\061\024\060\022\006\003\125\004\007\014\013\120\141\156\141 -\155\141\040\103\151\164\171\061\044\060\042\006\003\125\004\012 -\014\033\124\162\165\163\164\103\157\162\040\123\171\163\164\145 -\155\163\040\123\056\040\144\145\040\122\056\114\056\061\047\060 -\045\006\003\125\004\013\014\036\124\162\165\163\164\103\157\162 -\040\103\145\162\164\151\146\151\143\141\164\145\040\101\165\164 -\150\157\162\151\164\171\061\037\060\035\006\003\125\004\003\014 -\026\124\162\165\163\164\103\157\162\040\122\157\157\164\103\145 -\162\164\040\103\101\055\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\244\061\013\060\011\006\003\125\004\006\023\002\120\101 -\061\017\060\015\006\003\125\004\010\014\006\120\141\156\141\155 -\141\061\024\060\022\006\003\125\004\007\014\013\120\141\156\141 -\155\141\040\103\151\164\171\061\044\060\042\006\003\125\004\012 -\014\033\124\162\165\163\164\103\157\162\040\123\171\163\164\145 -\155\163\040\123\056\040\144\145\040\122\056\114\056\061\047\060 -\045\006\003\125\004\013\014\036\124\162\165\163\164\103\157\162 -\040\103\145\162\164\151\146\151\143\141\164\145\040\101\165\164 -\150\157\162\151\164\171\061\037\060\035\006\003\125\004\003\014 -\026\124\162\165\163\164\103\157\162\040\122\157\157\164\103\145 -\162\164\040\103\101\055\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\332\233\354\161\363\003\260\031 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\004\060\060\202\003\030\240\003\002\001\002\002\011\000 -\332\233\354\161\363\003\260\031\060\015\006\011\052\206\110\206 -\367\015\001\001\013\005\000\060\201\244\061\013\060\011\006\003 -\125\004\006\023\002\120\101\061\017\060\015\006\003\125\004\010 -\014\006\120\141\156\141\155\141\061\024\060\022\006\003\125\004 -\007\014\013\120\141\156\141\155\141\040\103\151\164\171\061\044 -\060\042\006\003\125\004\012\014\033\124\162\165\163\164\103\157 -\162\040\123\171\163\164\145\155\163\040\123\056\040\144\145\040 -\122\056\114\056\061\047\060\045\006\003\125\004\013\014\036\124 -\162\165\163\164\103\157\162\040\103\145\162\164\151\146\151\143 -\141\164\145\040\101\165\164\150\157\162\151\164\171\061\037\060 -\035\006\003\125\004\003\014\026\124\162\165\163\164\103\157\162 -\040\122\157\157\164\103\145\162\164\040\103\101\055\061\060\036 -\027\015\061\066\060\062\060\064\061\062\063\062\061\066\132\027 -\015\062\071\061\062\063\061\061\067\062\063\061\066\132\060\201 -\244\061\013\060\011\006\003\125\004\006\023\002\120\101\061\017 -\060\015\006\003\125\004\010\014\006\120\141\156\141\155\141\061 -\024\060\022\006\003\125\004\007\014\013\120\141\156\141\155\141 -\040\103\151\164\171\061\044\060\042\006\003\125\004\012\014\033 -\124\162\165\163\164\103\157\162\040\123\171\163\164\145\155\163 -\040\123\056\040\144\145\040\122\056\114\056\061\047\060\045\006 -\003\125\004\013\014\036\124\162\165\163\164\103\157\162\040\103 -\145\162\164\151\146\151\143\141\164\145\040\101\165\164\150\157 -\162\151\164\171\061\037\060\035\006\003\125\004\003\014\026\124 -\162\165\163\164\103\157\162\040\122\157\157\164\103\145\162\164 -\040\103\101\055\061\060\202\001\042\060\015\006\011\052\206\110 -\206\367\015\001\001\001\005\000\003\202\001\017\000\060\202\001 -\012\002\202\001\001\000\277\216\267\225\342\302\046\022\153\063 -\031\307\100\130\012\253\131\252\215\000\243\374\200\307\120\173 -\216\324\040\046\272\062\022\330\043\124\111\045\020\042\230\235 -\106\322\301\311\236\116\033\056\054\016\070\363\032\045\150\034 -\246\132\005\346\036\213\110\277\230\226\164\076\151\312\351\265 -\170\245\006\274\325\000\136\011\012\362\047\172\122\374\055\325 -\261\352\264\211\141\044\363\032\023\333\251\317\122\355\014\044 -\272\271\236\354\176\000\164\372\223\255\154\051\222\256\121\264 -\273\323\127\277\263\363\250\215\234\364\044\113\052\326\231\236 -\364\236\376\300\176\102\072\347\013\225\123\332\267\150\016\220 -\114\373\160\077\217\112\054\224\363\046\335\143\151\251\224\330 -\020\116\305\107\010\220\231\033\027\115\271\154\156\357\140\225 -\021\216\041\200\265\275\240\163\330\320\262\167\304\105\352\132 -\046\373\146\166\166\370\006\037\141\155\017\125\305\203\267\020 -\126\162\006\007\245\363\261\032\003\005\144\016\235\132\212\326 -\206\160\033\044\336\376\050\212\053\320\152\260\374\172\242\334 -\262\171\016\213\145\017\002\003\001\000\001\243\143\060\141\060 -\035\006\003\125\035\016\004\026\004\024\356\153\111\074\172\077 -\015\343\261\011\267\212\310\253\031\237\163\063\120\347\060\037 -\006\003\125\035\043\004\030\060\026\200\024\356\153\111\074\172 -\077\015\343\261\011\267\212\310\253\031\237\163\063\120\347\060 -\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377 -\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001\206 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\003 -\202\001\001\000\045\030\324\221\217\023\356\217\036\035\021\123 -\332\055\104\051\031\240\036\153\061\236\115\016\236\255\075\134 -\101\157\225\053\044\241\171\230\072\070\066\373\273\146\236\110 -\377\220\220\357\075\324\270\233\264\207\165\077\040\233\316\162 -\317\241\125\301\115\144\242\031\006\241\007\063\014\013\051\345 -\361\352\253\243\354\265\012\164\220\307\175\162\362\327\134\237 -\221\357\221\213\267\334\355\146\242\317\216\146\073\274\237\072 -\002\340\047\335\026\230\300\225\324\012\244\344\201\232\165\224 -\065\234\220\137\210\067\006\255\131\225\012\260\321\147\323\031 -\312\211\347\062\132\066\034\076\202\250\132\223\276\306\320\144 -\221\266\317\331\266\030\317\333\176\322\145\243\246\304\216\027 -\061\301\373\176\166\333\323\205\343\130\262\167\172\166\073\154 -\057\120\034\347\333\366\147\171\037\365\202\225\232\007\247\024 -\257\217\334\050\041\147\011\322\326\115\132\034\031\034\216\167 -\134\303\224\044\075\062\153\113\176\324\170\224\203\276\067\115 -\316\137\307\036\116\074\340\211\063\225\013\017\245\062\326\074 -\132\171\054\031 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -# For Server Distrust After: Wed Nov 30 00:00:00 2022 -CKA_NSS_SERVER_DISTRUST_AFTER MULTILINE_OCTAL -\062\062\061\061\063\060\060\060\060\060\060\060\132 -END -# For Email Distrust After: Wed Nov 30 00:00:00 2022 -CKA_NSS_EMAIL_DISTRUST_AFTER MULTILINE_OCTAL -\062\062\061\061\063\060\060\060\060\060\060\060\132 -END - -# Trust for "TrustCor RootCert CA-1" -# Issuer: CN=TrustCor RootCert CA-1,OU=TrustCor Certificate Authority,O=TrustCor Systems S. de R.L.,L=Panama City,ST=Panama,C=PA -# Serial Number:00:da:9b:ec:71:f3:03:b0:19 -# Subject: CN=TrustCor RootCert CA-1,OU=TrustCor Certificate Authority,O=TrustCor Systems S. de R.L.,L=Panama City,ST=Panama,C=PA -# Not Valid Before: Thu Feb 04 12:32:16 2016 -# Not Valid After : Mon Dec 31 17:23:16 2029 -# Fingerprint (SHA-256): D4:0E:9C:86:CD:8F:E4:68:C1:77:69:59:F4:9E:A7:74:FA:54:86:84:B6:C4:06:F3:90:92:61:F4:DC:E2:57:5C -# Fingerprint (SHA1): FF:BD:CD:E7:82:C8:43:5E:3C:6F:26:86:5C:CA:A8:3A:45:5B:C3:0A -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TrustCor RootCert CA-1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\377\275\315\347\202\310\103\136\074\157\046\206\134\312\250\072 -\105\133\303\012 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\156\205\361\334\032\000\323\042\325\262\262\254\153\067\005\105 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\244\061\013\060\011\006\003\125\004\006\023\002\120\101 -\061\017\060\015\006\003\125\004\010\014\006\120\141\156\141\155 -\141\061\024\060\022\006\003\125\004\007\014\013\120\141\156\141 -\155\141\040\103\151\164\171\061\044\060\042\006\003\125\004\012 -\014\033\124\162\165\163\164\103\157\162\040\123\171\163\164\145 -\155\163\040\123\056\040\144\145\040\122\056\114\056\061\047\060 -\045\006\003\125\004\013\014\036\124\162\165\163\164\103\157\162 -\040\103\145\162\164\151\146\151\143\141\164\145\040\101\165\164 -\150\157\162\151\164\171\061\037\060\035\006\003\125\004\003\014 -\026\124\162\165\163\164\103\157\162\040\122\157\157\164\103\145 -\162\164\040\103\101\055\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\332\233\354\161\363\003\260\031 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "TrustCor RootCert CA-2" -# -# Issuer: CN=TrustCor RootCert CA-2,OU=TrustCor Certificate Authority,O=TrustCor Systems S. de R.L.,L=Panama City,ST=Panama,C=PA -# Serial Number:25:a1:df:ca:33:cb:59:02 -# Subject: CN=TrustCor RootCert CA-2,OU=TrustCor Certificate Authority,O=TrustCor Systems S. de R.L.,L=Panama City,ST=Panama,C=PA -# Not Valid Before: Thu Feb 04 12:32:23 2016 -# Not Valid After : Sun Dec 31 17:26:39 2034 -# Fingerprint (SHA-256): 07:53:E9:40:37:8C:1B:D5:E3:83:6E:39:5D:AE:A5:CB:83:9E:50:46:F1:BD:0E:AE:19:51:CF:10:FE:C7:C9:65 -# Fingerprint (SHA1): B8:BE:6D:CB:56:F1:55:B9:63:D4:12:CA:4E:06:34:C7:94:B2:1C:C0 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TrustCor RootCert CA-2" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\244\061\013\060\011\006\003\125\004\006\023\002\120\101 -\061\017\060\015\006\003\125\004\010\014\006\120\141\156\141\155 -\141\061\024\060\022\006\003\125\004\007\014\013\120\141\156\141 -\155\141\040\103\151\164\171\061\044\060\042\006\003\125\004\012 -\014\033\124\162\165\163\164\103\157\162\040\123\171\163\164\145 -\155\163\040\123\056\040\144\145\040\122\056\114\056\061\047\060 -\045\006\003\125\004\013\014\036\124\162\165\163\164\103\157\162 -\040\103\145\162\164\151\146\151\143\141\164\145\040\101\165\164 -\150\157\162\151\164\171\061\037\060\035\006\003\125\004\003\014 -\026\124\162\165\163\164\103\157\162\040\122\157\157\164\103\145 -\162\164\040\103\101\055\062 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\244\061\013\060\011\006\003\125\004\006\023\002\120\101 -\061\017\060\015\006\003\125\004\010\014\006\120\141\156\141\155 -\141\061\024\060\022\006\003\125\004\007\014\013\120\141\156\141 -\155\141\040\103\151\164\171\061\044\060\042\006\003\125\004\012 -\014\033\124\162\165\163\164\103\157\162\040\123\171\163\164\145 -\155\163\040\123\056\040\144\145\040\122\056\114\056\061\047\060 -\045\006\003\125\004\013\014\036\124\162\165\163\164\103\157\162 -\040\103\145\162\164\151\146\151\143\141\164\145\040\101\165\164 -\150\157\162\151\164\171\061\037\060\035\006\003\125\004\003\014 -\026\124\162\165\163\164\103\157\162\040\122\157\157\164\103\145 -\162\164\040\103\101\055\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\045\241\337\312\063\313\131\002 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\006\057\060\202\004\027\240\003\002\001\002\002\010\045 -\241\337\312\063\313\131\002\060\015\006\011\052\206\110\206\367 -\015\001\001\013\005\000\060\201\244\061\013\060\011\006\003\125 -\004\006\023\002\120\101\061\017\060\015\006\003\125\004\010\014 -\006\120\141\156\141\155\141\061\024\060\022\006\003\125\004\007 -\014\013\120\141\156\141\155\141\040\103\151\164\171\061\044\060 -\042\006\003\125\004\012\014\033\124\162\165\163\164\103\157\162 -\040\123\171\163\164\145\155\163\040\123\056\040\144\145\040\122 -\056\114\056\061\047\060\045\006\003\125\004\013\014\036\124\162 -\165\163\164\103\157\162\040\103\145\162\164\151\146\151\143\141 -\164\145\040\101\165\164\150\157\162\151\164\171\061\037\060\035 -\006\003\125\004\003\014\026\124\162\165\163\164\103\157\162\040 -\122\157\157\164\103\145\162\164\040\103\101\055\062\060\036\027 -\015\061\066\060\062\060\064\061\062\063\062\062\063\132\027\015 -\063\064\061\062\063\061\061\067\062\066\063\071\132\060\201\244 -\061\013\060\011\006\003\125\004\006\023\002\120\101\061\017\060 -\015\006\003\125\004\010\014\006\120\141\156\141\155\141\061\024 -\060\022\006\003\125\004\007\014\013\120\141\156\141\155\141\040 -\103\151\164\171\061\044\060\042\006\003\125\004\012\014\033\124 -\162\165\163\164\103\157\162\040\123\171\163\164\145\155\163\040 -\123\056\040\144\145\040\122\056\114\056\061\047\060\045\006\003 -\125\004\013\014\036\124\162\165\163\164\103\157\162\040\103\145 -\162\164\151\146\151\143\141\164\145\040\101\165\164\150\157\162 -\151\164\171\061\037\060\035\006\003\125\004\003\014\026\124\162 -\165\163\164\103\157\162\040\122\157\157\164\103\145\162\164\040 -\103\101\055\062\060\202\002\042\060\015\006\011\052\206\110\206 -\367\015\001\001\001\005\000\003\202\002\017\000\060\202\002\012 -\002\202\002\001\000\247\040\156\302\052\242\142\044\225\220\166 -\310\070\176\200\322\253\301\233\145\005\224\364\301\012\020\325 -\002\254\355\237\223\307\207\310\260\047\053\102\014\075\012\076 -\101\132\236\165\335\215\312\340\233\354\150\062\244\151\222\150 -\214\013\201\016\126\240\076\032\335\054\045\024\202\057\227\323 -\144\106\364\124\251\334\072\124\055\061\053\231\202\362\331\052 -\327\357\161\000\270\061\244\276\172\044\007\303\102\040\362\212 -\324\222\004\033\145\126\114\154\324\373\266\141\132\107\043\264 -\330\151\264\267\072\320\164\074\014\165\241\214\116\166\241\351 -\333\052\245\073\372\316\260\377\176\152\050\375\047\034\310\261 -\351\051\361\127\156\144\264\320\301\025\155\016\276\056\016\106 -\310\136\364\121\376\357\016\143\072\073\161\272\317\157\131\312 -\014\343\233\135\111\270\114\342\127\261\230\212\102\127\234\166 -\357\357\275\321\150\250\322\364\011\273\167\065\276\045\202\010 -\304\026\054\104\040\126\251\104\021\167\357\135\264\035\252\136 -\153\076\213\062\366\007\057\127\004\222\312\365\376\235\302\351 -\350\263\216\114\113\002\061\331\344\074\110\202\047\367\030\202 -\166\110\072\161\261\023\241\071\325\056\305\064\302\035\142\205 -\337\003\376\115\364\257\075\337\134\133\215\372\160\341\245\176 -\047\307\206\056\152\217\022\306\204\136\103\121\120\234\031\233 -\170\346\374\366\355\107\176\173\075\146\357\023\023\210\137\074 -\241\143\373\371\254\207\065\237\363\202\236\244\077\012\234\061 -\151\213\231\244\210\112\216\156\146\115\357\026\304\017\171\050 -\041\140\015\205\026\175\327\124\070\361\222\126\375\265\063\114 -\203\334\327\020\237\113\375\306\370\102\275\272\174\163\002\340 -\377\175\315\133\341\324\254\141\173\127\325\112\173\133\324\205 -\130\047\135\277\370\053\140\254\240\046\256\024\041\047\306\167 -\232\063\200\074\136\106\077\367\303\261\243\206\063\306\350\136 -\015\271\065\054\252\106\301\205\002\165\200\240\353\044\373\025 -\252\344\147\177\156\167\077\364\004\212\057\174\173\343\027\141 -\360\335\011\251\040\310\276\011\244\320\176\104\303\262\060\112 -\070\252\251\354\030\232\007\202\053\333\270\234\030\255\332\340 -\106\027\254\317\135\002\003\001\000\001\243\143\060\141\060\035 -\006\003\125\035\016\004\026\004\024\331\376\041\100\156\224\236 -\274\233\075\234\175\230\040\031\345\214\060\142\262\060\037\006 -\003\125\035\043\004\030\060\026\200\024\331\376\041\100\156\224 -\236\274\233\075\234\175\230\040\031\345\214\060\142\262\060\017 -\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060 -\016\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060 -\015\006\011\052\206\110\206\367\015\001\001\013\005\000\003\202 -\002\001\000\236\105\236\014\073\266\357\341\072\310\174\321\000 -\075\317\342\352\006\265\262\072\273\006\113\150\172\320\043\227 -\164\247\054\360\010\330\171\132\327\132\204\212\330\022\232\033 -\331\175\134\115\160\305\245\371\253\345\243\211\211\335\001\372 -\354\335\371\351\222\227\333\260\106\102\363\323\142\252\225\376 -\061\147\024\151\130\220\012\252\013\356\067\043\307\120\121\264 -\365\176\236\343\173\367\344\314\102\062\055\111\014\313\377\111 -\014\233\036\064\375\156\156\226\212\171\003\266\157\333\011\313 -\375\137\145\024\067\341\070\365\363\141\026\130\344\265\155\015 -\013\004\033\077\120\055\177\263\307\172\032\026\200\140\370\212 -\037\351\033\052\306\371\272\001\032\151\277\322\130\307\124\127 -\010\217\341\071\140\167\113\254\131\204\032\210\361\335\313\117 -\170\327\347\341\063\055\374\356\101\372\040\260\276\313\367\070 -\224\300\341\320\205\017\273\355\054\163\253\355\376\222\166\032 -\144\177\133\015\063\011\007\063\173\006\077\021\244\134\160\074 -\205\300\317\343\220\250\203\167\372\333\346\305\214\150\147\020 -\147\245\122\055\360\304\231\217\177\277\321\153\342\265\107\326 -\331\320\205\231\115\224\233\017\113\215\356\000\132\107\035\021 -\003\254\101\030\257\207\267\157\014\072\217\312\317\334\003\301 -\242\011\310\345\375\200\136\310\140\102\001\033\032\123\132\273 -\067\246\267\274\272\204\351\036\154\032\324\144\332\324\103\376 -\223\213\113\362\054\171\026\020\324\223\013\210\217\241\330\206 -\024\106\221\107\233\050\044\357\127\122\116\134\102\234\252\367 -\111\354\047\350\100\036\263\246\211\042\162\234\365\015\063\264 -\130\243\060\073\335\324\152\124\223\276\032\115\363\223\224\367 -\374\204\013\077\204\040\134\064\003\104\305\332\255\274\012\301 -\002\317\036\345\224\331\363\216\133\330\114\360\235\354\141\027 -\273\024\062\124\014\002\051\223\036\222\206\366\177\357\347\222 -\005\016\131\335\231\010\056\056\372\234\000\122\323\305\146\051 -\344\247\227\104\244\016\050\201\023\065\305\366\157\144\346\101 -\304\325\057\314\064\105\045\317\101\000\226\075\112\056\302\226 -\230\117\116\112\234\227\267\333\037\222\062\310\377\017\121\156 -\326\354\011 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -# For Server Distrust After: Wed Nov 30 00:00:00 2022 -CKA_NSS_SERVER_DISTRUST_AFTER MULTILINE_OCTAL -\062\062\061\061\063\060\060\060\060\060\060\060\132 -END -# For Email Distrust After: Wed Nov 30 00:00:00 2022 -CKA_NSS_EMAIL_DISTRUST_AFTER MULTILINE_OCTAL -\062\062\061\061\063\060\060\060\060\060\060\060\132 -END - - -# Trust for "TrustCor RootCert CA-2" -# Issuer: CN=TrustCor RootCert CA-2,OU=TrustCor Certificate Authority,O=TrustCor Systems S. de R.L.,L=Panama City,ST=Panama,C=PA -# Serial Number:25:a1:df:ca:33:cb:59:02 -# Subject: CN=TrustCor RootCert CA-2,OU=TrustCor Certificate Authority,O=TrustCor Systems S. de R.L.,L=Panama City,ST=Panama,C=PA -# Not Valid Before: Thu Feb 04 12:32:23 2016 -# Not Valid After : Sun Dec 31 17:26:39 2034 -# Fingerprint (SHA-256): 07:53:E9:40:37:8C:1B:D5:E3:83:6E:39:5D:AE:A5:CB:83:9E:50:46:F1:BD:0E:AE:19:51:CF:10:FE:C7:C9:65 -# Fingerprint (SHA1): B8:BE:6D:CB:56:F1:55:B9:63:D4:12:CA:4E:06:34:C7:94:B2:1C:C0 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TrustCor RootCert CA-2" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\270\276\155\313\126\361\125\271\143\324\022\312\116\006\064\307 -\224\262\034\300 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\242\341\370\030\013\272\105\325\307\101\052\273\067\122\105\144 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\244\061\013\060\011\006\003\125\004\006\023\002\120\101 -\061\017\060\015\006\003\125\004\010\014\006\120\141\156\141\155 -\141\061\024\060\022\006\003\125\004\007\014\013\120\141\156\141 -\155\141\040\103\151\164\171\061\044\060\042\006\003\125\004\012 -\014\033\124\162\165\163\164\103\157\162\040\123\171\163\164\145 -\155\163\040\123\056\040\144\145\040\122\056\114\056\061\047\060 -\045\006\003\125\004\013\014\036\124\162\165\163\164\103\157\162 -\040\103\145\162\164\151\146\151\143\141\164\145\040\101\165\164 -\150\157\162\151\164\171\061\037\060\035\006\003\125\004\003\014 -\026\124\162\165\163\164\103\157\162\040\122\157\157\164\103\145 -\162\164\040\103\101\055\062 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\045\241\337\312\063\313\131\002 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "TrustCor ECA-1" -# -# Issuer: CN=TrustCor ECA-1,OU=TrustCor Certificate Authority,O=TrustCor Systems S. de R.L.,L=Panama City,ST=Panama,C=PA -# Serial Number:00:84:82:2c:5f:1c:62:d0:40 -# Subject: CN=TrustCor ECA-1,OU=TrustCor Certificate Authority,O=TrustCor Systems S. de R.L.,L=Panama City,ST=Panama,C=PA -# Not Valid Before: Thu Feb 04 12:32:33 2016 -# Not Valid After : Mon Dec 31 17:28:07 2029 -# Fingerprint (SHA-256): 5A:88:5D:B1:9C:01:D9:12:C5:75:93:88:93:8C:AF:BB:DF:03:1A:B2:D4:8E:91:EE:15:58:9B:42:97:1D:03:9C -# Fingerprint (SHA1): 58:D1:DF:95:95:67:6B:63:C0:F0:5B:1C:17:4D:8B:84:0B:C8:78:BD -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TrustCor ECA-1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\234\061\013\060\011\006\003\125\004\006\023\002\120\101 -\061\017\060\015\006\003\125\004\010\014\006\120\141\156\141\155 -\141\061\024\060\022\006\003\125\004\007\014\013\120\141\156\141 -\155\141\040\103\151\164\171\061\044\060\042\006\003\125\004\012 -\014\033\124\162\165\163\164\103\157\162\040\123\171\163\164\145 -\155\163\040\123\056\040\144\145\040\122\056\114\056\061\047\060 -\045\006\003\125\004\013\014\036\124\162\165\163\164\103\157\162 -\040\103\145\162\164\151\146\151\143\141\164\145\040\101\165\164 -\150\157\162\151\164\171\061\027\060\025\006\003\125\004\003\014 -\016\124\162\165\163\164\103\157\162\040\105\103\101\055\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\234\061\013\060\011\006\003\125\004\006\023\002\120\101 -\061\017\060\015\006\003\125\004\010\014\006\120\141\156\141\155 -\141\061\024\060\022\006\003\125\004\007\014\013\120\141\156\141 -\155\141\040\103\151\164\171\061\044\060\042\006\003\125\004\012 -\014\033\124\162\165\163\164\103\157\162\040\123\171\163\164\145 -\155\163\040\123\056\040\144\145\040\122\056\114\056\061\047\060 -\045\006\003\125\004\013\014\036\124\162\165\163\164\103\157\162 -\040\103\145\162\164\151\146\151\143\141\164\145\040\101\165\164 -\150\157\162\151\164\171\061\027\060\025\006\003\125\004\003\014 -\016\124\162\165\163\164\103\157\162\040\105\103\101\055\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\204\202\054\137\034\142\320\100 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\004\040\060\202\003\010\240\003\002\001\002\002\011\000 -\204\202\054\137\034\142\320\100\060\015\006\011\052\206\110\206 -\367\015\001\001\013\005\000\060\201\234\061\013\060\011\006\003 -\125\004\006\023\002\120\101\061\017\060\015\006\003\125\004\010 -\014\006\120\141\156\141\155\141\061\024\060\022\006\003\125\004 -\007\014\013\120\141\156\141\155\141\040\103\151\164\171\061\044 -\060\042\006\003\125\004\012\014\033\124\162\165\163\164\103\157 -\162\040\123\171\163\164\145\155\163\040\123\056\040\144\145\040 -\122\056\114\056\061\047\060\045\006\003\125\004\013\014\036\124 -\162\165\163\164\103\157\162\040\103\145\162\164\151\146\151\143 -\141\164\145\040\101\165\164\150\157\162\151\164\171\061\027\060 -\025\006\003\125\004\003\014\016\124\162\165\163\164\103\157\162 -\040\105\103\101\055\061\060\036\027\015\061\066\060\062\060\064 -\061\062\063\062\063\063\132\027\015\062\071\061\062\063\061\061 -\067\062\070\060\067\132\060\201\234\061\013\060\011\006\003\125 -\004\006\023\002\120\101\061\017\060\015\006\003\125\004\010\014 -\006\120\141\156\141\155\141\061\024\060\022\006\003\125\004\007 -\014\013\120\141\156\141\155\141\040\103\151\164\171\061\044\060 -\042\006\003\125\004\012\014\033\124\162\165\163\164\103\157\162 -\040\123\171\163\164\145\155\163\040\123\056\040\144\145\040\122 -\056\114\056\061\047\060\045\006\003\125\004\013\014\036\124\162 -\165\163\164\103\157\162\040\103\145\162\164\151\146\151\143\141 -\164\145\040\101\165\164\150\157\162\151\164\171\061\027\060\025 -\006\003\125\004\003\014\016\124\162\165\163\164\103\157\162\040 -\105\103\101\055\061\060\202\001\042\060\015\006\011\052\206\110 -\206\367\015\001\001\001\005\000\003\202\001\017\000\060\202\001 -\012\002\202\001\001\000\317\217\340\021\265\237\250\166\166\333 -\337\017\124\357\163\143\051\202\255\107\306\243\153\355\376\137 -\063\370\103\121\351\032\063\221\061\027\240\164\304\324\247\001 -\346\262\222\076\152\235\355\016\371\164\230\100\323\077\003\200 -\006\202\100\350\261\342\247\121\247\035\203\046\153\253\336\372 -\027\221\053\330\306\254\036\261\236\031\001\325\227\246\352\015 -\267\304\125\037\047\174\322\010\325\166\037\051\025\207\100\071 -\335\070\105\021\165\320\232\247\064\340\277\315\310\122\035\271 -\107\176\015\270\273\306\014\366\163\127\026\132\176\103\221\037 -\125\072\306\155\104\004\252\234\251\234\247\114\211\027\203\256 -\243\004\136\122\200\213\036\022\045\021\031\327\014\175\175\061 -\104\101\352\333\257\260\034\357\201\320\054\305\232\041\233\075 -\355\102\073\120\046\362\354\316\161\141\006\142\041\124\116\177 -\301\235\076\177\040\214\200\313\052\330\227\142\310\203\063\221 -\175\260\242\132\017\127\350\073\314\362\045\262\324\174\057\354 -\115\306\241\072\025\172\347\266\135\065\365\366\110\112\066\105 -\146\324\272\230\130\301\002\003\001\000\001\243\143\060\141\060 -\035\006\003\125\035\016\004\026\004\024\104\236\110\365\314\155 -\110\324\240\113\177\376\131\044\057\203\227\231\232\206\060\037 -\006\003\125\035\043\004\030\060\026\200\024\104\236\110\365\314 -\155\110\324\240\113\177\376\131\044\057\203\227\231\232\206\060 -\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377 -\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001\206 -\060\015\006\011\052\206\110\206\367\015\001\001\013\005\000\003 -\202\001\001\000\005\076\065\134\025\160\233\311\307\163\141\157 -\162\053\324\302\217\362\103\135\002\316\304\224\271\224\021\203 -\147\135\342\147\154\165\166\277\273\014\252\066\306\255\107\223 -\143\334\036\176\326\336\056\376\351\031\062\070\003\177\024\366 -\000\163\054\131\261\041\006\341\373\254\030\225\014\243\377\231 -\226\367\053\047\233\325\044\314\035\335\301\072\340\230\104\260 -\304\344\076\167\261\163\251\144\054\366\034\001\174\077\135\105 -\205\300\205\347\045\217\225\334\027\363\074\237\032\156\260\312 -\343\035\052\351\114\143\372\044\141\142\326\332\176\266\034\154 -\365\002\035\324\052\335\125\220\353\052\021\107\074\056\136\164 -\262\202\042\245\175\123\037\105\354\047\221\175\347\042\026\350 -\300\150\066\330\306\361\117\200\104\062\371\341\321\321\035\252 -\336\250\253\234\004\257\255\040\016\144\230\115\245\153\300\110 -\130\226\151\115\334\007\214\121\223\242\337\237\017\075\213\140 -\264\202\215\252\010\116\142\105\340\371\013\322\340\340\074\133 -\336\134\161\047\045\302\346\003\201\213\020\123\343\307\125\242 -\264\237\327\346 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -# For Server Distrust After: Wed Nov 30 00:00:00 2022 -CKA_NSS_SERVER_DISTRUST_AFTER MULTILINE_OCTAL -\062\062\061\061\063\060\060\060\060\060\060\060\132 -END -# For Email Distrust After: Wed Nov 30 00:00:00 2022 -CKA_NSS_EMAIL_DISTRUST_AFTER MULTILINE_OCTAL -\062\062\061\061\063\060\060\060\060\060\060\060\132 -END - -# Trust for "TrustCor ECA-1" -# Issuer: CN=TrustCor ECA-1,OU=TrustCor Certificate Authority,O=TrustCor Systems S. de R.L.,L=Panama City,ST=Panama,C=PA -# Serial Number:00:84:82:2c:5f:1c:62:d0:40 -# Subject: CN=TrustCor ECA-1,OU=TrustCor Certificate Authority,O=TrustCor Systems S. de R.L.,L=Panama City,ST=Panama,C=PA -# Not Valid Before: Thu Feb 04 12:32:33 2016 -# Not Valid After : Mon Dec 31 17:28:07 2029 -# Fingerprint (SHA-256): 5A:88:5D:B1:9C:01:D9:12:C5:75:93:88:93:8C:AF:BB:DF:03:1A:B2:D4:8E:91:EE:15:58:9B:42:97:1D:03:9C -# Fingerprint (SHA1): 58:D1:DF:95:95:67:6B:63:C0:F0:5B:1C:17:4D:8B:84:0B:C8:78:BD -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "TrustCor ECA-1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\130\321\337\225\225\147\153\143\300\360\133\034\027\115\213\204 -\013\310\170\275 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\047\222\043\035\012\365\100\174\351\346\153\235\330\365\347\154 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\234\061\013\060\011\006\003\125\004\006\023\002\120\101 -\061\017\060\015\006\003\125\004\010\014\006\120\141\156\141\155 -\141\061\024\060\022\006\003\125\004\007\014\013\120\141\156\141 -\155\141\040\103\151\164\171\061\044\060\042\006\003\125\004\012 -\014\033\124\162\165\163\164\103\157\162\040\123\171\163\164\145 -\155\163\040\123\056\040\144\145\040\122\056\114\056\061\047\060 -\045\006\003\125\004\013\014\036\124\162\165\163\164\103\157\162 -\040\103\145\162\164\151\146\151\143\141\164\145\040\101\165\164 -\150\157\162\151\164\171\061\027\060\025\006\003\125\004\003\014 -\016\124\162\165\163\164\103\157\162\040\105\103\101\055\061 +\122\117\117\124 END CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\011\000\204\202\054\137\034\142\320\100 +\002\010\175\011\227\376\360\107\352\172 END CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE @@ -20408,7 +18620,7 @@ CKA_SERIAL_NUMBER MULTILINE_OCTAL \002\010\033\160\351\322\377\256\154\161 END CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE @@ -25565,3 +23777,843 @@ CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE + +# +# Certificate "TrustAsia Global Root CA G3" +# +# Issuer: CN=TrustAsia Global Root CA G3,O="TrustAsia Technologies, Inc.",C=CN +# Serial Number:64:f6:0e:65:77:61:6a:ab:3b:b4:ea:85:84:bb:b1:89:b8:71:93:0f +# Subject: CN=TrustAsia Global Root CA G3,O="TrustAsia Technologies, Inc.",C=CN +# Not Valid Before: Thu May 20 02:10:19 2021 +# Not Valid After : Sat May 19 02:10:19 2046 +# Fingerprint (SHA-256): E0:D3:22:6A:EB:11:63:C2:E4:8F:F9:BE:3B:50:B4:C6:43:1B:E7:BB:1E:AC:C5:C3:6B:5D:5E:C5:09:03:9A:08 +# Fingerprint (SHA1): 63:CF:B6:C1:27:2B:56:E4:88:8E:1C:23:9A:B6:2E:81:47:24:C3:C7 +CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "TrustAsia Global Root CA G3" +CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 +CKA_SUBJECT MULTILINE_OCTAL +\060\132\061\013\060\011\006\003\125\004\006\023\002\103\116\061 +\045\060\043\006\003\125\004\012\014\034\124\162\165\163\164\101 +\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 +\054\040\111\156\143\056\061\044\060\042\006\003\125\004\003\014 +\033\124\162\165\163\164\101\163\151\141\040\107\154\157\142\141 +\154\040\122\157\157\164\040\103\101\040\107\063 +END +CKA_ID UTF8 "0" +CKA_ISSUER MULTILINE_OCTAL +\060\132\061\013\060\011\006\003\125\004\006\023\002\103\116\061 +\045\060\043\006\003\125\004\012\014\034\124\162\165\163\164\101 +\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 +\054\040\111\156\143\056\061\044\060\042\006\003\125\004\003\014 +\033\124\162\165\163\164\101\163\151\141\040\107\154\157\142\141 +\154\040\122\157\157\164\040\103\101\040\107\063 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\024\144\366\016\145\167\141\152\253\073\264\352\205\204\273 +\261\211\270\161\223\017 +END +CKA_VALUE MULTILINE_OCTAL +\060\202\005\245\060\202\003\215\240\003\002\001\002\002\024\144 +\366\016\145\167\141\152\253\073\264\352\205\204\273\261\211\270 +\161\223\017\060\015\006\011\052\206\110\206\367\015\001\001\014 +\005\000\060\132\061\013\060\011\006\003\125\004\006\023\002\103 +\116\061\045\060\043\006\003\125\004\012\014\034\124\162\165\163 +\164\101\163\151\141\040\124\145\143\150\156\157\154\157\147\151 +\145\163\054\040\111\156\143\056\061\044\060\042\006\003\125\004 +\003\014\033\124\162\165\163\164\101\163\151\141\040\107\154\157 +\142\141\154\040\122\157\157\164\040\103\101\040\107\063\060\036 +\027\015\062\061\060\065\062\060\060\062\061\060\061\071\132\027 +\015\064\066\060\065\061\071\060\062\061\060\061\071\132\060\132 +\061\013\060\011\006\003\125\004\006\023\002\103\116\061\045\060 +\043\006\003\125\004\012\014\034\124\162\165\163\164\101\163\151 +\141\040\124\145\143\150\156\157\154\157\147\151\145\163\054\040 +\111\156\143\056\061\044\060\042\006\003\125\004\003\014\033\124 +\162\165\163\164\101\163\151\141\040\107\154\157\142\141\154\040 +\122\157\157\164\040\103\101\040\107\063\060\202\002\042\060\015 +\006\011\052\206\110\206\367\015\001\001\001\005\000\003\202\002 +\017\000\060\202\002\012\002\202\002\001\000\300\061\202\141\222 +\344\224\033\012\052\145\320\276\006\251\207\073\121\022\352\160 +\101\256\342\373\164\352\012\215\271\263\114\334\217\267\023\122 +\117\124\030\341\054\163\225\221\305\146\073\152\317\254\143\155 +\207\123\360\367\361\071\267\240\103\143\260\304\003\135\127\251 +\347\104\316\304\241\203\145\366\120\076\261\176\026\270\072\212 +\002\320\226\037\000\315\005\041\357\006\155\335\041\234\031\103 +\105\241\305\350\200\312\302\255\100\142\027\006\306\252\274\363 +\326\346\374\120\176\146\102\037\074\213\246\171\171\206\100\065 +\237\040\357\077\353\213\107\037\217\216\305\324\216\266\054\311 +\104\004\343\324\103\165\077\325\077\257\034\314\176\106\137\254 +\337\144\020\212\357\106\360\220\360\017\055\364\210\013\261\051 +\252\257\205\252\111\130\250\277\143\240\070\221\346\263\346\167 +\150\304\371\052\031\204\273\016\341\365\257\211\354\245\057\120 +\040\164\036\022\101\163\036\044\331\312\316\054\241\131\065\300 +\310\035\106\047\141\132\217\371\115\323\162\171\146\036\237\025 +\220\041\055\375\355\213\126\160\003\112\111\076\177\151\061\022 +\151\307\036\134\312\172\023\213\350\346\365\140\017\314\223\054 +\204\177\361\374\152\374\233\107\235\333\255\210\075\363\166\165 +\063\327\113\244\310\213\371\365\103\130\117\313\310\003\124\217 +\245\205\170\004\032\363\163\362\327\207\035\101\237\347\330\027 +\316\032\234\017\112\374\334\104\150\124\150\342\101\074\376\054 +\204\206\067\074\315\077\057\242\333\347\367\124\003\137\131\323 +\367\221\170\307\213\167\152\026\345\111\205\220\105\162\160\057 +\221\135\370\076\145\100\013\031\231\311\046\040\132\150\301\065 +\277\117\247\121\361\330\021\053\133\340\232\236\050\073\012\072 +\012\037\301\201\345\056\360\246\271\151\245\210\224\346\153\023 +\177\321\144\077\075\234\160\106\345\242\205\173\130\204\047\334 +\304\200\076\147\232\232\307\232\061\016\060\354\346\027\100\225 +\331\105\355\001\226\252\277\014\363\113\321\143\367\023\130\300 +\270\363\372\147\335\233\175\155\112\377\062\114\265\045\073\377 +\034\147\017\205\042\131\005\221\221\101\167\201\320\205\114\207 +\020\161\377\236\103\033\256\225\165\055\201\002\003\001\000\001 +\243\143\060\141\060\017\006\003\125\035\023\001\001\377\004\005 +\060\003\001\001\377\060\037\006\003\125\035\043\004\030\060\026 +\200\024\100\344\344\362\043\357\070\312\260\256\127\177\362\041 +\060\026\064\333\274\222\060\035\006\003\125\035\016\004\026\004 +\024\100\344\344\362\043\357\070\312\260\256\127\177\362\041\060 +\026\064\333\274\222\060\016\006\003\125\035\017\001\001\377\004 +\004\003\002\001\006\060\015\006\011\052\206\110\206\367\015\001 +\001\014\005\000\003\202\002\001\000\046\073\121\341\115\070\363 +\062\030\264\264\136\341\145\136\304\224\117\324\247\141\243\370 +\300\317\063\001\002\351\303\252\065\017\361\224\023\167\167\065 +\236\055\126\121\104\156\341\306\056\050\036\377\332\354\107\315 +\227\104\027\367\340\114\302\341\174\174\062\172\146\310\132\266 +\134\123\105\127\132\105\324\005\231\057\056\043\125\356\143\150 +\337\323\033\170\247\022\224\006\000\165\015\162\204\351\056\274 +\132\152\325\336\057\131\307\243\354\322\207\146\333\267\124\265 +\044\253\364\103\170\333\113\004\304\157\335\346\076\146\076\051 +\362\113\150\161\042\207\240\370\261\063\143\166\343\015\205\162 +\104\042\125\077\034\174\351\374\270\025\350\122\372\252\076\243 +\041\071\065\164\211\246\152\302\071\372\170\317\266\254\347\347 +\326\126\377\043\222\056\120\013\251\265\007\063\364\070\137\244 +\111\246\313\145\160\166\350\012\205\200\113\066\075\063\367\225 +\124\165\045\332\254\304\163\202\145\351\122\365\134\375\070\225 +\002\152\151\060\305\034\012\127\007\256\042\244\054\371\305\101 +\267\270\354\237\117\110\000\371\001\004\125\314\254\371\062\061 +\304\165\225\006\240\177\321\215\047\335\263\251\244\162\207\376 +\131\213\232\172\164\026\335\026\245\142\051\353\072\226\334\213 +\247\150\131\323\353\167\221\071\370\327\313\331\217\137\132\047 +\001\175\135\150\031\142\330\310\315\364\267\162\107\276\133\227 +\316\362\255\242\231\223\255\224\313\223\366\022\011\225\266\253 +\327\073\320\077\021\313\060\026\056\171\200\344\147\201\055\135 +\355\160\170\266\140\131\254\341\135\105\143\217\310\337\162\150 +\133\352\035\270\001\361\176\373\347\212\263\343\124\240\070\011 +\340\074\336\102\362\302\355\056\233\363\037\065\266\066\330\343 +\200\241\213\315\231\144\017\302\252\253\261\312\365\157\236\103 +\215\204\124\231\263\156\300\022\146\330\160\020\361\006\065\063 +\103\250\234\056\272\024\061\316\020\177\034\206\343\217\322\325 +\370\167\354\233\253\361\057\143\331\102\137\340\147\201\144\221 +\361\227\057\374\156\046\366\063\370\323\265\370\304\142\253\061 +\121\045\002\172\370\335\153\145\325\155\115\060\310\145\272\150 +\024\145\254\047\013\164\212\362\207 +END +CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE +CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE +CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE + +# Trust for "TrustAsia Global Root CA G3" +# Issuer: CN=TrustAsia Global Root CA G3,O="TrustAsia Technologies, Inc.",C=CN +# Serial Number:64:f6:0e:65:77:61:6a:ab:3b:b4:ea:85:84:bb:b1:89:b8:71:93:0f +# Subject: CN=TrustAsia Global Root CA G3,O="TrustAsia Technologies, Inc.",C=CN +# Not Valid Before: Thu May 20 02:10:19 2021 +# Not Valid After : Sat May 19 02:10:19 2046 +# Fingerprint (SHA-256): E0:D3:22:6A:EB:11:63:C2:E4:8F:F9:BE:3B:50:B4:C6:43:1B:E7:BB:1E:AC:C5:C3:6B:5D:5E:C5:09:03:9A:08 +# Fingerprint (SHA1): 63:CF:B6:C1:27:2B:56:E4:88:8E:1C:23:9A:B6:2E:81:47:24:C3:C7 +CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "TrustAsia Global Root CA G3" +CKA_CERT_SHA1_HASH MULTILINE_OCTAL +\143\317\266\301\047\053\126\344\210\216\034\043\232\266\056\201 +\107\044\303\307 +END +CKA_CERT_MD5_HASH MULTILINE_OCTAL +\060\102\033\267\273\201\165\065\344\026\117\123\322\224\336\004 +END +CKA_ISSUER MULTILINE_OCTAL +\060\132\061\013\060\011\006\003\125\004\006\023\002\103\116\061 +\045\060\043\006\003\125\004\012\014\034\124\162\165\163\164\101 +\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 +\054\040\111\156\143\056\061\044\060\042\006\003\125\004\003\014 +\033\124\162\165\163\164\101\163\151\141\040\107\154\157\142\141 +\154\040\122\157\157\164\040\103\101\040\107\063 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\024\144\366\016\145\167\141\152\253\073\264\352\205\204\273 +\261\211\270\161\223\017 +END +CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE + +# +# Certificate "TrustAsia Global Root CA G4" +# +# Issuer: CN=TrustAsia Global Root CA G4,O="TrustAsia Technologies, Inc.",C=CN +# Serial Number:4f:23:64:b8:8e:97:63:9e:c6:53:81:c1:76:4e:cb:2a:74:15:d6:d7 +# Subject: CN=TrustAsia Global Root CA G4,O="TrustAsia Technologies, Inc.",C=CN +# Not Valid Before: Thu May 20 02:10:22 2021 +# Not Valid After : Sat May 19 02:10:22 2046 +# Fingerprint (SHA-256): BE:4B:56:CB:50:56:C0:13:6A:52:6D:F4:44:50:8D:AA:36:A0:B5:4F:42:E4:AC:38:F7:2A:F4:70:E4:79:65:4C +# Fingerprint (SHA1): 57:73:A5:61:5D:80:B2:E6:AC:38:82:FC:68:07:31:AC:9F:B5:92:5A +CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "TrustAsia Global Root CA G4" +CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 +CKA_SUBJECT MULTILINE_OCTAL +\060\132\061\013\060\011\006\003\125\004\006\023\002\103\116\061 +\045\060\043\006\003\125\004\012\014\034\124\162\165\163\164\101 +\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 +\054\040\111\156\143\056\061\044\060\042\006\003\125\004\003\014 +\033\124\162\165\163\164\101\163\151\141\040\107\154\157\142\141 +\154\040\122\157\157\164\040\103\101\040\107\064 +END +CKA_ID UTF8 "0" +CKA_ISSUER MULTILINE_OCTAL +\060\132\061\013\060\011\006\003\125\004\006\023\002\103\116\061 +\045\060\043\006\003\125\004\012\014\034\124\162\165\163\164\101 +\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 +\054\040\111\156\143\056\061\044\060\042\006\003\125\004\003\014 +\033\124\162\165\163\164\101\163\151\141\040\107\154\157\142\141 +\154\040\122\157\157\164\040\103\101\040\107\064 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\024\117\043\144\270\216\227\143\236\306\123\201\301\166\116 +\313\052\164\025\326\327 +END +CKA_VALUE MULTILINE_OCTAL +\060\202\002\125\060\202\001\334\240\003\002\001\002\002\024\117 +\043\144\270\216\227\143\236\306\123\201\301\166\116\313\052\164 +\025\326\327\060\012\006\010\052\206\110\316\075\004\003\003\060 +\132\061\013\060\011\006\003\125\004\006\023\002\103\116\061\045 +\060\043\006\003\125\004\012\014\034\124\162\165\163\164\101\163 +\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163\054 +\040\111\156\143\056\061\044\060\042\006\003\125\004\003\014\033 +\124\162\165\163\164\101\163\151\141\040\107\154\157\142\141\154 +\040\122\157\157\164\040\103\101\040\107\064\060\036\027\015\062 +\061\060\065\062\060\060\062\061\060\062\062\132\027\015\064\066 +\060\065\061\071\060\062\061\060\062\062\132\060\132\061\013\060 +\011\006\003\125\004\006\023\002\103\116\061\045\060\043\006\003 +\125\004\012\014\034\124\162\165\163\164\101\163\151\141\040\124 +\145\143\150\156\157\154\157\147\151\145\163\054\040\111\156\143 +\056\061\044\060\042\006\003\125\004\003\014\033\124\162\165\163 +\164\101\163\151\141\040\107\154\157\142\141\154\040\122\157\157 +\164\040\103\101\040\107\064\060\166\060\020\006\007\052\206\110 +\316\075\002\001\006\005\053\201\004\000\042\003\142\000\004\361 +\263\315\070\344\045\103\345\336\031\011\273\201\171\242\025\137 +\025\143\001\336\302\253\335\263\246\033\147\113\200\203\257\231 +\313\254\027\333\053\226\312\174\122\125\342\032\341\075\126\360 +\057\026\010\372\025\274\233\273\107\346\077\356\250\341\114\214 +\365\323\066\371\070\135\253\160\232\107\015\342\201\101\006\353 +\111\371\260\051\335\063\354\120\245\177\171\051\270\040\230\243 +\143\060\141\060\017\006\003\125\035\023\001\001\377\004\005\060 +\003\001\001\377\060\037\006\003\125\035\043\004\030\060\026\200 +\024\245\273\112\227\316\263\053\177\244\061\336\227\203\131\203 +\246\157\161\313\336\060\035\006\003\125\035\016\004\026\004\024 +\245\273\112\227\316\263\053\177\244\061\336\227\203\131\203\246 +\157\161\313\336\060\016\006\003\125\035\017\001\001\377\004\004 +\003\002\001\006\060\012\006\010\052\206\110\316\075\004\003\003 +\003\147\000\060\144\002\060\136\362\353\006\314\111\061\237\100 +\000\155\267\176\066\360\115\021\117\363\313\211\072\054\170\221 +\120\243\133\300\312\165\046\362\277\220\135\013\202\214\140\050 +\237\306\160\232\150\344\361\002\060\134\130\016\126\166\317\130 +\303\327\020\214\272\216\256\343\274\144\165\107\305\125\220\343 +\375\272\125\353\007\304\123\253\067\251\356\041\262\041\133\140 +\217\075\062\361\325\043\224\326\130 +END +CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE +CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE +CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE + +# Trust for "TrustAsia Global Root CA G4" +# Issuer: CN=TrustAsia Global Root CA G4,O="TrustAsia Technologies, Inc.",C=CN +# Serial Number:4f:23:64:b8:8e:97:63:9e:c6:53:81:c1:76:4e:cb:2a:74:15:d6:d7 +# Subject: CN=TrustAsia Global Root CA G4,O="TrustAsia Technologies, Inc.",C=CN +# Not Valid Before: Thu May 20 02:10:22 2021 +# Not Valid After : Sat May 19 02:10:22 2046 +# Fingerprint (SHA-256): BE:4B:56:CB:50:56:C0:13:6A:52:6D:F4:44:50:8D:AA:36:A0:B5:4F:42:E4:AC:38:F7:2A:F4:70:E4:79:65:4C +# Fingerprint (SHA1): 57:73:A5:61:5D:80:B2:E6:AC:38:82:FC:68:07:31:AC:9F:B5:92:5A +CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "TrustAsia Global Root CA G4" +CKA_CERT_SHA1_HASH MULTILINE_OCTAL +\127\163\245\141\135\200\262\346\254\070\202\374\150\007\061\254 +\237\265\222\132 +END +CKA_CERT_MD5_HASH MULTILINE_OCTAL +\124\335\262\327\137\330\076\355\174\340\013\056\314\355\353\353 +END +CKA_ISSUER MULTILINE_OCTAL +\060\132\061\013\060\011\006\003\125\004\006\023\002\103\116\061 +\045\060\043\006\003\125\004\012\014\034\124\162\165\163\164\101 +\163\151\141\040\124\145\143\150\156\157\154\157\147\151\145\163 +\054\040\111\156\143\056\061\044\060\042\006\003\125\004\003\014 +\033\124\162\165\163\164\101\163\151\141\040\107\154\157\142\141 +\154\040\122\157\157\164\040\103\101\040\107\064 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\024\117\043\144\270\216\227\143\236\306\123\201\301\166\116 +\313\052\164\025\326\327 +END +CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE + +# +# Certificate "CommScope Public Trust ECC Root-01" +# +# Issuer: CN=CommScope Public Trust ECC Root-01,O=CommScope,C=US +# Serial Number:43:70:82:77:cf:4d:5d:34:f1:ca:ae:32:2f:37:f7:f4:7f:75:a0:9e +# Subject: CN=CommScope Public Trust ECC Root-01,O=CommScope,C=US +# Not Valid Before: Wed Apr 28 17:35:43 2021 +# Not Valid After : Sat Apr 28 17:35:42 2046 +# Fingerprint (SHA-256): 11:43:7C:DA:7B:B4:5E:41:36:5F:45:B3:9A:38:98:6B:0D:E0:0D:EF:34:8E:0C:7B:B0:87:36:33:80:0B:C3:8B +# Fingerprint (SHA1): 07:86:C0:D8:DD:8E:C0:80:98:06:98:D0:58:7A:EF:DE:A6:CC:A2:5D +CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "CommScope Public Trust ECC Root-01" +CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 +CKA_SUBJECT MULTILINE_OCTAL +\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\022\060\020\006\003\125\004\012\014\011\103\157\155\155\123\143 +\157\160\145\061\053\060\051\006\003\125\004\003\014\042\103\157 +\155\155\123\143\157\160\145\040\120\165\142\154\151\143\040\124 +\162\165\163\164\040\105\103\103\040\122\157\157\164\055\060\061 +END +CKA_ID UTF8 "0" +CKA_ISSUER MULTILINE_OCTAL +\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\022\060\020\006\003\125\004\012\014\011\103\157\155\155\123\143 +\157\160\145\061\053\060\051\006\003\125\004\003\014\042\103\157 +\155\155\123\143\157\160\145\040\120\165\142\154\151\143\040\124 +\162\165\163\164\040\105\103\103\040\122\157\157\164\055\060\061 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\024\103\160\202\167\317\115\135\064\361\312\256\062\057\067 +\367\364\177\165\240\236 +END +CKA_VALUE MULTILINE_OCTAL +\060\202\002\035\060\202\001\243\240\003\002\001\002\002\024\103 +\160\202\167\317\115\135\064\361\312\256\062\057\067\367\364\177 +\165\240\236\060\012\006\010\052\206\110\316\075\004\003\003\060 +\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061\022 +\060\020\006\003\125\004\012\014\011\103\157\155\155\123\143\157 +\160\145\061\053\060\051\006\003\125\004\003\014\042\103\157\155 +\155\123\143\157\160\145\040\120\165\142\154\151\143\040\124\162 +\165\163\164\040\105\103\103\040\122\157\157\164\055\060\061\060 +\036\027\015\062\061\060\064\062\070\061\067\063\065\064\063\132 +\027\015\064\066\060\064\062\070\061\067\063\065\064\062\132\060 +\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061\022 +\060\020\006\003\125\004\012\014\011\103\157\155\155\123\143\157 +\160\145\061\053\060\051\006\003\125\004\003\014\042\103\157\155 +\155\123\143\157\160\145\040\120\165\142\154\151\143\040\124\162 +\165\163\164\040\105\103\103\040\122\157\157\164\055\060\061\060 +\166\060\020\006\007\052\206\110\316\075\002\001\006\005\053\201 +\004\000\042\003\142\000\004\113\066\351\256\127\136\250\160\327 +\320\217\164\142\167\303\136\172\252\345\266\242\361\170\375\002 +\176\127\335\221\171\234\154\271\122\210\124\274\057\004\276\270 +\315\366\020\321\051\354\265\320\240\303\360\211\160\031\273\121 +\145\305\103\234\303\233\143\235\040\203\076\006\013\246\102\104 +\205\021\247\112\072\055\351\326\150\057\110\116\123\053\007\077 +\115\275\271\254\167\071\127\243\102\060\100\060\017\006\003\125 +\035\023\001\001\377\004\005\060\003\001\001\377\060\016\006\003 +\125\035\017\001\001\377\004\004\003\002\001\006\060\035\006\003 +\125\035\016\004\026\004\024\216\007\142\300\120\335\306\031\006 +\000\106\164\004\367\363\256\175\165\115\060\060\012\006\010\052 +\206\110\316\075\004\003\003\003\150\000\060\145\002\061\000\234 +\063\337\101\343\043\250\102\066\046\227\065\134\173\353\333\113 +\370\252\213\163\125\025\134\254\170\051\017\272\041\330\304\240 +\330\321\003\335\155\321\071\075\304\223\140\322\343\162\262\002 +\060\174\305\176\210\323\120\365\036\045\350\372\116\165\346\130 +\226\244\065\137\033\145\352\141\232\160\043\265\015\243\233\222 +\122\157\151\240\214\215\112\320\356\213\016\313\107\216\320\215 +\021 +END +CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE +CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE +CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE + +# Trust for "CommScope Public Trust ECC Root-01" +# Issuer: CN=CommScope Public Trust ECC Root-01,O=CommScope,C=US +# Serial Number:43:70:82:77:cf:4d:5d:34:f1:ca:ae:32:2f:37:f7:f4:7f:75:a0:9e +# Subject: CN=CommScope Public Trust ECC Root-01,O=CommScope,C=US +# Not Valid Before: Wed Apr 28 17:35:43 2021 +# Not Valid After : Sat Apr 28 17:35:42 2046 +# Fingerprint (SHA-256): 11:43:7C:DA:7B:B4:5E:41:36:5F:45:B3:9A:38:98:6B:0D:E0:0D:EF:34:8E:0C:7B:B0:87:36:33:80:0B:C3:8B +# Fingerprint (SHA1): 07:86:C0:D8:DD:8E:C0:80:98:06:98:D0:58:7A:EF:DE:A6:CC:A2:5D +CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "CommScope Public Trust ECC Root-01" +CKA_CERT_SHA1_HASH MULTILINE_OCTAL +\007\206\300\330\335\216\300\200\230\006\230\320\130\172\357\336 +\246\314\242\135 +END +CKA_CERT_MD5_HASH MULTILINE_OCTAL +\072\100\247\374\003\214\234\070\171\057\072\242\154\266\012\026 +END +CKA_ISSUER MULTILINE_OCTAL +\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\022\060\020\006\003\125\004\012\014\011\103\157\155\155\123\143 +\157\160\145\061\053\060\051\006\003\125\004\003\014\042\103\157 +\155\155\123\143\157\160\145\040\120\165\142\154\151\143\040\124 +\162\165\163\164\040\105\103\103\040\122\157\157\164\055\060\061 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\024\103\160\202\167\317\115\135\064\361\312\256\062\057\067 +\367\364\177\165\240\236 +END +CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE + +# +# Certificate "CommScope Public Trust ECC Root-02" +# +# Issuer: CN=CommScope Public Trust ECC Root-02,O=CommScope,C=US +# Serial Number:28:fd:99:60:41:47:a6:01:3a:ca:14:7b:1f:ef:f9:68:08:83:5d:7d +# Subject: CN=CommScope Public Trust ECC Root-02,O=CommScope,C=US +# Not Valid Before: Wed Apr 28 17:44:54 2021 +# Not Valid After : Sat Apr 28 17:44:53 2046 +# Fingerprint (SHA-256): 2F:FB:7F:81:3B:BB:B3:C8:9A:B4:E8:16:2D:0F:16:D7:15:09:A8:30:CC:9D:73:C2:62:E5:14:08:75:D1:AD:4A +# Fingerprint (SHA1): 3C:3F:EF:57:0F:FE:65:93:86:9E:A0:FE:B0:F6:ED:8E:D1:13:C7:E5 +CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "CommScope Public Trust ECC Root-02" +CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 +CKA_SUBJECT MULTILINE_OCTAL +\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\022\060\020\006\003\125\004\012\014\011\103\157\155\155\123\143 +\157\160\145\061\053\060\051\006\003\125\004\003\014\042\103\157 +\155\155\123\143\157\160\145\040\120\165\142\154\151\143\040\124 +\162\165\163\164\040\105\103\103\040\122\157\157\164\055\060\062 +END +CKA_ID UTF8 "0" +CKA_ISSUER MULTILINE_OCTAL +\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\022\060\020\006\003\125\004\012\014\011\103\157\155\155\123\143 +\157\160\145\061\053\060\051\006\003\125\004\003\014\042\103\157 +\155\155\123\143\157\160\145\040\120\165\142\154\151\143\040\124 +\162\165\163\164\040\105\103\103\040\122\157\157\164\055\060\062 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\024\050\375\231\140\101\107\246\001\072\312\024\173\037\357 +\371\150\010\203\135\175 +END +CKA_VALUE MULTILINE_OCTAL +\060\202\002\034\060\202\001\243\240\003\002\001\002\002\024\050 +\375\231\140\101\107\246\001\072\312\024\173\037\357\371\150\010 +\203\135\175\060\012\006\010\052\206\110\316\075\004\003\003\060 +\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061\022 +\060\020\006\003\125\004\012\014\011\103\157\155\155\123\143\157 +\160\145\061\053\060\051\006\003\125\004\003\014\042\103\157\155 +\155\123\143\157\160\145\040\120\165\142\154\151\143\040\124\162 +\165\163\164\040\105\103\103\040\122\157\157\164\055\060\062\060 +\036\027\015\062\061\060\064\062\070\061\067\064\064\065\064\132 +\027\015\064\066\060\064\062\070\061\067\064\064\065\063\132\060 +\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061\022 +\060\020\006\003\125\004\012\014\011\103\157\155\155\123\143\157 +\160\145\061\053\060\051\006\003\125\004\003\014\042\103\157\155 +\155\123\143\157\160\145\040\120\165\142\154\151\143\040\124\162 +\165\163\164\040\105\103\103\040\122\157\157\164\055\060\062\060 +\166\060\020\006\007\052\206\110\316\075\002\001\006\005\053\201 +\004\000\042\003\142\000\004\170\060\201\350\143\036\345\353\161 +\121\017\367\007\007\312\071\231\174\116\325\017\314\060\060\013 +\217\146\223\076\317\275\305\206\275\371\261\267\264\076\264\007 +\310\363\226\061\363\355\244\117\370\243\116\215\051\025\130\270 +\325\157\177\356\154\042\265\260\257\110\105\012\275\250\111\224 +\277\204\103\260\333\204\112\003\043\031\147\152\157\301\156\274 +\006\071\067\321\210\042\367\243\102\060\100\060\017\006\003\125 +\035\023\001\001\377\004\005\060\003\001\001\377\060\016\006\003 +\125\035\017\001\001\377\004\004\003\002\001\006\060\035\006\003 +\125\035\016\004\026\004\024\346\030\165\377\357\140\336\204\244 +\365\106\307\336\112\125\343\062\066\171\365\060\012\006\010\052 +\206\110\316\075\004\003\003\003\147\000\060\144\002\060\046\163 +\111\172\266\253\346\111\364\175\122\077\324\101\004\256\200\103 +\203\145\165\271\205\200\070\073\326\157\344\223\206\253\217\347 +\211\310\177\233\176\153\012\022\125\141\252\021\340\171\002\060 +\167\350\061\161\254\074\161\003\326\204\046\036\024\270\363\073 +\073\336\355\131\374\153\114\060\177\131\316\105\351\163\140\025 +\232\114\360\346\136\045\042\025\155\302\207\131\320\262\216\152 +END +CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE +CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE +CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE + +# Trust for "CommScope Public Trust ECC Root-02" +# Issuer: CN=CommScope Public Trust ECC Root-02,O=CommScope,C=US +# Serial Number:28:fd:99:60:41:47:a6:01:3a:ca:14:7b:1f:ef:f9:68:08:83:5d:7d +# Subject: CN=CommScope Public Trust ECC Root-02,O=CommScope,C=US +# Not Valid Before: Wed Apr 28 17:44:54 2021 +# Not Valid After : Sat Apr 28 17:44:53 2046 +# Fingerprint (SHA-256): 2F:FB:7F:81:3B:BB:B3:C8:9A:B4:E8:16:2D:0F:16:D7:15:09:A8:30:CC:9D:73:C2:62:E5:14:08:75:D1:AD:4A +# Fingerprint (SHA1): 3C:3F:EF:57:0F:FE:65:93:86:9E:A0:FE:B0:F6:ED:8E:D1:13:C7:E5 +CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "CommScope Public Trust ECC Root-02" +CKA_CERT_SHA1_HASH MULTILINE_OCTAL +\074\077\357\127\017\376\145\223\206\236\240\376\260\366\355\216 +\321\023\307\345 +END +CKA_CERT_MD5_HASH MULTILINE_OCTAL +\131\260\104\325\145\115\270\134\125\031\222\002\266\321\224\262 +END +CKA_ISSUER MULTILINE_OCTAL +\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\022\060\020\006\003\125\004\012\014\011\103\157\155\155\123\143 +\157\160\145\061\053\060\051\006\003\125\004\003\014\042\103\157 +\155\155\123\143\157\160\145\040\120\165\142\154\151\143\040\124 +\162\165\163\164\040\105\103\103\040\122\157\157\164\055\060\062 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\024\050\375\231\140\101\107\246\001\072\312\024\173\037\357 +\371\150\010\203\135\175 +END +CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE + +# +# Certificate "CommScope Public Trust RSA Root-01" +# +# Issuer: CN=CommScope Public Trust RSA Root-01,O=CommScope,C=US +# Serial Number:3e:03:49:81:75:16:74:31:8e:4c:ab:d5:c5:90:29:96:c5:39:10:dd +# Subject: CN=CommScope Public Trust RSA Root-01,O=CommScope,C=US +# Not Valid Before: Wed Apr 28 16:45:54 2021 +# Not Valid After : Sat Apr 28 16:45:53 2046 +# Fingerprint (SHA-256): 02:BD:F9:6E:2A:45:DD:9B:F1:8F:C7:E1:DB:DF:21:A0:37:9B:A3:C9:C2:61:03:44:CF:D8:D6:06:FE:C1:ED:81 +# Fingerprint (SHA1): 6D:0A:5F:F7:B4:23:06:B4:85:B3:B7:97:64:FC:AC:75:F5:33:F2:93 +CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "CommScope Public Trust RSA Root-01" +CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 +CKA_SUBJECT MULTILINE_OCTAL +\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\022\060\020\006\003\125\004\012\014\011\103\157\155\155\123\143 +\157\160\145\061\053\060\051\006\003\125\004\003\014\042\103\157 +\155\155\123\143\157\160\145\040\120\165\142\154\151\143\040\124 +\162\165\163\164\040\122\123\101\040\122\157\157\164\055\060\061 +END +CKA_ID UTF8 "0" +CKA_ISSUER MULTILINE_OCTAL +\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\022\060\020\006\003\125\004\012\014\011\103\157\155\155\123\143 +\157\160\145\061\053\060\051\006\003\125\004\003\014\042\103\157 +\155\155\123\143\157\160\145\040\120\165\142\154\151\143\040\124 +\162\165\163\164\040\122\123\101\040\122\157\157\164\055\060\061 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\024\076\003\111\201\165\026\164\061\216\114\253\325\305\220 +\051\226\305\071\020\335 +END +CKA_VALUE MULTILINE_OCTAL +\060\202\005\154\060\202\003\124\240\003\002\001\002\002\024\076 +\003\111\201\165\026\164\061\216\114\253\325\305\220\051\226\305 +\071\020\335\060\015\006\011\052\206\110\206\367\015\001\001\013 +\005\000\060\116\061\013\060\011\006\003\125\004\006\023\002\125 +\123\061\022\060\020\006\003\125\004\012\014\011\103\157\155\155 +\123\143\157\160\145\061\053\060\051\006\003\125\004\003\014\042 +\103\157\155\155\123\143\157\160\145\040\120\165\142\154\151\143 +\040\124\162\165\163\164\040\122\123\101\040\122\157\157\164\055 +\060\061\060\036\027\015\062\061\060\064\062\070\061\066\064\065 +\065\064\132\027\015\064\066\060\064\062\070\061\066\064\065\065 +\063\132\060\116\061\013\060\011\006\003\125\004\006\023\002\125 +\123\061\022\060\020\006\003\125\004\012\014\011\103\157\155\155 +\123\143\157\160\145\061\053\060\051\006\003\125\004\003\014\042 +\103\157\155\155\123\143\157\160\145\040\120\165\142\154\151\143 +\040\124\162\165\163\164\040\122\123\101\040\122\157\157\164\055 +\060\061\060\202\002\042\060\015\006\011\052\206\110\206\367\015 +\001\001\001\005\000\003\202\002\017\000\060\202\002\012\002\202 +\002\001\000\260\110\145\243\015\035\102\343\221\155\235\204\244 +\141\226\022\302\355\303\332\043\064\031\166\366\352\375\125\132 +\366\125\001\123\017\362\314\214\227\117\271\120\313\263\001\104 +\126\226\375\233\050\354\173\164\013\347\102\153\125\316\311\141 +\262\350\255\100\074\272\271\101\012\005\117\033\046\205\217\103 +\265\100\265\205\321\324\161\334\203\101\363\366\105\307\200\242 +\204\120\227\106\316\240\014\304\140\126\004\035\007\133\106\245 +\016\262\113\244\016\245\174\356\370\324\142\003\271\223\152\212 +\024\270\160\370\056\202\106\070\043\016\164\307\153\101\267\320 +\051\243\235\200\260\176\167\223\143\102\373\064\203\073\163\243 +\132\041\066\353\107\372\030\027\331\272\146\302\223\244\217\374 +\135\244\255\374\120\152\225\254\274\044\063\321\275\210\177\206 +\365\365\262\163\052\217\174\257\010\362\032\230\077\251\201\145 +\077\301\214\211\305\226\060\232\012\317\364\324\310\064\355\235 +\057\274\215\070\206\123\356\227\237\251\262\143\224\027\215\017 +\334\146\052\174\122\121\165\313\231\216\350\075\134\277\236\073 +\050\215\203\002\017\251\237\162\342\054\053\263\334\146\227\000 +\100\320\244\124\216\233\135\173\105\066\046\326\162\103\353\317 +\300\352\015\334\316\022\346\175\070\237\005\047\250\227\076\351 +\121\306\154\005\050\301\002\017\351\030\155\354\275\234\006\324 +\247\111\364\124\005\153\154\060\361\353\003\325\352\075\152\166 +\302\313\032\050\111\115\177\144\340\372\053\332\163\203\201\377 +\221\003\275\224\273\344\270\216\234\062\143\315\237\273\150\201 +\261\204\133\257\066\277\167\356\035\177\367\111\233\122\354\322 +\167\132\175\221\235\115\302\071\055\344\272\202\370\157\362\116 +\036\017\116\346\077\131\245\043\334\075\207\250\050\130\050\321 +\361\033\066\333\117\304\377\341\214\133\162\214\307\046\003\047 +\243\071\012\001\252\300\262\061\140\203\042\241\117\022\011\001 +\021\257\064\324\317\327\256\142\323\005\007\264\061\165\340\015 +\155\127\117\151\207\371\127\251\272\025\366\310\122\155\241\313 +\234\037\345\374\170\250\065\232\237\101\024\316\245\264\316\224 +\010\034\011\255\126\345\332\266\111\232\112\352\143\030\123\234 +\054\056\303\002\003\001\000\001\243\102\060\100\060\017\006\003 +\125\035\023\001\001\377\004\005\060\003\001\001\377\060\016\006 +\003\125\035\017\001\001\377\004\004\003\002\001\006\060\035\006 +\003\125\035\016\004\026\004\024\067\135\246\232\164\062\302\302 +\371\307\246\025\020\131\270\344\375\345\270\155\060\015\006\011 +\052\206\110\206\367\015\001\001\013\005\000\003\202\002\001\000 +\257\247\317\336\377\340\275\102\215\115\345\042\226\337\150\352 +\175\115\052\175\320\255\075\026\134\103\347\175\300\206\350\172 +\065\143\361\314\201\310\306\013\350\056\122\065\244\246\111\220 +\143\121\254\064\254\005\073\127\000\351\323\142\323\331\051\325 +\124\276\034\020\221\234\262\155\376\131\375\171\367\352\126\320 +\236\150\124\102\217\046\122\342\114\337\057\227\246\057\322\007 +\230\250\363\140\135\113\232\130\127\210\357\202\345\372\257\154 +\201\113\222\217\100\232\223\106\131\313\137\170\026\261\147\076 +\102\013\337\050\331\260\255\230\040\276\103\174\321\136\032\011 +\027\044\215\173\135\225\351\253\301\140\253\133\030\144\200\373 +\255\340\006\175\035\312\131\270\363\170\051\147\306\126\035\257 +\266\265\164\052\166\241\077\373\165\060\237\224\136\073\245\140 +\363\313\134\014\342\016\311\140\370\311\037\026\212\046\335\347 +\047\177\353\045\246\212\275\270\055\066\020\232\261\130\115\232 +\150\117\140\124\345\366\106\023\216\210\254\274\041\102\022\255 +\306\112\211\175\233\301\330\055\351\226\003\364\242\164\014\274 +\000\035\277\326\067\045\147\264\162\213\257\205\275\352\052\003 +\217\314\373\074\104\044\202\342\001\245\013\131\266\064\215\062 +\013\022\015\353\047\302\375\101\327\100\074\162\106\051\300\214 +\352\272\017\361\006\223\056\367\234\250\364\140\076\243\361\070 +\136\216\023\301\263\072\227\207\077\222\312\170\251\034\257\320 +\260\033\046\036\276\160\354\172\365\063\230\352\134\377\053\013 +\004\116\103\335\143\176\016\247\116\170\003\225\076\324\055\060 +\225\021\020\050\056\277\240\002\076\377\136\131\323\005\016\225 +\137\123\105\357\153\207\325\110\315\026\246\226\203\341\337\263 +\006\363\301\024\333\247\354\034\213\135\220\220\015\162\121\347 +\141\371\024\312\257\203\217\277\257\261\012\131\135\334\134\327 +\344\226\255\133\140\035\332\256\227\262\071\331\006\365\166\000 +\023\370\150\114\041\260\065\304\334\125\262\311\301\101\132\034 +\211\300\214\157\164\240\153\063\115\265\001\050\375\255\255\211 +\027\073\246\232\204\274\353\214\352\304\161\044\250\272\051\371 +\010\262\047\126\065\062\137\352\071\373\061\232\325\031\314\360 +END +CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE +CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE +CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE + +# Trust for "CommScope Public Trust RSA Root-01" +# Issuer: CN=CommScope Public Trust RSA Root-01,O=CommScope,C=US +# Serial Number:3e:03:49:81:75:16:74:31:8e:4c:ab:d5:c5:90:29:96:c5:39:10:dd +# Subject: CN=CommScope Public Trust RSA Root-01,O=CommScope,C=US +# Not Valid Before: Wed Apr 28 16:45:54 2021 +# Not Valid After : Sat Apr 28 16:45:53 2046 +# Fingerprint (SHA-256): 02:BD:F9:6E:2A:45:DD:9B:F1:8F:C7:E1:DB:DF:21:A0:37:9B:A3:C9:C2:61:03:44:CF:D8:D6:06:FE:C1:ED:81 +# Fingerprint (SHA1): 6D:0A:5F:F7:B4:23:06:B4:85:B3:B7:97:64:FC:AC:75:F5:33:F2:93 +CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "CommScope Public Trust RSA Root-01" +CKA_CERT_SHA1_HASH MULTILINE_OCTAL +\155\012\137\367\264\043\006\264\205\263\267\227\144\374\254\165 +\365\063\362\223 +END +CKA_CERT_MD5_HASH MULTILINE_OCTAL +\016\264\025\274\207\143\135\135\002\163\324\046\070\150\163\330 +END +CKA_ISSUER MULTILINE_OCTAL +\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\022\060\020\006\003\125\004\012\014\011\103\157\155\155\123\143 +\157\160\145\061\053\060\051\006\003\125\004\003\014\042\103\157 +\155\155\123\143\157\160\145\040\120\165\142\154\151\143\040\124 +\162\165\163\164\040\122\123\101\040\122\157\157\164\055\060\061 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\024\076\003\111\201\165\026\164\061\216\114\253\325\305\220 +\051\226\305\071\020\335 +END +CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE + +# +# Certificate "CommScope Public Trust RSA Root-02" +# +# Issuer: CN=CommScope Public Trust RSA Root-02,O=CommScope,C=US +# Serial Number:54:16:bf:3b:7e:39:95:71:8d:d1:aa:00:a5:86:0d:2b:8f:7a:05:4e +# Subject: CN=CommScope Public Trust RSA Root-02,O=CommScope,C=US +# Not Valid Before: Wed Apr 28 17:16:43 2021 +# Not Valid After : Sat Apr 28 17:16:42 2046 +# Fingerprint (SHA-256): FF:E9:43:D7:93:42:4B:4F:7C:44:0C:1C:3D:64:8D:53:63:F3:4B:82:DC:87:AA:7A:9F:11:8F:C5:DE:E1:01:F1 +# Fingerprint (SHA1): EA:B0:E2:52:1B:89:93:4C:11:68:F2:D8:9A:AC:22:4C:A3:8A:57:AE +CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "CommScope Public Trust RSA Root-02" +CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 +CKA_SUBJECT MULTILINE_OCTAL +\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\022\060\020\006\003\125\004\012\014\011\103\157\155\155\123\143 +\157\160\145\061\053\060\051\006\003\125\004\003\014\042\103\157 +\155\155\123\143\157\160\145\040\120\165\142\154\151\143\040\124 +\162\165\163\164\040\122\123\101\040\122\157\157\164\055\060\062 +END +CKA_ID UTF8 "0" +CKA_ISSUER MULTILINE_OCTAL +\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\022\060\020\006\003\125\004\012\014\011\103\157\155\155\123\143 +\157\160\145\061\053\060\051\006\003\125\004\003\014\042\103\157 +\155\155\123\143\157\160\145\040\120\165\142\154\151\143\040\124 +\162\165\163\164\040\122\123\101\040\122\157\157\164\055\060\062 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\024\124\026\277\073\176\071\225\161\215\321\252\000\245\206 +\015\053\217\172\005\116 +END +CKA_VALUE MULTILINE_OCTAL +\060\202\005\154\060\202\003\124\240\003\002\001\002\002\024\124 +\026\277\073\176\071\225\161\215\321\252\000\245\206\015\053\217 +\172\005\116\060\015\006\011\052\206\110\206\367\015\001\001\013 +\005\000\060\116\061\013\060\011\006\003\125\004\006\023\002\125 +\123\061\022\060\020\006\003\125\004\012\014\011\103\157\155\155 +\123\143\157\160\145\061\053\060\051\006\003\125\004\003\014\042 +\103\157\155\155\123\143\157\160\145\040\120\165\142\154\151\143 +\040\124\162\165\163\164\040\122\123\101\040\122\157\157\164\055 +\060\062\060\036\027\015\062\061\060\064\062\070\061\067\061\066 +\064\063\132\027\015\064\066\060\064\062\070\061\067\061\066\064 +\062\132\060\116\061\013\060\011\006\003\125\004\006\023\002\125 +\123\061\022\060\020\006\003\125\004\012\014\011\103\157\155\155 +\123\143\157\160\145\061\053\060\051\006\003\125\004\003\014\042 +\103\157\155\155\123\143\157\160\145\040\120\165\142\154\151\143 +\040\124\162\165\163\164\040\122\123\101\040\122\157\157\164\055 +\060\062\060\202\002\042\060\015\006\011\052\206\110\206\367\015 +\001\001\001\005\000\003\202\002\017\000\060\202\002\012\002\202 +\002\001\000\341\372\016\373\150\000\022\310\115\325\254\042\304 +\065\001\073\305\124\345\131\166\143\245\177\353\301\304\152\230 +\275\062\215\027\200\353\135\272\321\142\075\045\043\031\065\024 +\351\177\211\247\033\142\074\326\120\347\064\225\003\062\261\264 +\223\042\075\247\342\261\355\346\173\116\056\207\233\015\063\165 +\012\336\252\065\347\176\345\066\230\242\256\045\236\225\263\062 +\226\244\053\130\036\357\077\376\142\064\110\121\321\264\215\102 +\255\140\332\111\152\225\160\335\322\000\342\314\127\143\002\173 +\226\335\111\227\133\222\116\225\323\371\313\051\037\030\112\370 +\001\052\322\143\011\156\044\351\211\322\345\307\042\114\334\163 +\206\107\000\252\015\210\216\256\205\175\112\351\273\063\117\016 +\122\160\235\225\343\174\155\226\133\055\075\137\241\203\106\135 +\266\343\045\270\174\247\031\200\034\352\145\103\334\221\171\066 +\054\164\174\362\147\006\311\211\311\333\277\332\150\277\043\355 +\334\153\255\050\203\171\057\354\070\245\015\067\001\147\047\232 +\351\063\331\063\137\067\241\305\360\253\075\372\170\260\347\054 +\237\366\076\237\140\340\357\110\351\220\105\036\005\121\170\032 +\054\022\054\134\050\254\015\242\043\236\064\217\005\346\242\063 +\316\021\167\023\324\016\244\036\102\037\206\315\160\376\331\056 +\025\075\035\273\270\362\123\127\333\314\306\164\051\234\030\263 +\066\165\070\056\017\124\241\370\222\037\211\226\117\273\324\356 +\235\351\073\066\102\265\012\073\052\324\144\171\066\020\341\371 +\221\003\053\173\040\124\315\015\031\032\310\101\062\064\321\260 +\231\341\220\036\001\100\066\265\267\372\251\345\167\165\244\042 +\201\135\260\213\344\047\022\017\124\210\306\333\205\164\346\267 +\300\327\246\051\372\333\336\363\223\227\047\004\125\057\012\157 +\067\305\075\023\257\012\000\251\054\213\034\201\050\327\357\206 +\061\251\256\362\156\270\312\152\054\124\107\330\052\210\056\257 +\301\007\020\170\254\021\242\057\102\360\067\305\362\270\126\335 +\016\142\055\316\055\126\176\125\362\247\104\366\053\062\364\043 +\250\107\350\324\052\001\170\317\152\303\067\250\236\145\322\054 +\345\372\272\063\301\006\104\366\346\317\245\015\247\146\010\064 +\212\054\363\002\003\001\000\001\243\102\060\100\060\017\006\003 +\125\035\023\001\001\377\004\005\060\003\001\001\377\060\016\006 +\003\125\035\017\001\001\377\004\004\003\002\001\006\060\035\006 +\003\125\035\016\004\026\004\024\107\320\347\261\042\377\235\054 +\365\331\127\140\263\261\261\160\225\357\141\172\060\015\006\011 +\052\206\110\206\367\015\001\001\013\005\000\003\202\002\001\000 +\206\151\261\115\057\351\237\117\042\223\150\216\344\041\231\243 +\316\105\123\033\163\104\123\000\201\141\315\061\343\010\272\201 +\050\050\172\222\271\266\250\310\103\236\307\023\046\115\302\330 +\345\125\234\222\135\120\330\302\053\333\376\346\250\227\317\122 +\072\044\303\145\144\134\107\061\243\145\065\023\303\223\271\367 +\371\121\227\273\244\360\142\207\305\326\006\323\227\203\040\251 +\176\273\266\041\302\245\015\204\000\341\362\047\020\203\272\335 +\003\201\325\335\150\303\146\020\310\321\166\264\263\157\051\236 +\000\371\302\051\365\261\223\031\122\151\032\054\114\240\213\340 +\025\232\061\057\323\210\225\131\156\345\304\263\120\310\024\010 +\112\233\213\023\203\261\244\162\262\073\166\063\101\334\334\252 +\246\007\157\035\044\022\237\310\166\275\057\331\216\364\054\356 +\267\322\070\020\044\066\121\057\343\134\135\201\041\247\332\273 +\116\377\346\007\250\376\271\015\047\154\273\160\132\125\172\023 +\351\361\052\111\151\307\137\207\127\114\103\171\155\072\145\351 +\060\134\101\356\353\167\245\163\022\210\350\277\175\256\345\304 +\250\037\015\216\034\155\120\002\117\046\030\103\336\217\125\205 +\261\013\067\005\140\311\125\071\022\004\241\052\317\161\026\237 +\066\121\111\277\160\073\236\147\234\373\173\171\311\071\034\170 +\254\167\221\124\232\270\165\012\201\122\227\343\146\141\153\355 +\076\070\036\226\141\125\341\221\124\214\355\214\044\037\201\311 +\020\232\163\231\053\026\116\162\000\077\124\033\370\215\272\213 +\347\024\326\266\105\117\140\354\226\256\303\057\002\116\135\235 +\226\111\162\000\262\253\165\134\017\150\133\035\145\302\137\063 +\017\036\017\360\073\206\365\260\116\273\234\367\352\045\005\334 +\255\242\233\113\027\001\276\102\337\065\041\035\255\253\256\364 +\277\256\037\033\323\342\073\374\263\162\163\034\233\050\220\211 +\023\075\035\301\000\107\011\226\232\070\033\335\261\317\015\302 +\264\104\363\226\225\316\062\072\217\064\234\340\027\307\136\316 +\256\015\333\207\070\345\077\133\375\233\031\341\061\101\172\160 +\252\043\153\001\341\105\114\315\224\316\073\236\055\347\210\002 +\042\364\156\350\310\354\326\074\363\271\262\327\167\172\254\173 +END +CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE +CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE +CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE + +# Trust for "CommScope Public Trust RSA Root-02" +# Issuer: CN=CommScope Public Trust RSA Root-02,O=CommScope,C=US +# Serial Number:54:16:bf:3b:7e:39:95:71:8d:d1:aa:00:a5:86:0d:2b:8f:7a:05:4e +# Subject: CN=CommScope Public Trust RSA Root-02,O=CommScope,C=US +# Not Valid Before: Wed Apr 28 17:16:43 2021 +# Not Valid After : Sat Apr 28 17:16:42 2046 +# Fingerprint (SHA-256): FF:E9:43:D7:93:42:4B:4F:7C:44:0C:1C:3D:64:8D:53:63:F3:4B:82:DC:87:AA:7A:9F:11:8F:C5:DE:E1:01:F1 +# Fingerprint (SHA1): EA:B0:E2:52:1B:89:93:4C:11:68:F2:D8:9A:AC:22:4C:A3:8A:57:AE +CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "CommScope Public Trust RSA Root-02" +CKA_CERT_SHA1_HASH MULTILINE_OCTAL +\352\260\342\122\033\211\223\114\021\150\362\330\232\254\042\114 +\243\212\127\256 +END +CKA_CERT_MD5_HASH MULTILINE_OCTAL +\341\051\371\142\173\166\342\226\155\363\324\327\017\256\037\252 +END +CKA_ISSUER MULTILINE_OCTAL +\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\022\060\020\006\003\125\004\012\014\011\103\157\155\155\123\143 +\157\160\145\061\053\060\051\006\003\125\004\003\014\042\103\157 +\155\155\123\143\157\160\145\040\120\165\142\154\151\143\040\124 +\162\165\163\164\040\122\123\101\040\122\157\157\164\055\060\062 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\024\124\026\277\073\176\071\225\161\215\321\252\000\245\206 +\015\053\217\172\005\116 +END +CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE diff --git a/tools/checkimports.py b/tools/checkimports.py index b94919e3cc47e4..ed003d8b6b98cd 100755 --- a/tools/checkimports.py +++ b/tools/checkimports.py @@ -8,9 +8,9 @@ import itertools def do_exist(file_name, lines, imported): - if not any(not re.match('using \w+::{0};'.format(imported), line) and - re.search('\\b{0}\\b'.format(imported), line) for line in lines): - print('File "{0}" does not use "{1}"'.format(file_name, imported)) + if not any(not re.match(fr'using \w+::{imported};', line) and + re.search(fr'\b{imported}\b', line) for line in lines): + print(f'File "{file_name}" does not use "{imported}"') return False return True @@ -27,18 +27,16 @@ def is_valid(file_name): usings.append(matches.group(1)) importeds.append(matches.group(2)) - valid = all([do_exist(file_name, lines, imported) for imported in importeds]) + valid = all(do_exist(file_name, lines, imported) for imported in importeds) sorted_usings = sorted(usings, key=lambda x: x.lower()) if sorted_usings != usings: - print("using statements aren't sorted in '{0}'.".format(file_name)) + print(f"using statements aren't sorted in '{file_name}'.") for num, actual, expected in zip(line_numbers, usings, sorted_usings): if actual != expected: - print('\tLine {0}: Actual: {1}, Expected: {2}' - .format(num, actual, expected)) + print(f'\tLine {num}: Actual: {actual}, Expected: {expected}') return False - else: - return valid + return valid if __name__ == '__main__': if len(sys.argv) > 1: diff --git a/tools/dep_updaters/update-acorn-walk.sh b/tools/dep_updaters/update-acorn-walk.sh index ea49a1ec5ad3e7..9967d63f0c6e2c 100755 --- a/tools/dep_updaters/update-acorn-walk.sh +++ b/tools/dep_updaters/update-acorn-walk.sh @@ -7,13 +7,14 @@ set -ex -ROOT=$(cd "$(dirname "$0")/../.." && pwd) -[ -z "$NODE" ] && NODE="$ROOT/out/Release/node" +BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) +[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" [ -x "$NODE" ] || NODE=$(command -v node) -NPM="$ROOT/deps/npm/bin/npm-cli.js" +NPM="$BASE_DIR/deps/npm/bin/npm-cli.js" +DEPS_DIR="$BASE_DIR/deps" # shellcheck disable=SC1091 -. "$ROOT/tools/dep_updaters/utils.sh" +. "$BASE_DIR/tools/dep_updaters/utils.sh" NEW_VERSION=$("$NODE" "$NPM" view acorn-walk dist-tags.latest) CURRENT_VERSION=$("$NODE" -p "require('./deps/acorn/acorn-walk/package.json').version") @@ -23,21 +24,33 @@ compare_dependency_version "acorn-walk" "$NEW_VERSION" "$CURRENT_VERSION" cd "$( dirname "$0" )/../.." || exit -rm -rf deps/acorn/acorn-walk +echo "Making temporary workspace..." -( - rm -rf acorn-walk-tmp - mkdir acorn-walk-tmp - cd acorn-walk-tmp || exit +WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') - "$NODE" "$NPM" init --yes +cleanup () { + EXIT_CODE=$? + [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" + exit $EXIT_CODE +} - "$NODE" "$NPM" install --global-style --no-bin-links --ignore-scripts "acorn-walk@$NEW_VERSION" -) +trap cleanup INT TERM EXIT -mv acorn-walk-tmp/node_modules/acorn-walk deps/acorn +cd "$WORKSPACE" -rm -rf acorn-walk-tmp/ +echo "Fetching acorn-walk source archive..." + +"$NODE" "$NPM" pack "acorn-walk@$NEW_VERSION" + +ACORN_WALK_TGZ="acorn-walk-$NEW_VERSION.tgz" + +log_and_verify_sha256sum "acorn-walk" "$ACORN_WALK_TGZ" + +rm -r "$DEPS_DIR/acorn/acorn-walk"/* + +tar -xf "$ACORN_WALK_TGZ" + +mv package/* "$DEPS_DIR/acorn/acorn-walk" echo "All done!" echo "" @@ -47,6 +60,7 @@ echo "$ git add -A deps/acorn-walk" echo "$ git commit -m \"deps: update acorn-walk to $NEW_VERSION\"" echo "" -# The last line of the script should always print the new version, -# as we need to add it to $GITHUB_ENV variable. -echo "NEW_VERSION=$NEW_VERSION" +# Update the version number on maintaining-dependencies.md +# and print the new version as the last line of the script as we need +# to add it to $GITHUB_ENV variable +finalize_version_update "acorn-walk" "$NEW_VERSION" diff --git a/tools/dep_updaters/update-acorn.sh b/tools/dep_updaters/update-acorn.sh index 53d85156653d9c..52c6974505beb0 100755 --- a/tools/dep_updaters/update-acorn.sh +++ b/tools/dep_updaters/update-acorn.sh @@ -7,13 +7,14 @@ set -ex -ROOT=$(cd "$(dirname "$0")/../.." && pwd) -[ -z "$NODE" ] && NODE="$ROOT/out/Release/node" +BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) +[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" [ -x "$NODE" ] || NODE=$(command -v node) -NPM="$ROOT/deps/npm/bin/npm-cli.js" +NPM="$BASE_DIR/deps/npm/bin/npm-cli.js" +DEPS_DIR="$BASE_DIR/deps" # shellcheck disable=SC1091 -. "$ROOT/tools/dep_updaters/utils.sh" +. "$BASE_DIR/tools/dep_updaters/utils.sh" NEW_VERSION=$("$NODE" "$NPM" view acorn dist-tags.latest) CURRENT_VERSION=$("$NODE" -p "require('./deps/acorn/acorn/package.json').version") @@ -23,20 +24,36 @@ compare_dependency_version "acorn" "$NEW_VERSION" "$CURRENT_VERSION" cd "$( dirname "$0" )/../.." || exit -rm -rf deps/acorn/acorn +echo "Making temporary workspace..." -( - rm -rf acorn-tmp - mkdir acorn-tmp - cd acorn-tmp || exit +WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') - "$NODE" "$NPM" init --yes +cleanup () { + EXIT_CODE=$? + [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" + exit $EXIT_CODE +} - "$NODE" "$NPM" install --global-style --no-bin-links --ignore-scripts "acorn@$NEW_VERSION" -) +trap cleanup INT TERM EXIT + +cd "$WORKSPACE" + +echo "Fetching acorn source archive..." + +"$NODE" "$NPM" pack "acorn@$NEW_VERSION" + +ACORN_TGZ="acorn-$NEW_VERSION.tgz" + +log_and_verify_sha256sum "acorn" "$ACORN_TGZ" + +rm -r "$DEPS_DIR/acorn/acorn"/* + +tar -xf "$ACORN_TGZ" + +mv package/* "$DEPS_DIR/acorn/acorn" # update version information in src/acorn_version.h -cat > "$ROOT/src/acorn_version.h" < "$BASE_DIR/src/acorn_version.h" < "$ROOT/src/acorn_version.h" < /dev/null || mktemp -d -t 'tmp') - "$NODE" "$NPM" init --yes +cleanup () { + EXIT_CODE=$? + [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" + exit $EXIT_CODE +} - "$NODE" "$NPM" install --global-style --no-bin-links --ignore-scripts "minimatch@$NEW_VERSION" - cd node_modules/minimatch - "$NODE" "$NPM" exec --package=esbuild@0.17.15 --yes -- esbuild ./dist/cjs/index.js --bundle --platform=node --outfile=minimatch.js -) +trap cleanup INT TERM EXIT -ls -l minimatch-tmp -mv minimatch-tmp/node_modules/minimatch deps/minimatch/src -mv deps/minimatch/src/minimatch.js deps/minimatch/index.js -cp deps/minimatch/src/LICENSE deps/minimatch/LICENSE +cd "$WORKSPACE" -rm -rf minimatch-tmp/ +echo "Fetching minimatch source archive..." + +"$NODE" "$NPM" pack "minimatch@$NEW_VERSION" + +MINIMATCH_TGZ="minimatch-$NEW_VERSION.tgz" + +log_and_verify_sha256sum "minimatch" "$MINIMATCH_TGZ" + +rm -r "$DEPS_DIR/minimatch"/* + +tar -xf "$MINIMATCH_TGZ" + +cd package + +"$NODE" "$NPM" install esbuild --save-dev + +"$NODE" "$NPM" pkg set scripts.node-build="esbuild ./dist/cjs/index.js --bundle --platform=node --outfile=index.js" + +"$NODE" "$NPM" run node-build + +rm -rf node_modules + +mv ./* "$DEPS_DIR/minimatch" + +echo "All done!" +echo "" +echo "Please git add minimatch, commit the new version:" +echo "" +echo "$ git add -A deps/minimatch" +echo "$ git commit -m \"deps: update minimatch to $NEW_VERSION\"" +echo "" # Update the version number on maintaining-dependencies.md # and print the new version as the last line of the script as we need diff --git a/tools/dep_updaters/update-nghttp2.sh b/tools/dep_updaters/update-nghttp2.sh index 4c375c979691f6..ccb36caae13d4d 100755 --- a/tools/dep_updaters/update-nghttp2.sh +++ b/tools/dep_updaters/update-nghttp2.sh @@ -73,6 +73,9 @@ cp "$DEPS_DIR/nghttp2/lib/includes/config.h" "$WORKSPACE/nghttp2/lib/includes" echo "Copying existing gyp files" cp "$DEPS_DIR/nghttp2/nghttp2.gyp" "$WORKSPACE/nghttp2" +echo "Copying existing GN files" +cp "$DEPS_DIR/nghttp2/"*.gn "$DEPS_DIR/nghttp2/"*.gni "$WORKSPACE/nghttp2" + echo "Replacing existing nghttp2" rm -rf "$DEPS_DIR/nghttp2" mv "$WORKSPACE/nghttp2" "$DEPS_DIR/" diff --git a/tools/dep_updaters/update-nghttp3.sh b/tools/dep_updaters/update-nghttp3.sh index 539ee27a76012b..50a17e32f8a291 100755 --- a/tools/dep_updaters/update-nghttp3.sh +++ b/tools/dep_updaters/update-nghttp3.sh @@ -59,7 +59,7 @@ autoreconf -i ./configure --prefix="$PWD/build" --enable-lib-only -cp -R lib/* "$DEPS_DIR/ngtcp2/nghttp3/lib/" +replace_dir "$DEPS_DIR/ngtcp2/nghttp3/lib" "lib" # Update the version number on maintaining-dependencies.md # and print the new version as the last line of the script as we need diff --git a/tools/dep_updaters/update-ngtcp2.sh b/tools/dep_updaters/update-ngtcp2.sh index a77be7efa8558f..b892ecbab2c864 100755 --- a/tools/dep_updaters/update-ngtcp2.sh +++ b/tools/dep_updaters/update-ngtcp2.sh @@ -63,9 +63,8 @@ autoreconf -i ./configure --prefix="$PWD/build" --enable-lib-only -cp -R lib/* "$DEPS_DIR/ngtcp2/ngtcp2/lib/" - -cp -R crypto/* "$DEPS_DIR/ngtcp2/ngtcp2/crypto/" +replace_dir "$DEPS_DIR/ngtcp2/ngtcp2/lib" "lib" +replace_dir "$DEPS_DIR/ngtcp2/ngtcp2/crypto" "crypto" # Update the version number on maintaining-dependencies.md # and print the new version as the last line of the script as we need diff --git a/tools/dep_updaters/update-openssl.sh b/tools/dep_updaters/update-openssl.sh index 850c7c6f7c5d96..bef379b707a04e 100755 --- a/tools/dep_updaters/update-openssl.sh +++ b/tools/dep_updaters/update-openssl.sh @@ -105,14 +105,11 @@ EOF rm -rf "$DEPS_DIR/openssl/openssl" mv "$WORKSPACE/openssl" "$DEPS_DIR/openssl/" - # Update the version number - update_dependency_version "openssl" "$NEW_VERSION_V3" echo "All done!" echo "" echo "Please git add openssl, and commit the new version:" echo "" echo "$ git add -A deps/openssl/openssl" - echo "$ git add doc/contributing/maintaining/maintaining-dependencies.md" echo "$ git commit -m \"deps: upgrade openssl sources to quictls/openssl-$NEW_VERSION_V3\"" echo "" # The last line of the script should always print the new version, diff --git a/tools/dep_updaters/update-postject.sh b/tools/dep_updaters/update-postject.sh index 55c0de21a7f1b1..671bcd5a3a9ef6 100755 --- a/tools/dep_updaters/update-postject.sh +++ b/tools/dep_updaters/update-postject.sh @@ -7,13 +7,14 @@ set -ex -ROOT=$(cd "$(dirname "$0")/../.." && pwd) -[ -z "$NODE" ] && NODE="$ROOT/out/Release/node" +BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) +DEPS_DIR="$BASE_DIR/deps" +[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" [ -x "$NODE" ] || NODE=$(command -v node) -NPM="$ROOT/deps/npm/bin/npm-cli.js" +NPM="$BASE_DIR/deps/npm/bin/npm-cli.js" # shellcheck disable=SC1091 -. "$ROOT/tools/dep_updaters/utils.sh" +. "$BASE_DIR/tools/dep_updaters/utils.sh" NEW_VERSION=$("$NODE" "$NPM" view postject dist-tags.latest) CURRENT_VERSION=$("$NODE" -p "require('./test/fixtures/postject-copy/node_modules/postject/package.json').version") @@ -21,21 +22,34 @@ CURRENT_VERSION=$("$NODE" -p "require('./test/fixtures/postject-copy/node_module # This function exit with 0 if new version and current version are the same compare_dependency_version "postject" "$NEW_VERSION" "$CURRENT_VERSION" -cd "$( dirname "$0" )/../.." || exit -rm -rf test/fixtures/postject-copy -mkdir test/fixtures/postject-copy -cd test/fixtures/postject-copy || exit +echo "Making temporary workspace..." + +WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') + +cleanup () { + EXIT_CODE=$? + [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" + exit $EXIT_CODE +} + +trap cleanup INT TERM EXIT + +cd "$WORKSPACE" + +echo "Installing postject npm package..." "$NODE" "$NPM" init --yes "$NODE" "$NPM" install --no-bin-links --ignore-scripts "postject@$NEW_VERSION" -# TODO(RaisinTen): Replace following with $WORKSPACE -cd ../../.. -rm -rf deps/postject -mkdir deps/postject -cp test/fixtures/postject-copy/node_modules/postject/LICENSE deps/postject -cp test/fixtures/postject-copy/node_modules/postject/dist/postject-api.h deps/postject +echo "Replacing existing postject (except GN build files)" + +mv "$DEPS_DIR/postject/"*.gn "$DEPS_DIR/postject/"*.gni "$WORKSPACE/" +rm -rf "$DEPS_DIR/postject" +mkdir "$DEPS_DIR/postject" +mv "$WORKSPACE/"*.gn "$WORKSPACE/"*.gni "$DEPS_DIR/postject" +mv "$WORKSPACE/node_modules/postject/LICENSE" "$DEPS_DIR/postject" +mv "$WORKSPACE/node_modules/postject/dist/postject-api.h" "$DEPS_DIR/postject" # Update the version number on maintaining-dependencies.md # and print the new version as the last line of the script as we need diff --git a/tools/dep_updaters/update-simdjson.sh b/tools/dep_updaters/update-simdjson.sh new file mode 100755 index 00000000000000..3aa0e06eff0fcf --- /dev/null +++ b/tools/dep_updaters/update-simdjson.sh @@ -0,0 +1,55 @@ +#!/bin/sh +set -e +# Shell script to update simdjson in the source tree to a specific version + +BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) +DEPS_DIR="$BASE_DIR/deps" +[ -z "$NODE" ] && NODE="$BASE_DIR/out/Release/node" +[ -x "$NODE" ] || NODE=$(command -v node) + +# shellcheck disable=SC1091 +. "$BASE_DIR/tools/dep_updaters/utils.sh" + +NEW_VERSION="$("$NODE" --input-type=module <<'EOF' +const res = await fetch('https://api.github.com/repos/simdjson/simdjson/releases/latest'); +if (!res.ok) throw new Error(`FetchError: ${res.status} ${res.statusText}`, { cause: res }); +const { tag_name } = await res.json(); +console.log(tag_name.replace('v', '')); +EOF +)" +CURRENT_VERSION=$(grep "#define SIMDJSON_VERSION" "$DEPS_DIR/simdjson/simdjson.h" | sed -n "s/^.*VERSION \"\(.*\)\"/\1/p") + +if [ "$NEW_VERSION" = "$CURRENT_VERSION" ]; then + echo "Skipped because simdjson is on the latest version." + exit 0 +fi + +echo "Making temporary workspace..." + +WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') + +cleanup () { + EXIT_CODE=$? + [ -d "$WORKSPACE" ] && rm -rf "$WORKSPACE" + exit $EXIT_CODE +} + +trap cleanup INT TERM EXIT + +SIMDJSON_REF="v$NEW_VERSION" +SIMDJSON_ZIP="simdjson-$NEW_VERSION.zip" + +cd "$WORKSPACE" + +echo "Fetching simdjson source archive..." +curl -sL -o "$SIMDJSON_ZIP" "https://github.com/simdjson/simdjson/archive/refs/tags/$SIMDJSON_REF.zip" +unzip "$SIMDJSON_ZIP" +cd "simdjson-$NEW_VERSION" +mv "singleheader/simdjson.h" "$DEPS_DIR/simdjson" +mv "singleheader/simdjson.cpp" "$DEPS_DIR/simdjson" +mv "LICENSE" "$DEPS_DIR/simdjson" + +# Update the version number on maintaining-dependencies.md +# and print the new version as the last line of the script as we need +# to add it to $GITHUB_ENV variable +finalize_version_update "simdjson" "$NEW_VERSION" diff --git a/tools/dep_updaters/update-simdutf.sh b/tools/dep_updaters/update-simdutf.sh index ce22798006e546..bb4ea276548ed1 100755 --- a/tools/dep_updaters/update-simdutf.sh +++ b/tools/dep_updaters/update-simdutf.sh @@ -54,8 +54,8 @@ rm ./*_demo.cpp curl -sL -o "$SIMDUTF_LICENSE" "https://raw.githubusercontent.com/simdutf/simdutf/HEAD/LICENSE-MIT" -echo "Replacing existing simdutf (except GYP build files)" -mv "$DEPS_DIR/simdutf/"*.gyp "$DEPS_DIR/simdutf/README.md" "$WORKSPACE/" +echo "Replacing existing simdutf (except GYP and GN build files)" +mv "$DEPS_DIR/simdutf/"*.gyp "$DEPS_DIR/simdutf/"*.gn "$DEPS_DIR/simdutf/"*.gni "$DEPS_DIR/simdutf/README.md" "$WORKSPACE/" rm -rf "$DEPS_DIR/simdutf" mv "$WORKSPACE" "$DEPS_DIR/simdutf" diff --git a/tools/dep_updaters/update-undici.sh b/tools/dep_updaters/update-undici.sh index 962557f7a0d185..e50a3b909b8adf 100755 --- a/tools/dep_updaters/update-undici.sh +++ b/tools/dep_updaters/update-undici.sh @@ -43,7 +43,7 @@ rm -f deps/undici/undici.js # update version information in src/undici_version.h cat > "$ROOT/src/undici_version.h" < "$ROOT/src/zlib_version.h" <=12.0.0" @@ -551,20 +551,33 @@ } }, "node_modules/mdast-util-definitions/node_modules/@types/mdast": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", - "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dev": true, "dependencies": { "@types/unist": "^2" } }, "node_modules/mdast-util-definitions/node_modules/@types/unist": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", "dev": true }, + "node_modules/mdast-util-definitions/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-definitions/node_modules/unist-util-visit": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", @@ -580,6 +593,20 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-definitions/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-find-and-replace": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", @@ -597,20 +624,47 @@ } }, "node_modules/mdast-util-find-and-replace/node_modules/@types/mdast": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", - "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dev": true, "dependencies": { "@types/unist": "^2" } }, "node_modules/mdast-util-find-and-replace/node_modules/@types/unist": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", "dev": true }, + "node_modules/mdast-util-find-and-replace/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-from-markdown": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", @@ -636,18 +690,18 @@ } }, "node_modules/mdast-util-from-markdown/node_modules/@types/mdast": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", - "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dev": true, "dependencies": { "@types/unist": "^2" } }, "node_modules/mdast-util-from-markdown/node_modules/@types/unist": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", "dev": true }, "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { @@ -682,6 +736,19 @@ } ] }, + "node_modules/mdast-util-from-markdown/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-frontmatter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-1.0.1.tgz", @@ -698,18 +765,18 @@ } }, "node_modules/mdast-util-frontmatter/node_modules/@types/mdast": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", - "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dev": true, "dependencies": { "@types/unist": "^2" } }, "node_modules/mdast-util-frontmatter/node_modules/@types/unist": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", "dev": true }, "node_modules/mdast-util-gfm": { @@ -748,18 +815,18 @@ } }, "node_modules/mdast-util-gfm-autolink-literal/node_modules/@types/mdast": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", - "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dev": true, "dependencies": { "@types/unist": "^2" } }, "node_modules/mdast-util-gfm-autolink-literal/node_modules/@types/unist": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", "dev": true }, "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { @@ -830,18 +897,18 @@ } }, "node_modules/mdast-util-gfm-footnote/node_modules/@types/mdast": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", - "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dev": true, "dependencies": { "@types/unist": "^2" } }, "node_modules/mdast-util-gfm-footnote/node_modules/@types/unist": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", "dev": true }, "node_modules/mdast-util-gfm-strikethrough": { @@ -859,18 +926,18 @@ } }, "node_modules/mdast-util-gfm-strikethrough/node_modules/@types/mdast": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", - "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dev": true, "dependencies": { "@types/unist": "^2" } }, "node_modules/mdast-util-gfm-strikethrough/node_modules/@types/unist": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", "dev": true }, "node_modules/mdast-util-gfm-table": { @@ -890,18 +957,18 @@ } }, "node_modules/mdast-util-gfm-table/node_modules/@types/mdast": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", - "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dev": true, "dependencies": { "@types/unist": "^2" } }, "node_modules/mdast-util-gfm-table/node_modules/@types/unist": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", "dev": true }, "node_modules/mdast-util-gfm-task-list-item": { @@ -919,18 +986,18 @@ } }, "node_modules/mdast-util-gfm-task-list-item/node_modules/@types/mdast": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", - "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dev": true, "dependencies": { "@types/unist": "^2" } }, "node_modules/mdast-util-gfm-task-list-item/node_modules/@types/unist": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", "dev": true }, "node_modules/mdast-util-phrasing": { @@ -948,20 +1015,33 @@ } }, "node_modules/mdast-util-phrasing/node_modules/@types/mdast": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", - "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dev": true, "dependencies": { "@types/unist": "^2" } }, "node_modules/mdast-util-phrasing/node_modules/@types/unist": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", "dev": true }, + "node_modules/mdast-util-phrasing/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-to-hast": { "version": "13.0.2", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz", @@ -1003,20 +1083,33 @@ } }, "node_modules/mdast-util-to-markdown/node_modules/@types/mdast": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", - "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dev": true, "dependencies": { "@types/unist": "^2" } }, "node_modules/mdast-util-to-markdown/node_modules/@types/unist": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", "dev": true }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", @@ -1032,6 +1125,20 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-to-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", @@ -1046,18 +1153,18 @@ } }, "node_modules/mdast-util-to-string/node_modules/@types/mdast": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", - "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dev": true, "dependencies": { "@types/unist": "^2" } }, "node_modules/mdast-util-to-string/node_modules/@types/unist": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", "dev": true }, "node_modules/micromark": { @@ -2694,9 +2801,9 @@ } }, "node_modules/property-information": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.3.0.tgz", - "integrity": "sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.0.tgz", + "integrity": "sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==", "dev": true, "funding": { "type": "github", @@ -2750,18 +2857,18 @@ } }, "node_modules/remark-frontmatter/node_modules/@types/mdast": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", - "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dev": true, "dependencies": { "@types/unist": "^2" } }, "node_modules/remark-frontmatter/node_modules/@types/unist": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", "dev": true }, "node_modules/remark-frontmatter/node_modules/unified": { @@ -2783,6 +2890,19 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-frontmatter/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-frontmatter/node_modules/vfile": { "version": "5.3.7", "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", @@ -2830,18 +2950,18 @@ } }, "node_modules/remark-gfm/node_modules/@types/mdast": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", - "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dev": true, "dependencies": { "@types/unist": "^2" } }, "node_modules/remark-gfm/node_modules/@types/unist": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", "dev": true }, "node_modules/remark-gfm/node_modules/unified": { @@ -2863,6 +2983,19 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-gfm/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-gfm/node_modules/vfile": { "version": "5.3.7", "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", @@ -2911,27 +3044,27 @@ } }, "node_modules/remark-html/node_modules/@types/hast": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.5.tgz", - "integrity": "sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.8.tgz", + "integrity": "sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ==", "dev": true, "dependencies": { "@types/unist": "^2" } }, "node_modules/remark-html/node_modules/@types/mdast": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", - "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dev": true, "dependencies": { "@types/unist": "^2" } }, "node_modules/remark-html/node_modules/@types/unist": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", "dev": true }, "node_modules/remark-html/node_modules/hast-util-from-parse5": { @@ -3201,6 +3334,19 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-html/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-html/node_modules/unist-util-position": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", @@ -3214,6 +3360,19 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-html/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-html/node_modules/unist-util-visit": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", @@ -3229,6 +3388,20 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-html/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-html/node_modules/vfile": { "version": "5.3.7", "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", @@ -3289,18 +3462,18 @@ } }, "node_modules/remark-parse/node_modules/@types/mdast": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", - "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dev": true, "dependencies": { "@types/unist": "^2" } }, "node_modules/remark-parse/node_modules/@types/unist": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", "dev": true }, "node_modules/remark-parse/node_modules/unified": { @@ -3322,6 +3495,19 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-parse/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-parse/node_modules/vfile": { "version": "5.3.7", "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", @@ -3369,27 +3555,27 @@ } }, "node_modules/remark-rehype/node_modules/@types/hast": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.5.tgz", - "integrity": "sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.8.tgz", + "integrity": "sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ==", "dev": true, "dependencies": { "@types/unist": "^2" } }, "node_modules/remark-rehype/node_modules/@types/mdast": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", - "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dev": true, "dependencies": { "@types/unist": "^2" } }, "node_modules/remark-rehype/node_modules/@types/unist": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", "dev": true }, "node_modules/remark-rehype/node_modules/mdast-util-to-hast": { @@ -3520,6 +3706,19 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-rehype/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-rehype/node_modules/unist-util-position": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", @@ -3533,6 +3732,19 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-rehype/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-rehype/node_modules/unist-util-visit": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", @@ -3548,6 +3760,20 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-rehype/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-rehype/node_modules/vfile": { "version": "5.3.7", "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", @@ -3648,15 +3874,15 @@ } }, "node_modules/unified": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.2.tgz", - "integrity": "sha512-Zta++onvS/dJ6xUvXQOR5q8XJZOkiMCE5wQ8Yv9mLR25pxRS567EX0GO6HZRxxNV/lznwfsvRZ/1pqe9K9QLeQ==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", "dev": true, "dependencies": { "@types/unist": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", + "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" @@ -3677,24 +3903,18 @@ } }, "node_modules/unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", "dev": true, "dependencies": { - "@types/unist": "^2.0.0" + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-is/node_modules/@types/unist": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==", - "dev": true - }, "node_modules/unist-util-position": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", @@ -3709,13 +3929,13 @@ } }, "node_modules/unist-util-select": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-select/-/unist-util-select-5.0.0.tgz", - "integrity": "sha512-xhX135nwV6kdOm3EuzO01aNYBgyAe6aC84j6Hj+RI5DIaV6W5B4BH9U92W3jvU3cw3D2NWx4hTcrusdcGKi8Uw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-select/-/unist-util-select-5.1.0.tgz", + "integrity": "sha512-4A5mfokSHG/rNQ4g7gSbdEs+H586xyd24sdJqF1IWamqrLHvYb+DH48fzxowyOhOfK7YSqX+XlCojAyuuyyT2A==", "dev": true, "dependencies": { "@types/unist": "^3.0.0", - "css-selector-parser": "^2.0.0", + "css-selector-parser": "^3.0.0", "devlop": "^1.1.0", "nth-check": "^2.0.0", "zwitch": "^2.0.0" @@ -3726,24 +3946,18 @@ } }, "node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dev": true, "dependencies": { - "@types/unist": "^2.0.0" + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-stringify-position/node_modules/@types/unist": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==", - "dev": true - }, "node_modules/unist-util-visit": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", @@ -3760,39 +3974,6 @@ } }, "node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents/node_modules/@types/unist": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==", - "dev": true - }, - "node_modules/unist-util-visit/node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit/node_modules/unist-util-visit-parents": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", @@ -3867,32 +4048,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/vfile-message/node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile/node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/web-namespaces": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", diff --git a/tools/doc/package.json b/tools/doc/package.json index 3d49c92208b7ac..d27ce6ca5102f9 100644 --- a/tools/doc/package.json +++ b/tools/doc/package.json @@ -7,7 +7,7 @@ "node": ">=14.8.0" }, "devDependencies": { - "highlight.js": "^11.8.0", + "highlight.js": "^11.9.0", "js-yaml": "^4.1.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.0", @@ -17,8 +17,8 @@ "remark-parse": "^10.0.2", "remark-rehype": "^10.1.0", "to-vfile": "^8.0.0", - "unified": "^11.0.2", - "unist-util-select": "^5.0.0", + "unified": "^11.0.4", + "unist-util-select": "^5.1.0", "unist-util-visit": "^5.0.0" }, "bin": { diff --git a/tools/generate_config_gypi.py b/tools/generate_config_gypi.py new file mode 100755 index 00000000000000..948a740529ec34 --- /dev/null +++ b/tools/generate_config_gypi.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python3 +# Copyright (c) 2013-2019 GitHub Inc. +# Copyright 2019 the V8 project authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# This script reads the configurations of GN and outputs a config.gypi file that +# will be used to populate process.config.variables. + +import argparse +import re +import os +import subprocess +import sys + +sys.path.append(os.path.dirname(__file__)) +import getnapibuildversion + +# The defines bellow must include all things from the external_v8_defines list +# in v8/BUILD.gn. +# TODO(zcbenz): Import from v8_features.json once this change gets into Node: +# https://chromium-review.googlesource.com/c/v8/v8/+/5040612 +V8_FEATURE_DEFINES = { + 'v8_enable_v8_checks': 'V8_ENABLE_CHECKS', + 'v8_enable_pointer_compression': 'V8_COMPRESS_POINTERS', + 'v8_enable_pointer_compression_shared_cage': 'V8_COMPRESS_POINTERS_IN_SHARED_CAGE', + 'v8_enable_31bit_smis_on_64bit_arch': 'V8_31BIT_SMIS_ON_64BIT_ARCH', + 'v8_enable_zone_compression': 'V8_COMPRESS_ZONES', + 'v8_enable_sandbox': 'V8_ENABLE_SANDBOX', + 'v8_deprecation_warnings': 'V8_DEPRECATION_WARNINGS', + 'v8_imminent_deprecation_warnings': 'V8_IMMINENT_DEPRECATION_WARNINGS', + 'v8_use_perfetto': 'V8_USE_PERFETTO', + 'v8_enable_map_packing': 'V8_MAP_PACKING', + 'tsan': 'V8_IS_TSAN', + 'v8_enable_conservative_stack_scanning': 'V8_ENABLE_CONSERVATIVE_STACK_SCANNING', + 'v8_enable_direct_local': 'V8_ENABLE_DIRECT_LOCAL', +} + +# Regex used for parsing results of "gn args". +GN_RE = re.compile(r'(\w+)\s+=\s+(.*?)$', re.MULTILINE) + +if sys.platform == 'win32': + GN = 'gn.exe' +else: + GN = 'gn' + +def bool_to_number(v): + return 1 if v else 0 + +def bool_string_to_number(v): + return bool_to_number(v == 'true') + +def get_gn_config(out_dir): + # Read args from GN configurations. + gn_args = subprocess.check_output( + [GN, 'args', '--list', '--short', '-C', out_dir]) + config = dict(re.findall(GN_RE, gn_args.decode())) + # Get napi_build_version from Node, which is not part of GN args. + config['napi_build_version'] = getnapibuildversion.get_napi_version() + return config + +def get_v8_config(out_dir, node_gn_path): + # For args that have default values in V8's GN configurations, we can not rely + # on the values printed by "gn args", because most of them would be empty + # strings, and the actual value would depend on the logics in v8/BUILD.gn. + # So we print out the defines and deduce the feature from them instead. + node_defines = subprocess.check_output( + [GN, 'desc', '-C', out_dir, node_gn_path + ":libnode", 'defines']).decode().split('\n') + v8_config = {} + for feature, define in V8_FEATURE_DEFINES.items(): + v8_config[feature] = bool_to_number(define in node_defines) + return v8_config + +def translate_config(out_dir, config, v8_config): + config_gypi = { + 'target_defaults': { + 'default_configuration': + 'Debug' if config['is_debug'] == 'true' else 'Release', + }, + 'variables': { + 'asan': bool_string_to_number(config['is_asan']), + 'enable_lto': config['use_thin_lto'], + 'is_debug': bool_string_to_number(config['is_debug']), + 'llvm_version': 13, + 'napi_build_version': config['napi_build_version'], + 'node_builtin_shareable_builtins': + eval(config['node_builtin_shareable_builtins']), + 'node_module_version': int(config['node_module_version']), + 'node_use_openssl': config['node_use_openssl'], + 'node_use_node_code_cache': config['node_use_node_code_cache'], + 'node_use_node_snapshot': config['node_use_node_snapshot'], + 'v8_enable_i18n_support': + bool_string_to_number(config['v8_enable_i18n_support']), + 'v8_enable_inspector': # this is actually a node misnomer + bool_string_to_number(config['node_enable_inspector']), + 'shlib_suffix': 'dylib' if sys.platform == 'darwin' else 'so', + 'tsan': bool_string_to_number(config['is_tsan']), + # TODO(zcbenz): Shared components are not supported in GN config yet. + 'node_shared': 'false', + 'node_shared_brotli': 'false', + 'node_shared_cares': 'false', + 'node_shared_http_parser': 'false', + 'node_shared_libuv': 'false', + 'node_shared_nghttp2': 'false', + 'node_shared_nghttp3': 'false', + 'node_shared_ngtcp2': 'false', + 'node_shared_openssl': 'false', + 'node_shared_zlib': 'false', + } + } + config_gypi['variables'].update(v8_config) + return config_gypi + +def main(): + parser = argparse.ArgumentParser( + description='Generate config.gypi file from GN configurations') + parser.add_argument('target', help='path to generated config.gypi file') + parser.add_argument('--out-dir', help='path to the output directory', + default='out/Release') + parser.add_argument('--node-gn-path', help='path of the node target in GN', + default='//node') + parser.add_argument('--dep-file', help='path to an optional dep file', + default=None) + args, unknown_args = parser.parse_known_args() + + config = get_gn_config(args.out_dir) + v8_config = get_v8_config(args.out_dir, args.node_gn_path) + + # Write output. + with open(args.target, 'w') as f: + f.write(repr(translate_config(args.out_dir, config, v8_config))) + + # Write depfile. Force regenerating config.gypi when GN configs change. + if args.dep_file: + with open(args.dep_file, 'w') as f: + f.write('%s: %s '%(args.target, 'build.ninja')) + +if __name__ == '__main__': + main() diff --git a/tools/gyp/.flake8 b/tools/gyp/.flake8 deleted file mode 100644 index ea0c7680ef87b2..00000000000000 --- a/tools/gyp/.flake8 +++ /dev/null @@ -1,4 +0,0 @@ -[flake8] -max-complexity = 101 -max-line-length = 88 -extend-ignore = E203 # whitespace before ':' to agree with psf/black diff --git a/tools/gyp/.github/workflows/Python_tests.yml b/tools/gyp/.github/workflows/Python_tests.yml index 1cfa42f563ce5f..049d5fe50c455c 100644 --- a/tools/gyp/.github/workflows/Python_tests.yml +++ b/tools/gyp/.github/workflows/Python_tests.yml @@ -2,29 +2,36 @@ # TODO: Enable pytest --doctest-modules name: Python_tests -on: [push, pull_request] +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + workflow_dispatch: jobs: Python_tests: runs-on: ${{ matrix.os }} strategy: fail-fast: false - max-parallel: 8 + max-parallel: 5 matrix: os: [macos-latest, ubuntu-latest] # , windows-latest] - python-version: ["3.7", "3.8", "3.9", "3.10"] + python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v3 + uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} + allow-prereleases: true - name: Install dependencies run: | - python -m pip install --upgrade pip - pip install -r requirements_dev.txt - - name: Lint with flake8 - run: flake8 . --ignore=E203,W503 --max-complexity=101 --max-line-length=88 --show-source --statistics - - name: Test with pytest + python -m pip install --upgrade pip setuptools + pip install --editable ".[dev]" + - run: ./gyp -V && ./gyp --version && gyp -V && gyp --version + - name: Lint with ruff # See pyproject.toml for settings + run: ruff --output-format=github . + - name: Test with pytest # See pyproject.toml for settings run: pytest # - name: Run doctests with pytest # run: pytest --doctest-modules diff --git a/tools/gyp/.github/workflows/node-gyp.yml b/tools/gyp/.github/workflows/node-gyp.yml index fc28a0b512e5a7..ebe749752175ba 100644 --- a/tools/gyp/.github/workflows/node-gyp.yml +++ b/tools/gyp/.github/workflows/node-gyp.yml @@ -1,33 +1,43 @@ name: node-gyp integration - -on: [push, pull_request] - +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + workflow_dispatch: jobs: - test: + integration: strategy: fail-fast: false matrix: os: [macos-latest, ubuntu-latest, windows-latest] - python: ["3.7", "3.10"] + python: ["3.8", "3.10", "3.12"] runs-on: ${{ matrix.os }} steps: - name: Clone gyp-next - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: path: gyp-next - name: Clone nodejs/node-gyp - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: nodejs/node-gyp path: node-gyp - uses: actions/setup-node@v3 with: - node-version: 14.x - - uses: actions/setup-python@v3 + node-version: 18.x + - uses: actions/setup-python@v4 with: python-version: ${{ matrix.python }} - - name: Install dependencies + allow-prereleases: true + - name: Install Python dependencies + run: | + cd gyp-next + python -m pip install --upgrade pip setuptools + pip install --editable . + pip uninstall -y gyp-next + - name: Install Node.js dependencies run: | cd node-gyp npm install --no-progress @@ -36,7 +46,15 @@ jobs: run: | rm -rf node-gyp/gyp cp -r gyp-next node-gyp/gyp - - name: Run tests + - name: Run tests (macOS or Linux) + if: runner.os != 'Windows' + shell: bash + run: | + cd node-gyp + npm test --python="${pythonLocation}/python" + - name: Run tests (Windows) + if: runner.os == 'Windows' + shell: pwsh run: | cd node-gyp - npm test + npm run test --python="${env:pythonLocation}\\python.exe" diff --git a/tools/gyp/.github/workflows/nodejs-windows.yml b/tools/gyp/.github/workflows/nodejs-windows.yml index 53bd7367274c12..3f52ff9ce7138f 100644 --- a/tools/gyp/.github/workflows/nodejs-windows.yml +++ b/tools/gyp/.github/workflows/nodejs-windows.yml @@ -1,17 +1,22 @@ name: Node.js Windows integration -on: [push, pull_request] +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + workflow_dispatch: jobs: build-windows: runs-on: windows-latest steps: - name: Clone gyp-next - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: path: gyp-next - name: Clone nodejs/node - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: nodejs/node path: node diff --git a/tools/gyp/.github/workflows/release-please.yml b/tools/gyp/.github/workflows/release-please.yml index 288afdb3b32e0c..665c4c48fed210 100644 --- a/tools/gyp/.github/workflows/release-please.yml +++ b/tools/gyp/.github/workflows/release-please.yml @@ -8,9 +8,9 @@ jobs: release-please: runs-on: ubuntu-latest steps: - - uses: GoogleCloudPlatform/release-please-action@v2 + - uses: google-github-actions/release-please-action@v3 with: token: ${{ secrets.GITHUB_TOKEN }} release-type: python package-name: gyp-next - bump-minor-pre-major: Yes + bump-minor-pre-major: true diff --git a/tools/gyp/AUTHORS b/tools/gyp/AUTHORS index f49a357b9ed104..c05d25b2cb1aa1 100644 --- a/tools/gyp/AUTHORS +++ b/tools/gyp/AUTHORS @@ -14,3 +14,4 @@ Tom Freudenberg Julien Brianceau Refael Ackermann Ujjwal Sharma +Christian Clauss diff --git a/tools/gyp/CHANGELOG.md b/tools/gyp/CHANGELOG.md index a103250cd5399c..483943e013f3ce 100644 --- a/tools/gyp/CHANGELOG.md +++ b/tools/gyp/CHANGELOG.md @@ -1,5 +1,63 @@ # Changelog +## [0.16.1](https://github.com/nodejs/gyp-next/compare/v0.16.0...v0.16.1) (2023-10-25) + + +### Bug Fixes + +* add quotes for command in msvs generator ([#217](https://github.com/nodejs/gyp-next/issues/217)) ([d3b7bcd](https://github.com/nodejs/gyp-next/commit/d3b7bcdec90d6c1b1affc15ece706e63007b7264)) + +## [0.16.0](https://github.com/nodejs/gyp-next/compare/v0.15.1...v0.16.0) (2023-10-23) + + +### Features + +* add VCToolsVersion for msvs ([#209](https://github.com/nodejs/gyp-next/issues/209)) ([0e35ab8](https://github.com/nodejs/gyp-next/commit/0e35ab812d890fb75cf89a19ea72bc93dd6ba186)) + +## [0.15.1](https://github.com/nodejs/gyp-next/compare/v0.15.0...v0.15.1) (2023-09-08) + + +### Bug Fixes + +* some Python lint issues ([#200](https://github.com/nodejs/gyp-next/issues/200)) ([d2dfe4e](https://github.com/nodejs/gyp-next/commit/d2dfe4e66b64c16b38bef984782db93d12674f05)) +* use generator_output as output_dir ([#191](https://github.com/nodejs/gyp-next/issues/191)) ([35ffeb1](https://github.com/nodejs/gyp-next/commit/35ffeb1da8ef3fc8311e2e812cff550568f7e8a2)) + +## [0.15.0](https://github.com/nodejs/gyp-next/compare/v0.14.1...v0.15.0) (2023-03-30) + + +### Features + +* **msvs:** add SpectreMitigation attribute ([#190](https://github.com/nodejs/gyp-next/issues/190)) ([853e464](https://github.com/nodejs/gyp-next/commit/853e4643b6737224a5aa0720a4108461a0230991)) + +## [0.14.1](https://github.com/nodejs/gyp-next/compare/v0.14.0...v0.14.1) (2023-02-19) + + +### Bug Fixes + +* flake8 extended-ignore ([#186](https://github.com/nodejs/gyp-next/issues/186)) ([c38493c](https://github.com/nodejs/gyp-next/commit/c38493c2556aa63b6dc40ab585c18aef5ca270d3)) +* No build_type in default_variables ([#183](https://github.com/nodejs/gyp-next/issues/183)) ([ac262fe](https://github.com/nodejs/gyp-next/commit/ac262fe82453c4e8dc47529338d157eb0b5ec0fb)) + + +### Documentation + +* README.md: Add pipx installation and run instructions ([#165](https://github.com/nodejs/gyp-next/issues/165)) ([4d28b15](https://github.com/nodejs/gyp-next/commit/4d28b155568dc35f11c7f86124d1dd42ba428bed)) + +## [0.14.0](https://github.com/nodejs/gyp-next/compare/v0.13.0...v0.14.0) (2022-10-08) + + +### Features + +* Add command line argument for `gyp --version` ([#164](https://github.com/nodejs/gyp-next/issues/164)) ([5c9f4d0](https://github.com/nodejs/gyp-next/commit/5c9f4d05678dd855e18ed2327219e5d18e5374db)) +* ninja build for iOS ([#174](https://github.com/nodejs/gyp-next/issues/174)) ([b6f2714](https://github.com/nodejs/gyp-next/commit/b6f271424e0033d7ed54d437706695af2ba7a1bf)) +* **zos:** support IBM Open XL C/C++ & PL/I compilers on z/OS ([#178](https://github.com/nodejs/gyp-next/issues/178)) ([43a7211](https://github.com/nodejs/gyp-next/commit/43a72110ae3fafb13c9625cc7a969624b27cda47)) + + +### Bug Fixes + +* lock windows env ([#163](https://github.com/nodejs/gyp-next/issues/163)) ([44bd0dd](https://github.com/nodejs/gyp-next/commit/44bd0ddc93ea0b5770a44dd326a2e4ae62c21442)) +* move configuration information into pyproject.toml ([#176](https://github.com/nodejs/gyp-next/issues/176)) ([d69d8ec](https://github.com/nodejs/gyp-next/commit/d69d8ece6dbff7af4f2ea073c9fd170baf8cb7f7)) +* node.js debugger adds stderr (but exit code is 0) -> shouldn't throw ([#179](https://github.com/nodejs/gyp-next/issues/179)) ([1a457d9](https://github.com/nodejs/gyp-next/commit/1a457d9ed08cfd30c9fa551bc5cf0d90fb583787)) + ## [0.13.0](https://www.github.com/nodejs/gyp-next/compare/v0.12.1...v0.13.0) (2022-05-11) diff --git a/tools/gyp/README.md b/tools/gyp/README.md index 9ffc2b21e81b8b..be1d7b9ebf6611 100644 --- a/tools/gyp/README.md +++ b/tools/gyp/README.md @@ -5,3 +5,26 @@ Documents are available at [gyp.gsrc.io](https://gyp.gsrc.io), or you can check __gyp-next__ is [released](https://github.com/nodejs/gyp-next/releases) to the [__Python Packaging Index__](https://pypi.org/project/gyp-next) (PyPI) and can be installed with the command: * `python3 -m pip install gyp-next` + +When used as a command line utility, __gyp-next__ can also be installed with [pipx](https://pypa.github.io/pipx): +* `pipx install gyp-next` +``` +Installing to a new venv 'gyp-next' + installed package gyp-next 0.13.0, installed using Python 3.10.6 + These apps are now globally available + - gyp +done! ✨ 🌟 ✨ +``` + +Or to run __gyp-next__ directly without installing it: +* `pipx run gyp-next --help` +``` +NOTE: running app 'gyp' from 'gyp-next' +usage: usage: gyp [options ...] [build_file ...] + +options: + -h, --help show this help message and exit + --build CONFIGS configuration for build after project generation + --check check format of gyp files + [ ... ] +``` diff --git a/tools/gyp/pylib/gyp/MSVSNew.py b/tools/gyp/pylib/gyp/MSVSNew.py index d6b189760cef99..bc0e93d07f8900 100644 --- a/tools/gyp/pylib/gyp/MSVSNew.py +++ b/tools/gyp/pylib/gyp/MSVSNew.py @@ -285,19 +285,17 @@ def Write(self, writer=gyp.common.WriteOnDiff): "\tEndProjectSection\r\n" ) - if isinstance(e, MSVSFolder): - if e.items: - f.write("\tProjectSection(SolutionItems) = preProject\r\n") - for i in e.items: - f.write(f"\t\t{i} = {i}\r\n") - f.write("\tEndProjectSection\r\n") - - if isinstance(e, MSVSProject): - if e.dependencies: - f.write("\tProjectSection(ProjectDependencies) = postProject\r\n") - for d in e.dependencies: - f.write(f"\t\t{d.get_guid()} = {d.get_guid()}\r\n") - f.write("\tEndProjectSection\r\n") + if isinstance(e, MSVSFolder) and e.items: + f.write("\tProjectSection(SolutionItems) = preProject\r\n") + for i in e.items: + f.write(f"\t\t{i} = {i}\r\n") + f.write("\tEndProjectSection\r\n") + + if isinstance(e, MSVSProject) and e.dependencies: + f.write("\tProjectSection(ProjectDependencies) = postProject\r\n") + for d in e.dependencies: + f.write(f"\t\t{d.get_guid()} = {d.get_guid()}\r\n") + f.write("\tEndProjectSection\r\n") f.write("EndProject\r\n") @@ -353,7 +351,7 @@ def Write(self, writer=gyp.common.WriteOnDiff): # Folder mappings # Omit this section if there are no folders - if any([e.entries for e in all_entries if isinstance(e, MSVSFolder)]): + if any(e.entries for e in all_entries if isinstance(e, MSVSFolder)): f.write("\tGlobalSection(NestedProjects) = preSolution\r\n") for e in all_entries: if not isinstance(e, MSVSFolder): diff --git a/tools/gyp/pylib/gyp/MSVSProject.py b/tools/gyp/pylib/gyp/MSVSProject.py index f0cfabe8349099..629f3f61b4819d 100644 --- a/tools/gyp/pylib/gyp/MSVSProject.py +++ b/tools/gyp/pylib/gyp/MSVSProject.py @@ -79,7 +79,7 @@ def __init__(self, project_path, version, name, guid=None, platforms=None): self.files_section = ["Files"] # Keep a dict keyed on filename to speed up access. - self.files_dict = dict() + self.files_dict = {} def AddToolFile(self, path): """Adds a tool file to the project. diff --git a/tools/gyp/pylib/gyp/MSVSSettings.py b/tools/gyp/pylib/gyp/MSVSSettings.py index e89a971a3bb4fd..93633dbca133c7 100644 --- a/tools/gyp/pylib/gyp/MSVSSettings.py +++ b/tools/gyp/pylib/gyp/MSVSSettings.py @@ -141,7 +141,7 @@ class _Boolean(_Type): """Boolean settings, can have the values 'false' or 'true'.""" def _Validate(self, value): - if value != "true" and value != "false": + if value not in {"true", "false"}: raise ValueError("expected bool; got %r" % value) def ValidateMSVS(self, value): diff --git a/tools/gyp/pylib/gyp/__init__.py b/tools/gyp/pylib/gyp/__init__.py index 976d5b6aa88e09..d6cc01307d997c 100755 --- a/tools/gyp/pylib/gyp/__init__.py +++ b/tools/gyp/pylib/gyp/__init__.py @@ -15,6 +15,7 @@ import traceback from gyp.common import GypError + # Default debug modes for GYP debug = {} @@ -107,7 +108,9 @@ def Load( if default_variables["GENERATOR"] == "ninja": default_variables.setdefault( "PRODUCT_DIR_ABS", - os.path.join(output_dir, "out", default_variables["build_type"]), + os.path.join( + output_dir, "out", default_variables.get("build_type", "default") + ), ) else: default_variables.setdefault( @@ -463,8 +466,19 @@ def gyp_main(args): metavar="TARGET", help="include only TARGET and its deep dependencies", ) + parser.add_argument( + "-V", + "--version", + dest="version", + action="store_true", + help="Show the version and exit.", + ) options, build_files_arg = parser.parse_args(args) + if options.version: + import pkg_resources + print(f"v{pkg_resources.get_distribution('gyp-next').version}") + return 0 build_files = build_files_arg # Set up the configuration directory (defaults to ~/.gyp) @@ -610,7 +624,7 @@ def gyp_main(args): if options.generator_flags: gen_flags += options.generator_flags generator_flags = NameValueListToDict(gen_flags) - if DEBUG_GENERAL in gyp.debug.keys(): + if DEBUG_GENERAL in gyp.debug: DebugOutput(DEBUG_GENERAL, "generator_flags: %s", generator_flags) # Generate all requested formats (use a set in case we got one format request diff --git a/tools/gyp/pylib/gyp/common.py b/tools/gyp/pylib/gyp/common.py index 0847cdabc718d8..b73a0c55b1e349 100644 --- a/tools/gyp/pylib/gyp/common.py +++ b/tools/gyp/pylib/gyp/common.py @@ -144,20 +144,16 @@ def RelativePath(path, relative_to, follow_path_symlink=True): # symlink, this option has no effect. # Convert to normalized (and therefore absolute paths). - if follow_path_symlink: - path = os.path.realpath(path) - else: - path = os.path.abspath(path) + path = os.path.realpath(path) if follow_path_symlink else os.path.abspath(path) relative_to = os.path.realpath(relative_to) # On Windows, we can't create a relative path to a different drive, so just # use the absolute path. - if sys.platform == "win32": - if ( - os.path.splitdrive(path)[0].lower() - != os.path.splitdrive(relative_to)[0].lower() - ): - return path + if sys.platform == "win32" and ( + os.path.splitdrive(path)[0].lower() + != os.path.splitdrive(relative_to)[0].lower() + ): + return path # Split the paths into components. path_split = path.split(os.path.sep) @@ -277,10 +273,7 @@ def EncodePOSIXShellArgument(argument): if not isinstance(argument, str): argument = str(argument) - if _quote.search(argument): - quote = '"' - else: - quote = "" + quote = '"' if _quote.search(argument) else "" encoded = quote + re.sub(_escape, r"\\\1", argument) + quote @@ -470,6 +463,7 @@ def CopyTool(flavor, out_path, generator_flags={}): "os400": "flock", "solaris": "flock", "mac": "mac", + "ios": "mac", "win": "win", }.get(flavor, None) if not prefix: diff --git a/tools/gyp/pylib/gyp/easy_xml.py b/tools/gyp/pylib/gyp/easy_xml.py index bda1a47468ae2b..02567b251446d7 100644 --- a/tools/gyp/pylib/gyp/easy_xml.py +++ b/tools/gyp/pylib/gyp/easy_xml.py @@ -121,7 +121,11 @@ def WriteXmlIfChanged(content, path, encoding="utf-8", pretty=False, if win32 and os.linesep != "\r\n": xml_string = xml_string.replace("\n", "\r\n") - default_encoding = locale.getdefaultlocale()[1] + try: # getdefaultlocale() was removed in Python 3.11 + default_encoding = locale.getdefaultlocale()[1] + except AttributeError: + default_encoding = locale.getencoding() + if default_encoding and default_encoding.upper() != encoding.upper(): xml_string = xml_string.encode(encoding) diff --git a/tools/gyp/pylib/gyp/easy_xml_test.py b/tools/gyp/pylib/gyp/easy_xml_test.py index 342f693a329d26..2d9b15210dc126 100755 --- a/tools/gyp/pylib/gyp/easy_xml_test.py +++ b/tools/gyp/pylib/gyp/easy_xml_test.py @@ -76,6 +76,8 @@ def test_EasyXml_complex(self): '\'Debug|Win32\'" Label="Configuration">' "Application" "Unicode" + "SpectreLoadCF" + "14.36.32532" "" "" ) @@ -99,6 +101,8 @@ def test_EasyXml_complex(self): }, ["ConfigurationType", "Application"], ["CharacterSet", "Unicode"], + ["SpectreMitigation", "SpectreLoadCF"], + ["VCToolsVersion", "14.36.32532"], ], ] ) diff --git a/tools/gyp/pylib/gyp/generator/analyzer.py b/tools/gyp/pylib/gyp/generator/analyzer.py index f15df00c36373e..1334f2fca9967c 100644 --- a/tools/gyp/pylib/gyp/generator/analyzer.py +++ b/tools/gyp/pylib/gyp/generator/analyzer.py @@ -379,7 +379,7 @@ def _GenerateTargets(data, target_list, target_dicts, toplevel_dir, files, build target.is_executable = target_type == "executable" target.is_static_library = target_type == "static_library" target.is_or_has_linked_ancestor = ( - target_type == "executable" or target_type == "shared_library" + target_type in {"executable", "shared_library"} ) build_file = gyp.common.ParseQualifiedTarget(target_name)[0] @@ -433,14 +433,14 @@ def _GetUnqualifiedToTargetMapping(all_targets, to_find): if not to_find: return {}, [] to_find = set(to_find) - for target_name in all_targets.keys(): + for target_name in all_targets: extracted = gyp.common.ParseQualifiedTarget(target_name) if len(extracted) > 1 and extracted[1] in to_find: to_find.remove(extracted[1]) result[extracted[1]] = all_targets[target_name] if not to_find: return result, [] - return result, [x for x in to_find] + return result, list(to_find) def _DoesTargetDependOnMatchingTargets(target): @@ -451,8 +451,8 @@ def _DoesTargetDependOnMatchingTargets(target): if target.match_status == MATCH_STATUS_DOESNT_MATCH: return False if ( - target.match_status == MATCH_STATUS_MATCHES - or target.match_status == MATCH_STATUS_MATCHES_BY_DEPENDENCY + target.match_status in {MATCH_STATUS_MATCHES, + MATCH_STATUS_MATCHES_BY_DEPENDENCY} ): return True for dep in target.deps: @@ -683,11 +683,9 @@ def find_matching_test_target_names(self): ) test_target_names_contains_all = "all" in self._test_target_names if test_target_names_contains_all: - test_targets = [ - x for x in (set(test_targets_no_all) | set(self._root_targets)) - ] + test_targets = list(set(test_targets_no_all) | set(self._root_targets)) else: - test_targets = [x for x in test_targets_no_all] + test_targets = list(test_targets_no_all) print("supplied test_targets") for target_name in self._test_target_names: print("\t", target_name) @@ -702,9 +700,9 @@ def find_matching_test_target_names(self): if matching_test_targets_contains_all: # Remove any of the targets for all that were not explicitly supplied, # 'all' is subsequentely added to the matching names below. - matching_test_targets = [ - x for x in (set(matching_test_targets) & set(test_targets_no_all)) - ] + matching_test_targets = list( + set(matching_test_targets) & set(test_targets_no_all) + ) print("matched test_targets") for target in matching_test_targets: print("\t", target.name) @@ -729,9 +727,7 @@ def find_matching_compile_target_names(self): self._supplied_target_names_no_all(), self._unqualified_mapping ) if "all" in self._supplied_target_names(): - supplied_targets = [ - x for x in (set(supplied_targets) | set(self._root_targets)) - ] + supplied_targets = list(set(supplied_targets) | set(self._root_targets)) print("Supplied test_targets & compile_targets") for target in supplied_targets: print("\t", target.name) diff --git a/tools/gyp/pylib/gyp/generator/android.py b/tools/gyp/pylib/gyp/generator/android.py index cdf1a4832cf1ad..d3c97c666db077 100644 --- a/tools/gyp/pylib/gyp/generator/android.py +++ b/tools/gyp/pylib/gyp/generator/android.py @@ -697,7 +697,7 @@ def ComputeOutputParts(self, spec): target, ) - if self.type != "static_library" and self.type != "shared_library": + if self.type not in {"static_library", "shared_library"}: target_prefix = spec.get("product_prefix", target_prefix) target = spec.get("product_name", target) product_ext = spec.get("product_extension") diff --git a/tools/gyp/pylib/gyp/generator/cmake.py b/tools/gyp/pylib/gyp/generator/cmake.py index c95d18415cdb37..320a891aa8adc9 100644 --- a/tools/gyp/pylib/gyp/generator/cmake.py +++ b/tools/gyp/pylib/gyp/generator/cmake.py @@ -103,7 +103,7 @@ def NormjoinPathForceCMakeSource(base_path, rel_path): """ if os.path.isabs(rel_path): return rel_path - if any([rel_path.startswith(var) for var in FULL_PATH_VARS]): + if any(rel_path.startswith(var) for var in FULL_PATH_VARS): return rel_path # TODO: do we need to check base_path for absolute variables as well? return os.path.join( @@ -328,7 +328,7 @@ def WriteActions(target_name, actions, extra_sources, extra_deps, path_to_gyp, o def NormjoinRulePathForceCMakeSource(base_path, rel_path, rule_source): if rel_path.startswith(("${RULE_INPUT_PATH}", "${RULE_INPUT_DIRNAME}")): - if any([rule_source.startswith(var) for var in FULL_PATH_VARS]): + if any(rule_source.startswith(var) for var in FULL_PATH_VARS): return rel_path return NormjoinPathForceCMakeSource(base_path, rel_path) @@ -929,10 +929,7 @@ def WriteTarget( product_prefix = spec.get("product_prefix", default_product_prefix) product_name = spec.get("product_name", default_product_name) product_ext = spec.get("product_extension") - if product_ext: - product_ext = "." + product_ext - else: - product_ext = default_product_ext + product_ext = "." + product_ext if product_ext else default_product_ext SetTargetProperty(output, cmake_target_name, "PREFIX", product_prefix) SetTargetProperty( diff --git a/tools/gyp/pylib/gyp/generator/compile_commands_json.py b/tools/gyp/pylib/gyp/generator/compile_commands_json.py index f330a04dea4c53..0ffa3bb5980fe9 100644 --- a/tools/gyp/pylib/gyp/generator/compile_commands_json.py +++ b/tools/gyp/pylib/gyp/generator/compile_commands_json.py @@ -34,7 +34,7 @@ def IsMac(params): - return "mac" == gyp.common.GetFlavor(params) + return gyp.common.GetFlavor(params) == "mac" def CalculateVariables(default_variables, params): @@ -93,7 +93,7 @@ def resolve(filename): gyp.common.EncodePOSIXShellArgument(file), ) ) - commands.append(dict(command=command, directory=output_dir, file=file)) + commands.append({"command": command, "directory": output_dir, "file": file}) def GenerateOutput(target_list, target_dicts, data, params): @@ -108,7 +108,10 @@ def GenerateOutput(target_list, target_dicts, data, params): cwd = os.path.dirname(build_file) AddCommandsForTarget(cwd, target, params, per_config_commands) - output_dir = params["generator_flags"].get("output_dir", "out") + try: + output_dir = params["options"].generator_output + except (AttributeError, KeyError): + output_dir = params["generator_flags"].get("output_dir", "out") for configuration_name, commands in per_config_commands.items(): filename = os.path.join(output_dir, configuration_name, "compile_commands.json") gyp.common.EnsureDirExists(filename) diff --git a/tools/gyp/pylib/gyp/generator/eclipse.py b/tools/gyp/pylib/gyp/generator/eclipse.py index 1ff0dc83ae200f..52aeae6050990b 100644 --- a/tools/gyp/pylib/gyp/generator/eclipse.py +++ b/tools/gyp/pylib/gyp/generator/eclipse.py @@ -24,7 +24,7 @@ import gyp.common import gyp.msvs_emulation import shlex -import xml.etree.cElementTree as ET +import xml.etree.ElementTree as ET generator_wants_static_library_dependencies_adjusted = False @@ -248,10 +248,7 @@ def GetAllDefines(target_list, target_dicts, data, config_name, params, compiler continue cpp_line_parts = cpp_line.split(" ", 2) key = cpp_line_parts[1] - if len(cpp_line_parts) >= 3: - val = cpp_line_parts[2] - else: - val = "1" + val = cpp_line_parts[2] if len(cpp_line_parts) >= 3 else "1" all_defines[key] = val return all_defines diff --git a/tools/gyp/pylib/gyp/generator/make.py b/tools/gyp/pylib/gyp/generator/make.py index e225326e1d09b6..1b9974948e4de5 100644 --- a/tools/gyp/pylib/gyp/generator/make.py +++ b/tools/gyp/pylib/gyp/generator/make.py @@ -101,6 +101,7 @@ def CalculateVariables(default_variables, params): default_variables.setdefault("SHARED_LIB_SUFFIX", ".a") elif flavor == "zos": default_variables.setdefault("SHARED_LIB_SUFFIX", ".x") + COMPILABLE_EXTENSIONS.update({".pli": "pli"}) else: default_variables.setdefault("SHARED_LIB_SUFFIX", ".so") default_variables.setdefault("SHARED_LIB_DIR", "$(builddir)/lib.$(TOOLSET)") @@ -318,7 +319,7 @@ def CalculateGeneratorInputInfo(params): cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS) quiet_cmd_solink = SOLINK($(TOOLSET)) $@ -cmd_solink = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,DLL -o $(patsubst %.x,%.so,$@) $(LD_INPUTS) $(LIBS) && if [ -f $(notdir $@) ]; then /bin/cp $(notdir $@) $@; else true; fi +cmd_solink = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS) quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@ cmd_solink_module = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) @@ -378,6 +379,7 @@ def CalculateGeneratorInputInfo(params): LINK.target ?= %(LINK.target)s LDFLAGS.target ?= $(LDFLAGS) AR.target ?= $(AR) +PLI.target ?= %(PLI.target)s # C++ apps need to be linked with g++. LINK ?= $(CXX.target) @@ -391,6 +393,7 @@ def CalculateGeneratorInputInfo(params): LINK.host ?= %(LINK.host)s LDFLAGS.host ?= $(LDFLAGS_host) AR.host ?= %(AR.host)s +PLI.host ?= %(PLI.host)s # Define a dir function that can handle spaces. # http://www.gnu.org/software/make/manual/make.html#Syntax-of-Functions @@ -628,6 +631,15 @@ def WriteRootHeaderSuffixRules(writer): writer.write("\n") +SHARED_HEADER_OS390_COMMANDS = """ +PLIFLAGS.target ?= -qlp=64 -qlimits=extname=31 $(PLIFLAGS) +PLIFLAGS.host ?= -qlp=64 -qlimits=extname=31 $(PLIFLAGS) + +quiet_cmd_pli = PLI($(TOOLSET)) $@ +cmd_pli = $(PLI.$(TOOLSET)) $(GYP_PLIFLAGS) $(PLIFLAGS.$(TOOLSET)) -c $< && \ + if [ -f $(notdir $@) ]; then /bin/cp $(notdir $@) $@; else true; fi +""" + SHARED_HEADER_SUFFIX_RULES_COMMENT1 = """\ # Suffix rules, putting all outputs into $(obj). """ @@ -669,10 +681,7 @@ def WriteRootHeaderSuffixRules(writer): def Compilable(filename): """Return true if the file is compilable (should be in OBJS).""" - for res in (filename.endswith(e) for e in COMPILABLE_EXTENSIONS): - if res: - return True - return False + return any(res for res in (filename.endswith(e) for e in COMPILABLE_EXTENSIONS)) def Linkable(filename): @@ -766,7 +775,7 @@ def __init__(self, generator_flags, flavor): self.suffix_rules_objdir2 = {} # Generate suffix rules for all compilable extensions. - for ext in COMPILABLE_EXTENSIONS.keys(): + for ext in COMPILABLE_EXTENSIONS: # Suffix rules for source folder. self.suffix_rules_srcdir.update( { @@ -1054,7 +1063,7 @@ def WriteActions( # libraries, but until everything is made cross-compile safe, also use # target libraries. # TODO(piman): when everything is cross-compile safe, remove lib.target - if self.flavor == "zos" or self.flavor == "aix": + if self.flavor in {"zos", "aix"}: self.WriteLn( "cmd_%s = LIBPATH=$(builddir)/lib.host:" "$(builddir)/lib.target:$$LIBPATH; " @@ -1980,10 +1989,7 @@ def WriteTarget( and self.toolset == "target" ): # On mac, products are created in install_path immediately. - assert install_path == self.output, "{} != {}".format( - install_path, - self.output, - ) + assert install_path == self.output, f"{install_path} != {self.output}" # Point the target alias to the final binary output. self.WriteMakeRule( @@ -2022,7 +2028,7 @@ def WriteTarget( installable_deps.append( self.GetUnversionedSidedeckFromSidedeck(install_path) ) - if self.output != self.alias and self.alias != self.target: + if self.alias not in (self.output, self.target): self.WriteMakeRule( [self.alias], installable_deps, @@ -2450,10 +2456,12 @@ def CalculateMakefilePath(build_file, base_name): "AR.target": GetEnvironFallback(("AR_target", "AR"), "$(AR)"), "CXX.target": GetEnvironFallback(("CXX_target", "CXX"), "$(CXX)"), "LINK.target": GetEnvironFallback(("LINK_target", "LINK"), "$(LINK)"), + "PLI.target": GetEnvironFallback(("PLI_target", "PLI"), "pli"), "CC.host": GetEnvironFallback(("CC_host", "CC"), "gcc"), "AR.host": GetEnvironFallback(("AR_host", "AR"), "ar"), "CXX.host": GetEnvironFallback(("CXX_host", "CXX"), "g++"), "LINK.host": GetEnvironFallback(("LINK_host", "LINK"), "$(CXX.host)"), + "PLI.host": GetEnvironFallback(("PLI_host", "PLI"), "pli"), } if flavor == "mac": flock_command = "./gyp-mac-tool flock" @@ -2469,16 +2477,36 @@ def CalculateMakefilePath(build_file, base_name): header_params.update({"link_commands": LINK_COMMANDS_ANDROID}) elif flavor == "zos": copy_archive_arguments = "-fPR" - makedep_arguments = "-qmakedep=gcc" + CC_target = GetEnvironFallback(("CC_target", "CC"), "njsc") + makedep_arguments = "-MMD" + if CC_target == "clang": + CC_host = GetEnvironFallback(("CC_host", "CC"), "clang") + CXX_target = GetEnvironFallback(("CXX_target", "CXX"), "clang++") + CXX_host = GetEnvironFallback(("CXX_host", "CXX"), "clang++") + elif CC_target == "ibm-clang64": + CC_host = GetEnvironFallback(("CC_host", "CC"), "ibm-clang64") + CXX_target = GetEnvironFallback(("CXX_target", "CXX"), "ibm-clang++64") + CXX_host = GetEnvironFallback(("CXX_host", "CXX"), "ibm-clang++64") + elif CC_target == "ibm-clang": + CC_host = GetEnvironFallback(("CC_host", "CC"), "ibm-clang") + CXX_target = GetEnvironFallback(("CXX_target", "CXX"), "ibm-clang++") + CXX_host = GetEnvironFallback(("CXX_host", "CXX"), "ibm-clang++") + else: + # Node.js versions prior to v18: + makedep_arguments = "-qmakedep=gcc" + CC_host = GetEnvironFallback(("CC_host", "CC"), "njsc") + CXX_target = GetEnvironFallback(("CXX_target", "CXX"), "njsc++") + CXX_host = GetEnvironFallback(("CXX_host", "CXX"), "njsc++") header_params.update( { "copy_archive_args": copy_archive_arguments, "makedep_args": makedep_arguments, "link_commands": LINK_COMMANDS_OS390, - "CC.target": GetEnvironFallback(("CC_target", "CC"), "njsc"), - "CXX.target": GetEnvironFallback(("CXX_target", "CXX"), "njsc++"), - "CC.host": GetEnvironFallback(("CC_host", "CC"), "njsc"), - "CXX.host": GetEnvironFallback(("CXX_host", "CXX"), "njsc++"), + "extra_commands": SHARED_HEADER_OS390_COMMANDS, + "CC.target": CC_target, + "CXX.target": CXX_target, + "CC.host": CC_host, + "CXX.host": CXX_host, } ) elif flavor == "solaris": diff --git a/tools/gyp/pylib/gyp/generator/msvs.py b/tools/gyp/pylib/gyp/generator/msvs.py index fd950057847980..13b0794b4dccc3 100644 --- a/tools/gyp/pylib/gyp/generator/msvs.py +++ b/tools/gyp/pylib/gyp/generator/msvs.py @@ -164,7 +164,7 @@ def _FixPath(path, separator="\\"): fixpath_prefix and path and not os.path.isabs(path) - and not path[0] == "$" + and path[0] != "$" and not _IsWindowsAbsPath(path) ): path = os.path.join(fixpath_prefix, path) @@ -281,9 +281,9 @@ def _ToolSetOrAppend(tools, tool_name, setting, value, only_if_unset=False): else: value = [i.replace("/", "\\") for i in value] if not tools.get(tool_name): - tools[tool_name] = dict() + tools[tool_name] = {} tool = tools[tool_name] - if "CompileAsWinRT" == setting: + if setting == "CompileAsWinRT": return if tool.get(setting): if only_if_unset: @@ -412,10 +412,7 @@ def _BuildCommandLineForRuleRaw( return input_dir_preamble + cmd else: # Convert cat --> type to mimic unix. - if cmd[0] == "cat": - command = ["type"] - else: - command = [cmd[0].replace("/", "\\")] + command = ["type"] if cmd[0] == "cat" else [cmd[0].replace("/", "\\")] # Add call before command to ensure that commands can be tied together one # after the other without aborting in Incredibuild, since IB makes a bat # file out of the raw command string, and some commands (like python) are @@ -438,6 +435,7 @@ def _BuildCommandLineForRuleRaw( # Support a mode for using cmd directly. # Convert any paths to native form (first element is used directly). # TODO(quote): regularize quoting path names throughout the module + command[1] = '"%s"' % command[1] arguments = ['"%s"' % i for i in arguments] # Collapse into a single command. return input_dir_preamble + " ".join(command + arguments) @@ -687,7 +685,7 @@ def _GenerateExternalRules(rules, output_dir, spec, sources, options, actions_to all_outputs.update(OrderedSet(outputs)) # Only use one target from each rule as the dependency for # 'all' so we don't try to build each rule multiple times. - first_outputs.append(list(outputs)[0]) + first_outputs.append(next(iter(outputs))) # Get the unique output directories for this rule. output_dirs = [os.path.split(i)[0] for i in outputs] for od in output_dirs: @@ -756,7 +754,7 @@ def _EscapeEnvironmentVariableExpansion(s): Returns: The escaped string. - """ # noqa: E731,E123,E501 + """ s = s.replace("%", "%%") return s @@ -1189,7 +1187,7 @@ def _AddConfigurationToMSVSProject(p, spec, config_type, config_name, config): precompiled_header = config.get("msvs_precompiled_header") # Prepare the list of tools as a dictionary. - tools = dict() + tools = {} # Add in user specified msvs_settings. msvs_settings = config.get("msvs_settings", {}) MSVSSettings.ValidateMSVSSettings(msvs_settings) @@ -1384,10 +1382,7 @@ def _GetDefines(config): """ defines = [] for d in config.get("defines", []): - if type(d) == list: - fd = "=".join([str(dpart) for dpart in d]) - else: - fd = str(d) + fd = "=".join([str(dpart) for dpart in d]) if isinstance(d, list) else str(d) defines.append(fd) return defines @@ -1578,10 +1573,10 @@ def _AdjustSourcesAndConvertToFilterHierarchy( # such as ../../src/modules/module1 etc. if version.UsesVcxproj(): while ( - all([isinstance(s, MSVSProject.Filter) for s in sources]) + all(isinstance(s, MSVSProject.Filter) for s in sources) and len({s.name for s in sources}) == 1 ): - assert all([len(s.contents) == 1 for s in sources]) + assert all(len(s.contents) == 1 for s in sources) sources = [s.contents[0] for s in sources] else: while len(sources) == 1 and isinstance(sources[0], MSVSProject.Filter): @@ -1598,10 +1593,7 @@ def _IdlFilesHandledNonNatively(spec, sources): if rule["extension"] == "idl" and int(rule.get("msvs_external_rule", 0)): using_idl = True break - if using_idl: - excluded_idl = [i for i in sources if i.endswith(".idl")] - else: - excluded_idl = [] + excluded_idl = [i for i in sources if i.endswith(".idl")] if using_idl else [] return excluded_idl @@ -1819,7 +1811,7 @@ def _GetPathDict(root, path): parent, folder = os.path.split(path) parent_dict = _GetPathDict(root, parent) if folder not in parent_dict: - parent_dict[folder] = dict() + parent_dict[folder] = {} return parent_dict[folder] @@ -3013,18 +3005,26 @@ def _GetMSBuildConfigurationDetails(spec, build_file): msbuild_attributes = _GetMSBuildAttributes(spec, settings, build_file) condition = _GetConfigurationCondition(name, settings, spec) character_set = msbuild_attributes.get("CharacterSet") + vctools_version = msbuild_attributes.get("VCToolsVersion") config_type = msbuild_attributes.get("ConfigurationType") _AddConditionalProperty(properties, condition, "ConfigurationType", config_type) + spectre_mitigation = msbuild_attributes.get('SpectreMitigation') + if spectre_mitigation: + _AddConditionalProperty(properties, condition, "SpectreMitigation", + spectre_mitigation) if config_type == "Driver": _AddConditionalProperty(properties, condition, "DriverType", "WDM") _AddConditionalProperty( properties, condition, "TargetVersion", _ConfigTargetVersion(settings) ) - if character_set: - if "msvs_enable_winrt" not in spec: - _AddConditionalProperty( - properties, condition, "CharacterSet", character_set - ) + if character_set and "msvs_enable_winrt" not in spec: + _AddConditionalProperty( + properties, condition, "CharacterSet", character_set + ) + if vctools_version and "msvs_enable_winrt" not in spec: + _AddConditionalProperty( + properties, condition, "VCToolsVersion", vctools_version + ) return _GetMSBuildPropertyGroup(spec, "Configuration", properties) @@ -3104,6 +3104,10 @@ def _ConvertMSVSBuildAttributes(spec, config, build_file): msbuild_attributes[a] = _ConvertMSVSCharacterSet(msvs_attributes[a]) elif a == "ConfigurationType": msbuild_attributes[a] = _ConvertMSVSConfigurationType(msvs_attributes[a]) + elif a == "SpectreMitigation": + msbuild_attributes[a] = msvs_attributes[a] + elif a == "VCToolsVersion": + msbuild_attributes[a] = msvs_attributes[a] else: print("Warning: Do not know how to convert MSVS attribute " + a) return msbuild_attributes @@ -3326,15 +3330,14 @@ def _GetMSBuildToolSettingsSections(spec, configurations): for tool_name, tool_settings in sorted(msbuild_settings.items()): # Skip the tool named '' which is a holder of global settings handled # by _GetMSBuildConfigurationGlobalProperties. - if tool_name: - if tool_settings: - tool = [tool_name] - for name, value in sorted(tool_settings.items()): - formatted_value = _GetValueFormattedForMSBuild( - tool_name, name, value - ) - tool.append([name, formatted_value]) - group.append(tool) + if tool_name and tool_settings: + tool = [tool_name] + for name, value in sorted(tool_settings.items()): + formatted_value = _GetValueFormattedForMSBuild( + tool_name, name, value + ) + tool.append([name, formatted_value]) + group.append(tool) groups.append(group) return groups @@ -3462,10 +3465,7 @@ def _GetValueFormattedForMSBuild(tool_name, name, value): "Link": ["AdditionalOptions"], "Lib": ["AdditionalOptions"], } - if tool_name in exceptions and name in exceptions[tool_name]: - char = " " - else: - char = ";" + char = " " if name in exceptions.get(tool_name, []) else ";" formatted_value = char.join( [MSVSSettings.ConvertVCMacrosToMSBuild(i) for i in value] ) diff --git a/tools/gyp/pylib/gyp/generator/ninja.py b/tools/gyp/pylib/gyp/generator/ninja.py index 3db3771ac97855..8ba341e96d3f0d 100644 --- a/tools/gyp/pylib/gyp/generator/ninja.py +++ b/tools/gyp/pylib/gyp/generator/ninja.py @@ -1583,7 +1583,7 @@ def WriteTarget(self, spec, config_name, config, link_deps, compile_deps): elif spec["type"] == "static_library": self.target.binary = self.ComputeOutput(spec) if ( - self.flavor not in ("mac", "openbsd", "netbsd", "win") + self.flavor not in ("ios", "mac", "netbsd", "openbsd", "win") and not self.is_standalone_static_library ): self.ninja.build( @@ -1815,10 +1815,7 @@ def ComputeOutputFileName(self, spec, type=None): "executable": default_variables["EXECUTABLE_SUFFIX"], } extension = spec.get("product_extension") - if extension: - extension = "." + extension - else: - extension = DEFAULT_EXTENSION.get(type, "") + extension = "." + extension if extension else DEFAULT_EXTENSION.get(type, "") if "product_name" in spec: # If we were given an explicit name, use that. @@ -2496,7 +2493,7 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, config_name ), ) - if flavor != "mac" and flavor != "win": + if flavor not in ("ios", "mac", "win"): master_ninja.rule( "alink", description="AR $out", @@ -2533,7 +2530,7 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, config_name description="SOLINK $lib", restat=True, command=mtime_preserving_solink_base - % {"suffix": "@$link_file_list"}, # noqa: E501 + % {"suffix": "@$link_file_list"}, rspfile="$link_file_list", rspfile_content=( "-Wl,--whole-archive $in $solibs -Wl," "--no-whole-archive $libs" diff --git a/tools/gyp/pylib/gyp/generator/xcode.py b/tools/gyp/pylib/gyp/generator/xcode.py index 2f4d17e514e439..1ac672c3876bd9 100644 --- a/tools/gyp/pylib/gyp/generator/xcode.py +++ b/tools/gyp/pylib/gyp/generator/xcode.py @@ -439,7 +439,7 @@ def Finalize2(self, xcode_targets, xcode_target_to_target_dict): # it opens the project file, which will result in unnecessary diffs. # TODO(mark): This is evil because it relies on internal knowledge of # PBXProject._other_pbxprojects. - for other_pbxproject in self.project._other_pbxprojects.keys(): + for other_pbxproject in self.project._other_pbxprojects: self.project.AddOrGetProjectReference(other_pbxproject) self.project.SortRemoteProductReferences() @@ -1118,10 +1118,7 @@ def GenerateOutput(target_list, target_dicts, data, params): for concrete_output_index, concrete_output in enumerate( concrete_outputs ): - if concrete_output_index == 0: - bol = "" - else: - bol = " " + bol = "" if concrete_output_index == 0 else " " makefile.write(f"{bol}{concrete_output} \\\n") concrete_output_dir = posixpath.dirname(concrete_output) diff --git a/tools/gyp/pylib/gyp/input.py b/tools/gyp/pylib/gyp/input.py index 354958bfb2ab55..8f39519dee51fb 100644 --- a/tools/gyp/pylib/gyp/input.py +++ b/tools/gyp/pylib/gyp/input.py @@ -16,9 +16,9 @@ import sys import threading import traceback -from distutils.version import StrictVersion from gyp.common import GypError from gyp.common import OrderedSet +from packaging.version import Version # A list of types that are treated as linkable. linkable_types = [ @@ -225,7 +225,7 @@ def LoadOneBuildFile(build_file_path, data, aux_data, includes, is_target, check return data[build_file_path] if os.path.exists(build_file_path): - build_file_contents = open(build_file_path, encoding='utf-8').read() + build_file_contents = open(build_file_path, encoding="utf-8").read() else: raise GypError(f"{build_file_path} not found (cwd: {os.getcwd()})") @@ -870,10 +870,7 @@ def ExpandVariables(input, phase, variables, build_file): # This works around actions/rules which have more inputs than will # fit on the command line. if file_list: - if type(contents) is list: - contents_list = contents - else: - contents_list = contents.split(" ") + contents_list = contents if type(contents) is list else contents.split(" ") replacement = contents_list[0] if os.path.isabs(replacement): raise GypError('| cannot handle absolute paths, got "%s"' % replacement) @@ -961,13 +958,13 @@ def ExpandVariables(input, phase, variables, build_file): # Fix up command with platform specific workarounds. contents = FixupPlatformCommand(contents) try: - p = subprocess.Popen( + # stderr will be printed no matter what + result = subprocess.run( contents, - shell=use_shell, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - stdin=subprocess.PIPE, + shell=use_shell, cwd=build_file_dir, + check=False ) except Exception as e: raise GypError( @@ -975,19 +972,12 @@ def ExpandVariables(input, phase, variables, build_file): % (e, contents, build_file) ) - p_stdout, p_stderr = p.communicate("") - p_stdout = p_stdout.decode("utf-8") - p_stderr = p_stderr.decode("utf-8") - - if p.wait() != 0 or p_stderr: - sys.stderr.write(p_stderr) - # Simulate check_call behavior, since check_call only exists - # in python 2.5 and later. + if result.returncode > 0: raise GypError( "Call to '%s' returned exit status %d while in %s." - % (contents, p.returncode, build_file) + % (contents, result.returncode, build_file) ) - replacement = p_stdout.rstrip() + replacement = result.stdout.decode("utf-8").rstrip() cached_command_results[cache_key] = replacement else: @@ -1190,7 +1180,7 @@ def EvalSingleCondition(cond_expr, true_dict, false_dict, phase, variables, buil else: ast_code = compile(cond_expr_expanded, "", "eval") cached_conditions_asts[cond_expr_expanded] = ast_code - env = {"__builtins__": {}, "v": StrictVersion} + env = {"__builtins__": {}, "v": Version} if eval(ast_code, env, variables): return true_dict return false_dict @@ -1586,14 +1576,12 @@ def ExpandWildcardDependencies(targets, data): continue dependency_target_name = dependency_target_dict["target_name"] if ( - dependency_target != "*" - and dependency_target != dependency_target_name + dependency_target not in {"*", dependency_target_name} ): continue dependency_target_toolset = dependency_target_dict["toolset"] if ( - dependency_toolset != "*" - and dependency_toolset != dependency_target_toolset + dependency_toolset not in {"*", dependency_target_toolset} ): continue dependency = gyp.common.QualifiedTarget( @@ -1637,15 +1625,14 @@ def RemoveSelfDependencies(targets): dependencies = target_dict.get(dependency_key, []) if dependencies: for t in dependencies: - if t == target_name: - if ( - targets[t] - .get("variables", {}) - .get("prune_self_dependency", 0) - ): - target_dict[dependency_key] = Filter( - dependencies, target_name - ) + if t == target_name and ( + targets[t] + .get("variables", {}) + .get("prune_self_dependency", 0) + ): + target_dict[dependency_key] = Filter( + dependencies, target_name + ) def RemoveLinkDependenciesFromNoneTargets(targets): @@ -2245,10 +2232,7 @@ def is_in_set_or_list(x, s, items): singleton = False if type(item) in (str, int): # The cheap and easy case. - if is_paths: - to_item = MakePathRelative(to_file, fro_file, item) - else: - to_item = item + to_item = MakePathRelative(to_file, fro_file, item) if is_paths else item if not (type(item) is str and item.startswith("-")): # Any string that doesn't begin with a "-" is a singleton - it can @@ -2474,10 +2458,7 @@ def SetUpConfigurations(target, target_dict): new_configuration_dict = {} for (key, target_val) in target_dict.items(): key_ext = key[-1:] - if key_ext in key_suffixes: - key_base = key[:-1] - else: - key_base = key + key_base = key[:-1] if key_ext in key_suffixes else key if key_base not in non_configuration_keys: new_configuration_dict[key] = gyp.simple_copy.deepcopy(target_val) @@ -2489,7 +2470,7 @@ def SetUpConfigurations(target, target_dict): merged_configurations[configuration] = new_configuration_dict # Put the new configurations back into the target dict as a configuration. - for configuration in merged_configurations.keys(): + for configuration in merged_configurations: target_dict["configurations"][configuration] = merged_configurations[ configuration ] @@ -2506,19 +2487,16 @@ def SetUpConfigurations(target, target_dict): delete_keys = [] for key in target_dict: key_ext = key[-1:] - if key_ext in key_suffixes: - key_base = key[:-1] - else: - key_base = key + key_base = key[:-1] if key_ext in key_suffixes else key if key_base not in non_configuration_keys: delete_keys.append(key) for key in delete_keys: del target_dict[key] # Check the configurations to see if they contain invalid keys. - for configuration in target_dict["configurations"].keys(): + for configuration in target_dict["configurations"]: configuration_dict = target_dict["configurations"][configuration] - for key in configuration_dict.keys(): + for key in configuration_dict: if key in invalid_configuration_keys: raise GypError( "%s not allowed in the %s configuration, found in " @@ -2561,7 +2539,7 @@ def ProcessListFiltersInDict(name, the_dict): del_lists = [] for key, value in the_dict.items(): operation = key[-1] - if operation != "!" and operation != "/": + if operation not in {"!", "/"}: continue if type(value) is not list: diff --git a/tools/gyp/pylib/gyp/msvs_emulation.py b/tools/gyp/pylib/gyp/msvs_emulation.py index 5b9c2712e091b4..38fa21dd666697 100644 --- a/tools/gyp/pylib/gyp/msvs_emulation.py +++ b/tools/gyp/pylib/gyp/msvs_emulation.py @@ -93,7 +93,7 @@ def _AddPrefix(element, prefix): if element is None: return element # Note, not Iterable because we don't want to handle strings like that. - if isinstance(element, list) or isinstance(element, tuple): + if isinstance(element, (list, tuple)): return [prefix + e for e in element] else: return prefix + element @@ -105,7 +105,7 @@ def _DoRemapping(element, map): if map is not None and element is not None: if not callable(map): map = map.get # Assume it's a dict, otherwise a callable to do the remap. - if isinstance(element, list) or isinstance(element, tuple): + if isinstance(element, (list, tuple)): element = filter(None, [map(elem) for elem in element]) else: element = map(element) @@ -117,7 +117,7 @@ def _AppendOrReturn(append, element): then add |element| to it, adding each item in |element| if it's a list or tuple.""" if append is not None and element is not None: - if isinstance(element, list) or isinstance(element, tuple): + if isinstance(element, (list, tuple)): append.extend(element) else: append.append(element) @@ -183,7 +183,7 @@ def ExtractSharedMSVSSystemIncludes(configs, generator_flags): expanded_system_includes = OrderedSet( [ExpandMacros(include, env) for include in all_system_includes] ) - if any(["$" in include for include in expanded_system_includes]): + if any("$" in include for include in expanded_system_includes): # Some path relies on target-specific variables, bail. return None @@ -255,10 +255,7 @@ def GetVSMacroEnv(self, base_to_build=None, config=None): """Get a dict of variables mapping internal VS macro names to their gyp equivalents.""" target_arch = self.GetArch(config) - if target_arch == "x86": - target_platform = "Win32" - else: - target_platform = target_arch + target_platform = "Win32" if target_arch == "x86" else target_arch target_name = self.spec.get("product_prefix", "") + self.spec.get( "product_name", self.spec["target_name"] ) @@ -738,10 +735,7 @@ def GetLdflags( # TODO(scottmg): This should sort of be somewhere else (not really a flag). ld("AdditionalDependencies", prefix="") - if self.GetArch(config) == "x86": - safeseh_default = "true" - else: - safeseh_default = None + safeseh_default = "true" if self.GetArch(config) == "x86" else None ld( "ImageHasSafeExceptionHandlers", map={"false": ":NO", "true": ""}, @@ -960,15 +954,12 @@ def GetRuleShellFlags(self, rule): def _HasExplicitRuleForExtension(self, spec, extension): """Determine if there's an explicit rule for a particular extension.""" - for rule in spec.get("rules", []): - if rule["extension"] == extension: - return True - return False + return any(rule["extension"] == extension for rule in spec.get("rules", [])) def _HasExplicitIdlActions(self, spec): """Determine if an action should not run midl for .idl files.""" return any( - [action.get("explicit_idl_action", 0) for action in spec.get("actions", [])] + action.get("explicit_idl_action", 0) for action in spec.get("actions", []) ) def HasExplicitIdlRulesOrActions(self, spec): diff --git a/tools/gyp/pylib/gyp/win_tool.py b/tools/gyp/pylib/gyp/win_tool.py index 638eee40029411..171d7295747fcd 100755 --- a/tools/gyp/pylib/gyp/win_tool.py +++ b/tools/gyp/pylib/gyp/win_tool.py @@ -219,11 +219,10 @@ def ExecLinkWithManifests( our_manifest = "%(out)s.manifest" % variables # Load and normalize the manifests. mt.exe sometimes removes whitespace, # and sometimes doesn't unfortunately. - with open(our_manifest) as our_f: - with open(assert_manifest) as assert_f: - translator = str.maketrans('', '', string.whitespace) - our_data = our_f.read().translate(translator) - assert_data = assert_f.read().translate(translator) + with open(our_manifest) as our_f, open(assert_manifest) as assert_f: + translator = str.maketrans("", "", string.whitespace) + our_data = our_f.read().translate(translator) + assert_data = assert_f.read().translate(translator) if our_data != assert_data: os.unlink(out) diff --git a/tools/gyp/pylib/gyp/xcode_emulation.py b/tools/gyp/pylib/gyp/xcode_emulation.py index a75d8eeab7bda0..29caf1ce7fbb97 100644 --- a/tools/gyp/pylib/gyp/xcode_emulation.py +++ b/tools/gyp/pylib/gyp/xcode_emulation.py @@ -685,10 +685,7 @@ def GetCflags(self, configname, arch=None): if platform_root: cflags.append("-F" + platform_root + "/Developer/Library/Frameworks/") - if sdk_root: - framework_root = sdk_root - else: - framework_root = "" + framework_root = sdk_root if sdk_root else "" config = self.spec["configurations"][self.configname] framework_dirs = config.get("mac_framework_dirs", []) for directory in framework_dirs: @@ -1248,10 +1245,7 @@ def _AdjustLibrary(self, library, config_name=None): l_flag = "-framework " + os.path.splitext(os.path.basename(library))[0] else: m = self.library_re.match(library) - if m: - l_flag = "-l" + m.group(1) - else: - l_flag = library + l_flag = "-l" + m.group(1) if m else library sdk_root = self._SdkPath(config_name) if not sdk_root: @@ -1545,7 +1539,7 @@ def CLTVersion(): except GypError: continue - regex = re.compile(r'Command Line Tools for Xcode\s+(?P\S+)') + regex = re.compile(r"Command Line Tools for Xcode\s+(?P\S+)") try: output = GetStdout(["/usr/sbin/softwareupdate", "--history"]) return re.search(regex, output).groupdict()["version"] diff --git a/tools/gyp/pylib/gyp/xcodeproj_file.py b/tools/gyp/pylib/gyp/xcodeproj_file.py index 076eea37211179..33c667c266bf69 100644 --- a/tools/gyp/pylib/gyp/xcodeproj_file.py +++ b/tools/gyp/pylib/gyp/xcodeproj_file.py @@ -971,7 +971,7 @@ def __init__(self, properties=None, id=None, parent=None): if "path" in self._properties and "name" not in self._properties: path = self._properties["path"] name = posixpath.basename(path) - if name != "" and path != name: + if name not in ("", path): self.SetProperty("name", name) if "path" in self._properties and ( @@ -2355,9 +2355,8 @@ def __init__( # property was supplied, set "productName" if it is not present. Also set # the "PRODUCT_NAME" build setting in each configuration, but only if # the setting is not present in any build configuration. - if "name" in self._properties: - if "productName" not in self._properties: - self.SetProperty("productName", self._properties["name"]) + if "name" in self._properties and "productName" not in self._properties: + self.SetProperty("productName", self._properties["name"]) if "productName" in self._properties: if "buildConfigurationList" in self._properties: @@ -2547,13 +2546,12 @@ def __init__( force_extension = suffix[1:] if ( - self._properties["productType"] - == "com.apple.product-type-bundle.unit.test" - or self._properties["productType"] - == "com.apple.product-type-bundle.ui-testing" - ): - if force_extension is None: - force_extension = suffix[1:] + self._properties["productType"] in { + "com.apple.product-type-bundle.unit.test", + "com.apple.product-type-bundle.ui-testing" + } + ) and force_extension is None: + force_extension = suffix[1:] if force_extension is not None: # If it's a wrapper (bundle), set WRAPPER_EXTENSION. @@ -2636,10 +2634,13 @@ def HeadersPhase(self): # frameworks phases, if any. insert_at = len(self._properties["buildPhases"]) for index, phase in enumerate(self._properties["buildPhases"]): - if ( - isinstance(phase, PBXResourcesBuildPhase) - or isinstance(phase, PBXSourcesBuildPhase) - or isinstance(phase, PBXFrameworksBuildPhase) + if isinstance( + phase, + ( + PBXResourcesBuildPhase, + PBXSourcesBuildPhase, + PBXFrameworksBuildPhase, + ), ): insert_at = index break @@ -2658,9 +2659,7 @@ def ResourcesPhase(self): # phases, if any. insert_at = len(self._properties["buildPhases"]) for index, phase in enumerate(self._properties["buildPhases"]): - if isinstance(phase, PBXSourcesBuildPhase) or isinstance( - phase, PBXFrameworksBuildPhase - ): + if isinstance(phase, (PBXSourcesBuildPhase, PBXFrameworksBuildPhase)): insert_at = index break @@ -2701,8 +2700,10 @@ def AddDependency(self, other): other._properties["productType"] == static_library_type or ( ( - other._properties["productType"] == shared_library_type - or other._properties["productType"] == framework_type + other._properties["productType"] in { + shared_library_type, + framework_type + } ) and ( (not other.HasBuildSetting("MACH_O_TYPE")) @@ -2770,7 +2771,7 @@ def __init__(self, properties=None, id=None, parent=None, path=None): self.path = path self._other_pbxprojects = {} # super - return XCContainerPortal.__init__(self, properties, id, parent) + XCContainerPortal.__init__(self, properties, id, parent) def Name(self): name = self.path @@ -2990,7 +2991,7 @@ def AddOrGetProjectReference(self, other_pbxproject): # Xcode seems to sort this list case-insensitively self._properties["projectReferences"] = sorted( self._properties["projectReferences"], - key=lambda x: x["ProjectRef"].Name().lower + key=lambda x: x["ProjectRef"].Name().lower() ) else: # The link already exists. Pull out the relevnt data. diff --git a/tools/gyp/pylib/packaging/LICENSE b/tools/gyp/pylib/packaging/LICENSE new file mode 100644 index 00000000000000..6f62d44e4ef733 --- /dev/null +++ b/tools/gyp/pylib/packaging/LICENSE @@ -0,0 +1,3 @@ +This software is made available under the terms of *either* of the licenses +found in LICENSE.APACHE or LICENSE.BSD. Contributions to this software is made +under the terms of *both* these licenses. diff --git a/tools/gyp/pylib/packaging/LICENSE.APACHE b/tools/gyp/pylib/packaging/LICENSE.APACHE new file mode 100644 index 00000000000000..f433b1a53f5b83 --- /dev/null +++ b/tools/gyp/pylib/packaging/LICENSE.APACHE @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/tools/gyp/pylib/packaging/LICENSE.BSD b/tools/gyp/pylib/packaging/LICENSE.BSD new file mode 100644 index 00000000000000..42ce7b75c92fb0 --- /dev/null +++ b/tools/gyp/pylib/packaging/LICENSE.BSD @@ -0,0 +1,23 @@ +Copyright (c) Donald Stufft and individual contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/tools/gyp/pylib/packaging/__init__.py b/tools/gyp/pylib/packaging/__init__.py new file mode 100644 index 00000000000000..5fd91838316fbe --- /dev/null +++ b/tools/gyp/pylib/packaging/__init__.py @@ -0,0 +1,15 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +__title__ = "packaging" +__summary__ = "Core utilities for Python packages" +__uri__ = "https://github.com/pypa/packaging" + +__version__ = "23.3.dev0" + +__author__ = "Donald Stufft and individual contributors" +__email__ = "donald@stufft.io" + +__license__ = "BSD-2-Clause or Apache-2.0" +__copyright__ = "2014 %s" % __author__ diff --git a/tools/gyp/pylib/packaging/_elffile.py b/tools/gyp/pylib/packaging/_elffile.py new file mode 100644 index 00000000000000..6fb19b30bb53c1 --- /dev/null +++ b/tools/gyp/pylib/packaging/_elffile.py @@ -0,0 +1,108 @@ +""" +ELF file parser. + +This provides a class ``ELFFile`` that parses an ELF executable in a similar +interface to ``ZipFile``. Only the read interface is implemented. + +Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca +ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html +""" + +import enum +import os +import struct +from typing import IO, Optional, Tuple + + +class ELFInvalid(ValueError): + pass + + +class EIClass(enum.IntEnum): + C32 = 1 + C64 = 2 + + +class EIData(enum.IntEnum): + Lsb = 1 + Msb = 2 + + +class EMachine(enum.IntEnum): + I386 = 3 + S390 = 22 + Arm = 40 + X8664 = 62 + AArc64 = 183 + + +class ELFFile: + """ + Representation of an ELF executable. + """ + + def __init__(self, f: IO[bytes]) -> None: + self._f = f + + try: + ident = self._read("16B") + except struct.error: + raise ELFInvalid("unable to parse identification") + magic = bytes(ident[:4]) + if magic != b"\x7fELF": + raise ELFInvalid(f"invalid magic: {magic!r}") + + self.capacity = ident[4] # Format for program header (bitness). + self.encoding = ident[5] # Data structure encoding (endianness). + + try: + # e_fmt: Format for program header. + # p_fmt: Format for section header. + # p_idx: Indexes to find p_type, p_offset, and p_filesz. + e_fmt, self._p_fmt, self._p_idx = { + (1, 1): ("HHIIIIIHHH", ">IIIIIIII", (0, 1, 4)), # 32-bit MSB. + (2, 1): ("HHIQQQIHHH", ">IIQQQQQQ", (0, 2, 5)), # 64-bit MSB. + }[(self.capacity, self.encoding)] + except KeyError: + raise ELFInvalid( + f"unrecognized capacity ({self.capacity}) or " + f"encoding ({self.encoding})" + ) + + try: + ( + _, + self.machine, # Architecture type. + _, + _, + self._e_phoff, # Offset of program header. + _, + self.flags, # Processor-specific flags. + _, + self._e_phentsize, # Size of section. + self._e_phnum, # Number of sections. + ) = self._read(e_fmt) + except struct.error as e: + raise ELFInvalid("unable to parse machine and section information") from e + + def _read(self, fmt: str) -> Tuple[int, ...]: + return struct.unpack(fmt, self._f.read(struct.calcsize(fmt))) + + @property + def interpreter(self) -> Optional[str]: + """ + The path recorded in the ``PT_INTERP`` section header. + """ + for index in range(self._e_phnum): + self._f.seek(self._e_phoff + self._e_phentsize * index) + try: + data = self._read(self._p_fmt) + except struct.error: + continue + if data[self._p_idx[0]] != 3: # Not PT_INTERP. + continue + self._f.seek(data[self._p_idx[1]]) + return os.fsdecode(self._f.read(data[self._p_idx[2]])).strip("\0") + return None diff --git a/tools/gyp/pylib/packaging/_manylinux.py b/tools/gyp/pylib/packaging/_manylinux.py new file mode 100644 index 00000000000000..3705d50db9193e --- /dev/null +++ b/tools/gyp/pylib/packaging/_manylinux.py @@ -0,0 +1,252 @@ +import collections +import contextlib +import functools +import os +import re +import sys +import warnings +from typing import Dict, Generator, Iterator, NamedTuple, Optional, Sequence, Tuple + +from ._elffile import EIClass, EIData, ELFFile, EMachine + +EF_ARM_ABIMASK = 0xFF000000 +EF_ARM_ABI_VER5 = 0x05000000 +EF_ARM_ABI_FLOAT_HARD = 0x00000400 + + +# `os.PathLike` not a generic type until Python 3.9, so sticking with `str` +# as the type for `path` until then. +@contextlib.contextmanager +def _parse_elf(path: str) -> Generator[Optional[ELFFile], None, None]: + try: + with open(path, "rb") as f: + yield ELFFile(f) + except (OSError, TypeError, ValueError): + yield None + + +def _is_linux_armhf(executable: str) -> bool: + # hard-float ABI can be detected from the ELF header of the running + # process + # https://static.docs.arm.com/ihi0044/g/aaelf32.pdf + with _parse_elf(executable) as f: + return ( + f is not None + and f.capacity == EIClass.C32 + and f.encoding == EIData.Lsb + and f.machine == EMachine.Arm + and f.flags & EF_ARM_ABIMASK == EF_ARM_ABI_VER5 + and f.flags & EF_ARM_ABI_FLOAT_HARD == EF_ARM_ABI_FLOAT_HARD + ) + + +def _is_linux_i686(executable: str) -> bool: + with _parse_elf(executable) as f: + return ( + f is not None + and f.capacity == EIClass.C32 + and f.encoding == EIData.Lsb + and f.machine == EMachine.I386 + ) + + +def _have_compatible_abi(executable: str, archs: Sequence[str]) -> bool: + if "armv7l" in archs: + return _is_linux_armhf(executable) + if "i686" in archs: + return _is_linux_i686(executable) + allowed_archs = {"x86_64", "aarch64", "ppc64", "ppc64le", "s390x", "loongarch64"} + return any(arch in allowed_archs for arch in archs) + + +# If glibc ever changes its major version, we need to know what the last +# minor version was, so we can build the complete list of all versions. +# For now, guess what the highest minor version might be, assume it will +# be 50 for testing. Once this actually happens, update the dictionary +# with the actual value. +_LAST_GLIBC_MINOR: Dict[int, int] = collections.defaultdict(lambda: 50) + + +class _GLibCVersion(NamedTuple): + major: int + minor: int + + +def _glibc_version_string_confstr() -> Optional[str]: + """ + Primary implementation of glibc_version_string using os.confstr. + """ + # os.confstr is quite a bit faster than ctypes.DLL. It's also less likely + # to be broken or missing. This strategy is used in the standard library + # platform module. + # https://github.com/python/cpython/blob/fcf1d003bf4f0100c/Lib/platform.py#L175-L183 + try: + # Should be a string like "glibc 2.17". + version_string: str = getattr(os, "confstr")("CS_GNU_LIBC_VERSION") + assert version_string is not None + _, version = version_string.rsplit() + except (AssertionError, AttributeError, OSError, ValueError): + # os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)... + return None + return version + + +def _glibc_version_string_ctypes() -> Optional[str]: + """ + Fallback implementation of glibc_version_string using ctypes. + """ + try: + import ctypes + except ImportError: + return None + + # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen + # manpage says, "If filename is NULL, then the returned handle is for the + # main program". This way we can let the linker do the work to figure out + # which libc our process is actually using. + # + # We must also handle the special case where the executable is not a + # dynamically linked executable. This can occur when using musl libc, + # for example. In this situation, dlopen() will error, leading to an + # OSError. Interestingly, at least in the case of musl, there is no + # errno set on the OSError. The single string argument used to construct + # OSError comes from libc itself and is therefore not portable to + # hard code here. In any case, failure to call dlopen() means we + # can proceed, so we bail on our attempt. + try: + process_namespace = ctypes.CDLL(None) + except OSError: + return None + + try: + gnu_get_libc_version = process_namespace.gnu_get_libc_version + except AttributeError: + # Symbol doesn't exist -> therefore, we are not linked to + # glibc. + return None + + # Call gnu_get_libc_version, which returns a string like "2.5" + gnu_get_libc_version.restype = ctypes.c_char_p + version_str: str = gnu_get_libc_version() + # py2 / py3 compatibility: + if not isinstance(version_str, str): + version_str = version_str.decode("ascii") + + return version_str + + +def _glibc_version_string() -> Optional[str]: + """Returns glibc version string, or None if not using glibc.""" + return _glibc_version_string_confstr() or _glibc_version_string_ctypes() + + +def _parse_glibc_version(version_str: str) -> Tuple[int, int]: + """Parse glibc version. + + We use a regexp instead of str.split because we want to discard any + random junk that might come after the minor version -- this might happen + in patched/forked versions of glibc (e.g. Linaro's version of glibc + uses version strings like "2.20-2014.11"). See gh-3588. + """ + m = re.match(r"(?P[0-9]+)\.(?P[0-9]+)", version_str) + if not m: + warnings.warn( + f"Expected glibc version with 2 components major.minor," + f" got: {version_str}", + RuntimeWarning, + ) + return -1, -1 + return int(m.group("major")), int(m.group("minor")) + + +@functools.lru_cache() +def _get_glibc_version() -> Tuple[int, int]: + version_str = _glibc_version_string() + if version_str is None: + return (-1, -1) + return _parse_glibc_version(version_str) + + +# From PEP 513, PEP 600 +def _is_compatible(arch: str, version: _GLibCVersion) -> bool: + sys_glibc = _get_glibc_version() + if sys_glibc < version: + return False + # Check for presence of _manylinux module. + try: + import _manylinux # noqa + except ImportError: + return True + if hasattr(_manylinux, "manylinux_compatible"): + result = _manylinux.manylinux_compatible(version[0], version[1], arch) + if result is not None: + return bool(result) + return True + if version == _GLibCVersion(2, 5): + if hasattr(_manylinux, "manylinux1_compatible"): + return bool(_manylinux.manylinux1_compatible) + if version == _GLibCVersion(2, 12): + if hasattr(_manylinux, "manylinux2010_compatible"): + return bool(_manylinux.manylinux2010_compatible) + if version == _GLibCVersion(2, 17): + if hasattr(_manylinux, "manylinux2014_compatible"): + return bool(_manylinux.manylinux2014_compatible) + return True + + +_LEGACY_MANYLINUX_MAP = { + # CentOS 7 w/ glibc 2.17 (PEP 599) + (2, 17): "manylinux2014", + # CentOS 6 w/ glibc 2.12 (PEP 571) + (2, 12): "manylinux2010", + # CentOS 5 w/ glibc 2.5 (PEP 513) + (2, 5): "manylinux1", +} + + +def platform_tags(archs: Sequence[str]) -> Iterator[str]: + """Generate manylinux tags compatible to the current platform. + + :param archs: Sequence of compatible architectures. + The first one shall be the closest to the actual architecture and be the part of + platform tag after the ``linux_`` prefix, e.g. ``x86_64``. + The ``linux_`` prefix is assumed as a prerequisite for the current platform to + be manylinux-compatible. + + :returns: An iterator of compatible manylinux tags. + """ + if not _have_compatible_abi(sys.executable, archs): + return + # Oldest glibc to be supported regardless of architecture is (2, 17). + too_old_glibc2 = _GLibCVersion(2, 16) + if set(archs) & {"x86_64", "i686"}: + # On x86/i686 also oldest glibc to be supported is (2, 5). + too_old_glibc2 = _GLibCVersion(2, 4) + current_glibc = _GLibCVersion(*_get_glibc_version()) + glibc_max_list = [current_glibc] + # We can assume compatibility across glibc major versions. + # https://sourceware.org/bugzilla/show_bug.cgi?id=24636 + # + # Build a list of maximum glibc versions so that we can + # output the canonical list of all glibc from current_glibc + # down to too_old_glibc2, including all intermediary versions. + for glibc_major in range(current_glibc.major - 1, 1, -1): + glibc_minor = _LAST_GLIBC_MINOR[glibc_major] + glibc_max_list.append(_GLibCVersion(glibc_major, glibc_minor)) + for arch in archs: + for glibc_max in glibc_max_list: + if glibc_max.major == too_old_glibc2.major: + min_minor = too_old_glibc2.minor + else: + # For other glibc major versions oldest supported is (x, 0). + min_minor = -1 + for glibc_minor in range(glibc_max.minor, min_minor, -1): + glibc_version = _GLibCVersion(glibc_max.major, glibc_minor) + tag = "manylinux_{}_{}".format(*glibc_version) + if _is_compatible(arch, glibc_version): + yield f"{tag}_{arch}" + # Handle the legacy manylinux1, manylinux2010, manylinux2014 tags. + if glibc_version in _LEGACY_MANYLINUX_MAP: + legacy_tag = _LEGACY_MANYLINUX_MAP[glibc_version] + if _is_compatible(arch, glibc_version): + yield f"{legacy_tag}_{arch}" diff --git a/tools/gyp/pylib/packaging/_musllinux.py b/tools/gyp/pylib/packaging/_musllinux.py new file mode 100644 index 00000000000000..86419df9d7087f --- /dev/null +++ b/tools/gyp/pylib/packaging/_musllinux.py @@ -0,0 +1,83 @@ +"""PEP 656 support. + +This module implements logic to detect if the currently running Python is +linked against musl, and what musl version is used. +""" + +import functools +import re +import subprocess +import sys +from typing import Iterator, NamedTuple, Optional, Sequence + +from ._elffile import ELFFile + + +class _MuslVersion(NamedTuple): + major: int + minor: int + + +def _parse_musl_version(output: str) -> Optional[_MuslVersion]: + lines = [n for n in (n.strip() for n in output.splitlines()) if n] + if len(lines) < 2 or lines[0][:4] != "musl": + return None + m = re.match(r"Version (\d+)\.(\d+)", lines[1]) + if not m: + return None + return _MuslVersion(major=int(m.group(1)), minor=int(m.group(2))) + + +@functools.lru_cache() +def _get_musl_version(executable: str) -> Optional[_MuslVersion]: + """Detect currently-running musl runtime version. + + This is done by checking the specified executable's dynamic linking + information, and invoking the loader to parse its output for a version + string. If the loader is musl, the output would be something like:: + + musl libc (x86_64) + Version 1.2.2 + Dynamic Program Loader + """ + try: + with open(executable, "rb") as f: + ld = ELFFile(f).interpreter + except (OSError, TypeError, ValueError): + return None + if ld is None or "musl" not in ld: + return None + proc = subprocess.run([ld], stderr=subprocess.PIPE, text=True) + return _parse_musl_version(proc.stderr) + + +def platform_tags(archs: Sequence[str]) -> Iterator[str]: + """Generate musllinux tags compatible to the current platform. + + :param archs: Sequence of compatible architectures. + The first one shall be the closest to the actual architecture and be the part of + platform tag after the ``linux_`` prefix, e.g. ``x86_64``. + The ``linux_`` prefix is assumed as a prerequisite for the current platform to + be musllinux-compatible. + + :returns: An iterator of compatible musllinux tags. + """ + sys_musl = _get_musl_version(sys.executable) + if sys_musl is None: # Python not dynamically linked against musl. + return + for arch in archs: + for minor in range(sys_musl.minor, -1, -1): + yield f"musllinux_{sys_musl.major}_{minor}_{arch}" + + +if __name__ == "__main__": # pragma: no cover + import sysconfig + + plat = sysconfig.get_platform() + assert plat.startswith("linux-"), "not linux" + + print("plat:", plat) + print("musl:", _get_musl_version(sys.executable)) + print("tags:", end=" ") + for t in platform_tags(re.sub(r"[.-]", "_", plat.split("-", 1)[-1])): + print(t, end="\n ") diff --git a/tools/gyp/pylib/packaging/_parser.py b/tools/gyp/pylib/packaging/_parser.py new file mode 100644 index 00000000000000..4576981c2dd755 --- /dev/null +++ b/tools/gyp/pylib/packaging/_parser.py @@ -0,0 +1,359 @@ +"""Handwritten parser of dependency specifiers. + +The docstring for each __parse_* function contains ENBF-inspired grammar representing +the implementation. +""" + +import ast +from typing import Any, List, NamedTuple, Optional, Tuple, Union + +from ._tokenizer import DEFAULT_RULES, Tokenizer + + +class Node: + def __init__(self, value: str) -> None: + self.value = value + + def __str__(self) -> str: + return self.value + + def __repr__(self) -> str: + return f"<{self.__class__.__name__}('{self}')>" + + def serialize(self) -> str: + raise NotImplementedError + + +class Variable(Node): + def serialize(self) -> str: + return str(self) + + +class Value(Node): + def serialize(self) -> str: + return f'"{self}"' + + +class Op(Node): + def serialize(self) -> str: + return str(self) + + +MarkerVar = Union[Variable, Value] +MarkerItem = Tuple[MarkerVar, Op, MarkerVar] +# MarkerAtom = Union[MarkerItem, List["MarkerAtom"]] +# MarkerList = List[Union["MarkerList", MarkerAtom, str]] +# mypy does not support recursive type definition +# https://github.com/python/mypy/issues/731 +MarkerAtom = Any +MarkerList = List[Any] + + +class ParsedRequirement(NamedTuple): + name: str + url: str + extras: List[str] + specifier: str + marker: Optional[MarkerList] + + +# -------------------------------------------------------------------------------------- +# Recursive descent parser for dependency specifier +# -------------------------------------------------------------------------------------- +def parse_requirement(source: str) -> ParsedRequirement: + return _parse_requirement(Tokenizer(source, rules=DEFAULT_RULES)) + + +def _parse_requirement(tokenizer: Tokenizer) -> ParsedRequirement: + """ + requirement = WS? IDENTIFIER WS? extras WS? requirement_details + """ + tokenizer.consume("WS") + + name_token = tokenizer.expect( + "IDENTIFIER", expected="package name at the start of dependency specifier" + ) + name = name_token.text + tokenizer.consume("WS") + + extras = _parse_extras(tokenizer) + tokenizer.consume("WS") + + url, specifier, marker = _parse_requirement_details(tokenizer) + tokenizer.expect("END", expected="end of dependency specifier") + + return ParsedRequirement(name, url, extras, specifier, marker) + + +def _parse_requirement_details( + tokenizer: Tokenizer, +) -> Tuple[str, str, Optional[MarkerList]]: + """ + requirement_details = AT URL (WS requirement_marker?)? + | specifier WS? (requirement_marker)? + """ + + specifier = "" + url = "" + marker = None + + if tokenizer.check("AT"): + tokenizer.read() + tokenizer.consume("WS") + + url_start = tokenizer.position + url = tokenizer.expect("URL", expected="URL after @").text + if tokenizer.check("END", peek=True): + return (url, specifier, marker) + + tokenizer.expect("WS", expected="whitespace after URL") + + # The input might end after whitespace. + if tokenizer.check("END", peek=True): + return (url, specifier, marker) + + marker = _parse_requirement_marker( + tokenizer, span_start=url_start, after="URL and whitespace" + ) + else: + specifier_start = tokenizer.position + specifier = _parse_specifier(tokenizer) + tokenizer.consume("WS") + + if tokenizer.check("END", peek=True): + return (url, specifier, marker) + + marker = _parse_requirement_marker( + tokenizer, + span_start=specifier_start, + after=( + "version specifier" + if specifier + else "name and no valid version specifier" + ), + ) + + return (url, specifier, marker) + + +def _parse_requirement_marker( + tokenizer: Tokenizer, *, span_start: int, after: str +) -> MarkerList: + """ + requirement_marker = SEMICOLON marker WS? + """ + + if not tokenizer.check("SEMICOLON"): + tokenizer.raise_syntax_error( + f"Expected end or semicolon (after {after})", + span_start=span_start, + ) + tokenizer.read() + + marker = _parse_marker(tokenizer) + tokenizer.consume("WS") + + return marker + + +def _parse_extras(tokenizer: Tokenizer) -> List[str]: + """ + extras = (LEFT_BRACKET wsp* extras_list? wsp* RIGHT_BRACKET)? + """ + if not tokenizer.check("LEFT_BRACKET", peek=True): + return [] + + with tokenizer.enclosing_tokens( + "LEFT_BRACKET", + "RIGHT_BRACKET", + around="extras", + ): + tokenizer.consume("WS") + extras = _parse_extras_list(tokenizer) + tokenizer.consume("WS") + + return extras + + +def _parse_extras_list(tokenizer: Tokenizer) -> List[str]: + """ + extras_list = identifier (wsp* ',' wsp* identifier)* + """ + extras: List[str] = [] + + if not tokenizer.check("IDENTIFIER"): + return extras + + extras.append(tokenizer.read().text) + + while True: + tokenizer.consume("WS") + if tokenizer.check("IDENTIFIER", peek=True): + tokenizer.raise_syntax_error("Expected comma between extra names") + elif not tokenizer.check("COMMA"): + break + + tokenizer.read() + tokenizer.consume("WS") + + extra_token = tokenizer.expect("IDENTIFIER", expected="extra name after comma") + extras.append(extra_token.text) + + return extras + + +def _parse_specifier(tokenizer: Tokenizer) -> str: + """ + specifier = LEFT_PARENTHESIS WS? version_many WS? RIGHT_PARENTHESIS + | WS? version_many WS? + """ + with tokenizer.enclosing_tokens( + "LEFT_PARENTHESIS", + "RIGHT_PARENTHESIS", + around="version specifier", + ): + tokenizer.consume("WS") + parsed_specifiers = _parse_version_many(tokenizer) + tokenizer.consume("WS") + + return parsed_specifiers + + +def _parse_version_many(tokenizer: Tokenizer) -> str: + """ + version_many = (SPECIFIER (WS? COMMA WS? SPECIFIER)*)? + """ + parsed_specifiers = "" + while tokenizer.check("SPECIFIER"): + span_start = tokenizer.position + parsed_specifiers += tokenizer.read().text + if tokenizer.check("VERSION_PREFIX_TRAIL", peek=True): + tokenizer.raise_syntax_error( + ".* suffix can only be used with `==` or `!=` operators", + span_start=span_start, + span_end=tokenizer.position + 1, + ) + if tokenizer.check("VERSION_LOCAL_LABEL_TRAIL", peek=True): + tokenizer.raise_syntax_error( + "Local version label can only be used with `==` or `!=` operators", + span_start=span_start, + span_end=tokenizer.position, + ) + tokenizer.consume("WS") + if not tokenizer.check("COMMA"): + break + parsed_specifiers += tokenizer.read().text + tokenizer.consume("WS") + + return parsed_specifiers + + +# -------------------------------------------------------------------------------------- +# Recursive descent parser for marker expression +# -------------------------------------------------------------------------------------- +def parse_marker(source: str) -> MarkerList: + return _parse_full_marker(Tokenizer(source, rules=DEFAULT_RULES)) + + +def _parse_full_marker(tokenizer: Tokenizer) -> MarkerList: + retval = _parse_marker(tokenizer) + tokenizer.expect("END", expected="end of marker expression") + return retval + + +def _parse_marker(tokenizer: Tokenizer) -> MarkerList: + """ + marker = marker_atom (BOOLOP marker_atom)+ + """ + expression = [_parse_marker_atom(tokenizer)] + while tokenizer.check("BOOLOP"): + token = tokenizer.read() + expr_right = _parse_marker_atom(tokenizer) + expression.extend((token.text, expr_right)) + return expression + + +def _parse_marker_atom(tokenizer: Tokenizer) -> MarkerAtom: + """ + marker_atom = WS? LEFT_PARENTHESIS WS? marker WS? RIGHT_PARENTHESIS WS? + | WS? marker_item WS? + """ + + tokenizer.consume("WS") + if tokenizer.check("LEFT_PARENTHESIS", peek=True): + with tokenizer.enclosing_tokens( + "LEFT_PARENTHESIS", + "RIGHT_PARENTHESIS", + around="marker expression", + ): + tokenizer.consume("WS") + marker: MarkerAtom = _parse_marker(tokenizer) + tokenizer.consume("WS") + else: + marker = _parse_marker_item(tokenizer) + tokenizer.consume("WS") + return marker + + +def _parse_marker_item(tokenizer: Tokenizer) -> MarkerItem: + """ + marker_item = WS? marker_var WS? marker_op WS? marker_var WS? + """ + tokenizer.consume("WS") + marker_var_left = _parse_marker_var(tokenizer) + tokenizer.consume("WS") + marker_op = _parse_marker_op(tokenizer) + tokenizer.consume("WS") + marker_var_right = _parse_marker_var(tokenizer) + tokenizer.consume("WS") + return (marker_var_left, marker_op, marker_var_right) + + +def _parse_marker_var(tokenizer: Tokenizer) -> MarkerVar: + """ + marker_var = VARIABLE | QUOTED_STRING + """ + if tokenizer.check("VARIABLE"): + return process_env_var(tokenizer.read().text.replace(".", "_")) + elif tokenizer.check("QUOTED_STRING"): + return process_python_str(tokenizer.read().text) + else: + tokenizer.raise_syntax_error( + message="Expected a marker variable or quoted string" + ) + + +def process_env_var(env_var: str) -> Variable: + if ( + env_var == "platform_python_implementation" + or env_var == "python_implementation" + ): + return Variable("platform_python_implementation") + else: + return Variable(env_var) + + +def process_python_str(python_str: str) -> Value: + value = ast.literal_eval(python_str) + return Value(str(value)) + + +def _parse_marker_op(tokenizer: Tokenizer) -> Op: + """ + marker_op = IN | NOT IN | OP + """ + if tokenizer.check("IN"): + tokenizer.read() + return Op("in") + elif tokenizer.check("NOT"): + tokenizer.read() + tokenizer.expect("WS", expected="whitespace after 'not'") + tokenizer.expect("IN", expected="'in' after 'not'") + return Op("not in") + elif tokenizer.check("OP"): + return Op(tokenizer.read().text) + else: + return tokenizer.raise_syntax_error( + "Expected marker operator, one of " + "<=, <, !=, ==, >=, >, ~=, ===, in, not in" + ) diff --git a/tools/gyp/pylib/packaging/_structures.py b/tools/gyp/pylib/packaging/_structures.py new file mode 100644 index 00000000000000..90a6465f9682c8 --- /dev/null +++ b/tools/gyp/pylib/packaging/_structures.py @@ -0,0 +1,61 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + + +class InfinityType: + def __repr__(self) -> str: + return "Infinity" + + def __hash__(self) -> int: + return hash(repr(self)) + + def __lt__(self, other: object) -> bool: + return False + + def __le__(self, other: object) -> bool: + return False + + def __eq__(self, other: object) -> bool: + return isinstance(other, self.__class__) + + def __gt__(self, other: object) -> bool: + return True + + def __ge__(self, other: object) -> bool: + return True + + def __neg__(self: object) -> "NegativeInfinityType": + return NegativeInfinity + + +Infinity = InfinityType() + + +class NegativeInfinityType: + def __repr__(self) -> str: + return "-Infinity" + + def __hash__(self) -> int: + return hash(repr(self)) + + def __lt__(self, other: object) -> bool: + return True + + def __le__(self, other: object) -> bool: + return True + + def __eq__(self, other: object) -> bool: + return isinstance(other, self.__class__) + + def __gt__(self, other: object) -> bool: + return False + + def __ge__(self, other: object) -> bool: + return False + + def __neg__(self: object) -> InfinityType: + return Infinity + + +NegativeInfinity = NegativeInfinityType() diff --git a/tools/gyp/pylib/packaging/_tokenizer.py b/tools/gyp/pylib/packaging/_tokenizer.py new file mode 100644 index 00000000000000..dd0d648d49a7c1 --- /dev/null +++ b/tools/gyp/pylib/packaging/_tokenizer.py @@ -0,0 +1,192 @@ +import contextlib +import re +from dataclasses import dataclass +from typing import Dict, Iterator, NoReturn, Optional, Tuple, Union + +from .specifiers import Specifier + + +@dataclass +class Token: + name: str + text: str + position: int + + +class ParserSyntaxError(Exception): + """The provided source text could not be parsed correctly.""" + + def __init__( + self, + message: str, + *, + source: str, + span: Tuple[int, int], + ) -> None: + self.span = span + self.message = message + self.source = source + + super().__init__() + + def __str__(self) -> str: + marker = " " * self.span[0] + "~" * (self.span[1] - self.span[0]) + "^" + return "\n ".join([self.message, self.source, marker]) + + +DEFAULT_RULES: "Dict[str, Union[str, re.Pattern[str]]]" = { + "LEFT_PARENTHESIS": r"\(", + "RIGHT_PARENTHESIS": r"\)", + "LEFT_BRACKET": r"\[", + "RIGHT_BRACKET": r"\]", + "SEMICOLON": r";", + "COMMA": r",", + "QUOTED_STRING": re.compile( + r""" + ( + ('[^']*') + | + ("[^"]*") + ) + """, + re.VERBOSE, + ), + "OP": r"(===|==|~=|!=|<=|>=|<|>)", + "BOOLOP": r"\b(or|and)\b", + "IN": r"\bin\b", + "NOT": r"\bnot\b", + "VARIABLE": re.compile( + r""" + \b( + python_version + |python_full_version + |os[._]name + |sys[._]platform + |platform_(release|system) + |platform[._](version|machine|python_implementation) + |python_implementation + |implementation_(name|version) + |extra + )\b + """, + re.VERBOSE, + ), + "SPECIFIER": re.compile( + Specifier._operator_regex_str + Specifier._version_regex_str, + re.VERBOSE | re.IGNORECASE, + ), + "AT": r"\@", + "URL": r"[^ \t]+", + "IDENTIFIER": r"\b[a-zA-Z0-9][a-zA-Z0-9._-]*\b", + "VERSION_PREFIX_TRAIL": r"\.\*", + "VERSION_LOCAL_LABEL_TRAIL": r"\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*", + "WS": r"[ \t]+", + "END": r"$", +} + + +class Tokenizer: + """Context-sensitive token parsing. + + Provides methods to examine the input stream to check whether the next token + matches. + """ + + def __init__( + self, + source: str, + *, + rules: "Dict[str, Union[str, re.Pattern[str]]]", + ) -> None: + self.source = source + self.rules: Dict[str, re.Pattern[str]] = { + name: re.compile(pattern) for name, pattern in rules.items() + } + self.next_token: Optional[Token] = None + self.position = 0 + + def consume(self, name: str) -> None: + """Move beyond provided token name, if at current position.""" + if self.check(name): + self.read() + + def check(self, name: str, *, peek: bool = False) -> bool: + """Check whether the next token has the provided name. + + By default, if the check succeeds, the token *must* be read before + another check. If `peek` is set to `True`, the token is not loaded and + would need to be checked again. + """ + assert ( + self.next_token is None + ), f"Cannot check for {name!r}, already have {self.next_token!r}" + assert name in self.rules, f"Unknown token name: {name!r}" + + expression = self.rules[name] + + match = expression.match(self.source, self.position) + if match is None: + return False + if not peek: + self.next_token = Token(name, match[0], self.position) + return True + + def expect(self, name: str, *, expected: str) -> Token: + """Expect a certain token name next, failing with a syntax error otherwise. + + The token is *not* read. + """ + if not self.check(name): + raise self.raise_syntax_error(f"Expected {expected}") + return self.read() + + def read(self) -> Token: + """Consume the next token and return it.""" + token = self.next_token + assert token is not None + + self.position += len(token.text) + self.next_token = None + + return token + + def raise_syntax_error( + self, + message: str, + *, + span_start: Optional[int] = None, + span_end: Optional[int] = None, + ) -> NoReturn: + """Raise ParserSyntaxError at the given position.""" + span = ( + self.position if span_start is None else span_start, + self.position if span_end is None else span_end, + ) + raise ParserSyntaxError( + message, + source=self.source, + span=span, + ) + + @contextlib.contextmanager + def enclosing_tokens( + self, open_token: str, close_token: str, *, around: str + ) -> Iterator[None]: + if self.check(open_token): + open_position = self.position + self.read() + else: + open_position = None + + yield + + if open_position is None: + return + + if not self.check(close_token): + self.raise_syntax_error( + f"Expected matching {close_token} for {open_token}, after {around}", + span_start=open_position, + ) + + self.read() diff --git a/tools/gyp/pylib/packaging/markers.py b/tools/gyp/pylib/packaging/markers.py new file mode 100644 index 00000000000000..8b98fca7233be6 --- /dev/null +++ b/tools/gyp/pylib/packaging/markers.py @@ -0,0 +1,252 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +import operator +import os +import platform +import sys +from typing import Any, Callable, Dict, List, Optional, Tuple, Union + +from ._parser import ( + MarkerAtom, + MarkerList, + Op, + Value, + Variable, + parse_marker as _parse_marker, +) +from ._tokenizer import ParserSyntaxError +from .specifiers import InvalidSpecifier, Specifier +from .utils import canonicalize_name + +__all__ = [ + "InvalidMarker", + "UndefinedComparison", + "UndefinedEnvironmentName", + "Marker", + "default_environment", +] + +Operator = Callable[[str, str], bool] + + +class InvalidMarker(ValueError): + """ + An invalid marker was found, users should refer to PEP 508. + """ + + +class UndefinedComparison(ValueError): + """ + An invalid operation was attempted on a value that doesn't support it. + """ + + +class UndefinedEnvironmentName(ValueError): + """ + A name was attempted to be used that does not exist inside of the + environment. + """ + + +def _normalize_extra_values(results: Any) -> Any: + """ + Normalize extra values. + """ + if isinstance(results[0], tuple): + lhs, op, rhs = results[0] + if isinstance(lhs, Variable) and lhs.value == "extra": + normalized_extra = canonicalize_name(rhs.value) + rhs = Value(normalized_extra) + elif isinstance(rhs, Variable) and rhs.value == "extra": + normalized_extra = canonicalize_name(lhs.value) + lhs = Value(normalized_extra) + results[0] = lhs, op, rhs + return results + + +def _format_marker( + marker: Union[List[str], MarkerAtom, str], first: Optional[bool] = True +) -> str: + + assert isinstance(marker, (list, tuple, str)) + + # Sometimes we have a structure like [[...]] which is a single item list + # where the single item is itself it's own list. In that case we want skip + # the rest of this function so that we don't get extraneous () on the + # outside. + if ( + isinstance(marker, list) + and len(marker) == 1 + and isinstance(marker[0], (list, tuple)) + ): + return _format_marker(marker[0]) + + if isinstance(marker, list): + inner = (_format_marker(m, first=False) for m in marker) + if first: + return " ".join(inner) + else: + return "(" + " ".join(inner) + ")" + elif isinstance(marker, tuple): + return " ".join([m.serialize() for m in marker]) + else: + return marker + + +_operators: Dict[str, Operator] = { + "in": lambda lhs, rhs: lhs in rhs, + "not in": lambda lhs, rhs: lhs not in rhs, + "<": operator.lt, + "<=": operator.le, + "==": operator.eq, + "!=": operator.ne, + ">=": operator.ge, + ">": operator.gt, +} + + +def _eval_op(lhs: str, op: Op, rhs: str) -> bool: + try: + spec = Specifier("".join([op.serialize(), rhs])) + except InvalidSpecifier: + pass + else: + return spec.contains(lhs, prereleases=True) + + oper: Optional[Operator] = _operators.get(op.serialize()) + if oper is None: + raise UndefinedComparison(f"Undefined {op!r} on {lhs!r} and {rhs!r}.") + + return oper(lhs, rhs) + + +def _normalize(*values: str, key: str) -> Tuple[str, ...]: + # PEP 685 – Comparison of extra names for optional distribution dependencies + # https://peps.python.org/pep-0685/ + # > When comparing extra names, tools MUST normalize the names being + # > compared using the semantics outlined in PEP 503 for names + if key == "extra": + return tuple(canonicalize_name(v) for v in values) + + # other environment markers don't have such standards + return values + + +def _evaluate_markers(markers: MarkerList, environment: Dict[str, str]) -> bool: + groups: List[List[bool]] = [[]] + + for marker in markers: + assert isinstance(marker, (list, tuple, str)) + + if isinstance(marker, list): + groups[-1].append(_evaluate_markers(marker, environment)) + elif isinstance(marker, tuple): + lhs, op, rhs = marker + + if isinstance(lhs, Variable): + environment_key = lhs.value + lhs_value = environment[environment_key] + rhs_value = rhs.value + else: + lhs_value = lhs.value + environment_key = rhs.value + rhs_value = environment[environment_key] + + lhs_value, rhs_value = _normalize(lhs_value, rhs_value, key=environment_key) + groups[-1].append(_eval_op(lhs_value, op, rhs_value)) + else: + assert marker in ["and", "or"] + if marker == "or": + groups.append([]) + + return any(all(item) for item in groups) + + +def format_full_version(info: "sys._version_info") -> str: + version = "{0.major}.{0.minor}.{0.micro}".format(info) + kind = info.releaselevel + if kind != "final": + version += kind[0] + str(info.serial) + return version + + +def default_environment() -> Dict[str, str]: + iver = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + return { + "implementation_name": implementation_name, + "implementation_version": iver, + "os_name": os.name, + "platform_machine": platform.machine(), + "platform_release": platform.release(), + "platform_system": platform.system(), + "platform_version": platform.version(), + "python_full_version": platform.python_version(), + "platform_python_implementation": platform.python_implementation(), + "python_version": ".".join(platform.python_version_tuple()[:2]), + "sys_platform": sys.platform, + } + + +class Marker: + def __init__(self, marker: str) -> None: + # Note: We create a Marker object without calling this constructor in + # packaging.requirements.Requirement. If any additional logic is + # added here, make sure to mirror/adapt Requirement. + try: + self._markers = _normalize_extra_values(_parse_marker(marker)) + # The attribute `_markers` can be described in terms of a recursive type: + # MarkerList = List[Union[Tuple[Node, ...], str, MarkerList]] + # + # For example, the following expression: + # python_version > "3.6" or (python_version == "3.6" and os_name == "unix") + # + # is parsed into: + # [ + # (, ')>, ), + # 'and', + # [ + # (, , ), + # 'or', + # (, , ) + # ] + # ] + except ParserSyntaxError as e: + raise InvalidMarker(str(e)) from e + + def __str__(self) -> str: + return _format_marker(self._markers) + + def __repr__(self) -> str: + return f"" + + def __hash__(self) -> int: + return hash((self.__class__.__name__, str(self))) + + def __eq__(self, other: Any) -> bool: + if not isinstance(other, Marker): + return NotImplemented + + return str(self) == str(other) + + def evaluate(self, environment: Optional[Dict[str, str]] = None) -> bool: + """Evaluate a marker. + + Return the boolean from evaluating the given marker against the + environment. environment is an optional argument to override all or + part of the determined environment. + + The environment is determined from the current Python process. + """ + current_environment = default_environment() + current_environment["extra"] = "" + if environment is not None: + current_environment.update(environment) + # The API used to allow setting extra to None. We need to handle this + # case for backwards compatibility. + if current_environment["extra"] is None: + current_environment["extra"] = "" + + return _evaluate_markers(self._markers, current_environment) diff --git a/tools/gyp/pylib/packaging/metadata.py b/tools/gyp/pylib/packaging/metadata.py new file mode 100644 index 00000000000000..fb274930799da0 --- /dev/null +++ b/tools/gyp/pylib/packaging/metadata.py @@ -0,0 +1,825 @@ +import email.feedparser +import email.header +import email.message +import email.parser +import email.policy +import sys +import typing +from typing import ( + Any, + Callable, + Dict, + Generic, + List, + Optional, + Tuple, + Type, + Union, + cast, +) + +from . import requirements, specifiers, utils, version as version_module + +T = typing.TypeVar("T") +if sys.version_info[:2] >= (3, 8): # pragma: no cover + from typing import Literal, TypedDict +else: # pragma: no cover + if typing.TYPE_CHECKING: + from typing_extensions import Literal, TypedDict + else: + try: + from typing_extensions import Literal, TypedDict + except ImportError: + + class Literal: + def __init_subclass__(*_args, **_kwargs): + pass + + class TypedDict: + def __init_subclass__(*_args, **_kwargs): + pass + + +try: + ExceptionGroup +except NameError: # pragma: no cover + + class ExceptionGroup(Exception): # noqa: N818 + """A minimal implementation of :external:exc:`ExceptionGroup` from Python 3.11. + + If :external:exc:`ExceptionGroup` is already defined by Python itself, + that version is used instead. + """ + + message: str + exceptions: List[Exception] + + def __init__(self, message: str, exceptions: List[Exception]) -> None: + self.message = message + self.exceptions = exceptions + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({self.message!r}, {self.exceptions!r})" + +else: # pragma: no cover + ExceptionGroup = ExceptionGroup + + +class InvalidMetadata(ValueError): + """A metadata field contains invalid data.""" + + field: str + """The name of the field that contains invalid data.""" + + def __init__(self, field: str, message: str) -> None: + self.field = field + super().__init__(message) + + +# The RawMetadata class attempts to make as few assumptions about the underlying +# serialization formats as possible. The idea is that as long as a serialization +# formats offer some very basic primitives in *some* way then we can support +# serializing to and from that format. +class RawMetadata(TypedDict, total=False): + """A dictionary of raw core metadata. + + Each field in core metadata maps to a key of this dictionary (when data is + provided). The key is lower-case and underscores are used instead of dashes + compared to the equivalent core metadata field. Any core metadata field that + can be specified multiple times or can hold multiple values in a single + field have a key with a plural name. See :class:`Metadata` whose attributes + match the keys of this dictionary. + + Core metadata fields that can be specified multiple times are stored as a + list or dict depending on which is appropriate for the field. Any fields + which hold multiple values in a single field are stored as a list. + + """ + + # Metadata 1.0 - PEP 241 + metadata_version: str + name: str + version: str + platforms: List[str] + summary: str + description: str + keywords: List[str] + home_page: str + author: str + author_email: str + license: str + + # Metadata 1.1 - PEP 314 + supported_platforms: List[str] + download_url: str + classifiers: List[str] + requires: List[str] + provides: List[str] + obsoletes: List[str] + + # Metadata 1.2 - PEP 345 + maintainer: str + maintainer_email: str + requires_dist: List[str] + provides_dist: List[str] + obsoletes_dist: List[str] + requires_python: str + requires_external: List[str] + project_urls: Dict[str, str] + + # Metadata 2.0 + # PEP 426 attempted to completely revamp the metadata format + # but got stuck without ever being able to build consensus on + # it and ultimately ended up withdrawn. + # + # However, a number of tools had started emitting METADATA with + # `2.0` Metadata-Version, so for historical reasons, this version + # was skipped. + + # Metadata 2.1 - PEP 566 + description_content_type: str + provides_extra: List[str] + + # Metadata 2.2 - PEP 643 + dynamic: List[str] + + # Metadata 2.3 - PEP 685 + # No new fields were added in PEP 685, just some edge case were + # tightened up to provide better interoptability. + + +_STRING_FIELDS = { + "author", + "author_email", + "description", + "description_content_type", + "download_url", + "home_page", + "license", + "maintainer", + "maintainer_email", + "metadata_version", + "name", + "requires_python", + "summary", + "version", +} + +_LIST_FIELDS = { + "classifiers", + "dynamic", + "obsoletes", + "obsoletes_dist", + "platforms", + "provides", + "provides_dist", + "provides_extra", + "requires", + "requires_dist", + "requires_external", + "supported_platforms", +} + +_DICT_FIELDS = { + "project_urls", +} + + +def _parse_keywords(data: str) -> List[str]: + """Split a string of comma-separate keyboards into a list of keywords.""" + return [k.strip() for k in data.split(",")] + + +def _parse_project_urls(data: List[str]) -> Dict[str, str]: + """Parse a list of label/URL string pairings separated by a comma.""" + urls = {} + for pair in data: + # Our logic is slightly tricky here as we want to try and do + # *something* reasonable with malformed data. + # + # The main thing that we have to worry about, is data that does + # not have a ',' at all to split the label from the Value. There + # isn't a singular right answer here, and we will fail validation + # later on (if the caller is validating) so it doesn't *really* + # matter, but since the missing value has to be an empty str + # and our return value is dict[str, str], if we let the key + # be the missing value, then they'd have multiple '' values that + # overwrite each other in a accumulating dict. + # + # The other potentional issue is that it's possible to have the + # same label multiple times in the metadata, with no solid "right" + # answer with what to do in that case. As such, we'll do the only + # thing we can, which is treat the field as unparseable and add it + # to our list of unparsed fields. + parts = [p.strip() for p in pair.split(",", 1)] + parts.extend([""] * (max(0, 2 - len(parts)))) # Ensure 2 items + + # TODO: The spec doesn't say anything about if the keys should be + # considered case sensitive or not... logically they should + # be case-preserving and case-insensitive, but doing that + # would open up more cases where we might have duplicate + # entries. + label, url = parts + if label in urls: + # The label already exists in our set of urls, so this field + # is unparseable, and we can just add the whole thing to our + # unparseable data and stop processing it. + raise KeyError("duplicate labels in project urls") + urls[label] = url + + return urls + + +def _get_payload(msg: email.message.Message, source: Union[bytes, str]) -> str: + """Get the body of the message.""" + # If our source is a str, then our caller has managed encodings for us, + # and we don't need to deal with it. + if isinstance(source, str): + payload: str = msg.get_payload() + return payload + # If our source is a bytes, then we're managing the encoding and we need + # to deal with it. + else: + bpayload: bytes = msg.get_payload(decode=True) + try: + return bpayload.decode("utf8", "strict") + except UnicodeDecodeError: + raise ValueError("payload in an invalid encoding") + + +# The various parse_FORMAT functions here are intended to be as lenient as +# possible in their parsing, while still returning a correctly typed +# RawMetadata. +# +# To aid in this, we also generally want to do as little touching of the +# data as possible, except where there are possibly some historic holdovers +# that make valid data awkward to work with. +# +# While this is a lower level, intermediate format than our ``Metadata`` +# class, some light touch ups can make a massive difference in usability. + +# Map METADATA fields to RawMetadata. +_EMAIL_TO_RAW_MAPPING = { + "author": "author", + "author-email": "author_email", + "classifier": "classifiers", + "description": "description", + "description-content-type": "description_content_type", + "download-url": "download_url", + "dynamic": "dynamic", + "home-page": "home_page", + "keywords": "keywords", + "license": "license", + "maintainer": "maintainer", + "maintainer-email": "maintainer_email", + "metadata-version": "metadata_version", + "name": "name", + "obsoletes": "obsoletes", + "obsoletes-dist": "obsoletes_dist", + "platform": "platforms", + "project-url": "project_urls", + "provides": "provides", + "provides-dist": "provides_dist", + "provides-extra": "provides_extra", + "requires": "requires", + "requires-dist": "requires_dist", + "requires-external": "requires_external", + "requires-python": "requires_python", + "summary": "summary", + "supported-platform": "supported_platforms", + "version": "version", +} +_RAW_TO_EMAIL_MAPPING = {raw: email for email, raw in _EMAIL_TO_RAW_MAPPING.items()} + + +def parse_email(data: Union[bytes, str]) -> Tuple[RawMetadata, Dict[str, List[str]]]: + """Parse a distribution's metadata stored as email headers (e.g. from ``METADATA``). + + This function returns a two-item tuple of dicts. The first dict is of + recognized fields from the core metadata specification. Fields that can be + parsed and translated into Python's built-in types are converted + appropriately. All other fields are left as-is. Fields that are allowed to + appear multiple times are stored as lists. + + The second dict contains all other fields from the metadata. This includes + any unrecognized fields. It also includes any fields which are expected to + be parsed into a built-in type but were not formatted appropriately. Finally, + any fields that are expected to appear only once but are repeated are + included in this dict. + + """ + raw: Dict[str, Union[str, List[str], Dict[str, str]]] = {} + unparsed: Dict[str, List[str]] = {} + + if isinstance(data, str): + parsed = email.parser.Parser(policy=email.policy.compat32).parsestr(data) + else: + parsed = email.parser.BytesParser(policy=email.policy.compat32).parsebytes(data) + + # We have to wrap parsed.keys() in a set, because in the case of multiple + # values for a key (a list), the key will appear multiple times in the + # list of keys, but we're avoiding that by using get_all(). + for name in frozenset(parsed.keys()): + # Header names in RFC are case insensitive, so we'll normalize to all + # lower case to make comparisons easier. + name = name.lower() + + # We use get_all() here, even for fields that aren't multiple use, + # because otherwise someone could have e.g. two Name fields, and we + # would just silently ignore it rather than doing something about it. + headers = parsed.get_all(name) or [] + + # The way the email module works when parsing bytes is that it + # unconditionally decodes the bytes as ascii using the surrogateescape + # handler. When you pull that data back out (such as with get_all() ), + # it looks to see if the str has any surrogate escapes, and if it does + # it wraps it in a Header object instead of returning the string. + # + # As such, we'll look for those Header objects, and fix up the encoding. + value = [] + # Flag if we have run into any issues processing the headers, thus + # signalling that the data belongs in 'unparsed'. + valid_encoding = True + for h in headers: + # It's unclear if this can return more types than just a Header or + # a str, so we'll just assert here to make sure. + assert isinstance(h, (email.header.Header, str)) + + # If it's a header object, we need to do our little dance to get + # the real data out of it. In cases where there is invalid data + # we're going to end up with mojibake, but there's no obvious, good + # way around that without reimplementing parts of the Header object + # ourselves. + # + # That should be fine since, if mojibacked happens, this key is + # going into the unparsed dict anyways. + if isinstance(h, email.header.Header): + # The Header object stores it's data as chunks, and each chunk + # can be independently encoded, so we'll need to check each + # of them. + chunks: List[Tuple[bytes, Optional[str]]] = [] + for bin, encoding in email.header.decode_header(h): + try: + bin.decode("utf8", "strict") + except UnicodeDecodeError: + # Enable mojibake. + encoding = "latin1" + valid_encoding = False + else: + encoding = "utf8" + chunks.append((bin, encoding)) + + # Turn our chunks back into a Header object, then let that + # Header object do the right thing to turn them into a + # string for us. + value.append(str(email.header.make_header(chunks))) + # This is already a string, so just add it. + else: + value.append(h) + + # We've processed all of our values to get them into a list of str, + # but we may have mojibake data, in which case this is an unparsed + # field. + if not valid_encoding: + unparsed[name] = value + continue + + raw_name = _EMAIL_TO_RAW_MAPPING.get(name) + if raw_name is None: + # This is a bit of a weird situation, we've encountered a key that + # we don't know what it means, so we don't know whether it's meant + # to be a list or not. + # + # Since we can't really tell one way or another, we'll just leave it + # as a list, even though it may be a single item list, because that's + # what makes the most sense for email headers. + unparsed[name] = value + continue + + # If this is one of our string fields, then we'll check to see if our + # value is a list of a single item. If it is then we'll assume that + # it was emitted as a single string, and unwrap the str from inside + # the list. + # + # If it's any other kind of data, then we haven't the faintest clue + # what we should parse it as, and we have to just add it to our list + # of unparsed stuff. + if raw_name in _STRING_FIELDS and len(value) == 1: + raw[raw_name] = value[0] + # If this is one of our list of string fields, then we can just assign + # the value, since email *only* has strings, and our get_all() call + # above ensures that this is a list. + elif raw_name in _LIST_FIELDS: + raw[raw_name] = value + # Special Case: Keywords + # The keywords field is implemented in the metadata spec as a str, + # but it conceptually is a list of strings, and is serialized using + # ", ".join(keywords), so we'll do some light data massaging to turn + # this into what it logically is. + elif raw_name == "keywords" and len(value) == 1: + raw[raw_name] = _parse_keywords(value[0]) + # Special Case: Project-URL + # The project urls is implemented in the metadata spec as a list of + # specially-formatted strings that represent a key and a value, which + # is fundamentally a mapping, however the email format doesn't support + # mappings in a sane way, so it was crammed into a list of strings + # instead. + # + # We will do a little light data massaging to turn this into a map as + # it logically should be. + elif raw_name == "project_urls": + try: + raw[raw_name] = _parse_project_urls(value) + except KeyError: + unparsed[name] = value + # Nothing that we've done has managed to parse this, so it'll just + # throw it in our unparseable data and move on. + else: + unparsed[name] = value + + # We need to support getting the Description from the message payload in + # addition to getting it from the the headers. This does mean, though, there + # is the possibility of it being set both ways, in which case we put both + # in 'unparsed' since we don't know which is right. + try: + payload = _get_payload(parsed, data) + except ValueError: + unparsed.setdefault("description", []).append( + parsed.get_payload(decode=isinstance(data, bytes)) + ) + else: + if payload: + # Check to see if we've already got a description, if so then both + # it, and this body move to unparseable. + if "description" in raw: + description_header = cast(str, raw.pop("description")) + unparsed.setdefault("description", []).extend( + [description_header, payload] + ) + elif "description" in unparsed: + unparsed["description"].append(payload) + else: + raw["description"] = payload + + # We need to cast our `raw` to a metadata, because a TypedDict only support + # literal key names, but we're computing our key names on purpose, but the + # way this function is implemented, our `TypedDict` can only have valid key + # names. + return cast(RawMetadata, raw), unparsed + + +_NOT_FOUND = object() + + +# Keep the two values in sync. +_VALID_METADATA_VERSIONS = ["1.0", "1.1", "1.2", "2.1", "2.2", "2.3"] +_MetadataVersion = Literal["1.0", "1.1", "1.2", "2.1", "2.2", "2.3"] + +_REQUIRED_ATTRS = frozenset(["metadata_version", "name", "version"]) + + +class _Validator(Generic[T]): + """Validate a metadata field. + + All _process_*() methods correspond to a core metadata field. The method is + called with the field's raw value. If the raw value is valid it is returned + in its "enriched" form (e.g. ``version.Version`` for the ``Version`` field). + If the raw value is invalid, :exc:`InvalidMetadata` is raised (with a cause + as appropriate). + """ + + name: str + raw_name: str + added: _MetadataVersion + + def __init__( + self, + *, + added: _MetadataVersion = "1.0", + ) -> None: + self.added = added + + def __set_name__(self, _owner: "Metadata", name: str) -> None: + self.name = name + self.raw_name = _RAW_TO_EMAIL_MAPPING[name] + + def __get__(self, instance: "Metadata", _owner: Type["Metadata"]) -> T: + # With Python 3.8, the caching can be replaced with functools.cached_property(). + # No need to check the cache as attribute lookup will resolve into the + # instance's __dict__ before __get__ is called. + cache = instance.__dict__ + value = instance._raw.get(self.name) + + # To make the _process_* methods easier, we'll check if the value is None + # and if this field is NOT a required attribute, and if both of those + # things are true, we'll skip the the converter. This will mean that the + # converters never have to deal with the None union. + if self.name in _REQUIRED_ATTRS or value is not None: + try: + converter: Callable[[Any], T] = getattr(self, f"_process_{self.name}") + except AttributeError: + pass + else: + value = converter(value) + + cache[self.name] = value + try: + del instance._raw[self.name] # type: ignore[misc] + except KeyError: + pass + + return cast(T, value) + + def _invalid_metadata( + self, msg: str, cause: Optional[Exception] = None + ) -> InvalidMetadata: + exc = InvalidMetadata( + self.raw_name, msg.format_map({"field": repr(self.raw_name)}) + ) + exc.__cause__ = cause + return exc + + def _process_metadata_version(self, value: str) -> _MetadataVersion: + # Implicitly makes Metadata-Version required. + if value not in _VALID_METADATA_VERSIONS: + raise self._invalid_metadata(f"{value!r} is not a valid metadata version") + return cast(_MetadataVersion, value) + + def _process_name(self, value: str) -> str: + if not value: + raise self._invalid_metadata("{field} is a required field") + # Validate the name as a side-effect. + try: + utils.canonicalize_name(value, validate=True) + except utils.InvalidName as exc: + raise self._invalid_metadata( + f"{value!r} is invalid for {{field}}", cause=exc + ) + else: + return value + + def _process_version(self, value: str) -> version_module.Version: + if not value: + raise self._invalid_metadata("{field} is a required field") + try: + return version_module.parse(value) + except version_module.InvalidVersion as exc: + raise self._invalid_metadata( + f"{value!r} is invalid for {{field}}", cause=exc + ) + + def _process_summary(self, value: str) -> str: + """Check the field contains no newlines.""" + if "\n" in value: + raise self._invalid_metadata("{field} must be a single line") + return value + + def _process_description_content_type(self, value: str) -> str: + content_types = {"text/plain", "text/x-rst", "text/markdown"} + message = email.message.EmailMessage() + message["content-type"] = value + + content_type, parameters = ( + # Defaults to `text/plain` if parsing failed. + message.get_content_type().lower(), + message["content-type"].params, + ) + # Check if content-type is valid or defaulted to `text/plain` and thus was + # not parseable. + if content_type not in content_types or content_type not in value.lower(): + raise self._invalid_metadata( + f"{{field}} must be one of {list(content_types)}, not {value!r}" + ) + + charset = parameters.get("charset", "UTF-8") + if charset != "UTF-8": + raise self._invalid_metadata( + f"{{field}} can only specify the UTF-8 charset, not {list(charset)}" + ) + + markdown_variants = {"GFM", "CommonMark"} + variant = parameters.get("variant", "GFM") # Use an acceptable default. + if content_type == "text/markdown" and variant not in markdown_variants: + raise self._invalid_metadata( + f"valid Markdown variants for {{field}} are {list(markdown_variants)}, " + f"not {variant!r}", + ) + return value + + def _process_dynamic(self, value: List[str]) -> List[str]: + for dynamic_field in map(str.lower, value): + if dynamic_field in {"name", "version", "metadata-version"}: + raise self._invalid_metadata( + f"{value!r} is not allowed as a dynamic field" + ) + elif dynamic_field not in _EMAIL_TO_RAW_MAPPING: + raise self._invalid_metadata(f"{value!r} is not a valid dynamic field") + return list(map(str.lower, value)) + + def _process_provides_extra( + self, + value: List[str], + ) -> List[utils.NormalizedName]: + normalized_names = [] + try: + for name in value: + normalized_names.append(utils.canonicalize_name(name, validate=True)) + except utils.InvalidName as exc: + raise self._invalid_metadata( + f"{name!r} is invalid for {{field}}", cause=exc + ) + else: + return normalized_names + + def _process_requires_python(self, value: str) -> specifiers.SpecifierSet: + try: + return specifiers.SpecifierSet(value) + except specifiers.InvalidSpecifier as exc: + raise self._invalid_metadata( + f"{value!r} is invalid for {{field}}", cause=exc + ) + + def _process_requires_dist( + self, + value: List[str], + ) -> List[requirements.Requirement]: + reqs = [] + try: + for req in value: + reqs.append(requirements.Requirement(req)) + except requirements.InvalidRequirement as exc: + raise self._invalid_metadata(f"{req!r} is invalid for {{field}}", cause=exc) + else: + return reqs + + +class Metadata: + """Representation of distribution metadata. + + Compared to :class:`RawMetadata`, this class provides objects representing + metadata fields instead of only using built-in types. Any invalid metadata + will cause :exc:`InvalidMetadata` to be raised (with a + :py:attr:`~BaseException.__cause__` attribute as appropriate). + """ + + _raw: RawMetadata + + @classmethod + def from_raw(cls, data: RawMetadata, *, validate: bool = True) -> "Metadata": + """Create an instance from :class:`RawMetadata`. + + If *validate* is true, all metadata will be validated. All exceptions + related to validation will be gathered and raised as an :class:`ExceptionGroup`. + """ + ins = cls() + ins._raw = data.copy() # Mutations occur due to caching enriched values. + + if validate: + exceptions: List[Exception] = [] + try: + metadata_version = ins.metadata_version + metadata_age = _VALID_METADATA_VERSIONS.index(metadata_version) + except InvalidMetadata as metadata_version_exc: + exceptions.append(metadata_version_exc) + metadata_version = None + + # Make sure to check for the fields that are present, the required + # fields (so their absence can be reported). + fields_to_check = frozenset(ins._raw) | _REQUIRED_ATTRS + # Remove fields that have already been checked. + fields_to_check -= {"metadata_version"} + + for key in fields_to_check: + try: + if metadata_version: + # Can't use getattr() as that triggers descriptor protocol which + # will fail due to no value for the instance argument. + try: + field_metadata_version = cls.__dict__[key].added + except KeyError: + exc = InvalidMetadata(key, f"unrecognized field: {key!r}") + exceptions.append(exc) + continue + field_age = _VALID_METADATA_VERSIONS.index( + field_metadata_version + ) + if field_age > metadata_age: + field = _RAW_TO_EMAIL_MAPPING[key] + exc = InvalidMetadata( + field, + "{field} introduced in metadata version " + "{field_metadata_version}, not {metadata_version}", + ) + exceptions.append(exc) + continue + getattr(ins, key) + except InvalidMetadata as exc: + exceptions.append(exc) + + if exceptions: + raise ExceptionGroup("invalid metadata", exceptions) + + return ins + + @classmethod + def from_email( + cls, data: Union[bytes, str], *, validate: bool = True + ) -> "Metadata": + """Parse metadata from email headers. + + If *validate* is true, the metadata will be validated. All exceptions + related to validation will be gathered and raised as an :class:`ExceptionGroup`. + """ + raw, unparsed = parse_email(data) + + if validate: + exceptions: list[Exception] = [] + for unparsed_key in unparsed: + if unparsed_key in _EMAIL_TO_RAW_MAPPING: + message = f"{unparsed_key!r} has invalid data" + else: + message = f"unrecognized field: {unparsed_key!r}" + exceptions.append(InvalidMetadata(unparsed_key, message)) + + if exceptions: + raise ExceptionGroup("unparsed", exceptions) + + try: + return cls.from_raw(raw, validate=validate) + except ExceptionGroup as exc_group: + raise ExceptionGroup( + "invalid or unparsed metadata", exc_group.exceptions + ) from None + + metadata_version: _Validator[_MetadataVersion] = _Validator() + """:external:ref:`core-metadata-metadata-version` + (required; validated to be a valid metadata version)""" + name: _Validator[str] = _Validator() + """:external:ref:`core-metadata-name` + (required; validated using :func:`~packaging.utils.canonicalize_name` and its + *validate* parameter)""" + version: _Validator[version_module.Version] = _Validator() + """:external:ref:`core-metadata-version` (required)""" + dynamic: _Validator[Optional[List[str]]] = _Validator( + added="2.2", + ) + """:external:ref:`core-metadata-dynamic` + (validated against core metadata field names and lowercased)""" + platforms: _Validator[Optional[List[str]]] = _Validator() + """:external:ref:`core-metadata-platform`""" + supported_platforms: _Validator[Optional[List[str]]] = _Validator(added="1.1") + """:external:ref:`core-metadata-supported-platform`""" + summary: _Validator[Optional[str]] = _Validator() + """:external:ref:`core-metadata-summary` (validated to contain no newlines)""" + description: _Validator[Optional[str]] = _Validator() # TODO 2.1: can be in body + """:external:ref:`core-metadata-description`""" + description_content_type: _Validator[Optional[str]] = _Validator(added="2.1") + """:external:ref:`core-metadata-description-content-type` (validated)""" + keywords: _Validator[Optional[List[str]]] = _Validator() + """:external:ref:`core-metadata-keywords`""" + home_page: _Validator[Optional[str]] = _Validator() + """:external:ref:`core-metadata-home-page`""" + download_url: _Validator[Optional[str]] = _Validator(added="1.1") + """:external:ref:`core-metadata-download-url`""" + author: _Validator[Optional[str]] = _Validator() + """:external:ref:`core-metadata-author`""" + author_email: _Validator[Optional[str]] = _Validator() + """:external:ref:`core-metadata-author-email`""" + maintainer: _Validator[Optional[str]] = _Validator(added="1.2") + """:external:ref:`core-metadata-maintainer`""" + maintainer_email: _Validator[Optional[str]] = _Validator(added="1.2") + """:external:ref:`core-metadata-maintainer-email`""" + license: _Validator[Optional[str]] = _Validator() + """:external:ref:`core-metadata-license`""" + classifiers: _Validator[Optional[List[str]]] = _Validator(added="1.1") + """:external:ref:`core-metadata-classifier`""" + requires_dist: _Validator[Optional[List[requirements.Requirement]]] = _Validator( + added="1.2" + ) + """:external:ref:`core-metadata-requires-dist`""" + requires_python: _Validator[Optional[specifiers.SpecifierSet]] = _Validator( + added="1.2" + ) + """:external:ref:`core-metadata-requires-python`""" + # Because `Requires-External` allows for non-PEP 440 version specifiers, we + # don't do any processing on the values. + requires_external: _Validator[Optional[List[str]]] = _Validator(added="1.2") + """:external:ref:`core-metadata-requires-external`""" + project_urls: _Validator[Optional[Dict[str, str]]] = _Validator(added="1.2") + """:external:ref:`core-metadata-project-url`""" + # PEP 685 lets us raise an error if an extra doesn't pass `Name` validation + # regardless of metadata version. + provides_extra: _Validator[Optional[List[utils.NormalizedName]]] = _Validator( + added="2.1", + ) + """:external:ref:`core-metadata-provides-extra`""" + provides_dist: _Validator[Optional[List[str]]] = _Validator(added="1.2") + """:external:ref:`core-metadata-provides-dist`""" + obsoletes_dist: _Validator[Optional[List[str]]] = _Validator(added="1.2") + """:external:ref:`core-metadata-obsoletes-dist`""" + requires: _Validator[Optional[List[str]]] = _Validator(added="1.1") + """``Requires`` (deprecated)""" + provides: _Validator[Optional[List[str]]] = _Validator(added="1.1") + """``Provides`` (deprecated)""" + obsoletes: _Validator[Optional[List[str]]] = _Validator(added="1.1") + """``Obsoletes`` (deprecated)""" diff --git a/tools/gyp/pylib/packaging/py.typed b/tools/gyp/pylib/packaging/py.typed new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/tools/gyp/pylib/packaging/requirements.py b/tools/gyp/pylib/packaging/requirements.py new file mode 100644 index 00000000000000..0c00eba331b736 --- /dev/null +++ b/tools/gyp/pylib/packaging/requirements.py @@ -0,0 +1,90 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +from typing import Any, Iterator, Optional, Set + +from ._parser import parse_requirement as _parse_requirement +from ._tokenizer import ParserSyntaxError +from .markers import Marker, _normalize_extra_values +from .specifiers import SpecifierSet +from .utils import canonicalize_name + + +class InvalidRequirement(ValueError): + """ + An invalid requirement was found, users should refer to PEP 508. + """ + + +class Requirement: + """Parse a requirement. + + Parse a given requirement string into its parts, such as name, specifier, + URL, and extras. Raises InvalidRequirement on a badly-formed requirement + string. + """ + + # TODO: Can we test whether something is contained within a requirement? + # If so how do we do that? Do we need to test against the _name_ of + # the thing as well as the version? What about the markers? + # TODO: Can we normalize the name and extra name? + + def __init__(self, requirement_string: str) -> None: + try: + parsed = _parse_requirement(requirement_string) + except ParserSyntaxError as e: + raise InvalidRequirement(str(e)) from e + + self.name: str = parsed.name + self.url: Optional[str] = parsed.url or None + self.extras: Set[str] = set(parsed.extras if parsed.extras else []) + self.specifier: SpecifierSet = SpecifierSet(parsed.specifier) + self.marker: Optional[Marker] = None + if parsed.marker is not None: + self.marker = Marker.__new__(Marker) + self.marker._markers = _normalize_extra_values(parsed.marker) + + def _iter_parts(self, name: str) -> Iterator[str]: + yield name + + if self.extras: + formatted_extras = ",".join(sorted(self.extras)) + yield f"[{formatted_extras}]" + + if self.specifier: + yield str(self.specifier) + + if self.url: + yield f"@ {self.url}" + if self.marker: + yield " " + + if self.marker: + yield f"; {self.marker}" + + def __str__(self) -> str: + return "".join(self._iter_parts(self.name)) + + def __repr__(self) -> str: + return f"" + + def __hash__(self) -> int: + return hash( + ( + self.__class__.__name__, + *self._iter_parts(canonicalize_name(self.name)), + ) + ) + + def __eq__(self, other: Any) -> bool: + if not isinstance(other, Requirement): + return NotImplemented + + return ( + canonicalize_name(self.name) == canonicalize_name(other.name) + and self.extras == other.extras + and self.specifier == other.specifier + and self.url == other.url + and self.marker == other.marker + ) diff --git a/tools/gyp/pylib/packaging/specifiers.py b/tools/gyp/pylib/packaging/specifiers.py new file mode 100644 index 00000000000000..94448327ae2d44 --- /dev/null +++ b/tools/gyp/pylib/packaging/specifiers.py @@ -0,0 +1,1030 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +""" +.. testsetup:: + + from packaging.specifiers import Specifier, SpecifierSet, InvalidSpecifier + from packaging.version import Version +""" + +import abc +import itertools +import re +from typing import ( + Callable, + Iterable, + Iterator, + List, + Optional, + Set, + Tuple, + TypeVar, + Union, +) + +from .utils import canonicalize_version +from .version import Version + +UnparsedVersion = Union[Version, str] +UnparsedVersionVar = TypeVar("UnparsedVersionVar", bound=UnparsedVersion) +CallableOperator = Callable[[Version, str], bool] + + +def _coerce_version(version: UnparsedVersion) -> Version: + if not isinstance(version, Version): + version = Version(version) + return version + + +class InvalidSpecifier(ValueError): + """ + Raised when attempting to create a :class:`Specifier` with a specifier + string that is invalid. + + >>> Specifier("lolwat") + Traceback (most recent call last): + ... + packaging.specifiers.InvalidSpecifier: Invalid specifier: 'lolwat' + """ + + +class BaseSpecifier(metaclass=abc.ABCMeta): + @abc.abstractmethod + def __str__(self) -> str: + """ + Returns the str representation of this Specifier-like object. This + should be representative of the Specifier itself. + """ + + @abc.abstractmethod + def __hash__(self) -> int: + """ + Returns a hash value for this Specifier-like object. + """ + + @abc.abstractmethod + def __eq__(self, other: object) -> bool: + """ + Returns a boolean representing whether or not the two Specifier-like + objects are equal. + + :param other: The other object to check against. + """ + + @property + @abc.abstractmethod + def prereleases(self) -> Optional[bool]: + """Whether or not pre-releases as a whole are allowed. + + This can be set to either ``True`` or ``False`` to explicitly enable or disable + prereleases or it can be set to ``None`` (the default) to use default semantics. + """ + + @prereleases.setter + def prereleases(self, value: bool) -> None: + """Setter for :attr:`prereleases`. + + :param value: The value to set. + """ + + @abc.abstractmethod + def contains(self, item: str, prereleases: Optional[bool] = None) -> bool: + """ + Determines if the given item is contained within this specifier. + """ + + @abc.abstractmethod + def filter( + self, iterable: Iterable[UnparsedVersionVar], prereleases: Optional[bool] = None + ) -> Iterator[UnparsedVersionVar]: + """ + Takes an iterable of items and filters them so that only items which + are contained within this specifier are allowed in it. + """ + + +class Specifier(BaseSpecifier): + """This class abstracts handling of version specifiers. + + .. tip:: + + It is generally not required to instantiate this manually. You should instead + prefer to work with :class:`SpecifierSet` instead, which can parse + comma-separated version specifiers (which is what package metadata contains). + """ + + _operator_regex_str = r""" + (?P(~=|==|!=|<=|>=|<|>|===)) + """ + _version_regex_str = r""" + (?P + (?: + # The identity operators allow for an escape hatch that will + # do an exact string match of the version you wish to install. + # This will not be parsed by PEP 440 and we cannot determine + # any semantic meaning from it. This operator is discouraged + # but included entirely as an escape hatch. + (?<====) # Only match for the identity operator + \s* + [^\s;)]* # The arbitrary version can be just about anything, + # we match everything except for whitespace, a + # semi-colon for marker support, and a closing paren + # since versions can be enclosed in them. + ) + | + (?: + # The (non)equality operators allow for wild card and local + # versions to be specified so we have to define these two + # operators separately to enable that. + (?<===|!=) # Only match for equals and not equals + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + + # You cannot use a wild card and a pre-release, post-release, a dev or + # local version together so group them with a | and make them optional. + (?: + \.\* # Wild card syntax of .* + | + (?: # pre release + [-_\.]? + (alpha|beta|preview|pre|a|b|c|rc) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local + )? + ) + | + (?: + # The compatible operator requires at least two digits in the + # release segment. + (?<=~=) # Only match for the compatible operator + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) + (?: # pre release + [-_\.]? + (alpha|beta|preview|pre|a|b|c|rc) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + | + (?: + # All other operators only allow a sub set of what the + # (non)equality operators do. Specifically they do not allow + # local versions to be specified nor do they allow the prefix + # matching wild cards. + (?=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + "===": "arbitrary", + } + + def __init__(self, spec: str = "", prereleases: Optional[bool] = None) -> None: + """Initialize a Specifier instance. + + :param spec: + The string representation of a specifier which will be parsed and + normalized before use. + :param prereleases: + This tells the specifier if it should accept prerelease versions if + applicable or not. The default of ``None`` will autodetect it from the + given specifiers. + :raises InvalidSpecifier: + If the given specifier is invalid (i.e. bad syntax). + """ + match = self._regex.search(spec) + if not match: + raise InvalidSpecifier(f"Invalid specifier: '{spec}'") + + self._spec: Tuple[str, str] = ( + match.group("operator").strip(), + match.group("version").strip(), + ) + + # Store whether or not this Specifier should accept prereleases + self._prereleases = prereleases + + # https://github.com/python/mypy/pull/13475#pullrequestreview-1079784515 + @property # type: ignore[override] + def prereleases(self) -> bool: + # If there is an explicit prereleases set for this, then we'll just + # blindly use that. + if self._prereleases is not None: + return self._prereleases + + # Look at all of our specifiers and determine if they are inclusive + # operators, and if they are if they are including an explicit + # prerelease. + operator, version = self._spec + if operator in ["==", ">=", "<=", "~=", "==="]: + # The == specifier can include a trailing .*, if it does we + # want to remove before parsing. + if operator == "==" and version.endswith(".*"): + version = version[:-2] + + # Parse the version, and if it is a pre-release than this + # specifier allows pre-releases. + if Version(version).is_prerelease: + return True + + return False + + @prereleases.setter + def prereleases(self, value: bool) -> None: + self._prereleases = value + + @property + def operator(self) -> str: + """The operator of this specifier. + + >>> Specifier("==1.2.3").operator + '==' + """ + return self._spec[0] + + @property + def version(self) -> str: + """The version of this specifier. + + >>> Specifier("==1.2.3").version + '1.2.3' + """ + return self._spec[1] + + def __repr__(self) -> str: + """A representation of the Specifier that shows all internal state. + + >>> Specifier('>=1.0.0') + =1.0.0')> + >>> Specifier('>=1.0.0', prereleases=False) + =1.0.0', prereleases=False)> + >>> Specifier('>=1.0.0', prereleases=True) + =1.0.0', prereleases=True)> + """ + pre = ( + f", prereleases={self.prereleases!r}" + if self._prereleases is not None + else "" + ) + + return f"<{self.__class__.__name__}({str(self)!r}{pre})>" + + def __str__(self) -> str: + """A string representation of the Specifier that can be round-tripped. + + >>> str(Specifier('>=1.0.0')) + '>=1.0.0' + >>> str(Specifier('>=1.0.0', prereleases=False)) + '>=1.0.0' + """ + return "{}{}".format(*self._spec) + + @property + def _canonical_spec(self) -> Tuple[str, str]: + canonical_version = canonicalize_version( + self._spec[1], + strip_trailing_zero=(self._spec[0] != "~="), + ) + return self._spec[0], canonical_version + + def __hash__(self) -> int: + return hash(self._canonical_spec) + + def __eq__(self, other: object) -> bool: + """Whether or not the two Specifier-like objects are equal. + + :param other: The other object to check against. + + The value of :attr:`prereleases` is ignored. + + >>> Specifier("==1.2.3") == Specifier("== 1.2.3.0") + True + >>> (Specifier("==1.2.3", prereleases=False) == + ... Specifier("==1.2.3", prereleases=True)) + True + >>> Specifier("==1.2.3") == "==1.2.3" + True + >>> Specifier("==1.2.3") == Specifier("==1.2.4") + False + >>> Specifier("==1.2.3") == Specifier("~=1.2.3") + False + """ + if isinstance(other, str): + try: + other = self.__class__(str(other)) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._canonical_spec == other._canonical_spec + + def _get_operator(self, op: str) -> CallableOperator: + operator_callable: CallableOperator = getattr( + self, f"_compare_{self._operators[op]}" + ) + return operator_callable + + def _compare_compatible(self, prospective: Version, spec: str) -> bool: + + # Compatible releases have an equivalent combination of >= and ==. That + # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to + # implement this in terms of the other specifiers instead of + # implementing it ourselves. The only thing we need to do is construct + # the other specifiers. + + # We want everything but the last item in the version, but we want to + # ignore suffix segments. + prefix = _version_join( + list(itertools.takewhile(_is_not_suffix, _version_split(spec)))[:-1] + ) + + # Add the prefix notation to the end of our string + prefix += ".*" + + return self._get_operator(">=")(prospective, spec) and self._get_operator("==")( + prospective, prefix + ) + + def _compare_equal(self, prospective: Version, spec: str) -> bool: + + # We need special logic to handle prefix matching + if spec.endswith(".*"): + # In the case of prefix matching we want to ignore local segment. + normalized_prospective = canonicalize_version( + prospective.public, strip_trailing_zero=False + ) + # Get the normalized version string ignoring the trailing .* + normalized_spec = canonicalize_version(spec[:-2], strip_trailing_zero=False) + # Split the spec out by bangs and dots, and pretend that there is + # an implicit dot in between a release segment and a pre-release segment. + split_spec = _version_split(normalized_spec) + + # Split the prospective version out by bangs and dots, and pretend + # that there is an implicit dot in between a release segment and + # a pre-release segment. + split_prospective = _version_split(normalized_prospective) + + # 0-pad the prospective version before shortening it to get the correct + # shortened version. + padded_prospective, _ = _pad_version(split_prospective, split_spec) + + # Shorten the prospective version to be the same length as the spec + # so that we can determine if the specifier is a prefix of the + # prospective version or not. + shortened_prospective = padded_prospective[: len(split_spec)] + + return shortened_prospective == split_spec + else: + # Convert our spec string into a Version + spec_version = Version(spec) + + # If the specifier does not have a local segment, then we want to + # act as if the prospective version also does not have a local + # segment. + if not spec_version.local: + prospective = Version(prospective.public) + + return prospective == spec_version + + def _compare_not_equal(self, prospective: Version, spec: str) -> bool: + return not self._compare_equal(prospective, spec) + + def _compare_less_than_equal(self, prospective: Version, spec: str) -> bool: + + # NB: Local version identifiers are NOT permitted in the version + # specifier, so local version labels can be universally removed from + # the prospective version. + return Version(prospective.public) <= Version(spec) + + def _compare_greater_than_equal(self, prospective: Version, spec: str) -> bool: + + # NB: Local version identifiers are NOT permitted in the version + # specifier, so local version labels can be universally removed from + # the prospective version. + return Version(prospective.public) >= Version(spec) + + def _compare_less_than(self, prospective: Version, spec_str: str) -> bool: + + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec_str) + + # Check to see if the prospective version is less than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective < spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a pre-release version, that we do not accept pre-release + # versions for the version mentioned in the specifier (e.g. <3.1 should + # not match 3.1.dev0, but should match 3.0.dev0). + if not spec.is_prerelease and prospective.is_prerelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # less than the spec version *and* it's not a pre-release of the same + # version in the spec. + return True + + def _compare_greater_than(self, prospective: Version, spec_str: str) -> bool: + + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec_str) + + # Check to see if the prospective version is greater than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective > spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a post-release version, that we do not accept + # post-release versions for the version mentioned in the specifier + # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). + if not spec.is_postrelease and prospective.is_postrelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # Ensure that we do not allow a local version of the version mentioned + # in the specifier, which is technically greater than, to match. + if prospective.local is not None: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # greater than the spec version *and* it's not a pre-release of the + # same version in the spec. + return True + + def _compare_arbitrary(self, prospective: Version, spec: str) -> bool: + return str(prospective).lower() == str(spec).lower() + + def __contains__(self, item: Union[str, Version]) -> bool: + """Return whether or not the item is contained in this specifier. + + :param item: The item to check for. + + This is used for the ``in`` operator and behaves the same as + :meth:`contains` with no ``prereleases`` argument passed. + + >>> "1.2.3" in Specifier(">=1.2.3") + True + >>> Version("1.2.3") in Specifier(">=1.2.3") + True + >>> "1.0.0" in Specifier(">=1.2.3") + False + >>> "1.3.0a1" in Specifier(">=1.2.3") + False + >>> "1.3.0a1" in Specifier(">=1.2.3", prereleases=True) + True + """ + return self.contains(item) + + def contains( + self, item: UnparsedVersion, prereleases: Optional[bool] = None + ) -> bool: + """Return whether or not the item is contained in this specifier. + + :param item: + The item to check for, which can be a version string or a + :class:`Version` instance. + :param prereleases: + Whether or not to match prereleases with this Specifier. If set to + ``None`` (the default), it uses :attr:`prereleases` to determine + whether or not prereleases are allowed. + + >>> Specifier(">=1.2.3").contains("1.2.3") + True + >>> Specifier(">=1.2.3").contains(Version("1.2.3")) + True + >>> Specifier(">=1.2.3").contains("1.0.0") + False + >>> Specifier(">=1.2.3").contains("1.3.0a1") + False + >>> Specifier(">=1.2.3", prereleases=True).contains("1.3.0a1") + True + >>> Specifier(">=1.2.3").contains("1.3.0a1", prereleases=True) + True + """ + + # Determine if prereleases are to be allowed or not. + if prereleases is None: + prereleases = self.prereleases + + # Normalize item to a Version, this allows us to have a shortcut for + # "2.0" in Specifier(">=2") + normalized_item = _coerce_version(item) + + # Determine if we should be supporting prereleases in this specifier + # or not, if we do not support prereleases than we can short circuit + # logic if this version is a prereleases. + if normalized_item.is_prerelease and not prereleases: + return False + + # Actually do the comparison to determine if this item is contained + # within this Specifier or not. + operator_callable: CallableOperator = self._get_operator(self.operator) + return operator_callable(normalized_item, self.version) + + def filter( + self, iterable: Iterable[UnparsedVersionVar], prereleases: Optional[bool] = None + ) -> Iterator[UnparsedVersionVar]: + """Filter items in the given iterable, that match the specifier. + + :param iterable: + An iterable that can contain version strings and :class:`Version` instances. + The items in the iterable will be filtered according to the specifier. + :param prereleases: + Whether or not to allow prereleases in the returned iterator. If set to + ``None`` (the default), it will be intelligently decide whether to allow + prereleases or not (based on the :attr:`prereleases` attribute, and + whether the only versions matching are prereleases). + + This method is smarter than just ``filter(Specifier().contains, [...])`` + because it implements the rule from :pep:`440` that a prerelease item + SHOULD be accepted if no other versions match the given specifier. + + >>> list(Specifier(">=1.2.3").filter(["1.2", "1.3", "1.5a1"])) + ['1.3'] + >>> list(Specifier(">=1.2.3").filter(["1.2", "1.2.3", "1.3", Version("1.4")])) + ['1.2.3', '1.3', ] + >>> list(Specifier(">=1.2.3").filter(["1.2", "1.5a1"])) + ['1.5a1'] + >>> list(Specifier(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True)) + ['1.3', '1.5a1'] + >>> list(Specifier(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"])) + ['1.3', '1.5a1'] + """ + + yielded = False + found_prereleases = [] + + kw = {"prereleases": prereleases if prereleases is not None else True} + + # Attempt to iterate over all the values in the iterable and if any of + # them match, yield them. + for version in iterable: + parsed_version = _coerce_version(version) + + if self.contains(parsed_version, **kw): + # If our version is a prerelease, and we were not set to allow + # prereleases, then we'll store it for later in case nothing + # else matches this specifier. + if parsed_version.is_prerelease and not ( + prereleases or self.prereleases + ): + found_prereleases.append(version) + # Either this is not a prerelease, or we should have been + # accepting prereleases from the beginning. + else: + yielded = True + yield version + + # Now that we've iterated over everything, determine if we've yielded + # any values, and if we have not and we have any prereleases stored up + # then we will go ahead and yield the prereleases. + if not yielded and found_prereleases: + for version in found_prereleases: + yield version + + +_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") + + +def _version_split(version: str) -> List[str]: + """Split version into components. + + The split components are intended for version comparison. The logic does + not attempt to retain the original version string, so joining the + components back with :func:`_version_join` may not produce the original + version string. + """ + result: List[str] = [] + + epoch, _, rest = version.rpartition("!") + result.append(epoch or "0") + + for item in rest.split("."): + match = _prefix_regex.search(item) + if match: + result.extend(match.groups()) + else: + result.append(item) + return result + + +def _version_join(components: List[str]) -> str: + """Join split version components into a version string. + + This function assumes the input came from :func:`_version_split`, where the + first component must be the epoch (either empty or numeric), and all other + components numeric. + """ + epoch, *rest = components + return f"{epoch}!{'.'.join(rest)}" + + +def _is_not_suffix(segment: str) -> bool: + return not any( + segment.startswith(prefix) for prefix in ("dev", "a", "b", "rc", "post") + ) + + +def _pad_version(left: List[str], right: List[str]) -> Tuple[List[str], List[str]]: + left_split, right_split = [], [] + + # Get the release segment of our versions + left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) + right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) + + # Get the rest of our versions + left_split.append(left[len(left_split[0]) :]) + right_split.append(right[len(right_split[0]) :]) + + # Insert our padding + left_split.insert(1, ["0"] * max(0, len(right_split[0]) - len(left_split[0]))) + right_split.insert(1, ["0"] * max(0, len(left_split[0]) - len(right_split[0]))) + + return (list(itertools.chain(*left_split)), list(itertools.chain(*right_split))) + + +class SpecifierSet(BaseSpecifier): + """This class abstracts handling of a set of version specifiers. + + It can be passed a single specifier (``>=3.0``), a comma-separated list of + specifiers (``>=3.0,!=3.1``), or no specifier at all. + """ + + def __init__( + self, specifiers: str = "", prereleases: Optional[bool] = None + ) -> None: + """Initialize a SpecifierSet instance. + + :param specifiers: + The string representation of a specifier or a comma-separated list of + specifiers which will be parsed and normalized before use. + :param prereleases: + This tells the SpecifierSet if it should accept prerelease versions if + applicable or not. The default of ``None`` will autodetect it from the + given specifiers. + + :raises InvalidSpecifier: + If the given ``specifiers`` are not parseable than this exception will be + raised. + """ + + # Split on `,` to break each individual specifier into it's own item, and + # strip each item to remove leading/trailing whitespace. + split_specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] + + # Parsed each individual specifier, attempting first to make it a + # Specifier. + parsed: Set[Specifier] = set() + for specifier in split_specifiers: + parsed.add(Specifier(specifier)) + + # Turn our parsed specifiers into a frozen set and save them for later. + self._specs = frozenset(parsed) + + # Store our prereleases value so we can use it later to determine if + # we accept prereleases or not. + self._prereleases = prereleases + + @property + def prereleases(self) -> Optional[bool]: + # If we have been given an explicit prerelease modifier, then we'll + # pass that through here. + if self._prereleases is not None: + return self._prereleases + + # If we don't have any specifiers, and we don't have a forced value, + # then we'll just return None since we don't know if this should have + # pre-releases or not. + if not self._specs: + return None + + # Otherwise we'll see if any of the given specifiers accept + # prereleases, if any of them do we'll return True, otherwise False. + return any(s.prereleases for s in self._specs) + + @prereleases.setter + def prereleases(self, value: bool) -> None: + self._prereleases = value + + def __repr__(self) -> str: + """A representation of the specifier set that shows all internal state. + + Note that the ordering of the individual specifiers within the set may not + match the input string. + + >>> SpecifierSet('>=1.0.0,!=2.0.0') + =1.0.0')> + >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=False) + =1.0.0', prereleases=False)> + >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=True) + =1.0.0', prereleases=True)> + """ + pre = ( + f", prereleases={self.prereleases!r}" + if self._prereleases is not None + else "" + ) + + return f"" + + def __str__(self) -> str: + """A string representation of the specifier set that can be round-tripped. + + Note that the ordering of the individual specifiers within the set may not + match the input string. + + >>> str(SpecifierSet(">=1.0.0,!=1.0.1")) + '!=1.0.1,>=1.0.0' + >>> str(SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False)) + '!=1.0.1,>=1.0.0' + """ + return ",".join(sorted(str(s) for s in self._specs)) + + def __hash__(self) -> int: + return hash(self._specs) + + def __and__(self, other: Union["SpecifierSet", str]) -> "SpecifierSet": + """Return a SpecifierSet which is a combination of the two sets. + + :param other: The other object to combine with. + + >>> SpecifierSet(">=1.0.0,!=1.0.1") & '<=2.0.0,!=2.0.1' + =1.0.0')> + >>> SpecifierSet(">=1.0.0,!=1.0.1") & SpecifierSet('<=2.0.0,!=2.0.1') + =1.0.0')> + """ + if isinstance(other, str): + other = SpecifierSet(other) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + specifier = SpecifierSet() + specifier._specs = frozenset(self._specs | other._specs) + + if self._prereleases is None and other._prereleases is not None: + specifier._prereleases = other._prereleases + elif self._prereleases is not None and other._prereleases is None: + specifier._prereleases = self._prereleases + elif self._prereleases == other._prereleases: + specifier._prereleases = self._prereleases + else: + raise ValueError( + "Cannot combine SpecifierSets with True and False prerelease " + "overrides." + ) + + return specifier + + def __eq__(self, other: object) -> bool: + """Whether or not the two SpecifierSet-like objects are equal. + + :param other: The other object to check against. + + The value of :attr:`prereleases` is ignored. + + >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.1") + True + >>> (SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False) == + ... SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True)) + True + >>> SpecifierSet(">=1.0.0,!=1.0.1") == ">=1.0.0,!=1.0.1" + True + >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0") + False + >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.2") + False + """ + if isinstance(other, (str, Specifier)): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs == other._specs + + def __len__(self) -> int: + """Returns the number of specifiers in this specifier set.""" + return len(self._specs) + + def __iter__(self) -> Iterator[Specifier]: + """ + Returns an iterator over all the underlying :class:`Specifier` instances + in this specifier set. + + >>> sorted(SpecifierSet(">=1.0.0,!=1.0.1"), key=str) + [, =1.0.0')>] + """ + return iter(self._specs) + + def __contains__(self, item: UnparsedVersion) -> bool: + """Return whether or not the item is contained in this specifier. + + :param item: The item to check for. + + This is used for the ``in`` operator and behaves the same as + :meth:`contains` with no ``prereleases`` argument passed. + + >>> "1.2.3" in SpecifierSet(">=1.0.0,!=1.0.1") + True + >>> Version("1.2.3") in SpecifierSet(">=1.0.0,!=1.0.1") + True + >>> "1.0.1" in SpecifierSet(">=1.0.0,!=1.0.1") + False + >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1") + False + >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True) + True + """ + return self.contains(item) + + def contains( + self, + item: UnparsedVersion, + prereleases: Optional[bool] = None, + installed: Optional[bool] = None, + ) -> bool: + """Return whether or not the item is contained in this SpecifierSet. + + :param item: + The item to check for, which can be a version string or a + :class:`Version` instance. + :param prereleases: + Whether or not to match prereleases with this SpecifierSet. If set to + ``None`` (the default), it uses :attr:`prereleases` to determine + whether or not prereleases are allowed. + + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.2.3") + True + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains(Version("1.2.3")) + True + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.0.1") + False + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1") + False + >>> SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True).contains("1.3.0a1") + True + >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1", prereleases=True) + True + """ + # Ensure that our item is a Version instance. + if not isinstance(item, Version): + item = Version(item) + + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # We can determine if we're going to allow pre-releases by looking to + # see if any of the underlying items supports them. If none of them do + # and this item is a pre-release then we do not allow it and we can + # short circuit that here. + # Note: This means that 1.0.dev1 would not be contained in something + # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 + if not prereleases and item.is_prerelease: + return False + + if installed and item.is_prerelease: + item = Version(item.base_version) + + # We simply dispatch to the underlying specs here to make sure that the + # given version is contained within all of them. + # Note: This use of all() here means that an empty set of specifiers + # will always return True, this is an explicit design decision. + return all(s.contains(item, prereleases=prereleases) for s in self._specs) + + def filter( + self, iterable: Iterable[UnparsedVersionVar], prereleases: Optional[bool] = None + ) -> Iterator[UnparsedVersionVar]: + """Filter items in the given iterable, that match the specifiers in this set. + + :param iterable: + An iterable that can contain version strings and :class:`Version` instances. + The items in the iterable will be filtered according to the specifier. + :param prereleases: + Whether or not to allow prereleases in the returned iterator. If set to + ``None`` (the default), it will be intelligently decide whether to allow + prereleases or not (based on the :attr:`prereleases` attribute, and + whether the only versions matching are prereleases). + + This method is smarter than just ``filter(SpecifierSet(...).contains, [...])`` + because it implements the rule from :pep:`440` that a prerelease item + SHOULD be accepted if no other versions match the given specifier. + + >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", "1.5a1"])) + ['1.3'] + >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", Version("1.4")])) + ['1.3', ] + >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.5a1"])) + [] + >>> list(SpecifierSet(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True)) + ['1.3', '1.5a1'] + >>> list(SpecifierSet(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"])) + ['1.3', '1.5a1'] + + An "empty" SpecifierSet will filter items based on the presence of prerelease + versions in the set. + + >>> list(SpecifierSet("").filter(["1.3", "1.5a1"])) + ['1.3'] + >>> list(SpecifierSet("").filter(["1.5a1"])) + ['1.5a1'] + >>> list(SpecifierSet("", prereleases=True).filter(["1.3", "1.5a1"])) + ['1.3', '1.5a1'] + >>> list(SpecifierSet("").filter(["1.3", "1.5a1"], prereleases=True)) + ['1.3', '1.5a1'] + """ + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # If we have any specifiers, then we want to wrap our iterable in the + # filter method for each one, this will act as a logical AND amongst + # each specifier. + if self._specs: + for spec in self._specs: + iterable = spec.filter(iterable, prereleases=bool(prereleases)) + return iter(iterable) + # If we do not have any specifiers, then we need to have a rough filter + # which will filter out any pre-releases, unless there are no final + # releases. + else: + filtered: List[UnparsedVersionVar] = [] + found_prereleases: List[UnparsedVersionVar] = [] + + for item in iterable: + parsed_version = _coerce_version(item) + + # Store any item which is a pre-release for later unless we've + # already found a final version or we are accepting prereleases + if parsed_version.is_prerelease and not prereleases: + if not filtered: + found_prereleases.append(item) + else: + filtered.append(item) + + # If we've found no items except for pre-releases, then we'll go + # ahead and use the pre-releases + if not filtered and found_prereleases and prereleases is None: + return iter(found_prereleases) + + return iter(filtered) diff --git a/tools/gyp/pylib/packaging/tags.py b/tools/gyp/pylib/packaging/tags.py new file mode 100644 index 00000000000000..37f33b1ef849ed --- /dev/null +++ b/tools/gyp/pylib/packaging/tags.py @@ -0,0 +1,553 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +import logging +import platform +import struct +import subprocess +import sys +import sysconfig +from importlib.machinery import EXTENSION_SUFFIXES +from typing import ( + Dict, + FrozenSet, + Iterable, + Iterator, + List, + Optional, + Sequence, + Tuple, + Union, + cast, +) + +from . import _manylinux, _musllinux + +logger = logging.getLogger(__name__) + +PythonVersion = Sequence[int] +MacVersion = Tuple[int, int] + +INTERPRETER_SHORT_NAMES: Dict[str, str] = { + "python": "py", # Generic. + "cpython": "cp", + "pypy": "pp", + "ironpython": "ip", + "jython": "jy", +} + + +_32_BIT_INTERPRETER = struct.calcsize("P") == 4 + + +class Tag: + """ + A representation of the tag triple for a wheel. + + Instances are considered immutable and thus are hashable. Equality checking + is also supported. + """ + + __slots__ = ["_interpreter", "_abi", "_platform", "_hash"] + + def __init__(self, interpreter: str, abi: str, platform: str) -> None: + self._interpreter = interpreter.lower() + self._abi = abi.lower() + self._platform = platform.lower() + # The __hash__ of every single element in a Set[Tag] will be evaluated each time + # that a set calls its `.disjoint()` method, which may be called hundreds of + # times when scanning a page of links for packages with tags matching that + # Set[Tag]. Pre-computing the value here produces significant speedups for + # downstream consumers. + self._hash = hash((self._interpreter, self._abi, self._platform)) + + @property + def interpreter(self) -> str: + return self._interpreter + + @property + def abi(self) -> str: + return self._abi + + @property + def platform(self) -> str: + return self._platform + + def __eq__(self, other: object) -> bool: + if not isinstance(other, Tag): + return NotImplemented + + return ( + (self._hash == other._hash) # Short-circuit ASAP for perf reasons. + and (self._platform == other._platform) + and (self._abi == other._abi) + and (self._interpreter == other._interpreter) + ) + + def __hash__(self) -> int: + return self._hash + + def __str__(self) -> str: + return f"{self._interpreter}-{self._abi}-{self._platform}" + + def __repr__(self) -> str: + return f"<{self} @ {id(self)}>" + + +def parse_tag(tag: str) -> FrozenSet[Tag]: + """ + Parses the provided tag (e.g. `py3-none-any`) into a frozenset of Tag instances. + + Returning a set is required due to the possibility that the tag is a + compressed tag set. + """ + tags = set() + interpreters, abis, platforms = tag.split("-") + for interpreter in interpreters.split("."): + for abi in abis.split("."): + for platform_ in platforms.split("."): + tags.add(Tag(interpreter, abi, platform_)) + return frozenset(tags) + + +def _get_config_var(name: str, warn: bool = False) -> Union[int, str, None]: + value: Union[int, str, None] = sysconfig.get_config_var(name) + if value is None and warn: + logger.debug( + "Config variable '%s' is unset, Python ABI tag may be incorrect", name + ) + return value + + +def _normalize_string(string: str) -> str: + return string.replace(".", "_").replace("-", "_").replace(" ", "_") + + +def _abi3_applies(python_version: PythonVersion) -> bool: + """ + Determine if the Python version supports abi3. + + PEP 384 was first implemented in Python 3.2. + """ + return len(python_version) > 1 and tuple(python_version) >= (3, 2) + + +def _cpython_abis(py_version: PythonVersion, warn: bool = False) -> List[str]: + py_version = tuple(py_version) # To allow for version comparison. + abis = [] + version = _version_nodot(py_version[:2]) + debug = pymalloc = ucs4 = "" + with_debug = _get_config_var("Py_DEBUG", warn) + has_refcount = hasattr(sys, "gettotalrefcount") + # Windows doesn't set Py_DEBUG, so checking for support of debug-compiled + # extension modules is the best option. + # https://github.com/pypa/pip/issues/3383#issuecomment-173267692 + has_ext = "_d.pyd" in EXTENSION_SUFFIXES + if with_debug or (with_debug is None and (has_refcount or has_ext)): + debug = "d" + if py_version < (3, 8): + with_pymalloc = _get_config_var("WITH_PYMALLOC", warn) + if with_pymalloc or with_pymalloc is None: + pymalloc = "m" + if py_version < (3, 3): + unicode_size = _get_config_var("Py_UNICODE_SIZE", warn) + if unicode_size == 4 or ( + unicode_size is None and sys.maxunicode == 0x10FFFF + ): + ucs4 = "u" + elif debug: + # Debug builds can also load "normal" extension modules. + # We can also assume no UCS-4 or pymalloc requirement. + abis.append(f"cp{version}") + abis.insert( + 0, + "cp{version}{debug}{pymalloc}{ucs4}".format( + version=version, debug=debug, pymalloc=pymalloc, ucs4=ucs4 + ), + ) + return abis + + +def cpython_tags( + python_version: Optional[PythonVersion] = None, + abis: Optional[Iterable[str]] = None, + platforms: Optional[Iterable[str]] = None, + *, + warn: bool = False, +) -> Iterator[Tag]: + """ + Yields the tags for a CPython interpreter. + + The tags consist of: + - cp-- + - cp-abi3- + - cp-none- + - cp-abi3- # Older Python versions down to 3.2. + + If python_version only specifies a major version then user-provided ABIs and + the 'none' ABItag will be used. + + If 'abi3' or 'none' are specified in 'abis' then they will be yielded at + their normal position and not at the beginning. + """ + if not python_version: + python_version = sys.version_info[:2] + + interpreter = f"cp{_version_nodot(python_version[:2])}" + + if abis is None: + if len(python_version) > 1: + abis = _cpython_abis(python_version, warn) + else: + abis = [] + abis = list(abis) + # 'abi3' and 'none' are explicitly handled later. + for explicit_abi in ("abi3", "none"): + try: + abis.remove(explicit_abi) + except ValueError: + pass + + platforms = list(platforms or platform_tags()) + for abi in abis: + for platform_ in platforms: + yield Tag(interpreter, abi, platform_) + if _abi3_applies(python_version): + yield from (Tag(interpreter, "abi3", platform_) for platform_ in platforms) + yield from (Tag(interpreter, "none", platform_) for platform_ in platforms) + + if _abi3_applies(python_version): + for minor_version in range(python_version[1] - 1, 1, -1): + for platform_ in platforms: + interpreter = "cp{version}".format( + version=_version_nodot((python_version[0], minor_version)) + ) + yield Tag(interpreter, "abi3", platform_) + + +def _generic_abi() -> List[str]: + """ + Return the ABI tag based on EXT_SUFFIX. + """ + # The following are examples of `EXT_SUFFIX`. + # We want to keep the parts which are related to the ABI and remove the + # parts which are related to the platform: + # - linux: '.cpython-310-x86_64-linux-gnu.so' => cp310 + # - mac: '.cpython-310-darwin.so' => cp310 + # - win: '.cp310-win_amd64.pyd' => cp310 + # - win: '.pyd' => cp37 (uses _cpython_abis()) + # - pypy: '.pypy38-pp73-x86_64-linux-gnu.so' => pypy38_pp73 + # - graalpy: '.graalpy-38-native-x86_64-darwin.dylib' + # => graalpy_38_native + + ext_suffix = _get_config_var("EXT_SUFFIX", warn=True) + if not isinstance(ext_suffix, str) or ext_suffix[0] != ".": + raise SystemError("invalid sysconfig.get_config_var('EXT_SUFFIX')") + parts = ext_suffix.split(".") + if len(parts) < 3: + # CPython3.7 and earlier uses ".pyd" on Windows. + return _cpython_abis(sys.version_info[:2]) + soabi = parts[1] + if soabi.startswith("cpython"): + # non-windows + abi = "cp" + soabi.split("-")[1] + elif soabi.startswith("cp"): + # windows + abi = soabi.split("-")[0] + elif soabi.startswith("pypy"): + abi = "-".join(soabi.split("-")[:2]) + elif soabi.startswith("graalpy"): + abi = "-".join(soabi.split("-")[:3]) + elif soabi: + # pyston, ironpython, others? + abi = soabi + else: + return [] + return [_normalize_string(abi)] + + +def generic_tags( + interpreter: Optional[str] = None, + abis: Optional[Iterable[str]] = None, + platforms: Optional[Iterable[str]] = None, + *, + warn: bool = False, +) -> Iterator[Tag]: + """ + Yields the tags for a generic interpreter. + + The tags consist of: + - -- + + The "none" ABI will be added if it was not explicitly provided. + """ + if not interpreter: + interp_name = interpreter_name() + interp_version = interpreter_version(warn=warn) + interpreter = "".join([interp_name, interp_version]) + if abis is None: + abis = _generic_abi() + else: + abis = list(abis) + platforms = list(platforms or platform_tags()) + if "none" not in abis: + abis.append("none") + for abi in abis: + for platform_ in platforms: + yield Tag(interpreter, abi, platform_) + + +def _py_interpreter_range(py_version: PythonVersion) -> Iterator[str]: + """ + Yields Python versions in descending order. + + After the latest version, the major-only version will be yielded, and then + all previous versions of that major version. + """ + if len(py_version) > 1: + yield f"py{_version_nodot(py_version[:2])}" + yield f"py{py_version[0]}" + if len(py_version) > 1: + for minor in range(py_version[1] - 1, -1, -1): + yield f"py{_version_nodot((py_version[0], minor))}" + + +def compatible_tags( + python_version: Optional[PythonVersion] = None, + interpreter: Optional[str] = None, + platforms: Optional[Iterable[str]] = None, +) -> Iterator[Tag]: + """ + Yields the sequence of tags that are compatible with a specific version of Python. + + The tags consist of: + - py*-none- + - -none-any # ... if `interpreter` is provided. + - py*-none-any + """ + if not python_version: + python_version = sys.version_info[:2] + platforms = list(platforms or platform_tags()) + for version in _py_interpreter_range(python_version): + for platform_ in platforms: + yield Tag(version, "none", platform_) + if interpreter: + yield Tag(interpreter, "none", "any") + for version in _py_interpreter_range(python_version): + yield Tag(version, "none", "any") + + +def _mac_arch(arch: str, is_32bit: bool = _32_BIT_INTERPRETER) -> str: + if not is_32bit: + return arch + + if arch.startswith("ppc"): + return "ppc" + + return "i386" + + +def _mac_binary_formats(version: MacVersion, cpu_arch: str) -> List[str]: + formats = [cpu_arch] + if cpu_arch == "x86_64": + if version < (10, 4): + return [] + formats.extend(["intel", "fat64", "fat32"]) + + elif cpu_arch == "i386": + if version < (10, 4): + return [] + formats.extend(["intel", "fat32", "fat"]) + + elif cpu_arch == "ppc64": + # TODO: Need to care about 32-bit PPC for ppc64 through 10.2? + if version > (10, 5) or version < (10, 4): + return [] + formats.append("fat64") + + elif cpu_arch == "ppc": + if version > (10, 6): + return [] + formats.extend(["fat32", "fat"]) + + if cpu_arch in {"arm64", "x86_64"}: + formats.append("universal2") + + if cpu_arch in {"x86_64", "i386", "ppc64", "ppc", "intel"}: + formats.append("universal") + + return formats + + +def mac_platforms( + version: Optional[MacVersion] = None, arch: Optional[str] = None +) -> Iterator[str]: + """ + Yields the platform tags for a macOS system. + + The `version` parameter is a two-item tuple specifying the macOS version to + generate platform tags for. The `arch` parameter is the CPU architecture to + generate platform tags for. Both parameters default to the appropriate value + for the current system. + """ + version_str, _, cpu_arch = platform.mac_ver() + if version is None: + version = cast("MacVersion", tuple(map(int, version_str.split(".")[:2]))) + if version == (10, 16): + # When built against an older macOS SDK, Python will report macOS 10.16 + # instead of the real version. + version_str = subprocess.run( + [ + sys.executable, + "-sS", + "-c", + "import platform; print(platform.mac_ver()[0])", + ], + check=True, + env={"SYSTEM_VERSION_COMPAT": "0"}, + stdout=subprocess.PIPE, + text=True, + ).stdout + version = cast("MacVersion", tuple(map(int, version_str.split(".")[:2]))) + else: + version = version + if arch is None: + arch = _mac_arch(cpu_arch) + else: + arch = arch + + if (10, 0) <= version and version < (11, 0): + # Prior to Mac OS 11, each yearly release of Mac OS bumped the + # "minor" version number. The major version was always 10. + for minor_version in range(version[1], -1, -1): + compat_version = 10, minor_version + binary_formats = _mac_binary_formats(compat_version, arch) + for binary_format in binary_formats: + yield "macosx_{major}_{minor}_{binary_format}".format( + major=10, minor=minor_version, binary_format=binary_format + ) + + if version >= (11, 0): + # Starting with Mac OS 11, each yearly release bumps the major version + # number. The minor versions are now the midyear updates. + for major_version in range(version[0], 10, -1): + compat_version = major_version, 0 + binary_formats = _mac_binary_formats(compat_version, arch) + for binary_format in binary_formats: + yield "macosx_{major}_{minor}_{binary_format}".format( + major=major_version, minor=0, binary_format=binary_format + ) + + if version >= (11, 0): + # Mac OS 11 on x86_64 is compatible with binaries from previous releases. + # Arm64 support was introduced in 11.0, so no Arm binaries from previous + # releases exist. + # + # However, the "universal2" binary format can have a + # macOS version earlier than 11.0 when the x86_64 part of the binary supports + # that version of macOS. + if arch == "x86_64": + for minor_version in range(16, 3, -1): + compat_version = 10, minor_version + binary_formats = _mac_binary_formats(compat_version, arch) + for binary_format in binary_formats: + yield "macosx_{major}_{minor}_{binary_format}".format( + major=compat_version[0], + minor=compat_version[1], + binary_format=binary_format, + ) + else: + for minor_version in range(16, 3, -1): + compat_version = 10, minor_version + binary_format = "universal2" + yield "macosx_{major}_{minor}_{binary_format}".format( + major=compat_version[0], + minor=compat_version[1], + binary_format=binary_format, + ) + + +def _linux_platforms(is_32bit: bool = _32_BIT_INTERPRETER) -> Iterator[str]: + linux = _normalize_string(sysconfig.get_platform()) + if not linux.startswith("linux_"): + # we should never be here, just yield the sysconfig one and return + yield linux + return + if is_32bit: + if linux == "linux_x86_64": + linux = "linux_i686" + elif linux == "linux_aarch64": + linux = "linux_armv8l" + _, arch = linux.split("_", 1) + archs = {"armv8l": ["armv8l", "armv7l"]}.get(arch, [arch]) + yield from _manylinux.platform_tags(archs) + yield from _musllinux.platform_tags(archs) + for arch in archs: + yield f"linux_{arch}" + + +def _generic_platforms() -> Iterator[str]: + yield _normalize_string(sysconfig.get_platform()) + + +def platform_tags() -> Iterator[str]: + """ + Provides the platform tags for this installation. + """ + if platform.system() == "Darwin": + return mac_platforms() + elif platform.system() == "Linux": + return _linux_platforms() + else: + return _generic_platforms() + + +def interpreter_name() -> str: + """ + Returns the name of the running interpreter. + + Some implementations have a reserved, two-letter abbreviation which will + be returned when appropriate. + """ + name = sys.implementation.name + return INTERPRETER_SHORT_NAMES.get(name) or name + + +def interpreter_version(*, warn: bool = False) -> str: + """ + Returns the version of the running interpreter. + """ + version = _get_config_var("py_version_nodot", warn=warn) + if version: + version = str(version) + else: + version = _version_nodot(sys.version_info[:2]) + return version + + +def _version_nodot(version: PythonVersion) -> str: + return "".join(map(str, version)) + + +def sys_tags(*, warn: bool = False) -> Iterator[Tag]: + """ + Returns the sequence of tag triples for the running interpreter. + + The order of the sequence corresponds to priority order for the + interpreter, from most to least important. + """ + + interp_name = interpreter_name() + if interp_name == "cp": + yield from cpython_tags(warn=warn) + else: + yield from generic_tags() + + if interp_name == "pp": + interp = "pp3" + elif interp_name == "cp": + interp = "cp" + interpreter_version(warn=warn) + else: + interp = None + yield from compatible_tags(interpreter=interp) diff --git a/tools/gyp/pylib/packaging/utils.py b/tools/gyp/pylib/packaging/utils.py new file mode 100644 index 00000000000000..c2c2f75aa80628 --- /dev/null +++ b/tools/gyp/pylib/packaging/utils.py @@ -0,0 +1,172 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. + +import re +from typing import FrozenSet, NewType, Tuple, Union, cast + +from .tags import Tag, parse_tag +from .version import InvalidVersion, Version + +BuildTag = Union[Tuple[()], Tuple[int, str]] +NormalizedName = NewType("NormalizedName", str) + + +class InvalidName(ValueError): + """ + An invalid distribution name; users should refer to the packaging user guide. + """ + + +class InvalidWheelFilename(ValueError): + """ + An invalid wheel filename was found, users should refer to PEP 427. + """ + + +class InvalidSdistFilename(ValueError): + """ + An invalid sdist filename was found, users should refer to the packaging user guide. + """ + + +# Core metadata spec for `Name` +_validate_regex = re.compile( + r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$", re.IGNORECASE +) +_canonicalize_regex = re.compile(r"[-_.]+") +_normalized_regex = re.compile(r"^([a-z0-9]|[a-z0-9]([a-z0-9-](?!--))*[a-z0-9])$") +# PEP 427: The build number must start with a digit. +_build_tag_regex = re.compile(r"(\d+)(.*)") + + +def canonicalize_name(name: str, *, validate: bool = False) -> NormalizedName: + if validate and not _validate_regex.match(name): + raise InvalidName(f"name is invalid: {name!r}") + # This is taken from PEP 503. + value = _canonicalize_regex.sub("-", name).lower() + return cast(NormalizedName, value) + + +def is_normalized_name(name: str) -> bool: + return _normalized_regex.match(name) is not None + + +def canonicalize_version( + version: Union[Version, str], *, strip_trailing_zero: bool = True +) -> str: + """ + This is very similar to Version.__str__, but has one subtle difference + with the way it handles the release segment. + """ + if isinstance(version, str): + try: + parsed = Version(version) + except InvalidVersion: + # Legacy versions cannot be normalized + return version + else: + parsed = version + + parts = [] + + # Epoch + if parsed.epoch != 0: + parts.append(f"{parsed.epoch}!") + + # Release segment + release_segment = ".".join(str(x) for x in parsed.release) + if strip_trailing_zero: + # NB: This strips trailing '.0's to normalize + release_segment = re.sub(r"(\.0)+$", "", release_segment) + parts.append(release_segment) + + # Pre-release + if parsed.pre is not None: + parts.append("".join(str(x) for x in parsed.pre)) + + # Post-release + if parsed.post is not None: + parts.append(f".post{parsed.post}") + + # Development release + if parsed.dev is not None: + parts.append(f".dev{parsed.dev}") + + # Local version segment + if parsed.local is not None: + parts.append(f"+{parsed.local}") + + return "".join(parts) + + +def parse_wheel_filename( + filename: str, +) -> Tuple[NormalizedName, Version, BuildTag, FrozenSet[Tag]]: + if not filename.endswith(".whl"): + raise InvalidWheelFilename( + f"Invalid wheel filename (extension must be '.whl'): {filename}" + ) + + filename = filename[:-4] + dashes = filename.count("-") + if dashes not in (4, 5): + raise InvalidWheelFilename( + f"Invalid wheel filename (wrong number of parts): {filename}" + ) + + parts = filename.split("-", dashes - 2) + name_part = parts[0] + # See PEP 427 for the rules on escaping the project name. + if "__" in name_part or re.match(r"^[\w\d._]*$", name_part, re.UNICODE) is None: + raise InvalidWheelFilename(f"Invalid project name: {filename}") + name = canonicalize_name(name_part) + + try: + version = Version(parts[1]) + except InvalidVersion as e: + raise InvalidWheelFilename( + f"Invalid wheel filename (invalid version): {filename}" + ) from e + + if dashes == 5: + build_part = parts[2] + build_match = _build_tag_regex.match(build_part) + if build_match is None: + raise InvalidWheelFilename( + f"Invalid build number: {build_part} in '{filename}'" + ) + build = cast(BuildTag, (int(build_match.group(1)), build_match.group(2))) + else: + build = () + tags = parse_tag(parts[-1]) + return (name, version, build, tags) + + +def parse_sdist_filename(filename: str) -> Tuple[NormalizedName, Version]: + if filename.endswith(".tar.gz"): + file_stem = filename[: -len(".tar.gz")] + elif filename.endswith(".zip"): + file_stem = filename[: -len(".zip")] + else: + raise InvalidSdistFilename( + f"Invalid sdist filename (extension must be '.tar.gz' or '.zip'):" + f" {filename}" + ) + + # We are requiring a PEP 440 version, which cannot contain dashes, + # so we split on the last dash. + name_part, sep, version_part = file_stem.rpartition("-") + if not sep: + raise InvalidSdistFilename(f"Invalid sdist filename: {filename}") + + name = canonicalize_name(name_part) + + try: + version = Version(version_part) + except InvalidVersion as e: + raise InvalidSdistFilename( + f"Invalid sdist filename (invalid version): {filename}" + ) from e + + return (name, version) diff --git a/tools/gyp/pylib/packaging/version.py b/tools/gyp/pylib/packaging/version.py new file mode 100644 index 00000000000000..5faab9bd0dcf28 --- /dev/null +++ b/tools/gyp/pylib/packaging/version.py @@ -0,0 +1,563 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +""" +.. testsetup:: + + from packaging.version import parse, Version +""" + +import itertools +import re +from typing import Any, Callable, NamedTuple, Optional, SupportsInt, Tuple, Union + +from ._structures import Infinity, InfinityType, NegativeInfinity, NegativeInfinityType + +__all__ = ["VERSION_PATTERN", "parse", "Version", "InvalidVersion"] + +LocalType = Tuple[Union[int, str], ...] + +CmpPrePostDevType = Union[InfinityType, NegativeInfinityType, Tuple[str, int]] +CmpLocalType = Union[ + NegativeInfinityType, + Tuple[Union[Tuple[int, str], Tuple[NegativeInfinityType, Union[int, str]]], ...], +] +CmpKey = Tuple[ + int, + Tuple[int, ...], + CmpPrePostDevType, + CmpPrePostDevType, + CmpPrePostDevType, + CmpLocalType, +] +VersionComparisonMethod = Callable[[CmpKey, CmpKey], bool] + + +class _Version(NamedTuple): + epoch: int + release: Tuple[int, ...] + dev: Optional[Tuple[str, int]] + pre: Optional[Tuple[str, int]] + post: Optional[Tuple[str, int]] + local: Optional[LocalType] + + +def parse(version: str) -> "Version": + """Parse the given version string. + + >>> parse('1.0.dev1') + + + :param version: The version string to parse. + :raises InvalidVersion: When the version string is not a valid version. + """ + return Version(version) + + +class InvalidVersion(ValueError): + """Raised when a version string is not a valid version. + + >>> Version("invalid") + Traceback (most recent call last): + ... + packaging.version.InvalidVersion: Invalid version: 'invalid' + """ + + +class _BaseVersion: + _key: Tuple[Any, ...] + + def __hash__(self) -> int: + return hash(self._key) + + # Please keep the duplicated `isinstance` check + # in the six comparisons hereunder + # unless you find a way to avoid adding overhead function calls. + def __lt__(self, other: "_BaseVersion") -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key < other._key + + def __le__(self, other: "_BaseVersion") -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key <= other._key + + def __eq__(self, other: object) -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key == other._key + + def __ge__(self, other: "_BaseVersion") -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key >= other._key + + def __gt__(self, other: "_BaseVersion") -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key > other._key + + def __ne__(self, other: object) -> bool: + if not isinstance(other, _BaseVersion): + return NotImplemented + + return self._key != other._key + + +# Deliberately not anchored to the start and end of the string, to make it +# easier for 3rd party code to reuse +_VERSION_PATTERN = r""" + v? + (?: + (?:(?P[0-9]+)!)? # epoch + (?P[0-9]+(?:\.[0-9]+)*) # release segment + (?P
                                              # pre-release
    +            [-_\.]?
    +            (?Palpha|a|beta|b|preview|pre|c|rc)
    +            [-_\.]?
    +            (?P[0-9]+)?
    +        )?
    +        (?P                                         # post release
    +            (?:-(?P[0-9]+))
    +            |
    +            (?:
    +                [-_\.]?
    +                (?Ppost|rev|r)
    +                [-_\.]?
    +                (?P[0-9]+)?
    +            )
    +        )?
    +        (?P                                          # dev release
    +            [-_\.]?
    +            (?Pdev)
    +            [-_\.]?
    +            (?P[0-9]+)?
    +        )?
    +    )
    +    (?:\+(?P[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
    +"""
    +
    +VERSION_PATTERN = _VERSION_PATTERN
    +"""
    +A string containing the regular expression used to match a valid version.
    +
    +The pattern is not anchored at either end, and is intended for embedding in larger
    +expressions (for example, matching a version number as part of a file name). The
    +regular expression should be compiled with the ``re.VERBOSE`` and ``re.IGNORECASE``
    +flags set.
    +
    +:meta hide-value:
    +"""
    +
    +
    +class Version(_BaseVersion):
    +    """This class abstracts handling of a project's versions.
    +
    +    A :class:`Version` instance is comparison aware and can be compared and
    +    sorted using the standard Python interfaces.
    +
    +    >>> v1 = Version("1.0a5")
    +    >>> v2 = Version("1.0")
    +    >>> v1
    +    
    +    >>> v2
    +    
    +    >>> v1 < v2
    +    True
    +    >>> v1 == v2
    +    False
    +    >>> v1 > v2
    +    False
    +    >>> v1 >= v2
    +    False
    +    >>> v1 <= v2
    +    True
    +    """
    +
    +    _regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE)
    +    _key: CmpKey
    +
    +    def __init__(self, version: str) -> None:
    +        """Initialize a Version object.
    +
    +        :param version:
    +            The string representation of a version which will be parsed and normalized
    +            before use.
    +        :raises InvalidVersion:
    +            If the ``version`` does not conform to PEP 440 in any way then this
    +            exception will be raised.
    +        """
    +
    +        # Validate the version and parse it into pieces
    +        match = self._regex.search(version)
    +        if not match:
    +            raise InvalidVersion(f"Invalid version: '{version}'")
    +
    +        # Store the parsed out pieces of the version
    +        self._version = _Version(
    +            epoch=int(match.group("epoch")) if match.group("epoch") else 0,
    +            release=tuple(int(i) for i in match.group("release").split(".")),
    +            pre=_parse_letter_version(match.group("pre_l"), match.group("pre_n")),
    +            post=_parse_letter_version(
    +                match.group("post_l"), match.group("post_n1") or match.group("post_n2")
    +            ),
    +            dev=_parse_letter_version(match.group("dev_l"), match.group("dev_n")),
    +            local=_parse_local_version(match.group("local")),
    +        )
    +
    +        # Generate a key which will be used for sorting
    +        self._key = _cmpkey(
    +            self._version.epoch,
    +            self._version.release,
    +            self._version.pre,
    +            self._version.post,
    +            self._version.dev,
    +            self._version.local,
    +        )
    +
    +    def __repr__(self) -> str:
    +        """A representation of the Version that shows all internal state.
    +
    +        >>> Version('1.0.0')
    +        
    +        """
    +        return f""
    +
    +    def __str__(self) -> str:
    +        """A string representation of the version that can be rounded-tripped.
    +
    +        >>> str(Version("1.0a5"))
    +        '1.0a5'
    +        """
    +        parts = []
    +
    +        # Epoch
    +        if self.epoch != 0:
    +            parts.append(f"{self.epoch}!")
    +
    +        # Release segment
    +        parts.append(".".join(str(x) for x in self.release))
    +
    +        # Pre-release
    +        if self.pre is not None:
    +            parts.append("".join(str(x) for x in self.pre))
    +
    +        # Post-release
    +        if self.post is not None:
    +            parts.append(f".post{self.post}")
    +
    +        # Development release
    +        if self.dev is not None:
    +            parts.append(f".dev{self.dev}")
    +
    +        # Local version segment
    +        if self.local is not None:
    +            parts.append(f"+{self.local}")
    +
    +        return "".join(parts)
    +
    +    @property
    +    def epoch(self) -> int:
    +        """The epoch of the version.
    +
    +        >>> Version("2.0.0").epoch
    +        0
    +        >>> Version("1!2.0.0").epoch
    +        1
    +        """
    +        return self._version.epoch
    +
    +    @property
    +    def release(self) -> Tuple[int, ...]:
    +        """The components of the "release" segment of the version.
    +
    +        >>> Version("1.2.3").release
    +        (1, 2, 3)
    +        >>> Version("2.0.0").release
    +        (2, 0, 0)
    +        >>> Version("1!2.0.0.post0").release
    +        (2, 0, 0)
    +
    +        Includes trailing zeroes but not the epoch or any pre-release / development /
    +        post-release suffixes.
    +        """
    +        return self._version.release
    +
    +    @property
    +    def pre(self) -> Optional[Tuple[str, int]]:
    +        """The pre-release segment of the version.
    +
    +        >>> print(Version("1.2.3").pre)
    +        None
    +        >>> Version("1.2.3a1").pre
    +        ('a', 1)
    +        >>> Version("1.2.3b1").pre
    +        ('b', 1)
    +        >>> Version("1.2.3rc1").pre
    +        ('rc', 1)
    +        """
    +        return self._version.pre
    +
    +    @property
    +    def post(self) -> Optional[int]:
    +        """The post-release number of the version.
    +
    +        >>> print(Version("1.2.3").post)
    +        None
    +        >>> Version("1.2.3.post1").post
    +        1
    +        """
    +        return self._version.post[1] if self._version.post else None
    +
    +    @property
    +    def dev(self) -> Optional[int]:
    +        """The development number of the version.
    +
    +        >>> print(Version("1.2.3").dev)
    +        None
    +        >>> Version("1.2.3.dev1").dev
    +        1
    +        """
    +        return self._version.dev[1] if self._version.dev else None
    +
    +    @property
    +    def local(self) -> Optional[str]:
    +        """The local version segment of the version.
    +
    +        >>> print(Version("1.2.3").local)
    +        None
    +        >>> Version("1.2.3+abc").local
    +        'abc'
    +        """
    +        if self._version.local:
    +            return ".".join(str(x) for x in self._version.local)
    +        else:
    +            return None
    +
    +    @property
    +    def public(self) -> str:
    +        """The public portion of the version.
    +
    +        >>> Version("1.2.3").public
    +        '1.2.3'
    +        >>> Version("1.2.3+abc").public
    +        '1.2.3'
    +        >>> Version("1.2.3+abc.dev1").public
    +        '1.2.3'
    +        """
    +        return str(self).split("+", 1)[0]
    +
    +    @property
    +    def base_version(self) -> str:
    +        """The "base version" of the version.
    +
    +        >>> Version("1.2.3").base_version
    +        '1.2.3'
    +        >>> Version("1.2.3+abc").base_version
    +        '1.2.3'
    +        >>> Version("1!1.2.3+abc.dev1").base_version
    +        '1!1.2.3'
    +
    +        The "base version" is the public version of the project without any pre or post
    +        release markers.
    +        """
    +        parts = []
    +
    +        # Epoch
    +        if self.epoch != 0:
    +            parts.append(f"{self.epoch}!")
    +
    +        # Release segment
    +        parts.append(".".join(str(x) for x in self.release))
    +
    +        return "".join(parts)
    +
    +    @property
    +    def is_prerelease(self) -> bool:
    +        """Whether this version is a pre-release.
    +
    +        >>> Version("1.2.3").is_prerelease
    +        False
    +        >>> Version("1.2.3a1").is_prerelease
    +        True
    +        >>> Version("1.2.3b1").is_prerelease
    +        True
    +        >>> Version("1.2.3rc1").is_prerelease
    +        True
    +        >>> Version("1.2.3dev1").is_prerelease
    +        True
    +        """
    +        return self.dev is not None or self.pre is not None
    +
    +    @property
    +    def is_postrelease(self) -> bool:
    +        """Whether this version is a post-release.
    +
    +        >>> Version("1.2.3").is_postrelease
    +        False
    +        >>> Version("1.2.3.post1").is_postrelease
    +        True
    +        """
    +        return self.post is not None
    +
    +    @property
    +    def is_devrelease(self) -> bool:
    +        """Whether this version is a development release.
    +
    +        >>> Version("1.2.3").is_devrelease
    +        False
    +        >>> Version("1.2.3.dev1").is_devrelease
    +        True
    +        """
    +        return self.dev is not None
    +
    +    @property
    +    def major(self) -> int:
    +        """The first item of :attr:`release` or ``0`` if unavailable.
    +
    +        >>> Version("1.2.3").major
    +        1
    +        """
    +        return self.release[0] if len(self.release) >= 1 else 0
    +
    +    @property
    +    def minor(self) -> int:
    +        """The second item of :attr:`release` or ``0`` if unavailable.
    +
    +        >>> Version("1.2.3").minor
    +        2
    +        >>> Version("1").minor
    +        0
    +        """
    +        return self.release[1] if len(self.release) >= 2 else 0
    +
    +    @property
    +    def micro(self) -> int:
    +        """The third item of :attr:`release` or ``0`` if unavailable.
    +
    +        >>> Version("1.2.3").micro
    +        3
    +        >>> Version("1").micro
    +        0
    +        """
    +        return self.release[2] if len(self.release) >= 3 else 0
    +
    +
    +def _parse_letter_version(
    +    letter: Optional[str], number: Union[str, bytes, SupportsInt, None]
    +) -> Optional[Tuple[str, int]]:
    +
    +    if letter:
    +        # We consider there to be an implicit 0 in a pre-release if there is
    +        # not a numeral associated with it.
    +        if number is None:
    +            number = 0
    +
    +        # We normalize any letters to their lower case form
    +        letter = letter.lower()
    +
    +        # We consider some words to be alternate spellings of other words and
    +        # in those cases we want to normalize the spellings to our preferred
    +        # spelling.
    +        if letter == "alpha":
    +            letter = "a"
    +        elif letter == "beta":
    +            letter = "b"
    +        elif letter in ["c", "pre", "preview"]:
    +            letter = "rc"
    +        elif letter in ["rev", "r"]:
    +            letter = "post"
    +
    +        return letter, int(number)
    +    if not letter and number:
    +        # We assume if we are given a number, but we are not given a letter
    +        # then this is using the implicit post release syntax (e.g. 1.0-1)
    +        letter = "post"
    +
    +        return letter, int(number)
    +
    +    return None
    +
    +
    +_local_version_separators = re.compile(r"[\._-]")
    +
    +
    +def _parse_local_version(local: Optional[str]) -> Optional[LocalType]:
    +    """
    +    Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
    +    """
    +    if local is not None:
    +        return tuple(
    +            part.lower() if not part.isdigit() else int(part)
    +            for part in _local_version_separators.split(local)
    +        )
    +    return None
    +
    +
    +def _cmpkey(
    +    epoch: int,
    +    release: Tuple[int, ...],
    +    pre: Optional[Tuple[str, int]],
    +    post: Optional[Tuple[str, int]],
    +    dev: Optional[Tuple[str, int]],
    +    local: Optional[LocalType],
    +) -> CmpKey:
    +
    +    # When we compare a release version, we want to compare it with all of the
    +    # trailing zeros removed. So we'll use a reverse the list, drop all the now
    +    # leading zeros until we come to something non zero, then take the rest
    +    # re-reverse it back into the correct order and make it a tuple and use
    +    # that for our sorting key.
    +    _release = tuple(
    +        reversed(list(itertools.dropwhile(lambda x: x == 0, reversed(release))))
    +    )
    +
    +    # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0.
    +    # We'll do this by abusing the pre segment, but we _only_ want to do this
    +    # if there is not a pre or a post segment. If we have one of those then
    +    # the normal sorting rules will handle this case correctly.
    +    if pre is None and post is None and dev is not None:
    +        _pre: CmpPrePostDevType = NegativeInfinity
    +    # Versions without a pre-release (except as noted above) should sort after
    +    # those with one.
    +    elif pre is None:
    +        _pre = Infinity
    +    else:
    +        _pre = pre
    +
    +    # Versions without a post segment should sort before those with one.
    +    if post is None:
    +        _post: CmpPrePostDevType = NegativeInfinity
    +
    +    else:
    +        _post = post
    +
    +    # Versions without a development segment should sort after those with one.
    +    if dev is None:
    +        _dev: CmpPrePostDevType = Infinity
    +
    +    else:
    +        _dev = dev
    +
    +    if local is None:
    +        # Versions without a local segment should sort before those with one.
    +        _local: CmpLocalType = NegativeInfinity
    +    else:
    +        # Versions with a local segment need that segment parsed to implement
    +        # the sorting rules in PEP440.
    +        # - Alpha numeric segments sort before numeric segments
    +        # - Alpha numeric segments sort lexicographically
    +        # - Numeric segments sort numerically
    +        # - Shorter versions sort before longer versions when the prefixes
    +        #   match exactly
    +        _local = tuple(
    +            (i, "") if isinstance(i, int) else (NegativeInfinity, i) for i in local
    +        )
    +
    +    return epoch, _release, _pre, _post, _dev, _local
    diff --git a/tools/gyp/pyproject.toml b/tools/gyp/pyproject.toml
    new file mode 100644
    index 00000000000000..0c25d0b3c1a065
    --- /dev/null
    +++ b/tools/gyp/pyproject.toml
    @@ -0,0 +1,119 @@
    +[build-system]
    +requires = ["setuptools>=61.0"]
    +build-backend = "setuptools.build_meta"
    +
    +[project]
    +name = "gyp-next"
    +version = "0.16.1"
    +authors = [
    +  { name="Node.js contributors", email="ryzokuken@disroot.org" },
    +]
    +description = "A fork of the GYP build system for use in the Node.js projects"
    +readme = "README.md"
    +license = { file="LICENSE" }
    +requires-python = ">=3.8"
    +# The Python module "packaging" is vendored in the "pylib/packaging" directory to support Python >= 3.12.
    +# dependencies = ["packaging>=23.1"]  # Uncomment this line if the vendored version is removed.
    +classifiers = [
    +    "Development Status :: 3 - Alpha",
    +    "Environment :: Console",
    +    "Intended Audience :: Developers",
    +    "License :: OSI Approved :: BSD License",
    +    "Natural Language :: English",
    +    "Programming Language :: Python",
    +    "Programming Language :: Python :: 3",
    +    "Programming Language :: Python :: 3.8",
    +    "Programming Language :: Python :: 3.9",
    +    "Programming Language :: Python :: 3.10",
    +    "Programming Language :: Python :: 3.11",
    +]
    +
    +[project.optional-dependencies]
    +dev = ["flake8", "ruff", "pytest"]
    +
    +[project.scripts]
    +gyp = "gyp:script_main"
    +
    +[project.urls]
    +"Homepage" = "https://github.com/nodejs/gyp-next"
    +
    +[tool.ruff]
    +select = [
    +  "C4",   # flake8-comprehensions
    +  "C90",  # McCabe cyclomatic complexity
    +  "DTZ",  # flake8-datetimez
    +  "E",    # pycodestyle
    +  "F",    # Pyflakes
    +  "G",    # flake8-logging-format
    +  "ICN",  # flake8-import-conventions
    +  "INT",  # flake8-gettext
    +  "PL",   # Pylint
    +  "PYI",  # flake8-pyi
    +  "RSE",  # flake8-raise
    +  "RUF",  # Ruff-specific rules
    +  "T10",  # flake8-debugger
    +  "TCH",  # flake8-type-checking
    +  "TID",  # flake8-tidy-imports
    +  "UP",   # pyupgrade
    +  "W",    # pycodestyle
    +  "YTT",  # flake8-2020
    +  # "A",    # flake8-builtins
    +  # "ANN",  # flake8-annotations
    +  # "ARG",  # flake8-unused-arguments
    +  # "B",    # flake8-bugbear
    +  # "BLE",  # flake8-blind-except
    +  # "COM",  # flake8-commas
    +  # "D",    # pydocstyle
    +  # "DJ",   # flake8-django
    +  # "EM",   # flake8-errmsg
    +  # "ERA",  # eradicate
    +  # "EXE",  # flake8-executable
    +  # "FBT",  # flake8-boolean-trap
    +  # "I",    # isort
    +  # "INP",  # flake8-no-pep420
    +  # "ISC",  # flake8-implicit-str-concat
    +  # "N",    # pep8-naming
    +  # "NPY",  # NumPy-specific rules
    +  # "PD",   # pandas-vet
    +  # "PGH",  # pygrep-hooks
    +  # "PIE",  # flake8-pie
    +  # "PT",   # flake8-pytest-style
    +  # "PTH",  # flake8-use-pathlib
    +  # "Q",    # flake8-quotes
    +  # "RET",  # flake8-return
    +  # "S",    # flake8-bandit
    +  # "SIM",  # flake8-simplify
    +  # "SLF",  # flake8-self
    +  # "T20",  # flake8-print
    +  # "TRY",  # tryceratops
    +]
    +ignore = [
    +  "E721",
    +  "PLC1901",
    +  "PLR0402",
    +  "PLR1714",
    +  "PLR2004",
    +  "PLR5501",
    +  "PLW0603",
    +  "PLW2901",
    +  "PYI024",
    +  "RUF005",
    +  "RUF012",
    +  "UP031",
    +]
    +extend-exclude = ["pylib/packaging"]
    +line-length = 88
    +target-version = "py37"
    +
    +[tool.ruff.mccabe]
    +max-complexity = 101
    +
    +[tool.ruff.pylint]
    +max-args = 11
    +max-branches = 108
    +max-returns = 10
    +max-statements = 286
    +
    +[tool.setuptools]
    +package-dir = {"" = "pylib"}
    +packages = ["gyp", "gyp.generator"]
    diff --git a/tools/gyp/requirements_dev.txt b/tools/gyp/requirements_dev.txt
    deleted file mode 100644
    index 28ecacab602938..00000000000000
    --- a/tools/gyp/requirements_dev.txt
    +++ /dev/null
    @@ -1,2 +0,0 @@
    -flake8
    -pytest
    diff --git a/tools/gyp/setup.py b/tools/gyp/setup.py
    deleted file mode 100644
    index 1bb6908deaf8ce..00000000000000
    --- a/tools/gyp/setup.py
    +++ /dev/null
    @@ -1,42 +0,0 @@
    -#!/usr/bin/env python3
    -
    -# Copyright (c) 2009 Google Inc. All rights reserved.
    -# Use of this source code is governed by a BSD-style license that can be
    -# found in the LICENSE file.
    -
    -from os import path
    -
    -from setuptools import setup
    -
    -here = path.abspath(path.dirname(__file__))
    -# Get the long description from the README file
    -with open(path.join(here, "README.md")) as in_file:
    -    long_description = in_file.read()
    -
    -setup(
    -    name="gyp-next",
    -    version="0.13.0",
    -    description="A fork of the GYP build system for use in the Node.js projects",
    -    long_description=long_description,
    -    long_description_content_type="text/markdown",
    -    author="Node.js contributors",
    -    author_email="ryzokuken@disroot.org",
    -    url="https://github.com/nodejs/gyp-next",
    -    package_dir={"": "pylib"},
    -    packages=["gyp", "gyp.generator"],
    -    entry_points={"console_scripts": ["gyp=gyp:script_main"]},
    -    python_requires=">=3.6",
    -    classifiers=[
    -        "Development Status :: 3 - Alpha",
    -        "Environment :: Console",
    -        "Intended Audience :: Developers",
    -        "License :: OSI Approved :: BSD License",
    -        "Natural Language :: English",
    -        "Programming Language :: Python",
    -        "Programming Language :: Python :: 3",
    -        "Programming Language :: Python :: 3.6",
    -        "Programming Language :: Python :: 3.7",
    -        "Programming Language :: Python :: 3.8",
    -        "Programming Language :: Python :: 3.9",
    -    ],
    -)
    diff --git a/tools/gyp/tools/pretty_sln.py b/tools/gyp/tools/pretty_sln.py
    index 6ca0cd12a7ba06..cf0638a23d635d 100755
    --- a/tools/gyp/tools/pretty_sln.py
    +++ b/tools/gyp/tools/pretty_sln.py
    @@ -34,10 +34,10 @@ def BuildProject(project, built, projects, deps):
     
     def ParseSolution(solution_file):
         # All projects, their clsid and paths.
    -    projects = dict()
    +    projects = {}
     
         # A list of dependencies associated with a project.
    -    dependencies = dict()
    +    dependencies = {}
     
         # Regular expressions that matches the SLN format.
         # The first line of a project definition.
    diff --git a/tools/gyp/tools/pretty_vcproj.py b/tools/gyp/tools/pretty_vcproj.py
    index 00d32debda51f0..72c65d7fc495f9 100755
    --- a/tools/gyp/tools/pretty_vcproj.py
    +++ b/tools/gyp/tools/pretty_vcproj.py
    @@ -21,7 +21,7 @@
     
     __author__ = "nsylvain (Nicolas Sylvain)"
     ARGUMENTS = None
    -REPLACEMENTS = dict()
    +REPLACEMENTS = {}
     
     
     def cmp(x, y):
    diff --git a/tools/gypi_to_gn.py b/tools/gypi_to_gn.py
    new file mode 100755
    index 00000000000000..77a68ff07ed4eb
    --- /dev/null
    +++ b/tools/gypi_to_gn.py
    @@ -0,0 +1,244 @@
    +#!/usr/bin/env python3
    +# Copyright 2014 The Chromium Authors. All rights reserved.
    +#
    +# Redistribution and use in source and binary forms, with or without
    +# modification, are permitted provided that the following conditions are
    +# met:
    +#
    +#    * Redistributions of source code must retain the above copyright
    +# notice, this list of conditions and the following disclaimer.
    +#    * Redistributions in binary form must reproduce the above
    +# copyright notice, this list of conditions and the following disclaimer
    +# in the documentation and/or other materials provided with the
    +# distribution.
    +#    * Neither the name of Google LLC nor the names of its
    +# contributors may be used to endorse or promote products derived from
    +# this software without specific prior written permission.
    +#
    +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +
    +# Deleted from Chromium in https://crrev.com/097f64c631.
    +
    +"""Converts a given gypi file to a python scope and writes the result to stdout.
    +USING THIS SCRIPT IN CHROMIUM
    +Forking Python to run this script in the middle of GN is slow, especially on
    +Windows, and it makes both the GYP and GN files harder to follow. You can't
    +use "git grep" to find files in the GN build any more, and tracking everything
    +in GYP down requires a level of indirection. Any calls will have to be removed
    +and cleaned up once the GYP-to-GN transition is complete.
    +As a result, we only use this script when the list of files is large and
    +frequently-changing. In these cases, having one canonical list outweights the
    +downsides.
    +As of this writing, the GN build is basically complete. It's likely that all
    +large and frequently changing targets where this is appropriate use this
    +mechanism already. And since we hope to turn down the GYP build soon, the time
    +horizon is also relatively short. As a result, it is likely that no additional
    +uses of this script should every be added to the build. During this later part
    +of the transition period, we should be focusing more and more on the absolute
    +readability of the GN build.
    +HOW TO USE
    +It is assumed that the file contains a toplevel dictionary, and this script
    +will return that dictionary as a GN "scope" (see example below). This script
    +does not know anything about GYP and it will not expand variables or execute
    +conditions.
    +It will strip conditions blocks.
    +A variables block at the top level will be flattened so that the variables
    +appear in the root dictionary. This way they can be returned to the GN code.
    +Say your_file.gypi looked like this:
    +  {
    +     'sources': [ 'a.cc', 'b.cc' ],
    +     'defines': [ 'ENABLE_DOOM_MELON' ],
    +  }
    +You would call it like this:
    +  gypi_values = exec_script("//build/gypi_to_gn.py",
    +                            [ rebase_path("your_file.gypi") ],
    +                            "scope",
    +                            [ "your_file.gypi" ])
    +Notes:
    + - The rebase_path call converts the gypi file from being relative to the
    +   current build file to being system absolute for calling the script, which
    +   will have a different current directory than this file.
    + - The "scope" parameter tells GN to interpret the result as a series of GN
    +   variable assignments.
    + - The last file argument to exec_script tells GN that the given file is a
    +   dependency of the build so Ninja can automatically re-run GN if the file
    +   changes.
    +Read the values into a target like this:
    +  component("mycomponent") {
    +    sources = gypi_values.sources
    +    defines = gypi_values.defines
    +  }
    +Sometimes your .gypi file will include paths relative to a different
    +directory than the current .gn file. In this case, you can rebase them to
    +be relative to the current directory.
    +  sources = rebase_path(gypi_values.sources, ".",
    +                        "//path/gypi/input/values/are/relative/to")
    +This script will tolerate a 'variables' in the toplevel dictionary or not. If
    +the toplevel dictionary just contains one item called 'variables', it will be
    +collapsed away and the result will be the contents of that dictinoary. Some
    +.gypi files are written with or without this, depending on how they expect to
    +be embedded into a .gyp file.
    +This script also has the ability to replace certain substrings in the input.
    +Generally this is used to emulate GYP variable expansion. If you passed the
    +argument "--replace=<(foo)=bar" then all instances of "<(foo)" in strings in
    +the input will be replaced with "bar":
    +  gypi_values = exec_script("//build/gypi_to_gn.py",
    +                            [ rebase_path("your_file.gypi"),
    +                              "--replace=<(foo)=bar"],
    +                            "scope",
    +                            [ "your_file.gypi" ])
    +"""
    +
    +from __future__ import absolute_import
    +from __future__ import print_function
    +from optparse import OptionParser
    +import os
    +import sys
    +
    +
    +# Look for standalone GN distribution.
    +def FindGNPath():
    +  for i in os.environ['PATH'].split(os.pathsep):
    +    if i.rstrip(os.sep).endswith('gn'):
    +      return i
    +  return None
    +
    +
    +try:
    +  # May already be in the import path.
    +  import gn_helpers
    +except ImportError:
    +  # Add src/build to import path.
    +  src_dir = os.path.abspath(os.path.join(os.path.dirname(__file__),
    +                            os.pardir, os.pardir))
    +  sys.path.append(os.path.join(src_dir, 'build'))
    +  if FindGNPath():
    +    sys.path.append(os.path.join(FindGNPath(), 'build'))
    +  import gn_helpers
    +
    +
    +def LoadPythonDictionary(path):
    +  file_string = open(path).read()
    +  try:
    +    file_data = eval(file_string, {'__builtins__': None}, None)
    +  except SyntaxError as e:
    +    e.filename = path
    +    raise
    +  except Exception as e:
    +    raise Exception("Unexpected error while reading %s: %s" % (path, str(e)))
    +
    +  assert isinstance(file_data, dict), "%s does not eval to a dictionary" % path
    +
    +  # Flatten any variables to the top level.
    +  if 'variables' in file_data:
    +    file_data.update(file_data['variables'])
    +    del file_data['variables']
    +
    +  # Strip all elements that this script can't process.
    +  elements_to_strip = [
    +    'conditions',
    +    'direct_dependent_settings',
    +    'target_conditions',
    +    'target_defaults',
    +    'targets',
    +    'includes',
    +    'actions',
    +  ]
    +  for element in elements_to_strip:
    +    if element in file_data:
    +      del file_data[element]
    +
    +  return file_data
    +
    +
    +def ReplaceSubstrings(values, search_for, replace_with):
    +  """Recursively replaces substrings in a value.
    +  Replaces all substrings of the "search_for" with "repace_with" for all
    +  strings occurring in "values". This is done by recursively iterating into
    +  lists as well as the keys and values of dictionaries."""
    +  if isinstance(values, str):
    +    return values.replace(search_for, replace_with)
    +
    +  if isinstance(values, list):
    +    result = []
    +    for v in values:
    +      # Remove the item from list for complete match.
    +      if v == search_for and replace_with == '':
    +        continue
    +      result.append(ReplaceSubstrings(v, search_for, replace_with))
    +    return result
    +
    +  if isinstance(values, dict):
    +    # For dictionaries, do the search for both the key and values.
    +    result = {}
    +    for key, value in values.items():
    +      new_key = ReplaceSubstrings(key, search_for, replace_with)
    +      new_value = ReplaceSubstrings(value, search_for, replace_with)
    +      result[new_key] = new_value
    +    return result
    +
    +  # Assume everything else is unchanged.
    +  return values
    +
    +
    +def DeduplicateLists(values):
    +  """Recursively remove duplicate values in lists."""
    +  if isinstance(values, list):
    +    return sorted(list(set(values)))
    +
    +  if isinstance(values, dict):
    +    for key in values:
    +      values[key] = DeduplicateLists(values[key])
    +  return values
    +
    +
    +def main():
    +  parser = OptionParser()
    +  parser.add_option("-r", "--replace", action="append",
    +    help="Replaces substrings. If passed a=b, replaces all substrs a with b.")
    +  (options, args) = parser.parse_args()
    +
    +  if len(args) != 1:
    +    raise Exception("Need one argument which is the .gypi file to read.")
    +
    +  data = LoadPythonDictionary(args[0])
    +  if options.replace:
    +    # Do replacements for all specified patterns.
    +    for replace in options.replace:
    +      split = replace.split('=')
    +      # Allow "foo=" to replace with nothing.
    +      if len(split) == 1:
    +        split.append('')
    +      assert len(split) == 2, "Replacement must be of the form 'key=value'."
    +      data = ReplaceSubstrings(data, split[0], split[1])
    +
    +  gn_dict = {}
    +  for key in data:
    +    gn_key = key.replace('-', '_')
    +    # Sometimes .gypi files use the GYP syntax with percents at the end of the
    +    # variable name (to indicate not to overwrite a previously-defined value):
    +    #   'foo%': 'bar',
    +    # Convert these to regular variables.
    +    if len(key) > 1 and key[len(key) - 1] == '%':
    +      gn_dict[gn_key[:-1]] = data[key]
    +    else:
    +      gn_dict[gn_key] = data[key]
    +
    +  print(gn_helpers.ToGNString(DeduplicateLists(gn_dict)))
    +
    +if __name__ == '__main__':
    +  try:
    +    main()
    +  except Exception as e:
    +    print(str(e))
    +    sys.exit(1)
    diff --git a/tools/icu/current_ver.dep b/tools/icu/current_ver.dep
    index 4d94f1562f7255..e7a01203021fee 100644
    --- a/tools/icu/current_ver.dep
    +++ b/tools/icu/current_ver.dep
    @@ -1,6 +1,6 @@
     [
       {
    -    "url": "https://github.com/unicode-org/icu/releases/download/release-73-2/icu4c-73_2-src.tgz",
    -    "md5": "b8a4b8cf77f2e2f6e1341eac0aab2fc4"
    +    "url": "https://github.com/unicode-org/icu/releases/download/release-74-1/icu4c-74_1-src.tgz",
    +    "md5": "71e60b22697c4f35820a1897417dbab4"
       }
     ]
    diff --git a/tools/inspector_protocol/encoding/encoding.cc b/tools/inspector_protocol/encoding/encoding.cc
    index 636281dd8ad894..f7e933e41afac5 100644
    --- a/tools/inspector_protocol/encoding/encoding.cc
    +++ b/tools/inspector_protocol/encoding/encoding.cc
    @@ -847,7 +847,7 @@ void CBORTokenizer::ReadNextToken(bool enter_envelope) {
               // value 0).
               // The represented allowed values range is -1 to -2^31.
               // They are mapped into the encoded range of 0 to 2^31-1.
    -          // We check the the payload in token_start_internal_value_ against
    +          // We check the payload in token_start_internal_value_ against
               // that range (2^31-1 is also known as
               // std::numeric_limits::max()).
               if (!bytes_read ||
    @@ -1386,7 +1386,7 @@ class JSONEncoder : public StreamingParserHandler {
             // Disallow overlong encodings for ascii characters, as these
             // would include " and other characters significant to JSON
             // string termination / control.
    -        if (codepoint < 0x7f)
    +        if (codepoint <= 0x7f)
               continue;
             // Invalid in UTF8, and can't be represented in UTF16 anyway.
             if (codepoint > 0x10ffff)
    diff --git a/tools/inspector_protocol/encoding/encoding.h b/tools/inspector_protocol/encoding/encoding.h
    index 14432484d55b9d..a1bcfc4be3db4a 100644
    --- a/tools/inspector_protocol/encoding/encoding.h
    +++ b/tools/inspector_protocol/encoding/encoding.h
    @@ -5,6 +5,7 @@
     #ifndef V8_INSPECTOR_PROTOCOL_ENCODING_ENCODING_H_
     #define V8_INSPECTOR_PROTOCOL_ENCODING_ENCODING_H_
     
    +#include 
     #include 
     #include 
     #include 
    @@ -14,6 +15,19 @@
     #include 
     
     namespace v8_inspector_protocol_encoding {
    +// This library is designed to be portable. The only allowed dependency
    +// are the C/C++ standard libraries, up to C++11. We support both 32 bit
    +// and 64 architectures.
    +//
    +// Types used below:
    +// uint8_t: a byte, e.g. for raw bytes or UTF8 characters
    +// uint16_t: two bytes, e.g. for UTF16 characters
    +// For input parameters:
    +//   span: pointer to bytes and length
    +//   span: pointer to UTF16 chars and length
    +// For output parameters:
    +//   std::vector - Owned segment of bytes / utf8 characters and length.
    +//   std::string - Same, for compatibility, even though char is signed.
     
     // =============================================================================
     // span - sequence of bytes
    @@ -72,6 +86,22 @@ inline span SpanFrom(const std::string& v) {
       return span(reinterpret_cast(v.data()), v.size());
     }
     
    +// Less than / equality comparison functions for sorting / searching for byte
    +// spans. These are similar to absl::string_view's < and == operators.
    +inline bool SpanLessThan(span x, span y) noexcept {
    +  auto min_size = std::min(x.size(), y.size());
    +  const int r = min_size == 0 ? 0 : memcmp(x.data(), y.data(), min_size);
    +  return (r < 0) || (r == 0 && x.size() < y.size());
    +}
    +
    +inline bool SpanEquals(span x, span y) noexcept {
    +  auto len = x.size();
    +  if (len != y.size())
    +    return false;
    +  return x.data() == y.data() || len == 0 ||
    +         std::memcmp(x.data(), y.data(), len) == 0;
    +}
    +
     // =============================================================================
     // Status and Error codes
     // =============================================================================
    diff --git a/tools/inspector_protocol/encoding/encoding_test.cc b/tools/inspector_protocol/encoding/encoding_test.cc
    index 6893fe2581683c..f6b40dfcefe2df 100644
    --- a/tools/inspector_protocol/encoding/encoding_test.cc
    +++ b/tools/inspector_protocol/encoding/encoding_test.cc
    @@ -121,6 +121,28 @@ TEST(SpanFromTest, FromConstCharAndLiteral) {
       EXPECT_EQ(3u, SpanFrom("foo").size());
     }
     
    +TEST(SpanComparisons, ByteWiseLexicographicalOrder) {
    +  // Compare the empty span.
    +  EXPECT_FALSE(SpanLessThan(span(), span()));
    +  EXPECT_TRUE(SpanEquals(span(), span()));
    +
    +  // Compare message with itself.
    +  std::string msg = "Hello, world";
    +  EXPECT_FALSE(SpanLessThan(SpanFrom(msg), SpanFrom(msg)));
    +  EXPECT_TRUE(SpanEquals(SpanFrom(msg), SpanFrom(msg)));
    +
    +  // Compare message and copy.
    +  EXPECT_FALSE(SpanLessThan(SpanFrom(msg), SpanFrom(std::string(msg))));
    +  EXPECT_TRUE(SpanEquals(SpanFrom(msg), SpanFrom(std::string(msg))));
    +
    +  // Compare two messages. |lesser_msg| < |msg| because of the first
    +  // byte ('A' < 'H').
    +  std::string lesser_msg = "A lesser message.";
    +  EXPECT_TRUE(SpanLessThan(SpanFrom(lesser_msg), SpanFrom(msg)));
    +  EXPECT_FALSE(SpanLessThan(SpanFrom(msg), SpanFrom(lesser_msg)));
    +  EXPECT_FALSE(SpanEquals(SpanFrom(msg), SpanFrom(lesser_msg)));
    +}
    +
     // =============================================================================
     // Status and Error codes
     // =============================================================================
    @@ -1325,6 +1347,25 @@ void WriteUTF8AsUTF16(StreamingParserHandler* writer, const std::string& utf8) {
       writer->HandleString16(SpanFrom(UTF8ToUTF16(SpanFrom(utf8))));
     }
     
    +TEST(JsonEncoder, OverlongEncodings) {
    +  std::string out;
    +  Status status;
    +  std::unique_ptr writer =
    +      NewJSONEncoder(&GetTestPlatform(), &out, &status);
    +
    +  // We encode 0x7f, which is the DEL ascii character, as a 4 byte UTF8
    +  // sequence. This is called an overlong encoding, because only 1 byte
    +  // is needed to represent 0x7f as UTF8.
    +  std::vector chars = {
    +      0xf0,  // Starts 4 byte utf8 sequence
    +      0x80,  // continuation byte
    +      0x81,  // continuation byte w/ payload bit 7 set to 1.
    +      0xbf,  // continuation byte w/ payload bits 0-6 set to 11111.
    +  };
    +  writer->HandleString8(SpanFrom(chars));
    +  EXPECT_EQ("\"\"", out);  // Empty string means that 0x7f was rejected (good).
    +}
    +
     TEST(JsonStdStringWriterTest, HelloWorld) {
       std::string out;
       Status status;
    @@ -1561,6 +1602,13 @@ TEST_F(JsonParserTest, UsAsciiDelCornerCase) {
           "string16: a\x7f\n"
           "map end\n",
           log_.str());
    +
    +  // We've seen an implementation of UTF16ToUTF8 which would replace the DEL
    +  // character with ' ', so this simple roundtrip tests the routines in
    +  // encoding_test_helper.h, to make test failures of the above easier to
    +  // diagnose.
    +  std::vector utf16 = UTF8ToUTF16(SpanFrom(json));
    +  EXPECT_EQ(json, UTF16ToUTF8(SpanFrom(utf16)));
     }
     
     TEST_F(JsonParserTest, Whitespace) {
    diff --git a/tools/inspector_protocol/lib/Allocator_h.template b/tools/inspector_protocol/lib/Allocator_h.template
    index 15eaaaff0236d2..d94c4ca5b0ae99 100644
    --- a/tools/inspector_protocol/lib/Allocator_h.template
    +++ b/tools/inspector_protocol/lib/Allocator_h.template
    @@ -11,8 +11,6 @@
     namespace {{namespace}} {
     {% endfor %}
     
    -enum NotNullTagEnum { NotNullLiteral };
    -
     #define PROTOCOL_DISALLOW_COPY(ClassName) \
         private: \
             ClassName(const ClassName&) = delete; \
    diff --git a/tools/inspector_protocol/lib/DispatcherBase_h.template b/tools/inspector_protocol/lib/DispatcherBase_h.template
    index 7d859c4f2753bb..4aa0688adb33fc 100644
    --- a/tools/inspector_protocol/lib/DispatcherBase_h.template
    +++ b/tools/inspector_protocol/lib/DispatcherBase_h.template
    @@ -25,6 +25,9 @@ public:
             kFallThrough = 2,
         };
     
    +    // For historical reasons, these error codes correspond to commonly used
    +    // XMLRPC codes (e.g. see METHOD_NOT_FOUND in
    +    // https://github.com/python/cpython/blob/master/Lib/xmlrpc/client.py).
         enum ErrorCode {
             kParseError = -32700,
             kInvalidRequest = -32600,
    diff --git a/tools/inspector_protocol/lib/Forward_h.template b/tools/inspector_protocol/lib/Forward_h.template
    index ff5e685863395b..746ba20bba15f4 100644
    --- a/tools/inspector_protocol/lib/Forward_h.template
    +++ b/tools/inspector_protocol/lib/Forward_h.template
    @@ -28,7 +28,6 @@ class DispatchResponse;
     class ErrorSupport;
     class FundamentalValue;
     class ListValue;
    -template class Maybe;
     class Object;
     using Response = DispatchResponse;
     class SerializedValue;
    diff --git a/tools/inspector_protocol/lib/Maybe_h.template b/tools/inspector_protocol/lib/Maybe_h.template
    index 22cfac6b240bef..8dfee7e9d5cb72 100644
    --- a/tools/inspector_protocol/lib/Maybe_h.template
    +++ b/tools/inspector_protocol/lib/Maybe_h.template
    @@ -7,53 +7,19 @@
     #ifndef {{"_".join(config.protocol.namespace)}}_Maybe_h
     #define {{"_".join(config.protocol.namespace)}}_Maybe_h
     
    -// This macro allows to test for the version of the GNU C++ compiler.
    -// Note that this also applies to compilers that masquerade as GCC,
    -// for example clang and the Intel C++ compiler for Linux.
    -// Use like:
    -//  #if IP_GNUC_PREREQ(4, 3, 1)
    -//   ...
    -//  #endif
    -#if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__)
    -#define IP_GNUC_PREREQ(major, minor, patchlevel)                      \
    -  ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= \
    -   ((major)*10000 + (minor)*100 + (patchlevel)))
    -#elif defined(__GNUC__) && defined(__GNUC_MINOR__)
    -#define IP_GNUC_PREREQ(major, minor, patchlevel) \
    -  ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100) >=  \
    -   ((major)*10000 + (minor)*100 + (patchlevel)))
    -#else
    -#define IP_GNUC_PREREQ(major, minor, patchlevel) 0
    -#endif
    -
    -#if defined(__mips64)
    -#define IP_TARGET_ARCH_MIPS64 1
    -#elif defined(__MIPSEB__) || defined(__MIPSEL__)
    -#define IP_TARGET_ARCH_MIPS 1
    -#endif
    -
    -// Allowing the use of noexcept by removing the keyword on older compilers that
    -// do not support adding noexcept to default members.
    -#if ((IP_GNUC_PREREQ(4, 9, 0) && !defined(IP_TARGET_ARCH_MIPS) && \
    -      !defined(IP_TARGET_ARCH_MIPS64)) ||                         \
    -     (defined(__clang__) && __cplusplus > 201300L))
    -#define IP_NOEXCEPT noexcept
    -#else
    -#define IP_NOEXCEPT
    -#endif
    -
     //#include "Forward.h"
     
     {% for namespace in config.protocol.namespace %}
     namespace {{namespace}} {
     {% endfor %}
     
    +namespace detail {
     template
    -class Maybe {
    +class PtrMaybe {
     public:
    -    Maybe() : m_value() { }
    -    Maybe(std::unique_ptr value) : m_value(std::move(value)) { }
    -    Maybe(Maybe&& other) IP_NOEXCEPT : m_value(std::move(other.m_value)) {}
    +    PtrMaybe() = default;
    +    PtrMaybe(std::unique_ptr value) : m_value(std::move(value)) { }
    +    PtrMaybe(PtrMaybe&& other) noexcept : m_value(std::move(other.m_value)) {}
         void operator=(std::unique_ptr value) { m_value = std::move(value); }
         T* fromJust() const { DCHECK(m_value); return m_value.get(); }
         T* fromMaybe(T* defaultValue) const { return m_value ? m_value.get() : defaultValue; }
    @@ -64,76 +30,48 @@ private:
     };
     
     template
    -class MaybeBase {
    +class ValueMaybe {
     public:
    -    MaybeBase() : m_isJust(false) { }
    -    MaybeBase(T value) : m_isJust(true), m_value(value) { }
    -    MaybeBase(MaybeBase&& other) IP_NOEXCEPT
    +    ValueMaybe() : m_isJust(false), m_value() { }
    +    ValueMaybe(T value) : m_isJust(true), m_value(std::move(value)) { }
    +    ValueMaybe(ValueMaybe&& other) noexcept
             : m_isJust(other.m_isJust),
               m_value(std::move(other.m_value)) {}
         void operator=(T value) { m_value = value; m_isJust = true; }
    -    T fromJust() const { DCHECK(m_isJust); return m_value; }
    -    T fromMaybe(const T& defaultValue) const { return m_isJust ? m_value : defaultValue; }
    +    const T& fromJust() const { DCHECK(m_isJust); return m_value; }
    +    const T& fromMaybe(const T& defaultValue) const { return m_isJust ? m_value : defaultValue; }
         bool isJust() const { return m_isJust; }
    -    T takeJust() { DCHECK(m_isJust); return m_value; }
    -
    -protected:
    +    T takeJust() { DCHECK(m_isJust); return std::move(m_value); }
    +private:
         bool m_isJust;
         T m_value;
     };
     
    -template<>
    -class Maybe : public MaybeBase {
    -public:
    -    Maybe() { m_value = false; }
    -    Maybe(bool value) : MaybeBase(value) { }
    -    Maybe(Maybe&& other) IP_NOEXCEPT : MaybeBase(std::move(other)) {}
    -    using MaybeBase::operator=;
    -};
    +template 
    +struct MaybeTypedef { typedef PtrMaybe type; };
     
    -template<>
    -class Maybe : public MaybeBase {
    -public:
    -    Maybe() { m_value = 0; }
    -    Maybe(int value) : MaybeBase(value) { }
    -    Maybe(Maybe&& other) IP_NOEXCEPT : MaybeBase(std::move(other)) {}
    -    using MaybeBase::operator=;
    -};
    +template <>
    +struct MaybeTypedef { typedef ValueMaybe type; };
     
    -template<>
    -class Maybe : public MaybeBase {
    -public:
    -    Maybe() { m_value = 0; }
    -    Maybe(double value) : MaybeBase(value) { }
    -    Maybe(Maybe&& other) IP_NOEXCEPT : MaybeBase(std::move(other)) {}
    -    using MaybeBase::operator=;
    -};
    +template <>
    +struct MaybeTypedef { typedef ValueMaybe type; };
     
    -template<>
    -class Maybe : public MaybeBase {
    -public:
    -    Maybe() { }
    -    Maybe(const String& value) : MaybeBase(value) { }
    -    Maybe(Maybe&& other) IP_NOEXCEPT : MaybeBase(std::move(other)) {}
    -    using MaybeBase::operator=;
    -};
    +template <>
    +struct MaybeTypedef { typedef ValueMaybe type; };
     
    -template<>
    -class Maybe : public MaybeBase {
    -public:
    -    Maybe() { }
    -    Maybe(Binary value) : MaybeBase(value) { }
    -    Maybe(Maybe&& other) IP_NOEXCEPT : MaybeBase(std::move(other)) {}
    -    using MaybeBase::operator=;
    -};
    +template <>
    +struct MaybeTypedef { typedef ValueMaybe type; };
    +
    +template <>
    +struct MaybeTypedef { typedef ValueMaybe type; };
    +
    +}  // namespace detail
    +
    +template 
    +using Maybe = typename detail::MaybeTypedef::type;
     
     {% for namespace in config.protocol.namespace %}
     } // namespace {{namespace}}
     {% endfor %}
     
    -#undef IP_GNUC_PREREQ
    -#undef IP_TARGET_ARCH_MIPS64
    -#undef IP_TARGET_ARCH_MIPS
    -#undef IP_NOEXCEPT
    -
     #endif // !defined({{"_".join(config.protocol.namespace)}}_Maybe_h)
    diff --git a/tools/inspector_protocol/lib/encoding_cpp.template b/tools/inspector_protocol/lib/encoding_cpp.template
    index d3646491140663..a0377d12f7dbb1 100644
    --- a/tools/inspector_protocol/lib/encoding_cpp.template
    +++ b/tools/inspector_protocol/lib/encoding_cpp.template
    @@ -855,7 +855,7 @@ void CBORTokenizer::ReadNextToken(bool enter_envelope) {
               // value 0).
               // The represented allowed values range is -1 to -2^31.
               // They are mapped into the encoded range of 0 to 2^31-1.
    -          // We check the the payload in token_start_internal_value_ against
    +          // We check the payload in token_start_internal_value_ against
               // that range (2^31-1 is also known as
               // std::numeric_limits::max()).
               if (!bytes_read ||
    @@ -1394,7 +1394,7 @@ class JSONEncoder : public StreamingParserHandler {
             // Disallow overlong encodings for ascii characters, as these
             // would include " and other characters significant to JSON
             // string termination / control.
    -        if (codepoint < 0x7f)
    +        if (codepoint <= 0x7f)
               continue;
             // Invalid in UTF8, and can't be represented in UTF16 anyway.
             if (codepoint > 0x10ffff)
    diff --git a/tools/inspector_protocol/lib/encoding_h.template b/tools/inspector_protocol/lib/encoding_h.template
    index 4d9874bfbd5cb4..2601192e160543 100644
    --- a/tools/inspector_protocol/lib/encoding_h.template
    +++ b/tools/inspector_protocol/lib/encoding_h.template
    @@ -9,6 +9,7 @@
     #ifndef {{"_".join(config.protocol.namespace)}}_encoding_h
     #define {{"_".join(config.protocol.namespace)}}_encoding_h
     
    +#include 
     #include 
     #include 
     #include 
    @@ -23,6 +24,19 @@ namespace {{namespace}} {
     
     // ===== encoding/encoding.h =====
     
    +// This library is designed to be portable. The only allowed dependency
    +// are the C/C++ standard libraries, up to C++11. We support both 32 bit
    +// and 64 architectures.
    +//
    +// Types used below:
    +// uint8_t: a byte, e.g. for raw bytes or UTF8 characters
    +// uint16_t: two bytes, e.g. for UTF16 characters
    +// For input parameters:
    +//   span: pointer to bytes and length
    +//   span: pointer to UTF16 chars and length
    +// For output parameters:
    +//   std::vector - Owned segment of bytes / utf8 characters and length.
    +//   std::string - Same, for compatibility, even though char is signed.
     
     // =============================================================================
     // span - sequence of bytes
    @@ -81,6 +95,22 @@ inline span SpanFrom(const std::string& v) {
       return span(reinterpret_cast(v.data()), v.size());
     }
     
    +// Less than / equality comparison functions for sorting / searching for byte
    +// spans. These are similar to absl::string_view's < and == operators.
    +inline bool SpanLessThan(span x, span y) noexcept {
    +  auto min_size = std::min(x.size(), y.size());
    +  const int r = min_size == 0 ? 0 : memcmp(x.data(), y.data(), min_size);
    +  return (r < 0) || (r == 0 && x.size() < y.size());
    +}
    +
    +inline bool SpanEquals(span x, span y) noexcept {
    +  auto len = x.size();
    +  if (len != y.size())
    +    return false;
    +  return x.data() == y.data() || len == 0 ||
    +         std::memcmp(x.data(), y.data(), len) == 0;
    +}
    +
     // =============================================================================
     // Status and Error codes
     // =============================================================================
    diff --git a/tools/license-builder.sh b/tools/license-builder.sh
    index 10b894262946ea..0a3f8fbe636b55 100755
    --- a/tools/license-builder.sh
    +++ b/tools/license-builder.sh
    @@ -79,6 +79,8 @@ licenseText="$(sed -e '/You should have received a copy of the CC0/,$d' -e 's/^\
     addlicense "SipHash" "deps/v8/src/third_party/siphash" "$licenseText"
     licenseText="$(sed -e '/The data format used by the zlib library/,$d' -e 's/^\/\* *//' -e 's/^ *//' "${rootdir}/deps/zlib/zlib.h")"
     addlicense "zlib" "deps/zlib" "$licenseText"
    +licenseText="$(cat "${rootdir}/deps/simdjson/LICENSE")"
    +addlicense "simdjson" "deps/simdjson" "$licenseText"
     licenseText="$(cat "${rootdir}/deps/simdutf/LICENSE-MIT")"
     addlicense "simdutf" "deps/simdutf" "$licenseText"
     licenseText="$(curl -sL https://raw.githubusercontent.com/ada-url/ada/HEAD/LICENSE-MIT)"
    @@ -103,6 +105,8 @@ addlicense "markupsafe" "tools/inspector_protocol/markupsafe" "$licenseText"
     # Testing tools
     licenseText="$(sed -e '/^$/,$d' -e 's/^#$//' -e 's/^# //' "${rootdir}/tools/cpplint.py" | tail -n +3)"
     addlicense "cpplint.py" "tools/cpplint.py" "$licenseText"
    +licenseText="$(sed -e '/^$/,$d' -e 's/^#$//' -e 's/^# //' "${rootdir}/tools/gypi_to_gn.py" | tail -n +3)"
    +addlicense "gypi_to_gn.py" "tools/gypi_to_gn.py" "$licenseText"
     licenseText="$(cat "${rootdir}/tools/node_modules/eslint/LICENSE")"
     addlicense "ESLint" "tools/node_modules/eslint" "$licenseText"
     licenseText="$(cat "${rootdir}/deps/googletest/LICENSE")"
    diff --git a/tools/lint-md/lint-md.mjs b/tools/lint-md/lint-md.mjs
    index bdea9c710cfea5..d42a103f3af070 100644
    --- a/tools/lint-md/lint-md.mjs
    +++ b/tools/lint-md/lint-md.mjs
    @@ -3062,19 +3062,15 @@ function constructs(existing, list) {
     function decodeNumericCharacterReference(value, base) {
       const code = Number.parseInt(value, base);
       if (
    -    code < 9 ||
    -    code === 11 ||
    -    (code > 13 && code < 32) ||
    -    (code > 126 && code < 160) ||
    -    (code > 55_295 && code < 57_344) ||
    -    (code > 64_975 && code < 65_008)  ||
    -    (code & 65_535) === 65_535 ||
    -    (code & 65_535) === 65_534  ||
    -    code > 1_114_111
    -  ) {
    -    return '\uFFFD'
    +  code < 9 || code === 11 || code > 13 && code < 32 ||
    +  code > 126 && code < 160 ||
    +  code > 55_295 && code < 57_344 ||
    +  code > 64_975 && code < 65_008 ||
    +  (code & 65_535) === 65_535 || (code & 65_535) === 65_534 ||
    +  code > 1_114_111) {
    +    return "\uFFFD";
       }
    -  return String.fromCharCode(code)
    +  return String.fromCodePoint(code);
     }
     
     function normalizeIdentifier$1(value) {
    @@ -27456,7 +27452,7 @@ var eastasianwidthExports = eastasianwidth.exports;
     var eastAsianWidth = getDefaultExportFromCjs(eastasianwidthExports);
     
     var emojiRegex = () => {
    -	return /[#*0-9]\uFE0F?\u20E3|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]\uFE0F?|[\u261D\u270C\u270D](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?|[\u270A\u270B](?:\uD83C[\uDFFB-\uDFFF])?|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2795-\u2797\u27B0\u27BF\u2B50]|\u26F9(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|\u2764\uFE0F?(?:\u200D(?:\uD83D\uDD25|\uD83E\uDE79))?|\uD83C(?:[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]\uFE0F?|[\uDF85\uDFC2\uDFC7](?:\uD83C[\uDFFB-\uDFFF])?|[\uDFC3\uDFC4\uDFCA](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDFCB\uDFCC](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF]|\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uDDFC\uD83C[\uDDEB\uDDF8]|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C[\uDDEA\uDDF9]|\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uDFF3\uFE0F?(?:\u200D(?:\u26A7\uFE0F?|\uD83C\uDF08))?|\uDFF4(?:\u200D\u2620\uFE0F?|\uDB40\uDC67\uDB40\uDC62\uDB40(?:\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDC73\uDB40\uDC63\uDB40\uDC74|\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F)?)|\uD83D(?:[\uDC08\uDC26](?:\u200D\u2B1B)?|[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]\uFE0F?|[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC](?:\uD83C[\uDFFB-\uDFFF])?|[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD74\uDD90](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?|[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC25\uDC27-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEDC-\uDEDF\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB\uDFF0]|\uDC15(?:\u200D\uD83E\uDDBA)?|\uDC3B(?:\u200D\u2744\uFE0F?)?|\uDC41\uFE0F?(?:\u200D\uD83D\uDDE8\uFE0F?)?|\uDC68(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE])))?))?|\uDC69(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?[\uDC68\uDC69]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFE])))?))?|\uDC6F(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDD75(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDE2E(?:\u200D\uD83D\uDCA8)?|\uDE35(?:\u200D\uD83D\uDCAB)?|\uDE36(?:\u200D\uD83C\uDF2B\uFE0F?)?)|\uD83E(?:[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF8](?:\uD83C[\uDFFB-\uDFFF])?|[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDDDE\uDDDF](?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD0D\uDD0E\uDD10-\uDD17\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCC\uDDD0\uDDE0-\uDDFF\uDE70-\uDE7C\uDE80-\uDE88\uDE90-\uDEBD\uDEBF-\uDEC2\uDECE-\uDEDB\uDEE0-\uDEE8]|\uDD3C(?:\u200D[\u2640\u2642]\uFE0F?|\uD83C[\uDFFB-\uDFFF])?|\uDDD1(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83E\uDDD1))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF-\uDDB3\uDDBC\uDDBD]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?))?|\uDEF1(?:\uD83C(?:\uDFFB(?:\u200D\uD83E\uDEF2\uD83C[\uDFFC-\uDFFF])?|\uDFFC(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFD-\uDFFF])?|\uDFFD(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])?|\uDFFE(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFD\uDFFF])?|\uDFFF(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFE])?))?)/g;
    +	return /[#*0-9]\uFE0F?\u20E3|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]\uFE0F?|[\u261D\u270C\u270D](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?|[\u270A\u270B](?:\uD83C[\uDFFB-\uDFFF])?|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2795-\u2797\u27B0\u27BF\u2B50]|\u26D3\uFE0F?(?:\u200D\uD83D\uDCA5)?|\u26F9(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|\u2764\uFE0F?(?:\u200D(?:\uD83D\uDD25|\uD83E\uDE79))?|\uD83C(?:[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]\uFE0F?|[\uDF85\uDFC2\uDFC7](?:\uD83C[\uDFFB-\uDFFF])?|[\uDFC4\uDFCA](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDFCB\uDFCC](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF43\uDF45-\uDF4A\uDF4C-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF]|\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uDDFC\uD83C[\uDDEB\uDDF8]|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C[\uDDEA\uDDF9]|\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uDF44(?:\u200D\uD83D\uDFEB)?|\uDF4B(?:\u200D\uD83D\uDFE9)?|\uDFC3(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDFF3\uFE0F?(?:\u200D(?:\u26A7\uFE0F?|\uD83C\uDF08))?|\uDFF4(?:\u200D\u2620\uFE0F?|\uDB40\uDC67\uDB40\uDC62\uDB40(?:\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDC73\uDB40\uDC63\uDB40\uDC74|\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F)?)|\uD83D(?:[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]\uFE0F?|[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC](?:\uD83C[\uDFFB-\uDFFF])?|[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4\uDEB5](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD74\uDD90](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?|[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC25\uDC27-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE41\uDE43\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEDC-\uDEDF\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB\uDFF0]|\uDC08(?:\u200D\u2B1B)?|\uDC15(?:\u200D\uD83E\uDDBA)?|\uDC26(?:\u200D(?:\u2B1B|\uD83D\uDD25))?|\uDC3B(?:\u200D\u2744\uFE0F?)?|\uDC41\uFE0F?(?:\u200D\uD83D\uDDE8\uFE0F?)?|\uDC68(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE])))?))?|\uDC69(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?[\uDC68\uDC69]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFE])))?))?|\uDC6F(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDD75(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDE2E(?:\u200D\uD83D\uDCA8)?|\uDE35(?:\u200D\uD83D\uDCAB)?|\uDE36(?:\u200D\uD83C\uDF2B\uFE0F?)?|\uDE42(?:\u200D[\u2194\u2195]\uFE0F?)?|\uDEB6(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?)|\uD83E(?:[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF8](?:\uD83C[\uDFFB-\uDFFF])?|[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD\uDDCF\uDDD4\uDDD6-\uDDDD](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDDDE\uDDDF](?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD0D\uDD0E\uDD10-\uDD17\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCC\uDDD0\uDDE0-\uDDFF\uDE70-\uDE7C\uDE80-\uDE88\uDE90-\uDEBD\uDEBF-\uDEC2\uDECE-\uDEDB\uDEE0-\uDEE8]|\uDD3C(?:\u200D[\u2640\u2642]\uFE0F?|\uD83C[\uDFFB-\uDFFF])?|\uDDCE(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDDD1(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1|\uDDD1\u200D\uD83E\uDDD2(?:\u200D\uD83E\uDDD2)?|\uDDD2(?:\u200D\uD83E\uDDD2)?))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?))?|\uDEF1(?:\uD83C(?:\uDFFB(?:\u200D\uD83E\uDEF2\uD83C[\uDFFC-\uDFFF])?|\uDFFC(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFD-\uDFFF])?|\uDFFD(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])?|\uDFFE(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFD\uDFFF])?|\uDFFF(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFE])?))?)/g;
     };
     
     function stringWidth(string, options) {
    diff --git a/tools/lint-md/package-lock.json b/tools/lint-md/package-lock.json
    index 6c1310c681d71e..f744c25112f1fe 100644
    --- a/tools/lint-md/package-lock.json
    +++ b/tools/lint-md/package-lock.json
    @@ -12,13 +12,13 @@
             "remark-preset-lint-node": "^5.0.0",
             "remark-stringify": "^11.0.0",
             "to-vfile": "^8.0.0",
    -        "unified": "^11.0.3",
    +        "unified": "^11.0.4",
             "vfile-reporter": "^8.1.0"
           },
           "devDependencies": {
    -        "@rollup/plugin-commonjs": "^25.0.5",
    -        "@rollup/plugin-node-resolve": "^15.2.2",
    -        "rollup": "^4.0.2",
    +        "@rollup/plugin-commonjs": "^25.0.7",
    +        "@rollup/plugin-node-resolve": "^15.2.3",
    +        "rollup": "^4.9.2",
             "rollup-plugin-cleanup": "^3.2.1"
           }
         },
    @@ -29,9 +29,9 @@
           "dev": true
         },
         "node_modules/@rollup/plugin-commonjs": {
    -      "version": "25.0.5",
    -      "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.5.tgz",
    -      "integrity": "sha512-xY8r/A9oisSeSuLCTfhssyDjo9Vp/eDiRLXkg1MXCcEEgEjPmLU+ZyDB20OOD0NlyDa/8SGbK5uIggF5XTx77w==",
    +      "version": "25.0.7",
    +      "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz",
    +      "integrity": "sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==",
           "dev": true,
           "dependencies": {
             "@rollup/pluginutils": "^5.0.1",
    @@ -39,7 +39,7 @@
             "estree-walker": "^2.0.2",
             "glob": "^8.0.3",
             "is-reference": "1.2.1",
    -        "magic-string": "^0.27.0"
    +        "magic-string": "^0.30.3"
           },
           "engines": {
             "node": ">=14.0.0"
    @@ -54,9 +54,9 @@
           }
         },
         "node_modules/@rollup/plugin-node-resolve": {
    -      "version": "15.2.2",
    -      "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.2.tgz",
    -      "integrity": "sha512-f64bU4OKqV0yihtxFemmuf0oj37pToCFMISCA+sJbbIAl5wcpbRO9XgWNWb1tDiWQJUcPxo6V0l59hcuZOQ3kw==",
    +      "version": "15.2.3",
    +      "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz",
    +      "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==",
           "dev": true,
           "dependencies": {
             "@rollup/pluginutils": "^5.0.1",
    @@ -79,9 +79,9 @@
           }
         },
         "node_modules/@rollup/pluginutils": {
    -      "version": "5.0.5",
    -      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.5.tgz",
    -      "integrity": "sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==",
    +      "version": "5.1.0",
    +      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz",
    +      "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==",
           "dev": true,
           "dependencies": {
             "@types/estree": "^1.0.0",
    @@ -101,9 +101,9 @@
           }
         },
         "node_modules/@rollup/rollup-android-arm-eabi": {
    -      "version": "4.0.2",
    -      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.0.2.tgz",
    -      "integrity": "sha512-xDvk1pT4vaPU2BOLy0MqHMdYZyntqpaBf8RhBiezlqG9OjY8F50TyctHo8znigYKd+QCFhCmlmXHOL/LoaOl3w==",
    +      "version": "4.9.2",
    +      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.2.tgz",
    +      "integrity": "sha512-RKzxFxBHq9ysZ83fn8Iduv3A283K7zPPYuhL/z9CQuyFrjwpErJx0h4aeb/bnJ+q29GRLgJpY66ceQ/Wcsn3wA==",
           "cpu": [
             "arm"
           ],
    @@ -114,9 +114,9 @@
           ]
         },
         "node_modules/@rollup/rollup-android-arm64": {
    -      "version": "4.0.2",
    -      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.0.2.tgz",
    -      "integrity": "sha512-lqCglytY3E6raze27DD9VQJWohbwCxzqs9aSHcj5X/8hJpzZfNdbsr4Ja9Hqp6iPyF53+5PtPx0pKRlkSvlHZg==",
    +      "version": "4.9.2",
    +      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.2.tgz",
    +      "integrity": "sha512-yZ+MUbnwf3SHNWQKJyWh88ii2HbuHCFQnAYTeeO1Nb8SyEiWASEi5dQUygt3ClHWtA9My9RQAYkjvrsZ0WK8Xg==",
           "cpu": [
             "arm64"
           ],
    @@ -127,9 +127,9 @@
           ]
         },
         "node_modules/@rollup/rollup-darwin-arm64": {
    -      "version": "4.0.2",
    -      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.0.2.tgz",
    -      "integrity": "sha512-nkBKItS6E6CCzvRwgiKad+j+1ibmL7SIInj7oqMWmdkCjiSX6VeVZw2mLlRKIUL+JjsBgpATTfo7BiAXc1v0jA==",
    +      "version": "4.9.2",
    +      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.2.tgz",
    +      "integrity": "sha512-vqJ/pAUh95FLc/G/3+xPqlSBgilPnauVf2EXOQCZzhZJCXDXt/5A8mH/OzU6iWhb3CNk5hPJrh8pqJUPldN5zw==",
           "cpu": [
             "arm64"
           ],
    @@ -140,9 +140,9 @@
           ]
         },
         "node_modules/@rollup/rollup-darwin-x64": {
    -      "version": "4.0.2",
    -      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.0.2.tgz",
    -      "integrity": "sha512-vX2C8xvWPIbpEgQht95+dY6BReKAvtDgPDGi0XN0kWJKkm4WdNmq5dnwscv/zxvi+n6jUTBhs6GtpkkWT4q8Gg==",
    +      "version": "4.9.2",
    +      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.2.tgz",
    +      "integrity": "sha512-otPHsN5LlvedOprd3SdfrRNhOahhVBwJpepVKUN58L0RnC29vOAej1vMEaVU6DadnpjivVsNTM5eNt0CcwTahw==",
           "cpu": [
             "x64"
           ],
    @@ -153,9 +153,9 @@
           ]
         },
         "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
    -      "version": "4.0.2",
    -      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.0.2.tgz",
    -      "integrity": "sha512-DVFIfcHOjgmeHOAqji4xNz2wczt1Bmzy9MwBZKBa83SjBVO/i38VHDR+9ixo8QpBOiEagmNw12DucG+v55tCrg==",
    +      "version": "4.9.2",
    +      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.2.tgz",
    +      "integrity": "sha512-ewG5yJSp+zYKBYQLbd1CUA7b1lSfIdo9zJShNTyc2ZP1rcPrqyZcNlsHgs7v1zhgfdS+kW0p5frc0aVqhZCiYQ==",
           "cpu": [
             "arm"
           ],
    @@ -166,9 +166,9 @@
           ]
         },
         "node_modules/@rollup/rollup-linux-arm64-gnu": {
    -      "version": "4.0.2",
    -      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.0.2.tgz",
    -      "integrity": "sha512-GCK/a9ItUxPI0V5hQEJjH4JtOJO90GF2Hja7TO+EZ8rmkGvEi8/ZDMhXmcuDpQT7/PWrTT9RvnG8snMd5SrhBQ==",
    +      "version": "4.9.2",
    +      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.2.tgz",
    +      "integrity": "sha512-pL6QtV26W52aCWTG1IuFV3FMPL1m4wbsRG+qijIvgFO/VBsiXJjDPE/uiMdHBAO6YcpV4KvpKtd0v3WFbaxBtg==",
           "cpu": [
             "arm64"
           ],
    @@ -179,9 +179,9 @@
           ]
         },
         "node_modules/@rollup/rollup-linux-arm64-musl": {
    -      "version": "4.0.2",
    -      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.0.2.tgz",
    -      "integrity": "sha512-cLuBp7rOjIB1R2j/VazjCmHC7liWUur2e9mFflLJBAWCkrZ+X0+QwHLvOQakIwDymungzAKv6W9kHZnTp/Mqrg==",
    +      "version": "4.9.2",
    +      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.2.tgz",
    +      "integrity": "sha512-On+cc5EpOaTwPSNetHXBuqylDW+765G/oqB9xGmWU3npEhCh8xu0xqHGUA+4xwZLqBbIZNcBlKSIYfkBm6ko7g==",
           "cpu": [
             "arm64"
           ],
    @@ -191,10 +191,23 @@
             "linux"
           ]
         },
    +    "node_modules/@rollup/rollup-linux-riscv64-gnu": {
    +      "version": "4.9.2",
    +      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.2.tgz",
    +      "integrity": "sha512-Wnx/IVMSZ31D/cO9HSsU46FjrPWHqtdF8+0eyZ1zIB5a6hXaZXghUKpRrC4D5DcRTZOjml2oBhXoqfGYyXKipw==",
    +      "cpu": [
    +        "riscv64"
    +      ],
    +      "dev": true,
    +      "optional": true,
    +      "os": [
    +        "linux"
    +      ]
    +    },
         "node_modules/@rollup/rollup-linux-x64-gnu": {
    -      "version": "4.0.2",
    -      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.0.2.tgz",
    -      "integrity": "sha512-Zqw4iVnJr2naoyQus0yLy7sLtisCQcpdMKUCeXPBjkJtpiflRime/TMojbnl8O3oxUAj92mxr+t7im/RbgA20w==",
    +      "version": "4.9.2",
    +      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.2.tgz",
    +      "integrity": "sha512-ym5x1cj4mUAMBummxxRkI4pG5Vht1QMsJexwGP8547TZ0sox9fCLDHw9KCH9c1FO5d9GopvkaJsBIOkTKxksdw==",
           "cpu": [
             "x64"
           ],
    @@ -205,9 +218,9 @@
           ]
         },
         "node_modules/@rollup/rollup-linux-x64-musl": {
    -      "version": "4.0.2",
    -      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.0.2.tgz",
    -      "integrity": "sha512-jJRU9TyUD/iMqjf8aLAp7XiN3pIj5v6Qcu+cdzBfVTKDD0Fvua4oUoK8eVJ9ZuKBEQKt3WdlcwJXFkpmMLk6kg==",
    +      "version": "4.9.2",
    +      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.2.tgz",
    +      "integrity": "sha512-m0hYELHGXdYx64D6IDDg/1vOJEaiV8f1G/iO+tejvRCJNSwK4jJ15e38JQy5Q6dGkn1M/9KcyEOwqmlZ2kqaZg==",
           "cpu": [
             "x64"
           ],
    @@ -218,9 +231,9 @@
           ]
         },
         "node_modules/@rollup/rollup-win32-arm64-msvc": {
    -      "version": "4.0.2",
    -      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.0.2.tgz",
    -      "integrity": "sha512-ZkS2NixCxHKC4zbOnw64ztEGGDVIYP6nKkGBfOAxEPW71Sji9v8z3yaHNuae/JHPwXA+14oDefnOuVfxl59SmQ==",
    +      "version": "4.9.2",
    +      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.2.tgz",
    +      "integrity": "sha512-x1CWburlbN5JjG+juenuNa4KdedBdXLjZMp56nHFSHTOsb/MI2DYiGzLtRGHNMyydPGffGId+VgjOMrcltOksA==",
           "cpu": [
             "arm64"
           ],
    @@ -231,9 +244,9 @@
           ]
         },
         "node_modules/@rollup/rollup-win32-ia32-msvc": {
    -      "version": "4.0.2",
    -      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.0.2.tgz",
    -      "integrity": "sha512-3SKjj+tvnZ0oZq2BKB+fI+DqYI83VrRzk7eed8tJkxeZ4zxJZcLSE8YDQLYGq1tZAnAX+H076RHHB4gTZXsQzw==",
    +      "version": "4.9.2",
    +      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.2.tgz",
    +      "integrity": "sha512-VVzCB5yXR1QlfsH1Xw1zdzQ4Pxuzv+CPr5qpElpKhVxlxD3CRdfubAG9mJROl6/dmj5gVYDDWk8sC+j9BI9/kQ==",
           "cpu": [
             "ia32"
           ],
    @@ -244,9 +257,9 @@
           ]
         },
         "node_modules/@rollup/rollup-win32-x64-msvc": {
    -      "version": "4.0.2",
    -      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.0.2.tgz",
    -      "integrity": "sha512-MBdJIOxRauKkry7t2q+rTHa3aWjVez2eioWg+etRVS3dE4tChhmt5oqZYr48R6bPmcwEhxQr96gVRfeQrLbqng==",
    +      "version": "4.9.2",
    +      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.2.tgz",
    +      "integrity": "sha512-SYRedJi+mweatroB+6TTnJYLts0L0bosg531xnQWtklOI6dezEagx4Q0qDyvRdK+qgdA3YZpjjGuPFtxBmddBA==",
           "cpu": [
             "x64"
           ],
    @@ -257,51 +270,51 @@
           ]
         },
         "node_modules/@types/debug": {
    -      "version": "4.1.9",
    -      "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.9.tgz",
    -      "integrity": "sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow==",
    +      "version": "4.1.12",
    +      "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
    +      "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
           "dependencies": {
             "@types/ms": "*"
           }
         },
         "node_modules/@types/estree": {
    -      "version": "1.0.2",
    -      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.2.tgz",
    -      "integrity": "sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA=="
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
    +      "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="
         },
         "node_modules/@types/estree-jsx": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.1.tgz",
    -      "integrity": "sha512-sHyakZlAezNFxmYRo0fopDZW+XvK6ipeZkkp5EAOLjdPfZp8VjZBJ67vSRI99RSCAoqXVmXOHS4fnWoxpuGQtQ==",
    +      "version": "1.0.3",
    +      "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.3.tgz",
    +      "integrity": "sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==",
           "dependencies": {
             "@types/estree": "*"
           }
         },
         "node_modules/@types/hast": {
    -      "version": "2.3.6",
    -      "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.6.tgz",
    -      "integrity": "sha512-47rJE80oqPmFdVDCD7IheXBrVdwuBgsYwoczFvKmwfo2Mzsnt+V9OONsYauFmICb6lQPpCuXYJWejBNs4pDJRg==",
    +      "version": "2.3.9",
    +      "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.9.tgz",
    +      "integrity": "sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/@types/hast/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/@types/mdast": {
    -      "version": "4.0.1",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.1.tgz",
    -      "integrity": "sha512-IlKct1rUTJ1T81d8OHzyop15kGv9A/ff7Gz7IJgrk6jDb4Udw77pCJ+vq8oxZf4Ghpm+616+i1s/LNg/Vh7d+g==",
    +      "version": "4.0.3",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
    +      "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
           "dependencies": {
             "@types/unist": "*"
           }
         },
         "node_modules/@types/ms": {
    -      "version": "0.7.32",
    -      "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.32.tgz",
    -      "integrity": "sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g=="
    +      "version": "0.7.34",
    +      "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz",
    +      "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g=="
         },
         "node_modules/@types/resolve": {
           "version": "1.20.2",
    @@ -310,14 +323,14 @@
           "dev": true
         },
         "node_modules/@types/supports-color": {
    -      "version": "8.1.1",
    -      "resolved": "https://registry.npmjs.org/@types/supports-color/-/supports-color-8.1.1.tgz",
    -      "integrity": "sha512-dPWnWsf+kzIG140B8z2w3fr5D03TLWbOAFQl45xUpI3vcizeXriNR5VYkWZ+WTMsUHqZ9Xlt3hrxGNANFyNQfw=="
    +      "version": "8.1.3",
    +      "resolved": "https://registry.npmjs.org/@types/supports-color/-/supports-color-8.1.3.tgz",
    +      "integrity": "sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg=="
         },
         "node_modules/@types/unist": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.0.tgz",
    -      "integrity": "sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w=="
    +      "version": "3.0.2",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
    +      "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
         },
         "node_modules/ansi-regex": {
           "version": "6.0.1",
    @@ -471,9 +484,9 @@
           "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
         },
         "node_modules/emoji-regex": {
    -      "version": "10.2.1",
    -      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.2.1.tgz",
    -      "integrity": "sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA=="
    +      "version": "10.3.0",
    +      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz",
    +      "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw=="
         },
         "node_modules/escape-string-regexp": {
           "version": "5.0.0",
    @@ -517,6 +530,15 @@
             "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
           }
         },
    +    "node_modules/function-bind": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
    +      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
    +      "dev": true,
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
         "node_modules/glob": {
           "version": "8.1.0",
           "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
    @@ -536,13 +558,16 @@
             "url": "https://github.com/sponsors/isaacs"
           }
         },
    -    "node_modules/has": {
    -      "version": "1.0.4",
    -      "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz",
    -      "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==",
    +    "node_modules/hasown": {
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
    +      "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
           "dev": true,
    +      "dependencies": {
    +        "function-bind": "^1.1.2"
    +      },
           "engines": {
    -        "node": ">= 0.4.0"
    +        "node": ">= 0.4"
           }
         },
         "node_modules/inflight": {
    @@ -599,12 +624,12 @@
           }
         },
         "node_modules/is-core-module": {
    -      "version": "2.13.0",
    -      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz",
    -      "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==",
    +      "version": "2.13.1",
    +      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
    +      "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
           "dev": true,
           "dependencies": {
    -        "has": "^1.0.3"
    +        "hasown": "^2.0.0"
           },
           "funding": {
             "url": "https://github.com/sponsors/ljharb"
    @@ -699,12 +724,12 @@
           }
         },
         "node_modules/magic-string": {
    -      "version": "0.27.0",
    -      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
    -      "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
    +      "version": "0.30.5",
    +      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
    +      "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
           "dev": true,
           "dependencies": {
    -        "@jridgewell/sourcemap-codec": "^1.4.13"
    +        "@jridgewell/sourcemap-codec": "^1.4.15"
           },
           "engines": {
             "node": ">=12"
    @@ -733,17 +758,17 @@
           }
         },
         "node_modules/mdast-comment-marker/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/mdast-comment-marker/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/mdast-util-find-and-replace": {
           "version": "3.0.1",
    @@ -891,17 +916,17 @@
           }
         },
         "node_modules/mdast-util-heading-style/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/mdast-util-heading-style/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/mdast-util-mdx-expression": {
           "version": "1.3.2",
    @@ -920,17 +945,17 @@
           }
         },
         "node_modules/mdast-util-mdx-expression/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/mdast-util-mdx-expression/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/mdast-util-mdx-expression/node_modules/mdast-util-from-markdown": {
           "version": "1.3.1",
    @@ -1875,9 +1900,9 @@
           }
         },
         "node_modules/micromark-util-decode-numeric-character-reference": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.0.tgz",
    -      "integrity": "sha512-pIgcsGxpHEtTG/rPJRz/HOLSqp5VTuIIjXlPI+6JSDlK2oljApusG6KzpS8AF0ENUMCHlC/IBb5B9xdFiVlm5Q==",
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz",
    +      "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==",
           "funding": [
             {
               "type": "GitHub Sponsors",
    @@ -2169,17 +2194,17 @@
           }
         },
         "node_modules/remark-lint-blockquote-indentation/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-blockquote-indentation/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-blockquote-indentation/node_modules/unified": {
           "version": "10.1.2",
    @@ -2255,17 +2280,17 @@
           }
         },
         "node_modules/remark-lint-checkbox-character-style/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-checkbox-character-style/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-checkbox-character-style/node_modules/unified": {
           "version": "10.1.2",
    @@ -2342,17 +2367,17 @@
           }
         },
         "node_modules/remark-lint-checkbox-content-indent/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-checkbox-content-indent/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-checkbox-content-indent/node_modules/unified": {
           "version": "10.1.2",
    @@ -2429,17 +2454,17 @@
           }
         },
         "node_modules/remark-lint-code-block-style/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-code-block-style/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-code-block-style/node_modules/unified": {
           "version": "10.1.2",
    @@ -2515,17 +2540,17 @@
           }
         },
         "node_modules/remark-lint-definition-spacing/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-definition-spacing/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-definition-spacing/node_modules/unified": {
           "version": "10.1.2",
    @@ -2602,17 +2627,17 @@
           }
         },
         "node_modules/remark-lint-fenced-code-flag/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-fenced-code-flag/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-fenced-code-flag/node_modules/unified": {
           "version": "10.1.2",
    @@ -2688,17 +2713,17 @@
           }
         },
         "node_modules/remark-lint-fenced-code-marker/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-fenced-code-marker/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-fenced-code-marker/node_modules/unified": {
           "version": "10.1.2",
    @@ -2772,17 +2797,17 @@
           }
         },
         "node_modules/remark-lint-file-extension/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-file-extension/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-file-extension/node_modules/unified": {
           "version": "10.1.2",
    @@ -2820,17 +2845,17 @@
           }
         },
         "node_modules/remark-lint-final-definition/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-final-definition/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-final-definition/node_modules/unified": {
           "version": "10.1.2",
    @@ -2904,17 +2929,17 @@
           }
         },
         "node_modules/remark-lint-final-newline/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-final-newline/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-final-newline/node_modules/unified": {
           "version": "10.1.2",
    @@ -2951,17 +2976,17 @@
           }
         },
         "node_modules/remark-lint-first-heading-level/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-first-heading-level/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-first-heading-level/node_modules/unified": {
           "version": "10.1.2",
    @@ -3038,17 +3063,17 @@
           }
         },
         "node_modules/remark-lint-hard-break-spaces/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-hard-break-spaces/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-hard-break-spaces/node_modules/unified": {
           "version": "10.1.2",
    @@ -3125,17 +3150,17 @@
           }
         },
         "node_modules/remark-lint-heading-style/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-heading-style/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-heading-style/node_modules/unified": {
           "version": "10.1.2",
    @@ -3211,17 +3236,17 @@
           }
         },
         "node_modules/remark-lint-list-item-bullet-indent/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-list-item-bullet-indent/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-list-item-bullet-indent/node_modules/unified": {
           "version": "10.1.2",
    @@ -3299,17 +3324,17 @@
           }
         },
         "node_modules/remark-lint-list-item-indent/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-list-item-indent/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-list-item-indent/node_modules/unified": {
           "version": "10.1.2",
    @@ -3386,17 +3411,17 @@
           }
         },
         "node_modules/remark-lint-maximum-line-length/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-maximum-line-length/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-maximum-line-length/node_modules/unified": {
           "version": "10.1.2",
    @@ -3474,17 +3499,17 @@
           }
         },
         "node_modules/remark-lint-no-blockquote-without-marker/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-no-blockquote-without-marker/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-no-blockquote-without-marker/node_modules/unified": {
           "version": "10.1.2",
    @@ -3563,17 +3588,17 @@
           }
         },
         "node_modules/remark-lint-no-consecutive-blank-lines/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-no-consecutive-blank-lines/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-no-consecutive-blank-lines/node_modules/unified": {
           "version": "10.1.2",
    @@ -3651,17 +3676,17 @@
           }
         },
         "node_modules/remark-lint-no-duplicate-definitions/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-no-duplicate-definitions/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-no-duplicate-definitions/node_modules/unified": {
           "version": "10.1.2",
    @@ -3747,17 +3772,17 @@
           }
         },
         "node_modules/remark-lint-no-file-name-articles/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-no-file-name-articles/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-no-file-name-articles/node_modules/unified": {
           "version": "10.1.2",
    @@ -3792,17 +3817,17 @@
           }
         },
         "node_modules/remark-lint-no-file-name-consecutive-dashes/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-no-file-name-consecutive-dashes/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-no-file-name-consecutive-dashes/node_modules/unified": {
           "version": "10.1.2",
    @@ -3837,17 +3862,17 @@
           }
         },
         "node_modules/remark-lint-no-file-name-outer-dashes/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-no-file-name-outer-dashes/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-no-file-name-outer-dashes/node_modules/unified": {
           "version": "10.1.2",
    @@ -3887,17 +3912,17 @@
           }
         },
         "node_modules/remark-lint-no-heading-content-indent/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-no-heading-content-indent/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-no-heading-content-indent/node_modules/unified": {
           "version": "10.1.2",
    @@ -3975,17 +4000,17 @@
           }
         },
         "node_modules/remark-lint-no-heading-indent/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-no-heading-indent/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-no-heading-indent/node_modules/unified": {
           "version": "10.1.2",
    @@ -4062,17 +4087,17 @@
           }
         },
         "node_modules/remark-lint-no-inline-padding/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-no-inline-padding/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-no-inline-padding/node_modules/mdast-util-to-string": {
           "version": "3.2.0",
    @@ -4162,17 +4187,17 @@
           }
         },
         "node_modules/remark-lint-no-literal-urls/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-no-literal-urls/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-no-literal-urls/node_modules/mdast-util-to-string": {
           "version": "3.2.0",
    @@ -4262,17 +4287,17 @@
           }
         },
         "node_modules/remark-lint-no-multiple-toplevel-headings/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-no-multiple-toplevel-headings/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-no-multiple-toplevel-headings/node_modules/unified": {
           "version": "10.1.2",
    @@ -4360,17 +4385,17 @@
           }
         },
         "node_modules/remark-lint-no-shell-dollars/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-no-shell-dollars/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-no-shell-dollars/node_modules/unified": {
           "version": "10.1.2",
    @@ -4446,17 +4471,17 @@
           }
         },
         "node_modules/remark-lint-no-shortcut-reference-image/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-no-shortcut-reference-image/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-no-shortcut-reference-image/node_modules/unified": {
           "version": "10.1.2",
    @@ -4532,17 +4557,17 @@
           }
         },
         "node_modules/remark-lint-no-shortcut-reference-link/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-no-shortcut-reference-link/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-no-shortcut-reference-link/node_modules/unified": {
           "version": "10.1.2",
    @@ -4619,17 +4644,17 @@
           }
         },
         "node_modules/remark-lint-no-table-indentation/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-no-table-indentation/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-no-table-indentation/node_modules/unified": {
           "version": "10.1.2",
    @@ -4704,17 +4729,17 @@
           }
         },
         "node_modules/remark-lint-no-tabs/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-no-tabs/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-no-tabs/node_modules/unified": {
           "version": "10.1.2",
    @@ -4774,17 +4799,17 @@
           }
         },
         "node_modules/remark-lint-no-undefined-references/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-no-undefined-references/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-no-undefined-references/node_modules/micromark-util-normalize-identifier": {
           "version": "1.1.0",
    @@ -4893,17 +4918,17 @@
           }
         },
         "node_modules/remark-lint-no-unused-definitions/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-no-unused-definitions/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-no-unused-definitions/node_modules/unified": {
           "version": "10.1.2",
    @@ -4980,17 +5005,17 @@
           }
         },
         "node_modules/remark-lint-ordered-list-marker-style/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-ordered-list-marker-style/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-ordered-list-marker-style/node_modules/unified": {
           "version": "10.1.2",
    @@ -5062,9 +5087,9 @@
           }
         },
         "node_modules/remark-lint-prohibited-strings/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-prohibited-strings/node_modules/unist-util-is": {
           "version": "5.2.1",
    @@ -5122,17 +5147,17 @@
           }
         },
         "node_modules/remark-lint-rule-style/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-rule-style/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-rule-style/node_modules/unified": {
           "version": "10.1.2",
    @@ -5208,17 +5233,17 @@
           }
         },
         "node_modules/remark-lint-strong-marker/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-strong-marker/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-strong-marker/node_modules/unified": {
           "version": "10.1.2",
    @@ -5295,17 +5320,17 @@
           }
         },
         "node_modules/remark-lint-table-cell-padding/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-table-cell-padding/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-table-cell-padding/node_modules/unified": {
           "version": "10.1.2",
    @@ -5381,17 +5406,17 @@
           }
         },
         "node_modules/remark-lint-table-pipes/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-table-pipes/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-table-pipes/node_modules/unified": {
           "version": "10.1.2",
    @@ -5468,17 +5493,17 @@
           }
         },
         "node_modules/remark-lint-unordered-list-marker-style/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint-unordered-list-marker-style/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint-unordered-list-marker-style/node_modules/unified": {
           "version": "10.1.2",
    @@ -5538,17 +5563,17 @@
           }
         },
         "node_modules/remark-lint/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-lint/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-lint/node_modules/unified": {
           "version": "10.1.2",
    @@ -5585,17 +5610,17 @@
           }
         },
         "node_modules/remark-message-control/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-message-control/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-message-control/node_modules/unified": {
           "version": "10.1.2",
    @@ -5704,17 +5729,17 @@
           }
         },
         "node_modules/remark-preset-lint-recommended/node_modules/@types/mdast": {
    -      "version": "3.0.13",
    -      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz",
    -      "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==",
    +      "version": "3.0.15",
    +      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
    +      "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
           "dependencies": {
             "@types/unist": "^2"
           }
         },
         "node_modules/remark-preset-lint-recommended/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/remark-preset-lint-recommended/node_modules/unified": {
           "version": "10.1.2",
    @@ -5749,9 +5774,9 @@
           }
         },
         "node_modules/resolve": {
    -      "version": "1.22.6",
    -      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz",
    -      "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==",
    +      "version": "1.22.8",
    +      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
    +      "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
           "dev": true,
           "dependencies": {
             "is-core-module": "^2.13.0",
    @@ -5766,9 +5791,9 @@
           }
         },
         "node_modules/rollup": {
    -      "version": "4.0.2",
    -      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.0.2.tgz",
    -      "integrity": "sha512-MCScu4usMPCeVFaiLcgMDaBQeYi1z6vpWxz0r0hq0Hv77Y2YuOTZldkuNJ54BdYBH3e+nkrk6j0Rre/NLDBYzg==",
    +      "version": "4.9.2",
    +      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.2.tgz",
    +      "integrity": "sha512-66RB8OtFKUTozmVEh3qyNfH+b+z2RXBVloqO2KCC/pjFaGaHtxP9fVfOQKPSGXg2mElmjmxjW/fZ7iKrEpMH5Q==",
           "dev": true,
           "bin": {
             "rollup": "dist/bin/rollup"
    @@ -5778,18 +5803,19 @@
             "npm": ">=8.0.0"
           },
           "optionalDependencies": {
    -        "@rollup/rollup-android-arm-eabi": "4.0.2",
    -        "@rollup/rollup-android-arm64": "4.0.2",
    -        "@rollup/rollup-darwin-arm64": "4.0.2",
    -        "@rollup/rollup-darwin-x64": "4.0.2",
    -        "@rollup/rollup-linux-arm-gnueabihf": "4.0.2",
    -        "@rollup/rollup-linux-arm64-gnu": "4.0.2",
    -        "@rollup/rollup-linux-arm64-musl": "4.0.2",
    -        "@rollup/rollup-linux-x64-gnu": "4.0.2",
    -        "@rollup/rollup-linux-x64-musl": "4.0.2",
    -        "@rollup/rollup-win32-arm64-msvc": "4.0.2",
    -        "@rollup/rollup-win32-ia32-msvc": "4.0.2",
    -        "@rollup/rollup-win32-x64-msvc": "4.0.2",
    +        "@rollup/rollup-android-arm-eabi": "4.9.2",
    +        "@rollup/rollup-android-arm64": "4.9.2",
    +        "@rollup/rollup-darwin-arm64": "4.9.2",
    +        "@rollup/rollup-darwin-x64": "4.9.2",
    +        "@rollup/rollup-linux-arm-gnueabihf": "4.9.2",
    +        "@rollup/rollup-linux-arm64-gnu": "4.9.2",
    +        "@rollup/rollup-linux-arm64-musl": "4.9.2",
    +        "@rollup/rollup-linux-riscv64-gnu": "4.9.2",
    +        "@rollup/rollup-linux-x64-gnu": "4.9.2",
    +        "@rollup/rollup-linux-x64-musl": "4.9.2",
    +        "@rollup/rollup-win32-arm64-msvc": "4.9.2",
    +        "@rollup/rollup-win32-ia32-msvc": "4.9.2",
    +        "@rollup/rollup-win32-x64-msvc": "4.9.2",
             "fsevents": "~2.3.2"
           }
         },
    @@ -5972,9 +5998,9 @@
           }
         },
         "node_modules/unified": {
    -      "version": "11.0.3",
    -      "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.3.tgz",
    -      "integrity": "sha512-jlCV402P+YDcFcB2VcN/n8JasOddqIiaxv118wNBoZXEhOn+lYG7BR4Bfg2BwxvlK58dwbuH2w7GX2esAjL6Mg==",
    +      "version": "11.0.4",
    +      "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz",
    +      "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==",
           "dependencies": {
             "@types/unist": "^3.0.0",
             "bail": "^2.0.0",
    @@ -6005,9 +6031,9 @@
           }
         },
         "node_modules/unified-lint-rule/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/unified-lint-rule/node_modules/unified": {
           "version": "10.1.2",
    @@ -6045,9 +6071,9 @@
           }
         },
         "node_modules/unified-message-control/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/unified-message-control/node_modules/unist-util-is": {
           "version": "5.2.1",
    @@ -6149,9 +6175,9 @@
           }
         },
         "node_modules/unist-util-position/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/unist-util-stringify-position": {
           "version": "4.0.0",
    @@ -6238,9 +6264,9 @@
           }
         },
         "node_modules/vfile-location/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/vfile-message": {
           "version": "3.1.4",
    @@ -6256,9 +6282,9 @@
           }
         },
         "node_modules/vfile-message/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/vfile-message/node_modules/unist-util-stringify-position": {
           "version": "3.0.3",
    @@ -6399,9 +6425,9 @@
           }
         },
         "node_modules/vfile/node_modules/@types/unist": {
    -      "version": "2.0.8",
    -      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz",
    -      "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw=="
    +      "version": "2.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
    +      "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
         },
         "node_modules/vfile/node_modules/unist-util-stringify-position": {
           "version": "3.0.3",
    diff --git a/tools/lint-md/package.json b/tools/lint-md/package.json
    index 0255adedd42373..7d0780aaf96d75 100644
    --- a/tools/lint-md/package.json
    +++ b/tools/lint-md/package.json
    @@ -10,13 +10,13 @@
         "remark-preset-lint-node": "^5.0.0",
         "remark-stringify": "^11.0.0",
         "to-vfile": "^8.0.0",
    -    "unified": "^11.0.3",
    +    "unified": "^11.0.4",
         "vfile-reporter": "^8.1.0"
       },
       "devDependencies": {
    -    "@rollup/plugin-commonjs": "^25.0.5",
    -    "@rollup/plugin-node-resolve": "^15.2.2",
    -    "rollup": "^4.0.2",
    +    "@rollup/plugin-commonjs": "^25.0.7",
    +    "@rollup/plugin-node-resolve": "^15.2.3",
    +    "rollup": "^4.9.2",
         "rollup-plugin-cleanup": "^3.2.1"
       }
     }
    diff --git a/tools/node_modules/eslint/bin/eslint.js b/tools/node_modules/eslint/bin/eslint.js
    index 5c7972cc086eb7..eeb4647e70b107 100755
    --- a/tools/node_modules/eslint/bin/eslint.js
    +++ b/tools/node_modules/eslint/bin/eslint.js
    @@ -97,9 +97,14 @@ function getErrorMessage(error) {
      * same message once.
      * @type {Set}
      */
    -
     const displayedErrors = new Set();
     
    +/**
    + * Tracks whether an unexpected error was caught
    + * @type {boolean}
    + */
    +let hadFatalError = false;
    +
     /**
      * Catch and report unexpected error.
      * @param {any} error The thrown error object.
    @@ -107,6 +112,7 @@ const displayedErrors = new Set();
      */
     function onFatalError(error) {
         process.exitCode = 2;
    +    hadFatalError = true;
     
         const { version } = require("../package.json");
         const message = `
    @@ -143,9 +149,25 @@ ${getErrorMessage(error)}`;
         }
     
         // Otherwise, call the CLI.
    -    process.exitCode = await require("../lib/cli").execute(
    +    const exitCode = await require("../lib/cli").execute(
             process.argv,
             process.argv.includes("--stdin") ? await readStdin() : null,
             true
         );
    +
    +    /*
    +     * If an uncaught exception or unhandled rejection was detected in the meantime,
    +     * keep the fatal exit code 2 that is already assigned to `process.exitCode`.
    +     * Without this condition, exit code 2 (unsuccessful execution) could be overwritten with
    +     * 1 (successful execution, lint problems found) or even 0 (successful execution, no lint problems found).
    +     * This ensures that unexpected errors that seemingly don't affect the success
    +     * of the execution will still cause a non-zero exit code, as it's a common
    +     * practice and the default behavior of Node.js to exit with non-zero
    +     * in case of an uncaught exception or unhandled rejection.
    +     *
    +     * Otherwise, assign the exit code returned from CLI.
    +     */
    +    if (!hadFatalError) {
    +        process.exitCode = exitCode;
    +    }
     }()).catch(onFatalError);
    diff --git a/tools/node_modules/eslint/conf/rule-type-list.json b/tools/node_modules/eslint/conf/rule-type-list.json
    index d5823acc898ec4..6ca730f34f0297 100644
    --- a/tools/node_modules/eslint/conf/rule-type-list.json
    +++ b/tools/node_modules/eslint/conf/rule-type-list.json
    @@ -1,36 +1,28 @@
     {
    -    "types": [
    -        { "name": "problem", "displayName": "Possible Problems", "description": "These rules relate to possible logic errors in code:" },
    -        { "name": "suggestion", "displayName": "Suggestions", "description": "These rules suggest alternate ways of doing things:" },
    -        { "name": "layout", "displayName": "Layout & Formatting", "description": "These rules care about how the code looks rather than how it executes:" }
    -    ],
    -    "deprecated": {
    -        "name": "Deprecated",
    -        "description": "These rules have been deprecated in accordance with the deprecation policy, and replaced by newer rules:",
    -        "rules": []
    +    "types": {
    +        "problem": [],
    +        "suggestion": [],
    +        "layout": []
         },
    -    "removed": {
    -        "name": "Removed",
    -        "description": "These rules from older versions of ESLint (before the deprecation policy existed) have been replaced by newer rules:",
    -        "rules": [
    -            { "removed": "generator-star", "replacedBy": ["generator-star-spacing"] },
    -            { "removed": "global-strict", "replacedBy": ["strict"] },
    -            { "removed": "no-arrow-condition", "replacedBy": ["no-confusing-arrow", "no-constant-condition"] },
    -            { "removed": "no-comma-dangle", "replacedBy": ["comma-dangle"] },
    -            { "removed": "no-empty-class", "replacedBy": ["no-empty-character-class"] },
    -            { "removed": "no-empty-label", "replacedBy": ["no-labels"] },
    -            { "removed": "no-extra-strict", "replacedBy": ["strict"] },
    -            { "removed": "no-reserved-keys", "replacedBy": ["quote-props"] },
    -            { "removed": "no-space-before-semi", "replacedBy": ["semi-spacing"] },
    -            { "removed": "no-wrap-func", "replacedBy": ["no-extra-parens"] },
    -            { "removed": "space-after-function-name", "replacedBy": ["space-before-function-paren"] },
    -            { "removed": "space-after-keywords", "replacedBy": ["keyword-spacing"] },
    -            { "removed": "space-before-function-parentheses", "replacedBy": ["space-before-function-paren"] },
    -            { "removed": "space-before-keywords", "replacedBy": ["keyword-spacing"] },
    -            { "removed": "space-in-brackets", "replacedBy": ["object-curly-spacing", "array-bracket-spacing"] },
    -            { "removed": "space-return-throw-case", "replacedBy": ["keyword-spacing"] },
    -            { "removed": "space-unary-word-ops", "replacedBy": ["space-unary-ops"] },
    -            { "removed": "spaced-line-comment", "replacedBy": ["spaced-comment"] }
    -        ]
    -    }
    +    "deprecated": [],
    +    "removed": [
    +        { "removed": "generator-star", "replacedBy": ["generator-star-spacing"] },
    +        { "removed": "global-strict", "replacedBy": ["strict"] },
    +        { "removed": "no-arrow-condition", "replacedBy": ["no-confusing-arrow", "no-constant-condition"] },
    +        { "removed": "no-comma-dangle", "replacedBy": ["comma-dangle"] },
    +        { "removed": "no-empty-class", "replacedBy": ["no-empty-character-class"] },
    +        { "removed": "no-empty-label", "replacedBy": ["no-labels"] },
    +        { "removed": "no-extra-strict", "replacedBy": ["strict"] },
    +        { "removed": "no-reserved-keys", "replacedBy": ["quote-props"] },
    +        { "removed": "no-space-before-semi", "replacedBy": ["semi-spacing"] },
    +        { "removed": "no-wrap-func", "replacedBy": ["no-extra-parens"] },
    +        { "removed": "space-after-function-name", "replacedBy": ["space-before-function-paren"] },
    +        { "removed": "space-after-keywords", "replacedBy": ["keyword-spacing"] },
    +        { "removed": "space-before-function-parentheses", "replacedBy": ["space-before-function-paren"] },
    +        { "removed": "space-before-keywords", "replacedBy": ["keyword-spacing"] },
    +        { "removed": "space-in-brackets", "replacedBy": ["object-curly-spacing", "array-bracket-spacing"] },
    +        { "removed": "space-return-throw-case", "replacedBy": ["keyword-spacing"] },
    +        { "removed": "space-unary-word-ops", "replacedBy": ["space-unary-ops"] },
    +        { "removed": "spaced-line-comment", "replacedBy": ["spaced-comment"] }
    +    ]
     }
    diff --git a/tools/node_modules/eslint/lib/cli-engine/cli-engine.js b/tools/node_modules/eslint/lib/cli-engine/cli-engine.js
    index 311dc61e81caac..49c8902c161ce1 100644
    --- a/tools/node_modules/eslint/lib/cli-engine/cli-engine.js
    +++ b/tools/node_modules/eslint/lib/cli-engine/cli-engine.js
    @@ -83,7 +83,7 @@ const validFixTypes = new Set(["directive", "problem", "suggestion", "layout"]);
      * @property {string[]} [plugins] An array of plugins to load.
      * @property {Record} [rules] An object of rules to use.
      * @property {string[]} [rulePaths] An array of directories to load custom rules from.
    - * @property {boolean} [reportUnusedDisableDirectives] `true` adds reports for unused eslint-disable directives
    + * @property {boolean|string} [reportUnusedDisableDirectives] `true`, `"error"` or '"warn"' adds reports for unused eslint-disable directives
      * @property {boolean} [globInputPaths] Set to false to skip glob resolution of input file paths to lint (default: true). If false, each input file paths is assumed to be a non-glob path to an existing file.
      * @property {string} [resolvePluginsRelativeTo] The folder where plugins should be resolved from, defaulting to the CWD
      */
    @@ -224,7 +224,7 @@ function calculateStatsPerRun(results) {
      * @param {ConfigArray} config.config The config.
      * @param {boolean} config.fix If `true` then it does fix.
      * @param {boolean} config.allowInlineConfig If `true` then it uses directive comments.
    - * @param {boolean} config.reportUnusedDisableDirectives If `true` then it reports unused `eslint-disable` comments.
    + * @param {boolean|string} config.reportUnusedDisableDirectives If `true`, `"error"` or '"warn"', then it reports unused `eslint-disable` comments.
      * @param {FileEnumerator} config.fileEnumerator The file enumerator to check if a path is a target or not.
      * @param {Linter} config.linter The linter instance to verify.
      * @returns {LintResult} The result of linting.
    diff --git a/tools/node_modules/eslint/lib/cli-engine/lint-result-cache.js b/tools/node_modules/eslint/lib/cli-engine/lint-result-cache.js
    index e36eb74badaad7..97d2ee40b39955 100644
    --- a/tools/node_modules/eslint/lib/cli-engine/lint-result-cache.js
    +++ b/tools/node_modules/eslint/lib/cli-engine/lint-result-cache.js
    @@ -128,16 +128,28 @@ class LintResultCache {
                 return null;
             }
     
    +        const cachedResults = fileDescriptor.meta.results;
    +
    +        // Just in case, not sure if this can ever happen.
    +        if (!cachedResults) {
    +            return cachedResults;
    +        }
    +
    +        /*
    +         * Shallow clone the object to ensure that any properties added or modified afterwards
    +         * will not be accidentally stored in the cache file when `reconcile()` is called.
    +         * https://github.com/eslint/eslint/issues/13507
    +         * All intentional changes to the cache file must be done through `setCachedLintResults()`.
    +         */
    +        const results = { ...cachedResults };
    +
             // If source is present but null, need to reread the file from the filesystem.
    -        if (
    -            fileDescriptor.meta.results &&
    -            fileDescriptor.meta.results.source === null
    -        ) {
    +        if (results.source === null) {
                 debug(`Rereading cached result source from filesystem: ${filePath}`);
    -            fileDescriptor.meta.results.source = fs.readFileSync(filePath, "utf-8");
    +            results.source = fs.readFileSync(filePath, "utf-8");
             }
     
    -        return fileDescriptor.meta.results;
    +        return results;
         }
     
         /**
    diff --git a/tools/node_modules/eslint/lib/cli.js b/tools/node_modules/eslint/lib/cli.js
    index 807d28a0d1bc59..1d909ec1cf2009 100644
    --- a/tools/node_modules/eslint/lib/cli.js
    +++ b/tools/node_modules/eslint/lib/cli.js
    @@ -22,7 +22,8 @@ const fs = require("fs"),
         { FlatESLint, shouldUseFlatConfig } = require("./eslint/flat-eslint"),
         createCLIOptions = require("./options"),
         log = require("./shared/logging"),
    -    RuntimeInfo = require("./shared/runtime-info");
    +    RuntimeInfo = require("./shared/runtime-info"),
    +    { normalizeSeverityToString } = require("./shared/severity");
     const { Legacy: { naming } } = require("@eslint/eslintrc");
     const { ModuleImporter } = require("@humanwhocodes/module-importer");
     
    @@ -89,6 +90,7 @@ async function translateOptions({
         plugin,
         quiet,
         reportUnusedDisableDirectives,
    +    reportUnusedDisableDirectivesSeverity,
         resolvePluginsRelativeTo,
         rule,
         rulesdir,
    @@ -125,6 +127,14 @@ async function translateOptions({
                 rules: rule ? rule : {}
             }];
     
    +        if (reportUnusedDisableDirectives || reportUnusedDisableDirectivesSeverity !== void 0) {
    +            overrideConfig[0].linterOptions = {
    +                reportUnusedDisableDirectives: reportUnusedDisableDirectives
    +                    ? "error"
    +                    : normalizeSeverityToString(reportUnusedDisableDirectivesSeverity)
    +            };
    +        }
    +
             if (parser) {
                 overrideConfig[0].languageOptions.parser = await importer.import(parser);
             }
    @@ -177,8 +187,7 @@ async function translateOptions({
             fixTypes: fixType,
             ignore,
             overrideConfig,
    -        overrideConfigFile,
    -        reportUnusedDisableDirectives: reportUnusedDisableDirectives ? "error" : void 0
    +        overrideConfigFile
         };
     
         if (configType === "flat") {
    @@ -190,6 +199,11 @@ async function translateOptions({
             options.useEslintrc = eslintrc;
             options.extensions = ext;
             options.ignorePath = ignorePath;
    +        if (reportUnusedDisableDirectives || reportUnusedDisableDirectivesSeverity !== void 0) {
    +            options.reportUnusedDisableDirectives = reportUnusedDisableDirectives
    +                ? "error"
    +                : normalizeSeverityToString(reportUnusedDisableDirectivesSeverity);
    +        }
         }
     
         return options;
    @@ -318,7 +332,14 @@ const cli = {
                 options = CLIOptions.parse(args);
             } catch (error) {
                 debug("Error parsing CLI options:", error.message);
    -            log.error(error.message);
    +
    +            let errorMessage = error.message;
    +
    +            if (usingFlatConfig) {
    +                errorMessage += "\nYou're using eslint.config.js, some command line flags are no longer available. Please see https://eslint.org/docs/latest/use/command-line-interface for details.";
    +            }
    +
    +            log.error(errorMessage);
                 return 2;
             }
     
    @@ -379,6 +400,11 @@ const cli = {
                 return 2;
             }
     
    +        if (options.reportUnusedDisableDirectives && options.reportUnusedDisableDirectivesSeverity !== void 0) {
    +            log.error("The --report-unused-disable-directives option and the --report-unused-disable-directives-severity option cannot be used together.");
    +            return 2;
    +        }
    +
             const ActiveESLint = usingFlatConfig ? FlatESLint : ESLint;
     
             const engine = new ActiveESLint(await translateOptions(options, usingFlatConfig ? "flat" : "eslintrc"));
    diff --git a/tools/node_modules/eslint/lib/config/flat-config-schema.js b/tools/node_modules/eslint/lib/config/flat-config-schema.js
    index df850995d87ff0..3b6612b4984079 100644
    --- a/tools/node_modules/eslint/lib/config/flat-config-schema.js
    +++ b/tools/node_modules/eslint/lib/config/flat-config-schema.js
    @@ -5,6 +5,17 @@
     
     "use strict";
     
    +//-----------------------------------------------------------------------------
    +// Requirements
    +//-----------------------------------------------------------------------------
    +
    +/*
    + * Note: This can be removed in ESLint v9 because structuredClone is available globally
    + * starting in Node.js v17.
    + */
    +const structuredClone = require("@ungap/structured-clone").default;
    +const { normalizeSeverityToNumber } = require("../shared/severity");
    +
     //-----------------------------------------------------------------------------
     // Type Definitions
     //-----------------------------------------------------------------------------
    @@ -119,7 +130,7 @@ function normalizeRuleOptions(ruleOptions) {
             : [ruleOptions];
     
         finalOptions[0] = ruleSeverities.get(finalOptions[0]);
    -    return finalOptions;
    +    return structuredClone(finalOptions);
     }
     
     //-----------------------------------------------------------------------------
    @@ -252,6 +263,26 @@ const booleanSchema = {
         validate: "boolean"
     };
     
    +const ALLOWED_SEVERITIES = new Set(["error", "warn", "off", 2, 1, 0]);
    +
    +/** @type {ObjectPropertySchema} */
    +const disableDirectiveSeveritySchema = {
    +    merge(first, second) {
    +        const value = second === void 0 ? first : second;
    +
    +        if (typeof value === "boolean") {
    +            return value ? "warn" : "off";
    +        }
    +
    +        return normalizeSeverityToNumber(value);
    +    },
    +    validate(value) {
    +        if (!(ALLOWED_SEVERITIES.has(value) || typeof value === "boolean")) {
    +            throw new TypeError("Expected one of: \"error\", \"warn\", \"off\", 0, 1, 2, or a boolean.");
    +        }
    +    }
    +};
    +
     /** @type {ObjectPropertySchema} */
     const deepObjectAssignSchema = {
         merge(first = {}, second = {}) {
    @@ -378,48 +409,57 @@ const rulesSchema = {
                 ...second
             };
     
    -        for (const ruleId of Object.keys(result)) {
    -
    -            // avoid hairy edge case
    -            if (ruleId === "__proto__") {
    -
    -                /* eslint-disable-next-line no-proto -- Though deprecated, may still be present */
    -                delete result.__proto__;
    -                continue;
    -            }
    -
    -            result[ruleId] = normalizeRuleOptions(result[ruleId]);
     
    -            /*
    -             * If either rule config is missing, then the correct
    -             * config is already present and we just need to normalize
    -             * the severity.
    -             */
    -            if (!(ruleId in first) || !(ruleId in second)) {
    -                continue;
    -            }
    -
    -            const firstRuleOptions = normalizeRuleOptions(first[ruleId]);
    -            const secondRuleOptions = normalizeRuleOptions(second[ruleId]);
    +        for (const ruleId of Object.keys(result)) {
     
    -            /*
    -             * If the second rule config only has a severity (length of 1),
    -             * then use that severity and keep the rest of the options from
    -             * the first rule config.
    -             */
    -            if (secondRuleOptions.length === 1) {
    -                result[ruleId] = [secondRuleOptions[0], ...firstRuleOptions.slice(1)];
    -                continue;
    +            try {
    +
    +                // avoid hairy edge case
    +                if (ruleId === "__proto__") {
    +
    +                    /* eslint-disable-next-line no-proto -- Though deprecated, may still be present */
    +                    delete result.__proto__;
    +                    continue;
    +                }
    +
    +                result[ruleId] = normalizeRuleOptions(result[ruleId]);
    +
    +                /*
    +                 * If either rule config is missing, then the correct
    +                 * config is already present and we just need to normalize
    +                 * the severity.
    +                 */
    +                if (!(ruleId in first) || !(ruleId in second)) {
    +                    continue;
    +                }
    +
    +                const firstRuleOptions = normalizeRuleOptions(first[ruleId]);
    +                const secondRuleOptions = normalizeRuleOptions(second[ruleId]);
    +
    +                /*
    +                 * If the second rule config only has a severity (length of 1),
    +                 * then use that severity and keep the rest of the options from
    +                 * the first rule config.
    +                 */
    +                if (secondRuleOptions.length === 1) {
    +                    result[ruleId] = [secondRuleOptions[0], ...firstRuleOptions.slice(1)];
    +                    continue;
    +                }
    +
    +                /*
    +                 * In any other situation, then the second rule config takes
    +                 * precedence. That means the value at `result[ruleId]` is
    +                 * already correct and no further work is necessary.
    +                 */
    +            } catch (ex) {
    +                throw new Error(`Key "${ruleId}": ${ex.message}`, { cause: ex });
                 }
     
    -            /*
    -             * In any other situation, then the second rule config takes
    -             * precedence. That means the value at `result[ruleId]` is
    -             * already correct and no further work is necessary.
    -             */
             }
     
             return result;
    +
    +
         },
     
         validate(value) {
    @@ -515,7 +555,7 @@ const flatConfigSchema = {
         linterOptions: {
             schema: {
                 noInlineConfig: booleanSchema,
    -            reportUnusedDisableDirectives: booleanSchema
    +            reportUnusedDisableDirectives: disableDirectiveSeveritySchema
             }
         },
         languageOptions: {
    diff --git a/tools/node_modules/eslint/lib/eslint/eslint-helpers.js b/tools/node_modules/eslint/lib/eslint/eslint-helpers.js
    index 72828363c3da3d..685826ac69cfc9 100644
    --- a/tools/node_modules/eslint/lib/eslint/eslint-helpers.js
    +++ b/tools/node_modules/eslint/lib/eslint/eslint-helpers.js
    @@ -675,7 +675,6 @@ function processOptions({
         overrideConfig = null,
         overrideConfigFile = null,
         plugins = {},
    -    reportUnusedDisableDirectives = null, // ← should be null by default because if it's a string then it overrides the 'reportUnusedDisableDirectives' setting in config files. And we cannot use `overrideConfig.reportUnusedDisableDirectives` instead because we cannot configure the `error` severity with that.
         warnIgnored = true,
         ...unknownOptions
     }) {
    @@ -720,6 +719,9 @@ function processOptions({
             if (unknownOptionKeys.includes("rulePaths")) {
                 errors.push("'rulePaths' has been removed. Please define your rules using plugins.");
             }
    +        if (unknownOptionKeys.includes("reportUnusedDisableDirectives")) {
    +            errors.push("'reportUnusedDisableDirectives' has been removed. Please use the 'overrideConfig.linterOptions.reportUnusedDisableDirectives' option instead.");
    +        }
         }
         if (typeof allowInlineConfig !== "boolean") {
             errors.push("'allowInlineConfig' must be a boolean.");
    @@ -774,14 +776,6 @@ function processOptions({
         if (Array.isArray(plugins)) {
             errors.push("'plugins' doesn't add plugins to configuration to load. Please use the 'overrideConfig.plugins' option instead.");
         }
    -    if (
    -        reportUnusedDisableDirectives !== "error" &&
    -        reportUnusedDisableDirectives !== "warn" &&
    -        reportUnusedDisableDirectives !== "off" &&
    -        reportUnusedDisableDirectives !== null
    -    ) {
    -        errors.push("'reportUnusedDisableDirectives' must be any of \"error\", \"warn\", \"off\", and null.");
    -    }
         if (typeof warnIgnored !== "boolean") {
             errors.push("'warnIgnored' must be a boolean.");
         }
    @@ -806,7 +800,6 @@ function processOptions({
             globInputPaths,
             ignore,
             ignorePatterns,
    -        reportUnusedDisableDirectives,
             warnIgnored
         };
     }
    diff --git a/tools/node_modules/eslint/lib/eslint/flat-eslint.js b/tools/node_modules/eslint/lib/eslint/flat-eslint.js
    index 306c80de1d659e..785f41edf8d092 100644
    --- a/tools/node_modules/eslint/lib/eslint/flat-eslint.js
    +++ b/tools/node_modules/eslint/lib/eslint/flat-eslint.js
    @@ -11,6 +11,7 @@
     
     // Note: Node.js 12 does not support fs/promises.
     const fs = require("fs").promises;
    +const { existsSync } = require("fs");
     const path = require("path");
     const findUp = require("find-up");
     const { version } = require("../../package.json");
    @@ -83,7 +84,6 @@ const LintResultCache = require("../cli-engine/lint-result-cache");
      *      doesn't do any config file lookup when `true`; considered to be a config filename
      *      when a string.
      * @property {Record} [plugins] An array of plugin implementations.
    - * @property {"error" | "warn" | "off"} [reportUnusedDisableDirectives] the severity to report unused eslint-disable directives.
      * @property {boolean} warnIgnored Show warnings when the file list includes ignored files
      */
     
    @@ -448,7 +448,6 @@ async function calculateConfigArray(eslint, {
      * @param {FlatConfigArray} config.configs The config.
      * @param {boolean} config.fix If `true` then it does fix.
      * @param {boolean} config.allowInlineConfig If `true` then it uses directive comments.
    - * @param {boolean} config.reportUnusedDisableDirectives If `true` then it reports unused `eslint-disable` comments.
      * @param {Linter} config.linter The linter instance to verify.
      * @returns {LintResult} The result of linting.
      * @private
    @@ -460,7 +459,6 @@ function verifyText({
         configs,
         fix,
         allowInlineConfig,
    -    reportUnusedDisableDirectives,
         linter
     }) {
         const filePath = providedFilePath || "";
    @@ -480,7 +478,6 @@ function verifyText({
                 allowInlineConfig,
                 filename: filePathToVerify,
                 fix,
    -            reportUnusedDisableDirectives,
     
                 /**
                  * Check if the linter should adopt a given code block or not.
    @@ -748,7 +745,6 @@ class FlatESLint {
                 cwd,
                 fix,
                 fixTypes,
    -            reportUnusedDisableDirectives,
                 globInputPaths,
                 errorOnUnmatchedPattern,
                 warnIgnored
    @@ -766,7 +762,7 @@ class FlatESLint {
                     const errorCode = error && error.code;
     
                     // Ignore errors when no such file exists or file system is read only (and cache file does not exist)
    -                if (errorCode !== "ENOENT" && !(errorCode === "EROFS" && !(await fs.exists(cacheFilePath)))) {
    +                if (errorCode !== "ENOENT" && !(errorCode === "EROFS" && !existsSync(cacheFilePath))) {
                         throw error;
                     }
                 }
    @@ -858,7 +854,6 @@ class FlatESLint {
                                 cwd,
                                 fix: fixer,
                                 allowInlineConfig,
    -                            reportUnusedDisableDirectives,
                                 linter
                             });
     
    @@ -943,7 +938,6 @@ class FlatESLint {
                 allowInlineConfig,
                 cwd,
                 fix,
    -            reportUnusedDisableDirectives,
                 warnIgnored: constructorWarnIgnored
             } = eslintOptions;
             const results = [];
    @@ -967,7 +961,6 @@ class FlatESLint {
                     cwd,
                     fix,
                     allowInlineConfig,
    -                reportUnusedDisableDirectives,
                     linter
                 }));
             }
    diff --git a/tools/node_modules/eslint/lib/linter/apply-disable-directives.js b/tools/node_modules/eslint/lib/linter/apply-disable-directives.js
    index 55f7683f3f53ac..c5e3c9ddc1ced5 100644
    --- a/tools/node_modules/eslint/lib/linter/apply-disable-directives.js
    +++ b/tools/node_modules/eslint/lib/linter/apply-disable-directives.js
    @@ -30,7 +30,7 @@ function compareLocations(itemA, itemB) {
     
     /**
      * Groups a set of directives into sub-arrays by their parent comment.
    - * @param {Directive[]} directives Unused directives to be removed.
    + * @param {Iterable} directives Unused directives to be removed.
      * @returns {Directive[][]} Directives grouped by their parent comment.
      */
     function groupByParentComment(directives) {
    @@ -177,10 +177,10 @@ function createCommentRemoval(directives, commentToken) {
     
     /**
      * Parses details from directives to create output Problems.
    - * @param {Directive[]} allDirectives Unused directives to be removed.
    + * @param {Iterable} allDirectives Unused directives to be removed.
      * @returns {{ description, fix, unprocessedDirective }[]} Details for later creation of output Problems.
      */
    -function processUnusedDisableDirectives(allDirectives) {
    +function processUnusedDirectives(allDirectives) {
         const directiveGroups = groupByParentComment(allDirectives);
     
         return directiveGroups.flatMap(
    @@ -199,6 +199,95 @@ function processUnusedDisableDirectives(allDirectives) {
         );
     }
     
    +/**
    + * Collect eslint-enable comments that are removing suppressions by eslint-disable comments.
    + * @param {Directive[]} directives The directives to check.
    + * @returns {Set} The used eslint-enable comments
    + */
    +function collectUsedEnableDirectives(directives) {
    +
    +    /**
    +     * A Map of `eslint-enable` keyed by ruleIds that may be marked as used.
    +     * If `eslint-enable` does not have a ruleId, the key will be `null`.
    +     * @type {Map}
    +     */
    +    const enabledRules = new Map();
    +
    +    /**
    +     * A Set of `eslint-enable` marked as used.
    +     * It is also the return value of `collectUsedEnableDirectives` function.
    +     * @type {Set}
    +     */
    +    const usedEnableDirectives = new Set();
    +
    +    /*
    +     * Checks the directives backwards to see if the encountered `eslint-enable` is used by the previous `eslint-disable`,
    +     * and if so, stores the `eslint-enable` in `usedEnableDirectives`.
    +     */
    +    for (let index = directives.length - 1; index >= 0; index--) {
    +        const directive = directives[index];
    +
    +        if (directive.type === "disable") {
    +            if (enabledRules.size === 0) {
    +                continue;
    +            }
    +            if (directive.ruleId === null) {
    +
    +                // If encounter `eslint-disable` without ruleId,
    +                // mark all `eslint-enable` currently held in enabledRules as used.
    +                // e.g.
    +                //    /* eslint-disable */ <- current directive
    +                //    /* eslint-enable rule-id1 */ <- used
    +                //    /* eslint-enable rule-id2 */ <- used
    +                //    /* eslint-enable */ <- used
    +                for (const enableDirective of enabledRules.values()) {
    +                    usedEnableDirectives.add(enableDirective);
    +                }
    +                enabledRules.clear();
    +            } else {
    +                const enableDirective = enabledRules.get(directive.ruleId);
    +
    +                if (enableDirective) {
    +
    +                    // If encounter `eslint-disable` with ruleId, and there is an `eslint-enable` with the same ruleId in enabledRules,
    +                    // mark `eslint-enable` with ruleId as used.
    +                    // e.g.
    +                    //    /* eslint-disable rule-id */ <- current directive
    +                    //    /* eslint-enable rule-id */ <- used
    +                    usedEnableDirectives.add(enableDirective);
    +                } else {
    +                    const enabledDirectiveWithoutRuleId = enabledRules.get(null);
    +
    +                    if (enabledDirectiveWithoutRuleId) {
    +
    +                        // If encounter `eslint-disable` with ruleId, and there is no `eslint-enable` with the same ruleId in enabledRules,
    +                        // mark `eslint-enable` without ruleId as used.
    +                        // e.g.
    +                        //    /* eslint-disable rule-id */ <- current directive
    +                        //    /* eslint-enable */ <- used
    +                        usedEnableDirectives.add(enabledDirectiveWithoutRuleId);
    +                    }
    +                }
    +            }
    +        } else if (directive.type === "enable") {
    +            if (directive.ruleId === null) {
    +
    +                // If encounter `eslint-enable` without ruleId, the `eslint-enable` that follows it are unused.
    +                // So clear enabledRules.
    +                // e.g.
    +                //    /* eslint-enable */ <- current directive
    +                //    /* eslint-enable rule-id *// <- unused
    +                //    /* eslint-enable */ <- unused
    +                enabledRules.clear();
    +                enabledRules.set(null, directive);
    +            } else {
    +                enabledRules.set(directive.ruleId, directive);
    +            }
    +        }
    +    }
    +    return usedEnableDirectives;
    +}
    +
     /**
      * This is the same as the exported function, except that it
      * doesn't handle disable-line and disable-next-line directives, and it always reports unused
    @@ -206,7 +295,7 @@ function processUnusedDisableDirectives(allDirectives) {
      * @param {Object} options options for applying directives. This is the same as the options
      * for the exported function, except that `reportUnusedDisableDirectives` is not supported
      * (this function always reports unused disable directives).
    - * @returns {{problems: LintMessage[], unusedDisableDirectives: LintMessage[]}} An object with a list
    + * @returns {{problems: LintMessage[], unusedDirectives: LintMessage[]}} An object with a list
      * of problems (including suppressed ones) and unused eslint-disable directives
      */
     function applyDirectives(options) {
    @@ -258,17 +347,42 @@ function applyDirectives(options) {
         const unusedDisableDirectivesToReport = options.directives
             .filter(directive => directive.type === "disable" && !usedDisableDirectives.has(directive));
     
    -    const processed = processUnusedDisableDirectives(unusedDisableDirectivesToReport);
     
    -    const unusedDisableDirectives = processed
    +    const unusedEnableDirectivesToReport = new Set(
    +        options.directives.filter(directive => directive.unprocessedDirective.type === "enable")
    +    );
    +
    +    /*
    +     * If directives has the eslint-enable directive,
    +     * check whether the eslint-enable comment is used.
    +     */
    +    if (unusedEnableDirectivesToReport.size > 0) {
    +        for (const directive of collectUsedEnableDirectives(options.directives)) {
    +            unusedEnableDirectivesToReport.delete(directive);
    +        }
    +    }
    +
    +    const processed = processUnusedDirectives(unusedDisableDirectivesToReport)
    +        .concat(processUnusedDirectives(unusedEnableDirectivesToReport));
    +
    +    const unusedDirectives = processed
             .map(({ description, fix, unprocessedDirective }) => {
                 const { parentComment, type, line, column } = unprocessedDirective;
     
    +            let message;
    +
    +            if (type === "enable") {
    +                message = description
    +                    ? `Unused eslint-enable directive (no matching eslint-disable directives were found for ${description}).`
    +                    : "Unused eslint-enable directive (no matching eslint-disable directives were found).";
    +            } else {
    +                message = description
    +                    ? `Unused eslint-disable directive (no problems were reported from ${description}).`
    +                    : "Unused eslint-disable directive (no problems were reported).";
    +            }
                 return {
                     ruleId: null,
    -                message: description
    -                    ? `Unused eslint-disable directive (no problems were reported from ${description}).`
    -                    : "Unused eslint-disable directive (no problems were reported).",
    +                message,
                     line: type === "disable-next-line" ? parentComment.commentToken.loc.start.line : line,
                     column: type === "disable-next-line" ? parentComment.commentToken.loc.start.column + 1 : column,
                     severity: options.reportUnusedDisableDirectives === "warn" ? 1 : 2,
    @@ -277,7 +391,7 @@ function applyDirectives(options) {
                 };
             });
     
    -    return { problems, unusedDisableDirectives };
    +    return { problems, unusedDirectives };
     }
     
     /**
    @@ -344,8 +458,8 @@ module.exports = ({ directives, disableFixes, problems, reportUnusedDisableDirec
     
         return reportUnusedDisableDirectives !== "off"
             ? lineDirectivesResult.problems
    -            .concat(blockDirectivesResult.unusedDisableDirectives)
    -            .concat(lineDirectivesResult.unusedDisableDirectives)
    +            .concat(blockDirectivesResult.unusedDirectives)
    +            .concat(lineDirectivesResult.unusedDirectives)
                 .sort(compareLocations)
             : lineDirectivesResult.problems;
     };
    diff --git a/tools/node_modules/eslint/lib/linter/config-comment-parser.js b/tools/node_modules/eslint/lib/linter/config-comment-parser.js
    index cde261204f5ed9..9d33c55273cb25 100644
    --- a/tools/node_modules/eslint/lib/linter/config-comment-parser.js
    +++ b/tools/node_modules/eslint/lib/linter/config-comment-parser.js
    @@ -15,7 +15,10 @@ const levn = require("levn"),
             Legacy: {
                 ConfigOps
             }
    -    } = require("@eslint/eslintrc/universal");
    +    } = require("@eslint/eslintrc/universal"),
    +    {
    +        directivesPattern
    +    } = require("../shared/directives");
     
     const debug = require("debug")("eslint:config-comment-parser");
     
    @@ -148,4 +151,35 @@ module.exports = class ConfigCommentParser {
             return items;
         }
     
    +    /**
    +     * Extract the directive and the justification from a given directive comment and trim them.
    +     * @param {string} value The comment text to extract.
    +     * @returns {{directivePart: string, justificationPart: string}} The extracted directive and justification.
    +     */
    +    extractDirectiveComment(value) {
    +        const match = /\s-{2,}\s/u.exec(value);
    +
    +        if (!match) {
    +            return { directivePart: value.trim(), justificationPart: "" };
    +        }
    +
    +        const directive = value.slice(0, match.index).trim();
    +        const justification = value.slice(match.index + match[0].length).trim();
    +
    +        return { directivePart: directive, justificationPart: justification };
    +    }
    +
    +    /**
    +     * Parses a directive comment into directive text and value.
    +     * @param {Comment} comment The comment node with the directive to be parsed.
    +     * @returns {{directiveText: string, directiveValue: string}} The directive text and value.
    +     */
    +    parseDirective(comment) {
    +        const { directivePart } = this.extractDirectiveComment(comment.value);
    +        const match = directivesPattern.exec(directivePart);
    +        const directiveText = match[1];
    +        const directiveValue = directivePart.slice(match.index + directiveText.length);
    +
    +        return { directiveText, directiveValue };
    +    }
     };
    diff --git a/tools/node_modules/eslint/lib/linter/linter.js b/tools/node_modules/eslint/lib/linter/linter.js
    index e195812e513a21..f74d0ecd13f2e2 100644
    --- a/tools/node_modules/eslint/lib/linter/linter.js
    +++ b/tools/node_modules/eslint/lib/linter/linter.js
    @@ -44,6 +44,7 @@ const { getRuleFromConfig } = require("../config/flat-config-helpers");
     const { FlatConfigArray } = require("../config/flat-config-array");
     const { RuleValidator } = require("../config/rule-validator");
     const { assertIsRuleOptions, assertIsRuleSeverity } = require("../config/flat-config-schema");
    +const { normalizeSeverityToString } = require("../shared/severity");
     const debug = require("debug")("eslint:linter");
     const MAX_AUTOFIX_PASSES = 10;
     const DEFAULT_PARSER_NAME = "espree";
    @@ -316,24 +317,6 @@ function createDisableDirectives(options) {
         return result;
     }
     
    -/**
    - * Extract the directive and the justification from a given directive comment and trim them.
    - * @param {string} value The comment text to extract.
    - * @returns {{directivePart: string, justificationPart: string}} The extracted directive and justification.
    - */
    -function extractDirectiveComment(value) {
    -    const match = /\s-{2,}\s/u.exec(value);
    -
    -    if (!match) {
    -        return { directivePart: value.trim(), justificationPart: "" };
    -    }
    -
    -    const directive = value.slice(0, match.index).trim();
    -    const justification = value.slice(match.index + match[0].length).trim();
    -
    -    return { directivePart: directive, justificationPart: justification };
    -}
    -
     /**
      * Parses comments in file to extract file-specific config of rules, globals
      * and environments and merges them with global config; also code blocks
    @@ -355,7 +338,7 @@ function getDirectiveComments(sourceCode, ruleMapper, warnInlineConfig) {
         });
     
         sourceCode.getInlineConfigNodes().filter(token => token.type !== "Shebang").forEach(comment => {
    -        const { directivePart, justificationPart } = extractDirectiveComment(comment.value);
    +        const { directivePart, justificationPart } = commentParser.extractDirectiveComment(comment.value);
     
             const match = directivesPattern.exec(directivePart);
     
    @@ -500,7 +483,7 @@ function getDirectiveCommentsForFlatConfig(sourceCode, ruleMapper) {
         const disableDirectives = [];
     
         sourceCode.getInlineConfigNodes().filter(token => token.type !== "Shebang").forEach(comment => {
    -        const { directivePart, justificationPart } = extractDirectiveComment(comment.value);
    +        const { directivePart, justificationPart } = commentParser.extractDirectiveComment(comment.value);
     
             const match = directivesPattern.exec(directivePart);
     
    @@ -620,7 +603,7 @@ function findEslintEnv(text) {
             if (match[0].endsWith("*/")) {
                 retv = Object.assign(
                     retv || {},
    -                commentParser.parseListConfig(extractDirectiveComment(match[1]).directivePart)
    +                commentParser.parseListConfig(commentParser.extractDirectiveComment(match[1]).directivePart)
                 );
             }
         }
    @@ -671,9 +654,11 @@ function normalizeVerifyOptions(providedOptions, config) {
             reportUnusedDisableDirectives = reportUnusedDisableDirectives ? "error" : "off";
         }
         if (typeof reportUnusedDisableDirectives !== "string") {
    -        reportUnusedDisableDirectives =
    -            linterOptions.reportUnusedDisableDirectives
    -                ? "warn" : "off";
    +        if (typeof linterOptions.reportUnusedDisableDirectives === "boolean") {
    +            reportUnusedDisableDirectives = linterOptions.reportUnusedDisableDirectives ? "warn" : "off";
    +        } else {
    +            reportUnusedDisableDirectives = linterOptions.reportUnusedDisableDirectives === void 0 ? "off" : normalizeSeverityToString(linterOptions.reportUnusedDisableDirectives);
    +        }
         }
     
         return {
    @@ -1422,7 +1407,7 @@ class Linter {
         verify(textOrSourceCode, config, filenameOrOptions) {
             debug("Verify");
     
    -        const { configType } = internalSlotsMap.get(this);
    +        const { configType, cwd } = internalSlotsMap.get(this);
     
             const options = typeof filenameOrOptions === "string"
                 ? { filename: filenameOrOptions }
    @@ -1441,7 +1426,7 @@ class Linter {
                     let configArray = config;
     
                     if (!Array.isArray(config) || typeof config.getConfig !== "function") {
    -                    configArray = new FlatConfigArray(config);
    +                    configArray = new FlatConfigArray(config, { basePath: cwd });
                         configArray.normalizeSync();
                     }
     
    diff --git a/tools/node_modules/eslint/lib/options.js b/tools/node_modules/eslint/lib/options.js
    index ae9a5d5552a239..dd67c399e6473a 100644
    --- a/tools/node_modules/eslint/lib/options.js
    +++ b/tools/node_modules/eslint/lib/options.js
    @@ -47,7 +47,8 @@ const optionator = require("optionator");
      * @property {Object} [parserOptions] Specify parser options
      * @property {string[]} [plugin] Specify plugins
      * @property {string} [printConfig] Print the configuration for the given file
    - * @property {boolean | undefined} reportUnusedDisableDirectives Adds reported errors for unused eslint-disable directives
    + * @property {boolean | undefined} reportUnusedDisableDirectives Adds reported errors for unused eslint-disable and eslint-enable directives
    + * @property {string | undefined} reportUnusedDisableDirectivesSeverity A severity string indicating if and how unused disable and enable directives should be tracked and reported.
      * @property {string} [resolvePluginsRelativeTo] A folder where plugins should be resolved from, CWD by default
      * @property {Object} [rule] Specify rules
      * @property {string[]} [rulesdir] Load additional rules from this directory. Deprecated: Use rules from plugins
    @@ -304,7 +305,14 @@ module.exports = function(usingFlatConfig) {
                     option: "report-unused-disable-directives",
                     type: "Boolean",
                     default: void 0,
    -                description: "Adds reported errors for unused eslint-disable directives"
    +                description: "Adds reported errors for unused eslint-disable and eslint-enable directives"
    +            },
    +            {
    +                option: "report-unused-disable-directives-severity",
    +                type: "String",
    +                default: void 0,
    +                description: "Chooses severity level for reporting unused eslint-disable and eslint-enable directives",
    +                enum: ["off", "warn", "error", "0", "1", "2"]
                 },
                 {
                     heading: "Caching"
    diff --git a/tools/node_modules/eslint/lib/rules/array-bracket-newline.js b/tools/node_modules/eslint/lib/rules/array-bracket-newline.js
    index c3676bf4dfa597..12ef5b612d6a2b 100644
    --- a/tools/node_modules/eslint/lib/rules/array-bracket-newline.js
    +++ b/tools/node_modules/eslint/lib/rules/array-bracket-newline.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to enforce linebreaks after open and before close array brackets
      * @author Jan Peer Stöcklmair 
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -14,6 +15,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/array-bracket-spacing.js b/tools/node_modules/eslint/lib/rules/array-bracket-spacing.js
    index e3a46d82214ea8..9dd3ffd902cc6c 100644
    --- a/tools/node_modules/eslint/lib/rules/array-bracket-spacing.js
    +++ b/tools/node_modules/eslint/lib/rules/array-bracket-spacing.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Disallows or enforces spaces inside of array brackets.
      * @author Jamund Ferguson
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -13,6 +14,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/array-element-newline.js b/tools/node_modules/eslint/lib/rules/array-element-newline.js
    index 0c806ef3a82c89..504fe04a0b85b1 100644
    --- a/tools/node_modules/eslint/lib/rules/array-element-newline.js
    +++ b/tools/node_modules/eslint/lib/rules/array-element-newline.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to enforce line breaks after each array element
      * @author Jan Peer Stöcklmair 
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -14,6 +15,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/arrow-parens.js b/tools/node_modules/eslint/lib/rules/arrow-parens.js
    index 0463323176edfc..2206d8ce2bfd3e 100644
    --- a/tools/node_modules/eslint/lib/rules/arrow-parens.js
    +++ b/tools/node_modules/eslint/lib/rules/arrow-parens.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to require parens in arrow function arguments.
      * @author Jxck
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -30,6 +31,8 @@ function hasBlockBody(node) {
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/arrow-spacing.js b/tools/node_modules/eslint/lib/rules/arrow-spacing.js
    index fb74d2cb272b82..2b7d464ffcf969 100644
    --- a/tools/node_modules/eslint/lib/rules/arrow-spacing.js
    +++ b/tools/node_modules/eslint/lib/rules/arrow-spacing.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to define spacing before/after arrow function's arrow.
      * @author Jxck
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -17,6 +18,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/block-spacing.js b/tools/node_modules/eslint/lib/rules/block-spacing.js
    index dd4851c68435eb..9ca461158d9e94 100644
    --- a/tools/node_modules/eslint/lib/rules/block-spacing.js
    +++ b/tools/node_modules/eslint/lib/rules/block-spacing.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview A rule to disallow or enforce spaces inside of single line blocks.
      * @author Toru Nagashima
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -14,6 +15,8 @@ const util = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/brace-style.js b/tools/node_modules/eslint/lib/rules/brace-style.js
    index 59758c90925000..0fb4c65e68d557 100644
    --- a/tools/node_modules/eslint/lib/rules/brace-style.js
    +++ b/tools/node_modules/eslint/lib/rules/brace-style.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to flag block statements that do not use the one true brace style
      * @author Ian Christian Myers
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -14,6 +15,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/comma-dangle.js b/tools/node_modules/eslint/lib/rules/comma-dangle.js
    index e49983b722e714..5f4180f12c5357 100644
    --- a/tools/node_modules/eslint/lib/rules/comma-dangle.js
    +++ b/tools/node_modules/eslint/lib/rules/comma-dangle.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to forbid or enforce dangling commas.
      * @author Ian Christian Myers
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -73,6 +74,8 @@ function normalizeOptions(optionValue, ecmaVersion) {
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/comma-spacing.js b/tools/node_modules/eslint/lib/rules/comma-spacing.js
    index 96015ef677951a..e266de4a9c341d 100644
    --- a/tools/node_modules/eslint/lib/rules/comma-spacing.js
    +++ b/tools/node_modules/eslint/lib/rules/comma-spacing.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Comma spacing - validates spacing before and after comma
      * @author Vignesh Anand aka vegetableman.
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -13,6 +14,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/comma-style.js b/tools/node_modules/eslint/lib/rules/comma-style.js
    index bc69de4698d4a0..0b51219531de19 100644
    --- a/tools/node_modules/eslint/lib/rules/comma-style.js
    +++ b/tools/node_modules/eslint/lib/rules/comma-style.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Comma style - enforces comma styles of two types: last and first
      * @author Vignesh Anand aka vegetableman
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -14,6 +15,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/computed-property-spacing.js b/tools/node_modules/eslint/lib/rules/computed-property-spacing.js
    index 1e4e17c6c71f9c..2852877fddf4a3 100644
    --- a/tools/node_modules/eslint/lib/rules/computed-property-spacing.js
    +++ b/tools/node_modules/eslint/lib/rules/computed-property-spacing.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Disallows or enforces spaces inside computed properties.
      * @author Jamund Ferguson
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -13,6 +14,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/dot-location.js b/tools/node_modules/eslint/lib/rules/dot-location.js
    index dac98b06b9e243..0d017c16232b9d 100644
    --- a/tools/node_modules/eslint/lib/rules/dot-location.js
    +++ b/tools/node_modules/eslint/lib/rules/dot-location.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Validates newlines before and after dots
      * @author Greg Cochard
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -14,6 +15,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/eol-last.js b/tools/node_modules/eslint/lib/rules/eol-last.js
    index 1036db1a10851f..03487b039f352e 100644
    --- a/tools/node_modules/eslint/lib/rules/eol-last.js
    +++ b/tools/node_modules/eslint/lib/rules/eol-last.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Require or disallow newline at the end of files
      * @author Nodeca Team 
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -11,6 +12,8 @@
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/for-direction.js b/tools/node_modules/eslint/lib/rules/for-direction.js
    index 3f2ad9df645072..69198d11ad221f 100644
    --- a/tools/node_modules/eslint/lib/rules/for-direction.js
    +++ b/tools/node_modules/eslint/lib/rules/for-direction.js
    @@ -101,30 +101,37 @@ module.exports = {
                 }
                 return 0;
             }
    +
             return {
                 ForStatement(node) {
     
    -                if (node.test && node.test.type === "BinaryExpression" && node.test.left.type === "Identifier" && node.update) {
    -                    const counter = node.test.left.name;
    -                    const operator = node.test.operator;
    -                    const update = node.update;
    +                if (node.test && node.test.type === "BinaryExpression" && node.update) {
    +                    for (const counterPosition of ["left", "right"]) {
    +                        if (node.test[counterPosition].type !== "Identifier") {
    +                            continue;
    +                        }
     
    -                    let wrongDirection;
    +                        const counter = node.test[counterPosition].name;
    +                        const operator = node.test.operator;
    +                        const update = node.update;
     
    -                    if (operator === "<" || operator === "<=") {
    -                        wrongDirection = -1;
    -                    } else if (operator === ">" || operator === ">=") {
    -                        wrongDirection = 1;
    -                    } else {
    -                        return;
    -                    }
    +                        let wrongDirection;
    +
    +                        if (operator === "<" || operator === "<=") {
    +                            wrongDirection = counterPosition === "left" ? -1 : 1;
    +                        } else if (operator === ">" || operator === ">=") {
    +                            wrongDirection = counterPosition === "left" ? 1 : -1;
    +                        } else {
    +                            return;
    +                        }
     
    -                    if (update.type === "UpdateExpression") {
    -                        if (getUpdateDirection(update, counter) === wrongDirection) {
    +                        if (update.type === "UpdateExpression") {
    +                            if (getUpdateDirection(update, counter) === wrongDirection) {
    +                                report(node);
    +                            }
    +                        } else if (update.type === "AssignmentExpression" && getAssignmentDirection(update, counter) === wrongDirection) {
                                 report(node);
                             }
    -                    } else if (update.type === "AssignmentExpression" && getAssignmentDirection(update, counter) === wrongDirection) {
    -                        report(node);
                         }
                     }
                 }
    diff --git a/tools/node_modules/eslint/lib/rules/func-call-spacing.js b/tools/node_modules/eslint/lib/rules/func-call-spacing.js
    index 3d5e538493e36c..33f73727b43c3b 100644
    --- a/tools/node_modules/eslint/lib/rules/func-call-spacing.js
    +++ b/tools/node_modules/eslint/lib/rules/func-call-spacing.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to control spacing within function calls
      * @author Matt DuVall 
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -18,6 +19,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/function-call-argument-newline.js b/tools/node_modules/eslint/lib/rules/function-call-argument-newline.js
    index 4462afd0b7c06b..458399d62cd9bc 100644
    --- a/tools/node_modules/eslint/lib/rules/function-call-argument-newline.js
    +++ b/tools/node_modules/eslint/lib/rules/function-call-argument-newline.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to enforce line breaks between arguments of a function call
      * @author Alexey Gonchar 
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -12,6 +13,8 @@
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/function-paren-newline.js b/tools/node_modules/eslint/lib/rules/function-paren-newline.js
    index 8a8714ac95d187..de315a0204b3f8 100644
    --- a/tools/node_modules/eslint/lib/rules/function-paren-newline.js
    +++ b/tools/node_modules/eslint/lib/rules/function-paren-newline.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview enforce consistent line breaks inside function parentheses
      * @author Teddy Katz
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -17,6 +18,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/generator-star-spacing.js b/tools/node_modules/eslint/lib/rules/generator-star-spacing.js
    index 81c0b61059a58d..c633f979f84af8 100644
    --- a/tools/node_modules/eslint/lib/rules/generator-star-spacing.js
    +++ b/tools/node_modules/eslint/lib/rules/generator-star-spacing.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to check the spacing around the * in generator functions.
      * @author Jamund Ferguson
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -28,6 +29,8 @@ const OVERRIDE_SCHEMA = {
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/implicit-arrow-linebreak.js b/tools/node_modules/eslint/lib/rules/implicit-arrow-linebreak.js
    index 30ab1a5f3d07ad..32f422ce8282ed 100644
    --- a/tools/node_modules/eslint/lib/rules/implicit-arrow-linebreak.js
    +++ b/tools/node_modules/eslint/lib/rules/implicit-arrow-linebreak.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview enforce the location of arrow function bodies
      * @author Sharmila Jesupaul
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -12,6 +13,8 @@ const { isCommentToken, isNotOpeningParenToken } = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/indent.js b/tools/node_modules/eslint/lib/rules/indent.js
    index 7ea4b3f86c330c..9bcbd640c4deec 100644
    --- a/tools/node_modules/eslint/lib/rules/indent.js
    +++ b/tools/node_modules/eslint/lib/rules/indent.js
    @@ -4,6 +4,7 @@
      * @author Teddy Katz
      * @author Vitaly Puzrin
      * @author Gyandeep Singh
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -493,6 +494,8 @@ const ELEMENT_LIST_SCHEMA = {
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/jsx-quotes.js b/tools/node_modules/eslint/lib/rules/jsx-quotes.js
    index a41c85170fd5f8..3dcd5fa9d22bbe 100644
    --- a/tools/node_modules/eslint/lib/rules/jsx-quotes.js
    +++ b/tools/node_modules/eslint/lib/rules/jsx-quotes.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview A rule to ensure consistent quotes used in jsx syntax.
      * @author Mathias Schreck 
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -39,6 +40,8 @@ const QUOTE_SETTINGS = {
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/key-spacing.js b/tools/node_modules/eslint/lib/rules/key-spacing.js
    index 0b51eb3fe137ee..19fc0167ae0d1b 100644
    --- a/tools/node_modules/eslint/lib/rules/key-spacing.js
    +++ b/tools/node_modules/eslint/lib/rules/key-spacing.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to specify spacing of object literal keys and values
      * @author Brandon Mills
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -133,6 +134,8 @@ function initOptions(toOptions, fromOptions) {
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/keyword-spacing.js b/tools/node_modules/eslint/lib/rules/keyword-spacing.js
    index 8ed82199810efa..9d18441e0e56bf 100644
    --- a/tools/node_modules/eslint/lib/rules/keyword-spacing.js
    +++ b/tools/node_modules/eslint/lib/rules/keyword-spacing.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to enforce spacing before and after keywords.
      * @author Toru Nagashima
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -64,6 +65,8 @@ function isCloseParenOfTemplate(token) {
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/linebreak-style.js b/tools/node_modules/eslint/lib/rules/linebreak-style.js
    index d8f36094b2e550..e59acca1b5c105 100644
    --- a/tools/node_modules/eslint/lib/rules/linebreak-style.js
    +++ b/tools/node_modules/eslint/lib/rules/linebreak-style.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to enforce a single linebreak style.
      * @author Erik Mueller
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -18,6 +19,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/lines-around-comment.js b/tools/node_modules/eslint/lib/rules/lines-around-comment.js
    index 10aeba3cbc1463..2a6e472f9a09a1 100644
    --- a/tools/node_modules/eslint/lib/rules/lines-around-comment.js
    +++ b/tools/node_modules/eslint/lib/rules/lines-around-comment.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Enforces empty lines around comments.
      * @author Jamund Ferguson
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -52,6 +53,8 @@ function getCommentLineNums(comments) {
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/lines-between-class-members.js b/tools/node_modules/eslint/lib/rules/lines-between-class-members.js
    index 3d0a5e6738e953..5f36d468dc0963 100644
    --- a/tools/node_modules/eslint/lib/rules/lines-between-class-members.js
    +++ b/tools/node_modules/eslint/lib/rules/lines-between-class-members.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to check empty newline between class members
      * @author 薛定谔的猫
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -32,6 +33,8 @@ const ClassMemberTypes = {
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/max-len.js b/tools/node_modules/eslint/lib/rules/max-len.js
    index 53ad5310799b93..138a0f239fd341 100644
    --- a/tools/node_modules/eslint/lib/rules/max-len.js
    +++ b/tools/node_modules/eslint/lib/rules/max-len.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to check for max length on a line.
      * @author Matt DuVall 
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -66,6 +67,8 @@ const OPTIONS_OR_INTEGER_SCHEMA = {
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/max-statements-per-line.js b/tools/node_modules/eslint/lib/rules/max-statements-per-line.js
    index b966504876442a..4ad73a67f98e81 100644
    --- a/tools/node_modules/eslint/lib/rules/max-statements-per-line.js
    +++ b/tools/node_modules/eslint/lib/rules/max-statements-per-line.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Specify the maximum number of statements allowed per line.
      * @author Kenneth Williams
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -17,6 +18,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/multiline-ternary.js b/tools/node_modules/eslint/lib/rules/multiline-ternary.js
    index f156fe32bb17bd..8155dd7a5a6fa8 100644
    --- a/tools/node_modules/eslint/lib/rules/multiline-ternary.js
    +++ b/tools/node_modules/eslint/lib/rules/multiline-ternary.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Enforce newlines between operands of ternary expressions
      * @author Kai Cataldo
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -14,6 +15,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/new-parens.js b/tools/node_modules/eslint/lib/rules/new-parens.js
    index e8667310f2941f..1c5d21d4a0c5a0 100644
    --- a/tools/node_modules/eslint/lib/rules/new-parens.js
    +++ b/tools/node_modules/eslint/lib/rules/new-parens.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to flag when using constructor without parentheses
      * @author Ilya Volodin
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -22,6 +23,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/newline-per-chained-call.js b/tools/node_modules/eslint/lib/rules/newline-per-chained-call.js
    index b2e6cd9e49d82c..3124ac2d19f7f8 100644
    --- a/tools/node_modules/eslint/lib/rules/newline-per-chained-call.js
    +++ b/tools/node_modules/eslint/lib/rules/newline-per-chained-call.js
    @@ -2,6 +2,7 @@
      * @fileoverview Rule to ensure newline per method call when chaining calls
      * @author Rajendra Patil
      * @author Burak Yigit Kaya
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -15,6 +16,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/no-array-constructor.js b/tools/node_modules/eslint/lib/rules/no-array-constructor.js
    index b5399264118352..f56b6876674ccf 100644
    --- a/tools/node_modules/eslint/lib/rules/no-array-constructor.js
    +++ b/tools/node_modules/eslint/lib/rules/no-array-constructor.js
    @@ -5,6 +5,18 @@
     
     "use strict";
     
    +//------------------------------------------------------------------------------
    +// Requirements
    +//------------------------------------------------------------------------------
    +
    +const {
    +    getVariableByName,
    +    isClosingParenToken,
    +    isOpeningParenToken,
    +    isStartOfExpressionStatement,
    +    needsPrecedingSemicolon
    +} = require("./utils/ast-utils");
    +
     //------------------------------------------------------------------------------
     // Rule Definition
     //------------------------------------------------------------------------------
    @@ -20,15 +32,45 @@ module.exports = {
                 url: "https://eslint.org/docs/latest/rules/no-array-constructor"
             },
     
    +        hasSuggestions: true,
    +
             schema: [],
     
             messages: {
    -            preferLiteral: "The array literal notation [] is preferable."
    +            preferLiteral: "The array literal notation [] is preferable.",
    +            useLiteral: "Replace with an array literal.",
    +            useLiteralAfterSemicolon: "Replace with an array literal, add preceding semicolon."
             }
         },
     
         create(context) {
     
    +        const sourceCode = context.sourceCode;
    +
    +        /**
    +         * Gets the text between the calling parentheses of a CallExpression or NewExpression.
    +         * @param {ASTNode} node A CallExpression or NewExpression node.
    +         * @returns {string} The text between the calling parentheses, or an empty string if there are none.
    +         */
    +        function getArgumentsText(node) {
    +            const lastToken = sourceCode.getLastToken(node);
    +
    +            if (!isClosingParenToken(lastToken)) {
    +                return "";
    +            }
    +
    +            let firstToken = node.callee;
    +
    +            do {
    +                firstToken = sourceCode.getTokenAfter(firstToken);
    +                if (!firstToken || firstToken === lastToken) {
    +                    return "";
    +                }
    +            } while (!isOpeningParenToken(firstToken));
    +
    +            return sourceCode.text.slice(firstToken.range[1], lastToken.range[0]);
    +        }
    +
             /**
              * Disallow construction of dense arrays using the Array constructor
              * @param {ASTNode} node node to evaluate
    @@ -37,11 +79,48 @@ module.exports = {
              */
             function check(node) {
                 if (
    -                node.arguments.length !== 1 &&
    -                node.callee.type === "Identifier" &&
    -                node.callee.name === "Array"
    -            ) {
    -                context.report({ node, messageId: "preferLiteral" });
    +                node.callee.type !== "Identifier" ||
    +                node.callee.name !== "Array" ||
    +                node.arguments.length === 1 &&
    +                node.arguments[0].type !== "SpreadElement") {
    +                return;
    +            }
    +
    +            const variable = getVariableByName(sourceCode.getScope(node), "Array");
    +
    +            /*
    +             * Check if `Array` is a predefined global variable: predefined globals have no declarations,
    +             * meaning that the `identifiers` list of the variable object is empty.
    +             */
    +            if (variable && variable.identifiers.length === 0) {
    +                const argsText = getArgumentsText(node);
    +                let fixText;
    +                let messageId;
    +
    +                /*
    +                 * Check if the suggested change should include a preceding semicolon or not.
    +                 * Due to JavaScript's ASI rules, a missing semicolon may be inserted automatically
    +                 * before an expression like `Array()` or `new Array()`, but not when the expression
    +                 * is changed into an array literal like `[]`.
    +                 */
    +                if (isStartOfExpressionStatement(node) && needsPrecedingSemicolon(sourceCode, node)) {
    +                    fixText = `;[${argsText}]`;
    +                    messageId = "useLiteralAfterSemicolon";
    +                } else {
    +                    fixText = `[${argsText}]`;
    +                    messageId = "useLiteral";
    +                }
    +
    +                context.report({
    +                    node,
    +                    messageId: "preferLiteral",
    +                    suggest: [
    +                        {
    +                            messageId,
    +                            fix: fixer => fixer.replaceText(node, fixText)
    +                        }
    +                    ]
    +                });
                 }
             }
     
    diff --git a/tools/node_modules/eslint/lib/rules/no-confusing-arrow.js b/tools/node_modules/eslint/lib/rules/no-confusing-arrow.js
    index de6e2f30c2ed8e..6fef1870eb2af2 100644
    --- a/tools/node_modules/eslint/lib/rules/no-confusing-arrow.js
    +++ b/tools/node_modules/eslint/lib/rules/no-confusing-arrow.js
    @@ -2,6 +2,7 @@
      * @fileoverview A rule to warn against using arrow functions when they could be
      * confused with comparisons
      * @author Jxck 
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -28,6 +29,8 @@ function isConditional(node) {
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "suggestion",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/no-console.js b/tools/node_modules/eslint/lib/rules/no-console.js
    index f257098d38b0de..d20477c5d9a832 100644
    --- a/tools/node_modules/eslint/lib/rules/no-console.js
    +++ b/tools/node_modules/eslint/lib/rules/no-console.js
    @@ -43,8 +43,11 @@ module.exports = {
                 }
             ],
     
    +        hasSuggestions: true,
    +
             messages: {
    -            unexpected: "Unexpected console statement."
    +            unexpected: "Unexpected console statement.",
    +            removeConsole: "Remove the console.{{ propertyName }}()."
             }
         },
     
    @@ -94,6 +97,64 @@ module.exports = {
                 );
             }
     
    +        /**
    +         * Checks if removing the ExpressionStatement node will cause ASI to
    +         * break.
    +         * eg.
    +         * foo()
    +         * console.log();
    +         * [1, 2, 3].forEach(a => doSomething(a))
    +         *
    +         * Removing the console.log(); statement should leave two statements, but
    +         * here the two statements will become one because [ causes continuation after
    +         * foo().
    +         * @param {ASTNode} node The ExpressionStatement node to check.
    +         * @returns {boolean} `true` if ASI will break after removing the ExpressionStatement
    +         *      node.
    +         */
    +        function maybeAsiHazard(node) {
    +            const SAFE_TOKENS_BEFORE = /^[:;{]$/u; // One of :;{
    +            const UNSAFE_CHARS_AFTER = /^[-[(/+`]/u; // One of [(/+-`
    +
    +            const tokenBefore = sourceCode.getTokenBefore(node);
    +            const tokenAfter = sourceCode.getTokenAfter(node);
    +
    +            return (
    +                Boolean(tokenAfter) &&
    +                UNSAFE_CHARS_AFTER.test(tokenAfter.value) &&
    +                tokenAfter.value !== "++" &&
    +                tokenAfter.value !== "--" &&
    +                Boolean(tokenBefore) &&
    +                !SAFE_TOKENS_BEFORE.test(tokenBefore.value)
    +            );
    +        }
    +
    +        /**
    +         * Checks if the MemberExpression node's parent.parent.parent is a
    +         * Program, BlockStatement, StaticBlock, or SwitchCase node. This check
    +         * is necessary to avoid providing a suggestion that might cause a syntax error.
    +         *
    +         * eg. if (a) console.log(b), removing console.log() here will lead to a
    +         *     syntax error.
    +         *     if (a) { console.log(b) }, removing console.log() here is acceptable.
    +         *
    +         * Additionally, it checks if the callee of the CallExpression node is
    +         * the node itself.
    +         *
    +         * eg. foo(console.log), cannot provide a suggestion here.
    +         * @param {ASTNode} node The MemberExpression node to check.
    +         * @returns {boolean} `true` if a suggestion can be provided for a node.
    +         */
    +        function canProvideSuggestions(node) {
    +            return (
    +                node.parent.type === "CallExpression" &&
    +                node.parent.callee === node &&
    +                node.parent.parent.type === "ExpressionStatement" &&
    +                astUtils.STATEMENT_LIST_PARENTS.has(node.parent.parent.parent.type) &&
    +                !maybeAsiHazard(node.parent.parent)
    +            );
    +        }
    +
             /**
              * Reports the given reference as a violation.
              * @param {eslint-scope.Reference} reference The reference to report.
    @@ -102,10 +163,21 @@ module.exports = {
             function report(reference) {
                 const node = reference.identifier.parent;
     
    +            const propertyName = astUtils.getStaticPropertyName(node);
    +
                 context.report({
                     node,
                     loc: node.loc,
    -                messageId: "unexpected"
    +                messageId: "unexpected",
    +                suggest: canProvideSuggestions(node)
    +                    ? [{
    +                        messageId: "removeConsole",
    +                        data: { propertyName },
    +                        fix(fixer) {
    +                            return fixer.remove(node.parent.parent);
    +                        }
    +                    }]
    +                    : []
                 });
             }
     
    diff --git a/tools/node_modules/eslint/lib/rules/no-extra-parens.js b/tools/node_modules/eslint/lib/rules/no-extra-parens.js
    index bb80987858c41e..75c082baf2e843 100644
    --- a/tools/node_modules/eslint/lib/rules/no-extra-parens.js
    +++ b/tools/node_modules/eslint/lib/rules/no-extra-parens.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Disallow parenthesising higher precedence subexpressions.
      * @author Michael Ficarra
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -14,6 +15,8 @@ const astUtils = require("./utils/ast-utils.js");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/no-extra-semi.js b/tools/node_modules/eslint/lib/rules/no-extra-semi.js
    index 3473df10dbfbf4..af7eb88884560d 100644
    --- a/tools/node_modules/eslint/lib/rules/no-extra-semi.js
    +++ b/tools/node_modules/eslint/lib/rules/no-extra-semi.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to flag use of unnecessary semicolons
      * @author Nicholas C. Zakas
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -19,6 +20,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "suggestion",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/no-floating-decimal.js b/tools/node_modules/eslint/lib/rules/no-floating-decimal.js
    index c26876440a588a..80e4994cd72af0 100644
    --- a/tools/node_modules/eslint/lib/rules/no-floating-decimal.js
    +++ b/tools/node_modules/eslint/lib/rules/no-floating-decimal.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to flag use of a leading/trailing decimal point in a numeric literal
      * @author James Allardice
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -18,6 +19,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "suggestion",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/no-invalid-this.js b/tools/node_modules/eslint/lib/rules/no-invalid-this.js
    index 49ecbe514c6d0f..9e214035c33820 100644
    --- a/tools/node_modules/eslint/lib/rules/no-invalid-this.js
    +++ b/tools/node_modules/eslint/lib/rules/no-invalid-this.js
    @@ -96,7 +96,7 @@ module.exports = {
     
                     if (codePath.origin === "program") {
                         const scope = sourceCode.getScope(node);
    -                    const features = context.parserOptions.ecmaFeatures || {};
    +                    const features = context.languageOptions.parserOptions.ecmaFeatures || {};
     
                         // `this` at the top level of scripts always refers to the global object
                         stack.push({
    diff --git a/tools/node_modules/eslint/lib/rules/no-mixed-operators.js b/tools/node_modules/eslint/lib/rules/no-mixed-operators.js
    index 724abe09466474..6b6f7364a012ee 100644
    --- a/tools/node_modules/eslint/lib/rules/no-mixed-operators.js
    +++ b/tools/node_modules/eslint/lib/rules/no-mixed-operators.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to disallow mixed binary operators.
      * @author Toru Nagashima
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -85,6 +86,8 @@ function getChildNode(node) {
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "suggestion",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/no-mixed-spaces-and-tabs.js b/tools/node_modules/eslint/lib/rules/no-mixed-spaces-and-tabs.js
    index a18e4f30d0aada..7698b5da7fa9ce 100644
    --- a/tools/node_modules/eslint/lib/rules/no-mixed-spaces-and-tabs.js
    +++ b/tools/node_modules/eslint/lib/rules/no-mixed-spaces-and-tabs.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Disallow mixed spaces and tabs for indentation
      * @author Jary Niebur
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -11,6 +12,8 @@
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/no-multi-spaces.js b/tools/node_modules/eslint/lib/rules/no-multi-spaces.js
    index 62074e657ae360..bc90ee5b5b0183 100644
    --- a/tools/node_modules/eslint/lib/rules/no-multi-spaces.js
    +++ b/tools/node_modules/eslint/lib/rules/no-multi-spaces.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Disallow use of multiple spaces.
      * @author Nicholas C. Zakas
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -14,6 +15,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/no-multiple-empty-lines.js b/tools/node_modules/eslint/lib/rules/no-multiple-empty-lines.js
    index 2c0fbf2c6ab979..5d038ff05b2e29 100644
    --- a/tools/node_modules/eslint/lib/rules/no-multiple-empty-lines.js
    +++ b/tools/node_modules/eslint/lib/rules/no-multiple-empty-lines.js
    @@ -2,6 +2,7 @@
      * @fileoverview Disallows multiple blank lines.
      * implementation adapted from the no-trailing-spaces rule.
      * @author Greg Cochard
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -12,6 +13,8 @@
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/no-object-constructor.js b/tools/node_modules/eslint/lib/rules/no-object-constructor.js
    index 1299779f7ec843..8875ec2124b174 100644
    --- a/tools/node_modules/eslint/lib/rules/no-object-constructor.js
    +++ b/tools/node_modules/eslint/lib/rules/no-object-constructor.js
    @@ -9,28 +9,12 @@
     // Requirements
     //------------------------------------------------------------------------------
     
    -const { getVariableByName, isArrowToken } = require("./utils/ast-utils");
    -
    -//------------------------------------------------------------------------------
    -// Helpers
    -//------------------------------------------------------------------------------
    -
    -/**
    - * Tests if a node appears at the beginning of an ancestor ExpressionStatement node.
    - * @param {ASTNode} node The node to check.
    - * @returns {boolean} Whether the node appears at the beginning of an ancestor ExpressionStatement node.
    - */
    -function isStartOfExpressionStatement(node) {
    -    const start = node.range[0];
    -    let ancestor = node;
    -
    -    while ((ancestor = ancestor.parent) && ancestor.range[0] === start) {
    -        if (ancestor.type === "ExpressionStatement") {
    -            return true;
    -        }
    -    }
    -    return false;
    -}
    +const {
    +    getVariableByName,
    +    isArrowToken,
    +    isStartOfExpressionStatement,
    +    needsPrecedingSemicolon
    +} = require("./utils/ast-utils");
     
     //------------------------------------------------------------------------------
     // Rule Definition
    @@ -53,7 +37,8 @@ module.exports = {
     
             messages: {
                 preferLiteral: "The object literal notation {} is preferable.",
    -            useLiteral: "Replace with '{{replacement}}'."
    +            useLiteral: "Replace with '{{replacement}}'.",
    +            useLiteralAfterSemicolon: "Replace with '{{replacement}}', add preceding semicolon."
             }
         },
     
    @@ -93,16 +78,30 @@ module.exports = {
                 const variable = getVariableByName(sourceCode.getScope(node), "Object");
     
                 if (variable && variable.identifiers.length === 0) {
    -                const replacement = needsParentheses(node) ? "({})" : "{}";
    +                let replacement;
    +                let fixText;
    +                let messageId = "useLiteral";
    +
    +                if (needsParentheses(node)) {
    +                    replacement = "({})";
    +                    if (needsPrecedingSemicolon(sourceCode, node)) {
    +                        fixText = ";({})";
    +                        messageId = "useLiteralAfterSemicolon";
    +                    } else {
    +                        fixText = "({})";
    +                    }
    +                } else {
    +                    replacement = fixText = "{}";
    +                }
     
                     context.report({
                         node,
                         messageId: "preferLiteral",
                         suggest: [
                             {
    -                            messageId: "useLiteral",
    +                            messageId,
                                 data: { replacement },
    -                            fix: fixer => fixer.replaceText(node, replacement)
    +                            fix: fixer => fixer.replaceText(node, fixText)
                             }
                         ]
                     });
    diff --git a/tools/node_modules/eslint/lib/rules/no-promise-executor-return.js b/tools/node_modules/eslint/lib/rules/no-promise-executor-return.js
    index e6ed7a22efc554..b27e440729c0ff 100644
    --- a/tools/node_modules/eslint/lib/rules/no-promise-executor-return.js
    +++ b/tools/node_modules/eslint/lib/rules/no-promise-executor-return.js
    @@ -209,12 +209,15 @@ module.exports = {
                             });
                         }
     
    -                    suggest.push({
    -                        messageId: "wrapBraces",
    -                        fix(fixer) {
    -                            return curlyWrapFixer(sourceCode, node, fixer);
    -                        }
    -                    });
    +                    // Do not suggest wrapping an unnamed FunctionExpression in braces as that would be invalid syntax.
    +                    if (!(node.body.type === "FunctionExpression" && !node.body.id)) {
    +                        suggest.push({
    +                            messageId: "wrapBraces",
    +                            fix(fixer) {
    +                                return curlyWrapFixer(sourceCode, node, fixer);
    +                            }
    +                        });
    +                    }
     
                         context.report({
                             node: node.body,
    diff --git a/tools/node_modules/eslint/lib/rules/no-prototype-builtins.js b/tools/node_modules/eslint/lib/rules/no-prototype-builtins.js
    index a7a57bc119e37b..b61e585291a92e 100644
    --- a/tools/node_modules/eslint/lib/rules/no-prototype-builtins.js
    +++ b/tools/node_modules/eslint/lib/rules/no-prototype-builtins.js
    @@ -10,6 +10,37 @@
     
     const astUtils = require("./utils/ast-utils");
     
    +//------------------------------------------------------------------------------
    +// Helpers
    +//------------------------------------------------------------------------------
    +
    +/**
    + * Returns true if the node or any of the objects
    + * to the left of it in the member/call chain is optional.
    + *
    + * e.g. `a?.b`, `a?.b.c`, `a?.()`, `a()?.()`
    + * @param {ASTNode} node The expression to check
    + * @returns {boolean} `true` if there is a short-circuiting optional `?.`
    + * in the same option chain to the left of this call or member expression,
    + * or the node itself is an optional call or member `?.`.
    + */
    +function isAfterOptional(node) {
    +    let leftNode;
    +
    +    if (node.type === "MemberExpression") {
    +        leftNode = node.object;
    +    } else if (node.type === "CallExpression") {
    +        leftNode = node.callee;
    +    } else {
    +        return false;
    +    }
    +    if (node.optional) {
    +        return true;
    +    }
    +    return isAfterOptional(leftNode);
    +}
    +
    +
     //------------------------------------------------------------------------------
     // Rule Definition
     //------------------------------------------------------------------------------
    @@ -25,10 +56,13 @@ module.exports = {
                 url: "https://eslint.org/docs/latest/rules/no-prototype-builtins"
             },
     
    +        hasSuggestions: true,
    +
             schema: [],
     
             messages: {
    -            prototypeBuildIn: "Do not access Object.prototype method '{{prop}}' from target object."
    +            prototypeBuildIn: "Do not access Object.prototype method '{{prop}}' from target object.",
    +            callObjectPrototype: "Call Object.prototype.{{prop}} explicitly."
             }
         },
     
    @@ -59,7 +93,61 @@ module.exports = {
                         messageId: "prototypeBuildIn",
                         loc: callee.property.loc,
                         data: { prop: propName },
    -                    node
    +                    node,
    +                    suggest: [
    +                        {
    +                            messageId: "callObjectPrototype",
    +                            data: { prop: propName },
    +                            fix(fixer) {
    +                                const sourceCode = context.sourceCode;
    +
    +                                /*
    +                                 * A call after an optional chain (e.g. a?.b.hasOwnProperty(c))
    +                                 * must be fixed manually because the call can be short-circuited
    +                                 */
    +                                if (isAfterOptional(node)) {
    +                                    return null;
    +                                }
    +
    +                                /*
    +                                 * A call on a ChainExpression (e.g. (a?.hasOwnProperty)(c)) will trigger
    +                                 * no-unsafe-optional-chaining which should be fixed before this suggestion
    +                                 */
    +                                if (node.callee.type === "ChainExpression") {
    +                                    return null;
    +                                }
    +
    +                                const objectVariable = astUtils.getVariableByName(sourceCode.getScope(node), "Object");
    +
    +                                /*
    +                                 * We can't use Object if the global Object was shadowed,
    +                                 * or Object does not exist in the global scope for some reason
    +                                 */
    +                                if (!objectVariable || objectVariable.scope.type !== "global" || objectVariable.defs.length > 0) {
    +                                    return null;
    +                                }
    +
    +                                let objectText = sourceCode.getText(callee.object);
    +
    +                                if (astUtils.getPrecedence(callee.object) <= astUtils.getPrecedence({ type: "SequenceExpression" })) {
    +                                    objectText = `(${objectText})`;
    +                                }
    +
    +                                const openParenToken = sourceCode.getTokenAfter(
    +                                    node.callee,
    +                                    astUtils.isOpeningParenToken
    +                                );
    +                                const isEmptyParameters = node.arguments.length === 0;
    +                                const delim = isEmptyParameters ? "" : ", ";
    +                                const fixes = [
    +                                    fixer.replaceText(callee, `Object.prototype.${propName}.call`),
    +                                    fixer.insertTextAfter(openParenToken, objectText + delim)
    +                                ];
    +
    +                                return fixes;
    +                            }
    +                        }
    +                    ]
                     });
                 }
             }
    diff --git a/tools/node_modules/eslint/lib/rules/no-restricted-imports.js b/tools/node_modules/eslint/lib/rules/no-restricted-imports.js
    index 6abfcacae137b1..eb59f4c23a9b56 100644
    --- a/tools/node_modules/eslint/lib/rules/no-restricted-imports.js
    +++ b/tools/node_modules/eslint/lib/rules/no-restricted-imports.js
    @@ -74,6 +74,9 @@ const arrayOfStringsOrObjectPatterns = {
                             minItems: 1,
                             uniqueItems: true
                         },
    +                    importNamePattern: {
    +                        type: "string"
    +                    },
                         message: {
                             type: "string",
                             minLength: 1
    @@ -115,8 +118,12 @@ module.exports = {
                 patternAndImportNameWithCustomMessage: "'{{importName}}' import from '{{importSource}}' is restricted from being used by a pattern. {{customMessage}}",
     
                 patternAndEverything: "* import is invalid because '{{importNames}}' from '{{importSource}}' is restricted from being used by a pattern.",
    +
    +            patternAndEverythingWithRegexImportName: "* import is invalid because import name matching '{{importNames}}' pattern from '{{importSource}}' is restricted from being used.",
                 // eslint-disable-next-line eslint-plugin/report-message-format -- Custom message might not end in a period
                 patternAndEverythingWithCustomMessage: "* import is invalid because '{{importNames}}' from '{{importSource}}' is restricted from being used by a pattern. {{customMessage}}",
    +            // eslint-disable-next-line eslint-plugin/report-message-format -- Custom message might not end in a period
    +            patternAndEverythingWithRegexImportNameAndCustomMessage: "* import is invalid because import name matching '{{importNames}}' pattern from '{{importSource}}' is restricted from being used. {{customMessage}}",
     
                 everything: "* import is invalid because '{{importNames}}' from '{{importSource}}' is restricted.",
                 // eslint-disable-next-line eslint-plugin/report-message-format -- Custom message might not end in a period
    @@ -175,10 +182,11 @@ module.exports = {
             }
     
             // relative paths are supported for this rule
    -        const restrictedPatternGroups = restrictedPatterns.map(({ group, message, caseSensitive, importNames }) => ({
    +        const restrictedPatternGroups = restrictedPatterns.map(({ group, message, caseSensitive, importNames, importNamePattern }) => ({
                 matcher: ignore({ allowRelativePaths: true, ignorecase: !caseSensitive }).add(group),
                 customMessage: message,
    -            importNames
    +            importNames,
    +            importNamePattern
             }));
     
             // if no imports are restricted we don't need to check
    @@ -262,12 +270,13 @@ module.exports = {
     
                 const customMessage = group.customMessage;
                 const restrictedImportNames = group.importNames;
    +            const restrictedImportNamePattern = group.importNamePattern ? new RegExp(group.importNamePattern, "u") : null;
     
                 /*
                  * If we are not restricting to any specific import names and just the pattern itself,
                  * report the error and move on
                  */
    -            if (!restrictedImportNames) {
    +            if (!restrictedImportNames && !restrictedImportNamePattern) {
                     context.report({
                         node,
                         messageId: customMessage ? "patternWithCustomMessage" : "patterns",
    @@ -279,40 +288,54 @@ module.exports = {
                     return;
                 }
     
    -            if (importNames.has("*")) {
    -                const specifierData = importNames.get("*")[0];
    -
    -                context.report({
    -                    node,
    -                    messageId: customMessage ? "patternAndEverythingWithCustomMessage" : "patternAndEverything",
    -                    loc: specifierData.loc,
    -                    data: {
    -                        importSource,
    -                        importNames: restrictedImportNames,
    -                        customMessage
    +            importNames.forEach((specifiers, importName) => {
    +                if (importName === "*") {
    +                    const [specifier] = specifiers;
    +
    +                    if (restrictedImportNames) {
    +                        context.report({
    +                            node,
    +                            messageId: customMessage ? "patternAndEverythingWithCustomMessage" : "patternAndEverything",
    +                            loc: specifier.loc,
    +                            data: {
    +                                importSource,
    +                                importNames: restrictedImportNames,
    +                                customMessage
    +                            }
    +                        });
    +                    } else {
    +                        context.report({
    +                            node,
    +                            messageId: customMessage ? "patternAndEverythingWithRegexImportNameAndCustomMessage" : "patternAndEverythingWithRegexImportName",
    +                            loc: specifier.loc,
    +                            data: {
    +                                importSource,
    +                                importNames: restrictedImportNamePattern,
    +                                customMessage
    +                            }
    +                        });
                         }
    -                });
    -            }
     
    -            restrictedImportNames.forEach(importName => {
    -                if (!importNames.has(importName)) {
                         return;
                     }
     
    -                const specifiers = importNames.get(importName);
    -
    -                specifiers.forEach(specifier => {
    -                    context.report({
    -                        node,
    -                        messageId: customMessage ? "patternAndImportNameWithCustomMessage" : "patternAndImportName",
    -                        loc: specifier.loc,
    -                        data: {
    -                            importSource,
    -                            customMessage,
    -                            importName
    -                        }
    +                if (
    +                    (restrictedImportNames && restrictedImportNames.includes(importName)) ||
    +                    (restrictedImportNamePattern && restrictedImportNamePattern.test(importName))
    +                ) {
    +                    specifiers.forEach(specifier => {
    +                        context.report({
    +                            node,
    +                            messageId: customMessage ? "patternAndImportNameWithCustomMessage" : "patternAndImportName",
    +                            loc: specifier.loc,
    +                            data: {
    +                                importSource,
    +                                customMessage,
    +                                importName
    +                            }
    +                        });
                         });
    -                });
    +                }
                 });
             }
     
    diff --git a/tools/node_modules/eslint/lib/rules/no-restricted-properties.js b/tools/node_modules/eslint/lib/rules/no-restricted-properties.js
    index b07663260997f3..acd178ae53e8a7 100644
    --- a/tools/node_modules/eslint/lib/rules/no-restricted-properties.js
    +++ b/tools/node_modules/eslint/lib/rules/no-restricted-properties.js
    @@ -142,40 +142,27 @@ module.exports = {
                 }
             }
     
    -        /**
    -         * Checks property accesses in a destructuring assignment expression, e.g. `var foo; ({foo} = bar);`
    -         * @param {ASTNode} node An AssignmentExpression or AssignmentPattern node
    -         * @returns {undefined}
    -         */
    -        function checkDestructuringAssignment(node) {
    -            if (node.right.type === "Identifier") {
    -                const objectName = node.right.name;
    -
    -                if (node.left.type === "ObjectPattern") {
    -                    node.left.properties.forEach(property => {
    -                        checkPropertyAccess(node.left, objectName, astUtils.getStaticPropertyName(property));
    -                    });
    -                }
    -            }
    -        }
    -
             return {
                 MemberExpression(node) {
                     checkPropertyAccess(node, node.object && node.object.name, astUtils.getStaticPropertyName(node));
                 },
    -            VariableDeclarator(node) {
    -                if (node.init && node.init.type === "Identifier") {
    -                    const objectName = node.init.name;
    -
    -                    if (node.id.type === "ObjectPattern") {
    -                        node.id.properties.forEach(property => {
    -                            checkPropertyAccess(node.id, objectName, astUtils.getStaticPropertyName(property));
    -                        });
    +            ObjectPattern(node) {
    +                let objectName = null;
    +
    +                if (node.parent.type === "VariableDeclarator") {
    +                    if (node.parent.init && node.parent.init.type === "Identifier") {
    +                        objectName = node.parent.init.name;
    +                    }
    +                } else if (node.parent.type === "AssignmentExpression" || node.parent.type === "AssignmentPattern") {
    +                    if (node.parent.right.type === "Identifier") {
    +                        objectName = node.parent.right.name;
                         }
                     }
    -            },
    -            AssignmentExpression: checkDestructuringAssignment,
    -            AssignmentPattern: checkDestructuringAssignment
    +
    +                node.properties.forEach(property => {
    +                    checkPropertyAccess(node, objectName, astUtils.getStaticPropertyName(property));
    +                });
    +            }
             };
         }
     };
    diff --git a/tools/node_modules/eslint/lib/rules/no-tabs.js b/tools/node_modules/eslint/lib/rules/no-tabs.js
    index b33690c24412fc..8581e19af37333 100644
    --- a/tools/node_modules/eslint/lib/rules/no-tabs.js
    +++ b/tools/node_modules/eslint/lib/rules/no-tabs.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to check for tabs inside a file
      * @author Gyandeep Singh
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -19,6 +20,8 @@ const anyNonWhitespaceRegex = /\S/u;
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/no-trailing-spaces.js b/tools/node_modules/eslint/lib/rules/no-trailing-spaces.js
    index 1674de54207f2a..eede46c8634633 100644
    --- a/tools/node_modules/eslint/lib/rules/no-trailing-spaces.js
    +++ b/tools/node_modules/eslint/lib/rules/no-trailing-spaces.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Disallow trailing spaces at the end of lines.
      * @author Nodeca Team 
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -17,6 +18,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/no-whitespace-before-property.js b/tools/node_modules/eslint/lib/rules/no-whitespace-before-property.js
    index 1153314afe6531..94a166e6adea70 100644
    --- a/tools/node_modules/eslint/lib/rules/no-whitespace-before-property.js
    +++ b/tools/node_modules/eslint/lib/rules/no-whitespace-before-property.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to disallow whitespace before properties
      * @author Kai Cataldo
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -17,6 +18,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/nonblock-statement-body-position.js b/tools/node_modules/eslint/lib/rules/nonblock-statement-body-position.js
    index 1ea2770ceb2554..811b32b08212d4 100644
    --- a/tools/node_modules/eslint/lib/rules/nonblock-statement-body-position.js
    +++ b/tools/node_modules/eslint/lib/rules/nonblock-statement-body-position.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview enforce the location of single-line statements
      * @author Teddy Katz
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -13,6 +14,8 @@ const POSITION_SCHEMA = { enum: ["beside", "below", "any"] };
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/object-curly-newline.js b/tools/node_modules/eslint/lib/rules/object-curly-newline.js
    index caf1982312a681..176694b6a0774e 100644
    --- a/tools/node_modules/eslint/lib/rules/object-curly-newline.js
    +++ b/tools/node_modules/eslint/lib/rules/object-curly-newline.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to require or disallow line breaks inside braces.
      * @author Toru Nagashima
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -147,6 +148,8 @@ function areLineBreaksRequired(node, options, first, last) {
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/object-curly-spacing.js b/tools/node_modules/eslint/lib/rules/object-curly-spacing.js
    index 41ca428fe24d07..4463bcd5af175c 100644
    --- a/tools/node_modules/eslint/lib/rules/object-curly-spacing.js
    +++ b/tools/node_modules/eslint/lib/rules/object-curly-spacing.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Disallows or enforces spaces inside of object literals.
      * @author Jamund Ferguson
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -13,6 +14,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/object-property-newline.js b/tools/node_modules/eslint/lib/rules/object-property-newline.js
    index deca9b555b1694..6ffa06421f022e 100644
    --- a/tools/node_modules/eslint/lib/rules/object-property-newline.js
    +++ b/tools/node_modules/eslint/lib/rules/object-property-newline.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to enforce placing object properties on separate lines.
      * @author Vitor Balocco
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -12,6 +13,8 @@
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/one-var-declaration-per-line.js b/tools/node_modules/eslint/lib/rules/one-var-declaration-per-line.js
    index b1e045b0dc58af..340eac169320ea 100644
    --- a/tools/node_modules/eslint/lib/rules/one-var-declaration-per-line.js
    +++ b/tools/node_modules/eslint/lib/rules/one-var-declaration-per-line.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to check multiple var declarations per line
      * @author Alberto Rodríguez
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -11,6 +12,8 @@
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "suggestion",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/operator-linebreak.js b/tools/node_modules/eslint/lib/rules/operator-linebreak.js
    index 2b609f63576558..3065e66be12873 100644
    --- a/tools/node_modules/eslint/lib/rules/operator-linebreak.js
    +++ b/tools/node_modules/eslint/lib/rules/operator-linebreak.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Operator linebreak - enforces operator linebreak style of two types: after and before
      * @author Benoît Zugmeyer
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -18,6 +19,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/padded-blocks.js b/tools/node_modules/eslint/lib/rules/padded-blocks.js
    index c6d1372ac75d1b..ec4756ba739a08 100644
    --- a/tools/node_modules/eslint/lib/rules/padded-blocks.js
    +++ b/tools/node_modules/eslint/lib/rules/padded-blocks.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview A rule to ensure blank lines within blocks.
      * @author Mathias Schreck 
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -18,6 +19,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/padding-line-between-statements.js b/tools/node_modules/eslint/lib/rules/padding-line-between-statements.js
    index 95e08736a9c56f..084651b6dff9d5 100644
    --- a/tools/node_modules/eslint/lib/rules/padding-line-between-statements.js
    +++ b/tools/node_modules/eslint/lib/rules/padding-line-between-statements.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to require or disallow newlines between statements
      * @author Toru Nagashima
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -383,6 +384,8 @@ const StatementTypes = {
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/quote-props.js b/tools/node_modules/eslint/lib/rules/quote-props.js
    index 8abab150c4e390..fe26eed77de580 100644
    --- a/tools/node_modules/eslint/lib/rules/quote-props.js
    +++ b/tools/node_modules/eslint/lib/rules/quote-props.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to flag non-quoted property names in object literals.
      * @author Mathias Bynens 
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -19,6 +20,8 @@ const keywords = require("./utils/keywords");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "suggestion",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/quotes.js b/tools/node_modules/eslint/lib/rules/quotes.js
    index 6eda7c0b40aef3..17d97dd697d1c4 100644
    --- a/tools/node_modules/eslint/lib/rules/quotes.js
    +++ b/tools/node_modules/eslint/lib/rules/quotes.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview A rule to choose between single and double quote marks
      * @author Matt DuVall , Brandon Payton
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -77,6 +78,8 @@ const AVOID_ESCAPE = "avoid-escape";
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/rest-spread-spacing.js b/tools/node_modules/eslint/lib/rules/rest-spread-spacing.js
    index 7791238081e27c..287e56f014a6b8 100644
    --- a/tools/node_modules/eslint/lib/rules/rest-spread-spacing.js
    +++ b/tools/node_modules/eslint/lib/rules/rest-spread-spacing.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Enforce spacing between rest and spread operators and their expressions.
      * @author Kai Cataldo
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -12,6 +13,8 @@
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/semi-spacing.js b/tools/node_modules/eslint/lib/rules/semi-spacing.js
    index 770f62d41f12e9..35a49d2c22b560 100644
    --- a/tools/node_modules/eslint/lib/rules/semi-spacing.js
    +++ b/tools/node_modules/eslint/lib/rules/semi-spacing.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Validates spacing before and after semicolon
      * @author Mathias Schreck
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -14,6 +15,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/semi-style.js b/tools/node_modules/eslint/lib/rules/semi-style.js
    index 67ed1e478e764c..caf2224df3d451 100644
    --- a/tools/node_modules/eslint/lib/rules/semi-style.js
    +++ b/tools/node_modules/eslint/lib/rules/semi-style.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to enforce location of semicolons.
      * @author Toru Nagashima
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -70,6 +71,8 @@ function isLastChild(node) {
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/semi.js b/tools/node_modules/eslint/lib/rules/semi.js
    index 6a473535d49bd3..01586b8492d1ce 100644
    --- a/tools/node_modules/eslint/lib/rules/semi.js
    +++ b/tools/node_modules/eslint/lib/rules/semi.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to flag missing semicolons.
      * @author Nicholas C. Zakas
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -18,6 +19,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/space-before-blocks.js b/tools/node_modules/eslint/lib/rules/space-before-blocks.js
    index a580a4f2249a0e..a4a5449e17fde3 100644
    --- a/tools/node_modules/eslint/lib/rules/space-before-blocks.js
    +++ b/tools/node_modules/eslint/lib/rules/space-before-blocks.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview A rule to ensure whitespace before blocks.
      * @author Mathias Schreck 
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -37,6 +38,8 @@ function isFunctionBody(node) {
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/space-before-function-paren.js b/tools/node_modules/eslint/lib/rules/space-before-function-paren.js
    index c5faa8cf4ddeb3..575a1597a74ecf 100644
    --- a/tools/node_modules/eslint/lib/rules/space-before-function-paren.js
    +++ b/tools/node_modules/eslint/lib/rules/space-before-function-paren.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to validate spacing before function paren.
      * @author Mathias Schreck 
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -17,6 +18,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/space-in-parens.js b/tools/node_modules/eslint/lib/rules/space-in-parens.js
    index c6c06d29a3f506..d15a64317f4d08 100644
    --- a/tools/node_modules/eslint/lib/rules/space-in-parens.js
    +++ b/tools/node_modules/eslint/lib/rules/space-in-parens.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Disallows or enforces spaces inside of parentheses.
      * @author Jonathan Rajavuori
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -13,6 +14,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/space-infix-ops.js b/tools/node_modules/eslint/lib/rules/space-infix-ops.js
    index 81a95f83bf217a..40071019480a57 100644
    --- a/tools/node_modules/eslint/lib/rules/space-infix-ops.js
    +++ b/tools/node_modules/eslint/lib/rules/space-infix-ops.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Require spaces around infix operators
      * @author Michael Ficarra
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -13,6 +14,8 @@ const { isEqToken } = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/space-unary-ops.js b/tools/node_modules/eslint/lib/rules/space-unary-ops.js
    index 381381d6e5d24f..aed43e7249eb9b 100644
    --- a/tools/node_modules/eslint/lib/rules/space-unary-ops.js
    +++ b/tools/node_modules/eslint/lib/rules/space-unary-ops.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview This rule should require or disallow spaces before or after unary operations.
      * @author Marcin Kumorek
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -17,6 +18,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/spaced-comment.js b/tools/node_modules/eslint/lib/rules/spaced-comment.js
    index 2eb7f0e3008d70..90ac7032d03f9d 100644
    --- a/tools/node_modules/eslint/lib/rules/spaced-comment.js
    +++ b/tools/node_modules/eslint/lib/rules/spaced-comment.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Source code for spaced-comments rule
      * @author Gyandeep Singh
    + * @deprecated in ESLint v8.53.0
      */
     "use strict";
     
    @@ -149,6 +150,8 @@ function createNeverStylePattern(markers) {
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "suggestion",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/switch-colon-spacing.js b/tools/node_modules/eslint/lib/rules/switch-colon-spacing.js
    index 45e401822a8725..3ea63ca0eed4fa 100644
    --- a/tools/node_modules/eslint/lib/rules/switch-colon-spacing.js
    +++ b/tools/node_modules/eslint/lib/rules/switch-colon-spacing.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to enforce spacing around colons of switch statements.
      * @author Toru Nagashima
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -18,6 +19,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/template-curly-spacing.js b/tools/node_modules/eslint/lib/rules/template-curly-spacing.js
    index cc9bbe306d51cc..1f8cc34c1d7c30 100644
    --- a/tools/node_modules/eslint/lib/rules/template-curly-spacing.js
    +++ b/tools/node_modules/eslint/lib/rules/template-curly-spacing.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to enforce spacing around embedded expressions of template strings
      * @author Toru Nagashima
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -18,6 +19,8 @@ const astUtils = require("./utils/ast-utils");
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/template-tag-spacing.js b/tools/node_modules/eslint/lib/rules/template-tag-spacing.js
    index 9bfdfc2288d10a..52e0bcf2073000 100644
    --- a/tools/node_modules/eslint/lib/rules/template-tag-spacing.js
    +++ b/tools/node_modules/eslint/lib/rules/template-tag-spacing.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to check spacing between template tags and their literals
      * @author Jonathan Wilsson
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -12,6 +13,8 @@
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/utils/ast-utils.js b/tools/node_modules/eslint/lib/rules/utils/ast-utils.js
    index bebb4d5168b30b..962bdde0af1b44 100644
    --- a/tools/node_modules/eslint/lib/rules/utils/ast-utils.js
    +++ b/tools/node_modules/eslint/lib/rules/utils/ast-utils.js
    @@ -1015,6 +1015,114 @@ function isDirective(node) {
         return node.type === "ExpressionStatement" && typeof node.directive === "string";
     }
     
    +/**
    + * Tests if a node appears at the beginning of an ancestor ExpressionStatement node.
    + * @param {ASTNode} node The node to check.
    + * @returns {boolean} Whether the node appears at the beginning of an ancestor ExpressionStatement node.
    + */
    +function isStartOfExpressionStatement(node) {
    +    const start = node.range[0];
    +    let ancestor = node;
    +
    +    while ((ancestor = ancestor.parent) && ancestor.range[0] === start) {
    +        if (ancestor.type === "ExpressionStatement") {
    +            return true;
    +        }
    +    }
    +    return false;
    +}
    +
    +/**
    + * Determines whether an opening parenthesis `(`, bracket `[` or backtick ``` ` ``` needs to be preceded by a semicolon.
    + * This opening parenthesis or bracket should be at the start of an `ExpressionStatement` or at the start of the body of an `ArrowFunctionExpression`.
    + * @type {(sourceCode: SourceCode, node: ASTNode) => boolean}
    + * @param {SourceCode} sourceCode The source code object.
    + * @param {ASTNode} node A node at the position where an opening parenthesis or bracket will be inserted.
    + * @returns {boolean} Whether a semicolon is required before the opening parenthesis or braket.
    + */
    +let needsPrecedingSemicolon;
    +
    +{
    +    const BREAK_OR_CONTINUE = new Set(["BreakStatement", "ContinueStatement"]);
    +
    +    // Declaration types that must contain a string Literal node at the end.
    +    const DECLARATIONS = new Set(["ExportAllDeclaration", "ExportNamedDeclaration", "ImportDeclaration"]);
    +
    +    const IDENTIFIER_OR_KEYWORD = new Set(["Identifier", "Keyword"]);
    +
    +    // Keywords that can immediately precede an ExpressionStatement node, mapped to the their node types.
    +    const NODE_TYPES_BY_KEYWORD = {
    +        __proto__: null,
    +        break: "BreakStatement",
    +        continue: "ContinueStatement",
    +        debugger: "DebuggerStatement",
    +        do: "DoWhileStatement",
    +        else: "IfStatement",
    +        return: "ReturnStatement",
    +        yield: "YieldExpression"
    +    };
    +
    +    /*
    +     * Before an opening parenthesis, postfix `++` and `--` always trigger ASI;
    +     * the tokens `:`, `;`, `{` and `=>` don't expect a semicolon, as that would count as an empty statement.
    +     */
    +    const PUNCTUATORS = new Set([":", ";", "{", "=>", "++", "--"]);
    +
    +    /*
    +     * Statements that can contain an `ExpressionStatement` after a closing parenthesis.
    +     * DoWhileStatement is an exception in that it always triggers ASI after the closing parenthesis.
    +     */
    +    const STATEMENTS = new Set([
    +        "DoWhileStatement",
    +        "ForInStatement",
    +        "ForOfStatement",
    +        "ForStatement",
    +        "IfStatement",
    +        "WhileStatement",
    +        "WithStatement"
    +    ]);
    +
    +    needsPrecedingSemicolon =
    +    function(sourceCode, node) {
    +        const prevToken = sourceCode.getTokenBefore(node);
    +
    +        if (!prevToken || prevToken.type === "Punctuator" && PUNCTUATORS.has(prevToken.value)) {
    +            return false;
    +        }
    +
    +        const prevNode = sourceCode.getNodeByRangeIndex(prevToken.range[0]);
    +
    +        if (isClosingParenToken(prevToken)) {
    +            return !STATEMENTS.has(prevNode.type);
    +        }
    +
    +        if (isClosingBraceToken(prevToken)) {
    +            return (
    +                prevNode.type === "BlockStatement" && prevNode.parent.type === "FunctionExpression" ||
    +                prevNode.type === "ClassBody" && prevNode.parent.type === "ClassExpression" ||
    +                prevNode.type === "ObjectExpression"
    +            );
    +        }
    +
    +        if (IDENTIFIER_OR_KEYWORD.has(prevToken.type)) {
    +            if (BREAK_OR_CONTINUE.has(prevNode.parent.type)) {
    +                return false;
    +            }
    +
    +            const keyword = prevToken.value;
    +            const nodeType = NODE_TYPES_BY_KEYWORD[keyword];
    +
    +            return prevNode.type !== nodeType;
    +        }
    +
    +        if (prevToken.type === "String") {
    +            return !DECLARATIONS.has(prevNode.parent.type);
    +        }
    +
    +        return true;
    +    };
    +}
    +
     //------------------------------------------------------------------------------
     // Public Interface
     //------------------------------------------------------------------------------
    @@ -2168,5 +2276,7 @@ module.exports = {
         getModuleExportName,
         isConstant,
         isTopLevelExpressionStatement,
    -    isDirective
    +    isDirective,
    +    isStartOfExpressionStatement,
    +    needsPrecedingSemicolon
     };
    diff --git a/tools/node_modules/eslint/lib/rules/wrap-iife.js b/tools/node_modules/eslint/lib/rules/wrap-iife.js
    index 4c448fa79930ea..518071067db13e 100644
    --- a/tools/node_modules/eslint/lib/rules/wrap-iife.js
    +++ b/tools/node_modules/eslint/lib/rules/wrap-iife.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to flag when IIFE is not wrapped in parens
      * @author Ilya Volodin
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -40,6 +41,8 @@ function isCalleeOfNewExpression(node) {
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/wrap-regex.js b/tools/node_modules/eslint/lib/rules/wrap-regex.js
    index 8166c252f3c25f..9e2808d60c7023 100644
    --- a/tools/node_modules/eslint/lib/rules/wrap-regex.js
    +++ b/tools/node_modules/eslint/lib/rules/wrap-regex.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to flag when regex literals are not wrapped in parens
      * @author Matt DuVall 
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -12,6 +13,8 @@
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/rules/yield-star-spacing.js b/tools/node_modules/eslint/lib/rules/yield-star-spacing.js
    index 9f9d918ae6c576..9a67b78d25f034 100644
    --- a/tools/node_modules/eslint/lib/rules/yield-star-spacing.js
    +++ b/tools/node_modules/eslint/lib/rules/yield-star-spacing.js
    @@ -1,6 +1,7 @@
     /**
      * @fileoverview Rule to check the spacing around the * in yield* expressions.
      * @author Bryan Smith
    + * @deprecated in ESLint v8.53.0
      */
     
     "use strict";
    @@ -12,6 +13,8 @@
     /** @type {import('../shared/types').Rule} */
     module.exports = {
         meta: {
    +        deprecated: true,
    +        replacedBy: [],
             type: "layout",
     
             docs: {
    diff --git a/tools/node_modules/eslint/lib/shared/severity.js b/tools/node_modules/eslint/lib/shared/severity.js
    new file mode 100644
    index 00000000000000..6b21469a9aaff0
    --- /dev/null
    +++ b/tools/node_modules/eslint/lib/shared/severity.js
    @@ -0,0 +1,49 @@
    +/**
    + * @fileoverview Helpers for severity values (e.g. normalizing different types).
    + * @author Bryan Mishkin
    + */
    +
    +"use strict";
    +
    +/**
    + * Convert severity value of different types to a string.
    + * @param {string|number} severity severity value
    + * @throws error if severity is invalid
    + * @returns {string} severity string
    + */
    +function normalizeSeverityToString(severity) {
    +    if ([2, "2", "error"].includes(severity)) {
    +        return "error";
    +    }
    +    if ([1, "1", "warn"].includes(severity)) {
    +        return "warn";
    +    }
    +    if ([0, "0", "off"].includes(severity)) {
    +        return "off";
    +    }
    +    throw new Error(`Invalid severity value: ${severity}`);
    +}
    +
    +/**
    + * Convert severity value of different types to a number.
    + * @param {string|number} severity severity value
    + * @throws error if severity is invalid
    + * @returns {number} severity number
    + */
    +function normalizeSeverityToNumber(severity) {
    +    if ([2, "2", "error"].includes(severity)) {
    +        return 2;
    +    }
    +    if ([1, "1", "warn"].includes(severity)) {
    +        return 1;
    +    }
    +    if ([0, "0", "off"].includes(severity)) {
    +        return 0;
    +    }
    +    throw new Error(`Invalid severity value: ${severity}`);
    +}
    +
    +module.exports = {
    +    normalizeSeverityToString,
    +    normalizeSeverityToNumber
    +};
    diff --git a/tools/node_modules/eslint/lib/source-code/source-code.js b/tools/node_modules/eslint/lib/source-code/source-code.js
    index 4bbd5ae3a5cb69..236f6b5c6cc1d7 100644
    --- a/tools/node_modules/eslint/lib/source-code/source-code.js
    +++ b/tools/node_modules/eslint/lib/source-code/source-code.js
    @@ -212,24 +212,6 @@ function isSpaceBetween(sourceCode, first, second, checkInsideOfJSXText) {
     // Directive Comments
     //-----------------------------------------------------------------------------
     
    -/**
    - * Extract the directive and the justification from a given directive comment and trim them.
    - * @param {string} value The comment text to extract.
    - * @returns {{directivePart: string, justificationPart: string}} The extracted directive and justification.
    - */
    -function extractDirectiveComment(value) {
    -    const match = /\s-{2,}\s/u.exec(value);
    -
    -    if (!match) {
    -        return { directivePart: value.trim(), justificationPart: "" };
    -    }
    -
    -    const directive = value.slice(0, match.index).trim();
    -    const justification = value.slice(match.index + match[0].length).trim();
    -
    -    return { directivePart: directive, justificationPart: justification };
    -}
    -
     /**
      * Ensures that variables representing built-in properties of the Global Object,
      * and any globals declared by special block comments, are present in the global
    @@ -921,7 +903,7 @@ class SourceCode extends TokenStore {
                     return false;
                 }
     
    -            const { directivePart } = extractDirectiveComment(comment.value);
    +            const { directivePart } = commentParser.extractDirectiveComment(comment.value);
     
                 const directiveMatch = directivesPattern.exec(directivePart);
     
    @@ -977,10 +959,7 @@ class SourceCode extends TokenStore {
     
             this.getInlineConfigNodes().forEach(comment => {
     
    -            const { directivePart } = extractDirectiveComment(comment.value);
    -            const match = directivesPattern.exec(directivePart);
    -            const directiveText = match[1];
    -            const directiveValue = directivePart.slice(match.index + directiveText.length);
    +            const { directiveText, directiveValue } = commentParser.parseDirective(comment);
     
                 switch (directiveText) {
                     case "exported":
    diff --git a/tools/node_modules/eslint/node_modules/@babel/code-frame/lib/index.js b/tools/node_modules/eslint/node_modules/@babel/code-frame/lib/index.js
    index 74495b0d852b72..2f900ebacdc6cd 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/code-frame/lib/index.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/code-frame/lib/index.js
    @@ -7,8 +7,8 @@ exports.codeFrameColumns = codeFrameColumns;
     exports.default = _default;
     var _highlight = require("@babel/highlight");
     var _chalk = _interopRequireWildcard(require("chalk"), true);
    -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
    -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
    +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
    +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
     let chalkWithForcedColor = undefined;
     function getChalk(forceColor) {
       if (forceColor) {
    diff --git a/tools/node_modules/eslint/node_modules/@babel/code-frame/package.json b/tools/node_modules/eslint/node_modules/@babel/code-frame/package.json
    index c3afdc1557675c..46a9ba9db12f07 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/code-frame/package.json
    +++ b/tools/node_modules/eslint/node_modules/@babel/code-frame/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@babel/code-frame",
    -  "version": "7.22.13",
    +  "version": "7.23.5",
       "description": "Generate errors that contain a code frame that point to source locations.",
       "author": "The Babel Team (https://babel.dev/team)",
       "homepage": "https://babel.dev/docs/en/next/babel-code-frame",
    @@ -16,11 +16,11 @@
       },
       "main": "./lib/index.js",
       "dependencies": {
    -    "@babel/highlight": "^7.22.13",
    +    "@babel/highlight": "^7.23.4",
         "chalk": "^2.4.2"
       },
       "devDependencies": {
    -    "import-meta-resolve": "^3.0.0",
    +    "import-meta-resolve": "^4.0.0",
         "strip-ansi": "^4.0.0"
       },
       "engines": {
    diff --git a/tools/node_modules/eslint/node_modules/@babel/compat-data/data/overlapping-plugins.json b/tools/node_modules/eslint/node_modules/@babel/compat-data/data/overlapping-plugins.json
    index 94fda05db6b8e6..8b34821145db7a 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/compat-data/data/overlapping-plugins.json
    +++ b/tools/node_modules/eslint/node_modules/@babel/compat-data/data/overlapping-plugins.json
    @@ -21,5 +21,11 @@
       ],
       "proposal-optional-chaining": [
         "bugfix/transform-v8-spread-parameters-in-optional-chaining"
    +  ],
    +  "transform-class-properties": [
    +    "bugfix/transform-v8-static-class-fields-redefine-readonly"
    +  ],
    +  "proposal-class-properties": [
    +    "bugfix/transform-v8-static-class-fields-redefine-readonly"
       ]
     }
    diff --git a/tools/node_modules/eslint/node_modules/@babel/compat-data/data/plugins.json b/tools/node_modules/eslint/node_modules/@babel/compat-data/data/plugins.json
    index 266426827131f0..dcf37fdf9447b9 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/compat-data/data/plugins.json
    +++ b/tools/node_modules/eslint/node_modules/@babel/compat-data/data/plugins.json
    @@ -10,6 +10,19 @@
         "opera_mobile": "75",
         "electron": "24.0"
       },
    +  "bugfix/transform-v8-static-class-fields-redefine-readonly": {
    +    "chrome": "98",
    +    "opera": "84",
    +    "edge": "98",
    +    "firefox": "95",
    +    "safari": "15",
    +    "node": "12",
    +    "deno": "1.18",
    +    "ios": "15",
    +    "samsung": "11",
    +    "opera_mobile": "52",
    +    "electron": "17.0"
    +  },
       "transform-class-static-block": {
         "chrome": "94",
         "opera": "80",
    diff --git a/tools/node_modules/eslint/node_modules/@babel/compat-data/package.json b/tools/node_modules/eslint/node_modules/@babel/compat-data/package.json
    index 191a1440fd7b86..a3d3f20c927047 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/compat-data/package.json
    +++ b/tools/node_modules/eslint/node_modules/@babel/compat-data/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@babel/compat-data",
    -  "version": "7.22.20",
    +  "version": "7.23.5",
       "author": "The Babel Team (https://babel.dev/team)",
       "license": "MIT",
       "description": "",
    diff --git a/tools/node_modules/eslint/node_modules/@babel/core/lib/config/config-chain.js b/tools/node_modules/eslint/node_modules/@babel/core/lib/config/config-chain.js
    index cda396fe6d1340..59292a7ee44153 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/core/lib/config/config-chain.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/core/lib/config/config-chain.js
    @@ -39,14 +39,13 @@ function* buildPresetChain(arg, context) {
         files: new Set()
       };
     }
    -const buildPresetChainWalker = makeChainWalker({
    +const buildPresetChainWalker = exports.buildPresetChainWalker = makeChainWalker({
       root: preset => loadPresetDescriptors(preset),
       env: (preset, envName) => loadPresetEnvDescriptors(preset)(envName),
       overrides: (preset, index) => loadPresetOverridesDescriptors(preset)(index),
       overridesEnv: (preset, index, envName) => loadPresetOverridesEnvDescriptors(preset)(index)(envName),
       createLogger: () => () => {}
     });
    -exports.buildPresetChainWalker = buildPresetChainWalker;
     const loadPresetDescriptors = (0, _caching.makeWeakCacheSync)(preset => buildRootDescriptors(preset, preset.alias, _configDescriptors.createUncachedDescriptors));
     const loadPresetEnvDescriptors = (0, _caching.makeWeakCacheSync)(preset => (0, _caching.makeStrongCacheSync)(envName => buildEnvDescriptors(preset, preset.alias, _configDescriptors.createUncachedDescriptors, envName)));
     const loadPresetOverridesDescriptors = (0, _caching.makeWeakCacheSync)(preset => (0, _caching.makeStrongCacheSync)(index => buildOverrideDescriptors(preset, preset.alias, _configDescriptors.createUncachedDescriptors, index)));
    @@ -190,7 +189,7 @@ const loadFileChainWalker = makeChainWalker({
     });
     function* loadFileChain(input, context, files, baseLogger) {
       const chain = yield* loadFileChainWalker(input, context, files, baseLogger);
    -  chain == null ? void 0 : chain.files.add(input.filepath);
    +  chain == null || chain.files.add(input.filepath);
       return chain;
     }
     const loadFileDescriptors = (0, _caching.makeWeakCacheSync)(file => buildRootDescriptors(file, file.filepath, _configDescriptors.createUncachedDescriptors));
    diff --git a/tools/node_modules/eslint/node_modules/@babel/core/lib/config/files/configuration.js b/tools/node_modules/eslint/node_modules/@babel/core/lib/config/files/configuration.js
    index 34327ee52c46f5..50adfd86dea6d6 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/core/lib/config/files/configuration.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/core/lib/config/files/configuration.js
    @@ -53,8 +53,7 @@ var _configError = require("../../errors/config-error.js");
     var fs = require("../../gensync-utils/fs.js");
     var _rewriteStackTrace = require("../../errors/rewrite-stack-trace.js");
     const debug = _debug()("babel:config:loading:files:configuration");
    -const ROOT_CONFIG_FILENAMES = ["babel.config.js", "babel.config.cjs", "babel.config.mjs", "babel.config.json", "babel.config.cts"];
    -exports.ROOT_CONFIG_FILENAMES = ROOT_CONFIG_FILENAMES;
    +const ROOT_CONFIG_FILENAMES = exports.ROOT_CONFIG_FILENAMES = ["babel.config.js", "babel.config.cjs", "babel.config.mjs", "babel.config.json", "babel.config.cts"];
     const RELATIVE_CONFIG_FILENAMES = [".babelrc", ".babelrc.js", ".babelrc.cjs", ".babelrc.mjs", ".babelrc.json", ".babelrc.cts"];
     const BABELIGNORE_FILENAME = ".babelignore";
     const runConfig = (0, _caching.makeWeakCache)(function* runConfig(options, cache) {
    @@ -78,7 +77,7 @@ function* readConfigCode(filepath, data) {
         throw new _configError.default(`Configuration should be an exported JavaScript object.`, filepath);
       }
       if (typeof options.then === "function") {
    -    options.catch == null ? void 0 : options.catch(() => {});
    +    options.catch == null || options.catch(() => {});
         throw new _configError.default(`You appear to be using an async configuration, ` + `which your current version of Babel does not support. ` + `We may add support for this in the future, ` + `but if you're on the most recent version of @babel/core and still ` + `seeing this error, then you'll need to synchronously return your config.`, filepath);
       }
       if (cacheNeedsConfiguration) throwConfigError(filepath);
    diff --git a/tools/node_modules/eslint/node_modules/@babel/core/lib/config/files/index-browser.js b/tools/node_modules/eslint/node_modules/@babel/core/lib/config/files/index-browser.js
    index 903b795735e03d..d8ba7dbc8d7e96 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/core/lib/config/files/index-browser.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/core/lib/config/files/index-browser.js
    @@ -40,8 +40,7 @@ function* loadConfig(name, dirname, envName, caller) {
     function* resolveShowConfigPath(dirname) {
       return null;
     }
    -const ROOT_CONFIG_FILENAMES = [];
    -exports.ROOT_CONFIG_FILENAMES = ROOT_CONFIG_FILENAMES;
    +const ROOT_CONFIG_FILENAMES = exports.ROOT_CONFIG_FILENAMES = [];
     function resolvePlugin(name, dirname) {
       return null;
     }
    diff --git a/tools/node_modules/eslint/node_modules/@babel/core/lib/config/files/module-types.js b/tools/node_modules/eslint/node_modules/@babel/core/lib/config/files/module-types.js
    index 473100e77f4160..e27f442923beb4 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/core/lib/config/files/module-types.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/core/lib/config/files/module-types.js
    @@ -44,8 +44,7 @@ let import_;
     try {
       import_ = require("./import.cjs");
     } catch (_unused) {}
    -const supportsESM = _semver().satisfies(process.versions.node, "^12.17 || >=13.2");
    -exports.supportsESM = supportsESM;
    +const supportsESM = exports.supportsESM = _semver().satisfies(process.versions.node, "^12.17 || >=13.2");
     function* loadCodeDefault(filepath, asyncError) {
       switch (_path().extname(filepath)) {
         case ".cjs":
    diff --git a/tools/node_modules/eslint/node_modules/@babel/core/lib/config/files/plugins.js b/tools/node_modules/eslint/node_modules/@babel/core/lib/config/files/plugins.js
    index 6fbe8db19cc975..25435ae424af77 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/core/lib/config/files/plugins.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/core/lib/config/files/plugins.js
    @@ -30,6 +30,13 @@ function _url() {
       return data;
     }
     var _importMetaResolve = require("../../vendor/import-meta-resolve.js");
    +function _fs() {
    +  const data = require("fs");
    +  _fs = function () {
    +    return data;
    +  };
    +  return data;
    +}
     const debug = _debug()("babel:config:loading:files:plugins");
     const EXACT_RE = /^module:/;
     const BABEL_PLUGIN_PREFIX_RE = /^(?!@|module:|[^/]+\/|babel-plugin-)/;
    @@ -39,10 +46,8 @@ const BABEL_PRESET_ORG_RE = /^(@babel\/)(?!preset-|[^/]+\/)/;
     const OTHER_PLUGIN_ORG_RE = /^(@(?!babel\/)[^/]+\/)(?![^/]*babel-plugin(?:-|\/|$)|[^/]+\/)/;
     const OTHER_PRESET_ORG_RE = /^(@(?!babel\/)[^/]+\/)(?![^/]*babel-preset(?:-|\/|$)|[^/]+\/)/;
     const OTHER_ORG_DEFAULT_RE = /^(@(?!babel$)[^/]+)$/;
    -const resolvePlugin = resolveStandardizedName.bind(null, "plugin");
    -exports.resolvePlugin = resolvePlugin;
    -const resolvePreset = resolveStandardizedName.bind(null, "preset");
    -exports.resolvePreset = resolvePreset;
    +const resolvePlugin = exports.resolvePlugin = resolveStandardizedName.bind(null, "plugin");
    +const resolvePreset = exports.resolvePreset = resolveStandardizedName.bind(null, "preset");
     function* loadPlugin(name, dirname) {
       const filepath = resolvePlugin(name, dirname, yield* (0, _async.isAsync)());
       const value = yield* requireModule("plugin", filepath);
    @@ -165,7 +170,13 @@ function resolveStandardizedName(type, name, dirname, resolveESM) {
         return resolveStandardizedNameForRequire(type, name, dirname);
       }
       try {
    -    return resolveStandardizedNameForImport(type, name, dirname);
    +    const resolved = resolveStandardizedNameForImport(type, name, dirname);
    +    if (!(0, _fs().existsSync)(resolved)) {
    +      throw Object.assign(new Error(`Could not resolve "${name}" in file ${dirname}.`), {
    +        type: "MODULE_NOT_FOUND"
    +      });
    +    }
    +    return resolved;
       } catch (e) {
         try {
           return resolveStandardizedNameForRequire(type, name, dirname);
    diff --git a/tools/node_modules/eslint/node_modules/@babel/core/lib/config/full.js b/tools/node_modules/eslint/node_modules/@babel/core/lib/config/full.js
    index 3c1e6f7813244d..6b8c2959dea179 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/core/lib/config/full.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/core/lib/config/full.js
    @@ -31,7 +31,7 @@ var _plugins = require("./validation/plugins.js");
     var _configApi = require("./helpers/config-api.js");
     var _partial = require("./partial.js");
     var _configError = require("../errors/config-error.js");
    -var _default = _gensync()(function* loadFullConfig(inputOpts) {
    +var _default = exports.default = _gensync()(function* loadFullConfig(inputOpts) {
       var _opts$assumptions;
       const result = yield* (0, _partial.default)(inputOpts);
       if (!result) {
    @@ -150,7 +150,6 @@ var _default = _gensync()(function* loadFullConfig(inputOpts) {
         externalDependencies: (0, _deepArray.finalize)(externalDependencies)
       };
     });
    -exports.default = _default;
     function enhanceError(context, fn) {
       return function* (arg1, arg2) {
         try {
    @@ -273,7 +272,7 @@ const validatePreset = (preset, context, descriptor) => {
           options
         } = preset;
         validateIfOptionNeedsFilename(options, descriptor);
    -    (_options$overrides = options.overrides) == null ? void 0 : _options$overrides.forEach(overrideOptions => validateIfOptionNeedsFilename(overrideOptions, descriptor));
    +    (_options$overrides = options.overrides) == null || _options$overrides.forEach(overrideOptions => validateIfOptionNeedsFilename(overrideOptions, descriptor));
       }
     };
     const instantiatePreset = (0, _caching.makeWeakCacheSync)(({
    diff --git a/tools/node_modules/eslint/node_modules/@babel/core/lib/config/helpers/config-api.js b/tools/node_modules/eslint/node_modules/@babel/core/lib/config/helpers/config-api.js
    index c59bb59442dd18..c3d55ceabefb2a 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/core/lib/config/helpers/config-api.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/core/lib/config/helpers/config-api.js
    @@ -64,7 +64,6 @@ function assertVersion(range) {
       if (typeof range !== "string") {
         throw new Error("Expected string or integer value.");
       }
    -  ;
       if (_semver().satisfies(_index.version, range)) return;
       const limit = Error.stackTraceLimit;
       if (typeof limit === "number" && limit < 25) {
    diff --git a/tools/node_modules/eslint/node_modules/@babel/core/lib/config/printer.js b/tools/node_modules/eslint/node_modules/@babel/core/lib/config/printer.js
    index 3fb9ced37878d5..3ac2c0753db363 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/core/lib/config/printer.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/core/lib/config/printer.js
    @@ -11,11 +11,10 @@ function _gensync() {
       };
       return data;
     }
    -const ChainFormatter = {
    +const ChainFormatter = exports.ChainFormatter = {
       Programmatic: 0,
       Config: 1
     };
    -exports.ChainFormatter = ChainFormatter;
     const Formatter = {
       title(type, callerName, filepath) {
         let title = "";
    diff --git a/tools/node_modules/eslint/node_modules/@babel/core/lib/config/validation/option-assertions.js b/tools/node_modules/eslint/node_modules/@babel/core/lib/config/validation/option-assertions.js
    index db245b451a681e..4cecb99ca4b0c3 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/core/lib/config/validation/option-assertions.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/core/lib/config/validation/option-assertions.js
    @@ -132,7 +132,7 @@ function assertArray(loc, value) {
     }
     function assertIgnoreList(loc, value) {
       const arr = assertArray(loc, value);
    -  arr == null ? void 0 : arr.forEach((item, i) => assertIgnoreItem(access(loc, i), item));
    +  arr == null || arr.forEach((item, i) => assertIgnoreItem(access(loc, i), item));
       return arr;
     }
     function assertIgnoreItem(loc, value) {
    diff --git a/tools/node_modules/eslint/node_modules/@babel/core/lib/config/validation/options.js b/tools/node_modules/eslint/node_modules/@babel/core/lib/config/validation/options.js
    index f8f17039ff0d14..e8af7f23ae99bd 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/core/lib/config/validation/options.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/core/lib/config/validation/options.js
    @@ -71,8 +71,7 @@ const COMMON_VALIDATORS = {
       });
     }
     const knownAssumptions = ["arrayLikeIsIterable", "constantReexports", "constantSuper", "enumerableModuleMeta", "ignoreFunctionLength", "ignoreToPrimitiveHint", "iterableIsArray", "mutableTemplateObject", "noClassCalls", "noDocumentAll", "noIncompleteNsImportDetection", "noNewArrows", "objectRestNoSymbols", "privateFieldsAsSymbols", "privateFieldsAsProperties", "pureGetters", "setClassMethods", "setComputedProperties", "setPublicClassFields", "setSpreadProperties", "skipForOfIteratorClosing", "superIsCallableConstructor"];
    -const assumptionsNames = new Set(knownAssumptions);
    -exports.assumptionsNames = assumptionsNames;
    +const assumptionsNames = exports.assumptionsNames = new Set(knownAssumptions);
     function getSource(loc) {
       return loc.type === "root" ? loc.source : getSource(loc.parent);
     }
    diff --git a/tools/node_modules/eslint/node_modules/@babel/core/lib/config/validation/removed.js b/tools/node_modules/eslint/node_modules/@babel/core/lib/config/validation/removed.js
    index 57270ea93b3bf4..9bd436e88cd92b 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/core/lib/config/validation/removed.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/core/lib/config/validation/removed.js
    @@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
       value: true
     });
     exports.default = void 0;
    -var _default = {
    +var _default = exports.default = {
       auxiliaryComment: {
         message: "Use `auxiliaryCommentBefore` or `auxiliaryCommentAfter`"
       },
    @@ -63,7 +63,6 @@ var _default = {
         message: "The `sourceMapTarget` option has been removed because it makes more sense for the tooling " + "that calls Babel to assign `map.file` themselves."
       }
     };
    -exports.default = _default;
     0 && 0;
     
     //# sourceMappingURL=removed.js.map
    diff --git a/tools/node_modules/eslint/node_modules/@babel/core/lib/gensync-utils/async.js b/tools/node_modules/eslint/node_modules/@babel/core/lib/gensync-utils/async.js
    index 9cbe3dc3ef176e..9e00fde8b5f47e 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/core/lib/gensync-utils/async.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/core/lib/gensync-utils/async.js
    @@ -20,11 +20,10 @@ function _asyncToGenerator(fn) { return function () { var self = this, args = ar
     const runGenerator = _gensync()(function* (item) {
       return yield* item;
     });
    -const isAsync = _gensync()({
    +const isAsync = exports.isAsync = _gensync()({
       sync: () => false,
       errback: cb => cb(null, true)
     });
    -exports.isAsync = isAsync;
     function maybeAsync(fn, message) {
       return _gensync()({
         sync(...args) {
    @@ -55,7 +54,7 @@ function forwardAsync(action, cb) {
         return cb(adapted);
       });
     }
    -const onFirstPause = _gensync()({
    +const onFirstPause = exports.onFirstPause = _gensync()({
       name: "onFirstPause",
       arity: 2,
       sync: function (item) {
    @@ -72,8 +71,7 @@ const onFirstPause = _gensync()({
         }
       }
     });
    -exports.onFirstPause = onFirstPause;
    -const waitFor = _gensync()({
    +const waitFor = exports.waitFor = _gensync()({
       sync: x => x,
       async: function () {
         var _ref2 = _asyncToGenerator(function* (x) {
    @@ -84,7 +82,6 @@ const waitFor = _gensync()({
         };
       }()
     });
    -exports.waitFor = waitFor;
     function isThenable(val) {
       return !!val && (typeof val === "object" || typeof val === "function") && !!val.then && typeof val.then === "function";
     }
    diff --git a/tools/node_modules/eslint/node_modules/@babel/core/lib/gensync-utils/fs.js b/tools/node_modules/eslint/node_modules/@babel/core/lib/gensync-utils/fs.js
    index db7f3d1d39db7b..b842df84d9d815 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/core/lib/gensync-utils/fs.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/core/lib/gensync-utils/fs.js
    @@ -18,16 +18,14 @@ function _gensync() {
       };
       return data;
     }
    -const readFile = _gensync()({
    +const readFile = exports.readFile = _gensync()({
       sync: _fs().readFileSync,
       errback: _fs().readFile
     });
    -exports.readFile = readFile;
    -const stat = _gensync()({
    +const stat = exports.stat = _gensync()({
       sync: _fs().statSync,
       errback: _fs().stat
     });
    -exports.stat = stat;
     0 && 0;
     
     //# sourceMappingURL=fs.js.map
    diff --git a/tools/node_modules/eslint/node_modules/@babel/core/lib/index.js b/tools/node_modules/eslint/node_modules/@babel/core/lib/index.js
    index 76f15cfb6c403f..7c3fbe200be465 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/core/lib/index.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/core/lib/index.js
    @@ -224,10 +224,8 @@ var _transformAst = require("./transform-ast.js");
     var _parse = require("./parse.js");
     var thisFile = require("./index.js");
     ;
    -const version = "7.23.0";
    -exports.version = version;
    -const DEFAULT_EXTENSIONS = Object.freeze([".js", ".jsx", ".es6", ".es", ".mjs", ".cjs"]);
    -exports.DEFAULT_EXTENSIONS = DEFAULT_EXTENSIONS;
    +const version = exports.version = "7.23.6";
    +const DEFAULT_EXTENSIONS = exports.DEFAULT_EXTENSIONS = Object.freeze([".js", ".jsx", ".es6", ".es", ".mjs", ".cjs"]);
     ;
     {
       exports.OptionManager = class OptionManager {
    diff --git a/tools/node_modules/eslint/node_modules/@babel/core/lib/parse.js b/tools/node_modules/eslint/node_modules/@babel/core/lib/parse.js
    index 0aaa535e1f1c08..7e4114245f7cd2 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/core/lib/parse.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/core/lib/parse.js
    @@ -24,7 +24,7 @@ const parseRunner = _gensync()(function* parse(code, opts) {
       }
       return yield* (0, _index2.default)(config.passes, (0, _normalizeOpts.default)(config), code);
     });
    -const parse = function parse(code, opts, callback) {
    +const parse = exports.parse = function parse(code, opts, callback) {
       if (typeof opts === "function") {
         callback = opts;
         opts = undefined;
    @@ -36,7 +36,6 @@ const parse = function parse(code, opts, callback) {
       }
       (0, _rewriteStackTrace.beginHiddenCallStack)(parseRunner.errback)(code, opts, callback);
     };
    -exports.parse = parse;
     function parseSync(...args) {
       return (0, _rewriteStackTrace.beginHiddenCallStack)(parseRunner.sync)(...args);
     }
    diff --git a/tools/node_modules/eslint/node_modules/@babel/core/lib/transform-ast.js b/tools/node_modules/eslint/node_modules/@babel/core/lib/transform-ast.js
    index 0aad935167e983..0a86cd10d4dd93 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/core/lib/transform-ast.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/core/lib/transform-ast.js
    @@ -22,7 +22,7 @@ const transformFromAstRunner = _gensync()(function* (ast, code, opts) {
       if (!ast) throw new Error("No AST given");
       return yield* (0, _index2.run)(config, code, ast);
     });
    -const transformFromAst = function transformFromAst(ast, code, optsOrCallback, maybeCallback) {
    +const transformFromAst = exports.transformFromAst = function transformFromAst(ast, code, optsOrCallback, maybeCallback) {
       let opts;
       let callback;
       if (typeof optsOrCallback === "function") {
    @@ -39,7 +39,6 @@ const transformFromAst = function transformFromAst(ast, code, optsOrCallback, ma
       }
       (0, _rewriteStackTrace.beginHiddenCallStack)(transformFromAstRunner.errback)(ast, code, opts, callback);
     };
    -exports.transformFromAst = transformFromAst;
     function transformFromAstSync(...args) {
       return (0, _rewriteStackTrace.beginHiddenCallStack)(transformFromAstRunner.sync)(...args);
     }
    diff --git a/tools/node_modules/eslint/node_modules/@babel/core/lib/transform-file-browser.js b/tools/node_modules/eslint/node_modules/@babel/core/lib/transform-file-browser.js
    index f81925ad2b52e3..85768097927851 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/core/lib/transform-file-browser.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/core/lib/transform-file-browser.js
    @@ -6,13 +6,12 @@ Object.defineProperty(exports, "__esModule", {
     exports.transformFile = void 0;
     exports.transformFileAsync = transformFileAsync;
     exports.transformFileSync = transformFileSync;
    -const transformFile = function transformFile(filename, opts, callback) {
    +const transformFile = exports.transformFile = function transformFile(filename, opts, callback) {
       if (typeof opts === "function") {
         callback = opts;
       }
       callback(new Error("Transforming files is not supported in browsers"), null);
     };
    -exports.transformFile = transformFile;
     function transformFileSync() {
       throw new Error("Transforming files is not supported in browsers");
     }
    diff --git a/tools/node_modules/eslint/node_modules/@babel/core/lib/transform.js b/tools/node_modules/eslint/node_modules/@babel/core/lib/transform.js
    index bc1a2c076d01df..be5570553dac22 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/core/lib/transform.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/core/lib/transform.js
    @@ -21,7 +21,7 @@ const transformRunner = _gensync()(function* transform(code, opts) {
       if (config === null) return null;
       return yield* (0, _index2.run)(config, code);
     });
    -const transform = function transform(code, optsOrCallback, maybeCallback) {
    +const transform = exports.transform = function transform(code, optsOrCallback, maybeCallback) {
       let opts;
       let callback;
       if (typeof optsOrCallback === "function") {
    @@ -38,7 +38,6 @@ const transform = function transform(code, optsOrCallback, maybeCallback) {
       }
       (0, _rewriteStackTrace.beginHiddenCallStack)(transformRunner.errback)(code, opts, callback);
     };
    -exports.transform = transform;
     function transformSync(...args) {
       return (0, _rewriteStackTrace.beginHiddenCallStack)(transformRunner.sync)(...args);
     }
    diff --git a/tools/node_modules/eslint/node_modules/@babel/core/lib/vendor/import-meta-resolve.js b/tools/node_modules/eslint/node_modules/@babel/core/lib/vendor/import-meta-resolve.js
    index 52d20975920428..eae3148cef362e 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/core/lib/vendor/import-meta-resolve.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/core/lib/vendor/import-meta-resolve.js
    @@ -61,9 +61,8 @@ function _util() {
       };
       return data;
     }
    -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
    -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
    -const isWindows = _process().platform === 'win32';
    +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
    +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
     const own$1 = {}.hasOwnProperty;
     const classRegExp = /^([A-Z][a-z\d]*)+$/;
     const kTypes = new Set(['string', 'function', 'number', 'object', 'Function', 'Object', 'boolean', 'bigint', 'symbol']);
    @@ -141,8 +140,8 @@ codes.ERR_INVALID_PACKAGE_TARGET = createError('ERR_INVALID_PACKAGE_TARGET', (pk
       }
       return `Invalid "${isImport ? 'imports' : 'exports'}" target ${JSON.stringify(target)} defined for '${key}' in the package config ${pkgPath}package.json${base ? ` imported from ${base}` : ''}${relError ? '; targets must start with "./"' : ''}`;
     }, Error);
    -codes.ERR_MODULE_NOT_FOUND = createError('ERR_MODULE_NOT_FOUND', (path, base, type = 'package') => {
    -  return `Cannot find ${type} '${path}' imported from ${base}`;
    +codes.ERR_MODULE_NOT_FOUND = createError('ERR_MODULE_NOT_FOUND', (path, base, exactUrl = false) => {
    +  return `Cannot find ${exactUrl ? 'module' : 'package'} '${path}' imported from ${base}`;
     }, Error);
     codes.ERR_NETWORK_IMPORT_DISALLOWED = createError('ERR_NETWORK_IMPORT_DISALLOWED', "import of '%s' by %s is not supported: %s", Error);
     codes.ERR_PACKAGE_IMPORT_NOT_DEFINED = createError('ERR_PACKAGE_IMPORT_NOT_DEFINED', (specifier, packagePath, base) => {
    @@ -164,14 +163,6 @@ codes.ERR_INVALID_ARG_VALUE = createError('ERR_INVALID_ARG_VALUE', (name, value,
       const type = name.includes('.') ? 'property' : 'argument';
       return `The ${type} '${name}' ${reason}. Received ${inspected}`;
     }, TypeError);
    -codes.ERR_UNSUPPORTED_ESM_URL_SCHEME = createError('ERR_UNSUPPORTED_ESM_URL_SCHEME', (url, supported) => {
    -  let message = `Only URLs with a scheme in: ${formatList(supported)} are supported by the default ESM loader`;
    -  if (isWindows && url.protocol.length === 2) {
    -    message += '. On Windows, absolute paths must be valid file:// URLs';
    -  }
    -  message += `. Received protocol '${url.protocol}'`;
    -  return message;
    -}, Error);
     function createError(sym, value, def) {
       messages.set(sym, value);
       return makeNodeErrorWithCode(def, sym);
    @@ -272,89 +263,93 @@ function determineSpecificType(value) {
       }
       return `type ${typeof value} (${inspected})`;
     }
    +const hasOwnProperty$1 = {}.hasOwnProperty;
    +const {
    +  ERR_INVALID_PACKAGE_CONFIG: ERR_INVALID_PACKAGE_CONFIG$1
    +} = codes;
    +const cache = new Map();
     const reader = {
       read
     };
     var packageJsonReader = reader;
    -function read(jsonPath) {
    -  try {
    -    const string = _fs().default.readFileSync(_path().toNamespacedPath(_path().join(_path().dirname(jsonPath), 'package.json')), 'utf8');
    -    return {
    -      string
    -    };
    -  } catch (error) {
    -    const exception = error;
    -    if (exception.code === 'ENOENT') {
    -      return {
    -        string: undefined
    -      };
    -    }
    -    throw exception;
    -  }
    -}
    -const {
    -  ERR_INVALID_PACKAGE_CONFIG: ERR_INVALID_PACKAGE_CONFIG$1
    -} = codes;
    -const packageJsonCache = new Map();
    -function getPackageConfig(path, specifier, base) {
    -  const existing = packageJsonCache.get(path);
    -  if (existing !== undefined) {
    +function read(jsonPath, {
    +  base,
    +  specifier
    +}) {
    +  const existing = cache.get(jsonPath);
    +  if (existing) {
         return existing;
       }
    -  const source = packageJsonReader.read(path).string;
    -  if (source === undefined) {
    -    const packageConfig = {
    -      pjsonPath: path,
    -      exists: false,
    -      main: undefined,
    -      name: undefined,
    -      type: 'none',
    -      exports: undefined,
    -      imports: undefined
    -    };
    -    packageJsonCache.set(path, packageConfig);
    -    return packageConfig;
    -  }
    -  let packageJson;
    +  let string;
       try {
    -    packageJson = JSON.parse(source);
    +    string = _fs().default.readFileSync(_path().toNamespacedPath(jsonPath), 'utf8');
       } catch (error) {
         const exception = error;
    -    throw new ERR_INVALID_PACKAGE_CONFIG$1(path, (base ? `"${specifier}" from ` : '') + (0, _url().fileURLToPath)(base || specifier), exception.message);
    +    if (exception.code !== 'ENOENT') {
    +      throw exception;
    +    }
       }
    -  const {
    -    exports,
    -    imports,
    -    main,
    -    name,
    -    type
    -  } = packageJson;
    -  const packageConfig = {
    -    pjsonPath: path,
    -    exists: true,
    -    main: typeof main === 'string' ? main : undefined,
    -    name: typeof name === 'string' ? name : undefined,
    -    type: type === 'module' || type === 'commonjs' ? type : 'none',
    -    exports,
    -    imports: imports && typeof imports === 'object' ? imports : undefined
    +  const result = {
    +    exists: false,
    +    pjsonPath: jsonPath,
    +    main: undefined,
    +    name: undefined,
    +    type: 'none',
    +    exports: undefined,
    +    imports: undefined
       };
    -  packageJsonCache.set(path, packageConfig);
    -  return packageConfig;
    +  if (string !== undefined) {
    +    let parsed;
    +    try {
    +      parsed = JSON.parse(string);
    +    } catch (error_) {
    +      const cause = error_;
    +      const error = new ERR_INVALID_PACKAGE_CONFIG$1(jsonPath, (base ? `"${specifier}" from ` : '') + (0, _url().fileURLToPath)(base || specifier), cause.message);
    +      error.cause = cause;
    +      throw error;
    +    }
    +    result.exists = true;
    +    if (hasOwnProperty$1.call(parsed, 'name') && typeof parsed.name === 'string') {
    +      result.name = parsed.name;
    +    }
    +    if (hasOwnProperty$1.call(parsed, 'main') && typeof parsed.main === 'string') {
    +      result.main = parsed.main;
    +    }
    +    if (hasOwnProperty$1.call(parsed, 'exports')) {
    +      result.exports = parsed.exports;
    +    }
    +    if (hasOwnProperty$1.call(parsed, 'imports')) {
    +      result.imports = parsed.imports;
    +    }
    +    if (hasOwnProperty$1.call(parsed, 'type') && (parsed.type === 'commonjs' || parsed.type === 'module')) {
    +      result.type = parsed.type;
    +    }
    +  }
    +  cache.set(jsonPath, result);
    +  return result;
     }
     function getPackageScopeConfig(resolved) {
    -  let packageJsonUrl = new (_url().URL)('package.json', resolved);
    +  let packageJSONUrl = new (_url().URL)('package.json', resolved);
       while (true) {
    -    const packageJsonPath = packageJsonUrl.pathname;
    -    if (packageJsonPath.endsWith('node_modules/package.json')) break;
    -    const packageConfig = getPackageConfig((0, _url().fileURLToPath)(packageJsonUrl), resolved);
    -    if (packageConfig.exists) return packageConfig;
    -    const lastPackageJsonUrl = packageJsonUrl;
    -    packageJsonUrl = new (_url().URL)('../package.json', packageJsonUrl);
    -    if (packageJsonUrl.pathname === lastPackageJsonUrl.pathname) break;
    -  }
    -  const packageJsonPath = (0, _url().fileURLToPath)(packageJsonUrl);
    -  const packageConfig = {
    -    pjsonPath: packageJsonPath,
    +    const packageJSONPath = packageJSONUrl.pathname;
    +    if (packageJSONPath.endsWith('node_modules/package.json')) {
    +      break;
    +    }
    +    const packageConfig = packageJsonReader.read((0, _url().fileURLToPath)(packageJSONUrl), {
    +      specifier: resolved
    +    });
    +    if (packageConfig.exists) {
    +      return packageConfig;
    +    }
    +    const lastPackageJSONUrl = packageJSONUrl;
    +    packageJSONUrl = new (_url().URL)('../package.json', packageJSONUrl);
    +    if (packageJSONUrl.pathname === lastPackageJSONUrl.pathname) {
    +      break;
    +    }
    +  }
    +  const packageJSONPath = (0, _url().fileURLToPath)(packageJSONUrl);
    +  return {
    +    pjsonPath: packageJSONPath,
         exists: false,
         main: undefined,
         name: undefined,
    @@ -362,8 +357,6 @@ function getPackageScopeConfig(resolved) {
         exports: undefined,
         imports: undefined
       };
    -  packageJsonCache.set(packageJsonPath, packageConfig);
    -  return packageConfig;
     }
     function getPackageType(url) {
       const packageConfig = getPackageScopeConfig(url);
    @@ -418,7 +411,18 @@ function extname(url) {
     function getFileProtocolModuleFormat(url, _context, ignoreErrors) {
       const ext = extname(url);
       if (ext === '.js') {
    -    return getPackageType(url) === 'module' ? 'module' : 'commonjs';
    +    const packageType = getPackageType(url);
    +    if (packageType !== 'none') {
    +      return packageType;
    +    }
    +    return 'commonjs';
    +  }
    +  if (ext === '') {
    +    const packageType = getPackageType(url);
    +    if (packageType === 'none' || packageType === 'commonjs') {
    +      return 'commonjs';
    +    }
    +    return 'module';
       }
       const format = extensionFormatMap[ext];
       if (format) return format;
    @@ -430,10 +434,11 @@ function getFileProtocolModuleFormat(url, _context, ignoreErrors) {
     }
     function getHttpProtocolModuleFormat() {}
     function defaultGetFormatWithoutErrors(url, context) {
    -  if (!hasOwnProperty.call(protocolHandlers, url.protocol)) {
    +  const protocol = url.protocol;
    +  if (!hasOwnProperty.call(protocolHandlers, protocol)) {
         return null;
       }
    -  return protocolHandlers[url.protocol](url, context, true) || null;
    +  return protocolHandlers[protocol](url, context, true) || null;
     }
     const {
       ERR_INVALID_ARG_VALUE
    @@ -456,7 +461,6 @@ function getConditionsSet(conditions) {
       return getDefaultConditionsSet();
     }
     const RegExpPrototypeSymbolReplace = RegExp.prototype[Symbol.replace];
    -const experimentalNetworkImports = false;
     const {
       ERR_NETWORK_IMPORT_DISALLOWED,
       ERR_INVALID_MODULE_SPECIFIER,
    @@ -465,8 +469,7 @@ const {
       ERR_MODULE_NOT_FOUND,
       ERR_PACKAGE_IMPORT_NOT_DEFINED,
       ERR_PACKAGE_PATH_NOT_EXPORTED,
    -  ERR_UNSUPPORTED_DIR_IMPORT,
    -  ERR_UNSUPPORTED_ESM_URL_SCHEME
    +  ERR_UNSUPPORTED_DIR_IMPORT
     } = codes;
     const own = {}.hasOwnProperty;
     const invalidSegmentRegEx = /(^|\\|\/)((\.|%2e)(\.|%2e)?|(n|%6e|%4e)(o|%6f|%4f)(d|%64|%44)(e|%65|%45)(_|%5f)(m|%6d|%4d)(o|%6f|%4f)(d|%64|%44)(u|%75|%55)(l|%6c|%4c)(e|%65|%45)(s|%73|%53))?(\\|\/|$)/i;
    @@ -477,19 +480,29 @@ const encodedSepRegEx = /%2f|%5c/i;
     const emittedPackageWarnings = new Set();
     const doubleSlashRegEx = /[/\\]{2}/;
     function emitInvalidSegmentDeprecation(target, request, match, packageJsonUrl, internal, base, isTarget) {
    +  if (_process().noDeprecation) {
    +    return;
    +  }
       const pjsonPath = (0, _url().fileURLToPath)(packageJsonUrl);
       const double = doubleSlashRegEx.exec(isTarget ? target : request) !== null;
       _process().emitWarning(`Use of deprecated ${double ? 'double slash' : 'leading or trailing slash matching'} resolving "${target}" for module ` + `request "${request}" ${request === match ? '' : `matched to "${match}" `}in the "${internal ? 'imports' : 'exports'}" field module resolution of the package at ${pjsonPath}${base ? ` imported from ${(0, _url().fileURLToPath)(base)}` : ''}.`, 'DeprecationWarning', 'DEP0166');
     }
     function emitLegacyIndexDeprecation(url, packageJsonUrl, base, main) {
    +  if (_process().noDeprecation) {
    +    return;
    +  }
       const format = defaultGetFormatWithoutErrors(url, {
         parentURL: base.href
       });
       if (format !== 'module') return;
    -  const path = (0, _url().fileURLToPath)(url.href);
    +  const urlPath = (0, _url().fileURLToPath)(url.href);
       const pkgPath = (0, _url().fileURLToPath)(new (_url().URL)('.', packageJsonUrl));
       const basePath = (0, _url().fileURLToPath)(base);
    -  if (main) _process().emitWarning(`Package ${pkgPath} has a "main" field set to ${JSON.stringify(main)}, ` + `excluding the full filename and extension to the resolved file at "${path.slice(pkgPath.length)}", imported from ${basePath}.\n Automatic extension resolution of the "main" field is` + 'deprecated for ES modules.', 'DeprecationWarning', 'DEP0151');else _process().emitWarning(`No "main" or "exports" field defined in the package.json for ${pkgPath} resolving the main entry point "${path.slice(pkgPath.length)}", imported from ${basePath}.\nDefault "index" lookups for the main are deprecated for ES modules.`, 'DeprecationWarning', 'DEP0151');
    +  if (!main) {
    +    _process().emitWarning(`No "main" or "exports" field defined in the package.json for ${pkgPath} resolving the main entry point "${urlPath.slice(pkgPath.length)}", imported from ${basePath}.\nDefault "index" lookups for the main are deprecated for ES modules.`, 'DeprecationWarning', 'DEP0151');
    +  } else if (_path().resolve(pkgPath, main) !== urlPath) {
    +    _process().emitWarning(`Package ${pkgPath} has a "main" field set to "${main}", ` + `excluding the full filename and extension to the resolved file at "${urlPath.slice(pkgPath.length)}", imported from ${basePath}.\n Automatic extension resolution of the "main" field is ` + 'deprecated for ES modules.', 'DeprecationWarning', 'DEP0151');
    +  }
     }
     function tryStatSync(path) {
       try {
    @@ -536,8 +549,22 @@ function legacyMainResolve(packageJsonUrl, packageConfig, base) {
       throw new ERR_MODULE_NOT_FOUND((0, _url().fileURLToPath)(new (_url().URL)('.', packageJsonUrl)), (0, _url().fileURLToPath)(base));
     }
     function finalizeResolution(resolved, base, preserveSymlinks) {
    -  if (encodedSepRegEx.exec(resolved.pathname) !== null) throw new ERR_INVALID_MODULE_SPECIFIER(resolved.pathname, 'must not include encoded "/" or "\\" characters', (0, _url().fileURLToPath)(base));
    -  const filePath = (0, _url().fileURLToPath)(resolved);
    +  if (encodedSepRegEx.exec(resolved.pathname) !== null) {
    +    throw new ERR_INVALID_MODULE_SPECIFIER(resolved.pathname, 'must not include encoded "/" or "\\" characters', (0, _url().fileURLToPath)(base));
    +  }
    +  let filePath;
    +  try {
    +    filePath = (0, _url().fileURLToPath)(resolved);
    +  } catch (error) {
    +    const cause = error;
    +    Object.defineProperty(cause, 'input', {
    +      value: String(resolved)
    +    });
    +    Object.defineProperty(cause, 'module', {
    +      value: String(base)
    +    });
    +    throw cause;
    +  }
       const stats = tryStatSync(filePath.endsWith('/') ? filePath.slice(-1) : filePath);
       if (stats.isDirectory()) {
         const error = new ERR_UNSUPPORTED_DIR_IMPORT(filePath, (0, _url().fileURLToPath)(base));
    @@ -545,7 +572,9 @@ function finalizeResolution(resolved, base, preserveSymlinks) {
         throw error;
       }
       if (!stats.isFile()) {
    -    throw new ERR_MODULE_NOT_FOUND(filePath || resolved.pathname, base && (0, _url().fileURLToPath)(base), 'module');
    +    const error = new ERR_MODULE_NOT_FOUND(filePath || resolved.pathname, base && (0, _url().fileURLToPath)(base), true);
    +    error.url = String(resolved);
    +    throw error;
       }
       if (!preserveSymlinks) {
         const real = (0, _fs().realpathSync)(filePath);
    @@ -703,6 +732,9 @@ function isConditionalExportsMainSugar(exports, packageJsonUrl, base) {
       return isConditionalSugar;
     }
     function emitTrailingSlashPatternDeprecation(match, pjsonUrl, base) {
    +  if (_process().noDeprecation) {
    +    return;
    +  }
       const pjsonPath = (0, _url().fileURLToPath)(pjsonUrl);
       if (emittedPackageWarnings.has(pjsonPath + '|' + match)) return;
       emittedPackageWarnings.add(pjsonPath + '|' + match);
    @@ -861,7 +893,10 @@ function packageResolve(specifier, base, conditions) {
           packageJsonPath = (0, _url().fileURLToPath)(packageJsonUrl);
           continue;
         }
    -    const packageConfig = getPackageConfig(packageJsonPath, specifier, base);
    +    const packageConfig = packageJsonReader.read(packageJsonPath, {
    +      base,
    +      specifier
    +    });
         if (packageConfig.exports !== undefined && packageConfig.exports !== null) {
           return packageExportsResolve(packageJsonUrl, packageSubpath, packageConfig, base, conditions);
         }
    @@ -870,7 +905,7 @@ function packageResolve(specifier, base, conditions) {
         }
         return new (_url().URL)(packageSubpath, packageJsonUrl);
       } while (packageJsonPath.length !== lastPath.length);
    -  throw new ERR_MODULE_NOT_FOUND(packageName, (0, _url().fileURLToPath)(base));
    +  throw new ERR_MODULE_NOT_FOUND(packageName, (0, _url().fileURLToPath)(base), false);
     }
     function isRelativeSpecifier(specifier) {
       if (specifier[0] === '.') {
    @@ -940,18 +975,6 @@ function throwIfInvalidParentURL(parentURL) {
         throw new codes.ERR_INVALID_ARG_TYPE('parentURL', ['string', 'URL'], parentURL);
       }
     }
    -function throwIfUnsupportedURLProtocol(url) {
    -  const protocol = url.protocol;
    -  if (protocol !== 'file:' && protocol !== 'data:' && protocol !== 'node:') {
    -    throw new ERR_UNSUPPORTED_ESM_URL_SCHEME(url);
    -  }
    -}
    -function throwIfUnsupportedURLScheme(parsed, experimentalNetworkImports) {
    -  const protocol = parsed == null ? void 0 : parsed.protocol;
    -  if (protocol && protocol !== 'file:' && protocol !== 'data:' && (!experimentalNetworkImports || protocol !== 'https:' && protocol !== 'http:')) {
    -    throw new ERR_UNSUPPORTED_ESM_URL_SCHEME(parsed, ['file', 'data'].concat(experimentalNetworkImports ? ['https', 'http'] : []));
    -  }
    -}
     function defaultResolve(specifier, context = {}) {
       const {
         parentURL
    @@ -968,7 +991,7 @@ function defaultResolve(specifier, context = {}) {
       try {
         parsed = shouldBeTreatedAsRelativeOrAbsolutePath(specifier) ? new (_url().URL)(specifier, parsedParentURL) : new (_url().URL)(specifier);
         const protocol = parsed.protocol;
    -    if (protocol === 'data:' || experimentalNetworkImports && (protocol === 'https:' || protocol === 'http:')) {
    +    if (protocol === 'data:') {
           return {
             url: parsed.href,
             format: null
    @@ -980,10 +1003,8 @@ function defaultResolve(specifier, context = {}) {
       if (parsed && parsed.protocol === 'node:') return {
         url: specifier
       };
    -  throwIfUnsupportedURLScheme(parsed, experimentalNetworkImports);
       const conditions = getConditionsSet(context.conditions);
       const url = moduleResolve(specifier, new (_url().URL)(parentURL), conditions, false);
    -  throwIfUnsupportedURLProtocol(url);
       return {
         url: url.href,
         format: defaultGetFormatWithoutErrors(url, {
    @@ -1001,7 +1022,7 @@ function resolve(specifier, parent) {
         }).url;
       } catch (error) {
         const exception = error;
    -    if (exception.code === 'ERR_UNSUPPORTED_DIR_IMPORT' && typeof exception.url === 'string') {
    +    if ((exception.code === 'ERR_UNSUPPORTED_DIR_IMPORT' || exception.code === 'ERR_MODULE_NOT_FOUND') && typeof exception.url === 'string') {
           return exception.url;
         }
         throw error;
    diff --git a/tools/node_modules/eslint/node_modules/@babel/core/package.json b/tools/node_modules/eslint/node_modules/@babel/core/package.json
    index 6d61fbeec23ea9..8caea33bed16de 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/core/package.json
    +++ b/tools/node_modules/eslint/node_modules/@babel/core/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@babel/core",
    -  "version": "7.23.0",
    +  "version": "7.23.6",
       "description": "Babel compiler core.",
       "main": "./lib/index.js",
       "author": "The Babel Team (https://babel.dev/team)",
    @@ -47,15 +47,15 @@
       },
       "dependencies": {
         "@ampproject/remapping": "^2.2.0",
    -    "@babel/code-frame": "^7.22.13",
    -    "@babel/generator": "^7.23.0",
    -    "@babel/helper-compilation-targets": "^7.22.15",
    -    "@babel/helper-module-transforms": "^7.23.0",
    -    "@babel/helpers": "^7.23.0",
    -    "@babel/parser": "^7.23.0",
    +    "@babel/code-frame": "^7.23.5",
    +    "@babel/generator": "^7.23.6",
    +    "@babel/helper-compilation-targets": "^7.23.6",
    +    "@babel/helper-module-transforms": "^7.23.3",
    +    "@babel/helpers": "^7.23.6",
    +    "@babel/parser": "^7.23.6",
         "@babel/template": "^7.22.15",
    -    "@babel/traverse": "^7.23.0",
    -    "@babel/types": "^7.23.0",
    +    "@babel/traverse": "^7.23.6",
    +    "@babel/types": "^7.23.6",
         "convert-source-map": "^2.0.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.2",
    @@ -64,11 +64,11 @@
       },
       "devDependencies": {
         "@babel/helper-transform-fixture-test-runner": "^7.22.19",
    -    "@babel/plugin-syntax-flow": "^7.22.5",
    -    "@babel/plugin-transform-flow-strip-types": "^7.22.5",
    -    "@babel/plugin-transform-modules-commonjs": "^7.23.0",
    -    "@babel/preset-env": "^7.22.20",
    -    "@babel/preset-typescript": "^7.23.0",
    +    "@babel/plugin-syntax-flow": "^7.23.3",
    +    "@babel/plugin-transform-flow-strip-types": "^7.23.3",
    +    "@babel/plugin-transform-modules-commonjs": "^7.23.3",
    +    "@babel/preset-env": "^7.23.6",
    +    "@babel/preset-typescript": "^7.23.3",
         "@jridgewell/trace-mapping": "^0.3.17",
         "@types/convert-source-map": "^2.0.0",
         "@types/debug": "^4.1.0",
    diff --git a/tools/node_modules/eslint/node_modules/@babel/eslint-parser/lib/experimental-worker.cjs b/tools/node_modules/eslint/node_modules/@babel/eslint-parser/lib/experimental-worker.cjs
    index 00bcd0cbfdd6f0..dd586f59ce450f 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/eslint-parser/lib/experimental-worker.cjs
    +++ b/tools/node_modules/eslint/node_modules/@babel/eslint-parser/lib/experimental-worker.cjs
    @@ -13,7 +13,7 @@ const {
     const client = new WorkerClient();
     exports.meta = {
       name: "@babel/eslint-parser/experimental-worker",
    -  version: "7.22.15"
    +  version: "7.23.3"
     };
     exports.parseForESLint = function (code, options = {}) {
       const normalizedOptions = normalizeESLintConfig(options);
    diff --git a/tools/node_modules/eslint/node_modules/@babel/eslint-parser/lib/index.cjs b/tools/node_modules/eslint/node_modules/@babel/eslint-parser/lib/index.cjs
    index 08da6a3a48b3c6..addf84100311d5 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/eslint-parser/lib/index.cjs
    +++ b/tools/node_modules/eslint/node_modules/@babel/eslint-parser/lib/index.cjs
    @@ -10,7 +10,7 @@ const {
     const client = new LocalClient();
     exports.meta = {
       name: "@babel/eslint-parser",
    -  version: "7.22.15"
    +  version: "7.23.3"
     };
     exports.parse = function (code, options = {}) {
       return baseParse(code, normalizeESLintConfig(options), client);
    diff --git a/tools/node_modules/eslint/node_modules/@babel/eslint-parser/lib/parse.cjs b/tools/node_modules/eslint/node_modules/@babel/eslint-parser/lib/parse.cjs
    index f91eb4d0670e7e..3aa0973930af93 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/eslint-parser/lib/parse.cjs
    +++ b/tools/node_modules/eslint/node_modules/@babel/eslint-parser/lib/parse.cjs
    @@ -15,13 +15,12 @@ const babelParser = require((((v, w) => (v = v.split("."), w = w.split("."), +v[
     }));
     let isRunningMinSupportedCoreVersion = null;
     module.exports = function parse(code, options, client) {
    -  let minSupportedCoreVersion = ">=7.2.0";
    -  ;
    +  const minSupportedCoreVersion = ">=7.2.0";
       if (typeof isRunningMinSupportedCoreVersion !== "boolean") {
         isRunningMinSupportedCoreVersion = semver.satisfies(client.getVersion(), minSupportedCoreVersion);
       }
       if (!isRunningMinSupportedCoreVersion) {
    -    throw new Error(`@babel/eslint-parser@${"7.22.15"} does not support @babel/core@${client.getVersion()}. Please upgrade to @babel/core@${minSupportedCoreVersion}.`);
    +    throw new Error(`@babel/eslint-parser@${"7.23.3"} does not support @babel/core@${client.getVersion()}. Please upgrade to @babel/core@${minSupportedCoreVersion}.`);
       }
       const {
         ast,
    diff --git a/tools/node_modules/eslint/node_modules/@babel/eslint-parser/package.json b/tools/node_modules/eslint/node_modules/@babel/eslint-parser/package.json
    index 460ddff14f2019..65d772facbecda 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/eslint-parser/package.json
    +++ b/tools/node_modules/eslint/node_modules/@babel/eslint-parser/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@babel/eslint-parser",
    -  "version": "7.22.15",
    +  "version": "7.23.3",
       "description": "ESLint parser that allows for linting of experimental syntax transformed by Babel",
       "author": "The Babel Team (https://babel.dev/team)",
       "license": "MIT",
    @@ -36,7 +36,7 @@
         "semver": "^6.3.1"
       },
       "devDependencies": {
    -    "@babel/core": "^7.22.15",
    +    "@babel/core": "^7.23.3",
         "dedent": "^0.7.0",
         "eslint": "^8.22.0"
       }
    diff --git a/tools/node_modules/eslint/node_modules/@babel/generator/lib/buffer.js b/tools/node_modules/eslint/node_modules/@babel/generator/lib/buffer.js
    index b9574f87de8869..aad6c0bf36cbac 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/generator/lib/buffer.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/generator/lib/buffer.js
    @@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
     });
     exports.default = void 0;
     class Buffer {
    -  constructor(map) {
    +  constructor(map, indentChar) {
         this._map = null;
         this._buf = "";
         this._str = "";
    @@ -14,6 +14,8 @@ class Buffer {
         this._queue = [];
         this._queueCursor = 0;
         this._canMarkIdName = true;
    +    this._indentChar = "";
    +    this._fastIndentations = [];
         this._position = {
           line: 1,
           column: 0
    @@ -26,6 +28,10 @@ class Buffer {
           filename: undefined
         };
         this._map = map;
    +    this._indentChar = indentChar;
    +    for (let i = 0; i < 64; i++) {
    +      this._fastIndentations.push(indentChar.repeat(i));
    +    }
         this._allocQueue();
       }
       _allocQueue() {
    @@ -116,8 +122,9 @@ class Buffer {
         const sourcePosition = this._sourcePosition;
         this._pushQueue(char, 1, sourcePosition.line, sourcePosition.column, sourcePosition.filename);
       }
    -  queueIndentation(char, repeat) {
    -    this._pushQueue(char, repeat, undefined, undefined, undefined);
    +  queueIndentation(repeat) {
    +    if (repeat === 0) return;
    +    this._pushQueue(-1, repeat, undefined, undefined, undefined);
       }
       _flush() {
         const queueCursor = this._queueCursor;
    @@ -130,7 +137,16 @@ class Buffer {
       }
       _appendChar(char, repeat, sourcePos) {
         this._last = char;
    -    this._str += repeat > 1 ? String.fromCharCode(char).repeat(repeat) : String.fromCharCode(char);
    +    if (char === -1) {
    +      const fastIndentation = this._fastIndentations[repeat];
    +      if (fastIndentation !== undefined) {
    +        this._str += fastIndentation;
    +      } else {
    +        this._str += repeat > 1 ? this._indentChar.repeat(repeat) : this._indentChar;
    +      }
    +    } else {
    +      this._str += repeat > 1 ? String.fromCharCode(char).repeat(repeat) : String.fromCharCode(char);
    +    }
         if (char !== 10) {
           this._mark(sourcePos.line, sourcePos.column, sourcePos.identifierName, sourcePos.identifierNamePos, sourcePos.filename);
           this._position.column += repeat;
    @@ -188,7 +204,7 @@ class Buffer {
       }
       _mark(line, column, identifierName, identifierNamePos, filename) {
         var _this$_map;
    -    (_this$_map = this._map) == null ? void 0 : _this$_map.mark(this._position, line, column, identifierName, identifierNamePos, filename);
    +    (_this$_map = this._map) == null || _this$_map.mark(this._position, line, column, identifierName, identifierNamePos, filename);
       }
       removeTrailingNewline() {
         const queueCursor = this._queueCursor;
    diff --git a/tools/node_modules/eslint/node_modules/@babel/generator/lib/generators/statements.js b/tools/node_modules/eslint/node_modules/@babel/generator/lib/generators/statements.js
    index dee0ad812e0d7c..4364c95100e232 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/generator/lib/generators/statements.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/generator/lib/generators/statements.js
    @@ -117,10 +117,8 @@ function ForXStatement(node) {
       this.tokenChar(41);
       this.printBlock(node);
     }
    -const ForInStatement = ForXStatement;
    -exports.ForInStatement = ForInStatement;
    -const ForOfStatement = ForXStatement;
    -exports.ForOfStatement = ForOfStatement;
    +const ForInStatement = exports.ForInStatement = ForXStatement;
    +const ForOfStatement = exports.ForOfStatement = ForXStatement;
     function DoWhileStatement(node) {
       this.word("do");
       this.space();
    diff --git a/tools/node_modules/eslint/node_modules/@babel/generator/lib/generators/types.js b/tools/node_modules/eslint/node_modules/@babel/generator/lib/generators/types.js
    index a9ddea2ff1706a..191db56c79538f 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/generator/lib/generators/types.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/generator/lib/generators/types.js
    @@ -158,15 +158,16 @@ function NullLiteral() {
     function NumericLiteral(node) {
       const raw = this.getPossibleRaw(node);
       const opts = this.format.jsescOption;
    -  const value = node.value + "";
    +  const value = node.value;
    +  const str = value + "";
       if (opts.numbers) {
    -    this.number(_jsesc(node.value, opts));
    +    this.number(_jsesc(value, opts), value);
       } else if (raw == null) {
    -    this.number(value);
    +    this.number(str, value);
       } else if (this.format.minified) {
    -    this.number(raw.length < value.length ? raw : value);
    +    this.number(raw.length < str.length ? raw : str, value);
       } else {
    -    this.number(raw);
    +    this.number(raw, value);
       }
     }
     function StringLiteral(node) {
    diff --git a/tools/node_modules/eslint/node_modules/@babel/generator/lib/generators/typescript.js b/tools/node_modules/eslint/node_modules/@babel/generator/lib/generators/typescript.js
    index 9d621d2314da57..2f04734c6bab18 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/generator/lib/generators/typescript.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/generator/lib/generators/typescript.js
    @@ -148,8 +148,7 @@ function TSConstructSignatureDeclaration(node) {
     }
     function TSPropertySignature(node) {
       const {
    -    readonly,
    -    initializer
    +    readonly
       } = node;
       if (readonly) {
         this.word("readonly");
    @@ -157,12 +156,6 @@ function TSPropertySignature(node) {
       }
       this.tsPrintPropertyOrMethodName(node);
       this.print(node.typeAnnotation, node);
    -  if (initializer) {
    -    this.space();
    -    this.tokenChar(61);
    -    this.space();
    -    this.print(initializer, node);
    -  }
       this.tokenChar(59);
     }
     function tsPrintPropertyOrMethodName(node) {
    diff --git a/tools/node_modules/eslint/node_modules/@babel/generator/lib/index.js b/tools/node_modules/eslint/node_modules/@babel/generator/lib/index.js
    index cf7d0b7b20a3fb..f49be786222ceb 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/generator/lib/index.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/generator/lib/index.js
    @@ -3,22 +3,9 @@
     Object.defineProperty(exports, "__esModule", {
       value: true
     });
    -exports.CodeGenerator = void 0;
     exports.default = generate;
     var _sourceMap = require("./source-map.js");
     var _printer = require("./printer.js");
    -class Generator extends _printer.default {
    -  constructor(ast, opts = {}, code) {
    -    const format = normalizeOptions(code, opts);
    -    const map = opts.sourceMaps ? new _sourceMap.default(opts, code) : null;
    -    super(format, map);
    -    this.ast = void 0;
    -    this.ast = ast;
    -  }
    -  generate() {
    -    return super.generate(this.ast);
    -  }
    -}
     function normalizeOptions(code, opts) {
       var _opts$recordAndTupleS;
       const format = {
    @@ -76,19 +63,27 @@ function normalizeOptions(code, opts) {
       }
       return format;
     }
    -class CodeGenerator {
    -  constructor(ast, opts, code) {
    -    this._generator = void 0;
    -    this._generator = new Generator(ast, opts, code);
    -  }
    -  generate() {
    -    return this._generator.generate();
    -  }
    +{
    +  exports.CodeGenerator = class CodeGenerator {
    +    constructor(ast, opts = {}, code) {
    +      this._ast = void 0;
    +      this._format = void 0;
    +      this._map = void 0;
    +      this._ast = ast;
    +      this._format = normalizeOptions(code, opts);
    +      this._map = opts.sourceMaps ? new _sourceMap.default(opts, code) : null;
    +    }
    +    generate() {
    +      const printer = new _printer.default(this._format, this._map);
    +      return printer.generate(this._ast);
    +    }
    +  };
     }
    -exports.CodeGenerator = CodeGenerator;
    -function generate(ast, opts, code) {
    -  const gen = new Generator(ast, opts, code);
    -  return gen.generate();
    +function generate(ast, opts = {}, code) {
    +  const format = normalizeOptions(code, opts);
    +  const map = opts.sourceMaps ? new _sourceMap.default(opts, code) : null;
    +  const printer = new _printer.default(format, map);
    +  return printer.generate(ast);
     }
     
     //# sourceMappingURL=index.js.map
    diff --git a/tools/node_modules/eslint/node_modules/@babel/generator/lib/node/index.js b/tools/node_modules/eslint/node_modules/@babel/generator/lib/node/index.js
    index 70106ba099b403..385a7ad15f2dc6 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/generator/lib/node/index.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/generator/lib/node/index.js
    @@ -18,13 +18,13 @@ const {
       isNewExpression
     } = _t;
     function expandAliases(obj) {
    -  const newObj = {};
    +  const map = new Map();
       function add(type, func) {
    -    const fn = newObj[type];
    -    newObj[type] = fn ? function (node, parent, stack) {
    -      const result = fn(node, parent, stack);
    -      return result == null ? func(node, parent, stack) : result;
    -    } : func;
    +    const fn = map.get(type);
    +    map.set(type, fn ? function (node, parent, stack) {
    +      var _fn;
    +      return (_fn = fn(node, parent, stack)) != null ? _fn : func(node, parent, stack);
    +    } : func);
       }
       for (const type of Object.keys(obj)) {
         const aliases = FLIPPED_ALIAS_KEYS[type];
    @@ -36,14 +36,10 @@ function expandAliases(obj) {
           add(type, obj[type]);
         }
       }
    -  return newObj;
    +  return map;
     }
     const expandedParens = expandAliases(parens);
     const expandedWhitespaceNodes = expandAliases(whitespace.nodes);
    -function find(obj, node, parent, printStack) {
    -  const fn = obj[node.type];
    -  return fn ? fn(node, parent, printStack) : null;
    -}
     function isOrHasCallExpression(node) {
       if (isCallExpression(node)) {
         return true;
    @@ -51,11 +47,12 @@ function isOrHasCallExpression(node) {
       return isMemberExpression(node) && isOrHasCallExpression(node.object);
     }
     function needsWhitespace(node, parent, type) {
    +  var _expandedWhitespaceNo;
       if (!node) return false;
       if (isExpressionStatement(node)) {
         node = node.expression;
       }
    -  const flag = find(expandedWhitespaceNodes, node, parent);
    +  const flag = (_expandedWhitespaceNo = expandedWhitespaceNodes.get(node.type)) == null ? void 0 : _expandedWhitespaceNo(node, parent);
       if (typeof flag === "number") {
         return (flag & type) !== 0;
       }
    @@ -68,11 +65,12 @@ function needsWhitespaceAfter(node, parent) {
       return needsWhitespace(node, parent, 2);
     }
     function needsParens(node, parent, printStack) {
    +  var _expandedParens$get;
       if (!parent) return false;
       if (isNewExpression(parent) && parent.callee === node) {
         if (isOrHasCallExpression(node)) return true;
       }
    -  return find(expandedParens, node, parent, printStack);
    +  return (_expandedParens$get = expandedParens.get(node.type)) == null ? void 0 : _expandedParens$get(node, parent, printStack);
     }
     
     //# sourceMappingURL=index.js.map
    diff --git a/tools/node_modules/eslint/node_modules/@babel/generator/lib/node/parentheses.js b/tools/node_modules/eslint/node_modules/@babel/generator/lib/node/parentheses.js
    index 4656a67ce77f07..475e33acc6e530 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/generator/lib/node/parentheses.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/generator/lib/node/parentheses.js
    @@ -31,97 +31,35 @@ var _t = require("@babel/types");
     const {
       isArrayTypeAnnotation,
       isArrowFunctionExpression,
    -  isAssignmentExpression,
    -  isAwaitExpression,
    -  isBinary,
       isBinaryExpression,
    -  isUpdateExpression,
       isCallExpression,
    -  isClass,
    -  isClassExpression,
    -  isConditional,
    -  isConditionalExpression,
       isExportDeclaration,
    -  isExportDefaultDeclaration,
    -  isExpressionStatement,
    -  isFor,
    -  isForInStatement,
       isForOfStatement,
    -  isForStatement,
    -  isFunctionExpression,
    -  isIfStatement,
       isIndexedAccessType,
    -  isIntersectionTypeAnnotation,
    -  isLogicalExpression,
       isMemberExpression,
    -  isNewExpression,
    -  isNullableTypeAnnotation,
       isObjectPattern,
    -  isOptionalCallExpression,
       isOptionalMemberExpression,
    -  isReturnStatement,
    -  isSequenceExpression,
    -  isSwitchStatement,
    -  isTSArrayType,
    -  isTSAsExpression,
    -  isTSInstantiationExpression,
    -  isTSIntersectionType,
    -  isTSNonNullExpression,
    -  isTSOptionalType,
    -  isTSRestType,
    -  isTSTypeAssertion,
    -  isTSUnionType,
    -  isTaggedTemplateExpression,
    -  isThrowStatement,
    -  isTypeAnnotation,
    -  isUnaryLike,
    -  isUnionTypeAnnotation,
    -  isVariableDeclarator,
    -  isWhileStatement,
    -  isYieldExpression,
    -  isTSSatisfiesExpression
    +  isYieldExpression
     } = _t;
    -const PRECEDENCE = {
    -  "||": 0,
    -  "??": 0,
    -  "|>": 0,
    -  "&&": 1,
    -  "|": 2,
    -  "^": 3,
    -  "&": 4,
    -  "==": 5,
    -  "===": 5,
    -  "!=": 5,
    -  "!==": 5,
    -  "<": 6,
    -  ">": 6,
    -  "<=": 6,
    -  ">=": 6,
    -  in: 6,
    -  instanceof: 6,
    -  ">>": 7,
    -  "<<": 7,
    -  ">>>": 7,
    -  "+": 8,
    -  "-": 8,
    -  "*": 9,
    -  "/": 9,
    -  "%": 9,
    -  "**": 10
    -};
    -function isTSTypeExpression(node) {
    -  return isTSAsExpression(node) || isTSSatisfiesExpression(node) || isTSTypeAssertion(node);
    +const PRECEDENCE = new Map([["||", 0], ["??", 0], ["|>", 0], ["&&", 1], ["|", 2], ["^", 3], ["&", 4], ["==", 5], ["===", 5], ["!=", 5], ["!==", 5], ["<", 6], [">", 6], ["<=", 6], [">=", 6], ["in", 6], ["instanceof", 6], [">>", 7], ["<<", 7], [">>>", 7], ["+", 8], ["-", 8], ["*", 9], ["/", 9], ["%", 9], ["**", 10]]);
    +function isTSTypeExpression(nodeType) {
    +  return nodeType === "TSAsExpression" || nodeType === "TSSatisfiesExpression" || nodeType === "TSTypeAssertion";
     }
    -const isClassExtendsClause = (node, parent) => isClass(parent, {
    -  superClass: node
    -});
    -const hasPostfixPart = (node, parent) => (isMemberExpression(parent) || isOptionalMemberExpression(parent)) && parent.object === node || (isCallExpression(parent) || isOptionalCallExpression(parent) || isNewExpression(parent)) && parent.callee === node || isTaggedTemplateExpression(parent) && parent.tag === node || isTSNonNullExpression(parent);
    +const isClassExtendsClause = (node, parent) => {
    +  const parentType = parent.type;
    +  return (parentType === "ClassDeclaration" || parentType === "ClassExpression") && parent.superClass === node;
    +};
    +const hasPostfixPart = (node, parent) => {
    +  const parentType = parent.type;
    +  return (parentType === "MemberExpression" || parentType === "OptionalMemberExpression") && parent.object === node || (parentType === "CallExpression" || parentType === "OptionalCallExpression" || parentType === "NewExpression") && parent.callee === node || parentType === "TaggedTemplateExpression" && parent.tag === node || parentType === "TSNonNullExpression";
    +};
     function NullableTypeAnnotation(node, parent) {
       return isArrayTypeAnnotation(parent);
     }
     function FunctionTypeAnnotation(node, parent, printStack) {
       if (printStack.length < 3) return;
    -  return isUnionTypeAnnotation(parent) || isIntersectionTypeAnnotation(parent) || isArrayTypeAnnotation(parent) || isTypeAnnotation(parent) && isArrowFunctionExpression(printStack[printStack.length - 3]);
    +  const parentType = parent.type;
    +  return parentType === "UnionTypeAnnotation" || parentType === "IntersectionTypeAnnotation" || parentType === "ArrayTypeAnnotation" || parentType === "TypeAnnotation" && isArrowFunctionExpression(printStack[printStack.length - 3]);
     }
     function UpdateExpression(node, parent) {
       return hasPostfixPart(node, parent) || isClassExtendsClause(node, parent);
    @@ -133,67 +71,70 @@ function DoExpression(node, parent, printStack) {
       return !node.async && isFirstInContext(printStack, 1);
     }
     function Binary(node, parent) {
    -  if (node.operator === "**" && isBinaryExpression(parent, {
    -    operator: "**"
    -  })) {
    +  const parentType = parent.type;
    +  if (node.operator === "**" && parentType === "BinaryExpression" && parent.operator === "**") {
         return parent.left === node;
       }
       if (isClassExtendsClause(node, parent)) {
         return true;
       }
    -  if (hasPostfixPart(node, parent) || isUnaryLike(parent) || isAwaitExpression(parent)) {
    +  if (hasPostfixPart(node, parent) || parentType === "UnaryExpression" || parentType === "SpreadElement" || parentType === "AwaitExpression") {
         return true;
       }
    -  if (isBinary(parent)) {
    -    const parentOp = parent.operator;
    -    const parentPos = PRECEDENCE[parentOp];
    -    const nodeOp = node.operator;
    -    const nodePos = PRECEDENCE[nodeOp];
    -    if (parentPos === nodePos && parent.right === node && !isLogicalExpression(parent) || parentPos > nodePos) {
    +  if (parentType === "BinaryExpression" || parentType === "LogicalExpression") {
    +    const parentPos = PRECEDENCE.get(parent.operator);
    +    const nodePos = PRECEDENCE.get(node.operator);
    +    if (parentPos === nodePos && parent.right === node && parentType !== "LogicalExpression" || parentPos > nodePos) {
           return true;
         }
       }
    +  return undefined;
     }
     function UnionTypeAnnotation(node, parent) {
    -  return isArrayTypeAnnotation(parent) || isNullableTypeAnnotation(parent) || isIntersectionTypeAnnotation(parent) || isUnionTypeAnnotation(parent);
    +  const parentType = parent.type;
    +  return parentType === "ArrayTypeAnnotation" || parentType === "NullableTypeAnnotation" || parentType === "IntersectionTypeAnnotation" || parentType === "UnionTypeAnnotation";
     }
     function OptionalIndexedAccessType(node, parent) {
    -  return isIndexedAccessType(parent, {
    -    objectType: node
    -  });
    +  return isIndexedAccessType(parent) && parent.objectType === node;
     }
     function TSAsExpression() {
       return true;
     }
     function TSUnionType(node, parent) {
    -  return isTSArrayType(parent) || isTSOptionalType(parent) || isTSIntersectionType(parent) || isTSUnionType(parent) || isTSRestType(parent);
    +  const parentType = parent.type;
    +  return parentType === "TSArrayType" || parentType === "TSOptionalType" || parentType === "TSIntersectionType" || parentType === "TSUnionType" || parentType === "TSRestType";
     }
     function TSInferType(node, parent) {
    -  return isTSArrayType(parent) || isTSOptionalType(parent);
    +  const parentType = parent.type;
    +  return parentType === "TSArrayType" || parentType === "TSOptionalType";
     }
     function TSInstantiationExpression(node, parent) {
    -  return (isCallExpression(parent) || isOptionalCallExpression(parent) || isNewExpression(parent) || isTSInstantiationExpression(parent)) && !!parent.typeParameters;
    +  const parentType = parent.type;
    +  return (parentType === "CallExpression" || parentType === "OptionalCallExpression" || parentType === "NewExpression" || parentType === "TSInstantiationExpression") && !!parent.typeParameters;
     }
     function BinaryExpression(node, parent) {
    -  return node.operator === "in" && (isVariableDeclarator(parent) || isFor(parent));
    +  if (node.operator === "in") {
    +    const parentType = parent.type;
    +    return parentType === "VariableDeclarator" || parentType === "ForStatement" || parentType === "ForInStatement" || parentType === "ForOfStatement";
    +  }
    +  return false;
     }
     function SequenceExpression(node, parent) {
    -  if (isForStatement(parent) || isThrowStatement(parent) || isReturnStatement(parent) || isIfStatement(parent) && parent.test === node || isWhileStatement(parent) && parent.test === node || isForInStatement(parent) && parent.right === node || isSwitchStatement(parent) && parent.discriminant === node || isExpressionStatement(parent) && parent.expression === node) {
    +  const parentType = parent.type;
    +  if (parentType === "ForStatement" || parentType === "ThrowStatement" || parentType === "ReturnStatement" || parentType === "IfStatement" && parent.test === node || parentType === "WhileStatement" && parent.test === node || parentType === "ForInStatement" && parent.right === node || parentType === "SwitchStatement" && parent.discriminant === node || parentType === "ExpressionStatement" && parent.expression === node) {
         return false;
       }
       return true;
     }
     function YieldExpression(node, parent) {
    -  return isBinary(parent) || isUnaryLike(parent) || hasPostfixPart(node, parent) || isAwaitExpression(parent) && isYieldExpression(node) || isConditionalExpression(parent) && node === parent.test || isClassExtendsClause(node, parent);
    +  const parentType = parent.type;
    +  return parentType === "BinaryExpression" || parentType === "LogicalExpression" || parentType === "UnaryExpression" || parentType === "SpreadElement" || hasPostfixPart(node, parent) || parentType === "AwaitExpression" && isYieldExpression(node) || parentType === "ConditionalExpression" && node === parent.test || isClassExtendsClause(node, parent);
     }
     function ClassExpression(node, parent, printStack) {
       return isFirstInContext(printStack, 1 | 4);
     }
     function UnaryLike(node, parent) {
    -  return hasPostfixPart(node, parent) || isBinaryExpression(parent, {
    -    operator: "**",
    -    left: node
    -  }) || isClassExtendsClause(node, parent);
    +  return hasPostfixPart(node, parent) || isBinaryExpression(parent) && parent.operator === "**" && parent.left === node || isClassExtendsClause(node, parent);
     }
     function FunctionExpression(node, parent, printStack) {
       return isFirstInContext(printStack, 1 | 4);
    @@ -202,19 +143,14 @@ function ArrowFunctionExpression(node, parent) {
       return isExportDeclaration(parent) || ConditionalExpression(node, parent);
     }
     function ConditionalExpression(node, parent) {
    -  if (isUnaryLike(parent) || isBinary(parent) || isConditionalExpression(parent, {
    -    test: node
    -  }) || isAwaitExpression(parent) || isTSTypeExpression(parent)) {
    +  const parentType = parent.type;
    +  if (parentType === "UnaryExpression" || parentType === "SpreadElement" || parentType === "BinaryExpression" || parentType === "LogicalExpression" || parentType === "ConditionalExpression" && parent.test === node || parentType === "AwaitExpression" || isTSTypeExpression(parentType)) {
         return true;
       }
       return UnaryLike(node, parent);
     }
     function OptionalMemberExpression(node, parent) {
    -  return isCallExpression(parent, {
    -    callee: node
    -  }) || isMemberExpression(parent, {
    -    object: node
    -  });
    +  return isCallExpression(parent) && parent.callee === node || isMemberExpression(parent) && parent.object === node;
     }
     function AssignmentExpression(node, parent) {
       if (isObjectPattern(node.left)) {
    @@ -224,25 +160,26 @@ function AssignmentExpression(node, parent) {
       }
     }
     function LogicalExpression(node, parent) {
    -  if (isTSTypeExpression(parent)) return true;
    +  const parentType = parent.type;
    +  if (isTSTypeExpression(parentType)) return true;
    +  if (parentType !== "LogicalExpression") return false;
       switch (node.operator) {
         case "||":
    -      if (!isLogicalExpression(parent)) return false;
           return parent.operator === "??" || parent.operator === "&&";
         case "&&":
    -      return isLogicalExpression(parent, {
    -        operator: "??"
    -      });
    +      return parent.operator === "??";
         case "??":
    -      return isLogicalExpression(parent) && parent.operator !== "??";
    +      return parent.operator !== "??";
       }
     }
     function Identifier(node, parent, printStack) {
       var _node$extra;
    -  if ((_node$extra = node.extra) != null && _node$extra.parenthesized && isAssignmentExpression(parent, {
    -    left: node
    -  }) && (isFunctionExpression(parent.right) || isClassExpression(parent.right)) && parent.right.id == null) {
    -    return true;
    +  const parentType = parent.type;
    +  if ((_node$extra = node.extra) != null && _node$extra.parenthesized && parentType === "AssignmentExpression" && parent.left === node) {
    +    const rightType = parent.right.type;
    +    if ((rightType === "FunctionExpression" || rightType === "ClassExpression") && parent.right.id == null) {
    +      return true;
    +    }
       }
       if (node.name === "let") {
         const isFollowedByBracket = isMemberExpression(parent, {
    @@ -270,28 +207,11 @@ function isFirstInContext(printStack, checkParam) {
       i--;
       let parent = printStack[i];
       while (i >= 0) {
    -    if (expressionStatement && isExpressionStatement(parent, {
    -      expression: node
    -    }) || exportDefault && isExportDefaultDeclaration(parent, {
    -      declaration: node
    -    }) || arrowBody && isArrowFunctionExpression(parent, {
    -      body: node
    -    }) || forHead && isForStatement(parent, {
    -      init: node
    -    }) || forInHead && isForInStatement(parent, {
    -      left: node
    -    }) || forOfHead && isForOfStatement(parent, {
    -      left: node
    -    })) {
    +    const parentType = parent.type;
    +    if (expressionStatement && parentType === "ExpressionStatement" && parent.expression === node || exportDefault && parentType === "ExportDefaultDeclaration" && node === parent.declaration || arrowBody && parentType === "ArrowFunctionExpression" && parent.body === node || forHead && parentType === "ForStatement" && parent.init === node || forInHead && parentType === "ForInStatement" && parent.left === node || forOfHead && parentType === "ForOfStatement" && parent.left === node) {
           return true;
         }
    -    if (i > 0 && (hasPostfixPart(node, parent) && !isNewExpression(parent) || isSequenceExpression(parent) && parent.expressions[0] === node || isUpdateExpression(parent) && !parent.prefix || isConditional(parent, {
    -      test: node
    -    }) || isBinary(parent, {
    -      left: node
    -    }) || isAssignmentExpression(parent, {
    -      left: node
    -    }))) {
    +    if (i > 0 && (hasPostfixPart(node, parent) && parentType !== "NewExpression" || parentType === "SequenceExpression" && parent.expressions[0] === node || parentType === "UpdateExpression" && !parent.prefix || parentType === "ConditionalExpression" && parent.test === node || (parentType === "BinaryExpression" || parentType === "LogicalExpression") && parent.left === node || parentType === "AssignmentExpression" && parent.left === node)) {
           node = parent;
           i--;
           parent = printStack[i];
    diff --git a/tools/node_modules/eslint/node_modules/@babel/generator/lib/node/whitespace.js b/tools/node_modules/eslint/node_modules/@babel/generator/lib/node/whitespace.js
    index 17daf359e42611..181b9566099e13 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/generator/lib/node/whitespace.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/generator/lib/node/whitespace.js
    @@ -63,7 +63,7 @@ function isHelper(node) {
     function isType(node) {
       return isLiteral(node) || isObjectExpression(node) || isArrayExpression(node) || isIdentifier(node) || isMemberExpression(node);
     }
    -const nodes = {
    +const nodes = exports.nodes = {
       AssignmentExpression(node) {
         const state = crawl(node.right);
         if (state.hasCall && state.hasHelper || state.hasFunction) {
    @@ -112,7 +112,6 @@ const nodes = {
         }
       }
     };
    -exports.nodes = nodes;
     nodes.ObjectProperty = nodes.ObjectTypeProperty = nodes.ObjectMethod = function (node, parent) {
       if (parent.properties[0] === node) {
         return 1;
    diff --git a/tools/node_modules/eslint/node_modules/@babel/generator/lib/printer.js b/tools/node_modules/eslint/node_modules/@babel/generator/lib/printer.js
    index cc2faeb07c1182..f137135dc792ae 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/generator/lib/printer.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/generator/lib/printer.js
    @@ -17,10 +17,8 @@ const {
     } = _t;
     const SCIENTIFIC_NOTATION = /e/i;
     const ZERO_DECIMAL_INTEGER = /\.0+$/;
    -const NON_DECIMAL_LITERAL = /^0[box]/;
    -const PURE_ANNOTATION_RE = /^\s*[@#]__PURE__\s*$/;
     const HAS_NEWLINE = /[\n\r\u2028\u2029]/;
    -const HAS_BlOCK_COMMENT_END = /\*\//;
    +const HAS_NEWLINE_OR_BlOCK_COMMENT_END = /[\n\r\u2028\u2029]|\*\//;
     const {
       needsParens
     } = n;
    @@ -29,7 +27,6 @@ class Printer {
         this.inForStatementInitCounter = 0;
         this._printStack = [];
         this._indent = 0;
    -    this._indentChar = 0;
         this._indentRepeat = 0;
         this._insideAux = false;
         this._parenPushNewlineState = null;
    @@ -42,10 +39,9 @@ class Printer {
         this._endsWithInnerRaw = false;
         this._indentInnerComments = true;
         this.format = format;
    -    this._buf = new _buffer.default(map);
    -    this._indentChar = format.indent.style.charCodeAt(0);
         this._indentRepeat = format.indent.style.length;
         this._inputMap = map == null ? void 0 : map._inputMap;
    +    this._buf = new _buffer.default(map, format.indent.style[0]);
       }
       generate(ast) {
         this.print(ast);
    @@ -101,9 +97,16 @@ class Printer {
         this._endsWithWord = true;
         this._noLineTerminator = noLineTerminatorAfter;
       }
    -  number(str) {
    +  number(str, number) {
    +    function isNonDecimalLiteral(str) {
    +      if (str.length > 2 && str.charCodeAt(0) === 48) {
    +        const secondChar = str.charCodeAt(1);
    +        return secondChar === 98 || secondChar === 111 || secondChar === 120;
    +      }
    +      return false;
    +    }
         this.word(str);
    -    this._endsWithInteger = Number.isInteger(+str) && !NON_DECIMAL_LITERAL.test(str) && !SCIENTIFIC_NOTATION.test(str) && !ZERO_DECIMAL_INTEGER.test(str) && str.charCodeAt(str.length - 1) !== 46;
    +    this._endsWithInteger = Number.isInteger(number) && !isNonDecimalLiteral(str) && !SCIENTIFIC_NOTATION.test(str) && !ZERO_DECIMAL_INTEGER.test(str) && str.charCodeAt(str.length - 1) !== 46;
       }
       token(str, maybeNewline = false) {
         this._maybePrintInnerComments();
    @@ -215,7 +218,7 @@ class Printer {
       }
       _maybeIndent(firstChar) {
         if (this._indent && firstChar !== 10 && this.endsWith(10)) {
    -      this._buf.queueIndentation(this._indentChar, this._getIndent());
    +      this._buf.queueIndentation(this._getIndent());
         }
       }
       _shouldIndent(firstChar) {
    @@ -254,9 +257,7 @@ class Printer {
           }
           const chaPost = str.charCodeAt(i + 1);
           if (chaPost === 42) {
    -        if (PURE_ANNOTATION_RE.test(str.slice(i + 2, len - 2))) {
    -          return;
    -        }
    +        return;
           } else if (chaPost !== 47) {
             this._parenPushNewlineState = null;
             return;
    @@ -305,7 +306,7 @@ class Printer {
         }
       }
       print(node, parent, noLineTerminatorAfter, trailingCommentsLineOffset, forceParens) {
    -    var _node$extra;
    +    var _node$extra, _node$leadingComments;
         if (!node) return;
         this._endsWithInnerRaw = false;
         const nodeType = node.type;
    @@ -322,7 +323,24 @@ class Printer {
         const oldInAux = this._insideAux;
         this._insideAux = node.loc == undefined;
         this._maybeAddAuxComment(this._insideAux && !oldInAux);
    -    const shouldPrintParens = forceParens || format.retainFunctionParens && nodeType === "FunctionExpression" && ((_node$extra = node.extra) == null ? void 0 : _node$extra.parenthesized) || needsParens(node, parent, this._printStack);
    +    const parenthesized = (_node$extra = node.extra) == null ? void 0 : _node$extra.parenthesized;
    +    let shouldPrintParens = forceParens || parenthesized && format.retainFunctionParens && nodeType === "FunctionExpression" || needsParens(node, parent, this._printStack);
    +    if (!shouldPrintParens && parenthesized && (_node$leadingComments = node.leadingComments) != null && _node$leadingComments.length && node.leadingComments[0].type === "CommentBlock") {
    +      const parentType = parent == null ? void 0 : parent.type;
    +      switch (parentType) {
    +        case "ExpressionStatement":
    +        case "VariableDeclarator":
    +        case "AssignmentExpression":
    +        case "ReturnStatement":
    +          break;
    +        case "CallExpression":
    +        case "OptionalCallExpression":
    +        case "NewExpression":
    +          if (parent.callee !== node) break;
    +        default:
    +          shouldPrintParens = true;
    +      }
    +    }
         if (shouldPrintParens) {
           this.tokenChar(40);
           this._endsWithInnerRaw = false;
    @@ -402,9 +420,13 @@ class Printer {
           if (!node) continue;
           if (opts.statement) this._printNewline(i === 0, newlineOpts);
           this.print(node, parent, undefined, opts.trailingCommentsLineOffset || 0);
    -      opts.iterator == null ? void 0 : opts.iterator(node, i);
    -      if (i < len - 1) separator == null ? void 0 : separator();
    +      opts.iterator == null || opts.iterator(node, i);
    +      if (i < len - 1) separator == null || separator();
           if (opts.statement) {
    +        var _node$trailingComment;
    +        if (!((_node$trailingComment = node.trailingComments) != null && _node$trailingComment.length)) {
    +          this._lastCommentLine = 0;
    +        }
             if (i + 1 === len) {
               this.newline(1);
             } else {
    @@ -507,7 +529,7 @@ class Printer {
       _shouldPrintComment(comment) {
         if (comment.ignore) return 0;
         if (this._printedComments.has(comment)) return 0;
    -    if (this._noLineTerminator && (HAS_NEWLINE.test(comment.value) || HAS_BlOCK_COMMENT_END.test(comment.value))) {
    +    if (this._noLineTerminator && HAS_NEWLINE_OR_BlOCK_COMMENT_END.test(comment.value)) {
           return 2;
         }
         this._printedComments.add(comment);
    @@ -529,6 +551,14 @@ class Printer {
         }
         let val;
         if (isBlockComment) {
    +      const {
    +        _parenPushNewlineState
    +      } = this;
    +      if ((_parenPushNewlineState == null ? void 0 : _parenPushNewlineState.printed) === false && HAS_NEWLINE.test(comment.value)) {
    +        this.tokenChar(40);
    +        this.indent();
    +        _parenPushNewlineState.printed = true;
    +      }
           val = `/*${comment.value}*/`;
           if (this.format.indent.adjustMultilineComment) {
             var _comment$loc;
    @@ -537,11 +567,15 @@ class Printer {
               const newlineRegex = new RegExp("\\n\\s{1," + offset + "}", "g");
               val = val.replace(newlineRegex, "\n");
             }
    -        let indentSize = this.format.retainLines ? 0 : this._buf.getCurrentColumn();
    -        if (this._shouldIndent(47) || this.format.retainLines) {
    -          indentSize += this._getIndent();
    +        if (this.format.concise) {
    +          val = val.replace(/\n(?!$)/g, `\n`);
    +        } else {
    +          let indentSize = this.format.retainLines ? 0 : this._buf.getCurrentColumn();
    +          if (this._shouldIndent(47) || this.format.retainLines) {
    +            indentSize += this._getIndent();
    +          }
    +          val = val.replace(/\n(?!$)/g, `\n${" ".repeat(indentSize)}`);
             }
    -        val = val.replace(/\n(?!$)/g, `\n${" ".repeat(indentSize)}`);
           }
         } else if (!noLineTerminator) {
           val = `//${comment.value}`;
    @@ -641,8 +675,7 @@ Object.assign(Printer.prototype, generatorFunctions);
     {
       Printer.prototype.Noop = function Noop() {};
     }
    -var _default = Printer;
    -exports.default = _default;
    +var _default = exports.default = Printer;
     function commaSeparator() {
       this.tokenChar(44);
       this.space();
    diff --git a/tools/node_modules/eslint/node_modules/@babel/generator/package.json b/tools/node_modules/eslint/node_modules/@babel/generator/package.json
    index b4c036e9e5dd36..62a4797864af99 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/generator/package.json
    +++ b/tools/node_modules/eslint/node_modules/@babel/generator/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@babel/generator",
    -  "version": "7.23.0",
    +  "version": "7.23.6",
       "description": "Turns an AST into code.",
       "author": "The Babel Team (https://babel.dev/team)",
       "license": "MIT",
    @@ -19,14 +19,14 @@
         "lib"
       ],
       "dependencies": {
    -    "@babel/types": "^7.23.0",
    +    "@babel/types": "^7.23.6",
         "@jridgewell/gen-mapping": "^0.3.2",
         "@jridgewell/trace-mapping": "^0.3.17",
         "jsesc": "^2.5.1"
       },
       "devDependencies": {
    -    "@babel/helper-fixtures": "^7.22.19",
    -    "@babel/parser": "^7.23.0",
    +    "@babel/helper-fixtures": "^7.23.4",
    +    "@babel/parser": "^7.23.6",
         "@jridgewell/sourcemap-codec": "^1.4.15",
         "@types/jsesc": "^2.5.0",
         "charcodes": "^0.2.0"
    diff --git a/tools/node_modules/eslint/node_modules/@babel/helper-compilation-targets/lib/filter-items.js b/tools/node_modules/eslint/node_modules/@babel/helper-compilation-targets/lib/filter-items.js
    index 3f74cb937e1b0e..d898c950a58829 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/helper-compilation-targets/lib/filter-items.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/helper-compilation-targets/lib/filter-items.js
    @@ -59,8 +59,8 @@ function filterItems(list, includes, excludes, targets, defaultIncludes, default
           }
         }
       }
    -  defaultIncludes == null ? void 0 : defaultIncludes.forEach(item => !excludes.has(item) && result.add(item));
    -  defaultExcludes == null ? void 0 : defaultExcludes.forEach(item => !includes.has(item) && result.delete(item));
    +  defaultIncludes == null || defaultIncludes.forEach(item => !excludes.has(item) && result.add(item));
    +  defaultExcludes == null || defaultExcludes.forEach(item => !includes.has(item) && result.delete(item));
       return result;
     }
     
    diff --git a/tools/node_modules/eslint/node_modules/@babel/helper-compilation-targets/lib/options.js b/tools/node_modules/eslint/node_modules/@babel/helper-compilation-targets/lib/options.js
    index 71c949b356a266..cdb7c00d6403d5 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/helper-compilation-targets/lib/options.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/helper-compilation-targets/lib/options.js
    @@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
       value: true
     });
     exports.TargetNames = void 0;
    -const TargetNames = {
    +const TargetNames = exports.TargetNames = {
       node: "node",
       deno: "deno",
       chrome: "chrome",
    @@ -20,6 +20,5 @@ const TargetNames = {
       rhino: "rhino",
       opera_mobile: "opera_mobile"
     };
    -exports.TargetNames = TargetNames;
     
     //# sourceMappingURL=options.js.map
    diff --git a/tools/node_modules/eslint/node_modules/@babel/helper-compilation-targets/lib/targets.js b/tools/node_modules/eslint/node_modules/@babel/helper-compilation-targets/lib/targets.js
    index 6c4f6831144170..d4d5e06cbba58c 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/helper-compilation-targets/lib/targets.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/helper-compilation-targets/lib/targets.js
    @@ -4,11 +4,10 @@ Object.defineProperty(exports, "__esModule", {
       value: true
     });
     exports.unreleasedLabels = exports.browserNameMap = void 0;
    -const unreleasedLabels = {
    +const unreleasedLabels = exports.unreleasedLabels = {
       safari: "tp"
     };
    -exports.unreleasedLabels = unreleasedLabels;
    -const browserNameMap = {
    +const browserNameMap = exports.browserNameMap = {
       and_chr: "chrome",
       and_ff: "firefox",
       android: "android",
    @@ -25,6 +24,5 @@ const browserNameMap = {
       safari: "safari",
       samsung: "samsung"
     };
    -exports.browserNameMap = browserNameMap;
     
     //# sourceMappingURL=targets.js.map
    diff --git a/tools/node_modules/eslint/node_modules/@babel/helper-compilation-targets/package.json b/tools/node_modules/eslint/node_modules/@babel/helper-compilation-targets/package.json
    index 677cd048544034..9d908fd9faa767 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/helper-compilation-targets/package.json
    +++ b/tools/node_modules/eslint/node_modules/@babel/helper-compilation-targets/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@babel/helper-compilation-targets",
    -  "version": "7.22.15",
    +  "version": "7.23.6",
       "author": "The Babel Team (https://babel.dev/team)",
       "license": "MIT",
       "description": "Helper functions on Babel compilation targets",
    @@ -22,9 +22,9 @@
         "babel-plugin"
       ],
       "dependencies": {
    -    "@babel/compat-data": "^7.22.9",
    -    "@babel/helper-validator-option": "^7.22.15",
    -    "browserslist": "^4.21.9",
    +    "@babel/compat-data": "^7.23.5",
    +    "@babel/helper-validator-option": "^7.23.5",
    +    "browserslist": "^4.22.2",
         "lru-cache": "^5.1.1",
         "semver": "^6.3.1"
       },
    diff --git a/tools/node_modules/eslint/node_modules/@babel/helper-module-transforms/lib/index.js b/tools/node_modules/eslint/node_modules/@babel/helper-module-transforms/lib/index.js
    index e002e265d1c2cd..35a44be5890fb5 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/helper-module-transforms/lib/index.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/helper-module-transforms/lib/index.js
    @@ -353,7 +353,8 @@ function buildExportInitializationStatements(programPath, metadata, wrapReferenc
     }
     const InitTemplate = {
       computed: _core.template.expression`EXPORTS["NAME"] = VALUE`,
    -  default: _core.template.expression`EXPORTS.NAME = VALUE`
    +  default: _core.template.expression`EXPORTS.NAME = VALUE`,
    +  define: _core.template.expression`Object.defineProperty(EXPORTS, "NAME", { enumerable:true, value: void 0, writable: true })["NAME"] = VALUE`
     };
     function buildInitStatement(metadata, exportNames, initExpr) {
       const {
    @@ -366,11 +367,13 @@ function buildInitStatement(metadata, exportNames, initExpr) {
           NAME: exportName,
           VALUE: acc
         };
    +    if (exportName === "__proto__") {
    +      return InitTemplate.define(params);
    +    }
         if (stringSpecifiers.has(exportName)) {
           return InitTemplate.computed(params);
    -    } else {
    -      return InitTemplate.default(params);
         }
    +    return InitTemplate.default(params);
       }, initExpr));
     }
     
    diff --git a/tools/node_modules/eslint/node_modules/@babel/helper-module-transforms/package.json b/tools/node_modules/eslint/node_modules/@babel/helper-module-transforms/package.json
    index 63f51e03bc25d5..895e0ddab9b7f6 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/helper-module-transforms/package.json
    +++ b/tools/node_modules/eslint/node_modules/@babel/helper-module-transforms/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@babel/helper-module-transforms",
    -  "version": "7.23.0",
    +  "version": "7.23.3",
       "description": "Babel helper functions for implementing ES6 module transformations",
       "author": "The Babel Team (https://babel.dev/team)",
       "homepage": "https://babel.dev/docs/en/next/babel-helper-module-transforms",
    @@ -22,8 +22,8 @@
         "@babel/helper-validator-identifier": "^7.22.20"
       },
       "devDependencies": {
    -    "@babel/core": "^7.23.0",
    -    "@babel/traverse": "^7.23.0"
    +    "@babel/core": "^7.23.3",
    +    "@babel/traverse": "^7.23.3"
       },
       "peerDependencies": {
         "@babel/core": "^7.0.0"
    diff --git a/tools/node_modules/eslint/node_modules/@babel/helper-string-parser/package.json b/tools/node_modules/eslint/node_modules/@babel/helper-string-parser/package.json
    index a977dea9b17d39..f05afe5b87664e 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/helper-string-parser/package.json
    +++ b/tools/node_modules/eslint/node_modules/@babel/helper-string-parser/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@babel/helper-string-parser",
    -  "version": "7.22.5",
    +  "version": "7.23.4",
       "description": "A utility package to parse strings",
       "repository": {
         "type": "git",
    diff --git a/tools/node_modules/eslint/node_modules/@babel/helper-validator-option/package.json b/tools/node_modules/eslint/node_modules/@babel/helper-validator-option/package.json
    index c6ed03172f2ce8..8e58a9c2222287 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/helper-validator-option/package.json
    +++ b/tools/node_modules/eslint/node_modules/@babel/helper-validator-option/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@babel/helper-validator-option",
    -  "version": "7.22.15",
    +  "version": "7.23.5",
       "description": "Validate plugin/preset options",
       "repository": {
         "type": "git",
    diff --git a/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers-generated.js b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers-generated.js
    index aff47496d37b4f..656a51dc0d7f97 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers-generated.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers-generated.js
    @@ -13,14 +13,14 @@ function helper(minVersion, source) {
         })
       });
     }
    -var _default = Object.freeze({
    +var _default = exports.default = Object.freeze({
       AsyncGenerator: helper("7.0.0-beta.0", 'import OverloadYield from"OverloadYield";export default function AsyncGenerator(e){var r,t;function resume(r,t){try{var n=e[r](t),o=n.value,u=o instanceof OverloadYield;Promise.resolve(u?o.v:o).then((function(t){if(u){var i="return"===r?"return":"next";if(!o.k||t.done)return resume(i,t);t=e[i](t).value}settle(n.done?"return":"normal",t)}),(function(e){resume("throw",e)}))}catch(e){settle("throw",e)}}function settle(e,n){switch(e){case"return":r.resolve({value:n,done:!0});break;case"throw":r.reject(n);break;default:r.resolve({value:n,done:!1})}(r=r.next)?resume(r.key,r.arg):t=null}this._invoke=function(e,n){return new Promise((function(o,u){var i={key:e,arg:n,resolve:o,reject:u,next:null};t?t=t.next=i:(r=t=i,resume(e,n))}))},"function"!=typeof e.return&&(this.return=void 0)}AsyncGenerator.prototype["function"==typeof Symbol&&Symbol.asyncIterator||"@@asyncIterator"]=function(){return this},AsyncGenerator.prototype.next=function(e){return this._invoke("next",e)},AsyncGenerator.prototype.throw=function(e){return this._invoke("throw",e)},AsyncGenerator.prototype.return=function(e){return this._invoke("return",e)};'),
       OverloadYield: helper("7.18.14", "export default function _OverloadYield(t,e){this.v=t,this.k=e}"),
    -  applyDecs: helper("7.17.8", 'function old_createMetadataMethodsForProperty(e,t,a,r){return{getMetadata:function(o){old_assertNotFinished(r,"getMetadata"),old_assertMetadataKey(o);var i=e[o];if(void 0!==i)if(1===t){var n=i.public;if(void 0!==n)return n[a]}else if(2===t){var l=i.private;if(void 0!==l)return l.get(a)}else if(Object.hasOwnProperty.call(i,"constructor"))return i.constructor},setMetadata:function(o,i){old_assertNotFinished(r,"setMetadata"),old_assertMetadataKey(o);var n=e[o];if(void 0===n&&(n=e[o]={}),1===t){var l=n.public;void 0===l&&(l=n.public={}),l[a]=i}else if(2===t){var s=n.priv;void 0===s&&(s=n.private=new Map),s.set(a,i)}else n.constructor=i}}}function old_convertMetadataMapToFinal(e,t){var a=e[Symbol.metadata||Symbol.for("Symbol.metadata")],r=Object.getOwnPropertySymbols(t);if(0!==r.length){for(var o=0;o=0;y--){var b;if(void 0!==(f=old_memberDec(h[y],r,c,l,s,o,i,n,u)))old_assertValidReturnValue(o,f),0===o?b=f:1===o?(b=old_getInit(f),p=f.get||u.get,v=f.set||u.set,u={get:p,set:v}):u=f,void 0!==b&&(void 0===d?d=b:"function"==typeof d?d=[d,b]:d.push(b))}if(0===o||1===o){if(void 0===d)d=function(e,t){return t};else if("function"!=typeof d){var g=d;d=function(e,t){for(var a=t,r=0;r3,b=v>=5;if(b?(u=t,f=r,0!==(v-=5)&&(p=n=n||[])):(u=t.prototype,f=a,0!==v&&(p=i=i||[])),0!==v&&!y){var g=b?s:l,m=g.get(h)||0;if(!0===m||3===m&&4!==v||4===m&&3!==v)throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: "+h);!m&&v>2?g.set(h,v):g.set(h,!0)}old_applyMemberDec(e,u,d,h,v,b,y,f,p)}}old_pushInitializers(e,i),old_pushInitializers(e,n)}function old_pushInitializers(e,t){t&&e.push((function(e){for(var a=0;a0){for(var o=[],i=t,n=t.name,l=r.length-1;l>=0;l--){var s={v:!1};try{var c=Object.assign({kind:"class",name:n,addInitializer:old_createAddInitializerMethod(o,s)},old_createMetadataMethodsForProperty(a,0,n,s)),d=r[l](i,c)}finally{s.v=!0}void 0!==d&&(old_assertValidReturnValue(10,d),i=d)}e.push(i,(function(){for(var e=0;e=0;v--){var g;if(void 0!==(f=memberDec(h[v],a,c,o,n,i,s,u)))assertValidReturnValue(n,f),0===n?g=f:1===n?(g=f.init,p=f.get||u.get,d=f.set||u.set,u={get:p,set:d}):u=f,void 0!==g&&(void 0===l?l=g:"function"==typeof l?l=[l,g]:l.push(g))}if(0===n||1===n){if(void 0===l)l=function(e,t){return t};else if("function"!=typeof l){var y=l;l=function(e,t){for(var r=t,a=0;a3,h=f>=5;if(h?(l=t,0!=(f-=5)&&(u=n=n||[])):(l=t.prototype,0!==f&&(u=a=a||[])),0!==f&&!d){var v=h?s:i,g=v.get(p)||0;if(!0===g||3===g&&4!==f||4===g&&3!==f)throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: "+p);!g&&f>2?v.set(p,f):v.set(p,!0)}applyMemberDec(e,l,c,p,f,h,d,u)}}pushInitializers(e,a),pushInitializers(e,n)}(a,e,t),function(e,t,r){if(r.length>0){for(var a=[],n=t,i=t.name,s=r.length-1;s>=0;s--){var o={v:!1};try{var c=r[s](n,{kind:"class",name:i,addInitializer:createAddInitializerMethod(a,o)})}finally{o.v=!0}void 0!==c&&(assertValidReturnValue(10,c),n=c)}e.push(n,(function(){for(var e=0;e=0;v--){var g;if(void 0!==(f=memberDec(h[v],n,c,o,a,i,s,u)))assertValidReturnValue(a,f),0===a?g=f:1===a?(g=f.init,p=f.get||u.get,d=f.set||u.set,u={get:p,set:d}):u=f,void 0!==g&&(void 0===l?l=g:"function"==typeof l?l=[l,g]:l.push(g))}if(0===a||1===a){if(void 0===l)l=function(e,t){return t};else if("function"!=typeof l){var y=l;l=function(e,t){for(var r=t,n=0;n3,h=f>=5;if(h?(l=e,0!==(f-=5)&&(u=n=n||[])):(l=e.prototype,0!==f&&(u=r=r||[])),0!==f&&!d){var v=h?s:i,g=v.get(p)||0;if(!0===g||3===g&&4!==f||4===g&&3!==f)throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: "+p);!g&&f>2?v.set(p,f):v.set(p,!0)}applyMemberDec(a,l,c,p,f,h,d,u)}}return pushInitializers(a,r),pushInitializers(a,n),a}function pushInitializers(e,t){t&&e.push((function(e){for(var r=0;r0){for(var r=[],n=e,a=e.name,i=t.length-1;i>=0;i--){var s={v:!1};try{var o=t[i](n,{kind:"class",name:a,addInitializer:createAddInitializerMethod(r,s)})}finally{s.v=!0}void 0!==o&&(assertValidReturnValue(10,o),n=o)}return[n,function(){for(var e=0;e=0;y--){var m;if(void 0!==(d=memberDec(g[y],n,u,o,a,i,s,f,c)))assertValidReturnValue(a,d),0===a?m=d:1===a?(m=d.init,h=d.get||f.get,v=d.set||f.set,f={get:h,set:v}):f=d,void 0!==m&&(void 0===l?l=m:"function"==typeof l?l=[l,m]:l.push(m))}if(0===a||1===a){if(void 0===l)l=function(e,t){return t};else if("function"!=typeof l){var b=l;l=function(e,t){for(var r=t,n=0;n3,g=d>=5,y=r;if(g?(f=e,0!==(d-=5)&&(p=a=a||[]),v&&!i&&(i=function(t){return checkInRHS(t)===e}),y=i):(f=e.prototype,0!==d&&(p=n=n||[])),0!==d&&!v){var m=g?c:o,b=m.get(h)||0;if(!0===b||3===b&&4!==d||4===b&&3!==d)throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: "+h);!b&&d>2?m.set(h,d):m.set(h,!0)}applyMemberDec(s,f,l,h,d,g,v,p,y)}}return pushInitializers(s,n),pushInitializers(s,a),s}function pushInitializers(e,t){t&&e.push((function(e){for(var r=0;r0){for(var r=[],n=e,a=e.name,i=t.length-1;i>=0;i--){var s={v:!1};try{var o=t[i](n,{kind:"class",name:a,addInitializer:createAddInitializerMethod(r,s)})}finally{s.v=!0}void 0!==o&&(assertValidReturnValue(10,o),n=o)}return[n,function(){for(var e=0;e=0;b-=g){var I;if(void 0!==(h=memberDec(m[b],a?m[b-1]:void 0,n,f,c,i,s,o,p,l,u)))assertValidReturnValue(i,h),0===i?I=h:1===i?(I=h.init,v=h.get||p.get,y=h.set||p.set,p={get:v,set:y}):p=h,void 0!==I&&(void 0===d?d=I:"function"==typeof d?d=[d,I]:d.push(I))}if(0===i||1===i){if(void 0===d)d=function(e,t){return t};else if("function"!=typeof d){var w=d;d=function(e,t){for(var r=t,a=w.length-1;a>=0;a--)r=w[a].call(e,r);return r}}else{var M=d;d=function(e,t){return M.call(e,t)}}e.push(d)}0!==i&&(1===i?(f.get=p.get,f.set=p.set):2===i?f.value=p:3===i?f.get=p:4===i&&(f.set=p),o?1===i?(e.push((function(e,t){return p.get.call(e,t)})),e.push((function(e,t){return p.set.call(e,t)}))):2===i?e.push(p):e.push((function(e,t){return p.call(e,t)})):Object.defineProperty(t,n,f))}function applyMemberDecs(e,t,r,a){for(var n,i,s,o=[],c=new Map,l=new Map,u=0;u3,m=16&h,g=!!(8&h),b=r;if(h&=7,g?(d=e,0!==h&&(p=i=i||[]),y&&!s&&(s=function(t){return checkInRHS(t)===e}),b=s):(d=e.prototype,0!==h&&(p=n=n||[])),0!==h&&!y){var I=g?l:c,w=I.get(v)||0;if(!0===w||3===w&&4!==h||4===w&&3!==h)throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: "+v);I.set(v,!(!w&&h>2)||h)}applyMemberDec(o,d,f,m,v,h,g,y,p,b,a)}}return pushInitializers(o,n),pushInitializers(o,i),o}function pushInitializers(e,t){t&&e.push((function(e){for(var r=0;r=0;c-=o){var l={v:!1};try{var u=t[c].call(r?t[c-1]:void 0,i,{kind:"class",name:s,addInitializer:createAddInitializerMethod(n,l),metadata:a})}finally{l.v=!0}void 0!==u&&(assertValidReturnValue(5,u),i=u)}return[defineMetadata(i,a),function(){for(var e=0;e=6)var s=i[Symbol.metadata||Symbol.for("Symbol.metadata")];var o=Object.create(void 0===s?null:s),c=applyMemberDecs(e,t,n,o);return r.length||defineMetadata(e,o),{e:c,get c(){return applyClassDecs(e,r,a,o)}}}'),
    +  applyDecs: helper("7.17.8", 'import setFunctionName from"setFunctionName";import toPropertyKey from"toPropertyKey";function old_createMetadataMethodsForProperty(e,t,a,r){return{getMetadata:function(o){old_assertNotFinished(r,"getMetadata"),old_assertMetadataKey(o);var i=e[o];if(void 0!==i)if(1===t){var n=i.public;if(void 0!==n)return n[a]}else if(2===t){var l=i.private;if(void 0!==l)return l.get(a)}else if(Object.hasOwnProperty.call(i,"constructor"))return i.constructor},setMetadata:function(o,i){old_assertNotFinished(r,"setMetadata"),old_assertMetadataKey(o);var n=e[o];if(void 0===n&&(n=e[o]={}),1===t){var l=n.public;void 0===l&&(l=n.public={}),l[a]=i}else if(2===t){var s=n.priv;void 0===s&&(s=n.private=new Map),s.set(a,i)}else n.constructor=i}}}function old_convertMetadataMapToFinal(e,t){var a=e[Symbol.metadata||Symbol.for("Symbol.metadata")],r=Object.getOwnPropertySymbols(t);if(0!==r.length){for(var o=0;o=0;m--){var b;void 0!==(p=old_memberDec(h[m],r,c,l,s,o,i,n,f))&&(old_assertValidReturnValue(o,p),0===o?b=p:1===o?(b=old_getInit(p),v=p.get||f.get,y=p.set||f.set,f={get:v,set:y}):f=p,void 0!==b&&(void 0===d?d=b:"function"==typeof d?d=[d,b]:d.push(b)))}if(0===o||1===o){if(void 0===d)d=function(e,t){return t};else if("function"!=typeof d){var g=d;d=function(e,t){for(var a=t,r=0;r3,m=v>=5;if(m?(u=t,f=r,0!=(v-=5)&&(p=n=n||[])):(u=t.prototype,f=a,0!==v&&(p=i=i||[])),0!==v&&!h){var b=m?s:l,g=b.get(y)||0;if(!0===g||3===g&&4!==v||4===g&&3!==v)throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: "+y);!g&&v>2?b.set(y,v):b.set(y,!0)}old_applyMemberDec(e,u,d,y,v,m,h,f,p)}}old_pushInitializers(e,i),old_pushInitializers(e,n)}function old_pushInitializers(e,t){t&&e.push((function(e){for(var a=0;a0){for(var o=[],i=t,n=t.name,l=r.length-1;l>=0;l--){var s={v:!1};try{var c=Object.assign({kind:"class",name:n,addInitializer:old_createAddInitializerMethod(o,s)},old_createMetadataMethodsForProperty(a,0,n,s)),d=r[l](i,c)}finally{s.v=!0}void 0!==d&&(old_assertValidReturnValue(10,d),i=d)}e.push(i,(function(){for(var e=0;e=0;v--){var g;void 0!==(f=memberDec(h[v],a,c,o,n,i,s,u))&&(assertValidReturnValue(n,f),0===n?g=f:1===n?(g=f.init,p=f.get||u.get,d=f.set||u.set,u={get:p,set:d}):u=f,void 0!==g&&(void 0===l?l=g:"function"==typeof l?l=[l,g]:l.push(g)))}if(0===n||1===n){if(void 0===l)l=function(e,t){return t};else if("function"!=typeof l){var y=l;l=function(e,t){for(var r=t,a=0;a3,h=f>=5;if(h?(l=t,0!=(f-=5)&&(u=n=n||[])):(l=t.prototype,0!==f&&(u=a=a||[])),0!==f&&!d){var v=h?s:i,g=v.get(p)||0;if(!0===g||3===g&&4!==f||4===g&&3!==f)throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: "+p);!g&&f>2?v.set(p,f):v.set(p,!0)}applyMemberDec(e,l,c,p,f,h,d,u)}}pushInitializers(e,a),pushInitializers(e,n)}(a,e,t),function(e,t,r){if(r.length>0){for(var a=[],n=t,i=t.name,s=r.length-1;s>=0;s--){var o={v:!1};try{var c=r[s](n,{kind:"class",name:i,addInitializer:createAddInitializerMethod(a,o)})}finally{o.v=!0}void 0!==c&&(assertValidReturnValue(10,c),n=c)}e.push(n,(function(){for(var e=0;e=0;g--){var y;void 0!==(p=memberDec(v[g],n,c,s,a,i,o,f))&&(assertValidReturnValue(a,p),0===a?y=p:1===a?(y=p.init,d=p.get||f.get,h=p.set||f.set,f={get:d,set:h}):f=p,void 0!==y&&(void 0===l?l=y:"function"==typeof l?l=[l,y]:l.push(y)))}if(0===a||1===a){if(void 0===l)l=function(e,t){return t};else if("function"!=typeof l){var m=l;l=function(e,t){for(var r=t,n=0;n3,h=f>=5;if(h?(l=e,0!=(f-=5)&&(u=n=n||[])):(l=e.prototype,0!==f&&(u=r=r||[])),0!==f&&!d){var v=h?o:i,g=v.get(p)||0;if(!0===g||3===g&&4!==f||4===g&&3!==f)throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: "+p);!g&&f>2?v.set(p,f):v.set(p,!0)}applyMemberDec(a,l,c,p,f,h,d,u)}}return pushInitializers(a,r),pushInitializers(a,n),a}function pushInitializers(e,t){t&&e.push((function(e){for(var r=0;r0){for(var r=[],n=e,a=e.name,i=t.length-1;i>=0;i--){var o={v:!1};try{var s=t[i](n,{kind:"class",name:a,addInitializer:createAddInitializerMethod(r,o)})}finally{o.v=!0}void 0!==s&&(assertValidReturnValue(10,s),n=s)}return[n,function(){for(var e=0;e=0;m--){var b;void 0!==(h=memberDec(g[m],n,u,o,a,i,s,p,c))&&(assertValidReturnValue(a,h),0===a?b=h:1===a?(b=h.init,v=h.get||p.get,y=h.set||p.set,p={get:v,set:y}):p=h,void 0!==b&&(void 0===l?l=b:"function"==typeof l?l=[l,b]:l.push(b)))}if(0===a||1===a){if(void 0===l)l=function(e,t){return t};else if("function"!=typeof l){var I=l;l=function(e,t){for(var r=t,n=0;n3,y=d>=5,g=r;if(y?(f=e,0!=(d-=5)&&(p=a=a||[]),v&&!i&&(i=function(t){return checkInRHS(t)===e}),g=i):(f=e.prototype,0!==d&&(p=n=n||[])),0!==d&&!v){var m=y?c:o,b=m.get(h)||0;if(!0===b||3===b&&4!==d||4===b&&3!==d)throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: "+h);!b&&d>2?m.set(h,d):m.set(h,!0)}applyMemberDec(s,f,l,h,d,y,v,p,g)}}return pushInitializers(s,n),pushInitializers(s,a),s}function pushInitializers(e,t){t&&e.push((function(e){for(var r=0;r0){for(var r=[],n=e,a=e.name,i=t.length-1;i>=0;i--){var s={v:!1};try{var o=t[i](n,{kind:"class",name:a,addInitializer:createAddInitializerMethod(r,s)})}finally{s.v=!0}void 0!==o&&(assertValidReturnValue(10,o),n=o)}return[n,function(){for(var e=0;e=0;j-=r?2:1){var D=g[j],E=r?g[j-1]:void 0,I={},O={kind:["field","accessor","method","getter","setter","field","class"][o],name:n,metadata:a,addInitializer:function(e,t){if(e.v)throw new Error("attempted to call addInitializer after decoration was finished");s(t,"An initializer","be",!0),c.push(t)}.bind(null,I)};try{if(w)v=D.call(E,e,O);else{var k,F;O.static=l,O.private=f,f||!p&&2!==o?2===o?k=function(e){return m(e),S.value}:((o<2||3===o)&&(k=i(S,"get",f&&m)),(o<2||4===o)&&(F=i(S,"set",f&&m))):(k=function(e){return e[n]},p&&(F=function(e,t){e[n]=t}));var N=O.access={has:f?h.bind():function(e){return n in e}};if(k&&(N.get=k),F&&(N.set=F),v=D.call(E,d?{get:S.get,set:S.set}:S[P],O),d){if("object"==typeof v&&v)(y=s(v.get,"accessor.get"))&&(S.get=y),(y=s(v.set,"accessor.set"))&&(S.set=y),(y=s(v.init,"accessor.init"))&&A.push(y);else if(void 0!==v)throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0")}else s(v,(p?"field":"method")+" decorators","return")&&(p?A.push(v):S[P]=v)}}finally{I.v=!0}}return(p||d)&&u.push((function(e,t){for(var r=A.length-1;r>=0;r--)t=A[r].call(e,t);return t})),p||w||(f?d?u.push(i(S,"get"),i(S,"set")):u.push(2===o?S[P]:i.call.bind(S[P])):Object.defineProperty(e,n,S)),v}function u(e,t){return Object.defineProperty(e,Symbol.metadata||Symbol.for("Symbol.metadata"),{configurable:!0,enumerable:!0,value:t})}if(arguments.length>=6)var l=a[Symbol.metadata||Symbol.for("Symbol.metadata")];var f=Object.create(null==l?null:l),p=function(e,t,r,n){var o,a,i=[],s=function(t){return checkInRHS(t)===e},u=new Map;function l(e){e&&i.push(c.bind(null,e))}for(var f=0;f3,y=16&d,v=!!(8&d),g=0==(d&=7),b=h+"/"+v;if(!g&&!m){var w=u.get(b);if(!0===w||3===w&&4!==d||4===w&&3!==d)throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: "+h);u.set(b,!(d>2)||d)}applyDec(v?e:e.prototype,p,y,m?"#"+h:toPropertyKey(h),d,n,v?a=a||[]:o=o||[],i,v,m,g,1===d,v&&m?s:r)}}return l(o),l(a),i}(e,t,o,f);return r.length||u(e,f),{e:p,get c(){var t=[];return r.length&&[u(s(applyDec(e,[r],n,e.name,5,f,t),"class decorators","return")||e,f),c.bind(null,t,e)]}}}'),
       asyncGeneratorDelegate: helper("7.0.0-beta.0", 'import OverloadYield from"OverloadYield";export default function _asyncGeneratorDelegate(t){var e={},n=!1;function pump(e,r){return n=!0,r=new Promise((function(n){n(t[e](r))})),{done:!1,value:new OverloadYield(r,1)}}return e["undefined"!=typeof Symbol&&Symbol.iterator||"@@iterator"]=function(){return this},e.next=function(t){return n?(n=!1,t):pump("next",t)},"function"==typeof t.throw&&(e.throw=function(t){if(n)throw n=!1,t;return pump("throw",t)}),"function"==typeof t.return&&(e.return=function(t){return n?(n=!1,t):pump("return",t)}),e}'),
       asyncIterator: helper("7.15.9", 'export default function _asyncIterator(r){var n,t,o,e=2;for("undefined"!=typeof Symbol&&(t=Symbol.asyncIterator,o=Symbol.iterator);e--;){if(t&&null!=(n=r[t]))return n.call(r);if(o&&null!=(n=r[o]))return new AsyncFromSyncIterator(n.call(r));t="@@asyncIterator",o="@@iterator"}throw new TypeError("Object is not async iterable")}function AsyncFromSyncIterator(r){function AsyncFromSyncIteratorContinuation(r){if(Object(r)!==r)return Promise.reject(new TypeError(r+" is not an object."));var n=r.done;return Promise.resolve(r.value).then((function(r){return{value:r,done:n}}))}return AsyncFromSyncIterator=function(r){this.s=r,this.n=r.next},AsyncFromSyncIterator.prototype={s:null,n:null,next:function(){return AsyncFromSyncIteratorContinuation(this.n.apply(this.s,arguments))},return:function(r){var n=this.s.return;return void 0===n?Promise.resolve({value:r,done:!0}):AsyncFromSyncIteratorContinuation(n.apply(this.s,arguments))},throw:function(r){var n=this.s.return;return void 0===n?Promise.reject(r):AsyncFromSyncIteratorContinuation(n.apply(this.s,arguments))}},new AsyncFromSyncIterator(r)}'),
       awaitAsyncGenerator: helper("7.0.0-beta.0", 'import OverloadYield from"OverloadYield";export default function _awaitAsyncGenerator(e){return new OverloadYield(e,0)}'),
    @@ -28,15 +28,18 @@ var _default = Object.freeze({
       defineAccessor: helper("7.20.7", "export default function _defineAccessor(e,r,n,t){var c={configurable:!0,enumerable:!0};return c[e]=t,Object.defineProperty(r,n,c)}"),
       dispose: helper("7.22.0", 'function dispose_SuppressedError(r,e){return"undefined"!=typeof SuppressedError?dispose_SuppressedError=SuppressedError:(dispose_SuppressedError=function(r,e){this.suppressed=r,this.error=e,this.stack=(new Error).stack},dispose_SuppressedError.prototype=Object.create(Error.prototype,{constructor:{value:dispose_SuppressedError,writable:!0,configurable:!0}})),new dispose_SuppressedError(r,e)}export default function _dispose(r,e,s){function next(){for(;r.length>0;)try{var o=r.pop(),p=o.d.call(o.v);if(o.a)return Promise.resolve(p).then(next,err)}catch(r){return err(r)}if(s)throw e}function err(r){return e=s?new dispose_SuppressedError(r,e):r,s=!0,next()}return next()}'),
       importDeferProxy: helper("7.23.0", "export default function _importDeferProxy(e){var t=null,constValue=function(e){return function(){return e}},proxy=function(r){return function(n,o,f){return null===t&&(t=e()),r(t,o,f)}};return new Proxy({},{defineProperty:constValue(!1),deleteProperty:constValue(!1),get:proxy(Reflect.get),getOwnPropertyDescriptor:proxy(Reflect.getOwnPropertyDescriptor),getPrototypeOf:constValue(null),isExtensible:constValue(!1),has:proxy(Reflect.has),ownKeys:proxy(Reflect.ownKeys),preventExtensions:constValue(!0),set:constValue(!1),setPrototypeOf:constValue(!1)})}"),
    +  interopRequireWildcard: helper("7.14.0", 'function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap,t=new WeakMap;return(_getRequireWildcardCache=function(e){return e?t:r})(e)}export default function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache(r);if(t&&t.has(e))return t.get(e);var n={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&Object.prototype.hasOwnProperty.call(e,u)){var i=a?Object.getOwnPropertyDescriptor(e,u):null;i&&(i.get||i.set)?Object.defineProperty(n,u,i):n[u]=e[u]}return n.default=e,t&&t.set(e,n),n}'),
       iterableToArrayLimit: helper("7.0.0-beta.0", 'export default function _iterableToArrayLimit(r,l){var t=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=t){var e,n,i,u,a=[],f=!0,o=!1;try{if(i=(t=t.call(r)).next,0===l){if(Object(t)!==t)return;f=!1}else for(;!(f=(e=i.call(t)).done)&&(a.push(e.value),a.length!==l);f=!0);}catch(r){o=!0,n=r}finally{try{if(!f&&null!=t.return&&(u=t.return(),Object(u)!==u))return}finally{if(o)throw n}}return a}}'),
       iterableToArrayLimitLoose: helper("7.0.0-beta.0", 'export default function _iterableToArrayLimitLoose(e,r){var t=e&&("undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"]);if(null!=t){var o,l=[];for(t=t.call(e);e.length1){for(var t=new Array(n),f=0;f=0;--o){var i=this.tryEntries[o],a=i.completion;if("root"===i.tryLoc)return handle("end");if(i.tryLoc<=this.prev){var c=n.call(i,"catchLoc"),u=n.call(i,"finallyLoc");if(c&&u){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),resetTryEntry(r),y}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;resetTryEntry(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:values(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),y}},e}'),
    +  setFunctionName: helper("7.23.6", 'export default function setFunctionName(e,t,n){"symbol"==typeof t&&(t=(t=t.description)?"["+t+"]":"");try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+" "+t:t})}catch(e){}return e}'),
    +  toPrimitive: helper("7.1.5", 'export default function toPrimitive(t,r){if("object"!=typeof t||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}'),
    +  toPropertyKey: helper("7.1.5", 'import toPrimitive from"toPrimitive";export default function toPropertyKey(t){var i=toPrimitive(t,"string");return"symbol"==typeof i?i:String(i)}'),
       typeof: helper("7.0.0-beta.0", 'export default function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}'),
    -  using: helper("7.22.0", 'export default function _using(o,e,n){if(null==e)return e;if("object"!=typeof e)throw new TypeError("using declarations can only be used with objects, null, or undefined.");if(n)var r=e[Symbol.asyncDispose||Symbol.for("Symbol.asyncDispose")];if(null==r&&(r=e[Symbol.dispose||Symbol.for("Symbol.dispose")]),"function"!=typeof r)throw new TypeError("Property [Symbol.dispose] is not a function.");return o.push({v:e,d:r,a:n}),e}'),
    +  using: helper("7.22.0", 'export default function _using(o,n,e){if(null==n)return n;if(Object(n)!==n)throw new TypeError("using declarations can only be used with objects, functions, null, or undefined.");if(e)var r=n[Symbol.asyncDispose||Symbol.for("Symbol.asyncDispose")];if(null==r&&(r=n[Symbol.dispose||Symbol.for("Symbol.dispose")]),"function"!=typeof r)throw new TypeError("Property [Symbol.dispose] is not a function.");return o.push({v:n,d:r,a:e}),n}'),
       wrapRegExp: helper("7.19.0", 'import setPrototypeOf from"setPrototypeOf";import inherits from"inherits";export default function _wrapRegExp(){_wrapRegExp=function(e,r){return new BabelRegExp(e,void 0,r)};var e=RegExp.prototype,r=new WeakMap;function BabelRegExp(e,t,p){var o=new RegExp(e,t);return r.set(o,p||r.get(e)),setPrototypeOf(o,BabelRegExp.prototype)}function buildGroups(e,t){var p=r.get(t);return Object.keys(p).reduce((function(r,t){var o=p[t];if("number"==typeof o)r[t]=e[o];else{for(var i=0;void 0===e[o[i]]&&i+1]+)>/g,(function(e,r){var t=o[r];return"$"+(Array.isArray(t)?t.join("$"):t)})))}if("function"==typeof p){var i=this;return e[Symbol.replace].call(this,t,(function(){var e=arguments;return"object"!=typeof e[e.length-1]&&(e=[].slice.call(e)).push(buildGroups(e,i)),p.apply(this,e)}))}return e[Symbol.replace].call(this,t,p)},_wrapRegExp.apply(this,arguments)}')
     });
    -exports.default = _default;
     
     //# sourceMappingURL=helpers-generated.js.map
    diff --git a/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers.js b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers.js
    index 5f4b4a2dd6d84d..a26c45c3702fa3 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers.js
    @@ -9,8 +9,7 @@ var _helpersGenerated = require("./helpers-generated.js");
     const helpers = Object.assign({
       __proto__: null
     }, _helpersGenerated.default);
    -var _default = helpers;
    -exports.default = _default;
    +var _default = exports.default = helpers;
     const helper = minVersion => tpl => ({
       minVersion,
       ast: () => _template.default.program.ast(tpl)
    @@ -294,7 +293,12 @@ helpers.construct = helper("7.0.0-beta.0")`
     helpers.isNativeFunction = helper("7.0.0-beta.0")`
       export default function _isNativeFunction(fn) {
         // Note: This function returns "true" for core-js functions.
    -    return Function.toString.call(fn).indexOf("[native code]") !== -1;
    +    try {
    +      return Function.toString.call(fn).indexOf("[native code]") !== -1;
    +    } catch (e) {
    +      // Firefox 31 throws when "toString" is applied to an HTMLElement
    +      return typeof fn === "function";
    +    }
       }
     `;
     helpers.wrapNativeSuper = helper("7.0.0-beta.0")`
    @@ -347,52 +351,6 @@ helpers.interopRequireDefault = helper("7.0.0-beta.0")`
         return obj && obj.__esModule ? obj : { default: obj };
       }
     `;
    -helpers.interopRequireWildcard = helper("7.14.0")`
    -  function _getRequireWildcardCache(nodeInterop) {
    -    if (typeof WeakMap !== "function") return null;
    -
    -    var cacheBabelInterop = new WeakMap();
    -    var cacheNodeInterop = new WeakMap();
    -    return (_getRequireWildcardCache = function (nodeInterop) {
    -      return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
    -    })(nodeInterop);
    -  }
    -
    -  export default function _interopRequireWildcard(obj, nodeInterop) {
    -    if (!nodeInterop && obj && obj.__esModule) {
    -      return obj;
    -    }
    -
    -    if (obj === null || (typeof obj !== "object" && typeof obj !== "function")) {
    -      return { default: obj }
    -    }
    -
    -    var cache = _getRequireWildcardCache(nodeInterop);
    -    if (cache && cache.has(obj)) {
    -      return cache.get(obj);
    -    }
    -
    -    var newObj = {};
    -    var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
    -    for (var key in obj) {
    -      if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
    -        var desc = hasPropertyDescriptor
    -          ? Object.getOwnPropertyDescriptor(obj, key)
    -          : null;
    -        if (desc && (desc.get || desc.set)) {
    -          Object.defineProperty(newObj, key, desc);
    -        } else {
    -          newObj[key] = obj[key];
    -        }
    -      }
    -    }
    -    newObj.default = obj;
    -    if (cache) {
    -      cache.set(obj, newObj);
    -    }
    -    return newObj;
    -  }
    -`;
     helpers.newArrowCheck = helper("7.0.0-beta.0")`
       export default function _newArrowCheck(innerThis, boundThis) {
         if (innerThis !== boundThis) {
    @@ -842,29 +800,6 @@ helpers.skipFirstGeneratorNext = helper("7.0.0-beta.0")`
         }
       }
     `;
    -helpers.toPrimitive = helper("7.1.5")`
    -  export default function _toPrimitive(
    -    input,
    -    hint /*: "default" | "string" | "number" | void */
    -  ) {
    -    if (typeof input !== "object" || input === null) return input;
    -    var prim = input[Symbol.toPrimitive];
    -    if (prim !== undefined) {
    -      var res = prim.call(input, hint || "default");
    -      if (typeof res !== "object") return res;
    -      throw new TypeError("@@toPrimitive must return a primitive value.");
    -    }
    -    return (hint === "string" ? String : Number)(input);
    -  }
    -`;
    -helpers.toPropertyKey = helper("7.1.5")`
    -  import toPrimitive from "toPrimitive";
    -
    -  export default function _toPropertyKey(arg) {
    -    var key = toPrimitive(arg, "string");
    -    return typeof key === "symbol" ? key : String(key);
    -  }
    -`;
     helpers.initializerWarningHelper = helper("7.0.0-beta.0")`
         export default function _initializerWarningHelper(descriptor, context){
             throw new Error(
    diff --git a/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/applyDecs.js b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/applyDecs.js
    index 3f5586b0a22927..3bb23ecf1c63ba 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/applyDecs.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/applyDecs.js
    @@ -4,6 +4,8 @@ Object.defineProperty(exports, "__esModule", {
       value: true
     });
     exports.default = applyDecs;
    +var _setFunctionName = require("setFunctionName");
    +var _toPropertyKey = require("toPropertyKey");
     function old_createMetadataMethodsForProperty(metadataMap, kind, property, decoratorFinishedRef) {
       return {
         getMetadata: function (key) {
    @@ -108,7 +110,7 @@ function old_memberDec(dec, name, desc, metadataMap, initializers, kind, isStati
       }
       var ctx = {
         kind: kindStr,
    -    name: isPrivate ? "#" + name : name,
    +    name: isPrivate ? "#" + name : _toPropertyKey(name),
         isStatic: isStatic,
         isPrivate: isPrivate
       };
    @@ -207,26 +209,35 @@ function old_getInit(desc) {
     }
     function old_applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, metadataMap, initializers) {
       var decs = decInfo[0];
    -  var desc, initializer, value;
    +  var desc, initializer, prefix, value;
       if (isPrivate) {
         if (kind === 0 || kind === 1) {
           desc = {
             get: decInfo[3],
             set: decInfo[4]
           };
    +      prefix = "get";
         } else if (kind === 3) {
           desc = {
             get: decInfo[3]
           };
    +      prefix = "get";
         } else if (kind === 4) {
           desc = {
             set: decInfo[3]
           };
    +      prefix = "set";
         } else {
           desc = {
             value: decInfo[3]
           };
         }
    +    if (kind !== 0) {
    +      if (kind === 1) {
    +        _setFunctionName(decInfo[4], "#" + name, "set");
    +      }
    +      _setFunctionName(decInfo[3], "#" + name, prefix);
    +    }
       } else if (kind !== 0) {
         desc = Object.getOwnPropertyDescriptor(base, name);
       }
    diff --git a/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/applyDecs2203R.js b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/applyDecs2203R.js
    index 13bb1678d86bc7..8f2750d4f31759 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/applyDecs2203R.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/applyDecs2203R.js
    @@ -4,6 +4,8 @@ Object.defineProperty(exports, "__esModule", {
       value: true
     });
     exports.default = applyDecs2203R;
    +var _setFunctionName = require("setFunctionName");
    +var _toPropertyKey = require("toPropertyKey");
     function applyDecs2203RFactory() {
       function createAddInitializerMethod(initializers, decoratorFinishedRef) {
         return function addInitializer(initializer) {
    @@ -32,7 +34,7 @@ function applyDecs2203RFactory() {
         }
         var ctx = {
           kind: kindStr,
    -      name: isPrivate ? "#" + name : name,
    +      name: isPrivate ? "#" + name : _toPropertyKey(name),
           static: isStatic,
           private: isPrivate
         };
    @@ -124,26 +126,35 @@ function applyDecs2203RFactory() {
       }
       function applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers) {
         var decs = decInfo[0];
    -    var desc, init, value;
    +    var desc, init, prefix, value;
         if (isPrivate) {
           if (kind === 0 || kind === 1) {
             desc = {
               get: decInfo[3],
               set: decInfo[4]
             };
    +        prefix = "get";
           } else if (kind === 3) {
             desc = {
               get: decInfo[3]
             };
    +        prefix = "get";
           } else if (kind === 4) {
             desc = {
               set: decInfo[3]
             };
    +        prefix = "set";
           } else {
             desc = {
               value: decInfo[3]
             };
           }
    +      if (kind !== 0) {
    +        if (kind === 1) {
    +          _setFunctionName(decInfo[4], "#" + name, "set");
    +        }
    +        _setFunctionName(decInfo[3], "#" + name, prefix);
    +      }
         } else if (kind !== 0) {
           desc = Object.getOwnPropertyDescriptor(base, name);
         }
    diff --git a/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/applyDecs2301.js b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/applyDecs2301.js
    index b0b02b68ceb74d..aebfbff66eb9b2 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/applyDecs2301.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/applyDecs2301.js
    @@ -5,6 +5,8 @@ Object.defineProperty(exports, "__esModule", {
     });
     exports.default = applyDecs2301;
     var _checkInRHS = require("checkInRHS");
    +var _setFunctionName = require("setFunctionName");
    +var _toPropertyKey = require("toPropertyKey");
     function applyDecs2301Factory() {
       function createAddInitializerMethod(initializers, decoratorFinishedRef) {
         return function addInitializer(initializer) {
    @@ -38,7 +40,7 @@ function applyDecs2301Factory() {
         }
         var ctx = {
           kind: kindStr,
    -      name: isPrivate ? "#" + name : name,
    +      name: isPrivate ? "#" + name : _toPropertyKey(name),
           static: isStatic,
           private: isPrivate
         };
    @@ -159,28 +161,37 @@ function applyDecs2301Factory() {
       }
       function applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, hasPrivateBrand) {
         var decs = decInfo[0];
    -    var desc, init, value;
    +    var desc, init, prefix, value;
         if (isPrivate) {
           if (kind === 0 || kind === 1) {
             desc = {
               get: curryThis1(decInfo[3]),
               set: curryThis2(decInfo[4])
             };
    +        prefix = "get";
           } else {
             if (kind === 3) {
               desc = {
                 get: decInfo[3]
               };
    +          prefix = "get";
             } else if (kind === 4) {
               desc = {
                 set: decInfo[3]
               };
    +          prefix = "set";
             } else {
               desc = {
                 value: decInfo[3]
               };
             }
           }
    +      if (kind !== 0) {
    +        if (kind === 1) {
    +          _setFunctionName(desc.set, "#" + name, "set");
    +        }
    +        _setFunctionName(desc[prefix || "value"], "#" + name, prefix);
    +      }
         } else if (kind !== 0) {
           desc = Object.getOwnPropertyDescriptor(base, name);
         }
    diff --git a/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/applyDecs2305.js b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/applyDecs2305.js
    index 35ad119c41b6e5..9fd946b3ed6850 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/applyDecs2305.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/applyDecs2305.js
    @@ -4,398 +4,228 @@ Object.defineProperty(exports, "__esModule", {
       value: true
     });
     exports.default = applyDecs2305;
    -var _checkInRHS = require("checkInRHS");
    -function createAddInitializerMethod(initializers, decoratorFinishedRef) {
    -  return function addInitializer(initializer) {
    -    assertNotFinished(decoratorFinishedRef, "addInitializer");
    -    assertCallable(initializer, "An initializer");
    -    initializers.push(initializer);
    -  };
    -}
    -function assertInstanceIfPrivate(has, target) {
    -  if (!has(target)) {
    -    throw new TypeError("Attempted to access private element on non-instance");
    -  }
    -}
    -function memberDec(dec, thisArg, name, desc, initializers, kind, isStatic, isPrivate, value, hasPrivateBrand, metadata) {
    -  var kindStr;
    -  switch (kind) {
    -    case 1:
    -      kindStr = "accessor";
    -      break;
    -    case 2:
    -      kindStr = "method";
    -      break;
    -    case 3:
    -      kindStr = "getter";
    -      break;
    -    case 4:
    -      kindStr = "setter";
    -      break;
    -    default:
    -      kindStr = "field";
    -  }
    -  var ctx = {
    -    kind: kindStr,
    -    name: isPrivate ? "#" + name : name,
    -    static: isStatic,
    -    private: isPrivate,
    -    metadata: metadata
    -  };
    -  var decoratorFinishedRef = {
    -    v: false
    -  };
    -  if (kind !== 0) {
    -    ctx.addInitializer = createAddInitializerMethod(initializers, decoratorFinishedRef);
    -  }
    -  var get, set;
    -  if (!isPrivate && (kind === 0 || kind === 2)) {
    -    get = function (target) {
    -      return target[name];
    -    };
    -    if (kind === 0) {
    -      set = function (target, v) {
    -        target[name] = v;
    -      };
    -    }
    -  } else if (kind === 2) {
    -    get = function (target) {
    -      assertInstanceIfPrivate(hasPrivateBrand, target);
    -      return desc.value;
    -    };
    -  } else {
    -    var t = kind === 0 || kind === 1;
    -    if (t || kind === 3) {
    -      if (isPrivate) {
    -        get = function (target) {
    -          assertInstanceIfPrivate(hasPrivateBrand, target);
    -          return desc.get.call(target);
    -        };
    -      } else {
    -        get = function (target) {
    -          return desc.get.call(target);
    -        };
    -      }
    -    }
    -    if (t || kind === 4) {
    -      if (isPrivate) {
    -        set = function (target, value) {
    -          assertInstanceIfPrivate(hasPrivateBrand, target);
    -          desc.set.call(target, value);
    -        };
    -      } else {
    -        set = function (target, value) {
    -          desc.set.call(target, value);
    -        };
    +var _checkInRHS = require("./checkInRHS.js");
    +var _setFunctionName = require("./setFunctionName.js");
    +var _toPropertyKey = require("./toPropertyKey.js");
    +function applyDecs2305(targetClass, memberDecs, classDecs, classDecsHaveThis, instanceBrand, parentClass) {
    +  function _bindPropCall(obj, name, before) {
    +    return function (_this, value) {
    +      if (before) {
    +        before(_this);
           }
    -    }
    -  }
    -  var has = isPrivate ? hasPrivateBrand.bind() : function (target) {
    -    return name in target;
    -  };
    -  ctx.access = get && set ? {
    -    get: get,
    -    set: set,
    -    has: has
    -  } : get ? {
    -    get: get,
    -    has: has
    -  } : {
    -    set: set,
    -    has: has
    -  };
    -  try {
    -    return dec.call(thisArg, value, ctx);
    -  } finally {
    -    decoratorFinishedRef.v = true;
    -  }
    -}
    -function assertNotFinished(decoratorFinishedRef, fnName) {
    -  if (decoratorFinishedRef.v) {
    -    throw new Error("attempted to call " + fnName + " after decoration was finished");
    -  }
    -}
    -function assertCallable(fn, hint) {
    -  if (typeof fn !== "function") {
    -    throw new TypeError(hint + " must be a function");
    +      return obj[name].call(_this, value);
    +    };
       }
    -}
    -function assertValidReturnValue(kind, value) {
    -  var type = typeof value;
    -  if (kind === 1) {
    -    if (type !== "object" || value === null) {
    -      throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
    -    }
    -    if (value.get !== undefined) {
    -      assertCallable(value.get, "accessor.get");
    -    }
    -    if (value.set !== undefined) {
    -      assertCallable(value.set, "accessor.set");
    -    }
    -    if (value.init !== undefined) {
    -      assertCallable(value.init, "accessor.init");
    +  function runInitializers(initializers, value) {
    +    for (var i = 0; i < initializers.length; i++) {
    +      initializers[i].call(value);
         }
    -  } else if (type !== "function") {
    -    var hint;
    -    if (kind === 0) {
    -      hint = "field";
    -    } else if (kind === 5) {
    -      hint = "class";
    -    } else {
    -      hint = "method";
    -    }
    -    throw new TypeError(hint + " decorators must return a function or void 0");
    -  }
    -}
    -function curryThis1(fn) {
    -  return function () {
    -    return fn(this);
    -  };
    -}
    -function curryThis2(fn) {
    -  return function (value) {
    -    fn(this, value);
    -  };
    -}
    -function applyMemberDec(ret, base, decInfo, decoratorsHaveThis, name, kind, isStatic, isPrivate, initializers, hasPrivateBrand, metadata) {
    -  var decs = decInfo[0];
    -  if (!decoratorsHaveThis && !Array.isArray(decs)) {
    -    decs = [decs];
    +    return value;
       }
    -  var desc, init, value;
    -  if (isPrivate) {
    -    if (kind === 0 || kind === 1) {
    -      desc = {
    -        get: curryThis1(decInfo[3]),
    -        set: curryThis2(decInfo[4])
    -      };
    -    } else {
    -      if (kind === 3) {
    -        desc = {
    -          get: decInfo[3]
    -        };
    -      } else if (kind === 4) {
    -        desc = {
    -          set: decInfo[3]
    -        };
    -      } else {
    -        desc = {
    -          value: decInfo[3]
    -        };
    +  function assertCallable(fn, hint1, hint2, throwUndefined) {
    +    if (typeof fn !== "function") {
    +      if (throwUndefined || fn !== void 0) {
    +        throw new TypeError(hint1 + " must " + (hint2 || "be") + " a function" + (throwUndefined ? "" : " or undefined"));
           }
         }
    -  } else if (kind !== 0) {
    -    desc = Object.getOwnPropertyDescriptor(base, name);
    +    return fn;
       }
    -  if (kind === 1) {
    -    value = {
    -      get: desc.get,
    -      set: desc.set
    -    };
    -  } else if (kind === 2) {
    -    value = desc.value;
    -  } else if (kind === 3) {
    -    value = desc.get;
    -  } else if (kind === 4) {
    -    value = desc.set;
    -  }
    -  var newValue, get, set;
    -  var inc = decoratorsHaveThis ? 2 : 1;
    -  for (var i = decs.length - 1; i >= 0; i -= inc) {
    -    var dec = decs[i];
    -    newValue = memberDec(dec, decoratorsHaveThis ? decs[i - 1] : undefined, name, desc, initializers, kind, isStatic, isPrivate, value, hasPrivateBrand, metadata);
    -    if (newValue !== void 0) {
    -      assertValidReturnValue(kind, newValue);
    -      var newInit;
    -      if (kind === 0) {
    -        newInit = newValue;
    -      } else if (kind === 1) {
    -        newInit = newValue.init;
    -        get = newValue.get || value.get;
    -        set = newValue.set || value.set;
    -        value = {
    -          get: get,
    -          set: set
    -        };
    -      } else {
    -        value = newValue;
    +  function applyDec(Class, decInfo, decoratorsHaveThis, name, kind, metadata, initializers, ret, isStatic, isPrivate, isField, isAccessor, hasPrivateBrand) {
    +    function assertInstanceIfPrivate(target) {
    +      if (!hasPrivateBrand(target)) {
    +        throw new TypeError("Attempted to access private element on non-instance");
    +      }
    +    }
    +    var decs = decInfo[0],
    +      decVal = decInfo[3],
    +      _,
    +      isClass = !ret;
    +    if (!isClass) {
    +      if (!decoratorsHaveThis && !Array.isArray(decs)) {
    +        decs = [decs];
           }
    -      if (newInit !== void 0) {
    -        if (init === void 0) {
    -          init = newInit;
    -        } else if (typeof init === "function") {
    -          init = [init, newInit];
    +      var desc = {},
    +        init = [],
    +        key = kind === 3 ? "get" : kind === 4 || isAccessor ? "set" : "value";
    +      if (isPrivate) {
    +        if (isField || isAccessor) {
    +          desc = {
    +            get: (0, _setFunctionName.default)(function () {
    +              return decVal(this);
    +            }, name, "get"),
    +            set: function (value) {
    +              decInfo[4](this, value);
    +            }
    +          };
             } else {
    -          init.push(newInit);
    +          desc[key] = decVal;
    +        }
    +        if (!isField) {
    +          (0, _setFunctionName.default)(desc[key], name, kind === 2 ? "" : key);
             }
    +      } else if (!isField) {
    +        desc = Object.getOwnPropertyDescriptor(Class, name);
           }
         }
    -  }
    -  if (kind === 0 || kind === 1) {
    -    if (init === void 0) {
    -      init = function (instance, init) {
    -        return init;
    +    var newValue;
    +    for (var i = decs.length - 1; i >= 0; i -= decoratorsHaveThis ? 2 : 1) {
    +      var dec = decs[i],
    +        decThis = decoratorsHaveThis ? decs[i - 1] : void 0;
    +      var decoratorFinishedRef = {};
    +      var ctx = {
    +        kind: ["field", "accessor", "method", "getter", "setter", "field", "class"][kind],
    +        name: name,
    +        metadata: metadata,
    +        addInitializer: function (decoratorFinishedRef, initializer) {
    +          if (decoratorFinishedRef.v) {
    +            throw new Error("attempted to call addInitializer after decoration was finished");
    +          }
    +          assertCallable(initializer, "An initializer", "be", true);
    +          initializers.push(initializer);
    +        }.bind(null, decoratorFinishedRef)
           };
    -    } else if (typeof init !== "function") {
    -      var ownInitializers = init;
    -      init = function (instance, init) {
    -        var value = init;
    -        for (var i = ownInitializers.length - 1; i >= 0; i--) {
    -          value = ownInitializers[i].call(instance, value);
    +      try {
    +        if (isClass) {
    +          newValue = dec.call(decThis, Class, ctx);
    +        } else {
    +          ctx.static = isStatic;
    +          ctx.private = isPrivate;
    +          var get, set;
    +          if (!isPrivate && (isField || kind === 2)) {
    +            get = function (target) {
    +              return target[name];
    +            };
    +            if (isField) {
    +              set = function (target, v) {
    +                target[name] = v;
    +              };
    +            }
    +          } else if (kind === 2) {
    +            get = function (_this) {
    +              assertInstanceIfPrivate(_this);
    +              return desc.value;
    +            };
    +          } else {
    +            if (kind < 2 || kind === 3) {
    +              get = _bindPropCall(desc, "get", isPrivate && assertInstanceIfPrivate);
    +            }
    +            if (kind < 2 || kind === 4) {
    +              set = _bindPropCall(desc, "set", isPrivate && assertInstanceIfPrivate);
    +            }
    +          }
    +          var access = ctx.access = {
    +            has: isPrivate ? hasPrivateBrand.bind() : function (target) {
    +              return name in target;
    +            }
    +          };
    +          if (get) access.get = get;
    +          if (set) access.set = set;
    +          newValue = dec.call(decThis, isAccessor ? {
    +            get: desc.get,
    +            set: desc.set
    +          } : desc[key], ctx);
    +          if (isAccessor) {
    +            if (typeof newValue === "object" && newValue) {
    +              if (_ = assertCallable(newValue.get, "accessor.get")) {
    +                desc.get = _;
    +              }
    +              if (_ = assertCallable(newValue.set, "accessor.set")) {
    +                desc.set = _;
    +              }
    +              if (_ = assertCallable(newValue.init, "accessor.init")) {
    +                init.push(_);
    +              }
    +            } else if (newValue !== void 0) {
    +              throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
    +            }
    +          } else if (assertCallable(newValue, (isField ? "field" : "method") + " decorators", "return")) {
    +            if (isField) {
    +              init.push(newValue);
    +            } else {
    +              desc[key] = newValue;
    +            }
    +          }
             }
    -        return value;
    -      };
    -    } else {
    -      var originalInitializer = init;
    -      init = function (instance, init) {
    -        return originalInitializer.call(instance, init);
    -      };
    +      } finally {
    +        decoratorFinishedRef.v = true;
    +      }
         }
    -    ret.push(init);
    -  }
    -  if (kind !== 0) {
    -    if (kind === 1) {
    -      desc.get = value.get;
    -      desc.set = value.set;
    -    } else if (kind === 2) {
    -      desc.value = value;
    -    } else if (kind === 3) {
    -      desc.get = value;
    -    } else if (kind === 4) {
    -      desc.set = value;
    +    if (isField || isAccessor) {
    +      ret.push(function (instance, value) {
    +        for (var i = init.length - 1; i >= 0; i--) {
    +          value = init[i].call(instance, value);
    +        }
    +        return value;
    +      });
         }
    -    if (isPrivate) {
    -      if (kind === 1) {
    -        ret.push(function (instance, args) {
    -          return value.get.call(instance, args);
    -        });
    -        ret.push(function (instance, args) {
    -          return value.set.call(instance, args);
    -        });
    -      } else if (kind === 2) {
    -        ret.push(value);
    +    if (!isField && !isClass) {
    +      if (isPrivate) {
    +        if (isAccessor) {
    +          ret.push(_bindPropCall(desc, "get"), _bindPropCall(desc, "set"));
    +        } else {
    +          ret.push(kind === 2 ? desc[key] : _bindPropCall.call.bind(desc[key]));
    +        }
           } else {
    -        ret.push(function (instance, args) {
    -          return value.call(instance, args);
    -        });
    +        Object.defineProperty(Class, name, desc);
           }
    -    } else {
    -      Object.defineProperty(base, name, desc);
         }
    +    return newValue;
       }
    -}
    -function applyMemberDecs(Class, decInfos, instanceBrand, metadata) {
    -  var ret = [];
    -  var protoInitializers;
    -  var staticInitializers;
    -  var staticBrand;
    -  var existingProtoNonFields = new Map();
    -  var existingStaticNonFields = new Map();
    -  for (var i = 0; i < decInfos.length; i++) {
    -    var decInfo = decInfos[i];
    -    if (!Array.isArray(decInfo)) continue;
    -    var kind = decInfo[1];
    -    var name = decInfo[2];
    -    var isPrivate = decInfo.length > 3;
    -    var decoratorsHaveThis = kind & 16;
    -    var isStatic = !!(kind & 8);
    -    var base;
    -    var initializers;
    -    var hasPrivateBrand = instanceBrand;
    -    kind &= 7;
    -    if (isStatic) {
    -      base = Class;
    -      if (kind !== 0) {
    -        staticInitializers = staticInitializers || [];
    -        initializers = staticInitializers;
    -      }
    -      if (isPrivate && !staticBrand) {
    -        staticBrand = function (_) {
    -          return _checkInRHS(_) === Class;
    -        };
    -      }
    -      hasPrivateBrand = staticBrand;
    -    } else {
    -      base = Class.prototype;
    -      if (kind !== 0) {
    -        protoInitializers = protoInitializers || [];
    -        initializers = protoInitializers;
    +  function applyMemberDecs(Class, decInfos, instanceBrand, metadata) {
    +    var ret = [];
    +    var protoInitializers;
    +    var staticInitializers;
    +    var staticBrand = function (_) {
    +      return (0, _checkInRHS.default)(_) === Class;
    +    };
    +    var existingNonFields = new Map();
    +    function pushInitializers(initializers) {
    +      if (initializers) {
    +        ret.push(runInitializers.bind(null, initializers));
           }
         }
    -    if (kind !== 0 && !isPrivate) {
    -      var existingNonFields = isStatic ? existingStaticNonFields : existingProtoNonFields;
    -      var existingKind = existingNonFields.get(name) || 0;
    -      if (existingKind === true || existingKind === 3 && kind !== 4 || existingKind === 4 && kind !== 3) {
    -        throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: " + name);
    +    for (var i = 0; i < decInfos.length; i++) {
    +      var decInfo = decInfos[i];
    +      if (!Array.isArray(decInfo)) continue;
    +      var kind = decInfo[1];
    +      var name = decInfo[2];
    +      var isPrivate = decInfo.length > 3;
    +      var decoratorsHaveThis = kind & 16;
    +      var isStatic = !!(kind & 8);
    +      kind &= 7;
    +      var isField = kind === 0;
    +      var key = name + "/" + isStatic;
    +      if (!isField && !isPrivate) {
    +        var existingKind = existingNonFields.get(key);
    +        if (existingKind === true || existingKind === 3 && kind !== 4 || existingKind === 4 && kind !== 3) {
    +          throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: " + name);
    +        }
    +        existingNonFields.set(key, kind > 2 ? kind : true);
           }
    -      existingNonFields.set(name, !existingKind && kind > 2 ? kind : true);
    +      applyDec(isStatic ? Class : Class.prototype, decInfo, decoratorsHaveThis, isPrivate ? "#" + name : (0, _toPropertyKey.default)(name), kind, metadata, isStatic ? staticInitializers = staticInitializers || [] : protoInitializers = protoInitializers || [], ret, isStatic, isPrivate, isField, kind === 1, isStatic && isPrivate ? staticBrand : instanceBrand);
         }
    -    applyMemberDec(ret, base, decInfo, decoratorsHaveThis, name, kind, isStatic, isPrivate, initializers, hasPrivateBrand, metadata);
    +    pushInitializers(protoInitializers);
    +    pushInitializers(staticInitializers);
    +    return ret;
       }
    -  pushInitializers(ret, protoInitializers);
    -  pushInitializers(ret, staticInitializers);
    -  return ret;
    -}
    -function pushInitializers(ret, initializers) {
    -  if (initializers) {
    -    ret.push(function (instance) {
    -      for (var i = 0; i < initializers.length; i++) {
    -        initializers[i].call(instance);
    -      }
    -      return instance;
    +  function defineMetadata(Class, metadata) {
    +    return Object.defineProperty(Class, Symbol.metadata || Symbol.for("Symbol.metadata"), {
    +      configurable: true,
    +      enumerable: true,
    +      value: metadata
         });
       }
    -}
    -function applyClassDecs(targetClass, classDecs, decoratorsHaveThis, metadata) {
    -  if (classDecs.length) {
    -    var initializers = [];
    -    var newClass = targetClass;
    -    var name = targetClass.name;
    -    var inc = decoratorsHaveThis ? 2 : 1;
    -    for (var i = classDecs.length - 1; i >= 0; i -= inc) {
    -      var decoratorFinishedRef = {
    -        v: false
    -      };
    -      try {
    -        var nextNewClass = classDecs[i].call(decoratorsHaveThis ? classDecs[i - 1] : undefined, newClass, {
    -          kind: "class",
    -          name: name,
    -          addInitializer: createAddInitializerMethod(initializers, decoratorFinishedRef),
    -          metadata
    -        });
    -      } finally {
    -        decoratorFinishedRef.v = true;
    -      }
    -      if (nextNewClass !== undefined) {
    -        assertValidReturnValue(5, nextNewClass);
    -        newClass = nextNewClass;
    -      }
    -    }
    -    return [defineMetadata(newClass, metadata), function () {
    -      for (var i = 0; i < initializers.length; i++) {
    -        initializers[i].call(newClass);
    -      }
    -    }];
    -  }
    -}
    -function defineMetadata(Class, metadata) {
    -  return Object.defineProperty(Class, Symbol.metadata || Symbol.for("Symbol.metadata"), {
    -    configurable: true,
    -    enumerable: true,
    -    value: metadata
    -  });
    -}
    -function applyDecs2305(targetClass, memberDecs, classDecs, classDecsHaveThis, instanceBrand, parentClass) {
       if (arguments.length >= 6) {
         var parentMetadata = parentClass[Symbol.metadata || Symbol.for("Symbol.metadata")];
       }
    -  var metadata = Object.create(parentMetadata === void 0 ? null : parentMetadata);
    +  var metadata = Object.create(parentMetadata == null ? null : parentMetadata);
       var e = applyMemberDecs(targetClass, memberDecs, instanceBrand, metadata);
       if (!classDecs.length) defineMetadata(targetClass, metadata);
       return {
         e: e,
         get c() {
    -      return applyClassDecs(targetClass, classDecs, classDecsHaveThis, metadata);
    +      var initializers = [];
    +      return classDecs.length && [defineMetadata(assertCallable(applyDec(targetClass, [classDecs], classDecsHaveThis, targetClass.name, 5, metadata, initializers), "class decorators", "return") || targetClass, metadata), runInitializers.bind(null, initializers, targetClass)];
         }
       };
     }
    diff --git a/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/interopRequireWildcard.js b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/interopRequireWildcard.js
    new file mode 100644
    index 00000000000000..6d3d60330cb9d5
    --- /dev/null
    +++ b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/interopRequireWildcard.js
    @@ -0,0 +1,49 @@
    +"use strict";
    +
    +Object.defineProperty(exports, "__esModule", {
    +  value: true
    +});
    +exports.default = _interopRequireWildcard;
    +function _getRequireWildcardCache(nodeInterop) {
    +  if (typeof WeakMap !== "function") return null;
    +  var cacheBabelInterop = new WeakMap();
    +  var cacheNodeInterop = new WeakMap();
    +  return (_getRequireWildcardCache = function (nodeInterop) {
    +    return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
    +  })(nodeInterop);
    +}
    +function _interopRequireWildcard(obj, nodeInterop) {
    +  if (!nodeInterop && obj && obj.__esModule) {
    +    return obj;
    +  }
    +  if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
    +    return {
    +      default: obj
    +    };
    +  }
    +  var cache = _getRequireWildcardCache(nodeInterop);
    +  if (cache && cache.has(obj)) {
    +    return cache.get(obj);
    +  }
    +  var newObj = {
    +    __proto__: null
    +  };
    +  var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
    +  for (var key in obj) {
    +    if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
    +      var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
    +      if (desc && (desc.get || desc.set)) {
    +        Object.defineProperty(newObj, key, desc);
    +      } else {
    +        newObj[key] = obj[key];
    +      }
    +    }
    +  }
    +  newObj.default = obj;
    +  if (cache) {
    +    cache.set(obj, newObj);
    +  }
    +  return newObj;
    +}
    +
    +//# sourceMappingURL=interopRequireWildcard.js.map
    diff --git a/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/setFunctionName.js b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/setFunctionName.js
    new file mode 100644
    index 00000000000000..f711baf14aecc8
    --- /dev/null
    +++ b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/setFunctionName.js
    @@ -0,0 +1,21 @@
    +"use strict";
    +
    +Object.defineProperty(exports, "__esModule", {
    +  value: true
    +});
    +exports.default = setFunctionName;
    +function setFunctionName(fn, name, prefix) {
    +  if (typeof name === "symbol") {
    +    name = name.description;
    +    name = name ? "[" + name + "]" : "";
    +  }
    +  try {
    +    Object.defineProperty(fn, "name", {
    +      configurable: true,
    +      value: prefix ? prefix + " " + name : name
    +    });
    +  } catch (_) {}
    +  return fn;
    +}
    +
    +//# sourceMappingURL=setFunctionName.js.map
    diff --git a/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/toPrimitive.js b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/toPrimitive.js
    new file mode 100644
    index 00000000000000..f56a3abf509624
    --- /dev/null
    +++ b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/toPrimitive.js
    @@ -0,0 +1,18 @@
    +"use strict";
    +
    +Object.defineProperty(exports, "__esModule", {
    +  value: true
    +});
    +exports.default = toPrimitive;
    +function toPrimitive(input, hint) {
    +  if (typeof input !== "object" || !input) return input;
    +  var prim = input[Symbol.toPrimitive];
    +  if (prim !== undefined) {
    +    var res = prim.call(input, hint || "default");
    +    if (typeof res !== "object") return res;
    +    throw new TypeError("@@toPrimitive must return a primitive value.");
    +  }
    +  return (hint === "string" ? String : Number)(input);
    +}
    +
    +//# sourceMappingURL=toPrimitive.js.map
    diff --git a/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/toPropertyKey.js b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/toPropertyKey.js
    new file mode 100644
    index 00000000000000..92493ff174c3b2
    --- /dev/null
    +++ b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/toPropertyKey.js
    @@ -0,0 +1,13 @@
    +"use strict";
    +
    +Object.defineProperty(exports, "__esModule", {
    +  value: true
    +});
    +exports.default = toPropertyKey;
    +var _toPrimitive = require("./toPrimitive.js");
    +function toPropertyKey(arg) {
    +  var key = (0, _toPrimitive.default)(arg, "string");
    +  return typeof key === "symbol" ? key : String(key);
    +}
    +
    +//# sourceMappingURL=toPropertyKey.js.map
    diff --git a/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/using.js b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/using.js
    index 117c28d7a0d77c..b98a85d9a9dd9a 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/using.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/helpers/using.js
    @@ -6,8 +6,8 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = _using;
     function _using(stack, value, isAwait) {
       if (value === null || value === void 0) return value;
    -  if (typeof value !== "object") {
    -    throw new TypeError("using declarations can only be used with objects, null, or undefined.");
    +  if (Object(value) !== value) {
    +    throw new TypeError("using declarations can only be used with objects, functions, null, or undefined.");
       }
       if (isAwait) {
         var dispose = value[Symbol.asyncDispose || Symbol.for("Symbol.asyncDispose")];
    diff --git a/tools/node_modules/eslint/node_modules/@babel/helpers/lib/index.js b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/index.js
    index a6e1c96d084149..711eb5f3dcf7c9 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/helpers/lib/index.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/helpers/lib/index.js
    @@ -134,6 +134,7 @@ function permuteHelperAST(file, metadata, id, localBindings, getDependency) {
       });
       const toRename = {};
       const bindings = new Set(localBindings || []);
    +  if (id.type === "Identifier") bindings.add(id.name);
       localBindingNames.forEach(name => {
         let newName = name;
         while (bindings.has(newName)) newName = "_" + newName;
    @@ -234,9 +235,7 @@ function ensure(name, newFileClass) {
       FileClass || (FileClass = newFileClass);
       loadHelper(name);
     }
    -const list = Object.keys(_helpers.default).map(name => name.replace(/^_/, ""));
    -exports.list = list;
    -var _default = get;
    -exports.default = _default;
    +const list = exports.list = Object.keys(_helpers.default).map(name => name.replace(/^_/, ""));
    +var _default = exports.default = get;
     
     //# sourceMappingURL=index.js.map
    diff --git a/tools/node_modules/eslint/node_modules/@babel/helpers/package.json b/tools/node_modules/eslint/node_modules/@babel/helpers/package.json
    index 289c86f9c3531b..05118b9fb22b3e 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/helpers/package.json
    +++ b/tools/node_modules/eslint/node_modules/@babel/helpers/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@babel/helpers",
    -  "version": "7.23.1",
    +  "version": "7.23.6",
       "description": "Collection of helper functions used by Babel transforms.",
       "author": "The Babel Team (https://babel.dev/team)",
       "homepage": "https://babel.dev/docs/en/next/babel-helpers",
    @@ -16,15 +16,14 @@
       "main": "./lib/index.js",
       "dependencies": {
         "@babel/template": "^7.22.15",
    -    "@babel/traverse": "^7.23.0",
    -    "@babel/types": "^7.23.0"
    +    "@babel/traverse": "^7.23.6",
    +    "@babel/types": "^7.23.6"
       },
       "devDependencies": {
    -    "@babel/generator": "^7.23.0",
    +    "@babel/generator": "^7.23.6",
         "@babel/helper-plugin-test-runner": "^7.22.5",
    -    "@babel/parser": "^7.23.0",
    -    "regenerator-runtime": "^0.14.0",
    -    "terser": "^5.19.2"
    +    "@babel/parser": "^7.23.6",
    +    "regenerator-runtime": "^0.14.0"
       },
       "engines": {
         "node": ">=6.9.0"
    diff --git a/tools/node_modules/eslint/node_modules/@babel/helpers/scripts/generate-helpers.js b/tools/node_modules/eslint/node_modules/@babel/helpers/scripts/generate-helpers.js
    index e2a318865937e3..b9d1e5f11697cb 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/helpers/scripts/generate-helpers.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/helpers/scripts/generate-helpers.js
    @@ -1,7 +1,11 @@
    +/* eslint-disable import/no-extraneous-dependencies */
     import fs from "fs";
     import { join } from "path";
     import { URL, fileURLToPath } from "url";
    -import { minify } from "terser"; // eslint-disable-line import/no-extraneous-dependencies
    +import { minify } from "terser";
    +import { transformSync } from "@babel/core";
    +import presetTypescript from "@babel/preset-typescript";
    +import { gzipSync } from "zlib";
     
     const HELPERS_FOLDER = new URL("../src/helpers", import.meta.url);
     const IGNORED_FILES = new Set(["package.json"]);
    @@ -30,14 +34,16 @@ export default Object.freeze({
     
         const [helperName] = file.split(".");
     
    +    const isTs = file.endsWith(".ts");
    +
         const filePath = join(fileURLToPath(HELPERS_FOLDER), file);
    -    if (!file.endsWith(".js")) {
    +    if (!file.endsWith(".js") && !isTs) {
           console.error("ignoring", filePath);
           continue;
         }
     
    -    const fileContents = await fs.promises.readFile(filePath, "utf8");
    -    const minVersionMatch = fileContents.match(
    +    let code = await fs.promises.readFile(filePath, "utf8");
    +    const minVersionMatch = code.match(
           /^\s*\/\*\s*@minVersion\s+(?\S+)\s*\*\/\s*$/m
         );
         if (!minVersionMatch) {
    @@ -45,16 +51,64 @@ export default Object.freeze({
         }
         const { minVersion } = minVersionMatch.groups;
     
    -    const source = await minify(fileContents, {
    -      mangle: { keep_fnames: true },
    -      // The _typeof helper has a custom directive that we must keep
    -      compress: { directives: false },
    -    });
    +    const mangleFns = code.includes("@mangleFns");
    +    const noMangleFns = [];
    +
    +    code = transformSync(code, {
    +      configFile: false,
    +      babelrc: false,
    +      filename: filePath,
    +      presets: [
    +        [
    +          presetTypescript,
    +          {
    +            onlyRemoveTypeImports: true,
    +            optimizeConstEnums: true,
    +          },
    +        ],
    +      ],
    +      plugins: [
    +        /**
    +         * @type {import("@babel/core").PluginObj}
    +         */
    +        {
    +          visitor: {
    +            ImportDeclaration(path) {
    +              const source = path.node.source;
    +              source.value = source.value
    +                .replace(/\.ts$/, "")
    +                .replace(/^\.\//, "");
    +            },
    +            FunctionDeclaration(path) {
    +              if (
    +                mangleFns &&
    +                path.node.leadingComments?.find(c =>
    +                  c.value.includes("@no-mangle")
    +                )
    +              ) {
    +                const name = path.node.id.name;
    +                if (name) noMangleFns.push(name);
    +              }
    +            },
    +          },
    +        },
    +      ],
    +    }).code;
    +    code = (
    +      await minify(code, {
    +        mangle: {
    +          keep_fnames: mangleFns ? new RegExp(noMangleFns.join("|")) : true,
    +        },
    +        // The _typeof helper has a custom directive that we must keep
    +        compress: { directives: false, passes: 10 },
    +      })
    +    ).code;
     
         output += `\
    +  // size: ${code.length}, gzip size: ${gzipSync(code).length}
       ${JSON.stringify(helperName)}: helper(
         ${JSON.stringify(minVersion)},
    -    ${JSON.stringify(source.code)},
    +    ${JSON.stringify(code)},
       ),
     `;
       }
    diff --git a/tools/node_modules/eslint/node_modules/@babel/highlight/lib/index.js b/tools/node_modules/eslint/node_modules/@babel/highlight/lib/index.js
    index cb718afd154ce0..a45bc5a8805500 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/highlight/lib/index.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/highlight/lib/index.js
    @@ -8,8 +8,8 @@ exports.shouldHighlight = shouldHighlight;
     var _jsTokens = require("js-tokens");
     var _helperValidatorIdentifier = require("@babel/helper-validator-identifier");
     var _chalk = _interopRequireWildcard(require("chalk"), true);
    -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
    -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
    +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
    +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
     const sometimesKeywords = new Set(["as", "async", "from", "get", "of", "set"]);
     function getDefs(chalk) {
       return {
    diff --git a/tools/node_modules/eslint/node_modules/@babel/highlight/package.json b/tools/node_modules/eslint/node_modules/@babel/highlight/package.json
    index d88c972268588e..640f8366199981 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/highlight/package.json
    +++ b/tools/node_modules/eslint/node_modules/@babel/highlight/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@babel/highlight",
    -  "version": "7.22.20",
    +  "version": "7.23.4",
       "description": "Syntax highlight JavaScript strings for output in terminals.",
       "author": "The Babel Team (https://babel.dev/team)",
       "homepage": "https://babel.dev/docs/en/next/babel-highlight",
    diff --git a/tools/node_modules/eslint/node_modules/@babel/parser/lib/index.js b/tools/node_modules/eslint/node_modules/@babel/parser/lib/index.js
    index bcf69004cd8aa6..68ee00ca9ece2e 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/parser/lib/index.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/parser/lib/index.js
    @@ -3488,11 +3488,6 @@ function newAsyncArrowScope() {
     function newExpressionScope() {
       return new ExpressionScope();
     }
    -const PARAM = 0b0000,
    -  PARAM_YIELD = 0b0001,
    -  PARAM_AWAIT = 0b0010,
    -  PARAM_RETURN = 0b0100,
    -  PARAM_IN = 0b1000;
     class ProductionParameterHandler {
       constructor() {
         this.stacks = [];
    @@ -3507,20 +3502,20 @@ class ProductionParameterHandler {
         return this.stacks[this.stacks.length - 1];
       }
       get hasAwait() {
    -    return (this.currentFlags() & PARAM_AWAIT) > 0;
    +    return (this.currentFlags() & 2) > 0;
       }
       get hasYield() {
    -    return (this.currentFlags() & PARAM_YIELD) > 0;
    +    return (this.currentFlags() & 1) > 0;
       }
       get hasReturn() {
    -    return (this.currentFlags() & PARAM_RETURN) > 0;
    +    return (this.currentFlags() & 4) > 0;
       }
       get hasIn() {
    -    return (this.currentFlags() & PARAM_IN) > 0;
    +    return (this.currentFlags() & 8) > 0;
       }
     }
     function functionFlags(isAsync, isGenerator) {
    -  return (isAsync ? PARAM_AWAIT : 0) | (isGenerator ? PARAM_YIELD : 0);
    +  return (isAsync ? 2 : 0) | (isGenerator ? 1 : 0);
     }
     class UtilParser extends Tokenizer {
       addExtra(node, key, value, enumerable = true) {
    @@ -3717,9 +3712,9 @@ class UtilParser extends Tokenizer {
         };
       }
       enterInitialScopes() {
    -    let paramFlags = PARAM;
    +    let paramFlags = 0;
         if (this.inModule) {
    -      paramFlags |= PARAM_AWAIT;
    +      paramFlags |= 2;
         }
         this.scope.enter(1);
         this.prodParam.enter(paramFlags);
    @@ -8762,7 +8757,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass {
           node.body = inner;
         } else {
           this.scope.enter(256);
    -      this.prodParam.enter(PARAM);
    +      this.prodParam.enter(0);
           node.body = this.tsParseModuleBlock();
           this.prodParam.exit();
           this.scope.exit();
    @@ -8780,7 +8775,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass {
         }
         if (this.match(5)) {
           this.scope.enter(256);
    -      this.prodParam.enter(PARAM);
    +      this.prodParam.enter(0);
           node.body = this.tsParseModuleBlock();
           this.prodParam.exit();
           this.scope.exit();
    @@ -8907,7 +8902,7 @@ var typescript = superClass => class TypeScriptParserMixin extends superClass {
           case "global":
             if (this.match(5)) {
               this.scope.enter(256);
    -          this.prodParam.enter(PARAM);
    +          this.prodParam.enter(0);
               const mod = node;
               mod.global = true;
               mod.id = expr;
    @@ -11338,7 +11333,7 @@ class ExpressionParser extends LValParser {
         const oldLabels = this.state.labels;
         this.state.labels = [];
         if (isAsync) {
    -      this.prodParam.enter(PARAM_AWAIT);
    +      this.prodParam.enter(2);
           node.body = this.parseBlock();
           this.prodParam.exit();
         } else {
    @@ -11902,7 +11897,7 @@ class ExpressionParser extends LValParser {
         this.scope.enter(2 | 4);
         let flags = functionFlags(isAsync, false);
         if (!this.match(5) && this.prodParam.hasIn) {
    -      flags |= PARAM_IN;
    +      flags |= 8;
         }
         this.prodParam.enter(flags);
         this.initFunction(node, isAsync);
    @@ -11936,7 +11931,7 @@ class ExpressionParser extends LValParser {
           const oldStrict = this.state.strict;
           const oldLabels = this.state.labels;
           this.state.labels = [];
    -      this.prodParam.enter(this.prodParam.currentFlags() | PARAM_RETURN);
    +      this.prodParam.enter(this.prodParam.currentFlags() | 4);
           node.body = this.parseBlock(true, false, hasStrictModeDirective => {
             const nonSimple = !this.isSimpleParamList(node.params);
             if (hasStrictModeDirective && nonSimple) {
    @@ -12277,9 +12272,9 @@ class ExpressionParser extends LValParser {
       }
       allowInAnd(callback) {
         const flags = this.prodParam.currentFlags();
    -    const prodParamToSet = PARAM_IN & ~flags;
    +    const prodParamToSet = 8 & ~flags;
         if (prodParamToSet) {
    -      this.prodParam.enter(flags | PARAM_IN);
    +      this.prodParam.enter(flags | 8);
           try {
             return callback();
           } finally {
    @@ -12290,9 +12285,9 @@ class ExpressionParser extends LValParser {
       }
       disallowInAnd(callback) {
         const flags = this.prodParam.currentFlags();
    -    const prodParamToClear = PARAM_IN & flags;
    +    const prodParamToClear = 8 & flags;
         if (prodParamToClear) {
    -      this.prodParam.enter(flags & ~PARAM_IN);
    +      this.prodParam.enter(flags & ~8);
           try {
             return callback();
           } finally {
    @@ -13207,7 +13202,7 @@ class StatementParser extends ExpressionParser {
           }
           body.push(stmt);
         }
    -    afterBlockParse == null ? void 0 : afterBlockParse.call(this, hasStrictModeDirective);
    +    afterBlockParse == null || afterBlockParse.call(this, hasStrictModeDirective);
         if (!oldStrict) {
           this.setStrict(false);
         }
    @@ -13583,7 +13578,7 @@ class StatementParser extends ExpressionParser {
         this.scope.enter(64 | 128 | 16);
         const oldLabels = this.state.labels;
         this.state.labels = [];
    -    this.prodParam.enter(PARAM);
    +    this.prodParam.enter(0);
         const body = member.body = [];
         this.parseBlockOrModuleBlockBody(body, undefined, false, 8);
         this.prodParam.exit();
    @@ -13655,7 +13650,7 @@ class StatementParser extends ExpressionParser {
       parseInitializer(node) {
         this.scope.enter(64 | 16);
         this.expressionScope.enter(newExpressionScope());
    -    this.prodParam.enter(PARAM);
    +    this.prodParam.enter(0);
         node.value = this.eat(29) ? this.parseMaybeAssignAllowIn() : null;
         this.expressionScope.exit();
         this.prodParam.exit();
    diff --git a/tools/node_modules/eslint/node_modules/@babel/parser/package.json b/tools/node_modules/eslint/node_modules/@babel/parser/package.json
    index 768f887baf9b6f..5dc69d812815d7 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/parser/package.json
    +++ b/tools/node_modules/eslint/node_modules/@babel/parser/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@babel/parser",
    -  "version": "7.23.0",
    +  "version": "7.23.6",
       "description": "A JavaScript parser",
       "author": "The Babel Team (https://babel.dev/team)",
       "homepage": "https://babel.dev/docs/en/next/babel-parser",
    @@ -34,10 +34,10 @@
         "node": ">=6.0.0"
       },
       "devDependencies": {
    -    "@babel/code-frame": "^7.22.13",
    +    "@babel/code-frame": "^7.23.5",
         "@babel/helper-check-duplicate-nodes": "^7.22.5",
    -    "@babel/helper-fixtures": "^7.22.19",
    -    "@babel/helper-string-parser": "^7.22.5",
    +    "@babel/helper-fixtures": "^7.23.4",
    +    "@babel/helper-string-parser": "^7.23.4",
         "@babel/helper-validator-identifier": "^7.22.20",
         "charcodes": "^0.2.0"
       },
    diff --git a/tools/node_modules/eslint/node_modules/@babel/plugin-syntax-import-attributes/lib/index.js b/tools/node_modules/eslint/node_modules/@babel/plugin-syntax-import-attributes/lib/index.js
    index 6e78b9a07c3ee6..dd591457c65a81 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/plugin-syntax-import-attributes/lib/index.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/plugin-syntax-import-attributes/lib/index.js
    @@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
     });
     exports.default = void 0;
     var _helperPluginUtils = require("@babel/helper-plugin-utils");
    -var _default = (0, _helperPluginUtils.declare)((api, {
    +var _default = exports.default = (0, _helperPluginUtils.declare)((api, {
       deprecatedAssertSyntax
     }) => {
       api.assertVersion("^7.22.0");
    @@ -26,6 +26,5 @@ var _default = (0, _helperPluginUtils.declare)((api, {
         }
       };
     });
    -exports.default = _default;
     
     //# sourceMappingURL=index.js.map
    diff --git a/tools/node_modules/eslint/node_modules/@babel/plugin-syntax-import-attributes/package.json b/tools/node_modules/eslint/node_modules/@babel/plugin-syntax-import-attributes/package.json
    index 2239fa8e4c9859..d932acdd7d5344 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/plugin-syntax-import-attributes/package.json
    +++ b/tools/node_modules/eslint/node_modules/@babel/plugin-syntax-import-attributes/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@babel/plugin-syntax-import-attributes",
    -  "version": "7.22.5",
    +  "version": "7.23.3",
       "description": "Allow parsing of the module attributes in the import statement",
       "repository": {
         "type": "git",
    @@ -22,7 +22,7 @@
         "@babel/core": "^7.0.0-0"
       },
       "devDependencies": {
    -    "@babel/core": "^7.22.5"
    +    "@babel/core": "^7.23.3"
       },
       "engines": {
         "node": ">=6.9.0"
    diff --git a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/cache.js b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/cache.js
    index 0455cfa03a42a0..79a41b9cf9bc42 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/cache.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/cache.js
    @@ -9,10 +9,8 @@ exports.clearScope = clearScope;
     exports.getCachedPaths = getCachedPaths;
     exports.getOrCreateCachedPaths = getOrCreateCachedPaths;
     exports.scope = exports.path = void 0;
    -let pathsCache = new WeakMap();
    -exports.path = pathsCache;
    -let scope = new WeakMap();
    -exports.scope = scope;
    +let pathsCache = exports.path = new WeakMap();
    +let scope = exports.scope = new WeakMap();
     function clear() {
       clearPath();
       clearScope();
    diff --git a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/index.js b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/index.js
    index 38255007ece047..566296c0092103 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/index.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/index.js
    @@ -51,8 +51,7 @@ function traverse(parent, opts = {}, scope, state, parentPath, visitSelf) {
       visitors.explode(opts);
       (0, _traverseNode.traverseNode)(parent, opts, scope, state, parentPath, null, visitSelf);
     }
    -var _default = traverse;
    -exports.default = _default;
    +var _default = exports.default = traverse;
     traverse.visitors = visitors;
     traverse.verify = visitors.verify;
     traverse.explode = visitors.explode;
    diff --git a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/comments.js b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/comments.js
    index 0a4eed6fac94ff..43b3b72acdd502 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/comments.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/comments.js
    @@ -36,12 +36,10 @@ function shareCommentsWithSiblings() {
       }
     }
     function removeIfExisting(list, toRemove) {
    -  if (!toRemove) return list;
    -  let lastFoundIndex = -1;
    +  if (!(toRemove != null && toRemove.length)) return list;
    +  const set = new Set(toRemove);
       return list.filter(el => {
    -    const i = toRemove.indexOf(el, lastFoundIndex);
    -    if (i === -1) return true;
    -    lastFoundIndex = i;
    +    return !set.has(el);
       });
     }
     function addComment(type, content, line) {
    diff --git a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/context.js b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/context.js
    index e197836c111d3c..7b52a6582138a5 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/context.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/context.js
    @@ -117,7 +117,7 @@ function setScope() {
         path = path.parentPath;
       }
       this.scope = this.getScope(target);
    -  (_this$scope = this.scope) == null ? void 0 : _this$scope.init();
    +  (_this$scope = this.scope) == null || _this$scope.init();
     }
     function setContext(context) {
       if (this.skipKeys != null) {
    diff --git a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/evaluation.js b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/evaluation.js
    index 6ddf14d999c994..f533e762b23deb 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/evaluation.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/evaluation.js
    @@ -295,7 +295,10 @@ function _evaluate(path, state) {
           const property = callee.get("property");
           if (object.isIdentifier() && property.isIdentifier() && isValidObjectCallee(object.node.name) && !isInvalidMethod(property.node.name)) {
             context = global[object.node.name];
    -        func = context[property.node.name];
    +        const key = property.node.name;
    +        if (Object.hasOwnProperty.call(context, key)) {
    +          func = context[key];
    +        }
           }
           if (object.isLiteral() && property.isIdentifier()) {
             const type = typeof object.node.value;
    diff --git a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/index.js b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/index.js
    index 640d758e895a24..c835fdc0371939 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/index.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/index.js
    @@ -28,12 +28,9 @@ const {
       validate
     } = _t;
     const debug = _debug("babel");
    -const REMOVED = 1 << 0;
    -exports.REMOVED = REMOVED;
    -const SHOULD_STOP = 1 << 1;
    -exports.SHOULD_STOP = SHOULD_STOP;
    -const SHOULD_SKIP = 1 << 2;
    -exports.SHOULD_SKIP = SHOULD_SKIP;
    +const REMOVED = exports.REMOVED = 1 << 0;
    +const SHOULD_STOP = exports.SHOULD_STOP = 1 << 1;
    +const SHOULD_SKIP = exports.SHOULD_SKIP = 1 << 2;
     class NodePath {
       constructor(hub, parent) {
         this.contexts = [];
    @@ -187,7 +184,6 @@ for (const type of Object.keys(virtualTypes)) {
       if (type[0] === "_") continue;
       if (!t.TYPES.includes(type)) t.TYPES.push(type);
     }
    -var _default = NodePath;
    -exports.default = _default;
    +var _default = exports.default = NodePath;
     
     //# sourceMappingURL=index.js.map
    diff --git a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/introspection.js b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/introspection.js
    index 524702225d5abe..b83b717d77842e 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/introspection.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/introspection.js
    @@ -48,8 +48,7 @@ function has(key) {
     function isStatic() {
       return this.scope.isStatic(this.node);
     }
    -const is = has;
    -exports.is = is;
    +const is = exports.is = has;
     function isnt(key) {
       return !this.has(key);
     }
    diff --git a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/lib/removal-hooks.js b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/lib/removal-hooks.js
    index f2e3173ede1072..2d42536796dd21 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/lib/removal-hooks.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/lib/removal-hooks.js
    @@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
       value: true
     });
     exports.hooks = void 0;
    -const hooks = [function (self, parent) {
    +const hooks = exports.hooks = [function (self, parent) {
       const removeParent = self.key === "test" && (parent.isWhile() || parent.isSwitchCase()) || self.key === "declaration" && parent.isExportDeclaration() || self.key === "body" && parent.isLabeledStatement() || self.listKey === "declarations" && parent.isVariableDeclaration() && parent.node.declarations.length === 1 || self.key === "expression" && parent.isExpressionStatement();
       if (removeParent) {
         parent.remove();
    @@ -33,6 +33,5 @@ const hooks = [function (self, parent) {
         return true;
       }
     }];
    -exports.hooks = hooks;
     
     //# sourceMappingURL=removal-hooks.js.map
    diff --git a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/lib/virtual-types.js b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/lib/virtual-types.js
    index 4b8eaf00e33b86..0322f091f973df 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/lib/virtual-types.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/lib/virtual-types.js
    @@ -4,41 +4,23 @@ Object.defineProperty(exports, "__esModule", {
       value: true
     });
     exports.Var = exports.User = exports.Statement = exports.SpreadProperty = exports.Scope = exports.RestProperty = exports.ReferencedMemberExpression = exports.ReferencedIdentifier = exports.Referenced = exports.Pure = exports.NumericLiteralTypeAnnotation = exports.Generated = exports.ForAwaitStatement = exports.Flow = exports.Expression = exports.ExistentialTypeParam = exports.BlockScoped = exports.BindingIdentifier = void 0;
    -const ReferencedIdentifier = ["Identifier", "JSXIdentifier"];
    -exports.ReferencedIdentifier = ReferencedIdentifier;
    -const ReferencedMemberExpression = ["MemberExpression"];
    -exports.ReferencedMemberExpression = ReferencedMemberExpression;
    -const BindingIdentifier = ["Identifier"];
    -exports.BindingIdentifier = BindingIdentifier;
    -const Statement = ["Statement"];
    -exports.Statement = Statement;
    -const Expression = ["Expression"];
    -exports.Expression = Expression;
    -const Scope = ["Scopable", "Pattern"];
    -exports.Scope = Scope;
    -const Referenced = null;
    -exports.Referenced = Referenced;
    -const BlockScoped = null;
    -exports.BlockScoped = BlockScoped;
    -const Var = ["VariableDeclaration"];
    -exports.Var = Var;
    -const User = null;
    -exports.User = User;
    -const Generated = null;
    -exports.Generated = Generated;
    -const Pure = null;
    -exports.Pure = Pure;
    -const Flow = ["Flow", "ImportDeclaration", "ExportDeclaration", "ImportSpecifier"];
    -exports.Flow = Flow;
    -const RestProperty = ["RestElement"];
    -exports.RestProperty = RestProperty;
    -const SpreadProperty = ["RestElement"];
    -exports.SpreadProperty = SpreadProperty;
    -const ExistentialTypeParam = ["ExistsTypeAnnotation"];
    -exports.ExistentialTypeParam = ExistentialTypeParam;
    -const NumericLiteralTypeAnnotation = ["NumberLiteralTypeAnnotation"];
    -exports.NumericLiteralTypeAnnotation = NumericLiteralTypeAnnotation;
    -const ForAwaitStatement = ["ForOfStatement"];
    -exports.ForAwaitStatement = ForAwaitStatement;
    +const ReferencedIdentifier = exports.ReferencedIdentifier = ["Identifier", "JSXIdentifier"];
    +const ReferencedMemberExpression = exports.ReferencedMemberExpression = ["MemberExpression"];
    +const BindingIdentifier = exports.BindingIdentifier = ["Identifier"];
    +const Statement = exports.Statement = ["Statement"];
    +const Expression = exports.Expression = ["Expression"];
    +const Scope = exports.Scope = ["Scopable", "Pattern"];
    +const Referenced = exports.Referenced = null;
    +const BlockScoped = exports.BlockScoped = null;
    +const Var = exports.Var = ["VariableDeclaration"];
    +const User = exports.User = null;
    +const Generated = exports.Generated = null;
    +const Pure = exports.Pure = null;
    +const Flow = exports.Flow = ["Flow", "ImportDeclaration", "ExportDeclaration", "ImportSpecifier"];
    +const RestProperty = exports.RestProperty = ["RestElement"];
    +const SpreadProperty = exports.SpreadProperty = ["RestElement"];
    +const ExistentialTypeParam = exports.ExistentialTypeParam = ["ExistsTypeAnnotation"];
    +const NumericLiteralTypeAnnotation = exports.NumericLiteralTypeAnnotation = ["NumberLiteralTypeAnnotation"];
    +const ForAwaitStatement = exports.ForAwaitStatement = ["ForOfStatement"];
     
     //# sourceMappingURL=virtual-types.js.map
    diff --git a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/removal.js b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/removal.js
    index 220cdc946fbeb2..7b1ce871f55553 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/removal.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/removal.js
    @@ -12,6 +12,10 @@ exports.remove = remove;
     var _removalHooks = require("./lib/removal-hooks.js");
     var _cache = require("../cache.js");
     var _index = require("./index.js");
    +var _t = require("@babel/types");
    +const {
    +  getBindingIdentifiers
    +} = _t;
     function remove() {
       var _this$opts;
       this._assertUnremoved();
    @@ -28,7 +32,7 @@ function remove() {
       this._markRemoved();
     }
     function _removeFromScope() {
    -  const bindings = this.getBindingIdentifiers();
    +  const bindings = getBindingIdentifiers(this.node, false, false, true);
       Object.keys(bindings).forEach(name => this.scope.removeBinding(name));
     }
     function _callRemovalHooks() {
    diff --git a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/replacement.js b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/replacement.js
    index dd3df51aa040b1..cca66d0f7c2eef 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/replacement.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/path/replacement.js
    @@ -22,19 +22,27 @@ const {
       assignmentExpression,
       awaitExpression,
       blockStatement,
    +  buildUndefinedNode,
       callExpression,
       cloneNode,
    +  conditionalExpression,
       expressionStatement,
    +  getBindingIdentifiers,
       identifier,
       inheritLeadingComments,
       inheritTrailingComments,
       inheritsComments,
    +  isBlockStatement,
    +  isEmptyStatement,
       isExpression,
    +  isExpressionStatement,
    +  isIfStatement,
       isProgram,
       isStatement,
    +  isVariableDeclaration,
       removeComments,
       returnStatement,
    -  toSequenceExpression,
    +  sequenceExpression,
       validate,
       yieldExpression
     } = _t;
    @@ -44,7 +52,7 @@ function replaceWithMultiple(nodes) {
       nodes = this._verifyNodeList(nodes);
       inheritLeadingComments(nodes[0], this.node);
       inheritTrailingComments(nodes[nodes.length - 1], this.node);
    -  (_getCachedPaths = (0, _cache.getCachedPaths)(this.hub, this.parent)) == null ? void 0 : _getCachedPaths.delete(this.node);
    +  (_getCachedPaths = (0, _cache.getCachedPaths)(this.hub, this.parent)) == null || _getCachedPaths.delete(this.node);
       this.node = this.container[this.key] = null;
       const paths = this.insertAfter(nodes);
       if (this.node) {
    @@ -132,14 +140,18 @@ function _replaceWith(node) {
         validate(this.parent, this.key, node);
       }
       this.debug(`Replace with ${node == null ? void 0 : node.type}`);
    -  (_getCachedPaths2 = (0, _cache.getCachedPaths)(this.hub, this.parent)) == null ? void 0 : _getCachedPaths2.set(node, this).delete(this.node);
    +  (_getCachedPaths2 = (0, _cache.getCachedPaths)(this.hub, this.parent)) == null || _getCachedPaths2.set(node, this).delete(this.node);
       this.node = this.container[this.key] = node;
     }
     function replaceExpressionWithStatements(nodes) {
       this.resync();
    -  const nodesAsSequenceExpression = toSequenceExpression(nodes, this.scope);
    -  if (nodesAsSequenceExpression) {
    -    return this.replaceWith(nodesAsSequenceExpression)[0].get("expressions");
    +  const declars = [];
    +  const nodesAsSingleExpression = gatherSequenceExpressions(nodes, declars);
    +  if (nodesAsSingleExpression) {
    +    for (const id of declars) this.scope.push({
    +      id
    +    });
    +    return this.replaceWith(nodesAsSingleExpression)[0].get("expressions");
       }
       const functionParent = this.getFunctionParent();
       const isParentAsync = functionParent == null ? void 0 : functionParent.is("async");
    @@ -186,6 +198,53 @@ function replaceExpressionWithStatements(nodes) {
       }
       return newCallee.get("body.body");
     }
    +function gatherSequenceExpressions(nodes, declars) {
    +  const exprs = [];
    +  let ensureLastUndefined = true;
    +  for (const node of nodes) {
    +    if (!isEmptyStatement(node)) {
    +      ensureLastUndefined = false;
    +    }
    +    if (isExpression(node)) {
    +      exprs.push(node);
    +    } else if (isExpressionStatement(node)) {
    +      exprs.push(node.expression);
    +    } else if (isVariableDeclaration(node)) {
    +      if (node.kind !== "var") return;
    +      for (const declar of node.declarations) {
    +        const bindings = getBindingIdentifiers(declar);
    +        for (const key of Object.keys(bindings)) {
    +          declars.push(cloneNode(bindings[key]));
    +        }
    +        if (declar.init) {
    +          exprs.push(assignmentExpression("=", declar.id, declar.init));
    +        }
    +      }
    +      ensureLastUndefined = true;
    +    } else if (isIfStatement(node)) {
    +      const consequent = node.consequent ? gatherSequenceExpressions([node.consequent], declars) : buildUndefinedNode();
    +      const alternate = node.alternate ? gatherSequenceExpressions([node.alternate], declars) : buildUndefinedNode();
    +      if (!consequent || !alternate) return;
    +      exprs.push(conditionalExpression(node.test, consequent, alternate));
    +    } else if (isBlockStatement(node)) {
    +      const body = gatherSequenceExpressions(node.body, declars);
    +      if (!body) return;
    +      exprs.push(body);
    +    } else if (isEmptyStatement(node)) {
    +      if (nodes.indexOf(node) === 0) {
    +        ensureLastUndefined = true;
    +      }
    +    } else {
    +      return;
    +    }
    +  }
    +  if (ensureLastUndefined) exprs.push(buildUndefinedNode());
    +  if (exprs.length === 1) {
    +    return exprs[0];
    +  } else {
    +    return sequenceExpression(exprs);
    +  }
    +}
     function replaceInline(nodes) {
       this.resync();
       if (Array.isArray(nodes)) {
    diff --git a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/scope/index.js b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/scope/index.js
    index 0f087c6aa76fb4..ed90029fbb64a8 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/scope/index.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/scope/index.js
    @@ -222,12 +222,12 @@ const collectorVisitor = {
             const id = declar.id;
             if (!id) return;
             const binding = scope.getBinding(id.name);
    -        binding == null ? void 0 : binding.reference(path);
    +        binding == null || binding.reference(path);
           } else if (isVariableDeclaration(declar)) {
             for (const decl of declar.declarations) {
               for (const name of Object.keys(getBindingIdentifiers(decl))) {
                 const binding = scope.getBinding(name);
    -            binding == null ? void 0 : binding.reference(path);
    +            binding == null || binding.reference(path);
               }
             }
           }
    @@ -512,7 +512,7 @@ class Scope {
         const ids = path.getBindingIdentifiers();
         for (const name of Object.keys(ids)) {
           var _this$getBinding;
    -      (_this$getBinding = this.getBinding(name)) == null ? void 0 : _this$getBinding.reassign(path);
    +      (_this$getBinding = this.getBinding(name)) == null || _this$getBinding.reassign(path);
         }
       }
       registerBinding(kind, path, bindingPath = path) {
    @@ -872,7 +872,7 @@ class Scope {
       }
       removeBinding(name) {
         var _this$getBinding3;
    -    (_this$getBinding3 = this.getBinding(name)) == null ? void 0 : _this$getBinding3.scope.removeOwnBinding(name);
    +    (_this$getBinding3 = this.getBinding(name)) == null || _this$getBinding3.scope.removeOwnBinding(name);
         let scope = this;
         do {
           if (scope.uids[name]) {
    diff --git a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/visitors.js b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/visitors.js
    index a2b9d81d02cf0b..cb06c80c9f5474 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/traverse/lib/visitors.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/traverse/lib/visitors.js
    @@ -8,6 +8,7 @@ exports.isExplodedVisitor = isExplodedVisitor;
     exports.merge = merge;
     exports.verify = verify;
     var virtualTypes = require("./path/lib/virtual-types.js");
    +var virtualTypesValidators = require("./path/lib/virtual-types-validator.js");
     var _t = require("@babel/types");
     const {
       DEPRECATED_KEYS,
    @@ -187,8 +188,10 @@ function ensureCallbackArrays(obj) {
       if (obj.exit && !Array.isArray(obj.exit)) obj.exit = [obj.exit];
     }
     function wrapCheck(nodeType, fn) {
    +  const fnKey = `is${nodeType}`;
    +  const validator = virtualTypesValidators[fnKey];
       const newFn = function (path) {
    -    if (path[`is${nodeType}`]()) {
    +    if (validator.call(path)) {
           return fn.apply(this, arguments);
         }
       };
    diff --git a/tools/node_modules/eslint/node_modules/@babel/traverse/package.json b/tools/node_modules/eslint/node_modules/@babel/traverse/package.json
    index debdbf795a74e7..6067dc81f41629 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/traverse/package.json
    +++ b/tools/node_modules/eslint/node_modules/@babel/traverse/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@babel/traverse",
    -  "version": "7.23.0",
    +  "version": "7.23.6",
       "description": "The Babel Traverse module maintains the overall tree state, and is responsible for replacing, removing, and adding nodes",
       "author": "The Babel Team (https://babel.dev/team)",
       "homepage": "https://babel.dev/docs/en/next/babel-traverse",
    @@ -16,19 +16,19 @@
       },
       "main": "./lib/index.js",
       "dependencies": {
    -    "@babel/code-frame": "^7.22.13",
    -    "@babel/generator": "^7.23.0",
    +    "@babel/code-frame": "^7.23.5",
    +    "@babel/generator": "^7.23.6",
         "@babel/helper-environment-visitor": "^7.22.20",
         "@babel/helper-function-name": "^7.23.0",
         "@babel/helper-hoist-variables": "^7.22.5",
         "@babel/helper-split-export-declaration": "^7.22.6",
    -    "@babel/parser": "^7.23.0",
    -    "@babel/types": "^7.23.0",
    -    "debug": "^4.1.0",
    +    "@babel/parser": "^7.23.6",
    +    "@babel/types": "^7.23.6",
    +    "debug": "^4.3.1",
         "globals": "^11.1.0"
       },
       "devDependencies": {
    -    "@babel/core": "^7.23.0",
    +    "@babel/core": "^7.23.6",
         "@babel/helper-plugin-test-runner": "^7.22.5"
       },
       "engines": {
    diff --git a/tools/node_modules/eslint/node_modules/@babel/types/lib/builders/flow/createTypeAnnotationBasedOnTypeof.js b/tools/node_modules/eslint/node_modules/@babel/types/lib/builders/flow/createTypeAnnotationBasedOnTypeof.js
    index 8b1917c43e6fe5..79d58becbb40e6 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/types/lib/builders/flow/createTypeAnnotationBasedOnTypeof.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/types/lib/builders/flow/createTypeAnnotationBasedOnTypeof.js
    @@ -5,8 +5,7 @@ Object.defineProperty(exports, "__esModule", {
     });
     exports.default = void 0;
     var _index = require("../generated/index.js");
    -var _default = createTypeAnnotationBasedOnTypeof;
    -exports.default = _default;
    +var _default = exports.default = createTypeAnnotationBasedOnTypeof;
     function createTypeAnnotationBasedOnTypeof(type) {
       switch (type) {
         case "string":
    diff --git a/tools/node_modules/eslint/node_modules/@babel/types/lib/builders/generated/index.js b/tools/node_modules/eslint/node_modules/@babel/types/lib/builders/generated/index.js
    index df8586d74d6121..c0b3ef179c4a9c 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/types/lib/builders/generated/index.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/types/lib/builders/generated/index.js
    @@ -1589,12 +1589,11 @@ function tsConstructSignatureDeclaration(typeParameters = null, parameters, type
         typeAnnotation
       });
     }
    -function tsPropertySignature(key, typeAnnotation = null, initializer = null) {
    +function tsPropertySignature(key, typeAnnotation = null) {
       return (0, _validateNode.default)({
         type: "TSPropertySignature",
         key,
         typeAnnotation,
    -    initializer,
         kind: null
       });
     }
    diff --git a/tools/node_modules/eslint/node_modules/@babel/types/lib/constants/generated/index.js b/tools/node_modules/eslint/node_modules/@babel/types/lib/constants/generated/index.js
    index 50c8179583b75b..9dbb33214b864f 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/types/lib/constants/generated/index.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/types/lib/constants/generated/index.js
    @@ -5,105 +5,55 @@ Object.defineProperty(exports, "__esModule", {
     });
     exports.WHILE_TYPES = exports.USERWHITESPACABLE_TYPES = exports.UNARYLIKE_TYPES = exports.TYPESCRIPT_TYPES = exports.TSTYPE_TYPES = exports.TSTYPEELEMENT_TYPES = exports.TSENTITYNAME_TYPES = exports.TSBASETYPE_TYPES = exports.TERMINATORLESS_TYPES = exports.STATEMENT_TYPES = exports.STANDARDIZED_TYPES = exports.SCOPABLE_TYPES = exports.PUREISH_TYPES = exports.PROPERTY_TYPES = exports.PRIVATE_TYPES = exports.PATTERN_TYPES = exports.PATTERNLIKE_TYPES = exports.OBJECTMEMBER_TYPES = exports.MODULESPECIFIER_TYPES = exports.MODULEDECLARATION_TYPES = exports.MISCELLANEOUS_TYPES = exports.METHOD_TYPES = exports.LVAL_TYPES = exports.LOOP_TYPES = exports.LITERAL_TYPES = exports.JSX_TYPES = exports.IMPORTOREXPORTDECLARATION_TYPES = exports.IMMUTABLE_TYPES = exports.FUNCTION_TYPES = exports.FUNCTIONPARENT_TYPES = exports.FOR_TYPES = exports.FORXSTATEMENT_TYPES = exports.FLOW_TYPES = exports.FLOWTYPE_TYPES = exports.FLOWPREDICATE_TYPES = exports.FLOWDECLARATION_TYPES = exports.FLOWBASEANNOTATION_TYPES = exports.EXPRESSION_TYPES = exports.EXPRESSIONWRAPPER_TYPES = exports.EXPORTDECLARATION_TYPES = exports.ENUMMEMBER_TYPES = exports.ENUMBODY_TYPES = exports.DECLARATION_TYPES = exports.CONDITIONAL_TYPES = exports.COMPLETIONSTATEMENT_TYPES = exports.CLASS_TYPES = exports.BLOCK_TYPES = exports.BLOCKPARENT_TYPES = exports.BINARY_TYPES = exports.ACCESSOR_TYPES = void 0;
     var _index = require("../../definitions/index.js");
    -const STANDARDIZED_TYPES = _index.FLIPPED_ALIAS_KEYS["Standardized"];
    -exports.STANDARDIZED_TYPES = STANDARDIZED_TYPES;
    -const EXPRESSION_TYPES = _index.FLIPPED_ALIAS_KEYS["Expression"];
    -exports.EXPRESSION_TYPES = EXPRESSION_TYPES;
    -const BINARY_TYPES = _index.FLIPPED_ALIAS_KEYS["Binary"];
    -exports.BINARY_TYPES = BINARY_TYPES;
    -const SCOPABLE_TYPES = _index.FLIPPED_ALIAS_KEYS["Scopable"];
    -exports.SCOPABLE_TYPES = SCOPABLE_TYPES;
    -const BLOCKPARENT_TYPES = _index.FLIPPED_ALIAS_KEYS["BlockParent"];
    -exports.BLOCKPARENT_TYPES = BLOCKPARENT_TYPES;
    -const BLOCK_TYPES = _index.FLIPPED_ALIAS_KEYS["Block"];
    -exports.BLOCK_TYPES = BLOCK_TYPES;
    -const STATEMENT_TYPES = _index.FLIPPED_ALIAS_KEYS["Statement"];
    -exports.STATEMENT_TYPES = STATEMENT_TYPES;
    -const TERMINATORLESS_TYPES = _index.FLIPPED_ALIAS_KEYS["Terminatorless"];
    -exports.TERMINATORLESS_TYPES = TERMINATORLESS_TYPES;
    -const COMPLETIONSTATEMENT_TYPES = _index.FLIPPED_ALIAS_KEYS["CompletionStatement"];
    -exports.COMPLETIONSTATEMENT_TYPES = COMPLETIONSTATEMENT_TYPES;
    -const CONDITIONAL_TYPES = _index.FLIPPED_ALIAS_KEYS["Conditional"];
    -exports.CONDITIONAL_TYPES = CONDITIONAL_TYPES;
    -const LOOP_TYPES = _index.FLIPPED_ALIAS_KEYS["Loop"];
    -exports.LOOP_TYPES = LOOP_TYPES;
    -const WHILE_TYPES = _index.FLIPPED_ALIAS_KEYS["While"];
    -exports.WHILE_TYPES = WHILE_TYPES;
    -const EXPRESSIONWRAPPER_TYPES = _index.FLIPPED_ALIAS_KEYS["ExpressionWrapper"];
    -exports.EXPRESSIONWRAPPER_TYPES = EXPRESSIONWRAPPER_TYPES;
    -const FOR_TYPES = _index.FLIPPED_ALIAS_KEYS["For"];
    -exports.FOR_TYPES = FOR_TYPES;
    -const FORXSTATEMENT_TYPES = _index.FLIPPED_ALIAS_KEYS["ForXStatement"];
    -exports.FORXSTATEMENT_TYPES = FORXSTATEMENT_TYPES;
    -const FUNCTION_TYPES = _index.FLIPPED_ALIAS_KEYS["Function"];
    -exports.FUNCTION_TYPES = FUNCTION_TYPES;
    -const FUNCTIONPARENT_TYPES = _index.FLIPPED_ALIAS_KEYS["FunctionParent"];
    -exports.FUNCTIONPARENT_TYPES = FUNCTIONPARENT_TYPES;
    -const PUREISH_TYPES = _index.FLIPPED_ALIAS_KEYS["Pureish"];
    -exports.PUREISH_TYPES = PUREISH_TYPES;
    -const DECLARATION_TYPES = _index.FLIPPED_ALIAS_KEYS["Declaration"];
    -exports.DECLARATION_TYPES = DECLARATION_TYPES;
    -const PATTERNLIKE_TYPES = _index.FLIPPED_ALIAS_KEYS["PatternLike"];
    -exports.PATTERNLIKE_TYPES = PATTERNLIKE_TYPES;
    -const LVAL_TYPES = _index.FLIPPED_ALIAS_KEYS["LVal"];
    -exports.LVAL_TYPES = LVAL_TYPES;
    -const TSENTITYNAME_TYPES = _index.FLIPPED_ALIAS_KEYS["TSEntityName"];
    -exports.TSENTITYNAME_TYPES = TSENTITYNAME_TYPES;
    -const LITERAL_TYPES = _index.FLIPPED_ALIAS_KEYS["Literal"];
    -exports.LITERAL_TYPES = LITERAL_TYPES;
    -const IMMUTABLE_TYPES = _index.FLIPPED_ALIAS_KEYS["Immutable"];
    -exports.IMMUTABLE_TYPES = IMMUTABLE_TYPES;
    -const USERWHITESPACABLE_TYPES = _index.FLIPPED_ALIAS_KEYS["UserWhitespacable"];
    -exports.USERWHITESPACABLE_TYPES = USERWHITESPACABLE_TYPES;
    -const METHOD_TYPES = _index.FLIPPED_ALIAS_KEYS["Method"];
    -exports.METHOD_TYPES = METHOD_TYPES;
    -const OBJECTMEMBER_TYPES = _index.FLIPPED_ALIAS_KEYS["ObjectMember"];
    -exports.OBJECTMEMBER_TYPES = OBJECTMEMBER_TYPES;
    -const PROPERTY_TYPES = _index.FLIPPED_ALIAS_KEYS["Property"];
    -exports.PROPERTY_TYPES = PROPERTY_TYPES;
    -const UNARYLIKE_TYPES = _index.FLIPPED_ALIAS_KEYS["UnaryLike"];
    -exports.UNARYLIKE_TYPES = UNARYLIKE_TYPES;
    -const PATTERN_TYPES = _index.FLIPPED_ALIAS_KEYS["Pattern"];
    -exports.PATTERN_TYPES = PATTERN_TYPES;
    -const CLASS_TYPES = _index.FLIPPED_ALIAS_KEYS["Class"];
    -exports.CLASS_TYPES = CLASS_TYPES;
    -const IMPORTOREXPORTDECLARATION_TYPES = _index.FLIPPED_ALIAS_KEYS["ImportOrExportDeclaration"];
    -exports.IMPORTOREXPORTDECLARATION_TYPES = IMPORTOREXPORTDECLARATION_TYPES;
    -const EXPORTDECLARATION_TYPES = _index.FLIPPED_ALIAS_KEYS["ExportDeclaration"];
    -exports.EXPORTDECLARATION_TYPES = EXPORTDECLARATION_TYPES;
    -const MODULESPECIFIER_TYPES = _index.FLIPPED_ALIAS_KEYS["ModuleSpecifier"];
    -exports.MODULESPECIFIER_TYPES = MODULESPECIFIER_TYPES;
    -const ACCESSOR_TYPES = _index.FLIPPED_ALIAS_KEYS["Accessor"];
    -exports.ACCESSOR_TYPES = ACCESSOR_TYPES;
    -const PRIVATE_TYPES = _index.FLIPPED_ALIAS_KEYS["Private"];
    -exports.PRIVATE_TYPES = PRIVATE_TYPES;
    -const FLOW_TYPES = _index.FLIPPED_ALIAS_KEYS["Flow"];
    -exports.FLOW_TYPES = FLOW_TYPES;
    -const FLOWTYPE_TYPES = _index.FLIPPED_ALIAS_KEYS["FlowType"];
    -exports.FLOWTYPE_TYPES = FLOWTYPE_TYPES;
    -const FLOWBASEANNOTATION_TYPES = _index.FLIPPED_ALIAS_KEYS["FlowBaseAnnotation"];
    -exports.FLOWBASEANNOTATION_TYPES = FLOWBASEANNOTATION_TYPES;
    -const FLOWDECLARATION_TYPES = _index.FLIPPED_ALIAS_KEYS["FlowDeclaration"];
    -exports.FLOWDECLARATION_TYPES = FLOWDECLARATION_TYPES;
    -const FLOWPREDICATE_TYPES = _index.FLIPPED_ALIAS_KEYS["FlowPredicate"];
    -exports.FLOWPREDICATE_TYPES = FLOWPREDICATE_TYPES;
    -const ENUMBODY_TYPES = _index.FLIPPED_ALIAS_KEYS["EnumBody"];
    -exports.ENUMBODY_TYPES = ENUMBODY_TYPES;
    -const ENUMMEMBER_TYPES = _index.FLIPPED_ALIAS_KEYS["EnumMember"];
    -exports.ENUMMEMBER_TYPES = ENUMMEMBER_TYPES;
    -const JSX_TYPES = _index.FLIPPED_ALIAS_KEYS["JSX"];
    -exports.JSX_TYPES = JSX_TYPES;
    -const MISCELLANEOUS_TYPES = _index.FLIPPED_ALIAS_KEYS["Miscellaneous"];
    -exports.MISCELLANEOUS_TYPES = MISCELLANEOUS_TYPES;
    -const TYPESCRIPT_TYPES = _index.FLIPPED_ALIAS_KEYS["TypeScript"];
    -exports.TYPESCRIPT_TYPES = TYPESCRIPT_TYPES;
    -const TSTYPEELEMENT_TYPES = _index.FLIPPED_ALIAS_KEYS["TSTypeElement"];
    -exports.TSTYPEELEMENT_TYPES = TSTYPEELEMENT_TYPES;
    -const TSTYPE_TYPES = _index.FLIPPED_ALIAS_KEYS["TSType"];
    -exports.TSTYPE_TYPES = TSTYPE_TYPES;
    -const TSBASETYPE_TYPES = _index.FLIPPED_ALIAS_KEYS["TSBaseType"];
    -exports.TSBASETYPE_TYPES = TSBASETYPE_TYPES;
    -const MODULEDECLARATION_TYPES = IMPORTOREXPORTDECLARATION_TYPES;
    -exports.MODULEDECLARATION_TYPES = MODULEDECLARATION_TYPES;
    +const STANDARDIZED_TYPES = exports.STANDARDIZED_TYPES = _index.FLIPPED_ALIAS_KEYS["Standardized"];
    +const EXPRESSION_TYPES = exports.EXPRESSION_TYPES = _index.FLIPPED_ALIAS_KEYS["Expression"];
    +const BINARY_TYPES = exports.BINARY_TYPES = _index.FLIPPED_ALIAS_KEYS["Binary"];
    +const SCOPABLE_TYPES = exports.SCOPABLE_TYPES = _index.FLIPPED_ALIAS_KEYS["Scopable"];
    +const BLOCKPARENT_TYPES = exports.BLOCKPARENT_TYPES = _index.FLIPPED_ALIAS_KEYS["BlockParent"];
    +const BLOCK_TYPES = exports.BLOCK_TYPES = _index.FLIPPED_ALIAS_KEYS["Block"];
    +const STATEMENT_TYPES = exports.STATEMENT_TYPES = _index.FLIPPED_ALIAS_KEYS["Statement"];
    +const TERMINATORLESS_TYPES = exports.TERMINATORLESS_TYPES = _index.FLIPPED_ALIAS_KEYS["Terminatorless"];
    +const COMPLETIONSTATEMENT_TYPES = exports.COMPLETIONSTATEMENT_TYPES = _index.FLIPPED_ALIAS_KEYS["CompletionStatement"];
    +const CONDITIONAL_TYPES = exports.CONDITIONAL_TYPES = _index.FLIPPED_ALIAS_KEYS["Conditional"];
    +const LOOP_TYPES = exports.LOOP_TYPES = _index.FLIPPED_ALIAS_KEYS["Loop"];
    +const WHILE_TYPES = exports.WHILE_TYPES = _index.FLIPPED_ALIAS_KEYS["While"];
    +const EXPRESSIONWRAPPER_TYPES = exports.EXPRESSIONWRAPPER_TYPES = _index.FLIPPED_ALIAS_KEYS["ExpressionWrapper"];
    +const FOR_TYPES = exports.FOR_TYPES = _index.FLIPPED_ALIAS_KEYS["For"];
    +const FORXSTATEMENT_TYPES = exports.FORXSTATEMENT_TYPES = _index.FLIPPED_ALIAS_KEYS["ForXStatement"];
    +const FUNCTION_TYPES = exports.FUNCTION_TYPES = _index.FLIPPED_ALIAS_KEYS["Function"];
    +const FUNCTIONPARENT_TYPES = exports.FUNCTIONPARENT_TYPES = _index.FLIPPED_ALIAS_KEYS["FunctionParent"];
    +const PUREISH_TYPES = exports.PUREISH_TYPES = _index.FLIPPED_ALIAS_KEYS["Pureish"];
    +const DECLARATION_TYPES = exports.DECLARATION_TYPES = _index.FLIPPED_ALIAS_KEYS["Declaration"];
    +const PATTERNLIKE_TYPES = exports.PATTERNLIKE_TYPES = _index.FLIPPED_ALIAS_KEYS["PatternLike"];
    +const LVAL_TYPES = exports.LVAL_TYPES = _index.FLIPPED_ALIAS_KEYS["LVal"];
    +const TSENTITYNAME_TYPES = exports.TSENTITYNAME_TYPES = _index.FLIPPED_ALIAS_KEYS["TSEntityName"];
    +const LITERAL_TYPES = exports.LITERAL_TYPES = _index.FLIPPED_ALIAS_KEYS["Literal"];
    +const IMMUTABLE_TYPES = exports.IMMUTABLE_TYPES = _index.FLIPPED_ALIAS_KEYS["Immutable"];
    +const USERWHITESPACABLE_TYPES = exports.USERWHITESPACABLE_TYPES = _index.FLIPPED_ALIAS_KEYS["UserWhitespacable"];
    +const METHOD_TYPES = exports.METHOD_TYPES = _index.FLIPPED_ALIAS_KEYS["Method"];
    +const OBJECTMEMBER_TYPES = exports.OBJECTMEMBER_TYPES = _index.FLIPPED_ALIAS_KEYS["ObjectMember"];
    +const PROPERTY_TYPES = exports.PROPERTY_TYPES = _index.FLIPPED_ALIAS_KEYS["Property"];
    +const UNARYLIKE_TYPES = exports.UNARYLIKE_TYPES = _index.FLIPPED_ALIAS_KEYS["UnaryLike"];
    +const PATTERN_TYPES = exports.PATTERN_TYPES = _index.FLIPPED_ALIAS_KEYS["Pattern"];
    +const CLASS_TYPES = exports.CLASS_TYPES = _index.FLIPPED_ALIAS_KEYS["Class"];
    +const IMPORTOREXPORTDECLARATION_TYPES = exports.IMPORTOREXPORTDECLARATION_TYPES = _index.FLIPPED_ALIAS_KEYS["ImportOrExportDeclaration"];
    +const EXPORTDECLARATION_TYPES = exports.EXPORTDECLARATION_TYPES = _index.FLIPPED_ALIAS_KEYS["ExportDeclaration"];
    +const MODULESPECIFIER_TYPES = exports.MODULESPECIFIER_TYPES = _index.FLIPPED_ALIAS_KEYS["ModuleSpecifier"];
    +const ACCESSOR_TYPES = exports.ACCESSOR_TYPES = _index.FLIPPED_ALIAS_KEYS["Accessor"];
    +const PRIVATE_TYPES = exports.PRIVATE_TYPES = _index.FLIPPED_ALIAS_KEYS["Private"];
    +const FLOW_TYPES = exports.FLOW_TYPES = _index.FLIPPED_ALIAS_KEYS["Flow"];
    +const FLOWTYPE_TYPES = exports.FLOWTYPE_TYPES = _index.FLIPPED_ALIAS_KEYS["FlowType"];
    +const FLOWBASEANNOTATION_TYPES = exports.FLOWBASEANNOTATION_TYPES = _index.FLIPPED_ALIAS_KEYS["FlowBaseAnnotation"];
    +const FLOWDECLARATION_TYPES = exports.FLOWDECLARATION_TYPES = _index.FLIPPED_ALIAS_KEYS["FlowDeclaration"];
    +const FLOWPREDICATE_TYPES = exports.FLOWPREDICATE_TYPES = _index.FLIPPED_ALIAS_KEYS["FlowPredicate"];
    +const ENUMBODY_TYPES = exports.ENUMBODY_TYPES = _index.FLIPPED_ALIAS_KEYS["EnumBody"];
    +const ENUMMEMBER_TYPES = exports.ENUMMEMBER_TYPES = _index.FLIPPED_ALIAS_KEYS["EnumMember"];
    +const JSX_TYPES = exports.JSX_TYPES = _index.FLIPPED_ALIAS_KEYS["JSX"];
    +const MISCELLANEOUS_TYPES = exports.MISCELLANEOUS_TYPES = _index.FLIPPED_ALIAS_KEYS["Miscellaneous"];
    +const TYPESCRIPT_TYPES = exports.TYPESCRIPT_TYPES = _index.FLIPPED_ALIAS_KEYS["TypeScript"];
    +const TSTYPEELEMENT_TYPES = exports.TSTYPEELEMENT_TYPES = _index.FLIPPED_ALIAS_KEYS["TSTypeElement"];
    +const TSTYPE_TYPES = exports.TSTYPE_TYPES = _index.FLIPPED_ALIAS_KEYS["TSType"];
    +const TSBASETYPE_TYPES = exports.TSBASETYPE_TYPES = _index.FLIPPED_ALIAS_KEYS["TSBaseType"];
    +const MODULEDECLARATION_TYPES = exports.MODULEDECLARATION_TYPES = IMPORTOREXPORTDECLARATION_TYPES;
     
     //# sourceMappingURL=index.js.map
    diff --git a/tools/node_modules/eslint/node_modules/@babel/types/lib/constants/index.js b/tools/node_modules/eslint/node_modules/@babel/types/lib/constants/index.js
    index 92484441d41962..5045d01d2dcb0b 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/types/lib/constants/index.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/types/lib/constants/index.js
    @@ -4,48 +4,28 @@ Object.defineProperty(exports, "__esModule", {
       value: true
     });
     exports.UPDATE_OPERATORS = exports.UNARY_OPERATORS = exports.STRING_UNARY_OPERATORS = exports.STATEMENT_OR_BLOCK_KEYS = exports.NUMBER_UNARY_OPERATORS = exports.NUMBER_BINARY_OPERATORS = exports.NOT_LOCAL_BINDING = exports.LOGICAL_OPERATORS = exports.INHERIT_KEYS = exports.FOR_INIT_KEYS = exports.FLATTENABLE_KEYS = exports.EQUALITY_BINARY_OPERATORS = exports.COMPARISON_BINARY_OPERATORS = exports.COMMENT_KEYS = exports.BOOLEAN_UNARY_OPERATORS = exports.BOOLEAN_NUMBER_BINARY_OPERATORS = exports.BOOLEAN_BINARY_OPERATORS = exports.BLOCK_SCOPED_SYMBOL = exports.BINARY_OPERATORS = exports.ASSIGNMENT_OPERATORS = void 0;
    -const STATEMENT_OR_BLOCK_KEYS = ["consequent", "body", "alternate"];
    -exports.STATEMENT_OR_BLOCK_KEYS = STATEMENT_OR_BLOCK_KEYS;
    -const FLATTENABLE_KEYS = ["body", "expressions"];
    -exports.FLATTENABLE_KEYS = FLATTENABLE_KEYS;
    -const FOR_INIT_KEYS = ["left", "init"];
    -exports.FOR_INIT_KEYS = FOR_INIT_KEYS;
    -const COMMENT_KEYS = ["leadingComments", "trailingComments", "innerComments"];
    -exports.COMMENT_KEYS = COMMENT_KEYS;
    -const LOGICAL_OPERATORS = ["||", "&&", "??"];
    -exports.LOGICAL_OPERATORS = LOGICAL_OPERATORS;
    -const UPDATE_OPERATORS = ["++", "--"];
    -exports.UPDATE_OPERATORS = UPDATE_OPERATORS;
    -const BOOLEAN_NUMBER_BINARY_OPERATORS = [">", "<", ">=", "<="];
    -exports.BOOLEAN_NUMBER_BINARY_OPERATORS = BOOLEAN_NUMBER_BINARY_OPERATORS;
    -const EQUALITY_BINARY_OPERATORS = ["==", "===", "!=", "!=="];
    -exports.EQUALITY_BINARY_OPERATORS = EQUALITY_BINARY_OPERATORS;
    -const COMPARISON_BINARY_OPERATORS = [...EQUALITY_BINARY_OPERATORS, "in", "instanceof"];
    -exports.COMPARISON_BINARY_OPERATORS = COMPARISON_BINARY_OPERATORS;
    -const BOOLEAN_BINARY_OPERATORS = [...COMPARISON_BINARY_OPERATORS, ...BOOLEAN_NUMBER_BINARY_OPERATORS];
    -exports.BOOLEAN_BINARY_OPERATORS = BOOLEAN_BINARY_OPERATORS;
    -const NUMBER_BINARY_OPERATORS = ["-", "/", "%", "*", "**", "&", "|", ">>", ">>>", "<<", "^"];
    -exports.NUMBER_BINARY_OPERATORS = NUMBER_BINARY_OPERATORS;
    -const BINARY_OPERATORS = ["+", ...NUMBER_BINARY_OPERATORS, ...BOOLEAN_BINARY_OPERATORS, "|>"];
    -exports.BINARY_OPERATORS = BINARY_OPERATORS;
    -const ASSIGNMENT_OPERATORS = ["=", "+=", ...NUMBER_BINARY_OPERATORS.map(op => op + "="), ...LOGICAL_OPERATORS.map(op => op + "=")];
    -exports.ASSIGNMENT_OPERATORS = ASSIGNMENT_OPERATORS;
    -const BOOLEAN_UNARY_OPERATORS = ["delete", "!"];
    -exports.BOOLEAN_UNARY_OPERATORS = BOOLEAN_UNARY_OPERATORS;
    -const NUMBER_UNARY_OPERATORS = ["+", "-", "~"];
    -exports.NUMBER_UNARY_OPERATORS = NUMBER_UNARY_OPERATORS;
    -const STRING_UNARY_OPERATORS = ["typeof"];
    -exports.STRING_UNARY_OPERATORS = STRING_UNARY_OPERATORS;
    -const UNARY_OPERATORS = ["void", "throw", ...BOOLEAN_UNARY_OPERATORS, ...NUMBER_UNARY_OPERATORS, ...STRING_UNARY_OPERATORS];
    -exports.UNARY_OPERATORS = UNARY_OPERATORS;
    -const INHERIT_KEYS = {
    +const STATEMENT_OR_BLOCK_KEYS = exports.STATEMENT_OR_BLOCK_KEYS = ["consequent", "body", "alternate"];
    +const FLATTENABLE_KEYS = exports.FLATTENABLE_KEYS = ["body", "expressions"];
    +const FOR_INIT_KEYS = exports.FOR_INIT_KEYS = ["left", "init"];
    +const COMMENT_KEYS = exports.COMMENT_KEYS = ["leadingComments", "trailingComments", "innerComments"];
    +const LOGICAL_OPERATORS = exports.LOGICAL_OPERATORS = ["||", "&&", "??"];
    +const UPDATE_OPERATORS = exports.UPDATE_OPERATORS = ["++", "--"];
    +const BOOLEAN_NUMBER_BINARY_OPERATORS = exports.BOOLEAN_NUMBER_BINARY_OPERATORS = [">", "<", ">=", "<="];
    +const EQUALITY_BINARY_OPERATORS = exports.EQUALITY_BINARY_OPERATORS = ["==", "===", "!=", "!=="];
    +const COMPARISON_BINARY_OPERATORS = exports.COMPARISON_BINARY_OPERATORS = [...EQUALITY_BINARY_OPERATORS, "in", "instanceof"];
    +const BOOLEAN_BINARY_OPERATORS = exports.BOOLEAN_BINARY_OPERATORS = [...COMPARISON_BINARY_OPERATORS, ...BOOLEAN_NUMBER_BINARY_OPERATORS];
    +const NUMBER_BINARY_OPERATORS = exports.NUMBER_BINARY_OPERATORS = ["-", "/", "%", "*", "**", "&", "|", ">>", ">>>", "<<", "^"];
    +const BINARY_OPERATORS = exports.BINARY_OPERATORS = ["+", ...NUMBER_BINARY_OPERATORS, ...BOOLEAN_BINARY_OPERATORS, "|>"];
    +const ASSIGNMENT_OPERATORS = exports.ASSIGNMENT_OPERATORS = ["=", "+=", ...NUMBER_BINARY_OPERATORS.map(op => op + "="), ...LOGICAL_OPERATORS.map(op => op + "=")];
    +const BOOLEAN_UNARY_OPERATORS = exports.BOOLEAN_UNARY_OPERATORS = ["delete", "!"];
    +const NUMBER_UNARY_OPERATORS = exports.NUMBER_UNARY_OPERATORS = ["+", "-", "~"];
    +const STRING_UNARY_OPERATORS = exports.STRING_UNARY_OPERATORS = ["typeof"];
    +const UNARY_OPERATORS = exports.UNARY_OPERATORS = ["void", "throw", ...BOOLEAN_UNARY_OPERATORS, ...NUMBER_UNARY_OPERATORS, ...STRING_UNARY_OPERATORS];
    +const INHERIT_KEYS = exports.INHERIT_KEYS = {
       optional: ["typeAnnotation", "typeParameters", "returnType"],
       force: ["start", "loc", "end"]
     };
    -exports.INHERIT_KEYS = INHERIT_KEYS;
    -const BLOCK_SCOPED_SYMBOL = Symbol.for("var used to be block scoped");
    -exports.BLOCK_SCOPED_SYMBOL = BLOCK_SCOPED_SYMBOL;
    -const NOT_LOCAL_BINDING = Symbol.for("should not be considered a local binding");
    -exports.NOT_LOCAL_BINDING = NOT_LOCAL_BINDING;
    +const BLOCK_SCOPED_SYMBOL = exports.BLOCK_SCOPED_SYMBOL = Symbol.for("var used to be block scoped");
    +const NOT_LOCAL_BINDING = exports.NOT_LOCAL_BINDING = Symbol.for("should not be considered a local binding");
     
     //# sourceMappingURL=index.js.map
    diff --git a/tools/node_modules/eslint/node_modules/@babel/types/lib/converters/gatherSequenceExpressions.js b/tools/node_modules/eslint/node_modules/@babel/types/lib/converters/gatherSequenceExpressions.js
    index aa212fdcb02910..05c311a276a3b9 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/types/lib/converters/gatherSequenceExpressions.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/types/lib/converters/gatherSequenceExpressions.js
    @@ -8,6 +8,7 @@ var _getBindingIdentifiers = require("../retrievers/getBindingIdentifiers.js");
     var _index = require("../validators/generated/index.js");
     var _index2 = require("../builders/generated/index.js");
     var _cloneNode = require("../clone/cloneNode.js");
    +;
     function gatherSequenceExpressions(nodes, scope, declars) {
       const exprs = [];
       let ensureLastUndefined = true;
    diff --git a/tools/node_modules/eslint/node_modules/@babel/types/lib/converters/toExpression.js b/tools/node_modules/eslint/node_modules/@babel/types/lib/converters/toExpression.js
    index 6628365712d998..bcb576fe2f057b 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/types/lib/converters/toExpression.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/types/lib/converters/toExpression.js
    @@ -5,8 +5,7 @@ Object.defineProperty(exports, "__esModule", {
     });
     exports.default = void 0;
     var _index = require("../validators/generated/index.js");
    -var _default = toExpression;
    -exports.default = _default;
    +var _default = exports.default = toExpression;
     function toExpression(node) {
       if ((0, _index.isExpressionStatement)(node)) {
         node = node.expression;
    diff --git a/tools/node_modules/eslint/node_modules/@babel/types/lib/converters/toSequenceExpression.js b/tools/node_modules/eslint/node_modules/@babel/types/lib/converters/toSequenceExpression.js
    index 110feb5db5f90b..7a4322f80ef82e 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/types/lib/converters/toSequenceExpression.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/types/lib/converters/toSequenceExpression.js
    @@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
     });
     exports.default = toSequenceExpression;
     var _gatherSequenceExpressions = require("./gatherSequenceExpressions.js");
    +;
     function toSequenceExpression(nodes, scope) {
       if (!(nodes != null && nodes.length)) return;
       const declars = [];
    diff --git a/tools/node_modules/eslint/node_modules/@babel/types/lib/converters/toStatement.js b/tools/node_modules/eslint/node_modules/@babel/types/lib/converters/toStatement.js
    index 9b3962eb3e6dbd..92cfd96033aa69 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/types/lib/converters/toStatement.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/types/lib/converters/toStatement.js
    @@ -6,8 +6,7 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = void 0;
     var _index = require("../validators/generated/index.js");
     var _index2 = require("../builders/generated/index.js");
    -var _default = toStatement;
    -exports.default = _default;
    +var _default = exports.default = toStatement;
     function toStatement(node, ignore) {
       if ((0, _index.isStatement)(node)) {
         return node;
    diff --git a/tools/node_modules/eslint/node_modules/@babel/types/lib/converters/valueToNode.js b/tools/node_modules/eslint/node_modules/@babel/types/lib/converters/valueToNode.js
    index 17b35edadc3113..e0ed95225d54f1 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/types/lib/converters/valueToNode.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/types/lib/converters/valueToNode.js
    @@ -6,8 +6,7 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = void 0;
     var _isValidIdentifier = require("../validators/isValidIdentifier.js");
     var _index = require("../builders/generated/index.js");
    -var _default = valueToNode;
    -exports.default = _default;
    +var _default = exports.default = valueToNode;
     const objectToString = Function.call.bind(Object.prototype.toString);
     function isRegExp(value) {
       return objectToString(value) === "[object RegExp]";
    diff --git a/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/core.js b/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/core.js
    index a5277b1372c130..59c0608776a1ba 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/core.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/core.js
    @@ -1294,7 +1294,7 @@ const classMethodOrPropertyCommon = () => ({
       },
       key: {
         validate: (0, _utils.chain)(function () {
    -      const normal = (0, _utils.assertNodeType)("Identifier", "StringLiteral", "NumericLiteral");
    +      const normal = (0, _utils.assertNodeType)("Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral");
           const computed = (0, _utils.assertNodeType)("Expression");
           return function (node, key, val) {
             const validator = node.computed ? computed : normal;
    diff --git a/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/deprecated-aliases.js b/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/deprecated-aliases.js
    index 6c04ed6166d9b3..03a375173239da 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/deprecated-aliases.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/deprecated-aliases.js
    @@ -4,9 +4,8 @@ Object.defineProperty(exports, "__esModule", {
       value: true
     });
     exports.DEPRECATED_ALIASES = void 0;
    -const DEPRECATED_ALIASES = {
    +const DEPRECATED_ALIASES = exports.DEPRECATED_ALIASES = {
       ModuleDeclaration: "ImportOrExportDeclaration"
     };
    -exports.DEPRECATED_ALIASES = DEPRECATED_ALIASES;
     
     //# sourceMappingURL=deprecated-aliases.js.map
    diff --git a/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/index.js b/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/index.js
    index da75ae9b66dba3..1f9b95ca358416 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/index.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/index.js
    @@ -91,7 +91,6 @@ _toFastProperties(_utils.BUILDER_KEYS);
     _toFastProperties(_utils.DEPRECATED_KEYS);
     _toFastProperties(_placeholders.PLACEHOLDERS_ALIAS);
     _toFastProperties(_placeholders.PLACEHOLDERS_FLIPPED_ALIAS);
    -const TYPES = [].concat(Object.keys(_utils.VISITOR_KEYS), Object.keys(_utils.FLIPPED_ALIAS_KEYS), Object.keys(_utils.DEPRECATED_KEYS));
    -exports.TYPES = TYPES;
    +const TYPES = exports.TYPES = [].concat(Object.keys(_utils.VISITOR_KEYS), Object.keys(_utils.FLIPPED_ALIAS_KEYS), Object.keys(_utils.DEPRECATED_KEYS));
     
     //# sourceMappingURL=index.js.map
    diff --git a/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/placeholders.js b/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/placeholders.js
    index 3b96a0ea39acff..6c2e514f3d5df3 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/placeholders.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/placeholders.js
    @@ -5,19 +5,16 @@ Object.defineProperty(exports, "__esModule", {
     });
     exports.PLACEHOLDERS_FLIPPED_ALIAS = exports.PLACEHOLDERS_ALIAS = exports.PLACEHOLDERS = void 0;
     var _utils = require("./utils.js");
    -const PLACEHOLDERS = ["Identifier", "StringLiteral", "Expression", "Statement", "Declaration", "BlockStatement", "ClassBody", "Pattern"];
    -exports.PLACEHOLDERS = PLACEHOLDERS;
    -const PLACEHOLDERS_ALIAS = {
    +const PLACEHOLDERS = exports.PLACEHOLDERS = ["Identifier", "StringLiteral", "Expression", "Statement", "Declaration", "BlockStatement", "ClassBody", "Pattern"];
    +const PLACEHOLDERS_ALIAS = exports.PLACEHOLDERS_ALIAS = {
       Declaration: ["Statement"],
       Pattern: ["PatternLike", "LVal"]
     };
    -exports.PLACEHOLDERS_ALIAS = PLACEHOLDERS_ALIAS;
     for (const type of PLACEHOLDERS) {
       const alias = _utils.ALIAS_KEYS[type];
       if (alias != null && alias.length) PLACEHOLDERS_ALIAS[type] = alias;
     }
    -const PLACEHOLDERS_FLIPPED_ALIAS = {};
    -exports.PLACEHOLDERS_FLIPPED_ALIAS = PLACEHOLDERS_FLIPPED_ALIAS;
    +const PLACEHOLDERS_FLIPPED_ALIAS = exports.PLACEHOLDERS_FLIPPED_ALIAS = {};
     Object.keys(PLACEHOLDERS_ALIAS).forEach(type => {
       PLACEHOLDERS_ALIAS[type].forEach(alias => {
         if (!Object.hasOwnProperty.call(PLACEHOLDERS_FLIPPED_ALIAS, alias)) {
    diff --git a/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/typescript.js b/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/typescript.js
    index e495c34b5f2f7d..b80f809bd2c315 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/typescript.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/typescript.js
    @@ -78,11 +78,10 @@ const namedTypeElementCommon = () => ({
     });
     defineType("TSPropertySignature", {
       aliases: ["TSTypeElement"],
    -  visitor: ["key", "typeAnnotation", "initializer"],
    +  visitor: ["key", "typeAnnotation"],
       fields: Object.assign({}, namedTypeElementCommon(), {
         readonly: (0, _utils.validateOptional)(bool),
         typeAnnotation: (0, _utils.validateOptionalType)("TSTypeAnnotation"),
    -    initializer: (0, _utils.validateOptionalType)("Expression"),
         kind: {
           validate: (0, _utils.assertOneOf)("get", "set")
         }
    diff --git a/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/utils.js b/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/utils.js
    index b5b043519ac06f..33d7cda690d251 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/utils.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/types/lib/definitions/utils.js
    @@ -24,20 +24,13 @@ exports.validateOptionalType = validateOptionalType;
     exports.validateType = validateType;
     var _is = require("../validators/is.js");
     var _validate = require("../validators/validate.js");
    -const VISITOR_KEYS = {};
    -exports.VISITOR_KEYS = VISITOR_KEYS;
    -const ALIAS_KEYS = {};
    -exports.ALIAS_KEYS = ALIAS_KEYS;
    -const FLIPPED_ALIAS_KEYS = {};
    -exports.FLIPPED_ALIAS_KEYS = FLIPPED_ALIAS_KEYS;
    -const NODE_FIELDS = {};
    -exports.NODE_FIELDS = NODE_FIELDS;
    -const BUILDER_KEYS = {};
    -exports.BUILDER_KEYS = BUILDER_KEYS;
    -const DEPRECATED_KEYS = {};
    -exports.DEPRECATED_KEYS = DEPRECATED_KEYS;
    -const NODE_PARENT_VALIDATIONS = {};
    -exports.NODE_PARENT_VALIDATIONS = NODE_PARENT_VALIDATIONS;
    +const VISITOR_KEYS = exports.VISITOR_KEYS = {};
    +const ALIAS_KEYS = exports.ALIAS_KEYS = {};
    +const FLIPPED_ALIAS_KEYS = exports.FLIPPED_ALIAS_KEYS = {};
    +const NODE_FIELDS = exports.NODE_FIELDS = {};
    +const BUILDER_KEYS = exports.BUILDER_KEYS = {};
    +const DEPRECATED_KEYS = exports.DEPRECATED_KEYS = {};
    +const NODE_PARENT_VALIDATIONS = exports.NODE_PARENT_VALIDATIONS = {};
     function getType(val) {
       if (Array.isArray(val)) {
         return "array";
    diff --git a/tools/node_modules/eslint/node_modules/@babel/types/lib/index.js b/tools/node_modules/eslint/node_modules/@babel/types/lib/index.js
    index 33df87ac129be6..84b756f0526f2e 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/types/lib/index.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/types/lib/index.js
    @@ -29,7 +29,6 @@ var _exportNames = {
       toExpression: true,
       toIdentifier: true,
       toKeyAlias: true,
    -  toSequenceExpression: true,
       toStatement: true,
       valueToNode: true,
       appendToMemberExpression: true,
    @@ -370,12 +369,6 @@ Object.defineProperty(exports, "toKeyAlias", {
         return _toKeyAlias.default;
       }
     });
    -Object.defineProperty(exports, "toSequenceExpression", {
    -  enumerable: true,
    -  get: function () {
    -    return _toSequenceExpression.default;
    -  }
    -});
     Object.defineProperty(exports, "toStatement", {
       enumerable: true,
       get: function () {
    @@ -504,7 +497,6 @@ var _toComputedKey = require("./converters/toComputedKey.js");
     var _toExpression = require("./converters/toExpression.js");
     var _toIdentifier = require("./converters/toIdentifier.js");
     var _toKeyAlias = require("./converters/toKeyAlias.js");
    -var _toSequenceExpression = require("./converters/toSequenceExpression.js");
     var _toStatement = require("./converters/toStatement.js");
     var _valueToNode = require("./converters/valueToNode.js");
     var _index5 = require("./definitions/index.js");
    @@ -572,11 +564,13 @@ Object.keys(_index6).forEach(function (key) {
       });
     });
     var _deprecationWarning = require("./utils/deprecationWarning.js");
    -const react = {
    +const react = exports.react = {
       isReactComponent: _isReactComponent.default,
       isCompatTag: _isCompatTag.default,
       buildChildren: _buildChildren.default
     };
    -exports.react = react;
    +{
    +  exports.toSequenceExpression = require("./converters/toSequenceExpression.js").default;
    +}
     
     //# sourceMappingURL=index.js.map
    diff --git a/tools/node_modules/eslint/node_modules/@babel/types/lib/index.js.flow b/tools/node_modules/eslint/node_modules/@babel/types/lib/index.js.flow
    index a1203c1a883867..62ab0a6415d96e 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/types/lib/index.js.flow
    +++ b/tools/node_modules/eslint/node_modules/@babel/types/lib/index.js.flow
    @@ -1291,7 +1291,6 @@ declare class BabelNodeTSPropertySignature extends BabelNode {
       type: "TSPropertySignature";
       key: BabelNodeExpression;
       typeAnnotation?: BabelNodeTSTypeAnnotation;
    -  initializer?: BabelNodeExpression;
       computed?: boolean;
       kind: "get" | "set";
       optional?: boolean;
    @@ -1872,7 +1871,7 @@ declare module "@babel/types" {
       declare export function tsQualifiedName(left: BabelNodeTSEntityName, right: BabelNodeIdentifier): BabelNodeTSQualifiedName;
       declare export function tsCallSignatureDeclaration(typeParameters?: BabelNodeTSTypeParameterDeclaration, parameters: Array, typeAnnotation?: BabelNodeTSTypeAnnotation): BabelNodeTSCallSignatureDeclaration;
       declare export function tsConstructSignatureDeclaration(typeParameters?: BabelNodeTSTypeParameterDeclaration, parameters: Array, typeAnnotation?: BabelNodeTSTypeAnnotation): BabelNodeTSConstructSignatureDeclaration;
    -  declare export function tsPropertySignature(key: BabelNodeExpression, typeAnnotation?: BabelNodeTSTypeAnnotation, initializer?: BabelNodeExpression): BabelNodeTSPropertySignature;
    +  declare export function tsPropertySignature(key: BabelNodeExpression, typeAnnotation?: BabelNodeTSTypeAnnotation): BabelNodeTSPropertySignature;
       declare export function tsMethodSignature(key: BabelNodeExpression, typeParameters?: BabelNodeTSTypeParameterDeclaration, parameters: Array, typeAnnotation?: BabelNodeTSTypeAnnotation): BabelNodeTSMethodSignature;
       declare export function tsIndexSignature(parameters: Array, typeAnnotation?: BabelNodeTSTypeAnnotation): BabelNodeTSIndexSignature;
       declare export function tsAnyKeyword(): BabelNodeTSAnyKeyword;
    diff --git a/tools/node_modules/eslint/node_modules/@babel/types/lib/retrievers/getBindingIdentifiers.js b/tools/node_modules/eslint/node_modules/@babel/types/lib/retrievers/getBindingIdentifiers.js
    index dc90bdb35be202..86b4d1d2e4e280 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/types/lib/retrievers/getBindingIdentifiers.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/types/lib/retrievers/getBindingIdentifiers.js
    @@ -5,12 +5,15 @@ Object.defineProperty(exports, "__esModule", {
     });
     exports.default = getBindingIdentifiers;
     var _index = require("../validators/generated/index.js");
    -function getBindingIdentifiers(node, duplicates, outerOnly) {
    +function getBindingIdentifiers(node, duplicates, outerOnly, newBindingsOnly) {
       const search = [].concat(node);
       const ids = Object.create(null);
       while (search.length) {
         const id = search.shift();
         if (!id) continue;
    +    if (newBindingsOnly && ((0, _index.isAssignmentExpression)(id) || (0, _index.isUnaryExpression)(id))) {
    +      continue;
    +    }
         const keys = getBindingIdentifiers.keys[id.type];
         if ((0, _index.isIdentifier)(id)) {
           if (duplicates) {
    diff --git a/tools/node_modules/eslint/node_modules/@babel/types/lib/retrievers/getOuterBindingIdentifiers.js b/tools/node_modules/eslint/node_modules/@babel/types/lib/retrievers/getOuterBindingIdentifiers.js
    index 42425626d7c49c..f51c47b5f89fea 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/types/lib/retrievers/getOuterBindingIdentifiers.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/types/lib/retrievers/getOuterBindingIdentifiers.js
    @@ -5,8 +5,7 @@ Object.defineProperty(exports, "__esModule", {
     });
     exports.default = void 0;
     var _getBindingIdentifiers = require("./getBindingIdentifiers.js");
    -var _default = getOuterBindingIdentifiers;
    -exports.default = _default;
    +var _default = exports.default = getOuterBindingIdentifiers;
     function getOuterBindingIdentifiers(node, duplicates) {
       return (0, _getBindingIdentifiers.default)(node, duplicates, true);
     }
    diff --git a/tools/node_modules/eslint/node_modules/@babel/types/lib/validators/react/isReactComponent.js b/tools/node_modules/eslint/node_modules/@babel/types/lib/validators/react/isReactComponent.js
    index 63f878a214767f..34b3467250c1e5 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/types/lib/validators/react/isReactComponent.js
    +++ b/tools/node_modules/eslint/node_modules/@babel/types/lib/validators/react/isReactComponent.js
    @@ -6,7 +6,6 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = void 0;
     var _buildMatchMemberExpression = require("../buildMatchMemberExpression.js");
     const isReactComponent = (0, _buildMatchMemberExpression.default)("React.Component");
    -var _default = isReactComponent;
    -exports.default = _default;
    +var _default = exports.default = isReactComponent;
     
     //# sourceMappingURL=isReactComponent.js.map
    diff --git a/tools/node_modules/eslint/node_modules/@babel/types/package.json b/tools/node_modules/eslint/node_modules/@babel/types/package.json
    index 4acb0bf1799da6..4badbc9335412c 100644
    --- a/tools/node_modules/eslint/node_modules/@babel/types/package.json
    +++ b/tools/node_modules/eslint/node_modules/@babel/types/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@babel/types",
    -  "version": "7.23.0",
    +  "version": "7.23.6",
       "description": "Babel Types is a Lodash-esque utility library for AST nodes",
       "author": "The Babel Team (https://babel.dev/team)",
       "homepage": "https://babel.dev/docs/en/next/babel-types",
    @@ -24,13 +24,13 @@
         }
       },
       "dependencies": {
    -    "@babel/helper-string-parser": "^7.22.5",
    +    "@babel/helper-string-parser": "^7.23.4",
         "@babel/helper-validator-identifier": "^7.22.20",
         "to-fast-properties": "^2.0.0"
       },
       "devDependencies": {
    -    "@babel/generator": "^7.23.0",
    -    "@babel/parser": "^7.23.0",
    +    "@babel/generator": "^7.23.6",
    +    "@babel/parser": "^7.23.6",
         "glob": "^7.2.0"
       },
       "engines": {
    diff --git a/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/dist/index.cjs.cjs b/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/dist/index.cjs.cjs
    index 94a1ead65b78cc..73c4d0734daabe 100644
    --- a/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/dist/index.cjs.cjs
    +++ b/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/dist/index.cjs.cjs
    @@ -258,6 +258,7 @@ const commentParserToESTree = (jsdoc, mode, {
             return;
           }
           const {
    +        // eslint-disable-next-line no-unused-vars -- Discarding
             end: ed,
             delimiter: de,
             postDelimiter: pd,
    @@ -472,11 +473,9 @@ function parseDescription(description) {
       // This could have been expressed in a single pattern,
       // but having two avoids a potentially exponential time regex.
     
    -  // eslint-disable-next-line prefer-regex-literals -- Need 'd' (indices) flag
       const prefixedTextPattern = new RegExp(/(?:\[(?[^\]]+)\])\{@(?[^}\s]+)\s?(?[^}\s|]*)\}/gu, 'gud');
       // The pattern used to match for text after tag uses a negative lookbehind
       // on the ']' char to avoid matching the prefixed case too.
    -  // eslint-disable-next-line prefer-regex-literals -- Need 'd' (indices) flag
       const suffixedAfterPattern = new RegExp(/(?[^}\s]+)\s?(?[^}\s|]*)\s*(?[\s|])?\s*(?[^}]*)\}/gu, 'gud');
       const matches = [...description.matchAll(prefixedTextPattern), ...description.matchAll(suffixedAfterPattern)];
       for (const mtch of matches) {
    @@ -913,6 +912,7 @@ const getReducedASTNode = function (node, sourceCode) {
      * @private
      */
     const findJSDocComment = (astNode, sourceCode, settings) => {
    +  var _parenthesisToken, _parenthesisToken2;
       const {
         minLines,
         maxLines
    @@ -921,6 +921,7 @@ const findJSDocComment = (astNode, sourceCode, settings) => {
       /** @type {import('eslint').Rule.Node|import('estree').Comment} */
       let currentNode = astNode;
       let tokenBefore = null;
    +  let parenthesisToken = null;
       while (currentNode) {
         const decorator = getDecorator(currentNode);
         if (decorator) {
    @@ -931,6 +932,7 @@ const findJSDocComment = (astNode, sourceCode, settings) => {
           includeComments: true
         });
         if (tokenBefore && tokenBefore.type === 'Punctuator' && tokenBefore.value === '(') {
    +      parenthesisToken = tokenBefore;
           [tokenBefore] = sourceCode.getTokensBefore(currentNode, {
             count: 2,
             includeComments: true
    @@ -950,7 +952,7 @@ const findJSDocComment = (astNode, sourceCode, settings) => {
       if (!tokenBefore || !currentNode.loc || !tokenBefore.loc) {
         return null;
       }
    -  if (tokenBefore.type === 'Block' && /^\*\s/u.test(tokenBefore.value) && currentNode.loc.start.line - tokenBefore.loc.end.line >= minLines && currentNode.loc.start.line - tokenBefore.loc.end.line <= maxLines) {
    +  if (tokenBefore.type === 'Block' && /^\*\s/u.test(tokenBefore.value) && currentNode.loc.start.line - ( /** @type {import('eslint').AST.Token} */(_parenthesisToken = parenthesisToken) !== null && _parenthesisToken !== void 0 ? _parenthesisToken : tokenBefore).loc.end.line >= minLines && currentNode.loc.start.line - ( /** @type {import('eslint').AST.Token} */(_parenthesisToken2 = parenthesisToken) !== null && _parenthesisToken2 !== void 0 ? _parenthesisToken2 : tokenBefore).loc.end.line <= maxLines) {
         return tokenBefore;
       }
       return null;
    diff --git a/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/package.json b/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/package.json
    index 97b61ec54c99ea..c38c09f992a210 100644
    --- a/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/package.json
    +++ b/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@es-joy/jsdoccomment",
    -  "version": "0.40.1",
    +  "version": "0.41.0",
       "author": "Brett Zamir ",
       "contributors": [],
       "description": "Maintained replacement for ESLint's deprecated SourceCode#getJSDocComment along with other jsdoc utilities",
    @@ -31,6 +31,18 @@
       "browserslist": [
         "cover 100%"
       ],
    +  "scripts": {
    +    "tsc": "tsc",
    +    "open": "open ./coverage/lcov-report/index.html",
    +    "prepublishOnly": "pnpm i && npm run build",
    +    "build": "npm run rollup && tsc -p tsconfig-prod.json",
    +    "rollup": "rollup -c",
    +    "eslint": "eslint --ext=js,cjs,md,html .",
    +    "lint": "npm run eslint --",
    +    "mocha": "mocha --require chai/register-expect.js",
    +    "c8": "c8 npm run mocha",
    +    "test": "npm run lint && npm run build && npm run c8"
    +  },
       "repository": {
         "type": "git",
         "url": "git+https://github.com/es-joy/jsdoccomment.git"
    @@ -43,56 +55,45 @@
         "node": ">=16"
       },
       "dependencies": {
    -    "comment-parser": "1.4.0",
    +    "comment-parser": "1.4.1",
         "esquery": "^1.5.0",
         "jsdoc-type-pratt-parser": "~4.0.0"
       },
       "devDependencies": {
    -    "@babel/core": "^7.22.9",
    +    "@babel/core": "^7.23.3",
         "@babel/plugin-syntax-class-properties": "^7.12.13",
    -    "@babel/preset-env": "^7.22.9",
    +    "@babel/preset-env": "^7.23.3",
         "@brettz9/eslint-plugin": "^1.0.4",
    -    "@rollup/plugin-babel": "^6.0.3",
    -    "@types/chai": "^4.3.5",
    -    "@types/eslint": "^8.44.1",
    -    "@types/esquery": "^1.5.0",
    -    "@types/estraverse": "^5.1.2",
    -    "@types/estree": "^1.0.1",
    -    "@types/mocha": "^10.0.1",
    -    "@typescript-eslint/types": "^6.2.1",
    +    "@rollup/plugin-babel": "^6.0.4",
    +    "@types/chai": "^4.3.10",
    +    "@types/eslint": "^8.44.7",
    +    "@types/esquery": "^1.5.3",
    +    "@types/estraverse": "^5.1.6",
    +    "@types/estree": "^1.0.5",
    +    "@types/mocha": "^10.0.4",
    +    "@typescript-eslint/types": "^6.10.0",
         "c8": "^8.0.1",
    -    "chai": "^4.3.7",
    -    "eslint": "^8.46.0",
    -    "eslint-config-ash-nazg": "34.15.0",
    +    "chai": "^4.3.10",
    +    "eslint": "^8.53.0",
    +    "eslint-config-ash-nazg": "35.1.0",
         "eslint-config-standard": "^17.1.0",
    -    "eslint-plugin-array-func": "^3.1.8",
    -    "eslint-plugin-compat": "^4.1.4",
    +    "eslint-plugin-array-func": "^4.0.0",
    +    "eslint-plugin-compat": "^4.2.0",
         "eslint-plugin-eslint-comments": "^3.2.0",
         "eslint-plugin-html": "^7.1.0",
    -    "eslint-plugin-import": "^2.28.0",
    -    "eslint-plugin-jsdoc": "^46.4.5",
    +    "eslint-plugin-import": "^2.29.0",
    +    "eslint-plugin-jsdoc": "^46.8.2",
         "eslint-plugin-markdown": "^3.0.1",
    -    "eslint-plugin-n": "^16.0.1",
    +    "eslint-plugin-n": "^16.3.0",
         "eslint-plugin-no-unsanitized": "^4.0.2",
         "eslint-plugin-no-use-extend-native": "^0.5.0",
         "eslint-plugin-promise": "^6.1.1",
    -    "eslint-plugin-sonarjs": "^0.20.0",
    -    "eslint-plugin-unicorn": "^48.0.1",
    +    "eslint-plugin-sonarjs": "^0.23.0",
    +    "eslint-plugin-unicorn": "^49.0.0",
         "espree": "^9.6.1",
         "estraverse": "^5.3.0",
         "mocha": "^10.2.0",
    -    "rollup": "^3.27.2",
    -    "typescript": "^5.1.6"
    -  },
    -  "scripts": {
    -    "tsc": "tsc",
    -    "open": "open ./coverage/lcov-report/index.html",
    -    "build": "npm run rollup && tsc -p tsconfig-prod.json",
    -    "rollup": "rollup -c",
    -    "eslint": "eslint --ext=js,cjs,md,html .",
    -    "lint": "npm run eslint --",
    -    "mocha": "mocha --require chai/register-expect.js",
    -    "c8": "c8 npm run mocha",
    -    "test": "npm run lint && npm run build && npm run c8"
    +    "rollup": "^4.3.0",
    +    "typescript": "^5.2.2"
       }
    -}
    \ No newline at end of file
    +}
    diff --git a/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/src/commentParserToESTree.js b/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/src/commentParserToESTree.js
    index e5c4a2f4a8f96c..53bb44cb56974f 100644
    --- a/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/src/commentParserToESTree.js
    +++ b/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/src/commentParserToESTree.js
    @@ -268,6 +268,7 @@ const commentParserToESTree = (jsdoc, mode, {
           }
     
           const {
    +        // eslint-disable-next-line no-unused-vars -- Discarding
             end: ed,
             delimiter: de,
             postDelimiter: pd,
    diff --git a/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/src/jsdoccomment.js b/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/src/jsdoccomment.js
    index 0aec40eaea45ba..b497e8c404f639 100644
    --- a/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/src/jsdoccomment.js
    +++ b/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/src/jsdoccomment.js
    @@ -286,6 +286,7 @@ const findJSDocComment = (astNode, sourceCode, settings) => {
       /** @type {import('eslint').Rule.Node|import('estree').Comment} */
       let currentNode = astNode;
       let tokenBefore = null;
    +  let parenthesisToken = null;
     
       while (currentNode) {
         const decorator = getDecorator(currentNode);
    @@ -300,6 +301,7 @@ const findJSDocComment = (astNode, sourceCode, settings) => {
           tokenBefore && tokenBefore.type === 'Punctuator' &&
           tokenBefore.value === '('
         ) {
    +      parenthesisToken = tokenBefore;
           [tokenBefore] = sourceCode.getTokensBefore(currentNode, {
             count: 2,
             includeComments: true
    @@ -323,8 +325,14 @@ const findJSDocComment = (astNode, sourceCode, settings) => {
       if (
         tokenBefore.type === 'Block' &&
         (/^\*\s/u).test(tokenBefore.value) &&
    -    currentNode.loc.start.line - tokenBefore.loc.end.line >= minLines &&
    -    currentNode.loc.start.line - tokenBefore.loc.end.line <= maxLines
    +    currentNode.loc.start.line - (
    +      /** @type {import('eslint').AST.Token} */
    +      (parenthesisToken ?? tokenBefore)
    +    ).loc.end.line >= minLines &&
    +    currentNode.loc.start.line - (
    +      /** @type {import('eslint').AST.Token} */
    +      (parenthesisToken ?? tokenBefore)
    +    ).loc.end.line <= maxLines
       ) {
         return tokenBefore;
       }
    diff --git a/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/src/parseInlineTags.js b/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/src/parseInlineTags.js
    index db374b65b150b7..45c2d985e25053 100644
    --- a/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/src/parseInlineTags.js
    +++ b/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/src/parseInlineTags.js
    @@ -39,11 +39,9 @@ function parseDescription (description) {
       // This could have been expressed in a single pattern,
       // but having two avoids a potentially exponential time regex.
     
    -  // eslint-disable-next-line prefer-regex-literals -- Need 'd' (indices) flag
       const prefixedTextPattern = new RegExp(/(?:\[(?[^\]]+)\])\{@(?[^}\s]+)\s?(?[^}\s|]*)\}/gu, 'gud');
       // The pattern used to match for text after tag uses a negative lookbehind
       // on the ']' char to avoid matching the prefixed case too.
    -  // eslint-disable-next-line prefer-regex-literals -- Need 'd' (indices) flag
       const suffixedAfterPattern = new RegExp(/(?[^}\s]+)\s?(?[^}\s|]*)\s*(?[\s|])?\s*(?[^}]*)\}/gu, 'gud');
     
       const matches = [
    diff --git a/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/tsconfig-prod.json b/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/tsconfig-prod.json
    index e082c2155f9745..67d3d18f4a09bd 100644
    --- a/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/tsconfig-prod.json
    +++ b/tools/node_modules/eslint/node_modules/@es-joy/jsdoccomment/tsconfig-prod.json
    @@ -11,8 +11,7 @@
         "declarationMap": true,
         "strict": true,
         "target": "es6",
    -    "outDir": "dist",
    -    "allowSyntheticDefaultImports": true
    +    "outDir": "dist"
       },
       "include": ["src/**/*.js"],
       "exclude": ["node_modules"]
    diff --git a/tools/node_modules/eslint/node_modules/@eslint-community/regexpp/index.js b/tools/node_modules/eslint/node_modules/@eslint-community/regexpp/index.js
    index 956ba7d82d3fbd..545dc08ab6cf83 100644
    --- a/tools/node_modules/eslint/node_modules/@eslint-community/regexpp/index.js
    +++ b/tools/node_modules/eslint/node_modules/@eslint-community/regexpp/index.js
    @@ -364,23 +364,26 @@ class Reader {
     }
     
     class RegExpSyntaxError extends SyntaxError {
    -    constructor(srcCtx, flags, index, message) {
    -        let source = "";
    -        if (srcCtx.kind === "literal") {
    -            const literal = srcCtx.source.slice(srcCtx.start, srcCtx.end);
    -            if (literal) {
    -                source = `: ${literal}`;
    -            }
    -        }
    -        else if (srcCtx.kind === "pattern") {
    -            const pattern = srcCtx.source.slice(srcCtx.start, srcCtx.end);
    -            const flagsText = `${flags.unicode ? "u" : ""}${flags.unicodeSets ? "v" : ""}`;
    -            source = `: /${pattern}/${flagsText}`;
    -        }
    -        super(`Invalid regular expression${source}: ${message}`);
    +    constructor(message, index) {
    +        super(message);
             this.index = index;
         }
     }
    +function newRegExpSyntaxError(srcCtx, flags, index, message) {
    +    let source = "";
    +    if (srcCtx.kind === "literal") {
    +        const literal = srcCtx.source.slice(srcCtx.start, srcCtx.end);
    +        if (literal) {
    +            source = `: ${literal}`;
    +        }
    +    }
    +    else if (srcCtx.kind === "pattern") {
    +        const pattern = srcCtx.source.slice(srcCtx.start, srcCtx.end);
    +        const flagsText = `${flags.unicode ? "u" : ""}${flags.unicodeSets ? "v" : ""}`;
    +        source = `: /${pattern}/${flagsText}`;
    +    }
    +    return new RegExpSyntaxError(`Invalid regular expression${source}: ${message}`, index);
    +}
     
     const SYNTAX_CHARACTER = new Set([
         CIRCUMFLEX_ACCENT,
    @@ -833,7 +836,7 @@ class RegExpValidator {
         }
         raise(message, context) {
             var _a, _b, _c;
    -        throw new RegExpSyntaxError(this._srcCtx, {
    +        throw newRegExpSyntaxError(this._srcCtx, {
                 unicode: (_a = context === null || context === void 0 ? void 0 : context.unicode) !== null && _a !== void 0 ? _a : (this._unicodeMode && !this._unicodeSetsMode),
                 unicodeSets: (_b = context === null || context === void 0 ? void 0 : context.unicodeSets) !== null && _b !== void 0 ? _b : this._unicodeSetsMode,
             }, (_c = context === null || context === void 0 ? void 0 : context.index) !== null && _c !== void 0 ? _c : this.index, message);
    @@ -2736,6 +2739,7 @@ function visitRegExpAST(node, handlers) {
     
     exports.AST = ast;
     exports.RegExpParser = RegExpParser;
    +exports.RegExpSyntaxError = RegExpSyntaxError;
     exports.RegExpValidator = RegExpValidator;
     exports.parseRegExpLiteral = parseRegExpLiteral;
     exports.validateRegExpLiteral = validateRegExpLiteral;
    diff --git a/tools/node_modules/eslint/node_modules/@eslint-community/regexpp/index.mjs b/tools/node_modules/eslint/node_modules/@eslint-community/regexpp/index.mjs
    index 1f4adaff89e0d5..75510d89abc1e9 100644
    --- a/tools/node_modules/eslint/node_modules/@eslint-community/regexpp/index.mjs
    +++ b/tools/node_modules/eslint/node_modules/@eslint-community/regexpp/index.mjs
    @@ -360,23 +360,26 @@ class Reader {
     }
     
     class RegExpSyntaxError extends SyntaxError {
    -    constructor(srcCtx, flags, index, message) {
    -        let source = "";
    -        if (srcCtx.kind === "literal") {
    -            const literal = srcCtx.source.slice(srcCtx.start, srcCtx.end);
    -            if (literal) {
    -                source = `: ${literal}`;
    -            }
    -        }
    -        else if (srcCtx.kind === "pattern") {
    -            const pattern = srcCtx.source.slice(srcCtx.start, srcCtx.end);
    -            const flagsText = `${flags.unicode ? "u" : ""}${flags.unicodeSets ? "v" : ""}`;
    -            source = `: /${pattern}/${flagsText}`;
    -        }
    -        super(`Invalid regular expression${source}: ${message}`);
    +    constructor(message, index) {
    +        super(message);
             this.index = index;
         }
     }
    +function newRegExpSyntaxError(srcCtx, flags, index, message) {
    +    let source = "";
    +    if (srcCtx.kind === "literal") {
    +        const literal = srcCtx.source.slice(srcCtx.start, srcCtx.end);
    +        if (literal) {
    +            source = `: ${literal}`;
    +        }
    +    }
    +    else if (srcCtx.kind === "pattern") {
    +        const pattern = srcCtx.source.slice(srcCtx.start, srcCtx.end);
    +        const flagsText = `${flags.unicode ? "u" : ""}${flags.unicodeSets ? "v" : ""}`;
    +        source = `: /${pattern}/${flagsText}`;
    +    }
    +    return new RegExpSyntaxError(`Invalid regular expression${source}: ${message}`, index);
    +}
     
     const SYNTAX_CHARACTER = new Set([
         CIRCUMFLEX_ACCENT,
    @@ -829,7 +832,7 @@ class RegExpValidator {
         }
         raise(message, context) {
             var _a, _b, _c;
    -        throw new RegExpSyntaxError(this._srcCtx, {
    +        throw newRegExpSyntaxError(this._srcCtx, {
                 unicode: (_a = context === null || context === void 0 ? void 0 : context.unicode) !== null && _a !== void 0 ? _a : (this._unicodeMode && !this._unicodeSetsMode),
                 unicodeSets: (_b = context === null || context === void 0 ? void 0 : context.unicodeSets) !== null && _b !== void 0 ? _b : this._unicodeSetsMode,
             }, (_c = context === null || context === void 0 ? void 0 : context.index) !== null && _c !== void 0 ? _c : this.index, message);
    @@ -2730,5 +2733,5 @@ function visitRegExpAST(node, handlers) {
         new RegExpVisitor(handlers).visit(node);
     }
     
    -export { ast as AST, RegExpParser, RegExpValidator, parseRegExpLiteral, validateRegExpLiteral, visitRegExpAST };
    +export { ast as AST, RegExpParser, RegExpSyntaxError, RegExpValidator, parseRegExpLiteral, validateRegExpLiteral, visitRegExpAST };
     //# sourceMappingURL=index.mjs.map
    diff --git a/tools/node_modules/eslint/node_modules/@eslint-community/regexpp/package.json b/tools/node_modules/eslint/node_modules/@eslint-community/regexpp/package.json
    index 5248576e747638..4544508aa8e00d 100644
    --- a/tools/node_modules/eslint/node_modules/@eslint-community/regexpp/package.json
    +++ b/tools/node_modules/eslint/node_modules/@eslint-community/regexpp/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@eslint-community/regexpp",
    -  "version": "4.9.1",
    +  "version": "4.10.0",
       "description": "Regular expression parser for ECMAScript.",
       "keywords": [
         "regexp",
    diff --git a/tools/node_modules/eslint/node_modules/@eslint/eslintrc/dist/eslintrc.cjs b/tools/node_modules/eslint/node_modules/@eslint/eslintrc/dist/eslintrc.cjs
    index 9902a90e7ee453..eb2ed8d37ffef4 100644
    --- a/tools/node_modules/eslint/node_modules/@eslint/eslintrc/dist/eslintrc.cjs
    +++ b/tools/node_modules/eslint/node_modules/@eslint/eslintrc/dist/eslintrc.cjs
    @@ -941,6 +941,7 @@ class ConfigDependency {
          * Initialize this instance.
          * @param {Object} data The dependency data.
          * @param {T} [data.definition] The dependency if the loading succeeded.
    +     * @param {T} [data.original] The original, non-normalized dependency if the loading succeeded.
          * @param {Error} [data.error] The error object if the loading failed.
          * @param {string} [data.filePath] The actual path to the dependency if the loading succeeded.
          * @param {string} data.id The ID of this dependency.
    @@ -949,6 +950,7 @@ class ConfigDependency {
          */
         constructor({
             definition = null,
    +        original = null,
             error = null,
             filePath = null,
             id,
    @@ -962,6 +964,12 @@ class ConfigDependency {
              */
             this.definition = definition;
     
    +        /**
    +         * The original dependency as loaded directly from disk if the loading succeeded.
    +         * @type {T|null}
    +         */
    +        this.original = original;
    +
             /**
              * The error object if the loading failed.
              * @type {Error|null}
    @@ -1014,7 +1022,8 @@ class ConfigDependency {
          */
         [util__default["default"].inspect.custom]() {
             const {
    -            definition: _ignore, // eslint-disable-line no-unused-vars
    +            definition: _ignore1, // eslint-disable-line no-unused-vars
    +            original: _ignore2, // eslint-disable-line no-unused-vars
                 ...obj
             } = this;
     
    @@ -3390,6 +3399,7 @@ class ConfigArrayFactory {
             if (plugin) {
                 return new ConfigDependency({
                     definition: normalizePlugin(plugin),
    +                original: plugin,
                     filePath: "", // It's unknown where the plugin came from.
                     id,
                     importerName: ctx.name,
    @@ -3426,6 +3436,7 @@ class ConfigArrayFactory {
     
                     return new ConfigDependency({
                         definition: normalizePlugin(pluginDefinition),
    +                    original: pluginDefinition,
                         filePath,
                         id,
                         importerName: ctx.name,
    @@ -4117,7 +4128,7 @@ function translateESLintRC(eslintrcConfig, {
                 debug(`Translating plugin: ${pluginName}`);
                 debug(`Resolving plugin '${pluginName} relative to ${resolvePluginsRelativeTo}`);
     
    -            const { definition: plugin, error } = eslintrcConfig.plugins[pluginName];
    +            const { original: plugin, error } = eslintrcConfig.plugins[pluginName];
     
                 if (error) {
                     throw error;
    diff --git a/tools/node_modules/eslint/node_modules/@eslint/eslintrc/lib/config-array-factory.js b/tools/node_modules/eslint/node_modules/@eslint/eslintrc/lib/config-array-factory.js
    index 99851e15f9d791..58c1e808beb94c 100644
    --- a/tools/node_modules/eslint/node_modules/@eslint/eslintrc/lib/config-array-factory.js
    +++ b/tools/node_modules/eslint/node_modules/@eslint/eslintrc/lib/config-array-factory.js
    @@ -1053,6 +1053,7 @@ class ConfigArrayFactory {
             if (plugin) {
                 return new ConfigDependency({
                     definition: normalizePlugin(plugin),
    +                original: plugin,
                     filePath: "", // It's unknown where the plugin came from.
                     id,
                     importerName: ctx.name,
    @@ -1089,6 +1090,7 @@ class ConfigArrayFactory {
     
                     return new ConfigDependency({
                         definition: normalizePlugin(pluginDefinition),
    +                    original: pluginDefinition,
                         filePath,
                         id,
                         importerName: ctx.name,
    diff --git a/tools/node_modules/eslint/node_modules/@eslint/eslintrc/lib/config-array/config-dependency.js b/tools/node_modules/eslint/node_modules/@eslint/eslintrc/lib/config-array/config-dependency.js
    index 2883c3a2a703d6..080e6405e9ba2c 100644
    --- a/tools/node_modules/eslint/node_modules/@eslint/eslintrc/lib/config-array/config-dependency.js
    +++ b/tools/node_modules/eslint/node_modules/@eslint/eslintrc/lib/config-array/config-dependency.js
    @@ -28,6 +28,7 @@ class ConfigDependency {
          * Initialize this instance.
          * @param {Object} data The dependency data.
          * @param {T} [data.definition] The dependency if the loading succeeded.
    +     * @param {T} [data.original] The original, non-normalized dependency if the loading succeeded.
          * @param {Error} [data.error] The error object if the loading failed.
          * @param {string} [data.filePath] The actual path to the dependency if the loading succeeded.
          * @param {string} data.id The ID of this dependency.
    @@ -36,6 +37,7 @@ class ConfigDependency {
          */
         constructor({
             definition = null,
    +        original = null,
             error = null,
             filePath = null,
             id,
    @@ -49,6 +51,12 @@ class ConfigDependency {
              */
             this.definition = definition;
     
    +        /**
    +         * The original dependency as loaded directly from disk if the loading succeeded.
    +         * @type {T|null}
    +         */
    +        this.original = original;
    +
             /**
              * The error object if the loading failed.
              * @type {Error|null}
    @@ -101,7 +109,8 @@ class ConfigDependency {
          */
         [util.inspect.custom]() {
             const {
    -            definition: _ignore, // eslint-disable-line no-unused-vars
    +            definition: _ignore1, // eslint-disable-line no-unused-vars
    +            original: _ignore2, // eslint-disable-line no-unused-vars
                 ...obj
             } = this;
     
    diff --git a/tools/node_modules/eslint/node_modules/@eslint/eslintrc/lib/flat-compat.js b/tools/node_modules/eslint/node_modules/@eslint/eslintrc/lib/flat-compat.js
    index e0d7ab6699b549..6c307a99246ae0 100644
    --- a/tools/node_modules/eslint/node_modules/@eslint/eslintrc/lib/flat-compat.js
    +++ b/tools/node_modules/eslint/node_modules/@eslint/eslintrc/lib/flat-compat.js
    @@ -132,7 +132,7 @@ function translateESLintRC(eslintrcConfig, {
                 debug(`Translating plugin: ${pluginName}`);
                 debug(`Resolving plugin '${pluginName} relative to ${resolvePluginsRelativeTo}`);
     
    -            const { definition: plugin, error } = eslintrcConfig.plugins[pluginName];
    +            const { original: plugin, error } = eslintrcConfig.plugins[pluginName];
     
                 if (error) {
                     throw error;
    diff --git a/tools/node_modules/eslint/node_modules/@eslint/eslintrc/package.json b/tools/node_modules/eslint/node_modules/@eslint/eslintrc/package.json
    index 4af0405864de9c..aa43e7563bb912 100644
    --- a/tools/node_modules/eslint/node_modules/@eslint/eslintrc/package.json
    +++ b/tools/node_modules/eslint/node_modules/@eslint/eslintrc/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@eslint/eslintrc",
    -  "version": "2.1.2",
    +  "version": "2.1.4",
       "description": "The legacy ESLintRC config file format for ESLint",
       "type": "module",
       "main": "./dist/eslintrc.cjs",
    diff --git a/tools/node_modules/eslint/node_modules/@eslint/js/package.json b/tools/node_modules/eslint/node_modules/@eslint/js/package.json
    index 7e43db7f2e9a7e..8dde9da4c4ad0a 100644
    --- a/tools/node_modules/eslint/node_modules/@eslint/js/package.json
    +++ b/tools/node_modules/eslint/node_modules/@eslint/js/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@eslint/js",
    -  "version": "8.51.0",
    +  "version": "8.56.0",
       "description": "ESLint JavaScript language implementation",
       "main": "./src/index.js",
       "scripts": {},
    diff --git a/tools/node_modules/eslint/node_modules/@eslint/js/src/configs/eslint-all.js b/tools/node_modules/eslint/node_modules/@eslint/js/src/configs/eslint-all.js
    index 52f580035a8598..f2f7a664af6cf3 100644
    --- a/tools/node_modules/eslint/node_modules/@eslint/js/src/configs/eslint-all.js
    +++ b/tools/node_modules/eslint/node_modules/@eslint/js/src/configs/eslint-all.js
    @@ -9,24 +9,13 @@
     module.exports = Object.freeze({
         "rules": {
             "accessor-pairs": "error",
    -        "array-bracket-newline": "error",
    -        "array-bracket-spacing": "error",
             "array-callback-return": "error",
    -        "array-element-newline": "error",
             "arrow-body-style": "error",
    -        "arrow-parens": "error",
    -        "arrow-spacing": "error",
             "block-scoped-var": "error",
    -        "block-spacing": "error",
    -        "brace-style": "error",
             "camelcase": "error",
             "capitalized-comments": "error",
             "class-methods-use-this": "error",
    -        "comma-dangle": "error",
    -        "comma-spacing": "error",
    -        "comma-style": "error",
             "complexity": "error",
    -        "computed-property-spacing": "error",
             "consistent-return": "error",
             "consistent-this": "error",
             "constructor-super": "error",
    @@ -34,49 +23,30 @@ module.exports = Object.freeze({
             "default-case": "error",
             "default-case-last": "error",
             "default-param-last": "error",
    -        "dot-location": "error",
             "dot-notation": "error",
    -        "eol-last": "error",
             "eqeqeq": "error",
             "for-direction": "error",
    -        "func-call-spacing": "error",
             "func-name-matching": "error",
             "func-names": "error",
             "func-style": "error",
    -        "function-call-argument-newline": "error",
    -        "function-paren-newline": "error",
    -        "generator-star-spacing": "error",
             "getter-return": "error",
             "grouped-accessor-pairs": "error",
             "guard-for-in": "error",
             "id-denylist": "error",
             "id-length": "error",
             "id-match": "error",
    -        "implicit-arrow-linebreak": "error",
    -        "indent": "error",
             "init-declarations": "error",
    -        "jsx-quotes": "error",
    -        "key-spacing": "error",
    -        "keyword-spacing": "error",
             "line-comment-position": "error",
    -        "linebreak-style": "error",
    -        "lines-around-comment": "error",
    -        "lines-between-class-members": "error",
             "logical-assignment-operators": "error",
             "max-classes-per-file": "error",
             "max-depth": "error",
    -        "max-len": "error",
             "max-lines": "error",
             "max-lines-per-function": "error",
             "max-nested-callbacks": "error",
             "max-params": "error",
             "max-statements": "error",
    -        "max-statements-per-line": "error",
             "multiline-comment-style": "error",
    -        "multiline-ternary": "error",
             "new-cap": "error",
    -        "new-parens": "error",
    -        "newline-per-chained-call": "error",
             "no-alert": "error",
             "no-array-constructor": "error",
             "no-async-promise-executor": "error",
    @@ -87,7 +57,6 @@ module.exports = Object.freeze({
             "no-class-assign": "error",
             "no-compare-neg-zero": "error",
             "no-cond-assign": "error",
    -        "no-confusing-arrow": "error",
             "no-console": "error",
             "no-const-assign": "error",
             "no-constant-binary-expression": "error",
    @@ -117,10 +86,7 @@ module.exports = Object.freeze({
             "no-extra-bind": "error",
             "no-extra-boolean-cast": "error",
             "no-extra-label": "error",
    -        "no-extra-parens": "error",
    -        "no-extra-semi": "error",
             "no-fallthrough": "error",
    -        "no-floating-decimal": "error",
             "no-func-assign": "error",
             "no-global-assign": "error",
             "no-implicit-coercion": "error",
    @@ -141,12 +107,8 @@ module.exports = Object.freeze({
             "no-loss-of-precision": "error",
             "no-magic-numbers": "error",
             "no-misleading-character-class": "error",
    -        "no-mixed-operators": "error",
    -        "no-mixed-spaces-and-tabs": "error",
             "no-multi-assign": "error",
    -        "no-multi-spaces": "error",
             "no-multi-str": "error",
    -        "no-multiple-empty-lines": "error",
             "no-negated-condition": "error",
             "no-nested-ternary": "error",
             "no-new": "error",
    @@ -180,12 +142,10 @@ module.exports = Object.freeze({
             "no-shadow": "error",
             "no-shadow-restricted-names": "error",
             "no-sparse-arrays": "error",
    -        "no-tabs": "error",
             "no-template-curly-in-string": "error",
             "no-ternary": "error",
             "no-this-before-super": "error",
             "no-throw-literal": "error",
    -        "no-trailing-spaces": "error",
             "no-undef": "error",
             "no-undef-init": "error",
             "no-undefined": "error",
    @@ -215,19 +175,10 @@ module.exports = Object.freeze({
             "no-var": "error",
             "no-void": "error",
             "no-warning-comments": "error",
    -        "no-whitespace-before-property": "error",
             "no-with": "error",
    -        "nonblock-statement-body-position": "error",
    -        "object-curly-newline": "error",
    -        "object-curly-spacing": "error",
    -        "object-property-newline": "error",
             "object-shorthand": "error",
             "one-var": "error",
    -        "one-var-declaration-per-line": "error",
             "operator-assignment": "error",
    -        "operator-linebreak": "error",
    -        "padded-blocks": "error",
    -        "padding-line-between-statements": "error",
             "prefer-arrow-callback": "error",
             "prefer-const": "error",
             "prefer-destructuring": "error",
    @@ -241,38 +192,20 @@ module.exports = Object.freeze({
             "prefer-rest-params": "error",
             "prefer-spread": "error",
             "prefer-template": "error",
    -        "quote-props": "error",
    -        "quotes": "error",
             "radix": "error",
             "require-atomic-updates": "error",
             "require-await": "error",
             "require-unicode-regexp": "error",
             "require-yield": "error",
    -        "rest-spread-spacing": "error",
    -        "semi": "error",
    -        "semi-spacing": "error",
    -        "semi-style": "error",
             "sort-imports": "error",
             "sort-keys": "error",
             "sort-vars": "error",
    -        "space-before-blocks": "error",
    -        "space-before-function-paren": "error",
    -        "space-in-parens": "error",
    -        "space-infix-ops": "error",
    -        "space-unary-ops": "error",
    -        "spaced-comment": "error",
             "strict": "error",
    -        "switch-colon-spacing": "error",
             "symbol-description": "error",
    -        "template-curly-spacing": "error",
    -        "template-tag-spacing": "error",
             "unicode-bom": "error",
             "use-isnan": "error",
             "valid-typeof": "error",
             "vars-on-top": "error",
    -        "wrap-iife": "error",
    -        "wrap-regex": "error",
    -        "yield-star-spacing": "error",
             "yoda": "error"
         }
     });
    diff --git a/tools/node_modules/eslint/node_modules/@humanwhocodes/config-array/api.js b/tools/node_modules/eslint/node_modules/@humanwhocodes/config-array/api.js
    index be79888f294fc3..46a97f7c3ce191 100644
    --- a/tools/node_modules/eslint/node_modules/@humanwhocodes/config-array/api.js
    +++ b/tools/node_modules/eslint/node_modules/@humanwhocodes/config-array/api.js
    @@ -825,12 +825,12 @@ class ConfigArray extends Array {
     		const cache = this[ConfigArraySymbol.configCache];
     
     		// first check the cache for a filename match to avoid duplicate work
    -		let finalConfig = cache.get(filePath);
    -
    -		if (finalConfig) {
    -			return finalConfig;
    +		if (cache.has(filePath)) {
    +			return cache.get(filePath);
     		}
     
    +		let finalConfig;
    +
     		// next check to see if the file should be ignored
     
     		// check if this should be ignored due to its directory
    diff --git a/tools/node_modules/eslint/node_modules/@humanwhocodes/config-array/package.json b/tools/node_modules/eslint/node_modules/@humanwhocodes/config-array/package.json
    index 09eaeaafe9867a..8dd565f9aefe34 100644
    --- a/tools/node_modules/eslint/node_modules/@humanwhocodes/config-array/package.json
    +++ b/tools/node_modules/eslint/node_modules/@humanwhocodes/config-array/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@humanwhocodes/config-array",
    -  "version": "0.11.11",
    +  "version": "0.11.13",
       "description": "Glob-based configuration matching.",
       "author": "Nicholas C. Zakas",
       "main": "api.js",
    @@ -42,19 +42,19 @@
         "node": ">=10.10.0"
       },
       "dependencies": {
    -    "@humanwhocodes/object-schema": "^1.2.1",
    +    "@humanwhocodes/object-schema": "^2.0.1",
         "debug": "^4.1.1",
         "minimatch": "^3.0.5"
       },
       "devDependencies": {
         "@nitpik/javascript": "0.4.0",
         "@nitpik/node": "0.0.5",
    -    "chai": "4.3.8",
    -    "eslint": "8.41.0",
    +    "chai": "4.3.10",
    +    "eslint": "8.51.0",
         "esm": "3.2.25",
    -    "lint-staged": "14.0.1",
    +    "lint-staged": "15.0.2",
         "mocha": "6.2.3",
    -    "nyc": "14.1.1",
    +    "nyc": "15.1.0",
         "rollup": "3.28.1",
         "yorkie": "2.0.0"
       }
    diff --git a/tools/node_modules/eslint/node_modules/@humanwhocodes/object-schema/package.json b/tools/node_modules/eslint/node_modules/@humanwhocodes/object-schema/package.json
    index 9fc90bf3f9dd61..b13f6ee9a2ed78 100644
    --- a/tools/node_modules/eslint/node_modules/@humanwhocodes/object-schema/package.json
    +++ b/tools/node_modules/eslint/node_modules/@humanwhocodes/object-schema/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@humanwhocodes/object-schema",
    -  "version": "1.2.1",
    +  "version": "2.0.1",
       "description": "An object schema merger/validator",
       "main": "src/index.js",
       "directories": {
    diff --git a/tools/node_modules/eslint/node_modules/@humanwhocodes/object-schema/src/object-schema.js b/tools/node_modules/eslint/node_modules/@humanwhocodes/object-schema/src/object-schema.js
    index b663236539a668..1d9da196ba966e 100644
    --- a/tools/node_modules/eslint/node_modules/@humanwhocodes/object-schema/src/object-schema.js
    +++ b/tools/node_modules/eslint/node_modules/@humanwhocodes/object-schema/src/object-schema.js
    @@ -62,9 +62,77 @@ function validateDefinition(name, strategy) {
         }
     }
     
    +//-----------------------------------------------------------------------------
    +// Errors
    +//-----------------------------------------------------------------------------
    +
    +/**
    + * Error when an unexpected key is found.
    + */
    +class UnexpectedKeyError extends Error {
    +
    +    /**
    +     * Creates a new instance.
    +     * @param {string} key The key that was unexpected. 
    +     */
    +    constructor(key) {
    +        super(`Unexpected key "${key}" found.`);
    +    }
    +}
    +
    +/**
    + * Error when a required key is missing.
    + */
    +class MissingKeyError extends Error {
    +
    +    /**
    +     * Creates a new instance.
    +     * @param {string} key The key that was missing. 
    +     */
    +    constructor(key) {
    +        super(`Missing required key "${key}".`);
    +    }
    +}
    +
    +/**
    + * Error when a key requires other keys that are missing.
    + */
    +class MissingDependentKeysError extends Error {
    +
    +    /**
    +     * Creates a new instance.
    +     * @param {string} key The key that was unexpected.
    +     * @param {Array} requiredKeys The keys that are required.
    +     */
    +    constructor(key, requiredKeys) {
    +        super(`Key "${key}" requires keys "${requiredKeys.join("\", \"")}".`);
    +    }
    +}
    +
    +/**
    + * Wrapper error for errors occuring during a merge or validate operation.
    + */
    +class WrapperError {
    +
    +    /**
    +     * Creates a new instance.
    +     * @param {string} key The object key causing the error. 
    +     * @param {Error} source The source error. 
    +     */
    +    constructor(key, source) {
    +        return Object.create(source, {
    +            message: {
    +                value: `Key "${key}": ` + source.message,
    +                configurable: true,
    +                writable: true,
    +                enumerable: true
    +            }
    +        });
    +    }
    +}
     
     //-----------------------------------------------------------------------------
    -// Class
    +// Main
     //-----------------------------------------------------------------------------
     
     /**
    @@ -159,11 +227,11 @@ class ObjectSchema {
     
             // double check arguments
             if (objects.length < 2) {
    -            throw new Error("merge() requires at least two arguments.");
    +            throw new TypeError("merge() requires at least two arguments.");
             }
     
             if (objects.some(object => (object == null || typeof object !== "object"))) {
    -            throw new Error("All arguments must be objects.");
    +            throw new TypeError("All arguments must be objects.");
             }
     
             return objects.reduce((result, object) => {
    @@ -179,8 +247,7 @@ class ObjectSchema {
                             }
                         }
                     } catch (ex) {
    -                    ex.message = `Key "${key}": ` + ex.message;
    -                    throw ex;
    +                    throw new WrapperError(key, ex);
                     }
                 }
                 return result;
    @@ -200,7 +267,7 @@ class ObjectSchema {
     
                 // check to see if the key is defined
                 if (!this.hasKey(key)) {
    -                throw new Error(`Unexpected key "${key}" found.`);
    +                throw new UnexpectedKeyError(key);
                 }
     
                 // validate existing keys
    @@ -209,7 +276,7 @@ class ObjectSchema {
                 // first check to see if any other keys are required
                 if (Array.isArray(strategy.requires)) {
                     if (!strategy.requires.every(otherKey => otherKey in object)) {
    -                    throw new Error(`Key "${key}" requires keys "${strategy.requires.join("\", \"")}".`);
    +                    throw new MissingDependentKeysError(key, strategy.requires);
                     }
                 }
     
    @@ -217,15 +284,14 @@ class ObjectSchema {
                 try {
                     strategy.validate.call(strategy, object[key]);
                 } catch (ex) {
    -                ex.message = `Key "${key}": ` + ex.message;
    -                throw ex;
    +                throw new WrapperError(key, ex);
                 }
             }
     
             // ensure required keys aren't missing
             for (const [key] of this[requiredKeys]) {
                 if (!(key in object)) {
    -                throw new Error(`Missing required key "${key}".`);
    +                throw new MissingKeyError(key);
                 }
             }
     
    diff --git a/tools/node_modules/eslint/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs b/tools/node_modules/eslint/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs
    index 917a3303abdccd..d3c1a7aca4b23b 100644
    --- a/tools/node_modules/eslint/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs
    +++ b/tools/node_modules/eslint/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs
    @@ -349,7 +349,7 @@ class TraceMap {
             const { version, file, names, sourceRoot, sources, sourcesContent } = parsed;
             this.version = version;
             this.file = file;
    -        this.names = names;
    +        this.names = names || [];
             this.sourceRoot = sourceRoot;
             this.sources = sources;
             this.sourcesContent = sourcesContent;
    diff --git a/tools/node_modules/eslint/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js b/tools/node_modules/eslint/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js
    index a3251f166baed7..8b67ffb949e527 100644
    --- a/tools/node_modules/eslint/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js
    +++ b/tools/node_modules/eslint/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js
    @@ -356,7 +356,7 @@
                 const { version, file, names, sourceRoot, sources, sourcesContent } = parsed;
                 this.version = version;
                 this.file = file;
    -            this.names = names;
    +            this.names = names || [];
                 this.sourceRoot = sourceRoot;
                 this.sources = sources;
                 this.sourcesContent = sourcesContent;
    diff --git a/tools/node_modules/eslint/node_modules/@jridgewell/trace-mapping/package.json b/tools/node_modules/eslint/node_modules/@jridgewell/trace-mapping/package.json
    index 7280d758b02ee2..c06194565a57a4 100644
    --- a/tools/node_modules/eslint/node_modules/@jridgewell/trace-mapping/package.json
    +++ b/tools/node_modules/eslint/node_modules/@jridgewell/trace-mapping/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "@jridgewell/trace-mapping",
    -  "version": "0.3.19",
    +  "version": "0.3.20",
       "description": "Trace the original position through a source map",
       "keywords": [
         "source",
    diff --git a/tools/node_modules/eslint/node_modules/@types/mdast/package.json b/tools/node_modules/eslint/node_modules/@types/mdast/package.json
    index 81452e9484730e..89b4c99fb2c643 100644
    --- a/tools/node_modules/eslint/node_modules/@types/mdast/package.json
    +++ b/tools/node_modules/eslint/node_modules/@types/mdast/package.json
    @@ -1,29 +1,29 @@
     {
         "name": "@types/mdast",
    -    "version": "3.0.13",
    -    "description": "TypeScript definitions for Mdast",
    +    "version": "3.0.15",
    +    "description": "TypeScript definitions for mdast",
         "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/mdast",
         "license": "MIT",
         "contributors": [
             {
                 "name": "Christian Murphy",
    -            "url": "https://github.com/ChristianMurphy",
    -            "githubUsername": "ChristianMurphy"
    +            "githubUsername": "ChristianMurphy",
    +            "url": "https://github.com/ChristianMurphy"
             },
             {
                 "name": "Jun Lu",
    -            "url": "https://github.com/lujun2",
    -            "githubUsername": "lujun2"
    +            "githubUsername": "lujun2",
    +            "url": "https://github.com/lujun2"
             },
             {
                 "name": "Remco Haszing",
    -            "url": "https://github.com/remcohaszing",
    -            "githubUsername": "remcohaszing"
    +            "githubUsername": "remcohaszing",
    +            "url": "https://github.com/remcohaszing"
             },
             {
                 "name": "Titus Wormer",
    -            "url": "https://github.com/wooorm",
    -            "githubUsername": "wooorm"
    +            "githubUsername": "wooorm",
    +            "url": "https://github.com/wooorm"
             }
         ],
         "main": "",
    @@ -37,6 +37,6 @@
         "dependencies": {
             "@types/unist": "^2"
         },
    -    "typesPublisherContentHash": "4f7e7836da8059c1699be808ec47184aefe23f7e21adb87b32171a0cd60e111c",
    +    "typesPublisherContentHash": "856cf2bf5ad8e053a42747d48af6b089fac3bd7f568451deb8053f84dfac225d",
         "typeScriptVersion": "4.5"
     }
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/@types/unist/LICENSE b/tools/node_modules/eslint/node_modules/@types/unist/LICENSE
    old mode 100755
    new mode 100644
    diff --git a/tools/node_modules/eslint/node_modules/@types/unist/package.json b/tools/node_modules/eslint/node_modules/@types/unist/package.json
    old mode 100755
    new mode 100644
    index 46aa74fe67ea69..eff0fce8f6b8cd
    --- a/tools/node_modules/eslint/node_modules/@types/unist/package.json
    +++ b/tools/node_modules/eslint/node_modules/@types/unist/package.json
    @@ -1,44 +1,44 @@
     {
         "name": "@types/unist",
    -    "version": "2.0.8",
    -    "description": "TypeScript definitions for Unist",
    +    "version": "2.0.10",
    +    "description": "TypeScript definitions for unist",
         "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/unist",
         "license": "MIT",
         "contributors": [
             {
                 "name": "bizen241",
    -            "url": "https://github.com/bizen241",
    -            "githubUsername": "bizen241"
    +            "githubUsername": "bizen241",
    +            "url": "https://github.com/bizen241"
             },
             {
                 "name": "Jun Lu",
    -            "url": "https://github.com/lujun2",
    -            "githubUsername": "lujun2"
    +            "githubUsername": "lujun2",
    +            "url": "https://github.com/lujun2"
             },
             {
                 "name": "Hernan Rajchert",
    -            "url": "https://github.com/hrajchert",
    -            "githubUsername": "hrajchert"
    +            "githubUsername": "hrajchert",
    +            "url": "https://github.com/hrajchert"
             },
             {
                 "name": "Titus Wormer",
    -            "url": "https://github.com/wooorm",
    -            "githubUsername": "wooorm"
    +            "githubUsername": "wooorm",
    +            "url": "https://github.com/wooorm"
             },
             {
                 "name": "Junyoung Choi",
    -            "url": "https://github.com/rokt33r",
    -            "githubUsername": "rokt33r"
    +            "githubUsername": "rokt33r",
    +            "url": "https://github.com/rokt33r"
             },
             {
                 "name": "Ben Moon",
    -            "url": "https://github.com/GuiltyDolphin",
    -            "githubUsername": "GuiltyDolphin"
    +            "githubUsername": "GuiltyDolphin",
    +            "url": "https://github.com/GuiltyDolphin"
             },
             {
                 "name": "JounQin",
    -            "url": "https://github.com/JounQin",
    -            "githubUsername": "JounQin"
    +            "githubUsername": "JounQin",
    +            "url": "https://github.com/JounQin"
             }
         ],
         "main": "",
    @@ -50,6 +50,7 @@
         },
         "scripts": {},
         "dependencies": {},
    -    "typesPublisherContentHash": "6f0fbad7f7e548fa74313e425571a019550cf848fd074a2395066325b9ecb9a9",
    -    "typeScriptVersion": "4.3"
    +    "typesPublisherContentHash": "65c419f7bf5fb4a8b58da16b61b8cfc2629fb81d70dff861467e0292b2ed70ea",
    +    "typeScriptVersion": "4.5",
    +    "nonNpm": true
     }
    \ No newline at end of file
    diff --git a/deps/npm/node_modules/inherits/LICENSE b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/LICENSE
    similarity index 68%
    rename from deps/npm/node_modules/inherits/LICENSE
    rename to tools/node_modules/eslint/node_modules/@ungap/structured-clone/LICENSE
    index dea3013d6710ee..48afbe52afb589 100644
    --- a/deps/npm/node_modules/inherits/LICENSE
    +++ b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/LICENSE
    @@ -1,16 +1,15 @@
    -The ISC License
    +ISC License
     
    -Copyright (c) Isaac Z. Schlueter
    +Copyright (c) 2021, Andrea Giammarchi, @WebReflection
     
     Permission to use, copy, modify, and/or distribute this software for any
     purpose with or without fee is hereby granted, provided that the above
     copyright notice and this permission notice appear in all copies.
     
     THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
    -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
    -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
    +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
    +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
     INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
    -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
    -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
    +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
    +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
     PERFORMANCE OF THIS SOFTWARE.
    -
    diff --git a/tools/node_modules/eslint/node_modules/@ungap/structured-clone/cjs/deserialize.js b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/cjs/deserialize.js
    new file mode 100644
    index 00000000000000..9c0af7ddda7741
    --- /dev/null
    +++ b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/cjs/deserialize.js
    @@ -0,0 +1,78 @@
    +'use strict';
    +const {
    +  VOID, PRIMITIVE, ARRAY, OBJECT, DATE, REGEXP, MAP, SET, ERROR, BIGINT
    +} = require('./types.js');
    +
    +const env = typeof self === 'object' ? self : globalThis;
    +
    +const deserializer = ($, _) => {
    +  const as = (out, index) => {
    +    $.set(index, out);
    +    return out;
    +  };
    +
    +  const unpair = index => {
    +    if ($.has(index))
    +      return $.get(index);
    +
    +    const [type, value] = _[index];
    +    switch (type) {
    +      case PRIMITIVE:
    +      case VOID:
    +        return as(value, index);
    +      case ARRAY: {
    +        const arr = as([], index);
    +        for (const index of value)
    +          arr.push(unpair(index));
    +        return arr;
    +      }
    +      case OBJECT: {
    +        const object = as({}, index);
    +        for (const [key, index] of value)
    +          object[unpair(key)] = unpair(index);
    +        return object;
    +      }
    +      case DATE:
    +        return as(new Date(value), index);
    +      case REGEXP: {
    +        const {source, flags} = value;
    +        return as(new RegExp(source, flags), index);
    +      }
    +      case MAP: {
    +        const map = as(new Map, index);
    +        for (const [key, index] of value)
    +          map.set(unpair(key), unpair(index));
    +        return map;
    +      }
    +      case SET: {
    +        const set = as(new Set, index);
    +        for (const index of value)
    +          set.add(unpair(index));
    +        return set;
    +      }
    +      case ERROR: {
    +        const {name, message} = value;
    +        return as(new env[name](message), index);
    +      }
    +      case BIGINT:
    +        return as(BigInt(value), index);
    +      case 'BigInt':
    +        return as(Object(BigInt(value)), index);
    +    }
    +    return as(new env[type](value), index);
    +  };
    +
    +  return unpair;
    +};
    +
    +/**
    + * @typedef {Array} Record a type representation
    + */
    +
    +/**
    + * Returns a deserialized value from a serialized array of Records.
    + * @param {Record[]} serialized a previously serialized value.
    + * @returns {any}
    + */
    +const deserialize = serialized => deserializer(new Map, serialized)(0);
    +exports.deserialize = deserialize;
    diff --git a/tools/node_modules/eslint/node_modules/@ungap/structured-clone/cjs/index.js b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/cjs/index.js
    new file mode 100644
    index 00000000000000..13d747c5937db6
    --- /dev/null
    +++ b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/cjs/index.js
    @@ -0,0 +1,27 @@
    +'use strict';
    +const {deserialize} = require('./deserialize.js');
    +const {serialize} = require('./serialize.js');
    +
    +/**
    + * @typedef {Array} Record a type representation
    + */
    +
    +/**
    + * Returns an array of serialized Records.
    + * @param {any} any a serializable value.
    + * @param {{transfer?: any[], json?: boolean, lossy?: boolean}?} options an object with
    + * a transfer option (ignored when polyfilled) and/or non standard fields that
    + * fallback to the polyfill if present.
    + * @returns {Record[]}
    + */
    +Object.defineProperty(exports, '__esModule', {value: true}).default = typeof structuredClone === "function" ?
    +  /* c8 ignore start */
    +  (any, options) => (
    +    options && ('json' in options || 'lossy' in options) ?
    +      deserialize(serialize(any, options)) : structuredClone(any)
    +  ) :
    +  (any, options) => deserialize(serialize(any, options));
    +  /* c8 ignore stop */
    +
    +exports.deserialize = deserialize;
    +exports.serialize = serialize;
    diff --git a/tools/node_modules/eslint/node_modules/@ungap/structured-clone/cjs/json.js b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/cjs/json.js
    new file mode 100644
    index 00000000000000..0038dcf9ca530f
    --- /dev/null
    +++ b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/cjs/json.js
    @@ -0,0 +1,24 @@
    +'use strict';
    +/*! (c) Andrea Giammarchi - ISC */
    +
    +const {deserialize} = require('./deserialize.js');
    +const {serialize} = require('./serialize.js');
    +
    +const {parse: $parse, stringify: $stringify} = JSON;
    +const options = {json: true, lossy: true};
    +
    +/**
    + * Revive a previously stringified structured clone.
    + * @param {string} str previously stringified data as string.
    + * @returns {any} whatever was previously stringified as clone.
    + */
    +const parse = str => deserialize($parse(str));
    +exports.parse = parse;
    +
    +/**
    + * Represent a structured clone value as string.
    + * @param {any} any some clone-able value to stringify.
    + * @returns {string} the value stringified.
    + */
    +const stringify = any => $stringify(serialize(any, options));
    +exports.stringify = stringify;
    diff --git a/tools/node_modules/eslint/node_modules/@ungap/structured-clone/cjs/package.json b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/cjs/package.json
    new file mode 100644
    index 00000000000000..0292b9956f2e40
    --- /dev/null
    +++ b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/cjs/package.json
    @@ -0,0 +1 @@
    +{"type":"commonjs"}
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/@ungap/structured-clone/cjs/serialize.js b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/cjs/serialize.js
    new file mode 100644
    index 00000000000000..0379cc6cf82b93
    --- /dev/null
    +++ b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/cjs/serialize.js
    @@ -0,0 +1,160 @@
    +'use strict';
    +const {
    +  VOID, PRIMITIVE, ARRAY, OBJECT, DATE, REGEXP, MAP, SET, ERROR, BIGINT
    +} = require('./types.js');
    +
    +const EMPTY = '';
    +
    +const {toString} = {};
    +const {keys} = Object;
    +
    +const typeOf = value => {
    +  const type = typeof value;
    +  if (type !== 'object' || !value)
    +    return [PRIMITIVE, type];
    +
    +  const asString = toString.call(value).slice(8, -1);
    +  switch (asString) {
    +    case 'Array':
    +      return [ARRAY, EMPTY];
    +    case 'Object':
    +      return [OBJECT, EMPTY];
    +    case 'Date':
    +      return [DATE, EMPTY];
    +    case 'RegExp':
    +      return [REGEXP, EMPTY];
    +    case 'Map':
    +      return [MAP, EMPTY];
    +    case 'Set':
    +      return [SET, EMPTY];
    +  }
    +
    +  if (asString.includes('Array'))
    +    return [ARRAY, asString];
    +
    +  if (asString.includes('Error'))
    +    return [ERROR, asString];
    +
    +  return [OBJECT, asString];
    +};
    +
    +const shouldSkip = ([TYPE, type]) => (
    +  TYPE === PRIMITIVE &&
    +  (type === 'function' || type === 'symbol')
    +);
    +
    +const serializer = (strict, json, $, _) => {
    +
    +  const as = (out, value) => {
    +    const index = _.push(out) - 1;
    +    $.set(value, index);
    +    return index;
    +  };
    +
    +  const pair = value => {
    +    if ($.has(value))
    +      return $.get(value);
    +
    +    let [TYPE, type] = typeOf(value);
    +    switch (TYPE) {
    +      case PRIMITIVE: {
    +        let entry = value;
    +        switch (type) {
    +          case 'bigint':
    +            TYPE = BIGINT;
    +            entry = value.toString();
    +            break;
    +          case 'function':
    +          case 'symbol':
    +            if (strict)
    +              throw new TypeError('unable to serialize ' + type);
    +            entry = null;
    +            break;
    +          case 'undefined':
    +            return as([VOID], value);
    +        }
    +        return as([TYPE, entry], value);
    +      }
    +      case ARRAY: {
    +        if (type)
    +          return as([type, [...value]], value);
    +  
    +        const arr = [];
    +        const index = as([TYPE, arr], value);
    +        for (const entry of value)
    +          arr.push(pair(entry));
    +        return index;
    +      }
    +      case OBJECT: {
    +        if (type) {
    +          switch (type) {
    +            case 'BigInt':
    +              return as([type, value.toString()], value);
    +            case 'Boolean':
    +            case 'Number':
    +            case 'String':
    +              return as([type, value.valueOf()], value);
    +          }
    +        }
    +
    +        if (json && ('toJSON' in value))
    +          return pair(value.toJSON());
    +
    +        const entries = [];
    +        const index = as([TYPE, entries], value);
    +        for (const key of keys(value)) {
    +          if (strict || !shouldSkip(typeOf(value[key])))
    +            entries.push([pair(key), pair(value[key])]);
    +        }
    +        return index;
    +      }
    +      case DATE:
    +        return as([TYPE, value.toISOString()], value);
    +      case REGEXP: {
    +        const {source, flags} = value;
    +        return as([TYPE, {source, flags}], value);
    +      }
    +      case MAP: {
    +        const entries = [];
    +        const index = as([TYPE, entries], value);
    +        for (const [key, entry] of value) {
    +          if (strict || !(shouldSkip(typeOf(key)) || shouldSkip(typeOf(entry))))
    +            entries.push([pair(key), pair(entry)]);
    +        }
    +        return index;
    +      }
    +      case SET: {
    +        const entries = [];
    +        const index = as([TYPE, entries], value);
    +        for (const entry of value) {
    +          if (strict || !shouldSkip(typeOf(entry)))
    +            entries.push(pair(entry));
    +        }
    +        return index;
    +      }
    +    }
    +
    +    const {message} = value;
    +    return as([TYPE, {name: type, message}], value);
    +  };
    +
    +  return pair;
    +};
    +
    +/**
    + * @typedef {Array} Record a type representation
    + */
    +
    +/**
    + * Returns an array of serialized Records.
    + * @param {any} value a serializable value.
    + * @param {{json?: boolean, lossy?: boolean}?} options an object with a `lossy` or `json` property that,
    + *  if `true`, will not throw errors on incompatible types, and behave more
    + *  like JSON stringify would behave. Symbol and Function will be discarded.
    + * @returns {Record[]}
    + */
    + const serialize = (value, {json, lossy} = {}) => {
    +  const _ = [];
    +  return serializer(!(json || lossy), !!json, new Map, _)(value), _;
    +};
    +exports.serialize = serialize;
    diff --git a/tools/node_modules/eslint/node_modules/@ungap/structured-clone/cjs/types.js b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/cjs/types.js
    new file mode 100644
    index 00000000000000..8284be3d69a407
    --- /dev/null
    +++ b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/cjs/types.js
    @@ -0,0 +1,22 @@
    +'use strict';
    +const VOID       = -1;
    +exports.VOID = VOID;
    +const PRIMITIVE  = 0;
    +exports.PRIMITIVE = PRIMITIVE;
    +const ARRAY      = 1;
    +exports.ARRAY = ARRAY;
    +const OBJECT     = 2;
    +exports.OBJECT = OBJECT;
    +const DATE       = 3;
    +exports.DATE = DATE;
    +const REGEXP     = 4;
    +exports.REGEXP = REGEXP;
    +const MAP        = 5;
    +exports.MAP = MAP;
    +const SET        = 6;
    +exports.SET = SET;
    +const ERROR      = 7;
    +exports.ERROR = ERROR;
    +const BIGINT     = 8;
    +exports.BIGINT = BIGINT;
    +// export const SYMBOL = 9;
    diff --git a/tools/node_modules/eslint/node_modules/@ungap/structured-clone/esm/deserialize.js b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/esm/deserialize.js
    new file mode 100644
    index 00000000000000..0fa70897dc050e
    --- /dev/null
    +++ b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/esm/deserialize.js
    @@ -0,0 +1,79 @@
    +import {
    +  VOID, PRIMITIVE,
    +  ARRAY, OBJECT,
    +  DATE, REGEXP, MAP, SET,
    +  ERROR, BIGINT
    +} from './types.js';
    +
    +const env = typeof self === 'object' ? self : globalThis;
    +
    +const deserializer = ($, _) => {
    +  const as = (out, index) => {
    +    $.set(index, out);
    +    return out;
    +  };
    +
    +  const unpair = index => {
    +    if ($.has(index))
    +      return $.get(index);
    +
    +    const [type, value] = _[index];
    +    switch (type) {
    +      case PRIMITIVE:
    +      case VOID:
    +        return as(value, index);
    +      case ARRAY: {
    +        const arr = as([], index);
    +        for (const index of value)
    +          arr.push(unpair(index));
    +        return arr;
    +      }
    +      case OBJECT: {
    +        const object = as({}, index);
    +        for (const [key, index] of value)
    +          object[unpair(key)] = unpair(index);
    +        return object;
    +      }
    +      case DATE:
    +        return as(new Date(value), index);
    +      case REGEXP: {
    +        const {source, flags} = value;
    +        return as(new RegExp(source, flags), index);
    +      }
    +      case MAP: {
    +        const map = as(new Map, index);
    +        for (const [key, index] of value)
    +          map.set(unpair(key), unpair(index));
    +        return map;
    +      }
    +      case SET: {
    +        const set = as(new Set, index);
    +        for (const index of value)
    +          set.add(unpair(index));
    +        return set;
    +      }
    +      case ERROR: {
    +        const {name, message} = value;
    +        return as(new env[name](message), index);
    +      }
    +      case BIGINT:
    +        return as(BigInt(value), index);
    +      case 'BigInt':
    +        return as(Object(BigInt(value)), index);
    +    }
    +    return as(new env[type](value), index);
    +  };
    +
    +  return unpair;
    +};
    +
    +/**
    + * @typedef {Array} Record a type representation
    + */
    +
    +/**
    + * Returns a deserialized value from a serialized array of Records.
    + * @param {Record[]} serialized a previously serialized value.
    + * @returns {any}
    + */
    +export const deserialize = serialized => deserializer(new Map, serialized)(0);
    diff --git a/tools/node_modules/eslint/node_modules/@ungap/structured-clone/esm/index.js b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/esm/index.js
    new file mode 100644
    index 00000000000000..d3b47479adfc55
    --- /dev/null
    +++ b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/esm/index.js
    @@ -0,0 +1,25 @@
    +import {deserialize} from './deserialize.js';
    +import {serialize} from './serialize.js';
    +
    +/**
    + * @typedef {Array} Record a type representation
    + */
    +
    +/**
    + * Returns an array of serialized Records.
    + * @param {any} any a serializable value.
    + * @param {{transfer?: any[], json?: boolean, lossy?: boolean}?} options an object with
    + * a transfer option (ignored when polyfilled) and/or non standard fields that
    + * fallback to the polyfill if present.
    + * @returns {Record[]}
    + */
    +export default typeof structuredClone === "function" ?
    +  /* c8 ignore start */
    +  (any, options) => (
    +    options && ('json' in options || 'lossy' in options) ?
    +      deserialize(serialize(any, options)) : structuredClone(any)
    +  ) :
    +  (any, options) => deserialize(serialize(any, options));
    +  /* c8 ignore stop */
    +
    +export {deserialize, serialize};
    diff --git a/tools/node_modules/eslint/node_modules/@ungap/structured-clone/esm/json.js b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/esm/json.js
    new file mode 100644
    index 00000000000000..23eb95222d1a31
    --- /dev/null
    +++ b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/esm/json.js
    @@ -0,0 +1,21 @@
    +/*! (c) Andrea Giammarchi - ISC */
    +
    +import {deserialize} from './deserialize.js';
    +import {serialize} from './serialize.js';
    +
    +const {parse: $parse, stringify: $stringify} = JSON;
    +const options = {json: true, lossy: true};
    +
    +/**
    + * Revive a previously stringified structured clone.
    + * @param {string} str previously stringified data as string.
    + * @returns {any} whatever was previously stringified as clone.
    + */
    +export const parse = str => deserialize($parse(str));
    +
    +/**
    + * Represent a structured clone value as string.
    + * @param {any} any some clone-able value to stringify.
    + * @returns {string} the value stringified.
    + */
    +export const stringify = any => $stringify(serialize(any, options));
    diff --git a/tools/node_modules/eslint/node_modules/@ungap/structured-clone/esm/serialize.js b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/esm/serialize.js
    new file mode 100644
    index 00000000000000..8e098ddca777a7
    --- /dev/null
    +++ b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/esm/serialize.js
    @@ -0,0 +1,161 @@
    +import {
    +  VOID, PRIMITIVE,
    +  ARRAY, OBJECT,
    +  DATE, REGEXP, MAP, SET,
    +  ERROR, BIGINT
    +} from './types.js';
    +
    +const EMPTY = '';
    +
    +const {toString} = {};
    +const {keys} = Object;
    +
    +const typeOf = value => {
    +  const type = typeof value;
    +  if (type !== 'object' || !value)
    +    return [PRIMITIVE, type];
    +
    +  const asString = toString.call(value).slice(8, -1);
    +  switch (asString) {
    +    case 'Array':
    +      return [ARRAY, EMPTY];
    +    case 'Object':
    +      return [OBJECT, EMPTY];
    +    case 'Date':
    +      return [DATE, EMPTY];
    +    case 'RegExp':
    +      return [REGEXP, EMPTY];
    +    case 'Map':
    +      return [MAP, EMPTY];
    +    case 'Set':
    +      return [SET, EMPTY];
    +  }
    +
    +  if (asString.includes('Array'))
    +    return [ARRAY, asString];
    +
    +  if (asString.includes('Error'))
    +    return [ERROR, asString];
    +
    +  return [OBJECT, asString];
    +};
    +
    +const shouldSkip = ([TYPE, type]) => (
    +  TYPE === PRIMITIVE &&
    +  (type === 'function' || type === 'symbol')
    +);
    +
    +const serializer = (strict, json, $, _) => {
    +
    +  const as = (out, value) => {
    +    const index = _.push(out) - 1;
    +    $.set(value, index);
    +    return index;
    +  };
    +
    +  const pair = value => {
    +    if ($.has(value))
    +      return $.get(value);
    +
    +    let [TYPE, type] = typeOf(value);
    +    switch (TYPE) {
    +      case PRIMITIVE: {
    +        let entry = value;
    +        switch (type) {
    +          case 'bigint':
    +            TYPE = BIGINT;
    +            entry = value.toString();
    +            break;
    +          case 'function':
    +          case 'symbol':
    +            if (strict)
    +              throw new TypeError('unable to serialize ' + type);
    +            entry = null;
    +            break;
    +          case 'undefined':
    +            return as([VOID], value);
    +        }
    +        return as([TYPE, entry], value);
    +      }
    +      case ARRAY: {
    +        if (type)
    +          return as([type, [...value]], value);
    +  
    +        const arr = [];
    +        const index = as([TYPE, arr], value);
    +        for (const entry of value)
    +          arr.push(pair(entry));
    +        return index;
    +      }
    +      case OBJECT: {
    +        if (type) {
    +          switch (type) {
    +            case 'BigInt':
    +              return as([type, value.toString()], value);
    +            case 'Boolean':
    +            case 'Number':
    +            case 'String':
    +              return as([type, value.valueOf()], value);
    +          }
    +        }
    +
    +        if (json && ('toJSON' in value))
    +          return pair(value.toJSON());
    +
    +        const entries = [];
    +        const index = as([TYPE, entries], value);
    +        for (const key of keys(value)) {
    +          if (strict || !shouldSkip(typeOf(value[key])))
    +            entries.push([pair(key), pair(value[key])]);
    +        }
    +        return index;
    +      }
    +      case DATE:
    +        return as([TYPE, value.toISOString()], value);
    +      case REGEXP: {
    +        const {source, flags} = value;
    +        return as([TYPE, {source, flags}], value);
    +      }
    +      case MAP: {
    +        const entries = [];
    +        const index = as([TYPE, entries], value);
    +        for (const [key, entry] of value) {
    +          if (strict || !(shouldSkip(typeOf(key)) || shouldSkip(typeOf(entry))))
    +            entries.push([pair(key), pair(entry)]);
    +        }
    +        return index;
    +      }
    +      case SET: {
    +        const entries = [];
    +        const index = as([TYPE, entries], value);
    +        for (const entry of value) {
    +          if (strict || !shouldSkip(typeOf(entry)))
    +            entries.push(pair(entry));
    +        }
    +        return index;
    +      }
    +    }
    +
    +    const {message} = value;
    +    return as([TYPE, {name: type, message}], value);
    +  };
    +
    +  return pair;
    +};
    +
    +/**
    + * @typedef {Array} Record a type representation
    + */
    +
    +/**
    + * Returns an array of serialized Records.
    + * @param {any} value a serializable value.
    + * @param {{json?: boolean, lossy?: boolean}?} options an object with a `lossy` or `json` property that,
    + *  if `true`, will not throw errors on incompatible types, and behave more
    + *  like JSON stringify would behave. Symbol and Function will be discarded.
    + * @returns {Record[]}
    + */
    + export const serialize = (value, {json, lossy} = {}) => {
    +  const _ = [];
    +  return serializer(!(json || lossy), !!json, new Map, _)(value), _;
    +};
    diff --git a/tools/node_modules/eslint/node_modules/@ungap/structured-clone/esm/types.js b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/esm/types.js
    new file mode 100644
    index 00000000000000..50e60ca067667f
    --- /dev/null
    +++ b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/esm/types.js
    @@ -0,0 +1,11 @@
    +export const VOID       = -1;
    +export const PRIMITIVE  = 0;
    +export const ARRAY      = 1;
    +export const OBJECT     = 2;
    +export const DATE       = 3;
    +export const REGEXP     = 4;
    +export const MAP        = 5;
    +export const SET        = 6;
    +export const ERROR      = 7;
    +export const BIGINT     = 8;
    +// export const SYMBOL = 9;
    diff --git a/tools/node_modules/eslint/node_modules/@ungap/structured-clone/package.json b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/package.json
    new file mode 100644
    index 00000000000000..ba9f84fa55198c
    --- /dev/null
    +++ b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/package.json
    @@ -0,0 +1,53 @@
    +{
    +  "name": "@ungap/structured-clone",
    +  "version": "1.2.0",
    +  "description": "A structuredClone polyfill",
    +  "main": "./cjs/index.js",
    +  "scripts": {
    +    "build": "npm run cjs && npm run rollup:json && npm run test",
    +    "cjs": "ascjs esm cjs",
    +    "coverage": "c8 report --reporter=text-lcov > ./coverage/lcov.info",
    +    "rollup:json": "rollup --config rollup/json.config.js",
    +    "test": "c8 node test/index.js"
    +  },
    +  "keywords": [
    +    "recursion",
    +    "structured",
    +    "clone",
    +    "algorithm"
    +  ],
    +  "author": "Andrea Giammarchi",
    +  "license": "ISC",
    +  "devDependencies": {
    +    "@rollup/plugin-node-resolve": "^15.0.2",
    +    "@rollup/plugin-terser": "^0.4.1",
    +    "ascjs": "^5.0.1",
    +    "c8": "^7.13.0",
    +    "coveralls": "^3.1.1",
    +    "rollup": "^3.21.4"
    +  },
    +  "module": "./esm/index.js",
    +  "type": "module",
    +  "exports": {
    +    ".": {
    +      "import": "./esm/index.js",
    +      "default": "./cjs/index.js"
    +    },
    +    "./json": {
    +      "import": "./esm/json.js",
    +      "default": "./cjs/json.js"
    +    },
    +    "./package.json": "./package.json"
    +  },
    +  "directories": {
    +    "test": "test"
    +  },
    +  "repository": {
    +    "type": "git",
    +    "url": "git+https://github.com/ungap/structured-clone.git"
    +  },
    +  "bugs": {
    +    "url": "https://github.com/ungap/structured-clone/issues"
    +  },
    +  "homepage": "https://github.com/ungap/structured-clone#readme"
    +}
    diff --git a/tools/node_modules/eslint/node_modules/@ungap/structured-clone/structured-json.js b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/structured-json.js
    new file mode 100644
    index 00000000000000..44cfe596be509b
    --- /dev/null
    +++ b/tools/node_modules/eslint/node_modules/@ungap/structured-clone/structured-json.js
    @@ -0,0 +1 @@
    +var StructuredJSON=function(e){"use strict";const r="object"==typeof self?self:globalThis,t=e=>((e,t)=>{const s=(r,t)=>(e.set(t,r),r),n=c=>{if(e.has(c))return e.get(c);const[o,a]=t[c];switch(o){case 0:case-1:return s(a,c);case 1:{const e=s([],c);for(const r of a)e.push(n(r));return e}case 2:{const e=s({},c);for(const[r,t]of a)e[n(r)]=n(t);return e}case 3:return s(new Date(a),c);case 4:{const{source:e,flags:r}=a;return s(new RegExp(e,r),c)}case 5:{const e=s(new Map,c);for(const[r,t]of a)e.set(n(r),n(t));return e}case 6:{const e=s(new Set,c);for(const r of a)e.add(n(r));return e}case 7:{const{name:e,message:t}=a;return s(new r[e](t),c)}case 8:return s(BigInt(a),c);case"BigInt":return s(Object(BigInt(a)),c)}return s(new r[o](a),c)};return n})(new Map,e)(0),s="",{toString:n}={},{keys:c}=Object,o=e=>{const r=typeof e;if("object"!==r||!e)return[0,r];const t=n.call(e).slice(8,-1);switch(t){case"Array":return[1,s];case"Object":return[2,s];case"Date":return[3,s];case"RegExp":return[4,s];case"Map":return[5,s];case"Set":return[6,s]}return t.includes("Array")?[1,t]:t.includes("Error")?[7,t]:[2,t]},a=([e,r])=>0===e&&("function"===r||"symbol"===r),u=(e,{json:r,lossy:t}={})=>{const s=[];return((e,r,t,s)=>{const n=(e,r)=>{const n=s.push(e)-1;return t.set(r,n),n},u=s=>{if(t.has(s))return t.get(s);let[i,f]=o(s);switch(i){case 0:{let r=s;switch(f){case"bigint":i=8,r=s.toString();break;case"function":case"symbol":if(e)throw new TypeError("unable to serialize "+f);r=null;break;case"undefined":return n([-1],s)}return n([i,r],s)}case 1:{if(f)return n([f,[...s]],s);const e=[],r=n([i,e],s);for(const r of s)e.push(u(r));return r}case 2:{if(f)switch(f){case"BigInt":return n([f,s.toString()],s);case"Boolean":case"Number":case"String":return n([f,s.valueOf()],s)}if(r&&"toJSON"in s)return u(s.toJSON());const t=[],l=n([i,t],s);for(const r of c(s))!e&&a(o(s[r]))||t.push([u(r),u(s[r])]);return l}case 3:return n([i,s.toISOString()],s);case 4:{const{source:e,flags:r}=s;return n([i,{source:e,flags:r}],s)}case 5:{const r=[],t=n([i,r],s);for(const[t,n]of s)(e||!a(o(t))&&!a(o(n)))&&r.push([u(t),u(n)]);return t}case 6:{const r=[],t=n([i,r],s);for(const t of s)!e&&a(o(t))||r.push(u(t));return t}}const{message:l}=s;return n([i,{name:f,message:l}],s)};return u})(!(r||t),!!r,new Map,s)(e),s},{parse:i,stringify:f}=JSON,l={json:!0,lossy:!0};return e.parse=e=>t(i(e)),e.stringify=e=>f(u(e,l)),e}({});
    diff --git a/tools/node_modules/eslint/node_modules/acorn/dist/acorn.d.mts b/tools/node_modules/eslint/node_modules/acorn/dist/acorn.d.mts
    index 49ae59fd95776a..6ad58121195c96 100644
    --- a/tools/node_modules/eslint/node_modules/acorn/dist/acorn.d.mts
    +++ b/tools/node_modules/eslint/node_modules/acorn/dist/acorn.d.mts
    @@ -1,26 +1,857 @@
    -export {
    -  Node,
    -  Parser,
    -  Position,
    -  SourceLocation,
    -  TokContext,
    -  Token,
    -  TokenType,
    -  defaultOptions,
    -  getLineInfo,
    -  isIdentifierChar,
    -  isIdentifierStart,
    -  isNewLine,
    -  lineBreak,
    -  lineBreakG,
    -  parse,
    -  parseExpressionAt,
    -  tokContexts,
    -  tokTypes,
    -  tokenizer,
    -  version,
    -  AbstractToken,
    -  Comment,
    -  Options,
    -  ecmaVersion,
    -} from "./acorn.js";
    +export interface Node {
    +  start: number
    +  end: number
    +  type: string
    +  range?: [number, number]
    +  loc?: SourceLocation | null
    +}
    +
    +export interface SourceLocation {
    +  source?: string | null
    +  start: Position
    +  end: Position
    +}
    +
    +export interface Position {
    +  /** 1-based */
    +  line: number
    +  /** 0-based */
    +  column: number
    +}
    +
    +export interface Identifier extends Node {
    +  type: "Identifier"
    +  name: string
    +}
    +
    +export interface Literal extends Node {
    +  type: "Literal"
    +  value?: string | boolean | null | number | RegExp | bigint
    +  raw?: string
    +  regex?: {
    +    pattern: string
    +    flags: string
    +  }
    +  bigint?: string
    +}
    +
    +export interface Program extends Node {
    +  type: "Program"
    +  body: Array
    +  sourceType: "script" | "module"
    +}
    +
    +export interface Function extends Node {
    +  id?: Identifier | null
    +  params: Array
    +  body: BlockStatement | Expression
    +  generator: boolean
    +  expression: boolean
    +  async: boolean
    +}
    +
    +export interface ExpressionStatement extends Node {
    +  type: "ExpressionStatement"
    +  expression: Expression | Literal
    +  directive?: string
    +}
    +
    +export interface BlockStatement extends Node {
    +  type: "BlockStatement"
    +  body: Array
    +}
    +
    +export interface EmptyStatement extends Node {
    +  type: "EmptyStatement"
    +}
    +
    +export interface DebuggerStatement extends Node {
    +  type: "DebuggerStatement"
    +}
    +
    +export interface WithStatement extends Node {
    +  type: "WithStatement"
    +  object: Expression
    +  body: Statement
    +}
    +
    +export interface ReturnStatement extends Node {
    +  type: "ReturnStatement"
    +  argument?: Expression | null
    +}
    +
    +export interface LabeledStatement extends Node {
    +  type: "LabeledStatement"
    +  label: Identifier
    +  body: Statement
    +}
    +
    +export interface BreakStatement extends Node {
    +  type: "BreakStatement"
    +  label?: Identifier | null
    +}
    +
    +export interface ContinueStatement extends Node {
    +  type: "ContinueStatement"
    +  label?: Identifier | null
    +}
    +
    +export interface IfStatement extends Node {
    +  type: "IfStatement"
    +  test: Expression
    +  consequent: Statement
    +  alternate?: Statement | null
    +}
    +
    +export interface SwitchStatement extends Node {
    +  type: "SwitchStatement"
    +  discriminant: Expression
    +  cases: Array
    +}
    +
    +export interface SwitchCase extends Node {
    +  type: "SwitchCase"
    +  test?: Expression | null
    +  consequent: Array
    +}
    +
    +export interface ThrowStatement extends Node {
    +  type: "ThrowStatement"
    +  argument: Expression
    +}
    +
    +export interface TryStatement extends Node {
    +  type: "TryStatement"
    +  block: BlockStatement
    +  handler?: CatchClause | null
    +  finalizer?: BlockStatement | null
    +}
    +
    +export interface CatchClause extends Node {
    +  type: "CatchClause"
    +  param?: Pattern | null
    +  body: BlockStatement
    +}
    +
    +export interface WhileStatement extends Node {
    +  type: "WhileStatement"
    +  test: Expression
    +  body: Statement
    +}
    +
    +export interface DoWhileStatement extends Node {
    +  type: "DoWhileStatement"
    +  body: Statement
    +  test: Expression
    +}
    +
    +export interface ForStatement extends Node {
    +  type: "ForStatement"
    +  init?: VariableDeclaration | Expression | null
    +  test?: Expression | null
    +  update?: Expression | null
    +  body: Statement
    +}
    +
    +export interface ForInStatement extends Node {
    +  type: "ForInStatement"
    +  left: VariableDeclaration | Pattern
    +  right: Expression
    +  body: Statement
    +}
    +
    +export interface FunctionDeclaration extends Function {
    +  type: "FunctionDeclaration"
    +  id: Identifier
    +  body: BlockStatement
    +}
    +
    +export interface VariableDeclaration extends Node {
    +  type: "VariableDeclaration"
    +  declarations: Array
    +  kind: "var" | "let" | "const"
    +}
    +
    +export interface VariableDeclarator extends Node {
    +  type: "VariableDeclarator"
    +  id: Pattern
    +  init?: Expression | null
    +}
    +
    +export interface ThisExpression extends Node {
    +  type: "ThisExpression"
    +}
    +
    +export interface ArrayExpression extends Node {
    +  type: "ArrayExpression"
    +  elements: Array
    +}
    +
    +export interface ObjectExpression extends Node {
    +  type: "ObjectExpression"
    +  properties: Array
    +}
    +
    +export interface Property extends Node {
    +  type: "Property"
    +  key: Expression
    +  value: Expression
    +  kind: "init" | "get" | "set"
    +  method: boolean
    +  shorthand: boolean
    +  computed: boolean
    +}
    +
    +export interface FunctionExpression extends Function {
    +  type: "FunctionExpression"
    +  body: BlockStatement
    +}
    +
    +export interface UnaryExpression extends Node {
    +  type: "UnaryExpression"
    +  operator: UnaryOperator
    +  prefix: boolean
    +  argument: Expression
    +}
    +
    +export type UnaryOperator = "-" | "+" | "!" | "~" | "typeof" | "void" | "delete"
    +
    +export interface UpdateExpression extends Node {
    +  type: "UpdateExpression"
    +  operator: UpdateOperator
    +  argument: Expression
    +  prefix: boolean
    +}
    +
    +export type UpdateOperator = "++" | "--"
    +
    +export interface BinaryExpression extends Node {
    +  type: "BinaryExpression"
    +  operator: BinaryOperator
    +  left: Expression | PrivateIdentifier
    +  right: Expression
    +}
    +
    +export type BinaryOperator = "==" | "!=" | "===" | "!==" | "<" | "<=" | ">" | ">=" | "<<" | ">>" | ">>>" | "+" | "-" | "*" | "/" | "%" | "|" | "^" | "&" | "in" | "instanceof" | "**"
    +
    +export interface AssignmentExpression extends Node {
    +  type: "AssignmentExpression"
    +  operator: AssignmentOperator
    +  left: Pattern
    +  right: Expression
    +}
    +
    +export type AssignmentOperator = "=" | "+=" | "-=" | "*=" | "/=" | "%=" | "<<=" | ">>=" | ">>>=" | "|=" | "^=" | "&=" | "**=" | "||=" | "&&=" | "??="
    +
    +export interface LogicalExpression extends Node {
    +  type: "LogicalExpression"
    +  operator: LogicalOperator
    +  left: Expression
    +  right: Expression
    +}
    +
    +export type LogicalOperator = "||" | "&&" | "??"
    +
    +export interface MemberExpression extends Node {
    +  type: "MemberExpression"
    +  object: Expression | Super
    +  property: Expression | PrivateIdentifier
    +  computed: boolean
    +  optional: boolean
    +}
    +
    +export interface ConditionalExpression extends Node {
    +  type: "ConditionalExpression"
    +  test: Expression
    +  alternate: Expression
    +  consequent: Expression
    +}
    +
    +export interface CallExpression extends Node {
    +  type: "CallExpression"
    +  callee: Expression | Super
    +  arguments: Array
    +  optional: boolean
    +}
    +
    +export interface NewExpression extends Node {
    +  type: "NewExpression"
    +  callee: Expression
    +  arguments: Array
    +}
    +
    +export interface SequenceExpression extends Node {
    +  type: "SequenceExpression"
    +  expressions: Array
    +}
    +
    +export interface ForOfStatement extends Node {
    +  type: "ForOfStatement"
    +  left: VariableDeclaration | Pattern
    +  right: Expression
    +  body: Statement
    +  await: boolean
    +}
    +
    +export interface Super extends Node {
    +  type: "Super"
    +}
    +
    +export interface SpreadElement extends Node {
    +  type: "SpreadElement"
    +  argument: Expression
    +}
    +
    +export interface ArrowFunctionExpression extends Function {
    +  type: "ArrowFunctionExpression"
    +}
    +
    +export interface YieldExpression extends Node {
    +  type: "YieldExpression"
    +  argument?: Expression | null
    +  delegate: boolean
    +}
    +
    +export interface TemplateLiteral extends Node {
    +  type: "TemplateLiteral"
    +  quasis: Array
    +  expressions: Array
    +}
    +
    +export interface TaggedTemplateExpression extends Node {
    +  type: "TaggedTemplateExpression"
    +  tag: Expression
    +  quasi: TemplateLiteral
    +}
    +
    +export interface TemplateElement extends Node {
    +  type: "TemplateElement"
    +  tail: boolean
    +  value: {
    +    cooked?: string | null
    +    raw: string
    +  }
    +}
    +
    +export interface AssignmentProperty extends Node {
    +  type: "Property"
    +  key: Expression
    +  value: Pattern
    +  kind: "init"
    +  method: false
    +  shorthand: boolean
    +  computed: boolean
    +}
    +
    +export interface ObjectPattern extends Node {
    +  type: "ObjectPattern"
    +  properties: Array
    +}
    +
    +export interface ArrayPattern extends Node {
    +  type: "ArrayPattern"
    +  elements: Array
    +}
    +
    +export interface RestElement extends Node {
    +  type: "RestElement"
    +  argument: Pattern
    +}
    +
    +export interface AssignmentPattern extends Node {
    +  type: "AssignmentPattern"
    +  left: Pattern
    +  right: Expression
    +}
    +
    +export interface Class extends Node {
    +  id?: Identifier | null
    +  superClass?: Expression | null
    +  body: ClassBody
    +}
    +
    +export interface ClassBody extends Node {
    +  type: "ClassBody"
    +  body: Array
    +}
    +
    +export interface MethodDefinition extends Node {
    +  type: "MethodDefinition"
    +  key: Expression | PrivateIdentifier
    +  value: FunctionExpression
    +  kind: "constructor" | "method" | "get" | "set"
    +  computed: boolean
    +  static: boolean
    +}
    +
    +export interface ClassDeclaration extends Class {
    +  type: "ClassDeclaration"
    +  id: Identifier
    +}
    +
    +export interface ClassExpression extends Class {
    +  type: "ClassExpression"
    +}
    +
    +export interface MetaProperty extends Node {
    +  type: "MetaProperty"
    +  meta: Identifier
    +  property: Identifier
    +}
    +
    +export interface ImportDeclaration extends Node {
    +  type: "ImportDeclaration"
    +  specifiers: Array
    +  source: Literal
    +}
    +
    +export interface ImportSpecifier extends Node {
    +  type: "ImportSpecifier"
    +  imported: Identifier | Literal
    +  local: Identifier
    +}
    +
    +export interface ImportDefaultSpecifier extends Node {
    +  type: "ImportDefaultSpecifier"
    +  local: Identifier
    +}
    +
    +export interface ImportNamespaceSpecifier extends Node {
    +  type: "ImportNamespaceSpecifier"
    +  local: Identifier
    +}
    +
    +export interface ExportNamedDeclaration extends Node {
    +  type: "ExportNamedDeclaration"
    +  declaration?: Declaration | null
    +  specifiers: Array
    +  source?: Literal | null
    +}
    +
    +export interface ExportSpecifier extends Node {
    +  type: "ExportSpecifier"
    +  exported: Identifier | Literal
    +  local: Identifier | Literal
    +}
    +
    +export interface AnonymousFunctionDeclaration extends Function {
    +  type: "FunctionDeclaration"
    +  id: null
    +  body: BlockStatement
    +}
    +
    +export interface AnonymousClassDeclaration extends Class {
    +  type: "ClassDeclaration"
    +  id: null
    +}
    +
    +export interface ExportDefaultDeclaration extends Node {
    +  type: "ExportDefaultDeclaration"
    +  declaration: AnonymousFunctionDeclaration | FunctionDeclaration | AnonymousClassDeclaration | ClassDeclaration | Expression
    +}
    +
    +export interface ExportAllDeclaration extends Node {
    +  type: "ExportAllDeclaration"
    +  source: Literal
    +  exported?: Identifier | Literal | null
    +}
    +
    +export interface AwaitExpression extends Node {
    +  type: "AwaitExpression"
    +  argument: Expression
    +}
    +
    +export interface ChainExpression extends Node {
    +  type: "ChainExpression"
    +  expression: MemberExpression | CallExpression
    +}
    +
    +export interface ImportExpression extends Node {
    +  type: "ImportExpression"
    +  source: Expression
    +}
    +
    +export interface ParenthesizedExpression extends Node {
    +  type: "ParenthesizedExpression"
    +  expression: Expression
    +}
    +
    +export interface PropertyDefinition extends Node {
    +  type: "PropertyDefinition"
    +  key: Expression | PrivateIdentifier
    +  value?: Expression | null
    +  computed: boolean
    +  static: boolean
    +}
    +
    +export interface PrivateIdentifier extends Node {
    +  type: "PrivateIdentifier"
    +  name: string
    +}
    +
    +export interface StaticBlock extends Node {
    +  type: "StaticBlock"
    +  body: Array
    +}
    +
    +export type Statement = 
    +| ExpressionStatement
    +| BlockStatement
    +| EmptyStatement
    +| DebuggerStatement
    +| WithStatement
    +| ReturnStatement
    +| LabeledStatement
    +| BreakStatement
    +| ContinueStatement
    +| IfStatement
    +| SwitchStatement
    +| ThrowStatement
    +| TryStatement
    +| WhileStatement
    +| DoWhileStatement
    +| ForStatement
    +| ForInStatement
    +| ForOfStatement
    +| Declaration
    +
    +export type Declaration = 
    +| FunctionDeclaration
    +| VariableDeclaration
    +| ClassDeclaration
    +
    +export type Expression = 
    +| Identifier
    +| Literal
    +| ThisExpression
    +| ArrayExpression
    +| ObjectExpression
    +| FunctionExpression
    +| UnaryExpression
    +| UpdateExpression
    +| BinaryExpression
    +| AssignmentExpression
    +| LogicalExpression
    +| MemberExpression
    +| ConditionalExpression
    +| CallExpression
    +| NewExpression
    +| SequenceExpression
    +| ArrowFunctionExpression
    +| YieldExpression
    +| TemplateLiteral
    +| TaggedTemplateExpression
    +| ClassExpression
    +| MetaProperty
    +| AwaitExpression
    +| ChainExpression
    +| ImportExpression
    +| ParenthesizedExpression
    +
    +export type Pattern = 
    +| Identifier
    +| MemberExpression
    +| ObjectPattern
    +| ArrayPattern
    +| RestElement
    +| AssignmentPattern
    +
    +export type ModuleDeclaration = 
    +| ImportDeclaration
    +| ExportNamedDeclaration
    +| ExportDefaultDeclaration
    +| ExportAllDeclaration
    +
    +export type AnyNode = Statement | Expression | Declaration | ModuleDeclaration | Literal | Program | SwitchCase | CatchClause | Property | Super | SpreadElement | TemplateElement | AssignmentProperty | ObjectPattern | ArrayPattern | RestElement | AssignmentPattern | ClassBody | MethodDefinition | MetaProperty | ImportSpecifier | ImportDefaultSpecifier | ImportNamespaceSpecifier | ExportSpecifier | AnonymousFunctionDeclaration | AnonymousClassDeclaration | PropertyDefinition | PrivateIdentifier | StaticBlock
    +
    +export function parse(input: string, options: Options): Program
    +
    +export function parseExpressionAt(input: string, pos: number, options: Options): Expression
    +
    +export function tokenizer(input: string, options: Options): {
    +  getToken(): Token
    +  [Symbol.iterator](): Iterator
    +}
    +
    +export type ecmaVersion = 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | "latest"
    +
    +export interface Options {
    +  /**
    +   * `ecmaVersion` indicates the ECMAScript version to parse. Must be
    +   * either 3, 5, 6 (or 2015), 7 (2016), 8 (2017), 9 (2018), 10
    +   * (2019), 11 (2020), 12 (2021), 13 (2022), 14 (2023), or `"latest"`
    +   * (the latest version the library supports). This influences
    +   * support for strict mode, the set of reserved words, and support
    +   * for new syntax features.
    +   */
    +  ecmaVersion: ecmaVersion
    +
    +  /**
    +   * `sourceType` indicates the mode the code should be parsed in.
    +   * Can be either `"script"` or `"module"`. This influences global
    +   * strict mode and parsing of `import` and `export` declarations.
    +   */
    +  sourceType?: "script" | "module"
    +
    +  /**
    +   * a callback that will be called when a semicolon is automatically inserted.
    +   * @param lastTokEnd the position of the comma as an offset
    +   * @param lastTokEndLoc location if {@link locations} is enabled
    +   */
    +  onInsertedSemicolon?: (lastTokEnd: number, lastTokEndLoc?: Position) => void
    +
    +  /**
    +   * similar to `onInsertedSemicolon`, but for trailing commas
    +   * @param lastTokEnd the position of the comma as an offset
    +   * @param lastTokEndLoc location if `locations` is enabled
    +   */
    +  onTrailingComma?: (lastTokEnd: number, lastTokEndLoc?: Position) => void
    +
    +  /**
    +   * By default, reserved words are only enforced if ecmaVersion >= 5.
    +   * Set `allowReserved` to a boolean value to explicitly turn this on
    +   * an off. When this option has the value "never", reserved words
    +   * and keywords can also not be used as property names.
    +   */
    +  allowReserved?: boolean | "never"
    +
    +  /** 
    +   * When enabled, a return at the top level is not considered an error.
    +   */
    +  allowReturnOutsideFunction?: boolean
    +
    +  /**
    +   * When enabled, import/export statements are not constrained to
    +   * appearing at the top of the program, and an import.meta expression
    +   * in a script isn't considered an error.
    +   */
    +  allowImportExportEverywhere?: boolean
    +
    +  /**
    +   * By default, `await` identifiers are allowed to appear at the top-level scope only if {@link ecmaVersion} >= 2022.
    +   * When enabled, await identifiers are allowed to appear at the top-level scope,
    +   * but they are still not allowed in non-async functions.
    +   */
    +  allowAwaitOutsideFunction?: boolean
    +
    +  /**
    +   * When enabled, super identifiers are not constrained to
    +   * appearing in methods and do not raise an error when they appear elsewhere.
    +   */
    +  allowSuperOutsideMethod?: boolean
    +
    +  /**
    +   * When enabled, hashbang directive in the beginning of file is
    +   * allowed and treated as a line comment. Enabled by default when
    +   * {@link ecmaVersion} >= 2023.
    +   */
    +  allowHashBang?: boolean
    +
    +  /**
    +   * By default, the parser will verify that private properties are
    +   * only used in places where they are valid and have been declared.
    +   * Set this to false to turn such checks off.
    +   */
    +  checkPrivateFields?: boolean
    +
    +  /**
    +   * When `locations` is on, `loc` properties holding objects with
    +   * `start` and `end` properties as {@link Position} objects will be attached to the
    +   * nodes.
    +   */
    +  locations?: boolean
    +
    +  /**
    +   * a callback that will cause Acorn to call that export function with object in the same
    +   * format as tokens returned from `tokenizer().getToken()`. Note
    +   * that you are not allowed to call the parser from the
    +   * callback—that will corrupt its internal state.
    +   */
    +  onToken?: ((token: Token) => void) | Token[]
    +
    +
    +  /**
    +   * This takes a export function or an array.
    +   * 
    +   * When a export function is passed, Acorn will call that export function with `(block, text, start,
    +   * end)` parameters whenever a comment is skipped. `block` is a
    +   * boolean indicating whether this is a block (`/* *\/`) comment,
    +   * `text` is the content of the comment, and `start` and `end` are
    +   * character offsets that denote the start and end of the comment.
    +   * When the {@link locations} option is on, two more parameters are
    +   * passed, the full locations of {@link Position} export type of the start and
    +   * end of the comments.
    +   * 
    +   * When a array is passed, each found comment of {@link Comment} export type is pushed to the array.
    +   * 
    +   * Note that you are not allowed to call the
    +   * parser from the callback—that will corrupt its internal state.
    +   */
    +  onComment?: ((
    +    isBlock: boolean, text: string, start: number, end: number, startLoc?: Position,
    +    endLoc?: Position
    +  ) => void) | Comment[]
    +
    +  /**
    +   * Nodes have their start and end characters offsets recorded in
    +   * `start` and `end` properties (directly on the node, rather than
    +   * the `loc` object, which holds line/column data. To also add a
    +   * [semi-standardized][range] `range` property holding a `[start,
    +   * end]` array with the same numbers, set the `ranges` option to
    +   * `true`.
    +   */
    +  ranges?: boolean
    +
    +  /**
    +   * It is possible to parse multiple files into a single AST by
    +   * passing the tree produced by parsing the first file as
    +   * `program` option in subsequent parses. This will add the
    +   * toplevel forms of the parsed file to the `Program` (top) node
    +   * of an existing parse tree.
    +   */
    +  program?: Node
    +
    +  /**
    +   * When {@link locations} is on, you can pass this to record the source
    +   * file in every node's `loc` object.
    +   */
    +  sourceFile?: string
    +
    +  /**
    +   * This value, if given, is stored in every node, whether {@link locations} is on or off.
    +   */
    +  directSourceFile?: string
    +
    +  /**
    +   * When enabled, parenthesized expressions are represented by
    +   * (non-standard) ParenthesizedExpression nodes
    +   */
    +  preserveParens?: boolean
    +}
    +  
    +export class Parser {
    +  options: Options
    +  input: string
    +  
    +  private constructor(options: Options, input: string, startPos?: number)
    +  parse(): Program
    +  
    +  static parse(input: string, options: Options): Program
    +  static parseExpressionAt(input: string, pos: number, options: Options): Expression
    +  static tokenizer(input: string, options: Options): {
    +    getToken(): Token
    +    [Symbol.iterator](): Iterator
    +  }
    +  static extend(...plugins: ((BaseParser: typeof Parser) => typeof Parser)[]): typeof Parser
    +}
    +
    +export const defaultOptions: Options
    +
    +export function getLineInfo(input: string, offset: number): Position
    +
    +export class TokenType {
    +  label: string
    +  keyword: string | undefined
    +}
    +
    +export const tokTypes: {
    +  num: TokenType
    +  regexp: TokenType
    +  string: TokenType
    +  name: TokenType
    +  privateId: TokenType
    +  eof: TokenType
    +
    +  bracketL: TokenType
    +  bracketR: TokenType
    +  braceL: TokenType
    +  braceR: TokenType
    +  parenL: TokenType
    +  parenR: TokenType
    +  comma: TokenType
    +  semi: TokenType
    +  colon: TokenType
    +  dot: TokenType
    +  question: TokenType
    +  questionDot: TokenType
    +  arrow: TokenType
    +  template: TokenType
    +  invalidTemplate: TokenType
    +  ellipsis: TokenType
    +  backQuote: TokenType
    +  dollarBraceL: TokenType
    +
    +  eq: TokenType
    +  assign: TokenType
    +  incDec: TokenType
    +  prefix: TokenType
    +  logicalOR: TokenType
    +  logicalAND: TokenType
    +  bitwiseOR: TokenType
    +  bitwiseXOR: TokenType
    +  bitwiseAND: TokenType
    +  equality: TokenType
    +  relational: TokenType
    +  bitShift: TokenType
    +  plusMin: TokenType
    +  modulo: TokenType
    +  star: TokenType
    +  slash: TokenType
    +  starstar: TokenType
    +  coalesce: TokenType
    +
    +  _break: TokenType
    +  _case: TokenType
    +  _catch: TokenType
    +  _continue: TokenType
    +  _debugger: TokenType
    +  _default: TokenType
    +  _do: TokenType
    +  _else: TokenType
    +  _finally: TokenType
    +  _for: TokenType
    +  _function: TokenType
    +  _if: TokenType
    +  _return: TokenType
    +  _switch: TokenType
    +  _throw: TokenType
    +  _try: TokenType
    +  _var: TokenType
    +  _const: TokenType
    +  _while: TokenType
    +  _with: TokenType
    +  _new: TokenType
    +  _this: TokenType
    +  _super: TokenType
    +  _class: TokenType
    +  _extends: TokenType
    +  _export: TokenType
    +  _import: TokenType
    +  _null: TokenType
    +  _true: TokenType
    +  _false: TokenType
    +  _in: TokenType
    +  _instanceof: TokenType
    +  _typeof: TokenType
    +  _void: TokenType
    +  _delete: TokenType
    +}
    +
    +export interface Comment {
    +  type: "Line" | "Block"
    +  value: string
    +  start: number
    +  end: number
    +  loc?: SourceLocation
    +  range?: [number, number]
    +}
    +
    +export class Token {
    +  type: TokenType
    +  start: number
    +  end: number
    +  loc?: SourceLocation
    +  range?: [number, number]
    +}
    +
    +export const version: string
    diff --git a/tools/node_modules/eslint/node_modules/acorn/dist/acorn.js b/tools/node_modules/eslint/node_modules/acorn/dist/acorn.js
    index 62e1aa63d0974f..de0096ec9a6a31 100644
    --- a/tools/node_modules/eslint/node_modules/acorn/dist/acorn.js
    +++ b/tools/node_modules/eslint/node_modules/acorn/dist/acorn.js
    @@ -8,10 +8,10 @@
       var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 370, 1, 81, 2, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 9, 5351, 0, 7, 14, 13835, 9, 87, 9, 39, 4, 60, 6, 26, 9, 1014, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4706, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 983, 6, 110, 6, 6, 9, 4759, 9, 787719, 239];
     
       // This file was generated. Do not modify manually!
    -  var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 4026, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 757, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 3104, 541, 1507, 4938, 6, 4191];
    +  var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 4026, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 757, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 4191];
     
       // This file was generated. Do not modify manually!
    -  var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0898-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f";
    +  var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0898-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65";
     
       // This file was generated. Do not modify manually!
       var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088e\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ca\ua7d0\ua7d1\ua7d3\ua7d5-\ua7d9\ua7f2-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc";
    @@ -279,8 +279,10 @@
         toString.call(obj) === "[object Array]"
       ); });
     
    +  var regexpCache = Object.create(null);
    +
       function wordsRegexp(words) {
    -    return new RegExp("^(?:" + words.replace(/ /g, "|") + ")$")
    +    return regexpCache[words] || (regexpCache[words] = new RegExp("^(?:" + words.replace(/ /g, "|") + ")$"))
       }
     
       function codePointToString(code) {
    @@ -340,11 +342,11 @@
         // Can be either `"script"` or `"module"`. This influences global
         // strict mode and parsing of `import` and `export` declarations.
         sourceType: "script",
    -    // `onInsertedSemicolon` can be a callback that will be called
    -    // when a semicolon is automatically inserted. It will be passed
    -    // the position of the comma as an offset, and if `locations` is
    -    // enabled, it is given the location as a `{line, column}` object
    -    // as second argument.
    +    // `onInsertedSemicolon` can be a callback that will be called when
    +    // a semicolon is automatically inserted. It will be passed the
    +    // position of the inserted semicolon as an offset, and if
    +    // `locations` is enabled, it is given the location as a `{line,
    +    // column}` object as second argument.
         onInsertedSemicolon: null,
         // `onTrailingComma` is similar to `onInsertedSemicolon`, but for
         // trailing commas.
    @@ -397,6 +399,8 @@
         // passed, the full `{line, column}` locations of the start and
         // end of the comments. Note that you are not allowed to call the
         // parser from the callback—that will corrupt its internal state.
    +    // When this option has an array as value, objects representing the
    +    // comments are pushed to it.
         onComment: null,
         // Nodes have their start and end characters offsets recorded in
         // `start` and `end` properties (directly on the node, rather than
    @@ -1772,8 +1776,6 @@
           { this.checkPatternExport(exports, pat.left); }
         else if (type === "RestElement")
           { this.checkPatternExport(exports, pat.argument); }
    -    else if (type === "ParenthesizedExpression")
    -      { this.checkPatternExport(exports, pat.expression); }
       };
     
       pp$8.checkVariableExport = function(exports, decls) {
    @@ -2337,7 +2339,7 @@
           { this.exprAllowed = type.beforeExpr; }
       };
     
    -  // Used to handle egde cases when token context could not be inferred correctly during tokenization phase
    +  // Used to handle edge cases when token context could not be inferred correctly during tokenization phase
     
       pp$6.overrideContext = function(tokenCtx) {
         if (this.curContext() !== tokenCtx) {
    @@ -2390,6 +2392,11 @@
         this.exprAllowed = false;
       };
     
    +  types$1.colon.updateContext = function() {
    +    if (this.curContext().token === "function") { this.context.pop(); }
    +    this.exprAllowed = true;
    +  };
    +
       types$1.backQuote.updateContext = function() {
         if (this.curContext() === types.q_tmpl)
           { this.context.pop(); }
    @@ -3088,9 +3095,12 @@
       pp$5.parseNew = function() {
         if (this.containsEsc) { this.raiseRecoverable(this.start, "Escape sequence in keyword new"); }
         var node = this.startNode();
    -    var meta = this.parseIdent(true);
    -    if (this.options.ecmaVersion >= 6 && this.eat(types$1.dot)) {
    -      node.meta = meta;
    +    this.next();
    +    if (this.options.ecmaVersion >= 6 && this.type === types$1.dot) {
    +      var meta = this.startNodeAt(node.start, node.startLoc);
    +      meta.name = "new";
    +      node.meta = this.finishNode(meta, "Identifier");
    +      this.next();
           var containsEsc = this.containsEsc;
           node.property = this.parseIdent(true);
           if (node.property.name !== "target")
    @@ -3492,6 +3502,7 @@
             (this.lastTokEnd !== this.lastTokStart + 1 || this.input.charCodeAt(this.lastTokStart) !== 46)) {
             this.context.pop();
           }
    +      this.type = types$1.name;
         } else {
           this.unexpected();
         }
    @@ -5914,7 +5925,7 @@
       // [walk]: util/walk.js
     
     
    -  var version = "8.10.0";
    +  var version = "8.11.2";
     
       Parser.acorn = {
         Parser: Parser,
    diff --git a/tools/node_modules/eslint/node_modules/acorn/dist/acorn.mjs b/tools/node_modules/eslint/node_modules/acorn/dist/acorn.mjs
    index 119eff98d4ded6..01a49ef94da2a7 100644
    --- a/tools/node_modules/eslint/node_modules/acorn/dist/acorn.mjs
    +++ b/tools/node_modules/eslint/node_modules/acorn/dist/acorn.mjs
    @@ -2,10 +2,10 @@
     var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 370, 1, 81, 2, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 9, 5351, 0, 7, 14, 13835, 9, 87, 9, 39, 4, 60, 6, 26, 9, 1014, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4706, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 983, 6, 110, 6, 6, 9, 4759, 9, 787719, 239];
     
     // This file was generated. Do not modify manually!
    -var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 4026, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 757, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 3104, 541, 1507, 4938, 6, 4191];
    +var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 4026, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 757, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 4191];
     
     // This file was generated. Do not modify manually!
    -var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0898-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f";
    +var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0898-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65";
     
     // This file was generated. Do not modify manually!
     var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088e\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ca\ua7d0\ua7d1\ua7d3\ua7d5-\ua7d9\ua7f2-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc";
    @@ -273,8 +273,10 @@ var isArray = Array.isArray || (function (obj) { return (
       toString.call(obj) === "[object Array]"
     ); });
     
    +var regexpCache = Object.create(null);
    +
     function wordsRegexp(words) {
    -  return new RegExp("^(?:" + words.replace(/ /g, "|") + ")$")
    +  return regexpCache[words] || (regexpCache[words] = new RegExp("^(?:" + words.replace(/ /g, "|") + ")$"))
     }
     
     function codePointToString(code) {
    @@ -334,11 +336,11 @@ var defaultOptions = {
       // Can be either `"script"` or `"module"`. This influences global
       // strict mode and parsing of `import` and `export` declarations.
       sourceType: "script",
    -  // `onInsertedSemicolon` can be a callback that will be called
    -  // when a semicolon is automatically inserted. It will be passed
    -  // the position of the comma as an offset, and if `locations` is
    -  // enabled, it is given the location as a `{line, column}` object
    -  // as second argument.
    +  // `onInsertedSemicolon` can be a callback that will be called when
    +  // a semicolon is automatically inserted. It will be passed the
    +  // position of the inserted semicolon as an offset, and if
    +  // `locations` is enabled, it is given the location as a `{line,
    +  // column}` object as second argument.
       onInsertedSemicolon: null,
       // `onTrailingComma` is similar to `onInsertedSemicolon`, but for
       // trailing commas.
    @@ -391,6 +393,8 @@ var defaultOptions = {
       // passed, the full `{line, column}` locations of the start and
       // end of the comments. Note that you are not allowed to call the
       // parser from the callback—that will corrupt its internal state.
    +  // When this option has an array as value, objects representing the
    +  // comments are pushed to it.
       onComment: null,
       // Nodes have their start and end characters offsets recorded in
       // `start` and `end` properties (directly on the node, rather than
    @@ -1766,8 +1770,6 @@ pp$8.checkPatternExport = function(exports, pat) {
         { this.checkPatternExport(exports, pat.left); }
       else if (type === "RestElement")
         { this.checkPatternExport(exports, pat.argument); }
    -  else if (type === "ParenthesizedExpression")
    -    { this.checkPatternExport(exports, pat.expression); }
     };
     
     pp$8.checkVariableExport = function(exports, decls) {
    @@ -2331,7 +2333,7 @@ pp$6.updateContext = function(prevType) {
         { this.exprAllowed = type.beforeExpr; }
     };
     
    -// Used to handle egde cases when token context could not be inferred correctly during tokenization phase
    +// Used to handle edge cases when token context could not be inferred correctly during tokenization phase
     
     pp$6.overrideContext = function(tokenCtx) {
       if (this.curContext() !== tokenCtx) {
    @@ -2384,6 +2386,11 @@ types$1._function.updateContext = types$1._class.updateContext = function(prevTy
       this.exprAllowed = false;
     };
     
    +types$1.colon.updateContext = function() {
    +  if (this.curContext().token === "function") { this.context.pop(); }
    +  this.exprAllowed = true;
    +};
    +
     types$1.backQuote.updateContext = function() {
       if (this.curContext() === types.q_tmpl)
         { this.context.pop(); }
    @@ -3082,9 +3089,12 @@ var empty = [];
     pp$5.parseNew = function() {
       if (this.containsEsc) { this.raiseRecoverable(this.start, "Escape sequence in keyword new"); }
       var node = this.startNode();
    -  var meta = this.parseIdent(true);
    -  if (this.options.ecmaVersion >= 6 && this.eat(types$1.dot)) {
    -    node.meta = meta;
    +  this.next();
    +  if (this.options.ecmaVersion >= 6 && this.type === types$1.dot) {
    +    var meta = this.startNodeAt(node.start, node.startLoc);
    +    meta.name = "new";
    +    node.meta = this.finishNode(meta, "Identifier");
    +    this.next();
         var containsEsc = this.containsEsc;
         node.property = this.parseIdent(true);
         if (node.property.name !== "target")
    @@ -3486,6 +3496,7 @@ pp$5.parseIdentNode = function() {
           (this.lastTokEnd !== this.lastTokStart + 1 || this.input.charCodeAt(this.lastTokStart) !== 46)) {
           this.context.pop();
         }
    +    this.type = types$1.name;
       } else {
         this.unexpected();
       }
    @@ -5908,7 +5919,7 @@ pp.readWord = function() {
     // [walk]: util/walk.js
     
     
    -var version = "8.10.0";
    +var version = "8.11.2";
     
     Parser.acorn = {
       Parser: Parser,
    diff --git a/tools/node_modules/eslint/node_modules/acorn/package.json b/tools/node_modules/eslint/node_modules/acorn/package.json
    index 4243aa3542deb3..430603dc8c3d57 100644
    --- a/tools/node_modules/eslint/node_modules/acorn/package.json
    +++ b/tools/node_modules/eslint/node_modules/acorn/package.json
    @@ -16,7 +16,7 @@
         ],
         "./package.json": "./package.json"
       },
    -  "version": "8.10.0",
    +  "version": "8.11.2",
       "engines": {
         "node": ">=0.4.0"
       },
    diff --git a/tools/node_modules/eslint/node_modules/browserslist/index.js b/tools/node_modules/eslint/node_modules/browserslist/index.js
    index 18021be30db387..6718031a9f96a4 100644
    --- a/tools/node_modules/eslint/node_modules/browserslist/index.js
    +++ b/tools/node_modules/eslint/node_modules/browserslist/index.js
    @@ -249,9 +249,18 @@ function normalizeAndroidVersions(androidVersions, chromeVersions) {
         .concat(chromeVersions.slice(iFirstEvergreen))
     }
     
    +function copyObject(obj) {
    +  var copy = {}
    +  for (var key in obj) {
    +    copy[key] = obj[key]
    +  }
    +  return copy
    +}
    +
     function normalizeAndroidData(android, chrome) {
       android.released = normalizeAndroidVersions(android.released, chrome.released)
       android.versions = normalizeAndroidVersions(android.versions, chrome.versions)
    +  android.releaseDate = copyObject(android.releaseDate)
       android.released.forEach(function (v) {
         if (android.releaseDate[v] === undefined) {
           android.releaseDate[v] = chrome.releaseDate[v]
    diff --git a/tools/node_modules/eslint/node_modules/browserslist/package.json b/tools/node_modules/eslint/node_modules/browserslist/package.json
    index 13bd3cd132ba29..55225bea61624c 100644
    --- a/tools/node_modules/eslint/node_modules/browserslist/package.json
    +++ b/tools/node_modules/eslint/node_modules/browserslist/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "browserslist",
    -  "version": "4.22.1",
    +  "version": "4.22.2",
       "description": "Share target browsers between different front-end tools, like Autoprefixer, Stylelint and babel-env-preset",
       "keywords": [
         "caniuse",
    @@ -25,9 +25,9 @@
       "license": "MIT",
       "repository": "browserslist/browserslist",
       "dependencies": {
    -    "caniuse-lite": "^1.0.30001541",
    -    "electron-to-chromium": "^1.4.535",
    -    "node-releases": "^2.0.13",
    +    "caniuse-lite": "^1.0.30001565",
    +    "electron-to-chromium": "^1.4.601",
    +    "node-releases": "^2.0.14",
         "update-browserslist-db": "^1.0.13"
       },
       "engines": {
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/agents.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/agents.js
    index dfe73f2831b71b..4b561b4a53c993 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/agents.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/agents.js
    @@ -1 +1 @@
    -module.exports={A:{A:{J:0,D:0,E:0.0259843,F:0.0649608,A:0,B:0.389765,NC:0},B:"ms",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","NC","J","D","E","F","A","B","","",""],E:"IE",F:{NC:962323200,J:998870400,D:1161129600,E:1237420800,F:1300060800,A:1346716800,B:1381968000}},B:{A:{"0":0.02721,"1":0.176865,"2":0.14512,"3":2.54867,C:0.004535,K:0.004535,L:0.004535,G:0.004535,M:0,N:0.004535,O:0.013605,P:0,Q:0.00907,R:0.00907,S:0.00907,T:0.00907,U:0.004535,V:0.00907,W:0.004535,X:0.004535,Y:0.004535,Z:0.00907,a:0,b:0.013605,c:0,d:0,e:0,f:0,g:0,h:0,i:0.013605,j:0,k:0,l:0,m:0,r:0,s:0,t:0,u:0.00907,v:0.00907,w:0.07256,x:0.013605,y:0.12698,z:0.12698,H:1.76865},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","C","K","L","G","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","r","s","t","u","v","w","x","y","z","0","1","2","3","H","","",""],E:"Edge",F:{"0":1683158400,"1":1685664000,"2":1689897600,"3":1692576000,C:1438128000,K:1447286400,L:1470096000,G:1491868800,M:1508198400,N:1525046400,O:1542067200,P:1579046400,Q:1581033600,R:1586736000,S:1590019200,T:1594857600,U:1598486400,V:1602201600,W:1605830400,X:1611360000,Y:1614816000,Z:1618358400,a:1622073600,b:1626912000,c:1630627200,d:1632441600,e:1634774400,f:1637539200,g:1641427200,h:1643932800,i:1646265600,j:1649635200,k:1651190400,l:1653955200,m:1655942400,r:1659657600,s:1661990400,t:1664755200,u:1666915200,v:1670198400,w:1673481600,x:1675900800,y:1678665600,z:1680825600,H:1694649600},D:{C:"ms",K:"ms",L:"ms",G:"ms",M:"ms",N:"ms",O:"ms"}},C:{A:{"0":0.01814,"1":0.01814,"2":0.31745,"3":0.113375,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,OC:0,"3B":0,I:0,J:0,D:0,E:0,F:0,A:0,B:0.00907,C:0,K:0,L:0,G:0,M:0,N:0,O:0,n:0,o:0,p:0,AB:0,BB:0,CB:0,DB:0,EB:0,FB:0,GB:0,HB:0,IB:0,JB:0,KB:0,LB:0,MB:0,NB:0,OB:0,PB:0,QB:0.004535,RB:0.004535,SB:0.004535,TB:0,UB:0,VB:0.01814,WB:0,XB:0.00907,YB:0,ZB:0.05442,aB:0.00907,bB:0.00907,cB:0,dB:0.013605,eB:0,fB:0,"4B":0.004535,gB:0,"5B":0,hB:0,iB:0,jB:0,kB:0,lB:0,mB:0,nB:0,oB:0,pB:0,qB:0,rB:0.013605,q:0,sB:0,tB:0,uB:0,vB:0,wB:0.03628,P:0,Q:0,R:0,"6B":0,S:0.004535,T:0,U:0,V:0,W:0,X:0.004535,Y:0.004535,Z:0,a:0.004535,b:0,c:0,d:0.004535,e:0,f:0,g:0,h:0,i:0,j:0,k:0,l:0.11791,m:0.022675,r:0,s:0.004535,t:0.004535,u:0.004535,v:0.00907,w:0.00907,x:0.00907,y:0.00907,z:0.06349,H:1.56457,xB:0.13605,"7B":0,"8B":0,PC:0,QC:0,RC:0},B:"moz",C:["OC","3B","QC","RC","I","4","J","D","E","F","A","B","C","K","L","G","M","N","O","5","n","o","p","6","7","8","9","AB","BB","CB","DB","EB","FB","GB","HB","IB","JB","KB","LB","MB","NB","OB","PB","QB","RB","SB","TB","UB","VB","WB","XB","YB","ZB","aB","bB","cB","dB","eB","fB","4B","gB","5B","hB","iB","jB","kB","lB","mB","nB","oB","pB","qB","rB","q","sB","tB","uB","vB","wB","P","Q","R","6B","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","r","s","t","u","v","w","x","y","z","0","1","2","3","H","xB","7B","8B","PC"],E:"Firefox",F:{"0":1683590400,"1":1686009600,"2":1688428800,"3":1690848000,"4":1308614400,"5":1357603200,"6":1372118400,"7":1375747200,"8":1379376000,"9":1386633600,OC:1161648000,"3B":1213660800,QC:1246320000,RC:1264032000,I:1300752000,J:1313452800,D:1317081600,E:1317081600,F:1320710400,A:1324339200,B:1327968000,C:1331596800,K:1335225600,L:1338854400,G:1342483200,M:1346112000,N:1349740800,O:1353628800,n:1361232000,o:1364860800,p:1368489600,AB:1391472000,BB:1395100800,CB:1398729600,DB:1402358400,EB:1405987200,FB:1409616000,GB:1413244800,HB:1417392000,IB:1421107200,JB:1424736000,KB:1428278400,LB:1431475200,MB:1435881600,NB:1439251200,OB:1442880000,PB:1446508800,QB:1450137600,RB:1453852800,SB:1457395200,TB:1461628800,UB:1465257600,VB:1470096000,WB:1474329600,XB:1479168000,YB:1485216000,ZB:1488844800,aB:1492560000,bB:1497312000,cB:1502150400,dB:1506556800,eB:1510617600,fB:1516665600,"4B":1520985600,gB:1525824000,"5B":1529971200,hB:1536105600,iB:1540252800,jB:1544486400,kB:1548720000,lB:1552953600,mB:1558396800,nB:1562630400,oB:1567468800,pB:1571788800,qB:1575331200,rB:1578355200,q:1581379200,sB:1583798400,tB:1586304000,uB:1588636800,vB:1591056000,wB:1593475200,P:1595894400,Q:1598313600,R:1600732800,"6B":1603152000,S:1605571200,T:1607990400,U:1611619200,V:1614038400,W:1616457600,X:1618790400,Y:1622505600,Z:1626134400,a:1628553600,b:1630972800,c:1633392000,d:1635811200,e:1638835200,f:1641859200,g:1644364800,h:1646697600,i:1649116800,j:1651536000,k:1653955200,l:1656374400,m:1658793600,r:1661212800,s:1663632000,t:1666051200,u:1668470400,v:1670889600,w:1673913600,x:1676332800,y:1678752000,z:1681171200,H:1693267200,xB:1695686400,"7B":null,"8B":null,PC:null}},D:{A:{"0":0.15419,"1":0.829905,"2":1.44213,"3":15.3691,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,I:0,J:0,D:0,E:0,F:0,A:0,B:0,C:0,K:0,L:0,G:0,M:0,N:0,O:0,n:0,o:0,p:0,AB:0,BB:0,CB:0,DB:0,EB:0,FB:0,GB:0,HB:0.004535,IB:0,JB:0,KB:0,LB:0.013605,MB:0,NB:0,OB:0,PB:0,QB:0,RB:0,SB:0,TB:0,UB:0.00907,VB:0.01814,WB:0.03628,XB:0.00907,YB:0.004535,ZB:0,aB:0.00907,bB:0,cB:0.00907,dB:0.031745,eB:0.00907,fB:0.00907,"4B":0,gB:0.02721,"5B":0.004535,hB:0.004535,iB:0.004535,jB:0,kB:0.013605,lB:0.022675,mB:0.004535,nB:0.031745,oB:0.06349,pB:0.077095,qB:0.022675,rB:0.031745,q:0.040815,sB:0.040815,tB:0.040815,uB:0.104305,vB:0.03628,wB:0.04535,P:0.204075,Q:0.068025,R:0.06349,S:0.113375,T:0.03628,U:0.086165,V:0.0907,W:0.09977,X:0.058955,Y:0.04535,Z:0.068025,a:0.07256,b:0.02721,c:0.131515,d:0.02721,e:0.013605,f:0.022675,g:0.02721,h:0.068025,i:0.04535,j:0.031745,k:0.03628,l:0.040815,m:0.21768,r:0.04535,s:0.049885,t:0.05442,u:0.17233,v:0.213145,w:1.78679,x:0.185935,y:0.32652,z:0.24489,H:3.86382,xB:0.022675,"7B":0.013605,"8B":0},B:"webkit",C:["","","","","","","I","4","J","D","E","F","A","B","C","K","L","G","M","N","O","5","n","o","p","6","7","8","9","AB","BB","CB","DB","EB","FB","GB","HB","IB","JB","KB","LB","MB","NB","OB","PB","QB","RB","SB","TB","UB","VB","WB","XB","YB","ZB","aB","bB","cB","dB","eB","fB","4B","gB","5B","hB","iB","jB","kB","lB","mB","nB","oB","pB","qB","rB","q","sB","tB","uB","vB","wB","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","r","s","t","u","v","w","x","y","z","0","1","2","3","H","xB","7B","8B"],E:"Chrome",F:{"0":1682985600,"1":1685404800,"2":1689724800,"3":1692057600,"4":1274745600,"5":1332892800,"6":1348531200,"7":1352246400,"8":1357862400,"9":1361404800,I:1264377600,J:1283385600,D:1287619200,E:1291248000,F:1296777600,A:1299542400,B:1303862400,C:1307404800,K:1312243200,L:1316131200,G:1316131200,M:1319500800,N:1323734400,O:1328659200,n:1337040000,o:1340668800,p:1343692800,AB:1364428800,BB:1369094400,CB:1374105600,DB:1376956800,EB:1384214400,FB:1389657600,GB:1392940800,HB:1397001600,IB:1400544000,JB:1405468800,KB:1409011200,LB:1412640000,MB:1416268800,NB:1421798400,OB:1425513600,PB:1429401600,QB:1432080000,RB:1437523200,SB:1441152000,TB:1444780800,UB:1449014400,VB:1453248000,WB:1456963200,XB:1460592000,YB:1464134400,ZB:1469059200,aB:1472601600,bB:1476230400,cB:1480550400,dB:1485302400,eB:1489017600,fB:1492560000,"4B":1496707200,gB:1500940800,"5B":1504569600,hB:1508198400,iB:1512518400,jB:1516752000,kB:1520294400,lB:1523923200,mB:1527552000,nB:1532390400,oB:1536019200,pB:1539648000,qB:1543968000,rB:1548720000,q:1552348800,sB:1555977600,tB:1559606400,uB:1564444800,vB:1568073600,wB:1571702400,P:1575936000,Q:1580860800,R:1586304000,S:1589846400,T:1594684800,U:1598313600,V:1601942400,W:1605571200,X:1611014400,Y:1614556800,Z:1618272000,a:1621987200,b:1626739200,c:1630368000,d:1632268800,e:1634601600,f:1637020800,g:1641340800,h:1643673600,i:1646092800,j:1648512000,k:1650931200,l:1653350400,m:1655769600,r:1659398400,s:1661817600,t:1664236800,u:1666656000,v:1669680000,w:1673308800,x:1675728000,y:1678147200,z:1680566400,H:1694476800,xB:null,"7B":null,"8B":null}},E:{A:{"4":0,I:0,J:0,D:0,E:0,F:0,A:0,B:0,C:0,K:0.01814,L:0.0907,G:0.01814,SC:0,"9B":0,TC:0.00907,UC:0,VC:0,WC:0.1814,AC:0,yB:0.004535,zB:0.02721,BC:0.131515,XC:0.240355,YC:0.040815,CC:0.03628,DC:0.068025,"0B":0.10884,ZC:0.5442,"1B":0.068025,EC:0.158725,FC:0.15419,GC:0.3628,HC:0.185935,IC:0.44443,JC:2.50332,"2B":0.09977,KC:0,aC:0},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","SC","9B","I","4","TC","J","UC","D","VC","E","F","WC","A","AC","B","yB","C","zB","K","BC","L","XC","G","YC","CC","DC","0B","ZC","1B","EC","FC","GC","HC","IC","JC","2B","KC","aC",""],E:"Safari",F:{"4":1275868800,SC:1205798400,"9B":1226534400,I:1244419200,TC:1311120000,J:1343174400,UC:1382400000,D:1382400000,VC:1410998400,E:1413417600,F:1443657600,WC:1458518400,A:1474329600,AC:1490572800,B:1505779200,yB:1522281600,C:1537142400,zB:1553472000,K:1568851200,BC:1585008000,L:1600214400,XC:1619395200,G:1632096000,YC:1635292800,CC:1639353600,DC:1647216000,"0B":1652745600,ZC:1658275200,"1B":1662940800,EC:1666569600,FC:1670889600,GC:1674432000,HC:1679875200,IC:1684368000,JC:1690156800,"2B":1695686400,KC:null,aC:null}},F:{A:{"5":0,"6":0,"7":0,"8":0,"9":0,F:0,B:0,C:0,G:0,M:0,N:0,O:0,n:0,o:0,p:0,AB:0,BB:0.004535,CB:0,DB:0,EB:0,FB:0,GB:0,HB:0,IB:0,JB:0,KB:0,LB:0,MB:0,NB:0,OB:0,PB:0,QB:0,RB:0,SB:0,TB:0.013605,UB:0,VB:0,WB:0,XB:0,YB:0,ZB:0,aB:0,bB:0.004535,cB:0.004535,dB:0,eB:0,fB:0,gB:0,hB:0,iB:0,jB:0,kB:0,lB:0,mB:0,nB:0,oB:0,pB:0,qB:0,rB:0,q:0,sB:0,tB:0,uB:0,vB:0.004535,wB:0,P:0,Q:0,R:0,"6B":0,S:0,T:0,U:0.004535,V:0,W:0,X:0,Y:0.004535,Z:0,a:0,b:0,c:0,d:0,e:0.05442,f:0,g:0.11791,h:0,i:0.022675,j:0.26303,k:0.58048,l:0.64397,m:0,bC:0,cC:0,dC:0,eC:0,yB:0,LC:0,fC:0,zB:0},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","F","bC","cC","dC","eC","B","yB","LC","fC","C","zB","G","M","N","O","5","n","o","p","6","7","8","9","AB","BB","CB","DB","EB","FB","GB","HB","IB","JB","KB","LB","MB","NB","OB","PB","QB","RB","SB","TB","UB","VB","WB","XB","YB","ZB","aB","bB","cB","dB","eB","fB","gB","hB","iB","jB","kB","lB","mB","nB","oB","pB","qB","rB","q","sB","tB","uB","vB","wB","P","Q","R","6B","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","","",""],E:"Opera",F:{"5":1390867200,"6":1405987200,"7":1409616000,"8":1413331200,"9":1417132800,F:1150761600,bC:1223424000,cC:1251763200,dC:1267488000,eC:1277942400,B:1292457600,yB:1302566400,LC:1309219200,fC:1323129600,C:1323129600,zB:1352073600,G:1372723200,M:1377561600,N:1381104000,O:1386288000,n:1393891200,o:1399334400,p:1401753600,AB:1422316800,BB:1425945600,CB:1430179200,DB:1433808000,EB:1438646400,FB:1442448000,GB:1445904000,HB:1449100800,IB:1454371200,JB:1457308800,KB:1462320000,LB:1465344000,MB:1470096000,NB:1474329600,OB:1477267200,PB:1481587200,QB:1486425600,RB:1490054400,SB:1494374400,TB:1498003200,UB:1502236800,VB:1506470400,WB:1510099200,XB:1515024000,YB:1517961600,ZB:1521676800,aB:1525910400,bB:1530144000,cB:1534982400,dB:1537833600,eB:1543363200,fB:1548201600,gB:1554768000,hB:1561593600,iB:1566259200,jB:1570406400,kB:1573689600,lB:1578441600,mB:1583971200,nB:1587513600,oB:1592956800,pB:1595894400,qB:1600128000,rB:1603238400,q:1613520000,sB:1612224000,tB:1616544000,uB:1619568000,vB:1623715200,wB:1627948800,P:1631577600,Q:1633392000,R:1635984000,"6B":1638403200,S:1642550400,T:1644969600,U:1647993600,V:1650412800,W:1652745600,X:1654646400,Y:1657152000,Z:1660780800,a:1663113600,b:1668816000,c:1668643200,d:1671062400,e:1675209600,f:1677024000,g:1679529600,h:1681948800,i:1684195200,j:1687219200,k:1690329600,l:1692748800,m:1696204800},D:{F:"o",B:"o",C:"o",bC:"o",cC:"o",dC:"o",eC:"o",yB:"o",LC:"o",fC:"o",zB:"o"}},G:{A:{E:0,"9B":0,gC:0,MC:0.00285607,hC:0.00285607,iC:0.00285607,jC:0.00999624,kC:0.00285607,lC:0.00999624,mC:0.0342728,nC:0.00142803,oC:0.0514092,pC:0.0214205,qC:0.0157084,rC:0.0142803,sC:0.238482,tC:0.00714017,uC:0.0128523,vC:0.155656,wC:0.0499812,xC:0.135663,yC:0.225629,zC:0.0899662,CC:0.0985344,DC:0.112815,"0B":0.157084,"0C":1.03961,"1B":0.411274,EC:0.761142,FC:0.386997,GC:0.722585,HC:0.164224,IC:0.489816,JC:7.98414,"2B":0.704021,KC:0.00142803},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","9B","gC","MC","hC","iC","jC","E","kC","lC","mC","nC","oC","pC","qC","rC","sC","tC","uC","vC","wC","xC","yC","zC","CC","DC","0B","0C","1B","EC","FC","GC","HC","IC","JC","2B","KC","",""],E:"Safari on iOS",F:{"9B":1270252800,gC:1283904000,MC:1299628800,hC:1331078400,iC:1359331200,jC:1394409600,E:1410912000,kC:1413763200,lC:1442361600,mC:1458518400,nC:1473724800,oC:1490572800,pC:1505779200,qC:1522281600,rC:1537142400,sC:1553472000,tC:1568851200,uC:1572220800,vC:1580169600,wC:1585008000,xC:1600214400,yC:1619395200,zC:1632096000,CC:1639353600,DC:1647216000,"0B":1652659200,"0C":1658275200,"1B":1662940800,EC:1666569600,FC:1670889600,GC:1674432000,HC:1679875200,IC:1684368000,JC:1690156800,"2B":1694995200,KC:null}},H:{A:{"1C":1.02942},B:"o",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1C","","",""],E:"Opera Mini",F:{"1C":1426464000}},I:{A:{"3B":0,I:0.0156469,H:0,"2C":0,"3C":0.0156469,"4C":0,"5C":0.0156469,MC:0.0547642,"6C":0,"7C":0.242527},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","2C","3C","4C","3B","I","5C","MC","6C","7C","H","","",""],E:"Android Browser",F:{"2C":1256515200,"3C":1274313600,"4C":1291593600,"3B":1298332800,I:1318896000,"5C":1341792000,MC:1374624000,"6C":1386547200,"7C":1401667200,H:1694476800}},J:{A:{D:0,A:0},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","D","A","","",""],E:"Blackberry Browser",F:{D:1325376000,A:1359504000}},K:{A:{A:0,B:0,C:0,q:0,yB:0,LC:0,zB:0},B:"o",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","A","B","yB","LC","C","zB","q","","",""],E:"Opera Mobile",F:{A:1287100800,B:1300752000,yB:1314835200,LC:1318291200,C:1330300800,zB:1349740800,q:1673827200},D:{q:"webkit"}},L:{A:{H:36.3803},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","H","","",""],E:"Chrome for Android",F:{H:1694476800}},M:{A:{xB:0.278664},B:"moz",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","xB","","",""],E:"Firefox for Android",F:{xB:1695686400}},N:{A:{A:0,B:0},B:"ms",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","A","B","","",""],E:"IE Mobile",F:{A:1340150400,B:1353456000}},O:{A:{"0B":0.890632},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","0B","","",""],E:"UC Browser for Android",F:{"0B":1687132800},D:{"0B":"webkit"}},P:{A:{I:0.107075,n:0.0642449,o:0.139197,p:1.87381,"8C":0,"9C":0,AD:0.0321224,BD:0,CD:0,AC:0,DD:0.0107075,ED:0,FD:0.021415,GD:0.0107075,HD:0,"1B":0.021415,"2B":0.0321224,ID:0.021415,JD:0.0535374},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","I","8C","9C","AD","BD","CD","AC","DD","ED","FD","GD","HD","1B","2B","ID","JD","n","o","p","","",""],E:"Samsung Internet",F:{I:1461024000,"8C":1481846400,"9C":1509408000,AD:1528329600,BD:1546128000,CD:1554163200,AC:1567900800,DD:1582588800,ED:1593475200,FD:1605657600,GD:1618531200,HD:1629072000,"1B":1640736000,"2B":1651708800,ID:1659657600,JD:1667260800,n:1677369600,o:1684454400,p:1689292800}},Q:{A:{BC:0.16392},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","BC","","",""],E:"QQ Browser",F:{BC:1663718400}},R:{A:{KD:0},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","KD","","",""],E:"Baidu Browser",F:{KD:1663027200}},S:{A:{LD:0.05464,MD:0},B:"moz",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","LD","MD","","",""],E:"KaiOS Browser",F:{LD:1527811200,MD:1631664000}}};
    +module.exports={A:{A:{J:0,E:0,F:0.0125552,G:0.062776,A:0,B:0.364101,QC:0},B:"ms",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","QC","J","E","F","G","A","B","","",""],E:"IE",F:{QC:962323200,J:998870400,E:1161129600,F:1237420800,G:1300060800,A:1346716800,B:1381968000}},B:{A:{"0":0.013452,"1":0.017936,"2":0.02242,"3":0.026904,"4":0.040356,"5":0.461852,"6":0.816088,"7":0,C:0.008968,K:0.008968,L:0.013452,H:0.008968,M:0,N:0.004484,O:0.008968,P:0,Q:0,R:0,S:0,T:0.004484,U:0.004484,V:0,W:0.219716,X:0,Y:0,Z:0,a:0,b:0.013452,c:0,d:0,e:0,f:0,g:0,h:0,i:0.017936,j:0,k:0,l:0,m:0,n:0,t:0,u:0.004484,v:0.008968,w:0.013452,x:0.085196,y:0.013452,z:0.013452,D:3.48407},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","C","K","L","H","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","t","u","v","w","x","y","z","0","1","2","3","4","5","6","D","7","","",""],E:"Edge",F:{"0":1680825600,"1":1683158400,"2":1685664000,"3":1689897600,"4":1692576000,"5":1694649600,"6":1697155200,"7":1701993600,C:1438128000,K:1447286400,L:1470096000,H:1491868800,M:1508198400,N:1525046400,O:1542067200,P:1579046400,Q:1581033600,R:1586736000,S:1590019200,T:1594857600,U:1598486400,V:1602201600,W:1605830400,X:1611360000,Y:1614816000,Z:1618358400,a:1622073600,b:1626912000,c:1630627200,d:1632441600,e:1634774400,f:1637539200,g:1641427200,h:1643932800,i:1646265600,j:1649635200,k:1651190400,l:1653955200,m:1655942400,n:1659657600,t:1661990400,u:1664755200,v:1666915200,w:1670198400,x:1673481600,y:1675900800,z:1678665600,D:1698969600},D:{C:"ms",K:"ms",L:"ms",H:"ms",M:"ms",N:"ms",O:"ms"}},C:{A:{"0":0.008968,"1":0.017936,"2":0.017936,"3":0.372172,"4":0.017936,"5":0.017936,"6":0.13452,"7":0.372172,"8":0,"9":0,RC:0,"5B":0,I:0,J:0,E:0.004484,F:0,G:0,A:0,B:0.026904,C:0.013452,K:0,L:0,H:0,M:0,N:0,O:0,o:0,p:0,q:0,r:0,AB:0,BB:0,CB:0,DB:0,EB:0,FB:0,GB:0,HB:0,IB:0,JB:0,KB:0,LB:0,MB:0,NB:0,OB:0,PB:0,QB:0,RB:0,SB:0,TB:0.004484,UB:0.004484,VB:0,WB:0,XB:0,YB:0.031388,ZB:0,aB:0.013452,bB:0,cB:0.062776,dB:0.008968,eB:0.017936,fB:0.004484,gB:0.02242,hB:0,iB:0,"6B":0.008968,jB:0,"7B":0,kB:0,lB:0.004484,mB:0,nB:0,oB:0,pB:0,qB:0.004484,rB:0,sB:0,tB:0,uB:0.008968,s:0,vB:0,wB:0,xB:0,yB:0.004484,zB:0.026904,P:0,Q:0,R:0,"8B":0,S:0.004484,T:0,U:0,V:0,W:0,X:0.008968,Y:0,Z:0,a:0.013452,b:0,c:0,d:0.004484,e:0,f:0,g:0,h:0,i:0,j:0,k:0.004484,l:0.031388,m:0.031388,n:0,t:0.004484,u:0.004484,v:0.004484,w:0.008968,x:0.008968,y:0.008968,z:0.008968,D:1.43488,"9B":0,AC:0,BC:0,SC:0,TC:0},B:"moz",C:["RC","5B","SC","TC","I","8","J","E","F","G","A","B","C","K","L","H","M","N","O","9","o","p","q","r","AB","BB","CB","DB","EB","FB","GB","HB","IB","JB","KB","LB","MB","NB","OB","PB","QB","RB","SB","TB","UB","VB","WB","XB","YB","ZB","aB","bB","cB","dB","eB","fB","gB","hB","iB","6B","jB","7B","kB","lB","mB","nB","oB","pB","qB","rB","sB","tB","uB","s","vB","wB","xB","yB","zB","P","Q","R","8B","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","t","u","v","w","x","y","z","0","1","2","3","4","5","6","D","7","9B","AC","BC"],E:"Firefox",F:{"0":1681171200,"1":1683590400,"2":1686009600,"3":1688428800,"4":1690848000,"5":1693267200,"6":1695686400,"7":1700524800,"8":1308614400,"9":1357603200,RC:1161648000,"5B":1213660800,SC:1246320000,TC:1264032000,I:1300752000,J:1313452800,E:1317081600,F:1317081600,G:1320710400,A:1324339200,B:1327968000,C:1331596800,K:1335225600,L:1338854400,H:1342483200,M:1346112000,N:1349740800,O:1353628800,o:1361232000,p:1364860800,q:1368489600,r:1372118400,AB:1375747200,BB:1379376000,CB:1386633600,DB:1391472000,EB:1395100800,FB:1398729600,GB:1402358400,HB:1405987200,IB:1409616000,JB:1413244800,KB:1417392000,LB:1421107200,MB:1424736000,NB:1428278400,OB:1431475200,PB:1435881600,QB:1439251200,RB:1442880000,SB:1446508800,TB:1450137600,UB:1453852800,VB:1457395200,WB:1461628800,XB:1465257600,YB:1470096000,ZB:1474329600,aB:1479168000,bB:1485216000,cB:1488844800,dB:1492560000,eB:1497312000,fB:1502150400,gB:1506556800,hB:1510617600,iB:1516665600,"6B":1520985600,jB:1525824000,"7B":1529971200,kB:1536105600,lB:1540252800,mB:1544486400,nB:1548720000,oB:1552953600,pB:1558396800,qB:1562630400,rB:1567468800,sB:1571788800,tB:1575331200,uB:1578355200,s:1581379200,vB:1583798400,wB:1586304000,xB:1588636800,yB:1591056000,zB:1593475200,P:1595894400,Q:1598313600,R:1600732800,"8B":1603152000,S:1605571200,T:1607990400,U:1611619200,V:1614038400,W:1616457600,X:1618790400,Y:1622505600,Z:1626134400,a:1628553600,b:1630972800,c:1633392000,d:1635811200,e:1638835200,f:1641859200,g:1644364800,h:1646697600,i:1649116800,j:1651536000,k:1653955200,l:1656374400,m:1658793600,n:1661212800,t:1663632000,u:1666051200,v:1668470400,w:1670889600,x:1673913600,y:1676332800,z:1678752000,D:1698105600,"9B":null,AC:null,BC:null}},D:{A:{"0":0.116584,"1":0.20178,"2":0.219716,"3":0.147972,"4":0.497724,"5":0.69502,"6":5.40322,"7":0.02242,"8":0,"9":0,I:0,J:0,E:0,F:0,G:0,A:0,B:0,C:0,K:0,L:0,H:0,M:0,N:0,O:0,o:0,p:0,q:0,r:0,AB:0,BB:0,CB:0,DB:0,EB:0,FB:0,GB:0,HB:0,IB:0,JB:0,KB:0.004484,LB:0,MB:0,NB:0,OB:0.013452,PB:0,QB:0,RB:0.004484,SB:0,TB:0,UB:0,VB:0.008968,WB:0,XB:0.008968,YB:0.026904,ZB:0.031388,aB:0.008968,bB:0.004484,cB:0.004484,dB:0.008968,eB:0,fB:0.008968,gB:0.026904,hB:0.013452,iB:0.004484,"6B":0,jB:0.035872,"7B":0.013452,kB:0,lB:0.008968,mB:0.004484,nB:0.008968,oB:0.02242,pB:0.004484,qB:0.013452,rB:0.049324,sB:0.192812,tB:0.013452,uB:0.017936,s:0.026904,vB:0.026904,wB:0.02242,xB:0.058292,yB:0.02242,zB:0.026904,P:0.161424,Q:0.049324,R:0.04484,S:0.053808,T:0.026904,U:0.076228,V:0.062776,W:0.08968,X:0.026904,Y:0.026904,Z:0.035872,a:0.080712,b:0.040356,c:0.116584,d:0.040356,e:0.017936,f:0.017936,g:0.02242,h:0.06726,i:0.035872,j:0.035872,k:0.049324,l:0.035872,m:0.38114,n:0.049324,t:0.049324,u:0.062776,v:0.058292,w:0.1121,x:1.78912,y:0.080712,z:0.094164,D:14.703,"9B":0.013452,AC:0,BC:0},B:"webkit",C:["","","","","","I","8","J","E","F","G","A","B","C","K","L","H","M","N","O","9","o","p","q","r","AB","BB","CB","DB","EB","FB","GB","HB","IB","JB","KB","LB","MB","NB","OB","PB","QB","RB","SB","TB","UB","VB","WB","XB","YB","ZB","aB","bB","cB","dB","eB","fB","gB","hB","iB","6B","jB","7B","kB","lB","mB","nB","oB","pB","qB","rB","sB","tB","uB","s","vB","wB","xB","yB","zB","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","t","u","v","w","x","y","z","0","1","2","3","4","5","6","D","7","9B","AC","BC"],E:"Chrome",F:{"0":1680566400,"1":1682985600,"2":1685404800,"3":1689724800,"4":1692057600,"5":1694476800,"6":1696896000,"7":1701993600,"8":1274745600,"9":1332892800,I:1264377600,J:1283385600,E:1287619200,F:1291248000,G:1296777600,A:1299542400,B:1303862400,C:1307404800,K:1312243200,L:1316131200,H:1316131200,M:1319500800,N:1323734400,O:1328659200,o:1337040000,p:1340668800,q:1343692800,r:1348531200,AB:1352246400,BB:1357862400,CB:1361404800,DB:1364428800,EB:1369094400,FB:1374105600,GB:1376956800,HB:1384214400,IB:1389657600,JB:1392940800,KB:1397001600,LB:1400544000,MB:1405468800,NB:1409011200,OB:1412640000,PB:1416268800,QB:1421798400,RB:1425513600,SB:1429401600,TB:1432080000,UB:1437523200,VB:1441152000,WB:1444780800,XB:1449014400,YB:1453248000,ZB:1456963200,aB:1460592000,bB:1464134400,cB:1469059200,dB:1472601600,eB:1476230400,fB:1480550400,gB:1485302400,hB:1489017600,iB:1492560000,"6B":1496707200,jB:1500940800,"7B":1504569600,kB:1508198400,lB:1512518400,mB:1516752000,nB:1520294400,oB:1523923200,pB:1527552000,qB:1532390400,rB:1536019200,sB:1539648000,tB:1543968000,uB:1548720000,s:1552348800,vB:1555977600,wB:1559606400,xB:1564444800,yB:1568073600,zB:1571702400,P:1575936000,Q:1580860800,R:1586304000,S:1589846400,T:1594684800,U:1598313600,V:1601942400,W:1605571200,X:1611014400,Y:1614556800,Z:1618272000,a:1621987200,b:1626739200,c:1630368000,d:1632268800,e:1634601600,f:1637020800,g:1641340800,h:1643673600,i:1646092800,j:1648512000,k:1650931200,l:1653350400,m:1655769600,n:1659398400,t:1661817600,u:1664236800,v:1666656000,w:1669680000,x:1673308800,y:1675728000,z:1678147200,D:1698710400,"9B":null,AC:null,BC:null}},E:{A:{"8":0,I:0,J:0,E:0,F:0,G:0,A:0,B:0,C:0,K:0.013452,L:0.085196,H:0.017936,UC:0,CC:0,VC:0.008968,WC:0,XC:0,YC:0.06726,DC:0,"0B":0.008968,"1B":0.02242,EC:0.1121,ZC:0.206264,aC:0.040356,FC:0.031388,GC:0.06726,"2B":0.103132,bC:0.520144,"3B":0.06726,HC:0.17936,IC:0.165908,JC:0.367688,KC:0.143488,LC:0.295944,cC:2.08058,"4B":0.443916,MC:0.686052,NC:0.017936,dC:0,eC:0},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","UC","CC","I","8","VC","J","WC","E","XC","F","G","YC","A","DC","B","0B","C","1B","K","EC","L","ZC","H","aC","FC","GC","2B","bC","3B","HC","IC","JC","KC","LC","cC","4B","MC","NC","dC","eC",""],E:"Safari",F:{"8":1275868800,UC:1205798400,CC:1226534400,I:1244419200,VC:1311120000,J:1343174400,WC:1382400000,E:1382400000,XC:1410998400,F:1413417600,G:1443657600,YC:1458518400,A:1474329600,DC:1490572800,B:1505779200,"0B":1522281600,C:1537142400,"1B":1553472000,K:1568851200,EC:1585008000,L:1600214400,ZC:1619395200,H:1632096000,aC:1635292800,FC:1639353600,GC:1647216000,"2B":1652745600,bC:1658275200,"3B":1662940800,HC:1666569600,IC:1670889600,JC:1674432000,KC:1679875200,LC:1684368000,cC:1690156800,"4B":1695686400,MC:1698192000,NC:1702252800,dC:null,eC:null}},F:{A:{"9":0,G:0,B:0,C:0,H:0,M:0,N:0,O:0,o:0,p:0,q:0,r:0,AB:0,BB:0,CB:0,DB:0,EB:0,FB:0,GB:0,HB:0,IB:0,JB:0,KB:0,LB:0,MB:0,NB:0,OB:0,PB:0,QB:0,RB:0,SB:0,TB:0,UB:0,VB:0,WB:0.013452,XB:0,YB:0,ZB:0,aB:0,bB:0,cB:0,dB:0,eB:0,fB:0,gB:0,hB:0,iB:0,jB:0,kB:0,lB:0,mB:0,nB:0,oB:0,pB:0,qB:0,rB:0,sB:0,tB:0,uB:0,s:0,vB:0,wB:0,xB:0,yB:0,zB:0,P:0,Q:0,R:0,"8B":0,S:0,T:0,U:0,V:0,W:0,X:0,Y:0,Z:0,a:0,b:0,c:0,d:0,e:0.053808,f:0,g:0,h:0,i:0.004484,j:0.004484,k:0.004484,l:0.914736,m:0.161424,n:0.663632,fC:0,gC:0,hC:0,iC:0,"0B":0,OC:0,jC:0,"1B":0},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","G","fC","gC","hC","iC","B","0B","OC","jC","C","1B","H","M","N","O","9","o","p","q","r","AB","BB","CB","DB","EB","FB","GB","HB","IB","JB","KB","LB","MB","NB","OB","PB","QB","RB","SB","TB","UB","VB","WB","XB","YB","ZB","aB","bB","cB","dB","eB","fB","gB","hB","iB","jB","kB","lB","mB","nB","oB","pB","qB","rB","sB","tB","uB","s","vB","wB","xB","yB","zB","P","Q","R","8B","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","","",""],E:"Opera",F:{"9":1390867200,G:1150761600,fC:1223424000,gC:1251763200,hC:1267488000,iC:1277942400,B:1292457600,"0B":1302566400,OC:1309219200,jC:1323129600,C:1323129600,"1B":1352073600,H:1372723200,M:1377561600,N:1381104000,O:1386288000,o:1393891200,p:1399334400,q:1401753600,r:1405987200,AB:1409616000,BB:1413331200,CB:1417132800,DB:1422316800,EB:1425945600,FB:1430179200,GB:1433808000,HB:1438646400,IB:1442448000,JB:1445904000,KB:1449100800,LB:1454371200,MB:1457308800,NB:1462320000,OB:1465344000,PB:1470096000,QB:1474329600,RB:1477267200,SB:1481587200,TB:1486425600,UB:1490054400,VB:1494374400,WB:1498003200,XB:1502236800,YB:1506470400,ZB:1510099200,aB:1515024000,bB:1517961600,cB:1521676800,dB:1525910400,eB:1530144000,fB:1534982400,gB:1537833600,hB:1543363200,iB:1548201600,jB:1554768000,kB:1561593600,lB:1566259200,mB:1570406400,nB:1573689600,oB:1578441600,pB:1583971200,qB:1587513600,rB:1592956800,sB:1595894400,tB:1600128000,uB:1603238400,s:1613520000,vB:1612224000,wB:1616544000,xB:1619568000,yB:1623715200,zB:1627948800,P:1631577600,Q:1633392000,R:1635984000,"8B":1638403200,S:1642550400,T:1644969600,U:1647993600,V:1650412800,W:1652745600,X:1654646400,Y:1657152000,Z:1660780800,a:1663113600,b:1668816000,c:1668643200,d:1671062400,e:1675209600,f:1677024000,g:1679529600,h:1681948800,i:1684195200,j:1687219200,k:1690329600,l:1692748800,m:1696204800,n:1699920000},D:{G:"o",B:"o",C:"o",fC:"o",gC:"o",hC:"o",iC:"o","0B":"o",OC:"o",jC:"o","1B":"o"}},G:{A:{F:0,CC:0,kC:0,PC:0.00276131,lC:0.00276131,mC:0.00690327,nC:0.00966458,oC:0.00138065,pC:0.0110452,qC:0.0345164,rC:0.00276131,sC:0.0497036,tC:0.0248518,uC:0.0207098,vC:0.0124259,wC:0.226427,xC:0.00552262,yC:0.0248518,zC:0.0138065,"0C":0.040039,"1C":0.107691,"2C":0.171201,"3C":0.0690327,FC:0.0828393,GC:0.0925039,"2B":0.129782,"4C":0.682043,"3B":0.320312,HC:0.642004,IC:0.306505,JC:0.575733,KC:0.121498,LC:0.306505,"5C":5.19264,"4B":1.556,MC:2.6122,NC:0.0731747},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","CC","kC","PC","lC","mC","nC","F","oC","pC","qC","rC","sC","tC","uC","vC","wC","xC","yC","zC","0C","1C","2C","3C","FC","GC","2B","4C","3B","HC","IC","JC","KC","LC","5C","4B","MC","NC","",""],E:"Safari on iOS",F:{CC:1270252800,kC:1283904000,PC:1299628800,lC:1331078400,mC:1359331200,nC:1394409600,F:1410912000,oC:1413763200,pC:1442361600,qC:1458518400,rC:1473724800,sC:1490572800,tC:1505779200,uC:1522281600,vC:1537142400,wC:1553472000,xC:1568851200,yC:1572220800,zC:1580169600,"0C":1585008000,"1C":1600214400,"2C":1619395200,"3C":1632096000,FC:1639353600,GC:1647216000,"2B":1652659200,"4C":1658275200,"3B":1662940800,HC:1666569600,IC:1670889600,JC:1674432000,KC:1679875200,LC:1684368000,"5C":1690156800,"4B":1694995200,MC:1698192000,NC:null}},H:{A:{"6C":0.06},B:"o",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","6C","","",""],E:"Opera Mini",F:{"6C":1426464000}},I:{A:{"5B":0.0000512988,I:0.000102598,D:0.510372,"7C":0,"8C":0.000102598,"9C":0,AD:0.0000512988,PC:0.000359092,BD:0,CD:0.00148767},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","7C","8C","9C","5B","I","AD","PC","BD","CD","D","","",""],E:"Android Browser",F:{"7C":1256515200,"8C":1274313600,"9C":1291593600,"5B":1298332800,I:1318896000,AD:1341792000,PC:1374624000,BD:1386547200,CD:1401667200,D:1698710400}},J:{A:{E:0,A:0},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","E","A","","",""],E:"Blackberry Browser",F:{E:1325376000,A:1359504000}},K:{A:{A:0,B:0,C:0,s:1.08181,"0B":0,OC:0,"1B":0},B:"o",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","A","B","0B","OC","C","1B","s","","",""],E:"Opera Mobile",F:{A:1287100800,B:1300752000,"0B":1314835200,OC:1318291200,C:1330300800,"1B":1349740800,s:1673827200},D:{s:"webkit"}},L:{A:{D:36.3992},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","D","","",""],E:"Chrome for Android",F:{D:1698710400}},M:{A:{D:0.286832},B:"moz",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","D","","",""],E:"Firefox for Android",F:{D:1698105600}},N:{A:{A:0,B:0},B:"ms",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","A","B","","",""],E:"IE Mobile",F:{A:1340150400,B:1353456000}},O:{A:{"2B":0.794304},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","2B","","",""],E:"UC Browser for Android",F:{"2B":1687132800},D:{"2B":"webkit"}},P:{A:{I:0.109121,o:0.0436483,p:0.0982088,q:0.250978,r:1.83323,DD:0,ED:0,FD:0.0327363,GD:0,HD:0,DC:0,ID:0.0109121,JD:0,KD:0.0109121,LD:0,MD:0,"3B":0.0218242,"4B":0.0327363,ND:0.0218242,OD:0.0436483},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","I","DD","ED","FD","GD","HD","DC","ID","JD","KD","LD","MD","3B","4B","ND","OD","o","p","q","r","","",""],E:"Samsung Internet",F:{I:1461024000,DD:1481846400,ED:1509408000,FD:1528329600,GD:1546128000,HD:1554163200,DC:1567900800,ID:1582588800,JD:1593475200,KD:1605657600,LD:1618531200,MD:1629072000,"3B":1640736000,"4B":1651708800,ND:1659657600,OD:1667260800,o:1677369600,p:1684454400,q:1689292800,r:1697587200}},Q:{A:{EC:0.143416},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","EC","","",""],E:"QQ Browser",F:{EC:1663718400}},R:{A:{PD:0},B:"webkit",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","PD","","",""],E:"Baidu Browser",F:{PD:1663027200}},S:{A:{QD:0.066192,RD:0},B:"moz",C:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","QD","RD","","",""],E:"KaiOS Browser",F:{QD:1527811200,RD:1631664000}}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/browserVersions.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/browserVersions.js
    index cb228a7682528d..52b274205a2250 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/browserVersions.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/browserVersions.js
    @@ -1 +1 @@
    -module.exports={"0":"113","1":"114","2":"115","3":"116","4":"5","5":"19","6":"23","7":"24","8":"25","9":"26",A:"10",B:"11",C:"12",D:"7",E:"8",F:"9",G:"15",H:"117",I:"4",J:"6",K:"13",L:"14",M:"16",N:"17",O:"18",P:"79",Q:"80",R:"81",S:"83",T:"84",U:"85",V:"86",W:"87",X:"88",Y:"89",Z:"90",a:"91",b:"92",c:"93",d:"94",e:"95",f:"96",g:"97",h:"98",i:"99",j:"100",k:"101",l:"102",m:"103",n:"20",o:"21",p:"22",q:"73",r:"104",s:"105",t:"106",u:"107",v:"108",w:"109",x:"110",y:"111",z:"112",AB:"27",BB:"28",CB:"29",DB:"30",EB:"31",FB:"32",GB:"33",HB:"34",IB:"35",JB:"36",KB:"37",LB:"38",MB:"39",NB:"40",OB:"41",PB:"42",QB:"43",RB:"44",SB:"45",TB:"46",UB:"47",VB:"48",WB:"49",XB:"50",YB:"51",ZB:"52",aB:"53",bB:"54",cB:"55",dB:"56",eB:"57",fB:"58",gB:"60",hB:"62",iB:"63",jB:"64",kB:"65",lB:"66",mB:"67",nB:"68",oB:"69",pB:"70",qB:"71",rB:"72",sB:"74",tB:"75",uB:"76",vB:"77",wB:"78",xB:"118",yB:"11.1",zB:"12.1","0B":"15.5","1B":"16.0","2B":"17.0","3B":"3","4B":"59","5B":"61","6B":"82","7B":"119","8B":"120","9B":"3.2",AC:"10.1",BC:"13.1",CC:"15.2-15.3",DC:"15.4",EC:"16.1",FC:"16.2",GC:"16.3",HC:"16.4",IC:"16.5",JC:"16.6",KC:"17.1",LC:"11.5",MC:"4.2-4.3",NC:"5.5",OC:"2",PC:"121",QC:"3.5",RC:"3.6",SC:"3.1",TC:"5.1",UC:"6.1",VC:"7.1",WC:"9.1",XC:"14.1",YC:"15.1",ZC:"15.6",aC:"TP",bC:"9.5-9.6",cC:"10.0-10.1",dC:"10.5",eC:"10.6",fC:"11.6",gC:"4.0-4.1",hC:"5.0-5.1",iC:"6.0-6.1",jC:"7.0-7.1",kC:"8.1-8.4",lC:"9.0-9.2",mC:"9.3",nC:"10.0-10.2",oC:"10.3",pC:"11.0-11.2",qC:"11.3-11.4",rC:"12.0-12.1",sC:"12.2-12.5",tC:"13.0-13.1",uC:"13.2",vC:"13.3",wC:"13.4-13.7",xC:"14.0-14.4",yC:"14.5-14.8",zC:"15.0-15.1","0C":"15.6-15.7","1C":"all","2C":"2.1","3C":"2.2","4C":"2.3","5C":"4.1","6C":"4.4","7C":"4.4.3-4.4.4","8C":"5.0-5.4","9C":"6.2-6.4",AD:"7.2-7.4",BD:"8.2",CD:"9.2",DD:"11.1-11.2",ED:"12.0",FD:"13.0",GD:"14.0",HD:"15.0",ID:"18.0",JD:"19.0",KD:"13.18",LD:"2.5",MD:"3.0-3.1"};
    +module.exports={"0":"112","1":"113","2":"114","3":"115","4":"116","5":"117","6":"118","7":"120","8":"5","9":"19",A:"10",B:"11",C:"12",D:"119",E:"7",F:"8",G:"9",H:"15",I:"4",J:"6",K:"13",L:"14",M:"16",N:"17",O:"18",P:"79",Q:"80",R:"81",S:"83",T:"84",U:"85",V:"86",W:"87",X:"88",Y:"89",Z:"90",a:"91",b:"92",c:"93",d:"94",e:"95",f:"96",g:"97",h:"98",i:"99",j:"100",k:"101",l:"102",m:"103",n:"104",o:"20",p:"21",q:"22",r:"23",s:"73",t:"105",u:"106",v:"107",w:"108",x:"109",y:"110",z:"111",AB:"24",BB:"25",CB:"26",DB:"27",EB:"28",FB:"29",GB:"30",HB:"31",IB:"32",JB:"33",KB:"34",LB:"35",MB:"36",NB:"37",OB:"38",PB:"39",QB:"40",RB:"41",SB:"42",TB:"43",UB:"44",VB:"45",WB:"46",XB:"47",YB:"48",ZB:"49",aB:"50",bB:"51",cB:"52",dB:"53",eB:"54",fB:"55",gB:"56",hB:"57",iB:"58",jB:"60",kB:"62",lB:"63",mB:"64",nB:"65",oB:"66",pB:"67",qB:"68",rB:"69",sB:"70",tB:"71",uB:"72",vB:"74",wB:"75",xB:"76",yB:"77",zB:"78","0B":"11.1","1B":"12.1","2B":"15.5","3B":"16.0","4B":"17.0","5B":"3","6B":"59","7B":"61","8B":"82","9B":"121",AC:"122",BC:"123",CC:"3.2",DC:"10.1",EC:"13.1",FC:"15.2-15.3",GC:"15.4",HC:"16.1",IC:"16.2",JC:"16.3",KC:"16.4",LC:"16.5",MC:"17.1",NC:"17.2",OC:"11.5",PC:"4.2-4.3",QC:"5.5",RC:"2",SC:"3.5",TC:"3.6",UC:"3.1",VC:"5.1",WC:"6.1",XC:"7.1",YC:"9.1",ZC:"14.1",aC:"15.1",bC:"15.6",cC:"16.6",dC:"17.3",eC:"TP",fC:"9.5-9.6",gC:"10.0-10.1",hC:"10.5",iC:"10.6",jC:"11.6",kC:"4.0-4.1",lC:"5.0-5.1",mC:"6.0-6.1",nC:"7.0-7.1",oC:"8.1-8.4",pC:"9.0-9.2",qC:"9.3",rC:"10.0-10.2",sC:"10.3",tC:"11.0-11.2",uC:"11.3-11.4",vC:"12.0-12.1",wC:"12.2-12.5",xC:"13.0-13.1",yC:"13.2",zC:"13.3","0C":"13.4-13.7","1C":"14.0-14.4","2C":"14.5-14.8","3C":"15.0-15.1","4C":"15.6-15.7","5C":"16.6-16.7","6C":"all","7C":"2.1","8C":"2.2","9C":"2.3",AD:"4.1",BD:"4.4",CD:"4.4.3-4.4.4",DD:"5.0-5.4",ED:"6.2-6.4",FD:"7.2-7.4",GD:"8.2",HD:"9.2",ID:"11.1-11.2",JD:"12.0",KD:"13.0",LD:"14.0",MD:"15.0",ND:"18.0",OD:"19.0",PD:"13.18",QD:"2.5",RD:"3.0-3.1"};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/aac.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/aac.js
    index 9a3e56c5765890..91b3c15181aba8 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/aac.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/aac.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"4 5 OC 3B I J D E F A B C K L G M N O n o QC RC","132":"0 1 2 3 6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"0 1 2 3 5 6 7 8 9 C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F","16":"A B"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC 9B"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B"},H:{"2":"1C"},I:{"1":"3B I H 5C MC 6C 7C","2":"2C 3C 4C"},J:{"1":"A","2":"D"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"132":"xB"},N:{"1":"A","2":"B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"132":"LD MD"}},B:6,C:"AAC audio file format",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p SC TC","132":"0 1 2 3 4 5 6 7 q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"1":"0 1 2 3 4 5 6 7 9 C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G","16":"A B"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC CC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC"},H:{"2":"6C"},I:{"1":"5B I D AD PC BD CD","2":"7C 8C 9C"},J:{"1":"A","2":"E"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"132":"D"},N:{"1":"A","2":"B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"132":"QD RD"}},B:6,C:"AAC audio file format",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/abortcontroller.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/abortcontroller.js
    index 657fe3dac4b763..92e232aa6e37f1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/abortcontroller.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/abortcontroller.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G"},C:{"1":"0 1 2 3 eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB QC RC"},D:{"1":"0 1 2 3 lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB"},E:{"1":"K L G zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B SC 9B TC UC VC WC AC","130":"C yB"},F:{"1":"aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB bC cC dC eC yB LC fC zB"},G:{"1":"qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD BD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:1,C:"AbortController & AbortSignal",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H"},C:{"1":"0 1 2 3 4 5 6 7 hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB"},E:{"1":"K L H 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B UC CC VC WC XC YC DC","130":"C 0B"},F:{"1":"dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB fC gC hC iC 0B OC jC 1B"},G:{"1":"uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD GD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:1,C:"AbortController & AbortSignal",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ac3-ec3.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ac3-ec3.js
    index 5d4ebb714e435e..69757827f700f1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ac3-ec3.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ac3-ec3.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"C K L G M N O","2":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC","132":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D","132":"A"},K:{"2":"A B C q yB LC","132":"zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:6,C:"AC-3 (Dolby Digital) and EC-3 (Dolby Digital Plus) codecs",D:false};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"C K L H M N O","2":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC","132":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E","132":"A"},K:{"2":"A B C s 0B OC","132":"1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:6,C:"AC-3 (Dolby Digital) and EC-3 (Dolby Digital Plus) codecs",D:false};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/accelerometer.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/accelerometer.js
    index d18496fbfd38bf..3e6eaa980ca486 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/accelerometer.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/accelerometer.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB","194":"fB 4B gB 5B hB iB jB kB lB"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:4,C:"Accelerometer",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB","194":"iB 6B jB 7B kB lB mB nB oB"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:4,C:"Accelerometer",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/addeventlistener.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/addeventlistener.js
    index 29d4626a7cb7e6..50e3989d543826 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/addeventlistener.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/addeventlistener.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","130":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","257":"4 OC 3B I J QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"EventTarget.addEventListener()",D:true};
    +module.exports={A:{A:{"1":"G A B","130":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","257":"8 RC 5B I J SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"EventTarget.addEventListener()",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/alternate-stylesheet.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/alternate-stylesheet.js
    index 623320d308c53a..e4b129faffbf8f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/alternate-stylesheet.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/alternate-stylesheet.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"E F A B","2":"J D NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"F B C bC cC dC eC yB LC fC zB","16":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"16":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"16":"D A"},K:{"2":"q","16":"A B C yB LC zB"},L:{"16":"H"},M:{"16":"xB"},N:{"16":"A B"},O:{"16":"0B"},P:{"16":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"16":"KD"},S:{"1":"LD MD"}},B:1,C:"Alternate stylesheet",D:false};
    +module.exports={A:{A:{"1":"F G A B","2":"J E QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"G B C fC gC hC iC 0B OC jC 1B","16":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"16":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"16":"E A"},K:{"2":"s","16":"A B C 0B OC 1B"},L:{"16":"D"},M:{"16":"D"},N:{"16":"A B"},O:{"16":"2B"},P:{"16":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"16":"PD"},S:{"1":"QD RD"}},B:1,C:"Alternate stylesheet",D:false};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ambient-light.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ambient-light.js
    index c0566bfffe4c2d..4b1b6c4c3ba367 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ambient-light.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ambient-light.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K","132":"L G M N O","322":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"4 5 OC 3B I J D E F A B C K L G M N O n o QC RC","132":"6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B","194":"0 1 2 3 gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB","322":"0 1 2 3 fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB bC cC dC eC yB LC fC zB","322":"q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"132":"LD MD"}},B:4,C:"Ambient Light Sensor",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K","132":"L H M N O","322":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p SC TC","132":"q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B","194":"0 1 2 3 4 5 6 7 jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB","322":"0 1 2 3 4 5 6 7 iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB fC gC hC iC 0B OC jC 1B","322":"s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"132":"QD RD"}},B:4,C:"Ambient Light Sensor",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/apng.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/apng.js
    index 1f8e47373d0f4f..6d9416b0fcf2a2 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/apng.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/apng.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","2":"OC"},D:{"1":"0 1 2 3 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB"},E:{"1":"E F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D SC 9B TC UC VC"},F:{"1":"B C TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","2":"5 6 7 8 9 F G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB"},G:{"1":"E kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC jC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"Animated PNG (APNG)",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","2":"RC"},D:{"1":"0 1 2 3 4 5 6 7 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB"},E:{"1":"F G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E UC CC VC WC XC"},F:{"1":"B C WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","2":"9 G H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB"},G:{"1":"F oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC nC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"Animated PNG (APNG)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/array-find-index.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/array-find-index.js
    index 2624055f687651..c390c6b9c9cb2c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/array-find-index.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/array-find-index.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 OC 3B I J D E F A B C K L G M N O n o p QC RC"},D:{"1":"0 1 2 3 SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB"},E:{"1":"E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D SC 9B TC UC"},F:{"1":"FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB bC cC dC eC yB LC fC zB"},G:{"1":"E kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC jC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D","16":"A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"Array.prototype.findIndex",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB"},E:{"1":"F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E UC CC VC WC"},F:{"1":"IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB fC gC hC iC 0B OC jC 1B"},G:{"1":"F oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC nC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E","16":"A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"Array.prototype.findIndex",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/array-find.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/array-find.js
    index b2e3c529852ce1..9fe10917ce13cf 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/array-find.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/array-find.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","16":"C K L"},C:{"1":"0 1 2 3 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 OC 3B I J D E F A B C K L G M N O n o p QC RC"},D:{"1":"0 1 2 3 SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB"},E:{"1":"E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D SC 9B TC UC"},F:{"1":"FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB bC cC dC eC yB LC fC zB"},G:{"1":"E kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC jC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D","16":"A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"Array.prototype.find",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","16":"C K L"},C:{"1":"0 1 2 3 4 5 6 7 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB"},E:{"1":"F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E UC CC VC WC"},F:{"1":"IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB fC gC hC iC 0B OC jC 1B"},G:{"1":"F oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC nC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E","16":"A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"Array.prototype.find",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/array-flat.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/array-flat.js
    index 9dc0b0bbb349c5..7d384c630b317e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/array-flat.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/array-flat.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B QC RC"},D:{"1":"0 1 2 3 oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB"},E:{"1":"C K L G zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B SC 9B TC UC VC WC AC yB"},F:{"1":"dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB bC cC dC eC yB LC fC zB"},G:{"1":"rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:6,C:"flat & flatMap array methods",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB"},E:{"1":"C K L H 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B UC CC VC WC XC YC DC 0B"},F:{"1":"gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB fC gC hC iC 0B OC jC 1B"},G:{"1":"vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD GD HD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:6,C:"flat & flatMap array methods",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/array-includes.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/array-includes.js
    index 277bf986b90b5e..14aaa12063a32b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/array-includes.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/array-includes.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K"},C:{"1":"0 1 2 3 QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QC RC"},D:{"1":"0 1 2 3 UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E SC 9B TC UC VC"},F:{"1":"HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB bC cC dC eC yB LC fC zB"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"Array.prototype.includes",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K"},C:{"1":"0 1 2 3 4 5 6 7 TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F UC CC VC WC XC"},F:{"1":"KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB fC gC hC iC 0B OC jC 1B"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"Array.prototype.includes",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/arrow-functions.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/arrow-functions.js
    index da01ca25e87a69..2588c88d153509 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/arrow-functions.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/arrow-functions.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 OC 3B I J D E F A B C K L G M N O n o QC RC"},D:{"1":"0 1 2 3 SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC WC"},F:{"1":"FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB bC cC dC eC yB LC fC zB"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"Arrow functions",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p SC TC"},D:{"1":"0 1 2 3 4 5 6 7 VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC YC"},F:{"1":"IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB fC gC hC iC 0B OC jC 1B"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"Arrow functions",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/asmjs.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/asmjs.js
    index 5e7dcd2791403a..af51302692ed4c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/asmjs.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/asmjs.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"K L G M N O","132":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","322":"C"},C:{"1":"0 1 2 3 6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 OC 3B I J D E F A B C K L G M N O n o QC RC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB","132":"0 1 2 3 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"F B C bC cC dC eC yB LC fC zB","132":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC 6C 7C","132":"H"},J:{"2":"D A"},K:{"2":"A B C yB LC zB","132":"q"},L:{"132":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"132":"0B"},P:{"2":"I","132":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"132":"BC"},R:{"132":"KD"},S:{"1":"LD MD"}},B:6,C:"asm.js",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"K L H M N O","132":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","322":"C"},C:{"1":"0 1 2 3 4 5 6 7 q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p SC TC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB","132":"0 1 2 3 4 5 6 7 EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"G B C fC gC hC iC 0B OC jC 1B","132":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC BD CD","132":"D"},J:{"2":"E A"},K:{"2":"A B C 0B OC 1B","132":"s"},L:{"132":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"132":"2B"},P:{"2":"I","132":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"132":"EC"},R:{"132":"PD"},S:{"1":"QD RD"}},B:6,C:"asm.js",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/async-clipboard.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/async-clipboard.js
    index 085f3bf4721073..41bb3b204a522e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/async-clipboard.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/async-clipboard.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB QC RC","132":"0 1 2 3 iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"0 1 2 3 hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB","66":"fB 4B gB 5B"},E:{"1":"L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K SC 9B TC UC VC WC AC yB zB"},F:{"1":"WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC","260":"xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC 6C 7C","260":"H"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"132":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"2":"I 8C 9C AD BD","260":"n o p CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD","132":"MD"}},B:5,C:"Asynchronous Clipboard API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB SC TC","132":"0 1 2 3 4 5 6 7 lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"1":"0 1 2 3 4 5 6 7 kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB","66":"iB 6B jB 7B"},E:{"1":"L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K UC CC VC WC XC YC DC 0B 1B"},F:{"1":"ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C","260":"1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC BD CD","260":"D"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"132":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"2":"I DD ED FD GD","260":"o p q r HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD","132":"RD"}},B:5,C:"Asynchronous Clipboard API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/async-functions.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/async-functions.js
    index 186b7d21d2a5b7..3abce5ff8627e3 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/async-functions.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/async-functions.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K","194":"L"},C:{"1":"0 1 2 3 ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB QC RC"},D:{"1":"0 1 2 3 cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB"},E:{"1":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC","258":"AC"},F:{"1":"PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB bC cC dC eC yB LC fC zB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC","258":"oC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:6,C:"Async functions",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K","194":"L"},C:{"1":"0 1 2 3 4 5 6 7 cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB"},E:{"1":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC","258":"DC"},F:{"1":"SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB fC gC hC iC 0B OC jC 1B"},G:{"1":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC","258":"sC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:6,C:"Async functions",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/atob-btoa.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/atob-btoa.js
    index f9b3d0abf16811..3fddcd08c04eb3 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/atob-btoa.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/atob-btoa.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m eC yB LC fC zB","2":"F bC cC","16":"dC"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"B C q yB LC zB","16":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Base64 encoding and decoding",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n iC 0B OC jC 1B","2":"G fC gC","16":"hC"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"B C s 0B OC 1B","16":"A"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Base64 encoding and decoding",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/audio-api.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/audio-api.js
    index 16c8da0d13eff6..20eaed83a3ae21 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/audio-api.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/audio-api.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 OC 3B I J D E F A B C K L G M N O n o p QC RC"},D:{"1":"0 1 2 3 HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A B C K","33":"5 6 7 8 9 L G M N O n o p AB BB CB DB EB FB GB"},E:{"1":"G XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC","33":"J D E F A B C K L UC VC WC AC yB zB BC"},F:{"1":"6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","33":"5 G M N O n o"},G:{"1":"yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC","33":"E iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"Web Audio API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A B C K","33":"9 L H M N O o p q r AB BB CB DB EB FB GB HB IB JB"},E:{"1":"H ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC","33":"J E F G A B C K L WC XC YC DC 0B 1B EC"},F:{"1":"q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","33":"9 H M N O o p"},G:{"1":"2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC","33":"F mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"Web Audio API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/audio.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/audio.js
    index ab9933b1584f31..689bd5043b7bfe 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/audio.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/audio.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B","132":"4 5 I J D E F A B C K L G M N O QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m dC eC yB LC fC zB","2":"F","4":"bC cC"},G:{"1":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B"},H:{"2":"1C"},I:{"1":"3B I H 4C 5C MC 6C 7C","2":"2C 3C"},J:{"1":"D A"},K:{"1":"B C q yB LC zB","2":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Audio element",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B","132":"8 9 I J E F G A B C K L H M N O SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n hC iC 0B OC jC 1B","2":"G","4":"fC gC"},G:{"1":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC"},H:{"2":"6C"},I:{"1":"5B I D 9C AD PC BD CD","2":"7C 8C"},J:{"1":"E A"},K:{"1":"B C s 0B OC 1B","2":"A"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Audio element",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/audiotracks.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/audiotracks.js
    index 2e197407ddefbd..fd2da825254b7e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/audiotracks.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/audiotracks.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"C K L G M N O","322":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB QC RC","194":"0 1 2 3 GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB","322":"0 1 2 3 SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J SC 9B TC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB bC cC dC eC yB LC fC zB","322":"FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C yB LC zB","322":"q"},L:{"322":"H"},M:{"2":"xB"},N:{"1":"A B"},O:{"322":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"322":"BC"},R:{"322":"KD"},S:{"194":"LD MD"}},B:1,C:"Audio Tracks",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"C K L H M N O","322":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB SC TC","194":"0 1 2 3 4 5 6 7 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB","322":"0 1 2 3 4 5 6 7 VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J UC CC VC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB fC gC hC iC 0B OC jC 1B","322":"IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C 0B OC 1B","322":"s"},L:{"322":"D"},M:{"2":"D"},N:{"1":"A B"},O:{"322":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"322":"EC"},R:{"322":"PD"},S:{"194":"QD RD"}},B:1,C:"Audio Tracks",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/autofocus.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/autofocus.js
    index 57da5eb6e8d1f1..43d787d2c57f01 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/autofocus.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/autofocus.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"I"},E:{"1":"4 J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","2":"F"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"3B I H 5C MC 6C 7C","2":"2C 3C 4C"},J:{"1":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:1,C:"Autofocus attribute",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"I"},E:{"1":"8 J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","2":"G"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"5B I D AD PC BD CD","2":"7C 8C 9C"},J:{"1":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:1,C:"Autofocus attribute",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/auxclick.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/auxclick.js
    index 8ea1cb02e221cf..fb03baa8f68021 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/auxclick.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/auxclick.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB QC RC","129":"0 1 2 3 aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"0 1 2 3 cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:5,C:"Auxclick",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB SC TC","129":"0 1 2 3 4 5 6 7 dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"1":"0 1 2 3 4 5 6 7 fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:5,C:"Auxclick",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/av1.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/av1.js
    index 499be400921b87..4aee45aba56ad4 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/av1.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/av1.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N","194":"0 1 2 3 O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB QC RC","66":"cB dB eB fB 4B gB 5B hB iB jB","260":"kB","516":"lB"},D:{"1":"0 1 2 3 pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB","66":"mB nB oB"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC","1026":"2B KC aC"},F:{"1":"eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC","1028":"2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD AC DD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:6,C:"AV1 video format",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"4 5 6 7 C K L H M N D","194":"0 1 2 3 O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z"},C:{"1":"0 1 2 3 4 5 6 7 pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB SC TC","66":"fB gB hB iB 6B jB 7B kB lB mB","260":"nB","516":"oB"},D:{"1":"0 1 2 3 4 5 6 7 sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB","66":"pB qB rB"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC","1028":"4B MC NC dC eC"},F:{"1":"hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C","1028":"4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r JD KD LD MD 3B 4B ND OD","2":"I DD ED FD GD HD DC ID"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:6,C:"AV1 video format",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/avif.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/avif.js
    index 797cd535d63466..c98cccea1d2301 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/avif.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/avif.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z","4162":"1 2 3 H"},C:{"1":"0 1 2 3 H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB QC RC","194":"vB wB P Q R 6B S T U V W X Y Z a b","257":"c d e f g h i j k l m r s t u v w x","2049":"y z"},D:{"1":"0 1 2 3 U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T"},E:{"1":"HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B","1796":"EC FC GC"},F:{"1":"qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C","257":"HC IC JC 2B KC","1281":"1B EC FC GC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD AC DD ED FD"},Q:{"2":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:6,C:"AVIF image format",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","4162":"2 3 4 5"},C:{"1":"1 2 3 4 5 6 7 D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB SC TC","194":"yB zB P Q R 8B S T U V W X Y Z a b","257":"c d e f g h i j k l m n t u v w x y","2049":"0 z"},D:{"1":"0 1 2 3 4 5 6 7 U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T"},E:{"1":"KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B","1796":"HC IC JC"},F:{"1":"tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C","257":"KC LC 5C 4B MC NC","1281":"3B HC IC JC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r LD MD 3B 4B ND OD","2":"I DD ED FD GD HD DC ID JD KD"},Q:{"2":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:6,C:"AVIF image format",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-attachment.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-attachment.js
    index 8f271c90def47a..346efeb00a13ab 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-attachment.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-attachment.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","132":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","132":"4 5 6 7 OC 3B I J D E F A B C K L G M N O n o p QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 J D E F A B C TC UC VC WC AC yB zB DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","132":"I K SC 9B BC","2050":"L G XC YC CC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m dC eC yB LC fC zB","132":"F bC cC"},G:{"2":"9B gC MC","772":"E hC iC jC kC lC mC nC oC pC qC rC sC","2050":"tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 6C 7C","132":"5C MC"},J:{"260":"D A"},K:{"1":"B C q yB LC zB","132":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"2":"I","1028":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS background-attachment",D:true};
    +module.exports={A:{A:{"1":"G A B","132":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","132":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 J E F G A B C VC WC XC YC DC 0B 1B GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","132":"I K UC CC EC","2050":"L H ZC aC FC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n hC iC 0B OC jC 1B","132":"G fC gC"},G:{"2":"CC kC PC","772":"F lC mC nC oC pC qC rC sC tC uC vC wC","2050":"xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C BD CD","132":"AD PC"},J:{"260":"E A"},K:{"1":"B C s 0B OC 1B","132":"A"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"2":"I","1028":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS background-attachment",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-clip-text.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-clip-text.js
    index 4c5ebdb38db441..910e11e36a21d1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-clip-text.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-clip-text.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"G M N O","33":"0 1 2 3 C K L P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB QC RC"},D:{"33":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"L G XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"SC 9B","33":"4 I J D E F A B C K TC UC VC WC AC yB zB BC"},F:{"2":"F B C bC cC dC eC yB LC fC zB","33":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"1":"xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC MC hC","33":"E iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC"},H:{"2":"1C"},I:{"16":"3B 2C 3C 4C","33":"I H 5C MC 6C 7C"},J:{"33":"D A"},K:{"16":"A B C yB LC zB","33":"q"},L:{"33":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"33":"0B"},P:{"33":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"33":"BC"},R:{"33":"KD"},S:{"1":"LD MD"}},B:7,C:"Background-clip: text",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"H M N O","33":"C K L","164":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB SC TC"},D:{"132":"7 9B AC BC","164":"0 1 2 3 4 5 6 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},E:{"16":"UC CC","132":"2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","388":"L H ZC aC FC GC","420":"8 I J E F G A B C K VC WC XC YC DC 0B 1B EC"},F:{"2":"G B C fC gC hC iC 0B OC jC 1B","164":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"16":"CC kC PC lC","132":"2B 4C 3B HC IC JC KC LC 5C 4B MC NC","388":"1C 2C 3C FC GC","420":"F mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C"},H:{"2":"6C"},I:{"16":"5B 7C 8C 9C","164":"I D AD PC BD CD"},J:{"164":"E A"},K:{"16":"A B C 0B OC 1B","164":"s"},L:{"164":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"164":"2B"},P:{"164":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"164":"EC"},R:{"164":"PD"},S:{"1":"QD RD"}},B:7,C:"Background-clip: text",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-img-opts.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-img-opts.js
    index 3d3182690de834..d0e12fd89d8bc2 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-img-opts.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-img-opts.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC","36":"RC"},D:{"1":"0 1 2 3 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","516":"4 I J D E F A B C K L"},E:{"1":"D E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","772":"4 I J SC 9B TC UC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m dC eC yB LC fC zB","2":"F bC","36":"cC"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","4":"9B gC MC iC","516":"hC"},H:{"132":"1C"},I:{"1":"H 6C 7C","36":"2C","516":"3B I 5C MC","548":"3C 4C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS3 Background-image options",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC","36":"TC"},D:{"1":"0 1 2 3 4 5 6 7 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","516":"8 I J E F G A B C K L"},E:{"1":"E F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","772":"8 I J UC CC VC WC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n hC iC 0B OC jC 1B","2":"G fC","36":"gC"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","4":"CC kC PC mC","516":"lC"},H:{"132":"6C"},I:{"1":"D BD CD","36":"7C","516":"5B I AD PC","548":"8C 9C"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS3 Background-image options",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-position-x-y.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-position-x-y.js
    index e2df0f8eb96eaf..9f619aa221c6a1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-position-x-y.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-position-x-y.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"J D E F A B NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:7,C:"background-position-x & background-position-y",D:true};
    +module.exports={A:{A:{"1":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:7,C:"background-position-x & background-position-y",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-repeat-round-space.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-repeat-round-space.js
    index 44350215c1378e..350abd9b82b0ad 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-repeat-round-space.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-repeat-round-space.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E NC","132":"F"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB QC RC"},D:{"1":"0 1 2 3 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB"},E:{"1":"D E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J SC 9B TC UC"},F:{"1":"5 6 7 8 9 B C n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m dC eC yB LC fC zB","2":"F G M N O bC cC"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC"},H:{"1":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"1":"A","2":"D"},K:{"1":"B C q yB LC zB","2":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:4,C:"CSS background-repeat round and space",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F QC","132":"G"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB"},E:{"1":"E F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J UC CC VC WC"},F:{"1":"9 B C o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n hC iC 0B OC jC 1B","2":"G H M N O fC gC"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC"},H:{"1":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"1":"A","2":"E"},K:{"1":"B C s 0B OC 1B","2":"A"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:4,C:"CSS background-repeat round and space",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-sync.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-sync.js
    index 11563f1fcc8a03..0c0a85d4be05d6 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-sync.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/background-sync.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB QC RC","16":"7B 8B PC"},D:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:7,C:"Background Sync API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D SC TC","16":"9B AC BC"},D:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:7,C:"Background Sync API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/battery-status.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/battery-status.js
    index 7cb2a4ab05a72c..4d6c298cbddcec 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/battery-status.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/battery-status.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"QB RB SB TB UB VB WB XB YB","2":"0 1 2 3 4 OC 3B I J D E F ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","132":"5 6 7 8 9 M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB","164":"A B C K L G"},D:{"1":"0 1 2 3 LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB","66":"KB"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 F B C G M N O n o p bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD","2":"MD"}},B:4,C:"Battery Status API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"TB UB VB WB XB YB ZB aB bB","2":"0 1 2 3 4 5 6 7 8 RC 5B I J E F G cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","132":"9 M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB","164":"A B C K L H"},D:{"1":"0 1 2 3 4 5 6 7 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB","66":"NB"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD","2":"RD"}},B:4,C:"Battery Status API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/beacon.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/beacon.js
    index 4509eef162b1ec..bb4464c5294b34 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/beacon.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/beacon.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K"},C:{"1":"0 1 2 3 EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB QC RC"},D:{"1":"0 1 2 3 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB"},E:{"1":"C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B SC 9B TC UC VC WC AC"},F:{"1":"9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 F B C G M N O n o p bC cC dC eC yB LC fC zB"},G:{"1":"qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"Beacon API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K"},C:{"1":"0 1 2 3 4 5 6 7 HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB"},E:{"1":"C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B UC CC VC WC XC YC DC"},F:{"1":"CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB fC gC hC iC 0B OC jC 1B"},G:{"1":"uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"Beacon API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/beforeafterprint.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/beforeafterprint.js
    index 2c5b8e9bcf11b6..843146ec8f1f45 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/beforeafterprint.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/beforeafterprint.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"J D E F A B","16":"NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I QC RC"},D:{"1":"0 1 2 3 iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB"},E:{"1":"K L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C SC 9B TC UC VC WC AC yB zB"},F:{"1":"XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB bC cC dC eC yB LC fC zB"},G:{"1":"tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"16":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"16":"A B"},O:{"1":"0B"},P:{"2":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","16":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Printing Events",D:true};
    +module.exports={A:{A:{"1":"J E F G A B","16":"QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I SC TC"},D:{"1":"0 1 2 3 4 5 6 7 lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB"},E:{"1":"K L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C UC CC VC WC XC YC DC 0B 1B"},F:{"1":"aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB fC gC hC iC 0B OC jC 1B"},G:{"1":"xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"16":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"16":"A B"},O:{"1":"2B"},P:{"2":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","16":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Printing Events",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/bigint.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/bigint.js
    index da960f92a19631..8ba7f211cf3b90 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/bigint.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/bigint.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB QC RC","194":"kB lB mB"},D:{"1":"0 1 2 3 mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB"},E:{"1":"L G XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K SC 9B TC UC VC WC AC yB zB BC"},F:{"1":"bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bC cC dC eC yB LC fC zB"},G:{"1":"xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD BD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:6,C:"BigInt",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB SC TC","194":"nB oB pB"},D:{"1":"0 1 2 3 4 5 6 7 pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB"},E:{"1":"L H ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K UC CC VC WC XC YC DC 0B 1B EC"},F:{"1":"eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB fC gC hC iC 0B OC jC 1B"},G:{"1":"1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD GD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:6,C:"BigInt",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/blobbuilder.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/blobbuilder.js
    index df4565937f0f32..3d3544cf9968a1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/blobbuilder.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/blobbuilder.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I QC RC","36":"J D E F A B C"},D:{"1":"0 1 2 3 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D","36":"5 E F A B C K L G M N O"},E:{"1":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"F B C bC cC dC eC yB LC fC"},G:{"1":"E iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC"},H:{"2":"1C"},I:{"1":"H","2":"2C 3C 4C","36":"3B I 5C MC 6C 7C"},J:{"1":"A","2":"D"},K:{"1":"q zB","2":"A B C yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"Blob constructing",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I SC TC","36":"J E F G A B C"},D:{"1":"0 1 2 3 4 5 6 7 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E","36":"9 F G A B C K L H M N O"},E:{"1":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"G B C fC gC hC iC 0B OC jC"},G:{"1":"F mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC"},H:{"2":"6C"},I:{"1":"D","2":"7C 8C 9C","36":"5B I AD PC BD CD"},J:{"1":"A","2":"E"},K:{"1":"s 1B","2":"A B C 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"Blob constructing",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/bloburls.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/bloburls.js
    index 3025ff2f306ce7..b27c24ca08dcbe 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/bloburls.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/bloburls.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","129":"A B"},B:{"1":"0 1 2 3 G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","129":"C K L"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC"},D:{"1":"0 1 2 3 6 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D","33":"5 E F A B C K L G M N O n o p"},E:{"1":"D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC","33":"J"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC","33":"iC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B 2C 3C 4C","33":"I 5C MC"},J:{"1":"A","2":"D"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","2":"A"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"Blob URLs",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","129":"A B"},B:{"1":"0 1 2 3 4 5 6 7 H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","129":"C K L"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E","33":"9 F G A B C K L H M N O o p q"},E:{"1":"E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC","33":"J"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC","33":"mC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B 7C 8C 9C","33":"I AD PC"},J:{"1":"A","2":"E"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","2":"A"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"Blob URLs",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/border-image.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/border-image.js
    index 33ca00adf026a3..50e87c123f5ee4 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/border-image.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/border-image.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"B","2":"J D E F A NC"},B:{"1":"0 1 2 3 L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","129":"C K"},C:{"1":"0 1 2 3 XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B","260":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB","804":"4 I J D E F A B C K L QC RC"},D:{"1":"0 1 2 3 dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","260":"YB ZB aB bB cB","388":"DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB","1412":"5 6 7 8 9 G M N O n o p AB BB CB","1956":"4 I J D E F A B C K L"},E:{"1":"DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","129":"A B C K L G WC AC yB zB BC XC YC CC","1412":"J D E F UC VC","1956":"4 I SC 9B TC"},F:{"1":"QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F bC cC","260":"LB MB NB OB PB","388":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB","1796":"dC eC","1828":"B C yB LC fC zB"},G:{"1":"DC 0B 0C 1B EC FC GC HC IC JC 2B KC","129":"mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC","1412":"E iC jC kC lC","1956":"9B gC MC hC"},H:{"1828":"1C"},I:{"1":"H","388":"6C 7C","1956":"3B I 2C 3C 4C 5C MC"},J:{"1412":"A","1924":"D"},K:{"1":"q","2":"A","1828":"B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","2":"A"},O:{"1":"0B"},P:{"1":"n o p AD BD CD AC DD ED FD GD HD 1B 2B ID JD","260":"8C 9C","388":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","260":"LD"}},B:4,C:"CSS3 Border images",D:true};
    +module.exports={A:{A:{"1":"B","2":"J E F G A QC"},B:{"1":"0 1 2 3 4 5 6 7 L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","129":"C K"},C:{"1":"0 1 2 3 4 5 6 7 aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B","260":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB","804":"8 I J E F G A B C K L SC TC"},D:{"1":"0 1 2 3 4 5 6 7 gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","260":"bB cB dB eB fB","388":"GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB","1412":"9 H M N O o p q r AB BB CB DB EB FB","1956":"8 I J E F G A B C K L"},E:{"1":"GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","129":"A B C K L H YC DC 0B 1B EC ZC aC FC","1412":"J E F G WC XC","1956":"8 I UC CC VC"},F:{"1":"TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G fC gC","260":"OB PB QB RB SB","388":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB","1796":"hC iC","1828":"B C 0B OC jC 1B"},G:{"1":"GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","129":"qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC","1412":"F mC nC oC pC","1956":"CC kC PC lC"},H:{"1828":"6C"},I:{"1":"D","388":"BD CD","1956":"5B I 7C 8C 9C AD PC"},J:{"1412":"A","1924":"E"},K:{"1":"s","2":"A","1828":"B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","2":"A"},O:{"1":"2B"},P:{"1":"o p q r FD GD HD DC ID JD KD LD MD 3B 4B ND OD","260":"DD ED","388":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","260":"QD"}},B:4,C:"CSS3 Border images",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/border-radius.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/border-radius.js
    index 2991ddaeda9c82..432268fb7469f1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/border-radius.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/border-radius.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","257":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB","289":"3B QC RC","292":"OC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","33":"I"},E:{"1":"4 D E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","33":"I SC 9B","129":"J TC UC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m dC eC yB LC fC zB","2":"F bC cC"},G:{"1":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","33":"9B"},H:{"2":"1C"},I:{"1":"3B I H 3C 4C 5C MC 6C 7C","33":"2C"},J:{"1":"D A"},K:{"1":"B C q yB LC zB","2":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","257":"LD"}},B:4,C:"CSS3 Border-radius (rounded corners)",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","257":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB","289":"5B SC TC","292":"RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","33":"I"},E:{"1":"8 E F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","33":"I UC CC","129":"J VC WC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n hC iC 0B OC jC 1B","2":"G fC gC"},G:{"1":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","33":"CC"},H:{"2":"6C"},I:{"1":"5B I D 8C 9C AD PC BD CD","33":"7C"},J:{"1":"E A"},K:{"1":"B C s 0B OC 1B","2":"A"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","257":"QD"}},B:4,C:"CSS3 Border-radius (rounded corners)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/broadcastchannel.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/broadcastchannel.js
    index 602e86cc9dfe6d..4e853e83c2bc38 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/broadcastchannel.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/broadcastchannel.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB QC RC"},D:{"1":"0 1 2 3 bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB"},E:{"1":"DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC"},F:{"1":"OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB bC cC dC eC yB LC fC zB"},G:{"1":"DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"BroadcastChannel",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB"},E:{"1":"GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC"},F:{"1":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB fC gC hC iC 0B OC jC 1B"},G:{"1":"GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"BroadcastChannel",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/brotli.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/brotli.js
    index cca88eda74ea01..a74abda84839be 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/brotli.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/brotli.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L"},C:{"1":"0 1 2 3 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB QC RC"},D:{"1":"0 1 2 3 YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB","194":"WB","257":"XB"},E:{"1":"K L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC AC","513":"B C yB zB"},F:{"1":"LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB bC cC dC eC yB LC fC zB","194":"JB KB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"Brotli Accept-Encoding/Content-Encoding",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L"},C:{"1":"0 1 2 3 4 5 6 7 UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB","194":"ZB","257":"aB"},E:{"1":"K L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC DC","513":"B C 0B 1B"},F:{"1":"OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB fC gC hC iC 0B OC jC 1B","194":"MB NB"},G:{"1":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"Brotli Accept-Encoding/Content-Encoding",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/calc.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/calc.js
    index 06e2a01d348a5a..863341dd1b7e2a 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/calc.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/calc.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E NC","260":"F","516":"A B"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC","33":"4 I J D E F A B C K L G"},D:{"1":"0 1 2 3 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A B C K L G M N O","33":"5 6 7 8 n o p"},E:{"1":"D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC","33":"J"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC","33":"iC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC","132":"6C 7C"},J:{"1":"A","2":"D"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"calc() as CSS unit value",D:true};
    +module.exports={A:{A:{"2":"J E F QC","260":"G","516":"A B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC","33":"8 I J E F G A B C K L H"},D:{"1":"0 1 2 3 4 5 6 7 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A B C K L H M N O","33":"9 o p q r AB BB"},E:{"1":"E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC","33":"J"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC","33":"mC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC","132":"BD CD"},J:{"1":"A","2":"E"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"calc() as CSS unit value",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/canvas-blending.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/canvas-blending.js
    index b4c40ae99870ef..53b2eaff7cde1b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/canvas-blending.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/canvas-blending.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C"},C:{"1":"0 1 2 3 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 OC 3B I J D E F A B C K L G M N O QC RC"},D:{"1":"0 1 2 3 DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB"},E:{"1":"D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J SC 9B TC"},F:{"1":"5 6 7 8 9 N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C G M bC cC dC eC yB LC fC zB"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"Canvas blend modes",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C"},C:{"1":"0 1 2 3 4 5 6 7 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O SC TC"},D:{"1":"0 1 2 3 4 5 6 7 GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB"},E:{"1":"E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J UC CC VC"},F:{"1":"9 N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C H M fC gC hC iC 0B OC jC 1B"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"Canvas blend modes",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/canvas-text.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/canvas-text.js
    index e010e01e16b68e..2a1a6d449e2ccf 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/canvas-text.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/canvas-text.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"NC","8":"J D E"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","8":"OC 3B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","8":"SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m dC eC yB LC fC zB","8":"F bC cC"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"B C q yB LC zB","8":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Text API for Canvas",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"QC","8":"J E F"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","8":"RC 5B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","8":"UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n hC iC 0B OC jC 1B","8":"G fC gC"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"B C s 0B OC 1B","8":"A"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Text API for Canvas",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/canvas.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/canvas.js
    index aaf942de8fd584..6404544e927848 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/canvas.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/canvas.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"NC","8":"J D E"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC RC","132":"OC 3B QC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","132":"SC 9B"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"260":"1C"},I:{"1":"3B I H 5C MC 6C 7C","132":"2C 3C 4C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Canvas (basic support)",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"QC","8":"J E F"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC TC","132":"RC 5B SC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","132":"UC CC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"260":"6C"},I:{"1":"5B I D AD PC BD CD","132":"7C 8C 9C"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Canvas (basic support)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ch-unit.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ch-unit.js
    index 37beb088934038..6b9222f0c5d5db 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ch-unit.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ch-unit.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E NC","132":"F A B"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p"},E:{"1":"D E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J SC 9B TC UC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"1":"A","2":"D"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"ch (character) unit",D:true};
    +module.exports={A:{A:{"2":"J E F QC","132":"G A B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB"},E:{"1":"E F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J UC CC VC WC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"1":"A","2":"E"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"ch (character) unit",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/chacha20-poly1305.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/chacha20-poly1305.js
    index 624ca377d4b4b0..cca71c00f4123e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/chacha20-poly1305.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/chacha20-poly1305.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB QC RC"},D:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB","129":"GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB"},E:{"1":"C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B SC 9B TC UC VC WC AC"},F:{"1":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB bC cC dC eC yB LC fC zB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C","16":"7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"ChaCha20-Poly1305 cipher suites for TLS",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB","129":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB"},E:{"1":"C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B UC CC VC WC XC YC DC"},F:{"1":"MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB fC gC hC iC 0B OC jC 1B"},G:{"1":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD","16":"CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"ChaCha20-Poly1305 cipher suites for TLS",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/channel-messaging.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/channel-messaging.js
    index 5a491a1a1cca6d..eb2956e944d7ad 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/channel-messaging.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/channel-messaging.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 OC 3B I J D E F A B C K L G M N O n o p QC RC","194":"9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m eC yB LC fC zB","2":"F bC cC","16":"dC"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"1":"D A"},K:{"1":"B C q yB LC zB","2":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Channel messaging",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB SC TC","194":"CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n iC 0B OC jC 1B","2":"G fC gC","16":"hC"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"1":"E A"},K:{"1":"B C s 0B OC 1B","2":"A"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Channel messaging",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/childnode-remove.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/childnode-remove.js
    index 9ef382891954ad..22b59d27747537 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/childnode-remove.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/childnode-remove.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","16":"C"},C:{"1":"0 1 2 3 6 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 OC 3B I J D E F A B C K L G M N O n o p QC RC"},D:{"1":"0 1 2 3 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 I J D E F A B C K L G M N O n o p"},E:{"1":"D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC","16":"J"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"1":"A","2":"D"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"ChildNode.remove()",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","16":"C"},C:{"1":"0 1 2 3 4 5 6 7 r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q SC TC"},D:{"1":"0 1 2 3 4 5 6 7 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r"},E:{"1":"E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC","16":"J"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"1":"A","2":"E"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"ChildNode.remove()",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/classlist.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/classlist.js
    index c81f698210055c..cc6be89f53e6ca 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/classlist.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/classlist.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"8":"J D E F NC","1924":"A B"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","8":"OC 3B QC","516":"7 8","772":"4 5 6 I J D E F A B C K L G M N O n o p RC"},D:{"1":"0 1 2 3 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","8":"4 I J D","516":"7 8 9 AB","772":"6","900":"5 E F A B C K L G M N O n o p"},E:{"1":"D E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","8":"4 I SC 9B","900":"J TC UC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","8":"F B bC cC dC eC yB","900":"C LC fC zB"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","8":"9B gC MC","900":"hC iC"},H:{"900":"1C"},I:{"1":"H 6C 7C","8":"2C 3C 4C","900":"3B I 5C MC"},J:{"1":"A","900":"D"},K:{"1":"q","8":"A B","900":"C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"900":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"classList (DOMTokenList)",D:true};
    +module.exports={A:{A:{"8":"J E F G QC","1924":"A B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","8":"RC 5B SC","516":"AB BB","772":"8 9 I J E F G A B C K L H M N O o p q r TC"},D:{"1":"0 1 2 3 4 5 6 7 EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","8":"8 I J E","516":"AB BB CB DB","772":"r","900":"9 F G A B C K L H M N O o p q"},E:{"1":"E F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","8":"8 I UC CC","900":"J VC WC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","8":"G B fC gC hC iC 0B","900":"C OC jC 1B"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","8":"CC kC PC","900":"lC mC"},H:{"900":"6C"},I:{"1":"D BD CD","8":"7C 8C 9C","900":"5B I AD PC"},J:{"1":"A","900":"E"},K:{"1":"s","8":"A B","900":"C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"900":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"classList (DOMTokenList)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/client-hints-dpr-width-viewport.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/client-hints-dpr-width-viewport.js
    index 3effbd52888e6c..9897ff54611f68 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/client-hints-dpr-width-viewport.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/client-hints-dpr-width-viewport.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:6,C:"Client Hints: DPR, Width, Viewport-Width",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:6,C:"Client Hints: DPR, Width, Viewport-Width",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/clipboard.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/clipboard.js
    index 117528353c0534..f01180cb7d5e58 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/clipboard.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/clipboard.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2436":"J D E F A B NC"},B:{"260":"N O","2436":"C K L G M","8196":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"4 5 OC 3B I J D E F A B C K L G M N O n o QC RC","772":"6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB","4100":"0 1 2 3 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"2":"4 I J D E F A B C","2564":"5 6 7 8 9 K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB","8196":"0 1 2 3 fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","10244":"QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB"},E:{"1":"C K L G zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"SC 9B","2308":"A B AC yB","2820":"4 I J D E F TC UC VC WC"},F:{"2":"F B bC cC dC eC yB LC fC","16":"C","516":"zB","2564":"5 6 7 8 9 G M N O n o p AB BB CB","8196":"SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","10244":"DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB"},G:{"1":"rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC","2820":"E hC iC jC kC lC mC nC oC pC qC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC","260":"H","2308":"6C 7C"},J:{"2":"D","2308":"A"},K:{"2":"A B C yB LC","16":"zB","8196":"q"},L:{"8196":"H"},M:{"1028":"xB"},N:{"2":"A B"},O:{"8196":"0B"},P:{"2052":"8C 9C","2308":"I","8196":"n o p AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"8196":"BC"},R:{"8196":"KD"},S:{"4100":"LD MD"}},B:5,C:"Synchronous Clipboard API",D:true};
    +module.exports={A:{A:{"2436":"J E F G A B QC"},B:{"260":"N O","2436":"C K L H M","8196":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p SC TC","772":"q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB","4100":"0 1 2 3 4 5 6 7 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"2":"8 I J E F G A B C","2564":"9 K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB","8196":"0 1 2 3 4 5 6 7 iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","10244":"TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB"},E:{"1":"C K L H 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"UC CC","2308":"A B DC 0B","2820":"8 I J E F G VC WC XC YC"},F:{"2":"G B fC gC hC iC 0B OC jC","16":"C","516":"1B","2564":"9 H M N O o p q r AB BB CB DB EB FB","8196":"VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","10244":"GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB"},G:{"1":"vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC","2820":"F lC mC nC oC pC qC rC sC tC uC"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC","260":"D","2308":"BD CD"},J:{"2":"E","2308":"A"},K:{"2":"A B C 0B OC","16":"1B","8196":"s"},L:{"8196":"D"},M:{"1028":"D"},N:{"2":"A B"},O:{"8196":"2B"},P:{"2052":"DD ED","2308":"I","8196":"o p q r FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"8196":"EC"},R:{"8196":"PD"},S:{"4100":"QD RD"}},B:5,C:"Synchronous Clipboard API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/colr-v1.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/colr-v1.js
    index 952639ccdb0a9b..ea90fd40cfca44 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/colr-v1.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/colr-v1.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 h i j k l m r s t u v w x y z H","2":"C K L G M N O P Q R S T U V W X Y Z a b c d e f g"},C:{"1":"0 1 2 3 u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g QC RC","258":"h i j k l m r","578":"s t"},D:{"1":"0 1 2 3 h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y","194":"Z a b c d e f g"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"16":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"16":"A B"},O:{"1":"0B"},P:{"1":"n o p ID JD","2":"I 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:6,C:"COLR/CPAL(v1) Font Formats",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 h i j k l m n t u v w x y z D","2":"C K L H M N O P Q R S T U V W X Y Z a b c d e f g"},C:{"1":"0 1 2 3 4 5 6 7 v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g SC TC","258":"h i j k l m n","578":"t u"},D:{"1":"0 1 2 3 4 5 6 7 h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y","194":"Z a b c d e f g"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"16":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"16":"A B"},O:{"1":"2B"},P:{"1":"o p q r ND OD","2":"I DD ED FD GD HD DC ID JD KD LD MD 3B 4B"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:6,C:"COLR/CPAL(v1) Font Formats",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/colr.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/colr.js
    index 5d32482cc03956..d85597e997ae7b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/colr.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/colr.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E NC","257":"F A B"},B:{"1":"0 1 2 3 C K L G M N O x y z H","513":"P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w"},C:{"1":"0 1 2 3 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB QC RC"},D:{"1":"0 1 2 3 x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB","513":"qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w"},E:{"1":"L G XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC AC","129":"B C K yB zB BC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB bC cC dC eC yB LC fC zB","513":"fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"16":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"16":"A B"},O:{"1":"0B"},P:{"1":"n o p AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"COLR/CPAL(v0) Font Formats",D:true};
    +module.exports={A:{A:{"2":"J E F QC","257":"G A B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O y z D","513":"P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x"},C:{"1":"0 1 2 3 4 5 6 7 IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB","513":"tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x"},E:{"1":"L H ZC aC FC GC 2B bC 3B HC IC JC KC LC cC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC DC","129":"B C K 0B 1B EC","1026":"4B MC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB fC gC hC iC 0B OC jC 1B","513":"iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"1":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C NC","2":"F CC kC PC lC mC nC oC pC qC rC sC","1026":"4B MC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"16":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"16":"A B"},O:{"1":"2B"},P:{"1":"o p q r DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD GD HD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"COLR/CPAL(v0) Font Formats",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/comparedocumentposition.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/comparedocumentposition.js
    index 594f57ced35da1..2a5f94887d3620 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/comparedocumentposition.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/comparedocumentposition.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","16":"OC 3B QC RC"},D:{"1":"0 1 2 3 DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 I J D E F A B C K L","132":"5 6 7 8 9 G M N O n o p AB BB CB"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"4 I J SC 9B","132":"D E F UC VC WC","260":"TC"},F:{"1":"5 6 7 8 9 C N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m fC zB","16":"F B bC cC dC eC yB LC","132":"G M"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B","132":"E gC MC hC iC jC kC lC mC"},H:{"1":"1C"},I:{"1":"H 6C 7C","16":"2C 3C","132":"3B I 4C 5C MC"},J:{"132":"D A"},K:{"1":"C q zB","16":"A B yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Node.compareDocumentPosition()",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 I J E F G A B C K L","132":"9 H M N O o p q r AB BB CB DB EB FB"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"8 I J UC CC","132":"E F G WC XC YC","260":"VC"},F:{"1":"9 C N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n jC 1B","16":"G B fC gC hC iC 0B OC","132":"H M"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC","132":"F kC PC lC mC nC oC pC qC"},H:{"1":"6C"},I:{"1":"D BD CD","16":"7C 8C","132":"5B I 9C AD PC"},J:{"132":"E A"},K:{"1":"C s 1B","16":"A B 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Node.compareDocumentPosition()",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/console-basic.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/console-basic.js
    index 053b005074bdfa..01e16432680556 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/console-basic.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/console-basic.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D NC","132":"E F"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m yB LC fC zB","2":"F bC cC dC eC"},G:{"1":"9B gC MC hC","513":"E iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"4097":"1C"},I:{"1025":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"258":"D A"},K:{"2":"A","258":"B C yB LC zB","1025":"q"},L:{"1025":"H"},M:{"2049":"xB"},N:{"258":"A B"},O:{"258":"0B"},P:{"1025":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1025":"KD"},S:{"1":"LD MD"}},B:1,C:"Basic console logging functions",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E QC","132":"F G"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 0B OC jC 1B","2":"G fC gC hC iC"},G:{"1":"CC kC PC lC","513":"F mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"4097":"6C"},I:{"1025":"5B I D 7C 8C 9C AD PC BD CD"},J:{"258":"E A"},K:{"2":"A","258":"B C 0B OC 1B","1025":"s"},L:{"1025":"D"},M:{"2049":"D"},N:{"258":"A B"},O:{"258":"2B"},P:{"1025":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1025":"PD"},S:{"1":"QD RD"}},B:1,C:"Basic console logging functions",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/console-time.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/console-time.js
    index d6fc55c4695121..c7df363026bd53 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/console-time.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/console-time.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"B","2":"J D E F A NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC 9B"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m yB LC fC zB","2":"F bC cC dC eC","16":"B"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"q","16":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","2":"A"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"console.time and console.timeEnd",D:true};
    +module.exports={A:{A:{"1":"B","2":"J E F G A QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC CC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 0B OC jC 1B","2":"G fC gC hC iC","16":"B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"s","16":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","2":"A"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"console.time and console.timeEnd",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/const.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/const.js
    index f44cd8d804c169..53a6365e89f08e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/const.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/const.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A NC","2052":"B"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","132":"4 OC 3B I J D E F A B C QC RC","260":"5 6 7 8 9 K L G M N O n o p AB BB CB DB EB FB GB HB IB"},D:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","260":"4 5 I J D E F A B C K L G M N O n","772":"6 7 8 9 o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB","1028":"OB PB QB RB SB TB UB VB"},E:{"1":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","260":"4 I A SC 9B AC","772":"J D E F TC UC VC WC"},F:{"1":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F bC","132":"B cC dC eC yB LC","644":"C fC zB","772":"5 6 7 8 9 G M N O n o p AB","1028":"BB CB DB EB FB GB HB IB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","260":"9B gC MC nC oC","772":"E hC iC jC kC lC mC"},H:{"644":"1C"},I:{"1":"H","16":"2C 3C","260":"4C","772":"3B I 5C MC 6C 7C"},J:{"772":"D A"},K:{"1":"q","132":"A B yB LC","644":"C zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","2":"A"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","1028":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"const",D:true};
    +module.exports={A:{A:{"2":"J E F G A QC","2052":"B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","132":"8 RC 5B I J E F G A B C SC TC","260":"9 K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB"},D:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","260":"8 9 I J E F G A B C K L H M N O o","772":"p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB","1028":"RB SB TB UB VB WB XB YB"},E:{"1":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","260":"8 I A UC CC DC","772":"J E F G VC WC XC YC"},F:{"1":"MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G fC","132":"B gC hC iC 0B OC","644":"C jC 1B","772":"9 H M N O o p q r AB BB CB DB","1028":"EB FB GB HB IB JB KB LB"},G:{"1":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","260":"CC kC PC rC sC","772":"F lC mC nC oC pC qC"},H:{"644":"6C"},I:{"1":"D","16":"7C 8C","260":"9C","772":"5B I AD PC BD CD"},J:{"772":"E A"},K:{"1":"s","132":"A B 0B OC","644":"C 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","2":"A"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","1028":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"const",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/constraint-validation.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/constraint-validation.js
    index 3f84cbd62efd91..674538ed66290a 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/constraint-validation.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/constraint-validation.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","900":"A B"},B:{"1":"0 1 2 3 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","388":"L G M","900":"C K"},C:{"1":"0 1 2 3 YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC","260":"WB XB","388":"CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB","900":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB"},D:{"1":"0 1 2 3 NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 I J D E F A B C K L","388":"8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB","900":"5 6 7 G M N O n o p"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"4 I SC 9B","388":"E F VC WC","900":"J D TC UC"},F:{"1":"AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","16":"F B bC cC dC eC yB LC","388":"5 6 7 8 9 G M N O n o p","900":"C fC zB"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC MC","388":"E jC kC lC mC","900":"hC iC"},H:{"2":"1C"},I:{"1":"H","16":"3B 2C 3C 4C","388":"6C 7C","900":"I 5C MC"},J:{"16":"D","388":"A"},K:{"1":"q","16":"A B yB LC","900":"C zB"},L:{"1":"H"},M:{"1":"xB"},N:{"900":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","388":"LD"}},B:1,C:"Constraint Validation API",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","900":"A B"},B:{"1":"0 1 2 3 4 5 6 7 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","388":"L H M","900":"C K"},C:{"1":"0 1 2 3 4 5 6 7 bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC","260":"ZB aB","388":"FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB","900":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB"},D:{"1":"0 1 2 3 4 5 6 7 QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 I J E F G A B C K L","388":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB","900":"9 H M N O o p q r AB"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"8 I UC CC","388":"F G XC YC","900":"J E VC WC"},F:{"1":"DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","16":"G B fC gC hC iC 0B OC","388":"9 H M N O o p q r AB BB CB","900":"C jC 1B"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC PC","388":"F nC oC pC qC","900":"lC mC"},H:{"2":"6C"},I:{"1":"D","16":"5B 7C 8C 9C","388":"BD CD","900":"I AD PC"},J:{"16":"E","388":"A"},K:{"1":"s","16":"A B 0B OC","900":"C 1B"},L:{"1":"D"},M:{"1":"D"},N:{"900":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","388":"QD"}},B:1,C:"Constraint Validation API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/contenteditable.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/contenteditable.js
    index 4b131afedfed0b..9ccfddf81fc702 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/contenteditable.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/contenteditable.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"J D E F A B NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","2":"OC","4":"3B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC"},H:{"2":"1C"},I:{"1":"3B I H 5C MC 6C 7C","2":"2C 3C 4C"},J:{"1":"D A"},K:{"1":"q zB","2":"A B C yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"contenteditable attribute (basic support)",D:true};
    +module.exports={A:{A:{"1":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","2":"RC","4":"5B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC"},H:{"2":"6C"},I:{"1":"5B I D AD PC BD CD","2":"7C 8C 9C"},J:{"1":"E A"},K:{"1":"s 1B","2":"A B C 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"contenteditable attribute (basic support)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/contentsecuritypolicy.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/contentsecuritypolicy.js
    index 5f7412a84d4f28..34def59d7356a1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/contentsecuritypolicy.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/contentsecuritypolicy.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","132":"A B"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 6 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC","129":"4 5 I J D E F A B C K L G M N O n o p"},D:{"1":"0 1 2 3 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A B C K","257":"5 6 7 L G M N O n o p"},E:{"1":"D E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B","257":"J UC","260":"TC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC","257":"iC","260":"hC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"2":"D","257":"A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"132":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"Content Security Policy 1.0",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","132":"A B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC","129":"8 9 I J E F G A B C K L H M N O o p q"},D:{"1":"0 1 2 3 4 5 6 7 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A B C K","257":"9 L H M N O o p q r AB"},E:{"1":"E F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC","257":"J WC","260":"VC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC","257":"mC","260":"lC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"2":"E","257":"A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"132":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"Content Security Policy 1.0",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/contentsecuritypolicy2.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/contentsecuritypolicy2.js
    index 06222242b62ed6..18b98ce48f4499 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/contentsecuritypolicy2.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/contentsecuritypolicy2.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L","4100":"G M N O"},C:{"1":"0 1 2 3 SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB QC RC","132":"EB FB GB HB","260":"IB","516":"JB KB LB MB NB OB PB QB RB"},D:{"1":"0 1 2 3 NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB","1028":"JB KB LB","2052":"MB"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC WC"},F:{"1":"AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 F B C G M N O n o p bC cC dC eC yB LC fC zB","1028":"6 7 8","2052":"9"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"Content Security Policy Level 2",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L","4100":"H M N O"},C:{"1":"0 1 2 3 4 5 6 7 VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB SC TC","132":"HB IB JB KB","260":"LB","516":"MB NB OB PB QB RB SB TB UB"},D:{"1":"0 1 2 3 4 5 6 7 QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB","1028":"MB NB OB","2052":"PB"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC YC"},F:{"1":"DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q fC gC hC iC 0B OC jC 1B","1028":"r AB BB","2052":"CB"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"Content Security Policy Level 2",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/cookie-store-api.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/cookie-store-api.js
    index 0839ca77d7a133..374fd616ee1ca6 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/cookie-store-api.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/cookie-store-api.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O","194":"P Q R S T U V"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB","194":"jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB bC cC dC eC yB LC fC zB","194":"YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD AC DD ED FD"},Q:{"2":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:7,C:"Cookie Store API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O","194":"P Q R S T U V"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB","194":"mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB fC gC hC iC 0B OC jC 1B","194":"bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r LD MD 3B 4B ND OD","2":"I DD ED FD GD HD DC ID JD KD"},Q:{"2":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:7,C:"Cookie Store API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/cors.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/cors.js
    index 844fe3324c4f9c..5b209ef833bd8b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/cors.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/cors.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"B","2":"J D NC","132":"A","260":"E F"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","2":"OC 3B","1025":"5B hB iB jB kB lB mB nB oB pB"},D:{"1":"0 1 2 3 5 6 7 8 9 K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","132":"4 I J D E F A B C"},E:{"2":"SC 9B","513":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","644":"4 I TC"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"F B bC cC dC eC yB LC fC"},G:{"513":"E iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","644":"9B gC MC hC"},H:{"2":"1C"},I:{"1":"H 6C 7C","132":"3B I 2C 3C 4C 5C MC"},J:{"1":"A","132":"D"},K:{"1":"C q zB","2":"A B yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","132":"A"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Cross-Origin Resource Sharing",D:true};
    +module.exports={A:{A:{"1":"B","2":"J E QC","132":"A","260":"F G"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","2":"RC 5B","1025":"7B kB lB mB nB oB pB qB rB sB"},D:{"1":"0 1 2 3 4 5 6 7 9 K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","132":"8 I J E F G A B C"},E:{"2":"UC CC","513":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","644":"8 I VC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"G B fC gC hC iC 0B OC jC"},G:{"513":"F mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","644":"CC kC PC lC"},H:{"2":"6C"},I:{"1":"D BD CD","132":"5B I 7C 8C 9C AD PC"},J:{"1":"A","132":"E"},K:{"1":"C s 1B","2":"A B 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","132":"A"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Cross-Origin Resource Sharing",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/createimagebitmap.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/createimagebitmap.js
    index 15369a1f581ac6..d60cf02b39a2d2 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/createimagebitmap.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/createimagebitmap.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB QC RC","1028":"c d e f g","3076":"PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b","8196":"0 1 2 3 h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"0 1 2 3 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB","132":"XB YB","260":"ZB aB","516":"bB cB dB eB fB"},E:{"2":"4 I J D E F A B C K L SC 9B TC UC VC WC AC yB zB BC XC","4100":"G YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB bC cC dC eC yB LC fC zB","132":"KB LB","260":"MB NB","516":"OB PB QB RB SB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC","4100":"zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"8196":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","16":"I 8C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"3076":"LD MD"}},B:1,C:"createImageBitmap",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SC TC","1028":"c d e f g","3076":"SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b","8196":"0 1 2 3 4 5 6 7 h i j k l m n t u v w x y z D 9B AC BC"},D:{"1":"0 1 2 3 4 5 6 7 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB","132":"aB bB","260":"cB dB","516":"eB fB gB hB iB"},E:{"2":"8 I J E F G A B C K L UC CC VC WC XC YC DC 0B 1B EC ZC","4100":"H aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB fC gC hC iC 0B OC jC 1B","132":"NB OB","260":"PB QB","516":"RB SB TB UB VB"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C","4100":"3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"8196":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","16":"I DD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"3076":"QD RD"}},B:1,C:"createImageBitmap",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/credential-management.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/credential-management.js
    index 947aad23e6687e..a6218da274ef02 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/credential-management.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/credential-management.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB","66":"VB WB XB","129":"YB ZB aB bB cB dB"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB bC cC dC eC yB LC fC zB"},G:{"1":"xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:5,C:"Credential Management API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB","66":"YB ZB aB","129":"bB cB dB eB fB gB"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB fC gC hC iC 0B OC jC 1B"},G:{"1":"1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:5,C:"Credential Management API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/cryptography.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/cryptography.js
    index 14632dd1338441..6d061a1aa619cf 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/cryptography.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/cryptography.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"NC","8":"J D E F A","164":"B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","513":"C K L G M N O"},C:{"1":"0 1 2 3 HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","8":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB QC RC","66":"FB GB"},D:{"1":"0 1 2 3 KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","8":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB"},E:{"1":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","8":"4 I J D SC 9B TC UC","289":"E F A VC WC AC"},F:{"1":"7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","8":"5 6 F B C G M N O n o p bC cC dC eC yB LC fC zB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","8":"9B gC MC hC iC jC","289":"E kC lC mC nC oC"},H:{"2":"1C"},I:{"1":"H","8":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"8":"D A"},K:{"1":"q","8":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"8":"A","164":"B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"Web Cryptography",D:true};
    +module.exports={A:{A:{"2":"QC","8":"J E F G A","164":"B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","513":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","8":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB SC TC","66":"IB JB"},D:{"1":"0 1 2 3 4 5 6 7 NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","8":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB"},E:{"1":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","8":"8 I J E UC CC VC WC","289":"F G A XC YC DC"},F:{"1":"AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","8":"9 G B C H M N O o p q r fC gC hC iC 0B OC jC 1B"},G:{"1":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","8":"CC kC PC lC mC nC","289":"F oC pC qC rC sC"},H:{"2":"6C"},I:{"1":"D","8":"5B I 7C 8C 9C AD PC BD CD"},J:{"8":"E A"},K:{"1":"s","8":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"8":"A","164":"B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"Web Cryptography",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-all.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-all.js
    index ecba177dd2a506..fced14b90abcae 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-all.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-all.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p QC RC"},D:{"1":"0 1 2 3 KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB"},E:{"1":"A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC"},F:{"1":"7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 F B C G M N O n o p bC cC dC eC yB LC fC zB"},G:{"1":"mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC"},H:{"2":"1C"},I:{"1":"H 7C","2":"3B I 2C 3C 4C 5C MC 6C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"CSS all property",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB"},E:{"1":"A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC"},F:{"1":"AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r fC gC hC iC 0B OC jC 1B"},G:{"1":"qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC"},H:{"2":"6C"},I:{"1":"D CD","2":"5B I 7C 8C 9C AD PC BD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"CSS all property",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-anchor-positioning.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-anchor-positioning.js
    index 5572a7d3237398..a72b8ce39a5f68 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-anchor-positioning.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-anchor-positioning.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z","194":"H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:5,C:"CSS Anchor Positioning",D:false};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z","194":"5 6 7 D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:5,C:"CSS Anchor Positioning",D:false};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-animation.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-animation.js
    index ec65278e811cdc..5d5acb79f6ac21 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-animation.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-animation.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B I QC RC","33":"4 J D E F A B C K L G"},D:{"1":"0 1 2 3 QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","33":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC 9B","33":"J D E TC UC VC","292":"4 I"},F:{"1":"DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"F B bC cC dC eC yB LC fC","33":"5 6 7 8 9 C G M N O n o p AB BB CB"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","33":"E iC jC kC","164":"9B gC MC hC"},H:{"2":"1C"},I:{"1":"H","33":"I 5C MC 6C 7C","164":"3B 2C 3C 4C"},J:{"33":"D A"},K:{"1":"q zB","2":"A B C yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"CSS Animation",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B I SC TC","33":"8 J E F G A B C K L H"},D:{"1":"0 1 2 3 4 5 6 7 TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","33":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC CC","33":"J E F VC WC XC","292":"8 I"},F:{"1":"GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"G B fC gC hC iC 0B OC jC","33":"9 C H M N O o p q r AB BB CB DB EB FB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","33":"F mC nC oC","164":"CC kC PC lC"},H:{"2":"6C"},I:{"1":"D","33":"I AD PC BD CD","164":"5B 7C 8C 9C"},J:{"33":"E A"},K:{"1":"s 1B","2":"A B C 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"CSS Animation",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-any-link.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-any-link.js
    index 3cd7c17dbf2ab2..4cf5869742d4f6 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-any-link.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-any-link.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","16":"OC","33":"4 5 6 7 8 9 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB QC RC"},D:{"1":"0 1 2 3 kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 I J D E F A B C K L","33":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"4 I J SC 9B TC","33":"D E UC VC"},F:{"1":"ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","33":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC MC hC","33":"E iC jC kC"},H:{"2":"1C"},I:{"1":"H","16":"3B I 2C 3C 4C 5C MC","33":"6C 7C"},J:{"16":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p CD AC DD ED FD GD HD 1B 2B ID JD","16":"I","33":"8C 9C AD BD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","33":"LD"}},B:5,C:"CSS :any-link selector",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"RC","33":"8 9 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 I J E F G A B C K L","33":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"8 I J UC CC VC","33":"E F WC XC"},F:{"1":"cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","33":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC PC lC","33":"F mC nC oC"},H:{"2":"6C"},I:{"1":"D","16":"5B I 7C 8C 9C AD PC","33":"BD CD"},J:{"16":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r HD DC ID JD KD LD MD 3B 4B ND OD","16":"I","33":"DD ED FD GD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","33":"QD"}},B:5,C:"CSS :any-link selector",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-appearance.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-appearance.js
    index a933af239fb197..86bdb386d6cc59 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-appearance.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-appearance.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","33":"S","164":"P Q R","388":"C K L G M N O"},C:{"1":"0 1 2 3 Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","164":"IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P","676":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB QC RC"},D:{"1":"0 1 2 3 T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","33":"S","164":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R"},E:{"1":"DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","164":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC"},F:{"1":"q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","33":"pB qB rB","164":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB"},G:{"1":"DC 0B 0C 1B EC FC GC HC IC JC 2B KC","164":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC"},H:{"2":"1C"},I:{"1":"H","164":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"164":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A","388":"B"},O:{"1":"0B"},P:{"164":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"164":"BC"},R:{"1":"KD"},S:{"1":"MD","164":"LD"}},B:5,C:"CSS Appearance",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","33":"S","164":"P Q R","388":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","164":"LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P","676":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","33":"S","164":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R"},E:{"1":"GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","164":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC"},F:{"1":"s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","33":"sB tB uB","164":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB"},G:{"1":"GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","164":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC"},H:{"2":"6C"},I:{"1":"D","164":"5B I 7C 8C 9C AD PC BD CD"},J:{"164":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A","388":"B"},O:{"1":"2B"},P:{"164":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"164":"EC"},R:{"1":"PD"},S:{"1":"RD","164":"QD"}},B:5,C:"CSS Appearance",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-at-counter-style.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-at-counter-style.js
    index b9b34912d48f43..3fb9f96df59f5e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-at-counter-style.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-at-counter-style.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O P Q R S T U V W X Y Z","132":"0 1 2 3 a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB QC RC","132":"0 1 2 3 GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z","132":"0 1 2 3 a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC","4":"2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB bC cC dC eC yB LC fC zB","132":"vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC","4":"2B KC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC 6C 7C","132":"H"},J:{"2":"D A"},K:{"2":"A B C yB LC zB","132":"q"},L:{"132":"H"},M:{"132":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"2":"I 8C 9C AD BD CD AC DD ED FD GD HD","132":"n o p 1B 2B ID JD"},Q:{"2":"BC"},R:{"132":"KD"},S:{"132":"LD MD"}},B:4,C:"CSS Counter Styles",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O P Q R S T U V W X Y Z","132":"0 1 2 3 4 5 6 7 a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB SC TC","132":"0 1 2 3 4 5 6 7 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z","132":"0 1 2 3 4 5 6 7 a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC","4":"4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB fC gC hC iC 0B OC jC 1B","132":"yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C","4":"4B MC NC"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC BD CD","132":"D"},J:{"2":"E A"},K:{"2":"A B C 0B OC 1B","132":"s"},L:{"132":"D"},M:{"132":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"2":"I DD ED FD GD HD DC ID JD KD LD MD","132":"o p q r 3B 4B ND OD"},Q:{"2":"EC"},R:{"132":"PD"},S:{"132":"QD RD"}},B:4,C:"CSS Counter Styles",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-autofill.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-autofill.js
    index 3ceef876f13d36..9fd115d4cb4cf7 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-autofill.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-autofill.js
    @@ -1 +1 @@
    -module.exports={A:{D:{"33":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},L:{"33":"H"},B:{"2":"C K L G M N O","33":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U QC RC"},M:{"1":"xB"},A:{"2":"J D E F A B NC"},F:{"2":"F B C bC cC dC eC yB LC fC zB","33":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},K:{"2":"A B C yB LC zB","33":"q"},E:{"1":"G YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC","2":"aC","33":"4 I J D E F A B C K L SC 9B TC UC VC WC AC yB zB BC XC"},G:{"1":"zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","33":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC"},P:{"33":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},I:{"2":"3B I 2C 3C 4C 5C MC","33":"H 6C 7C"}},B:6,C:":autofill CSS pseudo-class",D:undefined};
    +module.exports={A:{D:{"1":"0 1 2 3 4 5 6 7 y z D 9B AC BC","33":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x"},L:{"1":"D"},B:{"1":"0 1 2 3 4 5 6 7 y z D","2":"C K L H M N O","33":"P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x"},C:{"1":"0 1 2 3 4 5 6 7 V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U SC TC"},M:{"1":"D"},A:{"2":"J E F G A B QC"},F:{"1":"f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","33":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e"},K:{"2":"A B C 0B OC 1B","33":"s"},E:{"1":"H aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC","2":"eC","33":"8 I J E F G A B C K L UC CC VC WC XC YC DC 0B 1B EC ZC"},G:{"1":"3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","33":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C"},P:{"1":"p q r","33":"I o DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC","33":"BD CD"}},B:6,C:":autofill CSS pseudo-class",D:undefined};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-backdrop-filter.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-backdrop-filter.js
    index 293a0acceca043..8177a39692cae6 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-backdrop-filter.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-backdrop-filter.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M","257":"N O"},C:{"1":"0 1 2 3 m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB QC RC","578":"pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l"},D:{"1":"0 1 2 3 uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB","194":"UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB"},E:{"2":"4 I J D E SC 9B TC UC VC","33":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB bC cC dC eC yB LC fC zB","194":"HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB"},G:{"2":"E 9B gC MC hC iC jC kC","33":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p ED FD GD HD 1B 2B ID JD","2":"I","194":"8C 9C AD BD CD AC DD"},Q:{"2":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:7,C:"CSS Backdrop Filter",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M","257":"N O"},C:{"1":"0 1 2 3 4 5 6 7 m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB SC TC","578":"sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l"},D:{"1":"0 1 2 3 4 5 6 7 xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB","194":"XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB"},E:{"2":"8 I J E F UC CC VC WC XC","33":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB fC gC hC iC 0B OC jC 1B","194":"KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB"},G:{"2":"F CC kC PC lC mC nC oC","33":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r JD KD LD MD 3B 4B ND OD","2":"I","194":"DD ED FD GD HD DC ID"},Q:{"2":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:7,C:"CSS Backdrop Filter",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-background-offsets.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-background-offsets.js
    index d40745de99bdcf..4c64ccce4ab08a 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-background-offsets.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-background-offsets.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C QC RC"},D:{"1":"0 1 2 3 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 I J D E F A B C K L G M N O n o p"},E:{"1":"D E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J SC 9B TC UC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m dC eC yB LC fC zB","2":"F bC cC"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC"},H:{"1":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"1":"A","2":"D"},K:{"1":"B C q yB LC zB","2":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS background-position edge offsets",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C SC TC"},D:{"1":"0 1 2 3 4 5 6 7 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB"},E:{"1":"E F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J UC CC VC WC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n hC iC 0B OC jC 1B","2":"G fC gC"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC"},H:{"1":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"1":"A","2":"E"},K:{"1":"B C s 0B OC 1B","2":"A"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS background-position edge offsets",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-backgroundblendmode.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-backgroundblendmode.js
    index 6f96aa7b43c43b..4e25a0a9504a39 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-backgroundblendmode.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-backgroundblendmode.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB QC RC"},D:{"1":"0 1 2 3 IB JB KB LB MB NB OB PB QB RB SB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB","260":"TB"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D SC 9B TC UC","132":"E F A VC WC"},F:{"1":"6 7 8 9 p AB BB CB DB EB FB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 F B C G M N O n o bC cC dC eC yB LC fC zB","260":"GB"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC jC","132":"E kC lC mC nC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS background-blend-mode",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 LB MB NB OB PB QB RB SB TB UB VB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB","260":"WB"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E UC CC VC WC","132":"F G A XC YC"},F:{"1":"q r AB BB CB DB EB FB GB HB IB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p fC gC hC iC 0B OC jC 1B","260":"JB"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC nC","132":"F oC pC qC rC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS background-blend-mode",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-boxdecorationbreak.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-boxdecorationbreak.js
    index 09e8730776d5da..64b53965d54a72 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-boxdecorationbreak.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-boxdecorationbreak.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O","164":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB QC RC"},D:{"2":"4 5 I J D E F A B C K L G M N O n o","164":"0 1 2 3 6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J SC 9B TC","164":"D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"F bC cC dC eC","129":"B C yB LC fC zB","164":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"9B gC MC hC iC","164":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"132":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC","164":"H 6C 7C"},J:{"2":"D","164":"A"},K:{"2":"A","129":"B C yB LC zB","164":"q"},L:{"164":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"164":"0B"},P:{"164":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"164":"BC"},R:{"164":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS box-decoration-break",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O","164":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB SC TC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p","164":"0 1 2 3 4 5 6 7 q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J UC CC VC","164":"E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"G fC gC hC iC","129":"B C 0B OC jC 1B","164":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"CC kC PC lC mC","164":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"132":"6C"},I:{"2":"5B I 7C 8C 9C AD PC","164":"D BD CD"},J:{"2":"E","164":"A"},K:{"2":"A","129":"B C 0B OC 1B","164":"s"},L:{"164":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"164":"2B"},P:{"164":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"164":"EC"},R:{"164":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS box-decoration-break",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-boxshadow.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-boxshadow.js
    index 370c7a7e5852fe..5328e8d55cdc6e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-boxshadow.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-boxshadow.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B","33":"QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","33":"4 I J D E F"},E:{"1":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","33":"4","164":"I SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m dC eC yB LC fC zB","2":"F bC cC"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","33":"gC MC","164":"9B"},H:{"2":"1C"},I:{"1":"I H 5C MC 6C 7C","164":"3B 2C 3C 4C"},J:{"1":"A","33":"D"},K:{"1":"B C q yB LC zB","2":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS3 Box-shadow",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B","33":"SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","33":"8 I J E F G"},E:{"1":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","33":"8","164":"I UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n hC iC 0B OC jC 1B","2":"G fC gC"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","33":"kC PC","164":"CC"},H:{"2":"6C"},I:{"1":"I D AD PC BD CD","164":"5B 7C 8C 9C"},J:{"1":"A","33":"E"},K:{"1":"B C s 0B OC 1B","2":"A"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS3 Box-shadow",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-canvas.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-canvas.js
    index 8da18735cda296..c176169a5a87cb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-canvas.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-canvas.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","33":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB"},E:{"2":"SC 9B","33":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"F B C IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","33":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB"},G:{"33":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"H","33":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"33":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","33":"I"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:7,C:"CSS Canvas Drawings",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","33":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB"},E:{"2":"UC CC","33":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"G B C LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","33":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB"},G:{"33":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"D","33":"5B I 7C 8C 9C AD PC BD CD"},J:{"33":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","33":"I"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:7,C:"CSS Canvas Drawings",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-caret-color.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-caret-color.js
    index 2fef7998b0ab1d..25ea23f3b96e1e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-caret-color.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-caret-color.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB QC RC"},D:{"1":"0 1 2 3 eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB"},E:{"1":"C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B SC 9B TC UC VC WC AC"},F:{"1":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB bC cC dC eC yB LC fC zB"},G:{"1":"qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:2,C:"CSS caret-color",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB"},E:{"1":"C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B UC CC VC WC XC YC DC"},F:{"1":"UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB fC gC hC iC 0B OC jC 1B"},G:{"1":"uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:2,C:"CSS caret-color",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-cascade-layers.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-cascade-layers.js
    index 8b57f9505ee72b..8cfa2fa48fd6a3 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-cascade-layers.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-cascade-layers.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 i j k l m r s t u v w x y z H","2":"C K L G M N O P Q R S T U V W X Y Z a b c d e","322":"f g h"},C:{"1":"0 1 2 3 g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c QC RC","194":"d e f"},D:{"1":"0 1 2 3 i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e","322":"f g h"},E:{"1":"DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC"},F:{"1":"V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U bC cC dC eC yB LC fC zB"},G:{"1":"DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p ID JD","2":"I 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:4,C:"CSS Cascade Layers",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 i j k l m n t u v w x y z D","2":"C K L H M N O P Q R S T U V W X Y Z a b c d e","322":"f g h"},C:{"1":"0 1 2 3 4 5 6 7 g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c SC TC","194":"d e f"},D:{"1":"0 1 2 3 4 5 6 7 i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e","322":"f g h"},E:{"1":"GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC"},F:{"1":"V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U fC gC hC iC 0B OC jC 1B"},G:{"1":"GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r ND OD","2":"I DD ED FD GD HD DC ID JD KD LD MD 3B 4B"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:4,C:"CSS Cascade Layers",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-cascade-scope.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-cascade-scope.js
    index 2a5b60857cf112..28d9ef1524d1a8 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-cascade-scope.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-cascade-scope.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m","194":"0 1 2 3 r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m","194":"0 1 2 3 r s t u v w x y z H"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y bC cC dC eC yB LC fC zB","194":"Z a b c d e f g h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"194":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:7,C:"Scoped Styles: the @scope rule",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"6 7 D","2":"C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m","194":"0 1 2 3 4 5 n t u v w x y z"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"6 7 D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m","194":"0 1 2 3 4 5 n t u v w x y z"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y fC gC hC iC 0B OC jC 1B","194":"Z a b c d e f g h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:7,C:"Scoped Styles: the @scope rule",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-case-insensitive.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-case-insensitive.js
    index 2bb93583920bcc..12c04fdc6fcd40 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-case-insensitive.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-case-insensitive.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB QC RC"},D:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E SC 9B TC UC VC"},F:{"1":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB bC cC dC eC yB LC fC zB"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"Case-insensitive CSS attribute selectors",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F UC CC VC WC XC"},F:{"1":"MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB fC gC hC iC 0B OC jC 1B"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"Case-insensitive CSS attribute selectors",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-clip-path.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-clip-path.js
    index 8d7a7810a6c70d..e94dd5068f9a25 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-clip-path.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-clip-path.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N","260":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","3138":"O"},C:{"1":"0 1 2 3 bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B","132":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB QC RC","644":"UB VB WB XB YB ZB aB"},D:{"2":"4 5 6 I J D E F A B C K L G M N O n o p","260":"0 1 2 3 cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","292":"7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB"},E:{"2":"4 I J SC 9B TC UC","260":"L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","292":"D E F A B C K VC WC AC yB zB"},F:{"2":"F B C bC cC dC eC yB LC fC zB","260":"PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","292":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB"},G:{"2":"9B gC MC hC iC","260":"tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","292":"E jC kC lC mC nC oC pC qC rC sC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC","260":"H","292":"6C 7C"},J:{"2":"D A"},K:{"2":"A B C yB LC zB","260":"q"},L:{"260":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"260":"0B"},P:{"292":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"260":"BC"},R:{"260":"KD"},S:{"1":"MD","644":"LD"}},B:4,C:"CSS clip-path property (for HTML)",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N","260":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","3138":"O"},C:{"1":"0 1 2 3 4 5 6 7 eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B","132":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB SC TC","644":"XB YB ZB aB bB cB dB"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r","260":"0 1 2 3 4 5 6 7 fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","292":"AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB"},E:{"2":"8 I J UC CC VC WC","260":"L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","292":"E F G A B C K XC YC DC 0B 1B"},F:{"2":"G B C fC gC hC iC 0B OC jC 1B","260":"SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","292":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB"},G:{"2":"CC kC PC lC mC","260":"xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","292":"F nC oC pC qC rC sC tC uC vC wC"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC","260":"D","292":"BD CD"},J:{"2":"E A"},K:{"2":"A B C 0B OC 1B","260":"s"},L:{"260":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"260":"2B"},P:{"292":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"260":"EC"},R:{"260":"PD"},S:{"1":"RD","644":"QD"}},B:4,C:"CSS clip-path property (for HTML)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-color-adjust.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-color-adjust.js
    index dc68674d9038d6..c7c15f6ab0049d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-color-adjust.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-color-adjust.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O","33":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB QC RC"},D:{"16":"4 I J D E F A B C K L G M N O","33":"0 1 2 3 5 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC","33":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC"},F:{"2":"F B C bC cC dC eC yB LC fC zB","33":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"1":"DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC"},H:{"2":"1C"},I:{"16":"3B I 2C 3C 4C 5C MC 6C 7C","33":"H"},J:{"16":"D A"},K:{"2":"A B C yB LC zB","33":"q"},L:{"16":"H"},M:{"1":"xB"},N:{"16":"A B"},O:{"16":"0B"},P:{"16":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"33":"BC"},R:{"16":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS print-color-adjust",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O","33":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB SC TC"},D:{"16":"8 I J E F G A B C K L H M N O","33":"0 1 2 3 4 5 6 7 9 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC","33":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC"},F:{"2":"G B C fC gC hC iC 0B OC jC 1B","33":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"1":"GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC"},H:{"2":"6C"},I:{"16":"5B I 7C 8C 9C AD PC BD CD","33":"D"},J:{"16":"E A"},K:{"2":"A B C 0B OC 1B","33":"s"},L:{"16":"D"},M:{"1":"D"},N:{"16":"A B"},O:{"16":"2B"},P:{"16":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"33":"EC"},R:{"16":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS print-color-adjust",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-color-function.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-color-function.js
    index 062ff7318a223b..d76869598259a0 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-color-function.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-color-function.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 y z H","2":"C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u","322":"v w x"},C:{"1":"0 1 2 3 H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x QC RC","578":"y z"},D:{"1":"0 1 2 3 y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u","322":"v w x"},E:{"1":"G YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC","132":"B C K L AC yB zB BC XC"},F:{"1":"h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d bC cC dC eC yB LC fC zB","322":"e f g"},G:{"1":"zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC","132":"oC pC qC rC sC tC uC vC wC xC yC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"p","2":"I n o 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:4,C:"CSS color() function",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 z D","2":"C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v","322":"w x y"},C:{"1":"1 2 3 4 5 6 7 D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y SC TC","578":"0 z"},D:{"1":"0 1 2 3 4 5 6 7 z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v","322":"w x y"},E:{"1":"H aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC","132":"B C K L DC 0B 1B EC ZC"},F:{"1":"h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d fC gC hC iC 0B OC jC 1B","322":"e f g"},G:{"1":"3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC","132":"sC tC uC vC wC xC yC zC 0C 1C 2C"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"q r","2":"I o p DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:4,C:"CSS color() function",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-conic-gradients.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-conic-gradients.js
    index b0d6449a4ce4fe..52723df234825a 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-conic-gradients.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-conic-gradients.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB QC RC","578":"tB uB vB wB P Q R 6B"},D:{"1":"0 1 2 3 qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB","257":"oB pB","450":"4B gB 5B hB iB jB kB lB mB nB"},E:{"1":"K L G zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C SC 9B TC UC VC WC AC yB"},F:{"1":"fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB bC cC dC eC yB LC fC zB","257":"dB eB","450":"TB UB VB WB XB YB ZB aB bB cB"},G:{"1":"sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:5,C:"CSS Conical Gradients",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB SC TC","578":"wB xB yB zB P Q R 8B"},D:{"1":"0 1 2 3 4 5 6 7 tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB","257":"rB sB","450":"6B jB 7B kB lB mB nB oB pB qB"},E:{"1":"K L H 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C UC CC VC WC XC YC DC 0B"},F:{"1":"iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB fC gC hC iC 0B OC jC 1B","257":"gB hB","450":"WB XB YB ZB aB bB cB dB eB fB"},G:{"1":"wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD GD HD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:5,C:"CSS Conical Gradients",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-container-queries-style.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-container-queries-style.js
    index bac9d40464266c..f6a112c10e69cf 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-container-queries-style.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-container-queries-style.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t","194":"u v w x","260":"0 1 2 3 y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t","194":"u v w x","260":"0 1 2 3 y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b bC cC dC eC yB LC fC zB","194":"c d e f g","260":"h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC 6C 7C","260":"H"},J:{"2":"D A"},K:{"2":"A B C yB LC zB","194":"q"},L:{"260":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","260":"p"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:5,C:"CSS Container Style Queries",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u","194":"v w x y","260":"0 1 2 3 4 5 6 7 z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u","194":"v w x y","260":"0 1 2 3 4 5 6 7 z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b fC gC hC iC 0B OC jC 1B","194":"c d e f g","260":"h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC BD CD","260":"D"},J:{"2":"E A"},K:{"2":"A B C 0B OC 1B","194":"s"},L:{"260":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","260":"q r"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:5,C:"CSS Container Style Queries",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-container-queries.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-container-queries.js
    index cbfc93cc815fb7..01c66d37956e94 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-container-queries.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-container-queries.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 t u v w x y z H","2":"C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r","516":"s"},C:{"1":"0 1 2 3 x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w QC RC"},D:{"1":"0 1 2 3 t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a","194":"c d e f g h i j k l m r","450":"b","516":"s"},E:{"1":"1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC"},F:{"1":"d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB bC cC dC eC yB LC fC zB","194":"P Q R 6B S T U V W X Y Z","516":"a b c"},G:{"1":"1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"n o p","2":"I 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:5,C:"CSS Container Queries (Size)",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 u v w x y z D","2":"C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n","516":"t"},C:{"1":"0 1 2 3 4 5 6 7 y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x SC TC"},D:{"1":"0 1 2 3 4 5 6 7 u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a","194":"c d e f g h i j k l m n","450":"b","516":"t"},E:{"1":"3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC"},F:{"1":"d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB fC gC hC iC 0B OC jC 1B","194":"P Q R 8B S T U V W X Y Z","516":"a b c"},G:{"1":"3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"o p q r","2":"I DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:5,C:"CSS Container Queries (Size)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-container-query-units.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-container-query-units.js
    index f53f342f21e768..fd3c20e42c146f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-container-query-units.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-container-query-units.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 s t u v w x y z H","2":"C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r"},C:{"1":"0 1 2 3 x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w QC RC"},D:{"1":"0 1 2 3 s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b","194":"k l m r","450":"c d e f g h i j"},E:{"1":"1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC"},F:{"1":"a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB bC cC dC eC yB LC fC zB","194":"P Q R 6B S T U V W X Y Z"},G:{"1":"1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"n o p","2":"I 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:5,C:"CSS Container Query Units",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 t u v w x y z D","2":"C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n"},C:{"1":"0 1 2 3 4 5 6 7 y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x SC TC"},D:{"1":"0 1 2 3 4 5 6 7 t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b","194":"k l m n","450":"c d e f g h i j"},E:{"1":"3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC"},F:{"1":"a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB fC gC hC iC 0B OC jC 1B","194":"P Q R 8B S T U V W X Y Z"},G:{"1":"3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"o p q r","2":"I DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:5,C:"CSS Container Query Units",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-containment.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-containment.js
    index 62f3af88372d15..9b36a325b36217 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-containment.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-containment.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB QC RC","194":"OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB"},D:{"1":"0 1 2 3 ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB","66":"YB"},E:{"1":"DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC"},F:{"1":"NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB bC cC dC eC yB LC fC zB","66":"LB MB"},G:{"1":"DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","194":"LD"}},B:2,C:"CSS Containment",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB SC TC","194":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB"},D:{"1":"0 1 2 3 4 5 6 7 cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB","66":"bB"},E:{"1":"GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC"},F:{"1":"QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB fC gC hC iC 0B OC jC 1B","66":"OB PB"},G:{"1":"GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","194":"QD"}},B:2,C:"CSS Containment",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-content-visibility.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-content-visibility.js
    index ab7444727025be..c7a2a983d0215d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-content-visibility.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-content-visibility.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O P Q R S T"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v QC RC","194":"0 1 2 3 w x y z H xB 7B 8B PC"},D:{"1":"0 1 2 3 U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD AC DD ED FD"},Q:{"2":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:5,C:"CSS content-visibility",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O P Q R S T"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w SC TC","194":"0 1 2 3 4 5 6 7 x y z D 9B AC BC"},D:{"1":"0 1 2 3 4 5 6 7 U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T"},E:{"1":"eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC"},F:{"1":"tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r LD MD 3B 4B ND OD","2":"I DD ED FD GD HD DC ID JD KD"},Q:{"2":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:5,C:"CSS content-visibility",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-counters.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-counters.js
    index 1f7b5f486895fc..219a6d092c3f99 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-counters.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-counters.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"E F A B","2":"J D NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"CSS Counters",D:true};
    +module.exports={A:{A:{"1":"F G A B","2":"J E QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"CSS Counters",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-crisp-edges.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-crisp-edges.js
    index fa02f6143f29b7..f99c99376d2460 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-crisp-edges.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-crisp-edges.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J NC","2340":"D E F A B"},B:{"2":"C K L G M N O","1025":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC","513":"kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b","545":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB RC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB","1025":"0 1 2 3 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC","164":"J","4644":"D E F UC VC WC"},F:{"2":"5 6 7 8 9 F B G M N O n o p AB bC cC dC eC yB LC","545":"C fC zB","1025":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC","4260":"hC iC","4644":"E jC kC lC mC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC 6C 7C","1025":"H"},J:{"2":"D","4260":"A"},K:{"2":"A B yB LC","545":"C zB","1025":"q"},L:{"1025":"H"},M:{"1":"xB"},N:{"2340":"A B"},O:{"1025":"0B"},P:{"1025":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1025":"BC"},R:{"1025":"KD"},S:{"1":"MD","4097":"LD"}},B:4,C:"Crisp edges/pixelated images",D:true};
    +module.exports={A:{A:{"2":"J QC","2340":"E F G A B"},B:{"2":"C K L H M N O","1025":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC","513":"nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b","545":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB TC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB","1025":"0 1 2 3 4 5 6 7 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC","164":"J","4644":"E F G WC XC YC"},F:{"2":"9 G B H M N O o p q r AB BB CB DB fC gC hC iC 0B OC","545":"C jC 1B","1025":"EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC","4260":"lC mC","4644":"F nC oC pC qC"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC BD CD","1025":"D"},J:{"2":"E","4260":"A"},K:{"2":"A B 0B OC","545":"C 1B","1025":"s"},L:{"1025":"D"},M:{"1":"D"},N:{"2340":"A B"},O:{"1025":"2B"},P:{"1025":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1025":"EC"},R:{"1025":"PD"},S:{"1":"RD","4097":"QD"}},B:4,C:"Crisp edges/pixelated images",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-cross-fade.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-cross-fade.js
    index 915b7e5b424a4f..7dc51c3c827f41 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-cross-fade.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-cross-fade.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O","33":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"4 I J D E F A B C K L G M","33":"0 1 2 3 5 6 7 8 9 N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B","33":"J D E F TC UC VC WC"},F:{"2":"F B C bC cC dC eC yB LC fC zB","33":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC","33":"E hC iC jC kC lC mC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC","33":"H 6C 7C"},J:{"2":"D A"},K:{"2":"A B C yB LC zB","33":"q"},L:{"33":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"33":"0B"},P:{"33":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"33":"BC"},R:{"33":"KD"},S:{"2":"LD MD"}},B:4,C:"CSS Cross-Fade Function",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O","33":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"8 I J E F G A B C K L H M","33":"0 1 2 3 4 5 6 7 9 N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC","33":"J E F G VC WC XC YC"},F:{"2":"G B C fC gC hC iC 0B OC jC 1B","33":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC","33":"F lC mC nC oC pC qC"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC","33":"D BD CD"},J:{"2":"E A"},K:{"2":"A B C 0B OC 1B","33":"s"},L:{"33":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"33":"2B"},P:{"33":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"33":"EC"},R:{"33":"PD"},S:{"2":"QD RD"}},B:4,C:"CSS Cross-Fade Function",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-default-pseudo.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-default-pseudo.js
    index 42fd8d18876d68..d6b4e163465482 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-default-pseudo.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-default-pseudo.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","16":"OC 3B QC RC"},D:{"1":"0 1 2 3 YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 I J D E F A B C K L","132":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"4 I SC 9B","132":"J D E F A TC UC VC WC"},F:{"1":"LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","16":"F B bC cC dC eC yB LC","132":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB","260":"C fC zB"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC MC hC iC","132":"E jC kC lC mC nC"},H:{"260":"1C"},I:{"1":"H","16":"3B 2C 3C 4C","132":"I 5C MC 6C 7C"},J:{"16":"D","132":"A"},K:{"1":"q","16":"A B C yB LC","260":"zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","132":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:":default CSS pseudo-class",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 I J E F G A B C K L","132":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"8 I UC CC","132":"J E F G A VC WC XC YC"},F:{"1":"OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","16":"G B fC gC hC iC 0B OC","132":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB","260":"C jC 1B"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC PC lC mC","132":"F nC oC pC qC rC"},H:{"260":"6C"},I:{"1":"D","16":"5B 7C 8C 9C","132":"I AD PC BD CD"},J:{"16":"E","132":"A"},K:{"1":"s","16":"A B C 0B OC","260":"1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","132":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:":default CSS pseudo-class",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-descendant-gtgt.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-descendant-gtgt.js
    index 0d82c1adba1ca2..85a194c27798cc 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-descendant-gtgt.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-descendant-gtgt.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","16":"P"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"B","2":"4 I J D E F A C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:7,C:"Explicit descendant combinator >>",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","16":"P"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"B","2":"8 I J E F G A C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:7,C:"Explicit descendant combinator >>",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-deviceadaptation.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-deviceadaptation.js
    index 53244994a87da2..77d9c7ee7e742e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-deviceadaptation.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-deviceadaptation.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","164":"A B"},B:{"66":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","164":"C K L G M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB","66":"0 1 2 3 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB bC cC dC eC yB LC fC zB","66":"NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"292":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A q","292":"B C yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"164":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"66":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:5,C:"CSS Device Adaptation",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","164":"A B"},B:{"66":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","164":"C K L H M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB","66":"0 1 2 3 4 5 6 7 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB fC gC hC iC 0B OC jC 1B","66":"QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"292":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A s","292":"B C 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"164":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"66":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:5,C:"CSS Device Adaptation",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-dir-pseudo.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-dir-pseudo.js
    index 4c2f14ed80c068..3107c70d2c236c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-dir-pseudo.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-dir-pseudo.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r","194":"0 1 2 3 s t u v w x y z H"},C:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K L G M QC RC","33":"5 6 7 8 9 N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB"},D:{"1":"8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z","194":"0 1 2 3 a b c d e f g h i j k l m r s t u v w x y z H xB 7B"},E:{"1":"HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z bC cC dC eC yB LC fC zB","194":"a b c d e f g h i j k l m"},G:{"1":"HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"1":"MD","33":"LD"}},B:5,C:":dir() CSS pseudo-class",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n","194":"0 1 2 3 4 5 6 7 t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K L H M SC TC","33":"9 N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB"},D:{"1":"7 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z","194":"0 1 2 3 4 5 6 a b c d e f g h i j k l m n t u v w x y z D"},E:{"1":"KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z fC gC hC iC 0B OC jC 1B","194":"a b c d e f g h i j k l m n"},G:{"1":"KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"1":"RD","33":"QD"}},B:5,C:":dir() CSS pseudo-class",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-display-contents.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-display-contents.js
    index bfc83ec37c2359..a60fc1a8ba1818 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-display-contents.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-display-contents.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O","132":"P Q R S T U V W X","260":"0 1 2 3 Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB QC RC","132":"KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B","260":"0 1 2 3 hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB","132":"kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X","194":"fB 4B gB 5B hB iB jB","260":"0 1 2 3 Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B SC 9B TC UC VC WC AC","132":"C K L G yB zB BC XC YC CC DC 0B ZC","260":"2B KC aC","772":"1B EC FC GC HC IC JC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB bC cC dC eC yB LC fC zB","132":"ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB","260":"uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"1":"2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC","132":"qC rC sC tC uC vC","260":"wC xC yC zC CC DC 0B 0C","516":"EC FC GC HC IC JC","772":"1B"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC 6C 7C","260":"H"},J:{"2":"D A"},K:{"2":"A B C yB LC zB","260":"q"},L:{"260":"H"},M:{"260":"xB"},N:{"2":"A B"},O:{"132":"0B"},P:{"2":"I 8C 9C AD BD","132":"CD AC DD ED FD GD","260":"n o p HD 1B 2B ID JD"},Q:{"132":"BC"},R:{"260":"KD"},S:{"132":"LD","260":"MD"}},B:4,C:"CSS display: contents",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O","132":"P Q R S T U V W X","260":"0 1 2 3 4 5 6 7 Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB SC TC","132":"NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B","260":"0 1 2 3 4 5 6 7 kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB","132":"nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X","194":"iB 6B jB 7B kB lB mB","260":"0 1 2 3 4 5 6 7 Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B UC CC VC WC XC YC DC","132":"C K L H 0B 1B EC ZC aC FC GC 2B bC","260":"4B MC NC dC eC","772":"3B HC IC JC KC LC cC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB fC gC hC iC 0B OC jC 1B","132":"cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB","260":"xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"1":"4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC","132":"uC vC wC xC yC zC","260":"0C 1C 2C 3C FC GC 2B 4C","516":"HC IC JC KC LC 5C","772":"3B"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC BD CD","260":"D"},J:{"2":"E A"},K:{"2":"A B C 0B OC 1B","260":"s"},L:{"260":"D"},M:{"260":"D"},N:{"2":"A B"},O:{"132":"2B"},P:{"2":"I DD ED FD GD","132":"HD DC ID JD KD LD","260":"o p q r MD 3B 4B ND OD"},Q:{"132":"EC"},R:{"260":"PD"},S:{"132":"QD","260":"RD"}},B:4,C:"CSS display: contents",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-element-function.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-element-function.js
    index 809edb4da8861a..1c5bece0d95fb8 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-element-function.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-element-function.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"33":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","164":"OC 3B QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"33":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"33":"LD MD"}},B:5,C:"CSS element() function",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"33":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","164":"RC 5B SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"33":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"33":"QD RD"}},B:5,C:"CSS element() function",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-env-function.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-env-function.js
    index 7349c022d67b1c..b3cb5d3e01ae45 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-env-function.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-env-function.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB QC RC"},D:{"1":"0 1 2 3 oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB"},E:{"1":"C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC AC","132":"B"},F:{"1":"dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB bC cC dC eC yB LC fC zB"},G:{"1":"qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC","132":"pC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:7,C:"CSS Environment Variables env()",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB"},E:{"1":"C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC DC","132":"B"},F:{"1":"gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB fC gC hC iC 0B OC jC 1B"},G:{"1":"uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC","132":"tC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD GD HD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:7,C:"CSS Environment Variables env()",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-exclusions.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-exclusions.js
    index 2197d5ed543921..caba314cdcb64c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-exclusions.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-exclusions.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","33":"A B"},B:{"2":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","33":"C K L G M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"33":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:5,C:"CSS Exclusions Level 1",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","33":"A B"},B:{"2":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","33":"C K L H M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"33":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:5,C:"CSS Exclusions Level 1",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-featurequeries.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-featurequeries.js
    index 10df855f6fb7f2..66617abdfca709 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-featurequeries.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-featurequeries.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 OC 3B I J D E F A B C K L G M N O n o QC RC"},D:{"1":"0 1 2 3 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E SC 9B TC UC VC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"F B C bC cC dC eC yB LC fC"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC"},H:{"1":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS Feature Queries",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p SC TC"},D:{"1":"0 1 2 3 4 5 6 7 EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F UC CC VC WC XC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"G B C fC gC hC iC 0B OC jC"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC"},H:{"1":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS Feature Queries",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-file-selector-button.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-file-selector-button.js
    index b9eb1b8121fc6b..16fe480eb15d0a 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-file-selector-button.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-file-selector-button.js
    @@ -1 +1 @@
    -module.exports={A:{D:{"1":"0 1 2 3 Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","33":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X"},L:{"1":"H"},B:{"1":"0 1 2 3 Y Z a b c d e f g h i j k l m r s t u v w x y z H","33":"C K L G M N O P Q R S T U V W X"},C:{"1":"0 1 2 3 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R QC RC"},M:{"1":"xB"},A:{"2":"J D E F NC","33":"A B"},F:{"1":"tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","33":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB"},K:{"1":"q","2":"A B C yB LC zB"},E:{"1":"G XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC","2":"aC","33":"4 I J D E F A B C K L SC 9B TC UC VC WC AC yB zB BC"},G:{"1":"yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","33":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC"},P:{"1":"n o p HD 1B 2B ID JD","33":"I 8C 9C AD BD CD AC DD ED FD GD"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC","33":"6C 7C"}},B:6,C:"::file-selector-button CSS pseudo-element",D:undefined};
    +module.exports={A:{D:{"1":"0 1 2 3 4 5 6 7 Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","33":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X"},L:{"1":"D"},B:{"1":"0 1 2 3 4 5 6 7 Y Z a b c d e f g h i j k l m n t u v w x y z D","33":"C K L H M N O P Q R S T U V W X"},C:{"1":"0 1 2 3 4 5 6 7 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R SC TC"},M:{"1":"D"},A:{"2":"J E F G QC","33":"A B"},F:{"1":"wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","33":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB"},K:{"1":"s","2":"A B C 0B OC 1B"},E:{"1":"H ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC","2":"eC","33":"8 I J E F G A B C K L UC CC VC WC XC YC DC 0B 1B EC"},G:{"1":"2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","33":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C"},P:{"1":"o p q r MD 3B 4B ND OD","33":"I DD ED FD GD HD DC ID JD KD LD"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC","33":"BD CD"}},B:6,C:"::file-selector-button CSS pseudo-element",D:undefined};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-filter-function.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-filter-function.js
    index b43ff3d7fc4c81..bf1b1a2f62044c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-filter-function.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-filter-function.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E SC 9B TC UC VC","33":"F"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC","33":"lC mC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:5,C:"CSS filter() function",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F UC CC VC WC XC","33":"G"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC","33":"pC qC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:5,C:"CSS filter() function",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-filters.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-filters.js
    index c735b666593cfa..cf5bb92ce0551a 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-filters.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-filters.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","1028":"K L G M N O","1346":"C"},C:{"1":"0 1 2 3 IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC","196":"HB","516":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB RC"},D:{"1":"0 1 2 3 aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A B C K L G M N","33":"5 6 7 8 9 O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB"},E:{"1":"A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC","33":"J D E F UC VC"},F:{"1":"NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","33":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB"},G:{"1":"mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC","33":"E iC jC kC lC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC","33":"6C 7C"},J:{"2":"D","33":"A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p AD BD CD AC DD ED FD GD HD 1B 2B ID JD","33":"I 8C 9C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"CSS Filter Effects",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","1028":"K L H M N O","1346":"C"},C:{"1":"0 1 2 3 4 5 6 7 LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC","196":"KB","516":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB TC"},D:{"1":"0 1 2 3 4 5 6 7 dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A B C K L H M N","33":"9 O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB"},E:{"1":"A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC","33":"J E F G WC XC"},F:{"1":"QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","33":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB"},G:{"1":"qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC","33":"F mC nC oC pC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC","33":"BD CD"},J:{"2":"E","33":"A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r FD GD HD DC ID JD KD LD MD 3B 4B ND OD","33":"I DD ED"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"CSS Filter Effects",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-first-letter.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-first-letter.js
    index 63a7f3d8403b08..0054447df3f23c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-first-letter.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-first-letter.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","16":"NC","516":"E","1540":"J D"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","132":"3B","260":"OC"},D:{"1":"0 1 2 3 5 6 7 8 9 F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 J D E","132":"I"},E:{"1":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"4 SC","132":"I 9B"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m fC zB","16":"F bC","260":"B cC dC eC yB LC"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC MC"},H:{"1":"1C"},I:{"1":"3B I H 5C MC 6C 7C","16":"2C 3C","132":"4C"},J:{"1":"D A"},K:{"1":"C q zB","260":"A B yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"::first-letter CSS pseudo-element selector",D:true};
    +module.exports={A:{A:{"1":"G A B","16":"QC","516":"F","1540":"J E"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","132":"5B","260":"RC"},D:{"1":"0 1 2 3 4 5 6 7 9 G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 J E F","132":"I"},E:{"1":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"8 UC","132":"I CC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n jC 1B","16":"G fC","260":"B gC hC iC 0B OC"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC PC"},H:{"1":"6C"},I:{"1":"5B I D AD PC BD CD","16":"7C 8C","132":"9C"},J:{"1":"E A"},K:{"1":"C s 1B","260":"A B 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"::first-letter CSS pseudo-element selector",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-first-line.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-first-line.js
    index 5c12e06c5be69d..f44064f8e86c92 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-first-line.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-first-line.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","132":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"CSS first-line pseudo-element",D:true};
    +module.exports={A:{A:{"1":"G A B","132":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"CSS first-line pseudo-element",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-fixed.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-fixed.js
    index f3ddf6c50f6870..0c9623479d990e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-fixed.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-fixed.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"D E F A B","2":"NC","8":"J"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","1025":"WC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC","132":"hC iC jC"},H:{"2":"1C"},I:{"1":"3B H 6C 7C","260":"2C 3C 4C","513":"I 5C MC"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"CSS position:fixed",D:true};
    +module.exports={A:{A:{"1":"E F G A B","2":"QC","8":"J"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","1025":"YC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC","132":"lC mC nC"},H:{"2":"6C"},I:{"1":"5B D BD CD","260":"7C 8C 9C","513":"I AD PC"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"CSS position:fixed",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-focus-visible.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-focus-visible.js
    index 34b8632bce639f..29e453766b9fb1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-focus-visible.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-focus-visible.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O","328":"P Q R S T U"},C:{"1":"0 1 2 3 U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC","161":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T"},D:{"1":"0 1 2 3 V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB","328":"mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U"},E:{"1":"DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K L SC 9B TC UC VC WC AC yB zB BC XC","578":"G YC CC"},F:{"1":"rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB bC cC dC eC yB LC fC zB","328":"lB mB nB oB pB qB"},G:{"1":"DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC","578":"zC CC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"n o p GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD AC DD ED FD"},Q:{"2":"BC"},R:{"1":"KD"},S:{"161":"LD MD"}},B:5,C:":focus-visible CSS pseudo-class",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O","328":"P Q R S T U"},C:{"1":"0 1 2 3 4 5 6 7 U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC","161":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T"},D:{"1":"0 1 2 3 4 5 6 7 V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB","328":"pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U"},E:{"1":"GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L UC CC VC WC XC YC DC 0B 1B EC ZC","578":"H aC FC"},F:{"1":"uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB fC gC hC iC 0B OC jC 1B","328":"oB pB qB rB sB tB"},G:{"1":"GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C","578":"3C FC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"o p q r LD MD 3B 4B ND OD","2":"I DD ED FD GD HD DC ID JD KD"},Q:{"2":"EC"},R:{"1":"PD"},S:{"161":"QD RD"}},B:5,C:":focus-visible CSS pseudo-class",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-focus-within.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-focus-within.js
    index 4037b18385ab95..66564c36e9ee8e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-focus-within.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-focus-within.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB QC RC"},D:{"1":"0 1 2 3 gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB","194":"4B"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC"},F:{"1":"UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB bC cC dC eC yB LC fC zB","194":"TB"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:7,C:":focus-within CSS pseudo-class",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB","194":"6B"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC"},F:{"1":"XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB fC gC hC iC 0B OC jC 1B","194":"WB"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:7,C:":focus-within CSS pseudo-class",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-font-palette.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-font-palette.js
    index f1bf0f68aff573..10d94bf106292e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-font-palette.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-font-palette.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 s t u v w x y z H","2":"C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r"},C:{"1":"0 1 2 3 u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t QC RC"},D:{"1":"0 1 2 3 k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j"},E:{"1":"DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC"},F:{"1":"W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V bC cC dC eC yB LC fC zB"},G:{"1":"DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"n o p JD","2":"I 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:5,C:"CSS font-palette",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 t u v w x y z D","2":"C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n"},C:{"1":"0 1 2 3 4 5 6 7 v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u SC TC"},D:{"1":"0 1 2 3 4 5 6 7 k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j"},E:{"1":"GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC"},F:{"1":"W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V fC gC hC iC 0B OC jC 1B"},G:{"1":"GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"o p q r OD","2":"I DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:5,C:"CSS font-palette",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-font-rendering-controls.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-font-rendering-controls.js
    index 26262d58a6383a..cc9bef7d8f3a44 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-font-rendering-controls.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-font-rendering-controls.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB QC RC","194":"TB UB VB WB XB YB ZB aB bB cB dB eB"},D:{"1":"0 1 2 3 gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB","66":"WB XB YB ZB aB bB cB dB eB fB 4B"},E:{"1":"C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B SC 9B TC UC VC WC AC"},F:{"1":"UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB bC cC dC eC yB LC fC zB","66":"JB KB LB MB NB OB PB QB RB SB TB"},G:{"1":"qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I","66":"8C 9C AD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","194":"LD"}},B:5,C:"CSS font-display",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB SC TC","194":"WB XB YB ZB aB bB cB dB eB fB gB hB"},D:{"1":"0 1 2 3 4 5 6 7 jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB","66":"ZB aB bB cB dB eB fB gB hB iB 6B"},E:{"1":"C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B UC CC VC WC XC YC DC"},F:{"1":"XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB fC gC hC iC 0B OC jC 1B","66":"MB NB OB PB QB RB SB TB UB VB WB"},G:{"1":"uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I","66":"DD ED FD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","194":"QD"}},B:5,C:"CSS font-display",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-font-stretch.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-font-stretch.js
    index c91c2ddf546f6a..cb717efcb98ae1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-font-stretch.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-font-stretch.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E QC RC"},D:{"1":"0 1 2 3 VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB"},E:{"1":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC AC"},F:{"1":"IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB bC cC dC eC yB LC fC zB"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"CSS font-stretch",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F SC TC"},D:{"1":"0 1 2 3 4 5 6 7 YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB"},E:{"1":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC DC"},F:{"1":"LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB fC gC hC iC 0B OC jC 1B"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"CSS font-stretch",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-gencontent.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-gencontent.js
    index e9f5374775276f..8586b012507af9 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-gencontent.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-gencontent.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D NC","132":"E"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"CSS Generated content for pseudo-elements",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E QC","132":"F"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"CSS Generated content for pseudo-elements",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-gradients.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-gradients.js
    index 07d01ebd9c46c8..7b603acc994c01 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-gradients.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-gradients.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC","260":"5 6 7 8 9 M N O n o p AB BB CB DB EB FB GB HB IB","292":"4 I J D E F A B C K L G RC"},D:{"1":"0 1 2 3 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","33":"5 6 7 8 A B C K L G M N O n o p","548":"4 I J D E F"},E:{"1":"DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC 9B","260":"D E F A B C K L G UC VC WC AC yB zB BC XC YC CC","292":"J TC","804":"4 I"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"F B bC cC dC eC","33":"C fC","164":"yB LC"},G:{"1":"DC 0B 0C 1B EC FC GC HC IC JC 2B KC","260":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC","292":"hC iC","804":"9B gC MC"},H:{"2":"1C"},I:{"1":"H 6C 7C","33":"I 5C MC","548":"3B 2C 3C 4C"},J:{"1":"A","548":"D"},K:{"1":"q zB","2":"A B","33":"C","164":"yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS Gradients",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC","260":"9 M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB","292":"8 I J E F G A B C K L H TC"},D:{"1":"0 1 2 3 4 5 6 7 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","33":"9 A B C K L H M N O o p q r AB BB","548":"8 I J E F G"},E:{"1":"GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC CC","260":"E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC","292":"J VC","804":"8 I"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"G B fC gC hC iC","33":"C jC","164":"0B OC"},G:{"1":"GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","260":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC","292":"lC mC","804":"CC kC PC"},H:{"2":"6C"},I:{"1":"D BD CD","33":"I AD PC","548":"5B 7C 8C 9C"},J:{"1":"A","548":"E"},K:{"1":"s 1B","2":"A B","33":"C","164":"0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS Gradients",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-grid-animation.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-grid-animation.js
    index 11e543bbfba58a..ea26deb9e0c080 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-grid-animation.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-grid-animation.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"1":"MD","2":"LD"}},B:4,C:"CSS Grid animation",D:false};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"1":"RD","2":"QD"}},B:4,C:"CSS Grid animation",D:false};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-grid.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-grid.js
    index 6284508f51c4a9..30e8ddb4ddb2be 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-grid.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-grid.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E NC","8":"F","292":"A B"},B:{"1":"0 1 2 3 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","292":"C K L G"},C:{"1":"0 1 2 3 bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K L G M N O QC RC","8":"5 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB","584":"NB OB PB QB RB SB TB UB VB WB XB YB","1025":"ZB aB"},D:{"1":"0 1 2 3 fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 I J D E F A B C K L G M N O n o p","8":"8 9 AB BB","200":"CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB","1025":"eB"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC","8":"J D E F A UC VC WC"},F:{"1":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB bC cC dC eC yB LC fC zB","200":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC","8":"E iC jC kC lC mC nC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C","8":"MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"292":"A B"},O:{"1":"0B"},P:{"1":"n o p 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"8C","8":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS Grid Layout (level 1)",D:true};
    +module.exports={A:{A:{"2":"J E F QC","8":"G","292":"A B"},B:{"1":"0 1 2 3 4 5 6 7 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","292":"C K L H"},C:{"1":"0 1 2 3 4 5 6 7 eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K L H M N O SC TC","8":"9 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB","584":"QB RB SB TB UB VB WB XB YB ZB aB bB","1025":"cB dB"},D:{"1":"0 1 2 3 4 5 6 7 iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB","8":"BB CB DB EB","200":"FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB","1025":"hB"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC","8":"J E F G A WC XC YC"},F:{"1":"UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB fC gC hC iC 0B OC jC 1B","200":"EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC","8":"F mC nC oC pC qC rC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD","8":"PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"292":"A B"},O:{"1":"2B"},P:{"1":"o p q r ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"DD","8":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS Grid Layout (level 1)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-hanging-punctuation.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-hanging-punctuation.js
    index dec6dca2704175..1af33d2b92c596 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-hanging-punctuation.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-hanging-punctuation.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC WC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:4,C:"CSS hanging-punctuation",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC YC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:4,C:"CSS hanging-punctuation",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-has.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-has.js
    index 18ffb76bc70195..7311adfd7993bb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-has.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-has.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 s t u v w x y z H","2":"C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l QC RC","322":"0 1 2 3 m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"0 1 2 3 s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j","194":"k l m r"},E:{"1":"DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC"},F:{"1":"a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z bC cC dC eC yB LC fC zB"},G:{"1":"DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"n o p","2":"I 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:5,C:":has() CSS relational pseudo-class",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 t u v w x y z D","2":"C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n"},C:{"1":"9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l SC TC","322":"0 1 2 3 4 5 6 7 m n t u v w x y z D"},D:{"1":"0 1 2 3 4 5 6 7 t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j","194":"k l m n"},E:{"1":"GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC"},F:{"1":"a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z fC gC hC iC 0B OC jC 1B"},G:{"1":"GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"o p q r","2":"I DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:5,C:":has() CSS relational pseudo-class",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-hyphens.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-hyphens.js
    index efdb8a8c52e30f..9e2c67b17b1880 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-hyphens.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-hyphens.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","33":"A B"},B:{"1":"0 1 2 3 s t u v w x y z H","33":"C K L G M N O","132":"P Q R S T U V W","260":"X Y Z a b c d e f g h i j k l m r"},C:{"1":"0 1 2 3 QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I QC RC","33":"5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB"},D:{"1":"0 1 2 3 X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB","132":"cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W"},E:{"1":"2B KC aC","2":"4 I SC 9B","33":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC"},F:{"1":"a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB bC cC dC eC yB LC fC zB","132":"PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z"},G:{"1":"2B KC","2":"9B gC","33":"E MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I","132":"8C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS Hyphenation",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","33":"A B"},B:{"1":"0 1 2 3 4 5 6 7 t u v w x y z D","33":"C K L H M N O","132":"P Q R S T U V W","260":"X Y Z a b c d e f g h i j k l m n"},C:{"1":"0 1 2 3 4 5 6 7 TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I SC TC","33":"9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB"},D:{"1":"0 1 2 3 4 5 6 7 X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB","132":"fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W"},E:{"1":"4B MC NC dC eC","2":"8 I UC CC","33":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC"},F:{"1":"a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB fC gC hC iC 0B OC jC 1B","132":"SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z"},G:{"1":"4B MC NC","2":"CC kC","33":"F PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I","132":"DD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS Hyphenation",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-image-orientation.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-image-orientation.js
    index 42adf7d61fe0c7..cf0c1366a525e4 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-image-orientation.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-image-orientation.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O P Q","257":"R S T U V W X"},C:{"1":"0 1 2 3 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 OC 3B I J D E F A B C K L G M N O n o p QC RC"},D:{"1":"0 1 2 3 Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q","257":"R S T U V W X"},E:{"1":"L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K SC 9B TC UC VC WC AC yB zB"},F:{"1":"vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB bC cC dC eC yB LC fC zB","257":"nB oB pB qB rB q sB tB uB"},G:{"1":"xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","132":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p HD 1B 2B ID JD","2":"I 8C 9C AD BD CD AC DD ED","257":"FD GD"},Q:{"2":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS3 image-orientation",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O P Q","257":"R S T U V W X"},C:{"1":"0 1 2 3 4 5 6 7 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q","257":"R S T U V W X"},E:{"1":"L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K UC CC VC WC XC YC DC 0B 1B"},F:{"1":"yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB fC gC hC iC 0B OC jC 1B","257":"qB rB sB tB uB s vB wB xB"},G:{"1":"1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","132":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r MD 3B 4B ND OD","2":"I DD ED FD GD HD DC ID JD","257":"KD LD"},Q:{"2":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS3 image-orientation",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-image-set.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-image-set.js
    index 7b739c9247a539..b1d67496af4faf 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-image-set.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-image-set.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"1 2 3 H","2":"C K L G M N O","164":"P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z","2049":"0"},C:{"1":"0 1 2 3 H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U QC RC","66":"V W","2305":"Y Z a b c d e f g h i j k l m r s t u v w x y z","2820":"X"},D:{"1":"1 2 3 H xB 7B 8B","2":"4 5 I J D E F A B C K L G M N O n","164":"6 7 8 9 o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z","2049":"0"},E:{"1":"2B KC aC","2":"4 I SC 9B TC","132":"A B C K AC yB zB BC","164":"J D E F UC VC WC","1540":"L G XC YC CC DC 0B ZC 1B EC FC GC HC IC JC"},F:{"1":"j k l m","2":"F B C bC cC dC eC yB LC fC zB","164":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h","2049":"i"},G:{"1":"2B KC","2":"9B gC MC hC","132":"nC oC pC qC rC sC tC uC vC wC","164":"E iC jC kC lC mC","1540":"xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC","164":"6C 7C"},J:{"2":"D","164":"A"},K:{"2":"A B C yB LC zB","164":"q"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"164":"0B"},P:{"164":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"164":"BC"},R:{"164":"KD"},S:{"2":"LD MD"}},B:5,C:"CSS image-set",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"2 3 4 5 6 7 D","2":"C K L H M N O","164":"0 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z","2049":"1"},C:{"1":"1 2 3 4 5 6 7 D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U SC TC","66":"V W","2305":"0 Y Z a b c d e f g h i j k l m n t u v w x y z","2820":"X"},D:{"1":"2 3 4 5 6 7 D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o","164":"0 p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z","2049":"1"},E:{"1":"4B MC NC dC eC","2":"8 I UC CC VC","132":"A B C K DC 0B 1B EC","164":"J E F G WC XC YC","1540":"L H ZC aC FC GC 2B bC 3B HC IC JC KC LC cC"},F:{"1":"j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","164":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h","2049":"i"},G:{"1":"4B MC NC","2":"CC kC PC lC","132":"rC sC tC uC vC wC xC yC zC 0C","164":"F mC nC oC pC qC","1540":"1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC","164":"BD CD"},J:{"2":"E","164":"A"},K:{"2":"A B C 0B OC 1B","164":"s"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"164":"2B"},P:{"164":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"164":"EC"},R:{"164":"PD"},S:{"2":"QD RD"}},B:5,C:"CSS image-set",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-in-out-of-range.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-in-out-of-range.js
    index 5a94823523efc5..484af3bb4e89f4 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-in-out-of-range.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-in-out-of-range.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C","260":"K L G M N O"},C:{"1":"0 1 2 3 XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB QC RC","516":"CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB"},D:{"1":"0 1 2 3 aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"I","16":"4 J D E F A B C K L","260":"ZB","772":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B","16":"4","772":"J D E F A TC UC VC WC"},F:{"1":"NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","16":"F bC","260":"B C MB cC dC eC yB LC fC zB","772":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC","772":"E hC iC jC kC lC mC nC"},H:{"132":"1C"},I:{"1":"H","2":"3B 2C 3C 4C","260":"I 5C MC 6C 7C"},J:{"2":"D","260":"A"},K:{"1":"q","260":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","260":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","516":"LD"}},B:5,C:":in-range and :out-of-range CSS pseudo-classes",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C","260":"K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB SC TC","516":"FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB"},D:{"1":"0 1 2 3 4 5 6 7 dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"I","16":"8 J E F G A B C K L","260":"cB","772":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC","16":"8","772":"J E F G A VC WC XC YC"},F:{"1":"QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","16":"G fC","260":"B C PB gC hC iC 0B OC jC 1B","772":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC","772":"F lC mC nC oC pC qC rC"},H:{"132":"6C"},I:{"1":"D","2":"5B 7C 8C 9C","260":"I AD PC BD CD"},J:{"2":"E","260":"A"},K:{"1":"s","260":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","260":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","516":"QD"}},B:5,C:":in-range and :out-of-range CSS pseudo-classes",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-indeterminate-pseudo.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-indeterminate-pseudo.js
    index bcfe73a529eb0a..9de543b11ed721 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-indeterminate-pseudo.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-indeterminate-pseudo.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E NC","132":"A B","388":"F"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","132":"C K L G M N O"},C:{"1":"0 1 2 3 YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","16":"OC 3B QC RC","132":"5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB","388":"4 I"},D:{"1":"0 1 2 3 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 I J D E F A B C K L","132":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"4 I J SC 9B","132":"D E F A UC VC WC","388":"TC"},F:{"1":"9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","16":"F B bC cC dC eC yB LC","132":"5 6 7 8 G M N O n o p","516":"C fC zB"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC MC hC iC","132":"E jC kC lC mC nC"},H:{"516":"1C"},I:{"1":"H","16":"3B 2C 3C 4C 7C","132":"6C","388":"I 5C MC"},J:{"16":"D","132":"A"},K:{"1":"q","16":"A B C yB LC","516":"zB"},L:{"1":"H"},M:{"1":"xB"},N:{"132":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","132":"LD"}},B:5,C:":indeterminate CSS pseudo-class",D:true};
    +module.exports={A:{A:{"2":"J E F QC","132":"A B","388":"G"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","132":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"RC 5B SC TC","132":"9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB","388":"8 I"},D:{"1":"0 1 2 3 4 5 6 7 PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 I J E F G A B C K L","132":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"8 I J UC CC","132":"E F G A WC XC YC","388":"VC"},F:{"1":"CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","16":"G B fC gC hC iC 0B OC","132":"9 H M N O o p q r AB BB","516":"C jC 1B"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC PC lC mC","132":"F nC oC pC qC rC"},H:{"516":"6C"},I:{"1":"D","16":"5B 7C 8C 9C CD","132":"BD","388":"I AD PC"},J:{"16":"E","132":"A"},K:{"1":"s","16":"A B C 0B OC","516":"1B"},L:{"1":"D"},M:{"1":"D"},N:{"132":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","132":"QD"}},B:5,C:":indeterminate CSS pseudo-class",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-initial-letter.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-initial-letter.js
    index e61ba79e0d5a06..59f0895d77d275 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-initial-letter.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-initial-letter.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w","260":"0 1 2 3 x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w","260":"0 1 2 3 x y z H xB 7B 8B"},E:{"2":"4 I J D E SC 9B TC UC VC","4":"F","164":"A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g bC cC dC eC yB LC fC zB","260":"h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC","164":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"260":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"o p","2":"I n 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:5,C:"CSS Initial Letter",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x","260":"0 1 2 3 4 5 6 7 y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x","260":"0 1 2 3 4 5 6 7 y z D 9B AC BC"},E:{"2":"8 I J E F UC CC VC WC XC","4":"G","164":"A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g fC gC hC iC 0B OC jC 1B","260":"h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC","164":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"260":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"p q r","2":"I o DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:5,C:"CSS Initial Letter",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-initial-value.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-initial-value.js
    index 10993d099697a2..2290461feccf87 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-initial-value.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-initial-value.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","33":"4 I J D E F A B C K L G M N O QC RC","164":"OC 3B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"SC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B"},H:{"2":"1C"},I:{"1":"3B I H 4C 5C MC 6C 7C","16":"2C 3C"},J:{"1":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS initial value",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","33":"8 I J E F G A B C K L H M N O SC TC","164":"RC 5B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"UC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC"},H:{"2":"6C"},I:{"1":"5B I D 9C AD PC BD CD","16":"7C 8C"},J:{"1":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS initial value",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-lch-lab.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-lch-lab.js
    index 7675a655ab3142..78d6cb530b79fb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-lch-lab.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-lch-lab.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 y z H","2":"C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w","322":"x"},C:{"1":"0 1 2 3 H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x QC RC","194":"y z"},D:{"1":"0 1 2 3 y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w","322":"x"},E:{"1":"G YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K L SC 9B TC UC VC WC AC yB zB BC XC"},F:{"1":"h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g bC cC dC eC yB LC fC zB"},G:{"1":"zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"p","2":"I n o 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:4,C:"LCH and Lab color values",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 z D","2":"C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x","322":"y"},C:{"1":"1 2 3 4 5 6 7 D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y SC TC","194":"0 z"},D:{"1":"0 1 2 3 4 5 6 7 z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x","322":"y"},E:{"1":"H aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L UC CC VC WC XC YC DC 0B 1B EC ZC"},F:{"1":"h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g fC gC hC iC 0B OC jC 1B"},G:{"1":"3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"q r","2":"I o p DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:4,C:"LCH and Lab color values",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-letter-spacing.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-letter-spacing.js
    index a50a2d96744264..46afdf6ac2cf93 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-letter-spacing.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-letter-spacing.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","16":"NC","132":"J D E"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","132":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB"},E:{"1":"D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"SC","132":"4 I J 9B TC"},F:{"1":"5 6 7 8 9 N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","16":"F bC","132":"B C G M cC dC eC yB LC fC zB"},G:{"1":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B"},H:{"2":"1C"},I:{"1":"H 6C 7C","16":"2C 3C","132":"3B I 4C 5C MC"},J:{"132":"D A"},K:{"1":"q","132":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"letter-spacing CSS property",D:true};
    +module.exports={A:{A:{"1":"G A B","16":"QC","132":"J E F"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","132":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB"},E:{"1":"E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"UC","132":"8 I J CC VC"},F:{"1":"9 N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","16":"G fC","132":"B C H M gC hC iC 0B OC jC 1B"},G:{"1":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC"},H:{"2":"6C"},I:{"1":"D BD CD","16":"7C 8C","132":"5B I 9C AD PC"},J:{"132":"E A"},K:{"1":"s","132":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"letter-spacing CSS property",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-line-clamp.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-line-clamp.js
    index b65a778519f9f1..a259bc10970918 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-line-clamp.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-line-clamp.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M","33":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","129":"N O"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB QC RC","33":"0 1 2 3 nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"16":"4 I J D E F A B C K","33":"0 1 2 3 5 6 7 8 9 L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"I SC 9B","33":"4 J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"F B C bC cC dC eC yB LC fC zB","33":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"9B gC MC","33":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"16":"2C 3C","33":"3B I H 4C 5C MC 6C 7C"},J:{"33":"D A"},K:{"2":"A B C yB LC zB","33":"q"},L:{"33":"H"},M:{"33":"xB"},N:{"2":"A B"},O:{"33":"0B"},P:{"33":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"33":"BC"},R:{"33":"KD"},S:{"2":"LD","33":"MD"}},B:5,C:"CSS line-clamp",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M","33":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","129":"N O"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB SC TC","33":"0 1 2 3 4 5 6 7 qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"16":"8 I J E F G A B C K","33":"0 1 2 3 4 5 6 7 9 L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"I UC CC","33":"8 J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"G B C fC gC hC iC 0B OC jC 1B","33":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"CC kC PC","33":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"16":"7C 8C","33":"5B I D 9C AD PC BD CD"},J:{"33":"E A"},K:{"2":"A B C 0B OC 1B","33":"s"},L:{"33":"D"},M:{"33":"D"},N:{"2":"A B"},O:{"33":"2B"},P:{"33":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"33":"EC"},R:{"33":"PD"},S:{"2":"QD","33":"RD"}},B:5,C:"CSS line-clamp",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-logical-props.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-logical-props.js
    index 9cfbde2241b626..a4462345d8efb8 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-logical-props.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-logical-props.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O","1028":"W X","1540":"P Q R S T U V"},C:{"1":"0 1 2 3 lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC","164":"4 5 6 7 8 9 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB QC RC","1540":"OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB"},D:{"1":"0 1 2 3 Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","292":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB","1028":"W X","1540":"oB pB qB rB q sB tB uB vB wB P Q R S T U V"},E:{"1":"G YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","292":"4 I J D E F A B C SC 9B TC UC VC WC AC yB","1540":"K L zB BC","3076":"XC"},F:{"1":"uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","292":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB","1028":"sB tB","1540":"dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q"},G:{"1":"zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","292":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC","1540":"sC tC uC vC wC xC","3076":"yC"},H:{"2":"1C"},I:{"1":"H","292":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"292":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p HD 1B 2B ID JD","292":"I 8C 9C AD BD CD","1540":"AC DD ED FD GD"},Q:{"1540":"BC"},R:{"1":"KD"},S:{"1":"MD","1540":"LD"}},B:5,C:"CSS Logical Properties",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O","1028":"W X","1540":"P Q R S T U V"},C:{"1":"0 1 2 3 4 5 6 7 oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC","164":"8 9 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB SC TC","1540":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB"},D:{"1":"0 1 2 3 4 5 6 7 Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","292":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB","1028":"W X","1540":"rB sB tB uB s vB wB xB yB zB P Q R S T U V"},E:{"1":"H aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","292":"8 I J E F G A B C UC CC VC WC XC YC DC 0B","1540":"K L 1B EC","3076":"ZC"},F:{"1":"xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","292":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB","1028":"vB wB","1540":"gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s"},G:{"1":"3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","292":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC","1540":"wC xC yC zC 0C 1C","3076":"2C"},H:{"2":"6C"},I:{"1":"D","292":"5B I 7C 8C 9C AD PC BD CD"},J:{"292":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r MD 3B 4B ND OD","292":"I DD ED FD GD HD","1540":"DC ID JD KD LD"},Q:{"1540":"EC"},R:{"1":"PD"},S:{"1":"RD","1540":"QD"}},B:5,C:"CSS Logical Properties",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-marker-pseudo.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-marker-pseudo.js
    index d75b2b077216fe..be2cfbd5de409c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-marker-pseudo.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-marker-pseudo.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O P Q R S T U"},C:{"1":"0 1 2 3 nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB QC RC"},D:{"1":"0 1 2 3 V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U"},E:{"1":"aC","2":"4 I J D E F A B SC 9B TC UC VC WC AC","129":"C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC"},F:{"1":"rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB bC cC dC eC yB LC fC zB"},G:{"1":"qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD AC DD ED FD"},Q:{"2":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:5,C:"CSS ::marker pseudo-element",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O P Q R S T U"},C:{"1":"0 1 2 3 4 5 6 7 qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U"},E:{"1":"eC","2":"8 I J E F G A B UC CC VC WC XC YC DC","129":"C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC"},F:{"1":"uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB fC gC hC iC 0B OC jC 1B"},G:{"1":"uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r LD MD 3B 4B ND OD","2":"I DD ED FD GD HD DC ID JD KD"},Q:{"2":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:5,C:"CSS ::marker pseudo-element",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-masks.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-masks.js
    index 9705fa72cad163..124a22faf4f230 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-masks.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-masks.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M","164":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","3138":"N","12292":"O"},C:{"1":"0 1 2 3 aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B","260":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB QC RC"},D:{"164":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC 9B","164":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC"},F:{"2":"F B C bC cC dC eC yB LC fC zB","164":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"1":"DC 0B 0C 1B EC FC GC HC IC JC 2B KC","164":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC"},H:{"2":"1C"},I:{"164":"H 6C 7C","676":"3B I 2C 3C 4C 5C MC"},J:{"164":"D A"},K:{"2":"A B C yB LC zB","164":"q"},L:{"164":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"164":"0B"},P:{"164":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"164":"BC"},R:{"164":"KD"},S:{"1":"MD","260":"LD"}},B:4,C:"CSS Masks",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M","164":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","3138":"N","12292":"O"},C:{"1":"0 1 2 3 4 5 6 7 dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B","260":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB SC TC"},D:{"1":"7 9B AC BC","164":"0 1 2 3 4 5 6 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},E:{"1":"GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC CC","164":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC"},F:{"2":"G B C fC gC hC iC 0B OC jC 1B","164":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"1":"GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","164":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC"},H:{"2":"6C"},I:{"164":"D BD CD","676":"5B I 7C 8C 9C AD PC"},J:{"164":"E A"},K:{"2":"A B C 0B OC 1B","164":"s"},L:{"164":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"164":"2B"},P:{"164":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"164":"EC"},R:{"164":"PD"},S:{"1":"RD","260":"QD"}},B:4,C:"CSS Masks",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-matches-pseudo.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-matches-pseudo.js
    index d8a8a3bab4fa41..983aaf5e8b4c7b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-matches-pseudo.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-matches-pseudo.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O","1220":"P Q R S T U V W"},C:{"1":"0 1 2 3 wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","16":"OC 3B QC RC","548":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB"},D:{"1":"0 1 2 3 X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 I J D E F A B C K L","164":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB","196":"kB lB mB","1220":"nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W"},E:{"1":"L G XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B","16":"4","164":"J D E TC UC VC","260":"F A B C K WC AC yB zB BC"},F:{"1":"tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","164":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB","196":"ZB aB bB","1220":"cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB"},G:{"1":"xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC MC hC iC","164":"E jC kC","260":"lC mC nC oC pC qC rC sC tC uC vC wC"},H:{"2":"1C"},I:{"1":"H","16":"3B 2C 3C 4C","164":"I 5C MC 6C 7C"},J:{"16":"D","164":"A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p HD 1B 2B ID JD","164":"I 8C 9C AD BD CD AC DD ED FD GD"},Q:{"1220":"BC"},R:{"1":"KD"},S:{"1":"MD","548":"LD"}},B:5,C:":is() CSS pseudo-class",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O","1220":"P Q R S T U V W"},C:{"1":"0 1 2 3 4 5 6 7 zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"RC 5B SC TC","548":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB"},D:{"1":"0 1 2 3 4 5 6 7 X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 I J E F G A B C K L","164":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB","196":"nB oB pB","1220":"qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W"},E:{"1":"L H ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC","16":"8","164":"J E F VC WC XC","260":"G A B C K YC DC 0B 1B EC"},F:{"1":"wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","164":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB","196":"cB dB eB","1220":"fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB"},G:{"1":"1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC PC lC mC","164":"F nC oC","260":"pC qC rC sC tC uC vC wC xC yC zC 0C"},H:{"2":"6C"},I:{"1":"D","16":"5B 7C 8C 9C","164":"I AD PC BD CD"},J:{"16":"E","164":"A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r MD 3B 4B ND OD","164":"I DD ED FD GD HD DC ID JD KD LD"},Q:{"1220":"EC"},R:{"1":"PD"},S:{"1":"RD","548":"QD"}},B:5,C:":is() CSS pseudo-class",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-math-functions.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-math-functions.js
    index 213b45fd236507..2df6b8f7369d90 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-math-functions.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-math-functions.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB QC RC"},D:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB"},E:{"1":"L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B SC 9B TC UC VC WC AC","132":"C K yB zB"},F:{"1":"lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB bC cC dC eC yB LC fC zB"},G:{"1":"wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC","132":"qC rC sC tC uC vC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD AC DD"},Q:{"2":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:5,C:"CSS math functions min(), max() and clamp()",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB"},E:{"1":"L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B UC CC VC WC XC YC DC","132":"C K 0B 1B"},F:{"1":"oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB fC gC hC iC 0B OC jC 1B"},G:{"1":"0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC","132":"uC vC wC xC yC zC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r JD KD LD MD 3B 4B ND OD","2":"I DD ED FD GD HD DC ID"},Q:{"2":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:5,C:"CSS math functions min(), max() and clamp()",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-media-interaction.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-media-interaction.js
    index b19680b7790de6..2da996fdb4b5d9 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-media-interaction.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-media-interaction.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB QC RC"},D:{"1":"0 1 2 3 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E SC 9B TC UC VC"},F:{"1":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB bC cC dC eC yB LC fC zB"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:4,C:"Media Queries: interaction media features",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F UC CC VC WC XC"},F:{"1":"EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB fC gC hC iC 0B OC jC 1B"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:4,C:"Media Queries: interaction media features",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-media-range-syntax.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-media-range-syntax.js
    index 0238c7b179fda7..c20687ee95258c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-media-range-syntax.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-media-range-syntax.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 r s t u v w x y z H","2":"C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m"},C:{"1":"0 1 2 3 iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB QC RC"},D:{"1":"0 1 2 3 r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m"},E:{"1":"HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC"},F:{"1":"a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z bC cC dC eC yB LC fC zB"},G:{"1":"HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"n o p","2":"I 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"1":"MD","2":"LD"}},B:4,C:"Media Queries: Range Syntax",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 n t u v w x y z D","2":"C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m"},C:{"1":"0 1 2 3 4 5 6 7 lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m"},E:{"1":"KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC"},F:{"1":"a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z fC gC hC iC 0B OC jC 1B"},G:{"1":"KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"o p q r","2":"I DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"1":"RD","2":"QD"}},B:4,C:"Media Queries: Range Syntax",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-media-resolution.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-media-resolution.js
    index d226320ad78543..f0ea11b4449d6e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-media-resolution.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-media-resolution.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E NC","132":"F A B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","1028":"C K L G M N O"},C:{"1":"0 1 2 3 hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B","260":"4 I J D E F A B C K L G QC RC","1028":"5 6 7 8 9 M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B"},D:{"1":"0 1 2 3 nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","548":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB","1028":"CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB"},E:{"1":"1B EC FC GC HC IC JC 2B KC aC","2":"SC 9B","548":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC"},F:{"1":"cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"F","548":"B C bC cC dC eC yB LC fC","1028":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB"},G:{"1":"1B EC FC GC HC IC JC 2B KC","16":"9B","548":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C"},H:{"132":"1C"},I:{"1":"H","16":"2C 3C","548":"3B I 4C 5C MC","1028":"6C 7C"},J:{"548":"D A"},K:{"1":"q zB","548":"A B C yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"132":"A B"},O:{"1":"0B"},P:{"1":"n o p AC DD ED FD GD HD 1B 2B ID JD","1028":"I 8C 9C AD BD CD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"Media Queries: resolution feature",D:true};
    +module.exports={A:{A:{"2":"J E F QC","132":"G A B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","1028":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B","260":"8 I J E F G A B C K L H SC TC","1028":"9 M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B"},D:{"1":"0 1 2 3 4 5 6 7 qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","548":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB","1028":"FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB"},E:{"1":"3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC CC","548":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC"},F:{"1":"fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"G","548":"B C fC gC hC iC 0B OC jC","1028":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB"},G:{"1":"3B HC IC JC KC LC 5C 4B MC NC","16":"CC","548":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C"},H:{"132":"6C"},I:{"1":"D","16":"7C 8C","548":"5B I 9C AD PC","1028":"BD CD"},J:{"548":"E A"},K:{"1":"s 1B","548":"A B C 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"132":"A B"},O:{"1":"2B"},P:{"1":"o p q r DC ID JD KD LD MD 3B 4B ND OD","1028":"I DD ED FD GD HD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"Media Queries: resolution feature",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-media-scripting.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-media-scripting.js
    index 9acb26277edc54..68c9c68217bc59 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-media-scripting.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-media-scripting.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:5,C:"Media Queries: scripting media feature",D:false};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:5,C:"Media Queries: scripting media feature",D:false};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-mediaqueries.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-mediaqueries.js
    index 990503880cbcc7..2cdc09e2a9eabf 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-mediaqueries.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-mediaqueries.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"8":"J D E NC","129":"F A B"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","2":"OC 3B"},D:{"1":"0 1 2 3 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","129":"4 5 6 7 8 I J D E F A B C K L G M N O n o p"},E:{"1":"D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","129":"4 I J TC","388":"SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","2":"F"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","129":"9B gC MC hC iC"},H:{"1":"1C"},I:{"1":"H 6C 7C","129":"3B I 2C 3C 4C 5C MC"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"129":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"CSS3 Media Queries",D:true};
    +module.exports={A:{A:{"8":"J E F QC","129":"G A B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","2":"RC 5B"},D:{"1":"0 1 2 3 4 5 6 7 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","129":"8 9 I J E F G A B C K L H M N O o p q r AB BB"},E:{"1":"E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","129":"8 I J VC","388":"UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","2":"G"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","129":"CC kC PC lC mC"},H:{"1":"6C"},I:{"1":"D BD CD","129":"5B I 7C 8C 9C AD PC"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"129":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"CSS3 Media Queries",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-mixblendmode.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-mixblendmode.js
    index 5776c5c9ece7cf..de102417ffae0e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-mixblendmode.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-mixblendmode.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB QC RC"},D:{"1":"0 1 2 3 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB","194":"CB DB EB FB GB HB IB JB KB LB MB NB"},E:{"2":"4 I J D SC 9B TC UC","260":"E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB bC cC dC eC yB LC fC zB"},G:{"2":"9B gC MC hC iC jC","260":"E kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"Blending of HTML/SVG elements",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB","194":"FB GB HB IB JB KB LB MB NB OB PB QB"},E:{"2":"8 I J E UC CC VC WC","260":"F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB fC gC hC iC 0B OC jC 1B"},G:{"2":"CC kC PC lC mC nC","260":"F oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"Blending of HTML/SVG elements",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-motion-paths.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-motion-paths.js
    index b04495b6541121..a5a110bbd54945 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-motion-paths.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-motion-paths.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB QC RC"},D:{"1":"0 1 2 3 TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB","194":"QB RB SB"},E:{"1":"1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC"},F:{"1":"GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB bC cC dC eC yB LC fC zB","194":"DB EB FB"},G:{"1":"1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:5,C:"CSS Motion Path",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB","194":"TB UB VB"},E:{"1":"3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC"},F:{"1":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB fC gC hC iC 0B OC jC 1B","194":"GB HB IB"},G:{"1":"3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:5,C:"CSS Motion Path",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-namespaces.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-namespaces.js
    index 10055a3e1e8e50..c41b96724a60c3 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-namespaces.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-namespaces.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"SC 9B"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"CSS namespaces",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"UC CC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"CSS namespaces",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-nesting.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-nesting.js
    index d16643d4b48e71..80f765f11c8e09 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-nesting.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-nesting.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v","194":"w x y","516":"0 1 2 3 z H"},C:{"1":"H xB 7B 8B PC","2":"0 1 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z QC RC","322":"2 3"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v","194":"w x y","516":"0 1 2 3 z H xB 7B 8B"},E:{"1":"aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC","516":"IC JC 2B KC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d bC cC dC eC yB LC fC zB","194":"e f g","516":"h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC","516":"IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC 6C 7C","516":"H"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"516":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:5,C:"CSS Nesting",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w","194":"x y z","516":"0 1 2 3 4 5 6 7 D"},C:{"1":"5 6 7 D 9B AC BC","2":"0 1 2 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z SC TC","322":"3 4"},D:{"1":"7 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w","194":"x y z","516":"0 1 2 3 4 5 6 D"},E:{"1":"NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC","516":"LC cC 4B MC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d fC gC hC iC 0B OC jC 1B","194":"e f g","516":"h i j k l m n"},G:{"1":"NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC","516":"LC 5C 4B MC"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC BD CD","516":"D"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"516":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:5,C:"CSS Nesting",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-not-sel-list.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-not-sel-list.js
    index 75015da0f7dd15..06a2251ff511c1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-not-sel-list.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-not-sel-list.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O Q R S T U V W","16":"P"},C:{"1":"0 1 2 3 T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S QC RC"},D:{"1":"0 1 2 3 X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E SC 9B TC UC VC"},F:{"1":"tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB bC cC dC eC yB LC fC zB"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p HD 1B 2B ID JD","2":"I 8C 9C AD BD CD AC DD ED FD GD"},Q:{"2":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:5,C:"selector list argument of :not()",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O Q R S T U V W","16":"P"},C:{"1":"0 1 2 3 4 5 6 7 T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S SC TC"},D:{"1":"0 1 2 3 4 5 6 7 X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F UC CC VC WC XC"},F:{"1":"wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB fC gC hC iC 0B OC jC 1B"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r MD 3B 4B ND OD","2":"I DD ED FD GD HD DC ID JD KD LD"},Q:{"2":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:5,C:"selector list argument of :not()",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-nth-child-of.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-nth-child-of.js
    index e7c64cde3af4b7..8e8238088110ee 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-nth-child-of.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-nth-child-of.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 y z H","2":"C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x"},C:{"1":"0 1 2 3 H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z QC RC"},D:{"1":"0 1 2 3 y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E SC 9B TC UC VC"},F:{"1":"h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g bC cC dC eC yB LC fC zB"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"p","2":"I n o 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:5,C:"selector list argument of :nth-child and :nth-last-child CSS pseudo-classes",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 z D","2":"C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y"},C:{"1":"1 2 3 4 5 6 7 D 9B AC BC","2":"0 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z SC TC"},D:{"1":"0 1 2 3 4 5 6 7 z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F UC CC VC WC XC"},F:{"1":"h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g fC gC hC iC 0B OC jC 1B"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"q r","2":"I o p DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:5,C:"selector list argument of :nth-child and :nth-last-child CSS pseudo-classes",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-opacity.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-opacity.js
    index e1bd704e485f5f..b69511ed2ee9fe 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-opacity.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-opacity.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","4":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"CSS3 Opacity",D:true};
    +module.exports={A:{A:{"1":"G A B","4":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"CSS3 Opacity",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-optional-pseudo.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-optional-pseudo.js
    index 36f3fa9e893bac..e825b342e21d45 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-optional-pseudo.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-optional-pseudo.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 I J D E F A B C K L"},E:{"1":"4 J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","16":"F bC","132":"B C cC dC eC yB LC fC zB"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC"},H:{"132":"1C"},I:{"1":"3B I H 4C 5C MC 6C 7C","16":"2C 3C"},J:{"1":"D A"},K:{"1":"q","132":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:":optional CSS pseudo-class",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 I J E F G A B C K L"},E:{"1":"8 J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","16":"G fC","132":"B C gC hC iC 0B OC jC 1B"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC"},H:{"132":"6C"},I:{"1":"5B I D 9C AD PC BD CD","16":"7C 8C"},J:{"1":"E A"},K:{"1":"s","132":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:":optional CSS pseudo-class",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-overflow-anchor.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-overflow-anchor.js
    index f194d8a0fe2b8f..caeac3d142a18b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-overflow-anchor.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-overflow-anchor.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB QC RC"},D:{"1":"0 1 2 3 dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:5,C:"CSS overflow-anchor (Scroll Anchoring)",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:5,C:"CSS overflow-anchor (Scroll Anchoring)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-overflow-overlay.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-overflow-overlay.js
    index 8184d4aa3dc316..f55aeb7068c88f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-overflow-overlay.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-overflow-overlay.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z","2":"C K L G M N O","130":"1 2 3 H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z","16":"4 I J D E F A B C K L","130":"1 2 3 H xB 7B 8B"},E:{"1":"4 I J D E F A B TC UC VC WC AC yB","16":"SC 9B","130":"C K L G zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i","2":"F B C bC cC dC eC yB LC fC zB","130":"j k l m"},G:{"1":"E gC MC hC iC jC kC lC mC nC oC pC qC","16":"9B","130":"rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"3B I 2C 3C 4C 5C MC 6C 7C","130":"H"},J:{"16":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"130":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:7,C:"CSS overflow: overlay",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z","2":"C K L H M N O","130":"2 3 4 5 6 7 D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z","16":"8 I J E F G A B C K L","130":"2 3 4 5 6 7 D 9B AC BC"},E:{"1":"8 I J E F G A B VC WC XC YC DC 0B","16":"UC CC","130":"C K L H 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i","2":"G B C fC gC hC iC 0B OC jC 1B","130":"j k l m n"},G:{"1":"F kC PC lC mC nC oC pC qC rC sC tC uC","16":"CC","130":"vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"5B I 7C 8C 9C AD PC BD CD","130":"D"},J:{"16":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"130":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:7,C:"CSS overflow: overlay",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-overflow.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-overflow.js
    index 0f77c8852d8c75..79383143b7526b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-overflow.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-overflow.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"388":"J D E F A B NC"},B:{"1":"0 1 2 3 Z a b c d e f g h i j k l m r s t u v w x y z H","260":"P Q R S T U V W X Y","388":"C K L G M N O"},C:{"1":"0 1 2 3 R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","260":"5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q","388":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB QC RC"},D:{"1":"0 1 2 3 Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","260":"nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y","388":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB"},E:{"1":"1B EC FC GC HC IC JC 2B KC aC","260":"L G BC XC YC CC DC 0B ZC","388":"4 I J D E F A B C K SC 9B TC UC VC WC AC yB zB"},F:{"1":"uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","260":"cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB","388":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB bC cC dC eC yB LC fC zB"},G:{"1":"1B EC FC GC HC IC JC 2B KC","260":"wC xC yC zC CC DC 0B 0C","388":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC"},H:{"388":"1C"},I:{"1":"H","388":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"388":"D A"},K:{"1":"q","388":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"388":"A B"},O:{"388":"0B"},P:{"1":"n o p HD 1B 2B ID JD","388":"I 8C 9C AD BD CD AC DD ED FD GD"},Q:{"388":"BC"},R:{"1":"KD"},S:{"1":"MD","388":"LD"}},B:5,C:"CSS overflow property",D:true};
    +module.exports={A:{A:{"388":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 Z a b c d e f g h i j k l m n t u v w x y z D","260":"P Q R S T U V W X Y","388":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","260":"7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q","388":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","260":"qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y","388":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB"},E:{"1":"3B HC IC JC KC LC cC 4B MC NC dC eC","260":"L H EC ZC aC FC GC 2B bC","388":"8 I J E F G A B C K UC CC VC WC XC YC DC 0B 1B"},F:{"1":"xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","260":"fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB","388":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fC gC hC iC 0B OC jC 1B"},G:{"1":"3B HC IC JC KC LC 5C 4B MC NC","260":"0C 1C 2C 3C FC GC 2B 4C","388":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC"},H:{"388":"6C"},I:{"1":"D","388":"5B I 7C 8C 9C AD PC BD CD"},J:{"388":"E A"},K:{"1":"s","388":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"388":"A B"},O:{"388":"2B"},P:{"1":"o p q r MD 3B 4B ND OD","388":"I DD ED FD GD HD DC ID JD KD LD"},Q:{"388":"EC"},R:{"1":"PD"},S:{"1":"RD","388":"QD"}},B:5,C:"CSS overflow property",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-overscroll-behavior.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-overscroll-behavior.js
    index 878272d1dd3b93..bb53c317dd6b1d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-overscroll-behavior.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-overscroll-behavior.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","132":"A B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","132":"C K L G M N","516":"O"},C:{"1":"0 1 2 3 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB QC RC"},D:{"1":"0 1 2 3 kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB","260":"iB jB"},E:{"1":"1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K L SC 9B TC UC VC WC AC yB zB BC","1090":"G XC YC CC DC 0B ZC"},F:{"1":"ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB bC cC dC eC yB LC fC zB","260":"XB YB"},G:{"1":"1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC","1090":"yC zC CC DC 0B 0C"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"132":"A B"},O:{"1":"0B"},P:{"1":"n o p BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:5,C:"CSS overscroll-behavior",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","132":"A B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","132":"C K L H M N","516":"O"},C:{"1":"0 1 2 3 4 5 6 7 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB","260":"lB mB"},E:{"1":"3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L UC CC VC WC XC YC DC 0B 1B EC","1090":"H ZC aC FC GC 2B bC"},F:{"1":"cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB fC gC hC iC 0B OC jC 1B","260":"aB bB"},G:{"1":"3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C","1090":"2C 3C FC GC 2B 4C"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"132":"A B"},O:{"1":"2B"},P:{"1":"o p q r GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:5,C:"CSS overscroll-behavior",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-page-break.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-page-break.js
    index cc2878cf6fa29c..fa8e12dbe7a387 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-page-break.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-page-break.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"388":"A B","900":"J D E F NC"},B:{"388":"C K L G M N O","900":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"772":"0 1 2 3 kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","900":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB QC RC"},D:{"900":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"772":"A","900":"4 I J D E F B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"16":"F bC","129":"B C cC dC eC yB LC fC zB","900":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"900":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"129":"1C"},I:{"900":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"900":"D A"},K:{"129":"A B C yB LC zB","900":"q"},L:{"900":"H"},M:{"772":"xB"},N:{"388":"A B"},O:{"900":"0B"},P:{"900":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"900":"BC"},R:{"900":"KD"},S:{"772":"MD","900":"LD"}},B:2,C:"CSS page-break properties",D:true};
    +module.exports={A:{A:{"388":"A B","900":"J E F G QC"},B:{"388":"C K L H M N O","900":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"772":"0 1 2 3 4 5 6 7 nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","900":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB SC TC"},D:{"900":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"772":"A","900":"8 I J E F G B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"16":"G fC","129":"B C gC hC iC 0B OC jC 1B","900":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"900":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"129":"6C"},I:{"900":"5B I D 7C 8C 9C AD PC BD CD"},J:{"900":"E A"},K:{"129":"A B C 0B OC 1B","900":"s"},L:{"900":"D"},M:{"772":"D"},N:{"388":"A B"},O:{"900":"2B"},P:{"900":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"900":"EC"},R:{"900":"PD"},S:{"772":"RD","900":"QD"}},B:2,C:"CSS page-break properties",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-paged-media.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-paged-media.js
    index f487c85c965faa..388311f256e39a 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-paged-media.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-paged-media.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D NC","132":"E F A B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","132":"C K L G M N O"},C:{"2":"4 OC 3B I J D E F A B C K L G M N O QC RC","132":"0 1 2 3 5 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"0 1 2 3 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 I J D E F A B C K L"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","132":"F B C bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"16":"1C"},I:{"16":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"16":"D A"},K:{"1":"q","16":"A B C yB LC zB"},L:{"1":"H"},M:{"132":"xB"},N:{"258":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"132":"LD MD"}},B:5,C:"CSS Paged Media (@page)",D:true};
    +module.exports={A:{A:{"2":"J E QC","132":"F G A B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","132":"C K L H M N O"},C:{"2":"8 RC 5B I J E F G A B C K L H M N O SC TC","132":"0 1 2 3 4 5 6 7 9 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"1":"0 1 2 3 4 5 6 7 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 I J E F G A B C K L"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","132":"G B C fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"16":"6C"},I:{"16":"5B I D 7C 8C 9C AD PC BD CD"},J:{"16":"E A"},K:{"1":"s","16":"A B C 0B OC 1B"},L:{"1":"D"},M:{"132":"D"},N:{"258":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"132":"QD RD"}},B:5,C:"CSS Paged Media (@page)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-paint-api.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-paint-api.js
    index 097e27e4ba6a27..3666b0dd2358fb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-paint-api.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-paint-api.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB"},E:{"2":"4 I J D E F A B C SC 9B TC UC VC WC AC yB","194":"K L G zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:4,C:"CSS Painting API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB"},E:{"2":"8 I J E F G A B C UC CC VC WC XC YC DC 0B","194":"K L H 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:4,C:"CSS Painting API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-placeholder-shown.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-placeholder-shown.js
    index ff204d2204ea0d..a9c446f13c0c30 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-placeholder-shown.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-placeholder-shown.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","292":"A B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC","164":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB"},D:{"1":"0 1 2 3 UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E SC 9B TC UC VC"},F:{"1":"HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB bC cC dC eC yB LC fC zB"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","164":"LD"}},B:5,C:":placeholder-shown CSS pseudo-class",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","292":"A B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC","164":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB"},D:{"1":"0 1 2 3 4 5 6 7 XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F UC CC VC WC XC"},F:{"1":"KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB fC gC hC iC 0B OC jC 1B"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","164":"QD"}},B:5,C:":placeholder-shown CSS pseudo-class",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-placeholder.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-placeholder.js
    index 7085341061a2ac..a7680ac67ef8bf 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-placeholder.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-placeholder.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","36":"C K L G M N O"},C:{"1":"0 1 2 3 YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","33":"5 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB","130":"4 OC 3B I J D E F A B C K L G M N O QC RC"},D:{"1":"0 1 2 3 eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","36":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B","36":"4 J D E F A TC UC VC WC"},F:{"1":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","36":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC","36":"E MC hC iC jC kC lC mC nC"},H:{"2":"1C"},I:{"1":"H","36":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"36":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"36":"A B"},O:{"1":"0B"},P:{"1":"n o p AD BD CD AC DD ED FD GD HD 1B 2B ID JD","36":"I 8C 9C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","33":"LD"}},B:5,C:"::placeholder CSS pseudo-element",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","36":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","33":"9 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB","130":"8 RC 5B I J E F G A B C K L H M N O SC TC"},D:{"1":"0 1 2 3 4 5 6 7 hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","36":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC","36":"8 J E F G A VC WC XC YC"},F:{"1":"UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","36":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC","36":"F PC lC mC nC oC pC qC rC"},H:{"2":"6C"},I:{"1":"D","36":"5B I 7C 8C 9C AD PC BD CD"},J:{"36":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"36":"A B"},O:{"1":"2B"},P:{"1":"o p q r FD GD HD DC ID JD KD LD MD 3B 4B ND OD","36":"I DD ED"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","33":"QD"}},B:5,C:"::placeholder CSS pseudo-element",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-print-color-adjust.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-print-color-adjust.js
    index f6536b062f53d7..01f67f858ab008 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-print-color-adjust.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-print-color-adjust.js
    @@ -1 +1 @@
    -module.exports={A:{D:{"2":"4 I J D E F A B C K L G M","33":"0 1 2 3 5 6 7 8 9 N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},L:{"33":"H"},B:{"2":"C K L G M N O","33":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB QC RC","33":"VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f"},M:{"1":"xB"},A:{"2":"J D E F A B NC"},F:{"2":"F B C bC cC dC eC yB LC fC zB","33":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},K:{"2":"A B C yB LC zB","33":"q"},E:{"1":"DC 0B ZC 1B EC FC GC HC IC JC 2B KC","2":"4 I SC 9B TC aC","33":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC"},G:{"1":"DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC","33":"E iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC"},P:{"33":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},I:{"2":"3B I 2C 3C 4C 5C MC","33":"H 6C 7C"}},B:6,C:"print-color-adjust property",D:undefined};
    +module.exports={A:{D:{"2":"8 I J E F G A B C K L H M","33":"0 1 2 3 4 5 6 7 9 N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},L:{"33":"D"},B:{"2":"C K L H M N O","33":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB SC TC","33":"YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f"},M:{"1":"D"},A:{"2":"J E F G A B QC"},F:{"2":"G B C fC gC hC iC 0B OC jC 1B","33":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},K:{"2":"A B C 0B OC 1B","33":"s"},E:{"1":"GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC","2":"8 I UC CC VC eC","33":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC"},G:{"1":"GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC","33":"F mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC"},P:{"33":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},I:{"2":"5B I 7C 8C 9C AD PC","33":"D BD CD"}},B:6,C:"print-color-adjust property",D:undefined};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-read-only-write.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-read-only-write.js
    index 266a34fc234d5a..71e7c4c1ac1b95 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-read-only-write.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-read-only-write.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C"},C:{"1":"0 1 2 3 wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","16":"OC","33":"4 5 6 7 8 9 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB QC RC"},D:{"1":"0 1 2 3 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 I J D E F A B C K L","132":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"SC 9B","132":"4 I J D E TC UC VC"},F:{"1":"6 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","16":"F B bC cC dC eC yB","132":"5 C G M N O n o p LC fC zB"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC","132":"E MC hC iC jC kC"},H:{"2":"1C"},I:{"1":"H","16":"2C 3C","132":"3B I 4C 5C MC 6C 7C"},J:{"1":"A","132":"D"},K:{"1":"q","2":"A B yB","132":"C LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","33":"LD"}},B:1,C:"CSS :read-only and :read-write selectors",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C"},C:{"1":"0 1 2 3 4 5 6 7 zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"RC","33":"8 9 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 I J E F G A B C K L","132":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"UC CC","132":"8 I J E F VC WC XC"},F:{"1":"r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","16":"G B fC gC hC iC 0B","132":"9 C H M N O o p q OC jC 1B"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC","132":"F PC lC mC nC oC"},H:{"2":"6C"},I:{"1":"D","16":"7C 8C","132":"5B I 9C AD PC BD CD"},J:{"1":"A","132":"E"},K:{"1":"s","2":"A B 0B","132":"C OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","33":"QD"}},B:1,C:"CSS :read-only and :read-write selectors",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-rebeccapurple.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-rebeccapurple.js
    index b1c7ca5f9a83cd..0d18c238f7d5f0 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-rebeccapurple.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-rebeccapurple.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A NC","132":"B"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB QC RC"},D:{"1":"0 1 2 3 LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB"},E:{"1":"D E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J SC 9B TC","16":"UC"},F:{"1":"8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 F B C G M N O n o p bC cC dC eC yB LC fC zB"},G:{"1":"E kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC jC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"Rebeccapurple color",D:true};
    +module.exports={A:{A:{"2":"J E F G A QC","132":"B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB"},E:{"1":"E F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J UC CC VC","16":"WC"},F:{"1":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB fC gC hC iC 0B OC jC 1B"},G:{"1":"F oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC nC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"Rebeccapurple color",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-reflections.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-reflections.js
    index fb13eb7b6eca53..c2cf3402c21f31 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-reflections.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-reflections.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O","33":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"33":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"SC 9B","33":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"F B C bC cC dC eC yB LC fC zB","33":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"33":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"33":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"33":"D A"},K:{"2":"A B C yB LC zB","33":"q"},L:{"33":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"33":"0B"},P:{"33":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"33":"BC"},R:{"33":"KD"},S:{"2":"LD MD"}},B:7,C:"CSS Reflections",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O","33":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"33":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"UC CC","33":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"G B C fC gC hC iC 0B OC jC 1B","33":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"33":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"33":"5B I D 7C 8C 9C AD PC BD CD"},J:{"33":"E A"},K:{"2":"A B C 0B OC 1B","33":"s"},L:{"33":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"33":"2B"},P:{"33":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"33":"EC"},R:{"33":"PD"},S:{"2":"QD RD"}},B:7,C:"CSS Reflections",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-regions.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-regions.js
    index 82f251a2d4a3b3..bb5a4354297ce2 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-regions.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-regions.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","420":"A B"},B:{"2":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","420":"C K L G M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 I J D E F A B C K L IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","36":"G M N O","66":"5 6 7 8 9 n o p AB BB CB DB EB FB GB HB"},E:{"2":"4 I J C K L G SC 9B TC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","33":"D E F A B UC VC WC AC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"9B gC MC hC iC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","33":"E jC kC lC mC nC oC pC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"420":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:5,C:"CSS Regions",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","420":"A B"},B:{"2":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","420":"C K L H M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 I J E F G A B C K L LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","36":"H M N O","66":"9 o p q r AB BB CB DB EB FB GB HB IB JB KB"},E:{"2":"8 I J C K L H UC CC VC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","33":"E F G A B WC XC YC DC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"CC kC PC lC mC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","33":"F nC oC pC qC rC sC tC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"420":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:5,C:"CSS Regions",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-relative-colors.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-relative-colors.js
    index e1f8f3efe26b51..82b451969b5cbb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-relative-colors.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-relative-colors.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","194":"xB 7B 8B"},E:{"1":"HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:5,C:"CSS Relative colors",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"7 D","2":"0 1 2 3 4 5 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z","194":"6"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"7 D 9B AC BC","2":"0 1 2 3 4 5 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z","194":"6"},E:{"1":"KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:5,C:"CSS Relative colors",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-repeating-gradients.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-repeating-gradients.js
    index 996e8c89738622..a3fd7a958b0c6c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-repeating-gradients.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-repeating-gradients.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC","33":"4 I J D E F A B C K L G RC"},D:{"1":"0 1 2 3 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F","33":"5 6 7 8 A B C K L G M N O n o p"},E:{"1":"D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B","33":"J TC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"F B bC cC dC eC","33":"C fC","36":"yB LC"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC","33":"hC iC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B 2C 3C 4C","33":"I 5C MC"},J:{"1":"A","2":"D"},K:{"1":"q zB","2":"A B","33":"C","36":"yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS Repeating Gradients",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC","33":"8 I J E F G A B C K L H TC"},D:{"1":"0 1 2 3 4 5 6 7 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G","33":"9 A B C K L H M N O o p q r AB BB"},E:{"1":"E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC","33":"J VC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"G B fC gC hC iC","33":"C jC","36":"0B OC"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC","33":"lC mC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B 7C 8C 9C","33":"I AD PC"},J:{"1":"A","2":"E"},K:{"1":"s 1B","2":"A B","33":"C","36":"0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS Repeating Gradients",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-resize.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-resize.js
    index 1ac219007bc6ba..f2586b4e4859a3 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-resize.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-resize.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC","33":"I"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC 9B"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC","132":"zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:2,C:"CSS resize property",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC","33":"I"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC CC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC","132":"1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:2,C:"CSS resize property",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-revert-value.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-revert-value.js
    index 28a0502f144f17..ef1178e9535122 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-revert-value.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-revert-value.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O P Q R S"},C:{"1":"0 1 2 3 mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB QC RC"},D:{"1":"0 1 2 3 T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S"},E:{"1":"A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC"},F:{"1":"q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB bC cC dC eC yB LC fC zB"},G:{"1":"mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD AC DD ED FD"},Q:{"2":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:4,C:"CSS revert value",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O P Q R S"},C:{"1":"0 1 2 3 4 5 6 7 pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S"},E:{"1":"A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC"},F:{"1":"s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB fC gC hC iC 0B OC jC 1B"},G:{"1":"qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r LD MD 3B 4B ND OD","2":"I DD ED FD GD HD DC ID JD KD"},Q:{"2":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:4,C:"CSS revert value",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-rrggbbaa.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-rrggbbaa.js
    index dd99cebdbb8a14..12fa502700dc43 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-rrggbbaa.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-rrggbbaa.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB QC RC"},D:{"1":"0 1 2 3 hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB","194":"ZB aB bB cB dB eB fB 4B gB 5B"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC WC"},F:{"1":"ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB bC cC dC eC yB LC fC zB","194":"MB NB OB PB QB RB SB TB UB VB WB XB YB"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I","194":"8C 9C AD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:4,C:"#rrggbbaa hex color notation",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB","194":"cB dB eB fB gB hB iB 6B jB 7B"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC YC"},F:{"1":"cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB fC gC hC iC 0B OC jC 1B","194":"PB QB RB SB TB UB VB WB XB YB ZB aB bB"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I","194":"DD ED FD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:4,C:"#rrggbbaa hex color notation",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-scroll-behavior.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-scroll-behavior.js
    index 2bb6e47ddacea5..295fbde6422214 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-scroll-behavior.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-scroll-behavior.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O","129":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB QC RC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB","129":"0 1 2 3 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","450":"OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB"},E:{"1":"DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K SC 9B TC UC VC WC AC yB zB BC","578":"L G XC YC CC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB bC cC dC eC yB LC fC zB","129":"VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","450":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB"},G:{"1":"DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC","578":"yC zC CC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"129":"0B"},P:{"1":"n o p BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD"},Q:{"129":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:5,C:"CSS Scroll-behavior",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O","129":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB SC TC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB","129":"0 1 2 3 4 5 6 7 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","450":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB"},E:{"1":"GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K UC CC VC WC XC YC DC 0B 1B EC","578":"L H ZC aC FC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB fC gC hC iC 0B OC jC 1B","129":"YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","450":"EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB"},G:{"1":"GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C","578":"2C 3C FC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"129":"2B"},P:{"1":"o p q r GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD"},Q:{"129":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:5,C:"CSS Scroll-behavior",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-scroll-timeline.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-scroll-timeline.js
    index 3f97be01f53672..302594aae77121 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-scroll-timeline.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-scroll-timeline.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O P Q R S T U V W X Y","194":"0 1 2 3 Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T","194":"0 1 2 3 X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","322":"U V W"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB bC cC dC eC yB LC fC zB","194":"tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","322":"q sB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:7,C:"CSS @scroll-timeline",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O P Q R S T U V W X Y","194":"0 1 2 3 4 5 6 7 Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T","194":"0 1 2 3 4 5 6 7 X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","322":"U V W"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB fC gC hC iC 0B OC jC 1B","194":"wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","322":"s vB"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:7,C:"CSS @scroll-timeline",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-scrollbar.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-scrollbar.js
    index dcf7b2cea232bc..68c02f83958626 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-scrollbar.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-scrollbar.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"132":"J D E F A B NC"},B:{"2":"C K L G M N O","292":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB QC RC","3138":"iB","4097":"0 1 2 3 jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"292":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"16":"4 I SC 9B","292":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"F B C bC cC dC eC yB LC fC zB","292":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC MC hC iC","292":"jC","804":"E kC lC mC nC oC pC qC rC sC tC uC vC wC"},H:{"2":"1C"},I:{"16":"2C 3C","292":"3B I H 4C 5C MC 6C 7C"},J:{"292":"D A"},K:{"2":"A B C yB LC zB","292":"q"},L:{"292":"H"},M:{"4097":"xB"},N:{"2":"A B"},O:{"292":"0B"},P:{"292":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"292":"BC"},R:{"292":"KD"},S:{"2":"LD MD"}},B:7,C:"CSS scrollbar styling",D:true};
    +module.exports={A:{A:{"132":"J E F G A B QC"},B:{"2":"C K L H M N O","292":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB SC TC","3138":"lB"},D:{"292":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"16":"8 I UC CC","292":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"G B C fC gC hC iC 0B OC jC 1B","292":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC PC lC mC","292":"nC","804":"F oC pC qC rC sC tC uC vC wC xC yC zC 0C"},H:{"2":"6C"},I:{"16":"7C 8C","292":"5B I D 9C AD PC BD CD"},J:{"292":"E A"},K:{"2":"A B C 0B OC 1B","292":"s"},L:{"292":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"292":"2B"},P:{"292":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"292":"EC"},R:{"292":"PD"},S:{"2":"QD RD"}},B:4,C:"CSS scrollbar styling",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-sel2.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-sel2.js
    index 90f9a40d2a7fb7..63732863dbfbe2 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-sel2.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-sel2.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"D E F A B","2":"NC","8":"J"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"CSS 2.1 selectors",D:true};
    +module.exports={A:{A:{"1":"E F G A B","2":"QC","8":"J"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"CSS 2.1 selectors",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-sel3.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-sel3.js
    index af2acabfb49218..d2d12e55df96fb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-sel3.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-sel3.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"NC","8":"J","132":"D E"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","2":"OC 3B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","2":"F"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"CSS3 selectors",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"QC","8":"J","132":"E F"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","2":"RC 5B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","2":"G"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"CSS3 selectors",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-selection.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-selection.js
    index d1c2cdc5d79ade..e09989f9c54c01 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-selection.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-selection.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","33":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","2":"F"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"1":"A","2":"D"},K:{"1":"C q LC zB","16":"A B yB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","33":"LD"}},B:5,C:"::selection CSS pseudo-element",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","33":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","2":"G"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"1":"A","2":"E"},K:{"1":"C s OC 1B","16":"A B 0B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","33":"QD"}},B:5,C:"::selection CSS pseudo-element",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-shapes.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-shapes.js
    index 3655063c9a4a5f..4b3a5c3933ff29 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-shapes.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-shapes.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB QC RC","322":"YB ZB aB bB cB dB eB fB 4B gB 5B"},D:{"1":"0 1 2 3 KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB","194":"HB IB JB"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D SC 9B TC UC","33":"E F A VC WC"},F:{"1":"7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 F B C G M N O n o p bC cC dC eC yB LC fC zB"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC jC","33":"E kC lC mC nC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:4,C:"CSS Shapes Level 1",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB SC TC","322":"bB cB dB eB fB gB hB iB 6B jB 7B"},D:{"1":"0 1 2 3 4 5 6 7 NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB","194":"KB LB MB"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E UC CC VC WC","33":"F G A XC YC"},F:{"1":"AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r fC gC hC iC 0B OC jC 1B"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC nC","33":"F oC pC qC rC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:4,C:"CSS Shapes Level 1",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-snappoints.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-snappoints.js
    index 38c2396192cd38..56078f6e96b59c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-snappoints.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-snappoints.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","6308":"A","6436":"B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","6436":"C K L G M N O"},C:{"1":"0 1 2 3 nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB QC RC","2052":"MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB"},D:{"1":"0 1 2 3 oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB","8258":"lB mB nB"},E:{"1":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E SC 9B TC UC VC","3108":"F A WC AC"},F:{"1":"jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bC cC dC eC yB LC fC zB","8258":"bB cB dB eB fB gB hB iB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC","3108":"lC mC nC oC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2052":"LD"}},B:4,C:"CSS Scroll Snap",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","6308":"A","6436":"B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","6436":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB SC TC","2052":"PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB"},D:{"1":"0 1 2 3 4 5 6 7 rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB","8258":"oB pB qB"},E:{"1":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F UC CC VC WC XC","3108":"G A YC DC"},F:{"1":"mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB fC gC hC iC 0B OC jC 1B","8258":"eB fB gB hB iB jB kB lB"},G:{"1":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC","3108":"pC qC rC sC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD GD HD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2052":"QD"}},B:4,C:"CSS Scroll Snap",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-sticky.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-sticky.js
    index 5e0353a53e850d..38fc9b1ffc272d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-sticky.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-sticky.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G","1028":"P Q R S T U V W X Y Z","4100":"M N O"},C:{"1":"0 1 2 3 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 OC 3B I J D E F A B C K L G M N O n o p QC RC","194":"9 AB BB CB DB EB","516":"FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB"},D:{"1":"0 1 2 3 a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 I J D E F A B C K L G M N O n o p KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB","322":"6 7 8 9 AB BB CB DB EB FB GB HB IB JB ZB aB bB cB","1028":"dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z"},E:{"1":"K L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J SC 9B TC","33":"E F A B C VC WC AC yB zB","2084":"D UC"},F:{"1":"wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB bC cC dC eC yB LC fC zB","322":"MB NB OB","1028":"PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB"},G:{"1":"tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC","33":"E kC lC mC nC oC pC qC rC sC","2084":"iC jC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C"},Q:{"1028":"BC"},R:{"1":"KD"},S:{"1":"MD","516":"LD"}},B:5,C:"CSS position:sticky",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H","1028":"P Q R S T U V W X Y Z","4100":"M N O"},C:{"1":"0 1 2 3 4 5 6 7 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB SC TC","194":"CB DB EB FB GB HB","516":"IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB"},D:{"1":"0 1 2 3 4 5 6 7 a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB","322":"r AB BB CB DB EB FB GB HB IB JB KB LB MB cB dB eB fB","1028":"gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z"},E:{"1":"K L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J UC CC VC","33":"F G A B C XC YC DC 0B 1B","2084":"E WC"},F:{"1":"zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB fC gC hC iC 0B OC jC 1B","322":"PB QB RB","1028":"SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB"},G:{"1":"xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC","33":"F oC pC qC rC sC tC uC vC wC","2084":"mC nC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD"},Q:{"1028":"EC"},R:{"1":"PD"},S:{"1":"RD","516":"QD"}},B:5,C:"CSS position:sticky",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-subgrid.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-subgrid.js
    index 9ba777f6625f10..c0cdfd220ffd3a 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-subgrid.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-subgrid.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"H","2":"0 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z","194":"1 2 3"},C:{"1":"0 1 2 3 qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB QC RC"},D:{"1":"H xB 7B 8B","2":"0 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z","194":"1 2 3"},E:{"1":"1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC"},F:{"1":"m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i bC cC dC eC yB LC fC zB","194":"j k l"},G:{"1":"1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"1":"MD","2":"LD"}},B:4,C:"CSS Subgrid",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"5 6 7 D","2":"0 1 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z","194":"2 3 4"},C:{"1":"0 1 2 3 4 5 6 7 tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB SC TC"},D:{"1":"5 6 7 D 9B AC BC","2":"0 1 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z","194":"2 3 4"},E:{"1":"3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC"},F:{"1":"m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i fC gC hC iC 0B OC jC 1B","194":"j k l"},G:{"1":"3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"1":"RD","2":"QD"}},B:4,C:"CSS Subgrid",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-supports-api.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-supports-api.js
    index 27b6dbc895e4c9..73c3b6a1486b7d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-supports-api.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-supports-api.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","260":"C K L G M N O"},C:{"1":"0 1 2 3 cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 OC 3B I J D E F A B C K L G M N O QC RC","66":"n o","260":"6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB"},D:{"1":"0 1 2 3 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB","260":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E SC 9B TC UC VC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC","132":"zB"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC"},H:{"132":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC","132":"zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS.supports() API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","260":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O SC TC","66":"o p","260":"q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB"},D:{"1":"0 1 2 3 4 5 6 7 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB","260":"EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F UC CC VC WC XC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC","132":"1B"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC"},H:{"132":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC","132":"1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS.supports() API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-table.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-table.js
    index 766b9c3174cabc..35ac15ad6aa35f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-table.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-table.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"E F A B","2":"J D NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","132":"OC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"CSS Table display",D:true};
    +module.exports={A:{A:{"1":"F G A B","2":"J E QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","132":"RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"CSS Table display",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-align-last.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-align-last.js
    index f7cd992f39ea8d..b01bfb07d849fa 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-align-last.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-align-last.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"132":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","4":"C K L G M N O"},C:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B QC RC","33":"5 6 7 8 9 C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB"},D:{"1":"0 1 2 3 UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB","322":"IB JB KB LB MB NB OB PB QB RB SB TB"},E:{"1":"1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC"},F:{"1":"HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 F B C G M N O n o bC cC dC eC yB LC fC zB","578":"6 7 8 9 p AB BB CB DB EB FB GB"},G:{"1":"1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"132":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","33":"LD"}},B:4,C:"CSS3 text-align-last",D:true};
    +module.exports={A:{A:{"132":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","4":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B SC TC","33":"9 C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB"},D:{"1":"0 1 2 3 4 5 6 7 XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB","322":"LB MB NB OB PB QB RB SB TB UB VB WB"},E:{"1":"3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC"},F:{"1":"KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p fC gC hC iC 0B OC jC 1B","578":"q r AB BB CB DB EB FB GB HB IB JB"},G:{"1":"3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"132":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","33":"QD"}},B:4,C:"CSS3 text-align-last",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-box-trim.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-box-trim.js
    index 6944a431e9be4e..025a12d063ff5e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-box-trim.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-box-trim.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC","194":"HC IC JC 2B KC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC","194":"HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:5,C:"CSS text-box-trim & text-box-edge",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC","194":"KC LC cC 4B MC NC dC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC","194":"KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:5,C:"CSS text-box-trim & text-box-edge",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-indent.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-indent.js
    index 751a7e45494273..e573d7b5d6b3fe 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-indent.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-indent.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"132":"J D E F A B NC"},B:{"132":"C K L G M N O","388":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"132":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"132":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB","388":"0 1 2 3 LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"1B EC FC GC HC IC JC 2B KC aC","132":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC"},F:{"132":"5 6 7 F B C G M N O n o p bC cC dC eC yB LC fC zB","388":"8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"1":"1B EC FC GC HC IC JC 2B KC","132":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C"},H:{"132":"1C"},I:{"132":"3B I 2C 3C 4C 5C MC 6C 7C","388":"H"},J:{"132":"D A"},K:{"132":"A B C yB LC zB","388":"q"},L:{"388":"H"},M:{"132":"xB"},N:{"132":"A B"},O:{"388":"0B"},P:{"132":"I","388":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"388":"BC"},R:{"388":"KD"},S:{"132":"LD MD"}},B:4,C:"CSS text-indent",D:true};
    +module.exports={A:{A:{"132":"J E F G A B QC"},B:{"132":"C K L H M N O","388":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"9B AC BC","132":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D SC TC"},D:{"132":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB","388":"0 1 2 3 4 5 6 7 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"3B HC IC JC KC LC cC 4B MC NC dC eC","132":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC"},F:{"132":"9 G B C H M N O o p q r AB fC gC hC iC 0B OC jC 1B","388":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"1":"3B HC IC JC KC LC 5C 4B MC NC","132":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C"},H:{"132":"6C"},I:{"132":"5B I 7C 8C 9C AD PC BD CD","388":"D"},J:{"132":"E A"},K:{"132":"A B C 0B OC 1B","388":"s"},L:{"388":"D"},M:{"132":"D"},N:{"132":"A B"},O:{"388":"2B"},P:{"132":"I","388":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"388":"EC"},R:{"388":"PD"},S:{"132":"QD RD"}},B:4,C:"CSS text-indent",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-justify.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-justify.js
    index f586ec5af2aa6d..58c5f4515482a6 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-justify.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-justify.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"16":"J D NC","132":"E F A B"},B:{"132":"C K L G M N O","322":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB QC RC","1025":"0 1 2 3 cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","1602":"bB"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB","322":"0 1 2 3 QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB bC cC dC eC yB LC fC zB","322":"DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC 6C 7C","322":"H"},J:{"2":"D A"},K:{"2":"A B C yB LC zB","322":"q"},L:{"322":"H"},M:{"1025":"xB"},N:{"132":"A B"},O:{"322":"0B"},P:{"2":"I","322":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"322":"BC"},R:{"322":"KD"},S:{"2":"LD","1025":"MD"}},B:4,C:"CSS text-justify",D:true};
    +module.exports={A:{A:{"16":"J E QC","132":"F G A B"},B:{"132":"C K L H M N O","322":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB SC TC","1025":"0 1 2 3 4 5 6 7 fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","1602":"eB"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB","322":"0 1 2 3 4 5 6 7 TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB fC gC hC iC 0B OC jC 1B","322":"GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC BD CD","322":"D"},J:{"2":"E A"},K:{"2":"A B C 0B OC 1B","322":"s"},L:{"322":"D"},M:{"1025":"D"},N:{"132":"A B"},O:{"322":"2B"},P:{"2":"I","322":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"322":"EC"},R:{"322":"PD"},S:{"2":"QD","1025":"RD"}},B:4,C:"CSS text-justify",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-orientation.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-orientation.js
    index b0b65f7b56dde2..1a56bdbb22f3b5 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-orientation.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-orientation.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB QC RC","194":"LB MB NB"},D:{"1":"0 1 2 3 VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB"},E:{"1":"L G XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC WC","16":"A","33":"B C K AC yB zB BC"},F:{"1":"IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB bC cC dC eC yB LC fC zB"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"CSS text-orientation",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB SC TC","194":"OB PB QB"},D:{"1":"0 1 2 3 4 5 6 7 YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB"},E:{"1":"L H ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC YC","16":"A","33":"B C K DC 0B 1B EC"},F:{"1":"LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB fC gC hC iC 0B OC jC 1B"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"CSS text-orientation",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-spacing.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-spacing.js
    index 78801661814a4e..32eb47be2c9e31 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-spacing.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-spacing.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D NC","161":"E F A B"},B:{"2":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","161":"C K L G M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"16":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:5,C:"CSS Text 4 text-spacing",D:false};
    +module.exports={A:{A:{"2":"J E QC","161":"F G A B"},B:{"2":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","161":"C K L H M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"16":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:5,C:"CSS Text 4 text-spacing",D:false};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-wrap-balance.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-wrap-balance.js
    index 73a58cae8845f0..f291086abda8e1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-wrap-balance.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-text-wrap-balance.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"1 2 3 H","2":"0 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z"},C:{"1":"8B PC","2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B QC RC"},D:{"1":"1 2 3 H xB 7B 8B","2":"0 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:5,C:"CSS text-wrap: balance",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"2 3 4 5 6 7 D","2":"0 1 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z"},C:{"1":"9B AC BC","2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D SC TC"},D:{"1":"2 3 4 5 6 7 D 9B AC BC","2":"0 1 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z"},E:{"1":"eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC"},F:{"1":"i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:5,C:"CSS text-wrap: balance",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-textshadow.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-textshadow.js
    index f4264221cc7f1e..29aa6fbf59b404 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-textshadow.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-textshadow.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","129":"A B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","129":"C K L G M N O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","2":"OC 3B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","260":"SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","2":"F"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"4":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"A","4":"D"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"129":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS3 Text-shadow",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","129":"A B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","129":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","2":"RC 5B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","260":"UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","2":"G"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"4":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"A","4":"E"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"129":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS3 Text-shadow",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-touch-action.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-touch-action.js
    index 5f9d3b87cb634b..eaad4a9986ebc5 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-touch-action.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-touch-action.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"B","2":"J D E F NC","289":"A"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB QC RC","194":"CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB","1025":"ZB aB bB cB dB"},D:{"1":"0 1 2 3 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"6 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 F B C G M N O n o p bC cC dC eC yB LC fC zB"},G:{"1":"tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC","516":"mC nC oC pC qC rC sC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","289":"A"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","194":"LD"}},B:2,C:"CSS touch-action property",D:true};
    +module.exports={A:{A:{"1":"B","2":"J E F G QC","289":"A"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB SC TC","194":"FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB","1025":"cB dB eB fB gB"},D:{"1":"0 1 2 3 4 5 6 7 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q fC gC hC iC 0B OC jC 1B"},G:{"1":"xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC","516":"qC rC sC tC uC vC wC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","289":"A"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","194":"QD"}},B:2,C:"CSS touch-action property",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-transitions.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-transitions.js
    index e8d7061002b40c..612f75eaf6b948 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-transitions.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-transitions.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC","33":"4 J D E F A B C K L G","164":"I"},D:{"1":"0 1 2 3 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","33":"4 5 6 7 8 I J D E F A B C K L G M N O n o p"},E:{"1":"D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","33":"J TC","164":"4 I SC 9B"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"F bC cC","33":"C","164":"B dC eC yB LC fC"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","33":"iC","164":"9B gC MC hC"},H:{"2":"1C"},I:{"1":"H 6C 7C","33":"3B I 2C 3C 4C 5C MC"},J:{"1":"A","33":"D"},K:{"1":"q zB","33":"C","164":"A B yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"CSS3 Transitions",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC","33":"8 J E F G A B C K L H","164":"I"},D:{"1":"0 1 2 3 4 5 6 7 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","33":"8 9 I J E F G A B C K L H M N O o p q r AB BB"},E:{"1":"E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","33":"J VC","164":"8 I UC CC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"G fC gC","33":"C","164":"B hC iC 0B OC jC"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","33":"mC","164":"CC kC PC lC"},H:{"2":"6C"},I:{"1":"D BD CD","33":"5B I 7C 8C 9C AD PC"},J:{"1":"A","33":"E"},K:{"1":"s 1B","33":"C","164":"A B 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"CSS3 Transitions",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-unicode-bidi.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-unicode-bidi.js
    index 6aedd33f816b31..8226aab4f85362 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-unicode-bidi.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-unicode-bidi.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"132":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","132":"C K L G M N O"},C:{"1":"0 1 2 3 XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","33":"5 6 7 8 9 N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB","132":"4 OC 3B I J D E F QC RC","292":"A B C K L G M"},D:{"1":"0 1 2 3 VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","132":"4 I J D E F A B C K L G M","548":"5 6 7 8 9 N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB"},E:{"132":"4 I J D E SC 9B TC UC VC","548":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"132":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"132":"E 9B gC MC hC iC jC kC","548":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"16":"1C"},I:{"1":"H","16":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"16":"D A"},K:{"1":"q","16":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"132":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","16":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","33":"LD"}},B:4,C:"CSS unicode-bidi property",D:false};
    +module.exports={A:{A:{"132":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","132":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","33":"9 N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB","132":"8 RC 5B I J E F G SC TC","292":"A B C K L H M"},D:{"1":"0 1 2 3 4 5 6 7 YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","132":"8 I J E F G A B C K L H M","548":"9 N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB"},E:{"132":"8 I J E F UC CC VC WC XC","548":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"132":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"132":"F CC kC PC lC mC nC oC","548":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"16":"6C"},I:{"1":"D","16":"5B I 7C 8C 9C AD PC BD CD"},J:{"16":"E A"},K:{"1":"s","16":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"132":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","16":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","33":"QD"}},B:4,C:"CSS unicode-bidi property",D:false};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-unset-value.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-unset-value.js
    index f13e2ef251a583..066f63c49cf4f7 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-unset-value.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-unset-value.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C"},C:{"1":"0 1 2 3 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p QC RC"},D:{"1":"0 1 2 3 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB"},E:{"1":"A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC"},F:{"1":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB bC cC dC eC yB LC fC zB"},G:{"1":"mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"CSS unset value",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C"},C:{"1":"0 1 2 3 4 5 6 7 DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB"},E:{"1":"A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC"},F:{"1":"EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB fC gC hC iC 0B OC jC 1B"},G:{"1":"qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"CSS unset value",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-variables.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-variables.js
    index 12682dca3eb478..e584f89901d889 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-variables.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-variables.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L","260":"G"},C:{"1":"0 1 2 3 EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB QC RC"},D:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB","194":"VB"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC","260":"WC"},F:{"1":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB bC cC dC eC yB LC fC zB","194":"IB"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC","260":"mC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS Variables (Custom Properties)",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L","260":"H"},C:{"1":"0 1 2 3 4 5 6 7 HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB","194":"YB"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC","260":"YC"},F:{"1":"MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB fC gC hC iC 0B OC jC 1B","194":"LB"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC","260":"qC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS Variables (Custom Properties)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-when-else.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-when-else.js
    index 0f4ac47fd57c8c..e0e1e51d73fa89 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-when-else.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-when-else.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:5,C:"CSS @when / @else conditional rules",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:5,C:"CSS @when / @else conditional rules",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-widows-orphans.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-widows-orphans.js
    index 5fb8e047fedf09..65b8a275bdf58b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-widows-orphans.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-widows-orphans.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D NC","129":"E F"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 I J D E F A B C K L G M N O n o p"},E:{"1":"D E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J SC 9B TC UC"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","129":"F B bC cC dC eC yB LC fC"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC"},H:{"1":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"2":"D A"},K:{"1":"q zB","2":"A B C yB LC"},L:{"1":"H"},M:{"2":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:2,C:"CSS widows & orphans",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E QC","129":"F G"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB"},E:{"1":"E F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J UC CC VC WC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","129":"G B fC gC hC iC 0B OC jC"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC"},H:{"1":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"2":"E A"},K:{"1":"s 1B","2":"A B C 0B OC"},L:{"1":"D"},M:{"2":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:2,C:"CSS widows & orphans",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-width-stretch.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-width-stretch.js
    index 30b04cd7699650..ad35e8d08d5591 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-width-stretch.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-width-stretch.js
    @@ -1 +1 @@
    -module.exports={A:{D:{"2":"4 5 I J D E F A B C K L G M N O n o","33":"0 1 2 3 6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},L:{"33":"H"},B:{"2":"C K L G M N O","33":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"OC","33":"0 1 2 3 4 5 6 7 8 9 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},M:{"33":"xB"},A:{"2":"J D E F A B NC"},F:{"2":"F B C bC cC dC eC yB LC fC zB","33":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},K:{"2":"A B C yB LC zB","33":"q"},E:{"2":"4 I J SC 9B TC UC aC","33":"D E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC"},G:{"2":"9B gC MC hC iC","33":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},P:{"2":"I","33":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},I:{"2":"3B I 2C 3C 4C 5C MC","33":"H 6C 7C"}},B:6,C:"width: stretch property",D:undefined};
    +module.exports={A:{D:{"2":"8 9 I J E F G A B C K L H M N O o p","33":"0 1 2 3 4 5 6 7 q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},L:{"33":"D"},B:{"2":"C K L H M N O","33":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"RC","33":"0 1 2 3 4 5 6 7 8 9 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},M:{"33":"D"},A:{"2":"J E F G A B QC"},F:{"2":"G B C fC gC hC iC 0B OC jC 1B","33":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},K:{"2":"A B C 0B OC 1B","33":"s"},E:{"2":"8 I J UC CC VC WC eC","33":"E F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC"},G:{"2":"CC kC PC lC mC","33":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},P:{"2":"I","33":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},I:{"2":"5B I 7C 8C 9C AD PC","33":"D BD CD"}},B:6,C:"width: stretch property",D:undefined};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-writing-mode.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-writing-mode.js
    index 54d84b644f8bdc..07d1c251b49d89 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-writing-mode.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-writing-mode.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"132":"J D E F A B NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB QC RC","322":"JB KB LB MB NB"},D:{"1":"0 1 2 3 VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J","16":"D","33":"5 6 7 8 9 E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB"},E:{"1":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B","16":"4","33":"J D E F A TC UC VC WC AC"},F:{"1":"IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","33":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC MC","33":"E hC iC jC kC lC mC nC oC"},H:{"2":"1C"},I:{"1":"H","2":"2C 3C 4C","33":"3B I 5C MC 6C 7C"},J:{"33":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"36":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","33":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"CSS writing-mode property",D:true};
    +module.exports={A:{A:{"132":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB SC TC","322":"MB NB OB PB QB"},D:{"1":"0 1 2 3 4 5 6 7 YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J","16":"E","33":"9 F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB"},E:{"1":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC","16":"8","33":"J E F G A VC WC XC YC DC"},F:{"1":"LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","33":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB"},G:{"1":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC PC","33":"F lC mC nC oC pC qC rC sC"},H:{"2":"6C"},I:{"1":"D","2":"7C 8C 9C","33":"5B I AD PC BD CD"},J:{"33":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"36":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","33":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"CSS writing-mode property",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-zoom.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-zoom.js
    index 67108d75abee49..3a6c94256e7812 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-zoom.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css-zoom.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"J D NC","129":"E F A B"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC 9B"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B"},H:{"2":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"129":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:7,C:"CSS zoom",D:true};
    +module.exports={A:{A:{"1":"J E QC","129":"F G A B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC CC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC"},H:{"2":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"129":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:7,C:"CSS zoom",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-attr.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-attr.js
    index 9fc5bf9e2d753a..05ede44ecb1805 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-attr.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-attr.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:7,C:"CSS3 attr() function for all properties",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:7,C:"CSS3 attr() function for all properties",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-boxsizing.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-boxsizing.js
    index acdde39df3e90f..8256de2645342e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-boxsizing.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-boxsizing.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"E F A B","8":"J D NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","33":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","33":"4 I J D E F"},E:{"1":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","33":"4 I SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","2":"F"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","33":"9B gC MC"},H:{"1":"1C"},I:{"1":"I H 5C MC 6C 7C","33":"3B 2C 3C 4C"},J:{"1":"A","33":"D"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"CSS3 Box-sizing",D:true};
    +module.exports={A:{A:{"1":"F G A B","8":"J E QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","33":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","33":"8 I J E F G"},E:{"1":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","33":"8 I UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","2":"G"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","33":"CC kC PC"},H:{"1":"6C"},I:{"1":"I D AD PC BD CD","33":"5B 7C 8C 9C"},J:{"1":"A","33":"E"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"CSS3 Box-sizing",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-colors.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-colors.js
    index 975cf1bd386801..7fcbf9163449ce 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-colors.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-colors.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","4":"OC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m cC dC eC yB LC fC zB","2":"F","4":"bC"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"CSS3 Colors",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","4":"RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n gC hC iC 0B OC jC 1B","2":"G","4":"fC"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"CSS3 Colors",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-cursors-grab.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-cursors-grab.js
    index 36c4cb060e02f0..3ec0387c30a345 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-cursors-grab.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-cursors-grab.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L"},C:{"1":"0 1 2 3 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","33":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p QC RC"},D:{"1":"0 1 2 3 nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","33":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB"},E:{"1":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","33":"4 I J D E F A SC 9B TC UC VC WC AC"},F:{"1":"C cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m fC zB","2":"F B bC cC dC eC yB LC","33":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"33":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:2,C:"CSS grab & grabbing cursors",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L"},C:{"1":"0 1 2 3 4 5 6 7 DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","33":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","33":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB"},E:{"1":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","33":"8 I J E F G A UC CC VC WC XC YC DC"},F:{"1":"C fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n jC 1B","2":"G B fC gC hC iC 0B OC","33":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"33":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:2,C:"CSS grab & grabbing cursors",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-cursors-newer.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-cursors-newer.js
    index 23cf92307b728c..bfa2e87a0373bd 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-cursors-newer.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-cursors-newer.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","33":"4 5 6 OC 3B I J D E F A B C K L G M N O n o p QC RC"},D:{"1":"0 1 2 3 KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","33":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","33":"4 I J D E SC 9B TC UC VC"},F:{"1":"7 8 9 C AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m fC zB","2":"F B bC cC dC eC yB LC","33":"5 6 G M N O n o p"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"33":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:2,C:"CSS3 Cursors: zoom-in & zoom-out",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","33":"8 9 RC 5B I J E F G A B C K L H M N O o p q r SC TC"},D:{"1":"0 1 2 3 4 5 6 7 NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","33":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","33":"8 I J E F UC CC VC WC XC"},F:{"1":"C AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n jC 1B","2":"G B fC gC hC iC 0B OC","33":"9 H M N O o p q r"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"33":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:2,C:"CSS3 Cursors: zoom-in & zoom-out",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-cursors.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-cursors.js
    index f214935145a8fb..81bb5ed024c9fa 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-cursors.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-cursors.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","132":"J D E NC"},B:{"1":"0 1 2 3 L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","260":"C K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","4":"OC 3B QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","4":"I"},E:{"1":"4 J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","4":"I SC 9B"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","260":"F B C bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D","16":"A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:2,C:"CSS3 Cursors (original values)",D:true};
    +module.exports={A:{A:{"1":"G A B","132":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","260":"C K"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","4":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","4":"I"},E:{"1":"8 J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","4":"I UC CC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","260":"G B C fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E","16":"A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:2,C:"CSS3 Cursors (original values)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-tabsize.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-tabsize.js
    index e0ad873c8e9ba1..64f3e59b49b37c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-tabsize.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/css3-tabsize.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC","33":"aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z","164":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB"},D:{"1":"0 1 2 3 PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 I J D E F A B C K L G M N O n","132":"6 7 8 9 o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB"},E:{"1":"L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J SC 9B TC","132":"D E F A B C K UC VC WC AC yB zB"},F:{"1":"CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F bC cC dC","132":"5 6 7 8 9 G M N O n o p AB BB","164":"B C eC yB LC fC zB"},G:{"1":"wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC","132":"E jC kC lC mC nC oC pC qC rC sC tC uC vC"},H:{"164":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC","132":"6C 7C"},J:{"132":"D A"},K:{"1":"q","2":"A","164":"B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"164":"LD MD"}},B:4,C:"CSS3 tab-size",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC","33":"dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z","164":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB"},D:{"1":"0 1 2 3 4 5 6 7 SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o","132":"p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB"},E:{"1":"L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J UC CC VC","132":"E F G A B C K WC XC YC DC 0B 1B"},F:{"1":"FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G fC gC hC","132":"9 H M N O o p q r AB BB CB DB EB","164":"B C iC 0B OC jC 1B"},G:{"1":"0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC","132":"F nC oC pC qC rC sC tC uC vC wC xC yC zC"},H:{"164":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC","132":"BD CD"},J:{"132":"E A"},K:{"1":"s","2":"A","164":"B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"164":"QD RD"}},B:4,C:"CSS3 tab-size",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/currentcolor.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/currentcolor.js
    index 6b2319ab18b938..4e5c2622e01bd8 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/currentcolor.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/currentcolor.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","2":"F"},G:{"1":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"CSS currentColor value",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","2":"G"},G:{"1":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"CSS currentColor value",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/custom-elements.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/custom-elements.js
    index 06cf0db24f4628..551eca3890e558 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/custom-elements.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/custom-elements.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","8":"A B"},B:{"1":"P","2":"0 1 2 3 Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","8":"C K L G M N O"},C:{"2":"0 1 2 3 4 5 OC 3B I J D E F A B C K L G M N O n o p 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","66":"6 7 8 9 AB BB CB","72":"DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB"},D:{"1":"GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P","2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","66":"AB BB CB DB EB FB"},E:{"2":"4 I SC 9B TC","8":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB","2":"F B C mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","66":"5 G M N O"},G:{"2":"9B gC MC hC iC","8":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"7C","2":"3B I H 2C 3C 4C 5C MC 6C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I 8C 9C AD BD CD AC DD ED","2":"n o p FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"2":"KD"},S:{"2":"MD","72":"LD"}},B:7,C:"Custom Elements (deprecated V0 spec)",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","8":"A B"},B:{"1":"P","2":"0 1 2 3 4 5 6 7 Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","8":"C K L H M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","66":"r AB BB CB DB EB FB","72":"GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB"},D:{"1":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P","2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","66":"DB EB FB GB HB IB"},E:{"2":"8 I UC CC VC","8":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB","2":"G B C pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","66":"9 H M N O"},G:{"2":"CC kC PC lC mC","8":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"CD","2":"5B I D 7C 8C 9C AD PC BD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I DD ED FD GD HD DC ID JD","2":"o p q r KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"2":"PD"},S:{"2":"RD","72":"QD"}},B:7,C:"Custom Elements (deprecated V0 spec)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/custom-elementsv1.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/custom-elementsv1.js
    index cae410f3e65871..e85390ca4116fb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/custom-elementsv1.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/custom-elementsv1.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","8":"A B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","8":"C K L G M N O"},C:{"1":"0 1 2 3 iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB QC RC","8":"DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB","456":"XB YB ZB aB bB cB dB eB fB","712":"4B gB 5B hB"},D:{"1":"0 1 2 3 mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB","8":"ZB aB","132":"bB cB dB eB fB 4B gB 5B hB iB jB kB lB"},E:{"2":"4 I J D SC 9B TC UC VC","8":"E F A WC","132":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB bC cC dC eC yB LC fC zB","132":"OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC","132":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I","132":"8C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","8":"LD"}},B:1,C:"Custom Elements (V1)",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","8":"A B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","8":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB SC TC","8":"GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB","456":"aB bB cB dB eB fB gB hB iB","712":"6B jB 7B kB"},D:{"1":"0 1 2 3 4 5 6 7 pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB","8":"cB dB","132":"eB fB gB hB iB 6B jB 7B kB lB mB nB oB"},E:{"2":"8 I J E UC CC VC WC XC","8":"F G A YC","132":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB fC gC hC iC 0B OC jC 1B","132":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC","132":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I","132":"DD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","8":"QD"}},B:1,C:"Custom Elements (V1)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/customevent.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/customevent.js
    index e2a5ef80d1b4d2..b3aebdae9676d5 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/customevent.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/customevent.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E NC","132":"F A B"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I QC RC","132":"J D E F A"},D:{"1":"0 1 2 3 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"I","16":"4 J D E K L","388":"F A B C"},E:{"1":"D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B","16":"4 J","388":"TC"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m fC zB","2":"F bC cC dC eC","132":"B yB LC"},G:{"1":"E iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"gC","16":"9B MC","388":"hC"},H:{"1":"1C"},I:{"1":"H 6C 7C","2":"2C 3C 4C","388":"3B I 5C MC"},J:{"1":"A","388":"D"},K:{"1":"C q zB","2":"A","132":"B yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"132":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"CustomEvent",D:true};
    +module.exports={A:{A:{"2":"J E F QC","132":"G A B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I SC TC","132":"J E F G A"},D:{"1":"0 1 2 3 4 5 6 7 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"I","16":"8 J E F K L","388":"G A B C"},E:{"1":"E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC","16":"8 J","388":"VC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n jC 1B","2":"G fC gC hC iC","132":"B 0B OC"},G:{"1":"F mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"kC","16":"CC PC","388":"lC"},H:{"1":"6C"},I:{"1":"D BD CD","2":"7C 8C 9C","388":"5B I AD PC"},J:{"1":"A","388":"E"},K:{"1":"C s 1B","2":"A","132":"B 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"132":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"CustomEvent",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/datalist.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/datalist.js
    index 5958f8ec56eccb..c2e002a5425dac 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/datalist.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/datalist.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"NC","8":"J D E F","260":"A B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","260":"C K L G","1284":"M N O"},C:{"1":"0 1 2 3 x y z H xB 7B 8B PC","8":"OC 3B QC RC","516":"l m r s t u v w","4612":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k"},D:{"1":"0 1 2 3 oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","8":"4 5 I J D E F A B C K L G M N O","132":"6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB"},E:{"1":"K L G zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","8":"4 I J D E F A B C SC 9B TC UC VC WC AC yB"},F:{"1":"F B C jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","132":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB"},G:{"8":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC","2049":"sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H 7C","8":"3B I 2C 3C 4C 5C MC 6C"},J:{"1":"A","8":"D"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"8":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:1,C:"Datalist element",D:true};
    +module.exports={A:{A:{"2":"QC","8":"J E F G","260":"A B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","260":"C K L H","1284":"M N O"},C:{"1":"0 1 2 3 4 5 6 7 y z D 9B AC BC","8":"RC 5B SC TC","516":"l m n t u v w x","4612":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k"},D:{"1":"0 1 2 3 4 5 6 7 rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","8":"8 9 I J E F G A B C K L H M N O","132":"o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB"},E:{"1":"K L H 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","8":"8 I J E F G A B C UC CC VC WC XC YC DC 0B"},F:{"1":"G B C mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","132":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB"},G:{"8":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC","2049":"wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D CD","8":"5B I 7C 8C 9C AD PC BD"},J:{"1":"A","8":"E"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"8":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:1,C:"Datalist element",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dataset.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dataset.js
    index b89d7d10dd5bab..09c681756b1945 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dataset.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dataset.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"B","4":"J D E F A NC"},B:{"1":"C K L G M","129":"0 1 2 3 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB","4":"4 OC 3B I QC RC","129":"0 1 2 3 YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"SB TB UB VB WB XB YB ZB aB bB","4":"4 I J","129":"0 1 2 3 5 6 7 8 9 D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"4":"4 I SC 9B","129":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"C FB GB HB IB JB KB LB MB NB OB yB LC fC zB","4":"F B bC cC dC eC","129":"5 6 7 8 9 G M N O n o p AB BB CB DB EB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"4":"9B gC MC","129":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"4":"1C"},I:{"4":"2C 3C 4C","129":"3B I H 5C MC 6C 7C"},J:{"129":"D A"},K:{"1":"C yB LC zB","4":"A B","129":"q"},L:{"129":"H"},M:{"129":"xB"},N:{"1":"B","4":"A"},O:{"129":"0B"},P:{"129":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"129":"BC"},R:{"129":"KD"},S:{"1":"LD","129":"MD"}},B:1,C:"dataset & data-* attributes",D:true};
    +module.exports={A:{A:{"1":"B","4":"J E F G A QC"},B:{"1":"C K L H M","129":"0 1 2 3 4 5 6 7 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB","4":"8 RC 5B I SC TC","129":"0 1 2 3 4 5 6 7 bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"1":"VB WB XB YB ZB aB bB cB dB eB","4":"8 I J","129":"0 1 2 3 4 5 6 7 9 E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"4":"8 I UC CC","129":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"C IB JB KB LB MB NB OB PB QB RB 0B OC jC 1B","4":"G B fC gC hC iC","129":"9 H M N O o p q r AB BB CB DB EB FB GB HB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"4":"CC kC PC","129":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"4":"6C"},I:{"4":"7C 8C 9C","129":"5B I D AD PC BD CD"},J:{"129":"E A"},K:{"1":"C 0B OC 1B","4":"A B","129":"s"},L:{"129":"D"},M:{"129":"D"},N:{"1":"B","4":"A"},O:{"129":"2B"},P:{"129":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"129":"EC"},R:{"129":"PD"},S:{"1":"QD","129":"RD"}},B:1,C:"dataset & data-* attributes",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/datauri.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/datauri.js
    index c75f8bcac32a82..09d649502a68d2 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/datauri.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/datauri.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D NC","132":"E","260":"F A B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","260":"C K G M N O","772":"L"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"260":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"Data URIs",D:true};
    +module.exports={A:{A:{"2":"J E QC","132":"F","260":"G A B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","260":"C K H M N O","772":"L"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"260":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"Data URIs",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/date-tolocaledatestring.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/date-tolocaledatestring.js
    index 09114957454bb2..309153b08381f2 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/date-tolocaledatestring.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/date-tolocaledatestring.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"16":"NC","132":"J D E F A B"},B:{"1":"0 1 2 3 O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","132":"C K L G M N"},C:{"1":"0 1 2 3 dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","132":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB QC RC","260":"ZB aB bB cB","772":"CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB"},D:{"1":"0 1 2 3 pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","132":"4 5 6 I J D E F A B C K L G M N O n o p","260":"LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB","772":"7 8 9 AB BB CB DB EB FB GB HB IB JB KB"},E:{"1":"C K L G zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"4 I SC 9B","132":"J D E F A TC UC VC WC","260":"B AC yB"},F:{"1":"eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","16":"F B C bC cC dC eC yB LC fC","132":"zB","260":"8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB","772":"5 6 7 G M N O n o p"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC MC hC","132":"E iC jC kC lC mC nC"},H:{"132":"1C"},I:{"1":"H","16":"3B 2C 3C 4C","132":"I 5C MC","772":"6C 7C"},J:{"132":"D A"},K:{"1":"q","16":"A B C yB LC","132":"zB"},L:{"1":"H"},M:{"1":"xB"},N:{"132":"A B"},O:{"1":"0B"},P:{"1":"n o p CD AC DD ED FD GD HD 1B 2B ID JD","260":"I 8C 9C AD BD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","132":"LD"}},B:6,C:"Date.prototype.toLocaleDateString",D:true};
    +module.exports={A:{A:{"16":"QC","132":"J E F G A B"},B:{"1":"0 1 2 3 4 5 6 7 O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","132":"C K L H M N"},C:{"1":"0 1 2 3 4 5 6 7 gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","132":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB SC TC","260":"cB dB eB fB","772":"FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB"},D:{"1":"0 1 2 3 4 5 6 7 sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","132":"8 9 I J E F G A B C K L H M N O o p q r","260":"OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB","772":"AB BB CB DB EB FB GB HB IB JB KB LB MB NB"},E:{"1":"C K L H 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"8 I UC CC","132":"J E F G A VC WC XC YC","260":"B DC 0B"},F:{"1":"hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","16":"G B C fC gC hC iC 0B OC jC","132":"1B","260":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB","772":"9 H M N O o p q r AB"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC PC lC","132":"F mC nC oC pC qC rC"},H:{"132":"6C"},I:{"1":"D","16":"5B 7C 8C 9C","132":"I AD PC","772":"BD CD"},J:{"132":"E A"},K:{"1":"s","16":"A B C 0B OC","132":"1B"},L:{"1":"D"},M:{"1":"D"},N:{"132":"A B"},O:{"1":"2B"},P:{"1":"o p q r HD DC ID JD KD LD MD 3B 4B ND OD","260":"I DD ED FD GD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","132":"QD"}},B:6,C:"Date.prototype.toLocaleDateString",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/declarative-shadow-dom.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/declarative-shadow-dom.js
    index 09cf8f18f1153c..1f2b3d9a71c50d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/declarative-shadow-dom.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/declarative-shadow-dom.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O P Q R S T U V W X Y"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T","66":"U V W X Y"},E:{"1":"HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC"},F:{"1":"vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB bC cC dC eC yB LC fC zB"},G:{"1":"HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p HD 1B 2B ID JD","2":"I 8C 9C AD BD CD AC DD ED FD GD"},Q:{"2":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:7,C:"Declarative Shadow DOM",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O P Q R S T U V W X Y"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T","66":"U V W X Y"},E:{"1":"KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC"},F:{"1":"yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB fC gC hC iC 0B OC jC 1B"},G:{"1":"KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r MD 3B 4B ND OD","2":"I DD ED FD GD HD DC ID JD KD LD"},Q:{"2":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:7,C:"Declarative Shadow DOM",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/decorators.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/decorators.js
    index bf4f0b32ff2fe9..d4c1e83b522ef4 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/decorators.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/decorators.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:7,C:"Decorators",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:7,C:"Decorators",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/details.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/details.js
    index 3a68fc12a83597..8f450068dec597 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/details.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/details.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"F A B NC","8":"J D E"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC","8":"4 5 6 7 8 9 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB QC RC","194":"UB VB"},D:{"1":"0 1 2 3 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","8":"4 I J D E F A B","257":"5 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB","769":"C K L G M N O"},E:{"1":"C K L G zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","8":"4 I SC 9B TC","257":"J D E F A UC VC WC","1025":"B AC yB"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"C yB LC fC zB","8":"F B bC cC dC eC"},G:{"1":"E iC jC kC lC mC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","8":"9B gC MC hC","1025":"nC oC pC"},H:{"8":"1C"},I:{"1":"I H 5C MC 6C 7C","8":"3B 2C 3C 4C"},J:{"1":"A","8":"D"},K:{"1":"q","8":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Details & Summary elements",D:true};
    +module.exports={A:{A:{"2":"G A B QC","8":"J E F"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC","8":"8 9 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB SC TC","194":"XB YB"},D:{"1":"0 1 2 3 4 5 6 7 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","8":"8 I J E F G A B","257":"9 o p q r AB BB CB DB EB FB GB HB IB JB KB LB","769":"C K L H M N O"},E:{"1":"C K L H 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","8":"8 I UC CC VC","257":"J E F G A WC XC YC","1025":"B DC 0B"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"C 0B OC jC 1B","8":"G B fC gC hC iC"},G:{"1":"F mC nC oC pC qC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","8":"CC kC PC lC","1025":"rC sC tC"},H:{"8":"6C"},I:{"1":"I D AD PC BD CD","8":"5B 7C 8C 9C"},J:{"1":"A","8":"E"},K:{"1":"s","8":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Details & Summary elements",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/deviceorientation.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/deviceorientation.js
    index bdc511587ec4d5..3ec90807f091b2 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/deviceorientation.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/deviceorientation.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A NC","132":"B"},B:{"1":"C K L G M N O","4":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"OC 3B QC","4":"0 1 2 3 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","8":"4 I RC"},D:{"2":"4 I J","4":"0 1 2 3 5 6 7 8 9 D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"F B C bC cC dC eC yB LC fC zB","4":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"9B gC","4":"E MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"2C 3C 4C","4":"3B I H 5C MC 6C 7C"},J:{"2":"D","4":"A"},K:{"1":"C zB","2":"A B yB LC","4":"q"},L:{"4":"H"},M:{"4":"xB"},N:{"1":"B","2":"A"},O:{"4":"0B"},P:{"4":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"4":"BC"},R:{"4":"KD"},S:{"4":"LD MD"}},B:4,C:"DeviceOrientation & DeviceMotion events",D:true};
    +module.exports={A:{A:{"2":"J E F G A QC","132":"B"},B:{"1":"C K L H M N O","4":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"RC 5B SC","4":"0 1 2 3 4 5 6 7 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","8":"8 I TC"},D:{"2":"8 I J","4":"0 1 2 3 4 5 6 7 9 E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"G B C fC gC hC iC 0B OC jC 1B","4":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"CC kC","4":"F PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"7C 8C 9C","4":"5B I D AD PC BD CD"},J:{"2":"E","4":"A"},K:{"1":"C 1B","2":"A B 0B OC","4":"s"},L:{"4":"D"},M:{"4":"D"},N:{"1":"B","2":"A"},O:{"4":"2B"},P:{"4":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"4":"EC"},R:{"4":"PD"},S:{"4":"QD RD"}},B:4,C:"DeviceOrientation & DeviceMotion events",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/devicepixelratio.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/devicepixelratio.js
    index e555a49f2b9916..6f4bb7866b33bf 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/devicepixelratio.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/devicepixelratio.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"B","2":"J D E F A NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K L G M N QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m fC zB","2":"F B bC cC dC eC yB LC"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"C q zB","2":"A B yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","2":"A"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"Window.devicePixelRatio",D:true};
    +module.exports={A:{A:{"1":"B","2":"J E F G A QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K L H M N SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n jC 1B","2":"G B fC gC hC iC 0B OC"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"C s 1B","2":"A B 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","2":"A"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"Window.devicePixelRatio",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dialog.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dialog.js
    index 81033e144eb733..9637b362bacb1c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dialog.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dialog.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB QC RC","194":"aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P","1218":"Q R 6B S T U V W X Y Z a b c d e f g"},D:{"1":"0 1 2 3 KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB","322":"FB GB HB IB JB"},E:{"1":"DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC"},F:{"1":"7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C G M N O bC cC dC eC yB LC fC zB","578":"5 6 n o p"},G:{"1":"DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:1,C:"Dialog element",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB SC TC","194":"dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P","1218":"Q R 8B S T U V W X Y Z a b c d e f g"},D:{"1":"0 1 2 3 4 5 6 7 NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB","322":"IB JB KB LB MB"},E:{"1":"GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC"},F:{"1":"AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C H M N O fC gC hC iC 0B OC jC 1B","578":"9 o p q r"},G:{"1":"GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:1,C:"Dialog element",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dispatchevent.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dispatchevent.js
    index 4875d29fd7a4de..2faa6c9d17fe23 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dispatchevent.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dispatchevent.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"B","16":"NC","129":"F A","130":"J D E"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"SC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","16":"F"},G:{"1":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B"},H:{"1":"1C"},I:{"1":"3B I H 4C 5C MC 6C 7C","16":"2C 3C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","129":"A"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"EventTarget.dispatchEvent",D:true};
    +module.exports={A:{A:{"1":"B","16":"QC","129":"G A","130":"J E F"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"UC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","16":"G"},G:{"1":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC"},H:{"1":"6C"},I:{"1":"5B I D 9C AD PC BD CD","16":"7C 8C"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","129":"A"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"EventTarget.dispatchEvent",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dnssec.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dnssec.js
    index 206fadf5b3f159..d57e1b0a8581c6 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dnssec.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dnssec.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"132":"J D E F A B NC"},B:{"132":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"132":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"132":"0 1 2 3 4 I EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","388":"5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB"},E:{"132":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"132":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"132":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"132":"1C"},I:{"132":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"132":"D A"},K:{"132":"A B C q yB LC zB"},L:{"132":"H"},M:{"132":"xB"},N:{"132":"A B"},O:{"132":"0B"},P:{"132":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"132":"BC"},R:{"132":"KD"},S:{"132":"LD MD"}},B:6,C:"DNSSEC and DANE",D:true};
    +module.exports={A:{A:{"132":"J E F G A B QC"},B:{"132":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"132":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"132":"0 1 2 3 4 5 6 7 8 I HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","388":"9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB"},E:{"132":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"132":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"132":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"132":"6C"},I:{"132":"5B I D 7C 8C 9C AD PC BD CD"},J:{"132":"E A"},K:{"132":"A B C s 0B OC 1B"},L:{"132":"D"},M:{"132":"D"},N:{"132":"A B"},O:{"132":"2B"},P:{"132":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"132":"EC"},R:{"132":"PD"},S:{"132":"QD RD"}},B:6,C:"DNSSEC and DANE",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/do-not-track.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/do-not-track.js
    index 1edd60fc84d813..0f027005d5115a 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/do-not-track.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/do-not-track.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E NC","164":"F A","260":"B"},B:{"1":"0 1 2 3 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","260":"C K L G M"},C:{"1":"0 1 2 3 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E QC RC","516":"5 6 7 8 9 F A B C K L G M N O n o p AB BB CB DB EB"},D:{"1":"0 1 2 3 6 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 I J D E F A B C K L G M N O n o p"},E:{"1":"J A B C TC WC AC yB","2":"4 I K L G SC 9B zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","1028":"D E F UC VC"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"F B bC cC dC eC yB LC fC"},G:{"1":"lC mC nC oC pC qC rC","2":"9B gC MC hC iC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","1028":"E jC kC"},H:{"1":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"16":"D","1028":"A"},K:{"1":"q zB","16":"A B C yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"164":"A","260":"B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:7,C:"Do Not Track API",D:true};
    +module.exports={A:{A:{"2":"J E F QC","164":"G A","260":"B"},B:{"1":"0 1 2 3 4 5 6 7 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","260":"C K L H M"},C:{"1":"0 1 2 3 4 5 6 7 IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F SC TC","516":"9 G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB"},D:{"1":"0 1 2 3 4 5 6 7 r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q"},E:{"1":"J A B C VC YC DC 0B","2":"8 I K L H UC CC 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","1028":"E F G WC XC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"G B fC gC hC iC 0B OC jC"},G:{"1":"pC qC rC sC tC uC vC","2":"CC kC PC lC mC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","1028":"F nC oC"},H:{"1":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"16":"E","1028":"A"},K:{"1":"s 1B","16":"A B C 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"164":"A","260":"B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:7,C:"Do Not Track API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/document-currentscript.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/document-currentscript.js
    index dff1fa35ce4569..477edcd68fc3fa 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/document-currentscript.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/document-currentscript.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC"},D:{"1":"0 1 2 3 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB"},E:{"1":"E F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D SC 9B TC UC VC"},F:{"1":"5 6 7 8 9 M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C G bC cC dC eC yB LC fC zB"},G:{"1":"E kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC jC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"document.currentScript",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB"},E:{"1":"F G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E UC CC VC WC XC"},F:{"1":"9 M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C H fC gC hC iC 0B OC jC 1B"},G:{"1":"F oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC nC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"document.currentScript",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/document-evaluate-xpath.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/document-evaluate-xpath.js
    index 00ed079909631b..ffe6896997ce52 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/document-evaluate-xpath.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/document-evaluate-xpath.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","16":"OC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","16":"F"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:7,C:"document.evaluate & XPath",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","16":"RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","16":"G"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:7,C:"document.evaluate & XPath",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/document-execcommand.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/document-execcommand.js
    index 7d3142ec3d1723..764dd6764b6156 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/document-execcommand.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/document-execcommand.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"J D E F A B NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"4 I SC 9B TC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m cC dC eC yB LC fC zB","16":"F bC"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC","16":"MC hC iC"},H:{"2":"1C"},I:{"1":"H 5C MC 6C 7C","2":"3B I 2C 3C 4C"},J:{"1":"A","2":"D"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","2":"A"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:7,C:"Document.execCommand()",D:true};
    +module.exports={A:{A:{"1":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"8 I UC CC VC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n gC hC iC 0B OC jC 1B","16":"G fC"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC","16":"PC lC mC"},H:{"2":"6C"},I:{"1":"D AD PC BD CD","2":"5B I 7C 8C 9C"},J:{"1":"A","2":"E"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","2":"A"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:7,C:"Document.execCommand()",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/document-policy.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/document-policy.js
    index cd4aadb8b5e716..dcf20832aaf504 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/document-policy.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/document-policy.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O P Q R S T","132":"0 1 2 3 U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T","132":"0 1 2 3 U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB bC cC dC eC yB LC fC zB","132":"qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC 6C 7C","132":"H"},J:{"2":"D A"},K:{"2":"A B C yB LC zB","132":"q"},L:{"132":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"132":"KD"},S:{"2":"LD MD"}},B:7,C:"Document Policy",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O P Q R S T","132":"0 1 2 3 4 5 6 7 U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T","132":"0 1 2 3 4 5 6 7 U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB fC gC hC iC 0B OC jC 1B","132":"tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC BD CD","132":"D"},J:{"2":"E A"},K:{"2":"A B C 0B OC 1B","132":"s"},L:{"132":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"132":"PD"},S:{"2":"QD RD"}},B:7,C:"Document Policy",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/document-scrollingelement.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/document-scrollingelement.js
    index 1f6defb551b971..f91874b35beb60 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/document-scrollingelement.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/document-scrollingelement.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","16":"C K"},C:{"1":"0 1 2 3 VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB QC RC"},D:{"1":"0 1 2 3 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E SC 9B TC UC VC"},F:{"1":"EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB bC cC dC eC yB LC fC zB"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"document.scrollingElement",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","16":"C K"},C:{"1":"0 1 2 3 4 5 6 7 YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F UC CC VC WC XC"},F:{"1":"HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB fC gC hC iC 0B OC jC 1B"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"document.scrollingElement",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/documenthead.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/documenthead.js
    index 0ca2e63d0a4524..77d58fbf322a75 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/documenthead.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/documenthead.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B","16":"4"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m yB LC fC zB","2":"F bC cC dC eC"},G:{"1":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B"},H:{"1":"1C"},I:{"1":"3B I H 4C 5C MC 6C 7C","16":"2C 3C"},J:{"1":"D A"},K:{"1":"B C q yB LC zB","2":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"document.head",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC","16":"8"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 0B OC jC 1B","2":"G fC gC hC iC"},G:{"1":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC"},H:{"1":"6C"},I:{"1":"5B I D 9C AD PC BD CD","16":"7C 8C"},J:{"1":"E A"},K:{"1":"B C s 0B OC 1B","2":"A"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"document.head",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dom-manip-convenience.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dom-manip-convenience.js
    index ea5f0ff7f1f21c..ec4046ace6f2a5 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dom-manip-convenience.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dom-manip-convenience.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M"},C:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB QC RC"},D:{"1":"0 1 2 3 bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB","194":"ZB aB"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC WC"},F:{"1":"OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB bC cC dC eC yB LC fC zB","194":"NB"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:1,C:"DOM manipulation convenience methods",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M"},C:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB","194":"cB dB"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC YC"},F:{"1":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB fC gC hC iC 0B OC jC 1B","194":"QB"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:1,C:"DOM manipulation convenience methods",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dom-range.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dom-range.js
    index 8d05b5928ef1d2..cf1c87354c7811 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dom-range.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dom-range.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"NC","8":"J D E"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Document Object Model Range",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"QC","8":"J E F"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Document Object Model Range",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/domcontentloaded.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/domcontentloaded.js
    index b8f2367143adc5..55473c88b30835 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/domcontentloaded.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/domcontentloaded.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"DOMContentLoaded",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"DOMContentLoaded",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dommatrix.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dommatrix.js
    index 29edd706e14424..0df537496d41bb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dommatrix.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dommatrix.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","132":"A B"},B:{"132":"C K L G M N O","1028":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB QC RC","1028":"0 1 2 3 oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2564":"GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB","3076":"WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB"},D:{"16":"4 I J D","132":"5 6 7 8 9 F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB","388":"E","1028":"0 1 2 3 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"16":"I SC 9B","132":"4 J D E F A TC UC VC WC AC","1028":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"F B C bC cC dC eC yB LC fC zB","132":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB","1028":"VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"16":"9B gC MC","132":"E hC iC jC kC lC mC nC oC","1028":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"132":"I 5C MC 6C 7C","292":"3B 2C 3C 4C","1028":"H"},J:{"16":"D","132":"A"},K:{"2":"A B C yB LC zB","1028":"q"},L:{"1028":"H"},M:{"1028":"xB"},N:{"132":"A B"},O:{"1028":"0B"},P:{"132":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1028":"BC"},R:{"1028":"KD"},S:{"1028":"MD","2564":"LD"}},B:4,C:"DOMMatrix",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","132":"A B"},B:{"132":"C K L H M N O","1028":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB SC TC","1028":"0 1 2 3 4 5 6 7 rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2564":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB","3076":"ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB"},D:{"16":"8 I J E","132":"9 G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB","388":"F","1028":"0 1 2 3 4 5 6 7 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"16":"I UC CC","132":"8 J E F G A VC WC XC YC DC","1028":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"G B C fC gC hC iC 0B OC jC 1B","132":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB","1028":"YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"16":"CC kC PC","132":"F lC mC nC oC pC qC rC sC","1028":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"132":"I AD PC BD CD","292":"5B 7C 8C 9C","1028":"D"},J:{"16":"E","132":"A"},K:{"2":"A B C 0B OC 1B","1028":"s"},L:{"1028":"D"},M:{"1028":"D"},N:{"132":"A B"},O:{"1028":"2B"},P:{"132":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1028":"EC"},R:{"1028":"PD"},S:{"1028":"RD","2564":"QD"}},B:4,C:"DOMMatrix",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/download.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/download.js
    index 29a4224455987b..d738bcb3c0786f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/download.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/download.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C"},C:{"1":"0 1 2 3 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 OC 3B I J D E F A B C K L G M N O QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A B C K"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"1":"A","2":"D"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Download attribute",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C"},C:{"1":"0 1 2 3 4 5 6 7 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A B C K"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"1":"A","2":"E"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Download attribute",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dragndrop.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dragndrop.js
    index 14c0dd2797c403..f020e6fbef8526 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dragndrop.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/dragndrop.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"644":"J D E F NC","772":"A B"},B:{"1":"0 1 2 3 O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","260":"C K L G M N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","8":"OC 3B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","8":"F B bC cC dC eC yB LC fC"},G:{"1":"zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC 6C 7C","1025":"H"},J:{"2":"D A"},K:{"1":"zB","8":"A B C yB LC","1025":"q"},L:{"1025":"H"},M:{"2":"xB"},N:{"1":"A B"},O:{"1025":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:1,C:"Drag and Drop",D:true};
    +module.exports={A:{A:{"644":"J E F G QC","772":"A B"},B:{"1":"0 1 2 3 4 5 6 7 O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","260":"C K L H M N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","8":"RC 5B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","8":"G B fC gC hC iC 0B OC jC"},G:{"1":"3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC BD CD","1025":"D"},J:{"2":"E A"},K:{"1":"1B","8":"A B C 0B OC","1025":"s"},L:{"1025":"D"},M:{"2":"D"},N:{"1":"A B"},O:{"1025":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:1,C:"Drag and Drop",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/element-closest.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/element-closest.js
    index 8f95b6373bca0c..034c8dc6cd14e5 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/element-closest.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/element-closest.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L"},C:{"1":"0 1 2 3 IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB QC RC"},D:{"1":"0 1 2 3 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E SC 9B TC UC VC"},F:{"1":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB bC cC dC eC yB LC fC zB"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Element.closest()",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L"},C:{"1":"0 1 2 3 4 5 6 7 LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F UC CC VC WC XC"},F:{"1":"EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB fC gC hC iC 0B OC jC 1B"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Element.closest()",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/element-from-point.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/element-from-point.js
    index 9802a8e3d060f2..c021c8ea760353 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/element-from-point.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/element-from-point.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"J D E F A B","16":"NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","16":"OC"},D:{"1":"0 1 2 3 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 I J D E F A B C K L"},E:{"1":"4 J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"I SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m yB LC fC zB","16":"F bC cC dC eC"},G:{"1":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B"},H:{"1":"1C"},I:{"1":"3B I H 4C 5C MC 6C 7C","16":"2C 3C"},J:{"1":"D A"},K:{"1":"C q zB","16":"A B yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"document.elementFromPoint()",D:true};
    +module.exports={A:{A:{"1":"J E F G A B","16":"QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","16":"RC"},D:{"1":"0 1 2 3 4 5 6 7 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 I J E F G A B C K L"},E:{"1":"8 J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"I UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 0B OC jC 1B","16":"G fC gC hC iC"},G:{"1":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC"},H:{"1":"6C"},I:{"1":"5B I D 9C AD PC BD CD","16":"7C 8C"},J:{"1":"E A"},K:{"1":"C s 1B","16":"A B 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"document.elementFromPoint()",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/element-scroll-methods.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/element-scroll-methods.js
    index 66b640a665c527..096166c9d59c3e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/element-scroll-methods.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/element-scroll-methods.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB QC RC"},D:{"1":"0 1 2 3 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB"},E:{"1":"L G XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC WC","132":"A B C K AC yB zB BC"},F:{"1":"VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB bC cC dC eC yB LC fC zB"},G:{"1":"yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC","132":"nC oC pC qC rC sC tC uC vC wC xC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"Scroll methods on elements (scroll, scrollTo, scrollBy)",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB"},E:{"1":"L H ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC YC","132":"A B C K DC 0B 1B EC"},F:{"1":"YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB fC gC hC iC 0B OC jC 1B"},G:{"1":"2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC","132":"rC sC tC uC vC wC xC yC zC 0C 1C"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"Scroll methods on elements (scroll, scrollTo, scrollBy)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/eme.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/eme.js
    index 35a1c0c51d0c8c..771f9c351ce231 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/eme.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/eme.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A NC","164":"B"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB QC RC"},D:{"1":"0 1 2 3 PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB","132":"IB JB KB LB MB NB OB"},E:{"1":"C K L G zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J SC 9B TC UC","164":"D E F A B VC WC AC yB"},F:{"1":"CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 F B C G M N O n o bC cC dC eC yB LC fC zB","132":"6 7 8 9 p AB BB"},G:{"1":"qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"Encrypted Media Extensions",D:true};
    +module.exports={A:{A:{"2":"J E F G A QC","164":"B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB","132":"LB MB NB OB PB QB RB"},E:{"1":"C K L H 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J UC CC VC WC","164":"E F G A B XC YC DC 0B"},F:{"1":"FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p fC gC hC iC 0B OC jC 1B","132":"q r AB BB CB DB EB"},G:{"1":"uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"Encrypted Media Extensions",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/eot.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/eot.js
    index b349c675f7b20c..f0c3fceb5481f3 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/eot.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/eot.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"J D E F A B","2":"NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:7,C:"EOT - Embedded OpenType fonts",D:true};
    +module.exports={A:{A:{"1":"J E F G A B","2":"QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:7,C:"EOT - Embedded OpenType fonts",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es5.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es5.js
    index c67a68b0a4d640..02773e60a02072 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es5.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es5.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D NC","260":"F","1026":"E"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 6 7 8 9 o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","4":"OC 3B QC RC","132":"4 5 I J D E F A B C K L G M N O n"},D:{"1":"0 1 2 3 6 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","4":"4 I J D E F A B C K L G M N O","132":"5 n o p"},E:{"1":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","4":"4 I SC 9B TC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","4":"F B C bC cC dC eC yB LC fC","132":"zB"},G:{"1":"E iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","4":"9B gC MC hC"},H:{"132":"1C"},I:{"1":"H 6C 7C","4":"3B 2C 3C 4C","132":"5C MC","900":"I"},J:{"1":"A","4":"D"},K:{"1":"q","4":"A B C yB LC","132":"zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"ECMAScript 5",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E QC","260":"G","1026":"F"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","4":"RC 5B SC TC","132":"8 9 I J E F G A B C K L H M N O o"},D:{"1":"0 1 2 3 4 5 6 7 r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","4":"8 I J E F G A B C K L H M N O","132":"9 o p q"},E:{"1":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","4":"8 I UC CC VC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","4":"G B C fC gC hC iC 0B OC jC","132":"1B"},G:{"1":"F mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","4":"CC kC PC lC"},H:{"132":"6C"},I:{"1":"D BD CD","4":"5B 7C 8C 9C","132":"AD PC","900":"I"},J:{"1":"A","4":"E"},K:{"1":"s","4":"A B C 0B OC","132":"1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"ECMAScript 5",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-class.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-class.js
    index 6c48045e11c951..6f7ea1e43c3678 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-class.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-class.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C"},C:{"1":"0 1 2 3 SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB QC RC"},D:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB","132":"PB QB RB SB TB UB VB"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E SC 9B TC UC VC"},F:{"1":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB bC cC dC eC yB LC fC zB","132":"CB DB EB FB GB HB IB"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"ES6 classes",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C"},C:{"1":"0 1 2 3 4 5 6 7 VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB","132":"SB TB UB VB WB XB YB"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F UC CC VC WC XC"},F:{"1":"MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB fC gC hC iC 0B OC jC 1B","132":"FB GB HB IB JB KB LB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"ES6 classes",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-generators.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-generators.js
    index ab5d2ce6771744..121824e045475d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-generators.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-generators.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C"},C:{"1":"0 1 2 3 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 OC 3B I J D E F A B C K L G M N O n o p QC RC"},D:{"1":"0 1 2 3 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC WC"},F:{"1":"9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 F B C G M N O n o p bC cC dC eC yB LC fC zB"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"ES6 Generators",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C"},C:{"1":"0 1 2 3 4 5 6 7 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC YC"},F:{"1":"CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB fC gC hC iC 0B OC jC 1B"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"ES6 Generators",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-module-dynamic-import.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-module-dynamic-import.js
    index 2497ebba0ac243..4fea580939198a 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-module-dynamic-import.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-module-dynamic-import.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB QC RC","194":"lB"},D:{"1":"0 1 2 3 iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB"},E:{"1":"C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B SC 9B TC UC VC WC AC"},F:{"1":"XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB bC cC dC eC yB LC fC zB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:6,C:"JavaScript modules: dynamic import()",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB SC TC","194":"oB"},D:{"1":"0 1 2 3 4 5 6 7 lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB"},E:{"1":"C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B UC CC VC WC XC YC DC"},F:{"1":"aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB fC gC hC iC 0B OC jC 1B"},G:{"1":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:6,C:"JavaScript modules: dynamic import()",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-module.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-module.js
    index 22b2dfa300902e..a990ba9968ebef 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-module.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-module.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L","2049":"M N O","2242":"G"},C:{"1":"0 1 2 3 gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB QC RC","322":"bB cB dB eB fB 4B"},D:{"1":"0 1 2 3 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B","194":"gB"},E:{"1":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC","1540":"AC"},F:{"1":"VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB bC cC dC eC yB LC fC zB","194":"UB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC","1540":"oC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:1,C:"JavaScript modules via script tag",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L","2049":"M N O","2242":"H"},C:{"1":"0 1 2 3 4 5 6 7 jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB SC TC","322":"eB fB gB hB iB 6B"},D:{"1":"0 1 2 3 4 5 6 7 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B","194":"jB"},E:{"1":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC","1540":"DC"},F:{"1":"YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB fC gC hC iC 0B OC jC 1B","194":"XB"},G:{"1":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC","1540":"sC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:1,C:"JavaScript modules via script tag",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-number.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-number.js
    index 97e7fc7ce27e4a..be146d71a59c84 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-number.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-number.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K L G QC RC","132":"5 6 7 M N O n o p","260":"8 9 AB BB CB DB","516":"EB"},D:{"1":"0 1 2 3 HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A B C K L G M N O","1028":"5 6 7 8 9 n o p AB BB CB DB EB FB GB"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E SC 9B TC UC VC"},F:{"1":"6 7 8 9 o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","1028":"5 G M N O n"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C","1028":"5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"ES6 Number",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K L H SC TC","132":"9 M N O o p q r AB","260":"BB CB DB EB FB GB","516":"HB"},D:{"1":"0 1 2 3 4 5 6 7 KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A B C K L H M N O","1028":"9 o p q r AB BB CB DB EB FB GB HB IB JB"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F UC CC VC WC XC"},F:{"1":"p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","1028":"9 H M N O o"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C","1028":"AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"ES6 Number",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-string-includes.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-string-includes.js
    index 094edf8af30f73..97b85e2a8aa5ed 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-string-includes.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6-string-includes.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB QC RC"},D:{"1":"0 1 2 3 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E SC 9B TC UC VC"},F:{"1":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB bC cC dC eC yB LC fC zB"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"String.prototype.includes",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F UC CC VC WC XC"},F:{"1":"EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB fC gC hC iC 0B OC jC 1B"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"String.prototype.includes",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6.js
    index 6d09561b78b09f..07c8cb3eef60f7 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/es6.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A NC","388":"B"},B:{"257":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","260":"C K L","769":"G M N O"},C:{"2":"4 OC 3B I QC RC","4":"5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB","257":"0 1 2 3 bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"2":"4 5 I J D E F A B C K L G M N O n","4":"6 7 8 9 o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB","257":"0 1 2 3 YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D SC 9B TC UC","4":"E F VC WC"},F:{"2":"F B C bC cC dC eC yB LC fC zB","4":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB","257":"LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC","4":"E jC kC lC mC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC","4":"6C 7C","257":"H"},J:{"2":"D","4":"A"},K:{"2":"A B C yB LC zB","257":"q"},L:{"257":"H"},M:{"257":"xB"},N:{"2":"A","388":"B"},O:{"257":"0B"},P:{"4":"I","257":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"257":"BC"},R:{"257":"KD"},S:{"4":"LD","257":"MD"}},B:6,C:"ECMAScript 2015 (ES6)",D:true};
    +module.exports={A:{A:{"2":"J E F G A QC","388":"B"},B:{"257":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","260":"C K L","769":"H M N O"},C:{"2":"8 RC 5B I SC TC","4":"9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB","257":"0 1 2 3 4 5 6 7 eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"2":"8 9 I J E F G A B C K L H M N O o","4":"p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB","257":"0 1 2 3 4 5 6 7 bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E UC CC VC WC","4":"F G XC YC"},F:{"2":"G B C fC gC hC iC 0B OC jC 1B","4":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB","257":"OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC","4":"F nC oC pC qC"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC","4":"BD CD","257":"D"},J:{"2":"E","4":"A"},K:{"2":"A B C 0B OC 1B","257":"s"},L:{"257":"D"},M:{"257":"D"},N:{"2":"A","388":"B"},O:{"257":"2B"},P:{"4":"I","257":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"257":"EC"},R:{"257":"PD"},S:{"4":"QD","257":"RD"}},B:6,C:"ECMAScript 2015 (ES6)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/eventsource.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/eventsource.js
    index 4d94540f99cb72..4e886efe081894 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/eventsource.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/eventsource.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I"},E:{"1":"4 J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m yB LC fC zB","4":"F bC cC dC eC"},G:{"1":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"1":"D A"},K:{"1":"C q yB LC zB","4":"A B"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Server-sent events",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I"},E:{"1":"8 J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 0B OC jC 1B","4":"G fC gC hC iC"},G:{"1":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"1":"E A"},K:{"1":"C s 0B OC 1B","4":"A B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Server-sent events",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/extended-system-fonts.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/extended-system-fonts.js
    index 539f956ae1dbc8..74b1f6d868f4c8 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/extended-system-fonts.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/extended-system-fonts.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K SC 9B TC UC VC WC AC yB zB"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:5,C:"ui-serif, ui-sans-serif, ui-monospace and ui-rounded values for font-family",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K UC CC VC WC XC YC DC 0B 1B"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:5,C:"ui-serif, ui-sans-serif, ui-monospace and ui-rounded values for font-family",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/feature-policy.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/feature-policy.js
    index 385d1160179b69..f13f632f77f4f5 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/feature-policy.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/feature-policy.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"P Q R S T U V W","2":"C K L G M N O","1025":"0 1 2 3 X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q QC RC","260":"0 1 2 3 sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"sB tB uB vB wB P Q R S T U V W","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B","132":"gB 5B hB iB jB kB lB mB nB oB pB qB rB q","1025":"0 1 2 3 X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B SC 9B TC UC VC WC AC","772":"C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"hB iB jB kB lB mB nB oB pB qB rB q sB","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB bC cC dC eC yB LC fC zB","132":"UB VB WB XB YB ZB aB bB cB dB eB fB gB","1025":"tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC","772":"qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C yB LC zB","1025":"q"},L:{"1025":"H"},M:{"260":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD","132":"BD CD AC"},Q:{"132":"BC"},R:{"1025":"KD"},S:{"2":"LD","260":"MD"}},B:7,C:"Feature Policy",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"P Q R S T U V W","2":"C K L H M N O","1025":"0 1 2 3 4 5 6 7 X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s SC TC","260":"0 1 2 3 4 5 6 7 vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"1":"vB wB xB yB zB P Q R S T U V W","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B","132":"jB 7B kB lB mB nB oB pB qB rB sB tB uB s","1025":"0 1 2 3 4 5 6 7 X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B UC CC VC WC XC YC DC","772":"C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"kB lB mB nB oB pB qB rB sB tB uB s vB","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB fC gC hC iC 0B OC jC 1B","132":"XB YB ZB aB bB cB dB eB fB gB hB iB jB","1025":"wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC","772":"uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C 0B OC 1B","1025":"s"},L:{"1025":"D"},M:{"260":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD","132":"GD HD DC"},Q:{"132":"EC"},R:{"1025":"PD"},S:{"2":"QD","260":"RD"}},B:7,C:"Feature Policy",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/fetch.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/fetch.js
    index 7591bb55cb23a0..c90d4ea9f20738 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/fetch.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/fetch.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K"},C:{"1":"0 1 2 3 NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB QC RC","1025":"MB","1218":"HB IB JB KB LB"},D:{"1":"0 1 2 3 PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB","260":"NB","772":"OB"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC"},F:{"1":"CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p bC cC dC eC yB LC fC zB","260":"AB","772":"BB"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Fetch",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K"},C:{"1":"0 1 2 3 4 5 6 7 QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB SC TC","1025":"PB","1218":"KB LB MB NB OB"},D:{"1":"0 1 2 3 4 5 6 7 SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB","260":"QB","772":"RB"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC"},F:{"1":"FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB fC gC hC iC 0B OC jC 1B","260":"DB","772":"EB"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Fetch",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/fieldset-disabled.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/fieldset-disabled.js
    index b8e88decebc8f8..7cffad7ebca448 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/fieldset-disabled.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/fieldset-disabled.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"16":"NC","132":"E F","388":"J D A B"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC"},D:{"1":"0 1 2 3 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A B C K L G","16":"5 M N O"},E:{"1":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m cC dC eC yB LC fC zB","16":"F bC"},G:{"1":"E iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC"},H:{"388":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"1":"A","2":"D"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A","260":"B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"disabled attribute of the fieldset element",D:true};
    +module.exports={A:{A:{"16":"QC","132":"F G","388":"J E A B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A B C K L H","16":"9 M N O"},E:{"1":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n gC hC iC 0B OC jC 1B","16":"G fC"},G:{"1":"F mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC"},H:{"388":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"1":"A","2":"E"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A","260":"B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"disabled attribute of the fieldset element",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/fileapi.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/fileapi.js
    index 907050bcd3efec..fde31f7ec9924d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/fileapi.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/fileapi.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","260":"A B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","260":"C K L G M N O"},C:{"1":"0 1 2 3 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC","260":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB RC"},D:{"1":"0 1 2 3 LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I","260":"5 6 7 8 9 K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB","388":"J D E F A B C"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B","260":"J D E F UC VC WC","388":"TC"},F:{"1":"8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B bC cC dC eC","260":"5 6 7 C G M N O n o p yB LC fC zB"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC","260":"E iC jC kC lC mC"},H:{"2":"1C"},I:{"1":"H 7C","2":"2C 3C 4C","260":"6C","388":"3B I 5C MC"},J:{"260":"A","388":"D"},K:{"1":"q","2":"A B","260":"C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A","260":"B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"File API",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","260":"A B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","260":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC","260":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB TC"},D:{"1":"0 1 2 3 4 5 6 7 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I","260":"9 K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB","388":"J E F G A B C"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC","260":"J E F G WC XC YC","388":"VC"},F:{"1":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B fC gC hC iC","260":"9 C H M N O o p q r AB 0B OC jC 1B"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC","260":"F mC nC oC pC qC"},H:{"2":"6C"},I:{"1":"D CD","2":"7C 8C 9C","260":"BD","388":"5B I AD PC"},J:{"260":"A","388":"E"},K:{"1":"s","2":"A B","260":"C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A","260":"B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"File API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/filereader.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/filereader.js
    index 408f5f6898214f..fdc907b2abdbbc 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/filereader.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/filereader.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","132":"A B"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC RC","2":"OC 3B QC"},D:{"1":"0 1 2 3 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I"},E:{"1":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m yB LC fC zB","2":"F B bC cC dC eC"},G:{"1":"E iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC"},H:{"2":"1C"},I:{"1":"3B I H 5C MC 6C 7C","2":"2C 3C 4C"},J:{"1":"A","2":"D"},K:{"1":"C q yB LC zB","2":"A B"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"FileReader API",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","132":"A B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC TC","2":"RC 5B SC"},D:{"1":"0 1 2 3 4 5 6 7 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I"},E:{"1":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 0B OC jC 1B","2":"G B fC gC hC iC"},G:{"1":"F mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC"},H:{"2":"6C"},I:{"1":"5B I D AD PC BD CD","2":"7C 8C 9C"},J:{"1":"A","2":"E"},K:{"1":"C s 0B OC 1B","2":"A B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"FileReader API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/filereadersync.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/filereadersync.js
    index 82e86ddb846add..6d5cebd645605e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/filereadersync.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/filereadersync.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 I J D E F A B C K L"},E:{"1":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m fC zB","2":"F bC cC","16":"B dC eC yB LC"},G:{"1":"E iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"1":"A","2":"D"},K:{"1":"C q LC zB","2":"A","16":"B yB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"FileReaderSync",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 I J E F G A B C K L"},E:{"1":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n jC 1B","2":"G fC gC","16":"B hC iC 0B OC"},G:{"1":"F mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"1":"A","2":"E"},K:{"1":"C s OC 1B","2":"A","16":"B 0B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"FileReaderSync",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/filesystem.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/filesystem.js
    index b2e97cfbec99a3..44f6f96adaf494 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/filesystem.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/filesystem.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O","33":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"4 I J D","33":"0 1 2 3 5 6 7 8 9 K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","36":"E F A B C"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"F B C bC cC dC eC yB LC fC zB","33":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D","33":"A"},K:{"2":"A B C yB LC zB","33":"q"},L:{"33":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"33":"0B"},P:{"2":"I","33":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"33":"KD"},S:{"2":"LD MD"}},B:7,C:"Filesystem & FileWriter API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O","33":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"8 I J E","33":"0 1 2 3 4 5 6 7 9 K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","36":"F G A B C"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"G B C fC gC hC iC 0B OC jC 1B","33":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E","33":"A"},K:{"2":"A B C 0B OC 1B","33":"s"},L:{"33":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"33":"2B"},P:{"2":"I","33":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"33":"PD"},S:{"2":"QD RD"}},B:7,C:"Filesystem & FileWriter API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/flac.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/flac.js
    index 163b8c408c4791..6e084bfb90e6a7 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/flac.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/flac.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G"},C:{"1":"0 1 2 3 YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB QC RC"},D:{"1":"0 1 2 3 dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB","16":"RB SB TB","388":"UB VB WB XB YB ZB aB bB cB"},E:{"1":"K L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC AC","516":"B C yB zB"},F:{"1":"PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB bC cC dC eC yB LC fC zB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC"},H:{"2":"1C"},I:{"1":"H","2":"2C 3C 4C","16":"3B I 5C MC 6C 7C"},J:{"1":"A","2":"D"},K:{"1":"q zB","16":"A B C yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","129":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:6,C:"FLAC audio format",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H"},C:{"1":"0 1 2 3 4 5 6 7 bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB","16":"UB VB WB","388":"XB YB ZB aB bB cB dB eB fB"},E:{"1":"K L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC DC","516":"B C 0B 1B"},F:{"1":"SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB fC gC hC iC 0B OC jC 1B"},G:{"1":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC"},H:{"2":"6C"},I:{"1":"D","2":"7C 8C 9C","16":"5B I AD PC BD CD"},J:{"1":"A","2":"E"},K:{"1":"s 1B","16":"A B C 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","129":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:6,C:"FLAC audio format",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/flexbox-gap.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/flexbox-gap.js
    index f082515f73b43e..088ab490980c38 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/flexbox-gap.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/flexbox-gap.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O P Q R S"},C:{"1":"0 1 2 3 iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB QC RC"},D:{"1":"0 1 2 3 T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S"},E:{"1":"G XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K L SC 9B TC UC VC WC AC yB zB BC"},F:{"1":"pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB bC cC dC eC yB LC fC zB"},G:{"1":"yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD AC DD ED FD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:5,C:"gap property for Flexbox",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O P Q R S"},C:{"1":"0 1 2 3 4 5 6 7 lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S"},E:{"1":"H ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L UC CC VC WC XC YC DC 0B 1B EC"},F:{"1":"sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB fC gC hC iC 0B OC jC 1B"},G:{"1":"2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r LD MD 3B 4B ND OD","2":"I DD ED FD GD HD DC ID JD KD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:5,C:"gap property for Flexbox",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/flexbox.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/flexbox.js
    index fd4570beaee47a..674cce6afeed89 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/flexbox.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/flexbox.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","1028":"B","1316":"A"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","164":"4 5 OC 3B I J D E F A B C K L G M N O n o QC RC","516":"6 7 8 9 p AB"},D:{"1":"0 1 2 3 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","33":"6 7 8 9 o p AB BB","164":"4 5 I J D E F A B C K L G M N O n"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","33":"D E UC VC","164":"4 I J SC 9B TC"},F:{"1":"5 6 7 8 9 N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"F B C bC cC dC eC yB LC fC","33":"G M"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","33":"E jC kC","164":"9B gC MC hC iC"},H:{"1":"1C"},I:{"1":"H 6C 7C","164":"3B I 2C 3C 4C 5C MC"},J:{"1":"A","164":"D"},K:{"1":"q zB","2":"A B C yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","292":"A"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS Flexible Box Layout Module",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","1028":"B","1316":"A"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","164":"8 9 RC 5B I J E F G A B C K L H M N O o p SC TC","516":"q r AB BB CB DB"},D:{"1":"0 1 2 3 4 5 6 7 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","33":"p q r AB BB CB DB EB","164":"8 9 I J E F G A B C K L H M N O o"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","33":"E F WC XC","164":"8 I J UC CC VC"},F:{"1":"9 N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"G B C fC gC hC iC 0B OC jC","33":"H M"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","33":"F nC oC","164":"CC kC PC lC mC"},H:{"1":"6C"},I:{"1":"D BD CD","164":"5B I 7C 8C 9C AD PC"},J:{"1":"A","164":"E"},K:{"1":"s 1B","2":"A B C 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","292":"A"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS Flexible Box Layout Module",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/flow-root.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/flow-root.js
    index eb72fa53408c19..120ad0a1d46cce 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/flow-root.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/flow-root.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB QC RC"},D:{"1":"0 1 2 3 fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB"},E:{"1":"K L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C SC 9B TC UC VC WC AC yB zB"},F:{"1":"SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB bC cC dC eC yB LC fC zB"},G:{"1":"tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:4,C:"display: flow-root",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB"},E:{"1":"K L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C UC CC VC WC XC YC DC 0B 1B"},F:{"1":"VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB fC gC hC iC 0B OC jC 1B"},G:{"1":"xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:4,C:"display: flow-root",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/focusin-focusout-events.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/focusin-focusout-events.js
    index da707f1db861b1..efadbb33154bd3 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/focusin-focusout-events.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/focusin-focusout-events.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"J D E F A B","2":"NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 I J D E F A B C K L"},E:{"1":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"4 I SC 9B"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m fC zB","2":"F bC cC dC eC","16":"B yB LC"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC"},H:{"2":"1C"},I:{"1":"I H 5C MC 6C 7C","2":"2C 3C 4C","16":"3B"},J:{"1":"D A"},K:{"1":"C q zB","2":"A","16":"B yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:5,C:"focusin & focusout events",D:true};
    +module.exports={A:{A:{"1":"J E F G A B","2":"QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 I J E F G A B C K L"},E:{"1":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"8 I UC CC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n jC 1B","2":"G fC gC hC iC","16":"B 0B OC"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC"},H:{"2":"6C"},I:{"1":"I D AD PC BD CD","2":"7C 8C 9C","16":"5B"},J:{"1":"E A"},K:{"1":"C s 1B","2":"A","16":"B 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:5,C:"focusin & focusout events",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-family-system-ui.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-family-system-ui.js
    index 246c2608497593..9082112a105e20 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-family-system-ui.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-family-system-ui.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QC RC","132":"QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a"},D:{"1":"0 1 2 3 dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB","260":"aB bB cB"},E:{"1":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E SC 9B TC UC VC","16":"F","132":"A WC AC"},F:{"1":"QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB bC cC dC eC yB LC fC zB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC","132":"lC mC nC oC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"132":"LD MD"}},B:5,C:"system-ui value for font-family",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB SC TC","132":"TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a"},D:{"1":"0 1 2 3 4 5 6 7 gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB","260":"dB eB fB"},E:{"1":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F UC CC VC WC XC","16":"G","132":"A YC DC"},F:{"1":"TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB fC gC hC iC 0B OC jC 1B"},G:{"1":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC","132":"pC qC rC sC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"132":"QD RD"}},B:5,C:"system-ui value for font-family",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-feature.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-feature.js
    index 83d294fc158a47..15257b9adcec21 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-feature.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-feature.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC","33":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB","164":"4 I J D E F A B C K L"},D:{"1":"0 1 2 3 VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A B C K L G","33":"6 7 8 9 o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB","292":"5 M N O n"},E:{"1":"A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"D E F SC 9B UC VC","4":"4 I J TC"},F:{"1":"IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","33":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB"},G:{"1":"mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E jC kC lC","4":"9B gC MC hC iC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC","33":"6C 7C"},J:{"2":"D","33":"A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","33":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"CSS font-feature-settings",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC","33":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB","164":"8 I J E F G A B C K L"},D:{"1":"0 1 2 3 4 5 6 7 YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A B C K L H","33":"p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB","292":"9 M N O o"},E:{"1":"A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"E F G UC CC WC XC","4":"8 I J VC"},F:{"1":"LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","33":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB"},G:{"1":"qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F nC oC pC","4":"CC kC PC lC mC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC","33":"BD CD"},J:{"2":"E","33":"A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","33":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"CSS font-feature-settings",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-kerning.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-kerning.js
    index 09bc759e1ad0e3..943ad36aeb2240 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-kerning.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-kerning.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 OC 3B I J D E F A B C K L G M N O n o p QC RC","194":"7 8 9 AB BB CB DB EB FB GB"},D:{"1":"0 1 2 3 GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB","33":"CB DB EB FB"},E:{"1":"A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J SC 9B TC UC","33":"D E F VC"},F:{"1":"6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C G bC cC dC eC yB LC fC zB","33":"5 M N O"},G:{"1":"rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC jC","33":"E kC lC mC nC oC pC qC"},H:{"2":"1C"},I:{"1":"H 7C","2":"3B I 2C 3C 4C 5C MC","33":"6C"},J:{"2":"D","33":"A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS3 font-kerning",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r SC TC","194":"AB BB CB DB EB FB GB HB IB JB"},D:{"1":"0 1 2 3 4 5 6 7 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB","33":"FB GB HB IB"},E:{"1":"A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J UC CC VC WC","33":"E F G XC"},F:{"1":"o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C H fC gC hC iC 0B OC jC 1B","33":"9 M N O"},G:{"1":"vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC nC","33":"F oC pC qC rC sC tC uC"},H:{"2":"6C"},I:{"1":"D CD","2":"5B I 7C 8C 9C AD PC","33":"BD"},J:{"2":"E","33":"A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS3 font-kerning",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-loading.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-loading.js
    index 9d2dca2a995931..018b4d30a3e90b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-loading.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-loading.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB QC RC","194":"IB JB KB LB MB NB"},D:{"1":"0 1 2 3 IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC WC"},F:{"1":"6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 F B C G M N O n o bC cC dC eC yB LC fC zB"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"CSS Font Loading",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB SC TC","194":"LB MB NB OB PB QB"},D:{"1":"0 1 2 3 4 5 6 7 LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC YC"},F:{"1":"q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p fC gC hC iC 0B OC jC 1B"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"CSS Font Loading",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-size-adjust.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-size-adjust.js
    index b9f0e9fabe00a3..d72bd18f92f34e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-size-adjust.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-size-adjust.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O","194":"H","962":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z"},C:{"1":"xB 7B 8B PC","2":"OC","516":"0 1 2 3 b c d e f g h i j k l m r s t u v w x y z H","772":"4 5 6 7 8 9 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a QC RC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB","194":"8B","962":"0 1 2 3 QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B"},E:{"1":"2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC","772":"HC IC JC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB bC cC dC eC yB LC fC zB","194":"l m","962":"DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k"},G:{"1":"2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC","772":"HC IC JC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"194":"BC"},R:{"2":"KD"},S:{"2":"LD","516":"MD"}},B:2,C:"CSS font-size-adjust",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O","194":"5 6 7 D","962":"0 1 2 3 4 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z"},C:{"1":"6 7 D 9B AC BC","2":"RC","516":"0 1 2 3 4 5 b c d e f g h i j k l m n t u v w x y z","772":"8 9 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a SC TC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB","194":"7 9B AC BC","962":"0 1 2 3 4 5 6 TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},E:{"1":"4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC","772":"KC LC cC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB fC gC hC iC 0B OC jC 1B","194":"l m n","962":"GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k"},G:{"1":"4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC","772":"KC LC 5C"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"194":"EC"},R:{"2":"PD"},S:{"2":"QD","516":"RD"}},B:2,C:"CSS font-size-adjust",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-smooth.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-smooth.js
    index c340ccbebc7fa8..16f5973cc07074 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-smooth.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-smooth.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O","676":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"4 5 6 7 OC 3B I J D E F A B C K L G M N O n o p QC RC","804":"0 1 2 3 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"2":"I","676":"0 1 2 3 4 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"SC 9B","676":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"F B C bC cC dC eC yB LC fC zB","676":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"804":"LD MD"}},B:7,C:"CSS font-smooth",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O","676":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB SC TC","804":"0 1 2 3 4 5 6 7 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"2":"I","676":"0 1 2 3 4 5 6 7 8 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"UC CC","676":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"G B C fC gC hC iC 0B OC jC 1B","676":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"804":"QD RD"}},B:7,C:"CSS font-smooth",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-unicode-range.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-unicode-range.js
    index da4322094194c9..d4373bfb0c86d1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-unicode-range.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-unicode-range.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E NC","4":"F A B"},B:{"1":"0 1 2 3 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","4":"C K L G M"},C:{"1":"0 1 2 3 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB QC RC","194":"JB KB LB MB NB OB PB QB"},D:{"1":"0 1 2 3 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","4":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","4":"4 I J D E F SC 9B TC UC VC WC"},F:{"1":"6 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","4":"5 G M N O n o p"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","4":"E 9B gC MC hC iC jC kC lC mC"},H:{"2":"1C"},I:{"1":"H","4":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D","4":"A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"4":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","4":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"Font unicode-range subsetting",D:true};
    +module.exports={A:{A:{"2":"J E F QC","4":"G A B"},B:{"1":"0 1 2 3 4 5 6 7 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","4":"C K L H M"},C:{"1":"0 1 2 3 4 5 6 7 UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB SC TC","194":"MB NB OB PB QB RB SB TB"},D:{"1":"0 1 2 3 4 5 6 7 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","4":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","4":"8 I J E F G UC CC VC WC XC YC"},F:{"1":"r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","4":"9 H M N O o p q"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","4":"F CC kC PC lC mC nC oC pC qC"},H:{"2":"6C"},I:{"1":"D","4":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E","4":"A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"4":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","4":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"Font unicode-range subsetting",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-variant-alternates.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-variant-alternates.js
    index cf4de860f582a7..a1c1efa70bb2fa 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-variant-alternates.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-variant-alternates.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","130":"A B"},B:{"1":"0 1 2 3 y z H","130":"C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x"},C:{"1":"0 1 2 3 HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC","130":"4 5 6 I J D E F A B C K L G M N O n o p","322":"7 8 9 AB BB CB DB EB FB GB"},D:{"1":"0 1 2 3 y z H xB 7B 8B","2":"4 I J D E F A B C K L G","130":"5 6 7 8 9 M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x"},E:{"1":"A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"D E F SC 9B UC VC","130":"4 I J TC"},F:{"1":"h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","130":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g"},G:{"1":"mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B jC kC lC","130":"gC MC hC iC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC","130":"6C 7C"},J:{"2":"D","130":"A"},K:{"2":"A B C yB LC zB","130":"q"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"130":"0B"},P:{"1":"p","130":"I n o 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"130":"BC"},R:{"130":"KD"},S:{"1":"LD MD"}},B:5,C:"CSS font-variant-alternates",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","130":"A B"},B:{"1":"0 1 2 3 4 5 6 7 z D","130":"C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y"},C:{"1":"0 1 2 3 4 5 6 7 KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC","130":"8 9 I J E F G A B C K L H M N O o p q r","322":"AB BB CB DB EB FB GB HB IB JB"},D:{"1":"0 1 2 3 4 5 6 7 z D 9B AC BC","2":"8 I J E F G A B C K L H","130":"9 M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y"},E:{"1":"A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"E F G UC CC WC XC","130":"8 I J VC"},F:{"1":"h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","130":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g"},G:{"1":"qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC nC oC pC","130":"kC PC lC mC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC","130":"BD CD"},J:{"2":"E","130":"A"},K:{"2":"A B C 0B OC 1B","130":"s"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"130":"2B"},P:{"1":"q r","130":"I o p DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"130":"EC"},R:{"130":"PD"},S:{"1":"QD RD"}},B:5,C:"CSS font-variant-alternates",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-variant-numeric.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-variant-numeric.js
    index 2b7dcd0772907f..2545641bbc71d5 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-variant-numeric.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/font-variant-numeric.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB QC RC"},D:{"1":"0 1 2 3 ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB"},E:{"1":"A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC"},F:{"1":"MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB bC cC dC eC yB LC fC zB"},G:{"1":"mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D","16":"A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"CSS font-variant-numeric",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB"},E:{"1":"A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC"},F:{"1":"PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB fC gC hC iC 0B OC jC 1B"},G:{"1":"qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E","16":"A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"CSS font-variant-numeric",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/fontface.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/fontface.js
    index 61d5490aa02272..3b6a2e7622607d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/fontface.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/fontface.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","132":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","2":"OC 3B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m cC dC eC yB LC fC zB","2":"F bC"},G:{"1":"E MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","260":"9B gC"},H:{"2":"1C"},I:{"1":"I H 5C MC 6C 7C","2":"2C","4":"3B 3C 4C"},J:{"1":"A","4":"D"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"@font-face Web fonts",D:true};
    +module.exports={A:{A:{"1":"G A B","132":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","2":"RC 5B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n gC hC iC 0B OC jC 1B","2":"G fC"},G:{"1":"F PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","260":"CC kC"},H:{"2":"6C"},I:{"1":"I D AD PC BD CD","2":"7C","4":"5B 8C 9C"},J:{"1":"A","4":"E"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"@font-face Web fonts",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/form-attribute.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/form-attribute.js
    index bd5238ed2b2d01..a1ade9216b84f7 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/form-attribute.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/form-attribute.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F"},E:{"1":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B","16":"4"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","2":"F"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC"},H:{"1":"1C"},I:{"1":"3B I H 5C MC 6C 7C","2":"2C 3C 4C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Form attribute",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G"},E:{"1":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC","16":"8"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","2":"G"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC"},H:{"1":"6C"},I:{"1":"5B I D AD PC BD CD","2":"7C 8C 9C"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Form attribute",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/form-submit-attributes.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/form-submit-attributes.js
    index 19d45fd42b5030..cd1ec79e8dbc54 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/form-submit-attributes.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/form-submit-attributes.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 I J D E F A B C K L"},E:{"1":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m eC yB LC fC zB","2":"F bC","16":"cC dC"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC"},H:{"1":"1C"},I:{"1":"I H 5C MC 6C 7C","2":"2C 3C 4C","16":"3B"},J:{"1":"A","2":"D"},K:{"1":"B C q yB LC zB","16":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Attributes for form submission",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 I J E F G A B C K L"},E:{"1":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n iC 0B OC jC 1B","2":"G fC","16":"gC hC"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC"},H:{"1":"6C"},I:{"1":"I D AD PC BD CD","2":"7C 8C 9C","16":"5B"},J:{"1":"A","2":"E"},K:{"1":"B C s 0B OC 1B","16":"A"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Attributes for form submission",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/form-validation.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/form-validation.js
    index 7c367bb0d2d903..1bd2190b70e3af 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/form-validation.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/form-validation.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B","132":"4 J D E F A TC UC VC WC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m cC dC eC yB LC fC zB","2":"F bC"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B","132":"E gC MC hC iC jC kC lC mC nC"},H:{"516":"1C"},I:{"1":"H 7C","2":"3B 2C 3C 4C","132":"I 5C MC 6C"},J:{"1":"A","132":"D"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"260":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","132":"LD"}},B:1,C:"Form validation",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC","132":"8 J E F G A VC WC XC YC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n gC hC iC 0B OC jC 1B","2":"G fC"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC","132":"F kC PC lC mC nC oC pC qC rC"},H:{"516":"6C"},I:{"1":"D CD","2":"5B 7C 8C 9C","132":"I AD PC BD"},J:{"1":"A","132":"E"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"260":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","132":"QD"}},B:1,C:"Form validation",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/forms.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/forms.js
    index eb4bb8b72caa0a..308ef4aca7595f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/forms.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/forms.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"NC","4":"A B","8":"J D E F"},B:{"1":"0 1 2 3 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","4":"C K L G"},C:{"4":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","8":"OC 3B QC RC"},D:{"1":"0 1 2 3 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","4":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB"},E:{"4":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","8":"SC 9B"},F:{"1":"F B C ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","4":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB"},G:{"2":"9B","4":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC","4":"6C 7C"},J:{"2":"D","4":"A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"4":"xB"},N:{"4":"A B"},O:{"1":"0B"},P:{"1":"n o p BD CD AC DD ED FD GD HD 1B 2B ID JD","4":"I 8C 9C AD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"4":"LD MD"}},B:1,C:"HTML5 form features",D:false};
    +module.exports={A:{A:{"2":"QC","4":"A B","8":"J E F G"},B:{"1":"0 1 2 3 4 5 6 7 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","4":"C K L H"},C:{"4":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","8":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","4":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB"},E:{"4":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","8":"UC CC"},F:{"1":"G B C cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","4":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB"},G:{"2":"CC","4":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC","4":"BD CD"},J:{"2":"E","4":"A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"4":"D"},N:{"4":"A B"},O:{"1":"2B"},P:{"1":"o p q r GD HD DC ID JD KD LD MD 3B 4B ND OD","4":"I DD ED FD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"4":"QD RD"}},B:1,C:"HTML5 form features",D:false};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/fullscreen.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/fullscreen.js
    index dd3cb1708bff1d..b5ed91cd4d64d7 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/fullscreen.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/fullscreen.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A NC","548":"B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","516":"C K L G M N O"},C:{"1":"0 1 2 3 jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F QC RC","676":"5 6 7 8 9 A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB","1700":"UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB"},D:{"1":"0 1 2 3 qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A B C K L","676":"5 G M N O","804":"6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB"},E:{"1":"HC IC JC 2B KC aC","2":"4 I SC 9B","548":"DC 0B ZC 1B EC FC GC","676":"TC","804":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC"},F:{"1":"jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"F B C bC cC dC eC yB LC fC","804":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC","2052":"rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D","292":"A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A","548":"B"},O:{"1":"0B"},P:{"1":"n o p AC DD ED FD GD HD 1B 2B ID JD","804":"I 8C 9C AD BD CD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Full Screen API",D:true};
    +module.exports={A:{A:{"2":"J E F G A QC","548":"B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","516":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G SC TC","676":"9 A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB","1700":"XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB"},D:{"1":"0 1 2 3 4 5 6 7 tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A B C K L","676":"9 H M N O","804":"o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB"},E:{"1":"KC LC cC 4B MC NC dC eC","2":"8 I UC CC","548":"GC 2B bC 3B HC IC JC","676":"VC","804":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC"},F:{"1":"mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"G B C fC gC hC iC 0B OC jC","804":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB"},G:{"1":"NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC","2052":"vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E","292":"A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A","548":"B"},O:{"1":"2B"},P:{"1":"o p q r DC ID JD KD LD MD 3B 4B ND OD","804":"I DD ED FD GD HD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Full Screen API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/gamepad.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/gamepad.js
    index ce5b950b962dc0..a6fbb2391504eb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/gamepad.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/gamepad.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB QC RC"},D:{"1":"0 1 2 3 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 I J D E F A B C K L G M N O n","33":"6 7 o p"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC"},F:{"1":"7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 F B C G M N O n o p bC cC dC eC yB LC fC zB"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:5,C:"Gamepad API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o","33":"p q r AB"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC"},F:{"1":"AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r fC gC hC iC 0B OC jC 1B"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:5,C:"Gamepad API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/geolocation.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/geolocation.js
    index 9f49543972a740..b07c489cdcdc12 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/geolocation.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/geolocation.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"NC","8":"J D E"},B:{"1":"C K L G M N O","129":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB QC RC","8":"OC 3B","129":"0 1 2 3 cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"4 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB","4":"I","129":"0 1 2 3 XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 J D E F B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","8":"I SC 9B","129":"A"},F:{"1":"5 6 7 8 9 B C M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB eC yB LC fC zB","2":"F G bC","8":"cC dC","129":"MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"1":"E 9B gC MC hC iC jC kC lC mC","129":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"3B I 2C 3C 4C 5C MC 6C 7C","129":"H"},J:{"1":"D A"},K:{"1":"B C yB LC zB","8":"A","129":"q"},L:{"129":"H"},M:{"129":"xB"},N:{"1":"A B"},O:{"129":"0B"},P:{"1":"I","129":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"129":"BC"},R:{"129":"KD"},S:{"1":"LD","129":"MD"}},B:2,C:"Geolocation",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"QC","8":"J E F"},B:{"1":"C K L H M N O","129":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB SC TC","8":"RC 5B","129":"0 1 2 3 4 5 6 7 fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"1":"8 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB","4":"I","129":"0 1 2 3 4 5 6 7 aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 J E F G B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","8":"I UC CC","129":"A"},F:{"1":"9 B C M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB iC 0B OC jC 1B","2":"G H fC","8":"gC hC","129":"PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"1":"F CC kC PC lC mC nC oC pC qC","129":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"5B I 7C 8C 9C AD PC BD CD","129":"D"},J:{"1":"E A"},K:{"1":"B C 0B OC 1B","8":"A","129":"s"},L:{"129":"D"},M:{"129":"D"},N:{"1":"A B"},O:{"129":"2B"},P:{"1":"I","129":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"129":"EC"},R:{"129":"PD"},S:{"1":"QD","129":"RD"}},B:2,C:"Geolocation",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/getboundingclientrect.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/getboundingclientrect.js
    index 6d5b7eb4affe20..6a5d562d0bfd2c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/getboundingclientrect.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/getboundingclientrect.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"644":"J D NC","2049":"F A B","2692":"E"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2049":"C K L G M N O"},C:{"1":"0 1 2 3 5 6 7 8 9 C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC","260":"4 I J D E F A B","1156":"3B","1284":"QC","1796":"RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m eC yB LC fC zB","16":"F bC","132":"cC dC"},G:{"1":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B"},H:{"1":"1C"},I:{"1":"3B I H 4C 5C MC 6C 7C","16":"2C 3C"},J:{"1":"D A"},K:{"1":"B C q yB LC zB","132":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"2049":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"Element.getBoundingClientRect()",D:true};
    +module.exports={A:{A:{"644":"J E QC","2049":"G A B","2692":"F"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2049":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 9 C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC","260":"8 I J E F G A B","1156":"5B","1284":"SC","1796":"TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n iC 0B OC jC 1B","16":"G fC","132":"gC hC"},G:{"1":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC"},H:{"1":"6C"},I:{"1":"5B I D 9C AD PC BD CD","16":"7C 8C"},J:{"1":"E A"},K:{"1":"B C s 0B OC 1B","132":"A"},L:{"1":"D"},M:{"1":"D"},N:{"2049":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"Element.getBoundingClientRect()",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/getcomputedstyle.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/getcomputedstyle.js
    index b221a7e6931201..d16c4525af570c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/getcomputedstyle.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/getcomputedstyle.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC","132":"3B QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","260":"4 I J D E F A"},E:{"1":"4 J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","260":"I SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m eC yB LC fC zB","260":"F bC cC dC"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","260":"9B gC MC"},H:{"260":"1C"},I:{"1":"I H 5C MC 6C 7C","260":"3B 2C 3C 4C"},J:{"1":"A","260":"D"},K:{"1":"B C q yB LC zB","260":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"getComputedStyle",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC","132":"5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","260":"8 I J E F G A"},E:{"1":"8 J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","260":"I UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n iC 0B OC jC 1B","260":"G fC gC hC"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","260":"CC kC PC"},H:{"260":"6C"},I:{"1":"I D AD PC BD CD","260":"5B 7C 8C 9C"},J:{"1":"A","260":"E"},K:{"1":"B C s 0B OC 1B","260":"A"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"getComputedStyle",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/getelementsbyclassname.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/getelementsbyclassname.js
    index 1354ceda914c46..75b00c5006f3f4 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/getelementsbyclassname.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/getelementsbyclassname.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"NC","8":"J D E"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","8":"OC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","2":"F"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"getElementsByClassName",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"QC","8":"J E F"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","8":"RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","2":"G"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"getElementsByClassName",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/getrandomvalues.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/getrandomvalues.js
    index c506550df48a48..fec93f9cb9badb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/getrandomvalues.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/getrandomvalues.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A NC","33":"B"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 6 7 8 9 o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 OC 3B I J D E F A B C K L G M N O n QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A"},E:{"1":"D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J SC 9B TC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"1":"A","2":"D"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A","33":"B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"crypto.getRandomValues()",D:true};
    +module.exports={A:{A:{"2":"J E F G A QC","33":"B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A"},E:{"1":"E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J UC CC VC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"1":"A","2":"E"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A","33":"B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"crypto.getRandomValues()",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/gyroscope.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/gyroscope.js
    index 42e5ec0b83ff2e..f3ab3779fa4fc0 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/gyroscope.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/gyroscope.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB","194":"fB 4B gB 5B hB iB jB kB lB"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:4,C:"Gyroscope",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB","194":"iB 6B jB 7B kB lB mB nB oB"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:4,C:"Gyroscope",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/hardwareconcurrency.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/hardwareconcurrency.js
    index 0b5a73adb4bea0..ef595ff36a1905 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/hardwareconcurrency.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/hardwareconcurrency.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L"},C:{"1":"0 1 2 3 VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB QC RC"},D:{"1":"0 1 2 3 KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB"},E:{"2":"4 I J D SC 9B TC UC VC","129":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","194":"E F A WC"},F:{"1":"7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 F B C G M N O n o p bC cC dC eC yB LC fC zB"},G:{"2":"9B gC MC hC iC jC","129":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","194":"E kC lC mC nC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"navigator.hardwareConcurrency",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L"},C:{"1":"0 1 2 3 4 5 6 7 YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB"},E:{"2":"8 I J E UC CC VC WC XC","129":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","194":"F G A YC"},F:{"1":"AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r fC gC hC iC 0B OC jC 1B"},G:{"2":"CC kC PC lC mC nC","129":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","194":"F oC pC qC rC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"navigator.hardwareConcurrency",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/hashchange.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/hashchange.js
    index 0718e79852c0bb..5c9777761ef2e3 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/hashchange.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/hashchange.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"E F A B","8":"J D NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC RC","8":"OC 3B QC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","8":"I"},E:{"1":"4 J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","8":"I SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m eC yB LC fC zB","8":"F bC cC dC"},G:{"1":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B"},H:{"2":"1C"},I:{"1":"3B I H 3C 4C 5C MC 6C 7C","2":"2C"},J:{"1":"D A"},K:{"1":"B C q yB LC zB","8":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Hashchange event",D:true};
    +module.exports={A:{A:{"1":"F G A B","8":"J E QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC TC","8":"RC 5B SC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","8":"I"},E:{"1":"8 J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","8":"I UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n iC 0B OC jC 1B","8":"G fC gC hC"},G:{"1":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC"},H:{"2":"6C"},I:{"1":"5B I D 8C 9C AD PC BD CD","2":"7C"},J:{"1":"E A"},K:{"1":"B C s 0B OC 1B","8":"A"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Hashchange event",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/heif.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/heif.js
    index 4785315bd10f35..eab38bff07c0ab 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/heif.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/heif.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC AC","130":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC JC","130":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:6,C:"HEIF/HEIC image format",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC DC","130":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC 5C","130":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:6,C:"HEIF/HEIC image format",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/hevc.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/hevc.js
    index 60ce8a0ce71fc3..0a3c400ee7ffb1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/hevc.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/hevc.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A NC","132":"B"},B:{"132":"C K L G M N O","1028":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t","2052":"0 1 2 3 u v w x y z H xB 7B 8B"},E:{"1":"K L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC AC","516":"B C yB zB"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c bC cC dC eC yB LC fC zB","2052":"d e f g h i j k l m"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC 6C 7C","2052":"H"},J:{"2":"D A"},K:{"2":"A B C yB LC zB","258":"q"},L:{"2052":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"o p","2":"I","258":"n 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:6,C:"HEVC/H.265 video format",D:true};
    +module.exports={A:{A:{"2":"J E F G A QC","132":"B"},B:{"132":"C K L H M N O","1028":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D SC TC","4162":"7 9B AC BC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u","2052":"0 1 2 3 4 5 6 7 v w x y z D 9B AC BC"},E:{"1":"K L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC DC","516":"B C 0B 1B"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c fC gC hC iC 0B OC jC 1B","2052":"d e f g h i j k l m n"},G:{"1":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC BD CD","2052":"D"},J:{"2":"E A"},K:{"2":"A B C 0B OC 1B","258":"s"},L:{"2052":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"p q r","2":"I","258":"o DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:6,C:"HEVC/H.265 video format",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/hidden.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/hidden.js
    index 5f9a7be724453e..34c6f04a68138f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/hidden.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/hidden.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"B","2":"J D E F A NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I"},E:{"1":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m yB LC fC zB","2":"F B bC cC dC eC"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC"},H:{"1":"1C"},I:{"1":"I H 5C MC 6C 7C","2":"3B 2C 3C 4C"},J:{"1":"A","2":"D"},K:{"1":"C q yB LC zB","2":"A B"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","2":"A"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"hidden attribute",D:true};
    +module.exports={A:{A:{"1":"B","2":"J E F G A QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I"},E:{"1":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 0B OC jC 1B","2":"G B fC gC hC iC"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC"},H:{"1":"6C"},I:{"1":"I D AD PC BD CD","2":"5B 7C 8C 9C"},J:{"1":"A","2":"E"},K:{"1":"C s 0B OC 1B","2":"A B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","2":"A"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"hidden attribute",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/high-resolution-time.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/high-resolution-time.js
    index 3a59f56edc1af1..5a90a0f457e2fe 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/high-resolution-time.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/high-resolution-time.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB","2":"4 OC 3B I J D E F A B C K L QC RC","129":"cB dB eB","769":"fB 4B","1281":"0 1 2 3 gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"0 1 2 3 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 I J D E F A B C K L G M N O","33":"6 n o p"},E:{"1":"E F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D SC 9B TC UC VC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC jC kC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"1":"A","2":"D"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"High Resolution Time API",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB","2":"8 RC 5B I J E F G A B C K L SC TC","129":"fB gB hB","769":"iB 6B","1281":"0 1 2 3 4 5 6 7 jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"1":"0 1 2 3 4 5 6 7 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O","33":"o p q r"},E:{"1":"F G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E UC CC VC WC XC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC nC oC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"1":"A","2":"E"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"High Resolution Time API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/history.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/history.js
    index 37e4d26ba39805..8fff881ddb7678 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/history.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/history.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"I"},E:{"1":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B","4":"4 TC"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m LC fC zB","2":"F B bC cC dC eC yB"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC","4":"MC"},H:{"2":"1C"},I:{"1":"H 3C 4C MC 6C 7C","2":"3B I 2C 5C"},J:{"1":"D A"},K:{"1":"C q yB LC zB","2":"A B"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Session history management",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"I"},E:{"1":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC","4":"8 VC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n OC jC 1B","2":"G B fC gC hC iC 0B"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC","4":"PC"},H:{"2":"6C"},I:{"1":"D 8C 9C PC BD CD","2":"5B I 7C AD"},J:{"1":"E A"},K:{"1":"C s 0B OC 1B","2":"A B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Session history management",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/html-media-capture.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/html-media-capture.js
    index f84277c96a6ac5..41cf24e24af894 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/html-media-capture.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/html-media-capture.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"9B gC MC hC","129":"E iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"3B I H 5C MC 6C 7C","2":"2C","257":"3C 4C"},J:{"1":"A","16":"D"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"516":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"16":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:2,C:"HTML Media Capture",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"CC kC PC lC","129":"F mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"5B I D AD PC BD CD","2":"7C","257":"8C 9C"},J:{"1":"A","16":"E"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"516":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"16":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:2,C:"HTML Media Capture",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/html5semantic.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/html5semantic.js
    index a46065649ad038..f02de0dab87f76 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/html5semantic.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/html5semantic.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"NC","8":"J D E","260":"F A B"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 6 7 8 9 o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC","132":"3B QC RC","260":"4 5 I J D E F A B C K L G M N O n"},D:{"1":"0 1 2 3 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","132":"4 I","260":"5 6 7 8 J D E F A B C K L G M N O n o p"},E:{"1":"D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","132":"I SC 9B","260":"4 J TC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","132":"F B bC cC dC eC","260":"C yB LC fC zB"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","132":"9B","260":"gC MC hC iC"},H:{"132":"1C"},I:{"1":"H 6C 7C","132":"2C","260":"3B I 3C 4C 5C MC"},J:{"260":"D A"},K:{"1":"q","132":"A","260":"B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"260":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"HTML5 semantic elements",D:true};
    +module.exports={A:{A:{"2":"QC","8":"J E F","260":"G A B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC","132":"5B SC TC","260":"8 9 I J E F G A B C K L H M N O o"},D:{"1":"0 1 2 3 4 5 6 7 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","132":"8 I","260":"9 J E F G A B C K L H M N O o p q r AB BB"},E:{"1":"E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","132":"I UC CC","260":"8 J VC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","132":"G B fC gC hC iC","260":"C 0B OC jC 1B"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","132":"CC","260":"kC PC lC mC"},H:{"132":"6C"},I:{"1":"D BD CD","132":"7C","260":"5B I 8C 9C AD PC"},J:{"260":"E A"},K:{"1":"s","132":"A","260":"B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"260":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"HTML5 semantic elements",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/http-live-streaming.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/http-live-streaming.js
    index 617a41d53b4e1e..fea63a9d5eb89e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/http-live-streaming.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/http-live-streaming.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"C K L G M N O","2":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"3B I H 5C MC 6C 7C","2":"2C 3C 4C"},J:{"1":"A","2":"D"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:7,C:"HTTP Live Streaming (HLS)",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"C K L H M N O","2":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"5B I D AD PC BD CD","2":"7C 8C 9C"},J:{"1":"A","2":"E"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:7,C:"HTTP Live Streaming (HLS)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/http2.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/http2.js
    index e9235ba51b3f04..42ce338b96f35c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/http2.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/http2.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A NC","132":"B"},B:{"1":"C K L G M N O","513":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB QC RC","513":"0 1 2 3 aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"OB PB QB RB SB TB UB VB WB XB","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB","513":"0 1 2 3 YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E SC 9B TC UC VC","260":"F A WC AC"},F:{"1":"BB CB DB EB FB GB HB IB JB KB","2":"5 6 7 8 9 F B C G M N O n o p AB bC cC dC eC yB LC fC zB","513":"LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC 6C 7C","513":"H"},J:{"2":"D A"},K:{"2":"A B C yB LC zB","513":"q"},L:{"513":"H"},M:{"513":"xB"},N:{"2":"A B"},O:{"513":"0B"},P:{"1":"I","513":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"513":"BC"},R:{"513":"KD"},S:{"1":"LD","513":"MD"}},B:6,C:"HTTP/2 protocol",D:true};
    +module.exports={A:{A:{"2":"J E F G A QC","132":"B"},B:{"1":"C K L H M N O","513":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB SC TC","513":"0 1 2 3 4 5 6 7 dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"1":"RB SB TB UB VB WB XB YB ZB aB","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB","513":"0 1 2 3 4 5 6 7 bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F UC CC VC WC XC","260":"G A YC DC"},F:{"1":"EB FB GB HB IB JB KB LB MB NB","2":"9 G B C H M N O o p q r AB BB CB DB fC gC hC iC 0B OC jC 1B","513":"OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC BD CD","513":"D"},J:{"2":"E A"},K:{"2":"A B C 0B OC 1B","513":"s"},L:{"513":"D"},M:{"513":"D"},N:{"2":"A B"},O:{"513":"2B"},P:{"1":"I","513":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"513":"EC"},R:{"513":"PD"},S:{"1":"QD","513":"RD"}},B:6,C:"HTTP/2 protocol",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/http3.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/http3.js
    index e3d620e64885ee..97029623a024de 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/http3.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/http3.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O","322":"P Q R S T","578":"U V"},C:{"1":"0 1 2 3 X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB QC RC","194":"rB q sB tB uB vB wB P Q R 6B S T U V W"},D:{"1":"0 1 2 3 W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB","322":"P Q R S T","578":"U V"},E:{"2":"4 I J D E F A B C K SC 9B TC UC VC WC AC yB zB BC","2052":"HC IC JC 2B KC aC","2116":"1B EC FC GC","3140":"L G XC YC CC DC 0B ZC"},F:{"1":"sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB bC cC dC eC yB LC fC zB","578":"q"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC","2052":"HC IC JC 2B KC","2116":"xC yC zC CC DC 0B 0C 1B EC FC GC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD AC DD ED FD"},Q:{"2":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:6,C:"HTTP/3 protocol",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O","322":"P Q R S T","578":"U V"},C:{"1":"0 1 2 3 4 5 6 7 X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB SC TC","194":"uB s vB wB xB yB zB P Q R 8B S T U V W"},D:{"1":"0 1 2 3 4 5 6 7 W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB","322":"P Q R S T","578":"U V"},E:{"2":"8 I J E F G A B C K UC CC VC WC XC YC DC 0B 1B EC","2052":"KC LC cC 4B MC NC dC eC","2116":"3B HC IC JC","3140":"L H ZC aC FC GC 2B bC"},F:{"1":"vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB fC gC hC iC 0B OC jC 1B","578":"s"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C","2052":"KC LC 5C 4B MC NC","2116":"1C 2C 3C FC GC 2B 4C 3B HC IC JC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r LD MD 3B 4B ND OD","2":"I DD ED FD GD HD DC ID JD KD"},Q:{"2":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:6,C:"HTTP/3 protocol",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/iframe-sandbox.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/iframe-sandbox.js
    index 94248129c3c0d3..6bc1be0238c1e8 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/iframe-sandbox.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/iframe-sandbox.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K L G M QC RC","4":"5 6 7 8 9 N O n o p AB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC"},H:{"2":"1C"},I:{"1":"3B I H 3C 4C 5C MC 6C 7C","2":"2C"},J:{"1":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"sandbox attribute for iframes",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K L H M SC TC","4":"9 N O o p q r AB BB CB DB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC"},H:{"2":"6C"},I:{"1":"5B I D 8C 9C AD PC BD CD","2":"7C"},J:{"1":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"sandbox attribute for iframes",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/iframe-seamless.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/iframe-seamless.js
    index 0ebf7a080e27d5..e8349dc5385b83 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/iframe-seamless.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/iframe-seamless.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 I J D E F A B C K L G M N O AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","66":"6 7 8 9 n o p"},E:{"2":"4 I J E F A B C K L G SC 9B TC UC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","130":"D VC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","130":"jC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:7,C:"seamless attribute for iframes",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","66":"o p q r AB BB CB"},E:{"2":"8 I J F G A B C K L H UC CC VC WC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","130":"E XC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","130":"nC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:7,C:"seamless attribute for iframes",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/iframe-srcdoc.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/iframe-srcdoc.js
    index 7483d6e2d2297a..c3dbd54a348ecb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/iframe-srcdoc.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/iframe-srcdoc.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"NC","8":"J D E F A B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","8":"C K L G M N O"},C:{"1":"0 1 2 3 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC","8":"4 5 6 7 3B I J D E F A B C K L G M N O n o p QC RC"},D:{"1":"0 1 2 3 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A B C K","8":"5 L G M N O"},E:{"1":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC 9B","8":"4 I TC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B bC cC dC eC","8":"C yB LC fC zB"},G:{"1":"E iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B","8":"gC MC hC"},H:{"2":"1C"},I:{"1":"H 6C 7C","8":"3B I 2C 3C 4C 5C MC"},J:{"1":"A","8":"D"},K:{"1":"q","2":"A B","8":"C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"8":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"srcdoc attribute for iframes",D:true};
    +module.exports={A:{A:{"2":"QC","8":"J E F G A B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","8":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC","8":"8 9 5B I J E F G A B C K L H M N O o p q r AB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A B C K","8":"9 L H M N O"},E:{"1":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC CC","8":"8 I VC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B fC gC hC iC","8":"C 0B OC jC 1B"},G:{"1":"F mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC","8":"kC PC lC"},H:{"2":"6C"},I:{"1":"D BD CD","8":"5B I 7C 8C 9C AD PC"},J:{"1":"A","8":"E"},K:{"1":"s","2":"A B","8":"C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"8":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"srcdoc attribute for iframes",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/imagecapture.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/imagecapture.js
    index 72b8ac52cd8217..3e6fb5f8365791 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/imagecapture.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/imagecapture.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB QC RC","194":"0 1 2 3 IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"0 1 2 3 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB","322":"aB bB cB dB eB fB"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB bC cC dC eC yB LC fC zB","322":"NB OB PB QB RB SB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"194":"LD MD"}},B:5,C:"ImageCapture API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB SC TC","194":"0 1 2 3 4 5 6 7 LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"1":"0 1 2 3 4 5 6 7 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB","322":"dB eB fB gB hB iB"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB fC gC hC iC 0B OC jC 1B","322":"QB RB SB TB UB VB"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"194":"QD RD"}},B:5,C:"ImageCapture API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ime.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ime.js
    index 6050e512b9c426..0ec28327ae246b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ime.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ime.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A NC","161":"B"},B:{"2":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","161":"C K L G M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A","161":"B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:7,C:"Input Method Editor API",D:true};
    +module.exports={A:{A:{"2":"J E F G A QC","161":"B"},B:{"2":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","161":"C K L H M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A","161":"B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:7,C:"Input Method Editor API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/img-naturalwidth-naturalheight.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/img-naturalwidth-naturalheight.js
    index 0d6c5575d32eca..6b1cab61c54842 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/img-naturalwidth-naturalheight.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/img-naturalwidth-naturalheight.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"naturalWidth & naturalHeight image properties",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"naturalWidth & naturalHeight image properties",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/import-maps.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/import-maps.js
    index 50108c29e2bba5..608df2e2fb52c8 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/import-maps.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/import-maps.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O","194":"P Q R S T U V W X"},C:{"1":"0 1 2 3 v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k QC RC","322":"l m r s t u"},D:{"1":"0 1 2 3 Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q","194":"sB tB uB vB wB P Q R S T U V W X"},E:{"1":"HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC"},F:{"1":"uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB bC cC dC eC yB LC fC zB","194":"hB iB jB kB lB mB nB oB pB qB rB q sB tB"},G:{"1":"HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p HD 1B 2B ID JD","2":"I 8C 9C AD BD CD AC DD ED FD GD"},Q:{"2":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:7,C:"Import maps",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O","194":"P Q R S T U V W X"},C:{"1":"0 1 2 3 4 5 6 7 w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k SC TC","322":"l m n t u v"},D:{"1":"0 1 2 3 4 5 6 7 Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s","194":"vB wB xB yB zB P Q R S T U V W X"},E:{"1":"KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC"},F:{"1":"xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB fC gC hC iC 0B OC jC 1B","194":"kB lB mB nB oB pB qB rB sB tB uB s vB wB"},G:{"1":"KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r MD 3B 4B ND OD","2":"I DD ED FD GD HD DC ID JD KD LD"},Q:{"2":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:7,C:"Import maps",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/imports.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/imports.js
    index 80d4bf84c01079..c3383f4339806e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/imports.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/imports.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","8":"A B"},B:{"1":"P","2":"0 1 2 3 Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","8":"C K L G M N O"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB QC RC","8":"0 1 2 3 DB EB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","72":"FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB"},D:{"1":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P","2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","66":"DB EB FB GB HB","72":"IB"},E:{"2":"4 I SC 9B TC","8":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"6 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB","2":"F B C G M mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","66":"5 N O n o","72":"p"},G:{"2":"9B gC MC hC iC","8":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"8":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I 8C 9C AD BD CD AC DD ED","2":"n o p FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"2":"KD"},S:{"1":"LD","8":"MD"}},B:5,C:"HTML Imports",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","8":"A B"},B:{"1":"P","2":"0 1 2 3 4 5 6 7 Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","8":"C K L H M N O"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB SC TC","8":"0 1 2 3 4 5 6 7 GB HB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","72":"IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB"},D:{"1":"MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P","2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","66":"GB HB IB JB KB","72":"LB"},E:{"2":"8 I UC CC VC","8":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB","2":"G B C H M pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","66":"9 N O o p","72":"q"},G:{"2":"CC kC PC lC mC","8":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"8":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I DD ED FD GD HD DC ID JD","2":"o p q r KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"2":"PD"},S:{"1":"QD","8":"RD"}},B:5,C:"HTML Imports",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/indeterminate-checkbox.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/indeterminate-checkbox.js
    index 9b2f442b1275d6..5398cb67c59436 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/indeterminate-checkbox.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/indeterminate-checkbox.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"J D E F A B","16":"NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC RC","2":"OC 3B","16":"QC"},D:{"1":"0 1 2 3 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB"},E:{"1":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m fC zB","2":"F B bC cC dC eC yB LC"},G:{"1":"sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"indeterminate checkbox",D:true};
    +module.exports={A:{A:{"1":"J E F G A B","16":"QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC TC","2":"RC 5B","16":"SC"},D:{"1":"0 1 2 3 4 5 6 7 EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB"},E:{"1":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n jC 1B","2":"G B fC gC hC iC 0B OC"},G:{"1":"wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"indeterminate checkbox",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/indexeddb.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/indexeddb.js
    index b2acbef49f25f9..c6452f815a8dfa 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/indexeddb.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/indexeddb.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","132":"A B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","132":"C K L G M N O"},C:{"1":"0 1 2 3 5 6 7 8 9 M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC","33":"A B C K L G","36":"4 I J D E F"},D:{"1":"0 1 2 3 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"A","8":"4 I J D E F","33":"6","36":"5 B C K L G M N O n o p"},E:{"1":"A B C K L G AC yB zB BC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","8":"4 I J D SC 9B TC UC","260":"E F VC WC","516":"XC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F bC cC","8":"B C dC eC yB LC fC zB"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","8":"9B gC MC hC iC jC","260":"E kC lC mC","516":"yC"},H:{"2":"1C"},I:{"1":"H 6C 7C","8":"3B I 2C 3C 4C 5C MC"},J:{"1":"A","8":"D"},K:{"1":"q","2":"A","8":"B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"132":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"IndexedDB",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","132":"A B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","132":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 9 M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC","33":"A B C K L H","36":"8 I J E F G"},D:{"1":"0 1 2 3 4 5 6 7 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"A","8":"8 I J E F G","33":"r","36":"9 B C K L H M N O o p q"},E:{"1":"A B C K L H DC 0B 1B EC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","8":"8 I J E UC CC VC WC","260":"F G XC YC","516":"ZC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G fC gC","8":"B C hC iC 0B OC jC 1B"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","8":"CC kC PC lC mC nC","260":"F oC pC qC","516":"2C"},H:{"2":"6C"},I:{"1":"D BD CD","8":"5B I 7C 8C 9C AD PC"},J:{"1":"A","8":"E"},K:{"1":"s","2":"A","8":"B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"132":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"IndexedDB",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/indexeddb2.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/indexeddb2.js
    index e97971f1d94204..3493d8df738342 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/indexeddb2.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/indexeddb2.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB QC RC","132":"RB SB TB","260":"UB VB WB XB"},D:{"1":"0 1 2 3 fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB","132":"VB WB XB YB","260":"ZB aB bB cB dB eB"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC"},F:{"1":"SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB bC cC dC eC yB LC fC zB","132":"IB JB KB LB","260":"MB NB OB PB QB RB"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC","16":"nC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I","260":"8C 9C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","260":"LD"}},B:2,C:"IndexedDB 2.0",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB SC TC","132":"UB VB WB","260":"XB YB ZB aB"},D:{"1":"0 1 2 3 4 5 6 7 iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB","132":"YB ZB aB bB","260":"cB dB eB fB gB hB"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC"},F:{"1":"VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB fC gC hC iC 0B OC jC 1B","132":"LB MB NB OB","260":"PB QB RB SB TB UB"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC","16":"rC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I","260":"DD ED"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","260":"QD"}},B:2,C:"IndexedDB 2.0",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/inline-block.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/inline-block.js
    index c9e8c6161a12bd..db04ef668a8674 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/inline-block.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/inline-block.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"E F A B","4":"NC","132":"J D"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","36":"OC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"CSS inline-block",D:true};
    +module.exports={A:{A:{"1":"F G A B","4":"QC","132":"J E"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","36":"RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"CSS inline-block",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/innertext.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/innertext.js
    index bb71e9ebaef158..de2914a9004f2b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/innertext.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/innertext.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"J D E F A B","16":"NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"SC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","16":"F"},G:{"1":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B"},H:{"1":"1C"},I:{"1":"3B I H 4C 5C MC 6C 7C","16":"2C 3C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"HTMLElement.innerText",D:true};
    +module.exports={A:{A:{"1":"J E F G A B","16":"QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"UC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","16":"G"},G:{"1":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC"},H:{"1":"6C"},I:{"1":"5B I D 9C AD PC BD CD","16":"7C 8C"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"HTMLElement.innerText",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-autocomplete-onoff.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-autocomplete-onoff.js
    index 5cd1ace1e7ca8d..9cad655d9daa88 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-autocomplete-onoff.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-autocomplete-onoff.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"J D E F A NC","132":"B"},B:{"132":"C K L G M N O","260":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB QC RC","516":"0 1 2 3 DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"5 6 7 8 9 N O n o p","2":"4 I J D E F A B C K L G M","132":"AB BB CB DB EB FB GB HB IB JB KB LB MB NB","260":"0 1 2 3 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"J TC UC","2":"4 I SC 9B","2052":"D E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"9B gC MC","1025":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1025":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2052":"A B"},O:{"1025":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"260":"BC"},R:{"1":"KD"},S:{"516":"LD MD"}},B:1,C:"autocomplete attribute: on & off values",D:true};
    +module.exports={A:{A:{"1":"J E F G A QC","132":"B"},B:{"132":"C K L H M N O","260":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB SC TC","516":"0 1 2 3 4 5 6 7 GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"1":"9 N O o p q r AB BB CB","2":"8 I J E F G A B C K L H M","132":"DB EB FB GB HB IB JB KB LB MB NB OB PB QB","260":"0 1 2 3 4 5 6 7 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"J VC WC","2":"8 I UC CC","2052":"E F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"CC kC PC","1025":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1025":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2052":"A B"},O:{"1025":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"260":"EC"},R:{"1":"PD"},S:{"516":"QD RD"}},B:1,C:"autocomplete attribute: on & off values",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-color.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-color.js
    index 40a5931fa3e3ee..70f844488251d9 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-color.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-color.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K"},C:{"1":"0 1 2 3 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB QC RC"},D:{"1":"0 1 2 3 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 I J D E F A B C K L G M N O"},E:{"1":"K L G zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C SC 9B TC UC VC WC AC yB"},F:{"1":"5 6 7 8 9 B C N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m yB LC fC zB","2":"F G M bC cC dC eC"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC","129":"sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:1,C:"Color input type",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K"},C:{"1":"0 1 2 3 4 5 6 7 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O"},E:{"1":"K L H 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C UC CC VC WC XC YC DC 0B"},F:{"1":"9 B C N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 0B OC jC 1B","2":"G H M fC gC hC iC"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC","129":"wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:1,C:"Color input type",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-datetime.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-datetime.js
    index e52335449b97ca..06fa0217266e72 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-datetime.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-datetime.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","132":"C"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB QC RC","1090":"aB bB cB dB","2052":"eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b","4100":"0 1 2 3 c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"0 1 2 3 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 I J D E F A B C K L G M N O","2052":"6 7 n o p"},E:{"2":"4 I J D E F A B C K L SC 9B TC UC VC WC AC yB zB BC","4100":"G XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"9B gC MC","260":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B 2C 3C 4C","514":"I 5C MC"},J:{"1":"A","2":"D"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"4100":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2052":"LD MD"}},B:1,C:"Date and time input types",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","132":"C"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB SC TC","1090":"dB eB fB gB","2052":"hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b","4100":"0 1 2 3 4 5 6 7 c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"1":"0 1 2 3 4 5 6 7 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O","2052":"o p q r AB"},E:{"2":"8 I J E F G A B C K L UC CC VC WC XC YC DC 0B 1B EC","4100":"H ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"CC kC PC","260":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B 7C 8C 9C","514":"I AD PC"},J:{"1":"A","2":"E"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"4100":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2052":"QD RD"}},B:1,C:"Date and time input types",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-email-tel-url.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-email-tel-url.js
    index 90bdf1abf4e24f..b04f770c587c6a 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-email-tel-url.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-email-tel-url.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"I"},E:{"1":"4 J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","2":"F"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"3B I H 5C MC 6C 7C","132":"2C 3C 4C"},J:{"1":"A","132":"D"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Email, telephone & URL input types",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"I"},E:{"1":"8 J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","2":"G"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"5B I D AD PC BD CD","132":"7C 8C 9C"},J:{"1":"A","132":"E"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Email, telephone & URL input types",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-event.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-event.js
    index 4b73fc44ae2be4..48254ef30ef452 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-event.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-event.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E NC","2561":"A B","2692":"F"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2561":"C K L G M N O"},C:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","16":"OC","1537":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB RC","1796":"3B QC"},D:{"1":"0 1 2 3 lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 I J D E F A B C K L","1025":"IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB","1537":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB"},E:{"1":"L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"4 I J SC 9B","1025":"D E F A B C UC VC WC AC yB","1537":"TC","4097":"K zB"},F:{"1":"ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","16":"F B C bC cC dC eC yB LC","260":"fC","1025":"6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB","1537":"5 G M N O n o"},G:{"1":"uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC MC","1025":"E kC lC mC nC oC pC qC rC","1537":"hC iC jC","4097":"sC tC"},H:{"2":"1C"},I:{"16":"2C 3C","1025":"H 7C","1537":"3B I 4C 5C MC 6C"},J:{"1025":"A","1537":"D"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2561":"A B"},O:{"1":"0B"},P:{"1025":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","1537":"LD"}},B:1,C:"input event",D:true};
    +module.exports={A:{A:{"2":"J E F QC","2561":"A B","2692":"G"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2561":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"RC","1537":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB TC","1796":"5B SC"},D:{"1":"0 1 2 3 4 5 6 7 oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 I J E F G A B C K L","1025":"LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB","1537":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB"},E:{"1":"L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"8 I J UC CC","1025":"E F G A B C WC XC YC DC 0B","1537":"VC","4097":"K 1B"},F:{"1":"cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","16":"G B C fC gC hC iC 0B OC","260":"jC","1025":"q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB","1537":"9 H M N O o p"},G:{"1":"yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC PC","1025":"F oC pC qC rC sC tC uC vC","1537":"lC mC nC","4097":"wC xC"},H:{"2":"6C"},I:{"16":"7C 8C","1025":"D CD","1537":"5B I 9C AD PC BD"},J:{"1025":"A","1537":"E"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2561":"A B"},O:{"1":"2B"},P:{"1025":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","1537":"QD"}},B:1,C:"input event",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-file-accept.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-file-accept.js
    index f49344b1e6f901..30dcd26fa6dd0b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-file-accept.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-file-accept.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC","132":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB"},D:{"1":"0 1 2 3 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"I","16":"4 6 7 8 J D E o p","132":"5 F A B C K L G M N O n"},E:{"1":"C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC","132":"J D E F A B UC VC WC AC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"2":"iC jC","132":"E kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","514":"9B gC MC hC"},H:{"2":"1C"},I:{"2":"2C 3C 4C","260":"3B I 5C MC","514":"H 6C 7C"},J:{"132":"A","260":"D"},K:{"2":"A B C yB LC zB","514":"q"},L:{"260":"H"},M:{"2":"xB"},N:{"514":"A","1028":"B"},O:{"2":"0B"},P:{"260":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"260":"BC"},R:{"260":"KD"},S:{"1":"LD MD"}},B:1,C:"accept attribute for file input",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC","132":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB"},D:{"1":"0 1 2 3 4 5 6 7 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"I","16":"8 J E F p q r AB BB","132":"9 G A B C K L H M N O o"},E:{"1":"C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC","132":"J E F G A B WC XC YC DC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"2":"mC nC","132":"F oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","514":"CC kC PC lC"},H:{"2":"6C"},I:{"2":"7C 8C 9C","260":"5B I AD PC","514":"D BD CD"},J:{"132":"A","260":"E"},K:{"2":"A B C 0B OC 1B","514":"s"},L:{"260":"D"},M:{"2":"D"},N:{"514":"A","1028":"B"},O:{"2":"2B"},P:{"260":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"260":"EC"},R:{"260":"PD"},S:{"1":"QD RD"}},B:1,C:"accept attribute for file input",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-file-directory.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-file-directory.js
    index 92fc0c6186721a..9a7a12bf620b2d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-file-directory.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-file-directory.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K"},C:{"1":"0 1 2 3 XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB QC RC"},D:{"1":"0 1 2 3 DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB"},E:{"1":"C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B SC 9B TC UC VC WC AC"},F:{"1":"5 6 7 8 9 N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C G M bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:7,C:"Directory selection from file input",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K"},C:{"1":"0 1 2 3 4 5 6 7 aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB"},E:{"1":"C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B UC CC VC WC XC YC DC"},F:{"1":"9 N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C H M fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:7,C:"Directory selection from file input",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-file-multiple.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-file-multiple.js
    index a7fe41a479f6de..c9e905f17e73e6 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-file-multiple.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-file-multiple.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC RC","2":"OC 3B QC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"I"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m eC yB LC fC zB","2":"F bC cC dC"},G:{"1":"E iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC"},H:{"130":"1C"},I:{"130":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"130":"A B C q yB LC zB"},L:{"132":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"130":"0B"},P:{"130":"I","132":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"132":"BC"},R:{"132":"KD"},S:{"1":"MD","2":"LD"}},B:1,C:"Multiple file selection",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC TC","2":"RC 5B SC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"I"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n iC 0B OC jC 1B","2":"G fC gC hC"},G:{"1":"F mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC"},H:{"130":"6C"},I:{"130":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"130":"A B C s 0B OC 1B"},L:{"132":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"130":"2B"},P:{"130":"I","132":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"132":"EC"},R:{"132":"PD"},S:{"1":"RD","2":"QD"}},B:1,C:"Multiple file selection",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-inputmode.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-inputmode.js
    index 1572f36ea76c0d..9917f064e810ca 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-inputmode.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-inputmode.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K L G M QC RC","4":"5 N O n","194":"6 7 8 9 o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d"},D:{"1":"0 1 2 3 lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB","66":"dB eB fB 4B gB 5B hB iB jB kB"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB bC cC dC eC yB LC fC zB","66":"QB RB SB TB UB VB WB XB YB ZB"},G:{"1":"sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD BD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"194":"LD MD"}},B:1,C:"inputmode attribute",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K L H M SC TC","4":"9 N O o","194":"p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d"},D:{"1":"0 1 2 3 4 5 6 7 oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB","66":"gB hB iB 6B jB 7B kB lB mB nB"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB fC gC hC iC 0B OC jC 1B","66":"TB UB VB WB XB YB ZB aB bB cB"},G:{"1":"wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD GD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"194":"QD RD"}},B:1,C:"inputmode attribute",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-minlength.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-minlength.js
    index 3a6938b308d2db..431b8f968c2daf 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-minlength.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-minlength.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M"},C:{"1":"0 1 2 3 YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB QC RC"},D:{"1":"0 1 2 3 NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC"},F:{"1":"AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p bC cC dC eC yB LC fC zB"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:1,C:"Minimum length attribute for input fields",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M"},C:{"1":"0 1 2 3 4 5 6 7 bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC"},F:{"1":"DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB fC gC hC iC 0B OC jC 1B"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:1,C:"Minimum length attribute for input fields",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-number.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-number.js
    index 9ef17ef6bc7bf9..0fbc26e756d281 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-number.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-number.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","129":"A B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","129":"C K","1025":"L G M N O"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB QC RC","513":"0 1 2 3 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"0 1 2 3 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I"},E:{"1":"4 J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"388":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B 2C 3C 4C","388":"I H 5C MC 6C 7C"},J:{"2":"D","388":"A"},K:{"1":"A B C yB LC zB","388":"q"},L:{"388":"H"},M:{"641":"xB"},N:{"388":"A B"},O:{"388":"0B"},P:{"388":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"388":"BC"},R:{"388":"KD"},S:{"513":"LD MD"}},B:1,C:"Number input type",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","129":"A B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","129":"C K","1025":"L H M N O"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB SC TC","513":"0 1 2 3 4 5 6 7 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"1":"0 1 2 3 4 5 6 7 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I"},E:{"1":"8 J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"388":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B 7C 8C 9C","388":"I D AD PC BD CD"},J:{"2":"E","388":"A"},K:{"1":"A B C 0B OC 1B","388":"s"},L:{"388":"D"},M:{"641":"D"},N:{"388":"A B"},O:{"388":"2B"},P:{"388":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"388":"EC"},R:{"388":"PD"},S:{"513":"QD RD"}},B:1,C:"Number input type",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-pattern.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-pattern.js
    index f7f274d0a5642c..1dbacdf26c72d3 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-pattern.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-pattern.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B","16":"4","388":"J D E F A TC UC VC WC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","2":"F"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC MC","388":"E hC iC jC kC lC mC nC"},H:{"2":"1C"},I:{"1":"H 7C","2":"3B I 2C 3C 4C 5C MC 6C"},J:{"1":"A","2":"D"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"132":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Pattern attribute for input fields",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC","16":"8","388":"J E F G A VC WC XC YC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","2":"G"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC PC","388":"F lC mC nC oC pC qC rC"},H:{"2":"6C"},I:{"1":"D CD","2":"5B I 7C 8C 9C AD PC BD"},J:{"1":"A","2":"E"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"132":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Pattern attribute for input fields",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-placeholder.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-placeholder.js
    index a2da51c54ba6f5..8bb9ff7611dd24 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-placeholder.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-placeholder.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","132":"I SC 9B"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m LC fC zB","2":"F bC cC dC eC","132":"B yB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B H 2C 3C 4C MC 6C 7C","4":"I 5C"},J:{"1":"D A"},K:{"1":"B C q yB LC zB","2":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"input placeholder attribute",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","132":"I UC CC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n OC jC 1B","2":"G fC gC hC iC","132":"B 0B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B D 7C 8C 9C PC BD CD","4":"I AD"},J:{"1":"E A"},K:{"1":"B C s 0B OC 1B","2":"A"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"input placeholder attribute",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-range.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-range.js
    index 32c9985797bd66..b678e1293cb4a7 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-range.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-range.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 6 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 OC 3B I J D E F A B C K L G M N O n o p QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC"},H:{"2":"1C"},I:{"1":"H MC 6C 7C","4":"3B I 2C 3C 4C 5C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Range input type",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC"},H:{"2":"6C"},I:{"1":"D PC BD CD","4":"5B I 7C 8C 9C AD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Range input type",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-search.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-search.js
    index 3be78ed549ce69..537451e1cf70fd 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-search.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-search.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","129":"A B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","129":"C K L G M N O"},C:{"2":"OC 3B QC RC","129":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"0 1 2 3 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 6 7 8 I J D E F A B C K L o p","129":"5 G M N O n"},E:{"1":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"4 I SC 9B"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m fC zB","2":"F bC cC dC eC","16":"B yB LC"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC MC"},H:{"129":"1C"},I:{"1":"H 6C 7C","16":"2C 3C","129":"3B I 4C 5C MC"},J:{"1":"D","129":"A"},K:{"1":"C q","2":"A","16":"B yB LC","129":"zB"},L:{"1":"H"},M:{"129":"xB"},N:{"129":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"129":"LD MD"}},B:1,C:"Search input type",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","129":"A B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","129":"C K L H M N O"},C:{"2":"RC 5B SC TC","129":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"1":"0 1 2 3 4 5 6 7 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 I J E F G A B C K L p q r AB BB","129":"9 H M N O o"},E:{"1":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"8 I UC CC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n jC 1B","2":"G fC gC hC iC","16":"B 0B OC"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC PC"},H:{"129":"6C"},I:{"1":"D BD CD","16":"7C 8C","129":"5B I 9C AD PC"},J:{"1":"E","129":"A"},K:{"1":"C s","2":"A","16":"B 0B OC","129":"1B"},L:{"1":"D"},M:{"129":"D"},N:{"129":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"129":"QD RD"}},B:1,C:"Search input type",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-selection.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-selection.js
    index b800707d6f8e5c..48cb35b201e027 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-selection.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/input-selection.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m eC yB LC fC zB","16":"F bC cC dC"},G:{"1":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B"},H:{"2":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Selection controls for input & textarea",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n iC 0B OC jC 1B","16":"G fC gC hC"},G:{"1":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC"},H:{"2":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Selection controls for input & textarea",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/insert-adjacent.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/insert-adjacent.js
    index d9c79df40d35f1..031d4462127215 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/insert-adjacent.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/insert-adjacent.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"J D E F A B","16":"NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","16":"F"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 4C 5C MC 6C 7C","16":"2C 3C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Element.insertAdjacentElement() & Element.insertAdjacentText()",D:true};
    +module.exports={A:{A:{"1":"J E F G A B","16":"QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","16":"G"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 9C AD PC BD CD","16":"7C 8C"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Element.insertAdjacentElement() & Element.insertAdjacentText()",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/insertadjacenthtml.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/insertadjacenthtml.js
    index 2ee80d6cd01637..14fc63023843ad 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/insertadjacenthtml.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/insertadjacenthtml.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","16":"NC","132":"J D E F"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m cC dC eC yB LC fC zB","16":"F bC"},G:{"1":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B"},H:{"1":"1C"},I:{"1":"3B I H 4C 5C MC 6C 7C","16":"2C 3C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"Element.insertAdjacentHTML()",D:true};
    +module.exports={A:{A:{"1":"A B","16":"QC","132":"J E F G"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n gC hC iC 0B OC jC 1B","16":"G fC"},G:{"1":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC"},H:{"1":"6C"},I:{"1":"5B I D 9C AD PC BD CD","16":"7C 8C"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"Element.insertAdjacentHTML()",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/internationalization.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/internationalization.js
    index 2d649f08738ab8..b2df0bd6096c90 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/internationalization.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/internationalization.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"B","2":"J D E F A NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB QC RC"},D:{"1":"0 1 2 3 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 I J D E F A B C K L G M N O n o p"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC WC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","2":"A"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:6,C:"Internationalization API",D:true};
    +module.exports={A:{A:{"1":"B","2":"J E F G A QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC YC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","2":"A"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:6,C:"Internationalization API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/intersectionobserver-v2.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/intersectionobserver-v2.js
    index 78c039358358c4..b75a45b58ab2fb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/intersectionobserver-v2.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/intersectionobserver-v2.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD AC"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:7,C:"IntersectionObserver V2",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD GD HD DC"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:7,C:"IntersectionObserver V2",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/intersectionobserver.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/intersectionobserver.js
    index b541c2f0a49fb8..d161f47f34a7c8 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/intersectionobserver.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/intersectionobserver.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"M N O","2":"C K L","260":"G","513":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB QC RC","194":"ZB aB bB"},D:{"1":"fB 4B gB 5B hB iB jB","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB","260":"YB ZB aB bB cB dB eB","513":"0 1 2 3 kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"K L G zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C SC 9B TC UC VC WC AC yB"},F:{"1":"SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB bC cC dC eC yB LC fC zB","260":"LB MB NB OB PB QB RB","513":"jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"1":"sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC 6C 7C","513":"H"},J:{"2":"D A"},K:{"2":"A B C yB LC zB","513":"q"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I","260":"8C 9C"},Q:{"513":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:5,C:"IntersectionObserver",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"M N O","2":"C K L","260":"H","513":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB SC TC","194":"cB dB eB"},D:{"1":"iB 6B jB 7B kB lB mB","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB","260":"bB cB dB eB fB gB hB","513":"0 1 2 3 4 5 6 7 nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"K L H 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C UC CC VC WC XC YC DC 0B"},F:{"1":"VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB fC gC hC iC 0B OC jC 1B","260":"OB PB QB RB SB TB UB","513":"mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"1":"wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC BD CD","513":"D"},J:{"2":"E A"},K:{"2":"A B C 0B OC 1B","513":"s"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I","260":"DD ED"},Q:{"513":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:5,C:"IntersectionObserver",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/intl-pluralrules.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/intl-pluralrules.js
    index 47775c890bc527..4f172c628e9f16 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/intl-pluralrules.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/intl-pluralrules.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N","130":"O"},C:{"1":"0 1 2 3 fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB QC RC"},D:{"1":"0 1 2 3 iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB"},E:{"1":"K L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C SC 9B TC UC VC WC AC yB zB"},F:{"1":"XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB bC cC dC eC yB LC fC zB"},G:{"1":"tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:6,C:"Intl.PluralRules API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N","130":"O"},C:{"1":"0 1 2 3 4 5 6 7 iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB"},E:{"1":"K L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C UC CC VC WC XC YC DC 0B 1B"},F:{"1":"aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB fC gC hC iC 0B OC jC 1B"},G:{"1":"xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:6,C:"Intl.PluralRules API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/intrinsic-width.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/intrinsic-width.js
    index 56e456444fadcd..7d294bf7c5f509 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/intrinsic-width.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/intrinsic-width.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O","1025":"0 1 2 3 d e f g h i j k l m r s t u v w x y z H","1537":"P Q R S T U V W X Y Z a b c"},C:{"2":"OC","932":"4 5 6 7 8 9 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB QC RC","2308":"0 1 2 3 lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"2":"4 5 I J D E F A B C K L G M N O n o","545":"6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB","1025":"0 1 2 3 d e f g h i j k l m r s t u v w x y z H xB 7B 8B","1537":"TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c"},E:{"1":"1B EC FC GC HC IC JC 2B KC aC","2":"4 I J SC 9B TC","516":"B C K L G yB zB BC XC YC CC DC 0B ZC","548":"F A WC AC","676":"D E UC VC"},F:{"2":"F B C bC cC dC eC yB LC fC zB","513":"HB","545":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB","1025":"e f g h i j k l m","1537":"GB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d"},G:{"1":"1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC","516":"xC yC zC CC DC 0B 0C","548":"lC mC nC oC pC qC rC sC tC uC vC wC","676":"E jC kC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC","545":"6C 7C","1025":"H"},J:{"2":"D","545":"A"},K:{"2":"A B C yB LC zB","1025":"q"},L:{"1025":"H"},M:{"2308":"xB"},N:{"2":"A B"},O:{"1537":"0B"},P:{"545":"I","1025":"n o p 2B ID JD","1537":"8C 9C AD BD CD AC DD ED FD GD HD 1B"},Q:{"1537":"BC"},R:{"1537":"KD"},S:{"932":"LD","2308":"MD"}},B:5,C:"Intrinsic & Extrinsic Sizing",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O","1025":"0 1 2 3 4 5 6 7 d e f g h i j k l m n t u v w x y z D","1537":"P Q R S T U V W X Y Z a b c"},C:{"2":"RC","932":"8 9 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB SC TC","2308":"0 1 2 3 4 5 6 7 oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p","545":"q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB","1025":"0 1 2 3 4 5 6 7 d e f g h i j k l m n t u v w x y z D 9B AC BC","1537":"WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c"},E:{"1":"3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J UC CC VC","516":"B C K L H 0B 1B EC ZC aC FC GC 2B bC","548":"G A YC DC","676":"E F WC XC"},F:{"2":"G B C fC gC hC iC 0B OC jC 1B","513":"KB","545":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB","1025":"e f g h i j k l m n","1537":"JB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d"},G:{"1":"3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC","516":"1C 2C 3C FC GC 2B 4C","548":"pC qC rC sC tC uC vC wC xC yC zC 0C","676":"F nC oC"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC","545":"BD CD","1025":"D"},J:{"2":"E","545":"A"},K:{"2":"A B C 0B OC 1B","1025":"s"},L:{"1025":"D"},M:{"2308":"D"},N:{"2":"A B"},O:{"1537":"2B"},P:{"545":"I","1025":"o p q r 4B ND OD","1537":"DD ED FD GD HD DC ID JD KD LD MD 3B"},Q:{"1537":"EC"},R:{"1537":"PD"},S:{"932":"QD","2308":"RD"}},B:5,C:"Intrinsic & Extrinsic Sizing",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/jpeg2000.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/jpeg2000.js
    index 614f186c1c4d4c..3b71268c46877c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/jpeg2000.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/jpeg2000.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B","129":"4 TC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:6,C:"JPEG 2000 image format",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC","129":"8 VC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:6,C:"JPEG 2000 image format",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/jpegxl.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/jpegxl.js
    index a72cae6977a51f..d743b116ff6875 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/jpegxl.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/jpegxl.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z x y z H","578":"a b c d e f g h i j k l m r s t u v w"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y QC RC","322":"0 1 2 3 Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z x y z H xB 7B 8B","194":"a b c d e f g h i j k l m r s t u v w"},E:{"1":"2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB bC cC dC eC yB LC fC zB","194":"vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"1":"2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:6,C:"JPEG XL image format",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z y z D","578":"a b c d e f g h i j k l m n t u v w x"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y SC TC","322":"0 1 2 3 4 5 6 7 Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z y z D 9B AC BC","194":"a b c d e f g h i j k l m n t u v w x"},E:{"1":"4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB fC gC hC iC 0B OC jC 1B","194":"yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"1":"4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:6,C:"JPEG XL image format",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/jpegxr.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/jpegxr.js
    index c080287d5c128e..927108f2fd5686 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/jpegxr.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/jpegxr.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"C K L G M N O","2":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"1":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:6,C:"JPEG XR image format",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"C K L H M N O","2":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"1":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:6,C:"JPEG XR image format",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/js-regexp-lookbehind.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/js-regexp-lookbehind.js
    index c3ea2defb33a9c..59c0a006b128bc 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/js-regexp-lookbehind.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/js-regexp-lookbehind.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB QC RC"},D:{"1":"0 1 2 3 hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B"},E:{"1":"HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC"},F:{"1":"WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB bC cC dC eC yB LC fC zB"},G:{"1":"HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:6,C:"Lookbehind in JS regular expressions",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B"},E:{"1":"KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC"},F:{"1":"ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB fC gC hC iC 0B OC jC 1B"},G:{"1":"KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:6,C:"Lookbehind in JS regular expressions",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/json.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/json.js
    index 142fa89c6a742d..89b24dca327c6f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/json.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/json.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D NC","129":"E"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","2":"OC 3B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m dC eC yB LC fC zB","2":"F bC cC"},G:{"1":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"JSON parsing",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E QC","129":"F"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","2":"RC 5B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n hC iC 0B OC jC 1B","2":"G fC gC"},G:{"1":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"JSON parsing",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/justify-content-space-evenly.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/justify-content-space-evenly.js
    index 6eabb983217eaf..28c79ed7a707e5 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/justify-content-space-evenly.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/justify-content-space-evenly.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G","132":"M N O"},C:{"1":"0 1 2 3 ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB QC RC"},D:{"1":"0 1 2 3 gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB","132":"eB fB 4B"},E:{"1":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC","132":"AC"},F:{"1":"UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB bC cC dC eC yB LC fC zB","132":"RB SB TB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC","132":"oC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C","132":"AD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","132":"LD"}},B:5,C:"CSS justify-content: space-evenly",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H","132":"M N O"},C:{"1":"0 1 2 3 4 5 6 7 cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB","132":"hB iB 6B"},E:{"1":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC","132":"DC"},F:{"1":"XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB fC gC hC iC 0B OC jC 1B","132":"UB VB WB"},G:{"1":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC","132":"sC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED","132":"FD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","132":"QD"}},B:5,C:"CSS justify-content: space-evenly",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/kerning-pairs-ligatures.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/kerning-pairs-ligatures.js
    index 1e83f4ba2b048d..8e25935a55095c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/kerning-pairs-ligatures.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/kerning-pairs-ligatures.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","2":"OC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"2C 3C 4C","132":"3B I 5C MC"},J:{"1":"A","2":"D"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:7,C:"High-quality kerning pairs & ligatures",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N"},C:{"1":"0 1 2 3 4 5 6 7 8 9 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","2":"RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"7C 8C 9C","132":"5B I AD PC"},J:{"1":"A","2":"E"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:7,C:"High-quality kerning pairs & ligatures",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-charcode.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-charcode.js
    index 2afcb60ea4c265..b5f2319649d8c9 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-charcode.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-charcode.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","16":"OC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"SC 9B"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"F B bC cC dC eC yB LC fC","16":"C"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC MC"},H:{"2":"1C"},I:{"1":"3B I H 4C 5C MC 6C 7C","16":"2C 3C"},J:{"1":"D A"},K:{"1":"q zB","2":"A B yB LC","16":"C"},L:{"1":"H"},M:{"130":"xB"},N:{"130":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:7,C:"KeyboardEvent.charCode",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","16":"RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"UC CC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"G B fC gC hC iC 0B OC jC","16":"C"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC PC"},H:{"2":"6C"},I:{"1":"5B I D 9C AD PC BD CD","16":"7C 8C"},J:{"1":"E A"},K:{"1":"s 1B","2":"A B 0B OC","16":"C"},L:{"1":"D"},M:{"130":"D"},N:{"130":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:7,C:"KeyboardEvent.charCode",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-code.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-code.js
    index 8c94f6b3a5b59a..2d3ddc60693fc7 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-code.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-code.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB QC RC"},D:{"1":"0 1 2 3 VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB","194":"PB QB RB SB TB UB"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC"},F:{"1":"IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB bC cC dC eC yB LC fC zB","194":"CB DB EB FB GB HB"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"194":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I","194":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"194":"KD"},S:{"1":"LD MD"}},B:5,C:"KeyboardEvent.code",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB","194":"SB TB UB VB WB XB"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC"},F:{"1":"LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB fC gC hC iC 0B OC jC 1B","194":"FB GB HB IB JB KB"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"194":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I","194":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"194":"PD"},S:{"1":"QD RD"}},B:5,C:"KeyboardEvent.code",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-getmodifierstate.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-getmodifierstate.js
    index f8df870f04736b..b7899cb1e43cb0 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-getmodifierstate.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-getmodifierstate.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K L QC RC"},D:{"1":"0 1 2 3 DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC"},F:{"1":"5 6 7 8 9 N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"F B G M bC cC dC eC yB LC fC","16":"C"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"2":"D A"},K:{"1":"q zB","2":"A B yB LC","16":"C"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"KeyboardEvent.getModifierState()",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K L SC TC"},D:{"1":"0 1 2 3 4 5 6 7 GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC"},F:{"1":"9 N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"G B H M fC gC hC iC 0B OC jC","16":"C"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"2":"E A"},K:{"1":"s 1B","2":"A B 0B OC","16":"C"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"KeyboardEvent.getModifierState()",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-key.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-key.js
    index f34bfe3ea042b5..d16cd0141c112d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-key.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-key.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E NC","260":"F A B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","260":"C K L G M N O"},C:{"1":"0 1 2 3 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 OC 3B I J D E F A B C K L G M N O n o p QC RC","132":"6 7 8 9 AB BB"},D:{"1":"0 1 2 3 YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC"},F:{"1":"LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"5 6 7 8 9 F B G M N O n o p AB BB CB DB EB FB GB HB IB JB KB bC cC dC eC yB LC fC","16":"C"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC"},H:{"1":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q zB","2":"A B yB LC","16":"C"},L:{"1":"H"},M:{"1":"xB"},N:{"260":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"KeyboardEvent.key",D:true};
    +module.exports={A:{A:{"2":"J E F QC","260":"G A B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","260":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q SC TC","132":"r AB BB CB DB EB"},D:{"1":"0 1 2 3 4 5 6 7 bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC"},F:{"1":"OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"9 G B H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB fC gC hC iC 0B OC jC","16":"C"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC"},H:{"1":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s 1B","2":"A B 0B OC","16":"C"},L:{"1":"D"},M:{"1":"D"},N:{"260":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"KeyboardEvent.key",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-location.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-location.js
    index d3b9ed450122cc..8eb6d359522dfa 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-location.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-location.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K L QC RC"},D:{"1":"0 1 2 3 DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","132":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB"},E:{"1":"D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"J SC 9B","132":"4 I TC"},F:{"1":"5 6 7 8 9 N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"F B bC cC dC eC yB LC fC","16":"C","132":"G M"},G:{"1":"E kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC MC","132":"hC iC jC"},H:{"2":"1C"},I:{"1":"H 6C 7C","16":"2C 3C","132":"3B I 4C 5C MC"},J:{"132":"D A"},K:{"1":"q zB","2":"A B yB LC","16":"C"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"KeyboardEvent.location",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K L SC TC"},D:{"1":"0 1 2 3 4 5 6 7 GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","132":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB"},E:{"1":"E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"J UC CC","132":"8 I VC"},F:{"1":"9 N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"G B fC gC hC iC 0B OC jC","16":"C","132":"H M"},G:{"1":"F oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC PC","132":"lC mC nC"},H:{"2":"6C"},I:{"1":"D BD CD","16":"7C 8C","132":"5B I 9C AD PC"},J:{"132":"E A"},K:{"1":"s 1B","2":"A B 0B OC","16":"C"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"KeyboardEvent.location",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-which.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-which.js
    index 3bc9466c29967c..44465832c5218f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-which.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/keyboardevent-which.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B","16":"4"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m cC dC eC yB LC fC zB","16":"F bC"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC MC"},H:{"2":"1C"},I:{"1":"3B I H 4C 5C MC","16":"2C 3C","132":"6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"132":"H"},M:{"132":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"2":"I","132":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"132":"KD"},S:{"1":"LD MD"}},B:7,C:"KeyboardEvent.which",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC","16":"8"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n gC hC iC 0B OC jC 1B","16":"G fC"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC PC"},H:{"2":"6C"},I:{"1":"5B I D 9C AD PC","16":"7C 8C","132":"BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"132":"D"},M:{"132":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"2":"I","132":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"132":"PD"},S:{"1":"QD RD"}},B:7,C:"KeyboardEvent.which",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/lazyload.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/lazyload.js
    index b69e6a77a7370f..1444fc09ebce23 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/lazyload.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/lazyload.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"B","2":"J D E F A NC"},B:{"1":"C K L G M N O","2":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"1":"B","2":"A"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:7,C:"Resource Hints: Lazyload",D:true};
    +module.exports={A:{A:{"1":"B","2":"J E F G A QC"},B:{"1":"C K L H M N O","2":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"1":"B","2":"A"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:7,C:"Resource Hints: Lazyload",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/let.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/let.js
    index 8a677380d6d193..8e2983ed698875 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/let.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/let.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A NC","2052":"B"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","194":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB QC RC"},D:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A B C K L G M N O","322":"5 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB","516":"OB PB QB RB SB TB UB VB"},E:{"1":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC WC","1028":"A AC"},F:{"1":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","322":"5 6 7 8 9 G M N O n o p AB","516":"BB CB DB EB FB GB HB IB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC","1028":"nC oC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","2":"A"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","516":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"let",D:true};
    +module.exports={A:{A:{"2":"J E F G A QC","2052":"B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","194":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A B C K L H M N O","322":"9 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB","516":"RB SB TB UB VB WB XB YB"},E:{"1":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC YC","1028":"A DC"},F:{"1":"MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","322":"9 H M N O o p q r AB BB CB DB","516":"EB FB GB HB IB JB KB LB"},G:{"1":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC","1028":"rC sC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","2":"A"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","516":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"let",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-icon-png.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-icon-png.js
    index f0ad369cf17095..ca5ec6522ff73b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-icon-png.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-icon-png.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"B","2":"J D E F A NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","130":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC"},H:{"130":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D","130":"A"},K:{"1":"q","130":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"130":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"PNG favicons",D:true};
    +module.exports={A:{A:{"1":"B","2":"J E F G A QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","130":"F CC kC PC lC mC nC oC pC qC rC sC tC uC"},H:{"130":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E","130":"A"},K:{"1":"s","130":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"130":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"PNG favicons",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-icon-svg.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-icon-svg.js
    index a0a5ee2e1104a3..0375db2f9eb0f5 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-icon-svg.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-icon-svg.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O P","1537":"0 1 2 3 Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"OC 3B QC RC","260":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB","513":"0 1 2 3 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P","1537":"0 1 2 3 Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"RB SB TB UB VB WB XB YB ZB aB","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB bB cB dB eB fB gB hB iB jB kB lB bC cC dC eC yB LC fC zB","1537":"mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","130":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC"},H:{"130":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D","130":"A"},K:{"130":"A B C yB LC zB","1537":"q"},L:{"1537":"H"},M:{"2":"xB"},N:{"130":"A B"},O:{"2":"0B"},P:{"2":"I 8C 9C AD BD CD AC DD ED","1537":"n o p FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"1537":"KD"},S:{"513":"LD MD"}},B:1,C:"SVG favicons",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O P","1537":"0 1 2 3 4 5 6 7 Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"RC 5B SC TC","260":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB","513":"0 1 2 3 4 5 6 7 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P","1537":"0 1 2 3 4 5 6 7 Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"UB VB WB XB YB ZB aB bB cB dB","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB eB fB gB hB iB jB kB lB mB nB oB fC gC hC iC 0B OC jC 1B","1537":"pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","130":"F CC kC PC lC mC nC oC pC qC rC sC tC uC"},H:{"130":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E","130":"A"},K:{"130":"A B C 0B OC 1B","1537":"s"},L:{"1537":"D"},M:{"2":"D"},N:{"130":"A B"},O:{"2":"2B"},P:{"2":"I DD ED FD GD HD DC ID JD","1537":"o p q r KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"1537":"PD"},S:{"513":"QD RD"}},B:1,C:"SVG favicons",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-dns-prefetch.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-dns-prefetch.js
    index 428dc6d08a69de..c78b1f281b4ac1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-dns-prefetch.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-dns-prefetch.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E NC","132":"F"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"OC 3B","260":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"16":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"16":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"16":"D A"},K:{"1":"q","16":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","2":"A"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","16":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"Resource Hints: dns-prefetch",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F QC","132":"G"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"RC 5B","260":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"16":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"16":"5B I D 7C 8C 9C AD PC BD CD"},J:{"16":"E A"},K:{"1":"s","16":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","2":"A"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","16":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"Resource Hints: dns-prefetch",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-modulepreload.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-modulepreload.js
    index 150b8742b3ab25..4b0037b772d933 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-modulepreload.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-modulepreload.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"2 3 H xB 7B 8B PC","2":"0 1 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z QC RC"},D:{"1":"0 1 2 3 lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB"},E:{"1":"2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC"},F:{"1":"aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB bC cC dC eC yB LC fC zB"},G:{"1":"2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD BD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:1,C:"Resource Hints: modulepreload",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"3 4 5 6 7 D 9B AC BC","2":"0 1 2 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z SC TC"},D:{"1":"0 1 2 3 4 5 6 7 oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB"},E:{"1":"4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC"},F:{"1":"dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB fC gC hC iC 0B OC jC 1B"},G:{"1":"4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD GD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:1,C:"Resource Hints: modulepreload",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-preconnect.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-preconnect.js
    index 045f1085b2e280..45f162ca08f850 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-preconnect.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-preconnect.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L","260":"G M N O"},C:{"1":"2 3 NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB QC RC","129":"MB","514":"0 1 qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z"},D:{"1":"0 1 2 3 TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB"},E:{"1":"C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B SC 9B TC UC VC WC AC"},F:{"1":"GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB bC cC dC eC yB LC fC zB"},G:{"1":"qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"Resource Hints: preconnect",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L","260":"H M N O"},C:{"1":"3 4 5 6 7 QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB SC TC","129":"PB","514":"0 1 2 tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z"},D:{"1":"0 1 2 3 4 5 6 7 WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB"},E:{"1":"C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B UC CC VC WC XC YC DC"},F:{"1":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB fC gC hC iC 0B OC jC 1B"},G:{"1":"uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"Resource Hints: preconnect",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-prefetch.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-prefetch.js
    index aca5eb24edc04d..f73b90c40342ae 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-prefetch.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-prefetch.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"B","2":"J D E F A NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D"},E:{"2":"4 I J D E F A B C K SC 9B TC UC VC WC AC yB zB","194":"L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC","194":"wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"I H 6C 7C","2":"3B 2C 3C 4C 5C MC"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","2":"A"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"Resource Hints: prefetch",D:true};
    +module.exports={A:{A:{"1":"B","2":"J E F G A QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E"},E:{"2":"8 I J E F G A B C K UC CC VC WC XC YC DC 0B 1B","194":"L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC","194":"0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"I D BD CD","2":"5B 7C 8C 9C AD PC"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","2":"A"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"Resource Hints: prefetch",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-preload.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-preload.js
    index ba79bff552423d..51b5d094a9b117 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-preload.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-preload.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M","1028":"N O"},C:{"1":"0 1 2 3 U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB QC RC","132":"dB","578":"eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T"},D:{"1":"0 1 2 3 XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB"},E:{"1":"C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC AC","322":"B"},F:{"1":"KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB bC cC dC eC yB LC fC zB"},G:{"1":"qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC","322":"pC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:4,C:"Resource Hints: preload",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M","1028":"N O"},C:{"1":"0 1 2 3 4 5 6 7 U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB SC TC","132":"gB","578":"hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T"},D:{"1":"0 1 2 3 4 5 6 7 aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB"},E:{"1":"C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC DC","322":"B"},F:{"1":"NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB fC gC hC iC 0B OC jC 1B"},G:{"1":"uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC","322":"tC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:4,C:"Resource Hints: preload",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-prerender.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-prerender.js
    index f013d513fea878..85a9dea1a45260 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-prerender.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/link-rel-prerender.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"B","2":"J D E F A NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A B C"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"1":"B","2":"A"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:5,C:"Resource Hints: prerender",D:true};
    +module.exports={A:{A:{"1":"B","2":"J E F G A QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A B C"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"1":"B","2":"A"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:5,C:"Resource Hints: prerender",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/loading-lazy-attr.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/loading-lazy-attr.js
    index 1389f6bc8b1003..085b8a73536da9 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/loading-lazy-attr.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/loading-lazy-attr.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB QC RC","132":"0 1 2 3 tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"0 1 2 3 vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB","66":"tB uB"},E:{"1":"HC IC JC 2B KC aC","2":"4 I J D E F A B C K SC 9B TC UC VC WC AC yB zB","322":"L G BC XC YC CC","580":"DC 0B ZC 1B EC FC GC"},F:{"1":"jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB bC cC dC eC yB LC fC zB","66":"hB iB"},G:{"1":"HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC","322":"wC xC yC zC CC","580":"DC 0B 0C 1B EC FC GC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"132":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD AC DD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD","132":"MD"}},B:1,C:"Lazy loading via attribute for images & iframes",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB SC TC","132":"0 1 2 3 4 5 6 7 wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},D:{"1":"0 1 2 3 4 5 6 7 yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB","66":"wB xB"},E:{"1":"KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K UC CC VC WC XC YC DC 0B 1B","322":"L H EC ZC aC FC","580":"GC 2B bC 3B HC IC JC"},F:{"1":"mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB fC gC hC iC 0B OC jC 1B","66":"kB lB"},G:{"1":"KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC","322":"0C 1C 2C 3C FC","580":"GC 2B 4C 3B HC IC JC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"132":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r JD KD LD MD 3B 4B ND OD","2":"I DD ED FD GD HD DC ID"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD","132":"RD"}},B:1,C:"Lazy loading via attribute for images & iframes",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/localecompare.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/localecompare.js
    index a8a07deb21fa32..c2bf7489ead34b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/localecompare.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/localecompare.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"B","16":"NC","132":"J D E F A"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","132":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB QC RC"},D:{"1":"0 1 2 3 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","132":"4 5 6 I J D E F A B C K L G M N O n o p"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","132":"4 I J D E F SC 9B TC UC VC WC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","16":"F B C bC cC dC eC yB LC fC","132":"zB"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","132":"E 9B gC MC hC iC jC kC lC mC"},H:{"132":"1C"},I:{"1":"H 6C 7C","132":"3B I 2C 3C 4C 5C MC"},J:{"132":"D A"},K:{"1":"q","16":"A B C yB LC","132":"zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","132":"A"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","132":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","4":"LD"}},B:6,C:"localeCompare()",D:true};
    +module.exports={A:{A:{"1":"B","16":"QC","132":"J E F G A"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","132":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","132":"8 9 I J E F G A B C K L H M N O o p q r"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","132":"8 I J E F G UC CC VC WC XC YC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","16":"G B C fC gC hC iC 0B OC jC","132":"1B"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","132":"F CC kC PC lC mC nC oC pC qC"},H:{"132":"6C"},I:{"1":"D BD CD","132":"5B I 7C 8C 9C AD PC"},J:{"132":"E A"},K:{"1":"s","16":"A B C 0B OC","132":"1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","132":"A"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","132":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","4":"QD"}},B:6,C:"localeCompare()",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/magnetometer.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/magnetometer.js
    index b6d2e533d41120..5e42e8b4babc7d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/magnetometer.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/magnetometer.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB","194":"fB 4B gB 5B hB iB jB kB lB"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"194":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:4,C:"Magnetometer",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB","194":"iB 6B jB 7B kB lB mB nB oB"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"194":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:4,C:"Magnetometer",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/matchesselector.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/matchesselector.js
    index ac370cee9e7318..428f5fa3101a4e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/matchesselector.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/matchesselector.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E NC","36":"F A B"},B:{"1":"0 1 2 3 G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","36":"C K L"},C:{"1":"0 1 2 3 HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC","36":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB RC"},D:{"1":"0 1 2 3 HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","36":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB"},E:{"1":"E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B","36":"4 J D TC UC"},F:{"1":"6 7 8 9 o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B bC cC dC eC yB","36":"5 C G M N O n LC fC zB"},G:{"1":"E kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B","36":"gC MC hC iC jC"},H:{"2":"1C"},I:{"1":"H","2":"2C","36":"3B I 3C 4C 5C MC 6C 7C"},J:{"36":"D A"},K:{"1":"q","2":"A B","36":"C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"36":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","36":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"matches() DOM method",D:true};
    +module.exports={A:{A:{"2":"J E F QC","36":"G A B"},B:{"1":"0 1 2 3 4 5 6 7 H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","36":"C K L"},C:{"1":"0 1 2 3 4 5 6 7 KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC","36":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB TC"},D:{"1":"0 1 2 3 4 5 6 7 KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","36":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB"},E:{"1":"F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC","36":"8 J E VC WC"},F:{"1":"p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B fC gC hC iC 0B","36":"9 C H M N O o OC jC 1B"},G:{"1":"F oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC","36":"kC PC lC mC nC"},H:{"2":"6C"},I:{"1":"D","2":"7C","36":"5B I 8C 9C AD PC BD CD"},J:{"36":"E A"},K:{"1":"s","2":"A B","36":"C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"36":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","36":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"matches() DOM method",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/matchmedia.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/matchmedia.js
    index 5ed6cbdd774299..d2201f74281c89 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/matchmedia.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/matchmedia.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E"},E:{"1":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"F B C bC cC dC eC yB LC fC"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC"},H:{"1":"1C"},I:{"1":"3B I H 5C MC 6C 7C","2":"2C 3C 4C"},J:{"1":"A","2":"D"},K:{"1":"q zB","2":"A B C yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"matchMedia",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F"},E:{"1":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"G B C fC gC hC iC 0B OC jC"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC"},H:{"1":"6C"},I:{"1":"5B I D AD PC BD CD","2":"7C 8C 9C"},J:{"1":"A","2":"E"},K:{"1":"s 1B","2":"A B C 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"matchMedia",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mathml.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mathml.js
    index 315491422f2722..148b8404983914 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mathml.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mathml.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"F A B NC","8":"J D E"},B:{"2":"C K L G M N O","8":"P Q R S T U V W X Y Z a b c d e f","584":"g h i j k l m r s t u v","1025":"0 1 2 3 w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","129":"OC 3B QC RC"},D:{"1":"7","8":"4 5 6 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f","584":"g h i j k l m r s t u v","1025":"0 1 2 3 w x y z H xB 7B 8B"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","260":"4 I J D E F SC 9B TC UC VC WC"},F:{"2":"F","8":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B","584":"S T U V W X Y Z a b c d","1025":"e f g h i j k l m","2052":"B C bC cC dC eC yB LC fC zB"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","8":"9B gC MC"},H:{"8":"1C"},I:{"8":"3B I 2C 3C 4C 5C MC 6C 7C","1025":"H"},J:{"1":"A","8":"D"},K:{"8":"A B C q yB LC zB"},L:{"1025":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"8":"0B"},P:{"1":"o p","8":"I n 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"8":"BC"},R:{"8":"KD"},S:{"1":"LD MD"}},B:2,C:"MathML",D:true};
    +module.exports={A:{A:{"2":"G A B QC","8":"J E F"},B:{"2":"C K L H M N O","8":"P Q R S T U V W X Y Z a b c d e f","584":"g h i j k l m n t u v w","1025":"0 1 2 3 4 5 6 7 x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","129":"RC 5B SC TC"},D:{"1":"AB","8":"8 9 I J E F G A B C K L H M N O o p q r BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f","584":"g h i j k l m n t u v w","1025":"0 1 2 3 4 5 6 7 x y z D 9B AC BC"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","260":"8 I J E F G UC CC VC WC XC YC"},F:{"2":"G","8":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B","584":"S T U V W X Y Z a b c d","1025":"e f g h i j k l m n","2052":"B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","8":"CC kC PC"},H:{"8":"6C"},I:{"8":"5B I 7C 8C 9C AD PC BD CD","1025":"D"},J:{"1":"A","8":"E"},K:{"8":"A B C s 0B OC 1B"},L:{"1025":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"8":"2B"},P:{"1":"p q r","8":"I o DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"8":"EC"},R:{"8":"PD"},S:{"1":"QD RD"}},B:2,C:"MathML",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/maxlength.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/maxlength.js
    index 305ca29c2e8a00..318846225d0d5f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/maxlength.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/maxlength.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","16":"NC","900":"J D E F"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","1025":"C K L G M N O"},C:{"1":"0 1 2 3 YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","900":"OC 3B QC RC","1025":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"4 SC","900":"I 9B"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","16":"F","132":"B C bC cC dC eC yB LC fC zB"},G:{"1":"gC MC hC iC jC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B","2052":"E kC"},H:{"132":"1C"},I:{"1":"3B I 4C 5C MC 6C 7C","16":"2C 3C","4097":"H"},J:{"1":"D A"},K:{"132":"A B C yB LC zB","4097":"q"},L:{"4097":"H"},M:{"4097":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"4097":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1025":"LD MD"}},B:1,C:"maxlength attribute for input and textarea elements",D:true};
    +module.exports={A:{A:{"1":"A B","16":"QC","900":"J E F G"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","1025":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","900":"RC 5B SC TC","1025":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"8 UC","900":"I CC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","16":"G","132":"B C fC gC hC iC 0B OC jC 1B"},G:{"1":"kC PC lC mC nC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC","2052":"F oC"},H:{"132":"6C"},I:{"1":"5B I 9C AD PC BD CD","16":"7C 8C","4097":"D"},J:{"1":"E A"},K:{"132":"A B C 0B OC 1B","4097":"s"},L:{"4097":"D"},M:{"4097":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"4097":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1025":"QD RD"}},B:1,C:"maxlength attribute for input and textarea elements",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-css-backdrop-pseudo-element.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-css-backdrop-pseudo-element.js
    index 9d5297e6c8cf56..5b9c20e4ec6eb2 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-css-backdrop-pseudo-element.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-css-backdrop-pseudo-element.js
    @@ -1 +1 @@
    -module.exports={A:{D:{"1":"0 1 2 3 KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB","33":"FB GB HB IB JB"},L:{"1":"H"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","33":"C K L G M N O"},C:{"1":"0 1 2 3 UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB QC RC"},M:{"1":"xB"},A:{"2":"J D E F A NC","33":"B"},F:{"1":"7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C G M N O bC cC dC eC yB LC fC zB","33":"5 6 n o p"},K:{"1":"q","2":"A B C yB LC zB"},E:{"1":"DC 0B ZC 1B EC FC GC HC IC JC 2B KC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC aC"},G:{"1":"DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC","33":"6C 7C"}},B:6,C:"CSS ::backdrop pseudo-element",D:undefined};
    +module.exports={A:{D:{"1":"0 1 2 3 4 5 6 7 NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB","33":"IB JB KB LB MB"},L:{"1":"D"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","33":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB SC TC"},M:{"1":"D"},A:{"2":"J E F G A QC","33":"B"},F:{"1":"AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C H M N O fC gC hC iC 0B OC jC 1B","33":"9 o p q r"},K:{"1":"s","2":"A B C 0B OC 1B"},E:{"1":"GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC eC"},G:{"1":"GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC","33":"BD CD"}},B:6,C:"CSS ::backdrop pseudo-element",D:undefined};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-css-unicode-bidi-isolate-override.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-css-unicode-bidi-isolate-override.js
    index 9160e2c417d735..5de5b1b69b6d58 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-css-unicode-bidi-isolate-override.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-css-unicode-bidi-isolate-override.js
    @@ -1 +1 @@
    -module.exports={A:{D:{"1":"0 1 2 3 VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB"},L:{"1":"H"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K L G M QC RC","33":"5 6 7 8 9 N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB"},M:{"1":"xB"},A:{"2":"J D E F A B NC"},F:{"1":"IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB bC cC dC eC yB LC fC zB"},K:{"1":"q","2":"A B C yB LC zB"},E:{"1":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC","2":"4 I J SC 9B TC UC aC","33":"D E F A VC WC AC"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC","33":"E jC kC lC mC nC oC"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"}},B:6,C:"isolate-override from unicode-bidi",D:undefined};
    +module.exports={A:{D:{"1":"0 1 2 3 4 5 6 7 YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB"},L:{"1":"D"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K L H M SC TC","33":"9 N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB"},M:{"1":"D"},A:{"2":"J E F G A B QC"},F:{"1":"LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB fC gC hC iC 0B OC jC 1B"},K:{"1":"s","2":"A B C 0B OC 1B"},E:{"1":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC","2":"8 I J UC CC VC WC eC","33":"E F G A XC YC DC"},G:{"1":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC","33":"F nC oC pC qC rC sC"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"}},B:6,C:"isolate-override from unicode-bidi",D:undefined};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-css-unicode-bidi-isolate.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-css-unicode-bidi-isolate.js
    index 8a21c53d83cf11..bb0ed381e702a1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-css-unicode-bidi-isolate.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-css-unicode-bidi-isolate.js
    @@ -1 +1 @@
    -module.exports={A:{D:{"1":"0 1 2 3 VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A B C K L G","33":"5 6 7 8 9 M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB"},L:{"1":"H"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F QC RC","33":"5 6 7 8 9 A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB"},M:{"1":"xB"},A:{"2":"J D E F A B NC"},F:{"1":"IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","33":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB"},K:{"1":"q","2":"A B C yB LC zB"},E:{"1":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC","2":"4 I SC 9B TC aC","33":"J D E F A UC VC WC AC"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC","33":"E iC jC kC lC mC nC oC"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"}},B:6,C:"isolate from unicode-bidi",D:undefined};
    +module.exports={A:{D:{"1":"0 1 2 3 4 5 6 7 YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A B C K L H","33":"9 M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB"},L:{"1":"D"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G SC TC","33":"9 A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB"},M:{"1":"D"},A:{"2":"J E F G A B QC"},F:{"1":"LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","33":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB"},K:{"1":"s","2":"A B C 0B OC 1B"},E:{"1":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC","2":"8 I UC CC VC eC","33":"J E F G A WC XC YC DC"},G:{"1":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC","33":"F mC nC oC pC qC rC sC"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"}},B:6,C:"isolate from unicode-bidi",D:undefined};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-css-unicode-bidi-plaintext.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-css-unicode-bidi-plaintext.js
    index e761fba4e3c339..3b41423c0d7c85 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-css-unicode-bidi-plaintext.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-css-unicode-bidi-plaintext.js
    @@ -1 +1 @@
    -module.exports={A:{D:{"1":"0 1 2 3 VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB"},L:{"1":"H"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F QC RC","33":"5 6 7 8 9 A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB"},M:{"1":"xB"},A:{"2":"J D E F A B NC"},F:{"1":"IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB bC cC dC eC yB LC fC zB"},K:{"1":"q","2":"A B C yB LC zB"},E:{"1":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC","2":"4 I SC 9B TC aC","33":"J D E F A UC VC WC AC"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC","33":"E iC jC kC lC mC nC oC"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"}},B:6,C:"plaintext from unicode-bidi",D:undefined};
    +module.exports={A:{D:{"1":"0 1 2 3 4 5 6 7 YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB"},L:{"1":"D"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G SC TC","33":"9 A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB"},M:{"1":"D"},A:{"2":"J E F G A B QC"},F:{"1":"LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB fC gC hC iC 0B OC jC 1B"},K:{"1":"s","2":"A B C 0B OC 1B"},E:{"1":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC","2":"8 I UC CC VC eC","33":"J E F G A WC XC YC DC"},G:{"1":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC","33":"F mC nC oC pC qC rC sC"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"}},B:6,C:"plaintext from unicode-bidi",D:undefined};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-text-decoration-color.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-text-decoration-color.js
    index 1ae4b8311372da..d760fc5d51d90f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-text-decoration-color.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-text-decoration-color.js
    @@ -1 +1 @@
    -module.exports={A:{D:{"1":"0 1 2 3 eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB"},L:{"1":"H"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I QC RC","33":"5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB"},M:{"1":"xB"},A:{"2":"J D E F A B NC"},F:{"1":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB bC cC dC eC yB LC fC zB"},K:{"1":"q","2":"A B C yB LC zB"},E:{"1":"K L G zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC","2":"4 I J D SC 9B TC UC VC aC","33":"E F A B C WC AC yB"},G:{"1":"sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC jC","33":"E kC lC mC nC oC pC qC rC"},P:{"1":"n o p AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"}},B:6,C:"text-decoration-color property",D:undefined};
    +module.exports={A:{D:{"1":"0 1 2 3 4 5 6 7 hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB"},L:{"1":"D"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I SC TC","33":"9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB"},M:{"1":"D"},A:{"2":"J E F G A B QC"},F:{"1":"UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB fC gC hC iC 0B OC jC 1B"},K:{"1":"s","2":"A B C 0B OC 1B"},E:{"1":"K L H 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC","2":"8 I J E UC CC VC WC XC eC","33":"F G A B C YC DC 0B"},G:{"1":"wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC nC","33":"F oC pC qC rC sC tC uC vC"},P:{"1":"o p q r FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"}},B:6,C:"text-decoration-color property",D:undefined};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-text-decoration-line.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-text-decoration-line.js
    index 436ffe5161fe25..82967241cbb306 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-text-decoration-line.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-text-decoration-line.js
    @@ -1 +1 @@
    -module.exports={A:{D:{"1":"0 1 2 3 eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB"},L:{"1":"H"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I QC RC","33":"5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB"},M:{"1":"xB"},A:{"2":"J D E F A B NC"},F:{"1":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB bC cC dC eC yB LC fC zB"},K:{"1":"q","2":"A B C yB LC zB"},E:{"1":"K L G zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC","2":"4 I J D SC 9B TC UC VC aC","33":"E F A B C WC AC yB"},G:{"1":"sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC jC","33":"E kC lC mC nC oC pC qC rC"},P:{"1":"n o p AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"}},B:6,C:"text-decoration-line property",D:undefined};
    +module.exports={A:{D:{"1":"0 1 2 3 4 5 6 7 hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB"},L:{"1":"D"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I SC TC","33":"9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB"},M:{"1":"D"},A:{"2":"J E F G A B QC"},F:{"1":"UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB fC gC hC iC 0B OC jC 1B"},K:{"1":"s","2":"A B C 0B OC 1B"},E:{"1":"K L H 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC","2":"8 I J E UC CC VC WC XC eC","33":"F G A B C YC DC 0B"},G:{"1":"wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC nC","33":"F oC pC qC rC sC tC uC vC"},P:{"1":"o p q r FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"}},B:6,C:"text-decoration-line property",D:undefined};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-text-decoration-shorthand.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-text-decoration-shorthand.js
    index 8017856588b101..e1e6fd1918ba83 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-text-decoration-shorthand.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-text-decoration-shorthand.js
    @@ -1 +1 @@
    -module.exports={A:{D:{"1":"0 1 2 3 eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB"},L:{"1":"H"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I QC RC"},M:{"1":"xB"},A:{"2":"J D E F A B NC"},F:{"1":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB bC cC dC eC yB LC fC zB"},K:{"1":"q","2":"A B C yB LC zB"},E:{"2":"4 I J D SC 9B TC UC VC aC","33":"E F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC"},G:{"2":"9B gC MC hC iC jC","33":"E kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},P:{"1":"n o p AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"}},B:6,C:"text-decoration shorthand property",D:undefined};
    +module.exports={A:{D:{"1":"0 1 2 3 4 5 6 7 hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB"},L:{"1":"D"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I SC TC"},M:{"1":"D"},A:{"2":"J E F G A B QC"},F:{"1":"UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB fC gC hC iC 0B OC jC 1B"},K:{"1":"s","2":"A B C 0B OC 1B"},E:{"2":"8 I J E UC CC VC WC XC eC","33":"F G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC"},G:{"2":"CC kC PC lC mC nC","33":"F oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},P:{"1":"o p q r FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"}},B:6,C:"text-decoration shorthand property",D:undefined};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-text-decoration-style.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-text-decoration-style.js
    index e451c29202d126..192ad6a53c4859 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-text-decoration-style.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mdn-text-decoration-style.js
    @@ -1 +1 @@
    -module.exports={A:{D:{"1":"0 1 2 3 eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB"},L:{"1":"H"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I QC RC","33":"5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB"},M:{"1":"xB"},A:{"2":"J D E F A B NC"},F:{"1":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB bC cC dC eC yB LC fC zB"},K:{"1":"q","2":"A B C yB LC zB"},E:{"1":"K L G zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC","2":"4 I J D SC 9B TC UC VC aC","33":"E F A B C WC AC yB"},G:{"1":"sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC jC","33":"E kC lC mC nC oC pC qC rC"},P:{"1":"n o p AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"}},B:6,C:"text-decoration-style property",D:undefined};
    +module.exports={A:{D:{"1":"0 1 2 3 4 5 6 7 hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB"},L:{"1":"D"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I SC TC","33":"9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB"},M:{"1":"D"},A:{"2":"J E F G A B QC"},F:{"1":"UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB fC gC hC iC 0B OC jC 1B"},K:{"1":"s","2":"A B C 0B OC 1B"},E:{"1":"K L H 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC","2":"8 I J E UC CC VC WC XC eC","33":"F G A B C YC DC 0B"},G:{"1":"wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC nC","33":"F oC pC qC rC sC tC uC vC"},P:{"1":"o p q r FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"}},B:6,C:"text-decoration-style property",D:undefined};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/media-fragments.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/media-fragments.js
    index 24484648a4b6f8..714878489f7038 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/media-fragments.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/media-fragments.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O","132":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB QC RC","132":"0 1 2 3 HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"2":"4 I J D E F A B C K L G M N","132":"0 1 2 3 5 6 7 8 9 O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I SC 9B TC","132":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"F B C bC cC dC eC yB LC fC zB","132":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"9B gC MC hC iC jC","132":"E kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC","132":"H 6C 7C"},J:{"2":"D A"},K:{"2":"A B C yB LC zB","132":"q"},L:{"132":"H"},M:{"132":"xB"},N:{"132":"A B"},O:{"132":"0B"},P:{"2":"I 8C","132":"n o p 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"132":"BC"},R:{"132":"KD"},S:{"132":"LD MD"}},B:2,C:"Media Fragments",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O","132":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB SC TC","132":"0 1 2 3 4 5 6 7 KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"2":"8 I J E F G A B C K L H M N","132":"0 1 2 3 4 5 6 7 9 O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I UC CC VC","132":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"G B C fC gC hC iC 0B OC jC 1B","132":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"CC kC PC lC mC nC","132":"F oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC","132":"D BD CD"},J:{"2":"E A"},K:{"2":"A B C 0B OC 1B","132":"s"},L:{"132":"D"},M:{"132":"D"},N:{"132":"A B"},O:{"132":"2B"},P:{"2":"I DD","132":"o p q r ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"132":"EC"},R:{"132":"PD"},S:{"132":"QD RD"}},B:2,C:"Media Fragments",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mediacapture-fromelement.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mediacapture-fromelement.js
    index cbd7158e98c0ec..92fb9ea08341df 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mediacapture-fromelement.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mediacapture-fromelement.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QC RC","260":"0 1 2 3 QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"0 1 2 3 hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB","324":"YB ZB aB bB cB dB eB fB 4B gB 5B"},E:{"2":"4 I J D E F A SC 9B TC UC VC WC AC","132":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB bC cC dC eC yB LC fC zB","324":"JB KB LB MB NB OB PB QB RB SB TB UB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"260":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I","132":"8C 9C AD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"260":"LD MD"}},B:5,C:"Media Capture from DOM Elements API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB SC TC","260":"0 1 2 3 4 5 6 7 TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"1":"0 1 2 3 4 5 6 7 kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB","324":"bB cB dB eB fB gB hB iB 6B jB 7B"},E:{"2":"8 I J E F G A UC CC VC WC XC YC DC","132":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB fC gC hC iC 0B OC jC 1B","324":"MB NB OB PB QB RB SB TB UB VB WB XB"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"260":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I","132":"DD ED FD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"260":"QD RD"}},B:5,C:"Media Capture from DOM Elements API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mediarecorder.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mediarecorder.js
    index 05dfca21e62382..b90bd55a5787fb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mediarecorder.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mediarecorder.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB QC RC"},D:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB","194":"UB VB"},E:{"1":"G XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C SC 9B TC UC VC WC AC yB","322":"K L zB BC"},F:{"1":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB bC cC dC eC yB LC fC zB","194":"HB IB"},G:{"1":"yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC","578":"rC sC tC uC vC wC xC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"MediaRecorder API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB","194":"XB YB"},E:{"1":"H ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C UC CC VC WC XC YC DC 0B","322":"K L 1B EC"},F:{"1":"MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB fC gC hC iC 0B OC jC 1B","194":"KB LB"},G:{"1":"2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC","578":"vC wC xC yC zC 0C 1C"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"MediaRecorder API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mediasource.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mediasource.js
    index 684345daec1ea7..b7b8c54aac2ea1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mediasource.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mediasource.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A NC","132":"B"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 OC 3B I J D E F A B C K L G M N O n o p QC RC","66":"8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB"},D:{"1":"0 1 2 3 EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A B C K L G M","33":"6 7 8 9 AB BB CB DB","66":"5 N O n o p"},E:{"1":"E F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D SC 9B TC UC VC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC","260":"tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H 7C","2":"3B I 2C 3C 4C 5C MC 6C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","2":"A"},O:{"1":"0B"},P:{"1":"n o p CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD BD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"Media Source Extensions",D:true};
    +module.exports={A:{A:{"2":"J E F G A QC","132":"B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB SC TC","66":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB"},D:{"1":"0 1 2 3 4 5 6 7 HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A B C K L H M","33":"r AB BB CB DB EB FB GB","66":"9 N O o p q"},E:{"1":"F G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E UC CC VC WC XC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC","260":"xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D CD","2":"5B I 7C 8C 9C AD PC BD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","2":"A"},O:{"1":"2B"},P:{"1":"o p q r HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD GD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"Media Source Extensions",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/menu.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/menu.js
    index 1a262d697c8679..27cdb0c1162be7 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/menu.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/menu.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"4 OC 3B I J D QC RC","132":"5 6 7 8 9 E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T","450":"0 1 2 3 U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","66":"OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","66":"IB JB KB LB MB NB OB PB QB RB SB TB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"450":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:7,C:"Context menu item (menuitem element)",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"8 RC 5B I J E SC TC","132":"9 F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T","450":"0 1 2 3 4 5 6 7 U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","66":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","66":"LB MB NB OB PB QB RB SB TB UB VB WB"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"450":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:7,C:"Context menu item (menuitem element)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/meta-theme-color.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/meta-theme-color.js
    index 15b653c1df6f13..eccd921381fa12 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/meta-theme-color.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/meta-theme-color.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB","132":"0 1 2 3 q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","258":"MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB"},E:{"1":"G YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K L SC 9B TC UC VC WC AC yB zB BC XC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"513":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"n o p 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I","16":"8C"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:1,C:"theme-color Meta Tag",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB","132":"0 1 2 3 4 5 6 7 s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","258":"PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB"},E:{"1":"H aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L UC CC VC WC XC YC DC 0B 1B EC ZC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"513":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"o p q r ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I","16":"DD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:1,C:"theme-color Meta Tag",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/meter.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/meter.js
    index fb14a86d0e5ba9..95530098c19368 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/meter.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/meter.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C"},C:{"1":"0 1 2 3 5 6 7 8 9 M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K L G QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D"},E:{"1":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m yB LC fC zB","2":"F bC cC dC eC"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC"},H:{"1":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"1":"D A"},K:{"1":"B C q yB LC zB","2":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"meter element",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C"},C:{"1":"0 1 2 3 4 5 6 7 9 M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K L H SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E"},E:{"1":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 0B OC jC 1B","2":"G fC gC hC iC"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC"},H:{"1":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"1":"E A"},K:{"1":"B C s 0B OC 1B","2":"A"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"meter element",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/midi.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/midi.js
    index 33f4f3232fab9f..58ca05254c3a39 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/midi.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/midi.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u QC RC"},D:{"1":"0 1 2 3 QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:5,C:"Web MIDI API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v SC TC"},D:{"1":"0 1 2 3 4 5 6 7 TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:5,C:"Web MIDI API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/minmaxwh.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/minmaxwh.js
    index b01d1b422bdf11..db6b9250b68cdd 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/minmaxwh.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/minmaxwh.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","8":"J NC","129":"D","257":"E"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"CSS min/max-width/height",D:true};
    +module.exports={A:{A:{"1":"G A B","8":"J QC","129":"E","257":"F"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"CSS min/max-width/height",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mp3.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mp3.js
    index c538e47c13f1cc..84ec9d4a35d1e4 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mp3.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mp3.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B","132":"4 5 I J D E F A B C K L G M N O n o QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC 9B"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B"},H:{"2":"1C"},I:{"1":"3B I H 4C 5C MC 6C 7C","2":"2C 3C"},J:{"1":"D A"},K:{"1":"B C q yB LC zB","2":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"MP3 audio format",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B","132":"8 9 I J E F G A B C K L H M N O o p SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC CC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC"},H:{"2":"6C"},I:{"1":"5B I D 9C AD PC BD CD","2":"7C 8C"},J:{"1":"E A"},K:{"1":"B C s 0B OC 1B","2":"A"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"MP3 audio format",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mpeg-dash.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mpeg-dash.js
    index 3bd7163e2331a4..4f5a26b3d242b4 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mpeg-dash.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mpeg-dash.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"C K L G M N O","2":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","386":"o p"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:6,C:"Dynamic Adaptive Streaming over HTTP (MPEG-DASH)",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"C K L H M N O","2":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","386":"p q"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:6,C:"Dynamic Adaptive Streaming over HTTP (MPEG-DASH)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mpeg4.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mpeg4.js
    index 71cf15f36d9c41..fe20660d0e69e4 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mpeg4.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mpeg4.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 OC 3B I J D E F A B C K L G M N O n QC RC","4":"6 7 8 9 o p AB BB CB DB EB FB GB HB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC"},F:{"1":"8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 F B C G M N O n o p bC cC dC eC yB LC fC zB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H 6C 7C","4":"3B I 2C 3C 5C MC","132":"4C"},J:{"1":"D A"},K:{"1":"B C q yB LC zB","2":"A"},L:{"1":"H"},M:{"260":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"MPEG-4/H.264 video format",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o SC TC","4":"p q r AB BB CB DB EB FB GB HB IB JB KB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC"},F:{"1":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB fC gC hC iC 0B OC jC 1B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D BD CD","4":"5B I 7C 8C AD PC","132":"9C"},J:{"1":"E A"},K:{"1":"B C s 0B OC 1B","2":"A"},L:{"1":"D"},M:{"260":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"MPEG-4/H.264 video format",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/multibackgrounds.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/multibackgrounds.js
    index 58c7f942209483..798d73ae430c1c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/multibackgrounds.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/multibackgrounds.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC RC","2":"OC 3B QC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m dC eC yB LC fC zB","2":"F bC cC"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS3 Multiple backgrounds",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC TC","2":"RC 5B SC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n hC iC 0B OC jC 1B","2":"G fC gC"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS3 Multiple backgrounds",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/multicolumn.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/multicolumn.js
    index 3155b43aae6e61..e8bb36951139f1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/multicolumn.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/multicolumn.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"C K L G M N O","516":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"132":"ZB aB bB cB dB eB fB 4B gB 5B hB iB jB","164":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB QC RC","516":"kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a","1028":"0 1 2 3 b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"420":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB","516":"0 1 2 3 XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","132":"F WC","164":"D E VC","420":"4 I J SC 9B TC UC"},F:{"1":"C yB LC fC zB","2":"F B bC cC dC eC","420":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB","516":"KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","132":"lC mC","164":"E jC kC","420":"9B gC MC hC iC"},H:{"1":"1C"},I:{"420":"3B I 2C 3C 4C 5C MC 6C 7C","516":"H"},J:{"420":"D A"},K:{"1":"C yB LC zB","2":"A B","516":"q"},L:{"516":"H"},M:{"1028":"xB"},N:{"1":"A B"},O:{"516":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","420":"I"},Q:{"516":"BC"},R:{"516":"KD"},S:{"164":"LD MD"}},B:4,C:"CSS3 Multiple column layout",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"C K L H M N O","516":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"132":"cB dB eB fB gB hB iB 6B jB 7B kB lB mB","164":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB SC TC","516":"nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a","1028":"0 1 2 3 4 5 6 7 b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"420":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB","516":"0 1 2 3 4 5 6 7 aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","132":"G YC","164":"E F XC","420":"8 I J UC CC VC WC"},F:{"1":"C 0B OC jC 1B","2":"G B fC gC hC iC","420":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB","516":"NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","132":"pC qC","164":"F nC oC","420":"CC kC PC lC mC"},H:{"1":"6C"},I:{"420":"5B I 7C 8C 9C AD PC BD CD","516":"D"},J:{"420":"E A"},K:{"1":"C 0B OC 1B","2":"A B","516":"s"},L:{"516":"D"},M:{"1028":"D"},N:{"1":"A B"},O:{"516":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","420":"I"},Q:{"516":"EC"},R:{"516":"PD"},S:{"164":"QD RD"}},B:4,C:"CSS3 Multiple column layout",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mutation-events.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mutation-events.js
    index 222814e4e15e80..4714bec31fcf4d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mutation-events.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mutation-events.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E NC","260":"F A B"},B:{"132":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","260":"C K L G M N O"},C:{"2":"4 OC 3B I QC RC","260":"0 1 2 3 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"16":"4 I J D E F A B C K L","132":"0 1 2 3 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"16":"SC 9B","132":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"C fC zB","2":"F bC cC dC eC","16":"B yB LC","132":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"16":"9B gC","132":"E MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"16":"2C 3C","132":"3B I H 4C 5C MC 6C 7C"},J:{"132":"D A"},K:{"1":"C zB","2":"A","16":"B yB LC","132":"q"},L:{"132":"H"},M:{"260":"xB"},N:{"260":"A B"},O:{"132":"0B"},P:{"132":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"132":"BC"},R:{"132":"KD"},S:{"260":"LD MD"}},B:5,C:"Mutation events",D:true};
    +module.exports={A:{A:{"2":"J E F QC","260":"G A B"},B:{"132":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","260":"C K L H M N O"},C:{"2":"8 RC 5B I SC TC","260":"0 1 2 3 4 5 6 7 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"16":"8 I J E F G A B C K L","132":"0 1 2 3 4 5 6 7 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"16":"UC CC","132":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"C jC 1B","2":"G fC gC hC iC","16":"B 0B OC","132":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"16":"CC kC","132":"F PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"16":"7C 8C","132":"5B I D 9C AD PC BD CD"},J:{"132":"E A"},K:{"1":"C 1B","2":"A","16":"B 0B OC","132":"s"},L:{"132":"D"},M:{"260":"D"},N:{"260":"A B"},O:{"132":"2B"},P:{"132":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"132":"EC"},R:{"132":"PD"},S:{"260":"QD RD"}},B:5,C:"Mutation events",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mutationobserver.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mutationobserver.js
    index 90ab33ead43409..fc29fd180fdf96 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mutationobserver.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/mutationobserver.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"B","2":"J D E NC","8":"F A"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K QC RC"},D:{"1":"0 1 2 3 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A B C K L G M N","33":"5 6 7 8 9 O n o p"},E:{"1":"D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC","33":"J"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC","33":"iC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B 2C 3C 4C","8":"I 5C MC"},J:{"1":"A","2":"D"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","8":"A"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Mutation Observer",D:true};
    +module.exports={A:{A:{"1":"B","2":"J E F QC","8":"G A"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K SC TC"},D:{"1":"0 1 2 3 4 5 6 7 DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A B C K L H M N","33":"9 O o p q r AB BB CB"},E:{"1":"E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC","33":"J"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC","33":"mC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B 7C 8C 9C","8":"I AD PC"},J:{"1":"A","2":"E"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","8":"A"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Mutation Observer",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/namevalue-storage.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/namevalue-storage.js
    index 76759e9a5786ad..975cbbfdb99c68 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/namevalue-storage.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/namevalue-storage.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"E F A B","2":"NC","8":"J D"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","4":"OC 3B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m dC eC yB LC fC zB","2":"F bC cC"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"B C q yB LC zB","2":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Web Storage - name/value pairs",D:true};
    +module.exports={A:{A:{"1":"F G A B","2":"QC","8":"J E"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","4":"RC 5B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n hC iC 0B OC jC 1B","2":"G fC gC"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"B C s 0B OC 1B","2":"A"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Web Storage - name/value pairs",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/native-filesystem-api.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/native-filesystem-api.js
    index 5755d16b39e80d..6a676bd0409156 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/native-filesystem-api.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/native-filesystem-api.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O","194":"P Q R S T U","260":"0 1 2 3 V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x QC RC","516":"0 1 2 3 y z H xB 7B 8B PC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q","194":"sB tB uB vB wB P Q R S T U","260":"0 1 2 3 V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC","516":"CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB bC cC dC eC yB LC fC zB","194":"hB iB jB kB lB mB nB oB pB qB","260":"rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC","516":"CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC 6C 7C","516":"H"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"516":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:7,C:"File System Access API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O","194":"P Q R S T U","260":"0 1 2 3 4 5 6 7 V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y SC TC","516":"0 1 2 3 4 5 6 7 z D 9B AC BC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s","194":"vB wB xB yB zB P Q R S T U","260":"0 1 2 3 4 5 6 7 V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC","516":"FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB fC gC hC iC 0B OC jC 1B","194":"kB lB mB nB oB pB qB rB sB tB","260":"uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C","516":"FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC BD CD","516":"D"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"516":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:7,C:"File System Access API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/nav-timing.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/nav-timing.js
    index b9a6cb19fb9bf9..92d673b82b38fb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/nav-timing.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/nav-timing.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I","33":"J D E F A B C"},E:{"1":"E F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D SC 9B TC UC VC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC jC kC"},H:{"2":"1C"},I:{"1":"I H 5C MC 6C 7C","2":"3B 2C 3C 4C"},J:{"1":"A","2":"D"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"Navigation Timing API",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I","33":"J E F G A B C"},E:{"1":"F G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E UC CC VC WC XC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC nC oC"},H:{"2":"6C"},I:{"1":"I D AD PC BD CD","2":"5B 7C 8C 9C"},J:{"1":"A","2":"E"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"Navigation Timing API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/netinfo.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/netinfo.js
    index a4a73b6238b461..d0c3f26faa3b00 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/netinfo.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/netinfo.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O","1028":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB","1028":"0 1 2 3 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB bC cC dC eC yB LC fC zB","1028":"VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"2C 6C 7C","132":"3B I 3C 4C 5C MC"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p BD CD AC DD ED FD GD HD 1B 2B ID JD","132":"I","516":"8C 9C AD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"MD","260":"LD"}},B:7,C:"Network Information API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O","1028":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB","1028":"0 1 2 3 4 5 6 7 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB fC gC hC iC 0B OC jC 1B","1028":"YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"7C BD CD","132":"5B I 8C 9C AD PC"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r GD HD DC ID JD KD LD MD 3B 4B ND OD","132":"I","516":"DD ED FD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"RD","260":"QD"}},B:7,C:"Network Information API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/notifications.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/notifications.js
    index b3b9f8adad9849..a62a2959ff5641 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/notifications.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/notifications.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K"},C:{"1":"0 1 2 3 6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 OC 3B I J D E F A B C K L G M N O n o QC RC"},D:{"1":"0 1 2 3 6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"I","36":"4 5 J D E F A B C K L G M N O n o"},E:{"1":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC"},F:{"1":"8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 F B C G M N O n o p bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC","516":"HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC","36":"H 6C 7C"},J:{"1":"A","2":"D"},K:{"2":"A B C yB LC zB","36":"q"},L:{"257":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"36":"I","130":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"130":"KD"},S:{"1":"LD MD"}},B:1,C:"Web Notifications",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K"},C:{"1":"0 1 2 3 4 5 6 7 q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p SC TC"},D:{"1":"0 1 2 3 4 5 6 7 q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"I","36":"8 9 J E F G A B C K L H M N O o p"},E:{"1":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC"},F:{"1":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC","516":"KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC","36":"D BD CD"},J:{"1":"A","2":"E"},K:{"2":"A B C 0B OC 1B","36":"s"},L:{"257":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"36":"I","130":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"130":"PD"},S:{"1":"QD RD"}},B:1,C:"Web Notifications",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/object-entries.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/object-entries.js
    index e221693264aec4..5968c2ab99f0c3 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/object-entries.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/object-entries.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K"},C:{"1":"0 1 2 3 UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB QC RC"},D:{"1":"0 1 2 3 bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC"},F:{"1":"OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB bC cC dC eC yB LC fC zB"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D","16":"A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"Object.entries",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K"},C:{"1":"0 1 2 3 4 5 6 7 XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC"},F:{"1":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB fC gC hC iC 0B OC jC 1B"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E","16":"A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"Object.entries",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/object-fit.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/object-fit.js
    index 1f6fd696fc78d3..3c7a8a512d1eeb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/object-fit.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/object-fit.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G","260":"M N O"},C:{"1":"0 1 2 3 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB QC RC"},D:{"1":"0 1 2 3 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D SC 9B TC UC","132":"E F VC WC"},F:{"1":"5 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F G M N O bC cC dC","33":"B C eC yB LC fC zB"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC jC","132":"E kC lC mC"},H:{"33":"1C"},I:{"1":"H 7C","2":"3B I 2C 3C 4C 5C MC 6C"},J:{"2":"D A"},K:{"1":"q","2":"A","33":"B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS3 object-fit/object-position",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H","260":"M N O"},C:{"1":"0 1 2 3 4 5 6 7 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E UC CC VC WC","132":"F G XC YC"},F:{"1":"9 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G H M N O fC gC hC","33":"B C iC 0B OC jC 1B"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC nC","132":"F oC pC qC"},H:{"33":"6C"},I:{"1":"D CD","2":"5B I 7C 8C 9C AD PC BD"},J:{"2":"E A"},K:{"1":"s","2":"A","33":"B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS3 object-fit/object-position",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/object-observe.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/object-observe.js
    index b8efa4bacf6be0..6de360c19a9953 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/object-observe.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/object-observe.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB","2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"6 7 8 9 AB BB CB DB EB FB GB HB IB JB","2":"5 F B C G M N O n o p KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"I","2":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:7,C:"Object.observe data binding",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"MB NB OB PB QB RB SB TB UB VB WB XB YB ZB","2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"r AB BB CB DB EB FB GB HB IB JB KB LB MB","2":"9 G B C H M N O o p q NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"I","2":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:7,C:"Object.observe data binding",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/object-values.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/object-values.js
    index 2b47f200156cb3..61a70d494f9db2 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/object-values.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/object-values.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"8":"J D E F A B NC"},B:{"1":"0 1 2 3 L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K"},C:{"1":"0 1 2 3 UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","8":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB QC RC"},D:{"1":"0 1 2 3 bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","8":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","8":"4 I J D E F A SC 9B TC UC VC WC"},F:{"1":"OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","8":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB bC cC dC eC yB LC fC zB"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","8":"E 9B gC MC hC iC jC kC lC mC nC"},H:{"8":"1C"},I:{"1":"H","8":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"8":"D A"},K:{"1":"q","8":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"8":"A B"},O:{"1":"0B"},P:{"1":"n o p 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","8":"I 8C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"Object.values method",D:true};
    +module.exports={A:{A:{"8":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K"},C:{"1":"0 1 2 3 4 5 6 7 XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","8":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","8":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","8":"8 I J E F G A UC CC VC WC XC YC"},F:{"1":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","8":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB fC gC hC iC 0B OC jC 1B"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","8":"F CC kC PC lC mC nC oC pC qC rC"},H:{"8":"6C"},I:{"1":"D","8":"5B I 7C 8C 9C AD PC BD CD"},J:{"8":"E A"},K:{"1":"s","8":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"8":"A B"},O:{"1":"2B"},P:{"1":"o p q r ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","8":"I DD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"Object.values method",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/objectrtc.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/objectrtc.js
    index 3dd017e958bbd3..15b45a79b853b1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/objectrtc.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/objectrtc.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"K L G M N O","2":"0 1 2 3 C P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:6,C:"Object RTC (ORTC) API for WebRTC",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"K L H M N O","2":"0 1 2 3 4 5 6 7 C P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:6,C:"Object RTC (ORTC) API for WebRTC",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/offline-apps.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/offline-apps.js
    index 2d107541d6ea9f..791d31bb8cfafd 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/offline-apps.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/offline-apps.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"F NC","8":"J D E"},B:{"1":"C K L G M N O P Q R S T","2":"0 1 2 3 U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S QC RC","2":"0 1 2 3 T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","4":"3B","8":"OC"},D:{"1":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T","2":"0 1 2 3 U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","8":"SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB eC yB LC fC zB","2":"F q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC","8":"cC dC"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"3B I 2C 3C 4C 5C MC 6C 7C","2":"H"},J:{"1":"D A"},K:{"1":"B C yB LC zB","2":"A q"},L:{"2":"H"},M:{"2":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"2":"KD"},S:{"1":"LD","2":"MD"}},B:7,C:"Offline web applications",D:true};
    +module.exports={A:{A:{"1":"A B","2":"G QC","8":"J E F"},B:{"1":"C K L H M N O P Q R S T","2":"0 1 2 3 4 5 6 7 U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S SC TC","2":"0 1 2 3 4 5 6 7 T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","4":"5B","8":"RC"},D:{"1":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T","2":"0 1 2 3 4 5 6 7 U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","8":"UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB iC 0B OC jC 1B","2":"G s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC","8":"gC hC"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"5B I 7C 8C 9C AD PC BD CD","2":"D"},J:{"1":"E A"},K:{"1":"B C 0B OC 1B","2":"A s"},L:{"2":"D"},M:{"2":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"2":"PD"},S:{"1":"QD","2":"RD"}},B:7,C:"Offline web applications",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/offscreencanvas.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/offscreencanvas.js
    index 50aae6341fd809..37d64e08e7fc42 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/offscreencanvas.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/offscreencanvas.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB QC RC","194":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r"},D:{"1":"0 1 2 3 oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB","322":"fB 4B gB 5B hB iB jB kB lB mB nB"},E:{"1":"2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC","516":"FC GC HC IC JC"},F:{"1":"jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB bC cC dC eC yB LC fC zB","322":"SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB"},G:{"1":"2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC","516":"FC GC HC IC JC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"194":"LD MD"}},B:1,C:"OffscreenCanvas",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB SC TC","194":"UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},D:{"1":"0 1 2 3 4 5 6 7 rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB","322":"iB 6B jB 7B kB lB mB nB oB pB qB"},E:{"1":"4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC","516":"IC JC KC LC cC"},F:{"1":"mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB fC gC hC iC 0B OC jC 1B","322":"VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB"},G:{"1":"4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC","516":"IC JC KC LC 5C"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD GD HD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"194":"QD RD"}},B:1,C:"OffscreenCanvas",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ogg-vorbis.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ogg-vorbis.js
    index 03f78c1ab8555e..6730f39c9fbfbd 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ogg-vorbis.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ogg-vorbis.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","2":"OC 3B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L SC 9B TC UC VC WC AC yB zB BC","132":"G XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m dC eC yB LC fC zB","2":"F bC cC"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"3B I H 4C 5C MC 6C 7C","16":"2C 3C"},J:{"1":"A","2":"D"},K:{"1":"B C q yB LC zB","2":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"Ogg Vorbis audio format",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","2":"RC 5B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L UC CC VC WC XC YC DC 0B 1B EC","132":"H ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n hC iC 0B OC jC 1B","2":"G fC gC"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"5B I D 9C AD PC BD CD","16":"7C 8C"},J:{"1":"A","2":"E"},K:{"1":"B C s 0B OC 1B","2":"A"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"Ogg Vorbis audio format",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ogv.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ogv.js
    index 6ffa310ce36742..8483b1030d9a99 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ogv.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ogv.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E NC","8":"F A B"},B:{"1":"0 1 2 3 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","8":"C K L G M"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","2":"OC 3B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m dC eC yB LC fC zB","2":"F bC cC"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"1":"xB"},N:{"8":"A B"},O:{"1":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"2":"KD"},S:{"1":"LD MD"}},B:6,C:"Ogg/Theora video format",D:true};
    +module.exports={A:{A:{"2":"J E F QC","8":"G A B"},B:{"1":"0 1 2 3 4 5 6 7 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","8":"C K L H M"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","2":"RC 5B"},D:{"1":"0 1 2 3 4 5 6 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","194":"7 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n hC iC 0B OC jC 1B","2":"G fC gC"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"1":"D"},N:{"8":"A B"},O:{"1":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"2":"PD"},S:{"1":"QD RD"}},B:6,C:"Ogg/Theora video format",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ol-reversed.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ol-reversed.js
    index d31b378fb1f1ef..44b6cb936ff56d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ol-reversed.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ol-reversed.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 5 6 7 8 9 O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K L G M N QC RC"},D:{"1":"0 1 2 3 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A B C K L G","16":"5 M N O"},E:{"1":"D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC","16":"J"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"F B bC cC dC eC yB LC fC","16":"C"},G:{"1":"E iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC"},H:{"1":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"1":"A","2":"D"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Reversed attribute of ordered lists",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 9 O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K L H M N SC TC"},D:{"1":"0 1 2 3 4 5 6 7 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A B C K L H","16":"9 M N O"},E:{"1":"E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC","16":"J"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"G B fC gC hC iC 0B OC jC","16":"C"},G:{"1":"F mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC"},H:{"1":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"1":"A","2":"E"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Reversed attribute of ordered lists",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/once-event-listener.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/once-event-listener.js
    index ae1ae6967e45eb..3c5d204bf6db5e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/once-event-listener.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/once-event-listener.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G"},C:{"1":"0 1 2 3 XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB QC RC"},D:{"1":"0 1 2 3 cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC WC"},F:{"1":"PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB bC cC dC eC yB LC fC zB"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:1,C:"\"once\" event listener option",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H"},C:{"1":"0 1 2 3 4 5 6 7 aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC YC"},F:{"1":"SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB fC gC hC iC 0B OC jC 1B"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:1,C:"\"once\" event listener option",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/online-status.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/online-status.js
    index 3c0117c14f85e4..c0b395b69905fc 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/online-status.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/online-status.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D NC","260":"E"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","2":"OC 3B","516":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB"},D:{"1":"0 1 2 3 5 6 7 8 9 L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A B C K"},E:{"1":"4 J E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B","1025":"D"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC","4":"zB"},G:{"1":"E MC hC iC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC","1025":"jC"},H:{"2":"1C"},I:{"1":"3B I H 4C 5C MC 6C 7C","16":"2C 3C"},J:{"1":"A","132":"D"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Online/offline status",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E QC","260":"F"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","2":"RC 5B","516":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB"},D:{"1":"0 1 2 3 4 5 6 7 9 L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A B C K"},E:{"1":"8 J F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC","1025":"E"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC","4":"1B"},G:{"1":"F PC lC mC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC","1025":"nC"},H:{"2":"6C"},I:{"1":"5B I D 9C AD PC BD CD","16":"7C 8C"},J:{"1":"A","132":"E"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Online/offline status",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/opus.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/opus.js
    index ad3bdc2f146d51..bb5fbab7e6363b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/opus.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/opus.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K"},C:{"1":"0 1 2 3 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K L QC RC"},D:{"1":"0 1 2 3 GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB"},E:{"2":"4 I J D E F A SC 9B TC UC VC WC AC","132":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 F B C G M N O bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC","132":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"Opus audio format",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K"},C:{"1":"0 1 2 3 4 5 6 7 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K L SC TC"},D:{"1":"0 1 2 3 4 5 6 7 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB"},E:{"2":"8 I J E F G A UC CC VC WC XC YC DC","132":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC","132":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"Opus audio format",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/orientation-sensor.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/orientation-sensor.js
    index c3d6b68c753aeb..22fbd6927b2531 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/orientation-sensor.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/orientation-sensor.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB","194":"fB 4B gB 5B hB iB jB kB lB"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:4,C:"Orientation Sensor",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB","194":"iB 6B jB 7B kB lB mB nB oB"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:4,C:"Orientation Sensor",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/outline.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/outline.js
    index 824c6a68b08d77..da9c682d28492c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/outline.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/outline.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D NC","260":"E","388":"F A B"},B:{"1":"0 1 2 3 G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","388":"C K L"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m fC","129":"zB","260":"F B bC cC dC eC yB LC"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"C q zB","260":"A B yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"388":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS outline properties",D:true};
    +module.exports={A:{A:{"2":"J E QC","260":"F","388":"G A B"},B:{"1":"0 1 2 3 4 5 6 7 H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","388":"C K L"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n jC","129":"1B","260":"G B fC gC hC iC 0B OC"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"C s 1B","260":"A B 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"388":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS outline properties",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pad-start-end.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pad-start-end.js
    index bf4cf994a2db31..394bd9f000eaa3 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pad-start-end.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pad-start-end.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L"},C:{"1":"0 1 2 3 VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB QC RC"},D:{"1":"0 1 2 3 eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC WC"},F:{"1":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB bC cC dC eC yB LC fC zB"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"String.prototype.padStart(), String.prototype.padEnd()",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L"},C:{"1":"0 1 2 3 4 5 6 7 YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC YC"},F:{"1":"UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB fC gC hC iC 0B OC jC 1B"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"String.prototype.padStart(), String.prototype.padEnd()",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/page-transition-events.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/page-transition-events.js
    index f7fcad9937f267..cd3884240cb26d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/page-transition-events.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/page-transition-events.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"B","2":"J D E F A NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC MC"},H:{"2":"1C"},I:{"1":"3B I H 4C 5C MC 6C 7C","16":"2C 3C"},J:{"1":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","2":"A"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"PageTransitionEvent",D:true};
    +module.exports={A:{A:{"1":"B","2":"J E F G A QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC PC"},H:{"2":"6C"},I:{"1":"5B I D 9C AD PC BD CD","16":"7C 8C"},J:{"1":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","2":"A"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"PageTransitionEvent",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pagevisibility.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pagevisibility.js
    index 4b070de3d9d334..8b548fe4e810c5 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pagevisibility.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pagevisibility.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F QC RC","33":"A B C K L G M N"},D:{"1":"0 1 2 3 GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A B C K","33":"5 6 7 8 9 L G M N O n o p AB BB CB DB EB FB"},E:{"1":"D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J SC 9B TC"},F:{"1":"6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"F B C bC cC dC eC yB LC fC","33":"5 G M N O"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC","33":"6C 7C"},J:{"1":"A","2":"D"},K:{"1":"q zB","2":"A B C yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","33":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"Page Visibility",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G SC TC","33":"A B C K L H M N"},D:{"1":"0 1 2 3 4 5 6 7 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A B C K","33":"9 L H M N O o p q r AB BB CB DB EB FB GB HB IB"},E:{"1":"E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J UC CC VC"},F:{"1":"o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"G B C fC gC hC iC 0B OC jC","33":"9 H M N O"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC","33":"BD CD"},J:{"1":"A","2":"E"},K:{"1":"s 1B","2":"A B C 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","33":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"Page Visibility",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/passive-event-listener.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/passive-event-listener.js
    index dfa925daea6125..0ffeb84761aa53 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/passive-event-listener.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/passive-event-listener.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G"},C:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB QC RC"},D:{"1":"0 1 2 3 YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC WC"},F:{"1":"LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB bC cC dC eC yB LC fC zB"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:1,C:"Passive event listeners",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H"},C:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC YC"},F:{"1":"OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB fC gC hC iC 0B OC jC 1B"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:1,C:"Passive event listeners",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/passkeys.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/passkeys.js
    index a181e03ff77a7d..165938e60aee9f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/passkeys.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/passkeys.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 v w x y z H","2":"C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u"},E:{"1":"EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B"},F:{"1":"g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f bC cC dC eC yB LC fC zB"},G:{"1":"1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"o p","2":"I 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","16":"n"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:6,C:"Passkeys",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 w x y z D","2":"C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v"},E:{"1":"HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B"},F:{"1":"g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f fC gC hC iC 0B OC jC 1B"},G:{"1":"3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"p q r","2":"I DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","16":"o"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:6,C:"Passkeys",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/passwordrules.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/passwordrules.js
    index 31386b1dc6b4d7..377aaca4f8348e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/passwordrules.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/passwordrules.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O","16":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB QC RC","16":"7B 8B PC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","16":"xB 7B 8B"},E:{"1":"C K zB","2":"4 I J D E F A B SC 9B TC UC VC WC AC yB","16":"L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB bC cC dC eC yB LC fC zB","16":"aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"16":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC 6C 7C","16":"H"},J:{"2":"D","16":"A"},K:{"2":"A B C yB LC zB","16":"q"},L:{"16":"H"},M:{"16":"xB"},N:{"2":"A","16":"B"},O:{"16":"0B"},P:{"2":"I 8C 9C","16":"n o p AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"16":"BC"},R:{"16":"KD"},S:{"2":"LD MD"}},B:1,C:"Password Rules",D:false};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O","16":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D SC TC","16":"9B AC BC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","16":"9B AC BC"},E:{"1":"C K 1B","2":"8 I J E F G A B UC CC VC WC XC YC DC 0B","16":"L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB fC gC hC iC 0B OC jC 1B","16":"dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"16":"6C"},I:{"2":"5B I 7C 8C 9C AD PC BD CD","16":"D"},J:{"2":"E","16":"A"},K:{"2":"A B C 0B OC 1B","16":"s"},L:{"16":"D"},M:{"16":"D"},N:{"2":"A","16":"B"},O:{"16":"2B"},P:{"2":"I DD ED","16":"o p q r FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"16":"EC"},R:{"16":"PD"},S:{"2":"QD RD"}},B:1,C:"Password Rules",D:false};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/path2d.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/path2d.js
    index 435d32d0e046cb..47208d6cb75597 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/path2d.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/path2d.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K","132":"L G M N O"},C:{"1":"0 1 2 3 VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB QC RC","132":"EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB"},D:{"1":"0 1 2 3 nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB","132":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB"},E:{"1":"A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D SC 9B TC UC","132":"E F VC"},F:{"1":"cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 F B C G M N O n o p bC cC dC eC yB LC fC zB","132":"6 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC jC","16":"E","132":"kC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"1":"A","2":"D"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p AC DD ED FD GD HD 1B 2B ID JD","132":"I 8C 9C AD BD CD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Path2D",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K","132":"L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB SC TC","132":"HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB"},D:{"1":"0 1 2 3 4 5 6 7 qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB","132":"MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB"},E:{"1":"A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E UC CC VC WC","132":"F G XC"},F:{"1":"fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q fC gC hC iC 0B OC jC 1B","132":"r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC nC","16":"F","132":"oC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"1":"A","2":"E"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DC ID JD KD LD MD 3B 4B ND OD","132":"I DD ED FD GD HD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Path2D",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/payment-request.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/payment-request.js
    index c1df3bf1c50222..a48a8b05944bc8 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/payment-request.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/payment-request.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K","322":"L","8196":"G M N O"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB QC RC","4162":"cB dB eB fB 4B gB 5B hB iB jB kB","16452":"0 1 2 3 lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"0 1 2 3 wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB","194":"aB bB cB dB eB fB","1090":"4B gB","8196":"5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB"},E:{"1":"K L G zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC WC","514":"A B AC","8196":"C yB"},F:{"1":"lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB bC cC dC eC yB LC fC zB","194":"NB OB PB QB RB SB TB UB","8196":"VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB"},G:{"1":"sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC","514":"nC oC pC","8196":"qC rC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"2049":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"n o p ED FD GD HD 1B 2B ID JD","2":"I","8196":"8C 9C AD BD CD AC DD"},Q:{"8196":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:2,C:"Payment Request API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K","322":"L","8196":"H M N O"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB SC TC","4162":"fB gB hB iB 6B jB 7B kB lB mB nB","16452":"0 1 2 3 4 5 6 7 oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"1":"0 1 2 3 4 5 6 7 zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB","194":"dB eB fB gB hB iB","1090":"6B jB","8196":"7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB"},E:{"1":"K L H 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC YC","514":"A B DC","8196":"C 0B"},F:{"1":"oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB fC gC hC iC 0B OC jC 1B","194":"QB RB SB TB UB VB WB XB","8196":"YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB"},G:{"1":"wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC","514":"rC sC tC","8196":"uC vC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"2049":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"o p q r JD KD LD MD 3B 4B ND OD","2":"I","8196":"DD ED FD GD HD DC ID"},Q:{"8196":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:2,C:"Payment Request API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pdf-viewer.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pdf-viewer.js
    index 0e1aa5af304647..eece49c9e01b31 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pdf-viewer.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pdf-viewer.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A NC","132":"B"},B:{"1":"0 1 2 3 G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","16":"C K L"},C:{"1":"0 1 2 3 5 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K L G M N O QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 I J D E F A B C K L"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"SC 9B"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"F B bC cC dC eC yB LC fC"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"16":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"16":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:6,C:"Built-in PDF viewer",D:true};
    +module.exports={A:{A:{"2":"J E F G A QC","132":"B"},B:{"1":"0 1 2 3 4 5 6 7 H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","16":"C K L"},C:{"1":"0 1 2 3 4 5 6 7 9 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K L H M N O SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 I J E F G A B C K L"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"UC CC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"G B fC gC hC iC 0B OC jC"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"16":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"16":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:6,C:"Built-in PDF viewer",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/permissions-api.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/permissions-api.js
    index 9a9380ae1d520b..b139ff22c90895 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/permissions-api.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/permissions-api.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB QC RC"},D:{"1":"0 1 2 3 QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB"},E:{"1":"1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC"},F:{"1":"DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB bC cC dC eC yB LC fC zB"},G:{"1":"1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"Permissions API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB"},E:{"1":"3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC"},F:{"1":"GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB fC gC hC iC 0B OC jC 1B"},G:{"1":"3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"Permissions API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/permissions-policy.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/permissions-policy.js
    index a36922d23e2505..b4ba98eef244f8 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/permissions-policy.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/permissions-policy.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O","258":"P Q R S T U","322":"V W","388":"0 1 2 3 X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q QC RC","258":"0 1 2 3 sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B","258":"gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U","322":"V W","388":"0 1 2 3 X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B SC 9B TC UC VC WC AC","258":"C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB bC cC dC eC yB LC fC zB","258":"UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB","322":"rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d","388":"e f g h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC","258":"qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC 6C 7C","258":"H"},J:{"2":"D A"},K:{"2":"A B C yB LC zB","388":"q"},L:{"388":"H"},M:{"258":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I 8C 9C AD","258":"n o p BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"258":"BC"},R:{"388":"KD"},S:{"2":"LD","258":"MD"}},B:5,C:"Permissions Policy",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O","258":"P Q R S T U","322":"V W","388":"0 1 2 3 4 5 6 7 X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s SC TC","258":"0 1 2 3 4 5 6 7 vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B","258":"jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U","322":"V W","388":"0 1 2 3 4 5 6 7 X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B UC CC VC WC XC YC DC","258":"C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB fC gC hC iC 0B OC jC 1B","258":"XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB","322":"uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d","388":"e f g h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC","258":"uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC BD CD","258":"D"},J:{"2":"E A"},K:{"2":"A B C 0B OC 1B","388":"s"},L:{"388":"D"},M:{"258":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I DD ED FD","258":"o p q r GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"258":"EC"},R:{"388":"PD"},S:{"2":"QD","258":"RD"}},B:5,C:"Permissions Policy",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/picture-in-picture.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/picture-in-picture.js
    index ce21c8d9a0ab02..13e20fd5391578 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/picture-in-picture.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/picture-in-picture.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB QC RC","132":"0 1 2 3 rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","1090":"mB","1412":"qB","1668":"nB oB pB"},D:{"1":"0 1 2 3 pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB","2114":"oB"},E:{"1":"L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC WC","4100":"A B C K AC yB zB"},F:{"1":"q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB bC cC dC eC yB LC fC zB","8196":"KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB"},G:{"1":"xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC","4100":"lC mC nC oC pC qC rC sC tC uC vC wC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"16388":"H"},M:{"16388":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:5,C:"Picture-in-Picture",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB SC TC","132":"0 1 2 3 4 5 6 7 uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","1090":"pB","1412":"tB","1668":"qB rB sB"},D:{"1":"0 1 2 3 4 5 6 7 sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB","2114":"rB"},E:{"1":"L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC YC","4100":"A B C K DC 0B 1B"},F:{"1":"s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB fC gC hC iC 0B OC jC 1B","8196":"NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB"},G:{"1":"1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC","4100":"pC qC rC sC tC uC vC wC xC yC zC 0C"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"16388":"D"},M:{"16388":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:5,C:"Picture-in-Picture",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/picture.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/picture.js
    index 125cf17ae2f4f9..f61a96364fa49d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/picture.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/picture.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C"},C:{"1":"0 1 2 3 LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB QC RC","578":"HB IB JB KB"},D:{"1":"0 1 2 3 LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB","194":"KB"},E:{"1":"A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC"},F:{"1":"8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 F B C G M N O n o p bC cC dC eC yB LC fC zB","322":"7"},G:{"1":"mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Picture element",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C"},C:{"1":"0 1 2 3 4 5 6 7 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB SC TC","578":"KB LB MB NB"},D:{"1":"0 1 2 3 4 5 6 7 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB","194":"NB"},E:{"1":"A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC"},F:{"1":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r fC gC hC iC 0B OC jC 1B","322":"AB"},G:{"1":"qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Picture element",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ping.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ping.js
    index 8121c1987af97f..dc40fe7ace5563 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ping.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ping.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M"},C:{"2":"OC","194":"0 1 2 3 4 5 6 7 8 9 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 I J D E F A B C K L"},E:{"1":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"194":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"194":"LD MD"}},B:1,C:"Ping attribute",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M"},C:{"2":"RC","194":"0 1 2 3 4 5 6 7 8 9 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 I J E F G A B C K L"},E:{"1":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"194":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"194":"QD RD"}},B:1,C:"Ping attribute",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/png-alpha.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/png-alpha.js
    index bdfc40895f9f17..68ad6f7f0846bc 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/png-alpha.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/png-alpha.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"D E F A B","2":"NC","8":"J"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"PNG alpha transparency",D:true};
    +module.exports={A:{A:{"1":"E F G A B","2":"QC","8":"J"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"PNG alpha transparency",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pointer-events.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pointer-events.js
    index 740caf91a64b97..f77d4d5fc5b53d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pointer-events.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pointer-events.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"B","2":"J D E F A NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC RC","2":"OC 3B QC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC 9B"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","2":"A"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:7,C:"CSS pointer-events (for HTML)",D:true};
    +module.exports={A:{A:{"1":"B","2":"J E F G A QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC TC","2":"RC 5B SC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC CC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","2":"A"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:7,C:"CSS pointer-events (for HTML)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pointer.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pointer.js
    index 336e72cf6a1283..2750219b71a31e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pointer.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pointer.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"B","2":"J D E F NC","164":"A"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I QC RC","8":"5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB","328":"OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB"},D:{"1":"0 1 2 3 cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 I J D E F A B C K L G M N O n o","8":"6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB","584":"ZB aB bB"},E:{"1":"K L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J SC 9B TC","8":"D E F A B C UC VC WC AC yB","1096":"zB"},F:{"1":"PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","8":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB","584":"MB NB OB"},G:{"1":"uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","8":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC","6148":"tC"},H:{"2":"1C"},I:{"1":"H","8":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"8":"D A"},K:{"1":"q","2":"A","8":"B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","36":"A"},O:{"1":"0B"},P:{"1":"n o p 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"8C","8":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","328":"LD"}},B:2,C:"Pointer events",D:true};
    +module.exports={A:{A:{"1":"B","2":"J E F G QC","164":"A"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I SC TC","8":"9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB","328":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB"},D:{"1":"0 1 2 3 4 5 6 7 fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p","8":"q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB","584":"cB dB eB"},E:{"1":"K L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J UC CC VC","8":"E F G A B C WC XC YC DC 0B","1096":"1B"},F:{"1":"SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","8":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB","584":"PB QB RB"},G:{"1":"yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","8":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC","6148":"xC"},H:{"2":"6C"},I:{"1":"D","8":"5B I 7C 8C 9C AD PC BD CD"},J:{"8":"E A"},K:{"1":"s","2":"A","8":"B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","36":"A"},O:{"1":"2B"},P:{"1":"o p q r ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"DD","8":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","328":"QD"}},B:2,C:"Pointer events",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pointerlock.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pointerlock.js
    index 95527c5ea7ba12..071393b1033d87 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pointerlock.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/pointerlock.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C"},C:{"1":"0 1 2 3 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K QC RC","33":"5 6 7 8 9 L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB"},D:{"1":"0 1 2 3 KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A B C K L G","33":"6 7 8 9 p AB BB CB DB EB FB GB HB IB JB","66":"5 M N O n o"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC"},F:{"1":"7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","33":"5 6 G M N O n o p"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"Pointer Lock API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C"},C:{"1":"0 1 2 3 4 5 6 7 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K SC TC","33":"9 L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB"},D:{"1":"0 1 2 3 4 5 6 7 NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A B C K L H","33":"q r AB BB CB DB EB FB GB HB IB JB KB LB MB","66":"9 M N O o p"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC"},F:{"1":"AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","33":"9 H M N O o p q r"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"Pointer Lock API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/portals.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/portals.js
    index b8e61c954c2bb3..f14840983a94c8 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/portals.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/portals.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O P Q R S T","322":"0 1 2 3 Z a b c d e f g h i j k l m r s t u v w x y z H","450":"U V W X Y"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB","194":"tB uB vB wB P Q R S T","322":"0 1 2 3 V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","450":"U"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB bC cC dC eC yB LC fC zB","194":"hB iB jB kB lB mB nB oB pB qB rB","322":"q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"450":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:7,C:"Portals",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O P Q R S T","322":"0 1 2 3 4 5 6 7 Z a b c d e f g h i j k l m n t u v w x y z D","450":"U V W X Y"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB","194":"wB xB yB zB P Q R S T","322":"0 1 2 3 4 5 6 7 V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","450":"U"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB fC gC hC iC 0B OC jC 1B","194":"kB lB mB nB oB pB qB rB sB tB uB","322":"s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"450":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:7,C:"Portals",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/prefers-color-scheme.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/prefers-color-scheme.js
    index bee23c0157896e..11123f2cdf6017 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/prefers-color-scheme.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/prefers-color-scheme.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB QC RC"},D:{"1":"0 1 2 3 uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB"},E:{"1":"K L G zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C SC 9B TC UC VC WC AC yB"},F:{"1":"hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB bC cC dC eC yB LC fC zB"},G:{"1":"tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD AC DD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:5,C:"prefers-color-scheme media query",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB"},E:{"1":"K L H 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C UC CC VC WC XC YC DC 0B"},F:{"1":"kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB fC gC hC iC 0B OC jC 1B"},G:{"1":"xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r JD KD LD MD 3B 4B ND OD","2":"I DD ED FD GD HD DC ID"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:5,C:"prefers-color-scheme media query",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/prefers-reduced-motion.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/prefers-reduced-motion.js
    index d8c913aa5a3eb0..3eb5cdc423a00b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/prefers-reduced-motion.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/prefers-reduced-motion.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB QC RC"},D:{"1":"0 1 2 3 sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC"},F:{"1":"jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB bC cC dC eC yB LC fC zB"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD AC"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:5,C:"prefers-reduced-motion media query",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC"},F:{"1":"mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB fC gC hC iC 0B OC jC 1B"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD GD HD DC"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:5,C:"prefers-reduced-motion media query",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/progress.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/progress.js
    index 65bdc3dc089ded..2e30b15553987e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/progress.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/progress.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D"},E:{"1":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m yB LC fC zB","2":"F bC cC dC eC"},G:{"1":"E kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC","132":"jC"},H:{"1":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"1":"D A"},K:{"1":"B C q yB LC zB","2":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"progress element",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E"},E:{"1":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 0B OC jC 1B","2":"G fC gC hC iC"},G:{"1":"F oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC","132":"nC"},H:{"1":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"1":"E A"},K:{"1":"B C s 0B OC 1B","2":"A"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"progress element",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/promise-finally.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/promise-finally.js
    index 80702120b6e3b8..2683e1f33c5720 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/promise-finally.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/promise-finally.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N"},C:{"1":"0 1 2 3 fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB QC RC"},D:{"1":"0 1 2 3 iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB"},E:{"1":"C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B SC 9B TC UC VC WC AC"},F:{"1":"XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB bC cC dC eC yB LC fC zB"},G:{"1":"qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:6,C:"Promise.prototype.finally",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N"},C:{"1":"0 1 2 3 4 5 6 7 iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB"},E:{"1":"C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B UC CC VC WC XC YC DC"},F:{"1":"aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB fC gC hC iC 0B OC jC 1B"},G:{"1":"uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:6,C:"Promise.prototype.finally",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/promises.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/promises.js
    index a33826ab81d477..5b753bbaf0c6db 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/promises.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/promises.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"8":"J D E F A B NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","4":"AB BB","8":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p QC RC"},D:{"1":"0 1 2 3 GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","4":"FB","8":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB"},E:{"1":"E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","8":"4 I J D SC 9B TC UC"},F:{"1":"6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","4":"5","8":"F B C G M N O bC cC dC eC yB LC fC zB"},G:{"1":"E kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","8":"9B gC MC hC iC jC"},H:{"8":"1C"},I:{"1":"H 7C","8":"3B I 2C 3C 4C 5C MC 6C"},J:{"8":"D A"},K:{"1":"q","8":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"8":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"Promises",D:true};
    +module.exports={A:{A:{"8":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","4":"DB EB","8":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","4":"IB","8":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB"},E:{"1":"F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","8":"8 I J E UC CC VC WC"},F:{"1":"o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","4":"9","8":"G B C H M N O fC gC hC iC 0B OC jC 1B"},G:{"1":"F oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","8":"CC kC PC lC mC nC"},H:{"8":"6C"},I:{"1":"D CD","8":"5B I 7C 8C 9C AD PC BD"},J:{"8":"E A"},K:{"1":"s","8":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"8":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"Promises",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/proximity.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/proximity.js
    index a7d947d947bfcc..cd2d13c6c42c65 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/proximity.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/proximity.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K L QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"1":"LD MD"}},B:4,C:"Proximity API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K L SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"1":"QD RD"}},B:4,C:"Proximity API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/proxy.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/proxy.js
    index 4960dab400cd28..120885bb623184 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/proxy.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/proxy.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K L G M N QC RC"},D:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A B C K L G M N O LB MB NB OB PB QB RB SB TB UB VB","66":"5 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC WC"},F:{"1":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"8 9 F B C AB BB CB DB EB FB GB HB IB bC cC dC eC yB LC fC zB","66":"5 6 7 G M N O n o p"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"Proxy object",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K L H M N SC TC"},D:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A B C K L H M N O OB PB QB RB SB TB UB VB WB XB YB","66":"9 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC YC"},F:{"1":"MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C BB CB DB EB FB GB HB IB JB KB LB fC gC hC iC 0B OC jC 1B","66":"9 H M N O o p q r AB"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"Proxy object",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/publickeypinning.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/publickeypinning.js
    index 23da88e6b312a9..01d14b84817884 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/publickeypinning.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/publickeypinning.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB","2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB","2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB","2":"5 F B C G M N O lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","4":"6","16":"7 n o p"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"I 8C 9C AD BD CD AC","2":"n o p DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"1":"LD","2":"MD"}},B:6,C:"HTTP Public Key Pinning",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB","2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB","2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB","2":"9 G B C H M N O oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","4":"r","16":"o p q AB"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"I DD ED FD GD HD DC","2":"o p q r ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"1":"QD","2":"RD"}},B:6,C:"HTTP Public Key Pinning",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/push-api.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/push-api.js
    index 2364b50b606417..966b136c78d44d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/push-api.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/push-api.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"N O","2":"C K L G M","257":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB QC RC","257":"0 1 2 3 RB TB UB VB WB XB YB aB bB cB dB eB fB 4B 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","1281":"SB ZB gB"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB","257":"0 1 2 3 XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","388":"RB SB TB UB VB WB"},E:{"2":"4 I J SC 9B TC UC","514":"D E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B","2564":"EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB bC cC dC eC yB LC fC zB","16":"KB LB MB NB OB","257":"PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC","4100":"HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"2":"KD"},S:{"257":"LD MD"}},B:5,C:"Push API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"N O","2":"C K L H M","257":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB SC TC","257":"0 1 2 3 4 5 6 7 UB WB XB YB ZB aB bB dB eB fB gB hB iB 6B 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","1281":"VB cB jB"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB","257":"0 1 2 3 4 5 6 7 aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","388":"UB VB WB XB YB ZB"},E:{"2":"8 I J UC CC VC WC","514":"E F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B","2564":"HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB fC gC hC iC 0B OC jC 1B","16":"NB OB PB QB RB","257":"SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC","4100":"KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"2":"PD"},S:{"257":"QD RD"}},B:5,C:"Push API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/queryselector.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/queryselector.js
    index a00aa9342a49c1..5b9410cc6d9d2f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/queryselector.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/queryselector.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"NC","8":"J D","132":"E"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","8":"OC 3B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m cC dC eC yB LC fC zB","8":"F bC"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"querySelector/querySelectorAll",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"QC","8":"J E","132":"F"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","8":"RC 5B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n gC hC iC 0B OC jC 1B","8":"G fC"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"querySelector/querySelectorAll",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/readonly-attr.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/readonly-attr.js
    index 7fc7a4a26be33c..fa267281dbd46d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/readonly-attr.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/readonly-attr.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"J D E F A B","16":"NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","16":"OC 3B QC RC"},D:{"1":"0 1 2 3 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 5 6 7 8 I J D E F A B C K L G M N O n o p"},E:{"1":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"4 I SC 9B"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","16":"F bC","132":"B C cC dC eC yB LC fC zB"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC MC hC iC"},H:{"1":"1C"},I:{"1":"3B I H 4C 5C MC 6C 7C","16":"2C 3C"},J:{"1":"D A"},K:{"1":"q","132":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"257":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"readonly attribute of input and textarea elements",D:true};
    +module.exports={A:{A:{"1":"J E F G A B","16":"QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 9 I J E F G A B C K L H M N O o p q r AB BB"},E:{"1":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"8 I UC CC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","16":"G fC","132":"B C gC hC iC 0B OC jC 1B"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC PC lC mC"},H:{"1":"6C"},I:{"1":"5B I D 9C AD PC BD CD","16":"7C 8C"},J:{"1":"E A"},K:{"1":"s","132":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"257":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"readonly attribute of input and textarea elements",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/referrer-policy.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/referrer-policy.js
    index 088adb153bed40..9144c583fe1dc5 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/referrer-policy.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/referrer-policy.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A NC","132":"B"},B:{"1":"0 1 2 3 U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","132":"C K L G M N O","516":"P Q R S T"},C:{"1":"W X Y Z a","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB QC RC","516":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V","2049":"0 1 2 3 b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"0 1 2 3 U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 I J D E F A B C K L G M N O n","260":"6 7 8 9 o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB","516":"5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T"},E:{"2":"4 I J D SC 9B TC UC","132":"E F A B VC WC AC","516":"C yB zB","1025":"G YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","1540":"K L BC XC"},F:{"1":"q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","516":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB"},G:{"2":"9B gC MC hC iC jC","132":"E kC lC mC nC oC pC qC","516":"rC sC tC uC","1025":"zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","1540":"vC wC xC yC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2049":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p GD HD 1B 2B ID JD","2":"I","516":"8C 9C AD BD CD AC DD ED FD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"516":"LD MD"}},B:4,C:"Referrer Policy",D:true};
    +module.exports={A:{A:{"2":"J E F G A QC","132":"B"},B:{"1":"0 1 2 3 4 5 6 7 U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","132":"C K L H M N O","516":"P Q R S T"},C:{"1":"W X Y Z a","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB SC TC","516":"MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V","2049":"0 1 2 3 4 5 6 7 b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"1":"0 1 2 3 4 5 6 7 U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o","260":"p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB","516":"7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T"},E:{"2":"8 I J E UC CC VC WC","132":"F G A B XC YC DC","516":"C 0B 1B","1025":"H aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","1540":"K L EC ZC"},F:{"1":"s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","516":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB"},G:{"2":"CC kC PC lC mC nC","132":"F oC pC qC rC sC tC uC","516":"vC wC xC yC","1025":"3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","1540":"zC 0C 1C 2C"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2049":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r LD MD 3B 4B ND OD","2":"I","516":"DD ED FD GD HD DC ID JD KD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"516":"QD RD"}},B:4,C:"Referrer Policy",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/registerprotocolhandler.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/registerprotocolhandler.js
    index 4e9d035a9489a5..60ab943c66a812 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/registerprotocolhandler.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/registerprotocolhandler.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O","129":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","2":"OC"},D:{"2":"4 I J D E F A B C","129":"0 1 2 3 5 6 7 8 9 K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"F B bC cC dC eC yB LC","129":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D","129":"A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:1,C:"Custom protocol handling",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O","129":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","2":"RC"},D:{"2":"8 I J E F G A B C","129":"0 1 2 3 4 5 6 7 9 K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"G B fC gC hC iC 0B OC","129":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E","129":"A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:1,C:"Custom protocol handling",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rel-noopener.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rel-noopener.js
    index f43e822967c7b3..7cde42b33a94fe 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rel-noopener.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rel-noopener.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB QC RC"},D:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC"},F:{"1":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB bC cC dC eC yB LC fC zB"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:1,C:"rel=noopener",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC"},F:{"1":"MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB fC gC hC iC 0B OC jC 1B"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:1,C:"rel=noopener",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rel-noreferrer.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rel-noreferrer.js
    index c6857f9904b866..20dc31f87485da 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rel-noreferrer.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rel-noreferrer.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A NC","132":"B"},B:{"1":"0 1 2 3 K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","16":"C"},C:{"1":"0 1 2 3 GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 I J D E F A B C K L G"},E:{"1":"4 J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B"},H:{"2":"1C"},I:{"1":"3B I H 4C 5C MC 6C 7C","16":"2C 3C"},J:{"1":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Link type \"noreferrer\"",D:true};
    +module.exports={A:{A:{"2":"J E F G A QC","132":"B"},B:{"1":"0 1 2 3 4 5 6 7 K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","16":"C"},C:{"1":"0 1 2 3 4 5 6 7 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 I J E F G A B C K L H"},E:{"1":"8 J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC"},H:{"2":"6C"},I:{"1":"5B I D 9C AD PC BD CD","16":"7C 8C"},J:{"1":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Link type \"noreferrer\"",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rellist.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rellist.js
    index b014b5607fd3d2..74f6014dcb8711 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rellist.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rellist.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M","132":"N"},C:{"1":"0 1 2 3 DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB QC RC"},D:{"1":"0 1 2 3 kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB","132":"XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E SC 9B TC UC VC"},F:{"1":"ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB bC cC dC eC yB LC fC zB","132":"KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p CD AC DD ED FD GD HD 1B 2B ID JD","2":"I","132":"8C 9C AD BD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"relList (DOMTokenList)",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M","132":"N"},C:{"1":"0 1 2 3 4 5 6 7 GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB","132":"aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F UC CC VC WC XC"},F:{"1":"cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB fC gC hC iC 0B OC jC 1B","132":"NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r HD DC ID JD KD LD MD 3B 4B ND OD","2":"I","132":"DD ED FD GD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"relList (DOMTokenList)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rem.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rem.js
    index 6bddbb37254dff..4c92ff192aa9ba 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rem.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rem.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"B","2":"J D E NC","132":"F A"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC RC","2":"OC 3B QC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m fC zB","2":"F B bC cC dC eC yB LC"},G:{"1":"E gC MC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B","260":"hC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"C q zB","2":"A B yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"rem (root em) units",D:true};
    +module.exports={A:{A:{"1":"B","2":"J E F QC","132":"G A"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC TC","2":"RC 5B SC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n jC 1B","2":"G B fC gC hC iC 0B OC"},G:{"1":"F kC PC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC","260":"lC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"C s 1B","2":"A B 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"rem (root em) units",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/requestanimationframe.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/requestanimationframe.js
    index cc2bcea93eea27..b5637dc1800e73 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/requestanimationframe.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/requestanimationframe.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 6 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC","33":"5 B C K L G M N O n o p","164":"4 I J D E F A"},D:{"1":"0 1 2 3 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F","33":"6 p","164":"5 O n o","420":"A B C K L G M N"},E:{"1":"D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC","33":"J"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC","33":"iC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"1":"A","2":"D"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"requestAnimationFrame",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC","33":"9 B C K L H M N O o p q","164":"8 I J E F G A"},D:{"1":"0 1 2 3 4 5 6 7 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G","33":"q r","164":"9 O o p","420":"A B C K L H M N"},E:{"1":"E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC","33":"J"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC","33":"mC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"1":"A","2":"E"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"requestAnimationFrame",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/requestidlecallback.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/requestidlecallback.js
    index 9a18242a5b17cb..6518dd5e8ea4e0 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/requestidlecallback.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/requestidlecallback.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB QC RC","194":"aB bB"},D:{"1":"0 1 2 3 UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB"},E:{"1":"aC","2":"4 I J D E F A B C K SC 9B TC UC VC WC AC yB zB","322":"L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC"},F:{"1":"HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC","322":"wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:5,C:"requestIdleCallback",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB SC TC","194":"dB eB"},D:{"1":"0 1 2 3 4 5 6 7 XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB"},E:{"1":"eC","2":"8 I J E F G A B C K UC CC VC WC XC YC DC 0B 1B","322":"L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC"},F:{"1":"KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC","322":"0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:5,C:"requestIdleCallback",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/resizeobserver.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/resizeobserver.js
    index 8a144707c7e8be..9e889584d6f895 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/resizeobserver.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/resizeobserver.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB QC RC"},D:{"1":"0 1 2 3 jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB","194":"bB cB dB eB fB 4B gB 5B hB iB"},E:{"1":"L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C SC 9B TC UC VC WC AC yB zB","66":"K"},F:{"1":"ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB bC cC dC eC yB LC fC zB","194":"OB PB QB RB SB TB UB VB WB XB YB"},G:{"1":"wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD BD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:5,C:"Resize Observer",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB","194":"eB fB gB hB iB 6B jB 7B kB lB"},E:{"1":"L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C UC CC VC WC XC YC DC 0B 1B","66":"K"},F:{"1":"cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB fC gC hC iC 0B OC jC 1B","194":"RB SB TB UB VB WB XB YB ZB aB bB"},G:{"1":"0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD GD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:5,C:"Resize Observer",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/resource-timing.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/resource-timing.js
    index 727aa51abf2b82..4f5e5f3d349d44 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/resource-timing.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/resource-timing.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB QC RC","194":"EB FB GB HB"},D:{"1":"0 1 2 3 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 I J D E F A B C K L G M N O n o p"},E:{"1":"C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC AC","260":"B"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"Resource Timing",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB SC TC","194":"HB IB JB KB"},D:{"1":"0 1 2 3 4 5 6 7 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB"},E:{"1":"C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC DC","260":"B"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"Resource Timing",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rest-parameters.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rest-parameters.js
    index b79a7a03f0d328..d2789a7eb446cf 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rest-parameters.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rest-parameters.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K L QC RC"},D:{"1":"0 1 2 3 UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB","194":"RB SB TB"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC WC"},F:{"1":"HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB bC cC dC eC yB LC fC zB","194":"EB FB GB"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"Rest parameters",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K L SC TC"},D:{"1":"0 1 2 3 4 5 6 7 XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB","194":"UB VB WB"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC YC"},F:{"1":"KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB fC gC hC iC 0B OC jC 1B","194":"HB IB JB"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"Rest parameters",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rtcpeerconnection.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rtcpeerconnection.js
    index ff05d69fc807ec..05020421c98b8e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rtcpeerconnection.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/rtcpeerconnection.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L","260":"G M N O"},C:{"1":"0 1 2 3 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 OC 3B I J D E F A B C K L G M N O n o QC RC","33":"6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB"},D:{"1":"0 1 2 3 dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 I J D E F A B C K L G M N O n o p","33":"6 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB"},E:{"1":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC AC"},F:{"1":"QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C G M N bC cC dC eC yB LC fC zB","33":"5 6 7 8 9 O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D","130":"A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"33":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"WebRTC Peer-to-peer connections",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L","260":"H M N O"},C:{"1":"0 1 2 3 4 5 6 7 UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p SC TC","33":"q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB"},D:{"1":"0 1 2 3 4 5 6 7 gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q","33":"r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB"},E:{"1":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC DC"},F:{"1":"TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C H M N fC gC hC iC 0B OC jC 1B","33":"9 O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB"},G:{"1":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E","130":"A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"33":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"WebRTC Peer-to-peer connections",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ruby.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ruby.js
    index 0812c3df1cf391..c6ff2c12210099 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ruby.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ruby.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"4":"J D E NC","132":"F A B"},B:{"4":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","8":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB QC RC"},D:{"4":"0 1 2 3 4 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","8":"I"},E:{"4":"4 J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","8":"I SC 9B"},F:{"4":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","8":"F B C bC cC dC eC yB LC fC zB"},G:{"4":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","8":"9B gC MC"},H:{"8":"1C"},I:{"4":"3B I H 5C MC 6C 7C","8":"2C 3C 4C"},J:{"4":"A","8":"D"},K:{"4":"q","8":"A B C yB LC zB"},L:{"4":"H"},M:{"1":"xB"},N:{"132":"A B"},O:{"4":"0B"},P:{"4":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"4":"BC"},R:{"4":"KD"},S:{"1":"LD MD"}},B:1,C:"Ruby annotation",D:true};
    +module.exports={A:{A:{"4":"J E F QC","132":"G A B"},B:{"4":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","8":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB SC TC"},D:{"4":"0 1 2 3 4 5 6 7 8 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","8":"I"},E:{"4":"8 J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","8":"I UC CC"},F:{"4":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","8":"G B C fC gC hC iC 0B OC jC 1B"},G:{"4":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","8":"CC kC PC"},H:{"8":"6C"},I:{"4":"5B I D AD PC BD CD","8":"7C 8C 9C"},J:{"4":"A","8":"E"},K:{"4":"s","8":"A B C 0B OC 1B"},L:{"4":"D"},M:{"1":"D"},N:{"132":"A B"},O:{"4":"2B"},P:{"4":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"4":"EC"},R:{"4":"PD"},S:{"1":"QD RD"}},B:1,C:"Ruby annotation",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/run-in.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/run-in.js
    index cd5193c6aaed71..90c0aa4a9f7025 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/run-in.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/run-in.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"E F A B","2":"J D NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB","2":"0 1 2 3 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 J TC","2":"D E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"UC","129":"I SC 9B"},F:{"1":"F B C G M N O bC cC dC eC yB LC fC zB","2":"5 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"1":"gC MC hC iC jC","2":"E kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","129":"9B"},H:{"1":"1C"},I:{"1":"3B I 2C 3C 4C 5C MC 6C","2":"H 7C"},J:{"1":"D A"},K:{"1":"A B C yB LC zB","2":"q"},L:{"2":"H"},M:{"2":"xB"},N:{"1":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:4,C:"display: run-in",D:true};
    +module.exports={A:{A:{"1":"F G A B","2":"J E QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB","2":"0 1 2 3 4 5 6 7 IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 J VC","2":"E F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"WC","129":"I UC CC"},F:{"1":"G B C H M N O fC gC hC iC 0B OC jC 1B","2":"9 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"1":"kC PC lC mC nC","2":"F oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","129":"CC"},H:{"1":"6C"},I:{"1":"5B I 7C 8C 9C AD PC BD","2":"D CD"},J:{"1":"E A"},K:{"1":"A B C 0B OC 1B","2":"s"},L:{"2":"D"},M:{"2":"D"},N:{"1":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:4,C:"display: run-in",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/same-site-cookie-attribute.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/same-site-cookie-attribute.js
    index 95e384ef21d638..811b1585b067cc 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/same-site-cookie-attribute.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/same-site-cookie-attribute.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A NC","388":"B"},B:{"1":"O P Q R S T U","2":"C K L G","129":"M N","513":"0 1 2 3 V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B QC RC"},D:{"1":"YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB","513":"0 1 2 3 Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"G YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B SC 9B TC UC VC WC AC yB","2052":"L XC","3076":"C K zB BC"},F:{"1":"MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB bC cC dC eC yB LC fC zB","513":"qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"1":"tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC","2052":"rC sC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C yB LC zB","513":"q"},L:{"513":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"16":"BC"},R:{"513":"KD"},S:{"1":"MD","2":"LD"}},B:6,C:"'SameSite' cookie attribute",D:true};
    +module.exports={A:{A:{"2":"J E F G A QC","388":"B"},B:{"1":"O P Q R S T U","2":"C K L H","129":"M N","513":"0 1 2 3 4 5 6 7 V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B SC TC"},D:{"1":"bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB","513":"0 1 2 3 4 5 6 7 Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"H aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B UC CC VC WC XC YC DC 0B","2052":"L ZC","3076":"C K 1B EC"},F:{"1":"PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB fC gC hC iC 0B OC jC 1B","513":"tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"1":"xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC","2052":"vC wC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C 0B OC 1B","513":"s"},L:{"513":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"16":"EC"},R:{"513":"PD"},S:{"1":"RD","2":"QD"}},B:6,C:"'SameSite' cookie attribute",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/screen-orientation.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/screen-orientation.js
    index dcc42367d484e6..29755b1d11be1b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/screen-orientation.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/screen-orientation.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A NC","164":"B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","36":"C K L G M N O"},C:{"1":"0 1 2 3 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K L G M N QC RC","36":"5 6 7 8 9 O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB"},D:{"1":"0 1 2 3 LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB"},E:{"1":"HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC"},F:{"1":"8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 F B C G M N O n o p bC cC dC eC yB LC fC zB"},G:{"1":"HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A","36":"B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","16":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"Screen Orientation",D:true};
    +module.exports={A:{A:{"2":"J E F G A QC","164":"B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","36":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K L H M N SC TC","36":"9 O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB"},D:{"1":"0 1 2 3 4 5 6 7 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB"},E:{"1":"KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC"},F:{"1":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB fC gC hC iC 0B OC jC 1B"},G:{"1":"KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A","36":"B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","16":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"Screen Orientation",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/script-async.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/script-async.js
    index 9669df86dfe298..10c57f0aaf20ff 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/script-async.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/script-async.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC RC","2":"OC 3B QC"},D:{"1":"0 1 2 3 5 6 7 8 9 E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D"},E:{"1":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B","132":"4"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC"},H:{"2":"1C"},I:{"1":"3B I H 5C MC 6C 7C","2":"2C 3C 4C"},J:{"1":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"async attribute for external scripts",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC TC","2":"RC 5B SC"},D:{"1":"0 1 2 3 4 5 6 7 9 F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E"},E:{"1":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC","132":"8"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC"},H:{"2":"6C"},I:{"1":"5B I D AD PC BD CD","2":"7C 8C 9C"},J:{"1":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"async attribute for external scripts",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/script-defer.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/script-defer.js
    index daa383036ab956..a6a04a320409bc 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/script-defer.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/script-defer.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","132":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B","257":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D"},E:{"1":"4 J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC"},H:{"2":"1C"},I:{"1":"3B I H 5C MC 6C 7C","2":"2C 3C 4C"},J:{"1":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"defer attribute for external scripts",D:true};
    +module.exports={A:{A:{"1":"A B","132":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B","257":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E"},E:{"1":"8 J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC"},H:{"2":"6C"},I:{"1":"5B I D AD PC BD CD","2":"7C 8C 9C"},J:{"1":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"defer attribute for external scripts",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/scrollintoview.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/scrollintoview.js
    index d487099c0b6017..54c53413bba378 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/scrollintoview.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/scrollintoview.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D NC","132":"E F A B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","132":"C K L G M N O"},C:{"1":"0 1 2 3 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","132":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB QC RC"},D:{"1":"0 1 2 3 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","132":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB"},E:{"1":"1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B","132":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC"},F:{"1":"VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F bC cC dC eC","16":"B yB LC","132":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB fC zB"},G:{"1":"1B EC FC GC HC IC JC 2B KC","16":"9B gC MC","132":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C"},H:{"2":"1C"},I:{"1":"H","16":"2C 3C","132":"3B I 4C 5C MC 6C 7C"},J:{"132":"D A"},K:{"1":"q","132":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"132":"A B"},O:{"1":"0B"},P:{"132":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"scrollIntoView",D:true};
    +module.exports={A:{A:{"2":"J E QC","132":"F G A B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","132":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","132":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","132":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB"},E:{"1":"3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC","132":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC"},F:{"1":"YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G fC gC hC iC","16":"B 0B OC","132":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB jC 1B"},G:{"1":"3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC PC","132":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C"},H:{"2":"6C"},I:{"1":"D","16":"7C 8C","132":"5B I 9C AD PC BD CD"},J:{"132":"E A"},K:{"1":"s","132":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"132":"A B"},O:{"1":"2B"},P:{"132":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"scrollIntoView",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/scrollintoviewifneeded.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/scrollintoviewifneeded.js
    index bffe3a93553bed..4c24658a2726a4 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/scrollintoviewifneeded.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/scrollintoviewifneeded.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 I J D E F A B C K L"},E:{"1":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"4 I SC 9B"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC MC"},H:{"2":"1C"},I:{"1":"3B I H 4C 5C MC 6C 7C","16":"2C 3C"},J:{"1":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:7,C:"Element.scrollIntoViewIfNeeded()",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 I J E F G A B C K L"},E:{"1":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"8 I UC CC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC PC"},H:{"2":"6C"},I:{"1":"5B I D 9C AD PC BD CD","16":"7C 8C"},J:{"1":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:7,C:"Element.scrollIntoViewIfNeeded()",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sdch.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sdch.js
    index fedd265826f19f..b837d0a694f8c2 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sdch.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sdch.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB","2":"0 1 2 3 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB","2":"F B C q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:6,C:"SDCH Accept-Encoding/Content-Encoding",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB","2":"0 1 2 3 4 5 6 7 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB","2":"G B C s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:6,C:"SDCH Accept-Encoding/Content-Encoding",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/selection-api.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/selection-api.js
    index 654968b7efd569..cae03ca6c31a75 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/selection-api.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/selection-api.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","16":"NC","260":"J D E"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","132":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QC RC","2180":"QB RB SB TB UB VB WB XB YB"},D:{"1":"0 1 2 3 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 I J D E F A B C K L"},E:{"1":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"4 I SC 9B"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","132":"F B C bC cC dC eC yB LC fC zB"},G:{"16":"MC","132":"9B gC","516":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H 6C 7C","16":"3B I 2C 3C 4C 5C","1025":"MC"},J:{"1":"A","16":"D"},K:{"1":"q","16":"A B C yB LC","132":"zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","16":"A"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2180":"LD"}},B:5,C:"Selection API",D:true};
    +module.exports={A:{A:{"1":"G A B","16":"QC","260":"J E F"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","132":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB SC TC","2180":"TB UB VB WB XB YB ZB aB bB"},D:{"1":"0 1 2 3 4 5 6 7 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 I J E F G A B C K L"},E:{"1":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"8 I UC CC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","132":"G B C fC gC hC iC 0B OC jC 1B"},G:{"16":"PC","132":"CC kC","516":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D BD CD","16":"5B I 7C 8C 9C AD","1025":"PC"},J:{"1":"A","16":"E"},K:{"1":"s","16":"A B C 0B OC","132":"1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","16":"A"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2180":"QD"}},B:5,C:"Selection API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/server-timing.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/server-timing.js
    index f004a041694417..41079d8aaebb76 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/server-timing.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/server-timing.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB QC RC"},D:{"1":"0 1 2 3 kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B","196":"gB 5B hB iB","324":"jB"},E:{"2":"4 I J D E F A B C SC 9B TC UC VC WC AC yB","516":"K L G zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:5,C:"Server Timing",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B","196":"jB 7B kB lB","324":"mB"},E:{"2":"8 I J E F G A B C UC CC VC WC XC YC DC 0B","516":"K L H 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:5,C:"Server Timing",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/serviceworkers.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/serviceworkers.js
    index 9e4c5ae346c11f..74dd5fb89d6fce 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/serviceworkers.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/serviceworkers.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L","322":"G M"},C:{"1":"0 1 2 3 RB TB UB VB WB XB YB aB bB cB dB eB fB 4B 5B hB iB jB kB lB mB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB QC RC","194":"GB HB IB JB KB LB MB NB OB PB QB","513":"SB ZB gB nB"},D:{"1":"0 1 2 3 SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB","4":"NB OB PB QB RB"},E:{"1":"C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B SC 9B TC UC VC WC AC"},F:{"1":"FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p bC cC dC eC yB LC fC zB","4":"AB BB CB DB EB"},G:{"1":"qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC 6C 7C","4":"H"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:4,C:"Service Workers",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L","322":"H M"},C:{"1":"0 1 2 3 4 5 6 7 UB WB XB YB ZB aB bB dB eB fB gB hB iB 6B 7B kB lB mB nB oB pB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB SC TC","194":"JB KB LB MB NB OB PB QB RB SB TB","513":"VB cB jB qB"},D:{"1":"0 1 2 3 4 5 6 7 VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB","4":"QB RB SB TB UB"},E:{"1":"C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B UC CC VC WC XC YC DC"},F:{"1":"IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB fC gC hC iC 0B OC jC 1B","4":"DB EB FB GB HB"},G:{"1":"uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC BD CD","4":"D"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:4,C:"Service Workers",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/setimmediate.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/setimmediate.js
    index 0596aee846da53..4742bebaf5828c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/setimmediate.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/setimmediate.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"C K L G M N O","2":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"1":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:7,C:"Efficient Script Yielding: setImmediate()",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"C K L H M N O","2":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"1":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:7,C:"Efficient Script Yielding: setImmediate()",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/shadowdom.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/shadowdom.js
    index 6fd372d808147f..9c80487e19e341 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/shadowdom.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/shadowdom.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"P","2":"0 1 2 3 C K L G M N O Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","66":"CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB"},D:{"1":"IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P","2":"0 1 2 3 4 5 6 7 I J D E F A B C K L G M N O n o p Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","33":"8 9 AB BB CB DB EB FB GB HB"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB","2":"F B C mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","33":"5 G M N O n o"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC","33":"6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"8C 9C AD BD CD AC DD ED","2":"n o p FD GD HD 1B 2B ID JD","33":"I"},Q:{"1":"BC"},R:{"2":"KD"},S:{"1":"LD","2":"MD"}},B:7,C:"Shadow DOM (deprecated V0 spec)",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"P","2":"0 1 2 3 4 5 6 7 C K L H M N O Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","66":"FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB"},D:{"1":"LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P","2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","33":"BB CB DB EB FB GB HB IB JB KB"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB","2":"G B C pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","33":"9 H M N O o p"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC","33":"BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"DD ED FD GD HD DC ID JD","2":"o p q r KD LD MD 3B 4B ND OD","33":"I"},Q:{"1":"EC"},R:{"2":"PD"},S:{"1":"QD","2":"RD"}},B:7,C:"Shadow DOM (deprecated V0 spec)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/shadowdomv1.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/shadowdomv1.js
    index 88d1dd67fd1277..a2004d47e7a4d2 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/shadowdomv1.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/shadowdomv1.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB QC RC","322":"fB","578":"4B gB 5B hB"},D:{"1":"0 1 2 3 aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB"},E:{"1":"A B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC WC"},F:{"1":"NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB bC cC dC eC yB LC fC zB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC","132":"nC oC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I","4":"8C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:5,C:"Shadow DOM (V1)",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB SC TC","322":"iB","578":"6B jB 7B kB"},D:{"1":"0 1 2 3 4 5 6 7 dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB"},E:{"1":"A B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC YC"},F:{"1":"QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB fC gC hC iC 0B OC jC 1B"},G:{"1":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC","132":"rC sC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I","4":"DD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:5,C:"Shadow DOM (V1)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sharedarraybuffer.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sharedarraybuffer.js
    index 4020e65e1de863..1345b347e394e5 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sharedarraybuffer.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sharedarraybuffer.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"P Q R S T U V W X Y Z","2":"C K L G","194":"M N O","513":"0 1 2 3 a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB QC RC","194":"eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q","450":"sB tB uB vB wB","513":"0 1 2 3 P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B","194":"gB 5B hB iB jB kB lB mB","513":"0 1 2 3 a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A SC 9B TC UC VC WC","194":"B C K L G AC yB zB BC XC YC","513":"CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"jB kB lB mB nB oB pB qB rB q sB tB uB vB","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB bC cC dC eC yB LC fC zB","194":"UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB","513":"wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC","194":"oC pC qC rC sC tC uC vC wC xC yC zC","513":"CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C yB LC zB","513":"q"},L:{"513":"H"},M:{"513":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"2":"I 8C 9C AD BD CD AC DD ED FD GD","513":"n o p HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"513":"KD"},S:{"2":"LD","513":"MD"}},B:6,C:"Shared Array Buffer",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"P Q R S T U V W X Y Z","2":"C K L H","194":"M N O","513":"0 1 2 3 4 5 6 7 a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB SC TC","194":"hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s","450":"vB wB xB yB zB","513":"0 1 2 3 4 5 6 7 P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"1":"qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B","194":"jB 7B kB lB mB nB oB pB","513":"0 1 2 3 4 5 6 7 a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A UC CC VC WC XC YC","194":"B C K L H DC 0B 1B EC ZC aC","513":"FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"mB nB oB pB qB rB sB tB uB s vB wB xB yB","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB fC gC hC iC 0B OC jC 1B","194":"XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB","513":"zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC","194":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C","513":"FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C 0B OC 1B","513":"s"},L:{"513":"D"},M:{"513":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"2":"I DD ED FD GD HD DC ID JD KD LD","513":"o p q r MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"513":"PD"},S:{"2":"QD","513":"RD"}},B:6,C:"Shared Array Buffer",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sharedworkers.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sharedworkers.js
    index 7cff8a1556fb0e..23fef9e1c63fc0 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sharedworkers.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sharedworkers.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 J TC 1B EC FC GC HC IC JC 2B KC aC","2":"I D E F A B C K L G SC 9B UC VC WC AC yB zB BC XC YC CC DC 0B ZC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m eC yB LC fC zB","2":"F bC cC dC"},G:{"1":"hC iC 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"B C yB LC zB","2":"q","16":"A"},L:{"2":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"I","2":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"1":"LD MD"}},B:1,C:"Shared Web Workers",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 J VC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I E F G A B C K L H UC CC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n iC 0B OC jC 1B","2":"G fC gC hC"},G:{"1":"lC mC 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"B C 0B OC 1B","2":"s","16":"A"},L:{"2":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"I","2":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"1":"QD RD"}},B:1,C:"Shared Web Workers",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sni.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sni.js
    index 88028b762b02f4..271817d461e12d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sni.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sni.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J NC","132":"D E"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B"},H:{"1":"1C"},I:{"1":"3B I H 5C MC 6C 7C","2":"2C 3C 4C"},J:{"1":"A","2":"D"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"Server Name Indication",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J QC","132":"E F"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC"},H:{"1":"6C"},I:{"1":"5B I D AD PC BD CD","2":"7C 8C 9C"},J:{"1":"A","2":"E"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"Server Name Indication",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/spdy.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/spdy.js
    index bcbd4558bc196c..77b7983d8779d4 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/spdy.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/spdy.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"B","2":"J D E F A NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"5 6 7 8 9 K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB","2":"0 1 2 3 4 OC 3B I J D E F A B C YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB","2":"0 1 2 3 YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"E F A B C WC AC yB","2":"4 I J D SC 9B TC UC VC","129":"K L G zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB PB RB zB","2":"F B C NB OB QB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC"},G:{"1":"E kC lC mC nC oC pC qC rC","2":"9B gC MC hC iC jC","257":"sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"3B I 5C MC 6C 7C","2":"H 2C 3C 4C"},J:{"2":"D A"},K:{"1":"zB","2":"A B C q yB LC"},L:{"2":"H"},M:{"2":"xB"},N:{"1":"B","2":"A"},O:{"2":"0B"},P:{"1":"I","2":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"1":"LD","2":"MD"}},B:7,C:"SPDY protocol",D:true};
    +module.exports={A:{A:{"1":"B","2":"J E F G A QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"9 K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB","2":"0 1 2 3 4 5 6 7 8 RC 5B I J E F G A B C bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB","2":"0 1 2 3 4 5 6 7 bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"F G A B C YC DC 0B","2":"8 I J E UC CC VC WC XC","129":"K L H 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB SB UB 1B","2":"G B C QB RB TB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC"},G:{"1":"F oC pC qC rC sC tC uC vC","2":"CC kC PC lC mC nC","257":"wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"5B I AD PC BD CD","2":"D 7C 8C 9C"},J:{"2":"E A"},K:{"1":"1B","2":"A B C s 0B OC"},L:{"2":"D"},M:{"2":"D"},N:{"1":"B","2":"A"},O:{"2":"2B"},P:{"1":"I","2":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"1":"QD","2":"RD"}},B:7,C:"SPDY protocol",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/speech-recognition.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/speech-recognition.js
    index ba9427c803b9a4..e723649b83e10a 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/speech-recognition.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/speech-recognition.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O","514":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"4 5 OC 3B I J D E F A B C K L G M N O n o QC RC","322":"0 1 2 3 6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"2":"4 5 6 7 I J D E F A B C K L G M N O n o p","164":"0 1 2 3 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L SC 9B TC UC VC WC AC yB zB BC","1060":"G XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p bC cC dC eC yB LC fC zB","514":"AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC","1060":"yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C yB LC zB","164":"q"},L:{"164":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"164":"0B"},P:{"164":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"164":"BC"},R:{"164":"KD"},S:{"322":"LD MD"}},B:7,C:"Speech Recognition API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O","514":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p SC TC","322":"0 1 2 3 4 5 6 7 q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB","164":"0 1 2 3 4 5 6 7 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L UC CC VC WC XC YC DC 0B 1B EC","1060":"H ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB fC gC hC iC 0B OC jC 1B","514":"DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C","1060":"2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C 0B OC 1B","164":"s"},L:{"164":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"164":"2B"},P:{"164":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"164":"EC"},R:{"164":"PD"},S:{"322":"QD RD"}},B:7,C:"Speech Recognition API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/speech-synthesis.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/speech-synthesis.js
    index 68a08a61686cc7..0fc887b114302a 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/speech-synthesis.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/speech-synthesis.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"L G M N O","2":"C K","257":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB QC RC","194":"EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB"},D:{"1":"GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB","257":"0 1 2 3 cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"D E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J SC 9B TC UC"},F:{"1":"AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB","2":"5 6 7 8 9 F B C G M N O n o p bC cC dC eC yB LC fC zB","257":"jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"2":"KD"},S:{"1":"LD MD"}},B:7,C:"Speech Synthesis API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"L H M N O","2":"C K","257":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB SC TC","194":"HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB"},D:{"1":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB","257":"0 1 2 3 4 5 6 7 fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"E F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J UC CC VC WC"},F:{"1":"DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB","2":"9 G B C H M N O o p q r AB BB CB fC gC hC iC 0B OC jC 1B","257":"mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"2":"PD"},S:{"1":"QD RD"}},B:7,C:"Speech Synthesis API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/spellcheck-attribute.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/spellcheck-attribute.js
    index 65edac457e31df..8141031379b854 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/spellcheck-attribute.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/spellcheck-attribute.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E"},E:{"1":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m dC eC yB LC fC zB","2":"F bC cC"},G:{"4":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"4":"1C"},I:{"4":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"A","4":"D"},K:{"4":"A B C q yB LC zB"},L:{"4":"H"},M:{"4":"xB"},N:{"4":"A B"},O:{"4":"0B"},P:{"4":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"4":"KD"},S:{"2":"LD MD"}},B:1,C:"Spellcheck attribute",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F"},E:{"1":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n hC iC 0B OC jC 1B","2":"G fC gC"},G:{"4":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"4":"6C"},I:{"4":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"A","4":"E"},K:{"4":"A B C s 0B OC 1B"},L:{"4":"D"},M:{"4":"D"},N:{"4":"A B"},O:{"4":"2B"},P:{"4":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"4":"PD"},S:{"2":"QD RD"}},B:1,C:"Spellcheck attribute",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sql-storage.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sql-storage.js
    index 3243f7a69f6ac5..c2aabced1b4c8d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sql-storage.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sql-storage.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"P Q R S T U V W X Y Z a b c d e f g h i j","2":"C K L G M N O","129":"k l m r s t u v w","385":"0 1 2 3 x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j","129":"k l m r s t u v w","385":"0 1 2 3 x y z H xB","897":"7B 8B"},E:{"1":"4 I J D E F A B C SC 9B TC UC VC WC AC yB zB","2":"K L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z dC eC yB LC fC zB","2":"F bC cC","257":"a b c d e f g h i j k l m"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC","2":"tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"3B I 2C 3C 4C 5C MC 6C 7C","257":"H"},J:{"1":"D A"},K:{"1":"B C yB LC zB","2":"A","257":"q"},L:{"257":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:7,C:"Web SQL Database",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"P Q R S T U V W X Y Z a b c d e f g h i j","2":"C K L H M N O","129":"k l m n t u v w x","385":"0 1 2 3 4 5 6 7 y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j","129":"k l m n t u v w x","385":"0 1 2 3 4 5 6 y z","897":"7 D 9B AC BC"},E:{"1":"8 I J E F G A B C UC CC VC WC XC YC DC 0B 1B","2":"K L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z hC iC 0B OC jC 1B","2":"G fC gC","257":"a b c d e f g h i j k l m n"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC","2":"xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"5B I 7C 8C 9C AD PC BD CD","257":"D"},J:{"1":"E A"},K:{"1":"B C 0B OC 1B","2":"A","257":"s"},L:{"257":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:7,C:"Web SQL Database",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/srcset.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/srcset.js
    index d1b1b55c9cc0cc..f4eeeecf3148b5 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/srcset.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/srcset.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","260":"C","514":"K L G"},C:{"1":"0 1 2 3 LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB QC RC","194":"FB GB HB IB JB KB"},D:{"1":"0 1 2 3 LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB","260":"HB IB JB KB"},E:{"2":"4 I J D SC 9B TC UC","260":"E VC","1028":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 F B C G M N O n bC cC dC eC yB LC fC zB","260":"6 7 o p"},G:{"2":"9B gC MC hC iC jC","260":"E kC","1028":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Srcset and sizes attributes",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","260":"C","514":"K L H"},C:{"1":"0 1 2 3 4 5 6 7 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB SC TC","194":"IB JB KB LB MB NB"},D:{"1":"0 1 2 3 4 5 6 7 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB","260":"KB LB MB NB"},E:{"2":"8 I J E UC CC VC WC","260":"F XC","1028":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o fC gC hC iC 0B OC jC 1B","260":"p q r AB"},G:{"2":"CC kC PC lC mC nC","260":"F oC","1028":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Srcset and sizes attributes",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/stream.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/stream.js
    index f788d496c64ee1..ad9130384086f2 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/stream.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/stream.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K L G M QC RC","129":"JB KB LB MB NB OB","420":"5 6 7 8 9 N O n o p AB BB CB DB EB FB GB HB IB"},D:{"1":"0 1 2 3 aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 I J D E F A B C K L G M N O n","420":"6 7 8 9 o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB"},E:{"1":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC AC"},F:{"1":"NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B G M N bC cC dC eC yB LC fC","420":"5 6 7 8 9 C O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC","513":"wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","1537":"pC qC rC sC tC uC vC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D","420":"A"},K:{"1":"q","2":"A B yB LC","420":"C zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","420":"I 8C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:4,C:"getUserMedia/Stream API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K L H M SC TC","129":"MB NB OB PB QB RB","420":"9 N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB"},D:{"1":"0 1 2 3 4 5 6 7 dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o","420":"p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB"},E:{"1":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC DC"},F:{"1":"QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B H M N fC gC hC iC 0B OC jC","420":"9 C O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC","513":"0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","1537":"tC uC vC wC xC yC zC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E","420":"A"},K:{"1":"s","2":"A B 0B OC","420":"C 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","420":"I DD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:4,C:"getUserMedia/Stream API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/streams.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/streams.js
    index 33131008b642d2..3c90400753fbfe 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/streams.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/streams.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A NC","130":"B"},B:{"1":"0 1 2 3 Y Z a b c d e f g h i j k l m r s t u v w x y z H","16":"C K","260":"L G","1028":"P Q R S T U V W X","5124":"M N O"},C:{"1":"0 1 2 3 l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB QC RC","5124":"j k","7172":"kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i","7746":"eB fB 4B gB 5B hB iB jB"},D:{"1":"0 1 2 3 Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB","260":"ZB aB bB cB dB eB fB","1028":"4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X"},E:{"2":"4 I J D E F SC 9B TC UC VC WC","1028":"G XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","3076":"A B C K L AC yB zB BC"},F:{"1":"uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB bC cC dC eC yB LC fC zB","260":"MB NB OB PB QB RB SB","1028":"TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC","16":"nC","1028":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p HD 1B 2B ID JD","2":"I 8C 9C","1028":"AD BD CD AC DD ED FD GD"},Q:{"1028":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:1,C:"Streams",D:true};
    +module.exports={A:{A:{"2":"J E F G A QC","130":"B"},B:{"1":"0 1 2 3 4 5 6 7 Y Z a b c d e f g h i j k l m n t u v w x y z D","16":"C K","260":"L H","1028":"P Q R S T U V W X","5124":"M N O"},C:{"1":"0 1 2 3 4 5 6 7 l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB SC TC","5124":"j k","7172":"nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i","7746":"hB iB 6B jB 7B kB lB mB"},D:{"1":"0 1 2 3 4 5 6 7 Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB","260":"cB dB eB fB gB hB iB","1028":"6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X"},E:{"2":"8 I J E F G UC CC VC WC XC YC","1028":"H ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","3076":"A B C K L DC 0B 1B EC"},F:{"1":"xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB fC gC hC iC 0B OC jC 1B","260":"PB QB RB SB TB UB VB","1028":"WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB"},G:{"2":"F CC kC PC lC mC nC oC pC qC","16":"rC","1028":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r MD 3B 4B ND OD","2":"I DD ED","1028":"FD GD HD DC ID JD KD LD"},Q:{"1028":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:1,C:"Streams",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/stricttransportsecurity.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/stricttransportsecurity.js
    index 02e970d7c6e432..8a6f26107b5cba 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/stricttransportsecurity.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/stricttransportsecurity.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A NC","129":"B"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"D E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J SC 9B TC UC"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"F B bC cC dC eC yB LC fC"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"1":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"Strict Transport Security",D:true};
    +module.exports={A:{A:{"2":"J E F G A QC","129":"B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"E F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J UC CC VC WC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"G B fC gC hC iC 0B OC jC"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"1":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"Strict Transport Security",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/style-scoped.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/style-scoped.js
    index 5e6dc5919b7a65..8eb91b3765481b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/style-scoped.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/style-scoped.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"6 7 8 9 o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB","2":"0 1 2 3 4 5 OC 3B I J D E F A B C K L G M N O n 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","322":"cB dB eB fB 4B gB"},D:{"2":"0 1 2 3 4 5 I J D E F A B C K L G M N O KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","194":"6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"1":"LD","2":"MD"}},B:7,C:"Scoped CSS",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB","2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","322":"fB gB hB iB 6B jB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","194":"o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"1":"QD","2":"RD"}},B:7,C:"Scoped CSS",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/subresource-bundling.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/subresource-bundling.js
    index 81e4a04d2abd14..4b6e94bb425780 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/subresource-bundling.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/subresource-bundling.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 r s t u v w x y z H","2":"C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:7,C:"Subresource Loading with Web Bundles",D:false};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 n t u v w x y z D","2":"C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:7,C:"Subresource Loading with Web Bundles",D:false};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/subresource-integrity.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/subresource-integrity.js
    index d9d21df33c23ba..e77c86f38b5547 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/subresource-integrity.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/subresource-integrity.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M"},C:{"1":"0 1 2 3 QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QC RC"},D:{"1":"0 1 2 3 SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB"},E:{"1":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC AC"},F:{"1":"FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB bC cC dC eC yB LC fC zB"},G:{"1":"qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC","194":"pC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"Subresource Integrity",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M"},C:{"1":"0 1 2 3 4 5 6 7 TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB"},E:{"1":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC DC"},F:{"1":"IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB fC gC hC iC 0B OC jC 1B"},G:{"1":"uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC","194":"tC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"Subresource Integrity",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-css.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-css.js
    index b7f5e8b345e891..81ccc029a41843 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-css.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-css.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","516":"C K L G"},C:{"1":"0 1 2 3 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC","260":"4 5 6 I J D E F A B C K L G M N O n o p"},D:{"1":"0 1 2 3 4 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","4":"I"},E:{"1":"4 J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC","132":"I 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","2":"F"},G:{"1":"E MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","132":"9B gC"},H:{"260":"1C"},I:{"1":"3B I H 5C MC 6C 7C","2":"2C 3C 4C"},J:{"1":"D A"},K:{"1":"q","260":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"SVG in CSS backgrounds",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","516":"C K L H"},C:{"1":"0 1 2 3 4 5 6 7 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC","260":"8 9 I J E F G A B C K L H M N O o p q r"},D:{"1":"0 1 2 3 4 5 6 7 8 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","4":"I"},E:{"1":"8 J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC","132":"I CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","2":"G"},G:{"1":"F PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","132":"CC kC"},H:{"260":"6C"},I:{"1":"5B I D AD PC BD CD","2":"7C 8C 9C"},J:{"1":"E A"},K:{"1":"s","260":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"SVG in CSS backgrounds",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-filters.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-filters.js
    index c8a382e6c4b02c..e86420312be5f3 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-filters.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-filters.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","2":"OC"},D:{"1":"0 1 2 3 5 6 7 8 9 E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"I","4":"4 J D"},E:{"1":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC"},H:{"1":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"1":"A","2":"D"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"SVG filters",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","2":"RC"},D:{"1":"0 1 2 3 4 5 6 7 9 F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"I","4":"8 J E"},E:{"1":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC"},H:{"1":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"1":"A","2":"E"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"SVG filters",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-fonts.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-fonts.js
    index 335de0cac4cd30..aa0d25582b5904 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-fonts.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-fonts.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"F A B NC","8":"J D E"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB","2":"0 1 2 3 YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","130":"LB MB NB OB PB QB RB SB TB UB VB WB XB"},E:{"1":"4 I J D E F A B C K L G 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC"},F:{"1":"5 6 7 F B C G M N O n o p bC cC dC eC yB LC fC zB","2":"KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","130":"8 9 AB BB CB DB EB FB GB HB IB JB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"258":"1C"},I:{"1":"3B I 5C MC 6C 7C","2":"H 2C 3C 4C"},J:{"1":"D A"},K:{"1":"A B C yB LC zB","2":"q"},L:{"130":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"I","130":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"130":"KD"},S:{"2":"LD MD"}},B:2,C:"SVG fonts",D:true};
    +module.exports={A:{A:{"2":"G A B QC","8":"J E F"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB","2":"0 1 2 3 4 5 6 7 bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","130":"OB PB QB RB SB TB UB VB WB XB YB ZB aB"},E:{"1":"8 I J E F G A B C K L H CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC"},F:{"1":"9 G B C H M N O o p q r AB fC gC hC iC 0B OC jC 1B","2":"NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","130":"BB CB DB EB FB GB HB IB JB KB LB MB"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"258":"6C"},I:{"1":"5B I AD PC BD CD","2":"D 7C 8C 9C"},J:{"1":"E A"},K:{"1":"A B C 0B OC 1B","2":"s"},L:{"130":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"I","130":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"130":"PD"},S:{"2":"QD RD"}},B:2,C:"SVG fonts",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-fragment.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-fragment.js
    index 8534ada25cf21f..16dc91d47a21eb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-fragment.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-fragment.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E NC","260":"F A B"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K L QC RC"},D:{"1":"0 1 2 3 XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB","132":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB"},E:{"1":"C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D F A B SC 9B TC UC WC AC","132":"E VC"},F:{"1":"KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"5 G M N O n o p","4":"B C cC dC eC yB LC fC","16":"F bC","132":"6 7 8 9 AB BB CB DB EB FB GB HB IB JB"},G:{"1":"qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC jC lC mC nC oC pC","132":"E kC"},H:{"1":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D","132":"A"},K:{"1":"q zB","4":"A B C yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","132":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"SVG fragment identifiers",D:true};
    +module.exports={A:{A:{"2":"J E F QC","260":"G A B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K L SC TC"},D:{"1":"0 1 2 3 4 5 6 7 aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB","132":"MB NB OB PB QB RB SB TB UB VB WB XB YB ZB"},E:{"1":"C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E G A B UC CC VC WC YC DC","132":"F XC"},F:{"1":"NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"9 H M N O o p q","4":"B C gC hC iC 0B OC jC","16":"G fC","132":"r AB BB CB DB EB FB GB HB IB JB KB LB MB"},G:{"1":"uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC nC pC qC rC sC tC","132":"F oC"},H:{"1":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E","132":"A"},K:{"1":"s 1B","4":"A B C 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","132":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"SVG fragment identifiers",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-html.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-html.js
    index d5ffae5885de99..6a21ab4e55e2db 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-html.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-html.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E NC","388":"F A B"},B:{"4":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","260":"C K L G M N O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","2":"OC","4":"3B"},D:{"4":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"SC 9B","4":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"4":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"4":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC","4":"H 6C 7C"},J:{"1":"A","2":"D"},K:{"4":"A B C q yB LC zB"},L:{"4":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"4":"0B"},P:{"4":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"4":"BC"},R:{"4":"KD"},S:{"1":"LD MD"}},B:2,C:"SVG effects for HTML",D:true};
    +module.exports={A:{A:{"2":"J E F QC","388":"G A B"},B:{"4":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","260":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","2":"RC","4":"5B"},D:{"4":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"UC CC","4":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"4":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"4":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC","4":"D BD CD"},J:{"1":"A","2":"E"},K:{"4":"A B C s 0B OC 1B"},L:{"4":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"4":"2B"},P:{"4":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"4":"EC"},R:{"4":"PD"},S:{"1":"QD RD"}},B:2,C:"SVG effects for HTML",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-html5.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-html5.js
    index c1019d01a397a0..e85d05f8994a0f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-html5.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-html5.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"NC","8":"J D E","129":"F A B"},B:{"1":"0 1 2 3 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","129":"C K L G M"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","8":"OC 3B QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","8":"4 I J"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","8":"4 I SC 9B","129":"J D E TC UC VC"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m fC zB","2":"B eC yB LC","8":"F bC cC dC"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","8":"9B gC MC","129":"E hC iC jC kC"},H:{"1":"1C"},I:{"1":"H 6C 7C","2":"2C 3C 4C","129":"3B I 5C MC"},J:{"1":"A","129":"D"},K:{"1":"C q zB","8":"A B yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"129":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Inline SVG in HTML5",D:true};
    +module.exports={A:{A:{"2":"QC","8":"J E F","129":"G A B"},B:{"1":"0 1 2 3 4 5 6 7 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","129":"C K L H M"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","8":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","8":"8 I J"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","8":"8 I UC CC","129":"J E F VC WC XC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n jC 1B","2":"B iC 0B OC","8":"G fC gC hC"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","8":"CC kC PC","129":"F lC mC nC oC"},H:{"1":"6C"},I:{"1":"D BD CD","2":"7C 8C 9C","129":"5B I AD PC"},J:{"1":"A","129":"E"},K:{"1":"C s 1B","8":"A B 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"129":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Inline SVG in HTML5",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-img.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-img.js
    index 94e1e20c2b19d6..aeaee532f11bd0 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-img.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-img.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC"},D:{"1":"0 1 2 3 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","132":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC","4":"9B","132":"4 I J D E TC UC VC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","132":"E 9B gC MC hC iC jC kC"},H:{"1":"1C"},I:{"1":"H 6C 7C","2":"2C 3C 4C","132":"3B I 5C MC"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"SVG in HTML img element",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","132":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC","4":"CC","132":"8 I J E F VC WC XC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","132":"F CC kC PC lC mC nC oC"},H:{"1":"6C"},I:{"1":"D BD CD","2":"7C 8C 9C","132":"5B I AD PC"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"SVG in HTML img element",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-smil.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-smil.js
    index aed6300dbd6510..272618a9aae6e2 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-smil.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg-smil.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"NC","8":"J D E F A B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","8":"C K L G M N O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","8":"OC 3B QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","4":"I"},E:{"1":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","8":"SC 9B","132":"4 I TC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","132":"9B gC MC hC"},H:{"2":"1C"},I:{"1":"3B I H 5C MC 6C 7C","2":"2C 3C 4C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"8":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"SVG SMIL animation",D:true};
    +module.exports={A:{A:{"2":"QC","8":"J E F G A B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","8":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","8":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","4":"I"},E:{"1":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","8":"UC CC","132":"8 I VC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","132":"CC kC PC lC"},H:{"2":"6C"},I:{"1":"5B I D AD PC BD CD","2":"7C 8C 9C"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"8":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"SVG SMIL animation",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg.js
    index 9915b8fee733d8..65d3786d8fb272 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/svg.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"NC","8":"J D E","772":"F A B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","513":"C K L G M N O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","4":"OC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","4":"SC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"H 6C 7C","2":"2C 3C 4C","132":"3B I 5C MC"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"257":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"SVG (basic support)",D:true};
    +module.exports={A:{A:{"2":"QC","8":"J E F","772":"G A B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","513":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 8 9 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","4":"RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","4":"UC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"D BD CD","2":"7C 8C 9C","132":"5B I AD PC"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"257":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"SVG (basic support)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sxg.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sxg.js
    index bd934ad7df46fe..cf203bfab92329 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sxg.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/sxg.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB","132":"qB rB"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD AC"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:6,C:"Signed HTTP Exchanges (SXG)",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB","132":"tB uB"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD GD HD DC"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:6,C:"Signed HTTP Exchanges (SXG)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/tabindex-attr.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/tabindex-attr.js
    index d3a8e3bad2f1f3..e6ea51d1883c73 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/tabindex-attr.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/tabindex-attr.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"D E F A B","16":"J NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"16":"OC 3B QC RC","129":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"0 1 2 3 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 I J D E F A B C K L"},E:{"16":"4 I SC 9B","257":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","16":"F"},G:{"769":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"16":"1C"},I:{"16":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"16":"D A"},K:{"1":"q","16":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"16":"A B"},O:{"1":"0B"},P:{"16":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"129":"LD MD"}},B:1,C:"tabindex global attribute",D:true};
    +module.exports={A:{A:{"1":"E F G A B","16":"J QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"16":"RC 5B SC TC","129":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"1":"0 1 2 3 4 5 6 7 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 I J E F G A B C K L"},E:{"16":"8 I UC CC","257":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","16":"G"},G:{"769":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"16":"6C"},I:{"16":"5B I D 7C 8C 9C AD PC BD CD"},J:{"16":"E A"},K:{"1":"s","16":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"16":"A B"},O:{"1":"2B"},P:{"16":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"129":"QD RD"}},B:1,C:"tabindex global attribute",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/template-literals.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/template-literals.js
    index 195e122433d8f3..ed19241a8b5685 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/template-literals.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/template-literals.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","16":"C"},C:{"1":"0 1 2 3 HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB QC RC"},D:{"1":"0 1 2 3 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB"},E:{"1":"A B K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC","129":"C"},F:{"1":"CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB bC cC dC eC yB LC fC zB"},G:{"1":"lC mC nC oC pC qC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC","129":"rC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"ES6 Template Literals (Template Strings)",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","16":"C"},C:{"1":"0 1 2 3 4 5 6 7 KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB"},E:{"1":"A B K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC","129":"C"},F:{"1":"FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB fC gC hC iC 0B OC jC 1B"},G:{"1":"pC qC rC sC tC uC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC","129":"vC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"ES6 Template Literals (Template Strings)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/template.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/template.js
    index 2c6e0db74094f4..98c4b789c57f77 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/template.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/template.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C","388":"K L"},C:{"1":"0 1 2 3 6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 OC 3B I J D E F A B C K L G M N O n o QC RC"},D:{"1":"0 1 2 3 IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 I J D E F A B C K L G M N O n o p","132":"9 AB BB CB DB EB FB GB HB"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D SC 9B TC","388":"E VC","514":"UC"},F:{"1":"6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","132":"5 G M N O n o"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC jC","388":"E kC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"HTML templates",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C","388":"K L"},C:{"1":"0 1 2 3 4 5 6 7 q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p SC TC"},D:{"1":"0 1 2 3 4 5 6 7 LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB","132":"CB DB EB FB GB HB IB JB KB"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E UC CC VC","388":"F XC","514":"WC"},F:{"1":"q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","132":"9 H M N O o p"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC nC","388":"F oC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"HTML templates",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/temporal.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/temporal.js
    index 3f67d8c13b2b73..5f9114bbbf02fc 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/temporal.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/temporal.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:6,C:"Temporal",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:6,C:"Temporal",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/testfeat.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/testfeat.js
    index 34c0a8a652256e..d3e3300354def7 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/testfeat.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/testfeat.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E A B NC","16":"F"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 5 6 7 8 9 OC 3B J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","16":"4 I"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"B C"},E:{"2":"I J SC 9B TC","16":"4 D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC LC fC zB","16":"yB"},G:{"2":"9B gC MC hC iC","16":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 5C MC 6C 7C","16":"4C"},J:{"2":"A","16":"D"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:7,C:"Test feature - updated",D:false};
    +module.exports={A:{A:{"2":"J E F A B QC","16":"G"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 9 RC 5B J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","16":"8 I"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"B C"},E:{"2":"I J UC CC VC","16":"8 E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC OC jC 1B","16":"0B"},G:{"2":"CC kC PC lC mC","16":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C AD PC BD CD","16":"9C"},J:{"2":"A","16":"E"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:7,C:"Test feature - updated",D:false};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/text-decoration.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/text-decoration.js
    index 404559814f3248..237693742abc2a 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/text-decoration.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/text-decoration.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O","2052":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"4 OC 3B I QC RC","1028":"0 1 2 3 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","1060":"5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB"},D:{"2":"4 5 6 7 8 I J D E F A B C K L G M N O n o p","226":"9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB","2052":"0 1 2 3 eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D SC 9B TC UC","772":"K L G zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","804":"E F A B C WC AC yB","1316":"VC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB bC cC dC eC yB LC fC zB","226":"IB JB KB LB MB NB OB PB QB","2052":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"9B gC MC hC iC jC","292":"E kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C yB LC zB","2052":"q"},L:{"2052":"H"},M:{"1028":"xB"},N:{"2":"A B"},O:{"2052":"0B"},P:{"2":"I 8C 9C","2052":"n o p AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2052":"BC"},R:{"2052":"KD"},S:{"1028":"LD MD"}},B:4,C:"text-decoration styling",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O","2052":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"8 RC 5B I SC TC","1028":"0 1 2 3 4 5 6 7 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","1060":"9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB","226":"CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB","2052":"0 1 2 3 4 5 6 7 hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E UC CC VC WC","772":"K L H 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","804":"F G A B C YC DC 0B","1316":"XC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB fC gC hC iC 0B OC jC 1B","226":"LB MB NB OB PB QB RB SB TB","2052":"UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"CC kC PC lC mC nC","292":"F oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C 0B OC 1B","2052":"s"},L:{"2052":"D"},M:{"1028":"D"},N:{"2":"A B"},O:{"2052":"2B"},P:{"2":"I DD ED","2052":"o p q r FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2052":"EC"},R:{"2052":"PD"},S:{"1028":"QD RD"}},B:4,C:"text-decoration styling",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/text-emphasis.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/text-emphasis.js
    index eb8b85ddf65eab..1c94212fa743f4 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/text-emphasis.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/text-emphasis.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 i j k l m r s t u v w x y z H","2":"C K L G M N O","164":"P Q R S T U V W X Y Z a b c d e f g h"},C:{"1":"0 1 2 3 TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB QC RC","322":"SB"},D:{"1":"0 1 2 3 i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 I J D E F A B C K L G M N O n o p","164":"8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h"},E:{"1":"E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J SC 9B TC","164":"D UC"},F:{"1":"V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","164":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC","164":"6C 7C"},J:{"2":"D","164":"A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p ID JD","164":"I 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B"},Q:{"164":"BC"},R:{"164":"KD"},S:{"1":"LD MD"}},B:4,C:"text-emphasis styling",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 i j k l m n t u v w x y z D","2":"C K L H M N O","164":"P Q R S T U V W X Y Z a b c d e f g h"},C:{"1":"0 1 2 3 4 5 6 7 WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB SC TC","322":"VB"},D:{"1":"0 1 2 3 4 5 6 7 i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB","164":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h"},E:{"1":"F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J UC CC VC","164":"E WC"},F:{"1":"V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","164":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC","164":"BD CD"},J:{"2":"E","164":"A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r ND OD","164":"I DD ED FD GD HD DC ID JD KD LD MD 3B 4B"},Q:{"164":"EC"},R:{"164":"PD"},S:{"1":"QD RD"}},B:4,C:"text-emphasis styling",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/text-overflow.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/text-overflow.js
    index c1619271b4313c..07cc6fb4dc946c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/text-overflow.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/text-overflow.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"J D E F A B","2":"NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","8":"4 OC 3B I J QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m yB LC fC zB","33":"F bC cC dC eC"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"q zB","33":"A B C yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"CSS3 Text-overflow",D:true};
    +module.exports={A:{A:{"1":"J E F G A B","2":"QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","8":"8 RC 5B I J SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 0B OC jC 1B","33":"G fC gC hC iC"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"s 1B","33":"A B C 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"CSS3 Text-overflow",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/text-size-adjust.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/text-size-adjust.js
    index a9b017ce4b169c..65aeec090d450d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/text-size-adjust.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/text-size-adjust.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","33":"C K L G M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB","258":"9"},E:{"2":"4 I J D E F A B C K L G SC 9B UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","258":"TC"},F:{"1":"QB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB RB bC cC dC eC yB LC fC zB"},G:{"2":"9B gC MC","33":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"33":"xB"},N:{"161":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:7,C:"CSS text-size-adjust",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","33":"C K L H M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB","258":"CB"},E:{"2":"8 I J E F G A B C K L H UC CC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","258":"VC"},F:{"1":"TB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB UB fC gC hC iC 0B OC jC 1B"},G:{"2":"CC kC PC","33":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"33":"D"},N:{"161":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:7,C:"CSS text-size-adjust",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/text-stroke.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/text-stroke.js
    index c374df3addc1e2..83ccef08c7784c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/text-stroke.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/text-stroke.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L","33":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","161":"G M N O"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB QC RC","161":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","450":"VB"},D:{"33":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"33":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"F B C bC cC dC eC yB LC fC zB","33":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"33":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","36":"9B"},H:{"2":"1C"},I:{"2":"3B","33":"I H 2C 3C 4C 5C MC 6C 7C"},J:{"33":"D A"},K:{"2":"A B C yB LC zB","33":"q"},L:{"33":"H"},M:{"161":"xB"},N:{"2":"A B"},O:{"33":"0B"},P:{"33":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"33":"BC"},R:{"33":"KD"},S:{"161":"LD MD"}},B:7,C:"CSS text-stroke and text-fill",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L","33":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","161":"H M N O"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB SC TC","161":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","450":"YB"},D:{"33":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"33":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"G B C fC gC hC iC 0B OC jC 1B","33":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"33":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","36":"CC"},H:{"2":"6C"},I:{"2":"5B","33":"I D 7C 8C 9C AD PC BD CD"},J:{"33":"E A"},K:{"2":"A B C 0B OC 1B","33":"s"},L:{"33":"D"},M:{"161":"D"},N:{"2":"A B"},O:{"33":"2B"},P:{"33":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"33":"EC"},R:{"33":"PD"},S:{"161":"QD RD"}},B:7,C:"CSS text-stroke and text-fill",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/textcontent.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/textcontent.js
    index add270b38fb157..891b6d46a2aba1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/textcontent.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/textcontent.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"SC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","16":"F"},G:{"1":"E gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B"},H:{"1":"1C"},I:{"1":"3B I H 4C 5C MC 6C 7C","16":"2C 3C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Node.textContent",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"UC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","16":"G"},G:{"1":"F kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC"},H:{"1":"6C"},I:{"1":"5B I D 9C AD PC BD CD","16":"7C 8C"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Node.textContent",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/textencoder.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/textencoder.js
    index b329bff2bedeaf..b83623671397c7 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/textencoder.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/textencoder.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K L G M N O QC RC","132":"5"},D:{"1":"0 1 2 3 LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC"},F:{"1":"8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 F B C G M N O n o p bC cC dC eC yB LC fC zB"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"TextEncoder & TextDecoder",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K L H M N O SC TC","132":"9"},D:{"1":"0 1 2 3 4 5 6 7 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC"},F:{"1":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB fC gC hC iC 0B OC jC 1B"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"TextEncoder & TextDecoder",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/tls1-1.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/tls1-1.js
    index 61e1607e26b4df..7a60ab4bd1bb0c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/tls1-1.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/tls1-1.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"B","2":"J D NC","66":"E F A"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB","2":"4 5 OC 3B I J D E F A B C K L G M N O n o p QC RC","66":"6","129":"nB oB pB qB rB q sB tB uB vB","388":"0 1 2 3 wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T","2":"4 5 I J D E F A B C K L G M N O n o","1540":"0 1 2 3 U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"D E F A B C K VC WC AC yB zB","2":"4 I J SC 9B TC UC","513":"L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB zB","2":"F B C bC cC dC eC yB LC fC","1540":"q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC"},H:{"1":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"1":"A","2":"D"},K:{"1":"q zB","2":"A B C yB LC"},L:{"1":"H"},M:{"129":"xB"},N:{"1":"B","66":"A"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"TLS 1.1",D:true};
    +module.exports={A:{A:{"1":"B","2":"J E QC","66":"F G A"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q SC TC","66":"r","129":"qB rB sB tB uB s vB wB xB yB","388":"0 1 2 3 4 5 6 7 zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"1":"q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T","2":"8 9 I J E F G A B C K L H M N O o p","1540":"0 1 2 3 4 5 6 7 U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"E F G A B C K XC YC DC 0B 1B","2":"8 I J UC CC VC WC","513":"L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB 1B","2":"G B C fC gC hC iC 0B OC jC","1540":"s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC"},H:{"1":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"1":"A","2":"E"},K:{"1":"s 1B","2":"A B C 0B OC"},L:{"1":"D"},M:{"129":"D"},N:{"1":"B","66":"A"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"TLS 1.1",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/tls1-2.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/tls1-2.js
    index edfed6201dee90..a4f8fe87062653 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/tls1-2.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/tls1-2.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"B","2":"J D NC","66":"E F A"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 OC 3B I J D E F A B C K L G M N O n o p QC RC","66":"7 8 9"},D:{"1":"0 1 2 3 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB"},E:{"1":"D E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J SC 9B TC UC"},F:{"1":"5 6 7 8 9 M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F G bC","66":"B C cC dC eC yB LC fC zB"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC"},H:{"1":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"1":"A","2":"D"},K:{"1":"q zB","2":"A B C yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","66":"A"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"TLS 1.2",D:true};
    +module.exports={A:{A:{"1":"B","2":"J E QC","66":"F G A"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r SC TC","66":"AB BB CB"},D:{"1":"0 1 2 3 4 5 6 7 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB"},E:{"1":"E F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J UC CC VC WC"},F:{"1":"9 M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G H fC","66":"B C gC hC iC 0B OC jC 1B"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC"},H:{"1":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"1":"A","2":"E"},K:{"1":"s 1B","2":"A B C 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","66":"A"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"TLS 1.2",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/tls1-3.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/tls1-3.js
    index 82de93bdbb2513..2f1b952d6af58f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/tls1-3.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/tls1-3.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB QC RC","132":"gB 5B hB","450":"YB ZB aB bB cB dB eB fB 4B"},D:{"1":"0 1 2 3 pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB","706":"bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB"},E:{"1":"L G XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C SC 9B TC UC VC WC AC yB","1028":"K zB BC"},F:{"1":"eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bC cC dC eC yB LC fC zB","706":"bB cB dB"},G:{"1":"sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:6,C:"TLS 1.3",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB SC TC","132":"jB 7B kB","450":"bB cB dB eB fB gB hB iB 6B"},D:{"1":"0 1 2 3 4 5 6 7 sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB","706":"eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB"},E:{"1":"L H ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C UC CC VC WC XC YC DC 0B","1028":"K 1B EC"},F:{"1":"hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB fC gC hC iC 0B OC jC 1B","706":"eB fB gB"},G:{"1":"wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD GD HD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:6,C:"TLS 1.3",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/touch.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/touch.js
    index 9dbefe892a33ce..2465d34013299e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/touch.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/touch.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","8":"A B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","578":"C K L G M N O"},C:{"1":"0 1 2 3 5 6 7 O n o p ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC","4":"4 I J D E F A B C K L G M N","194":"8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB"},D:{"1":"0 1 2 3 6 7 8 9 p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 I J D E F A B C K L G M N O n o"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"B C q yB LC zB","2":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"8":"A","260":"B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:2,C:"Touch events",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","8":"A B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","578":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 9 O o p q r AB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC","4":"8 I J E F G A B C K L H M N","194":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB"},D:{"1":"0 1 2 3 4 5 6 7 q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"B C s 0B OC 1B","2":"A"},L:{"1":"D"},M:{"1":"D"},N:{"8":"A","260":"B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:2,C:"Touch events",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/transforms2d.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/transforms2d.js
    index 0b0a76a7f48ffe..3d91f3164d5351 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/transforms2d.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/transforms2d.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"NC","8":"J D E","129":"A B","161":"F"},B:{"1":"0 1 2 3 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","129":"C K L G M"},C:{"1":"0 1 2 3 5 6 7 8 9 M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B","33":"4 I J D E F A B C K L G QC RC"},D:{"1":"0 1 2 3 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","33":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","33":"4 I J D E SC 9B TC UC VC"},F:{"1":"6 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"F bC cC","33":"5 B C G M N O n o p dC eC yB LC fC"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","33":"E 9B gC MC hC iC jC kC"},H:{"2":"1C"},I:{"1":"H","33":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"33":"D A"},K:{"1":"B C q yB LC zB","2":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS3 2D Transforms",D:true};
    +module.exports={A:{A:{"2":"QC","8":"J E F","129":"A B","161":"G"},B:{"1":"0 1 2 3 4 5 6 7 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","129":"C K L H M"},C:{"1":"0 1 2 3 4 5 6 7 9 M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B","33":"8 I J E F G A B C K L H SC TC"},D:{"1":"0 1 2 3 4 5 6 7 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","33":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","33":"8 I J E F UC CC VC WC XC"},F:{"1":"r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"G fC gC","33":"9 B C H M N O o p q hC iC 0B OC jC"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","33":"F CC kC PC lC mC nC oC"},H:{"2":"6C"},I:{"1":"D","33":"5B I 7C 8C 9C AD PC BD CD"},J:{"33":"E A"},K:{"1":"B C s 0B OC 1B","2":"A"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS3 2D Transforms",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/transforms3d.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/transforms3d.js
    index 82af1a54417bae..f07aea7c5473d2 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/transforms3d.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/transforms3d.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","132":"A B"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F QC RC","33":"A B C K L G"},D:{"1":"0 1 2 3 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A B","33":"5 6 7 8 9 C K L G M N O n o p AB BB CB DB EB FB GB HB IB"},E:{"1":"DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC 9B","33":"4 I J D E TC UC VC","257":"F A B C K L G WC AC yB zB BC XC YC CC"},F:{"1":"6 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","33":"5 G M N O n o p"},G:{"1":"DC 0B 0C 1B EC FC GC HC IC JC 2B KC","33":"E 9B gC MC hC iC jC kC","257":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC"},H:{"2":"1C"},I:{"1":"H","2":"2C 3C 4C","33":"3B I 5C MC 6C 7C"},J:{"33":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"132":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:5,C:"CSS3 3D Transforms",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","132":"A B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G SC TC","33":"A B C K L H"},D:{"1":"0 1 2 3 4 5 6 7 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A B","33":"9 C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB"},E:{"1":"GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC CC","33":"8 I J E F VC WC XC","257":"G A B C K L H YC DC 0B 1B EC ZC aC FC"},F:{"1":"r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","33":"9 H M N O o p q"},G:{"1":"GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","33":"F CC kC PC lC mC nC oC","257":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC"},H:{"2":"6C"},I:{"1":"D","2":"7C 8C 9C","33":"5B I AD PC BD CD"},J:{"33":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"132":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:5,C:"CSS3 3D Transforms",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/trusted-types.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/trusted-types.js
    index cc4026c270fea3..f76b886b1d61bf 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/trusted-types.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/trusted-types.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O P Q R"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p FD GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD AC DD ED"},Q:{"2":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:7,C:"Trusted Types for DOM manipulation",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O P Q R"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r KD LD MD 3B 4B ND OD","2":"I DD ED FD GD HD DC ID JD"},Q:{"2":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:7,C:"Trusted Types for DOM manipulation",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ttf.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ttf.js
    index aedaada8bd680c..ce5b1015ecbf0a 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ttf.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/ttf.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E NC","132":"F A B"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","2":"OC 3B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m cC dC eC yB LC fC zB","2":"F bC"},G:{"1":"E MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC"},H:{"2":"1C"},I:{"1":"3B I H 3C 4C 5C MC 6C 7C","2":"2C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"132":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"TTF/OTF - TrueType and OpenType font support",D:true};
    +module.exports={A:{A:{"2":"J E F QC","132":"G A B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","2":"RC 5B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n gC hC iC 0B OC jC 1B","2":"G fC"},G:{"1":"F PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC"},H:{"2":"6C"},I:{"1":"5B I D 8C 9C AD PC BD CD","2":"7C"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"132":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"TTF/OTF - TrueType and OpenType font support",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/typedarrays.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/typedarrays.js
    index 6644d709d8c005..a1ee09411d8b56 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/typedarrays.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/typedarrays.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"B","2":"J D E F NC","132":"A"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J"},E:{"1":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B","260":"TC"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m fC zB","2":"F B bC cC dC eC yB LC"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC","260":"MC"},H:{"1":"1C"},I:{"1":"I H 5C MC 6C 7C","2":"3B 2C 3C 4C"},J:{"1":"A","2":"D"},K:{"1":"C q zB","2":"A B yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"132":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"Typed Arrays",D:true};
    +module.exports={A:{A:{"1":"B","2":"J E F G QC","132":"A"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J"},E:{"1":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC","260":"VC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n jC 1B","2":"G B fC gC hC iC 0B OC"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC","260":"PC"},H:{"1":"6C"},I:{"1":"I D AD PC BD CD","2":"5B 7C 8C 9C"},J:{"1":"A","2":"E"},K:{"1":"C s 1B","2":"A B 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"132":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"Typed Arrays",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/u2f.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/u2f.js
    index 634968fed364f3..b7aa503dfd78ab 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/u2f.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/u2f.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O t u v w x y z H","513":"P Q R S T U V W X Y Z a b c d e f g h i j k l m r s"},C:{"1":"mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y","2":"1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB H xB 7B 8B PC QC RC","322":"0 UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB z"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB t u v w x y z H xB 7B 8B","130":"LB MB NB","513":"OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g","578":"h i j k l m r s"},E:{"1":"K L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C SC 9B TC UC VC WC AC yB zB"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB OB bC cC dC eC yB LC fC zB","513":"NB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"1":"vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"1":"MD","322":"LD"}},B:7,C:"FIDO U2F API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O u v w x y z D","513":"P Q R S T U V W X Y Z a b c d e f g h i j k l m n t"},C:{"1":"pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z","2":"2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB D 9B AC BC SC TC","322":"0 1 XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB u v w x y z D 9B AC BC","130":"OB PB QB","513":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g","578":"h i j k l m n t"},E:{"1":"K L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C UC CC VC WC XC YC DC 0B 1B"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB RB fC gC hC iC 0B OC jC 1B","513":"QB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"1":"zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"1":"RD","322":"QD"}},B:7,C:"FIDO U2F API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/unhandledrejection.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/unhandledrejection.js
    index 7a6851ae237324..e03b6e6a253351 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/unhandledrejection.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/unhandledrejection.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB QC RC"},D:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB"},E:{"1":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC AC"},F:{"1":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB bC cC dC eC yB LC fC zB"},G:{"1":"qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC","16":"pC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:1,C:"unhandledrejection/rejectionhandled events",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB"},E:{"1":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC DC"},F:{"1":"MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB fC gC hC iC 0B OC jC 1B"},G:{"1":"uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC","16":"tC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:1,C:"unhandledrejection/rejectionhandled events",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/upgradeinsecurerequests.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/upgradeinsecurerequests.js
    index dd1ff344b99173..396434b9ec10b4 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/upgradeinsecurerequests.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/upgradeinsecurerequests.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M"},C:{"1":"0 1 2 3 PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB QC RC"},D:{"1":"0 1 2 3 QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC"},F:{"1":"DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB bC cC dC eC yB LC fC zB"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"Upgrade Insecure Requests",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M"},C:{"1":"0 1 2 3 4 5 6 7 SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC"},F:{"1":"GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB fC gC hC iC 0B OC jC 1B"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"Upgrade Insecure Requests",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/url-scroll-to-text-fragment.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/url-scroll-to-text-fragment.js
    index c4febe2ac54b3f..e32b477e686374 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/url-scroll-to-text-fragment.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/url-scroll-to-text-fragment.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O","66":"P Q R"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q","66":"sB tB uB vB wB P Q"},E:{"1":"EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B"},F:{"1":"nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB bC cC dC eC yB LC fC zB","66":"lB mB"},G:{"1":"EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"n o p FD GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD AC DD ED"},Q:{"2":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:7,C:"URL Scroll-To-Text Fragment",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O","66":"P Q R"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s","66":"vB wB xB yB zB P Q"},E:{"1":"HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B"},F:{"1":"qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB fC gC hC iC 0B OC jC 1B","66":"oB pB"},G:{"1":"HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"o p q r KD LD MD 3B 4B ND OD","2":"I DD ED FD GD HD DC ID JD"},Q:{"2":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:7,C:"URL Scroll-To-Text Fragment",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/url.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/url.js
    index 7e367cb3003b55..747c8874fdd257 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/url.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/url.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 OC 3B I J D E F A B C K L G M N O n o p QC RC"},D:{"1":"0 1 2 3 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 I J D E F A B C K L G M N O n o p","130":"6 7 8 9 AB BB CB DB EB"},E:{"1":"E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J SC 9B TC UC","130":"D"},F:{"1":"5 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","130":"G M N O"},G:{"1":"E kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC","130":"jC"},H:{"2":"1C"},I:{"1":"H 7C","2":"3B I 2C 3C 4C 5C MC","130":"6C"},J:{"2":"D","130":"A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"URL API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q","130":"r AB BB CB DB EB FB GB HB"},E:{"1":"F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J UC CC VC WC","130":"E"},F:{"1":"9 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","130":"H M N O"},G:{"1":"F oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC","130":"nC"},H:{"2":"6C"},I:{"1":"D CD","2":"5B I 7C 8C 9C AD PC","130":"BD"},J:{"2":"E","130":"A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"URL API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/urlsearchparams.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/urlsearchparams.js
    index b06f0d296e4248..185cd01058df9f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/urlsearchparams.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/urlsearchparams.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M"},C:{"1":"0 1 2 3 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB QC RC","132":"CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB"},D:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB"},E:{"1":"B C K L G AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC"},F:{"1":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB bC cC dC eC yB LC fC zB"},G:{"1":"oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"URLSearchParams",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M"},C:{"1":"0 1 2 3 4 5 6 7 UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB SC TC","132":"FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB"},D:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB"},E:{"1":"B C K L H DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC"},F:{"1":"MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB fC gC hC iC 0B OC jC 1B"},G:{"1":"sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"URLSearchParams",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/use-strict.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/use-strict.js
    index d162de457fab36..c0bcebd3e8e346 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/use-strict.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/use-strict.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A B C"},E:{"1":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B","132":"4 TC"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m fC zB","2":"F B bC cC dC eC yB LC"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC"},H:{"1":"1C"},I:{"1":"3B I H 5C MC 6C 7C","2":"2C 3C 4C"},J:{"1":"D A"},K:{"1":"C q LC zB","2":"A B yB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"ECMAScript 5 Strict Mode",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A B C"},E:{"1":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC","132":"8 VC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n jC 1B","2":"G B fC gC hC iC 0B OC"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC"},H:{"1":"6C"},I:{"1":"5B I D AD PC BD CD","2":"7C 8C 9C"},J:{"1":"E A"},K:{"1":"C s OC 1B","2":"A B 0B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"ECMAScript 5 Strict Mode",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/user-select-none.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/user-select-none.js
    index abd8d61e839f18..5dd86f6763d440 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/user-select-none.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/user-select-none.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","33":"A B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","33":"C K L G M N O"},C:{"1":"0 1 2 3 oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","33":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB QC RC"},D:{"1":"0 1 2 3 bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","33":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB"},E:{"1":"aC","33":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC"},F:{"1":"OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","33":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB"},G:{"33":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","33":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"33":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"33":"A B"},O:{"1":"0B"},P:{"1":"n o p 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","33":"I 8C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","33":"LD"}},B:5,C:"CSS user-select: none",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","33":"A B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","33":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","33":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","33":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB"},E:{"1":"eC","33":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC"},F:{"1":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","33":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB"},G:{"33":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","33":"5B I 7C 8C 9C AD PC BD CD"},J:{"33":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"33":"A B"},O:{"1":"2B"},P:{"1":"o p q r ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","33":"I DD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","33":"QD"}},B:5,C:"CSS user-select: none",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/user-timing.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/user-timing.js
    index 131512c0fdb735..711e83ed82becf 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/user-timing.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/user-timing.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB QC RC"},D:{"1":"0 1 2 3 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 I J D E F A B C K L G M N O n o p"},E:{"1":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC AC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"User Timing API",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB"},E:{"1":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC DC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"User Timing API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/variable-fonts.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/variable-fonts.js
    index 6ebbab0662febd..bf2a898bc91876 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/variable-fonts.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/variable-fonts.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB QC RC","4609":"hB iB jB kB lB mB nB oB pB","4674":"5B","5698":"gB","7490":"aB bB cB dB eB","7746":"fB 4B","8705":"0 1 2 3 qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"0 1 2 3 mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB","4097":"lB","4290":"4B gB 5B","6148":"hB iB jB kB"},E:{"1":"G YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC AC","4609":"B C yB zB","8193":"K L BC XC"},F:{"1":"bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB bC cC dC eC yB LC fC zB","4097":"aB","6148":"WB XB YB ZB"},G:{"1":"tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC","4097":"pC qC rC sC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"4097":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"2":"I 8C 9C AD","4097":"n o p BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:5,C:"Variable fonts",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB SC TC","4609":"kB lB mB nB oB pB qB rB sB","4674":"7B","5698":"jB","7490":"dB eB fB gB hB","7746":"iB 6B","8705":"0 1 2 3 4 5 6 7 tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"1":"0 1 2 3 4 5 6 7 pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB","4097":"oB","4290":"6B jB 7B","6148":"kB lB mB nB"},E:{"1":"H aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC DC","4609":"B C 0B 1B","8193":"K L EC ZC"},F:{"1":"eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB fC gC hC iC 0B OC jC 1B","4097":"dB","6148":"ZB aB bB cB"},G:{"1":"xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC","4097":"tC uC vC wC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"4097":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"2":"I DD ED FD","4097":"o p q r GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:5,C:"Variable fonts",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/vector-effect.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/vector-effect.js
    index 06266288104cbb..1446792d464f6b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/vector-effect.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/vector-effect.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K L QC RC"},D:{"1":"0 1 2 3 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 I J D E F A B C K L"},E:{"1":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m fC zB","2":"F B bC cC dC eC yB LC"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC MC"},H:{"1":"1C"},I:{"1":"H 6C 7C","16":"3B I 2C 3C 4C 5C MC"},J:{"16":"D A"},K:{"1":"C q zB","2":"A B yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"SVG vector-effect: non-scaling-stroke",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K L SC TC"},D:{"1":"0 1 2 3 4 5 6 7 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 I J E F G A B C K L"},E:{"1":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n jC 1B","2":"G B fC gC hC iC 0B OC"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC PC"},H:{"1":"6C"},I:{"1":"D BD CD","16":"5B I 7C 8C 9C AD PC"},J:{"16":"E A"},K:{"1":"C s 1B","2":"A B 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"SVG vector-effect: non-scaling-stroke",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/vibration.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/vibration.js
    index 775783a47ca5e5..3e0582a1e61944 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/vibration.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/vibration.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 5 6 7 8 9 M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A QC RC","33":"B C K L G"},D:{"1":"0 1 2 3 DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C G M bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"1":"A","2":"D"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"Vibration API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 9 M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A SC TC","33":"B C K L H"},D:{"1":"0 1 2 3 4 5 6 7 GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C H M fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"1":"A","2":"E"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"Vibration API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/video.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/video.js
    index bf81bb337769f2..50a4fccda76d2f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/video.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/video.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B","260":"4 5 I J D E F A B C K L G M N O QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A TC UC VC WC AC","2":"SC 9B","513":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m dC eC yB LC fC zB","2":"F bC cC"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC","513":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"3B I H 4C 5C MC 6C 7C","132":"2C 3C"},J:{"1":"D A"},K:{"1":"B C q yB LC zB","2":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Video element",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B","260":"8 9 I J E F G A B C K L H M N O SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A VC WC XC YC DC","2":"UC CC","513":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n hC iC 0B OC jC 1B","2":"G fC gC"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC","513":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"5B I D 9C AD PC BD CD","132":"7C 8C"},J:{"1":"E A"},K:{"1":"B C s 0B OC 1B","2":"A"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Video element",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/videotracks.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/videotracks.js
    index 050b1d1437cdb3..f3ea2383885c96 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/videotracks.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/videotracks.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"C K L G M N O","322":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB QC RC","194":"0 1 2 3 GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB","322":"0 1 2 3 SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J SC 9B TC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB bC cC dC eC yB LC fC zB","322":"FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C yB LC zB","322":"q"},L:{"322":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"322":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"322":"BC"},R:{"322":"KD"},S:{"194":"LD MD"}},B:1,C:"Video Tracks",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"C K L H M N O","322":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB SC TC","194":"0 1 2 3 4 5 6 7 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB","322":"0 1 2 3 4 5 6 7 VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J UC CC VC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB fC gC hC iC 0B OC jC 1B","322":"IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C 0B OC 1B","322":"s"},L:{"322":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"322":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"322":"EC"},R:{"322":"PD"},S:{"194":"QD RD"}},B:1,C:"Video Tracks",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/view-transitions.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/view-transitions.js
    index 36d03238ac34f4..4465b669b96233 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/view-transitions.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/view-transitions.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 y z H","2":"C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:5,C:"View Transitions API (single-document)",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 z D","2":"C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"r","2":"I o p q DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:5,C:"View Transitions API (single-document)",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/viewport-unit-variants.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/viewport-unit-variants.js
    index 41425f201a2250..8d4b218d49977d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/viewport-unit-variants.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/viewport-unit-variants.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 v w x y z H","2":"C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r","194":"s t u"},C:{"1":"0 1 2 3 k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j QC RC"},D:{"1":"0 1 2 3 v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i","194":"j k l m r s t u"},E:{"1":"DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC"},F:{"1":"d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z bC cC dC eC yB LC fC zB","194":"a b c"},G:{"1":"DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"o p","2":"I n 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:5,C:"Small, Large, and Dynamic viewport units",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 w x y z D","2":"C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n","194":"t u v"},C:{"1":"0 1 2 3 4 5 6 7 k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j SC TC"},D:{"1":"0 1 2 3 4 5 6 7 w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i","194":"j k l m n t u v"},E:{"1":"GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC"},F:{"1":"d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z fC gC hC iC 0B OC jC 1B","194":"a b c"},G:{"1":"GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"p q r","2":"I o DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:5,C:"Small, Large, and Dynamic viewport units",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/viewport-units.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/viewport-units.js
    index 4654e11b85cb53..57a5defb113a8f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/viewport-units.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/viewport-units.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E NC","132":"F","260":"A B"},B:{"1":"0 1 2 3 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","260":"C K L G"},C:{"1":"0 1 2 3 5 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K L G M N O QC RC"},D:{"1":"0 1 2 3 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 I J D E F A B C K L G M N O","260":"6 7 8 n o p"},E:{"1":"D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC","260":"J"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC","516":"jC","772":"iC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"1":"A","2":"D"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"260":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"Viewport units: vw, vh, vmin, vmax",D:true};
    +module.exports={A:{A:{"2":"J E F QC","132":"G","260":"A B"},B:{"1":"0 1 2 3 4 5 6 7 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","260":"C K L H"},C:{"1":"0 1 2 3 4 5 6 7 9 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K L H M N O SC TC"},D:{"1":"0 1 2 3 4 5 6 7 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O","260":"o p q r AB BB"},E:{"1":"E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC","260":"J"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC","516":"nC","772":"mC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"1":"A","2":"E"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"260":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"Viewport units: vw, vh, vmin, vmax",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wai-aria.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wai-aria.js
    index 47e9183005ee20..4873e50c2b005c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wai-aria.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wai-aria.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D NC","4":"E F A B"},B:{"4":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"4":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"4":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"SC 9B","4":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"F","4":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"4":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"4":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC","4":"H 6C 7C"},J:{"2":"D A"},K:{"4":"A B C q yB LC zB"},L:{"4":"H"},M:{"4":"xB"},N:{"4":"A B"},O:{"4":"0B"},P:{"4":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"4":"BC"},R:{"4":"KD"},S:{"4":"LD MD"}},B:2,C:"WAI-ARIA Accessibility features",D:true};
    +module.exports={A:{A:{"2":"J E QC","4":"F G A B"},B:{"4":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"4":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"4":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"UC CC","4":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"G","4":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"4":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"4":"6C"},I:{"2":"5B I 7C 8C 9C AD PC","4":"D BD CD"},J:{"2":"E A"},K:{"4":"A B C s 0B OC 1B"},L:{"4":"D"},M:{"4":"D"},N:{"4":"A B"},O:{"4":"2B"},P:{"4":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"4":"EC"},R:{"4":"PD"},S:{"4":"QD RD"}},B:2,C:"WAI-ARIA Accessibility features",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wake-lock.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wake-lock.js
    index fea80a5c4c4dea..46afef03f8dfe7 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wake-lock.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wake-lock.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O","194":"P Q R S T U V W X Y"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB","194":"qB rB q sB tB uB vB wB P Q R S T"},E:{"1":"HC IC JC 2B KC aC","2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC"},F:{"1":"q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB bC cC dC eC yB LC fC zB","194":"fB gB hB iB jB kB lB mB nB oB pB qB rB"},G:{"1":"HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p GD HD 1B 2B ID JD","2":"I 8C 9C AD BD CD AC DD ED FD"},Q:{"2":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:4,C:"Screen Wake Lock API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O","194":"P Q R S T U V W X Y"},C:{"1":"AC BC","2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B SC TC"},D:{"1":"0 1 2 3 4 5 6 7 U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB","194":"tB uB s vB wB xB yB zB P Q R S T"},E:{"1":"KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC"},F:{"1":"s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB fC gC hC iC 0B OC jC 1B","194":"iB jB kB lB mB nB oB pB qB rB sB tB uB"},G:{"1":"KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r LD MD 3B 4B ND OD","2":"I DD ED FD GD HD DC ID JD KD"},Q:{"2":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:4,C:"Screen Wake Lock API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wasm.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wasm.js
    index 583f101950ca65..2351b505d13a94 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wasm.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wasm.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L","578":"G"},C:{"1":"0 1 2 3 aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB QC RC","194":"UB VB WB XB YB","1025":"ZB"},D:{"1":"0 1 2 3 eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB","322":"YB ZB aB bB cB dB"},E:{"1":"B C K L G yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC AC"},F:{"1":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB bC cC dC eC yB LC fC zB","322":"LB MB NB OB PB QB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","194":"LD"}},B:6,C:"WebAssembly",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L","578":"H"},C:{"1":"0 1 2 3 4 5 6 7 dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB SC TC","194":"XB YB ZB aB bB","1025":"cB"},D:{"1":"0 1 2 3 4 5 6 7 hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB","322":"bB cB dB eB fB gB"},E:{"1":"B C K L H 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC DC"},F:{"1":"UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB fC gC hC iC 0B OC jC 1B","322":"OB PB QB RB SB TB"},G:{"1":"tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","194":"QD"}},B:6,C:"WebAssembly",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wav.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wav.js
    index 34ccfd6e413198..d220a19ccc93bc 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wav.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wav.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","2":"OC 3B"},D:{"1":"0 1 2 3 5 6 7 8 9 E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m dC eC yB LC fC zB","2":"F bC cC"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"3B I H 4C 5C MC 6C 7C","16":"2C 3C"},J:{"1":"D A"},K:{"1":"B C q yB LC zB","16":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"Wav audio format",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","2":"RC 5B"},D:{"1":"0 1 2 3 4 5 6 7 9 F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n hC iC 0B OC jC 1B","2":"G fC gC"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"5B I D 9C AD PC BD CD","16":"7C 8C"},J:{"1":"E A"},K:{"1":"B C s 0B OC 1B","16":"A"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"Wav audio format",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wbr-element.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wbr-element.js
    index 256980d60d5a70..191b848fe050a4 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wbr-element.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wbr-element.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"J D NC","2":"E F A B"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"SC"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","16":"F"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC MC"},H:{"1":"1C"},I:{"1":"3B I H 4C 5C MC 6C 7C","16":"2C 3C"},J:{"1":"D A"},K:{"1":"B C q yB LC zB","2":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"wbr (word break opportunity) element",D:true};
    +module.exports={A:{A:{"1":"J E QC","2":"F G A B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"UC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","16":"G"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC PC"},H:{"1":"6C"},I:{"1":"5B I D 9C AD PC BD CD","16":"7C 8C"},J:{"1":"E A"},K:{"1":"B C s 0B OC 1B","2":"A"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"wbr (word break opportunity) element",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/web-animation.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/web-animation.js
    index 2bc73294c067b4..218f48e7dc5a7e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/web-animation.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/web-animation.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O","260":"P Q R S"},C:{"1":"0 1 2 3 R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB QC RC","260":"4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB","516":"UB VB WB XB YB ZB aB bB cB dB eB fB","580":"GB HB IB JB KB LB MB NB OB PB QB RB SB TB","2049":"tB uB vB wB P Q"},D:{"1":"0 1 2 3 T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB","132":"JB KB LB","260":"MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S"},E:{"1":"G YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC AC","1090":"B C K yB zB","2049":"L BC XC"},F:{"1":"qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 F B C G M N O n o p bC cC dC eC yB LC fC zB","132":"6 7 8","260":"9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC","1090":"pC qC rC sC tC uC vC","2049":"wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"260":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"260":"BC"},R:{"1":"KD"},S:{"1":"MD","516":"LD"}},B:5,C:"Web Animations API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O","260":"P Q R S"},C:{"1":"0 1 2 3 4 5 6 7 R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB SC TC","260":"6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB","516":"XB YB ZB aB bB cB dB eB fB gB hB iB","580":"JB KB LB MB NB OB PB QB RB SB TB UB VB WB","2049":"wB xB yB zB P Q"},D:{"1":"0 1 2 3 4 5 6 7 T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB","132":"MB NB OB","260":"PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S"},E:{"1":"H aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC DC","1090":"B C K 0B 1B","2049":"L EC ZC"},F:{"1":"tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q fC gC hC iC 0B OC jC 1B","132":"r AB BB","260":"CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC","1090":"tC uC vC wC xC yC zC","2049":"0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"260":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"260":"EC"},R:{"1":"PD"},S:{"1":"RD","516":"QD"}},B:5,C:"Web Animations API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/web-app-manifest.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/web-app-manifest.js
    index 1a019d74007f33..1e08ce2e32199c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/web-app-manifest.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/web-app-manifest.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M","130":"N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","578":"uB vB wB P Q R 6B S T U"},D:{"1":"0 1 2 3 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC","4":"2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC","4":"HC IC JC 2B KC","260":"qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:5,C:"Add to home screen (A2HS)",D:false};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M","130":"N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","578":"xB yB zB P Q R 8B S T U"},D:{"1":"0 1 2 3 4 5 6 7 PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC","4":"4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC","4":"KC LC 5C 4B MC NC","260":"uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:5,C:"Add to home screen (A2HS)",D:false};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/web-bluetooth.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/web-bluetooth.js
    index 601e4d4debe3c1..d33c74b2e32f86 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/web-bluetooth.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/web-bluetooth.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O","1025":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB","194":"SB TB UB VB WB XB YB ZB","706":"aB bB cB","1025":"0 1 2 3 dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB bC cC dC eC yB LC fC zB","450":"JB KB LB MB","706":"NB OB PB","1025":"QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC 6C 7C","1025":"H"},J:{"2":"D A"},K:{"2":"A B C yB LC zB","1025":"q"},L:{"1025":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1025":"0B"},P:{"1":"n o p 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C"},Q:{"2":"BC"},R:{"1025":"KD"},S:{"2":"LD MD"}},B:7,C:"Web Bluetooth",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O","1025":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB","194":"VB WB XB YB ZB aB bB cB","706":"dB eB fB","1025":"0 1 2 3 4 5 6 7 gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB fC gC hC iC 0B OC jC 1B","450":"MB NB OB PB","706":"QB RB SB","1025":"TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC BD CD","1025":"D"},J:{"2":"E A"},K:{"2":"A B C 0B OC 1B","1025":"s"},L:{"1025":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1025":"2B"},P:{"1":"o p q r ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD"},Q:{"2":"EC"},R:{"1025":"PD"},S:{"2":"QD RD"}},B:7,C:"Web Bluetooth",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/web-serial.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/web-serial.js
    index 80c6decbd7e180..4723c18406d585 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/web-serial.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/web-serial.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O","66":"P Q R S T U V W X"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB","66":"wB P Q R S T U V W X"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB bC cC dC eC yB LC fC zB","66":"kB lB mB nB oB pB qB rB q sB tB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:7,C:"Web Serial API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O","66":"P Q R S T U V W X"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB","66":"zB P Q R S T U V W X"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB fC gC hC iC 0B OC jC 1B","66":"nB oB pB qB rB sB tB uB s vB wB"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:7,C:"Web Serial API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/web-share.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/web-share.js
    index 5d16c1c80dacdf..34aa1d3fc9cff9 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/web-share.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/web-share.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O P Q","516":"R S T U V W X Y Z a b c d"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"4 8 9 I J D E F A B C K L G M N AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X","130":"5 6 7 O n o p","1028":"0 1 2 3 Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"L G XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C SC 9B TC UC VC WC AC yB","2049":"K zB BC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC","2049":"sC tC uC vC wC"},H:{"2":"1C"},I:{"2":"3B I 2C 3C 4C 5C MC 6C","258":"H 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"1":"n o p BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I","258":"8C 9C AD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:4,C:"Web Share API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 e f g h i j k l m n t u v w x y z D","2":"C K L H M N O P Q","516":"R S T U V W X Y Z a b c d"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"8 I J E F G A B C K L H M N BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X","130":"9 O o p q r AB","1028":"0 1 2 3 4 5 6 7 Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"L H ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C UC CC VC WC XC YC DC 0B","2049":"K 1B EC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC","2049":"wC xC yC zC 0C"},H:{"2":"6C"},I:{"2":"5B I 7C 8C 9C AD PC BD","258":"D CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"1":"o p q r GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I","258":"DD ED FD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:4,C:"Web Share API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webauthn.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webauthn.js
    index ee60cc6d87b55a..5e0b1ace797098 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webauthn.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webauthn.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C","226":"K L G M N"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B QC RC","4100":"1 2 3 H xB 7B 8B PC","5124":"0 gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z"},D:{"1":"0 1 2 3 mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB"},E:{"1":"K L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C SC 9B TC UC VC WC AC yB","322":"zB"},F:{"1":"bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bC cC dC eC yB LC fC zB"},G:{"1":"yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC","578":"uC","2052":"xC","3076":"vC wC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1028":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 2B ID JD","2":"I 8C 9C AD BD CD AC DD ED FD GD HD 1B"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2":"LD"}},B:2,C:"Web Authentication API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C","226":"K L H M N"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B SC TC","4100":"2 3 4 5 6 7 D 9B AC BC","5124":"0 1 jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z"},D:{"1":"0 1 2 3 4 5 6 7 pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB"},E:{"1":"K L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C UC CC VC WC XC YC DC 0B","322":"1B"},F:{"1":"eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB fC gC hC iC 0B OC jC 1B"},G:{"1":"2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC","578":"yC","2052":"1C","3076":"zC 0C"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1028":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r 4B ND OD","2":"I DD ED FD GD HD DC ID JD KD LD MD 3B"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2":"QD"}},B:2,C:"Web Authentication API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webcodecs.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webcodecs.js
    index 98b3e1fd2a465b..3a4e84aceee391 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webcodecs.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webcodecs.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O P Q R S T U V W X Y Z a b c"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC","132":"HC IC JC 2B KC aC"},F:{"1":"Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC","132":"HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p 2B ID JD","2":"I 8C 9C AD BD CD AC DD ED FD GD HD 1B"},Q:{"2":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:5,C:"WebCodecs API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O P Q R S T U V W X Y Z a b c"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC","132":"KC LC cC 4B MC NC dC eC"},F:{"1":"Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC","132":"KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r 4B ND OD","2":"I DD ED FD GD HD DC ID JD KD LD MD 3B"},Q:{"2":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:5,C:"WebCodecs API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webgl.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webgl.js
    index e6c35ae3b11617..33e44239263fde 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webgl.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webgl.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"NC","8":"J D E F A","129":"B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","129":"C K L G M N O"},C:{"1":"0 1 2 3 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC","129":"4 5 6 I J D E F A B C K L G M N O n o p"},D:{"1":"0 1 2 3 GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D","129":"5 6 7 8 9 E F A B C K L G M N O n o p AB BB CB DB EB FB"},E:{"1":"E F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B","129":"J D TC UC VC"},F:{"1":"5 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B bC cC dC eC yB LC fC","129":"C G M N O zB"},G:{"1":"E kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC jC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"1":"A","2":"D"},K:{"1":"C q zB","2":"A B yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"8":"A","129":"B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","129":"LD"}},B:6,C:"WebGL - 3D Canvas graphics",D:true};
    +module.exports={A:{A:{"2":"QC","8":"J E F G A","129":"B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","129":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC","129":"8 9 I J E F G A B C K L H M N O o p q r"},D:{"1":"0 1 2 3 4 5 6 7 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E","129":"9 F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB"},E:{"1":"F G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC","129":"J E VC WC XC"},F:{"1":"9 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B fC gC hC iC 0B OC jC","129":"C H M N O 1B"},G:{"1":"F oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC nC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"1":"A","2":"E"},K:{"1":"C s 1B","2":"A B 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"8":"A","129":"B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","129":"QD"}},B:6,C:"WebGL - 3D Canvas graphics",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webgl2.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webgl2.js
    index 3c0dce87c324fa..3e152d5021541b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webgl2.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webgl2.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 OC 3B I J D E F A B C K L G M N O n o p QC RC","194":"PB QB RB","450":"8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB","2242":"SB TB UB VB WB XB"},D:{"1":"0 1 2 3 dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB","578":"QB RB SB TB UB VB WB XB YB ZB aB bB cB"},E:{"1":"G YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A SC 9B TC UC VC WC","1090":"B C K L AC yB zB BC XC"},F:{"1":"QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB bC cC dC eC yB LC fC zB"},G:{"1":"zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC","1090":"rC sC tC uC vC wC xC yC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p AD BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","2242":"LD"}},B:6,C:"WebGL 2.0",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB SC TC","194":"SB TB UB","450":"BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB","2242":"VB WB XB YB ZB aB"},D:{"1":"0 1 2 3 4 5 6 7 gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB","578":"TB UB VB WB XB YB ZB aB bB cB dB eB fB"},E:{"1":"H aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A UC CC VC WC XC YC","1090":"B C K L DC 0B 1B EC ZC"},F:{"1":"TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB fC gC hC iC 0B OC jC 1B"},G:{"1":"3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC","1090":"vC wC xC yC zC 0C 1C 2C"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r FD GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","2242":"QD"}},B:6,C:"WebGL 2.0",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webgpu.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webgpu.js
    index 75620d88557313..80c6ebc1a7521e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webgpu.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webgpu.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 H","2":"C K L G M N O P","578":"Q R S T U V W X Y Z a b c","1602":"d e f g h i j k l m r s t u v w x y z"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB QC RC","194":"0 1 2 3 iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P","578":"Q R S T U V W X Y Z a b c","1602":"d e f g h i j k l m r s t u v w x y z","2049":"0 1 2 3 H xB 7B 8B"},E:{"2":"4 I J D E F A B G SC 9B TC UC VC WC AC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","322":"C K L yB zB BC XC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB bC cC dC eC yB LC fC zB","578":"q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h","2049":"i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"194":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD","194":"MD"}},B:5,C:"WebGPU",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"1 2 3 4 5 6 7 D","2":"C K L H M N O P","578":"Q R S T U V W X Y Z a b c","1602":"0 d e f g h i j k l m n t u v w x y z"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB SC TC","194":"0 1 2 3 4 5 6 7 lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P","578":"Q R S T U V W X Y Z a b c","1602":"0 d e f g h i j k l m n t u v w x y z","2049":"1 2 3 4 5 6 7 D 9B AC BC"},E:{"2":"8 I J E F G A B H UC CC VC WC XC YC DC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","322":"C K L 0B 1B EC ZC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB fC gC hC iC 0B OC jC 1B","578":"s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h","2049":"i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"194":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD","194":"RD"}},B:5,C:"WebGPU",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webhid.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webhid.js
    index ec901525b63036..08fed7eadc8bd5 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webhid.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webhid.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O","66":"P Q R S T U V W X"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB","66":"wB P Q R S T U V W X"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB bC cC dC eC yB LC fC zB","66":"lB mB nB oB pB qB rB q sB tB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:7,C:"WebHID API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O","66":"P Q R S T U V W X"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB","66":"zB P Q R S T U V W X"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB fC gC hC iC 0B OC jC 1B","66":"oB pB qB rB sB tB uB s vB wB"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:7,C:"WebHID API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webkit-user-drag.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webkit-user-drag.js
    index ba707c3a4a55f7..8454962c4cd361 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webkit-user-drag.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webkit-user-drag.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O","132":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"16":"4 I J D E F A B C K L G","132":"0 1 2 3 5 6 7 8 9 M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"F B C bC cC dC eC yB LC fC zB","132":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:7,C:"CSS -webkit-user-drag property",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O","132":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"16":"8 I J E F G A B C K L H","132":"0 1 2 3 4 5 6 7 9 M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"G B C fC gC hC iC 0B OC jC 1B","132":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:7,C:"CSS -webkit-user-drag property",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webm.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webm.js
    index d88c35923c47a1..54b3755dc73670 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webm.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webm.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E NC","520":"F A B"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","8":"C K","388":"L G M N O"},C:{"1":"0 1 2 3 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC","132":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB"},D:{"1":"0 1 2 3 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I","132":"5 6 7 J D E F A B C K L G M N O n o p"},E:{"1":"1B EC FC GC HC IC JC 2B KC aC","2":"SC","8":"4 I 9B TC","520":"J D E F A B C UC VC WC AC yB","1028":"K zB BC","7172":"L","8196":"G XC YC CC DC 0B ZC"},F:{"1":"5 6 7 8 9 M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F bC cC dC","132":"B C G eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC","1028":"sC tC uC vC wC","3076":"xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"2C 3C","132":"3B I 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"8":"A B"},O:{"1":"0B"},P:{"1":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD","132":"I"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:6,C:"WebM video format",D:true};
    +module.exports={A:{A:{"2":"J E F QC","520":"G A B"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","8":"C K","388":"L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC","132":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB"},D:{"1":"0 1 2 3 4 5 6 7 BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I","132":"9 J E F G A B C K L H M N O o p q r AB"},E:{"1":"3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC","8":"8 I CC VC","520":"J E F G A B C WC XC YC DC 0B","1028":"K 1B EC","7172":"L","8196":"H ZC aC FC GC 2B bC"},F:{"1":"9 M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G fC gC hC","132":"B C H iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC","1028":"wC xC yC zC 0C","3076":"1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"7C 8C","132":"5B I 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"8":"A B"},O:{"1":"2B"},P:{"1":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD","132":"I"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:6,C:"WebM video format",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webnfc.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webnfc.js
    index 1276299ddf14fc..7aa06617eba36a 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webnfc.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webnfc.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Y Z a b c d e f g h i j k l m r s t u v w x y z H","450":"Q R S T U V W X"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","450":"Q R S T U V W X"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","450":"mB nB oB pB qB rB q sB tB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"257":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:7,C:"Web NFC",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L H M N O P Y Z a b c d e f g h i j k l m n t u v w x y z D","450":"Q R S T U V W X"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","450":"Q R S T U V W X"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","450":"pB qB rB sB tB uB s vB wB"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"257":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:7,C:"Web NFC",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webp.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webp.js
    index ece14f79a0e812..d7359acdb3e299 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webp.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webp.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N"},C:{"1":"0 1 2 3 kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC","8":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB"},D:{"1":"0 1 2 3 FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I","8":"J D E","132":"5 F A B C K L G M N O n o p","260":"6 7 8 9 AB BB CB DB EB"},E:{"1":"1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F A B C K SC 9B TC UC VC WC AC yB zB BC","516":"L G XC YC CC DC 0B ZC"},F:{"1":"5 6 7 8 9 n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F bC cC dC","8":"B eC","132":"yB LC fC","260":"C G M N O zB"},G:{"1":"xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC"},H:{"1":"1C"},I:{"1":"H MC 6C 7C","2":"3B 2C 3C 4C","132":"I 5C"},J:{"2":"D A"},K:{"1":"C q yB LC zB","2":"A","132":"B"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","8":"LD"}},B:6,C:"WebP image format",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N"},C:{"1":"0 1 2 3 4 5 6 7 nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC","8":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB"},D:{"1":"0 1 2 3 4 5 6 7 IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I","8":"J E F","132":"9 G A B C K L H M N O o p q","260":"r AB BB CB DB EB FB GB HB"},E:{"1":"3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G A B C K UC CC VC WC XC YC DC 0B 1B EC","516":"L H ZC aC FC GC 2B bC"},F:{"1":"9 o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G fC gC hC","8":"B iC","132":"0B OC jC","260":"C H M N O 1B"},G:{"1":"1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C"},H:{"1":"6C"},I:{"1":"D PC BD CD","2":"5B 7C 8C 9C","132":"I AD"},J:{"2":"E A"},K:{"1":"C s 0B OC 1B","2":"A","132":"B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","8":"QD"}},B:6,C:"WebP image format",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/websockets.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/websockets.js
    index 6f1af5581d3b29..938d416602cec8 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/websockets.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/websockets.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B QC RC","132":"4 I","292":"J D E F A"},D:{"1":"0 1 2 3 5 6 7 8 9 M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","132":"4 I J D E F A B C K L","260":"G"},E:{"1":"D E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B","132":"4 TC","260":"J UC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"F bC cC dC eC","132":"B C yB LC fC"},G:{"1":"E iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC","132":"MC hC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"1":"A","129":"D"},K:{"1":"q zB","2":"A","132":"B C yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Web Sockets",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B SC TC","132":"8 I","292":"J E F G A"},D:{"1":"0 1 2 3 4 5 6 7 9 M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","132":"8 I J E F G A B C K L","260":"H"},E:{"1":"E F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC","132":"8 VC","260":"J WC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"G fC gC hC iC","132":"B C 0B OC jC"},G:{"1":"F mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC","132":"PC lC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"1":"A","129":"E"},K:{"1":"s 1B","2":"A","132":"B C 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Web Sockets",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webtransport.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webtransport.js
    index 80983dbe2fd896..bcaa79e8463913 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webtransport.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webtransport.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 h i j k l m r s t u v w x y z H","2":"C K L G M N O P Q R S T U V W X Y Z a b c d e f g"},C:{"1":"1 2 3 H xB 7B 8B PC","2":"0 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z QC RC"},D:{"1":"0 1 2 3 g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z e f","66":"a b c d"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p ID JD","2":"I 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B"},Q:{"2":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:5,C:"WebTransport",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 h i j k l m n t u v w x y z D","2":"C K L H M N O P Q R S T U V W X Y Z a b c d e f g"},C:{"1":"2 3 4 5 6 7 D 9B AC BC","2":"0 1 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z SC TC"},D:{"1":"0 1 2 3 4 5 6 7 g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z e f","66":"a b c d"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r ND OD","2":"I DD ED FD GD HD DC ID JD KD LD MD 3B 4B"},Q:{"2":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:5,C:"WebTransport",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webusb.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webusb.js
    index a0a968d1213c8a..eddda0c8fd2156 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webusb.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webusb.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB","66":"bB cB dB eB fB 4B gB"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB bC cC dC eC yB LC fC zB","66":"OB PB QB RB SB TB UB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"n o p BD CD AC DD ED FD GD HD 1B 2B ID JD","2":"I 8C 9C AD"},Q:{"2":"BC"},R:{"1":"KD"},S:{"2":"LD MD"}},B:7,C:"WebUSB",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB","66":"eB fB gB hB iB 6B jB"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB fC gC hC iC 0B OC jC 1B","66":"RB SB TB UB VB WB XB"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"o p q r GD HD DC ID JD KD LD MD 3B 4B ND OD","2":"I DD ED FD"},Q:{"2":"EC"},R:{"1":"PD"},S:{"2":"QD RD"}},B:7,C:"WebUSB",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webvr.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webvr.js
    index b56dceff581bb3..d7003f416c9945 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webvr.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webvr.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","66":"P","257":"G M N O"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB QC RC","129":"0 1 2 3 cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","194":"bB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","66":"eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","66":"RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"513":"I","516":"n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:7,C:"WebVR API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 6 7 C K L Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","66":"P","257":"H M N O"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB SC TC","129":"0 1 2 3 4 5 6 7 fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","194":"eB"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","66":"hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","66":"UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"513":"I","516":"o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:7,C:"WebVR API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webvtt.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webvtt.js
    index 7210b2cc6d5ee2..cc57068c2f5315 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webvtt.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webvtt.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"4 5 6 OC 3B I J D E F A B C K L G M N O n o p QC RC","66":"7 8 9 AB BB CB DB","129":"EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB","257":"0 1 2 3 cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"1":"0 1 2 3 5 6 7 8 9 O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 I J D E F A B C K L G M N"},E:{"1":"J D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B TC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC hC iC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B I 2C 3C 4C 5C MC"},J:{"1":"A","2":"D"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"B","2":"A"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"129":"LD MD"}},B:4,C:"WebVTT - Web Video Text Tracks",D:true};
    +module.exports={A:{A:{"1":"A B","2":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r SC TC","66":"AB BB CB DB EB FB GB","129":"HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB","257":"0 1 2 3 4 5 6 7 fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"1":"0 1 2 3 4 5 6 7 9 O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 I J E F G A B C K L H M N"},E:{"1":"J E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC VC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC lC mC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B I 7C 8C 9C AD PC"},J:{"1":"A","2":"E"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"B","2":"A"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"129":"QD RD"}},B:4,C:"WebVTT - Web Video Text Tracks",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webworkers.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webworkers.js
    index d21d5c375ad74b..f4089f38142a90 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webworkers.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webworkers.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","2":"NC","8":"J D E F"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","8":"OC 3B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","8":"SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m eC yB LC fC zB","2":"F bC","8":"cC dC"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC"},H:{"2":"1C"},I:{"1":"H 2C 6C 7C","2":"3B I 3C 4C 5C MC"},J:{"1":"D A"},K:{"1":"B C q yB LC zB","8":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Web Workers",D:true};
    +module.exports={A:{A:{"1":"A B","2":"QC","8":"J E F G"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","8":"RC 5B"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","8":"UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n iC 0B OC jC 1B","2":"G fC","8":"gC hC"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC"},H:{"2":"6C"},I:{"1":"D 7C BD CD","2":"5B I 8C 9C AD PC"},J:{"1":"E A"},K:{"1":"B C s 0B OC 1B","8":"A"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Web Workers",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webxr.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webxr.js
    index 4f7c834358fc66..09249b1cbb6422 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webxr.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/webxr.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"C K L G M N O","132":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB QC RC","322":"0 1 2 3 vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC"},D:{"2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB","66":"kB lB mB nB oB pB qB rB q sB tB uB vB wB","132":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"2":"4 I J D E F A B C SC 9B TC UC VC WC AC yB zB","578":"K L G BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB bC cC dC eC yB LC fC zB","66":"ZB aB bB cB dB eB fB gB hB iB jB kB","132":"lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C yB LC zB","132":"q"},L:{"132":"H"},M:{"322":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I 8C 9C AD BD CD AC DD","132":"n o p ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD","322":"MD"}},B:4,C:"WebXR Device API",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"C K L H M N O","132":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB SC TC","322":"0 1 2 3 4 5 6 7 yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},D:{"2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB","66":"nB oB pB qB rB sB tB uB s vB wB xB yB zB","132":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"2":"8 I J E F G A B C UC CC VC WC XC YC DC 0B 1B","578":"K L H EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB fC gC hC iC 0B OC jC 1B","66":"cB dB eB fB gB hB iB jB kB lB mB nB","132":"oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C 0B OC 1B","132":"s"},L:{"132":"D"},M:{"322":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I DD ED FD GD HD DC ID","132":"o p q r JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD","322":"RD"}},B:4,C:"WebXR Device API",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/will-change.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/will-change.js
    index 4e2461508374cc..899b96307d8226 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/will-change.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/will-change.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K L G M N O"},C:{"1":"0 1 2 3 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB QC RC","194":"CB DB EB FB GB HB IB"},D:{"1":"0 1 2 3 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB"},E:{"1":"A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC"},F:{"1":"7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 6 F B C G M N O n o p bC cC dC eC yB LC fC zB"},G:{"1":"mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS will-change property",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K L H M N O"},C:{"1":"0 1 2 3 4 5 6 7 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB SC TC","194":"FB GB HB IB JB KB LB"},D:{"1":"0 1 2 3 4 5 6 7 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB"},E:{"1":"A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC"},F:{"1":"AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q r fC gC hC iC 0B OC jC 1B"},G:{"1":"qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS will-change property",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/woff.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/woff.js
    index 23c3303a7efb3d..ddd77c20460cba 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/woff.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/woff.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC RC","2":"OC 3B QC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"I"},E:{"1":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I SC 9B"},F:{"1":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m yB LC fC zB","2":"F B bC cC dC eC"},G:{"1":"E hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC"},H:{"2":"1C"},I:{"1":"H 6C 7C","2":"3B 2C 3C 4C 5C MC","130":"I"},J:{"1":"D A"},K:{"1":"B C q yB LC zB","2":"A"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"WOFF - Web Open Font Format",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC TC","2":"RC 5B SC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"I"},E:{"1":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I UC CC"},F:{"1":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 0B OC jC 1B","2":"G B fC gC hC iC"},G:{"1":"F lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC"},H:{"2":"6C"},I:{"1":"D BD CD","2":"5B 7C 8C 9C AD PC","130":"I"},J:{"1":"E A"},K:{"1":"B C s 0B OC 1B","2":"A"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"WOFF - Web Open Font Format",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/woff2.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/woff2.js
    index fda53916da34d6..d49385c3987ebd 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/woff2.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/woff2.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"1":"0 1 2 3 L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","2":"C K"},C:{"1":"0 1 2 3 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB QC RC"},D:{"1":"0 1 2 3 JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","2":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB"},E:{"1":"C K L G zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"4 I J D E F SC 9B TC UC VC WC","132":"A B AC yB"},F:{"1":"6 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"5 F B C G M N O n o p bC cC dC eC yB LC fC zB"},G:{"1":"nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"E 9B gC MC hC iC jC kC lC mC"},H:{"2":"1C"},I:{"1":"H","2":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"2":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:2,C:"WOFF 2.0 - Web Open Font Format",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","2":"C K"},C:{"1":"0 1 2 3 4 5 6 7 PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB"},E:{"1":"C K L H 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"8 I J E F G UC CC VC WC XC YC","132":"A B DC 0B"},F:{"1":"r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"9 G B C H M N O o p q fC gC hC iC 0B OC jC 1B"},G:{"1":"rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"F CC kC PC lC mC nC oC pC qC"},H:{"2":"6C"},I:{"1":"D","2":"5B I 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"2":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:2,C:"WOFF 2.0 - Web Open Font Format",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/word-break.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/word-break.js
    index 801dc8fc24da69..ba8ab713cd21e7 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/word-break.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/word-break.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"J D E F A B NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"4 OC 3B I J D E F A B C K L QC RC"},D:{"1":"0 1 2 3 RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","4":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB"},E:{"1":"F A B C K L G WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","4":"4 I J D E SC 9B TC UC VC"},F:{"1":"EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","2":"F B C bC cC dC eC yB LC fC zB","4":"5 6 7 8 9 G M N O n o p AB BB CB DB"},G:{"1":"lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","4":"E 9B gC MC hC iC jC kC"},H:{"2":"1C"},I:{"1":"H","4":"3B I 2C 3C 4C 5C MC 6C 7C"},J:{"4":"D A"},K:{"1":"q","2":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"CSS3 word-break",D:true};
    +module.exports={A:{A:{"1":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"8 RC 5B I J E F G A B C K L SC TC"},D:{"1":"0 1 2 3 4 5 6 7 UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","4":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB"},E:{"1":"G A B C K L H YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","4":"8 I J E F UC CC VC WC XC"},F:{"1":"HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","2":"G B C fC gC hC iC 0B OC jC 1B","4":"9 H M N O o p q r AB BB CB DB EB FB GB"},G:{"1":"pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","4":"F CC kC PC lC mC nC oC"},H:{"2":"6C"},I:{"1":"D","4":"5B I 7C 8C 9C AD PC BD CD"},J:{"4":"E A"},K:{"1":"s","2":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"CSS3 word-break",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wordwrap.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wordwrap.js
    index a56b8594570638..b051545a686a59 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wordwrap.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/wordwrap.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"4":"J D E F A B NC"},B:{"1":"0 1 2 3 O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","4":"C K L G M N"},C:{"1":"0 1 2 3 WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B","4":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB QC RC"},D:{"1":"0 1 2 3 6 7 8 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","4":"4 5 I J D E F A B C K L G M N O n o p"},E:{"1":"D E F A B C K L G UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","4":"4 I J SC 9B TC"},F:{"1":"5 6 7 8 9 G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"F bC cC","4":"B C dC eC yB LC fC"},G:{"1":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","4":"9B gC MC hC iC"},H:{"4":"1C"},I:{"1":"H 6C 7C","4":"3B I 2C 3C 4C 5C MC"},J:{"1":"A","4":"D"},K:{"1":"q","4":"A B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"4":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"MD","4":"LD"}},B:4,C:"CSS3 Overflow-wrap",D:true};
    +module.exports={A:{A:{"4":"J E F G A B QC"},B:{"1":"0 1 2 3 4 5 6 7 O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D","4":"C K L H M N"},C:{"1":"0 1 2 3 4 5 6 7 ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B","4":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB SC TC"},D:{"1":"0 1 2 3 4 5 6 7 r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","4":"8 9 I J E F G A B C K L H M N O o p q"},E:{"1":"E F G A B C K L H WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","4":"8 I J UC CC VC"},F:{"1":"9 H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"G fC gC","4":"B C hC iC 0B OC jC"},G:{"1":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","4":"CC kC PC lC mC"},H:{"4":"6C"},I:{"1":"D BD CD","4":"5B I 7C 8C 9C AD PC"},J:{"1":"A","4":"E"},K:{"1":"s","4":"A B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"4":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"RD","4":"QD"}},B:4,C:"CSS3 Overflow-wrap",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/x-doc-messaging.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/x-doc-messaging.js
    index 8976faf17f051b..a7ee82856ca053 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/x-doc-messaging.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/x-doc-messaging.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D NC","132":"E F","260":"A B"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC","2":"OC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"SC 9B"},F:{"1":"5 6 7 8 9 B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB","2":"F"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"4":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"Cross-document messaging",D:true};
    +module.exports={A:{A:{"2":"J E QC","132":"F G","260":"A B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC","2":"RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"UC CC"},F:{"1":"9 B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B","2":"G"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"4":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"Cross-document messaging",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/x-frame-options.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/x-frame-options.js
    index 010c73352ac098..85c293d5c6815d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/x-frame-options.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/x-frame-options.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"E F A B","2":"J D NC"},B:{"1":"C K L G M N O","4":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"5 6 7 8 9 O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB","4":"0 1 2 3 4 I J D E F A B C K L G M N pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","16":"OC 3B QC RC"},D:{"4":"0 1 2 3 9 AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 5 6 7 8 I J D E F A B C K L G M N O n o p"},E:{"4":"J D E F A B C K L G TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","16":"4 I SC 9B"},F:{"4":"5 6 7 8 9 C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m fC zB","16":"F B bC cC dC eC yB LC"},G:{"4":"E jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","16":"9B gC MC hC iC"},H:{"2":"1C"},I:{"4":"I H 5C MC 6C 7C","16":"3B 2C 3C 4C"},J:{"4":"D A"},K:{"4":"q zB","16":"A B C yB LC"},L:{"4":"H"},M:{"4":"xB"},N:{"1":"A B"},O:{"4":"0B"},P:{"4":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"4":"BC"},R:{"4":"KD"},S:{"1":"LD","4":"MD"}},B:6,C:"X-Frame-Options HTTP header",D:true};
    +module.exports={A:{A:{"1":"F G A B","2":"J E QC"},B:{"1":"C K L H M N O","4":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"9 O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB","4":"0 1 2 3 4 5 6 7 8 I J E F G A B C K L H M N sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"RC 5B SC TC"},D:{"4":"0 1 2 3 4 5 6 7 CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 9 I J E F G A B C K L H M N O o p q r AB BB"},E:{"4":"J E F G A B C K L H VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","16":"8 I UC CC"},F:{"4":"9 C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n jC 1B","16":"G B fC gC hC iC 0B OC"},G:{"4":"F nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","16":"CC kC PC lC mC"},H:{"2":"6C"},I:{"4":"I D AD PC BD CD","16":"5B 7C 8C 9C"},J:{"4":"E A"},K:{"4":"s 1B","16":"A B C 0B OC"},L:{"4":"D"},M:{"4":"D"},N:{"1":"A B"},O:{"4":"2B"},P:{"4":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"4":"EC"},R:{"4":"PD"},S:{"1":"QD","4":"RD"}},B:6,C:"X-Frame-Options HTTP header",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/xhr2.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/xhr2.js
    index 64c3a14cc7e393..34fb6548fe9090 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/xhr2.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/xhr2.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F NC","132":"A B"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","2":"OC 3B","260":"A B","388":"J D E F","900":"4 I QC RC"},D:{"1":"0 1 2 3 EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","16":"4 I J","132":"CB DB","388":"5 6 7 8 9 D E F A B C K L G M N O n o p AB BB"},E:{"1":"E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","2":"I SC 9B","132":"D UC","388":"4 J TC"},F:{"1":"5 6 7 8 9 C O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m zB","2":"F B bC cC dC eC yB LC fC","132":"G M N"},G:{"1":"E kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","2":"9B gC MC","132":"jC","388":"hC iC"},H:{"2":"1C"},I:{"1":"H 7C","2":"2C 3C 4C","388":"6C","900":"3B I 5C MC"},J:{"132":"A","388":"D"},K:{"1":"C q zB","2":"A B yB LC"},L:{"1":"H"},M:{"1":"xB"},N:{"132":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"XMLHttpRequest advanced features",D:true};
    +module.exports={A:{A:{"2":"J E F G QC","132":"A B"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","2":"RC 5B","260":"A B","388":"J E F G","900":"8 I SC TC"},D:{"1":"0 1 2 3 4 5 6 7 HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","16":"8 I J","132":"FB GB","388":"9 E F G A B C K L H M N O o p q r AB BB CB DB EB"},E:{"1":"F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","2":"I UC CC","132":"E WC","388":"8 J VC"},F:{"1":"9 C O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n 1B","2":"G B fC gC hC iC 0B OC jC","132":"H M N"},G:{"1":"F oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","2":"CC kC PC","132":"nC","388":"lC mC"},H:{"2":"6C"},I:{"1":"D CD","2":"7C 8C 9C","388":"BD","900":"5B I AD PC"},J:{"132":"A","388":"E"},K:{"1":"C s 1B","2":"A B 0B OC"},L:{"1":"D"},M:{"1":"D"},N:{"132":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"XMLHttpRequest advanced features",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/xhtml.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/xhtml.js
    index 7a659f3d35e3d4..86001525a67728 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/xhtml.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/xhtml.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"F A B","2":"J D E NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"1":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"1":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"1":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"1":"1C"},I:{"1":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"1":"D A"},K:{"1":"A B C q yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:1,C:"XHTML served as application/xhtml+xml",D:true};
    +module.exports={A:{A:{"1":"G A B","2":"J E F QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"1":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"1":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"1":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"1":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"1":"6C"},I:{"1":"5B I D 7C 8C 9C AD PC BD CD"},J:{"1":"E A"},K:{"1":"A B C s 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:1,C:"XHTML served as application/xhtml+xml",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/xhtmlsmil.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/xhtmlsmil.js
    index 836190acd94521..72adfb64d1f594 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/xhtmlsmil.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/xhtmlsmil.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"F A B NC","4":"J D E"},B:{"2":"C K L G M N O","8":"0 1 2 3 P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"8":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"8":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B"},E:{"8":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"8":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"8":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"8":"1C"},I:{"8":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"8":"D A"},K:{"8":"A B C q yB LC zB"},L:{"8":"H"},M:{"8":"xB"},N:{"2":"A B"},O:{"8":"0B"},P:{"8":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"8":"BC"},R:{"8":"KD"},S:{"8":"LD MD"}},B:7,C:"XHTML+SMIL animation",D:true};
    +module.exports={A:{A:{"2":"G A B QC","4":"J E F"},B:{"2":"C K L H M N O","8":"0 1 2 3 4 5 6 7 P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"8":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"8":"0 1 2 3 4 5 6 7 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC"},E:{"8":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"8":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"8":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"8":"6C"},I:{"8":"5B I D 7C 8C 9C AD PC BD CD"},J:{"8":"E A"},K:{"8":"A B C s 0B OC 1B"},L:{"8":"D"},M:{"8":"D"},N:{"2":"A B"},O:{"8":"2B"},P:{"8":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"8":"EC"},R:{"8":"PD"},S:{"8":"QD RD"}},B:7,C:"XHTML+SMIL animation",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/xml-serializer.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/xml-serializer.js
    index 27c22f8c2ea9ed..27c12502384413 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/xml-serializer.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/xml-serializer.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"1":"A B","260":"J D E F NC"},B:{"1":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"1":"0 1 2 3 5 6 7 8 9 C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC","132":"B","260":"4 OC 3B I J D QC RC","516":"E F A"},D:{"1":"0 1 2 3 EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B","132":"4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB"},E:{"1":"E F A B C K L G VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC","132":"4 I J D SC 9B TC UC"},F:{"1":"5 6 7 8 9 O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m","16":"F bC","132":"B C G M N cC dC eC yB LC fC zB"},G:{"1":"E kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC","132":"9B gC MC hC iC jC"},H:{"132":"1C"},I:{"1":"H 6C 7C","132":"3B I 2C 3C 4C 5C MC"},J:{"132":"D A"},K:{"1":"q","16":"A","132":"B C yB LC zB"},L:{"1":"H"},M:{"1":"xB"},N:{"1":"A B"},O:{"1":"0B"},P:{"1":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"1":"BC"},R:{"1":"KD"},S:{"1":"LD MD"}},B:4,C:"DOM Parsing and Serialization",D:true};
    +module.exports={A:{A:{"1":"A B","260":"J E F G QC"},B:{"1":"0 1 2 3 4 5 6 7 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D"},C:{"1":"0 1 2 3 4 5 6 7 9 C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","132":"B","260":"8 RC 5B I J E SC TC","516":"F G A"},D:{"1":"0 1 2 3 4 5 6 7 HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC","132":"8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB"},E:{"1":"F G A B C K L H XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC","132":"8 I J E UC CC VC WC"},F:{"1":"9 O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n","16":"G fC","132":"B C H M N gC hC iC 0B OC jC 1B"},G:{"1":"F oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC","132":"CC kC PC lC mC nC"},H:{"132":"6C"},I:{"1":"D BD CD","132":"5B I 7C 8C 9C AD PC"},J:{"132":"E A"},K:{"1":"s","16":"A","132":"B C 0B OC 1B"},L:{"1":"D"},M:{"1":"D"},N:{"1":"A B"},O:{"1":"2B"},P:{"1":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"1":"EC"},R:{"1":"PD"},S:{"1":"QD RD"}},B:4,C:"DOM Parsing and Serialization",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/zstd.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/zstd.js
    index c0fbffa36795e1..15b7ebd418524a 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/zstd.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/features/zstd.js
    @@ -1 +1 @@
    -module.exports={A:{A:{"2":"J D E F A B NC"},B:{"2":"0 1 2 3 C K L G M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H"},C:{"2":"0 1 2 3 4 5 6 7 8 9 OC 3B I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H xB 7B 8B PC QC RC"},D:{"2":"0 1 2 3 4 5 6 7 8 9 I J D E F A B C K L G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB 4B gB 5B hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R S T U V W X Y Z a b c d e f g h i j k l m r s t u v w x y z H","194":"xB 7B 8B"},E:{"2":"4 I J D E F A B C K L G SC 9B TC UC VC WC AC yB zB BC XC YC CC DC 0B ZC 1B EC FC GC HC IC JC 2B KC aC"},F:{"2":"5 6 7 8 9 F B C G M N O n o p AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB q sB tB uB vB wB P Q R 6B S T U V W X Y Z a b c d e f g h i j k l m bC cC dC eC yB LC fC zB"},G:{"2":"E 9B gC MC hC iC jC kC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC CC DC 0B 0C 1B EC FC GC HC IC JC 2B KC"},H:{"2":"1C"},I:{"2":"3B I H 2C 3C 4C 5C MC 6C 7C"},J:{"2":"D A"},K:{"2":"A B C q yB LC zB"},L:{"2":"H"},M:{"2":"xB"},N:{"2":"A B"},O:{"2":"0B"},P:{"2":"I n o p 8C 9C AD BD CD AC DD ED FD GD HD 1B 2B ID JD"},Q:{"2":"BC"},R:{"2":"KD"},S:{"2":"LD MD"}},B:6,C:"zstd (Zstandard) content-encoding",D:true};
    +module.exports={A:{A:{"2":"J E F G A B QC"},B:{"2":"0 1 2 3 4 5 C K L H M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z","194":"6 7 D"},C:{"2":"0 1 2 3 4 5 6 7 8 9 RC 5B I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z D 9B AC BC SC TC"},D:{"2":"0 1 2 3 4 5 8 9 I J E F G A B C K L H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB 6B jB 7B kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R S T U V W X Y Z a b c d e f g h i j k l m n t u v w x y z","194":"6 7 D 9B AC BC"},E:{"2":"8 I J E F G A B C K L H UC CC VC WC XC YC DC 0B 1B EC ZC aC FC GC 2B bC 3B HC IC JC KC LC cC 4B MC NC dC eC"},F:{"2":"9 G B C H M N O o p q r AB BB CB DB EB FB GB HB IB JB KB LB MB NB OB PB QB RB SB TB UB VB WB XB YB ZB aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB s vB wB xB yB zB P Q R 8B S T U V W X Y Z a b c d e f g h i j k l m n fC gC hC iC 0B OC jC 1B"},G:{"2":"F CC kC PC lC mC nC oC pC qC rC sC tC uC vC wC xC yC zC 0C 1C 2C 3C FC GC 2B 4C 3B HC IC JC KC LC 5C 4B MC NC"},H:{"2":"6C"},I:{"2":"5B I D 7C 8C 9C AD PC BD CD"},J:{"2":"E A"},K:{"2":"A B C s 0B OC 1B"},L:{"2":"D"},M:{"2":"D"},N:{"2":"A B"},O:{"2":"2B"},P:{"2":"I o p q r DD ED FD GD HD DC ID JD KD LD MD 3B 4B ND OD"},Q:{"2":"EC"},R:{"2":"PD"},S:{"2":"QD RD"}},B:6,C:"zstd (Zstandard) content-encoding",D:true};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AD.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AD.js
    index 4166a6245dfca5..def4a14131ab96 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AD.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AD.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.03369,"49":0,"50":0,"51":0,"52":0.00421,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00421,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.01263,"79":0,"80":0.00421,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.00842,"102":0,"103":0.00842,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0.00421,"112":0,"113":0.00421,"114":0.00421,"115":0.07159,"116":0.03369,"117":0.67376,"118":0.05895,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0.00421,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0.00421,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00421,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0.00421,"45":0.00421,"46":0.00421,"47":0.00421,"48":0,"49":0.00842,"50":0,"51":0.00421,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.00842,"80":0,"81":0.00421,"83":0,"84":0.00421,"85":0.01263,"86":0.00421,"87":0.00842,"88":0.00421,"89":0.00421,"90":0,"91":0.02527,"92":0.01684,"93":0,"94":0,"95":0,"96":0.00842,"97":0,"98":0,"99":0.02106,"100":0.01263,"101":0,"102":0,"103":0.04211,"104":0,"105":0.00842,"106":0,"107":0,"108":0.00421,"109":0.40426,"110":0.0379,"111":0.00421,"112":0.01263,"113":0.02948,"114":0.12633,"115":0.40426,"116":5.19637,"117":2.20235,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0.00421,"99":0.00421,"100":0.02527,"101":0.32004,"102":0.26108,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0.00421,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0.00421,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00421,"108":0,"109":0.00842,"110":0,"111":0,"112":0,"113":0,"114":0.00842,"115":0.0379,"116":0.5727,"117":0.48848},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00421,"10":0,"11":0,"12":0,"13":0,"14":0.02106,"15":0.00421,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.09264,"14.1":0.05474,"15.1":0.04632,"15.2-15.3":0.0379,"15.4":0.06317,"15.5":0.06738,"15.6":0.3832,"16.0":0.16002,"16.1":0.12633,"16.2":0.13475,"16.3":0.45479,"16.4":0.15581,"16.5":0.5348,"16.6":3.11614,"17.0":0.28214,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.03336,"8.1-8.4":0.0278,"9.0-9.2":0,"9.3":0.0278,"10.0-10.2":0,"10.3":0.03336,"11.0-11.2":0.02224,"11.3-11.4":0,"12.0-12.1":0.0278,"12.2-12.5":0.17236,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0.06116,"14.0-14.4":0.03892,"14.5-14.8":0.18348,"15.0-15.1":0.14456,"15.2-15.3":0.68943,"15.4":0.2224,"15.5":0.49483,"15.6-15.7":3.31929,"16.0":2.10722,"16.1":3.4972,"16.2":1.32883,"16.3":2.72437,"16.4":0.54487,"16.5":2.27402,"16.6":33.36521,"17.0":3.53056,"17.1":0.00556},P:{"4":0.0409,"20":0.01023,"21":0.06135,"22":1.19642,"5.0-5.4":0,"6.2-6.4":0.01023,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.02045,"12.0":0,"13.0":0,"14.0":0.02045,"15.0":0.01023,"16.0":0,"17.0":0.01023,"18.0":0,"19.0":0.02045},I:{"0":0,"3":0.00236,"4":0.00943,"2.1":0.00825,"2.2":0.00825,"2.3":0.01179,"4.1":0.01061,"4.2-4.3":0.02358,"4.4":0,"4.4.3-4.4.4":0.06837},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.0379,"9":0.00421,"10":0.00842,"11":0.02527,"5.5":0},S:{"2.5":0.00579,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0.01158},L:{"0":25.02781},R:{_:"0"},M:{"0":0.19104},Q:{"13.1":0},O:{"0":0.02316},H:{"0":0.07673}};
    +module.exports={C:{"2":0.00408,"3":0.00408,"4":0.00408,"5":0.00408,"16":0.00408,"26":0.00408,"27":0.00408,"28":0.00408,"38":0.00408,"39":0.00408,"40":0.00408,"41":0.00408,"48":0.01633,"52":0.01633,"68":0.00817,"78":0.01633,"83":0.00408,"102":0.00817,"105":0.00408,"107":0.00408,"109":0.00817,"110":0.02858,"112":0.00817,"114":0.00817,"115":0.17149,"117":0.01225,"118":0.04491,"119":0.89418,"120":0.29806,_:"6 7 8 9 10 11 12 13 14 15 17 18 19 20 21 22 23 24 25 29 30 31 32 33 34 35 36 37 42 43 44 45 46 47 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 79 80 81 82 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 103 104 106 108 111 113 116 121 122 123","3.5":0.00408,"3.6":0.00408},D:{"4":0.00408,"11":0.00408,"17":0.00408,"19":0.00408,"21":0.00408,"28":0.00408,"29":0.00408,"31":0.00408,"32":0.00408,"36":0.00408,"37":0.00408,"38":0.00408,"39":0.00817,"40":0.00408,"41":0.01225,"42":0.00408,"43":0.00817,"44":0.01633,"45":0.01633,"46":0.01225,"47":0.01225,"49":0.00408,"51":0.01225,"70":0.00408,"76":0.00408,"79":0.00817,"84":0.00817,"86":0.03266,"87":0.01225,"88":0.00408,"89":0.00817,"90":0.02042,"91":0.00817,"94":0.00408,"96":0.00408,"97":0.00408,"98":0.049,"99":0.01225,"100":0.01633,"102":0.00817,"103":0.09391,"104":0.01633,"105":0.04083,"106":0.00408,"107":0.03266,"108":0.02042,"109":0.93909,"110":0.07758,"112":0.00817,"113":0.06941,"114":0.03675,"115":0.06125,"116":0.6002,"117":0.48588,"118":2.89076,"119":12.50215,"120":0.00408,_:"5 6 7 8 9 10 12 13 14 15 16 18 20 22 23 24 25 26 27 30 33 34 35 48 50 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 71 72 73 74 75 77 78 80 81 83 85 92 93 95 101 111 121 122"},F:{"31":0.00817,"32":0.00408,"46":0.00408,"98":0.00817,"102":0.72677,"103":0.05308,"104":0.42463,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.00817},B:{"87":0.00408,"98":0.00408,"106":0.06533,"108":0.00408,"109":0.00817,"111":0.0245,"115":0.00817,"117":0.04083,"118":0.34706,"119":1.79652,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 88 89 90 91 92 93 94 95 96 97 99 100 101 102 103 104 105 107 110 112 113 114 116"},E:{"8":0.00408,"9":0.0245,"14":0.02858,"15":0.00817,_:"0 4 5 6 7 10 11 12 13 3.2 5.1 6.1 7.1 9.1 10.1 11.1","3.1":0.00408,"12.1":0.00408,"13.1":0.05308,"14.1":0.15924,"15.1":0.07758,"15.2-15.3":0.12657,"15.4":0.17149,"15.5":0.28581,"15.6":1.16774,"16.0":0.18782,"16.1":0.30623,"16.2":0.39605,"16.3":1.06975,"16.4":0.51038,"16.5":1.00442,"16.6":4.4668,"17.0":1.54746,"17.1":4.63421,"17.2":0.20823},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00769,"5.0-5.1":0.00769,"6.0-6.1":0.01923,"7.0-7.1":0.02693,"8.1-8.4":0.00385,"9.0-9.2":0.03077,"9.3":0.09616,"10.0-10.2":0.00769,"10.3":0.13848,"11.0-11.2":0.06539,"11.3-11.4":0.0577,"12.0-12.1":0.03462,"12.2-12.5":0.63084,"13.0-13.1":0.01539,"13.2":0.06539,"13.3":0.03847,"13.4-13.7":0.11155,"14.0-14.4":0.29619,"14.5-14.8":0.48082,"15.0-15.1":0.18848,"15.2-15.3":0.23079,"15.4":0.25772,"15.5":0.36158,"15.6-15.7":1.90021,"16.0":0.89241,"16.1":1.78866,"16.2":0.85779,"16.3":1.60787,"16.4":0.33081,"16.5":0.85394,"16.6-16.7":14.47469,"17.0":4.3351,"17.1":7.28158,"17.2":0.20772},P:{"4":0.02085,"20":0.01043,"21":0.03128,"22":0.05214,"23":2.13759,_:"5.0-5.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 17.0 18.0","6.2-6.4":0.01043,"19.0":0.02085},I:{"0":0.13539,"3":0.00001,"4":0.00003,"2.1":0,"2.2":0.00003,"2.3":0,"4.1":0.00001,"4.2-4.3":0.0001,"4.4":0,"4.4.3-4.4.4":0.00041},K:{"0":0.13015,_:"10 11 12 11.1 11.5 12.1"},A:{"6":0.00817,"7":0.01225,"8":0.09391,"9":0.01633,"10":0.0245,"11":0.07758,_:"5.5"},N:{_:"10 11"},S:{"2.5":0.00592,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.02958},H:{"0":0},L:{"0":17.87508},R:{_:"0"},M:{"0":0.28988},Q:{"13.1":0.00592}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AE.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AE.js
    index 932de97b6ce042..04d31e99756325 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AE.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AE.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0.00305,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00305,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00305,"103":0.00609,"104":0,"105":0.00305,"106":0,"107":0,"108":0,"109":0.00305,"110":0.00305,"111":0,"112":0,"113":0,"114":0,"115":0.02133,"116":0.01524,"117":0.1554,"118":0.01524,"119":0.00305,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00305,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.14626,"36":0,"37":0,"38":0.00305,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00305,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00305,"66":0,"67":0,"68":0.00305,"69":0.00305,"70":0,"71":0,"72":0.00305,"73":0.00914,"74":0,"75":0.00305,"76":0.00609,"77":0,"78":0.00305,"79":0.01524,"80":0.00305,"81":0.00609,"83":0.00305,"84":0.00609,"85":0.01219,"86":0.00609,"87":0.00914,"88":0.00914,"89":0.00305,"90":0.00305,"91":0.00609,"92":0.00305,"93":0.01219,"94":0.00305,"95":0.00305,"96":0,"97":0.00305,"98":0.00609,"99":0.00914,"100":0.01219,"101":0.01524,"102":0.00609,"103":0.05789,"104":0.01219,"105":0.01219,"106":0.00914,"107":0.01524,"108":0.01524,"109":0.49666,"110":0.01524,"111":0.07313,"112":0.02133,"113":0.18587,"114":0.10665,"115":0.11883,"116":4.10126,"117":0.95066,"118":0.00305,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00305,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00305,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00305,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.00305,"71":0,"72":0.01219,"73":0.00609,"74":0.00305,"75":0.00609,"76":0,"77":0.04266,"78":0.01219,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.00305,"95":0.00305,"96":0.00305,"97":0.00305,"98":0,"99":0.00609,"100":0.02742,"101":0.07313,"102":0.08836,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00305,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00305,"108":0.00914,"109":0.00609,"110":0,"111":0.00305,"112":0,"113":0.00305,"114":0.00914,"115":0.02438,"116":0.42963,"117":0.29556},E:{"4":0,"5":0,"6":0,"7":0,"8":0.01524,"9":0,"10":0,"11":0.00305,"12":0,"13":0.00305,"14":0.01219,"15":0.00305,_:"0","3.1":0,"3.2":0,"5.1":0.00305,"6.1":0,"7.1":0,"9.1":0.00305,"10.1":0,"11.1":0,"12.1":0.00305,"13.1":0.00914,"14.1":0.03961,"15.1":0.00609,"15.2-15.3":0.00609,"15.4":0.01219,"15.5":0.02133,"15.6":0.07008,"16.0":0.00609,"16.1":0.03047,"16.2":0.02438,"16.3":0.06094,"16.4":0.02438,"16.5":0.06094,"16.6":0.39306,"17.0":0.03961,"17.1":0},G:{"8":0.0016,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.0032,"6.0-6.1":0,"7.0-7.1":0.01282,"8.1-8.4":0,"9.0-9.2":0.0016,"9.3":0.05769,"10.0-10.2":0.00641,"10.3":0.05769,"11.0-11.2":0.01282,"11.3-11.4":0.00801,"12.0-12.1":0.00641,"12.2-12.5":0.20031,"13.0-13.1":0.00641,"13.2":0.00641,"13.3":0.00961,"13.4-13.7":0.03525,"14.0-14.4":0.09134,"14.5-14.8":0.16025,"15.0-15.1":0.10737,"15.2-15.3":0.0657,"15.4":0.08012,"15.5":0.13461,"15.6-15.7":1.1618,"16.0":0.49356,"16.1":0.66663,"16.2":0.37498,"16.3":0.77239,"16.4":0.13942,"16.5":0.53523,"16.6":9.21905,"17.0":1.38454,"17.1":0.0032},P:{"4":0.09204,"20":0.05114,"21":0.07159,"22":1.58521,"5.0-5.4":0.01023,"6.2-6.4":0,"7.2-7.4":0.02045,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01023,"12.0":0,"13.0":0.01023,"14.0":0,"15.0":0,"16.0":0.01023,"17.0":0.02045,"18.0":0.02045,"19.0":0.03068},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.08524},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.09446,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":67.05963},R:{_:"0"},M:{"0":0.16687},Q:{"13.1":0},O:{"0":3.14971},H:{"0":0.90182}};
    +module.exports={C:{"34":0.00262,"52":0.00262,"68":0.00262,"75":0.00262,"78":0.00262,"80":0.00262,"81":0.00262,"88":0.00262,"102":0.00262,"103":0.00262,"104":0.00262,"105":0.00787,"106":0.00262,"108":0.00262,"109":0.0105,"110":0.00262,"112":0.00262,"115":0.07347,"116":0.00525,"117":0.00787,"118":0.02886,"119":0.39098,"120":0.11283,"121":0.0105,"122":0.00525,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 76 77 79 82 83 84 85 86 87 89 90 91 92 93 94 95 96 97 98 99 100 101 107 111 113 114 123 3.5 3.6"},D:{"11":0.00525,"22":0.00525,"29":0.02099,"35":0.25978,"38":0.00787,"41":0.00525,"43":0.00262,"48":0.00262,"49":0.00787,"51":0.00262,"56":0.00525,"58":0.01837,"63":0.00262,"65":0.00262,"68":0.00262,"69":0.02099,"70":0.00262,"71":0.00262,"72":0.00787,"73":0.00262,"74":0.00262,"75":0.00787,"76":0.0105,"77":0.00262,"78":0.00525,"79":0.03411,"80":0.00525,"81":0.00262,"83":0.01574,"84":0.00787,"85":0.03149,"86":0.02099,"87":0.02362,"88":0.00787,"89":0.00787,"90":0.00525,"91":0.0105,"92":0.00525,"93":0.04986,"94":0.02624,"95":0.01312,"96":0.00787,"97":0.04461,"98":0.02099,"99":0.01574,"100":0.01312,"101":0.02362,"102":0.01837,"103":0.18106,"104":0.02624,"105":0.01837,"106":0.03674,"107":0.0551,"108":0.07872,"109":0.75571,"110":0.04723,"111":0.05248,"112":0.02886,"113":0.10496,"114":0.21779,"115":0.06298,"116":0.23878,"117":0.5248,"118":3.05171,"119":11.91034,"120":0.02362,"121":0.00525,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 23 24 25 26 27 28 30 31 32 33 34 36 37 39 40 42 44 45 46 47 50 52 53 54 55 57 59 60 61 62 64 66 67 122"},F:{"28":0.00262,"36":0.00262,"46":0.00525,"70":0.00262,"78":0.00262,"79":0.00262,"83":0.00262,"85":0.00262,"93":0.00262,"95":0.0105,"96":0.00262,"98":0.00262,"99":0.00262,"100":0.00262,"101":0.00262,"102":0.28077,"103":0.0551,"104":0.26765,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 71 72 73 74 75 76 77 80 81 82 84 86 87 88 89 90 91 92 94 97 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"16":0.00262,"18":0.00525,"85":0.00262,"92":0.01312,"100":0.00262,"106":0.00525,"107":0.00525,"108":0.0105,"109":0.02624,"110":0.00525,"111":0.00262,"112":0.00262,"113":0.00787,"114":0.02099,"115":0.01574,"116":0.0105,"117":0.03936,"118":0.42246,"119":1.96275,_:"12 13 14 15 17 79 80 81 83 84 86 87 88 89 90 91 93 94 95 96 97 98 99 101 102 103 104 105"},E:{"9":0.00262,"11":0.00525,"13":0.00525,"14":0.03936,"15":0.00787,_:"0 4 5 6 7 8 10 12 3.1 3.2 6.1 7.1 10.1 11.1","5.1":0.02624,"9.1":0.00262,"12.1":0.00787,"13.1":0.04198,"14.1":0.09184,"15.1":0.01837,"15.2-15.3":0.01574,"15.4":0.03411,"15.5":0.03936,"15.6":0.24141,"16.0":0.02886,"16.1":0.07347,"16.2":0.06035,"16.3":0.12858,"16.4":0.0761,"16.5":0.12333,"16.6":0.62451,"17.0":0.35949,"17.1":0.48806,"17.2":0.01312},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00229,"5.0-5.1":0.00229,"6.0-6.1":0.00573,"7.0-7.1":0.00802,"8.1-8.4":0.00115,"9.0-9.2":0.00917,"9.3":0.02865,"10.0-10.2":0.00229,"10.3":0.04126,"11.0-11.2":0.01948,"11.3-11.4":0.01719,"12.0-12.1":0.01031,"12.2-12.5":0.18796,"13.0-13.1":0.00458,"13.2":0.01948,"13.3":0.01146,"13.4-13.7":0.03324,"14.0-14.4":0.08825,"14.5-14.8":0.14326,"15.0-15.1":0.05616,"15.2-15.3":0.06876,"15.4":0.07679,"15.5":0.10773,"15.6-15.7":0.56616,"16.0":0.26589,"16.1":0.53292,"16.2":0.25557,"16.3":0.47906,"16.4":0.09856,"16.5":0.25443,"16.6-16.7":4.31268,"17.0":1.29163,"17.1":2.16952,"17.2":0.06189},P:{"4":0.07239,"20":0.03102,"21":0.04137,"22":0.13444,"23":1.42712,"5.0-5.4":0.01034,_:"6.2-6.4 8.2 9.2 10.1 12.0 15.0","7.2-7.4":0.03102,"11.1-11.2":0.01034,"13.0":0.01034,"14.0":0.01034,"16.0":0.01034,"17.0":0.01034,"18.0":0.02068,"19.0":0.03102},I:{"0":0.05137,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00004,"4.4":0,"4.4.3-4.4.4":0.00015},K:{"0":1.34225,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00269,"11":0.42502,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.00738,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":2.73613},H:{"0":0},L:{"0":56.85394},R:{_:"0"},M:{"0":0.11063},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AF.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AF.js
    index 23ee2e99c6f137..8b56c5166f9e0e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AF.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AF.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00145,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00145,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00145,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00145,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0.00145,"114":0.00145,"115":0.03199,"116":0.00436,"117":0.04362,"118":0.00291,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00145,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.00145,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0.00291,"63":0.00145,"64":0,"65":0,"66":0,"67":0.00145,"68":0,"69":0.00145,"70":0.00145,"71":0.00291,"72":0.00145,"73":0.00145,"74":0,"75":0,"76":0,"77":0,"78":0.00145,"79":0.00145,"80":0.00291,"81":0.00291,"83":0.00145,"84":0,"85":0.00145,"86":0.00291,"87":0.00291,"88":0,"89":0.00145,"90":0.00145,"91":0.00145,"92":0.00291,"93":0.00145,"94":0.00291,"95":0,"96":0.00291,"97":0.00145,"98":0,"99":0.00145,"100":0,"101":0,"102":0.00436,"103":0.00291,"104":0,"105":0.00145,"106":0.00291,"107":0.00582,"108":0.01018,"109":0.29516,"110":0.00145,"111":0.00291,"112":0.01018,"113":0.00582,"114":0.01454,"115":0.01745,"116":0.6165,"117":0.14976,"118":0.00145,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00291,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00145,"70":0.04653,"71":0.00582,"72":0.02326,"73":0.00291,"74":0,"75":0,"76":0,"77":0.00291,"78":0,"79":0.00145,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01018,"96":0,"97":0,"98":0,"99":0,"100":0.00145,"101":0.01599,"102":0.01745,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00145,"13":0,"14":0.00291,"15":0,"16":0.00436,"17":0.00145,"18":0.01163,"79":0,"80":0,"81":0,"83":0,"84":0.00145,"85":0,"86":0,"87":0,"88":0,"89":0.00291,"90":0.00436,"91":0,"92":0.0189,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00145,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00872,"110":0.00145,"111":0.00291,"112":0.00291,"113":0.00145,"114":0.00582,"115":0.00436,"116":0.07997,"117":0.05671},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00145,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0,"15.1":0.00291,"15.2-15.3":0.00291,"15.4":0.00291,"15.5":0.00436,"15.6":0.0189,"16.0":0.00145,"16.1":0.01454,"16.2":0.00436,"16.3":0.0189,"16.4":0.01163,"16.5":0.03635,"16.6":0.15558,"17.0":0.02617,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00288,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.02301,"10.0-10.2":0,"10.3":0.01438,"11.0-11.2":0,"11.3-11.4":0.00288,"12.0-12.1":0.00863,"12.2-12.5":0.2517,"13.0-13.1":0.00863,"13.2":0.00288,"13.3":0.01438,"13.4-13.7":0.0187,"14.0-14.4":0.10068,"14.5-14.8":0.08054,"15.0-15.1":0.09493,"15.2-15.3":0.1467,"15.4":0.14383,"15.5":0.22293,"15.6-15.7":1.43107,"16.0":0.5336,"16.1":0.64434,"16.2":0.41997,"16.3":0.74214,"16.4":0.39552,"16.5":1.02117,"16.6":6.43766,"17.0":1.4886,"17.1":0.00144},P:{"4":0.26537,"20":0.10207,"21":0.14289,"22":0.7757,"5.0-5.4":0.06124,"6.2-6.4":0.05103,"7.2-7.4":0.26537,"8.2":0.01021,"9.2":0.08165,"10.1":0.01021,"11.1-11.2":0.03062,"12.0":0,"13.0":0.04083,"14.0":0.03062,"15.0":0.01021,"16.0":0.08165,"17.0":0.06124,"18.0":0.04083,"19.0":0.08165},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00099,"4.4":0,"4.4.3-4.4.4":0.06809},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.03053,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":79.22315},R:{_:"0"},M:{"0":0.03418},Q:{"13.1":0},O:{"0":0.77769},H:{"0":0.87381}};
    +module.exports={C:{"33":0.00301,"41":0.00301,"43":0.00151,"44":0.00151,"47":0.00151,"48":0.00151,"50":0.00151,"52":0.00301,"53":0.00301,"56":0.00904,"57":0.00301,"59":0.00151,"66":0.00452,"68":0.00151,"70":0.00151,"72":0.00602,"77":0.00151,"84":0.00151,"86":0.00151,"92":0.00151,"93":0.00151,"94":0.00301,"99":0.00151,"106":0.00151,"108":0.0241,"109":0.00151,"110":0.00151,"113":0.00452,"114":0.00151,"115":0.16717,"116":0.00151,"117":0.00301,"118":0.01506,"119":0.21385,"120":0.06325,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 37 38 39 40 42 45 46 49 51 54 55 58 60 61 62 63 64 65 67 69 71 73 74 75 76 78 79 80 81 82 83 85 87 88 89 90 91 95 96 97 98 100 101 102 103 104 105 107 111 112 121 122 123 3.5 3.6"},D:{"26":0.00151,"28":0.00151,"30":0.00151,"33":0.00151,"34":0.00602,"38":0.00151,"39":0.00301,"41":0.00301,"43":0.00151,"46":0.00904,"47":0.00301,"50":0.00151,"51":0.00301,"52":0.00301,"55":0.00904,"56":0.00452,"57":0.00151,"58":0.00301,"59":0.00151,"60":0.00301,"61":0.00301,"62":0.0241,"63":0.00602,"64":0.00301,"65":0.00151,"67":0.00452,"68":0.00301,"69":0.00301,"70":0.00602,"71":0.01807,"72":0.00753,"73":0.00904,"74":0.00904,"75":0.00452,"76":0.00151,"77":0.00753,"78":0.03163,"79":0.01506,"80":0.01657,"81":0.00904,"83":0.06476,"84":0.00602,"85":0.00602,"86":0.01657,"87":0.0241,"88":0.00301,"89":0.00301,"90":0.00452,"91":0.03012,"92":0.01355,"93":0.00602,"94":0.00452,"95":0.00602,"96":0.01054,"97":0.00301,"98":0.00753,"99":0.01205,"100":0.00904,"101":0.00301,"102":0.01807,"103":0.01355,"104":0.00452,"105":0.00904,"106":0.06175,"107":0.0241,"108":0.03464,"109":1.8328,"110":0.00602,"111":0.01657,"112":0.01054,"113":0.00904,"114":0.02711,"115":0.02108,"116":0.06777,"117":0.12048,"118":0.95631,"119":3.77102,"120":0.00753,"121":0.00301,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 27 29 31 32 35 36 37 40 42 44 45 48 49 53 54 66 122"},F:{"64":0.01205,"79":0.00753,"81":0.00151,"83":0.00151,"84":0.00151,"86":0.00151,"89":0.00452,"95":0.05271,"101":0.00151,"102":0.09036,"103":0.03464,"104":0.14006,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 82 85 87 88 90 91 92 93 94 96 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00904,"13":0.01355,"14":0.01807,"15":0.00753,"16":0.04669,"17":0.01355,"18":0.09337,"81":0.00602,"84":0.01657,"85":0.00151,"88":0.00602,"89":0.01807,"90":0.03313,"92":0.13102,"96":0.00151,"97":0.00151,"99":0.00151,"100":0.0241,"103":0.00753,"104":0.00753,"105":0.00301,"107":0.00151,"108":0.00452,"109":0.05873,"110":0.00151,"111":0.00452,"112":0.05422,"113":0.00452,"114":0.01657,"115":0.00301,"116":0.01205,"117":0.03464,"118":0.14307,"119":0.68824,_:"79 80 83 86 87 91 93 94 95 98 101 102 106"},E:{"12":0.00151,"13":0.00151,"14":0.00602,_:"0 4 5 6 7 8 9 10 11 15 3.1 3.2 6.1 7.1 9.1 10.1 12.1","5.1":0.02108,"11.1":0.00151,"13.1":0.00753,"14.1":0.01054,"15.1":0.02861,"15.2-15.3":0.01958,"15.4":0.0241,"15.5":0.04518,"15.6":0.12349,"16.0":0.01205,"16.1":0.14458,"16.2":0.0256,"16.3":0.11596,"16.4":0.10994,"16.5":0.17319,"16.6":0.71987,"17.0":0.39457,"17.1":0.74848,"17.2":0.03765},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00259,"5.0-5.1":0.00259,"6.0-6.1":0.00646,"7.0-7.1":0.00905,"8.1-8.4":0.00129,"9.0-9.2":0.01034,"9.3":0.03232,"10.0-10.2":0.00259,"10.3":0.04654,"11.0-11.2":0.02198,"11.3-11.4":0.01939,"12.0-12.1":0.01164,"12.2-12.5":0.21202,"13.0-13.1":0.00517,"13.2":0.02198,"13.3":0.01293,"13.4-13.7":0.03749,"14.0-14.4":0.09954,"14.5-14.8":0.1616,"15.0-15.1":0.06335,"15.2-15.3":0.07757,"15.4":0.08662,"15.5":0.12152,"15.6-15.7":0.63864,"16.0":0.29993,"16.1":0.60115,"16.2":0.28829,"16.3":0.54038,"16.4":0.11118,"16.5":0.287,"16.6-16.7":4.86476,"17.0":1.45697,"17.1":2.44725,"17.2":0.06981},P:{"4":0.22157,"20":0.16114,"21":0.141,"22":0.3525,"23":0.55393,"5.0-5.4":0.0705,"6.2-6.4":0.04029,"7.2-7.4":0.15107,"8.2":0.02014,"9.2":0.06043,_:"10.1 12.0","11.1-11.2":0.05036,"13.0":0.04029,"14.0":0.03021,"15.0":0.01007,"16.0":0.0705,"17.0":0.04029,"18.0":0.03021,"19.0":0.0705},I:{"0":0.08452,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00025},K:{"0":0.48307,_:"10 11 12 11.1 11.5 12.1"},A:{"9":0.00151,"11":0.20331,_:"6 7 8 10 5.5"},N:{_:"10 11"},S:{"2.5":0.00849,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.85789},H:{"0":0.12},L:{"0":70.25679},R:{_:"0"},M:{"0":0.03398},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AG.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AG.js
    index 344f2976de29a5..d33ec6332cf344 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AG.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AG.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00388,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00388,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00388,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0.00388,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0.00388,"115":0.06588,"116":0.03488,"117":0.34488,"118":0.02713,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00775,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.00388,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0.00775,"77":0,"78":0,"79":0.00775,"80":0,"81":0,"83":0,"84":0.00388,"85":0.00775,"86":0.01163,"87":0.00388,"88":0.00388,"89":0,"90":0,"91":0.00388,"92":0,"93":0.031,"94":0.00775,"95":0,"96":0,"97":0,"98":0.00388,"99":0,"100":0,"101":0,"102":0.00388,"103":0.05038,"104":0,"105":0,"106":0.00775,"107":0,"108":0.00775,"109":0.372,"110":0.00775,"111":0.00388,"112":0.00388,"113":0.01938,"114":0.08913,"115":0.2325,"116":5.74663,"117":1.26713,"118":0.00388,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.02325,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0.00388,"72":0.00775,"73":0,"74":0,"75":0,"76":0,"77":0.04263,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00388,"96":0,"97":0,"98":0,"99":0.00775,"100":0.03875,"101":0.06588,"102":0.05038,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0.00775,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00388,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00775,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.02325,"110":0,"111":0.00388,"112":0,"113":0.00388,"114":0.0155,"115":0.0465,"116":1.18575,"117":0.75563},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00388,"15":0.00388,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.02325,"14.1":0.02713,"15.1":0.00775,"15.2-15.3":0.00775,"15.4":0.00388,"15.5":0.01163,"15.6":0.10463,"16.0":0.14725,"16.1":0.02713,"16.2":0.02713,"16.3":0.09688,"16.4":0.06588,"16.5":0.0775,"16.6":1.44925,"17.0":0.062,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.05479,"6.0-6.1":0,"7.0-7.1":0.00548,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.00822,"10.0-10.2":0,"10.3":0.01918,"11.0-11.2":0.00548,"11.3-11.4":0.00274,"12.0-12.1":0,"12.2-12.5":0.20272,"13.0-13.1":0,"13.2":0.00274,"13.3":0.01096,"13.4-13.7":0.01096,"14.0-14.4":0.13697,"14.5-14.8":0.07944,"15.0-15.1":0.06849,"15.2-15.3":0.09588,"15.4":0.05479,"15.5":0.16437,"15.6-15.7":1.43547,"16.0":0.5835,"16.1":1.31494,"16.2":0.44653,"16.3":1.4026,"16.4":0.37804,"16.5":0.76979,"16.6":17.99822,"17.0":1.8327,"17.1":0},P:{"4":0.18405,"20":0.07578,"21":0.46554,"22":4.29809,"5.0-5.4":0.02165,"6.2-6.4":0,"7.2-7.4":0.24901,"8.2":0,"9.2":0.02165,"10.1":0,"11.1-11.2":0.04331,"12.0":0,"13.0":0.03248,"14.0":0.02165,"15.0":0,"16.0":0.02165,"17.0":0.04331,"18.0":0.03248,"19.0":0.03248},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":2.23938},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0.01938,"11":0.00775,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":49.158},R:{_:"0"},M:{"0":0.06125},Q:{"13.1":0},O:{"0":0.049},H:{"0":0.51609}};
    +module.exports={C:{"87":0.00745,"88":0.01489,"97":0.00745,"115":0.02978,"116":0.00745,"117":0.00372,"118":0.05585,"119":0.37602,"120":0.1787,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 89 90 91 92 93 94 95 96 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 121 122 123 3.5 3.6"},D:{"49":0.03351,"50":0.00372,"53":0.00372,"56":0.01489,"64":0.00372,"65":0.00372,"68":0.00372,"69":0.00372,"70":0.00372,"75":0.00372,"76":0.00372,"77":0.00372,"79":0.01117,"80":0.00372,"81":0.00372,"83":0.00372,"85":0.01117,"86":0.00372,"88":0.04095,"90":0.00372,"91":0.01117,"92":0.00372,"93":0.02234,"95":0.00372,"96":0.01117,"97":0.00372,"100":0.00372,"102":0.00745,"103":0.28295,"105":0.01862,"106":0.01117,"107":0.00372,"108":0.02234,"109":0.90097,"111":0.00745,"112":0.01117,"113":0.01117,"114":0.08935,"115":0.03723,"116":0.18987,"117":0.23455,"118":4.0953,"119":14.95529,"120":0.00745,"121":0.00372,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 51 52 54 55 57 58 59 60 61 62 63 66 67 71 72 73 74 78 84 87 89 94 98 99 101 104 110 122"},F:{"28":0.05585,"36":0.01117,"102":0.18243,"103":0.03723,"104":0.16381,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"13":0.00372,"14":0.01117,"18":0.00372,"92":0.01489,"109":0.0484,"112":0.02978,"114":0.00745,"115":0.00745,"116":0.05212,"117":0.07074,"118":0.87118,"119":4.16231,_:"12 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 111 113"},E:{"11":0.00372,"13":0.01117,"14":0.01117,"15":0.5659,_:"0 4 5 6 7 8 9 10 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1","13.1":0.02978,"14.1":0.03723,"15.1":0.06329,"15.2-15.3":0.02978,"15.4":0.05212,"15.5":0.85629,"15.6":0.26061,"16.0":0.12286,"16.1":0.05957,"16.2":0.07818,"16.3":0.28667,"16.4":0.21593,"16.5":0.21221,"16.6":1.48175,"17.0":0.53984,"17.1":0.89724,"17.2":0.00745},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00414,"5.0-5.1":0.00414,"6.0-6.1":0.01034,"7.0-7.1":0.01448,"8.1-8.4":0.00207,"9.0-9.2":0.01655,"9.3":0.05171,"10.0-10.2":0.00414,"10.3":0.07446,"11.0-11.2":0.03516,"11.3-11.4":0.03102,"12.0-12.1":0.01861,"12.2-12.5":0.3392,"13.0-13.1":0.00827,"13.2":0.03516,"13.3":0.02068,"13.4-13.7":0.05998,"14.0-14.4":0.15926,"14.5-14.8":0.25853,"15.0-15.1":0.10135,"15.2-15.3":0.1241,"15.4":0.13857,"15.5":0.19442,"15.6-15.7":1.02173,"16.0":0.47984,"16.1":0.96175,"16.2":0.46122,"16.3":0.86454,"16.4":0.17787,"16.5":0.45916,"16.6-16.7":7.78291,"17.0":2.33094,"17.1":3.91524,"17.2":0.11169},P:{"4":0.21168,"20":0.03342,"21":0.21168,"22":0.31196,"23":3.59864,_:"5.0-5.4 6.2-6.4 8.2 12.0 14.0 15.0","7.2-7.4":0.12255,"9.2":0.02228,"10.1":0.01114,"11.1-11.2":0.05571,"13.0":0.03342,"16.0":0.06685,"17.0":0.01114,"18.0":0.06685,"19.0":0.04457},I:{"0":0.01874,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00006},K:{"0":0.3264,_:"10 11 12 11.1 11.5 12.1"},A:{"10":0.05957,"11":0.00745,_:"6 7 8 9 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.01883},H:{"0":0},L:{"0":40.03142},R:{_:"0"},M:{"0":0.39545},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AI.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AI.js
    index 8d5bd2cb857396..36b467f26e2863 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AI.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AI.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.01377,"116":0.00459,"117":0.60601,"118":0.01377,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.03673,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0.01377,"94":0,"95":0,"96":0.00918,"97":0.00918,"98":0.02755,"99":0,"100":0.01377,"101":0.01377,"102":0,"103":0.13773,"104":0,"105":0.00918,"106":0.00459,"107":0,"108":0.00459,"109":0.28464,"110":0.00459,"111":0.01377,"112":0,"113":0.18823,"114":0.14691,"115":0.08723,"116":8.34185,"117":1.42321,"118":0.01377,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.01377,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00918,"101":0.16987,"102":0.26628,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00459,"110":0,"111":0,"112":0,"113":0,"114":0.00459,"115":0.03673,"116":2.02463,"117":1.73999},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00459,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00459,"13.1":0.07805,"14.1":0.03214,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.01377,"15.6":0.16987,"16.0":0,"16.1":0.04591,"16.2":0.18823,"16.3":0.05968,"16.4":0.05509,"16.5":0.28464,"16.6":0.68865,"17.0":0.03214,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0.01718,"11.0-11.2":0.00736,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0.10064,"13.0-13.1":0.00736,"13.2":0,"13.3":0,"13.4-13.7":0,"14.0-14.4":0.02455,"14.5-14.8":1.72564,"15.0-15.1":0.12519,"15.2-15.3":0.01473,"15.4":0.19392,"15.5":0.08346,"15.6-15.7":0.41484,"16.0":0.32893,"16.1":0.4222,"16.2":0.19392,"16.3":1.04815,"16.4":0.12764,"16.5":1.13406,"16.6":17.63684,"17.0":0.77813,"17.1":0},P:{"4":0.06412,"20":0.12825,"21":0.16031,"22":5.51456,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.11756,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01069,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0.01069,"17.0":0.44886,"18.0":0.04275,"19.0":0.12825},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.89525},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.04591,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":47.17131},R:{_:"0"},M:{"0":0.10818},Q:{"13.1":0},O:{"0":0},H:{"0":0.03585}};
    +module.exports={C:{"104":0.01172,"115":0.10153,"119":0.43346,"120":0.12496,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 105 106 107 108 109 110 111 112 113 114 116 117 118 121 122 123 3.5 3.6"},D:{"54":0.00391,"72":0.00391,"75":0.00391,"76":0.03905,"77":0.01172,"88":0.05858,"93":0.08982,"103":0.10934,"108":0.00391,"109":0.42174,"110":0.01172,"113":0.03905,"116":0.19525,"117":0.53889,"118":4.48685,"119":11.75015,"120":0.02343,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 73 74 78 79 80 81 83 84 85 86 87 89 90 91 92 94 95 96 97 98 99 100 101 102 104 105 106 107 111 112 114 115 121 122"},F:{"102":0.05077,"103":0.0742,"104":0.13277,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.05077,"109":0.03124,"113":0.02343,"116":0.01562,"117":0.02343,"118":1.15588,"119":5.60758,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 111 112 114 115"},E:{"15":0.00391,_:"0 4 5 6 7 8 9 10 11 12 13 14 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1","13.1":0.08591,"14.1":0.08982,"15.1":0.01562,"15.2-15.3":0.05467,"15.4":0.01562,"15.5":0.03515,"15.6":0.88644,"16.0":0.01562,"16.1":0.16011,"16.2":0.30069,"16.3":0.87082,"16.4":0.25383,"16.5":0.70681,"16.6":4.2916,"17.0":1.10121,"17.1":2.00327,"17.2":0.02343},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.007,"5.0-5.1":0.007,"6.0-6.1":0.01751,"7.0-7.1":0.02451,"8.1-8.4":0.0035,"9.0-9.2":0.02801,"9.3":0.08754,"10.0-10.2":0.007,"10.3":0.12606,"11.0-11.2":0.05953,"11.3-11.4":0.05252,"12.0-12.1":0.03151,"12.2-12.5":0.57426,"13.0-13.1":0.01401,"13.2":0.05953,"13.3":0.03502,"13.4-13.7":0.10155,"14.0-14.4":0.26962,"14.5-14.8":0.4377,"15.0-15.1":0.17158,"15.2-15.3":0.21009,"15.4":0.23461,"15.5":0.32915,"15.6-15.7":1.72978,"16.0":0.81237,"16.1":1.62823,"16.2":0.78085,"16.3":1.46366,"16.4":0.30114,"16.5":0.77735,"16.6-16.7":13.17644,"17.0":3.94628,"17.1":6.62849,"17.2":0.18909},P:{"4":0.25766,"20":0.02147,"21":0.03221,"22":0.11809,"23":2.90942,_:"5.0-5.4 6.2-6.4 8.2 10.1 12.0 13.0 15.0 19.0","7.2-7.4":0.06442,"9.2":0.03221,"11.1-11.2":0.01074,"14.0":0.07515,"16.0":0.05368,"17.0":0.62268,"18.0":0.03221},I:{"0":0.01819,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00005},K:{"0":0.16457,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.01562,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.0061},H:{"0":0},L:{"0":23.48883},R:{_:"0"},M:{"0":0.1219},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AL.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AL.js
    index 44f1127eb29664..17d52ad9d6b251 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AL.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AL.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00175,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.00175,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.0035,"103":0,"104":0,"105":0,"106":0.0035,"107":0.00175,"108":0.0035,"109":0,"110":0,"111":0,"112":0,"113":0.00175,"114":0,"115":0.02975,"116":0.00525,"117":0.10325,"118":0.00875,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00175,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.0105,"50":0,"51":0.00175,"52":0,"53":0,"54":0,"55":0.0035,"56":0.0035,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0.0035,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00175,"69":0,"70":0.00175,"71":0.00175,"72":0,"73":0,"74":0,"75":0.00175,"76":0.00175,"77":0,"78":0,"79":0.01225,"80":0,"81":0,"83":0.0035,"84":0.00175,"85":0.00175,"86":0.00175,"87":0.00175,"88":0.00175,"89":0.00175,"90":0.00175,"91":0.00175,"92":0.00525,"93":0,"94":0,"95":0.00175,"96":0,"97":0.00175,"98":0,"99":0,"100":0,"101":0.00175,"102":0.00175,"103":0.00525,"104":0,"105":0.0035,"106":0.00525,"107":0.0035,"108":0.007,"109":0.36225,"110":0.00175,"111":0.007,"112":0.00525,"113":0.0035,"114":0.01925,"115":0.02975,"116":1.07625,"117":0.3185,"118":0.0035,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00175,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.007,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00175,"70":0,"71":0,"72":0.0035,"73":0.00175,"74":0,"75":0,"76":0,"77":0.00525,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.0035,"96":0,"97":0,"98":0,"99":0,"100":0.0035,"101":0.028,"102":0.035,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.00175,"90":0.00175,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0.00175,"107":0,"108":0.00175,"109":0.00525,"110":0,"111":0,"112":0.00175,"113":0.00175,"114":0,"115":0.0035,"116":0.06475,"117":0.06475},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00175,"10":0,"11":0,"12":0,"13":0,"14":0.00175,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00175,"13.1":0.0035,"14.1":0.0035,"15.1":0.00175,"15.2-15.3":0.00175,"15.4":0.00525,"15.5":0.014,"15.6":0.063,"16.0":0.00175,"16.1":0.01225,"16.2":0.01225,"16.3":0.028,"16.4":0.0105,"16.5":0.063,"16.6":0.29225,"17.0":0.02625,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.09223,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.02306,"10.0-10.2":0,"10.3":0.05764,"11.0-11.2":0.02882,"11.3-11.4":0,"12.0-12.1":0.00576,"12.2-12.5":0.50147,"13.0-13.1":0,"13.2":0,"13.3":0.01153,"13.4-13.7":0.0634,"14.0-14.4":0.21327,"14.5-14.8":0.51877,"15.0-15.1":0.13257,"15.2-15.3":0.25362,"15.4":0.3055,"15.5":1.02024,"15.6-15.7":5.10697,"16.0":1.64853,"16.1":2.56501,"16.2":1.33727,"16.3":2.34022,"16.4":0.57641,"16.5":1.63123,"16.6":33.34518,"17.0":4.51327,"17.1":0.01153},P:{"4":0.14371,"20":0.06159,"21":0.18477,"22":3.0897,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.11291,"8.2":0,"9.2":0.01026,"10.1":0,"11.1-11.2":0.03079,"12.0":0.01026,"13.0":0.03079,"14.0":0.04106,"15.0":0.01026,"16.0":0.06159,"17.0":0.10265,"18.0":0.02053,"19.0":0.07185},I:{"0":0,"3":0,"4":0.00339,"2.1":0,"2.2":0.00226,"2.3":0.00226,"4.1":0.0237,"4.2-4.3":0.00564,"4.4":0,"4.4.3-4.4.4":0.03725},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00175,"9":0,"10":0,"11":0.00175,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":35.356},R:{_:"0"},M:{"0":0.2145},Q:{"13.1":0},O:{"0":0.066},H:{"0":0.18745}};
    +module.exports={C:{"52":0.00646,"78":0.00161,"87":0.00323,"88":0.00323,"89":0.00161,"91":0.00161,"99":0.00161,"102":0.00161,"103":0.00161,"105":0.00161,"108":0.00484,"110":0.00161,"112":0.00161,"113":0.00484,"115":0.11298,"116":0.00161,"117":0.00161,"118":0.01291,"119":0.29698,"120":0.07263,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 90 92 93 94 95 96 97 98 100 101 104 106 107 109 111 114 121 122 123 3.5 3.6"},D:{"11":0.00161,"41":0.00161,"42":0.00161,"43":0.00161,"44":0.00161,"45":0.00161,"46":0.00161,"49":0.13558,"51":0.00323,"55":0.00161,"56":0.00161,"59":0.00161,"62":0.00161,"63":0.00161,"65":0.00161,"66":0.00161,"68":0.00161,"69":0.00323,"70":0.00484,"71":0.00484,"73":0.00161,"74":0.00161,"75":0.00323,"76":0.00323,"78":0.00161,"79":0.0581,"80":0.00323,"81":0.00323,"83":0.02098,"84":0.00161,"85":0.00161,"86":0.00807,"87":0.00807,"88":0.00484,"89":0.00807,"90":0.00323,"91":0.00323,"93":0.00323,"94":0.00161,"95":0.00161,"96":0.00161,"97":0.00323,"98":0.00323,"99":0.00323,"100":0.00484,"101":0.00323,"102":0.00323,"103":0.01453,"104":0.00484,"105":0.0113,"106":0.02098,"107":0.00968,"108":0.01614,"109":1.28959,"110":0.00484,"111":0.00807,"112":0.01453,"113":0.00807,"114":0.02744,"115":0.00968,"116":0.10975,"117":0.10814,"118":1.61077,"119":5.17448,"120":0.04196,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 47 48 50 52 53 54 57 58 60 61 64 67 72 77 92 121 122"},F:{"28":0.00161,"46":0.00646,"69":0.00323,"94":0.00968,"95":0.01937,"99":0.00161,"102":0.07909,"103":0.03389,"104":0.12589,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 96 97 98 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.00161,"89":0.01775,"92":0.00323,"107":0.00484,"108":0.00646,"109":0.00646,"110":0.00161,"112":0.00484,"113":0.00323,"114":0.00323,"115":0.00161,"116":0.00323,"117":0.01291,"118":0.10975,"119":0.4616,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 111"},E:{"9":0.00646,"13":0.00161,"14":0.01775,"15":0.00161,_:"0 4 5 6 7 8 10 11 12 3.1 3.2 5.1 6.1 7.1 10.1","9.1":0.00161,"11.1":0.00161,"12.1":0.00484,"13.1":0.01453,"14.1":0.02582,"15.1":0.0113,"15.2-15.3":0.08554,"15.4":0.02582,"15.5":0.06133,"15.6":0.32926,"16.0":0.00968,"16.1":0.0807,"16.2":0.03551,"16.3":0.14365,"16.4":0.07586,"16.5":0.88447,"16.6":1.40418,"17.0":0.89738,"17.1":1.09106,"17.2":0.01775},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.01181,"5.0-5.1":0.01181,"6.0-6.1":0.02952,"7.0-7.1":0.04133,"8.1-8.4":0.0059,"9.0-9.2":0.04723,"9.3":0.14759,"10.0-10.2":0.01181,"10.3":0.21253,"11.0-11.2":0.10036,"11.3-11.4":0.08855,"12.0-12.1":0.05313,"12.2-12.5":0.96819,"13.0-13.1":0.02361,"13.2":0.10036,"13.3":0.05904,"13.4-13.7":0.1712,"14.0-14.4":0.45458,"14.5-14.8":0.73795,"15.0-15.1":0.28928,"15.2-15.3":0.35422,"15.4":0.39554,"15.5":0.55494,"15.6-15.7":2.91638,"16.0":1.36964,"16.1":2.74518,"16.2":1.3165,"16.3":2.46771,"16.4":0.50771,"16.5":1.3106,"16.6-16.7":22.21528,"17.0":6.65337,"17.1":11.17553,"17.2":0.31879},P:{"4":0.09166,"20":0.04074,"21":0.09166,"22":0.21387,"23":1.90445,_:"5.0-5.4 6.2-6.4 8.2 10.1","7.2-7.4":0.06111,"9.2":0.04074,"11.1-11.2":0.02037,"12.0":0.02037,"13.0":0.02037,"14.0":0.03055,"15.0":0.02037,"16.0":0.02037,"17.0":0.05092,"18.0":0.02037,"19.0":0.06111},I:{"0":0.04173,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00013},K:{"0":0.08387,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00646,"9":0.00161,"11":0.01291,_:"6 7 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.03355},H:{"0":0},L:{"0":22.20422},R:{_:"0"},M:{"0":0.12581},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AM.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AM.js
    index 115158176719ce..0bc8ad02b777eb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AM.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AM.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.01442,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":35.46107,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00721,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0.04325,"72":0,"73":0,"74":0.09372,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00721,"101":0,"102":0.00721,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00721,"109":0,"110":0,"111":0.02163,"112":0.00721,"113":0,"114":0.00721,"115":0.10814,"116":0.02884,"117":0.3172,"118":0.02884,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.01442,"50":0,"51":0,"52":0,"53":0.07209,"54":0,"55":0,"56":0,"57":0,"58":0.00721,"59":0,"60":0,"61":0,"62":0,"63":0.03605,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.03605,"71":0,"72":0,"73":0,"74":0.02163,"75":0,"76":0.0793,"77":0,"78":0,"79":0.06488,"80":0.0793,"81":0.00721,"83":0.17302,"84":0.02163,"85":0.02884,"86":0.05046,"87":0.00721,"88":0,"89":0.00721,"90":0.14418,"91":0.08651,"92":0.12255,"93":0.0793,"94":0.02884,"95":0.00721,"96":0,"97":0.05767,"98":0.04325,"99":0.07209,"100":0.01442,"101":0,"102":0.16581,"103":0.11534,"104":0,"105":0.05046,"106":0.06488,"107":0.04325,"108":0.10093,"109":1.62203,"110":0.02884,"111":0.02163,"112":0.02163,"113":0.02163,"114":0.10814,"115":0.22348,"116":6.22858,"117":1.50668,"118":0.01442,"119":0,"120":0},F:{"9":0,"11":0,"12":0.08651,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0.01442,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0.02884,"63":0,"64":0,"65":0,"66":0,"67":0.00721,"68":0,"69":0.00721,"70":0.02884,"71":0,"72":0.02163,"73":0.00721,"74":0,"75":0,"76":0.03605,"77":0.04325,"78":0,"79":0.00721,"80":0,"81":0,"82":0.00721,"83":0,"84":0.02163,"85":0.00721,"86":0,"87":0.00721,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0.02884,"94":0,"95":0.02884,"96":0,"97":0,"98":0,"99":0.00721,"100":0.02884,"101":0.47579,"102":0.27394,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.01442,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.01442,"108":0,"109":0,"110":0.04325,"111":0,"112":0,"113":0,"114":0.00721,"115":0.01442,"116":0.29557,"117":0.2379},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00721,"15":0.00721,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00721,"14.1":0.01442,"15.1":0.00721,"15.2-15.3":0.02163,"15.4":0.01442,"15.5":0.00721,"15.6":0.05046,"16.0":0.00721,"16.1":0.05767,"16.2":0.01442,"16.3":0.06488,"16.4":0.02163,"16.5":0.05046,"16.6":0.33882,"17.0":0.02884,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00381,"6.0-6.1":0.00953,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.0324,"10.0-10.2":0,"10.3":0.02287,"11.0-11.2":0.00953,"11.3-11.4":0.00572,"12.0-12.1":0.00762,"12.2-12.5":0.20585,"13.0-13.1":0.00191,"13.2":0.00381,"13.3":6.44613,"13.4-13.7":0.03431,"14.0-14.4":0.09911,"14.5-14.8":0.21729,"15.0-15.1":0.06671,"15.2-15.3":0.0629,"15.4":0.05337,"15.5":0.13533,"15.6-15.7":1.06737,"16.0":0.41932,"16.1":0.49747,"16.2":0.29924,"16.3":0.4765,"16.4":0.12389,"16.5":0.47078,"16.6":6.93979,"17.0":1.23891,"17.1":0},P:{"4":0,"20":0.02073,"21":0.0622,"22":0.72566,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.02073,"8.2":0.0311,"9.2":0,"10.1":0,"11.1-11.2":0.01037,"12.0":0,"13.0":0.01037,"14.0":0,"15.0":0,"16.0":0.01037,"17.0":0.01037,"18.0":0.01037,"19.0":0.0311},I:{"0":0,"3":0,"4":0.00201,"2.1":0,"2.2":0,"2.3":0.00603,"4.1":0.00302,"4.2-4.3":0.00603,"4.4":0,"4.4.3-4.4.4":0.02011},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00721,"9":0,"10":0,"11":0.02884,"5.5":0},S:{"2.5":0.00279,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":26.34846},R:{_:"0"},M:{"0":0.06698},Q:{"13.1":0},O:{"0":0.11722},H:{"0":0.17175}};
    +module.exports={C:{"52":49.22995,"56":0.00732,"108":0.00732,"111":0.00732,"112":0.00732,"113":0.00732,"115":0.16825,"116":0.02195,"117":0.00732,"118":0.02195,"119":0.32186,"120":0.0951,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 109 110 114 121 122 123 3.5 3.6"},D:{"49":0.02195,"51":0.00732,"75":0.00732,"79":0.01463,"80":0.00732,"85":0.00732,"86":0.02926,"87":0.00732,"89":0.00732,"95":0.00732,"96":0.00732,"97":0.02195,"98":0.02195,"99":0.02195,"100":0.00732,"102":0.02195,"103":0.02195,"105":0.05121,"106":0.03658,"107":0.00732,"108":0.02926,"109":2.16524,"110":0.02926,"111":0.00732,"112":0.05852,"113":0.02926,"114":0.02926,"115":0.03658,"116":0.32918,"117":0.27066,"118":2.62609,"119":13.09385,"120":0.00732,"121":0.02195,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 50 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 76 77 78 81 83 84 88 90 91 92 93 94 101 104 122"},F:{"79":0.02195,"82":0.02926,"85":0.00732,"95":0.06584,"102":0.18288,"103":0.13167,"104":0.38038,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 83 84 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"14":0.00732,"87":0.01463,"92":0.00732,"106":0.05852,"108":0.00732,"109":0.00732,"110":0.00732,"117":0.02926,"118":0.13167,"119":0.89975,_:"12 13 15 16 17 18 79 80 81 83 84 85 86 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 107 111 112 113 114 115 116"},E:{"14":0.00732,"15":0.00732,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 15.2-15.3 16.0 17.2","13.1":0.01463,"14.1":0.02195,"15.1":0.00732,"15.4":0.00732,"15.5":0.01463,"15.6":0.08778,"16.1":0.0951,"16.2":0.02195,"16.3":0.07315,"16.4":0.02195,"16.5":0.04389,"16.6":0.16825,"17.0":0.32918,"17.1":0.11704},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00138,"5.0-5.1":0.00138,"6.0-6.1":0.00345,"7.0-7.1":0.00483,"8.1-8.4":0.00069,"9.0-9.2":0.00552,"9.3":0.01725,"10.0-10.2":0.00138,"10.3":0.02484,"11.0-11.2":0.01173,"11.3-11.4":0.01035,"12.0-12.1":0.00621,"12.2-12.5":0.11317,"13.0-13.1":0.00276,"13.2":0.01173,"13.3":0.0069,"13.4-13.7":0.02001,"14.0-14.4":0.05313,"14.5-14.8":0.08626,"15.0-15.1":0.03381,"15.2-15.3":0.0414,"15.4":0.04623,"15.5":0.06487,"15.6-15.7":0.34089,"16.0":0.16009,"16.1":0.32088,"16.2":0.15388,"16.3":0.28844,"16.4":0.05934,"16.5":0.15319,"16.6-16.7":2.59668,"17.0":0.77769,"17.1":1.30628,"17.2":0.03726},P:{"4":0.01065,"20":0.0213,"21":0.04259,"22":0.10648,"23":0.69209,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 12.0 13.0 14.0 15.0 16.0 18.0","7.2-7.4":0.05324,"11.1-11.2":0.01065,"17.0":0.01065,"19.0":0.0213},I:{"0":0.02136,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.00006},K:{"0":0.2745,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.01463,"11":0.05852,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.00268,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.14762},H:{"0":0.01},L:{"0":18.38034},R:{_:"0"},M:{"0":0.04026},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AO.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AO.js
    index 25d64b00b3e895..ac5c5929010601 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AO.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AO.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00793,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00397,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.0119,"100":0,"101":0,"102":0.00793,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0.00793,"112":0,"113":0.0119,"114":0,"115":0.07141,"116":0.0119,"117":0.15868,"118":0.01984,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00397,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00793,"32":0,"33":0,"34":0,"35":0.00793,"36":0,"37":0,"38":0,"39":0,"40":0.02777,"41":0,"42":0.0119,"43":0.0119,"44":0,"45":0,"46":0.00397,"47":0,"48":0,"49":0.00397,"50":0,"51":0.00397,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00397,"59":0.00397,"60":0.00397,"61":0,"62":0,"63":0.00397,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.00397,"71":0,"72":0,"73":0.00397,"74":0.0119,"75":0.00397,"76":0.0119,"77":0.00397,"78":0,"79":0.00793,"80":0.00397,"81":0.0238,"83":0.00397,"84":0.00397,"85":0,"86":0.01984,"87":0.03174,"88":0.00793,"89":0.00397,"90":0.01984,"91":0.00793,"92":0.00793,"93":0.00793,"94":0.00793,"95":0.0119,"96":0,"97":0.00397,"98":0,"99":0.00793,"100":0.00397,"101":0.00397,"102":0.01587,"103":0.0119,"104":0,"105":0.00793,"106":0.00793,"107":0.00793,"108":0.01984,"109":0.92431,"110":0.00793,"111":0.00793,"112":0.0119,"113":0.01587,"114":0.05554,"115":0.05554,"116":2.78483,"117":0.89258,"118":0.0119,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0.00397,"33":0,"34":0,"35":0,"36":0,"37":0.00397,"38":0,"39":0,"40":0,"41":0,"42":0.00397,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0.01984,"62":0,"63":0.00793,"64":0,"65":0,"66":0.00397,"67":0.0119,"68":0,"69":0.03174,"70":0.01587,"71":0.01587,"72":0.03967,"73":0.0119,"74":0,"75":0,"76":0,"77":0.00397,"78":0.00793,"79":0.00397,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00397,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.06347,"96":0,"97":0,"98":0,"99":0,"100":0.00793,"101":0.11504,"102":0.16661,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00397,"13":0.00793,"14":0.00397,"15":0.00397,"16":0,"17":0,"18":0.01587,"79":0,"80":0,"81":0,"83":0,"84":0.0119,"85":0.00397,"86":0,"87":0,"88":0.00397,"89":0.00397,"90":0.00793,"91":0,"92":0.0119,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00397,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.03967,"110":0.00793,"111":0.00793,"112":0.00793,"113":0.00397,"114":0.01984,"115":0.05157,"116":0.61092,"117":0.53555},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00397,"13.1":0.0119,"14.1":0.00397,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0.0119,"16.0":0,"16.1":0,"16.2":0,"16.3":0,"16.4":0,"16.5":0.00397,"16.6":0.0238,"17.0":0.00793,"17.1":0},G:{"8":0.00254,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00635,"5.0-5.1":0.00762,"6.0-6.1":0,"7.0-7.1":0.06735,"8.1-8.4":0.00381,"9.0-9.2":0.00254,"9.3":0.12581,"10.0-10.2":0.00127,"10.3":0.25289,"11.0-11.2":0.0216,"11.3-11.4":0.00254,"12.0-12.1":0.04448,"12.2-12.5":2.0727,"13.0-13.1":0.00381,"13.2":0.01525,"13.3":0.29229,"13.4-13.7":0.21858,"14.0-14.4":0.36726,"14.5-14.8":0.51976,"15.0-15.1":0.2351,"15.2-15.3":0.183,"15.4":0.16648,"15.5":0.34693,"15.6-15.7":3.2177,"16.0":0.28339,"16.1":0.43081,"16.2":0.19698,"16.3":0.50197,"16.4":0.28593,"16.5":0.63668,"16.6":1.76389,"17.0":0.31389,"17.1":0},P:{"4":0.30639,"20":0.0817,"21":0.14298,"22":0.40852,"5.0-5.4":0.02043,"6.2-6.4":0,"7.2-7.4":0.09192,"8.2":0.01021,"9.2":0.01021,"10.1":0,"11.1-11.2":0.01021,"12.0":0,"13.0":0.05107,"14.0":0.04085,"15.0":0.01021,"16.0":0.06128,"17.0":0.05107,"18.0":0.09192,"19.0":0.04085},I:{"0":0,"3":0,"4":0.00096,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00911,"4.2-4.3":0.04106,"4.4":0,"4.4.3-4.4.4":0.14491},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0.00397,"8":0.0119,"9":0,"10":0,"11":0.00793,"5.5":0},S:{"2.5":0.19306,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":75.71373},R:{_:"0"},M:{"0":0.10256},Q:{"13.1":0.00603},O:{"0":0.27149},H:{"0":0.74823}};
    +module.exports={C:{"34":0.01258,"41":0.00315,"52":0.00315,"60":0.00315,"78":0.00315,"99":0.01887,"102":0.00629,"112":0.00944,"113":0.00629,"115":0.13524,"118":0.00944,"119":0.28305,"120":0.10693,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 100 101 103 104 105 106 107 108 109 110 111 114 116 117 121 122 123 3.5 3.6"},D:{"11":0.00629,"31":0.00629,"36":0.00315,"38":0.00315,"40":0.00315,"42":0.01573,"43":0.01573,"46":0.00315,"49":0.00315,"50":0.00315,"53":0.00315,"57":0.00315,"60":0.00315,"63":0.00315,"64":0.00315,"69":0.00315,"70":0.00629,"73":0.00629,"75":0.00629,"76":0.00629,"77":0.00315,"78":0.00315,"79":0.01573,"80":0.00944,"81":0.06605,"83":0.00629,"84":0.00944,"85":0.00315,"86":0.04403,"87":0.09435,"88":0.01573,"89":0.01887,"90":0.00944,"91":0.00629,"92":0.01573,"93":0.03774,"94":0.0346,"95":0.01573,"96":0.00315,"98":0.00629,"99":0.00944,"100":0.01258,"101":0.00629,"102":0.07863,"103":0.02202,"105":0.01258,"106":0.00944,"107":0.02202,"108":0.02831,"109":1.91216,"110":0.01258,"111":0.01573,"112":0.00944,"113":0.01258,"114":0.08806,"115":0.03145,"116":0.17298,"117":0.15411,"118":1.51589,"119":6.28057,"120":0.01258,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 33 34 35 37 39 41 44 45 47 48 51 52 54 55 56 58 59 61 62 65 66 67 68 71 72 74 97 104 121 122"},F:{"42":0.00315,"78":0.00315,"79":0.01573,"81":0.00315,"82":0.00315,"85":0.00315,"95":0.10693,"102":0.03774,"103":0.13838,"104":0.33023,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 80 83 84 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00629,"13":0.00315,"14":0.00629,"15":0.00629,"18":0.01573,"84":0.03145,"85":0.00315,"89":0.01258,"90":0.01258,"92":0.02516,"100":0.00315,"101":0.00629,"104":0.00629,"106":0.00315,"108":0.00629,"109":0.08177,"110":0.00315,"111":0.00315,"112":0.00315,"113":0.01258,"114":0.01258,"115":0.01887,"116":0.02516,"117":0.10064,"118":0.40256,"119":1.96877,_:"16 17 79 80 81 83 86 87 88 91 93 94 95 96 97 98 99 102 103 105 107"},E:{"9":0.00315,"14":0.00315,_:"0 4 5 6 7 8 10 11 12 13 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 15.1 15.4 16.0 16.1 16.4","11.1":0.00315,"12.1":0.00315,"13.1":0.01887,"14.1":0.00944,"15.2-15.3":0.00315,"15.5":0.00315,"15.6":0.0346,"16.2":0.00315,"16.3":0.00315,"16.5":0.00629,"16.6":0.02831,"17.0":0.01258,"17.1":0.02202,"17.2":0.01258},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00193,"5.0-5.1":0.00193,"6.0-6.1":0.00483,"7.0-7.1":0.00676,"8.1-8.4":0.00097,"9.0-9.2":0.00773,"9.3":0.02416,"10.0-10.2":0.00193,"10.3":0.03479,"11.0-11.2":0.01643,"11.3-11.4":0.0145,"12.0-12.1":0.0087,"12.2-12.5":0.15849,"13.0-13.1":0.00387,"13.2":0.01643,"13.3":0.00966,"13.4-13.7":0.02803,"14.0-14.4":0.07441,"14.5-14.8":0.1208,"15.0-15.1":0.04735,"15.2-15.3":0.05798,"15.4":0.06475,"15.5":0.09084,"15.6-15.7":0.47741,"16.0":0.22421,"16.1":0.44938,"16.2":0.21551,"16.3":0.40396,"16.4":0.08311,"16.5":0.21454,"16.6-16.7":3.63662,"17.0":1.08915,"17.1":1.82942,"17.2":0.05219},P:{"4":0.36855,"20":0.12285,"21":0.09214,"22":0.18428,"23":0.33784,"5.0-5.4":0.02048,"6.2-6.4":0.01024,"7.2-7.4":0.15356,_:"8.2 10.1 12.0","9.2":0.02048,"11.1-11.2":0.01024,"13.0":0.04095,"14.0":0.02048,"15.0":0.02048,"16.0":0.04095,"17.0":0.07166,"18.0":0.06143,"19.0":0.04095},I:{"0":0.08184,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00025},K:{"0":0.52855,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.00944,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.13023,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.19191},H:{"0":0.15},L:{"0":71.87073},R:{_:"0"},M:{"0":0.09596},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AR.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AR.js
    index 203d49a6573580..a89b8b3a321d2a 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AR.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AR.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.01602,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0.004,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.004,"67":0,"68":0.004,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.004,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0.004,"87":0.004,"88":0.01201,"89":0,"90":0.004,"91":0.04004,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.004,"100":0.004,"101":0,"102":0.00801,"103":0.004,"104":0.00801,"105":0.004,"106":0.004,"107":0.004,"108":0.004,"109":0.004,"110":0.004,"111":0.004,"112":0.004,"113":0.004,"114":0.01201,"115":0.19219,"116":0.03203,"117":0.44444,"118":0.03604,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.004,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.02803,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0.01602,"63":0,"64":0,"65":0,"66":0.01201,"67":0,"68":0,"69":0,"70":0.004,"71":0,"72":0.004,"73":0,"74":0.004,"75":0.004,"76":0.004,"77":0,"78":0.004,"79":0.01602,"80":0.004,"81":0.004,"83":0.004,"84":0.004,"85":0.004,"86":0.004,"87":0.00801,"88":0.01201,"89":0.004,"90":0.004,"91":0.01201,"92":0.00801,"93":0.00801,"94":0.00801,"95":0.00801,"96":0.004,"97":0.00801,"98":0.004,"99":0.00801,"100":0.004,"101":0.00801,"102":0.00801,"103":0.02803,"104":0.01201,"105":0.01602,"106":0.01201,"107":0.01602,"108":0.02402,"109":1.8058,"110":0.01201,"111":0.01201,"112":0.02402,"113":0.03203,"114":0.08008,"115":0.16016,"116":7.57156,"117":2.23423,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.004,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.004,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.004,"71":0,"72":0.00801,"73":0.004,"74":0,"75":0,"76":0,"77":0.01201,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.004,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.02803,"96":0,"97":0,"98":0,"99":0.004,"100":0.12012,"101":0.22022,"102":0.42442,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0.004,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.004,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.02002,"110":0,"111":0,"112":0.004,"113":0.004,"114":0.01201,"115":0.02002,"116":0.54454,"117":0.46046},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.004,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.004,"10.1":0,"11.1":0.004,"12.1":0,"13.1":0.00801,"14.1":0.01602,"15.1":0,"15.2-15.3":0,"15.4":0.004,"15.5":0.004,"15.6":0.03203,"16.0":0,"16.1":0.00801,"16.2":0.004,"16.3":0.01201,"16.4":0.00801,"16.5":0.02402,"16.6":0.11612,"17.0":0.00801,"17.1":0},G:{"8":0,"3.2":0.00142,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.01495,"6.0-6.1":0,"7.0-7.1":0.00214,"8.1-8.4":0.00142,"9.0-9.2":0,"9.3":0.02064,"10.0-10.2":0,"10.3":0.01566,"11.0-11.2":0.00142,"11.3-11.4":0.04555,"12.0-12.1":0.00214,"12.2-12.5":0.11601,"13.0-13.1":0.00214,"13.2":0.00071,"13.3":0.02135,"13.4-13.7":0.01281,"14.0-14.4":0.02562,"14.5-14.8":0.06548,"15.0-15.1":0.01495,"15.2-15.3":0.01922,"15.4":0.02491,"15.5":0.04199,"15.6-15.7":0.73305,"16.0":0.12455,"16.1":0.28397,"16.2":0.11316,"16.3":0.28041,"16.4":0.03914,"16.5":0.14661,"16.6":4.47945,"17.0":0.34375,"17.1":0.00071},P:{"4":0.10193,"20":0.06116,"21":0.13251,"22":2.28328,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.19367,"8.2":0.01019,"9.2":0,"10.1":0,"11.1-11.2":0.01019,"12.0":0.01019,"13.0":0.03058,"14.0":0.02039,"15.0":0.01019,"16.0":0.03058,"17.0":0.10193,"18.0":0.02039,"19.0":0.04077},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.01008,"4.4":0,"4.4.3-4.4.4":0.05795},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01602,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":72.40833},R:{_:"0"},M:{"0":0.11992},Q:{"13.1":0},O:{"0":0.03598},H:{"0":0.16462}};
    +module.exports={C:{"52":0.03715,"59":0.00826,"66":0.00413,"68":0.00413,"72":0.00413,"78":0.02064,"80":0.00413,"82":0.00413,"86":0.00826,"88":0.04128,"89":0.00826,"90":0.02064,"91":0.09082,"93":0.00413,"99":0.00413,"102":0.00826,"103":0.03302,"105":0.00413,"106":0.00413,"107":0.00413,"108":0.00413,"109":0.00413,"110":0.00826,"111":0.00413,"112":0.00826,"113":0.0289,"114":0.02064,"115":0.36739,"116":0.00413,"117":0.00826,"118":0.03302,"119":0.79258,"120":0.24768,"121":0.00413,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 60 61 62 63 64 65 67 69 70 71 73 74 75 76 77 79 81 83 84 85 87 92 94 95 96 97 98 100 101 104 122 123 3.5 3.6"},D:{"34":0.00413,"38":0.01238,"47":0.00413,"49":0.05779,"51":0.00413,"58":0.00413,"60":0.00413,"63":0.00413,"66":0.02477,"68":0.00413,"73":0.00413,"74":0.00413,"75":0.00413,"76":0.00826,"78":0.00826,"79":0.03302,"80":0.00413,"81":0.00826,"83":0.00826,"84":0.00413,"85":0.01651,"86":0.00826,"87":0.01238,"88":0.0289,"89":0.00826,"90":0.00826,"91":0.04954,"92":0.05779,"93":0.01238,"94":0.00826,"95":0.01238,"96":0.00826,"97":0.01651,"98":0.00826,"99":0.00826,"100":0.01238,"101":0.00826,"102":0.01238,"103":0.06192,"104":0.01238,"105":0.03715,"106":0.02064,"107":0.02477,"108":0.04541,"109":4.76371,"110":0.02064,"111":0.02064,"112":0.02477,"113":0.02064,"114":0.06192,"115":0.07018,"116":0.19814,"117":0.26006,"118":5.77094,"119":20.84227,"120":0.00413,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 39 40 41 42 43 44 45 46 48 50 52 53 54 55 56 57 59 61 62 64 65 67 69 70 71 72 77 121 122"},F:{"28":0.00826,"36":0.00826,"77":0.00826,"78":0.00413,"79":0.00413,"85":0.00413,"86":0.00413,"89":0.00413,"95":0.05366,"102":0.97834,"103":0.08669,"104":0.76368,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 80 81 82 83 84 87 88 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.00413},B:{"17":0.00413,"18":0.00413,"91":0.00413,"92":0.03302,"107":0.00413,"108":0.00413,"109":0.04541,"111":0.00413,"112":0.00413,"113":0.00413,"114":0.00826,"115":0.00826,"116":0.00826,"117":0.03715,"118":0.42518,"119":2.05987,_:"12 13 14 15 16 79 80 81 83 84 85 86 87 88 89 90 93 94 95 96 97 98 99 100 101 102 103 104 105 106 110"},E:{"14":0.01238,"15":0.00413,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 6.1 7.1 9.1 10.1","5.1":0.00413,"11.1":0.00413,"12.1":0.00413,"13.1":0.01651,"14.1":0.04954,"15.1":0.00413,"15.2-15.3":0.00413,"15.4":0.00413,"15.5":0.00826,"15.6":0.06192,"16.0":0.00413,"16.1":0.01238,"16.2":0.00826,"16.3":0.0289,"16.4":0.01238,"16.5":0.03302,"16.6":0.15274,"17.0":0.07843,"17.1":0.14448,"17.2":0.00413},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00091,"5.0-5.1":0.00091,"6.0-6.1":0.00226,"7.0-7.1":0.00317,"8.1-8.4":0.00045,"9.0-9.2":0.00362,"9.3":0.01132,"10.0-10.2":0.00091,"10.3":0.0163,"11.0-11.2":0.0077,"11.3-11.4":0.00679,"12.0-12.1":0.00407,"12.2-12.5":0.07425,"13.0-13.1":0.00181,"13.2":0.0077,"13.3":0.00453,"13.4-13.7":0.01313,"14.0-14.4":0.03486,"14.5-14.8":0.05659,"15.0-15.1":0.02218,"15.2-15.3":0.02716,"15.4":0.03033,"15.5":0.04256,"15.6-15.7":0.22365,"16.0":0.10503,"16.1":0.21052,"16.2":0.10096,"16.3":0.18924,"16.4":0.03893,"16.5":0.10051,"16.6-16.7":1.70363,"17.0":0.51023,"17.1":0.85702,"17.2":0.02445},P:{"4":0.11165,"20":0.0406,"21":0.09135,"22":0.1827,"23":2.12133,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1","7.2-7.4":0.15225,"11.1-11.2":0.01015,"12.0":0.01015,"13.0":0.0203,"14.0":0.03045,"15.0":0.01015,"16.0":0.03045,"17.0":0.09135,"18.0":0.0203,"19.0":0.03045},I:{"0":0.02337,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.00007},K:{"0":0.15442,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.0289,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.02936},H:{"0":0.01},L:{"0":51.89643},R:{_:"0"},M:{"0":0.12331},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AS.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AS.js
    index 9aaa11b099f2dc..bb2993e2c25fb3 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AS.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AS.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.01425,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.04276,"116":0.00713,"117":0.47744,"118":0.0285,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0.40618,"76":0.01425,"77":0,"78":0,"79":0.01425,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0.14965,"88":0.1924,"89":0,"90":0,"91":0,"92":0,"93":13.99546,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.00713,"102":0,"103":0.73398,"104":0,"105":0.5202,"106":0.00713,"107":0,"108":0.01425,"109":0.5487,"110":0.02138,"111":0.02138,"112":0.00713,"113":0.0285,"114":2.04516,"115":1.73162,"116":14.92184,"117":0.42756,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00713,"101":0.00713,"102":0.00713,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.0285,"110":0,"111":0,"112":0,"113":0,"114":0.07839,"115":0.01425,"116":0.77673,"117":1.22567},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.22091,"15":0.00713,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.01425,"13.1":0.02138,"14.1":0.34917,"15.1":0.64134,"15.2-15.3":0.54158,"15.4":0.06413,"15.5":0.29217,"15.6":0.71973,"16.0":0.01425,"16.1":0.14965,"16.2":0.22091,"16.3":0.36343,"16.4":0.13539,"16.5":1.76725,"16.6":5.316,"17.0":0.31354,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.0137,"10.0-10.2":0,"10.3":0,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0.0274,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0,"14.0-14.4":0.00913,"14.5-14.8":0.0274,"15.0-15.1":0.0685,"15.2-15.3":0.07307,"15.4":0.25117,"15.5":0.42014,"15.6-15.7":3.19217,"16.0":1.6349,"16.1":3.2013,"16.2":1.24216,"16.3":2.47975,"16.4":0.43384,"16.5":1.23759,"16.6":28.68384,"17.0":2.20575,"17.1":0.00457},P:{"4":0,"20":0,"21":0.01042,"22":0.15627,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0,"17.0":0,"18.0":0,"19.0":0},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":3.73515},R:{_:"0"},M:{"0":0.21842},Q:{"13.1":0},O:{"0":0.02299},H:{"0":0.00544}};
    +module.exports={C:{"115":0.06609,"119":0.21245,"120":0.00472,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 116 117 118 121 122 123 3.5 3.6"},D:{"64":0.00472,"75":0.00472,"87":0.00944,"88":0.00472,"93":0.08498,"102":0.00472,"103":0.0897,"105":0.34463,"106":0.00472,"108":0.00472,"109":1.37853,"111":0.00944,"112":0.00472,"113":0.00472,"114":0.01416,"115":0.04721,"116":0.03305,"117":0.22661,"118":1.64291,"119":0.75064,"120":0.00944,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 65 66 67 68 69 70 71 72 73 74 76 77 78 79 80 81 83 84 85 86 89 90 91 92 94 95 96 97 98 99 100 101 104 107 110 121 122"},F:{"102":0.00944,"103":0.00944,"104":0.00472,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"118":0.04249,"119":0.59957,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117"},E:{"12":0.00472,"14":0.00944,_:"0 4 5 6 7 8 9 10 11 13 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 13.1","14.1":0.00944,"15.1":0.74592,"15.2-15.3":1.25107,"15.4":0.30214,"15.5":1.62402,"15.6":6.64245,"16.0":0.24549,"16.1":0.52875,"16.2":0.35408,"16.3":1.36437,"16.4":0.16524,"16.5":1.56737,"16.6":12.08104,"17.0":1.90728,"17.1":6.06649,"17.2":0.06609},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.01028,"5.0-5.1":0.01028,"6.0-6.1":0.0257,"7.0-7.1":0.03598,"8.1-8.4":0.00514,"9.0-9.2":0.04113,"9.3":0.12852,"10.0-10.2":0.01028,"10.3":0.18506,"11.0-11.2":0.08739,"11.3-11.4":0.07711,"12.0-12.1":0.04627,"12.2-12.5":0.84307,"13.0-13.1":0.02056,"13.2":0.08739,"13.3":0.05141,"13.4-13.7":0.14908,"14.0-14.4":0.39583,"14.5-14.8":0.64259,"15.0-15.1":0.25189,"15.2-15.3":0.30844,"15.4":0.34443,"15.5":0.48322,"15.6-15.7":2.5395,"16.0":1.19264,"16.1":2.39042,"16.2":1.14637,"16.3":2.14881,"16.4":0.4421,"16.5":1.14123,"16.6-16.7":19.34442,"17.0":5.79356,"17.1":9.73133,"17.2":0.2776},P:{"22":0.03417,"23":0.17087,_:"4 20 21 5.0-5.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0","6.2-6.4":0.01139},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{"0":0,_:"10 11 12 11.1 11.5 12.1"},A:{_:"6 7 8 9 10 11 5.5"},N:{_:"10 11"},S:{"2.5":0.00528,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.01584},H:{"0":0},L:{"0":1.43073},R:{_:"0"},M:{"0":0.02112},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AT.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AT.js
    index f12e3d0e1cffd0..58624417e92cb5 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AT.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AT.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00542,"48":0.00542,"49":0,"50":0,"51":0,"52":0.03251,"53":0.00542,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.02168,"69":0,"70":0,"71":0,"72":0,"73":0.00542,"74":0,"75":0,"76":0,"77":0,"78":0.03251,"79":0,"80":0,"81":0,"82":0,"83":0.00542,"84":0,"85":0,"86":0,"87":0,"88":0.00542,"89":0,"90":0,"91":0.01626,"92":0,"93":0,"94":0,"95":0,"96":0.01626,"97":0,"98":0,"99":0.00542,"100":0,"101":0,"102":0.52564,"103":0.00542,"104":0.00542,"105":0.01084,"106":0.00542,"107":0.01084,"108":0.01084,"109":0.02168,"110":0.01084,"111":0.01626,"112":0.01084,"113":0.02168,"114":0.03251,"115":0.4281,"116":0.20592,"117":3.18637,"118":0.30888,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.01084,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.01084,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00542,"66":0,"67":0,"68":0.00542,"69":0.00542,"70":0.00542,"71":0,"72":0,"73":0,"74":0,"75":0.00542,"76":0.00542,"77":0.00542,"78":0.00542,"79":0.05961,"80":0.00542,"81":0.07045,"83":0.00542,"84":0.00542,"85":0.01084,"86":0.07045,"87":0.01626,"88":0.01084,"89":0.03251,"90":0.0271,"91":0,"92":0,"93":0.00542,"94":0.00542,"95":0.00542,"96":0.00542,"97":0.00542,"98":0.01626,"99":0.01626,"100":0.07045,"101":0.13006,"102":0.08129,"103":0.09754,"104":0.07587,"105":0.00542,"106":0.01626,"107":0.01084,"108":0.03251,"109":0.50397,"110":0.04877,"111":0.03793,"112":0.03251,"113":0.0867,"114":0.24927,"115":0.28721,"116":8.31275,"117":3.0238,"118":0.00542,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00542,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00542,"70":0,"71":0.00542,"72":0.01084,"73":0,"74":0,"75":0,"76":0,"77":0.03793,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.01084,"86":0,"87":0.00542,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.0271,"96":0,"97":0,"98":0,"99":0.01626,"100":0.18425,"101":0.52022,"102":1.36559,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00542,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00542,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.01084,"108":0.01084,"109":0.0867,"110":0.01626,"111":0.00542,"112":0.01626,"113":0.03251,"114":0.10296,"115":0.11922,"116":2.40604,"117":2.43855},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00542,"14":0.04877,"15":0.00542,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.01626,"10.1":0,"11.1":0.00542,"12.1":0.01084,"13.1":0.0867,"14.1":0.11922,"15.1":0.01626,"15.2-15.3":0.01626,"15.4":0.0271,"15.5":0.03793,"15.6":0.25469,"16.0":0.03793,"16.1":0.08129,"16.2":0.08129,"16.3":0.18967,"16.4":0.0867,"16.5":0.26553,"16.6":1.3114,"17.0":0.1138,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00582,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.04659,"10.0-10.2":0,"10.3":0.06406,"11.0-11.2":0.01165,"11.3-11.4":0.01165,"12.0-12.1":0.01165,"12.2-12.5":0.27079,"13.0-13.1":0.01165,"13.2":0.02621,"13.3":0.02038,"13.4-13.7":0.03203,"14.0-14.4":0.14558,"14.5-14.8":0.34649,"15.0-15.1":0.13394,"15.2-15.3":0.10191,"15.4":0.11647,"15.5":0.19508,"15.6-15.7":1.42673,"16.0":1.04821,"16.1":1.60725,"16.2":0.75704,"16.3":1.39178,"16.4":0.23876,"16.5":0.93756,"16.6":17.29249,"17.0":2.47784,"17.1":0.00582},P:{"4":0.18599,"20":0.062,"21":0.16532,"22":3.57507,"5.0-5.4":0.01033,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01033,"12.0":0,"13.0":0.02067,"14.0":0.031,"15.0":0.01033,"16.0":0.02067,"17.0":0.031,"18.0":0.02067,"19.0":0.062},I:{"0":0,"3":0,"4":0.0029,"2.1":0,"2.2":0,"2.3":0.0029,"4.1":0.02614,"4.2-4.3":0.01162,"4.4":0,"4.4.3-4.4.4":0.1394},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.00542,"10":0,"11":0.04335,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":33.56177},R:{_:"0"},M:{"0":0.85207},Q:{"13.1":0},O:{"0":0.03665},H:{"0":0.4337}};
    +module.exports={C:{"37":0.00519,"47":0.00519,"48":0.00519,"52":0.05708,"53":0.00519,"60":0.00519,"68":0.01557,"75":0.00519,"78":0.05189,"83":0.00519,"88":0.01038,"91":0.02076,"92":0.00519,"96":0.03113,"99":0.00519,"101":0.00519,"102":0.05708,"103":0.00519,"104":0.02076,"105":0.01038,"106":0.01038,"107":0.01557,"108":0.01557,"109":0.02076,"110":0.01038,"111":0.01038,"112":0.01038,"113":0.02595,"114":0.02595,"115":1.18828,"116":0.02595,"117":0.03632,"118":0.17643,"119":4.79983,"120":1.40103,"121":0.00519,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 39 40 41 42 43 44 45 46 49 50 51 54 55 56 57 58 59 61 62 63 64 65 66 67 69 70 71 72 73 74 76 77 79 80 81 82 84 85 86 87 89 90 93 94 95 97 98 100 122 123 3.5 3.6"},D:{"29":0.00519,"34":0.01038,"38":0.01038,"47":0.00519,"49":0.02076,"51":0.00519,"65":0.00519,"68":0.00519,"69":0.00519,"70":0.00519,"75":0.01038,"78":0.00519,"79":0.11935,"80":0.01038,"81":0.01038,"83":0.00519,"84":0.00519,"85":0.01038,"86":0.18162,"87":0.03632,"88":0.01038,"89":0.05189,"90":0.01038,"91":0.00519,"92":0.00519,"93":0.01038,"94":0.01038,"96":0.00519,"97":0.00519,"98":0.00519,"99":0.01557,"100":0.1868,"101":0.36842,"102":0.19718,"103":0.24907,"104":0.19718,"105":0.02076,"106":0.01038,"107":0.02595,"108":0.08821,"109":0.95478,"110":0.03113,"111":0.04151,"112":0.05189,"113":0.16605,"114":0.25426,"115":0.06746,"116":0.29058,"117":0.41512,"118":4.69086,"119":16.15336,"120":0.01038,"121":0.00519,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 30 31 32 33 35 36 37 39 40 41 42 43 44 45 46 48 50 52 53 54 55 56 57 58 59 60 61 62 63 64 66 67 71 72 73 74 76 77 95 122"},F:{"46":0.01038,"84":0.00519,"85":0.03113,"93":0.00519,"95":0.0467,"99":0.00519,"100":0.00519,"101":0.00519,"102":1.28168,"103":0.34247,"104":1.31801,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 86 87 88 89 90 91 92 94 96 97 98 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.00519,"92":0.01038,"100":0.00519,"105":0.00519,"107":0.01038,"108":0.00519,"109":0.13491,"110":0.01038,"111":0.01038,"112":0.01038,"113":0.02595,"114":0.03632,"115":0.02076,"116":0.11416,"117":0.21275,"118":1.38027,"119":7.0778,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 101 102 103 104 106"},E:{"9":0.00519,"13":0.00519,"14":0.06227,"15":0.01557,_:"0 4 5 6 7 8 10 11 12 3.1 3.2 6.1 7.1","5.1":0.00519,"9.1":0.00519,"10.1":0.00519,"11.1":0.01557,"12.1":0.02076,"13.1":0.12454,"14.1":0.20756,"15.1":0.02076,"15.2-15.3":0.04151,"15.4":0.05708,"15.5":0.07265,"15.6":0.46182,"16.0":0.07265,"16.1":0.15567,"16.2":0.12454,"16.3":0.31134,"16.4":0.10897,"16.5":0.30615,"16.6":1.29725,"17.0":0.58636,"17.1":1.26612,"17.2":0.02076},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00373,"5.0-5.1":0.00373,"6.0-6.1":0.00933,"7.0-7.1":0.01306,"8.1-8.4":0.00187,"9.0-9.2":0.01493,"9.3":0.04664,"10.0-10.2":0.00373,"10.3":0.06717,"11.0-11.2":0.03172,"11.3-11.4":0.02799,"12.0-12.1":0.01679,"12.2-12.5":0.30598,"13.0-13.1":0.00746,"13.2":0.03172,"13.3":0.01866,"13.4-13.7":0.05411,"14.0-14.4":0.14366,"14.5-14.8":0.23321,"15.0-15.1":0.09142,"15.2-15.3":0.11194,"15.4":0.125,"15.5":0.17538,"15.6-15.7":0.92166,"16.0":0.43284,"16.1":0.86755,"16.2":0.41605,"16.3":0.77987,"16.4":0.16045,"16.5":0.41419,"16.6-16.7":7.02065,"17.0":2.10265,"17.1":3.53178,"17.2":0.10075},P:{"4":0.17954,"20":0.04225,"21":0.10561,"22":0.3274,"23":3.59084,"5.0-5.4":0.02112,_:"6.2-6.4 8.2 9.2 10.1 11.1-11.2","7.2-7.4":0.01056,"12.0":0.01056,"13.0":0.01056,"14.0":0.01056,"15.0":0.01056,"16.0":0.02112,"17.0":0.02112,"18.0":0.02112,"19.0":0.05281},I:{"0":0.05266,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00004,"4.4":0,"4.4.3-4.4.4":0.00016},K:{"0":0.44742,_:"10 11 12 11.1 11.5 12.1"},A:{"9":0.02707,"11":0.09746,_:"6 7 8 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.03368},H:{"0":0},L:{"0":24.02431},R:{_:"0"},M:{"0":0.66873},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AU.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AU.js
    index fa344adf199ffe..1297a4bf3c651f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AU.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AU.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00546,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.01091,"53":0,"54":0.00546,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.01637,"79":0,"80":0,"81":0,"82":0,"83":0.00546,"84":0,"85":0,"86":0,"87":0.00546,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.03274,"103":0.00546,"104":0,"105":0.00546,"106":0.00546,"107":0,"108":0.00546,"109":0.00546,"110":0.00546,"111":0.00546,"112":0.00546,"113":0.01091,"114":0.01637,"115":0.14188,"116":0.09823,"117":1.06412,"118":0.09277,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0.01637,"26":0.00546,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.01637,"35":0,"36":0,"37":0,"38":0.04366,"39":0.00546,"40":0.00546,"41":0.00546,"42":0,"43":0.00546,"44":0.00546,"45":0.00546,"46":0.00546,"47":0.00546,"48":0,"49":0.01091,"50":0,"51":0.00546,"52":0.01091,"53":0.00546,"54":0,"55":0.00546,"56":0.00546,"57":0,"58":0,"59":0.01637,"60":0.00546,"61":0,"62":0,"63":0.00546,"64":0,"65":0.00546,"66":0.01637,"67":0.01637,"68":0.00546,"69":0.1146,"70":0.00546,"71":0,"72":0.00546,"73":0.00546,"74":0.00546,"75":0.00546,"76":0.00546,"77":0,"78":0.00546,"79":0.05457,"80":0.00546,"81":0.02183,"83":0.00546,"84":0.00546,"85":0.01637,"86":0.02183,"87":0.0382,"88":0.02183,"89":0.00546,"90":0.00546,"91":0.01091,"92":0.01091,"93":0.01091,"94":0.00546,"95":0.00546,"96":0.01091,"97":0.01091,"98":0.01091,"99":0.02183,"100":0.01637,"101":0.03274,"102":0.02183,"103":0.12551,"104":0.03274,"105":0.01637,"106":0.03274,"107":0.04366,"108":0.06548,"109":0.4693,"110":0.17462,"111":0.05457,"112":0.09277,"113":0.12005,"114":0.40928,"115":0.74215,"116":11.46516,"117":2.7667,"118":0.01637,"119":0.00546,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.02183,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00546,"73":0,"74":0,"75":0,"76":0,"77":0.01637,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00546,"96":0,"97":0,"98":0,"99":0.01091,"100":0.09823,"101":0.18008,"102":0.24557,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0.00546,"15":0.01091,"16":0,"17":0,"18":0.00546,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0.00546,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00546,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00546,"103":0,"104":0,"105":0.00546,"106":0,"107":0.00546,"108":0.01091,"109":0.0382,"110":0.00546,"111":0.01091,"112":0.01091,"113":0.01637,"114":0.06003,"115":0.13097,"116":2.04638,"117":1.36971},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00546,"10":0,"11":0,"12":0,"13":0.01637,"14":0.08186,"15":0.01637,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0.00546,"12.1":0.02729,"13.1":0.10368,"14.1":0.22374,"15.1":0.03274,"15.2-15.3":0.03274,"15.4":0.06003,"15.5":0.09277,"15.6":0.52387,"16.0":0.04366,"16.1":0.13643,"16.2":0.12005,"16.3":0.31651,"16.4":0.1146,"16.5":0.31651,"16.6":2.48839,"17.0":0.08731,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.0123,"6.0-6.1":0.0164,"7.0-7.1":0.0123,"8.1-8.4":0.0246,"9.0-9.2":0.0164,"9.3":0.1517,"10.0-10.2":0.0041,"10.3":0.2132,"11.0-11.2":0.1148,"11.3-11.4":0.0779,"12.0-12.1":0.0492,"12.2-12.5":0.88149,"13.0-13.1":0.0082,"13.2":0.0082,"13.3":0.041,"13.4-13.7":0.0943,"14.0-14.4":0.2583,"14.5-14.8":0.5002,"15.0-15.1":0.1599,"15.2-15.3":0.1763,"15.4":0.246,"15.5":0.3444,"15.6-15.7":2.64448,"16.0":1.14389,"16.1":2.34928,"16.2":1.12339,"16.3":2.07049,"16.4":0.3362,"16.5":1.09879,"16.6":24.77612,"17.0":1.57849,"17.1":0},P:{"4":0.20022,"20":0.07377,"21":0.15807,"22":2.41318,"5.0-5.4":0.04215,"6.2-6.4":0.01054,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01054,"12.0":0,"13.0":0.02108,"14.0":0.01054,"15.0":0.01054,"16.0":0.03161,"17.0":0.02108,"18.0":0.02108,"19.0":0.04215},I:{"0":0,"3":0.00684,"4":0.02051,"2.1":0.00228,"2.2":0.0114,"2.3":0.01367,"4.1":0.0114,"4.2-4.3":0.02507,"4.4":0,"4.4.3-4.4.4":0.07521},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.03547,"9":0.02365,"10":0.01182,"11":0.07094,"5.5":0},S:{"2.5":0.00454,_:"3.0-3.1"},J:{"7":0,"10":0.00454},N:{"10":0.00909,"11":0},L:{"0":24.90616},R:{_:"0"},M:{"0":0.38161},Q:{"13.1":0.00454},O:{"0":0.05452},H:{"0":0.15914}};
    +module.exports={C:{"34":0.0053,"48":0.0053,"52":0.02119,"54":0.0053,"59":0.0053,"72":0.02649,"78":0.02119,"81":0.0053,"83":0.0053,"88":0.01589,"102":0.01589,"103":0.0053,"104":0.0053,"105":0.0053,"106":0.0053,"108":0.0053,"109":0.0053,"110":0.0053,"111":0.0053,"113":0.01059,"114":0.0053,"115":0.25955,"116":0.01589,"117":0.04238,"118":0.09005,"119":1.47257,"120":0.40257,"121":0.0053,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 49 50 51 53 55 56 57 58 60 61 62 63 64 65 66 67 68 69 70 71 73 74 75 76 77 79 80 82 84 85 86 87 89 90 91 92 93 94 95 96 97 98 99 100 101 107 112 122 123 3.5 3.6"},D:{"25":0.02649,"26":0.0053,"34":0.02649,"35":0.03178,"38":0.07416,"39":0.01059,"40":0.01059,"41":0.01059,"42":0.01059,"43":0.01059,"44":0.01059,"45":0.01059,"46":0.01059,"47":0.01059,"48":0.01059,"49":0.02649,"50":0.01059,"51":0.01059,"52":0.01589,"53":0.01059,"54":0.01059,"55":0.01059,"56":0.01059,"57":0.01059,"58":0.01059,"59":0.02649,"60":0.01059,"65":0.0053,"66":0.02649,"67":0.03708,"69":0.24366,"70":0.0053,"73":0.0053,"74":0.0053,"75":0.0053,"76":0.0053,"77":0.0053,"78":0.0053,"79":0.09535,"80":0.01059,"81":0.03708,"83":0.01059,"84":0.0053,"85":0.02649,"86":0.04767,"87":0.06356,"88":0.03178,"89":0.01059,"90":0.0053,"91":0.0053,"92":0.01059,"93":0.02119,"94":0.01059,"95":0.01589,"96":0.01589,"97":0.01589,"98":0.01589,"99":0.04767,"100":0.04767,"101":0.07416,"102":0.04767,"103":0.22247,"104":0.05827,"105":0.02649,"106":0.05297,"107":0.05297,"108":0.06886,"109":0.78396,"110":0.04238,"111":0.05827,"112":0.07416,"113":0.07416,"114":0.22247,"115":0.21718,"116":0.86871,"117":1.01173,"118":6.40407,"119":20.37226,"120":0.03178,"121":0.01589,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 27 28 29 30 31 32 33 36 37 61 62 63 64 68 71 72 122"},F:{"28":0.0053,"46":0.03708,"72":0.0053,"91":0.0053,"93":0.0053,"95":0.01059,"100":0.0053,"102":0.44495,"103":0.07416,"104":0.34431,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 92 94 96 97 98 99 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"17":0.0053,"18":0.0053,"85":0.0053,"92":0.0053,"100":0.0053,"103":0.0053,"105":0.0053,"106":0.0053,"107":0.01059,"108":0.01059,"109":0.07946,"110":0.01059,"111":0.01059,"112":0.01059,"113":0.02649,"114":0.04767,"115":0.02119,"116":0.08475,"117":0.21188,"118":1.18653,"119":5.69957,_:"12 13 14 15 16 79 80 81 83 84 86 87 88 89 90 91 93 94 95 96 97 98 99 101 102 104"},E:{"9":0.0053,"13":0.02649,"14":0.13772,"15":0.02649,_:"0 4 5 6 7 8 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1","11.1":0.01059,"12.1":0.04238,"13.1":0.1801,"14.1":0.37079,"15.1":0.05297,"15.2-15.3":0.06356,"15.4":0.09005,"15.5":0.15891,"15.6":0.91108,"16.0":0.07946,"16.1":0.23307,"16.2":0.1748,"16.3":0.48203,"16.4":0.16421,"16.5":0.38668,"16.6":3.19409,"17.0":0.65683,"17.1":1.27128,"17.2":0.02649},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00495,"5.0-5.1":0.00495,"6.0-6.1":0.01239,"7.0-7.1":0.01734,"8.1-8.4":0.00248,"9.0-9.2":0.01982,"9.3":0.06193,"10.0-10.2":0.00495,"10.3":0.08917,"11.0-11.2":0.04211,"11.3-11.4":0.03716,"12.0-12.1":0.02229,"12.2-12.5":0.40624,"13.0-13.1":0.00991,"13.2":0.04211,"13.3":0.02477,"13.4-13.7":0.07184,"14.0-14.4":0.19073,"14.5-14.8":0.30963,"15.0-15.1":0.12138,"15.2-15.3":0.14862,"15.4":0.16596,"15.5":0.23284,"15.6-15.7":1.22367,"16.0":0.57468,"16.1":1.15184,"16.2":0.55239,"16.3":1.03542,"16.4":0.21303,"16.5":0.54991,"16.6-16.7":9.32121,"17.0":2.79166,"17.1":4.68909,"17.2":0.13376},P:{"4":0.17661,"20":0.05519,"21":0.11038,"22":0.24284,"23":2.42843,"5.0-5.4":0.03311,"6.2-6.4":0.01104,_:"7.2-7.4 8.2 9.2 10.1 12.0","11.1-11.2":0.01104,"13.0":0.02208,"14.0":0.01104,"15.0":0.01104,"16.0":0.02208,"17.0":0.02208,"18.0":0.02208,"19.0":0.03311},I:{"0":0.05615,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00004,"4.4":0,"4.4.3-4.4.4":0.00017},K:{"0":0.13639,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.02771,"9":0.04156,"11":0.11083,_:"6 7 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.04233},H:{"0":0},L:{"0":18.69031},R:{_:"0"},M:{"0":0.37624},Q:{"13.1":0.00941}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AW.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AW.js
    index f60f631a08078f..d172c92f7cddd1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AW.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AW.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00294,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00587,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.02055,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00294,"108":0,"109":0,"110":0.01468,"111":0.03523,"112":0,"113":0,"114":0.01174,"115":0.01174,"116":0.01174,"117":0.21726,"118":0.02349,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00294,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0.00294,"76":0,"77":0,"78":0,"79":0.00587,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0.00294,"88":0,"89":0,"90":0,"91":0,"92":0.03817,"93":0.00587,"94":0,"95":0,"96":0,"97":0,"98":0.00294,"99":0.00294,"100":0,"101":0,"102":0,"103":0.02642,"104":0,"105":0.01174,"106":0.02349,"107":0.06753,"108":0.0323,"109":0.38755,"110":0.02055,"111":0.05578,"112":0.02349,"113":0.01762,"114":0.04991,"115":0.1468,"116":2.88902,"117":0.78978,"118":0.00294,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.00587,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00587,"101":0.04404,"102":0.0411,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.0323,"109":0.08221,"110":0,"111":0,"112":0,"113":0.00587,"114":0.01174,"115":0.06753,"116":1.00118,"117":0.74281},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.01174,"15":0.00587,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.02642,"14.1":0.02936,"15.1":0.01174,"15.2-15.3":0.01174,"15.4":0.01468,"15.5":0.01468,"15.6":0.06459,"16.0":0.01468,"16.1":0.01762,"16.2":0.02055,"16.3":0.08514,"16.4":0.02055,"16.5":0.09689,"16.6":0.6195,"17.0":0.03523,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.01947,"10.0-10.2":0,"10.3":0.03115,"11.0-11.2":0,"11.3-11.4":0.00389,"12.0-12.1":0.01947,"12.2-12.5":0.45561,"13.0-13.1":0,"13.2":0,"13.3":0.02726,"13.4-13.7":0.1285,"14.0-14.4":0.12461,"14.5-14.8":0.71651,"15.0-15.1":0.05841,"15.2-15.3":0.15187,"15.4":0.11682,"15.5":0.21417,"15.6-15.7":3.29049,"16.0":1.13318,"16.1":1.95872,"16.2":0.80218,"16.3":1.62772,"16.4":0.37383,"16.5":0.99299,"16.6":24.2484,"17.0":2.02492,"17.1":0},P:{"4":0.09307,"20":0.07239,"21":0.81697,"22":7.65267,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.19649,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01034,"12.0":0.01034,"13.0":0.02068,"14.0":0.05171,"15.0":0,"16.0":0.05171,"17.0":0.07239,"18.0":0.03102,"19.0":0.10341},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.1568},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00294,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0.00706,"11":0},L:{"0":40.55609},R:{_:"0"},M:{"0":0.33907},Q:{"13.1":0.01413},O:{"0":0.01413},H:{"0":0.11369}};
    +module.exports={C:{"52":0.00291,"78":0.01457,"90":0.00291,"96":0.00291,"101":0.00583,"102":0.00583,"103":0.00291,"106":0.01457,"107":0.00291,"113":0.00583,"115":0.09908,"116":0.01166,"117":0.00291,"118":0.03497,"119":0.49247,"120":0.11656,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 91 92 93 94 95 97 98 99 100 104 105 108 109 110 111 112 114 121 122 123 3.5 3.6"},D:{"49":0.01166,"53":0.02623,"54":0.00291,"63":0.00291,"74":0.15736,"76":0.00291,"79":0.00291,"80":0.00291,"81":0.00291,"83":0.00583,"87":0.00583,"88":0.00291,"91":0.01457,"92":0.00583,"93":0.04662,"95":0.00291,"96":0.00291,"97":0.12822,"98":0.00291,"99":0.00291,"100":0.00291,"101":0.01166,"103":0.09908,"104":0.00583,"105":0.00291,"107":0.30888,"108":0.00583,"109":1.00824,"110":0.32637,"111":0.03205,"112":0.12822,"113":0.02623,"114":0.05537,"115":0.13404,"116":0.24478,"117":0.5624,"118":3.54342,"119":10.1786,"120":0.00583,"121":0.00291,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 50 51 52 55 56 57 58 59 60 61 62 64 65 66 67 68 69 70 71 72 73 75 77 78 84 85 86 89 90 94 102 106 122"},F:{"53":0.00291,"95":0.00291,"102":0.10782,"103":0.01748,"104":0.10199,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"17":0.00291,"18":0.00291,"92":0.00583,"105":0.00291,"106":0.00583,"107":0.02331,"109":0.04371,"113":0.00291,"114":0.00874,"115":0.02914,"116":0.00583,"117":0.11947,"118":0.99076,"119":4.91592,_:"12 13 14 15 16 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 108 110 111 112"},E:{"10":0.00291,"13":0.00291,"14":0.03788,"15":0.00874,_:"0 4 5 6 7 8 9 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.00583,"13.1":0.07576,"14.1":0.08742,"15.1":0.02331,"15.2-15.3":0.01748,"15.4":0.50412,"15.5":0.03205,"15.6":0.25935,"16.0":0.06702,"16.1":0.08159,"16.2":0.05537,"16.3":0.22729,"16.4":0.06702,"16.5":0.20107,"16.6":1.4162,"17.0":0.38465,"17.1":0.6877,"17.2":0.01166},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.0059,"5.0-5.1":0.0059,"6.0-6.1":0.01476,"7.0-7.1":0.02066,"8.1-8.4":0.00295,"9.0-9.2":0.02361,"9.3":0.07379,"10.0-10.2":0.0059,"10.3":0.10626,"11.0-11.2":0.05018,"11.3-11.4":0.04428,"12.0-12.1":0.02657,"12.2-12.5":0.48408,"13.0-13.1":0.01181,"13.2":0.05018,"13.3":0.02952,"13.4-13.7":0.0856,"14.0-14.4":0.22728,"14.5-14.8":0.36897,"15.0-15.1":0.14464,"15.2-15.3":0.1771,"15.4":0.19777,"15.5":0.27746,"15.6-15.7":1.45816,"16.0":0.6848,"16.1":1.37256,"16.2":0.65824,"16.3":1.23383,"16.4":0.25385,"16.5":0.65529,"16.6-16.7":11.10738,"17.0":3.32661,"17.1":5.58764,"17.2":0.15939},P:{"4":0.12412,"20":0.04137,"21":0.11378,"22":0.53785,"23":7.2092,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 12.0","7.2-7.4":0.11378,"11.1-11.2":0.03103,"13.0":0.05172,"14.0":0.06206,"15.0":0.01034,"16.0":0.01034,"17.0":0.03103,"18.0":0.04137,"19.0":0.04137},I:{"0":0.00705,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.00002},K:{"0":0.2197,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.00583,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.0567},H:{"0":0},L:{"0":32.44875},R:{_:"0"},M:{"0":0.36144},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AX.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AX.js
    index bc6618e6641a47..85d9981b8df0ca 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AX.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AX.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.02758,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00552,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.01655,"103":0,"104":0,"105":0,"106":0.00552,"107":0,"108":0.01103,"109":0,"110":0.00552,"111":0,"112":0,"113":0.00552,"114":0,"115":0.17651,"116":0.08274,"117":1.6879,"118":0.15996,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0.01655,"77":0,"78":0,"79":0.02758,"80":0,"81":0,"83":0,"84":0,"85":0.00552,"86":0,"87":0.03861,"88":0,"89":0,"90":0,"91":0,"92":0.01103,"93":0,"94":0,"95":0,"96":0.00552,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.07171,"104":0,"105":0.00552,"106":0.00552,"107":0,"108":0,"109":0.85498,"110":0,"111":0.00552,"112":0.00552,"113":0.00552,"114":0.07722,"115":0.33648,"116":12.9295,"117":4.36867,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.03861,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00552,"96":0,"97":0,"98":0,"99":0.00552,"100":0.04413,"101":0.14893,"102":0.07171,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.04964,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.01103,"110":0,"111":0,"112":0.00552,"113":0.1048,"114":0.08826,"115":0.05516,"116":2.45462,"117":1.9306},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.01103,"13":0.02758,"14":0.3089,"15":0.00552,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.01103,"13.1":0.06619,"14.1":0.11584,"15.1":0,"15.2-15.3":0.04413,"15.4":0.01655,"15.5":0.02758,"15.6":0.17651,"16.0":0.01655,"16.1":0.01103,"16.2":0.05516,"16.3":0.17651,"16.4":0.0331,"16.5":0.09377,"16.6":0.8605,"17.0":0.02758,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.04013,"10.0-10.2":0,"10.3":0.36119,"11.0-11.2":0,"11.3-11.4":0.0086,"12.0-12.1":0.04873,"12.2-12.5":1.07209,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0.01147,"14.0-14.4":0.0516,"14.5-14.8":0.18346,"15.0-15.1":0.01433,"15.2-15.3":0.24366,"15.4":0.0258,"15.5":0.07453,"15.6-15.7":0.62204,"16.0":0.49018,"16.1":1.30142,"16.2":0.26946,"16.3":0.45292,"16.4":0.01433,"16.5":0.18059,"16.6":22.2416,"17.0":0.8055,"17.1":0},P:{"4":0,"20":0.08611,"21":0.12916,"22":4.39157,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0.01076,"15.0":0,"16.0":0,"17.0":0,"18.0":0,"19.0":0.08611},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.07413},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00552,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":32.21495},R:{_:"0"},M:{"0":2.20164},Q:{"13.1":0},O:{"0":0},H:{"0":0.20377}};
    +module.exports={C:{"48":0.00615,"78":0.0123,"108":0.03074,"110":0.02459,"115":0.17214,"116":0.00615,"118":0.22748,"119":3.16622,"120":2.28091,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 109 111 112 113 114 117 121 122 123 3.5 3.6"},D:{"76":0.166,"79":0.08607,"85":0.00615,"87":0.11066,"92":0.01844,"94":0.0123,"103":0.13526,"109":1.86899,"111":0.00615,"113":0.01844,"114":0.05533,"115":0.07378,"116":0.35044,"117":0.17829,"118":8.50268,"119":26.22737,"120":0.0123,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 77 78 80 81 83 84 86 88 89 90 91 93 95 96 97 98 99 100 101 102 104 105 106 107 108 110 112 121 122"},F:{"97":0.0123,"102":2.31165,"103":0.01844,"104":1.08205,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"92":0.12296,"102":0.02459,"109":0.00615,"113":0.09837,"114":0.08607,"116":0.03074,"117":0.07378,"118":1.42019,"119":6.19718,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 103 104 105 106 107 108 110 111 112 115"},E:{"13":0.01844,"14":1.19886,"15":0.00615,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 15.2-15.3 17.2","12.1":0.02459,"13.1":0.04918,"14.1":0.15985,"15.1":0.02459,"15.4":0.02459,"15.5":0.0123,"15.6":0.19674,"16.0":0.09222,"16.1":0.07378,"16.2":0.14755,"16.3":0.18444,"16.4":0.09222,"16.5":0.06148,"16.6":1.76448,"17.0":0.166,"17.1":0.81768},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.0015,"5.0-5.1":0.0015,"6.0-6.1":0.00375,"7.0-7.1":0.00525,"8.1-8.4":0.00075,"9.0-9.2":0.006,"9.3":0.01876,"10.0-10.2":0.0015,"10.3":0.02702,"11.0-11.2":0.01276,"11.3-11.4":0.01126,"12.0-12.1":0.00676,"12.2-12.5":0.12309,"13.0-13.1":0.003,"13.2":0.01276,"13.3":0.00751,"13.4-13.7":0.02177,"14.0-14.4":0.05779,"14.5-14.8":0.09382,"15.0-15.1":0.03678,"15.2-15.3":0.04503,"15.4":0.05029,"15.5":0.07055,"15.6-15.7":0.37078,"16.0":0.17413,"16.1":0.34901,"16.2":0.16738,"16.3":0.31374,"16.4":0.06455,"16.5":0.16663,"16.6-16.7":2.82437,"17.0":0.84589,"17.1":1.42082,"17.2":0.04053},P:{"21":0.07056,"22":0.37634,"23":3.4929,_:"4 20 5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0","16.0":0.04704,"17.0":0.01176,"18.0":0.01176,"19.0":0.03528},I:{"0":0.03067,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.00009},K:{"0":0.0655,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.03074,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.00771},H:{"0":0},L:{"0":24.41034},R:{_:"0"},M:{"0":3.06699},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AZ.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AZ.js
    index e37a3f11a50244..9a31ed367e8812 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AZ.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/AZ.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00284,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0.00853,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.02274,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00284,"103":0,"104":0,"105":0.00284,"106":0,"107":0,"108":0,"109":0,"110":0.00568,"111":0,"112":0.01137,"113":0.00284,"114":0.00284,"115":0.01989,"116":0.01421,"117":0.1421,"118":0.00568,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00284,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00284,"39":0,"40":0,"41":0.00284,"42":0,"43":0.00284,"44":0.00284,"45":0.00284,"46":0.00284,"47":0,"48":0,"49":0.01989,"50":0,"51":0.00853,"52":0,"53":0.00568,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00284,"69":0,"70":0.00284,"71":0,"72":0,"73":0.00284,"74":0.00284,"75":0.00853,"76":0.04547,"77":0.00284,"78":0.00284,"79":0.12505,"80":0.03695,"81":0.00853,"83":0.00568,"84":0.01705,"85":0.00284,"86":0.03695,"87":0.02842,"88":0.08526,"89":0.01989,"90":0.14494,"91":0.01705,"92":0.00284,"93":0,"94":0.03695,"95":0.00853,"96":0.00284,"97":0.00853,"98":0,"99":0.01989,"100":0.01137,"101":0.00568,"102":0.00568,"103":0.03126,"104":0.00853,"105":0.00853,"106":0.00853,"107":0.01421,"108":0.01137,"109":0.82134,"110":0.01421,"111":0.01421,"112":0.04263,"113":0.01137,"114":0.02842,"115":0.07105,"116":3.21999,"117":0.75881,"118":0.00284,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00284,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00568,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.01137,"54":0,"55":0,"56":0,"57":0,"58":0.02842,"60":0,"62":0.01705,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00284,"70":0.00853,"71":0.00284,"72":0.09663,"73":0.02558,"74":0,"75":0,"76":0,"77":0.03126,"78":0.00284,"79":0.00568,"80":0,"81":0,"82":0,"83":0,"84":0.00284,"85":0.01421,"86":0,"87":0,"88":0,"89":0,"90":0.00568,"91":0,"92":0,"93":0,"94":0,"95":0.05684,"96":0,"97":0,"98":0,"99":0.00284,"100":0.03126,"101":0.13926,"102":0.14778,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00284,"13":0,"14":0.00284,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.0341,"91":0,"92":0.00568,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00284,"108":0.00284,"109":0.01137,"110":0,"111":0,"112":0,"113":0,"114":0.00284,"115":0.00853,"116":0.13642,"117":0.09663},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00568,"10":0,"11":0,"12":0,"13":0,"14":0.00284,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.09094,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00568,"14.1":0.00568,"15.1":0.00284,"15.2-15.3":0,"15.4":0.00568,"15.5":0.00284,"15.6":0.01421,"16.0":0.00284,"16.1":0.01137,"16.2":0.00568,"16.3":0.00853,"16.4":0.00568,"16.5":0.01137,"16.6":0.0881,"17.0":0.00568,"17.1":0},G:{"8":0.00352,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00352,"6.0-6.1":0,"7.0-7.1":0.02642,"8.1-8.4":0.01057,"9.0-9.2":0.00352,"9.3":0.02114,"10.0-10.2":0,"10.3":0.07221,"11.0-11.2":0.03347,"11.3-11.4":0,"12.0-12.1":0.01585,"12.2-12.5":0.28181,"13.0-13.1":0.00176,"13.2":0.00176,"13.3":3.45924,"13.4-13.7":0.02994,"14.0-14.4":0.08102,"14.5-14.8":0.19727,"15.0-15.1":0.05284,"15.2-15.3":0.05284,"15.4":0.05636,"15.5":0.14443,"15.6-15.7":1.02861,"16.0":0.42272,"16.1":0.60766,"16.2":0.31352,"16.3":0.61646,"16.4":0.20079,"16.5":0.51783,"16.6":8.15669,"17.0":1.03214,"17.1":0},P:{"4":0.52002,"20":0.12236,"21":0.32629,"22":3.37504,"5.0-5.4":0,"6.2-6.4":0.02039,"7.2-7.4":0.07138,"8.2":0,"9.2":0.0102,"10.1":0,"11.1-11.2":0.02039,"12.0":0.03059,"13.0":0.08157,"14.0":0.03059,"15.0":0.03059,"16.0":0.03059,"17.0":0.10196,"18.0":0.07138,"19.0":0.12236},I:{"0":0,"3":0,"4":0.01081,"2.1":0,"2.2":0.00649,"2.3":0.00649,"4.1":0.01297,"4.2-4.3":0.03027,"4.4":0,"4.4.3-4.4.4":0.08865},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.02274,"9":0.00284,"10":0.00284,"11":0.03979,"5.5":0},S:{"2.5":0.00716,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0.01432,"11":0},L:{"0":65.93823},R:{_:"0"},M:{"0":0.32927},Q:{"13.1":0},O:{"0":0.21474},H:{"0":0.90131}};
    +module.exports={C:{"34":0.00199,"52":0.04781,"68":0.00199,"78":0.00199,"82":0.00199,"100":0.00199,"102":0.00199,"104":0.00398,"108":0.00199,"113":0.00199,"114":0.00199,"115":0.06574,"116":0.00199,"117":0.00398,"118":0.00797,"119":0.19522,"120":0.05378,"122":0.00199,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 101 103 105 106 107 109 110 111 112 121 123 3.5 3.6"},D:{"11":0.00199,"22":0.00598,"26":0.00199,"38":0.00996,"41":0.00797,"49":0.01793,"51":0.00598,"53":0.01594,"54":0.00199,"55":0.00199,"56":0.00797,"57":0.00199,"58":0.00398,"63":0.00598,"64":0.00199,"65":0.00398,"66":0.00398,"68":0.00199,"69":0.00199,"70":0.00398,"71":0.00199,"72":0.00797,"73":0.00199,"74":0.00598,"75":0.00199,"76":0.00199,"77":0.01195,"78":0.00199,"79":0.14542,"80":0.01992,"81":0.00398,"83":0.01394,"84":0.00398,"85":0.01594,"86":0.00398,"87":0.05578,"88":0.00996,"89":0.00996,"90":0.0239,"91":0.00398,"92":0.00598,"93":0.00199,"94":0.00398,"95":0.00398,"96":0.00598,"97":0.00398,"98":0.00199,"99":0.00996,"100":0.01992,"101":0.02789,"102":0.01793,"103":0.01793,"104":0.02988,"105":0.01594,"106":0.03586,"107":0.03984,"108":0.02191,"109":2.62346,"110":0.01394,"111":0.02191,"112":0.05378,"113":0.01195,"114":0.02789,"115":0.03984,"116":0.10358,"117":0.21514,"118":2.25096,"119":9.04169,"120":0.00598,"121":0.00398,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 23 24 25 27 28 29 30 31 32 33 34 35 36 37 39 40 42 43 44 45 46 47 48 50 52 59 60 61 62 67 122"},F:{"36":0.00199,"40":0.00199,"46":0.01195,"49":0.00199,"65":0.00199,"79":0.01394,"82":0.00199,"83":0.00199,"84":0.01793,"85":0.04382,"86":0.00598,"92":0.01992,"95":0.13546,"98":0.00199,"99":0.00199,"100":0.00199,"101":0.00199,"102":0.20518,"103":0.15139,"104":0.41434,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 38 39 41 42 43 44 45 47 48 50 51 52 53 54 55 56 57 58 60 62 63 64 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 87 88 89 90 91 93 94 96 97 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.00199},B:{"12":0.01195,"14":0.00199,"15":0.00199,"18":0.00398,"84":0.00398,"92":0.01195,"109":0.03785,"110":0.00398,"111":0.00199,"112":0.00199,"113":0.00398,"114":0.00398,"115":0.00398,"116":0.0239,"117":0.01992,"118":0.1733,"119":0.86851,_:"13 16 17 79 80 81 83 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108"},E:{"13":0.00199,"14":0.00996,"15":0.00199,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 6.1 7.1 9.1 10.1","5.1":0.26693,"11.1":0.00199,"12.1":0.00199,"13.1":0.01195,"14.1":0.02191,"15.1":0.00398,"15.2-15.3":0.00398,"15.4":0.02191,"15.5":0.00996,"15.6":0.09163,"16.0":0.00398,"16.1":0.03984,"16.2":0.00797,"16.3":0.04382,"16.4":0.01594,"16.5":0.0239,"16.6":0.16534,"17.0":0.09163,"17.1":0.09562,"17.2":0.00199},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00203,"5.0-5.1":0.00203,"6.0-6.1":0.00507,"7.0-7.1":0.00709,"8.1-8.4":0.00101,"9.0-9.2":0.0081,"9.3":0.02533,"10.0-10.2":0.00203,"10.3":0.03647,"11.0-11.2":0.01722,"11.3-11.4":0.0152,"12.0-12.1":0.00912,"12.2-12.5":0.16613,"13.0-13.1":0.00405,"13.2":0.01722,"13.3":0.01013,"13.4-13.7":0.02938,"14.0-14.4":0.078,"14.5-14.8":0.12663,"15.0-15.1":0.04964,"15.2-15.3":0.06078,"15.4":0.06787,"15.5":0.09522,"15.6-15.7":0.50043,"16.0":0.23502,"16.1":0.47105,"16.2":0.2259,"16.3":0.42344,"16.4":0.08712,"16.5":0.22489,"16.6-16.7":3.81196,"17.0":1.14166,"17.1":1.91763,"17.2":0.0547},P:{"4":0.44789,"20":0.07126,"21":0.2952,"22":0.42753,"23":3.50171,"5.0-5.4":0.01018,"6.2-6.4":0.01018,"7.2-7.4":0.08144,"8.2":0.01018,"9.2":0.01018,_:"10.1","11.1-11.2":0.02036,"12.0":0.01018,"13.0":0.0509,"14.0":0.03054,"15.0":0.01018,"16.0":0.08144,"17.0":0.11197,"18.0":0.03054,"19.0":0.08144},I:{"0":0.06374,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00004,"4.4":0,"4.4.3-4.4.4":0.00019},K:{"0":1.22522,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00398,"11":0.03187,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.16817},H:{"0":0},L:{"0":63.05956},R:{_:"0"},M:{"0":0.32032},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BA.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BA.js
    index fce2b0b52cfbfd..110a20b171ef61 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BA.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BA.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00382,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.03054,"53":0,"54":0,"55":0,"56":0.00382,"57":0.00382,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00382,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.00382,"78":0.00382,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00382,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00382,"100":0,"101":0,"102":0.00382,"103":0.00382,"104":0.00382,"105":0,"106":0.00763,"107":0,"108":0.00382,"109":0.00382,"110":0.00763,"111":0.01145,"112":0.00382,"113":0.00382,"114":0.00382,"115":0.39697,"116":0.03435,"117":0.98479,"118":0.12596,"119":0,"120":0,"3.5":0,"3.6":0.00382},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00382,"39":0,"40":0,"41":0,"42":0,"43":0.00382,"44":0.00382,"45":0.00382,"46":0.00382,"47":0.00382,"48":0,"49":0.04199,"50":0,"51":0.00382,"52":0,"53":0.01145,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00763,"66":0,"67":0,"68":0.01145,"69":0,"70":0.00382,"71":0,"72":0.00382,"73":0.00382,"74":0.00382,"75":0.00382,"76":0,"77":0,"78":0.00382,"79":0.09543,"80":0.00382,"81":0.01527,"83":0.00382,"84":0.00763,"85":0.01145,"86":0.00382,"87":0.03435,"88":0.00763,"89":0.00382,"90":0.00382,"91":0.00763,"92":0.00763,"93":0.00382,"94":0.01145,"95":0.00763,"96":0.00763,"97":0.00763,"98":0.00382,"99":0.01527,"100":0.01145,"101":0,"102":0.00763,"103":0.01527,"104":0.01145,"105":0.00382,"106":0.01145,"107":0.03054,"108":0.03054,"109":1.7291,"110":0.01145,"111":0.01145,"112":0.03817,"113":0.02672,"114":0.07252,"115":0.12596,"116":6.11102,"117":1.64894,"118":0.00382,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.01909,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00763,"37":0,"38":0,"39":0,"40":0.00382,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.01527,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00382,"70":0.00382,"71":0,"72":0.00763,"73":0.00382,"74":0,"75":0,"76":0,"77":0.01527,"78":0.00382,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.0458,"96":0,"97":0,"98":0,"99":0.00382,"100":0.04962,"101":0.22139,"102":0.25574,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0.00382,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0.01145,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00382,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00382,"109":0.01527,"110":0,"111":0,"112":0.00382,"113":0.00382,"114":0.00763,"115":0.02672,"116":0.47331,"117":0.34353},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00763,"10":0,"11":0,"12":0,"13":0,"14":0.00382,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00763,"13.1":0.01145,"14.1":0.01145,"15.1":0.00382,"15.2-15.3":0.00382,"15.4":0.00382,"15.5":0.01145,"15.6":0.04962,"16.0":0.01145,"16.1":0.00763,"16.2":0.01145,"16.3":0.02672,"16.4":0.00763,"16.5":0.04962,"16.6":0.19467,"17.0":0.01527,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00331,"6.0-6.1":0.0011,"7.0-7.1":0.03306,"8.1-8.4":0.01763,"9.0-9.2":0.00441,"9.3":0.07935,"10.0-10.2":0,"10.3":0.10249,"11.0-11.2":0.06833,"11.3-11.4":0.00771,"12.0-12.1":0.01653,"12.2-12.5":0.216,"13.0-13.1":0.0022,"13.2":0,"13.3":0.00661,"13.4-13.7":0.00992,"14.0-14.4":0.07384,"14.5-14.8":0.19285,"15.0-15.1":0.02204,"15.2-15.3":0.03967,"15.4":0.02865,"15.5":0.07494,"15.6-15.7":0.82211,"16.0":0.27771,"16.1":0.52126,"16.2":0.29204,"16.3":0.50693,"16.4":0.07714,"16.5":0.28983,"16.6":6.37303,"17.0":0.68105,"17.1":0.00331},P:{"4":0.39817,"20":0.1123,"21":0.22461,"22":3.95105,"5.0-5.4":0.02042,"6.2-6.4":0.02042,"7.2-7.4":0.06126,"8.2":0,"9.2":0.01021,"10.1":0,"11.1-11.2":0.02042,"12.0":0.01021,"13.0":0.04084,"14.0":0.03063,"15.0":0.01021,"16.0":0.04084,"17.0":0.02042,"18.0":0.03063,"19.0":0.06126},I:{"0":0,"3":0.01011,"4":0.02358,"2.1":0,"2.2":0.01348,"2.3":0.02021,"4.1":0.02695,"4.2-4.3":0.03032,"4.4":0,"4.4.3-4.4.4":0.15497},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0.00382,"8":0.02672,"9":0.00382,"10":0.00382,"11":0.03817,"5.5":0},S:{"2.5":0.00618,_:"3.0-3.1"},J:{"7":0,"10":0.00618},N:{"10":0.01855,"11":0},L:{"0":66.91288},R:{_:"0"},M:{"0":0.22259},Q:{"13.1":0},O:{"0":0.01855},H:{"0":0.24585}};
    +module.exports={C:{"52":0.0772,"56":0.00386,"64":0.00386,"70":0.00386,"72":0.00386,"78":0.00386,"88":0.01158,"89":0.00386,"91":0.00386,"95":0.00386,"97":0.00386,"99":0.00772,"100":0.00386,"102":0.00772,"103":0.00386,"108":0.00772,"109":0.00386,"110":0.00386,"111":0.01158,"112":0.00386,"113":0.00386,"114":0.00386,"115":0.98044,"116":0.00772,"117":0.00772,"118":0.06176,"119":2.35846,"120":0.67164,"121":0.00386,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 57 58 59 60 61 62 63 65 66 67 68 69 71 73 74 75 76 77 79 80 81 82 83 84 85 86 87 90 92 93 94 96 98 101 104 105 106 107 122 123 3.5 3.6"},D:{"38":0.01544,"43":0.00386,"44":0.00386,"46":0.00386,"47":0.00386,"49":0.08106,"51":0.00386,"53":0.04246,"56":0.00386,"63":0.00386,"65":0.00772,"68":0.00386,"69":0.00386,"70":0.00772,"71":0.00386,"72":0.00386,"73":0.00772,"75":0.01158,"76":0.00772,"78":0.01544,"79":0.38986,"80":0.00772,"81":0.00772,"83":0.0193,"84":0.0386,"85":0.0193,"86":0.0193,"87":0.0772,"88":0.0193,"89":0.00772,"90":0.00772,"91":0.01158,"92":0.01158,"93":0.00772,"94":0.0386,"95":0.00772,"96":0.00772,"97":0.01158,"98":0.01158,"99":0.01544,"100":0.03088,"101":0.00386,"102":0.01544,"103":0.02702,"104":0.02702,"105":0.0579,"106":0.03474,"107":0.04246,"108":0.0579,"109":4.3425,"110":0.01544,"111":0.02702,"112":0.0193,"113":0.02702,"114":0.06562,"115":0.05018,"116":0.13124,"117":0.36284,"118":4.11862,"119":16.96856,"120":0.00386,"121":0.00386,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 45 48 50 52 54 55 57 58 59 60 61 62 64 66 67 74 77 122"},F:{"28":0.04632,"31":0.00386,"36":0.00772,"40":0.00386,"46":0.0386,"72":0.00386,"73":0.00772,"79":0.00386,"85":0.01158,"86":0.00386,"94":0.01544,"95":0.1158,"96":0.0193,"102":0.4246,"103":0.16598,"104":0.72182,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 32 33 34 35 37 38 39 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 74 75 76 77 78 80 81 82 83 84 87 88 89 90 91 92 93 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"14":0.00386,"17":0.00386,"18":0.00772,"85":0.02316,"89":0.00772,"92":0.01158,"97":0.00386,"108":0.01158,"109":0.03474,"112":0.00386,"113":0.00386,"114":0.01158,"115":0.00772,"116":0.04246,"117":0.0386,"118":0.4053,"119":1.93386,_:"12 13 15 16 79 80 81 83 84 86 87 88 90 91 93 94 95 96 98 99 100 101 102 103 104 105 106 107 110 111"},E:{"9":0.00772,"14":0.00386,"15":0.00386,_:"0 4 5 6 7 8 10 11 12 13 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 15.1 17.2","12.1":0.01158,"13.1":0.0193,"14.1":0.0193,"15.2-15.3":0.00386,"15.4":0.00386,"15.5":0.01544,"15.6":0.08106,"16.0":0.0193,"16.1":0.00772,"16.2":0.03474,"16.3":0.04632,"16.4":0.02316,"16.5":0.0386,"16.6":0.57128,"17.0":0.24704,"17.1":0.51724},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00158,"5.0-5.1":0.00158,"6.0-6.1":0.00394,"7.0-7.1":0.00552,"8.1-8.4":0.00079,"9.0-9.2":0.00631,"9.3":0.01971,"10.0-10.2":0.00158,"10.3":0.02838,"11.0-11.2":0.0134,"11.3-11.4":0.01182,"12.0-12.1":0.00709,"12.2-12.5":0.12927,"13.0-13.1":0.00315,"13.2":0.0134,"13.3":0.00788,"13.4-13.7":0.02286,"14.0-14.4":0.0607,"14.5-14.8":0.09853,"15.0-15.1":0.03862,"15.2-15.3":0.04729,"15.4":0.05281,"15.5":0.0741,"15.6-15.7":0.38939,"16.0":0.18287,"16.1":0.36654,"16.2":0.17578,"16.3":0.32949,"16.4":0.06779,"16.5":0.17499,"16.6-16.7":2.96618,"17.0":0.88836,"17.1":1.49215,"17.2":0.04257},P:{"4":0.65957,"20":0.04122,"21":0.14428,"22":0.26795,"23":3.11233,"5.0-5.4":0.04122,"6.2-6.4":0.01031,"7.2-7.4":0.05153,_:"8.2 9.2 10.1","11.1-11.2":0.03092,"12.0":0.01031,"13.0":0.03092,"14.0":0.02061,"15.0":0.01031,"16.0":0.03092,"17.0":0.02061,"18.0":0.02061,"19.0":0.05153},I:{"0":0.09773,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00007,"4.4":0,"4.4.3-4.4.4":0.00029},K:{"0":0.24556,_:"10 11 12 11.1 11.5 12.1"},A:{"7":0.00386,"8":0.0193,"9":0.00386,"10":0.00386,"11":0.08492,_:"6 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.03683},H:{"0":0},L:{"0":48.9333},R:{_:"0"},M:{"0":0.19031},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BB.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BB.js
    index 9014736e89911e..4e37660a32b9df 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BB.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BB.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.03425,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0.00489,"113":0.00489,"114":0.01468,"115":0.02447,"116":0.07829,"117":0.94435,"118":0.06361,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00489,"50":0.00489,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0.00489,"75":0,"76":0.01468,"77":0,"78":0,"79":0.08318,"80":0.02936,"81":0.00979,"83":0.00489,"84":0.03425,"85":0.01468,"86":0,"87":0.01468,"88":0,"89":0,"90":0,"91":0.00489,"92":0,"93":0.00979,"94":0,"95":0.00979,"96":0,"97":0,"98":0,"99":0.00489,"100":0.00489,"101":0,"102":0,"103":0.15168,"104":0.00489,"105":0,"106":0.00489,"107":0.00489,"108":0.00979,"109":0.38655,"110":0.00489,"111":0.00489,"112":0.03425,"113":0.01468,"114":0.10765,"115":0.25933,"116":11.17072,"117":2.45629,"118":0.01957,"119":0.00489,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00489,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.00489,"68":0,"69":0,"70":0,"71":0,"72":0.00979,"73":0,"74":0,"75":0,"76":0,"77":0.00489,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.00489,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00489,"96":0,"97":0,"98":0,"99":0.00489,"100":0.17126,"101":0.20061,"102":0.18104,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0.00979,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00489,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.03425,"110":0,"111":0,"112":0,"113":0,"114":0.00979,"115":0.0734,"116":1.93274,"117":1.35536},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00489,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.02447,"14.1":0.05382,"15.1":0.00979,"15.2-15.3":0.00489,"15.4":0.01468,"15.5":0.05382,"15.6":0.14679,"16.0":0.01468,"16.1":0.12722,"16.2":0.02936,"16.3":0.09786,"16.4":0.03425,"16.5":0.10275,"16.6":1.16943,"17.0":0.04404,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.01417,"6.0-6.1":0,"7.0-7.1":0.00607,"8.1-8.4":0,"9.0-9.2":0.00405,"9.3":0.20038,"10.0-10.2":0,"10.3":0.07691,"11.0-11.2":0.00607,"11.3-11.4":0.00607,"12.0-12.1":0,"12.2-12.5":0.5222,"13.0-13.1":0.00405,"13.2":0,"13.3":0,"13.4-13.7":0.01214,"14.0-14.4":0.02024,"14.5-14.8":0.06072,"15.0-15.1":0.0081,"15.2-15.3":0.01822,"15.4":0.02631,"15.5":0.0506,"15.6-15.7":1.94509,"16.0":0.44326,"16.1":0.75901,"16.2":0.26717,"16.3":0.7327,"16.4":0.06679,"16.5":0.7327,"16.6":12.40529,"17.0":1.35003,"17.1":0.01012},P:{"4":0.16132,"20":0.15057,"21":0.24736,"22":4.46322,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.18283,"8.2":0,"9.2":0.01075,"10.1":0,"11.1-11.2":0.01075,"12.0":0,"13.0":0.06453,"14.0":0.04302,"15.0":0.01075,"16.0":0.01075,"17.0":0.03226,"18.0":0.06453,"19.0":0.03226},I:{"0":0,"3":0,"4":0.04201,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.08401,"4.4":0,"4.4.3-4.4.4":1.17616},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0.00734,"11":0.00734,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":47.73852},R:{_:"0"},M:{"0":0.53113},Q:{"13.1":0},O:{"0":0.09193},H:{"0":0.13538}};
    +module.exports={C:{"88":0.00459,"97":0.00917,"102":0.00459,"108":0.00459,"112":0.00459,"113":0.00917,"115":0.05044,"117":0.00459,"118":0.13297,"119":1.22878,"120":0.24759,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 89 90 91 92 93 94 95 96 98 99 100 101 103 104 105 106 107 109 110 111 114 116 121 122 123 3.5 3.6"},D:{"49":0.00917,"50":0.01376,"65":0.00459,"69":0.00459,"70":0.00459,"73":0.00459,"74":0.00917,"76":0.00917,"77":0.00917,"79":0.02293,"80":0.08712,"81":0.00917,"83":0.06878,"84":0.00459,"85":0.02751,"87":0.01376,"89":0.00459,"93":0.03668,"95":0.00459,"96":0.00459,"98":0.00459,"99":0.01834,"100":0.00459,"102":0.00459,"103":0.30261,"105":0.00459,"106":0.00917,"107":0.00917,"108":0.00459,"109":1.69187,"110":0.00459,"111":0.02293,"112":0.05044,"113":0.00917,"114":0.22925,"115":0.02751,"116":0.19257,"117":0.38973,"118":7.87703,"119":20.09606,"120":0.01376,"121":0.02293,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 51 52 53 54 55 56 57 58 59 60 61 62 63 64 66 67 68 71 72 75 78 86 88 90 91 92 94 97 101 104 122"},F:{"28":0.00917,"89":0.00459,"95":0.00459,"102":0.37597,"103":0.04585,"104":0.51352,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00459,"16":0.01376,"18":0.00459,"92":0.00459,"106":0.00459,"109":0.02751,"112":0.00459,"113":0.00459,"114":0.00459,"115":0.00459,"116":0.00917,"117":0.1238,"118":1.30673,"119":5.99718,_:"13 14 15 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 107 108 110 111"},E:{"13":0.00459,"14":0.00917,_:"0 4 5 6 7 8 9 10 11 12 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.00459,"13.1":0.04127,"14.1":0.10087,"15.1":0.01834,"15.2-15.3":0.00459,"15.4":0.01834,"15.5":0.02293,"15.6":0.30261,"16.0":0.01834,"16.1":0.16048,"16.2":0.0917,"16.3":0.16965,"16.4":0.07336,"16.5":0.18799,"16.6":1.27922,"17.0":0.31637,"17.1":0.69692,"17.2":0.00917},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00288,"5.0-5.1":0.00288,"6.0-6.1":0.00721,"7.0-7.1":0.01009,"8.1-8.4":0.00144,"9.0-9.2":0.01154,"9.3":0.03605,"10.0-10.2":0.00288,"10.3":0.05191,"11.0-11.2":0.02451,"11.3-11.4":0.02163,"12.0-12.1":0.01298,"12.2-12.5":0.23649,"13.0-13.1":0.00577,"13.2":0.02451,"13.3":0.01442,"13.4-13.7":0.04182,"14.0-14.4":0.11104,"14.5-14.8":0.18025,"15.0-15.1":0.07066,"15.2-15.3":0.08652,"15.4":0.09661,"15.5":0.13555,"15.6-15.7":0.71236,"16.0":0.33455,"16.1":0.67054,"16.2":0.32157,"16.3":0.60276,"16.4":0.12401,"16.5":0.32013,"16.6-16.7":5.4263,"17.0":1.62515,"17.1":2.72973,"17.2":0.07787},P:{"4":0.24606,"20":0.08947,"21":0.15658,"22":0.27961,"23":5.43559,_:"5.0-5.4 8.2 9.2 10.1 11.1-11.2 12.0","6.2-6.4":0.01118,"7.2-7.4":0.10066,"13.0":0.01118,"14.0":0.02237,"15.0":0.01118,"16.0":0.01118,"17.0":0.2125,"18.0":0.03355,"19.0":0.04474},I:{"0":0.01078,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00003},K:{"0":0.14079,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.01376,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.10289},H:{"0":0},L:{"0":32.64491},R:{_:"0"},M:{"0":0.54692},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BD.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BD.js
    index 2339f9e9a7a773..12ee92f9bb699c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BD.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BD.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00828,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00552,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00276,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0.00276,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.01104,"103":0,"104":0,"105":0.00276,"106":0.00276,"107":0.00276,"108":0.00276,"109":0.00276,"110":0.00276,"111":0.00276,"112":0,"113":0.00276,"114":0.00276,"115":0.19313,"116":0.02207,"117":0.4911,"118":0.06346,"119":0.00276,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00276,"47":0,"48":0.00276,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00276,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00276,"70":0.00276,"71":0,"72":0,"73":0.00552,"74":0.00276,"75":0.00552,"76":0.00276,"77":0.00276,"78":0.00276,"79":0.00552,"80":0.00276,"81":0.00828,"83":0.00276,"84":0.00276,"85":0.01931,"86":0.00828,"87":0.00828,"88":0.00552,"89":0.00276,"90":0.00276,"91":0.00276,"92":0.00276,"93":0.00276,"94":0.00828,"95":0.00552,"96":0.00276,"97":0.00276,"98":0.00552,"99":0.00276,"100":0.00276,"101":0.00276,"102":0.00828,"103":0.01104,"104":0.00552,"105":0.01655,"106":0.03311,"107":0.03863,"108":0.04966,"109":0.49386,"110":0.01931,"111":0.02207,"112":0.03035,"113":0.0138,"114":0.03587,"115":0.05518,"116":3.1894,"117":0.90219,"118":0.01655,"119":0.00552,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00276,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00276,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0.00552,"62":0,"63":0.00276,"64":0.00276,"65":0,"66":0,"67":0,"68":0.00552,"69":0.0138,"70":0.0138,"71":0.03035,"72":0.28694,"73":0.06898,"74":0.00276,"75":0,"76":0.00276,"77":0.02759,"78":0.00552,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00552,"89":0,"90":0.00276,"91":0,"92":0,"93":0,"94":0.00276,"95":0.01104,"96":0,"97":0,"98":0,"99":0,"100":0.00828,"101":0.06622,"102":0.06346,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00276,"79":0,"80":0,"81":0,"83":0,"84":0.00276,"85":0.00276,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00552,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.00276,"104":0,"105":0,"106":0.00276,"107":0.00828,"108":0.00552,"109":0.00552,"110":0.00276,"111":0.00276,"112":0.00276,"113":0,"114":0.00276,"115":0.00552,"116":0.1683,"117":0.1214},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0.00276,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.00276,"15.6":0.00828,"16.0":0,"16.1":0.00276,"16.2":0.00276,"16.3":0.00276,"16.4":0.00276,"16.5":0.00552,"16.6":0.03311,"17.0":0.00552,"17.1":0},G:{"8":0,"3.2":0.00067,"4.0-4.1":0,"4.2-4.3":0.00067,"5.0-5.1":0.00168,"6.0-6.1":0,"7.0-7.1":0.07423,"8.1-8.4":0.00134,"9.0-9.2":0.00336,"9.3":0.02183,"10.0-10.2":0.00101,"10.3":0.01411,"11.0-11.2":0.00974,"11.3-11.4":0.00202,"12.0-12.1":0.00369,"12.2-12.5":0.1236,"13.0-13.1":0.00134,"13.2":0.00202,"13.3":0.19346,"13.4-13.7":0.01142,"14.0-14.4":0.03627,"14.5-14.8":0.03392,"15.0-15.1":0.02351,"15.2-15.3":0.02519,"15.4":0.03191,"15.5":0.05105,"15.6-15.7":0.441,"16.0":0.09405,"16.1":0.15618,"16.2":0.08229,"16.3":0.16794,"16.4":0.06214,"16.5":0.16324,"16.6":1.31966,"17.0":0.17029,"17.1":0.00034},P:{"4":0.17929,"20":0.03164,"21":0.07383,"22":0.50624,"5.0-5.4":0,"6.2-6.4":0.01055,"7.2-7.4":0.06328,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01055,"12.0":0,"13.0":0.01055,"14.0":0,"15.0":0,"16.0":0.02109,"17.0":0.03164,"18.0":0.01055,"19.0":0.02109},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00829,"4.4":0,"4.4.3-4.4.4":0.14654},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00276,"9":0,"10":0,"11":0.02759,"5.5":0},S:{"2.5":0.00724,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":81.11057},R:{_:"0"},M:{"0":0.09413},Q:{"13.1":0},O:{"0":3.38155},H:{"0":2.21427}};
    +module.exports={C:{"37":0.00257,"40":0.0077,"43":0.00257,"44":0.00257,"47":0.00257,"49":0.00257,"51":0.00257,"52":0.01798,"56":0.00257,"65":0.00257,"72":0.00257,"78":0.00257,"79":0.00257,"80":0.00514,"81":0.00514,"88":0.00257,"89":0.00257,"91":0.00257,"96":0.00257,"99":0.00257,"102":0.0077,"103":0.00257,"104":0.00257,"105":0.01541,"106":0.02311,"107":0.01284,"108":0.02054,"109":0.01541,"110":0.02568,"111":0.01541,"112":0.00514,"113":0.00514,"114":0.00257,"115":0.60605,"116":0.02054,"117":0.02311,"118":0.02311,"119":1.23778,"120":0.52901,"121":0.02054,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 39 41 42 45 46 48 50 53 54 55 57 58 59 60 61 62 63 64 66 67 68 69 70 71 73 74 75 76 77 82 83 84 85 86 87 90 92 93 94 95 97 98 100 101 122 123 3.5 3.6"},D:{"29":0.00257,"38":0.00257,"41":0.00514,"46":0.00514,"47":0.00257,"48":0.01027,"49":0.00257,"53":0.00514,"56":0.01027,"58":0.00257,"61":0.00257,"64":0.00257,"65":0.00257,"66":0.00257,"69":0.00257,"70":0.00514,"71":0.00257,"72":0.00514,"73":0.0077,"74":0.01284,"75":0.01284,"76":0.00257,"77":0.00514,"78":0.0077,"79":0.01027,"80":0.00514,"81":0.0077,"83":0.0077,"84":0.0077,"85":0.10529,"86":0.01798,"87":0.01027,"88":0.00257,"89":0.06163,"90":0.00514,"91":0.0077,"92":0.00514,"93":0.01027,"94":0.01798,"95":0.01284,"96":0.01541,"97":0.0077,"98":0.00514,"99":0.01027,"100":0.0077,"101":0.0077,"102":0.02568,"103":0.04109,"104":0.01541,"105":0.07704,"106":0.17462,"107":0.19774,"108":0.27478,"109":1.68204,"110":0.1361,"111":0.16178,"112":0.15922,"113":0.02311,"114":0.04622,"115":0.04109,"116":0.08474,"117":0.15408,"118":2.28809,"119":11.78455,"120":0.04622,"121":0.01798,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 30 31 32 33 34 35 36 37 39 40 42 43 44 45 50 51 52 54 55 57 59 60 62 63 67 68 122"},F:{"28":0.00257,"46":0.00257,"70":0.00257,"74":0.00514,"79":0.00514,"85":0.00257,"91":0.0077,"92":0.0077,"93":0.0077,"94":0.0077,"95":0.03082,"96":0.0077,"97":0.00514,"102":0.09758,"103":0.05393,"104":0.24396,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 71 72 73 75 76 77 78 80 81 82 83 84 86 87 88 89 90 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00514,"14":0.00257,"16":0.00257,"17":0.00514,"18":0.01027,"84":0.00257,"85":0.00257,"89":0.00257,"92":0.01798,"96":0.00257,"99":0.00514,"100":0.00257,"101":0.00257,"103":0.00514,"104":0.00257,"105":0.00514,"106":0.01798,"107":0.02568,"108":0.03595,"109":0.02825,"110":0.02825,"111":0.01798,"112":0.00514,"113":0.00257,"114":0.00257,"115":0.00257,"116":0.00514,"117":0.01027,"118":0.13354,"119":0.78324,_:"13 15 79 80 81 83 86 87 88 90 91 93 94 95 97 98 102"},E:{"7":0.00514,"14":0.0077,_:"0 4 5 6 8 9 10 11 12 13 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1","13.1":0.00514,"14.1":0.01027,"15.1":0.00257,"15.2-15.3":0.00514,"15.4":0.01284,"15.5":0.00257,"15.6":0.03852,"16.0":0.00514,"16.1":0.0077,"16.2":0.00514,"16.3":0.01541,"16.4":0.0077,"16.5":0.0077,"16.6":0.08988,"17.0":0.03338,"17.1":0.0719,"17.2":0.00257},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00058,"5.0-5.1":0.00058,"6.0-6.1":0.00146,"7.0-7.1":0.00204,"8.1-8.4":0.00029,"9.0-9.2":0.00234,"9.3":0.0073,"10.0-10.2":0.00058,"10.3":0.01051,"11.0-11.2":0.00496,"11.3-11.4":0.00438,"12.0-12.1":0.00263,"12.2-12.5":0.04789,"13.0-13.1":0.00117,"13.2":0.00496,"13.3":0.00292,"13.4-13.7":0.00847,"14.0-14.4":0.02249,"14.5-14.8":0.0365,"15.0-15.1":0.01431,"15.2-15.3":0.01752,"15.4":0.01957,"15.5":0.02745,"15.6-15.7":0.14427,"16.0":0.06775,"16.1":0.1358,"16.2":0.06512,"16.3":0.12207,"16.4":0.02512,"16.5":0.06483,"16.6-16.7":1.09894,"17.0":0.32913,"17.1":0.55283,"17.2":0.01577},P:{"4":0.1672,"20":0.03135,"21":0.0418,"22":0.13585,"23":0.47024,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 11.1-11.2 12.0 14.0 15.0","7.2-7.4":0.0627,"13.0":0.01045,"16.0":0.01045,"17.0":0.03135,"18.0":0.01045,"19.0":0.03135},I:{"0":0.08133,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00025},K:{"0":2.20333,_:"10 11 12 11.1 11.5 12.1"},A:{"7":0.00266,"8":0.01063,"9":0.00266,"10":0.00266,"11":0.13291,_:"6 5.5"},N:{_:"10 11"},S:{"2.5":0.00743,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":3.73036},H:{"0":0.13},L:{"0":66.76987},R:{_:"0"},M:{"0":0.10403},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BE.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BE.js
    index 5a3033f05e7946..ebd2d426c6c36b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BE.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BE.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00617,"49":0,"50":0,"51":0,"52":0.01234,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00617,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.03085,"79":0,"80":0,"81":0,"82":0,"83":0.01234,"84":0,"85":0,"86":0,"87":0.04936,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.00617,"95":0,"96":0,"97":0,"98":0.00617,"99":0,"100":0,"101":0,"102":0.07404,"103":0,"104":0.00617,"105":0.00617,"106":0,"107":0,"108":0.00617,"109":0.00617,"110":0.00617,"111":0,"112":0.00617,"113":0.01851,"114":0.00617,"115":0.1851,"116":0.1234,"117":1.73377,"118":0.17276,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00617,"35":0,"36":0,"37":0,"38":0.00617,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.03085,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.01851,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0.04319,"75":0.04319,"76":0.04319,"77":0.04319,"78":0.70955,"79":0.93784,"80":0.00617,"81":0.00617,"83":0.06787,"84":0.00617,"85":0.00617,"86":0,"87":0.01234,"88":0.00617,"89":0.01234,"90":0.00617,"91":0.00617,"92":0,"93":0.03702,"94":0.00617,"95":0.09255,"96":0.01234,"97":0.00617,"98":0.00617,"99":0.00617,"100":0.00617,"101":0.00617,"102":0.00617,"103":0.08021,"104":0.01234,"105":0.03702,"106":0.01851,"107":0.01851,"108":0.03702,"109":0.73423,"110":0.01234,"111":0.02468,"112":0.04319,"113":0.11106,"114":0.4319,"115":0.86997,"116":15.58542,"117":3.49839,"118":0.01234,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00617,"73":0,"74":0,"75":0,"76":0,"77":0.01234,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01234,"96":0,"97":0,"98":0,"99":0.01234,"100":0.08638,"101":0.22829,"102":0.43807,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00617,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00617,"93":0,"94":0,"95":0.00617,"96":0,"97":0,"98":0,"99":0.00617,"100":0,"101":0.00617,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00617,"108":0.01234,"109":0.08638,"110":0.01234,"111":0.00617,"112":0.01234,"113":0.01234,"114":0.10489,"115":0.31467,"116":4.10305,"117":2.11014},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00617,"14":0.03702,"15":0.00617,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.02468,"13.1":0.10489,"14.1":0.1234,"15.1":0.01851,"15.2-15.3":0.01851,"15.4":0.04319,"15.5":0.05553,"15.6":0.37637,"16.0":0.03085,"16.1":0.08021,"16.2":0.08021,"16.3":0.20978,"16.4":0.07404,"16.5":0.26531,"16.6":1.62271,"17.0":0.08021,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.0143,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.04576,"10.0-10.2":0,"10.3":0.08007,"11.0-11.2":0.02288,"11.3-11.4":0.03432,"12.0-12.1":0.01144,"12.2-12.5":0.28598,"13.0-13.1":0,"13.2":0,"13.3":0.05148,"13.4-13.7":0.0286,"14.0-14.4":0.13155,"14.5-14.8":0.2059,"15.0-15.1":0.07721,"15.2-15.3":0.10009,"15.4":0.12869,"15.5":0.18875,"15.6-15.7":1.75019,"16.0":1.00951,"16.1":1.80453,"16.2":0.74641,"16.3":1.56716,"16.4":0.21734,"16.5":0.73211,"16.6":17.26455,"17.0":1.73589,"17.1":0.00286},P:{"4":0.02092,"20":0.03138,"21":0.11506,"22":2.9498,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.01046,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0.01046,"14.0":0,"15.0":0,"16.0":0,"17.0":0.01046,"18.0":0.01046,"19.0":0.03138},I:{"0":0,"3":0,"4":0.01099,"2.1":0,"2.2":0.00733,"2.3":0.01099,"4.1":0.01832,"4.2-4.3":0.01832,"4.4":0,"4.4.3-4.4.4":0.10257},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01234,"9":0,"10":0,"11":0.04936,"5.5":0},S:{"2.5":0.00383,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":28.12061},R:{_:"0"},M:{"0":0.3064},Q:{"13.1":0},O:{"0":0.02298},H:{"0":0.13054}};
    +module.exports={C:{"44":0.00541,"47":0.00541,"48":0.01082,"52":0.02163,"68":0.00541,"78":0.05949,"83":0.01082,"87":0.0649,"88":0.00541,"91":0.00541,"96":0.00541,"102":0.01622,"107":0.00541,"108":0.00541,"109":0.00541,"110":0.01082,"111":0.00541,"112":0.00541,"113":0.01622,"114":0.00541,"115":0.37856,"116":0.01082,"117":0.02163,"118":0.07571,"119":2.46064,"120":0.71926,"121":0.00541,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 45 46 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 79 80 81 82 84 85 86 89 90 92 93 94 95 97 98 99 100 101 103 104 105 106 122 123 3.5 3.6"},D:{"38":0.00541,"49":0.03245,"66":0.03245,"67":0.00541,"70":0.00541,"72":0.00541,"74":0.07571,"75":0.07571,"76":0.08112,"77":0.07571,"78":1.24925,"79":1.64944,"80":0.00541,"81":0.00541,"83":0.10275,"84":0.00541,"85":0.00541,"86":0.00541,"87":0.02163,"88":0.00541,"89":0.01622,"90":0.01082,"91":0.00541,"92":0.00541,"93":0.01622,"94":0.00541,"95":0.14602,"96":0.01082,"97":0.00541,"98":0.00541,"99":0.00541,"100":0.01082,"101":0.00541,"102":0.00541,"103":0.08653,"104":0.00541,"105":0.01622,"106":0.01622,"107":0.03786,"108":0.04867,"109":0.93018,"110":0.02704,"111":0.03786,"112":0.04326,"113":0.05408,"114":0.15683,"115":0.08653,"116":0.36234,"117":0.48131,"118":5.64054,"119":19.50125,"120":0.01622,"121":0.00541,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 47 48 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 68 69 71 73 122"},F:{"46":0.00541,"94":0.00541,"95":0.01622,"100":0.00541,"102":0.57866,"103":0.10816,"104":0.5408,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 96 97 98 99 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.00541,"92":0.00541,"102":0.00541,"104":0.00541,"106":0.00541,"107":0.01622,"108":0.01082,"109":0.1352,"110":0.00541,"111":0.00541,"112":0.00541,"113":0.02163,"114":0.02704,"115":0.02704,"116":0.0703,"117":0.14061,"118":1.27629,"119":6.88979,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 103 105"},E:{"13":0.00541,"14":0.04867,"15":0.01082,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1","11.1":0.00541,"12.1":0.02704,"13.1":0.24877,"14.1":0.21091,"15.1":0.04867,"15.2-15.3":0.0649,"15.4":0.09734,"15.5":0.1352,"15.6":0.85987,"16.0":0.0703,"16.1":0.23254,"16.2":0.2055,"16.3":0.49213,"16.4":0.22714,"16.5":0.44886,"16.6":2.26595,"17.0":0.77334,"17.1":1.68189,"17.2":0.02163},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00441,"5.0-5.1":0.00441,"6.0-6.1":0.01103,"7.0-7.1":0.01544,"8.1-8.4":0.00221,"9.0-9.2":0.01764,"9.3":0.05514,"10.0-10.2":0.00441,"10.3":0.0794,"11.0-11.2":0.03749,"11.3-11.4":0.03308,"12.0-12.1":0.01985,"12.2-12.5":0.36171,"13.0-13.1":0.00882,"13.2":0.03749,"13.3":0.02206,"13.4-13.7":0.06396,"14.0-14.4":0.16983,"14.5-14.8":0.27569,"15.0-15.1":0.10807,"15.2-15.3":0.13233,"15.4":0.14777,"15.5":0.20732,"15.6-15.7":1.08955,"16.0":0.51169,"16.1":1.02558,"16.2":0.49184,"16.3":0.92192,"16.4":0.18968,"16.5":0.48963,"16.6-16.7":8.29952,"17.0":2.48566,"17.1":4.17512,"17.2":0.1191},P:{"4":0.03195,"20":0.03195,"21":0.07455,"22":0.19169,"23":2.98183,_:"5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 14.0 15.0","13.0":0.01065,"16.0":0.01065,"17.0":0.01065,"18.0":0.01065,"19.0":0.0213},I:{"0":0.06398,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00005,"4.4":0,"4.4.3-4.4.4":0.00019},K:{"0":0.13698,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00541,"11":0.05408,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.02297},H:{"0":0.01},L:{"0":19.80576},R:{_:"0"},M:{"0":0.38581},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BF.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BF.js
    index c933c974f3c268..eff31549948978 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BF.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BF.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00273,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00273,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.03007,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00547,"100":0,"101":0,"102":0.0082,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00273,"110":0,"111":0.00273,"112":0.00273,"113":0.00273,"114":0.05468,"115":0.19411,"116":0.04374,"117":0.54407,"118":0.06835,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00547,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00273,"65":0,"66":0,"67":0,"68":0,"69":0.00547,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.00547,"80":0,"81":0.0164,"83":0,"84":0,"85":0,"86":0,"87":0.00273,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0.00547,"94":0.02734,"95":0.00273,"96":0.00273,"97":0.00547,"98":0,"99":0.00273,"100":0.00273,"101":0,"102":0,"103":0.00547,"104":0.00273,"105":0.01367,"106":0.01094,"107":0.00273,"108":0.01914,"109":0.45384,"110":0.00547,"111":0.00547,"112":0.01914,"113":0.00547,"114":0.01914,"115":0.04374,"116":1.922,"117":0.38003,"118":0,"119":0.00547,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00273,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.03554,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00273,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00273,"60":0.07108,"62":0.00273,"63":0.01094,"64":0.00273,"65":0,"66":0.01367,"67":0.03554,"68":0.00273,"69":0.04921,"70":0.03554,"71":0.06015,"72":0.19685,"73":0.03007,"74":0,"75":0,"76":0,"77":0.0082,"78":0,"79":0.01094,"80":0,"81":0,"82":0,"83":0,"84":0.00273,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.00273,"91":0,"92":0,"93":0,"94":0,"95":0.01367,"96":0,"97":0,"98":0,"99":0,"100":0.00273,"101":0.13123,"102":0.1449,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00273},B:{"12":0.00273,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00547,"79":0,"80":0,"81":0,"83":0,"84":0.00273,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.00273,"91":0,"92":0.0082,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0.00273,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00547,"109":0.05195,"110":0,"111":0,"112":0,"113":0.00273,"114":0.04648,"115":0.06015,"116":0.5632,"117":0.39916},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00547,"14.1":0.00273,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.00273,"15.6":0.01094,"16.0":0,"16.1":0,"16.2":0,"16.3":0.0082,"16.4":0.01094,"16.5":0.01094,"16.6":0.04374,"17.0":0.00273,"17.1":0},G:{"8":0.00475,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00136,"6.0-6.1":0,"7.0-7.1":0.24153,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.01832,"10.0-10.2":0,"10.3":0.01221,"11.0-11.2":0.00543,"11.3-11.4":0.00814,"12.0-12.1":0.48713,"12.2-12.5":0.51698,"13.0-13.1":0.00204,"13.2":0,"13.3":0.00407,"13.4-13.7":0.0095,"14.0-14.4":0.13705,"14.5-14.8":0.03596,"15.0-15.1":0.10652,"15.2-15.3":0.04681,"15.4":0.019,"15.5":0.04342,"15.6-15.7":0.65064,"16.0":0.23678,"16.1":0.31819,"16.2":0.12076,"16.3":0.19132,"16.4":0.26731,"16.5":0.53598,"16.6":1.86846,"17.0":0.82025,"17.1":0},P:{"4":0.02093,"20":0.07326,"21":0.07326,"22":0.57561,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.31397,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0.01047,"15.0":0.01047,"16.0":0,"17.0":0.01047,"18.0":0.02093,"19.0":0.0314},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00152,"4.4":0,"4.4.3-4.4.4":0.12949},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.0082,"5.5":0},S:{"2.5":0.00727,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":80.29328},R:{_:"0"},M:{"0":0.10899},Q:{"13.1":0.11626},O:{"0":0.46502},H:{"0":3.50828}};
    +module.exports={C:{"40":0.00226,"43":0.00453,"45":0.00226,"47":0.00226,"48":0.00453,"50":0.00226,"52":0.00679,"56":0.00226,"57":0.00453,"65":0.00226,"72":0.00905,"78":0.00453,"85":0.19914,"87":0.01132,"97":0.00226,"102":0.00226,"104":0.00679,"107":0.00226,"108":0.00226,"109":0.00453,"111":0.07242,"112":0.00226,"113":0.00453,"114":0.00679,"115":0.96404,"116":0.00226,"117":0.00453,"118":0.12447,"119":1.53205,"120":0.69022,"121":0.00226,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 41 42 44 46 49 51 53 54 55 58 59 60 61 62 63 64 66 67 68 69 70 71 73 74 75 76 77 79 80 81 82 83 84 86 88 89 90 91 92 93 94 95 96 98 99 100 101 103 105 106 110 122 123 3.5 3.6"},D:{"11":0.00679,"27":0.00226,"49":0.00453,"50":0.00453,"56":0.00226,"59":0.00226,"60":0.00679,"61":0.00226,"62":0.00226,"64":0.00226,"68":0.00226,"70":0.00226,"71":0.00226,"72":0.00226,"73":0.00226,"74":0.00226,"75":0.02263,"76":0.00453,"79":0.02263,"80":0.00226,"81":0.00226,"83":0.00226,"86":0.00453,"87":0.00905,"88":0.00226,"89":0.00226,"93":0.02942,"95":0.00453,"97":0.01584,"98":0.00453,"99":0.02489,"102":0.00226,"103":0.01584,"104":0.00679,"105":0.0181,"106":0.00453,"107":0.00226,"108":0.00679,"109":1.62936,"110":0.00226,"111":0.01132,"112":0.06789,"113":0.00679,"114":0.02263,"115":0.0181,"116":0.18104,"117":0.10636,"118":1.53658,"119":7.03567,"120":0.00453,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 51 52 53 54 55 57 58 63 65 66 67 69 77 78 84 85 90 91 92 94 96 100 101 121 122"},F:{"40":0.00226,"46":0.00226,"79":0.04526,"84":0.00905,"93":0.00226,"95":0.10862,"99":0.00226,"101":0.00226,"102":0.00905,"103":0.1833,"104":0.54312,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 85 86 87 88 89 90 91 92 94 96 97 98 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00453,"13":0.00226,"16":0.00226,"17":0.00226,"18":0.02489,"84":0.00679,"85":0.00453,"89":0.00453,"92":0.03847,"98":0.00453,"100":0.00226,"107":0.00226,"108":0.00226,"109":0.0181,"110":0.00453,"111":0.01132,"113":0.00226,"114":0.00905,"115":0.01358,"116":0.043,"117":0.15615,"118":0.47749,"119":2.5504,_:"14 15 79 80 81 83 86 87 88 90 91 93 94 95 96 97 99 101 102 103 104 105 106 112"},E:{_:"0 4 5 6 7 8 9 10 11 12 13 14 15 3.1 3.2 6.1 7.1 9.1 10.1 15.1 15.2-15.3 15.4 16.0 17.2","5.1":0.00905,"11.1":0.00226,"12.1":0.00226,"13.1":0.14936,"14.1":0.00453,"15.5":0.00453,"15.6":0.02037,"16.1":0.00453,"16.2":0.00226,"16.3":0.03395,"16.4":0.00905,"16.5":0.00453,"16.6":0.03168,"17.0":0.04752,"17.1":0.08599},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00069,"5.0-5.1":0.00069,"6.0-6.1":0.00173,"7.0-7.1":0.00243,"8.1-8.4":0.00035,"9.0-9.2":0.00277,"9.3":0.00867,"10.0-10.2":0.00069,"10.3":0.01248,"11.0-11.2":0.00589,"11.3-11.4":0.0052,"12.0-12.1":0.00312,"12.2-12.5":0.05685,"13.0-13.1":0.00139,"13.2":0.00589,"13.3":0.00347,"13.4-13.7":0.01005,"14.0-14.4":0.02669,"14.5-14.8":0.04333,"15.0-15.1":0.01698,"15.2-15.3":0.0208,"15.4":0.02322,"15.5":0.03258,"15.6-15.7":0.17123,"16.0":0.08042,"16.1":0.16118,"16.2":0.0773,"16.3":0.14489,"16.4":0.02981,"16.5":0.07695,"16.6-16.7":1.30432,"17.0":0.39064,"17.1":0.65615,"17.2":0.01872},P:{"4":0.02148,"20":0.02148,"21":0.03222,"22":0.20405,"23":0.3544,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 15.0 16.0","7.2-7.4":0.02148,"14.0":0.01074,"17.0":0.01074,"18.0":0.01074,"19.0":0.03222},I:{"0":0.05389,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00004,"4.4":0,"4.4.3-4.4.4":0.00016},K:{"0":2.72719,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.0181,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.00774,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.2089},H:{"0":1.18},L:{"0":71.53209},R:{_:"0"},M:{"0":0.147},Q:{"13.1":0.0619}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BG.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BG.js
    index 71448df33a7437..72b52123fd188b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BG.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BG.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.21246,"46":0,"47":0,"48":0.02854,"49":0,"50":0,"51":0,"52":0.03488,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.00317,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.01268,"67":0,"68":0.00317,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00634,"79":0,"80":0.00634,"81":0,"82":0,"83":0.00634,"84":0.00634,"85":0,"86":0,"87":0,"88":0.00317,"89":0,"90":0.00317,"91":0.00317,"92":0,"93":0,"94":0,"95":0,"96":0.00317,"97":0,"98":0.00317,"99":0.00317,"100":0,"101":0,"102":0.03805,"103":0.00317,"104":0.00317,"105":0,"106":0,"107":0.00317,"108":0.00634,"109":0.00317,"110":0.00317,"111":0.00317,"112":0.00634,"113":0.00634,"114":0.00951,"115":0.28222,"116":0.05708,"117":0.75153,"118":0.06025,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00317,"34":0,"35":0,"36":0,"37":0,"38":0.00317,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.0222,"50":0,"51":0.00317,"52":0,"53":0.00317,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0.00317,"62":0,"63":0.00317,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0.00317,"72":0,"73":0,"74":0,"75":0.00951,"76":0.00317,"77":0.00951,"78":0.00951,"79":0.0222,"80":0.00634,"81":0.01268,"83":0.00317,"84":0.00317,"85":0.00634,"86":0.00634,"87":0.01268,"88":0.00317,"89":0.00317,"90":0.01268,"91":0.01268,"92":0.00317,"93":0.00634,"94":0.00317,"95":0.00634,"96":0.00317,"97":0.00317,"98":0.00317,"99":0.00951,"100":0.00634,"101":0,"102":0.00951,"103":0.01268,"104":0.00634,"105":0.00634,"106":0.0222,"107":0.01586,"108":0.01586,"109":0.94813,"110":0.00634,"111":0.00951,"112":0.01268,"113":0.01268,"114":0.04757,"115":0.10464,"116":3.97009,"117":1.01155,"118":0.00317,"119":0.00634,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00634,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00317,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.00634,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00317,"70":0,"71":0,"72":0.00634,"73":0,"74":0,"75":0.00317,"76":0,"77":0.01268,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00317,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.03488,"96":0,"97":0,"98":0,"99":0.00634,"100":0.03171,"101":0.15221,"102":0.16489,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00317,"79":0,"80":0,"81":0.00634,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.00317,"90":0.00317,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.00317,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.02537,"110":0.00317,"111":0.00317,"112":0,"113":0.00317,"114":0.00634,"115":0.01903,"116":0.44711,"117":0.32344},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00317,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00317,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00634,"14.1":0.01268,"15.1":0,"15.2-15.3":0,"15.4":0.00317,"15.5":0.00634,"15.6":0.0222,"16.0":0.00317,"16.1":0.00634,"16.2":0.00634,"16.3":0.01586,"16.4":0.00634,"16.5":0.01903,"16.6":0.09513,"17.0":0.00951,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00831,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.01108,"10.0-10.2":0,"10.3":0.03601,"11.0-11.2":0.02077,"11.3-11.4":0.00277,"12.0-12.1":0.00692,"12.2-12.5":0.16758,"13.0-13.1":0.00277,"13.2":0.00138,"13.3":0.44872,"13.4-13.7":0.02631,"14.0-14.4":0.06925,"14.5-14.8":0.18835,"15.0-15.1":0.04293,"15.2-15.3":0.05263,"15.4":0.06786,"15.5":0.09971,"15.6-15.7":0.89605,"16.0":0.4778,"16.1":0.69246,"16.2":0.36008,"16.3":0.66892,"16.4":0.14819,"16.5":0.45979,"16.6":7.80543,"17.0":0.93759,"17.1":0},P:{"4":0.10292,"20":0.11321,"21":0.21613,"22":2.91268,"5.0-5.4":0.01029,"6.2-6.4":0.01029,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.02058,"12.0":0,"13.0":0.02058,"14.0":0.02058,"15.0":0.01029,"16.0":0.03088,"17.0":0.03088,"18.0":0.03088,"19.0":0.08234},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.04192,"4.2-4.3":0.06987,"4.4":0,"4.4.3-4.4.4":0.20261},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00634,"9":0,"10":0,"11":0.03805,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":70.68201},R:{_:"0"},M:{"0":0.20487},Q:{"13.1":0},O:{"0":0.02049},H:{"0":0.30387}};
    +module.exports={C:{"45":0.27116,"48":0.15682,"52":0.09801,"56":0.00327,"60":0.00327,"65":0.00327,"66":0.01634,"67":0.00327,"68":0.00653,"72":0.00653,"75":0.00327,"78":0.02614,"80":0.00653,"81":0.00327,"83":0.01634,"84":0.01307,"85":0.00327,"87":0.00327,"88":0.0196,"89":0.00327,"90":0.00327,"91":0.00653,"94":0.00327,"95":0.00327,"96":0.00653,"97":0.00327,"98":0.00327,"99":0.01307,"100":0.00653,"102":0.01634,"103":0.0098,"104":0.0098,"105":0.00653,"106":0.00653,"107":0.00653,"108":0.02614,"109":0.00653,"110":0.00327,"111":0.0098,"112":0.01307,"113":0.01634,"114":0.01307,"115":1.0193,"116":0.00653,"117":0.01634,"118":0.08821,"119":2.12682,"120":0.6436,"121":0.00327,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 49 50 51 53 54 55 57 58 59 61 62 63 64 69 70 71 73 74 76 77 79 82 86 92 93 101 122 123 3.5 3.6"},D:{"26":0.00327,"33":0.01307,"38":0.00653,"41":0.00327,"47":0.00327,"49":0.06534,"53":0.00327,"56":0.00327,"63":0.00327,"67":0.00327,"69":0.00327,"70":0.00327,"71":0.00327,"73":0.00327,"74":0.00327,"75":0.00327,"76":0.00327,"77":0.00327,"78":0.00327,"79":0.07187,"80":0.00327,"81":0.0098,"83":0.01307,"84":0.00327,"85":0.0196,"86":0.0098,"87":0.03267,"88":0.0098,"89":0.00327,"90":0.00327,"91":0.00653,"92":0.00327,"93":0.13721,"94":0.00653,"95":0.0098,"96":0.00327,"97":0.00653,"98":0.00653,"99":0.02614,"100":0.0098,"101":0.00327,"102":0.0196,"103":0.04247,"104":0.0098,"105":0.02287,"106":0.0196,"107":0.01307,"108":0.03594,"109":3.23433,"110":0.0098,"111":0.0294,"112":0.0294,"113":0.0196,"114":0.0392,"115":0.05227,"116":0.10781,"117":0.24829,"118":3.37154,"119":14.06444,"120":0.00653,"121":0.00327,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 27 28 29 30 31 32 34 35 36 37 39 40 42 43 44 45 46 48 50 51 52 54 55 57 58 59 60 61 62 64 65 66 68 72 122"},F:{"28":0.0196,"36":0.00653,"40":0.00327,"46":0.01634,"79":0.00653,"81":0.00327,"83":0.0098,"85":0.0098,"86":0.00327,"89":0.00327,"94":0.00327,"95":0.12088,"96":0.00653,"99":0.00327,"101":0.00327,"102":0.23196,"103":0.15682,"104":0.51292,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 82 84 87 88 90 91 92 93 97 98 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.00653,"85":0.00327,"92":0.00327,"106":0.00327,"107":0.00327,"108":0.0098,"109":0.09148,"110":0.00653,"111":0.00653,"112":0.00327,"113":0.00653,"114":0.00653,"115":0.00653,"116":0.0196,"117":0.04574,"118":0.45085,"119":2.21176,_:"12 13 14 15 16 17 79 80 81 83 84 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105"},E:{"14":0.01634,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1","5.1":0.00327,"12.1":0.00653,"13.1":0.0196,"14.1":0.0392,"15.1":0.00327,"15.2-15.3":0.00327,"15.4":0.00327,"15.5":0.00653,"15.6":0.07187,"16.0":0.00653,"16.1":0.01634,"16.2":0.01307,"16.3":0.0294,"16.4":0.0196,"16.5":0.0294,"16.6":0.17969,"17.0":0.08821,"17.1":0.12741,"17.2":0.00327},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00171,"5.0-5.1":0.00171,"6.0-6.1":0.00427,"7.0-7.1":0.00597,"8.1-8.4":0.00085,"9.0-9.2":0.00682,"9.3":0.02133,"10.0-10.2":0.00171,"10.3":0.03071,"11.0-11.2":0.0145,"11.3-11.4":0.0128,"12.0-12.1":0.00768,"12.2-12.5":0.1399,"13.0-13.1":0.00341,"13.2":0.0145,"13.3":0.00853,"13.4-13.7":0.02474,"14.0-14.4":0.06569,"14.5-14.8":0.10663,"15.0-15.1":0.0418,"15.2-15.3":0.05118,"15.4":0.05716,"15.5":0.08019,"15.6-15.7":0.42142,"16.0":0.19791,"16.1":0.39668,"16.2":0.19023,"16.3":0.35658,"16.4":0.07336,"16.5":0.18938,"16.6-16.7":3.21011,"17.0":0.96141,"17.1":1.61486,"17.2":0.04607},P:{"4":0.09245,"20":0.08218,"21":0.13353,"22":0.44169,"23":2.79396,"5.0-5.4":0.01027,"6.2-6.4":0.02054,"7.2-7.4":0.03082,_:"8.2 9.2 10.1 12.0","11.1-11.2":0.01027,"13.0":0.01027,"14.0":0.02054,"15.0":0.01027,"16.0":0.03082,"17.0":0.02054,"18.0":0.03082,"19.0":0.0719},I:{"0":0.19428,"3":0.00002,"4":0.00004,"2.1":0,"2.2":0.00004,"2.3":0,"4.1":0.00002,"4.2-4.3":0.00014,"4.4":0,"4.4.3-4.4.4":0.00059},K:{"0":0.28279,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.09801,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.0202},H:{"0":0},L:{"0":55.08095},R:{_:"0"},M:{"0":0.18179},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BH.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BH.js
    index 4e1f0cfdd4bd21..0fc4a8d2e4b2ac 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BH.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BH.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.01137,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00569,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.04833,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00569,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0.01137,"114":0.00284,"115":0.0199,"116":0.01706,"117":0.20754,"118":0.02274,"119":0.00284,"120":0.00284,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00284,"57":0,"58":0.00853,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00284,"66":0,"67":0,"68":0.00569,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0.00284,"76":0.00284,"77":0,"78":0.00284,"79":0.02274,"80":0.04549,"81":0.00284,"83":0,"84":0,"85":0,"86":0.02559,"87":0.01137,"88":0.00284,"89":0.00284,"90":0.02274,"91":0.00284,"92":0,"93":0.00284,"94":0.00569,"95":0.00284,"96":0.00284,"97":0.00569,"98":0.00569,"99":0.00853,"100":0,"101":0,"102":0.00569,"103":0.03696,"104":0,"105":0.00569,"106":0.00569,"107":0.00569,"108":0.00853,"109":0.24166,"110":0.00569,"111":0.00853,"112":0.00853,"113":0.01706,"114":0.06539,"115":0.09951,"116":3.68169,"117":1.09171,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00853,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00569,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00569,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00569,"70":0,"71":0,"72":0.00569,"73":0,"74":0.00284,"75":0,"76":0.00284,"77":0.04833,"78":0.00284,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0.00569,"94":0,"95":0.00284,"96":0,"97":0,"98":0,"99":0.01706,"100":0.0398,"101":0.04265,"102":0.02559,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00284,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00569,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00569,"101":0,"102":0,"103":0,"104":0.00284,"105":0,"106":0,"107":0,"108":0.00569,"109":0.03696,"110":0.00284,"111":0.00284,"112":0.00284,"113":0.00853,"114":0.01137,"115":0.07676,"116":0.46341,"117":0.41792},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00284,"14":0.01422,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00284,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00569,"14.1":0.0199,"15.1":0.00284,"15.2-15.3":0.00569,"15.4":0.00853,"15.5":0.01422,"15.6":0.05402,"16.0":0.00569,"16.1":0.0199,"16.2":0.01422,"16.3":0.0398,"16.4":0.01706,"16.5":0.0597,"16.6":0.26156,"17.0":0.0398,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00912,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.05242,"10.0-10.2":0,"10.3":0.02279,"11.0-11.2":0.0114,"11.3-11.4":0.00228,"12.0-12.1":0.01823,"12.2-12.5":0.19602,"13.0-13.1":0.03875,"13.2":0.00456,"13.3":1.03479,"13.4-13.7":0.03875,"14.0-14.4":0.13676,"14.5-14.8":0.24388,"15.0-15.1":0.07977,"15.2-15.3":0.10257,"15.4":0.17322,"15.5":0.27579,"15.6-15.7":1.49292,"16.0":0.74988,"16.1":0.93222,"16.2":0.47181,"16.3":1.05986,"16.4":0.33277,"16.5":1.00971,"16.6":12.1667,"17.0":1.91914,"17.1":0.00456},P:{"4":0.16208,"20":0.06078,"21":0.18234,"22":3.09984,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.07091,"8.2":0,"9.2":0.05065,"10.1":0,"11.1-11.2":0.1013,"12.0":0.01013,"13.0":0.01013,"14.0":0.02026,"15.0":0.01013,"16.0":0.04052,"17.0":0.11143,"18.0":0.04052,"19.0":0.08104},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.1498},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01706,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":57.64222},R:{_:"0"},M:{"0":0.5654},Q:{"13.1":0},O:{"0":3.08467},H:{"0":1.36193}};
    +module.exports={C:{"34":0.00314,"52":0.00628,"68":0.00314,"78":0.00314,"80":0.00314,"81":0.00314,"105":0.01255,"108":0.01255,"114":0.00628,"115":0.091,"117":0.00314,"118":0.02197,"119":0.51463,"120":0.14121,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 79 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 106 107 109 110 111 112 113 116 121 122 123 3.5 3.6"},D:{"11":0.00314,"38":0.00314,"49":0.00314,"50":0.00314,"53":0.00314,"55":0.00314,"56":0.00314,"58":0.09728,"63":0.00314,"65":0.00628,"66":0.00314,"67":0.0251,"68":0.00314,"69":0.00628,"73":0.00314,"74":0.00314,"75":0.00314,"76":0.00941,"78":0.00314,"79":0.09414,"80":0.00628,"83":0.0251,"84":0.00314,"85":0.01569,"86":0.00628,"87":0.0659,"88":0.01255,"89":0.04079,"90":0.01569,"91":0.00628,"92":0.00314,"93":0.0251,"94":0.01255,"95":0.00941,"96":0.00314,"98":0.00314,"99":0.01883,"100":0.00314,"101":0.00941,"102":0.00941,"103":0.091,"104":0.00314,"105":0.00314,"106":0.03138,"107":0.02824,"108":0.00941,"109":1.12968,"110":0.01569,"111":0.02824,"112":0.05021,"113":0.0659,"114":0.09414,"115":0.04707,"116":0.22594,"117":0.31694,"118":3.87229,"119":16.15442,"120":0.00628,"121":0.00314,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 47 48 51 52 54 57 59 60 61 62 64 70 71 72 77 81 97 122"},F:{"28":0.01883,"36":0.01255,"46":0.01255,"95":0.01255,"98":0.00314,"99":0.00628,"100":0.00628,"101":0.10355,"102":0.14749,"103":0.03138,"104":0.09728,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.00628,"83":0.00314,"85":0.00314,"89":0.00628,"92":0.0251,"100":0.01883,"107":0.01255,"108":0.00941,"109":0.08159,"110":0.00628,"111":0.00314,"112":0.00941,"113":0.02197,"114":0.01883,"115":0.03766,"116":0.00941,"117":0.23849,"118":0.66212,"119":3.33569,_:"12 13 14 15 16 17 79 80 81 84 86 87 88 90 91 93 94 95 96 97 98 99 101 102 103 104 105 106"},E:{"13":0.01883,"14":0.05335,"15":0.00628,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 6.1 7.1 10.1","5.1":0.01883,"9.1":0.00628,"11.1":0.00314,"12.1":0.00628,"13.1":0.02824,"14.1":0.04393,"15.1":0.01255,"15.2-15.3":0.00941,"15.4":0.01255,"15.5":0.03452,"15.6":0.1318,"16.0":0.01255,"16.1":0.05021,"16.2":0.04079,"16.3":0.1318,"16.4":0.04393,"16.5":0.07845,"16.6":0.46442,"17.0":0.36401,"17.1":0.32321,"17.2":0.00314},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00351,"5.0-5.1":0.00351,"6.0-6.1":0.00877,"7.0-7.1":0.01227,"8.1-8.4":0.00175,"9.0-9.2":0.01403,"9.3":0.04383,"10.0-10.2":0.00351,"10.3":0.06312,"11.0-11.2":0.02981,"11.3-11.4":0.0263,"12.0-12.1":0.01578,"12.2-12.5":0.28753,"13.0-13.1":0.00701,"13.2":0.02981,"13.3":0.01753,"13.4-13.7":0.05084,"14.0-14.4":0.135,"14.5-14.8":0.21916,"15.0-15.1":0.08591,"15.2-15.3":0.10519,"15.4":0.11747,"15.5":0.1648,"15.6-15.7":0.8661,"16.0":0.40675,"16.1":0.81526,"16.2":0.39097,"16.3":0.73285,"16.4":0.15078,"16.5":0.38922,"16.6-16.7":6.59745,"17.0":1.9759,"17.1":3.31889,"17.2":0.09468},P:{"4":0.07155,"20":0.04089,"21":0.092,"22":0.3782,"23":2.45322,"5.0-5.4":0.01022,"6.2-6.4":0.01022,"7.2-7.4":0.07155,_:"8.2 10.1","9.2":0.01022,"11.1-11.2":0.08177,"12.0":0.01022,"13.0":0.02044,"14.0":0.01022,"15.0":0.01022,"16.0":0.02044,"17.0":0.06133,"18.0":0.03067,"19.0":0.06133},I:{"0":0.22531,"3":0.00002,"4":0.00005,"2.1":0,"2.2":0.00005,"2.3":0,"4.1":0.00002,"4.2-4.3":0.00016,"4.4":0,"4.4.3-4.4.4":0.00068},K:{"0":1.62316,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.01569,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":2.66932},H:{"0":0.01},L:{"0":43.13576},R:{_:"0"},M:{"0":0.56268},Q:{"13.1":0.00686}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BI.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BI.js
    index 23f4a641d5dc07..a537e021bcd350 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BI.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BI.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00237,"48":0,"49":0,"50":0,"51":0,"52":0.00237,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00237,"103":0.00237,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0.00474,"114":0.00474,"115":0.07584,"116":0.00948,"117":0.18012,"118":0.01422,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00237,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00237,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0.00711,"60":0,"61":0,"62":0,"63":0,"64":0.01185,"65":0,"66":0,"67":0.00237,"68":0,"69":0,"70":0.00711,"71":0,"72":0.00474,"73":0.00474,"74":0.00237,"75":0,"76":0,"77":0,"78":0,"79":0.00474,"80":0.00474,"81":0.00474,"83":0.00237,"84":0.00237,"85":0,"86":0,"87":0.00237,"88":0.00237,"89":0,"90":0.00237,"91":0.01185,"92":0.00237,"93":0.00474,"94":0,"95":0.00237,"96":0.00237,"97":0,"98":0,"99":0.00237,"100":0.00237,"101":0.00948,"102":0.00237,"103":0.00948,"104":0.01185,"105":0.00237,"106":0.00474,"107":0,"108":0.00948,"109":0.2607,"110":0.00474,"111":0.00237,"112":0.00474,"113":0.00711,"114":0.02607,"115":0.02844,"116":1.6353,"117":0.29862,"118":0.01896,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0.00237,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0.00474,"24":0.00711,"25":0,"26":0.00711,"27":0.00237,"28":0.00237,"29":0,"30":0.00474,"31":0.00237,"32":0.00711,"33":0.00237,"34":0,"35":0,"36":0,"37":0.19434,"38":0.00237,"39":0,"40":0,"41":0,"42":0.00237,"43":0,"44":0,"45":0.00237,"46":0,"47":0,"48":0,"49":0,"50":0.00711,"51":0.00237,"52":0,"53":0.00474,"54":0,"55":0,"56":0.00237,"57":0.00237,"58":0.00237,"60":0.02844,"62":0,"63":0.06162,"64":0.00474,"65":0.00474,"66":0.02844,"67":0.04503,"68":0.00948,"69":0.26781,"70":0.04029,"71":0.17301,"72":0.22041,"73":0.06636,"74":0,"75":0,"76":0.00237,"77":0.01185,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0.00237,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00948,"96":0,"97":0,"98":0,"99":0.00237,"100":0,"101":0.06399,"102":0.04977,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00237},B:{"12":0.00948,"13":0.00237,"14":0.00237,"15":0.00474,"16":0,"17":0.00237,"18":0.00711,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.00237,"90":0,"91":0,"92":0.00948,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00237,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00237,"110":0.00237,"111":0.02133,"112":0,"113":0.00237,"114":0.01185,"115":0.01422,"116":0.21567,"117":0.16116},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.10665,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0.00237,"12.1":0,"13.1":0.00474,"14.1":0.00474,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.00237,"15.6":0.00474,"16.0":0,"16.1":0,"16.2":0,"16.3":0,"16.4":0,"16.5":0.00237,"16.6":0.00237,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.0585,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.03687,"10.0-10.2":0,"10.3":0.00886,"11.0-11.2":0.00319,"11.3-11.4":0,"12.0-12.1":0.00745,"12.2-12.5":0.56659,"13.0-13.1":0,"13.2":0.00142,"13.3":0.00248,"13.4-13.7":0.31202,"14.0-14.4":0.12835,"14.5-14.8":0.12055,"15.0-15.1":0.1085,"15.2-15.3":0.02624,"15.4":0.0468,"15.5":0.14289,"15.6-15.7":0.48859,"16.0":0.18827,"16.1":0.31202,"16.2":0.06914,"16.3":0.1514,"16.4":0.0312,"16.5":0.22834,"16.6":0.4464,"17.0":0.05496,"17.1":0},P:{"4":0.41263,"20":0.04126,"21":0.02063,"22":0.35074,"5.0-5.4":0.02063,"6.2-6.4":0.01032,"7.2-7.4":0.10316,"8.2":0.01032,"9.2":0.05158,"10.1":0,"11.1-11.2":0.01032,"12.0":0,"13.0":0.09284,"14.0":0.01032,"15.0":0.02063,"16.0":0.02063,"17.0":0.03095,"18.0":0.03095,"19.0":0.05158},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00377,"4.2-4.3":0.00151,"4.4":0,"4.4.3-4.4.4":0.1279},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00948,"5.5":0},S:{"2.5":0.23653,_:"3.0-3.1"},J:{"7":0,"10":0.34335},N:{"10":0,"11":0},L:{"0":76.55346},R:{_:"0"},M:{"0":0.02289},Q:{"13.1":0},O:{"0":0.25942},H:{"0":10.01912}};
    +module.exports={C:{"47":0.00942,"52":0.02354,"54":0.00235,"56":0.00235,"57":0.00235,"63":0.00235,"64":0.00942,"66":0.00235,"71":0.00471,"72":0.00706,"82":0.00706,"91":0.00235,"100":0.00235,"102":0.00471,"110":0.00235,"112":0.00235,"115":0.18126,"116":0.00235,"117":0.02119,"118":0.01883,"119":0.86156,"120":0.44961,"121":0.01412,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 48 49 50 51 53 55 58 59 60 61 62 65 67 68 69 70 73 74 75 76 77 78 79 80 81 83 84 85 86 87 88 89 90 92 93 94 95 96 97 98 99 101 103 104 105 106 107 108 109 111 113 114 122 123 3.5 3.6"},D:{"41":0.00706,"45":0.00235,"54":0.00235,"56":0.00235,"59":0.00235,"63":0.00471,"64":0.07533,"67":0.00235,"68":0.00235,"70":0.00942,"72":0.01883,"73":0.01177,"74":0.00471,"75":0.00471,"76":0.00471,"77":0.00235,"79":0.05885,"80":0.01177,"81":0.00942,"83":0.08945,"84":0.00235,"88":0.00235,"90":0.00235,"91":0.00235,"92":0.01648,"93":0.01883,"94":0.12005,"96":0.00471,"97":0.00235,"99":0.00942,"100":0.01648,"101":0.04473,"102":0.01412,"103":0.42372,"105":0.00235,"106":0.02354,"107":0.00471,"108":0.00942,"109":0.90394,"110":0.00942,"111":0.00235,"112":0.00235,"113":0.03531,"114":0.04943,"115":0.02354,"116":0.08945,"117":0.18597,"118":2.52113,"119":7.707,"120":0.06356,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 42 43 44 46 47 48 49 50 51 52 53 55 57 58 60 61 62 65 66 69 71 78 85 86 87 89 95 98 104 121 122"},F:{"37":0.00235,"45":0.00706,"75":0.00235,"79":0.00235,"83":0.00235,"90":0.00706,"95":0.0306,"99":0.00235,"101":0.00471,"102":0.04708,"103":0.11299,"104":0.48257,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 39 40 41 42 43 44 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 76 77 78 80 81 82 84 85 86 87 88 89 91 92 93 94 96 97 98 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.01648,"13":0.00471,"14":0.00235,"17":0.01883,"18":0.01412,"88":0.00235,"89":0.00471,"90":0.00235,"92":0.03531,"100":0.00235,"107":0.00235,"108":0.00235,"109":0.00235,"111":0.00706,"114":0.02589,"115":0.00706,"116":0.01412,"117":0.15536,"118":0.39783,"119":1.56306,_:"15 16 79 80 81 83 84 85 86 87 91 93 94 95 96 97 98 99 101 102 103 104 105 106 110 112 113"},E:{"11":0.00235,"14":0.00706,_:"0 4 5 6 7 8 9 10 12 13 15 3.1 3.2 6.1 7.1 9.1 10.1 12.1 14.1 15.1 15.2-15.3 15.4 16.0 17.2","5.1":0.24952,"11.1":0.00706,"13.1":0.12005,"15.5":0.00235,"15.6":0.00942,"16.1":0.00235,"16.2":0.00706,"16.3":0.00235,"16.4":0.00235,"16.5":0.00235,"16.6":0.00706,"17.0":0.00706,"17.1":0.00706},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00036,"5.0-5.1":0.00036,"6.0-6.1":0.00089,"7.0-7.1":0.00125,"8.1-8.4":0.00018,"9.0-9.2":0.00143,"9.3":0.00447,"10.0-10.2":0.00036,"10.3":0.00644,"11.0-11.2":0.00304,"11.3-11.4":0.00268,"12.0-12.1":0.00161,"12.2-12.5":0.02934,"13.0-13.1":0.00072,"13.2":0.00304,"13.3":0.00179,"13.4-13.7":0.00519,"14.0-14.4":0.01378,"14.5-14.8":0.02236,"15.0-15.1":0.00877,"15.2-15.3":0.01073,"15.4":0.01199,"15.5":0.01682,"15.6-15.7":0.08838,"16.0":0.04151,"16.1":0.0832,"16.2":0.0399,"16.3":0.07479,"16.4":0.01539,"16.5":0.03972,"16.6-16.7":0.67326,"17.0":0.20164,"17.1":0.33869,"17.2":0.00966},P:{"4":0.19057,"21":0.02006,"22":0.09027,"23":0.32097,_:"20 8.2 10.1 12.0 15.0 16.0 17.0 18.0","5.0-5.4":0.06018,"6.2-6.4":0.02006,"7.2-7.4":0.08024,"9.2":0.07021,"11.1-11.2":0.01003,"13.0":0.01003,"14.0":0.02006,"19.0":0.04012},I:{"0":0.06086,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00004,"4.4":0,"4.4.3-4.4.4":0.00018},K:{"0":5.72102,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.03296,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.07646,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.27526},H:{"0":3.89},L:{"0":68.71147},R:{_:"0"},M:{"0":0.07646},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BJ.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BJ.js
    index c4300f69a7c2f9..a7ebc23159b85d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BJ.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BJ.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00252,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0.00252,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00504,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00252,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0.00252,"111":0,"112":0.00252,"113":0.00252,"114":0.00504,"115":0.04286,"116":0.01765,"117":0.24202,"118":0.02017,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00252,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.00252,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0.00252,"43":0,"44":0,"45":0,"46":0.00252,"47":0,"48":0,"49":0,"50":0.00252,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0.02017,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.01261,"69":0,"70":0.01513,"71":0,"72":0,"73":0,"74":0.02773,"75":0,"76":0,"77":0,"78":0.00504,"79":0.00756,"80":0.01765,"81":0.01008,"83":0,"84":0.00252,"85":0.00504,"86":0,"87":0.02521,"88":0.02521,"89":0,"90":0.00252,"91":0.00504,"92":0.00252,"93":0.00756,"94":0.00504,"95":0.00504,"96":0,"97":0.00252,"98":0.02521,"99":0.06555,"100":0.00504,"101":0,"102":0.00504,"103":0.01008,"104":0.00252,"105":0.01261,"106":0.00504,"107":0.00252,"108":0.01008,"109":0.42857,"110":0.00252,"111":0.00504,"112":0.01261,"113":0.01261,"114":0.03782,"115":0.05798,"116":1.77478,"117":0.44622,"118":0.00252,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0.00252,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0.00252,"33":0,"34":0,"35":0,"36":0,"37":0.00504,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0.00252,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00252,"57":0.00252,"58":0.00252,"60":0.03277,"62":0,"63":0.11849,"64":0.00756,"65":0,"66":0.01261,"67":0.02521,"68":0.00252,"69":0.07311,"70":0.02521,"71":0.06303,"72":0.16387,"73":0.05294,"74":0,"75":0,"76":0,"77":0.01008,"78":0.00252,"79":0.00504,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00756,"86":0.00252,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01261,"96":0,"97":0,"98":0,"99":0,"100":0.00504,"101":0.05798,"102":0.06807,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00252},B:{"12":0,"13":0,"14":0,"15":0.01008,"16":0,"17":0,"18":0.00252,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.00252,"91":0,"92":0.00504,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00252,"108":0,"109":0.00504,"110":0.00252,"111":0,"112":0.00252,"113":0,"114":0.00504,"115":0.01261,"116":0.26723,"117":0.18151},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00252,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00252,"14.1":0.00252,"15.1":0.00252,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0.00504,"16.0":0,"16.1":0.00252,"16.2":0.00504,"16.3":0.00504,"16.4":0.00252,"16.5":0.03277,"16.6":0.08319,"17.0":0.00252,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00433,"6.0-6.1":0.00692,"7.0-7.1":0.00952,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.00519,"10.0-10.2":0,"10.3":0.00606,"11.0-11.2":0.00346,"11.3-11.4":0.00433,"12.0-12.1":0.00779,"12.2-12.5":0.64448,"13.0-13.1":0.00519,"13.2":0,"13.3":0.03893,"13.4-13.7":0.06228,"14.0-14.4":0.39188,"14.5-14.8":0.14101,"15.0-15.1":0.21194,"15.2-15.3":0.12543,"15.4":0.0744,"15.5":0.28115,"15.6-15.7":1.03203,"16.0":0.45849,"16.1":0.468,"16.2":0.14706,"16.3":0.42907,"16.4":0.09775,"16.5":0.95504,"16.6":2.63933,"17.0":0.30796,"17.1":0},P:{"4":0.20677,"20":0.03102,"21":0.03102,"22":0.28948,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.01034,"8.2":0,"9.2":0.01034,"10.1":0,"11.1-11.2":0.01034,"12.0":0,"13.0":0,"14.0":0,"15.0":0.02068,"16.0":0.01034,"17.0":0.03102,"18.0":0.01034,"19.0":0.04135},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00381,"4.2-4.3":0.01088,"4.4":0,"4.4.3-4.4.4":0.19909},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00504,"5.5":0},S:{"2.5":0.09723,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":78.22363},R:{_:"0"},M:{"0":0.05983},Q:{"13.1":0.01496},O:{"0":0.3216},H:{"0":5.26799}};
    +module.exports={C:{"40":0.00202,"43":0.00202,"45":0.00202,"52":0.00202,"57":0.00404,"67":0.00404,"70":0.00202,"72":0.00404,"84":0.00202,"85":0.03033,"88":0.00202,"91":0.00202,"99":0.02426,"101":0.00202,"102":0.01213,"103":0.00202,"104":0.00202,"107":0.00202,"109":0.00404,"112":0.00809,"113":0.00607,"114":0.00809,"115":0.2022,"116":0.00404,"117":0.01618,"118":0.04448,"119":0.81284,"120":0.27095,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 41 42 44 46 47 48 49 50 51 53 54 55 56 58 59 60 61 62 63 64 65 66 68 69 71 73 74 75 76 77 78 79 80 81 82 83 86 87 89 90 92 93 94 95 96 97 98 100 105 106 108 110 111 121 122 123 3.5 3.6"},D:{"33":0.00202,"43":0.00202,"44":0.00202,"47":0.00202,"50":0.00404,"54":0.00607,"56":0.00202,"57":0.00202,"59":0.00404,"60":0.00202,"61":0.01011,"62":0.00202,"64":0.00202,"65":0.00809,"67":0.00202,"68":0.00607,"70":0.02022,"72":0.00202,"74":0.02426,"75":0.00202,"76":0.00607,"77":0.00607,"78":0.00404,"79":0.00809,"80":0.03437,"81":0.03235,"83":0.03033,"85":0.00607,"86":0.00607,"87":0.02022,"88":0.02022,"89":0.00202,"90":0.01618,"91":0.01011,"92":0.02224,"93":0.00607,"94":0.0647,"95":0.0182,"96":0.00202,"97":0.01618,"98":0.0182,"99":0.00202,"100":0.00404,"101":0.00202,"102":0.04044,"103":0.11323,"104":0.00809,"105":0.05662,"106":0.02426,"107":0.00607,"108":0.03842,"109":2.03211,"110":0.01011,"111":0.00809,"112":0.01011,"113":0.01415,"114":0.04651,"115":0.04246,"116":0.13143,"117":0.17794,"118":1.56705,"119":6.75955,"120":0.01011,"121":0.00404,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 37 38 39 40 41 42 45 46 48 49 51 52 53 55 58 63 66 69 71 73 84 122"},F:{"38":0.00202,"57":0.00809,"76":0.00202,"79":0.16176,"82":0.00404,"83":0.01011,"85":0.05459,"87":0.00202,"91":0.00202,"95":0.06875,"100":0.00404,"101":0.00404,"102":0.05459,"103":0.11728,"104":0.5055,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 77 78 80 81 84 86 88 89 90 92 93 94 96 97 98 99 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00202,"13":0.00202,"15":0.00202,"16":0.00404,"17":0.00202,"18":0.01415,"84":0.00404,"85":0.00202,"89":0.00202,"90":0.01213,"92":0.0182,"98":0.01618,"99":0.00607,"100":0.00202,"107":0.01213,"108":0.00202,"109":0.01213,"110":0.0182,"111":0.00809,"113":0.00202,"114":0.02022,"115":0.00404,"116":0.01415,"117":0.03437,"118":0.32554,"119":1.08986,_:"14 79 80 81 83 86 87 88 91 93 94 95 96 97 101 102 103 104 105 106 112"},E:{"13":0.00202,"14":0.00202,_:"0 4 5 6 7 8 9 10 11 12 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1","5.1":0.01213,"12.1":0.00202,"13.1":0.00404,"14.1":0.00202,"15.1":0.00404,"15.2-15.3":0.00404,"15.4":0.00202,"15.5":0.00809,"15.6":0.01618,"16.0":0.00202,"16.1":0.01011,"16.2":0.02022,"16.3":0.03033,"16.4":0.02022,"16.5":0.02426,"16.6":0.17187,"17.0":0.06066,"17.1":0.12536,"17.2":0.00607},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00132,"5.0-5.1":0.00132,"6.0-6.1":0.00329,"7.0-7.1":0.00461,"8.1-8.4":0.00066,"9.0-9.2":0.00527,"9.3":0.01645,"10.0-10.2":0.00132,"10.3":0.02369,"11.0-11.2":0.01119,"11.3-11.4":0.00987,"12.0-12.1":0.00592,"12.2-12.5":0.10794,"13.0-13.1":0.00263,"13.2":0.01119,"13.3":0.00658,"13.4-13.7":0.01909,"14.0-14.4":0.05068,"14.5-14.8":0.08227,"15.0-15.1":0.03225,"15.2-15.3":0.03949,"15.4":0.0441,"15.5":0.06187,"15.6-15.7":0.32514,"16.0":0.1527,"16.1":0.30606,"16.2":0.14678,"16.3":0.27512,"16.4":0.0566,"16.5":0.14612,"16.6-16.7":2.47675,"17.0":0.74177,"17.1":1.24594,"17.2":0.03554},P:{"4":0.17832,"20":0.01049,"21":0.05245,"22":0.07343,"23":0.14685,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 12.0 13.0 14.0 16.0 17.0 18.0","7.2-7.4":0.01049,"11.1-11.2":0.01049,"15.0":0.06294,"19.0":0.02098},I:{"0":0.02381,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.00007},K:{"0":2.41062,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.00202,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.08776,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.33508},H:{"0":2.44},L:{"0":70.85454},R:{_:"0"},M:{"0":0.0718},Q:{"13.1":0.01596}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BM.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BM.js
    index 103e43081de8eb..78b2ff5d35e738 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BM.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BM.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.00485,"116":0.00243,"117":0.01456,"118":0.00243,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"83":0.00243,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.00485,"104":0,"105":0,"106":0,"107":0.00485,"108":0,"109":0.02183,"110":0,"111":0.00243,"112":0.00243,"113":0.00243,"114":0.0097,"115":0.05822,"116":0.45124,"117":0.1116,"118":0.00243,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00243,"101":0.01456,"102":0.00485,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.01213,"110":0,"111":0,"112":0,"113":0,"114":0.00243,"115":0.02426,"116":0.12373,"117":0.09947},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00243,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.0097,"14.1":0.03639,"15.1":0.01941,"15.2-15.3":0.02426,"15.4":0.02669,"15.5":0.08734,"15.6":0.45851,"16.0":0.01698,"16.1":0.10674,"16.2":0.1213,"16.3":0.29112,"16.4":0.09704,"16.5":0.30082,"16.6":2.97428,"17.0":0.14313,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.00922,"10.0-10.2":0,"10.3":0.02766,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0.03688,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0.00922,"14.0-14.4":0.00922,"14.5-14.8":0,"15.0-15.1":0.10142,"15.2-15.3":0.12908,"15.4":0.22128,"15.5":0.66384,"15.6-15.7":4.86816,"16.0":3.28232,"16.1":5.03412,"16.2":2.38798,"16.3":4.0107,"16.4":0.6915,"16.5":2.0284,"16.6":63.17546,"17.0":4.49014,"17.1":0.01844},P:{"4":0.01094,"20":0,"21":0.01094,"22":0.47043,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0,"17.0":0,"18.0":0,"19.0":0},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.02426},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":2.26379},R:{_:"0"},M:{"0":0.0303},Q:{"13.1":0},O:{"0":0},H:{"0":0}};
    +module.exports={C:{"78":0.00269,"115":0.00269,"119":0.01343,"120":0.00269,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 116 117 118 121 122 123 3.5 3.6"},D:{"86":0.00269,"103":0.00269,"109":0.02417,"113":0.00537,"114":0.00269,"115":0.00269,"116":0.01074,"117":0.0188,"118":0.10472,"119":0.31683,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 83 84 85 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 104 105 106 107 108 110 111 112 120 121 122"},F:{"102":0.00269,"104":0.00269,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 103 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"117":0.00806,"118":0.03222,"119":0.11546,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116"},E:{_:"0 4 5 6 7 8 9 10 11 12 13 14 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1","13.1":0.00537,"14.1":0.02148,"15.1":0.05907,"15.2-15.3":0.04028,"15.4":0.12083,"15.5":0.26582,"15.6":2.44872,"16.0":0.08055,"16.1":0.50747,"16.2":0.64172,"16.3":1.78821,"16.4":0.39738,"16.5":1.0203,"16.6":12.22481,"17.0":1.51166,"17.1":4.55108,"17.2":0.06713},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.01455,"5.0-5.1":0.01455,"6.0-6.1":0.03637,"7.0-7.1":0.05092,"8.1-8.4":0.00727,"9.0-9.2":0.05819,"9.3":0.18184,"10.0-10.2":0.01455,"10.3":0.26186,"11.0-11.2":0.12365,"11.3-11.4":0.10911,"12.0-12.1":0.06546,"12.2-12.5":1.1929,"13.0-13.1":0.0291,"13.2":0.12365,"13.3":0.07274,"13.4-13.7":0.21094,"14.0-14.4":0.56008,"14.5-14.8":0.90922,"15.0-15.1":0.35641,"15.2-15.3":0.43643,"15.4":0.48734,"15.5":0.68373,"15.6-15.7":3.59324,"16.0":1.68752,"16.1":3.3823,"16.2":1.62205,"16.3":3.04044,"16.4":0.62554,"16.5":1.61478,"16.6-16.7":27.37121,"17.0":8.19754,"17.1":13.76925,"17.2":0.39278},P:{"22":0.01045,"23":0.06269,_:"4 20 21 5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0"},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{"0":0,_:"10 11 12 11.1 11.5 12.1"},A:{_:"6 7 8 9 10 11 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{_:"0"},H:{"0":0},L:{"0":0.29525},R:{_:"0"},M:{"0":0.02926},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BN.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BN.js
    index 87117c10680a9b..5dbdff04bb25ac 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BN.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BN.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0.00444,"4":0.00444,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00444,"32":0,"33":0,"34":0.00444,"35":0.00444,"36":0.00444,"37":0.00444,"38":0.00444,"39":0.00444,"40":0.00889,"41":0.00444,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00444,"49":0,"50":0,"51":0,"52":0.00444,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.01777,"79":0,"80":0.00444,"81":0,"82":0.00444,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.00444,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0.00444,"113":0.00444,"114":0.00444,"115":0.20882,"116":0.04887,"117":0.75531,"118":0.05332,"119":0,"120":0,"3.5":0.00444,"3.6":0.00889},D:{"4":0,"5":0,"6":0,"7":0.00444,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0.00444,"20":0,"21":0.00444,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00444,"31":0.00889,"32":0,"33":0.00444,"34":0,"35":0.00444,"36":0.00444,"37":0.00444,"38":0.0311,"39":0.00444,"40":0.00444,"41":0.00889,"42":0.00444,"43":0.01333,"44":0.02222,"45":0.01333,"46":0.01333,"47":0.01777,"48":0,"49":0.23104,"50":0,"51":0.01333,"52":0,"53":0,"54":0,"55":0.02222,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0.01333,"63":0,"64":0,"65":0.00889,"66":0,"67":0,"68":0.00444,"69":0,"70":0.01777,"71":0,"72":0,"73":0.00444,"74":0,"75":0.00444,"76":0,"77":0,"78":0,"79":0.09775,"80":0.00444,"81":0.0622,"83":0.00444,"84":0,"85":0.00889,"86":0,"87":0.00889,"88":0.01333,"89":0.01333,"90":0,"91":0.0311,"92":0.01333,"93":0,"94":0,"95":0.00444,"96":0.00444,"97":0.00444,"98":0.00889,"99":0.0311,"100":0.01777,"101":0,"102":0,"103":0.05776,"104":0.02222,"105":0,"106":0.01333,"107":0.00444,"108":0.00889,"109":0.97746,"110":0.00444,"111":0.00889,"112":0.02222,"113":0.04443,"114":0.09775,"115":0.17328,"116":8.2862,"117":1.92382,"118":0.01333,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00444,"29":0,"30":0.00444,"31":0.00444,"32":0,"33":0.00444,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00444,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0.00444,"62":0,"63":0.00444,"64":0,"65":0,"66":0,"67":0.00444,"68":0,"69":0.00444,"70":0.0311,"71":0.00889,"72":0.24881,"73":0.07553,"74":0.00444,"75":0,"76":0,"77":0.05332,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.0311,"96":0,"97":0,"98":0,"99":0,"100":0.09775,"101":0.17328,"102":0.17328,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00444},B:{"12":0.00444,"13":0,"14":0.00889,"15":0,"16":0,"17":0,"18":0.00444,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0.00444,"105":0,"106":0,"107":0,"108":0.00444,"109":0.00889,"110":0,"111":0.00444,"112":0,"113":0.0622,"114":0.00444,"115":0.03554,"116":0.81307,"117":0.5376},E:{"4":0,"5":0.00444,"6":0,"7":0,"8":0,"9":0.0311,"10":0,"11":0,"12":0,"13":0.02666,"14":0.08886,"15":0.02666,_:"0","3.1":0,"3.2":0,"5.1":0.00444,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00444,"13.1":0.01777,"14.1":0.12885,"15.1":0.02222,"15.2-15.3":0.00889,"15.4":0.04887,"15.5":0.02222,"15.6":0.23992,"16.0":0.02222,"16.1":0.05332,"16.2":0.02666,"16.3":0.12885,"16.4":0.0311,"16.5":0.11552,"16.6":1.29291,"17.0":0.08886,"17.1":0},G:{"8":0.00712,"3.2":0.00237,"4.0-4.1":0,"4.2-4.3":0.01423,"5.0-5.1":0.00474,"6.0-6.1":0.01898,"7.0-7.1":0.09015,"8.1-8.4":0.09252,"9.0-9.2":0.00712,"9.3":0.18741,"10.0-10.2":0.08303,"10.3":0.65477,"11.0-11.2":0.14471,"11.3-11.4":0,"12.0-12.1":0.18267,"12.2-12.5":0.69035,"13.0-13.1":0.01423,"13.2":0.00237,"13.3":0.00474,"13.4-13.7":0.01898,"14.0-14.4":0.18741,"14.5-14.8":0.22063,"15.0-15.1":0.15183,"15.2-15.3":0.14708,"15.4":0.11862,"15.5":0.14708,"15.6-15.7":1.77214,"16.0":0.97266,"16.1":0.9181,"16.2":0.39618,"16.3":1.27395,"16.4":0.25384,"16.5":1.09365,"16.6":12.18196,"17.0":1.35461,"17.1":0},P:{"4":0.59281,"20":0.02117,"21":0.08469,"22":1.59846,"5.0-5.4":0.02117,"6.2-6.4":0.02117,"7.2-7.4":0.06352,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01059,"12.0":0.01059,"13.0":0.05293,"14.0":0,"15.0":0,"16.0":0.02117,"17.0":0.01059,"18.0":0.01059,"19.0":0.03176},I:{"0":0,"3":0.01508,"4":0.05782,"2.1":0.01006,"2.2":0.03519,"2.3":0.03771,"4.1":0.04022,"4.2-4.3":0.08547,"4.4":0,"4.4.3-4.4.4":0.22625},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.00452,"7":0.01357,"8":0.11309,"9":0.02262,"10":0.02262,"11":0.06786,"5.5":0},S:{"2.5":0.01111,_:"3.0-3.1"},J:{"7":0,"10":0.01667},N:{"10":0.03668,"11":0.02445},L:{"0":47.77495},R:{_:"0"},M:{"0":0.23339},Q:{"13.1":0.00556},O:{"0":1.91717},H:{"0":1.72035}};
    +module.exports={C:{"2":0.0041,"21":0.0041,"31":0.0041,"32":0.0041,"34":0.0041,"38":0.0041,"39":0.0041,"40":0.0041,"52":0.0082,"78":0.0164,"84":0.0123,"88":0.0164,"89":0.0041,"99":0.0082,"101":0.02051,"108":0.0041,"110":0.0041,"112":0.0041,"114":0.0041,"115":0.3896,"116":0.04101,"117":0.0041,"118":0.11073,"119":1.40664,"120":0.4183,"121":0.0041,_:"3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 22 23 24 25 26 27 28 29 30 33 35 36 37 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 85 86 87 90 91 92 93 94 95 96 97 98 100 102 103 104 105 106 107 109 111 113 122 123","3.5":0.0041,"3.6":0.0041},D:{"32":0.0041,"37":0.0041,"38":0.13533,"39":0.0041,"40":0.0041,"41":0.0082,"42":0.0041,"43":0.0123,"44":0.0123,"45":0.0082,"46":0.0123,"47":0.0082,"49":0.43881,"50":0.0041,"51":0.0123,"53":0.0041,"55":0.03691,"62":0.0164,"63":0.0041,"65":0.0041,"66":0.0082,"67":0.0041,"70":0.0123,"73":0.0123,"74":0.0041,"75":0.0041,"77":0.02051,"79":0.15994,"80":0.0041,"81":0.44291,"83":0.0123,"85":0.02051,"87":0.0082,"88":0.02461,"89":0.0123,"91":0.02051,"92":0.03691,"93":0.0041,"95":0.0123,"96":0.0041,"97":0.04511,"98":0.03691,"99":0.03281,"100":0.0041,"102":0.0041,"103":0.20915,"105":0.05331,"106":0.06152,"107":0.0082,"108":0.07382,"109":1.6404,"110":0.04101,"111":0.02871,"112":0.04921,"113":0.05331,"114":0.03691,"115":0.06972,"116":0.27887,"117":0.22145,"118":4.44138,"119":17.85986,"120":0.02461,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 33 34 35 36 48 52 54 56 57 58 59 60 61 64 68 69 71 72 76 78 84 86 90 94 101 104 121 122"},F:{"28":0.0164,"31":0.0041,"95":0.02871,"100":0.0041,"102":0.69717,"103":0.11483,"104":0.66026,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.0041},B:{"15":0.0041,"18":0.0041,"92":0.0041,"97":0.0041,"99":0.0041,"100":0.0041,"107":0.0041,"109":0.02461,"110":0.0041,"111":0.0082,"112":0.0041,"113":0.14764,"114":0.0082,"115":0.0082,"116":0.03281,"117":0.09842,"118":0.56184,"119":2.4565,_:"12 13 14 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 98 101 102 103 104 105 106 108"},E:{"8":0.0041,"9":0.02051,"12":0.11073,"13":0.04511,"14":0.08612,"15":0.0082,_:"0 4 5 6 7 10 11 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.0041,"13.1":0.04511,"14.1":0.15584,"15.1":0.04101,"15.2-15.3":0.02051,"15.4":0.04921,"15.5":0.04511,"15.6":0.55364,"16.0":0.06562,"16.1":0.10663,"16.2":0.06152,"16.3":0.36909,"16.4":0.05741,"16.5":0.22145,"16.6":2.10381,"17.0":0.50032,"17.1":0.91042,"17.2":0.05331},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00335,"5.0-5.1":0.00335,"6.0-6.1":0.00837,"7.0-7.1":0.01172,"8.1-8.4":0.00167,"9.0-9.2":0.01339,"9.3":0.04185,"10.0-10.2":0.00335,"10.3":0.06027,"11.0-11.2":0.02846,"11.3-11.4":0.02511,"12.0-12.1":0.01507,"12.2-12.5":0.27456,"13.0-13.1":0.0067,"13.2":0.02846,"13.3":0.01674,"13.4-13.7":0.04855,"14.0-14.4":0.12891,"14.5-14.8":0.20927,"15.0-15.1":0.08203,"15.2-15.3":0.10045,"15.4":0.11217,"15.5":0.15737,"15.6-15.7":0.82702,"16.0":0.3884,"16.1":0.77847,"16.2":0.37333,"16.3":0.69979,"16.4":0.14398,"16.5":0.37166,"16.6-16.7":6.29977,"17.0":1.88675,"17.1":3.16914,"17.2":0.0904},P:{"4":0.50005,"20":0.02174,"21":0.05435,"22":0.08697,"23":1.60886,"5.0-5.4":0.03261,"6.2-6.4":0.01087,"7.2-7.4":0.07609,_:"8.2 9.2 10.1 11.1-11.2 12.0 15.0","13.0":0.02174,"14.0":0.01087,"16.0":0.01087,"17.0":0.01087,"18.0":0.01087,"19.0":0.03261},I:{"0":0.15261,"3":0.00002,"4":0.00003,"2.1":0,"2.2":0.00003,"2.3":0,"4.1":0.00002,"4.2-4.3":0.00011,"4.4":0,"4.4.3-4.4.4":0.00046},K:{"0":2.46118,_:"10 11 12 11.1 11.5 12.1"},A:{"6":0.00432,"7":0.00863,"8":0.06907,"9":0.01295,"10":0.01295,"11":0.0518,_:"5.5"},N:{_:"10 11"},S:{"2.5":0.0059,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":1.7638},H:{"0":0.04},L:{"0":35.42673},R:{_:"0"},M:{"0":0.25956},Q:{"13.1":0.0059}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BO.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BO.js
    index 787c215393bba3..c855a5b00090db 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BO.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BO.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00473,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.06615,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.01418,"59":0,"60":0.00473,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00473,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00945,"79":0,"80":0,"81":0,"82":0,"83":0.00473,"84":0,"85":0,"86":0,"87":0,"88":0.00473,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00473,"100":0.00473,"101":0,"102":0.00473,"103":0,"104":0,"105":0.00473,"106":0.00473,"107":0,"108":0.00473,"109":0,"110":0.00473,"111":0.00473,"112":0.00473,"113":0.02363,"114":0.00945,"115":0.27405,"116":0.06615,"117":0.78908,"118":0.09923,"119":0,"120":0,"3.5":0,"3.6":0.00473},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.0189,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00945,"39":0.00473,"40":0,"41":0.00473,"42":0,"43":0.00473,"44":0.00473,"45":0.00473,"46":0.00473,"47":0.00473,"48":0,"49":0.0189,"50":0,"51":0.00473,"52":0,"53":0.00473,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.00473,"61":0,"62":0.00473,"63":0,"64":0,"65":0,"66":0,"67":0.00473,"68":0.00945,"69":0.00473,"70":0.00945,"71":0,"72":0,"73":0,"74":0.00473,"75":0.00473,"76":0,"77":0,"78":0.00473,"79":0.08978,"80":0.00473,"81":0.0378,"83":0.02835,"84":0,"85":0.01418,"86":0.00473,"87":0.02363,"88":0.00945,"89":0.00473,"90":0.01418,"91":0.1134,"92":0.00473,"93":0.00473,"94":0.00473,"95":0.00473,"96":0.00473,"97":0.02363,"98":0.00473,"99":0.00945,"100":0.00473,"101":0.00945,"102":0.02363,"103":0.0378,"104":0.01418,"105":0.01418,"106":0.0189,"107":0.0189,"108":0.03308,"109":1.89945,"110":0.05198,"111":0.02835,"112":0.03308,"113":0.07088,"114":0.42053,"115":0.15593,"116":10.4706,"117":2.40975,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.01418,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.00473,"71":0.00473,"72":0.04253,"73":0.01418,"74":0.00473,"75":0,"76":0,"77":0.02363,"78":0,"79":0.00473,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.0567,"96":0,"97":0,"98":0,"99":0.00473,"100":0.16538,"101":0.36855,"102":0.37328,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00473},B:{"12":0.00473,"13":0,"14":0.00473,"15":0,"16":0,"17":0,"18":0.00473,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.02363,"89":0,"90":0,"91":0,"92":0.01418,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00473,"108":0,"109":0.02363,"110":0.00473,"111":0,"112":0,"113":0.00473,"114":0.00945,"115":0.02835,"116":0.66623,"117":0.54338},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00473,"10":0,"11":0,"12":0,"13":0,"14":0.00473,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00473,"6.1":0,"7.1":0,"9.1":0.00473,"10.1":0,"11.1":0,"12.1":0,"13.1":0.01418,"14.1":0.00945,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.00473,"15.6":0.0189,"16.0":0,"16.1":0.00473,"16.2":0.00473,"16.3":0.0189,"16.4":0.00473,"16.5":0.02363,"16.6":0.09923,"17.0":0.01418,"17.1":0},G:{"8":0.00149,"3.2":0.0005,"4.0-4.1":0,"4.2-4.3":0.00149,"5.0-5.1":0.00647,"6.0-6.1":0.00348,"7.0-7.1":0.02138,"8.1-8.4":0.02188,"9.0-9.2":0.00696,"9.3":0.0194,"10.0-10.2":0,"10.3":0.0184,"11.0-11.2":0.08454,"11.3-11.4":0.00298,"12.0-12.1":0.02039,"12.2-12.5":0.1671,"13.0-13.1":0.00298,"13.2":0.00298,"13.3":0.03083,"13.4-13.7":0.01343,"14.0-14.4":0.03083,"14.5-14.8":0.04973,"15.0-15.1":0.00995,"15.2-15.3":0.01442,"15.4":0.03083,"15.5":0.04526,"15.6-15.7":0.4446,"16.0":0.11041,"16.1":0.45107,"16.2":0.10543,"16.3":0.18799,"16.4":0.04575,"16.5":0.10792,"16.6":2.49854,"17.0":0.34116,"17.1":0},P:{"4":0.28432,"20":0.10154,"21":0.18278,"22":1.83794,"5.0-5.4":0.01015,"6.2-6.4":0.01015,"7.2-7.4":0.27417,"8.2":0,"9.2":0.02031,"10.1":0,"11.1-11.2":0.03046,"12.0":0.01015,"13.0":0.05077,"14.0":0.05077,"15.0":0.01015,"16.0":0.06093,"17.0":0.09139,"18.0":0.04062,"19.0":0.08124},I:{"0":0,"3":0,"4":0.01758,"2.1":0,"2.2":0.01055,"2.3":0.01407,"4.1":0.0211,"4.2-4.3":0.05626,"4.4":0,"4.4.3-4.4.4":0.16879},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0.00473,"8":0.0378,"9":0.00473,"10":0.00945,"11":0.0378,"5.5":0},S:{"2.5":0.00528,_:"3.0-3.1"},J:{"7":0,"10":0.01055},N:{"10":0.01583,"11":0},L:{"0":67.9195},R:{_:"0"},M:{"0":0.15298},Q:{"13.1":0},O:{"0":0.1899},H:{"0":0.45945}};
    +module.exports={C:{"7":0.00382,"38":0.01145,"42":0.00382,"48":0.00382,"50":0.00763,"52":0.11833,"54":0.00763,"58":0.01145,"60":0.00382,"72":0.00382,"76":0.00382,"78":0.03054,"81":0.00382,"88":0.00763,"93":0.01527,"94":0.00382,"99":0.00382,"102":0.01527,"106":0.00382,"107":0.00382,"108":0.00382,"109":0.00382,"110":0.00763,"111":0.00382,"112":0.00382,"113":0.01909,"114":0.00763,"115":0.50766,"116":0.01145,"117":0.01909,"118":0.09161,"119":1.42756,"120":0.46949,"121":0.00382,_:"2 3 4 5 6 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 43 44 45 46 47 49 51 53 55 56 57 59 61 62 63 64 65 66 67 68 69 70 71 73 74 75 77 79 80 82 83 84 85 86 87 89 90 91 92 95 96 97 98 100 101 103 104 105 122 123 3.5 3.6"},D:{"34":0.00382,"38":0.01145,"41":0.00382,"43":0.00382,"44":0.00382,"45":0.00382,"46":0.00382,"47":0.00382,"49":0.01145,"51":0.00382,"53":0.00382,"55":0.00382,"57":0.00763,"60":0.02672,"62":0.00382,"63":0.00382,"65":0.00763,"67":0.00763,"69":0.00763,"70":0.01909,"72":0.00382,"73":0.00382,"74":0.00382,"75":0.00382,"76":0.01145,"77":0.00382,"78":0.00763,"79":0.1336,"80":0.00382,"81":0.03054,"83":0.00763,"84":0.00763,"85":0.00763,"86":0.01145,"87":0.03435,"88":0.0229,"89":0.00763,"90":0.00763,"91":0.29391,"92":0.01145,"93":0.00382,"94":0.00763,"95":0.00382,"96":0.0229,"97":0.0229,"98":0.00763,"99":0.01527,"100":0.01145,"101":0.01527,"102":0.03054,"103":0.05344,"104":0.01145,"105":0.03435,"106":0.03435,"107":0.03817,"108":0.05344,"109":3.06887,"110":0.09161,"111":0.02672,"112":0.08016,"113":0.04199,"114":0.66798,"115":0.04962,"116":0.17177,"117":0.41987,"118":3.72158,"119":18.47046,"120":0.00763,"121":0.00763,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 39 40 42 48 50 52 54 56 58 59 61 64 66 68 71 122"},F:{"28":0.02672,"46":0.00382,"79":0.00382,"85":0.00382,"86":0.00382,"94":0.01909,"95":0.10306,"102":0.92753,"103":0.15268,"104":0.89318,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 87 88 89 90 91 92 93 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00382,"13":0.00763,"14":0.00763,"15":0.00763,"18":0.00382,"92":0.01145,"100":0.00382,"107":0.00382,"108":0.01909,"109":0.03435,"110":0.00382,"112":0.00382,"113":0.00382,"114":0.00763,"115":0.01145,"116":0.01145,"117":0.03054,"118":0.3817,"119":2.22149,_:"16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 101 102 103 104 105 106 111"},E:{"9":0.00763,"13":0.00382,"14":0.01145,_:"0 4 5 6 7 8 10 11 12 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1 12.1 17.2","5.1":0.00763,"13.1":0.01527,"14.1":0.02672,"15.1":0.00382,"15.2-15.3":0.00382,"15.4":0.00763,"15.5":0.00763,"15.6":0.07634,"16.0":0.00763,"16.1":0.01527,"16.2":0.01527,"16.3":0.0229,"16.4":0.00763,"16.5":0.04199,"16.6":0.12214,"17.0":0.07252,"17.1":0.12978},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00061,"5.0-5.1":0.00061,"6.0-6.1":0.00153,"7.0-7.1":0.00214,"8.1-8.4":0.00031,"9.0-9.2":0.00245,"9.3":0.00765,"10.0-10.2":0.00061,"10.3":0.01102,"11.0-11.2":0.0052,"11.3-11.4":0.00459,"12.0-12.1":0.00275,"12.2-12.5":0.05019,"13.0-13.1":0.00122,"13.2":0.0052,"13.3":0.00306,"13.4-13.7":0.00888,"14.0-14.4":0.02357,"14.5-14.8":0.03826,"15.0-15.1":0.015,"15.2-15.3":0.01836,"15.4":0.02051,"15.5":0.02877,"15.6-15.7":0.15119,"16.0":0.07101,"16.1":0.14232,"16.2":0.06825,"16.3":0.12793,"16.4":0.02632,"16.5":0.06794,"16.6-16.7":1.1517,"17.0":0.34493,"17.1":0.57937,"17.2":0.01653},P:{"4":0.27616,"20":0.16365,"21":0.2557,"22":0.73643,"23":2.67979,"5.0-5.4":0.01023,"6.2-6.4":0.04091,"7.2-7.4":0.27616,"8.2":0.01023,"9.2":0.02046,_:"10.1","11.1-11.2":0.04091,"12.0":0.01023,"13.0":0.0716,"14.0":0.03068,"15.0":0.02046,"16.0":0.06137,"17.0":0.10228,"18.0":0.04091,"19.0":0.09205},I:{"0":0.09843,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00007,"4.4":0,"4.4.3-4.4.4":0.0003},K:{"0":0.53792,_:"10 11 12 11.1 11.5 12.1"},A:{"7":0.00382,"8":0.01527,"9":0.00763,"10":0.00382,"11":0.03817,_:"6 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.32152},H:{"0":0},L:{"0":53.95688},R:{_:"0"},M:{"0":0.16076},Q:{"13.1":0.00618}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BR.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BR.js
    index 6e84fd13d6032c..50624d5eb223eb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BR.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BR.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0.07016,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0.04677,"43":0,"44":0,"45":0.03274,"46":0,"47":0,"48":0,"49":0,"50":0.14031,"51":0,"52":0.14499,"53":0,"54":0.15434,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00468,"69":0,"70":0.00468,"71":0,"72":0,"73":0,"74":0,"75":0.00468,"76":0,"77":0,"78":0.00468,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0.00468,"88":0.00468,"89":0.00468,"90":0.00468,"91":0.00935,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.02339,"103":0,"104":0.00468,"105":0.00468,"106":0.00468,"107":0.00468,"108":0.00468,"109":0.00468,"110":0.00468,"111":0.00468,"112":0.00468,"113":0.00935,"114":0.00468,"115":0.11225,"116":0.03742,"117":0.5285,"118":0.0608,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.06548,"48":0,"49":0.00468,"50":0,"51":0.00468,"52":0,"53":0,"54":0,"55":0.07483,"56":0,"57":0.15434,"58":0,"59":0,"60":0.44899,"61":0,"62":0,"63":0.00468,"64":0,"65":0,"66":0,"67":0,"68":0.00468,"69":0,"70":0.00468,"71":0.00468,"72":0.00468,"73":0,"74":0.00468,"75":0.00935,"76":0.00935,"77":0.01403,"78":0.00468,"79":0.05145,"80":0.01403,"81":0.02806,"83":0.00935,"84":0.00468,"85":0.01403,"86":0.01403,"87":0.03274,"88":0.00935,"89":0.00935,"90":0.02339,"91":0.45367,"92":0.01871,"93":0.00468,"94":0.00468,"95":0.00468,"96":0.00468,"97":0.00935,"98":0.00468,"99":0.00935,"100":0.01403,"101":0.00468,"102":0.02806,"103":0.03742,"104":0.00935,"105":0.01871,"106":0.02806,"107":0.05145,"108":0.04677,"109":1.15054,"110":0.02806,"111":0.03742,"112":0.04677,"113":0.05145,"114":0.09822,"115":0.16837,"116":8.18475,"117":2.9699,"118":0.01403,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00468,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00468,"66":0,"67":0,"68":0,"69":0,"70":0.00468,"71":0,"72":0.00935,"73":0,"74":0,"75":0,"76":0,"77":0.02339,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00468,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.00468,"95":0.03742,"96":0,"97":0,"98":0,"99":0.00468,"100":0.30401,"101":0.58463,"102":0.92605,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.07016,"13":0.14499,"14":0.14499,"15":0.09822,"16":0,"17":0,"18":0.00468,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.00468,"91":0,"92":0.00935,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0.00468,"107":0.00468,"108":0.00468,"109":0.03274,"110":0.00468,"111":0.00468,"112":0.00468,"113":0.00468,"114":0.02339,"115":0.02339,"116":0.86057,"117":0.91669},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00468,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.01403,"6.1":0,"7.1":0,"9.1":0.00935,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00935,"14.1":0.01403,"15.1":0,"15.2-15.3":0,"15.4":0.00468,"15.5":0.00468,"15.6":0.02806,"16.0":0.00468,"16.1":0.00935,"16.2":0.00468,"16.3":0.01871,"16.4":0.00935,"16.5":0.02806,"16.6":0.12628,"17.0":0.01403,"17.1":0},G:{"8":0,"3.2":0.00257,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0.00128,"9.3":0.02181,"10.0-10.2":0,"10.3":0.0231,"11.0-11.2":0.05774,"11.3-11.4":0.02695,"12.0-12.1":0.04234,"12.2-12.5":0.10907,"13.0-13.1":0.00385,"13.2":0.00257,"13.3":0.39392,"13.4-13.7":0.02053,"14.0-14.4":0.04876,"14.5-14.8":0.13473,"15.0-15.1":0.02695,"15.2-15.3":0.03336,"15.4":0.04491,"15.5":0.07057,"15.6-15.7":1.15097,"16.0":0.36441,"16.1":0.61462,"16.2":0.26689,"16.3":0.5787,"16.4":0.07955,"16.5":0.27331,"16.6":7.32672,"17.0":0.88152,"17.1":0.00257},P:{"4":0.09252,"20":0.04112,"21":0.08224,"22":1.82992,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.17477,"8.2":0,"9.2":0.01028,"10.1":0,"11.1-11.2":0.02056,"12.0":0,"13.0":0.01028,"14.0":0.01028,"15.0":0.01028,"16.0":0.02056,"17.0":0.0514,"18.0":0.01028,"19.0":0.03084},I:{"0":0,"3":0,"4":0.03235,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.02773,"4.4":0,"4.4.3-4.4.4":0.07395},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00472,"9":0.15584,"10":0,"11":0.32585,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":60.97009},R:{_:"0"},M:{"0":0.12775},Q:{"13.1":0},O:{"0":0.07985},H:{"0":0.28725}};
    +module.exports={C:{"3":0.00496,"7":0.22821,"11":0.00992,"42":0.14387,"50":0.43657,"52":0.44649,"54":0.50106,"75":0.00496,"78":0.01488,"81":0.00496,"88":0.00496,"89":0.00496,"90":0.00992,"91":0.01984,"99":0.00496,"102":0.00992,"103":0.00496,"104":0.00496,"105":0.00992,"106":0.00496,"107":0.00496,"108":0.00992,"109":0.00496,"110":0.00992,"111":0.00496,"112":0.00496,"113":0.00992,"114":0.00992,"115":0.23813,"116":0.00992,"117":0.02481,"118":0.06945,"119":0.89298,"120":0.2927,"121":0.00496,_:"2 4 5 6 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 43 44 45 46 47 48 49 51 53 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 76 77 79 80 82 83 84 85 86 87 92 93 94 95 96 97 98 100 101 122 123 3.5 3.6"},D:{"38":0.00496,"41":0.00496,"47":0.2034,"49":0.00992,"51":0.00496,"55":0.23317,"56":0.00496,"57":0.49114,"58":0.00496,"60":1.40892,"61":0.00496,"62":0.00496,"63":0.00496,"65":0.00496,"66":0.00496,"71":0.00496,"74":0.00496,"75":0.01488,"76":0.00496,"77":0.00992,"78":0.00496,"79":0.05953,"80":0.00496,"81":0.01984,"83":0.00496,"84":0.00496,"85":0.02481,"86":0.01488,"87":0.03473,"88":0.00992,"89":0.00496,"90":0.00992,"91":1.399,"92":0.03969,"93":0.0893,"94":0.00992,"95":0.00992,"96":0.00992,"97":0.01488,"98":0.00992,"99":0.00992,"100":0.00992,"101":0.00992,"102":0.01984,"103":0.06449,"104":0.01488,"105":0.02977,"106":0.05953,"107":0.08434,"108":0.09922,"109":3.562,"110":0.05457,"111":0.07442,"112":0.07442,"113":0.02481,"114":0.07938,"115":0.07442,"116":0.21828,"117":0.32247,"118":4.17716,"119":19.83408,"120":0.03969,"121":0.00992,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 42 43 44 45 46 48 50 52 53 54 59 64 67 68 69 70 72 73 122"},F:{"36":0.00496,"77":0.00496,"85":0.00496,"91":0.00496,"92":0.00496,"95":0.05457,"96":0.00496,"101":0.00496,"102":1.89014,"103":0.12899,"104":1.51311,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 78 79 80 81 82 83 84 86 87 88 89 90 93 94 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.21828,"13":0.4713,"14":0.46633,"15":0.23317,"18":0.00496,"92":0.02481,"103":0.00496,"105":0.00496,"106":0.00496,"107":0.00992,"108":0.00992,"109":0.05953,"110":0.00992,"111":0.00496,"112":0.00496,"113":0.00496,"114":0.00992,"115":0.00992,"116":0.00992,"117":0.0893,"118":0.56059,"119":3.32883,_:"16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 104"},E:{"4":0.00496,"14":0.00992,"15":0.00496,_:"0 5 6 7 8 9 10 11 12 13 3.1 3.2 6.1 7.1 9.1 10.1 11.1 12.1","5.1":0.01984,"13.1":0.01984,"14.1":0.02977,"15.1":0.00496,"15.2-15.3":0.00496,"15.4":0.00496,"15.5":0.00992,"15.6":0.05953,"16.0":0.00992,"16.1":0.01488,"16.2":0.00992,"16.3":0.03473,"16.4":0.01488,"16.5":0.02977,"16.6":0.13395,"17.0":0.08434,"17.1":0.14387,"17.2":0.00496},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00152,"5.0-5.1":0.00152,"6.0-6.1":0.0038,"7.0-7.1":0.00532,"8.1-8.4":0.00076,"9.0-9.2":0.00608,"9.3":0.01898,"10.0-10.2":0.00152,"10.3":0.02734,"11.0-11.2":0.01291,"11.3-11.4":0.01139,"12.0-12.1":0.00683,"12.2-12.5":0.12454,"13.0-13.1":0.00304,"13.2":0.01291,"13.3":0.00759,"13.4-13.7":0.02202,"14.0-14.4":0.05847,"14.5-14.8":0.09492,"15.0-15.1":0.03721,"15.2-15.3":0.04556,"15.4":0.05088,"15.5":0.07138,"15.6-15.7":0.37513,"16.0":0.17618,"16.1":0.35311,"16.2":0.16934,"16.3":0.31742,"16.4":0.06531,"16.5":0.16858,"16.6-16.7":2.85754,"17.0":0.85582,"17.1":1.4375,"17.2":0.04101},P:{"4":0.06183,"20":0.03091,"21":0.05152,"22":0.13396,"23":1.54571,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 12.0 14.0 15.0 16.0","7.2-7.4":0.14427,"11.1-11.2":0.0103,"13.0":0.0103,"17.0":0.04122,"18.0":0.0103,"19.0":0.02061},I:{"0":0.06017,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00004,"4.4":0,"4.4.3-4.4.4":0.00018},K:{"0":0.2973,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00504,"9":0.45885,"11":1.07402,_:"6 7 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.06551},H:{"0":0},L:{"0":41.00518},R:{_:"0"},M:{"0":0.1159},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BS.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BS.js
    index 9399ff500476c6..3c4403169a4bf1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BS.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BS.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00406,"41":0.00406,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.01625,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.00406,"68":0.00812,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0.00406,"76":0,"77":0,"78":0.00406,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.04062,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.01625,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0.00406,"113":0.00406,"114":0.04062,"115":0.05281,"116":0.02437,"117":0.41432,"118":0.04062,"119":0.00406,"120":0,"3.5":0,"3.6":0.00406},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0.00406,"40":0.00406,"41":0.00406,"42":0.00406,"43":0.00812,"44":0.00812,"45":0.00812,"46":0.00406,"47":0.00406,"48":0,"49":0.02843,"50":0,"51":0.00812,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.00406,"71":0.00406,"72":0,"73":0,"74":0,"75":0.00406,"76":0.04468,"77":0,"78":0,"79":0.00406,"80":0,"81":0,"83":0.01219,"84":0,"85":0,"86":0,"87":0.00406,"88":0.00406,"89":0,"90":0.00812,"91":0.00812,"92":0,"93":0.03656,"94":0.01219,"95":0,"96":0,"97":0,"98":0.00406,"99":0,"100":0,"101":0.00406,"102":0.00406,"103":0.11374,"104":0,"105":0.00406,"106":0.00812,"107":0.00812,"108":0.00812,"109":0.45088,"110":0.00812,"111":0.00812,"112":0.02031,"113":0.00812,"114":0.11374,"115":0.24372,"116":5.5162,"117":1.14548,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00406,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00406,"73":0,"74":0,"75":0,"76":0,"77":0.00406,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.00406,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00812,"96":0,"97":0,"98":0,"99":0,"100":0.00812,"101":0.04874,"102":0.03656,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00812,"13":0,"14":0.00406,"15":0.00406,"16":0,"17":0.00406,"18":0.00812,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00406,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00406,"108":0,"109":0.0325,"110":0,"111":0,"112":0.00406,"113":0.00812,"114":0.02843,"115":0.10967,"116":1.79134,"117":1.21048},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00406,"9":0.01625,"10":0,"11":0,"12":0,"13":0,"14":0.02031,"15":0.00406,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.01219,"13.1":0.05687,"14.1":0.09343,"15.1":0.02031,"15.2-15.3":0.01625,"15.4":0.03656,"15.5":0.04874,"15.6":0.26809,"16.0":0.0325,"16.1":0.08936,"16.2":0.06905,"16.3":0.19904,"16.4":0.09749,"16.5":0.25591,"16.6":1.72229,"17.0":0.06499,"17.1":0.00406},G:{"8":0.01805,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.01805,"8.1-8.4":0.0361,"9.0-9.2":0,"9.3":0.04964,"10.0-10.2":0,"10.3":0.08123,"11.0-11.2":0.07671,"11.3-11.4":0,"12.0-12.1":0.19855,"12.2-12.5":0.20758,"13.0-13.1":0.00451,"13.2":0,"13.3":0.00903,"13.4-13.7":0.01354,"14.0-14.4":0.09025,"14.5-14.8":0.27075,"15.0-15.1":0.05866,"15.2-15.3":0.27978,"15.4":0.23465,"15.5":0.37905,"15.6-15.7":2.72557,"16.0":1.13265,"16.1":3.0595,"16.2":1.26802,"16.3":2.48641,"16.4":0.32039,"16.5":1.30412,"16.6":28.27106,"17.0":1.94039,"17.1":0.00451},P:{"4":0.02056,"20":0.0925,"21":0.16444,"22":4.00834,"5.0-5.4":0,"6.2-6.4":0.01028,"7.2-7.4":0.185,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.03083,"12.0":0.01028,"13.0":0.02056,"14.0":0.02056,"15.0":0,"16.0":0.02056,"17.0":0.02056,"18.0":0.04111,"19.0":0.04111},I:{"0":0,"3":0.00869,"4":0.05649,"2.1":0.01086,"2.2":0.03476,"2.3":0.0478,"4.1":0.04345,"4.2-4.3":0.0717,"4.4":0,"4.4.3-4.4.4":0.28245},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0.00406,"8":0.04468,"9":0.00812,"10":0.00812,"11":0.04062,"5.5":0},S:{"2.5":0.00594,_:"3.0-3.1"},J:{"7":0,"10":0.01188},N:{"10":0.01188,"11":0.01188},L:{"0":32.26173},R:{_:"0"},M:{"0":0.10095},Q:{"13.1":0},O:{"0":0.0475},H:{"0":0.06746}};
    +module.exports={C:{"48":0.02448,"95":0.00612,"102":0.00306,"111":0.00306,"115":0.08874,"117":0.00306,"118":0.01836,"119":0.37332,"120":0.07956,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 103 104 105 106 107 108 109 110 112 113 114 116 121 122 123 3.5 3.6"},D:{"43":0.00306,"44":0.00306,"45":0.00306,"46":0.00306,"49":0.02754,"51":0.00306,"71":0.00306,"75":0.00306,"76":0.06426,"81":0.00306,"83":0.00612,"84":0.00306,"87":0.00612,"88":0.00612,"90":0.0612,"91":0.01224,"93":0.02754,"94":0.00918,"95":0.00306,"98":0.01224,"100":0.00306,"102":0.00306,"103":0.0918,"104":0.00306,"105":0.00306,"106":0.00918,"107":0.00612,"108":0.01224,"109":0.4437,"110":0.00612,"111":0.00612,"112":0.01224,"113":0.00306,"114":0.0306,"115":0.03672,"116":0.24786,"117":0.1836,"118":1.79622,"119":4.93884,"120":0.00612,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 47 48 50 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 72 73 74 77 78 79 80 85 86 89 92 96 97 99 101 121 122"},F:{"95":0.00306,"102":0.06426,"103":0.00918,"104":0.0459,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00306,"16":0.00306,"18":0.00612,"92":0.00306,"107":0.00612,"109":0.02754,"113":0.00612,"114":0.00306,"115":0.02754,"116":0.00918,"117":0.05202,"118":0.52938,"119":2.37456,_:"13 14 15 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 108 110 111 112"},E:{"9":0.00612,"13":0.00306,"14":0.02142,_:"0 4 5 6 7 8 10 11 12 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.01836,"13.1":0.11322,"14.1":0.14688,"15.1":0.0459,"15.2-15.3":0.04896,"15.4":0.2907,"15.5":0.3366,"15.6":1.5912,"16.0":0.04896,"16.1":0.28152,"16.2":0.60588,"16.3":0.97308,"16.4":0.22032,"16.5":0.60894,"16.6":7.70508,"17.0":1.04958,"17.1":3.50982,"17.2":0.07038},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.01152,"5.0-5.1":0.01152,"6.0-6.1":0.02879,"7.0-7.1":0.04031,"8.1-8.4":0.00576,"9.0-9.2":0.04606,"9.3":0.14395,"10.0-10.2":0.01152,"10.3":0.20729,"11.0-11.2":0.09789,"11.3-11.4":0.08637,"12.0-12.1":0.05182,"12.2-12.5":0.94433,"13.0-13.1":0.02303,"13.2":0.09789,"13.3":0.05758,"13.4-13.7":0.16699,"14.0-14.4":0.44338,"14.5-14.8":0.71976,"15.0-15.1":0.28215,"15.2-15.3":0.34549,"15.4":0.38579,"15.5":0.54126,"15.6-15.7":2.84451,"16.0":1.33588,"16.1":2.67752,"16.2":1.28406,"16.3":2.40689,"16.4":0.4952,"16.5":1.2783,"16.6-16.7":21.6678,"17.0":6.4894,"17.1":10.90012,"17.2":0.31094},P:{"20":0.03089,"21":0.04119,"22":0.08237,"23":1.58571,_:"4 5.0-5.4 6.2-6.4 8.2 9.2 10.1 12.0 14.0 15.0 18.0","7.2-7.4":0.08237,"11.1-11.2":0.0103,"13.0":0.0103,"16.0":0.02059,"17.0":0.0103,"19.0":0.02059},I:{"0":0.03453,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.0001},K:{"0":0.02776,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00918,"9":0.00306,"10":0.00306,"11":0.0306,_:"6 7 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.00694},H:{"0":0},L:{"0":10.17052},R:{_:"0"},M:{"0":0.04858},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BT.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BT.js
    index 98f3363fb8fcf4..dfb0fbbb7948a0 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BT.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BT.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0.00312,"3":0.00937,"4":0.00937,"5":0.00312,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00312,"12":0.00312,"13":0.00312,"14":0.00312,"15":0,"16":0,"17":0.00312,"18":0,"19":0.00312,"20":0.00312,"21":0.00312,"22":0.00312,"23":0.00312,"24":0.00312,"25":0,"26":0,"27":0.00312,"28":0.00312,"29":0.00312,"30":0,"31":0.00312,"32":0,"33":0.00312,"34":0.00312,"35":0.00625,"36":0.00312,"37":0.00625,"38":0.00312,"39":0.00937,"40":0.01562,"41":0.00625,"42":0.00312,"43":0.00312,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00937,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0.00937,"115":0.04997,"116":0.01562,"117":0.31542,"118":0.01249,"119":0,"120":0,"3.5":0.00312,"3.6":0.01874},D:{"4":0.00312,"5":0.00312,"6":0.00312,"7":0.00312,"8":0,"9":0,"10":0.00312,"11":0.00312,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00312,"18":0.00312,"19":0.00312,"20":0.00312,"21":0.00937,"22":0,"23":0,"24":0,"25":0.00312,"26":0,"27":0.00312,"28":0.00312,"29":0.00312,"30":0.00312,"31":0.00937,"32":0.00312,"33":0.00625,"34":0.00312,"35":0.00312,"36":0.00625,"37":0.00937,"38":0.00625,"39":0.01562,"40":0.00937,"41":0.01562,"42":0.00937,"43":0.02498,"44":0.02811,"45":0.03748,"46":0.02186,"47":0.01874,"48":0,"49":0,"50":0,"51":0.02498,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00625,"67":0,"68":0,"69":0,"70":0.00937,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.00312,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0.00937,"88":0.00312,"89":0,"90":0,"91":0,"92":0,"93":0.00312,"94":0.00312,"95":0,"96":0,"97":0,"98":0.02498,"99":0.01249,"100":0.00312,"101":0,"102":0,"103":0.02811,"104":0,"105":0.00312,"106":0.00312,"107":0.00312,"108":0.00312,"109":0.54028,"110":0.00312,"111":0.00312,"112":0.00937,"113":0.05934,"114":0.03435,"115":0.09057,"116":4.32848,"117":1.01498,"118":0.00625,"119":0,"120":0},F:{"9":0,"11":0.00312,"12":0.00312,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00312,"30":0.00625,"31":0.00937,"32":0.00625,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00312,"70":0.00312,"71":0.00312,"72":0.09057,"73":0.00937,"74":0,"75":0,"76":0,"77":0.03748,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00312,"101":0.01249,"102":0.01562,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00625},B:{"12":0.01874,"13":0,"14":0.01874,"15":0,"16":0,"17":0,"18":0.00312,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00312,"93":0,"94":0,"95":0,"96":0.00312,"97":0,"98":0.00312,"99":0,"100":0,"101":0.00625,"102":0.00312,"103":0.00625,"104":0,"105":0.00312,"106":0.00937,"107":0.02811,"108":0,"109":0.00312,"110":0.00625,"111":0.01874,"112":0.00937,"113":0.02498,"114":0.01874,"115":0.03123,"116":0.49343,"117":0.32479},E:{"4":0.00625,"5":0.00312,"6":0,"7":0.00312,"8":0.00625,"9":0.05309,"10":0,"11":0,"12":0,"13":0.00937,"14":0.02186,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00625,"6.1":0,"7.1":0.00312,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00312,"14.1":0.02811,"15.1":0.00312,"15.2-15.3":0.00312,"15.4":0.01249,"15.5":0.00625,"15.6":0.11555,"16.0":0,"16.1":0.02498,"16.2":0.00625,"16.3":0.00937,"16.4":0.00625,"16.5":0.01562,"16.6":0.11867,"17.0":0.00625,"17.1":0},G:{"8":0.00987,"3.2":0.00423,"4.0-4.1":0,"4.2-4.3":0.01269,"5.0-5.1":0.0275,"6.0-6.1":0.01693,"7.0-7.1":0.11636,"8.1-8.4":0.1749,"9.0-9.2":0.0134,"9.3":0.03385,"10.0-10.2":0.00141,"10.3":0.03667,"11.0-11.2":0.35967,"11.3-11.4":0.00141,"12.0-12.1":0.10719,"12.2-12.5":0.09027,"13.0-13.1":0,"13.2":0.00212,"13.3":0.00705,"13.4-13.7":0.00564,"14.0-14.4":0.15797,"14.5-14.8":0.07828,"15.0-15.1":0.0134,"15.2-15.3":0.05219,"15.4":0.01975,"15.5":0.04937,"15.6-15.7":0.69112,"16.0":0.34556,"16.1":0.17419,"16.2":0.19041,"16.3":0.22215,"16.4":0.26164,"16.5":0.66362,"16.6":2.77648,"17.0":0.30536,"17.1":0},P:{"4":0.46071,"20":0.10471,"21":0.11518,"22":0.69107,"5.0-5.4":0,"6.2-6.4":0.06282,"7.2-7.4":0.08377,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0.01047,"14.0":0,"15.0":0.01047,"16.0":0.04188,"17.0":0.01047,"18.0":0,"19.0":0.03141},I:{"0":0,"3":0.01139,"4":0.15945,"2.1":0.01898,"2.2":0.08352,"2.3":0.11389,"4.1":0.11769,"4.2-4.3":0.23159,"4.4":0,"4.4.3-4.4.4":0.44039},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.00629,"7":0.02202,"8":0.21074,"9":0.04403,"10":0.03774,"11":0.10065,"5.5":0.00315},S:{"2.5":0.02063,_:"3.0-3.1"},J:{"7":0,"10":0.04814},N:{"10":0.08315,"11":0.04751},L:{"0":76.42468},R:{_:"0"},M:{"0":0.03439},Q:{"13.1":0},O:{"0":1.87054},H:{"0":0.65107}};
    +module.exports={C:{"2":0.00788,"3":0.01313,"4":0.00525,"6":0.00263,"9":0.00263,"10":0.00263,"12":0.00263,"13":0.00263,"16":0.00525,"17":0.00263,"19":0.00263,"20":0.00263,"22":0.00263,"23":0.0105,"24":0.00263,"25":0.00263,"26":0.00525,"27":0.00263,"28":0.00263,"29":0.00263,"30":0.00263,"31":0.00788,"32":0.00263,"33":0.00263,"34":0.00788,"35":0.00263,"38":0.00788,"39":0.00525,"40":0.02625,"41":0.00788,"42":0.00263,"57":0.00263,"100":0.0105,"112":0.00263,"115":0.17588,"116":0.00525,"118":0.01575,"119":0.62475,"120":0.28088,"121":0.00525,_:"5 7 8 11 14 15 18 21 36 37 43 44 45 46 47 48 49 50 51 52 53 54 55 56 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 101 102 103 104 105 106 107 108 109 110 111 113 114 117 122 123","3.5":0.00788,"3.6":0.01575},D:{"4":0.00525,"10":0.00263,"11":0.00263,"12":0.00263,"13":0.00263,"17":0.00263,"19":0.00263,"20":0.00263,"21":0.00788,"22":0.00263,"28":0.00525,"30":0.00263,"31":0.00788,"32":0.00263,"33":0.00788,"34":0.00788,"35":0.00263,"36":0.00263,"37":0.00788,"38":0.00263,"39":0.01575,"40":0.00788,"41":0.02625,"42":0.02888,"43":0.02625,"44":0.03675,"45":0.03413,"46":0.03938,"47":0.01838,"49":0.00263,"51":0.0525,"57":0.00263,"58":0.00788,"66":0.00788,"70":0.02363,"71":0.00263,"75":0.00263,"77":0.00263,"78":0.00263,"79":0.00525,"80":0.00263,"81":0.0105,"83":0.00263,"84":0.00263,"87":0.0315,"91":0.01575,"92":0.00263,"93":0.00263,"97":0.00263,"98":0.01838,"99":0.00525,"103":0.06563,"105":0.03938,"107":0.01838,"108":0.00263,"109":1.8375,"110":0.06825,"111":0.0315,"112":0.00525,"113":0.11813,"114":0.03413,"115":0.021,"116":0.17325,"117":0.23625,"118":3.02138,"119":13.42163,"120":0.01838,"121":0.01313,_:"5 6 7 8 9 14 15 16 18 23 24 25 26 27 29 48 50 52 53 54 55 56 59 60 61 62 63 64 65 67 68 69 72 73 74 76 85 86 88 89 90 94 95 96 100 101 102 104 106 122"},F:{"15":0.00263,"19":0.00263,"20":0.00263,"26":0.00263,"29":0.00263,"30":0.00525,"31":0.0105,"32":0.00525,"95":0.00525,"102":0.02888,"103":0.02363,"104":0.03675,_:"9 11 12 16 17 18 21 22 23 24 25 27 28 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1","11.5":0.00263,"11.6":0.00263,"12.1":0.00788},B:{"12":0.0105,"16":0.00263,"18":0.0105,"84":0.00788,"89":0.00525,"92":0.0105,"93":0.00263,"96":0.00525,"98":0.00525,"100":0.00263,"101":0.00525,"102":0.00263,"103":0.00525,"105":0.00525,"106":0.00263,"107":0.07875,"108":0.00263,"109":0.00788,"110":0.0105,"111":0.01575,"112":0.0105,"113":0.02625,"114":0.0105,"115":0.02625,"116":0.02625,"117":0.084,"118":0.46463,"119":1.7115,_:"13 14 15 17 79 80 81 83 85 86 87 88 90 91 94 95 97 99 104"},E:{"4":0.00525,"5":0.00263,"6":0.00263,"7":0.00263,"8":0.00525,"9":0.08138,"13":0.01838,"14":0.01313,_:"0 10 11 12 15 3.1 3.2 6.1 9.1 10.1 11.1 17.2","5.1":0.00525,"7.1":0.00263,"12.1":0.00263,"13.1":0.00788,"14.1":0.05513,"15.1":0.00788,"15.2-15.3":0.00525,"15.4":0.0105,"15.5":0.00525,"15.6":0.10763,"16.0":0.00788,"16.1":0.0525,"16.2":0.03675,"16.3":0.0735,"16.4":0.00263,"16.5":0.063,"16.6":0.147,"17.0":0.22838,"17.1":0.7455},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00105,"5.0-5.1":0.00105,"6.0-6.1":0.00262,"7.0-7.1":0.00367,"8.1-8.4":0.00052,"9.0-9.2":0.00419,"9.3":0.01309,"10.0-10.2":0.00105,"10.3":0.01885,"11.0-11.2":0.0089,"11.3-11.4":0.00785,"12.0-12.1":0.00471,"12.2-12.5":0.08587,"13.0-13.1":0.00209,"13.2":0.0089,"13.3":0.00524,"13.4-13.7":0.01519,"14.0-14.4":0.04032,"14.5-14.8":0.06545,"15.0-15.1":0.02566,"15.2-15.3":0.03142,"15.4":0.03508,"15.5":0.04922,"15.6-15.7":0.25867,"16.0":0.12148,"16.1":0.24349,"16.2":0.11677,"16.3":0.21888,"16.4":0.04503,"16.5":0.11624,"16.6-16.7":1.9704,"17.0":0.59013,"17.1":0.99122,"17.2":0.02828},P:{"4":0.52338,"20":0.11289,"21":0.07184,"22":0.35918,"23":0.82099,_:"5.0-5.4 8.2 9.2 11.1-11.2 12.0 14.0 15.0","6.2-6.4":0.04105,"7.2-7.4":0.12315,"10.1":0.02052,"13.0":0.02052,"16.0":0.02052,"17.0":0.01026,"18.0":0.01026,"19.0":0.04105},I:{"0":0.45496,"3":0.00005,"4":0.00009,"2.1":0,"2.2":0.00009,"2.3":0,"4.1":0.00005,"4.2-4.3":0.00032,"4.4":0,"4.4.3-4.4.4":0.00137},K:{"0":0.3835,_:"10 11 12 11.1 11.5 12.1"},A:{"6":0.01313,"7":0.02888,"8":0.21525,"9":0.02625,"10":0.03675,"11":0.1155,"5.5":0.00263},N:{_:"10 11"},S:{"2.5":0.02213,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":1.64463},H:{"0":0},L:{"0":63.73675},R:{_:"0"},M:{"0":0.0295},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BW.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BW.js
    index 26c1620ceacd7e..f26e37c7638b4f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BW.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BW.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00783,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0.00392,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00783,"50":0,"51":0,"52":0.01175,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.00392,"61":0,"62":0,"63":0,"64":0,"65":0.00392,"66":0,"67":0,"68":0.00392,"69":0,"70":0,"71":0,"72":0.00392,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00783,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00392,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.00392,"92":0.00392,"93":0,"94":0.00392,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.01958,"103":0.00392,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0.00392,"114":0.01958,"115":0.09788,"116":0.05873,"117":0.40716,"118":0.02741,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00392,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00392,"47":0,"48":0,"49":0.00783,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.00392,"64":0,"65":0,"66":0.00392,"67":0,"68":0,"69":0.00783,"70":0.00783,"71":0,"72":0,"73":0,"74":0.00783,"75":0.00392,"76":0,"77":0,"78":0.00392,"79":0.00392,"80":0.00392,"81":0.04698,"83":0.00392,"84":0,"85":0,"86":0.00392,"87":0.00392,"88":0.01566,"89":0,"90":0.00392,"91":0,"92":0.00392,"93":0.00392,"94":0,"95":0.01175,"96":0.00392,"97":0.00392,"98":0.00392,"99":0.01175,"100":0.00392,"101":0,"102":0.00392,"103":0.01566,"104":0.03915,"105":0.00392,"106":0.01175,"107":0.00392,"108":0.01566,"109":0.81824,"110":0.00783,"111":0.01175,"112":0.01958,"113":0.03915,"114":0.13703,"115":0.24665,"116":6.53414,"117":1.32719,"118":0.00392,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00392,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0.00392,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00392,"69":0.02741,"70":0.00783,"71":0.01175,"72":0.25056,"73":0.03915,"74":0,"75":0,"76":0,"77":0.02741,"78":0.00392,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01566,"96":0,"97":0,"98":0,"99":0.00392,"100":0.01175,"101":0.16052,"102":0.11745,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00392,"13":0.00392,"14":0.00392,"15":0.00392,"16":0.00783,"17":0.00392,"18":0.01175,"79":0,"80":0.00392,"81":0,"83":0,"84":0.00392,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.00392,"91":0,"92":0.04698,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00392,"101":0,"102":0,"103":0,"104":0.00392,"105":0,"106":0,"107":0.00783,"108":0,"109":0.04307,"110":0.00783,"111":0.00783,"112":0.00392,"113":0.01175,"114":0.03915,"115":0.09396,"116":1.12361,"117":0.71253},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00392,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00392,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.01566,"14.1":0.00783,"15.1":0,"15.2-15.3":0,"15.4":0.01175,"15.5":0.00392,"15.6":0.04307,"16.0":0.00392,"16.1":0.01958,"16.2":0.00392,"16.3":0.01175,"16.4":0.01566,"16.5":0.02741,"16.6":0.14486,"17.0":0.00783,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00123,"6.0-6.1":0.00185,"7.0-7.1":0.04677,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.05231,"10.0-10.2":0,"10.3":0.03262,"11.0-11.2":0.00062,"11.3-11.4":0,"12.0-12.1":0.00185,"12.2-12.5":0.25047,"13.0-13.1":0,"13.2":0.00492,"13.3":0.00492,"13.4-13.7":0.01846,"14.0-14.4":0.02954,"14.5-14.8":0.05169,"15.0-15.1":0.06277,"15.2-15.3":0.032,"15.4":0.10462,"15.5":0.04739,"15.6-15.7":0.9422,"16.0":0.11693,"16.1":0.23693,"16.2":0.12616,"16.3":0.26955,"16.4":0.056,"16.5":0.29171,"16.6":2.93368,"17.0":0.32125,"17.1":0},P:{"4":0.21679,"20":0.04129,"21":0.20646,"22":1.52783,"5.0-5.4":0,"6.2-6.4":0.01032,"7.2-7.4":0.24776,"8.2":0,"9.2":0.01032,"10.1":0,"11.1-11.2":0.02065,"12.0":0.01032,"13.0":0.01032,"14.0":0.03097,"15.0":0.08259,"16.0":0.04129,"17.0":0.07226,"18.0":0.05162,"19.0":0.07226},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.09741},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01958,"5.5":0},S:{"2.5":0.1217,_:"3.0-3.1"},J:{"7":0,"10":0.00609},N:{"10":0,"11":0},L:{"0":73.13617},R:{_:"0"},M:{"0":0.12779},Q:{"13.1":0.01826},O:{"0":1.04054},H:{"0":1.22131}};
    +module.exports={C:{"21":0.00367,"34":0.04041,"37":0.00367,"40":0.00367,"43":0.00367,"49":0.0147,"52":0.06981,"60":0.00735,"78":0.00735,"88":0.00367,"90":0.00367,"93":0.00367,"95":0.00367,"98":0.00367,"99":0.00367,"100":0.03674,"102":0.00367,"103":0.00735,"113":0.00735,"115":0.29392,"116":0.00367,"117":0.00735,"118":0.05878,"119":0.95157,"120":0.24616,"121":0.00367,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 22 23 24 25 26 27 28 29 30 31 32 33 35 36 38 39 41 42 44 45 46 47 48 50 51 53 54 55 56 57 58 59 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 91 92 94 96 97 101 104 105 106 107 108 109 110 111 112 114 122 123 3.5 3.6"},D:{"11":0.00735,"40":0.00367,"43":0.01102,"49":0.02939,"50":0.00367,"57":0.00367,"63":0.00367,"64":0.00367,"66":0.01102,"67":0.00735,"68":0.00367,"69":0.00367,"70":0.00367,"72":0.01102,"73":0.00735,"74":0.01102,"75":0.0147,"79":0.0147,"80":0.00367,"81":0.00735,"83":0.01102,"85":0.00735,"86":0.0147,"87":0.01837,"88":0.02204,"89":0.00367,"90":0.04041,"91":0.00367,"92":0.01102,"93":0.02204,"94":0.01102,"95":0.04041,"96":0.00367,"97":0.0147,"98":0.00735,"99":0.04041,"100":0.00735,"101":0.00735,"102":0.05144,"103":0.04776,"104":0.06981,"105":0.00367,"106":0.00735,"107":0.01102,"108":0.02204,"109":1.76719,"110":0.01102,"111":0.01102,"112":0.02939,"113":0.05878,"114":0.0845,"115":0.05511,"116":0.29025,"117":0.45925,"118":4.53372,"119":16.07742,"120":0.03674,"121":0.00367,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 41 42 44 45 46 47 48 51 52 53 54 55 56 58 59 60 61 62 65 71 76 77 78 84 122"},F:{"37":0.00367,"64":0.00367,"79":0.00367,"95":0.03674,"99":0.00367,"101":0.00367,"102":0.09185,"103":0.10287,"104":0.34168,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00367,"13":0.01102,"14":0.00735,"15":0.00735,"16":0.01837,"17":0.00735,"18":0.04776,"80":0.00367,"84":0.00367,"89":0.00735,"90":0.01102,"92":0.10287,"100":0.00735,"107":0.00735,"108":0.00367,"109":0.05878,"110":0.00735,"111":0.01837,"112":0.02572,"113":0.01837,"114":0.05878,"115":0.04041,"116":0.08083,"117":0.15798,"118":1.08016,"119":3.59685,_:"79 81 83 85 86 87 88 91 93 94 95 96 97 98 99 101 102 103 104 105 106"},E:{"13":0.00367,"14":0.06613,_:"0 4 5 6 7 8 9 10 11 12 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1","5.1":0.00367,"12.1":0.00367,"13.1":0.02572,"14.1":0.02572,"15.1":0.00367,"15.2-15.3":0.00367,"15.4":0.0147,"15.5":0.00367,"15.6":0.06613,"16.0":0.00367,"16.1":0.05511,"16.2":0.0147,"16.3":0.02572,"16.4":0.04409,"16.5":0.02572,"16.6":0.20207,"17.0":0.08083,"17.1":0.12492,"17.2":0.00367},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00074,"5.0-5.1":0.00074,"6.0-6.1":0.00186,"7.0-7.1":0.0026,"8.1-8.4":0.00037,"9.0-9.2":0.00297,"9.3":0.00928,"10.0-10.2":0.00074,"10.3":0.01337,"11.0-11.2":0.00631,"11.3-11.4":0.00557,"12.0-12.1":0.00334,"12.2-12.5":0.06089,"13.0-13.1":0.00149,"13.2":0.00631,"13.3":0.00371,"13.4-13.7":0.01077,"14.0-14.4":0.02859,"14.5-14.8":0.04641,"15.0-15.1":0.01819,"15.2-15.3":0.02228,"15.4":0.02488,"15.5":0.0349,"15.6-15.7":0.18341,"16.0":0.08614,"16.1":0.17264,"16.2":0.08279,"16.3":0.15519,"16.4":0.03193,"16.5":0.08242,"16.6-16.7":1.39712,"17.0":0.41843,"17.1":0.70283,"17.2":0.02005},P:{"4":0.23607,"20":0.04106,"21":0.13343,"22":0.26687,"23":1.4267,_:"5.0-5.4 8.2 9.2 10.1 12.0","6.2-6.4":0.02053,"7.2-7.4":0.21555,"11.1-11.2":0.01026,"13.0":0.02053,"14.0":0.16422,"15.0":0.01026,"16.0":0.09238,"17.0":0.06158,"18.0":0.02053,"19.0":0.16422},I:{"0":0.06923,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00005,"4.4":0,"4.4.3-4.4.4":0.00021},K:{"0":1.09645,_:"10 11 12 11.1 11.5 12.1"},A:{"10":0.00367,"11":0.07348,_:"6 7 8 9 5.5"},N:{_:"10 11"},S:{"2.5":0.10753,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.75268},H:{"0":0.08},L:{"0":57.93213},R:{_:"0"},M:{"0":0.1012},Q:{"13.1":0.00633}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BY.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BY.js
    index 30b9d94d254183..6579e7dbf74997 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BY.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BY.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.03719,"46":0,"47":0,"48":0.00465,"49":0.05114,"50":0.00465,"51":0.00465,"52":0.08833,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0.00465,"63":0,"64":0.00465,"65":0,"66":0,"67":0,"68":0.00465,"69":0,"70":0.01395,"71":0,"72":0,"73":0,"74":0.0093,"75":0,"76":0.0093,"77":0,"78":0.01395,"79":0,"80":0,"81":0.0093,"82":0,"83":0,"84":0.0093,"85":0,"86":0,"87":0.0093,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0.00465,"97":0.01395,"98":0,"99":0.00465,"100":0.00465,"101":0.02325,"102":0.0186,"103":0,"104":0.07438,"105":0.04184,"106":0.0093,"107":0.0093,"108":0.00465,"109":0.00465,"110":0.01395,"111":0,"112":0.01395,"113":0.0093,"114":0.0093,"115":0.42771,"116":0.05114,"117":0.56718,"118":0.05579,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.06044,"50":0,"51":0.06509,"52":0,"53":0.00465,"54":0,"55":0.0093,"56":0,"57":0,"58":0.0186,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00465,"65":0,"66":0,"67":0.01395,"68":0,"69":0,"70":0.00465,"71":0.02325,"72":0,"73":0.0093,"74":0.0093,"75":0.05114,"76":0.09763,"77":0.01395,"78":0.08833,"79":0.06044,"80":0.10228,"81":0.06044,"83":0.09763,"84":0.02325,"85":0.02325,"86":0.09298,"87":0.13947,"88":0.01395,"89":0.03254,"90":0.29754,"91":0.11623,"92":0.00465,"93":0.07438,"94":0.0093,"95":0.04649,"96":0.05114,"97":0.03719,"98":0.03719,"99":0.02325,"100":0.03719,"101":0.05114,"102":0.13017,"103":0.07438,"104":0.03719,"105":0.06974,"106":0.13947,"107":0.14877,"108":0.06509,"109":1.49698,"110":0.02325,"111":0.08833,"112":0.08368,"113":0.05579,"114":0.36727,"115":0.27894,"116":4.82566,"117":1.43189,"118":0.00465,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.01395,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00465,"57":0,"58":0,"60":0.02789,"62":0.01395,"63":0.02325,"64":0,"65":0.00465,"66":0,"67":0.00465,"68":0.00465,"69":0.01395,"70":0.00465,"71":0,"72":0.02325,"73":0.05114,"74":0.01395,"75":0,"76":0,"77":0.07438,"78":0,"79":0.04649,"80":0.00465,"81":0,"82":0.01395,"83":0.0186,"84":0.00465,"85":0.04184,"86":0.03719,"87":0.04649,"88":0,"89":0.0093,"90":0,"91":0,"92":0,"93":0,"94":0.00465,"95":0.46955,"96":0.00465,"97":0.06509,"98":0,"99":0.01395,"100":0.08368,"101":0.81822,"102":0.80428,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0.0093,"12.1":0.00465},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00465,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.05579,"91":0,"92":0.00465,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0.00465,"106":0.0093,"107":0,"108":0.00465,"109":0.02325,"110":0.00465,"111":0,"112":0,"113":0.0093,"114":0.01395,"115":0.05579,"116":0.40911,"117":0.27894},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00465,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.0093,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00465,"13.1":0.0093,"14.1":0.02325,"15.1":0.00465,"15.2-15.3":0.00465,"15.4":0.0093,"15.5":0.02789,"15.6":0.13482,"16.0":0.0093,"16.1":0.04184,"16.2":0.02789,"16.3":0.09763,"16.4":0.03254,"16.5":0.09763,"16.6":0.71595,"17.0":0.08368,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0.01708,"9.3":0.03757,"10.0-10.2":0,"10.3":0.02391,"11.0-11.2":0.02049,"11.3-11.4":0,"12.0-12.1":0.00683,"12.2-12.5":0.14346,"13.0-13.1":0,"13.2":0,"13.3":11.84195,"13.4-13.7":0.03757,"14.0-14.4":0.09905,"14.5-14.8":0.22543,"15.0-15.1":0.09905,"15.2-15.3":0.1093,"15.4":0.10588,"15.5":0.17761,"15.6-15.7":1.92299,"16.0":0.86074,"16.1":1.34917,"16.2":0.63531,"16.3":1.10666,"16.4":0.22543,"16.5":0.76851,"16.6":12.30306,"17.0":1.81028,"17.1":0},P:{"4":0.03211,"20":0.0214,"21":0.04281,"22":0.57791,"5.0-5.4":0,"6.2-6.4":0.19264,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0.0107,"14.0":0,"15.0":0,"16.0":0,"17.0":0.0214,"18.0":0,"19.0":0.0214},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.008,"4.4":0,"4.4.3-4.4.4":0.032},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00501,"9":0,"10":0,"11":0.06008,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":39.36212},R:{_:"0"},M:{"0":0.07491},Q:{"13.1":0},O:{"0":0.12842},H:{"0":0.79029}};
    +module.exports={C:{"43":0.00448,"50":0.00448,"51":0.00448,"52":0.21075,"53":0.00448,"56":0.00448,"60":0.00448,"64":0.02242,"68":0.00448,"72":0.00448,"78":0.00448,"85":0.00448,"88":0.00448,"91":0.00897,"96":0.01794,"98":0.00448,"99":0.00448,"100":0.00448,"101":0.00448,"102":0.01794,"104":0.03139,"105":0.07174,"106":0.00448,"107":0.00448,"108":0.02242,"109":0.00897,"110":0.00448,"111":0.00897,"112":0.00448,"113":0.01794,"114":0.01794,"115":0.87438,"116":0.00448,"117":0.01345,"118":0.05381,"119":1.1479,"120":0.33182,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 44 45 46 47 48 49 54 55 57 58 59 61 62 63 65 66 67 69 70 71 73 74 75 76 77 79 80 81 82 83 84 86 87 89 90 92 93 94 95 97 103 121 122 123 3.5 3.6"},D:{"38":0.00448,"45":0.00448,"48":0.00448,"49":0.05829,"51":0.00448,"53":0.00448,"55":0.00897,"56":0.00448,"58":0.03139,"59":0.00448,"65":0.01794,"67":0.00448,"69":0.00448,"70":0.00448,"71":0.00448,"72":0.00448,"73":0.00448,"74":0.00448,"75":0.00897,"76":0.00897,"77":0.01345,"78":0.00448,"79":0.05381,"80":0.00897,"81":0.00448,"83":0.02242,"84":0.00897,"85":0.01345,"86":0.0269,"87":0.01345,"88":0.02242,"89":0.0269,"90":0.01794,"91":0.00897,"92":0.00897,"93":0.08968,"94":0.01345,"95":0.00448,"96":0.01345,"97":0.00897,"98":0.01794,"99":0.0269,"100":0.0269,"101":0.02242,"102":0.07174,"103":0.02242,"104":0.01794,"105":0.19281,"106":0.15694,"107":0.04932,"108":0.13004,"109":3.37197,"110":0.04484,"111":0.09865,"112":0.06726,"113":0.01794,"114":0.08968,"115":0.04036,"116":0.21972,"117":0.3632,"118":3.39439,"119":13.25022,"120":0.00448,"121":0.00897,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 46 47 50 52 54 57 60 61 62 63 64 66 68 122"},F:{"35":0.00448,"36":0.03587,"42":0.00448,"53":0.00448,"56":0.01345,"57":0.00448,"64":0.00448,"68":0.00448,"73":0.00897,"75":0.00448,"79":0.05829,"80":0.01345,"81":0.00448,"82":0.04484,"83":0.02242,"84":0.00897,"85":0.1121,"86":0.05381,"87":0.01345,"90":0.00448,"94":0.01345,"95":1.13894,"96":0.01794,"99":0.00448,"100":0.00897,"101":0.02242,"102":0.65018,"103":0.79367,"104":2.93254,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 37 38 39 40 41 43 44 45 46 47 48 49 50 51 52 54 55 58 60 62 63 65 66 67 69 70 71 72 74 76 77 78 88 89 91 92 93 97 98 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.00897},B:{"18":0.00448,"92":0.00897,"100":0.00448,"108":0.02242,"109":0.02242,"110":0.02242,"114":0.00897,"115":0.00448,"116":0.00448,"117":0.03587,"118":0.4484,"119":1.8205,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 101 102 103 104 105 106 107 111 112 113"},E:{"13":0.00448,"14":0.0269,_:"0 4 5 6 7 8 9 10 11 12 15 3.1 3.2 6.1 7.1 10.1","5.1":0.01345,"9.1":0.00448,"11.1":0.00448,"12.1":0.02242,"13.1":0.0269,"14.1":0.02242,"15.1":0.01794,"15.2-15.3":0.01345,"15.4":0.04932,"15.5":0.06726,"15.6":0.34975,"16.0":0.01345,"16.1":0.1121,"16.2":0.07174,"16.3":0.23765,"16.4":0.07623,"16.5":0.15694,"16.6":1.18378,"17.0":0.47979,"17.1":0.97751,"17.2":0.0269},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00336,"5.0-5.1":0.00336,"6.0-6.1":0.0084,"7.0-7.1":0.01176,"8.1-8.4":0.00168,"9.0-9.2":0.01344,"9.3":0.04199,"10.0-10.2":0.00336,"10.3":0.06047,"11.0-11.2":0.02855,"11.3-11.4":0.02519,"12.0-12.1":0.01512,"12.2-12.5":0.27546,"13.0-13.1":0.00672,"13.2":0.02855,"13.3":0.0168,"13.4-13.7":0.04871,"14.0-14.4":0.12933,"14.5-14.8":0.20995,"15.0-15.1":0.0823,"15.2-15.3":0.10078,"15.4":0.11253,"15.5":0.15788,"15.6-15.7":0.82973,"16.0":0.38967,"16.1":0.78102,"16.2":0.37456,"16.3":0.70208,"16.4":0.14445,"16.5":0.37288,"16.6-16.7":6.32042,"17.0":1.89293,"17.1":3.17952,"17.2":0.0907},P:{"4":0.03177,"20":0.03177,"21":0.02118,"22":0.14827,"23":0.77312,_:"5.0-5.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 15.0 16.0 18.0","6.2-6.4":0.27536,"14.0":0.01059,"17.0":0.02118,"19.0":0.01059},I:{"0":0.01647,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00005},K:{"0":1.17042,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00951,"11":0.14743,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.11584},H:{"0":0.01},L:{"0":33.79529},R:{_:"0"},M:{"0":0.09377},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BZ.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BZ.js
    index 0e48dee60647d8..1b882c809de7b0 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BZ.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/BZ.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0.00485,"3":0.02424,"4":0.00485,"5":0,"6":0.00485,"7":0,"8":0,"9":0,"10":0.00485,"11":0.00485,"12":0.00485,"13":0.00485,"14":0,"15":0.00485,"16":0.00485,"17":0.00485,"18":0,"19":0,"20":0,"21":0.00969,"22":0,"23":0.00485,"24":0.00969,"25":0,"26":0.00485,"27":0,"28":0,"29":0.00485,"30":0.00485,"31":0.00485,"32":0.00485,"33":0.00485,"34":0.00485,"35":0.00969,"36":0.00485,"37":0.00485,"38":0.00969,"39":0.00969,"40":0.02424,"41":0.00485,"42":0.00485,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.00969,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.01454,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00485,"109":0.02424,"110":0,"111":0,"112":0,"113":0,"114":0.00485,"115":0.07271,"116":0.05816,"117":0.32475,"118":0.07271,"119":0,"120":0,"3.5":0.00485,"3.6":0.02424},D:{"4":0.00485,"5":0,"6":0,"7":0.00485,"8":0,"9":0,"10":0.00485,"11":0.00485,"12":0.00485,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0.00485,"20":0,"21":0.00969,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0.00485,"28":0,"29":0.00485,"30":0.00485,"31":0.00969,"32":0.00485,"33":0.00485,"34":0.00485,"35":0.00485,"36":0.00485,"37":0.00969,"38":0.00485,"39":0.02424,"40":0.01939,"41":0.02424,"42":0.01939,"43":0.03878,"44":0.05816,"45":0.02908,"46":0.03878,"47":0.02908,"48":0,"49":0,"50":0,"51":0.03393,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.02908,"71":0,"72":0.01454,"73":0,"74":0,"75":0.03878,"76":0.02908,"77":0,"78":0,"79":0.00485,"80":0,"81":0,"83":0,"84":0.00485,"85":0,"86":0,"87":0,"88":0.00485,"89":0,"90":0,"91":0.03393,"92":0.00485,"93":0.0824,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00485,"100":0,"101":0,"102":0.00485,"103":0.10179,"104":0,"105":0.00485,"106":0,"107":0.02424,"108":2.51559,"109":0.47016,"110":0.00485,"111":0.00969,"112":0.01939,"113":0.02424,"114":0.09694,"115":0.18419,"116":8.23505,"117":2.05028,"118":0,"119":0.00485,"120":0},F:{"9":0,"11":0.00485,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0.00485,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00969,"31":0.01454,"32":0.00485,"33":0.00485,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00969,"73":0.00485,"74":0,"75":0,"76":0,"77":0.01454,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.02908,"101":0.07755,"102":0.10179,"9.5-9.6":0.00485,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00969},B:{"12":0.01939,"13":0,"14":0.01939,"15":0,"16":0.00485,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00485,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.02908,"110":0,"111":0.00485,"112":0,"113":0.00969,"114":0.00969,"115":0.03393,"116":0.98394,"117":0.67858},E:{"4":0.01939,"5":0.00485,"6":0.00485,"7":0.00485,"8":0.00969,"9":0.0824,"10":0,"11":0,"12":0,"13":0,"14":0.05816,"15":0.00485,_:"0","3.1":0,"3.2":0,"5.1":0.00969,"6.1":0.00485,"7.1":0.00485,"9.1":0.06786,"10.1":0,"11.1":0,"12.1":0.00485,"13.1":0.01939,"14.1":0.01454,"15.1":0.02424,"15.2-15.3":0.01939,"15.4":0.04362,"15.5":0.03393,"15.6":0.47016,"16.0":0.03878,"16.1":0.06786,"16.2":0.02908,"16.3":0.1551,"16.4":0.07755,"16.5":0.28597,"16.6":1.19236,"17.0":0.10179,"17.1":0},G:{"8":0.01751,"3.2":0.00292,"4.0-4.1":0,"4.2-4.3":0.01167,"5.0-5.1":0.02334,"6.0-6.1":0.01459,"7.0-7.1":0.09921,"8.1-8.4":0.17216,"9.0-9.2":0.01459,"9.3":0.1634,"10.0-10.2":0,"10.3":0.09629,"11.0-11.2":0.43477,"11.3-11.4":0.11672,"12.0-12.1":0.11088,"12.2-12.5":0.20134,"13.0-13.1":0,"13.2":0,"13.3":0.00292,"13.4-13.7":0.00584,"14.0-14.4":0.13714,"14.5-14.8":0.11672,"15.0-15.1":0.06419,"15.2-15.3":0.49313,"15.4":0.33556,"15.5":0.35015,"15.6-15.7":2.03963,"16.0":0.69447,"16.1":0.7324,"16.2":0.57483,"16.3":2.27014,"16.4":0.18675,"16.5":0.82869,"16.6":16.53296,"17.0":1.91708,"17.1":0.00584},P:{"4":0.23139,"20":0.03155,"21":0.06311,"22":1.7775,"5.0-5.4":0.02104,"6.2-6.4":0.04207,"7.2-7.4":0.06311,"8.2":0,"9.2":0.01052,"10.1":0,"11.1-11.2":0.01052,"12.0":0,"13.0":0.01052,"14.0":0,"15.0":0,"16.0":0.02104,"17.0":0.01052,"18.0":0,"19.0":0.01052},I:{"0":0,"3":0.03521,"4":0.24966,"2.1":0.02881,"2.2":0.12163,"2.3":0.17604,"4.1":0.12163,"4.2-4.3":0.30087,"4.4":0,"4.4.3-4.4.4":0.71697},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.01538,"7":0.03076,"8":0.28705,"9":0.04613,"10":0.07176,"11":0.95856,"5.5":0},S:{"2.5":0.03607,_:"3.0-3.1"},J:{"7":0,"10":0.06184},N:{"10":0.08854,"11":0.05059},L:{"0":42.42877},R:{_:"0"},M:{"0":0.20612},Q:{"13.1":0},O:{"0":0.1649},H:{"0":0.20978}};
    +module.exports={C:{"2":0.00401,"3":0.07213,"4":0.00401,"6":0.00401,"12":0.00401,"16":0.00401,"17":0.00401,"30":0.00401,"33":0.00401,"34":0.00401,"35":0.00401,"37":0.00401,"38":0.00401,"39":0.00401,"40":0.00801,"41":0.00401,"72":0.00401,"91":0.00801,"96":0.00401,"102":0.00401,"108":0.01202,"110":0.00401,"111":0.00401,"112":0.02404,"113":0.00401,"114":0.00801,"115":0.08415,"116":0.01603,"117":0.03606,"118":0.7413,"119":0.64513,"120":0.19634,_:"5 7 8 9 10 11 13 14 15 18 19 20 21 22 23 24 25 26 27 28 29 31 32 36 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 92 93 94 95 97 98 99 100 101 103 104 105 106 107 109 121 122 123 3.5","3.6":0.00801},D:{"11":0.00401,"12":0.00401,"19":0.00401,"21":0.00401,"30":0.00401,"31":0.00401,"32":0.00401,"36":0.00801,"37":0.00801,"38":0.00401,"39":0.00801,"40":0.00801,"41":0.00801,"42":0.00801,"43":0.01603,"44":0.03206,"45":0.02004,"46":0.01603,"47":0.01603,"51":0.03206,"65":0.00401,"68":0.00401,"70":0.01202,"72":0.00401,"73":0.01603,"74":0.00401,"75":0.01603,"76":0.02004,"77":0.00401,"78":0.00401,"79":0.02004,"81":0.00401,"83":0.09216,"84":0.00401,"85":0.01603,"87":0.00401,"88":0.01603,"89":0.00401,"90":0.00401,"91":0.09617,"92":0.00401,"93":0.09617,"97":0.00801,"102":0.00401,"103":0.20035,"105":0.00401,"106":0.00401,"107":0.00401,"108":2.6887,"109":0.50488,"110":0.00401,"111":0.03206,"112":0.02004,"113":0.00801,"114":0.04808,"115":0.03606,"116":0.43676,"117":0.19634,"118":4.58802,"119":8.70721,"120":0.01202,_:"4 5 6 7 8 9 10 13 14 15 16 17 18 20 22 23 24 25 26 27 28 29 33 34 35 48 49 50 52 53 54 55 56 57 58 59 60 61 62 63 64 66 67 69 71 80 86 94 95 96 98 99 100 101 104 121 122"},F:{"28":0.00401,"31":0.00401,"32":0.00401,"95":0.00401,"101":0.00401,"102":0.14826,"103":0.02004,"104":0.18432,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 10.0-10.1 10.5 10.6 11.1 11.5 11.6","9.5-9.6":0.00401,"12.1":0.00401},B:{"12":0.00801,"92":0.00801,"107":0.00401,"108":0.00401,"109":0.06411,"112":0.00801,"113":0.00401,"114":0.00401,"115":0.00401,"116":0.02404,"117":0.02004,"118":0.4568,"119":2.10768,_:"13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 110 111"},E:{"4":0.04808,"5":0.00401,"6":0.00401,"8":0.00801,"9":0.04408,"11":0.00401,"12":0.00401,"14":0.12422,"15":0.00401,_:"0 7 10 13 3.1 3.2 6.1 10.1 12.1","5.1":0.00401,"7.1":0.00401,"9.1":0.01603,"11.1":0.00801,"13.1":0.18432,"14.1":0.07613,"15.1":0.12822,"15.2-15.3":0.1723,"15.4":0.53293,"15.5":0.07613,"15.6":0.70924,"16.0":0.01202,"16.1":0.14826,"16.2":0.09617,"16.3":0.30854,"16.4":0.19234,"16.5":0.83346,"16.6":3.32982,"17.0":0.7413,"17.1":1.71099,"17.2":0.10819},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00667,"5.0-5.1":0.00667,"6.0-6.1":0.01667,"7.0-7.1":0.02333,"8.1-8.4":0.00333,"9.0-9.2":0.02667,"9.3":0.08333,"10.0-10.2":0.00667,"10.3":0.12,"11.0-11.2":0.05667,"11.3-11.4":0.05,"12.0-12.1":0.03,"12.2-12.5":0.54666,"13.0-13.1":0.01333,"13.2":0.05667,"13.3":0.03333,"13.4-13.7":0.09667,"14.0-14.4":0.25666,"14.5-14.8":0.41666,"15.0-15.1":0.16333,"15.2-15.3":0.2,"15.4":0.22333,"15.5":0.31333,"15.6-15.7":1.64665,"16.0":0.77333,"16.1":1.54999,"16.2":0.74333,"16.3":1.39332,"16.4":0.28666,"16.5":0.73999,"16.6-16.7":12.54323,"17.0":3.75664,"17.1":6.30995,"17.2":0.18},P:{"4":0.13764,"20":0.02118,"21":0.02118,"22":0.09529,"23":1.38698,"5.0-5.4":0.01059,"6.2-6.4":0.02118,"7.2-7.4":0.04235,_:"8.2 10.1 14.0 15.0 17.0","9.2":0.01059,"11.1-11.2":0.01059,"12.0":0.01059,"13.0":0.01059,"16.0":0.01059,"18.0":0.07411,"19.0":0.04235},I:{"0":0.26237,"3":0.00003,"4":0.00005,"2.1":0,"2.2":0.00005,"2.3":0,"4.1":0.00003,"4.2-4.3":0.00018,"4.4":0,"4.4.3-4.4.4":0.00079},K:{"0":0.15582,_:"10 11 12 11.1 11.5 12.1"},A:{"6":0.00869,"7":0.01304,"8":0.13905,"9":0.02173,"10":0.03911,"11":4.76242,_:"5.5"},N:{_:"10 11"},S:{"2.5":0.01199,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.0899},H:{"0":0},L:{"0":25.18909},R:{_:"0"},M:{"0":0.19777},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CA.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CA.js
    index 5fa0d262f6ec75..7c95de36ad5e4f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CA.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CA.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00551,"39":0,"40":0,"41":0,"42":0,"43":0.01101,"44":0.03304,"45":0.01101,"46":0,"47":0,"48":0.01101,"49":0,"50":0,"51":0,"52":0.01652,"53":0,"54":0,"55":0,"56":0,"57":0.01101,"58":0,"59":0.00551,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00551,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.00551,"78":0.02202,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0.01101,"88":0.00551,"89":0,"90":0,"91":0.00551,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00551,"101":0,"102":0.03854,"103":0.00551,"104":0.00551,"105":0.00551,"106":0.00551,"107":0.00551,"108":0.00551,"109":0.01652,"110":0.01101,"111":0.00551,"112":0.00551,"113":0.01652,"114":0.01652,"115":0.22024,"116":0.12113,"117":1.34346,"118":0.11563,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00551,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00551,"39":0,"40":0,"41":0,"42":0.00551,"43":0,"44":0,"45":0,"46":0,"47":0.01101,"48":0.0881,"49":0.04955,"50":0,"51":0,"52":0.00551,"53":0,"54":0,"55":0,"56":0,"57":0.00551,"58":0,"59":0,"60":0.04405,"61":0,"62":0,"63":0,"64":0,"65":0.00551,"66":0.02202,"67":0.00551,"68":0.00551,"69":0,"70":0,"71":0.00551,"72":0.00551,"73":0,"74":0.00551,"75":0.00551,"76":0.01101,"77":0.00551,"78":0.02753,"79":0.02202,"80":0.01101,"81":0.03304,"83":0.23125,"84":0.00551,"85":0.01101,"86":0.03854,"87":0.02753,"88":0.06607,"89":0.00551,"90":0.00551,"91":0.01101,"92":0.00551,"93":0.05506,"94":0.00551,"95":0.00551,"96":0.01101,"97":0.00551,"98":0.00551,"99":0.01101,"100":0.01652,"101":0.02202,"102":0.01652,"103":0.1872,"104":0.02202,"105":0.04405,"106":0.03304,"107":0.04405,"108":0.0881,"109":0.67724,"110":0.04405,"111":0.06607,"112":0.11563,"113":0.0936,"114":0.3634,"115":0.61667,"116":10.96245,"117":2.67592,"118":0.00551,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00551,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.01652,"73":0.00551,"74":0,"75":0,"76":0,"77":0.01652,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.03304,"96":0,"97":0,"98":0,"99":0.00551,"100":0.06057,"101":0.19271,"102":0.1872,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00551,"13":0.00551,"14":0,"15":0,"16":0,"17":0,"18":0.00551,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0.00551,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00551,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0.00551,"106":0.00551,"107":0.00551,"108":0.01101,"109":0.06607,"110":0.01101,"111":0.01101,"112":0.00551,"113":0.01101,"114":0.03854,"115":0.12113,"116":2.19689,"117":1.58022},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00551,"9":0.01652,"10":0,"11":0,"12":0,"13":0.01101,"14":0.06057,"15":0.01101,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.01101,"10.1":0,"11.1":0.00551,"12.1":0.02753,"13.1":0.13765,"14.1":0.17619,"15.1":0.02202,"15.2-15.3":0.02202,"15.4":0.04955,"15.5":0.06607,"15.6":0.47902,"16.0":0.04955,"16.1":0.0936,"16.2":0.09911,"16.3":0.23676,"16.4":0.0936,"16.5":0.29732,"16.6":2.60434,"17.0":0.09911,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.01171,"8.1-8.4":0.01562,"9.0-9.2":0.01562,"9.3":0.15229,"10.0-10.2":0.00781,"10.3":0.16401,"11.0-11.2":0.06248,"11.3-11.4":0.04295,"12.0-12.1":0.03124,"12.2-12.5":0.71851,"13.0-13.1":0.00781,"13.2":0.01171,"13.3":0.04686,"13.4-13.7":0.08591,"14.0-14.4":0.20696,"14.5-14.8":0.52326,"15.0-15.1":0.15229,"15.2-15.3":0.17572,"15.4":0.17572,"15.5":0.34754,"15.6-15.7":2.4523,"16.0":0.83566,"16.1":2.19848,"16.2":0.99967,"16.3":1.87437,"16.4":0.2343,"16.5":0.83956,"16.6":24.44105,"17.0":1.75332,"17.1":0.00781},P:{"4":0.10621,"20":0.04248,"21":0.12745,"22":2.55959,"5.0-5.4":0.01062,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0.01062,"11.1-11.2":0.01062,"12.0":0,"13.0":0.01062,"14.0":0,"15.0":0,"16.0":0.02124,"17.0":0.02124,"18.0":0.01062,"19.0":0.02124},I:{"0":0,"3":0,"4":0.02461,"2.1":0,"2.2":0.03445,"2.3":0.01476,"4.1":0.01476,"4.2-4.3":0.03445,"4.4":0,"4.4.3-4.4.4":0.14765},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01239,"9":0.00619,"10":0,"11":0.08053,"5.5":0},S:{"2.5":0.00449,_:"3.0-3.1"},J:{"7":0,"10":0.00449},N:{"10":0,"11":0},L:{"0":26.17418},R:{_:"0"},M:{"0":0.44491},Q:{"13.1":0.00449},O:{"0":0.12134},H:{"0":0.19571}};
    +module.exports={C:{"38":0.01065,"43":0.01598,"44":0.04261,"45":0.01065,"47":0.00533,"48":0.03196,"52":0.04261,"54":0.01065,"57":0.01598,"59":0.00533,"65":0.01065,"66":0.00533,"68":0.00533,"72":0.00533,"77":0.00533,"78":0.03728,"83":0.00533,"87":0.00533,"88":0.0213,"89":0.00533,"91":0.00533,"99":0.01065,"100":0.00533,"102":0.01598,"103":0.00533,"104":0.00533,"105":0.01065,"106":0.00533,"107":0.01065,"108":0.00533,"109":0.0213,"110":0.01598,"111":0.00533,"112":0.00533,"113":0.0213,"114":0.01065,"115":0.35684,"116":0.01065,"117":0.0213,"118":0.09587,"119":1.94399,"120":0.50597,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 46 49 50 51 53 55 56 58 60 61 62 63 64 67 69 70 71 73 74 75 76 79 80 81 82 84 85 86 90 92 93 94 95 96 97 98 101 121 122 123 3.5 3.6"},D:{"29":0.00533,"38":0.00533,"39":0.00533,"40":0.00533,"41":0.00533,"42":0.01065,"43":0.00533,"44":0.00533,"45":0.00533,"46":0.00533,"47":0.01598,"48":0.3888,"49":0.06391,"50":0.00533,"51":0.00533,"52":0.00533,"53":0.01065,"54":0.00533,"55":0.00533,"56":0.00533,"57":0.01065,"58":0.00533,"59":0.00533,"60":0.04793,"65":0.00533,"66":0.02663,"67":0.00533,"69":0.00533,"70":0.00533,"71":0.00533,"72":0.00533,"74":0.00533,"75":0.00533,"76":0.01065,"77":0.00533,"78":0.00533,"79":0.92672,"80":0.02663,"81":0.04261,"83":0.85216,"84":0.01065,"85":0.02663,"86":0.07989,"87":0.05326,"88":0.08522,"89":0.01065,"90":0.01065,"91":0.01065,"92":0.01065,"93":0.05859,"94":0.01065,"95":0.01598,"96":0.01598,"97":0.00533,"98":0.01598,"99":0.01598,"100":0.03728,"101":0.04793,"102":0.03196,"103":0.27163,"104":0.06391,"105":0.05859,"106":0.07456,"107":0.08522,"108":0.17043,"109":1.28889,"110":0.06391,"111":0.08522,"112":0.09054,"113":0.13848,"114":0.17576,"115":0.19174,"116":0.74564,"117":0.73499,"118":6.43381,"119":17.70362,"120":0.0213,"121":0.00533,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 30 31 32 33 34 35 36 37 61 62 63 64 68 73 122"},F:{"52":0.00533,"92":0.00533,"94":0.01065,"95":0.05326,"99":0.00533,"100":0.00533,"102":0.27695,"103":0.07989,"104":0.31956,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 93 96 97 98 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00533,"13":0.00533,"15":0.00533,"17":0.00533,"18":0.00533,"85":0.00533,"92":0.00533,"103":0.00533,"104":0.00533,"105":0.00533,"106":0.00533,"107":0.01598,"108":0.01598,"109":0.10119,"110":0.01065,"111":0.01065,"112":0.01065,"113":0.01065,"114":0.01598,"115":0.01598,"116":0.03728,"117":0.17043,"118":1.03324,"119":5.57632,_:"14 16 79 80 81 83 84 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102"},E:{"8":0.00533,"9":0.0213,"13":0.01598,"14":0.09587,"15":0.01598,_:"0 4 5 6 7 10 11 12 3.1 3.2 5.1 6.1 7.1 10.1","9.1":0.01065,"11.1":0.01065,"12.1":0.03728,"13.1":0.19174,"14.1":0.25565,"15.1":0.03728,"15.2-15.3":0.03196,"15.4":0.07989,"15.5":0.1225,"15.6":0.87346,"16.0":0.07989,"16.1":0.15445,"16.2":0.18108,"16.3":0.42075,"16.4":0.14913,"16.5":0.35684,"16.6":3.54179,"17.0":0.64445,"17.1":1.72562,"17.2":0.02663},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00522,"5.0-5.1":0.00522,"6.0-6.1":0.01304,"7.0-7.1":0.01826,"8.1-8.4":0.00261,"9.0-9.2":0.02087,"9.3":0.06521,"10.0-10.2":0.00522,"10.3":0.09391,"11.0-11.2":0.04435,"11.3-11.4":0.03913,"12.0-12.1":0.02348,"12.2-12.5":0.4278,"13.0-13.1":0.01043,"13.2":0.04435,"13.3":0.02609,"13.4-13.7":0.07565,"14.0-14.4":0.20086,"14.5-14.8":0.32607,"15.0-15.1":0.12782,"15.2-15.3":0.15651,"15.4":0.17477,"15.5":0.2452,"15.6-15.7":1.28863,"16.0":0.60519,"16.1":1.21298,"16.2":0.58171,"16.3":1.09038,"16.4":0.22434,"16.5":0.5791,"16.6-16.7":9.81601,"17.0":2.93985,"17.1":4.938,"17.2":0.14086},P:{"4":0.09884,"20":0.03295,"21":0.09884,"22":0.10982,"23":2.49295,"5.0-5.4":0.01098,_:"6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 14.0 15.0","12.0":0.01098,"13.0":0.01098,"16.0":0.02196,"17.0":0.01098,"18.0":0.01098,"19.0":0.01098},I:{"0":0.03255,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.0001},K:{"0":0.18229,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00639,"9":0.01278,"11":0.10865,_:"6 7 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.07946},H:{"0":0},L:{"0":16.84997},R:{_:"0"},M:{"0":0.92078},Q:{"13.1":0.00935}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CD.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CD.js
    index 237dd71b2de215..922a1e47c07c15 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CD.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CD.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.02148,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.0033,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.01322,"116":0.00496,"117":0.05782,"118":0.00661,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00165,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00496,"41":0,"42":0,"43":0.00165,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00165,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.00165,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.00165,"80":0,"81":0.0033,"83":0,"84":0,"85":0,"86":0,"87":0.00165,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0.00496,"99":0.00165,"100":0,"101":0,"102":0.00165,"103":0.00165,"104":0,"105":0.00165,"106":0.00165,"107":0.00165,"108":0.00165,"109":0.05452,"110":0.00661,"111":0.0033,"112":0.00165,"113":0.0033,"114":0.00496,"115":0.01156,"116":0.27588,"117":0.07599,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0.00496,"25":0,"26":0.0033,"27":0.00165,"28":0.00661,"29":0,"30":0.01156,"31":0.00165,"32":0.00661,"33":0.00496,"34":0,"35":0,"36":0.00165,"37":0.02808,"38":0.00661,"39":0,"40":0,"41":0,"42":0.00661,"43":0,"44":0,"45":0.00165,"46":0.00165,"47":0.00496,"48":0,"49":0,"50":0.0033,"51":0.00661,"52":0,"53":0,"54":0.0033,"55":0.0033,"56":0,"57":0.00496,"58":0.01322,"60":0.0859,"62":0.00165,"63":0.14538,"64":0.00991,"65":0.00661,"66":0.08921,"67":0.06773,"68":0.03304,"69":0.19824,"70":0.08921,"71":0.3684,"72":0.31553,"73":0.05121,"74":0.00826,"75":0.00165,"76":0.00661,"77":0.01652,"78":0.00165,"79":0.0033,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00661,"96":0,"97":0,"98":0,"99":0.00165,"100":0,"101":0.03469,"102":0.02974,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00496},B:{"12":0.00165,"13":0.00165,"14":0,"15":0.00165,"16":0,"17":0.00165,"18":0.0033,"79":0,"80":0,"81":0,"83":0,"84":0.00165,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.0033,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00165,"110":0.00165,"111":0,"112":0,"113":0.00165,"114":0.0033,"115":0.00826,"116":0.08921,"117":0.05121},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00165,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00165,"13.1":0,"14.1":0.00165,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0.00165,"16.0":0,"16.1":0,"16.2":0.00165,"16.3":0.00165,"16.4":0,"16.5":0.00165,"16.6":0.00826,"17.0":0,"17.1":0},G:{"8":0.00399,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00798,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.00638,"10.0-10.2":0,"10.3":0.02154,"11.0-11.2":0.00239,"11.3-11.4":0,"12.0-12.1":0.01995,"12.2-12.5":0.70933,"13.0-13.1":0.00319,"13.2":0.00319,"13.3":0.02234,"13.4-13.7":0.12766,"14.0-14.4":0.27847,"14.5-14.8":0.48193,"15.0-15.1":0.15479,"15.2-15.3":0.24575,"15.4":0.24176,"15.5":0.36863,"15.6-15.7":1.1753,"16.0":0.32873,"16.1":0.4939,"16.2":0.27847,"16.3":0.43964,"16.4":0.43645,"16.5":0.59204,"16.6":1.17371,"17.0":0.33352,"17.1":0},P:{"4":0.10292,"20":0.07204,"21":0.07204,"22":0.23672,"5.0-5.4":0.02058,"6.2-6.4":0,"7.2-7.4":0.05146,"8.2":0,"9.2":0.04117,"10.1":0,"11.1-11.2":0.06175,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0.02058,"17.0":0.01029,"18.0":0.03088,"19.0":0.03088},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00116,"4.2-4.3":0.00578,"4.4":0,"4.4.3-4.4.4":0.07628},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00826,"5.5":0},S:{"2.5":0.10018,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":68.71647},R:{_:"0"},M:{"0":0.03339},Q:{"13.1":0.0167},O:{"0":0.32557},H:{"0":16.88945}};
    +module.exports={C:{"37":0.00104,"43":0.00104,"46":0.00104,"47":0.00104,"52":0.00104,"57":0.08089,"66":0.00104,"72":0.00207,"78":0.00104,"86":0.00104,"102":0.00104,"105":0.00207,"112":0.00104,"115":0.09955,"116":0.00104,"117":0.00104,"118":0.01348,"119":0.24888,"120":0.06637,"121":0.00104,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 39 40 41 42 44 45 48 49 50 51 53 54 55 56 58 59 60 61 62 63 64 65 67 68 69 70 71 73 74 75 76 77 79 80 81 82 83 84 85 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 103 104 106 107 108 109 110 111 113 114 122 123 3.5 3.6"},D:{"11":0.00207,"33":0.00104,"43":0.00519,"46":0.00104,"49":0.00207,"50":0.00104,"55":0.00104,"57":0.00104,"61":0.00104,"63":0.00104,"64":0.00207,"66":0.00104,"68":0.00207,"69":0.00104,"70":0.00207,"76":0.00207,"77":0.00104,"79":0.00311,"80":0.00207,"81":0.01141,"83":0.00104,"84":0.00104,"85":0.00104,"86":0.00104,"87":0.00622,"88":0.00207,"89":0.00415,"90":0.00207,"91":0.00104,"92":0.00104,"93":0.00104,"94":0.00104,"95":0.00207,"96":0.00104,"97":0.00207,"98":0.01348,"99":0.01659,"101":0.00104,"102":0.00311,"103":0.00622,"104":0.00104,"105":0.00622,"106":0.00207,"107":0.00207,"108":0.09852,"109":0.36917,"110":0.05289,"111":0.04148,"112":0.00933,"113":0.01348,"114":0.02281,"115":0.02385,"116":0.04148,"117":0.05496,"118":0.34428,"119":1.3958,"120":0.00104,"121":0.00104,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 37 38 39 40 41 42 44 45 47 48 51 52 53 54 56 58 59 60 62 65 67 71 72 73 74 75 78 100 122"},F:{"37":0.00104,"42":0.00207,"46":0.00104,"66":0.00104,"72":0.00104,"75":0.01452,"78":0.00104,"79":0.02074,"89":0.00311,"95":0.02385,"97":0.00104,"99":0.00104,"101":0.00311,"102":0.0083,"103":0.05081,"104":0.14,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 39 40 41 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 67 68 69 70 71 73 74 76 77 80 81 82 83 84 85 86 87 88 90 91 92 93 94 96 98 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00726,"13":0.00519,"14":0.00311,"15":0.00207,"16":0.01763,"17":0.00207,"18":0.01556,"84":0.00622,"85":0.00104,"89":0.00311,"90":0.00207,"92":0.01244,"100":0.00415,"102":0.00104,"105":0.00104,"108":0.00104,"109":0.00311,"110":0.00104,"111":0.00104,"112":0.00207,"113":0.00104,"114":0.00207,"115":0.00622,"116":0.01348,"117":0.0363,"118":0.14933,"119":0.59524,_:"79 80 81 83 86 87 88 91 93 94 95 96 97 98 99 101 103 104 106 107"},E:{"12":0.00104,"13":0.00104,"14":0.00622,_:"0 4 5 6 7 8 9 10 11 15 3.1 3.2 6.1 7.1 9.1 10.1 15.2-15.3 17.2","5.1":0.00415,"11.1":0.00519,"12.1":0.00104,"13.1":0.00519,"14.1":0.01037,"15.1":0.00519,"15.4":0.00104,"15.5":0.00519,"15.6":0.01141,"16.0":0.00207,"16.1":0.00519,"16.2":0.00207,"16.3":0.01763,"16.4":0.00207,"16.5":0.00519,"16.6":0.04667,"17.0":0.03941,"17.1":0.01659},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00154,"5.0-5.1":0.00154,"6.0-6.1":0.00385,"7.0-7.1":0.0054,"8.1-8.4":0.00077,"9.0-9.2":0.00617,"9.3":0.01927,"10.0-10.2":0.00154,"10.3":0.02775,"11.0-11.2":0.0131,"11.3-11.4":0.01156,"12.0-12.1":0.00694,"12.2-12.5":0.12641,"13.0-13.1":0.00308,"13.2":0.0131,"13.3":0.00771,"13.4-13.7":0.02235,"14.0-14.4":0.05935,"14.5-14.8":0.09635,"15.0-15.1":0.03777,"15.2-15.3":0.04625,"15.4":0.05164,"15.5":0.07246,"15.6-15.7":0.38078,"16.0":0.17883,"16.1":0.35843,"16.2":0.17189,"16.3":0.3222,"16.4":0.06629,"16.5":0.17112,"16.6-16.7":2.90059,"17.0":0.86871,"17.1":1.45916,"17.2":0.04162},P:{"4":0.08195,"20":0.03073,"21":0.06146,"22":0.08195,"23":0.20487,_:"5.0-5.4 8.2 10.1 12.0 14.0 15.0 17.0","6.2-6.4":0.03073,"7.2-7.4":0.08195,"9.2":0.03073,"11.1-11.2":0.03073,"13.0":0.01024,"16.0":0.03073,"18.0":0.01024,"19.0":0.03073},I:{"0":0.04459,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00013},K:{"0":9.70947,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.04978,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.08067,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.18822},H:{"0":5.68},L:{"0":70.99903},R:{_:"0"},M:{"0":0.03585},Q:{"13.1":0.00896}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CF.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CF.js
    index 1bc740ba0c6d51..274897198b3499 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CF.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CF.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0.00182,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00182,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0.00728,"62":0,"63":0,"64":0,"65":0,"66":0.00182,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00364,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00182,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0.00182,"115":0.05278,"116":0.03094,"117":0.36946,"118":0,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00546,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00364,"50":0,"51":0,"52":0.00182,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.02366,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0.01274,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0.01092,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00364,"101":0.00182,"102":0.00182,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.0273,"110":0.00182,"111":0,"112":0.00546,"113":0.00182,"114":0.0091,"115":0.04186,"116":0.6279,"117":0.06006,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0.00182,"52":0,"53":0,"54":0,"55":0.00546,"56":0,"57":0,"58":0.00182,"60":0.01456,"62":0,"63":0.0091,"64":0,"65":0,"66":0.00546,"67":0.00364,"68":0.00182,"69":0.00728,"70":0.00182,"71":0.02002,"72":0.0546,"73":0.00364,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00546,"93":0,"94":0,"95":0.00364,"96":0,"97":0,"98":0,"99":0.00546,"100":0,"101":0.02366,"102":0.00546,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00728},B:{"12":0.00182,"13":0,"14":0.00364,"15":0,"16":0,"17":0.00364,"18":0.00364,"79":0,"80":0,"81":0,"83":0.01274,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.00182,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.02548,"110":0,"111":0,"112":0.00364,"113":0,"114":0.00546,"115":0.00546,"116":0.10192,"117":0.01638},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00728,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00182,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0.00182,"16.0":0,"16.1":0.00182,"16.2":0,"16.3":0,"16.4":0,"16.5":0,"16.6":0.00182,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.03922,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.00357,"10.0-10.2":0.00963,"10.3":0.00357,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0.47956,"13.0-13.1":0,"13.2":0.00357,"13.3":0.00606,"13.4-13.7":0.05491,"14.0-14.4":0.06988,"14.5-14.8":0.07594,"15.0-15.1":0.06133,"15.2-15.3":0.0271,"15.4":0.04279,"15.5":0.00998,"15.6-15.7":0.80972,"16.0":0.26385,"16.1":0.15474,"16.2":0.03173,"16.3":0.12158,"16.4":0.07238,"16.5":0.38543,"16.6":0.56299,"17.0":0.2724,"17.1":0},P:{"4":0.53298,"20":0.0205,"21":0.07175,"22":0.13325,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.041,"8.2":0,"9.2":0.01025,"10.1":0,"11.1-11.2":0.01025,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0.0205,"17.0":0,"18.0":0,"19.0":0.01025},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00474,"4.2-4.3":0.00355,"4.4":0,"4.4.3-4.4.4":0.09085},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00182,"5.5":0},S:{"2.5":0.39264,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":81.07062},R:{_:"0"},M:{"0":0.05726},Q:{"13.1":0},O:{"0":0.09816},H:{"0":9.37834}};
    +module.exports={C:{"45":0.00222,"56":0.00443,"63":0.00332,"67":0.00332,"72":0.00776,"83":0.00222,"85":0.00443,"99":0.00332,"104":0.00665,"108":0.02105,"113":0.00111,"114":0.00332,"115":0.02216,"116":0.00443,"118":0.01551,"119":1.40494,"120":0.66258,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 49 50 51 52 53 54 55 57 58 59 60 61 62 64 65 66 68 69 70 71 73 74 75 76 77 78 79 80 81 82 84 86 87 88 89 90 91 92 93 94 95 96 97 98 100 101 102 103 105 106 107 109 110 111 112 117 121 122 123 3.5 3.6"},D:{"29":0.00886,"49":0.00111,"58":0.01108,"60":0.06205,"65":0.00332,"69":0.041,"80":0.00111,"83":0.00332,"86":0.02216,"90":0.00222,"92":0.00222,"93":0.00665,"96":0.00332,"98":0.00222,"100":0.00665,"104":0.00111,"106":0.00665,"108":0.00554,"109":0.1252,"110":0.00554,"111":0.02216,"114":0.01773,"115":0.08421,"116":0.1252,"117":0.03989,"118":0.34016,"119":1.2742,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 50 51 52 53 54 55 56 57 59 61 62 63 64 66 67 68 70 71 72 73 74 75 76 77 78 79 81 84 85 87 88 89 91 94 95 97 99 101 102 103 105 107 112 113 120 121 122"},F:{"55":0.00776,"62":0.00222,"89":0.00222,"95":0.00111,"101":0.00222,"102":0.0554,"103":0.02438,"104":0.04321,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 56 57 58 60 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 90 91 92 93 94 96 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00665,"13":0.01662,"15":0.00111,"16":0.00332,"17":0.00332,"18":0.0133,"84":0.00222,"89":0.00665,"92":0.0144,"95":0.00776,"101":0.00111,"112":0.02881,"114":0.00111,"116":0.03656,"117":0.00332,"118":0.18614,"119":0.59278,_:"14 79 80 81 83 85 86 87 88 90 91 93 94 96 97 98 99 100 102 103 104 105 106 107 108 109 110 111 113 115"},E:{"10":0.00222,"14":0.00111,_:"0 4 5 6 7 8 9 11 12 13 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1 12.1 13.1 14.1 15.1 15.2-15.3 15.4 16.0 16.2 16.3 16.4 17.0 17.2","5.1":0.00222,"15.5":0.00111,"15.6":0.01662,"16.1":0.00222,"16.5":0.00332,"16.6":0.00111,"17.1":0.00886},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00055,"5.0-5.1":0.00055,"6.0-6.1":0.00136,"7.0-7.1":0.00191,"8.1-8.4":0.00027,"9.0-9.2":0.00218,"9.3":0.00682,"10.0-10.2":0.00055,"10.3":0.00983,"11.0-11.2":0.00464,"11.3-11.4":0.00409,"12.0-12.1":0.00246,"12.2-12.5":0.04477,"13.0-13.1":0.00109,"13.2":0.00464,"13.3":0.00273,"13.4-13.7":0.00792,"14.0-14.4":0.02102,"14.5-14.8":0.03412,"15.0-15.1":0.01338,"15.2-15.3":0.01638,"15.4":0.01829,"15.5":0.02566,"15.6-15.7":0.13485,"16.0":0.06333,"16.1":0.12694,"16.2":0.06088,"16.3":0.11411,"16.4":0.02348,"16.5":0.0606,"16.6-16.7":1.02724,"17.0":0.30765,"17.1":0.51676,"17.2":0.01474},P:{"4":0.02102,"20":0.01051,"21":0.03153,"22":0.09458,"23":0.10509,"5.0-5.4":0.02102,_:"6.2-6.4 8.2 10.1 11.1-11.2 12.0 13.0 17.0 18.0","7.2-7.4":0.08407,"9.2":0.02102,"14.0":0.01051,"15.0":0.01051,"16.0":0.03153,"19.0":0.02102},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{"0":2.06816,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.02659,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.90698,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.1067},H:{"0":8.54},L:{"0":79.43363},R:{_:"0"},M:{"0":0.12449},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CG.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CG.js
    index c338ea177ff208..122cf5a8b4e91c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CG.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CG.js
    @@ -1 +1 @@
    -module.exports={C:{"114":0.0159,"115":0.31276,"116":0.04241,"117":1.16622,"118":0.12192,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 119 120 3.5 3.6"},D:{"11":0.03181,"68":0.0053,"69":0.0159,"73":0.05301,"76":0.0053,"79":0.0212,"81":0.0053,"83":0.0106,"84":0.0053,"86":0.02651,"87":0.04241,"89":0.0106,"91":0.02651,"92":0.0053,"93":0.04241,"95":0.02651,"98":0.0159,"101":0.0053,"102":0.0106,"103":0.02651,"104":0.04771,"106":0.0106,"108":0.0106,"109":1.49488,"110":0.0159,"112":0.04771,"113":0.0159,"114":0.12722,"115":0.18023,"116":17.85907,"117":6.38771,"118":0.0053,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 70 71 72 74 75 77 78 80 85 88 90 94 96 97 99 100 105 107 111 119 120"},F:{"28":0.0106,"42":0.0106,"79":0.0212,"85":0.0053,"90":0.0212,"95":0.11662,"101":0.5036,"102":0.49829,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 86 87 88 89 91 92 93 94 96 97 98 99 100 9.5-9.6 10.5 10.6 11.1 11.5 11.6 12.1","10.0-10.1":0},B:{"12":0.0053,"14":0.0053,"18":0.0159,"90":0.0106,"92":0.0106,"109":0.06891,"111":0.0106,"112":0.0159,"114":0.03711,"115":0.14313,"116":7.18816,"117":4.38393,_:"13 15 16 17 79 80 81 83 84 85 86 87 88 89 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 113"},E:{"4":0,_:"0 5 6 7 8 9 10 11 12 13 14 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 14.1 15.1 15.2-15.3 15.4 15.5 16.0 16.1 16.3 16.4 16.5 17.0 17.1","13.1":0.19614,"15.6":0.04771,"16.2":0.0159,"16.6":0.04241},G:{"8":0.00162,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00081,"6.0-6.1":0,"7.0-7.1":0.01461,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.01624,"10.0-10.2":0,"10.3":0.12827,"11.0-11.2":0.00162,"11.3-11.4":0,"12.0-12.1":0.03978,"12.2-12.5":1.75192,"13.0-13.1":0.00325,"13.2":0.00162,"13.3":0.01055,"13.4-13.7":0.02679,"14.0-14.4":0.0893,"14.5-14.8":0.21838,"15.0-15.1":0.19971,"15.2-15.3":0.0755,"15.4":0.04059,"15.5":0.17454,"15.6-15.7":2.84383,"16.0":0.06008,"16.1":0.09174,"16.2":0.07225,"16.3":0.29388,"16.4":0.08605,"16.5":0.39698,"16.6":1.08135,"17.0":0.30362,"17.1":0.00568},P:{"4":0.1781,"20":0.07204,"21":0.02544,"22":0.19083,"5.0-5.4":0.02058,"6.2-6.4":0,"7.2-7.4":0.12722,"8.2":0,"9.2":0.04117,"10.1":0,"11.1-11.2":0.06175,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0.02058,"17.0":0.01029,"18.0":0.03088,"19.0":0.03088},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00048,"4.2-4.3":0.00208,"4.4":0,"4.4.3-4.4.4":0.01624},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{_:"6 7 8 9 10 11 5.5"},S:{"2.5":0.16916,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":48.46325},R:{_:"0"},M:{"0":0.0235},Q:{"13.1":0},O:{"0":0.12687},H:{"0":0.52495}};
    +module.exports={C:{"115":0.28994,"118":0.005,"119":0.66987,"120":0.20996,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 116 117 121 122 123 3.5 3.6"},D:{"11":0.005,"64":0.005,"66":0.025,"69":0.005,"73":0.05499,"75":0.005,"79":0.015,"81":0.005,"83":0.02,"84":0.005,"86":0.03999,"87":0.025,"88":0.01,"89":0.005,"91":0.005,"93":0.03999,"95":0.025,"98":0.01,"99":0.005,"101":0.01,"102":0.015,"103":0.02999,"104":0.015,"106":0.005,"107":0.005,"108":0.01,"109":0.77984,"110":0.025,"111":0.005,"114":0.04499,"115":0.01,"116":0.06499,"117":0.06999,"118":4.69906,"119":20.74085,"120":0.04999,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 65 67 68 70 71 72 74 76 77 78 80 85 90 92 94 96 97 100 105 112 113 121 122"},F:{"79":0.025,"85":0.005,"94":0.005,"95":0.10998,"102":0.09498,"103":0.10998,"104":0.34993,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 86 87 88 89 90 91 92 93 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"16":0.005,"17":0.005,"18":0.015,"84":0.005,"92":0.03499,"109":0.10998,"111":0.03499,"112":0.005,"113":0.005,"115":0.005,"116":0.005,"117":0.12498,"118":1.96961,"119":11.76265,_:"12 13 14 15 79 80 81 83 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 114"},E:{"15":0.005,_:"0 4 5 6 7 8 9 10 11 12 13 14 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 14.1 15.1 15.2-15.3 15.4 15.5 16.0 16.1 16.4 17.0 17.2","13.1":0.05999,"15.6":0.03999,"16.2":0.01,"16.3":0.005,"16.5":0.01,"16.6":0.01,"17.1":0.005},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00152,"5.0-5.1":0.00152,"6.0-6.1":0.00379,"7.0-7.1":0.00531,"8.1-8.4":0.00076,"9.0-9.2":0.00607,"9.3":0.01895,"10.0-10.2":0.00152,"10.3":0.02729,"11.0-11.2":0.01289,"11.3-11.4":0.01137,"12.0-12.1":0.00682,"12.2-12.5":0.12434,"13.0-13.1":0.00303,"13.2":0.01289,"13.3":0.00758,"13.4-13.7":0.02199,"14.0-14.4":0.05838,"14.5-14.8":0.09477,"15.0-15.1":0.03715,"15.2-15.3":0.04549,"15.4":0.0508,"15.5":0.07127,"15.6-15.7":0.37453,"16.0":0.17589,"16.1":0.35254,"16.2":0.16907,"16.3":0.31691,"16.4":0.0652,"16.5":0.16831,"16.6-16.7":2.85292,"17.0":0.85444,"17.1":1.43518,"17.2":0.04094},P:{"4":0.18432,"21":0.01024,"22":0.07168,"23":0.09216,_:"20 5.0-5.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 18.0","6.2-6.4":0.01024,"7.2-7.4":0.04096,"17.0":0.01024,"19.0":0.01024},I:{"0":0.01493,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00005},K:{"0":0.2401,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.005,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.08502,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.08502},H:{"0":0.28},L:{"0":47.59181},R:{_:"0"},M:{"0":0.04501},Q:{"13.1":0.005}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CH.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CH.js
    index 504e64c76ac43a..4d4c96ab1fb093 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CH.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CH.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00613,"49":0,"50":0,"51":0,"52":0.03066,"53":0,"54":0,"55":0.00613,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00613,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0.00613,"76":0,"77":0,"78":0.04906,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0.00613,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.00613,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0.01226,"99":0.00613,"100":0,"101":0,"102":0.19622,"103":0.00613,"104":0,"105":0.00613,"106":0.00613,"107":0.01226,"108":0.01226,"109":0.0184,"110":0.01226,"111":0.00613,"112":0.00613,"113":0.11038,"114":0.02453,"115":0.42924,"116":0.19009,"117":3.13958,"118":0.3066,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0.00613,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00613,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.0184,"50":0,"51":0.00613,"52":0.19622,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.04906,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0.00613,"77":0,"78":0.00613,"79":0.04292,"80":0.00613,"81":0.01226,"83":0,"84":0.01226,"85":0.0184,"86":0.01226,"87":0.03066,"88":0,"89":0.01226,"90":0.00613,"91":0.01226,"92":0.00613,"93":0.00613,"94":0,"95":0.00613,"96":0.00613,"97":0.00613,"98":0.00613,"99":0.01226,"100":0.01226,"101":0.02453,"102":0.0184,"103":0.09811,"104":0.02453,"105":0.01226,"106":0.01226,"107":0.0184,"108":0.03679,"109":0.71744,"110":0.03066,"111":0.02453,"112":0.05519,"113":0.06745,"114":0.3066,"115":0.85235,"116":12.28853,"117":2.67355,"118":0.00613,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00613,"73":0,"74":0,"75":0,"76":0,"77":0.02453,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.00613,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.0184,"96":0,"97":0,"98":0,"99":0.0184,"100":0.09198,"101":0.33726,"102":0.61933,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00613,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00613,"93":0,"94":0,"95":0.00613,"96":0,"97":0.00613,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0.00613,"106":0.00613,"107":0.01226,"108":0.01226,"109":0.12877,"110":0.04906,"111":0.00613,"112":0.03066,"113":0.02453,"114":0.11651,"115":0.37405,"116":4.66032,"117":2.69195},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00613,"10":0,"11":0,"12":0,"13":0.01226,"14":0.05519,"15":0.01226,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0.00613,"12.1":0.07358,"13.1":0.14717,"14.1":0.18396,"15.1":0.02453,"15.2-15.3":0.04292,"15.4":0.04292,"15.5":0.07358,"15.6":0.48443,"16.0":0.06745,"16.1":0.11651,"16.2":0.1349,"16.3":0.325,"16.4":0.1349,"16.5":0.41698,"16.6":2.37922,"17.0":0.12877,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00341,"6.0-6.1":0,"7.0-7.1":0.00682,"8.1-8.4":0.00682,"9.0-9.2":0.57314,"9.3":0.11599,"10.0-10.2":0.00341,"10.3":0.0887,"11.0-11.2":0.0307,"11.3-11.4":0.06482,"12.0-12.1":0.01706,"12.2-12.5":0.40939,"13.0-13.1":0.00341,"13.2":0,"13.3":0.08188,"13.4-13.7":0.05458,"14.0-14.4":0.16034,"14.5-14.8":0.28657,"15.0-15.1":0.10917,"15.2-15.3":0.19446,"15.4":0.15693,"15.5":0.33433,"15.6-15.7":1.84565,"16.0":1.1531,"16.1":1.78424,"16.2":0.91429,"16.3":1.6853,"16.4":0.47762,"16.5":1.16334,"16.6":19.74263,"17.0":2.26868,"17.1":0.00682},P:{"4":0.062,"20":0.062,"21":0.16534,"22":3.07945,"5.0-5.4":0.02067,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0.01033,"13.0":0.01033,"14.0":0,"15.0":0.01033,"16.0":0.01033,"17.0":0.01033,"18.0":0.01033,"19.0":0.031},I:{"0":0,"3":0,"4":0.01504,"2.1":0.00215,"2.2":0.0086,"2.3":0.01289,"4.1":0.01934,"4.2-4.3":0.01719,"4.4":0,"4.4.3-4.4.4":0.07092},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01226,"9":0,"10":0,"11":0.07358,"5.5":0},S:{"2.5":0.00387,_:"3.0-3.1"},J:{"7":0,"10":0.00387},N:{"10":0,"11":0},L:{"0":21.89036},R:{_:"0"},M:{"0":0.6885},Q:{"13.1":0},O:{"0":0.04255},H:{"0":0.22704}};
    +module.exports={C:{"48":0.13381,"52":0.03823,"55":0.01274,"56":0.00637,"71":0.01274,"75":0.00637,"78":0.06372,"83":0.00637,"84":0.00637,"91":0.00637,"99":0.00637,"101":0.01274,"102":0.0446,"105":0.00637,"107":0.00637,"108":0.02549,"109":0.01274,"110":0.01912,"111":0.00637,"112":0.00637,"113":0.0446,"114":0.01274,"115":0.83473,"116":0.01912,"117":0.03186,"118":0.14656,"119":3.88055,"120":1.15333,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 49 50 51 53 54 57 58 59 60 61 62 63 64 65 66 67 68 69 70 72 73 74 76 77 79 80 81 82 85 86 87 88 89 90 92 93 94 95 96 97 98 100 103 104 106 121 122 123 3.5 3.6"},D:{"38":0.00637,"41":0.00637,"49":0.02549,"52":0.32497,"65":0.00637,"66":0.07646,"75":0.00637,"76":0.01274,"77":0.00637,"78":0.00637,"79":0.06372,"80":0.01912,"81":0.01274,"83":0.03823,"84":0.01912,"85":0.01912,"86":0.01912,"87":0.03823,"88":0.00637,"89":0.02549,"90":0.00637,"92":0.01912,"93":0.01274,"94":0.00637,"95":0.00637,"96":0.00637,"97":0.00637,"98":0.00637,"99":0.01912,"100":0.02549,"101":0.02549,"102":0.03186,"103":0.15293,"104":0.02549,"105":0.01912,"106":0.01274,"107":0.02549,"108":0.03823,"109":1.44007,"110":0.02549,"111":0.03823,"112":0.06372,"113":0.08921,"114":0.22939,"115":0.41418,"116":0.75827,"117":0.67543,"118":7.56994,"119":20.46686,"120":0.01912,"121":0.00637,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 42 43 44 45 46 47 48 50 51 53 54 55 56 57 58 59 60 61 62 63 64 67 68 69 70 71 72 73 74 91 122"},F:{"46":0.00637,"89":0.00637,"91":0.00637,"95":0.01912,"99":0.00637,"101":0.00637,"102":0.50339,"103":0.1593,"104":0.6818,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 90 92 93 94 96 97 98 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.00637,"92":0.00637,"96":0.00637,"99":0.01274,"100":0.00637,"104":0.00637,"105":0.00637,"107":0.00637,"108":0.02549,"109":0.2039,"110":0.03823,"111":0.03186,"112":0.02549,"113":0.01912,"114":0.05735,"115":0.0446,"116":0.12107,"117":0.32497,"118":2.6635,"119":10.77505,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 97 98 101 102 103 106"},E:{"13":0.01912,"14":0.07646,"15":0.01912,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 6.1 7.1 9.1 10.1","5.1":0.00637,"11.1":0.00637,"12.1":0.14018,"13.1":0.21028,"14.1":0.25488,"15.1":0.03823,"15.2-15.3":0.05735,"15.4":0.06372,"15.5":0.1147,"15.6":0.80287,"16.0":0.1147,"16.1":0.17204,"16.2":0.16567,"16.3":0.34409,"16.4":0.1593,"16.5":0.3632,"16.6":1.94346,"17.0":0.7519,"17.1":1.49105,"17.2":0.05098},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00367,"5.0-5.1":0.00367,"6.0-6.1":0.00918,"7.0-7.1":0.01286,"8.1-8.4":0.00184,"9.0-9.2":0.01469,"9.3":0.04592,"10.0-10.2":0.00367,"10.3":0.06613,"11.0-11.2":0.03123,"11.3-11.4":0.02755,"12.0-12.1":0.01653,"12.2-12.5":0.30124,"13.0-13.1":0.00735,"13.2":0.03123,"13.3":0.01837,"13.4-13.7":0.05327,"14.0-14.4":0.14144,"14.5-14.8":0.22961,"15.0-15.1":0.09001,"15.2-15.3":0.11021,"15.4":0.12307,"15.5":0.17266,"15.6-15.7":0.90741,"16.0":0.42615,"16.1":0.85414,"16.2":0.40962,"16.3":0.76781,"16.4":0.15797,"16.5":0.40778,"16.6-16.7":6.91209,"17.0":2.07014,"17.1":3.47717,"17.2":0.09919},P:{"4":0.07541,"20":0.03232,"21":0.09696,"22":0.29087,"23":2.57473,"5.0-5.4":0.02155,_:"6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 14.0 15.0 16.0","13.0":0.01077,"17.0":0.02155,"18.0":0.01077,"19.0":0.03232},I:{"0":0.03249,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.0001},K:{"0":0.24308,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00637,"11":0.1147,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.03265},H:{"0":0},L:{"0":13.85732},R:{_:"0"},M:{"0":0.58774},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CI.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CI.js
    index e3586d5efdc6e0..c9e23609c8665e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CI.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CI.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00252,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00252,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0.00252,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00252,"101":0,"102":0.00504,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00504,"109":0.00252,"110":0.00252,"111":0.00252,"112":0.00252,"113":0.00252,"114":0.00252,"115":0.06053,"116":0.01765,"117":0.23455,"118":0.02018,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00757,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.01009,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00252,"65":0,"66":0,"67":0.00252,"68":0,"69":0,"70":0.00252,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.00504,"78":0,"79":0.01261,"80":0.00252,"81":0.01261,"83":0.00504,"84":0,"85":0.00252,"86":0,"87":0.05801,"88":0.00504,"89":0.01009,"90":0.00252,"91":0.00757,"92":0.00252,"93":0.00252,"94":0.00757,"95":0.00757,"96":0.00252,"97":0.00504,"98":0.00504,"99":0.00504,"100":0.00504,"101":0.00504,"102":0.01009,"103":0.01261,"104":0.01513,"105":0.00504,"106":0.01009,"107":0.01261,"108":0.01765,"109":0.60276,"110":0.00252,"111":0.00504,"112":0.00504,"113":0.01009,"114":0.03026,"115":0.07566,"116":1.9722,"117":0.54475,"118":0,"119":0.00252,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00252,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0.01765,"62":0,"63":0.00252,"64":0,"65":0.00252,"66":0.00504,"67":0.00252,"68":0.00252,"69":0.00504,"70":0.00504,"71":0.05548,"72":0.03531,"73":0.00504,"74":0.00757,"75":0,"76":0.00252,"77":0.00504,"78":0.00252,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00504,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01261,"96":0,"97":0,"98":0,"99":0,"100":0.00504,"101":0.06809,"102":0.06557,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0.00252,"16":0,"17":0,"18":0.00504,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0.00252,"86":0,"87":0.00252,"88":0,"89":0,"90":0.00252,"91":0,"92":0.01009,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0.00504,"106":0,"107":0.00252,"108":0,"109":0.00504,"110":0,"111":0,"112":0.00504,"113":0.00252,"114":0.00504,"115":0.01513,"116":0.33543,"117":0.23707},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00504,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0.00252,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00757,"14.1":0.01009,"15.1":0,"15.2-15.3":0,"15.4":0.00252,"15.5":0.00252,"15.6":0.01513,"16.0":0,"16.1":0.00252,"16.2":0.00252,"16.3":0.00504,"16.4":0.00252,"16.5":0.00757,"16.6":0.02018,"17.0":0.00504,"17.1":0},G:{"8":0.0086,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00215,"6.0-6.1":0.0086,"7.0-7.1":0.03654,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.03439,"10.0-10.2":0,"10.3":0.09457,"11.0-11.2":0.06663,"11.3-11.4":0.01719,"12.0-12.1":0.25791,"12.2-12.5":2.95738,"13.0-13.1":0.03224,"13.2":0.00645,"13.3":0.04299,"13.4-13.7":0.18484,"14.0-14.4":0.89194,"14.5-14.8":0.88764,"15.0-15.1":0.56096,"15.2-15.3":0.55236,"15.4":0.16334,"15.5":0.25791,"15.6-15.7":3.3507,"16.0":0.79952,"16.1":0.85326,"16.2":0.52442,"16.3":0.92633,"16.4":0.5803,"16.5":1.31105,"16.6":4.51774,"17.0":1.38842,"17.1":0},P:{"4":0.06145,"20":0.04097,"21":0.15362,"22":0.74764,"5.0-5.4":0.01024,"6.2-6.4":0,"7.2-7.4":0.20483,"8.2":0,"9.2":0.01024,"10.1":0,"11.1-11.2":0.02048,"12.0":0,"13.0":0,"14.0":0.02048,"15.0":0,"16.0":0.05121,"17.0":0.01024,"18.0":0.03072,"19.0":0.05121},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.0013,"4.4":0,"4.4.3-4.4.4":0.05644},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00252,"5.5":0},S:{"2.5":0.01496,_:"3.0-3.1"},J:{"7":0,"10":0.05982},N:{"10":0,"11":0},L:{"0":69.48656},R:{_:"0"},M:{"0":0.10469},Q:{"13.1":0.00748},O:{"0":0.12713},H:{"0":1.3947}};
    +module.exports={C:{"34":0.00205,"52":0.0041,"57":0.00205,"58":0.00205,"67":0.00205,"68":0.00205,"72":0.0041,"76":0.00205,"78":0.00205,"79":0.0041,"86":0.00205,"87":0.00205,"89":0.00205,"94":0.00205,"95":0.0041,"97":0.00205,"99":0.00205,"100":0.0041,"102":0.00205,"103":0.00205,"106":0.0041,"108":0.00205,"109":0.00205,"113":0.0041,"114":0.00616,"115":0.16826,"116":0.0041,"117":0.00205,"118":0.03078,"119":0.67921,"120":0.21751,"121":0.00205,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 59 60 61 62 63 64 65 66 69 70 71 73 74 75 77 80 81 82 83 84 85 88 90 91 92 93 96 98 101 104 105 107 110 111 112 122 123 3.5 3.6"},D:{"11":0.00205,"32":0.00205,"38":0.00205,"41":0.0041,"43":0.00205,"47":0.0041,"49":0.02052,"50":0.00205,"56":0.0041,"63":0.00205,"64":0.0041,"65":0.00821,"67":0.00205,"68":0.00205,"69":0.00616,"70":0.03283,"72":0.0041,"73":0.00205,"74":0.00616,"75":0.00821,"76":0.00616,"77":0.00205,"78":0.00205,"79":0.04925,"80":0.01642,"81":0.00616,"83":0.01847,"85":0.00616,"86":0.00821,"87":0.19699,"88":0.02257,"89":0.01642,"90":0.00616,"91":0.00616,"92":0.01026,"93":0.02668,"94":0.00821,"95":0.01642,"96":0.00821,"97":0.0041,"98":0.01847,"99":0.01642,"100":0.03283,"101":0.01436,"102":0.03283,"103":0.06361,"104":0.01847,"105":0.02873,"106":0.02257,"107":0.03078,"108":0.03078,"109":2.17102,"110":0.01026,"111":0.01026,"112":0.02052,"113":0.01231,"114":0.04514,"115":0.02257,"116":0.14774,"117":0.18263,"118":1.84885,"119":7.63139,"120":0.0041,"121":0.00205,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 33 34 35 36 37 39 40 42 44 45 46 48 51 52 53 54 55 57 58 59 60 61 62 66 71 84 122"},F:{"37":0.00205,"46":0.00205,"79":0.00205,"81":0.00205,"82":0.00205,"91":0.00205,"95":0.05746,"99":0.00205,"100":0.00205,"101":0.00205,"102":0.03283,"103":0.14774,"104":0.31601,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 83 84 85 86 87 88 89 90 92 93 94 96 97 98 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00205,"14":0.00205,"15":0.00205,"17":0.0041,"18":0.01436,"84":0.00205,"85":0.00205,"89":0.01231,"90":0.0041,"92":0.02873,"100":0.00205,"107":0.00205,"109":0.02052,"110":0.00205,"111":0.00205,"112":0.00205,"113":0.0041,"114":0.00821,"115":0.00616,"116":0.01026,"117":0.02257,"118":0.31806,"119":1.63955,_:"13 16 79 80 81 83 86 87 88 91 93 94 95 96 97 98 99 101 102 103 104 105 106 108"},E:{"12":0.00205,"14":0.00205,"15":0.00205,_:"0 4 5 6 7 8 9 10 11 13 3.1 3.2 6.1 7.1 9.1 10.1 15.2-15.3 15.4","5.1":0.0041,"11.1":0.00205,"12.1":0.0041,"13.1":0.03078,"14.1":0.01642,"15.1":0.00205,"15.5":0.00205,"15.6":0.04309,"16.0":0.00205,"16.1":0.0041,"16.2":0.0041,"16.3":0.01436,"16.4":0.01231,"16.5":0.01436,"16.6":0.11696,"17.0":0.04104,"17.1":0.06156,"17.2":0.00616},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00358,"5.0-5.1":0.00358,"6.0-6.1":0.00895,"7.0-7.1":0.01253,"8.1-8.4":0.00179,"9.0-9.2":0.01431,"9.3":0.04473,"10.0-10.2":0.00358,"10.3":0.06442,"11.0-11.2":0.03042,"11.3-11.4":0.02684,"12.0-12.1":0.0161,"12.2-12.5":0.29345,"13.0-13.1":0.00716,"13.2":0.03042,"13.3":0.01789,"13.4-13.7":0.05189,"14.0-14.4":0.13778,"14.5-14.8":0.22366,"15.0-15.1":0.08768,"15.2-15.3":0.10736,"15.4":0.11988,"15.5":0.1682,"15.6-15.7":0.88392,"16.0":0.41512,"16.1":0.83203,"16.2":0.39902,"16.3":0.74794,"16.4":0.15388,"16.5":0.39723,"16.6-16.7":6.73321,"17.0":2.01656,"17.1":3.38718,"17.2":0.09662},P:{"4":0.09238,"20":0.03079,"21":0.06159,"22":0.27715,"23":0.45165,_:"5.0-5.4 8.2 10.1 12.0","6.2-6.4":0.01026,"7.2-7.4":0.18477,"9.2":0.02053,"11.1-11.2":0.01026,"13.0":0.01026,"14.0":0.04106,"15.0":0.01026,"16.0":0.03079,"17.0":0.01026,"18.0":0.01026,"19.0":0.05132},I:{"0":0.06327,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00004,"4.4":0,"4.4.3-4.4.4":0.00019},K:{"0":0.69337,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.00821,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.02385,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.11924},H:{"0":0.34},L:{"0":61.75318},R:{_:"0"},M:{"0":0.11924},Q:{"13.1":0.0159}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CK.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CK.js
    index 948d4b8610ad49..fd39c95a2a3cc9 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CK.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CK.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00742,"108":0,"109":0,"110":0,"111":0,"112":0.00742,"113":0.00371,"114":0.00742,"115":0.06304,"116":0.01483,"117":0.3226,"118":0.02225,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0.08528,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00371,"50":0.00371,"51":0,"52":0,"53":0.05562,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"83":0.00742,"84":0,"85":0.00371,"86":0,"87":0.02596,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.00371,"95":0,"96":0,"97":0,"98":0.00742,"99":0,"100":0,"101":0,"102":0.00371,"103":0.01483,"104":0,"105":0.01112,"106":0.0482,"107":0,"108":0,"109":0.22248,"110":0.00371,"111":0.08528,"112":0.01112,"113":0,"114":0.16315,"115":0.0927,"116":8.762,"117":1.46095,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.01112,"73":0,"74":0,"75":0,"76":0,"77":0.00371,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.00371,"102":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.01112,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.00371,"102":0,"103":0,"104":0.00371,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0.02225,"111":0,"112":0,"113":0,"114":0.00371,"115":0.02225,"116":0.52283,"117":0.28181},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00371,"14":0.02596,"15":0.00742,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00742,"14.1":0.05933,"15.1":0,"15.2-15.3":0.00371,"15.4":0.02596,"15.5":0.01854,"15.6":0.09641,"16.0":0.00371,"16.1":0.0482,"16.2":0.0482,"16.3":0.03708,"16.4":0.00742,"16.5":0.10382,"16.6":0.36338,"17.0":0.00371,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0.28932,"13.0-13.1":0.02019,"13.2":0,"13.3":0,"13.4-13.7":0.02019,"14.0-14.4":0.1884,"14.5-14.8":0.64929,"15.0-15.1":0.23213,"15.2-15.3":0.4037,"15.4":0.09756,"15.5":0.33978,"15.6-15.7":1.68883,"16.0":0.66275,"16.1":2.60053,"16.2":1.35914,"16.3":2.35494,"16.4":1.06982,"16.5":1.89405,"16.6":18.76218,"17.0":0.82423,"17.1":0},P:{"4":0,"20":0.1015,"21":0.56837,"22":3.82637,"5.0-5.4":0,"6.2-6.4":0.05075,"7.2-7.4":0.0406,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.17254,"12.0":0,"13.0":0.01015,"14.0":0.0406,"15.0":0,"16.0":0.0812,"17.0":0.0203,"18.0":0.21314,"19.0":0.30449},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0.01854,"11":0.03708,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":44.9559},R:{_:"0"},M:{"0":0.37123},Q:{"13.1":0},O:{"0":0.06921},H:{"0":0.08935}};
    +module.exports={C:{"78":0.00376,"113":0.01503,"114":0.00376,"115":0.12774,"116":0.00376,"117":0.00376,"118":0.01127,"119":0.43957,"120":0.20288,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 121 122 123 3.5 3.6"},D:{"41":0.42078,"83":0.00376,"87":0.01503,"94":0.01503,"99":0.00376,"103":0.05636,"105":0.00376,"106":0.04884,"109":0.63869,"110":0.00376,"112":0.01127,"114":0.18409,"115":0.01503,"116":0.18409,"117":0.33062,"118":6.58978,"119":24.26271,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 84 85 86 88 89 90 91 92 93 95 96 97 98 100 101 102 104 107 108 111 113 120 121 122"},F:{_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"17":0.00751,"18":0.01503,"92":0.01127,"109":0.00376,"114":0.0263,"115":0.00376,"116":0.04884,"117":0.02254,"118":0.24421,"119":1.44645,_:"12 13 14 15 16 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 111 112 113"},E:{"13":0.00376,"14":0.0263,"15":0.00751,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 15.4 17.2","12.1":0.01503,"13.1":0.0263,"14.1":0.05636,"15.1":0.05636,"15.2-15.3":0.05636,"15.5":0.00751,"15.6":0.06387,"16.0":0.10895,"16.1":0.01879,"16.2":0.01503,"16.3":0.1052,"16.4":0.06387,"16.5":0.0789,"16.6":0.57858,"17.0":0.08641,"17.1":0.14277},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00448,"5.0-5.1":0.00448,"6.0-6.1":0.01119,"7.0-7.1":0.01567,"8.1-8.4":0.00224,"9.0-9.2":0.0179,"9.3":0.05595,"10.0-10.2":0.00448,"10.3":0.08057,"11.0-11.2":0.03805,"11.3-11.4":0.03357,"12.0-12.1":0.02014,"12.2-12.5":0.36705,"13.0-13.1":0.00895,"13.2":0.03805,"13.3":0.02238,"13.4-13.7":0.06491,"14.0-14.4":0.17233,"14.5-14.8":0.27976,"15.0-15.1":0.10967,"15.2-15.3":0.13429,"15.4":0.14995,"15.5":0.21038,"15.6-15.7":1.10563,"16.0":0.51924,"16.1":1.04072,"16.2":0.4991,"16.3":0.93553,"16.4":0.19248,"16.5":0.49686,"16.6-16.7":8.42203,"17.0":2.52236,"17.1":4.23675,"17.2":0.12086},P:{"20":0.20451,"21":0.32721,"22":1.26795,"23":3.80386,_:"4 6.2-6.4 8.2 9.2 10.1 12.0 14.0 15.0 17.0","5.0-5.4":0.01023,"7.2-7.4":0.02045,"11.1-11.2":0.07158,"13.0":0.01023,"16.0":0.0409,"18.0":0.14316,"19.0":0.14316},I:{"0":0.00621,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.00002},K:{"0":0.06243,_:"10 11 12 11.1 11.5 12.1"},A:{"10":0.0263,"11":0.16155,_:"6 7 8 9 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.02497},H:{"0":0},L:{"0":33.91055},R:{_:"0"},M:{"0":0.31839},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CL.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CL.js
    index 4fba3899adbb27..b8c11d61ae905e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CL.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CL.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00455,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00455,"69":0.00455,"70":0.00455,"71":0,"72":0,"73":0.00455,"74":0.00455,"75":0,"76":0.00455,"77":0,"78":0.00455,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.0091,"103":0,"104":0.01364,"105":0,"106":0,"107":0,"108":0.00455,"109":0.00455,"110":0.00455,"111":0.00455,"112":0,"113":0.00455,"114":0.0091,"115":0.08641,"116":0.03184,"117":0.75952,"118":0.05003,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.0091,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00455,"48":0.00455,"49":0.01819,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00455,"66":0,"67":0,"68":0.00455,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0.00455,"75":0.0091,"76":0.00455,"77":0,"78":0,"79":0.05912,"80":0,"81":0.00455,"83":0.0091,"84":0.0091,"85":0.00455,"86":0.01364,"87":0.01364,"88":0.01364,"89":0.00455,"90":0.00455,"91":0.02729,"92":0.0091,"93":0.00455,"94":0.00455,"95":0.00455,"96":0.0091,"97":0.00455,"98":0.00455,"99":0.01819,"100":0.00455,"101":0.00455,"102":0.0091,"103":0.04093,"104":0.00455,"105":0.01364,"106":0.02729,"107":0.01364,"108":0.03184,"109":0.83228,"110":0.01819,"111":0.03184,"112":0.02729,"113":0.04093,"114":0.11825,"115":0.2365,"116":9.5508,"117":2.7288,"118":0.00455,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00455,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00455,"73":0,"74":0,"75":0,"76":0,"77":0.01819,"78":0.00455,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0.00455,"85":0.00455,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.00455,"95":0.01819,"96":0,"97":0,"98":0,"99":0.0091,"100":0.42751,"101":0.63672,"102":1.13245,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0.00455,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.0091,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00455,"108":0.00455,"109":0.01364,"110":0.00455,"111":0.0091,"112":0.00455,"113":0.00455,"114":0.02274,"115":0.04548,"116":0.9187,"117":0.7868},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00455,"10":0,"11":0,"12":0,"13":0,"14":0.01364,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.0091,"10.1":0,"11.1":0,"12.1":0.00455,"13.1":0.01819,"14.1":0.03638,"15.1":0.00455,"15.2-15.3":0.0091,"15.4":0.00455,"15.5":0.01364,"15.6":0.05912,"16.0":0.00455,"16.1":0.01819,"16.2":0.01364,"16.3":0.04548,"16.4":0.02274,"16.5":0.05912,"16.6":0.28198,"17.0":0.02729,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00303,"6.0-6.1":0,"7.0-7.1":0.00303,"8.1-8.4":0.00607,"9.0-9.2":0,"9.3":0.04397,"10.0-10.2":0,"10.3":0.01516,"11.0-11.2":0.02123,"11.3-11.4":0.00303,"12.0-12.1":0.01061,"12.2-12.5":0.18651,"13.0-13.1":0.01213,"13.2":0,"13.3":0.02881,"13.4-13.7":0.03639,"14.0-14.4":0.09401,"14.5-14.8":0.22139,"15.0-15.1":0.03639,"15.2-15.3":0.08795,"15.4":0.07127,"15.5":0.15315,"15.6-15.7":1.06751,"16.0":0.36999,"16.1":0.71723,"16.2":0.31843,"16.3":0.75969,"16.4":0.13192,"16.5":0.46552,"16.6":8.94493,"17.0":1.22066,"17.1":0.00303},P:{"4":0.13272,"20":0.05105,"21":0.10209,"22":1.59263,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.04084,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.02042,"12.0":0,"13.0":0.01021,"14.0":0.01021,"15.0":0.01021,"16.0":0.03063,"17.0":0.02042,"18.0":0.02042,"19.0":0.04084},I:{"0":0,"3":0,"4":0.01011,"2.1":0,"2.2":0.00337,"2.3":0.00674,"4.1":0.00674,"4.2-4.3":0.03033,"4.4":0,"4.4.3-4.4.4":0.08089},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01462,"9":0.00487,"10":0.00487,"11":0.04386,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":61.06093},R:{_:"0"},M:{"0":0.19082},Q:{"13.1":0},O:{"0":0.02181},H:{"0":0.21163}};
    +module.exports={C:{"52":0.00927,"68":0.02318,"78":0.01391,"88":0.00464,"105":0.00464,"108":0.00464,"109":0.00464,"110":0.00464,"111":0.00464,"113":0.00464,"114":0.01391,"115":0.15299,"116":0.00927,"117":0.01391,"118":0.03245,"119":1.04774,"120":0.29207,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 106 107 112 121 122 123 3.5 3.6"},D:{"38":0.01854,"47":0.00464,"48":0.00927,"49":0.02782,"51":0.00464,"58":0.00464,"63":0.00464,"65":0.00464,"67":0.00464,"70":0.00464,"74":0.00927,"76":0.00464,"78":0.00464,"79":0.12517,"80":0.00464,"81":0.00927,"84":0.00464,"85":0.00464,"86":0.00464,"87":0.03709,"88":0.00464,"89":0.00927,"90":0.00464,"91":0.07418,"92":0.00464,"93":0.00927,"94":0.00464,"95":0.02318,"96":0.00927,"97":0.00927,"98":0.00464,"99":0.01391,"100":0.01854,"101":0.01391,"102":0.01391,"103":0.07418,"104":0.00927,"105":0.00927,"106":0.03245,"107":0.051,"108":0.06954,"109":1.68287,"110":0.02318,"111":0.04636,"112":0.04172,"113":0.051,"114":0.08345,"115":0.07418,"116":0.42651,"117":0.37552,"118":5.0347,"119":22.58659,"120":0.01854,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 50 52 53 54 55 56 57 59 60 61 62 64 66 68 69 71 72 73 75 77 83 121 122"},F:{"28":0.00464,"85":0.00464,"91":0.00464,"95":0.03709,"97":0.00464,"101":0.00464,"102":2.64252,"103":0.19935,"104":1.98884,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 86 87 88 89 90 92 93 94 96 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"92":0.01391,"100":0.00464,"103":0.00464,"106":0.00464,"107":0.00464,"108":0.00464,"109":0.02782,"110":0.00464,"111":0.03245,"113":0.00464,"114":0.01391,"115":0.02782,"116":0.01854,"117":0.06954,"118":0.62122,"119":3.37964,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 101 102 104 105 112"},E:{"14":0.01854,"15":0.00464,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.00927,"13.1":0.03709,"14.1":0.0649,"15.1":0.01391,"15.2-15.3":0.01391,"15.4":0.01391,"15.5":0.02318,"15.6":0.13444,"16.0":0.00927,"16.1":0.04636,"16.2":0.01854,"16.3":0.0649,"16.4":0.04636,"16.5":0.07418,"16.6":0.27816,"17.0":0.20398,"17.1":0.27816,"17.2":0.00927},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00189,"5.0-5.1":0.00189,"6.0-6.1":0.00473,"7.0-7.1":0.00663,"8.1-8.4":0.00095,"9.0-9.2":0.00757,"9.3":0.02367,"10.0-10.2":0.00189,"10.3":0.03408,"11.0-11.2":0.01609,"11.3-11.4":0.0142,"12.0-12.1":0.00852,"12.2-12.5":0.15527,"13.0-13.1":0.00379,"13.2":0.01609,"13.3":0.00947,"13.4-13.7":0.02746,"14.0-14.4":0.0729,"14.5-14.8":0.11834,"15.0-15.1":0.04639,"15.2-15.3":0.0568,"15.4":0.06343,"15.5":0.08899,"15.6-15.7":0.46769,"16.0":0.21965,"16.1":0.44024,"16.2":0.21112,"16.3":0.39574,"16.4":0.08142,"16.5":0.21018,"16.6-16.7":3.56261,"17.0":1.06698,"17.1":1.79219,"17.2":0.05112},P:{"4":0.09367,"20":0.04163,"21":0.05204,"22":0.18734,"23":1.52994,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 12.0 14.0","7.2-7.4":0.06245,"11.1-11.2":0.02082,"13.0":0.01041,"15.0":0.01041,"16.0":0.03122,"17.0":0.01041,"18.0":0.01041,"19.0":0.03122},I:{"0":0.0427,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00013},K:{"0":0.23065,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.01498,"9":0.00499,"10":0.00999,"11":0.09985,_:"6 7 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.03755},H:{"0":0},L:{"0":43.98425},R:{_:"0"},M:{"0":0.17165},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CM.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CM.js
    index 74402d0a7001e6..72c03fd4af56a9 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CM.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CM.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00662,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00221,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00221,"79":0,"80":0,"81":0.00221,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00442,"89":0.00221,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00221,"96":0,"97":0,"98":0,"99":0.00221,"100":0,"101":0,"102":0.00883,"103":0.00442,"104":0.00221,"105":0,"106":0.0265,"107":0.00221,"108":0.00221,"109":0.00221,"110":0.00221,"111":0.00221,"112":0.00221,"113":0.00662,"114":0.00221,"115":0.10598,"116":0.02208,"117":0.18768,"118":0.0287,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00221,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00662,"57":0,"58":0.00221,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00221,"65":0,"66":0,"67":0,"68":0.00442,"69":0,"70":0.00221,"71":0.00221,"72":0.00221,"73":0,"74":0.00221,"75":0,"76":0.00221,"77":0,"78":0,"79":0.00221,"80":0,"81":0.00221,"83":0,"84":0,"85":0.00883,"86":0.00221,"87":0.00221,"88":0.00221,"89":0.00221,"90":0.00221,"91":0.00221,"92":0,"93":0,"94":0.00221,"95":0.00442,"96":0.00221,"97":0,"98":0,"99":0.00221,"100":0.00221,"101":0,"102":0.00221,"103":0.00883,"104":0,"105":0.00221,"106":0.00662,"107":0.00442,"108":0.00662,"109":0.21859,"110":0.00221,"111":0.00442,"112":0.00442,"113":0.01104,"114":0.02208,"115":0.04858,"116":0.89203,"117":0.21638,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00662,"38":0,"39":0,"40":0,"41":0,"42":0.00221,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0.00221,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00221,"60":0.01766,"62":0,"63":0.03312,"64":0.00442,"65":0.00662,"66":0.04195,"67":0.01104,"68":0.00662,"69":0.03533,"70":0.02208,"71":0.06182,"72":0.09936,"73":0.0265,"74":0,"75":0,"76":0,"77":0.00221,"78":0.00221,"79":0.00442,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00883,"96":0,"97":0,"98":0,"99":0,"100":0.00221,"101":0.05078,"102":0.06403,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00221},B:{"12":0.00221,"13":0.00221,"14":0.00442,"15":0,"16":0,"17":0.00221,"18":0.00442,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.00221,"90":0.00221,"91":0,"92":0.00883,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00221,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00221,"108":0,"109":0.00221,"110":0,"111":0,"112":0.00221,"113":0.00221,"114":0.00662,"115":0.01546,"116":0.13469,"117":0.06845},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00221,"11":0,"12":0,"13":0.00221,"14":0.00221,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00221,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00221,"14.1":0.00221,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0.00442,"16.0":0,"16.1":0.00221,"16.2":0,"16.3":0.00221,"16.4":0,"16.5":0.00221,"16.6":0.00442,"17.0":0,"17.1":0},G:{"8":0.03371,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.02107,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.01686,"10.0-10.2":0.00421,"10.3":0.23318,"11.0-11.2":0.00421,"11.3-11.4":0.01124,"12.0-12.1":0.2093,"12.2-12.5":2.06916,"13.0-13.1":0.02529,"13.2":0.10114,"13.3":0.09693,"13.4-13.7":0.18823,"14.0-14.4":0.84986,"14.5-14.8":0.59139,"15.0-15.1":0.54925,"15.2-15.3":0.48744,"15.4":0.3273,"15.5":0.57875,"15.6-15.7":2.69286,"16.0":0.4453,"16.1":0.49025,"16.2":0.33854,"16.3":0.76839,"16.4":0.48463,"16.5":0.88919,"16.6":1.28814,"17.0":0.21492,"17.1":0},P:{"4":0.24378,"20":0.0711,"21":0.0711,"22":0.30472,"5.0-5.4":0.0711,"6.2-6.4":0.01016,"7.2-7.4":0.09142,"8.2":0,"9.2":0.09142,"10.1":0,"11.1-11.2":0.03047,"12.0":0,"13.0":0.01016,"14.0":0.02031,"15.0":0,"16.0":0.05079,"17.0":0.01016,"18.0":0.02031,"19.0":0.04063},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00081,"4.2-4.3":0.00377,"4.4":0,"4.4.3-4.4.4":0.04529},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.0265,"5.5":0},S:{"2.5":0.17922,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":76.19139},R:{_:"0"},M:{"0":0.14026},Q:{"13.1":0},O:{"0":0.40518},H:{"0":3.76225}};
    +module.exports={C:{"4":0.00272,"33":0.00136,"38":0.00136,"43":0.00272,"44":0.00272,"45":0.00136,"47":0.00544,"48":0.00136,"49":0.00136,"50":0.00408,"51":0.00544,"52":0.0313,"56":0.00136,"58":0.00136,"60":0.00272,"63":0.00136,"64":0.00136,"65":0.00136,"67":0.00136,"68":0.00272,"72":0.00544,"75":0.00136,"78":0.00272,"79":0.00136,"81":0.00136,"82":0.00136,"88":0.00136,"89":0.00136,"91":0.00136,"99":0.00136,"100":0.00272,"102":0.00544,"103":0.00544,"104":0.00136,"105":0.00136,"106":0.00408,"107":0.00408,"108":0.00544,"109":0.00408,"110":0.00953,"111":0.00681,"112":0.00408,"113":0.01089,"114":0.00544,"115":0.34978,"116":0.00544,"117":0.00681,"118":0.03811,"119":0.72677,"120":0.21912,"121":0.00136,_:"2 3 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 37 39 40 41 42 46 53 54 55 57 59 61 62 66 69 70 71 73 74 76 77 80 83 84 85 86 87 90 92 93 94 95 96 97 98 101 122 123 3.5 3.6"},D:{"30":0.00136,"33":0.00136,"35":0.00136,"36":0.00408,"38":0.00681,"39":0.00136,"40":0.00136,"41":0.00408,"43":0.00136,"44":0.00408,"50":0.00136,"51":0.00136,"53":0.00136,"55":0.00136,"56":0.0313,"57":0.00408,"58":0.00272,"63":0.00136,"64":0.00272,"65":0.00136,"67":0.00681,"68":0.02858,"69":0.00408,"70":0.00272,"71":0.00136,"72":0.00136,"73":0.00136,"74":0.00544,"75":0.00408,"76":0.01089,"77":0.00544,"78":0.00136,"79":0.02586,"80":0.00681,"81":0.00681,"83":0.00136,"85":0.02722,"86":0.00272,"87":0.00681,"88":0.00408,"89":0.00272,"90":0.00544,"91":0.00953,"92":0.00136,"93":0.02858,"94":0.00272,"95":0.02994,"96":0.00408,"97":0.00136,"98":0.00544,"99":0.00408,"100":0.00817,"101":0.00136,"102":0.00544,"103":0.02722,"104":0.00272,"105":0.01361,"106":0.02722,"107":0.01225,"108":0.01905,"109":0.79755,"110":0.00272,"111":0.01633,"112":0.00817,"113":0.02314,"114":0.03947,"115":0.02994,"116":0.06261,"117":0.09799,"118":0.97584,"119":3.22557,"120":0.00136,"121":0.00817,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 31 32 34 37 42 45 46 47 48 49 52 54 59 60 61 62 66 84 122"},F:{"44":0.00136,"64":0.00136,"66":0.00272,"79":0.00681,"84":0.00136,"85":0.00272,"86":0.00136,"87":0.00136,"90":0.00136,"95":0.049,"100":0.00136,"101":0.00272,"102":0.02178,"103":0.08166,"104":0.22184,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 65 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 88 89 91 92 93 94 96 97 98 99 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.01225,"13":0.00272,"14":0.01089,"15":0.00272,"16":0.00408,"17":0.00681,"18":0.0245,"84":0.00544,"85":0.00136,"89":0.00544,"90":0.00544,"92":0.03266,"100":0.00544,"105":0.00272,"107":0.00136,"109":0.00953,"110":0.00136,"111":0.00136,"112":0.01089,"113":0.00136,"114":0.00817,"115":0.01361,"116":0.01361,"117":0.02586,"118":0.16196,"119":0.62878,_:"79 80 81 83 86 87 88 91 93 94 95 96 97 98 99 101 102 103 104 106 108"},E:{"10":0.00544,"13":0.00136,"14":0.00272,_:"0 4 5 6 7 8 9 11 12 15 3.1 3.2 6.1 7.1 9.1 10.1 15.4 16.2 17.2","5.1":0.00817,"11.1":0.00136,"12.1":0.00272,"13.1":0.00544,"14.1":0.00408,"15.1":0.01633,"15.2-15.3":0.00136,"15.5":0.00136,"15.6":0.01361,"16.0":0.00136,"16.1":0.00136,"16.3":0.00953,"16.4":0.00681,"16.5":0.00408,"16.6":0.00681,"17.0":0.00681,"17.1":0.01089},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00223,"5.0-5.1":0.00223,"6.0-6.1":0.00558,"7.0-7.1":0.00781,"8.1-8.4":0.00112,"9.0-9.2":0.00893,"9.3":0.0279,"10.0-10.2":0.00223,"10.3":0.04018,"11.0-11.2":0.01897,"11.3-11.4":0.01674,"12.0-12.1":0.01005,"12.2-12.5":0.18305,"13.0-13.1":0.00446,"13.2":0.01897,"13.3":0.01116,"13.4-13.7":0.03237,"14.0-14.4":0.08594,"14.5-14.8":0.13952,"15.0-15.1":0.05469,"15.2-15.3":0.06697,"15.4":0.07478,"15.5":0.10492,"15.6-15.7":0.55138,"16.0":0.25895,"16.1":0.51901,"16.2":0.2489,"16.3":0.46655,"16.4":0.09599,"16.5":0.24779,"16.6-16.7":4.20011,"17.0":1.25791,"17.1":2.11289,"17.2":0.06027},P:{"4":0.10778,"20":0.04899,"21":0.08818,"22":0.09798,"23":0.14697,"5.0-5.4":0.02939,"6.2-6.4":0.0098,"7.2-7.4":0.06859,_:"8.2 12.0","9.2":0.04899,"10.1":0.0098,"11.1-11.2":0.02939,"13.0":0.0098,"14.0":0.0098,"15.0":0.0098,"16.0":0.02939,"17.0":0.0098,"18.0":0.0098,"19.0":0.03919},I:{"0":0.04298,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00013},K:{"0":1.69696,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00136,"11":0.08438,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.1555,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.25917},H:{"0":1.75},L:{"0":74.68827},R:{_:"0"},M:{"0":0.18142},Q:{"13.1":0.00864}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CN.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CN.js
    index 3e5ff5e4a2c8b4..6562f194dda9bd 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CN.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CN.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00353,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.02115,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00705,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00353,"69":0,"70":0,"71":0,"72":0.07755,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00353,"79":0,"80":0,"81":0,"82":0,"83":0.01763,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00353,"103":0,"104":0,"105":0,"106":0.00353,"107":0,"108":0.00353,"109":0.00353,"110":0.00705,"111":0.00353,"112":0.00353,"113":0.00353,"114":0.00705,"115":0.05993,"116":0.0564,"117":0.15158,"118":0.01058,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00353,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00353,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0.00353,"42":0,"43":0,"44":0,"45":0.00353,"46":0,"47":0.00353,"48":0.02115,"49":0.02115,"50":0.05288,"51":0,"52":0,"53":0.01058,"54":0,"55":0.01763,"56":0.00353,"57":0.01058,"58":0.00705,"59":0.00353,"60":0.00353,"61":0.00353,"62":0.00705,"63":0.01058,"64":0,"65":0.00353,"66":0,"67":0.00353,"68":0.00353,"69":0.3102,"70":0.4935,"71":0.00353,"72":0.00705,"73":0.2397,"74":0.00353,"75":0.0423,"76":0.00353,"77":0.0282,"78":0.05288,"79":0.06345,"80":0.01763,"81":0.01058,"83":0.06698,"84":0.01763,"85":0.00353,"86":0.12338,"87":0.04935,"88":0.0141,"89":0.02115,"90":0.04583,"91":0.03525,"92":0.0846,"93":0.00353,"94":0.0564,"95":0.01058,"96":0.00705,"97":0.0564,"98":0.41595,"99":0.1692,"100":0.07403,"101":0.03173,"102":0.01763,"103":0.02115,"104":0.00705,"105":0.0141,"106":0.01058,"107":0.02468,"108":0.02115,"109":0.18683,"110":0.00705,"111":0.00705,"112":0.0423,"113":0.05993,"114":0.13748,"115":0.08108,"116":0.67328,"117":0.16568,"118":0.01763,"119":0.00353,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.00353,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00353,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.00353,"102":0.00353,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0.00353,"17":0.00353,"18":0.0282,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00353,"89":0.00353,"90":0,"91":0,"92":0.01763,"93":0,"94":0,"95":0,"96":0.00353,"97":0,"98":0,"99":0.00353,"100":0.00353,"101":0.00353,"102":0.00353,"103":0.00353,"104":0.00353,"105":0.00353,"106":0.00353,"107":0.01058,"108":0.02115,"109":0.04935,"110":0.02468,"111":0.02468,"112":0.03525,"113":0.11633,"114":0.10223,"115":0.14805,"116":1.42058,"117":0.84953},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00353,"14":0.02115,"15":0.00353,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00353,"13.1":0.02115,"14.1":0.02468,"15.1":0.00353,"15.2-15.3":0.00353,"15.4":0.0141,"15.5":0.01763,"15.6":0.0564,"16.0":0.00705,"16.1":0.02468,"16.2":0.02115,"16.3":0.03878,"16.4":0.0141,"16.5":0.03525,"16.6":0.20798,"17.0":0.0141,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.06187,"5.0-5.1":0.02912,"6.0-6.1":0.01638,"7.0-7.1":0.00728,"8.1-8.4":0.0091,"9.0-9.2":0.11464,"9.3":0.02366,"10.0-10.2":0.03276,"10.3":0.28024,"11.0-11.2":0.20199,"11.3-11.4":0.07279,"12.0-12.1":0.08553,"12.2-12.5":0.42764,"13.0-13.1":0.02912,"13.2":0.06005,"13.3":0.08371,"13.4-13.7":0.50043,"14.0-14.4":0.72971,"14.5-14.8":0.7006,"15.0-15.1":0.40398,"15.2-15.3":0.39488,"15.4":0.57503,"15.5":0.43492,"15.6-15.7":1.26289,"16.0":0.63145,"16.1":1.23378,"16.2":0.78066,"16.3":1.28837,"16.4":0.43128,"16.5":0.93716,"16.6":5.83951,"17.0":0.40034,"17.1":0},P:{"4":0,"20":0.01101,"21":0.02202,"22":0.20914,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0.07705,"15.0":0,"16.0":0,"17.0":0.01101,"18.0":0,"19.0":0},I:{"0":0,"3":0,"4":0.07649,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.53545,"4.4":0,"4.4.3-4.4.4":3.13621},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.03529,"9":0.67057,"10":0,"11":2.18817,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":48.2423},R:{_:"0"},M:{"0":0.12303},Q:{"13.1":3.885},O:{"0":8.12613},H:{"0":0.03678}};
    +module.exports={C:{"21":0.00372,"34":0.00744,"43":0.07812,"52":0.0186,"56":0.00372,"63":0.00372,"69":0.00372,"72":0.19716,"78":0.00744,"83":0.00372,"88":0.00372,"89":0.00372,"91":0.00372,"93":0.00372,"100":0.00372,"102":0.00372,"103":0.00372,"104":0.00372,"105":0.00372,"106":0.00372,"107":0.00372,"108":0.01116,"109":0.00744,"110":0.0186,"111":0.00744,"112":0.00372,"113":0.00372,"114":0.00372,"115":0.16368,"116":0.03348,"117":0.00744,"118":0.02976,"119":0.62496,"120":0.1116,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 44 45 46 47 48 49 50 51 53 54 55 57 58 59 60 61 62 64 65 66 67 68 70 71 73 74 75 76 77 79 80 81 82 84 85 86 87 90 92 94 95 96 97 98 99 101 121 122 123 3.5 3.6"},D:{"11":0.00744,"27":0.00372,"31":0.00744,"33":0.00372,"40":0.00372,"41":0.01116,"42":0.00372,"43":0.00372,"45":0.01116,"47":0.01488,"48":0.08556,"49":0.05952,"50":0.25668,"51":0.00372,"53":0.02232,"54":0.00372,"55":0.04836,"56":0.00744,"57":0.0372,"58":0.01116,"59":0.00744,"60":0.00744,"61":0.01488,"62":0.01116,"63":0.03348,"64":0.00372,"65":0.01116,"66":0.00372,"67":0.01488,"68":0.00372,"69":0.92628,"70":0.88536,"71":0.0186,"72":0.01488,"73":0.56916,"74":0.01488,"75":0.04092,"76":0.01116,"77":0.09672,"78":0.093,"79":0.2232,"80":0.05952,"81":0.05208,"83":0.20832,"84":0.0558,"85":0.01488,"86":0.49476,"87":0.20088,"88":0.01488,"89":0.05208,"90":0.14136,"91":0.08184,"92":0.53568,"93":0.00744,"94":0.17856,"95":0.06324,"96":0.02604,"97":0.08928,"98":1.5252,"99":0.31248,"100":0.16368,"101":0.1116,"102":0.0558,"103":0.0558,"104":0.02232,"105":0.04836,"106":0.02976,"107":0.08184,"108":0.4092,"109":0.93,"110":0.04464,"111":0.04464,"112":0.10788,"113":0.05208,"114":0.14508,"115":0.0558,"116":0.08928,"117":0.26412,"118":0.78492,"119":2.70072,"120":0.02976,"121":0.0372,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 28 29 30 32 34 35 36 37 38 39 44 46 52 122"},F:{"11":0.00372,"63":0.00372,"95":0.00372,"101":0.00372,"102":0.00372,"103":0.00744,"104":0.0186,_:"9 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"14":0.00372,"15":0.00372,"16":0.01116,"17":0.01488,"18":0.08184,"84":0.00372,"86":0.00372,"87":0.00372,"88":0.01116,"89":0.00372,"90":0.00372,"91":0.00372,"92":0.05208,"95":0.00372,"96":0.00372,"97":0.00372,"98":0.00372,"99":0.00372,"100":0.01116,"101":0.00744,"102":0.00744,"103":0.00744,"104":0.00372,"105":0.00372,"106":0.01116,"107":0.02232,"108":0.06324,"109":0.14136,"110":0.06696,"111":0.06696,"112":0.06324,"113":0.21576,"114":0.15624,"115":0.10788,"116":0.13392,"117":0.14508,"118":1.23504,"119":4.63512,_:"12 13 79 80 81 83 85 93 94"},E:{"5":0.00372,"9":0.00372,"13":0.01116,"14":0.0558,"15":0.01116,_:"0 4 6 7 8 10 11 12 3.1 3.2 5.1 6.1 7.1 10.1 11.1","9.1":0.00372,"12.1":0.00744,"13.1":0.06324,"14.1":0.06324,"15.1":0.01488,"15.2-15.3":0.01488,"15.4":0.0372,"15.5":0.04464,"15.6":0.15996,"16.0":0.0186,"16.1":0.05952,"16.2":0.04464,"16.3":0.10044,"16.4":0.02604,"16.5":0.05952,"16.6":0.46128,"17.0":0.09672,"17.1":0.17112,"17.2":0.00744},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00208,"5.0-5.1":0.00208,"6.0-6.1":0.0052,"7.0-7.1":0.00728,"8.1-8.4":0.00104,"9.0-9.2":0.00831,"9.3":0.02598,"10.0-10.2":0.00208,"10.3":0.03742,"11.0-11.2":0.01767,"11.3-11.4":0.01559,"12.0-12.1":0.00935,"12.2-12.5":0.17045,"13.0-13.1":0.00416,"13.2":0.01767,"13.3":0.01039,"13.4-13.7":0.03014,"14.0-14.4":0.08003,"14.5-14.8":0.12992,"15.0-15.1":0.05093,"15.2-15.3":0.06236,"15.4":0.06964,"15.5":0.0977,"15.6-15.7":0.51343,"16.0":0.24113,"16.1":0.48329,"16.2":0.23177,"16.3":0.43444,"16.4":0.08938,"16.5":0.23073,"16.6-16.7":3.91104,"17.0":1.17134,"17.1":1.96747,"17.2":0.05612},P:{"20":0.01093,"21":0.02186,"22":0.08745,"23":0.16398,_:"4 5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 18.0 19.0","17.0":0.01093},I:{"0":1.99955,"3":0.0002,"4":0.0004,"2.1":0,"2.2":0.0004,"2.3":0,"4.1":0.0002,"4.2-4.3":0.00141,"4.4":0,"4.4.3-4.4.4":0.00603},K:{"0":0.03768,_:"10 11 12 11.1 11.5 12.1"},A:{"6":0.03536,"8":0.10608,"9":2.12168,"10":0.03536,"11":6.89547,_:"7 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":8.24564},H:{"0":0},L:{"0":37.175},R:{_:"0"},M:{"0":0.15072},Q:{"13.1":4.16992}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CO.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CO.js
    index fade48e9aeb429..cbb1555912f235 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CO.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CO.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00407,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00407,"79":0,"80":0,"81":0.00407,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00407,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00813,"103":0,"104":0.00407,"105":0,"106":0,"107":0,"108":0.00407,"109":0,"110":0,"111":0.00407,"112":0,"113":0.00407,"114":0.00407,"115":0.04878,"116":0.03252,"117":0.30488,"118":0.03252,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00407,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00813,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00407,"48":0,"49":0.00407,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0.00407,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00813,"69":0.00407,"70":0.00407,"71":0,"72":0.00407,"73":0,"74":0.00407,"75":0.00813,"76":0.00407,"77":0.00407,"78":0.00407,"79":0.07317,"80":0.00813,"81":0.00813,"83":0.00407,"84":0.00407,"85":0.00813,"86":0.00407,"87":0.02439,"88":0.01626,"89":0.0122,"90":0.00813,"91":0.01626,"92":0.00407,"93":0.00407,"94":0.00407,"95":0.00813,"96":0.00407,"97":0.0122,"98":0.00407,"99":0.01626,"100":0.00407,"101":0.00407,"102":0.00813,"103":0.03252,"104":0.00813,"105":0.02033,"106":0.01626,"107":0.01626,"108":0.02439,"109":0.80894,"110":0.0122,"111":0.02033,"112":0.03252,"113":0.04472,"114":0.10163,"115":0.18293,"116":8.43488,"117":2.34144,"118":0.00813,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00407,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00407,"73":0,"74":0,"75":0,"76":0,"77":0.00813,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.02439,"96":0,"97":0,"98":0,"99":0.00813,"100":0.14228,"101":0.28862,"102":0.35772,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00813,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00407,"108":0,"109":0.0122,"110":0.00407,"111":0.00407,"112":0.00407,"113":0.00407,"114":0.0122,"115":0.02439,"116":0.67479,"117":0.5691},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00407,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00407,"6.1":0,"7.1":0,"9.1":0.0122,"10.1":0,"11.1":0,"12.1":0,"13.1":0.0122,"14.1":0.01626,"15.1":0.00407,"15.2-15.3":0,"15.4":0.00813,"15.5":0.00407,"15.6":0.03659,"16.0":0.00407,"16.1":0.0122,"16.2":0.0122,"16.3":0.02846,"16.4":0.0122,"16.5":0.03659,"16.6":0.15447,"17.0":0.02033,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00286,"6.0-6.1":0,"7.0-7.1":0.00858,"8.1-8.4":0,"9.0-9.2":0.00286,"9.3":0.0429,"10.0-10.2":0,"10.3":0.03146,"11.0-11.2":0.01573,"11.3-11.4":0.00858,"12.0-12.1":0.00715,"12.2-12.5":0.1816,"13.0-13.1":0.00429,"13.2":0.02002,"13.3":0.11725,"13.4-13.7":0.02002,"14.0-14.4":0.06149,"14.5-14.8":0.16301,"15.0-15.1":0.03575,"15.2-15.3":0.09295,"15.4":0.04433,"15.5":0.07579,"15.6-15.7":0.93232,"16.0":0.38608,"16.1":0.67779,"16.2":0.32031,"16.3":0.65634,"16.4":0.10296,"16.5":0.36463,"16.6":8.33797,"17.0":1.39133,"17.1":0.00286},P:{"4":0.16469,"20":0.04117,"21":0.07205,"22":0.95724,"5.0-5.4":0.03088,"6.2-6.4":0,"7.2-7.4":0.08234,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01029,"12.0":0,"13.0":0.02059,"14.0":0.01029,"15.0":0,"16.0":0.02059,"17.0":0.03088,"18.0":0.01029,"19.0":0.02059},I:{"0":0,"3":0,"4":0.01943,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00648,"4.4":0,"4.4.3-4.4.4":0.09068},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00407,"9":0,"10":0,"11":0.0122,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":67.56127},R:{_:"0"},M:{"0":0.1187},Q:{"13.1":0},O:{"0":0.02968},H:{"0":0.118}};
    +module.exports={C:{"52":0.00347,"73":0.00347,"78":0.00694,"80":0.00347,"88":0.00347,"102":0.00347,"108":0.00347,"109":0.00347,"111":0.00347,"113":0.00347,"114":0.00347,"115":0.10407,"116":0.01041,"117":0.00347,"118":0.01735,"119":0.52382,"120":0.17345,"121":0.00347,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 74 75 76 77 79 81 82 83 84 85 86 87 89 90 91 92 93 94 95 96 97 98 99 100 101 103 104 105 106 107 110 112 122 123 3.5 3.6"},D:{"14":0.00347,"22":0.00347,"26":0.00347,"38":0.01388,"39":0.00347,"44":0.00347,"46":0.00347,"47":0.00694,"49":0.00694,"50":0.00347,"51":0.00347,"53":0.00347,"55":0.00347,"56":0.00347,"57":0.00347,"58":0.00347,"62":0.00347,"63":0.00347,"65":0.00347,"66":0.00347,"67":0.00347,"68":0.00347,"69":0.00347,"70":0.00347,"71":0.00347,"72":0.00347,"75":0.00347,"76":0.00347,"77":0.00347,"79":0.15611,"80":0.00347,"81":0.01041,"83":0.00694,"84":0.00347,"85":0.00347,"86":0.00347,"87":0.03469,"88":0.02081,"89":0.01388,"90":0.00694,"91":0.02081,"92":0.00694,"93":0.01041,"94":0.00694,"95":0.00694,"96":0.00694,"97":0.02081,"98":0.00347,"99":0.01388,"100":0.00694,"101":0.01041,"102":0.00694,"103":0.06938,"104":0.01041,"105":0.02775,"106":0.03122,"107":0.02775,"108":0.07632,"109":1.55064,"110":0.02081,"111":0.03816,"112":0.03816,"113":0.03122,"114":0.06591,"115":0.0555,"116":0.27752,"117":0.30527,"118":4.42298,"119":19.01359,"120":0.01388,"121":0.00694,_:"4 5 6 7 8 9 10 11 12 13 15 16 17 18 19 20 21 23 24 25 27 28 29 30 31 32 33 34 35 36 37 40 41 42 43 45 48 52 54 59 60 61 64 73 74 78 122"},F:{"28":0.00347,"95":0.02775,"102":0.93663,"103":0.09366,"104":0.75971,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.00347,"92":0.01388,"100":0.00347,"104":0.00347,"105":0.00347,"107":0.00347,"108":0.00694,"109":0.03469,"110":0.00347,"111":0.00694,"112":0.00694,"113":0.00347,"114":0.01388,"115":0.01388,"116":0.01388,"117":0.07632,"118":0.53423,"119":2.59828,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 101 102 103 106"},E:{"9":0.00347,"14":0.01041,"15":0.00347,_:"0 4 5 6 7 8 10 11 12 13 3.1 3.2 6.1 7.1 9.1 10.1 11.1","5.1":0.00694,"12.1":0.00347,"13.1":0.02428,"14.1":0.04857,"15.1":0.00694,"15.2-15.3":0.00694,"15.4":0.01388,"15.5":0.01041,"15.6":0.08673,"16.0":0.00694,"16.1":0.02775,"16.2":0.02428,"16.3":0.06244,"16.4":0.02081,"16.5":0.05204,"16.6":0.17345,"17.0":0.11448,"17.1":0.1457,"17.2":0.00347},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00241,"5.0-5.1":0.00241,"6.0-6.1":0.00602,"7.0-7.1":0.00842,"8.1-8.4":0.0012,"9.0-9.2":0.00962,"9.3":0.03008,"10.0-10.2":0.00241,"10.3":0.04331,"11.0-11.2":0.02045,"11.3-11.4":0.01805,"12.0-12.1":0.01083,"12.2-12.5":0.19729,"13.0-13.1":0.00481,"13.2":0.02045,"13.3":0.01203,"13.4-13.7":0.03489,"14.0-14.4":0.09263,"14.5-14.8":0.15038,"15.0-15.1":0.05895,"15.2-15.3":0.07218,"15.4":0.0806,"15.5":0.11308,"15.6-15.7":0.59429,"16.0":0.2791,"16.1":0.5594,"16.2":0.26827,"16.3":0.50286,"16.4":0.10346,"16.5":0.26707,"16.6-16.7":4.52693,"17.0":1.35579,"17.1":2.2773,"17.2":0.06496},P:{"4":0.12274,"20":0.04091,"21":0.04091,"22":0.1432,"23":0.82852,"5.0-5.4":0.02046,"6.2-6.4":0.02046,"7.2-7.4":0.06137,_:"8.2 9.2 10.1 12.0 14.0 15.0","11.1-11.2":0.01023,"13.0":0.01023,"16.0":0.02046,"17.0":0.03069,"18.0":0.01023,"19.0":0.03069},I:{"0":0.04549,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00014},K:{"0":0.14368,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00378,"11":0.03784,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.03919},H:{"0":0},L:{"0":52.23438},R:{_:"0"},M:{"0":0.11756},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CR.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CR.js
    index 9141521760aefa..e748b68b4ebf7d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CR.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CR.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00437,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00437,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0.00437,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0.01748,"74":0,"75":0,"76":0,"77":0,"78":0.0306,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00437,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.02186,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0.00874,"111":0,"112":0,"113":0.01748,"114":0.01311,"115":0.15736,"116":0.04371,"117":0.80426,"118":0.07431,"119":0,"120":0,"3.5":0,"3.6":0.00437},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0.00437,"40":0.00437,"41":0.00437,"42":0.00437,"43":0.00874,"44":0.00874,"45":0.00437,"46":0.00874,"47":0.00437,"48":0,"49":0,"50":0,"51":0.00874,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00437,"66":0,"67":0.00437,"68":0.01748,"69":0,"70":0.00437,"71":0,"72":0,"73":0.00437,"74":0,"75":0,"76":0,"77":0.00437,"78":0,"79":0.01311,"80":0.01311,"81":0.01748,"83":0.00437,"84":0,"85":0.00437,"86":0.02623,"87":0.00437,"88":0.00437,"89":0.00437,"90":0.00437,"91":0.00437,"92":0.00437,"93":0.00874,"94":0.00437,"95":0,"96":0.02186,"97":0.00437,"98":0.00874,"99":0.01311,"100":0.00437,"101":0.00437,"102":0.00874,"103":0.0306,"104":0.00437,"105":0.00874,"106":0.00874,"107":0.00437,"108":0.00874,"109":0.37591,"110":0.01311,"111":0.01311,"112":0.0306,"113":0.02623,"114":0.1049,"115":0.19232,"116":8.47974,"117":2.38657,"118":0.00437,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00874,"29":0,"30":0,"31":0.00437,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00437,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00437,"70":0,"71":0,"72":0.01748,"73":0.00874,"74":0,"75":0,"76":0,"77":0.02186,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01311,"96":0,"97":0.00437,"98":0,"99":0.00437,"100":0.1661,"101":0.29286,"102":0.50704,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00437,"13":0,"14":0.00874,"15":0,"16":0,"17":0.01748,"18":0.00437,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00437,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0.00437,"106":0,"107":0,"108":0,"109":0.01311,"110":0,"111":0.00437,"112":0,"113":0.00437,"114":0.01311,"115":0.0306,"116":1.06215,"117":0.86109},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.01311,"10":0,"11":0,"12":0,"13":0.00437,"14":0.00437,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00437,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.02623,"14.1":0.02623,"15.1":0.00437,"15.2-15.3":0.00437,"15.4":0.00874,"15.5":0.02186,"15.6":0.10928,"16.0":0.01311,"16.1":0.02186,"16.2":0.01748,"16.3":0.08305,"16.4":0.0306,"16.5":0.10928,"16.6":0.69062,"17.0":0.06557,"17.1":0},G:{"8":0.00181,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00181,"5.0-5.1":0.01265,"6.0-6.1":0.01807,"7.0-7.1":0.04518,"8.1-8.4":0.0253,"9.0-9.2":0.00361,"9.3":0.05784,"10.0-10.2":0,"10.3":0.03615,"11.0-11.2":0.08675,"11.3-11.4":0.01807,"12.0-12.1":0.0253,"12.2-12.5":0.19881,"13.0-13.1":0,"13.2":0.00542,"13.3":0.00361,"13.4-13.7":0.01807,"14.0-14.4":0.06868,"14.5-14.8":0.15363,"15.0-15.1":0.02892,"15.2-15.3":0.05422,"15.4":0.03615,"15.5":0.07591,"15.6-15.7":0.99045,"16.0":0.28918,"16.1":0.63439,"16.2":0.28195,"16.3":0.64885,"16.4":0.13013,"16.5":0.441,"16.6":11.69198,"17.0":1.71521,"17.1":0.00361},P:{"4":0.09243,"20":0.09243,"21":0.1335,"22":2.82413,"5.0-5.4":0,"6.2-6.4":0.02054,"7.2-7.4":0.08216,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01027,"12.0":0.01027,"13.0":0.01027,"14.0":0.01027,"15.0":0.01027,"16.0":0.02054,"17.0":0.07189,"18.0":0.01027,"19.0":0.05135},I:{"0":0,"3":0.00341,"4":0.04771,"2.1":0.00682,"2.2":0.02726,"2.3":0.03408,"4.1":0.02726,"4.2-4.3":0.05794,"4.4":0,"4.4.3-4.4.4":0.20108},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.00437,"7":0.00437,"8":0.04371,"9":0.00874,"10":0.00874,"11":0.0306,"5.5":0},S:{"2.5":0.00563,_:"3.0-3.1"},J:{"7":0,"10":0.01126},N:{"10":0.01876,"11":0.00938},L:{"0":57.73335},R:{_:"0"},M:{"0":0.28708},Q:{"13.1":0},O:{"0":0.06755},H:{"0":0.28778}};
    +module.exports={C:{"52":0.00461,"56":0.00461,"73":0.03688,"78":0.00461,"88":0.00461,"101":0.00461,"102":0.00461,"103":0.00461,"109":0.00461,"114":0.01844,"115":0.33653,"116":0.00461,"117":0.00461,"118":0.03688,"119":1.2908,"120":0.39185,"121":0.00461,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 74 75 76 77 79 80 81 82 83 84 85 86 87 89 90 91 92 93 94 95 96 97 98 99 100 104 105 106 107 108 110 111 112 113 122 123 3.5 3.6"},D:{"43":0.00461,"44":0.00461,"45":0.00461,"46":0.00461,"47":0.00461,"49":0.00461,"51":0.00461,"56":0.00461,"69":0.00461,"73":0.01383,"76":0.00461,"78":0.00922,"79":0.03688,"80":0.01844,"81":0.00461,"83":0.01383,"86":0.0461,"87":0.01844,"88":0.00461,"90":0.00461,"91":0.00922,"92":0.00461,"93":0.00461,"95":0.00461,"96":0.07376,"97":0.01383,"98":0.01844,"99":0.01383,"100":0.00461,"101":0.00922,"102":0.00461,"103":0.06454,"104":0.00461,"105":0.00922,"106":0.02305,"107":0.00461,"108":0.00922,"109":0.8298,"110":0.00461,"111":0.01383,"112":0.01844,"113":0.01844,"114":0.07376,"115":0.04149,"116":0.33653,"117":0.44256,"118":4.73908,"119":25.76529,"120":0.00461,"121":0.00461,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 48 50 52 53 54 55 57 58 59 60 61 62 63 64 65 66 67 68 70 71 72 74 75 77 84 85 89 94 122"},F:{"28":0.00922,"46":0.00461,"95":0.0461,"97":0.00922,"101":0.05071,"102":1.16172,"103":0.0922,"104":0.85285,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00461,"14":0.00461,"17":0.01844,"92":0.00922,"109":0.01844,"110":0.00461,"111":0.00461,"113":0.00461,"114":0.00922,"115":0.00922,"116":0.01383,"117":0.05071,"118":0.73299,"119":3.72949,_:"13 15 16 18 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 112"},E:{"9":0.00922,"13":0.01383,"14":0.00922,_:"0 4 5 6 7 8 10 11 12 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.00461,"13.1":0.04149,"14.1":0.05071,"15.1":0.01844,"15.2-15.3":0.00922,"15.4":0.01844,"15.5":0.01844,"15.6":0.21206,"16.0":0.01383,"16.1":0.05532,"16.2":0.03227,"16.3":0.11986,"16.4":0.07376,"16.5":0.11525,"16.6":0.93122,"17.0":0.34114,"17.1":0.66384,"17.2":0.03227},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00219,"5.0-5.1":0.00219,"6.0-6.1":0.00547,"7.0-7.1":0.00766,"8.1-8.4":0.00109,"9.0-9.2":0.00875,"9.3":0.02735,"10.0-10.2":0.00219,"10.3":0.03939,"11.0-11.2":0.0186,"11.3-11.4":0.01641,"12.0-12.1":0.00985,"12.2-12.5":0.17944,"13.0-13.1":0.00438,"13.2":0.0186,"13.3":0.01094,"13.4-13.7":0.03173,"14.0-14.4":0.08425,"14.5-14.8":0.13677,"15.0-15.1":0.05361,"15.2-15.3":0.06565,"15.4":0.07331,"15.5":0.10285,"15.6-15.7":0.54052,"16.0":0.25385,"16.1":0.50879,"16.2":0.244,"16.3":0.45736,"16.4":0.0941,"16.5":0.24291,"16.6-16.7":4.11736,"17.0":1.23313,"17.1":2.07126,"17.2":0.05909},P:{"4":0.05168,"20":0.06202,"21":0.12404,"22":0.19639,"23":2.54278,_:"5.0-5.4 8.2 9.2 10.1","6.2-6.4":0.01034,"7.2-7.4":0.09303,"11.1-11.2":0.01034,"12.0":0.01034,"13.0":0.01034,"14.0":0.01034,"15.0":0.01034,"16.0":0.02067,"17.0":0.04135,"18.0":0.03101,"19.0":0.04135},I:{"0":0.06972,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00005,"4.4":0,"4.4.3-4.4.4":0.00021},K:{"0":0.27489,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.01844,"9":0.00461,"10":0.00461,"11":0.02766,_:"6 7 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.0539},H:{"0":0},L:{"0":39.82752},R:{_:"0"},M:{"0":0.30184},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CU.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CU.js
    index 17f464299037cd..4351761bdd2e30 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CU.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CU.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00258,"34":0.00516,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0.00258,"43":0.00774,"44":0,"45":0.00258,"46":0,"47":0.00258,"48":0.00258,"49":0,"50":0.00516,"51":0,"52":0.05934,"53":0,"54":0.03096,"55":0.00258,"56":0.00258,"57":0.01032,"58":0,"59":0.00258,"60":0.00516,"61":0.00258,"62":0,"63":0.00258,"64":0.00516,"65":0.00258,"66":0.00516,"67":0.00258,"68":0.00516,"69":0,"70":0.00258,"71":0.00516,"72":0.02064,"73":0.00258,"74":0,"75":0,"76":0,"77":0.00258,"78":0.00516,"79":0.00258,"80":0.00258,"81":0.00258,"82":0.00516,"83":0.00258,"84":0.00774,"85":0.00516,"86":0.00258,"87":0.00258,"88":0.00774,"89":0.00516,"90":0.00516,"91":0.01032,"92":0.00516,"93":0.00774,"94":0.00516,"95":0.0129,"96":0.00516,"97":0.01806,"98":0.0129,"99":0.0258,"100":0.02322,"101":0.02322,"102":0.04128,"103":0.00774,"104":0.03096,"105":0.00516,"106":0.01806,"107":0.01032,"108":0.0129,"109":0.01806,"110":0.02322,"111":0.03096,"112":0.02064,"113":0.04386,"114":0.03354,"115":0.3999,"116":0.16512,"117":1.14552,"118":0.11094,"119":0.00258,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00258,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00258,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0.00258,"63":0.00258,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0.00258,"72":0.00258,"73":0.00258,"74":0.00258,"75":0.00516,"76":0,"77":0.00258,"78":0.00258,"79":0.00516,"80":0.03354,"81":0.00774,"83":0,"84":0.00258,"85":0,"86":0.00516,"87":0.00516,"88":0.02838,"89":0.01806,"90":0.0258,"91":0.01032,"92":0.00258,"93":0.00516,"94":0.00516,"95":0.01032,"96":0.00516,"97":0.00258,"98":0.00258,"99":0.00258,"100":0.00516,"101":0.00258,"102":0.00774,"103":0.01032,"104":0.00258,"105":0.00516,"106":0.0129,"107":0.00516,"108":0.0129,"109":0.17286,"110":0.01032,"111":0.0129,"112":0.0258,"113":0.01548,"114":0.11094,"115":0.05418,"116":0.97008,"117":0.25542,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00258,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.00258,"67":0.00258,"68":0,"69":0.00516,"70":0.00774,"71":0.00516,"72":0.02322,"73":0.00258,"74":0,"75":0,"76":0.00258,"77":0.02322,"78":0,"79":0.01032,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0.00258,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01548,"96":0,"97":0.00774,"98":0,"99":0.0129,"100":0.01032,"101":0.08772,"102":0.07998,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00258,"13":0.00258,"14":0.00516,"15":0.03096,"16":0.00258,"17":0.00258,"18":0.01548,"79":0,"80":0,"81":0,"83":0,"84":0.00774,"85":0,"86":0,"87":0,"88":0,"89":0.00258,"90":0.00516,"91":0,"92":0.03096,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00258,"100":0.01032,"101":0,"102":0,"103":0.00258,"104":0,"105":0.00258,"106":0.00258,"107":0.00258,"108":0.00258,"109":0.00774,"110":0.00774,"111":0.00258,"112":0.00258,"113":0.00516,"114":0.03096,"115":0.04644,"116":0.26574,"117":0.15738},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00258,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00774,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00258,"14.1":0.00258,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.00258,"15.6":0.00774,"16.0":0,"16.1":0.00258,"16.2":0,"16.3":0.00516,"16.4":0.00516,"16.5":0.00258,"16.6":0.07998,"17.0":0.00258,"17.1":0},G:{"8":0.00241,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00161,"6.0-6.1":0,"7.0-7.1":0.05796,"8.1-8.4":0.06601,"9.0-9.2":0.00161,"9.3":0.02576,"10.0-10.2":0,"10.3":0.01529,"11.0-11.2":0.01529,"11.3-11.4":0.00241,"12.0-12.1":0.00805,"12.2-12.5":0.3389,"13.0-13.1":0.02576,"13.2":0.01529,"13.3":0.34856,"13.4-13.7":0.13685,"14.0-14.4":0.25679,"14.5-14.8":0.40813,"15.0-15.1":0.19561,"15.2-15.3":0.35661,"15.4":0.13604,"15.5":0.21413,"15.6-15.7":1.47957,"16.0":0.24552,"16.1":0.34131,"16.2":0.25438,"16.3":0.33568,"16.4":0.22218,"16.5":0.50875,"16.6":1.64942,"17.0":0.3558,"17.1":0},P:{"4":0.24504,"20":0.13273,"21":0.31652,"22":0.75555,"5.0-5.4":0.03063,"6.2-6.4":0.01021,"7.2-7.4":0.29609,"8.2":0.01021,"9.2":0.03063,"10.1":0,"11.1-11.2":0.1021,"12.0":0,"13.0":0.05105,"14.0":0.04084,"15.0":0.02042,"16.0":0.11231,"17.0":0.09189,"18.0":0.06126,"19.0":0.16336},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00409,"4.2-4.3":0.01636,"4.4":0,"4.4.3-4.4.4":0.18405},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01032,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":80.9344},R:{_:"0"},M:{"0":0.56392},Q:{"13.1":0.02968},O:{"0":0.12614},H:{"0":0.81487}};
    +module.exports={C:{"31":0.00245,"33":0.00245,"34":0.26917,"38":0.00245,"39":0.00489,"40":0.00489,"43":0.00245,"44":0.00245,"45":0.00489,"46":0.00489,"47":0.00734,"48":0.00489,"49":0.00245,"50":0.01468,"51":0.00489,"52":0.05139,"53":0.01468,"54":0.18108,"56":0.00734,"57":0.05628,"58":0.00245,"59":0.00245,"60":0.01468,"61":0.00734,"62":0.00734,"63":0.00489,"64":0.01468,"65":0.00734,"66":0.01468,"67":0.01224,"68":0.02202,"69":0.00489,"70":0.00734,"71":0.03671,"72":0.04405,"73":0.00489,"74":0.00245,"75":0.00979,"76":0.00245,"77":0.00734,"78":0.00979,"79":0.00489,"80":0.00734,"81":0.00734,"82":0.03181,"83":0.00734,"84":0.03181,"85":0.01468,"86":0.01468,"87":0.00489,"88":0.02447,"89":0.01224,"90":0.00489,"91":0.02692,"92":0.01713,"93":0.00979,"94":0.02936,"95":0.1199,"96":0.02202,"97":0.05139,"98":0.02202,"99":0.09299,"100":0.05139,"101":0.17863,"102":0.04649,"103":0.02447,"104":0.07586,"105":0.00979,"106":0.05873,"107":0.02447,"108":0.01958,"109":0.02202,"110":0.05383,"111":0.05383,"112":0.0832,"113":0.11501,"114":0.04894,"115":1.49267,"116":0.14193,"117":0.20065,"118":0.31566,"119":3.69986,"120":0.97391,"121":0.00979,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 35 36 37 41 42 55 122 123 3.5 3.6"},D:{"38":0.00734,"43":0.00245,"44":0.00245,"49":0.00734,"51":0.00245,"53":0.00245,"55":0.00979,"56":0.00245,"57":0.00245,"58":0.01224,"60":0.00245,"61":0.00245,"63":0.00245,"64":0.00245,"66":0.00245,"67":0.00489,"68":0.00245,"69":0.00245,"70":0.00489,"71":0.00979,"72":0.00734,"73":0.00734,"74":0.00489,"75":0.00734,"76":0.00489,"77":0.01224,"78":0.00245,"79":0.00979,"80":0.00489,"81":0.03915,"83":0.00245,"84":0.01958,"85":0.00489,"86":0.01958,"87":0.01713,"88":0.09543,"89":0.05139,"90":0.09543,"91":0.02447,"92":0.01468,"93":0.00245,"94":0.01958,"95":0.01224,"96":0.00734,"97":0.01224,"98":0.02202,"99":0.01713,"100":0.02447,"101":0.00979,"102":0.02692,"103":0.02447,"104":0.01468,"105":0.01958,"106":0.04405,"107":0.01468,"108":0.06607,"109":0.59707,"110":0.03181,"111":0.0416,"112":0.05628,"113":0.03181,"114":0.08809,"115":0.06607,"116":0.20065,"117":0.22512,"118":1.07913,"119":3.45516,"120":0.00734,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 45 46 47 48 50 52 54 59 62 65 121 122"},F:{"42":0.00245,"45":0.00489,"48":0.00245,"49":0.00245,"50":0.00245,"57":0.00245,"64":0.00489,"65":0.00245,"68":0.00245,"69":0.00489,"74":0.00245,"79":0.14927,"82":0.00245,"84":0.00245,"86":0.00245,"87":0.00734,"89":0.00245,"91":0.00245,"93":0.01468,"94":0.00489,"95":0.08809,"96":0.00734,"99":0.02447,"100":0.00734,"101":0.03915,"102":0.19576,"103":0.18597,"104":0.4111,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 43 44 46 47 51 52 53 54 55 56 58 60 62 63 66 67 70 71 72 73 75 76 77 78 80 81 83 85 88 90 92 97 98 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00979,"13":0.01958,"14":0.00979,"15":0.00245,"16":0.00979,"17":0.00734,"18":0.04649,"79":0.00489,"80":0.00245,"81":0.00245,"84":0.02447,"85":0.00489,"89":0.01224,"90":0.01224,"92":0.12969,"94":0.00245,"96":0.00245,"97":0.00245,"98":0.00245,"100":0.04405,"101":0.00245,"102":0.00245,"103":0.00245,"105":0.00245,"107":0.01713,"108":0.01468,"109":0.02202,"110":0.00489,"111":0.00489,"112":0.00734,"113":0.01224,"114":0.02447,"115":0.03426,"116":0.02692,"117":0.12724,"118":0.38418,"119":1.13541,_:"83 86 87 88 91 93 95 99 104 106"},E:{"11":0.00245,"13":0.00489,"14":0.00734,_:"0 4 5 6 7 8 9 10 12 15 3.1 3.2 6.1 7.1 10.1 11.1 15.2-15.3 17.2","5.1":0.00979,"9.1":0.00245,"12.1":0.00489,"13.1":0.00734,"14.1":0.00734,"15.1":0.00245,"15.4":0.00245,"15.5":0.00734,"15.6":0.0416,"16.0":0.00245,"16.1":0.00245,"16.2":0.00979,"16.3":0.02202,"16.4":0.00245,"16.5":0.0783,"16.6":0.06362,"17.0":0.18108,"17.1":0.08565},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00119,"5.0-5.1":0.00119,"6.0-6.1":0.00298,"7.0-7.1":0.00417,"8.1-8.4":0.0006,"9.0-9.2":0.00477,"9.3":0.0149,"10.0-10.2":0.00119,"10.3":0.02145,"11.0-11.2":0.01013,"11.3-11.4":0.00894,"12.0-12.1":0.00536,"12.2-12.5":0.09772,"13.0-13.1":0.00238,"13.2":0.01013,"13.3":0.00596,"13.4-13.7":0.01728,"14.0-14.4":0.04588,"14.5-14.8":0.07448,"15.0-15.1":0.0292,"15.2-15.3":0.03575,"15.4":0.03992,"15.5":0.05601,"15.6-15.7":0.29435,"16.0":0.13824,"16.1":0.27707,"16.2":0.13288,"16.3":0.24907,"16.4":0.05124,"16.5":0.13228,"16.6-16.7":2.24219,"17.0":0.67153,"17.1":1.12795,"17.2":0.03218},P:{"4":0.21571,"20":0.08218,"21":0.34924,"22":0.43142,"23":0.52387,"5.0-5.4":0.02054,"6.2-6.4":0.02054,"7.2-7.4":0.19517,"8.2":0.01027,"9.2":0.06163,_:"10.1","11.1-11.2":0.12326,"12.0":0.02054,"13.0":0.06163,"14.0":0.04109,"15.0":0.02054,"16.0":0.12326,"17.0":0.10272,"18.0":0.14381,"19.0":0.13353},I:{"0":0.09017,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00027},K:{"0":0.99014,_:"10 11 12 11.1 11.5 12.1"},A:{"9":0.00334,"11":0.03337,_:"6 7 8 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.09062},H:{"0":0.12},L:{"0":69.15182},R:{_:"0"},M:{"0":0.58906},Q:{"13.1":0.00755}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CV.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CV.js
    index a21e3862314334..50af819f784d07 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CV.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CV.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0.00382,"51":0,"52":0.00382,"53":0,"54":0.00382,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.01526,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00382,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.05341,"116":0.03815,"117":0.25561,"118":0.01526,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00382,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.01526,"41":0,"42":0.00382,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.00382,"56":0,"57":0,"58":0,"59":0.00382,"60":0.00763,"61":0,"62":0,"63":0,"64":0,"65":0.00382,"66":0,"67":0,"68":0,"69":0,"70":0.00382,"71":0,"72":0,"73":0,"74":0,"75":0.01145,"76":0.00382,"77":0,"78":0,"79":0.01145,"80":0,"81":0.26705,"83":0.00382,"84":0.00382,"85":0,"86":0,"87":0.00763,"88":0.00763,"89":0,"90":0.00382,"91":0.02671,"92":0,"93":0.00763,"94":0,"95":0,"96":0.00382,"97":0.03434,"98":0,"99":0.02671,"100":0.00763,"101":0,"102":0.01526,"103":0.03052,"104":0.00382,"105":0.00763,"106":0.00763,"107":0,"108":0.00382,"109":0.51884,"110":0.04578,"111":0.01526,"112":0.02671,"113":0.01908,"114":0.1526,"115":0.12971,"116":5.67291,"117":1.52219,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00382,"69":0,"70":0,"71":0,"72":0.0496,"73":0.00382,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00763,"96":0,"97":0,"98":0,"99":0,"100":0.01526,"101":0.13353,"102":0.17168,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00382,"13":0.00382,"14":0.00382,"15":0.03434,"16":0.00382,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00763,"93":0,"94":0,"95":0,"96":0.06486,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00382,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00763,"110":0.00382,"111":0,"112":0.33572,"113":0.00763,"114":0.03052,"115":0.01145,"116":1.59849,"117":1.526},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00763,"14.1":0.04197,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.00763,"15.6":0.08393,"16.0":0,"16.1":0,"16.2":0.00382,"16.3":0.00763,"16.4":0,"16.5":0.01908,"16.6":0.1259,"17.0":0.01145,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.03647,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.01989,"10.0-10.2":0,"10.3":0.26688,"11.0-11.2":0.06133,"11.3-11.4":0.16908,"12.0-12.1":0.14422,"12.2-12.5":0.82055,"13.0-13.1":0.0116,"13.2":0,"13.3":0.00497,"13.4-13.7":0.04476,"14.0-14.4":0.52714,"14.5-14.8":0.45089,"15.0-15.1":0.2155,"15.2-15.3":0.11604,"15.4":0.10112,"15.5":0.39618,"15.6-15.7":4.4757,"16.0":0.45917,"16.1":0.63157,"16.2":0.11438,"16.3":0.44094,"16.4":0.13261,"16.5":2.1185,"16.6":4.40774,"17.0":0.35474,"17.1":0},P:{"4":0.26663,"20":0.03077,"21":0.13332,"22":1.62031,"5.0-5.4":0.01026,"6.2-6.4":0,"7.2-7.4":0.19485,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.04102,"12.0":0.01026,"13.0":0.01026,"14.0":0,"15.0":0.48199,"16.0":0.05128,"17.0":0.08204,"18.0":0.0923,"19.0":0.15383},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00437,"4.4":0,"4.4.3-4.4.4":0.54153},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.00382,"10":0,"11":0.00763,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":63.91095},R:{_:"0"},M:{"0":0.11752},Q:{"13.1":0},O:{"0":0.05567},H:{"0":0.27521}};
    +module.exports={C:{"7":0.00756,"50":0.00378,"52":0.00378,"54":0.00378,"61":0.00756,"78":0.01511,"87":0.00378,"115":0.10201,"116":0.03022,"117":0.01133,"118":0.01511,"119":0.68004,"120":0.20023,_:"2 3 4 5 6 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 51 53 55 56 57 58 59 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 121 122 123 3.5 3.6"},D:{"39":0.00756,"47":0.00378,"49":0.034,"50":0.00378,"53":0.00756,"55":0.00756,"57":0.00756,"58":0.00378,"60":0.01133,"65":0.00756,"66":0.00378,"67":0.00378,"69":0.00378,"70":0.01133,"71":0.00378,"75":0.01511,"76":0.02267,"79":0.04911,"80":0.00378,"83":0.02645,"84":0.01133,"85":0.00756,"86":0.00378,"87":0.02645,"89":0.01133,"90":0.01511,"91":0.01511,"92":0.24179,"93":0.00378,"94":0.00378,"95":0.00378,"96":0.00378,"97":0.00378,"99":0.14734,"100":0.00756,"101":0.00378,"102":0.00378,"103":1.07295,"104":0.00378,"105":0.00378,"106":0.07556,"107":0.00378,"108":0.01133,"109":1.02384,"110":0.1209,"111":0.02645,"112":0.00756,"113":0.01889,"114":0.11334,"115":0.04156,"116":0.35891,"117":0.41936,"118":4.47315,"119":16.28696,"120":0.05667,"121":0.00378,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 40 41 42 43 44 45 46 48 51 52 54 56 59 61 62 63 64 68 72 73 74 77 78 81 88 98 122"},F:{"40":0.00378,"79":0.00378,"95":0.10956,"102":0.19646,"103":0.23801,"104":1.0125,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00756,"13":0.00378,"14":0.00378,"15":0.00378,"18":0.00756,"89":0.00378,"92":0.01133,"96":0.01889,"101":0.00378,"107":0.00378,"108":0.00378,"109":0.01133,"112":0.52892,"113":0.58937,"114":0.02645,"115":0.01133,"116":0.12467,"117":0.10578,"118":0.6347,"119":3.95934,_:"16 17 79 80 81 83 84 85 86 87 88 90 91 93 94 95 97 98 99 100 102 103 104 105 106 110 111"},E:{"11":0.00378,"14":0.01889,_:"0 4 5 6 7 8 9 10 12 13 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 15.1 15.2-15.3 15.4","13.1":0.00756,"14.1":0.04156,"15.5":0.02645,"15.6":0.20023,"16.0":0.00378,"16.1":0.00378,"16.2":0.01133,"16.3":0.01889,"16.4":0.00756,"16.5":0.04156,"16.6":0.38913,"17.0":0.10578,"17.1":0.11712,"17.2":0.00378},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.0024,"5.0-5.1":0.0024,"6.0-6.1":0.00601,"7.0-7.1":0.00842,"8.1-8.4":0.0012,"9.0-9.2":0.00962,"9.3":0.03006,"10.0-10.2":0.0024,"10.3":0.04328,"11.0-11.2":0.02044,"11.3-11.4":0.01803,"12.0-12.1":0.01082,"12.2-12.5":0.19717,"13.0-13.1":0.00481,"13.2":0.02044,"13.3":0.01202,"13.4-13.7":0.03487,"14.0-14.4":0.09258,"14.5-14.8":0.15029,"15.0-15.1":0.05891,"15.2-15.3":0.07214,"15.4":0.08055,"15.5":0.11301,"15.6-15.7":0.59393,"16.0":0.27893,"16.1":0.55906,"16.2":0.26811,"16.3":0.50255,"16.4":0.1034,"16.5":0.26691,"16.6-16.7":4.52419,"17.0":1.35497,"17.1":2.27592,"17.2":0.06492},P:{"4":0.21,"20":0.042,"21":0.0735,"22":0.2835,"23":1.40699,"5.0-5.4":0.0105,_:"6.2-6.4 8.2 10.1 12.0 13.0","7.2-7.4":0.1365,"9.2":0.0105,"11.1-11.2":0.0735,"14.0":0.0105,"15.0":0.3465,"16.0":0.0525,"17.0":0.084,"18.0":0.0525,"19.0":0.0945},I:{"0":0.01238,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00004},K:{"0":0.25626,_:"10 11 12 11.1 11.5 12.1"},A:{"9":0.00756,"11":0.01133,_:"6 7 8 10 5.5"},N:{_:"10 11"},S:{"2.5":0.00622,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.04978},H:{"0":0.03},L:{"0":48.75258},R:{_:"0"},M:{"0":0.15558},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CX.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CX.js
    index 13f0300999528c..b41cdeb1576be4 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CX.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CX.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":62.38293,"116":0,"117":0,"118":0,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":8.32155,"117":0,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":8.32155,"117":0},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0,"16.0":0,"16.1":0,"16.2":0,"16.3":0,"16.4":0,"16.5":0,"16.6":0,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0,"14.0-14.4":0,"14.5-14.8":0,"15.0-15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6-15.7":0,"16.0":0,"16.1":0,"16.2":0,"16.3":0,"16.4":0,"16.5":0,"16.6":0,"17.0":0,"17.1":0},P:{"4":0,"20":0,"21":0,"22":0,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0,"17.0":0,"18.0":0,"19.0":0},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":12.67155},R:{_:"0"},M:{"0":0},Q:{"13.1":0},O:{"0":0},H:{"0":0}};
    +module.exports={C:{_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 3.5 3.6"},D:{"118":31.24688,"119":37.50313,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 120 121 122"},F:{_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119"},E:{_:"0 4 5 6 7 8 9 10 11 12 13 14 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 13.1 14.1 15.1 15.2-15.3 15.4 15.5 15.6 16.0 16.1 16.2 16.3 16.4 16.5 16.6 17.0 17.1 17.2"},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0,"14.0-14.4":0,"14.5-14.8":0,"15.0-15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6-15.7":0,"16.0":0,"16.1":0,"16.2":0,"16.3":0,"16.4":0,"16.5":0,"16.6-16.7":0,"17.0":0,"17.1":0,"17.2":0},P:{_:"4 20 21 22 23 5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0"},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{"0":0,_:"10 11 12 11.1 11.5 12.1"},A:{_:"6 7 8 9 10 11 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{_:"0"},H:{"0":0},L:{"0":18.75},R:{_:"0"},M:{_:"0"},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CY.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CY.js
    index 09e31e3a584fcd..7c899a18a96acf 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CY.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CY.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00419,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00838,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0.00419,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00419,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.01256,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00838,"110":0,"111":0,"112":0.00838,"113":0.00838,"114":0.00419,"115":0.09214,"116":0.18427,"117":1.05119,"118":0.08376,"119":0,"120":0,"3.5":0,"3.6":0.00419},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.01256,"39":0.00419,"40":0,"41":0.00419,"42":0.00419,"43":0.00419,"44":0.00838,"45":0.00419,"46":0.00419,"47":0.00419,"48":0,"49":0.00419,"50":0,"51":0.00838,"52":0,"53":0,"54":0,"55":0,"56":0.00419,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00838,"69":0,"70":0.00419,"71":0,"72":0,"73":0,"74":0.00419,"75":0,"76":0,"77":0,"78":0,"79":0.03769,"80":0.00419,"81":0.00419,"83":0.00838,"84":0,"85":0.00419,"86":0,"87":0.01256,"88":0.02513,"89":0.00419,"90":0.00419,"91":0.02094,"92":0,"93":0.0712,"94":0,"95":0.01675,"96":0,"97":0,"98":0.00838,"99":0.00419,"100":0.00419,"101":0,"102":0.01256,"103":0.02932,"104":0,"105":0.00419,"106":0.02513,"107":0.00838,"108":0.01675,"109":1.18102,"110":0.00419,"111":0.01675,"112":0.01675,"113":0.03769,"114":0.0712,"115":0.29316,"116":8.11634,"117":1.80503,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00419,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00419,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0.00419,"72":0.0335,"73":0.00838,"74":0,"75":0,"76":0,"77":0.02513,"78":0,"79":0,"80":0,"81":0,"82":0.00419,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00838,"96":0,"97":0,"98":0,"99":0.00419,"100":0.0712,"101":0.11726,"102":0.20102,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00419,"13":0.00419,"14":0.00838,"15":0,"16":0,"17":0,"18":0.00419,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00419,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00838,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.01675,"108":0,"109":0.0335,"110":0.01256,"111":0,"112":0,"113":0.00419,"114":0.01256,"115":0.02094,"116":1.16426,"117":0.85435},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.01256,"10":0,"11":0,"12":0,"13":0,"14":0.01675,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00419,"6.1":0,"7.1":0,"9.1":0.00419,"10.1":0,"11.1":0,"12.1":0.00419,"13.1":0.10051,"14.1":0.06282,"15.1":0.05026,"15.2-15.3":0.00838,"15.4":0.00838,"15.5":0.01675,"15.6":0.0712,"16.0":0.00838,"16.1":0.02094,"16.2":0.01256,"16.3":0.05863,"16.4":0.02513,"16.5":0.08376,"16.6":0.54863,"17.0":0.04188,"17.1":0},G:{"8":0.00391,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00782,"6.0-6.1":0.00391,"7.0-7.1":0.01759,"8.1-8.4":0.02736,"9.0-9.2":0.00977,"9.3":0.11726,"10.0-10.2":0,"10.3":0.06645,"11.0-11.2":0.07818,"11.3-11.4":0.00977,"12.0-12.1":0.03518,"12.2-12.5":0.19935,"13.0-13.1":0.00195,"13.2":0.00195,"13.3":0.03713,"13.4-13.7":0.04886,"14.0-14.4":0.08013,"14.5-14.8":0.23648,"15.0-15.1":0.09186,"15.2-15.3":0.20717,"15.4":0.06645,"15.5":0.11726,"15.6-15.7":1.14137,"16.0":0.44951,"16.1":0.8873,"16.2":0.42019,"16.3":0.92247,"16.4":0.16417,"16.5":0.67817,"16.6":11.83777,"17.0":1.38371,"17.1":0.00195},P:{"4":0.11239,"20":0.06131,"21":0.16348,"22":4.62862,"5.0-5.4":0,"6.2-6.4":0.01022,"7.2-7.4":0.01022,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01022,"12.0":0,"13.0":0.02044,"14.0":0.01022,"15.0":0.01022,"16.0":0.01022,"17.0":0.03065,"18.0":0.03065,"19.0":0.29631},I:{"0":0,"3":0.00721,"4":0.04685,"2.1":0.00721,"2.2":0.02522,"2.3":0.02883,"4.1":0.02883,"4.2-4.3":0.06126,"4.4":0,"4.4.3-4.4.4":0.15135},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0.00419,"8":0.04188,"9":0.00838,"10":0.00838,"11":0.07538,"5.5":0},S:{"2.5":0.00581,_:"3.0-3.1"},J:{"7":0,"10":0.01162},N:{"10":0.01453,"11":0.01453},L:{"0":52.16659},R:{_:"0"},M:{"0":1.28445},Q:{"13.1":0.00581},O:{"0":0.27316},H:{"0":0.41818}};
    +module.exports={C:{"52":0.02104,"78":0.00421,"88":0.00841,"92":0.00421,"102":0.00421,"109":0.00421,"111":0.00421,"112":0.00421,"114":0.00421,"115":0.13883,"116":0.00421,"117":0.00841,"118":0.02945,"119":7.65253,"120":0.31132,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 90 91 93 94 95 96 97 98 99 100 101 103 104 105 106 107 108 110 113 121 122 123 3.5 3.6"},D:{"31":0.00421,"38":0.02524,"39":0.00421,"41":0.00421,"43":0.00421,"44":0.00421,"45":0.00421,"46":0.00421,"47":0.00421,"49":0.01262,"51":0.00421,"56":0.00841,"66":0.00421,"69":0.00421,"70":0.00421,"74":0.00421,"75":0.00421,"76":0.00421,"79":0.08835,"80":0.00841,"81":0.00421,"83":0.01683,"85":0.02945,"86":0.00421,"87":0.68153,"88":0.00421,"89":0.00421,"90":0.00421,"91":0.04628,"93":0.20194,"94":0.00421,"95":0.00841,"96":0.00421,"97":0.00421,"98":0.02524,"99":0.00841,"100":0.00421,"101":0.01683,"102":0.02524,"103":0.06731,"104":0.00421,"105":0.01262,"106":0.04207,"107":0.00421,"108":0.02524,"109":2.25916,"110":0.02104,"111":0.02524,"112":0.06311,"113":0.06731,"114":0.04628,"115":0.02945,"116":0.22297,"117":0.98444,"118":4.68239,"119":14.64036,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 33 34 35 36 37 40 42 48 50 52 53 54 55 57 58 59 60 61 62 63 64 65 67 68 71 72 73 77 78 84 92 120 121 122"},F:{"28":0.00421,"46":0.00421,"92":0.00421,"94":0.00841,"95":0.02104,"102":0.39546,"103":0.07573,"104":0.39125,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 93 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"15":0.00421,"18":0.00841,"92":0.00841,"99":0.00421,"106":0.00421,"107":0.00421,"109":0.0589,"110":0.00841,"113":0.00421,"114":0.02104,"115":0.00421,"116":0.00421,"117":0.0589,"118":0.73623,"119":4.25748,_:"12 13 14 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 100 101 102 103 104 105 108 111 112"},E:{"9":0.00841,"14":0.03366,"15":0.00421,_:"0 4 5 6 7 8 10 11 12 13 3.1 3.2 6.1 7.1 10.1 11.1","5.1":0.00841,"9.1":0.00841,"12.1":0.00841,"13.1":0.18511,"14.1":0.10097,"15.1":0.10097,"15.2-15.3":0.01262,"15.4":0.00841,"15.5":0.04207,"15.6":0.13042,"16.0":0.01683,"16.1":0.03786,"16.2":0.02524,"16.3":0.08835,"16.4":0.03366,"16.5":0.05469,"16.6":0.65209,"17.0":0.26083,"17.1":0.4796,"17.2":0.00421},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00206,"5.0-5.1":0.00206,"6.0-6.1":0.00516,"7.0-7.1":0.00722,"8.1-8.4":0.00103,"9.0-9.2":0.00825,"9.3":0.02578,"10.0-10.2":0.00206,"10.3":0.03712,"11.0-11.2":0.01753,"11.3-11.4":0.01547,"12.0-12.1":0.00928,"12.2-12.5":0.16911,"13.0-13.1":0.00412,"13.2":0.01753,"13.3":0.01031,"13.4-13.7":0.0299,"14.0-14.4":0.0794,"14.5-14.8":0.12889,"15.0-15.1":0.05053,"15.2-15.3":0.06187,"15.4":0.06909,"15.5":0.09693,"15.6-15.7":0.50939,"16.0":0.23923,"16.1":0.47949,"16.2":0.22995,"16.3":0.43102,"16.4":0.08868,"16.5":0.22892,"16.6-16.7":3.88023,"17.0":1.16211,"17.1":1.95197,"17.2":0.05568},P:{"4":0.09345,"20":0.04153,"21":0.0623,"22":0.36342,"23":3.80034,_:"5.0-5.4 6.2-6.4 7.2-7.4 8.2 10.1 12.0 15.0","9.2":0.08307,"11.1-11.2":0.01038,"13.0":0.01038,"14.0":0.01038,"16.0":0.02077,"17.0":0.08307,"18.0":0.03115,"19.0":0.04153},I:{"0":0.06917,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00005,"4.4":0,"4.4.3-4.4.4":0.00021},K:{"0":0.39392,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.02165,"9":0.00433,"10":0.00433,"11":0.11693,_:"6 7 5.5"},N:{_:"10 11"},S:{"2.5":0.00579,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.22013},H:{"0":0},L:{"0":42.27292},R:{_:"0"},M:{"0":0.15062},Q:{"13.1":0.01159}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CZ.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CZ.js
    index c45822d40c410b..4d3e6de576590a 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CZ.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/CZ.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.03245,"49":0,"50":0,"51":0,"52":0.07573,"53":0,"54":0,"55":0,"56":0.01082,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00541,"69":0.00541,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.02164,"79":0,"80":0.00541,"81":0.00541,"82":0,"83":0.00541,"84":0,"85":0,"86":0,"87":0,"88":0.00541,"89":0.00541,"90":0,"91":0.01623,"92":0,"93":0,"94":0,"95":0,"96":0.00541,"97":0,"98":0,"99":0.00541,"100":0,"101":0,"102":0.08654,"103":0.00541,"104":0.00541,"105":0.00541,"106":0.00541,"107":0.00541,"108":0.01082,"109":0.01082,"110":0.00541,"111":0.01082,"112":0.01082,"113":0.02705,"114":0.02164,"115":0.43813,"116":0.23259,"117":2.63418,"118":0.24881,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00541,"39":0,"40":0,"41":0.00541,"42":0,"43":0,"44":0,"45":0.00541,"46":0,"47":0,"48":0,"49":0.01082,"50":0,"51":0.01082,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00541,"69":0,"70":0.00541,"71":0.00541,"72":0,"73":0,"74":0.02705,"75":0,"76":0.01082,"77":0,"78":0.00541,"79":0.03786,"80":0.00541,"81":0.01082,"83":0.00541,"84":0.00541,"85":0.02164,"86":0.01082,"87":0.02705,"88":0.00541,"89":0.01623,"90":0.01623,"91":0.00541,"92":0,"93":0.07573,"94":0.00541,"95":0.01082,"96":0.01082,"97":0.01082,"98":0.00541,"99":0.01623,"100":0.00541,"101":0.00541,"102":0.16768,"103":0.03245,"104":0.01623,"105":0.02705,"106":0.04327,"107":0.02705,"108":0.0595,"109":0.86003,"110":0.02705,"111":0.02705,"112":0.75185,"113":0.02705,"114":0.1785,"115":0.28668,"116":10.59623,"117":3.14804,"118":0.00541,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00541,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00541,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.01082,"70":0,"71":0,"72":0.01623,"73":0.00541,"74":0,"75":0,"76":0,"77":0.04868,"78":0.00541,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.02164,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00541,"93":0,"94":0,"95":0.12441,"96":0,"97":0,"98":0,"99":0.01623,"100":0.15686,"101":0.6599,"102":0.91412,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0.00541,"15":0,"16":0,"17":0.00541,"18":0.00541,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00541,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0.00541,"105":0.00541,"106":0,"107":0.01082,"108":0.00541,"109":0.06491,"110":0.00541,"111":0.03786,"112":0.02164,"113":0.01082,"114":0.07032,"115":0.09195,"116":2.15819,"117":1.8012},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00541,"10":0,"11":0,"12":0,"13":0,"14":0.02164,"15":0.00541,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00541,"10.1":0,"11.1":0,"12.1":0,"13.1":0.03245,"14.1":0.04327,"15.1":0.01082,"15.2-15.3":0.00541,"15.4":0.02164,"15.5":0.02164,"15.6":0.10277,"16.0":0.01623,"16.1":0.04327,"16.2":0.04868,"16.3":0.07573,"16.4":0.03245,"16.5":0.119,"16.6":0.62744,"17.0":0.05409,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00175,"6.0-6.1":0,"7.0-7.1":0.00349,"8.1-8.4":0.00699,"9.0-9.2":0,"9.3":0.04192,"10.0-10.2":0.00175,"10.3":0.05764,"11.0-11.2":0.03144,"11.3-11.4":0.00524,"12.0-12.1":0.01397,"12.2-12.5":0.18689,"13.0-13.1":0.00349,"13.2":0.00175,"13.3":0.3895,"13.4-13.7":0.01747,"14.0-14.4":0.05065,"14.5-14.8":0.12401,"15.0-15.1":0.03668,"15.2-15.3":0.08908,"15.4":0.06812,"15.5":0.09956,"15.6-15.7":1.23837,"16.0":0.43317,"16.1":0.92223,"16.2":0.45413,"16.3":0.81918,"16.4":0.12226,"16.5":0.44539,"16.6":9.92792,"17.0":1.65058,"17.1":0.00349},P:{"4":0.09297,"20":0.05165,"21":0.11363,"22":2.26222,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0.01033,"14.0":0.01033,"15.0":0,"16.0":0.01033,"17.0":0.01033,"18.0":0.01033,"19.0":0.03099},I:{"0":0,"3":0,"4":0.02015,"2.1":0,"2.2":0.01511,"2.3":0.01511,"4.1":0.03526,"4.2-4.3":0.04029,"4.4":0,"4.4.3-4.4.4":0.16622},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.05409,"9":0.00541,"10":0.04868,"11":0.07573,"5.5":0},S:{"2.5":0.00459,_:"3.0-3.1"},J:{"7":0,"10":0.00459},N:{"10":0,"11":0},L:{"0":47.47934},R:{_:"0"},M:{"0":0.3581},Q:{"13.1":0},O:{"0":0.16987},H:{"0":0.51288}};
    +module.exports={C:{"48":0.34056,"50":0.00568,"52":0.13055,"56":0.01135,"60":0.00568,"65":0.00568,"66":0.00568,"68":0.00568,"70":0.00568,"78":0.0227,"79":0.00568,"80":0.00568,"81":0.01135,"83":0.01135,"84":0.00568,"88":0.01135,"89":0.01135,"91":0.00568,"94":0.00568,"97":0.00568,"99":0.00568,"100":0.00568,"102":0.03406,"103":0.00568,"104":0.01135,"105":0.01135,"106":0.01135,"107":0.00568,"108":0.01135,"109":0.01135,"110":0.01135,"111":0.01135,"112":0.02838,"113":0.03406,"114":0.0227,"115":0.93086,"116":0.01703,"117":0.05676,"118":0.23839,"119":4.34214,"120":1.31116,"121":0.00568,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 49 51 53 54 55 57 58 59 61 62 63 64 67 69 71 72 73 74 75 76 77 82 85 86 87 90 92 93 95 96 98 101 122 123 3.5 3.6"},D:{"38":0.00568,"39":0.01135,"41":0.01135,"48":0.00568,"49":0.01703,"53":0.00568,"67":0.00568,"74":0.03973,"75":0.00568,"76":0.00568,"77":0.00568,"79":0.09649,"80":0.01703,"81":0.00568,"83":0.00568,"84":0.0227,"85":0.05676,"86":0.00568,"87":0.04541,"88":0.01135,"89":0.01703,"90":0.01135,"91":0.01703,"92":0.00568,"93":0.01135,"94":0.00568,"95":0.00568,"96":0.01703,"97":0.00568,"98":0.01135,"99":0.01135,"100":0.01135,"101":0.00568,"102":0.26677,"103":0.06244,"104":0.00568,"105":0.09082,"106":0.0227,"107":0.03973,"108":0.03406,"109":1.55522,"110":0.02838,"111":0.03406,"112":1.3963,"113":0.03973,"114":0.10784,"115":0.07946,"116":0.25542,"117":0.5676,"118":5.80655,"119":21.79016,"120":0.01703,"121":0.00568,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 40 42 43 44 45 46 47 50 51 52 54 55 56 57 58 59 60 61 62 63 64 65 66 68 69 70 71 72 73 78 122"},F:{"28":0.00568,"36":0.01135,"46":0.01135,"69":0.00568,"70":0.00568,"75":0.00568,"84":0.01703,"85":0.03406,"92":0.00568,"95":0.21001,"99":0.00568,"101":0.00568,"102":0.94222,"103":0.45976,"104":1.77659,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 71 72 73 74 76 77 78 79 80 81 82 83 86 87 88 89 90 91 93 94 96 97 98 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"15":0.00568,"16":0.00568,"17":0.00568,"18":0.00568,"85":0.01135,"92":0.00568,"105":0.00568,"107":0.00568,"108":0.00568,"109":0.13622,"110":0.00568,"111":0.01135,"112":0.01135,"113":0.00568,"114":0.04541,"115":0.01703,"116":0.05108,"117":0.15893,"118":1.29413,"119":6.3628,_:"12 13 14 79 80 81 83 84 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 106"},E:{"9":0.00568,"13":0.00568,"14":0.04541,"15":0.00568,_:"0 4 5 6 7 8 10 11 12 3.1 3.2 5.1 6.1 7.1 10.1 11.1","9.1":0.00568,"12.1":0.00568,"13.1":0.06244,"14.1":0.07946,"15.1":0.01703,"15.2-15.3":0.01135,"15.4":0.04541,"15.5":0.03973,"15.6":0.23839,"16.0":0.02838,"16.1":0.07946,"16.2":0.08514,"16.3":0.1192,"16.4":0.05676,"16.5":0.13622,"16.6":0.66409,"17.0":0.38597,"17.1":0.62436,"17.2":0.01703},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00212,"5.0-5.1":0.00212,"6.0-6.1":0.00529,"7.0-7.1":0.00741,"8.1-8.4":0.00106,"9.0-9.2":0.00846,"9.3":0.02645,"10.0-10.2":0.00212,"10.3":0.03809,"11.0-11.2":0.01799,"11.3-11.4":0.01587,"12.0-12.1":0.00952,"12.2-12.5":0.17353,"13.0-13.1":0.00423,"13.2":0.01799,"13.3":0.01058,"13.4-13.7":0.03068,"14.0-14.4":0.08147,"14.5-14.8":0.13226,"15.0-15.1":0.05185,"15.2-15.3":0.06348,"15.4":0.07089,"15.5":0.09946,"15.6-15.7":0.52269,"16.0":0.24548,"16.1":0.49201,"16.2":0.23595,"16.3":0.44228,"16.4":0.091,"16.5":0.23489,"16.6-16.7":3.98157,"17.0":1.19246,"17.1":2.00295,"17.2":0.05714},P:{"4":0.07286,"20":0.03123,"21":0.06245,"22":0.17695,"23":1.86319,_:"5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 12.0","11.1-11.2":0.01041,"13.0":0.01041,"14.0":0.01041,"15.0":0.01041,"16.0":0.01041,"17.0":0.01041,"18.0":0.01041,"19.0":0.02082},I:{"0":0.12477,"3":0.00001,"4":0.00003,"2.1":0,"2.2":0.00003,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00009,"4.4":0,"4.4.3-4.4.4":0.00038},K:{"0":0.60698,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.0978,"10":0.19559,"11":0.13231,_:"6 7 9 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.16864},H:{"0":0.02},L:{"0":29.45331},R:{_:"0"},M:{"0":0.33295},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DE.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DE.js
    index 6b1000e6546d32..49d86982e2f9cb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DE.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DE.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00568,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.01705,"49":0.01137,"50":0.00568,"51":0,"52":0.06821,"53":0.0341,"54":0,"55":0,"56":0.00568,"57":0,"58":0,"59":0.00568,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00568,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.00568,"78":0.02274,"79":0,"80":0.00568,"81":0.00568,"82":0,"83":0.00568,"84":0,"85":0,"86":0,"87":0,"88":0.00568,"89":0.00568,"90":0,"91":0.01137,"92":0,"93":0,"94":0,"95":0.00568,"96":0.00568,"97":0.00568,"98":0,"99":0.00568,"100":0,"101":0.00568,"102":0.51156,"103":0.00568,"104":0.00568,"105":0.00568,"106":0.00568,"107":0.00568,"108":0.01705,"109":0.01137,"110":0.01137,"111":0.01705,"112":0.01705,"113":0.0341,"114":0.02274,"115":0.43198,"116":0.20462,"117":3.54113,"118":0.36946,"119":0.00568,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.01137,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0.00568,"42":0.00568,"43":0.02274,"44":0,"45":0,"46":0,"47":0,"48":0.00568,"49":0.00568,"50":0,"51":0,"52":0.00568,"53":0,"54":0,"55":0,"56":0.00568,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.0341,"67":0,"68":0,"69":0.00568,"70":0.00568,"71":0,"72":0.01137,"73":0,"74":0.00568,"75":0.01137,"76":0.00568,"77":0.00568,"78":0.00568,"79":0.02842,"80":0.02842,"81":0.02842,"83":0.01137,"84":0.00568,"85":0.01705,"86":0.01137,"87":0.01705,"88":0.01137,"89":0.01705,"90":0.01705,"91":0.06821,"92":0.00568,"93":0.09094,"94":0.02842,"95":0.00568,"96":0.01705,"97":0.00568,"98":0.00568,"99":0.02842,"100":0.00568,"101":0.00568,"102":0.01137,"103":0.04547,"104":0.01137,"105":0.03979,"106":0.22736,"107":0.05116,"108":0.09663,"109":0.61387,"110":0.05684,"111":0.05684,"112":0.08526,"113":0.07389,"114":0.35809,"115":0.41493,"116":9.7708,"117":3.06368,"118":0.01705,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00568,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00568,"70":0.00568,"71":0.00568,"72":0.02274,"73":0.00568,"74":0,"75":0,"76":0,"77":0.05684,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.04547,"96":0,"97":0,"98":0,"99":0.01137,"100":0.1762,"101":0.50019,"102":1.37553,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0.00568,"16":0,"17":0.00568,"18":0.00568,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00568,"93":0,"94":0.00568,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.00568,"104":0,"105":0.00568,"106":0.00568,"107":0.01137,"108":0.02274,"109":0.08526,"110":0.01705,"111":0.03979,"112":0.01705,"113":0.01705,"114":0.06821,"115":0.15347,"116":2.54075,"117":2.23381},E:{"4":0,"5":0,"6":0,"7":0.00568,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00568,"14":0.02274,"15":0.00568,_:"0","3.1":0,"3.2":0,"5.1":0.00568,"6.1":0,"7.1":0,"9.1":0.01137,"10.1":0,"11.1":0.00568,"12.1":0.00568,"13.1":0.05116,"14.1":0.07389,"15.1":0.01705,"15.2-15.3":0.01137,"15.4":0.02274,"15.5":0.0341,"15.6":0.22736,"16.0":0.05116,"16.1":0.07389,"16.2":0.07389,"16.3":0.16484,"16.4":0.05684,"16.5":0.19894,"16.6":1.39826,"17.0":0.13642,"17.1":0},G:{"8":0.00249,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00249,"6.0-6.1":0,"7.0-7.1":0.00997,"8.1-8.4":0,"9.0-9.2":0.02243,"9.3":0.05235,"10.0-10.2":0,"10.3":0.08226,"11.0-11.2":0.03241,"11.3-11.4":0.07229,"12.0-12.1":0.00997,"12.2-12.5":0.26174,"13.0-13.1":0.00499,"13.2":0.00499,"13.3":0.20939,"13.4-13.7":0.03739,"14.0-14.4":0.11716,"14.5-14.8":0.24429,"15.0-15.1":0.09722,"15.2-15.3":0.08475,"15.4":0.09472,"15.5":0.2742,"15.6-15.7":1.28376,"16.0":0.82011,"16.1":1.17657,"16.2":0.56835,"16.3":1.14666,"16.4":0.26922,"16.5":0.68052,"16.6":14.60498,"17.0":2.22851,"17.1":0.00249},P:{"4":0.06249,"20":0.08332,"21":0.18746,"22":3.30146,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01041,"12.0":0,"13.0":0.02083,"14.0":0.01041,"15.0":0.01041,"16.0":0.03124,"17.0":0.03124,"18.0":0.02083,"19.0":0.05207},I:{"0":0,"3":0,"4":0.00971,"2.1":0,"2.2":0,"2.3":0,"4.1":0.03885,"4.2-4.3":0.03885,"4.4":0,"4.4.3-4.4.4":0.12627},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00602,"9":0,"10":0,"11":0.09629,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":34.98484},R:{_:"0"},M:{"0":0.82004},Q:{"13.1":0.00432},O:{"0":0.14674},H:{"0":0.58023}};
    +module.exports={C:{"4":0.0053,"40":0.0053,"43":0.0053,"44":0.0053,"48":0.1059,"49":0.01059,"50":0.0053,"52":0.09002,"53":0.01059,"56":0.02648,"59":0.01589,"68":0.0053,"72":0.0053,"75":0.0053,"77":0.01059,"78":0.04766,"79":0.0053,"80":0.0053,"81":0.0053,"82":0.0053,"83":0.01059,"84":0.0053,"86":0.0053,"87":0.0053,"88":0.01059,"89":0.0053,"91":0.02118,"93":0.0053,"94":0.0053,"95":0.0053,"96":0.0053,"97":0.0053,"98":0.0053,"99":0.01059,"100":0.0053,"101":0.0053,"102":0.68306,"103":0.0053,"104":0.01059,"105":0.01589,"106":0.01589,"107":0.01589,"108":0.02118,"109":0.02118,"110":0.02118,"111":0.02118,"112":0.01589,"113":0.04236,"114":0.01589,"115":1.05371,"116":0.03177,"117":0.04236,"118":0.22239,"119":5.42738,"120":1.64145,"121":0.0053,_:"2 3 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 41 42 45 46 47 51 54 55 57 58 60 61 62 63 64 65 66 67 69 70 71 73 74 76 85 90 92 122 123 3.5 3.6"},D:{"35":0.02118,"38":0.0053,"41":0.0053,"42":0.0053,"43":0.03707,"48":0.0053,"49":0.02118,"51":0.0053,"52":0.01059,"56":0.0053,"60":0.0053,"63":0.0053,"64":0.01589,"66":0.06354,"68":0.0053,"69":0.01059,"70":0.01059,"71":0.0053,"72":0.02118,"73":0.0053,"74":0.01059,"75":0.0053,"76":0.01059,"77":0.01059,"78":0.01059,"79":0.05295,"80":0.05295,"81":0.02648,"83":0.01589,"84":0.02118,"85":0.15356,"86":0.02648,"87":0.1112,"88":0.02118,"89":0.02648,"90":0.01589,"91":0.10061,"92":0.0053,"93":0.12708,"94":0.01059,"95":0.01059,"96":0.03177,"97":0.01059,"98":0.01059,"99":0.03177,"100":0.01589,"101":0.01589,"102":0.02118,"103":0.08472,"104":0.02118,"105":0.05295,"106":0.46596,"107":0.1112,"108":0.16415,"109":0.97428,"110":0.09002,"111":0.09002,"112":0.12708,"113":0.07943,"114":0.2118,"115":0.1112,"116":0.27534,"117":0.46596,"118":4.80257,"119":15.45081,"120":0.02118,"121":0.0053,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 36 37 39 40 44 45 46 47 50 53 54 55 57 58 59 61 62 65 67 122"},F:{"36":0.0053,"46":0.01059,"85":0.0053,"91":0.0053,"92":0.0053,"93":0.0053,"94":0.01059,"95":0.07413,"96":0.0053,"99":0.0053,"100":0.0053,"101":0.0053,"102":1.3767,"103":0.323,"104":1.49319,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 86 87 88 89 90 97 98 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.0053},B:{"16":0.0053,"17":0.0053,"18":0.0053,"85":0.0053,"86":0.0053,"92":0.01059,"96":0.0053,"97":0.03177,"98":0.0053,"100":0.0053,"101":0.0053,"103":0.01059,"105":0.0053,"106":0.01589,"107":0.02648,"108":0.02648,"109":0.14297,"110":0.02118,"111":0.07413,"112":0.02118,"113":0.01589,"114":0.04766,"115":0.04236,"116":0.07943,"117":0.17474,"118":1.30787,"119":6.63993,_:"12 13 14 15 79 80 81 83 84 87 88 89 90 91 93 94 95 99 102 104"},E:{"7":0.02648,"13":0.0053,"14":0.04236,"15":0.01059,_:"0 4 5 6 8 9 10 11 12 3.1 3.2 6.1 7.1 10.1","5.1":0.01059,"9.1":0.03177,"11.1":0.01589,"12.1":0.01589,"13.1":0.07943,"14.1":0.13238,"15.1":0.02118,"15.2-15.3":0.02118,"15.4":0.03707,"15.5":0.05825,"15.6":0.38654,"16.0":0.09531,"16.1":0.12179,"16.2":0.11649,"16.3":0.24357,"16.4":0.08472,"16.5":0.19592,"16.6":1.38729,"17.0":0.58775,"17.1":1.1649,"17.2":0.02118},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.0032,"5.0-5.1":0.0032,"6.0-6.1":0.00799,"7.0-7.1":0.01119,"8.1-8.4":0.0016,"9.0-9.2":0.01279,"9.3":0.03997,"10.0-10.2":0.0032,"10.3":0.05756,"11.0-11.2":0.02718,"11.3-11.4":0.02398,"12.0-12.1":0.01439,"12.2-12.5":0.2622,"13.0-13.1":0.0064,"13.2":0.02718,"13.3":0.01599,"13.4-13.7":0.04636,"14.0-14.4":0.1231,"14.5-14.8":0.19984,"15.0-15.1":0.07834,"15.2-15.3":0.09593,"15.4":0.10712,"15.5":0.15028,"15.6-15.7":0.78979,"16.0":0.37091,"16.1":0.74342,"16.2":0.35652,"16.3":0.66828,"16.4":0.13749,"16.5":0.35492,"16.6-16.7":6.01613,"17.0":1.8018,"17.1":3.02645,"17.2":0.08633},P:{"4":0.0846,"20":0.07403,"21":0.13748,"22":0.31725,"23":3.61667,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1","7.2-7.4":0.01058,"11.1-11.2":0.01058,"12.0":0.01058,"13.0":0.03173,"14.0":0.01058,"15.0":0.01058,"16.0":0.02115,"17.0":0.03173,"18.0":0.02115,"19.0":0.05288},I:{"0":0.0515,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00004,"4.4":0,"4.4.3-4.4.4":0.00016},K:{"0":0.69164,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.0055,"9":0.0055,"11":0.13197,_:"6 7 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.13645},H:{"0":0},L:{"0":24.92845},R:{_:"0"},M:{"0":0.87043},Q:{"13.1":0.00471}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DJ.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DJ.js
    index c61a7ea8fbd3f0..a40abed18cfd48 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DJ.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DJ.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00269,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00269,"103":0,"104":0,"105":0,"106":0.00269,"107":0,"108":0,"109":0.00539,"110":0.00539,"111":0.01077,"112":0.00269,"113":0.00539,"114":0.00269,"115":0.29084,"116":0.01347,"117":0.35278,"118":0.0404,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00269,"46":0.00269,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.01885,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00539,"66":0,"67":0.35548,"68":0,"69":0,"70":0.00269,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.00539,"80":0,"81":0.00808,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00808,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0.01077,"99":0.01885,"100":0,"101":0.00539,"102":0,"103":0.00539,"104":0,"105":0.00269,"106":0.00539,"107":0,"108":0.00808,"109":0.5386,"110":0.01077,"111":0.00539,"112":0.00539,"113":0.01077,"114":0.12388,"115":0.0781,"116":2.62298,"117":0.78636,"118":0.00808,"119":0.00269,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00269,"70":0,"71":0.01616,"72":0.11311,"73":0.02154,"74":0,"75":0,"76":0,"77":0.01347,"78":0.00269,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.36356,"100":0,"101":0.00808,"102":0.00808,"9.5-9.6":0,"10.0-10.1":0,"10.5":0.00269,"10.6":0.01885,"11.1":0.00269,"11.5":0,"11.6":0,"12.1":0.00269},B:{"12":0,"13":0,"14":0.00539,"15":0,"16":0,"17":0,"18":0.00269,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00539,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.01885,"110":0.00269,"111":0,"112":0.00269,"113":0.02424,"114":0.01077,"115":0.0754,"116":0.56822,"117":0.40395},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00269,"15":0.00269,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00269,"14.1":0.00269,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0.00269,"16.0":0,"16.1":0,"16.2":0,"16.3":0,"16.4":0,"16.5":0.01077,"16.6":0.06194,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00089,"8.1-8.4":0,"9.0-9.2":0.00894,"9.3":0.00805,"10.0-10.2":0,"10.3":0,"11.0-11.2":0,"11.3-11.4":0.00984,"12.0-12.1":0.05813,"12.2-12.5":0.10106,"13.0-13.1":0.0939,"13.2":0.04024,"13.3":0.04919,"13.4-13.7":0.02146,"14.0-14.4":0.30138,"14.5-14.8":0.73244,"15.0-15.1":0.06081,"15.2-15.3":0.06976,"15.4":0.02415,"15.5":0.03935,"15.6-15.7":0.47577,"16.0":0.08854,"16.1":0.27634,"16.2":0.47041,"16.3":0.31301,"16.4":0.10732,"16.5":0.68772,"16.6":4.16747,"17.0":0.68236,"17.1":0.00179},P:{"4":1.13567,"20":0.36181,"21":0.69346,"22":1.80903,"5.0-5.4":0.0201,"6.2-6.4":0.01005,"7.2-7.4":0.33166,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.13065,"12.0":0.03015,"13.0":1.00502,"14.0":0.03015,"15.0":0.01005,"16.0":0.0603,"17.0":0.01005,"18.0":0.201,"19.0":0.201},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.01678,"4.4":0,"4.4.3-4.4.4":0.02937},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00269,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":73.02851},R:{_:"0"},M:{"0":0.16075},Q:{"13.1":0},O:{"0":1.28603},H:{"0":1.08609}};
    +module.exports={C:{"42":0.00241,"88":0.00241,"89":0.00483,"99":0.00241,"103":0.00241,"114":0.00724,"115":0.6373,"116":0.00724,"118":0.02655,"119":1.20941,"120":0.57453,"121":0.00241,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 90 91 92 93 94 95 96 97 98 100 101 102 104 105 106 107 108 109 110 111 112 113 117 122 123 3.5 3.6"},D:{"53":0.00241,"54":0.00241,"58":0.01207,"65":0.01931,"67":0.00483,"68":0.00483,"70":0.00483,"74":0.00241,"79":0.0338,"83":0.00724,"86":0.00241,"87":0.00483,"88":0.0169,"89":0.03138,"94":0.00483,"95":0.00483,"96":0.00483,"97":0.00241,"98":0.00483,"99":0.00483,"100":0.00241,"101":0.00724,"103":0.04828,"104":0.01207,"106":0.00241,"107":0.00724,"108":0.01207,"109":2.26675,"110":0.00966,"111":0.0338,"112":0.02414,"113":0.04587,"114":0.11346,"115":0.07483,"116":0.09415,"117":0.14001,"118":2.16777,"119":9.8636,"120":0.00724,"121":0.01931,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 55 56 57 59 60 61 62 63 64 66 69 71 72 73 75 76 77 78 80 81 84 85 90 91 92 93 102 105 122"},F:{"36":0.00483,"46":0.01207,"99":0.18829,"101":0.0169,"102":0.02173,"103":0.01931,"104":0.23416,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00483,"15":0.00241,"17":0.00241,"18":0.02897,"89":0.00483,"90":0.00241,"92":0.05794,"105":0.00241,"109":0.03862,"110":0.00483,"113":0.02414,"114":0.00483,"115":0.18105,"116":0.00483,"117":0.02414,"118":0.50935,"119":3.20821,_:"13 14 16 79 80 81 83 84 85 86 87 88 91 93 94 95 96 97 98 99 100 101 102 103 104 106 107 108 111 112"},E:{"14":0.00241,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 15.5 16.1 16.2 17.2","13.1":0.00966,"14.1":0.05311,"15.1":0.00483,"15.2-15.3":0.02655,"15.4":0.00241,"15.6":0.04104,"16.0":0.00241,"16.3":0.01207,"16.4":0.00966,"16.5":0.00724,"16.6":0.14725,"17.0":0.01207,"17.1":0.0338},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00105,"5.0-5.1":0.00105,"6.0-6.1":0.00262,"7.0-7.1":0.00367,"8.1-8.4":0.00052,"9.0-9.2":0.0042,"9.3":0.01312,"10.0-10.2":0.00105,"10.3":0.0189,"11.0-11.2":0.00892,"11.3-11.4":0.00787,"12.0-12.1":0.00472,"12.2-12.5":0.08609,"13.0-13.1":0.0021,"13.2":0.00892,"13.3":0.00525,"13.4-13.7":0.01522,"14.0-14.4":0.04042,"14.5-14.8":0.06562,"15.0-15.1":0.02572,"15.2-15.3":0.0315,"15.4":0.03517,"15.5":0.04935,"15.6-15.7":0.25933,"16.0":0.12179,"16.1":0.2441,"16.2":0.11706,"16.3":0.21943,"16.4":0.04515,"16.5":0.11654,"16.6-16.7":1.97539,"17.0":0.59162,"17.1":0.99373,"17.2":0.02835},P:{"4":0.14267,"20":0.39744,"21":0.3363,"22":0.5605,"23":1.2229,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 12.0 15.0","7.2-7.4":0.30572,"11.1-11.2":0.14267,"13.0":0.01019,"14.0":0.01019,"16.0":0.06114,"17.0":0.01019,"18.0":0.04076,"19.0":0.14267},I:{"0":0.03019,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.00009},K:{"0":0.64757,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.02414,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":2.75372},H:{"0":0.02},L:{"0":64.44288},R:{_:"0"},M:{"0":0.41723},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DK.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DK.js
    index 1b0f79d74d5b4a..0347b3668ab171 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DK.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DK.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.02192,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.01462,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0.00731,"88":0.00731,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.05116,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0.00731,"113":0.00731,"114":0.00731,"115":0.11693,"116":0.07308,"117":1.16928,"118":0.10962,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00731,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0.00731,"45":0,"46":0,"47":0,"48":0,"49":0.00731,"50":0,"51":0,"52":0.02923,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00731,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0.00731,"77":0,"78":0.00731,"79":0.01462,"80":0,"81":0,"83":0,"84":0,"85":0.00731,"86":0.02923,"87":0.02923,"88":0.02192,"89":0.01462,"90":0.00731,"91":0.00731,"92":0.00731,"93":0.05116,"94":0.00731,"95":0.00731,"96":0.00731,"97":0.00731,"98":0.00731,"99":0.00731,"100":0.00731,"101":0.00731,"102":0.00731,"103":0.2704,"104":0.01462,"105":0.02192,"106":0.00731,"107":0.04385,"108":0.03654,"109":0.85504,"110":0.07308,"111":0.08039,"112":0.16078,"113":0.14616,"114":0.89888,"115":1.50545,"116":26.10418,"117":7.62224,"118":0.00731,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00731,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.01462,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.02192,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00731,"96":0,"97":0,"98":0,"99":0.00731,"100":0.13154,"101":0.28501,"102":0.62849,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.01462,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.00731,"104":0,"105":0.00731,"106":0.00731,"107":0.00731,"108":0.00731,"109":0.06577,"110":0.00731,"111":0.00731,"112":0.01462,"113":0.02192,"114":0.04385,"115":0.23386,"116":3.26668,"117":2.71858},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00731,"14":0.0877,"15":0.02192,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00731,"13.1":0.08039,"14.1":0.28501,"15.1":0.05846,"15.2-15.3":0.05116,"15.4":0.07308,"15.5":0.10231,"15.6":0.49694,"16.0":0.0877,"16.1":0.16808,"16.2":0.13885,"16.3":0.41656,"16.4":0.24116,"16.5":0.4531,"16.6":2.03893,"17.0":0.11693,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0.06629,"9.3":0.0904,"10.0-10.2":0,"10.3":0.06027,"11.0-11.2":0.02411,"11.3-11.4":0.00904,"12.0-12.1":0.00904,"12.2-12.5":0.28024,"13.0-13.1":0,"13.2":0,"13.3":0.06931,"13.4-13.7":0.02411,"14.0-14.4":0.09341,"14.5-14.8":0.20792,"15.0-15.1":0.07232,"15.2-15.3":0.12355,"15.4":0.09944,"15.5":0.23806,"15.6-15.7":1.47052,"16.0":0.79854,"16.1":1.56996,"16.2":0.6539,"16.3":1.76282,"16.4":0.16272,"16.5":0.74731,"16.6":18.95103,"17.0":2.01594,"17.1":0},P:{"4":0.0311,"20":0.0311,"21":0.04147,"22":1.05739,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0,"17.0":0.01037,"18.0":0,"19.0":0.01037},I:{"0":0,"3":0,"4":0.00915,"2.1":0,"2.2":0.00457,"2.3":0.00457,"4.1":0.00762,"4.2-4.3":0.02135,"4.4":0,"4.4.3-4.4.4":0.08234},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.06577,"9":0.00731,"10":0.00731,"11":0.11693,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":14.74076},R:{_:"0"},M:{"0":0.21805},Q:{"13.1":0},O:{"0":0.01346},H:{"0":0.11214}};
    +module.exports={C:{"52":0.03508,"60":0.00702,"78":0.02105,"88":0.00702,"96":0.00702,"102":0.00702,"109":0.00702,"111":0.00702,"115":0.19642,"116":0.01403,"117":0.00702,"118":0.05612,"119":1.25569,"120":0.74359,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 90 91 92 93 94 95 97 98 99 100 101 103 104 105 106 107 108 110 112 113 114 121 122 123 3.5 3.6"},D:{"44":0.00702,"49":0.02105,"52":0.01403,"76":0.01403,"78":0.01403,"79":0.01403,"83":0.00702,"85":0.00702,"86":0.03508,"87":0.03508,"88":0.02105,"89":0.02105,"90":0.00702,"91":0.00702,"92":0.01403,"93":0.0912,"94":0.00702,"95":0.00702,"96":0.00702,"97":0.00702,"98":0.00702,"99":0.01403,"100":0.01403,"101":0.00702,"102":0.00702,"103":0.29463,"104":0.01403,"105":0.05612,"106":0.01403,"107":0.04911,"108":0.04209,"109":0.99613,"110":0.05612,"111":0.06314,"112":0.0912,"113":0.0912,"114":0.29463,"115":0.31568,"116":1.34688,"117":1.45912,"118":11.19594,"119":33.89648,"120":0.02806,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 45 46 47 48 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 77 80 81 84 121 122"},F:{"46":0.00702,"95":0.01403,"102":0.77867,"103":0.0912,"104":0.60329,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"92":0.00702,"97":0.00702,"107":0.01403,"108":0.01403,"109":0.08418,"110":0.00702,"111":0.00702,"112":0.01403,"113":0.00702,"114":0.01403,"115":0.03508,"116":0.21045,"117":0.12627,"118":1.3539,"119":6.28544,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 98 99 100 101 102 103 104 105 106"},E:{"14":0.09821,"15":0.02806,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.00702,"13.1":0.08418,"14.1":0.37881,"15.1":0.05612,"15.2-15.3":0.04911,"15.4":0.08418,"15.5":0.11926,"15.6":0.58926,"16.0":0.10523,"16.1":0.16836,"16.2":0.14732,"16.3":0.4209,"16.4":0.23851,"16.5":0.35075,"16.6":1.64853,"17.0":0.74359,"17.1":1.00315,"17.2":0.01403},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00368,"5.0-5.1":0.00368,"6.0-6.1":0.00919,"7.0-7.1":0.01286,"8.1-8.4":0.00184,"9.0-9.2":0.0147,"9.3":0.04594,"10.0-10.2":0.00368,"10.3":0.06615,"11.0-11.2":0.03124,"11.3-11.4":0.02756,"12.0-12.1":0.01654,"12.2-12.5":0.30136,"13.0-13.1":0.00735,"13.2":0.03124,"13.3":0.01838,"13.4-13.7":0.05329,"14.0-14.4":0.14149,"14.5-14.8":0.2297,"15.0-15.1":0.09004,"15.2-15.3":0.11025,"15.4":0.12312,"15.5":0.17273,"15.6-15.7":0.90776,"16.0":0.42632,"16.1":0.85447,"16.2":0.40978,"16.3":0.7681,"16.4":0.15803,"16.5":0.40794,"16.6-16.7":6.91476,"17.0":2.07094,"17.1":3.47851,"17.2":0.09923},P:{"4":0.02101,"20":0.01051,"21":0.03152,"22":0.08406,"23":1.14528,_:"5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 18.0","17.0":0.01051,"19.0":0.01051},I:{"0":0.07425,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00005,"4.4":0,"4.4.3-4.4.4":0.00022},K:{"0":0.12836,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.08659,"11":0.16595,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.01194},H:{"0":0},L:{"0":9.99365},R:{_:"0"},M:{"0":0.19403},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DM.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DM.js
    index 3876fbcf77cebe..de7fd3133589fd 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DM.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DM.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.0086,"116":0.0602,"117":0.2107,"118":0.0086,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.0086,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.0043,"70":0,"71":0,"72":0,"73":0,"74":0.0043,"75":0.0043,"76":0.5762,"77":0.0731,"78":0,"79":0.0129,"80":0,"81":0.0043,"83":0,"84":0,"85":0,"86":0,"87":0.0043,"88":0.0043,"89":0.0129,"90":0.0043,"91":0.0086,"92":0,"93":0.043,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.0258,"101":0,"102":0.0043,"103":0.0473,"104":0.0043,"105":0.1204,"106":0.0086,"107":0.0043,"108":0.0129,"109":0.4687,"110":0.0043,"111":0.0043,"112":0.0215,"113":0.0344,"114":0.2322,"115":0.3053,"116":6.7639,"117":1.6512,"118":0.0043,"119":0.0129,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.0215,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.2967,"73":0,"74":0,"75":0,"76":0,"77":0.0086,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.0215,"101":0.1376,"102":0.0731,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.0086,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.1161,"110":0,"111":0,"112":0,"113":0,"114":0.0129,"115":0.043,"116":1.6555,"117":1.0965},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.0043,"14":0.1075,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.0043,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.0086,"14.1":0.0301,"15.1":0,"15.2-15.3":0,"15.4":0.0086,"15.5":0.0215,"15.6":0.1075,"16.0":0,"16.1":0.0602,"16.2":0.0602,"16.3":0.0258,"16.4":0.0172,"16.5":0.0344,"16.6":0.4042,"17.0":0.0946,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.11702,"10.0-10.2":0,"10.3":0.03203,"11.0-11.2":0.00739,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0.12442,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0.1121,"14.0-14.4":0.08377,"14.5-14.8":0.05913,"15.0-15.1":0.01232,"15.2-15.3":0.00985,"15.4":0.01478,"15.5":0.12688,"15.6-15.7":1.25278,"16.0":0.16876,"16.1":1.7332,"16.2":0.1121,"16.3":0.32028,"16.4":0.04681,"16.5":0.18108,"16.6":6.89214,"17.0":0.78838,"17.1":0},P:{"4":0.06369,"20":0.13799,"21":0.11676,"22":3.89556,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.60503,"8.2":0,"9.2":0,"10.1":0.02123,"11.1-11.2":0.01061,"12.0":0,"13.0":0.04246,"14.0":0,"15.0":0,"16.0":0.02123,"17.0":0.0743,"18.0":0.03184,"19.0":0.06369},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.7481},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0.0057},L:{"0":62.5342},R:{_:"0"},M:{"0":0.0627},Q:{"13.1":0},O:{"0":0.1026},H:{"0":0.86882}};
    +module.exports={C:{"37":0.00501,"115":0.01503,"118":0.01503,"119":0.53106,"120":0.07515,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 116 117 121 122 123 3.5 3.6"},D:{"49":0.01002,"56":0.00501,"65":0.01002,"74":0.00501,"75":0.01503,"76":0.69138,"77":0.12024,"79":0.04008,"81":0.00501,"87":0.01002,"88":0.01503,"91":0.01503,"93":0.11022,"100":0.01503,"102":0.00501,"103":0.09018,"105":0.1002,"107":0.14529,"108":0.00501,"109":1.01202,"110":0.00501,"112":0.00501,"113":0.02505,"114":0.08016,"115":0.02004,"116":0.11523,"117":0.44088,"118":5.98194,"119":19.95483,"120":0.03006,"121":0.03006,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 50 51 52 53 54 55 57 58 59 60 61 62 63 64 66 67 68 69 70 71 72 73 78 80 83 84 85 86 89 90 92 94 95 96 97 98 99 101 104 106 111 122"},F:{"77":0.07014,"95":0.01503,"102":0.28557,"103":0.09018,"104":0.15531,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.01002,"92":0.01503,"109":0.02505,"114":0.00501,"116":0.00501,"117":0.02004,"118":1.19238,"119":4.74447,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 111 112 113 115"},E:{"10":0.01002,"14":0.44589,_:"0 4 5 6 7 8 9 11 12 13 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1 12.1 15.1 15.4 16.0","5.1":0.00501,"13.1":0.03006,"14.1":0.18036,"15.2-15.3":0.01002,"15.5":0.03507,"15.6":0.45591,"16.1":0.10521,"16.2":0.14529,"16.3":0.12024,"16.4":0.02505,"16.5":0.03507,"16.6":6.26751,"17.0":0.16533,"17.1":0.13026,"17.2":0.00501},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00142,"5.0-5.1":0.00142,"6.0-6.1":0.00354,"7.0-7.1":0.00495,"8.1-8.4":0.00071,"9.0-9.2":0.00566,"9.3":0.01769,"10.0-10.2":0.00142,"10.3":0.02547,"11.0-11.2":0.01203,"11.3-11.4":0.01061,"12.0-12.1":0.00637,"12.2-12.5":0.11604,"13.0-13.1":0.00283,"13.2":0.01203,"13.3":0.00708,"13.4-13.7":0.02052,"14.0-14.4":0.05448,"14.5-14.8":0.08845,"15.0-15.1":0.03467,"15.2-15.3":0.04245,"15.4":0.04741,"15.5":0.06651,"15.6-15.7":0.34955,"16.0":0.16416,"16.1":0.32903,"16.2":0.15779,"16.3":0.29577,"16.4":0.06085,"16.5":0.15708,"16.6-16.7":2.66263,"17.0":0.79744,"17.1":1.33945,"17.2":0.03821},P:{"4":0.1007,"20":0.05595,"21":0.03357,"22":0.12308,"23":2.31615,_:"5.0-5.4 8.2 11.1-11.2 12.0 14.0 15.0","6.2-6.4":0.02238,"7.2-7.4":0.13427,"9.2":0.01119,"10.1":0.01119,"13.0":0.02238,"16.0":0.01119,"17.0":0.01119,"18.0":0.03357,"19.0":0.02238},I:{"0":0.1986,"3":0.00002,"4":0.00004,"2.1":0,"2.2":0.00004,"2.3":0,"4.1":0.00002,"4.2-4.3":0.00014,"4.4":0,"4.4.3-4.4.4":0.0006},K:{"0":0.22455,_:"10 11 12 11.1 11.5 12.1"},A:{"10":0.01002,_:"6 7 8 9 11 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.08982},H:{"0":0},L:{"0":44.37711},R:{_:"0"},M:{"0":0.11477},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DO.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DO.js
    index 34a23b6df43f67..7fb8ac27487e37 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DO.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DO.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00432,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0.00432,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0.04756,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00432,"103":0,"104":0.09945,"105":0.00432,"106":0.01297,"107":0,"108":0,"109":0.00865,"110":0,"111":0,"112":0.00432,"113":0.00865,"114":0.01297,"115":0.04324,"116":0.03027,"117":0.3243,"118":0.02594,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00432,"34":0,"35":0,"36":0,"37":0,"38":0.00432,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00432,"48":0,"49":0.02162,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.00432,"64":0.00432,"65":0.00432,"66":0.00432,"67":0,"68":0.00432,"69":0.00865,"70":0.00432,"71":0,"72":0.00865,"73":0.00432,"74":0.00865,"75":0.00432,"76":0.00432,"77":0.00432,"78":0.00432,"79":0.02162,"80":0.00865,"81":0.02594,"83":0.00865,"84":0,"85":0.00865,"86":0.00865,"87":0.03892,"88":0.01297,"89":0.00865,"90":0.02594,"91":0.03027,"92":0.00865,"93":0.03027,"94":0.00432,"95":0.00432,"96":0.01297,"97":0.0173,"98":0.00432,"99":0.00865,"100":0.00432,"101":0.00432,"102":0.00865,"103":0.05189,"104":0.00432,"105":0.03027,"106":0.04324,"107":0.07351,"108":0.04324,"109":0.9729,"110":0.03892,"111":0.06918,"112":0.05621,"113":0.03892,"114":0.14269,"115":0.25512,"116":8.04264,"117":2.12741,"118":0.00432,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00432,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00432,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00432,"70":0,"71":0,"72":0.0173,"73":0,"74":0,"75":0,"76":0,"77":0.0173,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0.00432,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0.00432,"94":0.00865,"95":0.0173,"96":0.0173,"97":0,"98":0,"99":0.00865,"100":0.13837,"101":0.24214,"102":0.30268,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.0173,"79":0,"80":0,"81":0,"83":0,"84":0.00432,"85":0.00432,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.0173,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00432,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00865,"108":0,"109":0.03027,"110":0.00432,"111":0.00865,"112":0.00432,"113":0.00865,"114":0.02162,"115":0.03027,"116":0.96858,"117":0.71778},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00432,"14":0.0173,"15":0.00432,_:"0","3.1":0,"3.2":0,"5.1":0.00432,"6.1":0,"7.1":0,"9.1":0.03459,"10.1":0,"11.1":0,"12.1":0.00432,"13.1":0.02162,"14.1":0.03892,"15.1":0.00865,"15.2-15.3":0.00432,"15.4":0.00865,"15.5":0.02162,"15.6":0.07783,"16.0":0.00865,"16.1":0.03027,"16.2":0.02594,"16.3":0.05621,"16.4":0.03892,"16.5":0.11675,"16.6":0.4324,"17.0":0.02162,"17.1":0},G:{"8":0,"3.2":0.02965,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.04582,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.1105,"10.0-10.2":0,"10.3":0.03234,"11.0-11.2":0.01078,"11.3-11.4":0.00809,"12.0-12.1":0.03504,"12.2-12.5":0.35037,"13.0-13.1":0.01078,"13.2":0.00539,"13.3":0.0539,"13.4-13.7":0.06199,"14.0-14.4":0.28568,"14.5-14.8":0.39618,"15.0-15.1":0.11859,"15.2-15.3":0.18057,"15.4":0.1671,"15.5":0.32611,"15.6-15.7":3.39855,"16.0":0.81393,"16.1":1.43381,"16.2":0.70343,"16.3":1.41764,"16.4":0.24526,"16.5":0.76811,"16.6":13.98771,"17.0":1.50119,"17.1":0.00809},P:{"4":0.08462,"20":0.06347,"21":0.10578,"22":1.25878,"5.0-5.4":0.01058,"6.2-6.4":0,"7.2-7.4":0.0952,"8.2":0,"9.2":0.01058,"10.1":0,"11.1-11.2":0.05289,"12.0":0,"13.0":0.01058,"14.0":0.01058,"15.0":0.01058,"16.0":0.05289,"17.0":0.03173,"18.0":0.02116,"19.0":0.04231},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.02482,"4.4":0,"4.4.3-4.4.4":0.41569},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00528,"9":0,"10":0,"11":0.04228,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":52.41843},R:{_:"0"},M:{"0":0.33488},Q:{"13.1":0},O:{"0":0.06244},H:{"0":0.2042}};
    +module.exports={C:{"52":0.01244,"61":0.01659,"73":0.112,"78":0.0083,"87":0.0083,"88":0.00415,"89":0.01659,"91":0.0083,"102":0.00415,"104":0.01244,"106":0.01244,"108":0.00415,"110":0.02904,"111":0.00415,"113":0.00415,"114":0.01659,"115":0.09126,"116":0.00415,"117":0.0083,"118":0.09126,"119":0.60976,"120":0.17836,"121":0.00415,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 62 63 64 65 66 67 68 69 70 71 72 74 75 76 77 79 80 81 82 83 84 85 86 90 92 93 94 95 96 97 98 99 100 101 103 105 107 109 112 122 123 3.5 3.6"},D:{"38":0.00415,"47":0.00415,"49":0.04978,"56":0.00415,"60":0.00415,"65":0.0083,"66":0.00415,"67":0.00415,"69":0.30695,"70":0.0083,"72":0.0083,"73":0.00415,"74":0.00415,"75":0.00415,"76":0.01244,"77":0.00415,"78":0.00415,"79":0.06637,"80":0.0083,"81":0.0083,"83":0.0083,"84":0.01659,"85":0.0083,"86":0.01244,"87":0.08296,"88":0.04563,"90":0.01659,"91":0.02074,"92":0.00415,"93":0.12859,"94":0.00415,"95":0.00415,"96":0.0083,"97":0.04563,"98":0.01244,"99":0.0083,"100":0.00415,"101":0.02074,"102":0.0083,"103":0.8296,"104":0.00415,"105":0.09126,"106":0.14103,"107":0.14933,"108":0.16177,"109":1.75875,"110":0.06637,"111":0.10785,"112":0.12859,"113":0.02904,"114":0.17836,"115":0.05392,"116":0.26962,"117":0.36502,"118":4.44666,"119":18.48764,"120":0.00415,"121":0.00415,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 48 50 51 52 53 54 55 57 58 59 61 62 63 64 68 71 89 122"},F:{"69":0.00415,"95":0.02904,"96":0.0083,"101":0.00415,"102":0.62635,"103":0.17836,"104":0.75494,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.03318,"80":0.00415,"85":0.00415,"89":0.00415,"92":0.04148,"100":0.00415,"103":0.0083,"105":0.00415,"108":0.02904,"109":0.04148,"110":0.0083,"111":0.0083,"112":0.01659,"113":0.00415,"114":0.01659,"115":0.01659,"116":0.03318,"117":0.08711,"118":0.75908,"119":3.91986,_:"12 13 14 15 16 17 79 81 83 84 86 87 88 90 91 93 94 95 96 97 98 99 101 102 104 106 107"},E:{"14":0.04148,"15":0.01244,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 6.1 7.1 10.1 11.1","5.1":0.00415,"9.1":0.00415,"12.1":0.00415,"13.1":0.04148,"14.1":0.16592,"15.1":0.01244,"15.2-15.3":0.00415,"15.4":0.02074,"15.5":0.03733,"15.6":0.27792,"16.0":0.02074,"16.1":0.07052,"16.2":0.05392,"16.3":0.09955,"16.4":0.07052,"16.5":0.17422,"16.6":0.7259,"17.0":0.33184,"17.1":0.30695,"17.2":0.01244},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00338,"5.0-5.1":0.00338,"6.0-6.1":0.00844,"7.0-7.1":0.01182,"8.1-8.4":0.00169,"9.0-9.2":0.01351,"9.3":0.04222,"10.0-10.2":0.00338,"10.3":0.0608,"11.0-11.2":0.02871,"11.3-11.4":0.02533,"12.0-12.1":0.0152,"12.2-12.5":0.27698,"13.0-13.1":0.00676,"13.2":0.02871,"13.3":0.01689,"13.4-13.7":0.04898,"14.0-14.4":0.13004,"14.5-14.8":0.21111,"15.0-15.1":0.08276,"15.2-15.3":0.10133,"15.4":0.11316,"15.5":0.15876,"15.6-15.7":0.83431,"16.0":0.39182,"16.1":0.78533,"16.2":0.37662,"16.3":0.70595,"16.4":0.14524,"16.5":0.37493,"16.6-16.7":6.35528,"17.0":1.90338,"17.1":3.19706,"17.2":0.0912},P:{"4":0.09524,"20":0.03175,"21":0.07408,"22":0.15874,"23":1.1006,"5.0-5.4":0.01058,_:"6.2-6.4 8.2 10.1 12.0","7.2-7.4":0.07408,"9.2":0.01058,"11.1-11.2":0.04233,"13.0":0.01058,"14.0":0.01058,"15.0":0.01058,"16.0":0.03175,"17.0":0.02117,"18.0":0.03175,"19.0":0.05291},I:{"0":0.04076,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00012},K:{"0":0.31016,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.03733,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.0117,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.05267},H:{"0":0},L:{"0":41.20119},R:{_:"0"},M:{"0":0.39208},Q:{"13.1":0.0117}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DZ.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DZ.js
    index f2463d0587c944..8b9710b5548164 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DZ.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/DZ.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00316,"39":0,"40":0,"41":0,"42":0,"43":0.00316,"44":0,"45":0,"46":0,"47":0.00316,"48":0,"49":0,"50":0,"51":0,"52":0.02844,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.00316,"68":0,"69":0,"70":0,"71":0,"72":0.00316,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0.00316,"82":0,"83":0,"84":0,"85":0.00316,"86":0,"87":0,"88":0.00316,"89":0,"90":0,"91":0.00632,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00316,"100":0,"101":0,"102":0.01896,"103":0.00316,"104":0.00316,"105":0.00316,"106":0.00316,"107":0.00316,"108":0.00316,"109":0.00316,"110":0.0158,"111":0.00316,"112":0.00316,"113":0.00948,"114":0.00632,"115":0.31916,"116":0.02212,"117":0.3002,"118":0.02844,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00316,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00316,"34":0,"35":0,"36":0,"37":0,"38":0.00316,"39":0,"40":0.00316,"41":0,"42":0,"43":0.01264,"44":0,"45":0.00316,"46":0,"47":0.00316,"48":0,"49":0.02528,"50":0.00316,"51":0.00632,"52":0,"53":0,"54":0,"55":0.00316,"56":0.00632,"57":0,"58":0.00632,"59":0,"60":0.00316,"61":0.00316,"62":0,"63":0.00632,"64":0.00316,"65":0.00316,"66":0,"67":0,"68":0.00948,"69":0.00316,"70":0.00632,"71":0.00316,"72":0.00948,"73":0,"74":0.00948,"75":0.00316,"76":0.00316,"77":0.00316,"78":0.00316,"79":0.02528,"80":0.00316,"81":0.02528,"83":0.01264,"84":0.00632,"85":0.02528,"86":0.00632,"87":0.04424,"88":0.01264,"89":0.00632,"90":0.01264,"91":0.00632,"92":0.00948,"93":0.00948,"94":0.00316,"95":0.0158,"96":0.00948,"97":0.00948,"98":0.02212,"99":0.01264,"100":0.00948,"101":0.01264,"102":0.04108,"103":0.02212,"104":0.00948,"105":0.02528,"106":0.02212,"107":0.07268,"108":0.05372,"109":2.50588,"110":0.01896,"111":0.02212,"112":0.02844,"113":0.01896,"114":0.06636,"115":0.079,"116":2.49008,"117":0.75524,"118":0.00316,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00316,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00316,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00316,"70":0.00632,"71":0.00316,"72":0.0316,"73":0.01264,"74":0,"75":0,"76":0,"77":0.0158,"78":0.00316,"79":0.01264,"80":0,"81":0,"82":0,"83":0,"84":0.00632,"85":0.00948,"86":0.00948,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.07584,"96":0,"97":0,"98":0,"99":0.00316,"100":0.0316,"101":0.1264,"102":0.14852,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00316,"13":0.00316,"14":0,"15":0.00316,"16":0,"17":0,"18":0.00632,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0.00316,"87":0,"88":0,"89":0,"90":0.02844,"91":0,"92":0.00948,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00316,"108":0.00316,"109":0.0316,"110":0.00316,"111":0.00632,"112":0.00316,"113":0.00316,"114":0.0158,"115":0.0158,"116":0.4582,"117":0.24648},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00316,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00316,"6.1":0,"7.1":0,"9.1":0.00316,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00316,"14.1":0.00316,"15.1":0,"15.2-15.3":0,"15.4":0.00316,"15.5":0.00316,"15.6":0.0158,"16.0":0,"16.1":0.00632,"16.2":0.00316,"16.3":0.00948,"16.4":0.00632,"16.5":0.0158,"16.6":0.06952,"17.0":0.00948,"17.1":0},G:{"8":0,"3.2":0.0024,"4.0-4.1":0,"4.2-4.3":0.0008,"5.0-5.1":0.0064,"6.0-6.1":0.0048,"7.0-7.1":0.06957,"8.1-8.4":0.0072,"9.0-9.2":0.004,"9.3":0.07436,"10.0-10.2":0.0032,"10.3":0.03598,"11.0-11.2":0.01919,"11.3-11.4":0.0064,"12.0-12.1":0.008,"12.2-12.5":0.15992,"13.0-13.1":0.0048,"13.2":0.004,"13.3":1.30577,"13.4-13.7":0.02079,"14.0-14.4":0.07117,"14.5-14.8":0.09356,"15.0-15.1":0.04478,"15.2-15.3":0.04958,"15.4":0.06957,"15.5":0.13673,"15.6-15.7":0.89157,"16.0":0.23669,"16.1":0.35343,"16.2":0.2127,"16.3":0.37422,"16.4":0.14953,"16.5":0.36542,"16.6":2.61235,"17.0":0.51655,"17.1":0},P:{"4":0.11425,"20":0.06232,"21":0.16619,"22":0.89325,"5.0-5.4":0,"6.2-6.4":0.01039,"7.2-7.4":0.09348,"8.2":0,"9.2":0.08309,"10.1":0,"11.1-11.2":0.01039,"12.0":0.01039,"13.0":0.04155,"14.0":0.02077,"15.0":0.01039,"16.0":0.03116,"17.0":0.04155,"18.0":0.03116,"19.0":0.06232},I:{"0":0,"3":0,"4":0.00609,"2.1":0,"2.2":0,"2.3":0.01827,"4.1":0.00913,"4.2-4.3":0.02131,"4.4":0,"4.4.3-4.4.4":0.25268},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01317,"9":0.00329,"10":0.00988,"11":0.05267,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":78.51548},R:{_:"0"},M:{"0":0.12312},Q:{"13.1":0.00684},O:{"0":0.47196},H:{"0":0.57633}};
    +module.exports={C:{"15":0.01476,"25":0.00295,"29":0.00295,"30":0.0059,"33":0.00295,"34":0.00295,"36":0.00295,"37":0.00295,"38":0.00886,"39":0.00295,"40":0.0059,"41":0.00295,"43":0.0059,"44":0.00295,"45":0.00295,"47":0.01181,"48":0.00295,"49":0.00295,"52":0.1476,"55":0.00295,"56":0.00295,"57":0.00295,"63":0.00295,"67":0.00295,"68":0.0059,"71":0.00295,"72":0.01181,"74":0.00295,"75":0.0059,"78":0.00886,"80":0.00295,"81":0.00295,"82":0.00295,"84":0.00295,"86":0.00295,"87":0.00295,"88":0.0059,"89":0.00295,"91":0.00295,"93":0.00295,"94":0.00295,"95":0.00295,"97":0.00295,"99":0.00886,"100":0.00295,"101":0.00295,"102":0.0059,"103":0.00295,"104":0.0059,"105":0.00295,"106":0.01476,"107":0.0059,"108":0.0059,"109":0.00886,"110":0.01181,"111":0.00886,"112":0.02952,"113":0.01181,"114":0.01181,"115":1.16899,"116":0.0059,"117":0.0059,"118":0.03247,"119":0.72324,"120":0.22435,"121":0.00295,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22 23 24 26 27 28 31 32 35 42 46 50 51 53 54 58 59 60 61 62 64 65 66 69 70 73 76 77 79 83 85 90 92 96 98 122 123 3.5 3.6"},D:{"11":0.0059,"18":0.00295,"26":0.0059,"29":0.00295,"30":0.00295,"31":0.0059,"32":0.0059,"33":0.01771,"34":0.00295,"35":0.00295,"37":0.00295,"38":0.00886,"39":0.00295,"40":0.01181,"41":0.00295,"42":0.00295,"43":0.07085,"44":0.00295,"45":0.00295,"46":0.00295,"47":0.0059,"48":0.00295,"49":0.08266,"50":0.00886,"51":0.0059,"52":0.00295,"54":0.00295,"55":0.00295,"56":0.01476,"57":0.0059,"58":0.02066,"59":0.00295,"60":0.00886,"61":0.0059,"62":0.00886,"63":0.02362,"64":0.00886,"65":0.01181,"66":0.00295,"67":0.00295,"68":0.00886,"69":0.01181,"70":0.00886,"71":0.01181,"72":0.01476,"73":0.00886,"74":0.01181,"75":0.0059,"76":0.00886,"77":0.01476,"78":0.01181,"79":0.0679,"80":0.01181,"81":0.03838,"83":0.02952,"84":0.01181,"85":0.03838,"86":0.01476,"87":0.05018,"88":0.01181,"89":0.02066,"90":0.00886,"91":0.00886,"92":0.00886,"93":0.0059,"94":0.0059,"95":0.04133,"96":0.01771,"97":0.01476,"98":0.06199,"99":0.01771,"100":0.01771,"101":0.01771,"102":0.06199,"103":0.06199,"104":0.02066,"105":0.05904,"106":0.10332,"107":0.07675,"108":0.1476,"109":8.33645,"110":0.05018,"111":0.05904,"112":0.08266,"113":0.02066,"114":0.05609,"115":0.03542,"116":0.12398,"117":0.15646,"118":1.85386,"119":8.43977,"120":0.00886,"121":0.00886,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 19 20 21 22 23 24 25 27 28 36 53 122"},F:{"25":0.00295,"28":0.01181,"36":0.00295,"63":0.00295,"79":0.04428,"80":0.00295,"81":0.00295,"83":0.00295,"84":0.01181,"85":0.03838,"86":0.00886,"87":0.00295,"91":0.00295,"93":0.00295,"95":0.21845,"96":0.00295,"97":0.00295,"98":0.00295,"101":0.00295,"102":0.24502,"103":0.11218,"104":0.45756,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 26 27 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 82 88 89 90 92 94 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.00295},B:{"12":0.0059,"13":0.00295,"14":0.00295,"15":0.00295,"16":0.00295,"17":0.00295,"18":0.01476,"84":0.00295,"85":0.00295,"89":0.00295,"92":0.02657,"100":0.00295,"104":0.00295,"106":0.0059,"107":0.02066,"108":0.01476,"109":0.08561,"110":0.01476,"111":0.00886,"112":0.00886,"113":0.00295,"114":0.00886,"115":0.00886,"116":0.01476,"117":0.05018,"118":0.25387,"119":1.25165,_:"79 80 81 83 86 87 88 90 91 93 94 95 96 97 98 99 101 102 103 105"},E:{"9":0.00295,"13":0.00295,"14":0.0059,"15":0.00295,_:"0 4 5 6 7 8 10 11 12 3.1 3.2 6.1 7.1 9.1 10.1 11.1","5.1":0.00886,"12.1":0.00295,"13.1":0.01181,"14.1":0.00886,"15.1":0.0059,"15.2-15.3":0.01181,"15.4":0.01181,"15.5":0.02657,"15.6":0.0679,"16.0":0.00886,"16.1":0.01476,"16.2":0.01771,"16.3":0.04428,"16.4":0.00886,"16.5":0.05609,"16.6":0.23026,"17.0":0.10332,"17.1":0.16531,"17.2":0.00295},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00157,"5.0-5.1":0.00157,"6.0-6.1":0.00394,"7.0-7.1":0.00551,"8.1-8.4":0.00079,"9.0-9.2":0.0063,"9.3":0.01968,"10.0-10.2":0.00157,"10.3":0.02834,"11.0-11.2":0.01338,"11.3-11.4":0.01181,"12.0-12.1":0.00709,"12.2-12.5":0.12911,"13.0-13.1":0.00315,"13.2":0.01338,"13.3":0.00787,"13.4-13.7":0.02283,"14.0-14.4":0.06062,"14.5-14.8":0.09841,"15.0-15.1":0.03858,"15.2-15.3":0.04724,"15.4":0.05275,"15.5":0.074,"15.6-15.7":0.38891,"16.0":0.18264,"16.1":0.36608,"16.2":0.17556,"16.3":0.32908,"16.4":0.0677,"16.5":0.17477,"16.6-16.7":2.96247,"17.0":0.88724,"17.1":1.49029,"17.2":0.04251},P:{"4":0.10232,"20":0.06139,"21":0.10232,"22":0.23534,"23":0.73673,_:"5.0-5.4 8.2 10.1","6.2-6.4":0.0307,"7.2-7.4":0.12279,"9.2":0.0307,"11.1-11.2":0.02046,"12.0":0.01023,"13.0":0.0307,"14.0":0.02046,"15.0":0.01023,"16.0":0.04093,"17.0":0.0307,"18.0":0.0307,"19.0":0.08186},I:{"0":0.08415,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00025},K:{"0":0.5027,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.031,"9":0.0124,"10":0.0062,"11":0.19527,_:"6 7 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.35945},H:{"0":0.04},L:{"0":61.37282},R:{_:"0"},M:{"0":0.11277},Q:{"13.1":0.00705}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/EC.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/EC.js
    index 453404529913d8..d174fa568f911f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/EC.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/EC.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00541,"50":0,"51":0,"52":0.00541,"53":0,"54":0,"55":0,"56":0,"57":0.00541,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00541,"67":0,"68":0.00541,"69":0,"70":0,"71":0,"72":0,"73":0.01082,"74":0,"75":0.00541,"76":0,"77":0,"78":0.00541,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.01082,"89":0.01082,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0.00541,"97":0,"98":0,"99":0.00541,"100":0.00541,"101":0,"102":0.01623,"103":0.00541,"104":0.01082,"105":0.00541,"106":0.00541,"107":0.00541,"108":0.00541,"109":0.01082,"110":0.01082,"111":0.01082,"112":0.01082,"113":0.02164,"114":0.02164,"115":0.25963,"116":0.08114,"117":1.30357,"118":0.12982,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.01623,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.01623,"48":0,"49":0.01082,"50":0,"51":0,"52":0,"53":0.00541,"54":0,"55":0.00541,"56":0,"57":0,"58":0,"59":0,"60":0.00541,"61":0,"62":0,"63":0.00541,"64":0,"65":0.00541,"66":0,"67":0,"68":0.02164,"69":0.01082,"70":0.00541,"71":0.00541,"72":0.01082,"73":0.00541,"74":0.01082,"75":0.01082,"76":0.00541,"77":0,"78":0.01623,"79":0.10818,"80":0,"81":0.01082,"83":0.00541,"84":0.00541,"85":0.03786,"86":0.00541,"87":0.03245,"88":0.01082,"89":0,"90":0.00541,"91":0.14604,"92":0.00541,"93":0.01082,"94":0.00541,"95":0.00541,"96":0.01082,"97":0.01082,"98":0.00541,"99":0.01082,"100":0.01082,"101":0.00541,"102":0.00541,"103":0.08114,"104":0.01623,"105":0.02164,"106":0.02164,"107":0.01623,"108":0.03245,"109":1.25489,"110":0.01082,"111":0.04327,"112":0.05409,"113":0.07573,"114":0.27045,"115":0.27045,"116":14.33385,"117":3.79712,"118":0.00541,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.01082,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00541,"70":0,"71":0,"72":0.00541,"73":0,"74":0,"75":0,"76":0,"77":0.01623,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.03245,"96":0,"97":0,"98":0,"99":0.01623,"100":0.22177,"101":0.47599,"102":0.51926,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00541,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00541,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00541,"108":0,"109":0.02164,"110":0.00541,"111":0.00541,"112":0.00541,"113":0.00541,"114":0.02705,"115":0.04327,"116":1.07639,"117":0.89789},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00541,"10":0,"11":0,"12":0,"13":0,"14":0.01082,"15":0.00541,_:"0","3.1":0,"3.2":0,"5.1":0.02164,"6.1":0,"7.1":0,"9.1":0.02705,"10.1":0,"11.1":0,"12.1":0,"13.1":0.02164,"14.1":0.03786,"15.1":0.00541,"15.2-15.3":0.01082,"15.4":0.01082,"15.5":0.01623,"15.6":0.07032,"16.0":0.00541,"16.1":0.03245,"16.2":0.03245,"16.3":0.0595,"16.4":0.03245,"16.5":0.08654,"16.6":0.40027,"17.0":0.03786,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.01373,"6.0-6.1":0.00749,"7.0-7.1":0.00624,"8.1-8.4":0.00499,"9.0-9.2":0.00125,"9.3":0.01373,"10.0-10.2":0,"10.3":0.05118,"11.0-11.2":0.01872,"11.3-11.4":0.00999,"12.0-12.1":0.00749,"12.2-12.5":0.17476,"13.0-13.1":0.0025,"13.2":0,"13.3":0.06366,"13.4-13.7":0.01872,"14.0-14.4":0.03495,"14.5-14.8":0.09487,"15.0-15.1":0.07365,"15.2-15.3":0.02497,"15.4":0.03745,"15.5":0.12607,"15.6-15.7":0.98862,"16.0":0.3233,"16.1":0.5355,"16.2":0.29459,"16.3":0.60291,"16.4":0.07989,"16.5":0.27337,"16.6":7.28359,"17.0":1.15339,"17.1":0},P:{"4":0.17326,"20":0.09173,"21":0.10192,"22":1.25362,"5.0-5.4":0.01019,"6.2-6.4":0,"7.2-7.4":0.10192,"8.2":0,"9.2":0.01019,"10.1":0,"11.1-11.2":0.01019,"12.0":0.01019,"13.0":0.02038,"14.0":0.01019,"15.0":0.01019,"16.0":0.10192,"17.0":0.07134,"18.0":0.01019,"19.0":0.04077},I:{"0":0,"3":0,"4":0.01167,"2.1":0,"2.2":0.00389,"2.3":0.00778,"4.1":0.01167,"4.2-4.3":0.01944,"4.4":0,"4.4.3-4.4.4":0.19833},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01202,"9":0.00601,"10":0,"11":0.03606,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":56.13883},R:{_:"0"},M:{"0":0.13773},Q:{"13.1":0},O:{"0":0.04132},H:{"0":0.13909}};
    +module.exports={C:{"52":0.01003,"57":0.01003,"72":0.00502,"73":0.02007,"75":0.00502,"78":0.01003,"88":0.02007,"89":0.01505,"96":0.00502,"99":0.00502,"100":0.00502,"101":0.00502,"102":0.00502,"104":0.00502,"105":0.00502,"106":0.00502,"107":0.00502,"108":0.00502,"109":0.00502,"110":0.00502,"111":0.00502,"112":0.00502,"113":0.01505,"114":0.01003,"115":0.34617,"116":0.02007,"117":0.0301,"118":0.08027,"119":1.86632,"120":0.57194,"121":0.00502,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 58 59 60 61 62 63 64 65 66 67 68 69 70 71 74 76 77 79 80 81 82 83 84 85 86 87 90 91 92 93 94 95 97 98 103 122 123 3.5 3.6"},D:{"38":0.02509,"47":0.02007,"49":0.00502,"51":0.00502,"53":0.00502,"55":0.00502,"56":0.00502,"60":0.00502,"65":0.00502,"66":0.00502,"70":0.00502,"71":0.00502,"73":0.00502,"74":0.01003,"75":0.00502,"76":0.01003,"78":0.02509,"79":0.16556,"80":0.00502,"81":0.01003,"83":0.00502,"84":0.00502,"85":0.01505,"86":0.00502,"87":0.04515,"88":0.01505,"89":0.00502,"90":0.00502,"91":0.18061,"92":0.00502,"93":0.01505,"94":0.00502,"95":0.00502,"96":0.01003,"97":0.02007,"98":0.00502,"99":0.01003,"100":0.01003,"101":0.00502,"102":0.01003,"103":0.12543,"104":0.02007,"105":0.02007,"106":0.02509,"107":0.03512,"108":0.03512,"109":2.067,"110":0.02509,"111":0.04515,"112":0.07024,"113":0.0602,"114":0.21573,"115":0.08529,"116":0.51675,"117":0.41139,"118":5.9602,"119":27.27241,"120":0.01505,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 48 50 52 54 57 58 59 61 62 63 64 67 68 69 72 77 121 122"},F:{"28":0.01003,"77":0.00502,"91":0.00502,"95":0.05519,"102":0.95323,"103":0.16556,"104":0.98333,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 78 79 80 81 82 83 84 85 86 87 88 89 90 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.00502,"92":0.01003,"103":0.00502,"107":0.00502,"108":0.00502,"109":0.05017,"110":0.01003,"111":0.00502,"112":0.00502,"113":0.01003,"114":0.02007,"115":0.02007,"116":0.02007,"117":0.05519,"118":0.61709,"119":3.50688,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 104 105 106"},E:{"9":0.00502,"14":0.0301,"15":0.00502,_:"0 4 5 6 7 8 10 11 12 13 3.1 3.2 6.1 7.1 9.1 10.1 11.1 12.1","5.1":0.02007,"13.1":0.03512,"14.1":0.06522,"15.1":0.00502,"15.2-15.3":0.02007,"15.4":0.01505,"15.5":0.02509,"15.6":0.11539,"16.0":0.01505,"16.1":0.05017,"16.2":0.04014,"16.3":0.08027,"16.4":0.04515,"16.5":0.09532,"16.6":0.35621,"17.0":0.22075,"17.1":0.26088,"17.2":0.00502},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00142,"5.0-5.1":0.00142,"6.0-6.1":0.00355,"7.0-7.1":0.00497,"8.1-8.4":0.00071,"9.0-9.2":0.00568,"9.3":0.01776,"10.0-10.2":0.00142,"10.3":0.02558,"11.0-11.2":0.01208,"11.3-11.4":0.01066,"12.0-12.1":0.0064,"12.2-12.5":0.11653,"13.0-13.1":0.00284,"13.2":0.01208,"13.3":0.00711,"13.4-13.7":0.02061,"14.0-14.4":0.05471,"14.5-14.8":0.08882,"15.0-15.1":0.03482,"15.2-15.3":0.04263,"15.4":0.04761,"15.5":0.06679,"15.6-15.7":0.35102,"16.0":0.16485,"16.1":0.33042,"16.2":0.15846,"16.3":0.29702,"16.4":0.06111,"16.5":0.15775,"16.6-16.7":2.6739,"17.0":0.80082,"17.1":1.34512,"17.2":0.03837},P:{"4":0.13556,"20":0.06257,"21":0.08342,"22":0.17727,"23":1.3869,"5.0-5.4":0.01043,_:"6.2-6.4 8.2 9.2 10.1 12.0 14.0","7.2-7.4":0.09385,"11.1-11.2":0.01043,"13.0":0.01043,"15.0":0.01043,"16.0":0.03128,"17.0":0.08342,"18.0":0.01043,"19.0":0.03128},I:{"0":0.04958,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00015},K:{"0":0.17441,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.01003,"9":0.01505,"11":0.02509,_:"6 7 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.04983},H:{"0":0},L:{"0":40.75238},R:{_:"0"},M:{"0":0.21925},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/EE.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/EE.js
    index f2eb6ea593b56f..cdfae70b687aaf 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/EE.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/EE.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00702,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00702,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.16843,"49":0,"50":0,"51":0,"52":0.01404,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00702,"69":0.00702,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00702,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0.02807,"88":0,"89":0,"90":0,"91":0,"92":0.03509,"93":0,"94":0,"95":0,"96":0,"97":0.02105,"98":0,"99":0.01404,"100":0,"101":0.00702,"102":0.05614,"103":0.02105,"104":0.00702,"105":0.00702,"106":0,"107":0.00702,"108":0.00702,"109":0.00702,"110":0,"111":0.00702,"112":0.00702,"113":0.00702,"114":0.03509,"115":3.22126,"116":0.16843,"117":1.71941,"118":0.14036,"119":0,"120":0,"3.5":0,"3.6":0.00702},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0.02105,"40":0,"41":0.00702,"42":0.00702,"43":0.00702,"44":0.00702,"45":0.00702,"46":0.00702,"47":0.00702,"48":0,"49":0,"50":0,"51":0.01404,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.00702,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.00702,"71":0,"72":0,"73":0,"74":0,"75":0.02105,"76":0,"77":0,"78":0.01404,"79":0.00702,"80":0.00702,"81":0.00702,"83":0.12632,"84":0,"85":0.00702,"86":0,"87":0.01404,"88":0.01404,"89":0.00702,"90":0.04913,"91":0.00702,"92":0.03509,"93":0.5053,"94":0.00702,"95":0.01404,"96":0.01404,"97":0,"98":0,"99":0.00702,"100":0.00702,"101":0.00702,"102":0.02807,"103":0.04211,"104":0.03509,"105":0.02105,"106":0.13334,"107":0.03509,"108":0.0772,"109":1.13692,"110":0.06316,"111":0.0772,"112":0.11931,"113":0.12632,"114":0.44213,"115":0.82812,"116":22.50673,"117":4.7582,"118":0.01404,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.02105,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.00702,"95":0.0772,"96":0,"97":0,"98":0,"99":0.00702,"100":0.1544,"101":2.12645,"102":1.61414,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00702,"13":0,"14":0.01404,"15":0,"16":0,"17":0,"18":0.01404,"79":0,"80":0,"81":0,"83":0.00702,"84":0,"85":0,"86":0.00702,"87":0,"88":0,"89":0,"90":0.18247,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0.00702,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0.02105,"106":0,"107":0.01404,"108":0.02105,"109":0.03509,"110":0.01404,"111":0.00702,"112":0.00702,"113":0.00702,"114":0.03509,"115":0.09825,"116":2.35805,"117":1.66327},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.01404,"10":0,"11":0,"12":0,"13":0,"14":0.06316,"15":0.00702,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.02807,"13.1":0.05614,"14.1":0.08422,"15.1":0.02105,"15.2-15.3":0.01404,"15.4":0.03509,"15.5":0.13334,"15.6":0.1965,"16.0":0.02105,"16.1":0.08422,"16.2":0.0772,"16.3":0.11229,"16.4":0.07018,"16.5":0.23861,"16.6":0.84216,"17.0":0.05614,"17.1":0},G:{"8":0.002,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00399,"6.0-6.1":0.002,"7.0-7.1":0.01598,"8.1-8.4":0.03195,"9.0-9.2":0.00599,"9.3":0.01398,"10.0-10.2":0.002,"10.3":0.11583,"11.0-11.2":0.0679,"11.3-11.4":0.00599,"12.0-12.1":0.01797,"12.2-12.5":0.17973,"13.0-13.1":0,"13.2":0.00399,"13.3":2.57813,"13.4-13.7":0.02596,"14.0-14.4":0.05991,"14.5-14.8":0.16575,"15.0-15.1":0.04194,"15.2-15.3":0.17973,"15.4":0.08587,"15.5":0.12182,"15.6-15.7":0.93659,"16.0":0.56315,"16.1":1.08836,"16.2":0.46131,"16.3":0.88467,"16.4":0.21967,"16.5":0.60908,"16.6":9.89713,"17.0":1.37593,"17.1":0.00599},P:{"4":0.04149,"20":0.04149,"21":0.16594,"22":1.5246,"5.0-5.4":0,"6.2-6.4":0.01037,"7.2-7.4":0.01037,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0.02074,"14.0":0.01037,"15.0":0.01037,"16.0":0,"17.0":0.01037,"18.0":0.01037,"19.0":0.03111},I:{"0":0,"3":0.00424,"4":0.03251,"2.1":0.0099,"2.2":0.01838,"2.3":0.02262,"4.1":0.02403,"4.2-4.3":0.03958,"4.4":0,"4.4.3-4.4.4":0.11733},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0.00725,"8":0.05802,"9":0.00725,"10":0.00725,"11":0.13053,"5.5":0},S:{"2.5":0.00596,_:"3.0-3.1"},J:{"7":0,"10":0.00895},N:{"10":0.00895,"11":0.00895},L:{"0":26.80841},R:{_:"0"},M:{"0":0.19085},Q:{"13.1":0},O:{"0":0.03578},H:{"0":0.22021}};
    +module.exports={C:{"48":0.29852,"52":0.02184,"69":0.04369,"78":0.00728,"87":0.00728,"88":0.05825,"92":0.03641,"102":0.02184,"103":0.00728,"105":0.00728,"106":0.00728,"108":0.03641,"109":0.00728,"111":0.01456,"113":0.00728,"114":0.00728,"115":5.11854,"116":0.00728,"117":0.02912,"118":0.06553,"119":1.82753,"120":0.54608,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 89 90 91 93 94 95 96 97 98 99 100 101 104 107 110 112 121 122 123 3.5 3.6"},D:{"44":0.00728,"46":0.00728,"47":0.05825,"49":0.00728,"51":0.00728,"60":0.03641,"70":0.00728,"74":0.00728,"78":0.01456,"79":0.01456,"85":0.01456,"87":0.01456,"88":0.00728,"89":0.00728,"90":0.01456,"91":0.01456,"93":0.21843,"94":0.00728,"95":0.00728,"96":0.02184,"97":0.00728,"99":0.00728,"100":0.02912,"102":0.05097,"103":0.03641,"104":0.00728,"105":0.01456,"106":0.10922,"107":0.13106,"108":0.08009,"109":1.78385,"110":0.10922,"111":0.09465,"112":0.13106,"113":0.04369,"114":0.10922,"115":0.13106,"116":0.71354,"117":0.85916,"118":8.98475,"119":34.3736,"120":0.00728,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 45 48 50 52 53 54 55 56 57 58 59 61 62 63 64 65 66 67 68 69 71 72 73 75 76 77 80 81 83 84 86 92 98 101 121 122"},F:{"83":0.00728,"85":0.00728,"95":0.10193,"102":0.65529,"103":1.19408,"104":3.23276,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 84 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"14":0.00728,"16":0.00728,"17":0.00728,"18":0.01456,"86":0.00728,"92":0.00728,"96":0.01456,"107":0.08737,"108":0.04369,"109":0.05825,"110":0.06553,"111":0.01456,"112":0.00728,"114":0.01456,"115":0.00728,"116":0.02184,"117":0.10193,"118":1.02662,"119":5.38066,_:"12 13 15 79 80 81 83 84 85 87 88 89 90 91 93 94 95 97 98 99 100 101 102 103 104 105 106 113"},E:{"9":0.01456,"14":0.02912,"15":0.00728,_:"0 4 5 6 7 8 10 11 12 13 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.02184,"13.1":0.04369,"14.1":0.10193,"15.1":0.01456,"15.2-15.3":0.02184,"15.4":0.05097,"15.5":0.06553,"15.6":0.26212,"16.0":0.03641,"16.1":0.08009,"16.2":0.08737,"16.3":0.13834,"16.4":0.10922,"16.5":0.13106,"16.6":0.64073,"17.0":0.35677,"17.1":0.55336,"17.2":0.00728},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00194,"5.0-5.1":0.00194,"6.0-6.1":0.00484,"7.0-7.1":0.00678,"8.1-8.4":0.00097,"9.0-9.2":0.00775,"9.3":0.02421,"10.0-10.2":0.00194,"10.3":0.03486,"11.0-11.2":0.01646,"11.3-11.4":0.01452,"12.0-12.1":0.00871,"12.2-12.5":0.15879,"13.0-13.1":0.00387,"13.2":0.01646,"13.3":0.00968,"13.4-13.7":0.02808,"14.0-14.4":0.07455,"14.5-14.8":0.12103,"15.0-15.1":0.04744,"15.2-15.3":0.05809,"15.4":0.06487,"15.5":0.09101,"15.6-15.7":0.47831,"16.0":0.22463,"16.1":0.45023,"16.2":0.21592,"16.3":0.40472,"16.4":0.08327,"16.5":0.21495,"16.6-16.7":3.64347,"17.0":1.0912,"17.1":1.83287,"17.2":0.05228},P:{"4":0.0829,"20":0.03109,"21":0.05181,"22":0.20725,"23":1.57513,_:"5.0-5.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 15.0","6.2-6.4":0.01036,"14.0":0.01036,"16.0":0.01036,"17.0":0.01036,"18.0":0.01036,"19.0":0.03109},I:{"0":0.07575,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00005,"4.4":0,"4.4.3-4.4.4":0.00023},K:{"0":0.27734,_:"10 11 12 11.1 11.5 12.1"},A:{"7":0.00832,"8":0.03328,"9":0.00832,"10":0.00832,"11":0.1165,_:"6 5.5"},N:{_:"10 11"},S:{"2.5":0.00272,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.02719},H:{"0":0},L:{"0":14.97849},R:{_:"0"},M:{"0":0.2148},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/EG.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/EG.js
    index 556b473e0afdce..b6f629fbd8098b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/EG.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/EG.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.01432,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.00286,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00286,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00286,"89":0,"90":0,"91":0.00286,"92":0,"93":0,"94":0,"95":0.00286,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00573,"103":0,"104":0,"105":0.00286,"106":0.00286,"107":0,"108":0.00286,"109":0.00286,"110":0.00573,"111":0.00286,"112":0.00286,"113":0.00286,"114":0.00286,"115":0.20041,"116":0.0229,"117":0.31779,"118":0.03436,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00286,"39":0.00286,"40":0.00286,"41":0,"42":0,"43":0.02863,"44":0,"45":0,"46":0.00286,"47":0.00286,"48":0.00286,"49":0.00859,"50":0,"51":0,"52":0,"53":0.00286,"54":0,"55":0,"56":0.00286,"57":0,"58":0.00859,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00286,"69":0.00286,"70":0.00286,"71":0.00286,"72":0.00573,"73":0,"74":0.00286,"75":0.00573,"76":0.00286,"77":0.00573,"78":0.00286,"79":0.06012,"80":0.00859,"81":0.01432,"83":0.00286,"84":0.00286,"85":0.01145,"86":0.0229,"87":0.01718,"88":0.00573,"89":0.00286,"90":0.0229,"91":0.01145,"92":0.00573,"93":0.00286,"94":0.00573,"95":0.00573,"96":0.00573,"97":0.00286,"98":0.01432,"99":0.01145,"100":0.00573,"101":0.00286,"102":0.01432,"103":0.01432,"104":0.00859,"105":0.00859,"106":0.00859,"107":0.03149,"108":0.02577,"109":1.16238,"110":0.01145,"111":0.01145,"112":0.01718,"113":0.01718,"114":0.06585,"115":0.06871,"116":3.1722,"117":1.00491,"118":0.00286,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0.00286,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0.00573,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00573,"73":0.00573,"74":0.00286,"75":0,"76":0,"77":0.01718,"78":0.00286,"79":0.00859,"80":0,"81":0,"82":0.00859,"83":0.00286,"84":0.00286,"85":0,"86":0,"87":0,"88":0.00286,"89":0,"90":0.00286,"91":0,"92":0.00286,"93":0.00286,"94":0.00573,"95":0.00573,"96":0.00286,"97":0,"98":0.00573,"99":0.00859,"100":0.01145,"101":0.00859,"102":0.00573,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00573,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.00286,"91":0,"92":0.00573,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00286,"108":0.00286,"109":0.0229,"110":0.00286,"111":0,"112":0.00286,"113":0.00286,"114":0.01145,"115":0.01718,"116":0.36933,"117":0.32066},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00286,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.04867,"6.1":0,"7.1":0,"9.1":0.00286,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00573,"14.1":0.00573,"15.1":0,"15.2-15.3":0,"15.4":0.00286,"15.5":0.00286,"15.6":0.01432,"16.0":0.00286,"16.1":0.00573,"16.2":0.00286,"16.3":0.01145,"16.4":0.00573,"16.5":0.01145,"16.6":0.05153,"17.0":0.00859,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.02047,"8.1-8.4":0,"9.0-9.2":0.00361,"9.3":0.02047,"10.0-10.2":0,"10.3":0.02168,"11.0-11.2":0.00963,"11.3-11.4":0.00482,"12.0-12.1":0.00843,"12.2-12.5":0.29986,"13.0-13.1":0.00361,"13.2":0.00241,"13.3":0.63224,"13.4-13.7":0.03492,"14.0-14.4":0.11561,"14.5-14.8":0.20352,"15.0-15.1":0.0578,"15.2-15.3":0.06744,"15.4":0.06985,"15.5":0.12043,"15.6-15.7":1.27772,"16.0":0.43955,"16.1":0.50579,"16.2":0.23483,"16.3":0.55035,"16.4":0.15655,"16.5":0.47568,"16.6":5.5697,"17.0":0.96943,"17.1":0.0012},P:{"4":0.18635,"20":0.06212,"21":0.15529,"22":1.83246,"5.0-5.4":0,"6.2-6.4":0.01035,"7.2-7.4":0.06212,"8.2":0,"9.2":0.01035,"10.1":0,"11.1-11.2":0.02071,"12.0":0.01035,"13.0":0.03106,"14.0":0.02071,"15.0":0.01035,"16.0":0.05176,"17.0":0.05176,"18.0":0.04141,"19.0":0.06212},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00399,"4.2-4.3":0.01596,"4.4":0,"4.4.3-4.4.4":0.17162},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00301,"9":0.00301,"10":0.00301,"11":0.0511,"5.5":0},S:{"2.5":0.00714,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":74.73868},R:{_:"0"},M:{"0":0.21411},Q:{"13.1":0},O:{"0":0.64233},H:{"0":0.49325}};
    +module.exports={C:{"40":0.0032,"43":0.0032,"45":0.0032,"47":0.0032,"48":0.0032,"50":0.0032,"51":0.0032,"52":0.09594,"55":0.0032,"56":0.0032,"57":0.0032,"58":0.0032,"60":0.0032,"63":0.0032,"67":0.0032,"68":0.0032,"72":0.0064,"75":0.0032,"78":0.0032,"88":0.0032,"95":0.01599,"99":0.0064,"100":0.0032,"102":0.0032,"104":0.0032,"105":0.01599,"106":0.0064,"107":0.0064,"108":0.0064,"109":0.0064,"110":0.0032,"111":0.0032,"112":0.0032,"113":0.00959,"114":0.0064,"115":0.78031,"116":0.0064,"117":0.0064,"118":0.03838,"119":1.06174,"120":0.33579,"121":0.0032,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 41 42 44 46 49 53 54 59 61 62 64 65 66 69 70 71 73 74 76 77 79 80 81 82 83 84 85 86 87 89 90 91 92 93 94 96 97 98 101 103 122 123 3.5 3.6"},D:{"26":0.0032,"33":0.0064,"34":0.0032,"38":0.0032,"40":0.0064,"41":0.0032,"43":0.07675,"45":0.0032,"47":0.0064,"48":0.0064,"49":0.02878,"51":0.0032,"53":0.0032,"55":0.0032,"56":0.0032,"58":0.09594,"62":0.0032,"63":0.0064,"65":0.0032,"66":0.0032,"67":0.0032,"68":0.0032,"69":0.0064,"70":0.0064,"71":0.0064,"72":0.0064,"73":0.0064,"74":0.00959,"75":0.0064,"76":0.01279,"77":0.0064,"78":0.0064,"79":0.14391,"80":0.01919,"81":0.03838,"83":0.00959,"84":0.00959,"85":0.02239,"86":0.06396,"87":0.02878,"88":0.00959,"89":0.0064,"90":0.0064,"91":0.01919,"92":0.0064,"93":0.0064,"94":0.0064,"95":0.00959,"96":0.01279,"97":0.0064,"98":0.05117,"99":0.02239,"100":0.00959,"101":0.01279,"102":0.05117,"103":0.04477,"104":0.01599,"105":0.03198,"106":0.05756,"107":0.06076,"108":0.11513,"109":4.36847,"110":0.03518,"111":0.04477,"112":0.06396,"113":0.01919,"114":0.05437,"115":0.04797,"116":0.1535,"117":0.24944,"118":3.09566,"119":14.76836,"120":0.01279,"121":0.01279,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 27 28 29 30 31 32 35 36 37 39 42 44 46 50 52 54 57 59 60 61 64 122"},F:{"28":0.0032,"46":0.0032,"56":0.0032,"62":0.0032,"63":0.0032,"64":0.00959,"68":0.0064,"70":0.0032,"71":0.0032,"72":0.01279,"73":0.01919,"74":0.0032,"79":0.02239,"80":0.0032,"81":0.0032,"82":0.01919,"83":0.01599,"84":0.01279,"85":0.0032,"87":0.0032,"88":0.0032,"89":0.0064,"90":0.00959,"91":0.0064,"92":0.00959,"93":0.00959,"94":0.01599,"95":0.01919,"96":0.0064,"97":0.0064,"98":0.00959,"99":0.02239,"100":0.02239,"101":0.02558,"102":0.08315,"103":0.01279,"104":0.01919,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 57 58 60 65 66 67 69 75 76 77 78 86 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.0032,"13":0.0032,"14":0.0032,"16":0.0032,"17":0.0032,"18":0.01279,"84":0.0032,"85":0.0032,"89":0.0032,"90":0.0032,"92":0.03198,"100":0.0032,"103":0.0032,"105":0.0064,"106":0.00959,"107":0.00959,"108":0.00959,"109":0.09594,"110":0.00959,"111":0.0064,"112":0.0032,"113":0.0064,"114":0.0064,"115":0.01279,"116":0.01919,"117":0.04797,"118":0.42853,"119":2.28977,_:"15 79 80 81 83 86 87 88 91 93 94 95 96 97 98 99 101 102 104"},E:{"9":0.0032,"14":0.01279,"15":0.0032,_:"0 4 5 6 7 8 10 11 12 13 3.1 3.2 6.1 7.1 9.1 10.1 11.1","5.1":0.30381,"12.1":0.0032,"13.1":0.00959,"14.1":0.02239,"15.1":0.0032,"15.2-15.3":0.0064,"15.4":0.0064,"15.5":0.00959,"15.6":0.07355,"16.0":0.02239,"16.1":0.01599,"16.2":0.01279,"16.3":0.03198,"16.4":0.01599,"16.5":0.02878,"16.6":0.11833,"17.0":0.07036,"17.1":0.08635,"17.2":0.0032},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00157,"5.0-5.1":0.00157,"6.0-6.1":0.00393,"7.0-7.1":0.0055,"8.1-8.4":0.00079,"9.0-9.2":0.00629,"9.3":0.01964,"10.0-10.2":0.00157,"10.3":0.02828,"11.0-11.2":0.01336,"11.3-11.4":0.01178,"12.0-12.1":0.00707,"12.2-12.5":0.12884,"13.0-13.1":0.00314,"13.2":0.01336,"13.3":0.00786,"13.4-13.7":0.02278,"14.0-14.4":0.06049,"14.5-14.8":0.0982,"15.0-15.1":0.0385,"15.2-15.3":0.04714,"15.4":0.05264,"15.5":0.07385,"15.6-15.7":0.3881,"16.0":0.18227,"16.1":0.36532,"16.2":0.1752,"16.3":0.32839,"16.4":0.06756,"16.5":0.17441,"16.6-16.7":2.95633,"17.0":0.88541,"17.1":1.4872,"17.2":0.04242},P:{"4":0.17607,"20":0.04143,"21":0.08286,"22":0.23821,"23":1.6364,_:"5.0-5.4 8.2 10.1","6.2-6.4":0.01036,"7.2-7.4":0.05178,"9.2":0.02071,"11.1-11.2":0.02071,"12.0":0.01036,"13.0":0.03107,"14.0":0.02071,"15.0":0.01036,"16.0":0.03107,"17.0":0.05178,"18.0":0.03107,"19.0":0.05178},I:{"0":0.08798,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00027},K:{"0":0.49655,_:"10 11 12 11.1 11.5 12.1"},A:{"7":0.00336,"8":0.0168,"9":0.00672,"10":0.00672,"11":0.23183,_:"6 5.5"},N:{_:"10 11"},S:{"2.5":0.0068,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.61218},H:{"0":0},L:{"0":56.44579},R:{_:"0"},M:{"0":0.23807},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ER.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ER.js
    index c9042755c11491..1714d09855e82d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ER.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ER.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00349,"38":0.00698,"39":0,"40":0,"41":0,"42":0,"43":0.00349,"44":0.01048,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00349,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0.00349,"60":0,"61":0,"62":0.00349,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00349,"100":0,"101":0,"102":0,"103":0.00698,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0.00349,"112":0,"113":0,"114":0.03143,"115":0.14666,"116":0.12222,"117":0.47491,"118":0.02794,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00349,"29":0,"30":0,"31":0,"32":0,"33":0.00349,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00349,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00349,"50":0,"51":0,"52":0,"53":0.01397,"54":0.00698,"55":0.01397,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00349,"70":0,"71":0,"72":0.00349,"73":0,"74":0.02794,"75":0.17809,"76":0,"77":0.17111,"78":0.00698,"79":0.02095,"80":0.00349,"81":0.00349,"83":0.00349,"84":0.00349,"85":0,"86":0.03143,"87":0.0419,"88":0,"89":0.00349,"90":0.02444,"91":0.01048,"92":0.25492,"93":0.01397,"94":0,"95":0.00698,"96":0.00698,"97":0.00349,"98":0.0419,"99":0,"100":0.02444,"101":0.00698,"102":0.00349,"103":0.00349,"104":0,"105":0,"106":0.11174,"107":0,"108":0.00349,"109":3.34184,"110":0,"111":0.01397,"112":0.02794,"113":0.00349,"114":0.0454,"115":0.0454,"116":3.63168,"117":0.83808,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.01746,"30":0,"31":0,"32":0,"33":0,"34":0.00349,"35":0,"36":0.00349,"37":0,"38":0.00349,"39":0,"40":0.00349,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00349,"58":0,"60":0,"62":0,"63":0.03841,"64":0,"65":0,"66":0,"67":0,"68":0.38761,"69":0.01397,"70":0.00349,"71":0.48888,"72":0.0419,"73":0.02444,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.00349,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00349,"86":0.00349,"87":0,"88":0.00349,"89":0,"90":0.00698,"91":0,"92":0,"93":0.00349,"94":0,"95":0.00349,"96":0,"97":0,"98":0,"99":0,"100":0.01048,"101":0.09428,"102":0.25841,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00698},B:{"12":0,"13":0,"14":0,"15":0.00349,"16":0,"17":0,"18":0.01048,"79":0,"80":0,"81":0,"83":0,"84":0.00349,"85":0,"86":0,"87":0,"88":0,"89":0.02095,"90":0.02444,"91":0,"92":0.01397,"93":0,"94":0,"95":0,"96":0.02095,"97":0,"98":0,"99":0,"100":0.11524,"101":0,"102":0,"103":0.00349,"104":0,"105":0,"106":0,"107":0,"108":0.00349,"109":0.02095,"110":0,"111":0.01746,"112":0.00349,"113":0.0419,"114":0.01746,"115":0.00349,"116":0.3038,"117":0.25492},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.02095,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0,"16.0":0,"16.1":0,"16.2":0,"16.3":0,"16.4":0,"16.5":0,"16.6":0,"17.0":0.00349,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.01273,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0,"11.0-11.2":0,"11.3-11.4":0.06363,"12.0-12.1":0,"12.2-12.5":0.31814,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0,"14.0-14.4":0.13362,"14.5-14.8":0,"15.0-15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6-15.7":0.0509,"16.0":0,"16.1":0.02545,"16.2":0.12089,"16.3":0.01909,"16.4":0.0509,"16.5":0.01273,"16.6":0.45811,"17.0":0.00636,"17.1":0},P:{"4":0.44132,"20":0.02006,"21":0.14042,"22":0.56168,"5.0-5.4":0.14042,"6.2-6.4":0.06018,"7.2-7.4":0.06018,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01003,"12.0":0,"13.0":0.05015,"14.0":0,"15.0":0,"16.0":0.2006,"17.0":0,"18.0":0.01003,"19.0":0.01003},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00008,"4.2-4.3":0.01711,"4.4":0,"4.4.3-4.4.4":0.06567},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.07682,"5.5":0},S:{"2.5":0.05206,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":70.65652},R:{_:"0"},M:{"0":0.01302},Q:{"13.1":0},O:{"0":3.28003},H:{"0":5.77935}};
    +module.exports={C:{"32":0.00337,"43":0.02692,"44":0.02692,"57":0.00337,"61":0.0101,"84":0.00337,"89":0.01683,"91":0.00337,"104":0.05384,"109":0.00337,"111":0.00337,"112":0.00673,"113":0.00337,"114":0.0101,"115":0.18171,"116":0.02356,"117":0.0101,"118":0.07067,"119":1.41667,"120":0.59561,"121":0.00337,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 33 34 35 36 37 38 39 40 41 42 45 46 47 48 49 50 51 52 53 54 55 56 58 59 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 85 86 87 88 90 92 93 94 95 96 97 98 99 100 101 102 103 105 106 107 108 110 122 123 3.5 3.6"},D:{"11":0.0101,"33":0.00337,"39":0.00337,"43":0.02019,"52":0.00337,"53":0.02356,"57":0.0101,"61":0.00337,"63":0.00337,"64":0.00337,"68":0.01683,"70":0.00673,"73":0.00337,"74":0.0673,"78":0.01346,"79":0.06394,"80":0.01683,"83":0.01346,"84":0.00337,"85":0.02356,"86":0.03029,"87":0.0101,"88":0.00673,"90":0.01346,"91":0.00337,"92":0.05721,"93":0.01683,"94":0.02692,"95":0.00673,"97":0.00337,"98":0.10432,"99":0.00673,"101":0.01346,"102":0.01346,"103":0.02356,"105":0.02356,"106":0.10768,"107":0.01683,"108":0.22209,"109":4.51247,"110":0.0101,"111":0.01683,"112":0.04711,"113":0.0101,"114":0.04711,"115":0.01683,"116":0.03702,"117":0.09759,"118":2.11995,"119":10.65023,"120":0.44082,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 37 38 40 41 42 44 45 46 47 48 49 50 51 54 55 56 58 59 60 62 65 66 67 69 71 72 75 76 77 81 89 96 100 104 121 122"},F:{"32":0.00673,"34":0.00337,"45":0.00337,"57":0.02692,"63":0.01346,"64":0.03365,"67":0.00337,"69":0.00673,"72":0.00337,"73":0.04711,"77":0.00673,"78":0.00337,"79":0.0101,"80":0.0101,"81":0.00337,"82":0.02356,"84":0.00337,"88":0.0101,"95":0.07403,"99":0.18171,"100":0.0673,"102":0.09422,"103":0.25911,"104":1.60511,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 33 35 36 37 38 39 40 41 42 43 44 46 47 48 49 50 51 52 53 54 55 56 58 60 62 65 66 68 70 71 74 75 76 83 85 86 87 89 90 91 92 93 94 96 97 98 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"13":0.00337,"14":0.00337,"15":0.03029,"16":0.02692,"17":0.04038,"18":0.02019,"84":0.01683,"89":0.03365,"90":0.0101,"92":0.00673,"98":0.00337,"100":0.02019,"102":0.01683,"103":0.0101,"104":0.00337,"108":0.00337,"109":0.04711,"110":0.01683,"111":0.00673,"113":0.04711,"114":0.0673,"115":0.06057,"116":0.02019,"117":0.43072,"118":0.56869,"119":4.6538,_:"12 79 80 81 83 85 86 87 88 91 93 94 95 96 97 99 101 105 106 107 112"},E:{_:"0 4 5 6 7 8 9 10 11 12 13 14 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 13.1 14.1 15.1 15.2-15.3 15.4 15.5 15.6 16.0 16.1 16.2 16.3 16.4 16.5 17.0 17.2","16.6":0.01346,"17.1":0.00337},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00013,"5.0-5.1":0.00013,"6.0-6.1":0.00032,"7.0-7.1":0.00045,"8.1-8.4":0.00006,"9.0-9.2":0.00051,"9.3":0.00159,"10.0-10.2":0.00013,"10.3":0.00229,"11.0-11.2":0.00108,"11.3-11.4":0.00096,"12.0-12.1":0.00057,"12.2-12.5":0.01045,"13.0-13.1":0.00025,"13.2":0.00108,"13.3":0.00064,"13.4-13.7":0.00185,"14.0-14.4":0.0049,"14.5-14.8":0.00796,"15.0-15.1":0.00312,"15.2-15.3":0.00382,"15.4":0.00427,"15.5":0.00599,"15.6-15.7":0.03147,"16.0":0.01478,"16.1":0.02962,"16.2":0.0142,"16.3":0.02662,"16.4":0.00548,"16.5":0.01414,"16.6-16.7":0.23969,"17.0":0.07179,"17.1":0.12058,"17.2":0.00344},P:{"4":0.06442,"20":0.03221,"21":0.03221,"22":0.12884,"23":0.08589,"5.0-5.4":0.01074,"6.2-6.4":0.03221,"7.2-7.4":0.02147,_:"8.2 10.1 12.0 13.0 14.0 15.0 18.0","9.2":0.05368,"11.1-11.2":0.05368,"16.0":0.01074,"17.0":0.04295,"19.0":0.02147},I:{"0":0.12543,"3":0.00001,"4":0.00003,"2.1":0,"2.2":0.00003,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00009,"4.4":0,"4.4.3-4.4.4":0.00038},K:{"0":2.98023,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.01683,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":1.63221},H:{"0":2.56},L:{"0":59.77239},R:{_:"0"},M:{"0":0.02654},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ES.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ES.js
    index d19a842a304313..ec0aaaa4911955 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ES.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ES.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00381,"49":0,"50":0,"51":0,"52":0.01143,"53":0,"54":0,"55":0,"56":0.00381,"57":0,"58":0,"59":0.00381,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00381,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.01143,"79":0,"80":0,"81":0.00381,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00381,"89":0.00381,"90":0,"91":0.00381,"92":0,"93":0,"94":0,"95":0.00381,"96":0,"97":0,"98":0,"99":0,"100":0.00381,"101":0,"102":0.02286,"103":0.00381,"104":0.00381,"105":0.00381,"106":0,"107":0.00381,"108":0.00381,"109":0.01524,"110":0.00381,"111":0.00381,"112":0.00381,"113":0.01143,"114":0.00762,"115":0.11049,"116":0.04572,"117":0.71247,"118":0.06858,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.01905,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.00381,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.01524,"67":0.00381,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0.00381,"74":0,"75":0.00381,"76":0.00381,"77":0.00381,"78":0.00381,"79":0.02667,"80":0.00381,"81":0.00381,"83":0.00381,"84":0.00762,"85":0.00381,"86":0.00381,"87":0.01524,"88":0.00762,"89":0.00381,"90":0.00762,"91":0.00762,"92":0.00381,"93":0.01143,"94":0.00381,"95":0.00381,"96":0.00381,"97":0.00381,"98":0.00381,"99":0.01524,"100":0.00381,"101":0.00381,"102":0.00762,"103":0.0381,"104":0.00381,"105":0.01524,"106":0.01524,"107":0.02667,"108":0.01905,"109":0.52578,"110":0.01524,"111":0.01905,"112":0.0381,"113":0.03429,"114":0.13716,"115":0.16764,"116":6.08457,"117":2.12217,"118":0.00381,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00381,"73":0.00381,"74":0,"75":0,"76":0,"77":0.01524,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01143,"96":0,"97":0,"98":0,"99":0.00381,"100":0.08001,"101":0.16383,"102":0.38862,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00381,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0.00381,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00381,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00381,"108":0.00381,"109":0.02286,"110":0.00381,"111":0.00381,"112":0.00381,"113":0.00381,"114":0.01905,"115":0.03048,"116":0.64008,"117":0.63627},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00381,"14":0.02286,"15":0.00381,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00381,"10.1":0,"11.1":0.00381,"12.1":0.00762,"13.1":0.03429,"14.1":0.05334,"15.1":0.00762,"15.2-15.3":0.00762,"15.4":0.01524,"15.5":0.02286,"15.6":0.1143,"16.0":0.01143,"16.1":0.03048,"16.2":0.03048,"16.3":0.0762,"16.4":0.03048,"16.5":0.08763,"16.6":0.46482,"17.0":0.03429,"17.1":0},G:{"8":0.00374,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0.00187,"9.3":0.04866,"10.0-10.2":0,"10.3":0.05989,"11.0-11.2":0.00936,"11.3-11.4":0.03556,"12.0-12.1":0.00749,"12.2-12.5":0.26202,"13.0-13.1":0.00561,"13.2":0.00374,"13.3":0.05989,"13.4-13.7":0.03556,"14.0-14.4":0.11604,"14.5-14.8":0.23021,"15.0-15.1":0.07299,"15.2-15.3":0.08984,"15.4":0.09732,"15.5":0.17593,"15.6-15.7":1.09488,"16.0":0.56896,"16.1":1.15103,"16.2":0.49784,"16.3":0.99194,"16.4":0.21149,"16.5":0.69249,"16.6":10.75977,"17.0":1.18846,"17.1":0.00187},P:{"4":0.07273,"20":0.07273,"21":0.15584,"22":2.43116,"5.0-5.4":0.01039,"6.2-6.4":0,"7.2-7.4":0.01039,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01039,"12.0":0.01039,"13.0":0.02078,"14.0":0.02078,"15.0":0.01039,"16.0":0.02078,"17.0":0.02078,"18.0":0.02078,"19.0":0.05195},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.01201,"4.2-4.3":0.01801,"4.4":0,"4.4.3-4.4.4":0.10808},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00381,"9":0,"10":0,"11":0.03429,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":62.42631},R:{_:"0"},M:{"0":0.32807},Q:{"13.1":0},O:{"0":0.03095},H:{"0":0.23441}};
    +module.exports={C:{"48":0.02217,"52":0.03326,"56":0.00739,"59":0.00739,"67":0.0037,"68":0.0037,"78":0.02956,"79":0.0037,"81":0.00739,"85":0.0037,"86":0.0037,"88":0.01478,"89":0.0037,"91":0.0037,"95":0.00739,"99":0.0037,"100":0.00739,"101":0.0037,"102":0.01848,"104":0.0037,"105":0.0037,"106":0.0037,"107":0.0037,"108":0.00739,"109":0.05543,"110":0.00739,"111":0.00739,"112":0.0037,"113":0.01478,"114":0.01109,"115":0.30299,"116":0.01109,"117":0.01478,"118":0.06282,"119":1.50756,"120":0.45449,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 49 50 51 53 54 55 57 58 60 61 62 63 64 65 66 69 70 71 72 73 74 75 76 77 80 82 83 84 87 90 92 93 94 96 97 98 103 121 122 123 3.5 3.6"},D:{"38":0.0037,"46":0.01109,"49":0.04065,"60":0.0037,"65":0.0037,"66":0.02587,"67":0.0037,"68":0.0037,"69":0.0037,"70":0.0037,"71":0.0037,"72":0.0037,"73":0.0037,"74":0.0037,"75":0.01478,"76":0.0037,"77":0.0037,"78":0.0037,"79":0.05543,"80":0.00739,"81":0.00739,"83":0.00739,"84":0.01848,"85":0.01109,"86":0.00739,"87":0.03695,"88":0.00739,"89":0.00739,"90":0.01109,"91":0.01848,"92":0.0037,"93":0.03326,"94":0.00739,"95":0.01109,"96":0.00739,"97":0.01109,"98":0.00739,"99":0.02217,"100":0.01478,"101":0.01109,"102":0.01478,"103":0.10346,"104":0.00739,"105":0.02956,"106":0.02587,"107":0.09238,"108":0.04804,"109":1.30064,"110":0.03326,"111":0.04065,"112":0.05543,"113":0.02956,"114":0.09238,"115":0.04434,"116":0.29191,"117":0.3695,"118":4.61136,"119":17.35542,"120":0.01478,"121":0.0037,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 47 48 50 51 52 53 54 55 56 57 58 59 61 62 63 64 122"},F:{"46":0.0037,"85":0.0037,"95":0.02587,"102":0.72422,"103":0.14041,"104":0.71314,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"17":0.0037,"18":0.0037,"84":0.01478,"90":0.0037,"92":0.00739,"106":0.0037,"107":0.01109,"108":0.00739,"109":0.05912,"110":0.01109,"111":0.0037,"112":0.00739,"113":0.00739,"114":0.01478,"115":0.01109,"116":0.02217,"117":0.06282,"118":0.521,"119":2.72691,_:"12 13 14 15 16 79 80 81 83 85 86 87 88 89 91 93 94 95 96 97 98 99 100 101 102 103 104 105"},E:{"13":0.00739,"14":0.05173,"15":0.00739,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1","11.1":0.00739,"12.1":0.01478,"13.1":0.08868,"14.1":0.11824,"15.1":0.03326,"15.2-15.3":0.01848,"15.4":0.03326,"15.5":0.04804,"15.6":0.26974,"16.0":0.03326,"16.1":0.29191,"16.2":0.06651,"16.3":0.16258,"16.4":0.06282,"16.5":0.12194,"16.6":0.72053,"17.0":0.29191,"17.1":0.43971,"17.2":0.00739},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.0025,"5.0-5.1":0.0025,"6.0-6.1":0.00625,"7.0-7.1":0.00876,"8.1-8.4":0.00125,"9.0-9.2":0.01001,"9.3":0.03127,"10.0-10.2":0.0025,"10.3":0.04503,"11.0-11.2":0.02127,"11.3-11.4":0.01876,"12.0-12.1":0.01126,"12.2-12.5":0.20515,"13.0-13.1":0.005,"13.2":0.02127,"13.3":0.01251,"13.4-13.7":0.03628,"14.0-14.4":0.09632,"14.5-14.8":0.15636,"15.0-15.1":0.06129,"15.2-15.3":0.07505,"15.4":0.08381,"15.5":0.11759,"15.6-15.7":0.61795,"16.0":0.29021,"16.1":0.58167,"16.2":0.27895,"16.3":0.52288,"16.4":0.10758,"16.5":0.2777,"16.6-16.7":4.70718,"17.0":1.40978,"17.1":2.36798,"17.2":0.06755},P:{"4":0.07234,"20":0.06201,"21":0.10334,"22":0.27903,"23":2.4079,"5.0-5.4":0.01033,_:"6.2-6.4 7.2-7.4 8.2 9.2 10.1 12.0","11.1-11.2":0.02067,"13.0":0.02067,"14.0":0.01033,"15.0":0.01033,"16.0":0.031,"17.0":0.02067,"18.0":0.02067,"19.0":0.05167},I:{"0":0.04391,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00013},K:{"0":0.28373,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00386,"11":0.08482,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.01892},H:{"0":0},L:{"0":47.31967},R:{_:"0"},M:{"0":0.33417},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ET.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ET.js
    index be0ad74a4f2fed..0ec87c9d95cd31 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ET.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ET.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00631,"48":0,"49":0,"50":0,"51":0,"52":0.00316,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00316,"73":0,"74":0,"75":0,"76":0,"77":0.06628,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0.01262,"85":0,"86":0,"87":0,"88":0.00316,"89":0.00316,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00631,"96":0,"97":0.00316,"98":0,"99":0,"100":0,"101":0,"102":0.01262,"103":0.00316,"104":0,"105":0,"106":0,"107":0.00316,"108":0.00947,"109":0,"110":0,"111":0.00316,"112":0.00316,"113":0.00316,"114":0.00316,"115":0.20198,"116":0.07574,"117":0.53336,"118":0.1073,"119":0.00316,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00316,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00316,"34":0.00316,"35":0,"36":0,"37":0,"38":0.00631,"39":0,"40":0.00947,"41":0,"42":0,"43":0.00631,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0.00316,"51":0,"52":0,"53":0.00316,"54":0,"55":0.00316,"56":0.00316,"57":0,"58":0.00631,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00316,"65":0.00316,"66":0,"67":0,"68":0.00316,"69":0.00316,"70":0.00947,"71":0.00316,"72":0.00316,"73":0.00316,"74":0.00316,"75":0.00316,"76":0.00947,"77":0.00316,"78":0.00316,"79":0.14833,"80":0.00947,"81":0.02209,"83":0.00631,"84":0.00631,"85":0.00316,"86":0.01578,"87":0.01262,"88":0.01578,"89":0,"90":0.00316,"91":0.00631,"92":0.00316,"93":0.02209,"94":0.00316,"95":0.00947,"96":0.00631,"97":0,"98":0.06312,"99":0.00316,"100":0,"101":0,"102":0.01578,"103":0.04734,"104":0.00631,"105":0.00631,"106":0.01894,"107":0.0284,"108":0.01578,"109":0.93102,"110":0.00631,"111":0.00947,"112":0.03787,"113":0.01578,"114":0.05681,"115":0.07574,"116":3.00451,"117":0.8395,"118":0.00631,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0.00316,"25":0,"26":0,"27":0,"28":0.00947,"29":0,"30":0.00316,"31":0,"32":0.00316,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0.00631,"43":0,"44":0,"45":0,"46":0.02209,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00316,"54":0.00316,"55":0,"56":0,"57":0,"58":0,"60":0.01578,"62":0,"63":0.00631,"64":0.00316,"65":0,"66":0.00316,"67":0.00631,"68":0.00947,"69":0.02209,"70":0.01262,"71":0.04418,"72":0.17989,"73":0.04734,"74":0,"75":0,"76":0,"77":0.01262,"78":0.00316,"79":0.00947,"80":0,"81":0,"82":0,"83":0.00316,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.03472,"96":0,"97":0,"98":0,"99":0.00631,"100":0.00947,"101":0.16727,"102":0.1862,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00631},B:{"12":0.00631,"13":0,"14":0.00316,"15":0,"16":0.00316,"17":0,"18":0.04734,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.00316,"91":0,"92":0.00947,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.04103,"110":0.00316,"111":0.00316,"112":0.00631,"113":0.00631,"114":0.02209,"115":0.01894,"116":0.46393,"117":0.37872},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.01262,"14":0.00631,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0.00316,"15.1":0,"15.2-15.3":0,"15.4":0.00316,"15.5":0,"15.6":0.01262,"16.0":0,"16.1":0.00316,"16.2":0,"16.3":0,"16.4":0.00316,"16.5":0.01578,"16.6":0.01894,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00344,"6.0-6.1":0.00516,"7.0-7.1":0.20924,"8.1-8.4":0.0179,"9.0-9.2":0.0031,"9.3":0.14729,"10.0-10.2":0.00206,"10.3":0.06986,"11.0-11.2":0.00551,"11.3-11.4":0.02375,"12.0-12.1":0.02478,"12.2-12.5":0.44566,"13.0-13.1":0.00826,"13.2":0.00241,"13.3":0.01962,"13.4-13.7":0.06883,"14.0-14.4":0.18996,"14.5-14.8":0.13181,"15.0-15.1":0.0468,"15.2-15.3":0.08707,"15.4":0.06917,"15.5":0.0678,"15.6-15.7":0.53204,"16.0":0.06986,"16.1":0.11632,"16.2":0.0413,"16.3":0.12595,"16.4":0.04715,"16.5":0.1848,"16.6":0.54821,"17.0":0.1084,"17.1":0.00069},P:{"4":0.46278,"20":0.09256,"21":0.11313,"22":0.59648,"5.0-5.4":0.01028,"6.2-6.4":0.03085,"7.2-7.4":0.26739,"8.2":0.01028,"9.2":0.02057,"10.1":0,"11.1-11.2":0.01028,"12.0":0.01028,"13.0":0.03085,"14.0":0.01028,"15.0":0.01028,"16.0":0.05142,"17.0":0.10284,"18.0":0.03085,"19.0":0.08227},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00258,"4.2-4.3":0.06241,"4.4":0,"4.4.3-4.4.4":0.35334},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00631,"5.5":0},S:{"2.5":0.08897,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":79.38028},R:{_:"0"},M:{"0":0.08897},Q:{"13.1":0.00684},O:{"0":0.5133},H:{"0":2.88336}};
    +module.exports={C:{"38":0.00299,"42":0.00299,"43":0.00299,"44":0.00299,"47":0.01197,"48":0.00299,"52":0.01197,"58":0.00299,"60":0.00299,"66":0.00299,"67":0.00299,"68":0.00299,"72":0.00599,"75":0.00299,"77":0.17659,"81":0.00599,"82":0.00299,"84":0.02394,"88":0.01197,"89":0.03592,"90":0.00898,"95":0.03592,"97":0.00599,"98":0.00299,"99":0.00299,"101":0.00299,"102":0.00599,"103":0.03292,"104":0.00299,"105":0.00599,"108":0.01497,"109":0.00299,"110":0.02095,"111":0.02394,"112":0.00599,"113":0.00299,"114":0.00299,"115":0.87396,"116":0.01197,"117":0.01197,"118":0.11373,"119":1.29896,"120":0.59561,"121":0.03592,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 45 46 49 50 51 53 54 55 56 57 59 61 62 63 64 65 69 70 71 73 74 76 78 79 80 83 85 86 87 91 92 93 94 96 100 106 107 122 123 3.5 3.6"},D:{"11":0.00599,"33":0.00599,"38":0.00599,"40":0.00599,"41":0.00599,"42":0.00299,"43":0.01497,"46":0.00599,"49":0.00299,"50":0.00599,"53":0.00299,"55":0.01197,"56":0.00599,"59":0.00299,"63":0.00299,"64":0.00599,"65":0.00599,"66":0.00299,"67":0.00299,"68":0.01197,"69":0.00898,"70":0.01197,"71":0.00299,"72":0.00898,"73":0.01197,"74":0.00599,"75":0.01497,"76":0.01796,"77":0.00299,"78":0.00599,"79":0.39807,"80":0.01197,"81":0.03891,"83":0.02694,"84":0.01197,"85":0.00599,"86":0.02694,"87":0.01796,"88":0.03292,"89":0.01197,"90":0.00898,"91":0.00898,"92":0.00898,"93":0.0838,"94":0.00599,"95":0.01197,"96":0.00898,"97":0.01197,"98":0.22448,"99":0.00898,"100":0.00299,"101":0.00299,"102":0.02394,"103":0.08979,"104":0.01796,"105":0.01497,"106":0.06884,"107":0.01497,"108":0.03592,"109":2.85832,"110":0.00898,"111":0.01796,"112":0.02694,"113":0.02095,"114":0.06285,"115":0.03292,"116":0.11373,"117":0.18257,"118":2.49916,"119":10.99628,"120":0.01796,"121":0.01497,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 37 39 44 45 47 48 51 52 54 57 58 60 61 62 122"},F:{"28":0.00299,"36":0.00299,"40":0.00299,"46":0.01197,"79":0.02694,"82":0.00299,"84":0.00299,"85":0.00299,"89":0.00299,"91":0.00299,"95":0.11972,"98":0.00299,"99":0.00299,"101":0.00599,"102":0.0449,"103":0.23046,"104":0.63452,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 83 86 87 88 90 92 93 94 96 97 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.01796,"13":0.00898,"14":0.00599,"15":0.00299,"16":0.00599,"17":0.00599,"18":0.09278,"84":0.00299,"89":0.01197,"90":0.00299,"92":0.03592,"100":0.00299,"103":0.00299,"104":0.00299,"107":0.00599,"108":0.00299,"109":0.10775,"110":0.00299,"111":0.00299,"112":0.00299,"113":0.00299,"114":0.02993,"115":0.02394,"116":0.03592,"117":0.06585,"118":0.53275,"119":2.34651,_:"79 80 81 83 85 86 87 88 91 93 94 95 96 97 98 99 101 102 105 106"},E:{"7":0.00299,"13":0.01497,"14":0.00299,_:"0 4 5 6 8 9 10 11 12 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 15.1 15.2-15.3 15.4 16.0 16.2 16.3 16.4 17.2","12.1":0.00299,"13.1":0.00299,"14.1":0.01197,"15.5":0.00299,"15.6":0.02993,"16.1":0.00299,"16.5":0.01796,"16.6":0.01497,"17.0":0.00898,"17.1":0.01197},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00041,"5.0-5.1":0.00041,"6.0-6.1":0.00103,"7.0-7.1":0.00144,"8.1-8.4":0.00021,"9.0-9.2":0.00165,"9.3":0.00515,"10.0-10.2":0.00041,"10.3":0.00742,"11.0-11.2":0.0035,"11.3-11.4":0.00309,"12.0-12.1":0.00185,"12.2-12.5":0.03378,"13.0-13.1":0.00082,"13.2":0.0035,"13.3":0.00206,"13.4-13.7":0.00597,"14.0-14.4":0.01586,"14.5-14.8":0.02575,"15.0-15.1":0.01009,"15.2-15.3":0.01236,"15.4":0.0138,"15.5":0.01936,"15.6-15.7":0.10175,"16.0":0.04779,"16.1":0.09578,"16.2":0.04593,"16.3":0.0861,"16.4":0.01771,"16.5":0.04573,"16.6-16.7":0.77509,"17.0":0.23214,"17.1":0.38991,"17.2":0.01112},P:{"4":0.35884,"20":0.05126,"21":0.11278,"22":0.1948,"23":0.32809,"5.0-5.4":0.01025,"6.2-6.4":0.03076,"7.2-7.4":0.20505,_:"8.2 10.1 12.0 15.0","9.2":0.02051,"11.1-11.2":0.02051,"13.0":0.05126,"14.0":0.01025,"16.0":0.02051,"17.0":0.09227,"18.0":0.11278,"19.0":0.06152},I:{"0":0.20216,"3":0.00002,"4":0.00004,"2.1":0,"2.2":0.00004,"2.3":0,"4.1":0.00002,"4.2-4.3":0.00014,"4.4":0,"4.4.3-4.4.4":0.00061},K:{"0":2.04959,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.03592,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.08407,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.30826},H:{"0":0.97},L:{"0":65.30853},R:{_:"0"},M:{"0":0.08407},Q:{"13.1":0.00701}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FI.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FI.js
    index 179e1f735a4d3e..7c1fc1d7e35a76 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FI.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FI.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.0062,"47":0,"48":0,"49":0,"50":1.07915,"51":0,"52":0.22947,"53":1.40785,"54":0,"55":0.0062,"56":0.27909,"57":0,"58":0,"59":0.02481,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.0062,"69":0,"70":0,"71":0,"72":0.0062,"73":0,"74":0,"75":0.0062,"76":0,"77":0,"78":0.01861,"79":0,"80":0,"81":0,"82":0,"83":0.0062,"84":0.0124,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.0062,"92":0,"93":0,"94":0.0062,"95":0.0124,"96":0,"97":0,"98":0.0124,"99":0,"100":0.0062,"101":0,"102":0.09923,"103":0.0062,"104":0.0124,"105":0.0124,"106":0.0062,"107":0.0062,"108":0.0062,"109":0.0062,"110":0.0062,"111":0.0062,"112":0.0062,"113":0.03101,"114":0.01861,"115":0.86208,"116":0.16745,"117":1.873,"118":0.16745,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.0062,"39":0,"40":0,"41":0.0062,"42":0.0124,"43":0,"44":0.0062,"45":0,"46":0,"47":0.0062,"48":0,"49":0.0062,"50":0,"51":0.0062,"52":0,"53":0,"54":0,"55":0.0062,"56":0.0062,"57":0.0062,"58":0,"59":0,"60":0.0124,"61":0.01861,"62":0,"63":0.0062,"64":0,"65":0,"66":0.13024,"67":0,"68":0,"69":0.0062,"70":0,"71":0.0062,"72":0,"73":0,"74":0,"75":0.0062,"76":0.0124,"77":0.01861,"78":0.0062,"79":0.02481,"80":0.0062,"81":0.03101,"83":0.03101,"84":0.0062,"85":0.02481,"86":0.14265,"87":0.01861,"88":0.0124,"89":0.01861,"90":0.0062,"91":0.77525,"92":0.0062,"93":0.03101,"94":0.0124,"95":0.0124,"96":0.02481,"97":0,"98":0.0062,"99":0.02481,"100":0.14885,"101":0.27909,"102":0.14885,"103":0.20467,"104":0.14265,"105":0.08063,"106":0.07442,"107":0.11784,"108":0.26669,"109":0.53957,"110":0.08683,"111":0.09923,"112":0.21707,"113":0.17986,"114":0.94891,"115":1.34583,"116":14.06614,"117":3.54134,"118":0.0062,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.0062,"70":0.0124,"71":0.0062,"72":0.03101,"73":0.0062,"74":0.0062,"75":0,"76":0.0062,"77":0.04962,"78":0.0062,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.0124,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0.0062,"94":0,"95":0.0124,"96":0,"97":0,"98":0,"99":0.0062,"100":0.13024,"101":0.37212,"102":0.53957,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.0062},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.0124,"18":0.0062,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.0062,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.0062,"102":0,"103":0,"104":0,"105":0,"106":0.0062,"107":0.0124,"108":0.01861,"109":0.03101,"110":0.0124,"111":0.0124,"112":0.0062,"113":0.01861,"114":0.03721,"115":0.20467,"116":1.99704,"117":1.41406},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.0062,"14":0.01861,"15":0.0062,_:"0","3.1":0,"3.2":0,"5.1":0.0062,"6.1":0,"7.1":0,"9.1":0.0062,"10.1":0,"11.1":0.01861,"12.1":0.0062,"13.1":0.03101,"14.1":0.05582,"15.1":0.0062,"15.2-15.3":0.0062,"15.4":0.02481,"15.5":0.01861,"15.6":0.16745,"16.0":0.02481,"16.1":0.03101,"16.2":0.04341,"16.3":0.10543,"16.4":0.05582,"16.5":0.18606,"16.6":0.85588,"17.0":0.06202,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00374,"8.1-8.4":0.00374,"9.0-9.2":0.00749,"9.3":0.01871,"10.0-10.2":0,"10.3":0.03369,"11.0-11.2":0.01871,"11.3-11.4":0.14784,"12.0-12.1":0.01684,"12.2-12.5":0.20024,"13.0-13.1":0.00374,"13.2":0.00374,"13.3":0.10293,"13.4-13.7":0.02059,"14.0-14.4":0.08983,"14.5-14.8":0.20399,"15.0-15.1":0.11416,"15.2-15.3":0.12352,"15.4":0.12539,"15.5":0.25077,"15.6-15.7":1.06859,"16.0":0.6419,"16.1":1.08731,"16.2":0.57453,"16.3":1.02555,"16.4":0.41733,"16.5":1.06111,"16.6":9.91676,"17.0":1.20708,"17.1":0},P:{"4":0.03079,"20":0.10263,"21":0.20527,"22":1.56004,"5.0-5.4":0.01026,"6.2-6.4":0,"7.2-7.4":0.01026,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01026,"12.0":0.01026,"13.0":0.01026,"14.0":0.04105,"15.0":0.01026,"16.0":0.05132,"17.0":0.04105,"18.0":0.04105,"19.0":0.07184},I:{"0":0,"3":0,"4":0.00884,"2.1":0,"2.2":0.00295,"2.3":0.0059,"4.1":0.0059,"4.2-4.3":0.01474,"4.4":0,"4.4.3-4.4.4":0.05307},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.02481,"9":0.0062,"10":0.0062,"11":0.06202,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":37.35773},R:{_:"0"},M:{"0":0.62287},Q:{"13.1":0.0038},O:{"0":0.25826},H:{"0":0.54655}};
    +module.exports={C:{"31":0.00616,"50":0.9788,"52":1.10808,"53":3.05338,"55":0.01231,"56":1.57594,"59":0.03078,"67":0.00616,"68":0.00616,"72":0.00616,"75":0.01847,"78":0.01231,"83":0.01847,"88":0.00616,"91":0.00616,"97":0.00616,"102":0.02462,"103":0.00616,"104":0.06156,"105":0.01847,"106":0.01231,"108":0.02462,"109":0.01231,"110":0.01847,"111":0.01231,"113":0.02462,"114":0.00616,"115":0.38167,"116":0.01231,"117":0.04925,"118":0.09234,"119":2.24078,"120":0.64022,"121":0.00616,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 51 54 57 58 60 61 62 63 64 65 66 69 70 71 73 74 76 77 79 80 81 82 84 85 86 87 89 90 92 93 94 95 96 98 99 100 101 107 112 122 123 3.5 3.6"},D:{"38":0.00616,"42":0.01847,"48":0.00616,"49":0.01847,"52":0.06156,"56":0.01231,"57":0.00616,"60":0.00616,"61":0.02462,"66":0.14774,"71":0.01231,"73":0.00616,"75":0.01847,"76":0.01231,"77":0.01847,"78":0.00616,"79":0.04309,"80":0.00616,"81":0.03694,"83":0.04309,"84":0.00616,"85":0.04925,"86":0.35089,"87":0.06156,"88":0.00616,"89":0.02462,"90":0.00616,"91":0.94802,"92":0.01231,"93":0.09234,"94":0.01847,"95":0.01231,"96":0.01231,"98":0.00616,"99":0.00616,"100":0.36936,"101":0.70794,"102":0.3632,"103":0.43708,"104":0.36936,"105":0.17852,"106":0.09234,"107":0.11081,"108":0.19084,"109":0.87415,"110":0.12312,"111":0.19084,"112":0.14159,"113":0.16621,"114":0.69563,"115":0.0985,"116":0.81875,"117":1.07114,"118":6.08213,"119":22.64177,"120":0.00616,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 43 44 45 46 47 50 51 53 54 55 58 59 62 63 64 65 67 68 69 70 72 74 97 121 122"},F:{"46":0.00616,"68":0.01231,"90":0.00616,"92":0.00616,"94":0.01231,"95":0.02462,"96":0.00616,"97":0.00616,"102":0.54788,"103":0.14159,"104":0.54788,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 91 93 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"14":0.00616,"17":0.01231,"18":0.00616,"86":0.00616,"90":0.00616,"100":0.00616,"103":0.01847,"105":0.00616,"106":0.01847,"107":0.02462,"108":0.03694,"109":0.04925,"110":0.03078,"111":0.00616,"112":0.03078,"113":0.02462,"114":0.11081,"115":0.01847,"116":0.09234,"117":0.13543,"118":0.99112,"119":3.70591,_:"12 13 15 16 79 80 81 83 84 85 87 88 89 91 92 93 94 95 96 97 98 99 101 102 104"},E:{"9":0.00616,"13":0.00616,"14":0.02462,"15":0.00616,_:"0 4 5 6 7 8 10 11 12 3.1 3.2 6.1 7.1 9.1 10.1","5.1":0.00616,"11.1":0.02462,"12.1":0.00616,"13.1":0.03694,"14.1":0.07387,"15.1":0.01231,"15.2-15.3":0.01847,"15.4":0.02462,"15.5":0.03078,"15.6":0.22162,"16.0":0.04309,"16.1":0.04925,"16.2":0.0554,"16.3":0.1539,"16.4":0.07387,"16.5":0.16006,"16.6":0.74488,"17.0":0.32627,"17.1":2.48702,"17.2":0.00616},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00233,"5.0-5.1":0.00233,"6.0-6.1":0.00582,"7.0-7.1":0.00815,"8.1-8.4":0.00116,"9.0-9.2":0.00931,"9.3":0.02909,"10.0-10.2":0.00233,"10.3":0.04189,"11.0-11.2":0.01978,"11.3-11.4":0.01745,"12.0-12.1":0.01047,"12.2-12.5":0.19083,"13.0-13.1":0.00465,"13.2":0.01978,"13.3":0.01164,"13.4-13.7":0.03374,"14.0-14.4":0.0896,"14.5-14.8":0.14545,"15.0-15.1":0.05702,"15.2-15.3":0.06981,"15.4":0.07796,"15.5":0.10938,"15.6-15.7":0.57481,"16.0":0.26995,"16.1":0.54106,"16.2":0.25948,"16.3":0.48638,"16.4":0.10007,"16.5":0.25831,"16.6-16.7":4.37855,"17.0":1.31135,"17.1":2.20265,"17.2":0.06283},P:{"4":0.03131,"20":0.06262,"21":0.12524,"22":0.4592,"23":1.33584,_:"5.0-5.4 6.2-6.4 8.2 10.1 12.0","7.2-7.4":0.01044,"9.2":0.01044,"11.1-11.2":0.01044,"13.0":0.02087,"14.0":0.02087,"15.0":0.01044,"16.0":0.03131,"17.0":0.02087,"18.0":0.03131,"19.0":0.05218},I:{"0":0.03442,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.0001},K:{"0":0.55738,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.01955,"9":0.01304,"10":0.00652,"11":0.0717,_:"6 7 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.16529},H:{"0":0},L:{"0":23.42659},R:{_:"0"},M:{"0":0.66501},Q:{"13.1":0.00384}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FJ.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FJ.js
    index 02add7fe08e290..d496430f6baa1c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FJ.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FJ.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00274,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.01371,"53":0,"54":0,"55":0,"56":0.00548,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.02741,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00274,"101":0,"102":0.00548,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00274,"110":0,"111":0.00274,"112":0,"113":0.00274,"114":0.00548,"115":0.06853,"116":0.04386,"117":0.46323,"118":0.02467,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0.00274,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00548,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00274,"66":0,"67":0,"68":0,"69":0.00548,"70":0,"71":0,"72":0,"73":0,"74":0.00274,"75":0,"76":0.00274,"77":0.00274,"78":0.00274,"79":0.00548,"80":0,"81":0.01919,"83":0.00548,"84":0,"85":0,"86":0.00274,"87":0.00822,"88":0.03289,"89":0.00274,"90":0,"91":0.00274,"92":0.01096,"93":0.00822,"94":0.00274,"95":0.00274,"96":0,"97":0,"98":0.00548,"99":0.00822,"100":0,"101":0.00274,"102":0,"103":0.01371,"104":0.00274,"105":0.00548,"106":0.00274,"107":0.00822,"108":0.01645,"109":0.30699,"110":0.00274,"111":0.00822,"112":0.01371,"113":0.01371,"114":0.05482,"115":0.10416,"116":3.01236,"117":0.65236,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0.00548,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.00822,"71":0.00274,"72":0.05756,"73":0.02467,"74":0,"75":0,"76":0.05208,"77":0.00274,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00274,"96":0,"97":0,"98":0,"99":0,"100":0.00274,"101":0.0603,"102":0.02741,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0.00274,"14":0,"15":0.00274,"16":0,"17":0.00274,"18":0.00274,"79":0,"80":0,"81":0,"83":0,"84":0.00274,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00274,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00274,"101":0,"102":0,"103":0,"104":0,"105":0.01645,"106":0,"107":0,"108":0,"109":0.00274,"110":0.00274,"111":0.00274,"112":0.00274,"113":0.00274,"114":0.01096,"115":0.04934,"116":0.56739,"117":0.43034},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00548,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00822,"14.1":0.01096,"15.1":0.00274,"15.2-15.3":0,"15.4":0.00274,"15.5":0.00548,"15.6":0.03837,"16.0":0.00274,"16.1":0.00822,"16.2":0.00822,"16.3":0.01371,"16.4":0.00548,"16.5":0.02741,"16.6":0.2138,"17.0":0.00822,"17.1":0},G:{"8":0.00201,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0.00302,"7.0-7.1":0.01308,"8.1-8.4":0,"9.0-9.2":0.00201,"9.3":0.05232,"10.0-10.2":0,"10.3":0.04729,"11.0-11.2":0.00201,"11.3-11.4":0.00805,"12.0-12.1":0.00101,"12.2-12.5":0.31492,"13.0-13.1":0.00604,"13.2":0.05836,"13.3":0.12375,"13.4-13.7":0.00805,"14.0-14.4":0.06842,"14.5-14.8":0.11168,"15.0-15.1":0.03622,"15.2-15.3":0.0654,"15.4":0.12074,"15.5":0.1147,"15.6-15.7":0.90854,"16.0":0.25153,"16.1":0.53627,"16.2":0.19921,"16.3":0.44371,"16.4":0.16501,"16.5":0.57551,"16.6":5.17254,"17.0":0.57953,"17.1":0},P:{"4":0.18482,"20":0.34911,"21":0.63661,"22":6.06829,"5.0-5.4":0,"6.2-6.4":0.04107,"7.2-7.4":0.45178,"8.2":0,"9.2":0.01027,"10.1":0,"11.1-11.2":0.05134,"12.0":0.0308,"13.0":0.07187,"14.0":0.06161,"15.0":0.04107,"16.0":0.13348,"17.0":0.05134,"18.0":0.2875,"19.0":0.58527},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.0966},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01096,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":68.65255},R:{_:"0"},M:{"0":0.24681},Q:{"13.1":0.32666},O:{"0":0.76945},H:{"0":0.90028}};
    +module.exports={C:{"44":0.00249,"52":0.00497,"56":0.00249,"68":0.00497,"78":0.05469,"87":0.00249,"93":0.00497,"105":0.00249,"111":0.00497,"113":0.00249,"114":0.00249,"115":0.07458,"116":0.00746,"117":0.00497,"118":0.04723,"119":1.04412,"120":0.22125,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 45 46 47 48 49 50 51 53 54 55 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 88 89 90 91 92 94 95 96 97 98 99 100 101 102 103 104 106 107 108 109 110 112 121 122 123 3.5 3.6"},D:{"49":0.01243,"50":0.00249,"52":0.00249,"56":0.00249,"63":0.00249,"64":0.00249,"69":0.00746,"70":0.00249,"73":0.02237,"76":0.01492,"77":0.00249,"78":0.00249,"79":0.00994,"80":0.00746,"81":0.03232,"83":0.00746,"84":0.00249,"86":0.00746,"87":0.00994,"88":0.0348,"89":0.00497,"90":0.00249,"91":0.02735,"92":0.03729,"93":0.02486,"94":0.00746,"96":0.00249,"97":0.00249,"98":0.00249,"99":0.00994,"100":0.01243,"102":0.01492,"103":0.02735,"104":0.00746,"105":0.01989,"106":0.00497,"107":0.00249,"108":0.01492,"109":0.6041,"110":0.00497,"111":0.00994,"112":0.00746,"113":0.04475,"114":0.02237,"115":0.09695,"116":0.18396,"117":0.20634,"118":2.8589,"119":9.40454,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 51 53 54 55 57 58 59 60 61 62 65 66 67 68 71 72 74 75 85 95 101 120 121 122"},F:{"28":0.00249,"46":0.00249,"95":0.00497,"101":0.00497,"102":0.04972,"103":0.04475,"104":0.16159,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00497,"15":0.00497,"16":0.00746,"17":0.00249,"18":0.00746,"80":0.00249,"84":0.00497,"90":0.00497,"92":0.01243,"99":0.00249,"100":0.00497,"103":0.00497,"105":0.01492,"109":0.03729,"110":0.00994,"111":0.00249,"112":0.00497,"113":0.00994,"114":0.00994,"115":0.01492,"116":0.0174,"117":0.03729,"118":0.53946,"119":2.27718,_:"13 14 79 81 83 85 86 87 88 89 91 93 94 95 96 97 98 101 102 104 106 107 108"},E:{"12":0.00249,"14":0.00994,_:"0 4 5 6 7 8 9 10 11 13 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 17.2","12.1":0.00249,"13.1":0.02735,"14.1":0.02237,"15.1":0.00994,"15.2-15.3":0.00249,"15.4":0.00994,"15.5":0.01243,"15.6":0.09944,"16.0":0.01492,"16.1":0.03232,"16.2":0.00497,"16.3":0.03978,"16.4":0.01492,"16.5":0.07458,"16.6":0.76817,"17.0":0.2834,"17.1":0.31821},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00137,"5.0-5.1":0.00137,"6.0-6.1":0.00343,"7.0-7.1":0.0048,"8.1-8.4":0.00069,"9.0-9.2":0.00549,"9.3":0.01715,"10.0-10.2":0.00137,"10.3":0.0247,"11.0-11.2":0.01166,"11.3-11.4":0.01029,"12.0-12.1":0.00617,"12.2-12.5":0.11251,"13.0-13.1":0.00274,"13.2":0.01166,"13.3":0.00686,"13.4-13.7":0.01989,"14.0-14.4":0.05282,"14.5-14.8":0.08575,"15.0-15.1":0.03362,"15.2-15.3":0.04116,"15.4":0.04596,"15.5":0.06449,"15.6-15.7":0.3389,"16.0":0.15916,"16.1":0.319,"16.2":0.15298,"16.3":0.28676,"16.4":0.059,"16.5":0.1523,"16.6-16.7":2.58152,"17.0":0.77315,"17.1":1.29865,"17.2":0.03705},P:{"4":0.24869,"20":0.22797,"21":0.72534,"22":1.19164,"23":3.61635,_:"5.0-5.4 8.2 10.1 12.0","6.2-6.4":0.02072,"7.2-7.4":0.53883,"9.2":0.05181,"11.1-11.2":0.10362,"13.0":0.06217,"14.0":0.03109,"15.0":0.03109,"16.0":0.11398,"17.0":0.05181,"18.0":0.15543,"19.0":0.53883},I:{"0":0.03738,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00011},K:{"0":0.60112,_:"10 11 12 11.1 11.5 12.1"},A:{"10":0.00497,"11":0.00497,_:"6 7 8 9 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.38321},H:{"0":0},L:{"0":63.4911},R:{_:"0"},M:{"0":0.15028},Q:{"13.1":0.00751}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FK.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FK.js
    index 8b23749a9986c9..78815cc24fca82 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FK.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FK.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0.0138,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":1.09456,"109":0,"110":0,"111":0.03679,"112":0,"113":0.08738,"114":0.0138,"115":0.21615,"116":0.30353,"117":2.55245,"118":0.16556,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.31733,"80":0,"81":0.03679,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.06439,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.25295,"110":0,"111":0,"112":0.03679,"113":0,"114":0,"115":1.23253,"116":3.84936,"117":1.94538,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.07818,"102":0.08738,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.08738,"79":0.0138,"80":0,"81":0,"83":0,"84":0.03679,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.05059,"110":0.15177,"111":0,"112":0.38172,"113":0,"114":0.82782,"115":0.07818,"116":2.41448,"117":0.80023},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0,"15.1":0.07818,"15.2-15.3":0,"15.4":0,"15.5":0.0138,"15.6":0.43231,"16.0":0.0138,"16.1":0,"16.2":0.0138,"16.3":0.11498,"16.4":0.18856,"16.5":0.78643,"16.6":1.70163,"17.0":0.0138,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0.09733,"12.2-12.5":0,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0,"14.0-14.4":0,"14.5-14.8":0.13036,"15.0-15.1":0,"15.2-15.3":0.25898,"15.4":0,"15.5":0,"15.6-15.7":0.96986,"16.0":0.38759,"16.1":2.10309,"16.2":0.16164,"16.3":1.26186,"16.4":0.06431,"16.5":0.77693,"16.6":10.42161,"17.0":0.61529,"17.1":0},P:{"4":0,"20":0,"21":1.33268,"22":8.6932,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0.11277,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":4.64389,"15.0":0,"16.0":0,"17.0":0,"18.0":0,"19.0":0},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.10118,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":39.29373},R:{_:"0"},M:{"0":0.93437},Q:{"13.1":0},O:{"0":0},H:{"0":0}};
    +module.exports={C:{"69":0.30059,"90":0.02227,"108":1.76644,"114":0.07051,"115":0.02227,"116":0.02227,"117":0.04824,"118":3.88171,"119":0.92775,"120":0.58263,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 109 110 111 112 113 121 122 123 3.5 3.6"},D:{"34":0.02227,"79":0.14102,"96":0.02227,"103":3.46236,"109":1.83695,"113":0.11504,"117":0.58263,"118":2.27855,"119":8.064,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 97 98 99 100 101 102 104 105 106 107 108 110 111 112 114 115 116 120 121 122"},F:{"104":0.62716,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.07051,"84":0.11504,"85":0.04824,"89":0.23379,"91":0.32657,"104":0.04824,"108":0.09278,"109":0.23379,"110":0.32657,"114":0.79044,"115":0.07051,"117":0.55665,"118":1.51038,"119":3.69616,_:"12 13 14 15 16 17 79 80 81 83 86 87 88 90 92 93 94 95 96 97 98 99 100 101 102 103 105 106 107 111 112 113 116"},E:{_:"0 4 5 6 7 8 9 10 11 12 13 14 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 13.1 14.1 15.2-15.3 15.4 15.5 16.1 16.3 16.4 17.2","15.1":0.20782,"15.6":1.06877,"16.0":0.02227,"16.2":0.07051,"16.5":0.04824,"16.6":0.71993,"17.0":0.3711,"17.1":1.0465},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00398,"5.0-5.1":0.00398,"6.0-6.1":0.00996,"7.0-7.1":0.01394,"8.1-8.4":0.00199,"9.0-9.2":0.01593,"9.3":0.04978,"10.0-10.2":0.00398,"10.3":0.07168,"11.0-11.2":0.03385,"11.3-11.4":0.02987,"12.0-12.1":0.01792,"12.2-12.5":0.32654,"13.0-13.1":0.00796,"13.2":0.03385,"13.3":0.01991,"13.4-13.7":0.05774,"14.0-14.4":0.15331,"14.5-14.8":0.24889,"15.0-15.1":0.09756,"15.2-15.3":0.11947,"15.4":0.1334,"15.5":0.18716,"15.6-15.7":0.9836,"16.0":0.46193,"16.1":0.92586,"16.2":0.44401,"16.3":0.83228,"16.4":0.17123,"16.5":0.44202,"16.6-16.7":7.4925,"17.0":2.24397,"17.1":3.76915,"17.2":0.10752},P:{"20":0.0525,"21":0.62996,"22":0.12599,"23":4.29425,_:"4 5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 16.0 17.0 18.0 19.0","14.0":7.29707,"15.0":0.021},I:{"0":0.07509,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00005,"4.4":0,"4.4.3-4.4.4":0.00023},K:{"0":0,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.04824,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{_:"0"},H:{"0":0},L:{"0":29.21874},R:{_:"0"},M:{"0":1.29553},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FM.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FM.js
    index 9bf5af5e4b9781..93dbd2b5f2f552 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FM.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FM.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.09532,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00502,"110":0,"111":0.02509,"112":0,"113":0,"114":0.0301,"115":0.04014,"116":0.31607,"117":0.99838,"118":0.04014,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.01505,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0.02007,"60":0,"61":0,"62":0.04515,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.01003,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0.00502,"75":0,"76":0,"77":0.02509,"78":0,"79":0.10034,"80":0.01003,"81":0.00502,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00502,"89":0,"90":0,"91":0,"92":0,"93":0.25085,"94":0.00502,"95":0,"96":0,"97":0,"98":0,"99":0.00502,"100":0,"101":0,"102":0,"103":0.07526,"104":0,"105":0.02007,"106":0,"107":0.02007,"108":0.03512,"109":0.37126,"110":0.01003,"111":0.00502,"112":0.02007,"113":0,"114":0.03512,"115":0.16054,"116":8.40849,"117":2.73427,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.01003,"73":0,"74":0,"75":0,"76":0,"77":0.02007,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00502,"101":0.0602,"102":0.09532,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00502,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00502,"108":0.00502,"109":0.05017,"110":0,"111":0,"112":0.02007,"113":0,"114":0.05519,"115":0.0602,"116":4.12397,"117":3.76777},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00502,"15":0.01505,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.01003,"14.1":0.01003,"15.1":0.02509,"15.2-15.3":0,"15.4":0,"15.5":0.02007,"15.6":0.09532,"16.0":0,"16.1":0.05519,"16.2":0.03512,"16.3":0.18061,"16.4":0.14549,"16.5":0.04515,"16.6":0.23078,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0,"11.0-11.2":0.01223,"11.3-11.4":0,"12.0-12.1":0.01223,"12.2-12.5":0.09985,"13.0-13.1":0,"13.2":0,"13.3":0.05094,"13.4-13.7":0,"14.0-14.4":0.1406,"14.5-14.8":0.40347,"15.0-15.1":0.0754,"15.2-15.3":0.06317,"15.4":0.0754,"15.5":0.27713,"15.6-15.7":1.86045,"16.0":0.32604,"16.1":1.35713,"16.2":0.62762,"16.3":1.00664,"16.4":0.56649,"16.5":0.72951,"16.6":11.95541,"17.0":0.71728,"17.1":0},P:{"4":0,"20":0,"21":0.19602,"22":0.96979,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.01032,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01032,"12.0":0,"13.0":0.14444,"14.0":0,"15.0":0,"16.0":0.07222,"17.0":0.01032,"18.0":0.01032,"19.0":0.01032},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.59617},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.02509,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":49.31744},R:{_:"0"},M:{"0":0.51325},Q:{"13.1":0},O:{"0":2.43669},H:{"0":0.08963}};
    +module.exports={C:{"99":0.00934,"100":0.00934,"112":0.00934,"115":0.09809,"116":0.02803,"118":0.00934,"119":3.19029,"120":0.85012,"121":0.03737,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 101 102 103 104 105 106 107 108 109 110 111 113 114 117 122 123 3.5 3.6"},D:{"37":0.00934,"49":0.00934,"67":0.00934,"79":0.02803,"89":0.01868,"90":0.00934,"91":0.02803,"93":1.18643,"103":0.30829,"107":0.03737,"108":0.03737,"109":2.10662,"112":0.05138,"113":0.02803,"114":0.00934,"115":0.03737,"116":0.09809,"117":0.16816,"118":5.36231,"119":18.00203,"120":0.01868,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 39 40 41 42 43 44 45 46 47 48 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 68 69 70 71 72 73 74 75 76 77 78 80 81 83 84 85 86 87 88 92 94 95 96 97 98 99 100 101 102 104 105 106 110 111 121 122"},F:{"102":0.03737,"103":0.01868,"104":0.01868,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.00934,"104":0.00934,"106":0.00934,"109":0.05138,"112":0.08875,"113":0.08875,"114":0.02803,"115":0.02803,"116":0.07941,"117":0.16816,"118":1.21446,"119":8.35642,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 105 107 108 110 111"},E:{"4":0.00934,"14":0.00934,"15":0.00934,_:"0 5 6 7 8 9 10 11 12 13 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 15.2-15.3 16.0 16.4 17.2","13.1":0.11678,"14.1":0.02803,"15.1":0.07941,"15.4":0.02803,"15.5":0.02803,"15.6":0.47644,"16.1":0.00934,"16.2":0.03737,"16.3":0.06072,"16.5":0.21954,"16.6":0.68197,"17.0":0.1775,"17.1":0.11678},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00201,"5.0-5.1":0.00201,"6.0-6.1":0.00503,"7.0-7.1":0.00704,"8.1-8.4":0.00101,"9.0-9.2":0.00805,"9.3":0.02515,"10.0-10.2":0.00201,"10.3":0.03621,"11.0-11.2":0.0171,"11.3-11.4":0.01509,"12.0-12.1":0.00905,"12.2-12.5":0.16497,"13.0-13.1":0.00402,"13.2":0.0171,"13.3":0.01006,"13.4-13.7":0.02917,"14.0-14.4":0.07746,"14.5-14.8":0.12574,"15.0-15.1":0.04929,"15.2-15.3":0.06036,"15.4":0.0674,"15.5":0.09456,"15.6-15.7":0.49693,"16.0":0.23337,"16.1":0.46776,"16.2":0.22432,"16.3":0.42048,"16.4":0.08651,"16.5":0.22332,"16.6-16.7":3.7853,"17.0":1.13368,"17.1":1.90422,"17.2":0.05432},P:{"4":0.01059,"21":0.10592,"22":0.47663,"23":0.80498,_:"20 5.0-5.4 6.2-6.4 8.2 9.2 10.1 13.0 15.0 16.0","7.2-7.4":0.1271,"11.1-11.2":0.09533,"12.0":0.01059,"14.0":0.04237,"17.0":0.01059,"18.0":0.05296,"19.0":0.02118},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{"0":0.20779,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.05138,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":1.08691},H:{"0":0},L:{"0":42.37826},R:{_:"0"},M:{"0":0.14386},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FO.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FO.js
    index cde3172e761e2f..dafe24e8ab029b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FO.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FO.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.09191,"103":0,"104":0,"105":0,"106":0.05656,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.03182,"116":0.00354,"117":0.31462,"118":0.03535,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00707,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.03889,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.00354,"80":0,"81":0,"83":0,"84":0,"85":0.00354,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.01768,"93":0,"94":0,"95":0,"96":0,"97":0.00354,"98":0,"99":0,"100":0,"101":0.00354,"102":0,"103":0.39592,"104":0,"105":0,"106":0,"107":0.00707,"108":0.02475,"109":0.11312,"110":0.05303,"111":0.01768,"112":0.01768,"113":0.01061,"114":0.02828,"115":0.20503,"116":2.49925,"117":0.63984,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.04242,"101":0.03889,"102":0.10959,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.01768,"110":0,"111":0,"112":0,"113":0,"114":0.00707,"115":0.01414,"116":0.39592,"117":0.30048},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.04242,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.03535,"14.1":0.02828,"15.1":0.01061,"15.2-15.3":0.02121,"15.4":0.07424,"15.5":0.11312,"15.6":0.71407,"16.0":0.01414,"16.1":0.21917,"16.2":0.26159,"16.3":0.50551,"16.4":0.09545,"16.5":0.30401,"16.6":3.98748,"17.0":0.15908,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.04907,"10.0-10.2":0,"10.3":0.02453,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0.13084,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0,"14.0-14.4":0.04089,"14.5-14.8":0.30257,"15.0-15.1":0.18808,"15.2-15.3":0.13902,"15.4":0.31892,"15.5":0.5806,"15.6-15.7":7.00814,"16.0":2.4369,"16.1":5.62614,"16.2":2.6904,"16.3":4.77567,"16.4":0.38434,"16.5":2.38784,"16.6":50.2427,"17.0":3.59811,"17.1":0.01636},P:{"4":0,"20":0.05155,"21":0.02062,"22":0.6804,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0,"17.0":0,"18.0":0,"19.0":0.01031},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.01707},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":5.62616},R:{_:"0"},M:{"0":0.02586},Q:{"13.1":0},O:{"0":0},H:{"0":0.02448}};
    +module.exports={C:{"78":0.00375,"115":0.31125,"118":0.01125,"119":0.88125,"120":0.31125,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 116 117 121 122 123 3.5 3.6"},D:{"49":0.0075,"53":0.015,"68":0.01125,"76":0.01875,"79":0.00375,"87":0.00375,"90":0.00375,"103":0.03375,"106":0.255,"107":0.465,"108":0.94125,"109":0.96,"110":0.01125,"111":0.36375,"112":0.17625,"113":0.00375,"114":0.00375,"115":0.01125,"116":0.22125,"117":0.2175,"118":1.77,"119":4.89375,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 50 51 52 54 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 75 77 78 80 81 83 84 85 86 88 89 91 92 93 94 95 96 97 98 99 100 101 102 104 105 120 121 122"},F:{"95":0.0825,"102":0.2625,"103":0.0075,"104":0.09,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"109":0.0075,"114":0.00375,"116":0.00375,"117":0.015,"118":0.55875,"119":1.5675,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 111 112 113 115"},E:{"14":0.135,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1","13.1":0.11625,"14.1":0.13125,"15.1":0.01875,"15.2-15.3":0.03,"15.4":0.13875,"15.5":0.3225,"15.6":3.66,"16.0":0.0525,"16.1":0.54,"16.2":0.58125,"16.3":1.2975,"16.4":0.34875,"16.5":0.825,"16.6":9.01125,"17.0":1.42875,"17.1":3.7125,"17.2":0.10125},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.01118,"5.0-5.1":0.01118,"6.0-6.1":0.02794,"7.0-7.1":0.03911,"8.1-8.4":0.00559,"9.0-9.2":0.0447,"9.3":0.13969,"10.0-10.2":0.01118,"10.3":0.20115,"11.0-11.2":0.09499,"11.3-11.4":0.08381,"12.0-12.1":0.05029,"12.2-12.5":0.91635,"13.0-13.1":0.02235,"13.2":0.09499,"13.3":0.05588,"13.4-13.7":0.16204,"14.0-14.4":0.43024,"14.5-14.8":0.69844,"15.0-15.1":0.27379,"15.2-15.3":0.33525,"15.4":0.37436,"15.5":0.52523,"15.6-15.7":2.76023,"16.0":1.2963,"16.1":2.59819,"16.2":1.24601,"16.3":2.33558,"16.4":0.48053,"16.5":1.24043,"16.6-16.7":21.02576,"17.0":6.29711,"17.1":10.57714,"17.2":0.30173},P:{"4":0.05187,"20":0.05187,"21":0.01037,"22":0.11411,"23":0.75728,_:"5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 17.0","18.0":0.01037,"19.0":0.01037},I:{"0":0.01866,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00006},K:{"0":0.04375,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.165,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.0125},H:{"0":0},L:{"0":5.4925},R:{_:"0"},M:{"0":0.05625},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FR.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FR.js
    index 1367d9df171290..ccb778b0368f61 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FR.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/FR.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0.00469,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0.00469,"11":0,"12":0.0375,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00469,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.01406,"49":0,"50":0,"51":0,"52":0.02344,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0.01875,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00469,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0.00938,"76":0,"77":0,"78":0.04688,"79":0,"80":0,"81":0,"82":0.00469,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00469,"89":0,"90":0,"91":0.01875,"92":0,"93":0.00938,"94":0.00938,"95":0,"96":0,"97":0,"98":0,"99":0.00469,"100":0.00469,"101":0,"102":0.1172,"103":0.4313,"104":0.00938,"105":0.00938,"106":0.01406,"107":0.00938,"108":0.01406,"109":0.02344,"110":0.01406,"111":0.01406,"112":0.01406,"113":0.0375,"114":0.03282,"115":0.33285,"116":0.12658,"117":1.96427,"118":0.18752,"119":0.00469,"120":0,"3.5":0,"3.6":0.00469},D:{"4":0.00469,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.02813,"50":0,"51":0,"52":0.00469,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00469,"59":0,"60":0.12658,"61":0,"62":0.00469,"63":0,"64":0,"65":0.00469,"66":0.07032,"67":0,"68":0.00469,"69":0,"70":0.00469,"71":0.00938,"72":0.00469,"73":0,"74":0.00469,"75":0,"76":0.00469,"77":0.00469,"78":0.00469,"79":0.02344,"80":0.01406,"81":0.03282,"83":0.00469,"84":0.00469,"85":0.02813,"86":0.01875,"87":0.09845,"88":0.00938,"89":0.00938,"90":0.01406,"91":0.00938,"92":0.00938,"93":0.00938,"94":0.16408,"95":0.01875,"96":0.02813,"97":0.00938,"98":0.00938,"99":0.02344,"100":0.01406,"101":0.02344,"102":0.02813,"103":0.07032,"104":0.02813,"105":0.0375,"106":0.07032,"107":0.08438,"108":0.1172,"109":0.78758,"110":0.07032,"111":0.15002,"112":0.09376,"113":0.04688,"114":0.16877,"115":0.25315,"116":6.7601,"117":2.04397,"118":0.00469,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00938,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00469,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00469,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00469,"70":0.00469,"71":0.00938,"72":0.05157,"73":0.01406,"74":0,"75":0,"76":0,"77":0.03282,"78":0.00469,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.00469,"92":0.00469,"93":0.00469,"94":0.00469,"95":0.02813,"96":0.00469,"97":0,"98":0,"99":0.00938,"100":0.07032,"101":0.22034,"102":0.3516,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0.00469,"15":0,"16":0,"17":0.00938,"18":0.00469,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0.00469,"86":0,"87":0,"88":0,"89":0,"90":0.00469,"91":0,"92":0.00469,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00469,"100":0,"101":0,"102":0,"103":0.00469,"104":0,"105":0.00469,"106":0.00938,"107":0.01875,"108":0.01875,"109":0.07501,"110":0.00938,"111":0.01406,"112":0.00938,"113":0.00938,"114":0.06563,"115":0.06094,"116":1.34077,"117":1.11106},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00469,"14":0.03282,"15":0.00938,_:"0","3.1":0,"3.2":0,"5.1":0.00469,"6.1":0,"7.1":0,"9.1":0.00938,"10.1":0,"11.1":0.01875,"12.1":0.02344,"13.1":0.0797,"14.1":0.12189,"15.1":0.01875,"15.2-15.3":0.01406,"15.4":0.02344,"15.5":0.04219,"15.6":0.22502,"16.0":0.03282,"16.1":0.05626,"16.2":0.04688,"16.3":0.12658,"16.4":0.06094,"16.5":0.17346,"16.6":0.8204,"17.0":0.04219,"17.1":0},G:{"8":0.00512,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0.00512,"7.0-7.1":0.01537,"8.1-8.4":0.00256,"9.0-9.2":0.01025,"9.3":0.082,"10.0-10.2":0.00512,"10.3":0.09737,"11.0-11.2":0.08968,"11.3-11.4":0.03844,"12.0-12.1":0.02819,"12.2-12.5":0.44842,"13.0-13.1":0.02819,"13.2":0.01025,"13.3":0.26649,"13.4-13.7":0.10506,"14.0-14.4":0.22549,"14.5-14.8":0.38179,"15.0-15.1":0.16143,"15.2-15.3":0.13324,"15.4":0.14349,"15.5":0.23574,"15.6-15.7":1.7706,"16.0":0.9532,"16.1":1.46568,"16.2":0.69953,"16.3":1.39649,"16.4":0.2793,"16.5":0.9122,"16.6":13.57801,"17.0":1.69885,"17.1":0.00512},P:{"4":0.07228,"20":0.10325,"21":0.18585,"22":2.6226,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.01033,"8.2":0.01033,"9.2":0.02065,"10.1":0,"11.1-11.2":0.03098,"12.0":0.01033,"13.0":0.02065,"14.0":0.02065,"15.0":0.01033,"16.0":0.0413,"17.0":0.03098,"18.0":0.0413,"19.0":0.07228},I:{"0":0,"3":0,"4":0.03074,"2.1":0,"2.2":0.04612,"2.3":0,"4.1":0.04612,"4.2-4.3":0.06149,"4.4":0,"4.4.3-4.4.4":0.46115},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00493,"9":0.0148,"10":0.00493,"11":0.06909,"5.5":0},S:{"2.5":0.00531,_:"3.0-3.1"},J:{"7":0,"10":0.00531},N:{"10":0.01594,"11":0},L:{"0":44.75522},R:{_:"0"},M:{"0":0.63744},Q:{"13.1":0.00531},O:{"0":0.61619},H:{"0":0.5884}};
    +module.exports={C:{"12":0.73129,"38":0.00472,"45":0.00472,"48":0.03303,"52":0.03774,"54":0.00944,"56":0.00472,"59":0.03774,"60":0.00472,"68":0.00472,"72":0.00472,"75":0.00944,"78":0.08492,"83":0.00472,"86":0.00472,"88":0.00944,"91":0.02359,"93":0.01887,"94":0.01887,"95":0.00472,"97":0.00472,"98":0.00472,"99":0.00472,"100":0.00472,"101":0.00472,"102":0.07077,"103":1.35407,"104":0.01415,"105":0.01415,"106":0.01415,"107":0.01887,"108":0.01887,"109":0.01887,"110":0.02359,"111":0.01415,"112":0.00944,"113":0.02831,"114":0.01415,"115":0.78319,"116":0.01887,"117":0.02831,"118":0.12739,"119":3.34506,"120":0.96719,"121":0.00472,_:"2 3 4 5 6 7 8 9 10 11 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 46 47 49 50 51 53 55 57 58 61 62 63 64 65 66 67 69 70 71 73 74 76 77 79 80 81 82 84 85 87 89 90 92 96 122 123 3.5 3.6"},D:{"46":0.00472,"48":0.00472,"49":0.05662,"51":0.00472,"52":0.00472,"56":0.00472,"58":0.00472,"60":0.15098,"63":0.00472,"65":0.00472,"66":0.14626,"67":0.00472,"68":0.00472,"69":0.00472,"70":0.00472,"71":0.01415,"72":0.00472,"74":0.00472,"75":0.00472,"76":0.01415,"77":0.00472,"78":0.00944,"79":0.03774,"80":0.01415,"81":0.02831,"83":0.00944,"84":0.00472,"85":0.02831,"86":0.04718,"87":0.08021,"88":0.01415,"89":0.00944,"90":0.01415,"91":0.01415,"92":0.00944,"93":0.01887,"94":0.36329,"95":0.03303,"96":0.02831,"97":0.01887,"98":0.02831,"99":0.02831,"100":0.04718,"101":0.07077,"102":0.08021,"103":0.14154,"104":0.04718,"105":0.08964,"106":0.13682,"107":0.16041,"108":0.21703,"109":1.48145,"110":0.1038,"111":0.22175,"112":0.14154,"113":0.07077,"114":0.24062,"115":0.14626,"116":0.55672,"117":0.37272,"118":3.99615,"119":16.41864,"120":0.00944,"121":0.00472,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 50 53 54 55 57 59 61 62 64 73 122"},F:{"28":0.00472,"36":0.00472,"46":0.00472,"68":0.00472,"85":0.00472,"89":0.00472,"90":0.00472,"91":0.00944,"92":0.00472,"93":0.00944,"94":0.00472,"95":0.04718,"100":0.00472,"101":0.00472,"102":0.50954,"103":0.14626,"104":0.55201,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 86 87 88 96 97 98 99 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"14":0.00472,"16":0.00472,"17":0.01887,"18":0.00472,"84":0.00472,"86":0.00472,"92":0.00944,"96":0.00472,"97":0.00472,"98":0.00472,"99":0.00944,"100":0.00472,"103":0.00472,"104":0.00472,"105":0.00944,"106":0.01887,"107":0.03303,"108":0.03774,"109":0.1321,"110":0.02359,"111":0.02359,"112":0.01415,"113":0.01887,"114":0.07077,"115":0.03303,"116":0.07077,"117":0.12739,"118":0.86339,"119":4.19902,_:"12 13 15 79 80 81 83 85 87 88 89 90 91 93 94 95 101 102"},E:{"13":0.00944,"14":0.08492,"15":0.02359,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 6.1 7.1 10.1","5.1":0.00944,"9.1":0.00944,"11.1":0.03774,"12.1":0.11795,"13.1":0.16985,"14.1":0.24534,"15.1":0.04718,"15.2-15.3":0.03774,"15.4":0.05662,"15.5":0.08021,"15.6":0.48595,"16.0":0.07549,"16.1":0.11795,"16.2":0.1038,"16.3":0.25005,"16.4":0.10851,"16.5":0.25005,"16.6":1.15119,"17.0":0.41518,"17.1":0.62749,"17.2":0.00944},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00323,"5.0-5.1":0.00323,"6.0-6.1":0.00808,"7.0-7.1":0.01132,"8.1-8.4":0.00162,"9.0-9.2":0.01293,"9.3":0.04042,"10.0-10.2":0.00323,"10.3":0.05821,"11.0-11.2":0.02749,"11.3-11.4":0.02425,"12.0-12.1":0.01455,"12.2-12.5":0.26516,"13.0-13.1":0.00647,"13.2":0.02749,"13.3":0.01617,"13.4-13.7":0.04689,"14.0-14.4":0.1245,"14.5-14.8":0.2021,"15.0-15.1":0.07922,"15.2-15.3":0.09701,"15.4":0.10833,"15.5":0.15198,"15.6-15.7":0.79871,"16.0":0.3751,"16.1":0.75182,"16.2":0.36055,"16.3":0.67583,"16.4":0.13905,"16.5":0.35893,"16.6-16.7":6.08409,"17.0":1.82216,"17.1":3.06064,"17.2":0.08731},P:{"4":0.05341,"20":0.06409,"21":0.1175,"22":0.2884,"23":2.14696,_:"5.0-5.4 6.2-6.4 8.2 10.1 12.0","7.2-7.4":0.01068,"9.2":0.01068,"11.1-11.2":0.02136,"13.0":0.02136,"14.0":0.02136,"15.0":0.01068,"16.0":0.02136,"17.0":0.02136,"18.0":0.03204,"19.0":0.04273},I:{"0":0.08409,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00025},K:{"0":0.57046,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00501,"9":0.02506,"11":0.13033,_:"6 7 10 5.5"},N:{_:"10 11"},S:{"2.5":0.00528,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.5282},H:{"0":0},L:{"0":32.31806},R:{_:"0"},M:{"0":0.58102},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GA.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GA.js
    index 861ccb53423431..235890e3399410 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GA.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GA.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00298,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00596,"49":0,"50":0,"51":0,"52":0.00298,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00298,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00298,"103":0,"104":0,"105":0,"106":0,"107":0.00298,"108":0,"109":0,"110":0,"111":0,"112":0.00596,"113":0,"114":0,"115":0.03873,"116":0.00894,"117":0.25024,"118":0.04171,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.00596,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00298,"67":0,"68":0,"69":0.00894,"70":0,"71":0,"72":0,"73":0.00298,"74":0,"75":0.00298,"76":0,"77":0.00298,"78":0,"79":0.02085,"80":0.00894,"81":0.03277,"83":0.01787,"84":0.00596,"85":0,"86":0,"87":0.00596,"88":0.00596,"89":0.02383,"90":0,"91":0,"92":0,"93":0,"94":0.05064,"95":0.02383,"96":0,"97":0,"98":0.0149,"99":0,"100":0,"101":0.00596,"102":0.01787,"103":0.01192,"104":0,"105":0,"106":0.0149,"107":0,"108":0,"109":0.87285,"110":0.00894,"111":0.00298,"112":0.03575,"113":0.01192,"114":0.09235,"115":0.11022,"116":2.47257,"117":0.72986,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00894,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00298,"58":0.01192,"60":0.00596,"62":0,"63":0.00596,"64":0,"65":0,"66":0.00596,"67":0.00298,"68":0.00298,"69":0.04171,"70":0.0149,"71":0.06852,"72":0.24428,"73":0.08937,"74":0,"75":0,"76":0,"77":0.00596,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.06256,"96":0,"97":0,"98":0,"99":0,"100":0.00298,"101":0.07448,"102":0.09235,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0.00298,"11.5":0,"11.6":0,"12.1":0.00298},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00298,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00894,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00298,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00298,"109":0.02681,"110":0,"111":0.02979,"112":0,"113":0.00894,"114":0.01192,"115":0.02085,"116":0.74177,"117":0.48856},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00596,"14.1":0.00298,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.02085,"15.6":0.02085,"16.0":0,"16.1":0,"16.2":0.00298,"16.3":0.00298,"16.4":0.00298,"16.5":0.01192,"16.6":0.02383,"17.0":0,"17.1":0},G:{"8":0.00992,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00662,"6.0-6.1":0.00331,"7.0-7.1":0.49282,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.07607,"10.0-10.2":0,"10.3":0.1108,"11.0-11.2":0.08269,"11.3-11.4":0.36383,"12.0-12.1":0.18191,"12.2-12.5":3.96573,"13.0-13.1":0,"13.2":0,"13.3":0.00331,"13.4-13.7":0.02481,"14.0-14.4":0.10915,"14.5-14.8":0.18853,"15.0-15.1":0.48951,"15.2-15.3":0.10419,"15.4":0.02646,"15.5":0.26129,"15.6-15.7":3.78547,"16.0":0.12238,"16.1":0.55897,"16.2":0.18191,"16.3":0.62016,"16.4":0.15545,"16.5":0.49282,"16.6":3.28438,"17.0":0.70947,"17.1":0.00496},P:{"4":0.41678,"20":0.20331,"21":0.16265,"22":1.69762,"5.0-5.4":0.01017,"6.2-6.4":0.02033,"7.2-7.4":0.41678,"8.2":0,"9.2":0.01017,"10.1":0,"11.1-11.2":0.08132,"12.0":0,"13.0":0.01017,"14.0":0.01017,"15.0":0.02033,"16.0":0.09149,"17.0":0.02033,"18.0":0.08132,"19.0":0.06099},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00259,"4.4":0,"4.4.3-4.4.4":0.09699},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00894,"5.5":0},S:{"2.5":0.02808,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":67.55528},R:{_:"0"},M:{"0":0.04213},Q:{"13.1":0},O:{"0":0.17553},H:{"0":2.09381}};
    +module.exports={C:{"33":0.00258,"37":0.00258,"41":0.00258,"52":0.01288,"69":0.00258,"72":0.00258,"78":0.03605,"88":0.00515,"91":0.00773,"107":0.01288,"112":0.00773,"115":0.14163,"118":0.0103,"119":0.76735,"120":0.33733,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 38 39 40 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 70 71 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 90 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 108 109 110 111 113 114 116 117 121 122 123 3.5 3.6"},D:{"11":0.00515,"33":0.00258,"39":0.00258,"40":0.00258,"49":0.0103,"50":0.00515,"55":0.00258,"56":0.00258,"57":0.00258,"58":0.00258,"63":0.00258,"65":0.00258,"69":0.00515,"70":0.02318,"72":0.00258,"73":0.01288,"74":0.00515,"75":0.1442,"76":0.00258,"79":0.103,"83":0.0618,"84":0.03348,"87":0.01288,"88":0.01545,"89":0.08755,"93":0.00258,"95":0.01545,"98":0.1648,"99":0.00258,"101":0.02318,"102":0.10558,"103":0.03348,"105":0.00515,"106":0.0515,"107":0.00258,"108":0.00515,"109":2.02653,"110":0.25493,"111":0.00258,"112":0.12875,"113":0.00515,"114":0.01803,"115":0.02575,"116":0.30385,"117":0.09785,"118":2.39475,"119":9.75668,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 37 38 41 42 43 44 45 46 47 48 51 52 53 54 59 60 61 62 64 66 67 68 71 77 78 80 81 85 86 90 91 92 94 96 97 100 104 120 121 122"},F:{"28":0.01288,"46":0.02318,"89":0.0103,"95":0.5459,"97":0.00258,"102":0.02575,"103":0.10558,"104":0.4635,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 90 91 92 93 94 96 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"15":0.00258,"16":0.00515,"17":0.00258,"18":0.00258,"92":0.0103,"105":0.00258,"106":0.00258,"107":0.00258,"109":0.07725,"113":0.01545,"114":0.00258,"115":0.0103,"116":0.0103,"117":0.0309,"118":0.53045,"119":2.5132,_:"12 13 14 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 108 110 111 112"},E:{"14":0.00258,"15":0.00258,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 6.1 7.1 9.1 10.1 11.1 12.1 15.2-15.3 16.0","5.1":0.00515,"13.1":0.02318,"14.1":0.00515,"15.1":0.00515,"15.4":0.00515,"15.5":0.0103,"15.6":0.1133,"16.1":0.0103,"16.2":0.00773,"16.3":0.02575,"16.4":0.0412,"16.5":0.00258,"16.6":0.02833,"17.0":0.02318,"17.1":0.0721,"17.2":0.00258},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00238,"5.0-5.1":0.00238,"6.0-6.1":0.00595,"7.0-7.1":0.00833,"8.1-8.4":0.00119,"9.0-9.2":0.00952,"9.3":0.02974,"10.0-10.2":0.00238,"10.3":0.04282,"11.0-11.2":0.02022,"11.3-11.4":0.01784,"12.0-12.1":0.01071,"12.2-12.5":0.19508,"13.0-13.1":0.00476,"13.2":0.02022,"13.3":0.01189,"13.4-13.7":0.0345,"14.0-14.4":0.09159,"14.5-14.8":0.14869,"15.0-15.1":0.05828,"15.2-15.3":0.07137,"15.4":0.0797,"15.5":0.11181,"15.6-15.7":0.58761,"16.0":0.27596,"16.1":0.55311,"16.2":0.26526,"16.3":0.4972,"16.4":0.1023,"16.5":0.26407,"16.6-16.7":4.47603,"17.0":1.34055,"17.1":2.2517,"17.2":0.06423},P:{"4":0.155,"20":0.20667,"21":0.10333,"22":0.434,"23":1.35366,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 12.0","7.2-7.4":0.70266,"11.1-11.2":0.217,"13.0":0.01033,"14.0":0.01033,"15.0":0.01033,"16.0":0.14467,"17.0":0.04133,"18.0":0.04133,"19.0":0.05167},I:{"0":0.05172,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00004,"4.4":0,"4.4.3-4.4.4":0.00016},K:{"0":1.73913,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.02833,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.00743,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.12623},H:{"0":0.08},L:{"0":59.2087},R:{_:"0"},M:{"0":0.05198},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GB.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GB.js
    index 14e0534fb32632..1c6743e22f68d9 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GB.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GB.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.0052,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.0052,"49":0,"50":0,"51":0,"52":0.01039,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0.01039,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.01039,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.0052,"90":0.0052,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.01559,"103":0,"104":0.0052,"105":0,"106":0.0052,"107":0,"108":0.0052,"109":0.0052,"110":0,"111":0.0052,"112":0.0052,"113":0.01559,"114":0.0052,"115":0.08835,"116":0.07276,"117":0.72238,"118":0.06236,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.01039,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.02599,"57":0,"58":0,"59":0,"60":0.02079,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.04677,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0.0052,"75":0.0052,"76":0.01039,"77":0.0052,"78":0.0052,"79":0.02079,"80":0.0052,"81":0.01559,"83":0.01559,"84":0.0052,"85":0.0052,"86":0.01039,"87":0.01559,"88":0.01039,"89":0.0052,"90":0.0052,"91":0.02079,"92":0.01039,"93":0.05197,"94":0.0052,"95":0.0052,"96":0.04677,"97":0.0052,"98":0.01039,"99":0.01039,"100":0.01039,"101":0.01559,"102":0.01039,"103":0.1767,"104":0.01559,"105":0.02599,"106":0.02599,"107":0.02599,"108":0.02599,"109":0.53009,"110":0.02079,"111":0.03118,"112":0.06756,"113":0.06236,"114":0.32741,"115":0.62884,"116":10.42518,"117":2.60889,"118":0.0052,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.0052,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.01559,"73":0.0052,"74":0,"75":0,"76":0,"77":0.01559,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01039,"96":0,"97":0,"98":0,"99":0.0052,"100":0.07276,"101":0.15071,"102":0.30143,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.0052,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.0052,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.0052,"108":0.0052,"109":0.04677,"110":0.0052,"111":0.0052,"112":0.01039,"113":0.01559,"114":0.05197,"115":0.21308,"116":2.79079,"117":2.15156},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.0052,"14":0.04158,"15":0.0052,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.0052,"10.1":0,"11.1":0.01039,"12.1":0.01039,"13.1":0.06236,"14.1":0.11953,"15.1":0.01559,"15.2-15.3":0.01559,"15.4":0.02599,"15.5":0.04158,"15.6":0.32741,"16.0":0.03118,"16.1":0.06236,"16.2":0.07796,"16.3":0.1767,"16.4":0.06236,"16.5":0.30143,"16.6":1.7306,"17.0":0.07276,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.01102,"8.1-8.4":0.00735,"9.0-9.2":0,"9.3":0.202,"10.0-10.2":0,"10.3":0.17997,"11.0-11.2":0.04407,"11.3-11.4":0.06978,"12.0-12.1":0.01836,"12.2-12.5":0.85943,"13.0-13.1":0.00735,"13.2":0.00367,"13.3":0.0404,"13.4-13.7":0.05142,"14.0-14.4":0.13589,"14.5-14.8":0.40768,"15.0-15.1":0.09182,"15.2-15.3":0.1212,"15.4":0.13957,"15.5":0.22771,"15.6-15.7":2.83539,"16.0":0.96594,"16.1":2.01268,"16.2":0.89249,"16.3":1.70784,"16.4":0.19466,"16.5":0.7419,"16.6":22.52149,"17.0":1.75559,"17.1":0.00735},P:{"4":0.04211,"20":0.06316,"21":0.1579,"22":3.09474,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.01053,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01053,"12.0":0,"13.0":0.01053,"14.0":0.02105,"15.0":0.01053,"16.0":0.02105,"17.0":0.02105,"18.0":0.02105,"19.0":0.03158},I:{"0":0,"3":0,"4":0.06266,"2.1":0,"2.2":0,"2.3":0,"4.1":0.01566,"4.2-4.3":0.05482,"4.4":0,"4.4.3-4.4.4":0.30545},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.0052,"9":0.0052,"10":0,"11":0.03638,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":30.90713},R:{_:"0"},M:{"0":0.29779},Q:{"13.1":0},O:{"0":0.12008},H:{"0":0.20008}};
    +module.exports={C:{"48":0.02887,"52":0.01925,"59":0.02406,"60":0.00481,"65":0.00962,"66":0.00481,"68":0.00481,"78":0.01444,"83":0.00481,"88":0.00962,"89":0.00481,"91":0.00481,"93":0.00481,"94":0.00962,"102":0.00481,"105":0.00481,"106":0.00481,"107":0.00481,"108":0.00481,"109":0.00481,"110":0.00481,"111":0.00481,"112":0.00481,"113":0.00481,"114":0.00481,"115":0.2406,"116":0.00962,"117":0.01925,"118":0.11068,"119":1.25112,"120":0.29353,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 49 50 51 53 54 55 56 57 58 61 62 63 64 67 69 70 71 72 73 74 75 76 77 79 80 81 82 84 85 86 87 90 92 95 96 97 98 99 100 101 103 104 121 122 123 3.5 3.6"},D:{"33":0.00481,"38":0.00481,"39":0.00481,"40":0.00481,"41":0.00481,"42":0.00481,"43":0.00481,"44":0.00481,"45":0.00481,"46":0.00481,"47":0.00481,"48":0.00481,"49":0.02406,"50":0.00481,"51":0.00481,"52":0.00481,"53":0.00481,"54":0.00481,"55":0.00481,"56":0.00481,"57":0.00481,"58":0.00481,"59":0.00481,"60":0.02887,"65":0.00481,"66":0.10105,"70":0.00481,"72":0.00962,"73":0.01925,"74":0.00962,"75":0.00481,"76":0.01444,"77":0.00481,"79":0.02887,"80":0.00481,"81":0.01444,"83":0.00962,"84":0.00481,"85":0.00962,"86":0.02406,"87":0.02887,"88":0.01444,"89":0.00962,"90":0.00481,"91":0.02887,"92":0.04812,"93":0.09624,"94":0.01444,"95":0.01925,"96":0.08662,"97":0.00481,"98":0.01444,"99":0.01925,"100":0.02406,"101":0.0385,"102":0.02406,"103":0.26947,"104":0.02887,"105":0.02887,"106":0.01925,"107":0.04331,"108":0.04331,"109":1.13563,"110":0.03368,"111":0.0385,"112":0.05774,"113":0.06256,"114":0.35128,"115":0.11549,"116":0.60631,"117":0.72661,"118":6.59244,"119":16.99117,"120":0.02406,"121":0.00481,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 37 61 62 63 64 67 68 69 71 78 122"},F:{"46":0.00481,"95":0.01444,"102":0.42827,"103":0.07699,"104":0.38015,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"17":0.01444,"18":0.00481,"85":0.00481,"92":0.00962,"95":0.00481,"106":0.00481,"107":0.00962,"108":0.00481,"109":0.07218,"110":0.00481,"111":0.00481,"112":0.00962,"113":0.01444,"114":0.02887,"115":0.01925,"116":0.04812,"117":0.23579,"118":1.66976,"119":7.16026,_:"12 13 14 15 16 79 80 81 83 84 86 87 88 89 90 91 93 94 96 97 98 99 100 101 102 103 104 105"},E:{"12":0.00481,"13":0.00962,"14":0.07218,"15":0.01444,_:"0 4 5 6 7 8 9 10 11 3.1 3.2 5.1 6.1 7.1 9.1 10.1","11.1":0.02406,"12.1":0.02406,"13.1":0.11068,"14.1":0.21173,"15.1":0.02887,"15.2-15.3":0.02887,"15.4":0.05293,"15.5":0.07699,"15.6":0.71699,"16.0":0.06256,"16.1":0.11549,"16.2":0.13474,"16.3":0.30797,"16.4":0.17323,"16.5":0.33203,"16.6":2.34826,"17.0":0.46195,"17.1":1.31849,"17.2":0.01925},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00488,"5.0-5.1":0.00488,"6.0-6.1":0.01219,"7.0-7.1":0.01707,"8.1-8.4":0.00244,"9.0-9.2":0.01951,"9.3":0.06096,"10.0-10.2":0.00488,"10.3":0.08778,"11.0-11.2":0.04145,"11.3-11.4":0.03658,"12.0-12.1":0.02195,"12.2-12.5":0.39989,"13.0-13.1":0.00975,"13.2":0.04145,"13.3":0.02438,"13.4-13.7":0.07071,"14.0-14.4":0.18775,"14.5-14.8":0.3048,"15.0-15.1":0.11948,"15.2-15.3":0.1463,"15.4":0.16337,"15.5":0.22921,"15.6-15.7":1.20455,"16.0":0.5657,"16.1":1.13384,"16.2":0.54375,"16.3":1.01923,"16.4":0.2097,"16.5":0.54132,"16.6-16.7":9.17555,"17.0":2.74803,"17.1":4.61582,"17.2":0.13167},P:{"4":0.03302,"20":0.04403,"21":0.11008,"22":0.22015,"23":3.26925,_:"5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 12.0 15.0","11.1-11.2":0.01101,"13.0":0.01101,"14.0":0.02202,"16.0":0.01101,"17.0":0.02202,"18.0":0.01101,"19.0":0.03302},I:{"0":0.03613,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00011},K:{"0":0.22865,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00508,"9":0.01016,"11":0.07619,_:"6 7 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.10895},H:{"0":0.01},L:{"0":23.0905},R:{_:"0"},M:{"0":0.42542},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GD.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GD.js
    index 22c43aab42c85d..424a486ebeaacd 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GD.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GD.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.01078,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.01617,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.02695,"103":0,"104":0,"105":0.00539,"106":0,"107":0,"108":0.00539,"109":0,"110":0,"111":0,"112":0.00539,"113":0,"114":0,"115":0.03772,"116":0.09161,"117":0.68979,"118":0.04311,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00539,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00539,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0.01617,"77":0.02156,"78":0,"79":0.00539,"80":0,"81":0,"83":0.00539,"84":0,"85":0,"86":0,"87":0.02695,"88":0.02695,"89":0,"90":0,"91":0,"92":0.00539,"93":0.01617,"94":0,"95":0,"96":0,"97":0,"98":0.00539,"99":0,"100":0,"101":0,"102":0.00539,"103":0.33412,"104":0.01078,"105":0.00539,"106":0.13473,"107":0.19939,"108":0.22095,"109":0.99158,"110":0.21556,"111":0.42034,"112":0.22634,"113":0.00539,"114":0.68979,"115":0.25867,"116":10.18521,"117":4.22498,"118":0.01617,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.01078,"71":0,"72":0.03772,"73":0.00539,"74":0,"75":0,"76":0,"77":0.02695,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00539,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00539,"96":0,"97":0.22095,"98":0,"99":0.02695,"100":0.04311,"101":0.17245,"102":0.10239,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00539,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.01617,"110":0,"111":0.21017,"112":0.194,"113":0.00539,"114":0.02156,"115":0.12395,"116":1.54664,"117":1.57898},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00539,"14":0.00539,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00539,"13.1":0.02156,"14.1":0.07006,"15.1":0,"15.2-15.3":0.00539,"15.4":0.00539,"15.5":0.03772,"15.6":0.38801,"16.0":0.01078,"16.1":0.04311,"16.2":0.04311,"16.3":0.15089,"16.4":0.04311,"16.5":0.69518,"16.6":1.78376,"17.0":0.04311,"17.1":0},G:{"8":0.00203,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.0324,"6.0-6.1":0,"7.0-7.1":0.01418,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.03848,"10.0-10.2":0,"10.3":0.05468,"11.0-11.2":0.01823,"11.3-11.4":0.02633,"12.0-12.1":0.01013,"12.2-12.5":0.46779,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0.00608,"14.0-14.4":0.03038,"14.5-14.8":0.09315,"15.0-15.1":0.33616,"15.2-15.3":0.01823,"15.4":0.02228,"15.5":1.07935,"15.6-15.7":1.0834,"16.0":0.30983,"16.1":0.87077,"16.2":0.27136,"16.3":0.39488,"16.4":0.0729,"16.5":0.52246,"16.6":12.91776,"17.0":1.2454,"17.1":0},P:{"4":0.0103,"20":0.03091,"21":0.05151,"22":2.51374,"5.0-5.4":0.0103,"6.2-6.4":0,"7.2-7.4":0.19574,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.0206,"12.0":0,"13.0":0.0103,"14.0":0,"15.0":0,"16.0":0.05151,"17.0":0.0103,"18.0":0,"19.0":0.03091},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.62734},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01078,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0.00461},N:{"10":0,"11":0},L:{"0":46.51484},R:{_:"0"},M:{"0":0.11528},Q:{"13.1":0},O:{"0":0.05072},H:{"0":0.54567}};
    +module.exports={C:{"52":0.02389,"103":0.04777,"108":0.00398,"115":0.11147,"116":0.00398,"117":0.00398,"118":0.01194,"119":0.60511,"120":0.15924,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 104 105 106 107 109 110 111 112 113 114 121 122 123 3.5 3.6"},D:{"47":0.00398,"49":0.00398,"57":0.01194,"70":0.00796,"73":0.00796,"76":0.03583,"78":0.00398,"79":0.03981,"81":0.02389,"83":0.00796,"85":0.00398,"86":0.00398,"87":0.00398,"88":0.00796,"90":0.00398,"91":0.00398,"92":0.01194,"93":0.02389,"95":0.00796,"96":0.00398,"97":0.00398,"102":0.00796,"103":0.09554,"104":0.00398,"105":0.01991,"106":0.00796,"107":0.00398,"108":0.01991,"109":0.81212,"110":0.00796,"111":0.01194,"112":0.00796,"113":0.02787,"114":0.10351,"115":0.06768,"116":0.23886,"117":1.73572,"118":4.85682,"119":16.07926,"120":0.02787,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 48 50 51 52 53 54 55 56 58 59 60 61 62 63 64 65 66 67 68 69 71 72 74 75 77 80 84 89 94 98 99 100 101 121 122"},F:{"28":0.01194,"101":0.00398,"102":0.22692,"103":0.04777,"104":0.34237,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.00398},B:{"18":0.00398,"83":0.00796,"92":0.02787,"100":0.01194,"101":0.00398,"107":0.01194,"109":0.02787,"111":0.00398,"115":0.01194,"116":0.00796,"117":0.11545,"118":0.84397,"119":4.28356,_:"12 13 14 15 16 17 79 80 81 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 102 103 104 105 106 108 110 112 113 114"},E:{"14":0.01991,"15":0.03981,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 17.2","12.1":0.04379,"13.1":0.11147,"14.1":0.15128,"15.1":0.00398,"15.2-15.3":0.00398,"15.4":0.01592,"15.5":0.0836,"15.6":0.57725,"16.0":0.01592,"16.1":0.05573,"16.2":0.17118,"16.3":0.11147,"16.4":0.09156,"16.5":0.1473,"16.6":0.90369,"17.0":1.047,"17.1":1.1107},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00277,"5.0-5.1":0.00277,"6.0-6.1":0.00694,"7.0-7.1":0.00971,"8.1-8.4":0.00139,"9.0-9.2":0.0111,"9.3":0.03468,"10.0-10.2":0.00277,"10.3":0.04993,"11.0-11.2":0.02358,"11.3-11.4":0.02081,"12.0-12.1":0.01248,"12.2-12.5":0.22747,"13.0-13.1":0.00555,"13.2":0.02358,"13.3":0.01387,"13.4-13.7":0.04022,"14.0-14.4":0.1068,"14.5-14.8":0.17338,"15.0-15.1":0.06796,"15.2-15.3":0.08322,"15.4":0.09293,"15.5":0.13038,"15.6-15.7":0.68518,"16.0":0.32179,"16.1":0.64496,"16.2":0.3093,"16.3":0.57977,"16.4":0.11928,"16.5":0.30792,"16.6-16.7":5.21931,"17.0":1.56316,"17.1":2.62561,"17.2":0.0749},P:{"4":0.14932,"20":0.12799,"21":0.18131,"22":0.14932,"23":3.76495,_:"5.0-5.4 6.2-6.4 8.2 12.0 14.0 15.0","7.2-7.4":0.12799,"9.2":0.01067,"10.1":0.01067,"11.1-11.2":0.01067,"13.0":0.01067,"16.0":0.06399,"17.0":0.01067,"18.0":0.02133,"19.0":0.032},I:{"0":0.02995,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.00009},K:{"0":0.37926,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.00398,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.2107},H:{"0":0},L:{"0":44.28655},R:{_:"0"},M:{"0":0.07224},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GE.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GE.js
    index b15ac163f4c6a8..9c7e73a29133f8 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GE.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GE.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.0134,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00447,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00893,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00447,"89":0,"90":0,"91":0.00447,"92":0.00447,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00893,"100":0,"101":0,"102":0.00893,"103":0,"104":0,"105":0.00447,"106":0,"107":0,"108":0,"109":0.00447,"110":0,"111":0,"112":0,"113":0.03573,"114":0,"115":0.11165,"116":0.05359,"117":0.30815,"118":0.0268,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00447,"39":0,"40":0,"41":0.00447,"42":0,"43":0.00447,"44":0.00447,"45":0.00447,"46":0.00447,"47":0.0134,"48":0,"49":0.0134,"50":0,"51":0.00447,"52":0,"53":0,"54":0,"55":0,"56":0.00447,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.00447,"64":0,"65":0,"66":0.00447,"67":0,"68":0.0134,"69":0.00447,"70":0.00447,"71":0,"72":0,"73":0.0134,"74":0.00447,"75":0,"76":0.06252,"77":0.0134,"78":0.0134,"79":0.08039,"80":0.09825,"81":0.10272,"83":0.04913,"84":0.00447,"85":0.01786,"86":0.00447,"87":0.06699,"88":0.08485,"89":0.00447,"90":0.16078,"91":0.00447,"92":0.00447,"93":0,"94":0.00447,"95":0.06252,"96":0.00447,"97":0.00447,"98":0.14738,"99":0.0268,"100":0.05359,"101":0.00447,"102":0.01786,"103":0.04466,"104":0.00447,"105":0.0134,"106":0.03126,"107":0.02233,"108":0.01786,"109":2.21067,"110":0.00893,"111":0.03126,"112":0.06699,"113":0.03126,"114":0.15184,"115":0.2099,"116":7.68152,"117":2.40717,"118":0.00447,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00893,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00447,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.0268,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.00447,"64":0,"65":0,"66":0.00447,"67":0,"68":0.00447,"69":0,"70":0,"71":0,"72":0.02233,"73":0.00447,"74":0.00447,"75":0,"76":0.00447,"77":0.0134,"78":0.00447,"79":0.00893,"80":0,"81":0.00447,"82":0,"83":0,"84":0.00447,"85":0.0134,"86":0.00447,"87":0.01786,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.00447,"95":0.32602,"96":0,"97":0,"98":0,"99":0.00893,"100":0.07592,"101":0.50019,"102":0.50019,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00447,"13":0.01786,"14":0.0134,"15":0.00893,"16":0.00893,"17":0,"18":0.01786,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00447,"89":0,"90":0,"91":0,"92":0.00893,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00893,"101":0.00447,"102":0,"103":0,"104":0,"105":0,"106":0.00447,"107":0.00447,"108":0,"109":0.01786,"110":0.0134,"111":0.00447,"112":0.00447,"113":0.00893,"114":0.04913,"115":0.04019,"116":0.66543,"117":0.50019},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00447,"10":0,"11":0,"12":0,"13":0,"14":0.00893,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00447,"10.1":0,"11.1":0,"12.1":0,"13.1":0.01786,"14.1":0.0268,"15.1":0.00893,"15.2-15.3":0.00447,"15.4":0.00893,"15.5":0.0134,"15.6":0.05359,"16.0":0.00447,"16.1":0.03573,"16.2":0.0134,"16.3":0.07146,"16.4":0.01786,"16.5":0.05806,"16.6":0.26796,"17.0":0.02233,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.05251,"6.0-6.1":0.00194,"7.0-7.1":0.12642,"8.1-8.4":0.00972,"9.0-9.2":0.00194,"9.3":0.04862,"10.0-10.2":0,"10.3":0.08752,"11.0-11.2":0.05251,"11.3-11.4":0.00583,"12.0-12.1":0.02528,"12.2-12.5":0.5932,"13.0-13.1":0.00778,"13.2":0.00778,"13.3":2.43893,"13.4-13.7":0.04084,"14.0-14.4":0.14587,"14.5-14.8":0.33064,"15.0-15.1":0.11281,"15.2-15.3":0.0953,"15.4":0.09336,"15.5":0.17504,"15.6-15.7":1.69014,"16.0":0.66322,"16.1":0.8791,"16.2":0.45122,"16.3":0.93551,"16.4":0.22367,"16.5":0.57959,"16.6":7.68827,"17.0":1.66485,"17.1":0.00389},P:{"4":0.65757,"20":0.06263,"21":0.10438,"22":1.32557,"5.0-5.4":0.03131,"6.2-6.4":0.02088,"7.2-7.4":0.07306,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.02088,"12.0":0,"13.0":0.03131,"14.0":0,"15.0":0.01044,"16.0":0.02088,"17.0":0.03131,"18.0":0.02088,"19.0":0.05219},I:{"0":0,"3":0,"4":0.05018,"2.1":0,"2.2":0.02007,"2.3":0.04014,"4.1":0.04014,"4.2-4.3":0.13046,"4.4":0,"4.4.3-4.4.4":0.66232},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0.00502,"8":0.0201,"9":0.00502,"10":0.0201,"11":0.03015,"5.5":0},S:{"2.5":0.04427,_:"3.0-3.1"},J:{"7":0,"10":0.00553},N:{"10":0.01107,"11":0},L:{"0":55.79191},R:{_:"0"},M:{"0":0.11621},Q:{"13.1":0},O:{"0":0.04981},H:{"0":0.36675}};
    +module.exports={C:{"34":0.00422,"52":0.00843,"68":0.00843,"78":0.02108,"88":0.02951,"90":0.00422,"91":0.00422,"99":0.03372,"100":0.01686,"104":0.00422,"109":0.00422,"110":0.00422,"113":0.05058,"114":0.00422,"115":0.21075,"117":0.01265,"118":0.02951,"119":0.59853,"120":0.16439,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 92 93 94 95 96 97 98 101 102 103 105 106 107 108 111 112 116 121 122 123 3.5 3.6"},D:{"11":0.00422,"38":0.00422,"39":0.00422,"42":0.00422,"43":0.00422,"44":0.00422,"45":0.00422,"46":0.00422,"47":0.02108,"49":0.02529,"51":0.00843,"56":0.00843,"61":0.00422,"62":0.00422,"63":0.00843,"66":0.00843,"67":0.00422,"68":0.00422,"70":0.00843,"72":0.00422,"73":0.02529,"75":0.00843,"76":0.00422,"77":0.00422,"78":0.01686,"79":0.27398,"80":0.00422,"81":0.00843,"83":0.11381,"84":0.00422,"85":0.00843,"86":0.01686,"87":0.1391,"88":0.04637,"89":0.00422,"90":0.03794,"91":0.00843,"92":0.01265,"93":0.01265,"94":0.02951,"95":0.01265,"96":0.01265,"97":0.00422,"98":0.04215,"99":0.01265,"100":0.01265,"101":0.01265,"102":0.04215,"103":0.10538,"104":0.01686,"105":0.00843,"106":0.04637,"107":0.03372,"108":0.05901,"109":5.07065,"110":0.02951,"111":0.02529,"112":0.06744,"113":0.02529,"114":0.09273,"115":0.04637,"116":0.32034,"117":0.34985,"118":4.70816,"119":18.58394,"120":0.00843,"121":0.00422,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 40 41 48 50 52 53 54 55 57 58 59 60 64 65 69 71 74 122"},F:{"28":0.02529,"36":0.00422,"46":0.05901,"63":0.01265,"66":0.00843,"67":0.00422,"73":0.00422,"77":0.00843,"79":0.06744,"82":0.00422,"84":0.00422,"85":0.02951,"86":0.00843,"87":0.01686,"89":0.00422,"93":0.00422,"94":0.01265,"95":0.63647,"99":0.00422,"102":0.66176,"103":0.35828,"104":1.36145,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 64 65 68 69 70 71 72 74 75 76 78 80 81 83 88 90 91 92 96 97 98 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00422,"13":0.03372,"14":0.02108,"15":0.00422,"16":0.02529,"17":0.00422,"18":0.0548,"84":0.00843,"87":0.00422,"92":0.01686,"100":0.00422,"108":0.00422,"109":0.04215,"110":0.01265,"111":0.00843,"112":0.00843,"113":0.01265,"114":0.02529,"115":0.02108,"116":0.07587,"117":0.11802,"118":0.55217,"119":2.60909,_:"79 80 81 83 85 86 88 89 90 91 93 94 95 96 97 98 99 101 102 103 104 105 106 107"},E:{"9":0.00843,"13":0.00422,"14":0.01686,"15":0.00422,_:"0 4 5 6 7 8 10 11 12 3.1 3.2 6.1 7.1 9.1 10.1 11.1","5.1":0.00422,"12.1":0.01686,"13.1":0.02951,"14.1":0.09695,"15.1":0.00843,"15.2-15.3":0.01265,"15.4":0.01686,"15.5":0.01265,"15.6":0.08852,"16.0":0.01265,"16.1":0.10538,"16.2":0.02108,"16.3":0.09695,"16.4":0.05058,"16.5":0.0843,"16.6":0.25712,"17.0":0.21075,"17.1":0.27819,"17.2":0.00422},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00239,"5.0-5.1":0.00239,"6.0-6.1":0.00597,"7.0-7.1":0.00836,"8.1-8.4":0.00119,"9.0-9.2":0.00955,"9.3":0.02984,"10.0-10.2":0.00239,"10.3":0.04297,"11.0-11.2":0.02029,"11.3-11.4":0.0179,"12.0-12.1":0.01074,"12.2-12.5":0.19576,"13.0-13.1":0.00477,"13.2":0.02029,"13.3":0.01194,"13.4-13.7":0.03462,"14.0-14.4":0.09191,"14.5-14.8":0.14921,"15.0-15.1":0.05849,"15.2-15.3":0.07162,"15.4":0.07997,"15.5":0.1122,"15.6-15.7":0.58966,"16.0":0.27693,"16.1":0.55505,"16.2":0.26618,"16.3":0.49895,"16.4":0.10265,"16.5":0.26499,"16.6-16.7":4.49171,"17.0":1.34525,"17.1":2.25958,"17.2":0.06446},P:{"4":0.66802,"20":0.05302,"21":0.06362,"22":0.22267,"23":1.1982,"5.0-5.4":0.02121,"6.2-6.4":0.03181,"7.2-7.4":0.05302,_:"8.2 10.1 12.0 14.0 15.0","9.2":0.0106,"11.1-11.2":0.0106,"13.0":0.02121,"16.0":0.0106,"17.0":0.03181,"18.0":0.02121,"19.0":0.05302},I:{"0":0.1612,"3":0.00002,"4":0.00003,"2.1":0,"2.2":0.00003,"2.3":0,"4.1":0.00002,"4.2-4.3":0.00011,"4.4":0,"4.4.3-4.4.4":0.00049},K:{"0":0.31402,_:"10 11 12 11.1 11.5 12.1"},A:{"7":0.00458,"8":0.03207,"9":0.00458,"10":0.00458,"11":0.05956,_:"6 5.5"},N:{_:"10 11"},S:{"2.5":0.00579,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.05786},H:{"0":0.01},L:{"0":43.00562},R:{_:"0"},M:{"0":0.08679},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GF.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GF.js
    index 9e4b420dd066c3..e9b1321362d2b2 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GF.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GF.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00394,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00788,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0.00788,"88":0.00788,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0.01182,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.05123,"103":0.00394,"104":0,"105":0,"106":0.00788,"107":0,"108":0.00394,"109":0.00394,"110":0.00394,"111":0.00394,"112":0.01182,"113":0.01182,"114":0.01182,"115":0.20493,"116":0.14976,"117":1.38329,"118":0.18129,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00394,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00394,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0.00394,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00394,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0.01971,"77":0,"78":0,"79":0.00394,"80":0,"81":0.00394,"83":0.00788,"84":0,"85":0,"86":0.00394,"87":0,"88":0,"89":0.00788,"90":0.00394,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0.00394,"98":0,"99":0.03153,"100":0,"101":0,"102":0,"103":0.02365,"104":0,"105":0.00788,"106":0.00394,"107":0,"108":0.02759,"109":0.34681,"110":0.00394,"111":0.01576,"112":0.03547,"113":0.02759,"114":0.07882,"115":0.09458,"116":4.92231,"117":1.26506,"118":0.00394,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00394,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.03153,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.01971,"73":0,"74":0,"75":0,"76":0,"77":0.00394,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00788,"93":0,"94":0,"95":0.00394,"96":0,"97":0,"98":0,"99":0,"100":0.16946,"101":0.08276,"102":0.21676,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0.01576,"16":0,"17":0,"18":0.02759,"79":0,"80":0.01971,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00788,"100":0,"101":0,"102":0.00394,"103":0,"104":0,"105":0.00394,"106":0,"107":0,"108":0,"109":0.01182,"110":0.00394,"111":0,"112":0.00394,"113":0.00788,"114":0.06306,"115":0.04335,"116":1.59611,"117":1.59611},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.01971,"14":0.04335,"15":0.00788,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00394,"13.1":0.04335,"14.1":0.14188,"15.1":0.01971,"15.2-15.3":0.00788,"15.4":0.00788,"15.5":0.04335,"15.6":0.09853,"16.0":0.01971,"16.1":0.06306,"16.2":0.03547,"16.3":0.11035,"16.4":0.05123,"16.5":0.16158,"16.6":0.61874,"17.0":0.02759,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.0183,"10.0-10.2":0,"10.3":0.02092,"11.0-11.2":0.00523,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0.12811,"13.0-13.1":0,"13.2":0,"13.3":0.0183,"13.4-13.7":0.06536,"14.0-14.4":0.47322,"14.5-14.8":0.95429,"15.0-15.1":0.05229,"15.2-15.3":0.07582,"15.4":0.17517,"15.5":0.1438,"15.6-15.7":1.67066,"16.0":1.47196,"16.1":1.01704,"16.2":1.05625,"16.3":1.21051,"16.4":0.17779,"16.5":1.16868,"16.6":13.95352,"17.0":2.03407,"17.1":0},P:{"4":0.04088,"20":0.12265,"21":0.21464,"22":3.31157,"5.0-5.4":0.01022,"6.2-6.4":0,"7.2-7.4":0.10221,"8.2":0,"9.2":0.01022,"10.1":0,"11.1-11.2":0.02044,"12.0":0,"13.0":0.02044,"14.0":0.02044,"15.0":0.01022,"16.0":0.03066,"17.0":0.03066,"18.0":0.04088,"19.0":0.21464},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.06547},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00394,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":52.67643},R:{_:"0"},M:{"0":0.53925},Q:{"13.1":0},O:{"0":0.01212},H:{"0":0.08604}};
    +module.exports={C:{"52":0.00893,"54":0.00447,"68":0.00893,"75":0.00447,"78":0.04912,"79":0.00447,"88":0.00447,"91":0.00893,"102":0.04912,"104":0.00447,"110":0.00893,"112":0.0134,"113":0.01786,"114":0.00447,"115":0.85282,"116":0.01786,"117":0.08484,"118":0.192,"119":3.84883,"120":1.25467,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 76 77 80 81 82 83 84 85 86 87 89 90 92 93 94 95 96 97 98 99 100 101 103 105 106 107 108 109 111 121 122 123 3.5 3.6"},D:{"53":0.00447,"55":0.00447,"56":0.00447,"60":0.0134,"65":0.00447,"69":0.01786,"72":0.00447,"76":0.05805,"79":0.00893,"80":0.00447,"87":0.00893,"88":0.00447,"89":0.13395,"93":0.00447,"99":0.10716,"102":0.01786,"103":0.28576,"105":0.00893,"107":0.01786,"108":0.00447,"109":0.92872,"110":0.00447,"111":0.09823,"112":0.00447,"113":0.00893,"114":0.08484,"115":0.08037,"116":0.34381,"117":0.18753,"118":3.7506,"119":12.83241,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 54 57 58 59 61 62 63 64 66 67 68 70 71 73 74 75 77 78 81 83 84 85 86 90 91 92 94 95 96 97 98 100 101 104 106 120 121 122"},F:{"28":0.0134,"36":0.00447,"46":0.01786,"95":0.02233,"101":0.0134,"102":0.20986,"103":0.33488,"104":0.893,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00447,"80":0.0134,"90":0.00447,"92":0.0134,"95":0.04019,"99":0.0134,"101":0.00893,"103":0.00447,"104":0.00447,"107":0.01786,"108":0.00447,"109":0.18307,"111":0.00447,"112":0.0134,"113":0.00447,"114":0.0134,"115":0.01786,"116":0.05805,"117":0.13842,"118":2.84867,"119":8.3049,_:"13 14 15 16 17 18 79 81 83 84 85 86 87 88 89 91 93 94 96 97 98 100 102 105 106 110"},E:{"13":0.03572,"14":0.06251,"15":0.0134,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 6.1 7.1 9.1 10.1 11.1","5.1":0.00447,"12.1":0.00447,"13.1":0.05805,"14.1":0.25451,"15.1":0.03572,"15.2-15.3":0.07591,"15.4":0.03126,"15.5":0.02679,"15.6":0.35274,"16.0":0.04019,"16.1":0.17414,"16.2":0.04912,"16.3":0.25451,"16.4":0.30809,"16.5":0.15181,"16.6":1.48685,"17.0":0.73226,"17.1":0.54027,"17.2":0.00447},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00278,"5.0-5.1":0.00278,"6.0-6.1":0.00694,"7.0-7.1":0.00972,"8.1-8.4":0.00139,"9.0-9.2":0.01111,"9.3":0.0347,"10.0-10.2":0.00278,"10.3":0.04997,"11.0-11.2":0.0236,"11.3-11.4":0.02082,"12.0-12.1":0.01249,"12.2-12.5":0.22766,"13.0-13.1":0.00555,"13.2":0.0236,"13.3":0.01388,"13.4-13.7":0.04026,"14.0-14.4":0.10689,"14.5-14.8":0.17352,"15.0-15.1":0.06802,"15.2-15.3":0.08329,"15.4":0.09301,"15.5":0.13049,"15.6-15.7":0.68576,"16.0":0.32206,"16.1":0.6455,"16.2":0.30956,"16.3":0.58026,"16.4":0.11938,"16.5":0.30818,"16.6-16.7":5.22371,"17.0":1.56448,"17.1":2.62782,"17.2":0.07496},P:{"20":0.06308,"21":0.08411,"22":0.3154,"23":2.19732,_:"4 5.0-5.4 6.2-6.4 8.2 9.2 10.1 15.0","7.2-7.4":0.25232,"11.1-11.2":0.12616,"12.0":0.01051,"13.0":0.02103,"14.0":0.01051,"16.0":0.04205,"17.0":0.01051,"18.0":0.01051,"19.0":0.72543},I:{"0":0.01652,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00005},K:{"0":0.23801,_:"10 11 12 11.1 11.5 12.1"},A:{"9":0.00447,"11":0.01786,_:"6 7 8 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.16052},H:{"0":0},L:{"0":37.58522},R:{_:"0"},M:{"0":0.28782},Q:{"13.1":0.00554}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GG.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GG.js
    index 71beffd0fa0cfe..0d706184aae375 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GG.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GG.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00489,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.04887,"103":0.00977,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0.01466,"115":0.01955,"116":0.0391,"117":0.81124,"118":0.04398,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0.12218,"77":0.02932,"78":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0.00489,"87":0.00489,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0.04887,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00977,"100":0,"101":0,"102":0,"103":0.02932,"104":0,"105":0,"106":0.02444,"107":0.00489,"108":0,"109":1.03604,"110":0,"111":0.00489,"112":0.02932,"113":0.00977,"114":0.30299,"115":0.37141,"116":6.94931,"117":2.47282,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00977,"73":0,"74":0,"75":0,"76":0,"77":0.00489,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.02444,"96":0,"97":0,"98":0,"99":0,"100":0.0391,"101":0.04398,"102":0.10751,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.01466,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.01466,"110":0,"111":0,"112":0,"113":0,"114":0.02444,"115":0.10263,"116":1.65669,"117":1.60294},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00489,"14":0.05864,"15":0.00489,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0.01466,"12.1":0,"13.1":0.1515,"14.1":0.16616,"15.1":0.00489,"15.2-15.3":0.00977,"15.4":0.08797,"15.5":0.07819,"15.6":0.55223,"16.0":0.55712,"16.1":0.04398,"16.2":0.15638,"16.3":0.16127,"16.4":0.04887,"16.5":0.27367,"16.6":3.81186,"17.0":0.10751,"17.1":0},G:{"8":0.02539,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0.01523,"7.0-7.1":0.01523,"8.1-8.4":0,"9.0-9.2":0.03046,"9.3":0.18278,"10.0-10.2":0,"10.3":0.45694,"11.0-11.2":0.01523,"11.3-11.4":0.02539,"12.0-12.1":0,"12.2-12.5":1.09158,"13.0-13.1":0,"13.2":0,"13.3":0.03554,"13.4-13.7":0.00508,"14.0-14.4":0.03046,"14.5-14.8":0.3097,"15.0-15.1":0.03046,"15.2-15.3":0.13708,"15.4":0.15739,"15.5":0.22847,"15.6-15.7":3.56414,"16.0":0.8885,"16.1":2.49794,"16.2":1.12204,"16.3":2.58933,"16.4":0.47725,"16.5":0.80726,"16.6":32.78297,"17.0":2.61472,"17.1":0},P:{"4":0.02129,"20":0.01065,"21":0.19165,"22":4.30147,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0.01065,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0.06388,"14.0":0.01065,"15.0":0,"16.0":0,"17.0":0.01065,"18.0":0.02129,"19.0":0.01065},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.32277},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.04398,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":18.82108},R:{_:"0"},M:{"0":0.74139},Q:{"13.1":0},O:{"0":0.02045},H:{"0":0.02904}};
    +module.exports={C:{"78":0.09948,"102":0.03316,"103":0.00474,"109":0.00474,"114":0.00474,"115":0.09,"118":0.06632,"119":2.29271,"120":0.55897,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 104 105 106 107 108 110 111 112 113 116 117 121 122 123 3.5 3.6"},D:{"49":0.00474,"76":0.44528,"77":0.0379,"79":0.01895,"83":0.00474,"93":0.10421,"95":0.00474,"97":0.01895,"98":0.00947,"99":0.00474,"103":0.07106,"105":0.02842,"108":0.00947,"109":1.50163,"110":0.04737,"111":0.00474,"112":0.0379,"113":0.01895,"114":0.04263,"115":0.06158,"116":0.64423,"117":0.63476,"118":3.86066,"119":13.1736,"120":0.00474,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 78 80 81 84 85 86 87 88 89 90 91 92 94 96 100 101 102 104 106 107 121 122"},F:{"95":0.06158,"99":0.01895,"102":0.2179,"103":0.05211,"104":0.32685,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"92":0.00474,"105":0.00474,"109":0.00474,"112":0.00474,"114":0.01895,"115":0.00947,"116":0.00474,"117":0.31738,"118":1.08951,"119":6.13915,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 106 107 108 110 111 113"},E:{"14":0.10895,"15":0.01895,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 5.1 6.1 7.1 9.1 10.1 17.2","11.1":0.02842,"12.1":0.04263,"13.1":0.23211,"14.1":0.38843,"15.1":0.00474,"15.2-15.3":0.01895,"15.4":0.22738,"15.5":0.09948,"15.6":2.59114,"16.0":0.84792,"16.1":0.27475,"16.2":0.16106,"16.3":0.39791,"16.4":0.23211,"16.5":0.35054,"16.6":5.34334,"17.0":0.82424,"17.1":2.39219},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.0066,"5.0-5.1":0.0066,"6.0-6.1":0.0165,"7.0-7.1":0.0231,"8.1-8.4":0.0033,"9.0-9.2":0.0264,"9.3":0.08251,"10.0-10.2":0.0066,"10.3":0.11882,"11.0-11.2":0.05611,"11.3-11.4":0.04951,"12.0-12.1":0.0297,"12.2-12.5":0.54127,"13.0-13.1":0.0132,"13.2":0.05611,"13.3":0.033,"13.4-13.7":0.09571,"14.0-14.4":0.25413,"14.5-14.8":0.41255,"15.0-15.1":0.16172,"15.2-15.3":0.19803,"15.4":0.22113,"15.5":0.31024,"15.6-15.7":1.63041,"16.0":0.7657,"16.1":1.5347,"16.2":0.736,"16.3":1.37958,"16.4":0.28384,"16.5":0.73269,"16.6-16.7":12.41951,"17.0":3.71958,"17.1":6.24771,"17.2":0.17822},P:{"20":0.02251,"21":0.02251,"22":0.30394,"23":3.69229,_:"4 5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 18.0 19.0","17.0":0.01126},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{"0":0.04737,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.05684,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{_:"0"},H:{"0":0},L:{"0":14.7501},R:{_:"0"},M:{"0":0.78419},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GH.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GH.js
    index 27e960c227ea28..d0b5cc5b81ae87 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GH.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GH.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00245,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00245,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0.00245,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0.00245,"98":0,"99":0,"100":0,"101":0,"102":0.00245,"103":0,"104":0.00245,"105":0,"106":0.00245,"107":0,"108":0,"109":0,"110":0.00245,"111":0.00245,"112":0.00245,"113":0.00735,"114":0.0049,"115":0.05633,"116":0.03674,"117":0.2547,"118":0.03184,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00245,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00245,"44":0,"45":0,"46":0,"47":0,"48":0.00245,"49":0.0049,"50":0.00245,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.00245,"64":0.00245,"65":0.00245,"66":0,"67":0,"68":0.00245,"69":0.00245,"70":0.0049,"71":0,"72":0.00245,"73":0.0049,"74":0.0049,"75":0.0049,"76":0.0049,"77":0.0049,"78":0,"79":0.0098,"80":0.00245,"81":0.0098,"83":0.00245,"84":0.00245,"85":0.0049,"86":0.0049,"87":0.0049,"88":0.0049,"89":0.00245,"90":0.00245,"91":0.0049,"92":0.0049,"93":0.0098,"94":0.00245,"95":0.00735,"96":0.00245,"97":0.00245,"98":0.0049,"99":0.0049,"100":0.00245,"101":0.00245,"102":0.0098,"103":0.02204,"104":0.0049,"105":0.00735,"106":0.01225,"107":0.00735,"108":0.01225,"109":0.4947,"110":0.00245,"111":0.00735,"112":0.0098,"113":0.01469,"114":0.04898,"115":0.06857,"116":1.80246,"117":0.43347,"118":0.0049,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0.0049,"25":0,"26":0.00245,"27":0.00735,"28":0.0049,"29":0,"30":0.00245,"31":0.00245,"32":0.00245,"33":0.00245,"34":0,"35":0,"36":0,"37":0.00245,"38":0.00245,"39":0,"40":0,"41":0,"42":0.0049,"43":0,"44":0,"45":0,"46":0.00245,"47":0,"48":0,"49":0,"50":0.00245,"51":0.00245,"52":0,"53":0,"54":0.00735,"55":0.00245,"56":0.00245,"57":0.00245,"58":0.01225,"60":0.07837,"62":0.0049,"63":0.08082,"64":0.01959,"65":0.01225,"66":0.05878,"67":0.07347,"68":0.03918,"69":0.29878,"70":0.17633,"71":0.43592,"72":0.81552,"73":0.12245,"74":0.0049,"75":0.00245,"76":0.0049,"77":0.03918,"78":0.00245,"79":0.00735,"80":0,"81":0,"82":0,"83":0.00245,"84":0,"85":0.00245,"86":0.00245,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.02204,"96":0,"97":0,"98":0,"99":0.0098,"100":0.0098,"101":0.11755,"102":0.10776,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.0049},B:{"12":0.00245,"13":0.00245,"14":0.00245,"15":0.0049,"16":0.00245,"17":0.00245,"18":0.01225,"79":0,"80":0,"81":0,"83":0,"84":0.0049,"85":0,"86":0,"87":0,"88":0,"89":0.00735,"90":0.0049,"91":0,"92":0.01959,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00245,"101":0,"102":0,"103":0,"104":0,"105":0.00245,"106":0,"107":0,"108":0.00245,"109":0.01225,"110":0.00245,"111":0.00245,"112":0.0049,"113":0.00245,"114":0.01714,"115":0.02939,"116":0.28653,"117":0.16408},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00245,"12":0,"13":0.00245,"14":0.00245,"15":0.00245,_:"0","3.1":0,"3.2":0,"5.1":0.00245,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0.00245,"12.1":0.00245,"13.1":0.01225,"14.1":0.00735,"15.1":0.00245,"15.2-15.3":0,"15.4":0.00245,"15.5":0.00245,"15.6":0.01714,"16.0":0.00245,"16.1":0.0098,"16.2":0.00245,"16.3":0.01469,"16.4":0.00245,"16.5":0.01469,"16.6":0.03184,"17.0":0.0049,"17.1":0},G:{"8":0.01716,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00156,"6.0-6.1":0,"7.0-7.1":0.01404,"8.1-8.4":0.00312,"9.0-9.2":0,"9.3":0.06552,"10.0-10.2":0,"10.3":0.12167,"11.0-11.2":0.08736,"11.3-11.4":0.03744,"12.0-12.1":0.10139,"12.2-12.5":1.12782,"13.0-13.1":0.03588,"13.2":0.0234,"13.3":0.04368,"13.4-13.7":0.08268,"14.0-14.4":0.57405,"14.5-14.8":0.48981,"15.0-15.1":1.1559,"15.2-15.3":0.3385,"15.4":0.26051,"15.5":0.37126,"15.6-15.7":3.04808,"16.0":0.52569,"16.1":0.58809,"16.2":0.3619,"16.3":0.69572,"16.4":0.51477,"16.5":1.10286,"16.6":2.78133,"17.0":0.93595,"17.1":0},P:{"4":0.16481,"20":0.07211,"21":0.18541,"22":0.75196,"5.0-5.4":0.0206,"6.2-6.4":0,"7.2-7.4":0.11331,"8.2":0,"9.2":0.08241,"10.1":0,"11.1-11.2":0.0515,"12.0":0.0206,"13.0":0.0206,"14.0":0.0206,"15.0":0.0206,"16.0":0.0618,"17.0":0.0309,"18.0":0.0309,"19.0":0.13391},I:{"0":0,"3":0,"4":0.0008,"2.1":0,"2.2":0,"2.3":0.00321,"4.1":0.00321,"4.2-4.3":0.01847,"4.4":0,"4.4.3-4.4.4":0.12124},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.0049,"9":0,"10":0.00245,"11":0.0049,"5.5":0},S:{"2.5":0.0151,_:"3.0-3.1"},J:{"7":0,"10":0.0151},N:{"10":0,"11":0},L:{"0":59.74773},R:{_:"0"},M:{"0":0.25673},Q:{"13.1":0.0151},O:{"0":1.01939},H:{"0":11.95279}};
    +module.exports={C:{"30":0.0021,"40":0.0021,"43":0.0021,"44":0.0021,"47":0.0021,"48":0.0021,"52":0.0021,"66":0.0021,"67":0.00631,"68":0.0021,"72":0.00841,"74":0.0021,"76":0.0021,"78":0.00841,"86":0.0021,"87":0.0021,"88":0.0021,"89":0.0021,"90":0.0021,"91":0.0021,"96":0.0021,"100":0.0021,"101":0.0021,"102":0.00421,"103":0.0021,"104":0.0021,"105":0.0021,"106":0.0021,"107":0.01262,"108":0.0021,"109":0.00421,"110":0.00421,"111":0.00631,"112":0.0021,"113":0.00841,"114":0.00631,"115":0.23554,"116":0.01472,"117":0.01262,"118":0.05468,"119":0.84751,"120":0.22502,"121":0.01052,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 31 32 33 34 35 36 37 38 39 41 42 45 46 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 69 70 71 73 75 77 79 80 81 82 83 84 85 92 93 94 95 97 98 99 122 123 3.5 3.6"},D:{"11":0.01262,"33":0.0021,"37":0.0021,"39":0.0021,"41":0.00631,"43":0.0021,"44":0.0021,"45":0.0021,"46":0.0021,"47":0.0021,"49":0.00421,"50":0.00841,"51":0.0021,"52":0.00421,"53":0.0021,"55":0.0021,"56":0.0021,"57":0.0021,"58":0.00421,"59":0.0021,"61":0.0021,"62":0.0021,"63":0.00631,"64":0.00631,"65":0.00631,"67":0.00421,"68":0.01472,"69":0.00841,"70":0.01262,"71":0.0021,"72":0.00631,"73":0.00421,"74":0.01052,"75":0.02734,"76":0.01893,"77":0.02524,"78":0.0021,"79":0.04206,"80":0.01472,"81":0.03155,"83":0.01052,"84":0.00841,"85":0.01262,"86":0.01052,"87":0.02313,"88":0.00841,"89":0.00841,"90":0.01682,"91":0.02313,"92":0.01472,"93":0.04206,"94":0.01052,"95":0.02313,"96":0.00631,"97":0.00631,"98":0.00841,"99":0.02313,"100":0.00421,"101":0.00631,"102":0.03155,"103":0.0715,"104":0.01893,"105":0.04416,"106":0.03785,"107":0.03996,"108":0.03996,"109":1.84643,"110":0.01472,"111":0.02524,"112":0.03575,"113":0.03996,"114":0.07361,"115":0.05468,"116":0.19979,"117":0.22502,"118":2.03781,"119":7.41097,"120":0.01262,"121":0.00841,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 38 40 42 48 54 60 66 122"},F:{"28":0.00421,"31":0.0021,"35":0.0021,"36":0.00421,"42":0.01472,"50":0.0021,"58":0.0021,"62":0.0021,"73":0.0021,"79":0.02944,"83":0.00841,"84":0.0021,"85":0.00631,"86":0.00421,"89":0.00421,"95":0.08412,"97":0.0021,"98":0.0021,"99":0.00841,"100":0.0021,"101":0.01472,"102":0.08202,"103":0.22082,"104":0.60356,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 32 33 34 37 38 39 40 41 43 44 45 46 47 48 49 51 52 53 54 55 56 57 60 63 64 65 66 67 68 69 70 71 72 74 75 76 77 78 80 81 82 87 88 90 91 92 93 94 96 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.01262,"13":0.00421,"14":0.00841,"15":0.00421,"16":0.00421,"17":0.00421,"18":0.04416,"81":0.0021,"84":0.01052,"85":0.0021,"86":0.0021,"88":0.0021,"89":0.01682,"90":0.03365,"92":0.08833,"100":0.01472,"104":0.0021,"105":0.0021,"106":0.0021,"107":0.00421,"108":0.00421,"109":0.03575,"110":0.00631,"111":0.00421,"112":0.00841,"113":0.00631,"114":0.01682,"115":0.02524,"116":0.02944,"117":0.07571,"118":0.39326,"119":1.36695,_:"79 80 83 87 91 93 94 95 96 97 98 99 101 102 103"},E:{"9":0.00421,"11":0.00841,"12":0.0021,"13":0.00841,"14":0.01052,"15":0.0021,_:"0 4 5 6 7 8 10 3.1 3.2 6.1 7.1 9.1 10.1","5.1":0.00421,"11.1":0.01052,"12.1":0.00631,"13.1":0.05047,"14.1":0.02734,"15.1":0.00421,"15.2-15.3":0.0021,"15.4":0.00421,"15.5":0.00631,"15.6":0.07781,"16.0":0.00631,"16.1":0.01052,"16.2":0.00631,"16.3":0.02313,"16.4":0.01262,"16.5":0.02734,"16.6":0.06099,"17.0":0.17034,"17.1":0.09884,"17.2":0.0021},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00238,"5.0-5.1":0.00238,"6.0-6.1":0.00594,"7.0-7.1":0.00831,"8.1-8.4":0.00119,"9.0-9.2":0.0095,"9.3":0.02969,"10.0-10.2":0.00238,"10.3":0.04276,"11.0-11.2":0.02019,"11.3-11.4":0.01782,"12.0-12.1":0.01069,"12.2-12.5":0.19478,"13.0-13.1":0.00475,"13.2":0.02019,"13.3":0.01188,"13.4-13.7":0.03444,"14.0-14.4":0.09145,"14.5-14.8":0.14846,"15.0-15.1":0.0582,"15.2-15.3":0.07126,"15.4":0.07958,"15.5":0.11164,"15.6-15.7":0.58673,"16.0":0.27555,"16.1":0.55228,"16.2":0.26486,"16.3":0.49646,"16.4":0.10214,"16.5":0.26367,"16.6-16.7":4.46935,"17.0":1.33855,"17.1":2.24833,"17.2":0.06414},P:{"4":0.19564,"20":0.05148,"21":0.11326,"22":0.28831,"23":0.54572,"5.0-5.4":0.02059,"6.2-6.4":0.0103,"7.2-7.4":0.13386,_:"8.2 10.1 12.0","9.2":0.15445,"11.1-11.2":0.03089,"13.0":0.04119,"14.0":0.0103,"15.0":0.0103,"16.0":0.05148,"17.0":0.02059,"18.0":0.04119,"19.0":0.14415},I:{"0":0.10215,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00007,"4.4":0,"4.4.3-4.4.4":0.00031},K:{"0":12.11846,_:"10 11 12 11.1 11.5 12.1"},A:{"7":0.0021,"8":0.00841,"9":0.0021,"10":0.00421,"11":0.01682,_:"6 5.5"},N:{_:"10 11"},S:{"2.5":0.01579,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.99502},H:{"0":0.88},L:{"0":52.78831},R:{_:"0"},M:{"0":0.22901},Q:{"13.1":0.03159}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GI.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GI.js
    index 4663acc469389f..872b89ef7d4e6d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GI.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GI.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.01639,"53":0.00546,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00546,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00546,"103":0,"104":0,"105":0.03825,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.01093,"116":0.03825,"117":0.75403,"118":0.12021,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.02186,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0.01639,"88":0,"89":0.03278,"90":0,"91":0.04371,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.17485,"104":0.00546,"105":0.02186,"106":0.05464,"107":0.25134,"108":0.25681,"109":0.69939,"110":0.02186,"111":0.14206,"112":0.08742,"113":0.26774,"114":0.49176,"115":0.20217,"116":11.8077,"117":4.4477,"118":0.00546,"119":0.00546,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00546,"73":0,"74":0,"75":0,"76":0,"77":0.00546,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00546,"96":0,"97":0,"98":0,"99":0,"100":0.01639,"101":0.08742,"102":0.39341,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.01639,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0.06557,"111":0,"112":0,"113":0,"114":0.02186,"115":0.0601,"116":2.10364,"117":2.5954},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.03278,"14":0.02186,"15":0.00546,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00546,"13.1":0.08196,"14.1":0.16938,"15.1":0.00546,"15.2-15.3":0.03278,"15.4":0.03278,"15.5":0.10382,"15.6":0.22402,"16.0":0.01093,"16.1":0.07103,"16.2":0.1366,"16.3":0.30598,"16.4":0.10928,"16.5":0.21856,"16.6":1.75941,"17.0":0.05464,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0.01487,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.05575,"10.0-10.2":0,"10.3":0.10406,"11.0-11.2":0.01115,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0.498,"13.0-13.1":0.05946,"13.2":0,"13.3":0.01115,"13.4-13.7":0.04088,"14.0-14.4":0.13379,"14.5-14.8":0.39022,"15.0-15.1":0.14122,"15.2-15.3":0.36049,"15.4":0.24528,"15.5":0.2044,"15.6-15.7":2.87277,"16.0":1.0666,"16.1":2.04401,"16.2":0.84362,"16.3":2.57546,"16.4":0.56489,"16.5":1.19296,"16.6":21.59966,"17.0":1.38621,"17.1":0},P:{"4":0.05099,"20":0.06119,"21":0.0204,"22":2.529,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0.0102,"14.0":0,"15.0":0,"16.0":0.0102,"17.0":0.0102,"18.0":0.0102,"19.0":0.05099},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.2832},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0.00907},N:{"10":0,"11":0},L:{"0":29.59783},R:{_:"0"},M:{"0":0.08165},Q:{"13.1":0.00454},O:{"0":0.01814},H:{"0":0.06442}};
    +module.exports={C:{"56":0.01058,"102":0.01058,"105":0.00529,"106":0.01058,"111":0.75104,"113":0.00529,"115":0.03173,"117":0.00529,"118":0.01058,"119":1.72421,"120":0.39139,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 103 104 107 108 109 110 112 114 116 121 122 123 3.5 3.6"},D:{"42":0.01058,"49":0.03173,"63":0.61881,"65":0.04231,"74":0.00529,"79":0.00529,"86":0.77219,"87":0.01058,"91":0.02116,"96":0.00529,"97":0.00529,"101":0.00529,"103":0.19569,"104":0.16396,"106":1.27994,"107":2.34832,"108":1.48621,"109":3.3162,"110":0.02116,"111":0.02645,"112":0.06347,"113":0.12694,"114":0.02116,"115":0.05818,"116":0.38081,"117":0.74046,"118":5.02455,"119":18.55381,"120":0.01058,"121":0.00529,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 43 44 45 46 47 48 50 51 52 53 54 55 56 57 58 59 60 61 62 64 66 67 68 69 70 71 72 73 75 76 77 78 80 81 83 84 85 88 89 90 92 93 94 95 98 99 100 102 105 122"},F:{"28":0.00529,"102":0.68228,"103":0.02116,"104":0.23272,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"15":0.01058,"100":0.00529,"107":1.20589,"108":0.00529,"109":0.01587,"110":1.22176,"113":0.00529,"114":0.00529,"116":0.03702,"117":0.03173,"118":1.23234,"119":4.1836,_:"12 13 14 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 101 102 103 104 105 106 111 112 115"},E:{"12":0.00529,"13":0.01058,"14":0.0476,"15":0.01058,_:"0 4 5 6 7 8 9 10 11 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 15.4","12.1":0.01587,"13.1":0.03702,"14.1":0.2909,"15.1":0.03702,"15.2-15.3":0.02645,"15.5":0.05289,"15.6":0.31205,"16.0":0.0476,"16.1":0.17454,"16.2":0.14809,"16.3":0.16925,"16.4":0.07405,"16.5":0.43899,"16.6":1.61315,"17.0":0.24858,"17.1":0.42312,"17.2":0.01058},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.0034,"5.0-5.1":0.0034,"6.0-6.1":0.0085,"7.0-7.1":0.0119,"8.1-8.4":0.0017,"9.0-9.2":0.0136,"9.3":0.04249,"10.0-10.2":0.0034,"10.3":0.06119,"11.0-11.2":0.0289,"11.3-11.4":0.0255,"12.0-12.1":0.0153,"12.2-12.5":0.27876,"13.0-13.1":0.0068,"13.2":0.0289,"13.3":0.017,"13.4-13.7":0.04929,"14.0-14.4":0.13088,"14.5-14.8":0.21247,"15.0-15.1":0.08329,"15.2-15.3":0.10198,"15.4":0.11388,"15.5":0.15977,"15.6-15.7":0.83967,"16.0":0.39434,"16.1":0.79037,"16.2":0.37904,"16.3":0.71049,"16.4":0.14618,"16.5":0.37734,"16.6-16.7":6.39608,"17.0":1.91559,"17.1":3.21759,"17.2":0.09179},P:{"4":0.05232,"20":0.04186,"21":0.05232,"22":0.35578,"23":2.94046,_:"5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 16.0","15.0":0.01046,"17.0":0.01046,"18.0":0.03139,"19.0":0.05232},I:{"0":0.00469,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.00001},K:{"0":0.4287,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.24329,"9":0.24329,"11":0.24329,_:"6 7 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.12249},H:{"0":0},L:{"0":25.89012},R:{_:"0"},M:{"0":0.27795},Q:{"13.1":0.01413}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GL.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GL.js
    index d1e8a12c0a4ff1..af749cd9d3eca4 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GL.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GL.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0.03722,"3":0.05849,"4":0.02659,"5":0.03722,"6":0.02127,"7":0.01063,"8":0.00532,"9":0,"10":0.0319,"11":0.02127,"12":0.01063,"13":0.01595,"14":0.01063,"15":0.01595,"16":0.01063,"17":0.02127,"18":0.00532,"19":0.00532,"20":0.01595,"21":0.01595,"22":0.00532,"23":0.0319,"24":0.02127,"25":0.01063,"26":0.02127,"27":0.01063,"28":0.02127,"29":0.0319,"30":0.02127,"31":0.0319,"32":0.01063,"33":0.02127,"34":0.02127,"35":0.0319,"36":0.01063,"37":0.03722,"38":0.05317,"39":0.05849,"40":0.10634,"41":0.04785,"42":0.01063,"43":0.00532,"44":0.00532,"45":0,"46":0.00532,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00532,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.02659,"79":0,"80":0,"81":0.00532,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.00532,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.00532,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0.01595,"114":0,"115":0.02659,"116":0.09571,"117":0.86135,"118":0.06912,"119":0,"120":0,"3.5":0.0319,"3.6":0.12229},D:{"4":0.01595,"5":0,"6":0.01063,"7":0.01063,"8":0.01063,"9":0.00532,"10":0.01063,"11":0.02659,"12":0.02127,"13":0.01063,"14":0.00532,"15":0.00532,"16":0.00532,"17":0.01595,"18":0.02127,"19":0.01063,"20":0.01595,"21":0.07444,"22":0.01595,"23":0.01063,"24":0.01595,"25":0.00532,"26":0.01063,"27":0.01063,"28":0.0319,"29":0.01595,"30":0.02127,"31":0.03722,"32":0.01063,"33":0.04254,"34":0.02659,"35":0.02127,"36":0.0319,"37":0.04254,"38":0.05849,"39":0.07976,"40":0.04785,"41":0.14356,"42":0.10634,"43":0.17546,"44":0.34029,"45":0.20205,"46":0.1861,"47":0.14888,"48":0,"49":0,"50":0,"51":0.20205,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.05317,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"83":0.00532,"84":0,"85":0,"86":0,"87":0.00532,"88":0.01063,"89":0,"90":0,"91":0.00532,"92":0.01063,"93":0,"94":0,"95":0.00532,"96":0.01063,"97":0,"98":0.00532,"99":0.00532,"100":0.00532,"101":0,"102":0,"103":0.04785,"104":0,"105":0,"106":0.01595,"107":0.01063,"108":0,"109":0.48385,"110":0.00532,"111":0.00532,"112":0.00532,"113":0.02127,"114":0.1861,"115":0.20736,"116":6.27406,"117":2.49367,"118":0.00532,"119":0.00532,"120":0},F:{"9":0,"11":0.02127,"12":0.01595,"15":0.00532,"16":0,"17":0,"18":0.00532,"19":0,"20":0.00532,"21":0,"22":0,"23":0,"24":0.01063,"25":0.01063,"26":0.00532,"27":0.02127,"28":0.01595,"29":0.01595,"30":0.05317,"31":0.07976,"32":0.05317,"33":0.01063,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.00532,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00532,"96":0,"97":0,"98":0.00532,"99":0,"100":0.04785,"101":0.19673,"102":0.09571,"9.5-9.6":0.00532,"10.0-10.1":0.01063,"10.5":0,"10.6":0.00532,"11.1":0.00532,"11.5":0.01063,"11.6":0.00532,"12.1":0.0638},B:{"12":0.11166,"13":0.01595,"14":0.12229,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00532,"93":0.01063,"94":0,"95":0,"96":0,"97":0,"98":0.00532,"99":0,"100":0.00532,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0.00532,"107":0.01595,"108":0.00532,"109":0.01063,"110":0,"111":0.00532,"112":0,"113":0,"114":0.04785,"115":0.04785,"116":1.2814,"117":0.98896},E:{"4":0.02659,"5":0.02127,"6":0,"7":0.02127,"8":0.07444,"9":0.47321,"10":0,"11":0,"12":0,"13":0.01063,"14":0.04785,"15":0.00532,_:"0","3.1":0,"3.2":0,"5.1":0.0319,"6.1":0.00532,"7.1":0.0319,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.04785,"14.1":0.04254,"15.1":0,"15.2-15.3":0.01063,"15.4":0.01595,"15.5":0.09039,"15.6":0.1861,"16.0":0.00532,"16.1":0.04785,"16.2":0.05317,"16.3":0.12761,"16.4":0.01595,"16.5":0.60082,"16.6":1.5632,"17.0":0.02659,"17.1":0},G:{"8":0.06293,"3.2":0.03389,"4.0-4.1":0,"4.2-4.3":0.06293,"5.0-5.1":0.12345,"6.0-6.1":0.14039,"7.0-7.1":0.44054,"8.1-8.4":0.79152,"9.0-9.2":0.08472,"9.3":0.21301,"10.0-10.2":0,"10.3":0.22995,"11.0-11.2":2.10589,"11.3-11.4":0,"12.0-12.1":0.53494,"12.2-12.5":0.07504,"13.0-13.1":0,"13.2":0.0121,"13.3":0.00726,"13.4-13.7":0,"14.0-14.4":0.01936,"14.5-14.8":0.09682,"15.0-15.1":0.03873,"15.2-15.3":0.04599,"15.4":0.01936,"15.5":0.02663,"15.6-15.7":0.42844,"16.0":1.46686,"16.1":0.57125,"16.2":0.28321,"16.3":0.59062,"16.4":0.04115,"16.5":1.19092,"16.6":12.07133,"17.0":1.87109,"17.1":0},P:{"4":0.39682,"20":0.02145,"21":0.03217,"22":3.26034,"5.0-5.4":0,"6.2-6.4":0.24667,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0.02145,"17.0":0.01072,"18.0":0.15015,"19.0":0},I:{"0":0,"3":0.0962,"4":0.92268,"2.1":0.11151,"2.2":0.36951,"2.3":0.52475,"4.1":0.60346,"4.2-4.3":1.10415,"4.4":0,"4.4.3-4.4.4":2.58656},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.11831,"7":0.1667,"8":1.50571,"9":0.29039,"10":0.26888,"11":0.84965,"5.5":0.01076},S:{"2.5":0.192,_:"3.0-3.1"},J:{"7":0,"10":0.22478},N:{"10":0.49701,"11":0.28037},L:{"0":32.73076},R:{_:"0"},M:{"0":0.38869},Q:{"13.1":0.00937},O:{"0":0.57601},H:{"0":0.30148}};
    +module.exports={C:{"2":0.02198,"3":0.03517,"4":0.04836,"5":0.0044,"6":0.01758,"7":0.0044,"8":0.00879,"9":0.0044,"10":0.00879,"11":0.02198,"12":0.02198,"13":0.00879,"15":0.03517,"16":0.00879,"17":0.02198,"18":0.00879,"19":0.0044,"20":0.0044,"21":0.03077,"22":0.00879,"23":0.03077,"24":0.01319,"25":0.01319,"26":0.01319,"28":0.01319,"29":0.01319,"30":0.02198,"31":0.03517,"32":0.00879,"33":0.01758,"34":0.01319,"35":0.02198,"36":0.04836,"37":0.02198,"38":0.04396,"39":0.06154,"40":0.07913,"41":0.02198,"42":0.01319,"43":0.02198,"45":0.0044,"48":0.0044,"52":0.1055,"72":0.0044,"75":0.0044,"78":0.08792,"102":0.0044,"109":0.01758,"115":0.04396,"116":0.03517,"117":0.00879,"118":0.05275,"119":2.76069,"120":0.42641,_:"14 27 44 46 47 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 73 74 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 103 104 105 106 107 108 110 111 112 113 114 121 122 123","3.5":0.02198,"3.6":0.1055},D:{"4":0.02198,"6":0.01319,"7":0.00879,"10":0.0044,"11":0.0044,"14":0.00879,"15":0.0044,"16":0.00879,"17":0.0044,"18":0.01319,"19":0.00879,"20":0.01319,"21":0.03956,"22":0.01319,"24":0.0044,"25":0.00879,"27":0.01319,"28":0.00879,"29":0.00879,"30":0.01758,"31":0.04836,"32":0.01319,"33":0.02198,"34":0.00879,"35":0.01319,"36":0.04836,"37":0.03517,"38":0.01758,"39":0.06594,"40":0.06154,"41":0.07034,"42":0.08352,"43":0.1143,"44":0.22859,"45":0.18463,"46":0.17584,"47":0.12748,"51":0.3297,"61":0.01758,"70":0.14946,"87":0.00879,"88":0.08792,"91":0.00879,"92":0.01758,"93":0.0044,"100":0.00879,"102":0.02198,"103":0.11869,"107":0.05275,"109":0.95393,"111":0.02638,"112":0.12748,"113":0.01758,"114":0.01319,"115":0.01758,"116":1.91666,"117":0.5539,"118":2.7475,"119":14.99036,"120":0.01319,_:"5 8 9 12 13 23 26 48 49 50 52 53 54 55 56 57 58 59 60 62 63 64 65 66 67 68 69 71 72 73 74 75 76 77 78 79 80 81 83 84 85 86 89 90 94 95 96 97 98 99 101 104 105 106 108 110 121 122"},F:{"9":0.0044,"12":0.00879,"20":0.0044,"24":0.0044,"25":0.00879,"26":0.01319,"27":0.0044,"28":0.0044,"29":0.00879,"30":0.00879,"31":0.06154,"32":0.02198,"33":0.00879,"46":0.0044,"95":0.0044,"102":0.25497,"103":0.03517,"104":0.2154,_:"11 15 16 17 18 19 21 22 23 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 10.5","9.5-9.6":0.00879,"10.0-10.1":0.0044,"10.6":0.0044,"11.1":0.0044,"11.5":0.00879,"11.6":0.00879,"12.1":0.03077},B:{"12":0.03077,"14":0.01319,"17":0.00879,"18":0.08792,"92":0.0044,"105":0.0044,"106":0.00879,"109":0.01319,"110":0.02198,"111":0.00879,"114":0.0044,"115":0.00879,"116":0.0044,"117":0.09671,"118":0.66819,"119":3.31898,_:"13 15 16 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 107 108 112 113"},E:{"4":0.01758,"5":0.02638,"6":0.01319,"7":0.01758,"8":0.03077,"9":0.54071,"13":0.11869,"14":0.03517,"15":0.0044,_:"0 10 11 12 3.1 10.1 11.1","3.2":0.0044,"5.1":0.04836,"6.1":0.00879,"7.1":0.00879,"9.1":0.00879,"12.1":0.00879,"13.1":0.06594,"14.1":0.1143,"15.1":0.16705,"15.2-15.3":0.15386,"15.4":0.01319,"15.5":0.0044,"15.6":0.2242,"16.0":0.02198,"16.1":0.08352,"16.2":0.06154,"16.3":0.23738,"16.4":0.08792,"16.5":0.36926,"16.6":2.49253,"17.0":0.74732,"17.1":0.73853,"17.2":0.01319},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00338,"5.0-5.1":0.00338,"6.0-6.1":0.00846,"7.0-7.1":0.01185,"8.1-8.4":0.00169,"9.0-9.2":0.01354,"9.3":0.04231,"10.0-10.2":0.00338,"10.3":0.06093,"11.0-11.2":0.02877,"11.3-11.4":0.02539,"12.0-12.1":0.01523,"12.2-12.5":0.27755,"13.0-13.1":0.00677,"13.2":0.02877,"13.3":0.01692,"13.4-13.7":0.04908,"14.0-14.4":0.13032,"14.5-14.8":0.21155,"15.0-15.1":0.08293,"15.2-15.3":0.10154,"15.4":0.11339,"15.5":0.15909,"15.6-15.7":0.83605,"16.0":0.39264,"16.1":0.78697,"16.2":0.37741,"16.3":0.70743,"16.4":0.14555,"16.5":0.37571,"16.6-16.7":6.36853,"17.0":1.90734,"17.1":3.20373,"17.2":0.09139},P:{"4":0.3448,"21":0.01078,"22":0.18318,"23":6.64822,_:"20 5.0-5.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 17.0 19.0","6.2-6.4":0.2586,"18.0":0.0862},I:{"0":2.49246,"3":0.00025,"4":0.0005,"2.1":0,"2.2":0.0005,"2.3":0,"4.1":0.00025,"4.2-4.3":0.00175,"4.4":0,"4.4.3-4.4.4":0.00751},K:{"0":0.14691,_:"10 11 12 11.1 11.5 12.1"},A:{"6":0.06219,"7":0.0844,"8":1.13268,"9":0.22654,"10":0.19988,"11":0.73291,"5.5":0.01333},N:{_:"10 11"},S:{"2.5":0.12329,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.48194},H:{"0":0.01},L:{"0":27.30034},R:{_:"0"},M:{"0":0.19054},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GM.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GM.js
    index 02b49802355d61..b6e8c11b4f7699 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GM.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GM.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00164,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00164,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0.00164,"115":0.04765,"116":0.00657,"117":0.09365,"118":0.01479,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0.00164,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00164,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00164,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00329,"41":0.00164,"42":0,"43":0,"44":0,"45":0.00329,"46":0.00164,"47":0.00164,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00164,"57":0.00164,"58":0,"59":0.00164,"60":0.00164,"61":0,"62":0.00164,"63":0.00164,"64":0.00329,"65":0.00657,"66":0.00164,"67":0.00164,"68":0.0115,"69":0.00329,"70":0.01314,"71":0,"72":0,"73":0,"74":0.00164,"75":0.00164,"76":0.00164,"77":0,"78":0.00164,"79":0.00493,"80":0.00493,"81":0.0115,"83":0.00164,"84":0.00164,"85":0.00493,"86":0,"87":0.00164,"88":0,"89":0.00329,"90":0,"91":0,"92":0,"93":0.01479,"94":0,"95":0.00329,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.00986,"104":0,"105":0,"106":0.01314,"107":0.00164,"108":0.00164,"109":0.1643,"110":0.00164,"111":0.00164,"112":0,"113":0.0115,"114":0.01479,"115":0.01643,"116":0.59477,"117":0.14787,"118":0.00164,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00164,"60":0.00164,"62":0,"63":0.00164,"64":0.00164,"65":0,"66":0,"67":0.00329,"68":0,"69":0.00986,"70":0.00822,"71":0.01479,"72":0.046,"73":0.01643,"74":0,"75":0,"76":0,"77":0.00164,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00164,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.01479,"102":0.0115,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00822,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00329,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00164,"110":0,"111":0,"112":0,"113":0,"114":0.00329,"115":0.00986,"116":0.1298,"117":0.09694},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00164,"15":0.00164,_:"0","3.1":0,"3.2":0,"5.1":0.00164,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00164,"14.1":0.02136,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0.02136,"16.0":0.00164,"16.1":0.0115,"16.2":0,"16.3":0.00822,"16.4":0.00164,"16.5":0.00164,"16.6":0.01807,"17.0":0.00822,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.02456,"6.0-6.1":0.11833,"7.0-7.1":0.11833,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.10493,"10.0-10.2":0,"10.3":0.36391,"11.0-11.2":0.02233,"11.3-11.4":0.0134,"12.0-12.1":0.84392,"12.2-12.5":3.19484,"13.0-13.1":0.21656,"13.2":0.01116,"13.3":0.10493,"13.4-13.7":0.27907,"14.0-14.4":0.99574,"14.5-14.8":1.13862,"15.0-15.1":0.25675,"15.2-15.3":0.17414,"15.4":0.43312,"15.5":1.04485,"15.6-15.7":5.42073,"16.0":0.23665,"16.1":0.48894,"16.2":0.58047,"16.3":0.71443,"16.4":0.35945,"16.5":0.86401,"16.6":3.56991,"17.0":0.45545,"17.1":0},P:{"4":0.37772,"20":0.06125,"21":0.15313,"22":0.56147,"5.0-5.4":0.02042,"6.2-6.4":0,"7.2-7.4":0.19396,"8.2":0,"9.2":0.02042,"10.1":0,"11.1-11.2":0.02042,"12.0":0,"13.0":0.02042,"14.0":0.04083,"15.0":0,"16.0":0.03063,"17.0":0.04083,"18.0":0.01021,"19.0":0.15313},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00119,"4.2-4.3":0.01228,"4.4":0,"4.4.3-4.4.4":0.1624},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0.00836,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":72.5624},R:{_:"0"},M:{"0":0.04179},Q:{"13.1":0},O:{"0":0.33428},H:{"0":0.76745}};
    +module.exports={C:{"34":0.00473,"43":0.00355,"54":0.00118,"56":0.00118,"59":0.00118,"66":0.00236,"68":0.00236,"72":0.00236,"78":0.00118,"99":0.00118,"105":0.00118,"111":0.00118,"112":0.00118,"115":0.21631,"116":0.00118,"118":0.00355,"119":0.34751,"120":0.13238,"121":0.00473,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 44 45 46 47 48 49 50 51 52 53 55 57 58 60 61 62 63 64 65 67 69 70 71 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 100 101 102 103 104 106 107 108 109 110 113 114 117 122 123 3.5 3.6"},D:{"10":0.00118,"25":0.00236,"31":0.00118,"36":0.15957,"37":0.00118,"39":0.00118,"40":0.00118,"41":0.00355,"42":0.00236,"43":0.00118,"44":0.00118,"45":0.00236,"46":0.00236,"47":0.00709,"48":0.00236,"49":0.00473,"50":0.00236,"51":0.00118,"52":0.00118,"53":0.00236,"54":0.05792,"55":0.00236,"56":0.00473,"57":0.00473,"58":0.00591,"59":0.00236,"60":0.00591,"61":0.00236,"62":0.00355,"63":0.00827,"64":0.00827,"65":0.03664,"66":0.00591,"67":0.00355,"68":0.00236,"69":0.04019,"70":0.01064,"72":0.00473,"73":0.00118,"74":0.00709,"75":0.00473,"76":0.00591,"78":0.00355,"79":0.01418,"80":0.01418,"81":0.04846,"83":0.00709,"84":0.00591,"85":0.05792,"86":0.00591,"87":0.00118,"88":0.00473,"89":0.01182,"90":0.00236,"91":0.00118,"92":0.00118,"93":0.03073,"94":0.00118,"95":0.00118,"96":0.00118,"98":0.00118,"99":0.00355,"100":0.00236,"102":0.00118,"103":0.026,"104":0.01773,"105":0.01891,"106":0.02364,"107":0.02246,"108":0.00118,"109":1.14536,"110":0.00827,"111":0.00355,"112":0.00236,"113":0.00591,"114":0.00709,"115":0.01064,"116":0.07328,"117":0.06619,"118":0.73402,"119":2.72806,"120":0.16903,_:"4 5 6 7 8 9 11 12 13 14 15 16 17 18 19 20 21 22 23 24 26 27 28 29 30 32 33 34 35 38 71 77 97 101 121 122"},F:{"63":0.00236,"79":0.00118,"93":0.01064,"95":0.01182,"102":0.00473,"103":0.03428,"104":0.0851,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 85 86 87 88 89 90 91 92 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00591,"14":0.00118,"15":0.00118,"16":0.00118,"17":0.00118,"18":0.0331,"84":0.00236,"88":0.00118,"90":0.00118,"92":0.01064,"107":0.00118,"108":0.00118,"109":0.00355,"110":0.00355,"113":0.00355,"114":0.00709,"115":0.00236,"116":0.00118,"117":0.05437,"118":0.16548,"119":0.62882,_:"13 79 80 81 83 85 86 87 89 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 111 112"},E:{"11":0.00118,"15":0.00118,_:"0 4 5 6 7 8 9 10 12 13 14 3.1 3.2 6.1 7.1 10.1 15.1 17.2","5.1":0.00473,"9.1":0.00118,"11.1":0.00118,"12.1":0.00118,"13.1":0.50353,"14.1":0.02009,"15.2-15.3":0.00118,"15.4":0.00118,"15.5":0.00591,"15.6":0.01418,"16.0":0.00118,"16.1":0.03901,"16.2":0.00236,"16.3":0.04019,"16.4":0.00591,"16.5":0.01773,"16.6":0.06737,"17.0":0.69029,"17.1":0.04255},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00451,"5.0-5.1":0.00451,"6.0-6.1":0.01128,"7.0-7.1":0.01579,"8.1-8.4":0.00226,"9.0-9.2":0.01805,"9.3":0.05639,"10.0-10.2":0.00451,"10.3":0.0812,"11.0-11.2":0.03835,"11.3-11.4":0.03383,"12.0-12.1":0.0203,"12.2-12.5":0.36993,"13.0-13.1":0.00902,"13.2":0.03835,"13.3":0.02256,"13.4-13.7":0.06541,"14.0-14.4":0.17368,"14.5-14.8":0.28196,"15.0-15.1":0.11053,"15.2-15.3":0.13534,"15.4":0.15113,"15.5":0.21203,"15.6-15.7":1.11429,"16.0":0.52331,"16.1":1.04887,"16.2":0.50301,"16.3":0.94286,"16.4":0.19399,"16.5":0.50075,"16.6-16.7":8.48799,"17.0":2.54211,"17.1":4.26993,"17.2":0.1218},P:{"4":0.20305,"20":0.05343,"21":0.11755,"22":0.36335,"23":0.44884,"5.0-5.4":0.03206,"6.2-6.4":0.04275,"7.2-7.4":0.13893,_:"8.2 10.1 13.0 14.0 15.0 17.0","9.2":0.01069,"11.1-11.2":0.01069,"12.0":0.01069,"16.0":0.13893,"18.0":0.01069,"19.0":0.03206},I:{"0":0.00877,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00003},K:{"0":0.80653,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.00236,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.17636},H:{"0":0.04},L:{"0":65.57659},R:{_:"0"},M:{"0":0.06173},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GN.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GN.js
    index 7ddd27d69fad29..22d21cac55be94 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GN.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GN.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00119,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.00119,"116":0.00357,"117":0.02616,"118":0.00238,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00119,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00119,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0.00119,"51":0,"52":0,"53":0,"54":0,"55":0.00119,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00119,"65":0,"66":0,"67":0,"68":0.00119,"69":0,"70":0,"71":0,"72":0.00119,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0.00832,"83":0,"84":0,"85":0,"86":0,"87":0.00357,"88":0,"89":0,"90":0.00119,"91":0,"92":0,"93":0.00238,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00119,"100":0,"101":0,"102":0,"103":0.00713,"104":0,"105":0.00238,"106":0,"107":0,"108":0,"109":0.03091,"110":0.00119,"111":0.00119,"112":0,"113":0,"114":0.00238,"115":0.00951,"116":0.14149,"117":0.05113,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00119,"60":0.00238,"62":0,"63":0.00476,"64":0,"65":0.00119,"66":0.00119,"67":0.00595,"68":0,"69":0.0107,"70":0.00238,"71":0.02021,"72":0.01784,"73":0.00238,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.00595,"102":0.00713,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00119,"13":0,"14":0.00238,"15":0.00119,"16":0,"17":0,"18":0.00238,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00119,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0.00238,"111":0,"112":0,"113":0.00119,"114":0,"115":0.00476,"116":0.04518,"117":0.02259},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0.00119,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0,"16.0":0,"16.1":0,"16.2":0,"16.3":0,"16.4":0,"16.5":0,"16.6":0.00238,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0.00164,"7.0-7.1":0.01641,"8.1-8.4":0,"9.0-9.2":0.02461,"9.3":0.03937,"10.0-10.2":0.01148,"10.3":0.09351,"11.0-11.2":0.03937,"11.3-11.4":0.01477,"12.0-12.1":0.27561,"12.2-12.5":1.44041,"13.0-13.1":0.13945,"13.2":0.01312,"13.3":0.04265,"13.4-13.7":0.47248,"14.0-14.4":1.54377,"14.5-14.8":0.63162,"15.0-15.1":0.57912,"15.2-15.3":0.5742,"15.4":0.17718,"15.5":0.79239,"15.6-15.7":3.17776,"16.0":0.54631,"16.1":0.6513,"16.2":0.39537,"16.3":0.77598,"16.4":0.64474,"16.5":1.18777,"16.6":1.85383,"17.0":0.1739,"17.1":0.00328},P:{"4":0.20435,"20":0.1737,"21":0.19413,"22":0.90936,"5.0-5.4":0.03065,"6.2-6.4":0.05109,"7.2-7.4":0.27587,"8.2":0.01022,"9.2":0.10218,"10.1":0.01022,"11.1-11.2":0.06131,"12.0":0,"13.0":0.03065,"14.0":0.11239,"15.0":0.04087,"16.0":0.57218,"17.0":0.03065,"18.0":0.10218,"19.0":0.48023},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00245,"4.4":0,"4.4.3-4.4.4":0.02419},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00238,"5.5":0},S:{"2.5":0.16741,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":76.65604},R:{_:"0"},M:{"0":0.03524},Q:{"13.1":0.01762},O:{"0":0.07049},H:{"0":1.96864}};
    +module.exports={C:{"37":0.00299,"47":0.00299,"48":0.001,"56":0.001,"61":0.001,"72":0.001,"115":0.01097,"117":0.00499,"118":0.01296,"119":0.19342,"120":0.08076,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 39 40 41 42 43 44 45 46 49 50 51 52 53 54 55 57 58 59 60 62 63 64 65 66 67 68 69 70 71 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 116 121 122 123 3.5 3.6"},D:{"11":0.001,"30":0.001,"33":0.001,"40":0.00199,"42":0.001,"43":0.00499,"48":0.001,"55":0.00199,"56":0.00598,"57":0.001,"58":0.001,"63":0.02193,"64":0.00199,"65":0.001,"66":0.00299,"68":0.001,"69":0.00299,"70":0.001,"72":0.00399,"74":0.001,"78":0.001,"79":0.00399,"80":0.001,"81":0.00897,"83":0.001,"84":0.001,"87":0.02493,"88":0.02393,"89":0.001,"90":0.00199,"92":0.00299,"93":0.01795,"94":0.00199,"95":0.00199,"96":0.001,"99":0.00798,"101":0.001,"102":0.001,"103":0.04187,"104":0.00299,"105":0.05284,"106":0.01296,"108":0.001,"109":0.08674,"110":0.00399,"111":0.00199,"112":0.01396,"113":0.001,"114":0.00598,"115":0.00798,"116":0.0319,"117":0.02193,"118":0.41675,"119":1.30906,"121":0.001,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 31 32 34 35 36 37 38 39 41 44 45 46 47 49 50 51 52 53 54 59 60 61 62 67 71 73 75 76 77 85 86 91 97 98 100 107 120 122"},F:{"34":0.001,"42":0.001,"58":0.00199,"76":0.001,"79":0.001,"84":0.001,"95":0.00299,"102":0.00299,"103":0.04387,"104":0.07178,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 77 78 80 81 82 83 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00897,"13":0.001,"14":0.001,"17":0.00199,"18":0.01196,"84":0.00199,"89":0.00499,"90":0.0329,"92":0.00798,"95":0.001,"100":0.00598,"108":0.001,"109":0.001,"110":0.00698,"111":0.001,"112":0.00299,"113":0.001,"114":0.00299,"115":0.00199,"116":0.00399,"117":0.00598,"118":0.12662,"119":0.59521,_:"15 16 79 80 81 83 85 86 87 88 91 93 94 96 97 98 99 101 102 103 104 105 106 107"},E:{"13":0.001,"14":0.001,_:"0 4 5 6 7 8 9 10 11 12 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 12.1 15.1 15.2-15.3 16.0 17.2","11.1":0.001,"13.1":0.01795,"14.1":0.0339,"15.4":0.001,"15.5":0.00199,"15.6":0.00997,"16.1":0.00199,"16.2":0.001,"16.3":0.00299,"16.4":0.00598,"16.5":0.001,"16.6":0.00997,"17.0":0.00499,"17.1":0.00698},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00269,"5.0-5.1":0.00269,"6.0-6.1":0.00672,"7.0-7.1":0.0094,"8.1-8.4":0.00134,"9.0-9.2":0.01074,"9.3":0.03358,"10.0-10.2":0.00269,"10.3":0.04835,"11.0-11.2":0.02283,"11.3-11.4":0.02015,"12.0-12.1":0.01209,"12.2-12.5":0.22027,"13.0-13.1":0.00537,"13.2":0.02283,"13.3":0.01343,"13.4-13.7":0.03895,"14.0-14.4":0.10342,"14.5-14.8":0.16789,"15.0-15.1":0.06581,"15.2-15.3":0.08059,"15.4":0.08999,"15.5":0.12625,"15.6-15.7":0.66349,"16.0":0.3116,"16.1":0.62454,"16.2":0.29951,"16.3":0.56142,"16.4":0.11551,"16.5":0.29817,"16.6-16.7":5.05408,"17.0":1.51367,"17.1":2.54249,"17.2":0.07253},P:{"4":0.19163,"20":0.10086,"21":0.25215,"22":0.66567,"23":0.29249,"5.0-5.4":0.02017,"6.2-6.4":0.02017,"7.2-7.4":0.29249,"8.2":0.01009,"9.2":0.13112,_:"10.1 12.0","11.1-11.2":0.05043,"13.0":0.01009,"14.0":0.04034,"15.0":0.08069,"16.0":0.2118,"17.0":0.01009,"18.0":0.15129,"19.0":0.48412},I:{"0":0.00896,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00003},K:{"0":0.69547,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.00897,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.18004,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.09902},H:{"0":1.42},L:{"0":77.25691},R:{_:"0"},M:{"0":0.03601},Q:{"13.1":0.009}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GP.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GP.js
    index 6f8344269eab37..90c7bdf2fb795a 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GP.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GP.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00442,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.05746,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.01326,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.00442,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.0884,"103":0.00442,"104":0,"105":0,"106":0,"107":0,"108":0.00442,"109":0.00442,"110":0.00884,"111":0.00442,"112":0.00884,"113":0.00442,"114":0.02652,"115":0.27846,"116":0.13702,"117":1.26854,"118":0.07956,"119":0,"120":0.00442,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00442,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.03536,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.00884,"80":0.07956,"81":0.00442,"83":0.00442,"84":0.00442,"85":0,"86":0,"87":0.01768,"88":0.00442,"89":0,"90":0,"91":0.00442,"92":0,"93":0,"94":0,"95":0,"96":0.00442,"97":0.00442,"98":0.00442,"99":0.00442,"100":0,"101":0,"102":0.01768,"103":0.07072,"104":0,"105":0.00884,"106":0.00884,"107":0.11934,"108":0.00442,"109":0.56134,"110":0.00442,"111":0.00884,"112":0.03536,"113":0.00884,"114":0.08398,"115":0.21658,"116":6.62558,"117":2.01552,"118":0.00442,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00884,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00442,"73":0,"74":0,"75":0,"76":0.01768,"77":0.00884,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.03094,"96":0,"97":0,"98":0,"99":0,"100":0.06188,"101":0.31824,"102":0.49062,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00442,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0.04862,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0.00442,"105":0,"106":0,"107":0,"108":0.00442,"109":0.06188,"110":0.00442,"111":0.03536,"112":0.00442,"113":0.00884,"114":0.03536,"115":0.12818,"116":1.6575,"117":1.2376},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00442,"14":0.08398,"15":0.00442,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.01326,"13.1":0.14144,"14.1":0.15912,"15.1":0.00442,"15.2-15.3":0.00884,"15.4":0.04862,"15.5":0.01326,"15.6":0.1989,"16.0":0.01768,"16.1":0.0442,"16.2":0.05746,"16.3":0.05304,"16.4":0.07956,"16.5":0.1989,"16.6":0.91052,"17.0":0.06188,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.06554,"10.0-10.2":0,"10.3":0.02269,"11.0-11.2":0,"11.3-11.4":0.02521,"12.0-12.1":0.00504,"12.2-12.5":0.11848,"13.0-13.1":0,"13.2":0,"13.3":0.7411,"13.4-13.7":0.02521,"14.0-14.4":0.21679,"14.5-14.8":0.18654,"15.0-15.1":0.07058,"15.2-15.3":0.05294,"15.4":0.11091,"15.5":0.45374,"15.6-15.7":1.3234,"16.0":0.79908,"16.1":1.24021,"16.2":0.5218,"16.3":1.36373,"16.4":0.39576,"16.5":1.30323,"16.6":13.52134,"17.0":2.06702,"17.1":0},P:{"4":0.06229,"20":0.26994,"21":0.24918,"22":5.29505,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.06229,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01038,"12.0":0,"13.0":0,"14.0":0.06229,"15.0":0.05191,"16.0":0.08306,"17.0":0.01038,"18.0":0.02076,"19.0":0.15574},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.1742},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.0442,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":46.47966},R:{_:"0"},M:{"0":0.2511},Q:{"13.1":0},O:{"0":0.00558},H:{"0":0.12679}};
    +module.exports={C:{"52":0.00431,"68":0.00431,"72":0.00431,"78":0.05172,"83":0.00431,"84":0.00431,"90":0.00431,"91":0.00431,"102":0.00431,"103":0.01293,"106":0.00431,"109":0.01724,"112":0.01724,"113":0.00431,"114":0.03017,"115":0.63357,"116":0.00862,"117":0.01293,"118":0.14654,"119":2.22396,"120":0.59047,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 73 74 75 76 77 79 80 81 82 85 86 87 88 89 92 93 94 95 96 97 98 99 100 101 104 105 107 108 110 111 121 122 123 3.5 3.6"},D:{"38":0.00431,"49":0.00431,"56":0.00431,"61":0.00431,"79":0.00431,"80":0.00431,"81":0.00431,"83":0.00862,"85":0.00431,"86":0.00431,"87":0.03448,"88":0.00431,"89":0.00431,"91":0.01293,"98":0.03448,"99":0.03017,"101":0.01724,"102":0.03448,"103":0.05172,"105":0.41376,"106":0.00431,"107":0.00862,"108":0.00862,"109":1.52143,"110":0.53875,"111":0.36635,"112":0.31463,"113":0.00431,"114":0.0431,"115":0.0431,"116":0.35342,"117":0.48703,"118":3.55575,"119":15.8608,"120":0.02586,"121":0.00431,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 47 48 50 51 52 53 54 55 57 58 59 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 84 90 92 93 94 95 96 97 100 104 122"},F:{"46":0.01293,"90":0.00431,"95":0.00431,"100":0.00431,"102":0.58616,"103":0.20257,"104":0.65081,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 91 92 93 94 96 97 98 99 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"17":0.00431,"18":0.00862,"84":0.00431,"88":0.00431,"89":0.00431,"92":0.00431,"96":0.00431,"97":0.14223,"103":0.00431,"107":0.01293,"108":0.00431,"109":0.06896,"110":0.00862,"111":0.00431,"112":0.00862,"113":0.00862,"114":0.03017,"115":0.2155,"116":0.03448,"117":0.06896,"118":0.97406,"119":5.43922,_:"12 13 14 15 16 79 80 81 83 85 86 87 90 91 93 94 95 98 99 100 101 102 104 105 106"},E:{"13":0.00431,"14":0.14654,"15":0.00862,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 5.1 6.1 9.1 10.1","7.1":0.00431,"11.1":0.00431,"12.1":0.01724,"13.1":0.2586,"14.1":0.33187,"15.1":0.08189,"15.2-15.3":0.05172,"15.4":0.12068,"15.5":0.10344,"15.6":0.46117,"16.0":0.09913,"16.1":0.09913,"16.2":0.06034,"16.3":0.15085,"16.4":0.12499,"16.5":0.35342,"16.6":1.18525,"17.0":0.62495,"17.1":1.09905,"17.2":0.00862},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00346,"5.0-5.1":0.00346,"6.0-6.1":0.00865,"7.0-7.1":0.01212,"8.1-8.4":0.00173,"9.0-9.2":0.01385,"9.3":0.04327,"10.0-10.2":0.00346,"10.3":0.06231,"11.0-11.2":0.02943,"11.3-11.4":0.02596,"12.0-12.1":0.01558,"12.2-12.5":0.28387,"13.0-13.1":0.00692,"13.2":0.02943,"13.3":0.01731,"13.4-13.7":0.0502,"14.0-14.4":0.13328,"14.5-14.8":0.21636,"15.0-15.1":0.08481,"15.2-15.3":0.10385,"15.4":0.11597,"15.5":0.1627,"15.6-15.7":0.85506,"16.0":0.40157,"16.1":0.80487,"16.2":0.38599,"16.3":0.72352,"16.4":0.14886,"16.5":0.38426,"16.6-16.7":6.51337,"17.0":1.95072,"17.1":3.27659,"17.2":0.09347},P:{"4":0.04176,"20":0.17747,"21":0.07307,"22":0.46976,"23":4.12346,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 15.0","7.2-7.4":0.11483,"11.1-11.2":0.01044,"12.0":0.01044,"13.0":0.01044,"14.0":0.10439,"16.0":0.03132,"17.0":0.01044,"18.0":0.07307,"19.0":0.0522},I:{"0":0.03397,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.0001},K:{"0":0.13087,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.16522,"11":0.33043,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.01138},H:{"0":0},L:{"0":34.2044},R:{_:"0"},M:{"0":0.30157},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GQ.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GQ.js
    index c946b75ba61a3b..f804b4ee4c3c0b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GQ.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GQ.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.02657,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00664,"57":0.00664,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.01993,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0.01329,"98":0.00664,"99":0.01329,"100":0.0465,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0.00664,"113":0,"114":0.01993,"115":0.39194,"116":0.07972,"117":0.59787,"118":0.01329,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00664,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0.00664,"63":0,"64":0.00664,"65":0,"66":0,"67":0,"68":0.00664,"69":0,"70":0.00664,"71":0,"72":0.05979,"73":0,"74":0,"75":0.01329,"76":0,"77":0,"78":0.00664,"79":0.00664,"80":0,"81":0.01329,"83":0.00664,"84":0,"85":0,"86":0,"87":0.06643,"88":0.00664,"89":0,"90":0.01993,"91":0,"92":0.01329,"93":0,"94":0,"95":0.00664,"96":0,"97":0.00664,"98":0,"99":0.01329,"100":0.10629,"101":0,"102":0,"103":0.03986,"104":0,"105":0.01329,"106":0,"107":0.00664,"108":0,"109":3.01592,"110":0,"111":0,"112":0.00664,"113":0.03986,"114":0.03322,"115":0.33879,"116":12.55527,"117":1.99954,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0.00664,"62":0,"63":0.00664,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00664,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0.00664,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0.01329,"94":0,"95":0,"96":0,"97":0,"98":0.00664,"99":0,"100":0,"101":0.01329,"102":0.01329,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.01329,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.01329,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.01329,"90":0,"91":0,"92":0.03986,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0.03322,"105":0,"106":0,"107":0,"108":0,"109":0.07307,"110":0,"111":0.00664,"112":0.00664,"113":0.8038,"114":0.45172,"115":0.82373,"116":8.96141,"117":10.30994},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00664,"13.1":0.00664,"14.1":0,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0.01993,"16.0":0,"16.1":0,"16.2":0,"16.3":0,"16.4":0,"16.5":0.00664,"16.6":0.01993,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.06015,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.04327,"10.0-10.2":0,"10.3":0.01372,"11.0-11.2":0.00844,"11.3-11.4":0.00317,"12.0-12.1":0.20156,"12.2-12.5":2.70362,"13.0-13.1":0.00106,"13.2":0.00633,"13.3":0.01477,"13.4-13.7":0.09603,"14.0-14.4":1.91849,"14.5-14.8":0.29231,"15.0-15.1":0.19206,"15.2-15.3":0.12136,"15.4":0.33241,"15.5":0.08759,"15.6-15.7":1.76864,"16.0":0.14246,"16.1":0.31342,"16.2":0.11925,"16.3":0.3303,"16.4":0.2005,"16.5":0.5308,"16.6":0.94553,"17.0":0.07704,"17.1":0},P:{"4":0.19483,"20":0.01025,"21":0.03076,"22":0.84084,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.01025,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.03076,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0,"17.0":0,"18.0":0,"19.0":0.01025},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.02298,"4.4":0,"4.4.3-4.4.4":0.76474},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00664,"5.5":0},S:{"2.5":0.49348,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":43.92618},R:{_:"0"},M:{"0":0.07385},Q:{"13.1":0.00336},O:{"0":0.14435},H:{"0":0.12395}};
    +module.exports={C:{"56":0.01964,"62":0.00655,"64":0.00655,"93":0.03274,"95":0.00655,"97":0.01964,"99":0.05238,"100":0.02619,"115":0.40598,"118":0.0131,"119":0.69409,"120":0.22918,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 57 58 59 60 61 63 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 94 96 98 101 102 103 104 105 106 107 108 109 110 111 112 113 114 116 117 121 122 123 3.5 3.6"},D:{"11":0.0131,"52":0.0131,"54":0.00655,"58":0.00655,"72":0.03929,"79":0.05238,"87":0.00655,"88":0.00655,"89":0.0131,"90":0.02619,"92":0.0131,"99":0.00655,"103":0.00655,"106":0.00655,"107":0.00655,"109":3.08411,"111":0.08512,"114":0.02619,"115":0.18989,"116":0.03929,"117":0.07858,"118":3.38532,"119":10.20178,"120":0.00655,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 55 56 57 59 60 61 62 63 64 65 66 67 68 69 70 71 73 74 75 76 77 78 80 81 83 84 85 86 91 93 94 95 96 97 98 100 101 102 104 105 108 110 112 113 121 122"},F:{"46":0.00655,"95":0.02619,"102":0.01964,"103":0.0131,"104":0.04584,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00655,"13":0.00655,"18":0.20954,"84":0.0131,"89":0.01964,"92":0.0131,"104":0.03929,"106":0.02619,"108":0.00655,"109":0.15715,"110":0.13096,"112":0.00655,"113":1.27031,"114":0.12441,"115":2.22632,"116":0.1637,"117":0.19644,"118":5.96523,"119":34.41629,_:"14 15 16 17 79 80 81 83 85 86 87 88 90 91 93 94 95 96 97 98 99 100 101 102 103 105 107 111"},E:{"14":0.00655,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 13.1 15.1 15.4 15.5 16.0 16.1 16.2 16.4 16.5 17.2","12.1":0.0131,"14.1":0.00655,"15.2-15.3":0.00655,"15.6":0.0131,"16.3":0.00655,"16.6":0.0131,"17.0":0.00655,"17.1":0.00655},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00135,"5.0-5.1":0.00135,"6.0-6.1":0.00337,"7.0-7.1":0.00472,"8.1-8.4":0.00067,"9.0-9.2":0.00539,"9.3":0.01686,"10.0-10.2":0.00135,"10.3":0.02428,"11.0-11.2":0.01146,"11.3-11.4":0.01012,"12.0-12.1":0.00607,"12.2-12.5":0.1106,"13.0-13.1":0.0027,"13.2":0.01146,"13.3":0.00674,"13.4-13.7":0.01956,"14.0-14.4":0.05193,"14.5-14.8":0.0843,"15.0-15.1":0.03304,"15.2-15.3":0.04046,"15.4":0.04518,"15.5":0.06339,"15.6-15.7":0.33314,"16.0":0.15645,"16.1":0.31358,"16.2":0.15038,"16.3":0.28189,"16.4":0.058,"16.5":0.14971,"16.6-16.7":2.53766,"17.0":0.76002,"17.1":1.27658,"17.2":0.03642},P:{"4":0.07455,"21":0.0639,"22":0.38341,"23":0.22365,_:"20 5.0-5.4 7.2-7.4 8.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 19.0","6.2-6.4":0.05325,"9.2":0.05325,"17.0":0.0213,"18.0":0.01065},I:{"0":0.02061,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00006},K:{"0":0.31422,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.13096,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.65952,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.15193},H:{"0":0},L:{"0":26.70204},R:{_:"0"},M:{"0":0.06906},Q:{"13.1":0.02417}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GR.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GR.js
    index 442e08878b1c18..ac9e71bcb60203 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GR.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GR.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00456,"49":0,"50":0,"51":0,"52":0.15504,"53":0,"54":0,"55":0,"56":0.00456,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00456,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00912,"79":0,"80":0,"81":0,"82":0,"83":0.00912,"84":0,"85":0,"86":0.00456,"87":0,"88":0.00456,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.01824,"103":0,"104":0,"105":0.0684,"106":0.00456,"107":0.00456,"108":0.00456,"109":0.00456,"110":0,"111":0.00912,"112":0.0228,"113":0.0228,"114":0.00456,"115":0.76608,"116":0.05016,"117":1.2768,"118":0.11856,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.05928,"35":0,"36":0,"37":0,"38":0.08208,"39":0.05472,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.06384,"48":0,"49":0.05472,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.01824,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.00456,"71":0,"72":0,"73":0.06384,"74":0,"75":0,"76":0.00456,"77":0,"78":0,"79":0.07296,"80":0.00456,"81":0.01824,"83":0,"84":0,"85":0.00456,"86":0.00456,"87":0.00456,"88":0.00456,"89":0.01824,"90":0.00456,"91":0.00912,"92":0.00456,"93":0.00912,"94":0.00456,"95":0.00912,"96":0.00456,"97":0.00456,"98":0.00456,"99":0.01368,"100":0.00456,"101":0.00912,"102":0.05928,"103":0.01824,"104":0.00456,"105":0.01368,"106":0.03192,"107":0.00456,"108":0.01368,"109":2.80896,"110":0.00456,"111":0.00912,"112":0.01824,"113":0.01368,"114":0.07752,"115":0.08664,"116":7.51944,"117":2.14776,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0.03648,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.20064,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.20064,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.16416,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00456,"70":0,"71":0,"72":0.00912,"73":0.00456,"74":0,"75":0,"76":0,"77":0.0228,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.03648,"96":0,"97":0,"98":0,"99":0.00456,"100":0.03648,"101":0.15048,"102":0.19608,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0.07296,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00456,"109":0.0228,"110":0,"111":0.00456,"112":0.00456,"113":0,"114":0.00912,"115":0.0456,"116":0.71592,"117":0.48336},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00912,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00456,"13.1":0.01368,"14.1":0.02736,"15.1":0.00456,"15.2-15.3":0.00456,"15.4":0.00456,"15.5":0.00912,"15.6":0.05016,"16.0":0.00456,"16.1":0.01368,"16.2":0.01368,"16.3":0.03192,"16.4":0.00912,"16.5":0.04104,"16.6":0.31464,"17.0":0.01824,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00112,"6.0-6.1":0.00112,"7.0-7.1":0.17872,"8.1-8.4":0.00112,"9.0-9.2":0,"9.3":0.04271,"10.0-10.2":0,"10.3":0.04159,"11.0-11.2":0.01012,"11.3-11.4":0.00337,"12.0-12.1":0.00562,"12.2-12.5":0.23155,"13.0-13.1":0.00112,"13.2":0.00225,"13.3":0.05283,"13.4-13.7":0.0236,"14.0-14.4":0.04946,"14.5-14.8":0.12814,"15.0-15.1":0.03035,"15.2-15.3":0.04271,"15.4":0.04046,"15.5":0.08318,"15.6-15.7":0.99701,"16.0":0.23604,"16.1":0.48333,"16.2":0.24391,"16.3":0.48558,"16.4":0.07981,"16.5":0.35856,"16.6":6.44515,"17.0":0.78344,"17.1":0.00225},P:{"4":0.17523,"20":0.05154,"21":0.1443,"22":1.83471,"5.0-5.4":0.01031,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01031,"12.0":0,"13.0":0.01031,"14.0":0.02061,"15.0":0,"16.0":0.02061,"17.0":0.01031,"18.0":0.02061,"19.0":0.04123},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.26866,"4.2-4.3":0.17911,"4.4":0,"4.4.3-4.4.4":0.80599},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00456,"9":0,"10":0,"11":0.01824,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":63.4436},R:{_:"0"},M:{"0":0.25568},Q:{"13.1":0},O:{"0":0.0544},H:{"0":0.25751}};
    +module.exports={C:{"45":0.02244,"47":0.00321,"48":0.01603,"52":0.18274,"56":0.00321,"68":0.00321,"75":0.00321,"78":0.02565,"81":0.00321,"83":0.00321,"86":0.00641,"88":0.00962,"96":0.00641,"99":0.00321,"102":0.00962,"103":0.00321,"105":0.09939,"107":0.00321,"108":0.00641,"109":0.00321,"111":0.00962,"112":0.05771,"113":0.01924,"114":0.00321,"115":1.24393,"116":0.00641,"117":0.00962,"118":0.04809,"119":1.38499,"120":0.46808,"121":0.00321,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 49 50 51 53 54 55 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 76 77 79 80 82 84 85 87 89 90 91 92 93 94 95 97 98 100 101 104 106 110 122 123 3.5 3.6"},D:{"34":0.07374,"38":0.09297,"39":0.06412,"47":0.06412,"49":0.1058,"53":0.00321,"56":0.00962,"57":0.00321,"58":0.02565,"63":0.00321,"64":0.01282,"67":0.01282,"69":0.00321,"70":0.00321,"71":0.00321,"73":0.15709,"75":0.00321,"76":0.00321,"78":0.00321,"79":0.14748,"80":0.00321,"81":0.01282,"83":0.00321,"84":0.00321,"85":0.01282,"86":0.00962,"87":0.01282,"88":0.09618,"89":0.14748,"90":0.00321,"91":0.01282,"92":0.00321,"93":0.01603,"94":0.00321,"95":0.00962,"96":0.00321,"97":0.00641,"98":0.00321,"99":0.01603,"100":0.00962,"101":0.00962,"102":0.07053,"103":0.03527,"104":0.00641,"105":0.02565,"106":0.02244,"107":0.01603,"108":0.01282,"109":3.70614,"110":0.00641,"111":0.01282,"112":0.02565,"113":0.00962,"114":0.03847,"115":0.01924,"116":0.109,"117":0.20518,"118":5.19693,"119":11.16009,"120":0.00321,"121":0.00321,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 40 41 42 43 44 45 46 48 50 51 52 54 55 59 60 61 62 65 66 68 72 74 77 122"},F:{"25":0.04809,"28":0.00321,"31":0.32381,"40":0.25327,"46":0.17954,"77":0.00321,"95":0.10259,"102":0.17633,"103":0.08336,"104":0.36228,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 26 27 29 30 32 33 34 35 36 37 38 39 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"15":0.12503,"92":0.00321,"108":0.00321,"109":0.02885,"110":0.00321,"112":0.00321,"114":0.00321,"116":0.00641,"117":0.01924,"118":0.23083,"119":1.3914,_:"12 13 14 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 111 113 115"},E:{"8":0.00641,"14":0.00962,_:"0 4 5 6 7 9 10 11 12 13 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.00641,"13.1":0.01603,"14.1":0.02565,"15.1":0.00321,"15.2-15.3":0.00321,"15.4":0.00962,"15.5":0.00962,"15.6":0.07053,"16.0":0.00641,"16.1":0.01282,"16.2":0.01282,"16.3":0.03847,"16.4":0.01282,"16.5":0.02565,"16.6":0.2116,"17.0":0.06412,"17.1":0.13465,"17.2":0.00321},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00095,"5.0-5.1":0.00095,"6.0-6.1":0.00239,"7.0-7.1":0.00334,"8.1-8.4":0.00048,"9.0-9.2":0.00382,"9.3":0.01193,"10.0-10.2":0.00095,"10.3":0.01717,"11.0-11.2":0.00811,"11.3-11.4":0.00716,"12.0-12.1":0.00429,"12.2-12.5":0.07823,"13.0-13.1":0.00191,"13.2":0.00811,"13.3":0.00477,"13.4-13.7":0.01383,"14.0-14.4":0.03673,"14.5-14.8":0.05963,"15.0-15.1":0.02337,"15.2-15.3":0.02862,"15.4":0.03196,"15.5":0.04484,"15.6-15.7":0.23564,"16.0":0.11067,"16.1":0.22181,"16.2":0.10637,"16.3":0.19939,"16.4":0.04102,"16.5":0.1059,"16.6-16.7":1.79498,"17.0":0.53759,"17.1":0.90298,"17.2":0.02576},P:{"4":0.10552,"20":0.04221,"21":0.11607,"22":0.2216,"23":1.80443,"5.0-5.4":0.0211,"6.2-6.4":0.01055,"7.2-7.4":0.01055,"8.2":0.03166,"9.2":0.16884,_:"10.1","11.1-11.2":0.01055,"12.0":0.01055,"13.0":0.01055,"14.0":0.0211,"15.0":0.01055,"16.0":0.0211,"17.0":0.01055,"18.0":0.0211,"19.0":0.04221},I:{"0":0.54088,"3":0.00005,"4":0.00011,"2.1":0,"2.2":0.00011,"2.3":0,"4.1":0.00005,"4.2-4.3":0.00038,"4.4":0,"4.4.3-4.4.4":0.00163},K:{"0":0.16667,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00641,"11":0.01603,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.02718},H:{"0":0.01},L:{"0":60.79033},R:{_:"0"},M:{"0":0.16988},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GT.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GT.js
    index 601c09bf50db89..76e11dded8a7ec 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GT.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GT.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0.04327,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00361,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00721,"103":0,"104":0.00361,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0.00721,"114":0.00361,"115":0.05048,"116":0.02885,"117":0.42551,"118":0.03245,"119":0.00361,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00361,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0.00361,"76":0.00361,"77":0,"78":0.00361,"79":0.02164,"80":0,"81":0.00361,"83":0,"84":0,"85":0.01082,"86":0.01082,"87":0.00721,"88":0.00361,"89":0.00361,"90":0,"91":0.02885,"92":0,"93":0.00361,"94":0,"95":0,"96":0.00361,"97":0.00721,"98":0,"99":0.01082,"100":0.01082,"101":0.00361,"102":0,"103":0.02885,"104":0.00361,"105":0.00721,"106":0.00721,"107":0.00361,"108":0.01082,"109":0.55893,"110":0.00721,"111":0.02524,"112":0.01082,"113":0.02164,"114":0.06491,"115":0.10457,"116":5.94629,"117":1.52173,"118":0.00361,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00361,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0.00361,"72":0.01442,"73":0.00361,"74":0,"75":0,"76":0,"77":0.01442,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01082,"96":0,"97":0,"98":0,"99":0.00721,"100":0.14424,"101":0.25603,"102":0.27406,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00361,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0.00721,"99":0,"100":0.00361,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00361,"108":0.00361,"109":0.01442,"110":0.00361,"111":0.00361,"112":0.01082,"113":0.00721,"114":0.01082,"115":0.02524,"116":0.69596,"117":0.46878},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00721,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00361,"6.1":0,"7.1":0,"9.1":0.00721,"10.1":0,"11.1":0,"12.1":0.00361,"13.1":0.00721,"14.1":0.01442,"15.1":0.00361,"15.2-15.3":0.00361,"15.4":0.00361,"15.5":0.00721,"15.6":0.0577,"16.0":0.00721,"16.1":0.01803,"16.2":0.01803,"16.3":0.02885,"16.4":0.01442,"16.5":0.0577,"16.6":0.28127,"17.0":0.04327,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0.01785,"7.0-7.1":0.00162,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.00974,"10.0-10.2":0.01785,"10.3":0.01136,"11.0-11.2":0.00162,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0.13468,"13.0-13.1":0,"13.2":0,"13.3":0.00487,"13.4-13.7":0.02434,"14.0-14.4":0.05842,"14.5-14.8":0.11846,"15.0-15.1":0.02759,"15.2-15.3":0.0357,"15.4":0.05193,"15.5":0.0503,"15.6-15.7":0.73994,"16.0":0.37484,"16.1":0.64258,"16.2":0.31642,"16.3":0.6442,"16.4":0.13468,"16.5":0.43163,"16.6":10.10114,"17.0":2.02996,"17.1":0.00162},P:{"4":0.06122,"20":0.11224,"21":0.15306,"22":2.66324,"5.0-5.4":0.0102,"6.2-6.4":0,"7.2-7.4":0.10204,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.04082,"12.0":0,"13.0":0.03061,"14.0":0.05102,"15.0":0.0102,"16.0":0.05102,"17.0":0.03061,"18.0":0.04082,"19.0":0.09184},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.18245},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00361,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":66.26258},R:{_:"0"},M:{"0":0.29412},Q:{"13.1":0},O:{"0":0.06394},H:{"0":0.32083}};
    +module.exports={C:{"52":0.00322,"73":0.17045,"78":0.00643,"88":0.00322,"91":0.00322,"101":0.00322,"102":0.00643,"106":0.00322,"110":0.00322,"112":0.00322,"113":0.00643,"114":0.00643,"115":0.11578,"117":0.00322,"118":0.02894,"119":0.8651,"120":0.27014,"121":0.01286,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 74 75 76 77 79 80 81 82 83 84 85 86 87 89 90 92 93 94 95 96 97 98 99 100 103 104 105 107 108 109 111 116 122 123 3.5 3.6"},D:{"38":0.00322,"49":0.00322,"74":0.00322,"75":0.00965,"76":0.00322,"77":0.00322,"79":0.05467,"81":0.00322,"83":0.00322,"84":0.00322,"86":0.00322,"87":0.01608,"88":0.00322,"91":0.09005,"92":0.00322,"93":0.01286,"94":0.00322,"95":0.00322,"96":0.00643,"97":0.01286,"99":0.01286,"100":0.00643,"101":0.00965,"102":0.00322,"103":0.04502,"104":0.00322,"105":0.0193,"106":0.00965,"107":0.02894,"108":0.00965,"109":1.27354,"110":0.01286,"111":0.05146,"112":0.02573,"113":0.01286,"114":0.05146,"115":0.03538,"116":0.18331,"117":0.24763,"118":3.40896,"119":16.00603,"120":0.00643,"121":0.00322,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 47 48 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 78 80 85 89 90 98 122"},F:{"73":0.00643,"86":0.00322,"94":0.01286,"95":0.02251,"102":0.79114,"103":0.12864,"104":0.8233,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 74 75 76 77 78 79 80 81 82 83 84 85 87 88 89 90 91 92 93 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.00322,"92":0.00965,"96":0.00322,"100":0.00322,"107":0.00322,"108":0.00322,"109":0.03538,"110":0.00643,"111":0.00322,"112":0.01286,"113":0.01286,"114":0.00965,"115":0.00965,"116":0.01286,"117":0.03538,"118":0.47918,"119":2.69501,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 97 98 99 101 102 103 104 105 106"},E:{"14":0.00965,"15":0.00322,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 6.1 7.1 9.1 10.1 11.1","5.1":0.00965,"12.1":0.00322,"13.1":0.02251,"14.1":0.06754,"15.1":0.00322,"15.2-15.3":0.00965,"15.4":0.00965,"15.5":0.01608,"15.6":0.15437,"16.0":0.02251,"16.1":0.04181,"16.2":0.03859,"16.3":0.05467,"16.4":0.05789,"16.5":0.09005,"16.6":0.35376,"17.0":0.25406,"17.1":0.39878,"17.2":0.00965},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00222,"5.0-5.1":0.00222,"6.0-6.1":0.00554,"7.0-7.1":0.00776,"8.1-8.4":0.00111,"9.0-9.2":0.00887,"9.3":0.02771,"10.0-10.2":0.00222,"10.3":0.03991,"11.0-11.2":0.01884,"11.3-11.4":0.01663,"12.0-12.1":0.00998,"12.2-12.5":0.18179,"13.0-13.1":0.00443,"13.2":0.01884,"13.3":0.01109,"13.4-13.7":0.03215,"14.0-14.4":0.08535,"14.5-14.8":0.13856,"15.0-15.1":0.05432,"15.2-15.3":0.06651,"15.4":0.07427,"15.5":0.1042,"15.6-15.7":0.5476,"16.0":0.25717,"16.1":0.51546,"16.2":0.2472,"16.3":0.46336,"16.4":0.09533,"16.5":0.24609,"16.6-16.7":4.17131,"17.0":1.24929,"17.1":2.0984,"17.2":0.05986},P:{"4":0.04098,"20":0.08196,"21":0.09221,"22":0.28687,"23":2.54082,"5.0-5.4":0.01025,_:"6.2-6.4 8.2 9.2 10.1 12.0","7.2-7.4":0.09221,"11.1-11.2":0.06147,"13.0":0.03074,"14.0":0.04098,"15.0":0.01025,"16.0":0.05123,"17.0":0.05123,"18.0":0.03074,"19.0":0.09221},I:{"0":0.054,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00004,"4.4":0,"4.4.3-4.4.4":0.00016},K:{"0":0.39453,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.00643,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.05427},H:{"0":0.06},L:{"0":53.90755},R:{_:"0"},M:{"0":0.45453},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GU.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GU.js
    index 24f2ddf924963a..c5e16c66e1a269 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GU.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GU.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00437,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.0131,"79":0,"80":0,"81":0.0131,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0.0131,"88":0,"89":0,"90":0,"91":0.00437,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.0131,"104":0,"105":0,"106":0,"107":0.00437,"108":0,"109":0.00437,"110":0,"111":0,"112":0,"113":0.00437,"114":0,"115":0.82517,"116":0.05239,"117":0.57195,"118":0.06112,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00437,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00873,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0.00437,"76":0.00437,"77":0,"78":0,"79":0.01746,"80":0,"81":0,"83":0,"84":0,"85":0.00437,"86":0,"87":0.00873,"88":0,"89":0,"90":0.00437,"91":0,"92":0.0131,"93":0.00437,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.14844,"100":0.00873,"101":0,"102":0,"103":0.15718,"104":0,"105":0.00873,"106":0.00437,"107":0,"108":0.00437,"109":0.39731,"110":0,"111":0.03056,"112":0.09169,"113":0.04366,"114":0.09605,"115":0.37984,"116":7.40037,"117":1.5412,"118":0.02183,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00437,"73":0.00437,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.0262,"101":0.05676,"102":0.12225,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00437,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.05239,"110":0,"111":0,"112":0.00437,"113":0.00437,"114":0.07859,"115":0.47589,"116":1.45824,"117":1.08713},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.04366,"15":0.02183,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.01746,"13.1":0.04366,"14.1":0.10042,"15.1":0.00873,"15.2-15.3":0.0131,"15.4":0.0131,"15.5":0.03493,"15.6":0.4104,"16.0":0.01746,"16.1":0.05239,"16.2":0.06112,"16.3":0.2183,"16.4":0.14408,"16.5":0.32308,"16.6":1.53247,"17.0":0.03929,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.08611,"10.0-10.2":0.0041,"10.3":0.0205,"11.0-11.2":0,"11.3-11.4":0.11891,"12.0-12.1":0.17222,"12.2-12.5":0.31163,"13.0-13.1":0,"13.2":0.0492,"13.3":0.041,"13.4-13.7":0.0328,"14.0-14.4":0.22962,"14.5-14.8":0.29113,"15.0-15.1":0.20502,"15.2-15.3":0.23782,"15.4":0.18042,"15.5":0.20502,"15.6-15.7":2.01328,"16.0":1.22191,"16.1":2.32491,"16.2":1.19731,"16.3":2.51353,"16.4":1.27112,"16.5":2.03789,"16.6":24.0692,"17.0":1.75496,"17.1":0},P:{"4":0.12451,"20":0.11413,"21":0.21789,"22":3.40316,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.01038,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0,"15.0":0.13488,"16.0":0.01038,"17.0":0.01038,"18.0":0.06225,"19.0":0.10375},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.13422},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":30.94472},R:{_:"0"},M:{"0":1.94373},Q:{"13.1":0},O:{"0":0.0338},H:{"0":0.06934}};
    +module.exports={C:{"48":0.00422,"78":0.04216,"81":0.01265,"87":0.1054,"101":0.00422,"103":0.00422,"104":0.00843,"107":0.01265,"108":0.01265,"109":0.01265,"113":0.00843,"115":0.1054,"118":0.03794,"119":0.98654,"120":0.25718,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 82 83 84 85 86 88 89 90 91 92 93 94 95 96 97 98 99 100 102 105 106 110 111 112 114 116 117 121 122 123 3.5 3.6"},D:{"38":0.00422,"49":0.01265,"54":0.00422,"65":0.28669,"74":0.00422,"77":0.00843,"79":0.01265,"84":0.0253,"85":0.00422,"87":0.02108,"91":0.00422,"93":0.01265,"94":0.00843,"95":0.00843,"97":0.00422,"98":0.01686,"99":0.39209,"102":0.00422,"103":0.2361,"105":0.00422,"106":0.01265,"107":0.00422,"108":0.00422,"109":0.83055,"110":0.00843,"111":0.03794,"112":0.00843,"113":0.04216,"114":0.07589,"115":0.10118,"116":0.28247,"117":0.60289,"118":4.51112,"119":15.64558,"120":0.03794,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 47 48 50 51 52 53 55 56 57 58 59 60 61 62 63 64 66 67 68 69 70 71 72 73 75 76 78 80 81 83 86 88 89 90 92 96 100 101 104 121 122"},F:{"99":0.01686,"102":0.16864,"103":0.02108,"104":0.16442,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.01686,"92":0.00843,"98":0.00422,"108":0.00422,"109":0.04216,"110":0.00422,"113":0.01265,"114":0.26139,"115":0.00422,"116":0.08854,"117":0.09275,"118":0.77574,"119":4.11482,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 99 100 101 102 103 104 105 106 107 111 112"},E:{"13":0.00422,"14":0.19394,"15":0.01686,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.06746,"13.1":0.04638,"14.1":0.17707,"15.1":0.07589,"15.2-15.3":0.06324,"15.4":0.04216,"15.5":0.07589,"15.6":0.69142,"16.0":0.01686,"16.1":0.15599,"16.2":0.24031,"16.3":0.58602,"16.4":0.19394,"16.5":0.6577,"16.6":4.32562,"17.0":0.69986,"17.1":1.44609,"17.2":0.00422},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00631,"5.0-5.1":0.00631,"6.0-6.1":0.01578,"7.0-7.1":0.0221,"8.1-8.4":0.00316,"9.0-9.2":0.02525,"9.3":0.07892,"10.0-10.2":0.00631,"10.3":0.11365,"11.0-11.2":0.05367,"11.3-11.4":0.04735,"12.0-12.1":0.02841,"12.2-12.5":0.51773,"13.0-13.1":0.01263,"13.2":0.05367,"13.3":0.03157,"13.4-13.7":0.09155,"14.0-14.4":0.24308,"14.5-14.8":0.39461,"15.0-15.1":0.15469,"15.2-15.3":0.18941,"15.4":0.21151,"15.5":0.29675,"15.6-15.7":1.5595,"16.0":0.73239,"16.1":1.46795,"16.2":0.70398,"16.3":1.31957,"16.4":0.27149,"16.5":0.70083,"16.6-16.7":11.87932,"17.0":3.5578,"17.1":5.97596,"17.2":0.17047},P:{"4":0.04226,"20":0.01057,"21":0.07396,"22":0.41205,"23":3.01112,"5.0-5.4":0.01057,_:"6.2-6.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 17.0","7.2-7.4":0.02113,"15.0":0.05283,"16.0":0.04226,"18.0":0.02113,"19.0":0.07396},I:{"0":0.01151,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00003},K:{"0":0.13306,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.0253,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.01157},H:{"0":0},L:{"0":20.80231},R:{_:"0"},M:{"0":1.31898},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GW.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GW.js
    index e49f1b1d344c22..ebc3dd139f57d6 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GW.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GW.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.01303,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0.00434,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00434,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00869,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.02172,"116":0,"117":0.0391,"118":0.00434,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00869,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00869,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00434,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.01303,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.03041,"71":0,"72":0,"73":0,"74":0,"75":0.01303,"76":0,"77":0,"78":0,"79":0.00434,"80":0,"81":0.00869,"83":0.00434,"84":0,"85":0,"86":0,"87":0,"88":0.00434,"89":0,"90":0.18679,"91":0,"92":0,"93":0,"94":0,"95":0.00434,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.03041,"103":0.00434,"104":0,"105":0.00434,"106":0,"107":0.05213,"108":0.00434,"109":5.07814,"110":0,"111":0.2867,"112":0.00869,"113":0.00434,"114":0.02172,"115":0.03475,"116":6.05988,"117":1.55081,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00434,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00434,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00869,"69":0.00869,"70":0,"71":0,"72":0.04778,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00434,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.03475,"102":0.02172,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.01303,"13":0.00434,"14":0,"15":0.02606,"16":0,"17":0,"18":0.01738,"79":0,"80":0,"81":0,"83":0,"84":0.00869,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.02172,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.0391,"110":0,"111":0,"112":0,"113":0.00869,"114":0.0391,"115":0.29539,"116":0.92093,"117":0.83405},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.03041,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0,"16.0":0,"16.1":0,"16.2":0.02172,"16.3":0,"16.4":0,"16.5":0,"16.6":0.00434,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00149,"6.0-6.1":0,"7.0-7.1":0.01116,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.18231,"10.0-10.2":0.16594,"10.3":0.04242,"11.0-11.2":0.0506,"11.3-11.4":0.00223,"12.0-12.1":0.12278,"12.2-12.5":0.52164,"13.0-13.1":0.17785,"13.2":0,"13.3":0.13394,"13.4-13.7":0.05804,"14.0-14.4":0.16966,"14.5-14.8":0.67865,"15.0-15.1":0.52982,"15.2-15.3":0.07665,"15.4":0.02158,"15.5":0.19571,"15.6-15.7":2.48541,"16.0":0.09971,"16.1":0.06102,"16.2":0.19348,"16.3":0.37058,"16.4":0.11385,"16.5":0.19422,"16.6":0.70172,"17.0":0.06995,"17.1":0},P:{"4":0.19344,"20":0.0509,"21":0.08145,"22":0.2138,"5.0-5.4":0.01018,"6.2-6.4":0,"7.2-7.4":0.08145,"8.2":0,"9.2":0,"10.1":0.06108,"11.1-11.2":0.04072,"12.0":0,"13.0":0.02036,"14.0":0,"15.0":0.07127,"16.0":0.0509,"17.0":0.04072,"18.0":0.01018,"19.0":0.04072},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00037,"4.2-4.3":0.00097,"4.4":0,"4.4.3-4.4.4":0.03471},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0.8484,_:"3.0-3.1"},J:{"7":0,"10":0.00566},N:{"10":0,"11":0},L:{"0":73.32783},R:{_:"0"},M:{"0":0.04525},Q:{"13.1":0},O:{"0":0.06222},H:{"0":0.31057}};
    +module.exports={C:{"34":0.00388,"56":0.00777,"73":0.00388,"115":0.0738,"118":0.00388,"119":0.14371,"120":0.01942,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 116 117 121 122 123 3.5 3.6"},D:{"11":0.00388,"49":0.01942,"60":0.00388,"64":0.00388,"66":0.00388,"74":0.00388,"75":0.00777,"79":0.08156,"81":0.00388,"90":0.07768,"96":0.01942,"98":0.00388,"99":0.00388,"102":0.00777,"103":0.16313,"105":0.00388,"107":0.06603,"109":8.52538,"110":0.00777,"111":0.56318,"113":0.00388,"114":0.00777,"115":0.00388,"116":0.15148,"117":0.10487,"118":2.53625,"119":13.49302,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 50 51 52 53 54 55 56 57 58 59 61 62 63 65 67 68 69 70 71 72 73 76 77 78 80 83 84 85 86 87 88 89 91 92 93 94 95 97 100 101 104 106 108 112 120 121 122"},F:{"95":0.00388,"103":0.03107,"104":0.16701,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 102 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.01165,"13":0.00388,"14":0.00777,"18":0.05438,"89":0.0233,"92":0.03884,"109":0.05049,"114":0.00388,"115":0.78068,"116":0.03107,"117":0.26411,"118":0.90497,"119":2.99845,_:"15 16 17 79 80 81 83 84 85 86 87 88 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 111 112 113"},E:{_:"0 4 5 6 7 8 9 10 11 12 13 14 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 13.1 15.1 15.2-15.3 15.4 15.5 15.6 16.0 16.1 16.3 16.5 17.0 17.2","14.1":0.00388,"16.2":0.01942,"16.4":0.03884,"16.6":0.01942,"17.1":0.00388},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00108,"5.0-5.1":0.00108,"6.0-6.1":0.00269,"7.0-7.1":0.00376,"8.1-8.4":0.00054,"9.0-9.2":0.0043,"9.3":0.01344,"10.0-10.2":0.00108,"10.3":0.01935,"11.0-11.2":0.00914,"11.3-11.4":0.00806,"12.0-12.1":0.00484,"12.2-12.5":0.08817,"13.0-13.1":0.00215,"13.2":0.00914,"13.3":0.00538,"13.4-13.7":0.01559,"14.0-14.4":0.04139,"14.5-14.8":0.0672,"15.0-15.1":0.02634,"15.2-15.3":0.03226,"15.4":0.03602,"15.5":0.05053,"15.6-15.7":0.26557,"16.0":0.12472,"16.1":0.24998,"16.2":0.11988,"16.3":0.22472,"16.4":0.04623,"16.5":0.11935,"16.6-16.7":2.02298,"17.0":0.60587,"17.1":1.01767,"17.2":0.02903},P:{"4":0.4564,"20":0.03112,"21":0.13485,"22":0.1141,"23":0.14522,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 11.1-11.2 12.0 18.0","7.2-7.4":0.08298,"13.0":0.21783,"14.0":0.01037,"15.0":0.02075,"16.0":0.01037,"17.0":0.01037,"19.0":0.06224},I:{"0":0.01217,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00004},K:{"0":0.25192,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.04661,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.80731,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.01223},H:{"0":0.06},L:{"0":60.4375},R:{_:"0"},M:{"0":0.00612},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GY.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GY.js
    index e4dede817958d3..74501b7799e5e1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GY.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/GY.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00342,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00342,"108":0,"109":0,"110":0.00342,"111":0,"112":0,"113":0,"114":0.00342,"115":0.0649,"116":0.01366,"117":0.21179,"118":0.02733,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00342,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.01025,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.01708,"70":0.00342,"71":0,"72":0,"73":0.01366,"74":0.01025,"75":0,"76":0.00683,"77":0.00683,"78":0,"79":0.02733,"80":0,"81":0.00342,"83":0.00342,"84":0,"85":0,"86":0.00342,"87":0.02733,"88":0.05124,"89":0.00342,"90":0,"91":0.00342,"92":0.01025,"93":0.03416,"94":0,"95":0,"96":0.00342,"97":0,"98":0,"99":0,"100":0,"101":0.00683,"102":0,"103":0.06149,"104":0,"105":0.01366,"106":0.00683,"107":0.00342,"108":0.00683,"109":0.23912,"110":0.00342,"111":0.00683,"112":0.01708,"113":0.03416,"114":0.14347,"115":0.1503,"116":4.92246,"117":0.84034,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0.00342,"72":0.01366,"73":0.01025,"74":0,"75":0,"76":0,"77":0.0205,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.00342,"95":0.00683,"96":0,"97":0,"98":0,"99":0.00342,"100":0.02733,"101":0.21862,"102":0.20496,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0.00342,"16":0,"17":0.00342,"18":0.00342,"79":0,"80":0,"81":0,"83":0,"84":0.03074,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00342,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.01708,"110":0,"111":0.00342,"112":0.00342,"113":0.00342,"114":0.02733,"115":0.04441,"116":1.0248,"117":0.63196},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.0854,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00342,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.01366,"14.1":0.01366,"15.1":0.00683,"15.2-15.3":0,"15.4":0.01025,"15.5":0.01025,"15.6":0.03416,"16.0":0.01025,"16.1":0.01366,"16.2":0.00683,"16.3":0.01708,"16.4":0.00683,"16.5":0.03758,"16.6":0.23912,"17.0":0.05807,"17.1":0},G:{"8":0,"3.2":0.00275,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.03298,"6.0-6.1":0,"7.0-7.1":0.0742,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.07008,"10.0-10.2":0,"10.3":0.0371,"11.0-11.2":0.01512,"11.3-11.4":0,"12.0-12.1":0.01099,"12.2-12.5":0.28444,"13.0-13.1":0.00275,"13.2":0,"13.3":0,"13.4-13.7":0.00962,"14.0-14.4":0.05222,"14.5-14.8":0.08245,"15.0-15.1":0.03298,"15.2-15.3":0.03435,"15.4":0.02473,"15.5":0.09619,"15.6-15.7":1.52387,"16.0":0.29131,"16.1":0.43009,"16.2":0.24871,"16.3":0.45208,"16.4":0.06321,"16.5":0.54002,"16.6":8.17587,"17.0":0.92339,"17.1":0},P:{"4":0.25211,"20":0.15757,"21":0.30463,"22":4.59043,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.22059,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.08404,"12.0":0,"13.0":0.03151,"14.0":0.03151,"15.0":0.0105,"16.0":0.06303,"17.0":0.04202,"18.0":0.06303,"19.0":0.14706},I:{"0":0,"3":0,"4":0.07128,"2.1":0,"2.2":0,"2.3":0,"4.1":0.1782,"4.2-4.3":0.07128,"4.4":0,"4.4.3-4.4.4":0.7128},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.02391,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":66.27956},R:{_:"0"},M:{"0":0.07242},Q:{"13.1":0},O:{"0":0.35554},H:{"0":0.36777}};
    +module.exports={C:{"52":0.00314,"103":0.00314,"107":0.00943,"115":0.11943,"117":0.00314,"118":0.02514,"119":0.43688,"120":0.13201,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 104 105 106 108 109 110 111 112 113 114 116 121 122 123 3.5 3.6"},D:{"11":0.00314,"31":0.00314,"42":0.01257,"46":0.00314,"48":0.00314,"49":0.02514,"54":0.00314,"62":0.00314,"63":0.00314,"67":0.00314,"69":0.022,"73":0.02829,"74":0.00314,"75":0.01886,"76":0.01886,"77":0.02829,"79":0.11629,"80":0.00314,"81":0.01257,"83":0.00629,"85":0.00314,"86":0.01257,"87":0.01886,"88":0.01257,"90":0.022,"91":0.00314,"92":0.00629,"93":0.088,"94":0.00314,"95":0.00314,"97":0.00629,"98":0.00314,"99":0.00943,"101":0.01572,"102":0.00314,"103":0.07543,"104":0.00629,"105":0.08486,"106":0.00314,"107":0.00314,"108":0.00943,"109":0.59088,"110":0.00943,"111":0.01572,"112":0.07543,"113":0.00629,"114":0.044,"115":0.03143,"116":0.25144,"117":0.2483,"118":3.79989,"119":13.52119,"120":0.022,"121":0.00314,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 33 34 35 36 37 38 39 40 41 43 44 45 47 50 51 52 53 55 56 57 58 59 60 61 64 65 66 68 70 71 72 78 84 89 96 100 122"},F:{"36":0.00314,"95":0.01886,"102":0.52488,"103":0.11001,"104":0.72918,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"14":0.00314,"15":0.00314,"16":0.022,"18":0.00629,"84":0.00314,"91":0.00314,"92":0.01257,"100":0.00314,"103":0.00314,"107":0.00314,"109":0.05029,"112":0.00629,"113":0.00943,"114":0.00629,"115":0.00314,"116":0.02514,"117":0.10058,"118":0.93976,"119":4.12676,_:"12 13 17 79 80 81 83 85 86 87 88 89 90 93 94 95 96 97 98 99 101 102 104 105 106 108 110 111"},E:{"14":0.09429,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 6.1 7.1 9.1 10.1 12.1 15.2-15.3","5.1":0.00629,"11.1":0.00314,"13.1":0.04715,"14.1":0.02514,"15.1":0.00943,"15.4":0.09429,"15.5":0.01886,"15.6":0.15401,"16.0":0.01572,"16.1":0.01572,"16.2":0.01572,"16.3":0.05657,"16.4":0.01572,"16.5":0.33944,"16.6":0.24201,"17.0":0.07858,"17.1":0.39602,"17.2":0.00314},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00183,"5.0-5.1":0.00183,"6.0-6.1":0.00458,"7.0-7.1":0.00641,"8.1-8.4":0.00092,"9.0-9.2":0.00732,"9.3":0.02289,"10.0-10.2":0.00183,"10.3":0.03295,"11.0-11.2":0.01556,"11.3-11.4":0.01373,"12.0-12.1":0.00824,"12.2-12.5":0.15013,"13.0-13.1":0.00366,"13.2":0.01556,"13.3":0.00915,"13.4-13.7":0.02655,"14.0-14.4":0.07049,"14.5-14.8":0.11443,"15.0-15.1":0.04486,"15.2-15.3":0.05492,"15.4":0.06133,"15.5":0.08605,"15.6-15.7":0.45221,"16.0":0.21238,"16.1":0.42567,"16.2":0.20414,"16.3":0.38264,"16.4":0.07873,"16.5":0.20322,"16.6-16.7":3.44469,"17.0":1.03167,"17.1":1.73287,"17.2":0.04943},P:{"4":0.19202,"20":0.06401,"21":0.17069,"22":0.45872,"23":3.62712,"5.0-5.4":0.05334,"6.2-6.4":0.01067,"7.2-7.4":0.20269,_:"8.2 9.2 10.1 14.0","11.1-11.2":0.08534,"12.0":0.02134,"13.0":0.02134,"15.0":0.01067,"16.0":0.04267,"17.0":0.04267,"18.0":0.032,"19.0":0.22403},I:{"0":0.04776,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00014},K:{"0":0.88455,_:"10 11 12 11.1 11.5 12.1"},A:{"10":0.0088,"11":0.0132,_:"6 7 8 9 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.39085},H:{"0":0},L:{"0":55.33075},R:{_:"0"},M:{"0":0.13714},Q:{"13.1":0.01371}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/HK.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/HK.js
    index 52c1b875692c02..1dde9322bb13e2 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/HK.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/HK.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.01385,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00462,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00462,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00923,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00923,"103":0,"104":0,"105":0,"106":0.00923,"107":0.00462,"108":0,"109":0.00462,"110":0.00462,"111":0.00923,"112":0.00462,"113":0.00462,"114":0.00923,"115":0.07846,"116":0.03231,"117":0.40151,"118":0.03231,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.00462,"27":0,"28":0,"29":0,"30":0.00462,"31":0,"32":0,"33":0,"34":0.02769,"35":0,"36":0,"37":0,"38":0.07384,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00462,"49":0.01385,"50":0,"51":0,"52":0,"53":0.02308,"54":0,"55":0.00923,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0.02308,"62":0,"63":0,"64":0,"65":0.00462,"66":0,"67":0.00462,"68":0,"69":0.00923,"70":0.00462,"71":0.00462,"72":0.00462,"73":0.00462,"74":0.01846,"75":0.00923,"76":0.00462,"77":0.00462,"78":0.01385,"79":0.36459,"80":0.00923,"81":0.01385,"83":0.04154,"84":0.00462,"85":0.00462,"86":0.02308,"87":0.11076,"88":0.00462,"89":0.06461,"90":0.00923,"91":0.02769,"92":0.01385,"93":0,"94":0.03692,"95":0.00923,"96":0.00923,"97":0.01385,"98":0.01385,"99":0.08769,"100":0.01385,"101":0.01385,"102":0.01846,"103":0.06923,"104":0.00923,"105":0.01846,"106":0.02308,"107":0.02308,"108":0.03692,"109":0.85378,"110":0.01846,"111":0.02769,"112":0.07846,"113":0.11076,"114":0.26306,"115":0.35997,"116":7.18556,"117":1.69832,"118":0.02308,"119":0.00462,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00462,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.01385,"37":0,"38":0,"39":0,"40":0.00462,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.05538,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00462,"73":0,"74":0,"75":0,"76":0,"77":0.00923,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.02308,"96":0,"97":0,"98":0,"99":0.00462,"100":0.00462,"101":0.03692,"102":0.03231,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00462,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00462,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00462,"108":0.00462,"109":0.08769,"110":0.00923,"111":0.00462,"112":0.00923,"113":0.02308,"114":0.03231,"115":0.06461,"116":1.22298,"117":0.76148},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.00462,"13":0.01846,"14":0.07384,"15":0.01846,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00462,"10.1":0,"11.1":0,"12.1":0.01385,"13.1":0.06,"14.1":0.15691,"15.1":0.01846,"15.2-15.3":0.02308,"15.4":0.07846,"15.5":0.0923,"15.6":0.40151,"16.0":0.03231,"16.1":0.07384,"16.2":0.07846,"16.3":0.25844,"16.4":0.06923,"16.5":0.22152,"16.6":1.96599,"17.0":0.05077,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.02234,"6.0-6.1":0.01117,"7.0-7.1":0.01862,"8.1-8.4":0.08191,"9.0-9.2":0.00745,"9.3":0.15266,"10.0-10.2":0.00372,"10.3":0.13032,"11.0-11.2":0.01489,"11.3-11.4":0.02234,"12.0-12.1":0.03351,"12.2-12.5":0.6553,"13.0-13.1":0.01117,"13.2":0.01117,"13.3":0.04096,"13.4-13.7":0.08191,"14.0-14.4":0.3351,"14.5-14.8":0.54733,"15.0-15.1":0.26435,"15.2-15.3":0.27925,"15.4":0.44307,"15.5":0.40956,"15.6-15.7":2.32707,"16.0":1.1021,"16.1":1.99942,"16.2":0.98668,"16.3":2.06271,"16.4":0.36116,"16.5":1.12444,"16.6":22.3808,"17.0":1.03508,"17.1":0.00372},P:{"4":1.04633,"20":0.09609,"21":0.26692,"22":4.8473,"5.0-5.4":0.14948,"6.2-6.4":0.02135,"7.2-7.4":0,"8.2":0,"9.2":0.01068,"10.1":0,"11.1-11.2":0.01068,"12.0":0.01068,"13.0":0.04271,"14.0":0.02135,"15.0":0.01068,"16.0":0.04271,"17.0":0.07474,"18.0":0.05338,"19.0":0.07474},I:{"0":0,"3":0,"4":0.0189,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00378,"4.4":0,"4.4.3-4.4.4":0.06425},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.08175,"10":0,"11":0.20438,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0.00539,"11":0},L:{"0":32.73159},R:{_:"0"},M:{"0":0.19925},Q:{"13.1":0.07001},O:{"0":0.28002},H:{"0":0.09687}};
    +module.exports={C:{"34":0.03463,"52":0.00866,"68":0.00433,"72":0.00866,"78":0.01299,"84":0.00433,"88":0.00866,"101":0.00433,"102":0.00866,"104":0.00433,"106":0.00433,"107":0.00433,"108":0.00433,"109":0.00433,"111":0.00433,"113":0.00433,"114":0.00433,"115":0.14286,"116":0.00433,"117":0.00866,"118":0.02597,"119":0.71429,"120":0.19481,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 73 74 75 76 77 79 80 81 82 83 85 86 87 89 90 91 92 93 94 95 96 97 98 99 100 103 105 110 112 121 122 123 3.5 3.6"},D:{"11":0.00433,"25":0.00433,"26":0.00866,"30":0.00866,"34":0.06061,"38":0.14286,"42":0.00433,"45":0.00433,"48":0.00433,"49":0.03463,"51":0.00433,"53":0.03463,"54":0.00433,"55":0.01299,"58":0.00433,"61":0.03896,"62":0.00433,"63":0.00433,"65":0.00433,"66":0.00433,"67":0.01299,"68":0.00433,"69":0.01299,"70":0.00866,"71":0.00433,"72":0.00866,"73":0.00433,"74":0.03463,"75":0.01732,"76":0.00433,"77":0.00433,"78":0.0303,"79":0.79654,"80":0.01732,"81":0.02165,"83":0.07359,"84":0.00866,"85":0.00866,"86":0.04329,"87":0.25974,"88":0.00433,"89":0.08225,"90":0.01299,"91":0.03896,"92":0.00866,"93":0.00866,"94":0.15152,"95":0.02597,"96":0.02165,"97":0.03896,"98":0.0303,"99":0.08658,"100":0.04329,"101":0.0303,"102":0.03896,"103":0.13853,"104":0.02165,"105":0.03896,"106":0.02165,"107":0.05628,"108":0.06061,"109":1.67532,"110":0.0303,"111":0.04329,"112":0.11688,"113":0.07359,"114":0.15584,"115":0.09957,"116":0.49784,"117":0.69264,"118":4.30736,"119":15.91773,"120":0.03896,"121":0.03896,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 27 28 29 31 32 33 35 36 37 39 40 41 43 44 46 47 50 52 56 57 59 60 64 122"},F:{"28":0.01299,"36":0.0303,"40":0.00433,"46":0.11688,"95":0.05195,"102":0.03463,"103":0.0303,"104":0.08225,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00433,"17":0.00433,"18":0.01299,"92":0.00866,"106":0.00433,"107":0.00433,"108":0.00866,"109":0.18615,"110":0.01732,"111":0.01299,"112":0.00866,"113":0.0303,"114":0.0303,"115":0.02597,"116":0.03463,"117":0.07359,"118":0.75758,"119":3.58441,_:"13 14 15 16 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105"},E:{"8":0.00433,"12":0.00866,"13":0.03463,"14":0.14719,"15":0.03896,_:"0 4 5 6 7 9 10 11 3.1 3.2 5.1 6.1 7.1 9.1 10.1","11.1":0.00433,"12.1":0.0303,"13.1":0.11688,"14.1":0.32468,"15.1":0.04329,"15.2-15.3":0.03896,"15.4":0.1645,"15.5":0.19048,"15.6":0.83983,"16.0":0.06926,"16.1":0.14719,"16.2":0.14719,"16.3":0.48918,"16.4":0.11688,"16.5":0.32035,"16.6":3.34199,"17.0":0.45455,"17.1":0.99567,"17.2":0.01299},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00479,"5.0-5.1":0.00479,"6.0-6.1":0.01198,"7.0-7.1":0.01677,"8.1-8.4":0.0024,"9.0-9.2":0.01917,"9.3":0.0599,"10.0-10.2":0.00479,"10.3":0.08626,"11.0-11.2":0.04073,"11.3-11.4":0.03594,"12.0-12.1":0.02156,"12.2-12.5":0.39294,"13.0-13.1":0.00958,"13.2":0.04073,"13.3":0.02396,"13.4-13.7":0.06948,"14.0-14.4":0.18449,"14.5-14.8":0.2995,"15.0-15.1":0.1174,"15.2-15.3":0.14376,"15.4":0.16053,"15.5":0.22522,"15.6-15.7":1.18362,"16.0":0.55587,"16.1":1.11414,"16.2":0.53431,"16.3":1.00153,"16.4":0.20606,"16.5":0.53191,"16.6-16.7":9.01614,"17.0":2.70029,"17.1":4.53562,"17.2":0.12938},P:{"4":1.0809,"20":0.07882,"21":0.16889,"22":0.37156,"23":4.76273,"5.0-5.4":0.15763,"6.2-6.4":0.03378,_:"7.2-7.4 8.2 10.1","9.2":0.01126,"11.1-11.2":0.01126,"12.0":0.01126,"13.0":0.04504,"14.0":0.02252,"15.0":0.01126,"16.0":0.03378,"17.0":0.0563,"18.0":0.04504,"19.0":0.0563},I:{"0":0.02821,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.00009},K:{"0":0.10775,_:"10 11 12 11.1 11.5 12.1"},A:{"9":0.17316,"11":0.4329,_:"6 7 8 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.30056},H:{"0":0},L:{"0":25.94365},R:{_:"0"},M:{"0":0.23251},Q:{"13.1":0.08507}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/HN.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/HN.js
    index ee2bf26bd77375..14d8d315102c13 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/HN.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/HN.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00427,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0.02563,"74":0,"75":0,"76":0,"77":0,"78":0.00427,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00854,"103":0,"104":0,"105":0.00427,"106":0.00854,"107":0,"108":0.00427,"109":0,"110":0.00427,"111":0,"112":0.00427,"113":0.00854,"114":0.00427,"115":0.06834,"116":0.0299,"117":0.36731,"118":0.05979,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00427,"35":0,"36":0,"37":0,"38":0.00427,"39":0,"40":0,"41":0.00427,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00427,"50":0,"51":0,"52":0,"53":0.00854,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00427,"66":0,"67":0,"68":0.00427,"69":0.00427,"70":0,"71":0,"72":0,"73":0.00427,"74":0,"75":0.00854,"76":0.01281,"77":0,"78":0.00427,"79":0.12813,"80":0,"81":0.00854,"83":0,"84":0,"85":0.00854,"86":0.00854,"87":0.02563,"88":0.01281,"89":0,"90":0.00427,"91":0.02563,"92":0.00427,"93":0.03844,"94":0.00427,"95":0,"96":0.00427,"97":0.00854,"98":0,"99":0.02563,"100":0,"101":0.00427,"102":0.02563,"103":0.06407,"104":0.01281,"105":0.00854,"106":0.02136,"107":0.00427,"108":0.96952,"109":0.63638,"110":0.00427,"111":0.01708,"112":0.21782,"113":0.0299,"114":0.09823,"115":0.19647,"116":7.7177,"117":2.21665,"118":0.00427,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0.00427,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00427,"70":0,"71":0.00854,"72":0.01281,"73":0,"74":0,"75":0,"76":0,"77":0.01281,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0.00427,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.02136,"96":0,"97":0,"98":0,"99":0.00427,"100":0.11105,"101":0.3246,"102":0.36304,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00427,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0.00427,"88":0,"89":0,"90":0,"91":0,"92":0.00854,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00427,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00427,"108":0.00427,"109":0.01281,"110":0.00854,"111":0.00427,"112":0.00427,"113":0.00854,"114":0.0299,"115":0.04271,"116":0.91399,"117":0.80722},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00427,"14":0.00427,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00427,"6.1":0,"7.1":0,"9.1":0.00427,"10.1":0,"11.1":0,"12.1":0.00427,"13.1":0.00854,"14.1":0.01281,"15.1":0.00427,"15.2-15.3":0.00427,"15.4":0.00427,"15.5":0.00427,"15.6":0.04698,"16.0":0.00854,"16.1":0.02563,"16.2":0.01708,"16.3":0.04698,"16.4":0.01281,"16.5":0.05125,"16.6":0.2648,"17.0":0.0299,"17.1":0},G:{"8":0.00336,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00336,"6.0-6.1":0.04531,"7.0-7.1":0.02182,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.07217,"10.0-10.2":0,"10.3":0.4414,"11.0-11.2":0.00671,"11.3-11.4":0.00336,"12.0-12.1":0.00671,"12.2-12.5":0.17958,"13.0-13.1":0.00336,"13.2":0.00336,"13.3":0.02182,"13.4-13.7":0.04028,"14.0-14.4":0.36419,"14.5-14.8":0.14433,"15.0-15.1":0.07217,"15.2-15.3":0.04364,"15.4":0.07217,"15.5":0.28699,"15.6-15.7":1.61118,"16.0":0.54881,"16.1":0.7116,"16.2":0.32224,"16.3":0.74181,"16.4":0.10406,"16.5":0.58237,"16.6":8.67854,"17.0":1.32083,"17.1":0},P:{"4":0.22913,"20":0.0729,"21":0.23954,"22":2.41624,"5.0-5.4":0.02083,"6.2-6.4":0,"7.2-7.4":0.13539,"8.2":0,"9.2":0.02083,"10.1":0,"11.1-11.2":0.05207,"12.0":0.01041,"13.0":0.04166,"14.0":0.01041,"15.0":0.01041,"16.0":0.05207,"17.0":0.04166,"18.0":0.03124,"19.0":0.10415},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.0675,"4.4":0,"4.4.3-4.4.4":0.25876},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01281,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":60.70294},R:{_:"0"},M:{"0":0.10885},Q:{"13.1":0},O:{"0":0.10885},H:{"0":0.31458}};
    +module.exports={C:{"52":0.00815,"73":0.07337,"78":0.00815,"88":0.00408,"102":0.00408,"105":0.00815,"108":0.02446,"112":0.00408,"113":0.0163,"114":0.00408,"115":0.13858,"116":0.03261,"117":0.04484,"118":0.34238,"119":0.69292,"120":0.19972,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 74 75 76 77 79 80 81 82 83 84 85 86 87 89 90 91 92 93 94 95 96 97 98 99 100 101 103 104 106 107 109 110 111 121 122 123 3.5 3.6"},D:{"38":0.02038,"41":0.02446,"43":0.00408,"47":0.00408,"49":0.00815,"53":0.00815,"56":0.00408,"57":0.00408,"60":0.00408,"65":0.00408,"68":0.00408,"69":0.02853,"70":0.00408,"73":0.00815,"74":0.00408,"75":0.00815,"76":0.0163,"77":0.00408,"79":0.25271,"80":0.00408,"81":0.01223,"83":0.00815,"84":0.00408,"85":0.00815,"86":0.02038,"87":0.03261,"88":0.02853,"89":0.00815,"90":0.00815,"91":0.01223,"92":0.00408,"93":0.05299,"94":0.01223,"96":0.00815,"97":0.0163,"98":0.01223,"99":0.02853,"100":0.00815,"101":0.00815,"102":0.0163,"103":0.11005,"104":0.00408,"105":0.05299,"106":0.04891,"107":0.02038,"108":2.58011,"109":1.45513,"110":0.0163,"111":0.0163,"112":0.02038,"113":0.0163,"114":0.07337,"115":0.04484,"116":0.31793,"117":0.54211,"118":5.54336,"119":16.5934,"120":0.00408,"121":0.00408,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 42 44 45 46 48 50 51 52 54 55 58 59 61 62 63 64 66 67 71 72 78 95 122"},F:{"85":0.00408,"86":0.00815,"95":0.04076,"99":0.00815,"101":0.00408,"102":0.84781,"103":0.15896,"104":0.90487,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 87 88 89 90 91 92 93 94 96 97 98 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"16":0.00408,"18":0.00408,"92":0.02446,"100":0.00408,"103":0.00408,"105":0.00408,"109":0.04076,"110":0.00408,"112":0.00815,"113":0.01223,"114":0.0163,"115":0.04484,"116":0.02446,"117":0.15081,"118":0.77036,"119":3.51351,_:"12 13 14 15 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 101 102 104 106 107 108 111"},E:{"14":0.01223,"15":0.00815,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 6.1 7.1 10.1 11.1","5.1":0.01223,"9.1":0.00408,"12.1":0.00408,"13.1":0.02446,"14.1":0.04076,"15.1":0.00815,"15.2-15.3":0.00815,"15.4":0.01223,"15.5":0.0163,"15.6":0.09782,"16.0":0.01223,"16.1":0.02853,"16.2":0.03261,"16.3":0.1182,"16.4":0.02038,"16.5":0.0856,"16.6":0.4239,"17.0":0.23233,"17.1":0.30162,"17.2":0.00815},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00251,"5.0-5.1":0.00251,"6.0-6.1":0.00628,"7.0-7.1":0.0088,"8.1-8.4":0.00126,"9.0-9.2":0.01005,"9.3":0.03142,"10.0-10.2":0.00251,"10.3":0.04524,"11.0-11.2":0.02136,"11.3-11.4":0.01885,"12.0-12.1":0.01131,"12.2-12.5":0.2061,"13.0-13.1":0.00503,"13.2":0.02136,"13.3":0.01257,"13.4-13.7":0.03644,"14.0-14.4":0.09677,"14.5-14.8":0.15709,"15.0-15.1":0.06158,"15.2-15.3":0.0754,"15.4":0.0842,"15.5":0.11813,"15.6-15.7":0.62081,"16.0":0.29155,"16.1":0.58436,"16.2":0.28024,"16.3":0.5253,"16.4":0.10808,"16.5":0.27899,"16.6-16.7":4.72893,"17.0":1.41629,"17.1":2.37892,"17.2":0.06786},P:{"4":0.23911,"20":0.09356,"21":0.15594,"22":0.31188,"23":2.02722,"5.0-5.4":0.03119,"6.2-6.4":0.02079,"7.2-7.4":0.11436,_:"8.2 10.1","9.2":0.0104,"11.1-11.2":0.07277,"12.0":0.0104,"13.0":0.03119,"14.0":0.0104,"15.0":0.02079,"16.0":0.06238,"17.0":0.05198,"18.0":0.02079,"19.0":0.10396},I:{"0":0.04716,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00014},K:{"0":0.3318,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.01223,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.08295},H:{"0":0},L:{"0":45.10493},R:{_:"0"},M:{"0":0.13035},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/HR.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/HR.js
    index 9e5aa0bfb36fb0..55a4010fc8694c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/HR.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/HR.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.03433,"49":0,"50":0,"51":0,"52":0.01716,"53":0,"54":0,"55":0.00429,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00429,"69":0,"70":0,"71":0,"72":0.00429,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.01287,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00429,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00429,"100":0,"101":0,"102":0.03433,"103":0.00429,"104":0,"105":0.00429,"106":0.00429,"107":0.02575,"108":0.00858,"109":0.00429,"110":0.00429,"111":0.03433,"112":0.00858,"113":0.01716,"114":0.00858,"115":0.25746,"116":0.07724,"117":1.29159,"118":0.12873,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0.00858,"42":0,"43":0.00429,"44":0.00429,"45":0,"46":0.00429,"47":0.00429,"48":0,"49":0.01716,"50":0,"51":0.00429,"52":0,"53":0.00429,"54":0,"55":0,"56":0.00429,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00429,"67":0,"68":0,"69":0,"70":0.00429,"71":0,"72":0,"73":0,"74":0,"75":0.00429,"76":0.00429,"77":0.00858,"78":0,"79":0.06437,"80":0.00429,"81":0.02575,"83":0,"84":0.00429,"85":0.00429,"86":0.00429,"87":0.02146,"88":0.00429,"89":0.00429,"90":0.00429,"91":0.00429,"92":0.00429,"93":0.00429,"94":0.00429,"95":0.00858,"96":0.00429,"97":0.00429,"98":0.00429,"99":0.01287,"100":0.00858,"101":0.00429,"102":0.00429,"103":0.02146,"104":0.00429,"105":0.01287,"106":0.03862,"107":0.01287,"108":0.01287,"109":0.86249,"110":0.00858,"111":0.02146,"112":0.04291,"113":0.02575,"114":0.09011,"115":0.17164,"116":8.30738,"117":2.65184,"118":0.00429,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00429,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00858,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00429,"70":0.00429,"71":0,"72":0.01716,"73":0.00429,"74":0,"75":0,"76":0,"77":0.03433,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00429,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00429,"93":0,"94":0.00429,"95":0.03433,"96":0,"97":0,"98":0,"99":0.00429,"100":0.09011,"101":0.32183,"102":0.3819,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0.00429,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00429,"108":0.00429,"109":0.03433,"110":0.00429,"111":0,"112":0.00429,"113":0.00858,"114":0.01287,"115":0.03433,"116":0.75093,"117":0.59216},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00429,"10":0,"11":0,"12":0,"13":0.00429,"14":0.01287,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.01716,"14.1":0.03004,"15.1":0.02146,"15.2-15.3":0.00429,"15.4":0.00858,"15.5":0.01287,"15.6":0.07724,"16.0":0.02575,"16.1":0.02146,"16.2":0.08153,"16.3":0.0472,"16.4":0.01287,"16.5":0.05578,"16.6":0.39477,"17.0":0.01716,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00802,"8.1-8.4":0.01283,"9.0-9.2":0,"9.3":0.08177,"10.0-10.2":0,"10.3":0.02886,"11.0-11.2":0.02726,"11.3-11.4":0.00481,"12.0-12.1":0.02726,"12.2-12.5":0.1972,"13.0-13.1":0,"13.2":0.0016,"13.3":0.00641,"13.4-13.7":0.03046,"14.0-14.4":0.06253,"14.5-14.8":0.19399,"15.0-15.1":0.06734,"15.2-15.3":0.05611,"15.4":0.05932,"15.5":0.13147,"15.6-15.7":0.88339,"16.0":0.42646,"16.1":0.91385,"16.2":0.48097,"16.3":0.89461,"16.4":0.18277,"16.5":0.6397,"16.6":9.40945,"17.0":1.06776,"17.1":0.00321},P:{"4":0.1846,"20":0.0923,"21":0.22563,"22":3.84591,"5.0-5.4":0.02051,"6.2-6.4":0.01026,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0.01026,"11.1-11.2":0.01026,"12.0":0,"13.0":0.01026,"14.0":0.02051,"15.0":0.01026,"16.0":0.03077,"17.0":0.03077,"18.0":0.03077,"19.0":0.05128},I:{"0":0,"3":0,"4":0.013,"2.1":0,"2.2":0.0065,"2.3":0.00975,"4.1":0.02275,"4.2-4.3":0.02275,"4.4":0,"4.4.3-4.4.4":0.091},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01287,"9":0.00429,"10":0.00429,"11":0.03862,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0.00571},N:{"10":0,"11":0},L:{"0":57.5626},R:{_:"0"},M:{"0":0.50239},Q:{"13.1":0},O:{"0":0.07993},H:{"0":0.5513}};
    +module.exports={C:{"48":0.29881,"52":0.03794,"56":0.00474,"57":0.00474,"72":0.01897,"78":0.00949,"88":0.00949,"91":0.00474,"98":0.00474,"102":0.00949,"103":0.00474,"104":0.00474,"105":0.00949,"106":0.00474,"107":0.04743,"108":0.02846,"109":0.00949,"110":0.00474,"111":0.01897,"112":0.01423,"113":0.01423,"114":0.00474,"115":0.57865,"116":0.01423,"117":0.01897,"118":0.07115,"119":2.48059,"120":0.67825,"121":0.00474,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 49 50 51 53 54 55 58 59 60 61 62 63 64 65 66 67 68 69 70 71 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 90 92 93 94 95 96 97 99 100 101 122 123 3.5 3.6"},D:{"41":0.04269,"44":0.00474,"46":0.00474,"47":0.00474,"48":0.00474,"49":0.08537,"51":0.00474,"53":0.00949,"59":0.00474,"63":0.00474,"66":0.00474,"69":0.00474,"70":0.00474,"73":0.00474,"75":0.01423,"76":0.00474,"77":0.0332,"78":0.00474,"79":0.23241,"80":0.00949,"81":0.06166,"83":0.00474,"85":0.00949,"86":0.00949,"87":0.04743,"88":0.00949,"89":0.01423,"90":0.00949,"91":0.00474,"92":0.00474,"93":0.00949,"94":0.01423,"95":0.01897,"96":0.00949,"97":0.01423,"98":0.00474,"99":0.02846,"100":0.01423,"101":0.01423,"102":0.02846,"103":0.07115,"104":0.00474,"105":0.0332,"106":0.0664,"107":0.02372,"108":0.0664,"109":1.93514,"110":0.04743,"111":0.04269,"112":0.04269,"113":0.02372,"114":0.07589,"115":0.0332,"116":0.25138,"117":0.31778,"118":5.58251,"119":25.38454,"120":0.00474,"121":0.00474,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 42 43 45 50 52 54 55 56 57 58 60 61 62 64 65 67 68 71 72 74 84 122"},F:{"28":0.00474,"46":0.02372,"85":0.00474,"95":0.08537,"99":0.00474,"101":0.00474,"102":0.55019,"103":0.23715,"104":0.97232,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 86 87 88 89 90 91 92 93 94 96 97 98 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.00474,"92":0.00949,"100":0.00474,"105":0.00474,"108":0.01897,"109":0.07589,"110":0.00474,"112":0.00474,"113":0.00474,"114":0.01423,"115":0.01423,"116":0.0332,"117":0.04269,"118":0.53596,"119":2.82209,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 101 102 103 104 106 107 111"},E:{"9":0.00474,"13":0.00949,"14":0.02372,_:"0 4 5 6 7 8 10 11 12 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.00949,"13.1":0.04743,"14.1":0.05692,"15.1":0.00949,"15.2-15.3":0.00949,"15.4":0.01423,"15.5":0.03794,"15.6":0.16126,"16.0":0.03794,"16.1":0.0332,"16.2":0.01897,"16.3":0.0664,"16.4":0.0332,"16.5":0.04743,"16.6":0.38418,"17.0":0.11858,"17.1":0.24189,"17.2":0.00474},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00175,"5.0-5.1":0.00175,"6.0-6.1":0.00438,"7.0-7.1":0.00613,"8.1-8.4":0.00088,"9.0-9.2":0.007,"9.3":0.02188,"10.0-10.2":0.00175,"10.3":0.03151,"11.0-11.2":0.01488,"11.3-11.4":0.01313,"12.0-12.1":0.00788,"12.2-12.5":0.14355,"13.0-13.1":0.0035,"13.2":0.01488,"13.3":0.00875,"13.4-13.7":0.02538,"14.0-14.4":0.0674,"14.5-14.8":0.10941,"15.0-15.1":0.04289,"15.2-15.3":0.05252,"15.4":0.05864,"15.5":0.08228,"15.6-15.7":0.43239,"16.0":0.20307,"16.1":0.40701,"16.2":0.19519,"16.3":0.36587,"16.4":0.07527,"16.5":0.19431,"16.6-16.7":3.29372,"17.0":0.98645,"17.1":1.65692,"17.2":0.04727},P:{"4":0.25572,"20":0.05114,"21":0.08183,"22":0.37846,"23":2.94588,"5.0-5.4":0.04091,"6.2-6.4":0.01023,"7.2-7.4":0.01023,_:"8.2 12.0","9.2":0.01023,"10.1":0.01023,"11.1-11.2":0.02046,"13.0":0.01023,"14.0":0.01023,"15.0":0.01023,"16.0":0.03069,"17.0":0.02046,"18.0":0.02046,"19.0":0.04091},I:{"0":0.068,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00005,"4.4":0,"4.4.3-4.4.4":0.00021},K:{"0":0.49942,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.01455,"9":0.00485,"10":0.00485,"11":0.18918,_:"6 7 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.07886},H:{"0":0},L:{"0":39.29143},R:{_:"0"},M:{"0":0.39428},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/HT.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/HT.js
    index 894db5bebca84e..80f0a4cf9ad8ae 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/HT.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/HT.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.00123,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.00123,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0.0049,"114":0,"115":0.00245,"116":0.00858,"117":0.02083,"118":0.00245,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00123,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00123,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0.00123,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00368,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00123,"57":0,"58":0.00123,"59":0,"60":0.00123,"61":0,"62":0,"63":0,"64":0.0049,"65":0,"66":0,"67":0,"68":0,"69":0.00123,"70":0.00245,"71":0,"72":0,"73":0,"74":0.00245,"75":0.0049,"76":0.00368,"77":0,"78":0.00123,"79":0.00123,"80":0.00123,"81":0.00613,"83":0.00123,"84":0.00123,"85":0,"86":0.00123,"87":0.00368,"88":0.00368,"89":0,"90":0.00368,"91":0.00245,"92":0.00245,"93":0.02205,"94":0.00245,"95":0.00123,"96":0,"97":0.00123,"98":0,"99":0,"100":0.00123,"101":0.00245,"102":0.00123,"103":0.00613,"104":0,"105":0.0049,"106":0.00858,"107":0.00123,"108":0.00245,"109":0.05268,"110":0.00123,"111":0.00123,"112":0.00613,"113":0.0049,"114":0.0147,"115":0.0245,"116":0.26828,"117":0.06615,"118":0.00368,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.00123,"68":0,"69":0.00123,"70":0.00123,"71":0.00368,"72":0.0098,"73":0.00245,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0.00123,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00245,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.0147,"102":0.0196,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00245,"13":0,"14":0.00123,"15":0.00123,"16":0,"17":0,"18":0.00123,"79":0,"80":0,"81":0,"83":0,"84":0.00123,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00123,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0.01348,"107":0,"108":0,"109":0.00735,"110":0,"111":0,"112":0,"113":0.00123,"114":0.00123,"115":0.0049,"116":0.08453,"117":0.0588},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00123,"12":0,"13":0.00123,"14":0.00123,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00123,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00123,"14.1":0.00368,"15.1":0.00123,"15.2-15.3":0,"15.4":0,"15.5":0.00245,"15.6":0.0049,"16.0":0.00368,"16.1":0,"16.2":0,"16.3":0.00368,"16.4":0.00123,"16.5":0.00245,"16.6":0.00858,"17.0":0.00123,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0.00438,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.12703,"10.0-10.2":0,"10.3":0.06461,"11.0-11.2":0.00219,"11.3-11.4":0.00986,"12.0-12.1":0.27159,"12.2-12.5":1.58682,"13.0-13.1":0.0898,"13.2":0.01533,"13.3":0.09308,"13.4-13.7":0.5158,"14.0-14.4":0.93413,"14.5-14.8":0.81586,"15.0-15.1":0.42052,"15.2-15.3":0.36686,"15.4":0.16865,"15.5":0.32087,"15.6-15.7":1.93287,"16.0":0.46323,"16.1":0.29349,"16.2":0.25626,"16.3":0.50594,"16.4":0.15222,"16.5":0.38329,"16.6":0.93742,"17.0":0.18836,"17.1":0.00219},P:{"4":0.3623,"20":0.16562,"21":0.21738,"22":0.62109,"5.0-5.4":0.05176,"6.2-6.4":0.03105,"7.2-7.4":0.19668,"8.2":0.0207,"9.2":0.26914,"10.1":0,"11.1-11.2":0.31055,"12.0":0.01035,"13.0":0.16562,"14.0":0.08281,"15.0":0.01035,"16.0":0.22773,"17.0":0.06211,"18.0":0.12422,"19.0":0.12422},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00177,"4.2-4.3":0.01312,"4.4":0,"4.4.3-4.4.4":0.09963},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00123,"5.5":0},S:{"2.5":0.00878,_:"3.0-3.1"},J:{"7":0,"10":0.02633},N:{"10":0,"11":0},L:{"0":83.73843},R:{_:"0"},M:{"0":0.1404},Q:{"13.1":0},O:{"0":0.22815},H:{"0":0.29077}};
    +module.exports={C:{"77":0.05372,"84":0.00128,"112":0.00256,"115":0.06011,"118":0.09593,"119":0.24301,"120":0.06139,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 78 79 80 81 82 83 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 113 114 116 117 121 122 123 3.5 3.6"},D:{"11":0.00256,"30":0.00128,"33":0.00128,"34":0.01023,"42":0.00128,"43":0.00256,"49":0.00384,"50":0.00128,"51":0.00128,"53":0.00128,"55":0.00128,"56":0.00256,"57":0.00128,"58":0.00128,"59":0.00128,"60":0.00128,"63":0.00256,"64":0.00128,"66":0.00128,"67":0.00128,"68":0.00128,"69":0.00384,"70":0.00895,"72":0.00384,"74":0.0064,"75":0.0064,"76":0.04477,"77":0.00256,"78":0.00128,"79":0.00384,"80":0.00384,"81":0.08441,"83":0.00256,"84":0.00384,"85":0.00128,"86":0.01919,"87":0.00895,"88":0.01791,"89":0.00128,"90":0.01279,"91":0.00512,"92":0.02686,"93":0.08697,"94":0.00895,"95":0.00384,"96":0.00128,"97":0.0064,"98":0.00256,"99":0.00384,"100":0.00256,"101":0.00128,"102":0.01407,"103":0.11767,"104":0.00128,"105":0.02942,"106":0.01407,"107":0.02302,"108":0.01407,"109":0.31336,"110":0.01023,"111":0.00767,"112":0.01791,"113":0.01023,"114":0.02302,"115":0.03325,"116":0.07418,"117":0.09209,"118":0.68938,"119":2.58358,"120":0.0064,"121":0.00128,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 31 32 35 36 37 38 39 40 41 44 45 46 47 48 52 54 61 62 65 71 73 122"},F:{"30":0.00128,"71":0.00128,"79":0.00128,"82":0.00256,"95":0.01663,"102":0.01663,"103":0.06651,"104":0.14197,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 72 73 74 75 76 77 78 80 81 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00895,"13":0.00384,"14":0.00256,"15":0.00256,"16":0.00512,"17":0.00256,"18":0.00767,"80":0.00512,"84":0.00128,"85":0.00384,"89":0.00256,"90":0.00128,"92":0.00895,"99":0.00128,"103":0.00128,"107":0.0064,"108":0.0064,"109":0.05756,"110":0.00128,"111":0.00128,"112":0.00384,"113":0.00256,"114":0.00767,"115":0.00384,"116":0.05628,"117":0.0243,"118":0.21615,"119":0.87228,_:"79 81 83 86 87 88 91 93 94 95 96 97 98 100 101 102 104 105 106"},E:{"13":0.01151,"14":0.04349,_:"0 4 5 6 7 8 9 10 11 12 15 3.1 3.2 6.1 9.1 10.1 15.1","5.1":0.00384,"7.1":0.00256,"11.1":0.00128,"12.1":0.00256,"13.1":0.03837,"14.1":0.0243,"15.2-15.3":0.00256,"15.4":0.0064,"15.5":0.00128,"15.6":0.02558,"16.0":0.00256,"16.1":0.00256,"16.2":0.00128,"16.3":0.02174,"16.4":0.01151,"16.5":0.01151,"16.6":0.03965,"17.0":0.10872,"17.1":0.05116,"17.2":0.00128},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00208,"5.0-5.1":0.00208,"6.0-6.1":0.0052,"7.0-7.1":0.00728,"8.1-8.4":0.00104,"9.0-9.2":0.00832,"9.3":0.02599,"10.0-10.2":0.00208,"10.3":0.03743,"11.0-11.2":0.01767,"11.3-11.4":0.01559,"12.0-12.1":0.00936,"12.2-12.5":0.1705,"13.0-13.1":0.00416,"13.2":0.01767,"13.3":0.0104,"13.4-13.7":0.03015,"14.0-14.4":0.08005,"14.5-14.8":0.12996,"15.0-15.1":0.05094,"15.2-15.3":0.06238,"15.4":0.06966,"15.5":0.09773,"15.6-15.7":0.51359,"16.0":0.2412,"16.1":0.48344,"16.2":0.23184,"16.3":0.43458,"16.4":0.08941,"16.5":0.23081,"16.6-16.7":3.91225,"17.0":1.1717,"17.1":1.96808,"17.2":0.05614},P:{"4":0.35922,"20":0.06158,"21":0.12316,"22":0.16422,"23":0.2258,"5.0-5.4":0.03079,"6.2-6.4":0.02053,"7.2-7.4":0.09237,"8.2":0.01026,"9.2":0.18474,"10.1":0.01026,"11.1-11.2":0.25659,_:"12.0","13.0":0.08211,"14.0":0.16422,"15.0":0.01026,"16.0":0.21553,"17.0":0.05132,"18.0":0.10264,"19.0":0.04105},I:{"0":0.01736,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00005},K:{"0":0.32271,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.0064,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.01744,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.06978},H:{"0":0},L:{"0":79.58922},R:{_:"0"},M:{"0":0.157},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/HU.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/HU.js
    index ad343a7f3151aa..8f1a81cb6ab7d5 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/HU.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/HU.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.02591,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.0037,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.0037,"79":0,"80":0,"81":0,"82":0,"83":0.0037,"84":0,"85":0,"86":0,"87":0,"88":0.0037,"89":0.0037,"90":0,"91":0.0037,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0.0037,"99":0.0037,"100":0,"101":0,"102":0.02962,"103":0.0074,"104":0.0037,"105":0.0037,"106":0,"107":0,"108":0.0037,"109":0.0037,"110":0.0037,"111":0.0037,"112":0.0037,"113":0.0074,"114":0.02221,"115":0.98473,"116":0.07034,"117":1.15132,"118":0.10366,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.01111,"35":0,"36":0,"37":0,"38":0.01481,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.0037,"48":0,"49":0.01111,"50":0,"51":0,"52":0,"53":0.0074,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.0037,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0.0037,"77":0,"78":0.0037,"79":0.13697,"80":0.01851,"81":0.0037,"83":0.0074,"84":0,"85":0.0037,"86":0,"87":0.02591,"88":0.0037,"89":0.0074,"90":0.0037,"91":0.0037,"92":0.0037,"93":0,"94":0.0037,"95":0.0074,"96":0.0037,"97":0.0037,"98":0,"99":0.01481,"100":0.0037,"101":0.0037,"102":0.0037,"103":0.01851,"104":0.01111,"105":0.0074,"106":0.01481,"107":0.0074,"108":0.01111,"109":0.75891,"110":0.0074,"111":0.0074,"112":0.01851,"113":0.01111,"114":0.05183,"115":0.11106,"116":5.38271,"117":1.4771,"118":0.0037,"119":0.0037,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.0037,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.0037,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.01111,"73":0.0037,"74":0,"75":0,"76":0,"77":0.02221,"78":0,"79":0.0037,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.0037,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.04813,"96":0,"97":0,"98":0,"99":0.0037,"100":0.04442,"101":0.28876,"102":0.29986,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.02962,"110":0.0037,"111":0,"112":0.05923,"113":0.0037,"114":0.01111,"115":0.02591,"116":0.61453,"117":0.42203},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.0074,"15":0.0037,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.0037,"10.1":0,"11.1":0,"12.1":0.0037,"13.1":0.01111,"14.1":0.01481,"15.1":0.0037,"15.2-15.3":0.0037,"15.4":0.0074,"15.5":0.0074,"15.6":0.04442,"16.0":0.0037,"16.1":0.01481,"16.2":0.01111,"16.3":0.02962,"16.4":0.01111,"16.5":0.04442,"16.6":0.22952,"17.0":0.02591,"17.1":0},G:{"8":0.00303,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00152,"6.0-6.1":0,"7.0-7.1":0.00455,"8.1-8.4":0,"9.0-9.2":0.0091,"9.3":0.02124,"10.0-10.2":0,"10.3":0.02428,"11.0-11.2":0.00607,"11.3-11.4":0.00455,"12.0-12.1":0.00455,"12.2-12.5":0.16691,"13.0-13.1":0.00303,"13.2":0,"13.3":0.08649,"13.4-13.7":0.02124,"14.0-14.4":0.05918,"14.5-14.8":0.16691,"15.0-15.1":0.04249,"15.2-15.3":0.05159,"15.4":0.14415,"15.5":0.09408,"15.6-15.7":1.0819,"16.0":0.51288,"16.1":0.66765,"16.2":0.30651,"16.3":0.58268,"16.4":0.1138,"16.5":0.42184,"16.6":8.77205,"17.0":1.57961,"17.1":0.00303},P:{"4":0.4336,"20":0.08259,"21":0.1755,"22":2.77708,"5.0-5.4":0.02065,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01032,"12.0":0,"13.0":0.01032,"14.0":0.01032,"15.0":0,"16.0":0.02065,"17.0":0.01032,"18.0":0.02065,"19.0":0.06194},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0.05382,"2.3":0,"4.1":0.04613,"4.2-4.3":0.03075,"4.4":0,"4.4.3-4.4.4":0.12301},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.0037,"9":0,"10":0,"11":0.01111,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":65.48935},R:{_:"0"},M:{"0":0.3086},Q:{"13.1":0},O:{"0":0.02519},H:{"0":0.41142}};
    +module.exports={C:{"52":0.0447,"61":0.00373,"66":0.00373,"68":0.00373,"72":0.00373,"77":0.00373,"78":0.01118,"83":0.00373,"84":0.00373,"88":0.00745,"89":0.00373,"91":0.00373,"94":0.00373,"95":0.00373,"97":0.00373,"98":0.00373,"99":0.00373,"101":0.00373,"102":0.0149,"103":0.00745,"104":0.00745,"105":0.00373,"106":0.00373,"107":0.00745,"108":0.00373,"109":0.00745,"110":0.00373,"111":0.00373,"112":0.00745,"113":0.01118,"114":0.00745,"115":0.75618,"116":0.59973,"117":0.2086,"118":0.06705,"119":2.46595,"120":1.22925,"121":0.00373,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 62 63 64 65 67 69 70 71 73 74 75 76 79 80 81 82 85 86 87 90 92 93 96 100 122 123 3.5 3.6"},D:{"26":0.00373,"34":0.01863,"38":0.03725,"47":0.00373,"49":0.0298,"53":0.00745,"58":0.00745,"68":0.00373,"74":0.00373,"75":0.00373,"76":0.00373,"78":0.00373,"79":0.37623,"80":0.02235,"81":0.00373,"83":0.01118,"84":0.00373,"85":0.00373,"86":0.00373,"87":0.06705,"88":0.00745,"89":0.00373,"90":0.00745,"91":0.00373,"92":0.00373,"93":0.00373,"94":0.00745,"95":0.00745,"96":0.00373,"97":0.00373,"98":0.00373,"99":0.01118,"100":0.00373,"101":0.00373,"102":0.01118,"103":0.04843,"104":0.00373,"105":0.01118,"106":0.00745,"107":0.01118,"108":0.02235,"109":1.91093,"110":0.01118,"111":0.01118,"112":0.03353,"113":0.01118,"114":0.03353,"115":0.0298,"116":0.31663,"117":0.596,"118":3.81813,"119":15.64873,"120":0.00745,"121":0.00373,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 27 28 29 30 31 32 33 35 36 37 39 40 41 42 43 44 45 46 48 50 51 52 54 55 56 57 59 60 61 62 63 64 65 66 67 69 70 71 72 73 77 122"},F:{"28":0.00373,"36":0.00745,"40":0.00373,"46":0.01118,"79":0.00373,"85":0.00745,"86":0.00373,"95":0.12665,"99":0.00373,"101":0.0149,"102":0.58855,"103":0.27938,"104":0.81205,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 87 88 89 90 91 92 93 94 96 97 98 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.00373},B:{"18":0.00373,"92":0.00373,"97":0.00373,"108":0.00373,"109":0.07823,"113":0.0298,"114":0.00745,"115":0.00373,"116":0.43583,"117":0.59228,"118":0.42838,"119":2.25735,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 98 99 100 101 102 103 104 105 106 107 110 111 112"},E:{"13":0.00373,"14":0.0149,"15":0.00745,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.00373,"13.1":0.0298,"14.1":0.0447,"15.1":0.00745,"15.2-15.3":0.00745,"15.4":0.0149,"15.5":0.0149,"15.6":0.11548,"16.0":0.01863,"16.1":0.0298,"16.2":0.0298,"16.3":0.07078,"16.4":0.02608,"16.5":0.06333,"16.6":0.3427,"17.0":0.16763,"17.1":0.29428,"17.2":0.00745},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00199,"5.0-5.1":0.00199,"6.0-6.1":0.00498,"7.0-7.1":0.00697,"8.1-8.4":0.001,"9.0-9.2":0.00797,"9.3":0.02491,"10.0-10.2":0.00199,"10.3":0.03587,"11.0-11.2":0.01694,"11.3-11.4":0.01494,"12.0-12.1":0.00897,"12.2-12.5":0.1634,"13.0-13.1":0.00399,"13.2":0.01694,"13.3":0.00996,"13.4-13.7":0.02889,"14.0-14.4":0.07672,"14.5-14.8":0.12454,"15.0-15.1":0.04882,"15.2-15.3":0.05978,"15.4":0.06675,"15.5":0.09365,"15.6-15.7":0.49218,"16.0":0.23114,"16.1":0.46328,"16.2":0.22218,"16.3":0.41646,"16.4":0.08568,"16.5":0.22118,"16.6-16.7":3.74912,"17.0":1.12284,"17.1":1.88602,"17.2":0.0538},P:{"4":0.40336,"20":0.06206,"21":0.08274,"22":0.25856,"23":2.44085,"5.0-5.4":0.02069,"6.2-6.4":0.01034,_:"7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 15.0","13.0":0.02069,"14.0":0.01034,"16.0":0.02069,"17.0":0.01034,"18.0":0.02069,"19.0":0.05171},I:{"0":0.12485,"3":0.00001,"4":0.00003,"2.1":0,"2.2":0.00003,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00009,"4.4":0,"4.4.3-4.4.4":0.00038},K:{"0":0.458,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.0041,"11":0.03688,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.01882},H:{"0":0},L:{"0":48.9993},R:{_:"0"},M:{"0":0.25723},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ID.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ID.js
    index 200d1e3660c825..11a1efcefcc7b3 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ID.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ID.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.02533,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00362,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.00362,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00362,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00362,"100":0,"101":0,"102":0.00362,"103":0,"104":0,"105":0.00362,"106":0.00362,"107":0.00362,"108":0.00362,"109":0.00362,"110":0.00362,"111":0.00362,"112":0.00362,"113":0.01448,"114":0.00724,"115":0.12305,"116":0.05067,"117":0.72742,"118":0.06876,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00362,"69":0.00362,"70":0.00362,"71":0.00362,"72":0.00362,"73":0,"74":0.00362,"75":0.00362,"76":0,"77":0,"78":0.00362,"79":0.01086,"80":0.00724,"81":0.00724,"83":0.00362,"84":0.00362,"85":0.00362,"86":0.00362,"87":0.00724,"88":0.00724,"89":0.00724,"90":0.00724,"91":0.00362,"92":0.00362,"93":0.00362,"94":0.00362,"95":0.00362,"96":0.00362,"97":0.00362,"98":0.00362,"99":0.01448,"100":0.01086,"101":0.00362,"102":0.00724,"103":0.0181,"104":0.00724,"105":0.01086,"106":0.01086,"107":0.01448,"108":0.0181,"109":0.69847,"110":0.01086,"111":0.02895,"112":0.02533,"113":0.02533,"114":0.10133,"115":0.1339,"116":6.76391,"117":1.61769,"118":0.00362,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.01086,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.01086,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00724,"70":0.01086,"71":0.01448,"72":0.13028,"73":0.03257,"74":0,"75":0,"76":0,"77":0.01448,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01086,"96":0,"97":0,"98":0,"99":0,"100":0.01448,"101":0.06876,"102":0.06876,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00362,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00362,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00362,"109":0.01448,"110":0,"111":0,"112":0.00362,"113":0.00362,"114":0.01086,"115":0.0181,"116":0.61161,"117":0.50304},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00724,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.01086,"6.1":0,"7.1":0,"9.1":0.01086,"10.1":0,"11.1":0,"12.1":0.00362,"13.1":0.01448,"14.1":0.02533,"15.1":0.00724,"15.2-15.3":0.00362,"15.4":0.00724,"15.5":0.00724,"15.6":0.03619,"16.0":0.00724,"16.1":0.0181,"16.2":0.01086,"16.3":0.02533,"16.4":0.01448,"16.5":0.03619,"16.6":0.10495,"17.0":0.00724,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00093,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.0093,"10.0-10.2":0.00093,"10.3":0.00744,"11.0-11.2":0.00372,"11.3-11.4":0.00093,"12.0-12.1":0.00744,"12.2-12.5":0.14418,"13.0-13.1":0.00465,"13.2":0.00465,"13.3":0.0679,"13.4-13.7":0.02697,"14.0-14.4":0.1172,"14.5-14.8":0.1851,"15.0-15.1":0.0893,"15.2-15.3":0.10511,"15.4":0.16185,"15.5":0.21022,"15.6-15.7":1.06597,"16.0":0.5488,"16.1":0.62414,"16.2":0.36276,"16.3":0.69018,"16.4":0.22789,"16.5":0.54322,"16.6":3.67322,"17.0":0.3423,"17.1":0},P:{"4":0.09196,"20":0.0613,"21":0.13283,"22":1.06261,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.05109,"8.2":0,"9.2":0.01022,"10.1":0,"11.1-11.2":0.02043,"12.0":0.01022,"13.0":0.02043,"14.0":0.02043,"15.0":0.01022,"16.0":0.03065,"17.0":0.04087,"18.0":0.04087,"19.0":0.0613},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.04362},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.02533,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":71.88824},R:{_:"0"},M:{"0":0.08933},Q:{"13.1":0},O:{"0":1.59525},H:{"0":0.92429}};
    +module.exports={C:{"36":0.05891,"45":0.00393,"52":0.00785,"56":0.00393,"72":0.00393,"78":0.00393,"88":0.00393,"90":0.00393,"99":0.00393,"100":0.00393,"101":0.00393,"102":0.00393,"103":0.00393,"104":0.00393,"105":0.00393,"106":0.00393,"107":0.00785,"108":0.00393,"109":0.00393,"110":0.01178,"111":0.00393,"112":0.00393,"113":0.02749,"114":0.00785,"115":0.30631,"116":0.01178,"117":0.01571,"118":0.43197,"119":1.66505,"120":0.51444,"121":0.00785,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 46 47 48 49 50 51 53 54 55 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 91 92 93 94 95 96 97 98 122 123 3.5 3.6"},D:{"25":0.00393,"49":0.00393,"56":0.00393,"57":0.00393,"63":0.01964,"70":0.00785,"71":0.01571,"72":0.00393,"73":0.00393,"74":0.15315,"76":0.00785,"78":0.00393,"79":0.14137,"80":0.06676,"81":0.05105,"83":0.00393,"84":0.00393,"85":0.17672,"86":0.01571,"87":0.05891,"88":0.00393,"89":0.04712,"90":0.00785,"91":0.06283,"92":0.01964,"93":0.00393,"94":0.00393,"95":0.00785,"96":0.01571,"97":0.00785,"98":0.01178,"99":0.05105,"100":0.03142,"101":0.00785,"102":0.01571,"103":0.0432,"104":0.01178,"105":0.02356,"106":0.02749,"107":0.02749,"108":0.03927,"109":1.95172,"110":0.02749,"111":0.11388,"112":0.04712,"113":0.02749,"114":0.08247,"115":0.06283,"116":0.23955,"117":0.31809,"118":5.98868,"119":19.635,"120":0.00785,"121":0.00393,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 50 51 52 53 54 55 58 59 60 61 62 64 65 66 67 68 69 75 77 122"},F:{"28":0.00785,"37":0.00393,"95":0.02749,"102":0.07461,"103":0.11388,"104":0.25526,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00393,"14":0.00393,"17":0.00393,"18":0.01178,"92":0.00785,"100":0.00393,"107":0.00393,"108":0.00393,"109":0.02356,"110":0.00393,"111":0.00393,"112":0.00393,"113":0.00393,"114":0.00785,"115":0.00785,"116":0.01571,"117":0.03142,"118":0.71079,"119":2.76461,_:"13 15 16 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 101 102 103 104 105 106"},E:{"13":0.00393,"14":0.01964,"15":0.01178,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 6.1 7.1 9.1 10.1 11.1","5.1":0.01571,"12.1":0.00785,"13.1":0.03142,"14.1":0.08247,"15.1":0.01571,"15.2-15.3":0.01178,"15.4":0.01964,"15.5":0.02356,"15.6":0.1021,"16.0":0.01964,"16.1":0.05891,"16.2":0.02749,"16.3":0.07069,"16.4":0.03927,"16.5":0.06676,"16.6":0.21991,"17.0":0.13745,"17.1":0.11781,"17.2":0.00393},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00121,"5.0-5.1":0.00121,"6.0-6.1":0.00302,"7.0-7.1":0.00423,"8.1-8.4":0.0006,"9.0-9.2":0.00483,"9.3":0.01509,"10.0-10.2":0.00121,"10.3":0.02173,"11.0-11.2":0.01026,"11.3-11.4":0.00905,"12.0-12.1":0.00543,"12.2-12.5":0.099,"13.0-13.1":0.00241,"13.2":0.01026,"13.3":0.00604,"13.4-13.7":0.01751,"14.0-14.4":0.04648,"14.5-14.8":0.07546,"15.0-15.1":0.02958,"15.2-15.3":0.03622,"15.4":0.04044,"15.5":0.05674,"15.6-15.7":0.29821,"16.0":0.14005,"16.1":0.2807,"16.2":0.13462,"16.3":0.25233,"16.4":0.05191,"16.5":0.13401,"16.6-16.7":2.27156,"17.0":0.68032,"17.1":1.14272,"17.2":0.0326},P:{"4":0.08158,"20":0.04079,"21":0.08158,"22":0.22436,"23":0.88723,_:"5.0-5.4 8.2 10.1","6.2-6.4":0.0102,"7.2-7.4":0.06119,"9.2":0.0102,"11.1-11.2":0.0204,"12.0":0.0102,"13.0":0.0204,"14.0":0.0204,"15.0":0.0102,"16.0":0.03059,"17.0":0.04079,"18.0":0.0204,"19.0":0.05099},I:{"0":0.02417,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.00007},K:{"0":0.78949,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.05498,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":1.76724},H:{"0":0},L:{"0":50.99012},R:{_:"0"},M:{"0":0.07288},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IE.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IE.js
    index bd4c61fbcbd341..281ca72852c2c8 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IE.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IE.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00351,"53":0.07024,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00702,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0.00351,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00702,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.01405,"103":0.00351,"104":0,"105":0,"106":0.00351,"107":0.02458,"108":0.01756,"109":0,"110":0.00351,"111":0.00351,"112":0.00351,"113":0.01054,"114":0.00351,"115":0.04214,"116":0.04214,"117":0.53734,"118":0.04566,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00351,"39":0.00702,"40":0.00351,"41":0.00702,"42":0.00351,"43":0.00351,"44":0.00702,"45":0.00702,"46":0.00351,"47":0.00351,"48":0.00351,"49":0.01405,"50":0.00351,"51":0.00702,"52":0.00351,"53":0.00702,"54":0.00351,"55":0.00351,"56":0.00351,"57":0.00351,"58":0.00351,"59":0.00351,"60":0.00351,"61":0,"62":0,"63":0.00702,"64":0,"65":0.00351,"66":0,"67":0,"68":0,"69":0,"70":0.00351,"71":0,"72":0,"73":0,"74":0.22126,"75":0.0281,"76":0.00351,"77":0,"78":0,"79":0.01756,"80":0.00351,"81":0.09834,"83":0.00351,"84":0.00351,"85":0.00351,"86":0,"87":0.01405,"88":0.00351,"89":0.01405,"90":0.00351,"91":0.00702,"92":0.00351,"93":0.01054,"94":0.00351,"95":0,"96":0.00702,"97":0.00351,"98":0,"99":0.00351,"100":0.00351,"101":0.00351,"102":0.00702,"103":0.04214,"104":0.00702,"105":0.05268,"106":0.01054,"107":0.01054,"108":0.01405,"109":0.2037,"110":0.01054,"111":0.01405,"112":0.0281,"113":0.0281,"114":0.18614,"115":0.18614,"116":4.57614,"117":1.48558,"118":0.00351,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00351,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.01054,"73":0.00351,"74":0,"75":0,"76":0,"77":0.00702,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00702,"96":0,"97":0,"98":0,"99":0.00351,"100":0.03512,"101":0.08078,"102":0.13346,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00351,"109":0.01054,"110":0.00351,"111":0.00351,"112":0.00702,"113":0.00351,"114":0.02458,"115":0.03863,"116":0.80074,"117":0.6743},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00351,"14":0.04917,"15":0.00351,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00351,"13.1":0.03161,"14.1":0.07024,"15.1":0.01054,"15.2-15.3":0.01054,"15.4":0.02458,"15.5":0.02458,"15.6":0.17911,"16.0":0.01756,"16.1":0.03863,"16.2":0.06322,"16.3":0.16858,"16.4":0.03863,"16.5":0.10536,"16.6":0.75508,"17.0":0.03161,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.06376,"8.1-8.4":0.01875,"9.0-9.2":0,"9.3":0.12001,"10.0-10.2":0,"10.3":0.09376,"11.0-11.2":0.21377,"11.3-11.4":0.01875,"12.0-12.1":0.01125,"12.2-12.5":0.80256,"13.0-13.1":0,"13.2":0.015,"13.3":0.01875,"13.4-13.7":0.05625,"14.0-14.4":0.18001,"14.5-14.8":0.50254,"15.0-15.1":0.11251,"15.2-15.3":0.19127,"15.4":0.16126,"15.5":0.34503,"15.6-15.7":2.67772,"16.0":1.31636,"16.1":2.74522,"16.2":1.14759,"16.3":2.23893,"16.4":0.26252,"16.5":1.01633,"16.6":21.25296,"17.0":1.49637,"17.1":0},P:{"4":0.03119,"20":0.09357,"21":0.19753,"22":3.73232,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.02079,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.0104,"12.0":0,"13.0":0.02079,"14.0":0.02079,"15.0":0.0104,"16.0":0.04159,"17.0":0.03119,"18.0":0.03119,"19.0":0.07278},I:{"0":0,"3":0,"4":0.03475,"2.1":0,"2.2":0,"2.3":0.05792,"4.1":0.01158,"4.2-4.3":0.03475,"4.4":0,"4.4.3-4.4.4":0.2085},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00351,"9":0.06322,"10":0,"11":0.02107,"5.5":0},S:{"2.5":0.00649,_:"3.0-3.1"},J:{"7":0,"10":0.00649},N:{"10":0,"11":0},L:{"0":43.34356},R:{_:"0"},M:{"0":0.51255},Q:{"13.1":0},O:{"0":0.03244},H:{"0":0.2457}};
    +module.exports={C:{"52":0.00692,"67":0.00346,"78":0.02767,"80":0.00346,"81":0.00346,"85":0.00346,"87":0.02075,"88":0.00346,"102":0.00346,"104":0.00346,"107":0.02767,"108":0.00692,"109":0.00346,"111":0.01384,"113":0.00692,"115":0.1349,"116":0.00692,"117":0.01038,"118":0.04843,"119":1.08267,"120":0.31131,"121":0.00346,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 68 69 70 71 72 73 74 75 76 77 79 82 83 84 86 89 90 91 92 93 94 95 96 97 98 99 100 101 103 105 106 110 112 114 122 123 3.5 3.6"},D:{"17":0.00346,"36":0.00346,"38":0.00346,"39":0.03459,"40":0.03459,"41":0.03459,"42":0.03459,"43":0.03459,"44":0.03805,"45":0.03805,"46":0.03459,"47":0.03805,"48":0.03459,"49":0.0588,"50":0.03459,"51":0.03805,"52":0.03459,"53":0.04151,"54":0.03459,"55":0.03805,"56":0.03805,"57":0.03805,"58":0.03459,"59":0.03459,"60":0.03805,"63":0.01038,"67":0.00346,"69":0.00346,"70":0.00346,"74":0.0173,"75":0.00346,"76":0.01038,"79":0.04497,"80":0.00692,"81":0.13836,"83":0.00692,"84":0.00692,"85":0.0173,"86":0.00692,"87":0.05534,"88":0.02075,"89":0.02075,"90":0.00346,"91":0.01384,"92":0.01038,"93":0.03459,"94":0.00346,"95":0.00346,"96":0.00692,"97":0.00346,"98":0.00692,"99":0.00692,"100":0.00692,"101":0.00692,"102":0.0173,"103":0.12798,"104":0.01038,"105":0.02075,"106":0.0173,"107":0.02075,"108":0.02767,"109":0.51885,"110":0.04151,"111":0.02075,"112":0.02075,"113":0.03113,"114":0.24559,"115":0.09685,"116":0.33552,"117":0.44621,"118":3.881,"119":14.57969,"120":0.00692,"121":0.00692,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 61 62 64 65 66 68 71 72 73 77 78 122"},F:{"40":0.00346,"46":0.00692,"85":0.00346,"89":0.00346,"92":0.00346,"95":0.01384,"102":0.30093,"103":0.06572,"104":0.33206,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 86 87 88 90 91 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.00346,"85":0.00346,"92":0.00346,"105":0.00346,"106":0.00346,"107":0.00346,"108":0.00346,"109":0.02767,"110":0.00692,"111":0.00346,"112":0.01038,"113":0.00346,"114":0.00692,"115":0.00692,"116":0.04151,"117":0.15911,"118":0.7091,"119":3.34831,_:"12 13 14 15 16 17 79 80 81 83 84 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104"},E:{"8":0.00692,"9":0.00346,"13":0.01384,"14":0.10723,"15":0.01384,_:"0 4 5 6 7 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.01384,"13.1":0.08302,"14.1":0.16949,"15.1":0.02767,"15.2-15.3":0.02075,"15.4":0.06572,"15.5":0.07264,"15.6":0.39433,"16.0":0.04151,"16.1":0.09339,"16.2":0.12107,"16.3":0.30785,"16.4":0.0588,"16.5":0.18333,"16.6":1.36976,"17.0":0.29747,"17.1":0.53269,"17.2":0.01038},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00532,"5.0-5.1":0.00532,"6.0-6.1":0.01329,"7.0-7.1":0.0186,"8.1-8.4":0.00266,"9.0-9.2":0.02126,"9.3":0.06644,"10.0-10.2":0.00532,"10.3":0.09567,"11.0-11.2":0.04518,"11.3-11.4":0.03986,"12.0-12.1":0.02392,"12.2-12.5":0.43585,"13.0-13.1":0.01063,"13.2":0.04518,"13.3":0.02658,"13.4-13.7":0.07707,"14.0-14.4":0.20464,"14.5-14.8":0.3322,"15.0-15.1":0.13022,"15.2-15.3":0.15946,"15.4":0.17806,"15.5":0.24982,"15.6-15.7":1.31286,"16.0":0.61657,"16.1":1.23579,"16.2":0.59265,"16.3":1.11088,"16.4":0.22855,"16.5":0.58999,"16.6-16.7":10.00058,"17.0":2.99512,"17.1":5.03085,"17.2":0.14351},P:{"4":0.02098,"20":0.06295,"21":0.10491,"22":0.36719,"23":3.51455,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1","7.2-7.4":0.02098,"11.1-11.2":0.02098,"12.0":0.01049,"13.0":0.01049,"14.0":0.02098,"15.0":0.01049,"16.0":0.03147,"17.0":0.02098,"18.0":0.02098,"19.0":0.05246},I:{"0":0.06508,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00005,"4.4":0,"4.4.3-4.4.4":0.0002},K:{"0":0.21894,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00703,"9":0.14407,"11":0.07028,_:"6 7 10 5.5"},N:{_:"10 11"},S:{"2.5":0.00654,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.01962},H:{"0":0.01},L:{"0":34.95044},R:{_:"0"},M:{"0":0.41208},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IL.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IL.js
    index ef28b2cf30da26..105b804085446e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IL.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IL.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0.0036,"25":0.0036,"26":0.01079,"27":0.0036,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.0036,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00719,"53":0,"54":0,"55":0,"56":0.00719,"57":0,"58":0,"59":0.00719,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.0036,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.0036,"79":0.0863,"80":0.00719,"81":0,"82":0,"83":0.0036,"84":0.0036,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00719,"103":0,"104":0,"105":0.0036,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0.0036,"113":0.01079,"114":0.0036,"115":0.06113,"116":0.02877,"117":0.37039,"118":0.02877,"119":0,"120":0,"3.5":0,"3.6":0.0036},D:{"4":0.0036,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.01798,"32":0.0036,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.0036,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.0036,"50":0,"51":0,"52":0.01798,"53":0,"54":0,"55":0,"56":0,"57":0.00719,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.0036,"66":0.03236,"67":0,"68":0.00719,"69":0.0036,"70":0.0036,"71":0.0036,"72":0.0036,"73":0.00719,"74":0.00719,"75":0.0036,"76":0.0036,"77":0.00719,"78":0.00719,"79":0.03596,"80":0.04675,"81":0.01079,"83":0.00719,"84":0.00719,"85":0.00719,"86":0.00719,"87":0.01438,"88":0.0036,"89":0.01798,"90":0.01438,"91":0.0036,"92":0.0036,"93":0,"94":0.0036,"95":0.0036,"96":0.0036,"97":0.01079,"98":0.0036,"99":0.0036,"100":0.0036,"101":0.01438,"102":0.01079,"103":0.02158,"104":0.00719,"105":0.01438,"106":0.01798,"107":0.01438,"108":0.02517,"109":0.48546,"110":0.0036,"111":0.01438,"112":0.02158,"113":0.01798,"114":0.09709,"115":0.19418,"116":6.36492,"117":1.76564,"118":0.0036,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.0036,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.0036,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0.01079,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.0036,"73":0,"74":0.01438,"75":0,"76":0,"77":0.01798,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01079,"96":0,"97":0,"98":0,"99":0.0036,"100":0.02158,"101":0.10069,"102":0.14744,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00719,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0.0036,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.01798,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.0036,"109":0.01798,"110":0.0036,"111":0,"112":0.05034,"113":0.0036,"114":0.03596,"115":0.03236,"116":0.55738,"117":0.39916},E:{"4":0,"5":0,"6":0,"7":0.0036,"8":0.05754,"9":0,"10":0,"11":0,"12":0,"13":0.0036,"14":0.00719,"15":0.0036,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0.0036,"7.1":0,"9.1":0.01438,"10.1":0,"11.1":0.00719,"12.1":0,"13.1":0.00719,"14.1":0.02877,"15.1":0.0036,"15.2-15.3":0.0036,"15.4":0.0036,"15.5":0.01079,"15.6":0.04315,"16.0":0.00719,"16.1":0.01079,"16.2":0.01079,"16.3":0.03236,"16.4":0.01079,"16.5":0.02517,"16.6":0.25891,"17.0":0.02158,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00235,"6.0-6.1":0,"7.0-7.1":0.01176,"8.1-8.4":0.00706,"9.0-9.2":0,"9.3":0.05175,"10.0-10.2":0.0047,"10.3":0.06586,"11.0-11.2":0.02117,"11.3-11.4":0.01647,"12.0-12.1":0.03058,"12.2-12.5":0.25404,"13.0-13.1":0.00941,"13.2":0.00941,"13.3":0.80212,"13.4-13.7":0.04469,"14.0-14.4":0.17877,"14.5-14.8":0.45634,"15.0-15.1":0.06586,"15.2-15.3":0.09644,"15.4":0.11761,"15.5":0.22346,"15.6-15.7":1.55013,"16.0":0.71508,"16.1":1.15025,"16.2":0.5716,"16.3":1.07498,"16.4":0.15054,"16.5":0.58571,"16.6":13.5748,"17.0":1.40194,"17.1":0.00235},P:{"4":0.07153,"20":0.14306,"21":0.29634,"22":5.12967,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0.02044,"10.1":0,"11.1-11.2":0.05109,"12.0":0.01022,"13.0":0.05109,"14.0":0.03066,"15.0":0.01022,"16.0":0.04087,"17.0":0.04087,"18.0":0.07153,"19.0":0.10218},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.04421,"4.4":0,"4.4.3-4.4.4":0.05894},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.0036,"9":0.0036,"10":0.0036,"11":0.07552,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":54.95709},R:{_:"0"},M:{"0":0.18572},Q:{"13.1":0},O:{"0":0.03202},H:{"0":0.27283}};
    +module.exports={C:{"24":0.00318,"25":0.00636,"26":0.01591,"27":0.00318,"36":0.00318,"52":0.00954,"56":0.00636,"59":0.01591,"68":0.00318,"72":0.00318,"74":0.00318,"75":0.00318,"77":0.00318,"78":0.00636,"80":0.01272,"88":0.00318,"89":0.00318,"98":0.00318,"101":0.00636,"104":0.00318,"105":0.00318,"108":0.00318,"109":0.00318,"110":0.00318,"111":0.00954,"112":0.00318,"113":0.01272,"115":0.16859,"116":0.00318,"117":0.00636,"118":0.02545,"119":0.71254,"120":0.18132,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 28 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 57 58 60 61 62 63 64 65 66 67 69 70 71 73 76 79 81 82 83 84 85 86 87 90 91 92 93 94 95 96 97 99 100 102 103 106 107 114 121 122 123 3.5 3.6"},D:{"31":0.02227,"32":0.00636,"38":0.01909,"41":0.00318,"47":0.00318,"49":0.00636,"51":0.00318,"52":0.02863,"53":0.00318,"55":0.00318,"57":0.00318,"65":0.00318,"66":0.06998,"68":0.01591,"69":0.01272,"70":0.00954,"71":0.01272,"72":0.01909,"73":0.00636,"74":0.02227,"75":0.01591,"76":0.01272,"77":0.01591,"78":0.01591,"79":0.05726,"80":0.04772,"81":0.03817,"83":0.02227,"84":0.01272,"85":0.02227,"86":0.02863,"87":0.03499,"88":0.02227,"89":0.01591,"90":0.02863,"91":0.01272,"92":0.00636,"93":0.00318,"94":0.00636,"95":0.00954,"96":0.00954,"97":0.00954,"98":0.00954,"99":0.00636,"100":0.00636,"101":0.00318,"102":0.01909,"103":0.04135,"104":0.00636,"105":0.01909,"106":0.03181,"107":0.03817,"108":0.06362,"109":1.14198,"110":0.02227,"111":0.04135,"112":0.04453,"113":0.02227,"114":0.11452,"115":0.0509,"116":0.19086,"117":0.32446,"118":3.92535,"119":17.30782,"120":0.01591,"121":0.00318,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 33 34 35 36 37 39 40 42 43 44 45 46 48 50 54 56 58 59 60 61 62 63 64 67 122"},F:{"28":0.00318,"46":0.00318,"53":0.00318,"54":0.00318,"91":0.00318,"92":0.00318,"95":0.03181,"99":0.01272,"102":0.21949,"103":0.09543,"104":0.32446,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 93 94 96 97 98 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00318,"17":0.00636,"18":0.00636,"79":0.00318,"80":0.00318,"81":0.00318,"83":0.00318,"84":0.00636,"85":0.00318,"86":0.00318,"87":0.00318,"88":0.00318,"89":0.00318,"90":0.00318,"92":0.00318,"96":0.00318,"98":0.00636,"104":0.00318,"106":0.00636,"107":0.00636,"108":0.00636,"109":0.03181,"110":0.00636,"111":0.00636,"112":0.00636,"113":0.00954,"114":0.01272,"115":0.00636,"116":0.02863,"117":0.0509,"118":0.41671,"119":2.13445,_:"13 14 15 16 91 93 94 95 97 99 100 101 102 103 105"},E:{"7":0.00318,"8":0.1177,"9":0.00318,"13":0.00318,"14":0.03181,"15":0.00318,_:"0 4 5 6 10 11 12 3.1 3.2 7.1 10.1","5.1":0.00318,"6.1":0.00636,"9.1":0.08271,"11.1":0.01591,"12.1":0.00318,"13.1":0.01591,"14.1":0.08271,"15.1":0.00636,"15.2-15.3":0.01272,"15.4":0.00636,"15.5":0.02545,"15.6":0.11134,"16.0":0.00954,"16.1":0.03499,"16.2":0.01909,"16.3":0.07634,"16.4":0.01591,"16.5":0.03499,"16.6":0.48351,"17.0":0.1177,"17.1":0.25766,"17.2":0.00318},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00294,"5.0-5.1":0.00294,"6.0-6.1":0.00734,"7.0-7.1":0.01028,"8.1-8.4":0.00147,"9.0-9.2":0.01175,"9.3":0.0367,"10.0-10.2":0.00294,"10.3":0.05285,"11.0-11.2":0.02496,"11.3-11.4":0.02202,"12.0-12.1":0.01321,"12.2-12.5":0.24077,"13.0-13.1":0.00587,"13.2":0.02496,"13.3":0.01468,"13.4-13.7":0.04258,"14.0-14.4":0.11305,"14.5-14.8":0.18352,"15.0-15.1":0.07194,"15.2-15.3":0.08809,"15.4":0.09836,"15.5":0.138,"15.6-15.7":0.72526,"16.0":0.34061,"16.1":0.68268,"16.2":0.32739,"16.3":0.61368,"16.4":0.12626,"16.5":0.32593,"16.6-16.7":5.52458,"17.0":1.65458,"17.1":2.77917,"17.2":0.07928},P:{"4":0.04115,"20":0.13372,"21":0.19544,"22":0.88463,"23":6.50102,_:"5.0-5.4 6.2-6.4 8.2","7.2-7.4":0.03086,"9.2":0.02057,"10.1":0.06172,"11.1-11.2":0.072,"12.0":0.01029,"13.0":0.09258,"14.0":0.06172,"15.0":0.03086,"16.0":0.08229,"17.0":0.06172,"18.0":0.05143,"19.0":0.14401},I:{"0":0.03392,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.0001},K:{"0":0.34141,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00318,"9":0.00636,"10":0.00318,"11":0.06044,_:"6 7 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.05455},H:{"0":0.02},L:{"0":44.78425},R:{_:"0"},M:{"0":0.15684},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IM.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IM.js
    index fd033ca4a8becc..fc63736e2901fb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IM.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IM.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0.00503,"3":0.00503,"4":0.00503,"5":0.00503,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.00503,"13":0,"14":0.00503,"15":0.00503,"16":0,"17":0.00503,"18":0,"19":0,"20":0,"21":0.00503,"22":0,"23":0,"24":0.00503,"25":0.00503,"26":0.00503,"27":0.00503,"28":0.00503,"29":0.00503,"30":0.00503,"31":0,"32":0.00503,"33":0,"34":0.00503,"35":0.00503,"36":0.00503,"37":0.00503,"38":0.00503,"39":0.01508,"40":0.01508,"41":0.00503,"42":0.00503,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.03015,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.01508,"69":0,"70":0,"71":0,"72":0.00503,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.01508,"103":0.0201,"104":0.0804,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.13065,"116":0.0402,"117":0.77385,"118":0.05528,"119":0,"120":0,"3.5":0.00503,"3.6":0.01508},D:{"4":0.00503,"5":0,"6":0.00503,"7":0.00503,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00503,"15":0,"16":0,"17":0,"18":0,"19":0.00503,"20":0.00503,"21":0.00503,"22":0,"23":0,"24":0,"25":0,"26":0.00503,"27":0,"28":0.00503,"29":0,"30":0.00503,"31":0.01005,"32":0,"33":0.00503,"34":0,"35":0.00503,"36":0.00503,"37":0.01005,"38":0.00503,"39":0.01508,"40":0.00503,"41":0.01005,"42":0.01508,"43":0.0201,"44":0.03518,"45":0.03015,"46":0.02513,"47":0.01508,"48":0,"49":0,"50":0,"51":0.02513,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00503,"66":0,"67":0.05025,"68":0,"69":0,"70":0.01005,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0.00503,"77":0.00503,"78":0,"79":0.01005,"80":0.03015,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0.00503,"88":0,"89":0,"90":0.00503,"91":0,"92":0.00503,"93":0.0201,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.01508,"100":0,"101":0,"102":0.00503,"103":0.06533,"104":0.02513,"105":0.3819,"106":0,"107":0,"108":0.02513,"109":0.3819,"110":0.00503,"111":0.0201,"112":0.02513,"113":0.02513,"114":0.201,"115":0.43215,"116":5.83403,"117":1.81905,"118":0,"119":0,"120":0},F:{"9":0,"11":0.00503,"12":0.00503,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0.00503,"28":0,"29":0.00503,"30":0.00503,"31":0.01508,"32":0.00503,"33":0.00503,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.01005,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00503,"96":0,"97":0,"98":0,"99":0,"100":0.05025,"101":0.25125,"102":0.33165,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.01005},B:{"12":0.00503,"13":0,"14":0.02513,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0.01508,"105":0,"106":0,"107":0.01508,"108":0.00503,"109":0.01508,"110":0,"111":0,"112":0.00503,"113":0.00503,"114":0.0201,"115":0.13065,"116":2.5326,"117":2.2512},E:{"4":0,"5":0.00503,"6":0,"7":0.00503,"8":0.01005,"9":0.04523,"10":0,"11":0,"12":0,"13":0,"14":0.11558,"15":0.00503,_:"0","3.1":0,"3.2":0,"5.1":0.00503,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.21608,"13.1":0.07035,"14.1":0.11558,"15.1":0.0402,"15.2-15.3":0.03518,"15.4":0.01508,"15.5":0.05025,"15.6":2.18588,"16.0":0.0201,"16.1":0.03518,"16.2":0.06533,"16.3":0.29145,"16.4":0.13568,"16.5":0.2814,"16.6":2.59793,"17.0":0.06533,"17.1":0},G:{"8":0.0174,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.01305,"5.0-5.1":0.0174,"6.0-6.1":0.0087,"7.0-7.1":0.06524,"8.1-8.4":0.11743,"9.0-9.2":0.0087,"9.3":0.33489,"10.0-10.2":0,"10.3":0.06524,"11.0-11.2":0.36533,"11.3-11.4":0.0087,"12.0-12.1":0.09568,"12.2-12.5":0.93942,"13.0-13.1":0,"13.2":0,"13.3":0.0087,"13.4-13.7":0,"14.0-14.4":0.07828,"14.5-14.8":0.53495,"15.0-15.1":0.30009,"15.2-15.3":0.13047,"15.4":0.30879,"15.5":0.83504,"15.6-15.7":2.3094,"16.0":1.0264,"16.1":2.28766,"16.2":0.94377,"16.3":1.86144,"16.4":0.44796,"16.5":0.97856,"16.6":26.76471,"17.0":2.15283,"17.1":0.00435},P:{"4":0.04277,"20":0.09624,"21":0.19248,"22":2.24561,"5.0-5.4":0.01069,"6.2-6.4":0.04277,"7.2-7.4":0.02139,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0.08555,"14.0":0,"15.0":0,"16.0":0.01069,"17.0":0.01069,"18.0":0,"19.0":0.03208},I:{"0":0,"3":0.02226,"4":0.27374,"2.1":0.01335,"2.2":0.08012,"2.3":0.13576,"4.1":0.10237,"4.2-4.3":0.26038,"4.4":0,"4.4.3-4.4.4":0.53412},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.01025,"7":0.02049,"8":0.19466,"9":0.04098,"10":0.04098,"11":0.21003,"5.5":0},S:{"2.5":0.0199,_:"3.0-3.1"},J:{"7":0,"10":0.02985},N:{"10":0.0796,"11":0.0398},L:{"0":25.85533},R:{_:"0"},M:{"0":0.55223},Q:{"13.1":0},O:{"0":0.08458},H:{"0":0.10362}};
    +module.exports={C:{"2":0.00502,"3":0.01505,"4":0.00502,"5":0.00502,"6":0.00502,"10":0.00502,"15":0.00502,"21":0.00502,"25":0.00502,"26":0.00502,"27":0.00502,"29":0.00502,"30":0.00502,"32":0.00502,"34":0.00502,"35":0.00502,"36":0.00502,"37":0.00502,"38":0.01003,"39":0.01003,"40":0.01003,"41":0.00502,"42":0.00502,"48":0.01505,"52":0.05517,"70":0.00502,"78":0.01003,"96":0.01505,"102":0.02006,"103":0.08526,"104":0.70712,"113":0.00502,"115":0.24072,"117":0.03009,"118":0.07523,"119":0.9679,"120":0.29589,_:"7 8 9 11 12 13 14 16 17 18 19 20 22 23 24 28 31 33 43 44 45 46 47 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 97 98 99 100 101 105 106 107 108 109 110 111 112 114 116 121 122 123","3.5":0.00502,"3.6":0.02006},D:{"4":0.00502,"18":0.00502,"19":0.00502,"20":0.00502,"21":0.00502,"26":0.00502,"28":0.00502,"31":0.00502,"34":0.00502,"35":0.00502,"36":0.00502,"37":0.00502,"38":0.00502,"39":0.01505,"40":0.02006,"41":0.01505,"42":0.01003,"43":0.02006,"44":0.03009,"45":0.01505,"46":0.03511,"47":0.01505,"51":0.05517,"65":0.03009,"70":0.01505,"76":0.01003,"79":0.01003,"85":0.01505,"86":0.00502,"87":0.01505,"88":0.01505,"90":0.00502,"92":0.00502,"93":0.01505,"94":0.01003,"98":0.01505,"99":0.01003,"101":0.00502,"102":0.02006,"103":0.13039,"104":0.19057,"105":2.54762,"107":0.00502,"108":0.00502,"109":0.54664,"110":0.00502,"111":0.03511,"112":0.02006,"113":0.01003,"114":0.07523,"115":0.03009,"116":0.85757,"117":0.37613,"118":4.43828,"119":15.09515,"120":0.00502,_:"5 6 7 8 9 10 11 12 13 14 15 16 17 22 23 24 25 27 29 30 32 33 48 49 50 52 53 54 55 56 57 58 59 60 61 62 63 64 66 67 68 69 71 72 73 74 75 77 78 80 81 83 84 89 91 95 96 97 100 106 121 122"},F:{"26":0.00502,"27":0.00502,"31":0.01003,"33":0.00502,"46":0.01003,"90":0.00502,"95":0.00502,"102":0.2006,"103":0.32096,"104":0.5015,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 28 29 30 32 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.00502},B:{"12":0.00502,"107":0.03009,"109":0.04514,"115":0.01505,"116":0.12538,"117":0.14544,"118":1.46438,"119":5.87758,_:"13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 108 110 111 112 113 114"},E:{"4":0.00502,"5":0.00502,"8":0.01003,"9":0.08526,"12":0.02508,"14":0.78736,"15":0.00502,_:"0 6 7 10 11 13 3.1 3.2 9.1 10.1 11.1","5.1":0.00502,"6.1":0.00502,"7.1":0.00502,"12.1":0.25075,"13.1":0.1655,"14.1":0.1655,"15.1":0.06018,"15.2-15.3":0.05517,"15.4":0.03511,"15.5":0.09027,"15.6":3.1093,"16.0":0.01505,"16.1":0.0652,"16.2":0.10532,"16.3":0.29087,"16.4":0.03511,"16.5":0.18054,"16.6":4.65392,"17.0":0.52658,"17.1":1.49447,"17.2":0.00502},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00544,"5.0-5.1":0.00544,"6.0-6.1":0.01359,"7.0-7.1":0.01903,"8.1-8.4":0.00272,"9.0-9.2":0.02175,"9.3":0.06796,"10.0-10.2":0.00544,"10.3":0.09786,"11.0-11.2":0.04621,"11.3-11.4":0.04077,"12.0-12.1":0.02446,"12.2-12.5":0.4458,"13.0-13.1":0.01087,"13.2":0.04621,"13.3":0.02718,"13.4-13.7":0.07883,"14.0-14.4":0.20931,"14.5-14.8":0.33979,"15.0-15.1":0.1332,"15.2-15.3":0.1631,"15.4":0.18213,"15.5":0.25552,"15.6-15.7":1.34285,"16.0":0.63065,"16.1":1.26402,"16.2":0.60619,"16.3":1.13626,"16.4":0.23378,"16.5":0.60347,"16.6-16.7":10.22904,"17.0":3.06355,"17.1":5.14578,"17.2":0.14679},P:{"4":0.06715,"20":0.05596,"21":0.04477,"22":0.14549,"23":2.41739,_:"5.0-5.4 7.2-7.4 8.2 9.2 11.1-11.2 12.0 13.0 14.0 15.0 16.0 18.0","6.2-6.4":0.05596,"10.1":0.01119,"17.0":0.02238,"19.0":0.01119},I:{"0":0.46625,"3":0.00005,"4":0.00009,"2.1":0,"2.2":0.00009,"2.3":0,"4.1":0.00005,"4.2-4.3":0.00033,"4.4":0,"4.4.3-4.4.4":0.00141},K:{"0":0.13958,_:"10 11 12 11.1 11.5 12.1"},A:{"6":0.01521,"7":0.02028,"8":0.18252,"9":0.03549,"10":0.04056,"11":0.1521,_:"5.5"},N:{_:"10 11"},S:{"2.5":0.01994,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.06979},H:{"0":0},L:{"0":18.47222},R:{_:"0"},M:{"0":0.72283},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IN.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IN.js
    index 261029b06a9619..15125cd3b86501 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IN.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IN.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00225,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00225,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00225,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0.00225,"112":0.00225,"113":0.00449,"114":0.00225,"115":0.06516,"116":0.01124,"117":0.13257,"118":0.01573,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00225,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00225,"67":0,"68":0.00225,"69":0.00225,"70":0.00225,"71":0.00225,"72":0.00225,"73":0.00225,"74":0.00449,"75":0.00225,"76":0.00225,"77":0.00225,"78":0.00225,"79":0.00449,"80":0.00449,"81":0.00449,"83":0.00449,"84":0.00225,"85":0.00225,"86":0.00449,"87":0.00674,"88":0.00449,"89":0.00225,"90":0.00449,"91":0.00449,"92":0.00225,"93":0.00225,"94":0.00449,"95":0.00225,"96":0.00225,"97":0.00449,"98":0.00225,"99":0.00225,"100":0.00225,"101":0.00449,"102":0.00225,"103":0.00899,"104":0.00674,"105":0.00674,"106":0.00899,"107":0.00674,"108":0.01348,"109":0.58871,"110":0.00674,"111":0.03146,"112":0.02022,"113":0.02696,"114":0.09213,"115":0.10336,"116":2.12342,"117":0.57973,"118":0.00449,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00225,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.00225,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.00225,"64":0.00225,"65":0,"66":0,"67":0.00225,"68":0.00225,"69":0.01124,"70":0.01573,"71":0.03146,"72":0.23818,"73":0.05168,"74":0.00225,"75":0,"76":0.00225,"77":0.04494,"78":0.00449,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00449,"96":0,"97":0,"98":0,"99":0,"100":0.00225,"101":0.01798,"102":0.01798,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00225,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00225,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00449,"110":0,"111":0,"112":0,"113":0,"114":0.00449,"115":0.00674,"116":0.13707,"117":0.08988},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.01124,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0.00225,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0.00449,"16.0":0,"16.1":0.00225,"16.2":0.00225,"16.3":0.00225,"16.4":0.00225,"16.5":0.00674,"16.6":0.02696,"17.0":0.00449,"17.1":0},G:{"8":0.00059,"3.2":0.00029,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00913,"8.1-8.4":0,"9.0-9.2":0.00059,"9.3":0.0053,"10.0-10.2":0.00059,"10.3":0.00383,"11.0-11.2":0.00501,"11.3-11.4":0.00589,"12.0-12.1":0.00353,"12.2-12.5":0.04418,"13.0-13.1":0.00206,"13.2":0.00236,"13.3":0.00707,"13.4-13.7":0.00648,"14.0-14.4":0.02415,"14.5-14.8":0.03063,"15.0-15.1":0.02474,"15.2-15.3":0.01591,"15.4":0.01178,"15.5":0.02121,"15.6-15.7":0.21237,"16.0":0.05714,"16.1":0.08542,"16.2":0.06598,"16.3":0.12931,"16.4":0.06568,"16.5":0.18851,"16.6":1.51104,"17.0":0.37349,"17.1":0.00088},P:{"4":0.06112,"20":0.04075,"21":0.0815,"22":0.51954,"5.0-5.4":0,"6.2-6.4":0.01019,"7.2-7.4":0.04075,"8.2":0,"9.2":0.01019,"10.1":0,"11.1-11.2":0.01019,"12.0":0,"13.0":0.01019,"14.0":0.01019,"15.0":0.01019,"16.0":0.01019,"17.0":0.01019,"18.0":0.01019,"19.0":0.04075},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.04899},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00449,"5.5":0},S:{"2.5":0.44192,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":84.16933},R:{_:"0"},M:{"0":0.14731},Q:{"13.1":0},O:{"0":2.20185},H:{"0":3.0241}};
    +module.exports={C:{"42":0.00405,"47":0.00202,"52":0.0081,"56":0.00202,"59":0.00202,"66":0.00202,"72":0.00202,"83":0.00202,"88":0.00607,"91":0.09108,"97":0.00202,"102":0.00202,"103":0.00202,"104":0.00202,"105":0.00202,"106":0.00202,"107":0.00202,"108":0.00202,"109":0.00202,"110":0.00202,"111":0.00202,"112":0.00202,"113":0.01214,"114":0.00202,"115":0.26514,"116":0.00405,"117":0.00607,"118":0.01822,"119":0.48778,"120":0.1437,"121":0.00607,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 43 44 45 46 48 49 50 51 53 54 55 57 58 60 61 62 63 64 65 67 68 69 70 71 73 74 75 76 77 78 79 80 81 82 84 85 86 87 89 90 92 93 94 95 96 98 99 100 101 122 123 3.5 3.6"},D:{"49":0.00607,"55":0.00202,"56":0.00202,"63":0.00202,"64":0.00202,"66":0.01214,"68":0.00202,"69":0.00202,"70":0.00607,"71":0.0081,"72":0.00202,"73":0.00202,"74":0.0081,"75":0.00202,"76":0.00202,"77":0.00202,"78":0.00202,"79":0.01012,"80":0.01214,"81":0.0081,"83":0.01012,"84":0.00202,"85":0.00405,"86":0.00607,"87":0.02024,"88":0.00607,"89":0.00405,"90":0.00607,"91":0.01012,"92":0.00607,"93":0.00405,"94":0.01619,"95":0.00607,"96":0.0081,"97":0.01417,"98":0.00405,"99":0.01214,"100":0.00607,"101":0.01417,"102":0.01012,"103":0.03643,"104":0.02834,"105":0.02631,"106":0.03441,"107":0.03238,"108":0.06477,"109":2.3863,"110":0.02631,"111":0.15787,"112":0.0587,"113":0.06882,"114":0.17204,"115":0.1599,"116":0.24895,"117":0.5141,"118":2.69799,"119":9.37719,"120":0.02024,"121":0.00607,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 50 51 52 53 54 57 58 59 60 61 62 65 67 122"},F:{"28":0.00202,"79":0.00202,"85":0.00202,"89":0.00202,"94":0.00202,"95":0.02429,"102":0.02631,"103":0.02834,"104":0.08501,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 86 87 88 90 91 92 93 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00202,"16":0.00202,"17":0.00202,"18":0.00405,"84":0.00202,"92":0.00607,"100":0.00202,"103":0.00202,"106":0.00202,"107":0.00405,"108":0.00405,"109":0.01619,"110":0.00405,"111":0.00202,"112":0.00202,"113":0.00202,"114":0.00607,"115":0.00607,"116":0.0081,"117":0.02226,"118":0.18014,"119":0.86425,_:"13 14 15 79 80 81 83 85 86 87 88 89 90 91 93 94 95 96 97 98 99 101 102 104 105"},E:{"13":0.00202,"14":0.00202,_:"0 4 5 6 7 8 9 10 11 12 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 12.1","11.1":0.00202,"13.1":0.00405,"14.1":0.0081,"15.1":0.00202,"15.2-15.3":0.00202,"15.4":0.00202,"15.5":0.00405,"15.6":0.01822,"16.0":0.00405,"16.1":0.00607,"16.2":0.00405,"16.3":0.01012,"16.4":0.00607,"16.5":0.01619,"16.6":0.05667,"17.0":0.04048,"17.1":0.05667,"17.2":0.00202},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00043,"5.0-5.1":0.00043,"6.0-6.1":0.00108,"7.0-7.1":0.00152,"8.1-8.4":0.00022,"9.0-9.2":0.00174,"9.3":0.00542,"10.0-10.2":0.00043,"10.3":0.00781,"11.0-11.2":0.00369,"11.3-11.4":0.00325,"12.0-12.1":0.00195,"12.2-12.5":0.03558,"13.0-13.1":0.00087,"13.2":0.00369,"13.3":0.00217,"13.4-13.7":0.00629,"14.0-14.4":0.0167,"14.5-14.8":0.02712,"15.0-15.1":0.01063,"15.2-15.3":0.01302,"15.4":0.01454,"15.5":0.02039,"15.6-15.7":0.10717,"16.0":0.05033,"16.1":0.10088,"16.2":0.04838,"16.3":0.09068,"16.4":0.01866,"16.5":0.04816,"16.6-16.7":0.81637,"17.0":0.2445,"17.1":0.41068,"17.2":0.01172},P:{"4":0.05286,"20":0.02115,"21":0.06344,"22":0.16917,"23":0.4652,_:"5.0-5.4 6.2-6.4 8.2 10.1 12.0 14.0 15.0","7.2-7.4":0.04229,"9.2":0.01057,"11.1-11.2":0.01057,"13.0":0.01057,"16.0":0.01057,"17.0":0.01057,"18.0":0.01057,"19.0":0.03172},I:{"0":0.03174,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.0001},K:{"0":3.65479,_:"10 11 12 11.1 11.5 12.1"},A:{"7":0.00405,"9":0.00405,"11":0.02631,_:"6 8 10 5.5"},N:{_:"10 11"},S:{"2.5":0.54237,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":2.04186},H:{"0":0.07},L:{"0":71.12318},R:{_:"0"},M:{"0":0.1675},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IQ.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IQ.js
    index 61d0c587bb1c8c..a76036f0372b67 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IQ.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IQ.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00272,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00543,"69":0.00815,"70":0.00272,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0.00272,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00272,"103":0,"104":0,"105":0,"106":0,"107":0.00272,"108":0.00272,"109":0,"110":0,"111":0,"112":0,"113":0.00272,"114":0,"115":0.05432,"116":0.00815,"117":0.1195,"118":0.01901,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00543,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00815,"39":0,"40":0,"41":0,"42":0,"43":0.02173,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00272,"57":0,"58":0.00543,"59":0,"60":0.00272,"61":0,"62":0,"63":0.00272,"64":0.00272,"65":0.00272,"66":0.00272,"67":0,"68":0.00815,"69":0.00272,"70":0.00543,"71":0,"72":0.00815,"73":0.00815,"74":0.00272,"75":0.00543,"76":0,"77":0,"78":0.00543,"79":0.02444,"80":0.00272,"81":0.01086,"83":0.01086,"84":0.00543,"85":0.00272,"86":0.01358,"87":0.00815,"88":0.00815,"89":0.01358,"90":0.00272,"91":0.00272,"92":0.00272,"93":0,"94":0.00272,"95":0.01901,"96":0.00543,"97":0.00543,"98":0.01358,"99":0.01086,"100":0.00272,"101":0.00272,"102":0.00815,"103":0.0842,"104":0.00272,"105":0.00543,"106":0.01086,"107":0.00815,"108":0.01086,"109":0.61382,"110":0.00543,"111":0.00815,"112":0.00815,"113":0.00815,"114":0.04074,"115":0.04889,"116":1.93651,"117":0.56221,"118":0.00543,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0.00272,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00272,"70":0,"71":0,"72":0.03259,"73":0.01086,"74":0.00272,"75":0,"76":0,"77":0.01358,"78":0,"79":0.00272,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.00272,"92":0,"93":0.00272,"94":0,"95":0.02988,"96":0,"97":0,"98":0,"99":0.00272,"100":0.0163,"101":0.05975,"102":0.07605,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00272,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00543,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.01901,"110":0,"111":0.00272,"112":0.00272,"113":0.00272,"114":0.01901,"115":0.01358,"116":0.30419,"117":0.18197},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00815,"15":0.00272,_:"0","3.1":0,"3.2":0,"5.1":0.06247,"6.1":0,"7.1":0,"9.1":0.00815,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00272,"14.1":0.02173,"15.1":0.00272,"15.2-15.3":0,"15.4":0.01901,"15.5":0.02444,"15.6":0.11679,"16.0":0.00272,"16.1":0.0516,"16.2":0.0516,"16.3":0.08691,"16.4":0.01901,"16.5":0.09234,"16.6":0.83924,"17.0":0.04617,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.01216,"6.0-6.1":0,"7.0-7.1":0.22704,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.0446,"10.0-10.2":0.00203,"10.3":0.04865,"11.0-11.2":0.01824,"11.3-11.4":0.01014,"12.0-12.1":0.01419,"12.2-12.5":0.36488,"13.0-13.1":0.00405,"13.2":0,"13.3":0.03041,"13.4-13.7":0.04662,"14.0-14.4":0.17231,"14.5-14.8":0.29191,"15.0-15.1":0.0669,"15.2-15.3":0.08717,"15.4":0.11757,"15.5":0.18041,"15.6-15.7":2.48527,"16.0":0.6649,"16.1":0.72369,"16.2":0.34664,"16.3":0.82302,"16.4":0.25542,"16.5":0.88383,"16.6":10.40325,"17.0":1.64806,"17.1":0},P:{"4":0.11396,"20":0.09324,"21":0.2072,"22":2.58999,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.09324,"8.2":0,"9.2":0.02072,"10.1":0,"11.1-11.2":0.04144,"12.0":0.01036,"13.0":0.0518,"14.0":0.03108,"15.0":0.02072,"16.0":0.0518,"17.0":0.07252,"18.0":0.04144,"19.0":0.07252},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.01244,"4.4":0,"4.4.3-4.4.4":0.21151},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01358,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":67.0496},R:{_:"0"},M:{"0":0.13111},Q:{"13.1":0},O:{"0":0.42976},H:{"0":0.55168}};
    +module.exports={C:{"34":0.0025,"35":0.0025,"39":0.0025,"43":0.0025,"44":0.0025,"47":0.005,"48":0.0025,"52":0.0025,"56":0.005,"66":0.0025,"67":0.0025,"68":0.0025,"69":0.01749,"72":0.0025,"78":0.02499,"88":0.005,"96":0.0075,"102":0.0025,"103":0.005,"104":0.0025,"107":0.0025,"108":0.0025,"109":0.0025,"112":0.0025,"113":0.0125,"115":0.18743,"116":0.005,"117":0.005,"118":0.01499,"119":0.37235,"120":0.12245,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 36 37 38 40 41 42 45 46 49 50 51 53 54 55 57 58 59 60 61 62 63 64 65 70 71 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 90 91 92 93 94 95 97 98 99 100 101 105 106 110 111 114 121 122 123 3.5 3.6"},D:{"11":0.01749,"33":0.0025,"34":0.0025,"38":0.04248,"40":0.0025,"43":0.04248,"45":0.0025,"47":0.0025,"49":0.0025,"50":0.005,"52":0.0025,"53":0.0025,"55":0.0025,"56":0.01,"57":0.0025,"58":0.01999,"59":0.0025,"60":0.005,"62":0.0025,"63":0.0075,"64":0.005,"65":0.01499,"66":0.005,"68":0.01499,"69":0.0075,"70":0.0125,"71":0.005,"72":0.005,"73":0.02749,"74":0.0025,"75":0.02499,"76":0.0025,"78":0.005,"79":0.11745,"80":0.01,"81":0.02999,"83":0.03249,"84":0.01,"85":0.01749,"86":0.03499,"87":0.02999,"88":0.04498,"89":0.01,"90":0.0125,"91":0.005,"92":0.005,"93":0.0025,"94":0.0075,"95":0.02249,"96":0.0075,"97":0.01,"98":0.06248,"99":0.02249,"100":0.0075,"101":0.005,"102":0.04498,"103":0.06497,"104":0.005,"105":0.02249,"106":0.02499,"107":0.01999,"108":0.02499,"109":2.22411,"110":0.01999,"111":0.01749,"112":0.01999,"113":0.01499,"114":0.06747,"115":0.03499,"116":0.10746,"117":0.13994,"118":1.97671,"119":8.58407,"120":0.01499,"121":0.0075,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 35 36 37 39 41 42 44 46 48 51 54 61 67 77 122"},F:{"28":0.0025,"46":0.005,"74":0.0025,"79":0.0075,"82":0.0025,"84":0.005,"85":0.0025,"86":0.0025,"93":0.01,"94":0.01,"95":0.11745,"101":0.0025,"102":0.21491,"103":0.05248,"104":0.37735,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 75 76 77 78 80 81 83 87 88 89 90 91 92 96 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.0025,"16":0.0025,"17":0.0025,"18":0.0125,"84":0.005,"89":0.0025,"90":0.0025,"92":0.02999,"98":0.0025,"100":0.005,"106":0.005,"107":0.0025,"109":0.06248,"110":0.01,"111":0.0025,"112":0.0025,"113":0.0025,"114":0.005,"115":0.005,"116":0.01,"117":0.07247,"118":0.2624,"119":1.46192,_:"13 14 15 79 80 81 83 85 86 87 88 91 93 94 95 96 97 99 101 102 103 104 105 108"},E:{"13":0.0025,"14":0.01499,"15":0.0025,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 6.1 7.1 9.1 10.1 12.1","5.1":0.80218,"11.1":0.0025,"13.1":0.01,"14.1":0.02999,"15.1":0.005,"15.2-15.3":0.005,"15.4":0.01749,"15.5":0.02749,"15.6":0.19992,"16.0":0.02499,"16.1":0.10496,"16.2":0.05248,"16.3":0.5048,"16.4":0.02249,"16.5":0.12995,"16.6":1.96172,"17.0":0.47231,"17.1":0.58976,"17.2":0.0075},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00303,"5.0-5.1":0.00303,"6.0-6.1":0.00758,"7.0-7.1":0.01061,"8.1-8.4":0.00152,"9.0-9.2":0.01212,"9.3":0.03789,"10.0-10.2":0.00303,"10.3":0.05455,"11.0-11.2":0.02576,"11.3-11.4":0.02273,"12.0-12.1":0.01364,"12.2-12.5":0.24853,"13.0-13.1":0.00606,"13.2":0.02576,"13.3":0.01515,"13.4-13.7":0.04395,"14.0-14.4":0.11669,"14.5-14.8":0.18943,"15.0-15.1":0.07425,"15.2-15.3":0.09092,"15.4":0.10153,"15.5":0.14245,"15.6-15.7":0.74861,"16.0":0.35157,"16.1":0.70466,"16.2":0.33794,"16.3":0.63344,"16.4":0.13032,"16.5":0.33642,"16.6-16.7":5.70247,"17.0":1.70786,"17.1":2.86866,"17.2":0.08183},P:{"4":0.13443,"20":0.0517,"21":0.13443,"22":0.35158,"23":2.19221,"5.0-5.4":0.01034,"6.2-6.4":0.01034,"7.2-7.4":0.09307,_:"8.2 10.1","9.2":0.09307,"11.1-11.2":0.04136,"12.0":0.01034,"13.0":0.06204,"14.0":0.03102,"15.0":0.01034,"16.0":0.0517,"17.0":0.07238,"18.0":0.02068,"19.0":0.07238},I:{"0":0.08211,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00025},K:{"0":0.53765,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00531,"11":0.16462,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.43512},H:{"0":0.01},L:{"0":56.60403},R:{_:"0"},M:{"0":0.12003},Q:{"13.1":0.0075}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IR.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IR.js
    index 3cc0c718ccb58b..0ce171bd70d598 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IR.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IR.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00691,"53":0,"54":0,"55":0,"56":0.0023,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00691,"69":0,"70":0,"71":0,"72":0.0023,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0.0023,"83":0,"84":0,"85":0.0023,"86":0,"87":0,"88":0.0023,"89":0.0023,"90":0.0023,"91":0.0023,"92":0.0023,"93":0.0023,"94":0.0046,"95":0.0023,"96":0.0023,"97":0.0023,"98":0.0023,"99":0.0023,"100":0.0023,"101":0.0023,"102":0.01611,"103":0.0023,"104":0.0046,"105":0.00691,"106":0.00691,"107":0.0046,"108":0.00921,"109":0.00691,"110":0.00691,"111":0.01151,"112":0.00921,"113":0.02762,"114":0.01611,"115":0.32228,"116":0.06906,"117":0.43738,"118":0.03223,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.0023,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.0023,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.0023,"70":0.0023,"71":0.0023,"72":0,"73":0.0023,"74":0,"75":0,"76":0,"77":0.0023,"78":0.0023,"79":0.0046,"80":0.0023,"81":0.0046,"83":0.0023,"84":0.0023,"85":0.0023,"86":0.0046,"87":0.0046,"88":0.0023,"89":0.0046,"90":0.0023,"91":0.0046,"92":0.0023,"93":0,"94":0.0023,"95":0.0046,"96":0.0046,"97":0.0023,"98":0.0023,"99":0.0046,"100":0.0046,"101":0.0046,"102":0.00921,"103":0.01151,"104":0.00691,"105":0.00921,"106":0.01381,"107":0.01381,"108":0.01842,"109":0.85174,"110":0.00691,"111":0.01151,"112":0.01611,"113":0.01381,"114":0.03913,"115":0.04834,"116":1.86922,"117":0.39134,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.0023,"73":0.0023,"74":0.0023,"75":0,"76":0.0023,"77":0.00921,"78":0,"79":0.0023,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01381,"96":0,"97":0,"98":0,"99":0.0023,"100":0.0046,"101":0.02993,"102":0.02993,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.0023,"13":0.0023,"14":0,"15":0,"16":0,"17":0,"18":0.0046,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.0023,"90":0.0023,"91":0,"92":0.01381,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.0023,"101":0,"102":0,"103":0,"104":0,"105":0.0023,"106":0,"107":0.0023,"108":0.0023,"109":0.01842,"110":0.0023,"111":0.0023,"112":0.0023,"113":0.0023,"114":0.00691,"115":0.01151,"116":0.1128,"117":0.06215},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0.0023,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0.0046,"16.0":0,"16.1":0,"16.2":0,"16.3":0.0023,"16.4":0.0023,"16.5":0.0023,"16.6":0.00921,"17.0":0.0023,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.0022,"8.1-8.4":0.00073,"9.0-9.2":0.00073,"9.3":0.00294,"10.0-10.2":0,"10.3":0.01027,"11.0-11.2":0.00294,"11.3-11.4":0.00367,"12.0-12.1":0.01394,"12.2-12.5":0.35666,"13.0-13.1":0.00734,"13.2":0.00514,"13.3":0.05651,"13.4-13.7":0.04477,"14.0-14.4":0.13283,"14.5-14.8":0.13356,"15.0-15.1":0.10935,"15.2-15.3":0.11742,"15.4":0.11081,"15.5":0.15264,"15.6-15.7":1.21454,"16.0":0.29501,"16.1":0.33905,"16.2":0.24438,"16.3":0.39775,"16.4":0.39849,"16.5":0.7823,"16.6":2.02693,"17.0":0.33611,"17.1":0},P:{"4":0.16122,"20":0.60458,"21":0.80611,"22":2.97254,"5.0-5.4":0.03023,"6.2-6.4":0.03023,"7.2-7.4":0.26199,"8.2":0.03023,"9.2":0.11084,"10.1":0.03023,"11.1-11.2":0.16122,"12.0":0.06046,"13.0":0.2116,"14.0":0.19145,"15.0":0.10076,"16.0":0.32245,"17.0":0.39298,"18.0":0.3426,"19.0":0.47359},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00415,"4.4":0,"4.4.3-4.4.4":0.01815},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.37523,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":76.68266},R:{_:"0"},M:{"0":1.02383},Q:{"13.1":0},O:{"0":0.06158},H:{"0":0.43728}};
    +module.exports={C:{"33":0.00264,"38":0.00264,"40":0.00264,"41":0.00264,"43":0.00264,"45":0.00264,"47":0.00529,"48":0.00264,"49":0.00264,"50":0.00529,"52":0.0423,"56":0.00529,"60":0.00264,"65":0.00264,"68":0.00264,"70":0.00264,"72":0.01058,"75":0.00264,"77":0.00264,"78":0.00264,"80":0.00264,"81":0.00264,"82":0.00529,"83":0.00264,"84":0.00264,"85":0.00264,"88":0.00264,"89":0.00264,"90":0.00264,"91":0.00264,"92":0.00264,"93":0.00264,"94":0.00529,"95":0.00264,"96":0.00264,"97":0.00264,"98":0.00264,"99":0.00793,"100":0.00529,"101":0.00529,"102":0.01058,"103":0.00529,"104":0.00529,"105":0.00793,"106":0.00793,"107":0.01058,"108":0.01322,"109":0.01058,"110":0.01058,"111":0.00793,"112":0.01322,"113":0.01586,"114":0.01586,"115":1.49122,"116":0.02115,"117":0.02908,"118":0.08725,"119":1.72389,"120":0.4865,"121":0.00264,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 37 39 42 44 46 51 53 54 55 57 58 59 61 62 63 64 66 67 69 71 73 74 76 79 86 87 122 123 3.5 3.6"},D:{"33":0.00264,"34":0.00264,"38":0.00529,"41":0.00264,"46":0.00264,"48":0.00529,"49":0.00793,"50":0.00264,"53":0.00264,"58":0.00264,"59":0.00264,"60":0.00264,"61":0.00264,"62":0.00529,"63":0.00529,"64":0.00264,"65":0.00264,"66":0.00264,"67":0.00264,"68":0.00529,"69":0.00529,"70":0.00529,"71":0.02115,"72":0.00529,"73":0.00529,"74":0.00529,"75":0.00529,"76":0.00529,"77":0.00529,"78":0.01851,"79":0.02115,"80":0.01851,"81":0.01058,"83":0.01851,"84":0.01322,"85":0.01322,"86":0.02908,"87":0.0238,"88":0.01322,"89":0.01851,"90":0.01058,"91":0.01851,"92":0.01851,"93":0.00529,"94":0.01058,"95":0.01586,"96":0.02115,"97":0.01586,"98":0.01586,"99":0.01851,"100":0.02644,"101":0.01058,"102":0.0423,"103":0.05024,"104":0.03173,"105":0.04759,"106":0.07139,"107":0.08725,"108":0.12427,"109":4.24098,"110":0.04759,"111":0.07139,"112":0.06874,"113":0.03966,"114":0.0899,"115":0.06874,"116":0.18244,"117":0.23267,"118":2.85816,"119":9.92558,"120":0.00529,"121":0.00264,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 35 36 37 39 40 42 43 44 45 47 51 52 54 55 56 57 122"},F:{"46":0.00264,"64":0.00264,"79":0.01586,"83":0.00264,"84":0.00264,"85":0.00264,"91":0.00264,"93":0.00264,"94":0.00264,"95":0.05817,"99":0.00264,"101":0.00793,"102":0.05552,"103":0.05817,"104":0.16393,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 86 87 88 89 90 92 96 97 98 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00793,"13":0.00793,"14":0.00793,"15":0.00529,"16":0.00529,"17":0.00793,"18":0.03437,"81":0.00264,"84":0.00529,"89":0.00793,"90":0.00793,"92":0.09254,"100":0.01586,"101":0.00264,"103":0.00264,"105":0.00264,"106":0.00264,"107":0.00793,"108":0.01058,"109":0.09518,"110":0.00793,"111":0.00529,"112":0.00529,"113":0.00529,"114":0.01322,"115":0.01851,"116":0.01851,"117":0.03437,"118":0.16128,"119":0.71917,_:"79 80 83 85 86 87 88 91 93 94 95 96 97 98 99 102 104"},E:{"14":0.00264,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1 12.1 15.2-15.3 17.2","5.1":0.00529,"13.1":0.00529,"14.1":0.00529,"15.1":0.00264,"15.4":0.00264,"15.5":0.00264,"15.6":0.02115,"16.0":0.00264,"16.1":0.00529,"16.2":0.00264,"16.3":0.00529,"16.4":0.00529,"16.5":0.00529,"16.6":0.01851,"17.0":0.01586,"17.1":0.03437},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00096,"5.0-5.1":0.00096,"6.0-6.1":0.0024,"7.0-7.1":0.00336,"8.1-8.4":0.00048,"9.0-9.2":0.00384,"9.3":0.01199,"10.0-10.2":0.00096,"10.3":0.01726,"11.0-11.2":0.00815,"11.3-11.4":0.00719,"12.0-12.1":0.00432,"12.2-12.5":0.07865,"13.0-13.1":0.00192,"13.2":0.00815,"13.3":0.0048,"13.4-13.7":0.01391,"14.0-14.4":0.03693,"14.5-14.8":0.05994,"15.0-15.1":0.0235,"15.2-15.3":0.02877,"15.4":0.03213,"15.5":0.04508,"15.6-15.7":0.2369,"16.0":0.11125,"16.1":0.22299,"16.2":0.10694,"16.3":0.20045,"16.4":0.04124,"16.5":0.10646,"16.6-16.7":1.80453,"17.0":0.54045,"17.1":0.90778,"17.2":0.0259},P:{"4":0.23246,"20":0.42449,"21":0.59631,"22":1.64742,"23":1.97084,"5.0-5.4":0.02021,"6.2-6.4":0.04043,"7.2-7.4":0.2931,"8.2":0.03032,"9.2":0.09096,"10.1":0.03032,"11.1-11.2":0.13139,"12.0":0.05053,"13.0":0.20214,"14.0":0.17182,"15.0":0.09096,"16.0":0.28299,"17.0":0.35374,"18.0":0.27289,"19.0":0.49524},I:{"0":0.02195,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.00007},K:{"0":0.44279,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00264,"9":0.00264,"11":1.03645,_:"6 7 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.0662},H:{"0":0.05},L:{"0":60.33827},R:{_:"0"},M:{"0":0.82376},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IS.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IS.js
    index eab0f6c381dbba..b95cf144bcba5b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IS.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IS.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.02328,"49":0,"50":0,"51":0,"52":0.04074,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.00582,"78":0.02328,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.00582,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.10476,"103":0.00582,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00582,"110":0,"111":0,"112":0.01746,"113":0.02328,"114":0.01164,"115":0.15132,"116":0.15132,"117":1.2804,"118":0.15714,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00582,"50":0,"51":0,"52":0,"53":0.00582,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00582,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0.00582,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.00582,"80":0,"81":0.00582,"83":0,"84":0,"85":0.01746,"86":0.00582,"87":0.0291,"88":0.00582,"89":0.00582,"90":0.01164,"91":0.00582,"92":0.01164,"93":0.00582,"94":0,"95":0.00582,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00582,"103":0.15132,"104":0.00582,"105":0.01746,"106":0.01164,"107":0.02328,"108":0.04656,"109":0.20952,"110":0.0582,"111":0.05238,"112":0.06984,"113":0.09312,"114":0.27354,"115":0.71004,"116":14.13096,"117":4.0449,"118":0.01164,"119":0.01164,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00582,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.02328,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00582,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.04074,"96":0,"97":0,"98":0,"99":0.00582,"100":0.18042,"101":0.38994,"102":0.77988,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00582,"108":0.01746,"109":0.01746,"110":0,"111":0.00582,"112":0.00582,"113":0.01746,"114":0.03492,"115":0.1164,"116":1.68198,"117":1.37934},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00582,"14":0.05238,"15":0.04074,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.0291,"13.1":0.10476,"14.1":0.31428,"15.1":0.04074,"15.2-15.3":0.02328,"15.4":0.09894,"15.5":0.13968,"15.6":0.63438,"16.0":0.09894,"16.1":0.10476,"16.2":0.18624,"16.3":0.34338,"16.4":0.18624,"16.5":0.58782,"16.6":2.63064,"17.0":0.18042,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.00655,"10.0-10.2":0,"10.3":0.06225,"11.0-11.2":0.02293,"11.3-11.4":0,"12.0-12.1":0.01638,"12.2-12.5":0.17037,"13.0-13.1":0,"13.2":0,"13.3":0.00328,"13.4-13.7":0.04259,"14.0-14.4":0.0557,"14.5-14.8":0.25882,"15.0-15.1":0.05242,"15.2-15.3":0.09829,"15.4":0.08846,"15.5":0.17037,"15.6-15.7":1.186,"16.0":1.43828,"16.1":1.99196,"16.2":0.89442,"16.3":1.6414,"16.4":0.17364,"16.5":0.72078,"16.6":21.51189,"17.0":1.81832,"17.1":0},P:{"4":0.0102,"20":0.0204,"21":0.19376,"22":3.47747,"5.0-5.4":0.0102,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0.0102,"11.1-11.2":0,"12.0":0,"13.0":0.0204,"14.0":0.0102,"15.0":0,"16.0":0.0102,"17.0":0.0102,"18.0":0.0102,"19.0":0.0204},I:{"0":0,"3":0,"4":0.0152,"2.1":0,"2.2":0,"2.3":0.0152,"4.1":0.0152,"4.2-4.3":0.0076,"4.4":0,"4.4.3-4.4.4":0.06081},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.02328,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":27.19972},R:{_:"0"},M:{"0":0.3762},Q:{"13.1":0.00418},O:{"0":0.02508},H:{"0":0.14246}};
    +module.exports={C:{"48":0.02188,"52":0.01094,"77":0.01094,"78":0.02735,"91":0.00547,"102":0.01094,"103":0.00547,"108":0.01094,"109":0.00547,"111":0.00547,"112":0.00547,"113":0.01641,"115":0.26803,"116":0.01094,"117":0.01641,"118":0.07658,"119":2.48338,"120":0.6564,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 79 80 81 82 83 84 85 86 87 88 89 90 92 93 94 95 96 97 98 99 100 101 104 105 106 107 110 114 121 122 123 3.5 3.6"},D:{"33":0.00547,"49":0.00547,"51":0.00547,"53":0.00547,"65":0.02735,"76":0.00547,"79":0.04376,"81":0.01094,"85":0.01094,"87":0.04923,"89":0.00547,"90":0.00547,"91":0.00547,"92":0.01641,"93":0.00547,"95":0.00547,"96":0.01641,"98":0.00547,"99":0.00547,"100":0.00547,"102":0.01094,"103":0.22427,"104":0.01094,"105":0.01641,"107":0.00547,"108":0.02188,"109":0.26803,"110":0.01641,"111":0.02188,"112":0.1641,"113":0.18598,"114":0.21333,"115":0.19692,"116":1.37297,"117":0.79315,"118":7.51578,"119":21.01574,"120":0.01641,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 50 52 54 55 56 57 58 59 60 61 62 63 64 66 67 68 69 70 71 72 73 74 75 77 78 80 83 84 86 88 94 97 101 106 121 122"},F:{"46":0.00547,"85":0.00547,"95":0.04376,"102":0.96819,"103":0.2188,"104":1.22528,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"96":0.00547,"105":0.00547,"107":0.00547,"108":0.01094,"109":0.03829,"114":0.02188,"115":0.02188,"116":0.00547,"117":0.08752,"118":1.02836,"119":4.76984,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 97 98 99 100 101 102 103 104 106 110 111 112 113"},E:{"9":0.00547,"13":0.00547,"14":0.09846,"15":0.02735,_:"0 4 5 6 7 8 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.01094,"13.1":0.14769,"14.1":0.26803,"15.1":0.04376,"15.2-15.3":0.01641,"15.4":0.07658,"15.5":0.18051,"15.6":1.43861,"16.0":0.20786,"16.1":0.15863,"16.2":0.20786,"16.3":0.37196,"16.4":0.1641,"16.5":0.49777,"16.6":2.37945,"17.0":0.6564,"17.1":1.63006,"17.2":0.01094},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00411,"5.0-5.1":0.00411,"6.0-6.1":0.01028,"7.0-7.1":0.01439,"8.1-8.4":0.00206,"9.0-9.2":0.01645,"9.3":0.0514,"10.0-10.2":0.00411,"10.3":0.07402,"11.0-11.2":0.03495,"11.3-11.4":0.03084,"12.0-12.1":0.01851,"12.2-12.5":0.33721,"13.0-13.1":0.00822,"13.2":0.03495,"13.3":0.02056,"13.4-13.7":0.05963,"14.0-14.4":0.15832,"14.5-14.8":0.25702,"15.0-15.1":0.10075,"15.2-15.3":0.12337,"15.4":0.13776,"15.5":0.19328,"15.6-15.7":1.01575,"16.0":0.47703,"16.1":0.95612,"16.2":0.45853,"16.3":0.85948,"16.4":0.17683,"16.5":0.45647,"16.6-16.7":7.73736,"17.0":2.3173,"17.1":3.89232,"17.2":0.11103},P:{"4":0.02079,"20":0.0104,"21":0.07278,"22":0.36391,"23":3.38952,"5.0-5.4":0.0104,_:"6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 14.0 15.0 16.0 17.0 18.0","13.0":0.02079,"19.0":0.02079},I:{"0":0.03155,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.0001},K:{"0":0.2718,_:"10 11 12 11.1 11.5 12.1"},A:{"9":0.00547,"11":0.00547,_:"6 7 8 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.01812},H:{"0":0},L:{"0":20.43148},R:{_:"0"},M:{"0":0.35787},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IT.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IT.js
    index ab4a3fef3dd789..de088b5e75eaf7 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IT.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/IT.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00444,"48":0.00444,"49":0,"50":0,"51":0,"52":0.02663,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0.01332,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00444,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.0222,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0.00444,"88":0.00444,"89":0,"90":0,"91":0.00444,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.03107,"103":0,"104":0.00444,"105":0.00444,"106":0.00444,"107":0.00444,"108":0.01776,"109":0.00444,"110":0.00444,"111":0.00888,"112":0.00444,"113":0.01332,"114":0.00888,"115":0.23527,"116":0.0799,"117":1.26068,"118":0.13317,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00444,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.03107,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.04883,"64":0,"65":0.00444,"66":0.04883,"67":0,"68":0.00444,"69":0.00444,"70":0,"71":0,"72":0,"73":0.00444,"74":0.00444,"75":0.00444,"76":0.00444,"77":0.00444,"78":0.00444,"79":0.04439,"80":0.00444,"81":0.01332,"83":0.00444,"84":0,"85":0.01776,"86":0.01776,"87":0.0222,"88":0.00888,"89":0.00888,"90":0.00444,"91":0.00888,"92":0.07546,"93":0.03551,"94":0.00444,"95":0.00888,"96":0.00444,"97":0.00444,"98":0.00444,"99":0.01332,"100":0.00888,"101":0.00888,"102":0.01332,"103":0.04883,"104":0.00444,"105":0.03995,"106":0.05327,"107":0.03551,"108":0.03551,"109":0.93663,"110":0.02663,"111":0.03107,"112":0.04439,"113":0.03995,"114":0.14649,"115":0.16868,"116":7.72386,"117":2.73442,"118":0.00444,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00444,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.01776,"73":0.00444,"74":0,"75":0,"76":0.07102,"77":0.01776,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.00444,"95":0.01332,"96":0,"97":0,"98":0,"99":0.00444,"100":0.03995,"101":0.15537,"102":0.2841,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00444,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0.00888,"86":0,"87":0,"88":0,"89":0,"90":0.07102,"91":0,"92":0.00444,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0.00444,"107":0.00444,"108":0.00444,"109":0.04439,"110":0.00444,"111":0.00444,"112":0.00444,"113":0.00444,"114":0.03107,"115":0.05771,"116":0.88336,"117":0.85229},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00444,"9":0,"10":0,"11":0,"12":0.00444,"13":0.00444,"14":0.03551,"15":0.00888,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00888,"10.1":0,"11.1":0.00888,"12.1":0.01332,"13.1":0.05771,"14.1":0.15093,"15.1":0.01332,"15.2-15.3":0.00888,"15.4":0.01776,"15.5":0.02663,"15.6":0.15093,"16.0":0.01776,"16.1":0.05771,"16.2":0.03995,"16.3":0.09766,"16.4":0.04439,"16.5":0.1598,"16.6":0.67917,"17.0":0.06215,"17.1":0},G:{"8":0.00238,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.0095,"6.0-6.1":0.00238,"7.0-7.1":0.00713,"8.1-8.4":0,"9.0-9.2":0.00713,"9.3":0.05464,"10.0-10.2":0.00238,"10.3":0.05464,"11.0-11.2":0.02613,"11.3-11.4":0.08077,"12.0-12.1":0.019,"12.2-12.5":0.30881,"13.0-13.1":0.01425,"13.2":0.01188,"13.3":0.08552,"13.4-13.7":0.06651,"14.0-14.4":0.19241,"14.5-14.8":0.36345,"15.0-15.1":0.12115,"15.2-15.3":0.13065,"15.4":0.1164,"15.5":0.19479,"15.6-15.7":1.31838,"16.0":0.73402,"16.1":1.18298,"16.2":0.52973,"16.3":1.07609,"16.4":0.28743,"16.5":0.89318,"16.6":13.343,"17.0":2.22106,"17.1":0.00238},P:{"4":0.1022,"20":0.08176,"21":0.2044,"22":2.80022,"5.0-5.4":0.01022,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.02044,"12.0":0.01022,"13.0":0.03066,"14.0":0.02044,"15.0":0.02044,"16.0":0.03066,"17.0":0.03066,"18.0":0.03066,"19.0":0.06132},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.01191,"4.2-4.3":0.01191,"4.4":0,"4.4.3-4.4.4":0.12502},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00444,"9":0.00444,"10":0,"11":0.13761,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":50.80456},R:{_:"0"},M:{"0":0.33922},Q:{"13.1":0.00556},O:{"0":0.1279},H:{"0":0.2843}};
    +module.exports={C:{"47":0.00492,"48":0.00492,"52":0.05898,"56":0.00492,"59":0.01966,"68":0.00492,"72":0.00492,"78":0.04424,"88":0.01475,"91":0.00492,"93":0.00983,"94":0.01475,"101":0.00492,"102":0.01966,"103":0.00492,"105":0.00492,"106":0.00492,"107":0.00492,"108":0.01475,"109":0.00492,"110":0.00492,"111":0.00983,"112":0.00492,"113":0.01966,"114":0.00983,"115":0.57014,"116":0.00983,"117":0.01475,"118":0.07864,"119":3.96149,"120":0.71759,"121":0.00492,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 49 50 51 53 54 55 57 58 60 61 62 63 64 65 66 67 69 70 71 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 90 92 95 96 97 98 99 100 104 122 123 3.5 3.6"},D:{"38":0.00983,"49":0.04915,"60":0.00492,"63":0.08356,"65":0.00492,"66":0.08847,"67":0.00492,"74":0.00492,"75":0.00492,"77":0.00492,"78":0.00492,"79":0.04424,"80":0.00492,"81":0.00983,"83":0.00492,"85":0.01966,"86":0.01475,"87":0.03441,"88":0.00983,"89":0.00983,"90":0.00492,"91":0.00983,"92":0.33422,"93":0.07864,"94":0.00983,"95":0.0639,"96":0.00983,"97":0.00983,"98":0.00492,"99":0.01966,"100":0.00983,"101":0.00983,"102":0.01475,"103":0.0983,"104":0.00983,"105":0.02949,"106":0.06881,"107":0.03441,"108":0.03932,"109":2.5558,"110":0.02458,"111":0.03932,"112":0.05407,"113":0.02458,"114":0.10813,"115":0.04915,"116":0.39812,"117":0.32439,"118":6.31578,"119":22.24038,"120":0.01475,"121":0.00492,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 47 48 50 51 52 53 54 55 56 57 58 59 61 62 64 68 69 70 71 72 73 76 84 122"},F:{"46":0.00492,"85":0.00492,"95":0.03441,"102":0.33422,"103":0.12288,"104":0.47676,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"17":0.00983,"18":0.00492,"85":0.00492,"90":0.11305,"92":0.00492,"107":0.00492,"108":0.00492,"109":0.07864,"110":0.00492,"111":0.00492,"112":0.00492,"113":0.00492,"114":0.01475,"115":0.05898,"116":0.00983,"117":0.06881,"118":0.61438,"119":3.12103,_:"12 13 14 15 16 79 80 81 83 84 86 87 88 89 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106"},E:{"8":0.00492,"13":0.00983,"14":0.06881,"15":0.01475,_:"0 4 5 6 7 9 10 11 12 3.1 3.2 6.1 7.1 9.1 10.1","5.1":0.00492,"11.1":0.01966,"12.1":0.02458,"13.1":0.12779,"14.1":0.37354,"15.1":0.03441,"15.2-15.3":0.02458,"15.4":0.03932,"15.5":0.04424,"15.6":0.28999,"16.0":0.04915,"16.1":0.10322,"16.2":0.0639,"16.3":0.17203,"16.4":0.0983,"16.5":0.17694,"16.6":0.67827,"17.0":0.45218,"17.1":0.64387,"17.2":0.00983},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00277,"5.0-5.1":0.00277,"6.0-6.1":0.00692,"7.0-7.1":0.00969,"8.1-8.4":0.00138,"9.0-9.2":0.01108,"9.3":0.03462,"10.0-10.2":0.00277,"10.3":0.04986,"11.0-11.2":0.02354,"11.3-11.4":0.02077,"12.0-12.1":0.01246,"12.2-12.5":0.22713,"13.0-13.1":0.00554,"13.2":0.02354,"13.3":0.01385,"13.4-13.7":0.04016,"14.0-14.4":0.10664,"14.5-14.8":0.17311,"15.0-15.1":0.06786,"15.2-15.3":0.0831,"15.4":0.09279,"15.5":0.13018,"15.6-15.7":0.68415,"16.0":0.3213,"16.1":0.64399,"16.2":0.30884,"16.3":0.5789,"16.4":0.1191,"16.5":0.30745,"16.6-16.7":5.21145,"17.0":1.5608,"17.1":2.62165,"17.2":0.07479},P:{"4":0.07252,"20":0.06216,"21":0.11396,"22":0.36261,"23":2.48649,_:"5.0-5.4 6.2-6.4 7.2-7.4 8.2 10.1","9.2":0.01036,"11.1-11.2":0.03108,"12.0":0.01036,"13.0":0.02072,"14.0":0.03108,"15.0":0.02072,"16.0":0.02072,"17.0":0.03108,"18.0":0.02072,"19.0":0.06216},I:{"0":0.04555,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00014},K:{"0":0.29499,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00508,"9":0.00508,"11":0.14221,_:"6 7 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.09155},H:{"0":0},L:{"0":33.01271},R:{_:"0"},M:{"0":0.44248},Q:{"13.1":0.00509}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/JE.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/JE.js
    index 49d388d3a599a1..c0c50a25120f5e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/JE.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/JE.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00473,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.04255,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.01418,"110":0.00473,"111":0,"112":0,"113":0,"114":0,"115":0.0331,"116":0.01891,"117":0.76121,"118":0.07565,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.00946,"80":0.04255,"81":0,"83":0,"84":0,"85":0.00473,"86":0,"87":0.01891,"88":0,"89":0,"90":0.00946,"91":0.00473,"92":0,"93":0,"94":0.00473,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.00473,"102":0,"103":0.04728,"104":0,"105":0,"106":0,"107":0.00473,"108":0.00473,"109":0.22222,"110":0,"111":0.00473,"112":0.00946,"113":0.01891,"114":0.17494,"115":0.34514,"116":6.71849,"117":1.98576,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0.00473,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00946,"100":0.09929,"101":0.11347,"102":0.16548,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00473,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00473,"101":0,"102":0,"103":0.00473,"104":0,"105":0,"106":0,"107":0,"108":0.00473,"109":0.03782,"110":0,"111":0,"112":0,"113":0,"114":0.01891,"115":0.04728,"116":2.14651,"117":1.79664},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.05674,"15":0.00946,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0.00473,"11.1":0,"12.1":0.02364,"13.1":0.05674,"14.1":0.14184,"15.1":0.02364,"15.2-15.3":0.04728,"15.4":0.01418,"15.5":0.09456,"15.6":0.31205,"16.0":0.01891,"16.1":0.66192,"16.2":0.12293,"16.3":0.30732,"16.4":0.09456,"16.5":0.25058,"16.6":2.94554,"17.0":0.19385,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0.37863,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0.04266,"9.3":0.33597,"10.0-10.2":0,"10.3":0.4213,"11.0-11.2":0.01067,"11.3-11.4":0.05866,"12.0-12.1":0,"12.2-12.5":1.09324,"13.0-13.1":0,"13.2":0,"13.3":0.04266,"13.4-13.7":0.08533,"14.0-14.4":0.64528,"14.5-14.8":0.49596,"15.0-15.1":0.06399,"15.2-15.3":0.07466,"15.4":0.32531,"15.5":0.35197,"15.6-15.7":3.19439,"16.0":1.96783,"16.1":2.58111,"16.2":1.11457,"16.3":3.1464,"16.4":0.19198,"16.5":0.68261,"16.6":33.01586,"17.0":1.97317,"17.1":0.02666},P:{"4":0.20435,"20":0.07529,"21":0.08604,"22":3.51703,"5.0-5.4":0.06453,"6.2-6.4":0,"7.2-7.4":0.01076,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0.03227,"17.0":0.01076,"18.0":0.01076,"19.0":0.01076},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.21494},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.3546,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":20.09294},R:{_:"0"},M:{"0":0.28469},Q:{"13.1":0},O:{"0":0.01054},H:{"0":0.02496}};
    +module.exports={C:{"53":0.00429,"56":0.00859,"78":0.00859,"87":0.00429,"110":0.00859,"113":0.00429,"115":0.08588,"117":0.00429,"118":0.02147,"119":1.53296,"120":0.60975,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 54 55 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 111 112 114 116 121 122 123 3.5 3.6"},D:{"49":0.00859,"79":0.02576,"80":0.04723,"83":0.00429,"87":0.00429,"94":0.03006,"98":0.01718,"99":0.00429,"101":0.00429,"103":0.48093,"104":0.00429,"107":0.01288,"108":0.00429,"109":0.30487,"111":0.00859,"112":0.00429,"113":0.15458,"114":0.073,"115":0.00859,"116":0.47234,"117":0.29629,"118":4.06642,"119":14.04567,"120":0.00429,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 81 84 85 86 88 89 90 91 92 93 95 96 97 100 102 105 106 110 121 122"},F:{"28":0.01288,"102":0.39934,"103":0.02576,"104":0.24905,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.00859,"92":0.00429,"98":0.00429,"103":0.00429,"109":0.05582,"110":0.00429,"113":0.00429,"114":0.00429,"115":0.00429,"116":0.00429,"117":0.146,"118":1.45137,"119":6.74587,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 99 100 101 102 104 105 106 107 108 111 112"},E:{"13":0.00429,"14":0.073,"15":0.01718,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1","11.1":0.00429,"12.1":0.05153,"13.1":0.2834,"14.1":0.36499,"15.1":0.08588,"15.2-15.3":0.05153,"15.4":0.03006,"15.5":0.20611,"15.6":0.63122,"16.0":0.06441,"16.1":0.64839,"16.2":0.19752,"16.3":0.47234,"16.4":0.1417,"16.5":0.69563,"16.6":4.54305,"17.0":0.62263,"17.1":1.62743,"17.2":0.04723},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00751,"5.0-5.1":0.00751,"6.0-6.1":0.01877,"7.0-7.1":0.02628,"8.1-8.4":0.00375,"9.0-9.2":0.03003,"9.3":0.09385,"10.0-10.2":0.00751,"10.3":0.13514,"11.0-11.2":0.06382,"11.3-11.4":0.05631,"12.0-12.1":0.03379,"12.2-12.5":0.61565,"13.0-13.1":0.01502,"13.2":0.06382,"13.3":0.03754,"13.4-13.7":0.10887,"14.0-14.4":0.28906,"14.5-14.8":0.46925,"15.0-15.1":0.18394,"15.2-15.3":0.22524,"15.4":0.25152,"15.5":0.35287,"15.6-15.7":1.85446,"16.0":0.87092,"16.1":1.7456,"16.2":0.83714,"16.3":1.56916,"16.4":0.32284,"16.5":0.83338,"16.6-16.7":14.12622,"17.0":4.23073,"17.1":7.10628,"17.2":0.20271},P:{"4":0.13517,"20":0.03379,"21":0.03379,"22":0.18023,"23":3.90867,_:"5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 17.0 18.0","16.0":0.04506,"19.0":0.01126},I:{"0":0.02271,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.00007},K:{"0":0.06988,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.00859,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{_:"0"},H:{"0":0.01},L:{"0":14.40535},R:{_:"0"},M:{"0":0.58772},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/JM.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/JM.js
    index ac6f2f2e7b3543..39795bef2fd7ae 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/JM.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/JM.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0.01426,"74":0,"75":0,"76":0,"77":0,"78":0.0214,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00713,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00357,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0.00357,"115":0.05349,"116":0.04992,"117":0.33164,"118":0.02853,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00357,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.01783,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00357,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.00357,"64":0,"65":0.00357,"66":0,"67":0,"68":0,"69":0.00357,"70":0.0107,"71":0,"72":0,"73":0.0107,"74":0,"75":0.00713,"76":0.01426,"77":0.00357,"78":0,"79":0.02853,"80":0,"81":0.0107,"83":0.05349,"84":0,"85":0.00357,"86":0.00357,"87":0.0107,"88":0.00357,"89":0,"90":0,"91":0.00713,"92":0.00713,"93":0.07489,"94":0.00357,"95":0.01426,"96":0.00357,"97":0,"98":0,"99":0.00357,"100":0.00357,"101":0,"102":0.00357,"103":0.14264,"104":0.00357,"105":0.0107,"106":0.00713,"107":0.00713,"108":0.00713,"109":0.24605,"110":0.00357,"111":0.0107,"112":0.03923,"113":0.02853,"114":0.11055,"115":0.22466,"116":5.25272,"117":1.27306,"118":0.00713,"119":0.00357,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00357,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.01426,"73":0.00357,"74":0,"75":0,"76":0,"77":0.01783,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00713,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00357,"96":0,"97":0,"98":0,"99":0.00357,"100":0.03209,"101":0.14264,"102":0.11411,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00357,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00713,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.00357,"104":0,"105":0,"106":0,"107":0.01426,"108":0,"109":0.00357,"110":0.00357,"111":0,"112":0.00357,"113":0.00357,"114":0.0214,"115":0.04992,"116":0.99848,"117":0.66684},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00357,"14":0.00357,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00713,"13.1":0.02853,"14.1":0.04279,"15.1":0.00357,"15.2-15.3":0.00713,"15.4":0.00713,"15.5":0.01783,"15.6":0.09628,"16.0":0.00357,"16.1":0.03209,"16.2":0.02853,"16.3":0.03923,"16.4":0.0214,"16.5":0.04636,"16.6":0.43862,"17.0":0.02496,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00751,"6.0-6.1":0,"7.0-7.1":0.08515,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.08766,"10.0-10.2":0,"10.3":0.1152,"11.0-11.2":0.03506,"11.3-11.4":0.01252,"12.0-12.1":0,"12.2-12.5":0.29552,"13.0-13.1":0.00751,"13.2":0.01753,"13.3":0.02004,"13.4-13.7":0.07012,"14.0-14.4":0.14275,"14.5-14.8":0.26798,"15.0-15.1":0.0576,"15.2-15.3":0.09517,"15.4":0.0551,"15.5":0.09767,"15.6-15.7":2.79246,"16.0":0.64364,"16.1":1.09945,"16.2":0.66368,"16.3":1.02933,"16.4":0.20286,"16.5":0.96922,"16.6":13.37375,"17.0":2.37171,"17.1":0.00751},P:{"4":0.14835,"20":0.12716,"21":0.22252,"22":3.25306,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.40266,"8.2":0,"9.2":0.0106,"10.1":0,"11.1-11.2":0.04239,"12.0":0,"13.0":0.02119,"14.0":0.02119,"15.0":0.0106,"16.0":0.07417,"17.0":0.02119,"18.0":0.03179,"19.0":0.08477},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.06207,"4.4":0,"4.4.3-4.4.4":0.68276},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.03209,"5.5":0},S:{"2.5":0.00643,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":55.94611},R:{_:"0"},M:{"0":0.19302},Q:{"13.1":0},O:{"0":0.3603},H:{"0":0.23147}};
    +module.exports={C:{"48":0.00746,"52":0.00373,"73":0.04477,"78":0.03358,"79":0.00373,"86":0.00373,"87":0.00373,"88":0.00373,"104":0.00373,"105":0.00373,"108":0.00373,"110":0.00373,"115":0.09328,"116":0.00373,"117":0.00373,"118":1.48867,"119":1.26481,"120":0.20521,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 74 75 76 77 80 81 82 83 84 85 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 106 107 109 111 112 113 114 121 122 123 3.5 3.6"},D:{"20":0.00373,"29":0.01119,"38":0.00373,"41":0.01492,"47":0.00373,"48":0.00373,"49":0.00373,"50":0.00373,"56":0.00373,"58":0.00373,"59":0.00373,"60":0.00746,"63":0.01119,"65":0.00373,"69":0.00746,"70":0.04104,"71":0.00373,"73":0.02612,"74":0.00373,"75":0.01492,"76":0.1679,"77":0.00373,"79":0.0485,"80":0.00373,"81":0.01866,"83":0.17909,"84":0.00373,"86":0.0597,"87":0.01866,"88":0.01119,"90":0.00373,"91":0.01119,"92":0.00373,"93":0.16043,"94":0.00373,"95":0.00746,"96":0.00746,"98":0.00373,"99":0.00373,"100":0.00373,"101":0.00373,"102":0.01119,"103":0.41787,"104":0.40295,"105":0.02239,"106":0.01119,"107":0.02239,"108":0.01492,"109":0.6977,"110":0.03358,"111":0.03731,"112":0.07835,"113":0.02239,"114":0.06343,"115":0.06343,"116":0.38056,"117":0.45518,"118":4.81299,"119":13.05104,"120":0.02612,"121":0.00746,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 21 22 23 24 25 26 27 28 30 31 32 33 34 35 36 37 39 40 42 43 44 45 46 51 52 53 54 55 57 61 62 64 66 67 68 72 78 85 89 97 122"},F:{"28":0.01119,"69":0.00746,"85":0.00373,"95":0.00373,"101":0.00373,"102":0.30221,"103":0.08581,"104":0.32087,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 86 87 88 89 90 91 92 93 94 96 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00373,"15":0.00373,"16":0.00373,"17":0.00373,"18":0.00746,"90":0.00373,"92":0.01119,"100":0.00373,"103":0.00373,"106":0.00373,"109":0.01492,"110":0.00373,"111":0.00746,"112":0.00373,"113":0.00373,"114":0.01119,"115":0.01119,"116":0.02612,"117":0.08954,"118":1.10438,"119":4.46228,_:"13 14 79 80 81 83 84 85 86 87 88 89 91 93 94 95 96 97 98 99 101 102 104 105 107 108"},E:{"10":0.00373,"13":0.00373,"14":0.00746,"15":0.00373,_:"0 4 5 6 7 8 9 11 12 3.1 3.2 6.1 7.1 9.1","5.1":0.00373,"10.1":0.01119,"11.1":0.00746,"12.1":0.01866,"13.1":0.12685,"14.1":0.07835,"15.1":0.01119,"15.2-15.3":0.04104,"15.4":0.02985,"15.5":0.03358,"15.6":0.17536,"16.0":0.01119,"16.1":0.07089,"16.2":0.11193,"16.3":0.1082,"16.4":0.0485,"16.5":0.09328,"16.6":1.91027,"17.0":0.23878,"17.1":0.33952,"17.2":0.00373},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00328,"5.0-5.1":0.00328,"6.0-6.1":0.00819,"7.0-7.1":0.01147,"8.1-8.4":0.00164,"9.0-9.2":0.01311,"9.3":0.04096,"10.0-10.2":0.00328,"10.3":0.05898,"11.0-11.2":0.02785,"11.3-11.4":0.02458,"12.0-12.1":0.01475,"12.2-12.5":0.26871,"13.0-13.1":0.00655,"13.2":0.02785,"13.3":0.01638,"13.4-13.7":0.04752,"14.0-14.4":0.12616,"14.5-14.8":0.20481,"15.0-15.1":0.08028,"15.2-15.3":0.09831,"15.4":0.10978,"15.5":0.15401,"15.6-15.7":0.8094,"16.0":0.38012,"16.1":0.76188,"16.2":0.36538,"16.3":0.68487,"16.4":0.14091,"16.5":0.36374,"16.6-16.7":6.16551,"17.0":1.84654,"17.1":3.1016,"17.2":0.08848},P:{"4":0.14955,"20":0.08546,"21":0.21365,"22":0.3632,"23":2.74535,"5.0-5.4":0.01068,_:"6.2-6.4 8.2 9.2 10.1 12.0","7.2-7.4":0.30979,"11.1-11.2":0.03205,"13.0":0.02136,"14.0":0.03205,"15.0":0.05341,"16.0":0.04273,"17.0":0.02136,"18.0":0.02136,"19.0":0.16023},I:{"0":0.08108,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00024},K:{"0":0.36354,_:"10 11 12 11.1 11.5 12.1"},A:{"10":0.00497,"11":0.00995,_:"6 7 8 9 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.26952},H:{"0":0},L:{"0":43.25505},R:{_:"0"},M:{"0":0.18177},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/JO.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/JO.js
    index c5985347c752c6..f803d3876ba78c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/JO.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/JO.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00494,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00247,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0.00987,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00247,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00247,"103":0.00247,"104":0,"105":0,"106":0,"107":0,"108":0.00494,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0.00247,"115":0.03208,"116":0.0074,"117":0.11846,"118":0.01234,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00494,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00247,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00247,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.00247,"56":0,"57":0,"58":0.0074,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0.00247,"74":0,"75":0,"76":0,"77":0,"78":0.00494,"79":0.00494,"80":0.00247,"81":0.00987,"83":0.00494,"84":0.00247,"85":0.00494,"86":0.01728,"87":0.00494,"88":0.00494,"89":0.00247,"90":0.03208,"91":0,"92":0,"93":0.00247,"94":0.00247,"95":0.00247,"96":0.00247,"97":0,"98":0.0074,"99":0.01974,"100":0.00247,"101":0.00247,"102":0.00494,"103":0.00494,"104":0.00247,"105":0.00987,"106":0.02221,"107":0.00494,"108":0.01234,"109":0.41462,"110":0.00247,"111":0.00494,"112":0.01728,"113":0.0074,"114":0.03208,"115":0.2394,"116":2.43838,"117":0.6861,"118":0.01234,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00247,"73":0,"74":0.00247,"75":0,"76":0,"77":0.01234,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00987,"96":0,"97":0.01481,"98":0,"99":0.01974,"100":0.01974,"101":0.02962,"102":0.03208,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00247,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00247,"108":0,"109":0.00494,"110":0,"111":0,"112":0,"113":0.00247,"114":0.00494,"115":0.01234,"116":0.29369,"117":0.19991},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00247,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.01234,"6.1":0,"7.1":0,"9.1":0.00247,"10.1":0,"11.1":0,"12.1":0,"13.1":0.0074,"14.1":0.00987,"15.1":0.00247,"15.2-15.3":0.00247,"15.4":0.00247,"15.5":0.00494,"15.6":0.01481,"16.0":0,"16.1":0.00987,"16.2":0.00494,"16.3":0.01728,"16.4":0.00494,"16.5":0.01728,"16.6":0.10859,"17.0":0.0074,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00388,"6.0-6.1":0,"7.0-7.1":0.04461,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.03685,"10.0-10.2":0,"10.3":0.0194,"11.0-11.2":0.00388,"11.3-11.4":0,"12.0-12.1":0.00776,"12.2-12.5":0.2638,"13.0-13.1":0.00388,"13.2":0.00194,"13.3":0.48105,"13.4-13.7":0.04073,"14.0-14.4":0.23471,"14.5-14.8":0.27932,"15.0-15.1":0.05237,"15.2-15.3":0.08729,"15.4":0.10668,"15.5":0.16682,"15.6-15.7":1.77872,"16.0":0.64787,"16.1":0.73903,"16.2":0.42868,"16.3":0.92525,"16.4":0.25992,"16.5":0.72546,"16.6":10.59863,"17.0":1.22396,"17.1":0},P:{"4":0.05129,"20":0.08206,"21":0.24617,"22":3.09766,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.08206,"8.2":0,"9.2":0.01026,"10.1":0.01026,"11.1-11.2":0.05129,"12.0":0,"13.0":0.04103,"14.0":0.06154,"15.0":0.08206,"16.0":0.0718,"17.0":0.04103,"18.0":0.05129,"19.0":0.10257},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.01286,"4.4":0,"4.4.3-4.4.4":0.14144},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00987,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":69.53555},R:{_:"0"},M:{"0":0.15064},Q:{"13.1":0},O:{"0":0.20336},H:{"0":0.20679}};
    +module.exports={C:{"34":0.00221,"47":0.00221,"52":0.00664,"78":0.00221,"88":0.00221,"102":0.00221,"103":0.00221,"108":0.00443,"109":0.01107,"111":0.00221,"115":0.14385,"116":0.00221,"117":0.00221,"118":0.01328,"119":0.31646,"120":0.08409,"121":0.00221,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 90 91 92 93 94 95 96 97 98 99 100 101 104 105 106 107 110 112 113 114 122 123 3.5 3.6"},D:{"11":0.01549,"34":0.00221,"38":0.00221,"43":0.00221,"49":0.00885,"53":0.00221,"55":0.00221,"56":0.00221,"58":0.02656,"63":0.00443,"65":0.00443,"66":0.00443,"68":0.00221,"69":0.00221,"70":0.00221,"71":0.00885,"72":0.00221,"73":0.00443,"74":0.00221,"75":0.00221,"76":0.00221,"77":0.00221,"78":0.00664,"79":0.01328,"80":0.00221,"81":0.00443,"83":0.01328,"84":0.00221,"85":0.01328,"86":0.01107,"87":0.00885,"88":0.01328,"89":0.00664,"90":0.00443,"91":0.00443,"92":0.00443,"93":0.00885,"94":0.00443,"95":0.00221,"96":0.01328,"97":0.00221,"98":0.01549,"99":0.05533,"100":0.00885,"101":0.00443,"102":0.0177,"103":0.02434,"104":0.00443,"105":0.02213,"106":0.02434,"107":0.04205,"108":0.05975,"109":1.5668,"110":0.03541,"111":0.02656,"112":0.05754,"113":0.01549,"114":0.05311,"115":0.05311,"116":0.10844,"117":0.21909,"118":2.54052,"119":10.96984,"120":0.04205,"121":0.00221,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 39 40 41 42 44 45 46 47 48 50 51 52 54 57 59 60 61 62 64 67 122"},F:{"28":0.00221,"46":0.00221,"79":0.00443,"82":0.00221,"83":0.00221,"84":0.00221,"95":0.01992,"99":0.01107,"100":0.00443,"101":0.00443,"102":0.17483,"103":0.03762,"104":0.15048,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 85 86 87 88 89 90 91 92 93 94 96 97 98 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00221,"14":0.00221,"18":0.00664,"89":0.00221,"90":0.00221,"92":0.01549,"100":0.00885,"106":0.00221,"107":0.00885,"108":0.00664,"109":0.0177,"110":0.00443,"111":0.00221,"113":0.00221,"114":0.00443,"115":0.00885,"116":0.00885,"117":0.02877,"118":0.35187,"119":1.81687,_:"13 15 16 17 79 80 81 83 84 85 86 87 88 91 93 94 95 96 97 98 99 101 102 103 104 105 112"},E:{"14":0.00664,"15":0.00221,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 6.1 7.1 9.1 10.1 11.1 12.1","5.1":0.10622,"13.1":0.02434,"14.1":0.02877,"15.1":0.00443,"15.2-15.3":0.00885,"15.4":0.00664,"15.5":0.01328,"15.6":0.06418,"16.0":0.00664,"16.1":0.01549,"16.2":0.02213,"16.3":0.04869,"16.4":0.02656,"16.5":0.0332,"16.6":0.24564,"17.0":0.09737,"17.1":0.17704,"17.2":0.00443},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00254,"5.0-5.1":0.00254,"6.0-6.1":0.00634,"7.0-7.1":0.00888,"8.1-8.4":0.00127,"9.0-9.2":0.01015,"9.3":0.03171,"10.0-10.2":0.00254,"10.3":0.04567,"11.0-11.2":0.02156,"11.3-11.4":0.01903,"12.0-12.1":0.01142,"12.2-12.5":0.20803,"13.0-13.1":0.00507,"13.2":0.02156,"13.3":0.01269,"13.4-13.7":0.03679,"14.0-14.4":0.09767,"14.5-14.8":0.15856,"15.0-15.1":0.06216,"15.2-15.3":0.07611,"15.4":0.08499,"15.5":0.11924,"15.6-15.7":0.62664,"16.0":0.29429,"16.1":0.58985,"16.2":0.28288,"16.3":0.53023,"16.4":0.10909,"16.5":0.28161,"16.6-16.7":4.77337,"17.0":1.4296,"17.1":2.40127,"17.2":0.0685},P:{"4":0.10166,"20":0.09149,"21":0.20332,"22":0.55912,"23":2.88711,"5.0-5.4":0.01017,_:"6.2-6.4 8.2","7.2-7.4":0.12199,"9.2":0.0305,"10.1":0.01017,"11.1-11.2":0.08133,"12.0":0.01017,"13.0":0.04066,"14.0":0.061,"15.0":0.10166,"16.0":0.08133,"17.0":0.061,"18.0":0.04066,"19.0":0.13216},I:{"0":0.10847,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00008,"4.4":0,"4.4.3-4.4.4":0.00033},K:{"0":0.33263,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.0332,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.18689},H:{"0":0.01},L:{"0":60.92457},R:{_:"0"},M:{"0":0.23361},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/JP.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/JP.js
    index 1c8f003e1dbdaf..17806a27cb79fe 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/JP.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/JP.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.01222,"49":0,"50":0,"51":0,"52":0.03056,"53":0,"54":0.165,"55":0,"56":0.00611,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00611,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.03056,"79":0,"80":0,"81":0,"82":0,"83":0.00611,"84":0,"85":0,"86":0,"87":0,"88":0.00611,"89":0,"90":0,"91":0.00611,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.00611,"102":0.06111,"103":0,"104":0,"105":0,"106":0.00611,"107":0.00611,"108":0.00611,"109":0.00611,"110":0.00611,"111":0.00611,"112":0.00611,"113":0.01222,"114":0.01222,"115":0.18944,"116":0.10389,"117":1.55219,"118":0.13444,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00611,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00611,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.03667,"50":0,"51":0,"52":0.00611,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00611,"66":0,"67":0.00611,"68":0.00611,"69":0.00611,"70":0.00611,"71":0,"72":0,"73":0,"74":0.00611,"75":0.00611,"76":0,"77":0,"78":0.00611,"79":0.01222,"80":0.01833,"81":0.08555,"83":0.01833,"84":0.00611,"85":0.01222,"86":0.01833,"87":0.01222,"88":0.00611,"89":0.01222,"90":0.01222,"91":0.01222,"92":0.01222,"93":0.00611,"94":0.01222,"95":0.01833,"96":0.00611,"97":0.02444,"98":0.01833,"99":0.03056,"100":0.01222,"101":0.01222,"102":0.01833,"103":0.06111,"104":0.01833,"105":0.02444,"106":0.03056,"107":0.02444,"108":0.04278,"109":0.62943,"110":0.03056,"111":0.04278,"112":0.06111,"113":0.08555,"114":0.32388,"115":0.50721,"116":12.8881,"117":3.28772,"118":0.01833,"119":0.00611,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00611,"73":0,"74":0,"75":0,"76":0,"77":0.01222,"78":0,"79":0,"80":0.00611,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01222,"96":0,"97":0,"98":0,"99":0,"100":0.01222,"101":0.12833,"102":0.09167,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00611,"18":0.00611,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00611,"93":0,"94":0,"95":0,"96":0,"97":0.00611,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.00611,"104":0,"105":0.00611,"106":0.00611,"107":0.01222,"108":0.01222,"109":0.21389,"110":0.01222,"111":0.01222,"112":0.01222,"113":0.02444,"114":0.055,"115":0.15278,"116":4.35714,"117":3.13494},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.01222,"14":0.03667,"15":0.00611,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.01222,"13.1":0.04889,"14.1":0.11,"15.1":0.01222,"15.2-15.3":0.01222,"15.4":0.03056,"15.5":0.04278,"15.6":0.20777,"16.0":0.02444,"16.1":0.04889,"16.2":0.055,"16.3":0.14666,"16.4":0.04889,"16.5":0.15278,"16.6":1.14887,"17.0":0.04889,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.05396,"8.1-8.4":0.02076,"9.0-9.2":0.02076,"9.3":0.07887,"10.0-10.2":0.0083,"10.3":0.09963,"11.0-11.2":0.04151,"11.3-11.4":0.0166,"12.0-12.1":0.02906,"12.2-12.5":0.35285,"13.0-13.1":0.03736,"13.2":0.12038,"13.3":0.02906,"13.4-13.7":0.09132,"14.0-14.4":0.33209,"14.5-14.8":0.69739,"15.0-15.1":0.20756,"15.2-15.3":0.25322,"15.4":0.32794,"15.5":0.45247,"15.6-15.7":2.7771,"16.0":0.81777,"16.1":2.21255,"16.2":1.13326,"16.3":2.17934,"16.4":0.43172,"16.5":1.26194,"16.6":25.53772,"17.0":1.38232,"17.1":0},P:{"4":0,"20":0.02111,"21":0.03167,"22":0.7178,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0.01056,"13.0":0.01056,"14.0":0,"15.0":0,"16.0":0,"17.0":0.01056,"18.0":0,"19.0":0.01056},I:{"0":0,"3":0,"4":0.0171,"2.1":0,"2.2":0.07409,"2.3":0.0114,"4.1":0.02849,"4.2-4.3":0.06839,"4.4":0,"4.4.3-4.4.4":0.15387},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.01778,"10":0,"11":0.27555,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0.01556,"11":0},L:{"0":23.84185},R:{_:"0"},M:{"0":0.26834},Q:{"13.1":0.02333},O:{"0":0.19834},H:{"0":0.10309}};
    +module.exports={C:{"48":0.01224,"52":0.03673,"54":0.41011,"56":0.01224,"72":0.00612,"78":0.03061,"80":0.00612,"81":0.00612,"83":0.01224,"88":0.00612,"91":0.00612,"101":0.00612,"102":0.02448,"104":0.01224,"105":0.00612,"106":0.00612,"107":0.00612,"108":0.00612,"109":0.00612,"110":0.00612,"111":0.00612,"112":0.00612,"113":0.01836,"114":0.00612,"115":0.34278,"116":0.01224,"117":0.05509,"118":0.06733,"119":2.08114,"120":0.61822,"121":0.00612,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 49 50 51 53 55 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 73 74 75 76 77 79 82 84 85 86 87 89 90 92 93 94 95 96 97 98 99 100 103 122 123 3.5 3.6"},D:{"41":0.00612,"48":0.00612,"49":0.05509,"52":0.00612,"53":0.02448,"61":0.00612,"65":0.00612,"66":0.00612,"67":0.00612,"68":0.00612,"69":0.00612,"70":0.00612,"71":0.00612,"72":0.00612,"74":0.00612,"75":0.01224,"76":0.00612,"77":0.00612,"78":0.01224,"79":0.01224,"80":0.01836,"81":0.09182,"83":0.03061,"84":0.01224,"85":0.02448,"86":0.03673,"87":0.01836,"88":0.00612,"89":0.01836,"90":0.01836,"91":0.03061,"92":0.00612,"93":0.00612,"94":0.02448,"95":0.06733,"96":0.01224,"97":0.03061,"98":0.07345,"99":0.03061,"100":0.02448,"101":0.03061,"102":0.03061,"103":0.09182,"104":0.02448,"105":0.06733,"106":0.07957,"107":0.07957,"108":0.09182,"109":1.03445,"110":0.06733,"111":0.09182,"112":0.07957,"113":0.04897,"114":0.16527,"115":0.08569,"116":0.59986,"117":0.74064,"118":6.59232,"119":22.30492,"120":0.02448,"121":0.01836,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 42 43 44 45 46 47 50 51 54 55 56 57 58 59 60 62 63 64 73 122"},F:{"46":0.00612,"95":0.01836,"102":0.05509,"103":0.07957,"104":0.18363,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.00612},B:{"17":0.00612,"18":0.00612,"85":0.00612,"86":0.00612,"92":0.00612,"97":0.00612,"100":0.00612,"102":0.00612,"103":0.00612,"105":0.00612,"106":0.01224,"107":0.01836,"108":0.02448,"109":0.34278,"110":0.02448,"111":0.02448,"112":0.01224,"113":0.03061,"114":0.03673,"115":0.03061,"116":0.05509,"117":0.15915,"118":1.9832,"119":10.02008,_:"12 13 14 15 16 79 80 81 83 84 87 88 89 90 91 93 94 95 96 98 99 101 104"},E:{"13":0.01224,"14":0.06121,"15":0.00612,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 11.1","10.1":0.00612,"12.1":0.01836,"13.1":0.08569,"14.1":0.18975,"15.1":0.01836,"15.2-15.3":0.01836,"15.4":0.04285,"15.5":0.05509,"15.6":0.36726,"16.0":0.03673,"16.1":0.10406,"16.2":0.07957,"16.3":0.22036,"16.4":0.06733,"16.5":0.15915,"16.6":1.24868,"17.0":0.27545,"17.1":0.64271,"17.2":0.00612},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00465,"5.0-5.1":0.00465,"6.0-6.1":0.01162,"7.0-7.1":0.01627,"8.1-8.4":0.00232,"9.0-9.2":0.0186,"9.3":0.05812,"10.0-10.2":0.00465,"10.3":0.08369,"11.0-11.2":0.03952,"11.3-11.4":0.03487,"12.0-12.1":0.02092,"12.2-12.5":0.38125,"13.0-13.1":0.0093,"13.2":0.03952,"13.3":0.02325,"13.4-13.7":0.06742,"14.0-14.4":0.179,"14.5-14.8":0.29059,"15.0-15.1":0.11391,"15.2-15.3":0.13948,"15.4":0.15575,"15.5":0.21852,"15.6-15.7":1.14839,"16.0":0.53933,"16.1":1.08098,"16.2":0.5184,"16.3":0.97172,"16.4":0.19992,"16.5":0.51608,"16.6-16.7":8.74779,"17.0":2.61992,"17.1":4.40063,"17.2":0.12553},P:{"20":0.01096,"21":0.02193,"22":0.07675,"23":0.92099,_:"4 5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 14.0 15.0 18.0","13.0":0.01096,"16.0":0.01096,"17.0":0.01096,"19.0":0.01096},I:{"0":0.08877,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00027},K:{"0":0.13964,_:"10 11 12 11.1 11.5 12.1"},A:{"6":0.00908,"8":0.00908,"9":0.02724,"10":0.00908,"11":0.49029,_:"7 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.21722},H:{"0":0},L:{"0":19.52682},R:{_:"0"},M:{"0":0.25989},Q:{"13.1":0.03491}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KE.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KE.js
    index 39005e16ff3087..a5e11bacc3b7a8 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KE.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KE.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00248,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00248,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00496,"103":0,"104":0,"105":0,"106":0,"107":0.00248,"108":0.00248,"109":0,"110":0.00248,"111":0.00248,"112":0,"113":0.00496,"114":0.00248,"115":0.07198,"116":0.02234,"117":0.25068,"118":0.02978,"119":0.00248,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00248,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00248,"50":0,"51":0,"52":0,"53":0.00248,"54":0.00248,"55":0,"56":0.00248,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00248,"67":0,"68":0,"69":0,"70":0.00248,"71":0,"72":0.00248,"73":0.00496,"74":0.00248,"75":0,"76":0,"77":0,"78":0,"79":0.00745,"80":0.00248,"81":0.00248,"83":0.00993,"84":0,"85":0,"86":0,"87":0.00745,"88":0.00496,"89":0,"90":0,"91":0.00496,"92":0.00248,"93":0.00248,"94":0.00248,"95":0.00496,"96":0.00745,"97":0.00248,"98":0.00248,"99":0.00496,"100":0.00248,"101":0.00248,"102":0.00248,"103":0.01489,"104":0.00248,"105":0.00496,"106":0.01241,"107":0.00993,"108":0.13899,"109":0.33755,"110":0.00248,"111":0.00993,"112":0.00745,"113":0.00993,"114":0.04716,"115":0.0695,"116":2.41499,"117":0.60809,"118":0.00248,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0.01241,"25":0,"26":0.00248,"27":0.00745,"28":0.00496,"29":0,"30":0.00248,"31":0,"32":0.00248,"33":0.00745,"34":0,"35":0,"36":0,"37":0.00496,"38":0.00248,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00496,"47":0.00248,"48":0,"49":0,"50":0.00248,"51":0.00248,"52":0,"53":0,"54":0.00496,"55":0.00248,"56":0,"57":0.00248,"58":0.00993,"60":0.04716,"62":0,"63":0.08687,"64":0.02482,"65":0.01737,"66":0.04964,"67":0.07446,"68":0.03971,"69":0.38223,"70":0.38719,"71":0.47903,"72":2.72524,"73":0.34252,"74":0.00993,"75":0.00248,"76":0.01241,"77":0.11665,"78":0.00496,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00745,"96":0,"97":0,"98":0.00248,"99":0.00248,"100":0.01241,"101":0.04716,"102":0.0546,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.01737},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00496,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00496,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00248,"108":0,"109":0.00248,"110":0,"111":0,"112":0.00248,"113":0.00248,"114":0.00496,"115":0.01241,"116":0.19111,"117":0.13899},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00248,"6.1":0,"7.1":0,"9.1":0.00496,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00496,"14.1":0.00496,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.00248,"15.6":0.00993,"16.0":0,"16.1":0.00248,"16.2":0.00248,"16.3":0.00496,"16.4":0.00248,"16.5":0.00745,"16.6":0.03723,"17.0":0.00248,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00149,"6.0-6.1":0.00174,"7.0-7.1":0.02211,"8.1-8.4":0,"9.0-9.2":0.00124,"9.3":0.01541,"10.0-10.2":0,"10.3":0.01864,"11.0-11.2":0.00323,"11.3-11.4":0.00919,"12.0-12.1":0.00373,"12.2-12.5":0.11678,"13.0-13.1":0.00075,"13.2":0,"13.3":0.00422,"13.4-13.7":0.00944,"14.0-14.4":0.02659,"14.5-14.8":0.03578,"15.0-15.1":0.02286,"15.2-15.3":0.0169,"15.4":0.03777,"15.5":0.02957,"15.6-15.7":0.33743,"16.0":0.0497,"16.1":0.11182,"16.2":0.0564,"16.3":0.12051,"16.4":0.03653,"16.5":0.09492,"16.6":1.13058,"17.0":0.13716,"17.1":0},P:{"4":0.09154,"20":0.03051,"21":0.0712,"22":0.58994,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.09154,"8.2":0,"9.2":0.01017,"10.1":0.01017,"11.1-11.2":0.02034,"12.0":0,"13.0":0.01017,"14.0":0.01017,"15.0":0,"16.0":0.02034,"17.0":0.01017,"18.0":0.02034,"19.0":0.05086},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00599,"4.4":0,"4.4.3-4.4.4":0.07883},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01489,"5.5":0},S:{"2.5":0.00752,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":50.52555},R:{_:"0"},M:{"0":0.15788},Q:{"13.1":0.00752},O:{"0":0.2105},H:{"0":30.3635}};
    +module.exports={C:{"34":0.00233,"43":0.00233,"47":0.0093,"52":0.05115,"57":0.00233,"65":0.00233,"66":0.00233,"68":0.00233,"72":0.00465,"78":0.00465,"88":0.00465,"91":0.00233,"102":0.00465,"103":0.00465,"107":0.0093,"108":0.00465,"109":0.00465,"110":0.00233,"111":0.00233,"112":0.00233,"113":0.00465,"114":0.00698,"115":0.26505,"116":0.00465,"117":0.00465,"118":0.04185,"119":0.71145,"120":0.24645,"121":0.01395,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 44 45 46 48 49 50 51 53 54 55 56 58 59 60 61 62 63 64 67 69 70 71 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 90 92 93 94 95 96 97 98 99 100 101 104 105 106 122 123 3.5 3.6"},D:{"11":0.00465,"38":0.00233,"43":0.00233,"49":0.00698,"50":0.00465,"51":0.00465,"53":0.00233,"54":0.00465,"56":0.00698,"58":0.00233,"59":0.00233,"60":0.00233,"63":0.00233,"64":0.00233,"65":0.00465,"66":0.01628,"68":0.00233,"69":0.00698,"70":0.00465,"72":0.00465,"73":0.02325,"74":0.00465,"75":0.00465,"76":0.00698,"77":0.00465,"78":0.00465,"79":0.0372,"80":0.00698,"81":0.00465,"83":0.0558,"84":0.00233,"85":0.00465,"86":0.00465,"87":0.02093,"88":0.01628,"89":0.00698,"90":0.00233,"91":0.0093,"92":0.01163,"93":0.03488,"94":0.00465,"95":0.01395,"96":0.00698,"97":0.00698,"98":0.01395,"99":0.00698,"100":0.00465,"101":0.00698,"102":0.0093,"103":0.05348,"104":0.00698,"105":0.00698,"106":0.02558,"107":0.03023,"108":0.76725,"109":1.3764,"110":0.02093,"111":0.0465,"112":0.02325,"113":0.0186,"114":0.08835,"115":0.05115,"116":0.15578,"117":0.23948,"118":2.49473,"119":8.83733,"120":0.0186,"121":0.00465,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 44 45 46 47 48 52 55 57 61 62 67 71 122"},F:{"28":0.00233,"46":0.00698,"72":0.00233,"74":0.00233,"77":0.01163,"79":0.00233,"81":0.00233,"84":0.00233,"85":0.00233,"92":0.00465,"95":0.02325,"101":0.00465,"102":0.05115,"103":0.093,"104":0.2511,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 73 75 76 78 80 82 83 86 87 88 89 90 91 93 94 96 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00465,"13":0.00233,"14":0.00233,"15":0.00233,"16":0.00465,"17":0.00233,"18":0.01628,"84":0.00233,"89":0.00233,"90":0.00233,"92":0.0186,"100":0.00233,"104":0.00233,"106":0.00465,"107":0.00233,"108":0.0093,"109":0.0186,"110":0.00233,"111":0.00465,"112":0.00233,"113":0.00233,"114":0.00698,"115":0.0093,"116":0.01163,"117":0.02325,"118":0.26738,"119":1.22295,_:"79 80 81 83 85 86 87 88 91 93 94 95 96 97 98 99 101 102 103 105"},E:{"14":0.00465,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 6.1 7.1 9.1 10.1","5.1":0.0093,"11.1":0.00233,"12.1":0.00233,"13.1":0.01163,"14.1":0.01395,"15.1":0.00233,"15.2-15.3":0.00233,"15.4":0.00233,"15.5":0.00465,"15.6":0.04418,"16.0":0.00233,"16.1":0.01395,"16.2":0.00465,"16.3":0.01395,"16.4":0.01163,"16.5":0.01628,"16.6":0.05348,"17.0":0.0372,"17.1":0.06278,"17.2":0.00465},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00031,"5.0-5.1":0.00031,"6.0-6.1":0.00077,"7.0-7.1":0.00107,"8.1-8.4":0.00015,"9.0-9.2":0.00123,"9.3":0.00384,"10.0-10.2":0.00031,"10.3":0.00553,"11.0-11.2":0.00261,"11.3-11.4":0.0023,"12.0-12.1":0.00138,"12.2-12.5":0.02518,"13.0-13.1":0.00061,"13.2":0.00261,"13.3":0.00154,"13.4-13.7":0.00445,"14.0-14.4":0.01182,"14.5-14.8":0.01919,"15.0-15.1":0.00752,"15.2-15.3":0.00921,"15.4":0.01029,"15.5":0.01443,"15.6-15.7":0.07584,"16.0":0.03562,"16.1":0.07139,"16.2":0.03423,"16.3":0.06417,"16.4":0.0132,"16.5":0.03408,"16.6-16.7":0.5777,"17.0":0.17302,"17.1":0.29061,"17.2":0.00829},P:{"4":0.15075,"20":0.0201,"21":0.03015,"22":0.1206,"23":0.4221,"5.0-5.4":0.01005,_:"6.2-6.4 8.2 9.2 12.0 14.0 15.0","7.2-7.4":0.07035,"10.1":0.01005,"11.1-11.2":0.0603,"13.0":0.01005,"16.0":0.01005,"17.0":0.01005,"18.0":0.01005,"19.0":0.0402},I:{"0":0.04583,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00014},K:{"0":24.87567,_:"10 11 12 11.1 11.5 12.1"},A:{"10":0.00254,"11":0.02536,_:"6 7 8 9 5.5"},N:{_:"10 11"},S:{"2.5":0.00768,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.1919},H:{"0":8.3},L:{"0":44.87445},R:{_:"0"},M:{"0":0.16887},Q:{"13.1":0.00768}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KG.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KG.js
    index 94adf889918037..68a795b5edce09 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KG.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KG.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00661,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.03966,"68":0.05949,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.10576,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0.00331,"98":0,"99":0,"100":0,"101":0,"102":0.01983,"103":0,"104":0,"105":0,"106":0,"107":0.00661,"108":0.195,"109":0,"110":0,"111":0,"112":0,"113":0.00331,"114":0.00331,"115":0.04627,"116":0.00992,"117":0.08593,"118":0.00661,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.01322,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.00331,"64":0,"65":0,"66":0,"67":0,"68":0.00331,"69":0,"70":0.00331,"71":0.01983,"72":0,"73":0,"74":0.00331,"75":0.10246,"76":0,"77":0.13551,"78":0,"79":0.23796,"80":0.14542,"81":0.00661,"83":0.00661,"84":0.01983,"85":0.00331,"86":0.01983,"87":0.31728,"88":0.15203,"89":0.00331,"90":0.09585,"91":0.25118,"92":0.01983,"93":0.06941,"94":0.00992,"95":0.18839,"96":0.00331,"97":0.00331,"98":0.05288,"99":0.1983,"100":0.00331,"101":0.00331,"102":0.18178,"103":0.00661,"104":0.00331,"105":0.00992,"106":0.50897,"107":0.00661,"108":0.01322,"109":0.80642,"110":0.00661,"111":0.00992,"112":0.25118,"113":0.01653,"114":0.18508,"115":0.0628,"116":1.96648,"117":0.47592,"118":0.00331,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0.00331,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0.00992,"63":0,"64":0,"65":0.0661,"66":0,"67":0,"68":0,"69":0.00331,"70":0,"71":0,"72":0.07932,"73":0,"74":0,"75":0.00331,"76":0,"77":0.00661,"78":0.00992,"79":0.00331,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.03966,"86":0.00992,"87":0,"88":0,"89":0,"90":0.00331,"91":0,"92":0,"93":0,"94":0,"95":0.07602,"96":0,"97":0,"98":0,"99":0.00331,"100":0.01983,"101":0.11237,"102":0.09915,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0.00661,"15":0.00331,"16":0,"17":0,"18":0.00331,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.08924,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00661,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0.10907,"106":0,"107":0,"108":0,"109":0.00331,"110":0,"111":0.00331,"112":0.00661,"113":0.0661,"114":0.01322,"115":0.00331,"116":0.26771,"117":0.08924},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00331,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.07932,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00331,"14.1":0.00992,"15.1":0.00331,"15.2-15.3":0.00331,"15.4":0.00331,"15.5":0.00661,"15.6":0.01653,"16.0":0.00661,"16.1":0.01653,"16.2":0.00331,"16.3":0.00992,"16.4":0.00661,"16.5":0.01983,"16.6":0.07271,"17.0":0.00661,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.00614,"10.0-10.2":0,"10.3":0.00614,"11.0-11.2":0.00307,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0.15971,"13.0-13.1":0,"13.2":0.00307,"13.3":15.31396,"13.4-13.7":0.01229,"14.0-14.4":0.15357,"14.5-14.8":0.24571,"15.0-15.1":0.1075,"15.2-15.3":0.14436,"15.4":0.129,"15.5":0.32557,"15.6-15.7":1.32684,"16.0":1.14563,"16.1":1.21934,"16.2":0.67878,"16.3":1.24084,"16.4":1.07499,"16.5":1.21627,"16.6":5.29201,"17.0":0.81699,"17.1":0},P:{"4":0.09993,"20":0.10992,"21":0.15988,"22":0.94929,"5.0-5.4":0.00999,"6.2-6.4":0.01999,"7.2-7.4":0.19985,"8.2":0,"9.2":0.02998,"10.1":0,"11.1-11.2":0.02998,"12.0":0.01999,"13.0":0.02998,"14.0":0.01999,"15.0":0.01999,"16.0":0.09993,"17.0":0.02998,"18.0":0.03997,"19.0":0.1399},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.01057,"4.4":0,"4.4.3-4.4.4":0.00604},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.16856,"10":0,"11":0.00992,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":53.99212},R:{_:"0"},M:{"0":0.04687},Q:{"13.1":0.0067},O:{"0":0.44857},H:{"0":0.29157}};
    +module.exports={C:{"52":0.01113,"68":0.00223,"78":0.00223,"90":0.04228,"91":0.00445,"94":0.02225,"95":0.00223,"102":0.00445,"104":0.00668,"108":0.00223,"110":0.00223,"111":0.00223,"112":0.00445,"113":0.00445,"115":0.2937,"116":0.00668,"117":0.01558,"118":0.01335,"119":0.26923,"120":0.08455,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 92 93 96 97 98 99 100 101 103 105 106 107 109 114 121 122 123 3.5 3.6"},D:{"34":0.00223,"36":0.00223,"38":0.00223,"39":0.00223,"40":0.00223,"46":0.00223,"47":0.00223,"49":0.02225,"50":0.00223,"51":0.00223,"53":0.00223,"54":0.00223,"55":0.0089,"57":0.00223,"58":0.00223,"59":0.00223,"60":0.00223,"61":0.00223,"62":0.00223,"63":0.0089,"64":0.00223,"68":0.00223,"69":0.00223,"70":0.01113,"71":0.00668,"74":0.00223,"75":0.00223,"77":0.00223,"78":0.00223,"79":0.02225,"80":0.00223,"81":0.01113,"83":0.0089,"84":0.0267,"85":0.01113,"86":0.01335,"87":0.00668,"88":0.0089,"89":0.0089,"90":0.00445,"92":0.00223,"93":0.00223,"94":0.00445,"96":0.00445,"97":0.00668,"98":0.01558,"99":0.02893,"100":0.01558,"101":0.01335,"102":0.0178,"103":0.02893,"104":0.00223,"105":0.0178,"106":0.04228,"107":0.01335,"108":0.03783,"109":2.31178,"110":0.0089,"111":0.02893,"112":0.0356,"113":0.02893,"114":0.1335,"115":0.04228,"116":0.13128,"117":0.34488,"118":2.02253,"119":9.31608,"120":0.00445,"121":0.00223,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 37 41 42 43 44 45 48 52 56 65 66 67 72 73 76 91 95 122"},F:{"36":0.00223,"42":0.00223,"79":0.04005,"85":0.04895,"86":0.00223,"87":0.00223,"92":0.02448,"95":0.356,"96":0.00223,"99":0.04005,"101":0.00668,"102":0.22918,"103":0.15798,"104":0.6764,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 38 39 40 41 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 88 89 90 91 93 94 97 98 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"15":0.00223,"17":0.00223,"18":0.0089,"89":0.00223,"90":0.00223,"92":0.0089,"97":0.00223,"100":0.00223,"106":0.00445,"108":0.00223,"109":0.00668,"110":0.00445,"112":0.01113,"113":0.00445,"114":0.00445,"116":0.03338,"117":0.0178,"118":0.15575,"119":0.90558,_:"12 13 14 16 79 80 81 83 84 85 86 87 88 91 93 94 95 96 98 99 101 102 103 104 105 107 111 115"},E:{"14":0.0089,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1 12.1","5.1":0.26255,"13.1":0.01558,"14.1":0.02893,"15.1":0.00445,"15.2-15.3":0.00223,"15.4":0.00668,"15.5":0.00445,"15.6":0.0534,"16.0":0.0178,"16.1":0.03115,"16.2":0.0178,"16.3":0.0356,"16.4":0.04228,"16.5":0.0445,"16.6":0.28703,"17.0":0.1513,"17.1":0.13573,"17.2":0.00223},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00268,"5.0-5.1":0.00268,"6.0-6.1":0.0067,"7.0-7.1":0.00938,"8.1-8.4":0.00134,"9.0-9.2":0.01072,"9.3":0.03351,"10.0-10.2":0.00268,"10.3":0.04825,"11.0-11.2":0.02279,"11.3-11.4":0.02011,"12.0-12.1":0.01206,"12.2-12.5":0.21983,"13.0-13.1":0.00536,"13.2":0.02279,"13.3":0.0134,"13.4-13.7":0.03887,"14.0-14.4":0.10321,"14.5-14.8":0.16755,"15.0-15.1":0.06568,"15.2-15.3":0.08042,"15.4":0.08981,"15.5":0.126,"15.6-15.7":0.66216,"16.0":0.31098,"16.1":0.62329,"16.2":0.29891,"16.3":0.56029,"16.4":0.11528,"16.5":0.29757,"16.6-16.7":5.04396,"17.0":1.51064,"17.1":2.5374,"17.2":0.07238},P:{"4":0.13205,"20":0.11173,"21":0.17268,"22":0.45709,"23":0.97514,"5.0-5.4":0.01016,"6.2-6.4":0.02032,"7.2-7.4":0.17268,"8.2":0.01016,"9.2":0.02032,_:"10.1","11.1-11.2":0.02032,"12.0":0.01016,"13.0":0.02032,"14.0":0.09142,"15.0":0.02032,"16.0":0.06095,"17.0":0.03047,"18.0":0.04063,"19.0":0.14221},I:{"0":0.01547,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00005},K:{"0":0.62978,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.02893,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.622},H:{"0":0},L:{"0":59.58973},R:{_:"0"},M:{"0":0.0622},Q:{"13.1":0.00778}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KH.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KH.js
    index 64b671d41953ff..4ce77a8959d6a2 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KH.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KH.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0.00381,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0.01142,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0.00381,"51":0.00381,"52":0.01142,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0.00381,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.01522,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00381,"100":0,"101":0,"102":0.00381,"103":0,"104":0.00381,"105":0.00761,"106":0,"107":0.00381,"108":0.03044,"109":0.00381,"110":0.05708,"111":0.00761,"112":0.03805,"113":0.00381,"114":0.00381,"115":0.05327,"116":0.03044,"117":0.42616,"118":0.04566,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00761,"39":0,"40":0,"41":0.01142,"42":0,"43":0.00381,"44":0.00381,"45":0.00381,"46":0,"47":0.00381,"48":0.00381,"49":0.00381,"50":0,"51":0.00381,"52":0,"53":0,"54":0,"55":0,"56":0.02283,"57":0.00381,"58":0,"59":0,"60":0.00381,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00381,"69":0.00381,"70":0.01142,"71":0.01142,"72":0.00381,"73":0,"74":0,"75":0,"76":0.00381,"77":0,"78":0.00381,"79":0.02283,"80":0.00381,"81":0,"83":0.00381,"84":0.00381,"85":0,"86":0.00761,"87":0.01522,"88":0.00381,"89":0,"90":0.00381,"91":0.00761,"92":0.00381,"93":0,"94":0.01142,"95":0.00381,"96":0.00381,"97":0.01142,"98":0.01142,"99":0.04186,"100":0.00381,"101":0.00761,"102":0.01142,"103":0.0723,"104":0.01142,"105":0.02664,"106":0.04947,"107":0.09893,"108":0.11796,"109":0.33104,"110":0.06849,"111":0.06849,"112":0.14459,"113":0.04566,"114":0.11415,"115":0.23591,"116":6.33913,"117":1.49537,"118":0.01903,"119":0.00761,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00381,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0.00381,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0.00381,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0.00381,"72":0.01522,"73":0.00381,"74":0,"75":0,"76":0.00381,"77":0.01522,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.01142,"92":0.00761,"93":0,"94":0.00761,"95":0.00381,"96":0.03044,"97":0.00381,"98":0,"99":0,"100":0.01522,"101":0.14459,"102":0.14079,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00381,"13":0,"14":0.00381,"15":0,"16":0,"17":0,"18":0.00381,"79":0,"80":0,"81":0,"83":0,"84":0.00381,"85":0,"86":0,"87":0,"88":0,"89":0.01903,"90":0,"91":0,"92":0.01142,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.00381,"104":0,"105":0,"106":0.01142,"107":0.02664,"108":0.00761,"109":0.00761,"110":0.01142,"111":0.01142,"112":0.00761,"113":0.00381,"114":0.01142,"115":0.01522,"116":0.36148,"117":0.27777},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00381,"10":0.00381,"11":0,"12":0,"13":0.00381,"14":0.01142,"15":0.00381,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00381,"13.1":0.01142,"14.1":0.01903,"15.1":0.00761,"15.2-15.3":0.00761,"15.4":0.00761,"15.5":0.01522,"15.6":0.10654,"16.0":0.01522,"16.1":0.02664,"16.2":0.02283,"16.3":0.06469,"16.4":0.01522,"16.5":0.04947,"16.6":0.32343,"17.0":0.02283,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.01316,"8.1-8.4":0.00658,"9.0-9.2":0.00329,"9.3":0.0724,"10.0-10.2":0.02962,"10.3":0.05595,"11.0-11.2":0.0362,"11.3-11.4":0.0362,"12.0-12.1":0.03291,"12.2-12.5":1.27696,"13.0-13.1":0.01316,"13.2":0.01975,"13.3":0.12835,"13.4-13.7":0.13165,"14.0-14.4":0.63519,"14.5-14.8":1.09924,"15.0-15.1":0.45089,"15.2-15.3":0.32911,"15.4":0.35544,"15.5":0.59899,"15.6-15.7":3.85721,"16.0":1.60607,"16.1":1.88253,"16.2":0.83924,"16.3":2.25772,"16.4":0.57266,"16.5":1.60607,"16.6":13.49365,"17.0":1.16177,"17.1":0},P:{"4":0.07185,"20":0.05132,"21":0.08211,"22":1.34457,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.01026,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0.01026,"13.0":0.01026,"14.0":0,"15.0":0,"16.0":0.03079,"17.0":0.01026,"18.0":0.02053,"19.0":0.07185},I:{"0":0,"3":0,"4":0.01583,"2.1":0,"2.2":0.00791,"2.3":0.01187,"4.1":0.01583,"4.2-4.3":0.03166,"4.4":0,"4.4.3-4.4.4":0.0831},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01962,"9":0.00392,"10":0.00392,"11":1.34613,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":48.75766},R:{_:"0"},M:{"0":0.19824},Q:{"13.1":0.03098},O:{"0":0.78677},H:{"0":0.41055}};
    +module.exports={C:{"3":0.00323,"4":0.00969,"38":0.00323,"39":0.00323,"40":0.00323,"50":0.00646,"51":0.01616,"52":0.02585,"68":0.00323,"72":0.00323,"78":0.03554,"79":0.00323,"80":0.00969,"81":0.00969,"88":0.00323,"99":0.00323,"101":0.00323,"102":0.01616,"103":0.00323,"104":0.00969,"105":0.01939,"106":0.00323,"107":0.01616,"108":0.01939,"109":0.00646,"110":0.00323,"111":0.02585,"112":0.08724,"114":0.00646,"115":0.11955,"116":0.00323,"117":0.01616,"118":0.02908,"119":0.8336,"120":0.2294,"121":0.00646,_:"2 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 41 42 43 44 45 46 47 48 49 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 73 74 75 76 77 82 83 84 85 86 87 89 90 91 92 93 94 95 96 97 98 100 113 122 123 3.5","3.6":0.00323},D:{"29":0.00323,"37":0.00323,"38":0.01616,"40":0.00323,"41":0.01939,"42":0.00323,"43":0.00646,"44":0.00646,"45":0.00323,"46":0.00323,"47":0.00646,"48":0.01616,"49":0.00323,"51":0.00646,"53":0.00323,"55":0.00323,"56":0.0937,"57":0.00969,"58":0.00969,"69":0.00323,"70":0.00646,"71":0.00646,"72":0.01292,"74":0.00323,"75":0.00323,"77":0.00323,"78":0.02908,"79":0.042,"80":0.04523,"81":0.00323,"83":0.01292,"84":0.02585,"85":0.05493,"86":0.0517,"87":0.01939,"88":0.00969,"89":0.00323,"90":0.00646,"91":0.00969,"92":0.00646,"93":0.00323,"94":0.03231,"95":0.00646,"96":0.00646,"97":0.00323,"98":0.02585,"99":0.03877,"100":0.02585,"101":0.00969,"102":0.01939,"103":0.07108,"104":0.03877,"105":0.10016,"106":0.12924,"107":0.17124,"108":0.28756,"109":0.9693,"110":0.1357,"111":0.07108,"112":0.17124,"113":0.02585,"114":0.0937,"115":0.07108,"116":0.31018,"117":0.40388,"118":3.86105,"119":14.44903,"120":0.01939,"121":0.01939,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 30 31 32 33 34 35 36 39 50 52 54 59 60 61 62 63 64 65 66 67 68 73 76 122"},F:{"28":0.00646,"40":0.00323,"44":0.00969,"70":0.00646,"71":0.00323,"90":0.00323,"91":0.00969,"92":0.00646,"94":0.01939,"95":0.00646,"102":0.16155,"103":0.12924,"104":0.48465,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 41 42 43 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 93 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.00323},B:{"12":0.00646,"14":0.00969,"18":0.00969,"84":0.00969,"85":0.00969,"89":0.00323,"92":0.02908,"99":0.00323,"100":0.00323,"104":0.01616,"106":0.03554,"107":0.042,"108":0.03877,"109":0.05816,"110":0.00646,"111":0.01616,"112":0.01292,"113":0.00323,"114":0.00646,"115":0.01939,"116":0.00969,"117":0.02585,"118":0.2714,"119":1.44749,_:"13 15 16 17 79 80 81 83 86 87 88 90 91 93 94 95 96 97 98 101 102 103 105"},E:{"4":0.00323,"9":0.00969,"10":0.01292,"13":0.01616,"14":0.02585,"15":0.00646,_:"0 5 6 7 8 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1","11.1":0.00323,"12.1":0.00646,"13.1":0.02585,"14.1":0.08078,"15.1":0.01616,"15.2-15.3":0.02262,"15.4":0.02262,"15.5":0.04847,"15.6":0.27464,"16.0":0.03877,"16.1":0.06139,"16.2":0.04847,"16.3":0.10985,"16.4":0.02585,"16.5":0.07754,"16.6":0.56543,"17.0":0.24556,"17.1":0.31341,"17.2":0.01292},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.0047,"5.0-5.1":0.0047,"6.0-6.1":0.01174,"7.0-7.1":0.01643,"8.1-8.4":0.00235,"9.0-9.2":0.01878,"9.3":0.0587,"10.0-10.2":0.0047,"10.3":0.08452,"11.0-11.2":0.03991,"11.3-11.4":0.03522,"12.0-12.1":0.02113,"12.2-12.5":0.38504,"13.0-13.1":0.00939,"13.2":0.03991,"13.3":0.02348,"13.4-13.7":0.06809,"14.0-14.4":0.18078,"14.5-14.8":0.29348,"15.0-15.1":0.11504,"15.2-15.3":0.14087,"15.4":0.1573,"15.5":0.2207,"15.6-15.7":1.15982,"16.0":0.54469,"16.1":1.09174,"16.2":0.52356,"16.3":0.98139,"16.4":0.20191,"16.5":0.52122,"16.6-16.7":8.83484,"17.0":2.64599,"17.1":4.44442,"17.2":0.12678},P:{"4":0.08374,"20":0.04187,"21":0.05234,"22":0.24075,"23":1.1514,"5.0-5.4":0.02093,_:"6.2-6.4 8.2 9.2 10.1 11.1-11.2 14.0 15.0 16.0","7.2-7.4":0.01047,"12.0":0.01047,"13.0":0.01047,"17.0":0.01047,"18.0":0.01047,"19.0":0.04187},I:{"0":0.12121,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00009,"4.4":0,"4.4.3-4.4.4":0.00037},K:{"0":0.68357,_:"10 11 12 11.1 11.5 12.1"},A:{"6":0.00342,"7":0.00342,"8":0.08219,"9":0.0137,"10":0.02055,"11":1.81836,_:"5.5"},N:{_:"10 11"},S:{"2.5":0.00677,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.8663},H:{"0":0},L:{"0":41.3726},R:{_:"0"},M:{"0":0.15566},Q:{"13.1":0.04738}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KI.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KI.js
    index 59663ec072609f..45d301fdeb9344 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KI.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KI.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0.0098,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0.0049,"106":0,"107":0,"108":0,"109":0,"110":0.00735,"111":0.0049,"112":0,"113":0.00245,"114":0,"115":0.02449,"116":0.00245,"117":0.06857,"118":0.00245,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.01225,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.0049,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.00245,"64":0.0049,"65":0,"66":0,"67":0,"68":0,"69":0.00245,"70":0,"71":0,"72":0,"73":0,"74":0.0049,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0.00245,"86":0,"87":0.0049,"88":0.03918,"89":0,"90":0,"91":0,"92":0.02939,"93":0,"94":0,"95":0,"96":0.0098,"97":0,"98":0,"99":0.00735,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0.02204,"106":0.00735,"107":0.00735,"108":0.00245,"109":0.08327,"110":0,"111":0,"112":0.04408,"113":0.0049,"114":0.09551,"115":0.09061,"116":1.51103,"117":0.28164,"118":0.00245,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.00245,"64":0,"65":0.0098,"66":0,"67":0.00245,"68":0.01714,"69":0.01959,"70":0.0049,"71":0,"72":0.06612,"73":0.00735,"74":0.03429,"75":0,"76":0.00245,"77":0.05878,"78":0.00245,"79":0.00245,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0.0049,"97":0,"98":0,"99":0,"100":0.00735,"101":0.01714,"102":0.01469,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00245,"13":0.00245,"14":0.0049,"15":0,"16":0.00735,"17":0,"18":0.00245,"79":0,"80":0.0098,"81":0,"83":0,"84":0.00735,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.01469,"91":0,"92":0.0098,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.0049,"100":0.00245,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.0049,"109":0.03918,"110":0.0098,"111":0.00245,"112":0.0049,"113":0.06612,"114":0.03674,"115":0.06367,"116":0.40653,"117":0.28898},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00245,"13.1":0,"14.1":0.00245,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.00245,"15.6":0.0049,"16.0":0,"16.1":0.00245,"16.2":0,"16.3":0.00245,"16.4":0,"16.5":0,"16.6":0.00245,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0.03708,"9.3":0.02475,"10.0-10.2":0,"10.3":0,"11.0-11.2":0.01234,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0.00409,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0.03708,"14.0-14.4":0,"14.5-14.8":0,"15.0-15.1":0.00825,"15.2-15.3":0.00825,"15.4":0.03708,"15.5":0.01234,"15.6-15.7":0.00825,"16.0":0.02059,"16.1":0.033,"16.2":0.03708,"16.3":0.08658,"16.4":0.05774,"16.5":0.09891,"16.6":0.18965,"17.0":0.00409,"17.1":0},P:{"4":0.05181,"20":0.17617,"21":0.33161,"22":0.71504,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.48706,"8.2":0,"9.2":0.03109,"10.1":0.03109,"11.1-11.2":0.01036,"12.0":0,"13.0":0.01036,"14.0":0.03109,"15.0":0,"16.0":0.17617,"17.0":0.03109,"18.0":0.19689,"19.0":0.19689},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.2149},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0.00755,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":86.01977},R:{_:"0"},M:{"0":0.10571},Q:{"13.1":0},O:{"0":1.83489},H:{"0":2.6808}};
    +module.exports={C:{"54":0.2093,"98":0.115,"105":0.0391,"115":0.1334,"116":0.0759,"119":0.1725,"120":0.0759,"121":0.0391,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 99 100 101 102 103 104 106 107 108 109 110 111 112 113 114 117 118 122 123 3.5 3.6"},D:{"90":0.115,"92":0.3611,"93":0.0391,"94":0.0184,"96":0.0184,"99":0.115,"103":0.0391,"109":0.2668,"116":0.0184,"117":0.4761,"118":1.8676,"119":7.6613,"120":0.4761,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 83 84 85 86 87 88 89 91 95 97 98 100 101 102 104 105 106 107 108 110 111 112 113 114 115 121 122"},F:{"104":0.0575,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.0575,"14":0.3059,"84":0.0391,"89":0.0391,"92":0.0184,"101":0.0759,"110":0.0184,"111":0.3059,"113":0.1518,"114":0.0759,"115":0.2093,"116":0.115,"117":0.4577,"118":0.6486,"119":1.5065,_:"13 15 16 17 18 79 80 81 83 85 86 87 88 90 91 93 94 95 96 97 98 99 100 102 103 104 105 106 107 108 109 112"},E:{_:"0 4 5 6 7 8 9 10 11 12 13 14 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 13.1 14.1 15.1 15.2-15.3 15.4 15.5 16.0 16.1 16.2 16.3 16.4 16.5 17.2","15.6":0.115,"16.6":0.0943,"17.0":0.2484,"17.1":0.0391},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00029,"5.0-5.1":0.00029,"6.0-6.1":0.00072,"7.0-7.1":0.00101,"8.1-8.4":0.00014,"9.0-9.2":0.00115,"9.3":0.0036,"10.0-10.2":0.00029,"10.3":0.00518,"11.0-11.2":0.00245,"11.3-11.4":0.00216,"12.0-12.1":0.0013,"12.2-12.5":0.02362,"13.0-13.1":0.00058,"13.2":0.00245,"13.3":0.00144,"13.4-13.7":0.00418,"14.0-14.4":0.01109,"14.5-14.8":0.018,"15.0-15.1":0.00706,"15.2-15.3":0.00864,"15.4":0.00965,"15.5":0.01354,"15.6-15.7":0.07114,"16.0":0.03341,"16.1":0.06696,"16.2":0.03211,"16.3":0.0602,"16.4":0.01238,"16.5":0.03197,"16.6-16.7":0.5419,"17.0":0.1623,"17.1":0.27261,"17.2":0.00778},P:{"4":0.02031,"20":0.15229,"21":0.10153,"22":0.1929,"23":0.25382,_:"5.0-5.4 6.2-6.4 8.2 12.0 13.0 14.0 15.0 17.0","7.2-7.4":0.51779,"9.2":0.04061,"10.1":0.02031,"11.1-11.2":0.3858,"16.0":0.46703,"18.0":0.10153,"19.0":0.23351},I:{"0":0.02299,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.00007},K:{"0":0.23103,_:"10 11 12 11.1 11.5 12.1"},A:{_:"6 7 8 9 10 11 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.54677},H:{"0":0},L:{"0":78.07666},R:{_:"0"},M:{_:"0"},Q:{"13.1":0.0231}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KM.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KM.js
    index fd02cc9b3502cf..0f9b6b1d1ea8e0 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KM.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KM.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00361,"67":0,"68":0.00181,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0.00181,"82":0,"83":0,"84":0.00181,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00181,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0.00723,"114":0.00542,"115":0.24033,"116":0.02349,"117":0.14456,"118":0.00904,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00181,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00904,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.00181,"68":0,"69":0,"70":0.00723,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.00181,"80":0.00361,"81":0.01084,"83":0.00181,"84":0.00181,"85":0.00361,"86":0,"87":0,"88":0,"89":0.01265,"90":0.00181,"91":0,"92":0.00723,"93":0,"94":0,"95":0.00181,"96":0,"97":0,"98":0.00181,"99":0.00181,"100":0,"101":0,"102":0,"103":0.00723,"104":0,"105":0,"106":0.00181,"107":0,"108":0.00361,"109":0.25479,"110":0.00181,"111":0,"112":0.03795,"113":0.00723,"114":0.00181,"115":0.03253,"116":0.9035,"117":0.20238,"118":0.00181,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00181,"29":0,"30":0,"31":0,"32":0,"33":0.00181,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00181,"66":0,"67":0,"68":0.00181,"69":0.0777,"70":0.00723,"71":0.00542,"72":0.0777,"73":0.00723,"74":0,"75":0,"76":0,"77":0.00542,"78":0,"79":0.00181,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00181,"96":0.00361,"97":0,"98":0,"99":0,"100":0.00723,"101":0.02349,"102":0.02711,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00181,"13":0.00181,"14":0,"15":0,"16":0.00181,"17":0,"18":0.00723,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0.00181,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00181,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00181,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00181,"110":0.04879,"111":0.00181,"112":0,"113":0.00181,"114":0.00181,"115":0.00904,"116":0.16082,"117":0.16444},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00542,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00361,"14.1":0,"15.1":0,"15.2-15.3":0.00542,"15.4":0,"15.5":0,"15.6":0.00542,"16.0":0,"16.1":0,"16.2":0,"16.3":0,"16.4":0,"16.5":0.03072,"16.6":0.01084,"17.0":0.00181,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.02964,"10.0-10.2":0,"10.3":0,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0.05709,"12.2-12.5":0.17237,"13.0-13.1":0.00769,"13.2":0.0022,"13.3":0,"13.4-13.7":0.01537,"14.0-14.4":1.78184,"14.5-14.8":3.00816,"15.0-15.1":0.18993,"15.2-15.3":0.06038,"15.4":0.08014,"15.5":0.01976,"15.6-15.7":1.34928,"16.0":0.18993,"16.1":0.22067,"16.2":0.44244,"16.3":0.97601,"16.4":0.46769,"16.5":1.12312,"16.6":0.59065,"17.0":0.1548,"17.1":0},P:{"4":0.51648,"20":0.04051,"21":0.55698,"22":2.80517,"5.0-5.4":0.01013,"6.2-6.4":0.04051,"7.2-7.4":0.1114,"8.2":0,"9.2":0.01013,"10.1":0,"11.1-11.2":0.39495,"12.0":0,"13.0":0,"14.0":0.02025,"15.0":0,"16.0":0.03038,"17.0":0.07089,"18.0":0.02025,"19.0":0.09114},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.02442,"4.4":0,"4.4.3-4.4.4":0.10786},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01807,"5.5":0},S:{"2.5":0.06554,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":78.27341},R:{_:"0"},M:{"0":0.13928},Q:{"13.1":0},O:{"0":0.47519},H:{"0":1.2876}};
    +module.exports={C:{"45":0.0019,"52":0.01333,"56":0.0019,"69":0.00381,"72":0.01142,"78":0.0019,"81":0.00381,"85":0.0019,"115":1.27758,"117":0.0019,"118":0.04189,"119":0.5255,"120":0.4303,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 49 50 51 53 54 55 57 58 59 60 61 62 63 64 65 66 67 68 70 71 73 74 75 76 77 79 80 82 83 84 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 116 121 122 123 3.5 3.6"},D:{"47":0.00571,"51":0.00381,"61":0.01333,"69":0.0019,"79":0.00952,"81":0.00381,"87":0.0019,"89":0.02285,"90":0.01714,"93":0.01142,"94":0.01333,"95":0.13899,"98":0.00571,"99":0.00952,"100":0.0019,"102":0.01523,"103":0.00381,"105":0.01904,"106":0.00381,"107":0.01523,"108":0.00381,"109":1.83355,"110":0.01333,"112":0.04379,"113":0.0019,"114":0.01714,"115":0.02666,"116":0.04379,"117":0.15042,"118":0.83205,"119":4.93707,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 48 49 50 52 53 54 55 56 57 58 59 60 62 63 64 65 66 67 68 70 71 72 73 74 75 76 77 78 80 83 84 85 86 88 91 92 96 97 101 104 111 120 121 122"},F:{"79":0.06093,"95":0.04189,"99":0.0019,"102":0.09901,"103":0.0952,"104":0.24942,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"13":0.01523,"15":0.00381,"17":0.00381,"18":0.02666,"84":0.02666,"85":0.01523,"90":0.00381,"92":0.00571,"93":0.0019,"95":0.01904,"99":0.01142,"103":0.00381,"107":0.05331,"108":0.0019,"109":0.00571,"113":0.00571,"115":0.00381,"116":0.0019,"117":0.00952,"118":0.50075,"119":1.27378,_:"12 14 16 79 80 81 83 86 87 88 89 91 94 96 97 98 100 101 102 104 105 106 110 111 112 114"},E:{"13":0.0019,"14":0.0019,_:"0 4 5 6 7 8 9 10 11 12 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1 14.1 15.1 15.2-15.3 15.4 15.6 16.0 16.2 16.5 16.6","5.1":0.01142,"12.1":0.00952,"13.1":0.01523,"15.5":0.0019,"16.1":0.0019,"16.3":0.00381,"16.4":0.0019,"17.0":0.01333,"17.1":0.1428,"17.2":0.0019},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00188,"5.0-5.1":0.00188,"6.0-6.1":0.00469,"7.0-7.1":0.00657,"8.1-8.4":0.00094,"9.0-9.2":0.00751,"9.3":0.02346,"10.0-10.2":0.00188,"10.3":0.03378,"11.0-11.2":0.01595,"11.3-11.4":0.01407,"12.0-12.1":0.00844,"12.2-12.5":0.15389,"13.0-13.1":0.00375,"13.2":0.01595,"13.3":0.00938,"13.4-13.7":0.02721,"14.0-14.4":0.07225,"14.5-14.8":0.11729,"15.0-15.1":0.04598,"15.2-15.3":0.0563,"15.4":0.06287,"15.5":0.0882,"15.6-15.7":0.46353,"16.0":0.21769,"16.1":0.43632,"16.2":0.20925,"16.3":0.39222,"16.4":0.0807,"16.5":0.20831,"16.6-16.7":3.53092,"17.0":1.05749,"17.1":1.77625,"17.2":0.05067},P:{"4":0.1308,"20":0.01006,"21":0.22136,"22":1.70044,"23":0.26161,"5.0-5.4":0.02012,_:"6.2-6.4 8.2 10.1 12.0 13.0 15.0 16.0","7.2-7.4":0.08049,"9.2":0.01006,"11.1-11.2":0.50309,"14.0":0.02012,"17.0":0.07043,"18.0":0.04025,"19.0":0.08049},I:{"0":0.03222,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.0001},K:{"0":0.50195,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.00381,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.29146},H:{"0":0},L:{"0":72.78085},R:{_:"0"},M:{"0":0.16192},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KN.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KN.js
    index c4ff6d2695df0c..19336adb692a5f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KN.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KN.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0.04164,"113":0,"114":0,"115":0.22382,"116":0.02082,"117":0.48407,"118":0.01562,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.02082,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.04685,"69":0.02603,"70":0.01562,"71":0.04164,"72":0.04164,"73":0.00521,"74":0.04164,"75":0.07808,"76":0.04685,"77":0.03644,"78":0.03644,"79":0.34353,"80":0.05205,"81":0.04685,"83":0.06767,"84":0.03123,"85":0.04685,"86":0.1041,"87":0.04685,"88":0.06767,"89":0.05205,"90":0.04685,"91":0.02082,"92":0,"93":0.01041,"94":0.00521,"95":0,"96":0,"97":0,"98":0,"99":0.00521,"100":0.00521,"101":0,"102":0,"103":0.03644,"104":0,"105":0.02082,"106":0,"107":0,"108":0.02082,"109":0.44243,"110":0.01041,"111":0,"112":0.04685,"113":0.02603,"114":0.13013,"115":0.3123,"116":8.4269,"117":2.12885,"118":0.00521,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00521,"50":0,"51":0,"52":0,"53":0,"54":0.00521,"55":0.00521,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.00521,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.0989,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00521,"101":0.09369,"102":0.24464,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0.00521,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0.00521,"81":0.00521,"83":0.01041,"84":0.01041,"85":0.01041,"86":0.00521,"87":0,"88":0,"89":0.00521,"90":0.00521,"91":0,"92":0.04685,"93":0,"94":0,"95":0,"96":0,"97":0.00521,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.00521,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.06246,"110":0.01562,"111":0.00521,"112":0,"113":0,"114":1.95708,"115":0.19259,"116":4.13277,"117":1.12949},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.01041,"15":0.01562,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.21861,"10.1":0,"11.1":0,"12.1":0.00521,"13.1":0,"14.1":0.03644,"15.1":0.00521,"15.2-15.3":0.03644,"15.4":0.00521,"15.5":0.01041,"15.6":0.53612,"16.0":0,"16.1":0.16136,"16.2":0.01041,"16.3":0.06246,"16.4":0.02082,"16.5":0.7235,"16.6":0.86403,"17.0":0.01041,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.02018,"10.0-10.2":0.01413,"10.3":0.28857,"11.0-11.2":0.00404,"11.3-11.4":0.00404,"12.0-12.1":0.00807,"12.2-12.5":0.45404,"13.0-13.1":0,"13.2":0,"13.3":0.01211,"13.4-13.7":0.02623,"14.0-14.4":0.06458,"14.5-14.8":0.08677,"15.0-15.1":0.05852,"15.2-15.3":0.01413,"15.4":0.02825,"15.5":0.11099,"15.6-15.7":0.94037,"16.0":0.32691,"16.1":0.72042,"16.2":0.14328,"16.3":1.02715,"16.4":0.3027,"16.5":0.73858,"16.6":13.09864,"17.0":1.27334,"17.1":0},P:{"4":0.27223,"20":0.05235,"21":0.08376,"22":2.03124,"5.0-5.4":0,"6.2-6.4":0.01047,"7.2-7.4":0.13611,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01047,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0.01047,"17.0":0,"18.0":0,"19.0":0.07329},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.33643,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.43255},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.06767,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":48.54735},R:{_:"0"},M:{"0":0.11508},Q:{"13.1":0},O:{"0":0},H:{"0":1.06227}};
    +module.exports={C:{"35":0.00563,"88":0.00563,"111":0.32642,"115":0.11819,"116":0.00563,"118":0.00563,"119":0.17447,"120":0.05628,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 112 113 114 117 121 122 123 3.5 3.6"},D:{"29":0.04502,"44":0.00563,"47":0.00563,"49":0.00563,"63":0.02251,"65":0.00563,"70":0.00563,"71":0.00563,"72":0.00563,"74":0.00563,"76":0.02251,"79":0.01126,"80":0.00563,"83":0.08442,"86":0.00563,"87":0.01126,"88":0.03377,"89":0.00563,"92":0.02251,"93":0.01126,"95":0.03377,"97":0.12944,"100":0.01688,"103":0.05628,"105":0.02251,"109":0.68099,"110":0.01126,"111":0.01126,"112":0.06191,"113":0.01126,"114":0.05065,"115":0.05628,"116":0.28703,"117":0.88922,"118":2.69018,"119":10.48496,"121":0.00563,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 30 31 32 33 34 35 36 37 38 39 40 41 42 43 45 46 48 50 51 52 53 54 55 56 57 58 59 60 61 62 64 66 67 68 69 73 75 77 78 81 84 85 90 91 94 96 98 99 101 102 104 106 107 108 120 122"},F:{"95":0.00563,"102":0.19135,"103":0.05628,"104":0.07879,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.01688},B:{"97":0.00563,"100":0.03377,"109":0.15196,"113":0.00563,"114":0.04502,"115":0.00563,"116":0.01688,"117":0.10693,"118":0.69224,"119":4.14221,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 98 99 101 102 103 104 105 106 107 108 110 111 112"},E:{"11":0.05065,"14":0.00563,"15":0.02814,_:"0 4 5 6 7 8 9 10 12 13 3.1 3.2 5.1 6.1 7.1 10.1 11.1 12.1 15.2-15.3 15.4 17.2","9.1":0.01126,"13.1":7.46273,"14.1":0.09005,"15.1":0.00563,"15.5":18.84817,"15.6":1.66589,"16.0":0.03377,"16.1":0.30391,"16.2":0.25326,"16.3":0.0394,"16.4":0.07316,"16.5":0.37708,"16.6":0.72601,"17.0":0.86671,"17.1":0.62471},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00236,"5.0-5.1":0.00236,"6.0-6.1":0.00589,"7.0-7.1":0.00825,"8.1-8.4":0.00118,"9.0-9.2":0.00943,"9.3":0.02946,"10.0-10.2":0.00236,"10.3":0.04242,"11.0-11.2":0.02003,"11.3-11.4":0.01767,"12.0-12.1":0.0106,"12.2-12.5":0.19323,"13.0-13.1":0.00471,"13.2":0.02003,"13.3":0.01178,"13.4-13.7":0.03417,"14.0-14.4":0.09073,"14.5-14.8":0.14728,"15.0-15.1":0.05773,"15.2-15.3":0.0707,"15.4":0.07894,"15.5":0.11076,"15.6-15.7":0.58206,"16.0":0.27335,"16.1":0.54789,"16.2":0.26275,"16.3":0.49251,"16.4":0.10133,"16.5":0.26157,"16.6-16.7":4.43377,"17.0":1.32789,"17.1":2.23043,"17.2":0.06363},P:{"4":0.05285,"20":0.11628,"21":0.3594,"22":0.23255,"23":2.07185,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 11.1-11.2 12.0 14.0 15.0 18.0","7.2-7.4":0.19027,"13.0":0.01057,"16.0":0.01057,"17.0":0.01057,"19.0":0.03171},I:{"0":0.18706,"3":0.00002,"4":0.00004,"2.1":0,"2.2":0.00004,"2.3":0,"4.1":0.00002,"4.2-4.3":0.00013,"4.4":0,"4.4.3-4.4.4":0.00056},K:{"0":1.00119,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.04502,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.00874,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.0306},H:{"0":0},L:{"0":29.57866},R:{_:"0"},M:{"0":0.17488},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KP.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KP.js
    index f7194d934d8aff..1345cda01ba7ef 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KP.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KP.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":1.28,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0.79886,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0.15887,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":1.11659,"102":0,"103":0,"104":0,"105":0,"106":0.48113,"107":0,"108":0,"109":0.64,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":9.74977,"117":0.31773,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.15887,"116":2.23773,"117":0},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0.15887,"16.0":0,"16.1":0,"16.2":0,"16.3":0,"16.4":0,"16.5":0,"16.6":3.03659,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0,"13.0-13.1":0,"13.2":0,"13.3":0.86515,"13.4-13.7":0.43257,"14.0-14.4":0,"14.5-14.8":0,"15.0-15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.43257,"15.6-15.7":6.04995,"16.0":1.29772,"16.1":2.59545,"16.2":5.61738,"16.3":1.7303,"16.4":0,"16.5":7.78025,"16.6":29.38462,"17.0":4.31965,"17.1":0},P:{"4":0,"20":0,"21":0,"22":0,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0,"17.0":0,"18.0":0,"19.0":0},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":7.00568},R:{_:"0"},M:{"0":0},Q:{"13.1":0},O:{"0":7.4488},H:{"0":0}};
    +module.exports={C:{"120":0.26568,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 121 122 123 3.5 3.6"},D:{"86":1.33578,"99":1.60515,"109":1.87083,"118":0.26568,"119":4.81176,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 83 84 85 87 88 89 90 91 92 93 94 95 96 97 98 100 101 102 103 104 105 106 107 108 110 111 112 113 114 115 116 117 120 121 122"},F:{_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"92":0.26568,"118":0.26568,"119":1.33578,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117"},E:{_:"0 4 5 6 7 8 9 10 11 12 13 14 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 13.1 14.1 15.1 15.2-15.3 15.4 15.5 16.0 16.1 16.4 17.0 17.2","15.6":2.40588,"16.2":0.53505,"16.3":0.80073,"16.5":0.26568,"16.6":5.08113,"17.1":6.15123},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00912,"5.0-5.1":0.00912,"6.0-6.1":0.02281,"7.0-7.1":0.03193,"8.1-8.4":0.00456,"9.0-9.2":0.03649,"9.3":0.11404,"10.0-10.2":0.00912,"10.3":0.16421,"11.0-11.2":0.07755,"11.3-11.4":0.06842,"12.0-12.1":0.04105,"12.2-12.5":0.74809,"13.0-13.1":0.01825,"13.2":0.07755,"13.3":0.04561,"13.4-13.7":0.13228,"14.0-14.4":0.35124,"14.5-14.8":0.57019,"15.0-15.1":0.22351,"15.2-15.3":0.27369,"15.4":0.30562,"15.5":0.42878,"15.6-15.7":2.25338,"16.0":1.05827,"16.1":2.1211,"16.2":1.01721,"16.3":1.90671,"16.4":0.39229,"16.5":1.01265,"16.6-16.7":17.16492,"17.0":5.14081,"17.1":8.63492,"17.2":0.24632},P:{_:"4 20 21 22 23 5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0"},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{"0":0,_:"10 11 12 11.1 11.5 12.1"},A:{_:"6 7 8 9 10 11 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{_:"0"},H:{"0":0},L:{"0":17.48501},R:{_:"0"},M:{_:"0"},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KR.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KR.js
    index 220ccd3e340fcc..33801e4aaeb21d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KR.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KR.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00393,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00393,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.01572,"116":0.00786,"117":0.1965,"118":0.01965,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0.00393,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00393,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00786,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.02751,"78":0,"79":0.00393,"80":0.00393,"81":0.01572,"83":0.00393,"84":0,"85":0.00393,"86":0.00786,"87":0.00786,"88":0,"89":0.00393,"90":0.02358,"91":0,"92":0,"93":0,"94":0.05502,"95":0.00393,"96":0,"97":0,"98":0.00393,"99":0.00393,"100":0.00786,"101":0.01179,"102":0.01179,"103":0.01179,"104":0.00786,"105":0.00786,"106":0.01179,"107":0.01179,"108":0.02358,"109":0.36156,"110":0.01179,"111":0.02358,"112":0.02751,"113":0.01965,"114":0.07074,"115":0.12969,"116":7.80891,"117":1.88247,"118":0.00393,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00393,"73":0,"74":0,"75":0,"76":0,"77":0.01572,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00393,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.02751,"102":0.02751,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00393,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00786,"108":0.00786,"109":0.03537,"110":0.00393,"111":0.00786,"112":0.00786,"113":0.00786,"114":0.02751,"115":0.03144,"116":1.21044,"117":0.97857},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00393,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00393,"14.1":0.00786,"15.1":0.01572,"15.2-15.3":0.00393,"15.4":0.00393,"15.5":0.00393,"15.6":0.01965,"16.0":0.00393,"16.1":0.00786,"16.2":0.00786,"16.3":0.02358,"16.4":0.00786,"16.5":0.02751,"16.6":0.20829,"17.0":0.02358,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.01049,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0.00419,"9.3":0.00419,"10.0-10.2":0,"10.3":0.00839,"11.0-11.2":0.01049,"11.3-11.4":0,"12.0-12.1":0.00419,"12.2-12.5":0.04824,"13.0-13.1":0.08599,"13.2":0.0797,"13.3":0.02727,"13.4-13.7":0.01678,"14.0-14.4":0.09858,"14.5-14.8":0.16779,"15.0-15.1":0.06082,"15.2-15.3":0.08599,"15.4":0.10906,"15.5":0.14053,"15.6-15.7":0.69843,"16.0":0.77813,"16.1":1.00884,"16.2":0.60195,"16.3":1.01304,"16.4":0.22442,"16.5":0.74667,"16.6":13.38134,"17.0":1.39476,"17.1":0.0021},P:{"4":0,"20":0.17196,"21":0.47542,"22":14.6875,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0.01012,"13.0":0.03035,"14.0":0.01012,"15.0":0.01012,"16.0":0.04046,"17.0":0.04046,"18.0":0.08092,"19.0":0.07081},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.19179},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.06288,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":33.98756},R:{_:"0"},M:{"0":0.13961},Q:{"13.1":0.00607},O:{"0":0.07284},H:{"0":0.23561}};
    +module.exports={C:{"52":0.00367,"78":0.00367,"101":0.00367,"102":0.00367,"107":0.00367,"109":0.00367,"111":0.00367,"115":0.05132,"116":0.00367,"118":0.00733,"119":0.41426,"120":0.11731,"121":0.00367,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 103 104 105 106 108 110 112 113 114 117 122 123 3.5 3.6"},D:{"41":0.00367,"42":0.011,"48":0.00367,"49":0.00367,"56":0.00367,"68":0.011,"70":0.00367,"75":0.00367,"77":0.06599,"79":0.00733,"80":0.00733,"81":0.01833,"83":0.00367,"84":0.00367,"85":0.00733,"86":0.022,"87":0.011,"89":0.00733,"90":0.05866,"94":0.13931,"95":0.02933,"96":0.00367,"97":0.01466,"98":0.00733,"99":0.00367,"100":0.022,"101":0.04033,"102":0.02933,"103":0.04033,"104":0.02566,"105":0.01466,"106":0.13564,"107":0.02933,"108":0.04399,"109":1.05947,"110":0.022,"111":0.11731,"112":0.02933,"113":0.02566,"114":0.08798,"115":0.04399,"116":0.1613,"117":0.21996,"118":4.35887,"119":19.51778,"120":0.01833,"121":0.00733,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 43 44 45 46 47 50 51 52 53 54 55 57 58 59 60 61 62 63 64 65 66 67 69 71 72 73 74 76 78 88 91 92 93 122"},F:{"92":0.00367,"95":0.00733,"102":0.02933,"103":0.02566,"104":0.09898,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"16":0.00367,"18":0.00367,"86":0.00367,"92":0.00733,"93":0.00367,"95":0.00367,"96":0.00367,"97":0.00367,"100":0.00367,"102":0.00367,"103":0.00367,"104":0.00367,"105":0.00367,"106":0.00367,"107":0.02566,"108":0.01466,"109":0.13564,"110":0.01466,"111":0.01833,"112":0.01466,"113":0.011,"114":0.04399,"115":0.022,"116":0.03299,"117":0.06965,"118":0.96049,"119":5.31203,_:"12 13 14 15 17 79 80 81 83 84 85 87 88 89 90 91 94 98 99 101"},E:{"8":0.00367,"14":0.00733,_:"0 4 5 6 7 9 10 11 12 13 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1","13.1":0.00733,"14.1":0.011,"15.1":0.00367,"15.2-15.3":0.00733,"15.4":0.011,"15.5":0.011,"15.6":0.05132,"16.0":0.00733,"16.1":0.04033,"16.2":0.022,"16.3":0.05499,"16.4":0.01466,"16.5":0.04033,"16.6":0.29328,"17.0":0.13198,"17.1":0.22363,"17.2":0.00733},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00269,"5.0-5.1":0.00269,"6.0-6.1":0.00672,"7.0-7.1":0.00941,"8.1-8.4":0.00134,"9.0-9.2":0.01076,"9.3":0.03362,"10.0-10.2":0.00269,"10.3":0.04841,"11.0-11.2":0.02286,"11.3-11.4":0.02017,"12.0-12.1":0.0121,"12.2-12.5":0.22053,"13.0-13.1":0.00538,"13.2":0.02286,"13.3":0.01345,"13.4-13.7":0.039,"14.0-14.4":0.10354,"14.5-14.8":0.16809,"15.0-15.1":0.06589,"15.2-15.3":0.08068,"15.4":0.0901,"15.5":0.1264,"15.6-15.7":0.66429,"16.0":0.31197,"16.1":0.62529,"16.2":0.29987,"16.3":0.56209,"16.4":0.11564,"16.5":0.29853,"16.6-16.7":5.06014,"17.0":1.51549,"17.1":2.54553,"17.2":0.07261},P:{"20":0.09155,"21":0.17293,"22":1.67841,"23":14.53608,_:"4 5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 12.0","10.1":0.01017,"11.1-11.2":0.01017,"13.0":0.01017,"14.0":0.01017,"15.0":0.01017,"16.0":0.02034,"17.0":0.03052,"18.0":0.07121,"19.0":0.05086},I:{"0":0.13865,"3":0.00001,"4":0.00003,"2.1":0,"2.2":0.00003,"2.3":0,"4.1":0.00001,"4.2-4.3":0.0001,"4.4":0,"4.4.3-4.4.4":0.00042},K:{"0":0.28503,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00471,"11":0.12726,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.06334},H:{"0":0},L:{"0":27.27759},R:{_:"0"},M:{"0":0.13301},Q:{"13.1":0.01267}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KW.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KW.js
    index 1b5a749c117f22..d5bc69db058ba8 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KW.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KW.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00295,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.0059,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0.0059,"115":0.01771,"116":0.00886,"117":0.16236,"118":0.01181,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00295,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00295,"48":0,"49":0.00886,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00295,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00295,"65":0,"66":0,"67":0,"68":0.00295,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0.00295,"76":0,"77":0,"78":0.00295,"79":0.0059,"80":0.00295,"81":0,"83":0,"84":0,"85":0,"86":0.0059,"87":0.0059,"88":0.00886,"89":0,"90":0.00886,"91":0,"92":0.00295,"93":0.00295,"94":0.00295,"95":0.00295,"96":0,"97":0,"98":0.00886,"99":0.00886,"100":0,"101":0.00295,"102":0.01181,"103":0.02362,"104":0.00295,"105":0.00295,"106":0.00886,"107":0.0059,"108":0.01181,"109":0.22435,"110":0.00295,"111":0.01181,"112":0.00886,"113":0.02066,"114":0.05609,"115":0.07675,"116":4.54608,"117":1.07748,"118":0.00295,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.0059,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.0059,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.0059,"68":0,"69":0.02362,"70":0.0059,"71":0.02657,"72":0.19188,"73":0.0797,"74":0.00295,"75":0,"76":0,"77":0.02952,"78":0.00295,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00886,"96":0,"97":0,"98":0,"99":0.0059,"100":0.01771,"101":0.0797,"102":0.14465,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00295,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00295,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0.00295,"105":0.00295,"106":0,"107":0,"108":0.00886,"109":0.0059,"110":0.00295,"111":0,"112":0.00295,"113":0.00295,"114":0.01771,"115":0.02066,"116":0.41918,"117":0.34834},E:{"4":0,"5":0,"6":0,"7":0.02362,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00295,"14":0.01476,"15":0.0059,_:"0","3.1":0,"3.2":0,"5.1":0.00295,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.01181,"14.1":0.07675,"15.1":0.00886,"15.2-15.3":0.00295,"15.4":0.01771,"15.5":0.01771,"15.6":0.05609,"16.0":0.0059,"16.1":0.03247,"16.2":0.01476,"16.3":0.03542,"16.4":0.01771,"16.5":0.04133,"16.6":0.28634,"17.0":0.02657,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00656,"8.1-8.4":0,"9.0-9.2":0.00984,"9.3":0.04922,"10.0-10.2":0,"10.3":0.06235,"11.0-11.2":0.00656,"11.3-11.4":0.01969,"12.0-12.1":0.01313,"12.2-12.5":0.34129,"13.0-13.1":0.05907,"13.2":0.05579,"13.3":0.0361,"13.4-13.7":0.10173,"14.0-14.4":0.40692,"14.5-14.8":0.70883,"15.0-15.1":0.21002,"15.2-15.3":0.26909,"15.4":0.26253,"15.5":0.46927,"15.6-15.7":2.47105,"16.0":1.12559,"16.1":1.54564,"16.2":0.97464,"16.3":1.71956,"16.4":0.52834,"16.5":2.10679,"16.6":16.38505,"17.0":2.52683,"17.1":0.00656},P:{"4":0.0509,"20":0.18325,"21":0.47848,"22":3.66496,"5.0-5.4":0.01018,"6.2-6.4":0,"7.2-7.4":0.13235,"8.2":0,"9.2":0.01018,"10.1":0,"11.1-11.2":0.06108,"12.0":0.02036,"13.0":0.04072,"14.0":0.04072,"15.0":0.03054,"16.0":0.08144,"17.0":0.04072,"18.0":0.0509,"19.0":0.14253},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.08066},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00886,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":46.91831},R:{_:"0"},M:{"0":0.11277},Q:{"13.1":0.00705},O:{"0":2.18488},H:{"0":1.76824}};
    +module.exports={C:{"34":0.00283,"48":0.00283,"68":0.00283,"78":0.00283,"88":0.01131,"102":0.00283,"110":0.00283,"112":0.00283,"115":0.07918,"116":0.00283,"117":0.00283,"118":0.00848,"119":0.38461,"120":0.07918,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 90 91 92 93 94 95 96 97 98 99 100 101 103 104 105 106 107 108 109 111 113 114 121 122 123 3.5 3.6"},D:{"34":0.00283,"38":0.00848,"47":0.00283,"49":0.00283,"56":0.00848,"58":0.01131,"64":0.00283,"66":0.00283,"68":0.00283,"75":0.01131,"78":0.00848,"79":0.03394,"80":0.00283,"83":0.00566,"84":0.00283,"85":0.00283,"86":0.00848,"87":0.01131,"88":0.00848,"89":0.00566,"90":0.02262,"91":0.00283,"92":0.00566,"93":0.02262,"94":0.00848,"95":0.00283,"96":0.00566,"97":0.00283,"98":0.00566,"99":0.0198,"100":0.00283,"101":0.01697,"102":0.00566,"103":0.07918,"104":0.01131,"105":0.01697,"106":0.01131,"107":0.04525,"108":0.01131,"109":0.76922,"110":0.00848,"111":0.01414,"112":0.01697,"113":0.01697,"114":0.07636,"115":0.03111,"116":1.00394,"117":0.2319,"118":2.91567,"119":15.38149,"120":0.00566,"121":0.00566,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 39 40 41 42 43 44 45 46 48 50 51 52 53 54 55 57 59 60 61 62 63 65 67 69 70 71 72 73 74 76 77 81 122"},F:{"28":0.00848,"46":0.01697,"74":0.00566,"89":0.00566,"95":0.01131,"98":0.00283,"101":0.00566,"102":0.38744,"103":0.05656,"104":0.32239,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 75 76 77 78 79 80 81 82 83 84 85 86 87 88 90 91 92 93 94 96 97 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"17":0.00283,"18":0.00566,"92":0.00848,"104":0.00283,"105":0.01414,"106":0.00566,"107":0.00283,"108":0.00283,"109":0.02262,"110":0.00848,"111":0.00283,"112":0.00566,"113":0.00283,"114":0.00848,"115":0.00566,"116":0.01414,"117":0.09898,"118":0.41289,"119":2.01919,_:"12 13 14 15 16 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103"},E:{"7":0.08767,"13":0.00566,"14":0.02828,"15":0.01414,_:"0 4 5 6 8 9 10 11 12 3.1 3.2 6.1 7.1 9.1 10.1 11.1","5.1":0.01131,"12.1":0.00566,"13.1":0.02262,"14.1":0.22624,"15.1":0.02545,"15.2-15.3":0.00848,"15.4":0.04242,"15.5":0.0509,"15.6":0.15271,"16.0":0.01697,"16.1":0.08767,"16.2":0.05373,"16.3":0.1612,"16.4":0.0509,"16.5":0.06787,"16.6":0.55429,"17.0":0.18382,"17.1":0.34219,"17.2":0.00566},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00509,"5.0-5.1":0.00509,"6.0-6.1":0.01272,"7.0-7.1":0.01781,"8.1-8.4":0.00254,"9.0-9.2":0.02035,"9.3":0.0636,"10.0-10.2":0.00509,"10.3":0.09158,"11.0-11.2":0.04325,"11.3-11.4":0.03816,"12.0-12.1":0.0229,"12.2-12.5":0.4172,"13.0-13.1":0.01018,"13.2":0.04325,"13.3":0.02544,"13.4-13.7":0.07377,"14.0-14.4":0.19588,"14.5-14.8":0.31799,"15.0-15.1":0.12465,"15.2-15.3":0.15263,"15.4":0.17044,"15.5":0.23913,"15.6-15.7":1.25669,"16.0":0.59019,"16.1":1.18292,"16.2":0.56729,"16.3":1.06335,"16.4":0.21878,"16.5":0.56475,"16.6-16.7":9.57273,"17.0":2.86698,"17.1":4.81562,"17.2":0.13737},P:{"4":0.08192,"20":0.12287,"21":0.35838,"22":1.02395,"23":2.86707,"5.0-5.4":0.02048,_:"6.2-6.4 8.2 9.2 10.1","7.2-7.4":0.17407,"11.1-11.2":0.04096,"12.0":0.01024,"13.0":0.04096,"14.0":0.03072,"15.0":0.02048,"16.0":0.06144,"17.0":0.0512,"18.0":0.08192,"19.0":0.11263},I:{"0":0.07136,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00005,"4.4":0,"4.4.3-4.4.4":0.00022},K:{"0":1.85038,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.006,"9":0.003,"10":0.003,"11":0.13505,_:"6 7 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":1.34116},H:{"0":0},L:{"0":38.21041},R:{_:"0"},M:{"0":0.10758},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KY.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KY.js
    index 7d71e9b6b49da6..7d3c1f0af1975d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KY.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KY.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00629,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.00629,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0.00629,"112":0,"113":0,"114":0.01258,"115":0.28296,"116":0.0503,"117":0.91176,"118":0.05659,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00629,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.00629,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.08174,"80":0,"81":0.00629,"83":0.00629,"84":0,"85":0,"86":0,"87":0.00629,"88":0,"89":0,"90":0,"91":0.01886,"92":0.06288,"93":0.00629,"94":0,"95":0,"96":0.00629,"97":0,"98":0,"99":0.00629,"100":0.00629,"101":0.01886,"102":0,"103":1.27646,"104":0,"105":0.00629,"106":0,"107":0.03144,"108":0.00629,"109":0.40243,"110":0,"111":0.01258,"112":0.03144,"113":0.03144,"114":0.35842,"115":0.59736,"116":19.74432,"117":3.04339,"118":0,"119":0.00629,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00629,"73":0,"74":0,"75":0,"76":0,"77":0.00629,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00629,"96":0,"97":0,"98":0,"99":0.03144,"100":0.06917,"101":0.13205,"102":0.18864,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.01258,"110":0.06917,"111":0,"112":0,"113":0,"114":0.10061,"115":0.16349,"116":2.5152,"117":1.6223},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.01258,"14":0.01258,"15":0.00629,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.06288,"13.1":0.42758,"14.1":0.18235,"15.1":0.00629,"15.2-15.3":0.03144,"15.4":0.06288,"15.5":0.03773,"15.6":0.80486,"16.0":0.01886,"16.1":0.29554,"16.2":0.08174,"16.3":1.52798,"16.4":0.08174,"16.5":0.17606,"16.6":2.68498,"17.0":0.03773,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00303,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0.00909,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0.04544,"11.0-11.2":0.00606,"11.3-11.4":0.00606,"12.0-12.1":0,"12.2-12.5":0.21204,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0.01515,"14.0-14.4":0.04241,"14.5-14.8":0.13025,"15.0-15.1":0.0212,"15.2-15.3":0.0727,"15.4":0.03332,"15.5":0.1454,"15.6-15.7":2.57175,"16.0":0.88148,"16.1":1.12685,"16.2":0.62401,"16.3":1.62363,"16.4":0.1454,"16.5":0.67247,"16.6":19.8349,"17.0":1.58425,"17.1":0.00303},P:{"4":0.0818,"20":0.03068,"21":0.05113,"22":4.09007,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.03068,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.07158,"12.0":0,"13.0":0.01023,"14.0":0,"15.0":0,"16.0":0,"17.0":0,"18.0":0.01023,"19.0":0.0409},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.16462},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.16978,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":23.39747},R:{_:"0"},M:{"0":0.07795},Q:{"13.1":0},O:{"0":0.01114},H:{"0":0.08434}};
    +module.exports={C:{"88":0.00691,"115":0.45586,"116":0.00691,"117":0.00691,"118":0.02763,"119":4.72439,"120":0.95317,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 121 122 123 3.5 3.6"},D:{"50":0.01381,"53":0.03454,"63":0.00691,"79":0.07598,"83":0.00691,"87":0.00691,"92":0.02072,"93":0.02763,"98":0.01381,"99":0.02072,"101":0.02072,"102":0.02072,"103":4.12348,"106":0.02072,"107":0.00691,"108":0.00691,"109":0.33154,"111":0.00691,"112":0.00691,"113":0.01381,"114":2.07901,"115":0.01381,"116":0.24175,"117":0.5871,"118":9.04817,"119":15.70652,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 51 52 54 55 56 57 58 59 60 61 62 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 84 85 86 88 89 90 91 94 95 96 97 100 104 105 110 120 121 122"},F:{"95":0.00691,"102":1.36068,"103":0.01381,"104":0.31082,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"109":0.00691,"110":0.06216,"113":0.00691,"115":0.02763,"116":0.00691,"117":0.2003,"118":2.55559,"119":4.24781,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 111 112 114"},E:{"14":0.03454,"15":0.02072,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.00691,"13.1":4.22708,"14.1":0.21412,"15.1":0.01381,"15.2-15.3":0.04835,"15.4":0.54565,"15.5":0.06216,"15.6":1.76129,"16.0":0.02072,"16.1":3.43278,"16.2":0.33154,"16.3":1.35377,"16.4":0.12433,"16.5":0.2003,"16.6":5.84332,"17.0":0.65617,"17.1":2.25168,"17.2":0.03454},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00274,"5.0-5.1":0.00274,"6.0-6.1":0.00685,"7.0-7.1":0.0096,"8.1-8.4":0.00137,"9.0-9.2":0.01097,"9.3":0.03427,"10.0-10.2":0.00274,"10.3":0.04935,"11.0-11.2":0.02331,"11.3-11.4":0.02056,"12.0-12.1":0.01234,"12.2-12.5":0.22484,"13.0-13.1":0.00548,"13.2":0.02331,"13.3":0.01371,"13.4-13.7":0.03976,"14.0-14.4":0.10556,"14.5-14.8":0.17137,"15.0-15.1":0.06718,"15.2-15.3":0.08226,"15.4":0.09185,"15.5":0.12887,"15.6-15.7":0.67725,"16.0":0.31806,"16.1":0.63749,"16.2":0.30572,"16.3":0.57306,"16.4":0.1179,"16.5":0.30435,"16.6-16.7":5.15889,"17.0":1.54506,"17.1":2.59521,"17.2":0.07403},P:{"4":0.06299,"20":0.0315,"21":0.0105,"22":0.19948,"23":3.25461,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 12.0 14.0 15.0 16.0 18.0","7.2-7.4":0.09449,"11.1-11.2":0.0105,"13.0":0.0105,"17.0":0.05249,"19.0":0.0105},I:{"0":0.00924,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00003},K:{"0":0.01856,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.01381,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.01238},H:{"0":0},L:{"0":13.33765},R:{_:"0"},M:{"0":0.12685},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KZ.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KZ.js
    index be9b18388962b2..7a7d47b2914487 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KZ.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/KZ.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00677,"47":0,"48":0.00677,"49":0,"50":0,"51":0,"52":0.01015,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.01692,"69":0.00677,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0.00338,"77":0,"78":0.03722,"79":0.01692,"80":0,"81":0,"82":0.03046,"83":0,"84":0,"85":0.00338,"86":0,"87":0,"88":0.00677,"89":0,"90":0,"91":0,"92":0,"93":0.01015,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00338,"100":0,"101":0,"102":0.00338,"103":0.00338,"104":0,"105":0,"106":0,"107":0.00338,"108":0,"109":0,"110":0,"111":0.00338,"112":0,"113":0,"114":0.03046,"115":0.09137,"116":0.02369,"117":0.17258,"118":0.01354,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00338,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00338,"46":0,"47":0,"48":0,"49":0.01354,"50":0,"51":0.03046,"52":0,"53":0,"54":0,"55":0,"56":0.00338,"57":0,"58":0,"59":0,"60":0,"61":0.00338,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00338,"70":0,"71":0,"72":0,"73":0.00677,"74":0.03722,"75":0.06768,"76":0.05414,"77":0.05414,"78":0.06091,"79":0.05076,"80":0.11167,"81":0.04738,"83":0.05753,"84":0.06091,"85":0.03722,"86":0.05753,"87":0.0643,"88":0.08798,"89":0.04061,"90":0.26395,"91":0.02707,"92":0.01015,"93":0.16243,"94":0.00677,"95":0.00677,"96":0.02369,"97":0.0643,"98":0.03046,"99":0.03722,"100":0.03384,"101":0.04399,"102":0.05753,"103":0.0203,"104":0.01692,"105":0.06091,"106":0.06768,"107":0.22673,"108":0.06768,"109":0.74448,"110":0.03046,"111":0.0846,"112":0.04399,"113":0.03722,"114":0.31471,"115":0.17597,"116":2.52108,"117":0.58205,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0.00677,"55":0,"56":0,"57":0,"58":0,"60":0.0203,"62":0.02369,"63":0.00677,"64":0.00677,"65":0.00677,"66":0.01015,"67":0.01015,"68":0.00677,"69":0,"70":0.00677,"71":0,"72":0.00677,"73":0.00338,"74":0.01015,"75":0,"76":0.01015,"77":0.02369,"78":0,"79":0.00677,"80":0.0203,"81":0,"82":0,"83":0.00677,"84":0.00677,"85":0.01354,"86":0.00677,"87":0.00338,"88":0,"89":0,"90":0,"91":0.00677,"92":0.01354,"93":0,"94":0,"95":0.24365,"96":0,"97":0.01692,"98":0,"99":0.00677,"100":0.04399,"101":0.20304,"102":0.1692,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.01015,"18":0.04738,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.01354,"89":0.00338,"90":0.07106,"91":0,"92":0.00338,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.00338,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00338,"108":0,"109":0.00677,"110":0,"111":0.01692,"112":0.00338,"113":0.00338,"114":0.01692,"115":0.01692,"116":0.3181,"117":0.22673},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00338,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.01354,"6.1":0,"7.1":0,"9.1":0.00338,"10.1":0,"11.1":0,"12.1":0.00677,"13.1":0.00338,"14.1":0.01354,"15.1":0.00338,"15.2-15.3":0.00338,"15.4":0.00338,"15.5":0.00677,"15.6":0.03384,"16.0":0.00338,"16.1":0.01692,"16.2":0.01354,"16.3":0.02369,"16.4":0.0203,"16.5":0.03384,"16.6":0.13536,"17.0":0.0203,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0.00681,"9.0-9.2":0,"9.3":0.02382,"10.0-10.2":0,"10.3":0.01021,"11.0-11.2":0.01361,"11.3-11.4":0.01021,"12.0-12.1":0.00681,"12.2-12.5":0.17696,"13.0-13.1":0,"13.2":0,"13.3":12.93153,"13.4-13.7":0.03063,"14.0-14.4":0.16335,"14.5-14.8":0.31989,"15.0-15.1":0.1157,"15.2-15.3":0.13952,"15.4":0.18717,"15.5":0.34711,"15.6-15.7":1.38503,"16.0":1.52116,"16.1":1.51095,"16.2":0.895,"16.3":1.52456,"16.4":0.42198,"16.5":1.27614,"16.6":9.49106,"17.0":1.36462,"17.1":0},P:{"4":0.06146,"20":0.13317,"21":0.16391,"22":1.53662,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.05122,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.02049,"12.0":0,"13.0":0.01024,"14.0":0.02049,"15.0":0.01024,"16.0":0.04098,"17.0":0.03073,"18.0":0.06146,"19.0":0.08195},I:{"0":0,"3":0,"4":0.0039,"2.1":0,"2.2":0.00195,"2.3":0.00195,"4.1":0.00585,"4.2-4.3":0.00585,"4.4":0,"4.4.3-4.4.4":0.02728},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01015,"9":0.01015,"10":0.00677,"11":0.03722,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":48.6996},R:{_:"0"},M:{"0":0.05293},Q:{"13.1":0},O:{"0":0.4565},H:{"0":0.28186}};
    +module.exports={C:{"40":0.00345,"48":0.00345,"51":0.00691,"52":0.03453,"56":0.00345,"59":0.00345,"72":0.00345,"84":0.01036,"99":0.00691,"101":0.00691,"102":0.00691,"108":0.00345,"109":0.01381,"110":0.00345,"111":0.32804,"112":0.00345,"113":0.00345,"114":0.00691,"115":0.47306,"116":0.00691,"117":0.02072,"118":0.03108,"119":0.71132,"120":0.21754,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 47 49 50 53 54 55 57 58 60 61 62 63 64 65 66 67 68 69 70 71 73 74 75 76 77 78 79 80 81 82 83 85 86 87 88 89 90 91 92 93 94 95 96 97 98 100 103 104 105 106 107 121 122 123 3.5 3.6"},D:{"22":0.00691,"26":0.00345,"34":0.00691,"38":0.00345,"40":0.00345,"41":0.00345,"43":0.00345,"44":0.00345,"45":0.00345,"46":0.00345,"47":0.00345,"48":0.00345,"49":0.01727,"51":0.00691,"53":0.00691,"58":0.00345,"64":0.01036,"65":0.00345,"66":0.00691,"67":0.00345,"68":0.00345,"69":0.00345,"70":0.00345,"71":0.00345,"72":0.00345,"73":0.00345,"74":0.03798,"75":0.00345,"76":0.00345,"77":0.00345,"78":0.00691,"79":0.0518,"80":0.01727,"81":0.00345,"83":0.01036,"84":0.00345,"85":0.03453,"86":0.01036,"87":0.02072,"88":0.00691,"89":0.00345,"90":0.00691,"91":0.03453,"92":0.00345,"95":0.00345,"96":0.01381,"97":0.04144,"98":0.01036,"99":0.01036,"100":0.02072,"101":0.01036,"102":0.07251,"103":0.08287,"104":0.00691,"105":0.03798,"106":0.18301,"107":0.02417,"108":0.10359,"109":2.96958,"110":0.02762,"111":0.04834,"112":0.0518,"113":0.03453,"114":0.13812,"115":0.03453,"116":0.22099,"117":0.27279,"118":2.6519,"119":11.79545,"120":0.00345,"121":0.00345,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 23 24 25 27 28 29 30 31 32 33 35 36 37 39 42 50 52 54 55 56 57 59 60 61 62 63 93 94 122"},F:{"36":0.01036,"42":0.00345,"56":0.00691,"73":0.00345,"77":0.00345,"79":0.02762,"80":0.00345,"81":0.00345,"82":0.00345,"83":0.00691,"84":0.01381,"85":0.0518,"86":0.00691,"87":0.00691,"93":0.00345,"95":0.37983,"99":0.00345,"100":0.01036,"101":0.00345,"102":0.49378,"103":0.30732,"104":1.00828,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 38 39 40 41 43 44 45 46 47 48 49 50 51 52 53 54 55 57 58 60 62 63 64 65 66 67 68 69 70 71 72 74 75 76 78 88 89 90 91 92 94 96 97 98 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.00345},B:{"18":0.01036,"84":0.00345,"89":0.00691,"90":0.00345,"92":0.01381,"100":0.00345,"106":0.00691,"107":0.01036,"108":0.01381,"109":0.02762,"110":0.01381,"111":0.00345,"112":0.01381,"113":0.00345,"114":0.00691,"115":0.00691,"116":0.01727,"117":0.04834,"118":0.44889,"119":2.12705,_:"12 13 14 15 16 17 79 80 81 83 85 86 87 88 91 93 94 95 96 97 98 99 101 102 103 104 105"},E:{"9":0.01036,"13":0.00345,"14":0.02072,"15":0.00345,_:"0 4 5 6 7 8 10 11 12 3.1 3.2 6.1 7.1 10.1 11.1","5.1":0.1174,"9.1":0.00691,"12.1":0.00691,"13.1":0.02417,"14.1":0.04144,"15.1":0.02417,"15.2-15.3":0.00691,"15.4":0.02762,"15.5":0.02417,"15.6":0.14503,"16.0":0.00691,"16.1":0.06906,"16.2":0.04834,"16.3":0.08633,"16.4":0.08633,"16.5":0.10704,"16.6":0.41436,"17.0":0.25898,"17.1":0.36602,"17.2":0.01036},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00397,"5.0-5.1":0.00397,"6.0-6.1":0.00993,"7.0-7.1":0.0139,"8.1-8.4":0.00199,"9.0-9.2":0.01589,"9.3":0.04964,"10.0-10.2":0.00397,"10.3":0.07149,"11.0-11.2":0.03376,"11.3-11.4":0.02979,"12.0-12.1":0.01787,"12.2-12.5":0.32566,"13.0-13.1":0.00794,"13.2":0.03376,"13.3":0.01986,"13.4-13.7":0.05759,"14.0-14.4":0.1529,"14.5-14.8":0.24821,"15.0-15.1":0.0973,"15.2-15.3":0.11914,"15.4":0.13304,"15.5":0.18666,"15.6-15.7":0.98094,"16.0":0.46068,"16.1":0.92335,"16.2":0.44281,"16.3":0.83002,"16.4":0.17077,"16.5":0.44083,"16.6-16.7":7.47221,"17.0":2.23789,"17.1":3.75894,"17.2":0.10723},P:{"4":0.08228,"20":0.10285,"21":0.1337,"22":0.43196,"23":1.74842,_:"5.0-5.4 8.2 10.1","6.2-6.4":0.01028,"7.2-7.4":0.11313,"9.2":0.01028,"11.1-11.2":0.02057,"12.0":0.01028,"13.0":0.01028,"14.0":0.02057,"15.0":0.01028,"16.0":0.04114,"17.0":0.03085,"18.0":0.04114,"19.0":0.08228},I:{"0":0.0456,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00014},K:{"0":0.45484,_:"10 11 12 11.1 11.5 12.1"},A:{"6":0.00355,"7":0.00355,"8":0.02486,"9":0.00355,"10":0.00355,"11":0.08524,_:"5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.6547},H:{"0":0.01},L:{"0":39.08727},R:{_:"0"},M:{"0":0.08511},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LA.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LA.js
    index ab762ff7020934..6ceec9fd7dc953 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LA.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LA.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0.00265,"40":0.00265,"41":0.00265,"42":0,"43":0.00265,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.0053,"101":0,"102":0.00265,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0.0106,"111":0,"112":0,"113":0.00265,"114":0.0053,"115":0.04768,"116":0.01325,"117":0.18013,"118":0.01854,"119":0,"120":0,"3.5":0,"3.6":0.00265},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00265,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.04238,"38":0,"39":0.00265,"40":0.00265,"41":0.00265,"42":0.00265,"43":0.00795,"44":0.0053,"45":0.0053,"46":0.00265,"47":0.00265,"48":0,"49":0.00265,"50":0,"51":0.0053,"52":0,"53":0,"54":0,"55":0,"56":0.00265,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.00265,"64":0,"65":0.00265,"66":0,"67":0,"68":0.00265,"69":0.0053,"70":0.00265,"71":0,"72":0,"73":0,"74":0.00265,"75":0.00265,"76":0,"77":0,"78":0.0053,"79":0.0053,"80":0.0053,"81":0.00265,"83":0.02914,"84":0.00265,"85":0.00265,"86":0.0053,"87":0.0106,"88":0.00795,"89":0.0053,"90":0.01325,"91":0.00795,"92":0.0053,"93":0.00265,"94":0.01325,"95":0.00265,"96":0.00265,"97":0.00795,"98":0.00265,"99":0.02119,"100":0.0053,"101":0.00265,"102":0.02384,"103":0.04238,"104":0.0053,"105":0.00795,"106":0.0053,"107":0.02119,"108":0.03179,"109":0.55629,"110":0.0053,"111":0.01589,"112":0.01589,"113":0.03974,"114":0.06358,"115":0.09801,"116":2.75496,"117":0.6702,"118":0.00795,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00265,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00265,"70":0,"71":0,"72":0.00795,"73":0,"74":0,"75":0,"76":0,"77":0.00265,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.00265,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01325,"96":0,"97":0,"98":0,"99":0,"100":0.00265,"101":0.04768,"102":0.04768,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00265},B:{"12":0.00265,"13":0,"14":0.00265,"15":0.00265,"16":0,"17":0,"18":0.01325,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00795,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0.00265,"107":0,"108":0.0053,"109":0.0106,"110":0,"111":0,"112":0.01589,"113":0.0053,"114":0.0053,"115":0.01854,"116":0.43179,"117":0.25166},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00795,"10":0,"11":0,"12":0,"13":0.00265,"14":0.00265,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00265,"13.1":0.0053,"14.1":0.01854,"15.1":0.00265,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0.03179,"16.0":0,"16.1":0.0053,"16.2":0.00265,"16.3":0.02119,"16.4":0.0053,"16.5":0.01589,"16.6":0.11921,"17.0":0.01854,"17.1":0},G:{"8":0.00231,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00231,"6.0-6.1":0.01157,"7.0-7.1":0.01851,"8.1-8.4":0.03238,"9.0-9.2":0.00231,"9.3":0.08327,"10.0-10.2":0,"10.3":0.07633,"11.0-11.2":0.06014,"11.3-11.4":0.00925,"12.0-12.1":0.03238,"12.2-12.5":0.79803,"13.0-13.1":0.01388,"13.2":0.00463,"13.3":0.04395,"13.4-13.7":0.25445,"14.0-14.4":0.6153,"14.5-14.8":0.60142,"15.0-15.1":0.20356,"15.2-15.3":0.31227,"15.4":0.30302,"15.5":0.49733,"15.6-15.7":3.29854,"16.0":0.83504,"16.1":1.28842,"16.2":0.70319,"16.3":1.32312,"16.4":0.5806,"16.5":1.36475,"16.6":8.26023,"17.0":1.24447,"17.1":0.00463},P:{"4":0.15413,"20":0.1233,"21":0.30825,"22":1.61318,"5.0-5.4":0,"6.2-6.4":0.03083,"7.2-7.4":0.11303,"8.2":0,"9.2":0.02055,"10.1":0,"11.1-11.2":0.03083,"12.0":0.01028,"13.0":0.01028,"14.0":0.02055,"15.0":0.09248,"16.0":0.0411,"17.0":0.0411,"18.0":0.05138,"19.0":0.06165},I:{"0":0,"3":0.0061,"4":0.02745,"2.1":0.0122,"2.2":0.01525,"2.3":0.02135,"4.1":0.0244,"4.2-4.3":0.0427,"4.4":0,"4.4.3-4.4.4":0.13115},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0.0031,"8":0.03724,"9":0.00621,"10":0.00621,"11":0.05275,"5.5":0},S:{"2.5":0.00735,_:"3.0-3.1"},J:{"7":0,"10":0.0147},N:{"10":0.0196,"11":0.0098},L:{"0":64.60617},R:{_:"0"},M:{"0":0.09556},Q:{"13.1":0.05881},O:{"0":1.04384},H:{"0":0.18791}};
    +module.exports={C:{"2":0.00209,"3":0.00209,"4":0.00209,"5":0.00209,"6":0.00209,"10":0.00209,"11":0.00209,"17":0.00209,"19":0.00209,"28":0.00209,"29":0.00209,"33":0.00209,"34":0.00209,"35":0.00209,"36":0.00209,"37":0.00209,"38":0.00209,"39":0.01885,"40":0.00628,"48":0.00419,"52":0.00209,"66":0.00209,"72":0.00419,"81":0.00209,"85":0.00419,"94":0.00209,"99":0.00209,"100":0.00419,"101":0.00209,"103":0.00209,"108":0.02303,"110":0.00209,"113":0.00209,"114":0.00209,"115":0.12773,"116":0.00419,"117":0.00628,"118":0.01466,"119":0.41671,"120":0.14239,_:"7 8 9 12 13 14 15 16 18 20 21 22 23 24 25 26 27 30 31 32 41 42 43 44 45 46 47 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 67 68 69 70 71 73 74 75 76 77 78 79 80 82 83 84 86 87 88 89 90 91 92 93 95 96 97 98 102 104 105 106 107 109 111 112 121 122 123","3.5":0.00209,"3.6":0.00628},D:{"6":0.00209,"10":0.00209,"11":0.00209,"17":0.00209,"19":0.00209,"21":0.00209,"30":0.00209,"31":0.00419,"33":0.00209,"37":0.02722,"38":0.00419,"39":0.00628,"40":0.00419,"41":0.00628,"42":0.00419,"43":0.01047,"44":0.01466,"45":0.01256,"46":0.01466,"47":0.00628,"48":0.00209,"49":0.00419,"51":0.02094,"53":0.00209,"55":0.00209,"58":0.00209,"60":0.00209,"62":0.00419,"63":0.00209,"65":0.00209,"67":0.00209,"68":0.00419,"69":0.00209,"70":0.00838,"71":0.00419,"72":0.00419,"74":0.00419,"75":0.00628,"77":0.00209,"78":0.00628,"79":0.01675,"80":0.00209,"83":0.00838,"84":0.00209,"85":0.00419,"86":0.02722,"87":0.00628,"88":0.00838,"89":0.01047,"90":0.00628,"91":0.00628,"92":0.00628,"94":0.01256,"95":0.00209,"96":0.00209,"97":0.00628,"98":0.00838,"99":0.02094,"100":0.00419,"101":0.00419,"102":0.01466,"103":0.06491,"104":0.01675,"105":0.01885,"106":0.01047,"107":0.01466,"108":0.07329,"109":1.26478,"110":0.00838,"111":0.05863,"112":0.05654,"113":0.01466,"114":0.04188,"115":0.04816,"116":0.09632,"117":0.26594,"118":2.35575,"119":9.04817,"120":0.01466,"121":0.01256,_:"4 5 7 8 9 12 13 14 15 16 18 20 22 23 24 25 26 27 28 29 32 34 35 36 50 52 54 56 57 59 61 64 66 73 76 81 93 122"},F:{"31":0.00209,"32":0.00209,"82":0.00209,"85":0.00209,"89":0.00209,"94":0.00209,"95":0.04397,"102":0.0356,"103":0.03769,"104":0.16961,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 83 84 86 87 88 90 91 92 93 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.00209},B:{"12":0.00628,"13":0.00209,"14":0.00209,"15":0.00209,"16":0.00209,"17":0.00419,"18":0.01466,"84":0.01047,"89":0.00209,"92":0.04816,"99":0.00209,"100":0.00419,"104":0.00209,"108":0.00209,"109":0.02932,"110":0.00419,"111":0.00419,"113":0.00209,"114":0.00628,"115":0.00419,"116":0.01256,"117":0.02513,"118":0.32666,"119":1.90345,_:"79 80 81 83 85 86 87 88 90 91 93 94 95 96 97 98 101 102 103 105 106 107 112"},E:{"5":0.00209,"7":0.00209,"8":0.01047,"9":0.02932,"13":0.00209,"14":0.01047,_:"0 4 6 10 11 12 15 3.1 3.2 6.1 9.1 10.1 11.1","5.1":0.00209,"7.1":0.00209,"12.1":0.00209,"13.1":0.01466,"14.1":0.10889,"15.1":0.00209,"15.2-15.3":0.00419,"15.4":0.01675,"15.5":0.01256,"15.6":0.08795,"16.0":0.02303,"16.1":0.03979,"16.2":0.00838,"16.3":0.06701,"16.4":0.05026,"16.5":0.03141,"16.6":0.20731,"17.0":0.12773,"17.1":0.37692,"17.2":0.00628},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00339,"5.0-5.1":0.00339,"6.0-6.1":0.00848,"7.0-7.1":0.01187,"8.1-8.4":0.0017,"9.0-9.2":0.01356,"9.3":0.04238,"10.0-10.2":0.00339,"10.3":0.06102,"11.0-11.2":0.02882,"11.3-11.4":0.02543,"12.0-12.1":0.01526,"12.2-12.5":0.27799,"13.0-13.1":0.00678,"13.2":0.02882,"13.3":0.01695,"13.4-13.7":0.04916,"14.0-14.4":0.13052,"14.5-14.8":0.21188,"15.0-15.1":0.08306,"15.2-15.3":0.1017,"15.4":0.11357,"15.5":0.15933,"15.6-15.7":0.83735,"16.0":0.39325,"16.1":0.7882,"16.2":0.378,"16.3":0.70853,"16.4":0.14577,"16.5":0.3763,"16.6-16.7":6.37846,"17.0":1.91032,"17.1":3.20872,"17.2":0.09153},P:{"4":0.18474,"20":0.1129,"21":0.18474,"22":0.61581,"23":1.29319,_:"5.0-5.4 8.2 10.1 12.0","6.2-6.4":0.02053,"7.2-7.4":0.10263,"9.2":0.02053,"11.1-11.2":0.03079,"13.0":0.02053,"14.0":0.04105,"15.0":0.01026,"16.0":0.05132,"17.0":0.02053,"18.0":0.04105,"19.0":0.07184},I:{"0":0.1888,"3":0.00002,"4":0.00004,"2.1":0,"2.2":0.00004,"2.3":0,"4.1":0.00002,"4.2-4.3":0.00013,"4.4":0,"4.4.3-4.4.4":0.00057},K:{"0":0.37158,_:"10 11 12 11.1 11.5 12.1"},A:{"6":0.00626,"7":0.00939,"8":0.10953,"9":0.02504,"10":0.01878,"11":0.10953,_:"5.5"},N:{_:"10 11"},S:{"2.5":0.00791,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":1.56539},H:{"0":0},L:{"0":58.01263},R:{_:"0"},M:{"0":0.1265},Q:{"13.1":0.09487}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LB.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LB.js
    index bf0a89eda3eb3b..5ac09e0ed69b19 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LB.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LB.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00629,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00314,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00314,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00314,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.00314,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00314,"100":0,"101":0,"102":0.01258,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0.00314,"112":0,"113":0.00314,"114":0.00314,"115":0.08803,"116":0.03458,"117":0.27353,"118":0.02515,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.03458,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00314,"47":0,"48":0,"49":0.00943,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00314,"57":0,"58":0.01886,"59":0,"60":0.00314,"61":0,"62":0,"63":0,"64":0,"65":0.00314,"66":0.00314,"67":0.00629,"68":0.01258,"69":0.00314,"70":0.00314,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0.00314,"77":0,"78":0,"79":0.01258,"80":0.00314,"81":0.00629,"83":0.00629,"84":0.00314,"85":0,"86":0.01258,"87":0.00629,"88":0.00314,"89":0.00314,"90":0.00314,"91":0.00943,"92":0,"93":0.00943,"94":0.00314,"95":0.00314,"96":0,"97":0,"98":0.00314,"99":0.00629,"100":0.00314,"101":0,"102":0.00314,"103":0.01886,"104":0.00314,"105":0.00314,"106":0.0503,"107":0.00629,"108":0.03458,"109":0.85517,"110":0.00629,"111":0.00629,"112":0.02201,"113":0.01572,"114":0.06288,"115":0.11318,"116":3.89856,"117":1.05324,"118":0.00314,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00314,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.00314,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.01258,"73":0.00314,"74":0,"75":0,"76":0,"77":0.01258,"78":0,"79":0.00314,"80":0,"81":0,"82":0,"83":0.00314,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01886,"96":0,"97":0,"98":0,"99":0.00314,"100":0.0283,"101":0.09118,"102":0.09746,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0.00314,"16":0,"17":0,"18":0.00314,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.00314,"90":0,"91":0,"92":0.00943,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0.00314,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0.00314,"106":0,"107":0,"108":0,"109":0.02201,"110":0,"111":0.00314,"112":0.00314,"113":0.00314,"114":0.00943,"115":0.01572,"116":0.45902,"117":0.38357},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.01258,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.0786,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00314,"13.1":0.01572,"14.1":0.03144,"15.1":0.00943,"15.2-15.3":0.00629,"15.4":0.00314,"15.5":0.05974,"15.6":0.06917,"16.0":0.00314,"16.1":0.02201,"16.2":0.01572,"16.3":0.03458,"16.4":0.00943,"16.5":0.04087,"16.6":0.31126,"17.0":0.02201,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.04782,"8.1-8.4":0,"9.0-9.2":0.00266,"9.3":0.09033,"10.0-10.2":0,"10.3":0.06376,"11.0-11.2":0.00531,"11.3-11.4":0.00531,"12.0-12.1":0.01594,"12.2-12.5":0.55789,"13.0-13.1":0.00531,"13.2":0,"13.3":0.0186,"13.4-13.7":0.05313,"14.0-14.4":0.23378,"14.5-14.8":0.45163,"15.0-15.1":0.08501,"15.2-15.3":0.13815,"15.4":0.11158,"15.5":0.28957,"15.6-15.7":2.30596,"16.0":0.93514,"16.1":1.36286,"16.2":0.56321,"16.3":1.37083,"16.4":0.26832,"16.5":0.86606,"16.6":14.80014,"17.0":1.46115,"17.1":0},P:{"4":0.13316,"20":0.08194,"21":0.23558,"22":4.01514,"5.0-5.4":0.01024,"6.2-6.4":0,"7.2-7.4":0.12291,"8.2":0,"9.2":0.01024,"10.1":0,"11.1-11.2":0.03073,"12.0":0.01024,"13.0":0.04097,"14.0":0.05121,"15.0":0.02049,"16.0":0.06146,"17.0":0.11267,"18.0":0.04097,"19.0":0.09218},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.01218,"4.4":0,"4.4.3-4.4.4":0.14013},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01572,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":57.2122},R:{_:"0"},M:{"0":0.1714},Q:{"13.1":0},O:{"0":0.22625},H:{"0":0.26612}};
    +module.exports={C:{"12":0.0033,"31":0.0033,"52":0.01979,"68":0.0066,"78":0.01649,"83":0.0066,"88":0.0033,"91":0.0066,"99":0.0033,"102":0.0033,"104":0.0033,"114":0.0066,"115":0.3265,"116":0.0033,"117":0.0066,"118":0.02309,"119":1.21696,"120":0.34629,"121":0.0033,_:"2 3 4 5 6 7 8 9 10 11 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 79 80 81 82 84 85 86 87 89 90 92 93 94 95 96 97 98 100 101 103 105 106 107 108 109 110 111 112 113 122 123 3.5 3.6"},D:{"11":0.0033,"29":0.0033,"33":0.0033,"34":0.00989,"38":0.00989,"40":0.0033,"49":0.02638,"56":0.0033,"58":0.05607,"60":0.0033,"63":0.0033,"65":0.0033,"66":0.00989,"67":0.02638,"68":0.0033,"69":0.0033,"70":0.0033,"71":0.0066,"73":0.0066,"74":0.0033,"75":0.0033,"76":0.0033,"77":0.00989,"78":0.0033,"79":0.04947,"80":0.00989,"81":0.0033,"83":0.00989,"84":0.0066,"85":0.0066,"86":0.03298,"87":0.02638,"88":0.01319,"89":0.0033,"90":0.0033,"91":0.06596,"92":0.0066,"93":0.0033,"94":0.0066,"95":0.0066,"96":0.01319,"97":0.0033,"98":0.01979,"99":0.01649,"100":0.0066,"101":0.0033,"102":0.01649,"103":0.05936,"104":0.01319,"105":0.01319,"106":0.07915,"107":0.01649,"108":0.04287,"109":2.89894,"110":0.01649,"111":0.01319,"112":0.02968,"113":0.01979,"114":0.04947,"115":0.03298,"116":0.27044,"117":0.34959,"118":3.72344,"119":13.94394,"120":0.0033,"121":0.0066,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 30 31 32 35 36 37 39 41 42 43 44 45 46 47 48 50 51 52 53 54 55 57 59 61 62 64 72 122"},F:{"64":0.0033,"79":0.0066,"85":0.0033,"95":0.04287,"102":0.17809,"103":0.07256,"104":0.3265,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.0033,"14":0.01319,"15":0.0066,"16":0.0033,"17":0.0066,"18":0.01649,"84":0.0066,"89":0.01649,"90":0.0033,"92":0.03628,"98":0.00989,"100":0.0033,"108":0.0033,"109":0.09234,"112":0.0033,"113":0.0033,"114":0.00989,"115":0.0066,"116":0.02309,"117":0.13522,"118":0.56396,"119":2.45371,_:"13 79 80 81 83 85 86 87 88 91 93 94 95 96 97 99 101 102 103 104 105 106 107 110 111"},E:{"7":0.0033,"14":0.06596,"15":0.0066,_:"0 4 5 6 8 9 10 11 12 13 3.1 3.2 6.1 7.1 9.1 10.1","5.1":0.72556,"11.1":0.0033,"12.1":0.0066,"13.1":0.07585,"14.1":0.10554,"15.1":0.01649,"15.2-15.3":0.07256,"15.4":0.01979,"15.5":0.23086,"15.6":0.18469,"16.0":0.00989,"16.1":0.06266,"16.2":0.07256,"16.3":0.12532,"16.4":0.03298,"16.5":0.1715,"16.6":0.44853,"17.0":0.20118,"17.1":0.38587,"17.2":0.00989},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.0034,"5.0-5.1":0.0034,"6.0-6.1":0.00851,"7.0-7.1":0.01192,"8.1-8.4":0.0017,"9.0-9.2":0.01362,"9.3":0.04256,"10.0-10.2":0.0034,"10.3":0.06128,"11.0-11.2":0.02894,"11.3-11.4":0.02553,"12.0-12.1":0.01532,"12.2-12.5":0.27918,"13.0-13.1":0.00681,"13.2":0.02894,"13.3":0.01702,"13.4-13.7":0.04937,"14.0-14.4":0.13108,"14.5-14.8":0.21279,"15.0-15.1":0.08341,"15.2-15.3":0.10214,"15.4":0.11405,"15.5":0.16002,"15.6-15.7":0.84094,"16.0":0.39494,"16.1":0.79157,"16.2":0.37961,"16.3":0.71156,"16.4":0.1464,"16.5":0.37791,"16.6-16.7":6.40579,"17.0":1.9185,"17.1":3.22247,"17.2":0.09192},P:{"4":0.14347,"20":0.06149,"21":0.18446,"22":0.42016,"23":3.68919,"5.0-5.4":0.01025,"6.2-6.4":0.01025,"7.2-7.4":0.11273,_:"8.2 10.1 12.0","9.2":0.01025,"11.1-11.2":0.05124,"13.0":0.04099,"14.0":0.05124,"15.0":0.03074,"16.0":0.04099,"17.0":0.11273,"18.0":0.05124,"19.0":0.09223},I:{"0":0.08002,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00024},K:{"0":0.28148,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.07915,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.22117},H:{"0":0},L:{"0":45.42741},R:{_:"0"},M:{"0":0.12734},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LC.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LC.js
    index 03599c88d65330..80ecf81a4fa4d7 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LC.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LC.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00406,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0.00406,"114":0,"115":0.04872,"116":0.02842,"117":0.21924,"118":0.01624,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0.00406,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0.00812,"77":0,"78":0.01624,"79":0.01218,"80":0,"81":0.00406,"83":0.00812,"84":0,"85":0,"86":0,"87":0.0203,"88":0.01218,"89":0,"90":0,"91":0,"92":0,"93":0.08526,"94":0.00406,"95":0.00406,"96":0.01624,"97":0,"98":0,"99":0,"100":0,"101":0.00406,"102":0.01218,"103":0.16646,"104":0.00406,"105":0.0609,"106":0.01624,"107":0.00406,"108":0.00406,"109":0.21924,"110":0.00406,"111":0.00406,"112":0.01218,"113":0.00812,"114":0.15428,"115":0.31262,"116":7.64904,"117":1.89196,"118":0.02842,"119":0.0203,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.02842,"73":0,"74":0,"75":0,"76":0,"77":0.0203,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.0203,"101":0.09338,"102":0.19082,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00406,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00406,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.0203,"110":0.00406,"111":0.00406,"112":0,"113":0.01218,"114":0.03654,"115":0.0812,"116":1.27078,"117":0.79982},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.01624,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0.0406,"12.1":0.00812,"13.1":0.02842,"14.1":0.01218,"15.1":0.00406,"15.2-15.3":0.00406,"15.4":0.00406,"15.5":0.00812,"15.6":0.40194,"16.0":0.00812,"16.1":0.00406,"16.2":0.01218,"16.3":0.0203,"16.4":0.00812,"16.5":0.04466,"16.6":0.4669,"17.0":0.01624,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00345,"6.0-6.1":0,"7.0-7.1":0.01036,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.2608,"10.0-10.2":0,"10.3":0.00864,"11.0-11.2":0.00864,"11.3-11.4":0.00173,"12.0-12.1":0.00173,"12.2-12.5":0.16408,"13.0-13.1":0.01036,"13.2":0.00345,"13.3":0.00345,"13.4-13.7":0.01036,"14.0-14.4":0.04145,"14.5-14.8":0.08118,"15.0-15.1":0.05354,"15.2-15.3":0.08118,"15.4":0.03109,"15.5":0.03109,"15.6-15.7":1.48362,"16.0":0.45769,"16.1":0.76858,"16.2":0.26253,"16.3":0.94129,"16.4":0.12263,"16.5":0.42488,"16.6":10.1936,"17.0":1.57343,"17.1":0.00173},P:{"4":0.104,"20":0.1872,"21":0.35359,"22":4.77353,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.58239,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.0832,"12.0":0,"13.0":0.0312,"14.0":0.0104,"15.0":0.0208,"16.0":0.052,"17.0":0.052,"18.0":0.0312,"19.0":0.104},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.60246},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00406,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0.00594},N:{"10":0,"11":0},L:{"0":57.80884},R:{_:"0"},M:{"0":0.08316},Q:{"13.1":0},O:{"0":0.09504},H:{"0":0.25306}};
    +module.exports={C:{"87":0.01192,"88":0.00795,"94":0.00397,"109":0.00397,"112":0.00795,"115":0.13512,"116":0.07551,"117":0.00795,"118":0.01192,"119":0.46496,"120":0.08345,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 89 90 91 92 93 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 111 113 114 121 122 123 3.5 3.6"},D:{"41":0.00397,"50":0.00397,"52":0.00397,"65":0.00397,"69":0.00397,"74":0.00397,"76":0.03179,"77":0.00397,"79":0.03179,"81":0.01987,"83":0.00397,"87":0.00795,"88":0.00795,"89":0.00397,"90":0.00397,"91":0.00795,"93":0.05564,"94":0.00795,"95":0.00397,"98":0.00397,"102":0.00795,"103":0.13114,"104":0.21062,"105":0.13512,"106":0.01192,"107":0.03577,"109":0.69545,"110":0.08345,"111":0.01192,"112":0.01192,"113":0.01192,"114":0.16293,"115":0.07153,"116":0.14306,"117":0.32984,"118":7.95197,"119":15.93177,"120":0.08743,"121":0.03577,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 42 43 44 45 46 47 48 49 51 53 54 55 56 57 58 59 60 61 62 63 64 66 67 68 70 71 72 73 75 78 80 84 85 86 92 96 97 99 100 101 108 122"},F:{"28":0.00795,"86":0.00397,"95":0.00397,"102":0.306,"103":0.03179,"104":0.33382,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00397,"18":0.00397,"92":0.00397,"107":0.00397,"108":0.01192,"109":0.07153,"110":0.00397,"111":0.00397,"112":0.00397,"113":0.00795,"114":0.13114,"115":0.01987,"116":0.04769,"117":0.0914,"118":0.86236,"119":3.96605,_:"13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106"},E:{"13":0.00397,"14":0.06358,_:"0 4 5 6 7 8 9 10 11 12 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1 15.1 17.2","5.1":0.00397,"12.1":0.00397,"13.1":0.05564,"14.1":0.07551,"15.2-15.3":0.00397,"15.4":0.00397,"15.5":0.00795,"15.6":0.0914,"16.0":0.03974,"16.1":0.03577,"16.2":0.0159,"16.3":0.306,"16.4":0.04769,"16.5":0.19075,"16.6":0.84249,"17.0":0.27023,"17.1":0.22652},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00237,"5.0-5.1":0.00237,"6.0-6.1":0.00591,"7.0-7.1":0.00828,"8.1-8.4":0.00118,"9.0-9.2":0.00946,"9.3":0.02957,"10.0-10.2":0.00237,"10.3":0.04258,"11.0-11.2":0.02011,"11.3-11.4":0.01774,"12.0-12.1":0.01064,"12.2-12.5":0.19396,"13.0-13.1":0.00473,"13.2":0.02011,"13.3":0.01183,"13.4-13.7":0.0343,"14.0-14.4":0.09107,"14.5-14.8":0.14784,"15.0-15.1":0.05795,"15.2-15.3":0.07096,"15.4":0.07924,"15.5":0.11117,"15.6-15.7":0.58426,"16.0":0.27439,"16.1":0.54996,"16.2":0.26374,"16.3":0.49437,"16.4":0.10171,"16.5":0.26256,"16.6-16.7":4.45053,"17.0":1.33291,"17.1":2.23887,"17.2":0.06387},P:{"4":0.06325,"20":0.10541,"21":0.15812,"22":0.34786,"23":4.53269,_:"5.0-5.4 8.2 9.2 10.1","6.2-6.4":0.01054,"7.2-7.4":0.42165,"11.1-11.2":0.03162,"12.0":0.01054,"13.0":0.03162,"14.0":0.20028,"15.0":0.02108,"16.0":0.02108,"17.0":0.02108,"18.0":0.02108,"19.0":0.06325},I:{"0":0.01798,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00005},K:{"0":0.33138,_:"10 11 12 11.1 11.5 12.1"},A:{"10":0.00397,"11":0.01987,_:"6 7 8 9 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.0482},H:{"0":0},L:{"0":45.83109},R:{_:"0"},M:{"0":0.17473},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LI.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LI.js
    index fe8aa55d2a153a..e8630cadd6d53e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LI.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LI.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0.0207,"3":0.04831,"4":0.0138,"5":0.0207,"6":0.0069,"7":0,"8":0.0069,"9":0,"10":0.0069,"11":0.0138,"12":0.0138,"13":0.0069,"14":0.0069,"15":0.0069,"16":0.0069,"17":0.0207,"18":0.0069,"19":0.0138,"20":0.0069,"21":0.0069,"22":0.0069,"23":0.0138,"24":0.0069,"25":0.0069,"26":0.0069,"27":0.0069,"28":0.0069,"29":0.0069,"30":0.0069,"31":0.0138,"32":0.0069,"33":0.0069,"34":0.0069,"35":0.0276,"36":0.0138,"37":0.0138,"38":0.03451,"39":0.03451,"40":0.03451,"41":0.0276,"42":0,"43":0.0069,"44":0,"45":0,"46":0,"47":0,"48":0.0069,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.0069,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.0069,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0.0069,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.0138,"103":0,"104":0,"105":0,"106":0.0069,"107":0,"108":0.0138,"109":0,"110":0,"111":0.25534,"112":0.0069,"113":0.0207,"114":0.03451,"115":0.08971,"116":0.21393,"117":4.51325,"118":0.99374,"119":0,"120":0,"3.5":0.0069,"3.6":0.08971},D:{"4":0.0138,"5":0.0069,"6":0.0069,"7":0.0069,"8":0,"9":0.0069,"10":0.0069,"11":0.0138,"12":0.0069,"13":0,"14":0,"15":0,"16":0,"17":0.0138,"18":0.0069,"19":0.0138,"20":0.0069,"21":0.0138,"22":0.0069,"23":0,"24":0,"25":0.0138,"26":0,"27":0.0138,"28":0.0207,"29":0.0069,"30":0.0138,"31":0.03451,"32":0.0069,"33":0.0207,"34":0.0138,"35":0.0138,"36":0.0276,"37":0.0276,"38":0.06211,"39":0.05521,"40":0.05521,"41":0.08971,"42":0.04831,"43":0.09661,"44":0.15182,"45":0.15872,"46":0.12422,"47":0.06901,"48":0,"49":0.20703,"50":0,"51":0.17943,"52":0,"53":0,"54":0,"55":0,"56":0.0069,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.04831,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.28294,"80":0.0069,"81":0,"83":0,"84":0.0276,"85":0.0069,"86":0,"87":0,"88":0,"89":0,"90":0.0069,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0.0069,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.0138,"104":0,"105":0.33815,"106":0.0069,"107":0.35195,"108":0.11732,"109":1.22148,"110":0.15872,"111":0.0069,"112":0.11042,"113":0.0069,"114":0.04831,"115":0.12422,"116":13.41554,"117":4.30622,"118":0.03451,"119":0,"120":0},F:{"9":0,"11":0.0138,"12":0.0207,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0.0207,"21":0,"22":0,"23":0.0069,"24":0.0069,"25":0,"26":0.0069,"27":0.0069,"28":0.0069,"29":0,"30":0.03451,"31":0.04141,"32":0.0207,"33":0.0138,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.0069,"69":0.0069,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.0207,"78":0.0069,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.0069,"96":0,"97":0,"98":0,"99":0.0069,"100":0.05521,"101":0.33125,"102":0.697,"9.5-9.6":0.0069,"10.0-10.1":0.0138,"10.5":0,"10.6":0,"11.1":0.0069,"11.5":0.0069,"11.6":0.0069,"12.1":0.0276},B:{"12":0.06901,"13":0.0069,"14":0.08281,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.0138,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0.0138,"106":0,"107":0.31745,"108":0,"109":0.0069,"110":0,"111":0,"112":0,"113":0.0069,"114":0.0138,"115":0.6556,"116":2.91222,"117":2.82251},E:{"4":0.0276,"5":0.0207,"6":0,"7":0.0069,"8":0.0276,"9":0.25534,"10":0,"11":0,"12":0,"13":0.0069,"14":0.11042,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.03451,"6.1":0.0069,"7.1":0.0069,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.12422,"14.1":1.33189,"15.1":0.06211,"15.2-15.3":0.03451,"15.4":0,"15.5":0.04831,"15.6":0.35885,"16.0":0.24844,"16.1":0.17943,"16.2":0.07591,"16.3":0.16562,"16.4":0.04831,"16.5":0.31055,"16.6":1.54582,"17.0":0.06211,"17.1":0},G:{"8":0.02369,"3.2":0.01723,"4.0-4.1":0,"4.2-4.3":0.02369,"5.0-5.1":0.07537,"6.0-6.1":0.04738,"7.0-7.1":0.29072,"8.1-8.4":0.46731,"9.0-9.2":0.01507,"9.3":0.10552,"10.0-10.2":0.01723,"10.3":0.13136,"11.0-11.2":1.05521,"11.3-11.4":0.00646,"12.0-12.1":0.34456,"12.2-12.5":0.27995,"13.0-13.1":0,"13.2":0.01938,"13.3":0.00861,"13.4-13.7":0.00431,"14.0-14.4":0.09691,"14.5-14.8":0.10552,"15.0-15.1":0.04307,"15.2-15.3":0.07537,"15.4":0.28641,"15.5":0.05168,"15.6-15.7":0.94107,"16.0":1.24902,"16.1":0.53622,"16.2":0.34456,"16.3":0.81402,"16.4":0.15505,"16.5":0.20027,"16.6":12.08751,"17.0":1.44499,"17.1":0.00431},P:{"4":0.14549,"20":0,"21":0,"22":3.13834,"5.0-5.4":0,"6.2-6.4":0.15588,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0,"17.0":0,"18.0":0,"19.0":0.03118},I:{"0":0,"3":0.04036,"4":0.44968,"2.1":0.08936,"2.2":0.18304,"2.3":0.25943,"4.1":0.3214,"4.2-4.3":0.61398,"4.4":0,"4.4.3-4.4.4":1.43839},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.06255,"7":0.10425,"8":0.95909,"9":0.21545,"10":0.1529,"11":0.38225,"5.5":0.00695},S:{"2.5":0.06508,_:"3.0-3.1"},J:{"7":0,"10":0.09297},N:{"10":0.19562,"11":0.11737},L:{"0":19.79318},R:{_:"0"},M:{"0":0.24172},Q:{"13.1":0.0062},O:{"0":0.27581},H:{"0":0.44009}};
    +module.exports={C:{"2":0.01948,"3":0.03247,"4":0.02598,"5":0.01299,"6":0.01299,"10":0.01299,"11":0.00649,"12":0.01299,"13":0.00649,"14":0.01299,"15":0.02598,"16":0.00649,"17":0.01299,"18":0.01299,"19":0.01299,"20":0.00649,"21":0.00649,"22":0.00649,"23":0.00649,"24":0.01299,"25":0.00649,"26":0.01299,"28":0.00649,"31":0.01299,"32":0.01299,"33":0.00649,"34":0.01299,"35":0.01299,"36":0.01299,"37":0.01299,"38":0.03896,"39":0.01948,"40":0.05845,"41":0.05195,"42":0.00649,"52":0.00649,"77":0.01948,"78":0.00649,"102":0.00649,"106":0.00649,"107":1.33127,"108":0.00649,"112":0.00649,"113":0.00649,"114":0.00649,"115":0.25327,"116":0.00649,"117":0.01948,"118":0.03247,"119":5.50691,"120":1.82481,_:"7 8 9 27 29 30 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 103 104 105 109 110 111 121 122 123","3.5":0.01299,"3.6":0.07793},D:{"6":0.00649,"7":0.01299,"8":0.01948,"10":0.00649,"11":0.00649,"15":0.00649,"16":0.00649,"17":0.01299,"19":0.00649,"20":0.00649,"21":0.01948,"22":0.00649,"24":0.00649,"25":0.00649,"26":0.00649,"27":0.01299,"28":0.01948,"30":0.00649,"31":0.01299,"32":0.00649,"33":0.02598,"34":0.01299,"35":0.00649,"36":0.01299,"37":0.03247,"38":0.01948,"39":0.04546,"40":0.06494,"41":0.07143,"42":0.03247,"43":0.12988,"44":0.14936,"45":0.11689,"46":0.09092,"47":0.09092,"49":0.28574,"51":0.14936,"70":0.05195,"73":0.07143,"79":0.31821,"84":0.00649,"85":0.00649,"88":0.00649,"89":0.01299,"90":0.01299,"98":0.01299,"99":0.00649,"103":0.00649,"105":0.00649,"106":0.00649,"107":2.83788,"108":1.68195,"109":1.74689,"110":1.35725,"111":1.75987,"112":4.33799,"114":0.06494,"115":0.04546,"116":3.85744,"117":0.18833,"118":3.247,"119":11.98143,_:"4 5 9 12 13 14 18 23 29 48 50 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 71 72 74 75 76 77 78 80 81 83 86 87 91 92 93 94 95 96 97 100 101 102 104 113 120 121 122"},F:{"11":0.01948,"12":0.00649,"24":0.00649,"26":0.00649,"27":0.00649,"30":0.00649,"31":0.03247,"32":0.01948,"102":0.44159,"103":0.05195,"104":1.46115,_:"9 15 16 17 18 19 20 21 22 23 25 28 29 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 10.0-10.1 10.5 10.6 11.1 11.5","9.5-9.6":0.00649,"11.6":0.00649,"12.1":0.02598},B:{"12":0.01948,"13":0.00649,"18":0.00649,"92":0.00649,"107":0.47406,"108":0.00649,"109":0.03896,"115":0.00649,"116":0.05845,"117":0.20781,"118":1.6235,"119":5.7342,_:"14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 110 111 112 113 114"},E:{"4":0.01948,"5":0.01299,"6":0.01299,"7":0.00649,"8":0.01299,"9":0.31171,"13":0.03247,"14":0.06494,"15":0.00649,_:"0 10 11 12 3.1 3.2 7.1 9.1 10.1 11.1","5.1":0.01299,"6.1":0.00649,"12.1":0.00649,"13.1":0.08442,"14.1":0.92215,"15.1":0.15586,"15.2-15.3":0.00649,"15.4":0.06494,"15.5":0.01948,"15.6":0.4286,"16.0":0.07143,"16.1":0.11689,"16.2":0.03247,"16.3":0.20131,"16.4":0.04546,"16.5":0.16235,"16.6":1.18191,"17.0":0.30522,"17.1":0.85721,"17.2":0.03247},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00273,"5.0-5.1":0.00273,"6.0-6.1":0.00683,"7.0-7.1":0.00956,"8.1-8.4":0.00137,"9.0-9.2":0.01092,"9.3":0.03414,"10.0-10.2":0.00273,"10.3":0.04916,"11.0-11.2":0.02321,"11.3-11.4":0.02048,"12.0-12.1":0.01229,"12.2-12.5":0.22395,"13.0-13.1":0.00546,"13.2":0.02321,"13.3":0.01366,"13.4-13.7":0.0396,"14.0-14.4":0.10515,"14.5-14.8":0.17069,"15.0-15.1":0.06691,"15.2-15.3":0.08193,"15.4":0.09149,"15.5":0.12836,"15.6-15.7":0.67458,"16.0":0.31681,"16.1":0.63498,"16.2":0.30452,"16.3":0.5708,"16.4":0.11744,"16.5":0.30315,"16.6-16.7":5.13856,"17.0":1.53897,"17.1":2.58498,"17.2":0.07374},P:{"4":0.07521,"20":0.03223,"21":0.01074,"22":0.15041,"23":2.18101,_:"5.0-5.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 16.0 17.0","6.2-6.4":0.12893,"15.0":0.01074,"18.0":0.01074,"19.0":0.03223},I:{"0":1.48566,"3":0.00015,"4":0.0003,"2.1":0,"2.2":0.0003,"2.3":0,"4.1":0.00015,"4.2-4.3":0.00105,"4.4":0,"4.4.3-4.4.4":0.00448},K:{"0":0.36452,_:"10 11 12 11.1 11.5 12.1"},A:{"6":0.03913,"7":0.05218,"8":0.60658,"9":0.15654,"10":0.1174,"11":0.46309,"5.5":0.00652},N:{_:"10 11"},S:{"2.5":0.05959,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.23484},H:{"0":0},L:{"0":15.56257},R:{_:"0"},M:{"0":0.37504},Q:{"13.1":0.01402}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LK.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LK.js
    index 4e342a3d021c73..00da1ab54a7c67 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LK.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LK.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00419,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0.00839,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.01258,"103":0,"104":0,"105":0.00419,"106":0,"107":0,"108":0,"109":0,"110":0.00419,"111":0,"112":0.00419,"113":0.00839,"114":0.00419,"115":0.13001,"116":0.03355,"117":0.40682,"118":0.04613,"119":0.00419,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00419,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00419,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00419,"65":0,"66":0,"67":0.00419,"68":0,"69":0,"70":0.00419,"71":0,"72":0,"73":0,"74":0.00419,"75":0,"76":0,"77":0,"78":0.00419,"79":0.00419,"80":0.00419,"81":0.01678,"83":0.00419,"84":0,"85":0.00839,"86":0.00419,"87":0.00839,"88":0.00419,"89":0.00419,"90":0.00419,"91":0.00419,"92":0.00839,"93":0.00419,"94":0.00419,"95":0.00419,"96":0.00419,"97":0.00419,"98":0.00419,"99":0.01258,"100":0.00419,"101":0.00419,"102":0.00839,"103":0.02097,"104":0.00839,"105":0.00839,"106":0.02097,"107":0.00839,"108":0.02936,"109":0.91849,"110":0.00839,"111":0.01678,"112":0.01678,"113":0.02097,"114":0.07549,"115":0.10066,"116":6.39166,"117":1.34627,"118":0.00419,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.04613,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0.00419,"55":0,"56":0,"57":0,"58":0.00419,"60":0.00419,"62":0,"63":0.00419,"64":0.00419,"65":0,"66":0.00419,"67":0.00419,"68":0.00419,"69":0.02936,"70":0.02097,"71":0.02516,"72":0.09227,"73":0.02936,"74":0.00419,"75":0,"76":0,"77":0.02516,"78":0,"79":0.00419,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00419,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.03775,"96":0,"97":0,"98":0,"99":0,"100":0.01678,"101":0.15098,"102":0.13421,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00839,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.01258,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0.00419,"107":0.00419,"108":0,"109":0.01258,"110":0,"111":0.00419,"112":0.00419,"113":0.00419,"114":0.02097,"115":0.05872,"116":3.65297,"117":2.54995},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00419,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00419,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00419,"13.1":0.00419,"14.1":0.00839,"15.1":0.00419,"15.2-15.3":0,"15.4":0.00419,"15.5":0.00419,"15.6":0.02097,"16.0":0.00839,"16.1":0.00839,"16.2":0.00419,"16.3":0.01258,"16.4":0.01678,"16.5":0.02097,"16.6":0.0713,"17.0":0.00419,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0.0009,"7.0-7.1":0.01343,"8.1-8.4":0.00358,"9.0-9.2":0.00358,"9.3":0.02775,"10.0-10.2":0.0009,"10.3":0.02775,"11.0-11.2":0.00716,"11.3-11.4":0.00537,"12.0-12.1":0.01522,"12.2-12.5":0.42155,"13.0-13.1":0.01343,"13.2":0.01164,"13.3":0.02596,"13.4-13.7":0.04923,"14.0-14.4":0.1969,"14.5-14.8":0.21928,"15.0-15.1":0.12441,"15.2-15.3":0.1074,"15.4":0.11009,"15.5":0.16826,"15.6-15.7":1.95737,"16.0":0.33563,"16.1":0.39022,"16.2":0.20585,"16.3":0.44392,"16.4":0.22107,"16.5":0.54237,"16.6":2.80225,"17.0":0.43587,"17.1":0},P:{"4":0.3655,"20":0.18275,"21":0.28428,"22":1.23863,"5.0-5.4":0.02031,"6.2-6.4":0.03046,"7.2-7.4":0.78176,"8.2":0.02031,"9.2":0.04061,"10.1":0.01015,"11.1-11.2":0.10153,"12.0":0.02031,"13.0":0.08122,"14.0":0.06092,"15.0":0.04061,"16.0":0.11168,"17.0":0.09137,"18.0":0.11168,"19.0":0.20305},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0.00271,"4.1":0.00677,"4.2-4.3":0.00406,"4.4":0,"4.4.3-4.4.4":0.06904},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00419,"9":0,"10":0,"11":0.02936,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":64.66368},R:{_:"0"},M:{"0":0.15096},Q:{"13.1":0},O:{"0":1.29474},H:{"0":1.34121}};
    +module.exports={C:{"47":0.00437,"52":0.00874,"72":0.00437,"78":0.00437,"88":0.01748,"99":0.00437,"103":0.00437,"108":0.00437,"111":0.00437,"112":0.00437,"113":0.00874,"114":0.00437,"115":0.26657,"116":0.00437,"117":0.0437,"118":0.02185,"119":0.7429,"120":0.23161,"121":0.00437,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 90 91 92 93 94 95 96 97 98 100 101 102 104 105 106 107 109 110 122 123 3.5 3.6"},D:{"22":0.00874,"38":0.00437,"49":0.00437,"51":0.00437,"63":0.00874,"66":0.00437,"67":0.00437,"68":0.00437,"69":0.00437,"70":0.00874,"71":0.00437,"74":0.01311,"75":0.00437,"77":0.00437,"78":0.00437,"79":0.00874,"80":0.00874,"81":0.01748,"83":0.00437,"84":0.00437,"85":0.01311,"86":0.01311,"87":0.01311,"88":0.00874,"89":0.00874,"90":0.00874,"91":0.00874,"92":0.00874,"93":0.00874,"94":0.00437,"95":0.00874,"96":0.00874,"97":0.00437,"98":0.00874,"99":0.01311,"100":0.00874,"101":0.00437,"102":0.01748,"103":0.03496,"104":0.00874,"105":0.01311,"106":0.02622,"107":0.02185,"108":0.02622,"109":1.98398,"110":0.01748,"111":0.02185,"112":0.02185,"113":0.02185,"114":0.06118,"115":0.03933,"116":0.14858,"117":0.19665,"118":3.48289,"119":16.25203,"120":0.00874,"121":0.01311,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 47 48 50 52 53 54 55 56 57 58 59 60 61 62 64 65 72 73 76 122"},F:{"79":0.00437,"85":0.00437,"95":0.09177,"102":0.0874,"103":0.10925,"104":0.36708,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00437,"16":0.00437,"18":0.01748,"84":0.00437,"89":0.00437,"92":0.02622,"100":0.00437,"107":0.00437,"109":0.02185,"111":0.00437,"112":0.00437,"113":0.00437,"114":0.01311,"115":0.02185,"116":0.02622,"117":0.11799,"118":3.33868,"119":13.31102,_:"13 14 15 17 79 80 81 83 85 86 87 88 90 91 93 94 95 96 97 98 99 101 102 103 104 105 106 108 110"},E:{"9":0.00437,"13":0.00437,"14":0.00437,_:"0 4 5 6 7 8 10 11 12 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1 12.1 15.2-15.3 17.2","5.1":0.00437,"13.1":0.00874,"14.1":0.01748,"15.1":0.00437,"15.4":0.00437,"15.5":0.00437,"15.6":0.0437,"16.0":0.00437,"16.1":0.01311,"16.2":0.00874,"16.3":0.01311,"16.4":0.03496,"16.5":0.03496,"16.6":0.07866,"17.0":0.05244,"17.1":0.07429},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00096,"5.0-5.1":0.00096,"6.0-6.1":0.00239,"7.0-7.1":0.00334,"8.1-8.4":0.00048,"9.0-9.2":0.00382,"9.3":0.01194,"10.0-10.2":0.00096,"10.3":0.01719,"11.0-11.2":0.00812,"11.3-11.4":0.00716,"12.0-12.1":0.0043,"12.2-12.5":0.07831,"13.0-13.1":0.00191,"13.2":0.00812,"13.3":0.00478,"13.4-13.7":0.01385,"14.0-14.4":0.03677,"14.5-14.8":0.05969,"15.0-15.1":0.0234,"15.2-15.3":0.02865,"15.4":0.03199,"15.5":0.04489,"15.6-15.7":0.23589,"16.0":0.11078,"16.1":0.22204,"16.2":0.10648,"16.3":0.1996,"16.4":0.04107,"16.5":0.10601,"16.6-16.7":1.79687,"17.0":0.53815,"17.1":0.90392,"17.2":0.02579},P:{"4":0.40721,"20":0.12216,"21":0.15271,"22":0.50902,"23":0.82461,"5.0-5.4":0.01018,"6.2-6.4":0.03054,"7.2-7.4":0.73298,"8.2":0.01018,"9.2":0.04072,"10.1":0.02036,"11.1-11.2":0.09162,"12.0":0.02036,"13.0":0.06108,"14.0":0.07126,"15.0":0.03054,"16.0":0.09162,"17.0":0.08144,"18.0":0.1018,"19.0":0.19343},I:{"0":0.05043,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00004,"4.4":0,"4.4.3-4.4.4":0.00015},K:{"0":1.51726,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00874,"11":0.03496,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":1.35144},H:{"0":0.02},L:{"0":46.07191},R:{_:"0"},M:{"0":0.12951},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LR.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LR.js
    index 9a084b4dfa0da0..a201cb61e39774 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LR.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LR.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.0021,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.0021,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.0042,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.01469,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.09446,"116":0.01469,"117":0.11964,"118":0.0105,"119":0.0021,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.0021,"41":0,"42":0,"43":0.0042,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.0021,"57":0,"58":0,"59":0.0021,"60":0,"61":0,"62":0,"63":0,"64":0.0042,"65":0.0063,"66":0.0021,"67":0.0042,"68":0.0021,"69":0,"70":0.0021,"71":0,"72":0.0042,"73":0,"74":0.0021,"75":0.0084,"76":0.0042,"77":0.0042,"78":0,"79":0.0021,"80":0.0084,"81":0.0021,"83":0.0021,"84":0.0063,"85":0.0021,"86":0,"87":0.0021,"88":0.0042,"89":0.04198,"90":0.0042,"91":0,"92":0.0063,"93":0.0105,"94":0.0084,"95":0.0021,"96":0,"97":0,"98":0.0021,"99":0.02729,"100":0,"101":0,"102":0.0042,"103":0.02309,"104":0,"105":0.0063,"106":0.0021,"107":0.0021,"108":0.0063,"109":0.10705,"110":0.0021,"111":0.0042,"112":0.0042,"113":0.0063,"114":0.02939,"115":0.03358,"116":0.77243,"117":0.16582,"118":0.0021,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.0063,"30":0,"31":0.0021,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0.0021,"51":0,"52":0,"53":0,"54":0,"55":0.0063,"56":0,"57":0,"58":0.0021,"60":0.02309,"62":0,"63":0.0105,"64":0.0084,"65":0.0105,"66":0.02099,"67":0.01679,"68":0.0105,"69":0.05248,"70":0.02309,"71":0.16582,"72":0.16792,"73":0.03149,"74":0,"75":0,"76":0,"77":0.0021,"78":0,"79":0.0021,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.0042,"96":0,"97":0,"98":0.0021,"99":0.0021,"100":0.0021,"101":0.02729,"102":0.04198,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.01469},B:{"12":0.0042,"13":0.0042,"14":0.0021,"15":0.0021,"16":0,"17":0.0021,"18":0.02939,"79":0,"80":0,"81":0,"83":0,"84":0.0021,"85":0.0021,"86":0,"87":0,"88":0,"89":0.0021,"90":0.0042,"91":0,"92":0.0063,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.0021,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.0063,"110":0,"111":0.0021,"112":0.0042,"113":0.0021,"114":0.01679,"115":0.03149,"116":0.22879,"117":0.13224},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.0021,"13":0.0021,"14":0.0063,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0.0042,"12.1":0,"13.1":0.0042,"14.1":0.0042,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0.0063,"16.0":0,"16.1":0,"16.2":0,"16.3":0.0021,"16.4":0.0084,"16.5":0.0021,"16.6":0.01469,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00087,"6.0-6.1":0,"7.0-7.1":0.0358,"8.1-8.4":0,"9.0-9.2":0.00698,"9.3":0.07421,"10.0-10.2":0,"10.3":0.04715,"11.0-11.2":0.00349,"11.3-11.4":0.13445,"12.0-12.1":0.01746,"12.2-12.5":0.72202,"13.0-13.1":0.13358,"13.2":0.02706,"13.3":0.0227,"13.4-13.7":0.31517,"14.0-14.4":0.56749,"14.5-14.8":0.77615,"15.0-15.1":0.58146,"15.2-15.3":0.17112,"15.4":0.1554,"15.5":0.24795,"15.6-15.7":0.91497,"16.0":0.16763,"16.1":0.21215,"16.2":0.27501,"16.3":0.27676,"16.4":0.24009,"16.5":0.87655,"16.6":1.43618,"17.0":0.24708,"17.1":0},P:{"4":0.03146,"20":0.05243,"21":0.13633,"22":0.51385,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.06292,"8.2":0,"9.2":0.01049,"10.1":0,"11.1-11.2":0.05243,"12.0":0,"13.0":0.01049,"14.0":0.05243,"15.0":0.01049,"16.0":0.08389,"17.0":0.01049,"18.0":0.01049,"19.0":0.11535},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00641,"4.4":0,"4.4.3-4.4.4":0.05927},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.02729,"5.5":0},S:{"2.5":0.11061,_:"3.0-3.1"},J:{"7":0,"10":0.0079},N:{"10":0,"11":0},L:{"0":75.02708},R:{_:"0"},M:{"0":0.09481},Q:{"13.1":0.0079},O:{"0":0.83751},H:{"0":8.61714}};
    +module.exports={C:{"33":0.00167,"34":0.00334,"45":0.00167,"46":0.00334,"54":0.00167,"58":0.00501,"66":0.00167,"72":0.00334,"94":0.01336,"108":0.04342,"114":0.00167,"115":0.23547,"116":0.00334,"117":0.00334,"118":0.02171,"119":0.49432,"120":0.24048,"121":0.00334,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 35 36 37 38 39 40 41 42 43 44 47 48 49 50 51 52 53 55 56 57 59 60 61 62 63 64 65 67 68 69 70 71 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 95 96 97 98 99 100 101 102 103 104 105 106 107 109 110 111 112 113 122 123 3.5 3.6"},D:{"11":0.00501,"47":0.00167,"50":0.01169,"55":0.00835,"58":0.00334,"59":0.00167,"60":0.00167,"61":0.00167,"62":0.00334,"63":0.00167,"64":0.01336,"65":0.00167,"66":0.02171,"67":0.01503,"70":0.00501,"71":0.01169,"72":0.00334,"74":0.01169,"75":0.02338,"76":0.00668,"77":0.01169,"79":0.00835,"80":0.05678,"81":0.02171,"83":0.02839,"84":0.00167,"86":0.00334,"87":0.00334,"88":0.01336,"89":0.05344,"90":0.02004,"91":0.02004,"92":0.04175,"93":0.0835,"94":0.03173,"95":0.02171,"96":0.01503,"98":0.00668,"99":0.0167,"100":0.00167,"102":0.0167,"103":0.03674,"104":0.00835,"105":0.0501,"106":0.02171,"107":0.00501,"108":0.01169,"109":0.4843,"111":0.00501,"112":0.01169,"113":0.00835,"114":0.04509,"115":0.1002,"116":0.09352,"117":0.21376,"118":1.18403,"119":3.81762,"120":0.02004,"121":0.00334,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 48 49 51 52 53 54 56 57 68 69 73 78 85 97 101 110 122"},F:{"21":0.00501,"40":0.00167,"46":0.00167,"77":0.00167,"79":0.00501,"90":0.00167,"95":0.05177,"99":0.00167,"101":0.00167,"102":0.01837,"103":0.10855,"104":0.17535,_:"9 11 12 15 16 17 18 19 20 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 78 80 81 82 83 84 85 86 87 88 89 91 92 93 94 96 97 98 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.02004,"13":0.01169,"14":0.00334,"15":0.00668,"16":0.00835,"17":0.00167,"18":0.18537,"80":0.00167,"84":0.0167,"85":0.0334,"89":0.01336,"90":0.02839,"91":0.00167,"92":0.07682,"98":0.00501,"100":0.00835,"103":0.00668,"105":0.01002,"107":0.00334,"108":0.00668,"109":0.05177,"110":0.00501,"111":0.00334,"112":0.01336,"113":0.00835,"114":0.04175,"115":0.04342,"116":0.03006,"117":0.07849,"118":0.46593,"119":1.70507,_:"79 81 83 86 87 88 93 94 95 96 97 99 101 102 104 106"},E:{"13":0.00501,"14":0.01503,_:"0 4 5 6 7 8 9 10 11 12 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 16.0","12.1":0.00167,"13.1":0.00501,"14.1":0.01002,"15.1":0.00835,"15.2-15.3":0.00334,"15.4":0.00501,"15.5":0.01169,"15.6":0.06179,"16.1":0.00167,"16.2":0.00167,"16.3":0.01002,"16.4":0.01169,"16.5":0.01169,"16.6":0.04509,"17.0":0.01002,"17.1":0.1002,"17.2":0.00334},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00137,"5.0-5.1":0.00137,"6.0-6.1":0.00343,"7.0-7.1":0.0048,"8.1-8.4":0.00069,"9.0-9.2":0.00548,"9.3":0.01714,"10.0-10.2":0.00137,"10.3":0.02468,"11.0-11.2":0.01165,"11.3-11.4":0.01028,"12.0-12.1":0.00617,"12.2-12.5":0.11243,"13.0-13.1":0.00274,"13.2":0.01165,"13.3":0.00686,"13.4-13.7":0.01988,"14.0-14.4":0.05279,"14.5-14.8":0.08569,"15.0-15.1":0.03359,"15.2-15.3":0.04113,"15.4":0.04593,"15.5":0.06444,"15.6-15.7":0.33867,"16.0":0.15905,"16.1":0.31878,"16.2":0.15288,"16.3":0.28656,"16.4":0.05896,"16.5":0.15219,"16.6-16.7":2.57976,"17.0":0.77262,"17.1":1.29776,"17.2":0.03702},P:{"4":0.09371,"20":0.04165,"21":0.07289,"22":0.18743,"23":0.35403,_:"5.0-5.4 6.2-6.4 8.2 10.1","7.2-7.4":0.04165,"9.2":0.03124,"11.1-11.2":0.03124,"12.0":0.03124,"13.0":0.01041,"14.0":0.11454,"15.0":0.01041,"16.0":0.02083,"17.0":0.02083,"18.0":0.02083,"19.0":0.04165},I:{"0":0.01658,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00005},K:{"0":3.89944,_:"10 11 12 11.1 11.5 12.1"},A:{"7":0.01202,"10":0.00687,"11":0.04123,_:"6 8 9 5.5"},N:{_:"10 11"},S:{"2.5":0.11662,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":1.9992},H:{"0":5.83},L:{"0":68.15317},R:{_:"0"},M:{"0":0.07497},Q:{"13.1":0.00833}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LS.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LS.js
    index fcbf98a16c1f8c..d1b1698787e6fa 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LS.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LS.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00318,"100":0,"101":0,"102":0.00318,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0.00318,"113":0.00318,"114":0,"115":0.03175,"116":0.0127,"117":0.15558,"118":0.00953,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00635,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00318,"47":0,"48":0,"49":0.00318,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.03175,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0.00318,"62":0,"63":0,"64":0,"65":0,"66":0.00318,"67":0,"68":0,"69":0,"70":0.00318,"71":0.00318,"72":0.00318,"73":0,"74":0.00318,"75":0.0127,"76":0,"77":0.00953,"78":0,"79":0.00635,"80":0,"81":0.01905,"83":0.00318,"84":0.00318,"85":0,"86":0,"87":0,"88":0,"89":0.00318,"90":0,"91":0.00953,"92":0.00318,"93":0,"94":0.0127,"95":0.00318,"96":0,"97":0,"98":0.00318,"99":0.02858,"100":0,"101":0,"102":0.00318,"103":0.03175,"104":0.00635,"105":0.00318,"106":0.00318,"107":0,"108":0.00318,"109":0.4445,"110":0.00318,"111":0.00953,"112":0.0381,"113":0.0127,"114":0.04763,"115":0.09843,"116":2.92735,"117":0.60008,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.02858,"27":0,"28":0.00953,"29":0,"30":0.00318,"31":0.00318,"32":0.00635,"33":0,"34":0,"35":0.04763,"36":0,"37":0,"38":0.00635,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.0508,"47":0.00318,"48":0,"49":0,"50":0.02223,"51":0.00318,"52":0,"53":0,"54":0,"55":0.00318,"56":0.06985,"57":0.00318,"58":0.00635,"60":0.01588,"62":0,"63":0.02223,"64":0.05715,"65":0.0127,"66":0.01588,"67":0.02858,"68":0.01905,"69":0.17145,"70":0.08255,"71":0.15558,"72":0.3175,"73":0.0381,"74":0.00635,"75":0,"76":0.07303,"77":0.00635,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.04128,"96":0,"97":0,"98":0,"99":0.00318,"100":0.00635,"101":0.16828,"102":0.17145,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00635},B:{"12":0.0127,"13":0.00318,"14":0,"15":0.00635,"16":0.00318,"17":0.00318,"18":0.00635,"79":0,"80":0,"81":0,"83":0,"84":0.00318,"85":0,"86":0,"87":0,"88":0,"89":0.00953,"90":0.00635,"91":0,"92":0.0127,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00318,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00318,"109":0.03175,"110":0.00318,"111":0.00318,"112":0.00318,"113":0.00953,"114":0.01588,"115":0.02223,"116":0.4445,"117":0.33655},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00318,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00953,"14.1":0,"15.1":0,"15.2-15.3":0.00318,"15.4":0,"15.5":0,"15.6":0.00318,"16.0":0,"16.1":0,"16.2":0,"16.3":0.00635,"16.4":0.00953,"16.5":0.00635,"16.6":0.0889,"17.0":0.00318,"17.1":0},G:{"8":0.00533,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00376,"6.0-6.1":0,"7.0-7.1":0.0069,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.07428,"10.0-10.2":0,"10.3":0.01692,"11.0-11.2":0.00282,"11.3-11.4":0.00094,"12.0-12.1":0,"12.2-12.5":0.14793,"13.0-13.1":0.00063,"13.2":0.00094,"13.3":0.00533,"13.4-13.7":0.01442,"14.0-14.4":0.07835,"14.5-14.8":0.05203,"15.0-15.1":0.17207,"15.2-15.3":0.11941,"15.4":0.03385,"15.5":0.04231,"15.6-15.7":0.73277,"16.0":0.04513,"16.1":0.17426,"16.2":0.04357,"16.3":0.06989,"16.4":0.01786,"16.5":0.12411,"16.6":1.04431,"17.0":0.09747,"17.1":0},P:{"4":0.36173,"20":0.06029,"21":0.39187,"22":1.10527,"5.0-5.4":0,"6.2-6.4":0.19091,"7.2-7.4":0.78374,"8.2":0,"9.2":0.01005,"10.1":0.01005,"11.1-11.2":0.09043,"12.0":0,"13.0":0.0201,"14.0":0.0201,"15.0":0.01005,"16.0":0.19091,"17.0":0.04019,"18.0":0.06029,"19.0":0.27129},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00135,"4.2-4.3":0.00135,"4.4":0,"4.4.3-4.4.4":0.07001},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01588,"5.5":0},S:{"2.5":0.0819,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":75.20503},R:{_:"0"},M:{"0":0.04095},Q:{"13.1":0.34808},O:{"0":0.96233},H:{"0":6.16424}};
    +module.exports={C:{"21":0.00328,"38":0.00328,"47":0.00328,"50":0.00656,"52":0.01639,"86":0.00328,"99":0.00656,"109":0.00328,"110":0.00328,"112":0.00328,"115":0.08523,"116":0.03606,"118":0.03606,"119":0.41631,"120":0.12784,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 48 49 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 87 88 89 90 91 92 93 94 95 96 97 98 100 101 102 103 104 105 106 107 108 111 113 114 117 121 122 123 3.5 3.6"},D:{"46":0.00328,"49":0.00328,"56":0.00328,"63":0.01639,"69":0.00328,"70":0.01311,"74":0.00983,"75":0.00328,"78":0.01311,"79":0.00656,"80":0.00656,"81":0.02295,"83":0.00656,"84":0.01311,"86":0.00656,"87":0.00656,"88":0.01639,"90":0.01967,"93":0.01311,"94":0.00328,"95":0.00656,"96":0.00983,"99":0.14751,"101":0.00328,"102":0.00983,"103":0.07212,"104":0.01311,"105":0.01967,"106":0.01639,"107":0.00328,"108":0.03278,"109":1.35381,"110":0.00328,"111":0.00656,"112":0.05573,"113":0.02622,"114":0.08851,"115":0.02622,"116":0.11801,"117":0.2229,"118":2.48472,"119":8.74243,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 50 51 52 53 54 55 57 58 59 60 61 62 64 65 66 67 68 71 72 73 76 77 85 89 91 92 97 98 100 120 121 122"},F:{"37":0.00656,"76":0.05573,"79":0.00328,"83":0.00983,"95":0.09834,"102":0.01311,"103":0.29502,"104":0.53431,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 77 78 80 81 82 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.01639,"13":0.01311,"14":0.00656,"15":0.00656,"16":0.00656,"17":0.00656,"18":0.03606,"84":0.00983,"89":0.00656,"90":0.00328,"92":0.01967,"99":0.01311,"100":0.18029,"103":0.00983,"108":0.01311,"109":0.04261,"110":0.00656,"112":0.00656,"113":0.00983,"114":0.02622,"115":0.01311,"116":0.01311,"117":0.05245,"118":0.54087,"119":2.42572,_:"79 80 81 83 85 86 87 88 91 93 94 95 96 97 98 101 102 104 105 106 107 111"},E:{"14":0.00328,"15":0.00983,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 6.1 7.1 9.1 10.1 11.1 15.1 15.2-15.3 15.5 16.2 17.2","5.1":0.00328,"12.1":0.00328,"13.1":0.02295,"14.1":0.00328,"15.4":0.05245,"15.6":0.01311,"16.0":0.00328,"16.1":0.00656,"16.3":0.0295,"16.4":0.01639,"16.5":0.00983,"16.6":0.04589,"17.0":0.06228,"17.1":0.06884},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00044,"5.0-5.1":0.00044,"6.0-6.1":0.0011,"7.0-7.1":0.00154,"8.1-8.4":0.00022,"9.0-9.2":0.00176,"9.3":0.0055,"10.0-10.2":0.00044,"10.3":0.00791,"11.0-11.2":0.00374,"11.3-11.4":0.0033,"12.0-12.1":0.00198,"12.2-12.5":0.03605,"13.0-13.1":0.00088,"13.2":0.00374,"13.3":0.0022,"13.4-13.7":0.00637,"14.0-14.4":0.01693,"14.5-14.8":0.02748,"15.0-15.1":0.01077,"15.2-15.3":0.01319,"15.4":0.01473,"15.5":0.02066,"15.6-15.7":0.10859,"16.0":0.051,"16.1":0.10221,"16.2":0.04902,"16.3":0.09188,"16.4":0.0189,"16.5":0.0488,"16.6-16.7":0.82714,"17.0":0.24773,"17.1":0.4161,"17.2":0.01187},P:{"4":0.45228,"20":0.07035,"21":0.17086,"22":0.30152,"23":0.72364,_:"5.0-5.4 8.2","6.2-6.4":0.0201,"7.2-7.4":0.65329,"9.2":0.01005,"10.1":0.01005,"11.1-11.2":0.0804,"12.0":0.01005,"13.0":0.03015,"14.0":0.0201,"15.0":0.01005,"16.0":0.09046,"17.0":0.0201,"18.0":0.12061,"19.0":0.33167},I:{"0":0.08695,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00026},K:{"0":4.7637,_:"10 11 12 11.1 11.5 12.1"},A:{"10":0.00328,"11":0.03278,_:"6 7 8 9 5.5"},N:{_:"10 11"},S:{"2.5":0.08739,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.96125},H:{"0":0.95},L:{"0":68.01169},R:{_:"0"},M:{"0":0.08739},Q:{"13.1":0.02017}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LT.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LT.js
    index 3590007165e0f0..46820469fe15e0 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LT.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LT.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.01458,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.02916,"53":0,"54":0,"55":0.01458,"56":0,"57":0,"58":0,"59":0,"60":0.00729,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.02916,"78":0.00729,"79":0,"80":0.00729,"81":0.00729,"82":0,"83":0.00729,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.00729,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00729,"101":0,"102":0.04374,"103":0,"104":0.01458,"105":0.01458,"106":0.01458,"107":0.00729,"108":0.01458,"109":0.00729,"110":0.00729,"111":0.01458,"112":0.00729,"113":0.00729,"114":0.00729,"115":0.37908,"116":0.18954,"117":1.61838,"118":0.12393,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0.00729,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00729,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.00729,"64":0.00729,"65":0,"66":0.00729,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0.00729,"74":0.03645,"75":0,"76":0.02916,"77":0,"78":0.02916,"79":0.05832,"80":0.03645,"81":0.01458,"83":0.00729,"84":0.00729,"85":0.05103,"86":0.02916,"87":0.05103,"88":0.01458,"89":0.00729,"90":0.03645,"91":0.03645,"92":0.01458,"93":0.02916,"94":0.02187,"95":0.01458,"96":0.00729,"97":0.02916,"98":0.05832,"99":0.02187,"100":0.00729,"101":0.00729,"102":0.02916,"103":0.05832,"104":0.01458,"105":0.00729,"106":0.05103,"107":0.03645,"108":0.0729,"109":2.21616,"110":0.05832,"111":0.05832,"112":0.06561,"113":0.05832,"114":0.63423,"115":1.2393,"116":28.68615,"117":6.0507,"118":0.00729,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00729,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0.00729,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00729,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.03645,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00729,"86":0.00729,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.08019,"96":0,"97":0,"98":0,"99":0.02916,"100":0.22599,"101":0.68526,"102":0.75087,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0.00729,"83":0,"84":0,"85":0.00729,"86":0,"87":0,"88":0.00729,"89":0,"90":0.00729,"91":0,"92":0.05103,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.02187,"103":0,"104":0,"105":0,"106":0.00729,"107":0.00729,"108":0.02187,"109":0.06561,"110":0.02187,"111":0.01458,"112":0.01458,"113":0.03645,"114":0.06561,"115":0.21141,"116":3.73977,"117":2.32551},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00729,"10":0,"11":0,"12":0,"13":0,"14":0.03645,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.01458,"10.1":0,"11.1":0,"12.1":0.00729,"13.1":0.03645,"14.1":0.05103,"15.1":0.01458,"15.2-15.3":0.00729,"15.4":0.01458,"15.5":0.02187,"15.6":0.10206,"16.0":0.00729,"16.1":0.03645,"16.2":0.02916,"16.3":0.05103,"16.4":0.04374,"16.5":0.10206,"16.6":0.37908,"17.0":0.02916,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00416,"6.0-6.1":0.00277,"7.0-7.1":0.00277,"8.1-8.4":0.00555,"9.0-9.2":0.00277,"9.3":0.01525,"10.0-10.2":0.02219,"10.3":0.08459,"11.0-11.2":0.01941,"11.3-11.4":0.00555,"12.0-12.1":0.00693,"12.2-12.5":0.0624,"13.0-13.1":0.00832,"13.2":0.00277,"13.3":1.14957,"13.4-13.7":0.05131,"14.0-14.4":0.06933,"14.5-14.8":0.09429,"15.0-15.1":0.03744,"15.2-15.3":0.03883,"15.4":0.05824,"15.5":0.11787,"15.6-15.7":0.68641,"16.0":0.48257,"16.1":0.87084,"16.2":0.41046,"16.3":0.74188,"16.4":0.17472,"16.5":0.52278,"16.6":6.94593,"17.0":1.03308,"17.1":0.00277},P:{"4":0.05128,"20":0.09231,"21":0.14359,"22":1.90774,"5.0-5.4":0.01026,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0.01026,"15.0":0,"16.0":0.01026,"17.0":0.02051,"18.0":0.01026,"19.0":0.03077},I:{"0":0,"3":0,"4":0.01019,"2.1":0,"2.2":0.00612,"2.3":0.01019,"4.1":0.00815,"4.2-4.3":0.05096,"4.4":0,"4.4.3-4.4.4":0.05504},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.02251,"9":0.0075,"10":0.0075,"11":0.21763,"5.5":0},S:{"2.5":0.00271,_:"3.0-3.1"},J:{"7":0,"10":0.00271},N:{"10":0,"11":0},L:{"0":28.32649},R:{_:"0"},M:{"0":0.14905},Q:{"13.1":0},O:{"0":0.04607},H:{"0":0.2617}};
    +module.exports={C:{"11":0.00721,"52":0.04324,"60":0.00721,"69":0.00721,"77":0.02162,"78":0.00721,"83":0.01441,"94":0.00721,"98":0.00721,"100":0.00721,"102":0.01441,"103":0.00721,"104":0.00721,"106":0.03604,"107":0.00721,"108":0.00721,"109":0.00721,"111":0.01441,"112":0.00721,"113":0.00721,"114":0.00721,"115":0.6126,"116":0.00721,"117":0.06486,"118":0.40359,"119":1.65761,"120":0.50449,_:"2 3 4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 61 62 63 64 65 66 67 68 70 71 72 73 74 75 76 79 80 81 82 84 85 86 87 88 89 90 91 92 93 95 96 97 99 101 105 110 121 122 123 3.5 3.6"},D:{"22":0.00721,"34":0.00721,"41":0.00721,"49":0.01441,"51":0.00721,"56":0.00721,"60":0.00721,"63":0.00721,"64":0.00721,"65":0.00721,"66":0.00721,"72":0.00721,"75":0.00721,"77":0.00721,"79":0.02162,"81":0.00721,"83":0.00721,"85":0.05045,"86":0.01441,"87":0.04324,"88":0.00721,"90":0.00721,"91":0.00721,"92":0.00721,"93":0.01441,"94":0.01441,"96":0.00721,"97":0.00721,"98":0.00721,"99":0.01441,"100":0.02162,"101":0.01441,"102":0.05045,"103":0.18738,"104":0.03604,"105":0.02883,"106":0.07928,"107":0.04324,"108":0.04324,"109":2.63776,"110":0.06486,"111":0.05766,"112":0.06486,"113":0.03604,"114":0.08648,"115":0.10811,"116":0.38197,"117":1.18195,"118":10.82491,"119":37.96648,"120":0.00721,"121":0.00721,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 42 43 44 45 46 47 48 50 52 53 54 55 57 58 59 61 62 67 68 69 70 71 73 74 76 78 80 84 89 95 122"},F:{"87":0.00721,"95":0.16576,"99":0.00721,"102":0.94412,"103":0.23783,"104":1.19636,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 88 89 90 91 92 93 94 96 97 98 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"92":0.02162,"96":0.00721,"102":0.01441,"103":0.00721,"108":0.02162,"109":0.05766,"111":0.02162,"112":0.01441,"113":0.02162,"114":0.06486,"115":0.02162,"116":0.11531,"117":0.18738,"118":2.01075,"119":6.82503,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 97 98 99 100 101 104 105 106 107 110"},E:{"8":0.01441,"9":0.00721,"14":0.03604,_:"0 4 5 6 7 10 11 12 13 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.00721,"13.1":0.03604,"14.1":0.05766,"15.1":0.01441,"15.2-15.3":0.01441,"15.4":0.01441,"15.5":0.01441,"15.6":0.15135,"16.0":0.02162,"16.1":0.06486,"16.2":0.03604,"16.3":0.07207,"16.4":0.05766,"16.5":0.06486,"16.6":0.30269,"17.0":0.19459,"17.1":0.23062,"17.2":0.01441},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.0014,"5.0-5.1":0.0014,"6.0-6.1":0.0035,"7.0-7.1":0.0049,"8.1-8.4":0.0007,"9.0-9.2":0.0056,"9.3":0.01749,"10.0-10.2":0.0014,"10.3":0.02519,"11.0-11.2":0.01189,"11.3-11.4":0.01049,"12.0-12.1":0.0063,"12.2-12.5":0.11474,"13.0-13.1":0.0028,"13.2":0.01189,"13.3":0.007,"13.4-13.7":0.02029,"14.0-14.4":0.05387,"14.5-14.8":0.08746,"15.0-15.1":0.03428,"15.2-15.3":0.04198,"15.4":0.04688,"15.5":0.06577,"15.6-15.7":0.34563,"16.0":0.16232,"16.1":0.32534,"16.2":0.15602,"16.3":0.29245,"16.4":0.06017,"16.5":0.15532,"16.6-16.7":2.63277,"17.0":0.7885,"17.1":1.32443,"17.2":0.03778},P:{"4":0.04158,"20":0.04158,"21":0.08315,"22":0.27025,"23":1.7358,"5.0-5.4":0.01039,_:"6.2-6.4 8.2 9.2 10.1 11.1-11.2 12.0 15.0","7.2-7.4":0.01039,"13.0":0.01039,"14.0":0.01039,"16.0":0.01039,"17.0":0.01039,"18.0":0.01039,"19.0":0.03118},I:{"0":0.07503,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00005,"4.4":0,"4.4.3-4.4.4":0.00023},K:{"0":0.40219,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.02883,"9":0.00721,"11":0.03604,_:"6 7 10 5.5"},N:{_:"10 11"},S:{"2.5":0.00279,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.09217},H:{"0":0},L:{"0":17.86238},R:{_:"0"},M:{"0":0.21785},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LU.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LU.js
    index e8b2af0051ba55..905ebe65285aed 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LU.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LU.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0.00428,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00428,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00856,"49":0,"50":0.00428,"51":0,"52":0.02997,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.00428,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.01285,"69":0,"70":0,"71":0,"72":0.00428,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.05138,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00428,"89":0.00428,"90":0,"91":0.05567,"92":0,"93":0.00428,"94":0,"95":0,"96":0,"97":0.00428,"98":0,"99":0,"100":0,"101":0,"102":1.26319,"103":0.00428,"104":0.00856,"105":0.00856,"106":0,"107":0.00856,"108":0.01713,"109":0.00856,"110":0.01713,"111":0.02569,"112":0.01285,"113":0.02141,"114":0.00856,"115":0.25264,"116":0.10705,"117":1.5929,"118":0.14131,"119":0,"120":0,"3.5":0,"3.6":0.00428},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0.00428,"40":0.00428,"41":0.00428,"42":0.00428,"43":0.00428,"44":0.00856,"45":0.0471,"46":0.00428,"47":0.00428,"48":0.01713,"49":0.01713,"50":0,"51":0.00856,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00428,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00428,"70":0.00428,"71":0.00428,"72":0.09849,"73":0,"74":0.00856,"75":0,"76":0,"77":0,"78":0,"79":0.01285,"80":0.01285,"81":0,"83":0.00428,"84":0.00428,"85":0.00856,"86":0.02141,"87":0.01285,"88":0.00428,"89":0.01713,"90":0.00428,"91":0.00856,"92":0.00856,"93":0,"94":0.00428,"95":0.00428,"96":0.01285,"97":0.00856,"98":0.00428,"99":0.01285,"100":0.00428,"101":0.00856,"102":0.00428,"103":0.04282,"104":0.00856,"105":0.10277,"106":0.06851,"107":0.08136,"108":0.12418,"109":0.36397,"110":0.34684,"111":0.06423,"112":0.15415,"113":0.0471,"114":0.14559,"115":0.17556,"116":4.31626,"117":1.56721,"118":0.00428,"119":0.00856,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00428,"29":0,"30":0,"31":0.00428,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00428,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.00428,"68":0,"69":0.00428,"70":0.00428,"71":0.02569,"72":0.0942,"73":0.02141,"74":0,"75":0,"76":0,"77":0.03854,"78":0.00428,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.00856,"90":0,"91":0,"92":0,"93":0,"94":0.00856,"95":0.01713,"96":0.01285,"97":0,"98":0,"99":0,"100":0.05138,"101":0.1199,"102":0.36397,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00428,"13":0,"14":0.00428,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0.00856,"97":0,"98":0,"99":0,"100":0,"101":0.00428,"102":0,"103":0.00856,"104":0,"105":0,"106":0.01285,"107":0.01285,"108":0.00428,"109":0.05138,"110":0.00856,"111":0.02569,"112":0.00856,"113":0.01285,"114":0.08992,"115":0.09849,"116":1.08763,"117":1.17327},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.01285,"10":0,"11":0,"12":0,"13":0.00428,"14":0.03854,"15":0.00428,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00428,"10.1":0,"11.1":0,"12.1":0.06423,"13.1":0.10705,"14.1":0.15843,"15.1":0.00856,"15.2-15.3":0.01285,"15.4":0.02141,"15.5":0.05567,"15.6":0.25692,"16.0":0.05567,"16.1":0.1199,"16.2":0.07279,"16.3":0.23551,"16.4":0.05138,"16.5":0.27405,"16.6":1.10476,"17.0":0.11561,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.13852,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.01283,"8.1-8.4":0.02565,"9.0-9.2":0.44891,"9.3":0.03335,"10.0-10.2":0,"10.3":0.04104,"11.0-11.2":0.08978,"11.3-11.4":0.00257,"12.0-12.1":0.02822,"12.2-12.5":0.13596,"13.0-13.1":0.0077,"13.2":0.00513,"13.3":0.01796,"13.4-13.7":0.04617,"14.0-14.4":0.17957,"14.5-14.8":0.45148,"15.0-15.1":0.1103,"15.2-15.3":0.13083,"15.4":0.10774,"15.5":0.27961,"15.6-15.7":1.13896,"16.0":0.73109,"16.1":1.62379,"16.2":0.64131,"16.3":1.24926,"16.4":0.20522,"16.5":0.72596,"16.6":14.85263,"17.0":1.88544,"17.1":0},P:{"4":0.12289,"20":0.10241,"21":0.13313,"22":3.35904,"5.0-5.4":0,"6.2-6.4":0.01024,"7.2-7.4":0.02048,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0.01024,"14.0":0.01024,"15.0":0,"16.0":0.02048,"17.0":0.01024,"18.0":0.03072,"19.0":0.03072},I:{"0":0,"3":0.05328,"4":0.01724,"2.1":0.02664,"2.2":0.08148,"2.3":0.01254,"4.1":0.06581,"4.2-4.3":0.06738,"4.4":0,"4.4.3-4.4.4":0.24132},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0.00467,"8":0.04204,"9":0.00934,"10":0.00934,"11":0.0327,"5.5":0},S:{"2.5":0.00572,_:"3.0-3.1"},J:{"7":0,"10":0.00572},N:{"10":0.01144,"11":0.01144},L:{"0":42.75712},R:{_:"0"},M:{"0":1.13216},Q:{"13.1":1.0178},O:{"0":1.81261},H:{"0":1.03938}};
    +module.exports={C:{"3":0.00403,"4":0.00403,"29":0.00403,"40":0.00403,"43":0.00806,"48":0.02015,"50":0.00806,"52":0.06045,"60":0.00806,"63":0.00403,"65":0.01209,"68":0.00403,"72":0.00806,"78":0.11687,"88":0.00806,"89":0.00806,"91":0.07657,"93":0.00806,"94":0.00403,"102":0.18538,"103":0.00403,"104":0.02015,"105":0.03224,"106":0.03224,"107":0.01612,"108":0.04433,"109":0.02015,"110":0.00403,"111":0.06045,"112":0.00806,"113":0.01209,"114":0.00806,"115":2.56711,"116":0.00806,"117":0.02015,"118":0.21762,"119":2.91369,"120":0.79794,_:"2 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 30 31 32 33 34 35 36 37 38 39 41 42 44 45 46 47 49 51 53 54 55 56 57 58 59 61 62 64 66 67 69 70 71 73 74 75 76 77 79 80 81 82 83 84 85 86 87 90 92 95 96 97 98 99 100 101 121 122 123 3.5","3.6":0.00403},D:{"38":0.00403,"39":0.00403,"40":0.00403,"41":0.00806,"42":0.00403,"43":0.00806,"44":0.00806,"45":0.17732,"46":0.00806,"47":0.00403,"48":0.03224,"49":0.0403,"51":0.01209,"53":0.01209,"56":0.00403,"66":0.00403,"68":0.00403,"69":0.00806,"70":0.00403,"71":0.00403,"72":0.03627,"74":0.01209,"79":0.07254,"80":0.00806,"81":0.00403,"83":0.00403,"84":0.00403,"85":0.03224,"86":0.00403,"87":0.02418,"88":0.00403,"89":0.00403,"90":0.00806,"91":0.02418,"93":0.00403,"94":0.00403,"95":0.00403,"96":0.00403,"97":0.00403,"98":0.02015,"99":0.00806,"100":0.01209,"101":0.00403,"102":0.0403,"103":0.07657,"104":0.0403,"105":0.04836,"106":0.11687,"107":0.24986,"108":0.31434,"109":0.79794,"110":0.05239,"111":0.0806,"112":0.14105,"113":0.05239,"114":0.13702,"115":0.04433,"116":0.65286,"117":0.43121,"118":3.0628,"119":10.54248,"120":0.01209,"121":0.00403,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 50 52 54 55 57 58 59 60 61 62 63 64 65 67 73 75 76 77 78 92 122"},F:{"31":0.00403,"89":0.00403,"91":0.02418,"95":0.0403,"96":0.00403,"102":0.46345,"103":0.13299,"104":0.58838,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 90 92 93 94 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.00403},B:{"15":0.00403,"18":0.00403,"92":0.00806,"96":0.00403,"97":0.00403,"99":0.00403,"103":0.02821,"104":0.00806,"106":0.03224,"107":0.0403,"108":0.02418,"109":0.10881,"110":0.02821,"111":0.03627,"112":0.03627,"113":0.01612,"114":0.01612,"115":0.00806,"116":0.04836,"117":0.10075,"118":0.75361,"119":4.17105,_:"12 13 14 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 98 100 101 102 105"},E:{"9":0.02821,"13":0.00403,"14":0.07657,"15":0.00403,_:"0 4 5 6 7 8 10 11 12 3.1 3.2 6.1 7.1 9.1 10.1 11.1","5.1":0.00403,"12.1":0.05239,"13.1":0.22165,"14.1":0.29822,"15.1":0.01612,"15.2-15.3":0.03224,"15.4":0.07254,"15.5":0.16926,"15.6":0.6045,"16.0":0.1209,"16.1":0.22165,"16.2":0.21359,"16.3":0.45136,"16.4":0.13299,"16.5":0.45136,"16.6":1.6523,"17.0":0.87451,"17.1":1.22512,"17.2":0.00806},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00359,"5.0-5.1":0.00359,"6.0-6.1":0.00899,"7.0-7.1":0.01258,"8.1-8.4":0.0018,"9.0-9.2":0.01438,"9.3":0.04493,"10.0-10.2":0.00359,"10.3":0.0647,"11.0-11.2":0.03055,"11.3-11.4":0.02696,"12.0-12.1":0.01618,"12.2-12.5":0.29475,"13.0-13.1":0.00719,"13.2":0.03055,"13.3":0.01797,"13.4-13.7":0.05212,"14.0-14.4":0.13839,"14.5-14.8":0.22466,"15.0-15.1":0.08807,"15.2-15.3":0.10784,"15.4":0.12042,"15.5":0.16894,"15.6-15.7":0.88785,"16.0":0.41697,"16.1":0.83573,"16.2":0.40079,"16.3":0.75126,"16.4":0.15457,"16.5":0.39899,"16.6-16.7":6.76313,"17.0":2.02552,"17.1":3.40223,"17.2":0.09705},P:{"4":0.16809,"20":0.03152,"21":0.09455,"22":0.25214,"23":3.13071,"5.0-5.4":0.01051,"6.2-6.4":0.01051,"7.2-7.4":0.01051,_:"8.2 9.2 10.1 11.1-11.2","12.0":0.02101,"13.0":0.03152,"14.0":0.01051,"15.0":0.01051,"16.0":0.03152,"17.0":0.03152,"18.0":0.01051,"19.0":0.03152},I:{"0":0.38617,"3":0.00004,"4":0.00008,"2.1":0,"2.2":0.00008,"2.3":0,"4.1":0.00004,"4.2-4.3":0.00027,"4.4":0,"4.4.3-4.4.4":0.00116},K:{"0":1.65994,_:"10 11 12 11.1 11.5 12.1"},A:{"7":0.00524,"8":0.05763,"9":0.01048,"10":0.01048,"11":0.1205,_:"6 5.5"},N:{_:"10 11"},S:{"2.5":0.00597,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":2.16747},H:{"0":0},L:{"0":31.67742},R:{_:"0"},M:{"0":0.60307},Q:{"13.1":1.62411}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LV.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LV.js
    index 08783ad2bf886b..db8823e8f7353c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LV.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LV.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0.03486,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.05229,"49":0,"50":0,"51":0,"52":0.04067,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.00581,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.01743,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0.01162,"75":0,"76":0,"77":0,"78":0.00581,"79":0,"80":0,"81":0.00581,"82":0,"83":0,"84":0,"85":0,"86":0.00581,"87":0,"88":0.01162,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00581,"96":0,"97":0,"98":0,"99":0.00581,"100":0,"101":0,"102":0.06391,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00581,"109":0,"110":0.01743,"111":0.01162,"112":0.09296,"113":0.01162,"114":0.01743,"115":0.44156,"116":0.12782,"117":1.95797,"118":0.15687,"119":0.00581,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0.01162,"42":0,"43":0.00581,"44":0.00581,"45":0.00581,"46":0.00581,"47":0,"48":0,"49":0.01743,"50":0,"51":0.00581,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.01162,"65":0,"66":0.00581,"67":0,"68":0.01743,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0.00581,"75":0.01162,"76":0.02324,"77":0.00581,"78":0,"79":0.0581,"80":0.04648,"81":0.00581,"83":0,"84":0,"85":0.02324,"86":0.01162,"87":0.09877,"88":0,"89":0.01743,"90":0.08134,"91":0,"92":0.09877,"93":0.01743,"94":0.01162,"95":0.00581,"96":0.01162,"97":0.00581,"98":0.00581,"99":0.01162,"100":0.24402,"101":0.00581,"102":0.0581,"103":0.16268,"104":0.00581,"105":0.01743,"106":0.04648,"107":0.02324,"108":0.04648,"109":1.55127,"110":0.04648,"111":0.04648,"112":0.05229,"113":0.03486,"114":0.50547,"115":1.05161,"116":15.1641,"117":3.81136,"118":0.00581,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00581,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.00581,"71":0,"72":0.00581,"73":0.00581,"74":0,"75":0,"76":0,"77":0.03486,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00581,"86":0,"87":0.00581,"88":0,"89":0,"90":0,"91":0.00581,"92":0,"93":0,"94":0.00581,"95":0.08715,"96":0,"97":0,"98":0,"99":0.01162,"100":0.13363,"101":0.56357,"102":0.48223,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.01162,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.00581,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0.00581,"107":0.01743,"108":0.00581,"109":0.02324,"110":0.01162,"111":0.00581,"112":0.00581,"113":0.00581,"114":0.09877,"115":0.09296,"116":1.69071,"117":1.30144},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00581,"10":0,"11":0,"12":0,"13":0,"14":0.01743,"15":0.01162,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00581,"10.1":0,"11.1":0,"12.1":0,"13.1":0.03486,"14.1":0.03486,"15.1":0.00581,"15.2-15.3":0.01743,"15.4":0.01743,"15.5":0.01743,"15.6":0.09877,"16.0":0.01162,"16.1":0.0581,"16.2":0.03486,"16.3":0.07553,"16.4":0.05229,"16.5":0.10458,"16.6":0.57519,"17.0":0.0581,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00437,"8.1-8.4":0.01747,"9.0-9.2":0.00218,"9.3":0.0131,"10.0-10.2":0,"10.3":0.00873,"11.0-11.2":0.03057,"11.3-11.4":0,"12.0-12.1":0.0131,"12.2-12.5":0.10698,"13.0-13.1":0.00218,"13.2":0.00437,"13.3":2.99987,"13.4-13.7":0.02183,"14.0-14.4":0.08952,"14.5-14.8":0.15502,"15.0-15.1":0.06332,"15.2-15.3":0.06113,"15.4":0.10043,"15.5":0.18121,"15.6-15.7":0.79473,"16.0":0.70084,"16.1":1.06109,"16.2":0.55019,"16.3":1.02179,"16.4":0.22051,"16.5":0.74233,"16.6":10.96023,"17.0":1.73573,"17.1":0.00437},P:{"4":0.03046,"20":0.08121,"21":0.21319,"22":2.96432,"5.0-5.4":0.01015,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0.01015,"14.0":0.0203,"15.0":0.04061,"16.0":0.0203,"17.0":0.0203,"18.0":0.03046,"19.0":0.10152},I:{"0":0,"3":0.00287,"4":0.02292,"2.1":0.00287,"2.2":0.01146,"2.3":0.01719,"4.1":0.01433,"4.2-4.3":0.03725,"4.4":0,"4.4.3-4.4.4":0.08883},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0.00581,"8":0.02905,"9":0.00581,"10":0.00581,"11":0.04067,"5.5":0},S:{"2.5":0.00419,_:"3.0-3.1"},J:{"7":0,"10":0.00419},N:{"10":0.01257,"11":0},L:{"0":37.77717},R:{_:"0"},M:{"0":0.3771},Q:{"13.1":0},O:{"0":0.06704},H:{"0":0.34511}};
    +module.exports={C:{"16":0.03847,"48":0.67326,"52":0.02565,"68":0.00641,"72":0.00641,"75":0.00641,"78":0.00641,"85":0.00641,"88":0.01924,"93":0.00641,"99":0.01282,"102":0.02565,"103":0.00641,"105":0.00641,"107":0.00641,"108":0.01924,"110":0.02565,"112":0.01282,"113":0.00641,"114":0.01924,"115":0.75662,"116":0.01924,"117":0.01924,"118":0.109,"119":2.6161,"120":0.78868,"121":0.00641,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 73 74 76 77 79 80 81 82 83 84 86 87 89 90 91 92 94 95 96 97 98 100 101 104 106 109 111 122 123 3.5 3.6"},D:{"38":0.00641,"44":0.00641,"45":0.00641,"48":0.00641,"49":0.01282,"51":0.00641,"69":0.01282,"75":0.00641,"79":0.10259,"80":0.00641,"81":0.00641,"85":0.01282,"87":0.0513,"88":0.00641,"90":0.03206,"91":0.00641,"92":0.00641,"93":0.00641,"94":0.01282,"96":0.01282,"97":0.02565,"98":0.00641,"99":0.01282,"100":0.01282,"101":0.01282,"102":0.02565,"103":0.09618,"104":0.01282,"105":0.02565,"106":0.01924,"107":0.05771,"108":0.109,"109":2.41091,"110":0.02565,"111":0.0513,"112":0.08977,"113":0.44884,"114":1.19263,"115":0.12824,"116":0.8528,"117":2.16726,"118":9.84242,"119":28.81553,"120":0.01924,"121":0.00641,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 46 47 50 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 70 71 72 73 74 76 77 78 83 84 86 89 95 122"},F:{"16":0.09618,"82":0.00641,"85":0.00641,"87":0.00641,"94":0.01282,"95":0.14106,"99":0.00641,"102":0.57067,"103":0.30136,"104":1.13492,_:"9 11 12 15 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 83 84 86 88 89 90 91 92 93 96 97 98 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"15":0.00641,"17":0.00641,"86":0.00641,"92":0.01924,"100":0.00641,"103":0.01282,"106":0.03206,"107":0.01282,"108":0.01282,"109":0.0513,"111":0.01282,"112":0.01282,"113":0.00641,"114":0.03206,"115":0.01924,"116":0.01924,"117":0.11542,"118":1.06439,"119":5.02701,_:"12 13 14 16 18 79 80 81 83 84 85 87 88 89 90 91 93 94 95 96 97 98 99 101 102 104 105 110"},E:{"9":0.00641,"13":0.00641,"14":0.01924,"15":0.00641,_:"0 4 5 6 7 8 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.03847,"13.1":0.05771,"14.1":0.05771,"15.1":0.00641,"15.2-15.3":0.03847,"15.4":0.01924,"15.5":0.01924,"15.6":0.20518,"16.0":0.01282,"16.1":0.07053,"16.2":0.04488,"16.3":0.08977,"16.4":0.07694,"16.5":0.08977,"16.6":0.3719,"17.0":0.21801,"17.1":0.50655,"17.2":0.01924},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00183,"5.0-5.1":0.00183,"6.0-6.1":0.00456,"7.0-7.1":0.00639,"8.1-8.4":0.00091,"9.0-9.2":0.0073,"9.3":0.02282,"10.0-10.2":0.00183,"10.3":0.03286,"11.0-11.2":0.01552,"11.3-11.4":0.01369,"12.0-12.1":0.00822,"12.2-12.5":0.1497,"13.0-13.1":0.00365,"13.2":0.01552,"13.3":0.00913,"13.4-13.7":0.02647,"14.0-14.4":0.07028,"14.5-14.8":0.1141,"15.0-15.1":0.04473,"15.2-15.3":0.05477,"15.4":0.06116,"15.5":0.0858,"15.6-15.7":0.45092,"16.0":0.21177,"16.1":0.42445,"16.2":0.20355,"16.3":0.38155,"16.4":0.0785,"16.5":0.20264,"16.6-16.7":3.43482,"17.0":1.02871,"17.1":1.72791,"17.2":0.04929},P:{"4":0.04121,"20":0.04121,"21":0.07212,"22":0.31938,"23":2.27689,_:"5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 14.0","13.0":0.0103,"15.0":0.0103,"16.0":0.02061,"17.0":0.0103,"18.0":0.02061,"19.0":0.06182},I:{"0":0.06426,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00005,"4.4":0,"4.4.3-4.4.4":0.00019},K:{"0":0.30498,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.03206,"9":0.00641,"10":0.00641,"11":0.10259,_:"6 7 5.5"},N:{_:"10 11"},S:{"2.5":0.00359,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.06817},H:{"0":0},L:{"0":23.38134},R:{_:"0"},M:{"0":0.35521},Q:{"13.1":0.00359}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LY.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LY.js
    index 70f1c8801ae52c..6ee6dda0f833fb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LY.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/LY.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00134,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0.00134,"111":0,"112":0,"113":0.00134,"114":0.00134,"115":0.0188,"116":0.00403,"117":0.05506,"118":0.00403,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00134,"39":0,"40":0,"41":0,"42":0,"43":0.00134,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.02283,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00537,"59":0,"60":0.00134,"61":0,"62":0,"63":0.00134,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00134,"70":0,"71":0,"72":0,"73":0.00134,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.00269,"80":0,"81":0.00269,"83":0.00134,"84":0,"85":0,"86":0.0094,"87":0.00134,"88":0.00134,"89":0.00134,"90":0,"91":0.00134,"92":0.00134,"93":0.00134,"94":0,"95":0.00134,"96":0,"97":0,"98":0.00269,"99":0.00269,"100":0,"101":0,"102":0.00806,"103":0.00269,"104":0.00269,"105":0.00134,"106":0.00134,"107":0.00403,"108":0.00537,"109":0.22965,"110":0.00134,"111":0.00537,"112":0.00269,"113":0.00269,"114":0.01074,"115":0.03492,"116":0.61778,"117":0.1437,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0.00269,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00134,"60":0.00134,"62":0,"63":0.00269,"64":0.00269,"65":0.00134,"66":0.00134,"67":0.00403,"68":0.00269,"69":0.02283,"70":0.01612,"71":0.04432,"72":0.11147,"73":0.02552,"74":0,"75":0,"76":0,"77":0.00806,"78":0,"79":0.00134,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.0094,"96":0,"97":0,"98":0.00403,"99":0.00134,"100":0.00269,"101":0.0282,"102":0.03223,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00134,"79":0,"80":0,"81":0,"83":0,"84":0.00134,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00269,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00403,"110":0.00537,"111":0,"112":0,"113":0.00134,"114":0.0094,"115":0.00403,"116":0.10744,"117":0.06446},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00134,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.01612,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0.00134,"15.1":0,"15.2-15.3":0,"15.4":0.00134,"15.5":0.00134,"15.6":0.00806,"16.0":0,"16.1":0.00269,"16.2":0.00134,"16.3":0.00403,"16.4":0.00134,"16.5":0.00269,"16.6":0.01477,"17.0":0.00403,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.01555,"8.1-8.4":0,"9.0-9.2":0.00104,"9.3":0.12959,"10.0-10.2":0,"10.3":0.15032,"11.0-11.2":0.00415,"11.3-11.4":0.00415,"12.0-12.1":0.01659,"12.2-12.5":0.32449,"13.0-13.1":0.00726,"13.2":0.01037,"13.3":0.02177,"13.4-13.7":0.04354,"14.0-14.4":0.21875,"14.5-14.8":0.32138,"15.0-15.1":0.11508,"15.2-15.3":0.14825,"15.4":0.20009,"15.5":0.20423,"15.6-15.7":0.79931,"16.0":0.52873,"16.1":0.59819,"16.2":0.34523,"16.3":0.6127,"16.4":0.31102,"16.5":0.78583,"16.6":3.79336,"17.0":0.56709,"17.1":0},P:{"4":0.11185,"20":0.11185,"21":0.20337,"22":1.22022,"5.0-5.4":0,"6.2-6.4":0.02034,"7.2-7.4":0.27455,"8.2":0,"9.2":0.03051,"10.1":0,"11.1-11.2":0.04067,"12.0":0.01017,"13.0":0.06101,"14.0":0.06101,"15.0":0.03051,"16.0":0.11185,"17.0":0.05084,"18.0":0.06101,"19.0":0.15253},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.0199,"4.4":0,"4.4.3-4.4.4":0.07562},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00269,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":81.44853},R:{_:"0"},M:{"0":0.06926},Q:{"13.1":0},O:{"0":0.34628},H:{"0":2.51614}};
    +module.exports={C:{"33":0.00185,"34":0.0037,"36":0.00185,"43":0.00555,"47":0.00185,"48":0.00185,"50":0.00185,"52":0.0037,"57":0.00185,"72":0.0074,"78":0.00185,"102":0.0037,"103":0.0074,"106":0.00185,"107":0.00185,"109":0.00185,"111":0.00185,"112":0.00185,"113":0.00185,"114":0.01481,"115":0.25914,"116":0.00185,"117":0.00926,"118":0.01851,"119":0.32948,"120":0.11291,"121":0.00185,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 35 37 38 39 40 41 42 44 45 46 49 51 53 54 55 56 58 59 60 61 62 63 64 65 66 67 68 69 70 71 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 104 105 108 110 122 123 3.5 3.6"},D:{"11":0.00185,"33":0.01481,"38":0.00185,"41":0.00185,"43":0.0074,"46":0.00185,"47":0.00185,"49":0.00555,"53":0.00185,"54":0.00555,"55":0.00185,"56":0.00185,"58":0.09255,"60":0.00185,"62":0.00185,"63":0.00926,"64":0.00185,"65":0.00185,"67":0.00555,"68":0.0074,"69":0.01851,"70":0.0037,"71":0.00185,"72":0.0037,"73":0.01666,"74":0.00185,"75":0.0074,"76":0.0037,"78":0.00555,"79":0.01851,"80":0.00926,"81":0.00185,"83":0.01481,"85":0.00185,"86":0.01296,"87":0.01111,"88":0.01851,"89":0.01111,"90":0.0074,"91":0.00926,"92":0.01111,"93":0.00555,"94":0.00555,"95":0.01481,"96":0.0037,"97":0.0074,"98":0.02221,"99":0.02406,"100":0.0074,"101":0.00555,"102":0.05368,"103":0.02591,"104":0.01481,"105":0.00555,"106":0.0074,"107":0.02036,"108":0.03702,"109":2.69691,"110":0.0074,"111":0.00926,"112":0.01481,"113":0.00926,"114":0.02777,"115":0.02036,"116":0.09995,"117":0.16659,"118":1.69181,"119":7.19484,"120":0.00185,"121":0.00185,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 37 39 40 42 44 45 48 50 51 52 57 59 61 66 77 84 122"},F:{"28":0.0074,"46":0.00185,"79":0.01481,"83":0.00185,"84":0.00926,"85":0.00555,"86":0.00185,"94":0.0037,"95":0.087,"98":0.10736,"101":0.0037,"102":0.17029,"103":0.13883,"104":0.70523,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 87 88 89 90 91 92 93 96 97 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00185,"14":0.0037,"15":0.00185,"16":0.00185,"18":0.01481,"84":0.00926,"87":0.00185,"89":0.0037,"90":0.0037,"92":0.03147,"100":0.0037,"103":0.00185,"108":0.00926,"109":0.03332,"110":0.00555,"111":0.00185,"112":0.0074,"113":0.00185,"114":0.00926,"115":0.00555,"116":0.01111,"117":0.11106,"118":0.30727,"119":1.44193,_:"13 17 79 80 81 83 85 86 88 91 93 94 95 96 97 98 99 101 102 104 105 106 107"},E:{"14":0.00926,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1","5.1":0.3665,"12.1":0.00185,"13.1":0.0037,"14.1":0.00926,"15.1":0.00185,"15.2-15.3":0.0037,"15.4":0.00926,"15.5":0.00555,"15.6":0.06664,"16.0":0.16289,"16.1":0.02777,"16.2":0.03702,"16.3":0.05183,"16.4":0.09995,"16.5":0.01851,"16.6":0.12217,"17.0":0.10921,"17.1":0.09625,"17.2":0.00185},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00211,"5.0-5.1":0.00211,"6.0-6.1":0.00527,"7.0-7.1":0.00738,"8.1-8.4":0.00105,"9.0-9.2":0.00843,"9.3":0.02634,"10.0-10.2":0.00211,"10.3":0.03793,"11.0-11.2":0.01791,"11.3-11.4":0.0158,"12.0-12.1":0.00948,"12.2-12.5":0.1728,"13.0-13.1":0.00421,"13.2":0.01791,"13.3":0.01054,"13.4-13.7":0.03056,"14.0-14.4":0.08113,"14.5-14.8":0.13171,"15.0-15.1":0.05163,"15.2-15.3":0.06322,"15.4":0.0706,"15.5":0.09904,"15.6-15.7":0.52051,"16.0":0.24445,"16.1":0.48995,"16.2":0.23497,"16.3":0.44043,"16.4":0.09062,"16.5":0.23391,"16.6-16.7":3.96494,"17.0":1.18748,"17.1":1.99459,"17.2":0.0569},P:{"4":0.07084,"20":0.07084,"21":0.16192,"22":0.48576,"23":1.08285,"5.0-5.4":0.01012,"6.2-6.4":0.0506,"7.2-7.4":0.28336,_:"8.2 10.1","9.2":0.02024,"11.1-11.2":0.06072,"12.0":0.01012,"13.0":0.04048,"14.0":0.07084,"15.0":0.02024,"16.0":0.11132,"17.0":0.04048,"18.0":0.0506,"19.0":0.16192},I:{"0":0.08919,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00027},K:{"0":2.64362,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.02777,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.00815,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.37485},H:{"0":0.07},L:{"0":65.24992},R:{_:"0"},M:{"0":0.04075},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MA.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MA.js
    index fdadd40b225e97..3a3f936ffcb45a 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MA.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MA.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.03566,"53":0,"54":0,"55":0.00324,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.01297,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00324,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00324,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.00324,"95":0,"96":0,"97":0,"98":0,"99":0.00324,"100":0,"101":0,"102":0.01297,"103":0.00324,"104":0,"105":0.00324,"106":0.00324,"107":0.00324,"108":0.00324,"109":0.00973,"110":0.00324,"111":0.00324,"112":0.00324,"113":0.00648,"114":0.00648,"115":0.11347,"116":0.0389,"117":0.39552,"118":0.0389,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00324,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.01945,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00324,"57":0,"58":0.02269,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00324,"67":0.04215,"68":0.00324,"69":0.00324,"70":0.00648,"71":0,"72":0.00648,"73":0.00648,"74":0,"75":0.00324,"76":0.00324,"77":0,"78":0.00324,"79":0.01621,"80":0,"81":0.00973,"83":0.00973,"84":0.00648,"85":0.00648,"86":0.00648,"87":0.01297,"88":0.00648,"89":0.00324,"90":0.01621,"91":0.00648,"92":0.00324,"93":0.00648,"94":0.00324,"95":0.00324,"96":0.00648,"97":0.02269,"98":0.00324,"99":0.00973,"100":0.00324,"101":0.00648,"102":0.00973,"103":0.01945,"104":0.00648,"105":0.01621,"106":0.02594,"107":0.03566,"108":0.03566,"109":0.94342,"110":0.02269,"111":0.02594,"112":0.03242,"113":0.02594,"114":0.10699,"115":0.14589,"116":4.48044,"117":1.19954,"118":0.00324,"119":0.00324,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00324,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00324,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00324,"70":0,"71":0.00324,"72":0.01945,"73":0.00648,"74":0.00324,"75":0,"76":0,"77":0.04215,"78":0,"79":0.00324,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00324,"86":0,"87":0.00324,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0.00324,"94":0,"95":0.03242,"96":0,"97":0,"98":0,"99":0.00648,"100":0.05187,"101":0.17831,"102":0.23991,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0.00324,"15":0.00324,"16":0,"17":0,"18":0.00324,"79":0,"80":0,"81":0,"83":0,"84":0.00324,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00973,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00324,"108":0.00324,"109":0.01621,"110":0.00324,"111":0.00324,"112":0,"113":0.00324,"114":0.01297,"115":0.02594,"116":0.47009,"117":0.34689},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.02269,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.01297,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00324,"13.1":0.00973,"14.1":0.01621,"15.1":0.01297,"15.2-15.3":0,"15.4":0.00324,"15.5":0.00648,"15.6":0.02594,"16.0":0.00324,"16.1":0.00648,"16.2":0.01621,"16.3":0.01945,"16.4":0.00648,"16.5":0.01945,"16.6":0.07457,"17.0":0.00648,"17.1":0},G:{"8":0.00469,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.01251,"6.0-6.1":0,"7.0-7.1":0.05473,"8.1-8.4":0.00156,"9.0-9.2":0,"9.3":0.05004,"10.0-10.2":0.00313,"10.3":0.03284,"11.0-11.2":0.02189,"11.3-11.4":0.00625,"12.0-12.1":0.01095,"12.2-12.5":0.31899,"13.0-13.1":0.00625,"13.2":0.0172,"13.3":0.20797,"13.4-13.7":0.07037,"14.0-14.4":0.23142,"14.5-14.8":0.36121,"15.0-15.1":0.12197,"15.2-15.3":0.14386,"15.4":0.18295,"15.5":0.29553,"15.6-15.7":1.50582,"16.0":0.70991,"16.1":0.85846,"16.2":0.54416,"16.3":1.04297,"16.4":0.2971,"16.5":0.83969,"16.6":6.99118,"17.0":0.58638,"17.1":0},P:{"4":0.25322,"20":0.12154,"21":0.25322,"22":2.75502,"5.0-5.4":0.02026,"6.2-6.4":0.02026,"7.2-7.4":0.23296,"8.2":0.01013,"9.2":0.01013,"10.1":0,"11.1-11.2":0.0709,"12.0":0.01013,"13.0":0.0709,"14.0":0.04051,"15.0":0.02026,"16.0":0.05064,"17.0":0.0709,"18.0":0.05064,"19.0":0.0709},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.01301,"4.2-4.3":0.03904,"4.4":0,"4.4.3-4.4.4":0.30361},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00684,"9":0,"10":0,"11":0.05475,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":67.30642},R:{_:"0"},M:{"0":0.18922},Q:{"13.1":0},O:{"0":0.1284},H:{"0":0.50544}};
    +module.exports={C:{"52":0.13838,"55":0.01107,"65":0.02768,"78":0.00554,"81":0.00554,"84":0.00554,"94":0.00554,"99":0.00554,"102":0.01107,"104":0.01107,"105":0.00554,"106":0.00554,"107":0.00554,"108":0.01107,"109":0.02214,"110":0.00554,"111":0.00554,"113":0.00554,"114":0.00554,"115":0.3155,"116":0.01107,"117":0.01107,"118":0.04982,"119":0.95756,"120":0.28782,"121":0.00554,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 56 57 58 59 60 61 62 63 64 66 67 68 69 70 71 72 73 74 75 76 77 79 80 82 83 85 86 87 88 89 90 91 92 93 95 96 97 98 100 101 103 112 122 123 3.5 3.6"},D:{"38":0.00554,"41":0.00554,"43":0.00554,"47":0.00554,"48":0.00554,"49":0.04982,"55":0.00554,"56":0.01107,"58":0.05535,"63":0.00554,"65":0.00554,"66":0.00554,"67":0.17159,"68":0.00554,"69":0.01107,"70":0.00554,"71":0.00554,"72":0.01107,"73":0.00554,"74":0.00554,"75":0.00554,"76":0.00554,"77":0.00554,"78":0.00554,"79":0.03875,"80":0.00554,"81":0.01107,"83":0.03321,"84":0.00554,"85":0.02214,"86":0.02214,"87":3.26012,"88":0.01107,"89":0.00554,"90":0.00554,"91":0.01107,"92":0.00554,"93":0.00554,"94":0.00554,"95":0.01107,"96":0.01107,"97":0.02214,"98":0.01107,"99":0.02768,"100":0.01107,"101":0.01661,"102":0.03321,"103":0.06089,"104":0.01107,"105":0.07196,"106":0.07749,"107":0.07749,"108":0.12731,"109":2.29703,"110":0.08856,"111":0.11624,"112":0.0941,"113":0.02214,"114":0.04982,"115":0.05535,"116":0.23801,"117":0.27675,"118":10.28957,"119":24.94625,"120":0.01107,"121":0.00554,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 42 44 45 46 50 51 52 53 54 57 59 60 61 62 64 122"},F:{"40":0.00554,"79":0.00554,"85":0.00554,"87":0.00554,"91":0.00554,"93":0.00554,"94":0.00554,"95":0.07749,"101":0.00554,"102":0.33764,"103":0.13838,"104":0.57564,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 86 88 89 90 92 96 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.00554,"92":0.01661,"100":0.00554,"106":0.00554,"107":0.01107,"108":0.01107,"109":0.06089,"110":0.01107,"111":0.00554,"113":0.00554,"114":0.00554,"115":0.00554,"116":0.01107,"117":0.04982,"118":0.35424,"119":3.47045,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 101 102 103 104 105 112"},E:{"14":0.03321,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 6.1 7.1 9.1 10.1 17.2","5.1":0.33764,"11.1":0.00554,"12.1":0.00554,"13.1":0.02214,"14.1":0.04428,"15.1":0.04428,"15.2-15.3":0.00554,"15.4":0.01107,"15.5":0.01107,"15.6":0.08856,"16.0":0.00554,"16.1":0.01107,"16.2":0.01107,"16.3":0.03321,"16.4":0.01661,"16.5":0.02214,"16.6":0.1107,"17.0":0.08856,"17.1":0.17159},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00099,"5.0-5.1":0.00099,"6.0-6.1":0.00249,"7.0-7.1":0.00348,"8.1-8.4":0.0005,"9.0-9.2":0.00398,"9.3":0.01243,"10.0-10.2":0.00099,"10.3":0.0179,"11.0-11.2":0.00845,"11.3-11.4":0.00746,"12.0-12.1":0.00448,"12.2-12.5":0.08156,"13.0-13.1":0.00199,"13.2":0.00845,"13.3":0.00497,"13.4-13.7":0.01442,"14.0-14.4":0.03829,"14.5-14.8":0.06216,"15.0-15.1":0.02437,"15.2-15.3":0.02984,"15.4":0.03332,"15.5":0.04675,"15.6-15.7":0.24566,"16.0":0.11537,"16.1":0.23124,"16.2":0.1109,"16.3":0.20787,"16.4":0.04277,"16.5":0.1104,"16.6-16.7":1.8713,"17.0":0.56045,"17.1":0.94137,"17.2":0.02685},P:{"4":0.237,"20":0.05152,"21":0.12365,"22":0.2267,"23":1.21594,"5.0-5.4":0.02061,"6.2-6.4":0.03091,"7.2-7.4":0.17518,_:"8.2 10.1","9.2":0.0103,"11.1-11.2":0.02061,"12.0":0.0103,"13.0":0.07213,"14.0":0.0103,"15.0":0.02061,"16.0":0.02061,"17.0":0.03091,"18.0":0.02061,"19.0":0.04122},I:{"0":0.27983,"3":0.00003,"4":0.00006,"2.1":0,"2.2":0.00006,"2.3":0,"4.1":0.00003,"4.2-4.3":0.0002,"4.4":0,"4.4.3-4.4.4":0.00084},K:{"0":0.28909,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.01694,"10":0.00565,"11":0.2597,_:"6 7 9 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.07589},H:{"0":0.01},L:{"0":38.65577},R:{_:"0"},M:{"0":0.09821},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MC.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MC.js
    index 734ffe56103569..9e4f2c260fde16 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MC.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MC.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0.02015,"3":0.02686,"4":0.01343,"5":0.00672,"6":0.00672,"7":0.00672,"8":0.00672,"9":0.00672,"10":0,"11":0.00672,"12":0.01343,"13":0.01343,"14":0.00672,"15":0.00672,"16":0.00672,"17":0.02015,"18":0.00672,"19":0,"20":0.00672,"21":0.00672,"22":0.00672,"23":0.01343,"24":0.01343,"25":0.00672,"26":0.00672,"27":0.00672,"28":0,"29":0.02015,"30":0.01343,"31":0.01343,"32":0.01343,"33":0.00672,"34":0.01343,"35":0.01343,"36":0.01343,"37":0.00672,"38":0.02686,"39":0.01343,"40":0.02686,"41":0.02015,"42":0.00672,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.00672,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.10074,"68":0.10746,"69":0,"70":0,"71":0,"72":0.10746,"73":0,"74":0,"75":0.49027,"76":0,"77":0.00672,"78":0.30894,"79":0,"80":0,"81":0,"82":0.04701,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.01343,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.34923,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00672,"110":0,"111":0,"112":0,"113":0.01343,"114":0,"115":0.2082,"116":0.14775,"117":1.51782,"118":0.1276,"119":0,"120":0,"3.5":0.02015,"3.6":0.03358},D:{"4":0.00672,"5":0,"6":0.00672,"7":0.01343,"8":0,"9":0.00672,"10":0,"11":0.00672,"12":0,"13":0,"14":0.00672,"15":0.00672,"16":0,"17":0.00672,"18":0.00672,"19":0.01343,"20":0,"21":0.02015,"22":0.00672,"23":0.00672,"24":0,"25":0,"26":0.00672,"27":0,"28":0.00672,"29":0,"30":0,"31":0.02015,"32":0.00672,"33":0.01343,"34":0.00672,"35":0,"36":0.02015,"37":0.02686,"38":0.00672,"39":0.02686,"40":0.0403,"41":0.05373,"42":0.03358,"43":0.06044,"44":0.10074,"45":0.06716,"46":0.08731,"47":0.07388,"48":0,"49":0,"50":0,"51":0.10746,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00672,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00672,"66":0,"67":0,"68":0,"69":0,"70":0.04701,"71":0.09402,"72":0.00672,"73":0,"74":0.00672,"75":0,"76":0.10746,"77":0,"78":0.00672,"79":0.52385,"80":0.02015,"81":0.53056,"83":0.00672,"84":0.02015,"85":1.20888,"86":0.0403,"87":1.46409,"88":0,"89":0.2082,"90":0.00672,"91":0.00672,"92":0,"93":0.00672,"94":0,"95":0,"96":0,"97":0,"98":0.04701,"99":0.01343,"100":0.01343,"101":0,"102":0.00672,"103":0.51042,"104":0.05373,"105":0.06716,"106":0.26864,"107":0.17462,"108":0.40296,"109":0.74548,"110":0.1276,"111":0.42982,"112":0.60444,"113":0.05373,"114":0.12089,"115":0.24849,"116":10.06728,"117":2.57894,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0.00672,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0.00672,"25":0,"26":0.00672,"27":0.00672,"28":0,"29":0,"30":0.01343,"31":0.03358,"32":0.0403,"33":0.00672,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.09402,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.03358,"78":0.02015,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00672,"93":0,"94":0,"95":0.00672,"96":0,"97":0,"98":0,"99":0.00672,"100":0.00672,"101":6.38692,"102":1.86033,"9.5-9.6":0,"10.0-10.1":0.00672,"10.5":0,"10.6":0,"11.1":0.00672,"11.5":0.00672,"11.6":0,"12.1":0.02015},B:{"12":0.0403,"13":0,"14":0.08059,"15":0,"16":0,"17":0,"18":0.10074,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0.01343,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.23506,"110":0,"111":0,"112":0,"113":0,"114":0.10746,"115":0.26864,"116":1.01412,"117":0.69846},E:{"4":0.01343,"5":0.01343,"6":0.00672,"7":0,"8":0.01343,"9":0.14104,"10":0,"11":0,"12":0,"13":0,"14":0.25521,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.01343,"6.1":0,"7.1":0.00672,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00672,"13.1":0.14775,"14.1":0.28207,"15.1":0.00672,"15.2-15.3":0.00672,"15.4":0.02686,"15.5":0.03358,"15.6":0.3358,"16.0":0.02686,"16.1":0.22163,"16.2":0.06044,"16.3":0.28879,"16.4":0.09402,"16.5":0.32908,"16.6":2.7267,"17.0":0.16118,"17.1":0},G:{"8":0.01543,"3.2":0.00309,"4.0-4.1":0,"4.2-4.3":0.02778,"5.0-5.1":0.01852,"6.0-6.1":0.0463,"7.0-7.1":0.17284,"8.1-8.4":0.3179,"9.0-9.2":0.02161,"9.3":0.1142,"10.0-10.2":0.04938,"10.3":0.12346,"11.0-11.2":0.70371,"11.3-11.4":0,"12.0-12.1":0.27161,"12.2-12.5":0.14198,"13.0-13.1":0,"13.2":0.02778,"13.3":0.00926,"13.4-13.7":0.00309,"14.0-14.4":0.21914,"14.5-14.8":0.49074,"15.0-15.1":0.21605,"15.2-15.3":0.04012,"15.4":0.1821,"15.5":0.14198,"15.6-15.7":1.61112,"16.0":0.51852,"16.1":1.46297,"16.2":0.87038,"16.3":0.97223,"16.4":0.14506,"16.5":1.0926,"16.6":18.91373,"17.0":1.69754,"17.1":0.00309},P:{"4":0.13349,"20":0.04107,"21":0.01027,"22":1.07821,"5.0-5.4":0,"6.2-6.4":0.09242,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0,"17.0":0,"18.0":0.01027,"19.0":0.01027},I:{"0":0,"3":0.01809,"4":0.34848,"2.1":0.05547,"2.2":0.20861,"2.3":0.22549,"4.1":0.23634,"4.2-4.3":0.39551,"4.4":0,"4.4.3-4.4.4":0.82719},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.02686,"7":0.05373,"8":0.61116,"9":0.12089,"10":0.09402,"11":0.32237,"5.5":0.00672},S:{"2.5":0.03612,_:"3.0-3.1"},J:{"7":0,"10":0.0821},N:{"10":0.14748,"11":0.1021},L:{"0":18.10616},R:{_:"0"},M:{"0":0.23645},Q:{"13.1":0.00328},O:{"0":0.22988},H:{"0":0.05596}};
    +module.exports={C:{"2":0.01364,"3":0.02047,"4":0.01364,"5":0.02047,"10":0.00682,"11":0.00682,"12":0.00682,"13":0.00682,"15":0.00682,"16":0.01364,"17":0.00682,"20":0.00682,"21":0.00682,"22":0.00682,"23":0.01364,"24":0.00682,"26":0.01364,"29":0.00682,"31":0.01364,"32":0.01364,"33":0.00682,"34":0.00682,"35":0.01364,"36":0.00682,"37":0.00682,"38":0.02047,"39":0.02047,"40":0.02729,"41":0.00682,"42":0.00682,"43":0.00682,"45":0.00682,"52":0.00682,"67":0.11597,"68":0.13644,"72":0.12962,"75":0.66173,"78":0.60034,"82":0.0614,"102":0.01364,"105":0.01364,"107":0.06822,"108":0.00682,"109":0.15008,"110":0.28652,"112":0.00682,"113":0.00682,"114":0.00682,"115":0.72313,"116":0.00682,"117":0.01364,"118":0.0614,"119":1.43944,"120":0.39568,"121":0.00682,_:"6 7 8 9 14 18 19 25 27 28 30 44 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 69 70 71 73 74 76 77 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 103 104 106 111 122 123","3.5":0.00682,"3.6":0.04093},D:{"4":0.00682,"6":0.00682,"7":0.00682,"11":0.00682,"12":0.00682,"15":0.00682,"16":0.00682,"17":0.00682,"18":0.00682,"19":0.00682,"20":0.01364,"21":0.01364,"25":0.00682,"27":0.00682,"28":0.01364,"29":0.00682,"30":0.00682,"31":0.02729,"32":0.00682,"33":0.00682,"34":0.01364,"35":0.00682,"36":0.00682,"37":0.01364,"38":0.01364,"39":0.02047,"40":0.03411,"41":0.04775,"42":0.04093,"43":0.07504,"44":0.1228,"45":0.06822,"46":0.10233,"47":0.04775,"51":0.09551,"53":0.00682,"57":0.01364,"65":0.01364,"70":0.07504,"71":0.12962,"72":0.01364,"74":0.01364,"76":0.15008,"78":0.00682,"79":0.66856,"80":0.03411,"81":0.65491,"83":0.01364,"84":0.02729,"85":1.61681,"86":0.06822,"87":1.73279,"90":0.00682,"96":0.01364,"98":0.1228,"99":0.02047,"101":0.00682,"102":0.01364,"103":0.805,"104":0.10915,"105":0.34792,"106":0.0614,"107":1.86923,"108":1.11199,"109":1.52813,"110":0.47754,"111":0.23877,"112":0.49801,"113":0.00682,"114":0.04093,"115":0.0614,"116":2.09435,"117":0.31381,"118":3.60202,"119":12.30007,_:"5 8 9 10 13 14 22 23 24 26 48 49 50 52 54 55 56 58 59 60 61 62 63 64 66 67 68 69 73 75 77 88 89 91 92 93 94 95 97 100 120 121 122"},F:{"26":0.00682,"29":0.00682,"30":0.00682,"31":0.03411,"32":0.02047,"65":0.14326,"79":0.7436,"95":0.00682,"102":0.17055,"103":1.47355,"104":12.83218,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 27 28 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 10.0-10.1 10.5 11.1 11.5 11.6","9.5-9.6":0.00682,"10.6":0.00682,"12.1":0.02047},B:{"12":0.01364,"18":0.15691,"86":0.02729,"90":0.35474,"98":0.00682,"103":0.00682,"105":0.0614,"108":0.04093,"109":0.04775,"110":0.29335,"115":0.01364,"116":0.02729,"117":0.03411,"118":0.51847,"119":2.81066,_:"13 14 15 16 17 79 80 81 83 84 85 87 88 89 91 92 93 94 95 96 97 99 100 101 102 104 106 107 111 112 113 114"},E:{"4":0.00682,"5":0.01364,"6":0.00682,"7":0.00682,"8":0.01364,"9":0.20466,"12":0.01364,"14":0.12962,"15":0.01364,_:"0 10 11 13 3.1 3.2 7.1 9.1 10.1 11.1","5.1":0.01364,"6.1":0.00682,"12.1":0.00682,"13.1":0.14326,"14.1":0.14326,"15.1":0.01364,"15.2-15.3":0.03411,"15.4":0.02729,"15.5":0.03411,"15.6":1.05741,"16.0":0.02047,"16.1":0.10233,"16.2":0.05458,"16.3":0.6822,"16.4":0.14326,"16.5":0.53212,"16.6":2.74244,"17.0":0.57305,"17.1":1.65092,"17.2":0.0614},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00334,"5.0-5.1":0.00334,"6.0-6.1":0.00835,"7.0-7.1":0.0117,"8.1-8.4":0.00167,"9.0-9.2":0.01337,"9.3":0.04177,"10.0-10.2":0.00334,"10.3":0.06016,"11.0-11.2":0.02841,"11.3-11.4":0.02506,"12.0-12.1":0.01504,"12.2-12.5":0.27404,"13.0-13.1":0.00668,"13.2":0.02841,"13.3":0.01671,"13.4-13.7":0.04846,"14.0-14.4":0.12867,"14.5-14.8":0.20887,"15.0-15.1":0.08188,"15.2-15.3":0.10026,"15.4":0.11196,"15.5":0.15707,"15.6-15.7":0.82547,"16.0":0.38767,"16.1":0.77701,"16.2":0.37263,"16.3":0.69847,"16.4":0.14371,"16.5":0.37096,"16.6-16.7":6.28794,"17.0":1.88321,"17.1":3.16319,"17.2":0.09023},P:{"4":0.09837,"20":0.02186,"22":0.01093,"23":0.91812,_:"21 5.0-5.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 18.0","6.2-6.4":0.08744,"17.0":0.01093,"19.0":0.02186},I:{"0":1.16366,"3":0.00012,"4":0.00023,"2.1":0,"2.2":0.00023,"2.3":0,"4.1":0.00012,"4.2-4.3":0.00082,"4.4":0,"4.4.3-4.4.4":0.00351},K:{"0":0.18386,_:"10 11 12 11.1 11.5 12.1"},A:{"6":0.04093,"7":0.04775,"8":0.55258,"9":0.09551,"10":0.08869,"11":0.3411,"5.5":0.00682},N:{_:"10 11"},S:{"2.5":0.04449,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.18432},H:{"0":0.01},L:{"0":11.60787},R:{_:"0"},M:{"0":0.16208},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MD.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MD.js
    index edf24035c5b874..4962085b645807 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MD.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MD.js
    @@ -1 +1 @@
    -module.exports={C:{"48":0.05308,"52":0.06941,"60":0.06533,"61":0.02042,"68":0.0245,"69":0.06941,"78":0.01225,"86":0.01633,"87":0.05308,"91":0.00817,"95":0.02858,"97":0.00408,"100":0.01225,"102":0.17557,"103":0.00408,"104":0.04491,"105":0.02858,"111":0.04083,"112":0.00408,"113":0.01225,"114":0.02042,"115":0.36747,"116":0.07758,"117":1.06975,"118":0.09391,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 49 50 51 53 54 55 56 57 58 59 62 63 64 65 66 67 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 88 89 90 92 93 94 96 98 99 101 106 107 108 109 110 119 120 3.5","3.6":0.04491},D:{"40":0.00408,"41":0.00817,"42":0.00408,"43":0.00817,"44":0.00817,"45":0.00817,"46":0.00817,"47":0.01225,"49":0.05716,"51":0.02858,"53":0.00408,"55":0.00408,"56":0.00408,"58":0.00408,"62":0.00408,"63":0.00817,"64":0.00408,"66":0.00817,"67":0.00817,"68":0.01633,"69":0.01225,"70":0.02042,"71":0.01225,"72":0.01633,"73":0.12657,"74":0.02042,"75":0.1674,"76":0.18374,"77":0.27764,"78":0.01633,"79":0.17557,"80":0.15515,"81":0.06125,"83":0.14699,"84":0.15515,"85":0.1674,"86":0.41238,"87":0.06533,"88":0.02042,"89":0.05716,"90":0.82068,"91":0.10208,"92":0.02858,"93":0.14699,"94":0.01225,"96":0.11024,"97":0.05716,"98":0.11841,"99":0.01633,"100":0.0245,"101":0.13882,"102":0.30623,"103":0.05716,"104":0.20415,"105":0.03675,"106":0.15515,"107":0.20007,"108":0.34706,"109":3.65837,"110":0.06533,"111":0.05716,"112":0.06125,"113":0.08574,"114":0.83293,"115":0.77169,"116":14.30683,"117":3.04184,"118":0.01225,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 48 50 52 54 57 59 60 61 65 95 119 120"},F:{"54":0.00408,"63":0.02858,"67":0.04083,"68":0.02042,"70":0.00817,"71":0.05716,"72":0.03266,"77":0.00817,"79":0.00817,"82":0.01225,"85":0.049,"86":0.01225,"91":0.00817,"95":0.44096,"99":0.01633,"100":0.15924,"101":0.77169,"102":0.76352,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 55 56 57 58 60 62 64 65 66 69 73 74 75 76 78 80 81 83 84 87 88 89 90 92 93 94 96 97 98 9.5-9.6 10.5 10.6 11.1 11.5 11.6 12.1","10.0-10.1":0},B:{"12":0.00817,"18":0.06125,"90":0.09391,"92":0.00408,"106":0.01225,"108":0.00817,"109":0.01633,"110":0.01633,"113":0.00817,"114":0.0245,"115":0.0245,"116":0.82477,"117":0.63695,_:"13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 91 93 94 95 96 97 98 99 100 101 102 103 104 105 107 111 112"},E:{"4":0,"9":0.01225,"14":0.00817,_:"0 5 6 7 8 10 11 12 13 15 3.1 3.2 6.1 7.1 10.1 11.1 12.1 17.1","5.1":0.00408,"9.1":0.06533,"13.1":0.0245,"14.1":0.04491,"15.1":0.00408,"15.2-15.3":0.00408,"15.4":0.04491,"15.5":0.01225,"15.6":0.09391,"16.0":0.00817,"16.1":0.03675,"16.2":0.0245,"16.3":0.049,"16.4":0.02042,"16.5":0.13882,"16.6":0.28989,"17.0":0.03675},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00836,"8.1-8.4":0.00836,"9.0-9.2":0,"9.3":0.02175,"10.0-10.2":0,"10.3":0.02007,"11.0-11.2":0.03178,"11.3-11.4":0.00502,"12.0-12.1":0.02844,"12.2-12.5":0.16896,"13.0-13.1":0.00836,"13.2":0.00836,"13.3":5.12236,"13.4-13.7":0.03346,"14.0-14.4":0.08364,"14.5-14.8":0.27101,"15.0-15.1":0.04349,"15.2-15.3":0.05688,"15.4":0.04182,"15.5":0.13216,"15.6-15.7":0.81469,"16.0":0.45502,"16.1":0.62733,"16.2":0.33458,"16.3":0.64239,"16.4":0.12547,"16.5":0.41822,"16.6":6.13613,"17.0":0.97529,"17.1":0.00335},P:{"4":0.01061,"20":0.06369,"21":0.09553,"22":1.78331,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.02123,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01061,"12.0":0,"13.0":0.01061,"14.0":0,"15.0":0,"16.0":0.01061,"17.0":0.02123,"18.0":0.03184,"19.0":0.05307},I:{"0":0,"3":0.06658,"4":0.00156,"2.1":0,"2.2":0.00094,"2.3":0.00125,"4.1":0.00094,"4.2-4.3":0.0025,"4.4":0,"4.4.3-4.4.4":0.00907},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"7":0.00408,"8":0.06125,"9":0.01225,"10":0.00817,"11":0.34706,_:"6 5.5"},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":41.03142},R:{_:"0"},M:{"0":0.14201},Q:{"13.1":0.00592},O:{"0":0.071},H:{"0":0.23528}};
    +module.exports={C:{"34":0.0039,"40":0.0039,"48":0.22998,"52":0.09355,"68":0.01949,"72":0.01949,"78":0.01169,"82":0.0039,"87":0.04678,"88":0.13253,"91":0.03118,"95":0.0078,"102":0.01169,"103":0.0039,"104":0.0039,"105":0.0039,"107":0.0039,"109":0.0039,"110":0.0039,"111":0.0039,"112":0.0078,"113":0.01169,"114":0.0039,"115":0.60029,"116":0.0078,"117":0.01559,"118":0.06627,"119":0.88485,"120":0.32353,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 41 42 43 44 45 46 47 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 73 74 75 76 77 79 80 81 83 84 85 86 89 90 92 93 94 96 97 98 99 100 101 106 108 121 122 123 3.5","3.6":0.04288},D:{"38":0.0039,"39":0.0039,"40":0.0039,"41":0.0039,"42":0.0039,"43":0.0039,"44":0.0078,"45":0.0078,"46":0.0078,"47":0.0078,"49":0.04678,"51":0.03898,"56":0.0039,"64":0.0039,"65":0.0039,"67":0.01559,"70":0.01169,"71":0.01169,"72":0.0039,"73":0.0039,"74":0.01169,"75":0.0039,"76":0.0078,"77":0.0039,"78":0.02339,"79":0.07016,"80":0.06237,"81":0.0039,"83":0.0078,"84":0.0039,"85":0.01169,"86":0.94721,"87":0.0078,"88":0.0039,"89":0.0039,"90":0.01559,"91":0.0039,"92":0.01169,"94":0.01949,"95":0.0039,"96":0.04678,"97":0.01169,"98":0.0039,"99":0.01559,"100":0.03118,"101":0.01949,"102":0.07796,"103":0.05457,"104":0.03898,"105":0.01949,"106":0.09745,"107":0.01559,"108":0.09355,"109":4.26051,"110":0.03118,"111":0.03898,"112":0.01949,"113":0.05847,"114":0.10525,"115":0.04678,"116":0.32743,"117":0.31964,"118":4.11239,"119":16.05976,"120":0.01169,"121":0.0078,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 48 50 52 53 54 55 57 58 59 60 61 62 63 66 68 69 93 122"},F:{"70":0.0039,"79":0.0039,"82":0.0078,"85":0.03118,"86":0.0039,"90":0.0078,"95":0.42098,"101":0.03508,"102":0.44437,"103":0.28845,"104":1.10703,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 71 72 73 74 75 76 77 78 80 81 83 84 87 88 89 91 92 93 94 96 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.0039},B:{"18":0.0039,"92":0.01169,"107":0.0039,"108":0.03508,"109":0.03508,"110":0.01169,"113":0.0039,"114":0.0078,"115":0.0039,"116":0.02339,"117":0.04678,"118":0.30794,"119":1.57869,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 111 112"},E:{"9":0.01949,"13":0.0039,"14":0.04288,"15":0.0039,_:"0 4 5 6 7 8 10 11 12 3.1 3.2 6.1 7.1 10.1 11.1","5.1":0.01559,"9.1":0.0039,"12.1":0.01169,"13.1":0.05067,"14.1":0.08576,"15.1":0.0039,"15.2-15.3":0.01949,"15.4":0.03898,"15.5":0.01559,"15.6":0.191,"16.0":0.03118,"16.1":0.05847,"16.2":0.04678,"16.3":0.07016,"16.4":0.05847,"16.5":0.12863,"16.6":0.23778,"17.0":0.1871,"17.1":0.26506,"17.2":0.01559},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00255,"5.0-5.1":0.00255,"6.0-6.1":0.00636,"7.0-7.1":0.00891,"8.1-8.4":0.00127,"9.0-9.2":0.01018,"9.3":0.03182,"10.0-10.2":0.00255,"10.3":0.04582,"11.0-11.2":0.02164,"11.3-11.4":0.01909,"12.0-12.1":0.01146,"12.2-12.5":0.20875,"13.0-13.1":0.00509,"13.2":0.02164,"13.3":0.01273,"13.4-13.7":0.03691,"14.0-14.4":0.09801,"14.5-14.8":0.15911,"15.0-15.1":0.06237,"15.2-15.3":0.07637,"15.4":0.08528,"15.5":0.11965,"15.6-15.7":0.6288,"16.0":0.29531,"16.1":0.59189,"16.2":0.28385,"16.3":0.53206,"16.4":0.10947,"16.5":0.28258,"16.6-16.7":4.78984,"17.0":1.43453,"17.1":2.40956,"17.2":0.06874},P:{"4":0.08164,"20":0.04082,"21":0.08164,"22":0.19389,"23":1.81642,_:"5.0-5.4 8.2 9.2 10.1 12.0","6.2-6.4":0.0102,"7.2-7.4":0.03061,"11.1-11.2":0.0102,"13.0":0.02041,"14.0":0.0102,"15.0":0.0102,"16.0":0.02041,"17.0":0.0102,"18.0":0.02041,"19.0":0.04082},I:{"0":0.10322,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00007,"4.4":0,"4.4.3-4.4.4":0.00031},K:{"0":0.28679,_:"10 11 12 11.1 11.5 12.1"},A:{"7":0.0039,"8":0.06627,"9":0.0078,"10":0.0078,"11":0.16372,_:"6 5.5"},N:{_:"10 11"},S:{"2.5":0.0061,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.07322},H:{"0":0},L:{"0":45.79589},R:{_:"0"},M:{"0":0.12814},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ME.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ME.js
    index b40fc90347b986..fa9f5b05db3a45 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ME.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ME.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00316,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.01582,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0.00633,"76":0,"77":0,"78":0.00633,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.00316,"92":0,"93":0,"94":0.00316,"95":0,"96":0,"97":0,"98":0,"99":0.00316,"100":0,"101":0,"102":0.00316,"103":0.0253,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0.00316,"112":0,"113":0,"114":0.04428,"115":0.06642,"116":0.03479,"117":0.39854,"118":0.03479,"119":0.00316,"120":0,"3.5":0,"3.6":0.00316},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00316,"38":0.00316,"39":0.00316,"40":0.00316,"41":0.00316,"42":0.00316,"43":0.00316,"44":0.00316,"45":0.00633,"46":0.00316,"47":0.00316,"48":0,"49":0.01898,"50":0,"51":0.00316,"52":0,"53":0.01898,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00316,"65":0,"66":0.00316,"67":0,"68":0.02214,"69":0,"70":0.00949,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0.00316,"77":0,"78":0,"79":0.07591,"80":0,"81":0.01582,"83":0.00949,"84":0.00316,"85":0.01898,"86":0.00316,"87":0.0253,"88":0.00633,"89":0.00633,"90":0,"91":0,"92":0.00633,"93":0,"94":0.00316,"95":0.00633,"96":0.00316,"97":0.00633,"98":0,"99":0.0253,"100":0,"101":0.00316,"102":0,"103":0.02847,"104":0.00316,"105":0.00633,"106":0.01582,"107":0.00949,"108":0.01898,"109":0.83187,"110":0.01582,"111":0.00316,"112":0.01582,"113":0.02214,"114":0.06326,"115":0.17713,"116":4.3428,"117":1.21776,"118":0.00316,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00633,"29":0,"30":0,"31":0.00316,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00949,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.04112,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.01898,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.00633,"95":0.01265,"96":0,"97":0,"98":0,"99":0.00633,"100":0.03796,"101":0.37956,"102":0.19294,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00316},B:{"12":0.00316,"13":0,"14":0.00316,"15":0,"16":0,"17":0,"18":0.00316,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.01265,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00949,"108":0,"109":0.00633,"110":0,"111":0.00633,"112":0,"113":0,"114":0.00316,"115":0.00633,"116":0.24988,"117":0.19294},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00633,"10":0,"11":0,"12":0,"13":0.00316,"14":0.00633,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00633,"14.1":0.01582,"15.1":0.00316,"15.2-15.3":0.00316,"15.4":0.00633,"15.5":0.00949,"15.6":0.04112,"16.0":0.00316,"16.1":0.0253,"16.2":0.04112,"16.3":0.04112,"16.4":0.01265,"16.5":0.04745,"16.6":0.19927,"17.0":0.01582,"17.1":0},G:{"8":0.00387,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0.00387,"7.0-7.1":0.02321,"8.1-8.4":0.03289,"9.0-9.2":0.00193,"9.3":0.13541,"10.0-10.2":0.01548,"10.3":0.10059,"11.0-11.2":0.05417,"11.3-11.4":0.00387,"12.0-12.1":0.02902,"12.2-12.5":0.33273,"13.0-13.1":0.00193,"13.2":0.00774,"13.3":0.12574,"13.4-13.7":0.02515,"14.0-14.4":0.14122,"14.5-14.8":0.29984,"15.0-15.1":0.12381,"15.2-15.3":0.1064,"15.4":0.08318,"15.5":0.2805,"15.6-15.7":1.26322,"16.0":0.64612,"16.1":0.85504,"16.2":0.47008,"16.3":1.03882,"16.4":0.15282,"16.5":0.75251,"16.6":11.17162,"17.0":0.82602,"17.1":0.00387},P:{"4":0.25527,"20":0.16337,"21":0.20421,"22":3.68607,"5.0-5.4":0.05105,"6.2-6.4":0.03063,"7.2-7.4":0.03063,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.02042,"12.0":0,"13.0":0.03063,"14.0":0.01021,"15.0":0,"16.0":0.05105,"17.0":0.01021,"18.0":0.02042,"19.0":0.11232},I:{"0":0,"3":0.00253,"4":0.0228,"2.1":0.00253,"2.2":0.01267,"2.3":0.02027,"4.1":0.06588,"4.2-4.3":0.03041,"4.4":0,"4.4.3-4.4.4":0.11402},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0.00316,"8":0.0253,"9":0.00633,"10":0.00633,"11":0.02214,"5.5":0},S:{"2.5":0.00684,_:"3.0-3.1"},J:{"7":0,"10":0.01367},N:{"10":0.01026,"11":0.01026},L:{"0":63.62471},R:{_:"0"},M:{"0":0.27348},Q:{"13.1":0},O:{"0":0.06153},H:{"0":0.26539}};
    +module.exports={C:{"2":0.0031,"3":0.0031,"4":0.0031,"17":0.0031,"31":0.0031,"37":0.0031,"38":0.0031,"40":0.0031,"52":0.01861,"67":0.0062,"68":0.0093,"72":0.0062,"75":0.02791,"78":0.01551,"79":0.0031,"80":0.0062,"81":0.0062,"82":0.0031,"88":0.0062,"91":0.0062,"103":0.0062,"104":0.0093,"106":0.0031,"110":0.0031,"112":0.0031,"113":0.0031,"114":0.06202,"115":0.26979,"116":0.0031,"117":0.0031,"118":0.02481,"119":1.22179,"120":0.307,_:"5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24 25 26 27 28 29 30 32 33 34 35 36 39 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 69 70 71 73 74 76 77 83 84 85 86 87 89 90 92 93 94 95 96 97 98 99 100 101 102 105 107 108 109 111 121 122 123 3.5","3.6":0.0093},D:{"21":0.0031,"22":0.0031,"26":0.0031,"28":0.0031,"31":0.0031,"33":0.0031,"35":0.0031,"36":0.0031,"37":0.0031,"38":0.0093,"39":0.0031,"40":0.0062,"41":0.0062,"42":0.0062,"43":0.0093,"44":0.0093,"45":0.0093,"46":0.0124,"47":0.0062,"48":0.0031,"49":0.04031,"51":0.01551,"53":0.07753,"64":0.0031,"66":0.0093,"68":0.0031,"69":0.0031,"70":0.0062,"71":0.0093,"72":0.02171,"73":0.01551,"75":0.0031,"76":0.0062,"77":0.0031,"78":0.0031,"79":0.63571,"80":0.0124,"81":0.04031,"83":0.02481,"84":0.0124,"85":0.10854,"86":0.0093,"87":0.20467,"88":0.0062,"89":0.0062,"90":0.01551,"91":0.0062,"92":0.0124,"93":0.0093,"94":0.03411,"95":0.0062,"96":0.0031,"97":0.0031,"98":0.0062,"99":0.05892,"100":0.0124,"101":0.0031,"102":0.0031,"103":0.04031,"104":0.0062,"105":0.05892,"106":0.02481,"107":0.01861,"108":0.04652,"109":2.66376,"110":0.01861,"111":0.0124,"112":0.02171,"113":0.0124,"114":0.10543,"115":0.07753,"116":0.32561,"117":0.3101,"118":4.00959,"119":14.34213,"120":0.0124,"121":0.0031,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 23 24 25 27 29 30 32 34 50 52 54 55 56 57 58 59 60 61 62 63 65 67 74 122"},F:{"28":0.0031,"31":0.0031,"32":0.0031,"42":0.0031,"46":0.03101,"65":0.0062,"68":0.19846,"70":0.0031,"71":0.0031,"75":0.0031,"88":0.0031,"95":0.02791,"101":0.0031,"102":0.34111,"103":0.12094,"104":0.6171,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 33 34 35 36 37 38 39 40 41 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 66 67 69 72 73 74 76 77 78 79 80 81 82 83 84 85 86 87 89 90 91 92 93 94 96 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.0031},B:{"12":0.0031,"13":0.0031,"18":0.0062,"84":0.0031,"85":0.0062,"92":0.02171,"107":0.02791,"109":0.0124,"111":0.0031,"114":0.0062,"115":0.0031,"116":0.0062,"117":0.02791,"118":0.21087,"119":1.15047,_:"14 15 16 17 79 80 81 83 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 108 110 112 113"},E:{"8":0.0031,"9":0.02791,"13":0.0031,"14":0.05272,"15":0.0031,_:"0 4 5 6 7 10 11 12 3.1 3.2 6.1 7.1 9.1 10.1 11.1","5.1":0.0031,"12.1":0.0062,"13.1":0.02171,"14.1":0.02791,"15.1":0.0093,"15.2-15.3":0.01861,"15.4":0.0031,"15.5":0.0062,"15.6":0.08373,"16.0":0.0062,"16.1":0.02481,"16.2":0.05272,"16.3":0.18606,"16.4":0.01551,"16.5":0.03721,"16.6":0.25118,"17.0":0.09613,"17.1":0.19846,"17.2":0.0031},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00268,"5.0-5.1":0.00268,"6.0-6.1":0.00669,"7.0-7.1":0.00936,"8.1-8.4":0.00134,"9.0-9.2":0.0107,"9.3":0.03344,"10.0-10.2":0.00268,"10.3":0.04816,"11.0-11.2":0.02274,"11.3-11.4":0.02007,"12.0-12.1":0.01204,"12.2-12.5":0.21939,"13.0-13.1":0.00535,"13.2":0.02274,"13.3":0.01338,"13.4-13.7":0.03879,"14.0-14.4":0.103,"14.5-14.8":0.16721,"15.0-15.1":0.06555,"15.2-15.3":0.08026,"15.4":0.08963,"15.5":0.12575,"15.6-15.7":0.66083,"16.0":0.31035,"16.1":0.62204,"16.2":0.29831,"16.3":0.55917,"16.4":0.11504,"16.5":0.29697,"16.6-16.7":5.03383,"17.0":1.50761,"17.1":2.5323,"17.2":0.07224},P:{"4":0.35156,"20":0.11374,"21":0.07238,"22":0.62039,"23":2.66768,"5.0-5.4":0.07238,"6.2-6.4":0.06204,"7.2-7.4":0.01034,"8.2":0.01034,_:"9.2 10.1 12.0 14.0 15.0","11.1-11.2":0.01034,"13.0":0.02068,"16.0":0.02068,"17.0":0.01034,"18.0":0.04136,"19.0":0.04136},I:{"0":0.13043,"3":0.00001,"4":0.00003,"2.1":0,"2.2":0.00003,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00009,"4.4":0,"4.4.3-4.4.4":0.00039},K:{"0":0.25526,_:"10 11 12 11.1 11.5 12.1"},A:{"6":0.0031,"7":0.0062,"8":0.06512,"9":0.01551,"10":0.0124,"11":0.07753,_:"5.5"},N:{_:"10 11"},S:{"2.5":0.0069,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.0276},H:{"0":0},L:{"0":51.18235},R:{_:"0"},M:{"0":0.19317},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MG.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MG.js
    index 89db0a8aba47af..c115f7727fe6ed 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MG.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MG.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00404,"44":0,"45":0.00404,"46":0,"47":0.00404,"48":0.00404,"49":0,"50":0,"51":0,"52":0.02829,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00404,"59":0,"60":0.00404,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00404,"69":0,"70":0,"71":0,"72":0.00808,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.02425,"79":0.02425,"80":0,"81":0,"82":0.00404,"83":0.00404,"84":0,"85":0,"86":0,"87":0,"88":0.00808,"89":0.00404,"90":0,"91":0.01616,"92":0,"93":0,"94":0.12527,"95":0.00404,"96":0.00404,"97":0,"98":0,"99":0.00404,"100":0.00404,"101":0.00404,"102":0.09294,"103":0.00404,"104":0.23438,"105":0.00404,"106":0.00808,"107":0.00808,"108":0.00808,"109":0.02425,"110":0.01212,"111":0.02829,"112":0.00808,"113":0.02425,"114":0.0687,"115":0.53745,"116":0.10103,"117":1.13552,"118":0.08082,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.04041,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0.00404,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00404,"41":0,"42":0.00404,"43":0.01616,"44":0,"45":0,"46":0,"47":0,"48":0.00404,"49":0.00404,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.00404,"56":0,"57":0.00808,"58":0.00404,"59":0,"60":0,"61":0.00404,"62":0,"63":0.00404,"64":0.00404,"65":0,"66":0,"67":0,"68":0,"69":0.00404,"70":0.00404,"71":0,"72":0.01212,"73":0.00404,"74":0.00404,"75":0,"76":0,"77":0,"78":0.00404,"79":0.00808,"80":0.00808,"81":0.01212,"83":0.00404,"84":0.00404,"85":0,"86":0.00808,"87":0.00404,"88":0.00808,"89":0.00404,"90":0.00808,"91":0.00404,"92":0.00404,"93":0.00808,"94":0.00404,"95":0.02021,"96":0.01212,"97":0.01212,"98":0.00404,"99":0.01616,"100":0.02021,"101":0.00808,"102":0.01212,"103":0.04445,"104":0.00808,"105":0.01212,"106":0.03637,"107":0.01212,"108":0.03233,"109":2.03262,"110":0.02829,"111":0.02021,"112":0.02425,"113":0.0687,"114":0.15356,"115":0.27075,"116":4.59462,"117":1.28908,"118":0.00404,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0.00404,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0.00404,"26":0.00404,"27":0.01212,"28":0.00808,"29":0,"30":0,"31":0,"32":0,"33":0.00404,"34":0,"35":0.00404,"36":0.00404,"37":0.00808,"38":0.00404,"39":0,"40":0,"41":0,"42":0.00404,"43":0,"44":0,"45":0.00404,"46":0,"47":0,"48":0,"49":0,"50":0.00404,"51":0,"52":0,"53":0.02021,"54":0,"55":0,"56":0,"57":0,"58":0.00808,"60":0.05253,"62":0.00808,"63":0.00808,"64":0.00808,"65":0.00404,"66":0.00808,"67":0.00808,"68":0.00808,"69":0.04041,"70":0.04041,"71":0.05253,"72":0.25054,"73":0.05253,"74":0.00404,"75":0,"76":0,"77":0.00808,"78":0,"79":0.00808,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00808,"86":0.00404,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.03233,"96":0,"97":0.00404,"98":0,"99":0.00404,"100":0.02425,"101":0.19801,"102":0.2263,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.01212},B:{"12":0,"13":0.00404,"14":0.00404,"15":0.01212,"16":0,"17":0,"18":0.00808,"79":0,"80":0,"81":0,"83":0,"84":0.00404,"85":0,"86":0,"87":0,"88":0,"89":0.00404,"90":0.00808,"91":0,"92":0.02021,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00808,"101":0.04445,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00808,"108":0,"109":0.04041,"110":0.00808,"111":0.00404,"112":0.00808,"113":0.00808,"114":0.02425,"115":0.0687,"116":0.76779,"117":0.493},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.04849,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00404,"13.1":0.01212,"14.1":0.01616,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.00404,"15.6":0.02425,"16.0":0.00404,"16.1":0.00404,"16.2":0.00404,"16.3":0.01616,"16.4":0.00404,"16.5":0.02021,"16.6":0.08486,"17.0":0.00808,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0.00117,"4.2-4.3":0,"5.0-5.1":0.00292,"6.0-6.1":0,"7.0-7.1":0.01516,"8.1-8.4":0,"9.0-9.2":0.00117,"9.3":0.08573,"10.0-10.2":0,"10.3":0.14288,"11.0-11.2":0.02158,"11.3-11.4":0.00467,"12.0-12.1":0.01575,"12.2-12.5":0.27643,"13.0-13.1":0.00758,"13.2":0.0105,"13.3":1.11271,"13.4-13.7":0.02508,"14.0-14.4":0.08223,"14.5-14.8":0.08573,"15.0-15.1":0.03499,"15.2-15.3":0.04549,"15.4":0.07815,"15.5":0.08748,"15.6-15.7":0.74239,"16.0":0.23036,"16.1":0.20995,"16.2":0.09214,"16.3":0.19828,"16.4":0.2082,"16.5":0.31842,"16.6":1.47196,"17.0":0.18079,"17.1":0.00175},P:{"4":0.05238,"20":0.03143,"21":0.0838,"22":0.67042,"5.0-5.4":0.01048,"6.2-6.4":0,"7.2-7.4":0.03143,"8.2":0,"9.2":0.03143,"10.1":0,"11.1-11.2":0,"12.0":0.02095,"13.0":0,"14.0":0,"15.0":0.01048,"16.0":0.02095,"17.0":0.01048,"18.0":0.01048,"19.0":0.01048},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.0081,"4.2-4.3":0.07017,"4.4":0,"4.4.3-4.4.4":0.18084},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01616,"5.5":0},S:{"2.5":1.12029,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":67.38293},R:{_:"0"},M:{"0":0.35158},Q:{"13.1":0.01192},O:{"0":0.81042},H:{"0":5.1}};
    +module.exports={C:{"27":0.00443,"30":0.01328,"42":0.00443,"43":0.00886,"47":0.00443,"48":0.01771,"49":0.00443,"52":0.05756,"56":0.01328,"58":0.00443,"60":0.00443,"67":0.00443,"68":0.00443,"70":0.00443,"72":0.01328,"75":0.00886,"76":0.00443,"78":0.00443,"79":0.01771,"83":0.00443,"88":0.00443,"89":0.00443,"91":0.01328,"92":0.01328,"94":0.02657,"96":0.00886,"97":0.00443,"98":0.00886,"99":0.04428,"100":0.00443,"101":0.00443,"102":0.02214,"103":0.00443,"104":0.00443,"105":0.00886,"106":0.00443,"107":0.00886,"108":0.01328,"109":0.00886,"110":0.02657,"111":0.07085,"112":0.00443,"113":0.01328,"114":0.01328,"115":9.83459,"116":0.01771,"117":0.04428,"118":0.16384,"119":2.245,"120":0.66863,"121":0.00443,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 28 29 31 32 33 34 35 36 37 38 39 40 41 44 45 46 50 51 53 54 55 57 59 61 62 63 64 65 66 69 71 73 74 77 80 81 82 84 85 86 87 90 93 95 122 123 3.5 3.6"},D:{"11":0.06199,"18":0.00443,"32":0.00443,"33":0.00443,"42":0.00886,"43":0.00886,"47":0.00443,"48":0.00886,"49":0.01771,"55":0.00443,"57":0.00886,"58":0.00443,"60":0.00443,"62":0.00443,"64":0.00443,"65":0.00886,"67":0.00443,"68":0.00886,"69":0.00443,"70":0.00443,"71":0.00443,"72":0.00443,"73":0.00886,"74":0.01771,"76":0.00443,"78":0.01328,"79":0.031,"80":0.00886,"81":0.031,"84":0.00443,"85":0.02214,"86":0.02214,"87":0.03542,"88":0.01328,"89":0.031,"90":0.01328,"91":0.01328,"92":0.00886,"93":0.01771,"94":0.02214,"95":0.02214,"96":0.00886,"97":0.04428,"98":0.00886,"99":0.00443,"100":0.01328,"101":0.01328,"102":0.02657,"103":0.02657,"104":0.01328,"105":0.03985,"106":0.05756,"107":0.02214,"108":0.07085,"109":4.99921,"110":0.01771,"111":0.02657,"112":0.02214,"113":0.03985,"114":0.0797,"115":0.13727,"116":0.26125,"117":0.31882,"118":2.55053,"119":11.88475,"120":0.01328,"121":0.01328,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 19 20 21 22 23 24 25 26 27 28 29 30 31 34 35 36 37 38 39 40 41 44 45 46 50 51 52 53 54 56 59 61 63 66 75 77 83 122"},F:{"34":0.00443,"48":0.00443,"53":0.04871,"73":0.00886,"79":0.01771,"82":0.00443,"85":0.00443,"86":0.00443,"90":0.00886,"93":0.00886,"95":0.06642,"102":0.09299,"103":0.17712,"104":0.54022,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 49 50 51 52 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 74 75 76 77 78 80 81 83 84 87 88 89 91 92 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.00443},B:{"12":0.00443,"15":0.00443,"16":0.00443,"17":0.00886,"18":0.02657,"81":0.00443,"84":0.00886,"89":0.01328,"90":0.01328,"92":0.04428,"100":0.01328,"103":0.00443,"107":0.00443,"108":0.00443,"109":0.09299,"110":0.00443,"111":0.00443,"113":0.00886,"114":0.03985,"115":0.00886,"116":0.01771,"117":0.05756,"118":0.37195,"119":2.48411,_:"13 14 79 80 83 85 86 87 88 91 93 94 95 96 97 98 99 101 102 104 105 106 112"},E:{"14":0.00443,"15":0.00443,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 15.2-15.3 17.2","13.1":0.00886,"14.1":0.03542,"15.1":0.00443,"15.4":0.00443,"15.5":0.03542,"15.6":0.04871,"16.0":0.00886,"16.1":0.01771,"16.2":0.00886,"16.3":0.02214,"16.4":0.00443,"16.5":0.01328,"16.6":0.1107,"17.0":0.06199,"17.1":0.06199},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00063,"5.0-5.1":0.00063,"6.0-6.1":0.00157,"7.0-7.1":0.0022,"8.1-8.4":0.00031,"9.0-9.2":0.00251,"9.3":0.00786,"10.0-10.2":0.00063,"10.3":0.01131,"11.0-11.2":0.00534,"11.3-11.4":0.00471,"12.0-12.1":0.00283,"12.2-12.5":0.05154,"13.0-13.1":0.00126,"13.2":0.00534,"13.3":0.00314,"13.4-13.7":0.00911,"14.0-14.4":0.0242,"14.5-14.8":0.03928,"15.0-15.1":0.0154,"15.2-15.3":0.01886,"15.4":0.02106,"15.5":0.02954,"15.6-15.7":0.15524,"16.0":0.07291,"16.1":0.14613,"16.2":0.07008,"16.3":0.13136,"16.4":0.02703,"16.5":0.06977,"16.6-16.7":1.18256,"17.0":0.35417,"17.1":0.5949,"17.2":0.01697},P:{"4":0.02209,"20":0.01104,"21":0.03313,"22":0.0773,"23":0.36441,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 18.0","7.2-7.4":0.01104,"14.0":0.01104,"15.0":0.02209,"16.0":0.01104,"17.0":0.02209,"19.0":0.02209},I:{"0":0.12197,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00009,"4.4":0,"4.4.3-4.4.4":0.00037},K:{"0":2.0797,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.03542,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.89152,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.66864},H:{"0":1.96},L:{"0":50.18168},R:{_:"0"},M:{"0":0.2786},Q:{"13.1":0.02229}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MH.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MH.js
    index 2dd6f21582fd9e..056f9be50a2159 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MH.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MH.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.01022,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.01022,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0.00511,"113":0.04088,"114":0,"115":0.03577,"116":0.02044,"117":0.17374,"118":0,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.02555,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0.02044,"74":0,"75":0,"76":0,"77":0,"78":0.00511,"79":0,"80":0.01022,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0.01022,"88":0,"89":0.01022,"90":0.00511,"91":0,"92":0,"93":0.0511,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.55188,"104":0,"105":0,"106":0,"107":0.00511,"108":0,"109":1.00156,"110":0,"111":0.00511,"112":0.03066,"113":0.03066,"114":0.01022,"115":0.12264,"116":14.82922,"117":1.92136,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.03066,"102":0.0511,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.02044,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.03577,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.01022,"108":0.01022,"109":0.02044,"110":0,"111":0.02044,"112":0,"113":0.00511,"114":0,"115":0.0511,"116":1.7885,"117":0.53655},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.84315,"14.1":0.06643,"15.1":0,"15.2-15.3":0.00511,"15.4":0.01022,"15.5":0,"15.6":0.01022,"16.0":0,"16.1":0.03066,"16.2":0.12775,"16.3":0.02555,"16.4":0.04088,"16.5":0.06132,"16.6":0.58765,"17.0":0.07665,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0.03301,"11.0-11.2":0.01651,"11.3-11.4":0.04952,"12.0-12.1":0,"12.2-12.5":0.08253,"13.0-13.1":0,"13.2":0,"13.3":0.08253,"13.4-13.7":0,"14.0-14.4":0.54471,"14.5-14.8":0.09904,"15.0-15.1":0.13205,"15.2-15.3":0.14856,"15.4":0.11554,"15.5":0.19807,"15.6-15.7":1.58277,"16.0":0.5282,"16.1":2.58781,"16.2":1.23613,"16.3":1.94407,"16.4":0.13205,"16.5":0.49519,"16.6":7.94317,"17.0":0.37964,"17.1":0},P:{"4":0,"20":0.01038,"21":0.02075,"22":1.66012,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.17639,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01038,"12.0":0,"13.0":0,"14.0":0.07263,"15.0":0,"16.0":0,"17.0":0.06225,"18.0":0.02075,"19.0":0.01038},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.29352},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":52.21272},R:{_:"0"},M:{"0":0.27384},Q:{"13.1":0},O:{"0":1.04646},H:{"0":0.15277}};
    +module.exports={C:{"77":0.01102,"112":0.01102,"113":0.07164,"114":0.01102,"115":0.07164,"118":0.04409,"119":3.42784,"120":0.23146,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 116 117 121 122 123 3.5 3.6"},D:{"23":0.04409,"49":0.01102,"73":0.02204,"76":0.09369,"78":0.01102,"80":0.02204,"93":1.6037,"96":0.01102,"103":0.10471,"106":0.01102,"109":0.73296,"111":0.01102,"112":0.01102,"113":0.33617,"114":0.09369,"115":0.01102,"116":1.09118,"117":0.52355,"118":5.9133,"119":28.22734,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 74 75 77 79 81 83 84 85 86 87 88 89 90 91 92 94 95 97 98 99 100 101 102 104 105 107 108 110 120 121 122"},F:{"102":0.08267,"103":0.12675,"104":0.1984,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.02204,"92":0.01102,"109":0.01102,"113":0.23146,"116":0.04409,"117":0.16533,"118":1.01954,"119":3.94037,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 111 112 114 115"},E:{"14":0.47395,"15":0.07164,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 14.1 15.1 15.5 16.0 17.2","12.1":0.03307,"13.1":0.11573,"15.2-15.3":0.01102,"15.4":0.01102,"15.6":0.10471,"16.1":0.12675,"16.2":0.02204,"16.3":0.02204,"16.4":0.04409,"16.5":0.07164,"16.6":0.06062,"17.0":0.74399,"17.1":0.29208},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00194,"5.0-5.1":0.00194,"6.0-6.1":0.00484,"7.0-7.1":0.00678,"8.1-8.4":0.00097,"9.0-9.2":0.00775,"9.3":0.02422,"10.0-10.2":0.00194,"10.3":0.03488,"11.0-11.2":0.01647,"11.3-11.4":0.01453,"12.0-12.1":0.00872,"12.2-12.5":0.15891,"13.0-13.1":0.00388,"13.2":0.01647,"13.3":0.00969,"13.4-13.7":0.0281,"14.0-14.4":0.07461,"14.5-14.8":0.12112,"15.0-15.1":0.04748,"15.2-15.3":0.05814,"15.4":0.06492,"15.5":0.09108,"15.6-15.7":0.47866,"16.0":0.22479,"16.1":0.45056,"16.2":0.21607,"16.3":0.40502,"16.4":0.08333,"16.5":0.21511,"16.6-16.7":3.64613,"17.0":1.092,"17.1":1.83421,"17.2":0.05232},P:{"21":0.02134,"22":0.13874,"23":1.07791,_:"4 20 5.0-5.4 6.2-6.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 18.0 19.0","7.2-7.4":0.01067,"16.0":0.05336,"17.0":0.08538},I:{"0":0.04914,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00015},K:{"0":1.02821,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.10471,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.53431},H:{"0":0},L:{"0":33.71133},R:{_:"0"},M:{"0":2.19561},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MK.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MK.js
    index c1c06a2e91bd38..348f231d01bcc8 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MK.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MK.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0.00366,"52":0.04391,"53":0,"54":0,"55":0,"56":0.00732,"57":0,"58":0,"59":0,"60":0,"61":0.00366,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.02927,"68":0.00366,"69":0,"70":0,"71":0,"72":0.00366,"73":0,"74":0,"75":0.01098,"76":0,"77":0,"78":0.00366,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.03293,"91":0,"92":0,"93":0,"94":0.00732,"95":0.00366,"96":0,"97":0,"98":0,"99":0.00366,"100":0,"101":0,"102":0.01098,"103":0.00366,"104":0.00732,"105":0.00732,"106":0,"107":0,"108":0,"109":0.01464,"110":0.00366,"111":0.01464,"112":0.00366,"113":0.00732,"114":0.00366,"115":0.18295,"116":0.02927,"117":0.56715,"118":0.04757,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00366,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00366,"39":0,"40":0,"41":0.00366,"42":0,"43":0.00366,"44":0.00366,"45":0.00366,"46":0.00366,"47":0.00732,"48":0,"49":0.04391,"50":0,"51":0.00366,"52":0,"53":0.00732,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00366,"65":0,"66":0.00366,"67":0,"68":0,"69":0.00732,"70":0.00366,"71":0.00366,"72":0,"73":0.01098,"74":0,"75":0.00366,"76":0.04391,"77":0.04391,"78":0,"79":0.06586,"80":0.00732,"81":0.02195,"83":0.00732,"84":0.02195,"85":0.05489,"86":0.00732,"87":0.04391,"88":0.00366,"89":0.00732,"90":0.0183,"91":0.01098,"92":0.00366,"93":0.05123,"94":0,"95":0.01464,"96":0.00366,"97":0,"98":0,"99":0.02195,"100":0.00366,"101":0,"102":0.0183,"103":0.01098,"104":0.00366,"105":0.00732,"106":0.02561,"107":0.06952,"108":0.03293,"109":1.42335,"110":0.02195,"111":0.03659,"112":0.05854,"113":0.02195,"114":0.0805,"115":0.12075,"116":6.07394,"117":1.57337,"118":0.02927,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.01098,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00366,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00732,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00366,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.01098,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00366,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.00366,"95":0.05854,"96":0,"97":0,"98":0,"99":0.00366,"100":0.03293,"101":0.19759,"102":0.17929,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00366,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00366,"93":0.05123,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.00366,"104":0,"105":0.00366,"106":0.00732,"107":0.00732,"108":0.00732,"109":0.00732,"110":0.00366,"111":0,"112":0.00366,"113":0,"114":0.00732,"115":0.0183,"116":0.35126,"117":0.31833},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00366,"10":0,"11":0,"12":0,"13":0,"14":0.00732,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00732,"14.1":0.00732,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.00732,"15.6":0.02561,"16.0":0.00366,"16.1":0.01098,"16.2":0.00366,"16.3":0.01098,"16.4":0.00366,"16.5":0.02195,"16.6":0.09879,"17.0":0.00732,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.02958,"8.1-8.4":0.01294,"9.0-9.2":0,"9.3":0.04437,"10.0-10.2":0,"10.3":0.02404,"11.0-11.2":0.03698,"11.3-11.4":0.0037,"12.0-12.1":0.01109,"12.2-12.5":0.23851,"13.0-13.1":0,"13.2":0,"13.3":1.51427,"13.4-13.7":0.02958,"14.0-14.4":0.12758,"14.5-14.8":0.29768,"15.0-15.1":0.05177,"15.2-15.3":0.04992,"15.4":0.13497,"15.5":0.14791,"15.6-15.7":1.27576,"16.0":0.58056,"16.1":0.94665,"16.2":0.39012,"16.3":0.81538,"16.4":0.16271,"16.5":0.56392,"16.6":9.66987,"17.0":1.07607,"17.1":0.00185},P:{"4":0.2128,"20":0.05067,"21":0.11146,"22":2.53329,"5.0-5.4":0.01013,"6.2-6.4":0,"7.2-7.4":0.01013,"8.2":0,"9.2":0.01013,"10.1":0,"11.1-11.2":0.01013,"12.0":0,"13.0":0.0304,"14.0":0.01013,"15.0":0.01013,"16.0":0.02027,"17.0":0.02027,"18.0":0.01013,"19.0":0.04053},I:{"0":0,"3":0,"4":0.00312,"2.1":0,"2.2":0.00156,"2.3":0.00234,"4.1":0.10615,"4.2-4.3":0.00546,"4.4":0,"4.4.3-4.4.4":0.02966},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01464,"9":0.00366,"10":0.00366,"11":0.05123,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0.00634},N:{"10":0.01268,"11":0},L:{"0":63.72068},R:{_:"0"},M:{"0":0.13316},Q:{"13.1":0},O:{"0":0.01902},H:{"0":0.24013}};
    +module.exports={C:{"38":0.0042,"45":0.0042,"48":0.0042,"51":0.0126,"52":0.07562,"56":0.0168,"61":0.0042,"67":0.0042,"68":0.0084,"72":0.0042,"75":0.0126,"78":0.0084,"88":0.0042,"94":0.0168,"99":0.02101,"103":0.0042,"104":0.0042,"105":0.0126,"106":0.0042,"107":0.0126,"108":0.0168,"109":0.0042,"110":0.0042,"111":0.0042,"113":0.0042,"114":0.0126,"115":0.4117,"117":0.0168,"118":0.02941,"119":1.23509,"120":0.4201,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 46 47 49 50 53 54 55 57 58 59 60 62 63 64 65 66 69 70 71 73 74 76 77 79 80 81 82 83 84 85 86 87 89 90 91 92 93 95 96 97 98 100 101 102 112 116 121 122 123 3.5","3.6":0.0042},D:{"38":0.0084,"39":0.0042,"41":0.0084,"42":0.0042,"43":0.0042,"44":0.0042,"45":0.0042,"46":0.0042,"47":0.0168,"49":0.07562,"51":0.0084,"53":0.0084,"58":0.0042,"61":0.0042,"66":0.0042,"69":0.0084,"70":0.02101,"71":0.0126,"72":0.0042,"73":0.02941,"74":0.0126,"75":0.0042,"76":0.0042,"77":0.05041,"78":0.0042,"79":0.18905,"81":0.0168,"83":0.03361,"84":0.06302,"85":0.03781,"86":0.0084,"87":0.05461,"88":0.0126,"89":0.0168,"90":0.0126,"91":0.02101,"92":0.0168,"93":0.0042,"94":0.0084,"95":0.02941,"96":0.0042,"97":0.0042,"98":0.0084,"99":0.02941,"100":0.0084,"101":0.0042,"102":0.02101,"103":0.06302,"104":0.0126,"105":0.05461,"106":0.13443,"107":0.19325,"108":0.07982,"109":3.82291,"110":0.11343,"111":0.05881,"112":0.15964,"113":0.0126,"114":0.05041,"115":0.03781,"116":0.12183,"117":0.19325,"118":3.89853,"119":24.86152,"120":0.0084,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 40 48 50 52 54 55 56 57 59 60 62 63 64 65 67 68 80 121 122"},F:{"28":0.0168,"36":0.0042,"46":0.02101,"65":0.0042,"79":0.0168,"85":0.0042,"93":0.0042,"95":0.11763,"102":0.21845,"103":0.10923,"104":0.4327,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 86 87 88 89 90 91 92 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.0042,"92":0.0168,"105":0.0084,"106":0.03781,"107":0.02941,"108":0.15964,"109":0.03361,"110":0.0042,"111":0.0042,"113":0.0042,"114":0.0042,"115":0.0084,"116":0.0042,"117":0.02941,"118":0.29827,"119":1.43674,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 112"},E:{"7":0.0042,"9":0.0126,"14":0.0084,_:"0 4 5 6 8 10 11 12 13 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 15.1 15.2-15.3","12.1":0.0042,"13.1":0.0168,"14.1":0.02941,"15.4":0.0042,"15.5":0.0042,"15.6":0.04201,"16.0":0.0042,"16.1":0.0168,"16.2":0.0084,"16.3":0.02101,"16.4":0.02521,"16.5":0.03361,"16.6":0.11763,"17.0":0.05041,"17.1":0.11343,"17.2":0.0042},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00223,"5.0-5.1":0.00223,"6.0-6.1":0.00557,"7.0-7.1":0.0078,"8.1-8.4":0.00111,"9.0-9.2":0.00892,"9.3":0.02786,"10.0-10.2":0.00223,"10.3":0.04012,"11.0-11.2":0.01894,"11.3-11.4":0.01672,"12.0-12.1":0.01003,"12.2-12.5":0.18276,"13.0-13.1":0.00446,"13.2":0.01894,"13.3":0.01114,"13.4-13.7":0.03232,"14.0-14.4":0.08581,"14.5-14.8":0.1393,"15.0-15.1":0.0546,"15.2-15.3":0.06686,"15.4":0.07466,"15.5":0.10475,"15.6-15.7":0.5505,"16.0":0.25854,"16.1":0.51818,"16.2":0.24851,"16.3":0.46581,"16.4":0.09584,"16.5":0.24739,"16.6-16.7":4.1934,"17.0":1.2559,"17.1":2.10951,"17.2":0.06018},P:{"4":0.22553,"20":0.03075,"21":0.06151,"22":0.18452,"23":1.98874,"5.0-5.4":0.0205,"6.2-6.4":0.01025,"7.2-7.4":0.01025,_:"8.2 10.1 12.0 15.0","9.2":0.03075,"11.1-11.2":0.01025,"13.0":0.041,"14.0":0.0205,"16.0":0.01025,"17.0":0.01025,"18.0":0.01025,"19.0":0.03075},I:{"0":0.08077,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00024},K:{"0":0.17974,_:"10 11 12 11.1 11.5 12.1"},A:{"7":0.0042,"8":0.02941,"9":0.0042,"10":0.0042,"11":0.05041,_:"6 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.01739},H:{"0":0},L:{"0":44.57997},R:{_:"0"},M:{"0":0.08697},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ML.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ML.js
    index a763ebf9e7c81f..38f93e42128916 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ML.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ML.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00187,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0.0056,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.05595,"96":0,"97":0,"98":0,"99":0.00187,"100":0,"101":0,"102":0.00746,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0.00187,"115":0.05036,"116":0.02425,"117":0.17904,"118":0.01492,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.01119,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00373,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.00187,"71":0,"72":0.00187,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.00373,"80":0.00373,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00373,"93":0,"94":0,"95":0.00187,"96":0,"97":0,"98":0.00187,"99":0.00373,"100":0,"101":0,"102":0,"103":0.00187,"104":0,"105":0,"106":0.00187,"107":0.0056,"108":0.00187,"109":0.08952,"110":0,"111":0,"112":0.00187,"113":0.00187,"114":0.00746,"115":0.00933,"116":0.84112,"117":0.22567,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0.00187,"33":0,"34":0,"35":0,"36":0,"37":0.00187,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0.00187,"55":0,"56":0,"57":0,"58":0,"60":0.00187,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.00187,"68":0,"69":0.00187,"70":0.00187,"71":0.00746,"72":0.00933,"73":0.00187,"74":0,"75":0,"76":0,"77":0.00746,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01679,"96":0,"97":0,"98":0,"99":0,"100":0.00187,"101":0.01865,"102":0.02798,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0.00187,"17":0,"18":0.00187,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.00187,"91":0,"92":0.00373,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0.00187,"106":0,"107":0,"108":0,"109":0.01679,"110":0,"111":0,"112":0.00373,"113":0,"114":0.00187,"115":0.01679,"116":0.2294,"117":0.17904},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00187,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00187,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.02052,"14.1":0,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0.00373,"16.0":0,"16.1":0,"16.2":0,"16.3":0.00187,"16.4":0,"16.5":0.00373,"16.6":0.0056,"17.0":0,"17.1":0},G:{"8":0.00174,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00697,"5.0-5.1":0,"6.0-6.1":0.01045,"7.0-7.1":0.05923,"8.1-8.4":0,"9.0-9.2":0.00697,"9.3":0.07665,"10.0-10.2":0.00871,"10.3":0.01394,"11.0-11.2":0.00174,"11.3-11.4":0.00348,"12.0-12.1":0.23519,"12.2-12.5":1.94074,"13.0-13.1":0.03484,"13.2":0.00871,"13.3":0.11672,"13.4-13.7":0.14286,"14.0-14.4":0.80661,"14.5-14.8":0.58362,"15.0-15.1":1.60974,"15.2-15.3":0.10801,"15.4":0.19686,"15.5":0.25435,"15.6-15.7":1.8066,"16.0":0.26655,"16.1":0.36933,"16.2":0.38675,"16.3":0.97211,"16.4":0.40069,"16.5":1.38848,"16.6":4.08531,"17.0":1.4181,"17.1":0},P:{"4":0.19081,"20":0.05021,"21":0.34145,"22":0.92393,"5.0-5.4":0.01004,"6.2-6.4":0,"7.2-7.4":0.17073,"8.2":0,"9.2":0.03013,"10.1":0,"11.1-11.2":0.03013,"12.0":0.01004,"13.0":0.01004,"14.0":0.05021,"15.0":0.02009,"16.0":0.05021,"17.0":0.04017,"18.0":0.03013,"19.0":0.31133},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00034,"4.2-4.3":0.00189,"4.4":0,"4.4.3-4.4.4":0.03642},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00187,"5.5":0},S:{"2.5":0.11389,_:"3.0-3.1"},J:{"7":0,"10":0.00814},N:{"10":0,"11":0},L:{"0":75.87459},R:{_:"0"},M:{"0":0.3254},Q:{"13.1":0.00814},O:{"0":0.51251},H:{"0":0.53912}};
    +module.exports={C:{"47":0.00128,"48":0.00128,"50":0.00128,"56":0.00128,"69":0.00128,"72":0.0064,"78":0.00128,"99":0.06779,"110":0.00128,"112":0.00128,"115":0.13941,"117":0.00128,"118":0.02046,"119":0.60753,"120":0.20208,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 49 51 52 53 54 55 57 58 59 60 61 62 63 64 65 66 67 68 70 71 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 100 101 102 103 104 105 106 107 108 109 111 113 114 116 121 122 123 3.5 3.6"},D:{"25":0.00128,"44":0.00128,"47":0.00256,"49":0.00256,"50":0.00128,"58":0.00128,"65":0.00256,"66":0.00128,"68":0.00256,"70":0.00128,"72":0.0064,"76":0.00256,"79":0.00384,"80":0.00256,"81":0.0307,"83":0.00256,"84":0.00128,"86":0.00128,"87":0.00384,"92":0.0064,"93":0.01279,"94":0.00128,"95":0.00256,"98":0.01791,"99":0.00256,"102":0.00384,"103":0.04349,"105":0.02174,"106":0.00256,"107":0.01919,"108":0.00384,"109":0.5116,"110":0.00895,"111":0.00256,"112":0.00512,"114":0.01151,"115":0.02558,"116":0.07035,"117":0.06779,"118":0.91832,"119":4.10175,"120":0.00256,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 45 46 48 51 52 53 54 55 56 57 59 60 61 62 63 64 67 69 71 73 74 75 77 78 85 88 89 90 91 96 97 100 101 104 113 121 122"},F:{"38":0.00384,"78":0.00128,"95":0.06139,"100":0.00128,"102":0.00256,"103":0.06395,"104":0.12918,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00128,"13":0.05756,"15":0.00384,"17":0.00256,"18":0.02814,"84":0.00128,"85":0.00128,"89":0.00128,"90":0.00512,"92":0.01407,"100":0.00384,"103":0.0064,"107":0.00128,"109":0.13685,"110":0.00256,"111":0.00128,"112":0.00767,"113":0.00256,"114":0.0064,"115":0.06779,"116":0.00512,"117":0.02046,"118":0.22638,"119":1.40434,_:"14 16 79 80 81 83 86 87 88 91 93 94 95 96 97 98 99 101 102 104 105 106 108"},E:{_:"0 4 5 6 7 8 9 10 11 12 13 14 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1 12.1 15.1 15.4 15.5 16.0 16.1 16.2 17.2","5.1":0.00767,"13.1":0.07035,"14.1":0.01279,"15.2-15.3":0.00128,"15.6":0.02046,"16.3":0.00256,"16.4":0.00128,"16.5":0.00512,"16.6":0.00384,"17.0":0.00895,"17.1":0.01407},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00292,"5.0-5.1":0.00292,"6.0-6.1":0.0073,"7.0-7.1":0.01022,"8.1-8.4":0.00146,"9.0-9.2":0.01168,"9.3":0.0365,"10.0-10.2":0.00292,"10.3":0.05256,"11.0-11.2":0.02482,"11.3-11.4":0.0219,"12.0-12.1":0.01314,"12.2-12.5":0.23942,"13.0-13.1":0.00584,"13.2":0.02482,"13.3":0.0146,"13.4-13.7":0.04234,"14.0-14.4":0.11241,"14.5-14.8":0.18249,"15.0-15.1":0.07153,"15.2-15.3":0.08759,"15.4":0.09781,"15.5":0.13723,"15.6-15.7":0.72119,"16.0":0.3387,"16.1":0.67885,"16.2":0.32556,"16.3":0.61024,"16.4":0.12555,"16.5":0.3241,"16.6-16.7":5.49359,"17.0":1.6453,"17.1":2.76358,"17.2":0.07883},P:{"4":0.26407,"20":0.06094,"21":0.17266,"22":0.7008,"23":0.51798,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 11.1-11.2 13.0","7.2-7.4":0.32501,"12.0":0.01016,"14.0":0.03047,"15.0":0.02031,"16.0":0.05078,"17.0":0.05078,"18.0":0.02031,"19.0":0.24376},I:{"0":0.00868,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00003},K:{"0":0.36454,_:"10 11 12 11.1 11.5 12.1"},A:{"9":0.00183,"11":0.01096,_:"6 7 8 10 5.5"},N:{_:"10 11"},S:{"2.5":0.09593,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.21803},H:{"0":0.15},L:{"0":72.25479},R:{_:"0"},M:{"0":0.11337},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MM.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MM.js
    index 880df73850fac7..2f5106a3aa1efb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MM.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MM.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00283,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00567,"103":0.00283,"104":0,"105":0.00283,"106":0,"107":0.00283,"108":0.00283,"109":0,"110":0.00283,"111":0.00283,"112":0.00283,"113":0.00283,"114":0.0085,"115":0.09919,"116":0.03968,"117":0.56113,"118":0.10202,"119":0.00283,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00283,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00283,"38":0.00283,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00283,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.00283,"71":0.01417,"72":0,"73":0,"74":0.00283,"75":0,"76":0,"77":0,"78":0,"79":0.00567,"80":0.00283,"81":0.00283,"83":0,"84":0,"85":0.0085,"86":0.00283,"87":0.00567,"88":0.00283,"89":0.00567,"90":0.00283,"91":0.00283,"92":0.00567,"93":0,"94":0.00283,"95":0.00283,"96":0.00283,"97":0,"98":0,"99":0.017,"100":0.00567,"101":0,"102":0.00283,"103":0.00567,"104":0.00283,"105":0.00283,"106":0.00567,"107":0.00567,"108":0.00567,"109":0.24089,"110":0.00283,"111":0.00567,"112":0.01134,"113":0.01134,"114":0.04534,"115":0.05668,"116":2.88785,"117":0.90971,"118":0.00567,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00567,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00283,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0.00283,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00283,"70":0.00283,"71":0,"72":0.01417,"73":0.00283,"74":0,"75":0,"76":0,"77":0.00567,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00283,"96":0,"97":0,"98":0,"99":0,"100":0.01984,"101":0.05101,"102":0.06235,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00283,"13":0,"14":0.00283,"15":0,"16":0,"17":0,"18":0.0085,"79":0,"80":0,"81":0,"83":0,"84":0.01134,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.0085,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00567,"110":0,"111":0,"112":0.00567,"113":0,"114":0.00567,"115":0.02551,"116":0.38826,"117":0.2834},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00283,"10":0,"11":0,"12":0,"13":0,"14":0.00567,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00283,"10.1":0,"11.1":0,"12.1":0.00283,"13.1":0.00567,"14.1":0.06235,"15.1":0.00567,"15.2-15.3":0.02551,"15.4":0.00283,"15.5":0.00567,"15.6":0.03684,"16.0":0.00567,"16.1":0.01984,"16.2":0.0085,"16.3":0.03684,"16.4":0.0085,"16.5":0.03401,"16.6":0.19555,"17.0":0.04251,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00378,"5.0-5.1":0.00756,"6.0-6.1":0.00095,"7.0-7.1":0.00378,"8.1-8.4":0.01512,"9.0-9.2":0.00189,"9.3":0.02836,"10.0-10.2":0.00284,"10.3":0.06144,"11.0-11.2":0.03876,"11.3-11.4":0.00473,"12.0-12.1":0.00756,"12.2-12.5":0.24955,"13.0-13.1":0.00189,"13.2":0.00189,"13.3":0.00473,"13.4-13.7":0.03119,"14.0-14.4":0.08507,"14.5-14.8":0.1503,"15.0-15.1":0.04915,"15.2-15.3":0.0794,"15.4":0.08602,"15.5":0.17866,"15.6-15.7":0.98875,"16.0":0.21363,"16.1":0.50666,"16.2":0.26089,"16.3":0.56244,"16.4":0.10303,"16.5":0.40836,"16.6":4.50704,"17.0":0.71651,"17.1":0},P:{"4":0.14521,"20":0.05186,"21":0.09335,"22":1.04756,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.04149,"8.2":0,"9.2":0.01037,"10.1":0.01037,"11.1-11.2":0.02074,"12.0":0,"13.0":0.02074,"14.0":0.01037,"15.0":0,"16.0":0.02074,"17.0":0.03112,"18.0":0.03112,"19.0":0.04149},I:{"0":0,"3":0,"4":0.00451,"2.1":0,"2.2":0,"2.3":0.00226,"4.1":0.00451,"4.2-4.3":0.01804,"4.4":0,"4.4.3-4.4.4":0.34052},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00756,"9":0.00378,"10":0,"11":0.01134,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":77.35961},R:{_:"0"},M:{"0":0.15765},Q:{"13.1":0.06449},O:{"0":1.92049},H:{"0":0.4342}};
    +module.exports={C:{"29":0.00256,"39":0.00256,"40":0.00256,"41":0.00256,"42":0.00256,"43":0.00256,"47":0.00256,"50":0.00256,"52":0.00256,"54":0.00256,"56":0.00256,"57":0.00256,"62":0.00256,"64":0.00512,"70":0.00256,"72":0.01024,"83":0.00256,"84":0.00256,"85":0.00256,"89":0.00256,"91":0.00256,"92":0.00256,"94":0.00256,"95":0.00256,"100":0.00256,"102":0.00768,"104":0.00256,"105":0.00512,"106":0.00256,"107":0.00768,"108":0.00512,"109":0.00256,"110":0.00256,"111":0.00512,"112":0.00256,"113":0.00512,"114":0.01536,"115":0.26624,"116":0.01024,"117":0.01792,"118":0.05632,"119":2.05568,"120":0.55296,"121":0.01792,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 30 31 32 33 34 35 36 37 38 44 45 46 48 49 51 53 55 58 59 60 61 63 65 66 67 68 69 71 73 74 75 76 77 78 79 80 81 82 86 87 88 90 93 96 97 98 99 101 103 122 123 3.5","3.6":0.00256},D:{"11":0.00256,"31":0.00256,"37":0.00256,"38":0.00256,"39":0.00256,"40":0.00256,"41":0.00512,"42":0.00256,"43":0.00512,"44":0.00512,"45":0.00256,"46":0.00512,"47":0.00256,"49":0.00256,"51":0.00512,"53":0.01792,"55":0.00512,"56":0.00256,"61":0.00256,"62":0.00512,"63":0.00256,"65":0.00256,"66":0.00256,"67":0.00256,"68":0.00256,"70":0.00512,"71":0.00768,"74":0.00768,"75":0.00256,"76":0.00256,"78":0.00512,"79":0.02304,"80":0.01792,"81":0.00512,"83":0.00256,"84":0.01024,"85":0.00768,"86":0.00256,"87":0.0128,"88":0.00256,"89":0.02048,"90":0.00256,"91":0.00768,"92":0.00512,"93":0.00256,"94":0.04864,"95":0.00768,"96":0.00512,"97":0.00512,"98":0.00256,"99":0.03072,"100":0.01024,"101":0.00256,"102":0.00768,"103":0.0128,"104":0.00768,"105":0.00768,"106":0.02304,"107":0.0128,"108":0.0128,"109":0.72192,"110":0.01024,"111":0.02048,"112":0.02048,"113":0.01792,"114":0.10496,"115":0.03072,"116":0.10752,"117":0.56576,"118":2.20672,"119":10.79296,"120":0.02048,"121":0.00256,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 33 34 35 36 48 50 52 54 57 58 59 60 64 69 72 73 77 122"},F:{"31":0.00256,"46":0.00256,"74":0.00256,"77":0.00256,"79":0.00256,"95":0.00768,"101":0.00256,"102":0.13824,"103":0.05888,"104":0.24832,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 75 76 78 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00512,"14":0.00256,"15":0.00256,"16":0.00512,"17":0.00256,"18":0.02304,"84":0.00256,"88":0.00256,"89":0.00256,"90":0.00256,"92":0.03072,"100":0.00512,"109":0.01536,"110":0.00256,"111":0.00256,"112":0.00256,"113":0.00256,"114":0.00768,"115":0.0128,"116":0.01536,"117":0.03584,"118":0.31232,"119":1.89184,_:"13 79 80 81 83 85 86 87 91 93 94 95 96 97 98 99 101 102 103 104 105 106 107 108"},E:{"9":0.00768,"13":0.04608,"14":0.02304,"15":0.00512,_:"0 4 5 6 7 8 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1","10.1":0.00512,"11.1":0.00512,"12.1":0.00256,"13.1":0.0128,"14.1":0.03584,"15.1":0.02048,"15.2-15.3":0.00512,"15.4":0.01792,"15.5":0.01536,"15.6":0.11264,"16.0":0.04352,"16.1":0.04864,"16.2":0.02048,"16.3":0.11264,"16.4":0.03584,"16.5":0.0512,"16.6":0.43008,"17.0":0.21504,"17.1":0.24576,"17.2":0.00256},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00153,"5.0-5.1":0.00153,"6.0-6.1":0.00382,"7.0-7.1":0.00535,"8.1-8.4":0.00076,"9.0-9.2":0.00611,"9.3":0.0191,"10.0-10.2":0.00153,"10.3":0.02751,"11.0-11.2":0.01299,"11.3-11.4":0.01146,"12.0-12.1":0.00688,"12.2-12.5":0.12531,"13.0-13.1":0.00306,"13.2":0.01299,"13.3":0.00764,"13.4-13.7":0.02216,"14.0-14.4":0.05883,"14.5-14.8":0.09551,"15.0-15.1":0.03744,"15.2-15.3":0.04585,"15.4":0.05119,"15.5":0.07182,"15.6-15.7":0.37746,"16.0":0.17727,"16.1":0.3553,"16.2":0.17039,"16.3":0.31939,"16.4":0.06571,"16.5":0.16963,"16.6-16.7":2.87526,"17.0":0.86113,"17.1":1.44642,"17.2":0.04126},P:{"4":0.10216,"20":0.02043,"21":0.05108,"22":0.15324,"23":0.84794,_:"5.0-5.4 6.2-6.4 8.2 15.0","7.2-7.4":0.03065,"9.2":0.01022,"10.1":0.01022,"11.1-11.2":0.02043,"12.0":0.01022,"13.0":0.02043,"14.0":0.01022,"16.0":0.02043,"17.0":0.01022,"18.0":0.02043,"19.0":0.03065},I:{"0":0.42196,"3":0.00004,"4":0.00008,"2.1":0,"2.2":0.00008,"2.3":0,"4.1":0.00004,"4.2-4.3":0.0003,"4.4":0,"4.4.3-4.4.4":0.00127},K:{"0":0.55056,_:"10 11 12 11.1 11.5 12.1"},A:{"7":0.00834,"8":0.04172,"9":0.00834,"10":0.00834,"11":0.04172,_:"6 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":1.61448},H:{"0":0},L:{"0":64.72984},R:{_:"0"},M:{"0":0.19344},Q:{"13.1":0.04464}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MN.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MN.js
    index 1401254bbd6ddd..eeb37cb0f98747 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MN.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MN.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00446,"39":0,"40":0.00446,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.00446,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00446,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0.00446,"113":0.00446,"114":0.00446,"115":0.10697,"116":0.04011,"117":0.46799,"118":0.04011,"119":0,"120":0,"3.5":0,"3.6":0.00446},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00446,"39":0.00446,"40":0.00446,"41":0.00446,"42":0.00446,"43":0.00446,"44":0.00891,"45":0.00446,"46":0.00446,"47":0.00446,"48":0,"49":0,"50":0,"51":0.00891,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0.00446,"62":0,"63":0.00446,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.00891,"71":0,"72":0,"73":0,"74":0.00446,"75":0.00446,"76":0,"77":0.00446,"78":0,"79":0.01337,"80":0,"81":0.00446,"83":0.00446,"84":0,"85":0.00891,"86":0.00446,"87":0.00446,"88":0.00446,"89":0.00446,"90":0.00446,"91":0.00446,"92":0.00446,"93":0,"94":0,"95":0.00446,"96":0,"97":0.00446,"98":0.00446,"99":0.02229,"100":0.00446,"101":0.00446,"102":0.0936,"103":0.03566,"104":0.39222,"105":0.02674,"106":0.00891,"107":0.01337,"108":0.01337,"109":1.37721,"110":0.00891,"111":0.02229,"112":0.05794,"113":0.11143,"114":0.12034,"115":0.28079,"116":9.03434,"117":1.95662,"118":0.02229,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00446,"73":0.00446,"74":0,"75":0,"76":0,"77":0.01783,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0.00891,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.02229,"96":0,"97":0,"98":0,"99":0.00891,"100":0.0624,"101":0.25851,"102":0.30753,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00446,"13":0,"14":0.00446,"15":0,"16":0.00446,"17":0,"18":0.00446,"79":0,"80":0,"81":0,"83":0,"84":0.00446,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.01783,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00446,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00446,"108":0.00446,"109":0.0624,"110":0.00891,"111":0.00891,"112":0.01337,"113":0.01783,"114":0.04011,"115":0.04011,"116":1.29253,"117":1.01174},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.01337,"10":0,"11":0,"12":0,"13":0,"14":0.01783,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.01337,"14.1":0.03566,"15.1":0.00891,"15.2-15.3":0.05794,"15.4":0.01337,"15.5":0.03566,"15.6":0.05794,"16.0":0.01783,"16.1":0.03566,"16.2":0.02229,"16.3":0.0624,"16.4":0.02674,"16.5":0.14708,"16.6":0.28971,"17.0":0.02674,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00316,"6.0-6.1":0,"7.0-7.1":0.00632,"8.1-8.4":0.02211,"9.0-9.2":0,"9.3":0.09161,"10.0-10.2":0,"10.3":0.04107,"11.0-11.2":0.07898,"11.3-11.4":0.03159,"12.0-12.1":0.02843,"12.2-12.5":0.30011,"13.0-13.1":0.00948,"13.2":0.00632,"13.3":0.85927,"13.4-13.7":0.05055,"14.0-14.4":0.2622,"14.5-14.8":0.41384,"15.0-15.1":0.19586,"15.2-15.3":0.19586,"15.4":0.18639,"15.5":0.34434,"15.6-15.7":2.41039,"16.0":1.63009,"16.1":1.85754,"16.2":1.08989,"16.3":1.94916,"16.4":0.34118,"16.5":1.32366,"16.6":15.54904,"17.0":1.85439,"17.1":0},P:{"4":0.1316,"20":0.14172,"21":0.24296,"22":2.99647,"5.0-5.4":0.03037,"6.2-6.4":0.02025,"7.2-7.4":0.07086,"8.2":0,"9.2":0.02025,"10.1":0,"11.1-11.2":0.04049,"12.0":0,"13.0":0.04049,"14.0":0.02025,"15.0":0.02025,"16.0":0.07086,"17.0":0.07086,"18.0":0.04049,"19.0":0.11136},I:{"0":0,"3":0.00354,"4":0.02475,"2.1":0.00354,"2.2":0.01414,"2.3":0.02475,"4.1":0.01591,"4.2-4.3":0.04242,"4.4":0,"4.4.3-4.4.4":0.13434},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0.00539,"8":0.04847,"9":0.01077,"10":0.01077,"11":0.04847,"5.5":0},S:{"2.5":0.00554,_:"3.0-3.1"},J:{"7":0,"10":0.00554},N:{"10":0.01663,"11":0},L:{"0":42.81664},R:{_:"0"},M:{"0":0.18846},Q:{"13.1":0.01109},O:{"0":0.16075},H:{"0":0.17842}};
    +module.exports={C:{"3":0.0041,"38":0.0041,"39":0.0041,"40":0.0041,"44":0.0041,"47":0.0041,"52":0.0041,"88":0.0041,"89":0.00821,"99":0.0041,"102":0.0041,"104":0.0041,"106":0.0041,"108":0.0041,"111":0.0041,"113":0.0041,"115":0.22156,"116":0.0041,"117":0.0041,"118":0.02462,"119":0.77136,"120":0.20925,"121":0.00821,_:"2 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 41 42 43 45 46 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 90 91 92 93 94 95 96 97 98 100 101 103 105 107 109 110 112 114 122 123 3.5","3.6":0.00821},D:{"31":0.0041,"37":0.0041,"38":0.0041,"39":0.0041,"40":0.00821,"41":0.0041,"42":0.0041,"43":0.00821,"44":0.01231,"45":0.00821,"46":0.01231,"47":0.00821,"49":0.0041,"50":0.0041,"51":0.01641,"56":0.0041,"63":0.00821,"67":0.0041,"69":0.0041,"70":0.02462,"71":0.0041,"72":0.0041,"73":0.0041,"74":0.02462,"77":0.0041,"78":0.0041,"79":0.01231,"80":0.0041,"81":0.0041,"83":0.0041,"84":0.00821,"85":0.02462,"86":0.0041,"87":0.02052,"88":0.0041,"89":0.00821,"90":0.01231,"91":0.00821,"92":0.0041,"93":0.0041,"94":0.00821,"95":0.00821,"96":0.0041,"97":0.00821,"98":0.00821,"99":0.02052,"100":0.00821,"101":0.00821,"102":0.02872,"103":0.08206,"104":0.0041,"105":0.02052,"106":0.00821,"107":0.01231,"108":0.04103,"109":3.31933,"110":0.01231,"111":0.04513,"112":0.08616,"113":0.04513,"114":0.09027,"115":0.08206,"116":0.4062,"117":0.35696,"118":4.81692,"119":18.68917,"120":0.01641,"121":0.00821,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 33 34 35 36 48 52 53 54 55 57 58 59 60 61 62 64 65 66 68 75 76 122"},F:{"31":0.0041,"32":0.0041,"79":0.0041,"85":0.0041,"89":0.0041,"95":0.03282,"99":0.01641,"101":0.0041,"102":0.50467,"103":0.22567,"104":0.71392,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 86 87 88 90 91 92 93 94 96 97 98 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.0041},B:{"12":0.00821,"15":0.0041,"16":0.0041,"17":0.0041,"18":0.02462,"84":0.0041,"89":0.0041,"90":0.0041,"92":0.04103,"100":0.01231,"102":0.0041,"104":0.01641,"107":0.0041,"108":0.01641,"109":0.06565,"110":0.00821,"111":0.00821,"112":0.01231,"113":0.00821,"114":0.02052,"115":0.02052,"116":0.02462,"117":0.06565,"118":0.956,"119":4.40252,_:"13 14 79 80 81 83 85 86 87 88 91 93 94 95 96 97 98 99 101 103 105 106"},E:{"8":0.0041,"9":0.02462,"11":0.0041,"13":0.0041,"14":0.05744,"15":0.0041,_:"0 4 5 6 7 10 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.0041,"13.1":0.01641,"14.1":0.06155,"15.1":0.03282,"15.2-15.3":0.00821,"15.4":0.01231,"15.5":0.08206,"15.6":0.18464,"16.0":0.02462,"16.1":0.06155,"16.2":0.03693,"16.3":0.09437,"16.4":0.06565,"16.5":0.06975,"16.6":0.35286,"17.0":0.19694,"17.1":0.22156,"17.2":0.0041},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00424,"5.0-5.1":0.00424,"6.0-6.1":0.0106,"7.0-7.1":0.01484,"8.1-8.4":0.00212,"9.0-9.2":0.01696,"9.3":0.05298,"10.0-10.2":0.00424,"10.3":0.0763,"11.0-11.2":0.03603,"11.3-11.4":0.03179,"12.0-12.1":0.01907,"12.2-12.5":0.34758,"13.0-13.1":0.00848,"13.2":0.03603,"13.3":0.02119,"13.4-13.7":0.06146,"14.0-14.4":0.16319,"14.5-14.8":0.26492,"15.0-15.1":0.10385,"15.2-15.3":0.12716,"15.4":0.142,"15.5":0.19922,"15.6-15.7":1.04697,"16.0":0.4917,"16.1":0.98551,"16.2":0.47262,"16.3":0.8859,"16.4":0.18227,"16.5":0.4705,"16.6-16.7":7.97523,"17.0":2.38854,"17.1":4.01199,"17.2":0.11445},P:{"4":0.10291,"20":0.08233,"21":0.16465,"22":0.49396,"23":2.42864,"5.0-5.4":0.02058,"6.2-6.4":0.02058,"7.2-7.4":0.08233,_:"8.2 10.1","9.2":0.02058,"11.1-11.2":0.03087,"12.0":0.01029,"13.0":0.02058,"14.0":0.01029,"15.0":0.01029,"16.0":0.03087,"17.0":0.03087,"18.0":0.02058,"19.0":0.09262},I:{"0":0.18189,"3":0.00002,"4":0.00004,"2.1":0,"2.2":0.00004,"2.3":0,"4.1":0.00002,"4.2-4.3":0.00013,"4.4":0,"4.4.3-4.4.4":0.00055},K:{"0":0.12973,_:"10 11 12 11.1 11.5 12.1"},A:{"6":0.00457,"7":0.00914,"8":0.07311,"9":0.01371,"10":0.01828,"11":0.07768,_:"5.5"},N:{_:"10 11"},S:{"2.5":0.0059,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.12973},H:{"0":0},L:{"0":35.06438},R:{_:"0"},M:{"0":0.14743},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MO.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MO.js
    index 4a653327248b87..b6e69153e617ba 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MO.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MO.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.03266,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00467,"79":0,"80":0.00467,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.014,"95":0,"96":0,"97":0,"98":0,"99":0.00467,"100":0.00933,"101":0,"102":0.00933,"103":0,"104":0.00467,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0.00933,"113":0.00467,"114":0.00467,"115":0.11663,"116":0.02333,"117":0.32189,"118":0.03732,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0.00467,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00467,"31":0,"32":0,"33":0,"34":0.03266,"35":0,"36":0,"37":0,"38":0.08864,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0.00467,"45":0.00467,"46":0,"47":0,"48":0,"49":0.03732,"50":0,"51":0,"52":0,"53":0.00933,"54":0,"55":0.014,"56":0,"57":0.00467,"58":0.00933,"59":0.00467,"60":0.00467,"61":0.06531,"62":0.014,"63":0,"64":0,"65":0.00467,"66":0,"67":0,"68":0,"69":0.014,"70":0.00933,"71":0,"72":0,"73":0.00467,"74":0.00933,"75":0.00467,"76":0.00467,"77":0.00467,"78":0.014,"79":0.21459,"80":0.02799,"81":0.014,"83":0.01866,"84":0,"85":0,"86":0.01866,"87":0.07931,"88":0.00467,"89":0.01866,"90":0,"91":0.00467,"92":0.014,"93":0,"94":0.00933,"95":0.00467,"96":0.00467,"97":0.03732,"98":0.02333,"99":0.22859,"100":0.00933,"101":0.00933,"102":0.01866,"103":0.07931,"104":0.00933,"105":0.04665,"106":0.014,"107":0.02799,"108":0.06065,"109":0.86769,"110":0.00933,"111":0.00933,"112":0.11663,"113":0.09797,"114":0.20993,"115":0.28923,"116":7.32405,"117":1.58144,"118":0.03732,"119":0.00467,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00467,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.014,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.04199,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0.00933,"75":0,"76":0,"77":0.04199,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.014,"96":0,"97":0,"98":0,"99":0,"100":0.00467,"101":0.01866,"102":0.02333,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00467,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00933,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00467,"109":0.06531,"110":0.00467,"111":0.014,"112":0.00467,"113":0.02333,"114":0.014,"115":0.05132,"116":1.1196,"117":0.69042},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00467,"10":0,"11":0,"12":0,"13":0.01866,"14":0.14928,"15":0.02333,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.02333,"13.1":0.07931,"14.1":0.31256,"15.1":0.03266,"15.2-15.3":0.04199,"15.4":0.05132,"15.5":0.1073,"15.6":0.34521,"16.0":0.03732,"16.1":0.07464,"16.2":0.06998,"16.3":0.1866,"16.4":0.08397,"16.5":0.15395,"16.6":1.76804,"17.0":0.04665,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00796,"6.0-6.1":0.05572,"7.0-7.1":0.06368,"8.1-8.4":0.0597,"9.0-9.2":0.02786,"9.3":0.25473,"10.0-10.2":0.02388,"10.3":0.32637,"11.0-11.2":0.09552,"11.3-11.4":0.0398,"12.0-12.1":0.05572,"12.2-12.5":1.06669,"13.0-13.1":0.0398,"13.2":0.01592,"13.3":0.04378,"13.4-13.7":0.12339,"14.0-14.4":0.74031,"14.5-14.8":1.26172,"15.0-15.1":0.47762,"15.2-15.3":0.37812,"15.4":0.34628,"15.5":0.67663,"15.6-15.7":2.38413,"16.0":0.93534,"16.1":1.80302,"16.2":0.99505,"16.3":1.61595,"16.4":0.39404,"16.5":1.206,"16.6":23.02137,"17.0":0.98709,"17.1":0},P:{"4":0.67301,"20":0.13026,"21":0.14111,"22":2.87656,"5.0-5.4":0.05427,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0.01085,"10.1":0,"11.1-11.2":0,"12.0":0.01085,"13.0":0.01085,"14.0":0,"15.0":0,"16.0":0.01085,"17.0":0.01085,"18.0":0.01085,"19.0":0.07598},I:{"0":0,"3":0,"4":0.02433,"2.1":0.00187,"2.2":0.00561,"2.3":0.00936,"4.1":0.01123,"4.2-4.3":0.02433,"4.4":0,"4.4.3-4.4.4":0.0786},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.10263,"9":0.03421,"10":0,"11":0.06842,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0.00534},N:{"10":0,"11":0},L:{"0":33.73391},R:{_:"0"},M:{"0":0.3041},Q:{"13.1":0.1974},O:{"0":0.63487},H:{"0":0.16163}};
    +module.exports={C:{"34":0.06423,"78":0.01713,"80":0.00856,"81":0.00428,"88":0.01285,"94":0.04282,"100":0.01713,"105":0.00428,"112":0.01713,"113":0.00428,"114":0.00428,"115":0.13702,"117":0.00856,"118":0.02569,"119":0.57807,"120":0.16272,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 82 83 84 85 86 87 89 90 91 92 93 95 96 97 98 99 101 102 103 104 106 107 108 109 110 111 116 121 122 123 3.5","3.6":0.00428},D:{"26":0.00428,"34":0.05138,"38":0.1199,"43":0.00428,"44":0.00428,"45":0.00428,"46":0.00428,"47":0.00428,"49":0.04282,"51":0.00428,"53":0.01285,"55":0.05138,"57":0.00428,"58":0.00428,"59":0.02569,"60":0.03426,"61":0.14131,"62":0.00856,"65":0.00428,"67":0.00428,"69":0.01285,"70":0.01285,"73":0.00856,"74":0.03854,"75":0.00428,"76":0.00856,"77":0.01713,"78":0.01713,"79":0.5481,"80":0.06423,"81":0.05567,"83":0.04282,"84":0.00428,"86":0.03854,"87":0.20554,"88":0.00856,"89":0.05567,"91":0.00856,"92":0.01285,"94":0.02141,"95":0.00856,"96":0.06423,"97":0.08136,"98":0.05567,"99":0.23979,"100":0.01285,"101":0.02997,"102":0.01713,"103":0.14131,"104":0.02997,"105":0.12418,"106":0.04282,"107":0.03854,"108":0.05995,"109":1.8798,"110":0.01285,"111":0.03854,"112":0.05567,"113":0.07708,"114":0.14987,"115":0.14131,"116":0.48815,"117":0.67227,"118":4.10216,"119":15.30815,"120":0.06423,"121":0.11133,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 27 28 29 30 31 32 33 35 36 37 39 40 41 42 48 50 52 54 56 63 64 66 68 71 72 85 90 93 122"},F:{"28":0.00428,"36":0.02569,"40":0.00428,"46":0.13274,"95":0.02569,"102":0.07708,"103":0.01713,"104":0.08992,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00428,"18":0.02141,"92":0.01285,"107":0.00428,"109":0.07708,"112":0.00428,"113":0.02997,"114":0.01713,"115":0.0471,"116":0.0471,"117":0.06423,"118":0.62089,"119":3.01881,_:"13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 108 110 111"},E:{"9":0.00856,"13":0.04282,"14":0.35112,"15":0.03854,_:"0 4 5 6 7 8 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1","11.1":0.00856,"12.1":0.03854,"13.1":0.19697,"14.1":0.80073,"15.1":0.08136,"15.2-15.3":0.07708,"15.4":0.11133,"15.5":0.23979,"15.6":0.75363,"16.0":0.08992,"16.1":0.12846,"16.2":0.15843,"16.3":0.39394,"16.4":0.14559,"16.5":0.29974,"16.6":3.11301,"17.0":0.4282,"17.1":0.89922,"17.2":0.01713},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00489,"5.0-5.1":0.00489,"6.0-6.1":0.01222,"7.0-7.1":0.01711,"8.1-8.4":0.00244,"9.0-9.2":0.01956,"9.3":0.06111,"10.0-10.2":0.00489,"10.3":0.088,"11.0-11.2":0.04156,"11.3-11.4":0.03667,"12.0-12.1":0.022,"12.2-12.5":0.40089,"13.0-13.1":0.00978,"13.2":0.04156,"13.3":0.02444,"13.4-13.7":0.07089,"14.0-14.4":0.18822,"14.5-14.8":0.30556,"15.0-15.1":0.11978,"15.2-15.3":0.14667,"15.4":0.16378,"15.5":0.22978,"15.6-15.7":1.20756,"16.0":0.56711,"16.1":1.13667,"16.2":0.54511,"16.3":1.02178,"16.4":0.21022,"16.5":0.54267,"16.6-16.7":9.19845,"17.0":2.75489,"17.1":4.62733,"17.2":0.132},P:{"4":0.79428,"20":0.03453,"21":0.09209,"22":0.13813,"23":3.05048,"5.0-5.4":0.04604,_:"6.2-6.4 7.2-7.4 8.2 10.1 11.1-11.2 14.0 15.0 16.0","9.2":0.02302,"12.0":0.01151,"13.0":0.02302,"17.0":0.02302,"18.0":0.01151,"19.0":0.12662},I:{"0":0.08534,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00026},K:{"0":0.04574,_:"10 11 12 11.1 11.5 12.1"},A:{"7":0.02164,"8":0.17308,"9":0.04327,"10":0.02164,"11":0.15145,_:"6 5.5"},N:{_:"10 11"},S:{"2.5":0.00572,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.78337},H:{"0":0},L:{"0":28.89832},R:{_:"0"},M:{"0":0.27446},Q:{"13.1":0.15439}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MP.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MP.js
    index f267033ba19d4d..bc9b8c5efe61b4 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MP.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MP.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.01099,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0.01649,"88":0.0055,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0.0055,"98":0,"99":0,"100":0,"101":0,"102":0.01099,"103":0.21988,"104":0,"105":0,"106":0.01099,"107":0,"108":0,"109":0,"110":0.0055,"111":0,"112":0,"113":0,"114":0,"115":0.12093,"116":0.02749,"117":0.40678,"118":0.02199,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.02199,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.0055,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.0055,"80":0,"81":0,"83":0.0055,"84":0,"85":0.0055,"86":0,"87":0.01099,"88":0,"89":0,"90":0,"91":0.01099,"92":0.0055,"93":0.0055,"94":0.01649,"95":0,"96":0.0055,"97":0,"98":0,"99":0,"100":0.0055,"101":0.0055,"102":0,"103":0.06596,"104":0,"105":0.01099,"106":0.15941,"107":0.0055,"108":0.0055,"109":0.44526,"110":0.07146,"111":0.03298,"112":0.01099,"113":0.03848,"114":0.20889,"115":0.71461,"116":15.60598,"117":2.31424,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.0055,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0.01649,"99":0.0055,"100":0.1759,"101":0.19789,"102":0.17041,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.0055,"100":0,"101":0,"102":0.0055,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.03298,"110":0.0055,"111":0.0055,"112":0.0055,"113":0.01099,"114":0.04947,"115":0.32432,"116":2.9299,"117":1.60512},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.0055,"14":0.12643,"15":0.0055,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.0055,"13.1":0.03298,"14.1":0.51122,"15.1":0.01099,"15.2-15.3":0.02199,"15.4":0.03298,"15.5":0.0055,"15.6":0.23637,"16.0":0.0055,"16.1":0.09345,"16.2":0.03848,"16.3":0.06047,"16.4":0.01649,"16.5":0.06047,"16.6":0.81356,"17.0":0.01099,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0.04648,"11.0-11.2":0.15958,"11.3-11.4":0.0093,"12.0-12.1":0,"12.2-12.5":0.23859,"13.0-13.1":0,"13.2":0,"13.3":0.02324,"13.4-13.7":0.05268,"14.0-14.4":1.49354,"14.5-14.8":0.11,"15.0-15.1":0.52212,"15.2-15.3":0.01704,"15.4":0.02634,"15.5":0.05578,"15.6-15.7":0.3424,"16.0":0.36564,"16.1":0.71114,"16.2":0.2293,"16.3":0.82888,"16.4":0.06662,"16.5":0.66156,"16.6":9.14096,"17.0":0.3331,"17.1":0.0031},P:{"4":0.01025,"20":0.01025,"21":0.04101,"22":7.88482,"5.0-5.4":0.05127,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01025,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0,"17.0":0,"18.0":0.05127,"19.0":0.01025},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":40.06947},R:{_:"0"},M:{"0":0.70247},Q:{"13.1":0},O:{"0":0.02702},H:{"0":0.03837}};
    +module.exports={C:{"52":0.00577,"78":0.25974,"108":0.00577,"114":0.02309,"115":0.02309,"118":0.00577,"119":0.42136,"120":0.10967,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 109 110 111 112 113 116 117 121 122 123 3.5 3.6"},D:{"49":0.01732,"53":0.00577,"65":0.00577,"73":0.02309,"79":0.02309,"80":0.02309,"87":0.01732,"90":0.06926,"91":0.01732,"93":0.16739,"96":0.12698,"99":0.00577,"103":0.03463,"104":0.01154,"107":0.00577,"108":0.09812,"109":3.19769,"112":0.02309,"113":0.01732,"114":0.16162,"115":0.31169,"116":1.74892,"117":1.9163,"118":11.6883,"119":25.70849,"120":0.01154,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 50 51 52 54 55 56 57 58 59 60 61 62 63 64 66 67 68 69 70 71 72 74 75 76 77 78 81 83 84 85 86 88 89 92 94 95 97 98 100 101 102 105 106 110 111 121 122"},F:{"98":0.00577,"99":0.00577,"100":0.00577,"102":0.45599,"103":0.02886,"104":0.17316,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"109":0.06926,"111":0.00577,"112":0.01154,"114":0.02309,"116":0.01732,"117":0.13276,"118":0.75613,"119":5.88167,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 113 115"},E:{"14":0.04618,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 5.1 6.1 7.1 9.1 11.1 12.1 15.5 17.2","10.1":0.00577,"13.1":0.09235,"14.1":0.69841,"15.1":0.01732,"15.2-15.3":0.01732,"15.4":0.06926,"15.6":0.16739,"16.0":0.01154,"16.1":0.06926,"16.2":0.01732,"16.3":0.1847,"16.4":0.01154,"16.5":0.04618,"16.6":0.58297,"17.0":0.16739,"17.1":0.33478},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00239,"5.0-5.1":0.00239,"6.0-6.1":0.00597,"7.0-7.1":0.00836,"8.1-8.4":0.00119,"9.0-9.2":0.00956,"9.3":0.02987,"10.0-10.2":0.00239,"10.3":0.04301,"11.0-11.2":0.02031,"11.3-11.4":0.01792,"12.0-12.1":0.01075,"12.2-12.5":0.19595,"13.0-13.1":0.00478,"13.2":0.02031,"13.3":0.01195,"13.4-13.7":0.03465,"14.0-14.4":0.092,"14.5-14.8":0.14935,"15.0-15.1":0.05855,"15.2-15.3":0.07169,"15.4":0.08005,"15.5":0.11231,"15.6-15.7":0.59025,"16.0":0.2772,"16.1":0.5556,"16.2":0.26645,"16.3":0.49944,"16.4":0.10276,"16.5":0.26525,"16.6-16.7":4.49616,"17.0":1.34658,"17.1":2.26182,"17.2":0.06452},P:{"20":0.0213,"21":0.07456,"22":0.43668,"23":6.66742,_:"4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 17.0","5.0-5.4":0.0213,"18.0":0.01065,"19.0":0.01065},I:{"0":0.04628,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00014},K:{"0":0.10147,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.01154,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.05919},H:{"0":0},L:{"0":23.22636},R:{_:"0"},M:{"0":0.56232},Q:{"13.1":0.00846}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MQ.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MQ.js
    index 7f73ec2e810b06..8d2efef0cc5577 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MQ.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MQ.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00488,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.0195,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00488,"79":0,"80":0,"81":0,"82":0.04388,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00488,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.00488,"102":0.04388,"103":0,"104":0,"105":0,"106":0,"107":0.00488,"108":0,"109":0,"110":0,"111":0,"112":0.00488,"113":0,"114":0.00975,"115":0.16575,"116":0.05363,"117":1.24313,"118":0.10725,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00488,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00488,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0.00975,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.00975,"80":0,"81":0.00488,"83":0,"84":0,"85":0,"86":0,"87":0.00488,"88":0.01463,"89":0.00488,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.07313,"96":0,"97":0,"98":0.00975,"99":0.00488,"100":0.00488,"101":0,"102":0.00488,"103":0.03413,"104":0.00488,"105":0.00975,"106":0,"107":0.00488,"108":0.00488,"109":0.59963,"110":0.00975,"111":0.00488,"112":0.03413,"113":0.03413,"114":0.10238,"115":0.39975,"116":10.14,"117":2.145,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00488,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.05363,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.08775,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.04388,"96":0,"97":0,"98":0,"99":0,"100":0.10725,"101":0.28275,"102":0.49725,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00975,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00488,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0.01463,"105":0,"106":0,"107":0,"108":0.00975,"109":0.0585,"110":0.00488,"111":0.00975,"112":0.00975,"113":0.00488,"114":0.02438,"115":0.0585,"116":1.83788,"117":1.27725},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.039,"15":0.00488,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.06338,"14.1":0.08288,"15.1":0.00975,"15.2-15.3":0.039,"15.4":0.19988,"15.5":0.09263,"15.6":0.20963,"16.0":0.01463,"16.1":0.05363,"16.2":0.07313,"16.3":0.19988,"16.4":0.05363,"16.5":0.26325,"16.6":1.09688,"17.0":0.04875,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.18537,"10.0-10.2":0.00883,"10.3":0.08827,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0.07356,"13.0-13.1":0.00883,"13.2":0,"13.3":0.00883,"13.4-13.7":0.03531,"14.0-14.4":0.02942,"14.5-14.8":0.33837,"15.0-15.1":0.08239,"15.2-15.3":0.15594,"15.4":0.17948,"15.5":0.19125,"15.6-15.7":1.42703,"16.0":0.98274,"16.1":1.32993,"16.2":0.58258,"16.3":1.35642,"16.4":0.42075,"16.5":1.58592,"16.6":14.51747,"17.0":5.2962,"17.1":0.2295},P:{"4":0.07207,"20":0.32947,"21":0.17503,"22":3.38734,"5.0-5.4":0,"6.2-6.4":0.0103,"7.2-7.4":0.03089,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.05148,"12.0":0,"13.0":0.02059,"14.0":0.03089,"15.0":0.10296,"16.0":0.05148,"17.0":0.0103,"18.0":0.02059,"19.0":0.30888},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.09363},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00488,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":39.7455},R:{_:"0"},M:{"0":0.25625},Q:{"13.1":0},O:{"0":0.04613},H:{"0":0.39301}};
    +module.exports={C:{"52":0.00891,"68":0.01782,"78":0.02228,"102":0.01337,"104":0.01337,"113":0.00446,"114":0.01337,"115":0.2228,"117":0.00891,"118":0.04456,"119":2.75826,"120":0.69068,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 103 105 106 107 108 109 110 111 112 116 121 122 123 3.5 3.6"},D:{"49":0.01337,"56":0.00446,"75":0.00446,"76":0.00446,"79":0.00446,"87":0.01337,"88":0.09358,"89":0.00446,"95":0.0401,"96":0.00446,"97":0.00446,"98":0.01782,"99":0.01337,"100":0.00891,"103":0.04456,"105":0.05793,"106":0.00446,"107":0.00446,"108":0.00446,"109":0.8511,"110":0.00446,"111":0.01782,"112":0.03565,"113":0.03119,"114":0.02228,"115":0.0401,"116":0.2228,"117":0.31192,"118":7.29002,"119":17.57892,"120":0.00446,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 50 51 52 53 54 55 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 77 78 80 81 83 84 85 86 90 91 92 93 94 101 102 104 121 122"},F:{"46":0.00446,"89":0.12031,"95":0.02674,"101":0.01337,"102":0.71742,"103":0.24062,"104":0.60156,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 90 91 92 93 94 96 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.00446,"90":0.00891,"92":0.00446,"99":0.00446,"100":0.00446,"104":0.14259,"106":0.00446,"108":0.00446,"109":0.02674,"110":0.01782,"111":0.00446,"113":0.00446,"114":0.0401,"115":0.01782,"116":0.00891,"117":0.08912,"118":1.0739,"119":4.91051,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 91 93 94 95 96 97 98 101 102 103 105 107 112"},E:{"14":0.03119,"15":0.00446,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.00446,"13.1":0.06684,"14.1":0.1515,"15.1":0.16933,"15.2-15.3":0.17378,"15.4":0.06684,"15.5":0.20943,"15.6":0.33866,"16.0":0.0401,"16.1":0.10694,"16.2":0.16042,"16.3":0.32529,"16.4":0.12031,"16.5":0.2228,"16.6":1.2254,"17.0":0.55254,"17.1":0.9313,"17.2":0.00446},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00365,"5.0-5.1":0.00365,"6.0-6.1":0.00912,"7.0-7.1":0.01276,"8.1-8.4":0.00182,"9.0-9.2":0.01459,"9.3":0.04559,"10.0-10.2":0.00365,"10.3":0.06564,"11.0-11.2":0.031,"11.3-11.4":0.02735,"12.0-12.1":0.01641,"12.2-12.5":0.29904,"13.0-13.1":0.00729,"13.2":0.031,"13.3":0.01823,"13.4-13.7":0.05288,"14.0-14.4":0.1404,"14.5-14.8":0.22793,"15.0-15.1":0.08935,"15.2-15.3":0.10941,"15.4":0.12217,"15.5":0.1714,"15.6-15.7":0.90077,"16.0":0.42303,"16.1":0.84789,"16.2":0.40662,"16.3":0.76219,"16.4":0.15681,"16.5":0.4048,"16.6-16.7":6.86154,"17.0":2.055,"17.1":3.45174,"17.2":0.09846},P:{"4":0.01052,"20":0.09471,"21":0.06314,"22":0.66295,"23":3.37791,_:"5.0-5.4 6.2-6.4 8.2 9.2 12.0 13.0 14.0","7.2-7.4":0.06314,"10.1":0.01052,"11.1-11.2":0.03157,"15.0":0.03157,"16.0":0.02105,"17.0":0.01052,"18.0":0.01052,"19.0":0.05262},I:{"0":0.04413,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00013},K:{"0":0.58766,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.01782,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.01109},H:{"0":0},L:{"0":32.05438},R:{_:"0"},M:{"0":0.65419},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MR.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MR.js
    index 8ee74369769826..d85820f37b7162 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MR.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MR.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00318,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0.00159,"113":0.00478,"114":0.00637,"115":0.0589,"116":0.01274,"117":0.10826,"118":0.00637,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00159,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00318,"41":0,"42":0,"43":0.00318,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.07482,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00159,"66":0.00318,"67":0,"68":0.00318,"69":0.00159,"70":0.00796,"71":0,"72":0,"73":0.00159,"74":0.00318,"75":0,"76":0,"77":0.00159,"78":0.00478,"79":0,"80":0,"81":0.00159,"83":0.00159,"84":0,"85":0,"86":0,"87":0.00159,"88":0.00159,"89":0,"90":0,"91":0.00318,"92":0,"93":0.00478,"94":0.00318,"95":0.00796,"96":0,"97":0,"98":0.00318,"99":0.00159,"100":0,"101":0,"102":0,"103":0.00318,"104":0,"105":0,"106":0.00159,"107":0.00159,"108":0.00318,"109":0.16079,"110":0,"111":0.00318,"112":0.00159,"113":0.0207,"114":0.01274,"115":0.0398,"116":0.74028,"117":0.22129,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00159,"60":0.00637,"62":0,"63":0,"64":0.00159,"65":0,"66":0,"67":0.00478,"68":0,"69":0.00637,"70":0.00796,"71":0.00637,"72":0.03184,"73":0.00796,"74":0,"75":0,"76":0,"77":0.00159,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00478,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00478,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.02388,"102":0.02229,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0.00318,"15":0,"16":0,"17":0,"18":0.00159,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.00159,"90":0,"91":0,"92":0.00318,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00159,"109":0.00955,"110":0,"111":0,"112":0,"113":0.00159,"114":0.01751,"115":0.00637,"116":0.12099,"117":0.08756},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00318,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.02229,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0.00159,"15.1":0,"15.2-15.3":0,"15.4":0.01274,"15.5":0,"15.6":0.00478,"16.0":0.00159,"16.1":0.00159,"16.2":0.00159,"16.3":0.00478,"16.4":0.00159,"16.5":0.00796,"16.6":0.0191,"17.0":0.00159,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.01284,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.02568,"10.0-10.2":0,"10.3":0.09356,"11.0-11.2":0.01468,"11.3-11.4":0,"12.0-12.1":0.02018,"12.2-12.5":0.55218,"13.0-13.1":0.00917,"13.2":0.00734,"13.3":0.02935,"13.4-13.7":0.17244,"14.0-14.4":1.12821,"14.5-14.8":0.25499,"15.0-15.1":0.34121,"15.2-15.3":0.21097,"15.4":0.21097,"15.5":0.64207,"15.6-15.7":1.51895,"16.0":0.70444,"16.1":1.05299,"16.2":0.51916,"16.3":1.01264,"16.4":1.07684,"16.5":1.75744,"16.6":5.71809,"17.0":1.0585,"17.1":0.0055},P:{"4":0.10081,"20":0.28226,"21":0.49395,"22":2.27821,"5.0-5.4":0.02016,"6.2-6.4":0.04032,"7.2-7.4":0.98789,"8.2":0.01008,"9.2":0.15121,"10.1":0.01008,"11.1-11.2":0.06048,"12.0":0,"13.0":0.04032,"14.0":0.06048,"15.0":0.06048,"16.0":0.27218,"17.0":0.08064,"18.0":0.15121,"19.0":0.51411},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00909,"4.4":0,"4.4.3-4.4.4":0.08479},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00171,"9":0,"10":0,"11":0.02057,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":71.73407},R:{_:"0"},M:{"0":0.14294},Q:{"13.1":0.00841},O:{"0":0.34473},H:{"0":0.70845}};
    +module.exports={C:{"3":0.00094,"30":0.00094,"34":0.00187,"36":0.00281,"43":0.00094,"44":0.00094,"47":0.00281,"71":0.00094,"72":0.00842,"78":0.00094,"92":0.00094,"98":0.00094,"105":0.03366,"109":0.00094,"111":0.00187,"114":0.00374,"115":0.24684,"116":0.00094,"117":0.00281,"118":0.02057,"119":0.24684,"120":0.06265,_:"2 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 31 32 33 35 37 38 39 40 41 42 45 46 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 93 94 95 96 97 99 100 101 102 103 104 106 107 108 110 112 113 121 122 123 3.5 3.6"},D:{"11":0.00094,"29":0.00281,"33":0.00468,"39":0.00468,"43":0.00748,"47":0.00187,"50":0.00094,"52":0.00842,"55":0.01309,"56":0.00094,"58":0.90134,"61":0.00094,"63":0.00094,"65":0.00187,"66":0.00187,"69":0.00281,"70":0.00187,"72":0.00281,"73":0.01309,"74":0.00187,"76":0.00187,"77":0.00281,"78":0.00187,"79":0.02712,"80":0.00094,"81":0.01777,"83":0.00281,"84":0.00094,"86":0.00281,"87":0.00187,"88":0.01403,"89":0.00094,"90":0.00094,"91":0.00748,"92":0.00187,"93":0.0346,"94":0.00281,"95":0.02712,"96":0.00094,"97":0.00094,"98":0.01309,"99":0.00748,"101":0.00187,"103":0.01122,"104":0.00094,"105":0.01029,"106":0.00561,"107":0.00374,"108":0.01964,"109":0.63954,"110":0.00094,"111":0.00561,"112":0.00748,"113":0.01683,"114":0.02431,"115":0.08509,"116":0.07854,"117":0.07854,"118":0.75735,"119":2.55442,"120":0.00094,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 30 31 32 34 35 36 37 38 40 41 42 44 45 46 48 49 51 53 54 57 59 60 62 64 67 68 71 75 85 100 102 121 122"},F:{"37":0.00094,"79":0.00187,"82":0.00281,"85":0.00748,"95":0.04208,"102":0.01029,"103":0.04301,"104":0.09163,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 83 84 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00094,"13":0.00094,"14":0.00094,"16":0.00187,"17":0.00094,"18":0.01309,"84":0.00561,"89":0.00094,"92":0.02899,"94":0.00748,"95":0.00094,"100":0.00561,"107":0.00094,"108":0.01029,"109":0.01029,"111":0.00094,"112":0.00094,"113":0.00281,"114":0.00935,"115":0.00094,"116":0.00281,"117":0.02712,"118":0.14025,"119":0.69471,_:"15 79 80 81 83 85 86 87 88 90 91 93 96 97 98 99 101 102 103 104 105 106 110"},E:{"4":0.00094,"10":0.00094,"11":0.00094,"13":0.00281,"14":0.00094,_:"0 5 6 7 8 9 12 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1 15.1","5.1":0.09537,"12.1":0.00748,"13.1":0.00281,"14.1":0.01029,"15.2-15.3":0.00094,"15.4":0.0346,"15.5":0.00187,"15.6":0.01403,"16.0":0.00094,"16.1":0.00748,"16.2":0.00094,"16.3":0.01309,"16.4":0.00187,"16.5":0.01029,"16.6":0.06452,"17.0":0.01496,"17.1":0.02057,"17.2":0.00655},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00278,"5.0-5.1":0.00278,"6.0-6.1":0.00695,"7.0-7.1":0.00973,"8.1-8.4":0.00139,"9.0-9.2":0.01112,"9.3":0.03476,"10.0-10.2":0.00278,"10.3":0.05006,"11.0-11.2":0.02364,"11.3-11.4":0.02086,"12.0-12.1":0.01251,"12.2-12.5":0.22803,"13.0-13.1":0.00556,"13.2":0.02364,"13.3":0.0139,"13.4-13.7":0.04032,"14.0-14.4":0.10706,"14.5-14.8":0.1738,"15.0-15.1":0.06813,"15.2-15.3":0.08343,"15.4":0.09316,"15.5":0.1307,"15.6-15.7":0.68687,"16.0":0.32258,"16.1":0.64654,"16.2":0.31006,"16.3":0.58119,"16.4":0.11958,"16.5":0.30867,"16.6-16.7":5.23214,"17.0":1.567,"17.1":2.63206,"17.2":0.07508},P:{"4":0.21142,"20":0.54366,"21":0.9061,"22":2.21491,"23":1.65111,"5.0-5.4":0.0302,"6.2-6.4":0.01007,"7.2-7.4":3.47338,_:"8.2 10.1 12.0","9.2":0.11075,"11.1-11.2":0.21142,"13.0":0.21142,"14.0":0.19129,"15.0":0.11075,"16.0":0.64434,"17.0":0.15102,"18.0":0.33224,"19.0":1.08732},I:{"0":0.09019,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00027},K:{"0":1.06674,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.01922,"9":0.00506,"10":0.00607,"11":0.18003,_:"6 7 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.1269},H:{"0":0.03},L:{"0":64.58928},R:{_:"0"},M:{"0":0.08158},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MS.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MS.js
    index 155fdf0bd40d57..a1c5608f2288cf 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MS.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MS.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.08862,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0.01266,"113":0,"114":0,"115":0,"116":0,"117":0.05697,"118":0,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.15192,"89":0.03165,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.08862,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.01266,"104":0,"105":0.01266,"106":0,"107":0,"108":0,"109":3.15867,"110":0,"111":0.01266,"112":0,"113":0.04431,"114":0.19623,"115":0.49374,"116":17.64804,"117":3.57645,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.05697,"101":0.53805,"102":0.08862,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.10761,"110":0,"111":0,"112":0,"113":0,"114":0.01266,"115":0.10761,"116":4.6209,"117":2.25981},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0.01266,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0.12027,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.03165,"15.6":0.07596,"16.0":0,"16.1":0,"16.2":0,"16.3":0.08862,"16.4":0.08862,"16.5":0.08862,"16.6":0.93051,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0.14397,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0,"14.0-14.4":0,"14.5-14.8":0,"15.0-15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6-15.7":1.04964,"16.0":0.1808,"16.1":1.51837,"16.2":0.32477,"16.3":0.72319,"16.4":0.03683,"16.5":0.25278,"16.6":9.4735,"17.0":3.00159,"17.1":0.03683},P:{"4":0,"20":0,"21":0.09749,"22":1.68986,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.20582,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0.02166,"17.0":0,"18.0":0,"19.0":0},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":4.21615},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":40.85043},R:{_:"0"},M:{"0":0},Q:{"13.1":0},O:{"0":0},H:{"0":0}};
    +module.exports={C:{"119":0.1959,"120":0.15005,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 121 122 123 3.5 3.6"},D:{"89":0.21674,"95":0.23758,"109":0.36678,"116":0.15005,"117":0.17089,"118":2.75922,"119":18.76017,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 83 84 85 86 87 88 90 91 92 93 94 96 97 98 99 100 101 102 103 104 105 106 107 108 110 111 112 113 114 115 120 121 122"},F:{"103":0.12921,"104":0.38762,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"109":0.02084,"118":1.20872,"119":6.79384,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 111 112 113 114 115 116 117"},E:{"11":0.08753,_:"0 4 5 6 7 8 9 10 12 13 14 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 13.1 14.1 15.1 15.4 16.0 16.1 17.2","15.2-15.3":0.04168,"15.5":0.36678,"15.6":0.38762,"16.2":0.02084,"16.3":4.28887,"16.4":0.08753,"16.5":0.34594,"16.6":1.10035,"17.0":0.1959,"17.1":0.4293},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00159,"5.0-5.1":0.00159,"6.0-6.1":0.00398,"7.0-7.1":0.00558,"8.1-8.4":0.0008,"9.0-9.2":0.00637,"9.3":0.01992,"10.0-10.2":0.00159,"10.3":0.02868,"11.0-11.2":0.01354,"11.3-11.4":0.01195,"12.0-12.1":0.00717,"12.2-12.5":0.13065,"13.0-13.1":0.00319,"13.2":0.01354,"13.3":0.00797,"13.4-13.7":0.0231,"14.0-14.4":0.06134,"14.5-14.8":0.09958,"15.0-15.1":0.03904,"15.2-15.3":0.0478,"15.4":0.05338,"15.5":0.07489,"15.6-15.7":0.39355,"16.0":0.18482,"16.1":0.37044,"16.2":0.17765,"16.3":0.333,"16.4":0.06851,"16.5":0.17686,"16.6-16.7":2.9978,"17.0":0.89783,"17.1":1.50806,"17.2":0.04302},P:{"20":0.09211,"21":0.46057,"22":0.23028,"23":2.94763,_:"4 5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 19.0","17.0":0.06141,"18.0":0.09211},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{"0":0,_:"10 11 12 11.1 11.5 12.1"},A:{_:"6 7 8 9 10 11 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{_:"0"},H:{"0":0},L:{"0":48.2683},R:{_:"0"},M:{_:"0"},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MT.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MT.js
    index 00caaff61d94e7..458a73dd218cd1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MT.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MT.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.0359,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00513,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00513,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00513,"103":0,"104":0,"105":0,"106":0,"107":0.00513,"108":0.00513,"109":0,"110":0,"111":0,"112":0.15384,"113":0.01026,"114":0.00513,"115":0.05641,"116":0.06154,"117":0.61536,"118":0.07692,"119":0,"120":0,"3.5":0,"3.6":0.00513},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00513,"44":0.00513,"45":0.00513,"46":0.00513,"47":0.00513,"48":0,"49":0.00513,"50":0,"51":0.00513,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.00513,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.02051,"70":0.00513,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0.00513,"77":0.01538,"78":0,"79":0.00513,"80":0,"81":0,"83":0,"84":0,"85":0.00513,"86":0.00513,"87":0.01026,"88":0,"89":0.00513,"90":0,"91":0,"92":0.01026,"93":0.16922,"94":0.00513,"95":0.00513,"96":0.00513,"97":0.00513,"98":0,"99":0.00513,"100":0.00513,"101":0,"102":0,"103":0.0359,"104":0.00513,"105":0.00513,"106":0.01026,"107":0.01538,"108":0.27178,"109":0.58972,"110":0.01026,"111":0.01538,"112":0.04102,"113":0.03077,"114":0.15384,"115":0.4205,"116":11.94311,"117":4.37931,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.02051,"29":0,"30":0,"31":0.00513,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00513,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.01026,"73":0.00513,"74":0,"75":0,"76":0,"77":0.01538,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.00513,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.01026,"100":0.0923,"101":0.23589,"102":0.7333,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0.00513,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.02051,"108":0,"109":0.03077,"110":0.00513,"111":0,"112":0.00513,"113":0.00513,"114":0.01538,"115":0.04615,"116":1.22046,"117":1.33841},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.01026,"10":0,"11":0,"12":0,"13":0.00513,"14":0.01538,"15":0.00513,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.01026,"13.1":0.02564,"14.1":0.08718,"15.1":0.01538,"15.2-15.3":0.01026,"15.4":0.01538,"15.5":0.02051,"15.6":0.14871,"16.0":0.03077,"16.1":0.06154,"16.2":0.04615,"16.3":0.0923,"16.4":0.45639,"16.5":0.21538,"16.6":0.7692,"17.0":0.07179,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.01321,"6.0-6.1":0,"7.0-7.1":0.01849,"8.1-8.4":0.01849,"9.0-9.2":0,"9.3":0.02641,"10.0-10.2":0,"10.3":0.19809,"11.0-11.2":0.03698,"11.3-11.4":0.03434,"12.0-12.1":0.01321,"12.2-12.5":0.2245,"13.0-13.1":0,"13.2":0.00792,"13.3":0.00528,"13.4-13.7":0.02113,"14.0-14.4":0.13999,"14.5-14.8":0.22186,"15.0-15.1":0.05547,"15.2-15.3":0.1347,"15.4":0.06075,"15.5":0.19809,"15.6-15.7":1.0697,"16.0":0.81086,"16.1":1.30477,"16.2":0.78709,"16.3":1.25194,"16.4":0.1796,"16.5":0.82142,"16.6":16.11414,"17.0":2.38503,"17.1":0.00528},P:{"4":0.08301,"20":0.08301,"21":0.07263,"22":2.3139,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.01038,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01038,"12.0":0.01038,"13.0":0.01038,"14.0":0.01038,"15.0":0.01038,"16.0":0.01038,"17.0":0.01038,"18.0":0.01038,"19.0":0.07263},I:{"0":0,"3":0.00537,"4":0.04298,"2.1":0.02686,"2.2":0.02149,"2.3":0.02686,"4.1":0.03224,"4.2-4.3":0.07522,"4.4":0,"4.4.3-4.4.4":0.24178},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0.00513,"8":0.04615,"9":0.00513,"10":0.00513,"11":0.02564,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0.00487},N:{"10":0.01462,"11":0},L:{"0":42.48426},R:{_:"0"},M:{"0":0.17052},Q:{"13.1":0},O:{"0":0.17539},H:{"0":0.19372}};
    +module.exports={C:{"52":0.00486,"68":0.02428,"78":0.00486,"88":0.00486,"107":0.03399,"113":0.00486,"114":0.00971,"115":0.10681,"116":0.00486,"117":0.00486,"118":0.06312,"119":1.15064,"120":0.45152,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 108 109 110 111 112 121 122 123 3.5","3.6":0.00486},D:{"39":0.00486,"40":0.00486,"41":0.00486,"42":0.00486,"43":0.00486,"44":0.00486,"45":0.00971,"46":0.00971,"47":0.00486,"49":0.01457,"51":0.00971,"56":0.00486,"58":0.00486,"69":0.00971,"70":0.00971,"75":0.00486,"76":0.00486,"77":0.03399,"79":0.01942,"83":0.00486,"85":0.00486,"86":0.00971,"87":0.01457,"88":0.01457,"89":0.00486,"91":0.00486,"92":0.01942,"93":0.83992,"96":0.00486,"97":0.00486,"98":0.00971,"99":0.00971,"100":0.00486,"103":0.07283,"104":0.01942,"105":0.00486,"106":0.00486,"107":0.15051,"108":0.00486,"109":1.18462,"111":0.01457,"112":0.04855,"113":0.02913,"114":0.10196,"115":0.16022,"116":0.52434,"117":0.57775,"118":7.2291,"119":23.51762,"120":0.00486,"121":0.00486,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 48 50 52 53 54 55 57 59 60 61 62 63 64 65 66 67 68 71 72 73 74 78 80 81 84 90 94 95 101 102 110 122"},F:{"28":0.06797,"31":0.00486,"90":0.00486,"95":0.00971,"102":0.49036,"103":0.08739,"104":0.51463,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00486,"18":0.00486,"95":0.00486,"107":0.00486,"108":0.00486,"109":0.03884,"110":0.00486,"113":0.00486,"114":0.07768,"115":0.01457,"116":0.01457,"117":0.08739,"118":0.95644,"119":4.07335,_:"13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 102 103 104 105 106 111 112"},E:{"9":0.01942,"14":0.06797,"15":0.01942,_:"0 4 5 6 7 8 10 11 12 13 3.1 3.2 6.1 7.1 9.1 10.1","5.1":0.00486,"11.1":0.00486,"12.1":0.00971,"13.1":0.1408,"14.1":0.11167,"15.1":0.03399,"15.2-15.3":0.02913,"15.4":0.02428,"15.5":0.01942,"15.6":0.31558,"16.0":0.05341,"16.1":0.21362,"16.2":0.06797,"16.3":0.13594,"16.4":0.59231,"16.5":0.30101,"16.6":0.79622,"17.0":0.66028,"17.1":0.6263,"17.2":0.05341},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00338,"5.0-5.1":0.00338,"6.0-6.1":0.00845,"7.0-7.1":0.01184,"8.1-8.4":0.00169,"9.0-9.2":0.01353,"9.3":0.04227,"10.0-10.2":0.00338,"10.3":0.06088,"11.0-11.2":0.02875,"11.3-11.4":0.02536,"12.0-12.1":0.01522,"12.2-12.5":0.27732,"13.0-13.1":0.00676,"13.2":0.02875,"13.3":0.01691,"13.4-13.7":0.04904,"14.0-14.4":0.13021,"14.5-14.8":0.21137,"15.0-15.1":0.08286,"15.2-15.3":0.10146,"15.4":0.1133,"15.5":0.15895,"15.6-15.7":0.83534,"16.0":0.39231,"16.1":0.7863,"16.2":0.37709,"16.3":0.70683,"16.4":0.14542,"16.5":0.3754,"16.6-16.7":6.36314,"17.0":1.90573,"17.1":3.20102,"17.2":0.09131},P:{"4":0.02089,"20":0.03133,"21":0.05222,"22":0.18798,"23":2.3602,_:"5.0-5.4 8.2 9.2 10.1 14.0","6.2-6.4":0.01044,"7.2-7.4":0.01044,"11.1-11.2":0.01044,"12.0":0.01044,"13.0":0.01044,"15.0":0.02089,"16.0":0.01044,"17.0":0.01044,"18.0":0.01044,"19.0":0.08355},I:{"0":0.20993,"3":0.00002,"4":0.00004,"2.1":0,"2.2":0.00004,"2.3":0,"4.1":0.00002,"4.2-4.3":0.00015,"4.4":0,"4.4.3-4.4.4":0.00063},K:{"0":0.3242,_:"10 11 12 11.1 11.5 12.1"},A:{"6":0.00486,"7":0.00486,"8":0.04855,"9":0.01457,"10":0.00971,"11":0.03884,_:"5.5"},N:{_:"10 11"},S:{"2.5":0.00515,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.18526},H:{"0":0},L:{"0":31.10751},R:{_:"0"},M:{"0":0.16982},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MU.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MU.js
    index d660cd79c10f92..8ef05b092998e7 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MU.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MU.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00692,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00346,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00346,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0.00346,"99":0,"100":0,"101":0,"102":0.02423,"103":0,"104":0,"105":0.00346,"106":0,"107":0,"108":0.00692,"109":0,"110":0.00346,"111":0,"112":0,"113":0.00346,"114":0.00692,"115":0.06924,"116":0.03116,"117":0.61624,"118":0.04847,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.00346,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00346,"35":0,"36":0,"37":0,"38":0.01731,"39":0,"40":0.01731,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00346,"47":0,"48":0,"49":0.01039,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00346,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0.00346,"75":0,"76":0,"77":0,"78":0.00346,"79":0.03116,"80":0.00692,"81":0.03808,"83":0.00346,"84":0,"85":0,"86":0,"87":0.02423,"88":0.01039,"89":0.00346,"90":0.00346,"91":0.00346,"92":0.01039,"93":0.00346,"94":0.00346,"95":0,"96":0.00346,"97":0.00346,"98":0.01385,"99":0.01385,"100":0.00346,"101":0.00346,"102":0.00346,"103":0.02423,"104":0.02077,"105":0.00692,"106":0.04154,"107":0.00692,"108":0.01385,"109":0.55046,"110":0.03808,"111":0.01039,"112":0.0277,"113":0.00692,"114":0.09694,"115":0.25273,"116":5.83001,"117":1.30517,"118":0.00692,"119":0.00346,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00692,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.00346,"64":0,"65":0.00346,"66":0,"67":0.02077,"68":0,"69":0.04154,"70":0.00692,"71":0.01039,"72":0.11078,"73":0.02077,"74":0.00692,"75":0,"76":0,"77":0.02077,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01731,"96":0,"97":0,"98":0,"99":0,"100":0.02077,"101":0.09694,"102":0.08655,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00346,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.01385,"110":0.00346,"111":0,"112":0.00346,"113":0.00346,"114":0.01039,"115":0.03116,"116":0.63701,"117":0.48814},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.00346,"13":0,"14":0.01039,"15":0.00346,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00346,"13.1":0.02423,"14.1":0.0277,"15.1":0,"15.2-15.3":0.00346,"15.4":0.00692,"15.5":0.01039,"15.6":0.06232,"16.0":0.02423,"16.1":0.01039,"16.2":0.04154,"16.3":0.05539,"16.4":0.01731,"16.5":0.0727,"16.6":0.23195,"17.0":0.03116,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00358,"6.0-6.1":0,"7.0-7.1":0.01073,"8.1-8.4":0.00239,"9.0-9.2":0,"9.3":0.09661,"10.0-10.2":0,"10.3":0.06798,"11.0-11.2":0.00119,"11.3-11.4":0.00239,"12.0-12.1":0.01073,"12.2-12.5":0.23853,"13.0-13.1":0.00119,"13.2":0.00358,"13.3":0.00954,"13.4-13.7":0.00716,"14.0-14.4":0.03459,"14.5-14.8":0.07633,"15.0-15.1":0.05844,"15.2-15.3":0.03459,"15.4":0.05248,"15.5":0.05248,"15.6-15.7":0.7633,"16.0":0.25523,"16.1":0.52596,"16.2":0.48541,"16.3":0.44009,"16.4":0.05725,"16.5":0.32202,"16.6":7.04146,"17.0":1.11037,"17.1":0.00239},P:{"4":0.16292,"20":0.29529,"21":0.2342,"22":5.06068,"5.0-5.4":0.01018,"6.2-6.4":0,"7.2-7.4":0.15274,"8.2":0,"9.2":0.01018,"10.1":0,"11.1-11.2":0.06109,"12.0":0.01018,"13.0":0.06109,"14.0":0.07128,"15.0":0.01018,"16.0":0.2342,"17.0":0.08146,"18.0":0.05091,"19.0":0.14255},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00152,"4.2-4.3":0.00457,"4.4":0,"4.4.3-4.4.4":0.0716},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.0277,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":64.83611},R:{_:"0"},M:{"0":0.29421},Q:{"13.1":0.00654},O:{"0":0.80417},H:{"0":0.92846}};
    +module.exports={C:{"20":0.00318,"24":0.00318,"34":0.00318,"52":0.00953,"66":0.00318,"78":0.01588,"80":0.00318,"86":0.00318,"87":0.00318,"88":0.01906,"94":0.00318,"98":0.00318,"104":0.00318,"108":0.00318,"111":0.00318,"113":0.00318,"114":0.01906,"115":0.2255,"116":0.00318,"117":0.00635,"118":0.13022,"119":1.25134,"120":0.34936,"121":0.00318,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 21 22 23 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 67 68 69 70 71 72 73 74 75 76 77 79 81 82 83 84 85 89 90 91 92 93 95 96 97 99 100 101 102 103 105 106 107 109 110 112 122 123 3.5 3.6"},D:{"34":0.02858,"38":0.02223,"49":0.0127,"50":0.00953,"56":0.00318,"59":0.00318,"64":0.00635,"65":0.00318,"68":0.00318,"69":0.00318,"74":0.0127,"76":0.00318,"77":0.00318,"78":0.00635,"79":0.13657,"80":0.01588,"81":0.0127,"83":0.00318,"85":0.02223,"86":0.00635,"87":0.04129,"88":0.04764,"89":0.00635,"90":0.03176,"91":0.00635,"92":0.01588,"93":0.0127,"94":0.00635,"95":0.00318,"96":0.00635,"97":0.01906,"98":0.0127,"99":0.03176,"100":0.00318,"101":0.00318,"102":0.01906,"103":0.05082,"104":0.03811,"105":0.00635,"106":0.0127,"107":0.00953,"108":0.06352,"109":1.48637,"110":0.00635,"111":0.05082,"112":0.00953,"113":0.01588,"114":0.0794,"115":0.02858,"116":0.25726,"117":0.37477,"118":3.79214,"119":15.69262,"120":0.02541,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 39 40 41 42 43 44 45 46 47 48 51 52 53 54 55 57 58 60 61 62 63 66 67 70 71 72 73 75 84 121 122"},F:{"28":0.01906,"36":0.00318,"90":0.00318,"95":0.02541,"102":0.20644,"103":0.08893,"104":0.4097,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"16":0.00318,"17":0.00318,"18":0.00635,"92":0.00635,"100":0.00635,"107":0.00318,"109":0.03811,"110":0.00635,"111":0.00635,"112":0.00635,"113":0.00318,"114":0.00953,"115":0.0127,"116":0.04446,"117":0.03811,"118":0.47005,"119":2.72183,_:"12 13 14 15 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 101 102 103 104 105 106 108"},E:{"13":0.00635,"14":0.01588,"15":0.00318,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.00635,"13.1":0.03811,"14.1":0.10163,"15.1":0.00635,"15.2-15.3":0.00318,"15.4":0.01906,"15.5":0.02858,"15.6":0.19374,"16.0":0.01906,"16.1":0.05717,"16.2":0.04446,"16.3":0.20962,"16.4":0.02223,"16.5":0.12069,"16.6":0.38747,"17.0":0.24773,"17.1":0.30172,"17.2":0.00635},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00167,"5.0-5.1":0.00167,"6.0-6.1":0.00418,"7.0-7.1":0.00586,"8.1-8.4":0.00084,"9.0-9.2":0.00669,"9.3":0.02092,"10.0-10.2":0.00167,"10.3":0.03012,"11.0-11.2":0.01422,"11.3-11.4":0.01255,"12.0-12.1":0.00753,"12.2-12.5":0.13721,"13.0-13.1":0.00335,"13.2":0.01422,"13.3":0.00837,"13.4-13.7":0.02426,"14.0-14.4":0.06442,"14.5-14.8":0.10458,"15.0-15.1":0.04099,"15.2-15.3":0.0502,"15.4":0.05605,"15.5":0.07864,"15.6-15.7":0.41329,"16.0":0.1941,"16.1":0.38903,"16.2":0.18657,"16.3":0.34971,"16.4":0.07195,"16.5":0.18573,"16.6-16.7":3.14821,"17.0":0.94287,"17.1":1.58373,"17.2":0.04518},P:{"4":0.13415,"20":0.14447,"21":0.15479,"22":0.66043,"23":4.95323,"5.0-5.4":0.02064,"6.2-6.4":0.01032,"7.2-7.4":0.18575,_:"8.2 9.2 10.1 12.0","11.1-11.2":0.0516,"13.0":0.03096,"14.0":0.07223,"15.0":0.01032,"16.0":0.11351,"17.0":0.06192,"18.0":0.02064,"19.0":0.14447},I:{"0":0.04753,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00014},K:{"0":1.0509,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.00953,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.66193},H:{"0":0},L:{"0":51.71113},R:{_:"0"},M:{"0":0.45038},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MV.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MV.js
    index aaee820aec4f47..9f5f29f69a18ce 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MV.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MV.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00578,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00289,"100":0,"101":0,"102":0,"103":0.00289,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0.00578,"111":0.00578,"112":0,"113":0,"114":0,"115":0.01156,"116":0.104,"117":0.51135,"118":0.02022,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00289,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.00289,"71":0,"72":0,"73":0,"74":0.00289,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0.00289,"83":0.01733,"84":0,"85":0,"86":0,"87":0.00578,"88":0.00578,"89":0,"90":0,"91":0.00289,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00578,"100":0.00289,"101":0,"102":0,"103":0.00867,"104":0,"105":0.00289,"106":0.00867,"107":0.00578,"108":0.00289,"109":0.19356,"110":0.00289,"111":0.00867,"112":0.01445,"113":0.01156,"114":0.11267,"115":0.13289,"116":4.50106,"117":1.08626,"118":0.00289,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00289,"70":0.00289,"71":0.00289,"72":0.06934,"73":0.02022,"74":0,"75":0,"76":0,"77":0.00578,"78":0.00289,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.02889,"101":0.09245,"102":0.08667,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00289,"89":0,"90":0,"91":0,"92":0.00289,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00289,"103":0,"104":0,"105":0,"106":0,"107":0.00289,"108":0.00578,"109":0.00867,"110":0,"111":0,"112":0.00289,"113":0.00289,"114":0.01445,"115":0.02889,"116":0.35535,"117":0.24268},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00289,"12":0,"13":0,"14":0.00578,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00578,"14.1":0.01156,"15.1":0.00867,"15.2-15.3":0.00578,"15.4":0.00578,"15.5":0.00578,"15.6":0.02022,"16.0":0.00578,"16.1":0.02022,"16.2":0.00867,"16.3":0.02311,"16.4":0.01445,"16.5":0.05489,"16.6":0.19645,"17.0":0.03467,"17.1":0.00289},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.01551,"6.0-6.1":0,"7.0-7.1":0.0031,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.02481,"10.0-10.2":0,"10.3":0.0062,"11.0-11.2":0,"11.3-11.4":0.0062,"12.0-12.1":0,"12.2-12.5":0.13335,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0.04652,"14.0-14.4":0.08994,"14.5-14.8":0.22329,"15.0-15.1":0.05892,"15.2-15.3":0.17987,"15.4":0.06823,"15.5":0.18918,"15.6-15.7":1.26842,"16.0":1.31184,"16.1":1.50412,"16.2":0.63886,"16.3":1.52273,"16.4":0.54893,"16.5":1.81114,"16.6":17.07251,"17.0":3.9014,"17.1":0},P:{"4":0.02075,"20":0.04151,"21":0.05189,"22":1.54619,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.02075,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0.01038,"13.0":0,"14.0":0,"15.0":0,"16.0":0,"17.0":0.01038,"18.0":0.01038,"19.0":0.07264},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.11578},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":55.07909},R:{_:"0"},M:{"0":1.27287},Q:{"13.1":0},O:{"0":1.06665},H:{"0":0.63956}};
    +module.exports={C:{"64":0.0028,"87":0.0028,"99":0.0028,"108":0.0028,"110":0.01679,"114":0.0028,"115":0.03919,"116":0.0028,"117":0.0028,"118":0.01679,"119":0.86489,"120":0.22112,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 88 89 90 91 92 93 94 95 96 97 98 100 101 102 103 104 105 106 107 109 111 112 113 121 122 123 3.5 3.6"},D:{"38":0.0028,"46":0.0028,"59":0.0028,"64":0.0028,"68":0.0028,"70":0.0084,"73":0.0028,"74":0.0112,"75":0.01679,"79":0.0028,"80":0.0028,"83":0.05318,"87":0.0112,"88":0.0084,"89":0.0028,"90":0.0028,"91":0.0028,"93":0.0028,"95":0.0028,"97":0.0056,"99":0.0056,"101":0.0028,"102":0.0028,"103":0.01959,"105":0.0056,"106":0.0028,"107":0.0028,"108":0.0056,"109":0.69415,"110":0.0028,"111":0.01679,"112":0.03639,"113":0.01679,"114":0.05038,"115":0.02799,"116":0.24911,"117":0.37787,"118":3.93539,"119":15.64081,"120":0.01679,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 61 62 63 65 66 67 69 71 72 76 77 78 81 84 85 86 92 94 96 98 100 104 121 122"},F:{"94":0.0028,"95":0.0028,"102":0.37507,"103":0.03079,"104":0.2827,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.0028,"14":0.0028,"15":0.0028,"16":0.0084,"18":0.0028,"90":0.0028,"92":0.0084,"100":0.0028,"102":0.0084,"107":0.0084,"108":0.32189,"109":0.014,"110":0.0028,"111":0.0028,"113":0.0056,"114":0.0112,"115":0.07277,"116":0.01679,"117":0.06438,"118":0.36387,"119":1.65421,_:"13 17 79 80 81 83 84 85 86 87 88 89 91 93 94 95 96 97 98 99 101 103 104 105 106 112"},E:{"14":0.02519,"15":0.0028,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 5.1 6.1 7.1 9.1 10.1","11.1":0.0056,"12.1":0.0112,"13.1":0.014,"14.1":0.04758,"15.1":0.0084,"15.2-15.3":0.0112,"15.4":0.0112,"15.5":0.02239,"15.6":0.07557,"16.0":0.0084,"16.1":0.09797,"16.2":0.02519,"16.3":0.10076,"16.4":0.04758,"16.5":0.04758,"16.6":0.36667,"17.0":0.24071,"17.1":0.25751,"17.2":0.05598},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00449,"5.0-5.1":0.00449,"6.0-6.1":0.01122,"7.0-7.1":0.01571,"8.1-8.4":0.00224,"9.0-9.2":0.01795,"9.3":0.05611,"10.0-10.2":0.00449,"10.3":0.08079,"11.0-11.2":0.03815,"11.3-11.4":0.03366,"12.0-12.1":0.0202,"12.2-12.5":0.36806,"13.0-13.1":0.00898,"13.2":0.03815,"13.3":0.02244,"13.4-13.7":0.06508,"14.0-14.4":0.17281,"14.5-14.8":0.28053,"15.0-15.1":0.10997,"15.2-15.3":0.13465,"15.4":0.15036,"15.5":0.21096,"15.6-15.7":1.10865,"16.0":0.52066,"16.1":1.04357,"16.2":0.50047,"16.3":0.93809,"16.4":0.193,"16.5":0.49822,"16.6-16.7":8.44508,"17.0":2.52926,"17.1":4.24835,"17.2":0.12119},P:{"20":0.02077,"21":0.03115,"22":0.17654,"23":1.35,_:"4 5.0-5.4 6.2-6.4 8.2 9.2 10.1 11.1-11.2 12.0 14.0 15.0 16.0 17.0","7.2-7.4":0.01038,"13.0":0.01038,"18.0":0.01038,"19.0":0.01038},I:{"0":0.05731,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00004,"4.4":0,"4.4.3-4.4.4":0.00017},K:{"0":0.9936,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.0056,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":1.044},H:{"0":0},L:{"0":45.12622},R:{_:"0"},M:{"0":1.1376},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MW.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MW.js
    index ebc0f71846e464..752494dbb6342c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MW.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MW.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00311,"86":0,"87":0,"88":0,"89":0.00311,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00311,"100":0,"101":0,"102":0.00934,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00623,"109":0.00311,"110":0.00311,"111":0.00623,"112":0.00311,"113":0.00623,"114":0.00934,"115":0.07474,"116":0.04982,"117":0.48578,"118":0.08719,"119":0.00311,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00311,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00623,"41":0,"42":0,"43":0.00311,"44":0.0218,"45":0,"46":0.00311,"47":0,"48":0,"49":0,"50":0.00311,"51":0,"52":0,"53":0,"54":0,"55":0.00623,"56":0,"57":0,"58":0.00311,"59":0,"60":0,"61":0.00311,"62":0,"63":0,"64":0.01557,"65":0.00311,"66":0,"67":0,"68":0,"69":0,"70":0.00934,"71":0,"72":0,"73":0,"74":0.00623,"75":0.00311,"76":0,"77":0.00311,"78":0,"79":0.00623,"80":0.00934,"81":0.01868,"83":0.00311,"84":0,"85":0.00311,"86":0,"87":0.00311,"88":0.00311,"89":0,"90":0.00311,"91":0.00311,"92":0.00934,"93":0.00311,"94":0.00311,"95":0.00311,"96":0.00311,"97":0,"98":0.00311,"99":0.00934,"100":0.00311,"101":0.00311,"102":0.00934,"103":0.01557,"104":0.00311,"105":0.00623,"106":0.00623,"107":0.00623,"108":0.00623,"109":0.2896,"110":0.01557,"111":0.00934,"112":0.00934,"113":0.02803,"114":0.05294,"115":0.05917,"116":2.6687,"117":1.32034,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.00934,"27":0.00311,"28":0.0218,"29":0,"30":0.00311,"31":0,"32":0.01246,"33":0.00311,"34":0,"35":0.01868,"36":0,"37":0.00311,"38":0.00311,"39":0,"40":0,"41":0,"42":0.00623,"43":0.00311,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0.00311,"52":0,"53":0,"54":0.00623,"55":0,"56":0.00311,"57":0.00623,"58":0.00311,"60":0.0218,"62":0,"63":0.04048,"64":0.00934,"65":0.00311,"66":0.01868,"67":0.02803,"68":0.01557,"69":0.09031,"70":0.07785,"71":0.13079,"72":0.33943,"73":0.06228,"74":0.00311,"75":0.01557,"76":0.00311,"77":0.0436,"78":0.00311,"79":0.00311,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01868,"96":0,"97":0,"98":0,"99":0.00311,"100":0.00311,"101":0.1121,"102":0.14947,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.01557},B:{"12":0.00623,"13":0.00311,"14":0,"15":0.00623,"16":0.00311,"17":0.00311,"18":0.01868,"79":0,"80":0,"81":0,"83":0,"84":0.00623,"85":0,"86":0,"87":0,"88":0,"89":0.00311,"90":0.00311,"91":0,"92":0.0218,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00623,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00311,"109":0.02803,"110":0.00311,"111":0.00623,"112":0.00934,"113":0.00623,"114":0.02491,"115":0.04982,"116":0.37368,"117":0.66951},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00311,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00311,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00311,"13.1":0.00623,"14.1":0.00311,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0.00623,"16.0":0,"16.1":0.00311,"16.2":0.00311,"16.3":0.00311,"16.4":0.00311,"16.5":0.00623,"16.6":0.0218,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00129,"6.0-6.1":0.00283,"7.0-7.1":0.00798,"8.1-8.4":0,"9.0-9.2":0.00077,"9.3":0.0157,"10.0-10.2":0,"10.3":0.02317,"11.0-11.2":0.00051,"11.3-11.4":0.00129,"12.0-12.1":0.00618,"12.2-12.5":0.2098,"13.0-13.1":0.00154,"13.2":0.00026,"13.3":0.00798,"13.4-13.7":0.01467,"14.0-14.4":0.05123,"14.5-14.8":0.05277,"15.0-15.1":0.04016,"15.2-15.3":0.03295,"15.4":0.04737,"15.5":0.05535,"15.6-15.7":0.39514,"16.0":0.08598,"16.1":0.08804,"16.2":0.08083,"16.3":0.10632,"16.4":0.08778,"16.5":0.17814,"16.6":0.70276,"17.0":0.23091,"17.1":0},P:{"4":0.25823,"20":0.08263,"21":0.20658,"22":0.54744,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.13428,"8.2":0,"9.2":0.01033,"10.1":0,"11.1-11.2":0.01033,"12.0":0,"13.0":0.01033,"14.0":0.01033,"15.0":0.01033,"16.0":0.04132,"17.0":0.03099,"18.0":0.04132,"19.0":0.05165},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00806,"4.4":0,"4.4.3-4.4.4":0.1144},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00934,"5.5":0},S:{"2.5":0.0964,_:"3.0-3.1"},J:{"7":0,"10":0.01377},N:{"10":0,"11":0},L:{"0":75.10967},R:{_:"0"},M:{"0":0.21347},Q:{"13.1":0.00689},O:{"0":3.1469},H:{"0":5.95205}};
    +module.exports={C:{"16":0.00332,"33":0.00332,"59":0.00332,"62":0.00663,"69":0.00332,"72":0.00663,"78":0.01326,"80":0.00332,"81":0.00663,"88":0.00332,"89":0.00995,"91":0.00332,"100":0.00332,"102":0.00332,"104":0.00332,"109":0.00332,"111":0.00332,"112":0.00995,"113":0.00332,"114":0.0199,"115":0.34155,"116":0.00995,"117":0.02984,"118":0.0829,"119":1.95644,"120":0.60351,"121":0.01658,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 61 63 64 65 66 67 68 70 71 73 74 75 76 77 79 82 83 84 85 86 87 90 92 93 94 95 96 97 98 99 101 103 105 106 107 108 110 122 123 3.5 3.6"},D:{"11":0.00663,"31":0.00663,"44":0.00995,"49":0.00663,"55":0.00332,"58":0.00332,"65":0.00663,"66":0.00332,"67":0.00332,"69":0.01326,"70":0.00663,"71":0.00995,"74":0.01326,"75":0.00332,"76":0.00663,"78":0.00332,"79":0.00995,"80":0.00332,"81":0.00332,"84":0.00332,"85":0.00663,"86":0.00332,"87":0.00995,"88":0.00995,"89":0.00995,"90":0.0199,"91":0.00995,"92":0.00995,"93":0.01326,"94":0.00995,"95":0.01658,"96":0.00332,"97":0.00332,"98":0.00332,"99":0.0199,"100":0.00332,"101":0.00332,"102":0.03979,"103":0.05969,"104":0.00663,"105":0.02321,"106":0.00995,"107":0.02984,"108":0.01658,"109":0.97822,"110":0.0199,"111":0.03979,"112":0.01326,"113":0.02321,"114":0.063,"115":0.03316,"116":0.17243,"117":0.23544,"118":3.85319,"119":13.53591,"120":0.01326,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 33 34 35 36 37 38 39 40 41 42 43 45 46 47 48 50 51 52 53 54 56 57 59 60 61 62 63 64 68 72 73 77 83 121 122"},F:{"34":0.00332,"64":0.00332,"79":0.00663,"82":0.25202,"85":0.00332,"90":0.00332,"95":0.07295,"101":0.00663,"102":0.03316,"103":0.2487,"104":0.55377,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 83 84 86 87 88 89 91 92 93 94 96 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00663,"13":0.00332,"14":0.00332,"15":0.00663,"16":0.00995,"17":0.00995,"18":0.06632,"84":0.00663,"89":0.00663,"90":0.01326,"92":0.05969,"99":0.00332,"100":0.00663,"105":0.00663,"107":0.00332,"108":0.02984,"109":0.04311,"110":0.01326,"111":0.00332,"112":0.02653,"113":0.00995,"114":0.03648,"115":0.0199,"116":0.03316,"117":0.12932,"118":0.86879,"119":3.38232,_:"79 80 81 83 85 86 87 88 91 93 94 95 96 97 98 101 102 103 104 106"},E:{"13":0.00332,"14":0.00995,_:"0 4 5 6 7 8 9 10 11 12 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1 15.1 15.2-15.3 16.0 17.2","5.1":0.00663,"12.1":0.00995,"13.1":0.03316,"14.1":0.00995,"15.4":0.00332,"15.5":0.00663,"15.6":0.01326,"16.1":0.00332,"16.2":0.00995,"16.3":0.00663,"16.4":0.00332,"16.5":0.00332,"16.6":0.07958,"17.0":0.02321,"17.1":0.02653},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00037,"5.0-5.1":0.00037,"6.0-6.1":0.00093,"7.0-7.1":0.0013,"8.1-8.4":0.00019,"9.0-9.2":0.00148,"9.3":0.00463,"10.0-10.2":0.00037,"10.3":0.00667,"11.0-11.2":0.00315,"11.3-11.4":0.00278,"12.0-12.1":0.00167,"12.2-12.5":0.03036,"13.0-13.1":0.00074,"13.2":0.00315,"13.3":0.00185,"13.4-13.7":0.00537,"14.0-14.4":0.01426,"14.5-14.8":0.02314,"15.0-15.1":0.00907,"15.2-15.3":0.01111,"15.4":0.0124,"15.5":0.0174,"15.6-15.7":0.09146,"16.0":0.04295,"16.1":0.08609,"16.2":0.04129,"16.3":0.07739,"16.4":0.01592,"16.5":0.0411,"16.6-16.7":0.69671,"17.0":0.20866,"17.1":0.35048,"17.2":0.01},P:{"4":0.17877,"20":0.07361,"21":0.19981,"22":0.35755,"23":0.36807,_:"5.0-5.4 8.2 9.2 10.1","6.2-6.4":0.01052,"7.2-7.4":0.08413,"11.1-11.2":0.02103,"12.0":0.01052,"13.0":0.02103,"14.0":0.02103,"15.0":0.02103,"16.0":0.02103,"17.0":0.07361,"18.0":0.04206,"19.0":0.07361},I:{"0":0.0532,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00004,"4.4":0,"4.4.3-4.4.4":0.00016},K:{"0":3.58496,_:"10 11 12 11.1 11.5 12.1"},A:{"10":0.00516,"11":0.04127,_:"6 7 8 9 5.5"},N:{_:"10 11"},S:{"2.5":0.04679,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":1.77126},H:{"0":0.9},L:{"0":60.4989},R:{_:"0"},M:{"0":0.26736},Q:{"13.1":0.00668}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MX.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MX.js
    index d6d6420c25e983..62c701a11d2eb7 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MX.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MX.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00889,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0.00444,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00444,"67":0,"68":0.00444,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00889,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00444,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.02222,"103":0,"104":0.01778,"105":0.00444,"106":0,"107":0.00444,"108":0.00444,"109":0,"110":0.00444,"111":0.00444,"112":0.00444,"113":0.00889,"114":0.00889,"115":0.13332,"116":0.04444,"117":0.61772,"118":0.05777,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00444,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.05777,"50":0,"51":0,"52":0.00889,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00444,"66":0.01778,"67":0.00444,"68":0,"69":0,"70":0.00444,"71":0.00444,"72":0,"73":0,"74":0.00889,"75":0.00444,"76":0.00444,"77":0.00444,"78":0.00444,"79":0.03555,"80":0.01333,"81":0.00889,"83":0.00444,"84":0.00444,"85":0.00444,"86":0.00444,"87":0.02666,"88":0.01333,"89":0.01778,"90":0.00444,"91":0.02666,"92":0.00444,"93":0.00889,"94":0.00444,"95":0.00444,"96":0.00444,"97":0.00889,"98":0.00444,"99":0.02666,"100":0.00444,"101":0.00444,"102":0.00889,"103":0.0711,"104":0.00889,"105":0.00889,"106":0.01778,"107":0.01778,"108":0.02222,"109":1.26654,"110":0.02222,"111":0.02222,"112":0.03111,"113":0.03555,"114":0.15554,"115":0.31108,"116":8.69691,"117":2.27977,"118":0.00889,"119":0.00444,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00444,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.01778,"73":0.00444,"74":0.00444,"75":0,"76":0,"77":0.01778,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.02666,"96":0,"97":0,"98":0,"99":0.00444,"100":0.10221,"101":0.25775,"102":0.30219,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00444,"13":0,"14":0,"15":0,"16":0,"17":0.00444,"18":0.00444,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00889,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00444,"100":0,"101":0,"102":0.00444,"103":0,"104":0,"105":0,"106":0,"107":0.00444,"108":0.00444,"109":0.04444,"110":0.00444,"111":0.00444,"112":0.00444,"113":0.00889,"114":0.04888,"115":0.04888,"116":1.25321,"117":0.99101},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00444,"14":0.01333,"15":0.00444,_:"0","3.1":0,"3.2":0,"5.1":0.00444,"6.1":0,"7.1":0,"9.1":0.00889,"10.1":0,"11.1":0.00444,"12.1":0.00444,"13.1":0.03111,"14.1":0.04444,"15.1":0.00889,"15.2-15.3":0.00444,"15.4":0.00889,"15.5":0.01778,"15.6":0.10221,"16.0":0.01333,"16.1":0.03111,"16.2":0.02666,"16.3":0.0711,"16.4":0.04,"16.5":0.09332,"16.6":0.43996,"17.0":0.03111,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00653,"6.0-6.1":0,"7.0-7.1":0.0049,"8.1-8.4":0,"9.0-9.2":0.02449,"9.3":0.0555,"10.0-10.2":0.00163,"10.3":0.05387,"11.0-11.2":0.00816,"11.3-11.4":0.03591,"12.0-12.1":0.0049,"12.2-12.5":0.24975,"13.0-13.1":0.00816,"13.2":0.00326,"13.3":0.01959,"13.4-13.7":0.03265,"14.0-14.4":0.07182,"14.5-14.8":0.19425,"15.0-15.1":0.05224,"15.2-15.3":0.05713,"15.4":0.0604,"15.5":0.11427,"15.6-15.7":1.05452,"16.0":0.44238,"16.1":0.76232,"16.2":0.4032,"16.3":0.7966,"16.4":0.15508,"16.5":0.41462,"16.6":9.82694,"17.0":1.2047,"17.1":0.00163},P:{"4":0.10269,"20":0.02054,"21":0.05134,"22":0.84203,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.05134,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01027,"12.0":0,"13.0":0.01027,"14.0":0,"15.0":0,"16.0":0.01027,"17.0":0.02054,"18.0":0.01027,"19.0":0.02054},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0.02293,"2.3":0,"4.1":0.01835,"4.2-4.3":0.01376,"4.4":0,"4.4.3-4.4.4":0.12384},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.03555,"5.5":0},S:{"2.5":0.00556,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":62.36039},R:{_:"0"},M:{"0":0.21113},Q:{"13.1":0},O:{"0":0.06112},H:{"0":0.24196}};
    +module.exports={C:{"52":0.01689,"59":0.00845,"78":0.02112,"88":0.00845,"91":0.00422,"99":0.00422,"102":0.00845,"104":0.00422,"105":0.00422,"106":0.00422,"107":0.00422,"108":0.00422,"109":0.00845,"110":0.00422,"111":0.00422,"112":0.00422,"113":0.00845,"114":0.01689,"115":0.27027,"116":0.00845,"117":0.00845,"118":0.04645,"119":1.03041,"120":0.33784,"121":0.00422,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 90 92 93 94 95 96 97 98 100 101 103 122 123 3.5 3.6"},D:{"22":0.00422,"34":0.00422,"38":0.00845,"47":0.00422,"48":0.00422,"49":0.02956,"52":0.02534,"60":0.00422,"63":0.00422,"65":0.01267,"66":0.04223,"67":0.00422,"69":0.00422,"70":0.00422,"71":0.00845,"72":0.00422,"74":0.00845,"75":0.00845,"76":0.01267,"77":0.00845,"78":0.00422,"79":0.06335,"80":0.01267,"81":0.00845,"83":0.00845,"84":0.00422,"85":0.00422,"86":0.00845,"87":0.0549,"88":0.02534,"89":0.00422,"90":0.00845,"91":0.09291,"92":0.00845,"93":0.02534,"94":0.00845,"95":0.03801,"96":0.00845,"97":0.01689,"98":0.01689,"99":0.03378,"100":0.01267,"101":0.00845,"102":0.01267,"103":0.13514,"104":0.01267,"105":0.02112,"106":0.03378,"107":0.03378,"108":0.03801,"109":2.54647,"110":0.04645,"111":0.04223,"112":0.03801,"113":0.03378,"114":0.12669,"115":0.07179,"116":0.44342,"117":0.35473,"118":4.63263,"119":19.44269,"120":0.01689,"121":0.01267,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 23 24 25 26 27 28 29 30 31 32 33 35 36 37 39 40 41 42 43 44 45 46 50 51 53 54 55 56 57 58 59 61 62 64 68 73 122"},F:{"28":0.00422,"46":0.00422,"74":0.00422,"85":0.00422,"86":0.00422,"89":0.00422,"94":0.00422,"95":0.05068,"97":0.00422,"100":0.00422,"102":0.6968,"103":0.13091,"104":0.70946,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 75 76 77 78 79 80 81 82 83 84 87 88 90 91 92 93 96 98 99 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.01689,"17":0.00422,"18":0.00845,"92":0.01689,"99":0.00422,"100":0.00422,"102":0.00422,"105":0.00422,"106":0.00422,"107":0.00845,"108":0.00422,"109":0.08024,"110":0.00845,"111":0.00422,"112":0.00845,"113":0.01267,"114":0.02112,"115":0.01689,"116":0.03378,"117":0.19848,"118":0.80659,"119":4.1681,_:"13 14 15 16 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 101 103 104"},E:{"8":0.00422,"13":0.00845,"14":0.02534,"15":0.00845,_:"0 4 5 6 7 9 10 11 12 3.1 3.2 6.1 7.1 10.1","5.1":0.00845,"9.1":0.00845,"11.1":0.00845,"12.1":0.01267,"13.1":0.06757,"14.1":0.09713,"15.1":0.01689,"15.2-15.3":0.01267,"15.4":0.02956,"15.5":0.03378,"15.6":0.21537,"16.0":0.02534,"16.1":0.0549,"16.2":0.05068,"16.3":0.13514,"16.4":0.05068,"16.5":0.11402,"16.6":0.61656,"17.0":0.26183,"17.1":0.38852,"17.2":0.00845},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00221,"5.0-5.1":0.00221,"6.0-6.1":0.00553,"7.0-7.1":0.00775,"8.1-8.4":0.00111,"9.0-9.2":0.00885,"9.3":0.02766,"10.0-10.2":0.00221,"10.3":0.03983,"11.0-11.2":0.01881,"11.3-11.4":0.0166,"12.0-12.1":0.00996,"12.2-12.5":0.18146,"13.0-13.1":0.00443,"13.2":0.01881,"13.3":0.01106,"13.4-13.7":0.03209,"14.0-14.4":0.0852,"14.5-14.8":0.13831,"15.0-15.1":0.05422,"15.2-15.3":0.06639,"15.4":0.07413,"15.5":0.10401,"15.6-15.7":0.5466,"16.0":0.2567,"16.1":0.51452,"16.2":0.24675,"16.3":0.46251,"16.4":0.09516,"16.5":0.24564,"16.6-16.7":4.16371,"17.0":1.24701,"17.1":2.09458,"17.2":0.05975},P:{"4":0.09417,"20":0.01046,"21":0.03139,"22":0.07324,"23":0.8161,"5.0-5.4":0.01046,_:"6.2-6.4 8.2 9.2 10.1 12.0 14.0 15.0","7.2-7.4":0.05231,"11.1-11.2":0.01046,"13.0":0.01046,"16.0":0.01046,"17.0":0.02093,"18.0":0.01046,"19.0":0.01046},I:{"0":0.06899,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00005,"4.4":0,"4.4.3-4.4.4":0.00021},K:{"0":0.2889,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00919,"9":0.0046,"10":0.0046,"11":0.13787,_:"6 7 5.5"},N:{_:"10 11"},S:{"2.5":0.00578,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.05778},H:{"0":0},L:{"0":46.41293},R:{_:"0"},M:{"0":0.25423},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MY.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MY.js
    index cdc186ca592166..253e03aa347baf 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MY.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MY.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00425,"35":0,"36":0,"37":0,"38":0,"39":0.00425,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00849,"49":0,"50":0,"51":0,"52":0.00425,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0.02124,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00425,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00425,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00849,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0.00425,"111":0,"112":0.00425,"113":0.00425,"114":0.00425,"115":0.09343,"116":0.03398,"117":0.39922,"118":0.03398,"119":0.00425,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.00425,"30":0,"31":0,"32":0,"33":0,"34":0.00425,"35":0,"36":0,"37":0,"38":0.01699,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00849,"50":0,"51":0,"52":0,"53":0.01274,"54":0,"55":0.00849,"56":0.00425,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00425,"66":0,"67":0,"68":0,"69":0,"70":0.00425,"71":0.00425,"72":0.00425,"73":0.00425,"74":0.00849,"75":0.00425,"76":0,"77":0,"78":0.00849,"79":0.08919,"80":0.00425,"81":0.02124,"83":0.00849,"84":0.00425,"85":0.00849,"86":0.01274,"87":0.05521,"88":0.01699,"89":0.00849,"90":0.00425,"91":0.03398,"92":0.01274,"93":0.00425,"94":0.00849,"95":0.00425,"96":0.00425,"97":0.01274,"98":0.00849,"99":0.18262,"100":0.00849,"101":0.00425,"102":0.01274,"103":0.05946,"104":0.00849,"105":0.02124,"106":0.00849,"107":0.01699,"108":0.03398,"109":1.03202,"110":0.01699,"111":0.03398,"112":0.04247,"113":0.05521,"114":0.14865,"115":0.27606,"116":8.36234,"117":2.0598,"118":0.01274,"119":0.00425,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.01274,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00849,"37":0.00425,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.01699,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00849,"70":0.00425,"71":0.00849,"72":0.05521,"73":0.01274,"74":0.00425,"75":0,"76":0,"77":0.02124,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00849,"96":0,"97":0,"98":0,"99":0,"100":0.02124,"101":0.07645,"102":0.08494,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.01274,"110":0,"111":0,"112":0,"113":0.00425,"114":0.00849,"115":0.02124,"116":0.4969,"117":0.37798},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00425,"14":0.02548,"15":0.00849,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00425,"13.1":0.02124,"14.1":0.07645,"15.1":0.01274,"15.2-15.3":0.01274,"15.4":0.02973,"15.5":0.05096,"15.6":0.16988,"16.0":0.01274,"16.1":0.06371,"16.2":0.04247,"16.3":0.14015,"16.4":0.02973,"16.5":0.11042,"16.6":0.94708,"17.0":0.05096,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00488,"6.0-6.1":0,"7.0-7.1":0.01463,"8.1-8.4":0.01707,"9.0-9.2":0.01219,"9.3":0.10484,"10.0-10.2":0,"10.3":0.26087,"11.0-11.2":0.00244,"11.3-11.4":0.00488,"12.0-12.1":0.01463,"12.2-12.5":0.31695,"13.0-13.1":0.00731,"13.2":0,"13.3":0.02438,"13.4-13.7":0.04389,"14.0-14.4":0.16091,"14.5-14.8":0.31939,"15.0-15.1":0.14141,"15.2-15.3":0.12434,"15.4":0.22187,"15.5":0.26331,"15.6-15.7":1.71153,"16.0":1.01424,"16.1":1.23367,"16.2":0.8387,"16.3":1.42628,"16.4":0.38766,"16.5":1.37508,"16.6":12.72435,"17.0":1.37264,"17.1":0},P:{"4":0.40128,"20":0.06336,"21":0.11616,"22":1.58399,"5.0-5.4":0.06336,"6.2-6.4":0.01056,"7.2-7.4":0.03168,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01056,"12.0":0,"13.0":0.01056,"14.0":0,"15.0":0.01056,"16.0":0.02112,"17.0":0.01056,"18.0":0.01056,"19.0":0.03168},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.06274},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.03822,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":53.57114},R:{_:"0"},M:{"0":0.1956},Q:{"13.1":0.01151},O:{"0":0.83419},H:{"0":0.51198}};
    +module.exports={C:{"34":0.00804,"39":0.01205,"52":0.00804,"53":0.00402,"78":0.00402,"83":0.00402,"88":0.01607,"96":0.00402,"99":0.00402,"105":0.00402,"106":0.00402,"107":0.00402,"108":0.00402,"109":0.00402,"110":0.00402,"111":0.00402,"112":0.00402,"113":0.00804,"114":0.00804,"115":0.26117,"116":0.00804,"117":0.00804,"118":0.02813,"119":0.86789,"120":0.26117,"121":0.00804,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 40 41 42 43 44 45 46 47 48 49 50 51 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 84 85 86 87 89 90 91 92 93 94 95 97 98 100 101 102 103 104 122 123 3.5 3.6"},D:{"29":0.01205,"34":0.01205,"38":0.02813,"47":0.00402,"49":0.01607,"53":0.02411,"55":0.01607,"56":0.00804,"58":0.00804,"62":0.00402,"64":0.00402,"65":0.00804,"67":0.00402,"68":0.00402,"69":0.00804,"70":0.00804,"71":0.00402,"72":0.00402,"73":0.00402,"74":0.01607,"75":0.01607,"76":0.00402,"77":0.00402,"78":0.02411,"79":0.20492,"80":0.01205,"81":0.02813,"83":0.01205,"84":0.00804,"85":0.00804,"86":0.02009,"87":0.13661,"88":0.02813,"89":0.01607,"90":0.00804,"91":0.0442,"92":0.01607,"93":0.03214,"94":0.01607,"95":0.00804,"96":0.01607,"97":0.02813,"98":0.02009,"99":0.17277,"100":0.01607,"101":0.01607,"102":0.04018,"103":0.19286,"104":0.02009,"105":0.04018,"106":0.02009,"107":0.03616,"108":0.05625,"109":2.5233,"110":0.02009,"111":0.05223,"112":0.04018,"113":0.03616,"114":0.0884,"115":0.08036,"116":0.26921,"117":0.43796,"118":5.11893,"119":19.94133,"120":0.02009,"121":0.02411,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 30 31 32 33 35 36 37 39 40 41 42 43 44 45 46 48 50 51 52 54 57 59 60 61 63 66 122"},F:{"28":0.02411,"36":0.02813,"40":0.00402,"46":0.03616,"74":0.00402,"94":0.00402,"95":0.02411,"102":0.14063,"103":0.05223,"104":0.22501,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"92":0.00402,"108":0.00402,"109":0.03214,"111":0.00402,"112":0.00402,"113":0.00402,"114":0.00804,"115":0.00804,"116":0.00804,"117":0.05223,"118":0.38975,"119":1.94069,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 110"},E:{"13":0.00402,"14":0.05223,"15":0.01205,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.00804,"13.1":0.03214,"14.1":0.15268,"15.1":0.02411,"15.2-15.3":0.03214,"15.4":0.06027,"15.5":0.09241,"15.6":0.34957,"16.0":0.03214,"16.1":0.11652,"16.2":0.08036,"16.3":0.26921,"16.4":0.07232,"16.5":0.16474,"16.6":1.53086,"17.0":0.36162,"17.1":0.61074,"17.2":0.01205},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00285,"5.0-5.1":0.00285,"6.0-6.1":0.00713,"7.0-7.1":0.00998,"8.1-8.4":0.00143,"9.0-9.2":0.01141,"9.3":0.03565,"10.0-10.2":0.00285,"10.3":0.05134,"11.0-11.2":0.02424,"11.3-11.4":0.02139,"12.0-12.1":0.01283,"12.2-12.5":0.23388,"13.0-13.1":0.0057,"13.2":0.02424,"13.3":0.01426,"13.4-13.7":0.04136,"14.0-14.4":0.10981,"14.5-14.8":0.17826,"15.0-15.1":0.06988,"15.2-15.3":0.08557,"15.4":0.09555,"15.5":0.13405,"15.6-15.7":0.7045,"16.0":0.33086,"16.1":0.66314,"16.2":0.31802,"16.3":0.59611,"16.4":0.12265,"16.5":0.3166,"16.6-16.7":5.36645,"17.0":1.60722,"17.1":2.69962,"17.2":0.07701},P:{"4":0.38973,"20":0.0433,"21":0.07578,"22":0.18404,"23":1.52644,"5.0-5.4":0.06495,"6.2-6.4":0.02165,"7.2-7.4":0.03248,_:"8.2 9.2 10.1 12.0 14.0","11.1-11.2":0.01083,"13.0":0.01083,"15.0":0.01083,"16.0":0.02165,"17.0":0.01083,"18.0":0.01083,"19.0":0.03248},I:{"0":0.04762,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00014},K:{"0":0.64606,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.1125,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.90926},H:{"0":0},L:{"0":42.21075},R:{_:"0"},M:{"0":0.19741},Q:{"13.1":0.01196}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MZ.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MZ.js
    index 7baa4f981ce5ca..6ae60391821632 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MZ.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/MZ.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0.0039,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0.0039,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0.0078,"51":0,"52":0.0078,"53":0,"54":0.0078,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.0039,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.0039,"96":0,"97":0.0039,"98":0,"99":0,"100":0.0039,"101":0,"102":0.0117,"103":0,"104":0.0078,"105":0,"106":0,"107":0.0039,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0.0117,"114":0.0039,"115":0.10533,"116":0.02341,"117":0.28087,"118":0.02341,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.0039,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.0078,"41":0,"42":0,"43":0.0039,"44":0,"45":0,"46":0,"47":0.0039,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.0078,"56":0,"57":0.0078,"58":0.0039,"59":0,"60":0.02731,"61":0,"62":0,"63":0.0039,"64":0.0039,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.0156,"71":0,"72":0,"73":0,"74":0.0078,"75":0,"76":0,"77":0,"78":0,"79":0.0039,"80":0.0117,"81":0.10533,"83":0.0039,"84":0,"85":0.0078,"86":0,"87":0.02341,"88":0.0078,"89":0.0039,"90":0.03121,"91":0.01951,"92":0.03511,"93":0.0039,"94":0.0156,"95":0.01951,"96":0.0039,"97":0.0039,"98":0,"99":0.0039,"100":0.0039,"101":0.0078,"102":0.0117,"103":0.02731,"104":0.01951,"105":0.0078,"106":0.0039,"107":0.0039,"108":0.0117,"109":0.90893,"110":0.0078,"111":0.0156,"112":0.0156,"113":0.02731,"114":0.08972,"115":0.07022,"116":3.08179,"117":0.79971,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.0039,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.0039,"36":0,"37":0.02341,"38":0.0078,"39":0,"40":0,"41":0,"42":0.0039,"43":0,"44":0,"45":0,"46":0.01951,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.0039,"57":0.0039,"58":0.01951,"60":0.04291,"62":0,"63":0.05461,"64":0.03511,"65":0.0156,"66":0.02341,"67":0.02341,"68":0.0078,"69":0.10143,"70":0.12093,"71":0.10533,"72":0.28087,"73":0.04681,"74":0.0117,"75":0,"76":0.0156,"77":0.01951,"78":0,"79":0.0078,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.05071,"96":0,"97":0,"98":0,"99":0.0039,"100":0.01951,"101":0.15214,"102":0.17164,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.0039},B:{"12":0.0117,"13":0.0078,"14":0.0078,"15":0.0039,"16":0,"17":0,"18":0.0117,"79":0,"80":0,"81":0,"83":0,"84":0.0039,"85":0,"86":0,"87":0,"88":0,"89":0.0039,"90":0.0039,"91":0,"92":0.0156,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.0156,"109":0.02731,"110":0.0039,"111":0,"112":0.0117,"113":0.0078,"114":0.02731,"115":0.03121,"116":0.63976,"117":0.52273},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.02341,"14.1":0.0039,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0.01951,"16.0":0,"16.1":0,"16.2":0,"16.3":0.0039,"16.4":0.0039,"16.5":0.0039,"16.6":0.03511,"17.0":0.0039,"17.1":0},G:{"8":0.04211,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00148,"6.0-6.1":0.00222,"7.0-7.1":0.00887,"8.1-8.4":0,"9.0-9.2":0.00148,"9.3":0.0096,"10.0-10.2":0,"10.3":0.09604,"11.0-11.2":0.00296,"11.3-11.4":0.00296,"12.0-12.1":0.02512,"12.2-12.5":1.13029,"13.0-13.1":0.01625,"13.2":0.01625,"13.3":0.06132,"13.4-13.7":0.21202,"14.0-14.4":0.51713,"14.5-14.8":0.40336,"15.0-15.1":0.10786,"15.2-15.3":0.12042,"15.4":0.15071,"15.5":0.16991,"15.6-15.7":1.58758,"16.0":0.14997,"16.1":0.15144,"16.2":0.13519,"16.3":0.3546,"16.4":0.15292,"16.5":0.25265,"16.6":1.24111,"17.0":0.22237,"17.1":0},P:{"4":0.15589,"20":0.07275,"21":0.08314,"22":0.46767,"5.0-5.4":0.01039,"6.2-6.4":0,"7.2-7.4":0.13511,"8.2":0,"9.2":0.02079,"10.1":0.01039,"11.1-11.2":0.01039,"12.0":0,"13.0":0.01039,"14.0":0.02079,"15.0":0.06236,"16.0":0.05196,"17.0":0.04157,"18.0":0.01039,"19.0":0.13511},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00151,"4.2-4.3":0.00189,"4.4":0,"4.4.3-4.4.4":0.17412},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.0078,"10":0,"11":0.0156,"5.5":0},S:{"2.5":0.67699,_:"3.0-3.1"},J:{"7":0,"10":0.0061},N:{"10":0,"11":0},L:{"0":76.13624},R:{_:"0"},M:{"0":0.04879},Q:{"13.1":0},O:{"0":0.20127},H:{"0":3.47603}};
    +module.exports={C:{"7":0.00925,"42":0.00617,"50":0.01542,"52":0.0185,"54":0.0185,"72":0.00308,"78":0.00925,"85":0.00308,"90":0.00308,"97":0.00308,"100":0.00308,"104":0.01233,"105":0.00308,"107":0.00308,"110":0.00308,"112":0.01233,"113":0.02466,"115":0.2898,"116":0.00308,"117":0.00308,"118":0.02466,"119":0.49636,"120":0.16648,_:"2 3 4 5 6 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 43 44 45 46 47 48 49 51 53 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 73 74 75 76 77 79 80 81 82 83 84 86 87 88 89 91 92 93 94 95 96 98 99 101 102 103 106 108 109 111 114 121 122 123 3.5 3.6"},D:{"33":0.00308,"43":0.01233,"47":0.00925,"55":0.00925,"56":0.00308,"57":0.0185,"58":0.00308,"60":0.05549,"63":0.00308,"68":0.00308,"69":0.00308,"70":0.00617,"71":0.00308,"73":0.00308,"74":0.02466,"76":0.00308,"79":0.01233,"80":0.00308,"81":0.10174,"83":0.00308,"84":0.00308,"85":0.00308,"86":0.00308,"87":0.05241,"88":0.00925,"90":0.06783,"91":0.04933,"92":0.13257,"93":0.00308,"94":0.07091,"95":0.08632,"96":0.01233,"98":0.00925,"99":0.00308,"100":0.00617,"102":0.07708,"103":0.04625,"104":0.0185,"105":0.02158,"106":0.01542,"107":0.00925,"108":0.02466,"109":1.91146,"110":0.00925,"111":0.00925,"112":0.01233,"113":0.02775,"114":0.15107,"115":0.02158,"116":0.18806,"117":0.11715,"118":1.77889,"119":6.95833,"120":0.00617,"121":0.00308,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 37 38 39 40 41 42 44 45 46 48 49 50 51 52 53 54 59 61 62 64 65 66 67 72 75 77 78 89 97 101 122"},F:{"42":0.00308,"49":0.00308,"66":0.00308,"79":0.07091,"95":0.1449,"97":0.00308,"101":0.00308,"102":0.06474,"103":0.16648,"104":0.44087,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 43 44 45 46 47 48 50 51 52 53 54 55 56 57 58 60 62 63 64 65 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.04625,"13":0.02158,"14":0.02466,"15":0.00925,"16":0.00308,"17":0.00308,"18":0.02775,"83":0.00308,"84":0.01233,"89":0.00617,"90":0.00617,"91":0.00617,"92":0.037,"99":0.00308,"100":0.00617,"102":0.02158,"109":0.12949,"110":0.03391,"111":0.00308,"112":0.01542,"113":0.0185,"114":0.02775,"115":0.00925,"116":0.04008,"117":0.07091,"118":0.51794,"119":2.1211,_:"79 80 81 85 86 87 88 93 94 95 96 97 98 101 103 104 105 106 107 108"},E:{"13":0.00308,"14":0.00308,_:"0 4 5 6 7 8 9 10 11 12 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 15.1 15.2-15.3 15.4 15.5 16.0 16.1 16.2 17.2","12.1":0.00617,"13.1":0.05549,"14.1":0.00925,"15.6":0.01542,"16.3":0.01542,"16.4":0.00308,"16.5":0.00308,"16.6":0.02158,"17.0":0.0185,"17.1":0.02158},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00091,"5.0-5.1":0.00091,"6.0-6.1":0.00228,"7.0-7.1":0.00319,"8.1-8.4":0.00046,"9.0-9.2":0.00364,"9.3":0.01138,"10.0-10.2":0.00091,"10.3":0.01638,"11.0-11.2":0.00774,"11.3-11.4":0.00683,"12.0-12.1":0.0041,"12.2-12.5":0.07464,"13.0-13.1":0.00182,"13.2":0.00774,"13.3":0.00455,"13.4-13.7":0.0132,"14.0-14.4":0.03505,"14.5-14.8":0.05689,"15.0-15.1":0.0223,"15.2-15.3":0.02731,"15.4":0.03049,"15.5":0.04278,"15.6-15.7":0.22484,"16.0":0.10559,"16.1":0.21164,"16.2":0.1015,"16.3":0.19025,"16.4":0.03914,"16.5":0.10104,"16.6-16.7":1.71269,"17.0":0.51294,"17.1":0.86158,"17.2":0.02458},P:{"4":0.16855,"20":0.0632,"21":0.04214,"22":0.15801,"23":0.26335,_:"5.0-5.4 8.2 12.0","6.2-6.4":0.01053,"7.2-7.4":0.14748,"9.2":0.02107,"10.1":0.01053,"11.1-11.2":0.02107,"13.0":0.01053,"14.0":0.02107,"15.0":0.0316,"16.0":0.02107,"17.0":0.07374,"18.0":0.01053,"19.0":0.07374},I:{"0":0.05506,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00004,"4.4":0,"4.4.3-4.4.4":0.00017},K:{"0":2.46573,_:"10 11 12 11.1 11.5 12.1"},A:{"9":0.01542,"11":0.03391,_:"6 7 8 10 5.5"},N:{_:"10 11"},S:{"2.5":0.48419,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.11067},H:{"0":0.64},L:{"0":72.32172},R:{_:"0"},M:{"0":0.10376},Q:{"13.1":0.00692}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NA.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NA.js
    index 424be419ccdc8b..03831ba44f153e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NA.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NA.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00379,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00379,"49":0,"50":0,"51":0,"52":0.01138,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00379,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00759,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0.00379,"113":0.00379,"114":0.00379,"115":0.16314,"116":0.03794,"117":0.52357,"118":0.04173,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.01138,"41":0,"42":0.00379,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00379,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00759,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00379,"66":0,"67":0,"68":0.00379,"69":0.00759,"70":0.00379,"71":0,"72":0,"73":0.00759,"74":0.00759,"75":0,"76":0,"77":0.00379,"78":0.00379,"79":0,"80":0,"81":0.06829,"83":0,"84":0,"85":0,"86":0,"87":0.00379,"88":0.01518,"89":0.00379,"90":0,"91":0,"92":0,"93":0.00759,"94":0.00379,"95":0.00379,"96":0.00379,"97":0.00379,"98":0,"99":0.01138,"100":0.00379,"101":0.00379,"102":0,"103":0.00759,"104":0.00379,"105":0.00379,"106":0.05691,"107":0.00759,"108":0.02656,"109":0.84986,"110":0.01518,"111":0.01138,"112":0.03415,"113":0.01518,"114":0.0645,"115":0.13279,"116":5.03843,"117":1.48345,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00379,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.00379,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.01138,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0.01138,"62":0,"63":0,"64":0,"65":0,"66":0.00379,"67":0,"68":0,"69":0.04553,"70":0.01138,"71":0.04173,"72":0.5084,"73":0.07209,"74":0.00379,"75":0,"76":0,"77":0.00759,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.04173,"96":0,"97":0,"98":0,"99":0.00379,"100":0.03035,"101":0.14797,"102":0.129,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00379,"13":0,"14":0,"15":0,"16":0.00759,"17":0.00379,"18":0.01897,"79":0,"80":0,"81":0,"83":0,"84":0.00379,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.00379,"91":0,"92":0.01138,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00379,"101":0,"102":0,"103":0.00379,"104":0,"105":0,"106":0,"107":0,"108":0.01138,"109":0.07588,"110":0.00379,"111":0.03035,"112":0.09106,"113":0.01518,"114":0.03415,"115":0.03794,"116":1.24443,"117":0.89918},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00759,"14":0.00379,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0.00379,"11.1":0,"12.1":0.00379,"13.1":0.02276,"14.1":0.01897,"15.1":0,"15.2-15.3":0,"15.4":0.00379,"15.5":0.00759,"15.6":0.02656,"16.0":0,"16.1":0.01138,"16.2":0.00759,"16.3":0.03415,"16.4":0.01138,"16.5":0.03035,"16.6":0.24661,"17.0":0.01518,"17.1":0},G:{"8":0.00209,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00209,"5.0-5.1":0.00939,"6.0-6.1":0.01148,"7.0-7.1":0.04799,"8.1-8.4":0.01043,"9.0-9.2":0.00104,"9.3":0.22014,"10.0-10.2":0,"10.3":0.04904,"11.0-11.2":0.00209,"11.3-11.4":0.00522,"12.0-12.1":0.00209,"12.2-12.5":0.65728,"13.0-13.1":0,"13.2":0.00104,"13.3":0.00313,"13.4-13.7":0.01461,"14.0-14.4":0.17319,"14.5-14.8":0.13667,"15.0-15.1":0.05842,"15.2-15.3":0.06677,"15.4":0.03547,"15.5":0.06781,"15.6-15.7":1.82265,"16.0":0.17423,"16.1":0.51435,"16.2":0.17632,"16.3":0.45488,"16.4":0.0772,"16.5":0.43401,"16.6":4.61348,"17.0":0.44862,"17.1":0},P:{"4":0.36788,"20":0.11241,"21":0.20438,"22":2.81023,"5.0-5.4":0.01022,"6.2-6.4":0.02044,"7.2-7.4":0.28613,"8.2":0,"9.2":0,"10.1":0.02044,"11.1-11.2":0.01022,"12.0":0,"13.0":0.03066,"14.0":0.03066,"15.0":0.01022,"16.0":0.03066,"17.0":0.10219,"18.0":0.03066,"19.0":0.17372},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00363,"4.2-4.3":0.00726,"4.4":0,"4.4.3-4.4.4":0.14155},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.0645,"5.5":0},S:{"2.5":0.00621,_:"3.0-3.1"},J:{"7":0,"10":0.00621},N:{"10":0,"11":0},L:{"0":66.9657},R:{_:"0"},M:{"0":0.08688},Q:{"13.1":0.01241},O:{"0":0.47166},H:{"0":2.33843}};
    +module.exports={C:{"32":0.00339,"34":0.01694,"42":0.00339,"47":0.00339,"48":0.02032,"52":0.0271,"56":0.01016,"68":0.00339,"78":0.00339,"98":0.02032,"101":0.00677,"111":0.00339,"113":0.00677,"114":0.00339,"115":0.37257,"116":0.01016,"117":0.01016,"118":0.0271,"119":0.82304,"120":0.25064,"121":0.00339,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 33 35 36 37 38 39 40 41 43 44 45 46 49 50 51 53 54 55 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 99 100 102 103 104 105 106 107 108 109 110 112 122 123 3.5 3.6"},D:{"38":0.00339,"49":0.01016,"50":0.00339,"60":0.00339,"63":0.00339,"64":0.00339,"67":0.00339,"69":0.01694,"70":0.00339,"72":0.00339,"73":0.00339,"74":0.00677,"77":0.01355,"78":0.04403,"79":0.00339,"80":0.00339,"81":0.03726,"83":0.00677,"86":0.00339,"87":0.00339,"88":0.05758,"89":0.01694,"93":0.01694,"94":0.0271,"95":0.0271,"96":0.00677,"97":0.00339,"99":0.01355,"100":0.01016,"101":0.01355,"102":0.02032,"103":0.01355,"104":0.01355,"106":0.03387,"107":0.02371,"108":0.00339,"109":2.56057,"110":0.01694,"111":0.01016,"112":0.04403,"113":0.01355,"114":0.04403,"115":0.04064,"116":0.14564,"117":0.34886,"118":2.8925,"119":12.09498,"120":0.00339,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 47 48 51 52 53 54 55 56 57 58 59 61 62 65 66 68 71 75 76 84 85 90 91 92 98 105 121 122"},F:{"58":0.00339,"79":0.00677,"95":0.06097,"102":0.16935,"103":0.30822,"104":0.46741,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00339,"13":0.00339,"14":0.00339,"15":0.00677,"16":0.00339,"17":0.00339,"18":0.23709,"84":0.01016,"90":0.00339,"92":0.02032,"100":0.00339,"105":0.00339,"108":0.01694,"109":0.04403,"110":0.00677,"111":0.00677,"112":0.09484,"113":0.00677,"114":0.04403,"115":0.01355,"116":0.05081,"117":0.09145,"118":0.80949,"119":4.42681,_:"79 80 81 83 85 86 87 88 89 91 93 94 95 96 97 98 99 101 102 103 104 106 107"},E:{"13":0.00339,"14":0.00339,_:"0 4 5 6 7 8 9 10 11 12 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 15.1 15.2-15.3","13.1":0.0271,"14.1":0.05081,"15.4":0.02032,"15.5":0.03387,"15.6":0.10161,"16.0":0.00677,"16.1":0.02371,"16.2":0.01016,"16.3":0.03726,"16.4":0.01016,"16.5":0.0271,"16.6":0.5216,"17.0":0.16596,"17.1":0.21338,"17.2":0.00677},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00149,"5.0-5.1":0.00149,"6.0-6.1":0.00372,"7.0-7.1":0.0052,"8.1-8.4":0.00074,"9.0-9.2":0.00595,"9.3":0.01858,"10.0-10.2":0.00149,"10.3":0.02676,"11.0-11.2":0.01264,"11.3-11.4":0.01115,"12.0-12.1":0.00669,"12.2-12.5":0.1219,"13.0-13.1":0.00297,"13.2":0.01264,"13.3":0.00743,"13.4-13.7":0.02156,"14.0-14.4":0.05723,"14.5-14.8":0.09291,"15.0-15.1":0.03642,"15.2-15.3":0.0446,"15.4":0.0498,"15.5":0.06987,"15.6-15.7":0.36719,"16.0":0.17245,"16.1":0.34564,"16.2":0.16576,"16.3":0.3107,"16.4":0.06392,"16.5":0.16501,"16.6-16.7":2.79704,"17.0":0.8377,"17.1":1.40707,"17.2":0.04014},P:{"4":0.38396,"20":0.05189,"21":0.11415,"22":0.39434,"23":2.18962,"5.0-5.4":0.01038,"6.2-6.4":0.01038,"7.2-7.4":0.35283,_:"8.2 9.2 12.0","10.1":0.04151,"11.1-11.2":0.01038,"13.0":0.04151,"14.0":0.03113,"15.0":0.01038,"16.0":0.04151,"17.0":0.07264,"18.0":0.0934,"19.0":0.19717},I:{"0":0.0329,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.0001},K:{"0":1.72535,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.08806,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.00661,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.41001},H:{"0":0.08},L:{"0":56.75433},R:{_:"0"},M:{"0":0.23807},Q:{"13.1":0.03307}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NC.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NC.js
    index 55bcdd868bdb2a..42dac150c45b29 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NC.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NC.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.05705,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.00519,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.01037,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.02593,"79":0,"80":0.00519,"81":0,"82":0.00519,"83":0.01556,"84":0,"85":0,"86":0,"87":0,"88":0.02593,"89":0.00519,"90":0,"91":0.03112,"92":0,"93":0.00519,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.31116,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00519,"109":0.00519,"110":0,"111":0.00519,"112":0.00519,"113":0.03112,"114":0.00519,"115":0.30079,"116":0.28004,"117":4.29919,"118":0.16077,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00519,"50":0,"51":0,"52":0,"53":0.01037,"54":0,"55":0,"56":0.01037,"57":0,"58":0,"59":0,"60":0,"61":0.00519,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0.01556,"76":0.00519,"77":0,"78":0,"79":0.01037,"80":0,"81":0.04149,"83":0,"84":0,"85":0,"86":0.00519,"87":0.00519,"88":0.01037,"89":0,"90":0.00519,"91":0,"92":0.00519,"93":0,"94":0.02074,"95":0.00519,"96":0.01037,"97":0.01037,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.07779,"104":0.00519,"105":0,"106":0,"107":0.02593,"108":0,"109":0.99053,"110":0.00519,"111":0.00519,"112":0.04667,"113":0.02074,"114":0.47193,"115":0.17632,"116":7.41598,"117":2.68116,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.00519,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.00519,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.02074,"101":0.24374,"102":0.25411,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00519,"18":0.03112,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.02593,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0.00519,"107":0,"108":0,"109":0.02593,"110":0.01037,"111":0.01037,"112":0.01037,"113":0.00519,"114":0.52379,"115":0.05186,"116":2.01217,"117":1.42096},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00519,"14":0.05705,"15":0.01037,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0.01556,"11.1":0.00519,"12.1":0.02593,"13.1":0.07779,"14.1":0.15558,"15.1":0.01037,"15.2-15.3":0.01037,"15.4":0.02074,"15.5":0.0363,"15.6":0.20225,"16.0":0.05186,"16.1":0.06742,"16.2":0.05186,"16.3":0.10891,"16.4":0.04149,"16.5":0.223,"16.6":1.86177,"17.0":0.01037,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.0023,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0.0046,"9.3":0.04136,"10.0-10.2":0,"10.3":0.04596,"11.0-11.2":0.0046,"11.3-11.4":0.00689,"12.0-12.1":0,"12.2-12.5":0.34011,"13.0-13.1":0.00919,"13.2":0,"13.3":0.19074,"13.4-13.7":0.0046,"14.0-14.4":0.10111,"14.5-14.8":0.17465,"15.0-15.1":0.41364,"15.2-15.3":0.03677,"15.4":0.14937,"15.5":0.1126,"15.6-15.7":1.20875,"16.0":0.35849,"16.1":1.02262,"16.2":0.32402,"16.3":1.02951,"16.4":0.20223,"16.5":0.65493,"16.6":15.3829,"17.0":0.91461,"17.1":0.0046},P:{"4":0.01033,"20":0.10332,"21":0.21697,"22":4.03982,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.27896,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.02066,"12.0":0,"13.0":0.02066,"14.0":0.02066,"15.0":0.02066,"16.0":0.08266,"17.0":0.01033,"18.0":0.031,"19.0":0.36162},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.01801,"4.4":0,"4.4.3-4.4.4":0.23868},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01037,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":42.46239},R:{_:"0"},M:{"0":0.52473},Q:{"13.1":0},O:{"0":0.0674},H:{"0":0.0319}};
    +module.exports={C:{"52":0.06065,"60":0.00433,"68":0.02166,"78":0.04332,"80":0.00866,"83":0.01733,"88":0.09964,"89":0.00433,"91":0.03466,"94":0.00433,"101":0.00433,"102":0.03899,"106":0.00866,"109":0.00866,"111":0.00866,"112":0.00433,"113":0.02599,"114":0.00433,"115":1.096,"116":0.03466,"117":0.02599,"118":0.12996,"119":3.72119,"120":1.4079,"121":0.00433,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 61 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 79 81 82 84 85 86 87 90 92 93 95 96 97 98 99 100 103 104 105 107 108 110 122 123 3.5 3.6"},D:{"40":0.00433,"49":0.00866,"56":0.00433,"73":0.00866,"75":0.00433,"79":0.03032,"83":0.03032,"84":0.00433,"86":0.00433,"87":0.02599,"88":0.00433,"89":0.00433,"92":0.00433,"93":0.00433,"94":0.09097,"96":0.00433,"97":0.02166,"98":0.013,"100":0.00866,"102":0.03032,"103":0.21227,"104":0.00866,"105":0.00866,"106":0.00433,"107":0.02166,"108":0.00866,"109":2.11402,"110":0.00433,"111":0.00866,"112":0.02166,"113":0.013,"114":0.37688,"115":0.03466,"116":0.62814,"117":0.16895,"118":4.15006,"119":15.4999,"121":0.00433,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 47 48 50 51 52 53 54 55 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 74 76 77 78 80 81 85 90 91 95 99 101 120 122"},F:{"81":0.00433,"95":0.00866,"102":0.19927,"103":0.07364,"104":0.46352,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"17":0.00866,"18":0.00433,"84":0.013,"92":0.02166,"100":0.00866,"109":0.04765,"110":0.01733,"111":0.013,"112":0.01733,"114":0.00866,"115":0.013,"116":0.04332,"117":0.05198,"118":0.99636,"119":5.11176,_:"12 13 14 15 16 79 80 81 83 85 86 87 88 89 90 91 93 94 95 96 97 98 99 101 102 103 104 105 106 107 108 113"},E:{"13":0.013,"14":0.06065,"15":0.00866,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1","10.1":0.01733,"11.1":0.00866,"12.1":0.01733,"13.1":0.14729,"14.1":0.16462,"15.1":0.01733,"15.2-15.3":0.03032,"15.4":0.03899,"15.5":0.05198,"15.6":0.27725,"16.0":0.0953,"16.1":0.0953,"16.2":0.12996,"16.3":0.16028,"16.4":0.05198,"16.5":0.26425,"16.6":1.66782,"17.0":0.51118,"17.1":0.58049,"17.2":0.00433},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00283,"5.0-5.1":0.00283,"6.0-6.1":0.00709,"7.0-7.1":0.00992,"8.1-8.4":0.00142,"9.0-9.2":0.01134,"9.3":0.03543,"10.0-10.2":0.00283,"10.3":0.05102,"11.0-11.2":0.02409,"11.3-11.4":0.02126,"12.0-12.1":0.01276,"12.2-12.5":0.23243,"13.0-13.1":0.00567,"13.2":0.02409,"13.3":0.01417,"13.4-13.7":0.0411,"14.0-14.4":0.10913,"14.5-14.8":0.17716,"15.0-15.1":0.06945,"15.2-15.3":0.08504,"15.4":0.09496,"15.5":0.13322,"15.6-15.7":0.70012,"16.0":0.3288,"16.1":0.65902,"16.2":0.31605,"16.3":0.59241,"16.4":0.12188,"16.5":0.31463,"16.6-16.7":5.33311,"17.0":1.59724,"17.1":2.68285,"17.2":0.07653},P:{"4":0.08667,"20":0.09751,"21":0.07584,"22":0.57421,"23":3.46691,_:"5.0-5.4 6.2-6.4 8.2 9.2 12.0","7.2-7.4":0.62838,"10.1":0.0325,"11.1-11.2":0.02167,"13.0":0.0325,"14.0":0.02167,"15.0":0.05417,"16.0":0.065,"17.0":0.02167,"18.0":0.0325,"19.0":0.15168},I:{"0":0.03948,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00012},K:{"0":0.31746,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.013,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.01134},H:{"0":0},L:{"0":36.70822},R:{_:"0"},M:{"0":0.64627},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NE.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NE.js
    index 96c1b20cd21455..c56f72b8c41f70 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NE.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NE.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00279,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.00279,"104":0,"105":0,"106":0.01953,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0.00279,"114":0.00279,"115":0.0558,"116":0.01674,"117":0.18693,"118":0.00837,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00279,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.06696,"80":0,"81":0,"83":0,"84":0,"85":0.00279,"86":0,"87":0.00279,"88":0,"89":0,"90":0.00279,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00279,"103":0.00279,"104":0,"105":0,"106":0.00279,"107":0,"108":0,"109":0.09486,"110":0,"111":0,"112":0.00279,"113":0.00279,"114":0.01674,"115":0.01953,"116":0.6696,"117":0.10602,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.00279,"27":0,"28":0.00279,"29":0,"30":0.00279,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.0279,"38":0,"39":0,"40":0,"41":0,"42":0.00279,"43":0,"44":0,"45":0,"46":0.01674,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00279,"60":0.04185,"62":0,"63":0.03348,"64":0.00279,"65":0,"66":0.01116,"67":0.03069,"68":0.00279,"69":0.06696,"70":0.03069,"71":0.05301,"72":0.24552,"73":0.01395,"74":0,"75":0,"76":0,"77":0.01395,"78":0.00279,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01953,"96":0,"97":0,"98":0,"99":0,"100":0.00837,"101":0.02232,"102":0.03906,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00279},B:{"12":0.00558,"13":0,"14":0,"15":0,"16":0,"17":0.00279,"18":0.00279,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00279,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00558,"103":0,"104":0,"105":0.00837,"106":0,"107":0,"108":0,"109":0.03069,"110":0,"111":0.00279,"112":0.00837,"113":0.01116,"114":0.01116,"115":0.03348,"116":0.1674,"117":0.13113},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.01395,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00279,"14.1":0.04464,"15.1":4.15989,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0.00837,"16.0":0,"16.1":0,"16.2":0.00279,"16.3":0.00558,"16.4":0,"16.5":0,"16.6":0.02232,"17.0":0,"17.1":0},G:{"8":0.0014,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.02944,"6.0-6.1":0,"7.0-7.1":0.0021,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.00701,"10.0-10.2":0,"10.3":0.08831,"11.0-11.2":0.0007,"11.3-11.4":0,"12.0-12.1":0.00561,"12.2-12.5":1.12555,"13.0-13.1":0.0021,"13.2":0.00911,"13.3":0.00631,"13.4-13.7":0.02663,"14.0-14.4":0.12545,"14.5-14.8":0.92931,"15.0-15.1":0.10933,"15.2-15.3":0.0799,"15.4":0.02873,"15.5":0.07149,"15.6-15.7":0.91319,"16.0":0.28664,"16.1":0.10162,"16.2":0.26001,"16.3":0.35883,"16.4":0.28244,"16.5":0.73027,"16.6":1.17671,"17.0":0.21936,"17.1":0},P:{"4":0.0403,"20":0.06045,"21":0.07053,"22":0.37279,"5.0-5.4":0,"6.2-6.4":0.01008,"7.2-7.4":0.05038,"8.2":0,"9.2":0.05038,"10.1":0,"11.1-11.2":0.02015,"12.0":0,"13.0":0.03023,"14.0":0,"15.0":0,"16.0":0.02015,"17.0":0,"18.0":0.03023,"19.0":0.03023},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.04116},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.02232,"5.5":0},S:{"2.5":0.06489,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":80.01709},R:{_:"0"},M:{"0":0.03605},Q:{"13.1":0.03605},O:{"0":0.87962},H:{"0":3.14677}};
    +module.exports={C:{"39":0.001,"43":0.001,"44":0.002,"45":0.001,"46":0.001,"47":0.00301,"48":0.002,"52":0.01804,"59":0.001,"60":0.001,"68":0.001,"72":0.00401,"87":0.001,"90":0.001,"91":0.001,"92":0.001,"97":0.00301,"99":0.001,"102":0.001,"106":0.04208,"107":0.001,"112":0.001,"113":0.00301,"114":0.00701,"115":0.2004,"116":0.001,"117":0.00301,"118":0.03507,"119":0.56914,"120":0.18437,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 40 41 42 49 50 51 53 54 55 56 57 58 61 62 63 64 65 66 67 69 70 71 73 74 75 76 77 78 79 80 81 82 83 84 85 86 88 89 93 94 95 96 98 100 101 103 104 105 108 109 110 111 121 122 123 3.5 3.6"},D:{"21":0.001,"26":0.00501,"31":0.001,"34":0.001,"38":0.00301,"43":0.00401,"45":0.001,"47":0.001,"48":0.001,"49":0.02605,"50":0.00301,"57":0.001,"58":0.002,"59":0.00501,"61":0.002,"62":0.001,"63":0.00301,"66":0.001,"67":0.002,"68":0.001,"69":0.002,"70":0.00301,"71":0.00301,"72":0.00401,"73":0.001,"77":0.001,"78":0.00301,"79":0.10521,"80":0.00601,"81":0.00401,"83":0.001,"84":0.001,"85":0.002,"86":0.001,"88":0.00501,"89":0.00802,"90":0.002,"91":0.002,"92":0.001,"93":0.002,"96":0.001,"97":0.001,"98":0.00501,"99":0.02104,"100":0.001,"102":0.00301,"103":0.02605,"104":0.002,"105":0.001,"106":0.001,"108":0.002,"109":0.43186,"110":0.002,"111":0.00501,"112":0.00401,"113":0.002,"114":0.01403,"115":0.00301,"116":0.07114,"117":0.06613,"118":0.85571,"119":2.15129,"121":0.002,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 22 23 24 25 27 28 29 30 32 33 35 36 37 39 40 41 42 44 46 51 52 53 54 55 56 60 64 65 74 75 76 87 94 95 101 107 120 122"},F:{"34":0.001,"79":0.00401,"83":0.001,"86":0.001,"92":0.001,"95":0.07916,"96":0.001,"100":0.001,"101":0.001,"102":0.00701,"103":0.02605,"104":0.11323,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 84 85 87 88 89 90 91 93 94 97 98 99 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00401,"13":0.001,"14":0.001,"16":0.002,"17":0.002,"18":0.01503,"84":0.00401,"89":0.00802,"90":0.00401,"92":0.01403,"100":0.00301,"103":0.001,"105":0.002,"108":0.001,"109":0.08116,"110":0.001,"111":0.00802,"112":0.001,"113":0.00802,"114":0.01703,"115":0.02104,"116":0.00601,"117":0.01703,"118":0.53006,"119":1.13527,_:"15 79 80 81 83 85 86 87 88 91 93 94 95 96 97 98 99 101 102 104 106 107"},E:{"14":0.001,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1 12.1 14.1 15.1 15.2-15.3 15.5 16.1 16.2 16.4 17.2","5.1":0.0521,"13.1":0.00301,"15.4":0.002,"15.6":0.00902,"16.0":0.001,"16.3":0.001,"16.5":0.001,"16.6":0.00301,"17.0":0.01202,"17.1":0.1002},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00127,"5.0-5.1":0.00127,"6.0-6.1":0.00317,"7.0-7.1":0.00444,"8.1-8.4":0.00063,"9.0-9.2":0.00507,"9.3":0.01586,"10.0-10.2":0.00127,"10.3":0.02283,"11.0-11.2":0.01078,"11.3-11.4":0.00951,"12.0-12.1":0.00571,"12.2-12.5":0.10402,"13.0-13.1":0.00254,"13.2":0.01078,"13.3":0.00634,"13.4-13.7":0.01839,"14.0-14.4":0.04884,"14.5-14.8":0.07929,"15.0-15.1":0.03108,"15.2-15.3":0.03806,"15.4":0.0425,"15.5":0.05962,"15.6-15.7":0.31334,"16.0":0.14715,"16.1":0.29494,"16.2":0.14145,"16.3":0.26513,"16.4":0.05455,"16.5":0.14081,"16.6-16.7":2.38683,"17.0":0.71484,"17.1":1.20071,"17.2":0.03425},P:{"20":0.03029,"21":0.08077,"22":0.16155,"23":0.37358,_:"4 6.2-6.4 8.2 11.1-11.2 12.0 13.0 14.0 17.0","5.0-5.4":0.0101,"7.2-7.4":0.05048,"9.2":0.06058,"10.1":0.0101,"15.0":0.0101,"16.0":0.06058,"18.0":0.04039,"19.0":0.02019},I:{"0":0.0179,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00005},K:{"0":3.3037,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.14629,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.03599,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.82772},H:{"0":0.61},L:{"0":80.05912},R:{_:"0"},M:{"0":0.04499},Q:{"13.1":0.02699}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NF.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NF.js
    index 3d99f1bfb9bdf5..b9661c9c870d0c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NF.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NF.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.04645,"116":0.04645,"117":0.27579,"118":0,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.50512,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":2.11629,"117":0.36868,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":1.33538,"117":2.66786},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.13934,"14.1":0,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0,"16.0":0,"16.1":0,"16.2":0,"16.3":0,"16.4":0.22934,"16.5":0,"16.6":0.0929,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":3.83209,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0,"14.0-14.4":0,"14.5-14.8":0,"15.0-15.1":0,"15.2-15.3":0,"15.4":0.57455,"15.5":0,"15.6-15.7":4.98647,"16.0":0.76431,"16.1":21.65897,"16.2":0.18976,"16.3":0.95934,"16.4":0,"16.5":0.57455,"16.6":19.16574,"17.0":0,"17.1":0},P:{"4":0,"20":0,"21":0.66737,"22":9.39617,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0,"17.0":0,"18.0":0,"19.0":0},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.04645,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":26.20603},R:{_:"0"},M:{"0":0},Q:{"13.1":0},O:{"0":0},H:{"0":0}};
    +module.exports={C:{"78":1.24147,"115":0.24595,"119":0.24595,"120":0.98966,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 116 117 118 121 122 123 3.5 3.6"},D:{"56":0.24595,"109":1.73923,"117":0.24595,"118":0.74371,"119":8.68445,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 111 112 113 114 115 116 120 121 122"},F:{"104":0.24595,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"109":0.24595,"117":0.49776,"118":7.19702,"119":30.02371,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 111 112 113 114 115 116"},E:{"14":1.24147,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 13.1 14.1 15.1 15.2-15.3 15.4 15.5 15.6 16.0 16.2 16.3 16.4 17.0 17.1 17.2","16.1":0.24595,"16.5":0.24595,"16.6":2.23114},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00336,"5.0-5.1":0.00336,"6.0-6.1":0.0084,"7.0-7.1":0.01176,"8.1-8.4":0.00168,"9.0-9.2":0.01344,"9.3":0.04199,"10.0-10.2":0.00336,"10.3":0.06046,"11.0-11.2":0.02855,"11.3-11.4":0.02519,"12.0-12.1":0.01512,"12.2-12.5":0.27545,"13.0-13.1":0.00672,"13.2":0.02855,"13.3":0.0168,"13.4-13.7":0.04871,"14.0-14.4":0.12933,"14.5-14.8":0.20995,"15.0-15.1":0.0823,"15.2-15.3":0.10077,"15.4":0.11253,"15.5":0.15788,"15.6-15.7":0.82971,"16.0":0.38966,"16.1":0.781,"16.2":0.37454,"16.3":0.70206,"16.4":0.14444,"16.5":0.37287,"16.6-16.7":6.32023,"17.0":1.89288,"17.1":3.17943,"17.2":0.0907},P:{"23":2.51894,_:"4 20 21 22 5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0"},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{"0":0.28172,_:"10 11 12 11.1 11.5 12.1"},A:{"11":1.48742,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{_:"0"},H:{"0":0},L:{"0":22.05379},R:{_:"0"},M:{"0":0.28172},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NG.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NG.js
    index 485f6dfe0e62de..d59fd83df2e48b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NG.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NG.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00166,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00166,"69":0,"70":0,"71":0,"72":0.00166,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00166,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00166,"100":0,"101":0.00166,"102":0.00331,"103":0,"104":0,"105":0,"106":0.00166,"107":0.00166,"108":0.00166,"109":0.00166,"110":0.00166,"111":0.00166,"112":0.00331,"113":0.00331,"114":0.00331,"115":0.10102,"116":0.01325,"117":0.0679,"118":0.00662,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00166,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00166,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0.00166,"60":0,"61":0,"62":0.00166,"63":0.00166,"64":0.00166,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.00331,"71":0,"72":0.00166,"73":0,"74":0.00331,"75":0.00166,"76":0.00331,"77":0.00166,"78":0,"79":0.00331,"80":0.00331,"81":0.00828,"83":0,"84":0,"85":0.00166,"86":0.00166,"87":0.00331,"88":0.00166,"89":0.00166,"90":0.00166,"91":0.00166,"92":0.00166,"93":0.04802,"94":0.00166,"95":0.00331,"96":0.00166,"97":0.00166,"98":0,"99":0.00166,"100":0.00166,"101":0.00166,"102":0.00166,"103":0.00662,"104":0.00166,"105":0.00497,"106":0.00331,"107":0.00331,"108":0.00497,"109":0.14076,"110":0.00331,"111":0.00662,"112":0.00662,"113":0.00662,"114":0.02484,"115":0.03146,"116":0.61769,"117":0.13579,"118":0.00166,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0.0149,"25":0,"26":0.00828,"27":0.01822,"28":0.01656,"29":0.00166,"30":0.01159,"31":0.00662,"32":0.01656,"33":0.00662,"34":0,"35":0.00166,"36":0.00166,"37":0.00497,"38":0.00828,"39":0.00166,"40":0,"41":0.00166,"42":0.01325,"43":0,"44":0.00166,"45":0.00166,"46":0.00828,"47":0.00497,"48":0,"49":0,"50":0.01159,"51":0.00662,"52":0,"53":0.00166,"54":0.00828,"55":0.00662,"56":0.00331,"57":0.00994,"58":0.02153,"60":0.13745,"62":0.00166,"63":0.1242,"64":0.02484,"65":0.01325,"66":0.09274,"67":0.09936,"68":0.06624,"69":0.3577,"70":0.23018,"71":0.45374,"72":0.91908,"73":0.13579,"74":0.00994,"75":0.00497,"76":0.00994,"77":0.05962,"78":0.00331,"79":0.00166,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00497,"96":0,"97":0,"98":0,"99":0,"100":0.00662,"101":0.02153,"102":0.01822,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.01159},B:{"12":0.00166,"13":0,"14":0,"15":0.00166,"16":0,"17":0,"18":0.00331,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00166,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00331,"110":0,"111":0,"112":0.00166,"113":0.00166,"114":0.00497,"115":0.00828,"116":0.06458,"117":0.0414},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00166,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00166,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00166,"14.1":0.00166,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.00166,"15.6":0.00497,"16.0":0,"16.1":0.00166,"16.2":0.00166,"16.3":0.00331,"16.4":0.00166,"16.5":0.00331,"16.6":0.00828,"17.0":0.00166,"17.1":0},G:{"8":0.00424,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00085,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00509,"8.1-8.4":0.00085,"9.0-9.2":0,"9.3":0.01782,"10.0-10.2":0.00085,"10.3":0.02631,"11.0-11.2":0.02631,"11.3-11.4":0.0017,"12.0-12.1":0.02546,"12.2-12.5":0.51423,"13.0-13.1":0.02037,"13.2":0.00594,"13.3":0.02715,"13.4-13.7":0.06704,"14.0-14.4":0.36743,"14.5-14.8":0.35216,"15.0-15.1":0.45144,"15.2-15.3":0.23081,"15.4":0.15868,"15.5":0.24015,"15.6-15.7":1.26013,"16.0":0.42344,"16.1":0.43532,"16.2":0.36828,"16.3":0.61861,"16.4":0.35895,"16.5":0.71874,"16.6":1.44003,"17.0":0.28597,"17.1":0},P:{"4":0.04089,"20":0.05111,"21":0.10221,"22":0.39863,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.04089,"8.2":0,"9.2":0.02044,"10.1":0,"11.1-11.2":0.02044,"12.0":0,"13.0":0.01022,"14.0":0.01022,"15.0":0.01022,"16.0":0.03066,"17.0":0.02044,"18.0":0.02044,"19.0":0.04089},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00383,"4.2-4.3":0.00096,"4.4":0,"4.4.3-4.4.4":0.06515},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00166,"5.5":0},S:{"2.5":0.03338,_:"3.0-3.1"},J:{"7":0,"10":0.00834},N:{"10":0,"11":0},L:{"0":55.02002},R:{_:"0"},M:{"0":0.23363},Q:{"13.1":0.00834},O:{"0":0.77599},H:{"0":26.29764}};
    +module.exports={C:{"34":0.0012,"43":0.01195,"45":0.0012,"47":0.00239,"49":0.0012,"52":0.00359,"56":0.0012,"57":0.0012,"65":0.00359,"66":0.0012,"72":0.00359,"76":0.0012,"77":0.0012,"78":0.00239,"80":0.0012,"89":0.0012,"91":0.0012,"92":0.00239,"93":0.0012,"94":0.0012,"96":0.00239,"99":0.00717,"100":0.0012,"101":0.00239,"102":0.00239,"103":0.00239,"104":0.00598,"105":0.0012,"106":0.00239,"107":0.00239,"108":0.00239,"109":0.00239,"110":0.00239,"111":0.00239,"112":0.00239,"113":0.00239,"114":0.00837,"115":0.56404,"116":0.00359,"117":0.00598,"118":0.02032,"119":0.3346,"120":0.0968,"121":0.00239,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 44 46 48 50 51 53 54 55 58 59 60 61 62 63 64 67 68 69 70 71 73 74 75 79 81 82 83 84 85 86 87 88 90 95 97 98 122 123 3.5 3.6"},D:{"11":0.0012,"37":0.0012,"38":0.0012,"41":0.0012,"43":0.0012,"47":0.01315,"48":0.0012,"49":0.0012,"50":0.00239,"53":0.0012,"55":0.00478,"56":0.00239,"58":0.00956,"59":0.00359,"60":0.0012,"61":0.0012,"62":0.01195,"63":0.01076,"64":0.00837,"65":0.0012,"66":0.0012,"68":0.00359,"69":0.00478,"70":0.02032,"71":0.0012,"72":0.00239,"73":0.0012,"74":0.00717,"75":0.00717,"76":0.00717,"77":0.01434,"78":0.0012,"79":0.01673,"80":0.01434,"81":0.01076,"83":0.00478,"84":0.00717,"85":0.00837,"86":0.00956,"87":0.01076,"88":0.01195,"89":0.00239,"90":0.00478,"91":0.01195,"92":0.00359,"93":0.19598,"94":0.00956,"95":0.01315,"96":0.01195,"97":0.00837,"98":0.00717,"99":0.00598,"100":0.00717,"101":0.00359,"102":0.01315,"103":0.0239,"104":0.00717,"105":0.02749,"106":0.02032,"107":0.01912,"108":0.02271,"109":0.79946,"110":0.01554,"111":0.02629,"112":0.0239,"113":0.0251,"114":0.05378,"115":0.03585,"116":0.11114,"117":0.17806,"118":1.10657,"119":3.50733,"120":0.00837,"121":0.00359,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 39 40 42 44 45 46 51 52 54 57 67 122"},F:{"33":0.0012,"35":0.0012,"36":0.0012,"42":0.0012,"53":0.00478,"72":0.0012,"73":0.0012,"74":0.0012,"76":0.00239,"77":0.00598,"78":0.0012,"79":0.01315,"82":0.0012,"83":0.0012,"84":0.0012,"85":0.00239,"95":0.02629,"99":0.0012,"100":0.00478,"101":0.00239,"102":0.01793,"103":0.07409,"104":0.15535,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 37 38 39 40 41 43 44 45 46 47 48 49 50 51 52 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 75 80 81 86 87 88 89 90 91 92 93 94 96 97 98 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.01076,"13":0.0012,"14":0.0012,"15":0.00359,"17":0.0012,"18":0.01793,"84":0.00239,"89":0.00239,"90":0.00359,"92":0.01315,"100":0.00359,"106":0.00359,"107":0.00239,"108":0.00359,"109":0.01076,"110":0.00239,"111":0.00239,"112":0.00239,"113":0.00239,"114":0.00717,"115":0.00717,"116":0.00956,"117":0.02271,"118":0.1685,"119":0.54014,_:"16 79 80 81 83 85 86 87 88 91 93 94 95 96 97 98 99 101 102 103 104 105"},E:{"9":0.0012,"10":0.0012,"11":0.00359,"13":0.00478,"14":0.00956,_:"0 4 5 6 7 8 12 15 3.1 3.2 6.1 9.1 10.1","5.1":0.00598,"7.1":0.01195,"11.1":0.00239,"12.1":0.00239,"13.1":0.01195,"14.1":0.01912,"15.1":0.00598,"15.2-15.3":0.0012,"15.4":0.00239,"15.5":0.00359,"15.6":0.02988,"16.0":0.00359,"16.1":0.00717,"16.2":0.00359,"16.3":0.01195,"16.4":0.00598,"16.5":0.01076,"16.6":0.03705,"17.0":0.01912,"17.1":0.0251,"17.2":0.00239},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00132,"5.0-5.1":0.00132,"6.0-6.1":0.00331,"7.0-7.1":0.00463,"8.1-8.4":0.00066,"9.0-9.2":0.00529,"9.3":0.01653,"10.0-10.2":0.00132,"10.3":0.02381,"11.0-11.2":0.01124,"11.3-11.4":0.00992,"12.0-12.1":0.00595,"12.2-12.5":0.10845,"13.0-13.1":0.00265,"13.2":0.01124,"13.3":0.00661,"13.4-13.7":0.01918,"14.0-14.4":0.05092,"14.5-14.8":0.08266,"15.0-15.1":0.0324,"15.2-15.3":0.03968,"15.4":0.0443,"15.5":0.06216,"15.6-15.7":0.32666,"16.0":0.15341,"16.1":0.30748,"16.2":0.14746,"16.3":0.2764,"16.4":0.05687,"16.5":0.1468,"16.6-16.7":2.4883,"17.0":0.74523,"17.1":1.25176,"17.2":0.03571},P:{"4":0.04116,"20":0.03087,"21":0.06174,"22":0.18522,"23":0.319,_:"5.0-5.4 6.2-6.4 8.2 10.1 12.0 15.0","7.2-7.4":0.04116,"9.2":0.02058,"11.1-11.2":0.02058,"13.0":0.01029,"14.0":0.01029,"16.0":0.03087,"17.0":0.02058,"18.0":0.02058,"19.0":0.04116},I:{"0":0.05257,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00004,"4.4":0,"4.4.3-4.4.4":0.00016},K:{"0":24.1121,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00254,"9":0.00254,"10":0.00254,"11":0.0127,_:"6 7 5.5"},N:{_:"10 11"},S:{"2.5":0.03522,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.71321},H:{"0":4.24},L:{"0":53.40026},R:{_:"0"},M:{"0":0.24654},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NI.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NI.js
    index 20595375b6a998..f0e675d441a8ab 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NI.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NI.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0.00375,"99":0,"100":0,"101":0,"102":0.00375,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0.00375,"111":0.00375,"112":0.0075,"113":0.0075,"114":0.0075,"115":0.09755,"116":0.03377,"117":0.55154,"118":0.06003,"119":0.00375,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00375,"39":0,"40":0,"41":0.00375,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.09755,"50":0,"51":0,"52":0,"53":0.0075,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00375,"66":0.00375,"67":0,"68":0.00375,"69":0.00375,"70":0.00375,"71":0,"72":0.00375,"73":0.00375,"74":0,"75":0.00375,"76":0.00375,"77":0,"78":0,"79":0.03377,"80":0.00375,"81":0.0075,"83":0.0075,"84":0.00375,"85":0.00375,"86":0.00375,"87":0.01126,"88":0.01126,"89":0.0075,"90":0.05628,"91":0.32642,"92":0.00375,"93":0.0075,"94":0.00375,"95":0.00375,"96":0.0075,"97":0.00375,"98":0.00375,"99":0.01876,"100":0.00375,"101":0.00375,"102":0.0075,"103":0.02626,"104":0.0075,"105":0.03377,"106":0.01501,"107":0.0075,"108":0.0075,"109":0.58156,"110":0.0075,"111":0.01126,"112":0.01501,"113":0.02251,"114":0.07504,"115":0.16884,"116":5.99194,"117":1.3995,"118":0.00375,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00375,"29":0.00375,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.03752,"70":0.00375,"71":0.01126,"72":0.03752,"73":0.0075,"74":0,"75":0,"76":0,"77":0.01126,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0.04127,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.04127,"96":0,"97":0,"98":0,"99":0.00375,"100":0.07129,"101":0.22137,"102":0.21762,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00375,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0.06378,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.01126,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.0075,"104":0.00375,"105":0,"106":0,"107":0,"108":0,"109":0.01876,"110":0.00375,"111":0,"112":0.00375,"113":0.00375,"114":0.02626,"115":0.03002,"116":0.79542,"117":0.59657},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00375,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00375,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00375,"14.1":0.06378,"15.1":0,"15.2-15.3":0,"15.4":0.00375,"15.5":0.00375,"15.6":0.03002,"16.0":0.0075,"16.1":0.01126,"16.2":0.0075,"16.3":0.01126,"16.4":0.00375,"16.5":0.04127,"16.6":0.23262,"17.0":0.01501,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00302,"6.0-6.1":0,"7.0-7.1":0.0242,"8.1-8.4":0,"9.0-9.2":0.00504,"9.3":0.04738,"10.0-10.2":0,"10.3":0.01916,"11.0-11.2":0.00504,"11.3-11.4":0.00302,"12.0-12.1":0.00403,"12.2-12.5":0.16635,"13.0-13.1":0.00403,"13.2":0.00403,"13.3":0.96583,"13.4-13.7":0.00907,"14.0-14.4":0.05343,"14.5-14.8":0.0867,"15.0-15.1":0.03932,"15.2-15.3":0.08166,"15.4":0.04033,"15.5":0.0615,"15.6-15.7":0.86199,"16.0":0.32463,"16.1":0.2712,"16.2":0.16635,"16.3":0.35588,"16.4":0.10787,"16.5":0.34984,"16.6":5.15882,"17.0":0.73093,"17.1":0},P:{"4":0.2048,"20":0.13312,"21":0.23551,"22":2.24251,"5.0-5.4":0,"6.2-6.4":0.01024,"7.2-7.4":0.29695,"8.2":0,"9.2":0.03072,"10.1":0,"11.1-11.2":0.09216,"12.0":0,"13.0":0.02048,"14.0":0.03072,"15.0":0.03072,"16.0":0.1024,"17.0":0.04096,"18.0":0.0512,"19.0":0.16384},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.01073,"4.2-4.3":0.01073,"4.4":0,"4.4.3-4.4.4":0.18235},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01501,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":70.89942},R:{_:"0"},M:{"0":0.09997},Q:{"13.1":0},O:{"0":0.18744},H:{"0":0.49688}};
    +module.exports={C:{"52":0.00493,"66":0.00493,"98":0.05918,"113":0.00493,"115":0.16276,"116":0.00986,"117":0.01973,"118":0.03946,"119":0.91242,"120":0.2318,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 99 100 101 102 103 104 105 106 107 108 109 110 111 112 114 121 122 123 3.5 3.6"},D:{"49":0.00986,"53":0.00493,"60":0.00493,"63":0.00493,"65":0.00493,"69":0.00986,"70":0.00986,"73":0.00986,"75":0.00493,"76":0.00493,"77":0.00493,"79":0.06905,"81":0.00493,"83":0.02466,"86":0.00493,"87":0.01973,"88":0.02466,"89":0.00493,"91":2.3279,"93":0.00986,"94":0.00986,"95":0.02466,"96":0.00986,"97":0.00986,"99":0.04439,"100":0.00493,"102":0.00986,"103":0.04439,"104":0.0148,"105":0.00493,"106":0.00986,"107":0.00986,"108":0.02466,"109":1.30698,"110":0.00493,"111":0.00986,"112":0.01973,"113":0.0148,"114":0.04439,"115":0.01973,"116":0.10357,"117":0.19235,"118":3.26992,"119":32.77807,"120":0.00493,"121":0.00493,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 50 51 52 54 55 56 57 58 59 61 62 64 66 67 68 71 72 74 78 80 84 85 90 92 98 101 122"},F:{"28":0.00493,"31":0.00493,"95":0.08878,"102":0.52772,"103":0.07891,"104":0.73487,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.00493,"89":0.00493,"92":0.02466,"100":0.00493,"104":0.00493,"107":0.00493,"108":0.00493,"109":0.04439,"110":0.00493,"112":0.00493,"113":0.00493,"114":0.02466,"115":0.00493,"116":0.02959,"117":0.05425,"118":0.50306,"119":2.39202,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 90 91 93 94 95 96 97 98 99 101 102 103 105 106 111"},E:{_:"0 4 5 6 7 8 9 10 11 12 13 14 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1 12.1","5.1":0.00986,"13.1":0.00493,"14.1":0.0148,"15.1":0.00493,"15.2-15.3":0.00493,"15.4":0.08384,"15.5":0.00493,"15.6":0.04439,"16.0":0.00493,"16.1":0.0148,"16.2":0.0148,"16.3":0.02466,"16.4":0.0148,"16.5":0.04932,"16.6":0.32058,"17.0":0.04932,"17.1":0.14303,"17.2":0.00493},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00087,"5.0-5.1":0.00087,"6.0-6.1":0.00218,"7.0-7.1":0.00305,"8.1-8.4":0.00044,"9.0-9.2":0.00349,"9.3":0.01091,"10.0-10.2":0.00087,"10.3":0.01571,"11.0-11.2":0.00742,"11.3-11.4":0.00654,"12.0-12.1":0.00393,"12.2-12.5":0.07155,"13.0-13.1":0.00175,"13.2":0.00742,"13.3":0.00436,"13.4-13.7":0.01265,"14.0-14.4":0.03359,"14.5-14.8":0.05453,"15.0-15.1":0.02138,"15.2-15.3":0.02618,"15.4":0.02923,"15.5":0.04101,"15.6-15.7":0.21552,"16.0":0.10121,"16.1":0.20286,"16.2":0.09729,"16.3":0.18236,"16.4":0.03752,"16.5":0.09685,"16.6-16.7":1.64168,"17.0":0.49167,"17.1":0.82586,"17.2":0.02356},P:{"4":0.18558,"20":0.07217,"21":0.18558,"22":0.40209,"23":1.54649,_:"5.0-5.4 6.2-6.4 8.2 10.1","7.2-7.4":0.21651,"9.2":0.01031,"11.1-11.2":0.06186,"12.0":0.01031,"13.0":0.01031,"14.0":0.02062,"15.0":0.01031,"16.0":0.05155,"17.0":0.03093,"18.0":0.05155,"19.0":0.1031},I:{"0":0.06554,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00005,"4.4":0,"4.4.3-4.4.4":0.0002},K:{"0":0.36989,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.02466,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.01013,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.10641},H:{"0":0},L:{"0":44.25995},R:{_:"0"},M:{"0":0.10641},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NL.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NL.js
    index e375c51c5f6611..ffaa9d05d09067 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NL.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NL.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00495,"39":0,"40":0,"41":0,"42":0,"43":0.00495,"44":0.01484,"45":0.00495,"46":0,"47":0,"48":0.01484,"49":0,"50":0,"51":0,"52":0.00495,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00495,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.0099,"79":0,"80":0,"81":0.0099,"82":0,"83":0.00495,"84":0,"85":0,"86":0,"87":0,"88":0.00495,"89":0,"90":0,"91":0.00495,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.08412,"103":0.00495,"104":0.00495,"105":0.00495,"106":0.00495,"107":0.00495,"108":0.00495,"109":0.00495,"110":0.01484,"111":0.00495,"112":0.0099,"113":0.02474,"114":0.0099,"115":0.13854,"116":0.07917,"117":1.2469,"118":0.1138,"119":0.00495,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00495,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00495,"46":0,"47":0.00495,"48":0.03464,"49":0.01484,"50":0,"51":0,"52":0.01484,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0.00495,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00495,"69":0,"70":0.00495,"71":0.00495,"72":0.02474,"73":0,"74":0.00495,"75":0,"76":0.00495,"77":0.01484,"78":0.0099,"79":0.01484,"80":0.01979,"81":0.00495,"83":0.00495,"84":0.00495,"85":0.16328,"86":0.03958,"87":0.04948,"88":0.00495,"89":0.0099,"90":0.0099,"91":0.00495,"92":0.0099,"93":0.01979,"94":0.00495,"95":0.00495,"96":0.00495,"97":0.00495,"98":0.00495,"99":0.0099,"100":0.03464,"101":0.05938,"102":0.04453,"103":0.08906,"104":0.05443,"105":0.05443,"106":0.06432,"107":0.02474,"108":0.06927,"109":0.44532,"110":0.02474,"111":0.03464,"112":0.05443,"113":0.09401,"114":0.30183,"115":0.35131,"116":9.10927,"117":2.78078,"118":0.00495,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.02969,"73":0.00495,"74":0,"75":0,"76":0,"77":0.02474,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01484,"96":0,"97":0,"98":0,"99":0.00495,"100":0.05938,"101":0.17813,"102":0.28698,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00495,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.00495,"104":0,"105":0,"106":0.00495,"107":0.00495,"108":0.00495,"109":0.05938,"110":0.00495,"111":0.00495,"112":0.00495,"113":0.01484,"114":0.04453,"115":0.10886,"116":2.05837,"117":1.78623},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00495,"9":0.00495,"10":0,"11":0,"12":0,"13":0.00495,"14":0.02969,"15":0.0099,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.01484,"10.1":0,"11.1":0,"12.1":0.02474,"13.1":0.05443,"14.1":0.09401,"15.1":0.01484,"15.2-15.3":0.01484,"15.4":0.02474,"15.5":0.03464,"15.6":0.26224,"16.0":0.02969,"16.1":0.06432,"16.2":0.06927,"16.3":0.16328,"16.4":0.06927,"16.5":0.20287,"16.6":1.50419,"17.0":0.08906,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00603,"8.1-8.4":0,"9.0-9.2":0.04224,"9.3":0.0513,"10.0-10.2":0,"10.3":0.0694,"11.0-11.2":0.00302,"11.3-11.4":0.02716,"12.0-12.1":0.00603,"12.2-12.5":0.3289,"13.0-13.1":0.00603,"13.2":0.00603,"13.3":0.1207,"13.4-13.7":0.02716,"14.0-14.4":0.08751,"14.5-14.8":0.21726,"15.0-15.1":0.07242,"15.2-15.3":0.10561,"15.4":0.11768,"15.5":0.20217,"15.6-15.7":1.56907,"16.0":0.92636,"16.1":1.71391,"16.2":0.7785,"16.3":1.57812,"16.4":0.24743,"16.5":0.85696,"16.6":18.42152,"17.0":2.18765,"17.1":0.00302},P:{"4":0.02059,"20":0.06177,"21":0.15443,"22":4.49893,"5.0-5.4":0.0103,"6.2-6.4":0,"7.2-7.4":0.0103,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0.0103,"14.0":0.0103,"15.0":0.0103,"16.0":0.02059,"17.0":0.02059,"18.0":0.02059,"19.0":0.04118},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0.03685,"2.3":0,"4.1":0.03685,"4.2-4.3":0.01228,"4.4":0,"4.4.3-4.4.4":0.0737},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.02813,"10":0,"11":0.10547,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":36.22443},R:{_:"0"},M:{"0":0.56582},Q:{"13.1":0.00505},O:{"0":0.44458},H:{"0":0.4209}};
    +module.exports={C:{"38":0.00523,"43":0.00523,"44":0.02093,"45":0.02093,"48":0.16222,"52":0.01047,"78":0.0157,"81":0.0157,"83":0.00523,"85":0.00523,"88":0.00523,"91":0.00523,"101":0.00523,"102":0.02093,"104":0.01047,"105":0.00523,"106":0.0157,"107":0.01047,"108":0.01047,"109":0.01047,"110":0.01047,"111":0.01047,"112":0.00523,"113":0.02617,"114":0.00523,"115":0.32968,"116":0.02093,"117":0.02093,"118":0.06803,"119":1.80539,"120":0.62273,"121":0.00523,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 46 47 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 82 84 86 87 89 90 92 93 94 95 96 97 98 99 100 103 122 123 3.5 3.6"},D:{"38":0.01047,"41":0.00523,"45":0.02093,"47":0.01047,"48":0.11513,"49":0.0314,"52":0.01047,"61":0.00523,"65":0.00523,"66":0.0157,"72":0.0314,"74":0.00523,"75":0.00523,"76":0.00523,"77":0.01047,"78":0.00523,"79":0.06803,"80":0.0157,"81":0.01047,"83":0.0157,"84":0.01047,"85":0.22502,"86":0.08896,"87":0.0314,"88":0.01047,"89":0.00523,"90":0.01047,"91":0.00523,"92":0.02617,"93":0.03663,"94":0.0157,"95":0.0157,"96":0.0157,"97":0.01047,"98":0.0157,"99":0.0628,"100":0.08373,"101":0.15699,"102":0.08896,"103":0.20409,"104":0.12559,"105":0.05233,"106":0.09419,"107":0.08896,"108":0.17792,"109":0.86868,"110":0.07326,"111":0.08373,"112":0.10466,"113":0.12559,"114":0.25118,"115":0.09943,"116":0.53377,"117":0.64366,"118":5.74583,"119":20.81164,"120":0.0157,"121":0.00523,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 42 43 44 46 50 51 53 54 55 56 57 58 59 60 62 63 64 67 68 69 70 71 73 122"},F:{"85":0.00523,"90":0.00523,"91":0.00523,"94":0.00523,"95":0.16222,"102":0.31921,"103":0.11513,"104":0.42911,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 86 87 88 89 92 93 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.00523,"92":0.00523,"103":0.01047,"106":0.00523,"107":0.0157,"108":0.01047,"109":0.08896,"110":0.0157,"111":0.01047,"112":0.01047,"113":0.01047,"114":0.03663,"115":0.02093,"116":0.04186,"117":0.19362,"118":1.25592,"119":6.83953,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 104 105"},E:{"8":0.00523,"9":0.01047,"13":0.00523,"14":0.08373,"15":0.06803,_:"0 4 5 6 7 10 11 12 3.1 3.2 6.1 7.1 10.1 11.1","5.1":0.00523,"9.1":0.00523,"12.1":0.0471,"13.1":0.12036,"14.1":0.22502,"15.1":0.03663,"15.2-15.3":0.02617,"15.4":0.05233,"15.5":0.07326,"15.6":0.49714,"16.0":0.0628,"16.1":0.11513,"16.2":0.12036,"16.3":0.27735,"16.4":0.12036,"16.5":0.24072,"16.6":2.28159,"17.0":0.5233,"17.1":1.09893,"17.2":0.0157},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00374,"5.0-5.1":0.00374,"6.0-6.1":0.00934,"7.0-7.1":0.01308,"8.1-8.4":0.00187,"9.0-9.2":0.01495,"9.3":0.0467,"10.0-10.2":0.00374,"10.3":0.06725,"11.0-11.2":0.03176,"11.3-11.4":0.02802,"12.0-12.1":0.01681,"12.2-12.5":0.30638,"13.0-13.1":0.00747,"13.2":0.03176,"13.3":0.01868,"13.4-13.7":0.05418,"14.0-14.4":0.14385,"14.5-14.8":0.23352,"15.0-15.1":0.09154,"15.2-15.3":0.11209,"15.4":0.12517,"15.5":0.17561,"15.6-15.7":0.92288,"16.0":0.43342,"16.1":0.86871,"16.2":0.41661,"16.3":0.7809,"16.4":0.16066,"16.5":0.41474,"16.6-16.7":7.02999,"17.0":2.10545,"17.1":3.53648,"17.2":0.10088},P:{"4":0.02114,"20":0.03171,"21":0.07398,"22":0.24307,"23":4.01597,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 11.1-11.2 12.0 14.0 15.0","7.2-7.4":0.01057,"13.0":0.01057,"16.0":0.02114,"17.0":0.02114,"18.0":0.01057,"19.0":0.02114},I:{"0":0.04269,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00013},K:{"0":0.37613,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00565,"9":0.03391,"11":0.10173,_:"6 7 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.32892},H:{"0":0.01},L:{"0":24.05763},R:{_:"0"},M:{"0":0.4338},Q:{"13.1":0.00477}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NO.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NO.js
    index f07dfcc57cec92..bd9ae31df8c9a2 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NO.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NO.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0.02769,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00692,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.06923,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00692,"109":0.00692,"110":0,"111":0,"112":0.00692,"113":0.02769,"114":0.00692,"115":0.11769,"116":0.06231,"117":22.98436,"118":1.7169,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.01385,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.11077,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00692,"79":0.01385,"80":0,"81":0.00692,"83":0,"84":0,"85":1.37768,"86":0.01385,"87":0.01385,"88":0,"89":0.00692,"90":0.01385,"91":0,"92":0,"93":0.04154,"94":0,"95":0,"96":0.00692,"97":0.00692,"98":0.00692,"99":0.00692,"100":0.01385,"101":0.02077,"102":0.01385,"103":0.08308,"104":0.01385,"105":0.01385,"106":0.01385,"107":0.01385,"108":0.02077,"109":0.22846,"110":0.03462,"111":0.02769,"112":0.08308,"113":0.10385,"114":0.24923,"115":0.61615,"116":8.71606,"117":2.7692,"118":0.00692,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00692,"73":0,"74":0,"75":0,"76":0,"77":0.02077,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01385,"96":0,"97":0,"98":0,"99":0.00692,"100":0.11769,"101":0.27,"102":0.51923,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.01385,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.02769,"110":0,"111":0,"112":0.01385,"113":0.01385,"114":0.02769,"115":0.09,"116":1.42614,"117":1.36383},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00692,"14":0.03462,"15":0.00692,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0.02077,"12.1":0.01385,"13.1":0.05538,"14.1":0.15923,"15.1":0.02077,"15.2-15.3":0.02077,"15.4":0.06923,"15.5":0.06231,"15.6":0.29769,"16.0":0.02769,"16.1":0.10385,"16.2":0.07615,"16.3":0.24923,"16.4":0.15923,"16.5":0.23538,"16.6":1.78613,"17.0":0.13846,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.03529,"10.0-10.2":0,"10.3":0.04491,"11.0-11.2":0,"11.3-11.4":0.17644,"12.0-12.1":0.00642,"12.2-12.5":0.1989,"13.0-13.1":0,"13.2":0,"13.3":0.07699,"13.4-13.7":0.00642,"14.0-14.4":0.05133,"14.5-14.8":0.19248,"15.0-15.1":0.0385,"15.2-15.3":0.0802,"15.4":0.08341,"15.5":0.22456,"15.6-15.7":1.29606,"16.0":1.03941,"16.1":1.87672,"16.2":0.83089,"16.3":1.72915,"16.4":0.17003,"16.5":0.74106,"16.6":20.89414,"17.0":1.87993,"17.1":0.00321},P:{"4":0.02059,"20":0.02059,"21":0.05146,"22":1.935,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0,"17.0":0.01029,"18.0":0.01029,"19.0":0.01029},I:{"0":0,"3":0,"4":0.0124,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00207,"4.2-4.3":0.00413,"4.4":0,"4.4.3-4.4.4":0.04755},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.03462,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":16.52096},R:{_:"0"},M:{"0":0.2677},Q:{"13.1":0},O:{"0":0.02154},H:{"0":0.14274}};
    +module.exports={C:{"52":0.00519,"59":0.03113,"78":0.01556,"91":0.00519,"102":0.01038,"103":0.00519,"108":0.00519,"109":0.00519,"110":0.00519,"113":0.01556,"114":0.00519,"115":0.39948,"116":0.00519,"117":0.01038,"118":0.07263,"119":1.30219,"120":0.34241,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 92 93 94 95 96 97 98 99 100 101 104 105 106 107 111 112 121 122 123 3.5 3.6"},D:{"38":0.00519,"41":0.00519,"49":0.01556,"66":0.1297,"78":0.00519,"79":0.01556,"85":8.35268,"86":0.01556,"87":0.02075,"89":0.01556,"90":0.01556,"91":0.00519,"92":0.00519,"93":0.01038,"94":0.00519,"96":0.00519,"97":0.00519,"98":0.03632,"99":0.01038,"100":0.01556,"101":0.02594,"102":0.02594,"103":0.11932,"104":0.01556,"105":0.01556,"106":0.03632,"107":0.07263,"108":0.05707,"109":0.5188,"110":0.03632,"111":0.02075,"112":0.06226,"113":0.10895,"114":0.15045,"115":0.14526,"116":0.66925,"117":0.67444,"118":6.485,"119":16.08799,"120":0.01038,"121":0.00519,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 42 43 44 45 46 47 48 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 67 68 69 70 71 72 73 74 75 76 77 80 81 83 84 88 95 122"},F:{"87":0.00519,"90":0.00519,"95":0.02594,"98":0.01556,"99":0.00519,"100":0.01038,"101":0.00519,"102":0.80933,"103":0.20752,"104":0.74707,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 88 89 91 92 93 94 96 97 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.00519},B:{"17":0.01556,"92":0.00519,"100":0.00519,"106":0.01038,"107":0.00519,"108":0.01038,"109":0.05707,"110":0.01556,"111":0.00519,"112":0.01038,"113":0.01556,"114":0.01556,"115":0.01556,"116":0.0415,"117":0.10895,"118":1.04798,"119":4.68995,_:"12 13 14 15 16 18 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 101 102 103 104 105"},E:{"13":0.01038,"14":0.05707,"15":0.01556,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1","11.1":0.02594,"12.1":0.01556,"13.1":0.09857,"14.1":0.28015,"15.1":0.0415,"15.2-15.3":0.03632,"15.4":0.10376,"15.5":0.11932,"15.6":0.57068,"16.0":0.05188,"16.1":0.16602,"16.2":0.16602,"16.3":0.39429,"16.4":0.18677,"16.5":0.3009,"16.6":2.11152,"17.0":0.7782,"17.1":1.36444,"17.2":0.01038},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00562,"5.0-5.1":0.00562,"6.0-6.1":0.01404,"7.0-7.1":0.01966,"8.1-8.4":0.00281,"9.0-9.2":0.02247,"9.3":0.07022,"10.0-10.2":0.00562,"10.3":0.10111,"11.0-11.2":0.04775,"11.3-11.4":0.04213,"12.0-12.1":0.02528,"12.2-12.5":0.46062,"13.0-13.1":0.01123,"13.2":0.04775,"13.3":0.02809,"13.4-13.7":0.08145,"14.0-14.4":0.21627,"14.5-14.8":0.35108,"15.0-15.1":0.13762,"15.2-15.3":0.16852,"15.4":0.18818,"15.5":0.26401,"15.6-15.7":1.38748,"16.0":0.65161,"16.1":1.30603,"16.2":0.62633,"16.3":1.17402,"16.4":0.24154,"16.5":0.62352,"16.6-16.7":10.56899,"17.0":3.16536,"17.1":5.3168,"17.2":0.15167},P:{"4":0.02111,"20":0.02111,"21":0.04222,"22":0.14777,"23":2.90269,_:"5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 18.0","17.0":0.01056,"19.0":0.01056},I:{"0":0.02393,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.00007},K:{"0":0.22093,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00519,"11":0.07782,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.01443},H:{"0":0.01},L:{"0":16.25041},R:{_:"0"},M:{"0":0.40894},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NP.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NP.js
    index 8a9e512594a1ba..66b61abeb7ce35 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NP.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NP.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.0023,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.0023,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0.0023,"111":0,"112":0,"113":0,"114":0.0023,"115":0.03907,"116":0.00919,"117":0.18154,"118":0.02068,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0.0023,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0.0023,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0.0023,"75":0,"76":0,"77":0,"78":0,"79":0.0023,"80":0,"81":0.0023,"83":0,"84":0,"85":0,"86":0,"87":0.0023,"88":0.0023,"89":0,"90":0,"91":0,"92":0,"93":0.0023,"94":0,"95":0,"96":0.0023,"97":0,"98":0.0023,"99":0.0023,"100":0.0023,"101":0,"102":0.0023,"103":0.00919,"104":0.0023,"105":0.0023,"106":0.0046,"107":0.00689,"108":0.0046,"109":0.46649,"110":0.0023,"111":0.0023,"112":0.00919,"113":0.0046,"114":0.02298,"115":0.03447,"116":2.9897,"117":0.66642,"118":0.00689,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.0023,"70":0.0023,"71":0.0046,"72":0.05745,"73":0.01609,"74":0,"75":0,"76":0,"77":0.00689,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.0046,"96":0,"97":0,"98":0,"99":0,"100":0.0046,"101":0.03677,"102":0.02987,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.0023,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.0046,"110":0,"111":0,"112":0,"113":0.0023,"114":0.0023,"115":0.0046,"116":0.19533,"117":0.14018},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.0023,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.0023,"14.1":0.0046,"15.1":0,"15.2-15.3":0.0023,"15.4":0,"15.5":0.0023,"15.6":0.00919,"16.0":0,"16.1":0.0023,"16.2":0.0023,"16.3":0.00689,"16.4":0.0023,"16.5":0.00919,"16.6":0.03907,"17.0":0.0046,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00598,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.01435,"10.0-10.2":0,"10.3":0.05382,"11.0-11.2":0.01076,"11.3-11.4":0.00239,"12.0-12.1":0.00837,"12.2-12.5":0.39226,"13.0-13.1":0.00359,"13.2":0.00359,"13.3":0.04066,"13.4-13.7":0.03468,"14.0-14.4":0.09328,"14.5-14.8":0.20809,"15.0-15.1":0.0287,"15.2-15.3":0.05023,"15.4":0.05262,"15.5":0.09209,"15.6-15.7":1.76277,"16.0":0.15786,"16.1":0.42335,"16.2":0.16982,"16.3":0.42335,"16.4":0.07773,"16.5":0.26908,"16.6":6.64927,"17.0":0.69124,"17.1":0.00239},P:{"4":0.06277,"20":0.02092,"21":0.04184,"22":0.46028,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.03138,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0.01046,"14.0":0,"15.0":0,"16.0":0.01046,"17.0":0.04184,"18.0":0.01046,"19.0":0.01046},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.07298},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.0023,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":80.30468},R:{_:"0"},M:{"0":0.04621},Q:{"13.1":0},O:{"0":0.95505},H:{"0":0.52501}};
    +module.exports={C:{"34":0.00206,"52":0.00206,"89":0.00206,"91":0.00206,"100":0.00206,"107":0.00206,"110":0.00206,"112":0.00206,"113":0.00206,"114":0.00412,"115":0.40602,"116":0.00412,"117":0.00618,"118":0.01855,"119":0.53174,"120":0.24938,"121":0.01031,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 90 92 93 94 95 96 97 98 99 101 102 103 104 105 106 108 109 111 122 123 3.5 3.6"},D:{"49":0.00206,"68":0.00206,"69":0.00412,"73":0.00206,"74":0.00618,"75":0.00206,"76":0.00206,"77":0.00206,"79":0.00618,"80":0.00206,"81":0.00206,"83":0.00412,"84":0.00206,"85":0.00206,"86":0.00206,"87":0.00824,"88":0.00412,"89":0.00206,"91":0.00206,"92":0.00206,"93":0.00824,"94":0.00206,"95":0.00206,"96":0.00412,"97":0.00412,"98":0.00618,"99":0.00824,"100":0.00412,"101":0.00206,"102":0.01649,"103":0.03504,"104":0.00412,"105":0.00618,"106":0.01855,"107":0.01855,"108":0.01649,"109":1.68178,"110":0.00618,"111":0.01855,"112":0.02473,"113":0.01031,"114":0.03298,"115":0.02061,"116":0.13603,"117":0.19167,"118":3.02143,"119":11.34581,"120":0.05977,"121":0.00412,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 70 71 72 78 90 122"},F:{"42":0.00206,"79":0.00206,"85":0.00206,"95":0.02061,"96":0.00206,"102":0.0371,"103":0.05359,"104":0.14015,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 86 87 88 89 90 91 92 93 94 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.00206,"92":0.00618,"105":0.00206,"108":0.00206,"109":0.02885,"110":0.00206,"112":0.00206,"113":0.00206,"114":0.00618,"115":0.00412,"116":0.00412,"117":0.05771,"118":0.20816,"119":1.00989,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 106 107 111"},E:{"13":0.00206,"14":0.00618,_:"0 4 5 6 7 8 9 10 11 12 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1","11.1":0.00206,"12.1":0.00206,"13.1":0.01237,"14.1":0.01443,"15.1":0.00206,"15.2-15.3":0.00412,"15.4":0.00412,"15.5":0.00618,"15.6":0.03504,"16.0":0.00412,"16.1":0.01237,"16.2":0.00824,"16.3":0.01443,"16.4":0.01031,"16.5":0.01649,"16.6":0.10511,"17.0":0.04328,"17.1":0.07007,"17.2":0.00618},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00182,"5.0-5.1":0.00182,"6.0-6.1":0.00456,"7.0-7.1":0.00639,"8.1-8.4":0.00091,"9.0-9.2":0.0073,"9.3":0.0228,"10.0-10.2":0.00182,"10.3":0.03284,"11.0-11.2":0.01551,"11.3-11.4":0.01368,"12.0-12.1":0.00821,"12.2-12.5":0.1496,"13.0-13.1":0.00365,"13.2":0.01551,"13.3":0.00912,"13.4-13.7":0.02645,"14.0-14.4":0.07024,"14.5-14.8":0.11402,"15.0-15.1":0.0447,"15.2-15.3":0.05473,"15.4":0.06112,"15.5":0.08575,"15.6-15.7":0.45062,"16.0":0.21163,"16.1":0.42417,"16.2":0.20342,"16.3":0.3813,"16.4":0.07845,"16.5":0.20251,"16.6-16.7":3.43258,"17.0":1.02804,"17.1":1.72678,"17.2":0.04926},P:{"4":0.06326,"20":0.02109,"21":0.02109,"22":0.05272,"23":0.41122,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 11.1-11.2 12.0 14.0 15.0 16.0","7.2-7.4":0.03163,"13.0":0.01054,"17.0":0.04218,"18.0":0.01054,"19.0":0.01054},I:{"0":0.0395,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00012},K:{"0":0.66688,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00258,"11":0.00773,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.84153},H:{"0":0},L:{"0":68.43393},R:{_:"0"},M:{"0":0.04763},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NR.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NR.js
    index ba7610d5812062..10d1330c2c88ce 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NR.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NR.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0.00813,"117":0,"118":0.03793,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.05418,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.00813,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.06773,"110":0,"111":0.02167,"112":0,"113":0,"114":0.01625,"115":0.07585,"116":3.84949,"117":0.47678,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.00813,"71":0,"72":0.0298,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.01625,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0.02167,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.0298,"116":0.83979,"117":0.37113},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0.40906,"15.1":0,"15.2-15.3":0.0298,"15.4":0,"15.5":0.01625,"15.6":0,"16.0":0,"16.1":0.01625,"16.2":0,"16.3":0.00813,"16.4":0.17338,"16.5":0,"16.6":0.0596,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0.03281,"13.0-13.1":0,"13.2":0,"13.3":0.10095,"13.4-13.7":0.03281,"14.0-14.4":0.06814,"14.5-14.8":0,"15.0-15.1":0.03281,"15.2-15.3":1.28212,"15.4":0.20191,"15.5":0.13629,"15.6-15.7":1.01459,"16.0":0.13629,"16.1":0.5401,"16.2":0.23724,"16.3":1.2165,"16.4":0.60825,"16.5":0.40634,"16.6":18.81785,"17.0":0.20191,"17.1":0},P:{"4":0,"20":0.06069,"21":0.11127,"22":1.04193,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.11127,"12.0":0,"13.0":0,"14.0":0,"15.0":0.06069,"16.0":0.34394,"17.0":0,"18.0":0,"19.0":0.20232},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":63.99801},R:{_:"0"},M:{"0":0.02916},Q:{"13.1":0},O:{"0":0.28435},H:{"0":1.0492}};
    +module.exports={C:{_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 3.5 3.6"},D:{"109":0.06593,"117":0.2335,"118":4.54629,"119":15.2953,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 111 112 113 114 115 116 120 121 122"},F:{_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"113":0.09889,"114":0.03296,"117":0.09889,"118":0.5961,"119":4.31279,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 115 116"},E:{"14":0.03296,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 14.1 15.1 15.2-15.3 15.4 15.5 15.6 16.0 16.1 16.3 16.4 16.5 16.6 17.1 17.2","13.1":0.16482,"16.2":0.03296,"17.0":0.16482},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00055,"5.0-5.1":0.00055,"6.0-6.1":0.00137,"7.0-7.1":0.00191,"8.1-8.4":0.00027,"9.0-9.2":0.00219,"9.3":0.00684,"10.0-10.2":0.00055,"10.3":0.00984,"11.0-11.2":0.00465,"11.3-11.4":0.0041,"12.0-12.1":0.00246,"12.2-12.5":0.04484,"13.0-13.1":0.00109,"13.2":0.00465,"13.3":0.00273,"13.4-13.7":0.00793,"14.0-14.4":0.02105,"14.5-14.8":0.03418,"15.0-15.1":0.0134,"15.2-15.3":0.01641,"15.4":0.01832,"15.5":0.0257,"15.6-15.7":0.13508,"16.0":0.06344,"16.1":0.12715,"16.2":0.06098,"16.3":0.1143,"16.4":0.02352,"16.5":0.0607,"16.6-16.7":1.02895,"17.0":0.30816,"17.1":0.51762,"17.2":0.01477},P:{"21":0.07309,"22":0.13574,"23":0.97109,_:"4 20 5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 15.0 17.0","14.0":0.24016,"16.0":0.03133,"18.0":0.20884,"19.0":0.76225},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{"0":0.62376,_:"10 11 12 11.1 11.5 12.1"},A:{_:"6 7 8 9 10 11 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.27561},H:{"0":0},L:{"0":67.29289},R:{_:"0"},M:{"0":0.86311},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NU.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NU.js
    index d67a70f9491b36..4144321f6f5e09 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NU.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NU.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0.06096,"118":0.00572,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0.02731,"117":0.02731,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0.00572},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0,"16.0":0,"16.1":0,"16.2":0.02731,"16.3":0.02223,"16.4":0.0108,"16.5":0.01651,"16.6":0.18733,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0,"14.0-14.4":0,"14.5-14.8":0,"15.0-15.1":0,"15.2-15.3":0.09003,"15.4":0,"15.5":0,"15.6-15.7":0.09003,"16.0":0.18606,"16.1":0.92431,"16.2":0.18606,"16.3":49.75658,"16.4":0,"16.5":0.27609,"16.6":8.04868,"17.0":0.37212,"17.1":0},P:{"4":0,"20":0,"21":0,"22":0,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0,"17.0":0,"18.0":0,"19.0":0},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":38.93062},R:{_:"0"},M:{"0":0.69301},Q:{"13.1":0},O:{"0":0},H:{"0":0}};
    +module.exports={C:{_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 3.5 3.6"},D:{"119":0.30719,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 120 121 122"},F:{_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119"},E:{_:"0 4 5 6 7 8 9 10 11 12 13 14 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 13.1 14.1 15.1 15.4 15.5 16.1 17.2","15.2-15.3":0.15179,"15.6":0.2313,"16.0":5.51135,"16.2":0.69027,"16.3":1.30104,"16.4":0.07589,"16.5":0.38308,"16.6":11.10221,"17.0":8.42423,"17.1":6.816},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00713,"5.0-5.1":0.00713,"6.0-6.1":0.01782,"7.0-7.1":0.02495,"8.1-8.4":0.00356,"9.0-9.2":0.02851,"9.3":0.0891,"10.0-10.2":0.00713,"10.3":0.1283,"11.0-11.2":0.06059,"11.3-11.4":0.05346,"12.0-12.1":0.03208,"12.2-12.5":0.5845,"13.0-13.1":0.01426,"13.2":0.06059,"13.3":0.03564,"13.4-13.7":0.10336,"14.0-14.4":0.27443,"14.5-14.8":0.4455,"15.0-15.1":0.17464,"15.2-15.3":0.21384,"15.4":0.23879,"15.5":0.33502,"15.6-15.7":1.76063,"16.0":0.82685,"16.1":1.65727,"16.2":0.79478,"16.3":1.48976,"16.4":0.30651,"16.5":0.79121,"16.6-16.7":13.41143,"17.0":4.01666,"17.1":6.7467,"17.2":0.19246},P:{_:"4 20 21 22 23 5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0"},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{"0":0,_:"10 11 12 11.1 11.5 12.1"},A:{_:"6 7 8 9 10 11 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{_:"0"},H:{"0":0},L:{"0":28.21973},R:{_:"0"},M:{_:"0"},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NZ.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NZ.js
    index d496056b5e66d9..96df954fefd528 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NZ.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/NZ.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.25281,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00538,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.01076,"49":0,"50":0,"51":0,"52":0.01076,"53":0,"54":0.00538,"55":0,"56":0,"57":0,"58":0,"59":0.01614,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.02152,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00538,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0.00538,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.03227,"103":0,"104":0.00538,"105":0,"106":0,"107":0,"108":0.00538,"109":0.00538,"110":0.00538,"111":0,"112":0.00538,"113":0.01076,"114":0.00538,"115":0.13985,"116":0.09144,"117":1.14035,"118":0.11296,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.00538,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.01076,"35":0,"36":0,"37":0,"38":0.05917,"39":0.01076,"40":0.01076,"41":0.01076,"42":0.01076,"43":0.01076,"44":0.01076,"45":0.01076,"46":0.01076,"47":0.00538,"48":0.01076,"49":0.03765,"50":0.00538,"51":0.01076,"52":0.01614,"53":0.01076,"54":0.01076,"55":0.01076,"56":0.01076,"57":0.00538,"58":0.01076,"59":0.02152,"60":0.01076,"61":0.00538,"62":0,"63":0,"64":0,"65":0.00538,"66":0.07531,"67":0,"68":0.00538,"69":0,"70":0.00538,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0.00538,"77":0,"78":0.00538,"79":0.05379,"80":0.00538,"81":0,"83":0.00538,"84":0,"85":0.00538,"86":0.00538,"87":0.0269,"88":0.04303,"89":0.01614,"90":0.04303,"91":0,"92":0.00538,"93":0.03227,"94":0.01076,"95":0.00538,"96":0.01076,"97":0.00538,"98":0.01076,"99":0.0269,"100":0,"101":0.01076,"102":0.00538,"103":0.16675,"104":0.01614,"105":0.01076,"106":0.01076,"107":0.04303,"108":0.03765,"109":0.50563,"110":0.03227,"111":0.04303,"112":0.04841,"113":0.12372,"114":0.47873,"115":0.64548,"116":11.49492,"117":2.84011,"118":0.01076,"119":0.00538,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00538,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.01076,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.01076,"73":0,"74":0,"75":0,"76":0,"77":0.03765,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01076,"96":0,"97":0,"98":0,"99":0.00538,"100":0.07531,"101":0.16675,"102":0.22054,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00538,"18":0.00538,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00538,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.00538,"104":0,"105":0.00538,"106":0,"107":0,"108":0.00538,"109":0.03765,"110":0,"111":0.00538,"112":0.00538,"113":0.01614,"114":0.03227,"115":0.08606,"116":1.97947,"117":1.42544},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.0269,"14":0.07531,"15":0.01076,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0.01614,"12.1":0.0269,"13.1":0.11834,"14.1":0.17213,"15.1":0.02152,"15.2-15.3":0.01614,"15.4":0.03765,"15.5":0.08606,"15.6":0.44108,"16.0":0.03765,"16.1":0.13448,"16.2":0.10758,"16.3":0.22592,"16.4":0.08069,"16.5":0.26895,"16.6":2.16236,"17.0":0.07531,"17.1":0},G:{"8":0.01414,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0.01696,"7.0-7.1":0.00283,"8.1-8.4":0.00283,"9.0-9.2":0,"9.3":0.07917,"10.0-10.2":0.00283,"10.3":0.16964,"11.0-11.2":0.25729,"11.3-11.4":0.14137,"12.0-12.1":0.01696,"12.2-12.5":0.69554,"13.0-13.1":0,"13.2":0,"13.3":0.03676,"13.4-13.7":0.03958,"14.0-14.4":0.14985,"14.5-14.8":0.32515,"15.0-15.1":0.13854,"15.2-15.3":0.14137,"15.4":0.16116,"15.5":0.21206,"15.6-15.7":1.88588,"16.0":0.62768,"16.1":1.50418,"16.2":0.66727,"16.3":1.35998,"16.4":0.17813,"16.5":0.557,"16.6":17.4027,"17.0":1.13945,"17.1":0.00565},P:{"4":0.17786,"20":0.06277,"21":0.14647,"22":2.43772,"5.0-5.4":0.02092,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01046,"12.0":0,"13.0":0.01046,"14.0":0.01046,"15.0":0.01046,"16.0":0.02092,"17.0":0.02092,"18.0":0.01046,"19.0":0.03139},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.02441,"4.2-4.3":0.01221,"4.4":0,"4.4.3-4.4.4":0.06103},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01703,"9":0,"10":0,"11":0.08517,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":38.21258},R:{_:"0"},M:{"0":0.40203},Q:{"13.1":0.00924},O:{"0":0.06932},H:{"0":0.23624}};
    +module.exports={C:{"34":0.00537,"37":0.01074,"48":0.00537,"52":0.02685,"54":0.00537,"59":0.03221,"78":0.05906,"88":0.01611,"90":0.00537,"102":0.00537,"105":0.00537,"109":0.01074,"110":0.00537,"113":0.02148,"114":0.00537,"115":0.28993,"116":0.01074,"117":0.02148,"118":0.05906,"119":1.71808,"120":0.45637,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 38 39 40 41 42 43 44 45 46 47 49 50 51 53 55 56 57 58 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 91 92 93 94 95 96 97 98 99 100 101 103 104 106 107 108 111 112 121 122 123 3.5 3.6"},D:{"34":0.02148,"38":0.08054,"39":0.04832,"40":0.04832,"41":0.04832,"42":0.04832,"43":0.04832,"44":0.04832,"45":0.04832,"46":0.04832,"47":0.04832,"48":0.04832,"49":0.09664,"50":0.04832,"51":0.04832,"52":0.05906,"53":0.05369,"54":0.04832,"55":0.04832,"56":0.04832,"57":0.04832,"58":0.04832,"59":0.06443,"60":0.04832,"61":0.00537,"63":0.00537,"65":0.01074,"66":0.16107,"67":0.00537,"69":0.00537,"73":0.00537,"74":0.00537,"76":0.00537,"78":0.00537,"79":0.10201,"80":0.00537,"81":0.00537,"83":0.01074,"85":0.00537,"86":0.00537,"87":0.04832,"88":0.01611,"89":0.01611,"90":0.08054,"91":0.00537,"92":0.01074,"93":0.07517,"94":0.03221,"95":0.00537,"96":0.00537,"97":0.0698,"98":0.01611,"99":0.03758,"100":0.01074,"101":0.00537,"102":0.01074,"103":0.2953,"104":0.02148,"105":0.01074,"106":0.02685,"107":0.07517,"108":0.09127,"109":0.8483,"110":0.03221,"111":0.0698,"112":0.05369,"113":0.09127,"114":0.19865,"115":0.12886,"116":0.75166,"117":0.86441,"118":7.10856,"119":21.15386,"120":0.02148,"121":0.02148,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 62 64 68 70 71 72 75 77 84 122"},F:{"28":0.00537,"45":0.00537,"46":0.03221,"79":0.00537,"95":0.03758,"102":0.41341,"103":0.0698,"104":0.36509,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"17":0.01611,"18":0.00537,"92":0.00537,"103":0.00537,"105":0.01074,"107":0.01074,"108":0.01074,"109":0.04832,"110":0.01074,"111":0.01074,"112":0.00537,"113":0.03221,"114":0.02148,"115":0.01611,"116":0.02685,"117":0.1557,"118":1.09528,"119":5.41195,_:"12 13 14 15 16 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 104 106"},E:{"12":0.00537,"13":0.03221,"14":0.11275,"15":0.01611,_:"0 4 5 6 7 8 9 10 11 3.1 3.2 5.1 6.1 7.1 9.1 10.1","11.1":0.03221,"12.1":0.03221,"13.1":0.23087,"14.1":0.30603,"15.1":0.04295,"15.2-15.3":0.04295,"15.4":0.06443,"15.5":0.14496,"15.6":0.8322,"16.0":0.07517,"16.1":0.23624,"16.2":0.19865,"16.3":0.35435,"16.4":0.13423,"16.5":0.3812,"16.6":2.85631,"17.0":0.53153,"17.1":1.30467,"17.2":0.01611},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00355,"5.0-5.1":0.00355,"6.0-6.1":0.00886,"7.0-7.1":0.01241,"8.1-8.4":0.00177,"9.0-9.2":0.01418,"9.3":0.04432,"10.0-10.2":0.00355,"10.3":0.06382,"11.0-11.2":0.03014,"11.3-11.4":0.02659,"12.0-12.1":0.01595,"12.2-12.5":0.29073,"13.0-13.1":0.00709,"13.2":0.03014,"13.3":0.01773,"13.4-13.7":0.05141,"14.0-14.4":0.1365,"14.5-14.8":0.22159,"15.0-15.1":0.08686,"15.2-15.3":0.10636,"15.4":0.11877,"15.5":0.16664,"15.6-15.7":0.87574,"16.0":0.41128,"16.1":0.82433,"16.2":0.39532,"16.3":0.74101,"16.4":0.15246,"16.5":0.39355,"16.6-16.7":6.67085,"17.0":1.99789,"17.1":3.35581,"17.2":0.09573},P:{"4":0.18698,"20":0.033,"21":0.10999,"22":0.19798,"23":2.4087,"5.0-5.4":0.022,"6.2-6.4":0.011,_:"7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0","13.0":0.011,"14.0":0.011,"15.0":0.011,"16.0":0.022,"17.0":0.011,"18.0":0.011,"19.0":0.033},I:{"0":0.03686,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00011},K:{"0":0.24544,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.01904,"9":0.01904,"11":0.17132,_:"6 7 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.05094},H:{"0":0},L:{"0":24.87858},R:{_:"0"},M:{"0":0.48626},Q:{"13.1":0.00926}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/OM.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/OM.js
    index fa2a403e2b8688..d0a52ef3e66ef6 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/OM.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/OM.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.01413,"116":0.00565,"117":0.09608,"118":0.00565,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00283,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00283,"49":0.00283,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00283,"57":0,"58":0.01413,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00283,"65":0.00283,"66":0,"67":0,"68":0,"69":0.00283,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0.00283,"77":0,"78":0,"79":0.0113,"80":0.00283,"81":0.00565,"83":0.00565,"84":0,"85":0.00283,"86":0.00283,"87":0.00848,"88":0.00565,"89":0.00283,"90":0.00283,"91":0.00565,"92":0,"93":0.0113,"94":0,"95":0.00848,"96":0.00283,"97":0.00283,"98":0.00565,"99":0.03109,"100":0.00283,"101":0.00283,"102":0.00283,"103":0.05087,"104":0.00283,"105":0.00565,"106":0.00848,"107":0.00565,"108":0.00848,"109":0.47477,"110":0.00283,"111":0.00565,"112":0.0113,"113":0.01978,"114":0.04239,"115":0.07065,"116":4.08922,"117":0.86193,"118":0.00848,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00283,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.02543,"73":0.00565,"74":0,"75":0,"76":0,"77":0.02261,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00283,"96":0,"97":0,"98":0,"99":0,"100":0.00848,"101":0.03391,"102":0.03956,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00283,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00283,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.00283,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.01696,"110":0,"111":0.00283,"112":0.00283,"113":0.00565,"114":0.00848,"115":0.01978,"116":0.42955,"117":0.29108},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00848,"15":0.00283,_:"0","3.1":0,"3.2":0,"5.1":0.00283,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00848,"14.1":0.01413,"15.1":0.00283,"15.2-15.3":0.00283,"15.4":0.00565,"15.5":0.00848,"15.6":0.03391,"16.0":0.00283,"16.1":0.01413,"16.2":0.0113,"16.3":0.02826,"16.4":0.0113,"16.5":0.02543,"16.6":0.20065,"17.0":0.01978,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00853,"6.0-6.1":0,"7.0-7.1":0.03839,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.07466,"10.0-10.2":0,"10.3":0.03839,"11.0-11.2":0.00427,"11.3-11.4":0,"12.0-12.1":0.00853,"12.2-12.5":0.33915,"13.0-13.1":0.00427,"13.2":0.0064,"13.3":0.02133,"13.4-13.7":0.04479,"14.0-14.4":0.16424,"14.5-14.8":0.26023,"15.0-15.1":0.10025,"15.2-15.3":0.11305,"15.4":0.14505,"15.5":0.28156,"15.6-15.7":1.89628,"16.0":0.66124,"16.1":0.88735,"16.2":0.5162,"16.3":1.03239,"16.4":0.31782,"16.5":1.05586,"16.6":11.88745,"17.0":1.13691,"17.1":0},P:{"4":0.11233,"20":0.09191,"21":0.21446,"22":2.69601,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.10212,"8.2":0,"9.2":0.01021,"10.1":0,"11.1-11.2":0.06127,"12.0":0.02042,"13.0":0.07149,"14.0":0.04085,"15.0":0.04085,"16.0":0.06127,"17.0":0.05106,"18.0":0.05106,"19.0":0.10212},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.02231,"4.4":0,"4.4.3-4.4.4":0.14725},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01978,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":64.38712},R:{_:"0"},M:{"0":0.07174},Q:{"13.1":0},O:{"0":1.09045},H:{"0":0.54335}};
    +module.exports={C:{"34":0.00295,"66":0.0059,"94":0.00295,"107":0.00295,"110":0.0059,"115":0.07378,"117":0.00295,"118":0.0118,"119":0.32166,"120":0.08558,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 95 96 97 98 99 100 101 102 103 104 105 106 108 109 111 112 113 114 116 121 122 123 3.5 3.6"},D:{"11":0.00295,"38":0.0059,"49":0.00885,"53":0.00295,"56":0.00295,"58":0.10624,"59":0.00295,"63":0.00295,"64":0.00295,"65":0.00295,"68":0.0059,"69":0.0059,"70":0.00295,"71":0.00295,"72":0.00295,"73":0.0059,"74":0.00295,"75":0.00295,"76":0.0059,"79":0.05017,"80":0.00295,"81":0.00295,"83":0.01771,"85":0.00885,"86":0.0118,"87":0.02951,"88":0.00885,"89":0.01476,"90":0.00295,"91":0.01771,"93":0.05017,"94":0.00295,"95":0.00885,"96":0.0059,"97":0.00295,"98":0.01476,"99":0.05902,"100":0.0059,"101":0.0059,"102":0.0059,"103":0.18886,"104":0.00295,"105":0.0059,"106":0.01476,"107":0.01476,"108":0.01771,"109":1.91815,"110":0.00295,"111":0.04722,"112":0.01476,"113":0.01771,"114":0.04427,"115":0.04131,"116":0.1387,"117":0.17706,"118":3.72711,"119":15.38947,"120":0.04427,"121":0.01476,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 47 48 50 51 52 54 55 57 60 61 62 66 67 77 78 84 92 122"},F:{"28":0.0059,"46":0.01771,"95":0.00885,"96":0.00295,"102":0.12689,"103":0.04131,"104":0.20657,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.00885,"84":0.00295,"92":0.0059,"94":0.00295,"99":0.0059,"100":0.00295,"101":0.00295,"103":0.00295,"108":0.0059,"109":0.06492,"110":0.01771,"111":0.00295,"112":0.00295,"113":0.00295,"114":0.00885,"115":0.01476,"116":0.01771,"117":0.04722,"118":0.56659,"119":2.4936,_:"12 13 14 15 16 17 79 80 81 83 85 86 87 88 89 90 91 93 95 96 97 98 102 104 105 106 107"},E:{"13":0.00295,"14":0.03246,"15":0.0059,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 6.1 7.1 9.1 10.1 11.1","5.1":0.02951,"12.1":0.0059,"13.1":0.02951,"14.1":0.03836,"15.1":0.0059,"15.2-15.3":0.0059,"15.4":0.02361,"15.5":0.03246,"15.6":0.12394,"16.0":0.01476,"16.1":0.05017,"16.2":0.04427,"16.3":0.09148,"16.4":0.03836,"16.5":0.08853,"16.6":0.4397,"17.0":0.17411,"17.1":0.19477,"17.2":0.0059},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00308,"5.0-5.1":0.00308,"6.0-6.1":0.0077,"7.0-7.1":0.01078,"8.1-8.4":0.00154,"9.0-9.2":0.01232,"9.3":0.03851,"10.0-10.2":0.00308,"10.3":0.05545,"11.0-11.2":0.02618,"11.3-11.4":0.0231,"12.0-12.1":0.01386,"12.2-12.5":0.25259,"13.0-13.1":0.00616,"13.2":0.02618,"13.3":0.0154,"13.4-13.7":0.04467,"14.0-14.4":0.1186,"14.5-14.8":0.19253,"15.0-15.1":0.07547,"15.2-15.3":0.09241,"15.4":0.10319,"15.5":0.14478,"15.6-15.7":0.76086,"16.0":0.35733,"16.1":0.7162,"16.2":0.34347,"16.3":0.64381,"16.4":0.13246,"16.5":0.34193,"16.6-16.7":5.7958,"17.0":1.73581,"17.1":2.91561,"17.2":0.08317},P:{"4":0.09346,"20":0.05192,"21":0.14539,"22":0.30116,"23":2.52352,_:"5.0-5.4 6.2-6.4 8.2 10.1","7.2-7.4":0.12462,"9.2":0.01038,"11.1-11.2":0.06231,"12.0":0.01038,"13.0":0.06231,"14.0":0.04154,"15.0":0.06231,"16.0":0.05192,"17.0":0.03115,"18.0":0.04154,"19.0":0.07269},I:{"0":0.08417,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00025},K:{"0":0.50753,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.04427,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":1.26177},H:{"0":0},L:{"0":50.60898},R:{_:"0"},M:{"0":0.05639},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PA.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PA.js
    index bc6b5e0fe9611e..c5701a37bd3e99 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PA.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PA.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00402,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0.0201,"74":0,"75":0,"76":0,"77":0,"78":0.00402,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0.01206,"98":0.01608,"99":0,"100":0,"101":0,"102":0.00804,"103":0,"104":0.00402,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0.00402,"111":0,"112":0,"113":0.0201,"114":0.0201,"115":0.09246,"116":0.02814,"117":0.3819,"118":0.03618,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0.00402,"42":0,"43":0.00402,"44":0.00402,"45":0.00402,"46":0,"47":0,"48":0,"49":0.00402,"50":0,"51":0,"52":0,"53":0,"54":0.00402,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.01608,"69":0.00402,"70":0.00402,"71":0,"72":0,"73":0.01206,"74":0.00804,"75":0.00804,"76":0.00804,"77":0.00402,"78":0.00402,"79":0.03216,"80":0.02412,"81":0.00804,"83":0.00804,"84":0.00402,"85":0.00402,"86":0.00402,"87":0.01608,"88":0.00804,"89":0.01206,"90":0.00402,"91":0.04422,"92":0,"93":0.0201,"94":0.00402,"95":0.00402,"96":0.00804,"97":0.00402,"98":0.00804,"99":0.01608,"100":0,"101":0.00402,"102":0.00402,"103":0.04422,"104":0.00402,"105":0.00402,"106":0.00804,"107":0.05226,"108":0.01206,"109":0.41004,"110":0.00804,"111":0.01206,"112":0.0402,"113":0.03618,"114":0.1206,"115":0.18492,"116":6.8139,"117":1.96578,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.01206,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.01206,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.00402,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.01206,"73":0,"74":0,"75":0,"76":0,"77":0.01206,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00402,"96":0,"97":0,"98":0.00402,"99":0.01206,"100":0.11658,"101":0.29748,"102":0.32562,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00402,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00402,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.02814,"110":0,"111":0.00402,"112":0.00804,"113":0.00804,"114":0.02412,"115":0.03618,"116":1.01706,"117":0.804},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00402,"10":0,"11":0,"12":0.00804,"13":0,"14":0.01206,"15":0.00402,_:"0","3.1":0,"3.2":0,"5.1":0.00402,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00402,"13.1":0.0201,"14.1":0.1005,"15.1":0.00402,"15.2-15.3":0.00804,"15.4":0.00804,"15.5":0.00804,"15.6":0.10854,"16.0":0.00804,"16.1":0.03216,"16.2":0.03216,"16.3":0.0603,"16.4":0.1005,"16.5":0.0603,"16.6":0.3819,"17.0":0.03216,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00653,"6.0-6.1":0.01795,"7.0-7.1":0.0457,"8.1-8.4":0.00979,"9.0-9.2":0,"9.3":0.02122,"10.0-10.2":0,"10.3":0.03917,"11.0-11.2":0.02774,"11.3-11.4":0.00326,"12.0-12.1":0.00653,"12.2-12.5":0.16483,"13.0-13.1":0.02122,"13.2":0,"13.3":0.03427,"13.4-13.7":0.06365,"14.0-14.4":0.06528,"14.5-14.8":0.1991,"15.0-15.1":0.05059,"15.2-15.3":0.06365,"15.4":0.06365,"15.5":0.0816,"15.6-15.7":1.30396,"16.0":0.38352,"16.1":0.70502,"16.2":0.42595,"16.3":0.72787,"16.4":0.15014,"16.5":0.47165,"16.6":9.64346,"17.0":1.22073,"17.1":0},P:{"4":0.14303,"20":0.13281,"21":0.31671,"22":3.32032,"5.0-5.4":0.01022,"6.2-6.4":0,"7.2-7.4":0.34736,"8.2":0,"9.2":0.02043,"10.1":0,"11.1-11.2":0.05108,"12.0":0.01022,"13.0":0.02043,"14.0":0.01022,"15.0":0.02043,"16.0":0.0613,"17.0":0.08173,"18.0":0.02043,"19.0":0.13281},I:{"0":0,"3":0,"4":0.01911,"2.1":0,"2.2":0.01274,"2.3":0.01911,"4.1":0.01911,"4.2-4.3":0.05096,"4.4":0,"4.4.3-4.4.4":0.15926},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.019,"9":0.00475,"10":0.00475,"11":0.02375,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0.01196,"11":0},L:{"0":60.91766},R:{_:"0"},M:{"0":0.22724},Q:{"13.1":0.01196},O:{"0":0.19734},H:{"0":0.3227}};
    +module.exports={C:{"40":0.00399,"52":0.00399,"78":0.00798,"80":0.01197,"88":0.00399,"97":0.00798,"102":0.00399,"104":0.00399,"108":0.00399,"113":0.00399,"114":0.0359,"115":0.13563,"116":0.00399,"117":0.00399,"118":0.63425,"119":0.80977,"120":0.25131,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 81 82 83 84 85 86 87 89 90 91 92 93 94 95 96 98 99 100 101 103 105 106 107 109 110 111 112 121 122 123 3.5 3.6"},D:{"29":0.00399,"34":0.00798,"36":0.00798,"38":0.00399,"39":0.00399,"40":0.00399,"41":0.00399,"42":0.00399,"43":0.00399,"44":0.00798,"45":0.00399,"46":0.00399,"47":0.00399,"49":0.00399,"51":0.00399,"53":0.00399,"54":0.00399,"56":0.00399,"60":0.00399,"62":0.00399,"65":0.00399,"69":0.00798,"70":0.00399,"72":0.00399,"73":0.00798,"74":0.01995,"75":0.01197,"76":0.01197,"77":0.00399,"78":0.00399,"79":0.11967,"80":0.03191,"81":0.00798,"83":0.03191,"84":0.00399,"85":0.00399,"86":0.00399,"87":0.04787,"88":0.01995,"89":0.03191,"90":0.00399,"91":0.05186,"92":0.01995,"93":0.05984,"94":0.00798,"95":0.00798,"96":0.00399,"97":0.00798,"98":0.01197,"99":0.01596,"100":0.00399,"101":0.01197,"102":0.00798,"103":0.11568,"104":0.00798,"105":0.01995,"106":0.02792,"107":0.05984,"108":0.01197,"109":0.84168,"110":0.01995,"111":0.01197,"112":0.0359,"113":0.02792,"114":0.13962,"115":0.07978,"116":0.33508,"117":0.70206,"118":4.69904,"119":18.66453,"120":0.00399,"121":0.00399,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 30 31 32 33 35 37 48 50 52 55 57 58 59 61 63 64 66 67 68 71 122"},F:{"28":0.01197,"46":0.00399,"95":0.01995,"101":0.00798,"102":1.17277,"103":0.12765,"104":1.0172,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00399,"14":0.00399,"16":0.00399,"18":0.01596,"92":0.00798,"100":0.00399,"101":0.00399,"106":0.00399,"107":0.00399,"109":0.03989,"111":0.00399,"112":0.00798,"113":0.01197,"114":0.01197,"115":0.02792,"116":0.02393,"117":0.1077,"118":0.84567,"119":4.22834,_:"13 15 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 102 103 104 105 108 110"},E:{"9":0.00798,"12":0.01596,"14":0.01995,"15":0.00399,_:"0 4 5 6 7 8 10 11 13 3.1 3.2 6.1 7.1 9.1 10.1 11.1","5.1":0.00798,"12.1":0.00399,"13.1":0.04787,"14.1":0.15956,"15.1":0.01596,"15.2-15.3":0.01197,"15.4":0.01995,"15.5":0.01995,"15.6":0.19945,"16.0":0.02792,"16.1":0.05186,"16.2":0.04787,"16.3":0.17153,"16.4":0.13164,"16.5":0.09574,"16.6":0.70605,"17.0":0.21142,"17.1":0.35103,"17.2":0.01596},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00206,"5.0-5.1":0.00206,"6.0-6.1":0.00514,"7.0-7.1":0.0072,"8.1-8.4":0.00103,"9.0-9.2":0.00822,"9.3":0.0257,"10.0-10.2":0.00206,"10.3":0.037,"11.0-11.2":0.01747,"11.3-11.4":0.01542,"12.0-12.1":0.00925,"12.2-12.5":0.16857,"13.0-13.1":0.00411,"13.2":0.01747,"13.3":0.01028,"13.4-13.7":0.02981,"14.0-14.4":0.07915,"14.5-14.8":0.12849,"15.0-15.1":0.05037,"15.2-15.3":0.06167,"15.4":0.06887,"15.5":0.09662,"15.6-15.7":0.50777,"16.0":0.23847,"16.1":0.47796,"16.2":0.22922,"16.3":0.42965,"16.4":0.0884,"16.5":0.22819,"16.6-16.7":3.86792,"17.0":1.15842,"17.1":1.94578,"17.2":0.05551},P:{"4":0.14457,"20":0.10327,"21":0.16523,"22":0.43372,"23":2.24087,"5.0-5.4":0.02065,_:"6.2-6.4 8.2 10.1","7.2-7.4":0.26849,"9.2":0.01033,"11.1-11.2":0.03098,"12.0":0.01033,"13.0":0.02065,"14.0":0.02065,"15.0":0.01033,"16.0":0.04131,"17.0":0.04131,"18.0":0.01033,"19.0":0.05163},I:{"0":0.10168,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00007,"4.4":0,"4.4.3-4.4.4":0.00031},K:{"0":0.26651,_:"10 11 12 11.1 11.5 12.1"},A:{"7":0.00419,"8":0.03351,"9":0.00838,"10":0.00838,"11":0.02513,_:"6 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.09017},H:{"0":0.01},L:{"0":46.158},R:{_:"0"},M:{"0":0.23443},Q:{"13.1":0.03006}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PE.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PE.js
    index bb6da300ac5403..49d6046c39d3a5 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PE.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PE.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00552,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00552,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.01104,"69":0.00552,"70":0,"71":0,"72":0,"73":0,"74":0.00552,"75":0.00552,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00552,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0.00552,"98":0,"99":0,"100":0,"101":0,"102":0.00552,"103":0,"104":0.00552,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0.00552,"111":0,"112":0,"113":0,"114":0.00552,"115":0.07173,"116":0.04966,"117":0.50214,"118":0.05518,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.02207,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.01104,"50":0,"51":0.00552,"52":0,"53":0.01655,"54":0,"55":0,"56":0,"57":0,"58":0.00552,"59":0,"60":0,"61":0,"62":0.01104,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.01655,"69":0.00552,"70":0.00552,"71":0,"72":0,"73":0.00552,"74":0.01104,"75":0.01104,"76":0,"77":0.00552,"78":0.00552,"79":0.17658,"80":0.01655,"81":0.01655,"83":0.00552,"84":0.01104,"85":0.00552,"86":0.01655,"87":0.03311,"88":0.02207,"89":0.01655,"90":0.00552,"91":0.04966,"92":0.01104,"93":0.01104,"94":0.01104,"95":0.02207,"96":0.02207,"97":0.01104,"98":0.01104,"99":0.02759,"100":0.01104,"101":0.01104,"102":0.01104,"103":0.03863,"104":0.01655,"105":0.02207,"106":0.03863,"107":0.02759,"108":0.03863,"109":1.74921,"110":0.02207,"111":0.03863,"112":0.06622,"113":0.07173,"114":0.22072,"115":0.35315,"116":16.65884,"117":4.39785,"118":0.00552,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00552,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00552,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.01104,"73":0.00552,"74":0.00552,"75":0,"76":0,"77":0.01104,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.03863,"96":0,"97":0,"98":0,"99":0.01104,"100":0.29797,"101":0.56284,"102":0.68423,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00552,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0.00552,"88":0,"89":0,"90":0,"91":0,"92":0.00552,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00552,"109":0.02759,"110":0.00552,"111":0.00552,"112":0.00552,"113":0.00552,"114":0.02207,"115":0.03863,"116":1.00428,"117":0.80011},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.01104,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00552,"6.1":0,"7.1":0,"9.1":0.01655,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00552,"14.1":0.01655,"15.1":0.00552,"15.2-15.3":0,"15.4":0.00552,"15.5":0.01104,"15.6":0.03311,"16.0":0.00552,"16.1":0.01655,"16.2":0.00552,"16.3":0.02759,"16.4":0.01104,"16.5":0.04414,"16.6":0.13795,"17.0":0.01655,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00425,"6.0-6.1":0.00061,"7.0-7.1":0.00243,"8.1-8.4":0.00243,"9.0-9.2":0.00121,"9.3":0.01032,"10.0-10.2":0,"10.3":0.01032,"11.0-11.2":0.00971,"11.3-11.4":0.00182,"12.0-12.1":0.00303,"12.2-12.5":0.105,"13.0-13.1":0.00364,"13.2":0.00182,"13.3":0.02731,"13.4-13.7":0.01882,"14.0-14.4":0.02671,"14.5-14.8":0.07769,"15.0-15.1":0.02003,"15.2-15.3":0.02913,"15.4":0.03763,"15.5":0.0789,"15.6-15.7":0.46978,"16.0":0.19605,"16.1":0.30226,"16.2":0.18998,"16.3":0.37935,"16.4":0.05463,"16.5":0.23004,"16.6":3.24478,"17.0":0.47767,"17.1":0},P:{"4":0.22417,"20":0.04076,"21":0.07133,"22":0.70308,"5.0-5.4":0.02038,"6.2-6.4":0.01019,"7.2-7.4":0.06114,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01019,"12.0":0,"13.0":0.04076,"14.0":0.02038,"15.0":0.01019,"16.0":0.03057,"17.0":0.02038,"18.0":0.01019,"19.0":0.03057},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.01121,"4.2-4.3":0.00672,"4.4":0,"4.4.3-4.4.4":0.09414},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00828,"9":0,"10":0,"11":0.02483,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":61.84398},R:{_:"0"},M:{"0":0.0986},Q:{"13.1":0},O:{"0":0.02689},H:{"0":0.20792}};
    +module.exports={C:{"45":0.0109,"52":0.00545,"68":0.00545,"80":0.00545,"88":0.0109,"97":0.00545,"100":0.00545,"105":0.00545,"111":0.00545,"112":0.00545,"114":0.00545,"115":0.14173,"116":0.00545,"117":0.00545,"118":0.04906,"119":0.68683,"120":0.22894,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 78 79 81 82 83 84 85 86 87 89 90 91 92 93 94 95 96 98 99 101 102 103 104 106 107 108 109 110 113 121 122 123 3.5 3.6"},D:{"38":0.02726,"39":0.00545,"41":0.01635,"47":0.00545,"49":0.0218,"53":0.0109,"54":0.00545,"58":0.01635,"62":0.00545,"67":0.00545,"70":0.00545,"73":0.00545,"74":0.00545,"77":0.00545,"79":0.31616,"80":0.00545,"81":0.01635,"83":0.00545,"84":0.0109,"85":0.00545,"86":0.00545,"87":0.06541,"88":0.0218,"89":0.00545,"90":0.00545,"91":0.07086,"92":0.0109,"93":0.03816,"94":0.0218,"95":0.01635,"96":0.03816,"97":0.0218,"98":0.04906,"99":0.0218,"100":0.0109,"101":0.01635,"102":0.0109,"103":0.07631,"104":0.0218,"105":0.07086,"106":0.03816,"107":0.03271,"108":0.05451,"109":2.85632,"110":0.03816,"111":0.06541,"112":0.05451,"113":0.03816,"114":0.11447,"115":0.07631,"116":0.2889,"117":0.44153,"118":6.50304,"119":32.92949,"120":0.01635,"121":0.00545,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 40 42 43 44 45 46 48 50 51 52 55 56 57 59 60 61 63 64 65 66 68 69 71 72 75 76 78 122"},F:{"28":0.00545,"36":0.00545,"83":0.00545,"95":0.04906,"102":1.28644,"103":0.14173,"104":1.18832,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00545,"18":0.00545,"92":0.0109,"106":0.00545,"109":0.03816,"110":0.00545,"111":0.00545,"112":0.00545,"113":0.00545,"114":0.03271,"115":0.01635,"116":0.03816,"117":0.04906,"118":0.55055,"119":3.12887,_:"13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 107 108"},E:{"14":0.03271,"15":0.00545,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 6.1 7.1 9.1 10.1 11.1 12.1 15.2-15.3","5.1":0.00545,"13.1":0.0109,"14.1":0.05996,"15.1":0.0109,"15.4":0.02726,"15.5":0.0109,"15.6":0.07631,"16.0":0.0109,"16.1":0.04361,"16.2":0.01635,"16.3":0.03816,"16.4":0.01635,"16.5":0.02726,"16.6":0.14718,"17.0":0.27255,"17.1":0.11447,"17.2":0.01635},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00068,"5.0-5.1":0.00068,"6.0-6.1":0.0017,"7.0-7.1":0.00238,"8.1-8.4":0.00034,"9.0-9.2":0.00272,"9.3":0.00851,"10.0-10.2":0.00068,"10.3":0.01225,"11.0-11.2":0.00578,"11.3-11.4":0.0051,"12.0-12.1":0.00306,"12.2-12.5":0.0558,"13.0-13.1":0.00136,"13.2":0.00578,"13.3":0.0034,"13.4-13.7":0.00987,"14.0-14.4":0.0262,"14.5-14.8":0.04253,"15.0-15.1":0.01667,"15.2-15.3":0.02042,"15.4":0.0228,"15.5":0.03198,"15.6-15.7":0.16809,"16.0":0.07894,"16.1":0.15822,"16.2":0.07588,"16.3":0.14223,"16.4":0.02926,"16.5":0.07554,"16.6-16.7":1.28042,"17.0":0.38348,"17.1":0.64412,"17.2":0.01837},P:{"4":0.22496,"20":0.02045,"21":0.05113,"22":0.12271,"23":0.55218,"5.0-5.4":0.02045,"6.2-6.4":0.01023,"7.2-7.4":0.05113,_:"8.2 9.2 10.1 12.0","11.1-11.2":0.01023,"13.0":0.0409,"14.0":0.01023,"15.0":0.01023,"16.0":0.02045,"17.0":0.02045,"18.0":0.01023,"19.0":0.02045},I:{"0":0.04526,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00014},K:{"0":0.18196,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00545,"11":0.02726,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.02275},H:{"0":0},L:{"0":41.06269},R:{_:"0"},M:{"0":0.07733},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PF.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PF.js
    index d9531271da58ee..a52da2233ca770 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PF.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PF.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.00482,"64":0,"65":0,"66":0,"67":0.00482,"68":0.00482,"69":0,"70":0,"71":0.00482,"72":0.00963,"73":0,"74":0,"75":0.03372,"76":0,"77":0,"78":0.04335,"79":0,"80":0,"81":0,"82":0.00482,"83":0.00482,"84":0.13488,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.10597,"92":0,"93":0,"94":0.01445,"95":0,"96":0,"97":0,"98":0,"99":0.00963,"100":0,"101":0,"102":0.10116,"103":0,"104":0,"105":0.00482,"106":0,"107":0.01445,"108":0,"109":0,"110":0,"111":0,"112":0.00482,"113":0.00482,"114":0.00963,"115":0.34682,"116":0.1686,"117":2.06168,"118":0.24085,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0.00482,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0.02409,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0.00963,"72":0,"73":0,"74":0,"75":0.00482,"76":0.00482,"77":0,"78":0,"79":0.04817,"80":0.00482,"81":0.03854,"83":0,"84":0,"85":0.08671,"86":0.00482,"87":0.07707,"88":0.00482,"89":0,"90":0,"91":0.00482,"92":0.01927,"93":0.10597,"94":0.00482,"95":0,"96":0,"97":0,"98":0.00482,"99":0.00482,"100":0,"101":0.00482,"102":0.08189,"103":0.13969,"104":0.08189,"105":0.00963,"106":0.00482,"107":0.00482,"108":0.13488,"109":0.36609,"110":0.00482,"111":0.00482,"112":0.15896,"113":0.04335,"114":0.08671,"115":0.1686,"116":5.70815,"117":1.7293,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00482,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00482,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0.00482,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.01927,"73":0.00482,"74":0,"75":0,"76":0,"77":0.03372,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.00482,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00963,"96":0,"97":0,"98":0,"99":0.00482,"100":0.12524,"101":0.21677,"102":0.20713,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0.00482,"16":0,"17":0,"18":0.00963,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.01445,"91":0,"92":0.00482,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0.00482,"99":0.00482,"100":0,"101":0,"102":0.00482,"103":0,"104":0,"105":0,"106":0.00482,"107":0.00482,"108":0.00482,"109":0.05299,"110":0.00482,"111":0,"112":0.01927,"113":0.00963,"114":0.06744,"115":0.03854,"116":2.72161,"117":1.1609},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00963,"14":0.07226,"15":0.01445,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0.00482,"12.1":0.03854,"13.1":0.20713,"14.1":0.12043,"15.1":0.02409,"15.2-15.3":0.03854,"15.4":0.01927,"15.5":0.13969,"15.6":0.95377,"16.0":0.03372,"16.1":0.10597,"16.2":0.05299,"16.3":0.26494,"16.4":0.06262,"16.5":0.21195,"16.6":1.88826,"17.0":0.10116,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00599,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0.003,"9.0-9.2":0,"9.3":0.07491,"10.0-10.2":0.00599,"10.3":0.05694,"11.0-11.2":0,"11.3-11.4":0.03896,"12.0-12.1":0.003,"12.2-12.5":0.54238,"13.0-13.1":0.003,"13.2":0,"13.3":0.39555,"13.4-13.7":0.01498,"14.0-14.4":0.05694,"14.5-14.8":0.15882,"15.0-15.1":0.38356,"15.2-15.3":6.61049,"15.4":0.1798,"15.5":0.21575,"15.6-15.7":1.6721,"16.0":0.86002,"16.1":1.27056,"16.2":0.63528,"16.3":1.94479,"16.4":0.24872,"16.5":0.91696,"16.6":12.66661,"17.0":0.63228,"17.1":0},P:{"4":0.03092,"20":0.07214,"21":0.3607,"22":3.60696,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.1752,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01031,"12.0":0,"13.0":0,"14.0":0.02061,"15.0":0.02061,"16.0":0.02061,"17.0":0.02061,"18.0":0.03092,"19.0":0.05153},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.02141,"4.4":0,"4.4.3-4.4.4":0.1142},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.04335,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":40.64268},R:{_:"0"},M:{"0":0.51312},Q:{"13.1":0},O:{"0":0.07775},H:{"0":0.17174}};
    +module.exports={C:{"52":0.00467,"60":0.00467,"63":0.00467,"67":0.03266,"68":0.04199,"72":0.03266,"75":0.14931,"78":0.08399,"82":0.00933,"88":0.00467,"89":0.00467,"91":0.08399,"94":0.00467,"99":0.00933,"101":0.00467,"102":0.04666,"104":0.00467,"105":0.014,"108":0.02333,"110":0.04199,"111":0.00467,"112":0.00933,"113":0.01866,"114":0.00467,"115":0.80255,"116":0.01866,"117":0.014,"118":0.11198,"119":2.73894,"120":0.86788,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 61 62 64 65 66 69 70 71 73 74 76 77 79 80 81 83 84 85 86 87 90 92 93 95 96 97 98 100 103 106 107 109 121 122 123 3.5 3.6"},D:{"41":0.03733,"49":0.014,"53":0.00467,"56":0.00467,"58":0.00467,"65":0.00467,"67":0.02333,"70":0.00467,"71":0.03733,"74":0.00467,"76":0.03733,"77":0.00467,"79":0.19597,"80":0.00467,"81":0.16798,"84":0.00467,"85":0.34528,"86":0.00467,"87":0.40128,"91":0.00467,"92":0.028,"93":0.02333,"94":0.01866,"95":0.00467,"96":0.00467,"98":0.02333,"101":0.02333,"102":0.014,"103":0.2053,"104":0.00467,"105":0.00933,"106":0.06999,"107":0.00467,"108":0.31729,"109":0.64391,"110":0.00467,"111":0.05133,"112":0.00467,"113":0.08865,"114":0.01866,"115":0.09799,"116":0.38728,"117":0.47127,"118":2.94425,"119":12.78017,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 42 43 44 45 46 47 48 50 51 52 54 55 57 59 60 61 62 63 64 66 68 69 72 73 75 78 83 88 89 90 97 99 100 120 121 122"},F:{"28":0.00467,"65":0.028,"89":0.00467,"95":0.00933,"102":0.17264,"103":0.05599,"104":0.36861,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"16":0.00467,"18":0.03733,"84":0.00467,"90":0.00933,"92":0.00467,"98":0.00467,"103":0.00467,"106":0.00933,"109":0.06999,"110":0.00933,"112":0.00467,"113":0.00467,"114":0.00933,"115":0.01866,"116":0.00467,"117":0.02333,"118":0.83521,"119":4.25539,_:"12 13 14 15 17 79 80 81 83 85 86 87 88 89 91 93 94 95 96 97 99 100 101 102 104 105 107 108 111"},E:{"13":0.00933,"14":0.29862,"15":0.01866,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 5.1 6.1 7.1 10.1","9.1":0.00467,"11.1":0.00467,"12.1":0.07932,"13.1":0.2193,"14.1":0.36395,"15.1":0.06066,"15.2-15.3":0.08865,"15.4":0.04199,"15.5":0.07932,"15.6":0.97053,"16.0":0.16798,"16.1":0.29396,"16.2":0.14465,"16.3":0.79322,"16.4":0.33129,"16.5":0.54126,"16.6":3.28953,"17.0":3.68147,"17.1":1.66576,"17.2":0.01866},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00399,"5.0-5.1":0.00399,"6.0-6.1":0.00998,"7.0-7.1":0.01397,"8.1-8.4":0.002,"9.0-9.2":0.01596,"9.3":0.04989,"10.0-10.2":0.00399,"10.3":0.07184,"11.0-11.2":0.03392,"11.3-11.4":0.02993,"12.0-12.1":0.01796,"12.2-12.5":0.32725,"13.0-13.1":0.00798,"13.2":0.03392,"13.3":0.01995,"13.4-13.7":0.05787,"14.0-14.4":0.15365,"14.5-14.8":0.24943,"15.0-15.1":0.09778,"15.2-15.3":0.11973,"15.4":0.1337,"15.5":0.18757,"15.6-15.7":0.98575,"16.0":0.46294,"16.1":0.92788,"16.2":0.44499,"16.3":0.8341,"16.4":0.17161,"16.5":0.44299,"16.6-16.7":7.50888,"17.0":2.24887,"17.1":3.77739,"17.2":0.10775},P:{"4":0.02117,"20":0.02117,"21":0.8151,"22":0.63515,"23":2.98518,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 12.0","7.2-7.4":0.09527,"11.1-11.2":0.01059,"13.0":0.01059,"14.0":0.01059,"15.0":0.01059,"16.0":0.02117,"17.0":0.05293,"18.0":0.04234,"19.0":0.0741},I:{"0":0.02123,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00006},K:{"0":0.2987,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.03266,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.17602},H:{"0":0},L:{"0":29.82846},R:{_:"0"},M:{"0":0.35738},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PG.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PG.js
    index a1198ea14bacfe..5a918841917ddb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PG.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PG.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00331,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.00331,"90":0,"91":0,"92":0,"93":0,"94":0.00331,"95":0,"96":0,"97":0.00663,"98":0.00331,"99":0.00331,"100":0.00331,"101":0,"102":0.00331,"103":0.00663,"104":0,"105":0.00331,"106":0,"107":0.00331,"108":0,"109":0.00331,"110":0.00331,"111":0.00331,"112":0,"113":0.00663,"114":0.00331,"115":0.04638,"116":0.03313,"117":0.3578,"118":0.01657,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00663,"41":0,"42":0,"43":0.00331,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0.00331,"51":0,"52":0,"53":0,"54":0,"55":0.00331,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00331,"65":0.00331,"66":0,"67":0.00331,"68":0.00331,"69":0.00994,"70":0.01325,"71":0.00331,"72":0,"73":0.00331,"74":0.00331,"75":0,"76":0,"77":0,"78":0.00331,"79":0.02982,"80":0.00331,"81":0.00663,"83":0.00331,"84":0.00331,"85":0,"86":0,"87":0.00994,"88":0.0497,"89":0.00331,"90":0.00663,"91":0,"92":0.00331,"93":0.00331,"94":0.00331,"95":0.00663,"96":0.00331,"97":0,"98":0,"99":0.02319,"100":0.00331,"101":0.00331,"102":0.00331,"103":0.05963,"104":0.00331,"105":0.01325,"106":0.00663,"107":0.00994,"108":0.01325,"109":0.38431,"110":0.00994,"111":0.00994,"112":0.02319,"113":0.03313,"114":0.04307,"115":0.09276,"116":3.0082,"117":0.57646,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00663,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0.00663,"62":0,"63":0,"64":0.00331,"65":0.00663,"66":0.00331,"67":0,"68":0,"69":0.00994,"70":0.00663,"71":0.01325,"72":0.12921,"73":0.02319,"74":0,"75":0,"76":0.00663,"77":0.07951,"78":0.00663,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00994,"96":0,"97":0,"98":0,"99":0,"100":0.00331,"101":0.0762,"102":0.04638,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00331},B:{"12":0.00994,"13":0.00331,"14":0.00331,"15":0,"16":0.00994,"17":0.00331,"18":0.02319,"79":0,"80":0.00331,"81":0,"83":0,"84":0.01988,"85":0.00994,"86":0,"87":0,"88":0,"89":0.00663,"90":0.01657,"91":0,"92":0.02319,"93":0,"94":0,"95":0.00663,"96":0.00331,"97":0,"98":0,"99":0,"100":0.00663,"101":0,"102":0.00331,"103":0.00331,"104":0,"105":0.00331,"106":0.00331,"107":0.0265,"108":0,"109":0.00994,"110":0.00663,"111":0.00663,"112":0.01325,"113":0.04307,"114":0.05963,"115":0.06626,"116":0.68248,"117":0.46051},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00331,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00331,"14.1":0.00663,"15.1":0,"15.2-15.3":0.00663,"15.4":0,"15.5":0.00331,"15.6":0.00663,"16.0":0,"16.1":0,"16.2":0.00331,"16.3":0.00331,"16.4":0.00331,"16.5":0.00994,"16.6":0.06626,"17.0":0.00994,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0.00107,"7.0-7.1":0,"8.1-8.4":0.00645,"9.0-9.2":0.01343,"9.3":0.06689,"10.0-10.2":0,"10.3":0.02042,"11.0-11.2":0.00806,"11.3-11.4":0.0094,"12.0-12.1":0.00698,"12.2-12.5":0.08247,"13.0-13.1":0.00484,"13.2":0.00134,"13.3":0.00833,"13.4-13.7":0.01424,"14.0-14.4":0.0325,"14.5-14.8":0.03761,"15.0-15.1":0.06178,"15.2-15.3":0.03949,"15.4":0.05802,"15.5":0.15016,"15.6-15.7":0.20415,"16.0":0.10825,"16.1":0.09321,"16.2":0.08381,"16.3":0.10933,"16.4":0.08784,"16.5":0.2525,"16.6":1.02263,"17.0":0.07897,"17.1":0},P:{"4":0.09158,"20":0.20352,"21":0.67161,"22":1.86218,"5.0-5.4":0,"6.2-6.4":0.02035,"7.2-7.4":0.32563,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.09158,"12.0":0,"13.0":0.0407,"14.0":0.0407,"15.0":0.0407,"16.0":0.20352,"17.0":0.0407,"18.0":0.19334,"19.0":0.37651},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.01092,"4.2-4.3":0.01819,"4.4":0,"4.4.3-4.4.4":0.32746},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0.00331,"11":0.00994,"5.5":0},S:{"2.5":0.02006,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":79.7703},R:{_:"0"},M:{"0":0.10031},Q:{"13.1":0.00669},O:{"0":1.40427},H:{"0":1.58904}};
    +module.exports={C:{"60":0.00305,"72":0.00609,"76":0.00305,"80":0.00305,"84":0.00305,"92":0.00609,"97":0.01218,"98":0.00914,"99":0.00305,"103":0.00305,"105":0.00305,"109":0.00305,"110":0.00914,"111":0.00609,"112":0.00914,"113":0.00914,"114":0.00609,"115":0.0944,"117":0.12485,"118":0.04568,"119":0.74603,"120":0.22533,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 61 62 63 64 65 66 67 68 69 70 71 73 74 75 77 78 79 81 82 83 85 86 87 88 89 90 91 93 94 95 96 100 101 102 104 106 107 108 116 121 122 123 3.5 3.6"},D:{"11":0.00914,"37":0.00305,"38":0.00305,"43":0.00305,"49":0.01827,"55":0.00609,"60":0.00305,"64":0.00609,"65":0.00609,"67":0.00914,"68":0.00305,"69":0.03045,"70":0.0609,"71":0.00305,"74":0.00305,"76":0.00305,"78":0.00609,"79":0.00609,"80":0.01218,"81":0.0335,"83":0.00609,"84":0.00609,"85":0.00305,"86":0.00305,"87":0.00609,"88":0.14007,"89":0.00914,"90":0.01218,"91":0.00305,"92":0.00914,"93":0.00609,"94":0.00914,"96":0.00609,"97":0.00609,"98":0.00305,"99":0.05481,"100":0.00609,"101":0.00609,"102":0.01827,"103":0.17661,"104":0.00305,"105":0.08222,"106":0.02741,"107":0.01218,"108":0.01523,"109":0.94395,"110":0.00914,"111":0.00914,"112":0.04568,"113":0.02132,"114":0.05481,"115":0.0335,"116":0.13398,"117":0.26492,"118":1.74479,"119":6.68378,"121":0.00305,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 39 40 41 42 44 45 46 47 48 50 51 52 53 54 56 57 58 59 61 62 63 66 72 73 75 77 95 120 122"},F:{"68":0.00305,"74":0.00609,"77":0.00305,"78":0.00305,"79":0.00609,"95":0.02741,"97":0.00305,"100":0.00305,"101":0.00305,"102":0.04263,"103":0.08526,"104":0.1827,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 69 70 71 72 73 75 76 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 98 99 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.02741,"13":0.00914,"14":0.01523,"15":0.00609,"16":0.01523,"17":0.09744,"18":0.07004,"80":0.00305,"84":0.03045,"85":0.01218,"89":0.01827,"90":0.01827,"92":0.07004,"94":0.00305,"96":0.00305,"98":0.00305,"99":0.00305,"100":0.02436,"101":0.00609,"103":0.00305,"106":0.00305,"107":0.01827,"108":0.00305,"109":0.03045,"110":0.00609,"111":0.00609,"112":0.01523,"113":0.01218,"114":0.03959,"115":0.07613,"116":0.06699,"117":0.12789,"118":0.609,"119":2.45427,_:"79 81 83 86 87 88 91 93 95 97 102 104 105"},E:{"13":0.00305,"14":0.00305,_:"0 4 5 6 7 8 9 10 11 12 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 17.2","13.1":0.01218,"14.1":0.02436,"15.1":0.00305,"15.2-15.3":0.00305,"15.4":0.00609,"15.5":0.00305,"15.6":0.09135,"16.0":0.00609,"16.1":0.00609,"16.2":0.00305,"16.3":0.01523,"16.4":0.00609,"16.5":0.00914,"16.6":0.06699,"17.0":0.02436,"17.1":0.11571},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00034,"5.0-5.1":0.00034,"6.0-6.1":0.00085,"7.0-7.1":0.00119,"8.1-8.4":0.00017,"9.0-9.2":0.00136,"9.3":0.00424,"10.0-10.2":0.00034,"10.3":0.00611,"11.0-11.2":0.00288,"11.3-11.4":0.00255,"12.0-12.1":0.00153,"12.2-12.5":0.02783,"13.0-13.1":0.00068,"13.2":0.00288,"13.3":0.0017,"13.4-13.7":0.00492,"14.0-14.4":0.01307,"14.5-14.8":0.02121,"15.0-15.1":0.00831,"15.2-15.3":0.01018,"15.4":0.01137,"15.5":0.01595,"15.6-15.7":0.08382,"16.0":0.03937,"16.1":0.0789,"16.2":0.03784,"16.3":0.07093,"16.4":0.01459,"16.5":0.03767,"16.6-16.7":0.6385,"17.0":0.19123,"17.1":0.3212,"17.2":0.00916},P:{"4":0.07167,"20":0.12286,"21":0.40954,"22":0.99312,"23":1.02384,_:"5.0-5.4 6.2-6.4 8.2 12.0","7.2-7.4":0.16381,"9.2":0.03072,"10.1":0.01024,"11.1-11.2":0.06143,"13.0":0.03072,"14.0":0.02048,"15.0":0.02048,"16.0":0.16381,"17.0":0.05119,"18.0":0.09215,"19.0":0.24572},I:{"0":0.16606,"3":0.00002,"4":0.00003,"2.1":0,"2.2":0.00003,"2.3":0,"4.1":0.00002,"4.2-4.3":0.00012,"4.4":0,"4.4.3-4.4.4":0.0005},K:{"0":1.25954,_:"10 11 12 11.1 11.5 12.1"},A:{"9":0.00325,"10":0.00325,"11":0.04222,_:"6 7 8 5.5"},N:{_:"10 11"},S:{"2.5":0.02782,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":1.07092},H:{"0":0.02},L:{"0":74.60394},R:{_:"0"},M:{"0":0.21557},Q:{"13.1":0.00695}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PH.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PH.js
    index 992d1ddf10a647..3852d1034c3358 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PH.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PH.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.02261,"57":0,"58":0,"59":0.00565,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00565,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.03391,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0.00565,"114":0,"115":0.06217,"116":0.02826,"117":0.47477,"118":0.02826,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00565,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00565,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.03391,"67":0.00565,"68":0.00565,"69":0.00565,"70":0.00565,"71":0,"72":0,"73":0.00565,"74":0,"75":0.00565,"76":0.00565,"77":0,"78":0.0113,"79":0.03391,"80":0.00565,"81":0.00565,"83":0.01696,"84":0.00565,"85":0.00565,"86":0.0113,"87":0.13,"88":0.01696,"89":0.00565,"90":0.0113,"91":0.01696,"92":0.01696,"93":0.10174,"94":0.0113,"95":0.00565,"96":0.0113,"97":0.0113,"98":0.0113,"99":0.05652,"100":0.00565,"101":0.00565,"102":0.02261,"103":0.25999,"104":0.0113,"105":0.02826,"106":0.01696,"107":0.03391,"108":0.04522,"109":1.36778,"110":0.03391,"111":0.03956,"112":0.11869,"113":0.09043,"114":0.25999,"115":0.45781,"116":17.63424,"117":3.59467,"118":0.02826,"119":0.01696,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.0113,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00565,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00565,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.00565,"68":0,"69":0.0113,"70":0.00565,"71":0.00565,"72":0.04522,"73":0.0113,"74":0.0113,"75":0,"76":0,"77":0.01696,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00565,"96":0,"97":0,"98":0,"99":0,"100":0.12434,"101":0.23738,"102":0.25999,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00565,"18":0.00565,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00565,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00565,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00565,"108":0.00565,"109":0.02826,"110":0.00565,"111":0.00565,"112":0.00565,"113":0.0113,"114":0.02826,"115":0.06217,"116":2.1195,"117":1.47517},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00565,"14":0.00565,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00565,"10.1":0,"11.1":0.00565,"12.1":0,"13.1":0.00565,"14.1":0.02261,"15.1":0.0113,"15.2-15.3":0.00565,"15.4":0.00565,"15.5":0.0113,"15.6":0.05652,"16.0":0.00565,"16.1":0.02261,"16.2":0.01696,"16.3":0.03956,"16.4":0.01696,"16.5":0.04522,"16.6":0.29956,"17.0":0.02826,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00601,"6.0-6.1":0,"7.0-7.1":0.01287,"8.1-8.4":0,"9.0-9.2":0.00515,"9.3":0.10726,"10.0-10.2":0.00172,"10.3":0.05063,"11.0-11.2":0.01287,"11.3-11.4":0.03347,"12.0-12.1":0.00686,"12.2-12.5":0.27889,"13.0-13.1":0.00172,"13.2":0.00343,"13.3":0.0103,"13.4-13.7":0.02746,"14.0-14.4":0.07637,"14.5-14.8":0.13558,"15.0-15.1":0.04376,"15.2-15.3":0.05235,"15.4":0.07466,"15.5":0.10812,"15.6-15.7":0.94908,"16.0":0.30978,"16.1":0.42563,"16.2":0.23169,"16.3":0.43335,"16.4":0.13644,"16.5":0.38615,"16.6":4.07005,"17.0":0.50715,"17.1":0.00086},P:{"4":0.15839,"20":0.02112,"21":0.04224,"22":0.60189,"5.0-5.4":0.01056,"6.2-6.4":0.01056,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0.01056,"14.0":0,"15.0":0,"16.0":0,"17.0":0.01056,"18.0":0.01056,"19.0":0.01056},I:{"0":0,"3":0,"4":0.042,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.108},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.13,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":57.3395},R:{_:"0"},M:{"0":0.07826},Q:{"13.1":0.00435},O:{"0":0.39132},H:{"0":0.40341}};
    +module.exports={C:{"52":0.00446,"56":0.08918,"59":0.00892,"88":0.00446,"98":0.00446,"107":0.00446,"111":0.00446,"113":0.00446,"114":0.00446,"115":0.10702,"116":0.00446,"117":0.00892,"118":0.0223,"119":0.46374,"120":0.12485,"121":0.00446,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 57 58 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 89 90 91 92 93 94 95 96 97 99 100 101 102 103 104 105 106 108 109 110 112 122 123 3.5 3.6"},D:{"38":0.00446,"41":0.00446,"49":0.02675,"56":0.00446,"58":0.00446,"64":0.00446,"65":0.00446,"66":0.04905,"67":0.00446,"69":0.00446,"70":0.00446,"71":0.00446,"72":0.00446,"73":0.00446,"74":0.00446,"75":0.02675,"76":0.01338,"77":0.00446,"78":0.01338,"79":0.05351,"80":0.00446,"81":0.00892,"83":0.03567,"84":0.00446,"85":0.00892,"86":0.00892,"87":0.12931,"88":0.01784,"89":0.01784,"90":0.00446,"91":0.04459,"92":0.00892,"93":0.21403,"94":0.0223,"95":0.00892,"96":0.0223,"97":0.01338,"98":0.01784,"99":0.05797,"100":0.00892,"101":0.01338,"102":0.02675,"103":0.43698,"104":0.04459,"105":0.05351,"106":0.02675,"107":0.04013,"108":0.05351,"109":1.71672,"110":0.0223,"111":0.04905,"112":0.0758,"113":0.0758,"114":0.15161,"115":0.11148,"116":0.35672,"117":0.51279,"118":6.82227,"119":22.11664,"120":0.04013,"121":0.00892,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 42 43 44 45 46 47 48 50 51 52 53 54 55 57 59 60 61 62 63 68 122"},F:{"28":0.01338,"36":0.00446,"46":0.00446,"74":0.00892,"86":0.00446,"95":0.01338,"102":0.68669,"103":0.06243,"104":0.5217,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 75 76 77 78 79 80 81 82 83 84 85 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"17":0.00892,"18":0.00892,"92":0.01784,"100":0.00446,"103":0.00446,"105":0.00446,"108":0.00446,"109":0.06689,"110":0.00446,"111":0.00446,"112":0.01338,"113":0.00446,"114":0.01784,"115":0.01784,"116":0.0223,"117":0.09364,"118":1.30203,"119":4.17808,_:"12 13 14 15 16 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 101 102 104 106 107"},E:{"13":0.00446,"14":0.01338,"15":0.00446,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1","11.1":0.01338,"12.1":0.00446,"13.1":0.01338,"14.1":0.04013,"15.1":0.01784,"15.2-15.3":0.00446,"15.4":0.01338,"15.5":0.0223,"15.6":0.10256,"16.0":0.00892,"16.1":0.04013,"16.2":0.02675,"16.3":0.06689,"16.4":0.0223,"16.5":0.04459,"16.6":0.32105,"17.0":0.14269,"17.1":0.19174,"17.2":0.00446},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.0011,"5.0-5.1":0.0011,"6.0-6.1":0.00274,"7.0-7.1":0.00384,"8.1-8.4":0.00055,"9.0-9.2":0.00438,"9.3":0.0137,"10.0-10.2":0.0011,"10.3":0.01973,"11.0-11.2":0.00932,"11.3-11.4":0.00822,"12.0-12.1":0.00493,"12.2-12.5":0.08987,"13.0-13.1":0.00219,"13.2":0.00932,"13.3":0.00548,"13.4-13.7":0.01589,"14.0-14.4":0.0422,"14.5-14.8":0.0685,"15.0-15.1":0.02685,"15.2-15.3":0.03288,"15.4":0.03672,"15.5":0.05151,"15.6-15.7":0.27071,"16.0":0.12714,"16.1":0.25482,"16.2":0.12221,"16.3":0.22907,"16.4":0.04713,"16.5":0.12166,"16.6-16.7":2.06214,"17.0":0.6176,"17.1":1.03737,"17.2":0.02959},P:{"4":0.15984,"20":0.02131,"21":0.03197,"22":0.07459,"23":0.60738,"5.0-5.4":0.01066,"6.2-6.4":0.01066,_:"7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 14.0 15.0","13.0":0.01066,"16.0":0.01066,"17.0":0.01066,"18.0":0.01066,"19.0":0.01066},I:{"0":0.0827,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00025},K:{"0":0.50977,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00461,"11":0.54385,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.41558},H:{"0":0},L:{"0":48.4126},R:{_:"0"},M:{"0":0.08312},Q:{"13.1":0.00554}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PK.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PK.js
    index 9409c3b0c0c116..a3a0aff8e16fee 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PK.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PK.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00481,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.00241,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00241,"103":0.00241,"104":0,"105":0.00241,"106":0.00481,"107":0.00481,"108":0.00481,"109":0.00481,"110":0.00481,"111":0.00481,"112":0,"113":0.00241,"114":0.00241,"115":0.0409,"116":0.00722,"117":0.09624,"118":0.00962,"119":0,"120":0,"3.5":0,"3.6":0.00241},D:{"4":0.00481,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00241,"44":0,"45":0,"46":0,"47":0,"48":0.00241,"49":0.00241,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00241,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00241,"65":0,"66":0.00241,"67":0,"68":0.00481,"69":0.00241,"70":0.00241,"71":0.00241,"72":0.00241,"73":0.00241,"74":0.00481,"75":0.00241,"76":0.00481,"77":0.00241,"78":0.00481,"79":0.00481,"80":0.00722,"81":0.00722,"83":0.00241,"84":0.00481,"85":0.10586,"86":0.00962,"87":0.00481,"88":0.00241,"89":0.00481,"90":0.00241,"91":0.00481,"92":0.00241,"93":0.00722,"94":0,"95":0.00481,"96":0.00241,"97":0.00481,"98":0.00241,"99":0.00241,"100":0.00241,"101":0.00241,"102":0.00481,"103":0.02165,"104":0.00481,"105":0.01925,"106":0.0409,"107":0.05293,"108":0.06015,"109":0.78195,"110":0.03609,"111":0.03609,"112":0.03609,"113":0.00962,"114":0.03368,"115":0.06015,"116":2.40841,"117":0.64721,"118":0.00481,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00241,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.01684,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0.00241,"62":0,"63":0.00241,"64":0,"65":0,"66":0,"67":0.00241,"68":0,"69":0.00722,"70":0.00481,"71":0.01203,"72":0.12271,"73":0.03609,"74":0,"75":0,"76":0,"77":0.01203,"78":0.00241,"79":0.00241,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.00241,"92":0.00241,"93":0.00241,"94":0.00241,"95":0.01444,"96":0,"97":0,"98":0,"99":0,"100":0.00722,"101":0.04812,"102":0.04812,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00241,"13":0,"14":0,"15":0.00241,"16":0,"17":0,"18":0.00481,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00481,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0.00241,"107":0.00962,"108":0.00962,"109":0.01203,"110":0.00722,"111":0.00241,"112":0.00241,"113":0.00241,"114":0.00241,"115":0.00481,"116":0.12992,"117":0.08902},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00241,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00241,"6.1":0,"7.1":0,"9.1":0.00481,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00241,"14.1":0.00481,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.00241,"15.6":0.00962,"16.0":0,"16.1":0.00481,"16.2":0.00241,"16.3":0.00481,"16.4":0.00241,"16.5":0.00481,"16.6":0.02406,"17.0":0.00241,"17.1":0},G:{"8":0,"3.2":0.00092,"4.0-4.1":0,"4.2-4.3":0.00046,"5.0-5.1":0.00415,"6.0-6.1":0,"7.0-7.1":0.06506,"8.1-8.4":0.00092,"9.0-9.2":0.00369,"9.3":0.06321,"10.0-10.2":0.00092,"10.3":0.04199,"11.0-11.2":0.006,"11.3-11.4":0.00554,"12.0-12.1":0.00508,"12.2-12.5":0.22239,"13.0-13.1":0.00138,"13.2":0.00277,"13.3":0.17902,"13.4-13.7":0.01523,"14.0-14.4":0.0669,"14.5-14.8":0.07059,"15.0-15.1":0.02814,"15.2-15.3":0.02538,"15.4":0.02584,"15.5":0.04891,"15.6-15.7":0.7756,"16.0":0.12873,"16.1":0.23808,"16.2":0.09597,"16.3":0.19794,"16.4":0.07751,"16.5":0.17994,"16.6":1.7136,"17.0":0.26484,"17.1":0},P:{"4":0.14295,"20":0.04084,"21":0.09189,"22":0.71473,"5.0-5.4":0.01021,"6.2-6.4":0.02042,"7.2-7.4":0.02042,"8.2":0,"9.2":0.01021,"10.1":0,"11.1-11.2":0.01021,"12.0":0,"13.0":0.02042,"14.0":0,"15.0":0,"16.0":0.02042,"17.0":0.06126,"18.0":0.02042,"19.0":0.03063},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.01315,"4.4":0,"4.4.3-4.4.4":0.13812},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00241,"9":0,"10":0,"11":0.02647,"5.5":0},S:{"2.5":0.07594,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":81.63853},R:{_:"0"},M:{"0":0.06075},Q:{"13.1":0},O:{"0":3.85016},H:{"0":1.40195}};
    +module.exports={C:{"44":0.00269,"52":0.01343,"65":0.00269,"68":0.00269,"72":0.00269,"86":0.00269,"88":0.00269,"91":0.00269,"95":0.00269,"99":0.00269,"100":0.00269,"102":0.00537,"103":0.00269,"104":0.00269,"105":0.01343,"106":0.01612,"107":0.01612,"108":0.0188,"109":0.0188,"110":0.0188,"111":0.01343,"112":0.00269,"113":0.00537,"114":0.00269,"115":0.17996,"116":0.00537,"117":0.00269,"118":0.01343,"119":1.02874,"120":0.48079,"121":0.00269,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 66 67 69 70 71 73 74 75 76 77 78 79 80 81 82 83 84 85 87 89 90 92 93 94 96 97 98 101 122 123 3.5 3.6"},D:{"29":0.00269,"38":0.00269,"41":0.00537,"43":0.00269,"47":0.00269,"48":0.00806,"49":0.00806,"50":0.00269,"55":0.00269,"56":0.01612,"58":0.00269,"60":0.00269,"62":0.00269,"63":0.00537,"64":0.00537,"65":0.00537,"66":0.00806,"67":0.00269,"68":0.02149,"69":0.00537,"70":0.00537,"71":0.00537,"72":0.01074,"73":0.0188,"74":0.02417,"75":0.01612,"76":0.01074,"77":0.01074,"78":0.01074,"79":0.0188,"80":0.01612,"81":0.00806,"83":0.01343,"84":0.01074,"85":0.3841,"86":0.02149,"87":0.0188,"88":0.00537,"89":0.01343,"90":0.00806,"91":0.01612,"92":0.00806,"93":0.03223,"94":0.00537,"95":0.02149,"96":0.01343,"97":0.01343,"98":0.01074,"99":0.01074,"100":0.00806,"101":0.00806,"102":0.02686,"103":0.0967,"104":0.01612,"105":0.06984,"106":0.16653,"107":0.21219,"108":0.27666,"109":3.86784,"110":0.13699,"111":0.14773,"112":0.15042,"113":0.01612,"114":0.04835,"115":0.0376,"116":0.12087,"117":0.18533,"118":3.29572,"119":11.41013,"120":0.02417,"121":0.00806,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 30 31 32 33 34 35 36 37 39 40 42 44 45 46 51 52 53 54 57 59 61 122"},F:{"28":0.00537,"36":0.00269,"37":0.00269,"46":0.00269,"79":0.00806,"85":0.00537,"86":0.00269,"90":0.00269,"91":0.00806,"92":0.00537,"93":0.00806,"94":0.01074,"95":0.06984,"96":0.00269,"97":0.00269,"102":0.08327,"103":0.08595,"104":0.23368,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 87 88 89 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00806,"14":0.00269,"15":0.00269,"16":0.00537,"17":0.00537,"18":0.01612,"84":0.00269,"89":0.00269,"90":0.00269,"92":0.01612,"100":0.00269,"103":0.00537,"104":0.00269,"105":0.00269,"106":0.0188,"107":0.03492,"108":0.03492,"109":0.04835,"110":0.03223,"111":0.0188,"112":0.00537,"113":0.00269,"114":0.00537,"115":0.00537,"116":0.00537,"117":0.0188,"118":0.18265,"119":0.73596,_:"13 79 80 81 83 85 86 87 88 91 93 94 95 96 97 98 99 101 102"},E:{"13":0.00269,"14":0.00537,_:"0 4 5 6 7 8 9 10 11 12 15 3.1 3.2 6.1 7.1 10.1 11.1","5.1":0.00806,"9.1":0.00537,"12.1":0.00269,"13.1":0.01074,"14.1":0.0188,"15.1":0.00269,"15.2-15.3":0.00537,"15.4":0.00537,"15.5":0.00537,"15.6":0.04298,"16.0":0.00269,"16.1":0.01612,"16.2":0.01343,"16.3":0.01612,"16.4":0.00537,"16.5":0.01074,"16.6":0.06178,"17.0":0.03492,"17.1":0.0376,"17.2":0.00269},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00068,"5.0-5.1":0.00068,"6.0-6.1":0.00171,"7.0-7.1":0.00239,"8.1-8.4":0.00034,"9.0-9.2":0.00273,"9.3":0.00854,"10.0-10.2":0.00068,"10.3":0.0123,"11.0-11.2":0.00581,"11.3-11.4":0.00512,"12.0-12.1":0.00307,"12.2-12.5":0.05602,"13.0-13.1":0.00137,"13.2":0.00581,"13.3":0.00342,"13.4-13.7":0.00991,"14.0-14.4":0.0263,"14.5-14.8":0.0427,"15.0-15.1":0.01674,"15.2-15.3":0.0205,"15.4":0.02289,"15.5":0.03211,"15.6-15.7":0.16876,"16.0":0.07925,"16.1":0.15885,"16.2":0.07618,"16.3":0.14279,"16.4":0.02938,"16.5":0.07584,"16.6-16.7":1.28548,"17.0":0.385,"17.1":0.64667,"17.2":0.01845},P:{"4":0.17765,"20":0.03135,"21":0.05225,"22":0.1254,"23":0.6061,"5.0-5.4":0.0209,"6.2-6.4":0.01045,"7.2-7.4":0.0209,_:"8.2 10.1 12.0 14.0 15.0","9.2":0.01045,"11.1-11.2":0.01045,"13.0":0.01045,"16.0":0.0209,"17.0":0.0418,"18.0":0.01045,"19.0":0.0209},I:{"0":0.06551,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00005,"4.4":0,"4.4.3-4.4.4":0.0002},K:{"0":1.36226,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00842,"9":0.00281,"10":0.00281,"11":0.10952,_:"6 7 5.5"},N:{_:"10 11"},S:{"2.5":0.06584,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":3.46},H:{"0":0.13},L:{"0":64.75045},R:{_:"0"},M:{"0":0.05121},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PL.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PL.js
    index 087962302ecdf3..a371f3082fd888 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PL.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PL.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00385,"49":0,"50":0,"51":0,"52":0.02308,"53":0,"54":0,"55":0,"56":0.00385,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00385,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0.00385,"88":0,"89":0,"90":0,"91":0.00385,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0.00385,"99":0.00385,"100":0,"101":0,"102":0.05386,"103":0.00385,"104":0.00385,"105":0.00385,"106":0.00385,"107":0.00385,"108":0.00385,"109":0.00385,"110":0.00385,"111":0.00385,"112":0.00769,"113":0.01154,"114":0.02308,"115":0.23851,"116":0.08079,"117":1.43878,"118":0.13465,"119":0.00385,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00385,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.00385,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00385,"79":0.09618,"80":0.00385,"81":0.00385,"83":0,"84":0,"85":0.01154,"86":0.00385,"87":0.01154,"88":0.00385,"89":0.00769,"90":0.00385,"91":0.00385,"92":0.00385,"93":0.01154,"94":0,"95":0.00385,"96":0,"97":0.00385,"98":0.00385,"99":0.02693,"100":0.00385,"101":0,"102":0.00385,"103":0.01154,"104":0.11926,"105":0.00769,"106":0.01539,"107":0.01539,"108":0.02308,"109":0.42702,"110":0.01539,"111":0.01539,"112":0.01924,"113":0.02308,"114":0.09618,"115":0.09618,"116":4.97802,"117":1.65421,"118":0.00385,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00385,"70":0,"71":0,"72":0.01154,"73":0.00769,"74":0,"75":0,"76":0,"77":0.18081,"78":0.00385,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00769,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.00385,"92":0,"93":0,"94":0.00385,"95":0.06925,"96":0,"97":0,"98":0,"99":0.01154,"100":0.40778,"101":0.86942,"102":1.63882,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00385,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0.00385,"107":0.00385,"108":0.00385,"109":0.02308,"110":0.00385,"111":0,"112":0.00385,"113":0.00385,"114":0.01154,"115":0.02693,"116":0.5732,"117":0.5078},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00385,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00385,"14.1":0.01539,"15.1":0,"15.2-15.3":0,"15.4":0.00385,"15.5":0.00385,"15.6":0.02693,"16.0":0.00385,"16.1":0.01154,"16.2":0.00769,"16.3":0.02308,"16.4":0.01154,"16.5":0.03462,"16.6":0.14619,"17.0":0.01924,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.00533,"10.0-10.2":0,"10.3":0.00933,"11.0-11.2":0.00133,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0.05596,"13.0-13.1":0,"13.2":0,"13.3":0.07861,"13.4-13.7":0.00666,"14.0-14.4":0.03731,"14.5-14.8":0.08793,"15.0-15.1":0.02531,"15.2-15.3":0.03997,"15.4":0.04663,"15.5":0.09859,"15.6-15.7":0.68215,"16.0":0.32909,"16.1":0.77408,"16.2":0.33841,"16.3":0.65284,"16.4":0.0866,"16.5":0.32109,"16.6":7.92604,"17.0":1.56682,"17.1":0.00266},P:{"4":0.01009,"20":0.06052,"21":0.12105,"22":2.36042,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01009,"12.0":0,"13.0":0.01009,"14.0":0.02017,"15.0":0.01009,"16.0":0.02017,"17.0":0.02017,"18.0":0.03026,"19.0":0.04035},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.04385},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00385,"9":0,"10":0,"11":0.00769,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":63.34986},R:{_:"0"},M:{"0":0.63991},Q:{"13.1":0},O:{"0":0.04307},H:{"0":2.67962}};
    +module.exports={C:{"47":0.00308,"48":0.00924,"52":0.04619,"68":0.00308,"78":0.00924,"88":0.00924,"89":0.00308,"91":0.00308,"94":0.00308,"99":0.00308,"101":0.00308,"102":0.02155,"103":0.00308,"104":0.00308,"105":0.00308,"106":0.00308,"107":0.00308,"108":0.00616,"109":0.00308,"110":0.00616,"111":0.00616,"112":0.00616,"113":0.00924,"114":0.00616,"115":0.52343,"116":0.01232,"117":0.04619,"118":0.06158,"119":2.25075,"120":0.68046,"121":0.00308,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 90 92 93 95 96 97 98 100 122 123 3.5 3.6"},D:{"49":0.00924,"73":0.00308,"74":0.00308,"78":0.00308,"79":0.21553,"80":0.00616,"81":0.00308,"83":0.00308,"84":0.00308,"85":0.02155,"86":0.00308,"87":0.0154,"88":0.00616,"89":0.00616,"90":0.00308,"91":0.02155,"92":0.00308,"93":0.00924,"95":0.00924,"96":0.00308,"97":0.00308,"98":0.00924,"99":0.04926,"100":0.00308,"101":0.00308,"102":0.00616,"103":0.01847,"104":0.81286,"105":0.00616,"106":0.0154,"107":0.0154,"108":0.02463,"109":0.82209,"110":0.0154,"111":0.0585,"112":0.01847,"113":0.01232,"114":0.04311,"115":0.02463,"116":0.08005,"117":0.39719,"118":2.95892,"119":11.20448,"120":0.00308,"121":0.00308,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 75 76 77 94 122"},F:{"79":0.00308,"84":0.00308,"85":0.00308,"86":0.00308,"87":0.00308,"94":0.00308,"95":0.12316,"97":0.00308,"99":0.00308,"100":0.00308,"101":0.00616,"102":2.83268,"103":0.37256,"104":2.42933,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 88 89 90 91 92 93 96 98 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"92":0.00308,"107":0.00308,"108":0.00308,"109":0.04926,"110":0.00308,"112":0.00308,"113":0.00616,"114":0.00616,"115":0.00616,"116":0.00924,"117":0.04311,"118":0.31406,"119":1.70269,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 111"},E:{"14":0.01232,"15":0.00308,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.00308,"13.1":0.00924,"14.1":0.02155,"15.1":0.00308,"15.2-15.3":0.00308,"15.4":0.00616,"15.5":0.0154,"15.6":0.0585,"16.0":0.01232,"16.1":0.01847,"16.2":0.0154,"16.3":0.03387,"16.4":0.01847,"16.5":0.04003,"16.6":0.15087,"17.0":0.12008,"17.1":0.1755,"17.2":0.00616},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00151,"5.0-5.1":0.00151,"6.0-6.1":0.00377,"7.0-7.1":0.00527,"8.1-8.4":0.00075,"9.0-9.2":0.00602,"9.3":0.01883,"10.0-10.2":0.00151,"10.3":0.02711,"11.0-11.2":0.0128,"11.3-11.4":0.0113,"12.0-12.1":0.00678,"12.2-12.5":0.12349,"13.0-13.1":0.00301,"13.2":0.0128,"13.3":0.00753,"13.4-13.7":0.02184,"14.0-14.4":0.05798,"14.5-14.8":0.09413,"15.0-15.1":0.0369,"15.2-15.3":0.04518,"15.4":0.05045,"15.5":0.07078,"15.6-15.7":0.37198,"16.0":0.1747,"16.1":0.35015,"16.2":0.16792,"16.3":0.31476,"16.4":0.06476,"16.5":0.16717,"16.6-16.7":2.83356,"17.0":0.84864,"17.1":1.42544,"17.2":0.04066},P:{"4":0.01012,"20":0.06069,"21":0.10115,"22":0.32369,"23":2.32652,"5.0-5.4":0.01012,_:"6.2-6.4 7.2-7.4 8.2 10.1 12.0","9.2":0.01012,"11.1-11.2":0.01012,"13.0":0.01012,"14.0":0.02023,"15.0":0.01012,"16.0":0.03035,"17.0":0.02023,"18.0":0.03035,"19.0":0.05058},I:{"0":0.02066,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00006},K:{"0":2.42927,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00616,"11":0.01232,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.02768},H:{"0":0},L:{"0":56.37639},R:{_:"0"},M:{"0":0.49831},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PM.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PM.js
    index 4d959004ca5583..6e2a2d86193bb1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PM.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PM.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.00459,"95":0,"96":0,"97":0,"98":0,"99":0.00919,"100":0,"101":0,"102":0.01837,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.05512,"109":0,"110":0,"111":0.00919,"112":0.03674,"113":0.00459,"114":0,"115":0.04593,"116":0.04593,"117":1.0472,"118":0.09645,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0.02756,"77":0.00459,"78":0,"79":0,"80":0.00459,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0.02297,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.08727,"104":0,"105":0,"106":0,"107":0,"108":0,"109":1.17581,"110":0,"111":0.07349,"112":0.11023,"113":0,"114":0.23424,"115":0.51442,"116":3.74789,"117":0.77162,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.01837,"100":0.36744,"101":0.17453,"102":1.92906,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0.00919,"115":0,"116":0.71651,"117":0.49604},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00459,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00459,"14.1":0.07349,"15.1":0.10105,"15.2-15.3":0.43174,"15.4":0.00459,"15.5":0.01837,"15.6":0.5236,"16.0":0.02756,"16.1":0.20209,"16.2":0.15616,"16.3":0.60168,"16.4":0.1975,"16.5":1.29063,"16.6":4.05562,"17.0":0.21587,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0.04168,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":1.42754,"13.0-13.1":0,"13.2":0,"13.3":0.04168,"13.4-13.7":0,"14.0-14.4":0.0521,"14.5-14.8":0.0521,"15.0-15.1":0.3647,"15.2-15.3":0.5731,"15.4":0.01042,"15.5":0.18756,"15.6-15.7":3.56885,"16.0":0.85965,"16.1":1.71409,"16.2":1.31292,"16.3":2.35492,"16.4":0.54184,"16.5":2.12047,"16.6":33.92755,"17.0":2.3966,"17.1":0},P:{"4":0.02071,"20":0.02071,"21":0.02071,"22":1.16998,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0.02071,"13.0":0,"14.0":0,"15.0":0,"16.0":0,"17.0":0,"18.0":0.18637,"19.0":0.02071},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.47756},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":25.28864},R:{_:"0"},M:{"0":0.18384},Q:{"13.1":0},O:{"0":0},H:{"0":0.14333}};
    +module.exports={C:{"102":0.00455,"115":0.07733,"116":0.00455,"118":0.00455,"119":0.62321,"120":0.22745,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 103 104 105 106 107 108 109 110 111 112 113 114 117 121 122 123 3.5 3.6"},D:{"87":0.00455,"102":0.0091,"103":0.07733,"104":0.00455,"109":1.09176,"111":0.15467,"112":0.00455,"115":0.0091,"116":0.24565,"117":0.99168,"118":1.21458,"119":5.12217,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 83 84 85 86 88 89 90 91 92 93 94 95 96 97 98 99 100 101 105 106 107 108 110 113 114 120 121 122"},F:{"102":0.16376,"103":0.0182,"104":0.14557,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"109":0.0091,"114":0.0091,"117":0.00455,"118":0.2138,"119":1.05992,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 111 112 113 115 116"},E:{"15":0.0091,_:"0 4 5 6 7 8 9 10 11 12 13 14 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1","13.1":0.00455,"14.1":0.07278,"15.1":0.41396,"15.2-15.3":0.48674,"15.4":0.04094,"15.5":0.05459,"15.6":0.84157,"16.0":0.25474,"16.1":2.13803,"16.2":0.4549,"16.3":1.5785,"16.4":1.09176,"16.5":2.12893,"16.6":14.29751,"17.0":3.29348,"17.1":5.64531,"17.2":0.26839},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00943,"5.0-5.1":0.00943,"6.0-6.1":0.02359,"7.0-7.1":0.03302,"8.1-8.4":0.00472,"9.0-9.2":0.03774,"9.3":0.11793,"10.0-10.2":0.00943,"10.3":0.16982,"11.0-11.2":0.08019,"11.3-11.4":0.07076,"12.0-12.1":0.04246,"12.2-12.5":0.77364,"13.0-13.1":0.01887,"13.2":0.08019,"13.3":0.04717,"13.4-13.7":0.1368,"14.0-14.4":0.36323,"14.5-14.8":0.58966,"15.0-15.1":0.23115,"15.2-15.3":0.28304,"15.4":0.31606,"15.5":0.44343,"15.6-15.7":2.33034,"16.0":1.09441,"16.1":2.19354,"16.2":1.05196,"16.3":1.97183,"16.4":0.40569,"16.5":1.04724,"16.6-16.7":17.75118,"17.0":5.31639,"17.1":8.92984,"17.2":0.25473},P:{"20":0.03296,"22":0.29662,"23":0.35155,_:"4 21 5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 17.0 18.0","19.0":0.03296},I:{"0":0.00542,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.00002},K:{"0":0.01635,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.0091,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{_:"0"},H:{"0":0},L:{"0":6.42226},R:{_:"0"},M:{"0":0.14173},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PN.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PN.js
    index d784e7cbec5f84..ed490c2fd2ec05 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PN.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PN.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":32,"117":32,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0,"16.0":0,"16.1":0,"16.2":0,"16.3":0,"16.4":0,"16.5":0,"16.6":0,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0,"14.0-14.4":0,"14.5-14.8":0,"15.0-15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6-15.7":0,"16.0":0,"16.1":0,"16.2":0,"16.3":0,"16.4":0,"16.5":0,"16.6":0,"17.0":0,"17.1":0},P:{"4":0,"20":0,"21":0,"22":0,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0,"17.0":0,"18.0":0,"19.0":0},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":36},R:{_:"0"},M:{"0":0},Q:{"13.1":0},O:{"0":0},H:{"0":0}};
    +module.exports={C:{_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 3.5 3.6"},D:{_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122"},F:{_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119"},E:{_:"0 4 5 6 7 8 9 10 11 12 13 14 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 13.1 14.1 15.1 15.2-15.3 15.4 15.5 15.6 16.0 16.1 16.2 16.3 16.4 16.5 16.6 17.0 17.1 17.2"},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0,"14.0-14.4":0,"14.5-14.8":0,"15.0-15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6-15.7":0,"16.0":0,"16.1":0,"16.2":0,"16.3":0,"16.4":0,"16.5":0,"16.6-16.7":0,"17.0":0,"17.1":0,"17.2":0},P:{_:"4 20 21 22 23 5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0"},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{"0":0,_:"10 11 12 11.1 11.5 12.1"},A:{_:"6 7 8 9 10 11 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{_:"0"},H:{"0":0},L:{_:"0"},R:{_:"0"},M:{_:"0"},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PR.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PR.js
    index f2d8d8001007fc..06939cdd368ef0 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PR.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PR.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00398,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0.01991,"74":0,"75":0,"76":0,"77":0,"78":0.00398,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00398,"103":0,"104":0.01991,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0.00398,"112":0,"113":0.00398,"114":0.02389,"115":0.03583,"116":0.05573,"117":0.7763,"118":0.04379,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00398,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.01194,"66":0,"67":0,"68":0.00398,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0.00398,"75":0,"76":0.00398,"77":0,"78":0,"79":0.01194,"80":0.03583,"81":0,"83":0.00398,"84":0.00398,"85":0.00398,"86":0,"87":0.01991,"88":0.00398,"89":0.00398,"90":0.00398,"91":0.00398,"92":0,"93":0,"94":0.00398,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.00796,"102":0.00398,"103":0.05972,"104":0.00398,"105":0.00796,"106":0.00398,"107":0.00796,"108":0.01194,"109":0.27469,"110":0.00796,"111":0.01592,"112":0.02787,"113":0.04379,"114":0.10749,"115":0.21896,"116":6.40941,"117":1.33364,"118":0.00796,"119":0.00398,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0.00398,"74":0,"75":0,"76":0,"77":0.01194,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00398,"96":0,"97":0.00398,"98":0,"99":0,"100":0.05573,"101":0.14332,"102":0.16322,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00398,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00398,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00398,"108":0.00796,"109":0.01991,"110":0.00398,"111":0.00796,"112":0.00796,"113":0.00796,"114":0.02787,"115":0.05573,"116":1.4451,"117":1.01117},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00398,"9":0.00398,"10":0,"11":0,"12":0,"13":0.01592,"14":0.02787,"15":0.03981,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00796,"10.1":0,"11.1":0,"12.1":0.00398,"13.1":0.03583,"14.1":0.08758,"15.1":0.01592,"15.2-15.3":0.01194,"15.4":0.02389,"15.5":0.05573,"15.6":0.19507,"16.0":0.01194,"16.1":0.09156,"16.2":0.05573,"16.3":0.2309,"16.4":0.05175,"16.5":0.19905,"16.6":1.05497,"17.0":0.07166,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00374,"8.1-8.4":0.00374,"9.0-9.2":0,"9.3":0.03365,"10.0-10.2":0,"10.3":0.01495,"11.0-11.2":0.02243,"11.3-11.4":0.01869,"12.0-12.1":0.00374,"12.2-12.5":0.09347,"13.0-13.1":0,"13.2":0,"13.3":0.00748,"13.4-13.7":0.09347,"14.0-14.4":0.1645,"14.5-14.8":0.33274,"15.0-15.1":0.12338,"15.2-15.3":0.20937,"15.4":0.12712,"15.5":0.29536,"15.6-15.7":1.2562,"16.0":0.97954,"16.1":1.59642,"16.2":0.93841,"16.3":1.53287,"16.4":0.46734,"16.5":1.43566,"16.6":24.96329,"17.0":2.2993,"17.1":0.00748},P:{"4":0.12248,"20":0.08166,"21":0.24497,"22":2.62318,"5.0-5.4":0.01021,"6.2-6.4":0.02041,"7.2-7.4":0.02041,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.03062,"12.0":0,"13.0":0.02041,"14.0":0.01021,"15.0":0,"16.0":0.06124,"17.0":0.02041,"18.0":0.06124,"19.0":0.05103},I:{"0":0,"3":0,"4":0.02803,"2.1":0,"2.2":0.00934,"2.3":0.01869,"4.1":0.02803,"4.2-4.3":0.0654,"4.4":0,"4.4.3-4.4.4":0.17752},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01194,"9":0.00398,"10":0.00398,"11":0.01592,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":41.86905},R:{_:"0"},M:{"0":0.29493},Q:{"13.1":0},O:{"0":0.01806},H:{"0":0.19944}};
    +module.exports={C:{"38":0.00382,"52":0.01912,"73":0.04971,"78":0.01912,"102":0.00382,"107":0.00382,"111":0.00382,"113":0.00382,"114":0.07648,"115":0.10707,"116":0.00382,"117":0.01912,"118":0.04971,"119":1.14338,"120":0.2868,"122":0.00382,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 103 104 105 106 108 109 110 112 121 123 3.5","3.6":0.00382},D:{"29":0.00382,"38":0.00382,"41":0.00382,"42":0.00382,"43":0.00382,"44":0.00382,"45":0.00382,"46":0.00382,"47":0.00382,"49":0.0153,"51":0.00382,"52":0.00382,"56":0.00382,"65":0.02677,"70":0.00382,"74":0.00382,"75":0.00382,"76":0.00382,"79":0.03059,"80":0.00765,"84":0.00382,"85":0.00382,"86":0.00382,"87":0.04206,"88":0.00382,"89":0.00765,"91":0.00382,"92":0.00382,"93":0.00765,"94":0.00382,"95":0.00765,"97":0.00382,"98":0.00765,"99":0.01147,"100":0.00382,"101":0.01147,"102":0.01147,"103":0.12237,"104":0.00382,"105":0.00765,"106":0.03824,"107":0.00382,"108":0.06501,"109":1.41106,"110":0.03442,"111":0.01912,"112":0.02677,"113":0.07266,"114":0.07266,"115":0.07648,"116":0.3824,"117":0.32504,"118":4.00373,"119":14.09144,"120":0.00765,"121":0.00765,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 30 31 32 33 34 35 36 37 39 40 48 50 53 54 55 57 58 59 60 61 62 63 64 66 67 68 69 71 72 73 77 78 81 83 90 96 122"},F:{"28":0.00382,"73":0.00382,"74":0.00382,"94":0.02294,"95":0.06118,"100":0.00382,"102":0.44358,"103":0.0956,"104":0.37475,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 96 97 98 99 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"17":0.00382,"18":0.00765,"91":0.00382,"92":0.00765,"100":0.00382,"107":0.00382,"108":0.00382,"109":0.05354,"110":0.00382,"111":0.01912,"112":0.00382,"113":0.00382,"114":0.0153,"115":0.03442,"116":0.03824,"117":0.14914,"118":0.98659,"119":5.30006,_:"12 13 14 15 16 79 80 81 83 84 85 86 87 88 89 90 93 94 95 96 97 98 99 101 102 103 104 105 106"},E:{"9":0.00765,"13":0.03059,"14":0.04206,"15":0.01147,_:"0 4 5 6 7 8 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.00382,"13.1":0.06118,"14.1":0.1759,"15.1":0.02677,"15.2-15.3":0.03059,"15.4":0.04589,"15.5":0.12237,"15.6":0.4627,"16.0":0.03059,"16.1":0.1759,"16.2":0.19885,"16.3":0.32886,"16.4":0.1109,"16.5":0.35563,"16.6":2.13379,"17.0":0.6692,"17.1":0.90246,"17.2":0.02677},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00539,"5.0-5.1":0.00539,"6.0-6.1":0.01348,"7.0-7.1":0.01887,"8.1-8.4":0.0027,"9.0-9.2":0.02157,"9.3":0.0674,"10.0-10.2":0.00539,"10.3":0.09705,"11.0-11.2":0.04583,"11.3-11.4":0.04044,"12.0-12.1":0.02426,"12.2-12.5":0.44212,"13.0-13.1":0.01078,"13.2":0.04583,"13.3":0.02696,"13.4-13.7":0.07818,"14.0-14.4":0.20758,"14.5-14.8":0.33698,"15.0-15.1":0.1321,"15.2-15.3":0.16175,"15.4":0.18062,"15.5":0.25341,"15.6-15.7":1.33174,"16.0":0.62543,"16.1":1.25356,"16.2":0.60117,"16.3":1.12685,"16.4":0.23184,"16.5":0.59847,"16.6-16.7":10.14439,"17.0":3.03819,"17.1":5.10319,"17.2":0.14557},P:{"4":0.26018,"20":0.04163,"21":0.19774,"22":0.26018,"23":2.59144,"5.0-5.4":0.01041,"6.2-6.4":0.01041,"7.2-7.4":0.02081,_:"8.2 9.2 10.1 12.0 15.0","11.1-11.2":0.01041,"13.0":0.01041,"14.0":0.01041,"16.0":0.05204,"17.0":0.01041,"18.0":0.05204,"19.0":0.03122},I:{"0":0.07989,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00024},K:{"0":0.22851,_:"10 11 12 11.1 11.5 12.1"},A:{"7":0.00382,"8":0.02677,"9":0.00382,"10":0.00382,"11":0.07648,_:"6 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.0247},H:{"0":0},L:{"0":31.52371},R:{_:"0"},M:{"0":0.29645},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PS.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PS.js
    index 7227fed2c374e8..00b2895fc603e0 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PS.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PS.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00292,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00292,"109":0.00292,"110":0,"111":0,"112":0,"113":0.00292,"114":0.00292,"115":0.04383,"116":0.02045,"117":0.1724,"118":0.01169,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.00292,"36":0,"37":0,"38":0.00292,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00292,"47":0,"48":0,"49":0.00292,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00292,"59":0,"60":0,"61":0,"62":0,"63":0.00292,"64":0,"65":0,"66":0,"67":0,"68":0.00292,"69":0.01461,"70":0,"71":0,"72":0.00292,"73":0.00292,"74":0.01753,"75":0,"76":0,"77":0.04383,"78":0,"79":0.00877,"80":0,"81":0.00877,"83":0.00292,"84":0.00292,"85":0,"86":0.00292,"87":0.00877,"88":0,"89":0.00584,"90":0.00292,"91":0,"92":0.00292,"93":0,"94":0,"95":0.01169,"96":0.00292,"97":0.00292,"98":0.00584,"99":0.00292,"100":0.01461,"101":0.00292,"102":0.00584,"103":0.00584,"104":0.01169,"105":0.00877,"106":0.00584,"107":0.00877,"108":0.01461,"109":0.58732,"110":0.01461,"111":0.01169,"112":0.03506,"113":0.01461,"114":0.04675,"115":0.07305,"116":4.53202,"117":1.23016,"118":0.00292,"119":0.00292,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00292,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.02338,"73":0.01169,"74":0,"75":0,"76":0,"77":0.00877,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00584,"96":0,"97":0,"98":0,"99":0,"100":0.01169,"101":0.06721,"102":0.06428,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0.00292,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00292,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00292,"108":0.00292,"109":0.00584,"110":0.00292,"111":0,"112":0.00292,"113":0.00292,"114":0.00877,"115":0.01461,"116":0.36525,"117":0.24837},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00292,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00584,"6.1":0,"7.1":0,"9.1":0.01753,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00292,"14.1":0.00584,"15.1":0,"15.2-15.3":0,"15.4":0.00292,"15.5":0.00584,"15.6":0.01461,"16.0":0.00292,"16.1":0.01461,"16.2":0.00584,"16.3":0.02045,"16.4":0.00584,"16.5":0.01753,"16.6":0.08182,"17.0":0.01461,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00143,"6.0-6.1":0,"7.0-7.1":0.03587,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.04591,"10.0-10.2":0,"10.3":0.01578,"11.0-11.2":0.00287,"11.3-11.4":0,"12.0-12.1":0.01148,"12.2-12.5":0.12483,"13.0-13.1":0.00143,"13.2":0,"13.3":0.16644,"13.4-13.7":0.01435,"14.0-14.4":0.08896,"14.5-14.8":0.23674,"15.0-15.1":0.033,"15.2-15.3":0.06313,"15.4":0.08752,"15.5":0.13057,"15.6-15.7":1.31715,"16.0":0.60836,"16.1":0.57536,"16.2":0.30992,"16.3":0.67723,"16.4":0.12626,"16.5":0.4864,"16.6":7.86989,"17.0":1.08758,"17.1":0.00287},P:{"4":0.07076,"20":0.12131,"21":0.27294,"22":2.71926,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.06065,"8.2":0,"9.2":0.01011,"10.1":0.01011,"11.1-11.2":0.06065,"12.0":0.01011,"13.0":0.06065,"14.0":0.05054,"15.0":0.03033,"16.0":0.10109,"17.0":0.09098,"18.0":0.06065,"19.0":0.13141},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.09922},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00877,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":71.92239},R:{_:"0"},M:{"0":0.09909},Q:{"13.1":0},O:{"0":0.07078},H:{"0":0.28144}};
    +module.exports={C:{"52":0.01027,"72":0.00342,"78":0.00342,"109":0.01369,"110":0.00342,"115":0.06504,"116":0.00342,"117":0.00342,"118":0.01369,"119":0.36626,"120":0.10954,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 111 112 113 114 121 122 123 3.5 3.6"},D:{"11":0.00342,"38":0.00342,"39":0.00342,"49":0.00685,"53":0.00685,"57":0.00342,"58":0.01027,"61":0.00342,"63":0.00685,"67":0.00342,"69":0.00342,"71":0.00342,"72":0.00342,"73":0.00342,"75":0.00685,"77":0.01027,"78":0.01369,"79":0.04108,"80":0.00342,"81":0.01369,"83":0.01712,"84":0.01369,"85":0.00342,"86":0.00685,"87":0.02396,"88":0.00342,"89":0.01027,"90":0.02054,"91":0.00685,"92":0.00342,"93":0.00342,"94":0.00342,"95":0.00685,"96":0.01027,"97":0.01027,"98":0.02054,"99":0.00685,"100":0.05477,"101":0.00342,"102":0.01027,"103":0.02396,"104":0.03765,"105":0.01027,"106":0.03423,"107":0.01027,"108":0.03081,"109":2.25233,"110":0.02054,"111":0.04108,"112":0.06161,"113":0.01027,"114":0.04108,"115":0.02396,"116":0.1335,"117":0.22934,"118":6.52082,"119":18.56978,"120":0.00342,"121":0.00342,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 40 41 42 43 44 45 46 47 48 50 51 52 54 55 56 59 60 62 64 65 66 68 70 74 76 122"},F:{"79":0.00342,"85":0.00342,"94":0.01027,"95":0.01027,"101":0.00342,"102":0.28753,"103":0.08215,"104":0.37653,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 86 87 88 89 90 91 92 93 96 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"13":0.00342,"15":0.00342,"16":0.00685,"18":0.01027,"84":0.00342,"92":0.01369,"100":0.00342,"109":0.02738,"113":0.00342,"114":0.00685,"115":0.00342,"116":0.00685,"117":0.04792,"118":0.39365,"119":2.08118,_:"12 14 17 79 80 81 83 85 86 87 88 89 90 91 93 94 95 96 97 98 99 101 102 103 104 105 106 107 108 110 111 112"},E:{"14":0.01027,"15":0.00342,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 6.1 7.1 9.1 10.1 11.1","5.1":0.05477,"12.1":0.00342,"13.1":0.00685,"14.1":0.04108,"15.1":0.00342,"15.2-15.3":0.00342,"15.4":0.00685,"15.5":0.01369,"15.6":0.06846,"16.0":0.00342,"16.1":0.02396,"16.2":0.02396,"16.3":0.05477,"16.4":0.01712,"16.5":0.03081,"16.6":0.19511,"17.0":0.12665,"17.1":0.16773,"17.2":0.00342},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00277,"5.0-5.1":0.00277,"6.0-6.1":0.00692,"7.0-7.1":0.00968,"8.1-8.4":0.00138,"9.0-9.2":0.01107,"9.3":0.03458,"10.0-10.2":0.00277,"10.3":0.04979,"11.0-11.2":0.02351,"11.3-11.4":0.02075,"12.0-12.1":0.01245,"12.2-12.5":0.22684,"13.0-13.1":0.00553,"13.2":0.02351,"13.3":0.01383,"13.4-13.7":0.04011,"14.0-14.4":0.1065,"14.5-14.8":0.17289,"15.0-15.1":0.06777,"15.2-15.3":0.08299,"15.4":0.09267,"15.5":0.13002,"15.6-15.7":0.68327,"16.0":0.32089,"16.1":0.64316,"16.2":0.30844,"16.3":0.57815,"16.4":0.11895,"16.5":0.30706,"16.6-16.7":5.20477,"17.0":1.5588,"17.1":2.61829,"17.2":0.07469},P:{"4":0.02047,"20":0.08188,"21":0.15352,"22":0.84949,"23":2.21072,_:"5.0-5.4 6.2-6.4 8.2 10.1","7.2-7.4":0.05117,"9.2":0.01023,"11.1-11.2":0.05117,"12.0":0.01023,"13.0":0.05117,"14.0":0.05117,"15.0":0.02047,"16.0":0.08188,"17.0":0.05117,"18.0":0.04094,"19.0":0.09211},I:{"0":0.03926,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00012},K:{"0":0.24993,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.02054,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.03946},H:{"0":0},L:{"0":48.37369},R:{_:"0"},M:{"0":0.07235},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PT.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PT.js
    index 2ec5f1d4fd7670..8fee7b7b875f3e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PT.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PT.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0.0058,"51":0,"52":0.0232,"53":0,"54":0.0058,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.0116,"79":0,"80":0,"81":0,"82":0,"83":0.0116,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.0058,"92":0,"93":0,"94":0,"95":0.0058,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.029,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.0058,"109":0,"110":0.0058,"111":0.0116,"112":0.0058,"113":0.0058,"114":0.0058,"115":0.1276,"116":0.1276,"117":1.4268,"118":0.1508,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.0058,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.0232,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.0058,"58":0,"59":0,"60":0.0116,"61":0,"62":0,"63":0.0116,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0.0058,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.0058,"79":0.0174,"80":0.0058,"81":0.0058,"83":0.0058,"84":0.0116,"85":0.0174,"86":0.0058,"87":0.0116,"88":0.0116,"89":0.0406,"90":0.0058,"91":0.0406,"92":0.0058,"93":0.0406,"94":0.0058,"95":0.0058,"96":0,"97":0.0058,"98":0,"99":0.029,"100":0.0116,"101":0.0058,"102":0.0058,"103":0.0638,"104":0.0116,"105":0.0232,"106":0.029,"107":0.0232,"108":0.029,"109":0.9164,"110":0.0232,"111":0.0232,"112":0.0406,"113":0.0348,"114":0.1566,"115":0.5104,"116":13.7402,"117":5.51,"118":0.0116,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.0058,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.0058,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0.0058,"72":0.029,"73":0.0116,"74":0,"75":0,"76":0,"77":0.0232,"78":0,"79":0,"80":0,"81":0,"82":0.0058,"83":0,"84":0,"85":0.0058,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.0058,"95":0.0174,"96":0,"97":0,"98":0,"99":0.0116,"100":0.3828,"101":0.6786,"102":1.943,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0.0058,"14":0.0058,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.0058,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.0058,"108":0.0058,"109":0.058,"110":0.0058,"111":0.0058,"112":0.0058,"113":0.0116,"114":0.522,"115":0.0696,"116":1.827,"117":1.8792},E:{"4":0,"5":0,"6":0,"7":0,"8":0.0058,"9":0,"10":0,"11":0,"12":0,"13":0.0058,"14":0.0232,"15":0.0058,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.0058,"13.1":0.0406,"14.1":0.0928,"15.1":0.0058,"15.2-15.3":0.0116,"15.4":0.0174,"15.5":0.029,"15.6":0.145,"16.0":0.0232,"16.1":0.058,"16.2":0.0406,"16.3":0.1044,"16.4":0.0464,"16.5":0.1798,"16.6":0.7772,"17.0":0.0696,"17.1":0},G:{"8":0.01583,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00198,"6.0-6.1":0,"7.0-7.1":0.00198,"8.1-8.4":0.00198,"9.0-9.2":0,"9.3":0.07123,"10.0-10.2":0,"10.3":0.06133,"11.0-11.2":0.00791,"11.3-11.4":0.01187,"12.0-12.1":0.00594,"12.2-12.5":0.39768,"13.0-13.1":0,"13.2":0,"13.3":0.14641,"13.4-13.7":0.08508,"14.0-14.4":0.11475,"14.5-14.8":0.18005,"15.0-15.1":0.06529,"15.2-15.3":0.04946,"15.4":0.06529,"15.5":0.12267,"15.6-15.7":1.14359,"16.0":0.54211,"16.1":0.89429,"16.2":0.38977,"16.3":0.83889,"16.4":0.16224,"16.5":0.56784,"16.6":11.55456,"17.0":1.94686,"17.1":0.00791},P:{"4":0.03095,"20":0.02063,"21":0.0619,"22":1.68173,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.01032,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01032,"12.0":0.01032,"13.0":0.01032,"14.0":0,"15.0":0,"16.0":0.02063,"17.0":0.01032,"18.0":0.01032,"19.0":0.02063},I:{"0":0,"3":0,"4":0.0052,"2.1":0,"2.2":0,"2.3":0.0208,"4.1":0.0052,"4.2-4.3":0.026,"4.4":0,"4.4.3-4.4.4":0.1144},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00633,"9":0.00633,"10":0,"11":0.05695,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":42.336},R:{_:"0"},M:{"0":0.3024},Q:{"13.1":0.0042},O:{"0":0.1638},H:{"0":0.29822}};
    +module.exports={C:{"7":0.00593,"50":0.00593,"52":0.03556,"54":0.01185,"78":0.01778,"82":0.00593,"83":0.01185,"91":0.00593,"97":0.00593,"102":0.00593,"103":0.00593,"104":0.01185,"106":0.01185,"108":0.00593,"109":0.00593,"110":0.00593,"112":0.00593,"113":0.00593,"115":0.2193,"116":0.01185,"117":0.03556,"118":0.05927,"119":1.9322,"120":0.57492,"121":0.00593,_:"2 3 4 5 6 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 51 53 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 84 85 86 87 88 89 90 92 93 94 95 96 98 99 100 101 105 107 111 114 122 123 3.5 3.6"},D:{"38":0.00593,"47":0.00593,"49":0.01778,"53":0.00593,"55":0.00593,"57":0.01185,"60":0.02371,"63":0.01778,"76":0.00593,"78":0.01185,"79":0.05927,"80":0.00593,"81":0.00593,"83":0.00593,"85":0.01778,"86":0.00593,"87":0.01778,"88":0.01778,"89":0.0652,"90":0.00593,"91":0.08298,"92":0.00593,"93":0.09483,"94":0.01185,"95":0.00593,"96":0.00593,"97":0.00593,"98":0.00593,"99":0.01185,"100":0.02964,"101":0.01185,"102":0.01185,"103":0.09483,"104":0.01778,"105":0.03556,"106":0.03556,"107":0.05334,"108":0.04149,"109":1.45212,"110":0.03556,"111":0.02964,"112":0.04742,"113":0.04149,"114":0.10669,"115":0.09483,"116":0.34377,"117":0.46231,"118":7.07091,"119":28.71632,"120":0.02371,"121":0.00593,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 48 50 51 52 54 56 58 59 61 62 64 65 66 67 68 69 70 71 72 73 74 75 77 84 122"},F:{"28":0.00593,"95":0.02371,"102":2.7442,"103":0.26079,"104":2.08038,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00593,"13":0.01185,"14":0.01185,"15":0.00593,"18":0.00593,"92":0.01185,"106":0.00593,"107":0.02371,"108":0.01185,"109":0.10076,"110":0.01185,"111":0.00593,"112":0.01185,"113":0.00593,"114":0.04742,"115":0.01185,"116":0.03556,"117":0.09483,"118":1.16762,"119":5.80253,_:"16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105"},E:{"13":0.00593,"14":0.03556,"15":0.00593,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1","11.1":0.00593,"12.1":0.00593,"13.1":0.09483,"14.1":0.16003,"15.1":0.01185,"15.2-15.3":0.01778,"15.4":0.02964,"15.5":0.05334,"15.6":0.23115,"16.0":0.04149,"16.1":0.09483,"16.2":0.05334,"16.3":0.16596,"16.4":0.08891,"16.5":0.19559,"16.6":0.67568,"17.0":0.46823,"17.1":0.57492,"17.2":0.01778},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00221,"5.0-5.1":0.00221,"6.0-6.1":0.00554,"7.0-7.1":0.00775,"8.1-8.4":0.00111,"9.0-9.2":0.00886,"9.3":0.02769,"10.0-10.2":0.00221,"10.3":0.03987,"11.0-11.2":0.01883,"11.3-11.4":0.01661,"12.0-12.1":0.00997,"12.2-12.5":0.18162,"13.0-13.1":0.00443,"13.2":0.01883,"13.3":0.01107,"13.4-13.7":0.03212,"14.0-14.4":0.08527,"14.5-14.8":0.13843,"15.0-15.1":0.05426,"15.2-15.3":0.06645,"15.4":0.0742,"15.5":0.1041,"15.6-15.7":0.54708,"16.0":0.25693,"16.1":0.51496,"16.2":0.24696,"16.3":0.46291,"16.4":0.09524,"16.5":0.24585,"16.6-16.7":4.16733,"17.0":1.24809,"17.1":2.0964,"17.2":0.0598},P:{"4":0.05229,"20":0.02091,"21":0.05229,"22":0.11503,"23":1.53719,_:"5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 14.0 18.0","12.0":0.01046,"13.0":0.01046,"15.0":0.01046,"16.0":0.02091,"17.0":0.01046,"19.0":0.02091},I:{"0":0.10132,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00007,"4.4":0,"4.4.3-4.4.4":0.00031},K:{"0":0.28104,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.0062,"9":0.01239,"11":0.25405,_:"6 7 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.11404},H:{"0":0},L:{"0":27.39195},R:{_:"0"},M:{"0":0.23623},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PW.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PW.js
    index 7741c410cef600..d7e832cc14f5fc 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PW.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PW.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00513,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0.00513,"115":0.08718,"116":0.05641,"117":0.89227,"118":0.03077,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00513,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00513,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.03077,"79":0.01538,"80":0,"81":0,"83":0.02564,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0.03077,"94":0.00513,"95":0.01026,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.23076,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.3846,"110":0,"111":0.01538,"112":1.23072,"113":0.1282,"114":0.2205,"115":0.07179,"116":14.51737,"117":2.02043,"118":0.00513,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.01538,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00513,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00513,"101":0.07692,"102":0.21538,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00513,"108":0,"109":0.00513,"110":0,"111":0.00513,"112":0.01026,"113":0,"114":0.00513,"115":0.02051,"116":0.43588,"117":0.38973},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0.02051,"13":0,"14":0,"15":0.00513,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.01026,"14.1":0.03077,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.01026,"15.6":0.02564,"16.0":0.00513,"16.1":0.19999,"16.2":0.01538,"16.3":0.01026,"16.4":0.02564,"16.5":0.0923,"16.6":3.36397,"17.0":0.01538,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.23037,"10.0-10.2":0.09754,"10.3":0,"11.0-11.2":0.0249,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0.0083,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0.33622,"14.0-14.4":0.0249,"14.5-14.8":0.10792,"15.0-15.1":0.26358,"15.2-15.3":0.0249,"15.4":0.0166,"15.5":0.0249,"15.6-15.7":0.60809,"16.0":0.68904,"16.1":0.48357,"16.2":1.20581,"16.3":0.19716,"16.4":0.2781,"16.5":0.18886,"16.6":13.38224,"17.0":2.4303,"17.1":0},P:{"4":0,"20":0.11169,"21":0.02031,"22":2.36583,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.70061,"8.2":0,"9.2":0.02031,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0,"17.0":0.02031,"18.0":0,"19.0":0},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.22974},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":48.22043},R:{_:"0"},M:{"0":0.05359},Q:{"13.1":0},O:{"0":0.08282},H:{"0":0.17527}};
    +module.exports={C:{"60":0.00916,"108":0.00916,"115":0.03207,"118":0.01832,"119":2.05229,"120":0.3619,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 109 110 111 112 113 114 116 117 121 122 123 3.5 3.6"},D:{"69":0.00916,"74":0.01832,"78":0.02291,"79":0.11911,"83":0.02291,"86":0.00916,"87":0.21989,"95":0.18324,"97":0.00916,"98":0.08246,"100":0.10994,"103":0.18324,"106":0.10078,"107":0.02291,"109":0.48559,"112":0.04123,"114":0.03207,"116":0.53598,"117":0.60469,"118":5.76748,"119":23.44098,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 70 71 72 73 75 76 77 80 81 84 85 88 89 90 91 92 93 94 96 99 101 102 104 105 108 110 111 113 115 120 121 122"},F:{"95":0.03207,"102":0.10078,"103":0.12369,"104":1.03989,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"100":0.00916,"109":0.05955,"117":0.04123,"118":0.61844,"119":3.35329,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 101 102 103 104 105 106 107 108 110 111 112 113 114 115 116"},E:{"11":0.00916,"13":0.01832,"14":0.00916,_:"0 4 5 6 7 8 9 10 12 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 15.1 15.2-15.3 16.0","13.1":0.02291,"14.1":1.3514,"15.4":0.10994,"15.5":0.02291,"15.6":0.15117,"16.1":0.00916,"16.2":0.00916,"16.3":0.03207,"16.4":0.10994,"16.5":0.0733,"16.6":1.57586,"17.0":0.10994,"17.1":0.18324,"17.2":0.05955},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00376,"5.0-5.1":0.00376,"6.0-6.1":0.0094,"7.0-7.1":0.01315,"8.1-8.4":0.00188,"9.0-9.2":0.01503,"9.3":0.04698,"10.0-10.2":0.00376,"10.3":0.06765,"11.0-11.2":0.03194,"11.3-11.4":0.02819,"12.0-12.1":0.01691,"12.2-12.5":0.30817,"13.0-13.1":0.00752,"13.2":0.03194,"13.3":0.01879,"13.4-13.7":0.05449,"14.0-14.4":0.14469,"14.5-14.8":0.23489,"15.0-15.1":0.09208,"15.2-15.3":0.11275,"15.4":0.1259,"15.5":0.17664,"15.6-15.7":0.92828,"16.0":0.43595,"16.1":0.87379,"16.2":0.41904,"16.3":0.78547,"16.4":0.1616,"16.5":0.41716,"16.6-16.7":7.07111,"17.0":2.11776,"17.1":3.55716,"17.2":0.10147},P:{"20":0.0213,"21":0.15972,"22":0.39397,"23":1.57587,_:"4 5.0-5.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 15.0 17.0 18.0","6.2-6.4":0.03194,"7.2-7.4":0.74535,"14.0":0.04259,"16.0":0.0213,"19.0":0.01065},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{"0":0.34146,_:"10 11 12 11.1 11.5 12.1"},A:{_:"6 7 8 9 10 11 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.53658},H:{"0":0},L:{"0":31.53683},R:{_:"0"},M:{"0":0.34146},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PY.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PY.js
    index 9463f4042107a2..8788a931a065c1 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PY.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/PY.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.00616,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00616,"46":0,"47":0.00924,"48":0,"49":0,"50":0.00308,"51":0,"52":0.0462,"53":0,"54":0.00308,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0.01232,"74":0,"75":0,"76":0,"77":0,"78":0.00308,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00616,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00308,"103":0.00308,"104":0,"105":0,"106":0,"107":0.00616,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0.00308,"114":0.00308,"115":0.077,"116":0.02464,"117":0.3234,"118":0.03388,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00308,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00616,"48":0,"49":0.00924,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.00308,"56":0,"57":0.00308,"58":0,"59":0,"60":0.00924,"61":0,"62":0,"63":0,"64":0.00616,"65":0.00616,"66":0,"67":0,"68":0.00616,"69":0.00308,"70":0.00308,"71":0.00308,"72":0,"73":0.00616,"74":0,"75":0,"76":0,"77":0.00308,"78":0,"79":0.01848,"80":0.00308,"81":0.00616,"83":0.00308,"84":0,"85":0.00308,"86":0.00616,"87":0.1848,"88":0.00616,"89":0.01232,"90":0.00308,"91":0.0924,"92":0,"93":0.00308,"94":0.00308,"95":0.00308,"96":0.00308,"97":0.00308,"98":0,"99":0.00616,"100":0.00308,"101":0.00308,"102":0.00616,"103":0.01232,"104":0.00308,"105":0.00616,"106":0.00616,"107":0.01232,"108":0.01232,"109":0.64064,"110":0.00616,"111":0.0154,"112":0.01848,"113":0.01232,"114":0.03696,"115":0.154,"116":4.389,"117":1.14268,"118":0.00308,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00308,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00616,"70":0,"71":0,"72":0.01848,"73":0.00616,"74":0,"75":0,"76":0,"77":0.01848,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01232,"96":0,"97":0,"98":0,"99":0.00308,"100":0.07392,"101":0.17556,"102":0.18788,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00308,"13":0.00308,"14":0.00308,"15":0,"16":0,"17":0,"18":0.00308,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00308,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.01232,"102":0.00308,"103":0.00308,"104":0,"105":0,"106":0,"107":0.00308,"108":0,"109":0.00616,"110":0,"111":0,"112":0.00308,"113":0.00308,"114":0.00924,"115":0.01848,"116":0.47124,"117":0.31416},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00616,"14":0.00308,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00308,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00308,"14.1":0.00616,"15.1":0,"15.2-15.3":0,"15.4":0.00924,"15.5":0.00308,"15.6":0.01232,"16.0":0.00308,"16.1":0.00924,"16.2":0.00308,"16.3":0.01232,"16.4":0.00308,"16.5":0.0154,"16.6":0.10164,"17.0":0.00616,"17.1":0},G:{"8":0,"3.2":0.00291,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00194,"6.0-6.1":0.00097,"7.0-7.1":0.02036,"8.1-8.4":0.00679,"9.0-9.2":0.00097,"9.3":0.02715,"10.0-10.2":0,"10.3":0.01261,"11.0-11.2":0.03103,"11.3-11.4":0.00388,"12.0-12.1":0.00776,"12.2-12.5":0.14739,"13.0-13.1":0.00194,"13.2":0.00097,"13.3":0.02133,"13.4-13.7":0.01939,"14.0-14.4":0.04654,"14.5-14.8":0.12509,"15.0-15.1":0.01648,"15.2-15.3":0.02036,"15.4":0.02521,"15.5":0.05624,"15.6-15.7":1.08407,"16.0":0.20751,"16.1":0.32968,"16.2":0.15805,"16.3":0.34326,"16.4":0.20751,"16.5":0.40338,"16.6":5.64919,"17.0":0.50325,"17.1":0},P:{"4":0.447,"20":0.15239,"21":0.2743,"22":2.85472,"5.0-5.4":0.01016,"6.2-6.4":0.02032,"7.2-7.4":0.56891,"8.2":0,"9.2":0.03048,"10.1":0.01016,"11.1-11.2":0.06095,"12.0":0.01016,"13.0":0.06095,"14.0":0.04064,"15.0":0.04064,"16.0":0.2235,"17.0":0.2235,"18.0":0.06095,"19.0":0.13207},I:{"0":0,"3":0,"4":0.01653,"2.1":0,"2.2":0.00827,"2.3":0.04134,"4.1":0.01653,"4.2-4.3":0.01653,"4.4":0,"4.4.3-4.4.4":0.15707},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00924,"9":0.00308,"10":0.00308,"11":0.01232,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":73.37232},R:{_:"0"},M:{"0":0.12456},Q:{"13.1":0},O:{"0":0.04844},H:{"0":0.41274}};
    +module.exports={C:{"3":0.00303,"7":0.00606,"17":0.00303,"30":0.00303,"35":0.01213,"42":0.00303,"43":0.00303,"45":0.00606,"50":0.01213,"52":0.09702,"54":0.01213,"56":0.00303,"60":0.00303,"61":0.00303,"64":0.00303,"65":0.00303,"66":0.00303,"68":0.00303,"69":0.00303,"73":0.06064,"78":0.00303,"80":0.01213,"81":0.00606,"88":0.01516,"93":0.00303,"96":0.01213,"102":0.00606,"103":0.01213,"105":0.00303,"107":0.00303,"108":0.00303,"112":0.00303,"113":0.00606,"114":0.00303,"115":0.27288,"116":0.00303,"117":0.00606,"118":0.02426,"119":0.73071,"120":0.21527,"121":0.00303,_:"2 4 5 6 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24 25 26 27 28 29 31 32 33 34 36 37 38 39 40 41 44 46 47 48 49 51 53 55 57 58 59 62 63 67 70 71 72 74 75 76 77 79 82 83 84 85 86 87 89 90 91 92 94 95 97 98 99 100 101 104 106 109 110 111 122 123 3.5 3.6"},D:{"11":0.00303,"31":0.00303,"37":0.00303,"38":0.00303,"39":0.00303,"40":0.00303,"41":0.00303,"42":0.00303,"43":0.00303,"44":0.00606,"45":0.00303,"46":0.00303,"47":0.01516,"49":0.01819,"50":0.00303,"51":0.00303,"55":0.00606,"57":0.01213,"58":0.00303,"60":0.03638,"63":0.00303,"64":0.0091,"65":0.00606,"67":0.00303,"69":0.01213,"70":0.00303,"71":0.00303,"73":0.01213,"75":0.01213,"77":0.0091,"78":0.00303,"79":0.04245,"80":0.00606,"81":0.0091,"83":0.02426,"84":0.01516,"85":0.01516,"86":0.0091,"87":0.38203,"88":0.00606,"89":0.02426,"90":0.0091,"91":0.43358,"92":0.00303,"93":0.00606,"94":0.00303,"95":0.00606,"96":0.00606,"97":0.01213,"98":0.00303,"99":0.0091,"100":0.00606,"101":0.00606,"102":0.01819,"103":0.01516,"104":0.00606,"105":0.03335,"106":0.0091,"107":0.0091,"108":0.02426,"109":1.79494,"110":0.01213,"111":0.01213,"112":0.01819,"113":0.0091,"114":0.03942,"115":0.03032,"116":0.10309,"117":0.32442,"118":3.12902,"119":16.10902,"120":0.00303,"121":0.00606,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 33 34 35 36 48 52 53 54 56 59 61 62 66 68 72 74 76 122"},F:{"28":0.00303,"82":0.00303,"85":0.00303,"95":0.02122,"102":0.63066,"103":0.06064,"104":0.54879,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 83 84 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00606,"13":0.01213,"14":0.01213,"15":0.00606,"18":0.00303,"84":0.0091,"85":0.00303,"90":0.00303,"92":0.01819,"100":0.00303,"101":0.03942,"102":0.00606,"103":0.00303,"108":0.00606,"109":0.02426,"111":0.00303,"112":0.00303,"113":0.0091,"114":0.0091,"115":0.0091,"116":0.02426,"117":0.05761,"118":0.44874,"119":2.31342,_:"16 17 79 80 81 83 86 87 88 89 91 93 94 95 96 97 98 99 104 105 106 107 110"},E:{"9":0.00606,"13":0.01819,"14":0.00606,"15":0.00303,_:"0 4 5 6 7 8 10 11 12 3.1 3.2 6.1 7.1 9.1 10.1 11.1 15.1 15.2-15.3","5.1":0.01213,"12.1":0.00303,"13.1":0.01819,"14.1":0.02729,"15.4":0.02426,"15.5":0.00606,"15.6":0.03638,"16.0":0.00606,"16.1":0.01516,"16.2":0.0091,"16.3":0.05154,"16.4":0.00606,"16.5":0.01516,"16.6":0.17586,"17.0":0.06974,"17.1":0.13947,"17.2":0.00606},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00125,"5.0-5.1":0.00125,"6.0-6.1":0.00313,"7.0-7.1":0.00438,"8.1-8.4":0.00063,"9.0-9.2":0.00501,"9.3":0.01566,"10.0-10.2":0.00125,"10.3":0.02255,"11.0-11.2":0.01065,"11.3-11.4":0.0094,"12.0-12.1":0.00564,"12.2-12.5":0.10273,"13.0-13.1":0.00251,"13.2":0.01065,"13.3":0.00626,"13.4-13.7":0.01817,"14.0-14.4":0.04823,"14.5-14.8":0.0783,"15.0-15.1":0.03069,"15.2-15.3":0.03759,"15.4":0.04197,"15.5":0.05888,"15.6-15.7":0.30945,"16.0":0.14533,"16.1":0.29129,"16.2":0.13969,"16.3":0.26184,"16.4":0.05387,"16.5":0.13907,"16.6-16.7":2.35723,"17.0":0.70598,"17.1":1.18582,"17.2":0.03383},P:{"4":0.25252,"20":0.09091,"21":0.22221,"22":0.40403,"23":2.52517,"5.0-5.4":0.0101,"6.2-6.4":0.0303,"7.2-7.4":0.57574,_:"8.2 10.1","9.2":0.0202,"11.1-11.2":0.0404,"12.0":0.0101,"13.0":0.0505,"14.0":0.0404,"15.0":0.0202,"16.0":0.22221,"17.0":0.14141,"18.0":0.0404,"19.0":0.11111},I:{"0":0.104,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00007,"4.4":0,"4.4.3-4.4.4":0.00031},K:{"0":0.24478,_:"10 11 12 11.1 11.5 12.1"},A:{"7":0.00303,"8":0.02426,"9":0.01516,"10":0.00303,"11":0.03942,_:"6 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.04181},H:{"0":0.02},L:{"0":58.47649},R:{_:"0"},M:{"0":0.11149},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/QA.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/QA.js
    index 38483d7b94f021..6c8951d1245f7d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/QA.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/QA.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0.06449,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00537,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00269,"103":0,"104":0,"105":0,"106":0,"107":0.01075,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0.00269,"114":0,"115":0.01612,"116":0.01344,"117":0.11823,"118":0.00806,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00269,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00806,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00269,"69":0.00269,"70":0,"71":0.00269,"72":0,"73":0,"74":0,"75":0,"76":0.00269,"77":0,"78":0,"79":0.00806,"80":0,"81":0,"83":0,"84":0.00269,"85":0,"86":0.00269,"87":0.00537,"88":0.00537,"89":0,"90":0,"91":0.00269,"92":0,"93":0.00269,"94":0,"95":0.00269,"96":0.00269,"97":0.00269,"98":0.00269,"99":0.00537,"100":0.00269,"101":0.00269,"102":0.00269,"103":0.02418,"104":0.00269,"105":0.00269,"106":0.00537,"107":0.00537,"108":0.01881,"109":0.27945,"110":0.00537,"111":0.00806,"112":0.01612,"113":0.01881,"114":0.05374,"115":0.09405,"116":3.54415,"117":0.64757,"118":0.00269,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00269,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.01075,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00537,"70":0.00269,"71":0.00269,"72":0.09942,"73":0.02956,"74":0.00269,"75":0,"76":0,"77":0.05643,"78":0.00269,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00269,"96":0,"97":0,"98":0,"99":0.00269,"100":0.01881,"101":0.07524,"102":0.0833,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00269,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00269,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.00269,"104":0.00269,"105":0.00269,"106":0,"107":0,"108":0,"109":0.00806,"110":0.00269,"111":0.00269,"112":0.00269,"113":0.00269,"114":0.00806,"115":0.03224,"116":0.5374,"117":0.28482},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00537,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00806,"14.1":0.01881,"15.1":0.00269,"15.2-15.3":0.00269,"15.4":0.00537,"15.5":0.01075,"15.6":0.05105,"16.0":0.00537,"16.1":0.01612,"16.2":0.01075,"16.3":0.04299,"16.4":0.01881,"16.5":0.04568,"16.6":0.27945,"17.0":0.02687,"17.1":0},G:{"8":0.00322,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00161,"6.0-6.1":0,"7.0-7.1":0.01447,"8.1-8.4":0,"9.0-9.2":0.00482,"9.3":0.02734,"10.0-10.2":0,"10.3":0.02573,"11.0-11.2":0.01286,"11.3-11.4":0,"12.0-12.1":0.00643,"12.2-12.5":0.15116,"13.0-13.1":0.00161,"13.2":0.00322,"13.3":0.01286,"13.4-13.7":0.0193,"14.0-14.4":0.08523,"14.5-14.8":0.15598,"15.0-15.1":0.0595,"15.2-15.3":0.04985,"15.4":0.06432,"15.5":0.09648,"15.6-15.7":1.12404,"16.0":0.39076,"16.1":0.52905,"16.2":0.31196,"16.3":0.66896,"16.4":0.14955,"16.5":0.59177,"16.6":10.03433,"17.0":1.30253,"17.1":0.00322},P:{"4":0.04051,"20":0.06077,"21":0.10128,"22":2.03574,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.03038,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01013,"12.0":0,"13.0":0.01013,"14.0":0.02026,"15.0":0,"16.0":0.02026,"17.0":0.02026,"18.0":0.02026,"19.0":0.04051},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.07612},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01075,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":66.43525},R:{_:"0"},M:{"0":0.10238},Q:{"13.1":0},O:{"0":4.19766},H:{"0":1.5924}};
    +module.exports={C:{"5":0.21851,"31":0.00553,"34":0.00277,"50":0.00277,"66":0.00277,"68":0.00277,"88":0.01106,"96":0.13,"103":0.00277,"105":0.00277,"106":0.00277,"110":0.00277,"111":0.01106,"113":0.00277,"115":0.06085,"116":0.00277,"117":0.00553,"118":0.01383,"119":0.45362,"120":0.11617,_:"2 3 4 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 67 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 89 90 91 92 93 94 95 97 98 99 100 101 102 104 107 108 109 112 114 121 122 123 3.5 3.6"},D:{"38":0.00553,"41":0.01936,"49":0.0083,"56":0.00277,"58":0.08851,"68":0.00277,"69":0.00553,"71":0.00277,"73":0.00277,"78":0.00553,"79":0.09958,"80":0.00277,"83":0.0083,"84":0.02489,"86":0.01106,"87":0.02766,"88":0.01383,"89":0.01106,"91":0.00553,"93":0.0083,"94":0.00553,"95":0.0083,"96":0.00277,"97":0.00553,"98":0.0083,"99":0.0166,"100":0.00553,"101":0.01106,"102":0.0083,"103":0.09404,"104":0.01106,"105":0.01106,"106":0.03596,"107":0.0083,"108":0.02766,"109":1.01236,"110":0.0166,"111":0.03319,"112":0.02489,"113":0.0166,"114":0.05809,"115":0.05532,"116":0.28766,"117":0.39001,"118":3.63729,"119":12.91445,"120":0.0166,"121":0.00277,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 42 43 44 45 46 47 48 50 51 52 53 54 55 57 59 60 61 62 63 64 65 66 67 70 72 74 75 76 77 81 85 90 92 122"},F:{"28":0.0083,"46":0.01106,"95":0.01383,"102":0.41213,"103":0.04979,"104":0.30979,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00277,"13":0.00553,"18":0.00553,"84":0.00277,"92":0.0083,"95":0.0083,"98":0.00277,"100":0.00277,"103":0.00277,"105":0.00277,"106":0.00553,"107":0.0083,"109":0.01383,"110":0.00277,"111":0.00277,"112":0.01106,"113":0.00553,"114":0.01106,"115":0.00553,"116":0.01383,"117":0.06638,"118":0.47575,"119":2.73281,_:"14 15 16 17 79 80 81 83 85 86 87 88 89 90 91 93 94 96 97 99 101 102 104 108"},E:{"13":0.00277,"14":0.01936,"15":0.0083,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 6.1 7.1 9.1 11.1","5.1":0.01936,"10.1":0.00277,"12.1":0.00277,"13.1":0.03319,"14.1":0.07192,"15.1":0.0083,"15.2-15.3":0.01383,"15.4":0.01383,"15.5":0.07192,"15.6":0.18256,"16.0":0.01106,"16.1":0.11617,"16.2":0.02213,"16.3":0.13277,"16.4":0.07468,"16.5":0.1383,"16.6":0.63065,"17.0":0.30149,"17.1":0.4066,"17.2":0.0083},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00267,"5.0-5.1":0.00267,"6.0-6.1":0.00667,"7.0-7.1":0.00934,"8.1-8.4":0.00133,"9.0-9.2":0.01067,"9.3":0.03335,"10.0-10.2":0.00267,"10.3":0.04802,"11.0-11.2":0.02268,"11.3-11.4":0.02001,"12.0-12.1":0.01201,"12.2-12.5":0.21877,"13.0-13.1":0.00534,"13.2":0.02268,"13.3":0.01334,"13.4-13.7":0.03868,"14.0-14.4":0.10271,"14.5-14.8":0.16674,"15.0-15.1":0.06536,"15.2-15.3":0.08004,"15.4":0.08937,"15.5":0.12539,"15.6-15.7":0.65897,"16.0":0.30948,"16.1":0.62029,"16.2":0.29747,"16.3":0.55759,"16.4":0.11472,"16.5":0.29614,"16.6-16.7":5.01965,"17.0":1.50336,"17.1":2.52517,"17.2":0.07203},P:{"4":0.0937,"20":0.06247,"21":0.07288,"22":0.19782,"23":1.66585,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 12.0 13.0 15.0","7.2-7.4":0.04165,"11.1-11.2":0.02082,"14.0":0.01041,"16.0":0.01041,"17.0":0.01041,"18.0":0.02082,"19.0":0.02082},I:{"0":0.07918,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00024},K:{"0":2.49573,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.02766,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":5.60635},H:{"0":0},L:{"0":48.36292},R:{_:"0"},M:{"0":0.11574},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/RE.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/RE.js
    index 4e68a0899beada..d0553115646e40 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/RE.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/RE.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00446,"53":0,"54":0,"55":0.00446,"56":0.00446,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.00446,"78":0.05354,"79":0,"80":0,"81":0,"82":0.00446,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00446,"89":0.04462,"90":0,"91":0.02231,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.14278,"103":0,"104":0.00446,"105":0,"106":0,"107":0,"108":0,"109":0.00446,"110":0,"111":0.00446,"112":0.00446,"113":0.00892,"114":0.03123,"115":0.23649,"116":0.10263,"117":1.89189,"118":0.16063,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00446,"50":0,"51":0,"52":0,"53":0.00446,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0.00446,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00446,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.02231,"80":0,"81":0.00892,"83":0.02231,"84":0,"85":0.00892,"86":0,"87":0.00446,"88":0,"89":0,"90":0,"91":0.00446,"92":0,"93":0,"94":0.03123,"95":0,"96":0,"97":0.00446,"98":0,"99":0.00446,"100":0.00446,"101":0,"102":0,"103":0.04908,"104":0,"105":0.03123,"106":0.00446,"107":0.01785,"108":0.00892,"109":0.45066,"110":0.00446,"111":0.00892,"112":0.02677,"113":0.02231,"114":0.11601,"115":0.16063,"116":7.28645,"117":1.92312,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00892,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0.00446,"77":0.02677,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00446,"96":0,"97":0,"98":0,"99":0.01339,"100":0.09816,"101":0.29449,"102":0.33465,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0.00446,"16":0,"17":0.00446,"18":0.00446,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00892,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00446,"101":0,"102":0,"103":0,"104":0,"105":0.00446,"106":0.00446,"107":0.00446,"108":0,"109":0.02231,"110":0.00892,"111":0,"112":0.00892,"113":0.00446,"114":0.03123,"115":0.10709,"116":1.81157,"117":1.31183},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.02677,"15":0.00446,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.01339,"13.1":0.12047,"14.1":0.10709,"15.1":0.02231,"15.2-15.3":0.00892,"15.4":0.02677,"15.5":0.06247,"15.6":0.18294,"16.0":0.01785,"16.1":0.03123,"16.2":0.0357,"16.3":0.13386,"16.4":0.0357,"16.5":0.14278,"16.6":0.705,"17.0":0.04462,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00991,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.04459,"10.0-10.2":0,"10.3":0.15853,"11.0-11.2":0.00743,"11.3-11.4":0.01486,"12.0-12.1":0.00743,"12.2-12.5":0.93881,"13.0-13.1":0,"13.2":0,"13.3":0.00991,"13.4-13.7":0.07679,"14.0-14.4":0.19074,"14.5-14.8":0.47065,"15.0-15.1":0.06936,"15.2-15.3":0.06936,"15.4":0.07431,"15.5":0.1511,"15.6-15.7":1.27074,"16.0":0.69606,"16.1":1.43423,"16.2":0.50285,"16.3":1.08744,"16.4":0.16596,"16.5":0.73074,"16.6":14.22341,"17.0":2.03121,"17.1":0},P:{"4":0.05138,"20":0.09249,"21":0.25691,"22":3.13435,"5.0-5.4":0.01028,"6.2-6.4":0,"7.2-7.4":0.06166,"8.2":0,"9.2":0.01028,"10.1":0,"11.1-11.2":0.08221,"12.0":0.01028,"13.0":0.01028,"14.0":0.03083,"15.0":0.01028,"16.0":0.02055,"17.0":0.03083,"18.0":0.04111,"19.0":0.06166},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.0026,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.12202},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.02677,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":49.68042},R:{_:"0"},M:{"0":0.34889},Q:{"13.1":0},O:{"0":0.03877},H:{"0":0.31458}};
    +module.exports={C:{"48":0.00415,"52":0.00415,"54":0.00415,"55":0.0083,"56":0.00415,"60":0.01659,"78":0.14933,"84":0.00415,"88":0.00415,"89":0.07466,"91":0.08296,"99":0.00415,"102":0.04978,"104":0.0083,"106":0.00415,"107":0.0083,"108":0.0083,"109":0.00415,"110":0.00415,"112":0.00415,"113":0.01244,"114":0.00415,"115":0.73005,"116":0.01659,"117":0.08711,"118":0.07466,"119":2.96582,"120":0.94574,"121":0.00415,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 49 50 51 53 57 58 59 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 85 86 87 90 92 93 94 95 96 97 98 100 101 103 105 111 122 123 3.5 3.6"},D:{"49":0.01244,"54":0.00415,"58":0.00415,"63":0.00415,"65":0.00415,"71":0.00415,"77":0.00415,"79":0.01659,"81":0.03318,"85":0.00415,"86":0.0083,"87":0.04563,"88":0.0083,"89":0.00415,"91":0.01244,"94":0.00415,"96":0.00415,"97":0.0083,"98":0.00415,"99":0.0083,"100":0.01244,"103":0.12029,"104":0.00415,"105":0.02904,"106":0.00415,"107":0.02074,"108":0.00415,"109":1.03285,"110":0.00415,"111":0.0083,"112":0.02074,"113":0.02904,"114":0.09955,"115":0.04148,"116":0.29451,"117":0.59731,"118":4.4674,"119":15.16094,"120":0.00415,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 50 51 52 53 55 56 57 59 60 61 62 64 66 67 68 69 70 72 73 74 75 76 78 80 83 84 90 92 93 95 101 102 121 122"},F:{"46":0.01659,"93":0.00415,"95":0.00415,"101":0.00415,"102":0.7342,"103":0.12029,"104":0.79227,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 94 96 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"16":0.00415,"17":0.00415,"18":0.00415,"84":0.00415,"91":0.00415,"92":0.01659,"100":0.00415,"103":0.00415,"107":0.00415,"108":0.0083,"109":0.07052,"111":0.0083,"112":0.01659,"113":0.00415,"114":0.02074,"115":0.02489,"116":0.01244,"117":0.11614,"118":0.99552,"119":5.38825,_:"12 13 14 15 79 80 81 83 85 86 87 88 89 90 93 94 95 96 97 98 99 101 102 104 105 106 110"},E:{"13":0.01659,"14":0.04148,"15":0.00415,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 11.1","10.1":0.00415,"12.1":0.02074,"13.1":0.3194,"14.1":0.17007,"15.1":0.04563,"15.2-15.3":0.01244,"15.4":0.06637,"15.5":0.05807,"15.6":0.40236,"16.0":0.08711,"16.1":0.07881,"16.2":0.05807,"16.3":0.2074,"16.4":0.07466,"16.5":0.18666,"16.6":1.10752,"17.0":0.24888,"17.1":0.66368,"17.2":0.00415},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00345,"5.0-5.1":0.00345,"6.0-6.1":0.00863,"7.0-7.1":0.01208,"8.1-8.4":0.00173,"9.0-9.2":0.01381,"9.3":0.04316,"10.0-10.2":0.00345,"10.3":0.06215,"11.0-11.2":0.02935,"11.3-11.4":0.0259,"12.0-12.1":0.01554,"12.2-12.5":0.28312,"13.0-13.1":0.00691,"13.2":0.02935,"13.3":0.01726,"13.4-13.7":0.05006,"14.0-14.4":0.13293,"14.5-14.8":0.21579,"15.0-15.1":0.08459,"15.2-15.3":0.10358,"15.4":0.11566,"15.5":0.16228,"15.6-15.7":0.85281,"16.0":0.40051,"16.1":0.80275,"16.2":0.38497,"16.3":0.72161,"16.4":0.14847,"16.5":0.38325,"16.6-16.7":6.49622,"17.0":1.94559,"17.1":3.26796,"17.2":0.09322},P:{"4":0.0104,"20":0.06239,"21":0.12478,"22":0.32234,"23":2.86986,_:"5.0-5.4 6.2-6.4 8.2 10.1 12.0","7.2-7.4":0.05199,"9.2":0.0104,"11.1-11.2":0.0208,"13.0":0.0104,"14.0":0.0104,"15.0":0.0104,"16.0":0.0208,"17.0":0.06239,"18.0":0.04159,"19.0":0.05199},I:{"0":0.0524,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00004,"4.4":0,"4.4.3-4.4.4":0.00016},K:{"0":0.31038,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.05392,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.00585,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.0117},H:{"0":0.07},L:{"0":37.81474},R:{_:"0"},M:{"0":0.33942},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/RO.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/RO.js
    index a6678dac311921..5d7f5ee6916498 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/RO.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/RO.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00427,"46":0,"47":0,"48":0.0256,"49":0,"50":0,"51":0,"52":0.0256,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00427,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00427,"79":0,"80":0,"81":0,"82":0,"83":0.00427,"84":0,"85":0,"86":0.00853,"87":0,"88":0.00427,"89":0,"90":0,"91":0.00427,"92":0,"93":0,"94":0,"95":0.00427,"96":0,"97":0,"98":0,"99":0.00427,"100":0,"101":0,"102":0.02987,"103":0.18348,"104":0.00427,"105":0.00427,"106":0,"107":0,"108":0.00427,"109":0.00427,"110":0.00427,"111":0.00427,"112":0.00427,"113":0.00853,"114":0.00427,"115":0.18775,"116":0.11094,"117":0.96861,"118":0.06827,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0.00427,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.0128,"50":0,"51":0.00427,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0.00427,"60":0.17068,"61":0.00427,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.00427,"71":0.00427,"72":0,"73":0,"74":0,"75":0,"76":0.00427,"77":0.00853,"78":0.00427,"79":0.01707,"80":0.00427,"81":0.00853,"83":0,"84":0,"85":0.0128,"86":0.00427,"87":0.0128,"88":0.00427,"89":0,"90":0.00427,"91":0.02134,"92":0.00427,"93":0.00853,"94":0.00427,"95":0,"96":0.00427,"97":0.00427,"98":0.00427,"99":0.0128,"100":0.0256,"101":0,"102":0.0128,"103":0.0128,"104":0.00427,"105":0.0128,"106":0.00853,"107":0.0128,"108":0.01707,"109":0.76806,"110":0.01707,"111":0.0256,"112":0.02987,"113":0.02134,"114":0.07254,"115":0.12801,"116":9.81837,"117":2.06096,"118":0.00427,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00853,"73":0.00427,"74":0,"75":0,"76":0,"77":0.01707,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00853,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.06827,"96":0,"97":0,"98":0,"99":0.02134,"100":0.11948,"101":0.26882,"102":0.42243,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00427,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00427,"109":0.01707,"110":0,"111":0,"112":0.00427,"113":0.00853,"114":0.0128,"115":0.0256,"116":0.49924,"117":0.40963},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00853,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00427,"10.1":0,"11.1":0,"12.1":0.00427,"13.1":0.0128,"14.1":0.0128,"15.1":0.00427,"15.2-15.3":0,"15.4":0.00427,"15.5":0.00427,"15.6":0.02987,"16.0":0.00427,"16.1":0.00853,"16.2":0.0128,"16.3":0.02134,"16.4":0.00853,"16.5":0.02987,"16.6":0.16641,"17.0":0.02134,"17.1":0},G:{"8":0,"3.2":0.02995,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.11794,"6.0-6.1":0,"7.0-7.1":0.00374,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.02621,"10.0-10.2":0,"10.3":0.02246,"11.0-11.2":0.02434,"11.3-11.4":0.00187,"12.0-12.1":0.01498,"12.2-12.5":0.15538,"13.0-13.1":0.00187,"13.2":0,"13.3":0.1741,"13.4-13.7":0.05429,"14.0-14.4":0.13292,"14.5-14.8":0.22652,"15.0-15.1":0.08986,"15.2-15.3":0.07488,"15.4":0.08424,"15.5":0.14976,"15.6-15.7":1.1251,"16.0":0.61965,"16.1":0.91543,"16.2":0.49422,"16.3":0.87612,"16.4":0.19095,"16.5":0.59531,"16.6":10.49472,"17.0":1.79343,"17.1":0.00562},P:{"4":0.08101,"20":0.27341,"21":0.17215,"22":2.92648,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.01013,"8.2":0,"9.2":0.01013,"10.1":0,"11.1-11.2":0.03038,"12.0":0.01013,"13.0":0.03038,"14.0":0.02025,"15.0":0.01013,"16.0":0.03038,"17.0":0.02025,"18.0":0.03038,"19.0":0.07088},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.0277,"4.2-4.3":0.04432,"4.4":0,"4.4.3-4.4.4":0.19944},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00427,"9":0,"10":0,"11":0.0256,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":57.07458},R:{_:"0"},M:{"0":0.21212},Q:{"13.1":0},O:{"0":0.04013},H:{"0":0.27681}};
    +module.exports={C:{"48":0.17248,"52":0.06809,"56":0.00454,"60":0.00908,"66":0.04085,"67":0.00454,"68":0.00454,"72":0.07262,"78":0.00908,"80":0.00454,"81":0.00454,"83":0.00908,"86":0.01816,"88":0.00908,"95":0.00908,"99":0.00454,"100":0.00454,"102":0.00908,"103":0.14979,"104":0.00454,"105":0.00454,"106":0.00454,"108":0.02723,"109":0.00454,"110":0.00454,"111":0.00454,"112":0.00454,"113":0.00908,"114":0.00454,"115":0.42213,"116":0.00908,"117":0.01362,"118":0.05901,"119":1.49333,"120":0.66723,"121":0.00454,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 49 50 51 53 54 55 57 58 59 61 62 63 64 65 69 70 71 73 74 75 76 77 79 82 84 85 87 89 90 91 92 93 94 96 97 98 101 107 122 123 3.5 3.6"},D:{"38":0.00454,"41":0.01362,"47":0.00454,"49":0.03177,"51":0.00454,"57":0.00454,"58":0.01362,"60":0.31319,"61":0.00908,"66":0.00454,"67":0.00454,"68":0.00454,"70":0.00908,"71":0.00908,"72":0.00454,"73":0.05901,"74":0.04993,"75":0.00454,"76":0.00908,"77":0.00454,"78":0.00454,"79":0.03631,"80":0.00454,"81":0.00908,"83":0.00454,"84":0.00908,"85":0.02723,"86":0.00908,"87":0.01362,"88":0.00908,"89":0.00454,"90":0.00908,"91":0.05447,"92":0.00908,"93":0.00454,"94":0.00908,"95":0.00454,"96":0.00454,"97":0.00454,"98":0.00908,"99":0.01362,"100":0.05447,"101":0.00454,"102":0.01816,"103":0.0227,"104":0.00454,"105":0.03177,"106":0.01816,"107":0.01362,"108":0.0227,"109":2.36482,"110":0.0227,"111":0.02723,"112":0.03631,"113":0.03177,"114":0.06355,"115":0.04539,"116":0.14525,"117":0.23149,"118":5.67829,"119":24.82833,"120":0.00908,"121":0.00454,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 42 43 44 45 46 48 50 52 53 54 55 56 59 62 63 64 65 69 122"},F:{"36":0.00454,"46":0.00454,"58":0.00454,"79":0.00454,"85":0.01362,"95":0.07716,"99":0.00454,"100":0.00454,"102":0.65816,"103":0.19518,"104":0.91688,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 86 87 88 89 90 91 92 93 94 96 97 98 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"14":0.00454,"17":0.00454,"18":0.01816,"85":0.00454,"92":0.00454,"108":0.00454,"109":0.02723,"110":0.00454,"112":0.00454,"113":0.00454,"114":0.00908,"115":0.01362,"116":0.01362,"117":0.04085,"118":0.33135,"119":1.7112,_:"12 13 15 16 79 80 81 83 84 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 111"},E:{"12":0.00454,"14":0.01362,"15":0.00454,_:"0 4 5 6 7 8 9 10 11 13 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.01362,"13.1":0.02723,"14.1":0.0227,"15.1":0.00454,"15.2-15.3":0.00454,"15.4":0.00908,"15.5":0.00908,"15.6":0.06355,"16.0":0.00908,"16.1":0.0227,"16.2":0.01816,"16.3":0.03631,"16.4":0.01816,"16.5":0.03631,"16.6":0.1861,"17.0":0.10894,"17.1":0.21787,"17.2":0.00454},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00227,"5.0-5.1":0.00227,"6.0-6.1":0.00568,"7.0-7.1":0.00795,"8.1-8.4":0.00114,"9.0-9.2":0.00908,"9.3":0.02838,"10.0-10.2":0.00227,"10.3":0.04087,"11.0-11.2":0.0193,"11.3-11.4":0.01703,"12.0-12.1":0.01022,"12.2-12.5":0.1862,"13.0-13.1":0.00454,"13.2":0.0193,"13.3":0.01135,"13.4-13.7":0.03292,"14.0-14.4":0.08742,"14.5-14.8":0.14192,"15.0-15.1":0.05563,"15.2-15.3":0.06812,"15.4":0.07607,"15.5":0.10672,"15.6-15.7":0.56086,"16.0":0.2634,"16.1":0.52793,"16.2":0.25318,"16.3":0.47457,"16.4":0.09764,"16.5":0.25205,"16.6-16.7":4.27229,"17.0":1.27953,"17.1":2.1492,"17.2":0.06131},P:{"4":0.0816,"20":0.2448,"21":0.102,"22":0.3468,"23":2.70297,_:"5.0-5.4 6.2-6.4 8.2 10.1 12.0","7.2-7.4":0.0102,"9.2":0.0102,"11.1-11.2":0.0204,"13.0":0.0306,"14.0":0.0204,"15.0":0.0102,"16.0":0.0306,"17.0":0.0204,"18.0":0.0204,"19.0":0.051},I:{"0":0.12497,"3":0.00001,"4":0.00003,"2.1":0,"2.2":0.00003,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00009,"4.4":0,"4.4.3-4.4.4":0.00038},K:{"0":0.29766,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00454,"11":0.05447,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.03823},H:{"0":0.03},L:{"0":39.80877},R:{_:"0"},M:{"0":0.18567},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/RS.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/RS.js
    index 7e421555995af7..29fe06d2e98e16 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/RS.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/RS.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00792,"49":0,"50":0,"51":0,"52":0.03961,"53":0,"54":0,"55":0,"56":0.00396,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00396,"66":0,"67":0,"68":0.00396,"69":0,"70":0,"71":0,"72":0.00396,"73":0.00396,"74":0,"75":0.00396,"76":0,"77":0.01188,"78":0.00792,"79":0,"80":0.00396,"81":0.00396,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.01188,"89":0,"90":0,"91":0.00396,"92":0,"93":0,"94":0.00396,"95":0,"96":0.00396,"97":0,"98":0,"99":0.01584,"100":0.00396,"101":0.00396,"102":0.01981,"103":0.00396,"104":0.00396,"105":0.00396,"106":0.00396,"107":0.00396,"108":0.00396,"109":0.00396,"110":0.00396,"111":0.00396,"112":0.01584,"113":0.01981,"114":0.01584,"115":0.47136,"116":0.06734,"117":1.03778,"118":0.08714,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00396,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00396,"48":0,"49":0.02377,"50":0,"51":0,"52":0,"53":0.00396,"54":0,"55":0.00396,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.03169,"69":0,"70":0.00396,"71":0,"72":0,"73":0,"74":0,"75":0.00396,"76":0.00396,"77":0.00792,"78":0.01188,"79":0.05545,"80":0.01188,"81":0.01584,"83":0.01981,"84":0.00792,"85":0.02773,"86":0.00396,"87":0.03961,"88":0.01188,"89":0.00396,"90":0.00792,"91":0.00396,"92":0.01188,"93":0.00396,"94":0.00396,"95":0.00396,"96":0.00792,"97":0.00792,"98":0.00396,"99":0.01981,"100":0.00792,"101":0.00396,"102":0.00792,"103":0.02773,"104":0.00792,"105":0.03961,"106":0.01981,"107":0.03169,"108":0.03961,"109":1.97258,"110":0.03169,"111":0.03169,"112":0.04753,"113":0.04357,"114":0.0911,"115":0.15448,"116":6.09598,"117":1.6557,"118":0.00792,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00396,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00396,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.00396,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.00792,"71":0,"72":0.00792,"73":0.00396,"74":0,"75":0,"76":0.00396,"77":0.03565,"78":0,"79":0.00396,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.01188,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0.00396,"94":0.00792,"95":0.10695,"96":0,"97":0.00396,"98":0,"99":0.00396,"100":0.06734,"101":0.32876,"102":0.35649,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00396,"18":0.00396,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0.00396,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00396,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00396,"109":0.02377,"110":0.00396,"111":0.00396,"112":0.00396,"113":0.00396,"114":0.00792,"115":0.02377,"116":0.40402,"117":0.32084},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00396,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00396,"13.1":0.02377,"14.1":0.01188,"15.1":0.00396,"15.2-15.3":0,"15.4":0.00396,"15.5":0.00792,"15.6":0.03169,"16.0":0.00396,"16.1":0.00792,"16.2":0.00792,"16.3":0.01188,"16.4":0.00792,"16.5":0.02773,"16.6":0.12675,"17.0":0.01584,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.0026,"6.0-6.1":0,"7.0-7.1":0.02859,"8.1-8.4":0.0104,"9.0-9.2":0,"9.3":0.04288,"10.0-10.2":0.0052,"10.3":0.05587,"11.0-11.2":0.02729,"11.3-11.4":0.0078,"12.0-12.1":0.0065,"12.2-12.5":0.15983,"13.0-13.1":0.0039,"13.2":0.01299,"13.3":0.08186,"13.4-13.7":0.04288,"14.0-14.4":0.07666,"14.5-14.8":0.18841,"15.0-15.1":0.05587,"15.2-15.3":0.06757,"15.4":0.07277,"15.5":0.13644,"15.6-15.7":1.06161,"16.0":0.41451,"16.1":0.67699,"16.2":0.33525,"16.3":0.62501,"16.4":0.14164,"16.5":0.40541,"16.6":7.36113,"17.0":0.74586,"17.1":0},P:{"4":0.10162,"20":0.07114,"21":0.1626,"22":2.76415,"5.0-5.4":0.02032,"6.2-6.4":0,"7.2-7.4":0.01016,"8.2":0,"9.2":0.01016,"10.1":0,"11.1-11.2":0.03049,"12.0":0,"13.0":0.02032,"14.0":0.04065,"15.0":0.01016,"16.0":0.02032,"17.0":0.02032,"18.0":0.02032,"19.0":0.05081},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.03641,"4.2-4.3":0.00497,"4.4":0,"4.4.3-4.4.4":0.04635},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00417,"9":0,"10":0,"11":0.07505,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":66.26746},R:{_:"0"},M:{"0":0.21137},Q:{"13.1":0},O:{"0":0.02416},H:{"0":0.52028}};
    +module.exports={C:{"35":0.00408,"47":0.00408,"48":0.07744,"52":0.11005,"56":0.00408,"60":0.00408,"61":0.00408,"65":0.00408,"67":0.00408,"68":0.00815,"70":0.00408,"71":0.00408,"72":0.00815,"73":0.00408,"75":0.00815,"77":0.00408,"78":0.02038,"79":0.00408,"80":0.00815,"81":0.00815,"82":0.00408,"88":0.02038,"92":0.00408,"94":0.00408,"96":0.00408,"97":0.00408,"99":0.01223,"100":0.00408,"101":0.00408,"102":0.00408,"103":0.00408,"104":0.00815,"105":0.00408,"106":0.00408,"107":0.0163,"108":0.01223,"109":0.00408,"110":0.00408,"111":0.00408,"112":0.02853,"113":0.04076,"114":0.00815,"115":3.6847,"116":0.03261,"117":0.01223,"118":0.05706,"119":1.86273,"120":0.66031,"121":0.00408,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 36 37 38 39 40 41 42 43 44 45 46 49 50 51 53 54 55 57 58 59 62 63 64 66 69 74 76 83 84 85 86 87 89 90 91 93 95 98 122 123 3.5 3.6"},D:{"33":0.00408,"38":0.00815,"47":0.00815,"48":0.00408,"49":0.04891,"53":0.01223,"55":0.00408,"56":0.00408,"58":0.00408,"63":0.00408,"65":0.00408,"66":0.00408,"67":0.00408,"68":0.00815,"69":0.00408,"70":0.00408,"71":0.00408,"73":0.00408,"74":0.00408,"75":0.00815,"76":0.00408,"78":0.0163,"79":0.24864,"80":0.00815,"81":0.02038,"83":0.02853,"84":0.02446,"85":0.07744,"86":0.01223,"87":0.06522,"88":0.0163,"89":0.00815,"90":0.02038,"91":0.00408,"92":0.0163,"93":0.01223,"94":0.0163,"95":0.01223,"96":0.01223,"97":0.01223,"98":0.00815,"99":0.02446,"100":0.0163,"101":0.01223,"102":0.02446,"103":0.06522,"104":0.01223,"105":0.02853,"106":0.03668,"107":0.07744,"108":0.06522,"109":4.24719,"110":0.06114,"111":0.03668,"112":0.04891,"113":0.02446,"114":0.05706,"115":0.05299,"116":0.17119,"117":0.2894,"118":4.0923,"119":15.1994,"120":0.00815,"121":0.00815,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 37 39 40 41 42 43 44 45 46 50 51 52 54 57 59 60 61 62 64 72 77 122"},F:{"28":0.01223,"36":0.00408,"40":0.00408,"46":0.00408,"48":0.00408,"70":0.00408,"71":0.00408,"79":0.00408,"85":0.02446,"86":0.00815,"94":0.00408,"95":0.2038,"99":0.00408,"101":0.00408,"102":0.43613,"103":0.24864,"104":0.93748,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 41 42 43 44 45 47 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 72 73 74 75 76 77 78 80 81 82 83 84 87 88 89 90 91 92 93 96 97 98 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.00815,"85":0.00815,"92":0.00408,"103":0.00815,"106":0.01223,"107":0.00815,"108":0.00408,"109":0.02853,"110":0.00408,"111":0.00408,"113":0.00408,"114":0.00408,"115":0.00408,"116":0.00815,"117":0.04076,"118":0.31793,"119":1.53665,_:"12 13 14 15 16 17 79 80 81 83 84 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 104 105 112"},E:{"14":0.01223,"15":0.0163,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 5.1 6.1 7.1 10.1 11.1","9.1":0.00408,"12.1":0.00408,"13.1":0.04076,"14.1":0.03668,"15.1":0.00408,"15.2-15.3":0.00408,"15.4":0.00815,"15.5":0.00815,"15.6":0.12636,"16.0":0.01223,"16.1":0.01223,"16.2":0.01223,"16.3":0.04076,"16.4":0.01223,"16.5":0.02853,"16.6":0.19157,"17.0":0.11005,"17.1":0.15489,"17.2":0.00408},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00164,"5.0-5.1":0.00164,"6.0-6.1":0.0041,"7.0-7.1":0.00574,"8.1-8.4":0.00082,"9.0-9.2":0.00655,"9.3":0.02048,"10.0-10.2":0.00164,"10.3":0.02949,"11.0-11.2":0.01393,"11.3-11.4":0.01229,"12.0-12.1":0.00737,"12.2-12.5":0.13436,"13.0-13.1":0.00328,"13.2":0.01393,"13.3":0.00819,"13.4-13.7":0.02376,"14.0-14.4":0.06309,"14.5-14.8":0.10241,"15.0-15.1":0.04015,"15.2-15.3":0.04916,"15.4":0.05489,"15.5":0.07701,"15.6-15.7":0.40473,"16.0":0.19008,"16.1":0.38097,"16.2":0.1827,"16.3":0.34246,"16.4":0.07046,"16.5":0.18188,"16.6-16.7":3.08299,"17.0":0.92334,"17.1":1.55091,"17.2":0.04424},P:{"4":0.11308,"20":0.04112,"21":0.08224,"22":0.24672,"23":2.40549,"5.0-5.4":0.02056,_:"6.2-6.4 8.2 9.2 10.1","7.2-7.4":0.01028,"11.1-11.2":0.03084,"12.0":0.01028,"13.0":0.06168,"14.0":0.02056,"15.0":0.01028,"16.0":0.02056,"17.0":0.02056,"18.0":0.01028,"19.0":0.04112},I:{"0":0.06484,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00005,"4.4":0,"4.4.3-4.4.4":0.0002},K:{"0":0.40392,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.01689,"9":0.00422,"10":0.00844,"11":0.32506,_:"6 7 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.02962},H:{"0":0.07},L:{"0":49.89682},R:{_:"0"},M:{"0":0.19549},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/RU.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/RU.js
    index b72ff1d280b165..e2ff70db674dd8 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/RU.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/RU.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0.00563,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.01688,"46":0.00563,"47":0.00563,"48":0.01688,"49":0.00563,"50":0.02251,"51":0.00563,"52":0.06754,"53":0.01688,"54":0,"55":0,"56":0.01126,"57":0,"58":0,"59":0,"60":0.00563,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.00563,"68":0.01688,"69":0.01126,"70":0.00563,"71":0.01126,"72":0.01126,"73":0.00563,"74":0.00563,"75":0.01126,"76":0.00563,"77":0.01126,"78":0.01688,"79":0.01688,"80":0.00563,"81":0.01126,"82":0.01126,"83":0.01126,"84":0.00563,"85":0.00563,"86":0,"87":0.00563,"88":0.00563,"89":0.00563,"90":0.00563,"91":0.01126,"92":0,"93":0,"94":0.00563,"95":0.00563,"96":0.00563,"97":0.00563,"98":0.01126,"99":0.00563,"100":0,"101":0.01126,"102":0.05065,"103":0.01126,"104":0.01688,"105":0.01126,"106":0.01126,"107":0.00563,"108":0.02251,"109":0.01688,"110":0.01126,"111":0.01688,"112":0.01688,"113":0.02251,"114":0.0394,"115":0.30954,"116":0.12944,"117":0.66973,"118":0.05065,"119":0,"120":0,"3.5":0,"3.6":0.00563},D:{"4":0.01126,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0.00563,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.04502,"50":0,"51":0.02251,"52":0.01126,"53":0.00563,"54":0,"55":0.00563,"56":0.01126,"57":0,"58":0.00563,"59":0,"60":0,"61":0.00563,"62":0,"63":0,"64":0.00563,"65":0,"66":0.00563,"67":0.00563,"68":0.04502,"69":0.02814,"70":0.03377,"71":0.0394,"72":0.05065,"73":0.03377,"74":0.05628,"75":0.09005,"76":0.09005,"77":0.10693,"78":0.09568,"79":0.11256,"80":0.13507,"81":0.13507,"83":0.11256,"84":0.05628,"85":0.11256,"86":0.15196,"87":0.16321,"88":0.1407,"89":0.10693,"90":0.34331,"91":0.06754,"92":0.02814,"93":0.02814,"94":0.02814,"95":0.02814,"96":0.05628,"97":0.06191,"98":0.04502,"99":0.05628,"100":0.06191,"101":0.04502,"102":0.13507,"103":0.10693,"104":0.06754,"105":0.1013,"106":0.16884,"107":0.29828,"108":0.12944,"109":1.49705,"110":0.07879,"111":0.09568,"112":0.09005,"113":0.39396,"114":0.86671,"115":1.20439,"116":5.38037,"117":1.33384,"118":0.00563,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.01688,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00563,"54":0.01688,"55":0.01126,"56":0,"57":0,"58":0,"60":0.00563,"62":0.02251,"63":0.02251,"64":0.01126,"65":0.01688,"66":0.01126,"67":0.02251,"68":0.02251,"69":0.00563,"70":0.01688,"71":0.01126,"72":0.02251,"73":0.01688,"74":0.01126,"75":0.01126,"76":0.01126,"77":0.06754,"78":0.00563,"79":0.02814,"80":0.00563,"81":0.00563,"82":0.01126,"83":0.01688,"84":0.00563,"85":0.0394,"86":0.01688,"87":0.01126,"88":0,"89":0.00563,"90":0.01126,"91":0.00563,"92":0.01126,"93":0.00563,"94":0.00563,"95":0.41647,"96":0.02251,"97":0,"98":0.00563,"99":0.0394,"100":0.19698,"101":0.82732,"102":0.77666,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.01126,"18":0.01688,"79":0.00563,"80":0.01126,"81":0.01126,"83":0.01688,"84":0.02251,"85":0.01126,"86":0.01126,"87":0.01688,"88":0.01126,"89":0.01126,"90":0.07879,"91":0.00563,"92":0.01126,"93":0,"94":0.00563,"95":0.00563,"96":0.00563,"97":0.01126,"98":0.00563,"99":0.01126,"100":0.00563,"101":0.00563,"102":0.00563,"103":0.00563,"104":0,"105":0.01126,"106":0.00563,"107":0.01126,"108":0.01126,"109":0.03377,"110":0.01126,"111":0.01688,"112":0.00563,"113":0.02251,"114":0.11819,"115":0.09005,"116":0.73164,"117":0.6022},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00563,"14":0.01688,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.21386,"10.1":0,"11.1":0,"12.1":0.01126,"13.1":0.01688,"14.1":0.03377,"15.1":0.00563,"15.2-15.3":0.00563,"15.4":0.01126,"15.5":0.01126,"15.6":0.06754,"16.0":0.00563,"16.1":0.02814,"16.2":0.01688,"16.3":0.0394,"16.4":0.14633,"16.5":0.20261,"16.6":0.22512,"17.0":0.02814,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.0074,"8.1-8.4":0.00247,"9.0-9.2":0.05429,"9.3":0.06416,"10.0-10.2":0.02221,"10.3":0.06416,"11.0-11.2":0.07403,"11.3-11.4":0.02714,"12.0-12.1":0.04935,"12.2-12.5":0.30105,"13.0-13.1":0.03948,"13.2":0.02961,"13.3":10.84016,"13.4-13.7":0.06909,"14.0-14.4":0.21221,"14.5-14.8":0.32079,"15.0-15.1":0.24182,"15.2-15.3":0.33066,"15.4":0.15052,"15.5":0.15793,"15.6-15.7":1.06107,"16.0":0.69833,"16.1":0.90561,"16.2":0.54781,"16.3":0.83158,"16.4":0.2591,"16.5":0.68106,"16.6":5.51015,"17.0":1.00925,"17.1":0},P:{"4":0.04162,"20":0.03121,"21":0.06243,"22":0.57223,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.0104,"8.2":0,"9.2":0.0104,"10.1":0,"11.1-11.2":0.0104,"12.0":0.0104,"13.0":0.0104,"14.0":0,"15.0":0,"16.0":0.0104,"17.0":0.02081,"18.0":0.0104,"19.0":0.02081},I:{"0":0,"3":0.01738,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00174,"4.2-4.3":0.00348,"4.4":0,"4.4.3-4.4.4":0.03303},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.00582,"7":0,"8":0.02326,"9":0.01745,"10":0.01163,"11":0.11631,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":35.60404},R:{_:"0"},M:{"0":0.27981},Q:{"13.1":0.00437},O:{"0":0.14865},H:{"0":0.62915}};
    +module.exports={C:{"26":0.00553,"31":0.00553,"35":0.01106,"48":0.07188,"50":0.00553,"51":0.00553,"52":0.09952,"56":0.00553,"60":0.00553,"66":0.00553,"67":0.00553,"68":0.01659,"69":0.00553,"70":0.00553,"71":0.00553,"72":0.01659,"73":0.00553,"74":0.00553,"75":0.01659,"76":0.00553,"77":0.00553,"78":0.01659,"79":0.00553,"80":0.00553,"81":0.01659,"82":0.00553,"83":0.00553,"87":0.00553,"88":0.00553,"89":0.00553,"90":0.00553,"91":0.01106,"93":0.01659,"94":0.00553,"95":0.00553,"96":0.00553,"97":0.00553,"98":0.00553,"99":0.01106,"100":0.00553,"101":0.00553,"102":0.02212,"103":0.02765,"104":0.03317,"105":0.01106,"106":0.00553,"107":0.01659,"108":0.02212,"109":0.01106,"110":0.02765,"111":0.02212,"112":0.01106,"113":0.02212,"114":0.02212,"115":0.71324,"116":0.01106,"117":0.04423,"118":0.16587,"119":1.16109,"120":0.33174,"121":0.00553,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 27 28 29 30 32 33 34 36 37 38 39 40 41 42 43 44 45 46 47 49 53 54 55 57 58 59 61 62 63 64 65 84 85 86 92 122 123 3.5 3.6"},D:{"22":0.00553,"25":0.00553,"26":0.00553,"38":0.00553,"41":0.00553,"48":0.00553,"49":0.07188,"51":0.02212,"53":0.00553,"55":0.00553,"56":0.01659,"57":0.00553,"58":0.02212,"61":0.01106,"65":0.00553,"67":0.01106,"68":0.04423,"69":0.03317,"70":0.03317,"71":0.0387,"72":0.05529,"73":0.01659,"74":0.05529,"75":0.0387,"76":0.05529,"77":0.03317,"78":0.04976,"79":0.11611,"80":0.08294,"81":0.08294,"83":0.06082,"84":0.0387,"85":0.11058,"86":0.11611,"87":0.10505,"88":0.09399,"89":0.08294,"90":0.07188,"91":0.03317,"92":0.01106,"93":0.02765,"94":0.0387,"95":0.01106,"96":0.01659,"97":0.03317,"98":0.03317,"99":0.0387,"100":0.01659,"101":0.0387,"102":0.14928,"103":0.04976,"104":0.03317,"105":0.12717,"106":0.19904,"107":0.07741,"108":0.13823,"109":2.81426,"110":0.06635,"111":0.11058,"112":0.08846,"113":0.24328,"114":0.37044,"115":0.07188,"116":0.36491,"117":0.5529,"118":3.07965,"119":12.56189,"120":0.01106,"121":0.01106,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 23 24 27 28 29 30 31 32 33 34 35 36 37 39 40 42 43 44 45 46 47 50 52 54 59 60 62 63 64 66 122"},F:{"36":0.03317,"46":0.00553,"49":0.00553,"53":0.00553,"54":0.01106,"55":0.01106,"57":0.00553,"60":0.00553,"64":0.00553,"65":0.00553,"67":0.00553,"68":0.00553,"70":0.00553,"71":0.00553,"72":0.00553,"73":0.00553,"74":0.00553,"75":0.00553,"76":0.00553,"77":0.01106,"79":0.04423,"80":0.00553,"82":0.01106,"83":0.00553,"84":0.01106,"85":0.06635,"86":0.02212,"87":0.00553,"89":0.00553,"90":0.00553,"91":0.00553,"92":0.01106,"93":0.01106,"94":0.01106,"95":0.90676,"96":0.00553,"97":0.00553,"98":0.00553,"99":0.01106,"100":0.00553,"101":0.01106,"102":1.21638,"103":0.69113,"104":2.33324,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 47 48 50 51 52 56 58 62 63 66 69 78 81 88 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.00553},B:{"14":0.00553,"18":0.01659,"79":0.00553,"80":0.01106,"81":0.01106,"83":0.01106,"84":0.01659,"85":0.00553,"86":0.01106,"87":0.01106,"88":0.01106,"89":0.01106,"90":0.01106,"92":0.02212,"99":0.00553,"100":0.00553,"103":0.00553,"106":0.00553,"107":0.02765,"108":0.01106,"109":0.07188,"110":0.01106,"111":0.01106,"112":0.01106,"113":0.01659,"114":0.0387,"115":0.01106,"116":0.01659,"117":0.05529,"118":0.65795,"119":3.05754,_:"12 13 15 16 17 91 93 94 95 96 97 98 101 102 104 105"},E:{"10":0.00553,"13":0.00553,"14":0.06082,"15":0.00553,_:"0 4 5 6 7 8 9 11 12 3.1 3.2 6.1 7.1 10.1","5.1":0.00553,"9.1":0.26539,"11.1":0.00553,"12.1":0.01106,"13.1":0.0387,"14.1":0.08294,"15.1":0.01659,"15.2-15.3":0.01106,"15.4":0.01659,"15.5":0.02765,"15.6":0.17693,"16.0":0.01659,"16.1":0.04976,"16.2":0.0387,"16.3":0.08294,"16.4":0.03317,"16.5":0.07741,"16.6":0.32068,"17.0":0.18246,"17.1":0.25986,"17.2":0.00553},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00215,"5.0-5.1":0.00215,"6.0-6.1":0.00537,"7.0-7.1":0.00751,"8.1-8.4":0.00107,"9.0-9.2":0.00858,"9.3":0.02683,"10.0-10.2":0.00215,"10.3":0.03863,"11.0-11.2":0.01824,"11.3-11.4":0.0161,"12.0-12.1":0.00966,"12.2-12.5":0.17598,"13.0-13.1":0.00429,"13.2":0.01824,"13.3":0.01073,"13.4-13.7":0.03112,"14.0-14.4":0.08262,"14.5-14.8":0.13413,"15.0-15.1":0.05258,"15.2-15.3":0.06438,"15.4":0.07189,"15.5":0.10087,"15.6-15.7":0.53008,"16.0":0.24895,"16.1":0.49896,"16.2":0.23929,"16.3":0.44853,"16.4":0.09228,"16.5":0.23821,"16.6-16.7":4.03785,"17.0":1.20932,"17.1":2.03126,"17.2":0.05794},P:{"4":0.05274,"20":0.0211,"21":0.04219,"22":0.11603,"23":0.74891,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 12.0 15.0","7.2-7.4":0.0211,"11.1-11.2":0.01055,"13.0":0.01055,"14.0":0.01055,"16.0":0.01055,"17.0":0.01055,"18.0":0.01055,"19.0":0.0211},I:{"0":0.03114,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.00009},K:{"0":0.84502,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00605,"11":0.18747,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.17884},H:{"0":0},L:{"0":26.59627},R:{_:"0"},M:{"0":0.16096},Q:{"13.1":0.00447}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/RW.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/RW.js
    index d0e891ac6c9299..49a46cebba8701 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/RW.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/RW.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0.00409,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00409,"103":0,"104":0,"105":0.00817,"106":0,"107":0,"108":0,"109":0.01226,"110":0,"111":0.03677,"112":0.01226,"113":0.01634,"114":0.00817,"115":0.08987,"116":0.04494,"117":0.55965,"118":0.06128,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00409,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00409,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0.00409,"60":0,"61":0,"62":0.00409,"63":0,"64":0.00817,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.00409,"71":0,"72":0.01226,"73":0,"74":0.00817,"75":0,"76":0,"77":0.00409,"78":0.00409,"79":0.01634,"80":0.04085,"81":0.00409,"83":0,"84":0.00409,"85":0,"86":0,"87":0.00817,"88":0.01634,"89":0.00409,"90":0.00409,"91":0.02043,"92":0.00409,"93":0.00409,"94":0.00409,"95":0.01226,"96":0.00409,"97":0,"98":0.02451,"99":0.00817,"100":0,"101":0.00409,"102":0.00817,"103":0.04085,"104":0.00817,"105":0.01634,"106":0.01634,"107":0.00409,"108":0.01226,"109":0.58416,"110":0.00817,"111":0.03268,"112":0.01634,"113":0.0286,"114":0.17974,"115":0.26144,"116":7.65121,"117":1.80557,"118":0.01226,"119":0.00409,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0.00409,"25":0,"26":0,"27":0.00409,"28":0.00409,"29":0,"30":0,"31":0.00409,"32":0,"33":0.00409,"34":0,"35":0,"36":0,"37":0.00409,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00409,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0.01634,"52":0,"53":0.00409,"54":0,"55":0,"56":0.01226,"57":0.00409,"58":0.00409,"60":0.01634,"62":0,"63":0.02043,"64":0.00817,"65":0,"66":0.01226,"67":0.05311,"68":0.01226,"69":0.10621,"70":0.05719,"71":0.37991,"72":0.45752,"73":0.0817,"74":0,"75":0,"76":0,"77":0.02043,"78":0,"79":0.00817,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01226,"96":0,"97":0,"98":0,"99":0,"100":0.01226,"101":0.12255,"102":0.20834,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00409},B:{"12":0.01634,"13":0.00409,"14":0,"15":0.00409,"16":0.00409,"17":0.00817,"18":0.03677,"79":0,"80":0,"81":0,"83":0,"84":0.00409,"85":0,"86":0,"87":0,"88":0,"89":0.00817,"90":0.00409,"91":0,"92":0.02451,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.0286,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00409,"109":0.00409,"110":0.00409,"111":0.00817,"112":0.01634,"113":0.00409,"114":0.03268,"115":0.06945,"116":0.69854,"117":0.58824},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00409,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00817,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00409,"14.1":0.02043,"15.1":0.00409,"15.2-15.3":0,"15.4":0.04494,"15.5":0.00409,"15.6":0.02043,"16.0":0.00409,"16.1":0.00409,"16.2":0.00409,"16.3":0.01226,"16.4":0.01634,"16.5":0.0286,"16.6":0.13889,"17.0":0.02043,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00181,"6.0-6.1":0,"7.0-7.1":0.00633,"8.1-8.4":0.0009,"9.0-9.2":0,"9.3":0.03256,"10.0-10.2":0,"10.3":0.08411,"11.0-11.2":0.00452,"11.3-11.4":0.00271,"12.0-12.1":0.00452,"12.2-12.5":0.88906,"13.0-13.1":0.0199,"13.2":0,"13.3":0.01357,"13.4-13.7":0.05336,"14.0-14.4":0.11125,"14.5-14.8":0.14019,"15.0-15.1":0.06964,"15.2-15.3":0.123,"15.4":0.11758,"15.5":0.15195,"15.6-15.7":1.93097,"16.0":0.18993,"16.1":0.34911,"16.2":0.29213,"16.3":0.46669,"16.4":0.09949,"16.5":0.32107,"16.6":2.96383,"17.0":0.47483,"17.1":0.00181},P:{"4":0.06004,"20":0.02001,"21":0.30019,"22":0.52032,"5.0-5.4":0.03002,"6.2-6.4":0.01001,"7.2-7.4":0.07004,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01001,"12.0":0.01001,"13.0":0,"14.0":0.01001,"15.0":0,"16.0":0.03002,"17.0":0.01001,"18.0":0.02001,"19.0":0.10006},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00062,"4.2-4.3":0.00186,"4.4":0,"4.4.3-4.4.4":0.07429},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.04085,"5.5":0},S:{"2.5":0.08873,_:"3.0-3.1"},J:{"7":0,"10":0.00592},N:{"10":0,"11":0},L:{"0":60.25525},R:{_:"0"},M:{"0":0.1183},Q:{"13.1":0},O:{"0":0.16562},H:{"0":9.4863}};
    +module.exports={C:{"31":0.04411,"34":0.00882,"40":0.00441,"47":0.00441,"49":0.00441,"50":0.00441,"51":0.00441,"54":0.00441,"67":0.00441,"72":0.00441,"80":0.00441,"88":0.00441,"89":0.00441,"102":0.00441,"106":0.00441,"108":0.00441,"112":0.00441,"113":0.00441,"114":0.00441,"115":0.20732,"116":0.00441,"117":0.00882,"118":0.03088,"119":1.27037,"120":0.36611,"121":0.00441,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 33 35 36 37 38 39 41 42 43 44 45 46 48 52 53 55 56 57 58 59 60 61 62 63 64 65 66 68 69 70 71 73 74 75 76 77 78 79 81 82 83 84 85 86 87 90 91 92 93 94 95 96 97 98 99 100 101 103 104 105 107 109 110 111 122 123 3.5 3.6"},D:{"11":0.00441,"38":0.00441,"43":0.00441,"49":0.00441,"53":0.00441,"55":0.00441,"56":0.00882,"58":0.00441,"60":0.00441,"61":0.00441,"63":0.00882,"64":0.02206,"65":0.00882,"67":0.00441,"69":0.00441,"70":0.01323,"71":0.00441,"72":0.00441,"74":0.00882,"77":0.00441,"79":0.01323,"80":0.38376,"81":0.01323,"83":0.00441,"84":0.00882,"86":0.00441,"87":0.01764,"88":0.04852,"89":0.02206,"90":0.00882,"91":0.00441,"92":0.00441,"93":0.02206,"94":0.00441,"95":0.03088,"96":0.01764,"97":0.00441,"98":0.04852,"99":0.00882,"100":0.01323,"101":0.00882,"102":0.01764,"103":0.05293,"104":0.01764,"105":0.0397,"106":0.03088,"107":0.00882,"108":0.05293,"109":1.26155,"110":0.01323,"111":0.03529,"112":0.03529,"113":0.05734,"114":0.1985,"115":0.11469,"116":0.23378,"117":0.40581,"118":5.80047,"119":21.39335,"120":0.04411,"121":0.00882,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 44 45 46 47 48 50 51 52 54 57 59 62 66 68 73 75 76 78 85 122"},F:{"65":0.01764,"79":0.00441,"85":0.00441,"91":0.03088,"95":0.03088,"102":0.03088,"103":0.17203,"104":0.5602,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 86 87 88 89 90 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.05734,"13":0.03529,"14":0.01764,"15":0.01764,"16":0.03088,"17":0.00882,"18":0.15439,"84":0.00882,"85":0.00882,"89":0.00882,"90":0.00882,"92":0.10586,"98":0.00882,"100":0.0397,"102":0.00441,"107":0.01764,"108":0.00441,"109":0.03088,"110":0.01323,"112":0.00882,"113":0.03529,"114":0.03088,"115":0.01764,"116":0.02206,"117":0.0794,"118":0.78957,"119":4.82122,_:"79 80 81 83 86 87 88 91 93 94 95 96 97 99 101 103 104 105 106 111"},E:{"13":0.00441,"14":0.00441,_:"0 4 5 6 7 8 9 10 11 12 15 3.1 3.2 6.1 7.1 9.1 10.1 15.2-15.3","5.1":0.01323,"11.1":0.00441,"12.1":0.00441,"13.1":0.00441,"14.1":0.03529,"15.1":0.00882,"15.4":0.09263,"15.5":0.00441,"15.6":0.04411,"16.0":0.00882,"16.1":0.01323,"16.2":0.01323,"16.3":0.03529,"16.4":0.00882,"16.5":0.18967,"16.6":0.14997,"17.0":0.07499,"17.1":0.40581,"17.2":0.00441},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00101,"5.0-5.1":0.00101,"6.0-6.1":0.00252,"7.0-7.1":0.00352,"8.1-8.4":0.0005,"9.0-9.2":0.00403,"9.3":0.01259,"10.0-10.2":0.00101,"10.3":0.01813,"11.0-11.2":0.00856,"11.3-11.4":0.00755,"12.0-12.1":0.00453,"12.2-12.5":0.08259,"13.0-13.1":0.00201,"13.2":0.00856,"13.3":0.00504,"13.4-13.7":0.0146,"14.0-14.4":0.03877,"14.5-14.8":0.06295,"15.0-15.1":0.02467,"15.2-15.3":0.03021,"15.4":0.03374,"15.5":0.04734,"15.6-15.7":0.24876,"16.0":0.11683,"16.1":0.23416,"16.2":0.1123,"16.3":0.21049,"16.4":0.04331,"16.5":0.11179,"16.6-16.7":1.89493,"17.0":0.56752,"17.1":0.95326,"17.2":0.02719},P:{"4":0.10362,"20":0.02072,"21":0.07253,"22":0.15542,"23":0.38338,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 15.0","7.2-7.4":0.07253,"14.0":0.01036,"16.0":0.01036,"17.0":0.02072,"18.0":0.03108,"19.0":0.04145},I:{"0":0.03337,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.0001},K:{"0":3.9009,_:"10 11 12 11.1 11.5 12.1"},A:{"10":0.00441,"11":0.18967,_:"6 7 8 9 5.5"},N:{_:"10 11"},S:{"2.5":0.08384,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.20679},H:{"0":4.79},L:{"0":42.96633},R:{_:"0"},M:{"0":0.12855},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SA.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SA.js
    index ec5fc924f5cf3b..6035415c81ea32 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SA.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SA.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00218,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0.00435,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.01088,"116":0.0087,"117":0.08918,"118":0.01088,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00218,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00218,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.00218,"56":0.00218,"57":0,"58":0.00218,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00218,"69":0,"70":0,"71":0,"72":0.00218,"73":0,"74":0.00218,"75":0.00218,"76":0,"77":0,"78":0,"79":0.0087,"80":0.00435,"81":0.00218,"83":0.00218,"84":0,"85":0.00218,"86":0.00218,"87":0.00653,"88":0.00653,"89":0.00218,"90":0.00653,"91":0.00218,"92":0.00218,"93":0.00435,"94":0,"95":0.00218,"96":0.00218,"97":0.00218,"98":0.0087,"99":0.0174,"100":0,"101":0.00218,"102":0.00218,"103":0.0087,"104":0.00218,"105":0.00435,"106":0.0087,"107":0.00653,"108":0.0087,"109":0.19793,"110":0.00218,"111":0.00435,"112":0.0087,"113":0.00653,"114":0.03915,"115":0.0522,"116":2.04668,"117":0.58508,"118":0.00218,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00218,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.01088,"73":0.00218,"74":0,"75":0,"76":0,"77":0.01523,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00218,"96":0,"97":0,"98":0,"99":0,"100":0.00653,"101":0.01305,"102":0.0261,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00218,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.00218,"91":0,"92":0.00218,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00218,"109":0.00435,"110":0.00218,"111":0.00218,"112":0,"113":0.00218,"114":0.01088,"115":0.08048,"116":0.3132,"117":0.22185},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.0087,"15":0.00218,_:"0","3.1":0,"3.2":0,"5.1":0.00435,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00435,"14.1":0.01523,"15.1":0.00218,"15.2-15.3":0.00218,"15.4":0.00435,"15.5":0.0087,"15.6":0.03915,"16.0":0.00653,"16.1":0.02828,"16.2":0.01523,"16.3":0.03045,"16.4":0.01088,"16.5":0.02828,"16.6":0.2088,"17.0":0.01523,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.02734,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.05468,"10.0-10.2":0,"10.3":0.06494,"11.0-11.2":0.01367,"11.3-11.4":0,"12.0-12.1":0.02734,"12.2-12.5":0.22899,"13.0-13.1":0.01025,"13.2":0.01367,"13.3":0.16405,"13.4-13.7":0.0957,"14.0-14.4":0.47849,"14.5-14.8":0.66988,"15.0-15.1":0.27,"15.2-15.3":0.30076,"15.4":0.35203,"15.5":0.55026,"15.6-15.7":2.13269,"16.0":1.44571,"16.1":1.76015,"16.2":1.22698,"16.3":2.16686,"16.4":0.89887,"16.5":2.43345,"16.6":17.01022,"17.0":1.51065,"17.1":0},P:{"4":0.03105,"20":0.06211,"21":0.13457,"22":1.81151,"5.0-5.4":0.01035,"6.2-6.4":0,"7.2-7.4":0.05176,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01035,"12.0":0,"13.0":0.01035,"14.0":0.03105,"15.0":0.01035,"16.0":0.03105,"17.0":0.0207,"18.0":0.03105,"19.0":0.06211},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.03011,"4.4":0,"4.4.3-4.4.4":0.09034},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01958,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":55.41073},R:{_:"0"},M:{"0":0.07825},Q:{"13.1":0},O:{"0":2.12058},H:{"0":0.40004}};
    +module.exports={C:{"34":0.00209,"52":0.00209,"91":0.00209,"102":0.00209,"106":0.00209,"108":0.00209,"109":0.00209,"113":0.00209,"115":0.06047,"116":0.00209,"117":0.00417,"118":0.0146,"119":0.35862,"120":0.10842,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 92 93 94 95 96 97 98 99 100 101 103 104 105 107 110 111 112 114 121 122 123 3.5 3.6"},D:{"11":0.00209,"34":0.00209,"38":0.00834,"41":0.00209,"43":0.00209,"47":0.00417,"48":0.00417,"49":0.00417,"50":0.00209,"56":0.00417,"58":0.02085,"63":0.00209,"65":0.00417,"66":0.00209,"67":0.00209,"68":0.00209,"69":0.00417,"70":0.00209,"71":0.00209,"72":0.01251,"73":0.00209,"74":0.00209,"75":0.00626,"76":0.00209,"78":0.00209,"79":0.0417,"80":0.00417,"81":0.00417,"83":0.00834,"84":0.00209,"85":0.00626,"86":0.01043,"87":0.0146,"88":0.00834,"89":0.00626,"90":0.00626,"91":0.00626,"92":0.00417,"93":0.03128,"94":0.00209,"95":0.00626,"96":0.00417,"97":0.01251,"98":0.01043,"99":0.02919,"100":0.00417,"101":0.00417,"102":0.00626,"103":0.03128,"104":0.00626,"105":0.05213,"106":0.02711,"107":0.02711,"108":0.02919,"109":0.78605,"110":0.01668,"111":0.02085,"112":0.02711,"113":0.01877,"114":0.07923,"115":0.06672,"116":0.13344,"117":0.17306,"118":2.56247,"119":10.06847,"120":0.00834,"121":0.01251,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 39 40 42 44 45 46 51 52 53 54 55 57 59 60 61 62 64 77 122"},F:{"28":0.00417,"46":0.00209,"71":0.01668,"77":0.00209,"79":0.00209,"82":0.00209,"83":0.00209,"84":0.00209,"91":0.00209,"93":0.00209,"95":0.00209,"102":0.13136,"103":0.0146,"104":0.11259,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 72 73 74 75 76 78 80 81 85 86 87 88 89 90 92 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00209,"15":0.00209,"16":0.00209,"18":0.00417,"89":0.00209,"91":0.00209,"92":0.0146,"100":0.00209,"101":0.00209,"103":0.00209,"104":0.00209,"105":0.00209,"106":0.00417,"107":0.00417,"108":0.00626,"109":0.01668,"110":0.00834,"111":0.00209,"112":0.00209,"113":0.00626,"114":0.01251,"115":0.01043,"116":0.0146,"117":0.0834,"118":0.72558,"119":1.8348,_:"13 14 17 79 80 81 83 84 85 86 87 88 90 93 94 95 96 97 98 99 102"},E:{"13":0.00209,"14":0.02294,"15":0.00417,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 6.1 7.1 9.1 10.1","5.1":0.06881,"11.1":0.00209,"12.1":0.00209,"13.1":0.01043,"14.1":0.04587,"15.1":0.01043,"15.2-15.3":0.00834,"15.4":0.02085,"15.5":0.02919,"15.6":0.14387,"16.0":0.01877,"16.1":0.06881,"16.2":0.05004,"16.3":0.09591,"16.4":0.03336,"16.5":0.09174,"16.6":0.6255,"17.0":0.21267,"17.1":0.28773,"17.2":0.00834},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00495,"5.0-5.1":0.00495,"6.0-6.1":0.01237,"7.0-7.1":0.01732,"8.1-8.4":0.00247,"9.0-9.2":0.01979,"9.3":0.06185,"10.0-10.2":0.00495,"10.3":0.08906,"11.0-11.2":0.04206,"11.3-11.4":0.03711,"12.0-12.1":0.02227,"12.2-12.5":0.40572,"13.0-13.1":0.0099,"13.2":0.04206,"13.3":0.02474,"13.4-13.7":0.07174,"14.0-14.4":0.19049,"14.5-14.8":0.30924,"15.0-15.1":0.12122,"15.2-15.3":0.14843,"15.4":0.16575,"15.5":0.23255,"15.6-15.7":1.22211,"16.0":0.57395,"16.1":1.15037,"16.2":0.55168,"16.3":1.0341,"16.4":0.21276,"16.5":0.54921,"16.6-16.7":9.30935,"17.0":2.7881,"17.1":4.68312,"17.2":0.13359},P:{"4":0.04135,"20":0.03101,"21":0.0827,"22":0.26877,"23":1.50926,"5.0-5.4":0.01034,_:"6.2-6.4 8.2 9.2 10.1 12.0","7.2-7.4":0.04135,"11.1-11.2":0.01034,"13.0":0.01034,"14.0":0.02067,"15.0":0.01034,"16.0":0.02067,"17.0":0.02067,"18.0":0.02067,"19.0":0.06202},I:{"0":0.08662,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00026},K:{"0":0.51441,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00214,"11":0.07292,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":2.08138},H:{"0":0},L:{"0":49.93802},R:{_:"0"},M:{"0":0.07123},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SB.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SB.js
    index 74c33515ab6757..7a07ad01c8b7ba 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SB.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SB.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.05085,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0.01017,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0.00339,"111":0,"112":0,"113":0.00339,"114":0.00339,"115":0.04746,"116":0.02034,"117":0.28476,"118":0.01695,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00339,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0.01017,"52":0,"53":0.03051,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00339,"70":0.00339,"71":0,"72":0,"73":0,"74":0.00339,"75":0,"76":0.00339,"77":0.00339,"78":0.00339,"79":0,"80":0,"81":0.00678,"83":0.00339,"84":0,"85":0,"86":0,"87":0.00678,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.01356,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.00339,"102":0.00339,"103":0.07119,"104":0.01356,"105":0.00339,"106":0.00678,"107":0,"108":0.15933,"109":0.37968,"110":0.02712,"111":0.01017,"112":0.01017,"113":0.00339,"114":0.05085,"115":0.06441,"116":3.24423,"117":1.28481,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.00678,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0.00339,"34":0,"35":0,"36":0,"37":0.00678,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.00339,"64":0,"65":0.00339,"66":0,"67":0,"68":0.00678,"69":0.01695,"70":0.12543,"71":0.00678,"72":0.06441,"73":0.03051,"74":0,"75":0,"76":0,"77":0.03729,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.0678,"102":0.03729,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00339,"13":0,"14":0.53901,"15":0.00678,"16":0.01017,"17":0.01356,"18":0.02034,"79":0,"80":0.01017,"81":0,"83":0,"84":0.00339,"85":0.00678,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.01695,"93":0,"94":0.00339,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00339,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00339,"108":0.00339,"109":0.01695,"110":0.01017,"111":0.00339,"112":0.00678,"113":0.02034,"114":0.01356,"115":0.07119,"116":0.88818,"117":0.64071},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00678,"14.1":0.01695,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.00339,"15.6":0.22713,"16.0":0.00339,"16.1":0.00339,"16.2":0,"16.3":0.00339,"16.4":0.00339,"16.5":0.01017,"16.6":0.0678,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0.01749,"9.3":0.01117,"10.0-10.2":0,"10.3":0.0442,"11.0-11.2":0.00243,"11.3-11.4":0.00243,"12.0-12.1":0,"12.2-12.5":0.22734,"13.0-13.1":0,"13.2":0,"13.3":0.12144,"13.4-13.7":0.0374,"14.0-14.4":0.02235,"14.5-14.8":0.07967,"15.0-15.1":0.02866,"15.2-15.3":0.1501,"15.4":0.02672,"15.5":0,"15.6-15.7":0.25357,"16.0":0.3687,"16.1":0.12144,"16.2":0.38618,"16.3":0.20548,"16.4":0.03983,"16.5":0.12581,"16.6":2.5051,"17.0":0.07724,"17.1":0},P:{"4":0.08305,"20":0.4983,"21":0.69554,"22":1.10041,"5.0-5.4":0.03114,"6.2-6.4":0,"7.2-7.4":0.15572,"8.2":0,"9.2":0.20762,"10.1":0,"11.1-11.2":0.02076,"12.0":0.01038,"13.0":0.01038,"14.0":0.03114,"15.0":0.01038,"16.0":0.15572,"17.0":0.05191,"18.0":0.14534,"19.0":0.10381},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.13746},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.05424,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":72.07271},R:{_:"0"},M:{"0":0.49575},Q:{"13.1":0.00661},O:{"0":4.56751},H:{"0":2.15272}};
    +module.exports={C:{"47":0.00246,"96":0.00246,"98":0.00493,"113":0.07885,"114":0.00986,"115":0.07638,"116":0.00493,"118":0.01725,"119":0.72688,"120":0.12566,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 97 99 100 101 102 103 104 105 106 107 108 109 110 111 112 117 121 122 123 3.5 3.6"},D:{"11":0.02218,"42":0.00246,"47":0.00493,"51":0.00493,"53":0.48294,"56":0.01478,"59":0.00493,"63":0.00493,"65":0.00986,"68":0.01232,"69":0.00246,"70":0.00493,"72":0.01971,"74":0.00246,"76":0.00739,"81":0.00493,"86":0.00493,"87":0.01725,"89":0.05667,"90":0.00246,"91":0.02218,"94":0.0616,"95":0.07885,"99":0.0271,"100":0.03942,"101":0.01971,"102":0.00246,"103":0.02957,"104":0.0271,"105":0.02957,"108":0.38685,"109":0.81558,"110":0.03696,"111":0.00493,"112":0.01478,"113":0.00246,"114":0.00739,"115":0.04189,"116":0.16016,"117":0.29075,"118":1.78886,"119":8.64864,"120":0.01232,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 43 44 45 46 48 49 50 52 54 55 57 58 60 61 62 64 66 67 71 73 75 77 78 79 80 83 84 85 88 92 93 96 97 98 106 107 121 122"},F:{"79":0.00246,"102":0.00493,"103":0.04682,"104":0.08131,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"14":0.30554,"15":0.01232,"16":0.00493,"17":0.00493,"18":0.0271,"89":0.00986,"92":0.00739,"105":0.00493,"107":0.00246,"108":0.00986,"109":0.01232,"112":0.02218,"113":0.00246,"114":0.01478,"115":0.02464,"116":0.0271,"117":0.07392,"118":0.60614,"119":2.69808,_:"12 13 79 80 81 83 84 85 86 87 88 90 91 93 94 95 96 97 98 99 100 101 102 103 104 106 110 111"},E:{"15":0.00246,_:"0 4 5 6 7 8 9 10 11 12 13 14 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 15.4 16.0 16.1 16.4 17.2","12.1":0.00246,"13.1":0.0345,"14.1":0.02218,"15.1":0.04682,"15.2-15.3":0.00246,"15.5":0.02464,"15.6":0.1232,"16.2":0.02218,"16.3":0.00986,"16.5":0.01232,"16.6":0.0616,"17.0":0.08131,"17.1":0.02464},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00073,"5.0-5.1":0.00073,"6.0-6.1":0.00184,"7.0-7.1":0.00257,"8.1-8.4":0.00037,"9.0-9.2":0.00294,"9.3":0.00918,"10.0-10.2":0.00073,"10.3":0.01321,"11.0-11.2":0.00624,"11.3-11.4":0.00551,"12.0-12.1":0.0033,"12.2-12.5":0.06019,"13.0-13.1":0.00147,"13.2":0.00624,"13.3":0.00367,"13.4-13.7":0.01064,"14.0-14.4":0.02826,"14.5-14.8":0.04588,"15.0-15.1":0.01798,"15.2-15.3":0.02202,"15.4":0.02459,"15.5":0.0345,"15.6-15.7":0.1813,"16.0":0.08514,"16.1":0.17066,"16.2":0.08184,"16.3":0.15341,"16.4":0.03156,"16.5":0.08147,"16.6-16.7":1.38103,"17.0":0.41361,"17.1":0.69474,"17.2":0.01982},P:{"4":0.04132,"20":0.41318,"21":0.16527,"22":0.37186,"23":0.56812,"5.0-5.4":0.12395,"6.2-6.4":0.01033,"7.2-7.4":0.09297,_:"8.2 10.1","9.2":0.02066,"11.1-11.2":0.06198,"12.0":0.02066,"13.0":0.02066,"14.0":0.15494,"15.0":0.04132,"16.0":0.14461,"17.0":0.01033,"18.0":0.07231,"19.0":0.06198},I:{"0":0.05249,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00004,"4.4":0,"4.4.3-4.4.4":0.00016},K:{"0":2.99179,_:"10 11 12 11.1 11.5 12.1"},A:{"10":0.02693,"11":0.05685,_:"6 7 8 9 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":2.35877},H:{"0":0},L:{"0":68.33744},R:{_:"0"},M:{"0":0.99475},Q:{"13.1":0.00754}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SC.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SC.js
    index 3c48cfa13b905d..b76931438793be 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SC.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SC.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0.03896,"51":0,"52":0.08324,"53":0.21075,"54":0,"55":0.00708,"56":0.04073,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00177,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.00177,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.06199,"103":0,"104":0.00177,"105":0.01594,"106":0,"107":0,"108":0.00531,"109":0,"110":0,"111":0,"112":0.00177,"113":0,"114":0,"115":0.02657,"116":0.01771,"117":0.15231,"118":0.01063,"119":0,"120":0,"3.5":0,"3.6":0.00177},D:{"4":0.00177,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.01063,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.04073,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0.00354,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00177,"69":0.00177,"70":0.00177,"71":0.00177,"72":0.10272,"73":0,"74":0.00177,"75":0.00177,"76":0.00177,"77":0.00177,"78":0.00177,"79":0.00354,"80":0.00354,"81":0.00354,"83":0.00354,"84":0.00177,"85":0.00177,"86":0.00708,"87":0.00531,"88":0.00354,"89":0.00177,"90":0.00354,"91":0.00354,"92":0.00177,"93":0,"94":0.00354,"95":0,"96":0.00354,"97":0,"98":0,"99":0.00531,"100":0.00177,"101":0.00354,"102":0.00177,"103":0.00354,"104":0.00354,"105":0.01063,"106":0.01948,"107":0.00708,"108":0.00177,"109":0.08324,"110":0.00886,"111":0.00354,"112":0.03365,"113":0.02479,"114":0.08501,"115":0.0425,"116":0.696,"117":0.21606,"118":0.00708,"119":0.00177,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00177,"69":0.00354,"70":0,"71":0,"72":0.02657,"73":0.00708,"74":0,"75":0,"76":0,"77":0.00177,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.00354,"95":0.00354,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.01063,"102":0.01063,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0.00177,"16":0,"17":0,"18":0.00177,"79":0,"80":0.00177,"81":0.00177,"83":0.00177,"84":0.00177,"85":0.00177,"86":0.00177,"87":0,"88":0,"89":0.00177,"90":0.00177,"91":0,"92":0.00177,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00177,"100":0.00354,"101":0,"102":0,"103":0,"104":0,"105":0.00177,"106":0,"107":0,"108":0.00177,"109":0.00177,"110":0,"111":0,"112":0.00354,"113":0.00708,"114":0.01063,"115":0.00708,"116":0.15585,"117":0.10449},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00354,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.01063,"10.1":0,"11.1":0,"12.1":0.05313,"13.1":0.00177,"14.1":0.00886,"15.1":0.00531,"15.2-15.3":0.00531,"15.4":0,"15.5":0,"15.6":0.00708,"16.0":0.00177,"16.1":0.00177,"16.2":0.00177,"16.3":0.01948,"16.4":0.00354,"16.5":0.00708,"16.6":0.03896,"17.0":0.00354,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.03025,"10.0-10.2":0,"10.3":0.0121,"11.0-11.2":0.01815,"11.3-11.4":0.01815,"12.0-12.1":0.03025,"12.2-12.5":0.35085,"13.0-13.1":0.01815,"13.2":51.63552,"13.3":0.0121,"13.4-13.7":0.10284,"14.0-14.4":0.22382,"14.5-14.8":0.30246,"15.0-15.1":0.11493,"15.2-15.3":0.15728,"15.4":0.11493,"15.5":0.09679,"15.6-15.7":0.89527,"16.0":0.31456,"16.1":0.60491,"16.2":0.16333,"16.3":0.41134,"16.4":0.3327,"16.5":0.39319,"16.6":3.65973,"17.0":0.3448,"17.1":0},P:{"4":0.05062,"20":0.0405,"21":0.13161,"22":0.99214,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.05062,"8.2":0,"9.2":0.02025,"10.1":0,"11.1-11.2":0.0405,"12.0":0,"13.0":0.0405,"14.0":0.01012,"15.0":0,"16.0":0.0405,"17.0":0.02025,"18.0":0.03037,"19.0":0.07087},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.03531},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0.00266,"7":0,"8":0.00266,"9":0.0186,"10":0,"11":0.02922,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0.00823,"11":0},L:{"0":32.84116},R:{_:"0"},M:{"0":0.26333},Q:{"13.1":0.0576},O:{"0":0.89696},H:{"0":0.43628}};
    +module.exports={C:{"45":0.00766,"49":0.01149,"52":0.05362,"55":0.19916,"60":0.00383,"62":0.01149,"65":0.00383,"68":0.00766,"69":0.00383,"71":0.00383,"72":0.00383,"73":0.03447,"74":0.0383,"75":0.03064,"76":0.01149,"77":0.06511,"78":0.10341,"79":0.01149,"80":0.01149,"81":0.03447,"82":0.00766,"91":0.03064,"96":0.00383,"97":0.01915,"98":0.00383,"99":0.00383,"100":0.08809,"102":0.05745,"104":0.02681,"105":0.26427,"108":0.00383,"110":0.00766,"112":0.00766,"113":0.00383,"115":0.89622,"116":0.00766,"117":0.01532,"118":0.08809,"119":0.5745,"120":0.14171,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 50 51 53 54 56 57 58 59 61 63 64 66 67 70 83 84 85 86 87 88 89 90 92 93 94 95 101 103 106 107 109 111 114 121 122 123 3.5 3.6"},D:{"41":0.00383,"43":0.00766,"44":0.01915,"45":1.47838,"49":0.01149,"53":0.00383,"55":0.00383,"63":0.01149,"65":0.00766,"67":0.01915,"68":0.1532,"69":0.05745,"70":0.18384,"71":0.05745,"72":0.44811,"73":0.12639,"74":0.23746,"75":0.15703,"76":0.13788,"77":0.08809,"78":0.39449,"79":0.24895,"80":0.24129,"81":0.16852,"83":0.37151,"84":0.12256,"85":0.31789,"86":0.78132,"87":0.37917,"88":0.34087,"89":0.12256,"90":0.31023,"91":0.06894,"92":0.03447,"93":0.00383,"94":0.00766,"95":0.00766,"96":0.10341,"97":0.02298,"98":0.00766,"99":0.02681,"100":0.00766,"101":0.00766,"102":0.08809,"103":0.02681,"104":0.01915,"105":0.22597,"106":0.54769,"107":0.00766,"108":0.01915,"109":0.72004,"110":0.01915,"111":0.09192,"112":0.13022,"113":0.06128,"114":0.72387,"115":0.04979,"116":0.55918,"117":0.35236,"118":2.64653,"119":8.69027,"121":0.01532,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 42 46 47 48 50 51 52 54 56 57 58 59 60 61 62 64 66 120 122"},F:{"46":0.00766,"47":0.00383,"53":0.01532,"54":0.0383,"55":0.01149,"56":0.03447,"60":0.00383,"66":0.00383,"73":0.00766,"75":0.03447,"76":0.00383,"85":0.00383,"87":0.00383,"95":0.04979,"102":0.13405,"103":0.06128,"104":0.1915,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 48 49 50 51 52 57 58 62 63 64 65 67 68 69 70 71 72 74 77 78 79 80 81 82 83 84 86 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"14":0.00383,"15":0.00383,"16":0.00383,"17":0.01915,"18":0.03447,"79":0.06894,"80":0.14171,"81":0.04213,"83":0.0766,"84":0.01532,"85":0.00766,"86":0.04213,"87":0.0383,"88":0.02681,"89":0.10724,"90":0.05362,"91":0.01915,"92":0.00383,"95":0.02681,"96":0.01149,"103":0.01149,"104":0.00383,"105":0.04213,"109":0.02298,"110":0.00383,"112":0.00383,"113":0.02298,"114":0.08426,"115":0.00383,"116":0.00383,"117":0.05362,"118":0.44428,"119":1.50519,_:"12 13 93 94 97 98 99 100 101 102 106 107 108 111"},E:{"13":0.00383,"14":0.11107,_:"0 4 5 6 7 8 9 10 11 12 15 3.1 3.2 6.1 7.1 10.1 11.1","5.1":0.13788,"9.1":1.0724,"12.1":0.21831,"13.1":0.0383,"14.1":0.02681,"15.1":0.9958,"15.2-15.3":0.91537,"15.4":0.08043,"15.5":0.04596,"15.6":0.21065,"16.0":0.08043,"16.1":0.08809,"16.2":0.05362,"16.3":0.05745,"16.4":0.12639,"16.5":0.35619,"16.6":0.383,"17.0":0.21065,"17.1":0.34853,"17.2":0.01915},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00144,"5.0-5.1":0.00144,"6.0-6.1":0.00361,"7.0-7.1":0.00505,"8.1-8.4":0.00072,"9.0-9.2":0.00578,"9.3":0.01805,"10.0-10.2":0.00144,"10.3":0.02599,"11.0-11.2":0.01227,"11.3-11.4":0.01083,"12.0-12.1":0.0065,"12.2-12.5":0.11841,"13.0-13.1":0.00289,"13.2":0.01227,"13.3":0.00722,"13.4-13.7":0.02094,"14.0-14.4":0.05559,"14.5-14.8":0.09025,"15.0-15.1":0.03538,"15.2-15.3":0.04332,"15.4":0.04837,"15.5":0.06787,"15.6-15.7":0.35667,"16.0":0.16751,"16.1":0.33573,"16.2":0.16101,"16.3":0.3018,"16.4":0.06209,"16.5":0.16029,"16.6-16.7":2.71691,"17.0":0.8137,"17.1":1.36676,"17.2":0.03899},P:{"4":0.01025,"20":0.08199,"21":0.25622,"22":1.01465,"23":2.34702,_:"5.0-5.4 6.2-6.4 8.2 10.1 12.0","7.2-7.4":0.07174,"9.2":0.01025,"11.1-11.2":0.041,"13.0":0.10249,"14.0":0.01025,"15.0":0.08199,"16.0":0.29722,"17.0":0.05124,"18.0":0.10249,"19.0":0.20498},I:{"0":0.02456,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.00007},K:{"0":1.05524,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00662,"9":0.01323,"11":0.05292,_:"6 7 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":1.93152},H:{"0":0},L:{"0":48.2432},R:{_:"0"},M:{"0":0.72201},Q:{"13.1":0.00617}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SD.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SD.js
    index e65a54835f68f6..52a2d846ab6a6b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SD.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SD.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00087,"46":0,"47":0.00173,"48":0,"49":0.0026,"50":0,"51":0,"52":0.00087,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00087,"67":0,"68":0,"69":0.00087,"70":0,"71":0,"72":0.00173,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00087,"101":0,"102":0.0052,"103":0,"104":0,"105":0.00087,"106":0.00087,"107":0,"108":0,"109":0.00173,"110":0.0026,"111":0.00433,"112":0.00087,"113":0.00087,"114":0.00087,"115":0.02078,"116":0.00779,"117":0.0459,"118":0.00433,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00087,"41":0.00087,"42":0,"43":0.00087,"44":0,"45":0,"46":0.00087,"47":0.00087,"48":0,"49":0,"50":0.00087,"51":0.00173,"52":0,"53":0,"54":0,"55":0.00087,"56":0.00087,"57":0,"58":0.00953,"59":0,"60":0,"61":0,"62":0,"63":0.00087,"64":0,"65":0,"66":0,"67":0,"68":0.00087,"69":0.00087,"70":0.00346,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.00087,"78":0.00693,"79":0.0026,"80":0.00173,"81":0.00173,"83":0.00087,"84":0,"85":0.00087,"86":0.00087,"87":0.00173,"88":0.0026,"89":0.00087,"90":0,"91":0.00087,"92":0.00173,"93":0,"94":0,"95":0,"96":0.00087,"97":0.00346,"98":0.00087,"99":0.00346,"100":0.00087,"101":0,"102":0.00087,"103":0.00087,"104":0.00173,"105":0.00087,"106":0.00087,"107":0.00346,"108":0.00173,"109":0.04936,"110":0.00173,"111":0.00606,"112":0.0026,"113":0.00087,"114":0.01039,"115":0.01472,"116":0.14982,"117":0.03464,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0.00087,"25":0,"26":0,"27":0,"28":0.0026,"29":0.00087,"30":0.00433,"31":0,"32":0.00087,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00087,"39":0,"40":0,"41":0,"42":0.00087,"43":0,"44":0,"45":0,"46":0,"47":0.00087,"48":0,"49":0,"50":0.00087,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00173,"60":0.00606,"62":0,"63":0.0026,"64":0.00346,"65":0.00346,"66":0.0026,"67":0.0052,"68":0.00173,"69":0.01472,"70":0.01126,"71":0.01386,"72":0.06928,"73":0.01039,"74":0.0026,"75":0,"76":0.00173,"77":0.02511,"78":0.00087,"79":0.00173,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.0026,"96":0,"97":0,"98":0,"99":0.00087,"100":0.00346,"101":0.01126,"102":0.01126,"9.5-9.6":0,"10.0-10.1":0,"10.5":0.00087,"10.6":0.00173,"11.1":0.00087,"11.5":0,"11.6":0,"12.1":0.00433},B:{"12":0.00087,"13":0,"14":0.00087,"15":0,"16":0.00087,"17":0.00087,"18":0.00346,"79":0,"80":0,"81":0,"83":0,"84":0.00087,"85":0,"86":0,"87":0,"88":0,"89":0.00173,"90":0.00087,"91":0,"92":0.00866,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00087,"101":0,"102":0,"103":0.00087,"104":0,"105":0,"106":0,"107":0,"108":0.00087,"109":0.00173,"110":0.00173,"111":0.00173,"112":0.00087,"113":0.00087,"114":0.0026,"115":0.00346,"116":0.03291,"117":0.01299},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00087,"12":0,"13":0,"14":0.00087,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.05283,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00087,"14.1":0.00087,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0.00087,"16.0":0,"16.1":0,"16.2":0,"16.3":0.00087,"16.4":0,"16.5":0,"16.6":0.00173,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00709,"5.0-5.1":0,"6.0-6.1":0.00203,"7.0-7.1":0.01469,"8.1-8.4":0.00051,"9.0-9.2":0.00304,"9.3":0.11296,"10.0-10.2":0.00051,"10.3":0.01925,"11.0-11.2":0.0152,"11.3-11.4":0.00203,"12.0-12.1":0.00962,"12.2-12.5":0.22086,"13.0-13.1":0.00253,"13.2":0.00203,"13.3":0.0157,"13.4-13.7":0.03749,"14.0-14.4":0.19705,"14.5-14.8":0.22086,"15.0-15.1":0.08966,"15.2-15.3":0.14842,"15.4":0.11246,"15.5":0.1621,"15.6-15.7":0.58458,"16.0":0.31407,"16.1":0.3784,"16.2":0.2776,"16.3":0.53544,"16.4":0.3627,"16.5":0.30445,"16.6":0.70413,"17.0":0.19553,"17.1":0},P:{"4":0.41517,"20":0.52655,"21":0.35441,"22":1.205,"5.0-5.4":0.03038,"6.2-6.4":0.05063,"7.2-7.4":0.30378,"8.2":0,"9.2":0.28353,"10.1":0.01013,"11.1-11.2":0.05063,"12.0":0.01013,"13.0":0.07088,"14.0":0.15189,"15.0":0.0405,"16.0":0.45567,"17.0":0.14176,"18.0":0.2734,"19.0":0.56706},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00963,"4.2-4.3":0.02247,"4.4":0,"4.4.3-4.4.4":0.21829},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00433,"5.5":0},S:{"2.5":0.00913,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":74.81685},R:{_:"0"},M:{"0":0.18268},Q:{"13.1":0},O:{"0":1.64412},H:{"0":10.22132}};
    +module.exports={C:{"6":0.00085,"17":0.00085,"29":0.00255,"30":0.00085,"31":0.0017,"33":0.00085,"35":0.00255,"39":0.00085,"41":0.00085,"42":0.0017,"43":0.0017,"44":0.00511,"46":0.0017,"47":0.00511,"48":0.0017,"49":0.00936,"50":0.0017,"51":0.00511,"52":0.01532,"56":0.00426,"57":0.0017,"58":0.00255,"59":0.00426,"60":0.00681,"61":0.00085,"63":0.0034,"64":0.0034,"65":0.0017,"66":0.0017,"69":0.00085,"70":0.00085,"72":0.01191,"73":0.0017,"74":0.00085,"76":0.00085,"78":0.00255,"79":0.00085,"80":0.00766,"81":0.0034,"82":0.00085,"83":0.00085,"85":0.00596,"87":0.00085,"88":0.00511,"89":0.0017,"90":0.00085,"91":0.00255,"92":0.0017,"94":0.00681,"96":0.0017,"98":0.00085,"99":0.00085,"100":0.0017,"101":0.04255,"102":0.00426,"104":0.0017,"105":0.00085,"106":0.00255,"107":0.01447,"108":0.0017,"109":0.00085,"110":0.00596,"111":0.02808,"112":0.01362,"113":0.00766,"114":0.0034,"115":0.25105,"116":0.00851,"117":0.01702,"118":0.04595,"119":0.51741,"120":0.11914,"121":0.0017,_:"2 3 4 5 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24 25 26 27 28 32 34 36 37 38 40 45 53 54 55 62 67 68 71 75 77 84 86 93 95 97 103 122 123 3.5 3.6"},D:{"11":0.00255,"14":0.0017,"26":0.0034,"28":0.00085,"29":0.00511,"30":0.00085,"32":0.00085,"33":0.00596,"34":0.00085,"35":0.00085,"37":0.00085,"38":0.00681,"39":0.0017,"40":0.00681,"41":0.00766,"42":0.00085,"43":0.02893,"44":0.00085,"45":0.00085,"46":0.0017,"47":0.00681,"48":0.00255,"50":0.00681,"52":0.0017,"53":0.00085,"54":0.0017,"55":0.00851,"56":0.00766,"57":0.00766,"58":0.08085,"59":0.0017,"60":0.00681,"61":0.00255,"62":0.0017,"63":0.02808,"64":0.00766,"65":0.00085,"66":0.00766,"67":0.00085,"68":0.01872,"69":0.01021,"70":0.02213,"71":0.01277,"72":0.00085,"73":0.00085,"74":0.00255,"75":0.00596,"76":0.0034,"77":0.0017,"78":0.02723,"79":0.02979,"80":0.01447,"81":0.00596,"83":0.0017,"84":0.00426,"85":0.00936,"86":0.01277,"87":0.00936,"88":0.01872,"89":0.00085,"90":0.00085,"91":0.0034,"92":0.01191,"93":0.00681,"94":0.0034,"95":0.01191,"96":0.00511,"97":0.00085,"98":0.00681,"99":0.02128,"100":0.00255,"101":0.00936,"102":0.01447,"103":0.01277,"104":0.01957,"105":0.03319,"106":0.02298,"107":0.01362,"108":0.01787,"109":0.53528,"110":0.02893,"111":0.03149,"112":0.02298,"113":0.00426,"114":0.01702,"115":0.02468,"116":0.06468,"117":0.15999,"118":0.48252,"119":1.72328,"120":0.00255,_:"4 5 6 7 8 9 10 12 13 15 16 17 18 19 20 21 22 23 24 25 27 31 36 49 51 121 122"},F:{"34":0.00255,"38":0.00085,"40":0.00851,"42":0.0017,"49":0.0017,"51":0.00085,"78":0.00085,"79":0.01532,"83":0.00255,"84":0.0017,"85":0.00085,"86":0.0034,"90":0.00085,"91":0.0017,"94":0.0017,"95":0.02808,"96":0.00085,"97":0.00085,"98":0.0017,"100":0.12935,"101":0.0017,"102":0.0383,"103":0.05446,"104":0.14978,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 39 41 43 44 45 46 47 48 50 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 80 81 82 87 88 89 92 93 99 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.01191,"13":0.00426,"14":0.00766,"15":0.00681,"16":0.00851,"17":0.00766,"18":0.06978,"80":0.00085,"81":0.00085,"84":0.01872,"85":0.00085,"86":0.00085,"89":0.01191,"90":0.01106,"91":0.00085,"92":0.12084,"96":0.0017,"98":0.00085,"100":0.00851,"101":0.00085,"103":0.0017,"104":0.00085,"105":0.00255,"106":0.0017,"107":0.0034,"108":0.00851,"109":0.01872,"110":0.00426,"111":0.0034,"112":0.01277,"113":0.01021,"114":0.01362,"115":0.01106,"116":0.01277,"117":0.01702,"118":0.14127,"119":0.61102,_:"79 83 87 88 93 94 95 97 99 102"},E:{"7":0.00255,"13":0.00085,"14":0.00596,"15":0.00085,_:"0 4 5 6 8 9 10 11 12 3.1 3.2 6.1 7.1 9.1 11.1 15.2-15.3 15.5 17.2","5.1":1.02631,"10.1":0.00085,"12.1":0.00426,"13.1":0.00426,"14.1":0.00511,"15.1":0.00255,"15.4":0.00426,"15.6":0.01021,"16.0":0.00255,"16.1":0.00085,"16.2":0.00085,"16.3":0.01532,"16.4":0.0034,"16.5":0.0034,"16.6":0.0034,"17.0":0.0017,"17.1":0.00766},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00071,"5.0-5.1":0.00071,"6.0-6.1":0.00178,"7.0-7.1":0.00249,"8.1-8.4":0.00036,"9.0-9.2":0.00284,"9.3":0.00888,"10.0-10.2":0.00071,"10.3":0.01278,"11.0-11.2":0.00604,"11.3-11.4":0.00533,"12.0-12.1":0.0032,"12.2-12.5":0.05822,"13.0-13.1":0.00142,"13.2":0.00604,"13.3":0.00355,"13.4-13.7":0.0103,"14.0-14.4":0.02734,"14.5-14.8":0.04438,"15.0-15.1":0.0174,"15.2-15.3":0.0213,"15.4":0.02379,"15.5":0.03337,"15.6-15.7":0.17538,"16.0":0.08236,"16.1":0.16508,"16.2":0.07917,"16.3":0.1484,"16.4":0.03053,"16.5":0.07881,"16.6-16.7":1.33594,"17.0":0.40011,"17.1":0.67205,"17.2":0.01917},P:{"4":0.51622,"20":0.28342,"21":0.45549,"22":0.60732,"23":0.63769,"5.0-5.4":0.01012,"6.2-6.4":0.05061,"7.2-7.4":0.25305,_:"8.2","9.2":0.03037,"10.1":0.01012,"11.1-11.2":0.07085,"12.0":0.02024,"13.0":0.08098,"14.0":0.13159,"15.0":0.04049,"16.0":0.36439,"17.0":0.07085,"18.0":0.31378,"19.0":0.43525},I:{"0":0.14567,"3":0.00001,"4":0.00003,"2.1":0,"2.2":0.00003,"2.3":0,"4.1":0.00001,"4.2-4.3":0.0001,"4.4":0,"4.4.3-4.4.4":0.00044},K:{"0":5.81405,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.06723,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.0183,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":1.3725},H:{"0":5.23},L:{"0":71.19455},R:{_:"0"},M:{"0":0.183},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SE.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SE.js
    index 4655c979da783d..bc253c2cd7bb50 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SE.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SE.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00501,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0.00501,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.01502,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00501,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.03506,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0.00501,"114":0.00501,"115":0.09014,"116":0.05509,"117":0.76122,"118":0.07512,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00501,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.01502,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0.00501,"76":0.00501,"77":0,"78":0.00501,"79":0.01002,"80":0.00501,"81":0.00501,"83":0,"84":0,"85":0.00501,"86":0.00501,"87":0.01502,"88":0.00501,"89":0.02504,"90":0.00501,"91":0.01002,"92":0.01002,"93":0.09014,"94":0,"95":0,"96":0.00501,"97":0,"98":0.00501,"99":0.00501,"100":0.01502,"101":0.01002,"102":0.01502,"103":0.20032,"104":0.02003,"105":0.03506,"106":0.01002,"107":0.01502,"108":0.10517,"109":0.54086,"110":0.02003,"111":0.03506,"112":0.04507,"113":0.10517,"114":0.29547,"115":0.99659,"116":11.48835,"117":2.39883,"118":0.00501,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00501,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00501,"73":0,"74":0,"75":0,"76":0,"77":0.02003,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01002,"96":0,"97":0,"98":0,"99":0.00501,"100":0.0601,"101":0.1252,"102":0.22035,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00501,"89":0,"90":0,"91":0,"92":0.00501,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.00501,"104":0,"105":0,"106":0.00501,"107":0.00501,"108":0.00501,"109":0.04507,"110":0.01002,"111":0.00501,"112":0.00501,"113":0.01502,"114":0.07512,"115":0.16026,"116":2.34875,"117":1.49739},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00501,"14":0.03506,"15":0.00501,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0.00501,"12.1":0.00501,"13.1":0.04006,"14.1":0.10517,"15.1":0.01502,"15.2-15.3":0.01502,"15.4":0.02504,"15.5":0.04006,"15.6":0.22536,"16.0":0.02003,"16.1":0.0601,"16.2":0.05509,"16.3":0.16026,"16.4":0.0601,"16.5":0.15525,"16.6":1.1268,"17.0":0.05509,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0.00785,"9.3":0.06278,"10.0-10.2":0,"10.3":0.05885,"11.0-11.2":0,"11.3-11.4":0.02354,"12.0-12.1":0.00785,"12.2-12.5":0.25503,"13.0-13.1":0.00392,"13.2":0,"13.3":0.01569,"13.4-13.7":0.04316,"14.0-14.4":0.12163,"14.5-14.8":0.43159,"15.0-15.1":0.09024,"15.2-15.3":0.16087,"15.4":0.18833,"15.5":0.29427,"15.6-15.7":2.77787,"16.0":0.98089,"16.1":2.20111,"16.2":0.96912,"16.3":2.10694,"16.4":0.22757,"16.5":0.85141,"16.6":25.14206,"17.0":1.70674,"17.1":0.00785},P:{"4":0.04092,"20":0.06139,"21":0.18416,"22":4.76771,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0.01023,"14.0":0.01023,"15.0":0.01023,"16.0":0.02046,"17.0":0.02046,"18.0":0.01023,"19.0":0.03069},I:{"0":0,"3":0,"4":0.01,"2.1":0,"2.2":0,"2.3":0,"4.1":0.005,"4.2-4.3":0.005,"4.4":0,"4.4.3-4.4.4":0.05},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01002,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":27.69382},R:{_:"0"},M:{"0":0.4393},Q:{"13.1":0},O:{"0":0.01498},H:{"0":0.15124}};
    +module.exports={C:{"48":0.00544,"52":0.01633,"56":0.00544,"59":0.01089,"78":0.01633,"88":0.00544,"91":0.00544,"102":0.01089,"113":0.02722,"115":0.30481,"116":0.00544,"117":0.01089,"118":0.06532,"119":1.90505,"120":0.38101,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 49 50 51 53 54 55 57 58 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 90 92 93 94 95 96 97 98 99 100 101 103 104 105 106 107 108 109 110 111 112 114 121 122 123 3.5 3.6"},D:{"38":0.00544,"49":0.01089,"63":0.00544,"66":0.04899,"74":0.00544,"75":0.00544,"76":0.01089,"77":0.00544,"79":0.02722,"80":0.00544,"81":0.00544,"84":0.00544,"85":0.03266,"86":0.03266,"87":0.03266,"88":0.00544,"89":0.04354,"90":0.00544,"91":0.01089,"92":0.02722,"93":0.22861,"94":0.01633,"95":0.00544,"96":0.00544,"97":0.00544,"98":0.00544,"99":0.01089,"100":0.0381,"101":0.06532,"102":0.0381,"103":0.33747,"104":0.04899,"105":0.0381,"106":0.02177,"107":0.01633,"108":0.0381,"109":1.02328,"110":0.0381,"111":0.0381,"112":0.05443,"113":0.06532,"114":0.13608,"115":0.14696,"116":0.84367,"117":1.52948,"118":10.03689,"119":21.09163,"120":0.02177,"121":0.00544,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 47 48 50 51 52 53 54 55 56 57 58 59 60 61 62 64 65 67 68 69 70 71 72 73 78 83 122"},F:{"46":0.00544,"85":0.00544,"89":0.00544,"95":0.01633,"102":0.46266,"103":0.07076,"104":0.40278,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 86 87 88 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"16":0.00544,"17":0.00544,"88":0.00544,"92":0.00544,"96":0.00544,"103":0.01089,"104":0.00544,"107":0.00544,"108":0.00544,"109":0.1143,"110":0.00544,"111":0.00544,"112":0.09797,"113":0.04354,"114":0.01633,"115":0.02177,"116":0.05987,"117":0.23949,"118":1.5186,"119":6.48261,_:"12 13 14 15 18 79 80 81 83 84 85 86 87 89 90 91 93 94 95 97 98 99 100 101 102 105 106"},E:{"13":0.00544,"14":0.06532,"15":0.01089,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 6.1 7.1 9.1 10.1","5.1":0.00544,"11.1":0.01089,"12.1":0.01633,"13.1":0.09253,"14.1":0.19595,"15.1":0.02722,"15.2-15.3":0.03266,"15.4":0.06532,"15.5":0.0762,"15.6":0.50076,"16.0":0.04354,"16.1":0.11975,"16.2":0.1143,"16.3":0.30481,"16.4":0.11975,"16.5":0.22316,"16.6":1.58936,"17.0":0.43544,"17.1":0.91442,"17.2":0.00544},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00483,"5.0-5.1":0.00483,"6.0-6.1":0.01209,"7.0-7.1":0.01692,"8.1-8.4":0.00242,"9.0-9.2":0.01934,"9.3":0.06043,"10.0-10.2":0.00483,"10.3":0.08701,"11.0-11.2":0.04109,"11.3-11.4":0.03626,"12.0-12.1":0.02175,"12.2-12.5":0.39639,"13.0-13.1":0.00967,"13.2":0.04109,"13.3":0.02417,"13.4-13.7":0.07009,"14.0-14.4":0.18611,"14.5-14.8":0.30213,"15.0-15.1":0.11843,"15.2-15.3":0.14502,"15.4":0.16194,"15.5":0.2272,"15.6-15.7":1.19401,"16.0":0.56075,"16.1":1.12392,"16.2":0.539,"16.3":1.01032,"16.4":0.20786,"16.5":0.53658,"16.6-16.7":9.09529,"17.0":2.724,"17.1":4.57544,"17.2":0.13052},P:{"4":0.06289,"20":0.03144,"21":0.08385,"22":0.2201,"23":2.87182,"5.0-5.4":0.01048,_:"6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 14.0 15.0","13.0":0.01048,"16.0":0.02096,"17.0":0.01048,"18.0":0.01048,"19.0":0.02096},I:{"0":0.04534,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00014},K:{"0":0.15038,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.02722,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.01823},H:{"0":0},L:{"0":17.6466},R:{_:"0"},M:{"0":0.31443},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SG.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SG.js
    index 8b9cf6bdead1b5..2bb5fa4aa129a7 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SG.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SG.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00332,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.03985,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.01328,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00332,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00996,"103":0.00332,"104":0.00332,"105":0.00664,"106":0.00996,"107":0.00332,"108":0.00332,"109":0.00664,"110":0.00332,"111":0.00664,"112":0.00332,"113":0.00332,"114":0.00332,"115":0.03985,"116":0.02657,"117":0.43173,"118":0.03653,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00664,"35":0,"36":0,"37":0,"38":0.03321,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00664,"48":0.00332,"49":0.00332,"50":0,"51":0,"52":0,"53":0.00664,"54":0,"55":0,"56":0.00332,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00332,"66":0,"67":0.00332,"68":0.00332,"69":0.00332,"70":0,"71":0,"72":0.00332,"73":0.00332,"74":0,"75":0.00332,"76":0.00332,"77":0,"78":0.00664,"79":0.08967,"80":0.00332,"81":0.01993,"83":0.00664,"84":0.00332,"85":0.00996,"86":0.01328,"87":0.04982,"88":0.00332,"89":0.00332,"90":0,"91":0.00332,"92":0.00332,"93":0,"94":0.00664,"95":0.00332,"96":0.00332,"97":0.00332,"98":0.00664,"99":0.02657,"100":0.01328,"101":0.01328,"102":0.00996,"103":0.03321,"104":0.01328,"105":0.03321,"106":0.03653,"107":0.04982,"108":0.07306,"109":0.24575,"110":0.04982,"111":0.03985,"112":0.04982,"113":0.02657,"114":0.57785,"115":0.15609,"116":4.51656,"117":0.97637,"118":0.00664,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00996,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00332,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.01661,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00332,"70":0,"71":0.00332,"72":0.0797,"73":0.01661,"74":0.00332,"75":0,"76":0,"77":0.02325,"78":0.00332,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.00332,"92":0,"93":0.00332,"94":0.00664,"95":0.00664,"96":0,"97":0,"98":0,"99":0,"100":0.01328,"101":0.05978,"102":0.0631,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00332,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0.00332,"106":0.00332,"107":0.01328,"108":0.00996,"109":0.01661,"110":0.00664,"111":0.00664,"112":0.00332,"113":0.00332,"114":0.00996,"115":0.02657,"116":0.49483,"117":0.3321},E:{"4":0,"5":0,"6":0,"7":0,"8":0.00332,"9":0,"10":0,"11":0,"12":0,"13":0.00332,"14":0.01993,"15":0.00332,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.01661,"14.1":0.04317,"15.1":0.00664,"15.2-15.3":0.00664,"15.4":0.01661,"15.5":0.02989,"15.6":0.12288,"16.0":0.02325,"16.1":0.03653,"16.2":0.02657,"16.3":0.08635,"16.4":0.02325,"16.5":0.09299,"16.6":0.74058,"17.0":0.02989,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0.00496,"7.0-7.1":0.00992,"8.1-8.4":0.00744,"9.0-9.2":0.00992,"9.3":0.06448,"10.0-10.2":0,"10.3":0.06448,"11.0-11.2":0.01736,"11.3-11.4":0.01488,"12.0-12.1":0.0124,"12.2-12.5":0.26537,"13.0-13.1":0.00992,"13.2":0,"13.3":0.02728,"13.4-13.7":0.03224,"14.0-14.4":0.12152,"14.5-14.8":0.21577,"15.0-15.1":0.12152,"15.2-15.3":0.10664,"15.4":0.10912,"15.5":0.16121,"15.6-15.7":1.17061,"16.0":0.71923,"16.1":1.32189,"16.2":0.63739,"16.3":1.11108,"16.4":0.16617,"16.5":0.61258,"16.6":16.27441,"17.0":1.16813,"17.1":0},P:{"4":0.50563,"20":0.04128,"21":0.10319,"22":3.07503,"5.0-5.4":0.04128,"6.2-6.4":0.01032,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0.02064,"11.1-11.2":0,"12.0":0.01032,"13.0":0.02064,"14.0":0,"15.0":0,"16.0":0.02064,"17.0":0.01032,"18.0":0.01032,"19.0":0.03096},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":27.13321},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00588,"9":0.01175,"10":0,"11":0.05876,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":27.83964},R:{_:"0"},M:{"0":0.47421},Q:{"13.1":0.01336},O:{"0":0.52096},H:{"0":0.71453}};
    +module.exports={C:{"34":0.00371,"48":0.00741,"52":0.00371,"61":0.00371,"78":0.02224,"83":0.00371,"88":0.01482,"102":0.00741,"103":0.00371,"104":0.01112,"105":0.00741,"106":0.00741,"107":0.00741,"108":0.00741,"109":0.00741,"110":0.01112,"111":0.01112,"112":0.00371,"113":0.01112,"114":0.00371,"115":0.126,"116":0.00371,"117":0.00741,"118":0.02965,"119":2.27548,"120":0.28166,"121":0.00371,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 49 50 51 53 54 55 56 57 58 59 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 84 85 86 87 89 90 91 92 93 94 95 96 97 98 99 100 101 122 123 3.5 3.6"},D:{"34":0.02965,"36":0.00371,"38":0.09636,"41":0.00741,"47":0.01853,"48":0.00371,"49":0.01112,"50":0.00371,"53":0.02594,"55":0.00371,"56":0.01482,"61":0.00371,"62":0.00371,"63":0.00371,"65":0.00741,"66":0.00371,"67":0.00371,"69":0.00741,"70":0.00371,"71":0.00371,"72":0.00371,"73":0.01112,"74":0.00371,"75":0.01853,"76":0.00371,"77":0.4336,"78":0.02224,"79":0.32613,"80":0.01112,"81":0.03335,"83":0.02224,"84":0.00741,"85":0.14083,"86":0.05559,"87":0.2446,"88":0.00371,"89":0.01853,"90":0.00741,"91":0.01112,"92":0.00741,"93":0.00371,"94":0.03706,"95":0.02594,"96":0.01482,"97":0.00741,"98":0.01482,"99":0.03335,"100":0.04077,"101":0.06671,"102":0.05188,"103":0.11489,"104":0.05559,"105":0.72267,"106":0.09265,"107":0.10377,"108":0.14453,"109":0.81532,"110":0.08524,"111":0.09636,"112":0.10377,"113":0.05188,"114":1.77517,"115":0.06671,"116":0.45584,"117":0.42619,"118":3.71712,"119":13.98644,"120":0.02594,"121":0.01112,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 37 39 40 42 43 44 45 46 51 52 54 57 58 59 60 64 68 122"},F:{"28":0.02224,"36":0.01482,"46":0.06671,"74":0.00371,"92":0.00371,"93":0.00371,"94":0.00371,"95":0.00741,"102":0.14083,"103":0.063,"104":0.26313,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"14":0.00371,"18":0.00371,"92":0.00371,"103":0.00371,"105":0.00371,"106":0.00741,"107":0.01853,"108":0.01482,"109":0.03335,"110":0.00371,"111":0.00741,"112":0.04447,"113":0.01112,"114":0.01112,"115":0.01112,"116":0.063,"117":0.05188,"118":0.50402,"119":2.29772,_:"12 13 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 104"},E:{"8":0.00371,"11":0.00371,"13":0.01482,"14":0.05559,"15":0.01112,_:"0 4 5 6 7 9 10 12 3.1 3.2 5.1 6.1 7.1 10.1 11.1","9.1":0.00371,"12.1":0.01112,"13.1":0.05188,"14.1":0.11859,"15.1":0.02224,"15.2-15.3":0.01482,"15.4":0.05188,"15.5":0.08153,"15.6":0.35948,"16.0":0.07412,"16.1":0.10747,"16.2":0.07783,"16.3":0.23718,"16.4":0.0593,"16.5":0.17418,"16.6":1.63435,"17.0":0.34095,"17.1":0.69673,"17.2":0.00741},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00348,"5.0-5.1":0.00348,"6.0-6.1":0.0087,"7.0-7.1":0.01218,"8.1-8.4":0.00174,"9.0-9.2":0.01392,"9.3":0.04349,"10.0-10.2":0.00348,"10.3":0.06263,"11.0-11.2":0.02957,"11.3-11.4":0.02609,"12.0-12.1":0.01566,"12.2-12.5":0.2853,"13.0-13.1":0.00696,"13.2":0.02957,"13.3":0.0174,"13.4-13.7":0.05045,"14.0-14.4":0.13395,"14.5-14.8":0.21746,"15.0-15.1":0.08524,"15.2-15.3":0.10438,"15.4":0.11656,"15.5":0.16353,"15.6-15.7":0.85939,"16.0":0.4036,"16.1":0.80894,"16.2":0.38794,"16.3":0.72718,"16.4":0.14961,"16.5":0.3862,"16.6-16.7":6.54635,"17.0":1.9606,"17.1":3.29318,"17.2":0.09394},P:{"4":0.56891,"20":0.03161,"21":0.07375,"22":0.18964,"23":3.33968,"5.0-5.4":0.04214,"6.2-6.4":0.02107,_:"7.2-7.4 8.2 9.2 14.0 15.0","10.1":0.01054,"11.1-11.2":0.01054,"12.0":0.01054,"13.0":0.02107,"16.0":0.02107,"17.0":0.02107,"18.0":0.01054,"19.0":0.02107},I:{"0":11.79861,"3":0.00119,"4":0.00237,"2.1":0,"2.2":0.00237,"2.3":0,"4.1":0.00119,"4.2-4.3":0.0083,"4.4":0,"4.4.3-4.4.4":0.03557},K:{"0":0.8371,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00791,"9":0.05534,"11":0.17393,_:"6 7 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.61681},H:{"0":0},L:{"0":26.51289},R:{_:"0"},M:{"0":0.55387},Q:{"13.1":0.04406}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SH.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SH.js
    index bc7c8080d11668..d892f8326dee4b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SH.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SH.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":100,"118":0,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0,"16.0":0,"16.1":0,"16.2":0,"16.3":0,"16.4":0,"16.5":0,"16.6":0,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0,"14.0-14.4":0,"14.5-14.8":0,"15.0-15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6-15.7":0,"16.0":0,"16.1":0,"16.2":0,"16.3":0,"16.4":0,"16.5":0,"16.6":0,"17.0":0,"17.1":0},P:{"4":0,"20":0,"21":0,"22":0,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0,"17.0":0,"18.0":0,"19.0":0},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":0},R:{_:"0"},M:{"0":0},Q:{"13.1":0},O:{"0":0},H:{"0":0}};
    +module.exports={C:{"115":10.86571,"117":0.00686,"119":0.20592,"120":0.06864,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 116 118 121 122 123 3.5 3.6"},D:{"45":0.00686,"49":0.23338,"50":0.01373,"70":0.04118,"73":0.02746,"87":0.00686,"88":0.00686,"103":0.10296,"105":0.00686,"109":1.2767,"112":0.00686,"115":0.00686,"116":0.11669,"117":1.23552,"118":3.10939,"119":27.83352,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 71 72 74 75 76 77 78 79 80 81 83 84 85 86 89 90 91 92 93 94 95 96 97 98 99 100 101 102 104 106 107 108 110 111 113 114 120 121 122"},F:{"95":0.03432,"102":0.30888,"103":0.74818,"104":0.04118,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"14":0.00686,"109":0.06178,"113":0.24024,"115":0.00686,"117":0.01373,"118":8.93006,"119":4.33805,_:"12 13 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 111 112 114 116"},E:{"13":0.00686,_:"0 4 5 6 7 8 9 10 11 12 14 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 13.1 14.1 15.1 15.2-15.3 15.4 15.5 15.6 16.0 16.1 16.2 16.3 16.4 16.5 16.6 17.2","12.1":0.03432,"17.0":0.01373,"17.1":0.00686},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00026,"5.0-5.1":0.00026,"6.0-6.1":0.00064,"7.0-7.1":0.0009,"8.1-8.4":0.00013,"9.0-9.2":0.00103,"9.3":0.00322,"10.0-10.2":0.00026,"10.3":0.00464,"11.0-11.2":0.00219,"11.3-11.4":0.00193,"12.0-12.1":0.00116,"12.2-12.5":0.02113,"13.0-13.1":0.00052,"13.2":0.00219,"13.3":0.00129,"13.4-13.7":0.00374,"14.0-14.4":0.00992,"14.5-14.8":0.01611,"15.0-15.1":0.00631,"15.2-15.3":0.00773,"15.4":0.00863,"15.5":0.01211,"15.6-15.7":0.06365,"16.0":0.02989,"16.1":0.05991,"16.2":0.02873,"16.3":0.05386,"16.4":0.01108,"16.5":0.0286,"16.6-16.7":0.48486,"17.0":0.14521,"17.1":0.24391,"17.2":0.00696},P:{"4":0.03092,"22":0.1443,"23":0.42258,_:"20 21 5.0-5.4 6.2-6.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 17.0 18.0","7.2-7.4":0.04123,"16.0":0.01031,"19.0":0.10307},I:{"0":0.00312,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.00001},K:{"0":0.10973,_:"10 11 12 11.1 11.5 12.1"},A:{_:"6 7 8 9 10 11 5.5"},N:{_:"10 11"},S:{"2.5":0.07838,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.15048},H:{"0":0},L:{"0":37.50826},R:{_:"0"},M:{"0":0.00314},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SI.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SI.js
    index 863d46b8c470e4..ab3cd2caae1f4d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SI.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SI.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.04198,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.00525,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00525,"69":0,"70":0,"71":0,"72":0.00525,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.01049,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.01049,"89":0,"90":0,"91":0.00525,"92":0.00525,"93":0,"94":0.00525,"95":0,"96":0,"97":0.00525,"98":0,"99":0.00525,"100":0.00525,"101":0,"102":0.07871,"103":0.01049,"104":0.00525,"105":0,"106":0,"107":0.00525,"108":0.01049,"109":0.01049,"110":0.01574,"111":0.03148,"112":0.01574,"113":0.04722,"114":0.03148,"115":0.51421,"116":0.1784,"117":2.94357,"118":0.20988,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0.00525,"42":0,"43":0,"44":0.00525,"45":0,"46":0,"47":0,"48":0,"49":0.05247,"50":0,"51":0.03148,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.01049,"69":0.00525,"70":0.00525,"71":0.00525,"72":0.00525,"73":0,"74":0.01049,"75":0.00525,"76":0.00525,"77":0.00525,"78":0.01049,"79":0.02624,"80":0.01574,"81":0.01049,"83":0.01049,"84":0.00525,"85":0.01574,"86":0.01049,"87":0.01574,"88":0.01574,"89":0.01049,"90":0.02099,"91":0.00525,"92":0.00525,"93":0.00525,"94":0.07346,"95":0.00525,"96":0.00525,"97":0,"98":0.01574,"99":0.02099,"100":0.01049,"101":0.00525,"102":0.00525,"103":0.03148,"104":0.01574,"105":0.03673,"106":0.01574,"107":0.02099,"108":0.02099,"109":1.26453,"110":0.01049,"111":0.01574,"112":0.03673,"113":0.02624,"114":0.1784,"115":0.31482,"116":11.48568,"117":2.8911,"118":0.01574,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.01574,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.01049,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.01049,"70":0,"71":0,"72":0.00525,"73":0,"74":0,"75":0,"76":0.00525,"77":0.01574,"78":0.00525,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00525,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01049,"96":0,"97":0,"98":0,"99":0.01574,"100":0.10494,"101":0.43025,"102":0.5247,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0.00525,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0.00525,"84":0.00525,"85":0.00525,"86":0,"87":0,"88":0,"89":0.00525,"90":0,"91":0,"92":0.00525,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00525,"108":0.00525,"109":0.06296,"110":0.00525,"111":0.00525,"112":0.00525,"113":0.00525,"114":0.02099,"115":0.06296,"116":1.80497,"117":1.34323},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00525,"14":0.02099,"15":0.00525,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.03673,"10.1":0,"11.1":0,"12.1":0.00525,"13.1":0.03148,"14.1":0.08395,"15.1":0.00525,"15.2-15.3":0.00525,"15.4":0.01049,"15.5":0.01574,"15.6":0.11019,"16.0":0.02099,"16.1":0.08395,"16.2":0.06821,"16.3":0.13118,"16.4":0.03148,"16.5":0.14167,"16.6":0.50896,"17.0":0.03673,"17.1":0},G:{"8":0.00174,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00523,"8.1-8.4":0.00523,"9.0-9.2":0.00523,"9.3":0.04529,"10.0-10.2":0,"10.3":0.03484,"11.0-11.2":0.02265,"11.3-11.4":0.01045,"12.0-12.1":0.0209,"12.2-12.5":0.1533,"13.0-13.1":0.00348,"13.2":0.00348,"13.3":0.01219,"13.4-13.7":0.02961,"14.0-14.4":0.0662,"14.5-14.8":0.19685,"15.0-15.1":0.054,"15.2-15.3":0.05575,"15.4":0.10626,"15.5":0.10626,"15.6-15.7":0.94942,"16.0":0.76999,"16.1":1.00168,"16.2":0.62017,"16.3":0.81179,"16.4":0.16549,"16.5":0.52087,"16.6":9.79031,"17.0":1.71592,"17.1":0},P:{"4":0.08162,"20":0.04081,"21":0.18363,"22":3.18299,"5.0-5.4":0.0102,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0.0102,"10.1":0,"11.1-11.2":0.0102,"12.0":0,"13.0":0.0204,"14.0":0.05101,"15.0":0.0102,"16.0":0.03061,"17.0":0.0102,"18.0":0.0204,"19.0":0.03061},I:{"0":0,"3":0,"4":0.00652,"2.1":0,"2.2":0.00326,"2.3":0.00652,"4.1":0.03587,"4.2-4.3":0.00978,"4.4":0,"4.4.3-4.4.4":0.08804},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.01049,"9":0,"10":0.00525,"11":0.02624,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":48.02303},R:{_:"0"},M:{"0":0.71295},Q:{"13.1":0},O:{"0":0.10932},H:{"0":0.22049}};
    +module.exports={C:{"9":0.00526,"52":0.10518,"60":0.01052,"68":0.00526,"78":0.03155,"80":0.00526,"83":0.01052,"88":0.03681,"89":0.00526,"91":0.01578,"95":0.00526,"96":0.04207,"97":0.00526,"99":0.01052,"102":0.03681,"103":0.01578,"104":0.00526,"107":0.00526,"108":0.01052,"109":0.00526,"110":0.01052,"111":0.03681,"112":0.00526,"113":0.03681,"114":0.0263,"115":1.04654,"116":0.02104,"117":0.0263,"118":0.27873,"119":4.42282,"120":1.3463,_:"2 3 4 5 6 7 8 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 61 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 79 81 82 84 85 86 87 90 92 93 94 98 100 101 105 106 121 122 123 3.5 3.6"},D:{"38":0.00526,"44":0.00526,"45":0.00526,"48":0.00526,"49":0.0263,"51":0.03681,"63":0.01578,"71":0.00526,"76":0.00526,"79":0.04207,"80":0.01052,"81":0.00526,"83":0.00526,"84":0.00526,"85":0.01052,"86":0.00526,"87":0.02104,"88":0.01052,"89":0.00526,"90":0.01052,"91":0.01578,"92":0.00526,"93":0.00526,"94":0.0263,"95":0.00526,"96":0.00526,"97":0.00526,"98":0.03155,"99":0.02104,"100":0.01578,"101":0.00526,"102":0.01052,"103":0.05259,"104":0.01052,"105":0.01578,"106":0.01052,"107":0.03155,"108":0.04733,"109":2.40862,"110":0.01578,"111":0.05259,"112":0.04207,"113":0.04733,"114":0.17881,"115":0.05785,"116":0.32606,"117":0.49961,"118":6.45805,"119":22.47171,"120":0.06311,"121":0.00526,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 46 47 50 52 53 54 55 56 57 58 59 60 61 62 64 65 66 67 68 69 70 72 73 74 75 77 78 122"},F:{"28":0.00526,"32":0.00526,"46":0.02104,"95":0.0263,"99":0.03155,"102":0.58901,"103":0.2945,"104":0.89929,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"85":0.00526,"92":0.00526,"107":0.01578,"108":0.00526,"109":0.15777,"113":0.00526,"114":0.01578,"115":0.0263,"116":0.02104,"117":0.05259,"118":0.98869,"119":4.80673,_:"12 13 14 15 16 17 18 79 80 81 83 84 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 110 111 112"},E:{"8":0.01578,"9":0.00526,"14":0.03155,"15":0.00526,_:"0 4 5 6 7 10 11 12 13 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.00526,"13.1":0.06837,"14.1":0.24191,"15.1":0.01052,"15.2-15.3":0.01052,"15.4":0.02104,"15.5":0.03155,"15.6":0.15251,"16.0":0.03155,"16.1":0.07889,"16.2":0.11044,"16.3":0.17881,"16.4":0.04733,"16.5":0.21036,"16.6":0.67315,"17.0":0.26295,"17.1":0.46805,"17.2":0.01578},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00215,"5.0-5.1":0.00215,"6.0-6.1":0.00537,"7.0-7.1":0.00751,"8.1-8.4":0.00107,"9.0-9.2":0.00858,"9.3":0.02683,"10.0-10.2":0.00215,"10.3":0.03863,"11.0-11.2":0.01824,"11.3-11.4":0.0161,"12.0-12.1":0.00966,"12.2-12.5":0.17599,"13.0-13.1":0.00429,"13.2":0.01824,"13.3":0.01073,"13.4-13.7":0.03112,"14.0-14.4":0.08263,"14.5-14.8":0.13414,"15.0-15.1":0.05258,"15.2-15.3":0.06439,"15.4":0.0719,"15.5":0.10087,"15.6-15.7":0.53012,"16.0":0.24896,"16.1":0.499,"16.2":0.2393,"16.3":0.44856,"16.4":0.09229,"16.5":0.23823,"16.6-16.7":4.03813,"17.0":1.2094,"17.1":2.03141,"17.2":0.05795},P:{"4":0.13535,"20":0.04164,"21":0.10411,"22":0.38521,"23":2.8839,"5.0-5.4":0.02082,_:"6.2-6.4 7.2-7.4 8.2 9.2 10.1 12.0","11.1-11.2":0.01041,"13.0":0.02082,"14.0":0.04164,"15.0":0.02082,"16.0":0.02082,"17.0":0.01041,"18.0":0.01041,"19.0":0.02082},I:{"0":0.06606,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00005,"4.4":0,"4.4.3-4.4.4":0.0002},K:{"0":0.27926,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.01578,"10":0.00526,"11":0.05259,_:"6 7 9 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.12803},H:{"0":0.01},L:{"0":32.33722},R:{_:"0"},M:{"0":0.5311},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SK.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SK.js
    index 40c4f494da50f2..beea19daf50937 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SK.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SK.js
    @@ -1 +1 @@
    -module.exports={C:{"34":0.00453,"43":0.00905,"51":0.00453,"52":0.0905,"56":0.0181,"61":0.00453,"68":0.0362,"72":0.00453,"78":0.0181,"79":0.00453,"88":0.00905,"91":0.0181,"99":0.01358,"101":0.00453,"102":0.07693,"103":0.00453,"104":0.00453,"105":0.00905,"108":0.02263,"109":0.01358,"110":0.00905,"111":0.01358,"112":0.02715,"113":0.0362,"114":0.04073,"115":0.91405,"116":0.24888,"117":3.80553,"118":0.4163,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 44 45 46 47 48 49 50 53 54 55 57 58 59 60 62 63 64 65 66 67 69 70 71 73 74 75 76 77 80 81 82 83 84 85 86 87 89 90 92 93 94 95 96 97 98 100 106 107 119 120 3.5 3.6"},D:{"34":0.0181,"38":0.04525,"41":0.00905,"47":0.01358,"49":0.0543,"53":0.04073,"63":0.08598,"67":0.00453,"68":0.01358,"70":0.00453,"72":0.00453,"76":0.00453,"77":0.08145,"78":0.00453,"79":0.362,"80":0.00905,"81":0.0181,"83":0.01358,"84":0.00905,"85":0.0543,"86":0.02263,"87":0.06788,"88":0.0362,"89":0.01358,"90":0.02715,"91":0.02263,"92":0.00905,"93":0.08145,"94":0.00905,"96":0.01358,"97":0.00453,"98":0.00905,"99":0.01358,"100":0.00905,"101":0.00905,"102":0.0181,"103":0.06335,"104":0.02715,"105":0.01358,"106":0.0181,"107":0.0362,"108":0.0362,"109":2.52043,"110":0.02263,"111":0.07693,"112":0.0543,"113":0.04073,"114":0.3258,"115":0.5068,"116":17.37148,"117":5.13135,"118":0.00905,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 39 40 42 43 44 45 46 48 50 51 52 54 55 56 57 58 59 60 61 62 64 65 66 69 71 73 74 75 95 119 120"},F:{"28":0.0181,"36":0.00905,"46":0.0543,"77":0.00905,"85":0.02263,"93":0.01358,"95":0.19005,"96":0.00905,"98":0.00453,"99":0.01358,"100":0.2896,"101":1.15388,"102":1.3756,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 78 79 80 81 82 83 84 86 87 88 89 90 91 92 94 97 9.5-9.6 10.5 10.6 11.1 11.5 11.6 12.1","10.0-10.1":0},B:{"83":0.00453,"84":0.03168,"92":0.01358,"105":0.01358,"107":0.02715,"108":0.01358,"109":0.11313,"110":0.00905,"112":0.00905,"113":0.00905,"114":0.0543,"115":0.17195,"116":2.2444,"117":2.10413,_:"12 13 14 15 16 17 18 79 80 81 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 106 111"},E:{"4":0,"13":0.00453,"14":0.03168,"15":0.00453,_:"0 5 6 7 8 9 10 11 12 3.1 3.2 5.1 6.1 7.1 10.1 11.1 17.1","9.1":0.00905,"12.1":0.0181,"13.1":0.04073,"14.1":0.07693,"15.1":0.00905,"15.2-15.3":0.00905,"15.4":0.02263,"15.5":0.02715,"15.6":0.15385,"16.0":0.02263,"16.1":0.0543,"16.2":0.06335,"16.3":0.11313,"16.4":0.0543,"16.5":0.24435,"16.6":0.8326,"17.0":0.0905},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00232,"6.0-6.1":0,"7.0-7.1":0.00232,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.00927,"10.0-10.2":0,"10.3":0.04056,"11.0-11.2":0.00579,"11.3-11.4":0.00348,"12.0-12.1":0.00464,"12.2-12.5":0.09966,"13.0-13.1":0.00232,"13.2":0.00811,"13.3":0.24568,"13.4-13.7":0.00695,"14.0-14.4":0.09155,"14.5-14.8":0.10662,"15.0-15.1":0.03593,"15.2-15.3":0.04172,"15.4":0.04404,"15.5":0.09039,"15.6-15.7":0.79152,"16.0":0.3129,"16.1":0.62812,"16.2":0.28509,"16.3":0.54931,"16.4":0.08112,"16.5":0.26307,"16.6":6.60451,"17.0":1.0627,"17.1":0.00116},P:{"4":0.40275,"20":0.04131,"21":0.12392,"22":2.29259,"5.0-5.4":0.03098,"6.2-6.4":0.01033,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0.02064,"11.1-11.2":0,"12.0":0.01032,"13.0":0.02065,"14.0":0,"15.0":0,"16.0":0.03098,"17.0":0.01033,"18.0":0.01032,"19.0":0.03098},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.01027,"4.2-4.3":0.01643,"4.4":0,"4.4.3-4.4.4":0.05543},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"8":0.00905,"11":0.06335,_:"6 7 9 10 5.5"},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":40.38643},R:{_:"0"},M:{"0":0.29565},Q:{"13.1":0},O:{"0":0.03285},H:{"0":0.66347}};
    +module.exports={C:{"34":0.00489,"43":0.00489,"52":0.08316,"56":0.00489,"64":0.00489,"66":0.00489,"68":0.01468,"69":0.00489,"71":0.00489,"72":0.01468,"78":0.01468,"79":0.00489,"80":0.00489,"81":0.00489,"82":0.00489,"83":0.00489,"88":0.01468,"89":0.00489,"91":0.01468,"93":0.00489,"96":0.00489,"99":0.00978,"100":0.00489,"102":0.02446,"103":0.01957,"104":0.00489,"105":0.00489,"106":0.00489,"107":0.00489,"108":0.00978,"109":0.00978,"110":0.00978,"111":0.01468,"112":0.01468,"113":0.01468,"114":0.01468,"115":0.93926,"116":0.01468,"117":0.07338,"118":0.15654,"119":3.88425,"120":1.07624,"121":0.00489,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 44 45 46 47 48 49 50 51 53 54 55 57 58 59 60 61 62 63 65 67 70 73 74 75 76 77 84 85 86 87 90 92 94 95 97 98 101 122 123 3.5 3.6"},D:{"34":0.00978,"38":0.03424,"41":0.00978,"43":0.00489,"47":0.01957,"48":0.00489,"49":0.03914,"53":0.02446,"55":0.00489,"58":0.00489,"63":0.09295,"67":0.00978,"68":0.01468,"69":0.00978,"70":0.00978,"71":0.01957,"72":0.00978,"73":0.00489,"74":0.00978,"75":0.00978,"76":0.00978,"77":0.00978,"78":0.00978,"79":0.44028,"80":0.01468,"81":0.02446,"83":0.01957,"84":0.01468,"85":0.02446,"86":0.02935,"87":0.07827,"88":0.03424,"89":0.01468,"90":0.02935,"91":0.00978,"92":0.00978,"93":0.09784,"94":0.01468,"95":0.00489,"96":0.00489,"97":0.00489,"98":0.01468,"99":0.01468,"100":0.00978,"101":0.01468,"102":0.01957,"103":0.08806,"104":0.00489,"105":0.01957,"106":0.02446,"107":0.02446,"108":0.07338,"109":2.56341,"110":0.02446,"111":0.03914,"112":0.03914,"113":0.02935,"114":0.16144,"115":0.07827,"116":0.22503,"117":0.34244,"118":5.57199,"119":19.88598,"120":0.02446,"121":0.00489,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 39 40 42 44 45 46 50 51 52 54 56 57 59 60 61 62 64 65 66 122"},F:{"28":0.01468,"36":0.00489,"40":0.00489,"46":0.04892,"55":0.00489,"73":0.00489,"79":0.00489,"85":0.00489,"91":0.00489,"95":0.19568,"97":0.00489,"99":0.00489,"101":0.00489,"102":0.68488,"103":0.53323,"104":1.69263,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 41 42 43 44 45 47 48 49 50 51 52 53 54 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 74 75 76 77 78 80 81 82 83 84 86 87 88 89 90 92 93 94 96 98 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"14":0.00489,"17":0.00489,"18":0.00489,"83":0.00489,"85":0.00489,"87":0.00489,"92":0.00489,"105":0.01468,"107":0.00489,"109":0.08316,"110":0.00978,"111":0.00489,"112":0.00978,"113":0.00489,"114":0.02935,"115":0.01468,"116":0.01468,"117":0.17611,"118":0.82675,"119":3.86957,_:"12 13 15 16 79 80 81 84 86 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 106 108"},E:{"14":0.01957,"15":0.00978,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 5.1 6.1 7.1 10.1 11.1","9.1":0.0587,"12.1":0.01468,"13.1":0.04403,"14.1":0.07827,"15.1":0.00978,"15.2-15.3":0.00978,"15.4":0.02446,"15.5":0.02935,"15.6":0.14676,"16.0":0.01957,"16.1":0.04403,"16.2":0.07338,"16.3":0.11741,"16.4":0.04403,"16.5":0.10762,"16.6":0.44517,"17.0":0.24949,"17.1":0.43539,"17.2":0.02935},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00211,"5.0-5.1":0.00211,"6.0-6.1":0.00528,"7.0-7.1":0.00739,"8.1-8.4":0.00106,"9.0-9.2":0.00844,"9.3":0.02638,"10.0-10.2":0.00211,"10.3":0.03799,"11.0-11.2":0.01794,"11.3-11.4":0.01583,"12.0-12.1":0.0095,"12.2-12.5":0.17307,"13.0-13.1":0.00422,"13.2":0.01794,"13.3":0.01055,"13.4-13.7":0.0306,"14.0-14.4":0.08126,"14.5-14.8":0.13191,"15.0-15.1":0.05171,"15.2-15.3":0.06332,"15.4":0.07071,"15.5":0.0992,"15.6-15.7":0.52132,"16.0":0.24483,"16.1":0.49072,"16.2":0.23533,"16.3":0.44112,"16.4":0.09076,"16.5":0.23428,"16.6-16.7":3.97114,"17.0":1.18934,"17.1":1.99771,"17.2":0.05699},P:{"4":0.41538,"20":0.03115,"21":0.06231,"22":0.15577,"23":2.06649,"5.0-5.4":0.01038,"6.2-6.4":0.01038,_:"7.2-7.4 8.2 9.2 10.1 12.0 15.0","11.1-11.2":0.01038,"13.0":0.01038,"14.0":0.01038,"16.0":0.01038,"17.0":0.01038,"18.0":0.01038,"19.0":0.02077},I:{"0":0.06099,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00004,"4.4":0,"4.4.3-4.4.4":0.00018},K:{"0":0.54656,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00978,"11":0.03914,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.03065},H:{"0":0},L:{"0":37.27981},R:{_:"0"},M:{"0":0.29626},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SL.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SL.js
    index d226e23dc21005..62be6c34558b49 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SL.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SL.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.0116,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0.00193,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00193,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00193,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.02127,"116":0.0058,"117":0.09283,"118":0.01354,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0.00193,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00193,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00193,"58":0.00193,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00387,"65":0.0116,"66":0,"67":0,"68":0,"69":0,"70":0.00193,"71":0,"72":0.00193,"73":0,"74":0.00193,"75":0.00193,"76":0.00387,"77":0.00193,"78":0,"79":0.00774,"80":0.00193,"81":0.00193,"83":0.0058,"84":0,"85":0,"86":0,"87":0.00193,"88":0.00193,"89":0,"90":0,"91":0,"92":0.0116,"93":0.01354,"94":0.00193,"95":0.00193,"96":0,"97":0,"98":0,"99":0.0058,"100":0,"101":0,"102":0.00193,"103":0.01741,"104":0.00967,"105":0.0058,"106":0.00193,"107":0.00774,"108":0.00387,"109":0.04255,"110":0.00193,"111":0.00967,"112":0.0058,"113":0.0058,"114":0.01354,"115":0.01547,"116":0.72525,"117":0.16826,"118":0.00193,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0.00193,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0.00387,"25":0,"26":0.00387,"27":0.00193,"28":0.00193,"29":0,"30":0.0058,"31":0,"32":0.00193,"33":0.00193,"34":0,"35":0,"36":0,"37":0.00387,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00193,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00193,"54":0.0058,"55":0,"56":0.00193,"57":0.00193,"58":0.00387,"60":0.0851,"62":0,"63":0.1083,"64":0.06382,"65":0.0116,"66":0.07543,"67":0.04448,"68":0.0058,"69":0.24368,"70":0.08123,"71":0.205,"72":0.54732,"73":0.16246,"74":0,"75":0,"76":0,"77":0.02514,"78":0,"79":0.00193,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00387,"96":0,"97":0,"98":0.00193,"99":0,"100":0.00193,"101":0.05028,"102":0.05609,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.02127},B:{"12":0.00193,"13":0.00193,"14":0.00193,"15":0.00193,"16":0.00193,"17":0,"18":0.0058,"79":0,"80":0,"81":0,"83":0,"84":0.00193,"85":0,"86":0,"87":0,"88":0,"89":0.00193,"90":0,"91":0,"92":0.0058,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00193,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00387,"110":0.00193,"111":0.00193,"112":0.00967,"113":0.00193,"114":0.00193,"115":0.00774,"116":0.15085,"117":0.1025},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00387,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00774,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0.00193,"12.1":0,"13.1":0.00193,"14.1":0.00193,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0.01547,"16.0":0,"16.1":0.00193,"16.2":0,"16.3":0.0058,"16.4":0.00193,"16.5":0.00193,"16.6":0.02708,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0.00502,"7.0-7.1":0.08782,"8.1-8.4":0,"9.0-9.2":0.03346,"9.3":0.11543,"10.0-10.2":0,"10.3":0.2066,"11.0-11.2":0,"11.3-11.4":0.01255,"12.0-12.1":0.0184,"12.2-12.5":0.58801,"13.0-13.1":0.03764,"13.2":0.00167,"13.3":0.01422,"13.4-13.7":0.03848,"14.0-14.4":0.36301,"14.5-14.8":0.58299,"15.0-15.1":0.23002,"15.2-15.3":0.61979,"15.4":0.19907,"15.5":0.36552,"15.6-15.7":1.39349,"16.0":0.18903,"16.1":0.18736,"16.2":0.20576,"16.3":0.44665,"16.4":0.0987,"16.5":0.34879,"16.6":1.63103,"17.0":0.2802,"17.1":0},P:{"4":0.32312,"20":0.10097,"21":0.14136,"22":0.3837,"5.0-5.4":0.05049,"6.2-6.4":0,"7.2-7.4":0.10097,"8.2":0,"9.2":0.03029,"10.1":0.02019,"11.1-11.2":0.03029,"12.0":0,"13.0":0.02019,"14.0":0.0101,"15.0":0.0101,"16.0":0.02019,"17.0":0.02019,"18.0":0.06058,"19.0":0.02019},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.0027,"4.2-4.3":0.00946,"4.4":0,"4.4.3-4.4.4":0.12072},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00193,"5.5":0},S:{"2.5":0.12099,_:"3.0-3.1"},J:{"7":0,"10":0.00807},N:{"10":0,"11":0},L:{"0":69.80625},R:{_:"0"},M:{"0":0.10486},Q:{"13.1":0},O:{"0":0.70174},H:{"0":13.36364}};
    +module.exports={C:{"35":0.00429,"36":0.00143,"46":0.00143,"48":0.00286,"51":0.00143,"62":0.00143,"66":0.00143,"72":0.00143,"89":0.00143,"95":0.01002,"96":0.00143,"110":0.02576,"113":0.00143,"115":0.09731,"116":0.00143,"117":0.00143,"118":0.01288,"119":0.26474,"120":0.09302,"121":0.01717,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 37 38 39 40 41 42 43 44 45 47 49 50 52 53 54 55 56 57 58 59 60 61 63 64 65 67 68 69 70 71 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 90 91 92 93 94 97 98 99 100 101 102 103 104 105 106 107 108 109 111 112 114 122 123 3.5 3.6"},D:{"11":0.00859,"33":0.00143,"38":0.00716,"40":0.00143,"42":0.00143,"47":0.00429,"48":0.00286,"49":0.00572,"55":0.00143,"57":0.00143,"58":0.00143,"59":0.00143,"63":0.00143,"64":0.00572,"65":0.05724,"66":0.00286,"67":0.01574,"68":0.00143,"69":0.03005,"70":0.00143,"71":0.00143,"72":0.00429,"73":0.00143,"74":0.00716,"75":0.01002,"76":0.03148,"77":0.00716,"79":0.00572,"80":0.00286,"81":0.01288,"83":0.01431,"84":0.06153,"86":0.00143,"87":0.01145,"88":0.00429,"89":0.00859,"90":0.00429,"91":0.00572,"92":0.18031,"93":0.07012,"94":0.00143,"95":0.00716,"96":0.00143,"97":0.02003,"98":0.02719,"99":0.01431,"101":0.0186,"102":0.0186,"103":0.03864,"104":0.00143,"105":0.01431,"107":0.01002,"108":0.00286,"109":0.37349,"110":0.00286,"111":0.00286,"112":0.01002,"113":0.00859,"114":0.02576,"115":0.01145,"116":0.06153,"117":0.10446,"118":0.95162,"119":3.39433,"120":0.00572,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 37 39 41 43 44 45 46 50 51 52 53 54 56 60 61 62 78 85 100 106 121 122"},F:{"42":0.00143,"45":0.00143,"79":0.00143,"85":0.00143,"95":0.04436,"98":0.00143,"99":0.00143,"101":0.00429,"102":0.03005,"103":0.1245,"104":0.34058,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 43 44 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 86 87 88 89 90 91 92 93 94 96 97 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.01288,"13":0.00859,"14":0.00286,"15":0.00429,"16":0.00572,"17":0.00572,"18":0.03864,"84":0.00286,"88":0.00143,"89":0.00572,"90":0.01002,"92":0.05009,"99":0.00143,"100":0.00429,"106":0.00143,"108":0.00143,"109":0.01145,"110":0.00286,"112":0.00572,"113":0.00286,"114":0.01145,"115":0.00716,"116":0.01145,"117":0.02147,"118":0.24327,"119":1.0246,_:"79 80 81 83 85 86 87 91 93 94 95 96 97 98 101 102 103 104 105 107 111"},E:{"14":0.01145,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 6.1 7.1 9.1 10.1 15.1 15.2-15.3 15.4","5.1":0.01574,"11.1":0.00716,"12.1":0.00716,"13.1":0.00859,"14.1":0.01002,"15.5":0.00286,"15.6":0.05438,"16.0":0.00286,"16.1":0.00429,"16.2":0.00143,"16.3":0.04865,"16.4":0.0186,"16.5":0.00429,"16.6":0.05152,"17.0":0.02003,"17.1":0.02862,"17.2":0.00143},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00128,"5.0-5.1":0.00128,"6.0-6.1":0.0032,"7.0-7.1":0.00448,"8.1-8.4":0.00064,"9.0-9.2":0.00512,"9.3":0.016,"10.0-10.2":0.00128,"10.3":0.02304,"11.0-11.2":0.01088,"11.3-11.4":0.0096,"12.0-12.1":0.00576,"12.2-12.5":0.10496,"13.0-13.1":0.00256,"13.2":0.01088,"13.3":0.0064,"13.4-13.7":0.01856,"14.0-14.4":0.04928,"14.5-14.8":0.08,"15.0-15.1":0.03136,"15.2-15.3":0.0384,"15.4":0.04288,"15.5":0.06016,"15.6-15.7":0.31617,"16.0":0.14849,"16.1":0.29761,"16.2":0.14273,"16.3":0.26753,"16.4":0.05504,"16.5":0.14209,"16.6-16.7":2.40843,"17.0":0.72131,"17.1":1.21158,"17.2":0.03456},P:{"4":0.58122,"20":0.02004,"21":0.12025,"22":0.14029,"23":0.50105,"5.0-5.4":0.02004,_:"6.2-6.4 8.2 10.1 12.0 14.0","7.2-7.4":0.10021,"9.2":0.04008,"11.1-11.2":0.05011,"13.0":0.04008,"15.0":0.01002,"16.0":0.01002,"17.0":0.01002,"18.0":0.05011,"19.0":0.02004},I:{"0":0.09378,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00007,"4.4":0,"4.4.3-4.4.4":0.00028},K:{"0":10.75734,_:"10 11 12 11.1 11.5 12.1"},A:{"10":0.00465,"11":0.05116,_:"6 7 8 9 5.5"},N:{_:"10 11"},S:{"2.5":0.07711,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.53978},H:{"0":3.02},L:{"0":68.23559},R:{_:"0"},M:{"0":0.03427},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SM.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SM.js
    index c019e9e748ab5f..3cb5659d5e2938 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SM.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SM.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00848,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":38.61006,"103":0,"104":0,"105":0.00848,"106":0.00848,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0.00848,"113":0.01696,"114":0,"115":0.14419,"116":0.05089,"117":1.62854,"118":0.11027,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0.00848,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.00848,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0.01696,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00848,"100":0,"101":0,"102":0,"103":0.01696,"104":0,"105":0.01696,"106":0,"107":0.00848,"108":0,"109":0.65311,"110":0.10178,"111":0.00848,"112":0.01696,"113":0.00848,"114":0.02545,"115":0.07634,"116":19.86484,"117":7.59139,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00848,"100":0.00848,"101":0.02545,"102":0.10178,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00848,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.00848,"116":0.40714,"117":0.36473},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00848,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00848,"13.1":0.06786,"14.1":0.19509,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.05937,"15.6":0.0933,"16.0":0,"16.1":0.07634,"16.2":0.05089,"16.3":0.14419,"16.4":0.02545,"16.5":0.2375,"16.6":0.61919,"17.0":0.04241,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0.02223,"9.0-9.2":0.00123,"9.3":0.00123,"10.0-10.2":0,"10.3":0.00123,"11.0-11.2":0.01482,"11.3-11.4":0,"12.0-12.1":0.00123,"12.2-12.5":0.27167,"13.0-13.1":0,"13.2":0,"13.3":0.0037,"13.4-13.7":0,"14.0-14.4":0.02099,"14.5-14.8":0.14077,"15.0-15.1":0.29143,"15.2-15.3":0.00494,"15.4":0,"15.5":0.03828,"15.6-15.7":0.51,"16.0":0.13583,"16.1":0.31365,"16.2":0.27908,"16.3":0.18893,"16.4":0.07656,"16.5":0.1383,"16.6":9.07866,"17.0":0.65447,"17.1":0},P:{"4":0,"20":0,"21":0.01015,"22":1.0757,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0,"17.0":0,"18.0":0,"19.0":0.01015},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.04},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":13.86015},R:{_:"0"},M:{"0":0.0167},Q:{"13.1":0.00152},O:{"0":0.00304},H:{"0":0.0115}};
    +module.exports={C:{"78":0.11717,"102":0.00901,"113":0.00901,"115":55.10548,"118":0.08112,"119":0.54979,"120":0.29743,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 103 104 105 106 107 108 109 110 111 112 114 116 117 121 122 123 3.5 3.6"},D:{"79":0.00901,"103":0.00901,"109":2.48759,"115":0.00901,"116":14.43883,"117":0.01803,"118":3.14554,"119":11.77098,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 104 105 106 107 108 110 111 112 113 114 120 121 122"},F:{"102":0.00901,"104":0.00901,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 103 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"109":0.00901,"118":0.03605,"119":0.56782,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 111 112 113 114 115 116 117"},E:{"15":0.00901,_:"0 4 5 6 7 8 9 10 11 12 13 14 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 15.1 15.2-15.3 15.4 15.5 16.0 16.1 16.2 17.2","12.1":0.00901,"13.1":0.01803,"14.1":0.56782,"15.6":0.25236,"16.3":0.01803,"16.4":0.00901,"16.5":0.09013,"16.6":0.27039,"17.0":0.05408,"17.1":0.05408},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00079,"5.0-5.1":0.00079,"6.0-6.1":0.00198,"7.0-7.1":0.00277,"8.1-8.4":0.0004,"9.0-9.2":0.00317,"9.3":0.00989,"10.0-10.2":0.00079,"10.3":0.01424,"11.0-11.2":0.00673,"11.3-11.4":0.00594,"12.0-12.1":0.00356,"12.2-12.5":0.06489,"13.0-13.1":0.00158,"13.2":0.00673,"13.3":0.00396,"13.4-13.7":0.01148,"14.0-14.4":0.03047,"14.5-14.8":0.04946,"15.0-15.1":0.01939,"15.2-15.3":0.02374,"15.4":0.02651,"15.5":0.0372,"15.6-15.7":0.19547,"16.0":0.0918,"16.1":0.184,"16.2":0.08824,"16.3":0.1654,"16.4":0.03403,"16.5":0.08784,"16.6-16.7":1.489,"17.0":0.44595,"17.1":0.74905,"17.2":0.02137},P:{"22":0.01029,"23":0.50445,_:"4 20 21 5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0"},I:{"0":0.00197,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.00001},K:{"0":0.00099,_:"10 11 12 11.1 11.5 12.1"},A:{_:"6 7 8 9 10 11 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{_:"0"},H:{"0":0},L:{"0":5.40386},R:{_:"0"},M:{"0":0.02964},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SN.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SN.js
    index 4f05196afc81c1..6b965b371d1d3b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SN.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SN.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00235,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.00235,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00704,"79":0,"80":0.00469,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00704,"96":0,"97":0,"98":0,"99":0.00235,"100":0,"101":0,"102":0.00235,"103":0,"104":0,"105":0,"106":0,"107":0.00235,"108":0,"109":0,"110":0.00235,"111":0,"112":0.00235,"113":0.00235,"114":0.00235,"115":0.05865,"116":0.01877,"117":0.21583,"118":0.01642,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00469,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00469,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00235,"69":0,"70":0.00235,"71":0,"72":0,"73":0,"74":0,"75":0.00235,"76":0,"77":0,"78":0.00938,"79":0.01173,"80":0.00938,"81":0.01408,"83":0.00235,"84":0,"85":0,"86":0.00469,"87":0.01173,"88":0.00469,"89":0,"90":0,"91":0.00469,"92":0.00235,"93":0.01173,"94":0.00235,"95":0.00704,"96":0,"97":0.00235,"98":0.00469,"99":0.00235,"100":0,"101":0,"102":0.02815,"103":0.04457,"104":0.00469,"105":0.01173,"106":0.00235,"107":0.00469,"108":0.00469,"109":0.30263,"110":0.00704,"111":0.01173,"112":0.01173,"113":0.01642,"114":0.02346,"115":0.04223,"116":1.75246,"117":0.42463,"118":0.00235,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0.00235,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0.00235,"65":0,"66":0,"67":0.00235,"68":0.00469,"69":0.00235,"70":0,"71":0.00469,"72":0.00938,"73":0.00235,"74":0,"75":0,"76":0,"77":0.00235,"78":0,"79":0.00235,"80":0,"81":0,"82":0.00235,"83":0,"84":0,"85":0.00469,"86":0.00235,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00938,"96":0,"97":0,"98":0,"99":0,"100":0.00938,"101":0.04692,"102":0.06569,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0.00235,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0.00235,"16":0,"17":0,"18":0.00469,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00235,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00235,"101":0.00235,"102":0,"103":0,"104":0,"105":0,"106":0.00235,"107":0,"108":0,"109":0.01173,"110":0.00235,"111":0,"112":0.00235,"113":0,"114":0.00704,"115":0.01877,"116":0.37301,"117":0.26275},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00235,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0.00235,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.01173,"14.1":0.00938,"15.1":0.00235,"15.2-15.3":0,"15.4":0.00235,"15.5":0,"15.6":0.01642,"16.0":0,"16.1":0.00235,"16.2":0.00469,"16.3":0.00469,"16.4":0.00235,"16.5":0.01877,"16.6":0.03754,"17.0":0.00469,"17.1":0},G:{"8":0.0023,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.04604,"8.1-8.4":0,"9.0-9.2":0.01381,"9.3":0.11281,"10.0-10.2":0,"10.3":0.12432,"11.0-11.2":0.0046,"11.3-11.4":0.0046,"12.0-12.1":0.1082,"12.2-12.5":1.30996,"13.0-13.1":0.01842,"13.2":0.00691,"13.3":0.24403,"13.4-13.7":0.13353,"14.0-14.4":0.8334,"14.5-14.8":1.10737,"15.0-15.1":0.40749,"15.2-15.3":0.33382,"15.4":0.22101,"15.5":0.44893,"15.6-15.7":4.58601,"16.0":0.65843,"16.1":0.84261,"16.2":0.48116,"16.3":1.00837,"16.4":0.36145,"16.5":1.09585,"16.6":6.92276,"17.0":1.30536,"17.1":0},P:{"4":0.33787,"20":0.19453,"21":0.18429,"22":1.38219,"5.0-5.4":0,"6.2-6.4":0.01024,"7.2-7.4":0.60407,"8.2":0,"9.2":0.02048,"10.1":0,"11.1-11.2":0.04095,"12.0":0.01024,"13.0":0.03072,"14.0":0.03072,"15.0":0.02048,"16.0":0.10238,"17.0":0.05119,"18.0":0.05119,"19.0":0.08191},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00101,"4.2-4.3":0.00262,"4.4":0,"4.4.3-4.4.4":0.07564},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0.01531,_:"3.0-3.1"},J:{"7":0,"10":0.00765},N:{"10":0,"11":0.00765},L:{"0":68.26032},R:{_:"0"},M:{"0":0.09185},Q:{"13.1":0},O:{"0":0.05358},H:{"0":0.25362}};
    +module.exports={C:{"34":0.00416,"52":0.02701,"57":0.02078,"60":0.00208,"68":0.00208,"70":0.00623,"72":0.00208,"78":0.01455,"80":0.00623,"84":0.00208,"88":0.00208,"91":0.00208,"95":0.00623,"96":0.00208,"97":0.00208,"99":0.00208,"102":0.00208,"103":0.00208,"104":0.00208,"106":0.00208,"109":0.00208,"110":0.00208,"113":0.00623,"114":0.00831,"115":0.23481,"116":0.00416,"117":0.03117,"118":0.04156,"119":0.8977,"120":0.27637,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 58 59 61 62 63 64 65 66 67 69 71 73 74 75 76 77 79 81 82 83 85 86 87 89 90 92 93 94 98 100 101 105 107 108 111 112 121 122 123 3.5 3.6"},D:{"11":0.00416,"34":0.04779,"38":0.00208,"40":0.00208,"42":0.00416,"43":0.00208,"49":0.04572,"53":0.00208,"63":0.00208,"65":0.00416,"66":0.00208,"68":0.00208,"69":0.00416,"70":0.00208,"71":0.00208,"72":0.00208,"73":0.0187,"74":0.00208,"75":0.00623,"76":0.00208,"77":0.00416,"79":0.06026,"80":0.00623,"81":0.00416,"83":0.00831,"84":0.00208,"85":0.00208,"86":0.02286,"87":0.02286,"88":0.01039,"89":0.00416,"90":0.00208,"91":0.03948,"93":0.09351,"94":0.00208,"95":0.02701,"96":0.00208,"97":0.00623,"98":0.01662,"99":0.00623,"100":0.00416,"101":0.00416,"102":0.04364,"103":0.14338,"104":0.02494,"105":0.00208,"106":0.00623,"107":0.00416,"108":0.00416,"109":1.13043,"110":0.00831,"111":0.00623,"112":0.00831,"113":0.01662,"114":0.04364,"115":0.01455,"116":0.17663,"117":0.16416,"118":1.74552,"119":7.84653,"120":0.00208,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 39 41 44 45 46 47 48 50 51 52 54 55 56 57 58 59 60 61 62 64 67 78 92 121 122"},F:{"36":0.00208,"46":0.00208,"79":0.01455,"82":0.00416,"85":0.0374,"86":0.00208,"95":0.02078,"101":0.00416,"102":0.02909,"103":0.09351,"104":0.24105,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 83 84 87 88 89 90 91 92 93 94 96 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00623,"13":0.00208,"14":0.00208,"18":0.02494,"84":0.00208,"90":0.00416,"92":0.01247,"100":0.00831,"101":0.01247,"105":0.00208,"107":0.00623,"108":0.00623,"109":0.02494,"110":0.00416,"111":0.00208,"112":0.00208,"113":0.00416,"114":0.01662,"115":0.00831,"116":0.01662,"117":0.04364,"118":0.40313,"119":2.27125,_:"15 16 17 79 80 81 83 85 86 87 88 89 91 93 94 95 96 97 98 99 102 103 104 106"},E:{"13":0.00208,"14":0.00416,_:"0 4 5 6 7 8 9 10 11 12 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1","5.1":0.00208,"12.1":0.00623,"13.1":0.03533,"14.1":0.03117,"15.1":0.00831,"15.2-15.3":0.00208,"15.4":0.00416,"15.5":0.00416,"15.6":0.08104,"16.0":0.00208,"16.1":0.00416,"16.2":0.01247,"16.3":0.01247,"16.4":0.00623,"16.5":0.04779,"16.6":0.07481,"17.0":0.04572,"17.1":0.08104,"17.2":0.00208},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00334,"5.0-5.1":0.00334,"6.0-6.1":0.00834,"7.0-7.1":0.01168,"8.1-8.4":0.00167,"9.0-9.2":0.01335,"9.3":0.04171,"10.0-10.2":0.00334,"10.3":0.06006,"11.0-11.2":0.02836,"11.3-11.4":0.02503,"12.0-12.1":0.01502,"12.2-12.5":0.27361,"13.0-13.1":0.00667,"13.2":0.02836,"13.3":0.01668,"13.4-13.7":0.04838,"14.0-14.4":0.12846,"14.5-14.8":0.20855,"15.0-15.1":0.08175,"15.2-15.3":0.1001,"15.4":0.11178,"15.5":0.15683,"15.6-15.7":0.82418,"16.0":0.38706,"16.1":0.77579,"16.2":0.37205,"16.3":0.69738,"16.4":0.14348,"16.5":0.37038,"16.6-16.7":6.27809,"17.0":1.88026,"17.1":3.15823,"17.2":0.09009},P:{"4":0.32364,"20":0.13148,"21":0.12137,"22":0.37421,"23":1.14285,"5.0-5.4":0.01011,"6.2-6.4":0.01011,"7.2-7.4":0.49557,_:"8.2 10.1","9.2":0.01011,"11.1-11.2":0.04046,"12.0":0.01011,"13.0":0.06068,"14.0":0.03034,"15.0":0.01011,"16.0":0.08091,"17.0":0.05057,"18.0":0.04046,"19.0":0.09102},I:{"0":0.02365,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.00007},K:{"0":0.22727,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.00416,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.01584,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.03169},H:{"0":0.05},L:{"0":62.08812},R:{_:"0"},M:{"0":0.08714},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SO.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SO.js
    index d5bbd49c87a644..c1f6cb35cc7f76 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SO.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SO.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0.0023,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0.0023,"115":0.00918,"116":0.02066,"117":0.21114,"118":0.02754,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.0023,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0.00459,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.0023,"61":0,"62":0,"63":0.0023,"64":0.00689,"65":0.00459,"66":0,"67":0,"68":0.00689,"69":0.0023,"70":0.00459,"71":0,"72":0,"73":0.00918,"74":0.00689,"75":0,"76":0,"77":0.00689,"78":0.00459,"79":0.03213,"80":0.0023,"81":0.01148,"83":0.00918,"84":0,"85":0,"86":0.00459,"87":0.05049,"88":0.0459,"89":0,"90":0,"91":0.00459,"92":0.0023,"93":0.08721,"94":0.00459,"95":0.0023,"96":0.01836,"97":0,"98":0.00689,"99":0.02525,"100":0.0023,"101":0,"102":0.0023,"103":0.01377,"104":0.00918,"105":0.01148,"106":0.0459,"107":0.00918,"108":0.02525,"109":0.24098,"110":0.01377,"111":0.01377,"112":0.00918,"113":0.01377,"114":0.07344,"115":0.07803,"116":2.46024,"117":0.71834,"118":0.0023,"119":0.0023,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.0023,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.0023,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00689,"70":0.00689,"71":0.03443,"72":0.16295,"73":0.06656,"74":0,"75":0,"76":0,"77":0.04361,"78":0.00689,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.0023,"96":0,"97":0,"98":0,"99":0,"100":0.02525,"101":0.05967,"102":0.06656,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00918,"79":0,"80":0,"81":0,"83":0,"84":0.0023,"85":0,"86":0,"87":0,"88":0,"89":0.0023,"90":0,"91":0,"92":0.00459,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.0023,"101":0,"102":0,"103":0,"104":0,"105":0.0023,"106":0,"107":0.0023,"108":0.00459,"109":0.00459,"110":0,"111":0.00689,"112":0.00689,"113":0.0023,"114":0.01836,"115":0.00918,"116":0.24786,"117":0.15836},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00459,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00459,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.0023,"14.1":0.00918,"15.1":0,"15.2-15.3":0.0023,"15.4":0,"15.5":0,"15.6":0.03672,"16.0":0,"16.1":0.0023,"16.2":0.0023,"16.3":0.00459,"16.4":0.00459,"16.5":0.01377,"16.6":0.05279,"17.0":0.0023,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00313,"6.0-6.1":0,"7.0-7.1":0.00938,"8.1-8.4":0,"9.0-9.2":0.00104,"9.3":0.09489,"10.0-10.2":0,"10.3":0.0365,"11.0-11.2":0,"11.3-11.4":0.00104,"12.0-12.1":0.01668,"12.2-12.5":0.32221,"13.0-13.1":0.00417,"13.2":0.00209,"13.3":0.01981,"13.4-13.7":0.11887,"14.0-14.4":0.30657,"14.5-14.8":0.45464,"15.0-15.1":0.17518,"15.2-15.3":0.08968,"15.4":0.122,"15.5":0.16893,"15.6-15.7":1.13973,"16.0":0.48488,"16.1":0.38686,"16.2":0.34202,"16.3":0.53493,"16.4":0.36496,"16.5":1.14181,"16.6":3.07091,"17.0":0.91658,"17.1":0},P:{"4":0.11213,"20":0.19368,"21":0.43832,"22":1.88579,"5.0-5.4":0.02039,"6.2-6.4":0.06116,"7.2-7.4":0.65238,"8.2":0,"9.2":0.01019,"10.1":0,"11.1-11.2":0.04077,"12.0":0,"13.0":0.03058,"14.0":0.06116,"15.0":0.03058,"16.0":0.12232,"17.0":0.09174,"18.0":0.09174,"19.0":0.40774},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00602,"4.4":0,"4.4.3-4.4.4":0.27972},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00459,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":73.93231},R:{_:"0"},M:{"0":0.07705},Q:{"13.1":0},O:{"0":2.1497},H:{"0":1.59022}};
    +module.exports={C:{"61":0.00641,"66":0.00214,"68":0.00214,"87":0.00214,"102":0.00214,"106":0.00214,"109":0.02993,"113":0.0449,"115":0.03421,"116":0.00428,"118":0.05773,"119":0.87658,"120":0.2309,"121":0.00641,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 62 63 64 65 67 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 88 89 90 91 92 93 94 95 96 97 98 99 100 101 103 104 105 107 108 110 111 112 114 117 122 123 3.5 3.6"},D:{"38":0.00214,"43":0.00214,"49":0.01283,"50":0.00214,"53":0.00214,"58":0.00428,"59":0.00214,"63":0.00214,"64":0.00641,"68":0.02993,"69":0.02352,"70":0.00428,"71":0.00214,"73":0.05559,"74":0.00214,"75":0.00214,"77":0.01283,"78":0.00641,"79":0.12614,"80":0.00214,"81":0.01283,"83":0.03421,"84":0.00214,"85":0.00214,"86":0.00641,"87":0.01497,"88":0.05773,"90":0.00214,"91":0.00428,"92":0.00641,"93":0.07483,"94":0.00641,"95":0.00428,"96":0.00428,"98":0.05131,"99":0.02352,"100":0.00214,"102":0.00641,"103":0.062,"104":0.00214,"105":0.0171,"106":0.05773,"107":0.05345,"108":0.01924,"109":1.18231,"110":0.0171,"111":0.03421,"112":0.06414,"113":0.02352,"114":0.08338,"115":0.03635,"116":0.0898,"117":0.18814,"118":2.60836,"119":10.65152,"120":0.01497,"121":0.00214,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 44 45 46 47 48 51 52 54 55 56 57 60 61 62 65 66 67 72 76 89 97 101 122"},F:{"46":0.00428,"82":0.00214,"83":0.00214,"84":0.00214,"90":0.00428,"92":0.00214,"95":0.00855,"98":0.00214,"102":0.11331,"103":0.15821,"104":0.30573,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 85 86 87 88 89 91 93 94 96 97 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00428,"13":0.00214,"14":0.00214,"16":0.00214,"17":0.00428,"18":0.03207,"84":0.01497,"88":0.00641,"89":0.00214,"90":0.00428,"92":0.03635,"100":0.00855,"102":0.00214,"103":0.00855,"105":0.05773,"107":0.00641,"108":0.00641,"109":0.00855,"110":0.00855,"111":0.00214,"112":0.00428,"113":0.00641,"114":0.00428,"115":0.01283,"116":0.01924,"117":0.03421,"118":0.28435,"119":1.44743,_:"15 79 80 81 83 85 86 87 91 93 94 95 96 97 98 99 101 104 106"},E:{"14":0.00428,"15":0.00214,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 6.1 7.1 9.1 10.1 12.1 16.0","5.1":0.02993,"11.1":0.00428,"13.1":0.00855,"14.1":0.0171,"15.1":0.00214,"15.2-15.3":0.00641,"15.4":0.00428,"15.5":0.02993,"15.6":0.1069,"16.1":0.062,"16.2":0.00428,"16.3":0.0449,"16.4":0.0171,"16.5":0.0171,"16.6":0.10049,"17.0":0.03848,"17.1":0.05559,"17.2":0.01069},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00164,"5.0-5.1":0.00164,"6.0-6.1":0.0041,"7.0-7.1":0.00574,"8.1-8.4":0.00082,"9.0-9.2":0.00656,"9.3":0.0205,"10.0-10.2":0.00164,"10.3":0.02952,"11.0-11.2":0.01394,"11.3-11.4":0.0123,"12.0-12.1":0.00738,"12.2-12.5":0.1345,"13.0-13.1":0.00328,"13.2":0.01394,"13.3":0.0082,"13.4-13.7":0.02378,"14.0-14.4":0.06315,"14.5-14.8":0.10251,"15.0-15.1":0.04019,"15.2-15.3":0.04921,"15.4":0.05495,"15.5":0.07709,"15.6-15.7":0.40513,"16.0":0.19027,"16.1":0.38135,"16.2":0.18288,"16.3":0.34281,"16.4":0.07053,"16.5":0.18206,"16.6-16.7":3.08608,"17.0":0.92426,"17.1":1.55247,"17.2":0.04429},P:{"4":0.36977,"20":0.12326,"21":0.30814,"22":0.82172,"23":1.40719,"5.0-5.4":0.01027,"6.2-6.4":0.03081,"7.2-7.4":0.60602,_:"8.2 9.2 10.1 12.0","11.1-11.2":0.08217,"13.0":0.02054,"14.0":0.03081,"15.0":0.01027,"16.0":0.1438,"17.0":0.0719,"18.0":0.13353,"19.0":0.39032},I:{"0":0.11736,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00008,"4.4":0,"4.4.3-4.4.4":0.00035},K:{"0":1.91224,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.00428,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.01573,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":1.38389},H:{"0":0.14},L:{"0":62.7191},R:{_:"0"},M:{"0":0.09436},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SR.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SR.js
    index aa635a40e03e13..0858cd03e29234 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SR.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SR.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00314,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0.02201,"111":0.00314,"112":0,"113":0,"114":0,"115":0.30811,"116":0.03458,"117":0.67596,"118":0.02201,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00314,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.00314,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.00314,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0.00314,"77":0,"78":0,"79":0.00629,"80":0,"81":0.00629,"83":0.01572,"84":0,"85":0,"86":0,"87":0.00314,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0.00314,"94":0,"95":0.00314,"96":0.00314,"97":0.00629,"98":0.00943,"99":0,"100":0,"101":0,"102":0.00314,"103":0.0786,"104":0,"105":0.00314,"106":0,"107":0.00314,"108":0.00314,"109":0.49675,"110":0.00314,"111":0.02201,"112":0.02515,"113":0.04402,"114":0.05345,"115":0.14777,"116":3.93314,"117":0.76085,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.01258,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.00314,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.0283,"101":0.13205,"102":0.09118,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00314,"18":0.00629,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00314,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0.00314,"105":0,"106":0,"107":0,"108":0,"109":0.01572,"110":0,"111":0.03144,"112":0,"113":0,"114":0.00629,"115":0.01886,"116":0.66338,"117":0.40558},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.01258,"15":0.00314,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.01886,"14.1":0.0283,"15.1":0,"15.2-15.3":0.00314,"15.4":0.00314,"15.5":0.00314,"15.6":0.07546,"16.0":0.00629,"16.1":0.01258,"16.2":0.00629,"16.3":0.01258,"16.4":0.00943,"16.5":0.04087,"16.6":0.32069,"17.0":0.01572,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00757,"8.1-8.4":0,"9.0-9.2":0.00189,"9.3":0.00757,"10.0-10.2":0,"10.3":3.25972,"11.0-11.2":0.00189,"11.3-11.4":0.00378,"12.0-12.1":0.00189,"12.2-12.5":0.29703,"13.0-13.1":0,"13.2":0,"13.3":0.00757,"13.4-13.7":0.0227,"14.0-14.4":0.09838,"14.5-14.8":0.37838,"15.0-15.1":0.01703,"15.2-15.3":0.02649,"15.4":0.08135,"15.5":0.04919,"15.6-15.7":2.31189,"16.0":0.33108,"16.1":1.43216,"16.2":0.61108,"16.3":0.74351,"16.4":0.12297,"16.5":0.48622,"16.6":7.45972,"17.0":0.96297,"17.1":0},P:{"4":0.47227,"20":0.16427,"21":0.81107,"22":5.11283,"5.0-5.4":0.01027,"6.2-6.4":0.01027,"7.2-7.4":0.63654,"8.2":0,"9.2":0.01027,"10.1":0,"11.1-11.2":0.0308,"12.0":0.01027,"13.0":0.11293,"14.0":0.0616,"15.0":0.01027,"16.0":0.19507,"17.0":0.26693,"18.0":0.07187,"19.0":0.154},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.03041,"4.2-4.3":0.06081,"4.4":0,"4.4.3-4.4.4":0.30406},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.08803,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":59.92431},R:{_:"0"},M:{"0":0.06856},Q:{"13.1":0.04799},O:{"0":0.67189},H:{"0":0.17525}};
    +module.exports={C:{"45":0.0028,"80":0.0028,"99":0.0028,"111":0.03365,"113":0.00841,"114":0.00561,"115":0.19628,"116":0.0028,"117":0.00561,"118":0.05888,"119":1.54781,"120":0.38134,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 100 101 102 103 104 105 106 107 108 109 110 112 121 122 123 3.5 3.6"},D:{"38":0.0028,"49":0.00841,"52":0.0028,"53":0.0028,"61":0.00561,"63":0.0028,"64":0.0028,"65":0.0028,"69":0.0028,"70":0.0028,"73":0.0028,"74":0.00841,"76":0.00561,"77":0.00561,"79":0.00561,"81":0.00561,"83":0.03645,"85":0.0028,"87":0.00841,"88":0.0028,"91":0.0028,"92":0.00561,"93":0.05328,"94":0.01122,"95":0.00841,"98":0.0028,"99":0.0028,"100":0.0028,"102":0.00561,"103":0.27199,"104":0.00841,"108":0.06169,"109":0.88606,"110":0.00561,"111":0.33928,"112":0.00561,"113":0.02524,"114":0.1374,"115":0.02524,"116":0.11216,"117":0.17946,"118":3.28909,"119":12.40209,"120":0.00841,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 47 48 50 51 54 55 56 57 58 59 60 62 66 67 68 71 72 75 78 80 84 86 89 90 96 97 101 105 106 107 121 122"},F:{"83":0.0028,"89":0.0028,"95":0.01402,"102":0.12898,"103":0.48229,"104":0.81036,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 84 85 86 87 88 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"13":0.00561,"16":0.00561,"17":0.0028,"18":0.03084,"84":0.0028,"90":0.0028,"92":0.01122,"93":0.0028,"100":0.0028,"109":0.03084,"110":0.0028,"111":0.03084,"113":0.0028,"114":0.01402,"115":0.0028,"116":0.02524,"117":0.03926,"118":0.49911,"119":2.44509,_:"12 14 15 79 80 81 83 85 86 87 88 89 91 94 95 96 97 98 99 101 102 103 104 105 106 107 108 112"},E:{"14":0.00561,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1 12.1","5.1":0.00561,"13.1":0.03084,"14.1":0.0673,"15.1":0.0028,"15.2-15.3":0.0028,"15.4":0.0028,"15.5":0.0028,"15.6":0.19908,"16.0":0.13179,"16.1":0.01122,"16.2":0.00561,"16.3":0.03365,"16.4":0.01963,"16.5":0.05328,"16.6":0.39256,"17.0":0.24114,"17.1":0.16544,"17.2":0.0028},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00222,"5.0-5.1":0.00222,"6.0-6.1":0.00556,"7.0-7.1":0.00778,"8.1-8.4":0.00111,"9.0-9.2":0.00889,"9.3":0.02779,"10.0-10.2":0.00222,"10.3":0.04002,"11.0-11.2":0.0189,"11.3-11.4":0.01668,"12.0-12.1":0.01001,"12.2-12.5":0.18233,"13.0-13.1":0.00445,"13.2":0.0189,"13.3":0.01112,"13.4-13.7":0.03224,"14.0-14.4":0.08561,"14.5-14.8":0.13897,"15.0-15.1":0.05448,"15.2-15.3":0.06671,"15.4":0.07449,"15.5":0.10451,"15.6-15.7":0.54922,"16.0":0.25793,"16.1":0.51698,"16.2":0.24793,"16.3":0.46472,"16.4":0.09561,"16.5":0.24682,"16.6-16.7":4.18364,"17.0":1.25298,"17.1":2.1046,"17.2":0.06004},P:{"4":0.28777,"20":0.20555,"21":0.55498,"22":0.80163,"23":4.75842,_:"5.0-5.4 8.2 10.1","6.2-6.4":0.01028,"7.2-7.4":0.56526,"9.2":0.03083,"11.1-11.2":0.03083,"12.0":0.01028,"13.0":0.0925,"14.0":0.03083,"15.0":0.02055,"16.0":0.16444,"17.0":0.15416,"18.0":0.07194,"19.0":0.2261},I:{"0":0.02148,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.00006},K:{"0":0.30943,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.18226,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.55409},H:{"0":0},L:{"0":53.11891},R:{_:"0"},M:{"0":0.12233},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ST.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ST.js
    index f26cfde71bdf15..d1860903a1726a 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ST.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ST.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0.03859,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0.02894,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0.08683,"51":0,"52":0.07236,"53":0,"54":0.06754,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00965,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.05306,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0.00482,"105":0.00482,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0.00482,"115":0,"116":0.03859,"117":0.36662,"118":0.00482,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0.00482,"43":0.01447,"44":0,"45":0,"46":0,"47":0.03859,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.0193,"56":0.00965,"57":0.06754,"58":0.00482,"59":0,"60":0.21226,"61":0.00482,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00482,"69":0,"70":0.00965,"71":0,"72":0,"73":0.02894,"74":0,"75":0,"76":0.00965,"77":0,"78":0,"79":0.14472,"80":0,"81":0.03377,"83":0,"84":0,"85":0,"86":0,"87":0.00965,"88":0.02894,"89":3.80131,"90":0,"91":0,"92":0,"93":0.00965,"94":0.02412,"95":0,"96":0.00482,"97":0,"98":0,"99":0.00482,"100":0.02412,"101":0.0193,"102":0.00965,"103":0.00965,"104":0.00482,"105":0,"106":0,"107":0,"108":0,"109":1.65463,"110":0,"111":0.08683,"112":0.00965,"113":0.00965,"114":0.06754,"115":0.14472,"116":5.63443,"117":1.77523,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00482,"70":0,"71":0,"72":0.04342,"73":0,"74":0.04824,"75":0,"76":0,"77":0,"78":0,"79":0.0193,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.02412,"96":0.00965,"97":0.00482,"98":0,"99":0,"100":0.02412,"101":0.05306,"102":0.21226,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.03377,"13":0.08201,"14":0.08201,"15":0.03377,"16":0,"17":0,"18":0.01447,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.02412,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0.00482,"106":0,"107":0,"108":0,"109":0.07718,"110":0.00965,"111":0.00482,"112":0,"113":0.00482,"114":0.00965,"115":0.03859,"116":1.37484,"117":1.56298},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00482,"14.1":0.00482,"15.1":0.00482,"15.2-15.3":0.09166,"15.4":0,"15.5":0,"15.6":0.00482,"16.0":0,"16.1":0.00965,"16.2":0.00482,"16.3":0.02894,"16.4":0.01447,"16.5":0.0193,"16.6":0.45828,"17.0":0.05306,"17.1":0.02412},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.03202,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.21551,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0.0431,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0.06465,"13.0-13.1":0.01047,"13.2":0,"13.3":0,"13.4-13.7":0,"14.0-14.4":0.01047,"14.5-14.8":0.01047,"15.0-15.1":0.01047,"15.2-15.3":0,"15.4":0.41993,"15.5":0.0862,"15.6-15.7":1.15142,"16.0":0.0431,"16.1":0.0862,"16.2":0.16132,"16.3":0.26907,"16.4":0.0431,"16.5":0.25861,"16.6":2.65873,"17.0":0.23706,"17.1":0},P:{"4":0.14145,"20":0.15156,"21":0.02021,"22":0.71737,"5.0-5.4":0,"6.2-6.4":0.05052,"7.2-7.4":0.22228,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.06062,"12.0":0.0101,"13.0":0.05052,"14.0":0.02021,"15.0":0,"16.0":0,"17.0":0,"18.0":0,"19.0":0.03031},I:{"0":0,"3":0,"4":0.11264,"2.1":0,"2.2":0,"2.3":0,"4.1":0.02816,"4.2-4.3":1.08415,"4.4":0,"4.4.3-4.4.4":1.16863},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.07718,"10":0,"11":0.11095,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":64.41028},R:{_:"0"},M:{"0":0.08282},Q:{"13.1":0},O:{"0":3.5145},H:{"0":0.18621}};
    +module.exports={C:{"52":0.04903,"78":1.39245,"115":0.02452,"116":0.00981,"118":0.00981,"119":0.22064,"120":0.04903,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 117 121 122 123 3.5 3.6"},D:{"43":0.00981,"50":0.00981,"51":0.00981,"53":0.00981,"56":0.03922,"61":0.00981,"64":0.02452,"72":0.02452,"75":0.01471,"79":0.22554,"80":0.01471,"81":0.02452,"83":0.06374,"87":0.01471,"88":0.04903,"89":4.11852,"95":0.01471,"100":0.04903,"102":0.02452,"103":0.00981,"108":0.04903,"109":4.0793,"111":0.02942,"116":0.13238,"117":0.18631,"118":3.96162,"119":14.7139,"120":0.02452,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 44 45 46 47 48 49 52 54 55 57 58 59 60 62 63 65 66 67 68 69 70 71 73 74 76 77 78 84 85 86 90 91 92 93 94 96 97 98 99 101 104 105 106 107 110 112 113 114 115 121 122"},F:{"77":0.00981,"95":0.01471,"102":0.10296,"103":0.10787,"104":0.61288,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.03922,"89":0.01471,"92":0.04903,"104":0.01471,"107":0.01471,"109":0.10296,"115":0.00981,"116":0.04903,"117":0.06864,"118":1.76998,"119":10.81602,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 90 91 93 94 95 96 97 98 99 100 101 102 103 105 106 108 110 111 112 113 114"},E:{_:"0 4 5 6 7 8 9 10 11 12 13 14 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 15.2-15.3 15.5 16.0 16.1 16.2 16.4 17.2","13.1":0.01471,"14.1":0.05393,"15.1":0.02452,"15.4":0.08825,"15.6":0.09316,"16.3":0.01471,"16.5":0.00981,"16.6":0.03922,"17.0":1.05415,"17.1":0.18631},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00054,"5.0-5.1":0.00054,"6.0-6.1":0.00136,"7.0-7.1":0.00191,"8.1-8.4":0.00027,"9.0-9.2":0.00218,"9.3":0.0068,"10.0-10.2":0.00054,"10.3":0.0098,"11.0-11.2":0.00463,"11.3-11.4":0.00408,"12.0-12.1":0.00245,"12.2-12.5":0.04464,"13.0-13.1":0.00109,"13.2":0.00463,"13.3":0.00272,"13.4-13.7":0.00789,"14.0-14.4":0.02096,"14.5-14.8":0.03402,"15.0-15.1":0.01334,"15.2-15.3":0.01633,"15.4":0.01824,"15.5":0.02558,"15.6-15.7":0.13446,"16.0":0.06315,"16.1":0.12656,"16.2":0.0607,"16.3":0.11377,"16.4":0.02341,"16.5":0.06042,"16.6-16.7":1.02421,"17.0":0.30675,"17.1":0.51524,"17.2":0.0147},P:{"4":0.08132,"20":0.01016,"21":0.09148,"22":0.64037,"23":0.64037,"5.0-5.4":0.02033,_:"6.2-6.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 15.0","7.2-7.4":0.08132,"14.0":0.01016,"16.0":0.05082,"17.0":0.10165,"18.0":0.01016,"19.0":0.02033},I:{"0":0.071,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00005,"4.4":0,"4.4.3-4.4.4":0.00021},K:{"0":1.00411,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.02452,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":2.83903},H:{"0":0},L:{"0":46.20454},R:{_:"0"},M:{"0":0.08665},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SV.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SV.js
    index 6a562972e114c9..a8f3ab44d75345 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SV.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SV.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0.0044,"52":0.00879,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.01319,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.00879,"92":0,"93":0,"94":0,"95":0,"96":0.0044,"97":0,"98":0,"99":0,"100":0.0044,"101":0,"102":0.03956,"103":0.01319,"104":0.03516,"105":0,"106":0,"107":0,"108":0.0044,"109":0.00879,"110":0,"111":0.0044,"112":0,"113":0.0044,"114":0.03516,"115":0.1802,"116":0.04835,"117":0.83505,"118":0.07472,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.02198,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.0044,"66":0,"67":0.01758,"68":0,"69":0,"70":0.0044,"71":0,"72":0,"73":0,"74":0.0044,"75":0.0044,"76":0.02198,"77":0.02198,"78":0.00879,"79":0.05274,"80":0.0044,"81":0.00879,"83":0.0044,"84":0.0044,"85":0,"86":0.01319,"87":0.02637,"88":0.00879,"89":0,"90":0.01319,"91":0.01758,"92":0.00879,"93":0.02198,"94":0.00879,"95":0.0044,"96":0.0044,"97":0.00879,"98":0.0044,"99":0.01319,"100":0.01319,"101":0.00879,"102":0.00879,"103":0.06153,"104":0.0044,"105":0.00879,"106":0.02637,"107":0.05274,"108":0.01758,"109":1.0548,"110":0.03956,"111":0.01758,"112":0.02637,"113":0.05274,"114":0.12306,"115":0.19338,"116":9.04052,"117":2.38649,"118":0.0044,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.0044,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.0044,"70":0,"71":0.0044,"72":0.01758,"73":0.00879,"74":0,"75":0,"76":0,"77":0.02637,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.01319,"95":0.03956,"96":0,"97":0,"98":0,"99":0.0044,"100":0.11867,"101":0.29886,"102":0.33842,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0.0044,"15":0.01758,"16":0,"17":0,"18":0.0044,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.0044,"91":0,"92":0.01319,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0.00879,"107":0.0044,"108":0.0044,"109":0.01758,"110":0.0044,"111":0.0044,"112":0.0044,"113":0.01319,"114":0.02198,"115":0.04835,"116":1.01085,"117":0.81308},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00879,"15":0.0044,_:"0","3.1":0,"3.2":0,"5.1":0.0044,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.0044,"13.1":0.00879,"14.1":0.02637,"15.1":0.0044,"15.2-15.3":0.0044,"15.4":0.0044,"15.5":0.0044,"15.6":0.03956,"16.0":0.0044,"16.1":0.01319,"16.2":0.00879,"16.3":0.02198,"16.4":0.01319,"16.5":0.03516,"16.6":0.19338,"17.0":0.01758,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.0101,"6.0-6.1":0.02425,"7.0-7.1":0.00606,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.01414,"10.0-10.2":0,"10.3":0.0202,"11.0-11.2":0.00202,"11.3-11.4":0,"12.0-12.1":0.00202,"12.2-12.5":0.19094,"13.0-13.1":0.00303,"13.2":0,"13.3":0.29297,"13.4-13.7":0.0202,"14.0-14.4":0.10001,"14.5-14.8":0.12022,"15.0-15.1":0.0202,"15.2-15.3":0.03334,"15.4":0.07173,"15.5":0.06365,"15.6-15.7":0.87285,"16.0":0.21518,"16.1":0.35358,"16.2":0.16467,"16.3":0.47279,"16.4":0.09496,"16.5":0.30206,"16.6":5.66544,"17.0":0.82234,"17.1":0.00202},P:{"4":0.09239,"20":0.10266,"21":0.15399,"22":2.03263,"5.0-5.4":0.01027,"6.2-6.4":0,"7.2-7.4":0.11292,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.0308,"12.0":0.01027,"13.0":0.11292,"14.0":0.01027,"15.0":0.01027,"16.0":0.05133,"17.0":0.02053,"18.0":0.0308,"19.0":0.08213},I:{"0":0,"3":0,"4":0.06182,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.20092},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00879,"5.5":0},S:{"2.5":0.00561,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":66.24891},R:{_:"0"},M:{"0":0.25223},Q:{"13.1":0},O:{"0":0.10089},H:{"0":0.42452}};
    +module.exports={C:{"35":0.00866,"52":0.02164,"56":0.00433,"68":0.01731,"78":0.00433,"88":0.00433,"89":0.00433,"90":0.00433,"91":0.01298,"102":0.01731,"103":0.01298,"104":0.00866,"105":0.00433,"106":0.05626,"108":0.00433,"109":0.00433,"111":0.00866,"113":0.00433,"114":0.08656,"115":0.44578,"116":0.01298,"117":0.01731,"118":0.05194,"119":1.5148,"120":0.50638,"121":0.00433,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 92 93 94 95 96 97 98 99 100 101 107 110 112 122 123 3.5 3.6"},D:{"38":0.00433,"49":0.04328,"57":0.00433,"65":0.00866,"70":0.00433,"73":0.00866,"74":0.01731,"75":0.00866,"76":0.00433,"78":0.00433,"79":0.1082,"80":0.00866,"81":0.00433,"83":0.00433,"84":0.01298,"85":0.00433,"86":0.02164,"87":0.06059,"88":0.01731,"90":0.00433,"91":0.02164,"92":0.00866,"93":0.0303,"94":0.01731,"95":0.00866,"96":0.00433,"97":0.02164,"98":0.00433,"99":0.01731,"100":0.00866,"101":0.01298,"102":0.02597,"103":0.15148,"104":0.00433,"105":0.0303,"106":0.00866,"107":0.03895,"108":0.0303,"109":2.10774,"110":0.02597,"111":0.03895,"112":0.09089,"113":0.0303,"114":0.12118,"115":0.06492,"116":0.2164,"117":0.22938,"118":4.38859,"119":21.5318,"120":0.00433,"121":0.00866,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 47 48 50 51 52 53 54 55 56 58 59 60 61 62 63 64 66 67 68 69 71 72 77 89 122"},F:{"28":0.00866,"46":0.00433,"72":0.00433,"77":0.00433,"95":0.08656,"102":0.93918,"103":0.1082,"104":0.8959,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 73 74 75 76 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00433,"15":0.02597,"18":0.00433,"84":0.00433,"85":0.00433,"87":0.00433,"89":0.00433,"92":0.02164,"100":0.00866,"103":0.00433,"104":0.00433,"106":0.01298,"107":0.00433,"109":0.05194,"110":0.01298,"111":0.00433,"112":0.00866,"113":0.00433,"114":0.02164,"115":0.01731,"116":0.04328,"117":0.0779,"118":0.95649,"119":3.82162,_:"13 14 16 17 79 80 81 83 86 88 90 91 93 94 95 96 97 98 99 101 102 105 108"},E:{"12":0.00433,"14":0.01731,"15":0.00433,_:"0 4 5 6 7 8 9 10 11 13 3.1 3.2 6.1 7.1 9.1 10.1 11.1","5.1":0.00866,"12.1":0.00866,"13.1":0.01731,"14.1":0.09522,"15.1":0.00433,"15.2-15.3":0.00433,"15.4":0.00866,"15.5":0.00866,"15.6":0.06059,"16.0":0.00433,"16.1":0.01731,"16.2":0.01298,"16.3":0.03462,"16.4":0.01731,"16.5":0.03462,"16.6":0.33758,"17.0":0.21207,"17.1":0.17312,"17.2":0.00433},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00127,"5.0-5.1":0.00127,"6.0-6.1":0.00318,"7.0-7.1":0.00446,"8.1-8.4":0.00064,"9.0-9.2":0.00509,"9.3":0.01591,"10.0-10.2":0.00127,"10.3":0.02291,"11.0-11.2":0.01082,"11.3-11.4":0.00955,"12.0-12.1":0.00573,"12.2-12.5":0.10439,"13.0-13.1":0.00255,"13.2":0.01082,"13.3":0.00637,"13.4-13.7":0.01846,"14.0-14.4":0.04901,"14.5-14.8":0.07956,"15.0-15.1":0.03119,"15.2-15.3":0.03819,"15.4":0.04265,"15.5":0.05983,"15.6-15.7":0.31444,"16.0":0.14767,"16.1":0.29598,"16.2":0.14194,"16.3":0.26606,"16.4":0.05474,"16.5":0.14131,"16.6-16.7":2.39519,"17.0":0.71735,"17.1":1.20491,"17.2":0.03437},P:{"4":0.09263,"20":0.05146,"21":0.12351,"22":0.24702,"23":1.94527,"5.0-5.4":0.01029,"6.2-6.4":0.01029,"7.2-7.4":0.11322,_:"8.2 9.2 10.1 12.0","11.1-11.2":0.02058,"13.0":0.11322,"14.0":0.02058,"15.0":0.01029,"16.0":0.03088,"17.0":0.02058,"18.0":0.02058,"19.0":0.05146},I:{"0":0.08467,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00026},K:{"0":0.38278,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.01298,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.10211},H:{"0":0.02},L:{"0":48.76811},R:{_:"0"},M:{"0":0.24961},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SY.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SY.js
    index ab40a7432d2800..172ee91ee1bb84 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SY.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SY.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0.00154,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00461,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00154,"69":0,"70":0,"71":0,"72":0.00154,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0.00154,"85":0,"86":0,"87":0,"88":0.00154,"89":0.00154,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0.00154,"98":0,"99":0.00154,"100":0,"101":0,"102":0.00154,"103":0.00154,"104":0,"105":0.00154,"106":0,"107":0,"108":0,"109":0.00154,"110":0.00154,"111":0,"112":0.00154,"113":0.00307,"114":0.00154,"115":0.0599,"116":0.00768,"117":0.08755,"118":0.00614,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00154,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00307,"39":0,"40":0.00154,"41":0,"42":0,"43":0.00154,"44":0,"45":0,"46":0.00154,"47":0,"48":0,"49":0.00461,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00922,"59":0,"60":0.00154,"61":0,"62":0,"63":0.00154,"64":0,"65":0,"66":0.00154,"67":0,"68":0.00154,"69":0.00154,"70":0.00307,"71":0.00154,"72":0,"73":0.00154,"74":0,"75":0,"76":0,"77":0.00154,"78":0.00154,"79":0.00768,"80":0.00307,"81":0.00768,"83":0.00154,"84":0.00154,"85":0.00154,"86":0.00154,"87":0.00307,"88":0.00307,"89":0.00307,"90":0.00154,"91":0.00154,"92":0.00154,"93":0.00154,"94":0.00154,"95":0.00307,"96":0.00307,"97":0.00154,"98":0.00154,"99":0.00461,"100":0.00154,"101":0,"102":0.00307,"103":0.00307,"104":0.00154,"105":0.00154,"106":0.00307,"107":0.00307,"108":0.00768,"109":0.2857,"110":0.00154,"111":0.00307,"112":0.00461,"113":0.00768,"114":0.01997,"115":0.02304,"116":0.71578,"117":0.16435,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00154,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00307,"48":0,"49":0,"50":0,"51":0.00154,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00154,"60":0.00154,"62":0.00154,"63":0.00461,"64":0.00154,"65":0,"66":0,"67":0,"68":0,"69":0.00307,"70":0.00614,"71":0.00461,"72":0.01843,"73":0.00614,"74":0,"75":0,"76":0,"77":0.00922,"78":0,"79":0.00614,"80":0,"81":0,"82":0,"83":0,"84":0.00154,"85":0.00154,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01382,"96":0,"97":0,"98":0,"99":0,"100":0.00307,"101":0.03379,"102":0.02765,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00154},B:{"12":0.00154,"13":0,"14":0,"15":0,"16":0,"17":0.00154,"18":0.00307,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00614,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.00614,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.01536,"110":0,"111":0,"112":0,"113":0.00154,"114":0.00307,"115":0.00614,"116":0.09984,"117":0.06912},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00154,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.2089,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0.00307,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.00154,"15.6":0.00461,"16.0":0,"16.1":0.00154,"16.2":0,"16.3":0.00768,"16.4":0.00154,"16.5":0.00307,"16.6":0.00461,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00154,"5.0-5.1":0.00257,"6.0-6.1":0.00051,"7.0-7.1":0.04633,"8.1-8.4":0.00051,"9.0-9.2":0.00257,"9.3":0.07001,"10.0-10.2":0.00154,"10.3":0.02419,"11.0-11.2":0.0036,"11.3-11.4":0.01184,"12.0-12.1":0.02574,"12.2-12.5":0.44784,"13.0-13.1":0.00824,"13.2":0.00206,"13.3":0.05662,"13.4-13.7":0.07721,"14.0-14.4":0.16266,"14.5-14.8":0.26767,"15.0-15.1":0.12097,"15.2-15.3":0.157,"15.4":0.122,"15.5":0.14671,"15.6-15.7":0.52248,"16.0":0.23679,"16.1":0.25944,"16.2":0.18531,"16.3":0.36084,"16.4":0.20436,"16.5":0.47821,"16.6":0.98061,"17.0":0.14516,"17.1":0},P:{"4":1.499,"20":0.19115,"21":0.45272,"22":0.99598,"5.0-5.4":0.06036,"6.2-6.4":0.17103,"7.2-7.4":0.23139,"8.2":0.04024,"9.2":0.21127,"10.1":0.07042,"11.1-11.2":0.12072,"12.0":0.0503,"13.0":0.20121,"14.0":0.26157,"15.0":0.07042,"16.0":0.21127,"17.0":0.35211,"18.0":0.18109,"19.0":0.28169},I:{"0":0,"3":0,"4":0.00215,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00573,"4.2-4.3":0.02149,"4.4":0,"4.4.3-4.4.4":0.1275},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00307,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":83.16762},R:{_:"0"},M:{"0":0.06771},Q:{"13.1":0},O:{"0":1.058},H:{"0":1.25005}};
    +module.exports={C:{"32":0.00122,"34":0.00243,"40":0.00122,"43":0.00243,"47":0.00243,"48":0.00609,"49":0.00122,"52":0.06207,"53":0.00122,"54":0.00122,"56":0.00122,"58":0.00122,"59":0.00122,"60":0.00122,"62":0.00243,"65":0.00122,"66":0.00122,"68":0.00122,"71":0.00122,"72":0.00609,"78":0.00122,"80":0.00243,"84":0.00122,"87":0.00122,"88":0.00122,"89":0.01339,"92":0.00122,"93":0.00243,"94":0.00122,"95":0.00365,"97":0.00122,"98":0.00122,"99":0.00243,"100":0.00122,"101":0.00122,"102":0.00122,"103":0.00487,"104":0.00243,"105":0.00365,"106":0.00365,"107":0.00243,"108":0.00243,"109":0.05842,"110":0.00487,"111":0.00365,"112":0.00243,"113":0.01826,"114":0.00365,"115":0.36145,"116":0.00365,"117":0.0073,"118":0.02799,"119":0.36388,"120":0.13752,"121":0.00122,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 33 35 36 37 38 39 41 42 44 45 46 50 51 55 57 61 63 64 67 69 70 73 74 75 76 77 79 81 82 83 85 86 90 91 96 122 123 3.5 3.6"},D:{"11":0.00487,"27":0.00122,"31":0.00122,"33":0.00243,"35":0.00122,"36":0.00122,"38":0.00365,"40":0.00122,"41":0.00122,"43":0.00852,"44":0.00243,"45":0.00122,"47":0.00243,"49":0.00852,"50":0.00365,"53":0.00122,"54":0.00122,"55":0.00243,"56":0.00974,"57":0.00122,"58":0.03894,"59":0.00122,"60":0.00365,"61":0.00122,"62":0.00122,"63":0.00609,"64":0.00243,"65":0.00243,"66":0.00365,"67":0.00122,"68":0.00974,"69":0.00487,"70":0.0146,"71":0.00974,"72":0.00243,"73":0.0073,"74":0.00487,"75":0.00365,"76":0.00487,"77":0.00243,"78":0.00609,"79":0.07302,"80":0.01582,"81":0.00974,"83":0.00852,"84":0.0073,"85":0.00487,"86":0.00852,"87":0.01217,"88":0.01826,"89":0.00974,"90":0.00609,"91":0.00487,"92":0.00974,"93":0.00487,"94":0.0073,"95":0.00609,"96":0.01095,"97":0.0073,"98":0.0073,"99":0.0146,"100":0.0146,"101":0.00852,"102":0.01826,"103":0.01947,"104":0.01217,"105":0.00974,"106":0.03043,"107":0.01947,"108":0.04503,"109":1.5748,"110":0.0073,"111":0.02191,"112":0.02069,"113":0.04016,"114":0.0499,"115":0.02799,"116":0.08276,"117":0.09736,"118":0.9663,"119":3.87371,"120":0.00243,"121":0.00122,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 28 29 30 32 34 37 39 42 46 48 51 52 122"},F:{"79":0.02312,"83":0.00609,"84":0.00122,"85":0.00609,"86":0.02069,"89":0.00243,"93":0.00122,"95":0.07911,"96":0.00122,"99":0.00122,"100":0.00122,"101":0.00122,"102":0.08519,"103":0.0718,"104":0.16308,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 87 88 90 91 92 94 97 98 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00122,"13":0.00243,"14":0.00243,"15":0.00243,"16":0.00365,"17":0.00365,"18":0.05111,"83":0.00122,"84":0.00243,"85":0.00122,"89":0.00243,"90":0.00122,"92":0.02677,"99":0.00122,"100":0.00365,"101":0.00122,"104":0.00122,"105":0.00122,"107":0.00365,"108":0.02069,"109":0.04016,"110":0.00243,"111":0.00122,"112":0.00122,"113":0.00243,"114":0.00487,"115":0.00243,"116":0.01217,"117":0.02312,"118":0.17281,"119":0.6231,_:"79 80 81 86 87 88 91 93 94 95 96 97 98 102 103 106"},E:{"14":0.00974,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1 12.1 17.2","5.1":1.14641,"13.1":0.00487,"14.1":0.01704,"15.1":0.00609,"15.2-15.3":0.00122,"15.4":0.00243,"15.5":0.00365,"15.6":0.03286,"16.0":0.00365,"16.1":0.00243,"16.2":0.00243,"16.3":0.01095,"16.4":0.0073,"16.5":0.00609,"16.6":0.02069,"17.0":0.0073,"17.1":0.01095},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00097,"5.0-5.1":0.00097,"6.0-6.1":0.00244,"7.0-7.1":0.00341,"8.1-8.4":0.00049,"9.0-9.2":0.0039,"9.3":0.01219,"10.0-10.2":0.00097,"10.3":0.01755,"11.0-11.2":0.00829,"11.3-11.4":0.00731,"12.0-12.1":0.00439,"12.2-12.5":0.07994,"13.0-13.1":0.00195,"13.2":0.00829,"13.3":0.00487,"13.4-13.7":0.01414,"14.0-14.4":0.03753,"14.5-14.8":0.06093,"15.0-15.1":0.02389,"15.2-15.3":0.02925,"15.4":0.03266,"15.5":0.04582,"15.6-15.7":0.2408,"16.0":0.11309,"16.1":0.22667,"16.2":0.1087,"16.3":0.20376,"16.4":0.04192,"16.5":0.10822,"16.6-16.7":1.8343,"17.0":0.54936,"17.1":0.92276,"17.2":0.02632},P:{"4":1.51235,"20":0.1218,"21":0.25375,"22":0.49735,"23":0.70035,"5.0-5.4":0.05075,"6.2-6.4":0.23345,"7.2-7.4":0.3654,"8.2":0.03045,"9.2":0.1421,"10.1":0.0609,"11.1-11.2":0.1015,"12.0":0.05075,"13.0":0.15225,"14.0":0.1827,"15.0":0.0609,"16.0":0.17255,"17.0":0.25375,"18.0":0.0812,"19.0":0.19285},I:{"0":0.13109,"3":0.00001,"4":0.00003,"2.1":0,"2.2":0.00003,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00009,"4.4":0,"4.4.3-4.4.4":0.0004},K:{"0":0.73518,_:"10 11 12 11.1 11.5 12.1"},A:{"9":0.00365,"11":0.02677,_:"6 7 8 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":1.05396},H:{"0":0.31},L:{"0":76.02887},R:{_:"0"},M:{"0":0.07905},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SZ.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SZ.js
    index 33eb72f459b276..2300fb8c7bac12 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SZ.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/SZ.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00208,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00208,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00208,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00208,"103":0,"104":0,"105":0,"106":0.01245,"107":0,"108":0,"109":0.00208,"110":0,"111":0,"112":0,"113":0.00208,"114":0.00208,"115":0.02075,"116":0.01245,"117":0.06433,"118":0.00623,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.00208,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00208,"66":0,"67":0,"68":0,"69":0,"70":0.01453,"71":0,"72":0.00208,"73":0,"74":0.00208,"75":0,"76":0,"77":0,"78":0,"79":0.00208,"80":0,"81":0.01038,"83":0.00208,"84":0,"85":0,"86":0.00208,"87":0,"88":0.00208,"89":0.00208,"90":0.00415,"91":0,"92":0,"93":0,"94":0.00208,"95":0.01038,"96":0,"97":0,"98":0,"99":0.01038,"100":0,"101":0,"102":0,"103":0.02283,"104":0.00208,"105":0,"106":0.00623,"107":0.00208,"108":0.0083,"109":0.22825,"110":0,"111":0.00208,"112":0.00208,"113":0.0083,"114":0.0332,"115":0.02075,"116":1.26783,"117":0.249,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0.00208,"25":0.00623,"26":0.0166,"27":0,"28":0.02075,"29":0,"30":0.00208,"31":0,"32":0.01038,"33":0,"34":0,"35":0.1245,"36":0.00208,"37":0,"38":0.01038,"39":0,"40":0,"41":0.00208,"42":0.00208,"43":0,"44":0.09545,"45":0,"46":0.00208,"47":0.00623,"48":0,"49":0,"50":0.01868,"51":0.00415,"52":0,"53":0,"54":0.00415,"55":0.00208,"56":0.01038,"57":0.00623,"58":0.02075,"60":0.02698,"62":0,"63":0.12865,"64":0.01868,"65":0.01245,"66":0.01245,"67":0.0249,"68":0.0747,"69":0.2656,"70":0.11205,"71":0.16393,"72":0.80718,"73":0.08508,"74":0.00415,"75":0.00208,"76":0.00208,"77":0.03943,"78":0.0083,"79":0.00208,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01038,"96":0,"97":0.00208,"98":0,"99":0,"100":0.00415,"101":0.04358,"102":0.0332,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.01245},B:{"12":0.00415,"13":0,"14":0.00208,"15":0,"16":0,"17":0.00208,"18":0.00415,"79":0,"80":0,"81":0,"83":0,"84":0.00208,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00415,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00208,"110":0.00208,"111":0,"112":0,"113":0.00208,"114":0.0083,"115":0.0166,"116":0.2573,"117":0.11205},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00208,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00208,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0.00208,"12.1":0,"13.1":0.00208,"14.1":0.00208,"15.1":0,"15.2-15.3":0,"15.4":0.00208,"15.5":0.00208,"15.6":0.00415,"16.0":0,"16.1":0.00208,"16.2":0.00208,"16.3":0.00415,"16.4":0,"16.5":0.00208,"16.6":0.01453,"17.0":0.00208,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00548,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.00352,"10.0-10.2":0,"10.3":0.00509,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0.00196,"12.2-12.5":0.17735,"13.0-13.1":0,"13.2":0,"13.3":0.03719,"13.4-13.7":0.01175,"14.0-14.4":0.06969,"14.5-14.8":0.13311,"15.0-15.1":0.04307,"15.2-15.3":0.24665,"15.4":0.04072,"15.5":0.02388,"15.6-15.7":0.35196,"16.0":0.20397,"16.1":0.1429,"16.2":0.166,"16.3":0.36527,"16.4":0.0509,"16.5":0.49407,"16.6":1.21052,"17.0":0.1014,"17.1":0},P:{"4":0.26677,"20":0.06156,"21":0.26677,"22":0.94397,"5.0-5.4":0,"6.2-6.4":0.01026,"7.2-7.4":1.221,"8.2":0,"9.2":0.02052,"10.1":0,"11.1-11.2":0.08208,"12.0":0,"13.0":0.02052,"14.0":0.01026,"15.0":0.03078,"16.0":0.0513,"17.0":0.02052,"18.0":0.01026,"19.0":0.08208},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.01296,"4.4":0,"4.4.3-4.4.4":0.05949},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00208,"5.5":0},S:{"2.5":0.05548,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":70.03658},R:{_:"0"},M:{"0":0.1902},Q:{"13.1":0},O:{"0":0.84798},H:{"0":14.19545}};
    +module.exports={C:{"52":0.00218,"60":0.03272,"66":0.00218,"75":0.00218,"78":0.00218,"85":0.00218,"109":0.00654,"111":0.00218,"113":0.00218,"114":0.00218,"115":0.26608,"116":0.00218,"117":0.00218,"118":0.00436,"119":0.29444,"120":0.1265,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 61 62 63 64 65 67 68 69 70 71 72 73 74 76 77 79 80 81 82 83 84 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 112 121 122 123 3.5 3.6"},D:{"39":0.00218,"41":0.00436,"49":0.00436,"55":0.00218,"65":0.01527,"69":0.00436,"70":0.03053,"71":0.00872,"74":0.00654,"75":0.00218,"76":0.00654,"77":0.00436,"78":0.00218,"80":0.00218,"81":0.00218,"83":0.00436,"84":0.00218,"85":0.00218,"87":0.00436,"88":0.00872,"89":0.01091,"90":0.00436,"91":0.01091,"94":0.01091,"95":0.01963,"96":0.00654,"97":0.00436,"98":0.00436,"99":0.00654,"100":0.00218,"101":0.01309,"102":0.02399,"103":0.01745,"104":0.00436,"105":0.00654,"106":0.02835,"107":0.00654,"108":0.01527,"109":0.85931,"110":0.00218,"111":0.00218,"112":0.00436,"113":0.00218,"114":0.04798,"115":0.01963,"116":0.05234,"117":0.18539,"118":2.91818,"119":6.97484,"120":0.00218,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 40 42 43 44 45 46 47 48 50 51 52 53 54 56 57 58 59 60 61 62 63 64 66 67 68 72 73 79 86 92 93 121 122"},F:{"40":0.00218,"42":0.00218,"49":0.00218,"68":0.01527,"79":0.00654,"85":0.00218,"95":0.05016,"101":0.00218,"102":0.04144,"103":0.14395,"104":0.36423,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 41 43 44 45 46 47 48 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 86 87 88 89 90 91 92 93 94 96 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.01963,"13":0.01309,"14":0.00654,"15":0.00436,"16":0.00654,"17":0.00654,"18":0.0349,"84":0.00218,"90":0.00872,"92":0.01309,"96":0.00436,"97":0.00218,"99":0.00218,"100":0.00436,"104":0.00218,"106":0.00218,"109":0.01309,"110":0.00436,"112":0.00218,"114":0.01091,"115":0.02181,"116":0.02617,"117":0.06325,"118":0.24209,"119":1.25626,_:"79 80 81 83 85 86 87 88 89 91 93 94 95 98 101 102 103 105 107 108 111 113"},E:{"14":0.00218,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 6.1 7.1 9.1 10.1 12.1 16.5 17.2","5.1":0.01091,"11.1":0.00218,"13.1":0.01091,"14.1":0.00436,"15.1":0.03708,"15.2-15.3":0.01091,"15.4":0.00654,"15.5":0.00436,"15.6":0.02181,"16.0":0.00218,"16.1":0.01527,"16.2":0.00218,"16.3":0.01091,"16.4":0.00218,"16.6":0.06979,"17.0":0.03053,"17.1":0.10469},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00056,"5.0-5.1":0.00056,"6.0-6.1":0.0014,"7.0-7.1":0.00196,"8.1-8.4":0.00028,"9.0-9.2":0.00225,"9.3":0.00702,"10.0-10.2":0.00056,"10.3":0.0101,"11.0-11.2":0.00477,"11.3-11.4":0.00421,"12.0-12.1":0.00253,"12.2-12.5":0.04603,"13.0-13.1":0.00112,"13.2":0.00477,"13.3":0.00281,"13.4-13.7":0.00814,"14.0-14.4":0.02161,"14.5-14.8":0.03508,"15.0-15.1":0.01375,"15.2-15.3":0.01684,"15.4":0.0188,"15.5":0.02638,"15.6-15.7":0.13865,"16.0":0.06511,"16.1":0.13051,"16.2":0.06259,"16.3":0.11732,"16.4":0.02414,"16.5":0.06231,"16.6-16.7":1.05615,"17.0":0.31631,"17.1":0.5313,"17.2":0.01516},P:{"4":0.20418,"20":0.04084,"21":0.55128,"22":0.39815,"23":0.7963,_:"5.0-5.4 6.2-6.4 9.2 10.1 12.0","7.2-7.4":1.69468,"8.2":0.01021,"11.1-11.2":0.12251,"13.0":0.02042,"14.0":0.02042,"15.0":0.01021,"16.0":0.04084,"17.0":0.01021,"18.0":0.01021,"19.0":0.27564},I:{"0":0.00778,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00002},K:{"0":12.90147,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.03708,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.09382,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.49253},H:{"0":2.07},L:{"0":62.00678},R:{_:"0"},M:{"0":0.07818},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TC.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TC.js
    index 5473c8643bbd92..0e307bacb1ba70 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TC.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TC.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0.00493,"114":0,"115":0.83385,"116":0.00987,"117":0.37005,"118":0.00493,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.0148,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0.0296,"77":0,"78":0,"79":0.06414,"80":0.00493,"81":0,"83":0.02467,"84":0,"85":0,"86":0,"87":0,"88":0.0148,"89":0,"90":0,"91":0,"92":0,"93":0.07894,"94":0.00987,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.12828,"104":0,"105":0.00987,"106":0.00987,"107":0.00493,"108":0,"109":0.31084,"110":0.00493,"111":0,"112":0.03454,"113":0.07894,"114":0.09375,"115":0.53781,"116":7.79079,"117":1.32725,"118":0.0296,"119":0.00987,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.02467,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.03454,"96":0,"97":0,"98":0,"99":0,"100":0.0296,"101":0.09868,"102":0.04934,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0.0296,"16":0,"17":0,"18":0.08881,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00493,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00493,"109":0.0148,"110":0,"111":0,"112":0.00493,"113":0,"114":0.03947,"115":0.56741,"116":3.62156,"117":2.56568},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00987,"15":0.07894,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.04934,"14.1":0.06414,"15.1":0.00493,"15.2-15.3":0.09868,"15.4":0.13815,"15.5":0.01974,"15.6":0.14802,"16.0":0.00987,"16.1":0.57234,"16.2":0.04441,"16.3":0.37498,"16.4":0.07894,"16.5":0.35525,"16.6":1.91439,"17.0":0.05427,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0.00678,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0.20008,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0.12548,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0.02713,"14.0-14.4":0.078,"14.5-14.8":0.37982,"15.0-15.1":0.04748,"15.2-15.3":0.09156,"15.4":0.05087,"15.5":0.11869,"15.6-15.7":1.0818,"16.0":0.86816,"16.1":3.77106,"16.2":0.80711,"16.3":1.89909,"16.4":0.30182,"16.5":0.72912,"16.6":21.25628,"17.0":1.86857,"17.1":0},P:{"4":0.02097,"20":0.05243,"21":0.02097,"22":2.83107,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.06291,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0.01049,"15.0":0,"16.0":0.01049,"17.0":0.10485,"18.0":0,"19.0":0.04194},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":36.52731},R:{_:"0"},M:{"0":0.43061},Q:{"13.1":0},O:{"0":0.04559},H:{"0":0.07194}};
    +module.exports={C:{"66":0.00464,"78":0.00464,"115":2.30707,"119":0.752,"120":0.09748,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 116 117 118 121 122 123 3.5 3.6"},D:{"29":0.11605,"33":0.00464,"49":0.00464,"50":0.00464,"63":0.00928,"76":0.0557,"79":0.10677,"80":0.00464,"83":0.0557,"87":0.00928,"88":0.04178,"91":0.00464,"93":0.04642,"100":0.03249,"103":0.24138,"105":0.00928,"106":0.00464,"107":0.00464,"109":0.29709,"110":0.00928,"112":0.00928,"113":0.01857,"114":0.09284,"115":0.03249,"116":0.31101,"117":0.71487,"118":4.83696,"119":13.49894,"120":0.1764,"121":0.00928,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 30 31 32 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 51 52 53 54 55 56 57 58 59 60 61 62 64 65 66 67 68 69 70 71 72 73 74 75 77 78 81 84 85 86 89 90 92 94 95 96 97 98 99 101 102 104 108 111 122"},F:{"95":0.11141,"102":0.07891,"103":0.00928,"104":0.24603,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.14854,"80":0.00928,"92":0.00928,"109":0.00928,"114":0.0557,"115":0.00928,"116":0.02321,"117":0.39921,"118":3.14728,"119":10.56519,_:"12 13 14 15 16 17 79 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 111 112 113"},E:{"14":0.02321,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.01393,"13.1":0.04178,"14.1":0.13462,"15.1":0.01393,"15.2-15.3":0.31566,"15.4":0.11141,"15.5":0.06499,"15.6":0.4085,"16.0":0.02785,"16.1":0.10212,"16.2":0.03714,"16.3":0.48277,"16.4":0.07891,"16.5":0.11605,"16.6":3.14728,"17.0":0.25067,"17.1":0.87734,"17.2":0.01393},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00465,"5.0-5.1":0.00465,"6.0-6.1":0.01161,"7.0-7.1":0.01626,"8.1-8.4":0.00232,"9.0-9.2":0.01858,"9.3":0.05807,"10.0-10.2":0.00465,"10.3":0.08362,"11.0-11.2":0.03949,"11.3-11.4":0.03484,"12.0-12.1":0.02091,"12.2-12.5":0.38094,"13.0-13.1":0.00929,"13.2":0.03949,"13.3":0.02323,"13.4-13.7":0.06736,"14.0-14.4":0.17886,"14.5-14.8":0.29035,"15.0-15.1":0.11382,"15.2-15.3":0.13937,"15.4":0.15563,"15.5":0.21834,"15.6-15.7":1.14746,"16.0":0.53889,"16.1":1.0801,"16.2":0.51798,"16.3":0.97093,"16.4":0.19976,"16.5":0.51566,"16.6-16.7":8.74068,"17.0":2.61779,"17.1":4.39705,"17.2":0.12543},P:{"4":0.06561,"20":0.06561,"21":0.06561,"22":0.16404,"23":2.83237,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 13.0 15.0 18.0","7.2-7.4":0.06561,"11.1-11.2":0.01094,"12.0":0.01094,"14.0":0.01094,"16.0":0.04374,"17.0":0.01094,"19.0":0.08749},I:{"0":0.02132,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00006},K:{"0":0.27321,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.0557,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.08036},H:{"0":0},L:{"0":26.84806},R:{_:"0"},M:{"0":0.31606},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TD.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TD.js
    index f1807941875c92..6060342e8b2b4d 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TD.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TD.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0.00245,"94":0,"95":0.00245,"96":0.00245,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00123,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0.00123,"111":0,"112":0,"113":0,"114":0.0135,"115":0.03068,"116":0.00368,"117":0.0773,"118":0.00614,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.00368,"56":0,"57":0,"58":0.00123,"59":0,"60":0.00245,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0.00123,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.00123,"95":0,"96":0,"97":0,"98":0,"99":0.00614,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0.00368,"106":0,"107":0,"108":0,"109":0.00982,"110":0,"111":0,"112":0,"113":0,"114":0.00245,"115":0.00614,"116":0.19509,"117":0.07485,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00123,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0.00123,"62":0,"63":0.00736,"64":0,"65":0,"66":0.03313,"67":0.00491,"68":0,"69":0.02331,"70":0.00123,"71":0.00982,"72":0.00859,"73":0.00491,"74":0.00123,"75":0,"76":0,"77":0.00123,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.00368,"102":0.00491,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0.00491,"14":0,"15":0,"16":0,"17":0.00123,"18":0.00123,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.00123,"90":0,"91":0,"92":0.00123,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.01227,"110":0,"111":0.00491,"112":0,"113":0.00245,"114":0.00123,"115":0.00368,"116":0.06012,"117":0.04663},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00245,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0,"16.0":0,"16.1":0,"16.2":0,"16.3":0,"16.4":0,"16.5":0,"16.6":0.00123,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00122,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.00122,"10.0-10.2":0,"10.3":0.00427,"11.0-11.2":0.00061,"11.3-11.4":0.2345,"12.0-12.1":0.01099,"12.2-12.5":0.37251,"13.0-13.1":0.20336,"13.2":0,"13.3":0.00122,"13.4-13.7":0.02015,"14.0-14.4":0.26076,"14.5-14.8":0.18565,"15.0-15.1":0.2516,"15.2-15.3":0.0574,"15.4":0.24183,"15.5":0.36091,"15.6-15.7":0.60396,"16.0":0.1887,"16.1":0.18748,"16.2":0.21618,"16.3":0.44457,"16.4":0.39328,"16.5":0.55755,"16.6":1.0864,"17.0":0.18809,"17.1":0},P:{"4":0.12032,"20":0.21055,"21":0.16042,"22":0.44116,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.2306,"8.2":0,"9.2":0.25066,"10.1":0,"11.1-11.2":0.05013,"12.0":0,"13.0":0.10026,"14.0":0.06016,"15.0":0.01003,"16.0":0.25066,"17.0":0.04011,"18.0":0.09024,"19.0":0.43113},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00062,"4.4":0,"4.4.3-4.4.4":0.01061},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0.07018,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":88.33675},R:{_:"0"},M:{"0":0.14037},Q:{"13.1":0.01755},O:{"0":0.0965},H:{"0":1.50333}};
    +module.exports={C:{"40":0.00069,"57":0.00069,"58":0.00069,"62":0.00069,"69":0.00069,"72":0.00069,"74":0.00069,"77":0.00069,"78":0.00206,"95":0.02192,"102":0.00069,"106":0.00137,"108":0.00137,"114":0.00069,"115":0.07056,"116":0.00069,"117":0.00137,"118":0.01439,"119":0.52745,"120":0.4295,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 59 60 61 63 64 65 66 67 68 70 71 73 75 76 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 103 104 105 107 109 110 111 112 113 121 122 123 3.5 3.6"},D:{"38":0.00274,"40":0.0048,"49":0.00069,"57":0.00137,"58":0.00959,"62":0.00069,"63":0.00069,"66":0.00137,"67":0.00069,"70":0.00069,"71":0.00069,"74":0.00069,"77":0.00137,"81":0.00343,"83":0.00069,"87":0.00069,"88":0.00069,"90":0.00274,"91":0.00069,"92":0.00137,"94":0.02124,"95":0.07535,"97":0.00069,"99":0.03699,"100":0.00137,"101":0.00548,"102":0.00754,"103":0.00617,"104":0.00069,"105":0.00137,"106":0.00754,"107":0.00137,"108":0.00343,"109":0.12399,"110":0.00069,"111":0.00685,"112":0.00069,"113":0.0048,"114":0.00343,"115":0.01439,"116":0.02055,"117":0.09316,"118":0.33976,"119":2.1009,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 41 42 43 44 45 46 47 48 50 51 52 53 54 55 56 59 60 61 64 65 68 69 72 73 75 76 78 79 80 84 85 86 89 93 96 98 120 121 122"},F:{"45":0.00137,"65":0.00069,"67":0.02809,"79":0.00274,"95":0.00137,"100":0.00137,"101":0.00069,"102":0.00137,"103":0.01987,"104":0.10207,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 66 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00274,"13":0.00069,"14":0.00343,"17":0.00206,"18":0.01507,"83":0.00069,"84":0.00137,"85":0.00069,"89":0.01028,"90":0.00548,"92":0.00548,"98":0.00754,"108":0.00069,"109":0.06645,"110":0.00343,"111":0.03357,"112":0.00137,"113":0.00137,"114":0.00274,"115":0.00891,"116":0.00548,"117":0.04795,"118":0.06987,"119":0.37264,_:"15 16 79 80 81 86 87 88 91 93 94 95 96 97 99 100 101 102 103 104 105 106 107"},E:{_:"0 4 5 6 7 8 9 10 11 12 13 14 15 3.1 3.2 6.1 7.1 9.1 10.1 12.1 15.1 15.2-15.3 15.4 16.0 16.4 17.2","5.1":0.02124,"11.1":0.00069,"13.1":0.00069,"14.1":0.00137,"15.5":0.00137,"15.6":0.00959,"16.1":0.00069,"16.2":0.00069,"16.3":0.00343,"16.5":0.01713,"16.6":0.00343,"17.0":0.00411,"17.1":0.00411},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00107,"5.0-5.1":0.00107,"6.0-6.1":0.00267,"7.0-7.1":0.00374,"8.1-8.4":0.00053,"9.0-9.2":0.00428,"9.3":0.01337,"10.0-10.2":0.00107,"10.3":0.01925,"11.0-11.2":0.00909,"11.3-11.4":0.00802,"12.0-12.1":0.00481,"12.2-12.5":0.08769,"13.0-13.1":0.00214,"13.2":0.00909,"13.3":0.00535,"13.4-13.7":0.01551,"14.0-14.4":0.04117,"14.5-14.8":0.06684,"15.0-15.1":0.0262,"15.2-15.3":0.03208,"15.4":0.03582,"15.5":0.05026,"15.6-15.7":0.26413,"16.0":0.12405,"16.1":0.24863,"16.2":0.11923,"16.3":0.2235,"16.4":0.04598,"16.5":0.1187,"16.6-16.7":2.012,"17.0":0.60259,"17.1":1.01215,"17.2":0.02887},P:{"4":0.02017,"20":0.10084,"21":0.21176,"22":0.42352,"23":0.32268,"5.0-5.4":0.02017,"6.2-6.4":0.02017,"7.2-7.4":0.16134,_:"8.2 10.1 12.0","9.2":0.0605,"11.1-11.2":0.04033,"13.0":0.10084,"14.0":0.01008,"15.0":0.04033,"16.0":0.09075,"17.0":0.01008,"18.0":0.04033,"19.0":0.40335},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{"0":1.30451,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.0048,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.03726,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.11178},H:{"0":0.13},L:{"0":85.92191},R:{_:"0"},M:{"0":0.07452},Q:{"13.1":0.00932}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TG.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TG.js
    index 5aa19575217fa9..0faaa5fd507a24 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TG.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TG.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00741,"53":0,"54":0,"55":0,"56":0,"57":0.0037,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.0037,"73":0,"74":0,"75":0,"76":0.01482,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.01111,"103":0.00741,"104":0,"105":0,"106":0,"107":0,"108":0.00741,"109":0.0037,"110":0.0037,"111":0.05926,"112":0.0037,"113":0.0037,"114":0.01482,"115":0.40374,"116":0.06297,"117":1.10009,"118":0.11112,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.0037,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.0037,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.01482,"41":0,"42":0.0037,"43":0.0037,"44":0,"45":0,"46":0,"47":0.0889,"48":0,"49":0.0037,"50":0.0037,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.0037,"64":0,"65":0.0037,"66":0,"67":0,"68":0,"69":0,"70":0.0037,"71":0,"72":0,"73":0.0037,"74":0,"75":0.01852,"76":0.01482,"77":0.0037,"78":0.0037,"79":0.01852,"80":0.00741,"81":0.10371,"83":0,"84":0,"85":0.0037,"86":0.0037,"87":0.0037,"88":0.0037,"89":0,"90":0.00741,"91":0.0037,"92":0.01111,"93":0.05186,"94":0.0037,"95":0.03334,"96":0.00741,"97":0.0037,"98":0,"99":0.0037,"100":0,"101":0.00741,"102":0.02222,"103":0.02222,"104":0.0037,"105":0.01482,"106":0.01111,"107":0.01111,"108":0.02593,"109":1.46678,"110":0.00741,"111":0.00741,"112":0.01111,"113":0.00741,"114":0.03334,"115":0.05926,"116":3.75215,"117":1.03342,"118":0.0037,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.0037,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0.01852,"62":0,"63":0.0037,"64":0,"65":0.0037,"66":0.01852,"67":0.01852,"68":0.0037,"69":0.02593,"70":0.01482,"71":0.05556,"72":0.27039,"73":0.07038,"74":0,"75":0,"76":0,"77":0.01482,"78":0.0037,"79":0.00741,"80":0,"81":0,"82":0,"83":0.0037,"84":0,"85":0,"86":0,"87":0.11482,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.04074,"96":0,"97":0,"98":0,"99":0,"100":0.02222,"101":0.32595,"102":0.21113,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.0037},B:{"12":0.00741,"13":0,"14":0.0037,"15":0.01111,"16":0,"17":0,"18":0.01111,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.02222,"91":0,"92":0.03704,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.03334,"110":0,"111":0.0037,"112":0.0037,"113":0,"114":0.02593,"115":0.03704,"116":0.88896,"117":0.62227},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.02593,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.01111,"14.1":0,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0.01482,"16.0":0.0037,"16.1":0,"16.2":0,"16.3":0.0037,"16.4":0.01111,"16.5":0.00741,"16.6":0.05926,"17.0":0,"17.1":0},G:{"8":0.00241,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0.02251,"7.0-7.1":0.0611,"8.1-8.4":0.09648,"9.0-9.2":0.00161,"9.3":0.09487,"10.0-10.2":0.00161,"10.3":0.04904,"11.0-11.2":0.01045,"11.3-11.4":0.01688,"12.0-12.1":0.07477,"12.2-12.5":1.48338,"13.0-13.1":0.00402,"13.2":0.00322,"13.3":0.0201,"13.4-13.7":0.18251,"14.0-14.4":0.14633,"14.5-14.8":0.27899,"15.0-15.1":0.13588,"15.2-15.3":0.21467,"15.4":0.02653,"15.5":0.19939,"15.6-15.7":1.78327,"16.0":0.04985,"16.1":0.14954,"16.2":0.08201,"16.3":0.13186,"16.4":0.49526,"16.5":0.31758,"16.6":1.50187,"17.0":0.33527,"17.1":0},P:{"4":0.11467,"20":0.01042,"21":0.05212,"22":0.38571,"5.0-5.4":0.01042,"6.2-6.4":0,"7.2-7.4":0.01042,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0.02085,"14.0":0,"15.0":0,"16.0":0,"17.0":0.01042,"18.0":0.01042,"19.0":0.01042},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00397,"4.2-4.3":0.01589,"4.4":0,"4.4.3-4.4.4":0.61718},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.0037,"5.5":0},S:{"2.5":0.01259,_:"3.0-3.1"},J:{"7":0,"10":0.0063},N:{"10":0,"11":0},L:{"0":74.70218},R:{_:"0"},M:{"0":0.06926},Q:{"13.1":0.02518},O:{"0":0.38406},H:{"0":2.34849}};
    +module.exports={C:{"52":0.01005,"71":0.01676,"72":0.01005,"78":0.00335,"79":0.00335,"82":0.00335,"88":0.00335,"89":0.00335,"95":0.01005,"98":0.01005,"100":0.00335,"101":0.00335,"102":0.01005,"103":0.00335,"107":0.00335,"108":0.02346,"110":0.01676,"111":0.06367,"112":0.01005,"113":0.02011,"114":0.01005,"115":1.09243,"116":0.01005,"117":0.01005,"118":0.08378,"119":1.98379,"120":0.57637,"121":0.0067,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 73 74 75 76 77 80 81 83 84 85 86 87 90 91 92 93 94 96 97 99 104 105 106 109 122 123 3.5 3.6"},D:{"11":0.00335,"34":0.0067,"39":0.00335,"40":0.00335,"43":0.00335,"47":0.07037,"49":0.00335,"50":0.00335,"54":0.00335,"58":0.0134,"65":0.01676,"66":0.00335,"69":0.00335,"70":0.00335,"74":0.00335,"75":0.02346,"76":0.10388,"77":0.02681,"78":0.00335,"79":0.09383,"80":0.0134,"81":0.0067,"83":0.00335,"85":0.00335,"86":0.0067,"87":0.0067,"88":0.02346,"89":0.00335,"90":0.06032,"91":0.02681,"92":0.00335,"93":0.15415,"95":0.07372,"96":0.4926,"97":0.0067,"98":0.00335,"99":0.02011,"100":0.04356,"101":0.0134,"102":0.01005,"103":0.1575,"104":0.0067,"106":0.01005,"107":0.0134,"108":0.02346,"109":3.64924,"110":0.01005,"111":0.00335,"112":0.0067,"113":0.0067,"114":0.06702,"115":0.02346,"116":0.14409,"117":0.14409,"118":2.28873,"119":10.57576,"120":0.00335,"121":0.0067,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 41 42 44 45 46 48 51 52 53 55 56 57 59 60 61 62 63 64 67 68 71 72 73 84 94 105 122"},F:{"21":0.00335,"65":0.01005,"79":0.09718,"80":0.00335,"82":0.02346,"85":0.10723,"86":0.00335,"95":0.22787,"98":0.00335,"99":0.00335,"100":0.00335,"101":0.00335,"102":0.06032,"103":0.28148,"104":1.08908,_:"9 11 12 15 16 17 18 19 20 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 66 67 68 69 70 71 72 73 74 75 76 77 78 81 83 84 87 88 89 90 91 92 93 94 96 97 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00335,"13":0.00335,"14":0.00335,"17":0.00335,"18":0.03351,"84":0.0134,"89":0.00335,"90":0.00335,"91":0.00335,"92":0.02681,"96":0.0134,"100":0.00335,"109":0.08042,"110":0.00335,"111":0.0067,"112":0.00335,"113":0.0067,"114":0.00335,"115":0.01005,"116":0.0067,"117":0.08042,"118":0.55292,"119":3.6861,_:"15 16 79 80 81 83 85 86 87 88 93 94 95 97 98 99 101 102 103 104 105 106 107 108"},E:{_:"0 4 5 6 7 8 9 10 11 12 13 14 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1 12.1 15.2-15.3 15.4 15.5 16.0 16.2 17.2","5.1":0.01005,"13.1":0.00335,"14.1":0.0067,"15.1":0.00335,"15.6":0.03686,"16.1":0.00335,"16.3":0.0067,"16.4":0.01005,"16.5":0.00335,"16.6":0.03351,"17.0":0.0134,"17.1":0.02681},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00142,"5.0-5.1":0.00142,"6.0-6.1":0.00355,"7.0-7.1":0.00497,"8.1-8.4":0.00071,"9.0-9.2":0.00567,"9.3":0.01773,"10.0-10.2":0.00142,"10.3":0.02554,"11.0-11.2":0.01206,"11.3-11.4":0.01064,"12.0-12.1":0.00638,"12.2-12.5":0.11633,"13.0-13.1":0.00284,"13.2":0.01206,"13.3":0.00709,"13.4-13.7":0.02057,"14.0-14.4":0.05462,"14.5-14.8":0.08867,"15.0-15.1":0.03476,"15.2-15.3":0.04256,"15.4":0.04753,"15.5":0.06668,"15.6-15.7":0.35041,"16.0":0.16457,"16.1":0.32984,"16.2":0.15818,"16.3":0.2965,"16.4":0.061,"16.5":0.15747,"16.6-16.7":2.66925,"17.0":0.79943,"17.1":1.34278,"17.2":0.0383},P:{"4":0.1146,"20":0.01042,"21":0.02084,"22":0.22921,"23":0.26046,"5.0-5.4":0.01042,_:"6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 14.0 15.0 16.0 18.0 19.0","13.0":0.01042,"17.0":0.04167},I:{"0":0.09261,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00007,"4.4":0,"4.4.3-4.4.4":0.00028},K:{"0":1.79373,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.0067,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.00665,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.37894},H:{"0":0.44},L:{"0":59.5821},R:{_:"0"},M:{"0":0.1662},Q:{"13.1":0.03324}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TH.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TH.js
    index 6e70a91fc16641..9100776347a7aa 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TH.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TH.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00352,"53":0.00352,"54":0,"55":0.01408,"56":0.21114,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00352,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00352,"103":0,"104":0,"105":0.00352,"106":0.00352,"107":0,"108":0,"109":0,"110":0.00352,"111":0.00352,"112":0,"113":0.00352,"114":0.00352,"115":0.05982,"116":0.0176,"117":0.26744,"118":0.02815,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0.00352,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.0176,"38":0.00352,"39":0,"40":0,"41":0.00352,"42":0,"43":0.00352,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.01056,"50":0,"51":0,"52":0,"53":0.00704,"54":0,"55":0,"56":0.00352,"57":0,"58":0,"59":0.02463,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.01056,"69":0.00352,"70":0.00352,"71":0.00352,"72":0.00352,"73":0.00704,"74":0.00704,"75":0.01408,"76":0,"77":0,"78":0.00352,"79":0.08446,"80":0.00704,"81":0.00352,"83":0.00704,"84":0.00352,"85":0.00704,"86":0.00704,"87":0.02111,"88":0.00704,"89":0.00704,"90":0.00352,"91":0.01408,"92":0.00352,"93":0.00352,"94":0.00352,"95":0.00352,"96":0.00352,"97":0.00352,"98":0.00352,"99":0.02463,"100":0.00352,"101":0.01056,"102":0.01056,"103":0.0176,"104":0.00704,"105":0.01056,"106":0.01408,"107":0.01056,"108":0.0176,"109":0.90086,"110":0.01056,"111":0.0176,"112":0.02111,"113":0.02815,"114":0.05982,"115":0.08094,"116":5.09199,"117":1.41464,"118":0.00352,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00352,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.01408,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00352,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00352,"73":0,"74":0,"75":0,"76":0,"77":0.01056,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00704,"96":0,"97":0,"98":0,"99":0,"100":0.01056,"101":0.04927,"102":0.0563,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00704,"79":0,"80":0,"81":0,"83":0,"84":0.00352,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00352,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.01408,"110":0.00352,"111":0.00352,"112":0.00352,"113":0.00352,"114":0.0176,"115":0.01408,"116":0.51026,"117":0.42932},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00352,"14":0.01056,"15":0.00352,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00704,"10.1":0,"11.1":0,"12.1":0,"13.1":0.01056,"14.1":0.03519,"15.1":0.01408,"15.2-15.3":0.00352,"15.4":0.01408,"15.5":0.0176,"15.6":0.07038,"16.0":0.00704,"16.1":0.05279,"16.2":0.02815,"16.3":0.07742,"16.4":0.0176,"16.5":0.22522,"16.6":0.69324,"17.0":0.09501,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00542,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.02979,"10.0-10.2":0,"10.3":0.04333,"11.0-11.2":0,"11.3-11.4":0.00542,"12.0-12.1":0.00812,"12.2-12.5":0.42247,"13.0-13.1":0.00812,"13.2":0.20311,"13.3":0.04604,"13.4-13.7":0.04333,"14.0-14.4":0.21124,"14.5-14.8":0.41164,"15.0-15.1":0.12187,"15.2-15.3":0.12999,"15.4":0.15978,"15.5":0.24915,"15.6-15.7":2.69732,"16.0":1.04264,"16.1":1.29991,"16.2":0.65267,"16.3":1.38928,"16.4":0.34935,"16.5":1.13743,"16.6":13.88471,"17.0":2.20173,"17.1":0.00271},P:{"4":0.33116,"20":0.09314,"21":0.19663,"22":2.10078,"5.0-5.4":0.0207,"6.2-6.4":0,"7.2-7.4":0.13453,"8.2":0,"9.2":0.01035,"10.1":0,"11.1-11.2":0.06209,"12.0":0,"13.0":0.0207,"14.0":0.0207,"15.0":0.0207,"16.0":0.04139,"17.0":0.04139,"18.0":0.03105,"19.0":0.08279},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0.0224,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.07279},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.14076,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":56.36807},R:{_:"0"},M:{"0":0.12314},Q:{"13.1":0},O:{"0":0.16851},H:{"0":0.31293}};
    +module.exports={C:{"47":0.0036,"52":0.01798,"53":0.04315,"55":0.07911,"56":1.1651,"78":0.01079,"85":0.0036,"88":0.0036,"89":0.0036,"96":0.0036,"103":0.0036,"105":0.0036,"107":0.0036,"108":0.0036,"109":0.0036,"110":0.0036,"111":0.0036,"113":0.0036,"114":0.0036,"115":0.16901,"116":0.0036,"117":0.00719,"118":0.01438,"119":0.6329,"120":0.20857,"121":0.0036,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 48 49 50 51 54 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 86 87 90 91 92 93 94 95 97 98 99 100 101 102 104 106 112 122 123 3.5 3.6"},D:{"25":0.0935,"37":0.01079,"38":0.0036,"41":0.00719,"43":0.00719,"49":0.02517,"50":0.0036,"53":0.01079,"56":0.01438,"57":0.0036,"58":0.0036,"59":0.0036,"63":0.01438,"65":0.00719,"68":0.0036,"69":0.0036,"70":0.0036,"71":0.0036,"73":0.01079,"74":0.01798,"75":0.0036,"76":0.0036,"77":0.0036,"78":0.00719,"79":0.19418,"80":0.00719,"81":0.00719,"83":0.01079,"84":0.0036,"85":0.01079,"86":0.00719,"87":0.06113,"88":0.01798,"89":0.00719,"90":0.01079,"91":0.01798,"92":0.03236,"93":0.0036,"94":0.01798,"95":0.00719,"96":0.01079,"97":0.01438,"98":0.00719,"99":0.02877,"100":0.00719,"101":0.04675,"102":0.02517,"103":0.03956,"104":0.01438,"105":0.03236,"106":0.02877,"107":0.03236,"108":0.04315,"109":2.51001,"110":0.02158,"111":0.04315,"112":0.03596,"113":0.05034,"114":0.06832,"115":0.05394,"116":0.14024,"117":0.21216,"118":3.5924,"119":16.9048,"120":0.01798,"121":0.00719,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 26 27 28 29 30 31 32 33 34 35 36 39 40 42 44 45 46 47 48 51 52 54 55 60 61 62 64 66 67 72 122"},F:{"28":0.0036,"46":0.01079,"92":0.0036,"95":0.01438,"98":0.00719,"102":0.10069,"103":0.05394,"104":0.23014,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 93 94 96 97 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.00719,"84":0.0036,"92":0.00719,"100":0.0036,"103":0.0036,"106":0.0036,"107":0.0036,"108":0.01079,"109":0.02877,"110":0.00719,"111":0.0036,"112":0.00719,"113":0.00719,"114":0.02158,"115":0.00719,"116":0.01438,"117":0.03236,"118":0.47467,"119":2.57833,_:"12 13 14 15 16 17 79 80 81 83 85 86 87 88 89 90 91 93 94 95 96 97 98 99 101 102 104 105"},E:{"13":0.0036,"14":0.02517,"15":0.00719,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1","11.1":0.0036,"12.1":0.00719,"13.1":0.02517,"14.1":0.10069,"15.1":0.01079,"15.2-15.3":0.01079,"15.4":0.02517,"15.5":0.04675,"15.6":0.18699,"16.0":0.02158,"16.1":0.12946,"16.2":0.06473,"16.3":0.32004,"16.4":0.04675,"16.5":0.10428,"16.6":1.09318,"17.0":0.51423,"17.1":0.68684,"17.2":0.01438},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00391,"5.0-5.1":0.00391,"6.0-6.1":0.00977,"7.0-7.1":0.01367,"8.1-8.4":0.00195,"9.0-9.2":0.01563,"9.3":0.04883,"10.0-10.2":0.00391,"10.3":0.07032,"11.0-11.2":0.0332,"11.3-11.4":0.0293,"12.0-12.1":0.01758,"12.2-12.5":0.32033,"13.0-13.1":0.00781,"13.2":0.0332,"13.3":0.01953,"13.4-13.7":0.05664,"14.0-14.4":0.1504,"14.5-14.8":0.24415,"15.0-15.1":0.09571,"15.2-15.3":0.11719,"15.4":0.13087,"15.5":0.1836,"15.6-15.7":0.96489,"16.0":0.45315,"16.1":0.90825,"16.2":0.43557,"16.3":0.81645,"16.4":0.16798,"16.5":0.43361,"16.6-16.7":7.34997,"17.0":2.20128,"17.1":3.69745,"17.2":0.10547},P:{"4":0.25079,"20":0.07315,"21":0.13584,"22":0.33439,"23":1.88093,"5.0-5.4":0.0418,"6.2-6.4":0.13584,"7.2-7.4":0.09405,_:"8.2 10.1 12.0","9.2":0.03135,"11.1-11.2":0.07315,"13.0":0.03135,"14.0":0.09405,"15.0":0.03135,"16.0":0.0418,"17.0":0.1254,"18.0":0.0627,"19.0":0.25079},I:{"0":0.03823,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00012},K:{"0":0.3066,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00374,"9":0.00374,"11":0.3665,_:"6 7 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.1601},H:{"0":0.02},L:{"0":41.10863},R:{_:"0"},M:{"0":0.12168},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TJ.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TJ.js
    index ec75c2c4219c35..23ee88555eb50e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TJ.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TJ.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00533,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.04264,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0.00267,"112":0,"113":0,"114":0,"115":0.04264,"116":0.00533,"117":0.07196,"118":0.00533,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00267,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0.00533,"45":0,"46":0,"47":0,"48":0,"49":0.02132,"50":0.00267,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00267,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00267,"70":0.00267,"71":0.00533,"72":0,"73":0.00267,"74":0,"75":0,"76":0.00267,"77":0,"78":0,"79":0.01333,"80":0,"81":0.008,"83":0.00267,"84":0,"85":0,"86":0.00267,"87":0.00267,"88":0.00533,"89":0.00267,"90":0.01066,"91":0.00267,"92":0.00267,"93":0,"94":0.00267,"95":0,"96":0.00267,"97":0.45039,"98":0.19988,"99":0.00267,"100":0.008,"101":0,"102":0.00533,"103":0.01066,"104":0,"105":0.09861,"106":0.06929,"107":0.12792,"108":0.09328,"109":0.60762,"110":0.00267,"111":0.02665,"112":0.31714,"113":0.01066,"114":0.02399,"115":0.02399,"116":1.74025,"117":0.26384,"118":0.00267,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00267,"29":0.00267,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00267,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0.00267,"62":0,"63":0.00267,"64":0.00533,"65":0,"66":0,"67":0.00267,"68":0,"69":0.01866,"70":0.008,"71":0.02399,"72":0.06396,"73":0.01066,"74":0,"75":0,"76":0,"77":0.01333,"78":0,"79":0.008,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.03731,"96":0,"97":0,"98":0,"99":0.00267,"100":0.00533,"101":0.0613,"102":0.07462,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0.00267,"17":0,"18":0.00533,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00267,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0.18122,"106":0,"107":0,"108":0,"109":0.00533,"110":0.01866,"111":0,"112":0.00267,"113":0.00267,"114":0.01333,"115":0.01066,"116":0.14391,"117":0.09061},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.01066,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.06663,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0.00533,"15.1":0,"15.2-15.3":0.008,"15.4":0.00267,"15.5":0.00267,"15.6":0.01066,"16.0":0,"16.1":0.00267,"16.2":0.00267,"16.3":0.03198,"16.4":0.00267,"16.5":0.01066,"16.6":0.09061,"17.0":0.02932,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00404,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0.00538,"9.3":0.04576,"10.0-10.2":0,"10.3":0.02423,"11.0-11.2":0.01077,"11.3-11.4":0.00808,"12.0-12.1":0.02692,"12.2-12.5":0.34323,"13.0-13.1":0.00404,"13.2":0.00269,"13.3":2.95181,"13.4-13.7":0.03096,"14.0-14.4":0.15345,"14.5-14.8":0.19248,"15.0-15.1":0.1171,"15.2-15.3":0.1696,"15.4":0.09691,"15.5":0.19383,"15.6-15.7":1.09835,"16.0":0.51149,"16.1":0.97182,"16.2":0.53841,"16.3":0.64339,"16.4":0.80761,"16.5":0.77261,"16.6":3.04468,"17.0":0.65147,"17.1":0},P:{"4":0.33691,"20":0.28586,"21":0.35732,"22":1.06176,"5.0-5.4":0.05105,"6.2-6.4":0.09188,"7.2-7.4":0.33691,"8.2":0,"9.2":0.06126,"10.1":0.01021,"11.1-11.2":0.06126,"12.0":0.03063,"13.0":0.04084,"14.0":0.06126,"15.0":0.38795,"16.0":0.25523,"17.0":0.05105,"18.0":0.2246,"19.0":0.30628},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.01003,"4.2-4.3":0.01505,"4.4":0,"4.4.3-4.4.4":0.08025},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.02932,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":69.30356},R:{_:"0"},M:{"0":0.04401},Q:{"13.1":0.02201},O:{"0":1.3203},H:{"0":1.32636}};
    +module.exports={C:{"52":0.01425,"92":0.00407,"100":0.00204,"102":0.00204,"105":0.00204,"106":0.0733,"107":0.18935,"108":0.3054,"111":0.00204,"113":0.00204,"115":0.19953,"116":0.00204,"117":0.00204,"118":0.01222,"119":0.1812,"120":0.07737,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 101 103 104 109 110 112 114 121 122 123 3.5 3.6"},D:{"11":0.00204,"33":0.00407,"35":0.04683,"40":0.00407,"44":0.03054,"45":0.00204,"46":0.00204,"48":0.00204,"49":0.03868,"51":0.00204,"54":0.00204,"55":0.00204,"56":0.00204,"57":0.00204,"59":0.00204,"60":0.00407,"61":0.00407,"64":0.00204,"67":0.00814,"68":0.00204,"69":0.00611,"71":0.01629,"74":0.00407,"75":0.00204,"76":0.00407,"78":0.00407,"79":0.03461,"81":0.01629,"83":0.00407,"84":0.00204,"85":0.00407,"86":0.00407,"87":0.00611,"88":0.00407,"89":0.01832,"90":0.02036,"91":0.00407,"92":0.04072,"94":0.00204,"96":0.01222,"97":0.00814,"98":0.00611,"99":0.01018,"100":0.01832,"101":0.01018,"102":0.04886,"103":0.00204,"104":0.00407,"105":0.34612,"106":0.08348,"107":0.23007,"108":0.20767,"109":2.35769,"110":0.01018,"111":0.04479,"112":0.05701,"113":0.0224,"114":0.0285,"115":0.04683,"116":0.04479,"117":0.20971,"118":1.37837,"119":5.43612,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 36 37 38 39 41 42 43 47 50 52 53 58 62 63 65 66 70 72 73 77 80 93 95 120 121 122"},F:{"70":0.00204,"79":0.04479,"80":0.00204,"82":0.00204,"84":0.00204,"86":0.01425,"87":0.00204,"95":0.20156,"99":0.00407,"101":0.00407,"102":0.08144,"103":0.10587,"104":0.31762,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 71 72 73 74 75 76 77 78 81 83 85 88 89 90 91 92 93 94 96 97 98 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.00204},B:{"13":0.00814,"14":0.00611,"15":0.00407,"16":0.01629,"17":0.00204,"18":0.06312,"84":0.00204,"89":0.00407,"90":0.00204,"91":0.00407,"92":0.0224,"94":0.00204,"98":0.00204,"100":0.00611,"103":0.00204,"107":0.33187,"108":0.01222,"109":0.04072,"110":0.00407,"111":0.00407,"112":0.00611,"113":0.00611,"114":0.00611,"115":0.01222,"116":0.02036,"117":0.03665,"118":0.21582,"119":0.92434,_:"12 79 80 81 83 85 86 87 88 93 95 96 97 99 101 102 104 105 106"},E:{"14":0.00611,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 6.1 7.1 10.1 11.1 16.0 17.2","5.1":1.47406,"9.1":0.00204,"12.1":0.00204,"13.1":0.01018,"14.1":0.00814,"15.1":0.00611,"15.2-15.3":0.00814,"15.4":0.00814,"15.5":0.00407,"15.6":0.05904,"16.1":0.01425,"16.2":0.00611,"16.3":0.04072,"16.4":0.00407,"16.5":0.01629,"16.6":0.09773,"17.0":0.04886,"17.1":0.05294},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00153,"5.0-5.1":0.00153,"6.0-6.1":0.00383,"7.0-7.1":0.00536,"8.1-8.4":0.00077,"9.0-9.2":0.00612,"9.3":0.01913,"10.0-10.2":0.00153,"10.3":0.02755,"11.0-11.2":0.01301,"11.3-11.4":0.01148,"12.0-12.1":0.00689,"12.2-12.5":0.1255,"13.0-13.1":0.00306,"13.2":0.01301,"13.3":0.00765,"13.4-13.7":0.02219,"14.0-14.4":0.05892,"14.5-14.8":0.09566,"15.0-15.1":0.0375,"15.2-15.3":0.04591,"15.4":0.05127,"15.5":0.07193,"15.6-15.7":0.37803,"16.0":0.17754,"16.1":0.35584,"16.2":0.17065,"16.3":0.31987,"16.4":0.06581,"16.5":0.16988,"16.6-16.7":2.87961,"17.0":0.86243,"17.1":1.44861,"17.2":0.04132},P:{"4":0.45312,"20":0.19132,"21":0.32222,"22":0.72498,"23":0.90623,"5.0-5.4":0.05035,"6.2-6.4":0.17118,"7.2-7.4":0.29201,"8.2":0.02014,"9.2":0.07048,"10.1":0.02014,"11.1-11.2":0.15104,"12.0":0.01007,"13.0":0.04028,"14.0":0.07048,"15.0":0.14097,"16.0":0.20138,"17.0":0.04028,"18.0":0.11076,"19.0":0.35242},I:{"0":0.17431,"3":0.00002,"4":0.00004,"2.1":0,"2.2":0.00004,"2.3":0,"4.1":0.00002,"4.2-4.3":0.00012,"4.4":0,"4.4.3-4.4.4":0.00053},K:{"0":2.61853,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00218,"11":0.11794,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":1.5926},H:{"0":0.28},L:{"0":62.83075},R:{_:"0"},M:{"0":0.0637},Q:{"13.1":0.02389}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TL.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TL.js
    index ec61eaf51d58c6..870b94bba97e2b 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TL.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TL.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00383,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00383,"37":0.01532,"38":0.00766,"39":0,"40":0.01149,"41":0.00383,"42":0,"43":0,"44":0.01149,"45":0,"46":0,"47":0.01149,"48":0.01532,"49":0,"50":0,"51":0,"52":0.00383,"53":0,"54":0,"55":0,"56":0.01532,"57":0.00383,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.00766,"64":0,"65":0.00383,"66":0,"67":0.00766,"68":0,"69":0,"70":0,"71":0,"72":0.00766,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.02298,"79":0.10341,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00383,"86":0,"87":0,"88":0.00383,"89":0,"90":0,"91":0,"92":0.00766,"93":0.00383,"94":0,"95":0.03064,"96":0.00383,"97":0,"98":0,"99":0.00766,"100":0.00383,"101":0.00383,"102":0.03447,"103":0.00383,"104":0,"105":0.01149,"106":0.01149,"107":0.01915,"108":0.00383,"109":0.00383,"110":0.00383,"111":0.00766,"112":0.01532,"113":0.11873,"114":0.02681,"115":0.54003,"116":0.19916,"117":1.12602,"118":0.15703,"119":0.00766,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00383,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0.00383,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00383,"41":0,"42":0,"43":0.00766,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00383,"54":0,"55":0,"56":0,"57":0,"58":0.02298,"59":0.00383,"60":0,"61":0.00766,"62":0.00383,"63":0,"64":0,"65":0.00766,"66":0,"67":0.00383,"68":0.01532,"69":0,"70":0.00383,"71":0,"72":0.00383,"73":0,"74":0.00766,"75":0,"76":0,"77":0,"78":0.00383,"79":0.00766,"80":0.01915,"81":0,"83":0,"84":0.00383,"85":0.00766,"86":0.00383,"87":0.0383,"88":0.01149,"89":0,"90":0.00766,"91":0.00383,"92":0,"93":0,"94":0,"95":0.00766,"96":0,"97":0.01149,"98":0.00383,"99":0.00383,"100":0.00766,"101":0.01915,"102":0.00383,"103":0.04213,"104":0.00766,"105":0.00383,"106":0,"107":0.14554,"108":0.00766,"109":0.76217,"110":0.01149,"111":0.01915,"112":0.01915,"113":0.03064,"114":0.17235,"115":0.22597,"116":5.46924,"117":1.03793,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.06128,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0.00383,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.00383,"64":0.00766,"65":0,"66":0,"67":0,"68":0.00383,"69":0.00383,"70":0.01532,"71":0.03064,"72":0.05362,"73":0.01532,"74":0,"75":0,"76":0,"77":0.00383,"78":0.00383,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01915,"96":0,"97":0,"98":0.00383,"99":0.00383,"100":0.00383,"101":0.1532,"102":0.10724,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00383},B:{"12":0.01532,"13":0.00383,"14":0.00766,"15":0.00766,"16":0.01149,"17":0.00766,"18":0.03447,"79":0,"80":0,"81":0,"83":0,"84":0.00766,"85":0.00383,"86":0,"87":0,"88":0,"89":0.00383,"90":0.01149,"91":0,"92":0.01532,"93":0,"94":0,"95":0,"96":0.00383,"97":0.00383,"98":0,"99":0,"100":0.01532,"101":0,"102":0,"103":0.00766,"104":0.00766,"105":0.00383,"106":0,"107":0,"108":0.02298,"109":0.01532,"110":0.00766,"111":0.02681,"112":0.01149,"113":0.02298,"114":0.10724,"115":0.22214,"116":1.17198,"117":0.59365},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01149,"12":0,"13":0.00383,"14":0.01532,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00383,"13.1":0.02681,"14.1":0.04213,"15.1":0.01532,"15.2-15.3":0.04979,"15.4":0.01532,"15.5":0.00383,"15.6":0.03447,"16.0":0,"16.1":0.01149,"16.2":0.02298,"16.3":0.03064,"16.4":0.01149,"16.5":0.03447,"16.6":0.02681,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.013,"10.0-10.2":0,"10.3":0.00928,"11.0-11.2":0.00093,"11.3-11.4":0,"12.0-12.1":0.00743,"12.2-12.5":0.68049,"13.0-13.1":0.01764,"13.2":0.0065,"13.3":0.02507,"13.4-13.7":0.1309,"14.0-14.4":0.50596,"14.5-14.8":1.17623,"15.0-15.1":0.17639,"15.2-15.3":0.17546,"15.4":0.20238,"15.5":0.36949,"15.6-15.7":0.7464,"16.0":0.22652,"16.1":0.42519,"16.2":0.28965,"16.3":0.82902,"16.4":0.71576,"16.5":0.51153,"16.6":1.69425,"17.0":0.13833,"17.1":0},P:{"4":0.0609,"20":0.10149,"21":0.13194,"22":0.43642,"5.0-5.4":0.13194,"6.2-6.4":0.01015,"7.2-7.4":0.14209,"8.2":0,"9.2":0.01015,"10.1":0,"11.1-11.2":0.03045,"12.0":0,"13.0":0.0203,"14.0":0.03045,"15.0":0.0203,"16.0":0.11164,"17.0":0.03045,"18.0":0.03045,"19.0":0.10149},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.05915},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0.00383,"10":0,"11":0.04979,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":71.80678},R:{_:"0"},M:{"0":0.12957},Q:{"13.1":0.00617},O:{"0":0.77742},H:{"0":1.19164}};
    +module.exports={C:{"18":0.0037,"25":0.0037,"34":0.0074,"37":0.02219,"39":0.06658,"40":0.07028,"41":0.0111,"43":0.0037,"44":0.0074,"47":0.0037,"48":0.0185,"52":0.0037,"55":0.0037,"56":0.0148,"57":0.0074,"59":0.0037,"60":0.0074,"61":0.0037,"67":0.02589,"72":0.03329,"73":0.0037,"78":0.06288,"79":0.17015,"84":0.0037,"85":0.03699,"88":0.0074,"94":0.0037,"99":0.06288,"100":0.0074,"102":0.0037,"108":0.0074,"109":0.0037,"110":0.0074,"111":0.0148,"112":0.0074,"113":0.02219,"114":0.0074,"115":1.17258,"116":0.02959,"117":0.04809,"118":0.27003,"119":2.41175,"120":0.89516,"121":0.04809,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 19 20 21 22 23 24 26 27 28 29 30 31 32 33 35 36 38 42 45 46 49 50 51 53 54 58 62 63 64 65 66 68 69 70 71 74 75 76 77 80 81 82 83 86 87 89 90 91 92 93 95 96 97 98 101 103 104 105 106 107 122 123 3.5 3.6"},D:{"31":0.0037,"34":0.0148,"40":0.0074,"43":0.0074,"49":0.0111,"50":0.0037,"51":0.0074,"55":0.0037,"56":0.02219,"58":0.04809,"63":0.0111,"64":0.0074,"65":0.04069,"67":0.0074,"68":0.02219,"69":0.0185,"70":0.0037,"72":0.0037,"73":0.0074,"74":0.02959,"75":0.0074,"79":0.0074,"80":0.03699,"83":0.0074,"85":0.0111,"86":0.0074,"87":0.05179,"88":0.02959,"89":0.0037,"90":0.02959,"91":0.0074,"93":0.0074,"94":0.0037,"95":0.03699,"96":0.0037,"97":0.0111,"98":0.0037,"99":0.0074,"100":0.0148,"101":0.0074,"102":0.02589,"103":0.08878,"104":0.02959,"105":0.0148,"106":0.0074,"107":0.0185,"108":0.04439,"109":2.28598,"110":0.0111,"111":0.04809,"112":0.04069,"113":0.02959,"114":0.16276,"115":0.11837,"116":0.46607,"117":0.54375,"118":3.85436,"119":13.53094,"120":0.0111,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 33 35 36 37 38 39 41 42 44 45 46 47 48 52 53 54 57 59 60 61 62 66 71 76 77 78 81 84 92 121 122"},F:{"78":0.0037,"80":0.0074,"85":0.0037,"93":0.0074,"95":0.04809,"100":0.0037,"102":0.04439,"103":0.14796,"104":0.26263,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 81 82 83 84 86 87 88 89 90 91 92 94 96 97 98 99 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.04069,"13":0.0148,"15":0.0074,"16":0.0111,"17":0.02219,"18":0.0148,"84":0.0074,"85":0.0037,"89":0.0074,"90":0.07768,"92":0.04439,"93":0.0037,"96":0.0074,"97":0.0037,"98":0.0037,"100":0.21084,"102":0.0185,"104":0.0037,"106":0.0185,"107":0.0111,"108":0.0111,"109":0.02589,"110":0.0074,"111":0.0111,"112":0.03699,"113":0.04069,"114":0.11467,"115":0.04439,"116":0.06288,"117":0.25523,"118":0.79159,"119":3.51775,_:"14 79 80 81 83 86 87 88 91 94 95 99 101 103 105"},E:{"11":0.0148,"12":0.0074,"13":0.0037,"14":0.0111,_:"0 4 5 6 7 8 9 10 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 16.0 17.2","12.1":0.0185,"13.1":0.07398,"14.1":0.09987,"15.1":0.0185,"15.2-15.3":0.04439,"15.4":0.02959,"15.5":0.0111,"15.6":0.02959,"16.1":0.02589,"16.2":0.0111,"16.3":0.15906,"16.4":0.0074,"16.5":0.13686,"16.6":0.39209,"17.0":0.07028,"17.1":0.02589},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00134,"5.0-5.1":0.00134,"6.0-6.1":0.00335,"7.0-7.1":0.00468,"8.1-8.4":0.00067,"9.0-9.2":0.00535,"9.3":0.01673,"10.0-10.2":0.00134,"10.3":0.02409,"11.0-11.2":0.01138,"11.3-11.4":0.01004,"12.0-12.1":0.00602,"12.2-12.5":0.10974,"13.0-13.1":0.00268,"13.2":0.01138,"13.3":0.00669,"13.4-13.7":0.01941,"14.0-14.4":0.05153,"14.5-14.8":0.08365,"15.0-15.1":0.03279,"15.2-15.3":0.04015,"15.4":0.04483,"15.5":0.0629,"15.6-15.7":0.33057,"16.0":0.15525,"16.1":0.31116,"16.2":0.14922,"16.3":0.27971,"16.4":0.05755,"16.5":0.14855,"16.6-16.7":2.51807,"17.0":0.75415,"17.1":1.26673,"17.2":0.03613},P:{"4":0.04101,"20":0.06151,"21":0.12302,"22":0.15377,"23":0.34856,"5.0-5.4":0.01025,_:"6.2-6.4 8.2 10.1 12.0","7.2-7.4":0.14352,"9.2":0.0205,"11.1-11.2":0.0205,"13.0":0.01025,"14.0":0.05126,"15.0":0.01025,"16.0":0.05126,"17.0":0.0205,"18.0":0.04101,"19.0":0.18453},I:{"0":0.05016,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00004,"4.4":0,"4.4.3-4.4.4":0.00015},K:{"0":0.94556,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.03329,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.97666},H:{"0":0.05},L:{"0":54.77614},R:{_:"0"},M:{"0":0.18903},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TM.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TM.js
    index 04abe813758d9e..bc3f974e9ed703 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TM.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TM.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0.00485,"45":0,"46":0,"47":0,"48":0.00243,"49":0,"50":0,"51":0,"52":0.00243,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00728,"69":0.00243,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00243,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00243,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.13591,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00243,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0.00243,"117":0.02912,"118":0.00243,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00243,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0.00485,"74":0.00243,"75":0.00243,"76":0.00485,"77":0.00485,"78":0.00243,"79":0.00728,"80":0.00243,"81":0.00485,"83":0.00728,"84":0.00485,"85":0.00243,"86":0.00485,"87":0,"88":0.00243,"89":0.04611,"90":0.00243,"91":0.00243,"92":0,"93":0.00728,"94":0.00728,"95":0,"96":0.00243,"97":0,"98":0.00485,"99":0.00485,"100":0.01699,"101":0.00485,"102":0.00728,"103":0.00243,"104":0.00243,"105":0.01456,"106":0.01456,"107":0.05097,"108":0.05825,"109":1.13098,"110":0.00485,"111":0.00971,"112":0.00728,"113":0.00728,"114":0.02427,"115":0.08737,"116":2.14304,"117":0.59219,"118":0.00728,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00243,"54":0,"55":0,"56":0,"57":0,"58":0.00243,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00243,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.00728,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0.00243,"85":0,"86":0,"87":0,"88":0,"89":0.00243,"90":0,"91":0.00243,"92":0,"93":0.00485,"94":0.00485,"95":0,"96":0,"97":0.01456,"98":0,"99":0.00243,"100":0.00485,"101":0.00485,"102":0.01456,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0.00485,"85":0.00243,"86":0,"87":0,"88":0.00243,"89":0,"90":0.00485,"91":0,"92":0.02184,"93":0,"94":0,"95":0,"96":0.00243,"97":0.00243,"98":0,"99":0.00243,"100":0.02427,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00243,"110":0,"111":0.00243,"112":0.00971,"113":0,"114":0.00485,"115":0.00485,"116":0.07281,"117":0.05825},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00243,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0.00485,"16.0":0,"16.1":0.00243,"16.2":0,"16.3":0.00485,"16.4":0,"16.5":0.0267,"16.6":0.16989,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0,"11.0-11.2":0.00414,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0.26195,"13.0-13.1":0.00725,"13.2":0.00725,"13.3":0.01553,"13.4-13.7":0.01553,"14.0-14.4":0.02278,"14.5-14.8":0.03003,"15.0-15.1":0.06833,"15.2-15.3":0.17912,"15.4":0.08697,"15.5":0.11389,"15.6-15.7":1.19792,"16.0":0.23606,"16.1":2.00344,"16.2":0.21329,"16.3":0.82519,"16.4":0.06109,"16.5":0.3075,"16.6":3.38772,"17.0":1.20103,"17.1":0.00725},P:{"4":0.11076,"20":0.30208,"21":0.29201,"22":2.07426,"5.0-5.4":0.02014,"6.2-6.4":0,"7.2-7.4":0.12083,"8.2":0,"9.2":0.05035,"10.1":0.01007,"11.1-11.2":0.02014,"12.0":0.07048,"13.0":0.07048,"14.0":0.02014,"15.0":0.08055,"16.0":0.12083,"17.0":0.22152,"18.0":0.48332,"19.0":0.45312},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00015,"4.2-4.3":0.00092,"4.4":0,"4.4.3-4.4.4":0.00378},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":76.17538},R:{_:"0"},M:{"0":0.06058},Q:{"13.1":0},O:{"0":0.60584},H:{"0":0.31546}};
    +module.exports={C:{"34":0.00237,"46":0.00237,"51":0.00474,"60":0.00237,"64":0.00237,"68":0.00474,"69":0.00237,"70":0.0071,"72":0.00237,"78":0.01894,"84":0.00474,"85":0.0071,"91":0.06394,"92":0.00237,"102":0.00237,"115":0.03078,"118":0.01894,"119":0.04973,"120":0.01421,"121":0.00237,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 52 53 54 55 56 57 58 59 61 62 63 65 66 67 71 73 74 75 76 77 79 80 81 82 83 86 87 88 89 90 93 94 95 96 97 98 99 100 101 103 104 105 106 107 108 109 110 111 112 113 114 116 117 122 123 3.5 3.6"},D:{"44":0.01658,"47":0.02368,"48":0.00237,"49":0.00237,"50":0.01658,"52":0.03789,"56":0.00237,"57":0.00237,"61":0.00237,"66":0.00947,"69":0.00474,"70":0.00237,"71":0.00474,"73":0.00237,"74":0.00237,"76":0.00237,"78":0.02605,"79":0.00474,"80":0.0071,"83":0.00474,"85":0.01658,"86":0.01894,"87":0.02368,"88":0.00474,"89":0.01421,"90":0.00947,"92":0.01184,"93":0.0071,"94":0.00474,"96":0.02842,"98":0.01658,"99":0.00474,"100":0.01658,"101":0.09709,"102":0.04973,"103":0.0071,"104":0.04499,"105":0.03315,"106":0.05683,"107":0.14918,"108":0.02368,"109":3.83616,"110":0.00237,"111":0.00474,"112":0.09472,"113":0.00474,"114":0.0071,"115":0.01658,"116":0.04736,"117":0.22259,"118":1.97018,"119":11.39718,"120":0.00474,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 45 46 51 53 54 55 58 59 60 62 63 64 65 67 68 72 75 77 81 84 91 95 97 121 122"},F:{"34":0.01184,"36":0.00237,"43":0.00237,"50":0.00474,"53":0.00237,"56":0.01184,"58":0.00237,"60":0.00237,"66":0.00474,"73":0.0071,"75":0.00474,"77":0.00237,"78":0.00237,"81":0.00237,"83":0.0071,"85":0.00474,"89":0.00947,"90":0.01894,"93":0.0071,"95":0.02842,"98":0.02368,"100":0.00237,"102":0.02368,"103":0.03078,"104":0.01894,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 37 38 39 40 41 42 44 45 46 47 48 49 51 52 54 55 57 62 63 64 65 67 68 69 70 71 72 74 76 79 80 82 84 86 87 88 91 92 94 96 97 99 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 12.1","11.6":0.00947},B:{"80":0.00237,"84":0.03315,"85":0.00474,"88":0.01184,"89":0.01658,"90":0.03315,"91":0.00237,"92":0.19654,"97":0.00237,"99":0.02842,"100":0.02131,"101":0.00237,"103":0.00237,"107":0.01421,"108":0.00237,"109":0.01184,"110":0.00237,"111":0.01421,"112":0.05683,"113":0.00474,"114":0.02605,"115":0.00947,"116":0.00947,"117":0.00474,"118":0.07104,"119":1.01114,_:"12 13 14 15 16 17 18 79 81 83 86 87 93 94 95 96 98 102 104 105 106"},E:{"14":0.00237,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 13.1 15.4 16.0 16.5 17.2","14.1":0.0071,"15.1":0.00237,"15.2-15.3":0.00237,"15.5":0.00237,"15.6":0.02131,"16.1":0.01184,"16.2":0.00237,"16.3":0.00237,"16.4":0.00237,"16.6":0.19181,"17.0":0.02605,"17.1":0.01894},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00131,"5.0-5.1":0.00131,"6.0-6.1":0.00327,"7.0-7.1":0.00458,"8.1-8.4":0.00065,"9.0-9.2":0.00523,"9.3":0.01635,"10.0-10.2":0.00131,"10.3":0.02355,"11.0-11.2":0.01112,"11.3-11.4":0.00981,"12.0-12.1":0.00589,"12.2-12.5":0.10727,"13.0-13.1":0.00262,"13.2":0.01112,"13.3":0.00654,"13.4-13.7":0.01897,"14.0-14.4":0.05036,"14.5-14.8":0.08176,"15.0-15.1":0.03205,"15.2-15.3":0.03924,"15.4":0.04382,"15.5":0.06148,"15.6-15.7":0.32311,"16.0":0.15174,"16.1":0.30414,"16.2":0.14586,"16.3":0.2734,"16.4":0.05625,"16.5":0.1452,"16.6-16.7":2.46124,"17.0":0.73713,"17.1":1.23814,"17.2":0.03532},P:{"4":0.18378,"20":0.05105,"21":0.19399,"22":0.25525,"23":1.47022,"5.0-5.4":0.06126,"6.2-6.4":0.01021,"7.2-7.4":0.24504,_:"8.2 10.1 12.0","9.2":0.05105,"11.1-11.2":0.01021,"13.0":0.04084,"14.0":0.03063,"15.0":0.01021,"16.0":0.07147,"17.0":0.2042,"18.0":0.12252,"19.0":0.827},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{"0":0.37397,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.00474,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.64109},H:{"0":0},L:{"0":64.91315},R:{_:"0"},M:{"0":0.08395},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TN.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TN.js
    index ba7130c8bc6357..7cade0573c36a7 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TN.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TN.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00346,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.02422,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0.00346,"76":0,"77":0,"78":0.00692,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.0346,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.01038,"103":0.00346,"104":0.00346,"105":0.00692,"106":0.00346,"107":0,"108":0,"109":0,"110":0.00346,"111":0,"112":0.00346,"113":0.00346,"114":0.00346,"115":0.10726,"116":0.02076,"117":0.25258,"118":0.02076,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.03114,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00346,"57":0,"58":0.01038,"59":0,"60":0,"61":0,"62":0,"63":0.00346,"64":0,"65":0.00692,"66":0,"67":0.00346,"68":0,"69":0,"70":0.01038,"71":0.00346,"72":0.01038,"73":0.00346,"74":0.00346,"75":0,"76":0.00346,"77":0.00346,"78":0.00346,"79":0.0173,"80":0.01038,"81":0.0173,"83":0.00346,"84":0.00692,"85":0.02076,"86":0.00692,"87":0.02768,"88":0.00346,"89":0.02076,"90":0.02768,"91":0.02076,"92":0.00692,"93":0,"94":0.00346,"95":0.00692,"96":0.00346,"97":0.00346,"98":0.01038,"99":0.02076,"100":0.01384,"101":0.00346,"102":0.01384,"103":0.0173,"104":0.00692,"105":0.01384,"106":0.0519,"107":0.02076,"108":0.10034,"109":1.80612,"110":0.0173,"111":0.0173,"112":0.0346,"113":0.02768,"114":0.07266,"115":0.15224,"116":4.4461,"117":1.18332,"118":0.00346,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0.00346,"65":0,"66":0,"67":0,"68":0,"69":0.02422,"70":0.0173,"71":0,"72":0.0173,"73":0.00346,"74":0.00346,"75":0,"76":0,"77":0.00692,"78":0,"79":0.00346,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00346,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.0346,"96":0,"97":0,"98":0,"99":0.00346,"100":0.11072,"101":0.23528,"102":0.30448,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00346,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.02422,"91":0,"92":0.00692,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00346,"108":0.00346,"109":0.02076,"110":0.00346,"111":0,"112":0.00346,"113":0.00346,"114":0.01038,"115":0.0173,"116":0.48094,"117":0.35638},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00692,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00346,"14.1":0.00346,"15.1":0,"15.2-15.3":0,"15.4":0.00346,"15.5":0.00346,"15.6":0.0173,"16.0":0.00346,"16.1":0.00346,"16.2":0.00346,"16.3":0.00692,"16.4":0,"16.5":0.00692,"16.6":0.04152,"17.0":0.00346,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00507,"6.0-6.1":0.00254,"7.0-7.1":0.03634,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.0431,"10.0-10.2":0.00169,"10.3":0.03465,"11.0-11.2":0.00423,"11.3-11.4":0.00254,"12.0-12.1":0.00676,"12.2-12.5":0.20618,"13.0-13.1":0.00254,"13.2":0.00169,"13.3":1.18218,"13.4-13.7":0.03127,"14.0-14.4":0.08619,"14.5-14.8":0.22731,"15.0-15.1":0.05831,"15.2-15.3":0.05239,"15.4":0.05493,"15.5":0.09126,"15.6-15.7":0.82896,"16.0":0.24759,"16.1":0.46898,"16.2":0.26787,"16.3":0.38955,"16.4":0.10647,"16.5":0.35491,"16.6":3.18234,"17.0":0.39209,"17.1":0},P:{"4":0.20413,"20":0.06124,"21":0.12248,"22":1.09208,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.26537,"8.2":0,"9.2":0.01021,"10.1":0,"11.1-11.2":0.02041,"12.0":0.01021,"13.0":0.03062,"14.0":0.02041,"15.0":0.01021,"16.0":0.04083,"17.0":0.05103,"18.0":0.02041,"19.0":0.05103},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.01472,"4.4":0,"4.4.3-4.4.4":0.14718},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.03114,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":76.86668},R:{_:"0"},M:{"0":0.07194},Q:{"13.1":0},O:{"0":0.1308},H:{"0":0.3715}};
    +module.exports={C:{"52":0.04861,"67":0.00405,"68":0.00405,"72":0.00405,"75":0.0081,"78":0.0081,"88":0.00405,"92":0.0081,"99":0.00405,"102":0.0081,"103":0.00405,"104":0.01215,"105":0.01215,"107":0.00405,"108":0.02836,"109":0.00405,"110":0.02026,"111":0.00405,"112":0.00405,"113":0.0081,"114":0.00405,"115":0.34028,"116":0.00405,"117":0.0081,"118":0.02431,"119":0.6036,"120":0.17014,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 69 70 71 73 74 76 77 79 80 81 82 83 84 85 86 87 89 90 91 93 94 95 96 97 98 100 101 106 121 122 123 3.5 3.6"},D:{"38":0.00405,"42":0.00405,"43":0.00405,"47":0.00405,"49":0.09317,"50":0.00405,"53":0.00405,"56":0.0081,"58":0.03241,"59":0.00405,"60":0.0081,"63":0.01215,"64":0.00405,"65":0.02026,"66":0.00405,"67":0.0162,"68":0.00405,"69":0.00405,"70":0.0162,"71":0.00405,"72":0.00405,"73":0.0162,"74":0.01215,"75":0.00405,"76":0.00405,"77":0.0081,"78":0.0081,"79":0.04456,"80":0.00405,"81":0.02026,"83":0.0081,"84":0.0081,"85":0.05671,"86":0.03241,"87":0.04861,"88":0.0162,"89":0.02026,"90":0.0081,"91":0.02431,"92":0.0162,"93":0.0081,"94":0.02026,"95":0.02026,"96":0.02026,"97":0.02431,"98":0.02836,"99":0.05266,"100":0.01215,"101":0.02026,"102":0.03646,"103":0.04861,"104":0.0162,"105":0.10128,"106":0.06077,"107":0.07697,"108":0.10938,"109":5.82939,"110":0.03646,"111":0.05671,"112":0.10128,"113":0.02836,"114":0.07292,"115":0.06482,"116":0.16204,"117":0.24711,"118":3.58108,"119":14.99275,"120":0.0081,"121":0.00405,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 44 45 46 48 51 52 54 55 57 61 62 122"},F:{"28":0.00405,"79":0.0081,"82":0.00405,"83":0.00405,"85":0.02431,"91":0.01215,"95":0.10938,"96":0.0081,"101":0.0081,"102":0.93983,"103":0.16204,"104":1.00465,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 84 86 87 88 89 90 92 93 94 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.00405},B:{"12":0.00405,"17":0.00405,"18":0.01215,"84":0.00405,"92":0.02836,"100":0.00405,"106":0.00405,"107":0.0162,"108":0.01215,"109":0.10533,"110":0.02431,"111":0.00405,"112":0.00405,"113":0.00405,"114":0.01215,"115":0.0081,"116":0.0162,"117":0.04051,"118":0.44156,"119":2.21995,_:"13 14 15 16 79 80 81 83 85 86 87 88 89 90 91 93 94 95 96 97 98 99 101 102 103 104 105"},E:{"9":0.00405,"14":0.02836,_:"0 4 5 6 7 8 10 11 12 13 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1 12.1 15.1 15.2-15.3 17.2","5.1":0.0162,"13.1":0.01215,"14.1":0.01215,"15.4":0.02026,"15.5":0.00405,"15.6":0.03241,"16.0":0.0162,"16.1":0.0162,"16.2":0.00405,"16.3":0.0162,"16.4":0.00405,"16.5":0.0162,"16.6":0.12558,"17.0":0.04861,"17.1":0.03241},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00105,"5.0-5.1":0.00105,"6.0-6.1":0.00261,"7.0-7.1":0.00366,"8.1-8.4":0.00052,"9.0-9.2":0.00418,"9.3":0.01307,"10.0-10.2":0.00105,"10.3":0.01883,"11.0-11.2":0.00889,"11.3-11.4":0.00784,"12.0-12.1":0.00471,"12.2-12.5":0.08576,"13.0-13.1":0.00209,"13.2":0.00889,"13.3":0.00523,"13.4-13.7":0.01516,"14.0-14.4":0.04026,"14.5-14.8":0.06536,"15.0-15.1":0.02562,"15.2-15.3":0.03138,"15.4":0.03504,"15.5":0.04915,"15.6-15.7":0.25832,"16.0":0.12132,"16.1":0.24316,"16.2":0.11661,"16.3":0.21858,"16.4":0.04497,"16.5":0.11609,"16.6-16.7":1.96774,"17.0":0.58933,"17.1":0.98988,"17.2":0.02824},P:{"4":0.11279,"20":0.03076,"21":0.06152,"22":0.20507,"23":0.81001,_:"5.0-5.4 6.2-6.4 8.2 10.1 12.0","7.2-7.4":0.26659,"9.2":0.01025,"11.1-11.2":0.02051,"13.0":0.01025,"14.0":0.02051,"15.0":0.02051,"16.0":0.04101,"17.0":0.07177,"18.0":0.02051,"19.0":0.04101},I:{"0":0.08287,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00025},K:{"0":0.2415,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.04861,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.00595,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.10113},H:{"0":0.05},L:{"0":58.50538},R:{_:"0"},M:{"0":0.08924},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TO.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TO.js
    index 7562d7da478254..3c5bf103bca721 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TO.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TO.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0.00467,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0.0187,"112":0,"113":0,"114":0.05609,"115":0.02337,"116":0.0187,"117":0.26174,"118":0,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0.00467,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0.0187,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0.02337,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.00467,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.04674,"104":0,"105":0.01402,"106":0,"107":0.02337,"108":0,"109":0.72914,"110":0,"111":0,"112":0.0187,"113":0.02337,"114":0.15892,"115":0.43936,"116":8.46461,"117":1.276,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.0187,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00467,"100":0,"101":0.00935,"102":0.02337,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0.00935,"14":0,"15":0.00467,"16":0,"17":0.01402,"18":0.0187,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0.11685,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00467,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.00467,"102":0,"103":0,"104":0,"105":0,"106":0.00467,"107":0,"108":0.01402,"109":0.02337,"110":0,"111":0.00935,"112":0.00467,"113":0.00467,"114":0.06076,"115":0.40664,"116":2.70157,"117":1.83688},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.03272,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.01402,"14.1":0.05141,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.01402,"15.6":0.07946,"16.0":0,"16.1":0.06076,"16.2":0.00467,"16.3":0.0187,"16.4":0.03272,"16.5":0.13555,"16.6":0.30381,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.09445,"10.0-10.2":0,"10.3":0.01692,"11.0-11.2":0.09445,"11.3-11.4":0.00564,"12.0-12.1":0,"12.2-12.5":0.30169,"13.0-13.1":0,"13.2":0,"13.3":0.01692,"13.4-13.7":0.03383,"14.0-14.4":0.67105,"14.5-14.8":0.41165,"15.0-15.1":0.15085,"15.2-15.3":0.25235,"15.4":0.11137,"15.5":0.29041,"15.6-15.7":2.95487,"16.0":0.2016,"16.1":0.36795,"16.2":0.22838,"16.3":1.11654,"16.4":0.30733,"16.5":1.14473,"16.6":5.12168,"17.0":0.15648,"17.1":0},P:{"4":0,"20":0.09434,"21":0.29351,"22":0.5975,"5.0-5.4":0.03145,"6.2-6.4":0,"7.2-7.4":0.23061,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.05241,"12.0":0,"13.0":0.02096,"14.0":0.02096,"15.0":0.04193,"16.0":0.07338,"17.0":0.02096,"18.0":0.06289,"19.0":0.10482},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.1509,"4.4":0,"4.4.3-4.4.4":0.17606},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0.00935,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":63.1096},R:{_:"0"},M:{"0":0.03196},Q:{"13.1":0.00533},O:{"0":0.56988},H:{"0":0.07059}};
    +module.exports={C:{"111":0.00421,"115":0.17665,"118":0.01682,"119":0.8412,"120":1.41742,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 112 113 114 116 117 121 122 123 3.5 3.6"},D:{"62":0.02103,"68":0.00421,"74":0.44163,"77":0.00421,"94":0.00421,"103":0.16403,"105":0.01262,"106":0.01682,"109":1.20712,"110":0.01262,"113":0.02944,"114":0.04627,"115":0.00421,"116":0.29021,"117":0.41639,"118":4.1345,"119":12.57594,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 63 64 65 66 67 69 70 71 72 73 75 76 78 79 80 81 83 84 85 86 87 88 89 90 91 92 93 95 96 97 98 99 100 101 102 104 107 108 111 112 120 121 122"},F:{"101":0.00421,"103":0.05047,"104":0.07571,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 102 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"13":0.00421,"14":0.01262,"18":0.01682,"84":0.01262,"85":0.04206,"92":0.04206,"100":0.00421,"106":0.02103,"109":0.02944,"111":0.01682,"113":0.01262,"114":0.10094,"115":0.00421,"116":0.31545,"117":0.25657,"118":2.57407,"119":8.33209,_:"12 15 16 17 79 80 81 83 86 87 88 89 90 91 93 94 95 96 97 98 99 101 102 103 104 105 107 108 110 112"},E:{"14":0.01682,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 15.1 15.2-15.3 16.0 17.2","12.1":0.01682,"13.1":0.06309,"14.1":0.07991,"15.4":0.00421,"15.5":0.00421,"15.6":0.143,"16.1":0.08412,"16.2":0.00421,"16.3":0.03365,"16.4":0.01262,"16.5":0.11356,"16.6":0.65193,"17.0":0.07991,"17.1":0.05888},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00177,"5.0-5.1":0.00177,"6.0-6.1":0.00443,"7.0-7.1":0.0062,"8.1-8.4":0.00089,"9.0-9.2":0.00709,"9.3":0.02215,"10.0-10.2":0.00177,"10.3":0.0319,"11.0-11.2":0.01506,"11.3-11.4":0.01329,"12.0-12.1":0.00797,"12.2-12.5":0.14531,"13.0-13.1":0.00354,"13.2":0.01506,"13.3":0.00886,"13.4-13.7":0.0257,"14.0-14.4":0.06823,"14.5-14.8":0.11076,"15.0-15.1":0.04342,"15.2-15.3":0.05316,"15.4":0.05937,"15.5":0.08329,"15.6-15.7":0.43771,"16.0":0.20556,"16.1":0.41202,"16.2":0.19759,"16.3":0.37037,"16.4":0.0762,"16.5":0.1967,"16.6-16.7":3.33423,"17.0":0.99858,"17.1":1.6773,"17.2":0.04785},P:{"4":0.06123,"20":0.10204,"21":0.04082,"22":0.35715,"23":1.50002,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 12.0 14.0 17.0","7.2-7.4":0.09184,"11.1-11.2":0.06123,"13.0":0.0102,"15.0":0.0102,"16.0":0.03061,"18.0":0.03061,"19.0":0.05102},I:{"0":0.00577,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.00002},K:{"0":0.04636,_:"10 11 12 11.1 11.5 12.1"},A:{"7":0.00421,"11":0.07991,_:"6 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.5795},H:{"0":0},L:{"0":51.08782},R:{_:"0"},M:{"0":0.10431},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TR.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TR.js
    index f7161871da9611..ec715660d82474 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TR.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TR.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.00923,"49":0,"50":0,"51":0,"52":0.00231,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00231,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.03461,"116":0.00692,"117":0.08075,"118":0.00923,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.00461,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.01154,"35":0,"36":0,"37":0,"38":0.01615,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00692,"48":0,"49":0.00923,"50":0,"51":0,"52":0,"53":0.00461,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.01154,"69":0,"70":0,"71":0,"72":0,"73":0.00461,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.05998,"80":0.00231,"81":0.00231,"83":0.01384,"84":0.00231,"85":0.00692,"86":0.00231,"87":0.01615,"88":0.00231,"89":0.00231,"90":0.00231,"91":0.00231,"92":0.00231,"93":0,"94":0.00231,"95":0.00231,"96":0.00692,"97":0.00231,"98":0.00231,"99":0.01846,"100":0.00231,"101":0.00231,"102":0.00231,"103":0.00923,"104":0.00461,"105":0.00461,"106":0.01154,"107":0.00923,"108":0.01154,"109":0.76362,"110":0.00692,"111":0.01154,"112":0.01384,"113":0.00923,"114":0.0323,"115":0.07844,"116":1.9102,"117":0.60674,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00461,"29":0,"30":0,"31":0.00231,"32":0.00231,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00692,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.02538,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00231,"70":0.00231,"71":0.00231,"72":0.03922,"73":0.01384,"74":0,"75":0,"76":0,"77":0.02076,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.01384,"96":0,"97":0,"98":0,"99":0.00231,"100":0.0323,"101":0.09228,"102":0.15226,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00231,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00231,"93":0,"94":0,"95":0,"96":0.00231,"97":0.00231,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00231,"108":0.00231,"109":0.02076,"110":0.00231,"111":0,"112":0.00231,"113":0.00231,"114":0.00461,"115":0.00692,"116":0.21224,"117":0.1638},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00231,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00231,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00461,"14.1":0.00692,"15.1":0,"15.2-15.3":0,"15.4":0.00231,"15.5":0.00231,"15.6":0.01846,"16.0":0.00231,"16.1":0.00461,"16.2":0.00461,"16.3":0.00923,"16.4":0.00461,"16.5":0.01154,"16.6":0.06229,"17.0":0.00461,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.01861,"8.1-8.4":0,"9.0-9.2":0.00155,"9.3":0.03102,"10.0-10.2":0.00155,"10.3":0.06979,"11.0-11.2":0.0062,"11.3-11.4":0.00775,"12.0-12.1":0.01241,"12.2-12.5":1.04999,"13.0-13.1":0.00931,"13.2":0.0031,"13.3":0.08065,"13.4-13.7":0.06824,"14.0-14.4":0.14734,"14.5-14.8":0.35827,"15.0-15.1":0.05273,"15.2-15.3":0.06824,"15.4":0.06979,"15.5":0.11942,"15.6-15.7":2.75603,"16.0":0.23574,"16.1":0.52112,"16.2":0.23264,"16.3":0.54593,"16.4":0.13959,"16.5":0.47769,"16.6":7.37475,"17.0":0.83751,"17.1":0},P:{"4":0.458,"20":0.11196,"21":0.29516,"22":2.44268,"5.0-5.4":0.03053,"6.2-6.4":0.01018,"7.2-7.4":0.14249,"8.2":0,"9.2":0.02036,"10.1":0,"11.1-11.2":0.02036,"12.0":0.01018,"13.0":0.06107,"14.0":0.03053,"15.0":0.01018,"16.0":0.04071,"17.0":0.12213,"18.0":0.03053,"19.0":0.08142},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00261,"4.2-4.3":0.00958,"4.4":0,"4.4.3-4.4.4":0.03703},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.03691,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":71.98823},R:{_:"0"},M:{"0":0.1077},Q:{"13.1":0},O:{"0":0.1154},H:{"0":0.76474}};
    +module.exports={C:{"47":0.00247,"48":0.07645,"52":0.0074,"68":0.00247,"71":0.00247,"72":0.00247,"78":0.00247,"88":0.0074,"96":0.00247,"99":0.00247,"102":0.00247,"103":0.00247,"105":0.00493,"106":0.00493,"107":0.00247,"108":0.00493,"109":0.00247,"110":0.00493,"111":0.00247,"113":0.00247,"114":0.00247,"115":0.14549,"117":0.00247,"118":0.00986,"119":0.25893,"120":0.08384,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 90 91 92 93 94 95 97 98 100 101 104 112 116 121 122 123 3.5 3.6"},D:{"22":0.00247,"26":0.02219,"34":0.07645,"38":0.09124,"39":0.00493,"41":0.00247,"43":0.00247,"47":0.03946,"48":0.00247,"49":0.03206,"50":0.00247,"53":0.01726,"55":0.00247,"56":0.00247,"58":0.00247,"59":0.00247,"60":0.00247,"63":0.00247,"65":0.00493,"66":0.00247,"67":0.00493,"68":0.00493,"69":0.00247,"70":0.00247,"71":0.00493,"72":0.00247,"73":0.01233,"74":0.00247,"75":0.00493,"77":0.00493,"78":0.00247,"79":0.34277,"80":0.01233,"81":0.0074,"83":0.05672,"84":0.0074,"85":0.02959,"86":0.00986,"87":0.09371,"88":0.01233,"89":0.00986,"90":0.0074,"91":0.00986,"92":0.0074,"93":0.00247,"94":0.01726,"95":0.00986,"96":0.00986,"97":0.00986,"98":0.01233,"99":0.04439,"100":0.00986,"101":0.0074,"102":0.00986,"103":0.03452,"104":0.01233,"105":0.02713,"106":0.05672,"107":0.05179,"108":0.07891,"109":3.54118,"110":0.04192,"111":0.05179,"112":0.06412,"113":0.02219,"114":0.04685,"115":0.03206,"116":0.15536,"117":0.16029,"118":2.24899,"119":9.77029,"120":0.00493,"121":0.00247,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 23 24 25 27 28 29 30 31 32 33 35 36 37 40 42 44 45 46 51 52 54 57 61 62 64 76 122"},F:{"28":0.01233,"31":0.00493,"32":0.0074,"36":0.00247,"40":0.01973,"46":0.11344,"79":0.00493,"85":0.00247,"86":0.00247,"90":0.00247,"91":0.00247,"92":0.00247,"93":0.00247,"94":0.00247,"95":0.06905,"102":0.53759,"103":0.16029,"104":0.7472,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 33 34 35 37 38 39 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 87 88 89 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00247,"13":0.00247,"14":0.00247,"15":0.00247,"16":0.00247,"17":0.00493,"18":0.00986,"84":0.00247,"87":0.00247,"92":0.0074,"97":0.00247,"100":0.00247,"103":0.00247,"105":0.00247,"106":0.00493,"107":0.00986,"108":0.0074,"109":0.10111,"110":0.00986,"111":0.0074,"112":0.00493,"113":0.00247,"114":0.00986,"115":0.00986,"116":0.01233,"117":0.03206,"118":0.30332,"119":1.53632,_:"79 80 81 83 85 86 88 89 90 91 93 94 95 96 98 99 101 102 104"},E:{"13":0.00247,"14":0.02219,"15":0.00247,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 6.1 7.1 9.1 10.1 11.1","5.1":0.01973,"12.1":0.00247,"13.1":0.0148,"14.1":0.02713,"15.1":0.00493,"15.2-15.3":0.00247,"15.4":0.0074,"15.5":0.00986,"15.6":0.08631,"16.0":0.00493,"16.1":0.02219,"16.2":0.02466,"16.3":0.04192,"16.4":0.02219,"16.5":0.03699,"16.6":0.18002,"17.0":0.07645,"17.1":0.10357,"17.2":0.00247},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.0023,"5.0-5.1":0.0023,"6.0-6.1":0.00574,"7.0-7.1":0.00803,"8.1-8.4":0.00115,"9.0-9.2":0.00918,"9.3":0.02869,"10.0-10.2":0.0023,"10.3":0.04131,"11.0-11.2":0.01951,"11.3-11.4":0.01721,"12.0-12.1":0.01033,"12.2-12.5":0.1882,"13.0-13.1":0.00459,"13.2":0.01951,"13.3":0.01148,"13.4-13.7":0.03328,"14.0-14.4":0.08836,"14.5-14.8":0.14345,"15.0-15.1":0.05623,"15.2-15.3":0.06885,"15.4":0.07689,"15.5":0.10787,"15.6-15.7":0.5669,"16.0":0.26624,"16.1":0.53362,"16.2":0.25591,"16.3":0.47969,"16.4":0.09869,"16.5":0.25476,"16.6-16.7":4.31835,"17.0":1.29332,"17.1":2.17237,"17.2":0.06197},P:{"4":0.51356,"20":0.0719,"21":0.18488,"22":0.33895,"23":2.13643,"5.0-5.4":0.03081,"6.2-6.4":0.02054,"7.2-7.4":0.12326,_:"8.2 10.1","9.2":0.03081,"11.1-11.2":0.02054,"12.0":0.01027,"13.0":0.05136,"14.0":0.02054,"15.0":0.01027,"16.0":0.03081,"17.0":0.10271,"18.0":0.03081,"19.0":0.06163},I:{"0":0.03749,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00011},K:{"0":0.85899,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.0025,"11":0.16025,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.11303},H:{"0":0},L:{"0":58.52229},R:{_:"0"},M:{"0":0.10549},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TT.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TT.js
    index c6bc4c02caaf10..c70d3708247ba3 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TT.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TT.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.08207,"49":0,"50":0,"51":0,"52":0.00391,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00391,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00391,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0.00391,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00782,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0.00391,"111":0,"112":0,"113":0,"114":0.00782,"115":0.03908,"116":0.02736,"117":0.49241,"118":0.03517,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00391,"48":0,"49":0.00782,"50":0,"51":0,"52":0,"53":0.00782,"54":0,"55":0,"56":0.00391,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00391,"67":0.00391,"68":0.01954,"69":0.00782,"70":0.00391,"71":0,"72":0,"73":0.00391,"74":0.00391,"75":0.00782,"76":0.01172,"77":0.00391,"78":0.00391,"79":0.03517,"80":0.00391,"81":0.00782,"83":0.00391,"84":0.00391,"85":0,"86":0,"87":0.00782,"88":0,"89":0,"90":0,"91":0.00782,"92":0.00391,"93":0.01954,"94":0,"95":0.00782,"96":0,"97":0.00782,"98":0,"99":0.00391,"100":0.00391,"101":0.00391,"102":0,"103":0.18758,"104":0.00391,"105":0.00391,"106":0.00391,"107":0.00391,"108":0.01172,"109":0.36735,"110":0.02345,"111":0.00782,"112":0.01954,"113":0.03517,"114":0.08207,"115":0.1954,"116":6.58889,"117":1.37952,"118":0.00391,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.01563,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00782,"73":0.00391,"74":0,"75":0,"76":0,"77":0.03126,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00391,"96":0,"97":0,"98":0,"99":0,"100":0.04299,"101":0.18758,"102":0.16023,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00391,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00782,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.01954,"110":0,"111":0.00782,"112":0.00391,"113":0.00391,"114":0.01172,"115":0.05471,"116":1.27401,"117":0.78942},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00391,"14":0.01172,"15":0.00782,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00391,"10.1":0,"11.1":0,"12.1":0.00391,"13.1":0.05471,"14.1":0.03126,"15.1":0,"15.2-15.3":0.00391,"15.4":0.01172,"15.5":0.02736,"15.6":0.10552,"16.0":0.01563,"16.1":0.01563,"16.2":0.01954,"16.3":0.05471,"16.4":0.04299,"16.5":0.06253,"16.6":0.55494,"17.0":0.03517,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.02934,"6.0-6.1":0,"7.0-7.1":0.03178,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.08556,"10.0-10.2":0,"10.3":0.10023,"11.0-11.2":0.00733,"11.3-11.4":0.00244,"12.0-12.1":0,"12.2-12.5":0.36181,"13.0-13.1":0,"13.2":0,"13.3":0.00244,"13.4-13.7":0.01956,"14.0-14.4":0.31536,"14.5-14.8":0.20291,"15.0-15.1":0.06845,"15.2-15.3":0.05134,"15.4":0.04645,"15.5":0.1589,"15.6-15.7":1.69169,"16.0":0.81896,"16.1":0.96075,"16.2":0.41803,"16.3":0.83851,"16.4":0.18335,"16.5":0.80429,"16.6":15.46482,"17.0":1.49368,"17.1":0},P:{"4":0.36801,"20":0.09463,"21":0.28389,"22":4.48969,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.30492,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01051,"12.0":0,"13.0":0.04206,"14.0":0.02103,"15.0":0.01051,"16.0":0.03154,"17.0":0.05257,"18.0":0.02103,"19.0":0.06309},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.03672,"4.2-4.3":0.24477,"4.4":0,"4.4.3-4.4.4":0.46506},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00391,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0.00609},N:{"10":0,"11":0},L:{"0":52.31206},R:{_:"0"},M:{"0":0.24977},Q:{"13.1":0},O:{"0":0.06092},H:{"0":0.34605}};
    +module.exports={C:{"52":0.00372,"77":0.00372,"78":0.00744,"87":0.00744,"88":0.00372,"102":0.00372,"103":0.00372,"114":0.00744,"115":0.21204,"117":0.01488,"118":0.0744,"119":0.88536,"120":0.25668,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 79 80 81 82 83 84 85 86 89 90 91 92 93 94 95 96 97 98 99 100 101 104 105 106 107 108 109 110 111 112 113 116 121 122 123 3.5 3.6"},D:{"38":0.00372,"47":0.00372,"49":0.01116,"53":0.01116,"54":0.00372,"55":0.00372,"56":0.00744,"58":0.00372,"59":0.00372,"60":0.00372,"62":0.00372,"67":0.00372,"70":0.00372,"73":0.00372,"75":0.01116,"76":0.02232,"77":0.00744,"79":0.06324,"80":0.00372,"81":0.01116,"83":0.00372,"84":0.00372,"85":0.00372,"86":0.00372,"87":0.0372,"88":0.01488,"90":0.00372,"91":0.03348,"93":0.04464,"94":0.00744,"95":0.0186,"96":0.00372,"97":0.00372,"98":0.00744,"100":0.00372,"101":0.01116,"102":0.06696,"103":0.52452,"104":0.00372,"105":0.01488,"106":0.00372,"107":0.00744,"108":0.01116,"109":0.88164,"110":0.02976,"111":0.02976,"112":0.02604,"113":0.0372,"114":0.04092,"115":0.03348,"116":0.35712,"117":0.38688,"118":4.86948,"119":16.79208,"120":0.02232,"121":0.00744,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 48 50 51 52 57 61 63 64 65 66 68 69 71 72 74 78 89 92 99 122"},F:{"28":0.02976,"36":0.00372,"63":0.00372,"79":0.00372,"88":0.00372,"95":0.00372,"102":0.37572,"103":0.11532,"104":0.40176,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 85 86 87 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.00372,"89":0.00372,"92":0.01116,"102":0.00372,"109":0.05952,"110":0.00372,"111":0.02604,"113":0.00372,"114":0.00372,"115":0.01116,"116":0.0186,"117":0.11532,"118":0.80352,"119":3.87252,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 90 91 93 94 95 96 97 98 99 100 101 103 104 105 106 107 108 112"},E:{"10":0.00372,"12":0.00372,"13":0.00372,"14":0.02976,"15":0.00372,_:"0 4 5 6 7 8 9 11 3.1 3.2 5.1 6.1 7.1 10.1","9.1":0.00372,"11.1":0.00744,"12.1":0.00744,"13.1":0.12276,"14.1":0.0558,"15.1":0.00372,"15.2-15.3":0.00744,"15.4":0.02232,"15.5":0.13764,"15.6":0.13764,"16.0":0.02604,"16.1":0.02976,"16.2":0.03348,"16.3":0.0558,"16.4":0.0558,"16.5":0.18972,"16.6":0.744,"17.0":0.29016,"17.1":0.40176,"17.2":0.00744},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00277,"5.0-5.1":0.00277,"6.0-6.1":0.00692,"7.0-7.1":0.00968,"8.1-8.4":0.00138,"9.0-9.2":0.01107,"9.3":0.03458,"10.0-10.2":0.00277,"10.3":0.0498,"11.0-11.2":0.02352,"11.3-11.4":0.02075,"12.0-12.1":0.01245,"12.2-12.5":0.22686,"13.0-13.1":0.00553,"13.2":0.02352,"13.3":0.01383,"13.4-13.7":0.04011,"14.0-14.4":0.10651,"14.5-14.8":0.17291,"15.0-15.1":0.06778,"15.2-15.3":0.083,"15.4":0.09268,"15.5":0.13003,"15.6-15.7":0.68333,"16.0":0.32092,"16.1":0.64322,"16.2":0.30847,"16.3":0.5782,"16.4":0.11896,"16.5":0.30708,"16.6-16.7":5.20522,"17.0":1.55894,"17.1":2.61852,"17.2":0.0747},P:{"4":0.35562,"20":0.08621,"21":0.21553,"22":0.26941,"23":4.84939,"5.0-5.4":0.01078,"6.2-6.4":0.01078,"7.2-7.4":0.19398,_:"8.2 9.2 10.1 12.0 13.0 15.0","11.1-11.2":0.02155,"14.0":0.02155,"16.0":0.02155,"17.0":0.04311,"18.0":0.01078,"19.0":0.11854},I:{"0":0.07497,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00005,"4.4":0,"4.4.3-4.4.4":0.00023},K:{"0":0.41441,_:"10 11 12 11.1 11.5 12.1"},A:{"10":0.00868,"11":0.0434,_:"6 7 8 9 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.03767},H:{"0":0},L:{"0":44.19314},R:{_:"0"},M:{"0":0.19465},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TV.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TV.js
    index 744b149fcbab85..7959375f0e7621 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TV.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TV.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0.00887,"118":0,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.01774,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00887,"109":0.03438,"110":0,"111":0,"112":0,"113":0,"114":0.02551,"115":0,"116":0.41588,"117":0.00887,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00887,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00887,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0.02551,"115":0.04325,"116":0.27725,"117":0.21626},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.02551,"15.6":0.01774,"16.0":0,"16.1":0,"16.2":0,"16.3":0,"16.4":0,"16.5":0,"16.6":0,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0,"14.0-14.4":0,"14.5-14.8":0,"15.0-15.1":0,"15.2-15.3":0.04762,"15.4":0,"15.5":0,"15.6-15.7":0.04762,"16.0":0.04762,"16.1":0,"16.2":0,"16.3":0.28548,"16.4":0,"16.5":0.19036,"16.6":0.38061,"17.0":0.14274,"17.1":0},P:{"4":0,"20":0,"21":0,"22":0.08002,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0,"17.0":0,"18.0":0,"19.0":0},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":97.5379},R:{_:"0"},M:{"0":0},Q:{"13.1":0},O:{"0":0.08002},H:{"0":0}};
    +module.exports={C:{"120":0.07678,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 121 122 123 3.5 3.6"},D:{"42":0.07678,"116":0.30893,"117":0.07678,"118":1.39476,"119":12.47062,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 120 121 122"},F:{_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"92":0.30893,"108":0.07678,"114":0.23216,"118":1.47154,"119":1.31616,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 109 110 111 112 113 115 116 117"},E:{_:"0 4 5 6 7 8 9 10 11 12 13 14 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 13.1 14.1 15.2-15.3 15.4 15.5 15.6 16.0 16.1 16.2 16.3 16.4 16.5 16.6 17.0 17.1 17.2","15.1":0.07678},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00043,"5.0-5.1":0.00043,"6.0-6.1":0.00109,"7.0-7.1":0.00152,"8.1-8.4":0.00022,"9.0-9.2":0.00174,"9.3":0.00543,"10.0-10.2":0.00043,"10.3":0.00783,"11.0-11.2":0.0037,"11.3-11.4":0.00326,"12.0-12.1":0.00196,"12.2-12.5":0.03565,"13.0-13.1":0.00087,"13.2":0.0037,"13.3":0.00217,"13.4-13.7":0.0063,"14.0-14.4":0.01674,"14.5-14.8":0.02717,"15.0-15.1":0.01065,"15.2-15.3":0.01304,"15.4":0.01456,"15.5":0.02043,"15.6-15.7":0.10738,"16.0":0.05043,"16.1":0.10108,"16.2":0.04847,"16.3":0.09086,"16.4":0.01869,"16.5":0.04826,"16.6-16.7":0.81798,"17.0":0.24498,"17.1":0.41149,"17.2":0.01174},P:{"23":1.08688,_:"4 20 21 22 5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0"},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{"0":0,_:"10 11 12 11.1 11.5 12.1"},A:{_:"6 7 8 9 10 11 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{_:"0"},H:{"0":0},L:{"0":78.15229},R:{_:"0"},M:{"0":0.62107},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TW.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TW.js
    index b1a713b6e52904..a9f7311f1b2963 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TW.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TW.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00867,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00433,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00433,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00433,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0.00433,"115":0.06934,"116":0.01734,"117":0.24704,"118":0.01734,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00433,"31":0,"32":0,"33":0,"34":0.00867,"35":0,"36":0,"37":0,"38":0.03034,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.026,"50":0,"51":0,"52":0,"53":0.026,"54":0,"55":0,"56":0.00867,"57":0,"58":0,"59":0,"60":0,"61":0.01734,"62":0.00433,"63":0,"64":0,"65":0.00433,"66":0.00433,"67":0.00433,"68":0.00433,"69":0.00433,"70":0.00433,"71":0.00433,"72":0.00433,"73":0.00433,"74":0.00867,"75":0.00433,"76":0.00433,"77":0.02167,"78":0.00433,"79":0.2167,"80":0.00433,"81":0.013,"83":0.00867,"84":0,"85":0.00433,"86":0.00867,"87":0.05201,"88":0.00433,"89":0.00867,"90":0.00433,"91":0.00433,"92":0.00433,"93":0.00433,"94":0.00433,"95":0.00433,"96":0.00867,"97":0.013,"98":0.00433,"99":0.01734,"100":0.00433,"101":0.00867,"102":0.013,"103":0.03901,"104":0.00433,"105":0.00867,"106":0.013,"107":0.013,"108":0.026,"109":1.59058,"110":0.00867,"111":0.01734,"112":0.026,"113":0.03901,"114":0.09535,"115":0.2037,"116":7.79253,"117":1.7076,"118":0.00867,"119":0.00433,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00867,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00433,"37":0.00433,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.03901,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.00867,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00433,"96":0,"97":0,"98":0,"99":0,"100":0.00433,"101":0.026,"102":0.01734,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00433,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00433,"109":0.04334,"110":0.00433,"111":0.00433,"112":0.00433,"113":0.00867,"114":0.013,"115":0.03467,"116":0.94915,"117":0.59376},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.01734,"14":0.05634,"15":0.00867,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.013,"13.1":0.04767,"14.1":0.15602,"15.1":0.01734,"15.2-15.3":0.013,"15.4":0.05201,"15.5":0.09101,"15.6":0.29471,"16.0":0.013,"16.1":0.06501,"16.2":0.05634,"16.3":0.16469,"16.4":0.04767,"16.5":0.16036,"16.6":1.2872,"17.0":0.026,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.02113,"6.0-6.1":0.01268,"7.0-7.1":0.09298,"8.1-8.4":0.02959,"9.0-9.2":0.00423,"9.3":0.14793,"10.0-10.2":0.00845,"10.3":0.22401,"11.0-11.2":0.01691,"11.3-11.4":0.02536,"12.0-12.1":0.05072,"12.2-12.5":0.63821,"13.0-13.1":0.02959,"13.2":0.01268,"13.3":0.04649,"13.4-13.7":0.09721,"14.0-14.4":0.71007,"14.5-14.8":1.04397,"15.0-15.1":0.5241,"15.2-15.3":0.50296,"15.4":0.65512,"15.5":0.83686,"15.6-15.7":2.92903,"16.0":1.88083,"16.1":2.83604,"16.2":1.60188,"16.3":2.76419,"16.4":0.8749,"16.5":2.40493,"16.6":19.97485,"17.0":0.99325,"17.1":0},P:{"4":0.53018,"20":0.15148,"21":0.2705,"22":2.26136,"5.0-5.4":0.07574,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0.02164,"10.1":0,"11.1-11.2":0.03246,"12.0":0.01082,"13.0":0.0541,"14.0":0.02164,"15.0":0.02164,"16.0":0.04328,"17.0":0.06492,"18.0":0.0541,"19.0":0.09738},I:{"0":0,"3":0,"4":0.0069,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.0138,"4.4":0,"4.4.3-4.4.4":0.0483},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.04334,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":34.91011},R:{_:"0"},M:{"0":0.07932},Q:{"13.1":0.00567},O:{"0":0.08499},H:{"0":0.19311}};
    +module.exports={C:{"34":0.02399,"52":0.008,"78":0.004,"88":0.01199,"102":0.004,"104":0.004,"110":0.004,"111":0.004,"113":0.004,"114":0.004,"115":0.15192,"116":0.004,"117":0.008,"118":0.01599,"119":0.44778,"120":0.12794,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 90 91 92 93 94 95 96 97 98 99 100 101 103 105 106 107 108 109 112 121 122 123 3.5 3.6"},D:{"11":0.004,"26":0.004,"30":0.008,"33":0.008,"34":0.01999,"38":0.07196,"45":0.004,"49":0.06397,"50":0.004,"53":0.05997,"55":0.004,"56":0.01599,"58":0.004,"61":0.03998,"63":0.004,"64":0.004,"65":0.008,"66":0.008,"67":0.01199,"68":0.004,"69":0.004,"70":0.004,"71":0.008,"72":0.004,"73":0.01599,"74":0.01999,"75":0.004,"76":0.008,"77":0.004,"78":0.008,"79":0.53173,"80":0.008,"81":0.02399,"83":0.01999,"84":0.004,"85":0.004,"86":0.01199,"87":0.14393,"88":0.004,"89":0.008,"90":0.004,"91":0.01199,"92":0.004,"93":0.004,"94":0.01599,"95":0.01199,"96":0.01199,"97":0.02799,"98":0.01199,"99":0.01999,"100":0.008,"101":0.01599,"102":0.02799,"103":0.07996,"104":0.01199,"105":0.02399,"106":0.01999,"107":0.02399,"108":0.05597,"109":3.47826,"110":0.01999,"111":0.03198,"112":0.03598,"113":0.02799,"114":0.07596,"115":0.05597,"116":0.26387,"117":0.37181,"118":4.47376,"119":17.65117,"120":0.01599,"121":0.01599,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 27 28 29 31 32 35 36 37 39 40 41 42 43 44 46 47 48 51 52 54 57 59 60 62 122"},F:{"28":0.01599,"36":0.01199,"40":0.004,"46":0.09595,"95":0.01199,"102":0.008,"103":0.01999,"104":0.05997,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"14":0.004,"16":0.004,"17":0.004,"18":0.008,"84":0.004,"92":0.004,"105":0.004,"106":0.004,"107":0.004,"108":0.008,"109":0.09595,"110":0.004,"111":0.004,"112":0.008,"113":0.008,"114":0.01199,"115":0.01199,"116":0.01199,"117":0.04798,"118":0.53973,"119":2.77861,_:"12 13 15 79 80 81 83 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104"},E:{"7":0.004,"12":0.004,"13":0.04398,"14":0.12394,"15":0.01999,_:"0 4 5 6 8 9 10 11 3.1 3.2 5.1 6.1 7.1 9.1 10.1","11.1":0.004,"12.1":0.02799,"13.1":0.10795,"14.1":0.33983,"15.1":0.03998,"15.2-15.3":0.03198,"15.4":0.11994,"15.5":0.1999,"15.6":0.67566,"16.0":0.02799,"16.1":0.15192,"16.2":0.11994,"16.3":0.34783,"16.4":0.09995,"16.5":0.28386,"16.6":2.52274,"17.0":0.27186,"17.1":0.68766,"17.2":0.008},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00582,"5.0-5.1":0.00582,"6.0-6.1":0.01456,"7.0-7.1":0.02038,"8.1-8.4":0.00291,"9.0-9.2":0.02329,"9.3":0.07279,"10.0-10.2":0.00582,"10.3":0.10482,"11.0-11.2":0.0495,"11.3-11.4":0.04367,"12.0-12.1":0.0262,"12.2-12.5":0.4775,"13.0-13.1":0.01165,"13.2":0.0495,"13.3":0.02912,"13.4-13.7":0.08444,"14.0-14.4":0.22419,"14.5-14.8":0.36395,"15.0-15.1":0.14267,"15.2-15.3":0.17469,"15.4":0.19508,"15.5":0.27369,"15.6-15.7":1.43832,"16.0":0.67548,"16.1":1.35388,"16.2":0.64928,"16.3":1.21704,"16.4":0.2504,"16.5":0.64637,"16.6-16.7":10.95624,"17.0":3.28134,"17.1":5.5116,"17.2":0.15722},P:{"4":0.59339,"20":0.11196,"21":0.16794,"22":0.50382,"23":2.20562,"5.0-5.4":0.08957,"6.2-6.4":0.0112,_:"7.2-7.4 8.2 10.1","9.2":0.0112,"11.1-11.2":0.03359,"12.0":0.0112,"13.0":0.04478,"14.0":0.02239,"15.0":0.02239,"16.0":0.04478,"17.0":0.05598,"18.0":0.05598,"19.0":0.08957},I:{"0":0.01792,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00005},K:{"0":0.19807,_:"10 11 12 11.1 11.5 12.1"},A:{"9":0.006,"11":0.10195,_:"6 7 8 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.07803},H:{"0":0},L:{"0":26.89446},R:{_:"0"},M:{"0":0.09603},Q:{"13.1":0.006}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TZ.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TZ.js
    index 799908d6c93932..a98f0315dbd92c 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TZ.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/TZ.js
    @@ -1 +1 @@
    -module.exports={C:{"34":0.00191,"43":0.00191,"47":0.00191,"52":0.00574,"56":0.00191,"59":0.00191,"72":0.00383,"78":0.0134,"91":0.00574,"96":0.00191,"99":0.00383,"101":0.00191,"102":0.02297,"104":0.00383,"107":0.00191,"111":0.00383,"112":0.00383,"113":0.00957,"114":0.0134,"115":0.43256,"116":0.07465,"117":0.94934,"118":0.10527,"119":0.00766,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 44 45 46 48 49 50 51 53 54 55 57 58 60 61 62 63 64 65 66 67 68 69 70 71 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 92 93 94 95 97 98 100 103 105 106 108 109 110 120 3.5 3.6"},D:{"11":0.00957,"33":0.00191,"49":0.00191,"55":0.00191,"63":0.00383,"64":0.00191,"68":0.00574,"70":0.00383,"71":0.00191,"72":0.00191,"73":0.00191,"74":0.01148,"75":0.00191,"76":0.00191,"77":0.00766,"79":0.00957,"80":0.00766,"81":0.00383,"83":0.00957,"84":0.0134,"85":0.00191,"87":0.0134,"88":0.00766,"89":0.01148,"90":0.0134,"91":0.00383,"92":0.00383,"93":0.00574,"94":0.356,"95":0.01723,"96":0.00383,"97":0.00766,"98":0.01914,"99":0.3139,"101":0.00383,"102":0.01914,"103":0.04211,"104":0.00574,"105":0.00766,"106":0.00766,"107":0.01148,"108":0.01531,"109":0.98188,"110":0.02105,"111":0.02871,"112":0.06508,"113":0.04594,"114":0.13781,"115":0.16269,"116":6.00613,"117":1.54651,"118":0.00957,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 50 51 52 53 54 56 57 58 59 60 61 62 65 66 67 69 78 86 100 119 120"},F:{"38":0.00191,"42":0.00383,"75":0.00383,"77":0.00574,"79":0.0134,"82":0.00383,"86":0.00191,"95":0.03445,"98":0.00383,"99":0.00383,"100":0.01148,"101":0.20863,"102":0.21054,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 76 78 80 81 83 84 85 87 88 89 90 91 92 93 94 96 97 9.5-9.6 10.5 10.6 11.1 11.5 11.6 12.1","10.0-10.1":0},B:{"12":0.00957,"13":0.00766,"14":0.00191,"15":0.00383,"16":0.00574,"17":0.00383,"18":0.04785,"84":0.00191,"89":0.00383,"90":0.00766,"92":0.02105,"100":0.00191,"103":0.00191,"108":0.00383,"109":0.01148,"110":0.00383,"111":0.00191,"112":0.0134,"113":0.01148,"114":0.02871,"115":0.0689,"116":0.76369,"117":0.52444,_:"79 80 81 83 85 86 87 88 91 93 94 95 96 97 98 99 101 102 104 105 106 107"},E:{"4":0,"13":0.00574,"14":0.00766,_:"0 5 6 7 8 9 10 11 12 15 3.1 3.2 6.1 7.1 9.1 10.1 17.1","5.1":0.00766,"11.1":0.00383,"12.1":0.00383,"13.1":0.01723,"14.1":0.01723,"15.1":0.00383,"15.2-15.3":0.00383,"15.4":0.00383,"15.5":0.00574,"15.6":0.05551,"16.0":0.00766,"16.1":0.00957,"16.2":0.00766,"16.3":0.0268,"16.4":0.01914,"16.5":0.02488,"16.6":0.10527,"17.0":0.00766},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00103,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00412,"8.1-8.4":0.00257,"9.0-9.2":0.00618,"9.3":0.0103,"10.0-10.2":0.00154,"10.3":0.02317,"11.0-11.2":0.00309,"11.3-11.4":0.00103,"12.0-12.1":0.01133,"12.2-12.5":0.50043,"13.0-13.1":0.00618,"13.2":0.0381,"13.3":0.01802,"13.4-13.7":0.05303,"14.0-14.4":0.13695,"14.5-14.8":0.20285,"15.0-15.1":0.07002,"15.2-15.3":0.07156,"15.4":0.06899,"15.5":0.08238,"15.6-15.7":0.68268,"16.0":0.16887,"16.1":0.18123,"16.2":0.15085,"16.3":0.28625,"16.4":0.16887,"16.5":0.35988,"16.6":1.50438,"17.0":0.29449,"17.1":0},P:{"4":0.18825,"20":0.07321,"21":0.11504,"22":0.80531,"5.0-5.4":0.02092,"6.2-6.4":0.02092,"7.2-7.4":0.09413,"8.2":0,"9.2":0.05229,"10.1":0.01021,"11.1-11.2":0.05229,"12.0":0.03063,"13.0":0.01046,"14.0":0.06126,"15.0":0.01046,"16.0":0.08367,"17.0":0.04183,"18.0":0.03138,"19.0":0.14642},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00412,"4.4":0,"4.4.3-4.4.4":0.08483},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"11":0.02871,_:"6 7 8 9 10 5.5"},S:{"2.5":1.27759,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":64.5403},R:{_:"0"},M:{"0":0.08086},Q:{"13.1":0},O:{"0":0.61454},H:{"0":11.39875}};
    +module.exports={C:{"34":0.00323,"36":0.00323,"37":0.00162,"38":0.00162,"40":0.00162,"43":0.00162,"44":0.00162,"45":0.00162,"47":0.00162,"48":0.00162,"49":0.00323,"52":0.00323,"64":0.00162,"65":0.00162,"68":0.00162,"72":0.00323,"78":0.00323,"84":0.00162,"88":0.00485,"91":0.00808,"95":0.00162,"96":0.00162,"101":0.00323,"102":0.00323,"103":0.00162,"108":0.00485,"109":0.00162,"110":0.00323,"111":0.00162,"112":0.00162,"113":0.00323,"114":0.00323,"115":0.15989,"116":0.00646,"117":0.00969,"118":0.03876,"119":0.65085,"120":0.1938,"121":0.01131,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 39 41 42 46 50 51 53 54 55 56 57 58 59 60 61 62 63 66 67 69 70 71 73 74 75 76 77 79 80 81 82 83 85 86 87 89 90 92 93 94 97 98 99 100 104 105 106 107 122 123 3.5 3.6"},D:{"11":0.00485,"33":0.00162,"37":0.00162,"38":0.00162,"39":0.00162,"40":0.00162,"41":0.00323,"43":0.00162,"46":0.00162,"49":0.00323,"50":0.00162,"53":0.00162,"55":0.00323,"56":0.00162,"58":0.00162,"60":0.00162,"61":0.00323,"62":0.00162,"63":0.00323,"64":0.00323,"66":0.00162,"67":0.00162,"68":0.01292,"69":0.00323,"70":0.01131,"71":0.00323,"72":0.00162,"73":0.00162,"74":0.00646,"75":0.00162,"76":0.00162,"77":0.00808,"78":0.00323,"79":0.00808,"80":0.00485,"81":0.00323,"83":0.00323,"84":0.00323,"85":0.00485,"86":0.00162,"87":0.01131,"88":0.00808,"89":0.00485,"90":0.00808,"91":0.00485,"92":0.00646,"93":0.00646,"94":0.32623,"95":0.00485,"96":0.00485,"97":0.00323,"98":0.00485,"99":0.37468,"100":0.00323,"101":0.00323,"102":0.01454,"103":0.03876,"104":0.01131,"105":0.02423,"106":0.01454,"107":0.00808,"108":0.021,"109":1.02068,"110":0.01615,"111":0.0323,"112":0.03876,"113":0.02423,"114":0.06299,"115":0.05168,"116":0.12759,"117":0.24064,"118":1.4422,"119":5.15024,"120":0.00646,"121":0.00162,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 42 44 45 47 48 51 52 54 57 59 65 122"},F:{"37":0.00162,"42":0.00162,"79":0.00969,"86":0.00162,"89":0.00162,"94":0.08237,"95":0.02907,"101":0.00162,"102":0.02261,"103":0.0856,"104":0.22772,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 39 40 41 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 85 87 88 90 91 92 93 96 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.01292,"13":0.00323,"14":0.00808,"15":0.00485,"16":0.00646,"17":0.00323,"18":0.04845,"84":0.00323,"85":0.00162,"89":0.00485,"90":0.00969,"92":0.02746,"95":0.00162,"100":0.01292,"104":0.00162,"107":0.00485,"108":0.00162,"109":0.00969,"110":0.00323,"111":0.00162,"112":0.00162,"113":0.00646,"114":0.00969,"115":0.01615,"116":0.01292,"117":0.04038,"118":0.24064,"119":1.04975,_:"79 80 81 83 86 87 88 91 93 94 96 97 98 99 101 102 103 105 106"},E:{"11":0.00162,"12":0.00162,"13":0.00323,"14":0.00485,"15":0.00323,_:"0 4 5 6 7 8 9 10 3.1 3.2 6.1 7.1 9.1 10.1","5.1":0.00485,"11.1":0.00323,"12.1":0.00162,"13.1":0.01777,"14.1":0.02423,"15.1":0.00323,"15.2-15.3":0.00162,"15.4":0.00485,"15.5":0.00323,"15.6":0.03553,"16.0":0.00162,"16.1":0.01131,"16.2":0.01454,"16.3":0.01131,"16.4":0.01777,"16.5":0.02423,"16.6":0.10175,"17.0":0.05168,"17.1":0.04845,"17.2":0.00162},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00095,"5.0-5.1":0.00095,"6.0-6.1":0.00239,"7.0-7.1":0.00334,"8.1-8.4":0.00048,"9.0-9.2":0.00382,"9.3":0.01193,"10.0-10.2":0.00095,"10.3":0.01717,"11.0-11.2":0.00811,"11.3-11.4":0.00716,"12.0-12.1":0.00429,"12.2-12.5":0.07824,"13.0-13.1":0.00191,"13.2":0.00811,"13.3":0.00477,"13.4-13.7":0.01383,"14.0-14.4":0.03673,"14.5-14.8":0.05963,"15.0-15.1":0.02338,"15.2-15.3":0.02862,"15.4":0.03196,"15.5":0.04484,"15.6-15.7":0.23566,"16.0":0.11068,"16.1":0.22183,"16.2":0.10638,"16.3":0.19941,"16.4":0.04103,"16.5":0.10591,"16.6-16.7":1.79514,"17.0":0.53763,"17.1":0.90305,"17.2":0.02576},P:{"4":0.22,"20":0.06,"21":0.09,"22":0.23,"23":0.51001,"5.0-5.4":0.03,"6.2-6.4":0.01,"7.2-7.4":0.09,_:"8.2 10.1 12.0 15.0","9.2":0.05,"11.1-11.2":0.06,"13.0":0.02,"14.0":0.02,"16.0":0.08,"17.0":0.04,"18.0":0.02,"19.0":0.13},I:{"0":0.10845,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00008,"4.4":0,"4.4.3-4.4.4":0.00033},K:{"0":6.51306,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.02907,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":1.0983,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.42758},H:{"0":5.3},L:{"0":66.73443},R:{_:"0"},M:{"0":0.11738},Q:{"13.1":0.00838}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/UA.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/UA.js
    index f44ee080f00c38..cef9aab7616bb3 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/UA.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/UA.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00575,"46":0.00575,"47":0,"48":0.60417,"49":0,"50":0.01151,"51":0.00575,"52":0.12659,"53":0.01151,"54":0,"55":0.00575,"56":0.01151,"57":0.00575,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.01151,"69":0,"70":0.00575,"71":0,"72":0.00575,"73":0,"74":0.00575,"75":0,"76":0,"77":0,"78":0.01151,"79":0,"80":0.00575,"81":0.00575,"82":0,"83":0.01151,"84":0.00575,"85":0.02877,"86":0,"87":0.01151,"88":0.00575,"89":0,"90":0,"91":0.00575,"92":0,"93":0.05754,"94":0.01151,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.01151,"101":0.01151,"102":0.11508,"103":0.01151,"104":0.01151,"105":0.00575,"106":0.01151,"107":0.01726,"108":0.02302,"109":0.00575,"110":0.01726,"111":0.03452,"112":0.01151,"113":0.02302,"114":0.02302,"115":0.47183,"116":0.20139,"117":0.99544,"118":0.08631,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00575,"39":0,"40":0,"41":0.00575,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00575,"48":0.00575,"49":0.05754,"50":0,"51":0.00575,"52":0,"53":0,"54":0,"55":0,"56":0.01151,"57":0.00575,"58":0.00575,"59":0,"60":0.00575,"61":0.01726,"62":0,"63":0.00575,"64":0,"65":0.00575,"66":0,"67":0.00575,"68":0.01726,"69":0.00575,"70":0.00575,"71":0.01151,"72":0.00575,"73":0.01151,"74":0.02302,"75":0.11508,"76":0.02877,"77":0.02302,"78":0.05754,"79":0.03452,"80":0.09782,"81":0.05179,"83":0.02877,"84":0.01726,"85":0.06329,"86":0.0748,"87":0.09206,"88":0.12083,"89":0.02302,"90":0.24742,"91":0.09782,"92":0.06905,"93":0.01726,"94":0.01151,"95":0.01726,"96":0.12659,"97":0.04028,"98":0.03452,"99":0.06905,"100":0.03452,"101":0.03452,"102":0.11508,"103":0.10933,"104":0.04028,"105":0.08631,"106":0.17262,"107":0.19564,"108":0.17837,"109":2.56053,"110":0.08631,"111":0.08056,"112":0.09782,"113":0.06905,"114":0.22441,"115":0.3625,"116":11.03617,"117":3.3028,"118":0.00575,"119":0.00575,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.02877,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00575,"47":0,"48":0.00575,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0.00575,"55":0,"56":0,"57":0,"58":0,"60":0.01151,"62":0.00575,"63":0.01726,"64":0.00575,"65":0.06329,"66":0,"67":0.00575,"68":0,"69":0.00575,"70":0.01726,"71":0.00575,"72":0.02877,"73":0.02302,"74":0,"75":0,"76":0.01151,"77":0.12083,"78":0,"79":0.02302,"80":0.02877,"81":0.02302,"82":0.00575,"83":0.01151,"84":0.01151,"85":0.06329,"86":0.02302,"87":0.01151,"88":0.00575,"89":0.00575,"90":0.00575,"91":0,"92":0.00575,"93":0.00575,"94":0.01726,"95":0.63869,"96":0.00575,"97":0,"98":0.01151,"99":0.02877,"100":0.16687,"101":1.1508,"102":1.27739,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.02302},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.01151,"18":0.00575,"79":0,"80":0,"81":0,"83":0.02302,"84":0,"85":0.00575,"86":0,"87":0.00575,"88":0,"89":0,"90":0.02302,"91":0,"92":0.00575,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.02302,"103":0.00575,"104":0.00575,"105":0,"106":0.00575,"107":0.02302,"108":0.00575,"109":0.04028,"110":0.00575,"111":0.12659,"112":0.00575,"113":0.00575,"114":0.00575,"115":0.02302,"116":0.51786,"117":0.37976},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.01726,"15":0.00575,_:"0","3.1":0,"3.2":0,"5.1":0.01151,"6.1":0,"7.1":0,"9.1":0.04028,"10.1":0,"11.1":0,"12.1":0.00575,"13.1":0.01726,"14.1":0.06329,"15.1":0.01151,"15.2-15.3":0.00575,"15.4":0.01151,"15.5":0.02877,"15.6":0.0748,"16.0":0.00575,"16.1":0.02877,"16.2":0.01726,"16.3":0.04028,"16.4":0.02302,"16.5":0.0748,"16.6":0.4258,"17.0":0.05179,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00443,"5.0-5.1":0.00222,"6.0-6.1":0,"7.0-7.1":0.00887,"8.1-8.4":0.00665,"9.0-9.2":0.0133,"9.3":0.04878,"10.0-10.2":0,"10.3":0.03326,"11.0-11.2":0.02439,"11.3-11.4":0.01996,"12.0-12.1":0.01109,"12.2-12.5":0.19957,"13.0-13.1":0.00665,"13.2":0.00887,"13.3":7.19342,"13.4-13.7":0.051,"14.0-14.4":0.11753,"14.5-14.8":0.21509,"15.0-15.1":0.10866,"15.2-15.3":0.0887,"15.4":0.08205,"15.5":0.11087,"15.6-15.7":1.27282,"16.0":0.6475,"16.1":0.81381,"16.2":0.4568,"16.3":0.7362,"16.4":0.16853,"16.5":0.46567,"16.6":7.54822,"17.0":1.53891,"17.1":0.00443},P:{"4":0.05308,"20":0.04246,"21":0.06369,"22":0.92351,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.02123,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0.01062,"14.0":0.01062,"15.0":0,"16.0":0.01062,"17.0":0.01062,"18.0":0.02123,"19.0":0.02123},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00461,"4.2-4.3":0.02306,"4.4":0,"4.4.3-4.4.4":0.08534},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00575,"9":0.00575,"10":0,"11":0.11508,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":39.39489},R:{_:"0"},M:{"0":0.3142},Q:{"13.1":0},O:{"0":0.30571},H:{"0":1.01702}};
    +module.exports={C:{"44":0.00608,"45":0.00608,"48":4.3497,"50":0.03645,"52":0.29768,"53":0.01215,"55":0.00608,"56":0.0972,"60":0.00608,"67":0.00608,"68":0.0243,"69":0.00608,"72":0.00608,"75":0.0243,"78":0.01215,"80":0.00608,"81":0.00608,"82":0.00608,"83":0.01215,"88":0.00608,"91":0.01215,"98":0.00608,"99":0.01215,"100":0.00608,"101":0.00608,"102":0.01823,"103":0.01823,"104":0.0243,"105":0.03645,"106":0.06683,"107":0.06075,"108":0.04253,"109":0.06683,"110":0.05468,"111":0.08505,"112":0.01215,"113":0.03038,"114":0.01215,"115":0.88088,"116":0.00608,"117":0.01823,"118":0.0729,"119":1.28183,"120":0.43133,"121":0.00608,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 46 47 49 51 54 57 58 59 61 62 63 64 65 66 70 71 73 74 76 77 79 84 85 86 87 89 90 92 93 94 95 96 97 122 123 3.5 3.6"},D:{"38":0.00608,"39":0.00608,"41":0.01215,"42":0.00608,"48":0.03038,"49":0.07898,"55":0.00608,"56":0.00608,"57":0.00608,"58":0.00608,"61":0.01215,"63":0.01215,"64":0.00608,"65":0.00608,"66":0.00608,"67":0.00608,"68":0.00608,"69":0.00608,"70":0.01215,"71":0.01823,"72":0.00608,"73":0.01823,"74":0.01823,"75":0.01215,"76":0.00608,"77":0.01215,"78":0.01823,"79":0.06683,"80":0.0243,"81":0.04253,"83":0.03038,"84":0.01823,"85":0.10935,"86":0.0972,"87":0.0729,"88":0.01215,"89":0.01215,"90":0.01823,"91":0.00608,"92":0.0243,"93":0.01823,"94":0.01215,"95":0.0243,"96":0.04253,"97":0.06683,"98":0.0243,"99":0.03038,"100":0.03038,"101":0.03038,"102":0.17618,"103":0.08505,"104":0.07898,"105":0.17618,"106":0.58928,"107":0.729,"108":0.9477,"109":4.92075,"110":0.486,"111":0.56498,"112":0.6075,"113":0.06075,"114":0.11543,"115":0.06683,"116":0.24908,"117":0.43133,"118":5.03618,"119":20.89193,"120":0.01215,"121":0.03038,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 40 43 44 45 46 47 50 51 52 53 54 59 60 62 122"},F:{"36":0.0243,"46":0.00608,"65":0.00608,"69":0.00608,"70":0.00608,"75":0.00608,"76":0.00608,"77":0.00608,"79":0.04253,"80":0.01215,"82":0.00608,"83":0.01823,"84":0.0243,"85":0.06683,"86":0.0243,"87":0.01823,"88":0.00608,"89":0.00608,"90":0.01215,"91":0.01823,"92":0.03645,"93":0.04253,"94":0.06683,"95":1.00238,"96":0.01215,"97":0.00608,"98":0.00608,"99":0.00608,"100":0.00608,"101":0.01215,"102":0.75938,"103":0.729,"104":2.58795,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 66 67 68 71 72 73 74 78 81 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.10935},B:{"12":0.01215,"14":0.00608,"17":0.00608,"18":0.01215,"85":0.00608,"90":0.00608,"92":0.01823,"101":0.00608,"103":0.0243,"104":0.00608,"105":0.01215,"106":0.06683,"107":0.09113,"108":0.12758,"109":0.1458,"110":0.10328,"111":0.05468,"112":0.0243,"113":0.00608,"114":0.00608,"115":0.00608,"116":0.0243,"117":0.03038,"118":0.2187,"119":2.46645,_:"13 15 16 79 80 81 83 84 86 87 88 89 91 93 94 95 96 97 98 99 100 102"},E:{"9":0.00608,"14":0.01823,"15":0.00608,_:"0 4 5 6 7 8 10 11 12 13 3.1 3.2 6.1 7.1 10.1 11.1","5.1":0.01823,"9.1":0.01215,"12.1":0.00608,"13.1":0.03038,"14.1":0.04253,"15.1":0.01215,"15.2-15.3":0.00608,"15.4":0.01215,"15.5":0.01823,"15.6":0.16403,"16.0":0.03038,"16.1":0.04253,"16.2":0.03038,"16.3":0.06683,"16.4":0.03038,"16.5":0.0729,"16.6":0.30983,"17.0":0.18833,"17.1":0.2916,"17.2":0.01215},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00195,"5.0-5.1":0.00195,"6.0-6.1":0.00487,"7.0-7.1":0.00682,"8.1-8.4":0.00097,"9.0-9.2":0.0078,"9.3":0.02436,"10.0-10.2":0.00195,"10.3":0.03508,"11.0-11.2":0.01657,"11.3-11.4":0.01462,"12.0-12.1":0.00877,"12.2-12.5":0.15983,"13.0-13.1":0.0039,"13.2":0.01657,"13.3":0.00975,"13.4-13.7":0.02826,"14.0-14.4":0.07504,"14.5-14.8":0.12182,"15.0-15.1":0.04775,"15.2-15.3":0.05847,"15.4":0.0653,"15.5":0.09161,"15.6-15.7":0.48144,"16.0":0.2261,"16.1":0.45318,"16.2":0.21733,"16.3":0.40737,"16.4":0.08381,"16.5":0.21636,"16.6-16.7":3.66734,"17.0":1.09835,"17.1":1.84488,"17.2":0.05263},P:{"4":0.03209,"20":0.03209,"21":0.03209,"22":0.08559,"23":0.87725,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 12.0 14.0","7.2-7.4":0.03209,"11.1-11.2":0.0107,"13.0":0.0107,"15.0":0.0107,"16.0":0.0107,"17.0":0.0214,"18.0":0.0214,"19.0":0.03209},I:{"0":0.03124,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.00009},K:{"0":1.15358,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.01886,"9":0.00629,"10":0.01258,"11":0.3207,_:"6 7 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.23943},H:{"0":0.02},L:{"0":26.29805},R:{_:"0"},M:{"0":0.16485},Q:{"13.1":0.00393}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/UG.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/UG.js
    index 72130806b3510a..c73978d91004c9 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/UG.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/UG.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0.00246,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00246,"57":0,"58":0,"59":0,"60":0.00246,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00246,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00246,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00985,"103":0,"104":0.00246,"105":0.00246,"106":0.00246,"107":0,"108":0,"109":0,"110":0.00246,"111":0.00246,"112":0.00246,"113":0.00493,"114":0.00493,"115":0.09113,"116":0.03941,"117":0.2931,"118":0.0468,"119":0.00246,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00246,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00246,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00246,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0.00246,"65":0,"66":0,"67":0,"68":0.00246,"69":0.00246,"70":0.00246,"71":0.00739,"72":0.00493,"73":0,"74":0.00246,"75":0,"76":0.00246,"77":0,"78":0.00246,"79":0.00246,"80":0.00246,"81":0.00739,"83":0.00246,"84":0,"85":0,"86":0.00246,"87":0.00493,"88":0.00246,"89":0.00246,"90":0,"91":0.00246,"92":0.00246,"93":0.00246,"94":0.00246,"95":0.00739,"96":0.00246,"97":0.00739,"98":0.00246,"99":0.00246,"100":0.00246,"101":0,"102":0.00246,"103":0.01232,"104":0.00246,"105":0.00493,"106":0.00493,"107":0.00246,"108":0.00493,"109":0.27093,"110":0.00246,"111":0.00493,"112":0.00985,"113":0.00985,"114":0.0468,"115":0.04926,"116":1.7044,"117":0.41378,"118":0.00246,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0.00246,"25":0,"26":0,"27":0,"28":0.00246,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.05419,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00246,"48":0,"49":0,"50":0.00246,"51":0,"52":0,"53":0,"54":0.00246,"55":0,"56":0,"57":0.00985,"58":0.00493,"60":0.02463,"62":0,"63":0.04433,"64":0.0197,"65":0.00739,"66":0.02709,"67":0.0197,"68":0.01478,"69":0.17734,"70":0.11084,"71":0.15763,"72":0.39162,"73":0.07389,"74":0.06158,"75":0.00246,"76":0.00739,"77":0.03448,"78":0.00246,"79":0.00246,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00739,"96":0,"97":0,"98":0,"99":0.00246,"100":0.00246,"101":0.0468,"102":0.06158,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00739},B:{"12":0.00246,"13":0,"14":0.00246,"15":0.00246,"16":0,"17":0,"18":0.00985,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.00246,"91":0,"92":0.00493,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00246,"110":0,"111":0.00246,"112":0.00246,"113":0.00246,"114":0.00985,"115":0.01724,"116":0.20936,"117":0.11822},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00246,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00493,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00493,"14.1":0.00739,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.00246,"15.6":0.00493,"16.0":0,"16.1":0.00246,"16.2":0.00246,"16.3":0.00985,"16.4":0,"16.5":0.00739,"16.6":0.0197,"17.0":0.00246,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00198,"6.0-6.1":0.00148,"7.0-7.1":0.04052,"8.1-8.4":0,"9.0-9.2":0.00198,"9.3":0.04743,"10.0-10.2":0,"10.3":0.03656,"11.0-11.2":0.00296,"11.3-11.4":0.00148,"12.0-12.1":0.00791,"12.2-12.5":0.32165,"13.0-13.1":0.00593,"13.2":0.00346,"13.3":0.00988,"13.4-13.7":0.01927,"14.0-14.4":0.15119,"14.5-14.8":0.20604,"15.0-15.1":0.08597,"15.2-15.3":0.08993,"15.4":0.0583,"15.5":0.08647,"15.6-15.7":0.77968,"16.0":0.18776,"16.1":0.22531,"16.2":0.14872,"16.3":0.26829,"16.4":0.14477,"16.5":0.39182,"16.6":1.28316,"17.0":0.29942,"17.1":0},P:{"4":0.08274,"20":0.0724,"21":0.13446,"22":0.55851,"5.0-5.4":0.01034,"6.2-6.4":0,"7.2-7.4":0.11377,"8.2":0,"9.2":0.12411,"10.1":0,"11.1-11.2":0.03103,"12.0":0.04137,"13.0":0.01034,"14.0":0.02069,"15.0":0.02069,"16.0":0.04137,"17.0":0.04137,"18.0":0.02069,"19.0":0.09308},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00187,"4.2-4.3":0.00467,"4.4":0,"4.4.3-4.4.4":0.07563},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00493,"5.5":0},S:{"2.5":0.41454,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":68.04054},R:{_:"0"},M:{"0":0.15074},Q:{"13.1":0},O:{"0":0.54266},H:{"0":14.9347}};
    +module.exports={C:{"47":0.0021,"50":0.01886,"52":0.00419,"53":0.0021,"55":0.00419,"56":0.00419,"58":0.0021,"59":0.0021,"60":0.00419,"62":0.0021,"64":0.0021,"66":0.0021,"67":0.0021,"68":0.0021,"72":0.00629,"78":0.00629,"87":0.00629,"91":0.00419,"93":0.00838,"99":0.0021,"100":0.0021,"102":0.0021,"106":0.00419,"107":0.0021,"108":0.0021,"110":0.0021,"111":0.0021,"112":0.00419,"113":0.0021,"114":0.00419,"115":0.48185,"116":0.00629,"117":0.01048,"118":0.04819,"119":1.15016,"120":0.34149,"121":0.01676,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 48 49 51 54 57 61 63 65 69 70 71 73 74 75 76 77 79 80 81 82 83 84 85 86 88 89 90 92 94 95 96 97 98 101 103 104 105 109 122 123 3.5 3.6"},D:{"11":0.0021,"19":0.00838,"24":0.00419,"29":0.0021,"39":0.0021,"41":0.00838,"43":0.0021,"47":0.0021,"49":0.01048,"50":0.00419,"54":0.0021,"55":0.0021,"56":0.0021,"58":0.0021,"59":0.00419,"61":0.0021,"62":0.0021,"63":0.0021,"64":0.02514,"65":0.0021,"66":0.00419,"67":0.0021,"68":0.01048,"69":0.01048,"70":0.00629,"71":0.0021,"72":0.01886,"73":0.00419,"74":0.00419,"75":0.00419,"76":0.00419,"77":0.0021,"78":0.0021,"79":0.00838,"80":0.00419,"81":0.00419,"83":0.02095,"84":0.0021,"86":0.00629,"87":0.01676,"88":0.01676,"89":0.0021,"90":0.00419,"91":0.00419,"92":0.0021,"93":0.08799,"94":0.01886,"95":0.02514,"96":0.0021,"97":0.0021,"98":0.00629,"99":0.00838,"100":0.00629,"101":0.0021,"102":0.01257,"103":0.05657,"104":0.01048,"105":0.01467,"106":0.01886,"107":0.02305,"108":0.01886,"109":1.09359,"110":0.00629,"111":0.01886,"112":0.01676,"113":0.0419,"114":0.05866,"115":0.044,"116":0.14665,"117":0.18017,"118":1.88131,"119":6.69143,"120":0.00838,"121":0.00419,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 20 21 22 23 25 26 27 28 30 31 32 33 34 35 36 37 38 40 42 44 45 46 48 51 52 53 57 60 85 122"},F:{"37":0.0021,"42":0.0021,"56":0.0021,"60":0.0021,"68":0.0021,"77":0.0021,"78":0.0021,"79":0.00419,"85":0.0021,"95":0.02933,"99":0.0021,"101":0.00419,"102":0.02933,"103":0.08799,"104":0.25559,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 38 39 40 41 43 44 45 46 47 48 49 50 51 52 53 54 55 57 58 62 63 64 65 66 67 69 70 71 72 73 74 75 76 80 81 82 83 84 86 87 88 89 90 91 92 93 94 96 97 98 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.01048,"13":0.00629,"14":0.00838,"15":0.00629,"16":0.0021,"17":0.0021,"18":0.04609,"84":0.00629,"89":0.00629,"90":0.01048,"92":0.02305,"100":0.00419,"107":0.0021,"108":0.0021,"109":0.02933,"110":0.0021,"111":0.00419,"112":0.00419,"113":0.00419,"114":0.01886,"115":0.00838,"116":0.01467,"117":0.03143,"118":0.25978,"119":1.0496,_:"79 80 81 83 85 86 87 88 91 93 94 95 96 97 98 99 101 102 103 104 105 106"},E:{"12":0.0021,"13":0.0021,"14":0.00629,_:"0 4 5 6 7 8 9 10 11 15 3.1 3.2 6.1 7.1 9.1 10.1","5.1":0.01467,"11.1":0.0021,"12.1":0.00419,"13.1":0.01467,"14.1":0.01886,"15.1":0.00419,"15.2-15.3":0.00419,"15.4":0.0021,"15.5":0.00419,"15.6":0.01886,"16.0":0.00419,"16.1":0.0021,"16.2":0.00419,"16.3":0.01676,"16.4":0.01886,"16.5":0.01257,"16.6":0.02933,"17.0":0.02514,"17.1":0.03352,"17.2":0.0021},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00068,"5.0-5.1":0.00068,"6.0-6.1":0.0017,"7.0-7.1":0.00238,"8.1-8.4":0.00034,"9.0-9.2":0.00272,"9.3":0.0085,"10.0-10.2":0.00068,"10.3":0.01224,"11.0-11.2":0.00578,"11.3-11.4":0.0051,"12.0-12.1":0.00306,"12.2-12.5":0.05575,"13.0-13.1":0.00136,"13.2":0.00578,"13.3":0.0034,"13.4-13.7":0.00986,"14.0-14.4":0.02617,"14.5-14.8":0.04249,"15.0-15.1":0.01666,"15.2-15.3":0.02039,"15.4":0.02277,"15.5":0.03195,"15.6-15.7":0.16792,"16.0":0.07886,"16.1":0.15806,"16.2":0.0758,"16.3":0.14208,"16.4":0.02923,"16.5":0.07546,"16.6-16.7":1.2791,"17.0":0.38308,"17.1":0.64346,"17.2":0.01836},P:{"4":0.09454,"20":0.05252,"21":0.09454,"22":0.28361,"23":0.48318,"5.0-5.4":0.02101,_:"6.2-6.4 8.2 10.1","7.2-7.4":0.11554,"9.2":0.13655,"11.1-11.2":0.03151,"12.0":0.0105,"13.0":0.0105,"14.0":0.0105,"15.0":0.02101,"16.0":0.03151,"17.0":0.02101,"18.0":0.02101,"19.0":0.09454},I:{"0":0.05506,"3":0.00001,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00004,"4.4":0,"4.4.3-4.4.4":0.00017},K:{"0":6.30903,_:"10 11 12 11.1 11.5 12.1"},A:{"10":0.00533,"11":0.024,_:"6 7 8 9 5.5"},N:{_:"10 11"},S:{"2.5":0.39525,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.45059},H:{"0":8.75},L:{"0":63.24406},R:{_:"0"},M:{"0":0.12648},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/US.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/US.js
    index 20d72213fb7dde..88eef1e41ec741 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/US.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/US.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0.00689,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.02066,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00689,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0.00689,"45":0,"46":0,"47":0,"48":0.02066,"49":0,"50":0.00689,"51":0,"52":0.02066,"53":0.00689,"54":0.00689,"55":0,"56":0.00689,"57":0.00689,"58":0,"59":0.00689,"60":0,"61":0,"62":0,"63":0.00689,"64":0,"65":0.00689,"66":0,"67":0,"68":0.00689,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.00689,"78":0.06198,"79":0,"80":0,"81":0,"82":0,"83":0.00689,"84":0,"85":0,"86":0,"87":0,"88":0.00689,"89":0.00689,"90":0,"91":0.00689,"92":0,"93":0,"94":0.01377,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.00689,"102":0.08264,"103":0,"104":0,"105":0.00689,"106":0,"107":0,"108":0.00689,"109":0.00689,"110":0.00689,"111":0.01377,"112":0.14463,"113":0.01377,"114":0.02066,"115":0.18595,"116":0.12397,"117":1.29476,"118":0.08953,"119":0,"120":0,"3.5":0,"3.6":0.00689},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0.00689,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00689,"48":0.02066,"49":0.02755,"50":0,"51":0.00689,"52":0,"53":0,"54":0,"55":0,"56":0.06887,"57":0,"58":0.01377,"59":0,"60":0,"61":0,"62":0.00689,"63":0.00689,"64":0,"65":0.02755,"66":0.01377,"67":0.00689,"68":0.06198,"69":0.0551,"70":0.04821,"71":0.04132,"72":0.06198,"73":0.02066,"74":0.07576,"75":0.06887,"76":0.24105,"77":0.0551,"78":0.06887,"79":0.28237,"80":0.12397,"81":0.10331,"83":0.2135,"84":0.06887,"85":0.14463,"86":0.14463,"87":0.13085,"88":0.10331,"89":0.07576,"90":0.10331,"91":0.07576,"92":0.02066,"93":0.26171,"94":0.01377,"95":0.01377,"96":0.02066,"97":0.02066,"98":0.02755,"99":0.02755,"100":0.03444,"101":0.04132,"102":0.04132,"103":0.35124,"104":0.04821,"105":0.04821,"106":0.03444,"107":0.3168,"108":0.38567,"109":0.80578,"110":0.37879,"111":0.68181,"112":0.43388,"113":0.18595,"114":1.39117,"115":2.62395,"116":13.26436,"117":3.00273,"118":0.02066,"119":0.02755,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00689,"54":0.00689,"55":0.01377,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00689,"73":0.00689,"74":0,"75":0,"76":0.00689,"77":0.02066,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00689,"86":0,"87":0,"88":0,"89":0.01377,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.02066,"96":0,"97":0.28925,"98":0.00689,"99":0.04132,"100":0.43388,"101":0.77823,"102":0.57851,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0.00689,"13":0,"14":0,"15":0.00689,"16":0,"17":0,"18":0.00689,"79":0.00689,"80":0.01377,"81":0.01377,"83":0.02066,"84":0.02066,"85":0.00689,"86":0.01377,"87":0.01377,"88":0.00689,"89":0.01377,"90":0.01377,"91":0,"92":0.00689,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.03444,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00689,"108":0.00689,"109":0.0551,"110":0.00689,"111":0.29614,"112":0.29614,"113":0.01377,"114":0.33746,"115":0.15151,"116":2.5964,"117":1.46693},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0.00689,"10":0,"11":0,"12":0.00689,"13":0.02755,"14":0.15151,"15":0.02755,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.41322,"10.1":0,"11.1":0.00689,"12.1":0.04132,"13.1":0.22727,"14.1":0.39945,"15.1":0.06887,"15.2-15.3":0.06198,"15.4":0.11019,"15.5":0.17906,"15.6":0.9022,"16.0":0.12397,"16.1":0.27548,"16.2":0.27548,"16.3":0.61294,"16.4":0.35124,"16.5":0.75068,"16.6":3.98069,"17.0":0.12397,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0.0143,"7.0-7.1":0.00572,"8.1-8.4":0.00286,"9.0-9.2":0.0143,"9.3":0.04004,"10.0-10.2":0,"10.3":0.05148,"11.0-11.2":0.0286,"11.3-11.4":0.02288,"12.0-12.1":0.01716,"12.2-12.5":0.22308,"13.0-13.1":0.00858,"13.2":0.00858,"13.3":0.0286,"13.4-13.7":0.05148,"14.0-14.4":0.14872,"14.5-14.8":0.25168,"15.0-15.1":0.09724,"15.2-15.3":0.1287,"15.4":0.13156,"15.5":0.21164,"15.6-15.7":1.38994,"16.0":0.61489,"16.1":1.49576,"16.2":0.70355,"16.3":1.28984,"16.4":0.19734,"16.5":0.69497,"16.6":19.25892,"17.0":1.15828,"17.1":0.00572},P:{"4":0.0215,"20":0.0215,"21":0.05374,"22":0.8491,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0.01075,"14.0":0,"15.0":0,"16.0":0.0215,"17.0":0.01075,"18.0":0.01075,"19.0":0.0215},I:{"0":0,"3":0.03104,"4":0.03991,"2.1":0.0133,"2.2":0.04435,"2.3":0.0133,"4.1":0.02217,"4.2-4.3":0.13748,"4.4":0,"4.4.3-4.4.4":0.13305},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00814,"9":0.01628,"10":0,"11":0.06511,"5.5":0},S:{"2.5":0.00311,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0.01868},L:{"0":21.4041},R:{_:"0"},M:{"0":0.29574},Q:{"13.1":0.01245},O:{"0":0.05292},H:{"0":0.18862}};
    +module.exports={C:{"3":0.00685,"4":0.00685,"7":0.00685,"11":0.09593,"38":0.00685,"40":0.00685,"43":0.00685,"44":0.02056,"45":0.00685,"47":0.00685,"48":0.02056,"50":0.0137,"51":0.00685,"52":0.05482,"53":0.00685,"54":0.0137,"55":0.00685,"56":0.0137,"57":0.0137,"58":0.0137,"59":0.02056,"60":0.0137,"61":0.0137,"62":0.00685,"63":0.0137,"64":0.00685,"65":0.00685,"66":0.00685,"67":0.00685,"68":0.0137,"70":0.00685,"72":0.00685,"73":0.00685,"74":0.00685,"76":0.00685,"77":0.0137,"78":0.06167,"79":0.00685,"80":0.00685,"81":0.00685,"83":0.0137,"88":0.00685,"89":0.00685,"91":0.00685,"94":0.0137,"99":0.00685,"101":0.02056,"102":0.02056,"105":0.00685,"106":0.00685,"107":0.00685,"108":0.00685,"109":0.0137,"110":0.00685,"111":0.00685,"112":0.0137,"113":0.02741,"114":0.04796,"115":0.31519,"116":0.02741,"117":0.02741,"118":0.32204,"119":1.92541,"120":0.38371,_:"2 5 6 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 41 42 46 49 69 71 75 82 84 85 86 87 90 92 93 95 96 97 98 100 103 104 121 122 123","3.5":0.00685,"3.6":0.00685},D:{"4":0.00685,"5":0.00685,"10":0.00685,"31":0.00685,"36":0.00685,"37":0.00685,"39":0.00685,"41":0.0137,"42":0.00685,"43":0.00685,"44":0.00685,"45":0.00685,"46":0.00685,"47":0.0137,"48":0.04796,"49":0.04111,"50":0.00685,"51":0.0137,"52":0.00685,"53":0.00685,"54":0.00685,"55":0.00685,"56":0.08908,"57":0.00685,"58":0.00685,"59":0.00685,"60":0.0137,"61":0.03426,"62":0.00685,"63":0.0137,"64":0.0137,"65":0.0137,"66":0.0137,"67":0.00685,"68":0.04796,"69":0.06167,"70":0.05482,"71":0.02741,"72":0.05482,"73":0.02056,"74":0.06167,"75":0.05482,"76":0.20556,"77":0.04796,"78":0.05482,"79":0.19186,"80":0.15074,"81":0.11648,"83":0.07537,"84":0.06852,"85":0.08908,"86":0.12334,"87":0.13704,"88":0.06852,"89":0.06167,"90":0.08908,"91":0.10278,"92":0.03426,"93":0.3563,"94":0.03426,"95":0.0137,"96":0.02056,"97":0.03426,"98":0.03426,"99":0.03426,"100":0.06167,"101":0.11648,"102":0.05482,"103":1.20595,"104":0.06852,"105":0.06852,"106":0.05482,"107":0.06167,"108":0.1576,"109":1.21966,"110":0.19186,"111":0.14389,"112":0.24667,"113":0.26723,"114":0.41797,"115":0.32204,"116":1.06891,"117":1.49374,"118":9.35298,"119":16.1159,"120":0.03426,"121":0.03426,_:"6 7 8 9 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 33 34 35 38 40 122"},F:{"20":0.00685,"43":0.00685,"47":0.00685,"49":0.00685,"53":0.00685,"54":0.0137,"55":0.0137,"56":0.00685,"67":0.00685,"68":0.00685,"89":0.00685,"92":0.00685,"95":0.04796,"98":0.00685,"99":0.0137,"100":0.0137,"101":0.0137,"102":2.35024,"103":0.29464,"104":1.13743,_:"9 11 12 15 16 17 18 19 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 44 45 46 48 50 51 52 57 58 60 62 63 64 65 66 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 90 91 93 94 96 97 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.00685},B:{"12":0.0137,"13":0.00685,"14":0.00685,"15":0.00685,"16":0.00685,"17":0.00685,"18":0.0137,"79":0.00685,"80":0.0137,"81":0.0137,"83":0.0137,"84":0.0137,"85":0.0137,"86":0.0137,"87":0.8565,"88":0.0137,"89":0.00685,"90":0.00685,"92":0.02741,"99":0.06167,"100":0.00685,"103":0.00685,"104":0.00685,"105":0.00685,"106":0.00685,"107":0.00685,"108":0.0137,"109":0.13019,"110":0.02056,"111":0.02056,"112":0.02056,"113":0.02056,"114":0.02741,"115":0.04111,"116":0.05482,"117":1.54855,"118":1.26762,"119":4.56343,_:"91 93 94 95 96 97 98 101 102"},E:{"4":0.00685,"5":0.00685,"8":0.00685,"9":0.00685,"10":0.00685,"11":0.00685,"12":0.0137,"13":0.03426,"14":0.20556,"15":0.04111,_:"0 6 7 3.1 3.2 6.1 7.1","5.1":0.00685,"9.1":0.24667,"10.1":0.00685,"11.1":0.00685,"12.1":0.05482,"13.1":0.28093,"14.1":0.48649,"15.1":0.11648,"15.2-15.3":0.06852,"15.4":0.1576,"15.5":0.26038,"15.6":1.27447,"16.0":0.185,"16.1":0.49334,"16.2":0.47279,"16.3":1.00724,"16.4":0.39056,"16.5":0.78798,"16.6":5.55012,"17.0":1.06206,"17.1":1.34984,"17.2":0.03426},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00332,"5.0-5.1":0.00332,"6.0-6.1":0.0083,"7.0-7.1":0.01162,"8.1-8.4":0.00166,"9.0-9.2":0.01328,"9.3":0.04149,"10.0-10.2":0.00332,"10.3":0.05974,"11.0-11.2":0.02821,"11.3-11.4":0.02489,"12.0-12.1":0.01493,"12.2-12.5":0.27214,"13.0-13.1":0.00664,"13.2":0.02821,"13.3":0.01659,"13.4-13.7":0.04812,"14.0-14.4":0.12777,"14.5-14.8":0.20743,"15.0-15.1":0.08131,"15.2-15.3":0.09956,"15.4":0.11118,"15.5":0.15598,"15.6-15.7":0.81975,"16.0":0.38498,"16.1":0.77163,"16.2":0.37005,"16.3":0.69363,"16.4":0.14271,"16.5":0.36839,"16.6-16.7":6.24437,"17.0":1.87016,"17.1":3.14127,"17.2":0.08961},P:{"4":0.0326,"20":0.02173,"21":0.05433,"22":0.0978,"23":1.01059,_:"5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0","16.0":0.02173,"17.0":0.01087,"18.0":0.01087,"19.0":0.01087},I:{"0":0.11899,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00008,"4.4":0,"4.4.3-4.4.4":0.00036},K:{"0":0.22658,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00814,"9":0.02441,"11":0.09764,_:"6 7 10 5.5"},N:{_:"10 11"},S:{"2.5":0.00315,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.05979},H:{"0":0},L:{"0":13.15855},R:{_:"0"},M:{"0":0.32414},Q:{"13.1":0.01574}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/UY.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/UY.js
    index 398f60dc71b547..1c92144616c7f0 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/UY.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/UY.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0.00499,"51":0,"52":0.01497,"53":0,"54":0,"55":0,"56":0,"57":0.00499,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00499,"66":0.00998,"67":0,"68":0.00499,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0.00499,"75":0,"76":0,"77":0,"78":0.00499,"79":0,"80":0,"81":0,"82":0,"83":0.00499,"84":0,"85":0,"86":0.00499,"87":0,"88":0.00998,"89":0,"90":0,"91":0.00499,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00499,"101":0,"102":0.02995,"103":0,"104":0.00499,"105":0.01996,"106":0.00499,"107":0.00998,"108":0,"109":0.00499,"110":0.00499,"111":0.00499,"112":0.00499,"113":0.01996,"114":0.01996,"115":0.16969,"116":0.06488,"117":0.67379,"118":0.10481,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.05989,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0.00499,"48":0,"49":0.03494,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.00499,"56":0.00499,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0.00499,"63":0.00499,"64":0,"65":0.00499,"66":0,"67":0,"68":0.00998,"69":0,"70":0.00499,"71":0.00998,"72":0.00499,"73":0.01996,"74":0.02496,"75":0.01996,"76":0.02496,"77":0.00998,"78":0.00499,"79":0.02496,"80":0.05989,"81":0.00499,"83":0.01497,"84":0.00499,"85":0.00998,"86":0.18467,"87":0.00998,"88":0.00998,"89":0.00998,"90":0.01996,"91":0.02995,"92":0.00499,"93":0.02496,"94":0.00998,"95":0.00499,"96":0.01996,"97":0.00499,"98":0.00998,"99":0.00998,"100":0.00499,"101":0.00998,"102":0.00998,"103":0.05989,"104":0.00499,"105":0.01996,"106":0.03494,"107":0.01497,"108":0.03993,"109":1.40746,"110":0.01497,"111":0.01996,"112":0.02995,"113":0.03993,"114":0.1647,"115":0.33939,"116":11.18483,"117":3.78817,"118":0.00499,"119":0.00499,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00998,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00499,"73":0,"74":0,"75":0,"76":0,"77":0.00998,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00499,"86":0,"87":0,"88":0,"89":0.00998,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.02995,"96":0,"97":0,"98":0,"99":0.00998,"100":0.24955,"101":0.52905,"102":0.89339,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00499,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.00499,"90":0,"91":0,"92":0.00998,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0.00499,"104":0,"105":0,"106":0,"107":0,"108":0.00499,"109":0.07487,"110":0,"111":0,"112":0.00499,"113":0.00499,"114":0.01996,"115":0.03993,"116":0.90836,"117":0.87842},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.01497,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.01497,"10.1":0,"11.1":0,"12.1":0.00499,"13.1":0.02496,"14.1":0.01996,"15.1":0.01996,"15.2-15.3":0,"15.4":0.00998,"15.5":0.01497,"15.6":0.03494,"16.0":0.00499,"16.1":0.01497,"16.2":0.00998,"16.3":0.03494,"16.4":0.02995,"16.5":0.0549,"16.6":0.2246,"17.0":0.01497,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.02993,"6.0-6.1":0,"7.0-7.1":0.01822,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.03124,"10.0-10.2":0,"10.3":0.02213,"11.0-11.2":0.01692,"11.3-11.4":0.00521,"12.0-12.1":0.0039,"12.2-12.5":0.15488,"13.0-13.1":0.0026,"13.2":0.0026,"13.3":0.12624,"13.4-13.7":0.01822,"14.0-14.4":0.05206,"14.5-14.8":0.14577,"15.0-15.1":0.01822,"15.2-15.3":0.02213,"15.4":0.09891,"15.5":0.13405,"15.6-15.7":1.04379,"16.0":0.40997,"16.1":0.51929,"16.2":0.31886,"16.3":0.58697,"16.4":0.0846,"16.5":0.37352,"16.6":7.7412,"17.0":0.7913,"17.1":0.0026},P:{"4":0.03135,"20":0.03135,"21":0.16721,"22":1.18095,"5.0-5.4":0.01045,"6.2-6.4":0,"7.2-7.4":0.14631,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01045,"12.0":0,"13.0":0.01045,"14.0":0,"15.0":0,"16.0":0.03135,"17.0":0.0209,"18.0":0.01045,"19.0":0.0418},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.01851,"4.2-4.3":0.06477,"4.4":0,"4.4.3-4.4.4":0.16656},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00499,"9":0,"10":0,"11":0.02995,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":60.15025},R:{_:"0"},M:{"0":0.20537},Q:{"13.1":0},O:{"0":0.02004},H:{"0":0.16123}};
    +module.exports={C:{"45":0.00476,"50":0.00476,"52":0.02855,"57":0.00952,"60":0.00476,"63":0.00952,"65":0.00476,"66":0.01903,"68":0.00476,"78":0.01427,"82":0.00476,"83":0.00952,"88":0.01903,"89":0.00476,"91":0.00476,"99":0.00476,"101":0.00476,"102":0.03331,"103":0.00476,"105":0.00476,"106":0.00476,"107":0.00476,"108":0.00952,"109":0.00476,"110":0.00952,"111":0.02855,"112":0.00952,"113":0.02379,"114":0.02379,"115":0.39016,"116":0.00952,"117":0.01427,"118":0.04282,"119":1.2799,"120":0.35209,"121":0.00952,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 49 51 53 54 55 56 58 59 61 62 64 67 69 70 71 72 73 74 75 76 77 79 80 81 84 85 86 87 90 92 93 94 95 96 97 98 100 104 122 123 3.5 3.6"},D:{"14":0.00476,"38":0.40919,"41":0.00952,"43":0.00476,"44":0.00476,"47":0.00476,"49":0.03806,"55":0.00476,"60":0.00476,"62":0.00476,"63":0.00476,"65":0.00952,"68":0.00476,"69":0.00476,"70":0.00952,"71":0.01427,"72":0.00952,"73":0.02379,"74":0.01903,"75":0.01427,"76":0.00952,"77":0.00952,"78":0.00476,"79":0.03806,"80":0.08089,"81":0.00952,"83":0.01903,"84":0.00476,"85":0.00952,"86":0.30451,"87":0.01427,"88":0.01903,"89":0.00952,"90":0.02379,"91":0.01903,"92":0.00952,"93":0.03806,"94":0.01427,"95":0.00952,"96":0.01427,"97":0.01427,"98":0.00952,"99":0.00952,"100":0.00476,"101":0.01427,"102":0.01427,"103":0.07137,"104":0.00952,"105":0.04282,"106":0.04758,"107":0.00952,"108":0.03806,"109":2.59311,"110":0.01427,"111":0.02379,"112":0.05234,"113":0.03331,"114":0.11419,"115":0.12371,"116":0.24266,"117":0.40919,"118":6.21395,"119":23.49976,"120":0.00952,"121":0.00476,_:"4 5 6 7 8 9 10 11 12 13 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 42 45 46 48 50 51 52 53 54 56 57 58 59 61 64 66 67 122"},F:{"28":0.00476,"46":0.00476,"89":0.0571,"90":0.00476,"95":0.06185,"99":0.00952,"102":1.92699,"103":0.10943,"104":1.53683,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 91 92 93 94 96 97 98 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"17":0.00476,"18":0.00476,"92":0.00952,"109":0.06185,"111":0.01427,"114":0.00952,"115":0.00952,"116":0.00952,"117":0.08564,"118":0.68515,"119":2.95948,_:"12 13 14 15 16 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 112 113"},E:{"9":0.00476,"13":0.00476,"14":0.01903,"15":0.00476,_:"0 4 5 6 7 8 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 17.2","12.1":0.00476,"13.1":0.05234,"14.1":0.03331,"15.1":0.03331,"15.2-15.3":0.00476,"15.4":0.00952,"15.5":0.03331,"15.6":0.09516,"16.0":0.00476,"16.1":0.04282,"16.2":0.03331,"16.3":0.04758,"16.4":0.04758,"16.5":0.06185,"16.6":0.31403,"17.0":0.19032,"17.1":0.22363},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00161,"5.0-5.1":0.00161,"6.0-6.1":0.00401,"7.0-7.1":0.00562,"8.1-8.4":0.0008,"9.0-9.2":0.00642,"9.3":0.02007,"10.0-10.2":0.00161,"10.3":0.0289,"11.0-11.2":0.01365,"11.3-11.4":0.01204,"12.0-12.1":0.00722,"12.2-12.5":0.13164,"13.0-13.1":0.00321,"13.2":0.01365,"13.3":0.00803,"13.4-13.7":0.02328,"14.0-14.4":0.06181,"14.5-14.8":0.10034,"15.0-15.1":0.03933,"15.2-15.3":0.04816,"15.4":0.05378,"15.5":0.07545,"15.6-15.7":0.39654,"16.0":0.18623,"16.1":0.37326,"16.2":0.179,"16.3":0.33553,"16.4":0.06903,"16.5":0.1782,"16.6-16.7":3.02057,"17.0":0.90465,"17.1":1.51952,"17.2":0.04335},P:{"4":0.05166,"20":0.04132,"21":0.14463,"22":0.20662,"23":1.30171,_:"5.0-5.4 6.2-6.4 9.2 10.1","7.2-7.4":0.1653,"8.2":0.01033,"11.1-11.2":0.01033,"12.0":0.01033,"13.0":0.01033,"14.0":0.01033,"15.0":0.01033,"16.0":0.05166,"17.0":0.02066,"18.0":0.01033,"19.0":0.04132},I:{"0":0.14607,"3":0.00001,"4":0.00003,"2.1":0,"2.2":0.00003,"2.3":0,"4.1":0.00001,"4.2-4.3":0.0001,"4.4":0,"4.4.3-4.4.4":0.00044},K:{"0":0.17826,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.01903,"9":0.00476,"10":0.00476,"11":0.07137,_:"6 7 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.02622},H:{"0":0},L:{"0":42.56005},R:{_:"0"},M:{"0":0.23069},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/UZ.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/UZ.js
    index dc4dfcb34e79bc..aaa06a44f66853 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/UZ.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/UZ.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00688,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0.00344,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00688,"73":0,"74":0.00688,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0.03094,"85":0.00344,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.00344,"102":0.02063,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00344,"110":0.00344,"111":0,"112":0.00344,"113":0.00344,"114":0,"115":0.04126,"116":0.02063,"117":0.16159,"118":0.01031,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00344,"47":0,"48":0,"49":0.01031,"50":0,"51":0.02063,"52":0,"53":0.00344,"54":0,"55":0,"56":0.00688,"57":0,"58":0,"59":0,"60":0,"61":0.02063,"62":0,"63":0,"64":0,"65":0,"66":0.00344,"67":0.05157,"68":0,"69":0.00688,"70":0,"71":0.02407,"72":0.01375,"73":0.00344,"74":0.02063,"75":0,"76":0.01031,"77":0.05157,"78":0.03438,"79":0.11689,"80":0.07907,"81":0.05845,"83":0.06876,"84":0.01719,"85":0.02407,"86":0.04126,"87":0.07907,"88":0.0275,"89":0.0722,"90":0.18909,"91":0.00344,"92":0.00688,"93":0.00344,"94":0.00344,"95":0.03782,"96":0.01719,"97":0.00688,"98":0.00344,"99":0.00688,"100":0.01375,"101":0.01719,"102":0.01375,"103":0.0275,"104":0.08939,"105":0.12377,"106":0.06532,"107":0.07564,"108":0.0722,"109":0.81824,"110":0.01719,"111":0.03094,"112":0.03782,"113":0.02063,"114":0.11689,"115":0.06876,"116":3.15265,"117":0.8595,"118":0.00344,"119":0.00344,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00688,"54":0.02407,"55":0,"56":0.00344,"57":0,"58":0,"60":0.02407,"62":0.00344,"63":0.0722,"64":0,"65":0.06188,"66":0,"67":0.01719,"68":0.01719,"69":0,"70":0,"71":0,"72":0.01375,"73":0.08595,"74":0.08939,"75":0.00344,"76":0,"77":0.01719,"78":0,"79":0.00688,"80":0,"81":0,"82":0.00344,"83":0,"84":0,"85":0,"86":0,"87":0.00344,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.00688,"95":0.03094,"96":0,"97":0,"98":0,"99":0.04126,"100":0.01375,"101":0.04813,"102":0.04469,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0.01375,"17":0,"18":0.04813,"79":0,"80":0,"81":0,"83":0,"84":0.00344,"85":0.00688,"86":0,"87":0.03782,"88":0,"89":0.00344,"90":0.08939,"91":0.00688,"92":0.00688,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.01375,"103":0,"104":0,"105":0.00688,"106":0,"107":0.00688,"108":0,"109":0.0275,"110":0.01375,"111":0.06532,"112":0.01375,"113":0.01719,"114":0.01031,"115":0.08595,"116":0.31286,"117":0.22003},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00344,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.19597,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0.00344,"13.1":0.00344,"14.1":0.00688,"15.1":0.00344,"15.2-15.3":0,"15.4":0,"15.5":0.00688,"15.6":0.01375,"16.0":0,"16.1":0.00688,"16.2":0.00344,"16.3":0.02063,"16.4":0.00688,"16.5":0.01031,"16.6":0.05845,"17.0":0.00688,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.01662,"8.1-8.4":0,"9.0-9.2":0.00831,"9.3":0.01454,"10.0-10.2":0,"10.3":0.01869,"11.0-11.2":0.01038,"11.3-11.4":0,"12.0-12.1":0.00415,"12.2-12.5":0.21184,"13.0-13.1":0.00208,"13.2":0,"13.3":12.59639,"13.4-13.7":0.01869,"14.0-14.4":0.04154,"14.5-14.8":0.07685,"15.0-15.1":0.05192,"15.2-15.3":0.04777,"15.4":0.04569,"15.5":0.09346,"15.6-15.7":0.71653,"16.0":0.30115,"16.1":0.35307,"16.2":0.21392,"16.3":0.46523,"16.4":0.20146,"16.5":0.38215,"16.6":3.82773,"17.0":0.94291,"17.1":0},P:{"4":0.32281,"20":0.16141,"21":0.3329,"22":1.73511,"5.0-5.4":0.01009,"6.2-6.4":0.05044,"7.2-7.4":0.21184,"8.2":0,"9.2":0.02018,"10.1":0,"11.1-11.2":0.05044,"12.0":0.01009,"13.0":0.07061,"14.0":0.03026,"15.0":0.02018,"16.0":0.06053,"17.0":0.07061,"18.0":0.06053,"19.0":0.15132},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00387,"4.2-4.3":0.0116,"4.4":0,"4.4.3-4.4.4":0.04485},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0.00352,"9":0,"10":0,"11":0.14079,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":54.88901},R:{_:"0"},M:{"0":0.07218},Q:{"13.1":0.00656},O:{"0":3.76003},H:{"0":0.3976}};
    +module.exports={C:{"40":0.00271,"52":0.02167,"67":0.00271,"68":0.00271,"72":0.00271,"84":0.00271,"96":0.00271,"99":0.00271,"102":0.00271,"103":0.00271,"105":0.00271,"107":0.00271,"110":0.01625,"111":0.00271,"113":0.00542,"114":0.00271,"115":0.17338,"116":0.00542,"117":0.00271,"118":0.01355,"119":0.35759,"120":0.11378,"121":0.00271,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 65 66 69 70 71 73 74 75 76 77 78 79 80 81 82 83 85 86 87 88 89 90 91 92 93 94 95 97 98 100 101 104 106 108 109 112 122 123 3.5 3.6"},D:{"11":0.00271,"26":0.00271,"38":0.00271,"39":0.00271,"40":0.00271,"41":0.01084,"43":0.00271,"44":0.00271,"45":0.00271,"46":0.00271,"47":0.00813,"49":0.02438,"50":0.00271,"51":0.00542,"56":0.01084,"57":0.00271,"59":0.00271,"61":0.00271,"62":0.00271,"64":0.00542,"65":0.00271,"66":0.01084,"68":0.00271,"69":0.00542,"70":0.00271,"71":0.00542,"72":0.00542,"75":0.04064,"76":0.00271,"77":0.00271,"78":0.00542,"79":0.0298,"80":0.00542,"81":0.00271,"83":0.0298,"84":0.00542,"85":0.01896,"86":0.00813,"87":0.01084,"88":0.00542,"89":0.02438,"90":0.00271,"91":0.00271,"92":0.00271,"93":0.00542,"94":0.00271,"95":0.00271,"96":0.01355,"97":0.01355,"98":0.01625,"99":0.00813,"100":0.01355,"101":0.00813,"102":0.0596,"103":0.05689,"104":0.01625,"105":0.01355,"106":0.18692,"107":0.01896,"108":0.03793,"109":2.3189,"110":0.0298,"111":0.03251,"112":0.0298,"113":0.01625,"114":0.09482,"115":0.0298,"116":0.07314,"117":0.16254,"118":2.81465,"119":11.82208,"120":0.01084,"121":0.01625,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 27 28 29 30 31 32 33 34 35 36 37 42 48 52 53 54 55 58 60 63 67 73 74 122"},F:{"28":0.00271,"36":0.00271,"38":0.00813,"46":0.00271,"49":0.00271,"52":0.00271,"53":0.02167,"55":0.00542,"56":0.00542,"57":0.00542,"60":0.00813,"62":0.00271,"79":0.02709,"80":0.00271,"81":0.00271,"82":0.02167,"84":0.00271,"87":0.00271,"90":0.00271,"93":0.01084,"94":0.00271,"95":0.05418,"97":0.00271,"99":0.00271,"100":0.00542,"101":0.04876,"102":0.06773,"103":0.09211,"104":0.17609,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 39 40 41 42 43 44 45 47 48 50 51 54 58 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 83 85 86 88 89 91 92 96 98 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.00271},B:{"12":0.00271,"14":0.00271,"15":0.00271,"16":0.01355,"17":0.01084,"18":0.04334,"84":0.00542,"89":0.00271,"90":0.00271,"92":0.02709,"100":0.00542,"104":0.00271,"105":0.00271,"106":0.00271,"107":0.00271,"108":0.00542,"109":0.0596,"110":0.02167,"111":0.00271,"112":0.00813,"113":0.01625,"114":0.01896,"115":0.01084,"116":0.01355,"117":0.02709,"118":0.28445,"119":1.54955,_:"13 79 80 81 83 85 86 87 88 91 93 94 95 96 97 98 99 101 102 103"},E:{"9":0.00542,"14":0.00542,_:"0 4 5 6 7 8 10 11 12 13 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1 15.2-15.3","5.1":0.31695,"12.1":0.00271,"13.1":0.00542,"14.1":0.01084,"15.1":0.00271,"15.4":0.00542,"15.5":0.02167,"15.6":0.0298,"16.0":0.00271,"16.1":0.02709,"16.2":0.02709,"16.3":0.02709,"16.4":0.01625,"16.5":0.03251,"16.6":0.07856,"17.0":0.08127,"17.1":0.13003,"17.2":0.00271},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00127,"5.0-5.1":0.00127,"6.0-6.1":0.00318,"7.0-7.1":0.00445,"8.1-8.4":0.00064,"9.0-9.2":0.00509,"9.3":0.01591,"10.0-10.2":0.00127,"10.3":0.02291,"11.0-11.2":0.01082,"11.3-11.4":0.00955,"12.0-12.1":0.00573,"12.2-12.5":0.10437,"13.0-13.1":0.00255,"13.2":0.01082,"13.3":0.00636,"13.4-13.7":0.01846,"14.0-14.4":0.049,"14.5-14.8":0.07955,"15.0-15.1":0.03118,"15.2-15.3":0.03819,"15.4":0.04264,"15.5":0.05982,"15.6-15.7":0.31439,"16.0":0.14765,"16.1":0.29593,"16.2":0.14192,"16.3":0.26602,"16.4":0.05473,"16.5":0.14128,"16.6-16.7":2.39484,"17.0":0.71724,"17.1":1.20474,"17.2":0.03437},P:{"4":0.33389,"20":0.18212,"21":0.29342,"22":0.75885,"23":2.10455,"5.0-5.4":0.02024,"6.2-6.4":0.05059,"7.2-7.4":0.27319,_:"8.2 10.1","9.2":0.02024,"11.1-11.2":0.05059,"12.0":0.02024,"13.0":0.07083,"14.0":0.04047,"15.0":0.03035,"16.0":0.08094,"17.0":0.08094,"18.0":0.09106,"19.0":0.19224},I:{"0":0.03627,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00011},K:{"0":0.33534,_:"10 11 12 11.1 11.5 12.1"},A:{"7":0.00284,"8":0.01418,"9":0.00567,"10":0.00284,"11":0.08505,_:"6 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":3.14928},H:{"0":0},L:{"0":57.00603},R:{_:"0"},M:{"0":0.05103},Q:{"13.1":0.00729}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VA.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VA.js
    index 67f680fdaa1aa2..78ed0bde01643e 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VA.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VA.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0.00962,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0.00962,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.00962,"92":0,"93":0.02885,"94":0,"95":0,"96":0.06731,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.09615,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.49998,"116":0.09615,"117":8.49966,"118":0.71151,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.01923,"67":0.04808,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.00962,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0.06731,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0.75959,"94":0,"95":0,"96":0.00962,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00962,"103":0.09615,"104":0,"105":0,"106":0.01923,"107":0.00962,"108":0,"109":1.36533,"110":0.00962,"111":0.00962,"112":0,"113":0.00962,"114":0.73074,"115":0.3846,"116":45.86355,"117":13.42254,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0.9615,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.00962,"102":0.00962,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.11538,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.43268,"110":0.00962,"111":0,"112":0,"113":0,"114":0,"115":0.02885,"116":7.20164,"117":7.0478},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00962,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0.25961,"12.1":0.00962,"13.1":0.17307,"14.1":0.10577,"15.1":0.00962,"15.2-15.3":0,"15.4":0.05769,"15.5":0.00962,"15.6":0.3173,"16.0":0.01923,"16.1":0.05769,"16.2":0.07692,"16.3":0.25961,"16.4":0.06731,"16.5":0.08654,"16.6":1.95185,"17.0":0.02885,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0.07007,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0.05009,"14.0-14.4":0.01013,"14.5-14.8":0,"15.0-15.1":0,"15.2-15.3":0.01013,"15.4":0.01013,"15.5":0.01998,"15.6-15.7":0.17026,"16.0":0.08021,"16.1":0.19024,"16.2":0.06022,"16.3":0.1303,"16.4":0.05009,"16.5":0.01998,"16.6":1.81265,"17.0":0.12017,"17.1":0},P:{"4":0,"20":0,"21":0.03014,"22":0.18084,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0,"17.0":0,"18.0":0,"19.0":0},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.02885,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":4.39139},R:{_:"0"},M:{"0":0.07431},Q:{"13.1":0},O:{"0":0},H:{"0":0.03791}};
    +module.exports={C:{"39":0.01901,"103":0.01901,"104":0.03802,"109":0.01901,"115":0.79834,"117":0.66528,"118":0.08554,"119":7.07098,"120":1.95782,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 105 106 107 108 110 111 112 113 114 116 121 122 123 3.5 3.6"},D:{"66":0.0095,"67":0.01901,"92":0.0095,"93":1.1975,"95":0.0095,"98":0.14256,"102":0.0095,"103":0.04752,"108":0.0095,"109":1.14048,"111":0.02851,"113":0.0095,"114":0.57024,"115":0.0095,"116":0.15206,"117":0.41818,"118":9.9887,"119":47.41546,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 68 69 70 71 72 73 74 75 76 77 78 79 80 81 83 84 85 86 87 88 89 90 91 94 96 97 99 100 101 104 105 106 107 110 112 120 121 122"},F:{_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"18":0.17107,"101":0.0095,"106":0.0095,"109":0.01901,"111":0.0095,"117":0.0095,"118":1.6727,"119":17.55389,_:"12 13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 102 103 104 105 107 108 110 112 113 114 115 116"},E:{"14":0.01901,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 15.2-15.3 15.4 16.1 16.2 17.2","11.1":0.19008,"12.1":0.0095,"13.1":0.01901,"14.1":0.12355,"15.1":0.01901,"15.5":0.03802,"15.6":0.7223,"16.0":0.03802,"16.3":0.28512,"16.4":0.19958,"16.5":0.02851,"16.6":1.36858,"17.0":0.15206,"17.1":0.44669},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00038,"5.0-5.1":0.00038,"6.0-6.1":0.00096,"7.0-7.1":0.00134,"8.1-8.4":0.00019,"9.0-9.2":0.00153,"9.3":0.00478,"10.0-10.2":0.00038,"10.3":0.00688,"11.0-11.2":0.00325,"11.3-11.4":0.00287,"12.0-12.1":0.00172,"12.2-12.5":0.03136,"13.0-13.1":0.00076,"13.2":0.00325,"13.3":0.00191,"13.4-13.7":0.00555,"14.0-14.4":0.01472,"14.5-14.8":0.0239,"15.0-15.1":0.00937,"15.2-15.3":0.01147,"15.4":0.01281,"15.5":0.01797,"15.6-15.7":0.09446,"16.0":0.04436,"16.1":0.08891,"16.2":0.04264,"16.3":0.07992,"16.4":0.01644,"16.5":0.04245,"16.6-16.7":0.71952,"17.0":0.21549,"17.1":0.36196,"17.2":0.01033},P:{"23":0.2455,_:"4 20 21 22 5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 14.0 15.0 16.0 17.0 18.0 19.0","13.0":0.01292},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{"0":0.00794,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.02851,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{_:"0"},H:{"0":0},L:{"0":2.52472},R:{_:"0"},M:{"0":0.26635},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VC.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VC.js
    index dde783f2f54852..e79247e683f8eb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VC.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VC.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0.00863,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00431,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00431,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00431,"110":0,"111":0,"112":0.00431,"113":0,"114":0,"115":0.06901,"116":0.13802,"117":0.74184,"118":0.05176,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0.01294,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.00431,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0.00431,"72":0,"73":0,"74":0.00431,"75":0.00863,"76":0.01294,"77":0,"78":0,"79":0.03019,"80":0,"81":0.00431,"83":0.09489,"84":0,"85":0,"86":0,"87":0.02157,"88":0.02157,"89":0,"90":0,"91":0.00863,"92":0,"93":0.0345,"94":0,"95":0.00863,"96":0,"97":0,"98":0,"99":0.00431,"100":0.01294,"101":0,"102":0.00431,"103":0.10351,"104":0,"105":0.00863,"106":0.01725,"107":0,"108":0.01294,"109":0.44424,"110":0.00863,"111":0.01294,"112":0.05607,"113":0.01294,"114":0.23722,"115":0.34504,"116":6.25385,"117":1.71226,"118":0.09057,"119":0.00431,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00431,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.01725,"73":0,"74":0,"75":0,"76":0,"77":0.01294,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00431,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.03019,"101":0.04744,"102":0.05176,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00431,"79":0,"80":0,"81":0,"83":0,"84":0.00431,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00431,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.01294,"110":0,"111":0.00863,"112":0.00431,"113":0,"114":0.02157,"115":0.0647,"116":1.18176,"117":0.97905},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.02157,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00431,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.02588,"14.1":0.02588,"15.1":0,"15.2-15.3":0.00863,"15.4":0.00431,"15.5":0.00863,"15.6":0.37523,"16.0":0.01294,"16.1":0.03882,"16.2":0.00863,"16.3":0.02588,"16.4":0.16821,"16.5":0.03882,"16.6":0.52187,"17.0":0.08626,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.0334,"6.0-6.1":0,"7.0-7.1":0.00167,"8.1-8.4":0.02338,"9.0-9.2":0,"9.3":0.02171,"10.0-10.2":0,"10.3":0.04341,"11.0-11.2":0.01837,"11.3-11.4":0.01002,"12.0-12.1":0.01002,"12.2-12.5":0.13525,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0.01169,"14.0-14.4":0.03173,"14.5-14.8":0.08182,"15.0-15.1":0.05343,"15.2-15.3":0.02672,"15.4":0.00501,"15.5":1.27736,"15.6-15.7":1.27235,"16.0":0.17365,"16.1":0.59276,"16.2":0.21039,"16.3":0.89332,"16.4":0.07848,"16.5":0.51261,"16.6":9.44915,"17.0":1.2423,"17.1":0},P:{"4":0.14134,"20":0.10873,"21":0.34792,"22":3.64231,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.41316,"8.2":0,"9.2":0.02175,"10.1":0.01087,"11.1-11.2":0.08698,"12.0":0,"13.0":0.04349,"14.0":0,"15.0":0,"16.0":0.02175,"17.0":0.13047,"18.0":0.02175,"19.0":0.06524},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.16241,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.64965},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0.00863,"11":0.00431,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":60.56651},R:{_:"0"},M:{"0":0.1308},Q:{"13.1":0},O:{"0":0.13649},H:{"0":0.09153}};
    +module.exports={C:{"88":0.00772,"103":0.00772,"115":0.12741,"118":0.12741,"119":1.19305,"120":0.64865,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 89 90 91 92 93 94 95 96 97 98 99 100 101 102 104 105 106 107 108 109 110 111 112 113 114 116 117 121 122 123 3.5 3.6"},D:{"29":0.14672,"43":0.00772,"49":0.01544,"50":0.00386,"66":0.01931,"70":0.01931,"71":0.00772,"74":0.01158,"75":0.00772,"76":0.02317,"79":0.02317,"81":0.01158,"83":0.13127,"87":0.02703,"88":0.01931,"89":0.04247,"92":0.03475,"93":0.10039,"95":0.01158,"99":0.01158,"101":0.00386,"102":0.01158,"103":0.11197,"105":0.01931,"106":0.01158,"108":0.03089,"109":0.54054,"111":0.08108,"112":0.05019,"113":0.00772,"114":0.01931,"115":0.01158,"116":0.18919,"117":0.53668,"118":4.73359,"119":9.83011,"120":0.09653,"121":0.04247,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 30 31 32 33 34 35 36 37 38 39 40 41 42 44 45 46 47 48 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 67 68 69 72 73 77 78 80 84 85 86 90 91 94 96 97 98 100 104 107 110 122"},F:{"79":0.00772,"85":0.02317,"102":0.36293,"103":0.14286,"104":0.20849,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00386,"18":0.00386,"90":0.01158,"92":0.00772,"103":0.00386,"109":0.08108,"114":0.01544,"115":0.01544,"116":0.03089,"117":0.13514,"118":0.61776,"119":4.51737,_:"13 14 15 16 17 79 80 81 83 84 85 86 87 88 89 91 93 94 95 96 97 98 99 100 101 102 104 105 106 107 108 110 111 112 113"},E:{"14":0.01158,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 6.1 7.1 10.1 11.1 12.1 15.1 15.4","5.1":0.00772,"9.1":0.01158,"13.1":0.52896,"14.1":0.0695,"15.2-15.3":0.00772,"15.5":0.01931,"15.6":0.95753,"16.0":0.03475,"16.1":0.04633,"16.2":0.03475,"16.3":0.03861,"16.4":0.06564,"16.5":0.08108,"16.6":0.72201,"17.0":0.57529,"17.1":0.55598,"17.2":0.06178},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00198,"5.0-5.1":0.00198,"6.0-6.1":0.00494,"7.0-7.1":0.00692,"8.1-8.4":0.00099,"9.0-9.2":0.00791,"9.3":0.02472,"10.0-10.2":0.00198,"10.3":0.0356,"11.0-11.2":0.01681,"11.3-11.4":0.01483,"12.0-12.1":0.0089,"12.2-12.5":0.16219,"13.0-13.1":0.00396,"13.2":0.01681,"13.3":0.00989,"13.4-13.7":0.02868,"14.0-14.4":0.07615,"14.5-14.8":0.12362,"15.0-15.1":0.04846,"15.2-15.3":0.05934,"15.4":0.06626,"15.5":0.09297,"15.6-15.7":0.48856,"16.0":0.22945,"16.1":0.45988,"16.2":0.22055,"16.3":0.4134,"16.4":0.08505,"16.5":0.21956,"16.6-16.7":3.72158,"17.0":1.11459,"17.1":1.87216,"17.2":0.05341},P:{"4":0.27671,"20":0.04612,"21":0.10377,"22":0.32283,"23":3.04386,_:"5.0-5.4 8.2 9.2 10.1 12.0 14.0 15.0","6.2-6.4":0.01153,"7.2-7.4":0.19601,"11.1-11.2":0.02306,"13.0":0.03459,"16.0":0.03459,"17.0":0.02306,"18.0":0.01153,"19.0":0.03459},I:{"0":0.04276,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00013},K:{"0":0.48112,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.01158,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.19031},H:{"0":0.01},L:{"0":55.51585},R:{_:"0"},M:{"0":0.22714},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VE.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VE.js
    index 688414be3dfdda..878109a7968503 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VE.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VE.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0.00461,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00461,"50":0,"51":0,"52":0.19379,"53":0,"54":0,"55":0,"56":0.00461,"57":0.00461,"58":0,"59":0,"60":0.00461,"61":0.01846,"62":0.00461,"63":0,"64":0,"65":0.00461,"66":0.00461,"67":0.00461,"68":0.01846,"69":0,"70":0.00461,"71":0,"72":0.00461,"73":0,"74":0,"75":0.00923,"76":0,"77":0,"78":0.01384,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00923,"89":0,"90":0.00461,"91":0.00923,"92":0,"93":0,"94":0,"95":0,"96":0.00461,"97":0,"98":0,"99":0.00461,"100":0.00461,"101":0,"102":0.02307,"103":0.00461,"104":0.00461,"105":0.00461,"106":0.00461,"107":0.00461,"108":0.00461,"109":0.01384,"110":0.00461,"111":0.00461,"112":0.01384,"113":0.01384,"114":0.00923,"115":0.51215,"116":0.05998,"117":0.56291,"118":0.05075,"119":0.00923,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00461,"47":0.00461,"48":0,"49":0.06921,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0.00923,"57":0.00461,"58":0,"59":0.00461,"60":0,"61":0.00923,"62":0,"63":0.00461,"64":0.00461,"65":0.00461,"66":0.0323,"67":0.00461,"68":0.01384,"69":0.01384,"70":0.00461,"71":0.00923,"72":0.00461,"73":0.00461,"74":0.00923,"75":0.00923,"76":0.01384,"77":0.00461,"78":0.00461,"79":0.02307,"80":0.02307,"81":0.02307,"83":0.02768,"84":0.00923,"85":0.0323,"86":0.01384,"87":0.0323,"88":0.02307,"89":0.00461,"90":0.01384,"91":0.02307,"92":0.01384,"93":0.01846,"94":0.01384,"95":0.00461,"96":0.01846,"97":0.02307,"98":0.02768,"99":0.01384,"100":0.01384,"101":0.01846,"102":0.02307,"103":0.05998,"104":0.01846,"105":0.02768,"106":0.0323,"107":0.04614,"108":0.07382,"109":3.79271,"110":0.01384,"111":0.03691,"112":0.05537,"113":0.09228,"114":0.21686,"115":0.13842,"116":5.60601,"117":1.58722,"118":0.00461,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00461,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0.00461,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.00461,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.00461,"70":0.00461,"71":0.00461,"72":0.03691,"73":0.01384,"74":0,"75":0,"76":0,"77":0.02307,"78":0,"79":0.01384,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.00461,"86":0,"87":0,"88":0,"89":0.00461,"90":0,"91":0,"92":0,"93":0,"94":0.00461,"95":0.17533,"96":0,"97":0,"98":0.00461,"99":0.00923,"100":0.12919,"101":0.32298,"102":0.37835,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.0646,"18":0.00461,"79":0,"80":0,"81":0.00461,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.01384,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00923,"108":0.00461,"109":0.0646,"110":0,"111":0.00461,"112":0.00461,"113":0.00461,"114":0.01384,"115":0.02768,"116":0.61366,"117":0.48908},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00461,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00461,"6.1":0,"7.1":0,"9.1":0.03691,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00461,"14.1":0.01384,"15.1":0,"15.2-15.3":0,"15.4":0.00461,"15.5":0.00461,"15.6":0.01846,"16.0":0,"16.1":0.00923,"16.2":0.00461,"16.3":0.00923,"16.4":0.00461,"16.5":0.01846,"16.6":0.05998,"17.0":0.00461,"17.1":0},G:{"8":0.00093,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00326,"6.0-6.1":0.00093,"7.0-7.1":0.01535,"8.1-8.4":0.00465,"9.0-9.2":0.00279,"9.3":0.05069,"10.0-10.2":0.00047,"10.3":0.04278,"11.0-11.2":0.01256,"11.3-11.4":0.00837,"12.0-12.1":0.00558,"12.2-12.5":0.13346,"13.0-13.1":0.02558,"13.2":0.00186,"13.3":0.08277,"13.4-13.7":0.01581,"14.0-14.4":0.03395,"14.5-14.8":0.07161,"15.0-15.1":0.01721,"15.2-15.3":0.03255,"15.4":0.05487,"15.5":0.03581,"15.6-15.7":0.46362,"16.0":0.13393,"16.1":0.19298,"16.2":0.11951,"16.3":0.20461,"16.4":0.07347,"16.5":0.12788,"16.6":2.18885,"17.0":0.41619,"17.1":0},P:{"4":0.12409,"20":0.02068,"21":0.06205,"22":0.5791,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.08273,"8.2":0,"9.2":0.01034,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0.02068,"14.0":0.01034,"15.0":0,"16.0":0.03102,"17.0":0.04136,"18.0":0.01034,"19.0":0.04136},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.02362,"4.2-4.3":0.03247,"4.4":0,"4.4.3-4.4.4":0.49299},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.02768,"5.5":0},S:{"2.5":0.01077,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":74.98551},R:{_:"0"},M:{"0":0.13465},Q:{"13.1":0},O:{"0":0.04847},H:{"0":0.46402}};
    +module.exports={C:{"2":0.00416,"27":0.01249,"35":0.00832,"40":0.00416,"45":0.00416,"48":0.00416,"52":0.26221,"53":0.00416,"54":0.00416,"56":0.00416,"57":0.00416,"59":0.00416,"60":0.00832,"62":0.00416,"63":0.00416,"64":0.00416,"66":0.00416,"67":0.00416,"68":0.02081,"72":0.00832,"73":0.00416,"75":0.01249,"78":0.01665,"79":0.00416,"80":0.00416,"81":0.00416,"82":0.00416,"84":0.00416,"88":0.01249,"89":0.00416,"91":0.01249,"95":0.00416,"96":0.00416,"97":0.00416,"99":0.00832,"100":0.00416,"101":0.00416,"102":0.01249,"103":0.00416,"104":0.00416,"105":0.00832,"106":0.00832,"107":0.00832,"108":0.01249,"109":0.00832,"110":0.00416,"111":0.01249,"112":0.01249,"113":0.0333,"114":0.01249,"115":0.81991,"116":0.01249,"117":0.01249,"118":0.02913,"119":1.08628,"120":0.27885,"121":0.00832,_:"3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 28 29 30 31 32 33 34 36 37 38 39 41 42 43 44 46 47 49 50 51 55 58 61 65 69 70 71 74 76 77 83 85 86 87 90 92 93 94 98 122 123 3.5 3.6"},D:{"24":0.00416,"41":0.00416,"44":0.00416,"45":0.00416,"46":0.00832,"47":0.00416,"49":0.14151,"50":0.00416,"51":0.00416,"53":0.00832,"55":0.00416,"56":0.00416,"57":0.00416,"58":0.00416,"60":0.00416,"61":0.00416,"63":0.00832,"64":0.06659,"65":0.01249,"66":0.04578,"67":0.00416,"68":0.00416,"69":0.00832,"70":0.01249,"71":0.02497,"72":0.00832,"73":0.02497,"74":0.00832,"75":0.02081,"76":0.02497,"77":0.00832,"78":0.00832,"79":0.04994,"80":0.02497,"81":0.02913,"83":0.02913,"84":0.01249,"85":0.07492,"86":0.01249,"87":0.07908,"88":0.01665,"89":0.00832,"90":0.02081,"91":0.02913,"92":0.0333,"93":0.04162,"94":0.01249,"95":0.01665,"96":0.02081,"97":0.04994,"98":0.06243,"99":0.01665,"100":0.03746,"101":0.04162,"102":0.04578,"103":0.1207,"104":0.03746,"105":0.04162,"106":0.04578,"107":0.07075,"108":0.11654,"109":7.75381,"110":0.02913,"111":0.05827,"112":0.09573,"113":0.06659,"114":0.07075,"115":0.04578,"116":0.21642,"117":0.26637,"118":2.90091,"119":13.47656,"120":0.01665,"121":0.00416,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 42 43 48 52 54 59 62 122"},F:{"28":0.00416,"65":0.00416,"69":0.00416,"79":0.02497,"85":0.02081,"86":0.00416,"89":0.00416,"95":0.51609,"98":0.00416,"99":0.00832,"100":0.00832,"102":0.77829,"103":0.16232,"104":1.20282,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 66 67 68 70 71 72 73 74 75 76 77 78 80 81 82 83 84 87 88 90 91 92 93 94 96 97 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00416,"17":0.30383,"18":0.00832,"83":0.00416,"84":0.00416,"85":0.01665,"89":0.00416,"92":0.02913,"100":0.00416,"107":0.00832,"108":0.01665,"109":0.16232,"110":0.00832,"111":0.00416,"112":0.00416,"113":0.00832,"114":0.01249,"115":0.01249,"116":0.02497,"117":0.04578,"118":0.4162,"119":2.21418,_:"13 14 15 16 79 80 81 86 87 88 90 91 93 94 95 96 97 98 99 101 102 103 104 105 106"},E:{"13":0.00416,"14":0.00416,_:"0 4 5 6 7 8 9 10 11 12 15 3.1 3.2 6.1 7.1 10.1 15.2-15.3 17.2","5.1":0.00416,"9.1":0.00416,"11.1":0.00416,"12.1":0.00416,"13.1":0.01249,"14.1":0.02913,"15.1":0.00416,"15.4":0.02081,"15.5":0.00832,"15.6":0.05411,"16.0":0.00416,"16.1":0.00416,"16.2":0.00416,"16.3":0.02497,"16.4":0.00832,"16.5":0.02913,"16.6":0.07908,"17.0":0.04162,"17.1":0.05827},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00061,"5.0-5.1":0.00061,"6.0-6.1":0.00152,"7.0-7.1":0.00212,"8.1-8.4":0.0003,"9.0-9.2":0.00242,"9.3":0.00758,"10.0-10.2":0.00061,"10.3":0.01091,"11.0-11.2":0.00515,"11.3-11.4":0.00455,"12.0-12.1":0.00273,"12.2-12.5":0.0497,"13.0-13.1":0.00121,"13.2":0.00515,"13.3":0.00303,"13.4-13.7":0.00879,"14.0-14.4":0.02333,"14.5-14.8":0.03788,"15.0-15.1":0.01485,"15.2-15.3":0.01818,"15.4":0.0203,"15.5":0.02849,"15.6-15.7":0.1497,"16.0":0.07031,"16.1":0.14092,"16.2":0.06758,"16.3":0.12667,"16.4":0.02606,"16.5":0.06728,"16.6-16.7":1.14035,"17.0":0.34153,"17.1":0.57366,"17.2":0.01636},P:{"4":0.17922,"20":0.02109,"21":0.05271,"22":0.0738,"23":0.4955,_:"5.0-5.4 8.2 10.1 12.0 14.0 15.0","6.2-6.4":0.03163,"7.2-7.4":0.06326,"9.2":0.02109,"11.1-11.2":0.01054,"13.0":0.03163,"16.0":0.04217,"17.0":0.06326,"18.0":0.02109,"19.0":0.03163},I:{"0":0.02905,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.00009},K:{"0":0.40376,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00416,"9":0.00416,"11":0.04578,_:"6 7 10 5.5"},N:{_:"10 11"},S:{"2.5":0.02336,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.04671},H:{"0":0.04},L:{"0":58.50425},R:{_:"0"},M:{"0":0.12262},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VG.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VG.js
    index 200ec70d75f4d2..871583db85cc30 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VG.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VG.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0.01143,"76":0,"77":0,"78":0.01524,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.00381,"95":0,"96":0,"97":0,"98":0,"99":0.03049,"100":0,"101":0,"102":0.0343,"103":0.00381,"104":0.00762,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0.00381,"112":0,"113":0,"114":0.00381,"115":0.04192,"116":0.09528,"117":0.55641,"118":0.01143,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0.00381,"63":0.00381,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00381,"73":0,"74":0,"75":0.20198,"76":0.00762,"77":0.00381,"78":0,"79":0.00381,"80":0,"81":0,"83":0,"84":0,"85":0.00762,"86":0,"87":0.01143,"88":0,"89":0,"90":0,"91":0,"92":0.00381,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0.01524,"99":0,"100":0,"101":0,"102":0.00381,"103":0.08765,"104":0.00762,"105":0.19055,"106":0,"107":0.54878,"108":0.27058,"109":0.22104,"110":0.00762,"111":0.52973,"112":0.20579,"113":0.00762,"114":0.31631,"115":0.35442,"116":4.39408,"117":0.99467,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0.01524,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.0343,"73":0.00762,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.15625,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00381,"100":0.01143,"101":0.05335,"102":0.06479,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.00762,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0.00381,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.01143,"110":0.29345,"111":0,"112":0.00381,"113":0.00762,"114":0.01524,"115":0.08003,"116":1.13568,"117":0.83842},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00381,"14":0.01906,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.02287,"14.1":0.04573,"15.1":0.00762,"15.2-15.3":0.02668,"15.4":0.01906,"15.5":0.01143,"15.6":0.11433,"16.0":0,"16.1":0.04954,"16.2":0.02668,"16.3":0.05335,"16.4":0.00762,"16.5":0.16387,"16.6":1.36053,"17.0":0.01143,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.0136,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0.00816,"9.3":0.32378,"10.0-10.2":0,"10.3":0.04353,"11.0-11.2":0.02177,"11.3-11.4":0.0789,"12.0-12.1":0.0136,"12.2-12.5":0.09795,"13.0-13.1":0,"13.2":0.00816,"13.3":0.01905,"13.4-13.7":0.05442,"14.0-14.4":0.06258,"14.5-14.8":0.117,"15.0-15.1":0.02721,"15.2-15.3":0.0517,"15.4":0.06258,"15.5":0.06258,"15.6-15.7":1.07201,"16.0":1.36042,"16.1":1.18357,"16.2":0.58226,"16.3":1.62162,"16.4":0.16325,"16.5":0.43261,"16.6":18.02289,"17.0":1.19717,"17.1":0.00816},P:{"4":0.24477,"20":0.12239,"21":0.65272,"22":3.78375,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.8057,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.0102,"12.0":0,"13.0":0.0408,"14.0":0,"15.0":0.0408,"16.0":0,"17.0":0.0306,"18.0":0,"19.0":0.06119},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.21198},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":49.19946},R:{_:"0"},M:{"0":0.43942},Q:{"13.1":0.00619},O:{"0":0.64985},H:{"0":0.22266}};
    +module.exports={C:{"75":0.00813,"78":0.00813,"97":0.00407,"105":0.00407,"107":0.00813,"109":0.00407,"111":0.52032,"115":0.09756,"116":0.00813,"117":0.00407,"118":0.06911,"119":1.08129,"120":0.18293,"121":0.0122,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 76 77 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 98 99 100 101 102 103 104 106 108 110 112 113 114 122 123 3.5 3.6"},D:{"41":0.00407,"43":0.00407,"49":0.0122,"51":0.0122,"56":0.00407,"58":0.00407,"59":0.00407,"68":0.00407,"70":0.01626,"75":0.57723,"76":0.00407,"78":0.00407,"87":0.00407,"88":0.00407,"92":0.03252,"93":0.00813,"97":0.0122,"101":0.11382,"103":0.10163,"105":0.1748,"106":0.65447,"107":1.63007,"108":0.00407,"109":0.40244,"110":0.0122,"111":0.04065,"112":0.00407,"113":0.00407,"114":0.60569,"115":0.00813,"116":0.18293,"117":0.56504,"118":5.691,"119":13.24377,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 42 44 45 46 47 48 50 52 53 54 55 57 60 61 62 63 64 65 66 67 69 71 72 73 74 77 79 80 81 83 84 85 86 89 90 91 94 95 96 98 99 100 102 104 120 121 122"},F:{"28":0.02033,"46":0.00407,"71":0.00407,"95":0.00407,"96":0.00407,"101":0.0122,"102":0.05691,"103":1.00812,"104":2.54469,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"15":0.00407,"18":0.00407,"92":0.01626,"101":0.00407,"107":0.00407,"108":0.00407,"109":0.60162,"114":0.03659,"115":0.06504,"116":0.0935,"117":0.03252,"118":0.60975,"119":3.9959,_:"12 13 14 16 17 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 102 103 104 105 106 110 111 112 113"},E:{"13":0.00407,"14":0.12195,"15":0.00407,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.04065,"13.1":0.02439,"14.1":0.0813,"15.1":0.00407,"15.2-15.3":0.00407,"15.4":0.02846,"15.5":0.02439,"15.6":0.57317,"16.0":0.00407,"16.1":0.0935,"16.2":0.05691,"16.3":0.11789,"16.4":0.03252,"16.5":0.20325,"16.6":1.95933,"17.0":0.22764,"17.1":0.80487,"17.2":0.00407},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00421,"5.0-5.1":0.00421,"6.0-6.1":0.01052,"7.0-7.1":0.01473,"8.1-8.4":0.0021,"9.0-9.2":0.01684,"9.3":0.05261,"10.0-10.2":0.00421,"10.3":0.07576,"11.0-11.2":0.03578,"11.3-11.4":0.03157,"12.0-12.1":0.01894,"12.2-12.5":0.34515,"13.0-13.1":0.00842,"13.2":0.03578,"13.3":0.02105,"13.4-13.7":0.06103,"14.0-14.4":0.16205,"14.5-14.8":0.26307,"15.0-15.1":0.10312,"15.2-15.3":0.12627,"15.4":0.141,"15.5":0.19783,"15.6-15.7":1.03965,"16.0":0.48826,"16.1":0.97862,"16.2":0.46931,"16.3":0.8797,"16.4":0.18099,"16.5":0.46721,"16.6-16.7":7.91943,"17.0":2.37183,"17.1":3.98392,"17.2":0.11365},P:{"4":0.07312,"20":0.03134,"21":0.20892,"22":0.68944,"23":4.88873,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 13.0 14.0 15.0 16.0 17.0","7.2-7.4":0.11491,"11.1-11.2":0.02089,"12.0":0.01045,"18.0":0.03134,"19.0":0.15669},I:{"0":0.00591,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.00002},K:{"0":0.09496,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00407,"11":0.00813,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.36204},H:{"0":0},L:{"0":31.91501},R:{_:"0"},M:{"0":0.17212},Q:{"13.1":0.01187}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VI.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VI.js
    index d2e6c4f36d01a4..3654918c8b44c8 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VI.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VI.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.03245,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00541,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00541,"103":0,"104":0,"105":0,"106":0.04868,"107":0.00541,"108":0,"109":0,"110":0,"111":0.01082,"112":0,"113":0,"114":0.00541,"115":0.03786,"116":0.43813,"117":2.92086,"118":0.20554,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.00541,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0.01082,"74":0,"75":0,"76":0.02164,"77":0,"78":0,"79":0,"80":0.00541,"81":0,"83":0.01623,"84":0,"85":0,"86":0,"87":0.00541,"88":0.01623,"89":0.00541,"90":0.00541,"91":0,"92":0,"93":0.04868,"94":0.01082,"95":0.01623,"96":0,"97":0.00541,"98":0,"99":0.00541,"100":0,"101":0.01623,"102":0,"103":0.12441,"104":0,"105":0.11359,"106":0,"107":0,"108":0.03786,"109":0.29209,"110":0.01623,"111":0.09736,"112":0.12441,"113":0.02705,"114":0.54631,"115":0.51386,"116":6.35558,"117":1.59566,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.00541,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.03786,"101":0.05409,"102":0.12982,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0.01623,"105":0,"106":0,"107":0,"108":0,"109":0.04327,"110":0,"111":0,"112":0,"113":0.01082,"114":0.03786,"115":0.119,"116":3.52126,"117":2.73155},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.01082,"14":0.01623,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.18932,"14.1":0.16768,"15.1":0.01623,"15.2-15.3":0.00541,"15.4":0.01082,"15.5":0.05409,"15.6":0.35699,"16.0":0.07573,"16.1":0.05409,"16.2":0.04327,"16.3":0.51386,"16.4":0.06491,"16.5":3.01281,"16.6":2.59091,"17.0":0.04868,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00802,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0.12025,"11.0-11.2":0.01202,"11.3-11.4":0.01603,"12.0-12.1":0,"12.2-12.5":0.10421,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0.06012,"14.0-14.4":0.02004,"14.5-14.8":0.19239,"15.0-15.1":0.03207,"15.2-15.3":0.08016,"15.4":0.06413,"15.5":0.3447,"15.6-15.7":0.84573,"16.0":0.9299,"16.1":2.38888,"16.2":0.6373,"16.3":3.87191,"16.4":0.12826,"16.5":0.91787,"16.6":27.27972,"17.0":1.51109,"17.1":0.01603},P:{"4":0.02076,"20":0.01038,"21":0.3425,"22":2.13806,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0.01038,"14.0":0,"15.0":0,"16.0":0.05189,"17.0":0.31137,"18.0":0.01038,"19.0":0.01038},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.70694},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.02164,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":26.64841},R:{_:"0"},M:{"0":0.51419},Q:{"13.1":0},O:{"0":0},H:{"0":0.0565}};
    +module.exports={C:{"78":0.14819,"91":0.00511,"114":0.00511,"115":0.1022,"118":0.15841,"119":4.23108,"120":0.44457,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 116 117 121 122 123 3.5 3.6"},D:{"74":0.00511,"76":0.02555,"79":0.71029,"80":0.00511,"83":0.01533,"87":0.00511,"88":0.05621,"89":0.00511,"93":0.14308,"94":0.02044,"99":0.01022,"101":0.02044,"103":0.08687,"104":0.00511,"105":0.06132,"106":0.00511,"107":0.00511,"108":0.10731,"109":0.44457,"110":0.09198,"111":0.10731,"112":0.00511,"113":0.01022,"114":0.04599,"115":0.06132,"116":0.96579,"117":0.53144,"118":5.07423,"119":10.77699,"120":0.00511,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 75 77 78 81 84 85 86 90 91 92 95 96 97 98 100 102 121 122"},F:{"102":0.42413,"103":3.20397,"104":0.18396,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"104":0.01533,"109":0.15841,"114":0.08176,"115":0.02044,"116":0.0511,"117":0.14819,"118":1.98268,"119":8.20155,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 105 106 107 108 110 111 112 113"},E:{"13":0.00511,"14":0.03066,_:"0 4 5 6 7 8 9 10 11 12 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1","12.1":0.01022,"13.1":0.04088,"14.1":0.42924,"15.1":0.16863,"15.2-15.3":0.00511,"15.4":0.04599,"15.5":0.07665,"15.6":1.33371,"16.0":0.07665,"16.1":0.25039,"16.2":0.07665,"16.3":0.45479,"16.4":0.25039,"16.5":1.57388,"16.6":4.72164,"17.0":0.57232,"17.1":1.25195,"17.2":0.01533},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00532,"5.0-5.1":0.00532,"6.0-6.1":0.01331,"7.0-7.1":0.01863,"8.1-8.4":0.00266,"9.0-9.2":0.02129,"9.3":0.06654,"10.0-10.2":0.00532,"10.3":0.09582,"11.0-11.2":0.04525,"11.3-11.4":0.03992,"12.0-12.1":0.02395,"12.2-12.5":0.43651,"13.0-13.1":0.01065,"13.2":0.04525,"13.3":0.02662,"13.4-13.7":0.07719,"14.0-14.4":0.20495,"14.5-14.8":0.3327,"15.0-15.1":0.13042,"15.2-15.3":0.1597,"15.4":0.17833,"15.5":0.25019,"15.6-15.7":1.31484,"16.0":0.6175,"16.1":1.23766,"16.2":0.59354,"16.3":1.11256,"16.4":0.2289,"16.5":0.59088,"16.6-16.7":10.0157,"17.0":2.99965,"17.1":5.03846,"17.2":0.14373},P:{"21":0.03319,"22":0.27658,"23":2.03566,_:"4 20 5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 18.0","16.0":0.07744,"17.0":0.01106,"19.0":0.01106},I:{"0":0.00973,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00003},K:{"0":0.06357,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.04088,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.02445},H:{"0":0},L:{"0":19.5743},R:{_:"0"},M:{"0":0.41565},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VN.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VN.js
    index 17e947571fa759..0e6cdea7184abc 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VN.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VN.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00158,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.00946,"116":0.00315,"117":0.041,"118":0.00315,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0.00315,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.01104,"50":0,"51":0,"52":0.00158,"53":0.00158,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00315,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0.00158,"75":0.00158,"76":0,"77":0.00158,"78":0,"79":0.01577,"80":0.00158,"81":0.00315,"83":0.00158,"84":0.00315,"85":0.00315,"86":0.00946,"87":0.00473,"88":0.00158,"89":0.00158,"90":0.00315,"91":0.00946,"92":0.00158,"93":0,"94":0,"95":0.00158,"96":0.00158,"97":0.00158,"98":0,"99":0.00158,"100":0.00158,"101":0.00158,"102":0.00315,"103":0.00473,"104":0.00789,"105":0.00315,"106":0.00473,"107":0.00631,"108":0.00789,"109":0.14666,"110":0.00473,"111":0.00631,"112":0.00789,"113":0.00473,"114":0.01262,"115":0.01577,"116":0.88627,"117":0.22867,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0.00158,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0.00158,"37":0.00315,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0.00158,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0.00158,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0.00631,"73":0.00158,"74":0,"75":0,"76":0,"77":0.00946,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00158,"96":0,"97":0,"98":0,"99":0,"100":0.00315,"101":0.01262,"102":0.01262,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.00158,"91":0.00631,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00158,"108":0.00158,"109":0.00158,"110":0,"111":0,"112":0,"113":0,"114":0.00158,"115":0.00315,"116":0.07885,"117":0.05835},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0.00158,"14":0.00473,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0.00158,"10.1":0,"11.1":0.00158,"12.1":0,"13.1":0.00315,"14.1":0.01104,"15.1":0.00158,"15.2-15.3":0.00158,"15.4":0.00315,"15.5":0.00473,"15.6":0.0205,"16.0":0.00158,"16.1":0.00473,"16.2":0.00315,"16.3":0.00946,"16.4":0.00315,"16.5":0.00631,"16.6":0.0552,"17.0":0.00315,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00969,"8.1-8.4":0.00646,"9.0-9.2":0.00969,"9.3":0.08723,"10.0-10.2":0.01292,"10.3":0.126,"11.0-11.2":0.02908,"11.3-11.4":0.04846,"12.0-12.1":0.05169,"12.2-12.5":1.04031,"13.0-13.1":0.02585,"13.2":0.01615,"13.3":0.54923,"13.4-13.7":0.294,"14.0-14.4":0.83031,"14.5-14.8":1.61861,"15.0-15.1":0.40708,"15.2-15.3":0.53308,"15.4":0.53308,"15.5":0.77538,"15.6-15.7":5.43092,"16.0":1.02092,"16.1":1.94169,"16.2":1.03708,"16.3":1.94492,"16.4":0.54277,"16.5":1.34077,"16.6":11.02661,"17.0":0.70754,"17.1":0},P:{"4":0.26598,"20":0.08184,"21":0.16368,"22":2.046,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.05115,"8.2":0,"9.2":0.01023,"10.1":0,"11.1-11.2":0.03069,"12.0":0.01023,"13.0":0.02046,"14.0":0.03069,"15.0":0.02046,"16.0":0.04092,"17.0":0.05115,"18.0":0.04092,"19.0":0.07161},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.03631},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00315,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":55.7412},R:{_:"0"},M:{"0":0.10108},Q:{"13.1":0.00842},O:{"0":2.51005},H:{"0":0.45454}};
    +module.exports={C:{"44":0.00134,"47":0.00134,"52":0.00401,"59":0.00401,"66":0.00134,"67":0.00134,"68":0.00134,"72":0.00134,"75":0.00134,"78":0.00134,"80":0.00134,"81":0.00134,"88":0.00401,"95":0.00134,"99":0.00134,"101":0.00134,"102":0.00134,"103":0.00134,"104":0.00267,"105":0.00267,"106":0.00267,"107":0.00401,"108":0.00134,"109":0.00267,"110":0.00401,"111":0.00267,"113":0.00267,"114":0.00134,"115":0.05214,"116":0.00134,"117":0.00267,"118":0.00802,"119":0.19387,"120":0.05749,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 45 46 48 49 50 51 53 54 55 56 57 58 60 61 62 63 64 65 69 70 71 73 74 76 77 79 82 83 84 85 86 87 89 90 91 92 93 94 96 97 98 100 112 121 122 123 3.5 3.6"},D:{"26":0.00134,"34":0.00401,"38":0.02273,"41":0.00535,"47":0.00267,"48":0.00267,"49":0.0107,"50":0.00134,"52":0.00134,"53":0.00802,"54":0.00134,"55":0.00134,"56":0.00267,"57":0.00401,"60":0.00134,"61":0.00134,"65":0.00134,"66":0.01738,"68":0.00267,"69":0.00267,"70":0.00267,"71":0.00267,"72":0.00267,"73":0.00134,"74":0.00401,"75":0.00401,"76":0.00267,"77":0.00267,"78":0.00267,"79":0.0722,"80":0.00535,"81":0.00669,"83":0.0107,"84":0.00669,"85":0.01604,"86":0.00802,"87":0.01872,"88":0.00267,"89":0.00669,"90":0.00535,"91":0.00401,"92":0.00401,"93":0.00134,"94":0.00134,"95":0.00401,"96":0.00535,"97":0.00535,"98":0.00535,"99":0.00669,"100":0.02273,"101":0.00267,"102":0.00802,"103":0.02139,"104":0.00535,"105":0.0254,"106":0.03075,"107":0.03075,"108":0.04278,"109":0.82092,"110":0.02674,"111":0.03343,"112":0.03343,"113":0.01203,"114":0.0361,"115":0.0254,"116":0.0615,"117":0.10295,"118":1.20464,"119":5.18756,"120":0.00401,"121":0.00134,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 27 28 29 30 31 32 33 35 36 37 39 40 42 43 44 45 46 51 58 59 62 63 64 67 122"},F:{"28":0.00669,"29":0.00134,"36":0.0107,"40":0.00134,"46":0.01471,"79":0.00134,"85":0.00134,"90":0.00134,"91":0.00134,"92":0.00134,"93":0.00134,"94":0.00134,"95":0.00669,"102":0.0468,"103":0.02139,"104":0.08691,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 30 31 32 33 34 35 37 38 39 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 86 87 88 89 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00267,"14":0.00134,"16":0.00134,"17":0.00267,"18":0.00401,"84":0.00134,"85":0.00134,"89":0.00134,"92":0.00134,"99":0.00267,"100":0.00401,"103":0.00134,"104":0.00134,"105":0.00134,"106":0.00267,"107":0.00535,"108":0.00401,"109":0.00936,"110":0.00535,"111":0.00267,"112":0.00267,"113":0.00267,"114":0.00401,"115":0.00401,"116":0.00401,"117":0.00802,"118":0.11498,"119":0.62171,_:"13 15 79 80 81 83 86 87 88 90 91 93 94 95 96 97 98 101 102"},E:{"13":0.00535,"14":0.02808,"15":0.00401,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 5.1 6.1 7.1 10.1","9.1":0.00802,"11.1":0.00401,"12.1":0.00267,"13.1":0.02674,"14.1":0.06819,"15.1":0.00936,"15.2-15.3":0.00669,"15.4":0.02139,"15.5":0.02407,"15.6":0.12568,"16.0":0.00936,"16.1":0.02407,"16.2":0.01604,"16.3":0.04145,"16.4":0.01337,"16.5":0.0254,"16.6":0.23799,"17.0":0.04145,"17.1":0.08423,"17.2":0.00134},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00489,"5.0-5.1":0.00489,"6.0-6.1":0.01223,"7.0-7.1":0.01712,"8.1-8.4":0.00245,"9.0-9.2":0.01956,"9.3":0.06113,"10.0-10.2":0.00489,"10.3":0.08803,"11.0-11.2":0.04157,"11.3-11.4":0.03668,"12.0-12.1":0.02201,"12.2-12.5":0.40103,"13.0-13.1":0.00978,"13.2":0.04157,"13.3":0.02445,"13.4-13.7":0.07091,"14.0-14.4":0.18829,"14.5-14.8":0.30566,"15.0-15.1":0.11982,"15.2-15.3":0.14672,"15.4":0.16383,"15.5":0.22986,"15.6-15.7":1.20797,"16.0":0.56731,"16.1":1.13706,"16.2":0.5453,"16.3":1.02213,"16.4":0.21029,"16.5":0.54285,"16.6-16.7":9.2016,"17.0":2.75583,"17.1":4.62892,"17.2":0.13205},P:{"4":0.36286,"20":0.07056,"21":0.15119,"22":0.27214,"23":2.01588,"5.0-5.4":0.01008,_:"6.2-6.4 8.2 10.1","7.2-7.4":0.07056,"9.2":0.03024,"11.1-11.2":0.0504,"12.0":0.01008,"13.0":0.03024,"14.0":0.03024,"15.0":0.02016,"16.0":0.04032,"17.0":0.0504,"18.0":0.04032,"19.0":0.07056},I:{"0":0.04309,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00013},K:{"0":0.53571,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.02808,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":2.27811},H:{"0":0.01},L:{"0":54.14947},R:{_:"0"},M:{"0":0.09528},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VU.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VU.js
    index 4ecd1d2958fadd..cb33e938017028 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VU.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/VU.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0.00303,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00303,"110":0,"111":0,"112":0.02723,"113":0.00303,"114":0,"115":0.22695,"116":0.03934,"117":0.3722,"118":0.04842,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00303,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0.0121,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.00303,"68":0.00303,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00303,"79":0,"80":0,"81":0.00605,"83":0.00303,"84":0,"85":0,"86":0,"87":0.02118,"88":0.04539,"89":0,"90":0,"91":0.00605,"92":0,"93":0.00303,"94":0.00303,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00303,"101":0,"102":0.00303,"103":0.00605,"104":0,"105":0.00303,"106":0.00303,"107":0,"108":0.00605,"109":0.11499,"110":0.02118,"111":0.01513,"112":0.22998,"113":0.01513,"114":0.12104,"115":0.21182,"116":3.45267,"117":0.72624,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.00303,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0.00303,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00303,"69":0,"70":0,"71":0.00303,"72":0.00605,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0.03329,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00908,"96":0,"97":0,"98":0,"99":0,"100":0.00605,"101":0.03631,"102":0.05144,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0.00605,"14":0,"15":0,"16":0.00303,"17":0.00605,"18":0.00908,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0.00303,"90":0.00303,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.01816,"101":0,"102":0,"103":0.00303,"104":0,"105":0,"106":0,"107":0.00303,"108":0.02421,"109":0.00605,"110":0,"111":0.00303,"112":0.00303,"113":0.05447,"114":0.03026,"115":0.02421,"116":0.4418,"117":0.36009},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.01513,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00908,"14.1":0.05447,"15.1":0,"15.2-15.3":0,"15.4":0.0121,"15.5":0.04842,"15.6":0.03026,"16.0":0,"16.1":0.00303,"16.2":0.00605,"16.3":0.02421,"16.4":0.00908,"16.5":0.00605,"16.6":0.10894,"17.0":0.02421,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.02006,"10.0-10.2":0,"10.3":0.02865,"11.0-11.2":0.00573,"11.3-11.4":0.02579,"12.0-12.1":0.00287,"12.2-12.5":0.23668,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0,"14.0-14.4":0.08367,"14.5-14.8":0.08367,"15.0-15.1":0.05158,"15.2-15.3":0.03782,"15.4":0.15301,"15.5":0.06934,"15.6-15.7":0.54958,"16.0":0.13582,"16.1":0.31232,"16.2":0.20229,"16.3":0.2831,"16.4":0.03782,"16.5":0.32665,"16.6":2.74673,"17.0":0.18224,"17.1":0},P:{"4":0.08146,"20":0.10182,"21":0.05091,"22":1.68004,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.23419,"8.2":0,"9.2":0,"10.1":0.20364,"11.1-11.2":0.05091,"12.0":0,"13.0":0.01018,"14.0":0.08146,"15.0":0.04073,"16.0":0.16291,"17.0":0.02036,"18.0":0.08146,"19.0":0.25455},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.15355},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00908,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":81.68476},R:{_:"0"},M:{"0":0.26501},Q:{"13.1":0},O:{"0":0.25106},H:{"0":0.2509}};
    +module.exports={C:{"30":0.00419,"77":0.00209,"88":0.00419,"115":0.67217,"117":0.00419,"118":0.04188,"119":0.92345,"120":0.35598,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 78 79 80 81 82 83 84 85 86 87 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 116 121 122 123 3.5 3.6"},D:{"48":0.00209,"59":0.01466,"68":0.00419,"69":0.00419,"71":0.00419,"76":0.00419,"78":0.00209,"80":0.00209,"81":0.00419,"87":0.03769,"88":0.23872,"91":0.01675,"92":0.00419,"94":0.00209,"99":0.01047,"103":0.01466,"105":0.01885,"106":0.01047,"107":0.02303,"108":0.01885,"109":0.40414,"110":0.0335,"111":0.03141,"112":0.36645,"113":0.00838,"114":0.05444,"115":0.00419,"116":0.09842,"117":0.12145,"118":2.0584,"119":5.74803,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 49 50 51 52 53 54 55 56 57 58 60 61 62 63 64 65 66 67 70 72 73 74 75 77 79 83 84 85 86 89 90 93 95 96 97 98 100 101 102 104 120 121 122"},F:{"102":0.01885,"103":0.04607,"104":0.05444,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"13":0.00419,"14":0.01256,"17":0.01256,"18":0.00419,"89":0.00419,"92":0.00628,"100":0.01047,"102":0.00628,"104":0.00628,"105":0.0356,"107":0.00419,"108":0.00209,"109":0.15914,"110":0.00209,"111":0.00419,"113":0.01047,"114":0.01047,"115":0.00838,"116":0.01675,"117":0.02722,"118":0.50047,"119":1.08679,_:"12 15 16 79 80 81 83 84 85 86 87 88 90 91 93 94 95 96 97 98 99 101 103 106 112"},E:{"11":0.00209,"14":0.08585,_:"0 4 5 6 7 8 9 10 12 13 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 15.5 16.0","13.1":0.00419,"14.1":0.00628,"15.1":0.00209,"15.2-15.3":0.01675,"15.4":0.02094,"15.6":0.07538,"16.1":0.05235,"16.2":0.00209,"16.3":0.01466,"16.4":0.01675,"16.5":0.0356,"16.6":0.19055,"17.0":0.05235,"17.1":0.07957,"17.2":0.00209},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00052,"5.0-5.1":0.00052,"6.0-6.1":0.00129,"7.0-7.1":0.0018,"8.1-8.4":0.00026,"9.0-9.2":0.00206,"9.3":0.00644,"10.0-10.2":0.00052,"10.3":0.00928,"11.0-11.2":0.00438,"11.3-11.4":0.00387,"12.0-12.1":0.00232,"12.2-12.5":0.04227,"13.0-13.1":0.00103,"13.2":0.00438,"13.3":0.00258,"13.4-13.7":0.00747,"14.0-14.4":0.01985,"14.5-14.8":0.03222,"15.0-15.1":0.01263,"15.2-15.3":0.01546,"15.4":0.01727,"15.5":0.02423,"15.6-15.7":0.12732,"16.0":0.05979,"16.1":0.11985,"16.2":0.05748,"16.3":0.10773,"16.4":0.02217,"16.5":0.05722,"16.6-16.7":0.96986,"17.0":0.29047,"17.1":0.48789,"17.2":0.01392},P:{"4":0.01018,"20":0.06108,"21":0.02036,"22":0.34611,"23":0.33593,_:"5.0-5.4 6.2-6.4 8.2 11.1-11.2 13.0","7.2-7.4":0.16287,"9.2":0.01018,"10.1":0.07126,"12.0":0.03054,"14.0":0.13234,"15.0":0.01018,"16.0":0.08144,"17.0":0.01018,"18.0":0.0509,"19.0":0.22395},I:{"0":0.03933,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.00012},K:{"0":0.02744,_:"10 11 12 11.1 11.5 12.1"},A:{"10":0.01523,"11":0.02665,_:"6 7 8 9 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.18184},H:{"0":0.02},L:{"0":81.19532},R:{_:"0"},M:{"0":0.08697},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/WF.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/WF.js
    index 977ebe119df320..aa2cec50110f35 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/WF.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/WF.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0.10076,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.56953,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.07448,"92":0.10076,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.81487,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.86744,"116":0.10076,"117":1.3844,"118":0.12267,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.02629,"100":0,"101":0,"102":0,"103":0.02629,"104":0,"105":0.04819,"106":0,"107":0,"108":0,"109":6.5014,"110":0.02629,"111":0,"112":0,"113":0,"114":0.02629,"115":0.71848,"116":3.4347,"117":0.46877,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0.04819,"102":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0.02629,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0.02629,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.04819,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0.02629,"116":1.97583,"117":0.12267},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.02629,"14.1":0.04819,"15.1":0.04819,"15.2-15.3":0.12267,"15.4":0.07448,"15.5":0,"15.6":0.10076,"16.0":0.07448,"16.1":0,"16.2":0,"16.3":0,"16.4":0,"16.5":0.22343,"16.6":0.31981,"17.0":0.02629,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0,"14.0-14.4":0.15658,"14.5-14.8":0.07757,"15.0-15.1":0.46831,"15.2-15.3":0.54588,"15.4":0.07757,"15.5":0,"15.6-15.7":0,"16.0":0,"16.1":1.40493,"16.2":0.78004,"16.3":1.95225,"16.4":0,"16.5":2.1864,"16.6":6.24604,"17.0":0.46831,"17.1":0},P:{"4":0,"20":0.06029,"21":0.7335,"22":2.8938,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0,"17.0":0,"18.0":0,"19.0":0.06029},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":57.26833},R:{_:"0"},M:{"0":0},Q:{"13.1":0},O:{"0":0},H:{"0":2.36195}};
    +module.exports={C:{"60":0.064,"78":0.064,"91":0.31999,"92":0.128,"115":1.28578,"118":0.128,"119":6.02745,"120":0.51198,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 89 90 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 116 117 121 122 123 3.5 3.6"},D:{"85":0.128,"105":0.19199,"109":28.6711,"110":0.19199,"116":0.128,"118":0.95997,"119":6.60925,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 83 84 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 106 107 108 111 112 113 114 115 117 120 121 122"},F:{"102":0.128,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 103 104 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"101":0.128,"116":0.25599,"118":0.63998,"119":2.56574,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 102 103 104 105 106 107 108 109 110 111 112 113 114 115 117"},E:{_:"0 4 5 6 7 8 9 10 11 12 13 14 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 13.1 14.1 15.5 16.2 16.4 17.2","15.1":0.63998,"15.2-15.3":0.064,"15.4":0.128,"15.6":0.064,"16.0":0.064,"16.1":0.51198,"16.3":0.19199,"16.5":0.064,"16.6":1.02397,"17.0":0.128,"17.1":0.51198},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00278,"5.0-5.1":0.00278,"6.0-6.1":0.00696,"7.0-7.1":0.00974,"8.1-8.4":0.00139,"9.0-9.2":0.01113,"9.3":0.03479,"10.0-10.2":0.00278,"10.3":0.0501,"11.0-11.2":0.02366,"11.3-11.4":0.02088,"12.0-12.1":0.01253,"12.2-12.5":0.22825,"13.0-13.1":0.00557,"13.2":0.02366,"13.3":0.01392,"13.4-13.7":0.04036,"14.0-14.4":0.10717,"14.5-14.8":0.17397,"15.0-15.1":0.0682,"15.2-15.3":0.08351,"15.4":0.09325,"15.5":0.13083,"15.6-15.7":0.68753,"16.0":0.32289,"16.1":0.64717,"16.2":0.31036,"16.3":0.58176,"16.4":0.11969,"16.5":0.30897,"16.6-16.7":5.23723,"17.0":1.56852,"17.1":2.63462,"17.2":0.07516},P:{"22":0.06077,"23":1.49911,_:"4 20 21 5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0"},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{"0":0,_:"10 11 12 11.1 11.5 12.1"},A:{_:"6 7 8 9 10 11 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{_:"0"},H:{"0":0},L:{"0":30.95406},R:{_:"0"},M:{"0":0.19655},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/WS.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/WS.js
    index 689b523a3f390d..a27bdb062ceedf 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/WS.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/WS.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0.00307,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0.00307,"107":0,"108":0,"109":0,"110":0.01227,"111":0,"112":0,"113":0.00307,"114":0,"115":0.03988,"116":0.00614,"117":0.14726,"118":0.02148,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.01227,"69":0.00307,"70":0.00614,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.01534,"80":0,"81":0.00614,"83":0,"84":0,"85":0,"86":0,"87":0.00307,"88":0.02148,"89":0,"90":0,"91":0.00307,"92":0.00307,"93":0.12579,"94":0,"95":0.00614,"96":0.00614,"97":0,"98":0,"99":0.00307,"100":0,"101":0.00307,"102":0,"103":0.03068,"104":0,"105":0.00614,"106":0.00307,"107":0.00307,"108":0.0092,"109":0.52156,"110":0.01227,"111":0.00307,"112":0,"113":0.03375,"114":0.19942,"115":0.20556,"116":3.2122,"117":0.65655,"118":0.0092,"119":0.0092,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0.02454,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.07056,"70":0.00614,"71":0,"72":0.01534,"73":0.02148,"74":0,"75":0,"76":0,"77":0.00307,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.0092,"101":0.01534,"102":0.01534,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0.00307,"14":0,"15":0.00307,"16":0.0092,"17":0,"18":0.0092,"79":0,"80":0,"81":0,"83":0,"84":0.00307,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.0092,"93":0,"94":0.00614,"95":0,"96":0,"97":0,"98":0.00307,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.00307,"109":0.09511,"110":0,"111":0.00307,"112":0.00614,"113":0.01534,"114":0.01841,"115":0.09818,"116":0.65655,"117":0.47247},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00307,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0.00307,"12.1":0.00307,"13.1":0.0092,"14.1":0.00307,"15.1":0.00614,"15.2-15.3":0,"15.4":0.00614,"15.5":0.03682,"15.6":0.77927,"16.0":0,"16.1":0.00614,"16.2":0,"16.3":0.0092,"16.4":0.00307,"16.5":0.03375,"16.6":0.30373,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00344,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.031,"10.0-10.2":0,"10.3":0.11024,"11.0-11.2":0.17397,"11.3-11.4":0.00344,"12.0-12.1":0.01722,"12.2-12.5":0.48574,"13.0-13.1":0.00344,"13.2":0.01206,"13.3":0,"13.4-13.7":0.06029,"14.0-14.4":0.1378,"14.5-14.8":0.30144,"15.0-15.1":0.12402,"15.2-15.3":0.04823,"15.4":0.11541,"15.5":0.37895,"15.6-15.7":4.21323,"16.0":0.37206,"16.1":1.24881,"16.2":0.86642,"16.3":0.64766,"16.4":0.91292,"16.5":1.18163,"16.6":5.52233,"17.0":0.18258,"17.1":0},P:{"4":0.07131,"20":0.20373,"21":2.26144,"22":4.37008,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.16299,"8.2":0.02037,"9.2":0.01019,"10.1":0,"11.1-11.2":0.04075,"12.0":0,"13.0":0.03056,"14.0":0.06112,"15.0":0.02037,"16.0":0.81493,"17.0":0.01019,"18.0":0.09168,"19.0":0.17317},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00988,"4.4":0,"4.4.3-4.4.4":0.11853},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00307,"5.5":0},S:{"2.5":0.01386,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":60.84102},R:{_:"0"},M:{"0":0.0208},Q:{"13.1":0},O:{"0":0.15944},H:{"0":1.91633}};
    +module.exports={C:{"77":0.01722,"110":0.6886,"111":0.00344,"115":0.35807,"118":0.02066,"119":0.69204,"120":0.22724,"121":0.01722,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 112 113 114 116 117 122 123 3.5 3.6"},D:{"48":0.00344,"50":0.00344,"59":0.03099,"63":0.00344,"68":0.04132,"70":0.0723,"71":0.00344,"74":0.0241,"80":0.00689,"86":0.00344,"88":0.02066,"90":0.00344,"91":0.05165,"92":0.01722,"93":0.28233,"94":0.27544,"95":0.00689,"97":0.00344,"98":0.01033,"99":0.00689,"101":0.00689,"103":0.14461,"104":0.00689,"105":0.04132,"106":0.0723,"107":0.03099,"108":0.00689,"109":0.99503,"110":0.03443,"111":0.01033,"112":0.03099,"114":0.07919,"115":0.01377,"116":0.28233,"117":0.21347,"118":5.5811,"119":11.40666,"120":0.05165,"121":0.03787,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 49 51 52 53 54 55 56 57 58 60 61 62 64 65 66 67 69 72 73 75 76 77 78 79 81 83 84 85 87 89 96 100 102 113 122"},F:{"87":0.03443,"95":0.00344,"102":0.06886,"103":0.03787,"104":0.17215,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"90":0.01722,"92":0.03099,"94":0.00344,"109":0.3684,"111":0.00344,"112":0.00689,"113":0.03787,"114":0.11706,"115":0.04132,"116":0.11018,"117":0.23068,"118":0.58531,"119":2.83359,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 91 93 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110"},E:{"12":0.00689,"14":0.06886,_:"0 4 5 6 7 8 9 10 11 13 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 15.1 15.2-15.3 16.2 17.2","13.1":0.00344,"14.1":0.03099,"15.4":0.00689,"15.5":0.02066,"15.6":2.05547,"16.0":0.06197,"16.1":0.01722,"16.3":0.28233,"16.4":0.11018,"16.5":0.05509,"16.6":0.85042,"17.0":0.02066,"17.1":0.17904},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00213,"5.0-5.1":0.00213,"6.0-6.1":0.00533,"7.0-7.1":0.00746,"8.1-8.4":0.00107,"9.0-9.2":0.00853,"9.3":0.02665,"10.0-10.2":0.00213,"10.3":0.03838,"11.0-11.2":0.01812,"11.3-11.4":0.01599,"12.0-12.1":0.00959,"12.2-12.5":0.17482,"13.0-13.1":0.00426,"13.2":0.01812,"13.3":0.01066,"13.4-13.7":0.03091,"14.0-14.4":0.08208,"14.5-14.8":0.13325,"15.0-15.1":0.05223,"15.2-15.3":0.06396,"15.4":0.07142,"15.5":0.1002,"15.6-15.7":0.52661,"16.0":0.24731,"16.1":0.49569,"16.2":0.23772,"16.3":0.44559,"16.4":0.09168,"16.5":0.23665,"16.6-16.7":4.01138,"17.0":1.20139,"17.1":2.01795,"17.2":0.05756},P:{"4":0.062,"20":0.19633,"21":0.26866,"22":3.28592,"23":1.3433,_:"5.0-5.4 6.2-6.4 8.2 10.1","7.2-7.4":0.07233,"9.2":0.02067,"11.1-11.2":0.031,"12.0":0.01033,"13.0":0.04133,"14.0":0.02067,"15.0":0.05167,"16.0":0.16533,"17.0":0.05167,"18.0":0.155,"19.0":0.19633},I:{"0":0.01305,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00004},K:{"0":1.48821,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.05509,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.09178,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.03934},H:{"0":0},L:{"0":48.5661},R:{_:"0"},M:{"0":2.51095},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/YE.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/YE.js
    index a6707fd8d7fb14..63ef0937b8954a 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/YE.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/YE.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0.00216,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0.00216,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00216,"103":0.00216,"104":0,"105":0,"106":0.00216,"107":0,"108":0,"109":0,"110":0.00433,"111":0.00216,"112":0,"113":0,"114":0.00216,"115":0.06922,"116":0.00433,"117":0.08003,"118":0.01298,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0.00216,"58":0.00649,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0.01298,"68":0.00216,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.00216,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0.00216,"87":0.00649,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0.00216,"99":0.00216,"100":0.00216,"101":0,"102":0,"103":0.00433,"104":0,"105":0.00216,"106":0,"107":0.01298,"108":0.00216,"109":0.19467,"110":0,"111":0,"112":0.00649,"113":0.00649,"114":0.01298,"115":0.02812,"116":0.87602,"117":0.15357,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00216,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0.00216,"71":0.00216,"72":0.00216,"73":0,"74":0,"75":0.00649,"76":0,"77":0.01947,"78":0,"79":0.00649,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00433,"101":0.00216,"102":0.00433,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.1168},B:{"12":0.00216,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00433,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0.00433,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0.00216,"113":0,"114":0.00865,"115":0.03028,"116":0.20332,"117":0.16006},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.01947,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00433,"14.1":0,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0,"15.6":0.00433,"16.0":0,"16.1":0.00433,"16.2":0,"16.3":0.00216,"16.4":0,"16.5":0,"16.6":0.02596,"17.0":0,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.04563,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.29661,"8.1-8.4":0,"9.0-9.2":0.00067,"9.3":0.00268,"10.0-10.2":0,"10.3":0.00201,"11.0-11.2":0.00067,"11.3-11.4":0.00738,"12.0-12.1":0.00336,"12.2-12.5":0.33621,"13.0-13.1":0,"13.2":0.00067,"13.3":0.02215,"13.4-13.7":0.04496,"14.0-14.4":0.13757,"14.5-14.8":0.11274,"15.0-15.1":0.12415,"15.2-15.3":0.04429,"15.4":0.12146,"15.5":0.05234,"15.6-15.7":0.63013,"16.0":0.29661,"16.1":0.23689,"16.2":0.25165,"16.3":0.23957,"16.4":0.22414,"16.5":0.61671,"16.6":2.66415,"17.0":0.15703,"17.1":0},P:{"4":0.09231,"20":0.06154,"21":0.2564,"22":2.07174,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.01026,"8.2":0,"9.2":0.01026,"10.1":0,"11.1-11.2":0.11282,"12.0":0,"13.0":0.02051,"14.0":0.13333,"15.0":0.01026,"16.0":0.15384,"17.0":0.17435,"18.0":0.02051,"19.0":0.06154},I:{"0":0,"3":0,"4":0.00343,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00343,"4.2-4.3":0.01116,"4.4":0,"4.4.3-4.4.4":0.05063},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":62.74652},R:{_:"0"},M:{"0":0.18809},Q:{"13.1":0},O:{"0":16.31663},H:{"0":3.29429}};
    +module.exports={C:{"33":0.00221,"43":0.00221,"49":0.04855,"52":0.00662,"53":0.00221,"56":0.00221,"57":0.04635,"60":0.01324,"61":0.00221,"72":0.00662,"73":0.00221,"74":0.00221,"85":0.11697,"104":0.00221,"106":0.00662,"110":0.10373,"112":0.00441,"113":0.00221,"114":0.00883,"115":0.11918,"116":0.00883,"117":0.00441,"118":0.05959,"119":0.59148,"120":0.04635,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 37 38 39 40 41 42 44 45 46 47 48 50 51 54 55 58 59 62 63 64 65 66 67 68 69 70 71 75 76 77 78 79 80 81 82 83 84 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 105 107 108 109 111 121 122 123 3.5 3.6"},D:{"37":0.00441,"38":0.00221,"43":0.00221,"46":0.00221,"51":0.00221,"54":0.00221,"55":0.00883,"56":0.00441,"57":0.01324,"58":0.18318,"60":0.00221,"62":0.00221,"63":0.00662,"66":0.00221,"67":0.19422,"68":0.00883,"69":0.00221,"70":0.00883,"71":0.00662,"72":0.00441,"73":0.00221,"74":0.01104,"78":0.01324,"79":0.01766,"80":0.02648,"81":0.00441,"84":0.00221,"85":0.00221,"86":0.01986,"87":0.0309,"88":0.00441,"89":0.00883,"90":0.00221,"91":0.00441,"92":0.00441,"93":0.01104,"94":0.00441,"95":0.01104,"96":0.01104,"97":0.00441,"98":0.00883,"99":0.00883,"100":0.01104,"102":0.00883,"103":0.00883,"104":0.00883,"105":0.00883,"106":0.01986,"107":0.01545,"108":0.05518,"109":1.58683,"110":0.00883,"111":0.03531,"112":0.02648,"113":0.01324,"114":0.05518,"115":0.0309,"116":0.08387,"117":0.19863,"118":2.18714,"119":4.00571,"120":0.01324,"121":0.00441,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 39 40 41 42 44 45 47 48 49 50 52 53 59 61 64 65 75 76 77 83 101 122"},F:{"30":0.00221,"34":0.00221,"53":0.00221,"67":0.00221,"77":0.00221,"79":0.00662,"85":0.00662,"95":0.00662,"101":0.00221,"102":0.01545,"103":0.02207,"104":0.03752,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 54 55 56 57 58 60 62 63 64 65 66 68 69 70 71 72 73 74 75 76 78 80 81 82 83 84 86 87 88 89 90 91 92 93 94 96 97 98 99 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00662,"17":0.00441,"18":0.00441,"84":0.01324,"89":0.00221,"90":0.04855,"92":0.03311,"97":0.00221,"100":0.00441,"104":0.00221,"105":0.00221,"109":0.00441,"110":0.00221,"112":0.00221,"113":0.00662,"114":0.02428,"115":0.00883,"116":0.01324,"117":0.02648,"118":0.42374,"119":1.15868,_:"13 14 15 16 79 80 81 83 85 86 87 88 91 93 94 95 96 98 99 101 102 103 106 107 108 111"},E:{_:"0 4 5 6 7 8 9 10 11 12 13 14 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1 12.1 13.1 15.1 15.2-15.3 15.5 16.2 16.4","5.1":0.08607,"14.1":0.00221,"15.4":0.00221,"15.6":0.04414,"16.0":0.00662,"16.1":0.00883,"16.3":0.00221,"16.5":0.01545,"16.6":0.04414,"17.0":0.00883,"17.1":0.05297,"17.2":0.00221},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00067,"5.0-5.1":0.00067,"6.0-6.1":0.00167,"7.0-7.1":0.00234,"8.1-8.4":0.00033,"9.0-9.2":0.00267,"9.3":0.00836,"10.0-10.2":0.00067,"10.3":0.01204,"11.0-11.2":0.00568,"11.3-11.4":0.00502,"12.0-12.1":0.00301,"12.2-12.5":0.05484,"13.0-13.1":0.00134,"13.2":0.00568,"13.3":0.00334,"13.4-13.7":0.0097,"14.0-14.4":0.02575,"14.5-14.8":0.0418,"15.0-15.1":0.01638,"15.2-15.3":0.02006,"15.4":0.0224,"15.5":0.03143,"15.6-15.7":0.16518,"16.0":0.07757,"16.1":0.15548,"16.2":0.07456,"16.3":0.13976,"16.4":0.02876,"16.5":0.07423,"16.6-16.7":1.25821,"17.0":0.37683,"17.1":0.63295,"17.2":0.01806},P:{"4":0.11181,"20":0.08131,"21":0.21345,"22":0.46755,"23":1.65677,"5.0-5.4":0.02033,"6.2-6.4":0.01016,"7.2-7.4":0.12197,_:"8.2 10.1","9.2":0.08131,"11.1-11.2":0.17279,"12.0":0.02033,"13.0":0.07115,"14.0":0.13213,"15.0":0.02033,"16.0":0.26427,"17.0":0.1423,"18.0":0.05082,"19.0":0.07115},I:{"0":0.21714,"3":0.00002,"4":0.00004,"2.1":0,"2.2":0.00004,"2.3":0,"4.1":0.00002,"4.2-4.3":0.00015,"4.4":0,"4.4.3-4.4.4":0.00065},K:{"0":1.44378,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00221,"11":0.05738,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.01559,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":6.25079},H:{"0":11.05},L:{"0":60.90423},R:{_:"0"},M:{"0":0.14029},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/YT.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/YT.js
    index b961ddd5370a74..649b33f33021d2 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/YT.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/YT.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00935,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.0187,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0.00467,"94":0,"95":0,"96":0.00467,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.0187,"103":0,"104":0.00467,"105":0,"106":0,"107":0,"108":0.00467,"109":0,"110":0.00935,"111":0,"112":0.00467,"113":0.00467,"114":0,"115":0.1262,"116":0.07946,"117":2.63146,"118":0.19163,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0.00467,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0.00935,"62":0,"63":0.00467,"64":0,"65":0,"66":0,"67":0,"68":0.00467,"69":0.00467,"70":0.00935,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0.00935,"80":0,"81":0.0187,"83":0.00467,"84":0,"85":0.00467,"86":0,"87":0.02337,"88":0.02804,"89":0,"90":0.00467,"91":0.00467,"92":0.00467,"93":0,"94":0.00935,"95":0,"96":0,"97":0.00467,"98":0,"99":0,"100":0.00467,"101":0,"102":0,"103":0.02804,"104":0,"105":0.00935,"106":0.02804,"107":0,"108":0.00467,"109":0.57023,"110":0.00467,"111":0,"112":0.01402,"113":0.02804,"114":0.13555,"115":0.14022,"116":6.95491,"117":1.83221,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0.02804,"70":0.00467,"71":0.00935,"72":0.00467,"73":0,"74":0,"75":0,"76":0,"77":0.00467,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00935,"96":0,"97":0,"98":0,"99":0.00467,"100":0.00935,"101":0.17294,"102":0.16826,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0.00467,"86":0,"87":0,"88":0,"89":0.00467,"90":0,"91":0,"92":0.00467,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.02337,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00935,"110":0.00467,"111":0,"112":0.00935,"113":0.00935,"114":0.04674,"115":0.06076,"116":3.68779,"117":1.57046},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00935,"15":0.01402,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.06076,"14.1":0.06544,"15.1":0.01402,"15.2-15.3":0,"15.4":0.00467,"15.5":0.02337,"15.6":0.45338,"16.0":0.00935,"16.1":0.04207,"16.2":0.02337,"16.3":0.07946,"16.4":0.00935,"16.5":0.16359,"16.6":0.73382,"17.0":0.22903,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0.00338,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0.0575,"11.0-11.2":0.0372,"11.3-11.4":0.00338,"12.0-12.1":0,"12.2-12.5":0.26719,"13.0-13.1":0.01184,"13.2":0,"13.3":0.02875,"13.4-13.7":0.04228,"14.0-14.4":0.02029,"14.5-14.8":0.33145,"15.0-15.1":0.04228,"15.2-15.3":0.10654,"15.4":0.06595,"15.5":0.14374,"15.6-15.7":1.08907,"16.0":0.39064,"16.1":0.52931,"16.2":0.48873,"16.3":1.05186,"16.4":0.23337,"16.5":2.52142,"16.6":8.28299,"17.0":0.969,"17.1":0.00338},P:{"4":0.01015,"20":0.12179,"21":0.22327,"22":2.6387,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.28417,"8.2":0.0203,"9.2":0.0203,"10.1":0.10149,"11.1-11.2":0.27402,"12.0":0.06089,"13.0":0.10149,"14.0":0.03045,"15.0":0,"16.0":0.15223,"17.0":0.01015,"18.0":0.08119,"19.0":0.23342},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.01324,"4.4":0,"4.4.3-4.4.4":0.07284},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00935,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":53.56256},R:{_:"0"},M:{"0":1.02259},Q:{"13.1":0.01065},O:{"0":0.01598},H:{"0":0.60508}};
    +module.exports={C:{"72":0.00659,"78":0.03951,"89":0.00659,"91":0.00659,"102":0.00659,"107":0.01317,"108":0.00659,"112":0.01317,"113":0.00659,"115":0.12512,"116":0.00659,"117":0.00659,"118":0.01976,"119":3.1608,"120":0.58607,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 90 92 93 94 95 96 97 98 99 100 101 103 104 105 106 109 110 111 114 121 122 123 3.5 3.6"},D:{"39":0.00659,"47":0.01976,"76":0.01976,"79":0.01976,"81":0.00659,"83":0.00659,"86":0.01317,"87":0.01976,"88":0.00659,"90":0.00659,"91":0.00659,"95":0.00659,"97":0.00659,"99":0.01976,"100":0.01976,"101":0.00659,"102":0.00659,"103":0.02634,"107":0.01976,"108":0.03293,"109":0.29633,"111":0.0461,"113":0.00659,"114":0.01317,"115":0.0461,"116":0.17121,"117":0.3095,"118":38.83175,"119":11.20109,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 40 41 42 43 44 45 46 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 77 78 80 84 85 89 92 93 94 96 98 104 105 106 110 112 120 121 122"},F:{"102":0.07244,"103":0.15146,"104":0.40169,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"92":0.00659,"108":0.03293,"109":0.01976,"114":0.00659,"115":0.01317,"117":0.15146,"118":0.59265,"119":4.24733,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 110 111 112 113 116"},E:{"14":0.01976,"15":0.01317,_:"0 4 5 6 7 8 9 10 11 12 13 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 16.0","12.1":0.01317,"13.1":0.01976,"14.1":0.25682,"15.1":0.00659,"15.2-15.3":0.00659,"15.4":0.01317,"15.5":0.01317,"15.6":0.58607,"16.1":0.05927,"16.2":0.01976,"16.3":0.05268,"16.4":0.01317,"16.5":0.16463,"16.6":0.75069,"17.0":0.11195,"17.1":1.02726,"17.2":0.00659},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00121,"5.0-5.1":0.00121,"6.0-6.1":0.00302,"7.0-7.1":0.00422,"8.1-8.4":0.0006,"9.0-9.2":0.00483,"9.3":0.01509,"10.0-10.2":0.00121,"10.3":0.02172,"11.0-11.2":0.01026,"11.3-11.4":0.00905,"12.0-12.1":0.00543,"12.2-12.5":0.09896,"13.0-13.1":0.00241,"13.2":0.01026,"13.3":0.00603,"13.4-13.7":0.0175,"14.0-14.4":0.04646,"14.5-14.8":0.07543,"15.0-15.1":0.02957,"15.2-15.3":0.03621,"15.4":0.04043,"15.5":0.05672,"15.6-15.7":0.29809,"16.0":0.14,"16.1":0.2806,"16.2":0.13457,"16.3":0.25223,"16.4":0.0519,"16.5":0.13396,"16.6-16.7":2.27071,"17.0":0.68007,"17.1":1.14229,"17.2":0.03259},P:{"20":0.01031,"21":0.04124,"22":0.18559,"23":1.14445,_:"4 5.0-5.4 6.2-6.4 8.2 9.2 10.1 12.0 14.0 15.0 17.0","7.2-7.4":0.11341,"11.1-11.2":0.12372,"13.0":0.30931,"16.0":0.04124,"18.0":0.01031,"19.0":0.17528},I:{"0":0.0034,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0.00001},K:{"0":0.181,_:"10 11 12 11.1 11.5 12.1"},A:{_:"6 7 8 9 10 11 5.5"},N:{_:"10 11"},S:{"2.5":0.00342,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.01025},H:{"0":0},L:{"0":26.85067},R:{_:"0"},M:{"0":0.43371},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ZA.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ZA.js
    index a5489a0e667a07..b87ded3a39cc54 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ZA.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ZA.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.00201,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0.00201,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00201,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00403,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.00201,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.00201,"103":0,"104":0.00201,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0.00201,"111":0.00201,"112":0.00201,"113":0.00403,"114":0.00201,"115":0.01812,"116":0.01409,"117":0.1389,"118":0.01208,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0.00201,"50":0.00201,"51":0,"52":0,"53":0,"54":0,"55":0.00201,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0.00403,"67":0,"68":0,"69":0,"70":0.00201,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0.00201,"79":0.00201,"80":0,"81":0.01007,"83":0.00201,"84":0,"85":0.00201,"86":0.00201,"87":0.00201,"88":0.00403,"89":0,"90":0,"91":0.00201,"92":0,"93":0.08857,"94":0.00201,"95":0,"96":0,"97":0,"98":0.00201,"99":0.00805,"100":0.00201,"101":0.00201,"102":0.00201,"103":0.00604,"104":0.00201,"105":0.00201,"106":0.00403,"107":0.00201,"108":0.00403,"109":0.13286,"110":0.00201,"111":0.00403,"112":0.00403,"113":0.00805,"114":0.02416,"115":0.0463,"116":1.41917,"117":0.3563,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.00201,"27":0,"28":0.00403,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0.00201,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0.00201,"52":0,"53":0,"54":0.00201,"55":0,"56":0.00201,"57":0.00201,"58":0.00201,"60":0.00604,"62":0,"63":0.00805,"64":0.00403,"65":0.00604,"66":0.00604,"67":0.01007,"68":0.00201,"69":0.07851,"70":0.02617,"71":0.02617,"72":0.1852,"73":0.03825,"74":0.00201,"75":0,"76":0.00201,"77":0.02214,"78":0.00201,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.00403,"96":0,"97":0,"98":0,"99":0,"100":0.00604,"101":0.0302,"102":0.02818,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00201},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0.00201,"18":0.00201,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0.00201,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.00604,"110":0.00201,"111":0.00201,"112":0.00403,"113":0.00201,"114":0.00805,"115":0.01409,"116":0.26572,"117":0.16909},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00403,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0.00201,"12.1":0.00201,"13.1":0.00604,"14.1":0.00604,"15.1":0.00201,"15.2-15.3":0.00201,"15.4":0.00201,"15.5":0.00403,"15.6":0.02214,"16.0":0.00403,"16.1":0.00604,"16.2":0.00604,"16.3":0.0161,"16.4":0.00604,"16.5":0.0161,"16.6":0.1087,"17.0":0.00604,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00144,"6.0-6.1":0,"7.0-7.1":0.00287,"8.1-8.4":0.00575,"9.0-9.2":0.01149,"9.3":0.05314,"10.0-10.2":0,"10.3":0.03304,"11.0-11.2":0.00144,"11.3-11.4":0.00575,"12.0-12.1":0.00144,"12.2-12.5":0.32748,"13.0-13.1":0.01005,"13.2":0.00287,"13.3":0.02154,"13.4-13.7":0.04165,"14.0-14.4":0.09336,"14.5-14.8":0.2255,"15.0-15.1":0.05745,"15.2-15.3":0.08187,"15.4":0.09192,"15.5":0.16949,"15.6-15.7":1.27545,"16.0":0.34759,"16.1":0.65065,"16.2":0.2887,"16.3":0.69805,"16.4":0.15656,"16.5":0.50559,"16.6":8.391,"17.0":0.65496,"17.1":0.00144},P:{"4":0.1519,"20":0.19241,"21":0.37469,"22":6.46085,"5.0-5.4":0.01013,"6.2-6.4":0.01013,"7.2-7.4":0.36456,"8.2":0,"9.2":0.01013,"10.1":0.01013,"11.1-11.2":0.05063,"12.0":0.02025,"13.0":0.04051,"14.0":0.04051,"15.0":0.03038,"16.0":0.08101,"17.0":0.08101,"18.0":0.06076,"19.0":0.19241},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00663,"4.4":0,"4.4.3-4.4.4":0.04142},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01007,"5.5":0},S:{"2.5":0.00799,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":67.46044},R:{_:"0"},M:{"0":0.48721},Q:{"13.1":0.00799},O:{"0":0.51916},H:{"0":2.98682}};
    +module.exports={C:{"34":0.00579,"52":0.00772,"59":0.00386,"60":0.00193,"72":0.00193,"78":0.00965,"88":0.00386,"91":0.00193,"94":0.00386,"99":0.00193,"100":0.00193,"102":0.00193,"104":0.00579,"105":0.00193,"107":0.00193,"108":0.00193,"109":0.00193,"110":0.00193,"111":0.00193,"112":0.00579,"113":0.00386,"114":0.00193,"115":0.08299,"116":0.00772,"117":0.00386,"118":0.02895,"119":0.4053,"120":0.10422,"121":0.00193,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 54 55 56 57 58 61 62 63 64 65 66 67 68 69 70 71 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 90 92 93 95 96 97 98 101 103 106 122 123 3.5 3.6"},D:{"11":0.00193,"38":0.00193,"49":0.00772,"50":0.01544,"52":0.00772,"55":0.00193,"56":0.00193,"65":0.00193,"66":0.01737,"67":0.00772,"69":0.00386,"70":0.00772,"72":0.00193,"73":0.00193,"74":0.00579,"75":0.00193,"77":0.00193,"78":0.00772,"79":0.01544,"80":0.00193,"81":0.00579,"83":0.00386,"84":0.00193,"85":0.00193,"86":0.01158,"87":0.00579,"88":0.02123,"89":0.00193,"90":0.00386,"91":0.00386,"92":0.00386,"93":0.31266,"94":0.00579,"95":0.00386,"96":0.00193,"97":0.00193,"98":0.00386,"99":0.03667,"100":0.01158,"101":0.01737,"102":0.01544,"103":0.02895,"104":0.01544,"105":0.01158,"106":0.00965,"107":0.00772,"108":0.01158,"109":0.63111,"110":0.00579,"111":0.01351,"112":0.01351,"113":0.02123,"114":0.04246,"115":0.02895,"116":0.12159,"117":0.14668,"118":1.81806,"119":7.28189,"120":0.00772,"121":0.00193,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 47 48 51 53 54 57 58 59 60 61 62 63 64 68 71 76 122"},F:{"28":0.00386,"79":0.00193,"95":0.0193,"102":0.0772,"103":0.04825,"104":0.15054,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00386,"13":0.00193,"14":0.01544,"15":0.00193,"16":0.00193,"17":0.00772,"18":0.00772,"84":0.00193,"85":0.00193,"89":0.00193,"90":0.00193,"91":0.00193,"92":0.00579,"100":0.00193,"102":0.00193,"106":0.00193,"107":0.00193,"108":0.00193,"109":0.03088,"110":0.00193,"111":0.00772,"112":0.00965,"113":0.00772,"114":0.01158,"115":0.01158,"116":0.03474,"117":0.05597,"118":0.40916,"119":1.76209,_:"79 80 81 83 86 87 88 93 94 95 96 97 98 99 101 103 104 105"},E:{"8":0.00193,"13":0.00193,"14":0.02509,"15":0.00193,_:"0 4 5 6 7 9 10 11 12 3.1 3.2 6.1 7.1 9.1 10.1","5.1":0.00193,"11.1":0.01351,"12.1":0.00579,"13.1":0.03281,"14.1":0.03474,"15.1":0.00579,"15.2-15.3":0.01351,"15.4":0.01351,"15.5":0.01544,"15.6":0.12545,"16.0":0.01544,"16.1":0.03088,"16.2":0.02316,"16.3":0.06948,"16.4":0.02895,"16.5":0.05404,"16.6":0.33196,"17.0":0.10036,"17.1":0.16598,"17.2":0.00386},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00216,"5.0-5.1":0.00216,"6.0-6.1":0.0054,"7.0-7.1":0.00756,"8.1-8.4":0.00108,"9.0-9.2":0.00864,"9.3":0.02701,"10.0-10.2":0.00216,"10.3":0.0389,"11.0-11.2":0.01837,"11.3-11.4":0.01621,"12.0-12.1":0.00973,"12.2-12.5":0.17721,"13.0-13.1":0.00432,"13.2":0.01837,"13.3":0.01081,"13.4-13.7":0.03134,"14.0-14.4":0.0832,"14.5-14.8":0.13507,"15.0-15.1":0.05295,"15.2-15.3":0.06483,"15.4":0.0724,"15.5":0.10157,"15.6-15.7":0.5338,"16.0":0.25069,"16.1":0.50247,"16.2":0.24097,"16.3":0.45168,"16.4":0.09293,"16.5":0.23989,"16.6-16.7":4.0662,"17.0":1.21781,"17.1":2.04552,"17.2":0.05835},P:{"4":0.17275,"20":0.12194,"21":0.24388,"22":0.74182,"23":6.33084,_:"5.0-5.4 6.2-6.4 8.2 10.1","7.2-7.4":0.36583,"9.2":0.01016,"11.1-11.2":0.05081,"12.0":0.02032,"13.0":0.04065,"14.0":0.05081,"15.0":0.02032,"16.0":0.06097,"17.0":0.08129,"18.0":0.06097,"19.0":0.17275},I:{"0":0.03212,"3":0,"4":0.00001,"2.1":0,"2.2":0.00001,"2.3":0,"4.1":0,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.0001},K:{"0":3.06958,_:"10 11 12 11.1 11.5 12.1"},A:{"11":0.03474,_:"6 7 8 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.00807,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.45999},H:{"0":0.11},L:{"0":60.69857},R:{_:"0"},M:{"0":0.50034},Q:{"13.1":0.00807}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ZM.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ZM.js
    index 48c253ea439a71..d459ee1ec8ced6 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ZM.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ZM.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0.00237,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0.00237,"100":0,"101":0,"102":0.00475,"103":0.00237,"104":0,"105":0.00237,"106":0,"107":0,"108":0.00237,"109":0.00237,"110":0,"111":0.00237,"112":0,"113":0.00237,"114":0.00237,"115":0.0261,"116":0.01424,"117":0.12102,"118":0.01424,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.00237,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.00237,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0.00237,"59":0.00237,"60":0,"61":0,"62":0,"63":0,"64":0.00237,"65":0,"66":0,"67":0,"68":0.00237,"69":0,"70":0.00237,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0.00237,"78":0.00237,"79":0.00237,"80":0.00237,"81":0.00712,"83":0.00237,"84":0,"85":0,"86":0,"87":0.00237,"88":0.00237,"89":0,"90":0.00237,"91":0,"92":0.00237,"93":0.00237,"94":0.00475,"95":0.00475,"96":0,"97":0.00237,"98":0.00237,"99":0.00237,"100":0,"101":0,"102":0.00475,"103":0.00712,"104":0.00237,"105":0.00237,"106":0.00475,"107":0.00237,"108":0.00475,"109":0.19696,"110":0.00475,"111":0.00475,"112":0.00712,"113":0.00712,"114":0.03085,"115":0.0356,"116":1.19125,"117":0.43426,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0.00237,"25":0,"26":0.00237,"27":0.00237,"28":0.00475,"29":0,"30":0.00475,"31":0,"32":0.00237,"33":0.00237,"34":0,"35":0.01661,"36":0,"37":0.03797,"38":0,"39":0,"40":0,"41":0,"42":0.00475,"43":0,"44":0,"45":0,"46":0.00237,"47":0.00475,"48":0,"49":0,"50":0.00475,"51":0.00237,"52":0,"53":0,"54":0.00237,"55":0.00237,"56":0.00712,"57":0.00237,"58":0.00712,"60":0.18509,"62":0,"63":0.0617,"64":0.01661,"65":0.00949,"66":0.04746,"67":0.05695,"68":0.03085,"69":0.22544,"70":0.22781,"71":0.41053,"72":0.96581,"73":0.15662,"74":0.00237,"75":0.00237,"76":0.00949,"77":0.0261,"78":0.00475,"79":0.00475,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.02136,"96":0,"97":0,"98":0,"99":0.00237,"100":0.00237,"101":0.06644,"102":0.06882,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.00475},B:{"12":0.00475,"13":0.00237,"14":0,"15":0.00237,"16":0.00237,"17":0.00237,"18":0.01187,"79":0,"80":0,"81":0,"83":0,"84":0.00237,"85":0,"86":0,"87":0,"88":0,"89":0.00237,"90":0.00475,"91":0,"92":0.01187,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.00237,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0.00237,"108":0,"109":0.00949,"110":0.00237,"111":0.00237,"112":0.00475,"113":0.00475,"114":0.00949,"115":0.01898,"116":0.23967,"117":0.22781},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.00237,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0.00237,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.00237,"14.1":0.00475,"15.1":0,"15.2-15.3":0,"15.4":0,"15.5":0.00237,"15.6":0.00475,"16.0":0,"16.1":0,"16.2":0,"16.3":0.00237,"16.4":0.00237,"16.5":0.00712,"16.6":0.01661,"17.0":0.00237,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00445,"6.0-6.1":0,"7.0-7.1":0.01336,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.02821,"10.0-10.2":0.00148,"10.3":0.03266,"11.0-11.2":0.00594,"11.3-11.4":0.00297,"12.0-12.1":0.02969,"12.2-12.5":1.42905,"13.0-13.1":0.01782,"13.2":0,"13.3":0.01336,"13.4-13.7":0.0386,"14.0-14.4":0.1752,"14.5-14.8":0.14699,"15.0-15.1":0.13808,"15.2-15.3":0.12175,"15.4":0.11507,"15.5":0.15664,"15.6-15.7":1.70298,"16.0":0.18188,"16.1":0.18708,"16.2":0.15218,"16.3":0.29991,"16.4":0.1455,"16.5":0.4907,"16.6":1.44018,"17.0":0.2769,"17.1":0},P:{"4":0.11208,"20":0.07132,"21":0.15283,"22":0.64189,"5.0-5.4":0.01019,"6.2-6.4":0,"7.2-7.4":0.0917,"8.2":0,"9.2":0.05094,"10.1":0,"11.1-11.2":0.01019,"12.0":0,"13.0":0.01019,"14.0":0.02038,"15.0":0.01019,"16.0":0.05094,"17.0":0.03057,"18.0":0.02038,"19.0":0.05094},I:{"0":0,"3":0,"4":0.00097,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00097,"4.2-4.3":0.00145,"4.4":0,"4.4.3-4.4.4":0.1656},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.01661,"5.5":0},S:{"2.5":0.01525,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":67.27704},R:{_:"0"},M:{"0":0.09152},Q:{"13.1":0.01525},O:{"0":1.22795},H:{"0":14.04436}};
    +module.exports={C:{"34":0.00192,"47":0.00192,"52":0.00192,"65":0.00192,"68":0.00192,"78":0.00962,"88":0.00577,"99":0.00192,"103":0.00192,"108":0.00192,"110":0.00577,"112":0.00192,"113":0.00385,"114":0.00192,"115":0.11538,"116":0.00192,"117":0.00577,"118":0.04615,"119":0.56152,"120":0.14807,"121":0.00577,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 48 49 50 51 53 54 55 56 57 58 59 60 61 62 63 64 66 67 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 90 91 92 93 94 95 96 97 98 100 101 102 104 105 106 107 109 111 122 123 3.5 3.6"},D:{"11":0.00577,"27":0.00577,"42":0.00192,"43":0.00192,"46":0.00192,"49":0.00192,"50":0.00192,"51":0.00192,"53":0.00385,"55":0.00577,"56":0.00192,"57":0.00385,"59":0.00192,"60":0.00192,"63":0.00192,"64":0.00192,"65":0.00192,"68":0.00577,"69":0.00385,"70":0.00577,"71":0.00385,"73":0.00192,"74":0.00769,"75":0.00385,"76":0.00192,"77":0.00385,"78":0.00192,"79":0.00577,"80":0.01346,"81":0.00577,"83":0.00577,"84":0.00385,"85":0.00385,"86":0.00385,"87":0.01154,"88":0.01538,"89":0.02308,"90":0.00577,"91":0.00577,"92":0.00385,"93":0.00962,"94":0.01538,"95":0.01154,"96":0.00577,"97":0.00577,"98":0.00192,"99":0.00385,"100":0.00577,"101":0.00192,"102":0.025,"103":0.04038,"104":0.00385,"105":0.01923,"106":0.00769,"107":0.01538,"108":0.02692,"109":0.82304,"110":0.00192,"111":0.01346,"112":0.01923,"113":0.01346,"114":0.06346,"115":0.02692,"116":0.09807,"117":0.19422,"118":1.91723,"119":6.80357,"120":0.00385,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 28 29 30 31 32 33 34 35 36 37 38 39 40 41 44 45 47 48 52 54 58 61 62 66 67 72 121 122"},F:{"21":0.00192,"34":0.00577,"36":0.00192,"37":0.00192,"42":0.00385,"46":0.00192,"51":0.00192,"53":0.00192,"68":0.00192,"77":0.00192,"79":0.00769,"83":0.00192,"84":0.00192,"89":0.00192,"95":0.05769,"99":0.00385,"100":0.00192,"101":0.00192,"102":0.02692,"103":0.15576,"104":0.32691,_:"9 11 12 15 16 17 18 19 20 22 23 24 25 26 27 28 29 30 31 32 33 35 38 39 40 41 43 44 45 47 48 49 50 52 54 55 56 57 58 60 62 63 64 65 66 67 69 70 71 72 73 74 75 76 78 80 81 82 85 86 87 88 90 91 92 93 94 96 97 98 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.01731,"13":0.00577,"14":0.00385,"15":0.00192,"16":0.00577,"17":0.00577,"18":0.03846,"83":0.00577,"84":0.00577,"86":0.00385,"89":0.00577,"90":0.00577,"91":0.00192,"92":0.03846,"97":0.00192,"99":0.00192,"100":0.00385,"101":0.00192,"103":0.00385,"104":0.00192,"105":0.00192,"107":0.01346,"108":0.00192,"109":0.04231,"110":0.01346,"111":0.00192,"112":0.00192,"113":0.00769,"114":0.01538,"115":0.03269,"116":0.02692,"117":0.05769,"118":0.45767,"119":1.75378,_:"79 80 81 85 87 88 93 94 95 96 98 102 106"},E:{"13":0.00192,"14":0.00577,_:"0 4 5 6 7 8 9 10 11 12 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1 15.1 17.2","5.1":0.00385,"12.1":0.00192,"13.1":0.02115,"14.1":0.00769,"15.2-15.3":0.00192,"15.4":0.00385,"15.5":0.01538,"15.6":0.02308,"16.0":0.00192,"16.1":0.00192,"16.2":0.00385,"16.3":0.00962,"16.4":0.00192,"16.5":0.01923,"16.6":0.05192,"17.0":0.03461,"17.1":0.02885},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00105,"5.0-5.1":0.00105,"6.0-6.1":0.00261,"7.0-7.1":0.00366,"8.1-8.4":0.00052,"9.0-9.2":0.00418,"9.3":0.01306,"10.0-10.2":0.00105,"10.3":0.01881,"11.0-11.2":0.00888,"11.3-11.4":0.00784,"12.0-12.1":0.0047,"12.2-12.5":0.0857,"13.0-13.1":0.00209,"13.2":0.00888,"13.3":0.00523,"13.4-13.7":0.01515,"14.0-14.4":0.04024,"14.5-14.8":0.06532,"15.0-15.1":0.02561,"15.2-15.3":0.03135,"15.4":0.03501,"15.5":0.04912,"15.6-15.7":0.25816,"16.0":0.12124,"16.1":0.243,"16.2":0.11654,"16.3":0.21844,"16.4":0.04494,"16.5":0.11601,"16.6-16.7":1.96648,"17.0":0.58895,"17.1":0.98925,"17.2":0.02822},P:{"4":0.11232,"20":0.05105,"21":0.10211,"22":0.35737,"23":0.57179,"5.0-5.4":0.03063,"6.2-6.4":0.01021,"7.2-7.4":0.08168,_:"8.2 10.1","9.2":0.06126,"11.1-11.2":0.01021,"12.0":0.01021,"13.0":0.02042,"14.0":0.01021,"15.0":0.02042,"16.0":0.06126,"17.0":0.04084,"18.0":0.02042,"19.0":0.05105},I:{"0":0.08037,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00024},K:{"0":11.64551,_:"10 11 12 11.1 11.5 12.1"},A:{"10":0.00321,"11":0.03526,_:"6 7 8 9 5.5"},N:{_:"10 11"},S:{"2.5":0.00808,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.87232},H:{"0":1.73},L:{"0":63.2954},R:{_:"0"},M:{"0":0.09692},Q:{"13.1":0.00808}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ZW.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ZW.js
    index 57a075a9cb8ad7..8a142a271d22a2 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ZW.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/ZW.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0.0033,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0.0033,"49":0,"50":0,"51":0,"52":0.0033,"53":0,"54":0,"55":0,"56":0,"57":0.0033,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0.0033,"88":0.0033,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0.0033,"95":0,"96":0,"97":0.0033,"98":0,"99":0.0033,"100":0,"101":0,"102":0.00991,"103":0,"104":0,"105":0,"106":0.03962,"107":0,"108":0.0033,"109":0.0033,"110":0.0033,"111":0.0033,"112":0.0033,"113":0.0033,"114":0.0066,"115":0.09246,"116":0.03962,"117":0.36982,"118":0.03962,"119":0.0033,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0.0066,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0.0066,"41":0.0033,"42":0,"43":0,"44":0,"45":0,"46":0.0033,"47":0,"48":0,"49":0.0033,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0.0033,"56":0.0033,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0.0066,"64":0.00991,"65":0,"66":0,"67":0.0033,"68":0,"69":0.0033,"70":0.00991,"71":0.0033,"72":0,"73":0,"74":0.0066,"75":0,"76":0.0066,"77":0.0033,"78":0.0033,"79":0.02311,"80":0.0033,"81":0.0066,"83":0.0033,"84":0.0033,"85":0.0033,"86":0.0033,"87":0.0066,"88":0.0033,"89":0,"90":0.0033,"91":0.0033,"92":0.0033,"93":0.0033,"94":0.00991,"95":0.0066,"96":0.0066,"97":0.0066,"98":0.0066,"99":0.0066,"100":0.0033,"101":0.0066,"102":0.01321,"103":0.02642,"104":0.00991,"105":0.00991,"106":0.01981,"107":0.0066,"108":0.01321,"109":0.56794,"110":0.0066,"111":0.01321,"112":0.02972,"113":0.01981,"114":0.11887,"115":0.10897,"116":3.60248,"117":0.80899,"118":0.0033,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0.0033,"27":0,"28":0.00991,"29":0,"30":0,"31":0,"32":0.0066,"33":0,"34":0,"35":0.01321,"36":0.01981,"37":0.0033,"38":0.0066,"39":0,"40":0,"41":0,"42":0.02311,"43":0,"44":0,"45":0.0033,"46":0.00991,"47":0.0033,"48":0,"49":0,"50":0.02311,"51":0.0033,"52":0,"53":0,"54":0.0033,"55":0,"56":0,"57":0.0033,"58":0.06274,"60":0.07264,"62":0,"63":0.12878,"64":0.01981,"65":0.03302,"66":0.03302,"67":0.03632,"68":0.01651,"69":0.26086,"70":0.13868,"71":0.28067,"72":0.67691,"73":0.12878,"74":0,"75":0,"76":0.0033,"77":0.03302,"78":0.0033,"79":0.0066,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0.0066,"86":0.0033,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0.02972,"96":0,"97":0,"98":0.0033,"99":0.0033,"100":0.01651,"101":0.1717,"102":0.19812,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0.09576},B:{"12":0.00991,"13":0.0033,"14":0.02642,"15":0.0033,"16":0.0066,"17":0.0066,"18":0.03962,"79":0,"80":0,"81":0,"83":0,"84":0.0066,"85":0,"86":0,"87":0,"88":0,"89":0.0066,"90":0.0066,"91":0,"92":0.02642,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0.0066,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0.0033,"107":0.0033,"108":0.0033,"109":0.01321,"110":0.0033,"111":0.0033,"112":0.00991,"113":0.00991,"114":0.04623,"115":0.06934,"116":0.667,"117":0.46888},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0.0066,"15":0.0066,_:"0","3.1":0,"3.2":0,"5.1":0.0066,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0.0066,"14.1":0.05283,"15.1":0.0066,"15.2-15.3":0.0033,"15.4":0.0033,"15.5":0.0066,"15.6":0.05944,"16.0":0,"16.1":0.01321,"16.2":0.0033,"16.3":0.01321,"16.4":0.00991,"16.5":0.02642,"16.6":0.15189,"17.0":0.01321,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00235,"5.0-5.1":0.0047,"6.0-6.1":0,"7.0-7.1":0.00392,"8.1-8.4":0,"9.0-9.2":0,"9.3":0.06114,"10.0-10.2":0.00078,"10.3":0.02744,"11.0-11.2":0.00235,"11.3-11.4":0.00392,"12.0-12.1":0.00627,"12.2-12.5":0.27279,"13.0-13.1":0.00157,"13.2":0.00314,"13.3":0.01568,"13.4-13.7":0.03763,"14.0-14.4":0.08544,"14.5-14.8":0.17088,"15.0-15.1":0.10112,"15.2-15.3":0.09171,"15.4":0.07682,"15.5":0.13169,"15.6-15.7":0.88577,"16.0":0.29473,"16.1":0.41388,"16.2":0.26887,"16.3":0.45778,"16.4":0.19126,"16.5":0.52205,"16.6":3.1676,"17.0":0.45699,"17.1":0},P:{"4":0.14442,"20":0.09284,"21":0.17537,"22":1.05219,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.1341,"8.2":0,"9.2":0.01032,"10.1":0.01032,"11.1-11.2":0.02063,"12.0":0.02063,"13.0":0.01032,"14.0":0.01032,"15.0":0.01032,"16.0":0.05158,"17.0":0.02063,"18.0":0.04126,"19.0":0.11347},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00296,"4.2-4.3":0.00296,"4.4":0,"4.4.3-4.4.4":0.1272},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0.0039,"11":0.03902,"5.5":0},S:{"2.5":0.0134,_:"3.0-3.1"},J:{"7":0,"10":0.0067},N:{"10":0,"11":0},L:{"0":65.83168},R:{_:"0"},M:{"0":0.10717},Q:{"13.1":0.06698},O:{"0":1.39988},H:{"0":8.86504}};
    +module.exports={C:{"45":0.00299,"48":0.00299,"49":0.00299,"52":0.00299,"56":0.00299,"57":0.01795,"59":0.00299,"60":0.00299,"61":0.00299,"68":0.00299,"72":0.00598,"74":0.00299,"88":0.00299,"93":0.00299,"97":0.00299,"99":0.00898,"100":0.00299,"101":0.00299,"102":0.00898,"103":0.00598,"104":0.00299,"105":0.00299,"106":0.06882,"107":0.00299,"108":0.00299,"109":0.00598,"112":0.00898,"113":0.00598,"114":0.00299,"115":0.25133,"116":0.02094,"117":0.01496,"118":0.07779,"119":1.0472,"120":0.27526,"121":0.00299,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 50 51 53 54 55 58 62 63 64 65 66 67 69 70 71 73 75 76 77 78 79 80 81 82 83 84 85 86 87 89 90 91 92 94 95 96 98 110 111 122 123 3.5 3.6"},D:{"11":0.00898,"25":0.00299,"29":0.00598,"36":0.00598,"41":0.00598,"47":0.00299,"49":0.01197,"51":0.00299,"54":0.00299,"56":0.00299,"57":0.00299,"59":0.00299,"60":0.00299,"63":0.02394,"64":0.01197,"65":0.00299,"66":0.00598,"67":0.00299,"68":0.00299,"69":0.00299,"70":0.01795,"72":0.01197,"74":0.00299,"75":0.00898,"76":0.00299,"77":0.01197,"78":0.00598,"79":0.02693,"80":0.00898,"81":0.00598,"83":0.00299,"84":0.01197,"85":0.00898,"86":0.00898,"87":0.01197,"88":0.00598,"89":0.00598,"90":0.00898,"91":0.00598,"92":0.01197,"93":0.00898,"94":0.05386,"95":0.01197,"96":0.00898,"97":0.00598,"98":0.01496,"99":0.01197,"100":0.00598,"101":0.00299,"102":0.04488,"103":0.06882,"104":0.02094,"105":0.05086,"106":0.02094,"107":0.0359,"108":0.04787,"109":1.84606,"110":0.02094,"111":0.02693,"112":0.0359,"113":0.04488,"114":0.09574,"115":0.06283,"116":0.20046,"117":0.30818,"118":3.13262,"119":10.19374,"120":0.03291,"121":0.00299,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 26 27 28 30 31 32 33 34 35 37 38 39 40 42 43 44 45 46 48 50 52 53 55 58 61 62 71 73 122"},F:{"34":0.00299,"36":0.00598,"42":0.00598,"45":0.00299,"57":0.00299,"67":0.00898,"74":0.00299,"79":0.02094,"83":0.00299,"85":0.01795,"86":0.00299,"95":0.04488,"99":0.00299,"101":0.00299,"102":0.08677,"103":0.34408,"104":0.69714,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 37 38 39 40 41 43 44 46 47 48 49 50 51 52 53 54 55 56 58 60 62 63 64 65 66 68 69 70 71 72 73 75 76 77 78 80 81 82 84 87 88 89 90 91 92 93 94 96 97 98 100 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.01496,"13":0.01496,"14":0.08378,"15":0.00598,"16":0.01197,"17":0.01496,"18":0.08078,"80":0.00299,"83":0.00299,"84":0.01197,"85":0.00299,"89":0.01496,"90":0.0359,"92":0.08378,"94":0.00598,"100":0.01795,"103":0.00299,"105":0.00299,"106":0.0359,"107":0.01197,"108":0.00598,"109":0.04189,"110":0.00598,"111":0.00898,"112":0.00898,"113":0.01795,"114":0.03291,"115":0.10173,"116":0.0389,"117":0.1107,"118":0.68517,"119":2.67784,_:"79 81 86 87 88 91 93 95 96 97 98 99 101 102 104"},E:{"13":0.00598,"14":0.00898,"15":0.01795,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 6.1 7.1 9.1 10.1 11.1","5.1":0.01197,"12.1":0.00299,"13.1":0.02394,"14.1":0.21542,"15.1":0.00598,"15.2-15.3":0.00299,"15.4":0.00898,"15.5":0.00898,"15.6":0.08677,"16.0":0.00598,"16.1":0.03291,"16.2":0.02693,"16.3":0.02394,"16.4":0.04189,"16.5":0.02693,"16.6":0.28125,"17.0":0.08078,"17.1":0.15858,"17.2":0.00598},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00101,"5.0-5.1":0.00101,"6.0-6.1":0.00252,"7.0-7.1":0.00352,"8.1-8.4":0.0005,"9.0-9.2":0.00403,"9.3":0.01258,"10.0-10.2":0.00101,"10.3":0.01811,"11.0-11.2":0.00855,"11.3-11.4":0.00755,"12.0-12.1":0.00453,"12.2-12.5":0.08252,"13.0-13.1":0.00201,"13.2":0.00855,"13.3":0.00503,"13.4-13.7":0.01459,"14.0-14.4":0.03874,"14.5-14.8":0.0629,"15.0-15.1":0.02466,"15.2-15.3":0.03019,"15.4":0.03371,"15.5":0.0473,"15.6-15.7":0.24857,"16.0":0.11674,"16.1":0.23398,"16.2":0.11221,"16.3":0.21033,"16.4":0.04327,"16.5":0.1117,"16.6-16.7":1.89345,"17.0":0.56708,"17.1":0.95251,"17.2":0.02717},P:{"4":0.1334,"20":0.05131,"21":0.10262,"22":0.25654,"23":1.07748,_:"5.0-5.4 8.2 12.0","6.2-6.4":0.01026,"7.2-7.4":0.08209,"9.2":0.01026,"10.1":0.01026,"11.1-11.2":0.03079,"13.0":0.01026,"14.0":0.01026,"15.0":0.01026,"16.0":0.03079,"17.0":0.02052,"18.0":0.04105,"19.0":0.12314},I:{"0":0.08368,"3":0.00001,"4":0.00002,"2.1":0,"2.2":0.00002,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00006,"4.4":0,"4.4.3-4.4.4":0.00025},K:{"0":7.78709,_:"10 11 12 11.1 11.5 12.1"},A:{"10":0.00748,"11":0.05236,_:"6 7 8 9 5.5"},N:{_:"10 11"},S:{"2.5":0.02102,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":1.16333},H:{"0":1.05},L:{"0":56.77422},R:{_:"0"},M:{"0":0.09811},Q:{"13.1":0.04205}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-af.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-af.js
    index 800d806d71484f..86949874134b8f 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-af.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-af.js
    @@ -1 +1 @@
    -module.exports={C:{"34":0.00493,"43":0.00246,"52":0.02463,"53":0.00246,"57":0.00246,"65":0.00246,"72":0.00246,"77":0.00493,"78":0.00985,"91":0.00246,"92":0.00246,"94":0.00246,"95":0.00246,"99":0.00493,"102":0.02217,"104":0.00493,"105":0.00493,"106":0.00493,"107":0.00246,"108":0.00493,"109":0.00493,"110":0.00739,"111":0.00493,"112":0.00493,"113":0.00739,"114":0.00985,"115":0.34975,"116":0.05911,"117":0.71427,"118":0.07882,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 44 45 46 47 48 49 50 51 54 55 56 58 59 60 61 62 63 64 66 67 68 69 70 71 73 74 75 76 79 80 81 82 83 84 85 86 87 88 89 90 93 96 97 98 100 101 103 119 120 3.5 3.6"},D:{"11":0.00493,"38":0.00246,"43":0.01478,"47":0.00493,"49":0.01724,"50":0.00493,"56":0.00493,"58":0.00985,"60":0.00246,"62":0.00246,"63":0.00493,"64":0.00493,"65":0.00246,"66":0.00493,"67":0.00985,"68":0.00739,"69":0.00493,"70":0.00985,"71":0.00246,"72":0.00985,"73":0.00493,"74":0.00985,"75":0.00739,"76":0.00985,"77":0.00739,"78":0.00493,"79":0.05665,"80":0.01232,"81":0.0197,"83":0.01232,"84":0.00739,"85":0.01478,"86":0.0197,"87":0.03448,"88":0.01724,"89":0.00739,"90":0.02217,"91":0.01724,"92":0.00985,"93":0.16995,"94":0.01724,"95":0.01478,"96":0.00985,"97":0.01232,"98":0.0197,"99":0.02709,"100":0.00985,"101":0.00985,"102":0.02956,"103":0.04926,"104":0.01478,"105":0.02217,"106":0.02709,"107":0.04187,"108":0.06896,"109":1.91621,"110":0.02217,"111":0.03202,"112":0.04433,"113":0.0468,"114":0.1601,"115":0.23152,"116":7.69441,"117":2.07385,"118":0.00985,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 44 45 46 48 51 52 53 54 55 57 59 61 119 120"},F:{"28":0.00493,"46":0.00246,"72":0.00246,"73":0.00493,"76":0.00246,"77":0.01478,"79":0.01232,"82":0.00246,"85":0.00493,"94":0.00246,"95":0.05665,"98":0.00246,"99":0.00985,"100":0.04433,"101":0.22906,"102":0.25615,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 74 75 78 80 81 83 84 86 87 88 89 90 91 92 93 96 97 9.5-9.6 10.5 10.6 11.1 11.5 11.6 12.1","10.0-10.1":0},B:{"12":0.00739,"13":0.00246,"14":0.00246,"15":0.00246,"16":0.00246,"17":0.00493,"18":0.02217,"84":0.00493,"89":0.00493,"90":0.00985,"92":0.02217,"100":0.00493,"107":0.00493,"108":0.00493,"109":0.0468,"110":0.00739,"111":0.00739,"112":0.01232,"113":0.01232,"114":0.03941,"115":0.06896,"116":1.20441,"117":0.88914,_:"79 80 81 83 85 86 87 88 91 93 94 95 96 97 98 99 101 102 103 104 105 106"},E:{"4":0,"13":0.00493,"14":0.01478,_:"0 5 6 7 8 9 10 11 12 15 3.1 3.2 6.1 7.1 9.1 10.1 17.1","5.1":0.02709,"11.1":0.00493,"12.1":0.00493,"13.1":0.02709,"14.1":0.02463,"15.1":0.02709,"15.2-15.3":0.00493,"15.4":0.00739,"15.5":0.00985,"15.6":0.0665,"16.0":0.00739,"16.1":0.01724,"16.2":0.01724,"16.3":0.03941,"16.4":0.01478,"16.5":0.0468,"16.6":0.23645,"17.0":0.0197},G:{"8":0.00273,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00182,"6.0-6.1":0,"7.0-7.1":0.02183,"8.1-8.4":0.00182,"9.0-9.2":0.00364,"9.3":0.03821,"10.0-10.2":0.00091,"10.3":0.04276,"11.0-11.2":0.01001,"11.3-11.4":0.00728,"12.0-12.1":0.02547,"12.2-12.5":0.49033,"13.0-13.1":0.01092,"13.2":0.10371,"13.3":0.13646,"13.4-13.7":0.05458,"14.0-14.4":0.19923,"14.5-14.8":0.24198,"15.0-15.1":0.1692,"15.2-15.3":0.11371,"15.4":0.09643,"15.5":0.16284,"15.6-15.7":1.17716,"16.0":0.28565,"16.1":0.3939,"16.2":0.2247,"16.3":0.46395,"16.4":0.18467,"16.5":0.46213,"16.6":3.45505,"17.0":0.4312,"17.1":0},P:{"4":0.13505,"20":0.11427,"21":0.20776,"22":2.50357,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.19738,"8.2":0,"9.2":0.02078,"10.1":0.01032,"11.1-11.2":0.03116,"12.0":0.02063,"13.0":0.02078,"14.0":0.02078,"15.0":0.02078,"16.0":0.06233,"17.0":0.05194,"18.0":0.04155,"19.0":0.11427},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00164,"4.2-4.3":0.00781,"4.4":0,"4.4.3-4.4.4":0.05838},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"8":0.0079,"9":0.00263,"10":0.00263,"11":0.06319,_:"6 7 5.5"},S:{"2.5":0.07537,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":59.23129},R:{_:"0"},M:{"0":0.24872},Q:{"13.1":0},O:{"0":0.52759},H:{"0":7.8491}};
    +module.exports={C:{"34":0.00247,"43":0.00247,"47":0.00247,"52":0.03206,"57":0.00247,"65":0.00247,"72":0.00247,"77":0.00493,"78":0.0074,"88":0.00247,"95":0.00247,"99":0.00493,"102":0.00493,"103":0.00247,"104":0.00493,"105":0.00247,"106":0.00247,"107":0.00247,"108":0.00493,"109":0.00493,"110":0.00493,"111":0.00493,"112":0.00493,"113":0.00493,"114":0.00493,"115":0.3847,"116":0.00493,"117":0.0074,"118":0.03452,"119":0.64116,"120":0.20221,"121":0.00493,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 44 45 46 48 49 50 51 53 54 55 56 58 59 60 61 62 63 64 66 67 68 69 70 71 73 74 75 76 79 80 81 82 83 84 85 86 87 89 90 91 92 93 94 96 97 98 100 101 122 123 3.5 3.6"},D:{"11":0.00247,"43":0.01233,"47":0.00493,"49":0.0148,"50":0.00493,"52":0.00247,"55":0.00247,"56":0.00493,"58":0.01726,"60":0.00247,"62":0.00247,"63":0.00493,"64":0.00247,"65":0.00247,"66":0.0074,"67":0.0148,"68":0.00493,"69":0.00493,"70":0.00986,"72":0.00493,"73":0.00493,"74":0.0074,"75":0.00493,"76":0.0074,"77":0.00493,"78":0.00493,"79":0.04932,"80":0.00986,"81":0.01973,"83":0.01233,"84":0.00493,"85":0.00986,"86":0.01973,"87":0.22441,"88":0.0148,"89":0.0074,"90":0.0074,"91":0.00986,"92":0.00986,"93":0.11837,"94":0.01726,"95":0.0148,"96":0.00986,"97":0.0074,"98":0.02219,"99":0.02466,"100":0.00986,"101":0.00986,"102":0.02959,"103":0.04439,"104":0.01233,"105":0.02466,"106":0.02959,"107":0.02713,"108":0.07398,"109":1.88649,"110":0.02219,"111":0.03206,"112":0.02959,"113":0.01973,"114":0.05672,"115":0.03699,"116":0.14056,"117":0.18248,"118":2.4512,"119":8.87267,"120":0.00986,"121":0.00493,_:"4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 44 45 46 48 51 53 54 57 59 61 71 122"},F:{"28":0.00247,"79":0.0148,"82":0.00493,"85":0.00493,"94":0.00247,"95":0.05425,"99":0.00247,"100":0.00247,"101":0.00493,"102":0.09617,"103":0.09371,"104":0.28112,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 81 83 84 86 87 88 89 90 91 92 93 96 97 98 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.0074,"13":0.00247,"14":0.0074,"15":0.00247,"16":0.00247,"17":0.00493,"18":0.02219,"84":0.00493,"89":0.00493,"90":0.00493,"92":0.02219,"100":0.00493,"106":0.00247,"107":0.00493,"108":0.00493,"109":0.04685,"110":0.00493,"111":0.00493,"112":0.0074,"113":0.00986,"114":0.01233,"115":0.01973,"116":0.02219,"117":0.05179,"118":0.39209,"119":1.93581,_:"79 80 81 83 85 86 87 88 91 93 94 95 96 97 98 99 101 102 103 104 105"},E:{"13":0.00247,"14":0.01233,_:"0 4 5 6 7 8 9 10 11 12 15 3.1 3.2 6.1 7.1 9.1 10.1","5.1":0.05425,"11.1":0.00493,"12.1":0.00247,"13.1":0.02466,"14.1":0.02466,"15.1":0.0074,"15.2-15.3":0.0074,"15.4":0.0074,"15.5":0.00986,"15.6":0.06905,"16.0":0.00986,"16.1":0.0148,"16.2":0.01233,"16.3":0.03206,"16.4":0.0148,"16.5":0.02959,"16.6":0.14303,"17.0":0.06412,"17.1":0.09124,"17.2":0.00247},G:{"8":0.00248,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00083,"6.0-6.1":0,"7.0-7.1":0.01739,"8.1-8.4":0,"9.0-9.2":0.00414,"9.3":0.03312,"10.0-10.2":0.00083,"10.3":0.03726,"11.0-11.2":0.01076,"11.3-11.4":0.00828,"12.0-12.1":0.02236,"12.2-12.5":0.51832,"13.0-13.1":0.00994,"13.2":0.00331,"13.3":0.01904,"13.4-13.7":0.05299,"14.0-14.4":0.1863,"14.5-14.8":0.21693,"15.0-15.1":0.1598,"15.2-15.3":0.09853,"15.4":0.077,"15.5":0.13496,"15.6-15.7":0.95301,"16.0":0.207,"16.1":0.30801,"16.2":0.17057,"16.3":0.33616,"16.4":0.12751,"16.5":0.27406,"16.6-16.7":2.10226,"17.0":0.92403,"17.1":0.98199,"17.2":0.03395},P:{"4":0.15669,"20":0.07312,"21":0.1358,"22":0.37605,"23":2.13097,_:"5.0-5.4 6.2-6.4 8.2 10.1 12.0","7.2-7.4":0.19847,"9.2":0.01045,"11.1-11.2":0.03134,"13.0":0.02089,"14.0":0.02089,"15.0":0.01045,"16.0":0.04178,"17.0":0.05223,"18.0":0.04178,"19.0":0.10446},I:{"0":0.07406,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00003,"4.2-4.3":0.00015,"4.4":0,"4.4.3-4.4.4":0.00108},K:{"0":6.50043,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00528,"11":0.0687,_:"6 7 9 10 5.5"},N:{_:"10 11"},S:{"2.5":0.06781,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.43697},H:{"0":1.35},L:{"0":58.90999},R:{_:"0"},M:{"0":0.24109},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-an.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-an.js
    index ff65e9d14b602f..cf0c178bc40d38 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-an.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-an.js
    @@ -1 +1 @@
    -module.exports={C:{"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0.14933,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.05247,"109":0.43992,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"3.5":0,"3.6":0},D:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0.12915,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0.2018,"109":0.1453,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0.04036,"117":0,"118":0,"119":0,"120":0},F:{"9":0,"11":0,"12":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"60":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"9.5-9.6":0,"10.0-10.1":0,"10.5":0,"10.6":0,"11.1":0,"11.5":0,"11.6":0,"12.1":0},B:{"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"79":0,"80":0,"81":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0.3471,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0},E:{"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,_:"0","3.1":0,"3.2":0,"5.1":0,"6.1":0,"7.1":0,"9.1":0,"10.1":0,"11.1":0,"12.1":0,"13.1":0,"14.1":0,"15.1":0.2018,"15.2-15.3":0.27848,"15.4":0.04036,"15.5":0.0565,"15.6":1.13412,"16.0":0.02825,"16.1":0.70226,"16.2":0.39553,"16.3":0.64576,"16.4":0.23812,"16.5":1.19869,"16.6":8.24555,"17.0":0.85563,"17.1":0},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0,"14.0-14.4":0.01691,"14.5-14.8":0,"15.0-15.1":0.37191,"15.2-15.3":2.03706,"15.4":0.01691,"15.5":0.18596,"15.6-15.7":1.00585,"16.0":3.27114,"16.1":5.55333,"16.2":2.73863,"16.3":4.17556,"16.4":0.63394,"16.5":2.28219,"16.6":53.59762,"17.0":6.70287,"17.1":0.01691},P:{"4":0,"20":0,"21":0,"22":0,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0,"12.0":0,"13.0":0,"14.0":0,"15.0":0,"16.0":0,"17.0":0,"18.0":0,"19.0":0.30416},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"5.5":0},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":0.42121},R:{_:"0"},M:{"0":0.19085},Q:{"13.1":0},O:{"0":0},H:{"0":0}};
    +module.exports={C:{"119":0.01282,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 120 121 122 123 3.5 3.6"},D:{_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122"},F:{_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"109":0.01282,_:"12 13 14 15 16 17 18 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 110 111 112 113 114 115 116 117 118 119"},E:{_:"0 4 5 6 7 8 9 10 11 12 13 14 15 3.1 3.2 5.1 6.1 7.1 9.1 10.1 11.1 12.1 13.1 14.1","15.1":1.10645,"15.2-15.3":1.47811,"15.4":0.01282,"15.5":1.11926,"15.6":2.73835,"16.0":0.03845,"16.1":0.34603,"16.2":0.41011,"16.3":1.69598,"16.4":0.95266,"16.5":4.34462,"16.6":9.14208,"17.0":5.5536,"17.1":11.72664,"17.2":0.9911},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0,"7.0-7.1":0,"8.1-8.4":0,"9.0-9.2":0,"9.3":0,"10.0-10.2":0,"10.3":0,"11.0-11.2":0,"11.3-11.4":0,"12.0-12.1":0,"12.2-12.5":0,"13.0-13.1":0,"13.2":0,"13.3":0,"13.4-13.7":0,"14.0-14.4":0,"14.5-14.8":0,"15.0-15.1":0.28533,"15.2-15.3":1.52938,"15.4":0.05136,"15.5":0.10272,"15.6-15.7":1.43808,"16.0":2.55658,"16.1":4.06314,"16.2":1.14133,"16.3":3.74357,"16.4":0.37093,"16.5":0.7704,"16.6-16.7":20.32141,"17.0":8.14911,"17.1":11.61875,"17.2":0.69621},P:{_:"4 20 21 22 23 5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0"},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0,"4.4":0,"4.4.3-4.4.4":0},K:{"0":0,_:"10 11 12 11.1 11.5 12.1"},A:{_:"6 7 8 9 10 11 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{_:"0"},H:{"0":0},L:{"0":0.22343},R:{_:"0"},M:{_:"0"},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-as.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-as.js
    index bd3fa3b97f78c7..68bb266e888c48 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-as.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-as.js
    @@ -1 +1 @@
    -module.exports={C:{"34":0.00604,"36":0.00604,"43":0.00604,"48":0.00604,"52":0.06038,"54":0.00604,"56":0.01811,"72":0.02717,"78":0.00604,"83":0.00604,"88":0.00604,"102":0.0151,"105":0.00302,"106":0.00302,"107":0.00302,"108":0.00604,"109":0.00302,"110":0.00604,"111":0.00604,"112":0.00302,"113":0.01208,"114":0.00604,"115":0.2385,"116":0.05736,"117":0.69739,"118":0.06642,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 37 38 39 40 41 42 44 45 46 47 49 50 51 53 55 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 73 74 75 76 77 79 80 81 82 84 85 86 87 89 90 91 92 93 94 95 96 97 98 99 100 101 103 104 119 120 3.5 3.6"},D:{"34":0.00906,"35":0.00302,"38":0.02415,"47":0.00302,"48":0.00906,"49":0.02717,"50":0.0151,"53":0.0151,"55":0.00906,"56":0.00604,"57":0.00302,"58":0.00302,"59":0.00302,"61":0.00604,"62":0.00302,"63":0.00604,"65":0.00302,"66":0.00906,"67":0.00302,"68":0.01208,"69":0.09057,"70":0.14189,"71":0.00906,"72":0.00604,"73":0.07246,"74":0.01208,"75":0.02113,"76":0.00604,"77":0.01811,"78":0.02415,"79":0.14793,"80":0.02113,"81":0.02415,"83":0.03925,"84":0.01208,"85":0.02415,"86":0.05434,"87":0.06642,"88":0.01811,"89":0.02113,"90":0.03019,"91":0.03019,"92":0.03019,"93":0.01208,"94":0.03321,"95":0.01208,"96":0.0151,"97":0.03019,"98":0.12378,"99":0.06038,"100":0.03321,"101":0.02415,"102":0.02415,"103":0.06944,"104":0.02415,"105":0.03019,"106":0.03925,"107":0.0483,"108":0.06944,"109":2.24312,"110":0.03623,"111":0.07849,"112":0.08453,"113":0.09963,"114":0.32001,"115":0.38945,"116":11.76806,"117":2.92239,"118":0.01811,"119":0.00302,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 36 37 39 40 41 42 43 44 45 46 51 52 54 60 64 120"},F:{"28":0.00906,"36":0.00604,"46":0.02415,"77":0.00604,"95":0.02717,"99":0.00302,"100":0.03321,"101":0.13586,"102":0.15699,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 9.5-9.6 10.5 10.6 11.1 11.5 11.6 12.1","10.0-10.1":0},B:{"17":0.00302,"18":0.0151,"90":0.00302,"92":0.01208,"106":0.00302,"107":0.00906,"108":0.01208,"109":0.0634,"110":0.01208,"111":0.01208,"112":0.0151,"113":0.03623,"114":0.0483,"115":0.08151,"116":1.56988,"117":1.11703,_:"12 13 14 15 16 79 80 81 83 84 85 86 87 88 89 91 93 94 95 96 97 98 99 100 101 102 103 104 105"},E:{"4":0,"13":0.00906,"14":0.03623,"15":0.00604,_:"0 5 6 7 8 9 10 11 12 3.1 3.2 6.1 7.1 10.1 11.1 17.1","5.1":0.00906,"9.1":0.02113,"12.1":0.00604,"13.1":0.03623,"14.1":0.08755,"15.1":0.0151,"15.2-15.3":0.01208,"15.4":0.03019,"15.5":0.0483,"15.6":0.18114,"16.0":0.0151,"16.1":0.05736,"16.2":0.04529,"16.3":0.12076,"16.4":0.03925,"16.5":0.12982,"16.6":0.87249,"17.0":0.04529},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00485,"5.0-5.1":0.00485,"6.0-6.1":0.00242,"7.0-7.1":0.01575,"8.1-8.4":0.00485,"9.0-9.2":0.01212,"9.3":0.0315,"10.0-10.2":0.00363,"10.3":0.06179,"11.0-11.2":0.0206,"11.3-11.4":0.01333,"12.0-12.1":0.01696,"12.2-12.5":0.27017,"13.0-13.1":0.00848,"13.2":0.01454,"13.3":0.10661,"13.4-13.7":0.07269,"14.0-14.4":0.19748,"14.5-14.8":0.29803,"15.0-15.1":0.12115,"15.2-15.3":0.126,"15.4":0.15871,"15.5":0.19263,"15.6-15.7":1.14609,"16.0":0.41797,"16.1":0.66633,"16.2":0.37799,"16.3":0.69177,"16.4":0.21202,"16.5":0.57547,"16.6":5.64323,"17.0":0.51732,"17.1":0},P:{"4":0.19818,"20":0.08345,"21":0.16689,"22":1.87754,"5.0-5.4":0.02086,"6.2-6.4":0,"7.2-7.4":0.05215,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.02086,"12.0":0,"13.0":0.02086,"14.0":0.02086,"15.0":0.01043,"16.0":0.04172,"17.0":0.05215,"18.0":0.04172,"19.0":0.07302},I:{"0":0,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.0641,"4.4":0,"4.4.3-4.4.4":0.64098},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"8":0.01348,"9":0.09435,"11":0.84919,_:"6 7 10 5.5"},S:{"2.5":0.12566,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":51.89047},R:{_:"0"},M:{"0":0.16754},Q:{"13.1":0.38396},O:{"0":2.00355},H:{"0":1.20948}};
    +module.exports={C:{"34":0.00595,"36":0.00595,"43":0.00595,"48":0.00595,"52":0.05952,"54":0.00893,"56":0.03274,"72":0.01786,"78":0.00298,"88":0.00595,"91":0.02678,"102":0.00298,"105":0.00298,"106":0.00298,"107":0.00298,"108":0.00595,"109":0.00298,"110":0.00595,"111":0.00595,"113":0.00893,"114":0.00298,"115":0.23808,"116":0.00893,"117":0.00893,"118":0.05357,"119":0.70829,"120":0.20237,"121":0.00298,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 37 38 39 40 41 42 44 45 46 47 49 50 51 53 55 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 90 92 93 94 95 96 97 98 99 100 101 103 104 112 122 123 3.5 3.6"},D:{"34":0.0119,"38":0.02381,"47":0.00595,"48":0.00893,"49":0.02083,"50":0.02083,"53":0.0119,"55":0.00595,"56":0.00595,"57":0.00298,"58":0.00298,"61":0.00595,"63":0.00595,"65":0.00298,"66":0.00893,"67":0.00298,"68":0.00298,"69":0.08035,"70":0.07738,"71":0.00893,"72":0.00595,"73":0.05059,"74":0.02083,"75":0.00893,"76":0.00595,"77":0.02083,"78":0.01488,"79":0.16368,"80":0.02083,"81":0.02083,"83":0.03571,"84":0.00893,"85":0.03869,"86":0.05357,"87":0.0744,"88":0.00893,"89":0.01786,"90":0.02083,"91":0.02381,"92":0.05059,"93":0.0119,"94":0.03274,"95":0.01488,"96":0.0119,"97":0.02083,"98":0.13392,"99":0.05357,"100":0.02678,"101":0.02381,"102":0.02083,"103":0.0625,"104":0.02083,"105":0.04464,"106":0.04464,"107":0.04762,"108":0.09821,"109":2.22902,"110":0.03571,"111":0.0863,"112":0.0625,"113":0.04166,"114":0.13987,"115":0.08333,"116":0.22022,"117":0.35414,"118":3.25277,"119":12.16886,"120":0.01786,"121":0.0119,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 39 40 41 42 43 44 45 46 51 52 54 59 60 62 64 122"},F:{"28":0.00595,"36":0.00595,"46":0.02678,"95":0.02678,"102":0.10416,"103":0.05357,"104":0.18749,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"17":0.00298,"18":0.01488,"92":0.0119,"100":0.00298,"106":0.00298,"107":0.00893,"108":0.0119,"109":0.0625,"110":0.0119,"111":0.00893,"112":0.00893,"113":0.02381,"114":0.02381,"115":0.01786,"116":0.02381,"117":0.04762,"118":0.49699,"119":2.23498,_:"12 13 14 15 16 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 101 102 103 104 105"},E:{"13":0.00893,"14":0.03571,"15":0.00595,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 6.1 7.1 9.1 10.1 11.1","5.1":0.00893,"12.1":0.00595,"13.1":0.03274,"14.1":0.08333,"15.1":0.0119,"15.2-15.3":0.0119,"15.4":0.02976,"15.5":0.04464,"15.6":0.17856,"16.0":0.01488,"16.1":0.05357,"16.2":0.03869,"16.3":0.10714,"16.4":0.03274,"16.5":0.08035,"16.6":0.63984,"17.0":0.1369,"17.1":0.24701,"17.2":0.00595},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00347,"5.0-5.1":0.00347,"6.0-6.1":0.00231,"7.0-7.1":0.01502,"8.1-8.4":0.00347,"9.0-9.2":0.01155,"9.3":0.03235,"10.0-10.2":0.00462,"10.3":0.06008,"11.0-11.2":0.02195,"11.3-11.4":0.01155,"12.0-12.1":0.01502,"12.2-12.5":0.26575,"13.0-13.1":0.00809,"13.2":0.04622,"13.3":0.01733,"13.4-13.7":0.05777,"14.0-14.4":0.14905,"14.5-14.8":0.21954,"15.0-15.1":0.0855,"15.2-15.3":0.1063,"15.4":0.13172,"15.5":0.15945,"15.6-15.7":0.77068,"16.0":0.32237,"16.1":0.52804,"16.2":0.29117,"16.3":0.5188,"16.4":0.15136,"16.5":0.35703,"16.6-16.7":3.6905,"17.0":1.25713,"17.1":1.88222,"17.2":0.04275},P:{"4":0.22291,"20":0.06369,"21":0.11676,"22":0.32905,"23":1.80449,"5.0-5.4":0.02123,_:"6.2-6.4 8.2 9.2 10.1 12.0","7.2-7.4":0.05307,"11.1-11.2":0.02123,"13.0":0.02123,"14.0":0.01061,"15.0":0.01061,"16.0":0.03184,"17.0":0.04246,"18.0":0.03184,"19.0":0.06369},I:{"0":0.41342,"3":0,"4":0,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00008,"4.4":0,"4.4.3-4.4.4":0.00075},K:{"0":1.40587,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.014,"9":0.09798,"11":0.7838,_:"6 7 10 5.5"},N:{_:"10 11"},S:{"2.5":0.15453,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":1.86136},H:{"0":0.02},L:{"0":51.79512},R:{_:"0"},M:{"0":0.16155},Q:{"13.1":0.3512}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-eu.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-eu.js
    index d4a6573578cb9a..54fbe652a7da15 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-eu.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-eu.js
    @@ -1 +1 @@
    -module.exports={C:{"12":0.00482,"45":0.01928,"48":0.02891,"50":0.0241,"52":0.06747,"53":0.03373,"56":0.00964,"59":0.01446,"68":0.00482,"78":0.03373,"83":0.00482,"87":0.00482,"88":0.00482,"91":0.00964,"102":0.2024,"103":0.09638,"104":0.00964,"105":0.00964,"106":0.00964,"107":0.00964,"108":0.01446,"109":0.01446,"110":0.00964,"111":0.00964,"112":0.01446,"113":0.02891,"114":0.0241,"115":0.54937,"116":0.17348,"117":3.2962,"118":0.30842,_:"2 3 4 5 6 7 8 9 10 11 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 49 51 54 55 57 58 60 61 62 63 64 65 66 67 69 70 71 72 73 74 75 76 77 79 80 81 82 84 85 86 89 90 92 93 94 95 96 97 98 99 100 101 119 120 3.5 3.6"},D:{"34":0.00482,"38":0.00964,"43":0.00482,"47":0.00482,"48":0.00482,"49":0.03855,"51":0.00482,"52":0.00964,"56":0.00964,"60":0.04337,"63":0.00964,"66":0.05301,"68":0.00964,"69":0.00482,"70":0.00964,"71":0.00964,"72":0.00964,"73":0.00964,"74":0.01928,"75":0.01928,"76":0.01928,"77":0.01928,"78":0.03855,"79":0.11084,"80":0.02891,"81":0.03373,"83":0.0241,"84":0.01446,"85":0.08674,"86":0.03855,"87":0.06747,"88":0.02891,"89":0.02891,"90":0.05301,"91":0.05301,"92":0.0241,"93":0.07229,"94":0.04337,"95":0.01446,"96":0.03855,"97":0.01446,"98":0.01446,"99":0.02891,"100":0.02891,"101":0.03373,"102":0.04819,"103":0.16385,"104":0.05301,"105":0.06265,"106":0.10602,"107":0.09156,"108":0.11084,"109":1.57581,"110":0.06747,"111":0.08674,"112":0.13011,"113":0.13493,"114":0.52527,"115":0.84814,"116":17.47369,"117":4.94429,"118":0.00964,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 39 40 41 42 44 45 46 50 53 54 55 57 58 59 61 62 64 65 67 119 120"},F:{"31":0.00964,"36":0.00482,"40":0.00964,"46":0.01446,"76":0.00964,"77":0.00482,"85":0.00964,"95":0.10602,"99":0.01928,"100":0.24577,"101":0.67948,"102":1.25294,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 33 34 35 37 38 39 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 78 79 80 81 82 83 84 86 87 88 89 90 91 92 93 94 96 97 98 9.5-9.6 10.5 10.6 11.1 11.5 11.6 12.1","10.0-10.1":0},B:{"15":0.00482,"17":0.00964,"18":0.00482,"90":0.01928,"92":0.00964,"103":0.00482,"106":0.00482,"107":0.01446,"108":0.01446,"109":0.09638,"110":0.01446,"111":0.01928,"112":0.01928,"113":0.0241,"114":0.1012,"115":0.21204,"116":3.23837,"117":2.66009,_:"12 13 14 16 79 80 81 83 84 85 86 87 88 89 91 93 94 95 96 97 98 99 100 101 102 104 105"},E:{"4":0,"13":0.00964,"14":0.05783,"15":0.00964,_:"0 5 6 7 8 9 10 11 12 3.1 3.2 5.1 6.1 7.1 10.1 17.1","9.1":0.02891,"11.1":0.01446,"12.1":0.0241,"13.1":0.09156,"14.1":0.16867,"15.1":0.0241,"15.2-15.3":0.01928,"15.4":0.04337,"15.5":0.06265,"15.6":0.3807,"16.0":0.04819,"16.1":0.1012,"16.2":0.1012,"16.3":0.24095,"16.4":0.11084,"16.5":0.34215,"16.6":1.92278,"17.0":0.12048},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00337,"6.0-6.1":0,"7.0-7.1":0.00843,"8.1-8.4":0,"9.0-9.2":0.01011,"9.3":0.05224,"10.0-10.2":0,"10.3":0.05392,"11.0-11.2":0.02359,"11.3-11.4":0.02865,"12.0-12.1":0.00843,"12.2-12.5":0.2477,"13.0-13.1":0.00506,"13.2":0.00337,"13.3":0.48865,"13.4-13.7":0.03033,"14.0-14.4":0.08425,"14.5-14.8":0.18535,"15.0-15.1":0.06066,"15.2-15.3":0.07414,"15.4":0.07414,"15.5":0.13312,"15.6-15.7":1.06829,"16.0":0.50382,"16.1":0.90148,"16.2":0.4162,"16.3":0.81386,"16.4":0.14154,"16.5":0.46001,"16.6":9.63318,"17.0":1.11379,"17.1":0.00337},P:{"4":0.04264,"20":0.07461,"21":0.15989,"22":2.94188,"5.0-5.4":0.02086,"6.2-6.4":0,"7.2-7.4":0.05215,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01066,"12.0":0,"13.0":0.01066,"14.0":0.02086,"15.0":0.01043,"16.0":0.01066,"17.0":0.02132,"18.0":0.02132,"19.0":0.0533},I:{"0":0,"3":0.02176,"4":0.00484,"2.1":0,"2.2":0.00242,"2.3":0,"4.1":0.00967,"4.2-4.3":0.00967,"4.4":0,"4.4.3-4.4.4":0.06045},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"8":0.01496,"9":0.01496,"11":0.11466,_:"6 7 10 5.5"},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":31.10672},R:{_:"0"},M:{"0":0.45593},Q:{"13.1":0},O:{"0":0.15543},H:{"0":0.51993}};
    +module.exports={C:{"12":0.06516,"45":0.00931,"48":0.09773,"50":0.01396,"52":0.06516,"53":0.03258,"56":0.02327,"59":0.01396,"68":0.00465,"72":0.00465,"78":0.02792,"88":0.00931,"91":0.00931,"94":0.00465,"102":0.09308,"103":0.13031,"104":0.00931,"105":0.00931,"106":0.00931,"107":0.00931,"108":0.01396,"109":0.01396,"110":0.00931,"111":0.00931,"112":0.00931,"113":0.01862,"114":0.00931,"115":0.62829,"116":0.02792,"117":0.02792,"118":0.10704,"119":2.43404,"120":0.71206,_:"2 3 4 5 6 7 8 9 10 11 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 49 51 54 55 57 58 60 61 62 63 64 65 66 67 69 70 71 73 74 75 76 77 79 80 81 82 83 84 85 86 87 89 90 92 93 95 96 97 98 99 100 101 121 122 123 3.5 3.6"},D:{"38":0.00931,"43":0.00465,"47":0.00465,"48":0.00931,"49":0.03723,"52":0.00931,"58":0.00465,"60":0.03258,"63":0.00931,"66":0.05119,"70":0.00465,"71":0.00465,"72":0.00931,"73":0.01396,"74":0.00931,"75":0.00931,"76":0.00931,"77":0.00931,"78":0.02792,"79":0.10704,"80":0.01396,"81":0.01862,"83":0.01396,"84":0.00931,"85":0.15824,"86":0.03258,"87":0.04654,"88":0.01862,"89":0.02327,"90":0.00931,"91":0.03723,"92":0.03258,"93":0.0605,"94":0.04189,"95":0.01862,"96":0.02792,"97":0.00931,"98":0.01396,"99":0.02327,"100":0.02792,"101":0.04189,"102":0.04189,"103":0.13497,"104":0.09308,"105":0.04654,"106":0.10239,"107":0.07446,"108":0.09308,"109":1.54978,"110":0.05119,"111":0.07446,"112":0.08843,"113":0.0605,"114":0.19547,"115":0.09308,"116":0.41421,"117":0.53056,"118":5.31487,"119":17.41527,"120":0.01396,"121":0.00465,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 44 45 46 50 51 53 54 55 56 57 59 61 62 64 65 67 68 69 122"},F:{"31":0.01396,"40":0.00931,"46":0.01396,"85":0.00465,"95":0.10239,"102":0.84237,"103":0.20478,"104":0.94011,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 33 34 35 36 37 38 39 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"15":0.00465,"17":0.00931,"90":0.00931,"92":0.00931,"97":0.00465,"106":0.00931,"107":0.01396,"108":0.01396,"109":0.08377,"110":0.01396,"111":0.01396,"112":0.01396,"113":0.01396,"114":0.02792,"115":0.02327,"116":0.05119,"117":0.14427,"118":0.97734,"119":4.64935,_:"12 13 14 16 18 79 80 81 83 84 85 86 87 88 89 91 93 94 95 96 98 99 100 101 102 103 104 105"},E:{"13":0.00465,"14":0.05119,"15":0.01396,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 5.1 6.1 7.1 10.1","9.1":0.01396,"11.1":0.01396,"12.1":0.02792,"13.1":0.08843,"14.1":0.15824,"15.1":0.02327,"15.2-15.3":0.02327,"15.4":0.03723,"15.5":0.05585,"15.6":0.38628,"16.0":0.05119,"16.1":0.1117,"16.2":0.08843,"16.3":0.20478,"16.4":0.09308,"16.5":0.19547,"16.6":1.19142,"17.0":0.38628,"17.1":0.79118,"17.2":0.01396},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00316,"6.0-6.1":0.01106,"7.0-7.1":0.0079,"8.1-8.4":0,"9.0-9.2":0.01106,"9.3":0.04739,"10.0-10.2":0,"10.3":0.05528,"11.0-11.2":0.01895,"11.3-11.4":0.04265,"12.0-12.1":0.0079,"12.2-12.5":0.20849,"13.0-13.1":0.00316,"13.2":0.00158,"13.3":0.00948,"13.4-13.7":0.02211,"14.0-14.4":0.0616,"14.5-14.8":0.14216,"15.0-15.1":0.04739,"15.2-15.3":0.06318,"15.4":0.06318,"15.5":0.10267,"15.6-15.7":0.62548,"16.0":0.3933,"16.1":0.78975,"16.2":0.33801,"16.3":0.64286,"16.4":0.10109,"16.5":0.28905,"16.6-16.7":6.07951,"17.0":1.98228,"17.1":3.22377,"17.2":0.08845},P:{"4":0.03276,"20":0.05461,"21":0.09829,"22":0.27303,"23":2.76305,_:"5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 12.0 14.0 15.0","11.1-11.2":0.01092,"13.0":0.01092,"16.0":0.01092,"17.0":0.02184,"18.0":0.02184,"19.0":0.04368},I:{"0":0.0746,"3":0,"4":0.00001,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00001,"4.2-4.3":0.00002,"4.4":0,"4.4.3-4.4.4":0.00016},K:{"0":0.56678,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00931,"9":0.00931,"11":0.09308,_:"6 7 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.13368},H:{"0":0},L:{"0":33.34045},R:{_:"0"},M:{"0":0.43845},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-na.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-na.js
    index 919ff4040c4b1b..11c430fb07e5cb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-na.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-na.js
    @@ -1 +1 @@
    -module.exports={C:{"4":0.0066,"11":0.01981,"44":0.01321,"48":0.02642,"52":0.03302,"53":0.0066,"59":0.0066,"78":0.07925,"89":0.01321,"91":0.0066,"94":0.01321,"102":0.11227,"108":0.01321,"109":0.01321,"110":0.01321,"111":0.01321,"112":0.19152,"113":0.01981,"114":0.01981,"115":0.26416,"116":0.1651,"117":1.73025,"118":0.12548,_:"2 3 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 45 46 47 49 50 51 54 55 56 57 58 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 88 90 92 93 95 96 97 98 99 100 101 103 104 105 106 107 119 120 3.5 3.6"},D:{"48":0.03962,"49":0.04623,"51":0.0066,"56":0.09246,"58":0.01321,"60":0.0066,"62":0.0066,"63":0.0066,"65":0.03302,"66":0.02642,"67":0.0066,"68":0.07925,"69":0.07264,"70":0.05944,"71":0.05944,"72":0.08585,"73":0.02642,"74":0.09906,"75":0.09246,"76":0.31699,"77":0.07264,"78":0.09246,"79":0.37643,"80":0.1651,"81":0.13868,"83":0.29718,"84":0.09246,"85":0.19152,"86":0.19152,"87":0.17831,"88":0.13868,"89":0.09906,"90":0.13868,"91":0.10566,"92":0.03302,"93":0.34341,"94":0.01981,"95":0.01981,"96":0.02642,"97":0.03302,"98":0.03962,"99":0.03302,"100":0.04623,"101":0.05944,"102":0.05944,"103":0.48209,"104":0.07264,"105":0.07264,"106":0.05283,"107":0.41605,"108":0.51511,"109":1.22174,"110":0.4953,"111":0.89814,"112":0.57455,"113":0.25756,"114":1.86233,"115":3.51333,"116":19.20443,"117":4.38506,"118":0.03302,"119":0.03302,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 50 52 53 54 55 57 59 61 64 120"},F:{"53":0.01321,"54":0.01321,"55":0.01321,"76":0.0066,"89":0.01981,"95":0.03302,"97":0.37643,"98":0.0066,"99":0.05283,"100":0.58115,"101":1.06324,"102":0.79908,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 77 78 79 80 81 82 83 84 85 86 87 88 90 91 92 93 94 96 9.5-9.6 10.5 10.6 11.1 11.5 11.6 12.1","10.0-10.1":0},B:{"12":0.0066,"18":0.0066,"79":0.0066,"80":0.01981,"81":0.01981,"83":0.02642,"84":0.01981,"85":0.01321,"86":0.01981,"87":0.01981,"88":0.01321,"89":0.01321,"90":0.01321,"92":0.01321,"99":0.04623,"108":0.0066,"109":0.07925,"110":0.01321,"111":0.38303,"112":0.38303,"113":0.01321,"114":0.44247,"115":0.20472,"116":3.6322,"117":2.1529,_:"13 14 15 16 17 91 93 94 95 96 97 98 100 101 102 103 104 105 106 107"},E:{"4":0,"9":0.0066,"13":0.03962,"14":0.20472,"15":0.03962,_:"0 5 6 7 8 10 11 12 3.1 3.2 5.1 6.1 7.1 10.1 17.1","9.1":0.54153,"11.1":0.0066,"12.1":0.05944,"13.1":0.31699,"14.1":0.54153,"15.1":0.09246,"15.2-15.3":0.07925,"15.4":0.15189,"15.5":0.24435,"15.6":1.23495,"16.0":0.1651,"16.1":0.36982,"16.2":0.36982,"16.3":0.8321,"16.4":0.46888,"16.5":1.01702,"16.6":5.50113,"17.0":0.17831},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0,"6.0-6.1":0.00674,"7.0-7.1":0.00337,"8.1-8.4":0.00169,"9.0-9.2":0.00843,"9.3":0.02866,"10.0-10.2":0,"10.3":0.0354,"11.0-11.2":0.01686,"11.3-11.4":0.01349,"12.0-12.1":0.01011,"12.2-12.5":0.15002,"13.0-13.1":0.00506,"13.2":0.00506,"13.3":0.01854,"13.4-13.7":0.03203,"14.0-14.4":0.08597,"14.5-14.8":0.15676,"15.0-15.1":0.05731,"15.2-15.3":0.07585,"15.4":0.07585,"15.5":0.12811,"15.6-15.7":0.85125,"16.0":0.36578,"16.1":0.88159,"16.2":0.41467,"16.3":0.7636,"16.4":0.11631,"16.5":0.40624,"16.6":11.17919,"17.0":0.75517,"17.1":0.00337},P:{"4":0.01113,"20":0.03338,"21":0.06677,"22":1.04604,"5.0-5.4":0.02086,"6.2-6.4":0,"7.2-7.4":0.05215,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01066,"12.0":0,"13.0":0.01066,"14.0":0.02086,"15.0":0.01043,"16.0":0.01066,"17.0":0.01113,"18.0":0.01113,"19.0":0.02226},I:{"0":0,"3":0.00611,"4":0.00815,"2.1":0.00306,"2.2":0.00917,"2.3":0.00204,"4.1":0.00407,"4.2-4.3":0.0275,"4.4":0,"4.4.3-4.4.4":0.03157},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"8":0.00784,"9":0.02353,"11":0.09411,_:"6 7 10 5.5"},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":15.69797},R:{_:"0"},M:{"0":0.30895},Q:{"13.1":0.01019},O:{"0":0.06111},H:{"0":0.19606}};
    +module.exports={C:{"4":0.00659,"11":0.08572,"38":0.00659,"43":0.00659,"44":0.01978,"48":0.01978,"50":0.01319,"52":0.05275,"53":0.00659,"54":0.01319,"55":0.00659,"56":0.01319,"57":0.01319,"58":0.00659,"59":0.01319,"60":0.01319,"61":0.01319,"62":0.00659,"63":0.01319,"65":0.00659,"68":0.00659,"70":0.00659,"77":0.01319,"78":0.05935,"83":0.01319,"88":0.00659,"94":0.01319,"101":0.01978,"102":0.01978,"107":0.00659,"108":0.00659,"109":0.01319,"110":0.00659,"111":0.00659,"112":0.01319,"113":0.02638,"114":0.04616,"115":0.30992,"116":0.02638,"117":0.02638,"118":0.29673,"119":1.8727,"120":0.38245,_:"2 3 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 45 46 47 49 51 64 66 67 69 71 72 73 74 75 76 79 80 81 82 84 85 86 87 89 90 91 92 93 95 96 97 98 99 100 103 104 105 106 121 122 123 3.5 3.6"},D:{"41":0.00659,"46":0.00659,"47":0.01319,"48":0.06594,"49":0.03956,"51":0.01319,"52":0.00659,"55":0.00659,"56":0.07913,"57":0.00659,"60":0.01319,"61":0.02638,"62":0.00659,"63":0.01319,"64":0.01319,"65":0.01319,"66":0.01319,"67":0.00659,"68":0.03956,"69":0.05275,"70":0.04616,"71":0.02638,"72":0.05275,"73":0.01978,"74":0.05275,"75":0.05275,"76":0.18463,"77":0.03956,"78":0.04616,"79":0.23079,"80":0.13188,"81":0.1055,"83":0.12529,"84":0.06594,"85":0.07913,"86":0.1121,"87":0.12529,"88":0.06594,"89":0.05275,"90":0.07913,"91":0.09891,"92":0.03297,"93":0.32311,"94":0.02638,"95":0.01319,"96":0.01978,"97":0.03297,"98":0.03297,"99":0.03297,"100":0.05275,"101":0.1055,"102":0.05275,"103":1.08801,"104":0.06594,"105":0.06594,"106":0.05275,"107":0.05935,"108":0.15826,"109":1.25286,"110":0.17804,"111":0.13847,"112":0.23079,"113":0.24398,"114":0.38905,"115":0.29673,"116":1.00888,"117":1.38474,"118":8.87552,"119":16.22783,"120":0.03297,"121":0.03297,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 42 43 44 45 50 53 54 58 59 122"},F:{"53":0.00659,"54":0.01319,"55":0.01319,"95":0.04616,"98":0.00659,"99":0.01319,"100":0.01319,"101":0.01319,"102":2.12327,"103":0.27695,"104":1.05504,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6","12.1":0.00659},B:{"12":0.01319,"15":0.00659,"16":0.00659,"18":0.00659,"80":0.01319,"81":0.00659,"83":0.01319,"84":0.01319,"85":0.01319,"86":0.01319,"87":0.75172,"88":0.00659,"89":0.00659,"92":0.02638,"99":0.05275,"106":0.00659,"107":0.01319,"108":0.01319,"109":0.12529,"110":0.01319,"111":0.01978,"112":0.01978,"113":0.01978,"114":0.02638,"115":0.03956,"116":0.05275,"117":1.38474,"118":1.21989,"119":4.56964,_:"13 14 17 79 90 91 93 94 95 96 97 98 100 101 102 103 104 105"},E:{"9":0.00659,"12":0.00659,"13":0.03297,"14":0.19123,"15":0.03297,_:"0 4 5 6 7 8 10 11 3.1 3.2 5.1 6.1 7.1 10.1","9.1":0.2176,"11.1":0.00659,"12.1":0.05275,"13.1":0.26376,"14.1":0.45499,"15.1":0.1055,"15.2-15.3":0.06594,"15.4":0.15166,"15.5":0.23738,"15.6":1.20011,"16.0":0.17144,"16.1":0.44839,"16.2":0.4352,"16.3":0.93635,"16.4":0.36267,"16.5":0.73193,"16.6":5.22245,"17.0":0.99569,"17.1":1.35177,"17.2":0.03297},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00173,"5.0-5.1":0,"6.0-6.1":0.0121,"7.0-7.1":0.00346,"8.1-8.4":0.00173,"9.0-9.2":0.00864,"9.3":0.02766,"10.0-10.2":0,"10.3":0.03111,"11.0-11.2":0.0242,"11.3-11.4":0.01383,"12.0-12.1":0.01037,"12.2-12.5":0.14001,"13.0-13.1":0.00346,"13.2":0.01383,"13.3":0.01037,"13.4-13.7":0.02939,"14.0-14.4":0.07778,"14.5-14.8":0.12964,"15.0-15.1":0.05013,"15.2-15.3":0.06741,"15.4":0.06741,"15.5":0.11408,"15.6-15.7":0.58425,"16.0":0.29558,"16.1":0.79167,"16.2":0.34917,"16.3":0.6845,"16.4":0.09161,"16.5":0.27311,"16.6-16.7":7.52436,"17.0":1.86164,"17.1":3.6576,"17.2":0.121},P:{"4":0.02269,"20":0.02269,"21":0.06807,"22":0.1021,"23":1.16845,_:"5.0-5.4 6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 13.0 14.0 15.0 16.0 18.0","17.0":0.01134,"19.0":0.01134},I:{"0":0.11097,"3":0.00011,"4":0.00009,"2.1":0.00003,"2.2":0.00021,"2.3":0.00003,"4.1":0.00004,"4.2-4.3":0.00034,"4.4":0,"4.4.3-4.4.4":0.00036},K:{"0":0.2248,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00783,"9":0.01566,"11":0.10179,_:"6 7 10 5.5"},N:{_:"10 11"},S:{"2.5":0.00341,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.06131},H:{"0":0},L:{"0":14.967},R:{_:"0"},M:{"0":0.35763},Q:{"13.1":0.01703}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-oc.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-oc.js
    index 13df5df4b86b38..323a7f36aacbe8 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-oc.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-oc.js
    @@ -1 +1 @@
    -module.exports={C:{"11":0.07274,"34":0.0052,"48":0.0052,"52":0.02078,"54":0.01039,"59":0.0052,"78":0.03118,"83":0.0052,"87":0.0052,"102":0.05716,"103":0.0052,"108":0.0052,"109":0.01039,"110":0.0052,"111":0.01039,"113":0.01559,"114":0.02598,"115":0.24941,"116":0.15588,"117":1.76144,"118":0.15068,_:"2 3 4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 38 39 40 41 42 43 44 45 46 47 49 50 51 53 55 56 57 58 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 84 85 86 88 89 90 91 92 93 94 95 96 97 98 99 100 101 104 105 106 107 112 119 120 3.5 3.6"},D:{"25":0.02078,"26":0.01039,"34":0.02598,"38":0.08314,"39":0.0052,"40":0.0052,"41":0.0052,"42":0.0052,"43":0.01039,"44":0.01039,"45":0.01039,"46":0.01039,"47":0.01039,"48":0.0052,"49":0.03118,"50":0.0052,"51":0.01039,"52":0.01559,"53":0.01039,"55":0.01039,"56":0.01039,"57":0.0052,"58":0.0052,"59":0.03118,"60":0.01039,"65":0.0052,"66":0.04676,"67":0.02598,"68":0.01039,"69":0.17147,"70":0.0052,"74":0.01039,"75":0.01039,"76":0.0052,"78":0.01039,"79":0.10392,"80":0.01039,"81":0.03637,"83":0.01039,"85":0.02598,"86":0.03118,"87":0.06755,"88":0.04676,"89":0.01559,"90":0.02078,"91":0.01559,"92":0.01559,"93":0.10912,"94":0.01559,"95":0.0052,"96":0.01559,"97":0.01559,"98":0.02078,"99":0.03637,"100":0.02598,"101":0.04676,"102":0.03637,"103":0.24421,"104":0.05196,"105":0.03118,"106":0.04676,"107":0.07794,"108":0.10392,"109":0.87812,"110":0.27019,"111":0.08833,"112":0.16108,"113":0.22343,"114":0.76381,"115":1.31978,"116":20.83076,"117":4.98296,"118":0.02598,"119":0.0052,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 27 28 29 30 31 32 33 35 36 37 54 61 62 63 64 71 72 73 77 84 120"},F:{"28":0.0052,"46":0.03637,"95":0.01559,"99":0.01559,"100":0.17147,"101":0.32735,"102":0.43646,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 9.5-9.6 10.5 10.6 11.1 11.5 11.6 12.1","10.0-10.1":0},B:{"15":0.01559,"18":0.0052,"85":0.0052,"92":0.0052,"105":0.0052,"107":0.01039,"108":0.01559,"109":0.07274,"110":0.01039,"111":0.01559,"112":0.02078,"113":0.03118,"114":0.09872,"115":0.22343,"116":3.58004,"117":2.49408,_:"12 13 14 16 17 79 80 81 83 84 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 106"},E:{"4":0,"9":0.01039,"13":0.03118,"14":0.15068,"15":0.03118,_:"0 5 6 7 8 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1 17.1","11.1":0.01039,"12.1":0.05196,"13.1":0.19225,"14.1":0.3949,"15.1":0.05716,"15.2-15.3":0.06235,"15.4":0.10392,"15.5":0.16627,"15.6":0.93008,"16.0":0.08314,"16.1":0.24941,"16.2":0.21304,"16.3":0.54558,"16.4":0.19745,"16.5":0.57156,"16.6":4.43219,"17.0":0.15068},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00727,"6.0-6.1":0.01212,"7.0-7.1":0.00727,"8.1-8.4":0.01212,"9.0-9.2":0.00727,"9.3":0.08487,"10.0-10.2":0.00242,"10.3":0.12852,"11.0-11.2":0.08487,"11.3-11.4":0.0582,"12.0-12.1":0.0291,"12.2-12.5":0.52861,"13.0-13.1":0.00485,"13.2":0.00485,"13.3":0.02667,"13.4-13.7":0.05335,"14.0-14.4":0.15034,"14.5-14.8":0.29098,"15.0-15.1":0.09942,"15.2-15.3":0.11397,"15.4":0.14549,"15.5":0.20126,"15.6-15.7":1.56886,"16.0":0.65955,"16.1":1.37973,"16.2":0.6547,"16.3":1.21969,"16.4":0.19641,"16.5":0.63531,"16.6":14.67265,"17.0":0.94083,"17.1":0},P:{"4":0.21482,"20":0.07519,"21":0.17186,"22":2.58862,"5.0-5.4":0.03222,"6.2-6.4":0,"7.2-7.4":0.05215,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.01066,"12.0":0,"13.0":0.02148,"14.0":0.01074,"15.0":0.01043,"16.0":0.02148,"17.0":0.02148,"18.0":0.02148,"19.0":0.05371},I:{"0":0,"3":0,"4":0.00747,"2.1":0.00427,"2.2":0.00427,"2.3":0.00534,"4.1":0.00427,"4.2-4.3":0.00961,"4.4":0,"4.4.3-4.4.4":0.03203},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"8":0.06153,"9":0.04923,"11":0.12306,_:"6 7 10 5.5"},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":20.4107},R:{_:"0"},M:{"0":0.40354},Q:{"13.1":0.00961},O:{"0":0.07206},H:{"0":0.19102}};
    +module.exports={C:{"52":0.02106,"54":0.00526,"59":0.00526,"72":0.02106,"78":0.02632,"83":0.00526,"88":0.01579,"102":0.01579,"104":0.00526,"109":0.00526,"113":0.01053,"114":0.00526,"115":0.2632,"116":0.01579,"117":0.03685,"118":0.08422,"119":1.49498,"120":0.41059,_:"2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 53 55 56 57 58 60 61 62 63 64 65 66 67 68 69 70 71 73 74 75 76 77 79 80 81 82 84 85 86 87 89 90 91 92 93 94 95 96 97 98 99 100 101 103 105 106 107 108 110 111 112 121 122 123 3.5 3.6"},D:{"25":0.02106,"26":0.00526,"34":0.02632,"35":0.02632,"38":0.0737,"39":0.01579,"40":0.01579,"41":0.01579,"42":0.01579,"43":0.01579,"44":0.01579,"45":0.01579,"46":0.01579,"47":0.01579,"48":0.01579,"49":0.03685,"50":0.01579,"51":0.01579,"52":0.02106,"53":0.01579,"54":0.01579,"55":0.01579,"56":0.01579,"57":0.01579,"58":0.01579,"59":0.03158,"60":0.01579,"65":0.01053,"66":0.04738,"67":0.03158,"69":0.20003,"74":0.00526,"75":0.00526,"76":0.00526,"78":0.00526,"79":0.09475,"80":0.01053,"81":0.03158,"83":0.01053,"85":0.02106,"86":0.04211,"87":0.06317,"88":0.03158,"89":0.01053,"90":0.01579,"91":0.00526,"92":0.01053,"93":0.03158,"94":0.01579,"95":0.01579,"96":0.01579,"97":0.02632,"98":0.01579,"99":0.04211,"100":0.04211,"101":0.06317,"102":0.04211,"103":0.22635,"104":0.05264,"105":0.02632,"106":0.05264,"107":0.05264,"108":0.0737,"109":0.80013,"110":0.04211,"111":0.0579,"112":0.0737,"113":0.07896,"114":0.21582,"115":0.20003,"116":0.83698,"117":0.97384,"118":6.41155,"119":20.18744,"120":0.03158,"121":0.01579,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 27 28 29 30 31 32 33 36 37 61 62 63 64 68 70 71 72 73 77 84 122"},F:{"46":0.03685,"95":0.01579,"102":0.43165,"103":0.0737,"104":0.34216,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"85":0.00526,"92":0.00526,"105":0.00526,"106":0.00526,"107":0.01053,"108":0.01053,"109":0.0737,"110":0.01053,"111":0.01053,"112":0.01053,"113":0.02632,"114":0.04211,"115":0.02106,"116":0.0737,"117":0.20003,"118":1.15282,"119":5.57984,_:"12 13 14 15 16 17 18 79 80 81 83 84 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104"},E:{"9":0.00526,"13":0.02632,"14":0.1316,"15":0.02632,_:"0 4 5 6 7 8 10 11 12 3.1 3.2 5.1 6.1 7.1 9.1 10.1","11.1":0.01053,"12.1":0.03685,"13.1":0.18424,"14.1":0.35795,"15.1":0.05264,"15.2-15.3":0.06317,"15.4":0.08949,"15.5":0.16318,"15.6":0.91594,"16.0":0.07896,"16.1":0.23162,"16.2":0.17898,"16.3":0.46323,"16.4":0.15792,"16.5":0.38954,"16.6":3.15314,"17.0":0.64221,"17.1":1.28442,"17.2":0.02632},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00944,"6.0-6.1":0.00944,"7.0-7.1":0.00708,"8.1-8.4":0.00708,"9.0-9.2":0.00708,"9.3":0.08258,"10.0-10.2":0.00236,"10.3":0.11562,"11.0-11.2":0.14629,"11.3-11.4":0.04955,"12.0-12.1":0.02359,"12.2-12.5":0.48134,"13.0-13.1":0.00472,"13.2":0.00472,"13.3":0.01888,"13.4-13.7":0.04011,"14.0-14.4":0.12269,"14.5-14.8":0.21235,"15.0-15.1":0.08258,"15.2-15.3":0.09674,"15.4":0.11797,"15.5":0.18168,"15.6-15.7":0.97683,"16.0":0.53325,"16.1":1.16323,"16.2":0.51909,"16.3":1.00987,"16.4":0.15101,"16.5":0.41527,"16.6-16.7":10.10102,"17.0":2.11883,"17.1":4.21879,"17.2":0.12033},P:{"4":0.18827,"20":0.05537,"21":0.12182,"22":0.25472,"23":2.42538,"5.0-5.4":0.03322,_:"6.2-6.4 7.2-7.4 8.2 9.2 10.1 11.1-11.2 12.0 15.0","13.0":0.02215,"14.0":0.01107,"16.0":0.01107,"17.0":0.02215,"18.0":0.02215,"19.0":0.0443},I:{"0":0.05188,"3":0,"4":0.00002,"2.1":0,"2.2":0.00001,"2.3":0.00002,"4.1":0.00001,"4.2-4.3":0.00003,"4.4":0,"4.4.3-4.4.4":0.0001},K:{"0":0.1658,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.02895,"9":0.02895,"11":0.11581,_:"6 7 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.05211},H:{"0":0},L:{"0":20.25549},R:{_:"0"},M:{"0":0.38843},Q:{"13.1":0.00947}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-sa.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-sa.js
    index c85ef97360ace0..ecbd1414416205 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-sa.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-sa.js
    @@ -1 +1 @@
    -module.exports={C:{"7":0.06306,"42":0.04504,"45":0.03153,"50":0.13062,"52":0.16214,"54":0.14413,"68":0.0045,"75":0.0045,"78":0.01351,"88":0.01351,"89":0.0045,"90":0.0045,"91":0.03153,"102":0.03153,"103":0.0045,"105":0.0045,"107":0.0045,"108":0.0045,"109":0.00901,"110":0.00901,"111":0.00901,"112":0.00901,"113":0.01351,"114":0.01802,"115":0.31078,"116":0.08107,"117":1.09898,"118":0.1126,_:"2 3 4 5 6 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 43 44 46 47 48 49 51 53 55 56 57 58 59 60 61 62 63 64 65 66 67 69 70 71 72 73 74 76 77 79 80 81 82 83 84 85 86 87 92 93 94 95 96 97 98 99 100 101 104 106 119 120 3.5 3.6"},D:{"38":0.01351,"47":0.06756,"49":0.03153,"51":0.00901,"55":0.06756,"57":0.14413,"60":0.41887,"62":0.01351,"66":0.00901,"68":0.01351,"69":0.00901,"70":0.0045,"71":0.0045,"72":0.0045,"73":0.0045,"74":0.00901,"75":0.01802,"76":0.01351,"77":0.01351,"78":0.00901,"79":0.1171,"80":0.02252,"81":0.03153,"83":0.01351,"84":0.00901,"85":0.02702,"86":0.02702,"87":0.05855,"88":0.02702,"89":0.01802,"90":0.02702,"91":0.46391,"92":0.02702,"93":0.01351,"94":0.01351,"95":0.00901,"96":0.01802,"97":0.01802,"98":0.01351,"99":0.02252,"100":0.02252,"101":0.01802,"102":0.03603,"103":0.08107,"104":0.02252,"105":0.04054,"106":0.04954,"107":0.07206,"108":0.08107,"109":3.0447,"110":0.04054,"111":0.05855,"112":0.08558,"113":0.10359,"114":0.25222,"115":0.40986,"116":19.43026,"117":6.03536,"118":0.01802,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 48 50 52 53 54 56 58 59 61 63 64 65 67 119 120"},F:{"28":0.00901,"36":0.0045,"77":0.0045,"85":0.0045,"94":0.0045,"95":0.08107,"99":0.01351,"100":0.52246,"101":0.98187,"102":1.53136,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 78 79 80 81 82 83 84 86 87 88 89 90 91 92 93 96 97 98 9.5-9.6 10.5 10.6 11.1 11.5 11.6 12.1","10.0-10.1":0},B:{"12":0.06756,"13":0.13512,"14":0.13512,"15":0.09008,"17":0.00901,"18":0.0045,"92":0.01802,"107":0.00901,"108":0.00901,"109":0.05855,"110":0.00901,"111":0.00901,"112":0.00901,"113":0.00901,"114":0.04054,"115":0.05405,"116":1.63946,"117":1.59892,_:"16 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106"},E:{"4":0,"14":0.01351,_:"0 5 6 7 8 9 10 11 12 13 15 3.1 3.2 6.1 7.1 10.1 11.1 12.1 17.1","5.1":0.01802,"9.1":0.02252,"13.1":0.02252,"14.1":0.03603,"15.1":0.0045,"15.2-15.3":0.0045,"15.4":0.00901,"15.5":0.01351,"15.6":0.07657,"16.0":0.00901,"16.1":0.02252,"16.2":0.01802,"16.3":0.04504,"16.4":0.02252,"16.5":0.07206,"16.6":0.32429,"17.0":0.03153},G:{"8":0,"3.2":0.00072,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.0043,"6.0-6.1":0,"7.0-7.1":0.00287,"8.1-8.4":0.00072,"9.0-9.2":0.00072,"9.3":0.01648,"10.0-10.2":0,"10.3":0.01719,"11.0-11.2":0.02006,"11.3-11.4":0.01504,"12.0-12.1":0.01361,"12.2-12.5":0.08524,"13.0-13.1":0.00287,"13.2":0.00287,"13.3":0.12679,"13.4-13.7":0.01146,"14.0-14.4":0.03009,"14.5-14.8":0.07808,"15.0-15.1":0.01719,"15.2-15.3":0.02507,"15.4":0.02722,"15.5":0.04728,"15.6-15.7":0.6146,"16.0":0.18767,"16.1":0.33308,"16.2":0.15043,"16.3":0.32521,"16.4":0.04943,"16.5":0.17048,"16.6":4.15604,"17.0":0.51718,"17.1":0.00143},P:{"4":0.11473,"20":0.05215,"21":0.1043,"22":1.73141,"5.0-5.4":0.03222,"6.2-6.4":0,"7.2-7.4":0.15645,"8.2":0,"9.2":0,"10.1":0,"11.1-11.2":0.02086,"12.0":0,"13.0":0.02086,"14.0":0.01074,"15.0":0.01043,"16.0":0.03129,"17.0":0.06258,"18.0":0.01043,"19.0":0.04172},I:{"0":0,"3":0,"4":0.00564,"2.1":0,"2.2":0,"2.3":0,"4.1":0.00705,"4.2-4.3":0.00282,"4.4":0,"4.4.3-4.4.4":0.03946},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"8":0.00918,"9":0.14685,"11":0.33041,_:"6 7 10 5.5"},S:{"2.5":0,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":46.75432},R:{_:"0"},M:{"0":0.1319},Q:{"13.1":0},O:{"0":0.06046},H:{"0":0.23935}};
    +module.exports={C:{"7":0.1055,"42":0.06881,"50":0.20183,"52":0.22935,"54":0.23394,"78":0.01376,"88":0.01376,"89":0.00459,"90":0.00917,"91":0.02752,"102":0.00917,"103":0.00917,"105":0.00459,"106":0.00459,"108":0.00459,"109":0.00459,"110":0.00459,"111":0.00459,"112":0.00459,"113":0.01376,"114":0.00917,"115":0.26605,"116":0.00917,"117":0.01835,"118":0.05046,"119":0.88529,"120":0.27981,_:"2 3 4 5 6 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 43 44 45 46 47 48 49 51 53 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 79 80 81 82 83 84 85 86 87 92 93 94 95 96 97 98 99 100 101 104 107 121 122 123 3.5 3.6"},D:{"38":0.01376,"47":0.10091,"49":0.02294,"55":0.11009,"57":0.22935,"60":0.65594,"66":0.00917,"75":0.00917,"76":0.00459,"77":0.00459,"78":0.00459,"79":0.09174,"80":0.00459,"81":0.01376,"83":0.00459,"84":0.00459,"85":0.01835,"86":0.01376,"87":0.0367,"88":0.01376,"89":0.00917,"90":0.00917,"91":0.68805,"92":0.03211,"93":0.05046,"94":0.00917,"95":0.00917,"96":0.01376,"97":0.01835,"98":0.01376,"99":0.00917,"100":0.01376,"101":0.00917,"102":0.01835,"103":0.06881,"104":0.01376,"105":0.03211,"106":0.04128,"107":0.05504,"108":0.07798,"109":3.45401,"110":0.04128,"111":0.05504,"112":0.05504,"113":0.03211,"114":0.09174,"115":0.07339,"116":0.2477,"117":0.32109,"118":4.74755,"119":21.01763,"120":0.02294,"121":0.00459,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 39 40 41 42 43 44 45 46 48 50 51 52 53 54 56 58 59 61 62 63 64 65 67 68 69 70 71 72 73 74 122"},F:{"95":0.06422,"102":1.51371,"103":0.12385,"104":1.24308,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.10091,"13":0.22018,"14":0.22018,"15":0.11009,"17":0.01376,"18":0.00459,"92":0.02294,"107":0.00459,"108":0.00917,"109":0.05504,"110":0.00459,"111":0.00459,"113":0.00459,"114":0.01376,"115":0.00917,"116":0.01376,"117":0.06881,"118":0.53209,"119":2.93568,_:"16 79 80 81 83 84 85 86 87 88 89 90 91 93 94 95 96 97 98 99 100 101 102 103 104 105 106 112"},E:{"14":0.01376,_:"0 4 5 6 7 8 9 10 11 12 13 15 3.1 3.2 6.1 7.1 9.1 10.1 11.1 12.1","5.1":0.00917,"13.1":0.01835,"14.1":0.04128,"15.1":0.00459,"15.2-15.3":0.00459,"15.4":0.00917,"15.5":0.00917,"15.6":0.07339,"16.0":0.00917,"16.1":0.02294,"16.2":0.01376,"16.3":0.04128,"16.4":0.01835,"16.5":0.0367,"16.6":0.16055,"17.0":0.11009,"17.1":0.15137,"17.2":0.00459},G:{"8":0,"3.2":0.00071,"4.0-4.1":0,"4.2-4.3":0,"5.0-5.1":0.00283,"6.0-6.1":0,"7.0-7.1":0.00212,"8.1-8.4":0,"9.0-9.2":0.00071,"9.3":0.01201,"10.0-10.2":0,"10.3":0.0106,"11.0-11.2":0.0219,"11.3-11.4":0.04239,"12.0-12.1":0.01272,"12.2-12.5":0.06571,"13.0-13.1":0.00141,"13.2":0,"13.3":0.00283,"13.4-13.7":0.00848,"14.0-14.4":0.02049,"14.5-14.8":0.05299,"15.0-15.1":0.01272,"15.2-15.3":0.01696,"15.4":0.0219,"15.5":0.03886,"15.6-15.7":0.32783,"16.0":0.15261,"16.1":0.27978,"16.2":0.13071,"16.3":0.25859,"16.4":0.04098,"16.5":0.12364,"16.6-16.7":2.74415,"17.0":0.98137,"17.1":1.43566,"17.2":0.0431},P:{"4":0.08472,"20":0.03177,"21":0.06354,"22":0.16944,"23":1.55678,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 12.0 14.0 15.0","7.2-7.4":0.12708,"11.1-11.2":0.01059,"13.0":0.01059,"16.0":0.02118,"17.0":0.05295,"18.0":0.01059,"19.0":0.03177},I:{"0":0.04855,"3":0,"4":0.00002,"2.1":0,"2.2":0,"2.3":0,"4.1":0,"4.2-4.3":0.00001,"4.4":0,"4.4.3-4.4.4":0.00013},K:{"0":0.24904,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.00467,"9":0.21498,"11":0.52344,_:"6 7 10 5.5"},N:{_:"10 11"},S:{_:"2.5 3.0-3.1"},J:{_:"7 10"},O:{"0":0.05414},H:{"0":0},L:{"0":45.45884},R:{_:"0"},M:{"0":0.12452},Q:{_:"13.1"}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-ww.js b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-ww.js
    index 7d6cfde21201ae..2450e8e6df2f07 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-ww.js
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/data/regions/alt-ww.js
    @@ -1 +1 @@
    -module.exports={C:{"11":0.00907,"43":0.00454,"44":0.00454,"45":0.00454,"48":0.01814,"50":0.00907,"52":0.05442,"53":0.00907,"54":0.00907,"56":0.01361,"59":0.00454,"72":0.01361,"78":0.03628,"83":0.00454,"88":0.00454,"89":0.00454,"91":0.00454,"94":0.00454,"102":0.11791,"103":0.02268,"105":0.00454,"106":0.00454,"107":0.00454,"108":0.00907,"109":0.00907,"110":0.00907,"111":0.00907,"112":0.06349,"113":0.01814,"114":0.01814,"115":0.31745,"116":0.11338,"117":1.56458,"118":0.13605,_:"2 3 4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 46 47 49 51 55 57 58 60 61 62 63 64 65 66 67 68 69 70 71 73 74 75 76 77 79 80 81 82 84 85 86 87 90 92 93 95 96 97 98 99 100 101 104 119 120 3.5 3.6"},D:{"34":0.00454,"38":0.01361,"47":0.00907,"48":0.01814,"49":0.03628,"50":0.00907,"51":0.00454,"53":0.00907,"55":0.00907,"56":0.03175,"57":0.00907,"58":0.00907,"60":0.02721,"61":0.00454,"62":0.00454,"63":0.00454,"65":0.01361,"66":0.02268,"67":0.00454,"68":0.03175,"69":0.06349,"70":0.0771,"71":0.02268,"72":0.03175,"73":0.04082,"74":0.04082,"75":0.04082,"76":0.10431,"77":0.03628,"78":0.04535,"79":0.20408,"80":0.06803,"81":0.06349,"83":0.11338,"84":0.03628,"85":0.08617,"86":0.0907,"87":0.09977,"88":0.05896,"89":0.04535,"90":0.06803,"91":0.07256,"92":0.02721,"93":0.13152,"94":0.02721,"95":0.01361,"96":0.02268,"97":0.02721,"98":0.06803,"99":0.04535,"100":0.03175,"101":0.03628,"102":0.04082,"103":0.21768,"104":0.04535,"105":0.04989,"106":0.05442,"107":0.17233,"108":0.21315,"109":1.78679,"110":0.18594,"111":0.32652,"112":0.24489,"113":0.15419,"114":0.82991,"115":1.44213,"116":15.36912,"117":3.86382,"118":0.02268,"119":0.01361,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 39 40 41 42 43 44 45 46 52 54 59 64 120"},F:{"28":0.00454,"46":0.01361,"54":0.00454,"55":0.00454,"77":0.00454,"85":0.00454,"89":0.00454,"95":0.05442,"97":0.11791,"99":0.02268,"100":0.26303,"101":0.58048,"102":0.64397,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 78 79 80 81 82 83 84 86 87 88 90 91 92 93 94 96 98 9.5-9.6 10.5 10.6 11.1 11.5 11.6 12.1","10.0-10.1":0},B:{"12":0.00454,"13":0.00454,"14":0.00454,"15":0.00454,"17":0.00454,"18":0.01361,"80":0.00907,"81":0.00907,"83":0.00907,"84":0.00907,"85":0.00454,"86":0.00907,"87":0.00454,"88":0.00454,"89":0.00454,"90":0.00907,"92":0.01361,"99":0.01361,"107":0.00907,"108":0.00907,"109":0.07256,"110":0.01361,"111":0.12698,"112":0.12698,"113":0.02721,"114":0.17687,"115":0.14512,"116":2.54867,"117":1.76865,_:"16 79 91 93 94 95 96 97 98 100 101 102 103 104 105 106"},E:{"4":0,"13":0.01814,"14":0.0907,"15":0.01814,_:"0 5 6 7 8 9 10 11 12 3.1 3.2 6.1 7.1 10.1 17.1","5.1":0.00907,"9.1":0.1814,"11.1":0.00454,"12.1":0.02721,"13.1":0.13152,"14.1":0.24036,"15.1":0.04082,"15.2-15.3":0.03628,"15.4":0.06803,"15.5":0.10884,"15.6":0.5442,"16.0":0.06803,"16.1":0.15873,"16.2":0.15419,"16.3":0.3628,"16.4":0.18594,"16.5":0.44443,"16.6":2.50332,"17.0":0.09977},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00286,"5.0-5.1":0.00286,"6.0-6.1":0.00286,"7.0-7.1":0.01,"8.1-8.4":0.00286,"9.0-9.2":0.01,"9.3":0.03427,"10.0-10.2":0.00143,"10.3":0.05141,"11.0-11.2":0.02142,"11.3-11.4":0.01571,"12.0-12.1":0.01428,"12.2-12.5":0.23848,"13.0-13.1":0.00714,"13.2":0.01285,"13.3":0.15566,"13.4-13.7":0.04998,"14.0-14.4":0.13566,"14.5-14.8":0.22563,"15.0-15.1":0.08997,"15.2-15.3":0.09853,"15.4":0.11281,"15.5":0.15708,"15.6-15.7":1.03961,"16.0":0.41127,"16.1":0.76114,"16.2":0.387,"16.3":0.72259,"16.4":0.16422,"16.5":0.48982,"16.6":7.98414,"17.0":0.70402,"17.1":0.00143},P:{"4":0.10707,"20":0.06424,"21":0.1392,"22":1.87381,"5.0-5.4":0,"6.2-6.4":0,"7.2-7.4":0.03212,"8.2":0,"9.2":0.01032,"10.1":0.01032,"11.1-11.2":0.01071,"12.0":0.02063,"13.0":0.02141,"14.0":0.01071,"15.0":0.01032,"16.0":0.02141,"17.0":0.03212,"18.0":0.02141,"19.0":0.05354},I:{"0":0,"3":0,"4":0.01565,"2.1":0,"2.2":0.01565,"2.3":0,"4.1":0.01565,"4.2-4.3":0.05476,"4.4":0,"4.4.3-4.4.4":0.24253},K:{_:"0 10 11 12 11.1 11.5 12.1"},A:{"8":0.02598,"9":0.06496,"11":0.38976,_:"6 7 10 5.5"},S:{"2.5":0.05464,_:"3.0-3.1"},J:{"7":0,"10":0},N:{"10":0,"11":0},L:{"0":36.38025},R:{_:"0"},M:{"0":0.27866},Q:{"13.1":0.16392},O:{"0":0.89063},H:{"0":1.02942}};
    +module.exports={C:{"7":0.00447,"11":0.02684,"12":0.01342,"43":0.00447,"44":0.00447,"48":0.03132,"50":0.01342,"52":0.06264,"53":0.00895,"54":0.0179,"56":0.02237,"59":0.00895,"63":0.00447,"68":0.00447,"72":0.00895,"77":0.00447,"78":0.02684,"83":0.00447,"88":0.00895,"91":0.01342,"94":0.00447,"101":0.00447,"102":0.03132,"103":0.03132,"105":0.00447,"106":0.00447,"107":0.00447,"108":0.00895,"109":0.00895,"110":0.00895,"111":0.00895,"112":0.00895,"113":0.01342,"114":0.0179,"115":0.38476,"116":0.0179,"117":0.0179,"118":0.13422,"119":1.44063,"120":0.37134,_:"2 3 4 5 6 8 9 10 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 45 46 47 49 51 55 57 58 60 61 62 64 65 66 67 69 70 71 73 74 75 76 79 80 81 82 84 85 86 87 89 90 92 93 95 96 97 98 99 100 104 121 122 123 3.5 3.6"},D:{"34":0.00447,"38":0.01342,"41":0.00447,"47":0.00895,"48":0.02684,"49":0.03132,"50":0.00895,"51":0.00447,"52":0.00447,"53":0.00895,"55":0.00895,"56":0.02684,"57":0.01342,"58":0.00447,"60":0.03579,"61":0.01342,"63":0.00895,"64":0.00447,"65":0.00895,"66":0.02237,"67":0.00447,"68":0.01342,"69":0.04921,"70":0.04474,"71":0.01342,"72":0.0179,"73":0.02684,"74":0.02684,"75":0.02237,"76":0.05816,"77":0.02237,"78":0.02684,"79":0.16106,"80":0.04921,"81":0.04474,"83":0.05369,"84":0.02684,"85":0.07606,"86":0.06264,"87":0.08948,"88":0.02684,"89":0.02684,"90":0.03579,"91":0.07158,"92":0.04027,"93":0.1208,"94":0.03132,"95":0.0179,"96":0.0179,"97":0.02237,"98":0.06711,"99":0.03579,"100":0.03579,"101":0.04921,"102":0.03579,"103":0.38029,"104":0.04921,"105":0.04921,"106":0.05816,"107":0.05369,"108":0.11185,"109":1.80302,"110":0.08053,"111":0.09395,"112":0.11632,"113":0.1029,"114":0.21923,"115":0.14764,"116":0.49661,"117":0.69347,"118":5.40907,"119":14.77315,"120":0.02237,"121":0.01342,_:"4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 35 36 37 39 40 42 43 44 45 46 54 59 62 122"},F:{"46":0.01342,"95":0.05816,"99":0.00447,"100":0.00447,"101":0.00447,"102":0.91717,"103":0.16554,"104":0.6711,_:"9 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 47 48 49 50 51 52 53 54 55 56 57 58 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 9.5-9.6 10.0-10.1 10.5 10.6 11.1 11.5 11.6 12.1"},B:{"12":0.00895,"13":0.00895,"14":0.01342,"15":0.00895,"17":0.00447,"18":0.00895,"84":0.00447,"85":0.00447,"87":0.21923,"92":0.0179,"99":0.0179,"106":0.00447,"107":0.00895,"108":0.01342,"109":0.08501,"110":0.01342,"111":0.01342,"112":0.01342,"113":0.0179,"114":0.02237,"115":0.02684,"116":0.04027,"117":0.4653,"118":0.81874,"119":3.50314,_:"16 79 80 81 83 86 88 89 90 91 93 94 95 96 97 98 100 101 102 103 104 105"},E:{"13":0.01342,"14":0.08501,"15":0.0179,_:"0 4 5 6 7 8 9 10 11 12 3.1 3.2 6.1 7.1 10.1","5.1":0.00895,"9.1":0.06711,"11.1":0.00895,"12.1":0.02237,"13.1":0.11632,"14.1":0.2058,"15.1":0.04474,"15.2-15.3":0.03132,"15.4":0.06711,"15.5":0.1029,"15.6":0.52346,"16.0":0.06711,"16.1":0.18343,"16.2":0.16554,"16.3":0.37134,"16.4":0.14317,"16.5":0.29528,"16.6":2.09831,"17.0":0.4474,"17.1":0.69347,"17.2":0.0179},G:{"8":0,"3.2":0,"4.0-4.1":0,"4.2-4.3":0.00278,"5.0-5.1":0.00278,"6.0-6.1":0.00695,"7.0-7.1":0.00973,"8.1-8.4":0.00139,"9.0-9.2":0.01112,"9.3":0.03476,"10.0-10.2":0.00278,"10.3":0.05005,"11.0-11.2":0.02364,"11.3-11.4":0.02086,"12.0-12.1":0.01251,"12.2-12.5":0.22802,"13.0-13.1":0.00556,"13.2":0.02364,"13.3":0.0139,"13.4-13.7":0.04032,"14.0-14.4":0.10706,"14.5-14.8":0.17379,"15.0-15.1":0.06813,"15.2-15.3":0.08342,"15.4":0.09315,"15.5":0.13069,"15.6-15.7":0.68683,"16.0":0.32256,"16.1":0.64651,"16.2":0.31005,"16.3":0.58116,"16.4":0.11957,"16.5":0.30866,"16.6-16.7":5.23186,"17.0":1.56691,"17.1":2.63192,"17.2":0.07508},P:{"4":0.10956,"20":0.04383,"21":0.09861,"22":0.252,"23":1.85162,_:"5.0-5.4 6.2-6.4 8.2 9.2 10.1 12.0 14.0 15.0","7.2-7.4":0.03287,"11.1-11.2":0.01096,"13.0":0.01096,"16.0":0.02191,"17.0":0.03287,"18.0":0.02191,"19.0":0.04383},I:{"0":0.21444,"3":0.00002,"4":0.00004,"2.1":0,"2.2":0.00004,"2.3":0,"4.1":0.00002,"4.2-4.3":0.00015,"4.4":0,"4.4.3-4.4.4":0.00065},K:{"0":1.10046,_:"10 11 12 11.1 11.5 12.1"},A:{"8":0.01266,"9":0.06328,"11":0.367,_:"6 7 10 5.5"},N:{_:"10 11"},S:{"2.5":0.06631,_:"3.0-3.1"},J:{_:"7 10"},O:{"0":0.80127},H:{"0":0.06},L:{"0":36.65356},R:{_:"0"},M:{"0":0.28183},Q:{"13.1":0.14368}};
    diff --git a/tools/node_modules/eslint/node_modules/caniuse-lite/package.json b/tools/node_modules/eslint/node_modules/caniuse-lite/package.json
    index af7c3a5c569cea..c2a34c1f6c6ddb 100644
    --- a/tools/node_modules/eslint/node_modules/caniuse-lite/package.json
    +++ b/tools/node_modules/eslint/node_modules/caniuse-lite/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "caniuse-lite",
    -  "version": "1.0.30001547",
    +  "version": "1.0.30001570",
       "description": "A smaller version of caniuse-db, with only the essentials!",
       "main": "dist/unpacker/index.js",
       "files": [
    diff --git a/tools/node_modules/eslint/node_modules/comment-parser/package.json b/tools/node_modules/eslint/node_modules/comment-parser/package.json
    index 68080a65287a4a..f20c80355dbbba 100644
    --- a/tools/node_modules/eslint/node_modules/comment-parser/package.json
    +++ b/tools/node_modules/eslint/node_modules/comment-parser/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "comment-parser",
    -  "version": "1.4.0",
    +  "version": "1.4.1",
       "description": "Generic JSDoc-like comment parser",
       "type": "module",
       "main": "lib/index.cjs",
    diff --git a/tools/node_modules/eslint/node_modules/electron-to-chromium/chromium-versions.js b/tools/node_modules/eslint/node_modules/electron-to-chromium/chromium-versions.js
    index 4a34bafd738c21..cbcc9ea929750f 100644
    --- a/tools/node_modules/eslint/node_modules/electron-to-chromium/chromium-versions.js
    +++ b/tools/node_modules/eslint/node_modules/electron-to-chromium/chromium-versions.js
    @@ -54,5 +54,8 @@ module.exports = {
     	"112": "24.0",
     	"114": "25.0",
     	"116": "26.0",
    -	"118": "27.0"
    +	"118": "27.0",
    +	"119": "28.0",
    +	"120": "28.0",
    +	"121": "29.0"
     };
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/electron-to-chromium/chromium-versions.json b/tools/node_modules/eslint/node_modules/electron-to-chromium/chromium-versions.json
    index 1c867933747c44..63cd08b8f9c571 100644
    --- a/tools/node_modules/eslint/node_modules/electron-to-chromium/chromium-versions.json
    +++ b/tools/node_modules/eslint/node_modules/electron-to-chromium/chromium-versions.json
    @@ -1 +1 @@
    -{"39":"0.20","40":"0.21","41":"0.21","42":"0.25","43":"0.27","44":"0.30","45":"0.31","47":"0.36","49":"0.37","50":"1.1","51":"1.2","52":"1.3","53":"1.4","54":"1.4","56":"1.6","58":"1.7","59":"1.8","61":"2.0","66":"3.0","69":"4.0","72":"5.0","73":"5.0","76":"6.0","78":"7.0","79":"8.0","80":"8.0","82":"9.0","83":"9.0","84":"10.0","85":"10.0","86":"11.0","87":"11.0","89":"12.0","90":"13.0","91":"13.0","92":"14.0","93":"14.0","94":"15.0","95":"16.0","96":"16.0","98":"17.0","99":"18.0","100":"18.0","102":"19.0","103":"20.0","104":"20.0","105":"21.0","106":"21.0","107":"22.0","108":"22.0","110":"23.0","111":"24.0","112":"24.0","114":"25.0","116":"26.0","118":"27.0"}
    \ No newline at end of file
    +{"39":"0.20","40":"0.21","41":"0.21","42":"0.25","43":"0.27","44":"0.30","45":"0.31","47":"0.36","49":"0.37","50":"1.1","51":"1.2","52":"1.3","53":"1.4","54":"1.4","56":"1.6","58":"1.7","59":"1.8","61":"2.0","66":"3.0","69":"4.0","72":"5.0","73":"5.0","76":"6.0","78":"7.0","79":"8.0","80":"8.0","82":"9.0","83":"9.0","84":"10.0","85":"10.0","86":"11.0","87":"11.0","89":"12.0","90":"13.0","91":"13.0","92":"14.0","93":"14.0","94":"15.0","95":"16.0","96":"16.0","98":"17.0","99":"18.0","100":"18.0","102":"19.0","103":"20.0","104":"20.0","105":"21.0","106":"21.0","107":"22.0","108":"22.0","110":"23.0","111":"24.0","112":"24.0","114":"25.0","116":"26.0","118":"27.0","119":"28.0","120":"28.0","121":"29.0"}
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/electron-to-chromium/full-chromium-versions.js b/tools/node_modules/eslint/node_modules/electron-to-chromium/full-chromium-versions.js
    index 2520f20f794b54..dd25d2ba13d912 100644
    --- a/tools/node_modules/eslint/node_modules/electron-to-chromium/full-chromium-versions.js
    +++ b/tools/node_modules/eslint/node_modules/electron-to-chromium/full-chromium-versions.js
    @@ -2514,7 +2514,8 @@ module.exports = {
     		"24.8.4",
     		"24.8.5",
     		"24.8.6",
    -		"24.8.7"
    +		"24.8.7",
    +		"24.8.8"
     	],
     	"114.0.5694.0": [
     		"25.0.0-alpha.1",
    @@ -2628,7 +2629,15 @@ module.exports = {
     		"25.8.2",
     		"25.8.3",
     		"25.8.4",
    -		"25.9.0"
    +		"25.9.0",
    +		"25.9.1",
    +		"25.9.2",
    +		"25.9.3",
    +		"25.9.4",
    +		"25.9.5",
    +		"25.9.6",
    +		"25.9.7",
    +		"25.9.8"
     	],
     	"116.0.5791.0": [
     		"26.0.0-alpha.1",
    @@ -2727,7 +2736,15 @@ module.exports = {
     		"26.2.4"
     	],
     	"116.0.5845.228": [
    -		"26.3.0"
    +		"26.3.0",
    +		"26.4.0",
    +		"26.4.1",
    +		"26.4.2",
    +		"26.4.3",
    +		"26.5.0",
    +		"26.6.0",
    +		"26.6.1",
    +		"26.6.2"
     	],
     	"118.0.5949.0": [
     		"27.0.0-alpha.1",
    @@ -2817,6 +2834,68 @@ module.exports = {
     	"118.0.5993.54": [
     		"27.0.0"
     	],
    +	"118.0.5993.89": [
    +		"27.0.1",
    +		"27.0.2"
    +	],
    +	"118.0.5993.120": [
    +		"27.0.3"
    +	],
    +	"118.0.5993.129": [
    +		"27.0.4"
    +	],
    +	"118.0.5993.144": [
    +		"27.1.0",
    +		"27.1.2"
    +	],
    +	"118.0.5993.159": [
    +		"27.1.3"
    +	],
    +	"119.0.6045.0": [
    +		"28.0.0-alpha.1",
    +		"28.0.0-alpha.2",
    +		"28.0.0-nightly.20231006",
    +		"28.0.0-nightly.20231009",
    +		"28.0.0-nightly.20231010",
    +		"28.0.0-nightly.20231011",
    +		"29.0.0-nightly.20231012",
    +		"29.0.0-nightly.20231013",
    +		"29.0.0-nightly.20231016",
    +		"29.0.0-nightly.20231017",
    +		"29.0.0-nightly.20231018",
    +		"29.0.0-nightly.20231019",
    +		"29.0.0-nightly.20231020",
    +		"29.0.0-nightly.20231023",
    +		"29.0.0-nightly.20231024"
    +	],
    +	"119.0.6045.21": [
    +		"28.0.0-alpha.3",
    +		"28.0.0-alpha.4"
    +	],
    +	"119.0.6045.33": [
    +		"28.0.0-alpha.5",
    +		"28.0.0-alpha.6",
    +		"28.0.0-alpha.7",
    +		"28.0.0-beta.1"
    +	],
    +	"120.0.6099.0": [
    +		"28.0.0-beta.2"
    +	],
    +	"120.0.6099.5": [
    +		"28.0.0-beta.3",
    +		"28.0.0-beta.4"
    +	],
    +	"120.0.6099.18": [
    +		"28.0.0-beta.5",
    +		"28.0.0-beta.6",
    +		"28.0.0-beta.7",
    +		"28.0.0-beta.8",
    +		"28.0.0-beta.9",
    +		"28.0.0-beta.10"
    +	],
    +	"120.0.6099.35": [
    +		"28.0.0-beta.11"
    +	],
     	"118.0.5991.0": [
     		"28.0.0-nightly.20230906"
     	],
    @@ -2851,9 +2930,63 @@ module.exports = {
     		"28.0.0-nightly.20231004",
     		"28.0.0-nightly.20231005"
     	],
    -	"119.0.6045.0": [
    -		"28.0.0-nightly.20231006",
    -		"28.0.0-nightly.20231009",
    -		"28.0.0-nightly.20231010"
    +	"120.0.6099.56": [
    +		"28.0.0"
    +	],
    +	"121.0.6147.0": [
    +		"29.0.0-alpha.1",
    +		"29.0.0-alpha.2",
    +		"29.0.0-alpha.3",
    +		"29.0.0-nightly.20231129",
    +		"29.0.0-nightly.20231130",
    +		"29.0.0-nightly.20231201",
    +		"29.0.0-nightly.20231204",
    +		"29.0.0-nightly.20231205",
    +		"29.0.0-nightly.20231206",
    +		"30.0.0-nightly.20231207",
    +		"30.0.0-nightly.20231208",
    +		"30.0.0-nightly.20231211"
    +	],
    +	"121.0.6159.0": [
    +		"29.0.0-alpha.4",
    +		"30.0.0-nightly.20231212",
    +		"30.0.0-nightly.20231213",
    +		"30.0.0-nightly.20231214",
    +		"30.0.0-nightly.20231215"
    +	],
    +	"120.0.6078.0": [
    +		"29.0.0-nightly.20231025",
    +		"29.0.0-nightly.20231026",
    +		"29.0.0-nightly.20231027",
    +		"29.0.0-nightly.20231030",
    +		"29.0.0-nightly.20231031",
    +		"29.0.0-nightly.20231101"
    +	],
    +	"121.0.6100.0": [
    +		"29.0.0-nightly.20231102",
    +		"29.0.0-nightly.20231103"
    +	],
    +	"121.0.6104.0": [
    +		"29.0.0-nightly.20231106"
    +	],
    +	"121.0.6110.0": [
    +		"29.0.0-nightly.20231107",
    +		"29.0.0-nightly.20231108",
    +		"29.0.0-nightly.20231109",
    +		"29.0.0-nightly.20231110",
    +		"29.0.0-nightly.20231113",
    +		"29.0.0-nightly.20231114"
    +	],
    +	"121.0.6116.0": [
    +		"29.0.0-nightly.20231115",
    +		"29.0.0-nightly.20231116",
    +		"29.0.0-nightly.20231117",
    +		"29.0.0-nightly.20231120",
    +		"29.0.0-nightly.20231121",
    +		"29.0.0-nightly.20231122",
    +		"29.0.0-nightly.20231123",
    +		"29.0.0-nightly.20231124",
    +		"29.0.0-nightly.20231127",
    +		"29.0.0-nightly.20231128"
     	]
     };
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/electron-to-chromium/full-chromium-versions.json b/tools/node_modules/eslint/node_modules/electron-to-chromium/full-chromium-versions.json
    index ec680a2ca90b02..10296c05e3c540 100644
    --- a/tools/node_modules/eslint/node_modules/electron-to-chromium/full-chromium-versions.json
    +++ b/tools/node_modules/eslint/node_modules/electron-to-chromium/full-chromium-versions.json
    @@ -1 +1 @@
    -{"39.0.2171.65":["0.20.0","0.20.1","0.20.2","0.20.3","0.20.4","0.20.5","0.20.6","0.20.7","0.20.8"],"40.0.2214.91":["0.21.0","0.21.1","0.21.2"],"41.0.2272.76":["0.21.3","0.22.1","0.22.2","0.22.3","0.23.0","0.24.0"],"42.0.2311.107":["0.25.0","0.25.1","0.25.2","0.25.3","0.26.0","0.26.1","0.27.0","0.27.1"],"43.0.2357.65":["0.27.2","0.27.3","0.28.0","0.28.1","0.28.2","0.28.3","0.29.1","0.29.2"],"44.0.2403.125":["0.30.4","0.31.0"],"45.0.2454.85":["0.31.2","0.32.2","0.32.3","0.33.0","0.33.1","0.33.2","0.33.3","0.33.4","0.33.6","0.33.7","0.33.8","0.33.9","0.34.0","0.34.1","0.34.2","0.34.3","0.34.4","0.35.1","0.35.2","0.35.3","0.35.4","0.35.5"],"47.0.2526.73":["0.36.0","0.36.2","0.36.3","0.36.4"],"47.0.2526.110":["0.36.5","0.36.6","0.36.7","0.36.8","0.36.9","0.36.10","0.36.11","0.36.12"],"49.0.2623.75":["0.37.0","0.37.1","0.37.3","0.37.4","0.37.5","0.37.6","0.37.7","0.37.8","1.0.0","1.0.1","1.0.2"],"50.0.2661.102":["1.1.0","1.1.1","1.1.2","1.1.3"],"51.0.2704.63":["1.2.0","1.2.1"],"51.0.2704.84":["1.2.2","1.2.3"],"51.0.2704.103":["1.2.4","1.2.5"],"51.0.2704.106":["1.2.6","1.2.7","1.2.8"],"52.0.2743.82":["1.3.0","1.3.1","1.3.2","1.3.3","1.3.4","1.3.5","1.3.6","1.3.7","1.3.9","1.3.10","1.3.13","1.3.14","1.3.15"],"53.0.2785.113":["1.4.0","1.4.1","1.4.2","1.4.3","1.4.4","1.4.5"],"53.0.2785.143":["1.4.6","1.4.7","1.4.8","1.4.10","1.4.11","1.4.13","1.4.14","1.4.15","1.4.16"],"54.0.2840.51":["1.4.12"],"54.0.2840.101":["1.5.0","1.5.1"],"56.0.2924.87":["1.6.0","1.6.1","1.6.2","1.6.3","1.6.4","1.6.5","1.6.6","1.6.7","1.6.8","1.6.9","1.6.10","1.6.11","1.6.12","1.6.13","1.6.14","1.6.15","1.6.16","1.6.17","1.6.18"],"58.0.3029.110":["1.7.0","1.7.1","1.7.2","1.7.3","1.7.4","1.7.5","1.7.6","1.7.7","1.7.8","1.7.9","1.7.10","1.7.11","1.7.12","1.7.13","1.7.14","1.7.15","1.7.16"],"59.0.3071.115":["1.8.0","1.8.1","1.8.2-beta.1","1.8.2-beta.2","1.8.2-beta.3","1.8.2-beta.4","1.8.2-beta.5","1.8.2","1.8.3","1.8.4","1.8.5","1.8.6","1.8.7","1.8.8"],"61.0.3163.100":["2.0.0-beta.1","2.0.0-beta.2","2.0.0-beta.3","2.0.0-beta.4","2.0.0-beta.5","2.0.0-beta.6","2.0.0-beta.7","2.0.0-beta.8","2.0.0","2.0.1","2.0.2","2.0.3","2.0.4","2.0.5","2.0.6","2.0.7","2.0.8-nightly.20180819","2.0.8-nightly.20180820","2.0.8","2.0.9","2.0.10","2.0.11","2.0.12","2.0.13","2.0.14","2.0.15","2.0.16","2.0.17","2.0.18","2.1.0-unsupported.20180809"],"66.0.3359.181":["3.0.0-beta.1","3.0.0-beta.2","3.0.0-beta.3","3.0.0-beta.4","3.0.0-beta.5","3.0.0-beta.6","3.0.0-beta.7","3.0.0-beta.8","3.0.0-beta.9","3.0.0-beta.10","3.0.0-beta.11","3.0.0-beta.12","3.0.0-beta.13","3.0.0-nightly.20180818","3.0.0-nightly.20180821","3.0.0-nightly.20180823","3.0.0-nightly.20180904","3.0.0","3.0.1","3.0.2","3.0.3","3.0.4","3.0.5","3.0.6","3.0.7","3.0.8","3.0.9","3.0.10","3.0.11","3.0.12","3.0.13","3.0.14","3.0.15","3.0.16","3.1.0-beta.1","3.1.0-beta.2","3.1.0-beta.3","3.1.0-beta.4","3.1.0-beta.5","3.1.0","3.1.1","3.1.2","3.1.3","3.1.4","3.1.5","3.1.6","3.1.7","3.1.8","3.1.9","3.1.10","3.1.11","3.1.12","3.1.13","4.0.0-nightly.20180817","4.0.0-nightly.20180819","4.0.0-nightly.20180821"],"69.0.3497.106":["4.0.0-beta.1","4.0.0-beta.2","4.0.0-beta.3","4.0.0-beta.4","4.0.0-beta.5","4.0.0-beta.6","4.0.0-beta.7","4.0.0-beta.8","4.0.0-beta.9","4.0.0-beta.10","4.0.0-beta.11","4.0.0-nightly.20181010","4.0.0","4.0.1","4.0.2","4.0.3","4.0.4","4.0.5","4.0.6"],"67.0.3396.99":["4.0.0-nightly.20180929"],"68.0.3440.128":["4.0.0-nightly.20181006"],"69.0.3497.128":["4.0.7","4.0.8","4.1.0","4.1.1","4.1.2","4.1.3","4.1.4","4.1.5","4.2.0","4.2.1","4.2.2","4.2.3","4.2.4","4.2.5","4.2.6","4.2.7","4.2.8","4.2.9","4.2.10","4.2.11","4.2.12"],"72.0.3626.52":["5.0.0-beta.1","5.0.0-beta.2","6.0.0-nightly.20190123"],"73.0.3683.27":["5.0.0-beta.3"],"73.0.3683.54":["5.0.0-beta.4"],"73.0.3683.61":["5.0.0-beta.5"],"73.0.3683.84":["5.0.0-beta.6"],"73.0.3683.94":["5.0.0-beta.7"],"73.0.3683.104":["5.0.0-beta.8"],"73.0.3683.117":["5.0.0-beta.9"],"70.0.3538.110":["5.0.0-nightly.20190107"],"71.0.3578.98":["5.0.0-nightly.20190121","5.0.0-nightly.20190122"],"73.0.3683.119":["5.0.0"],"73.0.3683.121":["5.0.1","5.0.2","5.0.3","5.0.4","5.0.5","5.0.6","5.0.7","5.0.8","5.0.9","5.0.10","5.0.11","5.0.12","5.0.13"],"76.0.3774.1":["6.0.0-beta.1"],"76.0.3783.1":["6.0.0-beta.2","6.0.0-beta.3","6.0.0-beta.4"],"76.0.3805.4":["6.0.0-beta.5"],"76.0.3809.3":["6.0.0-beta.6"],"76.0.3809.22":["6.0.0-beta.7"],"76.0.3809.26":["6.0.0-beta.8","6.0.0-beta.9"],"76.0.3809.37":["6.0.0-beta.10"],"76.0.3809.42":["6.0.0-beta.11"],"76.0.3809.54":["6.0.0-beta.12"],"76.0.3809.60":["6.0.0-beta.13"],"76.0.3809.68":["6.0.0-beta.14"],"76.0.3809.74":["6.0.0-beta.15"],"72.0.3626.107":["6.0.0-nightly.20190212"],"72.0.3626.110":["6.0.0-nightly.20190213"],"74.0.3724.8":["6.0.0-nightly.20190311"],"76.0.3809.88":["6.0.0"],"76.0.3809.102":["6.0.1"],"76.0.3809.110":["6.0.2"],"76.0.3809.126":["6.0.3"],"76.0.3809.131":["6.0.4"],"76.0.3809.136":["6.0.5"],"76.0.3809.138":["6.0.6"],"76.0.3809.139":["6.0.7"],"76.0.3809.146":["6.0.8","6.0.9","6.0.10","6.0.11","6.0.12","6.1.0","6.1.1","6.1.2","6.1.3","6.1.4","6.1.5","6.1.6","6.1.7","6.1.8","6.1.9","6.1.10","6.1.11","6.1.12"],"78.0.3866.0":["7.0.0-beta.1","7.0.0-beta.2","7.0.0-beta.3","7.0.0-nightly.20190727","7.0.0-nightly.20190728","7.0.0-nightly.20190729","7.0.0-nightly.20190730","7.0.0-nightly.20190731","8.0.0-nightly.20190801","8.0.0-nightly.20190802"],"78.0.3896.6":["7.0.0-beta.4"],"78.0.3905.1":["7.0.0-beta.5","7.0.0-beta.6","7.0.0-beta.7","7.0.0"],"76.0.3784.0":["7.0.0-nightly.20190521"],"76.0.3806.0":["7.0.0-nightly.20190529","7.0.0-nightly.20190530","7.0.0-nightly.20190531","7.0.0-nightly.20190602","7.0.0-nightly.20190603"],"77.0.3814.0":["7.0.0-nightly.20190604"],"77.0.3815.0":["7.0.0-nightly.20190605","7.0.0-nightly.20190606","7.0.0-nightly.20190607","7.0.0-nightly.20190608","7.0.0-nightly.20190609","7.0.0-nightly.20190611","7.0.0-nightly.20190612","7.0.0-nightly.20190613","7.0.0-nightly.20190615","7.0.0-nightly.20190616","7.0.0-nightly.20190618","7.0.0-nightly.20190619","7.0.0-nightly.20190622","7.0.0-nightly.20190623","7.0.0-nightly.20190624","7.0.0-nightly.20190627","7.0.0-nightly.20190629","7.0.0-nightly.20190630","7.0.0-nightly.20190701","7.0.0-nightly.20190702"],"77.0.3843.0":["7.0.0-nightly.20190704","7.0.0-nightly.20190705"],"77.0.3848.0":["7.0.0-nightly.20190719","7.0.0-nightly.20190720","7.0.0-nightly.20190721"],"77.0.3864.0":["7.0.0-nightly.20190726"],"78.0.3904.92":["7.0.1"],"78.0.3904.94":["7.1.0"],"78.0.3904.99":["7.1.1"],"78.0.3904.113":["7.1.2"],"78.0.3904.126":["7.1.3"],"78.0.3904.130":["7.1.4","7.1.5","7.1.6","7.1.7","7.1.8","7.1.9","7.1.10","7.1.11","7.1.12","7.1.13","7.1.14","7.2.0","7.2.1","7.2.2","7.2.3","7.2.4","7.3.0","7.3.1","7.3.2","7.3.3"],"79.0.3931.0":["8.0.0-beta.1","8.0.0-beta.2","8.0.0-nightly.20191019","8.0.0-nightly.20191020","8.0.0-nightly.20191021","8.0.0-nightly.20191023"],"80.0.3955.0":["8.0.0-beta.3","8.0.0-beta.4"],"80.0.3987.14":["8.0.0-beta.5"],"80.0.3987.51":["8.0.0-beta.6"],"80.0.3987.59":["8.0.0-beta.7"],"80.0.3987.75":["8.0.0-beta.8","8.0.0-beta.9"],"78.0.3871.0":["8.0.0-nightly.20190803","8.0.0-nightly.20190806","8.0.0-nightly.20190807","8.0.0-nightly.20190808","8.0.0-nightly.20190809","8.0.0-nightly.20190810","8.0.0-nightly.20190811","8.0.0-nightly.20190812","8.0.0-nightly.20190813","8.0.0-nightly.20190814","8.0.0-nightly.20190815"],"78.0.3881.0":["8.0.0-nightly.20190816","8.0.0-nightly.20190817","8.0.0-nightly.20190818","8.0.0-nightly.20190819","8.0.0-nightly.20190820"],"78.0.3892.0":["8.0.0-nightly.20190824","8.0.0-nightly.20190825","8.0.0-nightly.20190827","8.0.0-nightly.20190828","8.0.0-nightly.20190830","8.0.0-nightly.20190901","8.0.0-nightly.20190902","8.0.0-nightly.20190907","8.0.0-nightly.20190909","8.0.0-nightly.20190910","8.0.0-nightly.20190911","8.0.0-nightly.20190912","8.0.0-nightly.20190913","8.0.0-nightly.20190914","8.0.0-nightly.20190915","8.0.0-nightly.20190917"],"79.0.3915.0":["8.0.0-nightly.20190919","8.0.0-nightly.20190920"],"79.0.3919.0":["8.0.0-nightly.20190922","8.0.0-nightly.20190923","8.0.0-nightly.20190924","8.0.0-nightly.20190926","8.0.0-nightly.20190928","8.0.0-nightly.20190929","8.0.0-nightly.20190930","8.0.0-nightly.20191001","8.0.0-nightly.20191004","8.0.0-nightly.20191005","8.0.0-nightly.20191006","8.0.0-nightly.20191009","8.0.0-nightly.20191011","8.0.0-nightly.20191012","8.0.0-nightly.20191017"],"80.0.3952.0":["8.0.0-nightly.20191101","8.0.0-nightly.20191103","8.0.0-nightly.20191105"],"80.0.3987.86":["8.0.0","8.0.1","8.0.2"],"80.0.3987.134":["8.0.3"],"80.0.3987.137":["8.1.0"],"80.0.3987.141":["8.1.1"],"80.0.3987.158":["8.2.0"],"80.0.3987.163":["8.2.1","8.2.2","8.2.3","8.5.3","8.5.4","8.5.5"],"80.0.3987.165":["8.2.4","8.2.5","8.3.0","8.3.1","8.3.2","8.3.3","8.3.4","8.4.0","8.4.1","8.5.0","8.5.1","8.5.2"],"82.0.4048.0":["9.0.0-beta.1","9.0.0-beta.2","9.0.0-beta.3","9.0.0-beta.4","9.0.0-beta.5"],"82.0.4058.2":["9.0.0-beta.6","9.0.0-beta.7","9.0.0-beta.9"],"82.0.4085.10":["9.0.0-beta.10"],"82.0.4085.14":["9.0.0-beta.11","9.0.0-beta.12","9.0.0-beta.13"],"82.0.4085.27":["9.0.0-beta.14"],"83.0.4102.3":["9.0.0-beta.15","9.0.0-beta.16"],"83.0.4103.14":["9.0.0-beta.17"],"83.0.4103.16":["9.0.0-beta.18"],"83.0.4103.24":["9.0.0-beta.19"],"83.0.4103.26":["9.0.0-beta.20","9.0.0-beta.21"],"83.0.4103.34":["9.0.0-beta.22"],"83.0.4103.44":["9.0.0-beta.23"],"83.0.4103.45":["9.0.0-beta.24"],"80.0.3954.0":["9.0.0-nightly.20191121","9.0.0-nightly.20191122","9.0.0-nightly.20191123","9.0.0-nightly.20191124","9.0.0-nightly.20191126","9.0.0-nightly.20191128","9.0.0-nightly.20191129","9.0.0-nightly.20191130","9.0.0-nightly.20191201","9.0.0-nightly.20191202","9.0.0-nightly.20191203","9.0.0-nightly.20191204","9.0.0-nightly.20191205","9.0.0-nightly.20191210"],"81.0.3994.0":["9.0.0-nightly.20191220","9.0.0-nightly.20191221","9.0.0-nightly.20191222","9.0.0-nightly.20191223","9.0.0-nightly.20191224","9.0.0-nightly.20191225","9.0.0-nightly.20191226","9.0.0-nightly.20191228","9.0.0-nightly.20191229","9.0.0-nightly.20191230","9.0.0-nightly.20191231","9.0.0-nightly.20200101","9.0.0-nightly.20200103","9.0.0-nightly.20200104","9.0.0-nightly.20200105","9.0.0-nightly.20200106","9.0.0-nightly.20200108","9.0.0-nightly.20200109","9.0.0-nightly.20200110","9.0.0-nightly.20200111","9.0.0-nightly.20200113","9.0.0-nightly.20200115","9.0.0-nightly.20200116","9.0.0-nightly.20200117"],"81.0.4030.0":["9.0.0-nightly.20200119","9.0.0-nightly.20200121"],"83.0.4103.64":["9.0.0"],"83.0.4103.94":["9.0.1","9.0.2"],"83.0.4103.100":["9.0.3"],"83.0.4103.104":["9.0.4"],"83.0.4103.119":["9.0.5"],"83.0.4103.122":["9.1.0","9.1.1","9.1.2","9.2.0","9.2.1","9.3.0","9.3.1","9.3.2","9.3.3","9.3.4","9.3.5","9.4.0","9.4.1","9.4.2","9.4.3","9.4.4"],"84.0.4129.0":["10.0.0-beta.1","10.0.0-beta.2","10.0.0-nightly.20200501","10.0.0-nightly.20200504","10.0.0-nightly.20200505","10.0.0-nightly.20200506","10.0.0-nightly.20200507","10.0.0-nightly.20200508","10.0.0-nightly.20200511","10.0.0-nightly.20200512","10.0.0-nightly.20200513","10.0.0-nightly.20200514","10.0.0-nightly.20200515","10.0.0-nightly.20200518","10.0.0-nightly.20200519","10.0.0-nightly.20200520","10.0.0-nightly.20200521","11.0.0-nightly.20200525","11.0.0-nightly.20200526"],"85.0.4161.2":["10.0.0-beta.3","10.0.0-beta.4"],"85.0.4181.1":["10.0.0-beta.8","10.0.0-beta.9"],"85.0.4183.19":["10.0.0-beta.10"],"85.0.4183.20":["10.0.0-beta.11"],"85.0.4183.26":["10.0.0-beta.12"],"85.0.4183.39":["10.0.0-beta.13","10.0.0-beta.14","10.0.0-beta.15","10.0.0-beta.17","10.0.0-beta.19","10.0.0-beta.20","10.0.0-beta.21"],"85.0.4183.70":["10.0.0-beta.23"],"85.0.4183.78":["10.0.0-beta.24"],"85.0.4183.80":["10.0.0-beta.25"],"82.0.4050.0":["10.0.0-nightly.20200209","10.0.0-nightly.20200210","10.0.0-nightly.20200211","10.0.0-nightly.20200216","10.0.0-nightly.20200217","10.0.0-nightly.20200218","10.0.0-nightly.20200221","10.0.0-nightly.20200222","10.0.0-nightly.20200223","10.0.0-nightly.20200226","10.0.0-nightly.20200303"],"82.0.4076.0":["10.0.0-nightly.20200304","10.0.0-nightly.20200305","10.0.0-nightly.20200306","10.0.0-nightly.20200309","10.0.0-nightly.20200310"],"82.0.4083.0":["10.0.0-nightly.20200311"],"83.0.4086.0":["10.0.0-nightly.20200316"],"83.0.4087.0":["10.0.0-nightly.20200317","10.0.0-nightly.20200318","10.0.0-nightly.20200320","10.0.0-nightly.20200323","10.0.0-nightly.20200324","10.0.0-nightly.20200325","10.0.0-nightly.20200326","10.0.0-nightly.20200327","10.0.0-nightly.20200330","10.0.0-nightly.20200331","10.0.0-nightly.20200401","10.0.0-nightly.20200402","10.0.0-nightly.20200403","10.0.0-nightly.20200406"],"83.0.4095.0":["10.0.0-nightly.20200408","10.0.0-nightly.20200410","10.0.0-nightly.20200413"],"84.0.4114.0":["10.0.0-nightly.20200414"],"84.0.4115.0":["10.0.0-nightly.20200415","10.0.0-nightly.20200416","10.0.0-nightly.20200417"],"84.0.4121.0":["10.0.0-nightly.20200422","10.0.0-nightly.20200423"],"84.0.4125.0":["10.0.0-nightly.20200427","10.0.0-nightly.20200428","10.0.0-nightly.20200429","10.0.0-nightly.20200430"],"85.0.4183.84":["10.0.0"],"85.0.4183.86":["10.0.1"],"85.0.4183.87":["10.1.0"],"85.0.4183.93":["10.1.1"],"85.0.4183.98":["10.1.2"],"85.0.4183.121":["10.1.3","10.1.4","10.1.5","10.1.6","10.1.7","10.2.0","10.3.0","10.3.1","10.3.2","10.4.0","10.4.1","10.4.2","10.4.3","10.4.4","10.4.5","10.4.6","10.4.7"],"86.0.4234.0":["11.0.0-beta.1","11.0.0-beta.3","11.0.0-beta.4","11.0.0-beta.5","11.0.0-beta.6","11.0.0-beta.7","11.0.0-nightly.20200822","11.0.0-nightly.20200824","11.0.0-nightly.20200825","11.0.0-nightly.20200826","12.0.0-nightly.20200827","12.0.0-nightly.20200831","12.0.0-nightly.20200902","12.0.0-nightly.20200903","12.0.0-nightly.20200907","12.0.0-nightly.20200910","12.0.0-nightly.20200911","12.0.0-nightly.20200914"],"87.0.4251.1":["11.0.0-beta.8","11.0.0-beta.9","11.0.0-beta.11"],"87.0.4280.11":["11.0.0-beta.12","11.0.0-beta.13"],"87.0.4280.27":["11.0.0-beta.16","11.0.0-beta.17","11.0.0-beta.18","11.0.0-beta.19"],"87.0.4280.40":["11.0.0-beta.20"],"87.0.4280.47":["11.0.0-beta.22","11.0.0-beta.23"],"85.0.4156.0":["11.0.0-nightly.20200529"],"85.0.4162.0":["11.0.0-nightly.20200602","11.0.0-nightly.20200603","11.0.0-nightly.20200604","11.0.0-nightly.20200609","11.0.0-nightly.20200610","11.0.0-nightly.20200611","11.0.0-nightly.20200615","11.0.0-nightly.20200616","11.0.0-nightly.20200617","11.0.0-nightly.20200618","11.0.0-nightly.20200619"],"85.0.4179.0":["11.0.0-nightly.20200701","11.0.0-nightly.20200702","11.0.0-nightly.20200703","11.0.0-nightly.20200706","11.0.0-nightly.20200707","11.0.0-nightly.20200708","11.0.0-nightly.20200709"],"86.0.4203.0":["11.0.0-nightly.20200716","11.0.0-nightly.20200717","11.0.0-nightly.20200720","11.0.0-nightly.20200721"],"86.0.4209.0":["11.0.0-nightly.20200723","11.0.0-nightly.20200724","11.0.0-nightly.20200729","11.0.0-nightly.20200730","11.0.0-nightly.20200731","11.0.0-nightly.20200803","11.0.0-nightly.20200804","11.0.0-nightly.20200805","11.0.0-nightly.20200811","11.0.0-nightly.20200812"],"87.0.4280.60":["11.0.0","11.0.1"],"87.0.4280.67":["11.0.2","11.0.3","11.0.4"],"87.0.4280.88":["11.0.5","11.1.0","11.1.1"],"87.0.4280.141":["11.2.0","11.2.1","11.2.2","11.2.3","11.3.0","11.4.0","11.4.1","11.4.2","11.4.3","11.4.4","11.4.5","11.4.6","11.4.7","11.4.8","11.4.9","11.4.10","11.4.11","11.4.12","11.5.0"],"89.0.4328.0":["12.0.0-beta.1","12.0.0-beta.3","12.0.0-beta.4","12.0.0-beta.5","12.0.0-beta.6","12.0.0-beta.7","12.0.0-beta.8","12.0.0-beta.9","12.0.0-beta.10","12.0.0-beta.11","12.0.0-beta.12","12.0.0-beta.14","13.0.0-nightly.20201119","13.0.0-nightly.20201123","13.0.0-nightly.20201124","13.0.0-nightly.20201126","13.0.0-nightly.20201127","13.0.0-nightly.20201130","13.0.0-nightly.20201201","13.0.0-nightly.20201202","13.0.0-nightly.20201203","13.0.0-nightly.20201204","13.0.0-nightly.20201207","13.0.0-nightly.20201208","13.0.0-nightly.20201209","13.0.0-nightly.20201210","13.0.0-nightly.20201211","13.0.0-nightly.20201214"],"89.0.4348.1":["12.0.0-beta.16","12.0.0-beta.18","12.0.0-beta.19","12.0.0-beta.20"],"89.0.4388.2":["12.0.0-beta.21","12.0.0-beta.22","12.0.0-beta.23","12.0.0-beta.24","12.0.0-beta.25","12.0.0-beta.26"],"89.0.4389.23":["12.0.0-beta.27","12.0.0-beta.28","12.0.0-beta.29"],"89.0.4389.58":["12.0.0-beta.30","12.0.0-beta.31"],"87.0.4268.0":["12.0.0-nightly.20201002","12.0.0-nightly.20201007","12.0.0-nightly.20201009","12.0.0-nightly.20201012","12.0.0-nightly.20201013","12.0.0-nightly.20201014","12.0.0-nightly.20201015"],"88.0.4292.0":["12.0.0-nightly.20201023","12.0.0-nightly.20201026"],"88.0.4306.0":["12.0.0-nightly.20201030","12.0.0-nightly.20201102","12.0.0-nightly.20201103","12.0.0-nightly.20201104","12.0.0-nightly.20201105","12.0.0-nightly.20201106","12.0.0-nightly.20201111","12.0.0-nightly.20201112"],"88.0.4324.0":["12.0.0-nightly.20201116"],"89.0.4389.69":["12.0.0"],"89.0.4389.82":["12.0.1"],"89.0.4389.90":["12.0.2"],"89.0.4389.114":["12.0.3","12.0.4"],"89.0.4389.128":["12.0.5","12.0.6","12.0.7","12.0.8","12.0.9","12.0.10","12.0.11","12.0.12","12.0.13","12.0.14","12.0.15","12.0.16","12.0.17","12.0.18","12.1.0","12.1.1","12.1.2","12.2.0","12.2.1","12.2.2","12.2.3"],"90.0.4402.0":["13.0.0-beta.2","13.0.0-beta.3","13.0.0-nightly.20210210","13.0.0-nightly.20210211","13.0.0-nightly.20210212","13.0.0-nightly.20210216","13.0.0-nightly.20210217","13.0.0-nightly.20210218","13.0.0-nightly.20210219","13.0.0-nightly.20210222","13.0.0-nightly.20210225","13.0.0-nightly.20210226","13.0.0-nightly.20210301","13.0.0-nightly.20210302","13.0.0-nightly.20210303","14.0.0-nightly.20210304"],"90.0.4415.0":["13.0.0-beta.4","13.0.0-beta.5","13.0.0-beta.6","13.0.0-beta.7","13.0.0-beta.8","13.0.0-beta.9","13.0.0-beta.10","13.0.0-beta.11","13.0.0-beta.12","13.0.0-beta.13","14.0.0-nightly.20210305","14.0.0-nightly.20210308","14.0.0-nightly.20210309","14.0.0-nightly.20210311","14.0.0-nightly.20210315","14.0.0-nightly.20210316","14.0.0-nightly.20210317","14.0.0-nightly.20210318","14.0.0-nightly.20210319","14.0.0-nightly.20210323","14.0.0-nightly.20210324","14.0.0-nightly.20210325","14.0.0-nightly.20210326","14.0.0-nightly.20210329","14.0.0-nightly.20210330"],"91.0.4448.0":["13.0.0-beta.14","13.0.0-beta.16","13.0.0-beta.17","13.0.0-beta.18","13.0.0-beta.20","14.0.0-nightly.20210331","14.0.0-nightly.20210401","14.0.0-nightly.20210402","14.0.0-nightly.20210406","14.0.0-nightly.20210407","14.0.0-nightly.20210408","14.0.0-nightly.20210409","14.0.0-nightly.20210413"],"91.0.4472.33":["13.0.0-beta.21","13.0.0-beta.22","13.0.0-beta.23"],"91.0.4472.38":["13.0.0-beta.24","13.0.0-beta.25","13.0.0-beta.26","13.0.0-beta.27","13.0.0-beta.28"],"89.0.4349.0":["13.0.0-nightly.20201215","13.0.0-nightly.20201216","13.0.0-nightly.20201221","13.0.0-nightly.20201222"],"89.0.4359.0":["13.0.0-nightly.20201223","13.0.0-nightly.20210104","13.0.0-nightly.20210108","13.0.0-nightly.20210111"],"89.0.4386.0":["13.0.0-nightly.20210113","13.0.0-nightly.20210114","13.0.0-nightly.20210118","13.0.0-nightly.20210122","13.0.0-nightly.20210125"],"89.0.4389.0":["13.0.0-nightly.20210127","13.0.0-nightly.20210128","13.0.0-nightly.20210129","13.0.0-nightly.20210201","13.0.0-nightly.20210202","13.0.0-nightly.20210203","13.0.0-nightly.20210205","13.0.0-nightly.20210208","13.0.0-nightly.20210209"],"91.0.4472.69":["13.0.0","13.0.1"],"91.0.4472.77":["13.1.0","13.1.1","13.1.2"],"91.0.4472.106":["13.1.3","13.1.4"],"91.0.4472.124":["13.1.5","13.1.6","13.1.7"],"91.0.4472.164":["13.1.8","13.1.9","13.2.0","13.2.1","13.2.2","13.2.3","13.3.0","13.4.0","13.5.0","13.5.1","13.5.2","13.6.0","13.6.1","13.6.2","13.6.3","13.6.6","13.6.7","13.6.8","13.6.9"],"92.0.4511.0":["14.0.0-beta.1","14.0.0-beta.2","14.0.0-beta.3","14.0.0-nightly.20210520","14.0.0-nightly.20210523","14.0.0-nightly.20210524","15.0.0-nightly.20210527","15.0.0-nightly.20210528","15.0.0-nightly.20210531","15.0.0-nightly.20210601","15.0.0-nightly.20210602"],"93.0.4536.0":["14.0.0-beta.5","14.0.0-beta.6","14.0.0-beta.7","14.0.0-beta.8","15.0.0-nightly.20210609","15.0.0-nightly.20210610","15.0.0-nightly.20210611","15.0.0-nightly.20210614","15.0.0-nightly.20210615","15.0.0-nightly.20210616"],"93.0.4539.0":["14.0.0-beta.9","14.0.0-beta.10","15.0.0-nightly.20210617","15.0.0-nightly.20210618","15.0.0-nightly.20210621","15.0.0-nightly.20210622"],"93.0.4557.4":["14.0.0-beta.11","14.0.0-beta.12"],"93.0.4566.0":["14.0.0-beta.13","14.0.0-beta.14","14.0.0-beta.15","14.0.0-beta.16","14.0.0-beta.17","15.0.0-alpha.1","15.0.0-alpha.2","15.0.0-nightly.20210706","15.0.0-nightly.20210707","15.0.0-nightly.20210708","15.0.0-nightly.20210709","15.0.0-nightly.20210712","15.0.0-nightly.20210713","15.0.0-nightly.20210714","15.0.0-nightly.20210715","15.0.0-nightly.20210716","15.0.0-nightly.20210719","15.0.0-nightly.20210720","15.0.0-nightly.20210721","16.0.0-nightly.20210722","16.0.0-nightly.20210723","16.0.0-nightly.20210726"],"93.0.4577.15":["14.0.0-beta.18","14.0.0-beta.19","14.0.0-beta.20","14.0.0-beta.21"],"93.0.4577.25":["14.0.0-beta.22","14.0.0-beta.23"],"93.0.4577.51":["14.0.0-beta.24","14.0.0-beta.25"],"92.0.4475.0":["14.0.0-nightly.20210426","14.0.0-nightly.20210427"],"92.0.4488.0":["14.0.0-nightly.20210430","14.0.0-nightly.20210503"],"92.0.4496.0":["14.0.0-nightly.20210505"],"92.0.4498.0":["14.0.0-nightly.20210506"],"92.0.4499.0":["14.0.0-nightly.20210507","14.0.0-nightly.20210510","14.0.0-nightly.20210511","14.0.0-nightly.20210512","14.0.0-nightly.20210513"],"92.0.4505.0":["14.0.0-nightly.20210514","14.0.0-nightly.20210517","14.0.0-nightly.20210518","14.0.0-nightly.20210519"],"93.0.4577.58":["14.0.0"],"93.0.4577.63":["14.0.1"],"93.0.4577.82":["14.0.2","14.1.0","14.1.1","14.2.0","14.2.1","14.2.2","14.2.3","14.2.4","14.2.5","14.2.6","14.2.7","14.2.8","14.2.9"],"94.0.4584.0":["15.0.0-alpha.3","15.0.0-alpha.4","15.0.0-alpha.5","15.0.0-alpha.6","16.0.0-nightly.20210727","16.0.0-nightly.20210728","16.0.0-nightly.20210729","16.0.0-nightly.20210730","16.0.0-nightly.20210802","16.0.0-nightly.20210803","16.0.0-nightly.20210804","16.0.0-nightly.20210805","16.0.0-nightly.20210806","16.0.0-nightly.20210809","16.0.0-nightly.20210810","16.0.0-nightly.20210811"],"94.0.4590.2":["15.0.0-alpha.7","15.0.0-alpha.8","15.0.0-alpha.9","16.0.0-nightly.20210812","16.0.0-nightly.20210813","16.0.0-nightly.20210816","16.0.0-nightly.20210817","16.0.0-nightly.20210818","16.0.0-nightly.20210819","16.0.0-nightly.20210820","16.0.0-nightly.20210823"],"94.0.4606.12":["15.0.0-alpha.10"],"94.0.4606.20":["15.0.0-beta.1","15.0.0-beta.2"],"94.0.4606.31":["15.0.0-beta.3","15.0.0-beta.4","15.0.0-beta.5","15.0.0-beta.6","15.0.0-beta.7"],"93.0.4530.0":["15.0.0-nightly.20210603","15.0.0-nightly.20210604"],"93.0.4535.0":["15.0.0-nightly.20210608"],"93.0.4550.0":["15.0.0-nightly.20210623","15.0.0-nightly.20210624"],"93.0.4552.0":["15.0.0-nightly.20210625","15.0.0-nightly.20210628","15.0.0-nightly.20210629"],"93.0.4558.0":["15.0.0-nightly.20210630","15.0.0-nightly.20210701","15.0.0-nightly.20210702","15.0.0-nightly.20210705"],"94.0.4606.51":["15.0.0"],"94.0.4606.61":["15.1.0","15.1.1"],"94.0.4606.71":["15.1.2"],"94.0.4606.81":["15.2.0","15.3.0","15.3.1","15.3.2","15.3.3","15.3.4","15.3.5","15.3.6","15.3.7","15.4.0","15.4.1","15.4.2","15.5.0","15.5.1","15.5.2","15.5.3","15.5.4","15.5.5","15.5.6","15.5.7"],"95.0.4629.0":["16.0.0-alpha.1","16.0.0-alpha.2","16.0.0-alpha.3","16.0.0-alpha.4","16.0.0-alpha.5","16.0.0-alpha.6","16.0.0-alpha.7","16.0.0-nightly.20210902","16.0.0-nightly.20210903","16.0.0-nightly.20210906","16.0.0-nightly.20210907","16.0.0-nightly.20210908","16.0.0-nightly.20210909","16.0.0-nightly.20210910","16.0.0-nightly.20210913","16.0.0-nightly.20210914","16.0.0-nightly.20210915","16.0.0-nightly.20210916","16.0.0-nightly.20210917","16.0.0-nightly.20210920","16.0.0-nightly.20210921","16.0.0-nightly.20210922","17.0.0-nightly.20210923","17.0.0-nightly.20210924","17.0.0-nightly.20210927","17.0.0-nightly.20210928","17.0.0-nightly.20210929","17.0.0-nightly.20210930","17.0.0-nightly.20211001","17.0.0-nightly.20211004","17.0.0-nightly.20211005"],"96.0.4647.0":["16.0.0-alpha.8","16.0.0-alpha.9","16.0.0-beta.1","16.0.0-beta.2","16.0.0-beta.3","17.0.0-nightly.20211006","17.0.0-nightly.20211007","17.0.0-nightly.20211008","17.0.0-nightly.20211011","17.0.0-nightly.20211012","17.0.0-nightly.20211013","17.0.0-nightly.20211014","17.0.0-nightly.20211015","17.0.0-nightly.20211018","17.0.0-nightly.20211019","17.0.0-nightly.20211020","17.0.0-nightly.20211021"],"96.0.4664.18":["16.0.0-beta.4","16.0.0-beta.5"],"96.0.4664.27":["16.0.0-beta.6","16.0.0-beta.7"],"96.0.4664.35":["16.0.0-beta.8","16.0.0-beta.9"],"95.0.4612.5":["16.0.0-nightly.20210824","16.0.0-nightly.20210825","16.0.0-nightly.20210826","16.0.0-nightly.20210827","16.0.0-nightly.20210830","16.0.0-nightly.20210831","16.0.0-nightly.20210901"],"96.0.4664.45":["16.0.0","16.0.1"],"96.0.4664.55":["16.0.2","16.0.3","16.0.4","16.0.5"],"96.0.4664.110":["16.0.6","16.0.7","16.0.8"],"96.0.4664.174":["16.0.9","16.0.10","16.1.0","16.1.1","16.2.0","16.2.1","16.2.2","16.2.3","16.2.4","16.2.5","16.2.6","16.2.7","16.2.8"],"96.0.4664.4":["17.0.0-alpha.1","17.0.0-alpha.2","17.0.0-alpha.3","17.0.0-nightly.20211022","17.0.0-nightly.20211025","17.0.0-nightly.20211026","17.0.0-nightly.20211027","17.0.0-nightly.20211028","17.0.0-nightly.20211029","17.0.0-nightly.20211101","17.0.0-nightly.20211102","17.0.0-nightly.20211103","17.0.0-nightly.20211104","17.0.0-nightly.20211105","17.0.0-nightly.20211108","17.0.0-nightly.20211109","17.0.0-nightly.20211110","17.0.0-nightly.20211111","17.0.0-nightly.20211112","17.0.0-nightly.20211115","17.0.0-nightly.20211116","17.0.0-nightly.20211117","18.0.0-nightly.20211118","18.0.0-nightly.20211119","18.0.0-nightly.20211122","18.0.0-nightly.20211123"],"98.0.4706.0":["17.0.0-alpha.4","17.0.0-alpha.5","17.0.0-alpha.6","17.0.0-beta.1","17.0.0-beta.2","18.0.0-nightly.20211124","18.0.0-nightly.20211125","18.0.0-nightly.20211126","18.0.0-nightly.20211129","18.0.0-nightly.20211130","18.0.0-nightly.20211201","18.0.0-nightly.20211202","18.0.0-nightly.20211203","18.0.0-nightly.20211206","18.0.0-nightly.20211207","18.0.0-nightly.20211208","18.0.0-nightly.20211209","18.0.0-nightly.20211210","18.0.0-nightly.20211213","18.0.0-nightly.20211214","18.0.0-nightly.20211215","18.0.0-nightly.20211216","18.0.0-nightly.20211217","18.0.0-nightly.20211220","18.0.0-nightly.20211221","18.0.0-nightly.20211222","18.0.0-nightly.20211223","18.0.0-nightly.20211228","18.0.0-nightly.20211229","18.0.0-nightly.20211231","18.0.0-nightly.20220103","18.0.0-nightly.20220104","18.0.0-nightly.20220105","18.0.0-nightly.20220106","18.0.0-nightly.20220107","18.0.0-nightly.20220110"],"98.0.4758.9":["17.0.0-beta.3"],"98.0.4758.11":["17.0.0-beta.4","17.0.0-beta.5","17.0.0-beta.6","17.0.0-beta.7","17.0.0-beta.8","17.0.0-beta.9"],"98.0.4758.74":["17.0.0"],"98.0.4758.82":["17.0.1"],"98.0.4758.102":["17.1.0"],"98.0.4758.109":["17.1.1","17.1.2","17.2.0"],"98.0.4758.141":["17.3.0","17.3.1","17.4.0","17.4.1","17.4.2","17.4.3","17.4.4","17.4.5","17.4.6","17.4.7","17.4.8","17.4.9","17.4.10","17.4.11"],"99.0.4767.0":["18.0.0-alpha.1","18.0.0-alpha.2","18.0.0-alpha.3","18.0.0-alpha.4","18.0.0-alpha.5","18.0.0-nightly.20220111","18.0.0-nightly.20220112","18.0.0-nightly.20220113","18.0.0-nightly.20220114","18.0.0-nightly.20220117","18.0.0-nightly.20220118","18.0.0-nightly.20220119","18.0.0-nightly.20220121","18.0.0-nightly.20220124","18.0.0-nightly.20220125","18.0.0-nightly.20220127","18.0.0-nightly.20220128","18.0.0-nightly.20220131","18.0.0-nightly.20220201","19.0.0-nightly.20220202","19.0.0-nightly.20220203","19.0.0-nightly.20220204","19.0.0-nightly.20220207","19.0.0-nightly.20220208","19.0.0-nightly.20220209"],"100.0.4894.0":["18.0.0-beta.1","18.0.0-beta.2","18.0.0-beta.3","18.0.0-beta.4","18.0.0-beta.5","18.0.0-beta.6","19.0.0-nightly.20220308","19.0.0-nightly.20220309","19.0.0-nightly.20220310","19.0.0-nightly.20220311","19.0.0-nightly.20220314","19.0.0-nightly.20220315","19.0.0-nightly.20220316","19.0.0-nightly.20220317","19.0.0-nightly.20220318","19.0.0-nightly.20220321","19.0.0-nightly.20220322","19.0.0-nightly.20220323","19.0.0-nightly.20220324"],"100.0.4896.56":["18.0.0"],"100.0.4896.60":["18.0.1","18.0.2"],"100.0.4896.75":["18.0.3","18.0.4"],"100.0.4896.127":["18.1.0"],"100.0.4896.143":["18.2.0","18.2.1","18.2.2","18.2.3"],"100.0.4896.160":["18.2.4","18.3.0","18.3.1","18.3.2","18.3.3","18.3.4","18.3.5","18.3.6","18.3.7","18.3.8","18.3.9","18.3.11","18.3.12","18.3.13","18.3.14","18.3.15"],"102.0.4962.3":["19.0.0-alpha.1","19.0.0-nightly.20220328","19.0.0-nightly.20220329","20.0.0-nightly.20220330"],"102.0.4971.0":["19.0.0-alpha.2","19.0.0-alpha.3","20.0.0-nightly.20220411"],"102.0.4989.0":["19.0.0-alpha.4","19.0.0-alpha.5","20.0.0-nightly.20220414","20.0.0-nightly.20220415","20.0.0-nightly.20220418","20.0.0-nightly.20220419","20.0.0-nightly.20220420","20.0.0-nightly.20220421"],"102.0.4999.0":["19.0.0-beta.1","19.0.0-beta.2","19.0.0-beta.3","20.0.0-nightly.20220425","20.0.0-nightly.20220426","20.0.0-nightly.20220427","20.0.0-nightly.20220428","20.0.0-nightly.20220429","20.0.0-nightly.20220502","20.0.0-nightly.20220503","20.0.0-nightly.20220504","20.0.0-nightly.20220505","20.0.0-nightly.20220506","20.0.0-nightly.20220509","20.0.0-nightly.20220511","20.0.0-nightly.20220512","20.0.0-nightly.20220513","20.0.0-nightly.20220516","20.0.0-nightly.20220517"],"102.0.5005.27":["19.0.0-beta.4"],"102.0.5005.40":["19.0.0-beta.5","19.0.0-beta.6","19.0.0-beta.7"],"102.0.5005.49":["19.0.0-beta.8"],"102.0.4961.0":["19.0.0-nightly.20220325"],"102.0.5005.61":["19.0.0","19.0.1"],"102.0.5005.63":["19.0.2","19.0.3","19.0.4"],"102.0.5005.115":["19.0.5","19.0.6"],"102.0.5005.134":["19.0.7"],"102.0.5005.148":["19.0.8"],"102.0.5005.167":["19.0.9","19.0.10","19.0.11","19.0.12","19.0.13","19.0.14","19.0.15","19.0.16","19.0.17","19.1.0","19.1.1","19.1.2","19.1.3","19.1.4","19.1.5","19.1.6","19.1.7","19.1.8","19.1.9"],"103.0.5044.0":["20.0.0-alpha.1","20.0.0-nightly.20220518","20.0.0-nightly.20220519","20.0.0-nightly.20220520","20.0.0-nightly.20220523","20.0.0-nightly.20220524","21.0.0-nightly.20220526","21.0.0-nightly.20220527","21.0.0-nightly.20220530","21.0.0-nightly.20220531"],"104.0.5073.0":["20.0.0-alpha.2","20.0.0-alpha.3","20.0.0-alpha.4","20.0.0-alpha.5","20.0.0-alpha.6","20.0.0-alpha.7","20.0.0-beta.1","20.0.0-beta.2","20.0.0-beta.3","20.0.0-beta.4","20.0.0-beta.5","20.0.0-beta.6","20.0.0-beta.7","20.0.0-beta.8","21.0.0-nightly.20220602","21.0.0-nightly.20220603","21.0.0-nightly.20220606","21.0.0-nightly.20220607","21.0.0-nightly.20220608","21.0.0-nightly.20220609","21.0.0-nightly.20220610","21.0.0-nightly.20220613","21.0.0-nightly.20220614","21.0.0-nightly.20220615","21.0.0-nightly.20220616","21.0.0-nightly.20220617","21.0.0-nightly.20220620","21.0.0-nightly.20220621","21.0.0-nightly.20220622","21.0.0-nightly.20220623","21.0.0-nightly.20220624","21.0.0-nightly.20220627"],"104.0.5112.39":["20.0.0-beta.9"],"104.0.5112.48":["20.0.0-beta.10","20.0.0-beta.11","20.0.0-beta.12"],"104.0.5112.57":["20.0.0-beta.13"],"104.0.5112.65":["20.0.0"],"104.0.5112.81":["20.0.1","20.0.2","20.0.3"],"104.0.5112.102":["20.1.0","20.1.1"],"104.0.5112.114":["20.1.2","20.1.3","20.1.4"],"104.0.5112.124":["20.2.0","20.3.0","20.3.1","20.3.2","20.3.3","20.3.4","20.3.5","20.3.6","20.3.7","20.3.8","20.3.9","20.3.10","20.3.11","20.3.12"],"105.0.5187.0":["21.0.0-alpha.1","21.0.0-alpha.2","21.0.0-alpha.3","21.0.0-alpha.4","21.0.0-alpha.5","21.0.0-nightly.20220720","21.0.0-nightly.20220721","21.0.0-nightly.20220722","21.0.0-nightly.20220725","21.0.0-nightly.20220726","21.0.0-nightly.20220727","21.0.0-nightly.20220728","21.0.0-nightly.20220801","21.0.0-nightly.20220802","22.0.0-nightly.20220808","22.0.0-nightly.20220809","22.0.0-nightly.20220810","22.0.0-nightly.20220811","22.0.0-nightly.20220812","22.0.0-nightly.20220815","22.0.0-nightly.20220816","22.0.0-nightly.20220817"],"106.0.5216.0":["21.0.0-alpha.6","21.0.0-beta.1","21.0.0-beta.2","21.0.0-beta.3","21.0.0-beta.4","21.0.0-beta.5","22.0.0-nightly.20220822","22.0.0-nightly.20220823","22.0.0-nightly.20220824","22.0.0-nightly.20220825","22.0.0-nightly.20220829","22.0.0-nightly.20220830","22.0.0-nightly.20220831","22.0.0-nightly.20220901","22.0.0-nightly.20220902","22.0.0-nightly.20220905"],"106.0.5249.40":["21.0.0-beta.6","21.0.0-beta.7","21.0.0-beta.8"],"105.0.5129.0":["21.0.0-nightly.20220628","21.0.0-nightly.20220629","21.0.0-nightly.20220630","21.0.0-nightly.20220701","21.0.0-nightly.20220704","21.0.0-nightly.20220705","21.0.0-nightly.20220706","21.0.0-nightly.20220707","21.0.0-nightly.20220708","21.0.0-nightly.20220711","21.0.0-nightly.20220712","21.0.0-nightly.20220713"],"105.0.5173.0":["21.0.0-nightly.20220715","21.0.0-nightly.20220718","21.0.0-nightly.20220719"],"106.0.5249.51":["21.0.0"],"106.0.5249.61":["21.0.1"],"106.0.5249.91":["21.1.0"],"106.0.5249.103":["21.1.1"],"106.0.5249.119":["21.2.0"],"106.0.5249.165":["21.2.1"],"106.0.5249.168":["21.2.2","21.2.3"],"106.0.5249.181":["21.3.0","21.3.1"],"106.0.5249.199":["21.3.3","21.3.4","21.3.5","21.4.0","21.4.1","21.4.2","21.4.3","21.4.4"],"107.0.5286.0":["22.0.0-alpha.1","22.0.0-nightly.20220909","22.0.0-nightly.20220912","22.0.0-nightly.20220913","22.0.0-nightly.20220914","22.0.0-nightly.20220915","22.0.0-nightly.20220916","22.0.0-nightly.20220919","22.0.0-nightly.20220920","22.0.0-nightly.20220921","22.0.0-nightly.20220922","22.0.0-nightly.20220923","22.0.0-nightly.20220926","22.0.0-nightly.20220927","22.0.0-nightly.20220928","23.0.0-nightly.20220929","23.0.0-nightly.20220930","23.0.0-nightly.20221003"],"108.0.5329.0":["22.0.0-alpha.3","22.0.0-alpha.4","22.0.0-alpha.5","22.0.0-alpha.6","23.0.0-nightly.20221004","23.0.0-nightly.20221005","23.0.0-nightly.20221006","23.0.0-nightly.20221007","23.0.0-nightly.20221010","23.0.0-nightly.20221011","23.0.0-nightly.20221012","23.0.0-nightly.20221013","23.0.0-nightly.20221014","23.0.0-nightly.20221017"],"108.0.5355.0":["22.0.0-alpha.7","23.0.0-nightly.20221018","23.0.0-nightly.20221019","23.0.0-nightly.20221020","23.0.0-nightly.20221021","23.0.0-nightly.20221024","23.0.0-nightly.20221026"],"108.0.5359.10":["22.0.0-alpha.8","22.0.0-beta.1","22.0.0-beta.2","22.0.0-beta.3"],"108.0.5359.29":["22.0.0-beta.4"],"108.0.5359.40":["22.0.0-beta.5","22.0.0-beta.6"],"108.0.5359.48":["22.0.0-beta.7","22.0.0-beta.8"],"107.0.5274.0":["22.0.0-nightly.20220908"],"108.0.5359.62":["22.0.0"],"108.0.5359.125":["22.0.1"],"108.0.5359.179":["22.0.2","22.0.3","22.1.0"],"108.0.5359.215":["22.2.0","22.2.1","22.3.0","22.3.1","22.3.2","22.3.3","22.3.4","22.3.5","22.3.6","22.3.7","22.3.8","22.3.9","22.3.10","22.3.11","22.3.12","22.3.13","22.3.14","22.3.15","22.3.16","22.3.17","22.3.18","22.3.20","22.3.21","22.3.22","22.3.23","22.3.24","22.3.25","22.3.26","22.3.27"],"110.0.5415.0":["23.0.0-alpha.1","23.0.0-nightly.20221118","23.0.0-nightly.20221121","23.0.0-nightly.20221122","23.0.0-nightly.20221123","23.0.0-nightly.20221124","23.0.0-nightly.20221125","23.0.0-nightly.20221128","23.0.0-nightly.20221129","23.0.0-nightly.20221130","24.0.0-nightly.20221201","24.0.0-nightly.20221202","24.0.0-nightly.20221205"],"110.0.5451.0":["23.0.0-alpha.2","23.0.0-alpha.3","24.0.0-nightly.20221206","24.0.0-nightly.20221207","24.0.0-nightly.20221208","24.0.0-nightly.20221213","24.0.0-nightly.20221214","24.0.0-nightly.20221215","24.0.0-nightly.20221216"],"110.0.5478.5":["23.0.0-beta.1","23.0.0-beta.2","23.0.0-beta.3"],"110.0.5481.30":["23.0.0-beta.4"],"110.0.5481.38":["23.0.0-beta.5"],"110.0.5481.52":["23.0.0-beta.6","23.0.0-beta.8"],"109.0.5382.0":["23.0.0-nightly.20221027","23.0.0-nightly.20221028","23.0.0-nightly.20221031","23.0.0-nightly.20221101","23.0.0-nightly.20221102","23.0.0-nightly.20221103","23.0.0-nightly.20221104","23.0.0-nightly.20221107","23.0.0-nightly.20221108","23.0.0-nightly.20221109","23.0.0-nightly.20221110","23.0.0-nightly.20221111","23.0.0-nightly.20221114","23.0.0-nightly.20221115","23.0.0-nightly.20221116","23.0.0-nightly.20221117"],"110.0.5481.77":["23.0.0"],"110.0.5481.100":["23.1.0"],"110.0.5481.104":["23.1.1"],"110.0.5481.177":["23.1.2"],"110.0.5481.179":["23.1.3"],"110.0.5481.192":["23.1.4","23.2.0"],"110.0.5481.208":["23.2.1","23.2.2","23.2.3","23.2.4","23.3.0","23.3.1","23.3.2","23.3.3","23.3.4","23.3.5","23.3.6","23.3.7","23.3.8","23.3.9","23.3.10","23.3.11","23.3.12","23.3.13"],"111.0.5560.0":["24.0.0-alpha.1","24.0.0-alpha.2","24.0.0-alpha.3","24.0.0-alpha.4","24.0.0-alpha.5","24.0.0-alpha.6","24.0.0-alpha.7","24.0.0-nightly.20230203","24.0.0-nightly.20230206","24.0.0-nightly.20230207","24.0.0-nightly.20230208","24.0.0-nightly.20230209","25.0.0-nightly.20230210","25.0.0-nightly.20230214","25.0.0-nightly.20230215","25.0.0-nightly.20230216","25.0.0-nightly.20230217","25.0.0-nightly.20230220","25.0.0-nightly.20230221","25.0.0-nightly.20230222","25.0.0-nightly.20230223","25.0.0-nightly.20230224","25.0.0-nightly.20230227","25.0.0-nightly.20230228","25.0.0-nightly.20230301","25.0.0-nightly.20230302","25.0.0-nightly.20230303","25.0.0-nightly.20230306","25.0.0-nightly.20230307","25.0.0-nightly.20230308","25.0.0-nightly.20230309","25.0.0-nightly.20230310"],"111.0.5563.50":["24.0.0-beta.1","24.0.0-beta.2"],"112.0.5615.20":["24.0.0-beta.3","24.0.0-beta.4"],"112.0.5615.29":["24.0.0-beta.5"],"112.0.5615.39":["24.0.0-beta.6","24.0.0-beta.7"],"111.0.5518.0":["24.0.0-nightly.20230109","24.0.0-nightly.20230110","24.0.0-nightly.20230111","24.0.0-nightly.20230112","24.0.0-nightly.20230113","24.0.0-nightly.20230116","24.0.0-nightly.20230117","24.0.0-nightly.20230118","24.0.0-nightly.20230119","24.0.0-nightly.20230120","24.0.0-nightly.20230123","24.0.0-nightly.20230124","24.0.0-nightly.20230125","24.0.0-nightly.20230126","24.0.0-nightly.20230127","24.0.0-nightly.20230131","24.0.0-nightly.20230201","24.0.0-nightly.20230202"],"112.0.5615.49":["24.0.0"],"112.0.5615.50":["24.1.0","24.1.1"],"112.0.5615.87":["24.1.2"],"112.0.5615.165":["24.1.3","24.2.0","24.3.0"],"112.0.5615.183":["24.3.1"],"112.0.5615.204":["24.4.0","24.4.1","24.5.0","24.5.1","24.6.0","24.6.1","24.6.2","24.6.3","24.6.4","24.6.5","24.7.0","24.7.1","24.8.0","24.8.1","24.8.2","24.8.3","24.8.4","24.8.5","24.8.6","24.8.7"],"114.0.5694.0":["25.0.0-alpha.1","25.0.0-alpha.2","25.0.0-nightly.20230405","26.0.0-nightly.20230406","26.0.0-nightly.20230407","26.0.0-nightly.20230410","26.0.0-nightly.20230411"],"114.0.5710.0":["25.0.0-alpha.3","25.0.0-alpha.4","26.0.0-nightly.20230413","26.0.0-nightly.20230414","26.0.0-nightly.20230417"],"114.0.5719.0":["25.0.0-alpha.5","25.0.0-alpha.6","25.0.0-beta.1","25.0.0-beta.2","25.0.0-beta.3","26.0.0-nightly.20230421","26.0.0-nightly.20230424","26.0.0-nightly.20230425","26.0.0-nightly.20230426","26.0.0-nightly.20230427","26.0.0-nightly.20230428","26.0.0-nightly.20230501","26.0.0-nightly.20230502","26.0.0-nightly.20230503","26.0.0-nightly.20230504","26.0.0-nightly.20230505","26.0.0-nightly.20230508","26.0.0-nightly.20230509","26.0.0-nightly.20230510"],"114.0.5735.16":["25.0.0-beta.4","25.0.0-beta.5","25.0.0-beta.6","25.0.0-beta.7"],"114.0.5735.35":["25.0.0-beta.8"],"114.0.5735.45":["25.0.0-beta.9","25.0.0","25.0.1"],"113.0.5636.0":["25.0.0-nightly.20230314"],"113.0.5651.0":["25.0.0-nightly.20230315"],"113.0.5653.0":["25.0.0-nightly.20230317"],"113.0.5660.0":["25.0.0-nightly.20230320"],"113.0.5664.0":["25.0.0-nightly.20230321"],"113.0.5666.0":["25.0.0-nightly.20230322"],"113.0.5668.0":["25.0.0-nightly.20230323"],"113.0.5670.0":["25.0.0-nightly.20230324","25.0.0-nightly.20230327","25.0.0-nightly.20230328","25.0.0-nightly.20230329","25.0.0-nightly.20230330"],"114.0.5684.0":["25.0.0-nightly.20230331","25.0.0-nightly.20230403"],"114.0.5692.0":["25.0.0-nightly.20230404"],"114.0.5735.106":["25.1.0","25.1.1"],"114.0.5735.134":["25.2.0"],"114.0.5735.199":["25.3.0"],"114.0.5735.243":["25.3.1"],"114.0.5735.248":["25.3.2","25.4.0"],"114.0.5735.289":["25.5.0","25.6.0","25.7.0","25.8.0","25.8.1","25.8.2","25.8.3","25.8.4","25.9.0"],"116.0.5791.0":["26.0.0-alpha.1","26.0.0-alpha.2","26.0.0-alpha.3","26.0.0-alpha.4","26.0.0-alpha.5","26.0.0-nightly.20230526","26.0.0-nightly.20230529","26.0.0-nightly.20230530","26.0.0-nightly.20230531","27.0.0-nightly.20230601","27.0.0-nightly.20230602","27.0.0-nightly.20230605","27.0.0-nightly.20230606","27.0.0-nightly.20230607","27.0.0-nightly.20230609"],"116.0.5815.0":["26.0.0-alpha.6","27.0.0-nightly.20230612","27.0.0-nightly.20230613"],"116.0.5831.0":["26.0.0-alpha.7","27.0.0-nightly.20230615"],"116.0.5845.0":["26.0.0-alpha.8","26.0.0-beta.1","27.0.0-nightly.20230622","27.0.0-nightly.20230623","27.0.0-nightly.20230626","27.0.0-nightly.20230627","27.0.0-nightly.20230628","27.0.0-nightly.20230629","27.0.0-nightly.20230630"],"116.0.5845.14":["26.0.0-beta.2","26.0.0-beta.3","26.0.0-beta.4","26.0.0-beta.5","26.0.0-beta.6","26.0.0-beta.7"],"116.0.5845.42":["26.0.0-beta.8","26.0.0-beta.9"],"116.0.5845.49":["26.0.0-beta.10","26.0.0-beta.11"],"116.0.5845.62":["26.0.0-beta.12"],"114.0.5708.0":["26.0.0-nightly.20230412"],"114.0.5715.0":["26.0.0-nightly.20230418"],"115.0.5760.0":["26.0.0-nightly.20230511","26.0.0-nightly.20230512","26.0.0-nightly.20230515","26.0.0-nightly.20230516","26.0.0-nightly.20230517","26.0.0-nightly.20230518","26.0.0-nightly.20230519","26.0.0-nightly.20230522","26.0.0-nightly.20230523"],"115.0.5786.0":["26.0.0-nightly.20230524"],"115.0.5790.0":["26.0.0-nightly.20230525"],"116.0.5845.82":["26.0.0"],"116.0.5845.97":["26.1.0"],"116.0.5845.179":["26.2.0"],"116.0.5845.188":["26.2.1"],"116.0.5845.190":["26.2.2","26.2.3","26.2.4"],"116.0.5845.228":["26.3.0"],"118.0.5949.0":["27.0.0-alpha.1","27.0.0-alpha.2","27.0.0-alpha.3","27.0.0-alpha.4","27.0.0-alpha.5","27.0.0-alpha.6","27.0.0-nightly.20230816","28.0.0-nightly.20230817","28.0.0-nightly.20230818","28.0.0-nightly.20230821","28.0.0-nightly.20230822","28.0.0-nightly.20230823","28.0.0-nightly.20230824","28.0.0-nightly.20230825","28.0.0-nightly.20230828","28.0.0-nightly.20230829","28.0.0-nightly.20230830","28.0.0-nightly.20230831"],"118.0.5993.5":["27.0.0-beta.1","27.0.0-beta.2","27.0.0-beta.3"],"118.0.5993.11":["27.0.0-beta.4"],"118.0.5993.18":["27.0.0-beta.5","27.0.0-beta.6","27.0.0-beta.7","27.0.0-beta.8","27.0.0-beta.9"],"116.0.5829.0":["27.0.0-nightly.20230614"],"116.0.5833.0":["27.0.0-nightly.20230616","27.0.0-nightly.20230619","27.0.0-nightly.20230620","27.0.0-nightly.20230621"],"117.0.5852.0":["27.0.0-nightly.20230703","27.0.0-nightly.20230704","27.0.0-nightly.20230705","27.0.0-nightly.20230706","27.0.0-nightly.20230707","27.0.0-nightly.20230710","27.0.0-nightly.20230711","27.0.0-nightly.20230712","27.0.0-nightly.20230713","27.0.0-nightly.20230714"],"117.0.5884.1":["27.0.0-nightly.20230717","27.0.0-nightly.20230718"],"117.0.5892.0":["27.0.0-nightly.20230719"],"117.0.5897.0":["27.0.0-nightly.20230720","27.0.0-nightly.20230721","27.0.0-nightly.20230724","27.0.0-nightly.20230725","27.0.0-nightly.20230726","27.0.0-nightly.20230727","27.0.0-nightly.20230728","27.0.0-nightly.20230731"],"117.0.5911.0":["27.0.0-nightly.20230801","27.0.0-nightly.20230802","27.0.0-nightly.20230803"],"117.0.5921.0":["27.0.0-nightly.20230804","27.0.0-nightly.20230807","27.0.0-nightly.20230808","27.0.0-nightly.20230814","27.0.0-nightly.20230815"],"118.0.5993.54":["27.0.0"],"118.0.5991.0":["28.0.0-nightly.20230906"],"118.0.5993.0":["28.0.0-nightly.20230907","28.0.0-nightly.20230908","28.0.0-nightly.20230911","28.0.0-nightly.20230912","28.0.0-nightly.20230913","28.0.0-nightly.20230914","28.0.0-nightly.20230915"],"119.0.6006.0":["28.0.0-nightly.20230919"],"119.0.6017.0":["28.0.0-nightly.20230920"],"119.0.6019.2":["28.0.0-nightly.20230921","28.0.0-nightly.20230925","28.0.0-nightly.20230926","28.0.0-nightly.20230927","28.0.0-nightly.20230928"],"119.0.6029.0":["28.0.0-nightly.20230929","28.0.0-nightly.20231002"],"119.0.6043.0":["28.0.0-nightly.20231003","28.0.0-nightly.20231004","28.0.0-nightly.20231005"],"119.0.6045.0":["28.0.0-nightly.20231006","28.0.0-nightly.20231009","28.0.0-nightly.20231010"]}
    \ No newline at end of file
    +{"39.0.2171.65":["0.20.0","0.20.1","0.20.2","0.20.3","0.20.4","0.20.5","0.20.6","0.20.7","0.20.8"],"40.0.2214.91":["0.21.0","0.21.1","0.21.2"],"41.0.2272.76":["0.21.3","0.22.1","0.22.2","0.22.3","0.23.0","0.24.0"],"42.0.2311.107":["0.25.0","0.25.1","0.25.2","0.25.3","0.26.0","0.26.1","0.27.0","0.27.1"],"43.0.2357.65":["0.27.2","0.27.3","0.28.0","0.28.1","0.28.2","0.28.3","0.29.1","0.29.2"],"44.0.2403.125":["0.30.4","0.31.0"],"45.0.2454.85":["0.31.2","0.32.2","0.32.3","0.33.0","0.33.1","0.33.2","0.33.3","0.33.4","0.33.6","0.33.7","0.33.8","0.33.9","0.34.0","0.34.1","0.34.2","0.34.3","0.34.4","0.35.1","0.35.2","0.35.3","0.35.4","0.35.5"],"47.0.2526.73":["0.36.0","0.36.2","0.36.3","0.36.4"],"47.0.2526.110":["0.36.5","0.36.6","0.36.7","0.36.8","0.36.9","0.36.10","0.36.11","0.36.12"],"49.0.2623.75":["0.37.0","0.37.1","0.37.3","0.37.4","0.37.5","0.37.6","0.37.7","0.37.8","1.0.0","1.0.1","1.0.2"],"50.0.2661.102":["1.1.0","1.1.1","1.1.2","1.1.3"],"51.0.2704.63":["1.2.0","1.2.1"],"51.0.2704.84":["1.2.2","1.2.3"],"51.0.2704.103":["1.2.4","1.2.5"],"51.0.2704.106":["1.2.6","1.2.7","1.2.8"],"52.0.2743.82":["1.3.0","1.3.1","1.3.2","1.3.3","1.3.4","1.3.5","1.3.6","1.3.7","1.3.9","1.3.10","1.3.13","1.3.14","1.3.15"],"53.0.2785.113":["1.4.0","1.4.1","1.4.2","1.4.3","1.4.4","1.4.5"],"53.0.2785.143":["1.4.6","1.4.7","1.4.8","1.4.10","1.4.11","1.4.13","1.4.14","1.4.15","1.4.16"],"54.0.2840.51":["1.4.12"],"54.0.2840.101":["1.5.0","1.5.1"],"56.0.2924.87":["1.6.0","1.6.1","1.6.2","1.6.3","1.6.4","1.6.5","1.6.6","1.6.7","1.6.8","1.6.9","1.6.10","1.6.11","1.6.12","1.6.13","1.6.14","1.6.15","1.6.16","1.6.17","1.6.18"],"58.0.3029.110":["1.7.0","1.7.1","1.7.2","1.7.3","1.7.4","1.7.5","1.7.6","1.7.7","1.7.8","1.7.9","1.7.10","1.7.11","1.7.12","1.7.13","1.7.14","1.7.15","1.7.16"],"59.0.3071.115":["1.8.0","1.8.1","1.8.2-beta.1","1.8.2-beta.2","1.8.2-beta.3","1.8.2-beta.4","1.8.2-beta.5","1.8.2","1.8.3","1.8.4","1.8.5","1.8.6","1.8.7","1.8.8"],"61.0.3163.100":["2.0.0-beta.1","2.0.0-beta.2","2.0.0-beta.3","2.0.0-beta.4","2.0.0-beta.5","2.0.0-beta.6","2.0.0-beta.7","2.0.0-beta.8","2.0.0","2.0.1","2.0.2","2.0.3","2.0.4","2.0.5","2.0.6","2.0.7","2.0.8-nightly.20180819","2.0.8-nightly.20180820","2.0.8","2.0.9","2.0.10","2.0.11","2.0.12","2.0.13","2.0.14","2.0.15","2.0.16","2.0.17","2.0.18","2.1.0-unsupported.20180809"],"66.0.3359.181":["3.0.0-beta.1","3.0.0-beta.2","3.0.0-beta.3","3.0.0-beta.4","3.0.0-beta.5","3.0.0-beta.6","3.0.0-beta.7","3.0.0-beta.8","3.0.0-beta.9","3.0.0-beta.10","3.0.0-beta.11","3.0.0-beta.12","3.0.0-beta.13","3.0.0-nightly.20180818","3.0.0-nightly.20180821","3.0.0-nightly.20180823","3.0.0-nightly.20180904","3.0.0","3.0.1","3.0.2","3.0.3","3.0.4","3.0.5","3.0.6","3.0.7","3.0.8","3.0.9","3.0.10","3.0.11","3.0.12","3.0.13","3.0.14","3.0.15","3.0.16","3.1.0-beta.1","3.1.0-beta.2","3.1.0-beta.3","3.1.0-beta.4","3.1.0-beta.5","3.1.0","3.1.1","3.1.2","3.1.3","3.1.4","3.1.5","3.1.6","3.1.7","3.1.8","3.1.9","3.1.10","3.1.11","3.1.12","3.1.13","4.0.0-nightly.20180817","4.0.0-nightly.20180819","4.0.0-nightly.20180821"],"69.0.3497.106":["4.0.0-beta.1","4.0.0-beta.2","4.0.0-beta.3","4.0.0-beta.4","4.0.0-beta.5","4.0.0-beta.6","4.0.0-beta.7","4.0.0-beta.8","4.0.0-beta.9","4.0.0-beta.10","4.0.0-beta.11","4.0.0-nightly.20181010","4.0.0","4.0.1","4.0.2","4.0.3","4.0.4","4.0.5","4.0.6"],"67.0.3396.99":["4.0.0-nightly.20180929"],"68.0.3440.128":["4.0.0-nightly.20181006"],"69.0.3497.128":["4.0.7","4.0.8","4.1.0","4.1.1","4.1.2","4.1.3","4.1.4","4.1.5","4.2.0","4.2.1","4.2.2","4.2.3","4.2.4","4.2.5","4.2.6","4.2.7","4.2.8","4.2.9","4.2.10","4.2.11","4.2.12"],"72.0.3626.52":["5.0.0-beta.1","5.0.0-beta.2","6.0.0-nightly.20190123"],"73.0.3683.27":["5.0.0-beta.3"],"73.0.3683.54":["5.0.0-beta.4"],"73.0.3683.61":["5.0.0-beta.5"],"73.0.3683.84":["5.0.0-beta.6"],"73.0.3683.94":["5.0.0-beta.7"],"73.0.3683.104":["5.0.0-beta.8"],"73.0.3683.117":["5.0.0-beta.9"],"70.0.3538.110":["5.0.0-nightly.20190107"],"71.0.3578.98":["5.0.0-nightly.20190121","5.0.0-nightly.20190122"],"73.0.3683.119":["5.0.0"],"73.0.3683.121":["5.0.1","5.0.2","5.0.3","5.0.4","5.0.5","5.0.6","5.0.7","5.0.8","5.0.9","5.0.10","5.0.11","5.0.12","5.0.13"],"76.0.3774.1":["6.0.0-beta.1"],"76.0.3783.1":["6.0.0-beta.2","6.0.0-beta.3","6.0.0-beta.4"],"76.0.3805.4":["6.0.0-beta.5"],"76.0.3809.3":["6.0.0-beta.6"],"76.0.3809.22":["6.0.0-beta.7"],"76.0.3809.26":["6.0.0-beta.8","6.0.0-beta.9"],"76.0.3809.37":["6.0.0-beta.10"],"76.0.3809.42":["6.0.0-beta.11"],"76.0.3809.54":["6.0.0-beta.12"],"76.0.3809.60":["6.0.0-beta.13"],"76.0.3809.68":["6.0.0-beta.14"],"76.0.3809.74":["6.0.0-beta.15"],"72.0.3626.107":["6.0.0-nightly.20190212"],"72.0.3626.110":["6.0.0-nightly.20190213"],"74.0.3724.8":["6.0.0-nightly.20190311"],"76.0.3809.88":["6.0.0"],"76.0.3809.102":["6.0.1"],"76.0.3809.110":["6.0.2"],"76.0.3809.126":["6.0.3"],"76.0.3809.131":["6.0.4"],"76.0.3809.136":["6.0.5"],"76.0.3809.138":["6.0.6"],"76.0.3809.139":["6.0.7"],"76.0.3809.146":["6.0.8","6.0.9","6.0.10","6.0.11","6.0.12","6.1.0","6.1.1","6.1.2","6.1.3","6.1.4","6.1.5","6.1.6","6.1.7","6.1.8","6.1.9","6.1.10","6.1.11","6.1.12"],"78.0.3866.0":["7.0.0-beta.1","7.0.0-beta.2","7.0.0-beta.3","7.0.0-nightly.20190727","7.0.0-nightly.20190728","7.0.0-nightly.20190729","7.0.0-nightly.20190730","7.0.0-nightly.20190731","8.0.0-nightly.20190801","8.0.0-nightly.20190802"],"78.0.3896.6":["7.0.0-beta.4"],"78.0.3905.1":["7.0.0-beta.5","7.0.0-beta.6","7.0.0-beta.7","7.0.0"],"76.0.3784.0":["7.0.0-nightly.20190521"],"76.0.3806.0":["7.0.0-nightly.20190529","7.0.0-nightly.20190530","7.0.0-nightly.20190531","7.0.0-nightly.20190602","7.0.0-nightly.20190603"],"77.0.3814.0":["7.0.0-nightly.20190604"],"77.0.3815.0":["7.0.0-nightly.20190605","7.0.0-nightly.20190606","7.0.0-nightly.20190607","7.0.0-nightly.20190608","7.0.0-nightly.20190609","7.0.0-nightly.20190611","7.0.0-nightly.20190612","7.0.0-nightly.20190613","7.0.0-nightly.20190615","7.0.0-nightly.20190616","7.0.0-nightly.20190618","7.0.0-nightly.20190619","7.0.0-nightly.20190622","7.0.0-nightly.20190623","7.0.0-nightly.20190624","7.0.0-nightly.20190627","7.0.0-nightly.20190629","7.0.0-nightly.20190630","7.0.0-nightly.20190701","7.0.0-nightly.20190702"],"77.0.3843.0":["7.0.0-nightly.20190704","7.0.0-nightly.20190705"],"77.0.3848.0":["7.0.0-nightly.20190719","7.0.0-nightly.20190720","7.0.0-nightly.20190721"],"77.0.3864.0":["7.0.0-nightly.20190726"],"78.0.3904.92":["7.0.1"],"78.0.3904.94":["7.1.0"],"78.0.3904.99":["7.1.1"],"78.0.3904.113":["7.1.2"],"78.0.3904.126":["7.1.3"],"78.0.3904.130":["7.1.4","7.1.5","7.1.6","7.1.7","7.1.8","7.1.9","7.1.10","7.1.11","7.1.12","7.1.13","7.1.14","7.2.0","7.2.1","7.2.2","7.2.3","7.2.4","7.3.0","7.3.1","7.3.2","7.3.3"],"79.0.3931.0":["8.0.0-beta.1","8.0.0-beta.2","8.0.0-nightly.20191019","8.0.0-nightly.20191020","8.0.0-nightly.20191021","8.0.0-nightly.20191023"],"80.0.3955.0":["8.0.0-beta.3","8.0.0-beta.4"],"80.0.3987.14":["8.0.0-beta.5"],"80.0.3987.51":["8.0.0-beta.6"],"80.0.3987.59":["8.0.0-beta.7"],"80.0.3987.75":["8.0.0-beta.8","8.0.0-beta.9"],"78.0.3871.0":["8.0.0-nightly.20190803","8.0.0-nightly.20190806","8.0.0-nightly.20190807","8.0.0-nightly.20190808","8.0.0-nightly.20190809","8.0.0-nightly.20190810","8.0.0-nightly.20190811","8.0.0-nightly.20190812","8.0.0-nightly.20190813","8.0.0-nightly.20190814","8.0.0-nightly.20190815"],"78.0.3881.0":["8.0.0-nightly.20190816","8.0.0-nightly.20190817","8.0.0-nightly.20190818","8.0.0-nightly.20190819","8.0.0-nightly.20190820"],"78.0.3892.0":["8.0.0-nightly.20190824","8.0.0-nightly.20190825","8.0.0-nightly.20190827","8.0.0-nightly.20190828","8.0.0-nightly.20190830","8.0.0-nightly.20190901","8.0.0-nightly.20190902","8.0.0-nightly.20190907","8.0.0-nightly.20190909","8.0.0-nightly.20190910","8.0.0-nightly.20190911","8.0.0-nightly.20190912","8.0.0-nightly.20190913","8.0.0-nightly.20190914","8.0.0-nightly.20190915","8.0.0-nightly.20190917"],"79.0.3915.0":["8.0.0-nightly.20190919","8.0.0-nightly.20190920"],"79.0.3919.0":["8.0.0-nightly.20190922","8.0.0-nightly.20190923","8.0.0-nightly.20190924","8.0.0-nightly.20190926","8.0.0-nightly.20190928","8.0.0-nightly.20190929","8.0.0-nightly.20190930","8.0.0-nightly.20191001","8.0.0-nightly.20191004","8.0.0-nightly.20191005","8.0.0-nightly.20191006","8.0.0-nightly.20191009","8.0.0-nightly.20191011","8.0.0-nightly.20191012","8.0.0-nightly.20191017"],"80.0.3952.0":["8.0.0-nightly.20191101","8.0.0-nightly.20191103","8.0.0-nightly.20191105"],"80.0.3987.86":["8.0.0","8.0.1","8.0.2"],"80.0.3987.134":["8.0.3"],"80.0.3987.137":["8.1.0"],"80.0.3987.141":["8.1.1"],"80.0.3987.158":["8.2.0"],"80.0.3987.163":["8.2.1","8.2.2","8.2.3","8.5.3","8.5.4","8.5.5"],"80.0.3987.165":["8.2.4","8.2.5","8.3.0","8.3.1","8.3.2","8.3.3","8.3.4","8.4.0","8.4.1","8.5.0","8.5.1","8.5.2"],"82.0.4048.0":["9.0.0-beta.1","9.0.0-beta.2","9.0.0-beta.3","9.0.0-beta.4","9.0.0-beta.5"],"82.0.4058.2":["9.0.0-beta.6","9.0.0-beta.7","9.0.0-beta.9"],"82.0.4085.10":["9.0.0-beta.10"],"82.0.4085.14":["9.0.0-beta.11","9.0.0-beta.12","9.0.0-beta.13"],"82.0.4085.27":["9.0.0-beta.14"],"83.0.4102.3":["9.0.0-beta.15","9.0.0-beta.16"],"83.0.4103.14":["9.0.0-beta.17"],"83.0.4103.16":["9.0.0-beta.18"],"83.0.4103.24":["9.0.0-beta.19"],"83.0.4103.26":["9.0.0-beta.20","9.0.0-beta.21"],"83.0.4103.34":["9.0.0-beta.22"],"83.0.4103.44":["9.0.0-beta.23"],"83.0.4103.45":["9.0.0-beta.24"],"80.0.3954.0":["9.0.0-nightly.20191121","9.0.0-nightly.20191122","9.0.0-nightly.20191123","9.0.0-nightly.20191124","9.0.0-nightly.20191126","9.0.0-nightly.20191128","9.0.0-nightly.20191129","9.0.0-nightly.20191130","9.0.0-nightly.20191201","9.0.0-nightly.20191202","9.0.0-nightly.20191203","9.0.0-nightly.20191204","9.0.0-nightly.20191205","9.0.0-nightly.20191210"],"81.0.3994.0":["9.0.0-nightly.20191220","9.0.0-nightly.20191221","9.0.0-nightly.20191222","9.0.0-nightly.20191223","9.0.0-nightly.20191224","9.0.0-nightly.20191225","9.0.0-nightly.20191226","9.0.0-nightly.20191228","9.0.0-nightly.20191229","9.0.0-nightly.20191230","9.0.0-nightly.20191231","9.0.0-nightly.20200101","9.0.0-nightly.20200103","9.0.0-nightly.20200104","9.0.0-nightly.20200105","9.0.0-nightly.20200106","9.0.0-nightly.20200108","9.0.0-nightly.20200109","9.0.0-nightly.20200110","9.0.0-nightly.20200111","9.0.0-nightly.20200113","9.0.0-nightly.20200115","9.0.0-nightly.20200116","9.0.0-nightly.20200117"],"81.0.4030.0":["9.0.0-nightly.20200119","9.0.0-nightly.20200121"],"83.0.4103.64":["9.0.0"],"83.0.4103.94":["9.0.1","9.0.2"],"83.0.4103.100":["9.0.3"],"83.0.4103.104":["9.0.4"],"83.0.4103.119":["9.0.5"],"83.0.4103.122":["9.1.0","9.1.1","9.1.2","9.2.0","9.2.1","9.3.0","9.3.1","9.3.2","9.3.3","9.3.4","9.3.5","9.4.0","9.4.1","9.4.2","9.4.3","9.4.4"],"84.0.4129.0":["10.0.0-beta.1","10.0.0-beta.2","10.0.0-nightly.20200501","10.0.0-nightly.20200504","10.0.0-nightly.20200505","10.0.0-nightly.20200506","10.0.0-nightly.20200507","10.0.0-nightly.20200508","10.0.0-nightly.20200511","10.0.0-nightly.20200512","10.0.0-nightly.20200513","10.0.0-nightly.20200514","10.0.0-nightly.20200515","10.0.0-nightly.20200518","10.0.0-nightly.20200519","10.0.0-nightly.20200520","10.0.0-nightly.20200521","11.0.0-nightly.20200525","11.0.0-nightly.20200526"],"85.0.4161.2":["10.0.0-beta.3","10.0.0-beta.4"],"85.0.4181.1":["10.0.0-beta.8","10.0.0-beta.9"],"85.0.4183.19":["10.0.0-beta.10"],"85.0.4183.20":["10.0.0-beta.11"],"85.0.4183.26":["10.0.0-beta.12"],"85.0.4183.39":["10.0.0-beta.13","10.0.0-beta.14","10.0.0-beta.15","10.0.0-beta.17","10.0.0-beta.19","10.0.0-beta.20","10.0.0-beta.21"],"85.0.4183.70":["10.0.0-beta.23"],"85.0.4183.78":["10.0.0-beta.24"],"85.0.4183.80":["10.0.0-beta.25"],"82.0.4050.0":["10.0.0-nightly.20200209","10.0.0-nightly.20200210","10.0.0-nightly.20200211","10.0.0-nightly.20200216","10.0.0-nightly.20200217","10.0.0-nightly.20200218","10.0.0-nightly.20200221","10.0.0-nightly.20200222","10.0.0-nightly.20200223","10.0.0-nightly.20200226","10.0.0-nightly.20200303"],"82.0.4076.0":["10.0.0-nightly.20200304","10.0.0-nightly.20200305","10.0.0-nightly.20200306","10.0.0-nightly.20200309","10.0.0-nightly.20200310"],"82.0.4083.0":["10.0.0-nightly.20200311"],"83.0.4086.0":["10.0.0-nightly.20200316"],"83.0.4087.0":["10.0.0-nightly.20200317","10.0.0-nightly.20200318","10.0.0-nightly.20200320","10.0.0-nightly.20200323","10.0.0-nightly.20200324","10.0.0-nightly.20200325","10.0.0-nightly.20200326","10.0.0-nightly.20200327","10.0.0-nightly.20200330","10.0.0-nightly.20200331","10.0.0-nightly.20200401","10.0.0-nightly.20200402","10.0.0-nightly.20200403","10.0.0-nightly.20200406"],"83.0.4095.0":["10.0.0-nightly.20200408","10.0.0-nightly.20200410","10.0.0-nightly.20200413"],"84.0.4114.0":["10.0.0-nightly.20200414"],"84.0.4115.0":["10.0.0-nightly.20200415","10.0.0-nightly.20200416","10.0.0-nightly.20200417"],"84.0.4121.0":["10.0.0-nightly.20200422","10.0.0-nightly.20200423"],"84.0.4125.0":["10.0.0-nightly.20200427","10.0.0-nightly.20200428","10.0.0-nightly.20200429","10.0.0-nightly.20200430"],"85.0.4183.84":["10.0.0"],"85.0.4183.86":["10.0.1"],"85.0.4183.87":["10.1.0"],"85.0.4183.93":["10.1.1"],"85.0.4183.98":["10.1.2"],"85.0.4183.121":["10.1.3","10.1.4","10.1.5","10.1.6","10.1.7","10.2.0","10.3.0","10.3.1","10.3.2","10.4.0","10.4.1","10.4.2","10.4.3","10.4.4","10.4.5","10.4.6","10.4.7"],"86.0.4234.0":["11.0.0-beta.1","11.0.0-beta.3","11.0.0-beta.4","11.0.0-beta.5","11.0.0-beta.6","11.0.0-beta.7","11.0.0-nightly.20200822","11.0.0-nightly.20200824","11.0.0-nightly.20200825","11.0.0-nightly.20200826","12.0.0-nightly.20200827","12.0.0-nightly.20200831","12.0.0-nightly.20200902","12.0.0-nightly.20200903","12.0.0-nightly.20200907","12.0.0-nightly.20200910","12.0.0-nightly.20200911","12.0.0-nightly.20200914"],"87.0.4251.1":["11.0.0-beta.8","11.0.0-beta.9","11.0.0-beta.11"],"87.0.4280.11":["11.0.0-beta.12","11.0.0-beta.13"],"87.0.4280.27":["11.0.0-beta.16","11.0.0-beta.17","11.0.0-beta.18","11.0.0-beta.19"],"87.0.4280.40":["11.0.0-beta.20"],"87.0.4280.47":["11.0.0-beta.22","11.0.0-beta.23"],"85.0.4156.0":["11.0.0-nightly.20200529"],"85.0.4162.0":["11.0.0-nightly.20200602","11.0.0-nightly.20200603","11.0.0-nightly.20200604","11.0.0-nightly.20200609","11.0.0-nightly.20200610","11.0.0-nightly.20200611","11.0.0-nightly.20200615","11.0.0-nightly.20200616","11.0.0-nightly.20200617","11.0.0-nightly.20200618","11.0.0-nightly.20200619"],"85.0.4179.0":["11.0.0-nightly.20200701","11.0.0-nightly.20200702","11.0.0-nightly.20200703","11.0.0-nightly.20200706","11.0.0-nightly.20200707","11.0.0-nightly.20200708","11.0.0-nightly.20200709"],"86.0.4203.0":["11.0.0-nightly.20200716","11.0.0-nightly.20200717","11.0.0-nightly.20200720","11.0.0-nightly.20200721"],"86.0.4209.0":["11.0.0-nightly.20200723","11.0.0-nightly.20200724","11.0.0-nightly.20200729","11.0.0-nightly.20200730","11.0.0-nightly.20200731","11.0.0-nightly.20200803","11.0.0-nightly.20200804","11.0.0-nightly.20200805","11.0.0-nightly.20200811","11.0.0-nightly.20200812"],"87.0.4280.60":["11.0.0","11.0.1"],"87.0.4280.67":["11.0.2","11.0.3","11.0.4"],"87.0.4280.88":["11.0.5","11.1.0","11.1.1"],"87.0.4280.141":["11.2.0","11.2.1","11.2.2","11.2.3","11.3.0","11.4.0","11.4.1","11.4.2","11.4.3","11.4.4","11.4.5","11.4.6","11.4.7","11.4.8","11.4.9","11.4.10","11.4.11","11.4.12","11.5.0"],"89.0.4328.0":["12.0.0-beta.1","12.0.0-beta.3","12.0.0-beta.4","12.0.0-beta.5","12.0.0-beta.6","12.0.0-beta.7","12.0.0-beta.8","12.0.0-beta.9","12.0.0-beta.10","12.0.0-beta.11","12.0.0-beta.12","12.0.0-beta.14","13.0.0-nightly.20201119","13.0.0-nightly.20201123","13.0.0-nightly.20201124","13.0.0-nightly.20201126","13.0.0-nightly.20201127","13.0.0-nightly.20201130","13.0.0-nightly.20201201","13.0.0-nightly.20201202","13.0.0-nightly.20201203","13.0.0-nightly.20201204","13.0.0-nightly.20201207","13.0.0-nightly.20201208","13.0.0-nightly.20201209","13.0.0-nightly.20201210","13.0.0-nightly.20201211","13.0.0-nightly.20201214"],"89.0.4348.1":["12.0.0-beta.16","12.0.0-beta.18","12.0.0-beta.19","12.0.0-beta.20"],"89.0.4388.2":["12.0.0-beta.21","12.0.0-beta.22","12.0.0-beta.23","12.0.0-beta.24","12.0.0-beta.25","12.0.0-beta.26"],"89.0.4389.23":["12.0.0-beta.27","12.0.0-beta.28","12.0.0-beta.29"],"89.0.4389.58":["12.0.0-beta.30","12.0.0-beta.31"],"87.0.4268.0":["12.0.0-nightly.20201002","12.0.0-nightly.20201007","12.0.0-nightly.20201009","12.0.0-nightly.20201012","12.0.0-nightly.20201013","12.0.0-nightly.20201014","12.0.0-nightly.20201015"],"88.0.4292.0":["12.0.0-nightly.20201023","12.0.0-nightly.20201026"],"88.0.4306.0":["12.0.0-nightly.20201030","12.0.0-nightly.20201102","12.0.0-nightly.20201103","12.0.0-nightly.20201104","12.0.0-nightly.20201105","12.0.0-nightly.20201106","12.0.0-nightly.20201111","12.0.0-nightly.20201112"],"88.0.4324.0":["12.0.0-nightly.20201116"],"89.0.4389.69":["12.0.0"],"89.0.4389.82":["12.0.1"],"89.0.4389.90":["12.0.2"],"89.0.4389.114":["12.0.3","12.0.4"],"89.0.4389.128":["12.0.5","12.0.6","12.0.7","12.0.8","12.0.9","12.0.10","12.0.11","12.0.12","12.0.13","12.0.14","12.0.15","12.0.16","12.0.17","12.0.18","12.1.0","12.1.1","12.1.2","12.2.0","12.2.1","12.2.2","12.2.3"],"90.0.4402.0":["13.0.0-beta.2","13.0.0-beta.3","13.0.0-nightly.20210210","13.0.0-nightly.20210211","13.0.0-nightly.20210212","13.0.0-nightly.20210216","13.0.0-nightly.20210217","13.0.0-nightly.20210218","13.0.0-nightly.20210219","13.0.0-nightly.20210222","13.0.0-nightly.20210225","13.0.0-nightly.20210226","13.0.0-nightly.20210301","13.0.0-nightly.20210302","13.0.0-nightly.20210303","14.0.0-nightly.20210304"],"90.0.4415.0":["13.0.0-beta.4","13.0.0-beta.5","13.0.0-beta.6","13.0.0-beta.7","13.0.0-beta.8","13.0.0-beta.9","13.0.0-beta.10","13.0.0-beta.11","13.0.0-beta.12","13.0.0-beta.13","14.0.0-nightly.20210305","14.0.0-nightly.20210308","14.0.0-nightly.20210309","14.0.0-nightly.20210311","14.0.0-nightly.20210315","14.0.0-nightly.20210316","14.0.0-nightly.20210317","14.0.0-nightly.20210318","14.0.0-nightly.20210319","14.0.0-nightly.20210323","14.0.0-nightly.20210324","14.0.0-nightly.20210325","14.0.0-nightly.20210326","14.0.0-nightly.20210329","14.0.0-nightly.20210330"],"91.0.4448.0":["13.0.0-beta.14","13.0.0-beta.16","13.0.0-beta.17","13.0.0-beta.18","13.0.0-beta.20","14.0.0-nightly.20210331","14.0.0-nightly.20210401","14.0.0-nightly.20210402","14.0.0-nightly.20210406","14.0.0-nightly.20210407","14.0.0-nightly.20210408","14.0.0-nightly.20210409","14.0.0-nightly.20210413"],"91.0.4472.33":["13.0.0-beta.21","13.0.0-beta.22","13.0.0-beta.23"],"91.0.4472.38":["13.0.0-beta.24","13.0.0-beta.25","13.0.0-beta.26","13.0.0-beta.27","13.0.0-beta.28"],"89.0.4349.0":["13.0.0-nightly.20201215","13.0.0-nightly.20201216","13.0.0-nightly.20201221","13.0.0-nightly.20201222"],"89.0.4359.0":["13.0.0-nightly.20201223","13.0.0-nightly.20210104","13.0.0-nightly.20210108","13.0.0-nightly.20210111"],"89.0.4386.0":["13.0.0-nightly.20210113","13.0.0-nightly.20210114","13.0.0-nightly.20210118","13.0.0-nightly.20210122","13.0.0-nightly.20210125"],"89.0.4389.0":["13.0.0-nightly.20210127","13.0.0-nightly.20210128","13.0.0-nightly.20210129","13.0.0-nightly.20210201","13.0.0-nightly.20210202","13.0.0-nightly.20210203","13.0.0-nightly.20210205","13.0.0-nightly.20210208","13.0.0-nightly.20210209"],"91.0.4472.69":["13.0.0","13.0.1"],"91.0.4472.77":["13.1.0","13.1.1","13.1.2"],"91.0.4472.106":["13.1.3","13.1.4"],"91.0.4472.124":["13.1.5","13.1.6","13.1.7"],"91.0.4472.164":["13.1.8","13.1.9","13.2.0","13.2.1","13.2.2","13.2.3","13.3.0","13.4.0","13.5.0","13.5.1","13.5.2","13.6.0","13.6.1","13.6.2","13.6.3","13.6.6","13.6.7","13.6.8","13.6.9"],"92.0.4511.0":["14.0.0-beta.1","14.0.0-beta.2","14.0.0-beta.3","14.0.0-nightly.20210520","14.0.0-nightly.20210523","14.0.0-nightly.20210524","15.0.0-nightly.20210527","15.0.0-nightly.20210528","15.0.0-nightly.20210531","15.0.0-nightly.20210601","15.0.0-nightly.20210602"],"93.0.4536.0":["14.0.0-beta.5","14.0.0-beta.6","14.0.0-beta.7","14.0.0-beta.8","15.0.0-nightly.20210609","15.0.0-nightly.20210610","15.0.0-nightly.20210611","15.0.0-nightly.20210614","15.0.0-nightly.20210615","15.0.0-nightly.20210616"],"93.0.4539.0":["14.0.0-beta.9","14.0.0-beta.10","15.0.0-nightly.20210617","15.0.0-nightly.20210618","15.0.0-nightly.20210621","15.0.0-nightly.20210622"],"93.0.4557.4":["14.0.0-beta.11","14.0.0-beta.12"],"93.0.4566.0":["14.0.0-beta.13","14.0.0-beta.14","14.0.0-beta.15","14.0.0-beta.16","14.0.0-beta.17","15.0.0-alpha.1","15.0.0-alpha.2","15.0.0-nightly.20210706","15.0.0-nightly.20210707","15.0.0-nightly.20210708","15.0.0-nightly.20210709","15.0.0-nightly.20210712","15.0.0-nightly.20210713","15.0.0-nightly.20210714","15.0.0-nightly.20210715","15.0.0-nightly.20210716","15.0.0-nightly.20210719","15.0.0-nightly.20210720","15.0.0-nightly.20210721","16.0.0-nightly.20210722","16.0.0-nightly.20210723","16.0.0-nightly.20210726"],"93.0.4577.15":["14.0.0-beta.18","14.0.0-beta.19","14.0.0-beta.20","14.0.0-beta.21"],"93.0.4577.25":["14.0.0-beta.22","14.0.0-beta.23"],"93.0.4577.51":["14.0.0-beta.24","14.0.0-beta.25"],"92.0.4475.0":["14.0.0-nightly.20210426","14.0.0-nightly.20210427"],"92.0.4488.0":["14.0.0-nightly.20210430","14.0.0-nightly.20210503"],"92.0.4496.0":["14.0.0-nightly.20210505"],"92.0.4498.0":["14.0.0-nightly.20210506"],"92.0.4499.0":["14.0.0-nightly.20210507","14.0.0-nightly.20210510","14.0.0-nightly.20210511","14.0.0-nightly.20210512","14.0.0-nightly.20210513"],"92.0.4505.0":["14.0.0-nightly.20210514","14.0.0-nightly.20210517","14.0.0-nightly.20210518","14.0.0-nightly.20210519"],"93.0.4577.58":["14.0.0"],"93.0.4577.63":["14.0.1"],"93.0.4577.82":["14.0.2","14.1.0","14.1.1","14.2.0","14.2.1","14.2.2","14.2.3","14.2.4","14.2.5","14.2.6","14.2.7","14.2.8","14.2.9"],"94.0.4584.0":["15.0.0-alpha.3","15.0.0-alpha.4","15.0.0-alpha.5","15.0.0-alpha.6","16.0.0-nightly.20210727","16.0.0-nightly.20210728","16.0.0-nightly.20210729","16.0.0-nightly.20210730","16.0.0-nightly.20210802","16.0.0-nightly.20210803","16.0.0-nightly.20210804","16.0.0-nightly.20210805","16.0.0-nightly.20210806","16.0.0-nightly.20210809","16.0.0-nightly.20210810","16.0.0-nightly.20210811"],"94.0.4590.2":["15.0.0-alpha.7","15.0.0-alpha.8","15.0.0-alpha.9","16.0.0-nightly.20210812","16.0.0-nightly.20210813","16.0.0-nightly.20210816","16.0.0-nightly.20210817","16.0.0-nightly.20210818","16.0.0-nightly.20210819","16.0.0-nightly.20210820","16.0.0-nightly.20210823"],"94.0.4606.12":["15.0.0-alpha.10"],"94.0.4606.20":["15.0.0-beta.1","15.0.0-beta.2"],"94.0.4606.31":["15.0.0-beta.3","15.0.0-beta.4","15.0.0-beta.5","15.0.0-beta.6","15.0.0-beta.7"],"93.0.4530.0":["15.0.0-nightly.20210603","15.0.0-nightly.20210604"],"93.0.4535.0":["15.0.0-nightly.20210608"],"93.0.4550.0":["15.0.0-nightly.20210623","15.0.0-nightly.20210624"],"93.0.4552.0":["15.0.0-nightly.20210625","15.0.0-nightly.20210628","15.0.0-nightly.20210629"],"93.0.4558.0":["15.0.0-nightly.20210630","15.0.0-nightly.20210701","15.0.0-nightly.20210702","15.0.0-nightly.20210705"],"94.0.4606.51":["15.0.0"],"94.0.4606.61":["15.1.0","15.1.1"],"94.0.4606.71":["15.1.2"],"94.0.4606.81":["15.2.0","15.3.0","15.3.1","15.3.2","15.3.3","15.3.4","15.3.5","15.3.6","15.3.7","15.4.0","15.4.1","15.4.2","15.5.0","15.5.1","15.5.2","15.5.3","15.5.4","15.5.5","15.5.6","15.5.7"],"95.0.4629.0":["16.0.0-alpha.1","16.0.0-alpha.2","16.0.0-alpha.3","16.0.0-alpha.4","16.0.0-alpha.5","16.0.0-alpha.6","16.0.0-alpha.7","16.0.0-nightly.20210902","16.0.0-nightly.20210903","16.0.0-nightly.20210906","16.0.0-nightly.20210907","16.0.0-nightly.20210908","16.0.0-nightly.20210909","16.0.0-nightly.20210910","16.0.0-nightly.20210913","16.0.0-nightly.20210914","16.0.0-nightly.20210915","16.0.0-nightly.20210916","16.0.0-nightly.20210917","16.0.0-nightly.20210920","16.0.0-nightly.20210921","16.0.0-nightly.20210922","17.0.0-nightly.20210923","17.0.0-nightly.20210924","17.0.0-nightly.20210927","17.0.0-nightly.20210928","17.0.0-nightly.20210929","17.0.0-nightly.20210930","17.0.0-nightly.20211001","17.0.0-nightly.20211004","17.0.0-nightly.20211005"],"96.0.4647.0":["16.0.0-alpha.8","16.0.0-alpha.9","16.0.0-beta.1","16.0.0-beta.2","16.0.0-beta.3","17.0.0-nightly.20211006","17.0.0-nightly.20211007","17.0.0-nightly.20211008","17.0.0-nightly.20211011","17.0.0-nightly.20211012","17.0.0-nightly.20211013","17.0.0-nightly.20211014","17.0.0-nightly.20211015","17.0.0-nightly.20211018","17.0.0-nightly.20211019","17.0.0-nightly.20211020","17.0.0-nightly.20211021"],"96.0.4664.18":["16.0.0-beta.4","16.0.0-beta.5"],"96.0.4664.27":["16.0.0-beta.6","16.0.0-beta.7"],"96.0.4664.35":["16.0.0-beta.8","16.0.0-beta.9"],"95.0.4612.5":["16.0.0-nightly.20210824","16.0.0-nightly.20210825","16.0.0-nightly.20210826","16.0.0-nightly.20210827","16.0.0-nightly.20210830","16.0.0-nightly.20210831","16.0.0-nightly.20210901"],"96.0.4664.45":["16.0.0","16.0.1"],"96.0.4664.55":["16.0.2","16.0.3","16.0.4","16.0.5"],"96.0.4664.110":["16.0.6","16.0.7","16.0.8"],"96.0.4664.174":["16.0.9","16.0.10","16.1.0","16.1.1","16.2.0","16.2.1","16.2.2","16.2.3","16.2.4","16.2.5","16.2.6","16.2.7","16.2.8"],"96.0.4664.4":["17.0.0-alpha.1","17.0.0-alpha.2","17.0.0-alpha.3","17.0.0-nightly.20211022","17.0.0-nightly.20211025","17.0.0-nightly.20211026","17.0.0-nightly.20211027","17.0.0-nightly.20211028","17.0.0-nightly.20211029","17.0.0-nightly.20211101","17.0.0-nightly.20211102","17.0.0-nightly.20211103","17.0.0-nightly.20211104","17.0.0-nightly.20211105","17.0.0-nightly.20211108","17.0.0-nightly.20211109","17.0.0-nightly.20211110","17.0.0-nightly.20211111","17.0.0-nightly.20211112","17.0.0-nightly.20211115","17.0.0-nightly.20211116","17.0.0-nightly.20211117","18.0.0-nightly.20211118","18.0.0-nightly.20211119","18.0.0-nightly.20211122","18.0.0-nightly.20211123"],"98.0.4706.0":["17.0.0-alpha.4","17.0.0-alpha.5","17.0.0-alpha.6","17.0.0-beta.1","17.0.0-beta.2","18.0.0-nightly.20211124","18.0.0-nightly.20211125","18.0.0-nightly.20211126","18.0.0-nightly.20211129","18.0.0-nightly.20211130","18.0.0-nightly.20211201","18.0.0-nightly.20211202","18.0.0-nightly.20211203","18.0.0-nightly.20211206","18.0.0-nightly.20211207","18.0.0-nightly.20211208","18.0.0-nightly.20211209","18.0.0-nightly.20211210","18.0.0-nightly.20211213","18.0.0-nightly.20211214","18.0.0-nightly.20211215","18.0.0-nightly.20211216","18.0.0-nightly.20211217","18.0.0-nightly.20211220","18.0.0-nightly.20211221","18.0.0-nightly.20211222","18.0.0-nightly.20211223","18.0.0-nightly.20211228","18.0.0-nightly.20211229","18.0.0-nightly.20211231","18.0.0-nightly.20220103","18.0.0-nightly.20220104","18.0.0-nightly.20220105","18.0.0-nightly.20220106","18.0.0-nightly.20220107","18.0.0-nightly.20220110"],"98.0.4758.9":["17.0.0-beta.3"],"98.0.4758.11":["17.0.0-beta.4","17.0.0-beta.5","17.0.0-beta.6","17.0.0-beta.7","17.0.0-beta.8","17.0.0-beta.9"],"98.0.4758.74":["17.0.0"],"98.0.4758.82":["17.0.1"],"98.0.4758.102":["17.1.0"],"98.0.4758.109":["17.1.1","17.1.2","17.2.0"],"98.0.4758.141":["17.3.0","17.3.1","17.4.0","17.4.1","17.4.2","17.4.3","17.4.4","17.4.5","17.4.6","17.4.7","17.4.8","17.4.9","17.4.10","17.4.11"],"99.0.4767.0":["18.0.0-alpha.1","18.0.0-alpha.2","18.0.0-alpha.3","18.0.0-alpha.4","18.0.0-alpha.5","18.0.0-nightly.20220111","18.0.0-nightly.20220112","18.0.0-nightly.20220113","18.0.0-nightly.20220114","18.0.0-nightly.20220117","18.0.0-nightly.20220118","18.0.0-nightly.20220119","18.0.0-nightly.20220121","18.0.0-nightly.20220124","18.0.0-nightly.20220125","18.0.0-nightly.20220127","18.0.0-nightly.20220128","18.0.0-nightly.20220131","18.0.0-nightly.20220201","19.0.0-nightly.20220202","19.0.0-nightly.20220203","19.0.0-nightly.20220204","19.0.0-nightly.20220207","19.0.0-nightly.20220208","19.0.0-nightly.20220209"],"100.0.4894.0":["18.0.0-beta.1","18.0.0-beta.2","18.0.0-beta.3","18.0.0-beta.4","18.0.0-beta.5","18.0.0-beta.6","19.0.0-nightly.20220308","19.0.0-nightly.20220309","19.0.0-nightly.20220310","19.0.0-nightly.20220311","19.0.0-nightly.20220314","19.0.0-nightly.20220315","19.0.0-nightly.20220316","19.0.0-nightly.20220317","19.0.0-nightly.20220318","19.0.0-nightly.20220321","19.0.0-nightly.20220322","19.0.0-nightly.20220323","19.0.0-nightly.20220324"],"100.0.4896.56":["18.0.0"],"100.0.4896.60":["18.0.1","18.0.2"],"100.0.4896.75":["18.0.3","18.0.4"],"100.0.4896.127":["18.1.0"],"100.0.4896.143":["18.2.0","18.2.1","18.2.2","18.2.3"],"100.0.4896.160":["18.2.4","18.3.0","18.3.1","18.3.2","18.3.3","18.3.4","18.3.5","18.3.6","18.3.7","18.3.8","18.3.9","18.3.11","18.3.12","18.3.13","18.3.14","18.3.15"],"102.0.4962.3":["19.0.0-alpha.1","19.0.0-nightly.20220328","19.0.0-nightly.20220329","20.0.0-nightly.20220330"],"102.0.4971.0":["19.0.0-alpha.2","19.0.0-alpha.3","20.0.0-nightly.20220411"],"102.0.4989.0":["19.0.0-alpha.4","19.0.0-alpha.5","20.0.0-nightly.20220414","20.0.0-nightly.20220415","20.0.0-nightly.20220418","20.0.0-nightly.20220419","20.0.0-nightly.20220420","20.0.0-nightly.20220421"],"102.0.4999.0":["19.0.0-beta.1","19.0.0-beta.2","19.0.0-beta.3","20.0.0-nightly.20220425","20.0.0-nightly.20220426","20.0.0-nightly.20220427","20.0.0-nightly.20220428","20.0.0-nightly.20220429","20.0.0-nightly.20220502","20.0.0-nightly.20220503","20.0.0-nightly.20220504","20.0.0-nightly.20220505","20.0.0-nightly.20220506","20.0.0-nightly.20220509","20.0.0-nightly.20220511","20.0.0-nightly.20220512","20.0.0-nightly.20220513","20.0.0-nightly.20220516","20.0.0-nightly.20220517"],"102.0.5005.27":["19.0.0-beta.4"],"102.0.5005.40":["19.0.0-beta.5","19.0.0-beta.6","19.0.0-beta.7"],"102.0.5005.49":["19.0.0-beta.8"],"102.0.4961.0":["19.0.0-nightly.20220325"],"102.0.5005.61":["19.0.0","19.0.1"],"102.0.5005.63":["19.0.2","19.0.3","19.0.4"],"102.0.5005.115":["19.0.5","19.0.6"],"102.0.5005.134":["19.0.7"],"102.0.5005.148":["19.0.8"],"102.0.5005.167":["19.0.9","19.0.10","19.0.11","19.0.12","19.0.13","19.0.14","19.0.15","19.0.16","19.0.17","19.1.0","19.1.1","19.1.2","19.1.3","19.1.4","19.1.5","19.1.6","19.1.7","19.1.8","19.1.9"],"103.0.5044.0":["20.0.0-alpha.1","20.0.0-nightly.20220518","20.0.0-nightly.20220519","20.0.0-nightly.20220520","20.0.0-nightly.20220523","20.0.0-nightly.20220524","21.0.0-nightly.20220526","21.0.0-nightly.20220527","21.0.0-nightly.20220530","21.0.0-nightly.20220531"],"104.0.5073.0":["20.0.0-alpha.2","20.0.0-alpha.3","20.0.0-alpha.4","20.0.0-alpha.5","20.0.0-alpha.6","20.0.0-alpha.7","20.0.0-beta.1","20.0.0-beta.2","20.0.0-beta.3","20.0.0-beta.4","20.0.0-beta.5","20.0.0-beta.6","20.0.0-beta.7","20.0.0-beta.8","21.0.0-nightly.20220602","21.0.0-nightly.20220603","21.0.0-nightly.20220606","21.0.0-nightly.20220607","21.0.0-nightly.20220608","21.0.0-nightly.20220609","21.0.0-nightly.20220610","21.0.0-nightly.20220613","21.0.0-nightly.20220614","21.0.0-nightly.20220615","21.0.0-nightly.20220616","21.0.0-nightly.20220617","21.0.0-nightly.20220620","21.0.0-nightly.20220621","21.0.0-nightly.20220622","21.0.0-nightly.20220623","21.0.0-nightly.20220624","21.0.0-nightly.20220627"],"104.0.5112.39":["20.0.0-beta.9"],"104.0.5112.48":["20.0.0-beta.10","20.0.0-beta.11","20.0.0-beta.12"],"104.0.5112.57":["20.0.0-beta.13"],"104.0.5112.65":["20.0.0"],"104.0.5112.81":["20.0.1","20.0.2","20.0.3"],"104.0.5112.102":["20.1.0","20.1.1"],"104.0.5112.114":["20.1.2","20.1.3","20.1.4"],"104.0.5112.124":["20.2.0","20.3.0","20.3.1","20.3.2","20.3.3","20.3.4","20.3.5","20.3.6","20.3.7","20.3.8","20.3.9","20.3.10","20.3.11","20.3.12"],"105.0.5187.0":["21.0.0-alpha.1","21.0.0-alpha.2","21.0.0-alpha.3","21.0.0-alpha.4","21.0.0-alpha.5","21.0.0-nightly.20220720","21.0.0-nightly.20220721","21.0.0-nightly.20220722","21.0.0-nightly.20220725","21.0.0-nightly.20220726","21.0.0-nightly.20220727","21.0.0-nightly.20220728","21.0.0-nightly.20220801","21.0.0-nightly.20220802","22.0.0-nightly.20220808","22.0.0-nightly.20220809","22.0.0-nightly.20220810","22.0.0-nightly.20220811","22.0.0-nightly.20220812","22.0.0-nightly.20220815","22.0.0-nightly.20220816","22.0.0-nightly.20220817"],"106.0.5216.0":["21.0.0-alpha.6","21.0.0-beta.1","21.0.0-beta.2","21.0.0-beta.3","21.0.0-beta.4","21.0.0-beta.5","22.0.0-nightly.20220822","22.0.0-nightly.20220823","22.0.0-nightly.20220824","22.0.0-nightly.20220825","22.0.0-nightly.20220829","22.0.0-nightly.20220830","22.0.0-nightly.20220831","22.0.0-nightly.20220901","22.0.0-nightly.20220902","22.0.0-nightly.20220905"],"106.0.5249.40":["21.0.0-beta.6","21.0.0-beta.7","21.0.0-beta.8"],"105.0.5129.0":["21.0.0-nightly.20220628","21.0.0-nightly.20220629","21.0.0-nightly.20220630","21.0.0-nightly.20220701","21.0.0-nightly.20220704","21.0.0-nightly.20220705","21.0.0-nightly.20220706","21.0.0-nightly.20220707","21.0.0-nightly.20220708","21.0.0-nightly.20220711","21.0.0-nightly.20220712","21.0.0-nightly.20220713"],"105.0.5173.0":["21.0.0-nightly.20220715","21.0.0-nightly.20220718","21.0.0-nightly.20220719"],"106.0.5249.51":["21.0.0"],"106.0.5249.61":["21.0.1"],"106.0.5249.91":["21.1.0"],"106.0.5249.103":["21.1.1"],"106.0.5249.119":["21.2.0"],"106.0.5249.165":["21.2.1"],"106.0.5249.168":["21.2.2","21.2.3"],"106.0.5249.181":["21.3.0","21.3.1"],"106.0.5249.199":["21.3.3","21.3.4","21.3.5","21.4.0","21.4.1","21.4.2","21.4.3","21.4.4"],"107.0.5286.0":["22.0.0-alpha.1","22.0.0-nightly.20220909","22.0.0-nightly.20220912","22.0.0-nightly.20220913","22.0.0-nightly.20220914","22.0.0-nightly.20220915","22.0.0-nightly.20220916","22.0.0-nightly.20220919","22.0.0-nightly.20220920","22.0.0-nightly.20220921","22.0.0-nightly.20220922","22.0.0-nightly.20220923","22.0.0-nightly.20220926","22.0.0-nightly.20220927","22.0.0-nightly.20220928","23.0.0-nightly.20220929","23.0.0-nightly.20220930","23.0.0-nightly.20221003"],"108.0.5329.0":["22.0.0-alpha.3","22.0.0-alpha.4","22.0.0-alpha.5","22.0.0-alpha.6","23.0.0-nightly.20221004","23.0.0-nightly.20221005","23.0.0-nightly.20221006","23.0.0-nightly.20221007","23.0.0-nightly.20221010","23.0.0-nightly.20221011","23.0.0-nightly.20221012","23.0.0-nightly.20221013","23.0.0-nightly.20221014","23.0.0-nightly.20221017"],"108.0.5355.0":["22.0.0-alpha.7","23.0.0-nightly.20221018","23.0.0-nightly.20221019","23.0.0-nightly.20221020","23.0.0-nightly.20221021","23.0.0-nightly.20221024","23.0.0-nightly.20221026"],"108.0.5359.10":["22.0.0-alpha.8","22.0.0-beta.1","22.0.0-beta.2","22.0.0-beta.3"],"108.0.5359.29":["22.0.0-beta.4"],"108.0.5359.40":["22.0.0-beta.5","22.0.0-beta.6"],"108.0.5359.48":["22.0.0-beta.7","22.0.0-beta.8"],"107.0.5274.0":["22.0.0-nightly.20220908"],"108.0.5359.62":["22.0.0"],"108.0.5359.125":["22.0.1"],"108.0.5359.179":["22.0.2","22.0.3","22.1.0"],"108.0.5359.215":["22.2.0","22.2.1","22.3.0","22.3.1","22.3.2","22.3.3","22.3.4","22.3.5","22.3.6","22.3.7","22.3.8","22.3.9","22.3.10","22.3.11","22.3.12","22.3.13","22.3.14","22.3.15","22.3.16","22.3.17","22.3.18","22.3.20","22.3.21","22.3.22","22.3.23","22.3.24","22.3.25","22.3.26","22.3.27"],"110.0.5415.0":["23.0.0-alpha.1","23.0.0-nightly.20221118","23.0.0-nightly.20221121","23.0.0-nightly.20221122","23.0.0-nightly.20221123","23.0.0-nightly.20221124","23.0.0-nightly.20221125","23.0.0-nightly.20221128","23.0.0-nightly.20221129","23.0.0-nightly.20221130","24.0.0-nightly.20221201","24.0.0-nightly.20221202","24.0.0-nightly.20221205"],"110.0.5451.0":["23.0.0-alpha.2","23.0.0-alpha.3","24.0.0-nightly.20221206","24.0.0-nightly.20221207","24.0.0-nightly.20221208","24.0.0-nightly.20221213","24.0.0-nightly.20221214","24.0.0-nightly.20221215","24.0.0-nightly.20221216"],"110.0.5478.5":["23.0.0-beta.1","23.0.0-beta.2","23.0.0-beta.3"],"110.0.5481.30":["23.0.0-beta.4"],"110.0.5481.38":["23.0.0-beta.5"],"110.0.5481.52":["23.0.0-beta.6","23.0.0-beta.8"],"109.0.5382.0":["23.0.0-nightly.20221027","23.0.0-nightly.20221028","23.0.0-nightly.20221031","23.0.0-nightly.20221101","23.0.0-nightly.20221102","23.0.0-nightly.20221103","23.0.0-nightly.20221104","23.0.0-nightly.20221107","23.0.0-nightly.20221108","23.0.0-nightly.20221109","23.0.0-nightly.20221110","23.0.0-nightly.20221111","23.0.0-nightly.20221114","23.0.0-nightly.20221115","23.0.0-nightly.20221116","23.0.0-nightly.20221117"],"110.0.5481.77":["23.0.0"],"110.0.5481.100":["23.1.0"],"110.0.5481.104":["23.1.1"],"110.0.5481.177":["23.1.2"],"110.0.5481.179":["23.1.3"],"110.0.5481.192":["23.1.4","23.2.0"],"110.0.5481.208":["23.2.1","23.2.2","23.2.3","23.2.4","23.3.0","23.3.1","23.3.2","23.3.3","23.3.4","23.3.5","23.3.6","23.3.7","23.3.8","23.3.9","23.3.10","23.3.11","23.3.12","23.3.13"],"111.0.5560.0":["24.0.0-alpha.1","24.0.0-alpha.2","24.0.0-alpha.3","24.0.0-alpha.4","24.0.0-alpha.5","24.0.0-alpha.6","24.0.0-alpha.7","24.0.0-nightly.20230203","24.0.0-nightly.20230206","24.0.0-nightly.20230207","24.0.0-nightly.20230208","24.0.0-nightly.20230209","25.0.0-nightly.20230210","25.0.0-nightly.20230214","25.0.0-nightly.20230215","25.0.0-nightly.20230216","25.0.0-nightly.20230217","25.0.0-nightly.20230220","25.0.0-nightly.20230221","25.0.0-nightly.20230222","25.0.0-nightly.20230223","25.0.0-nightly.20230224","25.0.0-nightly.20230227","25.0.0-nightly.20230228","25.0.0-nightly.20230301","25.0.0-nightly.20230302","25.0.0-nightly.20230303","25.0.0-nightly.20230306","25.0.0-nightly.20230307","25.0.0-nightly.20230308","25.0.0-nightly.20230309","25.0.0-nightly.20230310"],"111.0.5563.50":["24.0.0-beta.1","24.0.0-beta.2"],"112.0.5615.20":["24.0.0-beta.3","24.0.0-beta.4"],"112.0.5615.29":["24.0.0-beta.5"],"112.0.5615.39":["24.0.0-beta.6","24.0.0-beta.7"],"111.0.5518.0":["24.0.0-nightly.20230109","24.0.0-nightly.20230110","24.0.0-nightly.20230111","24.0.0-nightly.20230112","24.0.0-nightly.20230113","24.0.0-nightly.20230116","24.0.0-nightly.20230117","24.0.0-nightly.20230118","24.0.0-nightly.20230119","24.0.0-nightly.20230120","24.0.0-nightly.20230123","24.0.0-nightly.20230124","24.0.0-nightly.20230125","24.0.0-nightly.20230126","24.0.0-nightly.20230127","24.0.0-nightly.20230131","24.0.0-nightly.20230201","24.0.0-nightly.20230202"],"112.0.5615.49":["24.0.0"],"112.0.5615.50":["24.1.0","24.1.1"],"112.0.5615.87":["24.1.2"],"112.0.5615.165":["24.1.3","24.2.0","24.3.0"],"112.0.5615.183":["24.3.1"],"112.0.5615.204":["24.4.0","24.4.1","24.5.0","24.5.1","24.6.0","24.6.1","24.6.2","24.6.3","24.6.4","24.6.5","24.7.0","24.7.1","24.8.0","24.8.1","24.8.2","24.8.3","24.8.4","24.8.5","24.8.6","24.8.7","24.8.8"],"114.0.5694.0":["25.0.0-alpha.1","25.0.0-alpha.2","25.0.0-nightly.20230405","26.0.0-nightly.20230406","26.0.0-nightly.20230407","26.0.0-nightly.20230410","26.0.0-nightly.20230411"],"114.0.5710.0":["25.0.0-alpha.3","25.0.0-alpha.4","26.0.0-nightly.20230413","26.0.0-nightly.20230414","26.0.0-nightly.20230417"],"114.0.5719.0":["25.0.0-alpha.5","25.0.0-alpha.6","25.0.0-beta.1","25.0.0-beta.2","25.0.0-beta.3","26.0.0-nightly.20230421","26.0.0-nightly.20230424","26.0.0-nightly.20230425","26.0.0-nightly.20230426","26.0.0-nightly.20230427","26.0.0-nightly.20230428","26.0.0-nightly.20230501","26.0.0-nightly.20230502","26.0.0-nightly.20230503","26.0.0-nightly.20230504","26.0.0-nightly.20230505","26.0.0-nightly.20230508","26.0.0-nightly.20230509","26.0.0-nightly.20230510"],"114.0.5735.16":["25.0.0-beta.4","25.0.0-beta.5","25.0.0-beta.6","25.0.0-beta.7"],"114.0.5735.35":["25.0.0-beta.8"],"114.0.5735.45":["25.0.0-beta.9","25.0.0","25.0.1"],"113.0.5636.0":["25.0.0-nightly.20230314"],"113.0.5651.0":["25.0.0-nightly.20230315"],"113.0.5653.0":["25.0.0-nightly.20230317"],"113.0.5660.0":["25.0.0-nightly.20230320"],"113.0.5664.0":["25.0.0-nightly.20230321"],"113.0.5666.0":["25.0.0-nightly.20230322"],"113.0.5668.0":["25.0.0-nightly.20230323"],"113.0.5670.0":["25.0.0-nightly.20230324","25.0.0-nightly.20230327","25.0.0-nightly.20230328","25.0.0-nightly.20230329","25.0.0-nightly.20230330"],"114.0.5684.0":["25.0.0-nightly.20230331","25.0.0-nightly.20230403"],"114.0.5692.0":["25.0.0-nightly.20230404"],"114.0.5735.106":["25.1.0","25.1.1"],"114.0.5735.134":["25.2.0"],"114.0.5735.199":["25.3.0"],"114.0.5735.243":["25.3.1"],"114.0.5735.248":["25.3.2","25.4.0"],"114.0.5735.289":["25.5.0","25.6.0","25.7.0","25.8.0","25.8.1","25.8.2","25.8.3","25.8.4","25.9.0","25.9.1","25.9.2","25.9.3","25.9.4","25.9.5","25.9.6","25.9.7","25.9.8"],"116.0.5791.0":["26.0.0-alpha.1","26.0.0-alpha.2","26.0.0-alpha.3","26.0.0-alpha.4","26.0.0-alpha.5","26.0.0-nightly.20230526","26.0.0-nightly.20230529","26.0.0-nightly.20230530","26.0.0-nightly.20230531","27.0.0-nightly.20230601","27.0.0-nightly.20230602","27.0.0-nightly.20230605","27.0.0-nightly.20230606","27.0.0-nightly.20230607","27.0.0-nightly.20230609"],"116.0.5815.0":["26.0.0-alpha.6","27.0.0-nightly.20230612","27.0.0-nightly.20230613"],"116.0.5831.0":["26.0.0-alpha.7","27.0.0-nightly.20230615"],"116.0.5845.0":["26.0.0-alpha.8","26.0.0-beta.1","27.0.0-nightly.20230622","27.0.0-nightly.20230623","27.0.0-nightly.20230626","27.0.0-nightly.20230627","27.0.0-nightly.20230628","27.0.0-nightly.20230629","27.0.0-nightly.20230630"],"116.0.5845.14":["26.0.0-beta.2","26.0.0-beta.3","26.0.0-beta.4","26.0.0-beta.5","26.0.0-beta.6","26.0.0-beta.7"],"116.0.5845.42":["26.0.0-beta.8","26.0.0-beta.9"],"116.0.5845.49":["26.0.0-beta.10","26.0.0-beta.11"],"116.0.5845.62":["26.0.0-beta.12"],"114.0.5708.0":["26.0.0-nightly.20230412"],"114.0.5715.0":["26.0.0-nightly.20230418"],"115.0.5760.0":["26.0.0-nightly.20230511","26.0.0-nightly.20230512","26.0.0-nightly.20230515","26.0.0-nightly.20230516","26.0.0-nightly.20230517","26.0.0-nightly.20230518","26.0.0-nightly.20230519","26.0.0-nightly.20230522","26.0.0-nightly.20230523"],"115.0.5786.0":["26.0.0-nightly.20230524"],"115.0.5790.0":["26.0.0-nightly.20230525"],"116.0.5845.82":["26.0.0"],"116.0.5845.97":["26.1.0"],"116.0.5845.179":["26.2.0"],"116.0.5845.188":["26.2.1"],"116.0.5845.190":["26.2.2","26.2.3","26.2.4"],"116.0.5845.228":["26.3.0","26.4.0","26.4.1","26.4.2","26.4.3","26.5.0","26.6.0","26.6.1","26.6.2"],"118.0.5949.0":["27.0.0-alpha.1","27.0.0-alpha.2","27.0.0-alpha.3","27.0.0-alpha.4","27.0.0-alpha.5","27.0.0-alpha.6","27.0.0-nightly.20230816","28.0.0-nightly.20230817","28.0.0-nightly.20230818","28.0.0-nightly.20230821","28.0.0-nightly.20230822","28.0.0-nightly.20230823","28.0.0-nightly.20230824","28.0.0-nightly.20230825","28.0.0-nightly.20230828","28.0.0-nightly.20230829","28.0.0-nightly.20230830","28.0.0-nightly.20230831"],"118.0.5993.5":["27.0.0-beta.1","27.0.0-beta.2","27.0.0-beta.3"],"118.0.5993.11":["27.0.0-beta.4"],"118.0.5993.18":["27.0.0-beta.5","27.0.0-beta.6","27.0.0-beta.7","27.0.0-beta.8","27.0.0-beta.9"],"116.0.5829.0":["27.0.0-nightly.20230614"],"116.0.5833.0":["27.0.0-nightly.20230616","27.0.0-nightly.20230619","27.0.0-nightly.20230620","27.0.0-nightly.20230621"],"117.0.5852.0":["27.0.0-nightly.20230703","27.0.0-nightly.20230704","27.0.0-nightly.20230705","27.0.0-nightly.20230706","27.0.0-nightly.20230707","27.0.0-nightly.20230710","27.0.0-nightly.20230711","27.0.0-nightly.20230712","27.0.0-nightly.20230713","27.0.0-nightly.20230714"],"117.0.5884.1":["27.0.0-nightly.20230717","27.0.0-nightly.20230718"],"117.0.5892.0":["27.0.0-nightly.20230719"],"117.0.5897.0":["27.0.0-nightly.20230720","27.0.0-nightly.20230721","27.0.0-nightly.20230724","27.0.0-nightly.20230725","27.0.0-nightly.20230726","27.0.0-nightly.20230727","27.0.0-nightly.20230728","27.0.0-nightly.20230731"],"117.0.5911.0":["27.0.0-nightly.20230801","27.0.0-nightly.20230802","27.0.0-nightly.20230803"],"117.0.5921.0":["27.0.0-nightly.20230804","27.0.0-nightly.20230807","27.0.0-nightly.20230808","27.0.0-nightly.20230814","27.0.0-nightly.20230815"],"118.0.5993.54":["27.0.0"],"118.0.5993.89":["27.0.1","27.0.2"],"118.0.5993.120":["27.0.3"],"118.0.5993.129":["27.0.4"],"118.0.5993.144":["27.1.0","27.1.2"],"118.0.5993.159":["27.1.3"],"119.0.6045.0":["28.0.0-alpha.1","28.0.0-alpha.2","28.0.0-nightly.20231006","28.0.0-nightly.20231009","28.0.0-nightly.20231010","28.0.0-nightly.20231011","29.0.0-nightly.20231012","29.0.0-nightly.20231013","29.0.0-nightly.20231016","29.0.0-nightly.20231017","29.0.0-nightly.20231018","29.0.0-nightly.20231019","29.0.0-nightly.20231020","29.0.0-nightly.20231023","29.0.0-nightly.20231024"],"119.0.6045.21":["28.0.0-alpha.3","28.0.0-alpha.4"],"119.0.6045.33":["28.0.0-alpha.5","28.0.0-alpha.6","28.0.0-alpha.7","28.0.0-beta.1"],"120.0.6099.0":["28.0.0-beta.2"],"120.0.6099.5":["28.0.0-beta.3","28.0.0-beta.4"],"120.0.6099.18":["28.0.0-beta.5","28.0.0-beta.6","28.0.0-beta.7","28.0.0-beta.8","28.0.0-beta.9","28.0.0-beta.10"],"120.0.6099.35":["28.0.0-beta.11"],"118.0.5991.0":["28.0.0-nightly.20230906"],"118.0.5993.0":["28.0.0-nightly.20230907","28.0.0-nightly.20230908","28.0.0-nightly.20230911","28.0.0-nightly.20230912","28.0.0-nightly.20230913","28.0.0-nightly.20230914","28.0.0-nightly.20230915"],"119.0.6006.0":["28.0.0-nightly.20230919"],"119.0.6017.0":["28.0.0-nightly.20230920"],"119.0.6019.2":["28.0.0-nightly.20230921","28.0.0-nightly.20230925","28.0.0-nightly.20230926","28.0.0-nightly.20230927","28.0.0-nightly.20230928"],"119.0.6029.0":["28.0.0-nightly.20230929","28.0.0-nightly.20231002"],"119.0.6043.0":["28.0.0-nightly.20231003","28.0.0-nightly.20231004","28.0.0-nightly.20231005"],"120.0.6099.56":["28.0.0"],"121.0.6147.0":["29.0.0-alpha.1","29.0.0-alpha.2","29.0.0-alpha.3","29.0.0-nightly.20231129","29.0.0-nightly.20231130","29.0.0-nightly.20231201","29.0.0-nightly.20231204","29.0.0-nightly.20231205","29.0.0-nightly.20231206","30.0.0-nightly.20231207","30.0.0-nightly.20231208","30.0.0-nightly.20231211"],"121.0.6159.0":["29.0.0-alpha.4","30.0.0-nightly.20231212","30.0.0-nightly.20231213","30.0.0-nightly.20231214","30.0.0-nightly.20231215"],"120.0.6078.0":["29.0.0-nightly.20231025","29.0.0-nightly.20231026","29.0.0-nightly.20231027","29.0.0-nightly.20231030","29.0.0-nightly.20231031","29.0.0-nightly.20231101"],"121.0.6100.0":["29.0.0-nightly.20231102","29.0.0-nightly.20231103"],"121.0.6104.0":["29.0.0-nightly.20231106"],"121.0.6110.0":["29.0.0-nightly.20231107","29.0.0-nightly.20231108","29.0.0-nightly.20231109","29.0.0-nightly.20231110","29.0.0-nightly.20231113","29.0.0-nightly.20231114"],"121.0.6116.0":["29.0.0-nightly.20231115","29.0.0-nightly.20231116","29.0.0-nightly.20231117","29.0.0-nightly.20231120","29.0.0-nightly.20231121","29.0.0-nightly.20231122","29.0.0-nightly.20231123","29.0.0-nightly.20231124","29.0.0-nightly.20231127","29.0.0-nightly.20231128"]}
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/electron-to-chromium/full-versions.js b/tools/node_modules/eslint/node_modules/electron-to-chromium/full-versions.js
    index 04e5b3066cbf2d..450f1b9b052452 100644
    --- a/tools/node_modules/eslint/node_modules/electron-to-chromium/full-versions.js
    +++ b/tools/node_modules/eslint/node_modules/electron-to-chromium/full-versions.js
    @@ -1846,6 +1846,7 @@ module.exports = {
     	"24.8.5": "112.0.5615.204",
     	"24.8.6": "112.0.5615.204",
     	"24.8.7": "112.0.5615.204",
    +	"24.8.8": "112.0.5615.204",
     	"25.0.0-alpha.1": "114.0.5694.0",
     	"25.0.0-alpha.2": "114.0.5694.0",
     	"25.0.0-alpha.3": "114.0.5710.0",
    @@ -1915,6 +1916,14 @@ module.exports = {
     	"25.8.3": "114.0.5735.289",
     	"25.8.4": "114.0.5735.289",
     	"25.9.0": "114.0.5735.289",
    +	"25.9.1": "114.0.5735.289",
    +	"25.9.2": "114.0.5735.289",
    +	"25.9.3": "114.0.5735.289",
    +	"25.9.4": "114.0.5735.289",
    +	"25.9.5": "114.0.5735.289",
    +	"25.9.6": "114.0.5735.289",
    +	"25.9.7": "114.0.5735.289",
    +	"25.9.8": "114.0.5735.289",
     	"26.0.0-alpha.1": "116.0.5791.0",
     	"26.0.0-alpha.2": "116.0.5791.0",
     	"26.0.0-alpha.3": "116.0.5791.0",
    @@ -1981,6 +1990,14 @@ module.exports = {
     	"26.2.3": "116.0.5845.190",
     	"26.2.4": "116.0.5845.190",
     	"26.3.0": "116.0.5845.228",
    +	"26.4.0": "116.0.5845.228",
    +	"26.4.1": "116.0.5845.228",
    +	"26.4.2": "116.0.5845.228",
    +	"26.4.3": "116.0.5845.228",
    +	"26.5.0": "116.0.5845.228",
    +	"26.6.0": "116.0.5845.228",
    +	"26.6.1": "116.0.5845.228",
    +	"26.6.2": "116.0.5845.228",
     	"27.0.0-alpha.1": "118.0.5949.0",
     	"27.0.0-alpha.2": "118.0.5949.0",
     	"27.0.0-alpha.3": "118.0.5949.0",
    @@ -2048,6 +2065,31 @@ module.exports = {
     	"27.0.0-nightly.20230815": "117.0.5921.0",
     	"27.0.0-nightly.20230816": "118.0.5949.0",
     	"27.0.0": "118.0.5993.54",
    +	"27.0.1": "118.0.5993.89",
    +	"27.0.2": "118.0.5993.89",
    +	"27.0.3": "118.0.5993.120",
    +	"27.0.4": "118.0.5993.129",
    +	"27.1.0": "118.0.5993.144",
    +	"27.1.2": "118.0.5993.144",
    +	"27.1.3": "118.0.5993.159",
    +	"28.0.0-alpha.1": "119.0.6045.0",
    +	"28.0.0-alpha.2": "119.0.6045.0",
    +	"28.0.0-alpha.3": "119.0.6045.21",
    +	"28.0.0-alpha.4": "119.0.6045.21",
    +	"28.0.0-alpha.5": "119.0.6045.33",
    +	"28.0.0-alpha.6": "119.0.6045.33",
    +	"28.0.0-alpha.7": "119.0.6045.33",
    +	"28.0.0-beta.1": "119.0.6045.33",
    +	"28.0.0-beta.2": "120.0.6099.0",
    +	"28.0.0-beta.3": "120.0.6099.5",
    +	"28.0.0-beta.4": "120.0.6099.5",
    +	"28.0.0-beta.5": "120.0.6099.18",
    +	"28.0.0-beta.6": "120.0.6099.18",
    +	"28.0.0-beta.7": "120.0.6099.18",
    +	"28.0.0-beta.8": "120.0.6099.18",
    +	"28.0.0-beta.9": "120.0.6099.18",
    +	"28.0.0-beta.10": "120.0.6099.18",
    +	"28.0.0-beta.11": "120.0.6099.35",
     	"28.0.0-nightly.20230817": "118.0.5949.0",
     	"28.0.0-nightly.20230818": "118.0.5949.0",
     	"28.0.0-nightly.20230821": "118.0.5949.0",
    @@ -2081,5 +2123,58 @@ module.exports = {
     	"28.0.0-nightly.20231005": "119.0.6043.0",
     	"28.0.0-nightly.20231006": "119.0.6045.0",
     	"28.0.0-nightly.20231009": "119.0.6045.0",
    -	"28.0.0-nightly.20231010": "119.0.6045.0"
    +	"28.0.0-nightly.20231010": "119.0.6045.0",
    +	"28.0.0-nightly.20231011": "119.0.6045.0",
    +	"28.0.0": "120.0.6099.56",
    +	"29.0.0-alpha.1": "121.0.6147.0",
    +	"29.0.0-alpha.2": "121.0.6147.0",
    +	"29.0.0-alpha.3": "121.0.6147.0",
    +	"29.0.0-alpha.4": "121.0.6159.0",
    +	"29.0.0-nightly.20231012": "119.0.6045.0",
    +	"29.0.0-nightly.20231013": "119.0.6045.0",
    +	"29.0.0-nightly.20231016": "119.0.6045.0",
    +	"29.0.0-nightly.20231017": "119.0.6045.0",
    +	"29.0.0-nightly.20231018": "119.0.6045.0",
    +	"29.0.0-nightly.20231019": "119.0.6045.0",
    +	"29.0.0-nightly.20231020": "119.0.6045.0",
    +	"29.0.0-nightly.20231023": "119.0.6045.0",
    +	"29.0.0-nightly.20231024": "119.0.6045.0",
    +	"29.0.0-nightly.20231025": "120.0.6078.0",
    +	"29.0.0-nightly.20231026": "120.0.6078.0",
    +	"29.0.0-nightly.20231027": "120.0.6078.0",
    +	"29.0.0-nightly.20231030": "120.0.6078.0",
    +	"29.0.0-nightly.20231031": "120.0.6078.0",
    +	"29.0.0-nightly.20231101": "120.0.6078.0",
    +	"29.0.0-nightly.20231102": "121.0.6100.0",
    +	"29.0.0-nightly.20231103": "121.0.6100.0",
    +	"29.0.0-nightly.20231106": "121.0.6104.0",
    +	"29.0.0-nightly.20231107": "121.0.6110.0",
    +	"29.0.0-nightly.20231108": "121.0.6110.0",
    +	"29.0.0-nightly.20231109": "121.0.6110.0",
    +	"29.0.0-nightly.20231110": "121.0.6110.0",
    +	"29.0.0-nightly.20231113": "121.0.6110.0",
    +	"29.0.0-nightly.20231114": "121.0.6110.0",
    +	"29.0.0-nightly.20231115": "121.0.6116.0",
    +	"29.0.0-nightly.20231116": "121.0.6116.0",
    +	"29.0.0-nightly.20231117": "121.0.6116.0",
    +	"29.0.0-nightly.20231120": "121.0.6116.0",
    +	"29.0.0-nightly.20231121": "121.0.6116.0",
    +	"29.0.0-nightly.20231122": "121.0.6116.0",
    +	"29.0.0-nightly.20231123": "121.0.6116.0",
    +	"29.0.0-nightly.20231124": "121.0.6116.0",
    +	"29.0.0-nightly.20231127": "121.0.6116.0",
    +	"29.0.0-nightly.20231128": "121.0.6116.0",
    +	"29.0.0-nightly.20231129": "121.0.6147.0",
    +	"29.0.0-nightly.20231130": "121.0.6147.0",
    +	"29.0.0-nightly.20231201": "121.0.6147.0",
    +	"29.0.0-nightly.20231204": "121.0.6147.0",
    +	"29.0.0-nightly.20231205": "121.0.6147.0",
    +	"29.0.0-nightly.20231206": "121.0.6147.0",
    +	"30.0.0-nightly.20231207": "121.0.6147.0",
    +	"30.0.0-nightly.20231208": "121.0.6147.0",
    +	"30.0.0-nightly.20231211": "121.0.6147.0",
    +	"30.0.0-nightly.20231212": "121.0.6159.0",
    +	"30.0.0-nightly.20231213": "121.0.6159.0",
    +	"30.0.0-nightly.20231214": "121.0.6159.0",
    +	"30.0.0-nightly.20231215": "121.0.6159.0"
     };
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/electron-to-chromium/full-versions.json b/tools/node_modules/eslint/node_modules/electron-to-chromium/full-versions.json
    index 8ab3c302f7726b..f700bba8fe8593 100644
    --- a/tools/node_modules/eslint/node_modules/electron-to-chromium/full-versions.json
    +++ b/tools/node_modules/eslint/node_modules/electron-to-chromium/full-versions.json
    @@ -1 +1 @@
    -{"0.20.0":"39.0.2171.65","0.20.1":"39.0.2171.65","0.20.2":"39.0.2171.65","0.20.3":"39.0.2171.65","0.20.4":"39.0.2171.65","0.20.5":"39.0.2171.65","0.20.6":"39.0.2171.65","0.20.7":"39.0.2171.65","0.20.8":"39.0.2171.65","0.21.0":"40.0.2214.91","0.21.1":"40.0.2214.91","0.21.2":"40.0.2214.91","0.21.3":"41.0.2272.76","0.22.1":"41.0.2272.76","0.22.2":"41.0.2272.76","0.22.3":"41.0.2272.76","0.23.0":"41.0.2272.76","0.24.0":"41.0.2272.76","0.25.0":"42.0.2311.107","0.25.1":"42.0.2311.107","0.25.2":"42.0.2311.107","0.25.3":"42.0.2311.107","0.26.0":"42.0.2311.107","0.26.1":"42.0.2311.107","0.27.0":"42.0.2311.107","0.27.1":"42.0.2311.107","0.27.2":"43.0.2357.65","0.27.3":"43.0.2357.65","0.28.0":"43.0.2357.65","0.28.1":"43.0.2357.65","0.28.2":"43.0.2357.65","0.28.3":"43.0.2357.65","0.29.1":"43.0.2357.65","0.29.2":"43.0.2357.65","0.30.4":"44.0.2403.125","0.31.0":"44.0.2403.125","0.31.2":"45.0.2454.85","0.32.2":"45.0.2454.85","0.32.3":"45.0.2454.85","0.33.0":"45.0.2454.85","0.33.1":"45.0.2454.85","0.33.2":"45.0.2454.85","0.33.3":"45.0.2454.85","0.33.4":"45.0.2454.85","0.33.6":"45.0.2454.85","0.33.7":"45.0.2454.85","0.33.8":"45.0.2454.85","0.33.9":"45.0.2454.85","0.34.0":"45.0.2454.85","0.34.1":"45.0.2454.85","0.34.2":"45.0.2454.85","0.34.3":"45.0.2454.85","0.34.4":"45.0.2454.85","0.35.1":"45.0.2454.85","0.35.2":"45.0.2454.85","0.35.3":"45.0.2454.85","0.35.4":"45.0.2454.85","0.35.5":"45.0.2454.85","0.36.0":"47.0.2526.73","0.36.2":"47.0.2526.73","0.36.3":"47.0.2526.73","0.36.4":"47.0.2526.73","0.36.5":"47.0.2526.110","0.36.6":"47.0.2526.110","0.36.7":"47.0.2526.110","0.36.8":"47.0.2526.110","0.36.9":"47.0.2526.110","0.36.10":"47.0.2526.110","0.36.11":"47.0.2526.110","0.36.12":"47.0.2526.110","0.37.0":"49.0.2623.75","0.37.1":"49.0.2623.75","0.37.3":"49.0.2623.75","0.37.4":"49.0.2623.75","0.37.5":"49.0.2623.75","0.37.6":"49.0.2623.75","0.37.7":"49.0.2623.75","0.37.8":"49.0.2623.75","1.0.0":"49.0.2623.75","1.0.1":"49.0.2623.75","1.0.2":"49.0.2623.75","1.1.0":"50.0.2661.102","1.1.1":"50.0.2661.102","1.1.2":"50.0.2661.102","1.1.3":"50.0.2661.102","1.2.0":"51.0.2704.63","1.2.1":"51.0.2704.63","1.2.2":"51.0.2704.84","1.2.3":"51.0.2704.84","1.2.4":"51.0.2704.103","1.2.5":"51.0.2704.103","1.2.6":"51.0.2704.106","1.2.7":"51.0.2704.106","1.2.8":"51.0.2704.106","1.3.0":"52.0.2743.82","1.3.1":"52.0.2743.82","1.3.2":"52.0.2743.82","1.3.3":"52.0.2743.82","1.3.4":"52.0.2743.82","1.3.5":"52.0.2743.82","1.3.6":"52.0.2743.82","1.3.7":"52.0.2743.82","1.3.9":"52.0.2743.82","1.3.10":"52.0.2743.82","1.3.13":"52.0.2743.82","1.3.14":"52.0.2743.82","1.3.15":"52.0.2743.82","1.4.0":"53.0.2785.113","1.4.1":"53.0.2785.113","1.4.2":"53.0.2785.113","1.4.3":"53.0.2785.113","1.4.4":"53.0.2785.113","1.4.5":"53.0.2785.113","1.4.6":"53.0.2785.143","1.4.7":"53.0.2785.143","1.4.8":"53.0.2785.143","1.4.10":"53.0.2785.143","1.4.11":"53.0.2785.143","1.4.12":"54.0.2840.51","1.4.13":"53.0.2785.143","1.4.14":"53.0.2785.143","1.4.15":"53.0.2785.143","1.4.16":"53.0.2785.143","1.5.0":"54.0.2840.101","1.5.1":"54.0.2840.101","1.6.0":"56.0.2924.87","1.6.1":"56.0.2924.87","1.6.2":"56.0.2924.87","1.6.3":"56.0.2924.87","1.6.4":"56.0.2924.87","1.6.5":"56.0.2924.87","1.6.6":"56.0.2924.87","1.6.7":"56.0.2924.87","1.6.8":"56.0.2924.87","1.6.9":"56.0.2924.87","1.6.10":"56.0.2924.87","1.6.11":"56.0.2924.87","1.6.12":"56.0.2924.87","1.6.13":"56.0.2924.87","1.6.14":"56.0.2924.87","1.6.15":"56.0.2924.87","1.6.16":"56.0.2924.87","1.6.17":"56.0.2924.87","1.6.18":"56.0.2924.87","1.7.0":"58.0.3029.110","1.7.1":"58.0.3029.110","1.7.2":"58.0.3029.110","1.7.3":"58.0.3029.110","1.7.4":"58.0.3029.110","1.7.5":"58.0.3029.110","1.7.6":"58.0.3029.110","1.7.7":"58.0.3029.110","1.7.8":"58.0.3029.110","1.7.9":"58.0.3029.110","1.7.10":"58.0.3029.110","1.7.11":"58.0.3029.110","1.7.12":"58.0.3029.110","1.7.13":"58.0.3029.110","1.7.14":"58.0.3029.110","1.7.15":"58.0.3029.110","1.7.16":"58.0.3029.110","1.8.0":"59.0.3071.115","1.8.1":"59.0.3071.115","1.8.2-beta.1":"59.0.3071.115","1.8.2-beta.2":"59.0.3071.115","1.8.2-beta.3":"59.0.3071.115","1.8.2-beta.4":"59.0.3071.115","1.8.2-beta.5":"59.0.3071.115","1.8.2":"59.0.3071.115","1.8.3":"59.0.3071.115","1.8.4":"59.0.3071.115","1.8.5":"59.0.3071.115","1.8.6":"59.0.3071.115","1.8.7":"59.0.3071.115","1.8.8":"59.0.3071.115","2.0.0-beta.1":"61.0.3163.100","2.0.0-beta.2":"61.0.3163.100","2.0.0-beta.3":"61.0.3163.100","2.0.0-beta.4":"61.0.3163.100","2.0.0-beta.5":"61.0.3163.100","2.0.0-beta.6":"61.0.3163.100","2.0.0-beta.7":"61.0.3163.100","2.0.0-beta.8":"61.0.3163.100","2.0.0":"61.0.3163.100","2.0.1":"61.0.3163.100","2.0.2":"61.0.3163.100","2.0.3":"61.0.3163.100","2.0.4":"61.0.3163.100","2.0.5":"61.0.3163.100","2.0.6":"61.0.3163.100","2.0.7":"61.0.3163.100","2.0.8-nightly.20180819":"61.0.3163.100","2.0.8-nightly.20180820":"61.0.3163.100","2.0.8":"61.0.3163.100","2.0.9":"61.0.3163.100","2.0.10":"61.0.3163.100","2.0.11":"61.0.3163.100","2.0.12":"61.0.3163.100","2.0.13":"61.0.3163.100","2.0.14":"61.0.3163.100","2.0.15":"61.0.3163.100","2.0.16":"61.0.3163.100","2.0.17":"61.0.3163.100","2.0.18":"61.0.3163.100","2.1.0-unsupported.20180809":"61.0.3163.100","3.0.0-beta.1":"66.0.3359.181","3.0.0-beta.2":"66.0.3359.181","3.0.0-beta.3":"66.0.3359.181","3.0.0-beta.4":"66.0.3359.181","3.0.0-beta.5":"66.0.3359.181","3.0.0-beta.6":"66.0.3359.181","3.0.0-beta.7":"66.0.3359.181","3.0.0-beta.8":"66.0.3359.181","3.0.0-beta.9":"66.0.3359.181","3.0.0-beta.10":"66.0.3359.181","3.0.0-beta.11":"66.0.3359.181","3.0.0-beta.12":"66.0.3359.181","3.0.0-beta.13":"66.0.3359.181","3.0.0-nightly.20180818":"66.0.3359.181","3.0.0-nightly.20180821":"66.0.3359.181","3.0.0-nightly.20180823":"66.0.3359.181","3.0.0-nightly.20180904":"66.0.3359.181","3.0.0":"66.0.3359.181","3.0.1":"66.0.3359.181","3.0.2":"66.0.3359.181","3.0.3":"66.0.3359.181","3.0.4":"66.0.3359.181","3.0.5":"66.0.3359.181","3.0.6":"66.0.3359.181","3.0.7":"66.0.3359.181","3.0.8":"66.0.3359.181","3.0.9":"66.0.3359.181","3.0.10":"66.0.3359.181","3.0.11":"66.0.3359.181","3.0.12":"66.0.3359.181","3.0.13":"66.0.3359.181","3.0.14":"66.0.3359.181","3.0.15":"66.0.3359.181","3.0.16":"66.0.3359.181","3.1.0-beta.1":"66.0.3359.181","3.1.0-beta.2":"66.0.3359.181","3.1.0-beta.3":"66.0.3359.181","3.1.0-beta.4":"66.0.3359.181","3.1.0-beta.5":"66.0.3359.181","3.1.0":"66.0.3359.181","3.1.1":"66.0.3359.181","3.1.2":"66.0.3359.181","3.1.3":"66.0.3359.181","3.1.4":"66.0.3359.181","3.1.5":"66.0.3359.181","3.1.6":"66.0.3359.181","3.1.7":"66.0.3359.181","3.1.8":"66.0.3359.181","3.1.9":"66.0.3359.181","3.1.10":"66.0.3359.181","3.1.11":"66.0.3359.181","3.1.12":"66.0.3359.181","3.1.13":"66.0.3359.181","4.0.0-beta.1":"69.0.3497.106","4.0.0-beta.2":"69.0.3497.106","4.0.0-beta.3":"69.0.3497.106","4.0.0-beta.4":"69.0.3497.106","4.0.0-beta.5":"69.0.3497.106","4.0.0-beta.6":"69.0.3497.106","4.0.0-beta.7":"69.0.3497.106","4.0.0-beta.8":"69.0.3497.106","4.0.0-beta.9":"69.0.3497.106","4.0.0-beta.10":"69.0.3497.106","4.0.0-beta.11":"69.0.3497.106","4.0.0-nightly.20180817":"66.0.3359.181","4.0.0-nightly.20180819":"66.0.3359.181","4.0.0-nightly.20180821":"66.0.3359.181","4.0.0-nightly.20180929":"67.0.3396.99","4.0.0-nightly.20181006":"68.0.3440.128","4.0.0-nightly.20181010":"69.0.3497.106","4.0.0":"69.0.3497.106","4.0.1":"69.0.3497.106","4.0.2":"69.0.3497.106","4.0.3":"69.0.3497.106","4.0.4":"69.0.3497.106","4.0.5":"69.0.3497.106","4.0.6":"69.0.3497.106","4.0.7":"69.0.3497.128","4.0.8":"69.0.3497.128","4.1.0":"69.0.3497.128","4.1.1":"69.0.3497.128","4.1.2":"69.0.3497.128","4.1.3":"69.0.3497.128","4.1.4":"69.0.3497.128","4.1.5":"69.0.3497.128","4.2.0":"69.0.3497.128","4.2.1":"69.0.3497.128","4.2.2":"69.0.3497.128","4.2.3":"69.0.3497.128","4.2.4":"69.0.3497.128","4.2.5":"69.0.3497.128","4.2.6":"69.0.3497.128","4.2.7":"69.0.3497.128","4.2.8":"69.0.3497.128","4.2.9":"69.0.3497.128","4.2.10":"69.0.3497.128","4.2.11":"69.0.3497.128","4.2.12":"69.0.3497.128","5.0.0-beta.1":"72.0.3626.52","5.0.0-beta.2":"72.0.3626.52","5.0.0-beta.3":"73.0.3683.27","5.0.0-beta.4":"73.0.3683.54","5.0.0-beta.5":"73.0.3683.61","5.0.0-beta.6":"73.0.3683.84","5.0.0-beta.7":"73.0.3683.94","5.0.0-beta.8":"73.0.3683.104","5.0.0-beta.9":"73.0.3683.117","5.0.0-nightly.20190107":"70.0.3538.110","5.0.0-nightly.20190121":"71.0.3578.98","5.0.0-nightly.20190122":"71.0.3578.98","5.0.0":"73.0.3683.119","5.0.1":"73.0.3683.121","5.0.2":"73.0.3683.121","5.0.3":"73.0.3683.121","5.0.4":"73.0.3683.121","5.0.5":"73.0.3683.121","5.0.6":"73.0.3683.121","5.0.7":"73.0.3683.121","5.0.8":"73.0.3683.121","5.0.9":"73.0.3683.121","5.0.10":"73.0.3683.121","5.0.11":"73.0.3683.121","5.0.12":"73.0.3683.121","5.0.13":"73.0.3683.121","6.0.0-beta.1":"76.0.3774.1","6.0.0-beta.2":"76.0.3783.1","6.0.0-beta.3":"76.0.3783.1","6.0.0-beta.4":"76.0.3783.1","6.0.0-beta.5":"76.0.3805.4","6.0.0-beta.6":"76.0.3809.3","6.0.0-beta.7":"76.0.3809.22","6.0.0-beta.8":"76.0.3809.26","6.0.0-beta.9":"76.0.3809.26","6.0.0-beta.10":"76.0.3809.37","6.0.0-beta.11":"76.0.3809.42","6.0.0-beta.12":"76.0.3809.54","6.0.0-beta.13":"76.0.3809.60","6.0.0-beta.14":"76.0.3809.68","6.0.0-beta.15":"76.0.3809.74","6.0.0-nightly.20190123":"72.0.3626.52","6.0.0-nightly.20190212":"72.0.3626.107","6.0.0-nightly.20190213":"72.0.3626.110","6.0.0-nightly.20190311":"74.0.3724.8","6.0.0":"76.0.3809.88","6.0.1":"76.0.3809.102","6.0.2":"76.0.3809.110","6.0.3":"76.0.3809.126","6.0.4":"76.0.3809.131","6.0.5":"76.0.3809.136","6.0.6":"76.0.3809.138","6.0.7":"76.0.3809.139","6.0.8":"76.0.3809.146","6.0.9":"76.0.3809.146","6.0.10":"76.0.3809.146","6.0.11":"76.0.3809.146","6.0.12":"76.0.3809.146","6.1.0":"76.0.3809.146","6.1.1":"76.0.3809.146","6.1.2":"76.0.3809.146","6.1.3":"76.0.3809.146","6.1.4":"76.0.3809.146","6.1.5":"76.0.3809.146","6.1.6":"76.0.3809.146","6.1.7":"76.0.3809.146","6.1.8":"76.0.3809.146","6.1.9":"76.0.3809.146","6.1.10":"76.0.3809.146","6.1.11":"76.0.3809.146","6.1.12":"76.0.3809.146","7.0.0-beta.1":"78.0.3866.0","7.0.0-beta.2":"78.0.3866.0","7.0.0-beta.3":"78.0.3866.0","7.0.0-beta.4":"78.0.3896.6","7.0.0-beta.5":"78.0.3905.1","7.0.0-beta.6":"78.0.3905.1","7.0.0-beta.7":"78.0.3905.1","7.0.0-nightly.20190521":"76.0.3784.0","7.0.0-nightly.20190529":"76.0.3806.0","7.0.0-nightly.20190530":"76.0.3806.0","7.0.0-nightly.20190531":"76.0.3806.0","7.0.0-nightly.20190602":"76.0.3806.0","7.0.0-nightly.20190603":"76.0.3806.0","7.0.0-nightly.20190604":"77.0.3814.0","7.0.0-nightly.20190605":"77.0.3815.0","7.0.0-nightly.20190606":"77.0.3815.0","7.0.0-nightly.20190607":"77.0.3815.0","7.0.0-nightly.20190608":"77.0.3815.0","7.0.0-nightly.20190609":"77.0.3815.0","7.0.0-nightly.20190611":"77.0.3815.0","7.0.0-nightly.20190612":"77.0.3815.0","7.0.0-nightly.20190613":"77.0.3815.0","7.0.0-nightly.20190615":"77.0.3815.0","7.0.0-nightly.20190616":"77.0.3815.0","7.0.0-nightly.20190618":"77.0.3815.0","7.0.0-nightly.20190619":"77.0.3815.0","7.0.0-nightly.20190622":"77.0.3815.0","7.0.0-nightly.20190623":"77.0.3815.0","7.0.0-nightly.20190624":"77.0.3815.0","7.0.0-nightly.20190627":"77.0.3815.0","7.0.0-nightly.20190629":"77.0.3815.0","7.0.0-nightly.20190630":"77.0.3815.0","7.0.0-nightly.20190701":"77.0.3815.0","7.0.0-nightly.20190702":"77.0.3815.0","7.0.0-nightly.20190704":"77.0.3843.0","7.0.0-nightly.20190705":"77.0.3843.0","7.0.0-nightly.20190719":"77.0.3848.0","7.0.0-nightly.20190720":"77.0.3848.0","7.0.0-nightly.20190721":"77.0.3848.0","7.0.0-nightly.20190726":"77.0.3864.0","7.0.0-nightly.20190727":"78.0.3866.0","7.0.0-nightly.20190728":"78.0.3866.0","7.0.0-nightly.20190729":"78.0.3866.0","7.0.0-nightly.20190730":"78.0.3866.0","7.0.0-nightly.20190731":"78.0.3866.0","7.0.0":"78.0.3905.1","7.0.1":"78.0.3904.92","7.1.0":"78.0.3904.94","7.1.1":"78.0.3904.99","7.1.2":"78.0.3904.113","7.1.3":"78.0.3904.126","7.1.4":"78.0.3904.130","7.1.5":"78.0.3904.130","7.1.6":"78.0.3904.130","7.1.7":"78.0.3904.130","7.1.8":"78.0.3904.130","7.1.9":"78.0.3904.130","7.1.10":"78.0.3904.130","7.1.11":"78.0.3904.130","7.1.12":"78.0.3904.130","7.1.13":"78.0.3904.130","7.1.14":"78.0.3904.130","7.2.0":"78.0.3904.130","7.2.1":"78.0.3904.130","7.2.2":"78.0.3904.130","7.2.3":"78.0.3904.130","7.2.4":"78.0.3904.130","7.3.0":"78.0.3904.130","7.3.1":"78.0.3904.130","7.3.2":"78.0.3904.130","7.3.3":"78.0.3904.130","8.0.0-beta.1":"79.0.3931.0","8.0.0-beta.2":"79.0.3931.0","8.0.0-beta.3":"80.0.3955.0","8.0.0-beta.4":"80.0.3955.0","8.0.0-beta.5":"80.0.3987.14","8.0.0-beta.6":"80.0.3987.51","8.0.0-beta.7":"80.0.3987.59","8.0.0-beta.8":"80.0.3987.75","8.0.0-beta.9":"80.0.3987.75","8.0.0-nightly.20190801":"78.0.3866.0","8.0.0-nightly.20190802":"78.0.3866.0","8.0.0-nightly.20190803":"78.0.3871.0","8.0.0-nightly.20190806":"78.0.3871.0","8.0.0-nightly.20190807":"78.0.3871.0","8.0.0-nightly.20190808":"78.0.3871.0","8.0.0-nightly.20190809":"78.0.3871.0","8.0.0-nightly.20190810":"78.0.3871.0","8.0.0-nightly.20190811":"78.0.3871.0","8.0.0-nightly.20190812":"78.0.3871.0","8.0.0-nightly.20190813":"78.0.3871.0","8.0.0-nightly.20190814":"78.0.3871.0","8.0.0-nightly.20190815":"78.0.3871.0","8.0.0-nightly.20190816":"78.0.3881.0","8.0.0-nightly.20190817":"78.0.3881.0","8.0.0-nightly.20190818":"78.0.3881.0","8.0.0-nightly.20190819":"78.0.3881.0","8.0.0-nightly.20190820":"78.0.3881.0","8.0.0-nightly.20190824":"78.0.3892.0","8.0.0-nightly.20190825":"78.0.3892.0","8.0.0-nightly.20190827":"78.0.3892.0","8.0.0-nightly.20190828":"78.0.3892.0","8.0.0-nightly.20190830":"78.0.3892.0","8.0.0-nightly.20190901":"78.0.3892.0","8.0.0-nightly.20190902":"78.0.3892.0","8.0.0-nightly.20190907":"78.0.3892.0","8.0.0-nightly.20190909":"78.0.3892.0","8.0.0-nightly.20190910":"78.0.3892.0","8.0.0-nightly.20190911":"78.0.3892.0","8.0.0-nightly.20190912":"78.0.3892.0","8.0.0-nightly.20190913":"78.0.3892.0","8.0.0-nightly.20190914":"78.0.3892.0","8.0.0-nightly.20190915":"78.0.3892.0","8.0.0-nightly.20190917":"78.0.3892.0","8.0.0-nightly.20190919":"79.0.3915.0","8.0.0-nightly.20190920":"79.0.3915.0","8.0.0-nightly.20190922":"79.0.3919.0","8.0.0-nightly.20190923":"79.0.3919.0","8.0.0-nightly.20190924":"79.0.3919.0","8.0.0-nightly.20190926":"79.0.3919.0","8.0.0-nightly.20190928":"79.0.3919.0","8.0.0-nightly.20190929":"79.0.3919.0","8.0.0-nightly.20190930":"79.0.3919.0","8.0.0-nightly.20191001":"79.0.3919.0","8.0.0-nightly.20191004":"79.0.3919.0","8.0.0-nightly.20191005":"79.0.3919.0","8.0.0-nightly.20191006":"79.0.3919.0","8.0.0-nightly.20191009":"79.0.3919.0","8.0.0-nightly.20191011":"79.0.3919.0","8.0.0-nightly.20191012":"79.0.3919.0","8.0.0-nightly.20191017":"79.0.3919.0","8.0.0-nightly.20191019":"79.0.3931.0","8.0.0-nightly.20191020":"79.0.3931.0","8.0.0-nightly.20191021":"79.0.3931.0","8.0.0-nightly.20191023":"79.0.3931.0","8.0.0-nightly.20191101":"80.0.3952.0","8.0.0-nightly.20191103":"80.0.3952.0","8.0.0-nightly.20191105":"80.0.3952.0","8.0.0":"80.0.3987.86","8.0.1":"80.0.3987.86","8.0.2":"80.0.3987.86","8.0.3":"80.0.3987.134","8.1.0":"80.0.3987.137","8.1.1":"80.0.3987.141","8.2.0":"80.0.3987.158","8.2.1":"80.0.3987.163","8.2.2":"80.0.3987.163","8.2.3":"80.0.3987.163","8.2.4":"80.0.3987.165","8.2.5":"80.0.3987.165","8.3.0":"80.0.3987.165","8.3.1":"80.0.3987.165","8.3.2":"80.0.3987.165","8.3.3":"80.0.3987.165","8.3.4":"80.0.3987.165","8.4.0":"80.0.3987.165","8.4.1":"80.0.3987.165","8.5.0":"80.0.3987.165","8.5.1":"80.0.3987.165","8.5.2":"80.0.3987.165","8.5.3":"80.0.3987.163","8.5.4":"80.0.3987.163","8.5.5":"80.0.3987.163","9.0.0-beta.1":"82.0.4048.0","9.0.0-beta.2":"82.0.4048.0","9.0.0-beta.3":"82.0.4048.0","9.0.0-beta.4":"82.0.4048.0","9.0.0-beta.5":"82.0.4048.0","9.0.0-beta.6":"82.0.4058.2","9.0.0-beta.7":"82.0.4058.2","9.0.0-beta.9":"82.0.4058.2","9.0.0-beta.10":"82.0.4085.10","9.0.0-beta.11":"82.0.4085.14","9.0.0-beta.12":"82.0.4085.14","9.0.0-beta.13":"82.0.4085.14","9.0.0-beta.14":"82.0.4085.27","9.0.0-beta.15":"83.0.4102.3","9.0.0-beta.16":"83.0.4102.3","9.0.0-beta.17":"83.0.4103.14","9.0.0-beta.18":"83.0.4103.16","9.0.0-beta.19":"83.0.4103.24","9.0.0-beta.20":"83.0.4103.26","9.0.0-beta.21":"83.0.4103.26","9.0.0-beta.22":"83.0.4103.34","9.0.0-beta.23":"83.0.4103.44","9.0.0-beta.24":"83.0.4103.45","9.0.0-nightly.20191121":"80.0.3954.0","9.0.0-nightly.20191122":"80.0.3954.0","9.0.0-nightly.20191123":"80.0.3954.0","9.0.0-nightly.20191124":"80.0.3954.0","9.0.0-nightly.20191126":"80.0.3954.0","9.0.0-nightly.20191128":"80.0.3954.0","9.0.0-nightly.20191129":"80.0.3954.0","9.0.0-nightly.20191130":"80.0.3954.0","9.0.0-nightly.20191201":"80.0.3954.0","9.0.0-nightly.20191202":"80.0.3954.0","9.0.0-nightly.20191203":"80.0.3954.0","9.0.0-nightly.20191204":"80.0.3954.0","9.0.0-nightly.20191205":"80.0.3954.0","9.0.0-nightly.20191210":"80.0.3954.0","9.0.0-nightly.20191220":"81.0.3994.0","9.0.0-nightly.20191221":"81.0.3994.0","9.0.0-nightly.20191222":"81.0.3994.0","9.0.0-nightly.20191223":"81.0.3994.0","9.0.0-nightly.20191224":"81.0.3994.0","9.0.0-nightly.20191225":"81.0.3994.0","9.0.0-nightly.20191226":"81.0.3994.0","9.0.0-nightly.20191228":"81.0.3994.0","9.0.0-nightly.20191229":"81.0.3994.0","9.0.0-nightly.20191230":"81.0.3994.0","9.0.0-nightly.20191231":"81.0.3994.0","9.0.0-nightly.20200101":"81.0.3994.0","9.0.0-nightly.20200103":"81.0.3994.0","9.0.0-nightly.20200104":"81.0.3994.0","9.0.0-nightly.20200105":"81.0.3994.0","9.0.0-nightly.20200106":"81.0.3994.0","9.0.0-nightly.20200108":"81.0.3994.0","9.0.0-nightly.20200109":"81.0.3994.0","9.0.0-nightly.20200110":"81.0.3994.0","9.0.0-nightly.20200111":"81.0.3994.0","9.0.0-nightly.20200113":"81.0.3994.0","9.0.0-nightly.20200115":"81.0.3994.0","9.0.0-nightly.20200116":"81.0.3994.0","9.0.0-nightly.20200117":"81.0.3994.0","9.0.0-nightly.20200119":"81.0.4030.0","9.0.0-nightly.20200121":"81.0.4030.0","9.0.0":"83.0.4103.64","9.0.1":"83.0.4103.94","9.0.2":"83.0.4103.94","9.0.3":"83.0.4103.100","9.0.4":"83.0.4103.104","9.0.5":"83.0.4103.119","9.1.0":"83.0.4103.122","9.1.1":"83.0.4103.122","9.1.2":"83.0.4103.122","9.2.0":"83.0.4103.122","9.2.1":"83.0.4103.122","9.3.0":"83.0.4103.122","9.3.1":"83.0.4103.122","9.3.2":"83.0.4103.122","9.3.3":"83.0.4103.122","9.3.4":"83.0.4103.122","9.3.5":"83.0.4103.122","9.4.0":"83.0.4103.122","9.4.1":"83.0.4103.122","9.4.2":"83.0.4103.122","9.4.3":"83.0.4103.122","9.4.4":"83.0.4103.122","10.0.0-beta.1":"84.0.4129.0","10.0.0-beta.2":"84.0.4129.0","10.0.0-beta.3":"85.0.4161.2","10.0.0-beta.4":"85.0.4161.2","10.0.0-beta.8":"85.0.4181.1","10.0.0-beta.9":"85.0.4181.1","10.0.0-beta.10":"85.0.4183.19","10.0.0-beta.11":"85.0.4183.20","10.0.0-beta.12":"85.0.4183.26","10.0.0-beta.13":"85.0.4183.39","10.0.0-beta.14":"85.0.4183.39","10.0.0-beta.15":"85.0.4183.39","10.0.0-beta.17":"85.0.4183.39","10.0.0-beta.19":"85.0.4183.39","10.0.0-beta.20":"85.0.4183.39","10.0.0-beta.21":"85.0.4183.39","10.0.0-beta.23":"85.0.4183.70","10.0.0-beta.24":"85.0.4183.78","10.0.0-beta.25":"85.0.4183.80","10.0.0-nightly.20200209":"82.0.4050.0","10.0.0-nightly.20200210":"82.0.4050.0","10.0.0-nightly.20200211":"82.0.4050.0","10.0.0-nightly.20200216":"82.0.4050.0","10.0.0-nightly.20200217":"82.0.4050.0","10.0.0-nightly.20200218":"82.0.4050.0","10.0.0-nightly.20200221":"82.0.4050.0","10.0.0-nightly.20200222":"82.0.4050.0","10.0.0-nightly.20200223":"82.0.4050.0","10.0.0-nightly.20200226":"82.0.4050.0","10.0.0-nightly.20200303":"82.0.4050.0","10.0.0-nightly.20200304":"82.0.4076.0","10.0.0-nightly.20200305":"82.0.4076.0","10.0.0-nightly.20200306":"82.0.4076.0","10.0.0-nightly.20200309":"82.0.4076.0","10.0.0-nightly.20200310":"82.0.4076.0","10.0.0-nightly.20200311":"82.0.4083.0","10.0.0-nightly.20200316":"83.0.4086.0","10.0.0-nightly.20200317":"83.0.4087.0","10.0.0-nightly.20200318":"83.0.4087.0","10.0.0-nightly.20200320":"83.0.4087.0","10.0.0-nightly.20200323":"83.0.4087.0","10.0.0-nightly.20200324":"83.0.4087.0","10.0.0-nightly.20200325":"83.0.4087.0","10.0.0-nightly.20200326":"83.0.4087.0","10.0.0-nightly.20200327":"83.0.4087.0","10.0.0-nightly.20200330":"83.0.4087.0","10.0.0-nightly.20200331":"83.0.4087.0","10.0.0-nightly.20200401":"83.0.4087.0","10.0.0-nightly.20200402":"83.0.4087.0","10.0.0-nightly.20200403":"83.0.4087.0","10.0.0-nightly.20200406":"83.0.4087.0","10.0.0-nightly.20200408":"83.0.4095.0","10.0.0-nightly.20200410":"83.0.4095.0","10.0.0-nightly.20200413":"83.0.4095.0","10.0.0-nightly.20200414":"84.0.4114.0","10.0.0-nightly.20200415":"84.0.4115.0","10.0.0-nightly.20200416":"84.0.4115.0","10.0.0-nightly.20200417":"84.0.4115.0","10.0.0-nightly.20200422":"84.0.4121.0","10.0.0-nightly.20200423":"84.0.4121.0","10.0.0-nightly.20200427":"84.0.4125.0","10.0.0-nightly.20200428":"84.0.4125.0","10.0.0-nightly.20200429":"84.0.4125.0","10.0.0-nightly.20200430":"84.0.4125.0","10.0.0-nightly.20200501":"84.0.4129.0","10.0.0-nightly.20200504":"84.0.4129.0","10.0.0-nightly.20200505":"84.0.4129.0","10.0.0-nightly.20200506":"84.0.4129.0","10.0.0-nightly.20200507":"84.0.4129.0","10.0.0-nightly.20200508":"84.0.4129.0","10.0.0-nightly.20200511":"84.0.4129.0","10.0.0-nightly.20200512":"84.0.4129.0","10.0.0-nightly.20200513":"84.0.4129.0","10.0.0-nightly.20200514":"84.0.4129.0","10.0.0-nightly.20200515":"84.0.4129.0","10.0.0-nightly.20200518":"84.0.4129.0","10.0.0-nightly.20200519":"84.0.4129.0","10.0.0-nightly.20200520":"84.0.4129.0","10.0.0-nightly.20200521":"84.0.4129.0","10.0.0":"85.0.4183.84","10.0.1":"85.0.4183.86","10.1.0":"85.0.4183.87","10.1.1":"85.0.4183.93","10.1.2":"85.0.4183.98","10.1.3":"85.0.4183.121","10.1.4":"85.0.4183.121","10.1.5":"85.0.4183.121","10.1.6":"85.0.4183.121","10.1.7":"85.0.4183.121","10.2.0":"85.0.4183.121","10.3.0":"85.0.4183.121","10.3.1":"85.0.4183.121","10.3.2":"85.0.4183.121","10.4.0":"85.0.4183.121","10.4.1":"85.0.4183.121","10.4.2":"85.0.4183.121","10.4.3":"85.0.4183.121","10.4.4":"85.0.4183.121","10.4.5":"85.0.4183.121","10.4.6":"85.0.4183.121","10.4.7":"85.0.4183.121","11.0.0-beta.1":"86.0.4234.0","11.0.0-beta.3":"86.0.4234.0","11.0.0-beta.4":"86.0.4234.0","11.0.0-beta.5":"86.0.4234.0","11.0.0-beta.6":"86.0.4234.0","11.0.0-beta.7":"86.0.4234.0","11.0.0-beta.8":"87.0.4251.1","11.0.0-beta.9":"87.0.4251.1","11.0.0-beta.11":"87.0.4251.1","11.0.0-beta.12":"87.0.4280.11","11.0.0-beta.13":"87.0.4280.11","11.0.0-beta.16":"87.0.4280.27","11.0.0-beta.17":"87.0.4280.27","11.0.0-beta.18":"87.0.4280.27","11.0.0-beta.19":"87.0.4280.27","11.0.0-beta.20":"87.0.4280.40","11.0.0-beta.22":"87.0.4280.47","11.0.0-beta.23":"87.0.4280.47","11.0.0-nightly.20200525":"84.0.4129.0","11.0.0-nightly.20200526":"84.0.4129.0","11.0.0-nightly.20200529":"85.0.4156.0","11.0.0-nightly.20200602":"85.0.4162.0","11.0.0-nightly.20200603":"85.0.4162.0","11.0.0-nightly.20200604":"85.0.4162.0","11.0.0-nightly.20200609":"85.0.4162.0","11.0.0-nightly.20200610":"85.0.4162.0","11.0.0-nightly.20200611":"85.0.4162.0","11.0.0-nightly.20200615":"85.0.4162.0","11.0.0-nightly.20200616":"85.0.4162.0","11.0.0-nightly.20200617":"85.0.4162.0","11.0.0-nightly.20200618":"85.0.4162.0","11.0.0-nightly.20200619":"85.0.4162.0","11.0.0-nightly.20200701":"85.0.4179.0","11.0.0-nightly.20200702":"85.0.4179.0","11.0.0-nightly.20200703":"85.0.4179.0","11.0.0-nightly.20200706":"85.0.4179.0","11.0.0-nightly.20200707":"85.0.4179.0","11.0.0-nightly.20200708":"85.0.4179.0","11.0.0-nightly.20200709":"85.0.4179.0","11.0.0-nightly.20200716":"86.0.4203.0","11.0.0-nightly.20200717":"86.0.4203.0","11.0.0-nightly.20200720":"86.0.4203.0","11.0.0-nightly.20200721":"86.0.4203.0","11.0.0-nightly.20200723":"86.0.4209.0","11.0.0-nightly.20200724":"86.0.4209.0","11.0.0-nightly.20200729":"86.0.4209.0","11.0.0-nightly.20200730":"86.0.4209.0","11.0.0-nightly.20200731":"86.0.4209.0","11.0.0-nightly.20200803":"86.0.4209.0","11.0.0-nightly.20200804":"86.0.4209.0","11.0.0-nightly.20200805":"86.0.4209.0","11.0.0-nightly.20200811":"86.0.4209.0","11.0.0-nightly.20200812":"86.0.4209.0","11.0.0-nightly.20200822":"86.0.4234.0","11.0.0-nightly.20200824":"86.0.4234.0","11.0.0-nightly.20200825":"86.0.4234.0","11.0.0-nightly.20200826":"86.0.4234.0","11.0.0":"87.0.4280.60","11.0.1":"87.0.4280.60","11.0.2":"87.0.4280.67","11.0.3":"87.0.4280.67","11.0.4":"87.0.4280.67","11.0.5":"87.0.4280.88","11.1.0":"87.0.4280.88","11.1.1":"87.0.4280.88","11.2.0":"87.0.4280.141","11.2.1":"87.0.4280.141","11.2.2":"87.0.4280.141","11.2.3":"87.0.4280.141","11.3.0":"87.0.4280.141","11.4.0":"87.0.4280.141","11.4.1":"87.0.4280.141","11.4.2":"87.0.4280.141","11.4.3":"87.0.4280.141","11.4.4":"87.0.4280.141","11.4.5":"87.0.4280.141","11.4.6":"87.0.4280.141","11.4.7":"87.0.4280.141","11.4.8":"87.0.4280.141","11.4.9":"87.0.4280.141","11.4.10":"87.0.4280.141","11.4.11":"87.0.4280.141","11.4.12":"87.0.4280.141","11.5.0":"87.0.4280.141","12.0.0-beta.1":"89.0.4328.0","12.0.0-beta.3":"89.0.4328.0","12.0.0-beta.4":"89.0.4328.0","12.0.0-beta.5":"89.0.4328.0","12.0.0-beta.6":"89.0.4328.0","12.0.0-beta.7":"89.0.4328.0","12.0.0-beta.8":"89.0.4328.0","12.0.0-beta.9":"89.0.4328.0","12.0.0-beta.10":"89.0.4328.0","12.0.0-beta.11":"89.0.4328.0","12.0.0-beta.12":"89.0.4328.0","12.0.0-beta.14":"89.0.4328.0","12.0.0-beta.16":"89.0.4348.1","12.0.0-beta.18":"89.0.4348.1","12.0.0-beta.19":"89.0.4348.1","12.0.0-beta.20":"89.0.4348.1","12.0.0-beta.21":"89.0.4388.2","12.0.0-beta.22":"89.0.4388.2","12.0.0-beta.23":"89.0.4388.2","12.0.0-beta.24":"89.0.4388.2","12.0.0-beta.25":"89.0.4388.2","12.0.0-beta.26":"89.0.4388.2","12.0.0-beta.27":"89.0.4389.23","12.0.0-beta.28":"89.0.4389.23","12.0.0-beta.29":"89.0.4389.23","12.0.0-beta.30":"89.0.4389.58","12.0.0-beta.31":"89.0.4389.58","12.0.0-nightly.20200827":"86.0.4234.0","12.0.0-nightly.20200831":"86.0.4234.0","12.0.0-nightly.20200902":"86.0.4234.0","12.0.0-nightly.20200903":"86.0.4234.0","12.0.0-nightly.20200907":"86.0.4234.0","12.0.0-nightly.20200910":"86.0.4234.0","12.0.0-nightly.20200911":"86.0.4234.0","12.0.0-nightly.20200914":"86.0.4234.0","12.0.0-nightly.20201002":"87.0.4268.0","12.0.0-nightly.20201007":"87.0.4268.0","12.0.0-nightly.20201009":"87.0.4268.0","12.0.0-nightly.20201012":"87.0.4268.0","12.0.0-nightly.20201013":"87.0.4268.0","12.0.0-nightly.20201014":"87.0.4268.0","12.0.0-nightly.20201015":"87.0.4268.0","12.0.0-nightly.20201023":"88.0.4292.0","12.0.0-nightly.20201026":"88.0.4292.0","12.0.0-nightly.20201030":"88.0.4306.0","12.0.0-nightly.20201102":"88.0.4306.0","12.0.0-nightly.20201103":"88.0.4306.0","12.0.0-nightly.20201104":"88.0.4306.0","12.0.0-nightly.20201105":"88.0.4306.0","12.0.0-nightly.20201106":"88.0.4306.0","12.0.0-nightly.20201111":"88.0.4306.0","12.0.0-nightly.20201112":"88.0.4306.0","12.0.0-nightly.20201116":"88.0.4324.0","12.0.0":"89.0.4389.69","12.0.1":"89.0.4389.82","12.0.2":"89.0.4389.90","12.0.3":"89.0.4389.114","12.0.4":"89.0.4389.114","12.0.5":"89.0.4389.128","12.0.6":"89.0.4389.128","12.0.7":"89.0.4389.128","12.0.8":"89.0.4389.128","12.0.9":"89.0.4389.128","12.0.10":"89.0.4389.128","12.0.11":"89.0.4389.128","12.0.12":"89.0.4389.128","12.0.13":"89.0.4389.128","12.0.14":"89.0.4389.128","12.0.15":"89.0.4389.128","12.0.16":"89.0.4389.128","12.0.17":"89.0.4389.128","12.0.18":"89.0.4389.128","12.1.0":"89.0.4389.128","12.1.1":"89.0.4389.128","12.1.2":"89.0.4389.128","12.2.0":"89.0.4389.128","12.2.1":"89.0.4389.128","12.2.2":"89.0.4389.128","12.2.3":"89.0.4389.128","13.0.0-beta.2":"90.0.4402.0","13.0.0-beta.3":"90.0.4402.0","13.0.0-beta.4":"90.0.4415.0","13.0.0-beta.5":"90.0.4415.0","13.0.0-beta.6":"90.0.4415.0","13.0.0-beta.7":"90.0.4415.0","13.0.0-beta.8":"90.0.4415.0","13.0.0-beta.9":"90.0.4415.0","13.0.0-beta.10":"90.0.4415.0","13.0.0-beta.11":"90.0.4415.0","13.0.0-beta.12":"90.0.4415.0","13.0.0-beta.13":"90.0.4415.0","13.0.0-beta.14":"91.0.4448.0","13.0.0-beta.16":"91.0.4448.0","13.0.0-beta.17":"91.0.4448.0","13.0.0-beta.18":"91.0.4448.0","13.0.0-beta.20":"91.0.4448.0","13.0.0-beta.21":"91.0.4472.33","13.0.0-beta.22":"91.0.4472.33","13.0.0-beta.23":"91.0.4472.33","13.0.0-beta.24":"91.0.4472.38","13.0.0-beta.25":"91.0.4472.38","13.0.0-beta.26":"91.0.4472.38","13.0.0-beta.27":"91.0.4472.38","13.0.0-beta.28":"91.0.4472.38","13.0.0-nightly.20201119":"89.0.4328.0","13.0.0-nightly.20201123":"89.0.4328.0","13.0.0-nightly.20201124":"89.0.4328.0","13.0.0-nightly.20201126":"89.0.4328.0","13.0.0-nightly.20201127":"89.0.4328.0","13.0.0-nightly.20201130":"89.0.4328.0","13.0.0-nightly.20201201":"89.0.4328.0","13.0.0-nightly.20201202":"89.0.4328.0","13.0.0-nightly.20201203":"89.0.4328.0","13.0.0-nightly.20201204":"89.0.4328.0","13.0.0-nightly.20201207":"89.0.4328.0","13.0.0-nightly.20201208":"89.0.4328.0","13.0.0-nightly.20201209":"89.0.4328.0","13.0.0-nightly.20201210":"89.0.4328.0","13.0.0-nightly.20201211":"89.0.4328.0","13.0.0-nightly.20201214":"89.0.4328.0","13.0.0-nightly.20201215":"89.0.4349.0","13.0.0-nightly.20201216":"89.0.4349.0","13.0.0-nightly.20201221":"89.0.4349.0","13.0.0-nightly.20201222":"89.0.4349.0","13.0.0-nightly.20201223":"89.0.4359.0","13.0.0-nightly.20210104":"89.0.4359.0","13.0.0-nightly.20210108":"89.0.4359.0","13.0.0-nightly.20210111":"89.0.4359.0","13.0.0-nightly.20210113":"89.0.4386.0","13.0.0-nightly.20210114":"89.0.4386.0","13.0.0-nightly.20210118":"89.0.4386.0","13.0.0-nightly.20210122":"89.0.4386.0","13.0.0-nightly.20210125":"89.0.4386.0","13.0.0-nightly.20210127":"89.0.4389.0","13.0.0-nightly.20210128":"89.0.4389.0","13.0.0-nightly.20210129":"89.0.4389.0","13.0.0-nightly.20210201":"89.0.4389.0","13.0.0-nightly.20210202":"89.0.4389.0","13.0.0-nightly.20210203":"89.0.4389.0","13.0.0-nightly.20210205":"89.0.4389.0","13.0.0-nightly.20210208":"89.0.4389.0","13.0.0-nightly.20210209":"89.0.4389.0","13.0.0-nightly.20210210":"90.0.4402.0","13.0.0-nightly.20210211":"90.0.4402.0","13.0.0-nightly.20210212":"90.0.4402.0","13.0.0-nightly.20210216":"90.0.4402.0","13.0.0-nightly.20210217":"90.0.4402.0","13.0.0-nightly.20210218":"90.0.4402.0","13.0.0-nightly.20210219":"90.0.4402.0","13.0.0-nightly.20210222":"90.0.4402.0","13.0.0-nightly.20210225":"90.0.4402.0","13.0.0-nightly.20210226":"90.0.4402.0","13.0.0-nightly.20210301":"90.0.4402.0","13.0.0-nightly.20210302":"90.0.4402.0","13.0.0-nightly.20210303":"90.0.4402.0","13.0.0":"91.0.4472.69","13.0.1":"91.0.4472.69","13.1.0":"91.0.4472.77","13.1.1":"91.0.4472.77","13.1.2":"91.0.4472.77","13.1.3":"91.0.4472.106","13.1.4":"91.0.4472.106","13.1.5":"91.0.4472.124","13.1.6":"91.0.4472.124","13.1.7":"91.0.4472.124","13.1.8":"91.0.4472.164","13.1.9":"91.0.4472.164","13.2.0":"91.0.4472.164","13.2.1":"91.0.4472.164","13.2.2":"91.0.4472.164","13.2.3":"91.0.4472.164","13.3.0":"91.0.4472.164","13.4.0":"91.0.4472.164","13.5.0":"91.0.4472.164","13.5.1":"91.0.4472.164","13.5.2":"91.0.4472.164","13.6.0":"91.0.4472.164","13.6.1":"91.0.4472.164","13.6.2":"91.0.4472.164","13.6.3":"91.0.4472.164","13.6.6":"91.0.4472.164","13.6.7":"91.0.4472.164","13.6.8":"91.0.4472.164","13.6.9":"91.0.4472.164","14.0.0-beta.1":"92.0.4511.0","14.0.0-beta.2":"92.0.4511.0","14.0.0-beta.3":"92.0.4511.0","14.0.0-beta.5":"93.0.4536.0","14.0.0-beta.6":"93.0.4536.0","14.0.0-beta.7":"93.0.4536.0","14.0.0-beta.8":"93.0.4536.0","14.0.0-beta.9":"93.0.4539.0","14.0.0-beta.10":"93.0.4539.0","14.0.0-beta.11":"93.0.4557.4","14.0.0-beta.12":"93.0.4557.4","14.0.0-beta.13":"93.0.4566.0","14.0.0-beta.14":"93.0.4566.0","14.0.0-beta.15":"93.0.4566.0","14.0.0-beta.16":"93.0.4566.0","14.0.0-beta.17":"93.0.4566.0","14.0.0-beta.18":"93.0.4577.15","14.0.0-beta.19":"93.0.4577.15","14.0.0-beta.20":"93.0.4577.15","14.0.0-beta.21":"93.0.4577.15","14.0.0-beta.22":"93.0.4577.25","14.0.0-beta.23":"93.0.4577.25","14.0.0-beta.24":"93.0.4577.51","14.0.0-beta.25":"93.0.4577.51","14.0.0-nightly.20210304":"90.0.4402.0","14.0.0-nightly.20210305":"90.0.4415.0","14.0.0-nightly.20210308":"90.0.4415.0","14.0.0-nightly.20210309":"90.0.4415.0","14.0.0-nightly.20210311":"90.0.4415.0","14.0.0-nightly.20210315":"90.0.4415.0","14.0.0-nightly.20210316":"90.0.4415.0","14.0.0-nightly.20210317":"90.0.4415.0","14.0.0-nightly.20210318":"90.0.4415.0","14.0.0-nightly.20210319":"90.0.4415.0","14.0.0-nightly.20210323":"90.0.4415.0","14.0.0-nightly.20210324":"90.0.4415.0","14.0.0-nightly.20210325":"90.0.4415.0","14.0.0-nightly.20210326":"90.0.4415.0","14.0.0-nightly.20210329":"90.0.4415.0","14.0.0-nightly.20210330":"90.0.4415.0","14.0.0-nightly.20210331":"91.0.4448.0","14.0.0-nightly.20210401":"91.0.4448.0","14.0.0-nightly.20210402":"91.0.4448.0","14.0.0-nightly.20210406":"91.0.4448.0","14.0.0-nightly.20210407":"91.0.4448.0","14.0.0-nightly.20210408":"91.0.4448.0","14.0.0-nightly.20210409":"91.0.4448.0","14.0.0-nightly.20210413":"91.0.4448.0","14.0.0-nightly.20210426":"92.0.4475.0","14.0.0-nightly.20210427":"92.0.4475.0","14.0.0-nightly.20210430":"92.0.4488.0","14.0.0-nightly.20210503":"92.0.4488.0","14.0.0-nightly.20210505":"92.0.4496.0","14.0.0-nightly.20210506":"92.0.4498.0","14.0.0-nightly.20210507":"92.0.4499.0","14.0.0-nightly.20210510":"92.0.4499.0","14.0.0-nightly.20210511":"92.0.4499.0","14.0.0-nightly.20210512":"92.0.4499.0","14.0.0-nightly.20210513":"92.0.4499.0","14.0.0-nightly.20210514":"92.0.4505.0","14.0.0-nightly.20210517":"92.0.4505.0","14.0.0-nightly.20210518":"92.0.4505.0","14.0.0-nightly.20210519":"92.0.4505.0","14.0.0-nightly.20210520":"92.0.4511.0","14.0.0-nightly.20210523":"92.0.4511.0","14.0.0-nightly.20210524":"92.0.4511.0","14.0.0":"93.0.4577.58","14.0.1":"93.0.4577.63","14.0.2":"93.0.4577.82","14.1.0":"93.0.4577.82","14.1.1":"93.0.4577.82","14.2.0":"93.0.4577.82","14.2.1":"93.0.4577.82","14.2.2":"93.0.4577.82","14.2.3":"93.0.4577.82","14.2.4":"93.0.4577.82","14.2.5":"93.0.4577.82","14.2.6":"93.0.4577.82","14.2.7":"93.0.4577.82","14.2.8":"93.0.4577.82","14.2.9":"93.0.4577.82","15.0.0-alpha.1":"93.0.4566.0","15.0.0-alpha.2":"93.0.4566.0","15.0.0-alpha.3":"94.0.4584.0","15.0.0-alpha.4":"94.0.4584.0","15.0.0-alpha.5":"94.0.4584.0","15.0.0-alpha.6":"94.0.4584.0","15.0.0-alpha.7":"94.0.4590.2","15.0.0-alpha.8":"94.0.4590.2","15.0.0-alpha.9":"94.0.4590.2","15.0.0-alpha.10":"94.0.4606.12","15.0.0-beta.1":"94.0.4606.20","15.0.0-beta.2":"94.0.4606.20","15.0.0-beta.3":"94.0.4606.31","15.0.0-beta.4":"94.0.4606.31","15.0.0-beta.5":"94.0.4606.31","15.0.0-beta.6":"94.0.4606.31","15.0.0-beta.7":"94.0.4606.31","15.0.0-nightly.20210527":"92.0.4511.0","15.0.0-nightly.20210528":"92.0.4511.0","15.0.0-nightly.20210531":"92.0.4511.0","15.0.0-nightly.20210601":"92.0.4511.0","15.0.0-nightly.20210602":"92.0.4511.0","15.0.0-nightly.20210603":"93.0.4530.0","15.0.0-nightly.20210604":"93.0.4530.0","15.0.0-nightly.20210608":"93.0.4535.0","15.0.0-nightly.20210609":"93.0.4536.0","15.0.0-nightly.20210610":"93.0.4536.0","15.0.0-nightly.20210611":"93.0.4536.0","15.0.0-nightly.20210614":"93.0.4536.0","15.0.0-nightly.20210615":"93.0.4536.0","15.0.0-nightly.20210616":"93.0.4536.0","15.0.0-nightly.20210617":"93.0.4539.0","15.0.0-nightly.20210618":"93.0.4539.0","15.0.0-nightly.20210621":"93.0.4539.0","15.0.0-nightly.20210622":"93.0.4539.0","15.0.0-nightly.20210623":"93.0.4550.0","15.0.0-nightly.20210624":"93.0.4550.0","15.0.0-nightly.20210625":"93.0.4552.0","15.0.0-nightly.20210628":"93.0.4552.0","15.0.0-nightly.20210629":"93.0.4552.0","15.0.0-nightly.20210630":"93.0.4558.0","15.0.0-nightly.20210701":"93.0.4558.0","15.0.0-nightly.20210702":"93.0.4558.0","15.0.0-nightly.20210705":"93.0.4558.0","15.0.0-nightly.20210706":"93.0.4566.0","15.0.0-nightly.20210707":"93.0.4566.0","15.0.0-nightly.20210708":"93.0.4566.0","15.0.0-nightly.20210709":"93.0.4566.0","15.0.0-nightly.20210712":"93.0.4566.0","15.0.0-nightly.20210713":"93.0.4566.0","15.0.0-nightly.20210714":"93.0.4566.0","15.0.0-nightly.20210715":"93.0.4566.0","15.0.0-nightly.20210716":"93.0.4566.0","15.0.0-nightly.20210719":"93.0.4566.0","15.0.0-nightly.20210720":"93.0.4566.0","15.0.0-nightly.20210721":"93.0.4566.0","15.0.0":"94.0.4606.51","15.1.0":"94.0.4606.61","15.1.1":"94.0.4606.61","15.1.2":"94.0.4606.71","15.2.0":"94.0.4606.81","15.3.0":"94.0.4606.81","15.3.1":"94.0.4606.81","15.3.2":"94.0.4606.81","15.3.3":"94.0.4606.81","15.3.4":"94.0.4606.81","15.3.5":"94.0.4606.81","15.3.6":"94.0.4606.81","15.3.7":"94.0.4606.81","15.4.0":"94.0.4606.81","15.4.1":"94.0.4606.81","15.4.2":"94.0.4606.81","15.5.0":"94.0.4606.81","15.5.1":"94.0.4606.81","15.5.2":"94.0.4606.81","15.5.3":"94.0.4606.81","15.5.4":"94.0.4606.81","15.5.5":"94.0.4606.81","15.5.6":"94.0.4606.81","15.5.7":"94.0.4606.81","16.0.0-alpha.1":"95.0.4629.0","16.0.0-alpha.2":"95.0.4629.0","16.0.0-alpha.3":"95.0.4629.0","16.0.0-alpha.4":"95.0.4629.0","16.0.0-alpha.5":"95.0.4629.0","16.0.0-alpha.6":"95.0.4629.0","16.0.0-alpha.7":"95.0.4629.0","16.0.0-alpha.8":"96.0.4647.0","16.0.0-alpha.9":"96.0.4647.0","16.0.0-beta.1":"96.0.4647.0","16.0.0-beta.2":"96.0.4647.0","16.0.0-beta.3":"96.0.4647.0","16.0.0-beta.4":"96.0.4664.18","16.0.0-beta.5":"96.0.4664.18","16.0.0-beta.6":"96.0.4664.27","16.0.0-beta.7":"96.0.4664.27","16.0.0-beta.8":"96.0.4664.35","16.0.0-beta.9":"96.0.4664.35","16.0.0-nightly.20210722":"93.0.4566.0","16.0.0-nightly.20210723":"93.0.4566.0","16.0.0-nightly.20210726":"93.0.4566.0","16.0.0-nightly.20210727":"94.0.4584.0","16.0.0-nightly.20210728":"94.0.4584.0","16.0.0-nightly.20210729":"94.0.4584.0","16.0.0-nightly.20210730":"94.0.4584.0","16.0.0-nightly.20210802":"94.0.4584.0","16.0.0-nightly.20210803":"94.0.4584.0","16.0.0-nightly.20210804":"94.0.4584.0","16.0.0-nightly.20210805":"94.0.4584.0","16.0.0-nightly.20210806":"94.0.4584.0","16.0.0-nightly.20210809":"94.0.4584.0","16.0.0-nightly.20210810":"94.0.4584.0","16.0.0-nightly.20210811":"94.0.4584.0","16.0.0-nightly.20210812":"94.0.4590.2","16.0.0-nightly.20210813":"94.0.4590.2","16.0.0-nightly.20210816":"94.0.4590.2","16.0.0-nightly.20210817":"94.0.4590.2","16.0.0-nightly.20210818":"94.0.4590.2","16.0.0-nightly.20210819":"94.0.4590.2","16.0.0-nightly.20210820":"94.0.4590.2","16.0.0-nightly.20210823":"94.0.4590.2","16.0.0-nightly.20210824":"95.0.4612.5","16.0.0-nightly.20210825":"95.0.4612.5","16.0.0-nightly.20210826":"95.0.4612.5","16.0.0-nightly.20210827":"95.0.4612.5","16.0.0-nightly.20210830":"95.0.4612.5","16.0.0-nightly.20210831":"95.0.4612.5","16.0.0-nightly.20210901":"95.0.4612.5","16.0.0-nightly.20210902":"95.0.4629.0","16.0.0-nightly.20210903":"95.0.4629.0","16.0.0-nightly.20210906":"95.0.4629.0","16.0.0-nightly.20210907":"95.0.4629.0","16.0.0-nightly.20210908":"95.0.4629.0","16.0.0-nightly.20210909":"95.0.4629.0","16.0.0-nightly.20210910":"95.0.4629.0","16.0.0-nightly.20210913":"95.0.4629.0","16.0.0-nightly.20210914":"95.0.4629.0","16.0.0-nightly.20210915":"95.0.4629.0","16.0.0-nightly.20210916":"95.0.4629.0","16.0.0-nightly.20210917":"95.0.4629.0","16.0.0-nightly.20210920":"95.0.4629.0","16.0.0-nightly.20210921":"95.0.4629.0","16.0.0-nightly.20210922":"95.0.4629.0","16.0.0":"96.0.4664.45","16.0.1":"96.0.4664.45","16.0.2":"96.0.4664.55","16.0.3":"96.0.4664.55","16.0.4":"96.0.4664.55","16.0.5":"96.0.4664.55","16.0.6":"96.0.4664.110","16.0.7":"96.0.4664.110","16.0.8":"96.0.4664.110","16.0.9":"96.0.4664.174","16.0.10":"96.0.4664.174","16.1.0":"96.0.4664.174","16.1.1":"96.0.4664.174","16.2.0":"96.0.4664.174","16.2.1":"96.0.4664.174","16.2.2":"96.0.4664.174","16.2.3":"96.0.4664.174","16.2.4":"96.0.4664.174","16.2.5":"96.0.4664.174","16.2.6":"96.0.4664.174","16.2.7":"96.0.4664.174","16.2.8":"96.0.4664.174","17.0.0-alpha.1":"96.0.4664.4","17.0.0-alpha.2":"96.0.4664.4","17.0.0-alpha.3":"96.0.4664.4","17.0.0-alpha.4":"98.0.4706.0","17.0.0-alpha.5":"98.0.4706.0","17.0.0-alpha.6":"98.0.4706.0","17.0.0-beta.1":"98.0.4706.0","17.0.0-beta.2":"98.0.4706.0","17.0.0-beta.3":"98.0.4758.9","17.0.0-beta.4":"98.0.4758.11","17.0.0-beta.5":"98.0.4758.11","17.0.0-beta.6":"98.0.4758.11","17.0.0-beta.7":"98.0.4758.11","17.0.0-beta.8":"98.0.4758.11","17.0.0-beta.9":"98.0.4758.11","17.0.0-nightly.20210923":"95.0.4629.0","17.0.0-nightly.20210924":"95.0.4629.0","17.0.0-nightly.20210927":"95.0.4629.0","17.0.0-nightly.20210928":"95.0.4629.0","17.0.0-nightly.20210929":"95.0.4629.0","17.0.0-nightly.20210930":"95.0.4629.0","17.0.0-nightly.20211001":"95.0.4629.0","17.0.0-nightly.20211004":"95.0.4629.0","17.0.0-nightly.20211005":"95.0.4629.0","17.0.0-nightly.20211006":"96.0.4647.0","17.0.0-nightly.20211007":"96.0.4647.0","17.0.0-nightly.20211008":"96.0.4647.0","17.0.0-nightly.20211011":"96.0.4647.0","17.0.0-nightly.20211012":"96.0.4647.0","17.0.0-nightly.20211013":"96.0.4647.0","17.0.0-nightly.20211014":"96.0.4647.0","17.0.0-nightly.20211015":"96.0.4647.0","17.0.0-nightly.20211018":"96.0.4647.0","17.0.0-nightly.20211019":"96.0.4647.0","17.0.0-nightly.20211020":"96.0.4647.0","17.0.0-nightly.20211021":"96.0.4647.0","17.0.0-nightly.20211022":"96.0.4664.4","17.0.0-nightly.20211025":"96.0.4664.4","17.0.0-nightly.20211026":"96.0.4664.4","17.0.0-nightly.20211027":"96.0.4664.4","17.0.0-nightly.20211028":"96.0.4664.4","17.0.0-nightly.20211029":"96.0.4664.4","17.0.0-nightly.20211101":"96.0.4664.4","17.0.0-nightly.20211102":"96.0.4664.4","17.0.0-nightly.20211103":"96.0.4664.4","17.0.0-nightly.20211104":"96.0.4664.4","17.0.0-nightly.20211105":"96.0.4664.4","17.0.0-nightly.20211108":"96.0.4664.4","17.0.0-nightly.20211109":"96.0.4664.4","17.0.0-nightly.20211110":"96.0.4664.4","17.0.0-nightly.20211111":"96.0.4664.4","17.0.0-nightly.20211112":"96.0.4664.4","17.0.0-nightly.20211115":"96.0.4664.4","17.0.0-nightly.20211116":"96.0.4664.4","17.0.0-nightly.20211117":"96.0.4664.4","17.0.0":"98.0.4758.74","17.0.1":"98.0.4758.82","17.1.0":"98.0.4758.102","17.1.1":"98.0.4758.109","17.1.2":"98.0.4758.109","17.2.0":"98.0.4758.109","17.3.0":"98.0.4758.141","17.3.1":"98.0.4758.141","17.4.0":"98.0.4758.141","17.4.1":"98.0.4758.141","17.4.2":"98.0.4758.141","17.4.3":"98.0.4758.141","17.4.4":"98.0.4758.141","17.4.5":"98.0.4758.141","17.4.6":"98.0.4758.141","17.4.7":"98.0.4758.141","17.4.8":"98.0.4758.141","17.4.9":"98.0.4758.141","17.4.10":"98.0.4758.141","17.4.11":"98.0.4758.141","18.0.0-alpha.1":"99.0.4767.0","18.0.0-alpha.2":"99.0.4767.0","18.0.0-alpha.3":"99.0.4767.0","18.0.0-alpha.4":"99.0.4767.0","18.0.0-alpha.5":"99.0.4767.0","18.0.0-beta.1":"100.0.4894.0","18.0.0-beta.2":"100.0.4894.0","18.0.0-beta.3":"100.0.4894.0","18.0.0-beta.4":"100.0.4894.0","18.0.0-beta.5":"100.0.4894.0","18.0.0-beta.6":"100.0.4894.0","18.0.0-nightly.20211118":"96.0.4664.4","18.0.0-nightly.20211119":"96.0.4664.4","18.0.0-nightly.20211122":"96.0.4664.4","18.0.0-nightly.20211123":"96.0.4664.4","18.0.0-nightly.20211124":"98.0.4706.0","18.0.0-nightly.20211125":"98.0.4706.0","18.0.0-nightly.20211126":"98.0.4706.0","18.0.0-nightly.20211129":"98.0.4706.0","18.0.0-nightly.20211130":"98.0.4706.0","18.0.0-nightly.20211201":"98.0.4706.0","18.0.0-nightly.20211202":"98.0.4706.0","18.0.0-nightly.20211203":"98.0.4706.0","18.0.0-nightly.20211206":"98.0.4706.0","18.0.0-nightly.20211207":"98.0.4706.0","18.0.0-nightly.20211208":"98.0.4706.0","18.0.0-nightly.20211209":"98.0.4706.0","18.0.0-nightly.20211210":"98.0.4706.0","18.0.0-nightly.20211213":"98.0.4706.0","18.0.0-nightly.20211214":"98.0.4706.0","18.0.0-nightly.20211215":"98.0.4706.0","18.0.0-nightly.20211216":"98.0.4706.0","18.0.0-nightly.20211217":"98.0.4706.0","18.0.0-nightly.20211220":"98.0.4706.0","18.0.0-nightly.20211221":"98.0.4706.0","18.0.0-nightly.20211222":"98.0.4706.0","18.0.0-nightly.20211223":"98.0.4706.0","18.0.0-nightly.20211228":"98.0.4706.0","18.0.0-nightly.20211229":"98.0.4706.0","18.0.0-nightly.20211231":"98.0.4706.0","18.0.0-nightly.20220103":"98.0.4706.0","18.0.0-nightly.20220104":"98.0.4706.0","18.0.0-nightly.20220105":"98.0.4706.0","18.0.0-nightly.20220106":"98.0.4706.0","18.0.0-nightly.20220107":"98.0.4706.0","18.0.0-nightly.20220110":"98.0.4706.0","18.0.0-nightly.20220111":"99.0.4767.0","18.0.0-nightly.20220112":"99.0.4767.0","18.0.0-nightly.20220113":"99.0.4767.0","18.0.0-nightly.20220114":"99.0.4767.0","18.0.0-nightly.20220117":"99.0.4767.0","18.0.0-nightly.20220118":"99.0.4767.0","18.0.0-nightly.20220119":"99.0.4767.0","18.0.0-nightly.20220121":"99.0.4767.0","18.0.0-nightly.20220124":"99.0.4767.0","18.0.0-nightly.20220125":"99.0.4767.0","18.0.0-nightly.20220127":"99.0.4767.0","18.0.0-nightly.20220128":"99.0.4767.0","18.0.0-nightly.20220131":"99.0.4767.0","18.0.0-nightly.20220201":"99.0.4767.0","18.0.0":"100.0.4896.56","18.0.1":"100.0.4896.60","18.0.2":"100.0.4896.60","18.0.3":"100.0.4896.75","18.0.4":"100.0.4896.75","18.1.0":"100.0.4896.127","18.2.0":"100.0.4896.143","18.2.1":"100.0.4896.143","18.2.2":"100.0.4896.143","18.2.3":"100.0.4896.143","18.2.4":"100.0.4896.160","18.3.0":"100.0.4896.160","18.3.1":"100.0.4896.160","18.3.2":"100.0.4896.160","18.3.3":"100.0.4896.160","18.3.4":"100.0.4896.160","18.3.5":"100.0.4896.160","18.3.6":"100.0.4896.160","18.3.7":"100.0.4896.160","18.3.8":"100.0.4896.160","18.3.9":"100.0.4896.160","18.3.11":"100.0.4896.160","18.3.12":"100.0.4896.160","18.3.13":"100.0.4896.160","18.3.14":"100.0.4896.160","18.3.15":"100.0.4896.160","19.0.0-alpha.1":"102.0.4962.3","19.0.0-alpha.2":"102.0.4971.0","19.0.0-alpha.3":"102.0.4971.0","19.0.0-alpha.4":"102.0.4989.0","19.0.0-alpha.5":"102.0.4989.0","19.0.0-beta.1":"102.0.4999.0","19.0.0-beta.2":"102.0.4999.0","19.0.0-beta.3":"102.0.4999.0","19.0.0-beta.4":"102.0.5005.27","19.0.0-beta.5":"102.0.5005.40","19.0.0-beta.6":"102.0.5005.40","19.0.0-beta.7":"102.0.5005.40","19.0.0-beta.8":"102.0.5005.49","19.0.0-nightly.20220202":"99.0.4767.0","19.0.0-nightly.20220203":"99.0.4767.0","19.0.0-nightly.20220204":"99.0.4767.0","19.0.0-nightly.20220207":"99.0.4767.0","19.0.0-nightly.20220208":"99.0.4767.0","19.0.0-nightly.20220209":"99.0.4767.0","19.0.0-nightly.20220308":"100.0.4894.0","19.0.0-nightly.20220309":"100.0.4894.0","19.0.0-nightly.20220310":"100.0.4894.0","19.0.0-nightly.20220311":"100.0.4894.0","19.0.0-nightly.20220314":"100.0.4894.0","19.0.0-nightly.20220315":"100.0.4894.0","19.0.0-nightly.20220316":"100.0.4894.0","19.0.0-nightly.20220317":"100.0.4894.0","19.0.0-nightly.20220318":"100.0.4894.0","19.0.0-nightly.20220321":"100.0.4894.0","19.0.0-nightly.20220322":"100.0.4894.0","19.0.0-nightly.20220323":"100.0.4894.0","19.0.0-nightly.20220324":"100.0.4894.0","19.0.0-nightly.20220325":"102.0.4961.0","19.0.0-nightly.20220328":"102.0.4962.3","19.0.0-nightly.20220329":"102.0.4962.3","19.0.0":"102.0.5005.61","19.0.1":"102.0.5005.61","19.0.2":"102.0.5005.63","19.0.3":"102.0.5005.63","19.0.4":"102.0.5005.63","19.0.5":"102.0.5005.115","19.0.6":"102.0.5005.115","19.0.7":"102.0.5005.134","19.0.8":"102.0.5005.148","19.0.9":"102.0.5005.167","19.0.10":"102.0.5005.167","19.0.11":"102.0.5005.167","19.0.12":"102.0.5005.167","19.0.13":"102.0.5005.167","19.0.14":"102.0.5005.167","19.0.15":"102.0.5005.167","19.0.16":"102.0.5005.167","19.0.17":"102.0.5005.167","19.1.0":"102.0.5005.167","19.1.1":"102.0.5005.167","19.1.2":"102.0.5005.167","19.1.3":"102.0.5005.167","19.1.4":"102.0.5005.167","19.1.5":"102.0.5005.167","19.1.6":"102.0.5005.167","19.1.7":"102.0.5005.167","19.1.8":"102.0.5005.167","19.1.9":"102.0.5005.167","20.0.0-alpha.1":"103.0.5044.0","20.0.0-alpha.2":"104.0.5073.0","20.0.0-alpha.3":"104.0.5073.0","20.0.0-alpha.4":"104.0.5073.0","20.0.0-alpha.5":"104.0.5073.0","20.0.0-alpha.6":"104.0.5073.0","20.0.0-alpha.7":"104.0.5073.0","20.0.0-beta.1":"104.0.5073.0","20.0.0-beta.2":"104.0.5073.0","20.0.0-beta.3":"104.0.5073.0","20.0.0-beta.4":"104.0.5073.0","20.0.0-beta.5":"104.0.5073.0","20.0.0-beta.6":"104.0.5073.0","20.0.0-beta.7":"104.0.5073.0","20.0.0-beta.8":"104.0.5073.0","20.0.0-beta.9":"104.0.5112.39","20.0.0-beta.10":"104.0.5112.48","20.0.0-beta.11":"104.0.5112.48","20.0.0-beta.12":"104.0.5112.48","20.0.0-beta.13":"104.0.5112.57","20.0.0-nightly.20220330":"102.0.4962.3","20.0.0-nightly.20220411":"102.0.4971.0","20.0.0-nightly.20220414":"102.0.4989.0","20.0.0-nightly.20220415":"102.0.4989.0","20.0.0-nightly.20220418":"102.0.4989.0","20.0.0-nightly.20220419":"102.0.4989.0","20.0.0-nightly.20220420":"102.0.4989.0","20.0.0-nightly.20220421":"102.0.4989.0","20.0.0-nightly.20220425":"102.0.4999.0","20.0.0-nightly.20220426":"102.0.4999.0","20.0.0-nightly.20220427":"102.0.4999.0","20.0.0-nightly.20220428":"102.0.4999.0","20.0.0-nightly.20220429":"102.0.4999.0","20.0.0-nightly.20220502":"102.0.4999.0","20.0.0-nightly.20220503":"102.0.4999.0","20.0.0-nightly.20220504":"102.0.4999.0","20.0.0-nightly.20220505":"102.0.4999.0","20.0.0-nightly.20220506":"102.0.4999.0","20.0.0-nightly.20220509":"102.0.4999.0","20.0.0-nightly.20220511":"102.0.4999.0","20.0.0-nightly.20220512":"102.0.4999.0","20.0.0-nightly.20220513":"102.0.4999.0","20.0.0-nightly.20220516":"102.0.4999.0","20.0.0-nightly.20220517":"102.0.4999.0","20.0.0-nightly.20220518":"103.0.5044.0","20.0.0-nightly.20220519":"103.0.5044.0","20.0.0-nightly.20220520":"103.0.5044.0","20.0.0-nightly.20220523":"103.0.5044.0","20.0.0-nightly.20220524":"103.0.5044.0","20.0.0":"104.0.5112.65","20.0.1":"104.0.5112.81","20.0.2":"104.0.5112.81","20.0.3":"104.0.5112.81","20.1.0":"104.0.5112.102","20.1.1":"104.0.5112.102","20.1.2":"104.0.5112.114","20.1.3":"104.0.5112.114","20.1.4":"104.0.5112.114","20.2.0":"104.0.5112.124","20.3.0":"104.0.5112.124","20.3.1":"104.0.5112.124","20.3.2":"104.0.5112.124","20.3.3":"104.0.5112.124","20.3.4":"104.0.5112.124","20.3.5":"104.0.5112.124","20.3.6":"104.0.5112.124","20.3.7":"104.0.5112.124","20.3.8":"104.0.5112.124","20.3.9":"104.0.5112.124","20.3.10":"104.0.5112.124","20.3.11":"104.0.5112.124","20.3.12":"104.0.5112.124","21.0.0-alpha.1":"105.0.5187.0","21.0.0-alpha.2":"105.0.5187.0","21.0.0-alpha.3":"105.0.5187.0","21.0.0-alpha.4":"105.0.5187.0","21.0.0-alpha.5":"105.0.5187.0","21.0.0-alpha.6":"106.0.5216.0","21.0.0-beta.1":"106.0.5216.0","21.0.0-beta.2":"106.0.5216.0","21.0.0-beta.3":"106.0.5216.0","21.0.0-beta.4":"106.0.5216.0","21.0.0-beta.5":"106.0.5216.0","21.0.0-beta.6":"106.0.5249.40","21.0.0-beta.7":"106.0.5249.40","21.0.0-beta.8":"106.0.5249.40","21.0.0-nightly.20220526":"103.0.5044.0","21.0.0-nightly.20220527":"103.0.5044.0","21.0.0-nightly.20220530":"103.0.5044.0","21.0.0-nightly.20220531":"103.0.5044.0","21.0.0-nightly.20220602":"104.0.5073.0","21.0.0-nightly.20220603":"104.0.5073.0","21.0.0-nightly.20220606":"104.0.5073.0","21.0.0-nightly.20220607":"104.0.5073.0","21.0.0-nightly.20220608":"104.0.5073.0","21.0.0-nightly.20220609":"104.0.5073.0","21.0.0-nightly.20220610":"104.0.5073.0","21.0.0-nightly.20220613":"104.0.5073.0","21.0.0-nightly.20220614":"104.0.5073.0","21.0.0-nightly.20220615":"104.0.5073.0","21.0.0-nightly.20220616":"104.0.5073.0","21.0.0-nightly.20220617":"104.0.5073.0","21.0.0-nightly.20220620":"104.0.5073.0","21.0.0-nightly.20220621":"104.0.5073.0","21.0.0-nightly.20220622":"104.0.5073.0","21.0.0-nightly.20220623":"104.0.5073.0","21.0.0-nightly.20220624":"104.0.5073.0","21.0.0-nightly.20220627":"104.0.5073.0","21.0.0-nightly.20220628":"105.0.5129.0","21.0.0-nightly.20220629":"105.0.5129.0","21.0.0-nightly.20220630":"105.0.5129.0","21.0.0-nightly.20220701":"105.0.5129.0","21.0.0-nightly.20220704":"105.0.5129.0","21.0.0-nightly.20220705":"105.0.5129.0","21.0.0-nightly.20220706":"105.0.5129.0","21.0.0-nightly.20220707":"105.0.5129.0","21.0.0-nightly.20220708":"105.0.5129.0","21.0.0-nightly.20220711":"105.0.5129.0","21.0.0-nightly.20220712":"105.0.5129.0","21.0.0-nightly.20220713":"105.0.5129.0","21.0.0-nightly.20220715":"105.0.5173.0","21.0.0-nightly.20220718":"105.0.5173.0","21.0.0-nightly.20220719":"105.0.5173.0","21.0.0-nightly.20220720":"105.0.5187.0","21.0.0-nightly.20220721":"105.0.5187.0","21.0.0-nightly.20220722":"105.0.5187.0","21.0.0-nightly.20220725":"105.0.5187.0","21.0.0-nightly.20220726":"105.0.5187.0","21.0.0-nightly.20220727":"105.0.5187.0","21.0.0-nightly.20220728":"105.0.5187.0","21.0.0-nightly.20220801":"105.0.5187.0","21.0.0-nightly.20220802":"105.0.5187.0","21.0.0":"106.0.5249.51","21.0.1":"106.0.5249.61","21.1.0":"106.0.5249.91","21.1.1":"106.0.5249.103","21.2.0":"106.0.5249.119","21.2.1":"106.0.5249.165","21.2.2":"106.0.5249.168","21.2.3":"106.0.5249.168","21.3.0":"106.0.5249.181","21.3.1":"106.0.5249.181","21.3.3":"106.0.5249.199","21.3.4":"106.0.5249.199","21.3.5":"106.0.5249.199","21.4.0":"106.0.5249.199","21.4.1":"106.0.5249.199","21.4.2":"106.0.5249.199","21.4.3":"106.0.5249.199","21.4.4":"106.0.5249.199","22.0.0-alpha.1":"107.0.5286.0","22.0.0-alpha.3":"108.0.5329.0","22.0.0-alpha.4":"108.0.5329.0","22.0.0-alpha.5":"108.0.5329.0","22.0.0-alpha.6":"108.0.5329.0","22.0.0-alpha.7":"108.0.5355.0","22.0.0-alpha.8":"108.0.5359.10","22.0.0-beta.1":"108.0.5359.10","22.0.0-beta.2":"108.0.5359.10","22.0.0-beta.3":"108.0.5359.10","22.0.0-beta.4":"108.0.5359.29","22.0.0-beta.5":"108.0.5359.40","22.0.0-beta.6":"108.0.5359.40","22.0.0-beta.7":"108.0.5359.48","22.0.0-beta.8":"108.0.5359.48","22.0.0-nightly.20220808":"105.0.5187.0","22.0.0-nightly.20220809":"105.0.5187.0","22.0.0-nightly.20220810":"105.0.5187.0","22.0.0-nightly.20220811":"105.0.5187.0","22.0.0-nightly.20220812":"105.0.5187.0","22.0.0-nightly.20220815":"105.0.5187.0","22.0.0-nightly.20220816":"105.0.5187.0","22.0.0-nightly.20220817":"105.0.5187.0","22.0.0-nightly.20220822":"106.0.5216.0","22.0.0-nightly.20220823":"106.0.5216.0","22.0.0-nightly.20220824":"106.0.5216.0","22.0.0-nightly.20220825":"106.0.5216.0","22.0.0-nightly.20220829":"106.0.5216.0","22.0.0-nightly.20220830":"106.0.5216.0","22.0.0-nightly.20220831":"106.0.5216.0","22.0.0-nightly.20220901":"106.0.5216.0","22.0.0-nightly.20220902":"106.0.5216.0","22.0.0-nightly.20220905":"106.0.5216.0","22.0.0-nightly.20220908":"107.0.5274.0","22.0.0-nightly.20220909":"107.0.5286.0","22.0.0-nightly.20220912":"107.0.5286.0","22.0.0-nightly.20220913":"107.0.5286.0","22.0.0-nightly.20220914":"107.0.5286.0","22.0.0-nightly.20220915":"107.0.5286.0","22.0.0-nightly.20220916":"107.0.5286.0","22.0.0-nightly.20220919":"107.0.5286.0","22.0.0-nightly.20220920":"107.0.5286.0","22.0.0-nightly.20220921":"107.0.5286.0","22.0.0-nightly.20220922":"107.0.5286.0","22.0.0-nightly.20220923":"107.0.5286.0","22.0.0-nightly.20220926":"107.0.5286.0","22.0.0-nightly.20220927":"107.0.5286.0","22.0.0-nightly.20220928":"107.0.5286.0","22.0.0":"108.0.5359.62","22.0.1":"108.0.5359.125","22.0.2":"108.0.5359.179","22.0.3":"108.0.5359.179","22.1.0":"108.0.5359.179","22.2.0":"108.0.5359.215","22.2.1":"108.0.5359.215","22.3.0":"108.0.5359.215","22.3.1":"108.0.5359.215","22.3.2":"108.0.5359.215","22.3.3":"108.0.5359.215","22.3.4":"108.0.5359.215","22.3.5":"108.0.5359.215","22.3.6":"108.0.5359.215","22.3.7":"108.0.5359.215","22.3.8":"108.0.5359.215","22.3.9":"108.0.5359.215","22.3.10":"108.0.5359.215","22.3.11":"108.0.5359.215","22.3.12":"108.0.5359.215","22.3.13":"108.0.5359.215","22.3.14":"108.0.5359.215","22.3.15":"108.0.5359.215","22.3.16":"108.0.5359.215","22.3.17":"108.0.5359.215","22.3.18":"108.0.5359.215","22.3.20":"108.0.5359.215","22.3.21":"108.0.5359.215","22.3.22":"108.0.5359.215","22.3.23":"108.0.5359.215","22.3.24":"108.0.5359.215","22.3.25":"108.0.5359.215","22.3.26":"108.0.5359.215","22.3.27":"108.0.5359.215","23.0.0-alpha.1":"110.0.5415.0","23.0.0-alpha.2":"110.0.5451.0","23.0.0-alpha.3":"110.0.5451.0","23.0.0-beta.1":"110.0.5478.5","23.0.0-beta.2":"110.0.5478.5","23.0.0-beta.3":"110.0.5478.5","23.0.0-beta.4":"110.0.5481.30","23.0.0-beta.5":"110.0.5481.38","23.0.0-beta.6":"110.0.5481.52","23.0.0-beta.8":"110.0.5481.52","23.0.0-nightly.20220929":"107.0.5286.0","23.0.0-nightly.20220930":"107.0.5286.0","23.0.0-nightly.20221003":"107.0.5286.0","23.0.0-nightly.20221004":"108.0.5329.0","23.0.0-nightly.20221005":"108.0.5329.0","23.0.0-nightly.20221006":"108.0.5329.0","23.0.0-nightly.20221007":"108.0.5329.0","23.0.0-nightly.20221010":"108.0.5329.0","23.0.0-nightly.20221011":"108.0.5329.0","23.0.0-nightly.20221012":"108.0.5329.0","23.0.0-nightly.20221013":"108.0.5329.0","23.0.0-nightly.20221014":"108.0.5329.0","23.0.0-nightly.20221017":"108.0.5329.0","23.0.0-nightly.20221018":"108.0.5355.0","23.0.0-nightly.20221019":"108.0.5355.0","23.0.0-nightly.20221020":"108.0.5355.0","23.0.0-nightly.20221021":"108.0.5355.0","23.0.0-nightly.20221024":"108.0.5355.0","23.0.0-nightly.20221026":"108.0.5355.0","23.0.0-nightly.20221027":"109.0.5382.0","23.0.0-nightly.20221028":"109.0.5382.0","23.0.0-nightly.20221031":"109.0.5382.0","23.0.0-nightly.20221101":"109.0.5382.0","23.0.0-nightly.20221102":"109.0.5382.0","23.0.0-nightly.20221103":"109.0.5382.0","23.0.0-nightly.20221104":"109.0.5382.0","23.0.0-nightly.20221107":"109.0.5382.0","23.0.0-nightly.20221108":"109.0.5382.0","23.0.0-nightly.20221109":"109.0.5382.0","23.0.0-nightly.20221110":"109.0.5382.0","23.0.0-nightly.20221111":"109.0.5382.0","23.0.0-nightly.20221114":"109.0.5382.0","23.0.0-nightly.20221115":"109.0.5382.0","23.0.0-nightly.20221116":"109.0.5382.0","23.0.0-nightly.20221117":"109.0.5382.0","23.0.0-nightly.20221118":"110.0.5415.0","23.0.0-nightly.20221121":"110.0.5415.0","23.0.0-nightly.20221122":"110.0.5415.0","23.0.0-nightly.20221123":"110.0.5415.0","23.0.0-nightly.20221124":"110.0.5415.0","23.0.0-nightly.20221125":"110.0.5415.0","23.0.0-nightly.20221128":"110.0.5415.0","23.0.0-nightly.20221129":"110.0.5415.0","23.0.0-nightly.20221130":"110.0.5415.0","23.0.0":"110.0.5481.77","23.1.0":"110.0.5481.100","23.1.1":"110.0.5481.104","23.1.2":"110.0.5481.177","23.1.3":"110.0.5481.179","23.1.4":"110.0.5481.192","23.2.0":"110.0.5481.192","23.2.1":"110.0.5481.208","23.2.2":"110.0.5481.208","23.2.3":"110.0.5481.208","23.2.4":"110.0.5481.208","23.3.0":"110.0.5481.208","23.3.1":"110.0.5481.208","23.3.2":"110.0.5481.208","23.3.3":"110.0.5481.208","23.3.4":"110.0.5481.208","23.3.5":"110.0.5481.208","23.3.6":"110.0.5481.208","23.3.7":"110.0.5481.208","23.3.8":"110.0.5481.208","23.3.9":"110.0.5481.208","23.3.10":"110.0.5481.208","23.3.11":"110.0.5481.208","23.3.12":"110.0.5481.208","23.3.13":"110.0.5481.208","24.0.0-alpha.1":"111.0.5560.0","24.0.0-alpha.2":"111.0.5560.0","24.0.0-alpha.3":"111.0.5560.0","24.0.0-alpha.4":"111.0.5560.0","24.0.0-alpha.5":"111.0.5560.0","24.0.0-alpha.6":"111.0.5560.0","24.0.0-alpha.7":"111.0.5560.0","24.0.0-beta.1":"111.0.5563.50","24.0.0-beta.2":"111.0.5563.50","24.0.0-beta.3":"112.0.5615.20","24.0.0-beta.4":"112.0.5615.20","24.0.0-beta.5":"112.0.5615.29","24.0.0-beta.6":"112.0.5615.39","24.0.0-beta.7":"112.0.5615.39","24.0.0-nightly.20221201":"110.0.5415.0","24.0.0-nightly.20221202":"110.0.5415.0","24.0.0-nightly.20221205":"110.0.5415.0","24.0.0-nightly.20221206":"110.0.5451.0","24.0.0-nightly.20221207":"110.0.5451.0","24.0.0-nightly.20221208":"110.0.5451.0","24.0.0-nightly.20221213":"110.0.5451.0","24.0.0-nightly.20221214":"110.0.5451.0","24.0.0-nightly.20221215":"110.0.5451.0","24.0.0-nightly.20221216":"110.0.5451.0","24.0.0-nightly.20230109":"111.0.5518.0","24.0.0-nightly.20230110":"111.0.5518.0","24.0.0-nightly.20230111":"111.0.5518.0","24.0.0-nightly.20230112":"111.0.5518.0","24.0.0-nightly.20230113":"111.0.5518.0","24.0.0-nightly.20230116":"111.0.5518.0","24.0.0-nightly.20230117":"111.0.5518.0","24.0.0-nightly.20230118":"111.0.5518.0","24.0.0-nightly.20230119":"111.0.5518.0","24.0.0-nightly.20230120":"111.0.5518.0","24.0.0-nightly.20230123":"111.0.5518.0","24.0.0-nightly.20230124":"111.0.5518.0","24.0.0-nightly.20230125":"111.0.5518.0","24.0.0-nightly.20230126":"111.0.5518.0","24.0.0-nightly.20230127":"111.0.5518.0","24.0.0-nightly.20230131":"111.0.5518.0","24.0.0-nightly.20230201":"111.0.5518.0","24.0.0-nightly.20230202":"111.0.5518.0","24.0.0-nightly.20230203":"111.0.5560.0","24.0.0-nightly.20230206":"111.0.5560.0","24.0.0-nightly.20230207":"111.0.5560.0","24.0.0-nightly.20230208":"111.0.5560.0","24.0.0-nightly.20230209":"111.0.5560.0","24.0.0":"112.0.5615.49","24.1.0":"112.0.5615.50","24.1.1":"112.0.5615.50","24.1.2":"112.0.5615.87","24.1.3":"112.0.5615.165","24.2.0":"112.0.5615.165","24.3.0":"112.0.5615.165","24.3.1":"112.0.5615.183","24.4.0":"112.0.5615.204","24.4.1":"112.0.5615.204","24.5.0":"112.0.5615.204","24.5.1":"112.0.5615.204","24.6.0":"112.0.5615.204","24.6.1":"112.0.5615.204","24.6.2":"112.0.5615.204","24.6.3":"112.0.5615.204","24.6.4":"112.0.5615.204","24.6.5":"112.0.5615.204","24.7.0":"112.0.5615.204","24.7.1":"112.0.5615.204","24.8.0":"112.0.5615.204","24.8.1":"112.0.5615.204","24.8.2":"112.0.5615.204","24.8.3":"112.0.5615.204","24.8.4":"112.0.5615.204","24.8.5":"112.0.5615.204","24.8.6":"112.0.5615.204","24.8.7":"112.0.5615.204","25.0.0-alpha.1":"114.0.5694.0","25.0.0-alpha.2":"114.0.5694.0","25.0.0-alpha.3":"114.0.5710.0","25.0.0-alpha.4":"114.0.5710.0","25.0.0-alpha.5":"114.0.5719.0","25.0.0-alpha.6":"114.0.5719.0","25.0.0-beta.1":"114.0.5719.0","25.0.0-beta.2":"114.0.5719.0","25.0.0-beta.3":"114.0.5719.0","25.0.0-beta.4":"114.0.5735.16","25.0.0-beta.5":"114.0.5735.16","25.0.0-beta.6":"114.0.5735.16","25.0.0-beta.7":"114.0.5735.16","25.0.0-beta.8":"114.0.5735.35","25.0.0-beta.9":"114.0.5735.45","25.0.0-nightly.20230210":"111.0.5560.0","25.0.0-nightly.20230214":"111.0.5560.0","25.0.0-nightly.20230215":"111.0.5560.0","25.0.0-nightly.20230216":"111.0.5560.0","25.0.0-nightly.20230217":"111.0.5560.0","25.0.0-nightly.20230220":"111.0.5560.0","25.0.0-nightly.20230221":"111.0.5560.0","25.0.0-nightly.20230222":"111.0.5560.0","25.0.0-nightly.20230223":"111.0.5560.0","25.0.0-nightly.20230224":"111.0.5560.0","25.0.0-nightly.20230227":"111.0.5560.0","25.0.0-nightly.20230228":"111.0.5560.0","25.0.0-nightly.20230301":"111.0.5560.0","25.0.0-nightly.20230302":"111.0.5560.0","25.0.0-nightly.20230303":"111.0.5560.0","25.0.0-nightly.20230306":"111.0.5560.0","25.0.0-nightly.20230307":"111.0.5560.0","25.0.0-nightly.20230308":"111.0.5560.0","25.0.0-nightly.20230309":"111.0.5560.0","25.0.0-nightly.20230310":"111.0.5560.0","25.0.0-nightly.20230314":"113.0.5636.0","25.0.0-nightly.20230315":"113.0.5651.0","25.0.0-nightly.20230317":"113.0.5653.0","25.0.0-nightly.20230320":"113.0.5660.0","25.0.0-nightly.20230321":"113.0.5664.0","25.0.0-nightly.20230322":"113.0.5666.0","25.0.0-nightly.20230323":"113.0.5668.0","25.0.0-nightly.20230324":"113.0.5670.0","25.0.0-nightly.20230327":"113.0.5670.0","25.0.0-nightly.20230328":"113.0.5670.0","25.0.0-nightly.20230329":"113.0.5670.0","25.0.0-nightly.20230330":"113.0.5670.0","25.0.0-nightly.20230331":"114.0.5684.0","25.0.0-nightly.20230403":"114.0.5684.0","25.0.0-nightly.20230404":"114.0.5692.0","25.0.0-nightly.20230405":"114.0.5694.0","25.0.0":"114.0.5735.45","25.0.1":"114.0.5735.45","25.1.0":"114.0.5735.106","25.1.1":"114.0.5735.106","25.2.0":"114.0.5735.134","25.3.0":"114.0.5735.199","25.3.1":"114.0.5735.243","25.3.2":"114.0.5735.248","25.4.0":"114.0.5735.248","25.5.0":"114.0.5735.289","25.6.0":"114.0.5735.289","25.7.0":"114.0.5735.289","25.8.0":"114.0.5735.289","25.8.1":"114.0.5735.289","25.8.2":"114.0.5735.289","25.8.3":"114.0.5735.289","25.8.4":"114.0.5735.289","25.9.0":"114.0.5735.289","26.0.0-alpha.1":"116.0.5791.0","26.0.0-alpha.2":"116.0.5791.0","26.0.0-alpha.3":"116.0.5791.0","26.0.0-alpha.4":"116.0.5791.0","26.0.0-alpha.5":"116.0.5791.0","26.0.0-alpha.6":"116.0.5815.0","26.0.0-alpha.7":"116.0.5831.0","26.0.0-alpha.8":"116.0.5845.0","26.0.0-beta.1":"116.0.5845.0","26.0.0-beta.2":"116.0.5845.14","26.0.0-beta.3":"116.0.5845.14","26.0.0-beta.4":"116.0.5845.14","26.0.0-beta.5":"116.0.5845.14","26.0.0-beta.6":"116.0.5845.14","26.0.0-beta.7":"116.0.5845.14","26.0.0-beta.8":"116.0.5845.42","26.0.0-beta.9":"116.0.5845.42","26.0.0-beta.10":"116.0.5845.49","26.0.0-beta.11":"116.0.5845.49","26.0.0-beta.12":"116.0.5845.62","26.0.0-nightly.20230406":"114.0.5694.0","26.0.0-nightly.20230407":"114.0.5694.0","26.0.0-nightly.20230410":"114.0.5694.0","26.0.0-nightly.20230411":"114.0.5694.0","26.0.0-nightly.20230412":"114.0.5708.0","26.0.0-nightly.20230413":"114.0.5710.0","26.0.0-nightly.20230414":"114.0.5710.0","26.0.0-nightly.20230417":"114.0.5710.0","26.0.0-nightly.20230418":"114.0.5715.0","26.0.0-nightly.20230421":"114.0.5719.0","26.0.0-nightly.20230424":"114.0.5719.0","26.0.0-nightly.20230425":"114.0.5719.0","26.0.0-nightly.20230426":"114.0.5719.0","26.0.0-nightly.20230427":"114.0.5719.0","26.0.0-nightly.20230428":"114.0.5719.0","26.0.0-nightly.20230501":"114.0.5719.0","26.0.0-nightly.20230502":"114.0.5719.0","26.0.0-nightly.20230503":"114.0.5719.0","26.0.0-nightly.20230504":"114.0.5719.0","26.0.0-nightly.20230505":"114.0.5719.0","26.0.0-nightly.20230508":"114.0.5719.0","26.0.0-nightly.20230509":"114.0.5719.0","26.0.0-nightly.20230510":"114.0.5719.0","26.0.0-nightly.20230511":"115.0.5760.0","26.0.0-nightly.20230512":"115.0.5760.0","26.0.0-nightly.20230515":"115.0.5760.0","26.0.0-nightly.20230516":"115.0.5760.0","26.0.0-nightly.20230517":"115.0.5760.0","26.0.0-nightly.20230518":"115.0.5760.0","26.0.0-nightly.20230519":"115.0.5760.0","26.0.0-nightly.20230522":"115.0.5760.0","26.0.0-nightly.20230523":"115.0.5760.0","26.0.0-nightly.20230524":"115.0.5786.0","26.0.0-nightly.20230525":"115.0.5790.0","26.0.0-nightly.20230526":"116.0.5791.0","26.0.0-nightly.20230529":"116.0.5791.0","26.0.0-nightly.20230530":"116.0.5791.0","26.0.0-nightly.20230531":"116.0.5791.0","26.0.0":"116.0.5845.82","26.1.0":"116.0.5845.97","26.2.0":"116.0.5845.179","26.2.1":"116.0.5845.188","26.2.2":"116.0.5845.190","26.2.3":"116.0.5845.190","26.2.4":"116.0.5845.190","26.3.0":"116.0.5845.228","27.0.0-alpha.1":"118.0.5949.0","27.0.0-alpha.2":"118.0.5949.0","27.0.0-alpha.3":"118.0.5949.0","27.0.0-alpha.4":"118.0.5949.0","27.0.0-alpha.5":"118.0.5949.0","27.0.0-alpha.6":"118.0.5949.0","27.0.0-beta.1":"118.0.5993.5","27.0.0-beta.2":"118.0.5993.5","27.0.0-beta.3":"118.0.5993.5","27.0.0-beta.4":"118.0.5993.11","27.0.0-beta.5":"118.0.5993.18","27.0.0-beta.6":"118.0.5993.18","27.0.0-beta.7":"118.0.5993.18","27.0.0-beta.8":"118.0.5993.18","27.0.0-beta.9":"118.0.5993.18","27.0.0-nightly.20230601":"116.0.5791.0","27.0.0-nightly.20230602":"116.0.5791.0","27.0.0-nightly.20230605":"116.0.5791.0","27.0.0-nightly.20230606":"116.0.5791.0","27.0.0-nightly.20230607":"116.0.5791.0","27.0.0-nightly.20230609":"116.0.5791.0","27.0.0-nightly.20230612":"116.0.5815.0","27.0.0-nightly.20230613":"116.0.5815.0","27.0.0-nightly.20230614":"116.0.5829.0","27.0.0-nightly.20230615":"116.0.5831.0","27.0.0-nightly.20230616":"116.0.5833.0","27.0.0-nightly.20230619":"116.0.5833.0","27.0.0-nightly.20230620":"116.0.5833.0","27.0.0-nightly.20230621":"116.0.5833.0","27.0.0-nightly.20230622":"116.0.5845.0","27.0.0-nightly.20230623":"116.0.5845.0","27.0.0-nightly.20230626":"116.0.5845.0","27.0.0-nightly.20230627":"116.0.5845.0","27.0.0-nightly.20230628":"116.0.5845.0","27.0.0-nightly.20230629":"116.0.5845.0","27.0.0-nightly.20230630":"116.0.5845.0","27.0.0-nightly.20230703":"117.0.5852.0","27.0.0-nightly.20230704":"117.0.5852.0","27.0.0-nightly.20230705":"117.0.5852.0","27.0.0-nightly.20230706":"117.0.5852.0","27.0.0-nightly.20230707":"117.0.5852.0","27.0.0-nightly.20230710":"117.0.5852.0","27.0.0-nightly.20230711":"117.0.5852.0","27.0.0-nightly.20230712":"117.0.5852.0","27.0.0-nightly.20230713":"117.0.5852.0","27.0.0-nightly.20230714":"117.0.5852.0","27.0.0-nightly.20230717":"117.0.5884.1","27.0.0-nightly.20230718":"117.0.5884.1","27.0.0-nightly.20230719":"117.0.5892.0","27.0.0-nightly.20230720":"117.0.5897.0","27.0.0-nightly.20230721":"117.0.5897.0","27.0.0-nightly.20230724":"117.0.5897.0","27.0.0-nightly.20230725":"117.0.5897.0","27.0.0-nightly.20230726":"117.0.5897.0","27.0.0-nightly.20230727":"117.0.5897.0","27.0.0-nightly.20230728":"117.0.5897.0","27.0.0-nightly.20230731":"117.0.5897.0","27.0.0-nightly.20230801":"117.0.5911.0","27.0.0-nightly.20230802":"117.0.5911.0","27.0.0-nightly.20230803":"117.0.5911.0","27.0.0-nightly.20230804":"117.0.5921.0","27.0.0-nightly.20230807":"117.0.5921.0","27.0.0-nightly.20230808":"117.0.5921.0","27.0.0-nightly.20230814":"117.0.5921.0","27.0.0-nightly.20230815":"117.0.5921.0","27.0.0-nightly.20230816":"118.0.5949.0","27.0.0":"118.0.5993.54","28.0.0-nightly.20230817":"118.0.5949.0","28.0.0-nightly.20230818":"118.0.5949.0","28.0.0-nightly.20230821":"118.0.5949.0","28.0.0-nightly.20230822":"118.0.5949.0","28.0.0-nightly.20230823":"118.0.5949.0","28.0.0-nightly.20230824":"118.0.5949.0","28.0.0-nightly.20230825":"118.0.5949.0","28.0.0-nightly.20230828":"118.0.5949.0","28.0.0-nightly.20230829":"118.0.5949.0","28.0.0-nightly.20230830":"118.0.5949.0","28.0.0-nightly.20230831":"118.0.5949.0","28.0.0-nightly.20230906":"118.0.5991.0","28.0.0-nightly.20230907":"118.0.5993.0","28.0.0-nightly.20230908":"118.0.5993.0","28.0.0-nightly.20230911":"118.0.5993.0","28.0.0-nightly.20230912":"118.0.5993.0","28.0.0-nightly.20230913":"118.0.5993.0","28.0.0-nightly.20230914":"118.0.5993.0","28.0.0-nightly.20230915":"118.0.5993.0","28.0.0-nightly.20230919":"119.0.6006.0","28.0.0-nightly.20230920":"119.0.6017.0","28.0.0-nightly.20230921":"119.0.6019.2","28.0.0-nightly.20230925":"119.0.6019.2","28.0.0-nightly.20230926":"119.0.6019.2","28.0.0-nightly.20230927":"119.0.6019.2","28.0.0-nightly.20230928":"119.0.6019.2","28.0.0-nightly.20230929":"119.0.6029.0","28.0.0-nightly.20231002":"119.0.6029.0","28.0.0-nightly.20231003":"119.0.6043.0","28.0.0-nightly.20231004":"119.0.6043.0","28.0.0-nightly.20231005":"119.0.6043.0","28.0.0-nightly.20231006":"119.0.6045.0","28.0.0-nightly.20231009":"119.0.6045.0","28.0.0-nightly.20231010":"119.0.6045.0"}
    \ No newline at end of file
    +{"0.20.0":"39.0.2171.65","0.20.1":"39.0.2171.65","0.20.2":"39.0.2171.65","0.20.3":"39.0.2171.65","0.20.4":"39.0.2171.65","0.20.5":"39.0.2171.65","0.20.6":"39.0.2171.65","0.20.7":"39.0.2171.65","0.20.8":"39.0.2171.65","0.21.0":"40.0.2214.91","0.21.1":"40.0.2214.91","0.21.2":"40.0.2214.91","0.21.3":"41.0.2272.76","0.22.1":"41.0.2272.76","0.22.2":"41.0.2272.76","0.22.3":"41.0.2272.76","0.23.0":"41.0.2272.76","0.24.0":"41.0.2272.76","0.25.0":"42.0.2311.107","0.25.1":"42.0.2311.107","0.25.2":"42.0.2311.107","0.25.3":"42.0.2311.107","0.26.0":"42.0.2311.107","0.26.1":"42.0.2311.107","0.27.0":"42.0.2311.107","0.27.1":"42.0.2311.107","0.27.2":"43.0.2357.65","0.27.3":"43.0.2357.65","0.28.0":"43.0.2357.65","0.28.1":"43.0.2357.65","0.28.2":"43.0.2357.65","0.28.3":"43.0.2357.65","0.29.1":"43.0.2357.65","0.29.2":"43.0.2357.65","0.30.4":"44.0.2403.125","0.31.0":"44.0.2403.125","0.31.2":"45.0.2454.85","0.32.2":"45.0.2454.85","0.32.3":"45.0.2454.85","0.33.0":"45.0.2454.85","0.33.1":"45.0.2454.85","0.33.2":"45.0.2454.85","0.33.3":"45.0.2454.85","0.33.4":"45.0.2454.85","0.33.6":"45.0.2454.85","0.33.7":"45.0.2454.85","0.33.8":"45.0.2454.85","0.33.9":"45.0.2454.85","0.34.0":"45.0.2454.85","0.34.1":"45.0.2454.85","0.34.2":"45.0.2454.85","0.34.3":"45.0.2454.85","0.34.4":"45.0.2454.85","0.35.1":"45.0.2454.85","0.35.2":"45.0.2454.85","0.35.3":"45.0.2454.85","0.35.4":"45.0.2454.85","0.35.5":"45.0.2454.85","0.36.0":"47.0.2526.73","0.36.2":"47.0.2526.73","0.36.3":"47.0.2526.73","0.36.4":"47.0.2526.73","0.36.5":"47.0.2526.110","0.36.6":"47.0.2526.110","0.36.7":"47.0.2526.110","0.36.8":"47.0.2526.110","0.36.9":"47.0.2526.110","0.36.10":"47.0.2526.110","0.36.11":"47.0.2526.110","0.36.12":"47.0.2526.110","0.37.0":"49.0.2623.75","0.37.1":"49.0.2623.75","0.37.3":"49.0.2623.75","0.37.4":"49.0.2623.75","0.37.5":"49.0.2623.75","0.37.6":"49.0.2623.75","0.37.7":"49.0.2623.75","0.37.8":"49.0.2623.75","1.0.0":"49.0.2623.75","1.0.1":"49.0.2623.75","1.0.2":"49.0.2623.75","1.1.0":"50.0.2661.102","1.1.1":"50.0.2661.102","1.1.2":"50.0.2661.102","1.1.3":"50.0.2661.102","1.2.0":"51.0.2704.63","1.2.1":"51.0.2704.63","1.2.2":"51.0.2704.84","1.2.3":"51.0.2704.84","1.2.4":"51.0.2704.103","1.2.5":"51.0.2704.103","1.2.6":"51.0.2704.106","1.2.7":"51.0.2704.106","1.2.8":"51.0.2704.106","1.3.0":"52.0.2743.82","1.3.1":"52.0.2743.82","1.3.2":"52.0.2743.82","1.3.3":"52.0.2743.82","1.3.4":"52.0.2743.82","1.3.5":"52.0.2743.82","1.3.6":"52.0.2743.82","1.3.7":"52.0.2743.82","1.3.9":"52.0.2743.82","1.3.10":"52.0.2743.82","1.3.13":"52.0.2743.82","1.3.14":"52.0.2743.82","1.3.15":"52.0.2743.82","1.4.0":"53.0.2785.113","1.4.1":"53.0.2785.113","1.4.2":"53.0.2785.113","1.4.3":"53.0.2785.113","1.4.4":"53.0.2785.113","1.4.5":"53.0.2785.113","1.4.6":"53.0.2785.143","1.4.7":"53.0.2785.143","1.4.8":"53.0.2785.143","1.4.10":"53.0.2785.143","1.4.11":"53.0.2785.143","1.4.12":"54.0.2840.51","1.4.13":"53.0.2785.143","1.4.14":"53.0.2785.143","1.4.15":"53.0.2785.143","1.4.16":"53.0.2785.143","1.5.0":"54.0.2840.101","1.5.1":"54.0.2840.101","1.6.0":"56.0.2924.87","1.6.1":"56.0.2924.87","1.6.2":"56.0.2924.87","1.6.3":"56.0.2924.87","1.6.4":"56.0.2924.87","1.6.5":"56.0.2924.87","1.6.6":"56.0.2924.87","1.6.7":"56.0.2924.87","1.6.8":"56.0.2924.87","1.6.9":"56.0.2924.87","1.6.10":"56.0.2924.87","1.6.11":"56.0.2924.87","1.6.12":"56.0.2924.87","1.6.13":"56.0.2924.87","1.6.14":"56.0.2924.87","1.6.15":"56.0.2924.87","1.6.16":"56.0.2924.87","1.6.17":"56.0.2924.87","1.6.18":"56.0.2924.87","1.7.0":"58.0.3029.110","1.7.1":"58.0.3029.110","1.7.2":"58.0.3029.110","1.7.3":"58.0.3029.110","1.7.4":"58.0.3029.110","1.7.5":"58.0.3029.110","1.7.6":"58.0.3029.110","1.7.7":"58.0.3029.110","1.7.8":"58.0.3029.110","1.7.9":"58.0.3029.110","1.7.10":"58.0.3029.110","1.7.11":"58.0.3029.110","1.7.12":"58.0.3029.110","1.7.13":"58.0.3029.110","1.7.14":"58.0.3029.110","1.7.15":"58.0.3029.110","1.7.16":"58.0.3029.110","1.8.0":"59.0.3071.115","1.8.1":"59.0.3071.115","1.8.2-beta.1":"59.0.3071.115","1.8.2-beta.2":"59.0.3071.115","1.8.2-beta.3":"59.0.3071.115","1.8.2-beta.4":"59.0.3071.115","1.8.2-beta.5":"59.0.3071.115","1.8.2":"59.0.3071.115","1.8.3":"59.0.3071.115","1.8.4":"59.0.3071.115","1.8.5":"59.0.3071.115","1.8.6":"59.0.3071.115","1.8.7":"59.0.3071.115","1.8.8":"59.0.3071.115","2.0.0-beta.1":"61.0.3163.100","2.0.0-beta.2":"61.0.3163.100","2.0.0-beta.3":"61.0.3163.100","2.0.0-beta.4":"61.0.3163.100","2.0.0-beta.5":"61.0.3163.100","2.0.0-beta.6":"61.0.3163.100","2.0.0-beta.7":"61.0.3163.100","2.0.0-beta.8":"61.0.3163.100","2.0.0":"61.0.3163.100","2.0.1":"61.0.3163.100","2.0.2":"61.0.3163.100","2.0.3":"61.0.3163.100","2.0.4":"61.0.3163.100","2.0.5":"61.0.3163.100","2.0.6":"61.0.3163.100","2.0.7":"61.0.3163.100","2.0.8-nightly.20180819":"61.0.3163.100","2.0.8-nightly.20180820":"61.0.3163.100","2.0.8":"61.0.3163.100","2.0.9":"61.0.3163.100","2.0.10":"61.0.3163.100","2.0.11":"61.0.3163.100","2.0.12":"61.0.3163.100","2.0.13":"61.0.3163.100","2.0.14":"61.0.3163.100","2.0.15":"61.0.3163.100","2.0.16":"61.0.3163.100","2.0.17":"61.0.3163.100","2.0.18":"61.0.3163.100","2.1.0-unsupported.20180809":"61.0.3163.100","3.0.0-beta.1":"66.0.3359.181","3.0.0-beta.2":"66.0.3359.181","3.0.0-beta.3":"66.0.3359.181","3.0.0-beta.4":"66.0.3359.181","3.0.0-beta.5":"66.0.3359.181","3.0.0-beta.6":"66.0.3359.181","3.0.0-beta.7":"66.0.3359.181","3.0.0-beta.8":"66.0.3359.181","3.0.0-beta.9":"66.0.3359.181","3.0.0-beta.10":"66.0.3359.181","3.0.0-beta.11":"66.0.3359.181","3.0.0-beta.12":"66.0.3359.181","3.0.0-beta.13":"66.0.3359.181","3.0.0-nightly.20180818":"66.0.3359.181","3.0.0-nightly.20180821":"66.0.3359.181","3.0.0-nightly.20180823":"66.0.3359.181","3.0.0-nightly.20180904":"66.0.3359.181","3.0.0":"66.0.3359.181","3.0.1":"66.0.3359.181","3.0.2":"66.0.3359.181","3.0.3":"66.0.3359.181","3.0.4":"66.0.3359.181","3.0.5":"66.0.3359.181","3.0.6":"66.0.3359.181","3.0.7":"66.0.3359.181","3.0.8":"66.0.3359.181","3.0.9":"66.0.3359.181","3.0.10":"66.0.3359.181","3.0.11":"66.0.3359.181","3.0.12":"66.0.3359.181","3.0.13":"66.0.3359.181","3.0.14":"66.0.3359.181","3.0.15":"66.0.3359.181","3.0.16":"66.0.3359.181","3.1.0-beta.1":"66.0.3359.181","3.1.0-beta.2":"66.0.3359.181","3.1.0-beta.3":"66.0.3359.181","3.1.0-beta.4":"66.0.3359.181","3.1.0-beta.5":"66.0.3359.181","3.1.0":"66.0.3359.181","3.1.1":"66.0.3359.181","3.1.2":"66.0.3359.181","3.1.3":"66.0.3359.181","3.1.4":"66.0.3359.181","3.1.5":"66.0.3359.181","3.1.6":"66.0.3359.181","3.1.7":"66.0.3359.181","3.1.8":"66.0.3359.181","3.1.9":"66.0.3359.181","3.1.10":"66.0.3359.181","3.1.11":"66.0.3359.181","3.1.12":"66.0.3359.181","3.1.13":"66.0.3359.181","4.0.0-beta.1":"69.0.3497.106","4.0.0-beta.2":"69.0.3497.106","4.0.0-beta.3":"69.0.3497.106","4.0.0-beta.4":"69.0.3497.106","4.0.0-beta.5":"69.0.3497.106","4.0.0-beta.6":"69.0.3497.106","4.0.0-beta.7":"69.0.3497.106","4.0.0-beta.8":"69.0.3497.106","4.0.0-beta.9":"69.0.3497.106","4.0.0-beta.10":"69.0.3497.106","4.0.0-beta.11":"69.0.3497.106","4.0.0-nightly.20180817":"66.0.3359.181","4.0.0-nightly.20180819":"66.0.3359.181","4.0.0-nightly.20180821":"66.0.3359.181","4.0.0-nightly.20180929":"67.0.3396.99","4.0.0-nightly.20181006":"68.0.3440.128","4.0.0-nightly.20181010":"69.0.3497.106","4.0.0":"69.0.3497.106","4.0.1":"69.0.3497.106","4.0.2":"69.0.3497.106","4.0.3":"69.0.3497.106","4.0.4":"69.0.3497.106","4.0.5":"69.0.3497.106","4.0.6":"69.0.3497.106","4.0.7":"69.0.3497.128","4.0.8":"69.0.3497.128","4.1.0":"69.0.3497.128","4.1.1":"69.0.3497.128","4.1.2":"69.0.3497.128","4.1.3":"69.0.3497.128","4.1.4":"69.0.3497.128","4.1.5":"69.0.3497.128","4.2.0":"69.0.3497.128","4.2.1":"69.0.3497.128","4.2.2":"69.0.3497.128","4.2.3":"69.0.3497.128","4.2.4":"69.0.3497.128","4.2.5":"69.0.3497.128","4.2.6":"69.0.3497.128","4.2.7":"69.0.3497.128","4.2.8":"69.0.3497.128","4.2.9":"69.0.3497.128","4.2.10":"69.0.3497.128","4.2.11":"69.0.3497.128","4.2.12":"69.0.3497.128","5.0.0-beta.1":"72.0.3626.52","5.0.0-beta.2":"72.0.3626.52","5.0.0-beta.3":"73.0.3683.27","5.0.0-beta.4":"73.0.3683.54","5.0.0-beta.5":"73.0.3683.61","5.0.0-beta.6":"73.0.3683.84","5.0.0-beta.7":"73.0.3683.94","5.0.0-beta.8":"73.0.3683.104","5.0.0-beta.9":"73.0.3683.117","5.0.0-nightly.20190107":"70.0.3538.110","5.0.0-nightly.20190121":"71.0.3578.98","5.0.0-nightly.20190122":"71.0.3578.98","5.0.0":"73.0.3683.119","5.0.1":"73.0.3683.121","5.0.2":"73.0.3683.121","5.0.3":"73.0.3683.121","5.0.4":"73.0.3683.121","5.0.5":"73.0.3683.121","5.0.6":"73.0.3683.121","5.0.7":"73.0.3683.121","5.0.8":"73.0.3683.121","5.0.9":"73.0.3683.121","5.0.10":"73.0.3683.121","5.0.11":"73.0.3683.121","5.0.12":"73.0.3683.121","5.0.13":"73.0.3683.121","6.0.0-beta.1":"76.0.3774.1","6.0.0-beta.2":"76.0.3783.1","6.0.0-beta.3":"76.0.3783.1","6.0.0-beta.4":"76.0.3783.1","6.0.0-beta.5":"76.0.3805.4","6.0.0-beta.6":"76.0.3809.3","6.0.0-beta.7":"76.0.3809.22","6.0.0-beta.8":"76.0.3809.26","6.0.0-beta.9":"76.0.3809.26","6.0.0-beta.10":"76.0.3809.37","6.0.0-beta.11":"76.0.3809.42","6.0.0-beta.12":"76.0.3809.54","6.0.0-beta.13":"76.0.3809.60","6.0.0-beta.14":"76.0.3809.68","6.0.0-beta.15":"76.0.3809.74","6.0.0-nightly.20190123":"72.0.3626.52","6.0.0-nightly.20190212":"72.0.3626.107","6.0.0-nightly.20190213":"72.0.3626.110","6.0.0-nightly.20190311":"74.0.3724.8","6.0.0":"76.0.3809.88","6.0.1":"76.0.3809.102","6.0.2":"76.0.3809.110","6.0.3":"76.0.3809.126","6.0.4":"76.0.3809.131","6.0.5":"76.0.3809.136","6.0.6":"76.0.3809.138","6.0.7":"76.0.3809.139","6.0.8":"76.0.3809.146","6.0.9":"76.0.3809.146","6.0.10":"76.0.3809.146","6.0.11":"76.0.3809.146","6.0.12":"76.0.3809.146","6.1.0":"76.0.3809.146","6.1.1":"76.0.3809.146","6.1.2":"76.0.3809.146","6.1.3":"76.0.3809.146","6.1.4":"76.0.3809.146","6.1.5":"76.0.3809.146","6.1.6":"76.0.3809.146","6.1.7":"76.0.3809.146","6.1.8":"76.0.3809.146","6.1.9":"76.0.3809.146","6.1.10":"76.0.3809.146","6.1.11":"76.0.3809.146","6.1.12":"76.0.3809.146","7.0.0-beta.1":"78.0.3866.0","7.0.0-beta.2":"78.0.3866.0","7.0.0-beta.3":"78.0.3866.0","7.0.0-beta.4":"78.0.3896.6","7.0.0-beta.5":"78.0.3905.1","7.0.0-beta.6":"78.0.3905.1","7.0.0-beta.7":"78.0.3905.1","7.0.0-nightly.20190521":"76.0.3784.0","7.0.0-nightly.20190529":"76.0.3806.0","7.0.0-nightly.20190530":"76.0.3806.0","7.0.0-nightly.20190531":"76.0.3806.0","7.0.0-nightly.20190602":"76.0.3806.0","7.0.0-nightly.20190603":"76.0.3806.0","7.0.0-nightly.20190604":"77.0.3814.0","7.0.0-nightly.20190605":"77.0.3815.0","7.0.0-nightly.20190606":"77.0.3815.0","7.0.0-nightly.20190607":"77.0.3815.0","7.0.0-nightly.20190608":"77.0.3815.0","7.0.0-nightly.20190609":"77.0.3815.0","7.0.0-nightly.20190611":"77.0.3815.0","7.0.0-nightly.20190612":"77.0.3815.0","7.0.0-nightly.20190613":"77.0.3815.0","7.0.0-nightly.20190615":"77.0.3815.0","7.0.0-nightly.20190616":"77.0.3815.0","7.0.0-nightly.20190618":"77.0.3815.0","7.0.0-nightly.20190619":"77.0.3815.0","7.0.0-nightly.20190622":"77.0.3815.0","7.0.0-nightly.20190623":"77.0.3815.0","7.0.0-nightly.20190624":"77.0.3815.0","7.0.0-nightly.20190627":"77.0.3815.0","7.0.0-nightly.20190629":"77.0.3815.0","7.0.0-nightly.20190630":"77.0.3815.0","7.0.0-nightly.20190701":"77.0.3815.0","7.0.0-nightly.20190702":"77.0.3815.0","7.0.0-nightly.20190704":"77.0.3843.0","7.0.0-nightly.20190705":"77.0.3843.0","7.0.0-nightly.20190719":"77.0.3848.0","7.0.0-nightly.20190720":"77.0.3848.0","7.0.0-nightly.20190721":"77.0.3848.0","7.0.0-nightly.20190726":"77.0.3864.0","7.0.0-nightly.20190727":"78.0.3866.0","7.0.0-nightly.20190728":"78.0.3866.0","7.0.0-nightly.20190729":"78.0.3866.0","7.0.0-nightly.20190730":"78.0.3866.0","7.0.0-nightly.20190731":"78.0.3866.0","7.0.0":"78.0.3905.1","7.0.1":"78.0.3904.92","7.1.0":"78.0.3904.94","7.1.1":"78.0.3904.99","7.1.2":"78.0.3904.113","7.1.3":"78.0.3904.126","7.1.4":"78.0.3904.130","7.1.5":"78.0.3904.130","7.1.6":"78.0.3904.130","7.1.7":"78.0.3904.130","7.1.8":"78.0.3904.130","7.1.9":"78.0.3904.130","7.1.10":"78.0.3904.130","7.1.11":"78.0.3904.130","7.1.12":"78.0.3904.130","7.1.13":"78.0.3904.130","7.1.14":"78.0.3904.130","7.2.0":"78.0.3904.130","7.2.1":"78.0.3904.130","7.2.2":"78.0.3904.130","7.2.3":"78.0.3904.130","7.2.4":"78.0.3904.130","7.3.0":"78.0.3904.130","7.3.1":"78.0.3904.130","7.3.2":"78.0.3904.130","7.3.3":"78.0.3904.130","8.0.0-beta.1":"79.0.3931.0","8.0.0-beta.2":"79.0.3931.0","8.0.0-beta.3":"80.0.3955.0","8.0.0-beta.4":"80.0.3955.0","8.0.0-beta.5":"80.0.3987.14","8.0.0-beta.6":"80.0.3987.51","8.0.0-beta.7":"80.0.3987.59","8.0.0-beta.8":"80.0.3987.75","8.0.0-beta.9":"80.0.3987.75","8.0.0-nightly.20190801":"78.0.3866.0","8.0.0-nightly.20190802":"78.0.3866.0","8.0.0-nightly.20190803":"78.0.3871.0","8.0.0-nightly.20190806":"78.0.3871.0","8.0.0-nightly.20190807":"78.0.3871.0","8.0.0-nightly.20190808":"78.0.3871.0","8.0.0-nightly.20190809":"78.0.3871.0","8.0.0-nightly.20190810":"78.0.3871.0","8.0.0-nightly.20190811":"78.0.3871.0","8.0.0-nightly.20190812":"78.0.3871.0","8.0.0-nightly.20190813":"78.0.3871.0","8.0.0-nightly.20190814":"78.0.3871.0","8.0.0-nightly.20190815":"78.0.3871.0","8.0.0-nightly.20190816":"78.0.3881.0","8.0.0-nightly.20190817":"78.0.3881.0","8.0.0-nightly.20190818":"78.0.3881.0","8.0.0-nightly.20190819":"78.0.3881.0","8.0.0-nightly.20190820":"78.0.3881.0","8.0.0-nightly.20190824":"78.0.3892.0","8.0.0-nightly.20190825":"78.0.3892.0","8.0.0-nightly.20190827":"78.0.3892.0","8.0.0-nightly.20190828":"78.0.3892.0","8.0.0-nightly.20190830":"78.0.3892.0","8.0.0-nightly.20190901":"78.0.3892.0","8.0.0-nightly.20190902":"78.0.3892.0","8.0.0-nightly.20190907":"78.0.3892.0","8.0.0-nightly.20190909":"78.0.3892.0","8.0.0-nightly.20190910":"78.0.3892.0","8.0.0-nightly.20190911":"78.0.3892.0","8.0.0-nightly.20190912":"78.0.3892.0","8.0.0-nightly.20190913":"78.0.3892.0","8.0.0-nightly.20190914":"78.0.3892.0","8.0.0-nightly.20190915":"78.0.3892.0","8.0.0-nightly.20190917":"78.0.3892.0","8.0.0-nightly.20190919":"79.0.3915.0","8.0.0-nightly.20190920":"79.0.3915.0","8.0.0-nightly.20190922":"79.0.3919.0","8.0.0-nightly.20190923":"79.0.3919.0","8.0.0-nightly.20190924":"79.0.3919.0","8.0.0-nightly.20190926":"79.0.3919.0","8.0.0-nightly.20190928":"79.0.3919.0","8.0.0-nightly.20190929":"79.0.3919.0","8.0.0-nightly.20190930":"79.0.3919.0","8.0.0-nightly.20191001":"79.0.3919.0","8.0.0-nightly.20191004":"79.0.3919.0","8.0.0-nightly.20191005":"79.0.3919.0","8.0.0-nightly.20191006":"79.0.3919.0","8.0.0-nightly.20191009":"79.0.3919.0","8.0.0-nightly.20191011":"79.0.3919.0","8.0.0-nightly.20191012":"79.0.3919.0","8.0.0-nightly.20191017":"79.0.3919.0","8.0.0-nightly.20191019":"79.0.3931.0","8.0.0-nightly.20191020":"79.0.3931.0","8.0.0-nightly.20191021":"79.0.3931.0","8.0.0-nightly.20191023":"79.0.3931.0","8.0.0-nightly.20191101":"80.0.3952.0","8.0.0-nightly.20191103":"80.0.3952.0","8.0.0-nightly.20191105":"80.0.3952.0","8.0.0":"80.0.3987.86","8.0.1":"80.0.3987.86","8.0.2":"80.0.3987.86","8.0.3":"80.0.3987.134","8.1.0":"80.0.3987.137","8.1.1":"80.0.3987.141","8.2.0":"80.0.3987.158","8.2.1":"80.0.3987.163","8.2.2":"80.0.3987.163","8.2.3":"80.0.3987.163","8.2.4":"80.0.3987.165","8.2.5":"80.0.3987.165","8.3.0":"80.0.3987.165","8.3.1":"80.0.3987.165","8.3.2":"80.0.3987.165","8.3.3":"80.0.3987.165","8.3.4":"80.0.3987.165","8.4.0":"80.0.3987.165","8.4.1":"80.0.3987.165","8.5.0":"80.0.3987.165","8.5.1":"80.0.3987.165","8.5.2":"80.0.3987.165","8.5.3":"80.0.3987.163","8.5.4":"80.0.3987.163","8.5.5":"80.0.3987.163","9.0.0-beta.1":"82.0.4048.0","9.0.0-beta.2":"82.0.4048.0","9.0.0-beta.3":"82.0.4048.0","9.0.0-beta.4":"82.0.4048.0","9.0.0-beta.5":"82.0.4048.0","9.0.0-beta.6":"82.0.4058.2","9.0.0-beta.7":"82.0.4058.2","9.0.0-beta.9":"82.0.4058.2","9.0.0-beta.10":"82.0.4085.10","9.0.0-beta.11":"82.0.4085.14","9.0.0-beta.12":"82.0.4085.14","9.0.0-beta.13":"82.0.4085.14","9.0.0-beta.14":"82.0.4085.27","9.0.0-beta.15":"83.0.4102.3","9.0.0-beta.16":"83.0.4102.3","9.0.0-beta.17":"83.0.4103.14","9.0.0-beta.18":"83.0.4103.16","9.0.0-beta.19":"83.0.4103.24","9.0.0-beta.20":"83.0.4103.26","9.0.0-beta.21":"83.0.4103.26","9.0.0-beta.22":"83.0.4103.34","9.0.0-beta.23":"83.0.4103.44","9.0.0-beta.24":"83.0.4103.45","9.0.0-nightly.20191121":"80.0.3954.0","9.0.0-nightly.20191122":"80.0.3954.0","9.0.0-nightly.20191123":"80.0.3954.0","9.0.0-nightly.20191124":"80.0.3954.0","9.0.0-nightly.20191126":"80.0.3954.0","9.0.0-nightly.20191128":"80.0.3954.0","9.0.0-nightly.20191129":"80.0.3954.0","9.0.0-nightly.20191130":"80.0.3954.0","9.0.0-nightly.20191201":"80.0.3954.0","9.0.0-nightly.20191202":"80.0.3954.0","9.0.0-nightly.20191203":"80.0.3954.0","9.0.0-nightly.20191204":"80.0.3954.0","9.0.0-nightly.20191205":"80.0.3954.0","9.0.0-nightly.20191210":"80.0.3954.0","9.0.0-nightly.20191220":"81.0.3994.0","9.0.0-nightly.20191221":"81.0.3994.0","9.0.0-nightly.20191222":"81.0.3994.0","9.0.0-nightly.20191223":"81.0.3994.0","9.0.0-nightly.20191224":"81.0.3994.0","9.0.0-nightly.20191225":"81.0.3994.0","9.0.0-nightly.20191226":"81.0.3994.0","9.0.0-nightly.20191228":"81.0.3994.0","9.0.0-nightly.20191229":"81.0.3994.0","9.0.0-nightly.20191230":"81.0.3994.0","9.0.0-nightly.20191231":"81.0.3994.0","9.0.0-nightly.20200101":"81.0.3994.0","9.0.0-nightly.20200103":"81.0.3994.0","9.0.0-nightly.20200104":"81.0.3994.0","9.0.0-nightly.20200105":"81.0.3994.0","9.0.0-nightly.20200106":"81.0.3994.0","9.0.0-nightly.20200108":"81.0.3994.0","9.0.0-nightly.20200109":"81.0.3994.0","9.0.0-nightly.20200110":"81.0.3994.0","9.0.0-nightly.20200111":"81.0.3994.0","9.0.0-nightly.20200113":"81.0.3994.0","9.0.0-nightly.20200115":"81.0.3994.0","9.0.0-nightly.20200116":"81.0.3994.0","9.0.0-nightly.20200117":"81.0.3994.0","9.0.0-nightly.20200119":"81.0.4030.0","9.0.0-nightly.20200121":"81.0.4030.0","9.0.0":"83.0.4103.64","9.0.1":"83.0.4103.94","9.0.2":"83.0.4103.94","9.0.3":"83.0.4103.100","9.0.4":"83.0.4103.104","9.0.5":"83.0.4103.119","9.1.0":"83.0.4103.122","9.1.1":"83.0.4103.122","9.1.2":"83.0.4103.122","9.2.0":"83.0.4103.122","9.2.1":"83.0.4103.122","9.3.0":"83.0.4103.122","9.3.1":"83.0.4103.122","9.3.2":"83.0.4103.122","9.3.3":"83.0.4103.122","9.3.4":"83.0.4103.122","9.3.5":"83.0.4103.122","9.4.0":"83.0.4103.122","9.4.1":"83.0.4103.122","9.4.2":"83.0.4103.122","9.4.3":"83.0.4103.122","9.4.4":"83.0.4103.122","10.0.0-beta.1":"84.0.4129.0","10.0.0-beta.2":"84.0.4129.0","10.0.0-beta.3":"85.0.4161.2","10.0.0-beta.4":"85.0.4161.2","10.0.0-beta.8":"85.0.4181.1","10.0.0-beta.9":"85.0.4181.1","10.0.0-beta.10":"85.0.4183.19","10.0.0-beta.11":"85.0.4183.20","10.0.0-beta.12":"85.0.4183.26","10.0.0-beta.13":"85.0.4183.39","10.0.0-beta.14":"85.0.4183.39","10.0.0-beta.15":"85.0.4183.39","10.0.0-beta.17":"85.0.4183.39","10.0.0-beta.19":"85.0.4183.39","10.0.0-beta.20":"85.0.4183.39","10.0.0-beta.21":"85.0.4183.39","10.0.0-beta.23":"85.0.4183.70","10.0.0-beta.24":"85.0.4183.78","10.0.0-beta.25":"85.0.4183.80","10.0.0-nightly.20200209":"82.0.4050.0","10.0.0-nightly.20200210":"82.0.4050.0","10.0.0-nightly.20200211":"82.0.4050.0","10.0.0-nightly.20200216":"82.0.4050.0","10.0.0-nightly.20200217":"82.0.4050.0","10.0.0-nightly.20200218":"82.0.4050.0","10.0.0-nightly.20200221":"82.0.4050.0","10.0.0-nightly.20200222":"82.0.4050.0","10.0.0-nightly.20200223":"82.0.4050.0","10.0.0-nightly.20200226":"82.0.4050.0","10.0.0-nightly.20200303":"82.0.4050.0","10.0.0-nightly.20200304":"82.0.4076.0","10.0.0-nightly.20200305":"82.0.4076.0","10.0.0-nightly.20200306":"82.0.4076.0","10.0.0-nightly.20200309":"82.0.4076.0","10.0.0-nightly.20200310":"82.0.4076.0","10.0.0-nightly.20200311":"82.0.4083.0","10.0.0-nightly.20200316":"83.0.4086.0","10.0.0-nightly.20200317":"83.0.4087.0","10.0.0-nightly.20200318":"83.0.4087.0","10.0.0-nightly.20200320":"83.0.4087.0","10.0.0-nightly.20200323":"83.0.4087.0","10.0.0-nightly.20200324":"83.0.4087.0","10.0.0-nightly.20200325":"83.0.4087.0","10.0.0-nightly.20200326":"83.0.4087.0","10.0.0-nightly.20200327":"83.0.4087.0","10.0.0-nightly.20200330":"83.0.4087.0","10.0.0-nightly.20200331":"83.0.4087.0","10.0.0-nightly.20200401":"83.0.4087.0","10.0.0-nightly.20200402":"83.0.4087.0","10.0.0-nightly.20200403":"83.0.4087.0","10.0.0-nightly.20200406":"83.0.4087.0","10.0.0-nightly.20200408":"83.0.4095.0","10.0.0-nightly.20200410":"83.0.4095.0","10.0.0-nightly.20200413":"83.0.4095.0","10.0.0-nightly.20200414":"84.0.4114.0","10.0.0-nightly.20200415":"84.0.4115.0","10.0.0-nightly.20200416":"84.0.4115.0","10.0.0-nightly.20200417":"84.0.4115.0","10.0.0-nightly.20200422":"84.0.4121.0","10.0.0-nightly.20200423":"84.0.4121.0","10.0.0-nightly.20200427":"84.0.4125.0","10.0.0-nightly.20200428":"84.0.4125.0","10.0.0-nightly.20200429":"84.0.4125.0","10.0.0-nightly.20200430":"84.0.4125.0","10.0.0-nightly.20200501":"84.0.4129.0","10.0.0-nightly.20200504":"84.0.4129.0","10.0.0-nightly.20200505":"84.0.4129.0","10.0.0-nightly.20200506":"84.0.4129.0","10.0.0-nightly.20200507":"84.0.4129.0","10.0.0-nightly.20200508":"84.0.4129.0","10.0.0-nightly.20200511":"84.0.4129.0","10.0.0-nightly.20200512":"84.0.4129.0","10.0.0-nightly.20200513":"84.0.4129.0","10.0.0-nightly.20200514":"84.0.4129.0","10.0.0-nightly.20200515":"84.0.4129.0","10.0.0-nightly.20200518":"84.0.4129.0","10.0.0-nightly.20200519":"84.0.4129.0","10.0.0-nightly.20200520":"84.0.4129.0","10.0.0-nightly.20200521":"84.0.4129.0","10.0.0":"85.0.4183.84","10.0.1":"85.0.4183.86","10.1.0":"85.0.4183.87","10.1.1":"85.0.4183.93","10.1.2":"85.0.4183.98","10.1.3":"85.0.4183.121","10.1.4":"85.0.4183.121","10.1.5":"85.0.4183.121","10.1.6":"85.0.4183.121","10.1.7":"85.0.4183.121","10.2.0":"85.0.4183.121","10.3.0":"85.0.4183.121","10.3.1":"85.0.4183.121","10.3.2":"85.0.4183.121","10.4.0":"85.0.4183.121","10.4.1":"85.0.4183.121","10.4.2":"85.0.4183.121","10.4.3":"85.0.4183.121","10.4.4":"85.0.4183.121","10.4.5":"85.0.4183.121","10.4.6":"85.0.4183.121","10.4.7":"85.0.4183.121","11.0.0-beta.1":"86.0.4234.0","11.0.0-beta.3":"86.0.4234.0","11.0.0-beta.4":"86.0.4234.0","11.0.0-beta.5":"86.0.4234.0","11.0.0-beta.6":"86.0.4234.0","11.0.0-beta.7":"86.0.4234.0","11.0.0-beta.8":"87.0.4251.1","11.0.0-beta.9":"87.0.4251.1","11.0.0-beta.11":"87.0.4251.1","11.0.0-beta.12":"87.0.4280.11","11.0.0-beta.13":"87.0.4280.11","11.0.0-beta.16":"87.0.4280.27","11.0.0-beta.17":"87.0.4280.27","11.0.0-beta.18":"87.0.4280.27","11.0.0-beta.19":"87.0.4280.27","11.0.0-beta.20":"87.0.4280.40","11.0.0-beta.22":"87.0.4280.47","11.0.0-beta.23":"87.0.4280.47","11.0.0-nightly.20200525":"84.0.4129.0","11.0.0-nightly.20200526":"84.0.4129.0","11.0.0-nightly.20200529":"85.0.4156.0","11.0.0-nightly.20200602":"85.0.4162.0","11.0.0-nightly.20200603":"85.0.4162.0","11.0.0-nightly.20200604":"85.0.4162.0","11.0.0-nightly.20200609":"85.0.4162.0","11.0.0-nightly.20200610":"85.0.4162.0","11.0.0-nightly.20200611":"85.0.4162.0","11.0.0-nightly.20200615":"85.0.4162.0","11.0.0-nightly.20200616":"85.0.4162.0","11.0.0-nightly.20200617":"85.0.4162.0","11.0.0-nightly.20200618":"85.0.4162.0","11.0.0-nightly.20200619":"85.0.4162.0","11.0.0-nightly.20200701":"85.0.4179.0","11.0.0-nightly.20200702":"85.0.4179.0","11.0.0-nightly.20200703":"85.0.4179.0","11.0.0-nightly.20200706":"85.0.4179.0","11.0.0-nightly.20200707":"85.0.4179.0","11.0.0-nightly.20200708":"85.0.4179.0","11.0.0-nightly.20200709":"85.0.4179.0","11.0.0-nightly.20200716":"86.0.4203.0","11.0.0-nightly.20200717":"86.0.4203.0","11.0.0-nightly.20200720":"86.0.4203.0","11.0.0-nightly.20200721":"86.0.4203.0","11.0.0-nightly.20200723":"86.0.4209.0","11.0.0-nightly.20200724":"86.0.4209.0","11.0.0-nightly.20200729":"86.0.4209.0","11.0.0-nightly.20200730":"86.0.4209.0","11.0.0-nightly.20200731":"86.0.4209.0","11.0.0-nightly.20200803":"86.0.4209.0","11.0.0-nightly.20200804":"86.0.4209.0","11.0.0-nightly.20200805":"86.0.4209.0","11.0.0-nightly.20200811":"86.0.4209.0","11.0.0-nightly.20200812":"86.0.4209.0","11.0.0-nightly.20200822":"86.0.4234.0","11.0.0-nightly.20200824":"86.0.4234.0","11.0.0-nightly.20200825":"86.0.4234.0","11.0.0-nightly.20200826":"86.0.4234.0","11.0.0":"87.0.4280.60","11.0.1":"87.0.4280.60","11.0.2":"87.0.4280.67","11.0.3":"87.0.4280.67","11.0.4":"87.0.4280.67","11.0.5":"87.0.4280.88","11.1.0":"87.0.4280.88","11.1.1":"87.0.4280.88","11.2.0":"87.0.4280.141","11.2.1":"87.0.4280.141","11.2.2":"87.0.4280.141","11.2.3":"87.0.4280.141","11.3.0":"87.0.4280.141","11.4.0":"87.0.4280.141","11.4.1":"87.0.4280.141","11.4.2":"87.0.4280.141","11.4.3":"87.0.4280.141","11.4.4":"87.0.4280.141","11.4.5":"87.0.4280.141","11.4.6":"87.0.4280.141","11.4.7":"87.0.4280.141","11.4.8":"87.0.4280.141","11.4.9":"87.0.4280.141","11.4.10":"87.0.4280.141","11.4.11":"87.0.4280.141","11.4.12":"87.0.4280.141","11.5.0":"87.0.4280.141","12.0.0-beta.1":"89.0.4328.0","12.0.0-beta.3":"89.0.4328.0","12.0.0-beta.4":"89.0.4328.0","12.0.0-beta.5":"89.0.4328.0","12.0.0-beta.6":"89.0.4328.0","12.0.0-beta.7":"89.0.4328.0","12.0.0-beta.8":"89.0.4328.0","12.0.0-beta.9":"89.0.4328.0","12.0.0-beta.10":"89.0.4328.0","12.0.0-beta.11":"89.0.4328.0","12.0.0-beta.12":"89.0.4328.0","12.0.0-beta.14":"89.0.4328.0","12.0.0-beta.16":"89.0.4348.1","12.0.0-beta.18":"89.0.4348.1","12.0.0-beta.19":"89.0.4348.1","12.0.0-beta.20":"89.0.4348.1","12.0.0-beta.21":"89.0.4388.2","12.0.0-beta.22":"89.0.4388.2","12.0.0-beta.23":"89.0.4388.2","12.0.0-beta.24":"89.0.4388.2","12.0.0-beta.25":"89.0.4388.2","12.0.0-beta.26":"89.0.4388.2","12.0.0-beta.27":"89.0.4389.23","12.0.0-beta.28":"89.0.4389.23","12.0.0-beta.29":"89.0.4389.23","12.0.0-beta.30":"89.0.4389.58","12.0.0-beta.31":"89.0.4389.58","12.0.0-nightly.20200827":"86.0.4234.0","12.0.0-nightly.20200831":"86.0.4234.0","12.0.0-nightly.20200902":"86.0.4234.0","12.0.0-nightly.20200903":"86.0.4234.0","12.0.0-nightly.20200907":"86.0.4234.0","12.0.0-nightly.20200910":"86.0.4234.0","12.0.0-nightly.20200911":"86.0.4234.0","12.0.0-nightly.20200914":"86.0.4234.0","12.0.0-nightly.20201002":"87.0.4268.0","12.0.0-nightly.20201007":"87.0.4268.0","12.0.0-nightly.20201009":"87.0.4268.0","12.0.0-nightly.20201012":"87.0.4268.0","12.0.0-nightly.20201013":"87.0.4268.0","12.0.0-nightly.20201014":"87.0.4268.0","12.0.0-nightly.20201015":"87.0.4268.0","12.0.0-nightly.20201023":"88.0.4292.0","12.0.0-nightly.20201026":"88.0.4292.0","12.0.0-nightly.20201030":"88.0.4306.0","12.0.0-nightly.20201102":"88.0.4306.0","12.0.0-nightly.20201103":"88.0.4306.0","12.0.0-nightly.20201104":"88.0.4306.0","12.0.0-nightly.20201105":"88.0.4306.0","12.0.0-nightly.20201106":"88.0.4306.0","12.0.0-nightly.20201111":"88.0.4306.0","12.0.0-nightly.20201112":"88.0.4306.0","12.0.0-nightly.20201116":"88.0.4324.0","12.0.0":"89.0.4389.69","12.0.1":"89.0.4389.82","12.0.2":"89.0.4389.90","12.0.3":"89.0.4389.114","12.0.4":"89.0.4389.114","12.0.5":"89.0.4389.128","12.0.6":"89.0.4389.128","12.0.7":"89.0.4389.128","12.0.8":"89.0.4389.128","12.0.9":"89.0.4389.128","12.0.10":"89.0.4389.128","12.0.11":"89.0.4389.128","12.0.12":"89.0.4389.128","12.0.13":"89.0.4389.128","12.0.14":"89.0.4389.128","12.0.15":"89.0.4389.128","12.0.16":"89.0.4389.128","12.0.17":"89.0.4389.128","12.0.18":"89.0.4389.128","12.1.0":"89.0.4389.128","12.1.1":"89.0.4389.128","12.1.2":"89.0.4389.128","12.2.0":"89.0.4389.128","12.2.1":"89.0.4389.128","12.2.2":"89.0.4389.128","12.2.3":"89.0.4389.128","13.0.0-beta.2":"90.0.4402.0","13.0.0-beta.3":"90.0.4402.0","13.0.0-beta.4":"90.0.4415.0","13.0.0-beta.5":"90.0.4415.0","13.0.0-beta.6":"90.0.4415.0","13.0.0-beta.7":"90.0.4415.0","13.0.0-beta.8":"90.0.4415.0","13.0.0-beta.9":"90.0.4415.0","13.0.0-beta.10":"90.0.4415.0","13.0.0-beta.11":"90.0.4415.0","13.0.0-beta.12":"90.0.4415.0","13.0.0-beta.13":"90.0.4415.0","13.0.0-beta.14":"91.0.4448.0","13.0.0-beta.16":"91.0.4448.0","13.0.0-beta.17":"91.0.4448.0","13.0.0-beta.18":"91.0.4448.0","13.0.0-beta.20":"91.0.4448.0","13.0.0-beta.21":"91.0.4472.33","13.0.0-beta.22":"91.0.4472.33","13.0.0-beta.23":"91.0.4472.33","13.0.0-beta.24":"91.0.4472.38","13.0.0-beta.25":"91.0.4472.38","13.0.0-beta.26":"91.0.4472.38","13.0.0-beta.27":"91.0.4472.38","13.0.0-beta.28":"91.0.4472.38","13.0.0-nightly.20201119":"89.0.4328.0","13.0.0-nightly.20201123":"89.0.4328.0","13.0.0-nightly.20201124":"89.0.4328.0","13.0.0-nightly.20201126":"89.0.4328.0","13.0.0-nightly.20201127":"89.0.4328.0","13.0.0-nightly.20201130":"89.0.4328.0","13.0.0-nightly.20201201":"89.0.4328.0","13.0.0-nightly.20201202":"89.0.4328.0","13.0.0-nightly.20201203":"89.0.4328.0","13.0.0-nightly.20201204":"89.0.4328.0","13.0.0-nightly.20201207":"89.0.4328.0","13.0.0-nightly.20201208":"89.0.4328.0","13.0.0-nightly.20201209":"89.0.4328.0","13.0.0-nightly.20201210":"89.0.4328.0","13.0.0-nightly.20201211":"89.0.4328.0","13.0.0-nightly.20201214":"89.0.4328.0","13.0.0-nightly.20201215":"89.0.4349.0","13.0.0-nightly.20201216":"89.0.4349.0","13.0.0-nightly.20201221":"89.0.4349.0","13.0.0-nightly.20201222":"89.0.4349.0","13.0.0-nightly.20201223":"89.0.4359.0","13.0.0-nightly.20210104":"89.0.4359.0","13.0.0-nightly.20210108":"89.0.4359.0","13.0.0-nightly.20210111":"89.0.4359.0","13.0.0-nightly.20210113":"89.0.4386.0","13.0.0-nightly.20210114":"89.0.4386.0","13.0.0-nightly.20210118":"89.0.4386.0","13.0.0-nightly.20210122":"89.0.4386.0","13.0.0-nightly.20210125":"89.0.4386.0","13.0.0-nightly.20210127":"89.0.4389.0","13.0.0-nightly.20210128":"89.0.4389.0","13.0.0-nightly.20210129":"89.0.4389.0","13.0.0-nightly.20210201":"89.0.4389.0","13.0.0-nightly.20210202":"89.0.4389.0","13.0.0-nightly.20210203":"89.0.4389.0","13.0.0-nightly.20210205":"89.0.4389.0","13.0.0-nightly.20210208":"89.0.4389.0","13.0.0-nightly.20210209":"89.0.4389.0","13.0.0-nightly.20210210":"90.0.4402.0","13.0.0-nightly.20210211":"90.0.4402.0","13.0.0-nightly.20210212":"90.0.4402.0","13.0.0-nightly.20210216":"90.0.4402.0","13.0.0-nightly.20210217":"90.0.4402.0","13.0.0-nightly.20210218":"90.0.4402.0","13.0.0-nightly.20210219":"90.0.4402.0","13.0.0-nightly.20210222":"90.0.4402.0","13.0.0-nightly.20210225":"90.0.4402.0","13.0.0-nightly.20210226":"90.0.4402.0","13.0.0-nightly.20210301":"90.0.4402.0","13.0.0-nightly.20210302":"90.0.4402.0","13.0.0-nightly.20210303":"90.0.4402.0","13.0.0":"91.0.4472.69","13.0.1":"91.0.4472.69","13.1.0":"91.0.4472.77","13.1.1":"91.0.4472.77","13.1.2":"91.0.4472.77","13.1.3":"91.0.4472.106","13.1.4":"91.0.4472.106","13.1.5":"91.0.4472.124","13.1.6":"91.0.4472.124","13.1.7":"91.0.4472.124","13.1.8":"91.0.4472.164","13.1.9":"91.0.4472.164","13.2.0":"91.0.4472.164","13.2.1":"91.0.4472.164","13.2.2":"91.0.4472.164","13.2.3":"91.0.4472.164","13.3.0":"91.0.4472.164","13.4.0":"91.0.4472.164","13.5.0":"91.0.4472.164","13.5.1":"91.0.4472.164","13.5.2":"91.0.4472.164","13.6.0":"91.0.4472.164","13.6.1":"91.0.4472.164","13.6.2":"91.0.4472.164","13.6.3":"91.0.4472.164","13.6.6":"91.0.4472.164","13.6.7":"91.0.4472.164","13.6.8":"91.0.4472.164","13.6.9":"91.0.4472.164","14.0.0-beta.1":"92.0.4511.0","14.0.0-beta.2":"92.0.4511.0","14.0.0-beta.3":"92.0.4511.0","14.0.0-beta.5":"93.0.4536.0","14.0.0-beta.6":"93.0.4536.0","14.0.0-beta.7":"93.0.4536.0","14.0.0-beta.8":"93.0.4536.0","14.0.0-beta.9":"93.0.4539.0","14.0.0-beta.10":"93.0.4539.0","14.0.0-beta.11":"93.0.4557.4","14.0.0-beta.12":"93.0.4557.4","14.0.0-beta.13":"93.0.4566.0","14.0.0-beta.14":"93.0.4566.0","14.0.0-beta.15":"93.0.4566.0","14.0.0-beta.16":"93.0.4566.0","14.0.0-beta.17":"93.0.4566.0","14.0.0-beta.18":"93.0.4577.15","14.0.0-beta.19":"93.0.4577.15","14.0.0-beta.20":"93.0.4577.15","14.0.0-beta.21":"93.0.4577.15","14.0.0-beta.22":"93.0.4577.25","14.0.0-beta.23":"93.0.4577.25","14.0.0-beta.24":"93.0.4577.51","14.0.0-beta.25":"93.0.4577.51","14.0.0-nightly.20210304":"90.0.4402.0","14.0.0-nightly.20210305":"90.0.4415.0","14.0.0-nightly.20210308":"90.0.4415.0","14.0.0-nightly.20210309":"90.0.4415.0","14.0.0-nightly.20210311":"90.0.4415.0","14.0.0-nightly.20210315":"90.0.4415.0","14.0.0-nightly.20210316":"90.0.4415.0","14.0.0-nightly.20210317":"90.0.4415.0","14.0.0-nightly.20210318":"90.0.4415.0","14.0.0-nightly.20210319":"90.0.4415.0","14.0.0-nightly.20210323":"90.0.4415.0","14.0.0-nightly.20210324":"90.0.4415.0","14.0.0-nightly.20210325":"90.0.4415.0","14.0.0-nightly.20210326":"90.0.4415.0","14.0.0-nightly.20210329":"90.0.4415.0","14.0.0-nightly.20210330":"90.0.4415.0","14.0.0-nightly.20210331":"91.0.4448.0","14.0.0-nightly.20210401":"91.0.4448.0","14.0.0-nightly.20210402":"91.0.4448.0","14.0.0-nightly.20210406":"91.0.4448.0","14.0.0-nightly.20210407":"91.0.4448.0","14.0.0-nightly.20210408":"91.0.4448.0","14.0.0-nightly.20210409":"91.0.4448.0","14.0.0-nightly.20210413":"91.0.4448.0","14.0.0-nightly.20210426":"92.0.4475.0","14.0.0-nightly.20210427":"92.0.4475.0","14.0.0-nightly.20210430":"92.0.4488.0","14.0.0-nightly.20210503":"92.0.4488.0","14.0.0-nightly.20210505":"92.0.4496.0","14.0.0-nightly.20210506":"92.0.4498.0","14.0.0-nightly.20210507":"92.0.4499.0","14.0.0-nightly.20210510":"92.0.4499.0","14.0.0-nightly.20210511":"92.0.4499.0","14.0.0-nightly.20210512":"92.0.4499.0","14.0.0-nightly.20210513":"92.0.4499.0","14.0.0-nightly.20210514":"92.0.4505.0","14.0.0-nightly.20210517":"92.0.4505.0","14.0.0-nightly.20210518":"92.0.4505.0","14.0.0-nightly.20210519":"92.0.4505.0","14.0.0-nightly.20210520":"92.0.4511.0","14.0.0-nightly.20210523":"92.0.4511.0","14.0.0-nightly.20210524":"92.0.4511.0","14.0.0":"93.0.4577.58","14.0.1":"93.0.4577.63","14.0.2":"93.0.4577.82","14.1.0":"93.0.4577.82","14.1.1":"93.0.4577.82","14.2.0":"93.0.4577.82","14.2.1":"93.0.4577.82","14.2.2":"93.0.4577.82","14.2.3":"93.0.4577.82","14.2.4":"93.0.4577.82","14.2.5":"93.0.4577.82","14.2.6":"93.0.4577.82","14.2.7":"93.0.4577.82","14.2.8":"93.0.4577.82","14.2.9":"93.0.4577.82","15.0.0-alpha.1":"93.0.4566.0","15.0.0-alpha.2":"93.0.4566.0","15.0.0-alpha.3":"94.0.4584.0","15.0.0-alpha.4":"94.0.4584.0","15.0.0-alpha.5":"94.0.4584.0","15.0.0-alpha.6":"94.0.4584.0","15.0.0-alpha.7":"94.0.4590.2","15.0.0-alpha.8":"94.0.4590.2","15.0.0-alpha.9":"94.0.4590.2","15.0.0-alpha.10":"94.0.4606.12","15.0.0-beta.1":"94.0.4606.20","15.0.0-beta.2":"94.0.4606.20","15.0.0-beta.3":"94.0.4606.31","15.0.0-beta.4":"94.0.4606.31","15.0.0-beta.5":"94.0.4606.31","15.0.0-beta.6":"94.0.4606.31","15.0.0-beta.7":"94.0.4606.31","15.0.0-nightly.20210527":"92.0.4511.0","15.0.0-nightly.20210528":"92.0.4511.0","15.0.0-nightly.20210531":"92.0.4511.0","15.0.0-nightly.20210601":"92.0.4511.0","15.0.0-nightly.20210602":"92.0.4511.0","15.0.0-nightly.20210603":"93.0.4530.0","15.0.0-nightly.20210604":"93.0.4530.0","15.0.0-nightly.20210608":"93.0.4535.0","15.0.0-nightly.20210609":"93.0.4536.0","15.0.0-nightly.20210610":"93.0.4536.0","15.0.0-nightly.20210611":"93.0.4536.0","15.0.0-nightly.20210614":"93.0.4536.0","15.0.0-nightly.20210615":"93.0.4536.0","15.0.0-nightly.20210616":"93.0.4536.0","15.0.0-nightly.20210617":"93.0.4539.0","15.0.0-nightly.20210618":"93.0.4539.0","15.0.0-nightly.20210621":"93.0.4539.0","15.0.0-nightly.20210622":"93.0.4539.0","15.0.0-nightly.20210623":"93.0.4550.0","15.0.0-nightly.20210624":"93.0.4550.0","15.0.0-nightly.20210625":"93.0.4552.0","15.0.0-nightly.20210628":"93.0.4552.0","15.0.0-nightly.20210629":"93.0.4552.0","15.0.0-nightly.20210630":"93.0.4558.0","15.0.0-nightly.20210701":"93.0.4558.0","15.0.0-nightly.20210702":"93.0.4558.0","15.0.0-nightly.20210705":"93.0.4558.0","15.0.0-nightly.20210706":"93.0.4566.0","15.0.0-nightly.20210707":"93.0.4566.0","15.0.0-nightly.20210708":"93.0.4566.0","15.0.0-nightly.20210709":"93.0.4566.0","15.0.0-nightly.20210712":"93.0.4566.0","15.0.0-nightly.20210713":"93.0.4566.0","15.0.0-nightly.20210714":"93.0.4566.0","15.0.0-nightly.20210715":"93.0.4566.0","15.0.0-nightly.20210716":"93.0.4566.0","15.0.0-nightly.20210719":"93.0.4566.0","15.0.0-nightly.20210720":"93.0.4566.0","15.0.0-nightly.20210721":"93.0.4566.0","15.0.0":"94.0.4606.51","15.1.0":"94.0.4606.61","15.1.1":"94.0.4606.61","15.1.2":"94.0.4606.71","15.2.0":"94.0.4606.81","15.3.0":"94.0.4606.81","15.3.1":"94.0.4606.81","15.3.2":"94.0.4606.81","15.3.3":"94.0.4606.81","15.3.4":"94.0.4606.81","15.3.5":"94.0.4606.81","15.3.6":"94.0.4606.81","15.3.7":"94.0.4606.81","15.4.0":"94.0.4606.81","15.4.1":"94.0.4606.81","15.4.2":"94.0.4606.81","15.5.0":"94.0.4606.81","15.5.1":"94.0.4606.81","15.5.2":"94.0.4606.81","15.5.3":"94.0.4606.81","15.5.4":"94.0.4606.81","15.5.5":"94.0.4606.81","15.5.6":"94.0.4606.81","15.5.7":"94.0.4606.81","16.0.0-alpha.1":"95.0.4629.0","16.0.0-alpha.2":"95.0.4629.0","16.0.0-alpha.3":"95.0.4629.0","16.0.0-alpha.4":"95.0.4629.0","16.0.0-alpha.5":"95.0.4629.0","16.0.0-alpha.6":"95.0.4629.0","16.0.0-alpha.7":"95.0.4629.0","16.0.0-alpha.8":"96.0.4647.0","16.0.0-alpha.9":"96.0.4647.0","16.0.0-beta.1":"96.0.4647.0","16.0.0-beta.2":"96.0.4647.0","16.0.0-beta.3":"96.0.4647.0","16.0.0-beta.4":"96.0.4664.18","16.0.0-beta.5":"96.0.4664.18","16.0.0-beta.6":"96.0.4664.27","16.0.0-beta.7":"96.0.4664.27","16.0.0-beta.8":"96.0.4664.35","16.0.0-beta.9":"96.0.4664.35","16.0.0-nightly.20210722":"93.0.4566.0","16.0.0-nightly.20210723":"93.0.4566.0","16.0.0-nightly.20210726":"93.0.4566.0","16.0.0-nightly.20210727":"94.0.4584.0","16.0.0-nightly.20210728":"94.0.4584.0","16.0.0-nightly.20210729":"94.0.4584.0","16.0.0-nightly.20210730":"94.0.4584.0","16.0.0-nightly.20210802":"94.0.4584.0","16.0.0-nightly.20210803":"94.0.4584.0","16.0.0-nightly.20210804":"94.0.4584.0","16.0.0-nightly.20210805":"94.0.4584.0","16.0.0-nightly.20210806":"94.0.4584.0","16.0.0-nightly.20210809":"94.0.4584.0","16.0.0-nightly.20210810":"94.0.4584.0","16.0.0-nightly.20210811":"94.0.4584.0","16.0.0-nightly.20210812":"94.0.4590.2","16.0.0-nightly.20210813":"94.0.4590.2","16.0.0-nightly.20210816":"94.0.4590.2","16.0.0-nightly.20210817":"94.0.4590.2","16.0.0-nightly.20210818":"94.0.4590.2","16.0.0-nightly.20210819":"94.0.4590.2","16.0.0-nightly.20210820":"94.0.4590.2","16.0.0-nightly.20210823":"94.0.4590.2","16.0.0-nightly.20210824":"95.0.4612.5","16.0.0-nightly.20210825":"95.0.4612.5","16.0.0-nightly.20210826":"95.0.4612.5","16.0.0-nightly.20210827":"95.0.4612.5","16.0.0-nightly.20210830":"95.0.4612.5","16.0.0-nightly.20210831":"95.0.4612.5","16.0.0-nightly.20210901":"95.0.4612.5","16.0.0-nightly.20210902":"95.0.4629.0","16.0.0-nightly.20210903":"95.0.4629.0","16.0.0-nightly.20210906":"95.0.4629.0","16.0.0-nightly.20210907":"95.0.4629.0","16.0.0-nightly.20210908":"95.0.4629.0","16.0.0-nightly.20210909":"95.0.4629.0","16.0.0-nightly.20210910":"95.0.4629.0","16.0.0-nightly.20210913":"95.0.4629.0","16.0.0-nightly.20210914":"95.0.4629.0","16.0.0-nightly.20210915":"95.0.4629.0","16.0.0-nightly.20210916":"95.0.4629.0","16.0.0-nightly.20210917":"95.0.4629.0","16.0.0-nightly.20210920":"95.0.4629.0","16.0.0-nightly.20210921":"95.0.4629.0","16.0.0-nightly.20210922":"95.0.4629.0","16.0.0":"96.0.4664.45","16.0.1":"96.0.4664.45","16.0.2":"96.0.4664.55","16.0.3":"96.0.4664.55","16.0.4":"96.0.4664.55","16.0.5":"96.0.4664.55","16.0.6":"96.0.4664.110","16.0.7":"96.0.4664.110","16.0.8":"96.0.4664.110","16.0.9":"96.0.4664.174","16.0.10":"96.0.4664.174","16.1.0":"96.0.4664.174","16.1.1":"96.0.4664.174","16.2.0":"96.0.4664.174","16.2.1":"96.0.4664.174","16.2.2":"96.0.4664.174","16.2.3":"96.0.4664.174","16.2.4":"96.0.4664.174","16.2.5":"96.0.4664.174","16.2.6":"96.0.4664.174","16.2.7":"96.0.4664.174","16.2.8":"96.0.4664.174","17.0.0-alpha.1":"96.0.4664.4","17.0.0-alpha.2":"96.0.4664.4","17.0.0-alpha.3":"96.0.4664.4","17.0.0-alpha.4":"98.0.4706.0","17.0.0-alpha.5":"98.0.4706.0","17.0.0-alpha.6":"98.0.4706.0","17.0.0-beta.1":"98.0.4706.0","17.0.0-beta.2":"98.0.4706.0","17.0.0-beta.3":"98.0.4758.9","17.0.0-beta.4":"98.0.4758.11","17.0.0-beta.5":"98.0.4758.11","17.0.0-beta.6":"98.0.4758.11","17.0.0-beta.7":"98.0.4758.11","17.0.0-beta.8":"98.0.4758.11","17.0.0-beta.9":"98.0.4758.11","17.0.0-nightly.20210923":"95.0.4629.0","17.0.0-nightly.20210924":"95.0.4629.0","17.0.0-nightly.20210927":"95.0.4629.0","17.0.0-nightly.20210928":"95.0.4629.0","17.0.0-nightly.20210929":"95.0.4629.0","17.0.0-nightly.20210930":"95.0.4629.0","17.0.0-nightly.20211001":"95.0.4629.0","17.0.0-nightly.20211004":"95.0.4629.0","17.0.0-nightly.20211005":"95.0.4629.0","17.0.0-nightly.20211006":"96.0.4647.0","17.0.0-nightly.20211007":"96.0.4647.0","17.0.0-nightly.20211008":"96.0.4647.0","17.0.0-nightly.20211011":"96.0.4647.0","17.0.0-nightly.20211012":"96.0.4647.0","17.0.0-nightly.20211013":"96.0.4647.0","17.0.0-nightly.20211014":"96.0.4647.0","17.0.0-nightly.20211015":"96.0.4647.0","17.0.0-nightly.20211018":"96.0.4647.0","17.0.0-nightly.20211019":"96.0.4647.0","17.0.0-nightly.20211020":"96.0.4647.0","17.0.0-nightly.20211021":"96.0.4647.0","17.0.0-nightly.20211022":"96.0.4664.4","17.0.0-nightly.20211025":"96.0.4664.4","17.0.0-nightly.20211026":"96.0.4664.4","17.0.0-nightly.20211027":"96.0.4664.4","17.0.0-nightly.20211028":"96.0.4664.4","17.0.0-nightly.20211029":"96.0.4664.4","17.0.0-nightly.20211101":"96.0.4664.4","17.0.0-nightly.20211102":"96.0.4664.4","17.0.0-nightly.20211103":"96.0.4664.4","17.0.0-nightly.20211104":"96.0.4664.4","17.0.0-nightly.20211105":"96.0.4664.4","17.0.0-nightly.20211108":"96.0.4664.4","17.0.0-nightly.20211109":"96.0.4664.4","17.0.0-nightly.20211110":"96.0.4664.4","17.0.0-nightly.20211111":"96.0.4664.4","17.0.0-nightly.20211112":"96.0.4664.4","17.0.0-nightly.20211115":"96.0.4664.4","17.0.0-nightly.20211116":"96.0.4664.4","17.0.0-nightly.20211117":"96.0.4664.4","17.0.0":"98.0.4758.74","17.0.1":"98.0.4758.82","17.1.0":"98.0.4758.102","17.1.1":"98.0.4758.109","17.1.2":"98.0.4758.109","17.2.0":"98.0.4758.109","17.3.0":"98.0.4758.141","17.3.1":"98.0.4758.141","17.4.0":"98.0.4758.141","17.4.1":"98.0.4758.141","17.4.2":"98.0.4758.141","17.4.3":"98.0.4758.141","17.4.4":"98.0.4758.141","17.4.5":"98.0.4758.141","17.4.6":"98.0.4758.141","17.4.7":"98.0.4758.141","17.4.8":"98.0.4758.141","17.4.9":"98.0.4758.141","17.4.10":"98.0.4758.141","17.4.11":"98.0.4758.141","18.0.0-alpha.1":"99.0.4767.0","18.0.0-alpha.2":"99.0.4767.0","18.0.0-alpha.3":"99.0.4767.0","18.0.0-alpha.4":"99.0.4767.0","18.0.0-alpha.5":"99.0.4767.0","18.0.0-beta.1":"100.0.4894.0","18.0.0-beta.2":"100.0.4894.0","18.0.0-beta.3":"100.0.4894.0","18.0.0-beta.4":"100.0.4894.0","18.0.0-beta.5":"100.0.4894.0","18.0.0-beta.6":"100.0.4894.0","18.0.0-nightly.20211118":"96.0.4664.4","18.0.0-nightly.20211119":"96.0.4664.4","18.0.0-nightly.20211122":"96.0.4664.4","18.0.0-nightly.20211123":"96.0.4664.4","18.0.0-nightly.20211124":"98.0.4706.0","18.0.0-nightly.20211125":"98.0.4706.0","18.0.0-nightly.20211126":"98.0.4706.0","18.0.0-nightly.20211129":"98.0.4706.0","18.0.0-nightly.20211130":"98.0.4706.0","18.0.0-nightly.20211201":"98.0.4706.0","18.0.0-nightly.20211202":"98.0.4706.0","18.0.0-nightly.20211203":"98.0.4706.0","18.0.0-nightly.20211206":"98.0.4706.0","18.0.0-nightly.20211207":"98.0.4706.0","18.0.0-nightly.20211208":"98.0.4706.0","18.0.0-nightly.20211209":"98.0.4706.0","18.0.0-nightly.20211210":"98.0.4706.0","18.0.0-nightly.20211213":"98.0.4706.0","18.0.0-nightly.20211214":"98.0.4706.0","18.0.0-nightly.20211215":"98.0.4706.0","18.0.0-nightly.20211216":"98.0.4706.0","18.0.0-nightly.20211217":"98.0.4706.0","18.0.0-nightly.20211220":"98.0.4706.0","18.0.0-nightly.20211221":"98.0.4706.0","18.0.0-nightly.20211222":"98.0.4706.0","18.0.0-nightly.20211223":"98.0.4706.0","18.0.0-nightly.20211228":"98.0.4706.0","18.0.0-nightly.20211229":"98.0.4706.0","18.0.0-nightly.20211231":"98.0.4706.0","18.0.0-nightly.20220103":"98.0.4706.0","18.0.0-nightly.20220104":"98.0.4706.0","18.0.0-nightly.20220105":"98.0.4706.0","18.0.0-nightly.20220106":"98.0.4706.0","18.0.0-nightly.20220107":"98.0.4706.0","18.0.0-nightly.20220110":"98.0.4706.0","18.0.0-nightly.20220111":"99.0.4767.0","18.0.0-nightly.20220112":"99.0.4767.0","18.0.0-nightly.20220113":"99.0.4767.0","18.0.0-nightly.20220114":"99.0.4767.0","18.0.0-nightly.20220117":"99.0.4767.0","18.0.0-nightly.20220118":"99.0.4767.0","18.0.0-nightly.20220119":"99.0.4767.0","18.0.0-nightly.20220121":"99.0.4767.0","18.0.0-nightly.20220124":"99.0.4767.0","18.0.0-nightly.20220125":"99.0.4767.0","18.0.0-nightly.20220127":"99.0.4767.0","18.0.0-nightly.20220128":"99.0.4767.0","18.0.0-nightly.20220131":"99.0.4767.0","18.0.0-nightly.20220201":"99.0.4767.0","18.0.0":"100.0.4896.56","18.0.1":"100.0.4896.60","18.0.2":"100.0.4896.60","18.0.3":"100.0.4896.75","18.0.4":"100.0.4896.75","18.1.0":"100.0.4896.127","18.2.0":"100.0.4896.143","18.2.1":"100.0.4896.143","18.2.2":"100.0.4896.143","18.2.3":"100.0.4896.143","18.2.4":"100.0.4896.160","18.3.0":"100.0.4896.160","18.3.1":"100.0.4896.160","18.3.2":"100.0.4896.160","18.3.3":"100.0.4896.160","18.3.4":"100.0.4896.160","18.3.5":"100.0.4896.160","18.3.6":"100.0.4896.160","18.3.7":"100.0.4896.160","18.3.8":"100.0.4896.160","18.3.9":"100.0.4896.160","18.3.11":"100.0.4896.160","18.3.12":"100.0.4896.160","18.3.13":"100.0.4896.160","18.3.14":"100.0.4896.160","18.3.15":"100.0.4896.160","19.0.0-alpha.1":"102.0.4962.3","19.0.0-alpha.2":"102.0.4971.0","19.0.0-alpha.3":"102.0.4971.0","19.0.0-alpha.4":"102.0.4989.0","19.0.0-alpha.5":"102.0.4989.0","19.0.0-beta.1":"102.0.4999.0","19.0.0-beta.2":"102.0.4999.0","19.0.0-beta.3":"102.0.4999.0","19.0.0-beta.4":"102.0.5005.27","19.0.0-beta.5":"102.0.5005.40","19.0.0-beta.6":"102.0.5005.40","19.0.0-beta.7":"102.0.5005.40","19.0.0-beta.8":"102.0.5005.49","19.0.0-nightly.20220202":"99.0.4767.0","19.0.0-nightly.20220203":"99.0.4767.0","19.0.0-nightly.20220204":"99.0.4767.0","19.0.0-nightly.20220207":"99.0.4767.0","19.0.0-nightly.20220208":"99.0.4767.0","19.0.0-nightly.20220209":"99.0.4767.0","19.0.0-nightly.20220308":"100.0.4894.0","19.0.0-nightly.20220309":"100.0.4894.0","19.0.0-nightly.20220310":"100.0.4894.0","19.0.0-nightly.20220311":"100.0.4894.0","19.0.0-nightly.20220314":"100.0.4894.0","19.0.0-nightly.20220315":"100.0.4894.0","19.0.0-nightly.20220316":"100.0.4894.0","19.0.0-nightly.20220317":"100.0.4894.0","19.0.0-nightly.20220318":"100.0.4894.0","19.0.0-nightly.20220321":"100.0.4894.0","19.0.0-nightly.20220322":"100.0.4894.0","19.0.0-nightly.20220323":"100.0.4894.0","19.0.0-nightly.20220324":"100.0.4894.0","19.0.0-nightly.20220325":"102.0.4961.0","19.0.0-nightly.20220328":"102.0.4962.3","19.0.0-nightly.20220329":"102.0.4962.3","19.0.0":"102.0.5005.61","19.0.1":"102.0.5005.61","19.0.2":"102.0.5005.63","19.0.3":"102.0.5005.63","19.0.4":"102.0.5005.63","19.0.5":"102.0.5005.115","19.0.6":"102.0.5005.115","19.0.7":"102.0.5005.134","19.0.8":"102.0.5005.148","19.0.9":"102.0.5005.167","19.0.10":"102.0.5005.167","19.0.11":"102.0.5005.167","19.0.12":"102.0.5005.167","19.0.13":"102.0.5005.167","19.0.14":"102.0.5005.167","19.0.15":"102.0.5005.167","19.0.16":"102.0.5005.167","19.0.17":"102.0.5005.167","19.1.0":"102.0.5005.167","19.1.1":"102.0.5005.167","19.1.2":"102.0.5005.167","19.1.3":"102.0.5005.167","19.1.4":"102.0.5005.167","19.1.5":"102.0.5005.167","19.1.6":"102.0.5005.167","19.1.7":"102.0.5005.167","19.1.8":"102.0.5005.167","19.1.9":"102.0.5005.167","20.0.0-alpha.1":"103.0.5044.0","20.0.0-alpha.2":"104.0.5073.0","20.0.0-alpha.3":"104.0.5073.0","20.0.0-alpha.4":"104.0.5073.0","20.0.0-alpha.5":"104.0.5073.0","20.0.0-alpha.6":"104.0.5073.0","20.0.0-alpha.7":"104.0.5073.0","20.0.0-beta.1":"104.0.5073.0","20.0.0-beta.2":"104.0.5073.0","20.0.0-beta.3":"104.0.5073.0","20.0.0-beta.4":"104.0.5073.0","20.0.0-beta.5":"104.0.5073.0","20.0.0-beta.6":"104.0.5073.0","20.0.0-beta.7":"104.0.5073.0","20.0.0-beta.8":"104.0.5073.0","20.0.0-beta.9":"104.0.5112.39","20.0.0-beta.10":"104.0.5112.48","20.0.0-beta.11":"104.0.5112.48","20.0.0-beta.12":"104.0.5112.48","20.0.0-beta.13":"104.0.5112.57","20.0.0-nightly.20220330":"102.0.4962.3","20.0.0-nightly.20220411":"102.0.4971.0","20.0.0-nightly.20220414":"102.0.4989.0","20.0.0-nightly.20220415":"102.0.4989.0","20.0.0-nightly.20220418":"102.0.4989.0","20.0.0-nightly.20220419":"102.0.4989.0","20.0.0-nightly.20220420":"102.0.4989.0","20.0.0-nightly.20220421":"102.0.4989.0","20.0.0-nightly.20220425":"102.0.4999.0","20.0.0-nightly.20220426":"102.0.4999.0","20.0.0-nightly.20220427":"102.0.4999.0","20.0.0-nightly.20220428":"102.0.4999.0","20.0.0-nightly.20220429":"102.0.4999.0","20.0.0-nightly.20220502":"102.0.4999.0","20.0.0-nightly.20220503":"102.0.4999.0","20.0.0-nightly.20220504":"102.0.4999.0","20.0.0-nightly.20220505":"102.0.4999.0","20.0.0-nightly.20220506":"102.0.4999.0","20.0.0-nightly.20220509":"102.0.4999.0","20.0.0-nightly.20220511":"102.0.4999.0","20.0.0-nightly.20220512":"102.0.4999.0","20.0.0-nightly.20220513":"102.0.4999.0","20.0.0-nightly.20220516":"102.0.4999.0","20.0.0-nightly.20220517":"102.0.4999.0","20.0.0-nightly.20220518":"103.0.5044.0","20.0.0-nightly.20220519":"103.0.5044.0","20.0.0-nightly.20220520":"103.0.5044.0","20.0.0-nightly.20220523":"103.0.5044.0","20.0.0-nightly.20220524":"103.0.5044.0","20.0.0":"104.0.5112.65","20.0.1":"104.0.5112.81","20.0.2":"104.0.5112.81","20.0.3":"104.0.5112.81","20.1.0":"104.0.5112.102","20.1.1":"104.0.5112.102","20.1.2":"104.0.5112.114","20.1.3":"104.0.5112.114","20.1.4":"104.0.5112.114","20.2.0":"104.0.5112.124","20.3.0":"104.0.5112.124","20.3.1":"104.0.5112.124","20.3.2":"104.0.5112.124","20.3.3":"104.0.5112.124","20.3.4":"104.0.5112.124","20.3.5":"104.0.5112.124","20.3.6":"104.0.5112.124","20.3.7":"104.0.5112.124","20.3.8":"104.0.5112.124","20.3.9":"104.0.5112.124","20.3.10":"104.0.5112.124","20.3.11":"104.0.5112.124","20.3.12":"104.0.5112.124","21.0.0-alpha.1":"105.0.5187.0","21.0.0-alpha.2":"105.0.5187.0","21.0.0-alpha.3":"105.0.5187.0","21.0.0-alpha.4":"105.0.5187.0","21.0.0-alpha.5":"105.0.5187.0","21.0.0-alpha.6":"106.0.5216.0","21.0.0-beta.1":"106.0.5216.0","21.0.0-beta.2":"106.0.5216.0","21.0.0-beta.3":"106.0.5216.0","21.0.0-beta.4":"106.0.5216.0","21.0.0-beta.5":"106.0.5216.0","21.0.0-beta.6":"106.0.5249.40","21.0.0-beta.7":"106.0.5249.40","21.0.0-beta.8":"106.0.5249.40","21.0.0-nightly.20220526":"103.0.5044.0","21.0.0-nightly.20220527":"103.0.5044.0","21.0.0-nightly.20220530":"103.0.5044.0","21.0.0-nightly.20220531":"103.0.5044.0","21.0.0-nightly.20220602":"104.0.5073.0","21.0.0-nightly.20220603":"104.0.5073.0","21.0.0-nightly.20220606":"104.0.5073.0","21.0.0-nightly.20220607":"104.0.5073.0","21.0.0-nightly.20220608":"104.0.5073.0","21.0.0-nightly.20220609":"104.0.5073.0","21.0.0-nightly.20220610":"104.0.5073.0","21.0.0-nightly.20220613":"104.0.5073.0","21.0.0-nightly.20220614":"104.0.5073.0","21.0.0-nightly.20220615":"104.0.5073.0","21.0.0-nightly.20220616":"104.0.5073.0","21.0.0-nightly.20220617":"104.0.5073.0","21.0.0-nightly.20220620":"104.0.5073.0","21.0.0-nightly.20220621":"104.0.5073.0","21.0.0-nightly.20220622":"104.0.5073.0","21.0.0-nightly.20220623":"104.0.5073.0","21.0.0-nightly.20220624":"104.0.5073.0","21.0.0-nightly.20220627":"104.0.5073.0","21.0.0-nightly.20220628":"105.0.5129.0","21.0.0-nightly.20220629":"105.0.5129.0","21.0.0-nightly.20220630":"105.0.5129.0","21.0.0-nightly.20220701":"105.0.5129.0","21.0.0-nightly.20220704":"105.0.5129.0","21.0.0-nightly.20220705":"105.0.5129.0","21.0.0-nightly.20220706":"105.0.5129.0","21.0.0-nightly.20220707":"105.0.5129.0","21.0.0-nightly.20220708":"105.0.5129.0","21.0.0-nightly.20220711":"105.0.5129.0","21.0.0-nightly.20220712":"105.0.5129.0","21.0.0-nightly.20220713":"105.0.5129.0","21.0.0-nightly.20220715":"105.0.5173.0","21.0.0-nightly.20220718":"105.0.5173.0","21.0.0-nightly.20220719":"105.0.5173.0","21.0.0-nightly.20220720":"105.0.5187.0","21.0.0-nightly.20220721":"105.0.5187.0","21.0.0-nightly.20220722":"105.0.5187.0","21.0.0-nightly.20220725":"105.0.5187.0","21.0.0-nightly.20220726":"105.0.5187.0","21.0.0-nightly.20220727":"105.0.5187.0","21.0.0-nightly.20220728":"105.0.5187.0","21.0.0-nightly.20220801":"105.0.5187.0","21.0.0-nightly.20220802":"105.0.5187.0","21.0.0":"106.0.5249.51","21.0.1":"106.0.5249.61","21.1.0":"106.0.5249.91","21.1.1":"106.0.5249.103","21.2.0":"106.0.5249.119","21.2.1":"106.0.5249.165","21.2.2":"106.0.5249.168","21.2.3":"106.0.5249.168","21.3.0":"106.0.5249.181","21.3.1":"106.0.5249.181","21.3.3":"106.0.5249.199","21.3.4":"106.0.5249.199","21.3.5":"106.0.5249.199","21.4.0":"106.0.5249.199","21.4.1":"106.0.5249.199","21.4.2":"106.0.5249.199","21.4.3":"106.0.5249.199","21.4.4":"106.0.5249.199","22.0.0-alpha.1":"107.0.5286.0","22.0.0-alpha.3":"108.0.5329.0","22.0.0-alpha.4":"108.0.5329.0","22.0.0-alpha.5":"108.0.5329.0","22.0.0-alpha.6":"108.0.5329.0","22.0.0-alpha.7":"108.0.5355.0","22.0.0-alpha.8":"108.0.5359.10","22.0.0-beta.1":"108.0.5359.10","22.0.0-beta.2":"108.0.5359.10","22.0.0-beta.3":"108.0.5359.10","22.0.0-beta.4":"108.0.5359.29","22.0.0-beta.5":"108.0.5359.40","22.0.0-beta.6":"108.0.5359.40","22.0.0-beta.7":"108.0.5359.48","22.0.0-beta.8":"108.0.5359.48","22.0.0-nightly.20220808":"105.0.5187.0","22.0.0-nightly.20220809":"105.0.5187.0","22.0.0-nightly.20220810":"105.0.5187.0","22.0.0-nightly.20220811":"105.0.5187.0","22.0.0-nightly.20220812":"105.0.5187.0","22.0.0-nightly.20220815":"105.0.5187.0","22.0.0-nightly.20220816":"105.0.5187.0","22.0.0-nightly.20220817":"105.0.5187.0","22.0.0-nightly.20220822":"106.0.5216.0","22.0.0-nightly.20220823":"106.0.5216.0","22.0.0-nightly.20220824":"106.0.5216.0","22.0.0-nightly.20220825":"106.0.5216.0","22.0.0-nightly.20220829":"106.0.5216.0","22.0.0-nightly.20220830":"106.0.5216.0","22.0.0-nightly.20220831":"106.0.5216.0","22.0.0-nightly.20220901":"106.0.5216.0","22.0.0-nightly.20220902":"106.0.5216.0","22.0.0-nightly.20220905":"106.0.5216.0","22.0.0-nightly.20220908":"107.0.5274.0","22.0.0-nightly.20220909":"107.0.5286.0","22.0.0-nightly.20220912":"107.0.5286.0","22.0.0-nightly.20220913":"107.0.5286.0","22.0.0-nightly.20220914":"107.0.5286.0","22.0.0-nightly.20220915":"107.0.5286.0","22.0.0-nightly.20220916":"107.0.5286.0","22.0.0-nightly.20220919":"107.0.5286.0","22.0.0-nightly.20220920":"107.0.5286.0","22.0.0-nightly.20220921":"107.0.5286.0","22.0.0-nightly.20220922":"107.0.5286.0","22.0.0-nightly.20220923":"107.0.5286.0","22.0.0-nightly.20220926":"107.0.5286.0","22.0.0-nightly.20220927":"107.0.5286.0","22.0.0-nightly.20220928":"107.0.5286.0","22.0.0":"108.0.5359.62","22.0.1":"108.0.5359.125","22.0.2":"108.0.5359.179","22.0.3":"108.0.5359.179","22.1.0":"108.0.5359.179","22.2.0":"108.0.5359.215","22.2.1":"108.0.5359.215","22.3.0":"108.0.5359.215","22.3.1":"108.0.5359.215","22.3.2":"108.0.5359.215","22.3.3":"108.0.5359.215","22.3.4":"108.0.5359.215","22.3.5":"108.0.5359.215","22.3.6":"108.0.5359.215","22.3.7":"108.0.5359.215","22.3.8":"108.0.5359.215","22.3.9":"108.0.5359.215","22.3.10":"108.0.5359.215","22.3.11":"108.0.5359.215","22.3.12":"108.0.5359.215","22.3.13":"108.0.5359.215","22.3.14":"108.0.5359.215","22.3.15":"108.0.5359.215","22.3.16":"108.0.5359.215","22.3.17":"108.0.5359.215","22.3.18":"108.0.5359.215","22.3.20":"108.0.5359.215","22.3.21":"108.0.5359.215","22.3.22":"108.0.5359.215","22.3.23":"108.0.5359.215","22.3.24":"108.0.5359.215","22.3.25":"108.0.5359.215","22.3.26":"108.0.5359.215","22.3.27":"108.0.5359.215","23.0.0-alpha.1":"110.0.5415.0","23.0.0-alpha.2":"110.0.5451.0","23.0.0-alpha.3":"110.0.5451.0","23.0.0-beta.1":"110.0.5478.5","23.0.0-beta.2":"110.0.5478.5","23.0.0-beta.3":"110.0.5478.5","23.0.0-beta.4":"110.0.5481.30","23.0.0-beta.5":"110.0.5481.38","23.0.0-beta.6":"110.0.5481.52","23.0.0-beta.8":"110.0.5481.52","23.0.0-nightly.20220929":"107.0.5286.0","23.0.0-nightly.20220930":"107.0.5286.0","23.0.0-nightly.20221003":"107.0.5286.0","23.0.0-nightly.20221004":"108.0.5329.0","23.0.0-nightly.20221005":"108.0.5329.0","23.0.0-nightly.20221006":"108.0.5329.0","23.0.0-nightly.20221007":"108.0.5329.0","23.0.0-nightly.20221010":"108.0.5329.0","23.0.0-nightly.20221011":"108.0.5329.0","23.0.0-nightly.20221012":"108.0.5329.0","23.0.0-nightly.20221013":"108.0.5329.0","23.0.0-nightly.20221014":"108.0.5329.0","23.0.0-nightly.20221017":"108.0.5329.0","23.0.0-nightly.20221018":"108.0.5355.0","23.0.0-nightly.20221019":"108.0.5355.0","23.0.0-nightly.20221020":"108.0.5355.0","23.0.0-nightly.20221021":"108.0.5355.0","23.0.0-nightly.20221024":"108.0.5355.0","23.0.0-nightly.20221026":"108.0.5355.0","23.0.0-nightly.20221027":"109.0.5382.0","23.0.0-nightly.20221028":"109.0.5382.0","23.0.0-nightly.20221031":"109.0.5382.0","23.0.0-nightly.20221101":"109.0.5382.0","23.0.0-nightly.20221102":"109.0.5382.0","23.0.0-nightly.20221103":"109.0.5382.0","23.0.0-nightly.20221104":"109.0.5382.0","23.0.0-nightly.20221107":"109.0.5382.0","23.0.0-nightly.20221108":"109.0.5382.0","23.0.0-nightly.20221109":"109.0.5382.0","23.0.0-nightly.20221110":"109.0.5382.0","23.0.0-nightly.20221111":"109.0.5382.0","23.0.0-nightly.20221114":"109.0.5382.0","23.0.0-nightly.20221115":"109.0.5382.0","23.0.0-nightly.20221116":"109.0.5382.0","23.0.0-nightly.20221117":"109.0.5382.0","23.0.0-nightly.20221118":"110.0.5415.0","23.0.0-nightly.20221121":"110.0.5415.0","23.0.0-nightly.20221122":"110.0.5415.0","23.0.0-nightly.20221123":"110.0.5415.0","23.0.0-nightly.20221124":"110.0.5415.0","23.0.0-nightly.20221125":"110.0.5415.0","23.0.0-nightly.20221128":"110.0.5415.0","23.0.0-nightly.20221129":"110.0.5415.0","23.0.0-nightly.20221130":"110.0.5415.0","23.0.0":"110.0.5481.77","23.1.0":"110.0.5481.100","23.1.1":"110.0.5481.104","23.1.2":"110.0.5481.177","23.1.3":"110.0.5481.179","23.1.4":"110.0.5481.192","23.2.0":"110.0.5481.192","23.2.1":"110.0.5481.208","23.2.2":"110.0.5481.208","23.2.3":"110.0.5481.208","23.2.4":"110.0.5481.208","23.3.0":"110.0.5481.208","23.3.1":"110.0.5481.208","23.3.2":"110.0.5481.208","23.3.3":"110.0.5481.208","23.3.4":"110.0.5481.208","23.3.5":"110.0.5481.208","23.3.6":"110.0.5481.208","23.3.7":"110.0.5481.208","23.3.8":"110.0.5481.208","23.3.9":"110.0.5481.208","23.3.10":"110.0.5481.208","23.3.11":"110.0.5481.208","23.3.12":"110.0.5481.208","23.3.13":"110.0.5481.208","24.0.0-alpha.1":"111.0.5560.0","24.0.0-alpha.2":"111.0.5560.0","24.0.0-alpha.3":"111.0.5560.0","24.0.0-alpha.4":"111.0.5560.0","24.0.0-alpha.5":"111.0.5560.0","24.0.0-alpha.6":"111.0.5560.0","24.0.0-alpha.7":"111.0.5560.0","24.0.0-beta.1":"111.0.5563.50","24.0.0-beta.2":"111.0.5563.50","24.0.0-beta.3":"112.0.5615.20","24.0.0-beta.4":"112.0.5615.20","24.0.0-beta.5":"112.0.5615.29","24.0.0-beta.6":"112.0.5615.39","24.0.0-beta.7":"112.0.5615.39","24.0.0-nightly.20221201":"110.0.5415.0","24.0.0-nightly.20221202":"110.0.5415.0","24.0.0-nightly.20221205":"110.0.5415.0","24.0.0-nightly.20221206":"110.0.5451.0","24.0.0-nightly.20221207":"110.0.5451.0","24.0.0-nightly.20221208":"110.0.5451.0","24.0.0-nightly.20221213":"110.0.5451.0","24.0.0-nightly.20221214":"110.0.5451.0","24.0.0-nightly.20221215":"110.0.5451.0","24.0.0-nightly.20221216":"110.0.5451.0","24.0.0-nightly.20230109":"111.0.5518.0","24.0.0-nightly.20230110":"111.0.5518.0","24.0.0-nightly.20230111":"111.0.5518.0","24.0.0-nightly.20230112":"111.0.5518.0","24.0.0-nightly.20230113":"111.0.5518.0","24.0.0-nightly.20230116":"111.0.5518.0","24.0.0-nightly.20230117":"111.0.5518.0","24.0.0-nightly.20230118":"111.0.5518.0","24.0.0-nightly.20230119":"111.0.5518.0","24.0.0-nightly.20230120":"111.0.5518.0","24.0.0-nightly.20230123":"111.0.5518.0","24.0.0-nightly.20230124":"111.0.5518.0","24.0.0-nightly.20230125":"111.0.5518.0","24.0.0-nightly.20230126":"111.0.5518.0","24.0.0-nightly.20230127":"111.0.5518.0","24.0.0-nightly.20230131":"111.0.5518.0","24.0.0-nightly.20230201":"111.0.5518.0","24.0.0-nightly.20230202":"111.0.5518.0","24.0.0-nightly.20230203":"111.0.5560.0","24.0.0-nightly.20230206":"111.0.5560.0","24.0.0-nightly.20230207":"111.0.5560.0","24.0.0-nightly.20230208":"111.0.5560.0","24.0.0-nightly.20230209":"111.0.5560.0","24.0.0":"112.0.5615.49","24.1.0":"112.0.5615.50","24.1.1":"112.0.5615.50","24.1.2":"112.0.5615.87","24.1.3":"112.0.5615.165","24.2.0":"112.0.5615.165","24.3.0":"112.0.5615.165","24.3.1":"112.0.5615.183","24.4.0":"112.0.5615.204","24.4.1":"112.0.5615.204","24.5.0":"112.0.5615.204","24.5.1":"112.0.5615.204","24.6.0":"112.0.5615.204","24.6.1":"112.0.5615.204","24.6.2":"112.0.5615.204","24.6.3":"112.0.5615.204","24.6.4":"112.0.5615.204","24.6.5":"112.0.5615.204","24.7.0":"112.0.5615.204","24.7.1":"112.0.5615.204","24.8.0":"112.0.5615.204","24.8.1":"112.0.5615.204","24.8.2":"112.0.5615.204","24.8.3":"112.0.5615.204","24.8.4":"112.0.5615.204","24.8.5":"112.0.5615.204","24.8.6":"112.0.5615.204","24.8.7":"112.0.5615.204","24.8.8":"112.0.5615.204","25.0.0-alpha.1":"114.0.5694.0","25.0.0-alpha.2":"114.0.5694.0","25.0.0-alpha.3":"114.0.5710.0","25.0.0-alpha.4":"114.0.5710.0","25.0.0-alpha.5":"114.0.5719.0","25.0.0-alpha.6":"114.0.5719.0","25.0.0-beta.1":"114.0.5719.0","25.0.0-beta.2":"114.0.5719.0","25.0.0-beta.3":"114.0.5719.0","25.0.0-beta.4":"114.0.5735.16","25.0.0-beta.5":"114.0.5735.16","25.0.0-beta.6":"114.0.5735.16","25.0.0-beta.7":"114.0.5735.16","25.0.0-beta.8":"114.0.5735.35","25.0.0-beta.9":"114.0.5735.45","25.0.0-nightly.20230210":"111.0.5560.0","25.0.0-nightly.20230214":"111.0.5560.0","25.0.0-nightly.20230215":"111.0.5560.0","25.0.0-nightly.20230216":"111.0.5560.0","25.0.0-nightly.20230217":"111.0.5560.0","25.0.0-nightly.20230220":"111.0.5560.0","25.0.0-nightly.20230221":"111.0.5560.0","25.0.0-nightly.20230222":"111.0.5560.0","25.0.0-nightly.20230223":"111.0.5560.0","25.0.0-nightly.20230224":"111.0.5560.0","25.0.0-nightly.20230227":"111.0.5560.0","25.0.0-nightly.20230228":"111.0.5560.0","25.0.0-nightly.20230301":"111.0.5560.0","25.0.0-nightly.20230302":"111.0.5560.0","25.0.0-nightly.20230303":"111.0.5560.0","25.0.0-nightly.20230306":"111.0.5560.0","25.0.0-nightly.20230307":"111.0.5560.0","25.0.0-nightly.20230308":"111.0.5560.0","25.0.0-nightly.20230309":"111.0.5560.0","25.0.0-nightly.20230310":"111.0.5560.0","25.0.0-nightly.20230314":"113.0.5636.0","25.0.0-nightly.20230315":"113.0.5651.0","25.0.0-nightly.20230317":"113.0.5653.0","25.0.0-nightly.20230320":"113.0.5660.0","25.0.0-nightly.20230321":"113.0.5664.0","25.0.0-nightly.20230322":"113.0.5666.0","25.0.0-nightly.20230323":"113.0.5668.0","25.0.0-nightly.20230324":"113.0.5670.0","25.0.0-nightly.20230327":"113.0.5670.0","25.0.0-nightly.20230328":"113.0.5670.0","25.0.0-nightly.20230329":"113.0.5670.0","25.0.0-nightly.20230330":"113.0.5670.0","25.0.0-nightly.20230331":"114.0.5684.0","25.0.0-nightly.20230403":"114.0.5684.0","25.0.0-nightly.20230404":"114.0.5692.0","25.0.0-nightly.20230405":"114.0.5694.0","25.0.0":"114.0.5735.45","25.0.1":"114.0.5735.45","25.1.0":"114.0.5735.106","25.1.1":"114.0.5735.106","25.2.0":"114.0.5735.134","25.3.0":"114.0.5735.199","25.3.1":"114.0.5735.243","25.3.2":"114.0.5735.248","25.4.0":"114.0.5735.248","25.5.0":"114.0.5735.289","25.6.0":"114.0.5735.289","25.7.0":"114.0.5735.289","25.8.0":"114.0.5735.289","25.8.1":"114.0.5735.289","25.8.2":"114.0.5735.289","25.8.3":"114.0.5735.289","25.8.4":"114.0.5735.289","25.9.0":"114.0.5735.289","25.9.1":"114.0.5735.289","25.9.2":"114.0.5735.289","25.9.3":"114.0.5735.289","25.9.4":"114.0.5735.289","25.9.5":"114.0.5735.289","25.9.6":"114.0.5735.289","25.9.7":"114.0.5735.289","25.9.8":"114.0.5735.289","26.0.0-alpha.1":"116.0.5791.0","26.0.0-alpha.2":"116.0.5791.0","26.0.0-alpha.3":"116.0.5791.0","26.0.0-alpha.4":"116.0.5791.0","26.0.0-alpha.5":"116.0.5791.0","26.0.0-alpha.6":"116.0.5815.0","26.0.0-alpha.7":"116.0.5831.0","26.0.0-alpha.8":"116.0.5845.0","26.0.0-beta.1":"116.0.5845.0","26.0.0-beta.2":"116.0.5845.14","26.0.0-beta.3":"116.0.5845.14","26.0.0-beta.4":"116.0.5845.14","26.0.0-beta.5":"116.0.5845.14","26.0.0-beta.6":"116.0.5845.14","26.0.0-beta.7":"116.0.5845.14","26.0.0-beta.8":"116.0.5845.42","26.0.0-beta.9":"116.0.5845.42","26.0.0-beta.10":"116.0.5845.49","26.0.0-beta.11":"116.0.5845.49","26.0.0-beta.12":"116.0.5845.62","26.0.0-nightly.20230406":"114.0.5694.0","26.0.0-nightly.20230407":"114.0.5694.0","26.0.0-nightly.20230410":"114.0.5694.0","26.0.0-nightly.20230411":"114.0.5694.0","26.0.0-nightly.20230412":"114.0.5708.0","26.0.0-nightly.20230413":"114.0.5710.0","26.0.0-nightly.20230414":"114.0.5710.0","26.0.0-nightly.20230417":"114.0.5710.0","26.0.0-nightly.20230418":"114.0.5715.0","26.0.0-nightly.20230421":"114.0.5719.0","26.0.0-nightly.20230424":"114.0.5719.0","26.0.0-nightly.20230425":"114.0.5719.0","26.0.0-nightly.20230426":"114.0.5719.0","26.0.0-nightly.20230427":"114.0.5719.0","26.0.0-nightly.20230428":"114.0.5719.0","26.0.0-nightly.20230501":"114.0.5719.0","26.0.0-nightly.20230502":"114.0.5719.0","26.0.0-nightly.20230503":"114.0.5719.0","26.0.0-nightly.20230504":"114.0.5719.0","26.0.0-nightly.20230505":"114.0.5719.0","26.0.0-nightly.20230508":"114.0.5719.0","26.0.0-nightly.20230509":"114.0.5719.0","26.0.0-nightly.20230510":"114.0.5719.0","26.0.0-nightly.20230511":"115.0.5760.0","26.0.0-nightly.20230512":"115.0.5760.0","26.0.0-nightly.20230515":"115.0.5760.0","26.0.0-nightly.20230516":"115.0.5760.0","26.0.0-nightly.20230517":"115.0.5760.0","26.0.0-nightly.20230518":"115.0.5760.0","26.0.0-nightly.20230519":"115.0.5760.0","26.0.0-nightly.20230522":"115.0.5760.0","26.0.0-nightly.20230523":"115.0.5760.0","26.0.0-nightly.20230524":"115.0.5786.0","26.0.0-nightly.20230525":"115.0.5790.0","26.0.0-nightly.20230526":"116.0.5791.0","26.0.0-nightly.20230529":"116.0.5791.0","26.0.0-nightly.20230530":"116.0.5791.0","26.0.0-nightly.20230531":"116.0.5791.0","26.0.0":"116.0.5845.82","26.1.0":"116.0.5845.97","26.2.0":"116.0.5845.179","26.2.1":"116.0.5845.188","26.2.2":"116.0.5845.190","26.2.3":"116.0.5845.190","26.2.4":"116.0.5845.190","26.3.0":"116.0.5845.228","26.4.0":"116.0.5845.228","26.4.1":"116.0.5845.228","26.4.2":"116.0.5845.228","26.4.3":"116.0.5845.228","26.5.0":"116.0.5845.228","26.6.0":"116.0.5845.228","26.6.1":"116.0.5845.228","26.6.2":"116.0.5845.228","27.0.0-alpha.1":"118.0.5949.0","27.0.0-alpha.2":"118.0.5949.0","27.0.0-alpha.3":"118.0.5949.0","27.0.0-alpha.4":"118.0.5949.0","27.0.0-alpha.5":"118.0.5949.0","27.0.0-alpha.6":"118.0.5949.0","27.0.0-beta.1":"118.0.5993.5","27.0.0-beta.2":"118.0.5993.5","27.0.0-beta.3":"118.0.5993.5","27.0.0-beta.4":"118.0.5993.11","27.0.0-beta.5":"118.0.5993.18","27.0.0-beta.6":"118.0.5993.18","27.0.0-beta.7":"118.0.5993.18","27.0.0-beta.8":"118.0.5993.18","27.0.0-beta.9":"118.0.5993.18","27.0.0-nightly.20230601":"116.0.5791.0","27.0.0-nightly.20230602":"116.0.5791.0","27.0.0-nightly.20230605":"116.0.5791.0","27.0.0-nightly.20230606":"116.0.5791.0","27.0.0-nightly.20230607":"116.0.5791.0","27.0.0-nightly.20230609":"116.0.5791.0","27.0.0-nightly.20230612":"116.0.5815.0","27.0.0-nightly.20230613":"116.0.5815.0","27.0.0-nightly.20230614":"116.0.5829.0","27.0.0-nightly.20230615":"116.0.5831.0","27.0.0-nightly.20230616":"116.0.5833.0","27.0.0-nightly.20230619":"116.0.5833.0","27.0.0-nightly.20230620":"116.0.5833.0","27.0.0-nightly.20230621":"116.0.5833.0","27.0.0-nightly.20230622":"116.0.5845.0","27.0.0-nightly.20230623":"116.0.5845.0","27.0.0-nightly.20230626":"116.0.5845.0","27.0.0-nightly.20230627":"116.0.5845.0","27.0.0-nightly.20230628":"116.0.5845.0","27.0.0-nightly.20230629":"116.0.5845.0","27.0.0-nightly.20230630":"116.0.5845.0","27.0.0-nightly.20230703":"117.0.5852.0","27.0.0-nightly.20230704":"117.0.5852.0","27.0.0-nightly.20230705":"117.0.5852.0","27.0.0-nightly.20230706":"117.0.5852.0","27.0.0-nightly.20230707":"117.0.5852.0","27.0.0-nightly.20230710":"117.0.5852.0","27.0.0-nightly.20230711":"117.0.5852.0","27.0.0-nightly.20230712":"117.0.5852.0","27.0.0-nightly.20230713":"117.0.5852.0","27.0.0-nightly.20230714":"117.0.5852.0","27.0.0-nightly.20230717":"117.0.5884.1","27.0.0-nightly.20230718":"117.0.5884.1","27.0.0-nightly.20230719":"117.0.5892.0","27.0.0-nightly.20230720":"117.0.5897.0","27.0.0-nightly.20230721":"117.0.5897.0","27.0.0-nightly.20230724":"117.0.5897.0","27.0.0-nightly.20230725":"117.0.5897.0","27.0.0-nightly.20230726":"117.0.5897.0","27.0.0-nightly.20230727":"117.0.5897.0","27.0.0-nightly.20230728":"117.0.5897.0","27.0.0-nightly.20230731":"117.0.5897.0","27.0.0-nightly.20230801":"117.0.5911.0","27.0.0-nightly.20230802":"117.0.5911.0","27.0.0-nightly.20230803":"117.0.5911.0","27.0.0-nightly.20230804":"117.0.5921.0","27.0.0-nightly.20230807":"117.0.5921.0","27.0.0-nightly.20230808":"117.0.5921.0","27.0.0-nightly.20230814":"117.0.5921.0","27.0.0-nightly.20230815":"117.0.5921.0","27.0.0-nightly.20230816":"118.0.5949.0","27.0.0":"118.0.5993.54","27.0.1":"118.0.5993.89","27.0.2":"118.0.5993.89","27.0.3":"118.0.5993.120","27.0.4":"118.0.5993.129","27.1.0":"118.0.5993.144","27.1.2":"118.0.5993.144","27.1.3":"118.0.5993.159","28.0.0-alpha.1":"119.0.6045.0","28.0.0-alpha.2":"119.0.6045.0","28.0.0-alpha.3":"119.0.6045.21","28.0.0-alpha.4":"119.0.6045.21","28.0.0-alpha.5":"119.0.6045.33","28.0.0-alpha.6":"119.0.6045.33","28.0.0-alpha.7":"119.0.6045.33","28.0.0-beta.1":"119.0.6045.33","28.0.0-beta.2":"120.0.6099.0","28.0.0-beta.3":"120.0.6099.5","28.0.0-beta.4":"120.0.6099.5","28.0.0-beta.5":"120.0.6099.18","28.0.0-beta.6":"120.0.6099.18","28.0.0-beta.7":"120.0.6099.18","28.0.0-beta.8":"120.0.6099.18","28.0.0-beta.9":"120.0.6099.18","28.0.0-beta.10":"120.0.6099.18","28.0.0-beta.11":"120.0.6099.35","28.0.0-nightly.20230817":"118.0.5949.0","28.0.0-nightly.20230818":"118.0.5949.0","28.0.0-nightly.20230821":"118.0.5949.0","28.0.0-nightly.20230822":"118.0.5949.0","28.0.0-nightly.20230823":"118.0.5949.0","28.0.0-nightly.20230824":"118.0.5949.0","28.0.0-nightly.20230825":"118.0.5949.0","28.0.0-nightly.20230828":"118.0.5949.0","28.0.0-nightly.20230829":"118.0.5949.0","28.0.0-nightly.20230830":"118.0.5949.0","28.0.0-nightly.20230831":"118.0.5949.0","28.0.0-nightly.20230906":"118.0.5991.0","28.0.0-nightly.20230907":"118.0.5993.0","28.0.0-nightly.20230908":"118.0.5993.0","28.0.0-nightly.20230911":"118.0.5993.0","28.0.0-nightly.20230912":"118.0.5993.0","28.0.0-nightly.20230913":"118.0.5993.0","28.0.0-nightly.20230914":"118.0.5993.0","28.0.0-nightly.20230915":"118.0.5993.0","28.0.0-nightly.20230919":"119.0.6006.0","28.0.0-nightly.20230920":"119.0.6017.0","28.0.0-nightly.20230921":"119.0.6019.2","28.0.0-nightly.20230925":"119.0.6019.2","28.0.0-nightly.20230926":"119.0.6019.2","28.0.0-nightly.20230927":"119.0.6019.2","28.0.0-nightly.20230928":"119.0.6019.2","28.0.0-nightly.20230929":"119.0.6029.0","28.0.0-nightly.20231002":"119.0.6029.0","28.0.0-nightly.20231003":"119.0.6043.0","28.0.0-nightly.20231004":"119.0.6043.0","28.0.0-nightly.20231005":"119.0.6043.0","28.0.0-nightly.20231006":"119.0.6045.0","28.0.0-nightly.20231009":"119.0.6045.0","28.0.0-nightly.20231010":"119.0.6045.0","28.0.0-nightly.20231011":"119.0.6045.0","28.0.0":"120.0.6099.56","29.0.0-alpha.1":"121.0.6147.0","29.0.0-alpha.2":"121.0.6147.0","29.0.0-alpha.3":"121.0.6147.0","29.0.0-alpha.4":"121.0.6159.0","29.0.0-nightly.20231012":"119.0.6045.0","29.0.0-nightly.20231013":"119.0.6045.0","29.0.0-nightly.20231016":"119.0.6045.0","29.0.0-nightly.20231017":"119.0.6045.0","29.0.0-nightly.20231018":"119.0.6045.0","29.0.0-nightly.20231019":"119.0.6045.0","29.0.0-nightly.20231020":"119.0.6045.0","29.0.0-nightly.20231023":"119.0.6045.0","29.0.0-nightly.20231024":"119.0.6045.0","29.0.0-nightly.20231025":"120.0.6078.0","29.0.0-nightly.20231026":"120.0.6078.0","29.0.0-nightly.20231027":"120.0.6078.0","29.0.0-nightly.20231030":"120.0.6078.0","29.0.0-nightly.20231031":"120.0.6078.0","29.0.0-nightly.20231101":"120.0.6078.0","29.0.0-nightly.20231102":"121.0.6100.0","29.0.0-nightly.20231103":"121.0.6100.0","29.0.0-nightly.20231106":"121.0.6104.0","29.0.0-nightly.20231107":"121.0.6110.0","29.0.0-nightly.20231108":"121.0.6110.0","29.0.0-nightly.20231109":"121.0.6110.0","29.0.0-nightly.20231110":"121.0.6110.0","29.0.0-nightly.20231113":"121.0.6110.0","29.0.0-nightly.20231114":"121.0.6110.0","29.0.0-nightly.20231115":"121.0.6116.0","29.0.0-nightly.20231116":"121.0.6116.0","29.0.0-nightly.20231117":"121.0.6116.0","29.0.0-nightly.20231120":"121.0.6116.0","29.0.0-nightly.20231121":"121.0.6116.0","29.0.0-nightly.20231122":"121.0.6116.0","29.0.0-nightly.20231123":"121.0.6116.0","29.0.0-nightly.20231124":"121.0.6116.0","29.0.0-nightly.20231127":"121.0.6116.0","29.0.0-nightly.20231128":"121.0.6116.0","29.0.0-nightly.20231129":"121.0.6147.0","29.0.0-nightly.20231130":"121.0.6147.0","29.0.0-nightly.20231201":"121.0.6147.0","29.0.0-nightly.20231204":"121.0.6147.0","29.0.0-nightly.20231205":"121.0.6147.0","29.0.0-nightly.20231206":"121.0.6147.0","30.0.0-nightly.20231207":"121.0.6147.0","30.0.0-nightly.20231208":"121.0.6147.0","30.0.0-nightly.20231211":"121.0.6147.0","30.0.0-nightly.20231212":"121.0.6159.0","30.0.0-nightly.20231213":"121.0.6159.0","30.0.0-nightly.20231214":"121.0.6159.0","30.0.0-nightly.20231215":"121.0.6159.0"}
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/electron-to-chromium/package.json b/tools/node_modules/eslint/node_modules/electron-to-chromium/package.json
    index db0151ad980727..30f93efa3f0b69 100644
    --- a/tools/node_modules/eslint/node_modules/electron-to-chromium/package.json
    +++ b/tools/node_modules/eslint/node_modules/electron-to-chromium/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "electron-to-chromium",
    -  "version": "1.4.549",
    +  "version": "1.4.614",
       "description": "Provides a list of electron-to-chromium version mappings",
       "main": "index.js",
       "files": [
    diff --git a/tools/node_modules/eslint/node_modules/electron-to-chromium/versions.js b/tools/node_modules/eslint/node_modules/electron-to-chromium/versions.js
    index 242ef583b8d2ce..d5770e926a800b 100644
    --- a/tools/node_modules/eslint/node_modules/electron-to-chromium/versions.js
    +++ b/tools/node_modules/eslint/node_modules/electron-to-chromium/versions.js
    @@ -135,5 +135,11 @@ module.exports = {
     	"26.1": "116",
     	"26.2": "116",
     	"26.3": "116",
    -	"27.0": "118"
    +	"26.4": "116",
    +	"26.5": "116",
    +	"26.6": "116",
    +	"27.0": "118",
    +	"27.1": "118",
    +	"28.0": "120",
    +	"29.0": "121"
     };
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/electron-to-chromium/versions.json b/tools/node_modules/eslint/node_modules/electron-to-chromium/versions.json
    index 4a3b66325bf102..d307c916e6193b 100644
    --- a/tools/node_modules/eslint/node_modules/electron-to-chromium/versions.json
    +++ b/tools/node_modules/eslint/node_modules/electron-to-chromium/versions.json
    @@ -1 +1 @@
    -{"0.20":"39","0.21":"41","0.22":"41","0.23":"41","0.24":"41","0.25":"42","0.26":"42","0.27":"43","0.28":"43","0.29":"43","0.30":"44","0.31":"45","0.32":"45","0.33":"45","0.34":"45","0.35":"45","0.36":"47","0.37":"49","1.0":"49","1.1":"50","1.2":"51","1.3":"52","1.4":"53","1.5":"54","1.6":"56","1.7":"58","1.8":"59","2.0":"61","2.1":"61","3.0":"66","3.1":"66","4.0":"69","4.1":"69","4.2":"69","5.0":"73","6.0":"76","6.1":"76","7.0":"78","7.1":"78","7.2":"78","7.3":"78","8.0":"80","8.1":"80","8.2":"80","8.3":"80","8.4":"80","8.5":"80","9.0":"83","9.1":"83","9.2":"83","9.3":"83","9.4":"83","10.0":"85","10.1":"85","10.2":"85","10.3":"85","10.4":"85","11.0":"87","11.1":"87","11.2":"87","11.3":"87","11.4":"87","11.5":"87","12.0":"89","12.1":"89","12.2":"89","13.0":"91","13.1":"91","13.2":"91","13.3":"91","13.4":"91","13.5":"91","13.6":"91","14.0":"93","14.1":"93","14.2":"93","15.0":"94","15.1":"94","15.2":"94","15.3":"94","15.4":"94","15.5":"94","16.0":"96","16.1":"96","16.2":"96","17.0":"98","17.1":"98","17.2":"98","17.3":"98","17.4":"98","18.0":"100","18.1":"100","18.2":"100","18.3":"100","19.0":"102","19.1":"102","20.0":"104","20.1":"104","20.2":"104","20.3":"104","21.0":"106","21.1":"106","21.2":"106","21.3":"106","21.4":"106","22.0":"108","22.1":"108","22.2":"108","22.3":"108","23.0":"110","23.1":"110","23.2":"110","23.3":"110","24.0":"112","24.1":"112","24.2":"112","24.3":"112","24.4":"112","24.5":"112","24.6":"112","24.7":"112","24.8":"112","25.0":"114","25.1":"114","25.2":"114","25.3":"114","25.4":"114","25.5":"114","25.6":"114","25.7":"114","25.8":"114","25.9":"114","26.0":"116","26.1":"116","26.2":"116","26.3":"116","27.0":"118"}
    \ No newline at end of file
    +{"0.20":"39","0.21":"41","0.22":"41","0.23":"41","0.24":"41","0.25":"42","0.26":"42","0.27":"43","0.28":"43","0.29":"43","0.30":"44","0.31":"45","0.32":"45","0.33":"45","0.34":"45","0.35":"45","0.36":"47","0.37":"49","1.0":"49","1.1":"50","1.2":"51","1.3":"52","1.4":"53","1.5":"54","1.6":"56","1.7":"58","1.8":"59","2.0":"61","2.1":"61","3.0":"66","3.1":"66","4.0":"69","4.1":"69","4.2":"69","5.0":"73","6.0":"76","6.1":"76","7.0":"78","7.1":"78","7.2":"78","7.3":"78","8.0":"80","8.1":"80","8.2":"80","8.3":"80","8.4":"80","8.5":"80","9.0":"83","9.1":"83","9.2":"83","9.3":"83","9.4":"83","10.0":"85","10.1":"85","10.2":"85","10.3":"85","10.4":"85","11.0":"87","11.1":"87","11.2":"87","11.3":"87","11.4":"87","11.5":"87","12.0":"89","12.1":"89","12.2":"89","13.0":"91","13.1":"91","13.2":"91","13.3":"91","13.4":"91","13.5":"91","13.6":"91","14.0":"93","14.1":"93","14.2":"93","15.0":"94","15.1":"94","15.2":"94","15.3":"94","15.4":"94","15.5":"94","16.0":"96","16.1":"96","16.2":"96","17.0":"98","17.1":"98","17.2":"98","17.3":"98","17.4":"98","18.0":"100","18.1":"100","18.2":"100","18.3":"100","19.0":"102","19.1":"102","20.0":"104","20.1":"104","20.2":"104","20.3":"104","21.0":"106","21.1":"106","21.2":"106","21.3":"106","21.4":"106","22.0":"108","22.1":"108","22.2":"108","22.3":"108","23.0":"110","23.1":"110","23.2":"110","23.3":"110","24.0":"112","24.1":"112","24.2":"112","24.3":"112","24.4":"112","24.5":"112","24.6":"112","24.7":"112","24.8":"112","25.0":"114","25.1":"114","25.2":"114","25.3":"114","25.4":"114","25.5":"114","25.6":"114","25.7":"114","25.8":"114","25.9":"114","26.0":"116","26.1":"116","26.2":"116","26.3":"116","26.4":"116","26.5":"116","26.6":"116","27.0":"118","27.1":"118","28.0":"120","29.0":"121"}
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/WarnSettings.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/WarnSettings.js
    index 7e31e6a0d8082a..78002918ab25eb 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/WarnSettings.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/WarnSettings.js
    @@ -33,7 +33,6 @@ const WarnSettings = function () {
         }
       };
     };
    -var _default = WarnSettings;
    -exports.default = _default;
    +var _default = exports.default = WarnSettings;
     module.exports = exports.default;
     //# sourceMappingURL=WarnSettings.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/alignTransform.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/alignTransform.js
    index 7bd5d755ec8056..7b65d761d17a97 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/alignTransform.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/alignTransform.js
    @@ -316,7 +316,6 @@ const alignTransform = ({
         });
       };
     };
    -var _default = alignTransform;
    -exports.default = _default;
    +var _default = exports.default = alignTransform;
     module.exports = exports.default;
     //# sourceMappingURL=alignTransform.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/defaultTagOrder.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/defaultTagOrder.js
    index 289ebb845c6e93..a42de8f08c4be3 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/defaultTagOrder.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/defaultTagOrder.js
    @@ -41,7 +41,6 @@ const defaultTagOrder = [{
       // Non-Closure metadata
       'ignore', 'author', 'version', 'variation', 'since', 'deprecated', 'todo']
     }];
    -var _default = defaultTagOrder;
    -exports.default = _default;
    +var _default = exports.default = defaultTagOrder;
     module.exports = exports.default;
     //# sourceMappingURL=defaultTagOrder.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/exportParser.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/exportParser.js
    index b30e22310a7b2b..9ee2f26302a4ae 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/exportParser.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/exportParser.js
    @@ -50,8 +50,7 @@ const getSymbolValue = function (symbol) {
     
       /* istanbul ignore else */
       if (symbol.type === 'literal') {
    -    return (/** @type {ValueObject} */symbol.value.value
    -    );
    +    return /** @type {ValueObject} */symbol.value.value;
       }
     
       /* istanbul ignore next */
    @@ -126,7 +125,6 @@ const getSymbol = function (node, globals, scope, opt) {
       /* eslint-enable complexity -- Temporary */
       const opts = opt || {};
       /* istanbul ignore next */
    -  // eslint-disable-next-line default-case
       switch (node.type) {
         case 'Identifier':
           {
    @@ -195,11 +193,11 @@ const getSymbol = function (node, globals, scope, opt) {
           {
             const val = createNode();
             for (const method of node.body) {
    -          val.props[/** @type {import('estree').Identifier} */ /** @type {import('estree').MethodDefinition} */method.key.name] = createNode();
    +          val.props[/** @type {import('estree').Identifier} */( /** @type {import('estree').MethodDefinition} */method.key).name] = createNode();
               /** @type {{[key: string]: CreatedNode}} */
    -          val.props[/** @type {import('estree').Identifier} */ /** @type {import('estree').MethodDefinition} */method.key.name].type = 'object';
    +          val.props[/** @type {import('estree').Identifier} */( /** @type {import('estree').MethodDefinition} */method.key).name].type = 'object';
               /** @type {{[key: string]: CreatedNode}} */
    -          val.props[/** @type {import('estree').Identifier} */ /** @type {import('estree').MethodDefinition} */method.key.name].value = /** @type {import('eslint').Rule.Node} */
    +          val.props[/** @type {import('estree').Identifier} */( /** @type {import('estree').MethodDefinition} */method.key).name].value = /** @type {import('eslint').Rule.Node} */
               /** @type {import('estree').MethodDefinition} */method.value;
             }
             val.type = 'object';
    @@ -224,7 +222,7 @@ const getSymbol = function (node, globals, scope, opt) {
               /* istanbul ignore if */
               if (propVal) {
                 val.props[/** @type {import('estree').PrivateIdentifier} */
    -            /** @type {import('estree').Property} */prop.key.name] = propVal;
    +            ( /** @type {import('estree').Property} */prop.key).name] = propVal;
               }
             }
             return val;
    @@ -264,7 +262,6 @@ createSymbol = function (node, globals, value, scope, isGlobal) {
         return null;
       }
       let symbol;
    -  // eslint-disable-next-line default-case
       switch (node.type) {
         case 'FunctionDeclaration':
         /* istanbul ignore next */
    @@ -336,7 +333,6 @@ createSymbol = function (node, globals, value, scope, isGlobal) {
      * @returns {void}
      */
     const initVariables = function (node, globals, opts) {
    -  // eslint-disable-next-line default-case
       switch (node.type) {
         case 'Program':
           {
    @@ -610,7 +606,6 @@ const findExportedNode = function (block, node, cache) {
         // No need to check `propval` for exported nodes as ESM
         //  exports are only global
       }
    -
       return false;
     };
     
    @@ -732,10 +727,9 @@ const isUncommentedExport = function (node, sourceCode, opt, settings) {
       ast, node, opt);
       return isNodeExported(node, /** @type {CreatedNode} */parseResult.globalVars, opt);
     };
    -var _default = {
    +var _default = exports.default = {
       isUncommentedExport,
       parse
     };
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=exportParser.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/generateRule.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/generateRule.js
    index eb36b7718e27e5..39e7bc03a888f1 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/generateRule.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/generateRule.js
    @@ -6,16 +6,17 @@ var _promises = _interopRequireDefault(require("fs/promises"));
     var _openEditor = _interopRequireDefault(require("open-editor"));
     var _path = require("path");
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
    -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } /* eslint-disable no-console -- CLI */ /**
    -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             * @example
    -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             *
    -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             * ```shell
    -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             * npm run create-rule my-new-rule -- --recommended
    -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             * ```
    -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             */
    +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
    +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } /* eslint-disable no-console -- CLI */ /**
    + * @example
    + *
    + * ```shell
    + * npm run create-rule my-new-rule -- --recommended
    + * ```
    + */
     // Todo: Would ideally have prompts, e.g., to ask for whether
     //   type was problem/layout, etc.
    +
     const [,, ruleName, ...options] = process.argv;
     const recommended = options.includes('--recommended');
     (async () => {
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/getDefaultTagStructureForMode.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/getDefaultTagStructureForMode.js
    index 832a43eb246961..c7577d620d1685 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/getDefaultTagStructureForMode.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/getDefaultTagStructureForMode.js
    @@ -288,7 +288,6 @@ const getDefaultTagStructureForMode = mode => {
       // Shows curly brackets in the signature and in the examples
       ['typeAllowed', true]])]]);
     };
    -var _default = getDefaultTagStructureForMode;
    -exports.default = _default;
    +var _default = exports.default = getDefaultTagStructureForMode;
     module.exports = exports.default;
     //# sourceMappingURL=getDefaultTagStructureForMode.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/index.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/index.js
    index 4bf1ef92624c3c..8dca7b25c0f72d 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/index.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/index.js
    @@ -249,7 +249,6 @@ index.configs['flat/recommended-typescript'] = createRecommendedTypeScriptRulese
     index.configs['flat/recommended-typescript-error'] = createRecommendedTypeScriptRuleset('error', true);
     index.configs['flat/recommended-typescript-flavor'] = createRecommendedTypeScriptFlavorRuleset('warn', true);
     index.configs['flat/recommended-typescript-flavor-error'] = createRecommendedTypeScriptFlavorRuleset('error', true);
    -var _default = index;
    -exports.default = _default;
    +var _default = exports.default = index;
     module.exports = exports.default;
     //# sourceMappingURL=index.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/iterateJsdoc.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/iterateJsdoc.js
    index e1e5d21e8a7c4d..4864456ef9a98b 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/iterateJsdoc.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/iterateJsdoc.js
    @@ -128,7 +128,6 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
      *   [key: string]: string
      * }} [data]
      */
    -/* eslint-enable jsdoc/valid-types -- Old version */
     
     /**
      * @callback GetRegexFromString
    @@ -176,7 +175,6 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
      * ) => import('comment-parser').Line[]} setter
      * @returns {void}
      */
    -/* eslint-enable jsdoc/no-undefined-types -- Bug */
     
     /**
      * @callback SetDescriptionLines
    @@ -191,7 +189,6 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
      * @param {...Partial} tokens
      * @returns {void}
      */
    -/* eslint-enable jsdoc/no-undefined-types -- TS */
     
     /**
      * @callback SetTag
    @@ -201,7 +198,6 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
      * @param {Partial} [tokens]
      * @returns {void}
      */
    -/* eslint-enable jsdoc/no-undefined-types -- TS */
     
     /**
      * @callback RemoveTag
    @@ -231,7 +227,6 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
      *   tokens?: Partial | undefined
      * ) => import('comment-parser').Tokens} SeedTokens
      */
    -/* eslint-enable jsdoc/no-undefined-types -- TS */
     
     /**
      * Sets tokens to empty string.
    @@ -246,7 +241,6 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
      * @param {Partial} tokens
      * @returns {void}
      */
    -/* eslint-enable jsdoc/no-undefined-types -- TS */
     
     /**
      * @callback AddLines
    @@ -484,6 +478,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
      *   contextStr: string
      * }}
      */
    +
     /**
      * @typedef {BasicUtils & {
      *   isIteratingFunction: IsIteratingFunction,
    @@ -547,6 +542,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
      *   findContext: FindContext
      * }} Utils
      */
    +
     const {
       rewireSpecs,
       seedTokens
    @@ -580,7 +576,6 @@ const {
      *   }
      * }} StateObject
      */
    -/* eslint-enable jsdoc/valid-types -- Old version */
     
     /**
      * The Node AST as supplied by the parser.
    @@ -664,7 +659,6 @@ const getBasicUtils = (context, {
      * }} [data]
      * @returns {void}
      */
    -/* eslint-enable jsdoc/valid-types -- Old version of pratt */
     
     /**
      * @param {Node|null} node
    @@ -673,13 +667,15 @@ const getBasicUtils = (context, {
      * @param {Settings} settings
      * @param {Report} report
      * @param {import('eslint').Rule.RuleContext} context
    + * @param {import('eslint').SourceCode} sc
      * @param {boolean|undefined} iteratingAll
      * @param {RuleConfig} ruleConfig
      * @param {string} indent
      * @returns {Utils}
      */
    -const getUtils = (node, jsdoc, jsdocNode, settings, report, context, iteratingAll, ruleConfig, indent) => {
    -  const ancestors = /** @type {import('eslint').Rule.Node[]} */context.getAncestors();
    +const getUtils = (node, jsdoc, jsdocNode, settings, report, context, sc, iteratingAll, ruleConfig, indent) => {
    +  /* istanbul ignore next */
    +  const ancestors = /** @type {import('eslint').Rule.Node[]} */node ? sc.getAncestors ? sc.getAncestors(node) : context.getAncestors() : [];
     
       // istanbul ignore next -- Fallback to deprecated method
       const {
    @@ -878,7 +874,7 @@ const getUtils = (node, jsdoc, jsdocNode, settings, report, context, iteratingAl
     
         /* istanbul ignore else -- Won't be called if missing */
         if (descLines.length) {
    -      jsdoc.source.splice( /** @type {Integer} */startIdx, /** @type {Integer} */endIdx - /** @type {Integer} */startIdx, ...setter(
    +      jsdoc.source.splice( /** @type {Integer} */startIdx, /** @type {Integer} */endIdx - ( /** @type {Integer} */startIdx), ...setter(
           /**
            * @type {{
            *   delimiter: string,
    @@ -986,12 +982,12 @@ const getUtils = (node, jsdoc, jsdocNode, settings, report, context, iteratingAl
                 tokens
               } = jsdoc.source[spliceIdx];
               for (const item of ['postDelimiter', 'tag', 'postTag', 'type', 'postType', 'name', 'postName', 'description']) {
    -            tokens[
    +            tokens[(
                 /**
                  * @type {"postDelimiter"|"tag"|"type"|"postType"|
                  *   "postTag"|"name"|"postName"|"description"}
                  */
    -            item] = '';
    +            item)] = '';
               }
             } else {
               jsdoc.source.splice(spliceIdx, spliceCount - tagSourceOffset + (spliceIdx ? 0 : jsdoc.source.length));
    @@ -1005,7 +1001,7 @@ const getUtils = (node, jsdoc, jsdocNode, settings, report, context, iteratingAl
           return false;
         });
         for (const [idx, src] of jsdoc.source.slice(lastIndex).entries()) {
    -      src.number = firstNumber + /** @type {Integer} */lastIndex + idx;
    +      src.number = firstNumber + ( /** @type {Integer} */lastIndex) + idx;
         }
     
         // Todo: Once rewiring of tags may be fixed in comment-parser to reflect
    @@ -1061,12 +1057,12 @@ const getUtils = (node, jsdoc, jsdocNode, settings, report, context, iteratingAl
       /** @type {EmptyTokens} */
       utils.emptyTokens = tokens => {
         for (const prop of ['start', 'postDelimiter', 'tag', 'type', 'postType', 'postTag', 'name', 'postName', 'description', 'end', 'lineEnd']) {
    -      tokens[
    +      tokens[(
           /**
            * @type {"start"|"postDelimiter"|"tag"|"type"|"postType"|
            *   "postTag"|"name"|"postName"|"description"|"end"|"lineEnd"}
            */
    -      prop] = '';
    +      prop)] = '';
         }
       };
     
    @@ -1134,7 +1130,7 @@ const getUtils = (node, jsdoc, jsdocNode, settings, report, context, iteratingAl
           return false;
         });
         for (const [idx, src] of jsdoc.source.slice(lastIndex).entries()) {
    -      src.number = firstNumber + /** @type {Integer} */lastIndex + idx;
    +      src.number = firstNumber + ( /** @type {Integer} */lastIndex) + idx;
         }
       };
     
    @@ -1216,11 +1212,12 @@ const getUtils = (node, jsdoc, jsdocNode, settings, report, context, iteratingAl
          *   import('estree').FunctionExpression}
          */
         node.generator || node.type === 'MethodDefinition' && node.value.generator || ['ExportNamedDeclaration', 'ExportDefaultDeclaration'].includes(node.type) && /** @type {import('estree').FunctionDeclaration} */
    +    (
         /**
          * @type {import('estree').ExportNamedDeclaration|
          *   import('estree').ExportDefaultDeclaration}
          */
    -    node.declaration.generator);
    +    node.declaration).generator);
       };
     
       /** @type {IsConstructor} */
    @@ -1305,10 +1302,10 @@ const getUtils = (node, jsdoc, jsdocNode, settings, report, context, iteratingAl
       };
       for (const method of ['tagMightHaveNamePosition', 'tagMightHaveTypePosition']) {
         /** @type {TagMightHaveNamePositionTypePosition} */
    -    utils[/** @type {"tagMightHaveNamePosition"|"tagMightHaveTypePosition"} */
    -    method] = (tagName, otherModeMaps) => {
    -      const result = _jsdocUtils.default[/** @type {"tagMightHaveNamePosition"|"tagMightHaveTypePosition"} */
    -      method](tagName);
    +    utils[( /** @type {"tagMightHaveNamePosition"|"tagMightHaveTypePosition"} */
    +    method)] = (tagName, otherModeMaps) => {
    +      const result = _jsdocUtils.default[( /** @type {"tagMightHaveNamePosition"|"tagMightHaveTypePosition"} */
    +      method)](tagName);
           if (result) {
             return true;
           }
    @@ -1316,8 +1313,8 @@ const getUtils = (node, jsdoc, jsdocNode, settings, report, context, iteratingAl
             return false;
           }
           const otherResult = otherModeMaps.some(otherModeMap => {
    -        return _jsdocUtils.default[/** @type {"tagMightHaveNamePosition"|"tagMightHaveTypePosition"} */
    -        method](tagName, otherModeMap);
    +        return _jsdocUtils.default[( /** @type {"tagMightHaveNamePosition"|"tagMightHaveTypePosition"} */
    +        method)](tagName, otherModeMap);
           });
           return otherResult ? {
             otherMode: true
    @@ -1340,10 +1337,10 @@ const getUtils = (node, jsdoc, jsdocNode, settings, report, context, iteratingAl
       };
       for (const method of ['tagMustHaveNamePosition', 'tagMustHaveTypePosition']) {
         /** @type {TagMustHave} */
    -    utils[/** @type {"tagMustHaveNamePosition"|"tagMustHaveTypePosition"} */
    -    method] = (tagName, otherModeMaps) => {
    -      const result = _jsdocUtils.default[/** @type {"tagMustHaveNamePosition"|"tagMustHaveTypePosition"} */
    -      method](tagName);
    +    utils[( /** @type {"tagMustHaveNamePosition"|"tagMustHaveTypePosition"} */
    +    method)] = (tagName, otherModeMaps) => {
    +      const result = _jsdocUtils.default[( /** @type {"tagMustHaveNamePosition"|"tagMustHaveTypePosition"} */
    +      method)](tagName);
           if (!result) {
             return false;
           }
    @@ -1351,8 +1348,8 @@ const getUtils = (node, jsdoc, jsdocNode, settings, report, context, iteratingAl
           // if (!otherModeMaps) { return true; }
     
           const otherResult = otherModeMaps.every(otherModeMap => {
    -        return _jsdocUtils.default[/** @type {"tagMustHaveNamePosition"|"tagMustHaveTypePosition"} */
    -        method](tagName, otherModeMap);
    +        return _jsdocUtils.default[( /** @type {"tagMustHaveNamePosition"|"tagMustHaveTypePosition"} */
    +        method)](tagName, otherModeMap);
           });
           return otherResult ? true : {
             otherMode: false
    @@ -1361,10 +1358,10 @@ const getUtils = (node, jsdoc, jsdocNode, settings, report, context, iteratingAl
       }
       for (const method of ['isNamepathDefiningTag', 'isNamepathReferencingTag', 'isNamepathOrUrlReferencingTag', 'tagMightHaveNamepath']) {
         /** @type {IsNamepathX} */
    -    utils[/** @type {"isNamepathDefiningTag"|"isNamepathReferencingTag"|"isNamepathOrUrlReferencingTag"|"tagMightHaveNamepath"} */
    -    method] = tagName => {
    -      return _jsdocUtils.default[/** @type {"isNamepathDefiningTag"|"isNamepathReferencingTag"|"isNamepathOrUrlReferencingTag"|"tagMightHaveNamepath"} */
    -      method](tagName);
    +    utils[( /** @type {"isNamepathDefiningTag"|"isNamepathReferencingTag"|"isNamepathOrUrlReferencingTag"|"tagMightHaveNamepath"} */
    +    method)] = tagName => {
    +      return _jsdocUtils.default[( /** @type {"isNamepathDefiningTag"|"isNamepathReferencingTag"|"isNamepathOrUrlReferencingTag"|"tagMightHaveNamepath"} */
    +      method)](tagName);
         };
       }
     
    @@ -1405,7 +1402,7 @@ const getUtils = (node, jsdoc, jsdocNode, settings, report, context, iteratingAl
     
       /** @type {IsAsync} */
       utils.isAsync = () => {
    -    return 'async' in /** @type {Node} */node && node.async;
    +    return 'async' in ( /** @type {Node} */node) && node.async;
       };
     
       /** @type {GetTags} */
    @@ -1552,7 +1549,6 @@ const getUtils = (node, jsdoc, jsdocNode, settings, report, context, iteratingAl
      *   contexts?: Context[]
      * }} Settings
      */
    -/* eslint-enable jsdoc/valid-types -- Old version */
     
     /**
      * @param {import('eslint').Rule.RuleContext} context
    @@ -1623,13 +1619,12 @@ exports.getSettings = getSettings;
     const makeReport = (context, commentNode) => {
       /** @type {Report} */
       const report = (message, fix = null, jsdocLoc = null, data = undefined) => {
    -    /* eslint-enable jsdoc/valid-types -- Old version */
         let loc;
         if (jsdocLoc) {
           if (!('line' in jsdocLoc)) {
             jsdocLoc.line = /** @type {import('comment-parser').Spec & {line?: Integer}} */jsdocLoc.source[0].number;
           }
    -      const lineNumber = /** @type {import('eslint').AST.SourceLocation} */commentNode.loc.start.line + /** @type {Integer} */jsdocLoc.line;
    +      const lineNumber = /** @type {import('eslint').AST.SourceLocation} */commentNode.loc.start.line + ( /** @type {Integer} */jsdocLoc.line);
           loc = {
             end: {
               column: 0,
    @@ -1710,8 +1705,6 @@ const makeReport = (context, commentNode) => {
      *   }
      * ) => any } JsdocVisitor
      */
    -/* eslint-enable jsdoc/valid-types -- Old version */
    -/* eslint-enable jsdoc/no-undefined-types -- canonical still using an older version where not defined */
     
     /**
      * @param {{
    @@ -1738,7 +1731,7 @@ const iterate = (info, indent, jsdoc, ruleConfig, context, jsdocNode, node, sett
       const report = makeReport(context, /** @type {import('estree').Node} */
       jsdocNde);
       const utils = getUtils(node, jsdoc, /** @type {import('eslint').AST.Token} */
    -  jsdocNode, settings, report, context, iteratingAll, ruleConfig, indent);
    +  jsdocNode, settings, report, context, sourceCode, iteratingAll, ruleConfig, indent);
       if (!ruleConfig.checkInternal && settings.ignoreInternal && utils.hasTag('internal')) {
         return;
       }
    @@ -1759,12 +1752,12 @@ const iterate = (info, indent, jsdoc, ruleConfig, context, jsdocNode, node, sett
         indent,
         info,
         jsdoc,
    -    jsdocNode:
    +    jsdocNode: (
         /**
          * @type {import('eslint').Rule.Node & {
          *  range: [number, number];}}
          */
    -    jsdocNde,
    +    jsdocNde),
         node,
         report,
         settings,
    @@ -1950,8 +1943,8 @@ const iterateAllJsdocs = (iterator, ruleConfig, contexts, additiveCommentContext
                 return;
               }
               trackedJsdocs.add(commentNode);
    -          callIterator(context, node, [/** @type {import('estree').Comment} */
    -          commentNode], /** @type {StateObject} */state);
    +          callIterator(context, node, [( /** @type {import('estree').Comment} */
    +          commentNode)], /** @type {StateObject} */state);
             },
             'Program:exit'() {
               const allComments = sourceCode.getAllComments();
    @@ -1990,7 +1983,7 @@ const checkFile = (iterator, ruleConfig) => {
               const allComms = /** @type {unknown} */sourceCode.getAllComments();
               const utils = getBasicUtils(context, settings);
               iterator({
    -            allComments: /** @type {import('estree').Node[]} */allComms,
    +            allComments: ( /** @type {import('estree').Node[]} */allComms),
                 context,
                 makeReport,
                 settings,
    @@ -2044,7 +2037,6 @@ function iterateJsdoc(iterator, ruleConfig) {
            * @type {Context[]|undefined}
            */
           let contexts;
    -      /* eslint-enable jsdoc/valid-types -- Old version */
           if (ruleConfig.contextDefaults || ruleConfig.contextSelected || ruleConfig.matchContext) {
             var _context$options$2, _contexts, _contexts2;
             contexts = ruleConfig.matchContext && (_context$options$2 = context.options[0]) !== null && _context$options$2 !== void 0 && _context$options$2.match ? context.options[0].match : _jsdocUtils.default.enforcedContexts(context, ruleConfig.contextDefaults, ruleConfig.nonGlobalSettings ? {} : settings);
    @@ -2067,7 +2059,7 @@ function iterateJsdoc(iterator, ruleConfig) {
               return (ctxt === null || ctxt === void 0 ? void 0 : ctxt.context) === 'any';
             }));
             if (hasPlainAny || hasObjectAny) {
    -          return iterateAllJsdocs(iterator, ruleConfig, hasObjectAny ? /** @type {ContextObject[]} */contexts : null, ruleConfig.matchContext).create(context);
    +          return iterateAllJsdocs(iterator, ruleConfig, hasObjectAny ? ( /** @type {ContextObject[]} */contexts) : null, ruleConfig.matchContext).create(context);
             }
           }
     
    @@ -2081,7 +2073,6 @@ function iterateJsdoc(iterator, ruleConfig) {
     
           /** @type {Partial} */
           const state = {};
    -      /* eslint-enable jsdoc/no-undefined-types -- TS */
     
           /** @type {CheckJsdoc} */
           const checkJsdoc = (info, handler, node) => {
    @@ -2124,10 +2115,8 @@ function iterateJsdoc(iterator, ruleConfig) {
                 settings,
                 state: ste
               });
    -          /* eslint-enable jsdoc/no-undefined-types -- Bug */
             };
           }
    -
           return contextObject;
         },
         meta: ruleConfig.meta
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/jsdocUtils.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/jsdocUtils.js
    index a1395461bcf341..49a9b92ec609d3 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/jsdocUtils.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/jsdocUtils.js
    @@ -20,6 +20,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
     /**
      * @typedef {"jsdoc"|"typescript"|"closure"|"permissive"} ParserMode
      */
    +
     /**
      * @type {import('./getDefaultTagStructureForMode.js').TagStructure}
      */
    @@ -158,14 +159,13 @@ const getPropertiesFromPropertySignature = propSignature => {
       }
       if (propSignature.typeAnnotation && propSignature.typeAnnotation.typeAnnotation.type === 'TSTypeLiteral') {
         return [/** @type {import('@typescript-eslint/types').TSESTree.Identifier} */propSignature.key.name, propSignature.typeAnnotation.typeAnnotation.members.map(member => {
    -      return (/** @type {string} */
    +      return /** @type {string} */(
             getPropertiesFromPropertySignature( /** @type {import('@typescript-eslint/types').TSESTree.TSPropertySignature} */
             member)
           );
         })];
       }
    -  return (/** @type {import('@typescript-eslint/types').TSESTree.Identifier} */propSignature.key.name
    -  );
    +  return /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */propSignature.key.name;
     };
     
     /**
    @@ -231,7 +231,6 @@ const getFunctionParameterNames = (functionNode, checkDefaultObjects) => {
           return [undefined, flattenRoots(roots)];
         }
         if (param.type === 'Property') {
    -      // eslint-disable-next-line default-case
           switch (param.value.type) {
             case 'ArrayPattern':
               {
    @@ -246,21 +245,18 @@ const getFunctionParameterNames = (functionNode, checkDefaultObjects) => {
             case 'ObjectPattern':
               {
                 return [/** @type {import('estree').Identifier} */param.key.name, /** @type {import('estree').ObjectPattern} */param.value.properties.map(prop => {
    -              return (/** @type {string|[string, string[]]} */getParamName(prop, isProperty)
    -              );
    +              return /** @type {string|[string, string[]]} */getParamName(prop, isProperty);
                 })];
               }
             case 'AssignmentPattern':
               {
    -            // eslint-disable-next-line default-case
                 switch (param.value.left.type) {
                   case 'Identifier':
                     // Default parameter
                     if (checkDefaultObjects && param.value.right.type === 'ObjectExpression') {
                       return [/** @type {import('estree').Identifier} */param.key.name, /** @type {import('estree').AssignmentPattern} */param.value.right.properties.map(prop => {
    -                    return (/** @type {string} */getParamName( /** @type {import('estree').Property} */
    -                      prop, isProperty)
    -                    );
    +                    return /** @type {string} */getParamName( /** @type {import('estree').Property} */
    +                    prop, isProperty);
                       })];
                     }
                     break;
    @@ -286,10 +282,9 @@ const getFunctionParameterNames = (functionNode, checkDefaultObjects) => {
     
             // The key of an object could also be a string or number
             case 'Literal':
    -          return (/** @type {string} */param.key.raw ||
    -            // istanbul ignore next -- `raw` may not be present in all parsers
    -            param.key.value
    -          );
    +          return /** @type {string} */param.key.raw ||
    +          // istanbul ignore next -- `raw` may not be present in all parsers
    +          param.key.value;
     
             // case 'MemberExpression':
             default:
    @@ -314,7 +309,7 @@ const getFunctionParameterNames = (functionNode, checkDefaultObjects) => {
         if (['RestElement', 'ExperimentalRestProperty'].includes(param.type)) {
           return {
             isRestProperty: isProperty,
    -        name: /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ /** @type {import('@typescript-eslint/types').TSESTree.RestElement} */param.argument.name,
    +        name: /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */( /** @type {import('@typescript-eslint/types').TSESTree.RestElement} */param.argument).name,
             restElement: true
           };
         }
    @@ -338,8 +333,7 @@ const getFunctionParameterNames = (functionNode, checkDefaultObjects) => {
      */
     const hasParams = functionNode => {
       // Should also check `functionNode.value.params` if supporting `MethodDefinition`
    -  return (/** @type {import('@typescript-eslint/types').TSESTree.FunctionDeclaration} */functionNode.params.length
    -  );
    +  return /** @type {import('@typescript-eslint/types').TSESTree.FunctionDeclaration} */functionNode.params.length;
     };
     
     /**
    @@ -597,8 +591,7 @@ const ensureMap = (map, tag) => {
       if (!map.has(tag)) {
         map.set(tag, new Map());
       }
    -  return (/** @type {Map} */map.get(tag)
    -  );
    +  return /** @type {Map} */map.get(tag);
     };
     
     /**
    @@ -688,8 +681,7 @@ const isNamepathOrUrlReferencingTag = (tag, tagMap = tagStructure) => {
      */
     const tagMustHaveTypePosition = (tag, tagMap = tagStructure) => {
       const tagStruct = ensureMap(tagMap, tag);
    -  return (/** @type {boolean|undefined} */tagStruct.get('typeRequired')
    -  );
    +  return /** @type {boolean|undefined} */tagStruct.get('typeRequired');
     };
     
     /**
    @@ -736,8 +728,7 @@ const tagMightHaveNamepath = (tag, tagMap = tagStructure) => {
      */
     const tagMustHaveNamePosition = (tag, tagMap = tagStructure) => {
       const tagStruct = ensureMap(tagMap, tag);
    -  return (/** @type {boolean|undefined} */tagStruct.get('nameRequired')
    -  );
    +  return /** @type {boolean|undefined} */tagStruct.get('nameRequired');
     };
     
     /**
    @@ -756,8 +747,7 @@ const tagMightHaveEitherTypeOrNamePosition = (tag, tagMap) => {
      */
     const tagMustHaveEitherTypeOrNamePosition = (tag, tagMap) => {
       const tagStruct = ensureMap(tagMap, tag);
    -  return (/** @type {boolean} */tagStruct.get('typeOrNameRequired')
    -  );
    +  return /** @type {boolean} */tagStruct.get('typeOrNameRequired');
     };
     
     /**
    @@ -946,9 +936,8 @@ const hasNonFunctionYield = (node, checkYieldReturnValue) => {
      * @returns {boolean}
      */
     const hasYieldValue = (node, checkYieldReturnValue) => {
    -  return (/** @type {import('@typescript-eslint/types').TSESTree.FunctionDeclaration} */node.generator && ( /** @type {import('@typescript-eslint/types').TSESTree.FunctionDeclaration} */node.expression || hasNonFunctionYield( /** @type {import('@typescript-eslint/types').TSESTree.FunctionDeclaration} */
    -    node.body, checkYieldReturnValue))
    -  );
    +  return /** @type {import('@typescript-eslint/types').TSESTree.FunctionDeclaration} */node.generator && ( /** @type {import('@typescript-eslint/types').TSESTree.FunctionDeclaration} */node.expression || hasNonFunctionYield( /** @type {import('@typescript-eslint/types').TSESTree.FunctionDeclaration} */
    +  node.body, checkYieldReturnValue));
     };
     
     /**
    @@ -1130,7 +1119,6 @@ const tagsWithNamesAndDescriptions = new Set(['param', 'arg', 'argument', 'prope
      *     {message: string, replacement?: string}
      * }} TagNamePreference
      */
    -/* eslint-enable jsdoc/valid-types -- Old version */
     
     /**
      * @param {import('eslint').Rule.RuleContext} context
    @@ -1318,7 +1306,7 @@ const getRegexFromString = (regexString, requiredFlags) => {
       flags = uniqueFlags.join('');
       return new RegExp(regex, flags);
     };
    -var _default = {
    +var _default = exports.default = {
       comparePaths,
       dropPathSegmentQuotes,
       enforcedContexts,
    @@ -1360,6 +1348,5 @@ var _default = {
       tagMustHaveNamePosition,
       tagMustHaveTypePosition
     };
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=jsdocUtils.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkAccess.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkAccess.js
    index 99089faf9a288e..38fd73b5a52279 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkAccess.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkAccess.js
    @@ -7,7 +7,7 @@ exports.default = void 0;
     var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
     const accessLevels = ['package', 'private', 'protected', 'public'];
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       report,
       utils
     }) => {
    @@ -36,6 +36,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=checkAccess.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkAlignment.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkAlignment.js
    index d3412a1c4ae6ad..6e88539ddf8b16 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkAlignment.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkAlignment.js
    @@ -13,7 +13,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
     const trimStart = string => {
       return string.replace(/^\s+/u, '');
     };
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       sourceCode,
       jsdocNode,
       report,
    @@ -56,6 +56,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'layout'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=checkAlignment.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkExamples.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkExamples.js
    index 21dc648da99f54..286d7d7c73d4d9 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkExamples.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkExamples.js
    @@ -7,8 +7,8 @@ exports.default = void 0;
     var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     var _eslint = _interopRequireWildcard(require("eslint"));
     var _semver = _interopRequireDefault(require("semver"));
    -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
    -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
    +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
    +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
     // Todo: When replace `CLIEngine` with `ESLint` when feature set complete per https://github.com/eslint/eslint/issues/14745
     // https://github.com/eslint/eslint/blob/master/docs/user-guide/migrating-to-7.0.0.md#-the-cliengine-class-has-been-deprecated
    @@ -93,7 +93,7 @@ const getLinesCols = text => {
       const colDelta = matchLines ? text.slice(text.lastIndexOf('\n') + 1).length : text.length;
       return [matchLines, colDelta];
     };
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       report,
       utils,
       context,
    @@ -301,7 +301,7 @@ var _default = (0, _iterateJsdoc.default)(({
         if (!filename) {
           const jsFileName = context.getFilename();
           if (typeof jsFileName === 'string' && jsFileName.includes('.')) {
    -        defaultFileName = jsFileName.replace(/\..*?$/u, `.${ext}`);
    +        defaultFileName = jsFileName.replace(/\.[^.]*$/u, `.${ext}`);
           } else {
             defaultFileName = `dummy.${ext}`;
           }
    @@ -508,6 +508,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=checkExamples.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkIndentation.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkIndentation.js
    index 2905f4c0a929c7..e97c47e2eec94b 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkIndentation.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkIndentation.js
    @@ -28,7 +28,7 @@ const maskCodeBlocks = str => {
         return (margin + '\n').repeat(code.match(/\n/gu).length);
       });
     };
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       sourceCode,
       jsdocNode,
       report,
    @@ -70,6 +70,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'layout'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=checkIndentation.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkLineAlignment.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkLineAlignment.js
    index ed7307ab9b8710..5eaba257552726 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkLineAlignment.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkLineAlignment.js
    @@ -180,7 +180,7 @@ const checkAlignment = ({
         });
       }
     };
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       indent,
       jsdoc,
       jsdocNode,
    @@ -196,13 +196,13 @@ var _default = (0, _iterateJsdoc.default)(({
       } = context.options[1] || {};
       if (context.options[0] === 'always') {
         // Skip if it contains only a single line.
    -    if (!
    +    if (!(
         /**
          * @type {import('eslint').Rule.Node & {
          *   range: [number, number], value: string
          * }}
          */
    -    jsdocNode.value.includes('\n')) {
    +    jsdocNode.value.includes('\n'))) {
           return;
         }
         checkAlignment({
    @@ -309,6 +309,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'layout'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=checkLineAlignment.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkParamNames.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkParamNames.js
    index 6863bfefc88952..0f2fab6105ceb3 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkParamNames.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkParamNames.js
    @@ -229,7 +229,7 @@ const validateParameterNamesDeep = (targetTagName, _allowExtraTrailingParamDocs,
         return false;
       });
     };
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       context,
       jsdoc,
       report,
    @@ -295,6 +295,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=checkParamNames.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkPropertyNames.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkPropertyNames.js
    index 51c58f716e421b..9505f7fc9303e2 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkPropertyNames.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkPropertyNames.js
    @@ -71,7 +71,7 @@ const validatePropertyNamesDeep = (targetTagName, jsdocPropertyNames, jsdoc, rep
         return false;
       });
     };
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       context,
       jsdoc,
       report,
    @@ -112,6 +112,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=checkPropertyNames.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkSyntax.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkSyntax.js
    index be2df864e5442f..ce1c2a5d561e05 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkSyntax.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkSyntax.js
    @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = void 0;
     var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       jsdoc,
       report,
       settings
    @@ -34,6 +34,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=checkSyntax.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkTagNames.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkTagNames.js
    index ab6ca180e3a260..75247d579e86fb 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkTagNames.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkTagNames.js
    @@ -12,7 +12,7 @@ const jsxTagNames = new Set(['jsx', 'jsxFrag', 'jsxImportSource', 'jsxRuntime'])
     const typedTagsAlwaysUnnecessary = new Set(['augments', 'callback', 'class', 'enum', 'implements', 'private', 'property', 'protected', 'public', 'readonly', 'this', 'type', 'typedef']);
     const typedTagsNeedingName = new Set(['template']);
     const typedTagsUnnecessaryOutsideDeclare = new Set(['abstract', 'access', 'class', 'constant', 'constructs', 'default', 'enum', 'export', 'exports', 'function', 'global', 'inherits', 'instance', 'interface', 'member', 'memberof', 'memberOf', 'method', 'mixes', 'mixin', 'module', 'name', 'namespace', 'override', 'property', 'requires', 'static', 'this']);
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       sourceCode,
       jsdoc,
       report,
    @@ -148,7 +148,7 @@ var _default = (0, _iterateJsdoc.default)(({
         if (typed && checkTagForTypedValidity(jsdocTag, tagIndex)) {
           continue;
         }
    -    const validTags = [...definedTags, ... /** @type {string[]} */definedPreferredTags, ...definedNonPreferredTags, ...definedStructuredTags, ...(typed ? typedTagsNeedingName : [])];
    +    const validTags = [...definedTags, ...( /** @type {string[]} */definedPreferredTags), ...definedNonPreferredTags, ...definedStructuredTags, ...(typed ? typedTagsNeedingName : [])];
         if (utils.isValidTag(tagName, validTags)) {
           let preferredTagName = utils.getPreferredTagName({
             allowObjectReturn: true,
    @@ -211,6 +211,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=checkTagNames.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkTypes.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkTypes.js
    index 6cd2864c993a96..45abd10cebc5ff 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkTypes.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkTypes.js
    @@ -66,7 +66,7 @@ const adjustNames = (type, preferred, isGenericMatch, typeNodeName, node, parent
     const getMessage = upperCase => {
       return 'Use object shorthand or index signatures instead of ' + '`' + (upperCase ? 'O' : 'o') + 'bject`, e.g., `{[key: string]: string}`';
     };
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       jsdocNode,
       sourceCode,
       report,
    @@ -90,8 +90,6 @@ var _default = (0, _iterateJsdoc.default)(({
         structuredTags,
         mode
       } = settings;
    -  /* eslint-enable jsdoc/valid-types -- Old version */
    -
       const injectObjectPreferredTypes = !('Object' in preferredTypesOriginal || 'object' in preferredTypesOriginal || 'object.<>' in preferredTypesOriginal || 'Object.<>' in preferredTypesOriginal || 'object<>' in preferredTypesOriginal);
     
       /**
    @@ -222,7 +220,7 @@ var _default = (0, _iterateJsdoc.default)(({
           /**
            * @type {import('jsdoc-type-pratt-parser').GenericResult}
            */
    -      parentNode !== null && parentNode !== void 0 && (_parentNode$elements = parentNode.elements) !== null && _parentNode$elements !== void 0 && _parentNode$elements.length &&
    +      parentNode !== null && parentNode !== void 0 && (_parentNode$elements = parentNode.elements) !== null && _parentNode$elements !== void 0 && _parentNode$elements.length && (
           /**
            * @type {import('jsdoc-type-pratt-parser').GenericResult}
            */
    @@ -230,7 +228,7 @@ var _default = (0, _iterateJsdoc.default)(({
           /**
            * @type {import('jsdoc-type-pratt-parser').GenericResult}
            */
    -      (parentNode === null || parentNode === void 0 || (_parentNode$left2 = parentNode.left) === null || _parentNode$left2 === void 0 ? void 0 : _parentNode$left2.value) === 'Object')) {
    +      (parentNode === null || parentNode === void 0 || (_parentNode$left2 = parentNode.left) === null || _parentNode$left2 === void 0 ? void 0 : _parentNode$left2.value) === 'Object'))) {
             continue;
           }
           if (strictNativeType !== typeNodeName && strictNativeType.toLowerCase() === typeNodeName.toLowerCase() && (
    @@ -394,6 +392,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=checkTypes.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkValues.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkValues.js
    index 4782882dfb42cc..91547983d2d0c5 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkValues.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/checkValues.js
    @@ -9,7 +9,7 @@ var _semver = _interopRequireDefault(require("semver"));
     var _spdxExpressionParse = _interopRequireDefault(require("spdx-expression-parse"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
     const allowedKinds = new Set(['class', 'constant', 'event', 'external', 'file', 'function', 'member', 'mixin', 'module', 'namespace', 'typedef']);
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       utils,
       report,
       context
    @@ -129,6 +129,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=checkValues.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/emptyTags.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/emptyTags.js
    index 32d1aaca45f1b6..a5751d7b6fdcef 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/emptyTags.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/emptyTags.js
    @@ -16,7 +16,7 @@ const emptyIfNotClosure = new Set(['package', 'private', 'protected', 'public',
     // Closure doesn't allow with this casing
     'inheritdoc']);
     const emptyIfClosure = new Set(['interface']);
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       settings,
       jsdoc,
       utils
    @@ -71,6 +71,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=emptyTags.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/implementsOnClasses.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/implementsOnClasses.js
    index bd0a39961d6b79..63d1bc4d2eec64 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/implementsOnClasses.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/implementsOnClasses.js
    @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = void 0;
     var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       report,
       utils
     }) => {
    @@ -56,6 +56,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=implementsOnClasses.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/importsAsDependencies.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/importsAsDependencies.js
    index 1f7041c118a494..66eec2be60e872 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/importsAsDependencies.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/importsAsDependencies.js
    @@ -33,9 +33,8 @@ const setDeps = function () {
         /* eslint-enable no-console -- Inform user */
       }
     };
    -
     const moduleCheck = new Map();
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       jsdoc,
       settings,
       utils
    @@ -105,6 +104,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=importsAsDependencies.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/informativeDocs.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/informativeDocs.js
    index 23f7c810338b77..c11727e9ba0bf1 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/informativeDocs.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/informativeDocs.js
    @@ -58,7 +58,7 @@ const getNamesFromNode = node => {
       }
     };
     /* eslint-enable complexity -- Temporary */
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       context,
       jsdoc,
       node,
    @@ -140,6 +140,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=informativeDocs.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/matchDescription.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/matchDescription.js
    index 3039167ebc1bc5..16d9bb5c8f8402 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/matchDescription.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/matchDescription.js
    @@ -18,7 +18,7 @@ const matchDescriptionDefault = '^\n?([A-Z`\\d_][\\s\\S]*[.?!`]\\s*)?$';
     const stringOrDefault = (value, userDefault) => {
       return typeof value === 'string' ? value : userDefault || matchDescriptionDefault;
     };
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       jsdoc,
       report,
       context,
    @@ -225,6 +225,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=matchDescription.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/matchName.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/matchName.js
    index ccb4ae94f9f8e1..dc3be8c722cb09 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/matchName.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/matchName.js
    @@ -7,7 +7,7 @@ exports.default = void 0;
     var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
     // eslint-disable-next-line complexity
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       context,
       jsdoc,
       report,
    @@ -28,7 +28,7 @@ var _default = (0, _iterateJsdoc.default)(({
         disallowName,
         replacement,
         tags = ['*']
    -  } = match[/** @type {import('../iterateJsdoc.js').Integer} */lastIndex];
    +  } = match[( /** @type {import('../iterateJsdoc.js').Integer} */lastIndex)];
       const allowNameRegex = allowName && utils.getRegexFromString(allowName);
       const disallowNameRegex = disallowName && utils.getRegexFromString(disallowName);
       let applicableTags = jsdoc.tags;
    @@ -56,7 +56,7 @@ var _default = (0, _iterateJsdoc.default)(({
         };
         let {
           message
    -    } = match[/** @type {import('../iterateJsdoc.js').Integer} */lastIndex];
    +    } = match[( /** @type {import('../iterateJsdoc.js').Integer} */lastIndex)];
         if (!message) {
           if (hasRegex) {
             message = disallowed ? `Only allowing names not matching \`${disallowNameRegex}\` but found "${tag.name}".` : `Only allowing names matching \`${allowNameRegex}\` but found "${tag.name}".`;
    @@ -124,6 +124,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=matchName.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/multilineBlocks.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/multilineBlocks.js
    index b25aca055498c3..bd308153e612cc 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/multilineBlocks.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/multilineBlocks.js
    @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = void 0;
     var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       context,
       jsdoc,
       utils
    @@ -83,13 +83,13 @@ var _default = (0, _iterateJsdoc.default)(({
               delimiter
             } = line;
             for (const prop of ['delimiter', 'postDelimiter', 'tag', 'type', 'lineEnd', 'postType', 'postTag', 'name', 'postName', 'description']) {
    -          finalLineTokens[
    +          finalLineTokens[(
               /**
                * @type {"delimiter"|"postDelimiter"|"tag"|"type"|
                *   "lineEnd"|"postType"|"postTag"|"name"|
                *   "postName"|"description"}
                */
    -          prop] = '';
    +          prop)] = '';
             }
             utils.addLine(jsdoc.source.length - 1, {
               ...line,
    @@ -233,6 +233,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=multilineBlocks.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noBadBlocks.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noBadBlocks.js
    index 19f21ea89d7740..ce6b55f73e987b 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noBadBlocks.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noBadBlocks.js
    @@ -11,7 +11,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
     //  https://jsdoc.app/about-getting-started.html#adding-documentation-comments-to-your-code
     const commentRegexp = /^\/\*(?!\*)/u;
     const extraAsteriskCommentRegexp = /^\/\*{3,}/u;
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       context,
       sourceCode,
       allComments,
    @@ -83,6 +83,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'layout'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=noBadBlocks.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noBlankBlockDescriptions.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noBlankBlockDescriptions.js
    index e07ca72d613bc4..cf92a1dfbecd11 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noBlankBlockDescriptions.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noBlankBlockDescriptions.js
    @@ -8,7 +8,7 @@ var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
     const anyWhitespaceLines = /^\s*$/u;
     const atLeastTwoLinesWhitespace = /^[ \t]*\n[ \t]*\n\s*$/u;
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       jsdoc,
       utils
     }) => {
    @@ -59,6 +59,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'layout'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=noBlankBlockDescriptions.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noBlankBlocks.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noBlankBlocks.js
    index 38abb86917da8e..2d53a5cf56a618 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noBlankBlocks.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noBlankBlocks.js
    @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = void 0;
     var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       context,
       jsdoc,
       utils
    @@ -48,6 +48,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=noBlankBlocks.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noDefaults.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noDefaults.js
    index 3b63d129c77c35..14d4796aa9fc07 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noDefaults.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noDefaults.js
    @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = void 0;
     var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       context,
       utils
     }) => {
    @@ -79,6 +79,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=noDefaults.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noMissingSyntax.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noMissingSyntax.js
    index 50acd7faa4c09b..fa017e40aa5aad 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noMissingSyntax.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noMissingSyntax.js
    @@ -18,6 +18,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
     /**
      * @typedef {string|ContextObject} Context
      */
    +
     /**
      * @param {import('../iterateJsdoc.js').StateObject} state
      * @returns {void}
    @@ -43,7 +44,7 @@ const incrementSelector = (state, selector, comment) => {
       }
       state.selectorMap[selector][comment]++;
     };
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       context,
       info: {
         comment
    @@ -171,6 +172,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=noMissingSyntax.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noMultiAsterisks.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noMultiAsterisks.js
    index 28d3de08ef7e44..7d147b75a142a8 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noMultiAsterisks.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noMultiAsterisks.js
    @@ -12,7 +12,7 @@ const endAsterisksSingleLineBlockWS = /\*((?:\*|(?: |\t))*)\*$/u;
     const endAsterisksMultipleLineBlockWS = /((?:\*|(?: |\t))*)\*$/u;
     const endAsterisksSingleLineNoBlockWS = /\*(\**)\*$/u;
     const endAsterisksMultipleLineNoBlockWS = /(\**)\*$/u;
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       context,
       jsdoc,
       utils
    @@ -95,6 +95,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=noMultiAsterisks.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noRestrictedSyntax.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noRestrictedSyntax.js
    index 68d2344c6c6787..d21d4dcc671dbd 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noRestrictedSyntax.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noRestrictedSyntax.js
    @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = void 0;
     var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       context,
       info: {
         comment
    @@ -79,6 +79,5 @@ var _default = (0, _iterateJsdoc.default)(({
       },
       nonGlobalSettings: true
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=noRestrictedSyntax.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noTypes.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noTypes.js
    index 5e9be31d128c8d..02c4ea26655786 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noTypes.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noTypes.js
    @@ -15,7 +15,7 @@ const removeType = ({
       tokens.postTag = '';
       tokens.type = '';
     };
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       utils
     }) => {
       if (!utils.isIteratingFunction() && !utils.isVirtualFunction()) {
    @@ -67,6 +67,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=noTypes.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noUndefinedTypes.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noUndefinedTypes.js
    index 11e67e570a79b6..d23900d050de0a 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noUndefinedTypes.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/noUndefinedTypes.js
    @@ -6,8 +6,8 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = void 0;
     var _iterateJsdoc = _interopRequireWildcard(require("../iterateJsdoc.js"));
     var _jsdoccomment = require("@es-joy/jsdoccomment");
    -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
    -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
    +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
    +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
     const extraTypes = ['null', 'undefined', 'void', 'string', 'boolean', 'object', 'function', 'symbol', 'number', 'bigint', 'NaN', 'Infinity', 'any', '*', 'never', 'unknown', 'const', 'this', 'true', 'false', 'Array', 'Object', 'RegExp', 'Date', 'Function'];
     const typescriptGlobals = [
     // https://www.typescriptlang.org/docs/handbook/utility-types.html
    @@ -20,7 +20,7 @@ const typescriptGlobals = [
     const stripPseudoTypes = str => {
       return str && str.replace(/(?:\.|<>|\.<>|\[\])$/u, '');
     };
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       context,
       node,
       report,
    @@ -161,7 +161,7 @@ var _default = (0, _iterateJsdoc.default)(({
       const tagToParsedType = propertyName => {
         return tag => {
           try {
    -        const potentialType = tag[/** @type {"type"|"name"|"namepathOrURL"} */propertyName];
    +        const potentialType = tag[( /** @type {"type"|"name"|"namepathOrURL"} */propertyName)];
             return {
               parsedType: mode === 'permissive' ? (0, _jsdoccomment.tryParse)( /** @type {string} */potentialType) : (0, _jsdoccomment.parse)( /** @type {string} */potentialType, mode),
               tag
    @@ -206,7 +206,12 @@ var _default = (0, _iterateJsdoc.default)(({
                 report(`The type '${value}' is undefined.`, null, tag);
               }
             } else if (markVariablesAsUsed && !extraTypes.includes(value)) {
    -          context.markVariableAsUsed(value);
    +          /* istanbul ignore else */
    +          if (sourceCode.markVariableAsUsed) {
    +            sourceCode.markVariableAsUsed(value);
    +          } else {
    +            context.markVariableAsUsed(value);
    +          }
             }
           }
         });
    @@ -239,6 +244,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=noUndefinedTypes.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireAsteriskPrefix.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireAsteriskPrefix.js
    index 49dec6bdc83d2a..36c71ad8b3d318 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireAsteriskPrefix.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireAsteriskPrefix.js
    @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = void 0;
     var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       context,
       jsdoc,
       utils,
    @@ -162,6 +162,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'layout'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=requireAsteriskPrefix.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireDescription.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireDescription.js
    index bf276265856fb9..943c6f4a1ed337 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireDescription.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireDescription.js
    @@ -13,7 +13,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
     const checkDescription = description => {
       return description.trim().split('\n').filter(Boolean).length;
     };
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       jsdoc,
       report,
       utils,
    @@ -131,6 +131,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=requireDescription.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireDescriptionCompleteSentence.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireDescriptionCompleteSentence.js
    index 2cf64b37d7731f..0311c027f50c9a 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireDescriptionCompleteSentence.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireDescriptionCompleteSentence.js
    @@ -178,7 +178,7 @@ const validateDescription = (description, reportOrig, jsdocNode, abbreviationsRe
         return false;
       });
     };
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       sourceCode,
       context,
       jsdoc,
    @@ -277,6 +277,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=requireDescriptionCompleteSentence.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireExample.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireExample.js
    index 340b88e58219c9..16b176e46c974d 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireExample.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireExample.js
    @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = void 0;
     var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       context,
       jsdoc,
       report,
    @@ -104,6 +104,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=requireExample.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireFileOverview.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireFileOverview.js
    index 988c79c15e068f..69368963329c3f 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireFileOverview.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireFileOverview.js
    @@ -27,7 +27,7 @@ const setDefaults = state => {
         state.hasNonCommentBeforeTag = {};
       }
     };
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       jsdocNode,
       state,
       utils,
    @@ -131,6 +131,5 @@ var _default = (0, _iterateJsdoc.default)(({
         }
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=requireFileOverview.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireHyphenBeforeParamDescription.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireHyphenBeforeParamDescription.js
    index 1bfba184cfa74a..95192d19d1cef1 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireHyphenBeforeParamDescription.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireHyphenBeforeParamDescription.js
    @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = void 0;
     var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       sourceCode,
       utils,
       report,
    @@ -22,7 +22,6 @@ var _default = (0, _iterateJsdoc.default)(({
        * @type {null|"any"|{[key: string]: "always"|"never"}}
        */
       tags;
    -  /* eslint-enable jsdoc/valid-types -- Old version */
     
       /**
        * @param {import('@es-joy/jsdoccomment').JsdocTagWithInline} jsdocTag
    @@ -138,6 +137,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'layout'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=requireHyphenBeforeParamDescription.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireJsdoc.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireJsdoc.js
    index 9944c57fcdf771..68f3d4b0af29aa 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireJsdoc.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireJsdoc.js
    @@ -17,6 +17,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
      *   initWindow: boolean
      * }} RequireJsdocOpts
      */
    +
     /** @type {import('json-schema').JSONSchema4} */
     const OPTIONS_SCHEMA = {
       additionalProperties: false,
    @@ -157,9 +158,7 @@ const getOption = (context, baseObject, option, key) => {
       typeof context.options[0][option] === 'boolean' || key in context.options[0][option])) {
         return context.options[0][option][key];
       }
    -  return (/** @type {{[key: string]: {default?: boolean|undefined}}} */baseObject.properties[key].default
    -  );
    -  /* eslint-enable jsdoc/valid-types -- Old version */
    +  return /** @type {{[key: string]: {default?: boolean|undefined}}} */baseObject.properties[key].default;
     };
     
     /**
    @@ -181,7 +180,6 @@ const getOption = (context, baseObject, option, key) => {
      * }}
      */
     const getOptions = (context, settings) => {
    -  /* eslint-enable jsdoc/valid-types -- Old version */
       const {
         publicOnly,
         contexts = settings.contexts || [],
    @@ -205,7 +203,6 @@ const getOptions = (context, settings) => {
     
           /** @type {{[key: string]: boolean|undefined}} */
           const properties = {};
    -      /* eslint-enable jsdoc/valid-types -- Old version */
           for (const prop of Object.keys( /** @type {import('json-schema').JSONSchema4Object} */
           /** @type {import('json-schema').JSONSchema4Object} */baseObj.properties)) {
             const opt = getOption(context, /** @type {import('json-schema').JSONSchema4Object} */baseObj, 'publicOnly', prop);
    @@ -213,13 +210,12 @@ const getOptions = (context, settings) => {
           }
           return properties;
         })( /** @type {import('json-schema').JSONSchema4Object} */
    -    /** @type {import('json-schema').JSONSchema4Object} */
    -    /** @type {import('json-schema').JSONSchema4Object} */
    -    OPTIONS_SCHEMA.properties.publicOnly.oneOf[1]),
    +    ( /** @type {import('json-schema').JSONSchema4Object} */
    +    ( /** @type {import('json-schema').JSONSchema4Object} */
    +    OPTIONS_SCHEMA.properties.publicOnly).oneOf)[1]),
         require: (baseObj => {
           /** @type {{[key: string]: boolean|undefined}} */
           const properties = {};
    -      /* eslint-enable jsdoc/valid-types -- Old version */
           for (const prop of Object.keys( /** @type {import('json-schema').JSONSchema4Object} */
           /** @type {import('json-schema').JSONSchema4Object} */baseObj.properties)) {
             const opt = getOption(context, /** @type {import('json-schema').JSONSchema4Object} */
    @@ -233,7 +229,7 @@ const getOptions = (context, settings) => {
     };
     
     /** @type {import('eslint').Rule.RuleModule} */
    -var _default = {
    +var _default = exports.default = {
       create(context) {
         // istanbul ignore next -- Fallback to deprecated method
         const {
    @@ -260,7 +256,6 @@ var _default = {
          * }}
          */
         opts.publicOnly;
    -    /* eslint-enable jsdoc/valid-types -- Old version */
     
         /**
          * @type {import('../iterateJsdoc.js').CheckJsdoc}
    @@ -349,7 +344,7 @@ var _default = {
             }
             const indent = _jsdocUtils.default.getIndent({
               text: sourceCode.getText( /** @type {import('eslint').Rule.Node} */baseNode, /** @type {import('eslint').AST.SourceLocation} */
    -          /** @type {import('eslint').Rule.Node} */baseNode.loc.start.column)
    +          ( /** @type {import('eslint').Rule.Node} */baseNode.loc).start.column)
             });
             const {
               inlineCommentBlock
    @@ -408,7 +403,6 @@ var _default = {
             report();
           }
         };
    -    /* eslint-enable complexity -- Temporary */
     
         /**
          * @param {string} prop
    @@ -503,6 +497,5 @@ var _default = {
         type: 'suggestion'
       }
     };
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=requireJsdoc.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireParam.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireParam.js
    index 6dade9f545a1c6..122e6b15f3ad7f 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireParam.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireParam.js
    @@ -9,6 +9,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
     /**
      * @typedef {[string, boolean, () => RootNamerReturn]} RootNamerReturn
      */
    +
     /**
      * @param {string[]} desiredRoots
      * @param {number} currentIndex
    @@ -32,7 +33,7 @@ const rootNamer = (desiredRoots, currentIndex) => {
     };
     
     /* eslint-disable complexity -- Temporary */
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       jsdoc,
       utils,
       context
    @@ -521,6 +522,5 @@ var _default = (0, _iterateJsdoc.default)(({
       //  JS node to ensure we iterate its context
       noTracking: true
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=requireParam.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamDescription.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamDescription.js
    index 9eccc603eff1f6..c75f1086bf9466 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamDescription.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamDescription.js
    @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = void 0;
     var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       context,
       report,
       settings,
    @@ -80,6 +80,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=requireParamDescription.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamName.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamName.js
    index b3b0a92804baf9..2a7fc9ba53762c 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamName.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamName.js
    @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = void 0;
     var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       report,
       utils
     }) => {
    @@ -50,6 +50,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=requireParamName.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamType.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamType.js
    index 382bf2c07b75c0..aa2b209babd601 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamType.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamType.js
    @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = void 0;
     var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       context,
       report,
       settings,
    @@ -80,6 +80,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=requireParamType.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireProperty.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireProperty.js
    index 8dc236962c4bee..bfcb35707167ad 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireProperty.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireProperty.js
    @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = void 0;
     var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       utils
     }) => {
       const propertyAssociatedTags = utils.filterTags(({
    @@ -42,6 +42,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=requireProperty.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyDescription.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyDescription.js
    index 6f7f54a4489e86..28cb8a16d8f537 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyDescription.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyDescription.js
    @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = void 0;
     var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       report,
       utils
     }) => {
    @@ -25,6 +25,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=requirePropertyDescription.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyName.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyName.js
    index f2a355ba9cd43b..5a82ea72ed67a7 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyName.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyName.js
    @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = void 0;
     var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       report,
       utils
     }) => {
    @@ -25,6 +25,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=requirePropertyName.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyType.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyType.js
    index 17ed16ce10ec0e..9b74ddd0a00d01 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyType.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyType.js
    @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = void 0;
     var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       report,
       utils
     }) => {
    @@ -25,6 +25,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=requirePropertyType.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturns.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturns.js
    index e20e125ebcff05..1b3d1c426fe970 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturns.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturns.js
    @@ -33,7 +33,7 @@ const canSkip = utils => {
       // This seems to imply a class as well
       'interface']) || utils.avoidDocs();
     };
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       info: {
         comment
       },
    @@ -205,6 +205,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=requireReturns.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsCheck.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsCheck.js
    index 11aa5a26083e9d..11d6d224754701 100755
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsCheck.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsCheck.js
    @@ -30,7 +30,7 @@ const canSkip = (utils, settings) => {
     };
     
     // eslint-disable-next-line complexity -- Temporary
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       context,
       node,
       report,
    @@ -76,7 +76,7 @@ var _default = (0, _iterateJsdoc.default)(({
       }
     
       // In case a return value is declared in JSDoc, we also expect one in the code.
    -  if (!returnNever && (reportMissingReturnForUndefinedTypes || !utils.mayBeUndefinedTypeTag(tag)) && (tag.type === '' && !utils.hasValueOrExecutorHasNonEmptyResolveValue(exemptAsync) || tag.type !== '' && !utils.hasValueOrExecutorHasNonEmptyResolveValue(exemptAsync, true)) && (!exemptGenerators || !('generator' in /** @type {import('../iterateJsdoc.js').Node} */node) || !node.generator)) {
    +  if (!returnNever && (reportMissingReturnForUndefinedTypes || !utils.mayBeUndefinedTypeTag(tag)) && (tag.type === '' && !utils.hasValueOrExecutorHasNonEmptyResolveValue(exemptAsync) || tag.type !== '' && !utils.hasValueOrExecutorHasNonEmptyResolveValue(exemptAsync, true)) && (!exemptGenerators || !('generator' in ( /** @type {import('../iterateJsdoc.js').Node} */node)) || !node.generator)) {
         report(`JSDoc @${tagName} declaration present but return expression not available in function.`);
       }
     }, {
    @@ -105,6 +105,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=requireReturnsCheck.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsDescription.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsDescription.js
    index 7bde405687881f..7a0e369b370f74 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsDescription.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsDescription.js
    @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = void 0;
     var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       report,
       utils
     }) => {
    @@ -54,6 +54,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=requireReturnsDescription.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsType.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsType.js
    index 19af94f85e0bf1..f5547e647df3f5 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsType.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsType.js
    @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = void 0;
     var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       report,
       utils
     }) => {
    @@ -50,6 +50,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=requireReturnsType.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireThrows.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireThrows.js
    index 68cdb0f6bd8677..f9ed6d26ab6ac0 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireThrows.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireThrows.js
    @@ -23,7 +23,7 @@ const canSkip = utils => {
       // The designated type can itself document `@throws`
       'type']) || utils.avoidDocs();
     };
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       report,
       utils
     }) => {
    @@ -97,6 +97,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=requireThrows.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireYields.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireYields.js
    index a76c3c56e87ff4..21210912490345 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireYields.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireYields.js
    @@ -55,7 +55,7 @@ const checkTagName = (utils, report, tagName) => {
       const missingTag = typeof tag === 'undefined' || tag === null;
       return [preferredTagName, missingTag];
     };
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       report,
       utils,
       context
    @@ -171,6 +171,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=requireYields.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireYieldsCheck.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireYieldsCheck.js
    index af28ad8ae781d3..bae90a45af630c 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireYieldsCheck.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/requireYieldsCheck.js
    @@ -54,7 +54,7 @@ const checkTagName = (utils, report, tagName) => {
       }
       return [preferredTagName, tags[0]];
     };
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       context,
       report,
       settings,
    @@ -157,6 +157,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=requireYieldsCheck.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/sortTags.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/sortTags.js
    index 7173352f9161bb..d5e9651d7de613 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/sortTags.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/sortTags.js
    @@ -8,7 +8,7 @@ var _defaultTagOrder = _interopRequireDefault(require("../defaultTagOrder.js"));
     var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
     // eslint-disable-next-line complexity -- Temporary
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       context,
       jsdoc,
       utils
    @@ -357,8 +357,8 @@ var _default = (0, _iterateJsdoc.default)(({
       const firstLine = utils.getFirstLine();
       const fix = () => {
         const itemsToMoveRange = [...Array.from({
    -      length: jsdoc.tags.length - /** @type {import('../iterateJsdoc.js').Integer} */
    -      firstChangedTagIndex
    +      length: jsdoc.tags.length - ( /** @type {import('../iterateJsdoc.js').Integer} */
    +      firstChangedTagIndex)
         }).keys()];
         const unchangedPriorTagDescriptions = jsdoc.tags.slice(0, firstChangedTagIndex).reduce((ct, {
           source
    @@ -369,14 +369,14 @@ var _default = (0, _iterateJsdoc.default)(({
         // This offset includes not only the offset from where the first tag
         //   must begin, and the additional offset of where the first changed
         //   tag begins, but it must also account for prior descriptions
    -    const initialOffset = /** @type {import('../iterateJsdoc.js').Integer} */firstLine + /** @type {import('../iterateJsdoc.js').Integer} */firstChangedTagIndex +
    +    const initialOffset = /** @type {import('../iterateJsdoc.js').Integer} */firstLine + ( /** @type {import('../iterateJsdoc.js').Integer} */firstChangedTagIndex) +
         // May be the first tag, so don't try finding a prior one if so
         unchangedPriorTagDescriptions;
     
         // Use `firstChangedTagLine` for line number to begin reporting/splicing
         for (const idx of itemsToMoveRange) {
    -      utils.removeTag(idx + /** @type {import('../iterateJsdoc.js').Integer} */
    -      firstChangedTagIndex);
    +      utils.removeTag(idx + ( /** @type {import('../iterateJsdoc.js').Integer} */
    +      firstChangedTagIndex));
         }
         const changedTags = sortedTags.slice(firstChangedTagIndex);
         let extraTagCount = 0;
    @@ -401,8 +401,8 @@ var _default = (0, _iterateJsdoc.default)(({
           }
         }
       };
    -  utils.reportJSDoc(`Tags are not in the prescribed order: ${tagList.join(', ') || '(alphabetical)'}`, jsdoc.tags[/** @type {import('../iterateJsdoc.js').Integer} */
    -  firstChangedTagIndex], fix, true);
    +  utils.reportJSDoc(`Tags are not in the prescribed order: ${tagList.join(', ') || '(alphabetical)'}`, jsdoc.tags[( /** @type {import('../iterateJsdoc.js').Integer} */
    +  firstChangedTagIndex)], fix, true);
     }, {
       iterateAllJsdocs: true,
       meta: {
    @@ -446,6 +446,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=sortTags.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/tagLines.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/tagLines.js
    index 0e8da05f0700ac..28f3676da5b224 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/tagLines.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/tagLines.js
    @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
     exports.default = void 0;
     var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
     function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       context,
       jsdoc,
       utils
    @@ -89,8 +89,8 @@ var _default = (0, _iterateJsdoc.default)(({
         if (reportIndex !== null) {
           const fixer = () => {
             utils.removeTag(tagIdx, {
    -          tagSourceOffset: /** @type {import('../iterateJsdoc.js').Integer} */
    -          reportIndex
    +          tagSourceOffset: ( /** @type {import('../iterateJsdoc.js').Integer} */
    +          reportIndex)
             });
           };
           utils.reportJSDoc('Expected no lines between tags', {
    @@ -270,6 +270,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=tagLines.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/textEscaping.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/textEscaping.js
    index 2e9014ecb81ef2..c780ca7a72892d 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/textEscaping.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/textEscaping.js
    @@ -34,7 +34,7 @@ const markdownReplacer = desc => {
         return `\\${bookend}${encapsed}${bookend}`;
       });
     };
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       context,
       jsdoc,
       utils
    @@ -127,6 +127,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=textEscaping.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/validTypes.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/validTypes.js
    index 1f6a79975f18ac..7b9d16632c579c 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/validTypes.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/rules/validTypes.js
    @@ -31,7 +31,7 @@ const tryParsePathIgnoreError = path => {
     };
     
     // eslint-disable-next-line complexity
    -var _default = (0, _iterateJsdoc.default)(({
    +var _default = exports.default = (0, _iterateJsdoc.default)(({
       jsdoc,
       report,
       utils,
    @@ -56,7 +56,6 @@ var _default = (0, _iterateJsdoc.default)(({
           }
           let handled = false;
           if (tagName) {
    -        // eslint-disable-next-line default-case
             switch (tagName) {
               case 'requires':
               case 'module':
    @@ -255,6 +254,5 @@ var _default = (0, _iterateJsdoc.default)(({
         type: 'suggestion'
       }
     });
    -exports.default = _default;
     module.exports = exports.default;
     //# sourceMappingURL=validTypes.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/tagNames.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/tagNames.js
    index 2064fd87ae6da6..4d2750851ece88 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/tagNames.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/tagNames.js
    @@ -23,7 +23,7 @@ const jsdocTagsUndocumented = {
     /**
      * @type {AliasedTags}
      */
    -const jsdocTags = {
    +const jsdocTags = exports.jsdocTags = {
       ...jsdocTagsUndocumented,
       abstract: ['virtual'],
       access: [],
    @@ -100,8 +100,7 @@ const jsdocTags = {
     /**
      * @type {AliasedTags}
      */
    -exports.jsdocTags = jsdocTags;
    -const typeScriptTags = {
    +const typeScriptTags = exports.typeScriptTags = {
       ...jsdocTags,
       // https://www.typescriptlang.org/tsconfig/#stripInternal
       internal: [],
    @@ -117,7 +116,6 @@ const typeScriptTags = {
     /**
      * @type {AliasedTags}
      */
    -exports.typeScriptTags = typeScriptTags;
     const undocumentedClosureTags = {
       // These are in Closure source but not in jsdoc source nor in the Closure
       //  docs: https://github.com/google/closure-compiler/blob/master/src/com/google/javascript/jscomp/parsing/Annotation.java
    @@ -149,7 +147,7 @@ const {
     /**
      * @type {AliasedTags}
      */
    -const closureTags = {
    +const closureTags = exports.closureTags = {
       ...typeScriptTagsInClosure,
       ...undocumentedClosureTags,
       // From https://github.com/google/closure-compiler/wiki/Annotating-JavaScript-for-the-Closure-Compiler
    @@ -179,5 +177,4 @@ const closureTags = {
       suppress: [],
       unrestricted: []
     };
    -exports.closureTags = closureTags;
     //# sourceMappingURL=tagNames.js.map
    \ No newline at end of file
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/utils/hasReturnValue.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/utils/hasReturnValue.js
    index 56a1139b5ad2ea..79ccfccb8b1462 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/utils/hasReturnValue.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/dist/utils/hasReturnValue.js
    @@ -25,8 +25,7 @@ const isNewPromiseExpression = node => {
      */
     const isVoidPromise = node => {
       var _node$typeParameters;
    -  return (/** @type {import('@typescript-eslint/types').TSESTree.TSTypeReference} */(node === null || node === void 0 || (_node$typeParameters = node.typeParameters) === null || _node$typeParameters === void 0 || (_node$typeParameters = _node$typeParameters.params) === null || _node$typeParameters === void 0 || (_node$typeParameters = _node$typeParameters[0]) === null || _node$typeParameters === void 0 ? void 0 : _node$typeParameters.type) === 'TSVoidKeyword'
    -  );
    +  return /** @type {import('@typescript-eslint/types').TSESTree.TSTypeReference} */(node === null || node === void 0 || (_node$typeParameters = node.typeParameters) === null || _node$typeParameters === void 0 || (_node$typeParameters = _node$typeParameters.params) === null || _node$typeParameters === void 0 || (_node$typeParameters = _node$typeParameters[0]) === null || _node$typeParameters === void 0 ? void 0 : _node$typeParameters.type) === 'TSVoidKeyword';
     };
     const undefinedKeywords = new Set(['TSVoidKeyword', 'TSUndefinedKeyword', 'TSNeverKeyword']);
     
    @@ -201,12 +200,11 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
           }
         case 'SwitchStatement':
           {
    -        return (/** @type {import('@typescript-eslint/types').TSESTree.SwitchStatement} */node.cases.every(someCase => {
    -            return !someCase.consequent.some(consNode => {
    -              return consNode.type === 'BreakStatement' || consNode.type === 'ReturnStatement' && consNode.argument === null;
    -            });
    -          })
    -        );
    +        return /** @type {import('@typescript-eslint/types').TSESTree.SwitchStatement} */node.cases.every(someCase => {
    +          return !someCase.consequent.some(consNode => {
    +            return consNode.type === 'BreakStatement' || consNode.type === 'ReturnStatement' && consNode.argument === null;
    +          });
    +        });
           }
         case 'ThrowStatement':
           {
    @@ -262,15 +260,14 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
         // istanbul ignore next -- In Babel?
         case 'OptionalCallExpression':
         case 'CallExpression':
    -      return (/** @type {import('@typescript-eslint/types').TSESTree.Identifier} */node.callee.name === resolverName && (
    -        // Implicit or explicit undefined
    -        node.arguments.length > 1 || node.arguments[0] !== undefined) || node.arguments.some(nde => {
    -          // Being passed in to another function (which might invoke it)
    -          return nde.type === 'Identifier' && nde.name === resolverName ||
    -          // Handle nested items
    -          hasNonEmptyResolverCall(nde, resolverName);
    -        })
    -      );
    +      return /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */node.callee.name === resolverName && (
    +      // Implicit or explicit undefined
    +      node.arguments.length > 1 || node.arguments[0] !== undefined) || node.arguments.some(nde => {
    +        // Being passed in to another function (which might invoke it)
    +        return nde.type === 'Identifier' && nde.name === resolverName ||
    +        // Handle nested items
    +        hasNonEmptyResolverCall(nde, resolverName);
    +      });
         case 'ChainExpression':
         case 'Decorator':
         case 'ExpressionStatement':
    @@ -482,7 +479,7 @@ const hasValueOrExecutorHasNonEmptyResolveValue = (node, anyPromiseAsReturn, all
          * @type {import('@typescript-eslint/types').TSESTree.FunctionExpression|
          * import('@typescript-eslint/types').TSESTree.ArrowFunctionExpression}
          */
    -    /** @type {import('@typescript-eslint/types').TSESTree.NewExpression} */prom.arguments[0] || {};
    +    ( /** @type {import('@typescript-eslint/types').TSESTree.NewExpression} */prom.arguments[0]) || {};
         if (!(params !== null && params !== void 0 && params.length)) {
           return false;
         }
    diff --git a/tools/node_modules/eslint/node_modules/spdx-expression-parse/AUTHORS b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse/AUTHORS
    similarity index 100%
    rename from tools/node_modules/eslint/node_modules/spdx-expression-parse/AUTHORS
    rename to tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse/AUTHORS
    diff --git a/tools/node_modules/eslint/node_modules/spdx-expression-parse/LICENSE b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse/LICENSE
    similarity index 100%
    rename from tools/node_modules/eslint/node_modules/spdx-expression-parse/LICENSE
    rename to tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse/LICENSE
    diff --git a/tools/node_modules/eslint/node_modules/spdx-expression-parse/index.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse/index.js
    similarity index 100%
    rename from tools/node_modules/eslint/node_modules/spdx-expression-parse/index.js
    rename to tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse/index.js
    diff --git a/tools/node_modules/eslint/node_modules/spdx-expression-parse/package.json b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse/package.json
    similarity index 97%
    rename from tools/node_modules/eslint/node_modules/spdx-expression-parse/package.json
    rename to tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse/package.json
    index c9edc9f939cdf6..c3a22afcf7dfcb 100644
    --- a/tools/node_modules/eslint/node_modules/spdx-expression-parse/package.json
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse/package.json
    @@ -1,7 +1,7 @@
     {
       "name": "spdx-expression-parse",
       "description": "parse SPDX license expressions",
    -  "version": "3.0.1",
    +  "version": "4.0.0",
       "author": "Kyle E. Mitchell  (https://kemitchell.com)",
       "files": [
         "AUTHORS",
    diff --git a/tools/node_modules/eslint/node_modules/spdx-expression-parse/parse.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse/parse.js
    similarity index 100%
    rename from tools/node_modules/eslint/node_modules/spdx-expression-parse/parse.js
    rename to tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse/parse.js
    diff --git a/tools/node_modules/eslint/node_modules/spdx-expression-parse/scan.js b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse/scan.js
    similarity index 96%
    rename from tools/node_modules/eslint/node_modules/spdx-expression-parse/scan.js
    rename to tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse/scan.js
    index b74fce2e2c6632..528522282703c6 100644
    --- a/tools/node_modules/eslint/node_modules/spdx-expression-parse/scan.js
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse/scan.js
    @@ -37,7 +37,7 @@ module.exports = function (source) {
     
       function operator () {
         var string
    -    var possibilities = ['WITH', 'AND', 'OR', '(', ')', ':', '+']
    +    var possibilities = [/^WITH/i, /^AND/i, /^OR/i, '(', ')', ':', '+']
         for (var i = 0; i < possibilities.length; i++) {
           string = read(possibilities[i])
           if (string) {
    @@ -51,7 +51,7 @@ module.exports = function (source) {
     
         return string && {
           type: 'OPERATOR',
    -      string: string
    +      string: string.toUpperCase()
         }
       }
     
    diff --git a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/package.json b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/package.json
    index b703633a830ba6..334fc2a599764f 100644
    --- a/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/package.json
    +++ b/tools/node_modules/eslint/node_modules/eslint-plugin-jsdoc/package.json
    @@ -5,66 +5,66 @@
         "url": "http://gajus.com"
       },
       "dependencies": {
    -    "@es-joy/jsdoccomment": "~0.40.1",
    +    "@es-joy/jsdoccomment": "~0.41.0",
         "are-docs-informative": "^0.0.2",
    -    "comment-parser": "1.4.0",
    +    "comment-parser": "1.4.1",
         "debug": "^4.3.4",
         "escape-string-regexp": "^4.0.0",
         "esquery": "^1.5.0",
         "is-builtin-module": "^3.2.1",
         "semver": "^7.5.4",
    -    "spdx-expression-parse": "^3.0.1"
    +    "spdx-expression-parse": "^4.0.0"
       },
       "description": "JSDoc linting rules for ESLint.",
       "devDependencies": {
    -    "@babel/cli": "^7.22.10",
    -    "@babel/core": "^7.22.10",
    -    "@babel/eslint-parser": "^7.22.10",
    -    "@babel/node": "^7.22.10",
    +    "@babel/cli": "^7.23.4",
    +    "@babel/core": "^7.23.5",
    +    "@babel/eslint-parser": "^7.23.3",
    +    "@babel/node": "^7.22.19",
         "@babel/plugin-syntax-class-properties": "^7.12.13",
    -    "@babel/plugin-transform-flow-strip-types": "^7.22.5",
    -    "@babel/preset-env": "^7.22.10",
    -    "@babel/register": "^7.22.5",
    +    "@babel/plugin-transform-flow-strip-types": "^7.23.3",
    +    "@babel/preset-env": "^7.23.5",
    +    "@babel/register": "^7.22.15",
         "@es-joy/escodegen": "^3.5.1",
    -    "@es-joy/jsdoc-eslint-parser": "^0.19.0",
    +    "@es-joy/jsdoc-eslint-parser": "^0.20.0",
         "@hkdobrev/run-if-changed": "^0.3.1",
    -    "@semantic-release/commit-analyzer": "^10.0.1",
    -    "@semantic-release/github": "^9.0.4",
    -    "@semantic-release/npm": "^10.0.4",
    -    "@types/chai": "^4.3.5",
    -    "@types/debug": "^4.1.8",
    -    "@types/eslint": "^8.44.2",
    -    "@types/esquery": "^1.5.0",
    -    "@types/estree": "^1.0.1",
    -    "@types/json-schema": "^7.0.12",
    -    "@types/lodash.defaultsdeep": "^4.6.7",
    -    "@types/mocha": "^10.0.1",
    -    "@types/node": "^20.5.0",
    -    "@types/semver": "^7.5.0",
    -    "@types/spdx-expression-parse": "^3.0.2",
    -    "@typescript-eslint/parser": "^6.4.0",
    +    "@semantic-release/commit-analyzer": "^11.1.0",
    +    "@semantic-release/github": "^9.2.5",
    +    "@semantic-release/npm": "^11.0.2",
    +    "@types/chai": "^4.3.11",
    +    "@types/debug": "^4.1.12",
    +    "@types/eslint": "^8.44.8",
    +    "@types/esquery": "^1.5.3",
    +    "@types/estree": "^1.0.5",
    +    "@types/json-schema": "^7.0.15",
    +    "@types/lodash.defaultsdeep": "^4.6.9",
    +    "@types/mocha": "^10.0.6",
    +    "@types/node": "^20.10.4",
    +    "@types/semver": "^7.5.6",
    +    "@types/spdx-expression-parse": "^3.0.5",
    +    "@typescript-eslint/parser": "^6.13.2",
         "babel-plugin-add-module-exports": "^1.0.4",
         "babel-plugin-istanbul": "^6.1.1",
         "camelcase": "^6.3.0",
    -    "chai": "^4.3.7",
    +    "chai": "^4.3.10",
         "cross-env": "^7.0.3",
         "decamelize": "^5.0.1",
    -    "eslint": "8.47.0",
    -    "eslint-config-canonical": "~41.1.7",
    +    "eslint": "8.55.0",
    +    "eslint-config-canonical": "~42.8.0",
         "espree": "^9.6.1",
         "gitdown": "^3.1.5",
    -    "glob": "^10.3.3",
    +    "glob": "^10.3.10",
         "husky": "^8.0.3",
         "jsdoc-type-pratt-parser": "^4.0.0",
         "json-schema": "^0.4.0",
    -    "lint-staged": "^14.0.0",
    +    "lint-staged": "^15.2.0",
         "lodash.defaultsdeep": "^4.6.1",
         "mocha": "^10.2.0",
         "nyc": "^15.1.0",
         "open-editor": "^3.0.0",
    -    "rimraf": "^5.0.1",
    -    "semantic-release": "^21.0.7",
    -    "typescript": "^5.1.6"
    +    "rimraf": "^5.0.5",
    +    "semantic-release": "^22.0.10",
    +    "typescript": "5.3.3"
       },
       "engines": {
         "node": ">=16"
    @@ -140,5 +140,5 @@
         "test-cov": "cross-env TIMING=1 nyc --reporter text npm run test-no-cov",
         "test-index": "npm run test-no-cov -- test/rules/index.js"
       },
    -  "version": "46.8.2"
    +  "version": "46.9.1"
     }
    diff --git a/tools/node_modules/eslint/node_modules/flat-cache/package.json b/tools/node_modules/eslint/node_modules/flat-cache/package.json
    index 938668256e9712..b7b9eb00b934f9 100644
    --- a/tools/node_modules/eslint/node_modules/flat-cache/package.json
    +++ b/tools/node_modules/eslint/node_modules/flat-cache/package.json
    @@ -1,6 +1,6 @@
     {
       "name": "flat-cache",
    -  "version": "3.1.1",
    +  "version": "3.2.0",
       "description": "A stupidly simple key/value storage using files to persist some data",
       "repository": "jaredwray/flat-cache",
       "license": "MIT",
    @@ -15,7 +15,7 @@
         "src/utils.js"
       ],
       "engines": {
    -    "node": ">=12.0.0"
    +    "node": "^10.12.0 || >=12.0.0"
       },
       "precommit": [
         "npm run verify --silent"
    @@ -42,14 +42,14 @@
         "cache"
       ],
       "devDependencies": {
    -    "c8": "^8.0.1",
    +    "c8": "^7.14.0",
         "chai": "^4.3.10",
         "eslint": "^7.13.0",
         "eslint-config-prettier": "^6.15.0",
         "eslint-plugin-mocha": "^8.0.0",
         "eslint-plugin-prettier": "^3.1.4",
         "glob-expand": "^0.2.1",
    -    "mocha": "^10.2.0",
    +    "mocha": "^8.4.0",
         "prettier": "^2.1.2",
         "write": "^2.0.0"
       },
    diff --git a/tools/node_modules/eslint/node_modules/globals/globals.json b/tools/node_modules/eslint/node_modules/globals/globals.json
    index 96d98d72b19b3c..44b632f57cc5f8 100644
    --- a/tools/node_modules/eslint/node_modules/globals/globals.json
    +++ b/tools/node_modules/eslint/node_modules/globals/globals.json
    @@ -1099,6 +1099,30 @@
     		"XPathEvaluator": false,
     		"XPathExpression": false,
     		"XPathResult": false,
    +        "XRAnchor": false,
    +        "XRBoundedReferenceSpace": false,
    +        "XRCPUDepthInformation": false,
    +        "XRDepthInformation": false,
    +        "XRFrame": false,
    +        "XRInputSource": false,
    +        "XRInputSourceArray": false,
    +        "XRInputSourceEvent": false,
    +        "XRInputSourcesChangeEvent": false,
    +        "XRPose": false,
    +        "XRReferenceSpace": false,
    +        "XRReferenceSpaceEvent": false,
    +        "XRRenderState": false,
    +        "XRRigidTransform": false,
    +        "XRSession": false,
    +        "XRSessionEvent": false,
    +        "XRSpace": false,
    +        "XRSystem": false,
    +        "XRView": false,
    +        "XRViewerPose": false,
    +        "XRViewport": false,
    +        "XRWebGLBinding": false,
    +        "XRWebGLDepthInformation": false,
    +        "XRWebGLLayer": false,
     		"XSLTProcessor": false
     	},
     	"worker": {
    diff --git a/tools/node_modules/eslint/node_modules/globals/package.json b/tools/node_modules/eslint/node_modules/globals/package.json
    index a13be946e8c379..78e26649802471 100644
    --- a/tools/node_modules/eslint/node_modules/globals/package.json
    +++ b/tools/node_modules/eslint/node_modules/globals/package.json
    @@ -1,6 +1,6 @@
     {
     	"name": "globals",
    -	"version": "13.23.0",
    +	"version": "13.24.0",
     	"description": "Global identifiers from different JavaScript environments",
     	"license": "MIT",
     	"repository": "sindresorhus/globals",
    @@ -10,6 +10,7 @@
     		"email": "sindresorhus@gmail.com",
     		"url": "https://sindresorhus.com"
     	},
    +	"sideEffects": false,
     	"engines": {
     		"node": ">=8"
     	},
    diff --git a/tools/node_modules/eslint/node_modules/globals/readme.md b/tools/node_modules/eslint/node_modules/globals/readme.md
    index 0ef22c30451630..29442a85510b95 100644
    --- a/tools/node_modules/eslint/node_modules/globals/readme.md
    +++ b/tools/node_modules/eslint/node_modules/globals/readme.md
    @@ -10,8 +10,8 @@ This package is used by ESLint.
     
     ## Install
     
    -```
    -$ npm install globals
    +```sh
    +npm install globals
     ```
     
     ## Usage
    @@ -42,15 +42,3 @@ For Node.js this package provides two sets of globals:
     	See: https://nodejs.org/api/modules.html#modules_the_module_scope
     
     When analyzing code that is known to run outside of a CommonJS wrapper, for example, JavaScript modules, `nodeBuiltin` can find accidental CommonJS references.
    -
    ----
    -
    -
    - - Get professional support for this package with a Tidelift subscription - -
    - - Tidelift helps make open source sustainable for maintainers while giving companies
    assurances about security, maintenance, and licensing for their dependencies. -
    -
    diff --git a/tools/node_modules/eslint/node_modules/ignore/package.json b/tools/node_modules/eslint/node_modules/ignore/package.json index fe5498df001145..7c62cad9f41552 100644 --- a/tools/node_modules/eslint/node_modules/ignore/package.json +++ b/tools/node_modules/eslint/node_modules/ignore/package.json @@ -1,6 +1,6 @@ { "name": "ignore", - "version": "5.2.4", + "version": "5.3.0", "description": "Ignore is a manager and filter for .gitignore rules, the one used by eslint, gitbook and many others.", "files": [ "legacy.js", @@ -51,21 +51,21 @@ "url": "https://github.com/kaelzhang/node-ignore/issues" }, "devDependencies": { - "@babel/cli": "^7.19.3", - "@babel/core": "^7.20.5", - "@babel/preset-env": "^7.20.2", + "@babel/cli": "^7.22.9", + "@babel/core": "^7.22.9", + "@babel/preset-env": "^7.22.9", "codecov": "^3.8.2", "debug": "^4.3.4", - "eslint": "^8.30.0", + "eslint": "^8.46.0", "eslint-config-ostai": "^3.0.0", - "eslint-plugin-import": "^2.26.0", - "mkdirp": "^1.0.4", + "eslint-plugin-import": "^2.28.0", + "mkdirp": "^3.0.1", "pre-suf": "^1.1.1", - "rimraf": "^3.0.2", + "rimraf": "^5.0.1", "spawn-sync": "^2.0.0", - "tap": "^16.3.2", + "tap": "^16.3.9", "tmp": "0.2.1", - "typescript": "^4.9.4" + "typescript": "^5.1.6" }, "engines": { "node": ">= 4" diff --git a/tools/node_modules/eslint/node_modules/node-releases/data/processed/envs.json b/tools/node_modules/eslint/node_modules/node-releases/data/processed/envs.json index dfd2f15fea6666..00998c00a104fd 100644 --- a/tools/node_modules/eslint/node_modules/node-releases/data/processed/envs.json +++ b/tools/node_modules/eslint/node_modules/node-releases/data/processed/envs.json @@ -1 +1 @@ -[{"name":"nodejs","version":"0.2.0","date":"2011-08-26","lts":false,"security":false,"v8":"2.3.8.0"},{"name":"nodejs","version":"0.3.0","date":"2011-08-26","lts":false,"security":false,"v8":"2.5.1.0"},{"name":"nodejs","version":"0.4.0","date":"2011-08-26","lts":false,"security":false,"v8":"3.1.2.0"},{"name":"nodejs","version":"0.5.0","date":"2011-08-26","lts":false,"security":false,"v8":"3.1.8.25"},{"name":"nodejs","version":"0.6.0","date":"2011-11-04","lts":false,"security":false,"v8":"3.6.6.6"},{"name":"nodejs","version":"0.7.0","date":"2012-01-17","lts":false,"security":false,"v8":"3.8.6.0"},{"name":"nodejs","version":"0.8.0","date":"2012-06-22","lts":false,"security":false,"v8":"3.11.10.10"},{"name":"nodejs","version":"0.9.0","date":"2012-07-20","lts":false,"security":false,"v8":"3.11.10.15"},{"name":"nodejs","version":"0.10.0","date":"2013-03-11","lts":false,"security":false,"v8":"3.14.5.8"},{"name":"nodejs","version":"0.11.0","date":"2013-03-28","lts":false,"security":false,"v8":"3.17.13.0"},{"name":"nodejs","version":"0.12.0","date":"2015-02-06","lts":false,"security":false,"v8":"3.28.73.0"},{"name":"nodejs","version":"4.0.0","date":"2015-09-08","lts":false,"security":false,"v8":"4.5.103.30"},{"name":"nodejs","version":"4.1.0","date":"2015-09-17","lts":false,"security":false,"v8":"4.5.103.33"},{"name":"nodejs","version":"4.2.0","date":"2015-10-12","lts":"Argon","security":false,"v8":"4.5.103.35"},{"name":"nodejs","version":"4.3.0","date":"2016-02-09","lts":"Argon","security":false,"v8":"4.5.103.35"},{"name":"nodejs","version":"4.4.0","date":"2016-03-08","lts":"Argon","security":false,"v8":"4.5.103.35"},{"name":"nodejs","version":"4.5.0","date":"2016-08-16","lts":"Argon","security":false,"v8":"4.5.103.37"},{"name":"nodejs","version":"4.6.0","date":"2016-09-27","lts":"Argon","security":true,"v8":"4.5.103.37"},{"name":"nodejs","version":"4.7.0","date":"2016-12-06","lts":"Argon","security":false,"v8":"4.5.103.43"},{"name":"nodejs","version":"4.8.0","date":"2017-02-21","lts":"Argon","security":false,"v8":"4.5.103.45"},{"name":"nodejs","version":"4.9.0","date":"2018-03-28","lts":"Argon","security":true,"v8":"4.5.103.53"},{"name":"nodejs","version":"5.0.0","date":"2015-10-29","lts":false,"security":false,"v8":"4.6.85.28"},{"name":"nodejs","version":"5.1.0","date":"2015-11-17","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.2.0","date":"2015-12-09","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.3.0","date":"2015-12-15","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.4.0","date":"2016-01-06","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.5.0","date":"2016-01-21","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.6.0","date":"2016-02-09","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.7.0","date":"2016-02-23","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.8.0","date":"2016-03-09","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.9.0","date":"2016-03-16","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.10.0","date":"2016-04-01","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.11.0","date":"2016-04-21","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.12.0","date":"2016-06-23","lts":false,"security":false,"v8":"4.6.85.32"},{"name":"nodejs","version":"6.0.0","date":"2016-04-26","lts":false,"security":false,"v8":"5.0.71.35"},{"name":"nodejs","version":"6.1.0","date":"2016-05-05","lts":false,"security":false,"v8":"5.0.71.35"},{"name":"nodejs","version":"6.2.0","date":"2016-05-17","lts":false,"security":false,"v8":"5.0.71.47"},{"name":"nodejs","version":"6.3.0","date":"2016-07-06","lts":false,"security":false,"v8":"5.0.71.52"},{"name":"nodejs","version":"6.4.0","date":"2016-08-12","lts":false,"security":false,"v8":"5.0.71.60"},{"name":"nodejs","version":"6.5.0","date":"2016-08-26","lts":false,"security":false,"v8":"5.1.281.81"},{"name":"nodejs","version":"6.6.0","date":"2016-09-14","lts":false,"security":false,"v8":"5.1.281.83"},{"name":"nodejs","version":"6.7.0","date":"2016-09-27","lts":false,"security":true,"v8":"5.1.281.83"},{"name":"nodejs","version":"6.8.0","date":"2016-10-12","lts":false,"security":false,"v8":"5.1.281.84"},{"name":"nodejs","version":"6.9.0","date":"2016-10-18","lts":"Boron","security":false,"v8":"5.1.281.84"},{"name":"nodejs","version":"6.10.0","date":"2017-02-21","lts":"Boron","security":false,"v8":"5.1.281.93"},{"name":"nodejs","version":"6.11.0","date":"2017-06-06","lts":"Boron","security":false,"v8":"5.1.281.102"},{"name":"nodejs","version":"6.12.0","date":"2017-11-06","lts":"Boron","security":false,"v8":"5.1.281.108"},{"name":"nodejs","version":"6.13.0","date":"2018-02-10","lts":"Boron","security":false,"v8":"5.1.281.111"},{"name":"nodejs","version":"6.14.0","date":"2018-03-28","lts":"Boron","security":true,"v8":"5.1.281.111"},{"name":"nodejs","version":"6.15.0","date":"2018-11-27","lts":"Boron","security":true,"v8":"5.1.281.111"},{"name":"nodejs","version":"6.16.0","date":"2018-12-26","lts":"Boron","security":false,"v8":"5.1.281.111"},{"name":"nodejs","version":"6.17.0","date":"2019-02-28","lts":"Boron","security":true,"v8":"5.1.281.111"},{"name":"nodejs","version":"7.0.0","date":"2016-10-25","lts":false,"security":false,"v8":"5.4.500.36"},{"name":"nodejs","version":"7.1.0","date":"2016-11-08","lts":false,"security":false,"v8":"5.4.500.36"},{"name":"nodejs","version":"7.2.0","date":"2016-11-22","lts":false,"security":false,"v8":"5.4.500.43"},{"name":"nodejs","version":"7.3.0","date":"2016-12-20","lts":false,"security":false,"v8":"5.4.500.45"},{"name":"nodejs","version":"7.4.0","date":"2017-01-04","lts":false,"security":false,"v8":"5.4.500.45"},{"name":"nodejs","version":"7.5.0","date":"2017-01-31","lts":false,"security":false,"v8":"5.4.500.48"},{"name":"nodejs","version":"7.6.0","date":"2017-02-21","lts":false,"security":false,"v8":"5.5.372.40"},{"name":"nodejs","version":"7.7.0","date":"2017-02-28","lts":false,"security":false,"v8":"5.5.372.41"},{"name":"nodejs","version":"7.8.0","date":"2017-03-29","lts":false,"security":false,"v8":"5.5.372.43"},{"name":"nodejs","version":"7.9.0","date":"2017-04-11","lts":false,"security":false,"v8":"5.5.372.43"},{"name":"nodejs","version":"7.10.0","date":"2017-05-02","lts":false,"security":false,"v8":"5.5.372.43"},{"name":"nodejs","version":"8.0.0","date":"2017-05-30","lts":false,"security":false,"v8":"5.8.283.41"},{"name":"nodejs","version":"8.1.0","date":"2017-06-08","lts":false,"security":false,"v8":"5.8.283.41"},{"name":"nodejs","version":"8.2.0","date":"2017-07-19","lts":false,"security":false,"v8":"5.8.283.41"},{"name":"nodejs","version":"8.3.0","date":"2017-08-08","lts":false,"security":false,"v8":"6.0.286.52"},{"name":"nodejs","version":"8.4.0","date":"2017-08-15","lts":false,"security":false,"v8":"6.0.286.52"},{"name":"nodejs","version":"8.5.0","date":"2017-09-12","lts":false,"security":false,"v8":"6.0.287.53"},{"name":"nodejs","version":"8.6.0","date":"2017-09-26","lts":false,"security":false,"v8":"6.0.287.53"},{"name":"nodejs","version":"8.7.0","date":"2017-10-11","lts":false,"security":false,"v8":"6.1.534.42"},{"name":"nodejs","version":"8.8.0","date":"2017-10-24","lts":false,"security":false,"v8":"6.1.534.42"},{"name":"nodejs","version":"8.9.0","date":"2017-10-31","lts":"Carbon","security":false,"v8":"6.1.534.46"},{"name":"nodejs","version":"8.10.0","date":"2018-03-06","lts":"Carbon","security":false,"v8":"6.2.414.50"},{"name":"nodejs","version":"8.11.0","date":"2018-03-28","lts":"Carbon","security":true,"v8":"6.2.414.50"},{"name":"nodejs","version":"8.12.0","date":"2018-09-10","lts":"Carbon","security":false,"v8":"6.2.414.66"},{"name":"nodejs","version":"8.13.0","date":"2018-11-20","lts":"Carbon","security":false,"v8":"6.2.414.72"},{"name":"nodejs","version":"8.14.0","date":"2018-11-27","lts":"Carbon","security":true,"v8":"6.2.414.72"},{"name":"nodejs","version":"8.15.0","date":"2018-12-26","lts":"Carbon","security":false,"v8":"6.2.414.75"},{"name":"nodejs","version":"8.16.0","date":"2019-04-16","lts":"Carbon","security":false,"v8":"6.2.414.77"},{"name":"nodejs","version":"8.17.0","date":"2019-12-17","lts":"Carbon","security":true,"v8":"6.2.414.78"},{"name":"nodejs","version":"9.0.0","date":"2017-10-31","lts":false,"security":false,"v8":"6.2.414.32"},{"name":"nodejs","version":"9.1.0","date":"2017-11-07","lts":false,"security":false,"v8":"6.2.414.32"},{"name":"nodejs","version":"9.2.0","date":"2017-11-14","lts":false,"security":false,"v8":"6.2.414.44"},{"name":"nodejs","version":"9.3.0","date":"2017-12-12","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.4.0","date":"2018-01-10","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.5.0","date":"2018-01-31","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.6.0","date":"2018-02-21","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.7.0","date":"2018-03-01","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.8.0","date":"2018-03-07","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.9.0","date":"2018-03-21","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.10.0","date":"2018-03-28","lts":false,"security":true,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.11.0","date":"2018-04-04","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"10.0.0","date":"2018-04-24","lts":false,"security":false,"v8":"6.6.346.24"},{"name":"nodejs","version":"10.1.0","date":"2018-05-08","lts":false,"security":false,"v8":"6.6.346.27"},{"name":"nodejs","version":"10.2.0","date":"2018-05-23","lts":false,"security":false,"v8":"6.6.346.32"},{"name":"nodejs","version":"10.3.0","date":"2018-05-29","lts":false,"security":false,"v8":"6.6.346.32"},{"name":"nodejs","version":"10.4.0","date":"2018-06-06","lts":false,"security":false,"v8":"6.7.288.43"},{"name":"nodejs","version":"10.5.0","date":"2018-06-20","lts":false,"security":false,"v8":"6.7.288.46"},{"name":"nodejs","version":"10.6.0","date":"2018-07-04","lts":false,"security":false,"v8":"6.7.288.46"},{"name":"nodejs","version":"10.7.0","date":"2018-07-18","lts":false,"security":false,"v8":"6.7.288.49"},{"name":"nodejs","version":"10.8.0","date":"2018-08-01","lts":false,"security":false,"v8":"6.7.288.49"},{"name":"nodejs","version":"10.9.0","date":"2018-08-15","lts":false,"security":false,"v8":"6.8.275.24"},{"name":"nodejs","version":"10.10.0","date":"2018-09-06","lts":false,"security":false,"v8":"6.8.275.30"},{"name":"nodejs","version":"10.11.0","date":"2018-09-19","lts":false,"security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.12.0","date":"2018-10-10","lts":false,"security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.13.0","date":"2018-10-30","lts":"Dubnium","security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.14.0","date":"2018-11-27","lts":"Dubnium","security":true,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.15.0","date":"2018-12-26","lts":"Dubnium","security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.16.0","date":"2019-05-28","lts":"Dubnium","security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.17.0","date":"2019-10-22","lts":"Dubnium","security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.18.0","date":"2019-12-17","lts":"Dubnium","security":true,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.19.0","date":"2020-02-05","lts":"Dubnium","security":true,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.20.0","date":"2020-03-26","lts":"Dubnium","security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.21.0","date":"2020-06-02","lts":"Dubnium","security":true,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.22.0","date":"2020-07-21","lts":"Dubnium","security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.23.0","date":"2020-10-27","lts":"Dubnium","security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.24.0","date":"2021-02-23","lts":"Dubnium","security":true,"v8":"6.8.275.32"},{"name":"nodejs","version":"11.0.0","date":"2018-10-23","lts":false,"security":false,"v8":"7.0.276.28"},{"name":"nodejs","version":"11.1.0","date":"2018-10-30","lts":false,"security":false,"v8":"7.0.276.32"},{"name":"nodejs","version":"11.2.0","date":"2018-11-15","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.3.0","date":"2018-11-27","lts":false,"security":true,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.4.0","date":"2018-12-07","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.5.0","date":"2018-12-18","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.6.0","date":"2018-12-26","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.7.0","date":"2019-01-17","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.8.0","date":"2019-01-24","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.9.0","date":"2019-01-30","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.10.0","date":"2019-02-14","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.11.0","date":"2019-03-05","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.12.0","date":"2019-03-14","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.13.0","date":"2019-03-28","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.14.0","date":"2019-04-10","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.15.0","date":"2019-04-30","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"12.0.0","date":"2019-04-23","lts":false,"security":false,"v8":"7.4.288.21"},{"name":"nodejs","version":"12.1.0","date":"2019-04-29","lts":false,"security":false,"v8":"7.4.288.21"},{"name":"nodejs","version":"12.2.0","date":"2019-05-07","lts":false,"security":false,"v8":"7.4.288.21"},{"name":"nodejs","version":"12.3.0","date":"2019-05-21","lts":false,"security":false,"v8":"7.4.288.27"},{"name":"nodejs","version":"12.4.0","date":"2019-06-04","lts":false,"security":false,"v8":"7.4.288.27"},{"name":"nodejs","version":"12.5.0","date":"2019-06-26","lts":false,"security":false,"v8":"7.5.288.22"},{"name":"nodejs","version":"12.6.0","date":"2019-07-03","lts":false,"security":false,"v8":"7.5.288.22"},{"name":"nodejs","version":"12.7.0","date":"2019-07-23","lts":false,"security":false,"v8":"7.5.288.22"},{"name":"nodejs","version":"12.8.0","date":"2019-08-06","lts":false,"security":false,"v8":"7.5.288.22"},{"name":"nodejs","version":"12.9.0","date":"2019-08-20","lts":false,"security":false,"v8":"7.6.303.29"},{"name":"nodejs","version":"12.10.0","date":"2019-09-04","lts":false,"security":false,"v8":"7.6.303.29"},{"name":"nodejs","version":"12.11.0","date":"2019-09-25","lts":false,"security":false,"v8":"7.7.299.11"},{"name":"nodejs","version":"12.12.0","date":"2019-10-11","lts":false,"security":false,"v8":"7.7.299.13"},{"name":"nodejs","version":"12.13.0","date":"2019-10-21","lts":"Erbium","security":false,"v8":"7.7.299.13"},{"name":"nodejs","version":"12.14.0","date":"2019-12-17","lts":"Erbium","security":true,"v8":"7.7.299.13"},{"name":"nodejs","version":"12.15.0","date":"2020-02-05","lts":"Erbium","security":true,"v8":"7.7.299.13"},{"name":"nodejs","version":"12.16.0","date":"2020-02-11","lts":"Erbium","security":false,"v8":"7.8.279.23"},{"name":"nodejs","version":"12.17.0","date":"2020-05-26","lts":"Erbium","security":false,"v8":"7.8.279.23"},{"name":"nodejs","version":"12.18.0","date":"2020-06-02","lts":"Erbium","security":true,"v8":"7.8.279.23"},{"name":"nodejs","version":"12.19.0","date":"2020-10-06","lts":"Erbium","security":false,"v8":"7.8.279.23"},{"name":"nodejs","version":"12.20.0","date":"2020-11-24","lts":"Erbium","security":false,"v8":"7.8.279.23"},{"name":"nodejs","version":"12.21.0","date":"2021-02-23","lts":"Erbium","security":true,"v8":"7.8.279.23"},{"name":"nodejs","version":"12.22.0","date":"2021-03-30","lts":"Erbium","security":false,"v8":"7.8.279.23"},{"name":"nodejs","version":"13.0.0","date":"2019-10-22","lts":false,"security":false,"v8":"7.8.279.17"},{"name":"nodejs","version":"13.1.0","date":"2019-11-05","lts":false,"security":false,"v8":"7.8.279.17"},{"name":"nodejs","version":"13.2.0","date":"2019-11-21","lts":false,"security":false,"v8":"7.9.317.23"},{"name":"nodejs","version":"13.3.0","date":"2019-12-03","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.4.0","date":"2019-12-17","lts":false,"security":true,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.5.0","date":"2019-12-18","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.6.0","date":"2020-01-07","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.7.0","date":"2020-01-21","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.8.0","date":"2020-02-05","lts":false,"security":true,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.9.0","date":"2020-02-18","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.10.0","date":"2020-03-04","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.11.0","date":"2020-03-12","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.12.0","date":"2020-03-26","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.13.0","date":"2020-04-14","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.14.0","date":"2020-04-29","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"14.0.0","date":"2020-04-21","lts":false,"security":false,"v8":"8.1.307.30"},{"name":"nodejs","version":"14.1.0","date":"2020-04-29","lts":false,"security":false,"v8":"8.1.307.31"},{"name":"nodejs","version":"14.2.0","date":"2020-05-05","lts":false,"security":false,"v8":"8.1.307.31"},{"name":"nodejs","version":"14.3.0","date":"2020-05-19","lts":false,"security":false,"v8":"8.1.307.31"},{"name":"nodejs","version":"14.4.0","date":"2020-06-02","lts":false,"security":true,"v8":"8.1.307.31"},{"name":"nodejs","version":"14.5.0","date":"2020-06-30","lts":false,"security":false,"v8":"8.3.110.9"},{"name":"nodejs","version":"14.6.0","date":"2020-07-20","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.7.0","date":"2020-07-29","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.8.0","date":"2020-08-11","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.9.0","date":"2020-08-27","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.10.0","date":"2020-09-08","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.11.0","date":"2020-09-15","lts":false,"security":true,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.12.0","date":"2020-09-22","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.13.0","date":"2020-09-29","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.14.0","date":"2020-10-15","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.15.0","date":"2020-10-27","lts":"Fermium","security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.16.0","date":"2021-02-23","lts":"Fermium","security":true,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.17.0","date":"2021-05-11","lts":"Fermium","security":false,"v8":"8.4.371.23"},{"name":"nodejs","version":"14.18.0","date":"2021-09-28","lts":"Fermium","security":false,"v8":"8.4.371.23"},{"name":"nodejs","version":"14.19.0","date":"2022-02-01","lts":"Fermium","security":false,"v8":"8.4.371.23"},{"name":"nodejs","version":"14.20.0","date":"2022-07-07","lts":"Fermium","security":true,"v8":"8.4.371.23"},{"name":"nodejs","version":"14.21.0","date":"2022-11-01","lts":"Fermium","security":false,"v8":"8.4.371.23"},{"name":"nodejs","version":"15.0.0","date":"2020-10-20","lts":false,"security":false,"v8":"8.6.395.16"},{"name":"nodejs","version":"15.1.0","date":"2020-11-04","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.2.0","date":"2020-11-10","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.3.0","date":"2020-11-24","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.4.0","date":"2020-12-09","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.5.0","date":"2020-12-22","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.6.0","date":"2021-01-14","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.7.0","date":"2021-01-25","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.8.0","date":"2021-02-02","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.9.0","date":"2021-02-18","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.10.0","date":"2021-02-23","lts":false,"security":true,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.11.0","date":"2021-03-03","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.12.0","date":"2021-03-17","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.13.0","date":"2021-03-31","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.14.0","date":"2021-04-06","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"16.0.0","date":"2021-04-20","lts":false,"security":false,"v8":"9.0.257.17"},{"name":"nodejs","version":"16.1.0","date":"2021-05-04","lts":false,"security":false,"v8":"9.0.257.24"},{"name":"nodejs","version":"16.2.0","date":"2021-05-19","lts":false,"security":false,"v8":"9.0.257.25"},{"name":"nodejs","version":"16.3.0","date":"2021-06-03","lts":false,"security":false,"v8":"9.0.257.25"},{"name":"nodejs","version":"16.4.0","date":"2021-06-23","lts":false,"security":false,"v8":"9.1.269.36"},{"name":"nodejs","version":"16.5.0","date":"2021-07-14","lts":false,"security":false,"v8":"9.1.269.38"},{"name":"nodejs","version":"16.6.0","date":"2021-07-29","lts":false,"security":true,"v8":"9.2.230.21"},{"name":"nodejs","version":"16.7.0","date":"2021-08-18","lts":false,"security":false,"v8":"9.2.230.21"},{"name":"nodejs","version":"16.8.0","date":"2021-08-25","lts":false,"security":false,"v8":"9.2.230.21"},{"name":"nodejs","version":"16.9.0","date":"2021-09-07","lts":false,"security":false,"v8":"9.3.345.16"},{"name":"nodejs","version":"16.10.0","date":"2021-09-22","lts":false,"security":false,"v8":"9.3.345.19"},{"name":"nodejs","version":"16.11.0","date":"2021-10-08","lts":false,"security":false,"v8":"9.4.146.19"},{"name":"nodejs","version":"16.12.0","date":"2021-10-20","lts":false,"security":false,"v8":"9.4.146.19"},{"name":"nodejs","version":"16.13.0","date":"2021-10-26","lts":"Gallium","security":false,"v8":"9.4.146.19"},{"name":"nodejs","version":"16.14.0","date":"2022-02-08","lts":"Gallium","security":false,"v8":"9.4.146.24"},{"name":"nodejs","version":"16.15.0","date":"2022-04-26","lts":"Gallium","security":false,"v8":"9.4.146.24"},{"name":"nodejs","version":"16.16.0","date":"2022-07-07","lts":"Gallium","security":true,"v8":"9.4.146.24"},{"name":"nodejs","version":"16.17.0","date":"2022-08-16","lts":"Gallium","security":false,"v8":"9.4.146.26"},{"name":"nodejs","version":"16.18.0","date":"2022-10-12","lts":"Gallium","security":false,"v8":"9.4.146.26"},{"name":"nodejs","version":"16.19.0","date":"2022-12-13","lts":"Gallium","security":false,"v8":"9.4.146.26"},{"name":"nodejs","version":"16.20.0","date":"2023-03-28","lts":"Gallium","security":false,"v8":"9.4.146.26"},{"name":"nodejs","version":"17.0.0","date":"2021-10-19","lts":false,"security":false,"v8":"9.5.172.21"},{"name":"nodejs","version":"17.1.0","date":"2021-11-09","lts":false,"security":false,"v8":"9.5.172.25"},{"name":"nodejs","version":"17.2.0","date":"2021-11-30","lts":false,"security":false,"v8":"9.6.180.14"},{"name":"nodejs","version":"17.3.0","date":"2021-12-17","lts":false,"security":false,"v8":"9.6.180.15"},{"name":"nodejs","version":"17.4.0","date":"2022-01-18","lts":false,"security":false,"v8":"9.6.180.15"},{"name":"nodejs","version":"17.5.0","date":"2022-02-10","lts":false,"security":false,"v8":"9.6.180.15"},{"name":"nodejs","version":"17.6.0","date":"2022-02-22","lts":false,"security":false,"v8":"9.6.180.15"},{"name":"nodejs","version":"17.7.0","date":"2022-03-09","lts":false,"security":false,"v8":"9.6.180.15"},{"name":"nodejs","version":"17.8.0","date":"2022-03-22","lts":false,"security":false,"v8":"9.6.180.15"},{"name":"nodejs","version":"17.9.0","date":"2022-04-07","lts":false,"security":false,"v8":"9.6.180.15"},{"name":"nodejs","version":"18.0.0","date":"2022-04-18","lts":false,"security":false,"v8":"10.1.124.8"},{"name":"nodejs","version":"18.1.0","date":"2022-05-03","lts":false,"security":false,"v8":"10.1.124.8"},{"name":"nodejs","version":"18.2.0","date":"2022-05-17","lts":false,"security":false,"v8":"10.1.124.8"},{"name":"nodejs","version":"18.3.0","date":"2022-06-02","lts":false,"security":false,"v8":"10.2.154.4"},{"name":"nodejs","version":"18.4.0","date":"2022-06-16","lts":false,"security":false,"v8":"10.2.154.4"},{"name":"nodejs","version":"18.5.0","date":"2022-07-06","lts":false,"security":true,"v8":"10.2.154.4"},{"name":"nodejs","version":"18.6.0","date":"2022-07-13","lts":false,"security":false,"v8":"10.2.154.13"},{"name":"nodejs","version":"18.7.0","date":"2022-07-26","lts":false,"security":false,"v8":"10.2.154.13"},{"name":"nodejs","version":"18.8.0","date":"2022-08-24","lts":false,"security":false,"v8":"10.2.154.13"},{"name":"nodejs","version":"18.9.0","date":"2022-09-07","lts":false,"security":false,"v8":"10.2.154.15"},{"name":"nodejs","version":"18.10.0","date":"2022-09-28","lts":false,"security":false,"v8":"10.2.154.15"},{"name":"nodejs","version":"18.11.0","date":"2022-10-13","lts":false,"security":false,"v8":"10.2.154.15"},{"name":"nodejs","version":"18.12.0","date":"2022-10-25","lts":"Hydrogen","security":false,"v8":"10.2.154.15"},{"name":"nodejs","version":"18.13.0","date":"2023-01-05","lts":"Hydrogen","security":false,"v8":"10.2.154.23"},{"name":"nodejs","version":"18.14.0","date":"2023-02-01","lts":"Hydrogen","security":false,"v8":"10.2.154.23"},{"name":"nodejs","version":"18.15.0","date":"2023-03-05","lts":"Hydrogen","security":false,"v8":"10.2.154.26"},{"name":"nodejs","version":"18.16.0","date":"2023-04-12","lts":"Hydrogen","security":false,"v8":"10.2.154.26"},{"name":"nodejs","version":"19.0.0","date":"2022-10-17","lts":false,"security":false,"v8":"10.7.193.13"},{"name":"nodejs","version":"19.1.0","date":"2022-11-14","lts":false,"security":false,"v8":"10.7.193.20"},{"name":"nodejs","version":"19.2.0","date":"2022-11-29","lts":false,"security":false,"v8":"10.8.168.20"},{"name":"nodejs","version":"19.3.0","date":"2022-12-14","lts":false,"security":false,"v8":"10.8.168.21"},{"name":"nodejs","version":"19.4.0","date":"2023-01-05","lts":false,"security":false,"v8":"10.8.168.25"},{"name":"nodejs","version":"19.5.0","date":"2023-01-24","lts":false,"security":false,"v8":"10.8.168.25"},{"name":"nodejs","version":"19.6.0","date":"2023-02-01","lts":false,"security":false,"v8":"10.8.168.25"},{"name":"nodejs","version":"19.7.0","date":"2023-02-21","lts":false,"security":false,"v8":"10.8.168.25"},{"name":"nodejs","version":"19.8.0","date":"2023-03-14","lts":false,"security":false,"v8":"10.8.168.25"},{"name":"nodejs","version":"19.9.0","date":"2023-04-10","lts":false,"security":false,"v8":"10.8.168.25"},{"name":"nodejs","version":"20.0.0","date":"2023-04-17","lts":false,"security":false,"v8":"11.3.244.4"},{"name":"nodejs","version":"20.1.0","date":"2023-05-03","lts":false,"security":false,"v8":"11.3.244.8"},{"name":"nodejs","version":"20.2.0","date":"2023-05-16","lts":false,"security":false,"v8":"11.3.244.8"},{"name":"nodejs","version":"20.3.0","date":"2023-06-08","lts":false,"security":false,"v8":"11.3.244.8"},{"name":"nodejs","version":"20.4.0","date":"2023-07-04","lts":false,"security":false,"v8":"11.3.244.8"}] \ No newline at end of file +[{"name":"nodejs","version":"0.2.0","date":"2011-08-26","lts":false,"security":false,"v8":"2.3.8.0"},{"name":"nodejs","version":"0.3.0","date":"2011-08-26","lts":false,"security":false,"v8":"2.5.1.0"},{"name":"nodejs","version":"0.4.0","date":"2011-08-26","lts":false,"security":false,"v8":"3.1.2.0"},{"name":"nodejs","version":"0.5.0","date":"2011-08-26","lts":false,"security":false,"v8":"3.1.8.25"},{"name":"nodejs","version":"0.6.0","date":"2011-11-04","lts":false,"security":false,"v8":"3.6.6.6"},{"name":"nodejs","version":"0.7.0","date":"2012-01-17","lts":false,"security":false,"v8":"3.8.6.0"},{"name":"nodejs","version":"0.8.0","date":"2012-06-22","lts":false,"security":false,"v8":"3.11.10.10"},{"name":"nodejs","version":"0.9.0","date":"2012-07-20","lts":false,"security":false,"v8":"3.11.10.15"},{"name":"nodejs","version":"0.10.0","date":"2013-03-11","lts":false,"security":false,"v8":"3.14.5.8"},{"name":"nodejs","version":"0.11.0","date":"2013-03-28","lts":false,"security":false,"v8":"3.17.13.0"},{"name":"nodejs","version":"0.12.0","date":"2015-02-06","lts":false,"security":false,"v8":"3.28.73.0"},{"name":"nodejs","version":"4.0.0","date":"2015-09-08","lts":false,"security":false,"v8":"4.5.103.30"},{"name":"nodejs","version":"4.1.0","date":"2015-09-17","lts":false,"security":false,"v8":"4.5.103.33"},{"name":"nodejs","version":"4.2.0","date":"2015-10-12","lts":"Argon","security":false,"v8":"4.5.103.35"},{"name":"nodejs","version":"4.3.0","date":"2016-02-09","lts":"Argon","security":false,"v8":"4.5.103.35"},{"name":"nodejs","version":"4.4.0","date":"2016-03-08","lts":"Argon","security":false,"v8":"4.5.103.35"},{"name":"nodejs","version":"4.5.0","date":"2016-08-16","lts":"Argon","security":false,"v8":"4.5.103.37"},{"name":"nodejs","version":"4.6.0","date":"2016-09-27","lts":"Argon","security":true,"v8":"4.5.103.37"},{"name":"nodejs","version":"4.7.0","date":"2016-12-06","lts":"Argon","security":false,"v8":"4.5.103.43"},{"name":"nodejs","version":"4.8.0","date":"2017-02-21","lts":"Argon","security":false,"v8":"4.5.103.45"},{"name":"nodejs","version":"4.9.0","date":"2018-03-28","lts":"Argon","security":true,"v8":"4.5.103.53"},{"name":"nodejs","version":"5.0.0","date":"2015-10-29","lts":false,"security":false,"v8":"4.6.85.28"},{"name":"nodejs","version":"5.1.0","date":"2015-11-17","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.2.0","date":"2015-12-09","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.3.0","date":"2015-12-15","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.4.0","date":"2016-01-06","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.5.0","date":"2016-01-21","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.6.0","date":"2016-02-09","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.7.0","date":"2016-02-23","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.8.0","date":"2016-03-09","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.9.0","date":"2016-03-16","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.10.0","date":"2016-04-01","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.11.0","date":"2016-04-21","lts":false,"security":false,"v8":"4.6.85.31"},{"name":"nodejs","version":"5.12.0","date":"2016-06-23","lts":false,"security":false,"v8":"4.6.85.32"},{"name":"nodejs","version":"6.0.0","date":"2016-04-26","lts":false,"security":false,"v8":"5.0.71.35"},{"name":"nodejs","version":"6.1.0","date":"2016-05-05","lts":false,"security":false,"v8":"5.0.71.35"},{"name":"nodejs","version":"6.2.0","date":"2016-05-17","lts":false,"security":false,"v8":"5.0.71.47"},{"name":"nodejs","version":"6.3.0","date":"2016-07-06","lts":false,"security":false,"v8":"5.0.71.52"},{"name":"nodejs","version":"6.4.0","date":"2016-08-12","lts":false,"security":false,"v8":"5.0.71.60"},{"name":"nodejs","version":"6.5.0","date":"2016-08-26","lts":false,"security":false,"v8":"5.1.281.81"},{"name":"nodejs","version":"6.6.0","date":"2016-09-14","lts":false,"security":false,"v8":"5.1.281.83"},{"name":"nodejs","version":"6.7.0","date":"2016-09-27","lts":false,"security":true,"v8":"5.1.281.83"},{"name":"nodejs","version":"6.8.0","date":"2016-10-12","lts":false,"security":false,"v8":"5.1.281.84"},{"name":"nodejs","version":"6.9.0","date":"2016-10-18","lts":"Boron","security":false,"v8":"5.1.281.84"},{"name":"nodejs","version":"6.10.0","date":"2017-02-21","lts":"Boron","security":false,"v8":"5.1.281.93"},{"name":"nodejs","version":"6.11.0","date":"2017-06-06","lts":"Boron","security":false,"v8":"5.1.281.102"},{"name":"nodejs","version":"6.12.0","date":"2017-11-06","lts":"Boron","security":false,"v8":"5.1.281.108"},{"name":"nodejs","version":"6.13.0","date":"2018-02-10","lts":"Boron","security":false,"v8":"5.1.281.111"},{"name":"nodejs","version":"6.14.0","date":"2018-03-28","lts":"Boron","security":true,"v8":"5.1.281.111"},{"name":"nodejs","version":"6.15.0","date":"2018-11-27","lts":"Boron","security":true,"v8":"5.1.281.111"},{"name":"nodejs","version":"6.16.0","date":"2018-12-26","lts":"Boron","security":false,"v8":"5.1.281.111"},{"name":"nodejs","version":"6.17.0","date":"2019-02-28","lts":"Boron","security":true,"v8":"5.1.281.111"},{"name":"nodejs","version":"7.0.0","date":"2016-10-25","lts":false,"security":false,"v8":"5.4.500.36"},{"name":"nodejs","version":"7.1.0","date":"2016-11-08","lts":false,"security":false,"v8":"5.4.500.36"},{"name":"nodejs","version":"7.2.0","date":"2016-11-22","lts":false,"security":false,"v8":"5.4.500.43"},{"name":"nodejs","version":"7.3.0","date":"2016-12-20","lts":false,"security":false,"v8":"5.4.500.45"},{"name":"nodejs","version":"7.4.0","date":"2017-01-04","lts":false,"security":false,"v8":"5.4.500.45"},{"name":"nodejs","version":"7.5.0","date":"2017-01-31","lts":false,"security":false,"v8":"5.4.500.48"},{"name":"nodejs","version":"7.6.0","date":"2017-02-21","lts":false,"security":false,"v8":"5.5.372.40"},{"name":"nodejs","version":"7.7.0","date":"2017-02-28","lts":false,"security":false,"v8":"5.5.372.41"},{"name":"nodejs","version":"7.8.0","date":"2017-03-29","lts":false,"security":false,"v8":"5.5.372.43"},{"name":"nodejs","version":"7.9.0","date":"2017-04-11","lts":false,"security":false,"v8":"5.5.372.43"},{"name":"nodejs","version":"7.10.0","date":"2017-05-02","lts":false,"security":false,"v8":"5.5.372.43"},{"name":"nodejs","version":"8.0.0","date":"2017-05-30","lts":false,"security":false,"v8":"5.8.283.41"},{"name":"nodejs","version":"8.1.0","date":"2017-06-08","lts":false,"security":false,"v8":"5.8.283.41"},{"name":"nodejs","version":"8.2.0","date":"2017-07-19","lts":false,"security":false,"v8":"5.8.283.41"},{"name":"nodejs","version":"8.3.0","date":"2017-08-08","lts":false,"security":false,"v8":"6.0.286.52"},{"name":"nodejs","version":"8.4.0","date":"2017-08-15","lts":false,"security":false,"v8":"6.0.286.52"},{"name":"nodejs","version":"8.5.0","date":"2017-09-12","lts":false,"security":false,"v8":"6.0.287.53"},{"name":"nodejs","version":"8.6.0","date":"2017-09-26","lts":false,"security":false,"v8":"6.0.287.53"},{"name":"nodejs","version":"8.7.0","date":"2017-10-11","lts":false,"security":false,"v8":"6.1.534.42"},{"name":"nodejs","version":"8.8.0","date":"2017-10-24","lts":false,"security":false,"v8":"6.1.534.42"},{"name":"nodejs","version":"8.9.0","date":"2017-10-31","lts":"Carbon","security":false,"v8":"6.1.534.46"},{"name":"nodejs","version":"8.10.0","date":"2018-03-06","lts":"Carbon","security":false,"v8":"6.2.414.50"},{"name":"nodejs","version":"8.11.0","date":"2018-03-28","lts":"Carbon","security":true,"v8":"6.2.414.50"},{"name":"nodejs","version":"8.12.0","date":"2018-09-10","lts":"Carbon","security":false,"v8":"6.2.414.66"},{"name":"nodejs","version":"8.13.0","date":"2018-11-20","lts":"Carbon","security":false,"v8":"6.2.414.72"},{"name":"nodejs","version":"8.14.0","date":"2018-11-27","lts":"Carbon","security":true,"v8":"6.2.414.72"},{"name":"nodejs","version":"8.15.0","date":"2018-12-26","lts":"Carbon","security":false,"v8":"6.2.414.75"},{"name":"nodejs","version":"8.16.0","date":"2019-04-16","lts":"Carbon","security":false,"v8":"6.2.414.77"},{"name":"nodejs","version":"8.17.0","date":"2019-12-17","lts":"Carbon","security":true,"v8":"6.2.414.78"},{"name":"nodejs","version":"9.0.0","date":"2017-10-31","lts":false,"security":false,"v8":"6.2.414.32"},{"name":"nodejs","version":"9.1.0","date":"2017-11-07","lts":false,"security":false,"v8":"6.2.414.32"},{"name":"nodejs","version":"9.2.0","date":"2017-11-14","lts":false,"security":false,"v8":"6.2.414.44"},{"name":"nodejs","version":"9.3.0","date":"2017-12-12","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.4.0","date":"2018-01-10","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.5.0","date":"2018-01-31","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.6.0","date":"2018-02-21","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.7.0","date":"2018-03-01","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.8.0","date":"2018-03-07","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.9.0","date":"2018-03-21","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.10.0","date":"2018-03-28","lts":false,"security":true,"v8":"6.2.414.46"},{"name":"nodejs","version":"9.11.0","date":"2018-04-04","lts":false,"security":false,"v8":"6.2.414.46"},{"name":"nodejs","version":"10.0.0","date":"2018-04-24","lts":false,"security":false,"v8":"6.6.346.24"},{"name":"nodejs","version":"10.1.0","date":"2018-05-08","lts":false,"security":false,"v8":"6.6.346.27"},{"name":"nodejs","version":"10.2.0","date":"2018-05-23","lts":false,"security":false,"v8":"6.6.346.32"},{"name":"nodejs","version":"10.3.0","date":"2018-05-29","lts":false,"security":false,"v8":"6.6.346.32"},{"name":"nodejs","version":"10.4.0","date":"2018-06-06","lts":false,"security":false,"v8":"6.7.288.43"},{"name":"nodejs","version":"10.5.0","date":"2018-06-20","lts":false,"security":false,"v8":"6.7.288.46"},{"name":"nodejs","version":"10.6.0","date":"2018-07-04","lts":false,"security":false,"v8":"6.7.288.46"},{"name":"nodejs","version":"10.7.0","date":"2018-07-18","lts":false,"security":false,"v8":"6.7.288.49"},{"name":"nodejs","version":"10.8.0","date":"2018-08-01","lts":false,"security":false,"v8":"6.7.288.49"},{"name":"nodejs","version":"10.9.0","date":"2018-08-15","lts":false,"security":false,"v8":"6.8.275.24"},{"name":"nodejs","version":"10.10.0","date":"2018-09-06","lts":false,"security":false,"v8":"6.8.275.30"},{"name":"nodejs","version":"10.11.0","date":"2018-09-19","lts":false,"security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.12.0","date":"2018-10-10","lts":false,"security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.13.0","date":"2018-10-30","lts":"Dubnium","security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.14.0","date":"2018-11-27","lts":"Dubnium","security":true,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.15.0","date":"2018-12-26","lts":"Dubnium","security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.16.0","date":"2019-05-28","lts":"Dubnium","security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.17.0","date":"2019-10-22","lts":"Dubnium","security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.18.0","date":"2019-12-17","lts":"Dubnium","security":true,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.19.0","date":"2020-02-05","lts":"Dubnium","security":true,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.20.0","date":"2020-03-26","lts":"Dubnium","security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.21.0","date":"2020-06-02","lts":"Dubnium","security":true,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.22.0","date":"2020-07-21","lts":"Dubnium","security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.23.0","date":"2020-10-27","lts":"Dubnium","security":false,"v8":"6.8.275.32"},{"name":"nodejs","version":"10.24.0","date":"2021-02-23","lts":"Dubnium","security":true,"v8":"6.8.275.32"},{"name":"nodejs","version":"11.0.0","date":"2018-10-23","lts":false,"security":false,"v8":"7.0.276.28"},{"name":"nodejs","version":"11.1.0","date":"2018-10-30","lts":false,"security":false,"v8":"7.0.276.32"},{"name":"nodejs","version":"11.2.0","date":"2018-11-15","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.3.0","date":"2018-11-27","lts":false,"security":true,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.4.0","date":"2018-12-07","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.5.0","date":"2018-12-18","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.6.0","date":"2018-12-26","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.7.0","date":"2019-01-17","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.8.0","date":"2019-01-24","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.9.0","date":"2019-01-30","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.10.0","date":"2019-02-14","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.11.0","date":"2019-03-05","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.12.0","date":"2019-03-14","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.13.0","date":"2019-03-28","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.14.0","date":"2019-04-10","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"11.15.0","date":"2019-04-30","lts":false,"security":false,"v8":"7.0.276.38"},{"name":"nodejs","version":"12.0.0","date":"2019-04-23","lts":false,"security":false,"v8":"7.4.288.21"},{"name":"nodejs","version":"12.1.0","date":"2019-04-29","lts":false,"security":false,"v8":"7.4.288.21"},{"name":"nodejs","version":"12.2.0","date":"2019-05-07","lts":false,"security":false,"v8":"7.4.288.21"},{"name":"nodejs","version":"12.3.0","date":"2019-05-21","lts":false,"security":false,"v8":"7.4.288.27"},{"name":"nodejs","version":"12.4.0","date":"2019-06-04","lts":false,"security":false,"v8":"7.4.288.27"},{"name":"nodejs","version":"12.5.0","date":"2019-06-26","lts":false,"security":false,"v8":"7.5.288.22"},{"name":"nodejs","version":"12.6.0","date":"2019-07-03","lts":false,"security":false,"v8":"7.5.288.22"},{"name":"nodejs","version":"12.7.0","date":"2019-07-23","lts":false,"security":false,"v8":"7.5.288.22"},{"name":"nodejs","version":"12.8.0","date":"2019-08-06","lts":false,"security":false,"v8":"7.5.288.22"},{"name":"nodejs","version":"12.9.0","date":"2019-08-20","lts":false,"security":false,"v8":"7.6.303.29"},{"name":"nodejs","version":"12.10.0","date":"2019-09-04","lts":false,"security":false,"v8":"7.6.303.29"},{"name":"nodejs","version":"12.11.0","date":"2019-09-25","lts":false,"security":false,"v8":"7.7.299.11"},{"name":"nodejs","version":"12.12.0","date":"2019-10-11","lts":false,"security":false,"v8":"7.7.299.13"},{"name":"nodejs","version":"12.13.0","date":"2019-10-21","lts":"Erbium","security":false,"v8":"7.7.299.13"},{"name":"nodejs","version":"12.14.0","date":"2019-12-17","lts":"Erbium","security":true,"v8":"7.7.299.13"},{"name":"nodejs","version":"12.15.0","date":"2020-02-05","lts":"Erbium","security":true,"v8":"7.7.299.13"},{"name":"nodejs","version":"12.16.0","date":"2020-02-11","lts":"Erbium","security":false,"v8":"7.8.279.23"},{"name":"nodejs","version":"12.17.0","date":"2020-05-26","lts":"Erbium","security":false,"v8":"7.8.279.23"},{"name":"nodejs","version":"12.18.0","date":"2020-06-02","lts":"Erbium","security":true,"v8":"7.8.279.23"},{"name":"nodejs","version":"12.19.0","date":"2020-10-06","lts":"Erbium","security":false,"v8":"7.8.279.23"},{"name":"nodejs","version":"12.20.0","date":"2020-11-24","lts":"Erbium","security":false,"v8":"7.8.279.23"},{"name":"nodejs","version":"12.21.0","date":"2021-02-23","lts":"Erbium","security":true,"v8":"7.8.279.23"},{"name":"nodejs","version":"12.22.0","date":"2021-03-30","lts":"Erbium","security":false,"v8":"7.8.279.23"},{"name":"nodejs","version":"13.0.0","date":"2019-10-22","lts":false,"security":false,"v8":"7.8.279.17"},{"name":"nodejs","version":"13.1.0","date":"2019-11-05","lts":false,"security":false,"v8":"7.8.279.17"},{"name":"nodejs","version":"13.2.0","date":"2019-11-21","lts":false,"security":false,"v8":"7.9.317.23"},{"name":"nodejs","version":"13.3.0","date":"2019-12-03","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.4.0","date":"2019-12-17","lts":false,"security":true,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.5.0","date":"2019-12-18","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.6.0","date":"2020-01-07","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.7.0","date":"2020-01-21","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.8.0","date":"2020-02-05","lts":false,"security":true,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.9.0","date":"2020-02-18","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.10.0","date":"2020-03-04","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.11.0","date":"2020-03-12","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.12.0","date":"2020-03-26","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.13.0","date":"2020-04-14","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"13.14.0","date":"2020-04-29","lts":false,"security":false,"v8":"7.9.317.25"},{"name":"nodejs","version":"14.0.0","date":"2020-04-21","lts":false,"security":false,"v8":"8.1.307.30"},{"name":"nodejs","version":"14.1.0","date":"2020-04-29","lts":false,"security":false,"v8":"8.1.307.31"},{"name":"nodejs","version":"14.2.0","date":"2020-05-05","lts":false,"security":false,"v8":"8.1.307.31"},{"name":"nodejs","version":"14.3.0","date":"2020-05-19","lts":false,"security":false,"v8":"8.1.307.31"},{"name":"nodejs","version":"14.4.0","date":"2020-06-02","lts":false,"security":true,"v8":"8.1.307.31"},{"name":"nodejs","version":"14.5.0","date":"2020-06-30","lts":false,"security":false,"v8":"8.3.110.9"},{"name":"nodejs","version":"14.6.0","date":"2020-07-20","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.7.0","date":"2020-07-29","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.8.0","date":"2020-08-11","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.9.0","date":"2020-08-27","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.10.0","date":"2020-09-08","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.11.0","date":"2020-09-15","lts":false,"security":true,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.12.0","date":"2020-09-22","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.13.0","date":"2020-09-29","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.14.0","date":"2020-10-15","lts":false,"security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.15.0","date":"2020-10-27","lts":"Fermium","security":false,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.16.0","date":"2021-02-23","lts":"Fermium","security":true,"v8":"8.4.371.19"},{"name":"nodejs","version":"14.17.0","date":"2021-05-11","lts":"Fermium","security":false,"v8":"8.4.371.23"},{"name":"nodejs","version":"14.18.0","date":"2021-09-28","lts":"Fermium","security":false,"v8":"8.4.371.23"},{"name":"nodejs","version":"14.19.0","date":"2022-02-01","lts":"Fermium","security":false,"v8":"8.4.371.23"},{"name":"nodejs","version":"14.20.0","date":"2022-07-07","lts":"Fermium","security":true,"v8":"8.4.371.23"},{"name":"nodejs","version":"14.21.0","date":"2022-11-01","lts":"Fermium","security":false,"v8":"8.4.371.23"},{"name":"nodejs","version":"15.0.0","date":"2020-10-20","lts":false,"security":false,"v8":"8.6.395.16"},{"name":"nodejs","version":"15.1.0","date":"2020-11-04","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.2.0","date":"2020-11-10","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.3.0","date":"2020-11-24","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.4.0","date":"2020-12-09","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.5.0","date":"2020-12-22","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.6.0","date":"2021-01-14","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.7.0","date":"2021-01-25","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.8.0","date":"2021-02-02","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.9.0","date":"2021-02-18","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.10.0","date":"2021-02-23","lts":false,"security":true,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.11.0","date":"2021-03-03","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.12.0","date":"2021-03-17","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.13.0","date":"2021-03-31","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"15.14.0","date":"2021-04-06","lts":false,"security":false,"v8":"8.6.395.17"},{"name":"nodejs","version":"16.0.0","date":"2021-04-20","lts":false,"security":false,"v8":"9.0.257.17"},{"name":"nodejs","version":"16.1.0","date":"2021-05-04","lts":false,"security":false,"v8":"9.0.257.24"},{"name":"nodejs","version":"16.2.0","date":"2021-05-19","lts":false,"security":false,"v8":"9.0.257.25"},{"name":"nodejs","version":"16.3.0","date":"2021-06-03","lts":false,"security":false,"v8":"9.0.257.25"},{"name":"nodejs","version":"16.4.0","date":"2021-06-23","lts":false,"security":false,"v8":"9.1.269.36"},{"name":"nodejs","version":"16.5.0","date":"2021-07-14","lts":false,"security":false,"v8":"9.1.269.38"},{"name":"nodejs","version":"16.6.0","date":"2021-07-29","lts":false,"security":true,"v8":"9.2.230.21"},{"name":"nodejs","version":"16.7.0","date":"2021-08-18","lts":false,"security":false,"v8":"9.2.230.21"},{"name":"nodejs","version":"16.8.0","date":"2021-08-25","lts":false,"security":false,"v8":"9.2.230.21"},{"name":"nodejs","version":"16.9.0","date":"2021-09-07","lts":false,"security":false,"v8":"9.3.345.16"},{"name":"nodejs","version":"16.10.0","date":"2021-09-22","lts":false,"security":false,"v8":"9.3.345.19"},{"name":"nodejs","version":"16.11.0","date":"2021-10-08","lts":false,"security":false,"v8":"9.4.146.19"},{"name":"nodejs","version":"16.12.0","date":"2021-10-20","lts":false,"security":false,"v8":"9.4.146.19"},{"name":"nodejs","version":"16.13.0","date":"2021-10-26","lts":"Gallium","security":false,"v8":"9.4.146.19"},{"name":"nodejs","version":"16.14.0","date":"2022-02-08","lts":"Gallium","security":false,"v8":"9.4.146.24"},{"name":"nodejs","version":"16.15.0","date":"2022-04-26","lts":"Gallium","security":false,"v8":"9.4.146.24"},{"name":"nodejs","version":"16.16.0","date":"2022-07-07","lts":"Gallium","security":true,"v8":"9.4.146.24"},{"name":"nodejs","version":"16.17.0","date":"2022-08-16","lts":"Gallium","security":false,"v8":"9.4.146.26"},{"name":"nodejs","version":"16.18.0","date":"2022-10-12","lts":"Gallium","security":false,"v8":"9.4.146.26"},{"name":"nodejs","version":"16.19.0","date":"2022-12-13","lts":"Gallium","security":false,"v8":"9.4.146.26"},{"name":"nodejs","version":"16.20.0","date":"2023-03-28","lts":"Gallium","security":false,"v8":"9.4.146.26"},{"name":"nodejs","version":"17.0.0","date":"2021-10-19","lts":false,"security":false,"v8":"9.5.172.21"},{"name":"nodejs","version":"17.1.0","date":"2021-11-09","lts":false,"security":false,"v8":"9.5.172.25"},{"name":"nodejs","version":"17.2.0","date":"2021-11-30","lts":false,"security":false,"v8":"9.6.180.14"},{"name":"nodejs","version":"17.3.0","date":"2021-12-17","lts":false,"security":false,"v8":"9.6.180.15"},{"name":"nodejs","version":"17.4.0","date":"2022-01-18","lts":false,"security":false,"v8":"9.6.180.15"},{"name":"nodejs","version":"17.5.0","date":"2022-02-10","lts":false,"security":false,"v8":"9.6.180.15"},{"name":"nodejs","version":"17.6.0","date":"2022-02-22","lts":false,"security":false,"v8":"9.6.180.15"},{"name":"nodejs","version":"17.7.0","date":"2022-03-09","lts":false,"security":false,"v8":"9.6.180.15"},{"name":"nodejs","version":"17.8.0","date":"2022-03-22","lts":false,"security":false,"v8":"9.6.180.15"},{"name":"nodejs","version":"17.9.0","date":"2022-04-07","lts":false,"security":false,"v8":"9.6.180.15"},{"name":"nodejs","version":"18.0.0","date":"2022-04-18","lts":false,"security":false,"v8":"10.1.124.8"},{"name":"nodejs","version":"18.1.0","date":"2022-05-03","lts":false,"security":false,"v8":"10.1.124.8"},{"name":"nodejs","version":"18.2.0","date":"2022-05-17","lts":false,"security":false,"v8":"10.1.124.8"},{"name":"nodejs","version":"18.3.0","date":"2022-06-02","lts":false,"security":false,"v8":"10.2.154.4"},{"name":"nodejs","version":"18.4.0","date":"2022-06-16","lts":false,"security":false,"v8":"10.2.154.4"},{"name":"nodejs","version":"18.5.0","date":"2022-07-06","lts":false,"security":true,"v8":"10.2.154.4"},{"name":"nodejs","version":"18.6.0","date":"2022-07-13","lts":false,"security":false,"v8":"10.2.154.13"},{"name":"nodejs","version":"18.7.0","date":"2022-07-26","lts":false,"security":false,"v8":"10.2.154.13"},{"name":"nodejs","version":"18.8.0","date":"2022-08-24","lts":false,"security":false,"v8":"10.2.154.13"},{"name":"nodejs","version":"18.9.0","date":"2022-09-07","lts":false,"security":false,"v8":"10.2.154.15"},{"name":"nodejs","version":"18.10.0","date":"2022-09-28","lts":false,"security":false,"v8":"10.2.154.15"},{"name":"nodejs","version":"18.11.0","date":"2022-10-13","lts":false,"security":false,"v8":"10.2.154.15"},{"name":"nodejs","version":"18.12.0","date":"2022-10-25","lts":"Hydrogen","security":false,"v8":"10.2.154.15"},{"name":"nodejs","version":"18.13.0","date":"2023-01-05","lts":"Hydrogen","security":false,"v8":"10.2.154.23"},{"name":"nodejs","version":"18.14.0","date":"2023-02-01","lts":"Hydrogen","security":false,"v8":"10.2.154.23"},{"name":"nodejs","version":"18.15.0","date":"2023-03-05","lts":"Hydrogen","security":false,"v8":"10.2.154.26"},{"name":"nodejs","version":"18.16.0","date":"2023-04-12","lts":"Hydrogen","security":false,"v8":"10.2.154.26"},{"name":"nodejs","version":"18.17.0","date":"2023-07-18","lts":"Hydrogen","security":false,"v8":"10.2.154.26"},{"name":"nodejs","version":"18.18.0","date":"2023-09-18","lts":"Hydrogen","security":false,"v8":"10.2.154.26"},{"name":"nodejs","version":"18.19.0","date":"2023-11-29","lts":"Hydrogen","security":false,"v8":"10.2.154.26"},{"name":"nodejs","version":"19.0.0","date":"2022-10-17","lts":false,"security":false,"v8":"10.7.193.13"},{"name":"nodejs","version":"19.1.0","date":"2022-11-14","lts":false,"security":false,"v8":"10.7.193.20"},{"name":"nodejs","version":"19.2.0","date":"2022-11-29","lts":false,"security":false,"v8":"10.8.168.20"},{"name":"nodejs","version":"19.3.0","date":"2022-12-14","lts":false,"security":false,"v8":"10.8.168.21"},{"name":"nodejs","version":"19.4.0","date":"2023-01-05","lts":false,"security":false,"v8":"10.8.168.25"},{"name":"nodejs","version":"19.5.0","date":"2023-01-24","lts":false,"security":false,"v8":"10.8.168.25"},{"name":"nodejs","version":"19.6.0","date":"2023-02-01","lts":false,"security":false,"v8":"10.8.168.25"},{"name":"nodejs","version":"19.7.0","date":"2023-02-21","lts":false,"security":false,"v8":"10.8.168.25"},{"name":"nodejs","version":"19.8.0","date":"2023-03-14","lts":false,"security":false,"v8":"10.8.168.25"},{"name":"nodejs","version":"19.9.0","date":"2023-04-10","lts":false,"security":false,"v8":"10.8.168.25"},{"name":"nodejs","version":"20.0.0","date":"2023-04-17","lts":false,"security":false,"v8":"11.3.244.4"},{"name":"nodejs","version":"20.1.0","date":"2023-05-03","lts":false,"security":false,"v8":"11.3.244.8"},{"name":"nodejs","version":"20.2.0","date":"2023-05-16","lts":false,"security":false,"v8":"11.3.244.8"},{"name":"nodejs","version":"20.3.0","date":"2023-06-08","lts":false,"security":false,"v8":"11.3.244.8"},{"name":"nodejs","version":"20.4.0","date":"2023-07-04","lts":false,"security":false,"v8":"11.3.244.8"},{"name":"nodejs","version":"20.5.0","date":"2023-07-19","lts":false,"security":false,"v8":"11.3.244.8"},{"name":"nodejs","version":"20.6.0","date":"2023-08-23","lts":false,"security":false,"v8":"11.3.244.8"},{"name":"nodejs","version":"20.7.0","date":"2023-09-18","lts":false,"security":false,"v8":"11.3.244.8"},{"name":"nodejs","version":"20.8.0","date":"2023-09-28","lts":false,"security":false,"v8":"11.3.244.8"},{"name":"nodejs","version":"20.9.0","date":"2023-10-24","lts":"Iron","security":false,"v8":"11.3.244.8"},{"name":"nodejs","version":"20.10.0","date":"2023-11-22","lts":"Iron","security":false,"v8":"11.3.244.8"},{"name":"nodejs","version":"21.0.0","date":"2023-10-17","lts":false,"security":false,"v8":"11.8.172.13"},{"name":"nodejs","version":"21.1.0","date":"2023-10-24","lts":false,"security":false,"v8":"11.8.172.15"},{"name":"nodejs","version":"21.2.0","date":"2023-11-14","lts":false,"security":false,"v8":"11.8.172.17"},{"name":"nodejs","version":"21.3.0","date":"2023-11-30","lts":false,"security":false,"v8":"11.8.172.17"}] \ No newline at end of file diff --git a/tools/node_modules/eslint/node_modules/node-releases/data/release-schedule/release-schedule.json b/tools/node_modules/eslint/node_modules/node-releases/data/release-schedule/release-schedule.json index 5eca422e2a5266..167314aa2ea19d 100644 --- a/tools/node_modules/eslint/node_modules/node-releases/data/release-schedule/release-schedule.json +++ b/tools/node_modules/eslint/node_modules/node-releases/data/release-schedule/release-schedule.json @@ -1 +1 @@ -{"v0.8":{"start":"2012-06-25","end":"2014-07-31"},"v0.10":{"start":"2013-03-11","end":"2016-10-31"},"v0.12":{"start":"2015-02-06","end":"2016-12-31"},"v4":{"start":"2015-09-08","lts":"2015-10-12","maintenance":"2017-04-01","end":"2018-04-30","codename":"Argon"},"v5":{"start":"2015-10-29","maintenance":"2016-04-30","end":"2016-06-30"},"v6":{"start":"2016-04-26","lts":"2016-10-18","maintenance":"2018-04-30","end":"2019-04-30","codename":"Boron"},"v7":{"start":"2016-10-25","maintenance":"2017-04-30","end":"2017-06-30"},"v8":{"start":"2017-05-30","lts":"2017-10-31","maintenance":"2019-01-01","end":"2019-12-31","codename":"Carbon"},"v9":{"start":"2017-10-01","maintenance":"2018-04-01","end":"2018-06-30"},"v10":{"start":"2018-04-24","lts":"2018-10-30","maintenance":"2020-05-19","end":"2021-04-30","codename":"Dubnium"},"v11":{"start":"2018-10-23","maintenance":"2019-04-22","end":"2019-06-01"},"v12":{"start":"2019-04-23","lts":"2019-10-21","maintenance":"2020-11-30","end":"2022-04-30","codename":"Erbium"},"v13":{"start":"2019-10-22","maintenance":"2020-04-01","end":"2020-06-01"},"v14":{"start":"2020-04-21","lts":"2020-10-27","maintenance":"2021-10-19","end":"2023-04-30","codename":"Fermium"},"v15":{"start":"2020-10-20","maintenance":"2021-04-01","end":"2021-06-01"},"v16":{"start":"2021-04-20","lts":"2021-10-26","maintenance":"2022-10-18","end":"2023-09-11","codename":"Gallium"},"v17":{"start":"2021-10-19","maintenance":"2022-04-01","end":"2022-06-01"},"v18":{"start":"2022-04-19","lts":"2022-10-25","maintenance":"2023-10-18","end":"2025-04-30","codename":"Hydrogen"},"v19":{"start":"2022-10-18","maintenance":"2023-04-01","end":"2023-06-01"},"v20":{"start":"2023-04-18","lts":"2023-10-24","maintenance":"2024-10-22","end":"2026-04-30","codename":""}} \ No newline at end of file +{"v0.8":{"start":"2012-06-25","end":"2014-07-31"},"v0.10":{"start":"2013-03-11","end":"2016-10-31"},"v0.12":{"start":"2015-02-06","end":"2016-12-31"},"v4":{"start":"2015-09-08","lts":"2015-10-12","maintenance":"2017-04-01","end":"2018-04-30","codename":"Argon"},"v5":{"start":"2015-10-29","maintenance":"2016-04-30","end":"2016-06-30"},"v6":{"start":"2016-04-26","lts":"2016-10-18","maintenance":"2018-04-30","end":"2019-04-30","codename":"Boron"},"v7":{"start":"2016-10-25","maintenance":"2017-04-30","end":"2017-06-30"},"v8":{"start":"2017-05-30","lts":"2017-10-31","maintenance":"2019-01-01","end":"2019-12-31","codename":"Carbon"},"v9":{"start":"2017-10-01","maintenance":"2018-04-01","end":"2018-06-30"},"v10":{"start":"2018-04-24","lts":"2018-10-30","maintenance":"2020-05-19","end":"2021-04-30","codename":"Dubnium"},"v11":{"start":"2018-10-23","maintenance":"2019-04-22","end":"2019-06-01"},"v12":{"start":"2019-04-23","lts":"2019-10-21","maintenance":"2020-11-30","end":"2022-04-30","codename":"Erbium"},"v13":{"start":"2019-10-22","maintenance":"2020-04-01","end":"2020-06-01"},"v14":{"start":"2020-04-21","lts":"2020-10-27","maintenance":"2021-10-19","end":"2023-04-30","codename":"Fermium"},"v15":{"start":"2020-10-20","maintenance":"2021-04-01","end":"2021-06-01"},"v16":{"start":"2021-04-20","lts":"2021-10-26","maintenance":"2022-10-18","end":"2023-09-11","codename":"Gallium"},"v17":{"start":"2021-10-19","maintenance":"2022-04-01","end":"2022-06-01"},"v18":{"start":"2022-04-19","lts":"2022-10-25","maintenance":"2023-10-18","end":"2025-04-30","codename":"Hydrogen"},"v19":{"start":"2022-10-18","maintenance":"2023-04-01","end":"2023-06-01"},"v20":{"start":"2023-04-18","lts":"2023-10-24","maintenance":"2024-10-22","end":"2026-04-30","codename":"Iron"},"v21":{"start":"2023-10-17","maintenance":"2024-04-01","end":"2024-06-01"},"v22":{"start":"2024-04-23","lts":"2024-10-29","maintenance":"2025-10-21","end":"2027-04-30","codename":""},"v23":{"start":"2024-10-15","maintenance":"2025-04-01","end":"2025-06-01"},"v24":{"start":"2025-04-22","lts":"2025-10-28","maintenance":"2026-10-20","end":"2028-04-30","codename":""}} \ No newline at end of file diff --git a/tools/node_modules/eslint/node_modules/node-releases/package.json b/tools/node_modules/eslint/node_modules/node-releases/package.json index c61ab94abdac4c..b3334e92900a73 100644 --- a/tools/node_modules/eslint/node_modules/node-releases/package.json +++ b/tools/node_modules/eslint/node_modules/node-releases/package.json @@ -1,6 +1,6 @@ { "name": "node-releases", - "version": "2.0.13", + "version": "2.0.14", "description": "Node.js releases data", "type": "module", "scripts": { diff --git a/tools/node_modules/eslint/node_modules/punycode/package.json b/tools/node_modules/eslint/node_modules/punycode/package.json index 9d0790b2a69d03..b8b76fc76c2162 100644 --- a/tools/node_modules/eslint/node_modules/punycode/package.json +++ b/tools/node_modules/eslint/node_modules/punycode/package.json @@ -1,6 +1,6 @@ { "name": "punycode", - "version": "2.3.0", + "version": "2.3.1", "description": "A robust Punycode converter that fully complies to RFC 3492 and RFC 5891, and works on nearly all JavaScript platforms.", "homepage": "https://mths.be/punycode", "main": "punycode.js", @@ -44,8 +44,8 @@ "build": "node scripts/prepublish.js" }, "devDependencies": { - "codecov": "^1.0.1", - "istanbul": "^0.4.1", + "codecov": "^3.8.3", + "nyc": "^15.1.0", "mocha": "^10.2.0" }, "jspm": { diff --git a/tools/node_modules/eslint/node_modules/punycode/punycode.es6.js b/tools/node_modules/eslint/node_modules/punycode/punycode.es6.js index 244e1bfbf307da..dadece25b35f59 100644 --- a/tools/node_modules/eslint/node_modules/punycode/punycode.es6.js +++ b/tools/node_modules/eslint/node_modules/punycode/punycode.es6.js @@ -422,7 +422,7 @@ const punycode = { * @memberOf punycode * @type String */ - 'version': '2.1.0', + 'version': '2.3.1', /** * An object of methods to convert from JavaScript's internal character * representation (UCS-2) to Unicode code points, and back. diff --git a/tools/node_modules/eslint/node_modules/punycode/punycode.js b/tools/node_modules/eslint/node_modules/punycode/punycode.js index 752b98a9fde674..a1ef251924c81e 100644 --- a/tools/node_modules/eslint/node_modules/punycode/punycode.js +++ b/tools/node_modules/eslint/node_modules/punycode/punycode.js @@ -422,7 +422,7 @@ const punycode = { * @memberOf punycode * @type String */ - 'version': '2.1.0', + 'version': '2.3.1', /** * An object of methods to convert from JavaScript's internal character * representation (UCS-2) to Unicode code points, and back. diff --git a/tools/node_modules/eslint/package.json b/tools/node_modules/eslint/package.json index 2d2c2a85883ea5..74946d0f4c3b0c 100644 --- a/tools/node_modules/eslint/package.json +++ b/tools/node_modules/eslint/package.json @@ -1,6 +1,6 @@ { "name": "eslint", - "version": "8.51.0", + "version": "8.56.0", "author": "Nicholas C. Zakas ", "description": "An AST-based pattern checker for JavaScript.", "bin": { @@ -19,6 +19,7 @@ "build:readme": "node tools/update-readme.js", "lint": "node Makefile.js lint", "lint:docs:js": "node Makefile.js lintDocsJS", + "lint:docs:rule-examples": "node Makefile.js checkRuleExamples", "lint:fix": "node Makefile.js lint -- fix", "lint:fix:docs:js": "node Makefile.js lintDocsJS -- fix", "release:generate:alpha": "node Makefile.js generatePrerelease -- alpha", @@ -42,6 +43,7 @@ "git add packages/js/src/configs/eslint-all.js" ], "docs/src/rules/*.md": [ + "node tools/check-rule-examples.js", "node tools/fetch-docs-links.js", "git add docs/src/_data/further_reading_links.json" ], @@ -62,11 +64,12 @@ "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -115,10 +118,10 @@ "eslint": "file:.", "eslint-config-eslint": "file:packages/eslint-config-eslint", "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-eslint-plugin": "^5.1.0", + "eslint-plugin-eslint-plugin": "^5.2.1", "eslint-plugin-internal-rules": "file:tools/internal-rules", - "eslint-plugin-n": "^16.0.0", - "eslint-plugin-unicorn": "^42.0.0", + "eslint-plugin-n": "^16.4.0", + "eslint-plugin-unicorn": "^49.0.0", "eslint-release": "^3.2.0", "eslump": "^3.0.0", "esprima": "^4.0.1", @@ -129,8 +132,10 @@ "gray-matter": "^4.0.3", "lint-staged": "^11.0.0", "load-perf": "^0.2.0", - "markdownlint": "^0.25.1", - "markdownlint-cli": "^0.31.1", + "markdown-it": "^12.2.0", + "markdown-it-container": "^3.0.0", + "markdownlint": "^0.32.0", + "markdownlint-cli": "^0.37.0", "marked": "^4.0.8", "memfs": "^3.0.1", "metascraper": "^5.25.7", @@ -146,13 +151,13 @@ "pirates": "^4.0.5", "progress": "^2.0.3", "proxyquire": "^2.0.1", - "recast": "^0.20.4", - "regenerator-runtime": "^0.13.2", + "recast": "^0.23.0", + "regenerator-runtime": "^0.14.0", "rollup-plugin-node-polyfills": "^0.2.1", "semver": "^7.5.3", "shelljs": "^0.8.2", "sinon": "^11.0.0", - "vite-plugin-commonjs": "^0.8.2", + "vite-plugin-commonjs": "^0.10.0", "webdriverio": "^8.14.6", "webpack": "^5.23.0", "webpack-cli": "^4.5.0", diff --git a/tools/osx-gon-config.json.tmpl b/tools/osx-gon-config.json.tmpl deleted file mode 100644 index 3ea16465fc1de5..00000000000000 --- a/tools/osx-gon-config.json.tmpl +++ /dev/null @@ -1,12 +0,0 @@ -{ - "notarize": [{ - "path": "node-{{pkgid}}.pkg", - "bundle_id": "org.nodejs.pkg.{{pkgid}}", - "staple": true - }], - - "apple_id": { - "username": "{{appleid}}", - "password": "@env:NOTARIZATION_PASSWORD" - } -} diff --git a/tools/osx-notarize.sh b/tools/osx-notarize.sh index beea7041793cdf..d860074bf7d64e 100755 --- a/tools/osx-notarize.sh +++ b/tools/osx-notarize.sh @@ -1,15 +1,8 @@ #!/bin/sh # Notarize a generated node-.pkg file as an Apple requirement for installation on macOS Catalina and later, as validated by Gatekeeper. -# Uses gon (Xcode version < 13.0) or notarytool (Xcode >= 13.0). +# Uses notarytool and requires Xcode >= 13.0. -version() { - echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }' || echo "0" -} - -xcode_version=$(xcodebuild -version | awk '/Xcode/ {print $2}') -xcode_version_result=$(version "$xcode_version") -xcode_version_threshold=$(version "13.0") pkgid="$1" if [ -z "$pkgid" ]; then @@ -33,55 +26,34 @@ if [ -z "$NOTARIZATION_TEAM_ID" ]; then exit 0 fi -# TODO(@ulisesGascon): remove support for gon -# when https://github.com/nodejs/build/issues/3385#issuecomment-1729281269 is ready -if [ "$xcode_version_result" -lt "$xcode_version_threshold" ]; then - echo "Notarization process is done with gon." - set -x - - gon_version="0.2.2" - gon_exe="${HOME}/.gon/gon_${gon_version}" +echo "Notarization process is done with Notarytool." - mkdir -p "${HOME}/.gon/" - - if [ ! -f "${gon_exe}" ]; then - curl -sL "https://github.com/mitchellh/gon/releases/download/v${gon_version}/gon_${gon_version}_macos.zip" -o "${gon_exe}.zip" - (cd "${HOME}/.gon/" && rm -f gon && unzip "${gon_exe}.zip" && mv gon "${gon_exe}") - fi +if ! command -v xcrun notarytool > /dev/null +then + echo "Notarytool is not present in the system. Notarization has failed." + exit 1 +fi - sed -e "s/{{appleid}}/${NOTARIZATION_ID}/" -e "s/{{pkgid}}/${pkgid}/" tools/osx-gon-config.json.tmpl \ - > gon-config.json +echo "Submitting node-$pkgid.pkg for notarization..." - "${gon_exe}" -log-level=info gon-config.json +xcrun notarytool submit \ + --keychain-profile "NODE_RELEASE_PROFILE" \ + --wait \ + "node-$pkgid.pkg" +if [ $? -eq 0 ]; then + echo "Notarization node-$pkgid.pkg submitted successfully." else - echo "Notarization process is done with Notarytool." - - if ! command -v xcrun notarytool > /dev/null - then - echo "Notarytool is not present in the system. Notarization has failed." - exit 1 - fi - - # Submit the package for notarization - # TODO(@ulisesGascon): refactor to use --keychain-profile - # when https://github.com/nodejs/build/issues/3385#issuecomment-1729281269 is ready - notarization_output=$( - xcrun notarytool submit \ - --apple-id "$NOTARIZATION_ID" \ - --password "$NOTARIZATION_PASSWORD" \ - --team-id "$NOTARIZATION_TEAM_ID" \ - --wait \ - "node-$pkgid.pkg" 2>&1 - ) + echo "Notarization node-$pkgid.pkg failed." + exit 1 +fi - if [ $? -eq 0 ]; then - # Extract the operation ID from the output - operation_id=$(echo "$notarization_output" | awk '/RequestUUID/ {print $NF}') - echo "Notarization submitted. Operation ID: $operation_id" - exit 0 - else - echo "Notarization failed. Error: $notarization_output" - exit 1 - fi +if ! xcrun spctl --assess --type install --context context:primary-signature --ignore-cache --verbose=2 "node-$pkgid.pkg"; then + echo "error: Signature will not be accepted by Gatekeeper!" 1>&2 + exit 1 +else + echo "Verification was successful." fi + +xcrun stapler staple "node-$pkgid.pkg" +echo "Stapler was successful." \ No newline at end of file diff --git a/tools/search_files.py b/tools/search_files.py new file mode 100755 index 00000000000000..65d0e1be42f0a8 --- /dev/null +++ b/tools/search_files.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python3 +# Copyright 2008 the V8 project authors. +# Copyright 2023 Microsoft Inc. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import os +import sys + +from utils import SearchFiles + + +if __name__ == '__main__': + try: + files = SearchFiles(*sys.argv[2:]) + files = [ os.path.relpath(x, sys.argv[1]) for x in files ] + print('\n'.join(files)) + except Exception as e: + print(str(e)) + sys.exit(1) diff --git a/tools/sign.bat b/tools/sign.bat index fae06583b4923f..f4d18d9f7a8a0d 100644 --- a/tools/sign.bat +++ b/tools/sign.bat @@ -1,15 +1,12 @@ @echo off -set timeservers=(http://timestamp.globalsign.com/scripts/timestamp.dll http://timestamp.comodoca.com/authenticode http://timestamp.verisign.com/scripts/timestamp.dll http://tsa.starfieldtech.com) - -for %%s in %timeservers% do ( - signtool sign /a /d "Node.js" /du "https://nodejs.org" /fd SHA256 /t %%s %1 - if not ERRORLEVEL 1 ( - echo Successfully signed %1 using timeserver %%s - exit /b 0 - ) - echo Signing %1 failed using %%s +@REM From December 2023, new certificates use DigiCert cloud HSM service for EV signing. +@REM They provide a client side app smctl.exe for managing certificates and signing process. +@REM Release CI machines are configured to have it in the PATH so this can be used safely. +smctl sign -k key_nodejs -i %1 +if not ERRORLEVEL 1 ( + echo Successfully signed %1 using smctl + exit /b 0 ) - -echo Could not sign %1 using any available timeserver -exit /b 1 +echo Could not sign %1 using smctl +exit /b 1 \ No newline at end of file diff --git a/tools/snapshot/node_mksnapshot.cc b/tools/snapshot/node_mksnapshot.cc index 841a8ca743bcaa..b758b804017481 100644 --- a/tools/snapshot/node_mksnapshot.cc +++ b/tools/snapshot/node_mksnapshot.cc @@ -70,9 +70,9 @@ int BuildSnapshot(int argc, char* argv[]) { CHECK_EQ(result->exit_code(), 0); std::string out_path; - std::optional main_script_path = std::nullopt; + std::optional builder_script_path = std::nullopt; if (node::per_process::cli_options->per_isolate->build_snapshot) { - main_script_path = result->args()[1]; + builder_script_path = result->args()[1]; out_path = result->args()[2]; } else { out_path = result->args()[1]; @@ -84,11 +84,20 @@ int BuildSnapshot(int argc, char* argv[]) { bool use_array_literals = false; #endif + node::SnapshotConfig snapshot_config; + snapshot_config.builder_script_path = builder_script_path; + +#ifdef NODE_USE_NODE_CODE_CACHE + snapshot_config.flags = node::SnapshotFlags::kDefault; +#else + snapshot_config.flags = node::SnapshotFlags::kWithoutCodeCache; +#endif + node::ExitCode exit_code = node::SnapshotBuilder::GenerateAsSource(out_path.c_str(), result->args(), result->exec_args(), - main_script_path, + snapshot_config, use_array_literals); node::TearDownOncePerProcess(); diff --git a/tools/test.py b/tools/test.py index d35b45a669bccc..5a2bcb3b6d92ca 100755 --- a/tools/test.py +++ b/tools/test.py @@ -915,6 +915,7 @@ def GetTestStatus(self, context, sections, defs): TIMEOUT_SCALEFACTOR = { 'arm' : { 'debug' : 8, 'release' : 3 }, # The ARM buildbots are slow. 'riscv64' : { 'debug' : 8, 'release' : 3 }, # The riscv devices are slow. + 'loong64' : { 'debug' : 4, 'release' : 1 }, 'ia32' : { 'debug' : 4, 'release' : 1 }, 'ppc' : { 'debug' : 4, 'release' : 1 }, 's390' : { 'debug' : 4, 'release' : 1 } } diff --git a/tools/utils.py b/tools/utils.py index 32a3b3dbcb824c..f0172b3c825a05 100644 --- a/tools/utils.py +++ b/tools/utils.py @@ -99,6 +99,8 @@ def GuessArchitecture(): return 's390' elif id == 'riscv64': return 'riscv64' + elif id == 'loong64': + return 'loong64' else: id = platform.processor() if id == 'powerpc': diff --git a/tools/v8_gypfiles/features.gypi b/tools/v8_gypfiles/features.gypi index aa946a2774177f..be1dfe407a290d 100644 --- a/tools/v8_gypfiles/features.gypi +++ b/tools/v8_gypfiles/features.gypi @@ -155,6 +155,7 @@ # Enable pointer compression (sets -dV8_COMPRESS_POINTERS). 'v8_enable_pointer_compression%': 0, + 'v8_enable_pointer_compression_shared_cage%': 0, 'v8_enable_31bit_smis_on_64bit_arch%': 0, # Sets -dV8_SHORT_BUILTIN_CALLS @@ -197,6 +198,15 @@ # currently implemented. 'v8_use_perfetto%': 0, + # Enable map packing & unpacking (sets -dV8_MAP_PACKING). + 'v8_enable_map_packing%': 0, + + # Scan the call stack conservatively during garbage collection. + 'v8_enable_conservative_stack_scanning%': 0, + + # Use direct pointers in local handles. + 'v8_enable_direct_local%': 0, + # Controls the threshold for on-heap/off-heap Typed Arrays. 'v8_typed_array_max_size_in_heap%': 64, @@ -270,7 +280,7 @@ # Enable global allocation site tracking. 'v8_allocation_site_tracking%': 1, - 'v8_scriptormodule_legacy_lifetime%': 1, + 'v8_scriptormodule_legacy_lifetime%': 0, # Change code emission and runtime features to be CET shadow-stack compliant # (incomplete and experimental). @@ -345,10 +355,13 @@ 'defines': ['ENABLE_VTUNE_JIT_INTERFACE',], }], ['v8_enable_pointer_compression==1', { - 'defines': [ - 'V8_COMPRESS_POINTERS', - 'V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE', - ], + 'defines': ['V8_COMPRESS_POINTERS'], + }], + ['v8_enable_pointer_compression_shared_cage==1', { + 'defines': ['V8_COMPRESS_POINTERS_IN_SHARED_CAGE'], + }], + ['v8_enable_pointer_compression==1 and v8_enable_pointer_compression_shared_cage==0', { + 'defines': ['V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE'], }], ['v8_enable_pointer_compression==1 or v8_enable_31bit_smis_on_64bit_arch==1', { 'defines': ['V8_31BIT_SMIS_ON_64BIT_ARCH',], @@ -392,13 +405,9 @@ }], ['v8_deprecation_warnings==1', { 'defines': ['V8_DEPRECATION_WARNINGS',], - },{ - 'defines!': ['V8_DEPRECATION_WARNINGS',], }], ['v8_imminent_deprecation_warnings==1', { 'defines': ['V8_IMMINENT_DEPRECATION_WARNINGS',], - },{ - 'defines!': ['V8_IMMINENT_DEPRECATION_WARNINGS',], }], ['v8_enable_i18n_support==1', { 'defines': ['V8_INTL_SUPPORT',], @@ -443,9 +452,21 @@ ['v8_use_perfetto==1', { 'defines': ['V8_USE_PERFETTO',], }], + ['v8_enable_map_packing==1', { + 'defines': ['V8_MAP_PACKING',], + }], ['v8_win64_unwinding_info==1', { 'defines': ['V8_WIN64_UNWINDING_INFO',], }], + ['tsan==1', { + 'defines': ['V8_IS_TSAN',], + }], + ['v8_enable_conservative_stack_scanning==1', { + 'defines': ['V8_ENABLE_CONSERVATIVE_STACK_SCANNING',], + }], + ['v8_enable_direct_local==1', { + 'defines': ['V8_ENABLE_DIRECT_LOCAL',], + }], ['v8_enable_regexp_interpreter_threaded_dispatch==1', { 'defines': ['V8_ENABLE_REGEXP_INTERPRETER_THREADED_DISPATCH',], }], diff --git a/tools/v8_gypfiles/toolchain.gypi b/tools/v8_gypfiles/toolchain.gypi index bcecdb21aeb368..cc97adfbc30974 100644 --- a/tools/v8_gypfiles/toolchain.gypi +++ b/tools/v8_gypfiles/toolchain.gypi @@ -41,7 +41,7 @@ 'has_valgrind%': 0, 'coverage%': 0, 'v8_target_arch%': '<(target_arch)', - 'v8_host_byteorder%': '; + function chown(path: string, uid: number, gid: number): void; function close(fd: number, req: FSReqCallback): void; function close(fd: number, req: undefined, ctx: FSSyncContext): void; @@ -80,7 +81,7 @@ declare namespace InternalFSBinding { function fchmod(fd: number, mode: number, usePromises: typeof kUsePromises): Promise; function fchown(fd: number, uid: number, gid: number, req: FSReqCallback): void; - function fchown(fd: number, uid: number, gid: number, req: undefined, ctx: FSSyncContext): void; + function fchown(fd: number, uid: number, gid: number): void; function fchown(fd: number, uid: number, gid: number, usePromises: typeof kUsePromises): Promise; function fdatasync(fd: number, req: FSReqCallback): void; @@ -91,16 +92,16 @@ declare namespace InternalFSBinding { function fstat(fd: number, useBigint: boolean, req: FSReqCallback): void; function fstat(fd: number, useBigint: true, req: FSReqCallback): void; function fstat(fd: number, useBigint: false, req: FSReqCallback): void; - function fstat(fd: number, useBigint: boolean, req: undefined, ctx: FSSyncContext): Float64Array | BigUint64Array; - function fstat(fd: number, useBigint: true, req: undefined, ctx: FSSyncContext): BigUint64Array; - function fstat(fd: number, useBigint: false, req: undefined, ctx: FSSyncContext): Float64Array; + function fstat(fd: number, useBigint: boolean, req: undefined, shouldNotThrow: boolean): Float64Array | BigUint64Array; + function fstat(fd: number, useBigint: true, req: undefined, shouldNotThrow: boolean): BigUint64Array; + function fstat(fd: number, useBigint: false, req: undefined, shouldNotThrow: boolean): Float64Array; function fstat(fd: number, useBigint: boolean, usePromises: typeof kUsePromises): Promise; function fstat(fd: number, useBigint: true, usePromises: typeof kUsePromises): Promise; function fstat(fd: number, useBigint: false, usePromises: typeof kUsePromises): Promise; function fsync(fd: number, req: FSReqCallback): void; - function fsync(fd: number, req: undefined, ctx: FSSyncContext): void; function fsync(fd: number, usePromises: typeof kUsePromises): Promise; + function fsync(fd: number): void; function ftruncate(fd: number, len: number, req: FSReqCallback): void; function ftruncate(fd: number, len: number, req: undefined, ctx: FSSyncContext): void; @@ -110,23 +111,24 @@ declare namespace InternalFSBinding { function futimes(fd: number, atime: number, mtime: number): void; function futimes(fd: number, atime: number, mtime: number, usePromises: typeof kUsePromises): Promise; - function internalModuleReadJSON(path: string): [] | [string, boolean]; function internalModuleStat(path: string): number; function lchown(path: string, uid: number, gid: number, req: FSReqCallback): void; function lchown(path: string, uid: number, gid: number, req: undefined, ctx: FSSyncContext): void; function lchown(path: string, uid: number, gid: number, usePromises: typeof kUsePromises): Promise; + function lchown(path: string, uid: number, gid: number): void; function link(existingPath: string, newPath: string, req: FSReqCallback): void; function link(existingPath: string, newPath: string, req: undefined, ctx: FSSyncContext): void; function link(existingPath: string, newPath: string, usePromises: typeof kUsePromises): Promise; + function link(existingPath: string, newPath: string): void; function lstat(path: StringOrBuffer, useBigint: boolean, req: FSReqCallback): void; function lstat(path: StringOrBuffer, useBigint: true, req: FSReqCallback): void; function lstat(path: StringOrBuffer, useBigint: false, req: FSReqCallback): void; - function lstat(path: StringOrBuffer, useBigint: boolean, req: undefined, ctx: FSSyncContext): Float64Array | BigUint64Array; - function lstat(path: StringOrBuffer, useBigint: true, req: undefined, ctx: FSSyncContext): BigUint64Array; - function lstat(path: StringOrBuffer, useBigint: false, req: undefined, ctx: FSSyncContext): Float64Array; + function lstat(path: StringOrBuffer, useBigint: boolean, req: undefined, throwIfNoEntry: boolean): Float64Array | BigUint64Array; + function lstat(path: StringOrBuffer, useBigint: true, req: undefined, throwIfNoEntry: boolean): BigUint64Array; + function lstat(path: StringOrBuffer, useBigint: false, req: undefined, throwIfNoEntry: boolean): Float64Array; function lstat(path: StringOrBuffer, useBigint: boolean, usePromises: typeof kUsePromises): Promise; function lstat(path: StringOrBuffer, useBigint: true, usePromises: typeof kUsePromises): Promise; function lstat(path: StringOrBuffer, useBigint: false, usePromises: typeof kUsePromises): Promise; @@ -138,13 +140,14 @@ declare namespace InternalFSBinding { function mkdtemp(prefix: string, encoding: unknown, req: FSReqCallback): void; function mkdtemp(prefix: string, encoding: unknown, req: undefined, ctx: FSSyncContext): string; function mkdtemp(prefix: string, encoding: unknown, usePromises: typeof kUsePromises): Promise; + function mkdtemp(prefix: string, encoding: unknown): string; function mkdir(path: string, mode: number, recursive: boolean, req: FSReqCallback): void; function mkdir(path: string, mode: number, recursive: true, req: FSReqCallback): void; function mkdir(path: string, mode: number, recursive: false, req: FSReqCallback): void; - function mkdir(path: string, mode: number, recursive: boolean, req: undefined, ctx: FSSyncContext): void | string; - function mkdir(path: string, mode: number, recursive: true, req: undefined, ctx: FSSyncContext): string; - function mkdir(path: string, mode: number, recursive: false, req: undefined, ctx: FSSyncContext): void; + function mkdir(path: string, mode: number, recursive: boolean): void | string; + function mkdir(path: string, mode: number, recursive: true): string; + function mkdir(path: string, mode: number, recursive: false): void; function mkdir(path: string, mode: number, recursive: boolean, usePromises: typeof kUsePromises): Promise; function mkdir(path: string, mode: number, recursive: true, usePromises: typeof kUsePromises): Promise; function mkdir(path: string, mode: number, recursive: false, usePromises: typeof kUsePromises): Promise; @@ -155,8 +158,8 @@ declare namespace InternalFSBinding { function openFileHandle(path: StringOrBuffer, flags: number, mode: number, usePromises: typeof kUsePromises): Promise; function read(fd: number, buffer: ArrayBufferView, offset: number, length: number, position: number, req: FSReqCallback): void; - function read(fd: number, buffer: ArrayBufferView, offset: number, length: number, position: number, req: undefined, ctx: FSSyncContext): number; function read(fd: number, buffer: ArrayBufferView, offset: number, length: number, position: number, usePromises: typeof kUsePromises): Promise; + function read(fd: number, buffer: ArrayBufferView, offset: number, length: number, position: number): number; function readBuffers(fd: number, buffers: ArrayBufferView[], position: number, req: FSReqCallback): void; function readBuffers(fd: number, buffers: ArrayBufferView[], position: number, req: undefined, ctx: FSSyncContext): number; @@ -175,17 +178,20 @@ declare namespace InternalFSBinding { function readlink(path: StringOrBuffer, encoding: unknown, req: FSReqCallback): void; function readlink(path: StringOrBuffer, encoding: unknown, req: undefined, ctx: FSSyncContext): string | Buffer; function readlink(path: StringOrBuffer, encoding: unknown, usePromises: typeof kUsePromises): Promise; + function readlink(path: StringOrBuffer, encoding: unknown): StringOrBuffer; function realpath(path: StringOrBuffer, encoding: unknown, req: FSReqCallback): void; function realpath(path: StringOrBuffer, encoding: unknown, req: undefined, ctx: FSSyncContext): string | Buffer; function realpath(path: StringOrBuffer, encoding: unknown, usePromises: typeof kUsePromises): Promise; + function realpath(path: StringOrBuffer, encoding: unknown): StringOrBuffer; function rename(oldPath: string, newPath: string, req: FSReqCallback): void; function rename(oldPath: string, newPath: string, req: undefined, ctx: FSSyncContext): void; function rename(oldPath: string, newPath: string, usePromises: typeof kUsePromises): Promise; + function rename(oldPath: string, newPath: string): void; function rmdir(path: string, req: FSReqCallback): void; - function rmdir(path: string, req: undefined, ctx: FSSyncContext): void; + function rmdir(path: string): void; function rmdir(path: string, usePromises: typeof kUsePromises): Promise; function stat(path: StringOrBuffer, useBigint: boolean, req: FSReqCallback): void; @@ -201,6 +207,7 @@ declare namespace InternalFSBinding { function symlink(target: StringOrBuffer, path: StringOrBuffer, type: number, req: FSReqCallback): void; function symlink(target: StringOrBuffer, path: StringOrBuffer, type: number, req: undefined, ctx: FSSyncContext): void; function symlink(target: StringOrBuffer, path: StringOrBuffer, type: number, usePromises: typeof kUsePromises): Promise; + function symlink(target: StringOrBuffer, path: StringOrBuffer, type: number): void; function unlink(path: string, req: FSReqCallback): void; function unlink(path: string): void; @@ -223,6 +230,9 @@ declare namespace InternalFSBinding { function writeString(fd: number, value: string, pos: unknown, encoding: unknown, usePromises: typeof kUsePromises): Promise; function getFormatOfExtensionlessFile(url: string): ConstantsBinding['fs']; + + function writeFileUtf8(path: string, data: string, flag: number, mode: number): void; + function writeFileUtf8(fd: number, data: string, flag: number, mode: number): void; } export interface FsBinding { @@ -250,7 +260,6 @@ export interface FsBinding { fsync: typeof InternalFSBinding.fsync; ftruncate: typeof InternalFSBinding.ftruncate; futimes: typeof InternalFSBinding.futimes; - internalModuleReadJSON: typeof InternalFSBinding.internalModuleReadJSON; internalModuleStat: typeof InternalFSBinding.internalModuleStat; lchown: typeof InternalFSBinding.lchown; link: typeof InternalFSBinding.link; diff --git a/typings/internalBinding/modules.d.ts b/typings/internalBinding/modules.d.ts new file mode 100644 index 00000000000000..ddbb3d02704908 --- /dev/null +++ b/typings/internalBinding/modules.d.ts @@ -0,0 +1,29 @@ +export type PackageType = 'commonjs' | 'module' | 'none' +export type PackageConfig = { + pjsonPath: string + exists: boolean + name?: string + main?: any + type: PackageType + exports?: string | string[] | Record + imports?: string | string[] | Record +} +export type SerializedPackageConfig = [ + PackageConfig['name'], + PackageConfig['main'], + PackageConfig['type'], + string | undefined, // exports + string | undefined, // imports + string | undefined, // raw json available for experimental policy +] + +export interface ModulesBinding { + readPackageJSON(path: string): SerializedPackageConfig | undefined; + getNearestParentPackageJSON(path: string): PackageConfig | undefined + getNearestParentPackageJSONType(path: string): [ + PackageConfig['type'], + string, // package.json path + string, // raw content + ] + getPackageScopeConfig(path: string): SerializedPackageConfig | undefined +} diff --git a/typings/internalBinding/quic.d.ts b/typings/internalBinding/quic.d.ts new file mode 100644 index 00000000000000..d95c34c9da041a --- /dev/null +++ b/typings/internalBinding/quic.d.ts @@ -0,0 +1,100 @@ +interface QuicCallbacks { + onEndpointClose: (context: number, status: number) => void; + onSessionNew: (session: Session) => void; + onSessionClose: (type: number, code: bigint, reason?: string) => void; + onSessionDatagram: (datagram: Uint8Array, early: boolean) => void;); + onSessionDatagramStatus: (id: bigint, status: string) => void; + onSessionHandshake: (sni: string, + alpn: string, + cipher: string, + cipherVersion: string, + validationReason?: string, + validationCode?: string) => void; + onSessionPathValidation: (result: string, + local: SocketAddress, + remote: SocketAddress, + preferred: boolean) => void; + onSessionTicket: (ticket: ArrayBuffer) => void; + onSessionVersionNegotiation: (version: number, + versions: number[], + supports: number[]) => void; + onStreamCreated: (stream: Stream) => void; + onStreamBlocked: () => void; + onStreamClose: (error: [number,bigint,string]) => void; + onStreamReset: (error: [number,bigint,string]) => void; + onStreamHeaders: (headers: string[], kind: number) => void; + onStreamTrailers: () => void; +} + +interface EndpointOptions { + address?: SocketAddress; + retryTokenExpiration?: number|bigint; + tokenExpiration?: number|bigint; + maxConnectionsPerHost?: number|bigint; + maxConnectionsTotal?: number|bigint; + maxStatelessResetsPerHost?: number|bigint; + addressLRUSize?: number|bigint; + maxRetries?: number|bigint; + maxPayloadSize?: number|bigint; + unacknowledgedPacketThreshold?: number|bigint; + validateAddress?: boolean; + disableStatelessReset?: boolean; + ipv6Only?: boolean; + udpReceiveBufferSize?: number; + udpSendBufferSize?: number; + udpTTL?: number; + resetTokenSecret?: ArrayBufferView; + tokenSecret?: ArrayBufferView; + cc?: 'reno'|'cubic'|'pcc'|'bbr'| 0 | 2 | 3 | 4; +} + +interface SessionOptions {} +interface SocketAddress {} + +interface Session {} +interface Stream {} + +interface Endpoint { + listen(options: SessionOptions): void; + connect(address: SocketAddress, options: SessionOptions): Session; + closeGracefully(): void; + markBusy(on?: boolean): void; + ref(on?: boolean): void; + address(): SocketAddress|void; + readonly state: ArrayBuffer; + readonly stats: ArrayBuffer; +} + +export interface QuicBinding { + setCallbacks(callbacks: QuicCallbacks): void; + flushPacketFreeList(): void; + + readonly IDX_STATS_ENDPOINT_CREATED_AT: number; + readonly IDX_STATS_ENDPOINT_DESTROYED_AT: number; + readonly IDX_STATS_ENDPOINT_BYTES_RECEIVED: number; + readonly IDX_STATS_ENDPOINT_BYTES_SENT: number; + readonly IDX_STATS_ENDPOINT_PACKETS_RECEIVED: number; + readonly IDX_STATS_ENDPOINT_PACKETS_SENT: number; + readonly IDX_STATS_ENDPOINT_SERVER_SESSIONS: number; + readonly IDX_STATS_ENDPOINT_CLIENT_SESSIONS: number; + readonly IDX_STATS_ENDPOINT_SERVER_BUSY_COUNT: number; + readonly IDX_STATS_ENDPOINT_RETRY_COUNT: number; + readonly IDX_STATS_ENDPOINT_VERSION_NEGOTIATION_COUNT: number; + readonly IDX_STATS_ENDPOINT_STATELESS_RESET_COUNT: number; + readonly IDX_STATS_ENDPOINT_IMMEDIATE_CLOSE_COUNT: number; + readonly IDX_STATS_ENDPOINT_COUNT: number; + readonly IDX_STATE_ENDPOINT_BOUND: number; + readonly IDX_STATE_ENDPOINT_BOUND_SIZE: number; + readonly IDX_STATE_ENDPOINT_RECEIVING: number; + readonly IDX_STATE_ENDPOINT_RECEIVING_SIZE: number; + readonly IDX_STATE_ENDPOINT_LISTENING: number; + readonly IDX_STATE_ENDPOINT_LISTENING_SIZE: number; + readonly IDX_STATE_ENDPOINT_CLOSING: number; + readonly IDX_STATE_ENDPOINT_CLOSING_SIZE: number; + readonly IDX_STATE_ENDPOINT_WAITING_FOR_CALLBACKS: number; + readonly IDX_STATE_ENDPOINT_WAITING_FOR_CALLBACKS_SIZE: number; + readonly IDX_STATE_ENDPOINT_BUSY: number; + readonly IDX_STATE_ENDPOINT_BUSY_SIZE: number; + readonly IDX_STATE_ENDPOINT_PENDING_CALLBACKS: number; + readonly IDX_STATE_ENDPOINT_PENDING_CALLBACKS_SIZE: number; +} diff --git a/typings/internalBinding/util.d.ts b/typings/internalBinding/util.d.ts index 1ac9d3a39bbb31..9034b892b26549 100644 --- a/typings/internalBinding/util.d.ts +++ b/typings/internalBinding/util.d.ts @@ -43,5 +43,4 @@ export interface UtilBinding { shouldAbortOnUncaughtToggle: [shouldAbort: 0 | 1]; WeakReference: typeof InternalUtilBinding.WeakReference; guessHandleType(fd: number): 'TCP' | 'TTY' | 'UDP' | 'FILE' | 'PIPE' | 'UNKNOWN'; - toUSVString(str: string, start: number): string; } diff --git a/typings/primordials.d.ts b/typings/primordials.d.ts index ffce093458f2b5..ce6ca86f3e633d 100644 --- a/typings/primordials.d.ts +++ b/typings/primordials.d.ts @@ -420,6 +420,7 @@ declare namespace primordials { export const StringPrototypeToLocaleUpperCase: UncurryThis export const StringPrototypeToLowerCase: UncurryThis export const StringPrototypeToUpperCase: UncurryThis + export const StringPrototypeToWellFormed: UncurryThis export const StringPrototypeValueOf: UncurryThis export const StringPrototypeReplaceAll: UncurryThis export import Symbol = globalThis.Symbol; diff --git a/unofficial.gni b/unofficial.gni new file mode 100644 index 00000000000000..5199d84fa46268 --- /dev/null +++ b/unofficial.gni @@ -0,0 +1,348 @@ +# This file is used by GN for building, which is NOT the build system used for +# building official binaries. +# Please take a look at node.gyp if you are making changes to build system. + +import("node.gni") +import("$node_v8_path/gni/snapshot_toolchain.gni") +import("$node_v8_path/gni/v8.gni") + +# The actual configurations are put inside a template in unofficial.gni to +# prevent accidental edits from contributors. +template("node_gn_build") { + config("node_features") { + defines = [] + if (is_component_build) { + defines += [ + "USING_UV_SHARED", + "USING_V8_SHARED", + ] + } + if (node_use_openssl) { + defines += [ "HAVE_OPENSSL=1" ] + } else { + defines += [ "HAVE_OPENSSL=0" ] + } + if (node_use_v8_platform) { + defines += [ "NODE_USE_V8_PLATFORM=1" ] + } else { + defines += [ "NODE_USE_V8_PLATFORM=0" ] + } + if (node_enable_inspector) { + defines += [ "HAVE_INSPECTOR=1" ] + } else { + defines += [ "HAVE_INSPECTOR=0" ] + } + if (node_use_node_code_cache) { + defines += [ "NODE_USE_NODE_CODE_CACHE=1"] + } + if (v8_enable_i18n_support) { + defines += [ "NODE_HAVE_I18N_SUPPORT=1" ] + } else { + defines += [ "NODE_HAVE_I18N_SUPPORT=0" ] + } + } + + config("node_external_config") { + include_dirs = [ + target_gen_dir, + "src", + ] + defines = [ + "NODE_WANT_INTERNALS=1", + "NODE_EMBEDDER_MODULE_VERSION=$node_module_version", + ] + configs = [ + ":node_features", + "$node_v8_path:external_config", + ] + } + + config("node_internal_config") { + visibility = [ + ":*", + "src/inspector:*", + ] + configs = [ ":node_external_config" ] + libs = [] + cflags = [ "-Wno-microsoft-include" ] + cflags_cc = [ + "-Wno-deprecated-declarations", + "-Wno-extra-semi", + "-Wno-implicit-fallthrough", + "-Wno-macro-redefined", + "-Wno-return-type", + "-Wno-shadow", + "-Wno-sometimes-uninitialized", + "-Wno-string-plus-int", + "-Wno-string-conversion", + "-Wno-unreachable-code", + "-Wno-unreachable-code-break", + "-Wno-unreachable-code-return", + "-Wno-unused-label", + "-Wno-unused-private-field", + "-Wno-unused-variable", + "-Wno-unused-function", + ] + + if (target_cpu == "x86") { + node_arch = "ia32" + } else { + node_arch = target_cpu + } + if (target_os == "win") { + node_platform = "win32" + } else if (target_os == "mac") { + node_platform = "darwin" + } else { + node_platform = target_os + } + defines = [ + "NODE_ARCH=\"$node_arch\"", + "NODE_PLATFORM=\"$node_platform\"", + "NODE_REPORT" + ] + + if (is_win) { + defines += [ + "NOMINMAX", + "_UNICODE=1", + ] + } else { + defines += [ "__POSIX__" ] + } + if (node_tag != "") { + defines += [ "NODE_TAG=\"$node_tag\"" ] + } + if (node_v8_options != "") { + defines += [ "NODE_V8_OPTIONS=\"$node_v8_options\"" ] + } + if (node_release_urlbase != "") { + defines += [ "NODE_RELEASE_URLBASE=\"$node_release_urlbase\"" ] + } + if (node_use_openssl) { + defines += [ + "NODE_OPENSSL_SYSTEM_CERT_PATH=\"$node_openssl_system_ca_path\"", + ] + } + } + + gypi_values = exec_script("./tools/gypi_to_gn.py", + [ rebase_path("node.gyp"), + "--replace=<@(node_builtin_shareable_builtins)=" ], + "scope", + [ "node.gyp" ]) + + source_set("libnode") { + configs += [ ":node_internal_config" ] + public_configs = [ + ":node_external_config", + "deps/googletest:googletest_config", + ] + public_deps = [ + "deps/ada", + "deps/uv", + "deps/base64", + "$node_v8_path", + ] + deps = [ + ":run_node_js2c", + "deps/brotli", + "deps/cares", + "deps/histogram", + "deps/llhttp", + "deps/nghttp2", + "deps/ngtcp2", + "deps/postject", + "deps/simdjson", + "deps/simdutf", + "deps/uvwasi", + "//third_party/zlib", + "$node_v8_path:v8_libplatform", + ] + + sources = [ + "$target_gen_dir/node_javascript.cc", + ] + gypi_values.node_sources + + if (is_win) { + libs = [ "psapi.lib" ] + } + if (is_mac) { + frameworks = [ "CoreFoundation.framework" ] + } + + if (v8_enable_i18n_support) { + deps += [ "//third_party/icu" ] + } + if (node_use_openssl) { + public_deps += [ "deps/openssl" ] + sources += gypi_values.node_crypto_sources + } + if (node_enable_inspector) { + deps += [ + "src/inspector:node_protocol_generated_sources", + "src/inspector:v8_inspector_compress_protocol_json", + ] + include_dirs = [ + "$target_gen_dir/src", + "$target_gen_dir/src/inspector", + ] + node_inspector = exec_script( + "./tools/gypi_to_gn.py", + [ rebase_path("src/inspector/node_inspector.gypi"), + "--replace=<(SHARED_INTERMEDIATE_DIR)=$target_gen_dir" ], + "scope", + [ "src/inspector/node_inspector.gypi" ]) + sources += node_inspector.node_inspector_sources + + node_inspector.node_inspector_generated_sources + } + } + + executable(target_name) { + forward_variables_from(invoker, "*") + + sources = [ "src/node_main.cc" ] + deps = [ ":libnode" ] + if (node_use_node_snapshot) { + sources += [ "$target_gen_dir/node_snapshot.cc" ] + deps += [ ":run_node_mksnapshot" ] + if (is_clang || !is_win) { + cflags_cc = [ + "-Wno-c++11-narrowing", + "-Wno-shadow", + ] + } + } else { + sources += [ "src/node_snapshot_stub.cc" ] + } + output_name = "node" + } + + if (node_use_node_snapshot) { + if (current_toolchain == v8_snapshot_toolchain) { + executable("node_mksnapshot") { + configs += [ ":node_internal_config" ] + sources = [ + "src/node_snapshot_stub.cc", + "tools/snapshot/node_mksnapshot.cc", + ] + deps = [ ":libnode" ] + } + } + + action("run_node_mksnapshot") { + deps = [ ":node_mksnapshot($v8_snapshot_toolchain)" ] + script = "$node_v8_path/tools/run.py" + sources = [] + data = [] + + mksnapshot_dir = get_label_info(":node_mksnapshot($v8_snapshot_toolchain)", + "root_out_dir") + + outputs = [ "$target_gen_dir/node_snapshot.cc" ] + args = [ + "./" + rebase_path(mksnapshot_dir + "/node_mksnapshot", root_build_dir), + rebase_path("$target_gen_dir/node_snapshot.cc", root_build_dir), + ] + } + } + + action("generate_config_gypi") { + script = "tools/generate_config_gypi.py" + outputs = [ "$target_gen_dir/config.gypi" ] + depfile = "$target_gen_dir/$target_name.d" + args = rebase_path(outputs, root_build_dir) + [ + "--out-dir", rebase_path(root_build_dir, root_build_dir), + "--dep-file", rebase_path(depfile, root_build_dir), + "--node-gn-path", node_path, + ] + } + + executable("node_js2c") { + deps = [ + "deps/simdutf", + "deps/uv", + ] + sources = [ + "tools/js2c.cc", + "tools/executable_wrapper.h", + ] + } + + action("run_node_js2c") { + script = "$node_v8_path/tools/run.py" + deps = [ + ":node_js2c($host_toolchain)", + ":generate_config_gypi", + ] + + node_deps_files = gypi_values.deps_files + node_builtin_shareable_builtins + node_library_files = exec_script("./tools/search_files.py", + [ rebase_path(".", root_build_dir), + rebase_path("lib", root_build_dir), + "js" ], + "list lines") + + inputs = node_library_files + + node_deps_files + + [ "$target_gen_dir/config.gypi" ] + outputs = [ "$target_gen_dir/node_javascript.cc" ] + + # Get the path to node_js2c executable of the host toolchain. + if (host_os == "win") { + host_executable_suffix = ".exe" + } else { + host_executable_suffix = "" + } + node_js2c_path = + get_label_info(":node_js2c($host_toolchain)", "root_out_dir") + "/" + + get_label_info(":node_js2c($host_toolchain)", "name") + + host_executable_suffix + + args = [ rebase_path(node_js2c_path), + rebase_path("$target_gen_dir/node_javascript.cc"), + "--root", rebase_path("."), + "lib", rebase_path("$target_gen_dir/config.gypi") ] + + node_deps_files + } + + executable("node_cctest") { + testonly = true + configs += [ ":node_internal_config" ] + + deps = [ + ":libnode", + "deps/googletest", + "deps/googletest:gtest_main", + "deps/simdutf", + ] + + sources = gypi_values.node_cctest_sources + if (node_use_openssl) { + sources += gypi_values.node_cctest_openssl_sources + } + if (node_enable_inspector) { + sources += gypi_values.node_cctest_inspector_sources + } + } + + executable("node_embedtest") { + output_name = "embedtest" + testonly = true + deps = [ ":libnode" ] + sources = [ + "src/node_snapshot_stub.cc", + "test/embedding/embedtest.cc", + ] + } + + executable("overlapped_checker") { + output_name = "overlapped-checker" + testonly = true + if (is_win) { + sources = [ "test/overlapped-checker/main_win.c" ] + } else { + sources = [ "test/overlapped-checker/main_unix.c" ] + } + } +}